diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index bf9c77b92b3d..5dda458c6313 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -207,6 +207,7 @@ /deps/ada @nodejs/url /lib/internal/url.js @nodejs/url /lib/url.js @nodejs/url +/src/node_url_pattern.* @nodejs/url /src/node_url.* @nodejs/url /test/fixtures/wpt/url @nodejs/url diff --git a/.github/workflows/build-tarball.yml b/.github/workflows/build-tarball.yml index 9d2cca478243..0f1701375547 100644 --- a/.github/workflows/build-tarball.yml +++ b/.github/workflows/build-tarball.yml @@ -41,15 +41,13 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} - - name: Environment Information - run: npx envinfo - name: Make tarball run: | export DISTTYPE=nightly @@ -59,9 +57,8 @@ jobs: - name: Upload tarball artifact uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: - name: tarballs path: '*.tar.gz' - compression-level: 0 + archive: false test-tarball-linux: needs: build-tarball runs-on: ubuntu-24.04-arm @@ -71,26 +68,23 @@ jobs: SCCACHE_GHA_ENABLED: ${{ github.base_ref == 'main' || github.ref_name == 'main' }} SCCACHE_IDLE_TIMEOUT: '0' steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false sparse-checkout: .github/actions/install-clang sparse-checkout-cone-mode: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Set up sccache if: github.base_ref == 'main' || github.ref_name == 'main' - uses: Mozilla-Actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 + uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 with: version: v0.16.0 - - name: Environment Information - run: npx envinfo - name: Download tarball uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: - name: tarballs path: tarballs - name: Extract tarball run: | diff --git a/.github/workflows/close-stalled.yml b/.github/workflows/close-stalled.yml index 56c0f2542b9e..3c7ab04339d1 100644 --- a/.github/workflows/close-stalled.yml +++ b/.github/workflows/close-stalled.yml @@ -20,7 +20,7 @@ jobs: if: github.repository == 'nodejs/node' runs-on: ubuntu-slim steps: - - uses: actions/stale@eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899 # v10.3.0 + - uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11.0.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-close: 30 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index c869c23cac35..23084c68ac5e 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -24,19 +24,19 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2 + uses: github/codeql-action/init@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3 with: languages: ${{ matrix.language }} config-file: ./.github/codeql-config.yml - name: Autobuild - uses: github/codeql-action/autobuild@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2 + uses: github/codeql-action/autobuild@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2 + uses: github/codeql-action/analyze@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3 with: category: /language:${{matrix.language}} diff --git a/.github/workflows/commit-lint.yml b/.github/workflows/commit-lint.yml index 93ca3425be49..896340ba3a82 100644 --- a/.github/workflows/commit-lint.yml +++ b/.github/workflows/commit-lint.yml @@ -20,7 +20,7 @@ jobs: run: | echo "plusOne=$((${{ github.event.pull_request.commits }} + 1))" >> $GITHUB_OUTPUT echo "minusOne=$((${{ github.event.pull_request.commits }} - 1))" >> $GITHUB_OUTPUT - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: fetch-depth: ${{ steps.nb-of-commits.outputs.plusOne }} persist-credentials: false diff --git a/.github/workflows/commit-queue.yml b/.github/workflows/commit-queue.yml index 8b5f37807b12..7af712268711 100644 --- a/.github/workflows/commit-queue.yml +++ b/.github/workflows/commit-queue.yml @@ -59,7 +59,7 @@ jobs: if: needs.get_mergeable_prs.outputs.numbers != '' runs-on: ubuntu-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: # A personal token is required because pushing with GITHUB_TOKEN will # prevent commits from running CI after they land. It needs diff --git a/.github/workflows/coverage-linux-without-intl.yml b/.github/workflows/coverage-linux-without-intl.yml index 69fdc02c6555..a76d4d47e599 100644 --- a/.github/workflows/coverage-linux-without-intl.yml +++ b/.github/workflows/coverage-linux-without-intl.yml @@ -49,20 +49,18 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Set up sccache if: github.base_ref == 'main' || github.ref_name == 'main' - uses: Mozilla-Actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 + uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 with: version: v0.16.0 - - name: Environment Information - run: npx envinfo - name: Install gcovr run: pip install gcovr==7.2 - name: Configure diff --git a/.github/workflows/coverage-linux.yml b/.github/workflows/coverage-linux.yml index f4b7ed429681..65f52f5b366d 100644 --- a/.github/workflows/coverage-linux.yml +++ b/.github/workflows/coverage-linux.yml @@ -49,20 +49,18 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-24.04-arm steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Set up sccache if: github.base_ref == 'main' || github.ref_name == 'main' - uses: Mozilla-Actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 + uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 with: version: v0.16.0 - - name: Environment Information - run: npx envinfo - name: Install gcovr run: pip install gcovr==7.2 - name: Configure diff --git a/.github/workflows/coverage-windows.yml b/.github/workflows/coverage-windows.yml index 7d5afebad423..cbb5a776cb0e 100644 --- a/.github/workflows/coverage-windows.yml +++ b/.github/workflows/coverage-windows.yml @@ -69,17 +69,15 @@ jobs: if: github.event.pull_request.draft == false runs-on: windows-2025 steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} - 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 diff --git a/.github/workflows/create-release-proposal.yml b/.github/workflows/create-release-proposal.yml index ae4c4240a25c..883bb48b0df2 100644 --- a/.github/workflows/create-release-proposal.yml +++ b/.github/workflows/create-release-proposal.yml @@ -33,7 +33,7 @@ jobs: RELEASE_LINE: ${{ inputs.release-line }} runs-on: ubuntu-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: ref: ${{ env.STAGING_BRANCH }} persist-credentials: false diff --git a/.github/workflows/daily-wpt-fyi.yml b/.github/workflows/daily-wpt-fyi.yml index 2470ce6913b7..0895f1353e57 100644 --- a/.github/workflows/daily-wpt-fyi.yml +++ b/.github/workflows/daily-wpt-fyi.yml @@ -39,11 +39,9 @@ jobs: runs-on: ubuntu-24.04-arm steps: - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} - - name: Environment Information - run: npx envinfo # install a version and checkout - name: Get latest nightly @@ -63,7 +61,7 @@ jobs: 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@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false ref: ${{ env.NIGHTLY_REF || steps.setup-node.outputs.node-version }} @@ -79,7 +77,7 @@ jobs: run: rm -rf wpt working-directory: test/fixtures - name: Checkout epochs/daily WPT - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: repository: web-platform-tests/wpt persist-credentials: false @@ -110,7 +108,7 @@ jobs: # version-specific checkout above overwrites .github/actions/ - name: Checkout undici WPT actions if: ${{ env.WPT_REPORT != '' }} - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: sparse-checkout: | .github/actions/undici-wpt-current diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml index 23ffe66fb244..6c4b2ec9a4be 100644 --- a/.github/workflows/daily.yml +++ b/.github/workflows/daily.yml @@ -16,15 +16,13 @@ jobs: if: github.repository == 'nodejs/node' || github.event_name == 'workflow_dispatch' runs-on: ubuntu-24.04-arm steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.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 diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index baf07c2b68ec..6e5dfe732646 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -24,15 +24,13 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.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@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 diff --git a/.github/workflows/find-inactive-collaborators.yml b/.github/workflows/find-inactive-collaborators.yml index 35a0f4b1f5c7..e6e0c7f54f69 100644 --- a/.github/workflows/find-inactive-collaborators.yml +++ b/.github/workflows/find-inactive-collaborators.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: fetch-depth: 0 persist-credentials: false diff --git a/.github/workflows/find-inactive-tsc.yml b/.github/workflows/find-inactive-tsc.yml index 8deeaccf5dfd..c1804b78d378 100644 --- a/.github/workflows/find-inactive-tsc.yml +++ b/.github/workflows/find-inactive-tsc.yml @@ -20,13 +20,13 @@ jobs: steps: - name: Checkout the repo - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: fetch-depth: 0 persist-credentials: false - name: Clone nodejs/TSC repository - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: fetch-depth: 0 path: .tmp diff --git a/.github/workflows/license-builder.yml b/.github/workflows/license-builder.yml index 36d303f9e121..a95ee13c45f4 100644 --- a/.github/workflows/license-builder.yml +++ b/.github/workflows/license-builder.yml @@ -17,7 +17,7 @@ jobs: if: github.repository == 'nodejs/node' runs-on: ubuntu-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - run: ./tools/license-builder.sh # Run the license builder tool diff --git a/.github/workflows/lint-release-proposal.yml b/.github/workflows/lint-release-proposal.yml index 93c67df521d2..e8ffab178458 100644 --- a/.github/workflows/lint-release-proposal.yml +++ b/.github/workflows/lint-release-proposal.yml @@ -23,7 +23,7 @@ jobs: contents: read pull-requests: read steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false fetch-depth: 2 diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index fae3018e7abb..9a9177e01c91 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -25,37 +25,33 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.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-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} - - 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-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: fetch-depth: 0 persist-credentials: false @@ -64,11 +60,9 @@ jobs: with: node-version: ${{ env.NODE_VERSION }} - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} - - name: Environment Information - run: npx envinfo - name: Format C/C++ files run: | make format-cpp-build @@ -93,15 +87,13 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: ${{ env.NODE_VERSION }} - - name: Environment Information - run: npx envinfo - name: Lint JavaScript files run: | set +e @@ -142,7 +134,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false sparse-checkout: | @@ -156,11 +148,9 @@ jobs: *.py sparse-checkout-cone-mode: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} - - name: Environment Information - run: npx envinfo - name: Lint Python run: | make lint-py-build @@ -169,7 +159,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false sparse-checkout: | @@ -179,11 +169,9 @@ jobs: *.yaml sparse-checkout-cone-mode: false - name: Use Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} - - name: Environment Information - run: npx envinfo - name: Lint YAML run: | make lint-yaml-build || true @@ -193,7 +181,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false sparse-checkout: | @@ -209,7 +197,7 @@ jobs: # cannot use ubuntu-24.04-arm here because the docker image is x86 only runs-on: ubuntu-latest steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - uses: mszostok/codeowners-validator@7f3f5e28c6d7b8dfae5731e54ce2272ca384592f @@ -219,7 +207,7 @@ jobs: if: ${{ github.event.pull_request }} runs-on: ubuntu-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: fetch-depth: 2 persist-credentials: false @@ -234,7 +222,7 @@ jobs: lint-readme: runs-on: ubuntu-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false sparse-checkout: | diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index a6a5b0302205..f84c91e1a381 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -36,17 +36,17 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4 + uses: step-security/harden-runner@bf7454d06d71f1098171f2acdf0cd4708d7b5920 # v2.20.0 with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - name: Checkout code - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Run analysis - uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3 + uses: ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc # v2.4.4 with: results_file: results.sarif results_format: sarif @@ -76,6 +76,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: Upload to code-scanning - uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2 + uses: github/codeql-action/upload-sarif@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3 with: sarif_file: results.sarif diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index d4be0ceaa371..eb5921edb932 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -9,13 +9,13 @@ on: env: CLOSE_MESSAGE: > This {0} has been automatically closed after 30 days of inactivity - following its stale status (no activity for a total of 240 days). + following its stale status (no activity for a total of 120 days). If this is still relevant, feel free to reopen it or leave a comment with additional details so we can continue the discussion. WARN_MESSAGE: > - This {0} has been marked as stale due to 210 days of inactivity. + This {0} has been marked as stale due to 90 days of inactivity. It will be automatically closed in 30 days if no further activity occurs. If this is still relevant, please leave a comment or update it to keep it open. @@ -33,10 +33,10 @@ jobs: if: github.repository == 'nodejs/node' runs-on: ubuntu-slim steps: - - uses: actions/stale@eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899 # v10.3.0 + - uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11.0.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - days-before-stale: 210 + days-before-stale: 90 days-before-close: 30 stale-issue-label: stale exempt-issue-labels: never-stale, confirmed-bug diff --git a/.github/workflows/stress-test.yml b/.github/workflows/stress-test.yml index e3846cf4d387..eca8c6aa5a2d 100644 --- a/.github/workflows/stress-test.yml +++ b/.github/workflows/stress-test.yml @@ -54,7 +54,7 @@ jobs: SCCACHE_GHA_ENABLED: 'true' SCCACHE_IDLE_TIMEOUT: '0' steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false path: node @@ -67,7 +67,7 @@ jobs: if: runner.os == 'macOS' run: sudo xcode-select -s /Applications/Xcode_${{ env.XCODE_VERSION }}.app - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} allow-prereleases: true @@ -76,11 +76,9 @@ jobs: rustup override set "$RUSTC_VERSION" rustup --version - name: Set up sccache - uses: Mozilla-Actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 + uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 with: version: v0.16.0 - - name: Environment Information - run: npx envinfo@7.21.0 # This is needed due to https://github.com/nodejs/build/issues/3878 - name: Cleanup if: runner.os == 'macOS' diff --git a/.github/workflows/test-internet.yml b/.github/workflows/test-internet.yml index 7f8f4cc30269..bbc9fc9436e6 100644 --- a/.github/workflows/test-internet.yml +++ b/.github/workflows/test-internet.yml @@ -46,20 +46,18 @@ jobs: if: (github.event_name == 'schedule' && github.repository == 'nodejs/node') || (github.event.pull_request && github.event.pull_request.draft == false) runs-on: ubuntu-24.04-arm steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Set up sccache if: github.base_ref == 'main' || github.ref_name == 'main' - uses: Mozilla-Actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 + uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 with: version: v0.16.0 - - name: Environment Information - run: npx envinfo - name: Build run: make build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn" - name: Test Internet diff --git a/.github/workflows/test-linux-quic.yml b/.github/workflows/test-linux-quic.yml new file mode 100644 index 000000000000..64c2e7d7ea9e --- /dev/null +++ b/.github/workflows/test-linux-quic.yml @@ -0,0 +1,69 @@ +name: Test Linux (with QUIC) + +on: + workflow_dispatch: + pull_request: + paths: + - .github/workflows/test-linux-quic.yml + - configure.py + - node.gyp + - node.gypi + - deps/ngtcp2/** + - deps/nghttp3/** + - deps/openssl/** + - src/quic/** + - src/node_bob* + - lib/quic.js + - lib/http3.js + - lib/internal/quic/** + - lib/stream/iter.js + - lib/internal/streams/iter/** + - test/cctest/test_quic_* + - test/common/quic* + - test/common/quic/** + - test/parallel/*quic* + - test/parallel/test-stream-iter-* + types: [opened, synchronize, reopened, ready_for_review] + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +env: + PYTHON_VERSION: '3.14' + FLAKY_TESTS: keep_retrying + CC: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} clang + CXX: ${{ (github.base_ref == 'main' || github.ref_name == 'main') && 'sccache' || '' }} clang++ + SCCACHE_GHA_ENABLED: ${{ github.base_ref == 'main' || github.ref_name == 'main' }} + SCCACHE_IDLE_TIMEOUT: '0' + +permissions: + contents: read + +jobs: + test-quic: + if: github.event.pull_request.draft == false + runs-on: ubuntu-24.04-arm + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + persist-credentials: false + path: node + - name: Set up Python ${{ env.PYTHON_VERSION }} + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + with: + python-version: ${{ env.PYTHON_VERSION }} + - name: Set up sccache + if: github.base_ref == 'main' || github.ref_name == 'main' + uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 + with: + version: v0.16.0 + - name: Build + working-directory: node + run: make build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn --experimental-quic" + - name: Test + working-directory: node + run: make test-ci -j1 V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9" + - name: Ensure running tests did not cause any change in the tree + working-directory: node + run: git add -A && git diff --name-only --exit-code --staged diff --git a/.github/workflows/test-linux.yml b/.github/workflows/test-linux.yml index 40ac519c7e1c..887db1dab85e 100644 --- a/.github/workflows/test-linux.yml +++ b/.github/workflows/test-linux.yml @@ -54,21 +54,19 @@ jobs: matrix: os: [ubuntu-24.04, ubuntu-24.04-arm] steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false path: node - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Set up sccache if: github.base_ref == 'main' || github.ref_name == 'main' - uses: Mozilla-Actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 + uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 with: version: v0.16.0 - - name: Environment Information - run: npx envinfo - name: Build working-directory: node run: make build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn" diff --git a/.github/workflows/test-macos.yml b/.github/workflows/test-macos.yml index 352282a9bbac..7db72c856875 100644 --- a/.github/workflows/test-macos.yml +++ b/.github/workflows/test-macos.yml @@ -50,23 +50,21 @@ jobs: SCCACHE_GHA_ENABLED: ${{ github.base_ref == 'main' || github.ref_name == 'main' }} SCCACHE_IDLE_TIMEOUT: '0' steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false path: node - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} - name: Set up Xcode ${{ env.XCODE_VERSION }} run: sudo xcode-select -s /Applications/Xcode_${{ env.XCODE_VERSION }}.app - name: Set up sccache if: github.base_ref == 'main' || github.ref_name == 'main' - uses: Mozilla-Actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 + uses: Mozilla-Actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # v0.0.11 with: version: v0.16.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 diff --git a/.github/workflows/timezone-update.yml b/.github/workflows/timezone-update.yml index 02299e66b31f..94961f8ae6ed 100644 --- a/.github/workflows/timezone-update.yml +++ b/.github/workflows/timezone-update.yml @@ -21,12 +21,12 @@ jobs: steps: - name: Checkout nodejs/node - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Checkout unicode-org/icu-data - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: path: icu-data persist-credentials: false diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml index aa99096658a3..900cf3ae00ce 100644 --- a/.github/workflows/tools.yml +++ b/.github/workflows/tools.yml @@ -286,7 +286,7 @@ jobs: tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true rm temp-output steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 if: github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id with: persist-credentials: false @@ -294,7 +294,7 @@ jobs: if: | (matrix.id == 'icu' || matrix.id == 'inspector_protocol') && (github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id) - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: ${{ env.PYTHON_VERSION }} - run: ${{ matrix.run }} diff --git a/.github/workflows/update-openssl.yml b/.github/workflows/update-openssl.yml index d87f6b3a4b59..49f0006526b0 100644 --- a/.github/workflows/update-openssl.yml +++ b/.github/workflows/update-openssl.yml @@ -15,7 +15,7 @@ jobs: # Cannot use ubuntu-slim here because the update script requires Docker runs-on: ubuntu-latest steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Check and download new OpenSSL version diff --git a/.github/workflows/update-v8.yml b/.github/workflows/update-v8.yml index e2794cc77263..e365cf770174 100644 --- a/.github/workflows/update-v8.yml +++ b/.github/workflows/update-v8.yml @@ -16,7 +16,7 @@ jobs: if: github.repository == 'nodejs/node' runs-on: ubuntu-slim steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false - name: Cache node modules and update-v8 diff --git a/.github/workflows/update-wpt.yml b/.github/workflows/update-wpt.yml index 05b1503f3c3c..4f752cc18985 100644 --- a/.github/workflows/update-wpt.yml +++ b/.github/workflows/update-wpt.yml @@ -27,7 +27,7 @@ jobs: subsystem: ${{ fromJSON(github.event.inputs.subsystems || '["url", "urlpattern", "WebCryptoAPI"]') }} steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false @@ -52,6 +52,14 @@ jobs: - name: Update WPT for subsystem ${{ matrix.subsystem }} run: | git node wpt "$SUBSYSTEM" + # TODO: Remove this workaround after @node-core/utils stops + # regenerating test/fixtures/wpt/README.md for every subsystem + # update. + # git node wpt currently rewrites test/fixtures/wpt/README.md with a + # generated summary for every subsystem update. versions.json is the + # authoritative metadata, and keeping the README stable avoids + # conflicts between concurrent WPT update PRs. + git restore test/fixtures/wpt/README.md env: SUBSYSTEM: ${{ matrix.subsystem }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 6197e2042964..d88832e8d427 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,7 +40,8 @@ release. -24.19.0
+24.20.0
+24.19.0
24.18.1
24.18.0
24.17.0
diff --git a/LICENSE b/LICENSE index 2842efa1288e..9cc3315dd388 100644 --- a/LICENSE +++ b/LICENSE @@ -1785,9 +1785,9 @@ The externally maintained libraries used by Node.js are: - zlib, located at deps/zlib, is licensed as follows: """ zlib.h -- interface of the 'zlib' general purpose compression library - version 1.3.1, January 22nd, 2024 + version 1.3.2.1, February xxth, 2026 - Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2026 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/Makefile b/Makefile index 61380c5b824e..37182634b5b5 100644 --- a/Makefile +++ b/Makefile @@ -1353,15 +1353,15 @@ binary: $(BINARYTAR) ## Build release binary tarballs. # Note: this is strictly for release builds on release machines only. binary-upload: binary ssh $(STAGINGSERVER) "mkdir -p nodejs/$(DISTTYPEDIR)/$(FULLVERSION)" - chmod 664 $(TARNAME)-$(OSTYPE)-$(ARCH).tar.gz - scp -p $(TARNAME)-$(OSTYPE)-$(ARCH).tar.gz $(STAGINGSERVER):nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.gz - ssh $(STAGINGSERVER) "rclone copyto nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.gz $(CLOUDFLARE_BUCKET)/nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.gz" - ssh $(STAGINGSERVER) "touch nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.gz.done" + chmod 664 $(BINARYNAME).tar.gz + scp -p $(BINARYNAME).tar.gz $(STAGINGSERVER):nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(BINARYNAME).tar.gz + ssh $(STAGINGSERVER) "rclone copyto nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(BINARYNAME).tar.gz $(CLOUDFLARE_BUCKET)/nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(BINARYNAME).tar.gz" + ssh $(STAGINGSERVER) "touch nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(BINARYNAME).tar.gz.done" ifeq ($(XZ), 1) - chmod 664 $(TARNAME)-$(OSTYPE)-$(ARCH).tar.xz - scp -p $(TARNAME)-$(OSTYPE)-$(ARCH).tar.xz $(STAGINGSERVER):nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.xz - ssh $(STAGINGSERVER) "rclone copyto nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.xz $(CLOUDFLARE_BUCKET)/nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.xz" - ssh $(STAGINGSERVER) "touch nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(TARNAME)-$(OSTYPE)-$(ARCH).tar.xz.done" + chmod 664 $(BINARYNAME).tar.xz + scp -p $(BINARYNAME).tar.xz $(STAGINGSERVER):nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(BINARYNAME).tar.xz + ssh $(STAGINGSERVER) "rclone copyto nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(BINARYNAME).tar.xz $(CLOUDFLARE_BUCKET)/nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(BINARYNAME).tar.xz" + ssh $(STAGINGSERVER) "touch nodejs/$(DISTTYPEDIR)/$(FULLVERSION)/$(BINARYNAME).tar.xz.done" endif .PHONY: bench-all diff --git a/README.md b/README.md index dc175eadf5bb..a6cf7d6683fa 100644 --- a/README.md +++ b/README.md @@ -319,8 +319,6 @@ For information about the governance of the Node.js project, see **Dario Piotrowicz** <> (he/him) * [deokjinkim](https://github.com/deokjinkim) - **Deokjin Kim** <> (he/him) -* [edsadr](https://github.com/edsadr) - - **Adrian Estrada** <> (he/him) * [ErickWendel](https://github.com/ErickWendel) - **Erick Wendel** <> (he/him) * [Ethan-Arrowood](https://github.com/Ethan-Arrowood) - @@ -393,6 +391,8 @@ For information about the governance of the Node.js project, see **Matteo Collina** <> (he/him) - [Support me](https://github.com/sponsors/mcollina) * [meixg](https://github.com/meixg) - **Xuguang Mei** <> (he/him) +* [MikeMcC399](https://github.com/MikeMcC399) - + **Mike McCready** <<66998419+MikeMcC399@users.noreply.github.com>> (he/him) * [MoLow](https://github.com/MoLow) - **Moshe Atlow** <> (he/him) * [MrJithil](https://github.com/MrJithil) - @@ -513,6 +513,8 @@ For information about the governance of the Node.js project, see **Xu Meng** <> (he/him) * [dnlup](https://github.com/dnlup) - **dnlup** <> +* [edsadr](https://github.com/edsadr) - + **Adrian Estrada** <> (he/him) * [eljefedelrodeodeljefe](https://github.com/eljefedelrodeodeljefe) - **Robert Jefe Lindstaedt** <> * [estliberitas](https://github.com/estliberitas) - diff --git a/SECURITY.md b/SECURITY.md index 8bc3825e1035..10763d91ffc7 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -221,6 +221,16 @@ then untrusted input must not lead to arbitrary JavaScript code execution. * The developers and infrastructure that run it. * The operating system that Node.js is running under and its configuration, along with anything under the control of the operating system. +* The deployment network environment for the privacy of traffic and routing + decisions, including internal networks through which Node.js traffic passes + and configured HTTP(S) proxy servers. Built-in proxy support is intended to + route traffic through proxies authorized for the deployment, often because a + firewall requires one to access external networks. It is not intended to hide + traffic from network operators or authorities governing the deployment. + Untrusted or unauthorized proxies, as well as deployment policy or legal + compliance controls around proxy use, are the responsibility of the deployment + operator and are outside this threat model. This does not change that data + parsed from network protocol peers is untrusted as described above. * The code it is asked to run, including JavaScript, WASM and native code, even if said code is dynamically loaded, e.g., all dependencies installed from the npm registry. @@ -301,6 +311,19 @@ the community they pose. client consuming unsolicited or misordered responses within the same HTTP/1.1 connection reuse lifecycle are generally not considered Node.js vulnerabilities. +#### Unauthorized or untrusted HTTP proxy deployments + +* Built-in HTTP proxy support is intended for routing outbound requests through + a proxy authorized by the deployment, for example because a firewall requires + one to reach external networks. It is not an anonymity, traffic-hiding, or + policy-evasion feature. +* Reports that depend on using an unauthorized proxy, expecting Node.js to + provide privacy from a configured proxy or internal network, or expecting + Node.js to enforce deployment-specific network policy or legal requirements + are not considered Node.js vulnerabilities. Deployment operators are + responsible for hardening such environments and controlling which proxy + settings are allowed. + #### Malicious Third-Party Modules (CWE-1357) * Code is trusted by Node.js. Therefore any scenario that requires a malicious diff --git a/benchmark/calibrate-n.js b/benchmark/calibrate-n.js index 16bb512cc50a..fcc2675ef4ed 100644 --- a/benchmark/calibrate-n.js +++ b/benchmark/calibrate-n.js @@ -8,7 +8,9 @@ const { styleText } = require('node:util'); const DEFAULT_RUNS = 30; // Number of runs for each n value const CV_THRESHOLD = 0.05; // 5% coefficient of variation threshold const MAX_N_INCREASE = 6; // Maximum number of times to increase n (10**6) +const MAX_CV_THRESHOLD = 0.10; // 10% coefficient of variation threshold for individual configurations const INCREASE_FACTOR = 10; // Factor by which to increase n +const START_N = 10; // Starting n value (10 iterations) const args = process.argv.slice(2); if (args.length === 0) { @@ -19,7 +21,7 @@ Options: --runs=N Number of runs for each n value (default: ${DEFAULT_RUNS}) --cv-threshold=N Target coefficient of variation threshold (default: ${CV_THRESHOLD}) --max-increases=N Maximum number of n increases to try (default: ${MAX_N_INCREASE}) - --start-n=N Initial n value to start with (default: autodetect) + --start-n=N Initial n value to start with (default: ${START_N}) --increase=N Factor by which to increase n (default: ${INCREASE_FACTOR}) Example: @@ -34,16 +36,24 @@ let benchmarkPath; let runs = DEFAULT_RUNS; let cvThreshold = CV_THRESHOLD; let maxIncreases = MAX_N_INCREASE; -let startN = 10; +let startN = START_N; let increaseFactor = INCREASE_FACTOR; for (const arg of args) { if (arg.startsWith('--runs=')) { runs = parseInt(arg.substring(7), 10); + if (isNaN(runs)) { + console.error(`Error: Invalid value for --runs. Using default: ${DEFAULT_RUNS}`); + runs = DEFAULT_RUNS; + } } else if (arg.startsWith('--cv-threshold=')) { - cvThreshold = parseFloat(arg.substring(14)); + cvThreshold = parseFloat(arg.substring(15)); + if (isNaN(cvThreshold)) { + console.error(`Error: Invalid value for --cv-threshold. Using default: ${CV_THRESHOLD}`); + cvThreshold = CV_THRESHOLD; + } } else if (arg.startsWith('--max-increases=')) { - maxIncreases = parseInt(arg.substring(15), 10); + maxIncreases = parseInt(arg.substring(16), 10); if (isNaN(maxIncreases)) { console.error(`Error: Invalid value for --max-increases. Using default: ${MAX_N_INCREASE}`); maxIncreases = MAX_N_INCREASE; @@ -51,8 +61,8 @@ for (const arg of args) { } else if (arg.startsWith('--start-n=')) { startN = parseInt(arg.substring(10), 10); if (isNaN(startN)) { - console.error(`Error: Invalid value for --start-n. Using default: 10`); - startN = 10; + console.error(`Error: Invalid value for --start-n. Using default: ${START_N}`); + startN = START_N; } } else if (arg.startsWith('--increase=')) { increaseFactor = parseInt(arg.substring(11), 10); @@ -125,6 +135,7 @@ async function main(n = startN) { let bestN = n; let bestCV = Infinity; let bestGroupStats = null; + const cvThresholdPercentage = (cvThreshold * 100).toFixed(2); console.log(` -------------------------------------------------------- @@ -136,12 +147,12 @@ that produces consistent benchmark results without wasting time. How it works: 1. Run the benchmark multiple times with a specific n value 2. Group results by configuration -3. If overall CV is above 5% or any configuration has CV above 10%, increase n and try again +3. If overall CV is above ${cvThresholdPercentage}% or any configuration has CV above ${MAX_CV_THRESHOLD * 100}%, increase n and try again Configuration: - Starting n: ${n.toLocaleString()} iterations - Runs per n value: ${runs} -- Target CV threshold: ${cvThreshold * 100}% (lower CV = more stable results) +- Target CV threshold: ${cvThresholdPercentage}% (lower CV = more stable results) - Max increases: ${maxIncreases} - Increase factor: ${increaseFactor}x`); @@ -195,23 +206,23 @@ Configuration: if (groupStats.length > 0) { // Check if any configuration has CV > 10% (too unstable) - const tooUnstableConfigs = groupStats.filter((g) => g.stats.cv > 0.10); + const tooUnstableConfigs = groupStats.filter((g) => g.stats.cv > MAX_CV_THRESHOLD); const avgCV = groupStats.reduce((sum, g) => sum + g.stats.cv, 0) / groupStats.length; console.log(`\nOverall average CV: ${(avgCV * 100).toFixed(2)}%`); - const isOverallStable = avgCV < CV_THRESHOLD; + const isOverallStable = avgCV < cvThreshold; const hasVeryUnstableConfigs = tooUnstableConfigs.length > 0; - // Check if overall CV is below CV_THRESHOLD and no configuration has CV > 10% + // Check if overall CV is below cvThreshold and no configuration has CV > MAX_CV_THRESHOLD if (isOverallStable && !hasVeryUnstableConfigs) { - console.log(styleText(['bold', 'green'], ` ✓ Overall CV is below 5% and no configuration has CV above 10%`)); + console.log(styleText(['bold', 'green'], ` ✓ Overall CV is below ${cvThresholdPercentage}% and no configuration has CV above ${MAX_CV_THRESHOLD * 100}%`)); } else { if (!isOverallStable) { - console.log(styleText(['bold', 'red'], ` ✗ Overall CV (${(avgCV * 100).toFixed(2)}%) is above 5%`)); + console.log(styleText(['bold', 'red'], ` ✗ Overall CV (${(avgCV * 100).toFixed(2)}%) is above ${cvThresholdPercentage}%`)); } if (hasVeryUnstableConfigs) { - console.log(styleText(['bold', 'red'], ` ✗ ${tooUnstableConfigs.length} configuration(s) have CV above 10%`)); + console.log(styleText(['bold', 'red'], ` ✗ ${tooUnstableConfigs.length} configuration(s) have CV above ${MAX_CV_THRESHOLD * 100}%`)); } } @@ -226,7 +237,7 @@ Configuration: bestGroupStats.push({ conf: group.conf, stats: stats, - isStable: stats.cv <= 0.10, + isStable: stats.cv <= MAX_CV_THRESHOLD, }); } } @@ -237,15 +248,15 @@ Configuration: } // Check if we've reached acceptable stability based on new criteria - // 1. Overall CV should be below CV_THRESHOLD - // 2. No configuration should have a CV greater than 10% + // 1. Overall CV should be below cvThreshold + // 2. No configuration should have a CV greater than MAX_CV_THRESHOLD const avgCV = groupStats.length > 0 ? groupStats.reduce((sum, g) => sum + g.stats.cv, 0) / groupStats.length : Infinity; - const hasUnstableConfig = groupStats.some((g) => g.stats.cv > 0.10); - const isOverallStable = avgCV < CV_THRESHOLD; + const hasUnstableConfig = groupStats.some((g) => g.stats.cv > MAX_CV_THRESHOLD); + const isOverallStable = avgCV < cvThreshold; if (isOverallStable && !hasUnstableConfig) { - console.log(`\n✓ Found optimal n=${n} (Overall CV=${(avgCV * 100).toFixed(2)}% < 5% and no configuration has CV > 10%)`); + console.log(`\n✓ Found optimal n=${n} (Overall CV=${(avgCV * 100).toFixed(2)}% < ${cvThresholdPercentage}% and no configuration has CV > ${MAX_CV_THRESHOLD * 100}%)`); console.log('\nFinal CV for each configuration:'); groupStats.forEach((g) => { console.log(` ${JSON.stringify(groupedResults[g.confKey].conf)}: ${(g.stats.cv * 100).toFixed(2)}%`); @@ -271,7 +282,7 @@ Configuration: if (g.conf) { console.log(` ${JSON.stringify(g.conf)}: ${(g.stats.cv * 100).toFixed(2)}%`); if (g.stats.cv > cvThreshold) { - console.log(` ⚠️ This configuration is above the target threshold of ${cvThreshold * 100}%`); + console.log(` ⚠️ This configuration is above the target threshold of ${cvThresholdPercentage}%`); } } }); diff --git a/benchmark/fs/bench-filehandle-pipetosync.js b/benchmark/fs/bench-filehandle-pipetosync.js new file mode 100644 index 000000000000..e62ade894723 --- /dev/null +++ b/benchmark/fs/bench-filehandle-pipetosync.js @@ -0,0 +1,103 @@ +// Benchmark: pipeToSync with sync compression transforms. +// Measures fully synchronous file-to-file pipeline (no threadpool, no promises). +'use strict'; + +const common = require('../common.js'); +const fs = require('fs'); +const { openSync, closeSync, writeSync, unlinkSync } = fs; + +const tmpdir = require('../../test/common/tmpdir'); +tmpdir.refresh(); +const srcFile = tmpdir.resolve(`.removeme-sync-bench-src-${process.pid}`); +const dstFile = tmpdir.resolve(`.removeme-sync-bench-dst-${process.pid}`); + +const bench = common.createBenchmark(main, { + compression: ['gzip', 'deflate', 'brotli', 'zstd'], + filesize: [1024 * 1024, 16 * 1024 * 1024, 64 * 1024 * 1024], + n: [5], +}, { + flags: ['--experimental-stream-iter'], +}); + +function main({ compression, filesize, n }) { + // Create the fixture file with repeating lowercase ASCII + const chunk = Buffer.alloc(Math.min(filesize, 64 * 1024), 'abcdefghij'); + const fd = openSync(srcFile, 'w'); + let remaining = filesize; + while (remaining > 0) { + const toWrite = Math.min(remaining, chunk.length); + writeSync(fd, chunk, 0, toWrite); + remaining -= toWrite; + } + closeSync(fd); + + const { pipeToSync } = require('stream/iter'); + const { + compressGzipSync, + compressDeflateSync, + compressBrotliSync, + compressZstdSync, + } = require('zlib/iter'); + const { open } = fs.promises; + + const compressFactory = { + gzip: compressGzipSync, + deflate: compressDeflateSync, + brotli: compressBrotliSync, + zstd: compressZstdSync, + }[compression]; + + // Stateless uppercase transform (sync) + const upper = (chunks) => { + if (chunks === null) return null; + const out = new Array(chunks.length); + for (let j = 0; j < chunks.length; j++) { + const src = chunks[j]; + const buf = Buffer.allocUnsafe(src.length); + for (let i = 0; i < src.length; i++) { + const b = src[i]; + buf[i] = (b >= 0x61 && b <= 0x7a) ? b - 0x20 : b; + } + out[j] = buf; + } + return out; + }; + + // Use a synchronous wrapper since pipeToSync is fully sync. + // We need FileHandle for pullSync/writer, so open async then run sync. + (async () => { + const srcFh = await open(srcFile, 'r'); + const dstFh = await open(dstFile, 'w'); + + // Warm up + runSync(srcFh, dstFh, upper, compressFactory, pipeToSync); + + // Reset file positions for the benchmark + await srcFh.close(); + await dstFh.close(); + + bench.start(); + let totalBytes = 0; + for (let i = 0; i < n; i++) { + const src = await open(srcFile, 'r'); + const dst = await open(dstFile, 'w'); + totalBytes += runSync(src, dst, upper, compressFactory, pipeToSync); + await src.close(); + await dst.close(); + } + bench.end(totalBytes / (1024 * 1024)); + + cleanup(); + })(); +} + +function runSync(srcFh, dstFh, upper, compressFactory, pipeToSync) { + const w = dstFh.writer(); + pipeToSync(srcFh.pullSync(upper, compressFactory()), w); + return w.endSync(); +} + +function cleanup() { + try { unlinkSync(srcFile); } catch { /* Ignore */ } + try { unlinkSync(dstFile); } catch { /* Ignore */ } +} diff --git a/benchmark/fs/bench-filehandle-pull-vs-webstream.js b/benchmark/fs/bench-filehandle-pull-vs-webstream.js new file mode 100644 index 000000000000..9ced02e817db --- /dev/null +++ b/benchmark/fs/bench-filehandle-pull-vs-webstream.js @@ -0,0 +1,201 @@ +// Compare FileHandle.createReadStream() vs readableWebStream() vs pull() +// reading a large file through two transforms: uppercase then compress. +'use strict'; + +const common = require('../common.js'); +const fs = require('fs'); +const zlib = require('zlib'); +const { Transform, Writable, pipeline } = require('stream'); + +const tmpdir = require('../../test/common/tmpdir'); +tmpdir.refresh(); +const filename = tmpdir.resolve(`.removeme-benchmark-garbage-${process.pid}`); + +const bench = common.createBenchmark(main, { + api: ['classic', 'webstream', 'pull'], + compression: ['gzip', 'deflate', 'brotli', 'zstd'], + filesize: [1024 * 1024, 16 * 1024 * 1024, 64 * 1024 * 1024], + n: [5], +}, { + flags: ['--experimental-stream-iter'], + // Classic and webstream only support gzip (native zlib / CompressionStream). + // Brotli, deflate, zstd are pull-only via stream/iter transforms. + combinationFilter({ api, compression }) { + if (api === 'classic' && compression !== 'gzip') return false; + if (api === 'webstream' && compression !== 'gzip') return false; + return true; + }, +}); + +function main({ api, compression, filesize, n }) { + // Create the fixture file with repeating lowercase ASCII + const chunk = Buffer.alloc(Math.min(filesize, 64 * 1024), 'abcdefghij'); + const fd = fs.openSync(filename, 'w'); + let remaining = filesize; + while (remaining > 0) { + const toWrite = Math.min(remaining, chunk.length); + fs.writeSync(fd, chunk, 0, toWrite); + remaining -= toWrite; + } + fs.closeSync(fd); + + if (api === 'classic') { + benchClassic(n, filesize).then(() => cleanup()); + } else if (api === 'webstream') { + benchWebStream(n, filesize).then(() => cleanup()); + } else { + benchPull(n, filesize, compression).then(() => cleanup()); + } +} + +function cleanup() { + try { fs.unlinkSync(filename); } catch { /* ignore */ } +} + +// Stateless uppercase transform (shared by all paths) +function uppercaseChunk(chunk) { + const buf = Buffer.allocUnsafe(chunk.length); + for (let i = 0; i < chunk.length; i++) { + const b = chunk[i]; + buf[i] = (b >= 0x61 && b <= 0x7a) ? b - 0x20 : b; + } + return buf; +} + +// --------------------------------------------------------------------------- +// Classic streams path: createReadStream -> Transform (upper) -> createGzip +// --------------------------------------------------------------------------- +async function benchClassic(n, filesize) { + await runClassic(); + + bench.start(); + let totalBytes = 0; + for (let i = 0; i < n; i++) { + totalBytes += await runClassic(); + } + bench.end(totalBytes / (1024 * 1024)); +} + +function runClassic() { + return new Promise((resolve, reject) => { + const rs = fs.createReadStream(filename); + + const upper = new Transform({ + transform(chunk, encoding, callback) { + callback(null, uppercaseChunk(chunk)); + }, + }); + + const gz = zlib.createGzip(); + + let totalBytes = 0; + const sink = new Writable({ + write(chunk, encoding, callback) { + totalBytes += chunk.length; + callback(); + }, + }); + + pipeline(rs, upper, gz, sink, (err) => { + if (err) reject(err); + else resolve(totalBytes); + }); + }); +} + +// --------------------------------------------------------------------------- +// WebStream path: readableWebStream -> TransformStream (upper) -> CompressionStream +// --------------------------------------------------------------------------- +async function benchWebStream(n, filesize) { + await runWebStream(); + + bench.start(); + let totalBytes = 0; + for (let i = 0; i < n; i++) { + totalBytes += await runWebStream(); + } + bench.end(totalBytes / (1024 * 1024)); +} + +async function runWebStream() { + const fh = await fs.promises.open(filename, 'r'); + try { + const rs = fh.readableWebStream(); + + const upper = new TransformStream({ + transform(chunk, controller) { + const buf = new Uint8Array(chunk.length); + for (let i = 0; i < chunk.length; i++) { + const b = chunk[i]; + buf[i] = (b >= 0x61 && b <= 0x7a) ? b - 0x20 : b; + } + controller.enqueue(buf); + }, + }); + + const compress = new CompressionStream('gzip'); + const output = rs.pipeThrough(upper).pipeThrough(compress); + const reader = output.getReader(); + + let totalBytes = 0; + while (true) { + const { done, value } = await reader.read(); + if (done) break; + totalBytes += value.byteLength; + } + return totalBytes; + } finally { + await fh.close(); + } +} + +// --------------------------------------------------------------------------- +// Pull/iter path: pull() with uppercase transform + selected compression +// --------------------------------------------------------------------------- +async function benchPull(n, filesize, compression) { + const iter = require('zlib/iter'); + + const compressFactory = { + gzip: iter.compressGzip, + deflate: iter.compressDeflate, + brotli: iter.compressBrotli, + zstd: iter.compressZstd, + }[compression]; + + // Warm up + await runPull(compressFactory); + + bench.start(); + let totalBytes = 0; + for (let i = 0; i < n; i++) { + totalBytes += await runPull(compressFactory); + } + bench.end(totalBytes / (1024 * 1024)); +} + +async function runPull(compressFactory) { + const fh = await fs.promises.open(filename, 'r'); + try { + // Stateless transform: uppercase each chunk in the batch + const upper = (chunks) => { + if (chunks === null) return null; + const out = new Array(chunks.length); + for (let j = 0; j < chunks.length; j++) { + out[j] = uppercaseChunk(chunks[j]); + } + return out; + }; + + const readable = fh.pull(upper, compressFactory()); + + let totalBytes = 0; + for await (const chunks of readable) { + for (let i = 0; i < chunks.length; i++) { + totalBytes += chunks[i].byteLength; + } + } + return totalBytes; + } finally { + await fh.close(); + } +} diff --git a/benchmark/path/matchesGlob-posix.js b/benchmark/path/matchesGlob-posix.js new file mode 100644 index 000000000000..2cc30ca8ace1 --- /dev/null +++ b/benchmark/path/matchesGlob-posix.js @@ -0,0 +1,28 @@ +'use strict'; +const common = require('../common.js'); +const { posix } = require('path'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + path: [ + 'src/index.ts', + 'src/index.test.ts', + 'src/foo/bar/biz/baz/index.test.ts', + ], + pattern: [ + 'src/**/baz/*.test.ts', + 'src/**/baz/*.ts', + 'test/**/*.ts', + ], + n: [1e5], +}); + +function main({ path, pattern, n }) { + bench.start(); + let a; + for (let i = 0; i < n; i++) { + a = posix.matchesGlob(path, pattern); + } + bench.end(n); + assert(a + 'a'); +} diff --git a/benchmark/path/matchesGlob-win32.js b/benchmark/path/matchesGlob-win32.js new file mode 100644 index 000000000000..3ef3c6b44344 --- /dev/null +++ b/benchmark/path/matchesGlob-win32.js @@ -0,0 +1,29 @@ +'use strict'; +const common = require('../common.js'); +const { win32 } = require('path'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + path: [ + 'src/index.ts', + 'src\\index.ts', + 'src/foo/bar/biz/baz/index.test.ts', + 'src\\foo\\bar\\biz\\baz\\index.test.ts', + ], + pattern: [ + 'src/**/baz/*.test.ts', + 'src/**/baz/*.ts', + 'test/**/*.ts', + ], + n: [1e5], +}); + +function main({ path, pattern, n }) { + bench.start(); + let a; + for (let i = 0; i < n; i++) { + a = win32.matchesGlob(path, pattern); + } + bench.end(n); + assert(a + 'a'); +} diff --git a/benchmark/readline/readline-createInterface.js b/benchmark/readline/readline-createInterface.js new file mode 100644 index 000000000000..06cd28175456 --- /dev/null +++ b/benchmark/readline/readline-createInterface.js @@ -0,0 +1,26 @@ +'use strict'; +const common = require('../common.js'); +const readline = require('readline'); +const { Readable, Writable } = require('stream'); + +const bench = common.createBenchmark(main, { + n: [1e5], + terminal: [0, 1], +}); + +function main({ n, terminal }) { + bench.start(); + for (let i = 0; i < n; i++) { + const input = new Readable({ read() {} }); + const output = new Writable({ write(chunk, encoding, callback) { + callback(); + } }); + const rl = readline.createInterface({ + input, + output, + terminal: Boolean(terminal), + }); + rl.close(); + } + bench.end(n); +} diff --git a/benchmark/streams/iter-creation.js b/benchmark/streams/iter-creation.js new file mode 100644 index 000000000000..c5495fc29f42 --- /dev/null +++ b/benchmark/streams/iter-creation.js @@ -0,0 +1,99 @@ +// Object creation overhead benchmark. +// Measures the cost of constructing stream infrastructure (no data flow). +'use strict'; + +const common = require('../common.js'); +const { Readable, Writable, Transform, PassThrough } = require('stream'); +const { ok } = require('assert'); + +const bench = common.createBenchmark(main, { + api: ['classic', 'webstream', 'iter'], + type: ['readable', 'writable', 'transform', 'pair'], + n: [1e5], +}, { + flags: ['--experimental-stream-iter'], + // Iter has no standalone Transform class; transforms are plain functions. + combinationFilter: ({ api, type }) => + !(api === 'iter' && type === 'transform'), +}); + +function main({ api, type, n }) { + switch (api) { + case 'classic': + return benchClassic(type, n); + case 'webstream': + return benchWebStream(type, n); + case 'iter': + return benchIter(type, n); + } +} + +function benchClassic(type, n) { + let tmp; + bench.start(); + switch (type) { + case 'readable': + for (let i = 0; i < n; i++) tmp = new Readable({ read() {} }); + break; + case 'writable': + for (let i = 0; i < n; i++) tmp = new Writable({ write(c, e, cb) { cb(); } }); + break; + case 'transform': + for (let i = 0; i < n; i++) tmp = new Transform({ + transform(c, e, cb) { cb(null, c); }, + }); + break; + case 'pair': + for (let i = 0; i < n; i++) tmp = new PassThrough(); + break; + } + bench.end(n); + ok(tmp !== undefined); +} + +function benchWebStream(type, n) { + let tmp; + bench.start(); + switch (type) { + case 'readable': + for (let i = 0; i < n; i++) tmp = new ReadableStream({ pull() {} }); + break; + case 'writable': + for (let i = 0; i < n; i++) tmp = new WritableStream({ write() {} }); + break; + case 'transform': + for (let i = 0; i < n; i++) tmp = new TransformStream({ + transform(c, controller) { controller.enqueue(c); }, + }); + break; + case 'pair': { + // TransformStream gives a readable+writable pair + for (let i = 0; i < n; i++) tmp = new TransformStream(); + break; + } + } + bench.end(n); + ok(tmp !== undefined); +} + +function benchIter(type, n) { + const { push, from, duplex } = require('stream/iter'); + let tmp; + + bench.start(); + switch (type) { + case 'readable': + for (let i = 0; i < n; i++) tmp = from('x'); + break; + case 'writable': + // push() creates a writer+readable pair + for (let i = 0; i < n; i++) tmp = push(); + break; + case 'pair': + // duplex() creates a bidirectional channel pair + for (let i = 0; i < n; i++) tmp = duplex(); + break; + } + bench.end(n); + ok(tmp !== undefined); +} diff --git a/benchmark/streams/iter-file-read.js b/benchmark/streams/iter-file-read.js new file mode 100644 index 000000000000..6d8139dc6de3 --- /dev/null +++ b/benchmark/streams/iter-file-read.js @@ -0,0 +1,107 @@ +// File reading throughput benchmark. +// Reads a real file through the three stream APIs. +'use strict'; + +const common = require('../common.js'); +const fs = require('fs'); +const { Writable, pipeline } = require('stream'); +const tmpdir = require('../../test/common/tmpdir'); + +tmpdir.refresh(); +const filename = tmpdir.resolve(`.removeme-bench-file-read-${process.pid}`); + +const bench = common.createBenchmark(main, { + api: ['classic', 'webstream', 'iter'], + filesize: [1024 * 1024, 16 * 1024 * 1024, 64 * 1024 * 1024], + n: [5], +}, { + flags: ['--experimental-stream-iter'], +}); + +function main({ api, filesize, n }) { + // Create fixture file + const chunk = Buffer.alloc(Math.min(filesize, 64 * 1024), 'abcdefghij'); + const fd = fs.openSync(filename, 'w'); + let remaining = filesize; + while (remaining > 0) { + const size = Math.min(remaining, chunk.length); + fs.writeSync(fd, chunk, 0, size); + remaining -= size; + } + fs.closeSync(fd); + + const totalOps = (filesize * n) / (1024 * 1024); + + switch (api) { + case 'classic': + return benchClassic(filesize, n, totalOps); + case 'webstream': + return benchWebStream(filesize, n, totalOps); + case 'iter': + return benchIter(filesize, n, totalOps); + } +} + +function benchClassic(filesize, n, totalOps) { + function run(cb) { + const r = fs.createReadStream(filename); + const w = new Writable({ write(data, enc, cb) { cb(); } }); + pipeline(r, w, cb); + } + + // Warmup + run(() => { + let i = 0; + bench.start(); + (function next() { + if (i++ >= n) { + fs.unlinkSync(filename); + return bench.end(totalOps); + } + run(next); + })(); + }); +} + +function benchWebStream(filesize, n, totalOps) { + const fsp = require('fs/promises'); + + async function run() { + const fh = await fsp.open(filename, 'r'); + const rs = fh.readableWebStream(); + const ws = new WritableStream({ write() {} }); + await rs.pipeTo(ws); + await fh.close(); + } + + (async () => { + // Warmup + await run(); + + bench.start(); + for (let i = 0; i < n; i++) await run(); + fs.unlinkSync(filename); + bench.end(totalOps); + })(); +} + +function benchIter(filesize, n, totalOps) { + const fsp = require('fs/promises'); + const { pipeTo } = require('stream/iter'); + + async function run() { + const fh = await fsp.open(filename, 'r'); + await pipeTo(fh.pull(), { write() {} }); + await fh.close(); + } + + (async () => { + // Warmup + await run(); + + bench.start(); + for (let i = 0; i < n; i++) await run(); + fs.unlinkSync(filename); + bench.end(totalOps); + })(); +} diff --git a/benchmark/streams/iter-from-batching.js b/benchmark/streams/iter-from-batching.js new file mode 100644 index 000000000000..0e09537b9eae --- /dev/null +++ b/benchmark/streams/iter-from-batching.js @@ -0,0 +1,100 @@ +// Measures batching behavior for stream/iter from() and fromSync() +// with plain synchronous Uint8Array iterables. +'use strict'; + +const common = require('../common.js'); +const { closeSync, openSync, writeSync, writevSync } = require('fs'); +const { devNull } = require('os'); + +const bench = common.createBenchmark(main, { + method: ['from-first-batch', 'from-sync-writev'], + chunks: [256, 4096, 16384], + chunkSize: [16], + n: [100, 1000], +}, { + flags: ['--experimental-stream-iter'], + combinationFilter({ method, chunks, n }) { + if (n === 1) { + return true; + } + if (method === 'from-first-batch') { + return n === 1000; + } + return n === 100 && chunks !== 16384; + }, + test: { + chunks: 256, + chunkSize: 16, + n: 1, + }, +}); + +function main({ method, chunks, chunkSize, n }) { + switch (method) { + case 'from-first-batch': + return benchFromFirstBatch(chunks, chunkSize, n); + case 'from-sync-writev': + return benchFromSyncWritev(chunks, chunkSize, n); + } +} + +function* source(chunks, chunk) { + for (let i = 0; i < chunks; i++) { + yield chunk; + } +} + +function benchFromFirstBatch(chunks, chunkSize, n) { + const { from } = require('stream/iter'); + const chunk = new Uint8Array(chunkSize); + let seen = 0; + + (async () => { + bench.start(); + for (let i = 0; i < n; i++) { + const iterator = from(source(chunks, chunk))[Symbol.asyncIterator](); + const { value, done } = await iterator.next(); + if (done || value.length === 0) { + throw new Error('expected a batch'); + } + seen += value.length; + } + bench.end(n); + if (seen === 0) { + throw new Error('expected chunks'); + } + })(); +} + +function benchFromSyncWritev(chunks, chunkSize, n) { + const { pipeToSync } = require('stream/iter'); + const chunk = new Uint8Array(chunkSize); + const expected = chunks * chunkSize * n; + let seen = 0; + let total = 0; + const fd = openSync(devNull, 'w'); + const writer = { + writeSync(chunk) { + writeSync(fd, chunk); + seen++; + }, + writevSync(batch) { + writevSync(fd, batch); + seen += batch.length; + }, + }; + + try { + bench.start(); + for (let i = 0; i < n; i++) { + total += pipeToSync(source(chunks, chunk), writer); + } + bench.end(chunks * n); + } finally { + closeSync(fd); + } + + if (total !== expected || seen !== chunks * n) { + throw new Error('unexpected chunk count'); + } +} diff --git a/benchmark/streams/iter-throughput-broadcast.js b/benchmark/streams/iter-throughput-broadcast.js new file mode 100644 index 000000000000..c5bbac930677 --- /dev/null +++ b/benchmark/streams/iter-throughput-broadcast.js @@ -0,0 +1,147 @@ +// Throughput benchmark: fan-out data to N consumers simultaneously. +// Classic streams use PassThrough + pipe, Web Streams use tee() chains, +// stream/iter uses broadcast() with push() consumers. +'use strict'; + +const common = require('../common.js'); +const { PassThrough, Writable } = require('stream'); + +const bench = common.createBenchmark(main, { + api: ['classic', 'webstream', 'iter'], + consumers: [1, 2, 4], + datasize: [1024 * 1024, 16 * 1024 * 1024], + n: [5], +}, { + flags: ['--experimental-stream-iter'], +}); + +const CHUNK_SIZE = 64 * 1024; + +function main({ api, consumers, datasize, n }) { + const chunk = Buffer.alloc(CHUNK_SIZE, 'abcdefghij'); + const totalOps = (datasize * n) / (1024 * 1024); + + switch (api) { + case 'classic': + return benchClassic(chunk, consumers, datasize, n, totalOps); + case 'webstream': + return benchWebStream(chunk, consumers, datasize, n, totalOps); + case 'iter': + return benchIter(chunk, consumers, datasize, n, totalOps); + } +} + +function benchClassic(chunk, numConsumers, datasize, n, totalOps) { + function run(cb) { + const source = new PassThrough(); + const sinks = []; + let finished = 0; + + for (let c = 0; c < numConsumers; c++) { + const w = new Writable({ write(data, enc, cb) { cb(); } }); + source.pipe(w); + w.on('finish', () => { if (++finished === numConsumers) cb(); }); + sinks.push(w); + } + + let remaining = datasize; + function write() { + let ok = true; + while (ok && remaining > 0) { + const size = Math.min(remaining, chunk.length); + remaining -= size; + const buf = size === chunk.length ? chunk : chunk.subarray(0, size); + ok = source.write(buf); + } + if (remaining > 0) { + source.once('drain', write); + } else { + source.end(); + } + } + write(); + } + + let i = 0; + bench.start(); + (function next() { + if (i++ >= n) return bench.end(totalOps); + run(next); + })(); +} + +function benchWebStream(chunk, numConsumers, datasize, n, totalOps) { + async function run() { + let remaining = datasize; + const rs = new ReadableStream({ + pull(controller) { + if (remaining <= 0) { controller.close(); return; } + const size = Math.min(remaining, chunk.length); + remaining -= size; + controller.enqueue( + size === chunk.length ? chunk : chunk.subarray(0, size)); + }, + }); + + // Chain tee() calls to get numConsumers branches. + // tee() gives 2; for 4 we tee twice at each level. + const branches = []; + if (numConsumers === 1) { + branches.push(rs); + } else { + const pending = [rs]; + while (branches.length + pending.length < numConsumers) { + const stream = pending.shift(); + const [a, b] = stream.tee(); + pending.push(a, b); + } + branches.push(...pending); + } + + const ws = () => new WritableStream({ write() {} }); + await Promise.all(branches.map((b) => b.pipeTo(ws()))); + } + + (async () => { + bench.start(); + for (let i = 0; i < n; i++) await run(); + bench.end(totalOps); + })(); +} + +function benchIter(chunk, numConsumers, datasize, n, totalOps) { + const { broadcast } = require('stream/iter'); + + // No-op consumer: drain all batches without collecting + async function drain(source) { + // eslint-disable-next-line no-unused-vars + for await (const _ of source) { /* drain */ } + } + + async function run() { + const { writer, broadcast: bc } = broadcast(); + const consumers = []; + for (let c = 0; c < numConsumers; c++) { + consumers.push(drain(bc.push())); + } + + let remaining = datasize; + while (remaining > 0) { + const size = Math.min(remaining, chunk.length); + const buf = size === chunk.length ? chunk : chunk.subarray(0, size); + if (!writer.writeSync(buf)) { + await writer.write(buf); + } + remaining -= size; + } + writer.endSync(); + + await Promise.all(consumers); + } + + (async () => { + bench.start(); + for (let i = 0; i < n; i++) await run(); + bench.end(totalOps); + })(); +} diff --git a/benchmark/streams/iter-throughput-compression.js b/benchmark/streams/iter-throughput-compression.js new file mode 100644 index 000000000000..0c32ddc9afca --- /dev/null +++ b/benchmark/streams/iter-throughput-compression.js @@ -0,0 +1,104 @@ +// Throughput benchmark: gzip compress then decompress round-trip. +// Tests real-world compression performance across stream APIs. +'use strict'; + +const common = require('../common.js'); +const { Readable, Writable, pipeline } = require('stream'); +const zlib = require('zlib'); + +const bench = common.createBenchmark(main, { + api: ['classic', 'webstream', 'iter'], + datasize: [1024 * 1024, 16 * 1024 * 1024, 64 * 1024 * 1024], + n: [5], +}, { + flags: ['--experimental-stream-iter'], +}); + +const CHUNK_SIZE = 64 * 1024; + +function main({ api, datasize, n }) { + const chunk = Buffer.alloc(CHUNK_SIZE, 'abcdefghij'); + const totalOps = (datasize * n) / (1024 * 1024); + + switch (api) { + case 'classic': + return benchClassic(chunk, datasize, n, totalOps); + case 'webstream': + return benchWebStream(chunk, datasize, n, totalOps); + case 'iter': + return benchIter(chunk, datasize, n, totalOps); + } +} + +function benchClassic(chunk, datasize, n, totalOps) { + function run(cb) { + let remaining = datasize; + const r = new Readable({ + read() { + if (remaining <= 0) { this.push(null); return; } + const size = Math.min(remaining, chunk.length); + remaining -= size; + this.push(size === chunk.length ? chunk : chunk.subarray(0, size)); + }, + }); + const w = new Writable({ write(data, enc, cb) { cb(); } }); + pipeline(r, zlib.createGzip(), zlib.createGunzip(), w, cb); + } + + let i = 0; + bench.start(); + (function next() { + if (i++ >= n) return bench.end(totalOps); + run(next); + })(); +} + +function benchWebStream(chunk, datasize, n, totalOps) { + async function run() { + let remaining = datasize; + const rs = new ReadableStream({ + pull(controller) { + if (remaining <= 0) { controller.close(); return; } + const size = Math.min(remaining, chunk.length); + remaining -= size; + controller.enqueue( + size === chunk.length ? chunk : chunk.subarray(0, size)); + }, + }); + const ws = new WritableStream({ write() {} }); + await rs + .pipeThrough(new CompressionStream('gzip')) + .pipeThrough(new DecompressionStream('gzip')) + .pipeTo(ws); + } + + (async () => { + bench.start(); + for (let i = 0; i < n; i++) await run(); + bench.end(totalOps); + })(); +} + +function benchIter(chunk, datasize, n, totalOps) { + const { pipeTo } = require('stream/iter'); + const { compressGzip, decompressGzip } = require('zlib/iter'); + + async function run() { + let remaining = datasize; + async function* source() { + while (remaining > 0) { + const size = Math.min(remaining, chunk.length); + remaining -= size; + yield [size === chunk.length ? chunk : chunk.subarray(0, size)]; + } + } + await pipeTo(source(), compressGzip(), decompressGzip(), + { write() {}, writeSync() { return true; } }); + } + + (async () => { + bench.start(); + for (let i = 0; i < n; i++) await run(); + bench.end(totalOps); + })(); +} diff --git a/benchmark/streams/iter-throughput-identity.js b/benchmark/streams/iter-throughput-identity.js new file mode 100644 index 000000000000..42640cf0f9d8 --- /dev/null +++ b/benchmark/streams/iter-throughput-identity.js @@ -0,0 +1,132 @@ +// Throughput benchmark: raw data flow from source to consumer, no transforms. +// Compares Node.js classic streams, Web Streams, and stream/iter. +'use strict'; + +const common = require('../common.js'); +const { Readable, Writable, pipeline } = require('stream'); + +const bench = common.createBenchmark(main, { + api: ['classic', 'webstream', 'iter', 'iter-sync'], + datasize: [1024 * 1024, 16 * 1024 * 1024, 64 * 1024 * 1024], + n: [5], +}, { + flags: ['--experimental-stream-iter'], +}); + +const CHUNK_SIZE = 64 * 1024; + +function main({ api, datasize, n }) { + const chunk = Buffer.alloc(CHUNK_SIZE, 'abcdefghij'); + const totalOps = (datasize * n) / (1024 * 1024); // MB + + switch (api) { + case 'classic': + return benchClassic(chunk, datasize, n, totalOps); + case 'webstream': + return benchWebStream(chunk, datasize, n, totalOps); + case 'iter': + return benchIter(chunk, datasize, n, totalOps); + case 'iter-sync': + return benchIterSync(chunk, datasize, n, totalOps); + } +} + +function benchClassic(chunk, datasize, n, totalOps) { + let remaining = 0; + + function run(cb) { + remaining = datasize; + const r = new Readable({ + read() { + if (remaining <= 0) { + this.push(null); + return; + } + const size = Math.min(remaining, chunk.length); + remaining -= size; + this.push(size === chunk.length ? chunk : chunk.subarray(0, size)); + }, + }); + const w = new Writable({ + write(data, enc, cb) { cb(); }, + }); + pipeline(r, w, cb); + } + + let i = 0; + bench.start(); + (function next() { + if (i++ >= n) return bench.end(totalOps); + run(next); + })(); +} + +function benchWebStream(chunk, datasize, n, totalOps) { + async function run() { + let remaining = datasize; + const rs = new ReadableStream({ + pull(controller) { + if (remaining <= 0) { + controller.close(); + return; + } + const size = Math.min(remaining, chunk.length); + remaining -= size; + controller.enqueue( + size === chunk.length ? chunk : chunk.subarray(0, size)); + }, + }); + const ws = new WritableStream({ + write() {}, + }); + await rs.pipeTo(ws); + } + + (async () => { + bench.start(); + for (let i = 0; i < n; i++) await run(); + bench.end(totalOps); + })(); +} + +function benchIter(chunk, datasize, n, totalOps) { + const { pipeTo } = require('stream/iter'); + + async function run() { + let remaining = datasize; + async function* source() { + while (remaining > 0) { + const size = Math.min(remaining, chunk.length); + remaining -= size; + yield [size === chunk.length ? chunk : chunk.subarray(0, size)]; + } + } + // Drain to no-op sink, matching classic/webstream behavior + await pipeTo(source(), { write() {}, writeSync() { return true; } }); + } + + (async () => { + bench.start(); + for (let i = 0; i < n; i++) await run(); + bench.end(totalOps); + })(); +} + +function benchIterSync(chunk, datasize, n, totalOps) { + const { pipeToSync } = require('stream/iter'); + + bench.start(); + for (let i = 0; i < n; i++) { + let remaining = datasize; + function* source() { + while (remaining > 0) { + const size = Math.min(remaining, chunk.length); + remaining -= size; + yield [size === chunk.length ? chunk : chunk.subarray(0, size)]; + } + } + // Drain to no-op sink, matching other benchmarks + pipeToSync(source(), { writeSync() {} }); + } + bench.end(totalOps); +} diff --git a/benchmark/streams/iter-throughput-pipeto.js b/benchmark/streams/iter-throughput-pipeto.js new file mode 100644 index 000000000000..819d5e22a8a2 --- /dev/null +++ b/benchmark/streams/iter-throughput-pipeto.js @@ -0,0 +1,146 @@ +// Throughput benchmark: pipe source to a no-op sink (write-only destination). +// Measures pure pipe throughput without consumer-side collection overhead. +'use strict'; + +const common = require('../common.js'); +const { Readable, Writable, pipeline } = require('stream'); + +const bench = common.createBenchmark(main, { + api: ['classic', 'webstream', 'iter', 'iter-sync-source', 'iter-sync'], + datasize: [1024 * 1024, 16 * 1024 * 1024, 64 * 1024 * 1024], + n: [5], +}, { + flags: ['--experimental-stream-iter'], +}); + +const CHUNK_SIZE = 64 * 1024; + +function main({ api, datasize, n }) { + const chunk = Buffer.alloc(CHUNK_SIZE, 'abcdefghij'); + const totalOps = (datasize * n) / (1024 * 1024); + + switch (api) { + case 'classic': + return benchClassic(chunk, datasize, n, totalOps); + case 'webstream': + return benchWebStream(chunk, datasize, n, totalOps); + case 'iter': + return benchIter(chunk, datasize, n, totalOps); + case 'iter-sync-source': + return benchIterSyncSource(chunk, datasize, n, totalOps); + case 'iter-sync': + return benchIterSync(chunk, datasize, n, totalOps); + } +} + +function benchClassic(chunk, datasize, n, totalOps) { + function run(cb) { + let remaining = datasize; + const r = new Readable({ + read() { + if (remaining <= 0) { this.push(null); return; } + const size = Math.min(remaining, chunk.length); + remaining -= size; + this.push(size === chunk.length ? chunk : chunk.subarray(0, size)); + }, + }); + const w = new Writable({ write(data, enc, cb) { cb(); } }); + pipeline(r, w, cb); + } + + let i = 0; + bench.start(); + (function next() { + if (i++ >= n) return bench.end(totalOps); + run(next); + })(); +} + +function benchWebStream(chunk, datasize, n, totalOps) { + async function run() { + let remaining = datasize; + const rs = new ReadableStream({ + pull(controller) { + if (remaining <= 0) { controller.close(); return; } + const size = Math.min(remaining, chunk.length); + remaining -= size; + controller.enqueue( + size === chunk.length ? chunk : chunk.subarray(0, size)); + }, + }); + const ws = new WritableStream({ write() {} }); + await rs.pipeTo(ws); + } + + (async () => { + bench.start(); + for (let i = 0; i < n; i++) await run(); + bench.end(totalOps); + })(); +} + +function benchIter(chunk, datasize, n, totalOps) { + const { pipeTo } = require('stream/iter'); + + async function run() { + let remaining = datasize; + async function* source() { + while (remaining > 0) { + const size = Math.min(remaining, chunk.length); + remaining -= size; + yield [size === chunk.length ? chunk : chunk.subarray(0, size)]; + } + } + // Provide writeSync for the sync fast path in pipeTo + const writer = { write() {}, writeSync() { return true; } }; + await pipeTo(source(), writer); + } + + (async () => { + bench.start(); + for (let i = 0; i < n; i++) await run(); + bench.end(totalOps); + })(); +} + +function benchIterSyncSource(chunk, datasize, n, totalOps) { + const { pipeTo } = require('stream/iter'); + + async function run() { + let remaining = datasize; + function* source() { + while (remaining > 0) { + const size = Math.min(remaining, chunk.length); + remaining -= size; + yield size === chunk.length ? chunk : chunk.subarray(0, size); + } + } + const writer = { write() {}, writeSync() { return true; } }; + await pipeTo(source(), writer); + } + + (async () => { + bench.start(); + for (let i = 0; i < n; i++) await run(); + bench.end(totalOps); + })(); +} + +function benchIterSync(chunk, datasize, n, totalOps) { + const { pipeToSync } = require('stream/iter'); + + bench.start(); + for (let i = 0; i < n; i++) { + let remaining = datasize; + function* source() { + while (remaining > 0) { + const size = Math.min(remaining, chunk.length); + remaining -= size; + yield [size === chunk.length ? chunk : chunk.subarray(0, size)]; + } + } + const writer = { writeSync() {} }; + pipeToSync(source(), writer); + } + bench.end(totalOps); +} diff --git a/benchmark/streams/iter-throughput-share.js b/benchmark/streams/iter-throughput-share.js new file mode 100644 index 000000000000..c17444d81035 --- /dev/null +++ b/benchmark/streams/iter-throughput-share.js @@ -0,0 +1,32 @@ +'use strict'; + +const common = require('../common.js'); + +const bench = common.createBenchmark(main, { + consumers: [2, 8, 32], + batches: [1e4], + backpressure: ['unbounded'], + n: [5], +}, { + flags: ['--experimental-stream-iter'], +}); + +async function main({ consumers, batches, backpressure, n }) { + const { share, array } = require('stream/iter'); + const chunk = Buffer.alloc(1024); + const totalOps = batches * consumers * n; + + async function* source() { + for (let i = 0; i < batches; i++) { + yield [chunk]; + } + } + + bench.start(); + for (let i = 0; i < n; i++) { + const shared = share(source(), { budget: 65536, backpressure }); + const readers = Array.from({ length: consumers }, () => array(shared.pull())); + await Promise.all(readers); + } + bench.end(totalOps); +} diff --git a/benchmark/streams/iter-throughput-transform.js b/benchmark/streams/iter-throughput-transform.js new file mode 100644 index 000000000000..b251aea4af27 --- /dev/null +++ b/benchmark/streams/iter-throughput-transform.js @@ -0,0 +1,146 @@ +// Throughput benchmark: data flow through a single stateless transform. +// Uses buffer copy (allocate + memcpy) so pipeline overhead is measurable. +'use strict'; + +const common = require('../common.js'); +const { Readable, Transform, Writable, pipeline } = require('stream'); + +const bench = common.createBenchmark(main, { + api: ['classic', 'webstream', 'iter', 'iter-sync'], + datasize: [1024 * 1024, 16 * 1024 * 1024, 64 * 1024 * 1024], + n: [5], +}, { + flags: ['--experimental-stream-iter'], +}); + +const CHUNK_SIZE = 64 * 1024; + +// Buffer copy transform: allocate + memcpy. Cheap enough that pipeline +// overhead is a measurable fraction of total time, but non-trivial (new +// buffer per chunk, so it's a real transform that produces new data). +function copyBuf(buf) { + return Buffer.copyBytesFrom(buf); +} + +function main({ api, datasize, n }) { + const chunk = Buffer.alloc(CHUNK_SIZE, 'abcdefghij'); + const totalOps = (datasize * n) / (1024 * 1024); + + switch (api) { + case 'classic': + return benchClassic(chunk, datasize, n, totalOps); + case 'webstream': + return benchWebStream(chunk, datasize, n, totalOps); + case 'iter': + return benchIter(chunk, datasize, n, totalOps); + case 'iter-sync': + return benchIterSync(chunk, datasize, n, totalOps); + } +} + +function benchClassic(chunk, datasize, n, totalOps) { + function run(cb) { + let remaining = datasize; + const r = new Readable({ + read() { + if (remaining <= 0) { this.push(null); return; } + const size = Math.min(remaining, chunk.length); + remaining -= size; + this.push(size === chunk.length ? chunk : chunk.subarray(0, size)); + }, + }); + const t = new Transform({ + transform(data, enc, cb) { + cb(null, copyBuf(data)); + }, + }); + const w = new Writable({ write(data, enc, cb) { cb(); } }); + pipeline(r, t, w, cb); + } + + let i = 0; + bench.start(); + (function next() { + if (i++ >= n) return bench.end(totalOps); + run(next); + })(); +} + +function benchWebStream(chunk, datasize, n, totalOps) { + async function run() { + let remaining = datasize; + const rs = new ReadableStream({ + pull(controller) { + if (remaining <= 0) { controller.close(); return; } + const size = Math.min(remaining, chunk.length); + remaining -= size; + controller.enqueue( + size === chunk.length ? chunk : chunk.subarray(0, size)); + }, + }); + const ts = new TransformStream({ + transform(c, controller) { + controller.enqueue(copyBuf(c)); + }, + }); + const ws = new WritableStream({ write() {} }); + await rs.pipeThrough(ts).pipeTo(ws); + } + + (async () => { + bench.start(); + for (let i = 0; i < n; i++) await run(); + bench.end(totalOps); + })(); +} + +function benchIter(chunk, datasize, n, totalOps) { + const { pipeTo } = require('stream/iter'); + + const upper = (chunks) => { + if (chunks === null) return null; + return chunks.map((c) => copyBuf(c)); + }; + + async function run() { + let remaining = datasize; + async function* source() { + while (remaining > 0) { + const size = Math.min(remaining, chunk.length); + remaining -= size; + yield [size === chunk.length ? chunk : chunk.subarray(0, size)]; + } + } + await pipeTo(source(), upper, + { write() {}, writeSync() { return true; } }); + } + + (async () => { + bench.start(); + for (let i = 0; i < n; i++) await run(); + bench.end(totalOps); + })(); +} + +function benchIterSync(chunk, datasize, n, totalOps) { + const { pipeToSync } = require('stream/iter'); + + const upper = (chunks) => { + if (chunks === null) return null; + return chunks.map((c) => copyBuf(c)); + }; + + bench.start(); + for (let i = 0; i < n; i++) { + let remaining = datasize; + function* source() { + while (remaining > 0) { + const size = Math.min(remaining, chunk.length); + remaining -= size; + yield [size === chunk.length ? chunk : chunk.subarray(0, size)]; + } + } + pipeToSync(source(), upper, { writeSync() {} }); + } + bench.end(totalOps); +} diff --git a/benchmark/url/legacy-url-get-prop.js b/benchmark/url/legacy-url-get-prop.js index 09be863e963a..505a57d594cf 100644 --- a/benchmark/url/legacy-url-get-prop.js +++ b/benchmark/url/legacy-url-get-prop.js @@ -6,6 +6,10 @@ const assert = require('assert'); const bench = common.createBenchmark(main, { type: common.urlDataTypes, e: [1], +}, { + test: { + type: 'short', + }, }); function main({ type, e }) { diff --git a/benchmark/url/legacy-url-parse.js b/benchmark/url/legacy-url-parse.js index ac893ebf8ad1..b2f62c068052 100644 --- a/benchmark/url/legacy-url-parse.js +++ b/benchmark/url/legacy-url-parse.js @@ -6,6 +6,10 @@ const assert = require('assert'); const bench = common.createBenchmark(main, { type: common.urlDataTypes, e: [1], +}, { + test: { + type: 'short', + }, }); function main({ e, type }) { diff --git a/benchmark/url/legacy-vs-whatwg-url-serialize.js b/benchmark/url/legacy-vs-whatwg-url-serialize.js index b36cde12b708..73dc14de4cfc 100644 --- a/benchmark/url/legacy-vs-whatwg-url-serialize.js +++ b/benchmark/url/legacy-vs-whatwg-url-serialize.js @@ -8,6 +8,10 @@ const bench = common.createBenchmark(main, { type: common.urlDataTypes, method: ['legacy', 'whatwg'], e: [1], +}, { + test: { + type: 'short', + }, }); function useLegacy(data) { diff --git a/benchmark/url/whatwg-url-get-prop.js b/benchmark/url/whatwg-url-get-prop.js index 3a88dd1da6fa..19b0447a8386 100644 --- a/benchmark/url/whatwg-url-get-prop.js +++ b/benchmark/url/whatwg-url-get-prop.js @@ -7,6 +7,10 @@ const assert = require('assert'); const bench = common.createBenchmark(main, { type: common.urlDataTypes, e: [1], +}, { + test: { + type: 'short', + }, }); function main({ type, e }) { diff --git a/benchmark/url/whatwg-url-parse.js b/benchmark/url/whatwg-url-parse.js index 0c10b12587a8..ce9b27c28f08 100644 --- a/benchmark/url/whatwg-url-parse.js +++ b/benchmark/url/whatwg-url-parse.js @@ -8,6 +8,10 @@ const bench = common.createBenchmark(main, { withBase: ['true', 'false'], type: common.urlDataTypes, e: [1], +}, { + test: { + type: 'short', + }, }); function useWHATWGWithBase(data) { diff --git a/benchmark/url/whatwg-url-properties.js b/benchmark/url/whatwg-url-properties.js index 0c1bc225ba19..de834fb46ff7 100644 --- a/benchmark/url/whatwg-url-properties.js +++ b/benchmark/url/whatwg-url-properties.js @@ -8,6 +8,10 @@ const bench = common.createBenchmark(main, { prop: ['href', 'origin', 'protocol', 'username', 'password', 'host', 'hostname', 'port', 'pathname', 'search', 'searchParams', 'hash'], +}, { + test: { + type: 'short', + }, }); function setAndGet(data, prop) { diff --git a/benchmark/webstreams/readable-async-iterator.js b/benchmark/webstreams/readable-async-iterator.js index 8cdc4785db3d..73ff3e1ef2b1 100644 --- a/benchmark/webstreams/readable-async-iterator.js +++ b/benchmark/webstreams/readable-async-iterator.js @@ -6,23 +6,40 @@ const { const bench = common.createBenchmark(main, { n: [1e5], + type: ['normal', 'bytes'], }); -async function main({ n }) { - const rs = new ReadableStream({ - pull: function(controller) { - controller.enqueue(1); - }, - }); +async function main({ n, type }) { + const rs = type === 'bytes' ? + new ReadableStream({ + type: 'bytes', + pull: function(controller) { + controller.enqueue(new Uint8Array(1)); + }, + }) : + new ReadableStream({ + pull: function(controller) { + controller.enqueue(1); + }, + }); let x = 0; bench.start(); - for await (const chunk of rs) { - x += chunk; - if (x > n) { - break; + if (type === 'bytes') { + for await (const chunk of rs) { + x += chunk.byteLength; + if (x > n) { + break; + } + } + } else { + for await (const chunk of rs) { + x += chunk; + if (x > n) { + break; + } } } // Use x to ensure V8 does not optimize away the loop as a noop. diff --git a/benchmark/webstreams/tee.js b/benchmark/webstreams/tee.js new file mode 100644 index 000000000000..2b1b4802dd92 --- /dev/null +++ b/benchmark/webstreams/tee.js @@ -0,0 +1,44 @@ +'use strict'; +const common = require('../common.js'); +const { ReadableStream } = require('node:stream/web'); + +const bench = common.createBenchmark(main, { + n: [1e5], + type: ['normal', 'bytes'], +}); + +async function main({ n, type }) { + let i = 0; + const source = type === 'bytes' ? + { + type: 'bytes', + pull(controller) { + if (i++ < n) controller.enqueue(new Uint8Array(16)); + else controller.close(); + }, + } : + { + pull(controller) { + if (i++ < n) controller.enqueue('a'); + else controller.close(); + }, + }; + + const rs = new ReadableStream(source); + const [branch1, branch2] = rs.tee(); + const reader1 = branch1.getReader(); + const reader2 = branch2.getReader(); + let reads = 0; + + bench.start(); + for (;;) { + const [result1, result2] = await Promise.all([ + reader1.read(), + reader2.read(), + ]); + if (result1.done || result2.done) break; + reads++; + } + bench.end(reads); + console.assert(reads === n); +} diff --git a/common.gypi b/common.gypi index a2cd172f1023..83e0691d4a2d 100644 --- a/common.gypi +++ b/common.gypi @@ -24,6 +24,7 @@ 'node_module_version%': '', 'node_with_ltcg%': '', 'node_shared_openssl%': 'false', + 'openssl_is_boringssl%': 'false', 'node_tag%': '', 'uv_library%': 'static_library', @@ -41,7 +42,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.51', + 'v8_embedder_string': '-node.53', ##### V8 defaults for Node.js ##### diff --git a/configure.py b/configure.py index a9910d038f01..7fd64a9620e3 100755 --- a/configure.py +++ b/configure.py @@ -1328,50 +1328,72 @@ def get_gas_version(cc): warn(f'Could not recognize `gas`: {gas_ret}') return '0.0' -def get_openssl_version(): +def get_openssl_macros(o): + """Extract OpenSSL preprocessor macros from the configured headers.""" + + # Use the C compiler to extract preprocessor macros from OpenSSL headers. + # crypto.h is included because BoringSSL declares OPENSSL_IS_BORINGSSL there. + args = ['-E', '-dM', + '-include', 'openssl/opensslv.h', + '-include', 'openssl/crypto.h', + '-'] + if not options.shared_openssl: + args = ['-I', 'deps/openssl/openssl/include'] + args + elif options.shared_openssl_includes: + args = ['-I', options.shared_openssl_includes] + args + else: + for dir in o['include_dirs']: + args = ['-I', dir] + args + + proc = subprocess.Popen( + shlex.split(CC) + args, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE + ) + with proc: + proc.stdin.write(b'\n') + out = to_utf8(proc.communicate()[0]) + + if proc.returncode != 0: + warn('Failed to extract OpenSSL macros from headers') + return {} + + macros = {} + for line in out.split('\n'): + if line.startswith('#define OPENSSL_'): + parts = line.split() + if len(parts) >= 2: + macro_name = parts[1] + macro_value = parts[2] if len(parts) >= 3 else '1' + macros[macro_name] = macro_value + + return macros + +def get_openssl_version(o): """Parse OpenSSL version from opensslv.h header file. Returns the version as a number matching OPENSSL_VERSION_NUMBER format: - 0xMNN00PPSL where M=major, NN=minor, PP=patch, S=status(0xf=release,0x0=pre), L=0 + 0xMNN00PPSL where M=major, NN=minor, PP=patch, S=status(0xf=release,0x0=pre), + L denotes as a long type literal """ try: - # Use the C compiler to extract preprocessor macros from opensslv.h - args = ['-E', '-dM', '-include', 'openssl/opensslv.h', '-'] - if not options.shared_openssl: - args = ['-I', 'deps/openssl/openssl/include'] + args - elif options.shared_openssl_includes: - args = ['-I', options.shared_openssl_includes] + args - - proc = subprocess.Popen( - shlex.split(CC) + args, - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE - ) - with proc: - proc.stdin.write(b'\n') - out = to_utf8(proc.communicate()[0]) - - if proc.returncode != 0: - warn('Failed to extract OpenSSL version from opensslv.h header') - return 0 - - # Parse the macro definitions - macros = {} - for line in out.split('\n'): - if line.startswith('#define OPENSSL_VERSION_'): - parts = line.split() - if len(parts) >= 3: - macro_name = parts[1] - macro_value = parts[2] - macros[macro_name] = macro_value + macros = get_openssl_macros(o) # Extract version components major = int(macros.get('OPENSSL_VERSION_MAJOR', '0')) minor = int(macros.get('OPENSSL_VERSION_MINOR', '0')) patch = int(macros.get('OPENSSL_VERSION_PATCH', '0')) + # If major, minor and patch are all 0, this is probably OpenSSL < 3. + if (major, minor, patch) == (0, 0, 0): + version_number = macros.get('OPENSSL_VERSION_NUMBER') + # Prior to OpenSSL 3 the value should be in the format 0xMNN00PPSL. + # If it is, we need to strip the `L` suffix prior to parsing. + if version_number[:2] == "0x" and version_number[-1] == "L": + return int(version_number[:-1], 16) + # Check if it's a pre-release (has non-empty PRE_RELEASE string) pre_release = macros.get('OPENSSL_VERSION_PRE_RELEASE', '""').strip('"') status = 0x0 if pre_release else 0xf @@ -1387,6 +1409,13 @@ def get_openssl_version(): warn(f'Failed to determine OpenSSL version from header: {e}') return 0 +def get_openssl_is_boringssl(o): + try: + return b('OPENSSL_IS_BORINGSSL' in get_openssl_macros(o)) + except (OSError, ValueError, subprocess.SubprocessError) as e: + warn(f'Failed to determine whether OpenSSL headers are BoringSSL: {e}') + return 'false' + # Note: Apple clang self-reports as clang 4.2.0 and gcc 4.2.1. It passes # the version check more by accident than anything else but a more rigorous # check involves checking the build number against an allowlist. I'm not @@ -2065,6 +2094,9 @@ def without_ssl_error(option): configure_library('openssl', o) + o['variables']['openssl_version'] = get_openssl_version(o) + o['variables']['openssl_is_boringssl'] = get_openssl_is_boringssl(o) + def configure_sqlite(o): o['variables']['node_use_sqlite'] = b(not options.without_sqlite) if options.without_sqlite: diff --git a/deps/acorn/acorn/CHANGELOG.md b/deps/acorn/acorn/CHANGELOG.md index 6efbc332df56..d8d95e1a944c 100644 --- a/deps/acorn/acorn/CHANGELOG.md +++ b/deps/acorn/acorn/CHANGELOG.md @@ -1,3 +1,15 @@ +## 8.18.0 (2026-07-28) + +### New features + +The new `startLocation` option can now be used to tell the parser the line and column the parse starts at (mostly useful with `parseExpressionAt`). + +### Bug fixes + +Reject uses of `**` with a non-parenthesized arrow function as left-hand side. + +Avoid computing the start line in `parseExpressionAt` when locations aren't used. + ## 8.17.0 (2026-06-11) ### New features diff --git a/deps/acorn/acorn/README.md b/deps/acorn/acorn/README.md index 313acd65c2cf..5412329c6d1c 100644 --- a/deps/acorn/acorn/README.md +++ b/deps/acorn/acorn/README.md @@ -137,6 +137,11 @@ required): one-based line and zero-based column numbers in `{line, column}` form. Default is `false`. +- **startLocation**: An optional `{line, column}` object to use for + the start of the parse. This is mostly useful when using + `parseExpressionAt` with `locations: true`, to prevent the parser + from having to determine the line position at the start position. + - **onToken**: If a function is passed for this option, each found token will be passed in same format as tokens returned from `tokenizer().getToken()`. diff --git a/deps/acorn/acorn/dist/acorn.d.mts b/deps/acorn/acorn/dist/acorn.d.mts index 35a4a2f295d6..38938a4b901f 100644 --- a/deps/acorn/acorn/dist/acorn.d.mts +++ b/deps/acorn/acorn/dist/acorn.d.mts @@ -693,6 +693,14 @@ export interface Options { */ locations?: boolean + /** + * Pass an optional `{line, column}` object to use for the start of + * the parse. This is mostly useful when using `parseExpressionAt` + * with `locations: true`, to prevent the parser from having to + * determine the line position at the start position. + */ + startLocation?: {line: number, column: number} + /** * a callback that will cause Acorn to call that export function with object in the same * format as tokens returned from `tokenizer().getToken()`. Note diff --git a/deps/acorn/acorn/dist/acorn.d.ts b/deps/acorn/acorn/dist/acorn.d.ts index 35a4a2f295d6..38938a4b901f 100644 --- a/deps/acorn/acorn/dist/acorn.d.ts +++ b/deps/acorn/acorn/dist/acorn.d.ts @@ -693,6 +693,14 @@ export interface Options { */ locations?: boolean + /** + * Pass an optional `{line, column}` object to use for the start of + * the parse. This is mostly useful when using `parseExpressionAt` + * with `locations: true`, to prevent the parser from having to + * determine the line position at the start position. + */ + startLocation?: {line: number, column: number} + /** * a callback that will cause Acorn to call that export function with object in the same * format as tokens returned from `tokenizer().getToken()`. Note diff --git a/deps/acorn/acorn/dist/acorn.js b/deps/acorn/acorn/dist/acorn.js index d7eba9029331..bcca94cd516c 100644 --- a/deps/acorn/acorn/dist/acorn.js +++ b/deps/acorn/acorn/dist/acorn.js @@ -386,6 +386,11 @@ // line being 1-based and column 0-based) will be attached to the // nodes. locations: false, + // Pass an optional `{line, column}` object to use for the start of + // the parse. This is mostly useful when using `parseExpressionAt` + // with `locations: true`, to prevent the parser from having to + // determine the line position at the start position. + startLocation: null, // A function can be passed as `onToken` option, which will // cause Acorn to call that function with object in the same // format as tokens returned from `tokenizer().getToken()`. Note @@ -539,13 +544,17 @@ // Set up token state // The current position of the tokenizer in the input. - if (startPos) { - this.pos = startPos; + this.pos = startPos || 0; + this.curLine = 1; + if (options.startLocation) { + this.lineStart = this.pos - options.startLocation.column; + this.curLine = options.startLocation.line; + } else if (startPos) { this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1; - this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length; + if (this.options.locations) + { this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length; } } else { - this.pos = this.lineStart = 0; - this.curLine = 1; + this.lineStart = 0; } // Properties of the current token: @@ -2888,7 +2897,7 @@ } } - if (!incDec && this.eat(types$1.starstar)) { + if (!incDec && !(expr.type === "ArrowFunctionExpression" && expr.start === startPos) && this.eat(types$1.starstar)) { if (sawUnary) { this.unexpected(this.lastTokStart); } else @@ -6258,7 +6267,7 @@ // [ghbt]: https://github.com/acornjs/acorn/issues - var version = "8.17.0"; + var version = "8.18.0"; Parser.acorn = { Parser: Parser, diff --git a/deps/acorn/acorn/dist/acorn.mjs b/deps/acorn/acorn/dist/acorn.mjs index 08a60c872f89..3f4fc2f4df98 100644 --- a/deps/acorn/acorn/dist/acorn.mjs +++ b/deps/acorn/acorn/dist/acorn.mjs @@ -380,6 +380,11 @@ var defaultOptions = { // line being 1-based and column 0-based) will be attached to the // nodes. locations: false, + // Pass an optional `{line, column}` object to use for the start of + // the parse. This is mostly useful when using `parseExpressionAt` + // with `locations: true`, to prevent the parser from having to + // determine the line position at the start position. + startLocation: null, // A function can be passed as `onToken` option, which will // cause Acorn to call that function with object in the same // format as tokens returned from `tokenizer().getToken()`. Note @@ -533,13 +538,17 @@ var Parser = function Parser(options, input, startPos) { // Set up token state // The current position of the tokenizer in the input. - if (startPos) { - this.pos = startPos; + this.pos = startPos || 0; + this.curLine = 1; + if (options.startLocation) { + this.lineStart = this.pos - options.startLocation.column; + this.curLine = options.startLocation.line; + } else if (startPos) { this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1; - this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length; + if (this.options.locations) + { this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length; } } else { - this.pos = this.lineStart = 0; - this.curLine = 1; + this.lineStart = 0; } // Properties of the current token: @@ -2882,7 +2891,7 @@ pp$5.parseMaybeUnary = function(refDestructuringErrors, sawUnary, incDec, forIni } } - if (!incDec && this.eat(types$1.starstar)) { + if (!incDec && !(expr.type === "ArrowFunctionExpression" && expr.start === startPos) && this.eat(types$1.starstar)) { if (sawUnary) { this.unexpected(this.lastTokStart); } else @@ -6252,7 +6261,7 @@ pp.readWord = function() { // [ghbt]: https://github.com/acornjs/acorn/issues -var version = "8.17.0"; +var version = "8.18.0"; Parser.acorn = { Parser: Parser, diff --git a/deps/acorn/acorn/package.json b/deps/acorn/acorn/package.json index 79846140ed3d..5b4a9766c3ec 100644 --- a/deps/acorn/acorn/package.json +++ b/deps/acorn/acorn/package.json @@ -16,7 +16,7 @@ ], "./package.json": "./package.json" }, - "version": "8.17.0", + "version": "8.18.0", "engines": { "node": ">=0.4.0" }, diff --git a/deps/ada/ada.cpp b/deps/ada/ada.cpp index 80bec6c67f31..fd558881bf05 100644 --- a/deps/ada/ada.cpp +++ b/deps/ada/ada.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2026-03-23 17:52:13 -0400. Do not edit! */ +/* auto-generated on 2026-07-27 16:10:09 -0400. Do not edit! */ /* begin file src/ada.cpp */ #include "ada.h" /* begin file src/checkers.cpp */ @@ -34,7 +34,7 @@ ada_really_inline constexpr bool is_ipv4(std::string_view view) noexcept { size_t last_dot = view.rfind('.'); if (last_dot != std::string_view::npos) { // We have at least one dot. - view = view.substr(last_dot + 1); + view.remove_prefix(last_dot + 1); } /** Optimization opportunity: we have basically identified the last number of the ipv4 if we return true here. We might as well parse it and have at @@ -110,6 +110,7 @@ ada_really_inline constexpr uint8_t path_signature( ada_really_inline constexpr bool verify_dns_length( std::string_view input) noexcept { + if (input.empty()) return false; if (input.back() == '.') { if (input.size() > 254) return false; } else if (input.size() > 253) @@ -129,6 +130,7 @@ ada_really_inline constexpr bool verify_dns_length( return true; } + } // namespace ada::checkers /* end file src/checkers.cpp */ /* begin file src/unicode.cpp */ @@ -136,10 +138,30 @@ ada_really_inline constexpr bool verify_dns_length( ADA_PUSH_DISABLE_ALL_WARNINGS /* begin file src/ada_idna.cpp */ -// NOLINTBEGIN: this is an auto-generated file -/* auto-generated on 2026-01-30 12:00:02 -0500. Do not edit! */ +/* auto-generated on 2026-07-12 20:34:08 -0400. Do not edit! */ /* begin file src/idna.cpp */ /* begin file src/unicode_transcoding.cpp */ +/* begin file include/ada/idna/unicode_transcoding.h */ +#ifndef ADA_IDNA_UNICODE_TRANSCODING_H +#define ADA_IDNA_UNICODE_TRANSCODING_H + +#include +#include + +namespace ada::idna { + +size_t utf8_to_utf32(const char* buf, size_t len, char32_t* utf32_output); + +size_t utf8_length_from_utf32(const char32_t* buf, size_t len); + +size_t utf32_length_from_utf8(const char* buf, size_t len); + +size_t utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output); + +} // namespace ada::idna + +#endif // ADA_IDNA_UNICODE_TRANSCODING_H +/* end file include/ada/idna/unicode_transcoding.h */ #include #include @@ -323,2496 +345,4791 @@ size_t utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output) { } // namespace ada::idna /* end file src/unicode_transcoding.cpp */ /* begin file src/mapping.cpp */ +/* begin file include/ada/idna/mapping.h */ +#ifndef ADA_IDNA_MAPPING_H +#define ADA_IDNA_MAPPING_H + +#include +#include + +namespace ada::idna { + +// If the input is ascii, then the mapping is just -> lower case. +void ascii_map(char* input, size_t length); +// Map the characters according to IDNA, returning the empty string on error. +std::u32string map(std::u32string_view input); +// Map into an existing buffer (cleared on entry). Returns false if any code +// point is disallowed. Reusing the buffer avoids repeated heap allocations +// when called in a loop over multiple labels. +bool map(std::u32string_view input, std::u32string& out); + +} // namespace ada::idna + +#endif +/* end file include/ada/idna/mapping.h */ -#include #include +#include +#include #include +/* begin file src/table_store.hpp */ +// Runtime store for compressed Unicode/IDNA tables. +// Large tables are DEFLATE-compressed (read-only) and expanded once on first +// use into a heap buffer so the working set does not bloat the on-disk binary. +// Hot-path lookups use the same O(1) multi-stage layout as the pre-compression +// code; compression only affects on-disk size and one-time init. +// +// Thread-safe without mutex: atomic CAS + spin-wait. ensure_tables() returns +// false if initialization fails (OOM, corrupt blob); callers must treat that +// as a hard error and not touch table pointers. + +/* begin file src/raw_inflate.hpp */ +// Minimal raw DEFLATE inflater (RFC 1951), enough for zlib raw streams. +// Returns number of output bytes written, or 0 on failure. +#include +#include + +namespace ada::idna::deflate { + +struct BitReader { + const uint8_t* p; + const uint8_t* end; + uint32_t acc = 0; + int bits = 0; + + explicit BitReader(const uint8_t* data, size_t len) + : p(data), end(data + len) {} + + bool ensure(int n) { + while (bits < n) { + if (p >= end) return false; + acc |= uint32_t(*p++) << bits; + bits += 8; + } + return true; + } + uint32_t get(int n) { + if (!ensure(n)) return UINT32_MAX; + uint32_t v = acc & ((1u << n) - 1); + acc >>= n; + bits -= n; + return v; + } + void align_byte() { + acc >>= (bits & 7); + bits -= (bits & 7); + } +}; + +struct Huff { + // canonical codes: for each length, list of symbols + // Fast path: table for codes up to max_bits + static constexpr int MAXBITS = 15; + uint8_t lengths[288]{}; + int counts[MAXBITS + 1]{}; + int first_code[MAXBITS + 1]{}; + int16_t symbols[288]{}; + int nsymbols = 0; + int max_bits = 0; + + // Base index into symbols[] for each code length (used by decode). + int base_idx[MAXBITS + 1]{}; + + bool build(const uint8_t* lens, int n) { + std::memset(counts, 0, sizeof(counts)); + std::memset(first_code, 0, sizeof(first_code)); + std::memset(base_idx, 0, sizeof(base_idx)); + nsymbols = n; + max_bits = 0; + for (int i = 0; i < n; i++) { + lengths[i] = lens[i]; + if (lens[i]) { + counts[lens[i]]++; + if (lens[i] > max_bits) max_bits = lens[i]; + } + } + // Canonical first code for each bit length (RFC 1951). + int code = 0; + for (int bits = 1; bits <= MAXBITS; bits++) { + code = (code + counts[bits - 1]) << 1; + first_code[bits] = code; + } + int idx = 0; + for (int bits = 1; bits <= max_bits; bits++) { + base_idx[bits] = idx; + // assign symbols in symbol order for codes of this length + for (int sym = 0; sym < n; sym++) { + if (lengths[sym] == bits) { + symbols[idx++] = static_cast(sym); + } + } + } + return true; + } + + int decode(BitReader& br) const { + if (max_bits == 0) return -1; + int code = 0; + for (int len = 1; len <= max_bits; len++) { + uint32_t b = br.get(1); + if (b == UINT32_MAX) return -1; + code = (code << 1) | int(b); + int first = first_code[len]; + int cnt = counts[len]; + if (cnt && code - first < cnt) { + return symbols[base_idx[len] + (code - first)]; + } + } + return -1; + } +}; + +// Fixed Huffman tables are built once at dynamic initialization (before main / +// single-threaded), so concurrent first-use of inflate cannot race. +inline Huff make_fixed_litlen_huff() { + Huff h; + uint8_t lens[288]; + // Fixed Huffman: 0-143:8, 144-255:9, 256-279:7, 280-287:8 + for (int i = 0; i <= 143; i++) lens[i] = 8; + for (int i = 144; i <= 255; i++) lens[i] = 9; + for (int i = 256; i <= 279; i++) lens[i] = 7; + for (int i = 280; i <= 287; i++) lens[i] = 8; + h.build(lens, 288); + return h; +} + +inline Huff make_fixed_dist_huff() { + Huff h; + uint8_t lens[32]; + for (int i = 0; i < 32; i++) lens[i] = 5; + h.build(lens, 32); + return h; +} + +// NOLINTNEXTLINE(cert-err58-cpp) -- intentional process-lifetime tables +inline const Huff kFixedLitLenHuff = make_fixed_litlen_huff(); +// NOLINTNEXTLINE(cert-err58-cpp) +inline const Huff kFixedDistHuff = make_fixed_dist_huff(); + +inline int fixed_litlen(BitReader& br) { return kFixedLitLenHuff.decode(br); } + +inline int fixed_dist(BitReader& br) { return kFixedDistHuff.decode(br); } + +// length and distance base tables +static const uint16_t len_base[29] = { + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, + 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258}; +static const uint8_t len_extra[29] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 5, 5, 5, 5, 0}; +static const uint16_t dist_base[30] = { + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, + 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, + 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; +static const uint8_t dist_extra[30] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, + 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, + 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; + +inline size_t inflate_raw(const uint8_t* src, size_t src_len, uint8_t* dst, + size_t dst_cap) { + BitReader br(src, src_len); + size_t out = 0; + for (;;) { + uint32_t bfinal = br.get(1); + uint32_t btype = br.get(2); + if (bfinal == UINT32_MAX || btype == UINT32_MAX) return 0; + if (btype == 0) { + // stored + br.align_byte(); + if (!br.ensure(16)) return 0; + // read 16+16 from bit buffer awkwardly - use byte path + // Align: bits is multiple of 8 + // Get len from remaining bits then bytes + uint32_t len = br.get(16); + uint32_t nlen = br.get(16); + if (len == UINT32_MAX || nlen == UINT32_MAX) return 0; + if ((len ^ 0xFFFF) != nlen) return 0; + // After get, may have bits in acc from previous - for stored, should be + // byte aligned Copy len bytes from p + if (br.bits != 0) { + // leftover bits should be 0 if aligned + } + if (size_t(br.end - br.p) < len) return 0; + if (out + len > dst_cap) return 0; + std::memcpy(dst + out, br.p, len); + br.p += len; + out += len; + } else if (btype == 1 || btype == 2) { + Huff lit, dist; + if (btype == 1) { + // use fixed via functions + } else { + // dynamic + uint32_t hlit = br.get(5); + if (hlit == UINT32_MAX) return 0; + hlit += 257; + uint32_t hdist = br.get(5); + if (hdist == UINT32_MAX) return 0; + hdist += 1; + uint32_t hclen = br.get(4); + if (hclen == UINT32_MAX) return 0; + hclen += 4; + static const int order[19] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, + 11, 4, 12, 3, 13, 2, 14, 1, 15}; + uint8_t clen[19]{}; + for (uint32_t i = 0; i < hclen; i++) { + uint32_t v = br.get(3); + if (v == UINT32_MAX) return 0; + clen[order[i]] = uint8_t(v); + } + Huff cl; + if (!cl.build(clen, 19)) return 0; + uint8_t lens[288 + 32]{}; + uint32_t n = hlit + hdist; + for (uint32_t i = 0; i < n;) { + int sym = cl.decode(br); + if (sym < 0) return 0; + if (sym < 16) { + lens[i++] = uint8_t(sym); + } else if (sym == 16) { + uint32_t rep = br.get(2); + if (rep == UINT32_MAX) return 0; + rep += 3; + if (i == 0) return 0; + uint8_t v = lens[i - 1]; + while (rep--) lens[i++] = v; + } else if (sym == 17) { + uint32_t rep = br.get(3); + if (rep == UINT32_MAX) return 0; + rep += 3; + while (rep--) lens[i++] = 0; + } else if (sym == 18) { + uint32_t rep = br.get(7); + if (rep == UINT32_MAX) return 0; + rep += 11; + while (rep--) lens[i++] = 0; + } else + return 0; + } + if (!lit.build(lens, int(hlit))) return 0; + if (!dist.build(lens + hlit, int(hdist))) return 0; + } + for (;;) { + int sym; + if (btype == 1) + sym = fixed_litlen(br); + else + sym = lit.decode(br); + if (sym < 0) return 0; + if (sym < 256) { + if (out >= dst_cap) return 0; + dst[out++] = uint8_t(sym); + } else if (sym == 256) { + break; + } else { + int len_code = sym - 257; + if (len_code < 0 || len_code > 28) return 0; + uint32_t extra = br.get(len_extra[len_code]); + if (len_extra[len_code] && extra == UINT32_MAX) return 0; + uint32_t length = + len_base[len_code] + (len_extra[len_code] ? extra : 0); + int dsym; + if (btype == 1) + dsym = fixed_dist(br); + else + dsym = dist.decode(br); + if (dsym < 0 || dsym > 29) return 0; + uint32_t dextra = br.get(dist_extra[dsym]); + if (dist_extra[dsym] && dextra == UINT32_MAX) return 0; + uint32_t distance = dist_base[dsym] + (dist_extra[dsym] ? dextra : 0); + if (distance > out || out + length > dst_cap) return 0; + for (uint32_t k = 0; k < length; k++) { + dst[out] = dst[out - distance]; + out++; + } + } + } + } else { + return 0; // reserved + } + if (bfinal) break; + } + return out; +} + +} // namespace ada::idna::deflate +/* end file src/raw_inflate.hpp */ +/* begin file src/table_blob.inc */ +// Auto-generated by scripts/pack_tables.py - do not edit. +// Compressed Unicode/IDNA tables (raw DEFLATE). +// clang-format off +#ifndef ADA_IDNA_TABLE_BLOB_H +#define ADA_IDNA_TABLE_BLOB_H +#include +#include +namespace ada::idna::table_blob { +constexpr size_t uncompressed_size = 224608; +constexpr size_t compressed_size = 62377; +constexpr uint32_t uncompressed_crc32 = 0x6F4A6B2Eu; +constexpr size_t decomposition_block_rows = 67; +constexpr size_t decomposition_block_cols = 257; +constexpr size_t ccc_block_rows = 67; +constexpr size_t ccc_block_cols = 256; +constexpr size_t composition_block_rows = 67; +constexpr size_t composition_block_cols = 257; +constexpr size_t id_continue_count = 1418; +constexpr size_t id_start_count = 776; +constexpr size_t dir_table_count = 1449; +constexpr size_t combining_range_count = 290; +// Offsets into the decompressed buffer: +constexpr size_t off_idna_stage1 = 0; +constexpr size_t count_idna_stage1 = 3282; +constexpr size_t off_idna_stage2 = 6564; +constexpr size_t count_idna_stage2 = 11456; +constexpr size_t off_idna_bool_blocks = 29480; +constexpr size_t count_idna_bool_blocks = 225; +constexpr size_t off_idna_utf8_mappings = 31280; +constexpr size_t count_idna_utf8_mappings = 17383; +constexpr size_t off_decomposition_index = 48663; +constexpr size_t count_decomposition_index = 4352; +constexpr size_t off_decomposition_block = 53016; +constexpr size_t count_decomposition_block = 17219; +constexpr size_t off_decomposition_data = 87456; +constexpr size_t count_decomposition_data = 9102; +constexpr size_t off_ccc_index = 123864; +constexpr size_t count_ccc_index = 4352; +constexpr size_t off_ccc_block = 128216; +constexpr size_t count_ccc_block = 17152; +constexpr size_t off_composition_index = 145368; +constexpr size_t count_composition_index = 4352; +constexpr size_t off_composition_block = 149720; +constexpr size_t count_composition_block = 17219; +constexpr size_t off_composition_data = 184160; +constexpr size_t count_composition_data = 1883; +constexpr size_t off_id_continue_flat = 191692; +constexpr size_t count_id_continue_flat = 2836; +constexpr size_t off_id_start_flat = 203036; +constexpr size_t count_id_start_flat = 1552; +constexpr size_t off_dir_start = 209244; +constexpr size_t count_dir_start = 1449; +constexpr size_t off_dir_final = 215040; +constexpr size_t count_dir_final = 1449; +constexpr size_t off_dir_value = 220836; +constexpr size_t count_dir_value = 1449; +constexpr size_t off_combining_flat = 222288; +constexpr size_t count_combining_flat = 580; +alignas(8) inline constexpr uint8_t compressed[] = { +0xec,0x9c,0x09,0x40,0x53,0xc7,0xda,0xfe,0x5f,0x08,0x98,0x28,0x4b,0x4c,0xc2,0x12, +0x14,0x09,0x12,0x42,0x12,0x76,0x12,0x20,0xec,0x09,0xd0,0xdd,0x56,0xdb,0xda,0xdd, +0x5b,0x5b,0x97,0x6a,0xdd,0xad,0xb6,0xda,0xc5,0x96,0x23,0xbb,0xa2,0xe0,0xbe,0xb0, +0x8a,0xa8,0xa8,0x88,0x08,0xa8,0xec,0xcb,0x2d,0x2a,0x62,0xad,0x88,0xa8,0xdd,0xeb, +0x56,0x36,0x6d,0x6b,0x5b,0xdb,0xda,0xd6,0x96,0xfc,0x9f,0x73,0x12,0xd4,0xb6,0xf6, +0xb6,0xb7,0xcb,0xfd,0xbe,0xfb,0xfd,0x9b,0xe1,0x37,0x33,0xe7,0x9c,0x99,0x79,0xde, +0x79,0xcf,0x9c,0x73,0x66,0x4e,0x00,0x62,0x88,0x0c,0xc4,0x50,0x33,0x91,0x85,0xc1, +0x82,0xb1,0x68,0xb6,0x20,0x4b,0x83,0x25,0x63,0x49,0x4c,0xb3,0x25,0xf1,0x0c,0x3c, +0x86,0xd7,0xcc,0x23,0x2b,0x83,0x15,0x63,0xd5,0x6c,0x45,0xd6,0x16,0x8c,0x25,0x63, +0xb0,0x26,0x86,0xc7,0x58,0x31,0xd6,0xcc,0x20,0x86,0xcf,0x08,0x98,0xc1,0xcc,0x10, +0xc6,0x86,0x21,0x86,0xb1,0xb6,0x65,0x9a,0xad,0x69,0x90,0x61,0x90,0x1d,0x63,0xcf, +0x08,0x19,0x66,0xd0,0x50,0x46,0xc4,0x88,0x19,0x09,0xe3,0xc0,0x38,0x32,0x4e,0x8c, +0x33,0x23,0x65,0x5c,0x98,0xe6,0x41,0xc3,0x18,0xe2,0x1b,0xf8,0x0c,0xbf,0x99,0x4f, +0x82,0xe1,0xa8,0x47,0x8c,0x41,0xc0,0x08,0xa0,0x27,0x20,0x6e,0xcb,0x95,0x19,0xc1, +0xb8,0x31,0x32,0xc6,0x9d,0x19,0xc9,0xd0,0x60,0xd3,0xbe,0x1f,0x07,0x0f,0x46,0xce, +0x78,0x32,0x0a,0xc6,0x30,0xd8,0x8b,0x61,0x06,0xcb,0x19,0x25,0xa3,0x62,0xd4,0x8c, +0x37,0xe3,0xc3,0xf8,0x32,0x7e,0x8c,0x3f,0x13,0xc0,0x04,0xa2,0x54,0x10,0xd0,0x30, +0x5a,0x26,0x98,0x69,0x1e,0x1c,0xc2,0xd0,0x10,0xc3,0x10,0x66,0x08,0x54,0x86,0x90, +0x8d,0xc1,0x86,0xb1,0x69,0xb6,0x21,0x5b,0x83,0x2d,0x63,0xdb,0x6c,0x4b,0x76,0x06, +0xbb,0x50,0x86,0xb1,0x6b,0xb6,0x23,0x7b,0xd8,0x62,0x6f,0xd2,0x60,0xcc,0xa9,0x8e, +0x69,0xb6,0x27,0xa1,0x41,0x78,0x2b,0x3b,0x6e,0x15,0x18,0x61,0x33,0x5b,0x76,0x28, +0x31,0x61,0xa6,0xbe,0x0d,0x65,0x86,0x36,0x0f,0x25,0x51,0x38,0x63,0x10,0x45,0x30, +0x91,0xd8,0x13,0xc5,0x30,0xa2,0x66,0x11,0x89,0x0d,0x62,0x46,0xdc,0x2c,0x26,0x49, +0x34,0x63,0x90,0x30,0x92,0x66,0x09,0x39,0x18,0x1c,0x62,0x18,0xc6,0xa1,0xd9,0x81, +0x1c,0x0d,0x8e,0x8c,0x63,0xb3,0x23,0x39,0x19,0x9c,0x7e,0xab,0xee,0xdf,0xe1,0xef, +0xf0,0x77,0xf8,0x6b,0x82,0x9e,0x31,0x5c,0xcf,0xc7,0x32,0x8c,0x53,0xb3,0x53,0x1c, +0x43,0xce,0x06,0x67,0xc6,0xb9,0xd9,0x39,0x9e,0x41,0x9e,0xb9,0x0d,0xdc,0x0e,0xee, +0x60,0xee,0x64,0xee,0x42,0x7a,0x37,0x73,0x0f,0x43,0x52,0x83,0x74,0xd4,0xdf,0xde, +0xfb,0x0b,0xc3,0xbd,0xcc,0x7d,0xcc,0xe8,0xbf,0x03,0x17,0x18,0x69,0xb3,0x94,0x5c, +0x0c,0x2e,0x8c,0x4b,0xb3,0x0b,0x0d,0x33,0x0c,0x63,0x86,0x35,0x0f,0xa3,0xe1,0x86, +0xe1,0xcc,0xf0,0xe6,0xe1,0xe4,0x6a,0x70,0x65,0x5c,0x9b,0x5d,0x69,0x84,0x61,0x04, +0x33,0xa2,0x79,0x04,0xb9,0x19,0xdc,0x18,0xb7,0x66,0x37,0x92,0x19,0x64,0x63,0x98, +0xfb,0xe1,0xc9,0x07,0x98,0x07,0x11,0x8f,0x65,0x1e,0xe2,0xda,0x7a,0x98,0x79,0x84, +0x79,0x94,0x79,0x8c,0x79,0x9c,0x79,0x82,0x61,0x64,0x78,0x66,0xca,0xc8,0x7d,0x1c, +0x63,0x70,0x67,0xdc,0xff,0x71,0xdd,0xf7,0x77,0x32,0x4f,0x32,0xcd,0xee,0xa3,0x99, +0xf1,0xcc,0x53,0xcc,0xd3,0xcc,0x04,0x66,0x22,0x33,0x89,0x99,0xcc,0x3c,0xc3,0x4c, +0x61,0xa6,0x32,0xcf,0x32,0xd3,0x98,0xe9,0xcc,0x0c,0x66,0x26,0xda,0x22,0x66,0x16, +0x43,0x23,0x67,0x33,0x73,0x18,0xc3,0xc8,0xb9,0x5c,0xeb,0xcf,0x31,0xf3,0x98,0xf9, +0xcc,0x38,0xe6,0x79,0xe6,0x05,0x66,0x01,0x8e,0x2f,0x64,0x5e,0x64,0x5e,0x62,0x5e, +0x66,0x5e,0x41,0x7e,0x11,0xf3,0x2a,0xf3,0x1a,0x93,0xc0,0x30,0xcc,0x62,0x26,0x91, +0x49,0x62,0x92,0xb1,0x2f,0x05,0xa4,0x72,0x35,0xd3,0xf0,0xec,0x24,0x26,0x9d,0x59, +0xc2,0x2c,0x65,0x32,0x98,0x65,0xdc,0xbe,0xe5,0x6c,0xdf,0x47,0x66,0x32,0x59,0xcc, +0x0a,0x66,0x25,0xb3,0x0a,0xc7,0x57,0x33,0x6b,0x30,0x3f,0x58,0xcb,0xac,0xc3,0x91, +0xf5,0xcc,0x06,0x66,0x23,0x93,0x8d,0x5c,0x0e,0x93,0xcb,0xe4,0x31,0xf9,0x66,0x6f, +0x15,0x30,0x9b,0x98,0x42,0x66,0x33,0x53,0xf4,0x2f,0xc7,0xd7,0x24,0xce,0xfe,0x2d, +0xe6,0xad,0xad,0x7f,0xfa,0x39,0xdb,0xc6,0x14,0xff,0xea,0x18,0xdf,0xce,0xec,0xf8, +0x1f,0xbc,0xc2,0x1e,0xb8,0xc5,0xbe,0x65,0xff,0x27,0xaf,0x9f,0x25,0xbf,0xb3,0xde, +0x4f,0xbd,0x23,0x67,0x76,0x32,0x25,0xcc,0x2e,0xe4,0x4a,0x99,0xdd,0xb7,0x54,0x68, +0x1e,0x49,0x1e,0x65,0x38,0xbe,0x87,0x29,0x67,0x2a,0xfe,0x3f,0xb9,0x53,0x57,0x32, +0x7b,0x39,0x5f,0x15,0xff,0x7d,0xa7,0xfe,0x51,0xd8,0x77,0xdd,0x43,0xfb,0x99,0xaa, +0x9b,0xfc,0xb5,0xfc,0x4f,0x53,0x20,0xa6,0x9a,0x31,0x78,0xfc,0xcf,0xf5,0xd0,0xbc, +0x2a,0xf2,0xb8,0x79,0x34,0xd4,0x30,0xb5,0x4c,0x1d,0x37,0xa7,0xda,0x6a,0xde,0xa3, +0x62,0xea,0x99,0x66,0x0f,0x92,0x1b,0xe4,0xc4,0x34,0xa0,0x56,0x23,0xf6,0x35,0x99, +0x9e,0x6b,0xf2,0x66,0x39,0x79,0x1a,0x3c,0x19,0xcf,0x66,0x4f,0x52,0x18,0x14,0x8c, +0xa2,0x59,0x41,0x5e,0x06,0x2f,0xc6,0xab,0xd9,0x8b,0x94,0x06,0xe5,0xad,0x46,0x5b, +0xf3,0x6f,0xb0,0xeb,0x9f,0x03,0xcf,0x4d,0x65,0xb3,0xf2,0x75,0xa4,0x2d,0xcc,0x81, +0xeb,0xc7,0x0e,0x32,0x87,0x7e,0x52,0xba,0xd5,0x9c,0x1e,0x36,0xa7,0x6d,0xe6,0xf4, +0x88,0x59,0xf1,0x0d,0x86,0x54,0x47,0x7f,0x41,0xe9,0x4d,0xe6,0x18,0xe2,0x76,0xf3, +0x96,0x41,0xc5,0xa8,0x9a,0x55,0xc7,0xaf,0x1f,0xf5,0x41,0xed,0x0e,0xe6,0x04,0x43, +0x6a,0x83,0x9a,0x51,0x77,0x32,0xcd,0x6a,0xf2,0xbe,0xd5,0x7d,0xe5,0xc7,0xe1,0xa4, +0x39,0x3d,0xc5,0x9c,0x66,0xde,0x62,0xde,0x66,0xde,0xb9,0xe9,0xd8,0xbb,0xcc,0x7b, +0xcc,0xfb,0x5c,0xee,0x03,0xc6,0xe0,0xfd,0xef,0xde,0xbf,0xfe,0x0e,0x7f,0x87,0xbf, +0xc3,0xdf,0xe1,0xef,0xf0,0xaf,0xc2,0xb3,0xff,0x6b,0x2c,0xf9,0xf0,0xbf,0xd0,0x7b, +0x75,0xff,0xdf,0x8c,0x93,0x33,0xb7,0xd8,0x17,0xf5,0xe7,0xae,0xfb,0xbd,0x9b,0xbd, +0xc9,0xc7,0xe0,0xc3,0xf8,0x34,0xfb,0x90,0xaf,0xc1,0x97,0xf1,0xfd,0x63,0xeb,0x97, +0xff,0x3d,0xe1,0xec,0xdf,0xf7,0x19,0x2e,0x2c,0x61,0x8c,0x46,0x0b,0xe2,0x91,0x35, +0xf1,0x69,0x30,0xd9,0x90,0x1d,0x09,0x49,0x44,0x12,0x72,0x24,0x67,0x72,0xa1,0xe1, +0x34,0x82,0x64,0x34,0x92,0xe4,0xa4,0x20,0x25,0xa9,0xc9,0x87,0xfc,0x28,0x80,0x82, +0x48,0x4b,0xc6,0x3f,0xed,0xd3,0xff,0x07,0x43,0xc8,0x4f,0x6c,0xd1,0x11,0xdb,0x23, +0x36,0x47,0x88,0x23,0xb9,0x9c,0x9e,0x62,0x29,0x9e,0xee,0xe4,0xf2,0xf7,0xd0,0x68, +0xf4,0xca,0x68,0xbc,0x9f,0x1e,0xa1,0x7f,0x20,0x9d,0x48,0xcf,0xd0,0xb3,0x34,0x83, +0x66,0xd3,0x73,0xf4,0x3c,0x2d,0xa4,0x97,0xe9,0x55,0x38,0x26,0x89,0x52,0x69,0x09, +0x2d,0xa3,0x2c,0x5a,0x45,0x6b,0x69,0x03,0xe5,0x50,0x3e,0x15,0xd2,0x16,0x94,0x2f, +0xa6,0x9d,0x54,0x4a,0x7b,0xa8,0x92,0xf6,0x53,0xcd,0x9f,0xe0,0x87,0x7a,0xb4,0xd1, +0x04,0x5e,0x07,0x07,0xc1,0x61,0xf0,0x06,0x38,0x06,0x3a,0xc0,0x49,0xf0,0x16,0x78, +0x17,0x7c,0x00,0xce,0x82,0x0b,0xa0,0x1b,0xf4,0x81,0x8f,0xc1,0x65,0xf0,0x05,0xf8, +0x0a,0x7c,0x03,0xae,0x81,0x7e,0xd6,0x0f,0x16,0x46,0xa3,0x15,0x10,0x58,0x08,0x2c, +0x6c,0x90,0xda,0x5b,0xb0,0x8a,0x22,0xc4,0x0e,0xc0,0x19,0x0c,0xb3,0x18,0x66,0xe1, +0x86,0x74,0x24,0xf0,0x04,0x4a,0xe0,0x6d,0xe1,0x8f,0x38,0x08,0x04,0x03,0x1d,0x88, +0x00,0xd1,0xc0,0x00,0xe2,0xc1,0x1d,0xe0,0x6e,0x70,0x2f,0x18,0x03,0x1e,0x04,0x0f, +0x83,0xc7,0xc0,0x38,0x30,0x1e,0x4c,0x00,0x93,0xc1,0x54,0x30,0x1d,0xcc,0x02,0x73, +0xc1,0x7c,0x8b,0x05,0x88,0x5f,0x02,0x8b,0x80,0x02,0x56,0x26,0x58,0x24,0x22,0x97, +0x02,0xd2,0x2d,0x32,0x10,0x67,0x5a,0xac,0xb4,0x58,0xc3,0x59,0xba,0xde,0x22,0xdb, +0x22,0xcf,0x62,0x13,0xf2,0x45,0x16,0xdb,0x10,0xef,0xb0,0xd8,0x65,0x51,0x66,0x61, +0xf2,0x5b,0x85,0xc5,0x3e,0xe4,0xaa,0x2d,0xea,0x10,0x37,0x82,0x7f,0x82,0x03,0x16, +0xad,0x88,0x8f,0x70,0x25,0xde,0x44,0x7c,0xdc,0xa2,0x13,0xf1,0x69,0x8b,0x77,0x2c, +0xde,0x47,0x7a,0x06,0x9c,0xb7,0xe8,0x32,0xd7,0xef,0xb5,0xf8,0xf1,0x79,0xb8,0x64, +0xc1,0x86,0xcb,0x5c,0xf8,0x82,0x0b,0x5f,0xa1,0xc4,0x37,0xe0,0x1a,0xe8,0x07,0x16, +0x96,0xf0,0x26,0xe0,0x83,0x21,0x96,0x6c,0x1d,0x3b,0xc4,0x43,0x81,0x04,0x38,0x01, +0x17,0xe0,0x0a,0x64,0xc0,0x03,0x28,0xb8,0x52,0x2a,0x4b,0x36,0xf8,0x20,0xef,0x6f, +0x19,0x64,0x19,0x8c,0x54,0x07,0x22,0x40,0x34,0x30,0x80,0x78,0x70,0x07,0xb8,0x1b, +0xdc,0x0b,0xc6,0x80,0x07,0xc1,0xc3,0xe0,0x31,0x30,0x0e,0x8c,0x07,0x13,0xc0,0x64, +0x30,0x15,0x4c,0x07,0xb3,0xc0,0x5c,0x30,0x1f,0x2c,0x00,0x2f,0x81,0x45,0x20,0x01, +0x24,0x82,0x14,0x90,0x0e,0x32,0x2c,0x7f,0xdc,0xd7,0x4c,0xcb,0x55,0xd8,0xb3,0xd6, +0x72,0x03,0xb7,0x3f,0x17,0x71,0x81,0xe5,0x66,0xcb,0xad,0x96,0xdb,0x91,0x2b,0x01, +0xbb,0x41,0x39,0xd8,0x6b,0x69,0xfc,0xaf,0xff,0x08,0xa9,0xca,0x52,0x82,0x3b,0x58, +0xad,0x65,0x83,0x65,0xb3,0xa5,0x1f,0xee,0x5e,0x7f,0xac,0xbd,0x16,0xcb,0x56,0xcb, +0x37,0x2c,0xdb,0x2d,0x3b,0x2d,0xdf,0xe2,0xbc,0xb3,0xcd,0xc2,0x19,0x77,0xc7,0x00, +0x7a,0xef,0x77,0xfa,0xea,0x43,0xcb,0x73,0xa8,0xf9,0x91,0x65,0x8f,0xe5,0xc7,0xb7, +0x68,0x81,0xfe,0xf0,0x1d,0xe6,0x32,0x5a,0xfd,0x02,0x7c,0x05,0xbe,0xb1,0x34,0xdd, +0x6f,0xaf,0x0d,0x28,0x59,0x5a,0xf0,0x06,0xee,0xa3,0xf1,0x64,0xc5,0x1b,0xc2,0xb3, +0xe3,0x0d,0xe5,0x49,0x78,0x4e,0xd8,0xeb,0x02,0x5c,0x79,0x32,0x1e,0x46,0x32,0x4f, +0xc1,0x53,0xf1,0x7c,0x78,0xfe,0xbc,0x20,0x5e,0x30,0x4f,0xc7,0xfb,0xd8,0x32,0x82, +0x17,0xcd,0xbb,0x93,0x0c,0xbc,0x78,0xde,0x1d,0xbc,0xbb,0x79,0xf7,0xa2,0xe4,0x18, +0xde,0x83,0xbc,0x87,0x79,0x8f,0xf1,0xc6,0xf1,0xc6,0xf3,0x26,0xf0,0x26,0xf3,0xa6, +0xf2,0xfe,0x9c,0xb3,0x37,0x1d,0xda,0x3a,0xb4,0xec,0x8a,0x16,0x1f,0x83,0x16,0xc6, +0x3c,0x98,0x0b,0xe6,0x83,0x05,0xe0,0x25,0xb0,0x08,0x24,0x80,0x44,0x90,0x02,0xd2, +0x41,0x06,0xc8,0x04,0x11,0xb0,0x6f,0x0c,0x52,0x1d,0xec,0x37,0x1a,0x57,0x82,0x31, +0xbc,0x35,0x9c,0x75,0xeb,0x79,0xd9,0xbc,0x3c,0xde,0x26,0x5e,0x11,0x6f,0x1b,0x6f, +0x07,0x6f,0x17,0xaf,0x8c,0x57,0xc1,0xdb,0xc7,0xab,0xe6,0xd5,0xf1,0x1a,0x79,0xff, +0xe4,0x1d,0xe0,0xb5,0xf2,0x8e,0xf0,0xde,0xe4,0x1d,0xe7,0x75,0xf2,0x4e,0xf3,0xde, +0xe1,0xbd,0xcf,0x3b,0xc3,0x3b,0xcf,0xeb,0xe2,0xf5,0xf2,0x2e,0xf1,0x3e,0xe5,0x7d, +0xce,0xfb,0x92,0x77,0x95,0xf7,0x1d,0xef,0x07,0x1e,0xdc,0x66,0x35,0xc8,0x6a,0xb0, +0x95,0xad,0x95,0xd0,0x4a,0x6c,0xe5,0x68,0x25,0xb5,0x1a,0x6e,0xe5,0x66,0x35,0xd2, +0xca,0xd3,0x4a,0x69,0xe5,0x6d,0xe5,0x67,0xf5,0x57,0x8f,0xef,0x40,0x28,0x68,0x41, +0x28,0x08,0x07,0x51,0x40,0x0f,0xe2,0xc0,0xed,0xe0,0x2e,0x30,0x0a,0x8c,0x06,0x0f, +0x80,0x87,0xc0,0xa3,0xe0,0x09,0xf0,0x24,0x78,0xfa,0x16,0x16,0x4e,0xc2,0xbe,0x29, +0x60,0x1a,0x98,0x09,0xe6,0x80,0x79,0xe0,0x05,0xf0,0x22,0x78,0x05,0xbc,0x06,0x16, +0x83,0x64,0x90,0x06,0x96,0x82,0xe5,0x60,0x05,0x58,0x0d,0xd6,0x81,0x8d,0x20,0x17, +0x14,0x80,0xcd,0x60,0x2b,0xd8,0x0e,0x4a,0xc0,0x6e,0x50,0x0e,0xf6,0x5a,0x55,0x21, +0xae,0x05,0x0d,0xa0,0x19,0xb4,0x80,0x43,0xa0,0x8d,0xb3,0xec,0x28,0xe2,0x76,0x70, +0x02,0x9c,0x02,0x6f,0x83,0xf7,0xc0,0x87,0xe0,0x1c,0xf8,0x08,0xf4,0x80,0x8b,0xe0, +0x13,0xf0,0x19,0xb8,0x02,0xbe,0x06,0xdf,0x82,0xef,0xd9,0x56,0x80,0xa5,0xb5,0xd1, +0x68,0x0d,0x04,0xc0,0x06,0xd8,0x03,0x11,0x70,0x00,0xce,0x60,0x18,0x18,0x01,0xdc, +0x81,0x1c,0x78,0x01,0x35,0xf0,0x05,0x01,0x40,0x03,0x42,0x40,0x18,0x88,0x04,0x31, +0x20,0x16,0xdc,0x06,0xee,0x04,0xf7,0x80,0xfb,0xc0,0xfd,0x60,0x2c,0x78,0x04,0x3c, +0x6e,0xcd,0x5e,0x6f,0xff,0xb0,0x7e,0xca,0x7a,0xa2,0xf5,0x33,0xd6,0xcf,0x5a,0xcf, +0xb0,0x9e,0x6d,0xfd,0x9c,0xf5,0xf3,0xd6,0x0b,0xad,0x5f,0xb6,0x7e,0xd5,0x9a,0xb1, +0x4e,0xb2,0x4e,0xb5,0x5e,0x62,0xbd,0xcc,0x3a,0xcb,0x7a,0x95,0xf5,0x5a,0xeb,0x0d, +0xd6,0x39,0xd6,0xf9,0xd6,0x85,0xd6,0x5b,0xac,0x8b,0xad,0x77,0x5a,0x97,0x5a,0xef, +0xb1,0xae,0xb4,0xde,0x6f,0x5d,0x63,0x5d,0x6f,0xdd,0x64,0xfd,0xba,0xf5,0x41,0xeb, +0xc3,0xd6,0x6f,0x58,0xb3,0x57,0xea,0x5f,0xf9,0x39,0x66,0x7d,0x63,0x56,0x36,0x90, +0xfb,0xbf,0xf2,0xe9,0xb4,0x7e,0xdb,0xfa,0x03,0xeb,0xf3,0xd6,0x7f,0xac,0x95,0x1e, +0xeb,0x4f,0xad,0xbf,0xb2,0xfe,0xde,0x9a,0x37,0x68,0xc8,0x20,0xd1,0x20,0xe9,0xa0, +0x3f,0x77,0x26,0xfc,0x63,0xdf,0xff,0x7c,0x76,0x7c,0x63,0x8f,0x6c,0x90,0xd7,0xa0, +0x7e,0xa3,0xdf,0xa0,0x9f,0xd6,0xfe,0x7d,0x9a,0x3f,0x3d,0xcf,0x37,0xf4,0xfe,0xfd, +0x96,0xfb,0x6f,0xb1,0x1d,0x3c,0x88,0x8d,0x23,0x07,0xdd,0xdc,0x62,0xff,0xaf,0xea, +0xfd,0xb4,0xcf,0xa6,0x10,0x37,0xe8,0xee,0x41,0xf7,0x0f,0x62,0xf7,0x3e,0x3a,0xe8, +0xa7,0xde,0xf9,0xf7,0x57,0x1b,0xff,0xca,0xff,0xb7,0x2a,0x39,0xb0,0x35,0x7e,0xd0, +0x33,0x83,0xfa,0x6f,0xe9,0xc9,0xdf,0x6f,0xc1,0x5f,0xf7,0x99,0x39,0xc8,0xf8,0x0b, +0xe7,0xb7,0xff,0xfa,0x39,0xea,0xff,0x17,0xe7,0xf0,0xb7,0x9d,0xf5,0x5f,0xae,0x35, +0x7f,0xd0,0xbf,0x1e,0x7d,0xbf,0xd4,0x42,0xff,0x2f,0xfa,0xf0,0xe5,0x41,0x8b,0x07, +0xfd,0x19,0xeb,0xc7,0x5f,0xfa,0xa4,0x0f,0xfa,0x4f,0xde,0x9b,0x96,0x0d,0xfa,0x79, +0x8f,0x57,0x5f,0xdf,0x97,0x7d,0x3d,0x57,0x78,0x3d,0xb7,0xfd,0x17,0xed,0x2b,0x1b, +0xf4,0xf3,0x6b,0x6a,0x3f,0xf6,0x35,0x0c,0x3a,0x30,0xe8,0x8d,0x41,0xa7,0x06,0xbd, +0xff,0x93,0x9a,0xdd,0xbf,0xa1,0xa7,0x9f,0xdc,0xc2,0xbe,0x2f,0xaf,0xef,0xbb,0x76, +0x3d,0x67,0xc9,0x1f,0xc8,0x0d,0xe6,0xff,0x52,0x5b,0x43,0xf9,0x7f,0xe6,0x93,0xc5, +0x99,0x3f,0x9c,0x2f,0xe3,0xcb,0xf9,0x4a,0xbe,0x0f,0x3f,0x80,0xaf,0xe5,0xeb,0xf8, +0x91,0x7c,0x3d,0x3f,0x9e,0x7f,0x27,0x7f,0x14,0x7f,0x0c,0x7f,0x2c,0xff,0x51,0xfe, +0x38,0xfe,0x53,0xfc,0x49,0xfc,0xa9,0xfc,0x19,0xfc,0x39,0xfc,0xf9,0xfc,0x85,0xfc, +0x57,0xf8,0x09,0xfc,0x24,0x7e,0x1a,0x3f,0x83,0x9f,0xc5,0x5f,0xcd,0x5f,0xcf,0xcf, +0xe1,0x17,0xf0,0x8b,0xf8,0xc5,0xfc,0x12,0x7e,0xbf,0xb1,0x8c,0x7f,0x63,0x64,0x54, +0xf2,0xff,0xca,0xab,0xb3,0x8a,0xff,0x67,0xb4,0x42,0x44,0x64,0xfc,0xaf,0xf9,0xb0, +0xfe,0xac,0xe3,0x37,0xf1,0x5b,0xf8,0xad,0xfc,0x37,0xf8,0xed,0xfc,0xfe,0xff,0xe0, +0xec,0xe2,0xdf,0xf3,0x14,0x5d,0xff,0xfc,0xda,0x3d,0xfc,0x8f,0x7e,0x4e,0x63,0x65, +0xf1,0x1d,0x8f,0x5d,0x43,0x0c,0xc2,0xba,0x41,0x6b,0xd5,0xc9,0x7f,0x8b,0x7f,0xb3, +0xc2,0x7b,0xfc,0x33,0xfc,0x0b,0xfc,0x1e,0xfe,0x25,0xfe,0x65,0xfe,0x15,0xfe,0x55, +0xfe,0x35,0xbe,0x91,0xcf,0x13,0xf0,0x05,0x55,0x7c,0x1b,0x81,0x50,0x20,0x11,0x38, +0x0b,0x86,0x0b,0x64,0x02,0xb9,0x40,0x29,0xf0,0x11,0x04,0x08,0xb4,0x02,0x9d,0x20, +0x52,0xa0,0x17,0xc4,0x0b,0xee,0x14,0x8c,0x12,0x8c,0x11,0x8c,0x15,0x3c,0x2a,0x18, +0x27,0x78,0x4a,0x30,0x49,0x30,0x55,0x30,0x43,0x30,0x47,0x30,0x5f,0xb0,0x50,0xf0, +0x8a,0x20,0x41,0xc0,0xb6,0x9c,0x24,0x48,0x13,0x64,0x08,0xfe,0x2a,0x7f,0x5b,0xd0, +0xf3,0xc4,0x83,0xf7,0xd8,0xf7,0x8a,0xeb,0x2d,0x7e,0xfa,0x5e,0x11,0x73,0x6d,0x9a, +0x6f,0x29,0xc3,0xba,0x9c,0x7d,0xaf,0xe8,0x47,0x16,0x94,0x25,0x58,0x25,0x58,0x2b, +0xe0,0x71,0xef,0x21,0xd9,0xb7,0x3e,0x1b,0x05,0x76,0x28,0xe5,0x88,0xd2,0xfe,0x16, +0x23,0x28,0xdd,0x22,0x57,0xb0,0x49,0x20,0xe3,0x4a,0x6f,0x11,0x54,0x58,0xf8,0xd0, +0x76,0x81,0x69,0x55,0xca,0xae,0x39,0x45,0x68,0x87,0x7d,0x3b,0xc9,0xee,0xb9,0x97, +0xdb,0xf3,0xcb,0x76,0x5d,0xfd,0x53,0x56,0xa6,0xbb,0x04,0xd6,0x54,0x26,0x58,0x45, +0x1b,0x05,0x36,0x54,0x21,0xd8,0x27,0xa8,0x16,0xec,0xb2,0xd8,0x61,0x51,0x27,0x68, +0x14,0xbc,0x2e,0x38,0x28,0x38,0x2c,0x38,0x2a,0x68,0x17,0x9c,0x10,0xec,0xb3,0x38, +0x25,0x78,0x5b,0x50,0x6d,0xf1,0x9e,0xe0,0x43,0xc1,0x11,0x8b,0x73,0x82,0xcd,0x96, +0xa7,0x2d,0x3e,0x12,0xbc,0x63,0xb1,0xd5,0x52,0x4b,0xbd,0x82,0x4b,0x82,0xf3,0x16, +0x3a,0xde,0xa7,0x38,0x03,0x5f,0x80,0xaf,0xc1,0x77,0xa0,0x1f,0x58,0x0e,0x36,0x1a, +0x07,0x81,0x21,0xc0,0x1e,0x88,0x81,0x13,0x18,0x06,0xdc,0x80,0x07,0xf0,0x02,0xde, +0xc0,0x1f,0x68,0x40,0x28,0x88,0x00,0x31,0x20,0x0e,0xdc,0x01,0xee,0x01,0xa3,0xc1, +0x83,0xe0,0x11,0xf0,0x04,0x18,0x0f,0x26,0x82,0x29,0x60,0x3a,0x98,0x0d,0xe6,0x81, +0x05,0xe0,0x65,0xf0,0x1a,0x48,0x04,0xa9,0x60,0x29,0xc8,0x04,0xab,0xc0,0x3a,0x90, +0x0d,0xf2,0xc1,0x66,0xb0,0x0d,0xec,0x04,0xbb,0x41,0x05,0xd8,0x0f,0x6a,0x41,0x23, +0x78,0x1d,0x1c,0x02,0x47,0xc0,0x31,0x70,0x02,0x9c,0x06,0xef,0x82,0x0f,0xc1,0x79, +0xd0,0x0d,0x2e,0x82,0x4f,0xc1,0x17,0xe0,0x6b,0xf0,0x1d,0xe8,0x07,0x96,0x43,0xd0, +0x7f,0x30,0x04,0xd8,0x03,0x31,0x70,0x1a,0x72,0xc3,0xfb,0xc3,0x86,0xb0,0xaa,0xf0, +0x05,0xf6,0x8d,0x04,0x0a,0xa0,0x06,0x7e,0x20,0x08,0x84,0x80,0x70,0x10,0x0d,0x62, +0xc1,0xed,0xe0,0x6e,0x70,0x1f,0x78,0x00,0x3c,0x0c,0x1e,0x07,0x4f,0x82,0x09,0xe0, +0x19,0x30,0x0d,0xcc,0x02,0xcf,0x81,0x17,0xc0,0x4b,0xe0,0x55,0xb0,0x18,0xa4,0x80, +0x25,0x60,0x39,0x58,0x09,0xd6,0x82,0x8d,0x20,0x0f,0x14,0x82,0xad,0x60,0x07,0x28, +0x05,0xe5,0x60,0x1f,0xa8,0x01,0x0d,0xe0,0x9f,0xe0,0x20,0x68,0x03,0x6f,0x82,0x0e, +0x70,0x0a,0xbc,0x03,0x3e,0x18,0xf2,0xf3,0x91,0x75,0x6e,0x48,0xd7,0x90,0xbe,0x21, +0x9f,0x0c,0xf9,0x7c,0xc8,0x57,0x43,0xbe,0x1d,0xf2,0xc3,0x90,0x9f,0xde,0x77,0x2c, +0x6c,0xac,0x6d,0x06,0xdb,0xd8,0xd9,0x88,0x6c,0x1c,0x6d,0x6e,0x75,0xff,0x71,0xb1, +0x19,0x61,0x33,0xd2,0x46,0x61,0xa3,0xb6,0xf1,0xb3,0x09,0xb2,0x09,0xb1,0xf9,0xe9, +0xf1,0x70,0x9b,0x68,0x9b,0x58,0x9b,0xdb,0x6d,0xee,0xb6,0xb9,0xcf,0xe6,0x01,0x9b, +0x87,0x6d,0x7e,0xda,0xfe,0xe3,0x36,0x4f,0xda,0x4c,0xb0,0x79,0xc6,0x66,0x9a,0xcd, +0xac,0x5b,0xb6,0xdf,0x6f,0x7c,0x0e,0xfb,0x5f,0x00,0x2f,0x81,0x57,0x7f,0xd6,0xfe, +0x62,0x9b,0x14,0x9b,0x25,0x36,0xcb,0x6d,0x56,0xda,0xac,0xb5,0xd9,0x68,0x93,0x87, +0xe3,0x43,0x70,0xc5,0x0d,0x05,0x12,0xe0,0x04,0x5c,0x80,0x2b,0x90,0x71,0xef,0x9e, +0x0a,0x6d,0x8a,0x6d,0x4a,0x6d,0x2a,0x6d,0x6a,0x6c,0x9a,0x6c,0x0e,0xda,0xbc,0x61, +0xf3,0xd3,0xed,0x0e,0x9b,0xb7,0x6c,0x3e,0xb0,0xb9,0x60,0xd3,0x67,0x73,0xd9,0xe6, +0x2b,0x9b,0x6b,0x3f,0xdb,0xb6,0xb0,0xe5,0xdb,0xda,0xd9,0x4a,0x6c,0x5d,0x6c,0x65, +0xb6,0x0a,0x5b,0x1f,0xdb,0x9f,0x6e,0xb3,0x36,0x05,0xd9,0xea,0x6c,0xa3,0x6c,0xd9, +0xbe,0xc4,0xda,0xde,0x69,0x3b,0xca,0x76,0x8c,0xed,0x10,0x9e,0xce,0x76,0xac,0xed, +0xc7,0x96,0x63,0x6d,0x1f,0xb5,0x1d,0x67,0x3b,0xc1,0x76,0xaa,0xed,0x4c,0xee,0xf8, +0x73,0xb6,0x0b,0x6d,0x87,0xf2,0x5e,0xb1,0x95,0xf0,0xa6,0xda,0x26,0xd8,0xa6,0xd8, +0x66,0xd8,0x9a,0x7a,0xb5,0xd2,0x76,0xc0,0x17,0x6b,0x6c,0x37,0xd8,0xe6,0xda,0xb2, +0x6f,0xc8,0x36,0xd9,0x6e,0xb3,0xdd,0x65,0x3e,0x5e,0x61,0x3b,0xd0,0xff,0x7d,0xb6, +0x35,0xb6,0x0d,0xb6,0xae,0xbc,0x7f,0xda,0x1e,0xb4,0xb5,0xe2,0xbd,0xc1,0xd5,0x7b, +0xd3,0xb6,0xd3,0xf6,0x6d,0xae,0xfd,0x0f,0x6c,0x2f,0xd8,0xba,0xf0,0x7a,0x6c,0x65, +0xbc,0x4e,0xdb,0x78,0xba,0x64,0xcb,0x7e,0x7f,0x71,0xab,0x60,0x7a,0xee,0x98,0x34, +0x2f,0xdb,0xde,0xf0,0xee,0x15,0xdb,0x7f,0xbd,0xae,0x30,0xfe,0xc2,0xb7,0x23,0x57, +0x6d,0xfb,0x51,0x53,0x60,0x27,0xb4,0xbb,0x3e,0x4e,0x90,0x73,0xb5,0xfb,0x69,0x2b, +0xee,0x76,0x72,0x3b,0x2f,0xbb,0x5f,0xbe,0xef,0xa9,0x7f,0x72,0x2c,0xe4,0xc6,0x83, +0x92,0x6e,0xa8,0xde,0xb4,0x93,0x42,0xed,0x44,0xdc,0x91,0x30,0xbb,0x08,0xbb,0x28, +0xbb,0x18,0x3b,0x83,0x5d,0x9c,0xdd,0x6d,0x76,0x77,0xd8,0xdd,0x63,0x77,0xaf,0xdd, +0x68,0xbb,0xe1,0x38,0x3e,0x9a,0xd8,0xef,0x67,0x6e,0x7d,0x1c,0xe3,0x1d,0xcf,0x83, +0x11,0x14,0x80,0x67,0x82,0xf0,0xfa,0xd3,0x43,0xc6,0x7d,0x1f,0x75,0xeb,0xe7,0xef, +0xfd,0x76,0xff,0xde,0x9d,0x7c,0xac,0xdd,0xa3,0x76,0xd6,0x34,0x0e,0xb5,0x9e,0xb2, +0x9b,0x64,0x97,0xc7,0x7e,0x63,0x61,0xc7,0x3e,0xad,0x4c,0xe1,0x2b,0x3c,0xb5,0x44, +0x50,0x75,0x86,0x1f,0x87,0xd3,0x0c,0xae,0x6d,0xd3,0x37,0x62,0x6c,0x60,0xb7,0x66, +0xdb,0x3d,0x67,0xf7,0x02,0xf6,0xb3,0xdf,0x89,0x4d,0xe0,0x99,0x52,0x47,0x7a,0x8e, +0xfb,0x4e,0x0d,0xb3,0x60,0xee,0x5b,0xb5,0x17,0xed,0x5c,0xd0,0x87,0x45,0x76,0x09, +0x76,0x89,0x76,0x29,0xf0,0x07,0x56,0x17,0x76,0x77,0xe3,0x59,0xa5,0xe2,0xdd,0xcd, +0x5b,0x76,0xdd,0x5e,0x3e,0xf7,0xec,0x63,0x9f,0x92,0x37,0xdb,0xb7,0xc2,0x6e,0x9d, +0x5d,0xae,0x5d,0x91,0xdd,0x0e,0xbb,0x32,0xbb,0x7d,0x76,0x75,0x76,0xff,0xb4,0x6b, +0xb5,0x7b,0xd3,0xae,0xd3,0xee,0x1d,0xbb,0x33,0x76,0x5d,0x76,0x97,0xd0,0xda,0x67, +0x76,0x57,0xec,0xae,0xda,0xf9,0xd0,0x77,0x76,0x3f,0xd8,0x59,0xd8,0x0f,0xb2,0x0f, +0xa0,0xc1,0xf6,0xb6,0xf6,0xce,0xdc,0x77,0x7a,0x2e,0xf4,0x6b,0xc7,0xcd,0x73,0x72, +0xfb,0x1b,0x8a,0x0e,0xf6,0x3f,0x5d,0x3d,0xfc,0x37,0x7e,0x86,0xd9,0x8f,0x44,0x3f, +0x7c,0xec,0x35,0xf6,0xff,0x69,0xe5,0x28,0x7b,0xc3,0x1f,0xd6,0xfc,0xed,0xeb,0xd7, +0x5b,0x5c,0x3d,0xf6,0x77,0xda,0xdf,0x63,0x7f,0x9f,0xfd,0xfd,0xf6,0x63,0xed,0x1f, +0xb1,0x7f,0xdc,0xfe,0x1f,0xf6,0x4f,0xd9,0x4f,0xb4,0x7f,0xc6,0x7e,0x9a,0xfd,0x2c, +0xfb,0xe7,0xec,0x5f,0xb0,0x7f,0xc9,0xfe,0x55,0xfb,0xc5,0xf6,0x29,0xf6,0x4b,0xec, +0x33,0xed,0x57,0xdb,0x6f,0xb0,0xcf,0xb3,0xdf,0x6c,0x5f,0x6c,0xbf,0xcb,0xbe,0xdc, +0x7e,0xbf,0x7d,0x9d,0xfd,0x6f,0xd5,0x6d,0xb6,0x3f,0x60,0x7f,0xd8,0xfe,0xa8,0xfd, +0x71,0xfb,0x93,0xf6,0x6f,0xdb,0xbf,0x6f,0x7f,0xd6,0xfe,0x23,0xfb,0x5e,0xfb,0x8f, +0xed,0x3f,0xb3,0xff,0xd2,0xfe,0x1b,0xfb,0xef,0xed,0x49,0x68,0x25,0x14,0x08,0x6d, +0x85,0x43,0x85,0x0e,0x42,0xa9,0xd0,0x55,0xe8,0x2e,0xf4,0x14,0xfe,0x9e,0x6f,0x9a, +0x7f,0x4f,0x9d,0x50,0xbb,0x3f,0x7e,0x16,0x55,0x42,0xe3,0xff,0xa9,0x4f,0x88,0x30, +0x5c,0x18,0xf5,0x27,0xf6,0xc9,0xf0,0x27,0xb5,0x75,0x87,0xf0,0x1e,0xe1,0x68,0xe1, +0x83,0xc2,0x47,0x84,0x4f,0x08,0xc7,0x0b,0x27,0x0a,0xa7,0x08,0xa7,0x0b,0x67,0x0b, +0xe7,0x09,0x17,0x08,0x5f,0x16,0xbe,0x26,0x4c,0x14,0xa6,0x0a,0x97,0x0a,0x33,0x85, +0xab,0x84,0xeb,0x84,0xd9,0xc2,0x7c,0xe1,0x66,0xe1,0x36,0xe1,0x4e,0xe1,0x6e,0x61, +0x85,0x70,0xbf,0xb0,0x56,0xd8,0x28,0x7c,0x5d,0x78,0x48,0x78,0x44,0x78,0x4c,0x78, +0x42,0x78,0x5a,0xf8,0xae,0xf0,0x43,0xe1,0x79,0x61,0xb7,0xf0,0xa2,0xf0,0x53,0xe1, +0x17,0xc2,0xaf,0x85,0xdf,0x09,0xfb,0x85,0x96,0x43,0xff,0x6a,0xbf,0x0e,0x82,0xc2, +0x90,0xa1,0x76,0x43,0x45,0x9c,0x92,0x03,0x62,0x29,0x70,0x05,0xab,0xb0,0x06,0xc8, +0x12,0xec,0xc2,0x7c,0xde,0x9d,0x3b,0xe6,0xf9,0x23,0x5b,0x24,0x18,0xaf,0xaa,0xa1, +0x3e,0x43,0xfd,0xb1,0x57,0x03,0x42,0x41,0x04,0x88,0x01,0x71,0xe0,0x0e,0x70,0x0f, +0x18,0x0d,0x1e,0x04,0x8f,0x80,0x27,0xc0,0x78,0x30,0x11,0x4c,0x01,0xd3,0xc1,0x6c, +0x30,0x0f,0x2c,0x00,0x2f,0x83,0xd7,0x40,0x22,0x48,0x05,0x4b,0x41,0x26,0x6b,0x09, +0x58,0x07,0xb2,0x41,0x3e,0xd8,0x0c,0xb6,0x81,0x9d,0x60,0x37,0xa8,0x00,0xfb,0x41, +0x2d,0x68,0x04,0xaf,0x83,0x43,0xe0,0x08,0x38,0x06,0x4e,0x80,0xd3,0xe0,0x5d,0xf0, +0x21,0x38,0x0f,0xba,0xc1,0x45,0xf0,0x29,0xf8,0xe2,0x67,0x5e,0xfe,0x1a,0x7b,0xbe, +0xbb,0xbe,0xb7,0x7f,0xa8,0xf1,0x3f,0xf6,0xbe,0xf3,0xc7,0x77,0x29,0x4b,0x91,0xf1, +0x77,0xbd,0xfd,0xfb,0xad,0x6f,0xb8,0x07,0x89,0xfe,0x3b,0xae,0xfe,0x21,0xa2,0x5f, +0xf2,0x80,0xbd,0x48,0x2c,0x72,0x12,0x0d,0x13,0xb9,0x89,0x3c,0x44,0x5e,0x22,0x6f, +0x91,0xbf,0x48,0x23,0x0a,0x15,0x45,0x88,0x62,0x44,0x71,0xa2,0x3b,0x44,0xf7,0x88, +0x46,0x8b,0x1e,0x14,0x3d,0x22,0x7a,0x42,0x34,0x5e,0x34,0x51,0x34,0x45,0x34,0x5d, +0x34,0x5b,0x34,0x4f,0xb4,0x40,0xf4,0xb2,0xe8,0x35,0x51,0xa2,0x28,0x55,0xb4,0x54, +0x94,0x29,0x5a,0x25,0x5a,0x27,0xca,0x16,0xe5,0x8b,0x36,0x8b,0xb6,0x89,0x76,0x8a, +0x76,0x8b,0x2a,0x44,0xfb,0x45,0xb5,0xa2,0x46,0xd1,0xeb,0xa2,0x43,0xa2,0x23,0xa2, +0x63,0xa2,0x13,0xa2,0xd3,0xa2,0x77,0x45,0x1f,0x8a,0xce,0x8b,0xba,0x45,0x17,0x45, +0x9f,0x8a,0xbe,0x10,0x7d,0x2d,0xfa,0x4e,0xd4,0x2f,0xb2,0x14,0x0f,0x12,0x0f,0x11, +0xdb,0x8b,0xc5,0x62,0x27,0xf1,0x30,0xb1,0x9b,0xd8,0x43,0xec,0x25,0xf6,0x16,0xfb, +0x8b,0x35,0xe2,0x50,0x71,0x84,0x38,0x46,0x1c,0x27,0xbe,0x43,0x7c,0x8f,0x78,0xb4, +0xf8,0x41,0xf1,0x23,0xe2,0x27,0xc4,0xe3,0xc5,0x13,0xc5,0x53,0xc4,0xd3,0xc5,0xb3, +0xc5,0xf3,0xc4,0x0b,0xc4,0x2f,0x8b,0x5f,0x13,0x27,0x8a,0x53,0xc5,0x4b,0xc5,0x99, +0xe2,0x55,0xe2,0x75,0xe2,0x6c,0x71,0xbe,0x78,0xb3,0x78,0x9b,0x78,0xa7,0x78,0xb7, +0xb8,0x42,0xbc,0x5f,0x5c,0x2b,0x6e,0x14,0xbf,0x2e,0x3e,0x24,0x3e,0x22,0x3e,0x26, +0x3e,0x21,0x3e,0x2d,0x7e,0x57,0xfc,0xa1,0xf8,0xbc,0xb8,0x5b,0x7c,0x51,0xfc,0xa9, +0xf8,0x0b,0xf1,0xd7,0xe2,0xef,0xc4,0xfd,0x62,0x4b,0xc9,0x20,0xc9,0x10,0x89,0xbd, +0x44,0x2c,0x71,0x92,0x0c,0x93,0xb8,0x49,0x3c,0x24,0x5e,0x12,0x6f,0x89,0xbf,0x44, +0x23,0x09,0x95,0x44,0x48,0x62,0x24,0x71,0x92,0x3b,0x24,0xf7,0x48,0x46,0x4b,0x1e, +0x94,0x3c,0x22,0x79,0x42,0x32,0x5e,0x32,0x51,0x32,0x45,0x32,0x5d,0x32,0x5b,0x32, +0x4f,0xb2,0x40,0xf2,0xb2,0xe4,0x35,0x49,0xa2,0x24,0x55,0xb2,0x54,0x92,0x29,0x59, +0x25,0x59,0x27,0xc9,0x96,0xe4,0x4b,0x36,0x4b,0xb6,0x49,0x76,0x4a,0x76,0x4b,0x2a, +0x24,0xfb,0x25,0xb5,0x92,0x46,0xc9,0xeb,0x92,0x43,0x92,0x23,0x92,0x63,0x92,0x13, +0x92,0xd3,0x92,0x77,0x25,0x1f,0x4a,0xce,0x4b,0xba,0x25,0x17,0x25,0x9f,0x4a,0xbe, +0x90,0x7c,0x2d,0xf9,0x4e,0xd2,0x2f,0xb1,0x74,0x18,0xe4,0x30,0xc4,0xc1,0xde,0x41, +0xec,0xe0,0xe4,0x30,0xcc,0xc1,0xcd,0xc1,0xc3,0xc1,0xcb,0xc1,0xdb,0xc1,0xdf,0x41, +0xe3,0x10,0xea,0x10,0xe1,0x10,0xe3,0x10,0xe7,0x70,0x87,0xc3,0x3d,0x0e,0xa3,0x1d, +0x1e,0x74,0x78,0xc4,0xe1,0x09,0x87,0xf1,0x0e,0x13,0x1d,0xfa,0x8d,0x7f,0x7e,0x60, +0x57,0x08,0x53,0x1c,0xfe,0x33,0xa3,0xf0,0x59,0xe8,0x4c,0x17,0xcd,0x74,0x98,0xeb, +0xf0,0x47,0xae,0x6e,0xf6,0xf3,0xbc,0xc3,0x4b,0x5c,0x1b,0xaf,0x39,0xfc,0x77,0x3f, +0x95,0x53,0x1c,0xfe,0xea,0xfb,0x62,0xbf,0x71,0x99,0xc3,0x0a,0x87,0x35,0x0e,0x1b, +0x1c,0x72,0x1d,0x36,0x39,0x6c,0x71,0xd8,0xee,0xb0,0xcb,0x61,0x8f,0xc3,0x5e,0x87, +0x6a,0x87,0x7a,0x87,0x66,0x87,0x03,0x0e,0x87,0x1d,0x8e,0x3a,0x1c,0x77,0x38,0xe9, +0xf0,0xb6,0xc3,0xfb,0x0e,0x67,0x1d,0x3e,0x72,0xe8,0x75,0xf8,0xd8,0xe1,0x33,0x87, +0x2f,0x1d,0xbe,0x71,0xf8,0xde,0x81,0x1c,0xad,0x1c,0x05,0x8e,0xb6,0x8e,0x43,0x1d, +0x1d,0x1c,0xa5,0x8e,0xae,0x8e,0xee,0x8e,0x9e,0x8e,0x2a,0x47,0x5f,0xc7,0x40,0xc7, +0x60,0xc7,0x30,0xc7,0x28,0x47,0x83,0xe3,0x6d,0x8e,0x77,0x39,0xde,0xeb,0x78,0xbf, +0xe3,0x43,0x8e,0x44,0x8f,0x39,0xfe,0xc3,0xf1,0x69,0xc7,0xc9,0x8e,0xcf,0x3a,0xce, +0x74,0x9c,0xeb,0xf8,0xbc,0xe3,0x8b,0x8e,0x8b,0x1c,0x19,0xc7,0x64,0xc7,0x74,0xc7, +0x65,0x8e,0x2b,0x1c,0xd7,0x38,0x6e,0x70,0xcc,0x75,0xdc,0xe4,0xb8,0xc5,0x71,0xbb, +0xe3,0x2e,0xc7,0x3d,0x8e,0x7b,0x1d,0xab,0x1d,0xeb,0x1d,0x9b,0x1d,0x0f,0x38,0x1e, +0x76,0x3c,0xea,0x78,0xdc,0xf1,0xa4,0xe3,0xdb,0x8e,0xef,0x3b,0x9e,0x75,0xfc,0xc8, +0xb1,0xd7,0xf1,0x63,0xc7,0xcf,0x1c,0xbf,0x74,0xfc,0xc6,0xf1,0x7b,0x47,0x93,0x57, +0xec,0x71,0x67,0x22,0x27,0x2b,0x27,0x81,0x93,0xad,0xd3,0x50,0x27,0x07,0x27,0x37, +0x91,0xd4,0xc9,0xd5,0xc9,0xdd,0xc9,0xd3,0xc9,0xff,0x0f,0xdf,0x7f,0x55,0x4e,0xfe, +0x4e,0xc1,0x4e,0x11,0x4e,0x06,0xa7,0x3b,0x9c,0xee,0x75,0x7a,0xd0,0xe9,0x31,0xa7, +0xf1,0x4e,0x93,0x9d,0xa6,0x3b,0xcd,0x75,0x5a,0xe0,0xb4,0xc8,0x29,0xd1,0x29,0xdd, +0x29,0xd3,0x69,0x8d,0x53,0xb6,0xd3,0x26,0xa7,0x6d,0x4e,0xbb,0x9c,0x2a,0x9c,0xaa, +0x9d,0x1a,0x9d,0x0e,0x38,0x1d,0x71,0x3a,0xee,0x74,0xda,0xe9,0x8c,0x53,0xbf,0xb1, +0xd7,0xe9,0x53,0xa7,0x2f,0x9d,0xbe,0x73,0x22,0xe7,0x41,0xce,0xb6,0xce,0x62,0x67, +0xa9,0xb3,0x9b,0xb3,0xa7,0xb3,0xb7,0x73,0xa0,0x73,0xa8,0x73,0x94,0x73,0x9c,0xf3, +0x5d,0xce,0xa3,0x9d,0x1f,0x72,0x7e,0xc2,0xf9,0x69,0xe7,0x29,0xce,0x33,0x9d,0xe7, +0x39,0xbf,0xe8,0xfc,0x9a,0x73,0xb2,0xf3,0x52,0xe7,0x15,0xce,0xeb,0x9c,0x73,0x9d, +0x37,0x3b,0x6f,0x77,0xde,0xed,0xbc,0xd7,0xb9,0xd6,0xb9,0xd9,0xf9,0x80,0xb3,0x93, +0xf8,0xb0,0xf3,0x4f,0xed,0x3b,0xea,0x7c,0xdc,0xb9,0xd3,0xf9,0xb4,0xf3,0x3b,0xce, +0xef,0x3b,0x9f,0x71,0x3e,0xef,0xdc,0xe5,0xdc,0xeb,0x7c,0xc9,0xf9,0x53,0xe7,0xcf, +0x9d,0xbf,0x74,0xbe,0xea,0xfc,0x9d,0xf3,0x32,0x9c,0xd9,0x2d,0x38,0xa7,0xec,0x59, +0x7c,0x9f,0x3b,0x7f,0x37,0xce,0xde,0x0f,0xce,0x16,0x52,0x6b,0xe9,0x60,0xa9,0x9d, +0x54,0x24,0x75,0x94,0xba,0x48,0x47,0x48,0x47,0x4a,0x15,0x52,0xb5,0xd4,0x4f,0x1a, +0x24,0x0d,0x91,0x46,0x49,0xe3,0xa5,0x37,0x7c,0x7b,0xa7,0x74,0x94,0x74,0x8c,0x34, +0x42,0x34,0x56,0x3a,0x5d,0xa4,0xc1,0xbd,0x76,0x3c,0xee,0xc2,0xdb,0x24,0x4b,0x45, +0xde,0xe2,0x47,0xa5,0xe3,0xa4,0x4f,0x49,0x27,0x49,0xa7,0x4a,0x67,0x48,0xe7,0x48, +0xe7,0x4b,0x17,0x4a,0x5f,0x91,0x6e,0x16,0x25,0x48,0x93,0xa4,0x69,0xd2,0x0c,0x69, +0x96,0x74,0xb5,0x74,0xbd,0x34,0x47,0x6a,0x3a,0x37,0x05,0xd2,0x22,0x69,0xb1,0xb4, +0x44,0x5a,0x26,0xad,0x94,0x56,0x49,0xeb,0xa4,0x4d,0xd2,0x16,0x69,0xab,0xf4,0x88, +0xf4,0x4d,0xe9,0x71,0x69,0xa7,0xf4,0xb4,0xf4,0x1d,0xe9,0xfb,0xd2,0x33,0xd2,0xf3, +0xd2,0x2e,0x69,0xaf,0xf4,0x92,0xf4,0x53,0xe9,0xe7,0xd2,0x2f,0xa5,0xdf,0x4a,0xfb, +0xa5,0x3c,0x17,0x81,0x8b,0x9d,0x8b,0xd8,0xc5,0xd9,0xc5,0xd5,0x65,0xa4,0x8b,0xd2, +0xc5,0xcf,0x45,0xeb,0x12,0xea,0x12,0xe1,0x12,0xed,0x12,0xeb,0x72,0xbb,0xcb,0xdd, +0x2e,0xf7,0xb9,0x3c,0xe0,0xf2,0xb0,0xcb,0xe3,0x2e,0x4f,0xba,0x4c,0x70,0x79,0xc6, +0x65,0x9a,0xcb,0x2c,0x97,0xe7,0x5c,0x5e,0x70,0x79,0xc9,0xe5,0x55,0x97,0xc5,0x2e, +0x29,0x2e,0x4b,0x5c,0x96,0xbb,0xac,0x74,0x59,0xeb,0xb2,0xd1,0x25,0xcf,0xa5,0xd0, +0x65,0xab,0xcb,0x0e,0x97,0x52,0x97,0x72,0x97,0x7d,0x2e,0x35,0x2e,0x0d,0x2e,0xff, +0x74,0x39,0xe8,0xd2,0xe6,0xf2,0xa6,0x4b,0x87,0xcb,0x29,0x97,0x77,0x5c,0x3e,0x70, +0x39,0xe7,0xd2,0xe5,0xd2,0xe7,0xf2,0x89,0xcb,0xe7,0x2e,0x5f,0xb9,0x7c,0xeb,0xf2, +0x83,0x8b,0xd5,0x30,0xd1,0x30,0xb7,0x61,0x3e,0xc3,0x42,0x86,0xc5,0x0d,0xbb,0x77, +0xd8,0x23,0xc3,0xa6,0x0c,0x9b,0x3f,0xec,0xd5,0x61,0x69,0xc3,0x56,0x0e,0xcb,0x1f, +0x56,0x32,0x6c,0xdf,0xb0,0xa6,0x61,0x87,0x86,0x1d,0x1f,0xf6,0xc1,0xb0,0x8b,0xc3, +0x3e,0x1f,0x66,0x31,0xdc,0x61,0xb8,0xe7,0x70,0xff,0xe1,0x31,0xc3,0x47,0x0f,0x1f, +0x37,0xfc,0x99,0xe1,0x73,0x86,0xbf,0x34,0x3c,0x75,0xf8,0xba,0xe1,0x45,0xc3,0x4b, +0x87,0x57,0x0d,0xff,0xe7,0xf0,0xc3,0xc3,0xdb,0x87,0x9f,0x1e,0xfe,0xc1,0xf0,0x9e, +0xe1,0x9f,0x0f,0xb7,0x70,0xb5,0x71,0x95,0xba,0xaa,0x5c,0x35,0xae,0xe1,0xae,0x06, +0xd7,0xfb,0x5d,0x9f,0x74,0x9d,0xe5,0xba,0xd0,0x35,0xcd,0x35,0xd3,0x75,0x83,0xeb, +0x66,0xd7,0x5d,0xae,0xfb,0x5d,0x9b,0x5d,0xdf,0x74,0x7d,0xcb,0xf5,0x43,0xd7,0x5e, +0xd7,0x2f,0x5c,0xbf,0x77,0x1d,0x3c,0x42,0x32,0x62,0xc4,0x08,0xe5,0x08,0xdd,0x88, +0xdb,0x46,0x8c,0x1a,0x31,0x6e,0xc4,0xc4,0x11,0x73,0x46,0x2c,0x1a,0x91,0x3a,0x62, +0xc5,0x88,0xec,0x11,0xc5,0x23,0x76,0x8f,0xa8,0x1e,0x71,0x70,0xc4,0xd1,0x11,0xef, +0x8f,0xe8,0x1e,0x71,0x69,0xc4,0x67,0x23,0xbe,0x1a,0xf1,0xdd,0x08,0xe3,0x08,0x2b, +0xb7,0xc1,0x6e,0xf6,0x6e,0x12,0x37,0xa9,0x9b,0x9b,0x9b,0xa7,0x9b,0xb7,0x5b,0xa0, +0x5b,0xa8,0x5b,0x94,0x5b,0x9c,0xdb,0x5d,0x6e,0xa3,0xdd,0x1e,0x72,0x7b,0xc2,0xed, +0x69,0xb7,0x29,0x6e,0x33,0xdd,0xe6,0xb9,0x2d,0x70,0x7b,0xc9,0x6d,0x91,0x1b,0xe3, +0x96,0xe4,0x96,0xea,0xb6,0xc4,0x6d,0xb9,0xdb,0x4a,0xb7,0x35,0x6e,0x39,0x6e,0x9b, +0xdd,0x76,0xb8,0xed,0x71,0x6b,0x70,0x6b,0x76,0x6b,0x71,0x6b,0x75,0x3b,0xe2,0xf6, +0xa6,0xdb,0x71,0xb7,0x4e,0xb7,0xd3,0x6e,0xef,0xba,0x9d,0x71,0x3b,0xef,0xd6,0xe5, +0xd6,0xe7,0xf6,0x89,0xdb,0x67,0x6e,0x57,0xdc,0xbe,0x76,0xfb,0xce,0xad,0xdf,0xcd, +0x52,0x36,0x48,0x36,0x44,0x66,0x27,0x1b,0x2a,0x93,0xc8,0x9c,0x64,0x2e,0xb2,0x11, +0x32,0x77,0x99,0x5c,0xe6,0x25,0xf3,0x96,0xf9,0xcb,0x82,0x64,0x21,0xb2,0x70,0x59, +0xb4,0xcc,0x20,0xbb,0x4d,0x76,0x8f,0xac,0xc1,0xed,0x01,0xd9,0xc3,0xb2,0xc7,0x65, +0x4f,0xca,0x26,0xc8,0xa6,0xc9,0xe6,0xc9,0x5e,0x90,0xbd,0x28,0x5b,0x24,0x4b,0x90, +0x25,0xca,0x52,0x64,0x4b,0x64,0xcb,0x40,0x96,0x6c,0x95,0x6c,0xad,0x6c,0xa3,0x2c, +0x17,0x14,0xc8,0x8a,0x64,0xfd,0xc6,0x62,0xd9,0x4e,0x59,0xa9,0x6c,0x0f,0x72,0x55, +0xb2,0x5a,0x59,0x83,0xac,0x59,0xd6,0x22,0x3b,0x84,0xf6,0xdb,0x64,0x47,0x65,0xed, +0xb2,0x13,0xb2,0xd3,0xb2,0xe3,0x6e,0xef,0xc8,0x3e,0x90,0x9d,0x43,0x89,0x8f,0x64, +0xbd,0xb2,0x4b,0xb2,0x4f,0x65,0x9f,0xcb,0xbe,0x94,0x7d,0x27,0x23,0x77,0x6b,0xf7, +0x21,0xee,0x42,0x77,0x07,0x77,0x17,0x77,0x37,0x77,0xb9,0xbb,0xca,0xdd,0xcf,0x5d, +0xeb,0x1e,0xee,0xae,0x77,0xbf,0xdd,0x7d,0x94,0xfb,0x03,0xee,0x8f,0xba,0x3f,0xe9, +0x3e,0xc9,0x7d,0x9a,0xfb,0x1c,0xf7,0x17,0xdc,0x5f,0x71,0x5f,0xec,0x9e,0xe6,0xbe, +0xdc,0x7d,0xb5,0xfb,0x46,0xf7,0x02,0xf7,0xad,0xee,0x25,0xee,0xe5,0xee,0xfb,0xdc, +0x8d,0xc6,0x1a,0xd0,0x00,0xfe,0x09,0x0e,0x82,0x4e,0xbe,0xd1,0xd8,0x86,0xf4,0x4d, +0xd0,0x01,0x4e,0x81,0x77,0xc0,0x07,0xe0,0x1c,0xe8,0x02,0x7d,0xe0,0x13,0xf0,0x39, +0xf8,0x0a,0x7c,0x0b,0x7e,0x00,0x16,0x23,0x8d,0x46,0x6b,0x30,0x78,0xe4,0x6f,0xbb, +0xff,0xd8,0xa1,0x9c,0x08,0x38,0x02,0x17,0x30,0x02,0x8c,0x04,0x0a,0xa0,0x06,0x7e, +0x20,0x08,0x84,0x80,0x70,0x10,0x0d,0x62,0x81,0x9b,0x95,0xa7,0xd5,0xff,0x96,0xa7, +0xd8,0xed,0xb0,0xe7,0x6e,0x70,0x1f,0x78,0x00,0x3c,0x0c,0x1e,0x07,0x4f,0x9a,0x7d, +0x30,0x01,0xe9,0x33,0x60,0x1a,0x98,0x05,0x9e,0x03,0x2f,0x80,0x97,0xc0,0xab,0x60, +0x31,0x48,0x01,0x4b,0xc0,0x72,0xb0,0x12,0xac,0x05,0x1b,0x41,0x1e,0x28,0x04,0x5b, +0xc1,0x0e,0x50,0x0a,0xca,0xc1,0x3e,0x50,0x03,0x1a,0xc0,0x3f,0xc1,0x41,0xd0,0x06, +0xde,0x04,0x1d,0xe0,0x14,0x78,0xc7,0xcc,0x8f,0x3f,0x1f,0x60,0xcf,0x39,0xd0,0x35, +0xb2,0x0f,0xf1,0x27,0xe0,0x73,0xf0,0x15,0xf8,0xf6,0x7a,0xd9,0x1f,0x90,0xab,0xe6, +0xbe,0x1b,0xb3,0xf0,0xc0,0xf9,0xf4,0x30,0x7f,0xa7,0x8d,0xd4,0x0e,0x88,0x80,0x23, +0x70,0x01,0x23,0xc0,0x48,0xa0,0x00,0x6a,0xe0,0x07,0xaa,0x2c,0x37,0x0a,0xf6,0x09, +0x82,0x3c,0xea,0xd0,0x42,0xb0,0x87,0xce,0xe3,0x75,0x41,0x84,0x47,0x0c,0xf6,0xc7, +0x81,0x3b,0xc0,0x3d,0x60,0x34,0x78,0x10,0x3c,0x02,0x9e,0x00,0xe3,0x3d,0x3e,0x14, +0x4c,0xf4,0x98,0x82,0xdc,0x74,0x30,0xdb,0xe3,0x39,0xc4,0x2f,0x80,0x97,0xc0,0xab, +0x60,0x31,0x48,0x01,0x4b,0xc0,0x72,0xb0,0xd2,0xe3,0xb7,0xce,0xf0,0x14,0x64,0x4d, +0x36,0x34,0x92,0xd6,0x70,0xbd,0xf8,0x8a,0x22,0x2c,0xfe,0x8c,0x73,0x7e,0xdf,0xc8, +0x0d,0x1e,0x43,0x86,0xe6,0x7a,0xfc,0xfc,0xc8,0x26,0x8f,0x9b,0xd7,0x61,0x45,0x1e, +0xc5,0x1e,0x25,0x1e,0x65,0x1e,0x95,0x1e,0x55,0x1e,0x75,0x1e,0x4d,0x1e,0x2d,0x1e, +0xad,0x1e,0x6f,0x78,0xb4,0x7b,0x74,0x7a,0xbc,0xe5,0xf1,0x9e,0xc7,0x19,0x8f,0x0b, +0x1e,0x3d,0x1e,0x97,0x3c,0x2e,0x7b,0x5c,0xf1,0xb8,0xea,0x71,0xcd,0xc3,0xe8,0xc1, +0x93,0xf3,0xe5,0x36,0x72,0xa1,0x5c,0x22,0x77,0x96,0x0f,0x97,0xcb,0xe4,0x72,0xb9, +0x52,0xee,0x23,0x0f,0x90,0x6b,0xe5,0x3a,0x79,0xa4,0x5c,0x2f,0x8f,0x97,0xdf,0x29, +0x1f,0x25,0x1f,0x23,0x1f,0x2b,0x7f,0x54,0x3e,0x4e,0xfe,0x94,0x7c,0x92,0x7c,0xaa, +0x7c,0x86,0x7c,0x8e,0x7c,0xbe,0x7c,0xa1,0xfc,0x15,0x79,0x82,0x3c,0x49,0x9e,0x26, +0xcf,0x90,0x67,0xc9,0x57,0xcb,0xd7,0xcb,0x73,0xe4,0x05,0xf2,0x22,0x79,0xb1,0xbc, +0x44,0x5e,0x26,0xaf,0x94,0x57,0xc9,0xeb,0xe4,0x4d,0xf2,0x16,0x79,0xab,0xfc,0x0d, +0x79,0xbb,0xbc,0x53,0xfe,0x96,0xfc,0x3d,0xf9,0x19,0xf9,0x05,0x79,0x8f,0x3c,0x55, +0x72,0x49,0x7e,0x59,0x7e,0x45,0x7e,0x55,0x3e,0x1e,0xf3,0xec,0x6b,0xf2,0x6d,0x12, +0xa3,0x9c,0xe7,0xc9,0xf7,0xb4,0xf1,0x14,0x7a,0x4a,0x3c,0x9d,0x3d,0x87,0x7b,0xca, +0x3c,0xe5,0x9e,0x4a,0x4f,0x1f,0xcf,0x00,0x4f,0xad,0xa7,0xce,0x33,0xd2,0x53,0xef, +0x19,0xef,0x79,0xa7,0xe7,0x28,0xcf,0x31,0x9e,0x63,0x3d,0x1f,0xf5,0x1c,0xe7,0xf9, +0x94,0xe7,0x24,0xcf,0xa9,0x9e,0x33,0x3c,0xe7,0x78,0xce,0xf7,0x5c,0xe8,0xf9,0x8a, +0x67,0x82,0x67,0x92,0x67,0x9a,0x67,0x86,0x67,0x96,0xe7,0x6a,0xcf,0xf5,0x9e,0x39, +0x9e,0x05,0x9e,0xfd,0xe2,0x22,0xcf,0x62,0xcf,0x12,0xcf,0x32,0xcf,0x4a,0xcf,0x2a, +0xcf,0x3a,0xcf,0x26,0xcf,0x16,0xcf,0x56,0xcf,0x37,0x3c,0x3d,0x1c,0xda,0x3d,0x3b, +0x3d,0xdf,0xf2,0x7c,0xcf,0xf3,0x8c,0xe7,0x05,0xcf,0x1e,0xcf,0x4b,0x9e,0x97,0x3d, +0xaf,0x78,0x5e,0xf5,0xbc,0xe6,0x69,0xf4,0xe4,0x29,0xf8,0x0a,0x1b,0x85,0x50,0x21, +0x51,0x38,0x2b,0x86,0x2b,0x64,0x0a,0xb9,0x42,0xa9,0xf0,0x51,0x04,0x28,0xb4,0x0a, +0x9d,0x42,0xee,0x19,0xa9,0xd0,0x2b,0xe2,0x15,0x77,0x2a,0x46,0x29,0xc6,0x28,0xc6, +0x2a,0x1e,0x55,0x8c,0x53,0x3c,0xa5,0x98,0xa4,0x98,0xaa,0x98,0xa1,0x98,0xa3,0x98, +0xaf,0x58,0xa8,0x78,0x45,0x91,0xa0,0x48,0x52,0xa4,0x29,0x32,0x25,0x19,0x8a,0x2c, +0xc5,0x6a,0xc5,0x7a,0x45,0x8e,0xa2,0x40,0x51,0xa4,0x28,0x56,0x94,0x28,0xca,0x14, +0x95,0x8a,0x2a,0x45,0x9d,0xa2,0x49,0xd1,0xa2,0xd8,0x2c,0x6a,0x55,0xbc,0xa1,0x68, +0x57,0x74,0x2a,0xde,0x52,0xbc,0xa7,0x38,0xa3,0xb8,0xa0,0x78,0x44,0xd4,0xa3,0xb8, +0xa4,0xb8,0xac,0xb8,0xa2,0xb8,0xaa,0xb8,0xa6,0x30,0x2a,0x78,0x5e,0x7c,0x2f,0x1b, +0x2f,0xa1,0x97,0xc4,0xcb,0xd9,0x6b,0xb8,0x97,0xcc,0x4b,0xee,0xa5,0xf4,0xf2,0xf1, +0x0a,0xf0,0xd2,0x7a,0xe9,0xbc,0x22,0xbd,0x92,0x14,0x7a,0xaf,0x78,0xaf,0x3b,0xbd, +0x46,0x79,0x8d,0xf1,0x1a,0xeb,0xf5,0xa8,0xd7,0x38,0xaf,0x78,0xc5,0x53,0x5e,0x93, +0xbc,0xa6,0x7a,0xcd,0xf0,0x9a,0xe3,0x35,0xdf,0x6b,0xa1,0xd7,0x2b,0x5e,0x09,0x5e, +0x49,0x5e,0x69,0x5e,0x19,0x5e,0x59,0x5e,0xab,0xbd,0xd6,0x7b,0xe5,0x78,0x15,0x78, +0x15,0x79,0x15,0x7b,0x95,0x78,0xc9,0x3d,0xcb,0xbc,0x2a,0xbd,0xaa,0xbc,0xea,0xbc, +0x9e,0x70,0x68,0xf2,0x6a,0xf1,0x6a,0xf5,0x7a,0xc3,0xab,0xdd,0xab,0xd3,0xeb,0x2d, +0xaf,0xf7,0xbc,0xce,0x78,0x5d,0xf0,0xea,0xf1,0xba,0xe4,0x35,0x4a,0x7a,0xd9,0xeb, +0x8a,0xd7,0x55,0xaf,0x6b,0x5e,0x46,0x2f,0x9e,0x92,0xaf,0xb4,0x51,0x0a,0x95,0xa3, +0x14,0x12,0xa5,0xb3,0x72,0xb8,0x52,0xa6,0x94,0x2b,0x95,0x4a,0x1f,0x65,0x80,0x52, +0xab,0xd4,0x29,0x23,0x95,0x7a,0x65,0xbc,0x72,0xb3,0xe4,0x4e,0xe5,0x28,0xe5,0x18, +0xe5,0x58,0xe5,0xa3,0xca,0x71,0xca,0xa7,0x94,0x93,0x94,0x53,0x95,0x33,0x94,0x73, +0x94,0xf3,0x95,0x0b,0x95,0x1f,0x8a,0x5f,0x51,0x26,0x28,0x93,0x94,0x69,0xca,0x0c, +0x65,0x96,0x72,0xb5,0x72,0xbd,0x32,0x47,0x59,0xa0,0x2c,0x52,0x16,0x2b,0x4b,0x94, +0x65,0xca,0x4a,0x65,0x95,0xf2,0x1e,0x49,0x9d,0xf2,0x11,0x49,0x93,0xb2,0x45,0xd9, +0xaa,0x64,0xc7,0xf1,0x1b,0x88,0xdb,0xb9,0x5c,0xa7,0xf2,0x2d,0xe5,0x7b,0xca,0x33, +0xca,0x0b,0xca,0x1e,0xe5,0x25,0xe5,0x65,0xe5,0x15,0xe5,0x77,0x62,0xa3,0xf1,0x2a, +0x8e,0x5d,0xe3,0x8e,0x1b,0x95,0x3c,0x95,0xf9,0x4d,0xbe,0xca,0x46,0x25,0x54,0x49, +0x54,0xce,0xaa,0xe1,0x2a,0x99,0x4a,0xae,0x52,0xaa,0x7c,0x54,0x01,0x2a,0xad,0x4a, +0xa7,0x8a,0x54,0xe9,0x55,0xf1,0xaa,0x3b,0x55,0xa3,0x54,0x8d,0xa2,0x31,0xaa,0xb1, +0xaa,0x47,0x55,0xe3,0x54,0x4f,0xa9,0x26,0xa9,0xa6,0xaa,0x66,0xa8,0xe6,0xa8,0xe6, +0xab,0x16,0xaa,0x5e,0x51,0x25,0xa8,0x92,0x54,0x69,0xaa,0xa7,0xa4,0x19,0xaa,0x2c, +0xd5,0x6a,0xd5,0x7a,0xd5,0x1c,0x69,0x8e,0xaa,0x40,0x55,0xa4,0x2a,0x56,0x95,0xa8, +0x24,0x5e,0x65,0xaa,0x4a,0x55,0x95,0xaa,0x4e,0xd5,0xa4,0x6a,0x41,0x68,0x55,0xbd, +0xa1,0x6a,0x57,0x75,0xaa,0xde,0x52,0xbd,0xa7,0x3a,0xa3,0xba,0xa0,0x32,0x2a,0x7b, +0x54,0x97,0x54,0x97,0x55,0x57,0x54,0x57,0x55,0xdf,0xab,0xb8,0xef,0x62,0xd4,0x56, +0x6a,0x81,0xda,0x56,0x3d,0x54,0xed,0xa0,0x96,0xaa,0x5d,0xd5,0x3a,0x95,0xbb,0xda, +0x53,0xad,0x52,0xbf,0xa1,0xf4,0x55,0x07,0xaa,0x83,0xd5,0x61,0xea,0x28,0xb5,0x41, +0x7d,0x9b,0xfa,0x2e,0xf5,0xbd,0xea,0xfb,0xd5,0x0f,0xa9,0x1f,0x53,0x3f,0xaa,0xfa, +0x87,0x7a,0x9c,0xea,0x69,0xf5,0x64,0xf5,0xb3,0xea,0x99,0xea,0xb9,0xea,0x76,0xe5, +0x42,0xcf,0xe7,0xd5,0x2f,0xaa,0xe3,0xc4,0x69,0x8a,0x4e,0xaf,0x45,0x6a,0x46,0xbd, +0x50,0x95,0xac,0x7e,0x45,0x95,0xae,0x5e,0xa6,0x5e,0xa1,0x7e,0x4b,0xb9,0x46,0xbd, +0x41,0x9d,0xab,0xde,0xa4,0xde,0xa2,0x7e,0x4f,0xb9,0x5d,0xbd,0x4b,0xbd,0x47,0xbd, +0x57,0x5d,0xad,0xae,0x57,0x97,0xa8,0x9a,0xd5,0x07,0xd4,0x12,0xaf,0xc3,0xea,0x3a, +0xd5,0x51,0xf5,0x71,0xf5,0x49,0xf5,0xdb,0xea,0xf7,0xd5,0xed,0xaa,0xb3,0xea,0x6b, +0xca,0x8f,0xd4,0x9d,0xaa,0x48,0x45,0xaf,0xfa,0x2d,0xd5,0xc7,0xea,0x33,0xaa,0xcf, +0xd4,0x5f,0xaa,0xbf,0x51,0x7f,0xaf,0x26,0xef,0x1e,0xd5,0x65,0xa5,0x95,0xf7,0x25, +0x95,0xc0,0xfb,0xb2,0xca,0xd6,0x7b,0xbc,0xc3,0x50,0x6f,0x47,0xef,0x61,0xde,0x32, +0x6f,0xb9,0xb7,0xd2,0xdb,0xc7,0x3b,0xd0,0x3b,0xc4,0x3b,0xc2,0x3b,0xc6,0xfb,0xcf, +0x5c,0xff,0xc6,0x79,0xdf,0xee,0x7d,0x97,0xf7,0x28,0xef,0x31,0xde,0x63,0x11,0x7e, +0xa9,0xd4,0x23,0xde,0xe3,0xbc,0x9f,0xf6,0x7e,0xc6,0x7b,0xfa,0x4d,0x25,0xe6,0x78, +0x63,0x1d,0xea,0xfd,0x92,0xf7,0x22,0xbb,0x14,0xbb,0x45,0xde,0x09,0xde,0x89,0xde, +0x29,0xde,0xe9,0xde,0x19,0xde,0xb7,0xd9,0x65,0x7a,0xaf,0xf6,0xde,0xe0,0x5d,0xe0, +0xbd,0xcd,0xbb,0xc4,0x7b,0x8f,0xf7,0x3e,0xef,0x5a,0xef,0x26,0xef,0x03,0xde,0x6d, +0xde,0xc7,0x50,0xbb,0xd3,0xfb,0x6d,0xef,0x0f,0xbc,0xcf,0x7b,0xf7,0x20,0xff,0x31, +0xf8,0xdc,0xfb,0x6b,0xc4,0xd7,0xbc,0xc9,0xa7,0xdf,0x68,0xed,0x33,0xc4,0x47,0xe8, +0xe3,0xe0,0xe3,0xe2,0xe3,0xe6,0x23,0xf7,0x51,0xf9,0xf8,0xf9,0x68,0x7c,0x74,0x08, +0x11,0xe6,0x10,0x6d,0x0e,0x06,0x73,0x88,0x37,0x87,0x3b,0xcc,0xe1,0x6e,0x73,0xb8, +0xd7,0x1c,0xc6,0x98,0xc3,0x83,0xe6,0xf0,0xb0,0x39,0x3c,0x66,0x0e,0xe3,0xcc,0x61, +0x3c,0xc2,0x04,0x84,0xc9,0x08,0x53,0x11,0xa6,0x23,0xcc,0x42,0x98,0x6b,0x0e,0xf3, +0xcd,0x61,0x81,0x39,0xbc,0x64,0x0e,0x8b,0x10,0x12,0xcc,0x21,0x11,0x21,0xc5,0x1c, +0xd2,0xcd,0x21,0x03,0x21,0x13,0xe1,0x8f,0x3f,0x6d,0x56,0xfa,0x98,0xc2,0x1a,0x84, +0xf5,0x08,0xd9,0x08,0x1f,0x58,0xe7,0xf9,0xe4,0xf9,0x6c,0x42,0x28,0x42,0xd8,0x66, +0x0e,0x3b,0x10,0x76,0x21,0x94,0x23,0xec,0x47,0xa8,0x43,0x68,0x46,0x38,0x88,0x70, +0x84,0x0b,0xed,0x5c,0x38,0x69,0x0e,0x6f,0xf9,0xbc,0xef,0x73,0x0e,0xdb,0xdd,0x3e, +0x97,0x7c,0x3e,0xf3,0xf9,0xca,0xe7,0x3b,0x1f,0xa3,0x8f,0x95,0xef,0x60,0x5f,0x7b, +0x5f,0x89,0xaf,0xd4,0x77,0x84,0xaf,0x87,0xaf,0xd2,0xd7,0xd7,0x37,0xc8,0x37,0xd4, +0x37,0xd2,0xd7,0xe0,0x7b,0xbb,0xef,0x3d,0xbe,0x63,0x7c,0x1f,0xf2,0x7d,0xdc,0x77, +0xbc,0xef,0x24,0xdf,0x67,0x7d,0x67,0xf9,0xce,0xf3,0x5d,0xe8,0xbb,0xc8,0x77,0xb1, +0x6f,0xaa,0x6f,0x86,0xef,0x0a,0xdf,0xb5,0xbe,0xd9,0xbe,0x05,0xbe,0x5b,0x7c,0x77, +0xf8,0xee,0xf6,0xad,0xf4,0xad,0xf6,0x6d,0xf0,0x7d,0xdd,0xb7,0xd5,0xf7,0xa8,0x6f, +0x87,0xef,0x69,0xdf,0xf7,0x7c,0xcf,0xfa,0x76,0xf9,0x5e,0xf4,0xbd,0xec,0xfb,0xa5, +0xef,0xb7,0xbe,0xfd,0xbe,0x3c,0x3f,0x81,0x9f,0x9d,0x9f,0xd8,0xcf,0xd9,0xcf,0xd5, +0x6f,0xa4,0x9f,0x97,0x9f,0x8f,0x5f,0xa0,0x5f,0x88,0x5f,0x84,0x9f,0xde,0xef,0x36, +0xbf,0xbb,0xfd,0x46,0xfb,0x8d,0xf5,0x7b,0xcc,0xef,0x49,0xbf,0x89,0x7e,0x53,0xfd, +0x66,0xfa,0x3d,0xe7,0xb7,0xc0,0xef,0x15,0x3f,0xc6,0x2f,0xc5,0x6f,0xa9,0x5f,0x96, +0xdf,0x1a,0xbf,0x8d,0x7e,0xf9,0x7e,0x45,0x7e,0xdb,0xfd,0x76,0xfb,0xed,0xf5,0xab, +0xf5,0x6b,0xf6,0x3b,0xe4,0x77,0xd4,0xaf,0xc3,0xef,0x9c,0xcf,0x69,0x3f,0xb6,0x27, +0xef,0xf9,0x9d,0xf5,0xfb,0xce,0xa7,0xcb,0x8f,0xed,0xc9,0x45,0xbf,0xcb,0x7e,0x52, +0xdf,0x2f,0xfd,0xd8,0x9e,0x7c,0xeb,0xd7,0xef,0xe7,0xeb,0xcb,0xf3,0x67,0x7b,0xc3, +0x5a,0x65,0xb2,0x68,0xc0,0x16,0x93,0x15,0x02,0xff,0x08,0x3f,0x3b,0x7f,0xb1,0xff, +0x63,0x7e,0xce,0xfe,0xac,0x7a,0x91,0x9f,0xab,0xff,0x48,0xff,0xa5,0x7e,0x5e,0xfe, +0xac,0x2e,0xeb,0x2d,0x1f,0xff,0x73,0x3e,0x81,0xfe,0x03,0xde,0x0a,0xf1,0x1f,0xf0, +0x55,0x84,0xbf,0xef,0x4d,0x3e,0xba,0xd9,0x43,0x7a,0xff,0x9b,0x7d,0xf4,0x73,0x0f, +0xb1,0xde,0xb9,0xe1,0x97,0x01,0x9f,0xdc,0xe6,0x3f,0xe0,0x91,0x01,0x6f,0xdc,0xed, +0xcf,0xfa,0x62,0xb4,0xff,0x80,0x27,0xc6,0x72,0x96,0xb0,0x36,0x98,0xd4,0x1f,0xf3, +0x9f,0xe5,0xfb,0xa4,0xff,0x44,0xff,0xa9,0xfe,0x6c,0x3b,0xae,0x5c,0x0d,0xb6,0xd4, +0x4c,0xff,0xf9,0xfe,0x2f,0xfb,0x2f,0xf6,0x4f,0xf5,0xcf,0xf0,0x5f,0xe1,0xbf,0xd6, +0x3f,0xdb,0xbf,0xc0,0x7f,0x8b,0xff,0x0e,0xff,0xdd,0xfe,0x95,0xfe,0xd5,0xfe,0x0d, +0xfe,0xaf,0xfb,0xb7,0xfa,0x1f,0xf5,0xef,0xf0,0x3f,0xed,0xff,0x9e,0xff,0x59,0xff, +0x2e,0xff,0x8b,0xfe,0x97,0xd1,0xca,0x97,0xfe,0xdf,0xfa,0xf7,0xfb,0xf3,0x02,0x7e, +0x6f,0xbd,0x81,0xed,0x27,0x61,0xcf,0x5a,0xb3,0x37,0x4c,0xfb,0xd8,0x51,0x22,0x08, +0x10,0x04,0xfc,0xa6,0xf5,0x41,0x80,0x03,0xc2,0xf0,0x00,0x8f,0x00,0x75,0x40,0x60, +0x80,0x2e,0x20,0x06,0xe1,0xf6,0x80,0x7b,0x03,0xc6,0x06,0x3c,0x11,0x30,0x21,0xe0, +0x59,0x84,0x39,0x01,0x0b,0x10,0x5e,0x45,0x48,0x0e,0xc8,0x40,0x58,0x15,0xb0,0x11, +0x61,0x13,0x42,0x71,0xc0,0x6e,0x84,0x7d,0x08,0xf5,0x01,0x2d,0x01,0x47,0x02,0x3a, +0x10,0xde,0x0e,0x38,0x13,0xd0,0x1d,0xf0,0x49,0xc0,0x97,0x08,0xd7,0x02,0x2c,0x03, +0x07,0x07,0x0e,0x0d,0x74,0x0e,0xc4,0xd2,0x31,0x50,0x81,0xe0,0x8b,0xa0,0x0d,0x8c, +0x08,0x8c,0x0d,0xbc,0x2b,0x70,0x4c,0xe0,0x23,0x81,0x4f,0x06,0xb2,0x36,0x4c,0x0e, +0x9c,0x11,0x38,0x2f,0xf0,0xa5,0x40,0x26,0x30,0x0d,0x21,0x33,0x70,0x6d,0x60,0x6e, +0x60,0x11,0xc2,0xce,0xc0,0xf2,0xc0,0xea,0xc0,0xa6,0xc0,0x43,0x81,0x6f,0x06,0x9e, +0x0c,0x7c,0x2f,0xf0,0x7c,0x60,0x5f,0xe0,0x67,0x81,0x57,0x03,0xfb,0x03,0xad,0x83, +0x6c,0x83,0x24,0x41,0xc3,0x82,0x46,0x06,0xa9,0x82,0x02,0x82,0x42,0x83,0xa2,0x83, +0xae,0x05,0x0c,0x0e,0xbc,0x2d,0x68,0x54,0xd0,0x83,0x41,0x8f,0x07,0x3d,0x1d,0x34, +0x15,0x3c,0x18,0x34,0x3b,0xe8,0x85,0xa0,0x45,0x41,0x49,0x41,0x4b,0xb1,0x7d,0x04, +0xd6,0xaf,0x0c,0xda,0x10,0xf4,0xfb,0xbf,0x09,0xbd,0x75,0x28,0x08,0xda,0x16,0x54, +0x1a,0xb4,0x3f,0xa8,0x29,0xe8,0x70,0x50,0x47,0xd0,0xbb,0x41,0x17,0x82,0x3e,0x0e, +0xba,0x12,0xe4,0xa8,0x51,0x68,0x7e,0xfa,0x9b,0x7e,0xb7,0xfe,0xf8,0x6b,0x02,0x35, +0xfd,0xc6,0x60,0x8d,0xd1,0x32,0x54,0x13,0xa6,0x89,0xd0,0xc4,0x68,0xfe,0xbd,0x6f, +0x10,0xf0,0x84,0xd1,0xdc,0xa1,0xb9,0x07,0x81,0xfd,0x7d,0x86,0x7b,0x35,0xa3,0x35, +0xf7,0x6b,0x1e,0xd2,0x3c,0xa6,0xf9,0x87,0xe6,0x69,0xcd,0x64,0x0d,0xfb,0x5d,0xf1, +0xb3,0x9a,0x99,0x9a,0xb9,0x9a,0xe7,0x39,0x7b,0x5e,0xd4,0xbc,0xac,0x71,0xb5,0x33, +0x85,0x7b,0xb8,0x5a,0x26,0x7d,0xe8,0x58,0x06,0x43,0x3f,0x54,0x13,0xf7,0xa3,0x76, +0x16,0x69,0x5e,0xd3,0x30,0x9a,0xdb,0xec,0x12,0x35,0xc9,0x9a,0x54,0xcd,0x3d,0x76, +0xfd,0xc6,0x74,0xcd,0x52,0xcd,0x32,0x4d,0xe6,0x75,0x2b,0x57,0x68,0xd6,0x68,0x36, +0xa2,0xed,0x3c,0xec,0x29,0xd4,0x6c,0xd5,0xec,0xd4,0xec,0xd6,0x54,0x6a,0xaa,0x34, +0xf5,0x9a,0x66,0xcd,0x41,0x4d,0x9b,0xe6,0x98,0xa6,0x03,0xe1,0x24,0xc2,0x5b,0x08, +0xef,0x22,0x7c,0x60,0x0e,0x67,0x11,0x2e,0x98,0x43,0x37,0x42,0x9f,0x39,0x7c,0x6c, +0x0e,0x97,0xcd,0xe1,0x0b,0x73,0xf8,0xca,0x1c,0xbe,0x41,0xb8,0x86,0xd0,0x8f,0x60, +0xa1,0xb5,0xd0,0x5a,0x99,0x03,0xdf,0x1c,0x86,0x98,0x83,0x9d,0x39,0x0c,0x35,0x07, +0x89,0x39,0x38,0x99,0x83,0x8b,0x39,0xb8,0x9a,0x83,0xcc,0x1c,0x3c,0xcc,0x41,0x61, +0x0e,0x2a,0x73,0xf0,0x31,0x07,0x7f,0x73,0x08,0x42,0x60,0x9f,0x06,0xc1,0x5a,0x53, +0xd0,0x21,0x44,0x21,0xc4,0x22,0xdc,0x81,0x60,0xfa,0x4d,0x95,0x7e,0x63,0xa8,0x66, +0x94,0x76,0x11,0xe7,0xb5,0xd7,0x34,0xf7,0x69,0x59,0xef,0xb2,0x1e,0xf5,0xd7,0x24, +0x6a,0xa6,0x38,0x8c,0xd1,0xde,0xea,0xf7,0x53,0xd8,0xd1,0x90,0x0c,0x6f,0xa7,0xe2, +0x8c,0x64,0x6a,0x7e,0xcf,0x37,0xd4,0x2f,0x6a,0xd2,0x71,0xa6,0x1f,0xd0,0xde,0xa3, +0x79,0xc3,0xf6,0xf7,0xd4,0xbf,0x57,0x33,0x56,0x3b,0x5a,0xf3,0xb0,0xf6,0x51,0xed, +0x38,0xed,0x14,0x07,0x76,0x04,0x05,0x6a,0x9e,0xd2,0x7e,0xeb,0x32,0x49,0x3b,0x55, +0x3b,0x43,0x3b,0x47,0x3b,0x5f,0xbb,0x50,0xfb,0x8a,0x36,0x41,0x9b,0xa4,0x4d,0xd3, +0xfe,0x55,0x6f,0xd0,0x32,0xb4,0x59,0xda,0xd5,0x5a,0xa2,0x3f,0xf2,0x7e,0xd9,0x34, +0x46,0x6f,0x7e,0xcb,0xcc,0x6e,0xdf,0xfc,0xa6,0x99,0xdd,0xbe,0xf9,0x6d,0x33,0xbb, +0x6d,0x7a,0xe3,0x6c,0xaa,0xbb,0x5e,0x9b,0xad,0xcd,0xd3,0x46,0xd2,0x26,0x6d,0x91, +0x76,0x1b,0xce,0xe9,0x4e,0xed,0x6e,0x6d,0x85,0x76,0xbf,0xb6,0x56,0xdb,0xa8,0x7d, +0x5d,0xfb,0xeb,0xf7,0x87,0x43,0xda,0x37,0xb4,0xc7,0xb5,0xa7,0xb4,0xef,0x6a,0xcf, +0x68,0x3f,0xd2,0xf6,0x69,0x3f,0xd5,0x5e,0xd1,0x7e,0xa3,0xfd,0x41,0x6b,0x19,0xcc, +0x0f,0xb6,0x0d,0x16,0x05,0x3b,0x05,0x0f,0x0f,0x76,0x0f,0x56,0x04,0x7b,0x07,0x07, +0x04,0x07,0x07,0x87,0x07,0xc7,0x04,0xc7,0x07,0xdf,0x15,0x7c,0x5f,0xf0,0x83,0xc1, +0x8f,0x06,0xff,0x23,0x78,0x42,0xf0,0x94,0xe0,0x19,0xc1,0x73,0x83,0x5f,0x08,0x7e, +0x39,0x38,0x21,0x38,0x39,0x78,0x49,0xf0,0x7f,0xfa,0xf7,0xa9,0x7f,0xed,0x3b,0xd0, +0xcc,0xe0,0xd5,0xc1,0x1b,0x82,0xf3,0x82,0x37,0x07,0x17,0x07,0xef,0x0a,0x2e,0x0f, +0xde,0x1f,0x5c,0x17,0xdc,0x1c,0x7c,0x30,0xf8,0x48,0x70,0x7b,0xf0,0xc9,0xe0,0x77, +0x82,0x3f,0x0c,0xbe,0x10,0xdc,0x1b,0xfc,0x49,0xf0,0x17,0xc1,0x57,0x83,0xbf,0x0f, +0xb6,0x08,0x19,0x14,0x62,0x13,0x32,0x34,0xc4,0x31,0x64,0x58,0x88,0x2c,0xc4,0x33, +0x44,0x1d,0xe2,0x1f,0xa2,0x0d,0x09,0x0b,0x89,0x0e,0xf9,0xb3,0xbf,0xa5,0xf8,0xab, +0xda,0xfb,0xe9,0xdd,0x39,0x2e,0xe4,0xce,0x90,0x7b,0x43,0x1e,0x08,0x79,0x24,0x64, +0x5c,0xc8,0xd3,0x21,0xcf,0x84,0x4c,0x0f,0x99,0x13,0xf2,0x3c,0x7a,0xf3,0x52,0xc8, +0x6b,0x21,0x49,0x21,0xe9,0x21,0xcb,0x43,0x56,0x85,0xac,0x0f,0xc9,0x0d,0x29,0x0c, +0xd9,0x16,0x52,0x12,0xb2,0x27,0x64,0x5f,0x48,0x6d,0x48,0x13,0x8e,0x1f,0x08,0x69, +0x0b,0x39,0x16,0xd2,0x19,0xf2,0x76,0xc8,0x07,0x21,0xe7,0xb1,0xdd,0x13,0xf2,0x71, +0x48,0xff,0xaf,0x7e,0x1f,0xfc,0xdb,0x8e,0xf7,0xff,0xe8,0x37,0xf6,0x3e,0x0f,0xf9, +0x32,0xe4,0x79,0xba,0x1a,0x92,0x60,0xd1,0x6f,0xfc,0x2e,0xe4,0x87,0x10,0x8b,0x50, +0xab,0x50,0xf6,0x6f,0xe0,0xf9,0xa1,0x36,0xa1,0xf6,0xa1,0xa2,0xd0,0xd9,0x1e,0x0e, +0xa1,0x45,0x16,0xce,0xa1,0x5f,0xd1,0xb0,0xd0,0x11,0xa1,0xee,0xa1,0xf2,0x50,0xaf, +0xd0,0x20,0x0f,0x75,0xa8,0x7f,0xa8,0x26,0x34,0x24,0x34,0x22,0x34,0x3a,0xb4,0x98, +0xe2,0x42,0x6f,0x0f,0x1d,0x49,0x77,0x85,0x8e,0x0a,0x15,0x0d,0xbd,0x3f,0xf4,0x80, +0xc5,0xd8,0xd0,0x47,0x42,0x1f,0x0f,0x7d,0x32,0xf4,0xb8,0xc5,0xd3,0xa1,0xfd,0xc6, +0xc9,0xa1,0x53,0x43,0xa7,0x87,0xce,0x0a,0x9d,0x1b,0x3a,0x3f,0x74,0x41,0xe8,0x4b, +0xa1,0xaf,0x85,0xde,0xf0,0x50,0x52,0x68,0x7a,0xe8,0xf2,0xd0,0x55,0xa1,0xeb,0x43, +0x73,0x43,0x0b,0x43,0xb7,0x85,0x96,0x84,0xee,0x09,0xdd,0x17,0x5a,0x1b,0xda,0x14, +0x7a,0x20,0xb4,0x2d,0xf4,0x58,0x68,0x67,0xe8,0xdb,0xa1,0x1f,0x84,0x9e,0x0f,0xed, +0x09,0xfd,0x38,0xf4,0xf3,0xd0,0xaf,0x43,0xaf,0x85,0x92,0xce,0x5a,0x37,0x44,0x27, +0xd4,0x39,0xe8,0x5c,0x74,0x6e,0x3a,0xb9,0x4e,0xa5,0xf3,0xd3,0x69,0x74,0x3a,0x5d, +0x94,0x2e,0x56,0x77,0x87,0x6e,0x94,0xee,0x7e,0xdd,0xc3,0xba,0x27,0x74,0x4f,0xe9, +0x26,0xeb,0xa6,0xe9,0x66,0xeb,0xe6,0xeb,0x5e,0xd4,0xbd,0xaa,0xfb,0xfd,0xdf,0xc0, +0x27,0xea,0xd2,0x74,0xcb,0x74,0x2b,0x75,0xeb,0x74,0x39,0xba,0x4d,0xba,0xad,0xba, +0x9d,0xba,0x32,0xdd,0x5e,0x5d,0x8d,0xae,0x51,0xd7,0xa2,0x3b,0xac,0x7b,0x53,0x77, +0x42,0xf7,0x96,0xee,0x7d,0xdd,0x39,0x5d,0xb7,0xee,0x92,0xee,0xf7,0x8c,0xa8,0x3f, +0x3a,0xbf,0xf8,0x4c,0xf7,0x95,0xee,0x3b,0x9d,0x51,0x67,0x15,0x36,0x38,0xcc,0x3e, +0x4c,0x12,0x26,0x0d,0x1b,0x11,0xe6,0x11,0xa6,0x0c,0xf3,0x0d,0x0b,0x0a,0x0b,0x0d, +0x8b,0x0c,0x33,0x84,0xdd,0x1e,0x76,0x4f,0xd8,0x98,0xb0,0x87,0xc2,0x1e,0x0f,0x1b, +0x1f,0x36,0x29,0xec,0xd9,0xb0,0x59,0x61,0xf3,0xc2,0x16,0x86,0x2d,0x0a,0x5b,0x1c, +0x96,0x1a,0x96,0x11,0xb6,0x22,0x6c,0x6d,0x58,0x76,0x58,0x41,0xd8,0x96,0xb0,0x1d, +0x61,0xbb,0xc3,0x2a,0xc3,0xaa,0xc3,0x1a,0xc2,0x5e,0x0f,0x6b,0x0d,0x3b,0x1a,0xd6, +0x11,0x76,0x3a,0xec,0xbd,0xb0,0xb3,0x61,0x5d,0x61,0x17,0xc3,0x2e,0x87,0x7d,0x19, +0xf6,0x6d,0x58,0x7f,0x18,0x2f,0x5c,0x10,0x6e,0x17,0x2e,0x0e,0x77,0x0e,0x77,0x0d, +0x1f,0x19,0xee,0x15,0xee,0x13,0xfe,0x3f,0xf7,0x97,0x1c,0xa6,0x10,0x18,0x1e,0x12, +0x1e,0x11,0xae,0x0f,0xbf,0x2d,0xfc,0xee,0xf0,0xd1,0xe1,0x63,0xc3,0x1f,0x0b,0x7f, +0x32,0x7c,0x62,0xf8,0xd4,0xf0,0x99,0xe1,0xcf,0x85,0x2f,0x08,0x7f,0x25,0x9c,0x09, +0x4f,0x09,0x5f,0x1a,0x9e,0x15,0xbe,0x26,0x7c,0x63,0x78,0x7e,0x78,0x51,0xf8,0xf6, +0xf0,0x5f,0x3b,0x47,0xbf,0x3e,0x3e,0x6e,0xde,0xff,0xf3,0xdf,0x3e,0xfd,0x73,0xfe, +0xfe,0xeb,0xd6,0x7f,0xd3,0xf0,0x7b,0x7e,0x17,0xed,0xe7,0xf3,0x87,0x1f,0xff,0xc6, +0xee,0xef,0xff,0x94,0x86,0xef,0x0f,0x6f,0x0a,0x3f,0x1a,0xfe,0x4e,0x78,0x77,0xf8, +0x95,0xf0,0xdf,0xf6,0xf7,0x2c,0xbf,0xfc,0x57,0x2d,0xff,0xc9,0x0f,0x45,0x0c,0x8e, +0x10,0x47,0xc8,0x22,0x7c,0x23,0xc2,0x23,0xfe,0xfa,0xdf,0x02,0xfa,0x57,0xe1,0x3f, +0xf5,0x3b,0x89,0x7f,0xbc,0x4e,0xbf,0xf1,0x7f,0x97,0x6d,0xfd,0x46,0xb6,0x0e,0xeb, +0x43,0x3b,0x2e,0x66,0xeb,0xb0,0xe9,0x40,0x1d,0xf6,0x9b,0x87,0x5b,0xeb,0xf4,0x1b, +0x6d,0xc0,0x8f,0x75,0xfa,0x8d,0xff,0xf3,0xbe,0xee,0x37,0xde,0xf0,0xb5,0xa9,0x3f, +0x37,0xd7,0xf9,0x69,0x7f,0x7e,0xff,0xd8,0xb9,0x59,0xe7,0x46,0x9d,0x7e,0xe3,0x08, +0x1a,0xf8,0xc6,0xe6,0xcf,0xd1,0xf9,0xbb,0xce,0xdf,0x75,0xfe,0x53,0x75,0xee,0x88, +0xb8,0x3b,0x82,0x1d,0xbb,0xbf,0xfe,0xdf,0x62,0x74,0xbc,0x1f,0xff,0xb7,0x98,0x7b, +0x23,0x7e,0xbd,0xce,0x98,0x9f,0xd4,0xb9,0x3f,0xc2,0x1f,0xe5,0x22,0xb0,0x7d,0x2f, +0x8e,0xff,0xad,0xf9,0x7f,0x4b,0x73,0x3e,0x02,0x3b,0x96,0x6e,0x35,0x77,0xfa,0xb3, +0xf7,0xfd,0x7b,0x2b,0xb9,0x5b,0xaf,0xba,0xfb,0x7f,0x56,0xf7,0xc6,0xfc,0xe2,0xe7, +0xff,0x3f,0xc8,0xf4,0xdf,0x83,0x6e,0xfd,0xbf,0x83,0x46,0x72,0xff,0x35,0x68,0xc4, +0xc8,0xb7,0xad,0x2a,0x78,0xd5,0xbc,0xcf,0xac,0x36,0x5a,0xed,0xb5,0xba,0x75,0x0b, +0x6c,0x7d,0xde,0x8f,0xea,0xb2,0xff,0x75,0x68,0x26,0xea,0x95,0xf1,0xde,0xe4,0xad, +0xb6,0xea,0x70,0xcf,0xb5,0xfa,0x2d,0xf3,0x9f,0x87,0x22,0x1e,0x8f,0x18,0x1f,0x31, +0x29,0xe2,0xd9,0x88,0x59,0x11,0xf3,0x22,0x16,0x46,0x2c,0x8a,0x58,0x1c,0x91,0x1a, +0x91,0x11,0xb1,0x22,0x62,0x6d,0x44,0x76,0x44,0x41,0xc4,0x96,0x88,0x1d,0x11,0xbb, +0x23,0x2a,0x23,0xaa,0x23,0x1a,0x22,0x5e,0x8f,0x68,0x8d,0x38,0x1a,0xd1,0x11,0x71, +0x3a,0xe2,0xbd,0x88,0xb3,0x11,0x5d,0x11,0x17,0x23,0x2e,0x47,0x7c,0x19,0xf1,0xed, +0x1f,0x9a,0xc1,0xb1,0xef,0x18,0x2f,0x6b,0xbe,0xd1,0xf4,0x1b,0x83,0xb4,0x16,0xda, +0x2f,0x34,0x43,0xb5,0xc1,0xdc,0xbb,0x3d,0xf6,0x7d,0x9e,0x95,0xd6,0x49,0xeb,0xaa, +0x1d,0xa2,0x95,0x69,0xfb,0x35,0x7c,0x2d,0xfb,0xe6,0xf1,0x2b,0xcd,0x35,0x8d,0x9d, +0x56,0xa2,0x75,0xd1,0xf6,0x47,0x2c,0xf2,0xb1,0x88,0xb4,0x8a,0xec,0x37,0xb2,0xf5, +0xfb,0x8d,0xfe,0xdc,0xbb,0x9e,0x2f,0xd8,0x77,0xb5,0xb7,0xaa,0x6f,0x1c,0xa8,0x8f, +0xd9,0x0a,0xb6,0x5c,0x7e,0xf4,0x66,0xe8,0xf2,0xf5,0xb7,0xa5,0xa6,0xfa,0x78,0x02, +0x03,0x53,0xfd,0x7e,0xe3,0x40,0x7d,0xf6,0xf8,0xcd,0xf5,0x17,0xf9,0xf4,0x1b,0x7f, +0xae,0x6f,0xb2,0xbf,0xdf,0xf8,0xaf,0xf4,0x4d,0xf6,0xe3,0xb9,0x8e,0xda,0x03,0xfd, +0x67,0xdf,0x57,0x0e,0xf4,0x9f,0xd5,0xff,0xd5,0xfe,0x5f,0xb7,0xfe,0xe7,0xfe,0xfb, +0xf7,0xea,0xf3,0x23,0x87,0x44,0xda,0x45,0x0e,0x8d,0x94,0x44,0x3a,0x45,0xba,0x44, +0xba,0x46,0xca,0x22,0x3d,0x22,0x6f,0x9c,0x9f,0xdf,0xf3,0x77,0x3e,0x8a,0x48,0x6b, +0x3c,0x21,0x4a,0x65,0x7e,0x91,0xbf,0x6f,0xcd,0x14,0x18,0xb9,0x44,0xa6,0x8d,0x0c, +0x8d,0x0c,0x8f,0x8c,0x8e,0xfc,0x5d,0x7f,0x9b,0x12,0x19,0x1f,0x79,0x47,0xe4,0x9f, +0xb3,0x92,0xb8,0x3b,0xf2,0xaf,0x5d,0x85,0xdc,0x1b,0x39,0x36,0x72,0x9a,0xcb,0x2f, +0x1f,0x1f,0x22,0x7e,0x22,0x72,0x7c,0xe4,0xc4,0x48,0x2f,0xd1,0x94,0xc8,0xe9,0x91, +0xee,0x4e,0xb3,0x23,0xe7,0x45,0x2e,0x88,0x2c,0xf1,0x7a,0x39,0xf2,0xb5,0xc8,0xc4, +0xc8,0xd4,0xc8,0xa5,0x91,0x99,0x91,0xd9,0xe2,0x55,0x91,0xeb,0x22,0xb3,0x23,0xf3, +0x23,0x37,0x47,0x6e,0x8b,0xb4,0x17,0x91,0xd3,0xce,0xc8,0x02,0xa9,0xad,0x53,0x91, +0x74,0x77,0xe4,0xcb,0x92,0x8a,0xc8,0xfd,0x91,0xb5,0x91,0x8d,0x91,0xaf,0x47,0x8e, +0x93,0x6a,0xc4,0x87,0x22,0x8f,0x44,0x1e,0x8b,0x3c,0x11,0x39,0xd0,0xfe,0xe9,0xc8, +0xb3,0x91,0x17,0x23,0xbf,0x8c,0xec,0x8f,0x14,0x44,0x89,0xa3,0x5c,0xa3,0xbc,0xa2, +0x7e,0xac,0x1f,0x18,0x15,0x1c,0xf5,0x5b,0xd7,0xcf,0x7f,0xf5,0xfa,0xfb,0xf7,0x7c, +0x6e,0x7d,0xcf,0xbf,0xa1,0x1f,0x16,0x15,0x15,0x65,0x88,0xba,0x2d,0xea,0xee,0x28, +0x99,0xea,0xbe,0xa8,0x07,0xa2,0x1e,0x8e,0x7a,0x3c,0x4a,0xae,0x7a,0x32,0x6a,0x42, +0xd4,0x33,0x51,0x4a,0xd5,0xf4,0xa8,0xd9,0x51,0xf3,0xa2,0x16,0x44,0xbd,0x12,0x95, +0x10,0x95,0x18,0x99,0x14,0x95,0x1e,0xb5,0x2c,0x6a,0x45,0xd4,0x9a,0x28,0x2b,0xf5, +0x86,0xa8,0xd1,0xa2,0xbc,0xa8,0xc2,0xa8,0xad,0x51,0x3b,0xa2,0x8e,0x44,0x96,0x46, +0x95,0x47,0x49,0xd5,0xec,0x6f,0x79,0xb8,0xaa,0xf7,0x45,0xd5,0x44,0x8d,0x55,0x34, +0x44,0x69,0x55,0xff,0x8c,0x3a,0x18,0xd5,0x16,0xf5,0x26,0x17,0x3a,0xa2,0x4e,0x47, +0xbd,0x1b,0xf5,0x61,0xd4,0xf9,0xa8,0x9e,0xa8,0x4b,0x51,0x97,0xa3,0xae,0x44,0x5d, +0x8d,0xba,0x16,0x65,0x8c,0xe2,0x45,0xf3,0xa3,0x6d,0xa2,0x85,0xd1,0x92,0x68,0x67, +0x04,0x4f,0xf5,0xf0,0x68,0x59,0xb4,0x3c,0x5a,0x19,0x1d,0xa9,0xf2,0x89,0x0e,0x88, +0xd6,0x46,0xe7,0x28,0x75,0xd1,0x91,0xd1,0xfa,0xe8,0xf8,0xe8,0x3b,0xa3,0x47,0x45, +0x8f,0x89,0x1e,0x1b,0xfd,0x68,0xf4,0x3f,0xa2,0x9f,0x8e,0x9e,0x1c,0x3d,0x25,0xf2, +0xd9,0xe8,0x99,0xd1,0x73,0xa3,0x5f,0x88,0x7e,0x39,0xfa,0xb5,0xe8,0xc4,0xe8,0xd4, +0xe8,0xa5,0xd1,0x99,0xd1,0xab,0xa2,0xd7,0x45,0x67,0x23,0xe4,0x47,0x17,0x45,0x17, +0x47,0xc7,0x2b,0x4a,0xa2,0xcb,0xa2,0xf7,0x46,0x57,0x47,0xd7,0x47,0xef,0x17,0x35, +0x47,0x1f,0x88,0x6e,0x14,0x1d,0x8e,0x3e,0x1a,0x7d,0x3c,0xfa,0x54,0xf4,0x3b,0xd1, +0x1f,0x46,0x9f,0x8f,0xee,0x8e,0xbe,0x18,0xfd,0x69,0xf4,0x17,0xd1,0x5f,0x47,0x7f, +0x17,0xdd,0x1f,0x6d,0x19,0x33,0x28,0x66,0x48,0x8c,0x30,0x46,0x12,0xe3,0x1c,0x33, +0x3c,0x66,0xbe,0xa7,0x2c,0xa6,0x5b,0xe4,0x19,0xe3,0x19,0xa3,0x8e,0xf1,0x43,0x08, +0x8a,0x09,0x89,0x89,0x88,0xd1,0xc7,0xc4,0xc7,0xdc,0x19,0x33,0x2a,0x66,0x4c,0xcc, +0xd8,0x98,0x47,0x63,0xc6,0xc5,0x3c,0x15,0x33,0x29,0x66,0x8c,0x6a,0x6a,0xcc,0xcc, +0x98,0xb9,0x31,0xcf,0xc7,0x3c,0xa4,0x7e,0x3e,0xe6,0xc5,0x98,0x47,0x55,0x8b,0x62, +0x98,0x98,0xe4,0x98,0xf4,0x98,0x71,0x2a,0xbe,0xe7,0xb2,0x98,0x15,0x31,0x6b,0x62, +0x36,0xc4,0xe4,0xc6,0x6c,0x8a,0xd9,0x12,0xb3,0x23,0xa6,0x34,0xa6,0x3c,0x66,0x5f, +0x4c,0x4d,0x4c,0x43,0xcc,0xeb,0x31,0x87,0x62,0x8e,0xc4,0x1c,0x8b,0x39,0x11,0x73, +0x3a,0xe6,0xdd,0x98,0x0f,0x63,0xce,0xc7,0x3c,0xa5,0xea,0x8e,0xb9,0x18,0x73,0x39, +0xe6,0x4a,0xcc,0xd5,0x98,0x6b,0x31,0x53,0x55,0xc6,0x18,0x9e,0x9e,0xaf,0xb7,0xd1, +0x0b,0xf5,0x12,0xbd,0xb3,0x7e,0xb8,0x9e,0xfd,0x5d,0x14,0x99,0x5e,0xae,0x57,0xea, +0x7d,0xf4,0x81,0xfa,0x60,0x7d,0x98,0x3e,0x4a,0x3f,0x43,0x65,0xd0,0xdf,0xae,0xbf, +0x5b,0x7f,0x9f,0x5e,0xe6,0xfd,0x80,0xfe,0x61,0xfd,0xe3,0xfa,0x27,0xf5,0x13,0xf4, +0x53,0xf4,0xd3,0xf5,0xb3,0xf5,0xf3,0xf4,0x0b,0xf5,0xaf,0xe8,0x13,0xf4,0x49,0xfa, +0x34,0x45,0x9a,0x3e,0x43,0xbf,0x42,0xbf,0x56,0x9f,0xad,0xcf,0xd7,0x17,0xe9,0x8b, +0xf5,0x25,0xfa,0x32,0x7d,0xa5,0x7e,0x8e,0xaa,0xd3,0xab,0x4a,0x5f,0xa7,0x6f,0xd2, +0xb7,0xe8,0x0f,0xeb,0x8f,0xea,0x8f,0xeb,0x4f,0xea,0x19,0xf5,0xdb,0xfa,0xf7,0xf5, +0xe7,0xf4,0x5d,0xfa,0x3e,0xfd,0xa7,0xfa,0x2b,0xfa,0xab,0xfa,0x64,0xf5,0x35,0xbd, +0x51,0xcf,0x33,0xf0,0x0d,0x36,0x06,0xa1,0x41,0x62,0x90,0x1a,0x5c,0x0d,0x23,0x0d, +0x0a,0x83,0xb7,0x61,0x99,0xda,0xdf,0xa0,0x31,0xe8,0x0c,0x91,0x06,0xbd,0xe1,0x36, +0xc3,0xdd,0x86,0xfb,0x0c,0x0f,0x18,0x1e,0x36,0x3c,0x8e,0xf0,0xa4,0x61,0x82,0x61, +0x8d,0xfa,0x19,0xc3,0x34,0xc3,0x2c,0xc3,0x73,0x86,0x17,0x0c,0x2f,0x1b,0x5e,0x33, +0x8c,0x51,0x24,0x19,0xd2,0x0d,0xcb,0x0c,0x2b,0x0d,0xeb,0x0c,0x39,0x86,0x02,0xc3, +0x2e,0x75,0x91,0x61,0xbb,0xa1,0xd4,0x50,0x61,0xa8,0x32,0xd4,0x21,0xec,0x51,0x2b, +0xbd,0x9b,0x0c,0x2d,0x86,0x56,0xc3,0x1b,0x86,0xe3,0x86,0x3a,0xcf,0x6a,0xf5,0x49, +0xc3,0xdb,0x86,0xf5,0xaa,0x0f,0x0c,0xe7,0x0d,0x97,0x94,0x3d,0x86,0x4b,0x86,0x22, +0xd5,0x65,0xc3,0x15,0xc3,0x55,0xc3,0xf7,0x08,0x16,0xb1,0xd6,0xb1,0x83,0x63,0xed, +0x63,0xc5,0xb1,0x4e,0xb1,0xc3,0x62,0x65,0xb1,0xf2,0x58,0x65,0xac,0x4f,0x6c,0x40, +0xac,0x36,0x36,0x2c,0x36,0x2a,0xd6,0x10,0x7b,0x5b,0xec,0x5d,0xb1,0xf7,0xc6,0xde, +0x1f,0xfb,0x70,0xec,0x13,0xb1,0xe3,0x63,0x27,0xc5,0x4e,0x8d,0x9d,0x19,0x3b,0x37, +0xb6,0x4e,0xf5,0x7c,0xec,0x4b,0xb1,0xaf,0xc5,0x26,0xc6,0xa6,0xc5,0x66,0xc4,0xae, +0x88,0x5d,0x13,0xbb,0x21,0x36,0x37,0x76,0x53,0xec,0x96,0xd8,0xed,0xb1,0xa5,0xb1, +0x15,0xb1,0x55,0xb1,0xea,0x98,0xfa,0xd8,0xe6,0xd8,0x03,0xb1,0x87,0x63,0x8f,0xc6, +0x1e,0x8f,0x3d,0x19,0xfb,0x76,0xec,0xfb,0xb1,0x67,0x63,0x3f,0x8a,0xed,0x8d,0x5d, +0xad,0xf8,0x24,0xf6,0xf3,0xd8,0xaf,0x62,0xbf,0x8d,0xfd,0x21,0xd6,0x22,0xae,0x55, +0x65,0x1d,0x37,0x38,0xce,0x2e,0x4e,0x14,0xe7,0x18,0x37,0x2c,0x4e,0x16,0xe7,0x19, +0xa7,0x8a,0xf3,0x8d,0x0b,0x8c,0x0b,0x8e,0x0b,0x8f,0x8b,0x8e,0x8b,0x8b,0xbb,0x23, +0xee,0x9e,0xb8,0x31,0x71,0x0f,0xc5,0x3d,0x16,0x57,0xec,0xf9,0x8f,0xb8,0xa7,0xe3, +0x26,0xc7,0x3d,0x1b,0x37,0x33,0x6e,0x6e,0xdc,0x49,0xf5,0xf3,0x71,0x2f,0xc6,0x2d, +0x8a,0x63,0xe2,0x92,0xe3,0xd2,0xe3,0x96,0xc5,0xad,0x88,0x1b,0x2d,0x59,0x13,0xb7, +0x31,0x2e,0x2f,0xae,0x30,0x6e,0x6b,0xdc,0x8e,0xb8,0xd2,0xb8,0x8a,0xb8,0xaa,0xb8, +0xba,0xb8,0xa6,0xb8,0x5e,0xf5,0xc7,0xea,0xe9,0x92,0x96,0xb8,0xc3,0x71,0x47,0xe3, +0x8e,0xc7,0x9d,0x8c,0x7b,0x3b,0xee,0x83,0xb8,0xf3,0x71,0xdd,0x71,0x17,0xe3,0x3e, +0x8d,0xbb,0x12,0xf7,0x99,0xfa,0x6a,0xdc,0xf7,0x71,0x16,0xf1,0xd6,0xf1,0x83,0xe3, +0xed,0xe2,0xc5,0xf1,0x4e,0xf1,0xc3,0xe2,0xdd,0xe2,0x3d,0xe2,0xbd,0xe2,0xbd,0xe3, +0xfd,0xe3,0xb5,0xf1,0xba,0xf8,0xc8,0x78,0x7d,0xfc,0x6d,0xf1,0x77,0xc5,0xdf,0x1b, +0x7f,0x7f,0xfc,0x43,0xf1,0x8f,0xc7,0x8f,0x8f,0x9f,0x18,0x3f,0x25,0x7e,0x7a,0xfc, +0x9c,0xf8,0xf9,0xf1,0x02,0x6f,0x81,0xf7,0x8b,0xf1,0x8b,0xe2,0x17,0xc7,0xa7,0xc4, +0x2f,0x89,0x5f,0x1e,0xbf,0x32,0x7e,0x6d,0xfc,0xc6,0xf8,0xbc,0x78,0x5b,0xef,0xcd, +0xf1,0xdb,0xe2,0x77,0xc6,0xef,0x8e,0xaf,0x88,0xdf,0x1f,0x5f,0x17,0xdf,0x14,0x7f, +0x20,0xbe,0x2d,0xde,0xdb,0xe1,0x58,0x7c,0x84,0xc3,0x89,0xf8,0xd3,0xf1,0xef,0xc6, +0x7f,0x18,0x3f,0xda,0xe1,0x7c,0xfc,0x9f,0xf1,0xfb,0x47,0x3f,0x7a,0x1b,0xc7,0xe6, +0xd2,0x64,0xd4,0x6c,0x34,0x5e,0x36,0xef,0x39,0xc3,0xc5,0x7a,0xf3,0x56,0xcf,0xcd, +0x77,0x36,0x1e,0xfd,0x68,0xaf,0xde,0x98,0x80,0x78,0x8c,0x91,0xfb,0xbf,0x42,0xcc, +0xf5,0x52,0xd7,0xd8,0xff,0x20,0x50,0xf0,0xad,0xd1,0xf8,0xc3,0xc1,0x2b,0x9f,0x36, +0x61,0xeb,0x87,0x4f,0xae,0x34,0x45,0x5a,0x50,0xbb,0x91,0xd7,0xff,0x29,0xb7,0xff, +0x93,0x2b,0x1f,0xb7,0x46,0x9f,0x96,0xb6,0x1a,0x5b,0x5a,0xa3,0x17,0xb3,0xda,0x7c, +0xe3,0x99,0x1f,0xb0,0xdf,0x78,0xe5,0x4c,0xf4,0xd3,0xba,0x76,0xb6,0x2d,0x6e,0xfb, +0x32,0xbb,0x3d,0xb7,0xdd,0x68,0x4f,0xdc,0x36,0x6b,0xdc,0x0f,0x9f,0x19,0xdb,0x91, +0x7e,0x6a,0x4c,0xf8,0x1e,0x4a,0x01,0x09,0xc9,0x4f,0x19,0x9b,0x8d,0xae,0xac,0x5d, +0x42,0xae,0x5f,0x67,0x8c,0x7c,0x2e,0x8d,0x4e,0x88,0xe6,0x2a,0x70,0x31,0xbb,0x91, +0x60,0xb6,0x2e,0xda,0x78,0x53,0x1f,0x64,0x6c,0xa7,0xcc,0x33,0x69,0xd9,0xcd,0xaf, +0x5d,0xd1,0x39,0x18,0x91,0x40,0x6c,0xb3,0xc6,0x33,0xec,0xff,0x85,0x41,0x6f,0x79, +0xa6,0xb2,0xc6,0xeb,0xff,0x47,0x49,0xcf,0xee,0x4f,0x30,0x0a,0x8d,0xc2,0xcf,0xb9, +0x4d,0x99,0xc9,0x3f,0x42,0xae,0xd5,0x56,0x73,0xa1,0x76,0x73,0xca,0x1a,0x50,0xc0, +0xb5,0xa1,0x37,0x7b,0x4f,0xc8,0xd9,0x7b,0xd3,0x47,0xf8,0x99,0x39,0xf3,0x8d,0xf1, +0xc2,0x4d,0xe7,0x07,0x8a,0x26,0xcf,0x9b,0xfe,0xcb,0x34,0x4e,0x03,0xdd,0xdc,0x74, +0x93,0x3b,0xd7,0x3c,0x25,0x98,0x3f,0xd7,0x8d,0xe3,0xde,0x51,0xdf,0xf8,0x70,0xd6, +0x9a,0x7b,0x99,0x70,0xf3,0xfb,0x58,0xe1,0xf5,0xf1,0x60,0x4a,0x65,0x46,0x9e,0xbe, +0xd9,0xdc,0x57,0xa3,0x90,0xe1,0xf6,0x34,0x19,0x5b,0xcc,0x7d,0x30,0xd5,0xd6,0x1b, +0xaf,0x98,0xfe,0x83,0x00,0x7d,0xc3,0x6e,0xbf,0xf6,0xda,0x6b,0x74,0x43,0xd9,0x54, +0x57,0xc8,0xfe,0xa7,0xe5,0x6f,0x06,0x14,0xcc,0x6f,0x81,0x2f,0x73,0x8d,0x54,0xa1, +0x8c,0xfe,0xa6,0x71,0xc8,0x4f,0xe3,0x92,0x2c,0xf6,0xa0,0xcc,0xe2,0xc6,0xfb,0x62, +0xfd,0x0d,0x8b,0xb9,0xbe,0x73,0x7f,0x01,0x2c,0x3c,0x7b,0xfd,0x1c,0xb0,0x71,0x93, +0xc9,0xe5,0xfa,0x1b,0xb5,0xe8,0x46,0xc7,0xb8,0x5e,0x63,0xbf,0x9e,0x1b,0x3e,0x4d, +0x2b,0xcd,0xc5,0xb9,0x4e,0x30,0xc6,0x81,0x37,0xd3,0xba,0x6f,0x4c,0xe2,0xc6,0x24, +0x93,0x77,0xaf,0xdb,0x85,0xf3,0xf1,0x3d,0x97,0x99,0xf3,0xd9,0x65,0xb8,0x52,0x9f, +0x86,0x91,0x61,0x71,0xf3,0x1b,0x6e,0xae,0xa1,0x6f,0x06,0xbc,0xa9,0xef,0x37,0x99, +0xcc,0x9a,0xc5,0x73,0xa3,0x7e,0x1c,0xb7,0xb8,0xf9,0xed,0x37,0xff,0x7b,0xb3,0x7d, +0xf0,0xef,0x8f,0xde,0x8c,0x9b,0x3c,0x17,0xc9,0xa3,0xef,0x4d,0x35,0xbe,0xbf,0x7e, +0x96,0x07,0xac,0xe1,0xce,0x11,0xeb,0x77,0xf6,0x90,0x7e,0xe0,0x62,0x3b,0xc3,0x27, +0x6e,0xb4,0xf2,0xae,0x5f,0xba,0x74,0xe3,0xec,0xb2,0xef,0x37,0x4d,0x57,0xa3,0xb9, +0x19,0x7c,0x12,0x1a,0xe0,0x80,0x81,0xff,0x47,0xc4,0x37,0xf2,0x4c,0xd7,0xe9,0x27, +0xd7,0x0a,0xc2,0x17,0x9f,0x6d,0x97,0xa1,0xfc,0x28,0xce,0x4f,0xc6,0xad,0x57,0x9b, +0x2c,0x06,0x99,0x94,0x2f,0xb3,0x75,0x59,0x9b,0x6f,0xf4,0x43,0xcf,0xb6,0xcc,0x43, +0x34,0xe0,0x27,0xee,0xca,0x10,0x9a,0x8e,0xf7,0xb0,0x67,0x29,0xe1,0xc7,0x6f,0xfd, +0xcd,0x7f,0xb9,0xcd,0x67,0x12,0xbe,0x98,0xc3,0xb6,0xff,0x6d,0x02,0x5d,0x37,0x89, +0xcc,0x2e,0xfe,0x5e,0x66,0xd2,0x31,0xde,0xf8,0xef,0x14,0x37,0x19,0xce,0x1d,0x33, +0xb5,0xc7,0x63,0xb5,0x7f,0x30,0x5d,0x52,0x37,0xc6,0x34,0x1a,0xe9,0xc7,0x35,0xc0, +0x75,0x37,0x61,0x2f,0x6b,0x6f,0x13,0x5b,0x26,0xe1,0xda,0x80,0x77,0x84,0x03,0x6d, +0x99,0xae,0x6f,0xae,0x81,0x56,0xd3,0x10,0x1e,0xf8,0x98,0xaf,0x2f,0x23,0xcf,0xe4, +0xdf,0x04,0x19,0x09,0x6f,0xf9,0xfd,0x05,0x9f,0x06,0x46,0x80,0xf9,0xaa,0x32,0x19, +0xd3,0x72,0xbd,0x40,0x02,0xa7,0xa9,0xd7,0x63,0x1e,0x68,0xbc,0x06,0x93,0xce,0x1a, +0xaf,0x8f,0x35,0x53,0x8b,0xc6,0x34,0x73,0x49,0xe6,0xc6,0x37,0x25,0x32,0x4a,0x20, +0xf3,0x65,0xcb,0x18,0x6f,0xb8,0x10,0x9f,0xcb,0x73,0x4c,0xaa,0x56,0xc8,0x2b,0xe9, +0xb3,0xeb,0x57,0xcd,0xc0,0xb5,0x21,0xfc,0xde,0x74,0x7d,0x58,0xd0,0xcd,0xf7,0xee, +0x84,0x7e,0x73,0x6b,0x66,0x5d,0xf3,0x15,0x69,0xea,0xbf,0x90,0xbe,0xe9,0x37,0xfd, +0xaf,0xe7,0x84,0xb3,0xac,0x07,0x98,0x9b,0x7a,0x29,0x43,0x0b,0x2d,0x37,0x8f,0xce, +0xeb,0xbd,0x4f,0xa2,0x1f,0xdf,0x81,0xd2,0x4c,0x63,0xd7,0x34,0x9a,0x13,0xe6,0x18, +0x13,0x0a,0xcc,0x66,0xc3,0xdb,0x2d,0x37,0xff,0x9f,0x16,0xd3,0x47,0x36,0x90,0x33, +0x9b,0xc5,0x33,0xd9,0x94,0x30,0x30,0x2f,0x37,0xed,0x6e,0x36,0x95,0xf9,0x1c,0x76, +0x98,0xee,0xcf,0x42,0x0b,0x1a,0x18,0x41,0xec,0x79,0xbd,0x7e,0x8d,0xe3,0x0e,0xca, +0x33,0x5f,0x61,0xdc,0x1e,0x0c,0xcb,0x81,0xbb,0x6e,0xc2,0x39,0xdc,0x6b,0xd9,0xab, +0xd5,0x78,0xf5,0xfa,0xed,0xef,0xc6,0x77,0x6a,0x37,0xee,0xe1,0x34,0x81,0x26,0xd2, +0x24,0x9a,0x4c,0xcf,0xd0,0x14,0x9a,0x4a,0xcf,0xd2,0x34,0x9a,0x4e,0x33,0x68,0x26, +0xcd,0xa2,0xd9,0x34,0x87,0xe6,0xd2,0x73,0x34,0x8f,0xe6,0xd3,0xf3,0xf4,0x02,0x2d, +0xa0,0x85,0xf4,0x22,0xbd,0x44,0x2f,0x93,0x3b,0xb9,0x1f,0x4d,0x07,0xc9,0xa4,0xc1, +0xd2,0xd1,0xfd,0xe8,0x62,0x3a,0x56,0x8f,0xa4,0x18,0x2b,0xc9,0xa0,0xf3,0x8b,0x93, +0x83,0xb9,0x18,0x87,0xb8,0x7c,0xcb,0x26,0x6a,0x29,0xa4,0x96,0xcd,0xd4,0x52,0x44, +0x2d,0x5b,0xa8,0x65,0x2b,0xb5,0x6c,0xa3,0x96,0x62,0x6a,0xd9,0x4e,0x2d,0x3b,0xa8, +0x65,0x27,0xb5,0x94,0x50,0xcb,0x2e,0x6a,0x29,0xa5,0x96,0xdd,0xd4,0x52,0x46,0x2d, +0x7b,0xa8,0xa5,0x9c,0x5a,0x2a,0xa8,0xa5,0x92,0x5a,0xf6,0x52,0xcb,0x3e,0x6a,0xd9, +0x4f,0x2d,0xd5,0xd4,0x52,0x43,0x2d,0xb5,0xd4,0x52,0x47,0x2d,0xf5,0xd4,0xd2,0x40, +0x2d,0x8d,0x74,0x60,0x31,0x1d,0x48,0xa2,0x03,0x29,0x74,0x20,0x8d,0x0e,0x2c,0xa1, +0x03,0x19,0x74,0x60,0x39,0x1d,0xc8,0xa2,0x03,0x2b,0xe9,0xc0,0x6a,0x3a,0xb0,0x96, +0x0e,0xac,0xa7,0x03,0x1b,0xe9,0x40,0x0e,0x1d,0xc8,0xa3,0x03,0x05,0x74,0xa0,0x90, +0x0e,0x14,0xd1,0x81,0xad,0x74,0xa0,0x98,0x0e,0xec,0xa0,0x03,0x25,0x74,0xa0,0x94, +0x0e,0x94,0xd1,0xb4,0xa3,0x69,0x34,0x6d,0x3a,0x1d,0xd8,0x47,0x07,0xaa,0xe8,0x40, +0x2d,0x1d,0xa8,0xa7,0x03,0x8d,0x34,0xf3,0xf5,0x2a,0x3a,0x98,0x48,0x07,0x93,0xe9, +0x60,0x2a,0x1d,0x4c,0xa7,0x23,0xf5,0xb3,0xe9,0x60,0x06,0x1d,0x5c,0x4e,0x07,0xb3, +0xe8,0xe0,0x4a,0x3a,0xb8,0x9a,0x0e,0xae,0xa5,0x83,0xeb,0xe9,0xe0,0x46,0x3a,0x98, +0x43,0x07,0xf3,0xe8,0x60,0x01,0x1d,0x2c,0xa4,0x83,0x45,0x74,0x70,0x2b,0x1d,0x2c, +0xa6,0x83,0x3b,0xe8,0x60,0x09,0x1d,0x2c,0xa5,0x83,0x65,0x74,0xb0,0x9c,0x0e,0x56, +0xd2,0xc1,0x7d,0x74,0xb0,0x8a,0x5a,0x9a,0xe8,0x60,0x2d,0x1d,0xac,0xa7,0x83,0x8d, +0xd4,0xb6,0x9a,0x0e,0x25,0xd1,0xa1,0x14,0x6a,0x5b,0x43,0x87,0xd2,0xa9,0x6d,0x1d, +0xb5,0xad,0xa7,0x43,0xcb,0xa8,0x35,0x8f,0xda,0x36,0x52,0x5b,0x0e,0x1d,0x5a,0x45, +0x6d,0x9b,0xa8,0xad,0x88,0xda,0x76,0x50,0xdb,0x76,0x3a,0x84,0x9d,0x65,0xd4,0x56, +0x41,0x6d,0xfb,0xe8,0x50,0x21,0x1d,0x2a,0xa2,0x43,0x5b,0xe9,0x08,0x43,0x87,0xb6, +0xd3,0x11,0xb4,0x53,0x4a,0x47,0xd2,0xe9,0xd0,0x1e,0x3a,0xb2,0x94,0x8e,0x64,0xd0, +0xa1,0xbd,0x74,0x68,0x3f,0x1d,0x59,0x45,0x87,0x6a,0xe8,0x50,0x03,0x4d,0x86,0xde, +0xcc,0xe9,0x34,0x7b,0x3a,0xb5,0x66,0x52,0xeb,0x0a,0x6a,0x5d,0x45,0xad,0x6b,0xa8, +0x75,0x1d,0xb5,0x6e,0xa0,0xd6,0x6c,0x6a,0xcd,0xa5,0xd6,0x02,0x6a,0x2d,0xa4,0xd6, +0x22,0x6a,0xdd,0x4a,0xad,0xc5,0xd4,0xba,0x83,0x5a,0x4b,0xa8,0xb5,0x94,0x5a,0xcb, +0x68,0xf2,0xcb,0xd4,0x0a,0xc9,0xb5,0x74,0xa8,0x89,0x5a,0x6b,0xa8,0xb5,0x8e,0x5a, +0x1b,0xa8,0xb5,0x89,0x0e,0x2f,0xa6,0xc3,0x49,0x74,0x38,0x85,0x0e,0xa7,0xd1,0xe1, +0x25,0x74,0x38,0x83,0x0e,0x2f,0xa7,0xc3,0x59,0x74,0x78,0x25,0x1d,0x5e,0x4d,0x87, +0xd7,0xd2,0xe1,0xf5,0x74,0x78,0x23,0x1d,0xce,0xa1,0xc3,0x79,0x74,0xb8,0x80,0x0e, +0xe5,0xd3,0xe1,0x22,0x3a,0xbc,0x95,0x0e,0x17,0xd3,0xe1,0x1d,0x74,0xb8,0x84,0x0e, +0x97,0xd2,0xe1,0x32,0x3a,0x5c,0x4e,0x87,0x2b,0xe9,0x7c,0x39,0x0e,0xd4,0xd3,0xa1, +0x6c,0xe4,0xb6,0x51,0x5b,0x22,0x1d,0x62,0xe8,0xc8,0x12,0x3a,0xb2,0x8c,0xda,0xd2, +0xa8,0x6d,0x09,0xb5,0x65,0x50,0xdb,0x72,0x6a,0xcb,0xa2,0x36,0x1c,0xad,0xa1,0xb6, +0x3a,0x3a,0xb2,0x18,0x03,0x2f,0x15,0xa4,0x81,0xa5,0x60,0x3b,0x48,0x02,0x19,0x74, +0x64,0x2d,0x1d,0x65,0x08,0x83,0xf3,0xe8,0x6a,0x3a,0x9a,0xce,0x0e,0xd2,0x1a,0x7a, +0xb3,0x9c,0xde,0xac,0xa4,0x23,0xc8,0x54,0x91,0x3b,0xb6,0x23,0xa9,0xbd,0x92,0x1d, +0xcc,0xec,0xd1,0x5d,0x84,0x33,0x7e,0xac,0x94,0x8e,0xed,0xa6,0x63,0x65,0xd4,0xbe, +0x8c,0xda,0x97,0x53,0x7b,0x26,0x1d,0x2b,0xa7,0x63,0x15,0x74,0xac,0x92,0x8e,0xed, +0xa5,0x63,0xfb,0xe8,0xd8,0x7e,0x3a,0x86,0x62,0xd5,0x74,0xac,0x96,0x8e,0xd5,0xd1, +0xb1,0x06,0x3a,0xd6,0x48,0xc7,0x9a,0xa8,0x9d,0xa1,0xf6,0xc5,0xd4,0x9e,0x44,0xed, +0xc9,0xd4,0x9e,0x42,0xed,0xa9,0xd4,0x9e,0x46,0xed,0xe9,0xd4,0xbe,0x84,0xda,0x97, +0x52,0x7b,0x06,0xb5,0xaf,0xa7,0xf6,0x8d,0xd4,0x9e,0x43,0xed,0x79,0xd4,0x5e,0x40, +0xed,0x85,0xd4,0x5e,0x44,0xed,0x5b,0xa9,0xbd,0x98,0xda,0x77,0x50,0x7b,0x09,0xb5, +0x97,0x52,0x3b,0x74,0xab,0xa9,0xbd,0x8e,0xde,0xc4,0x4f,0x3d,0xbd,0xd9,0x40,0x1d, +0x2b,0xa8,0x63,0x25,0x75,0xac,0xa2,0x8e,0xd5,0xd4,0xb1,0x86,0x3a,0xd6,0x52,0xc7, +0x3a,0xea,0x58,0x4f,0x1d,0x1b,0xa8,0x63,0x23,0x75,0x64,0x53,0x47,0x0e,0x75,0xe4, +0x52,0x47,0x1e,0x75,0xe4,0x53,0x47,0x01,0x1d,0xdf,0x43,0xc7,0xcb,0xe9,0x78,0x05, +0x1d,0xaf,0xa4,0xe3,0x7b,0xe9,0xf8,0x3e,0x3a,0xbe,0x9f,0x8e,0x57,0xd1,0xf1,0x6a, +0x3a,0x5e,0x43,0xc7,0x6b,0xe9,0x78,0x1d,0x1d,0xaf,0xa7,0xe3,0x0d,0x74,0xbc,0x91, +0x8e,0x37,0x51,0x07,0x43,0x1d,0x8b,0xa9,0x23,0x91,0x3a,0x92,0xa8,0x23,0x99,0x3a, +0x52,0xa8,0x23,0x95,0x3a,0xd2,0xa8,0x23,0x9d,0x3a,0x96,0x50,0xc7,0x52,0xea,0xc8, +0xa0,0x8e,0x65,0xd4,0xb1,0x9c,0x3a,0x32,0xa9,0x23,0x8b,0x3a,0x0a,0xa9,0xa3,0x88, +0x3a,0xb6,0x52,0x47,0x31,0x75,0xec,0xa0,0x8e,0x12,0xea,0x28,0xa5,0x8e,0x32,0xea, +0x28,0xa7,0x8e,0x4a,0xea,0xd8,0x47,0x1d,0x55,0xd4,0x51,0x43,0x1d,0x75,0xd4,0x01, +0xe3,0x9b,0xe8,0xc4,0x62,0x3a,0x91,0x41,0x27,0x96,0xd3,0x89,0x2c,0x3a,0xb1,0x92, +0x4e,0xac,0xa6,0x13,0x6b,0xe9,0xc4,0x7a,0x3a,0xb1,0x91,0x4e,0xe4,0xd0,0x89,0x3c, +0x3a,0x51,0x40,0x27,0x0a,0xe9,0x44,0x11,0x9d,0xd8,0x4a,0x27,0x8a,0xe9,0xc4,0x0e, +0x3a,0x51,0x42,0x27,0x4a,0xe9,0x44,0x19,0x9d,0x28,0xa7,0x13,0x95,0x74,0x62,0x1f, +0x9d,0xa8,0xa2,0x13,0x35,0x74,0xa2,0x8e,0x4e,0x34,0xd0,0x89,0x26,0xea,0xcc,0xa2, +0xce,0x44,0xea,0x4c,0xa6,0xce,0x54,0xea,0x4c,0xa7,0xce,0xa5,0xd4,0xb9,0x8c,0x3a, +0x33,0xa9,0x73,0x25,0x75,0xae,0xa6,0xce,0xb5,0xd4,0xb9,0x9e,0x3a,0x37,0x52,0x67, +0x0e,0x75,0xe6,0x51,0x67,0x01,0x75,0x16,0x52,0x67,0x11,0x75,0x6e,0xa5,0xce,0x62, +0xea,0xdc,0x41,0x9d,0x25,0xd4,0x59,0x4a,0x9d,0x65,0xd4,0x59,0x4e,0x9d,0x95,0xd4, +0xb9,0x8f,0x3a,0xab,0xa8,0xb3,0x86,0x3a,0xeb,0xa8,0xb3,0x81,0x3a,0x9b,0xe8,0xe4, +0x62,0x3a,0x99,0x44,0x27,0x53,0xe8,0x64,0x1a,0x9d,0x5c,0x42,0x27,0x33,0xe8,0xe4, +0x72,0x3a,0x99,0x45,0x27,0x57,0xd2,0xc9,0xd5,0x74,0x72,0x2d,0x9d,0x5c,0x4f,0x27, +0x37,0xd2,0xc9,0x1c,0x3a,0x99,0x47,0x27,0x0b,0xe8,0x64,0x21,0x9d,0x2c,0xa2,0x93, +0x5b,0xe9,0x64,0x31,0x9d,0xdc,0x41,0x27,0x4b,0xe8,0x64,0x29,0x9d,0x2c,0xa3,0x53, +0x85,0x74,0x6a,0x33,0x9d,0x2a,0xa2,0x53,0x5b,0xe8,0xd4,0x56,0x3a,0xb5,0x8d,0x4e, +0x15,0xd3,0xa9,0xed,0x74,0x6a,0x07,0x9d,0xda,0x49,0xa7,0x4a,0xe8,0xd4,0x2e,0x3a, +0x55,0x4a,0xa7,0x76,0xd3,0x29,0x14,0xde,0x43,0xa7,0xca,0xe9,0x54,0x05,0x9d,0xaa, +0xa4,0x53,0x7b,0xe9,0xd4,0x3e,0x3a,0xb5,0x9f,0x4e,0x55,0xd1,0xa9,0x6a,0x3a,0x55, +0x43,0xa7,0x6a,0xe9,0x54,0x1d,0x9d,0xaa,0xa7,0x53,0x0d,0x74,0xaa,0x91,0x4e,0x35, +0xd1,0x69,0x86,0x4e,0x2f,0xa6,0xd3,0x89,0x74,0x3a,0x89,0x4e,0x27,0xd3,0xe9,0x14, +0x3a,0x9d,0x0a,0x15,0xec,0x78,0xbb,0xf8,0x9d,0xbd,0xf4,0x4e,0x3a,0xa2,0xf7,0xd2, +0xd8,0xdc,0x52,0x44,0x67,0xb7,0xac,0x3d,0xbb,0xa5,0x1e,0xc9,0x3a,0x53,0xb2,0xde, +0x94,0xe4,0x9a,0x92,0x42,0x53,0xb2,0xd9,0x94,0x94,0x98,0x92,0x32,0x2e,0xd9,0x56, +0x78,0x76,0x1b,0x9b,0x6c,0x36,0x25,0x65,0x5c,0xb2,0xbd,0xe2,0xec,0x76,0x36,0xa9, +0x36,0x25,0xeb,0x4c,0xc9,0x7a,0x53,0x92,0x6b,0x4a,0x4a,0xb8,0x64,0x57,0xe1,0xd9, +0x5d,0x6c,0xb2,0x99,0x4b,0x6a,0x96,0x9f,0xad,0xae,0xa0,0xb3,0x75,0xcb,0xcf,0xd6, +0x22,0xa9,0x2d,0x39,0x5b,0xbb,0xd1,0x94,0x14,0xd2,0xd9,0xfa,0x0c,0x3a,0xdb,0x90, +0x78,0xb6,0xb1,0x0a,0xc9,0x32,0x53,0xb2,0xd2,0x94,0xac,0x33,0x25,0x39,0xa6,0x84, +0x39,0xdb,0xb8,0x0f,0x49,0xf9,0xd9,0x86,0x0a,0x53,0x82,0xce,0x35,0x56,0x9c,0x6d, +0x64,0xb8,0x04,0x3b,0xb8,0x5c,0xe5,0x40,0x62,0xde,0x31,0xb0,0x7f,0x15,0xd7,0x48, +0x63,0xae,0x29,0x29,0x34,0x25,0xdb,0x4c,0x49,0x89,0x29,0x59,0xc1,0x0a,0x9c,0xdf, +0xcb,0x80,0xc5,0x20,0x11,0x24,0x81,0x64,0x90,0x02,0x52,0x41,0x1a,0x48,0x07,0x4b, +0xc0,0x52,0x90,0x01,0x96,0x81,0xe5,0x20,0x13,0x64,0x81,0x15,0x60,0x25,0x58,0x05, +0x56,0x83,0x35,0x60,0x2d,0x58,0x07,0xd6,0x83,0x0d,0x60,0x23,0xc0,0xad,0x6e,0x6f, +0x0e,0xc8,0x05,0x79,0x20,0x1f,0x14,0x80,0x4d,0xa0,0x10,0x6c,0x06,0x45,0x60,0x0b, +0xd8,0x0a,0x8a,0x41,0x29,0x9d,0x4b,0xca,0xa5,0x73,0x59,0x7b,0x40,0x39,0xa8,0x00, +0x95,0x60,0x2f,0xd8,0x47,0x17,0x37,0x66,0xd0,0xb9,0x8a,0xa5,0x28,0xb3,0x02,0xac, +0x04,0xab,0xc0,0x6a,0xb0,0x06,0xac,0x05,0xeb,0xc0,0x7a,0xb0,0x01,0x6c,0x04,0xd9, +0x20,0x07,0xe4,0x81,0x7c,0x50,0x00,0x36,0x81,0x42,0xb0,0x19,0x14,0x81,0x2d,0x60, +0x2b,0xd8,0x06,0x8a,0xc1,0x76,0xb0,0x03,0xec,0x04,0x25,0x60,0x17,0x60,0xed,0xda, +0x0d,0xca,0x00,0x6c,0x4b,0x82,0x6d,0x49,0xb0,0x2d,0x09,0xb6,0x25,0xc1,0xb6,0xa4, +0x7d,0x60,0x3f,0xa8,0x02,0xd5,0xa0,0x06,0xd4,0x82,0x06,0xd0,0x08,0x9a,0xa8,0x6d, +0x05,0xb5,0xc1,0x62,0x78,0xbd,0x0d,0x1d,0x84,0xb3,0xce,0xc1,0x59,0xe7,0xe0,0x98, +0x73,0xe8,0x7c,0x1b,0x9e,0x85,0x6b,0xa9,0xad,0x80,0xda,0x0a,0xa9,0x0d,0x9b,0x90, +0xde,0x87,0x27,0x00,0x1e,0x95,0x10,0xde,0x9f,0x42,0x47,0x70,0xa4,0x9c,0xda,0xf6, +0x50,0x5b,0x25,0xb5,0xed,0xa5,0xb6,0x6a,0x3a,0x82,0x27,0x08,0x8c,0x83,0x73,0x8f, +0xac,0xa0,0x23,0x68,0xb8,0x7a,0x31,0x48,0x02,0x29,0x20,0x0d,0x2c,0x01,0x70,0x57, +0xf5,0x72,0x90,0x05,0xd8,0x32,0x70,0x55,0x35,0xdc,0x54,0x0d,0xe5,0x6a,0xb8,0xa7, +0x1a,0xae,0xa9,0x86,0x05,0xd5,0x70,0x4b,0x35,0x5c,0x52,0x0d,0x77,0x54,0xc3,0x15, +0xd5,0x70,0x43,0x35,0x5c,0x50,0x0d,0x85,0x6a,0x58,0x50,0x8d,0x6e,0x57,0xa3,0xcb, +0xd5,0xe8,0x6e,0x35,0xba,0x5a,0x8d,0x6e,0x56,0xa3,0x8b,0xd5,0x75,0x00,0x5d,0xac, +0x6e,0xa2,0x73,0x35,0xd0,0xaf,0x81,0x7e,0x0d,0xf4,0x6b,0xa0,0x5f,0x03,0xfd,0x1a, +0xe8,0xd7,0x40,0xbf,0x06,0xfa,0x35,0xd0,0xaf,0x81,0x7e,0x0d,0xf4,0x6b,0xa0,0x5f, +0x03,0xfd,0x1a,0xe8,0xd7,0x40,0xbf,0x06,0xfa,0x35,0xd0,0xaf,0x81,0x7e,0x0d,0xf4, +0x6b,0xa0,0x5f,0x03,0xfd,0x1a,0xe8,0xd7,0x40,0xbf,0x06,0xfa,0x35,0xd0,0xaf,0x81, +0x7e,0x0d,0xf4,0x6b,0xa0,0x5f,0x03,0xfd,0x1a,0xe8,0xd7,0x40,0xbf,0x06,0xfa,0xb5, +0xd0,0xaf,0x85,0x7e,0x2d,0xf4,0x6b,0xa1,0x5f,0x0b,0xfd,0x5a,0xe8,0xd7,0x42,0xbf, +0x16,0xfa,0xb5,0xd0,0xaf,0x85,0x7e,0xed,0x5a,0x9a,0x70,0xa4,0x91,0x5a,0x20,0x89, +0x8b,0xf3,0x5c,0x2d,0x24,0x6b,0x21,0x59,0x0b,0xc9,0x5a,0x48,0xd6,0x42,0xb2,0x16, +0x92,0xb5,0x90,0xac,0x85,0x64,0x2d,0x24,0x6b,0x21,0x59,0x0b,0xc9,0x5a,0x48,0xd6, +0x42,0xb2,0x16,0x92,0xb5,0x90,0xac,0x83,0x64,0x1d,0x24,0xeb,0x20,0x59,0x07,0xc9, +0x3a,0x48,0xd6,0x41,0xb2,0x0e,0x92,0x75,0x90,0xac,0x83,0x64,0x1d,0x24,0xeb,0xd0, +0xe5,0x3a,0x74,0xb9,0x0e,0x5d,0xae,0x43,0x97,0xeb,0xd0,0xe5,0x3a,0xe8,0xd7,0x41, +0xbf,0x0e,0xfa,0x75,0xd0,0xaf,0x83,0x7e,0x1d,0xf4,0xeb,0xa0,0x5f,0x07,0xfd,0x3a, +0xe8,0xd7,0x41,0xbf,0x0e,0xfa,0x75,0xd0,0xaf,0x83,0x7e,0x1d,0xf4,0xeb,0xa0,0x5f, +0x07,0xfd,0x3a,0xe8,0xd7,0x33,0x00,0x36,0xd4,0x27,0x02,0xd8,0x51,0x9f,0x0c,0x60, +0x4b,0x7d,0x2a,0x80,0x3d,0xf5,0xb8,0x4a,0xea,0x61,0x43,0x3d,0xae,0x92,0x7a,0xd8, +0x51,0x8f,0xab,0xa4,0x1e,0xb6,0xd4,0xe3,0x0a,0xa8,0x87,0x76,0x3d,0xae,0x80,0x7a, +0xe8,0xd7,0xe3,0x0a,0xa8,0x87,0x0d,0xf5,0xb8,0x02,0xea,0x61,0x47,0x3d,0x46,0x78, +0x3d,0xb4,0xeb,0x31,0xc2,0xeb,0xa1,0x5f,0x8f,0x11,0x5e,0x0f,0x1b,0xea,0x31,0xc2, +0xeb,0x61,0x47,0x03,0x74,0x1b,0xa0,0xdb,0x00,0xdd,0x06,0xe8,0x36,0x40,0xb7,0x01, +0xba,0x0d,0xd0,0x6a,0x80,0x4e,0x03,0x34,0x1a,0xd0,0xdf,0x06,0xe8,0x34,0x40,0xa7, +0x01,0x3a,0x0d,0xd0,0x69,0x80,0x4e,0x03,0x74,0x1a,0xa0,0xd3,0xc0,0xea,0x30,0x98, +0xa7,0xa0,0x07,0x5c,0x9c,0xc8,0xc5,0x49,0x5c,0x9c,0xcc,0xc5,0x29,0x5c,0x9c,0xca, +0xc5,0x69,0x5c,0xbc,0x89,0x8b,0x0b,0xb9,0x78,0x33,0x17,0x17,0x71,0xf1,0x16,0x2e, +0xde,0xca,0xc5,0xdb,0xb8,0xb8,0x98,0x8d,0x1b,0xb8,0xf2,0x0d,0x5c,0xf9,0x06,0xae, +0x7c,0x03,0x57,0xbe,0x81,0x2b,0xdf,0xc0,0x95,0x6f,0xe0,0xca,0x37,0x98,0xca,0xef, +0x41,0x7c,0xac,0x9c,0x8d,0x76,0xb1,0xdb,0x8d,0xfb,0xb9,0x18,0xde,0x68,0x2c,0x67, +0x8f,0x62,0x3a,0xb5,0x9a,0xdc,0xdf,0x4c,0x64,0xa7,0x55,0x6f,0xb2,0x7d,0xdf,0xcb, +0x16,0xad,0x62,0xa3,0xdd,0x6c,0xc9,0x26,0xce,0x56,0xdc,0xbd,0x71,0x84,0x2d,0x8b, +0x39,0x1a,0x1b,0xb3,0xf3,0xb8,0xd5,0x28,0x7f,0x0c,0xa7,0xa3,0x89,0x85,0x75,0xd3, +0x7e,0xec,0x5c,0xc3,0x15,0x58,0xc3,0x15,0x58,0xc3,0x16,0x80,0x52,0x13,0x7c,0xd6, +0xc4,0xfa,0x0c,0x77,0x8f,0xa6,0xad,0xdc,0x04,0x8e,0xa1,0xa7,0xb1,0x5d,0x8f,0xb6, +0xdb,0x97,0xb0,0x51,0x26,0xa7,0xc5,0xd9,0xd6,0x50,0xcd,0x1e,0x61,0xab,0xd3,0x79, +0x66,0x05,0x52,0x4c,0x34,0x99,0x0a,0xfc,0x98,0x13,0x53,0x6e,0x1f,0x7e,0xcc,0x09, +0x9b,0x1b,0x39,0x12,0x05,0x53,0x88,0x5d,0xc2,0x8e,0xa4,0x91,0xfa,0x1b,0x45,0xd9, +0xd2,0x81,0x14,0x4c,0x21,0x14,0x4a,0x3a,0x0a,0xa3,0x70,0xf2,0xa1,0xf3,0xe9,0xab, +0x28,0x9a,0x54,0xa4,0xa6,0x79,0xf3,0x69,0x42,0xc0,0x24,0x30,0x9f,0x5e,0xdf,0x33, +0x89,0x26,0x05,0xcc,0x01,0x2f,0x20,0x3f,0x85,0x66,0xcf,0xa1,0xf9,0xb3,0xe8,0xf9, +0x67,0x66,0xd2,0xf3,0xb3,0xe8,0x7c,0x4a,0x26,0xbd,0xb5,0x82,0xde,0x5a,0x49,0x6f, +0xad,0xa2,0xb7,0x56,0xd3,0x94,0x09,0x2f,0xa2,0x95,0x95,0xdc,0xca,0x49,0xc7,0xc5, +0xe1,0x5c,0x1c,0x14,0xc8,0x25,0x5a,0xd2,0x70,0x31,0x9b,0x0f,0xe1,0xf2,0x21,0xdc, +0xf2,0x2a,0x84,0x82,0xb9,0x98,0xdd,0x1f,0x4a,0x21,0x5c,0xcc,0xe6,0xc3,0xb8,0xa3, +0x61,0xdc,0x9e,0x30,0xd2,0x71,0x31,0xbb,0x9f,0xa6,0x4d,0xc3,0x0f,0x58,0x40,0x0b, +0xa6,0xe1,0x87,0x03,0x9b,0x2f,0xd2,0x8b,0xd3,0xf0,0x33,0x8d,0xce,0xa7,0x26,0x53, +0x20,0x27,0x75,0x3e,0xbd,0x04,0x3f,0xe6,0xc4,0x94,0xdb,0x8d,0x1f,0x73,0xc2,0xe6, +0x2e,0x30,0xe9,0x60,0x09,0xb1,0x36,0x62,0xe5,0xa7,0xa1,0x20,0x18,0x88,0xc5,0x1f, +0xcc,0x81,0x15,0xe8,0x05,0x34,0xc3,0x49,0x13,0x48,0xaa,0x20,0x35,0xa9,0x34,0x40, +0x0b,0x82,0x41,0x08,0x08,0x05,0x3a,0x10,0x06,0xc2,0x41,0x50,0x20,0x1b,0xb1,0x25, +0x83,0xd8,0xa2,0x41,0x6c,0xd9,0x20,0xb6,0x70,0x10,0x5b,0x3a,0x88,0x2d,0x1e,0xc4, +0x96,0x0f,0x62,0x2b,0x04,0xb1,0x35,0x34,0x6c,0x8d,0x09,0x60,0x22,0x98,0x04,0x26, +0x83,0x67,0xc0,0x14,0x30,0x15,0x3c,0x0b,0xa6,0x81,0xe9,0x60,0x06,0x98,0x09,0x66, +0x81,0xd9,0x60,0x0e,0x98,0x0b,0x9e,0x03,0xf3,0xc0,0x7c,0xf0,0x3c,0x78,0x01,0x2c, +0x00,0x0b,0xc1,0x8b,0xe0,0x25,0xf0,0xb2,0xfa,0x86,0x1b,0x58,0x4f,0x44,0x44,0x44, +0x53,0x34,0xfb,0x13,0x4d,0xe7,0x4b,0xf2,0x8e,0x56,0xd3,0xf9,0x3d,0x7b,0x40,0x39, +0xc0,0x48,0xda,0x83,0xe1,0xb5,0x67,0x2f,0xc0,0x70,0xda,0xb3,0x1f,0x54,0x01,0xb6, +0x4c,0x0d,0xa8,0x05,0x75,0xa0,0x1e,0x34,0x80,0x46,0xd0,0x84,0xd5,0x0e,0xa6,0x1b, +0xe5,0x98,0x6e,0x94,0x63,0xba,0x51,0x8e,0xe9,0x46,0x39,0xa6,0x1b,0xe5,0x98,0x6e, +0x94,0x63,0xba,0x51,0x8e,0xe9,0x46,0x39,0xa6,0x1b,0xe5,0x98,0x6e,0x94,0x63,0xba, +0x51,0x8e,0xe9,0x46,0x39,0xa6,0x1b,0xe5,0x98,0x6e,0x94,0x63,0xba,0x51,0x8e,0xe9, +0x46,0x39,0xa6,0x1b,0xe5,0x98,0x6e,0x94,0x63,0xba,0x51,0x8e,0xe9,0x46,0x39,0x86, +0x7a,0x39,0xa6,0x1b,0xe5,0x98,0x6e,0x94,0x63,0xba,0x51,0x8e,0xe9,0x46,0x39,0xa6, +0x1b,0xe5,0xec,0xca,0x0a,0xd3,0x8d,0x72,0x4c,0x37,0xca,0x31,0xdd,0x28,0xc7,0x74, +0xa3,0x1c,0xd3,0x8d,0x72,0x3c,0x51,0x71,0x4f,0xdd,0xd7,0x40,0x6d,0xb0,0xaa,0x7c, +0x3b,0xd8,0x09,0x76,0x01,0x76,0x55,0xb6,0x9f,0x0e,0xe3,0xd9,0x0c,0x1b,0x2b,0x60, +0x63,0x05,0xec,0xab,0x80,0x6d,0x15,0xb0,0xab,0x02,0x36,0x55,0xc0,0x9e,0x0a,0xd8, +0x52,0x01,0x3b,0x2a,0x60,0x43,0x05,0xf4,0x2b,0xa0,0x5d,0x01,0xdd,0x0a,0x68,0x56, +0x40,0xaf,0x02,0x5a,0x15,0xd0,0xa9,0xc0,0x94,0xa6,0x02,0xd3,0x99,0x0a,0x4c,0x65, +0x2a,0x30,0x95,0xa9,0xd8,0x01,0x30,0xb4,0x2a,0x4a,0x41,0x19,0x80,0x0f,0x2b,0xa0, +0x58,0x01,0xdf,0x55,0xc0,0x6f,0x15,0xf0,0x59,0x05,0xfc,0x55,0x01,0xab,0x2a,0xe0, +0xa7,0x4a,0xe8,0x57,0x42,0xbf,0x12,0xfa,0x95,0xd0,0xaf,0x84,0x7e,0x25,0xf4,0x2b, +0xa1,0x5f,0x09,0xfd,0x4a,0xe8,0x57,0x42,0xbf,0x12,0xfa,0x95,0xd0,0xaf,0x84,0x7e, +0x25,0xf4,0x2b,0xa1,0x5f,0x09,0xfd,0x4a,0xe8,0x57,0x42,0xbf,0x12,0x3d,0xab,0xc4, +0x58,0xae,0x84,0xd6,0xbe,0x42,0xea,0x2e,0x5b,0x4e,0x7d,0x8d,0x05,0xf4,0x51,0x35, +0x03,0xb6,0x83,0xfd,0xa0,0x89,0x3e,0xc2,0xf3,0xf7,0x23,0x3c,0x2b,0x3f,0xaa,0x5d, +0x06,0x36,0x81,0x5a,0xea,0x4a,0x6e,0xa2,0xae,0x94,0xad,0xa0,0x84,0xba,0x52,0x13, +0xc1,0x3a,0x80,0x7c,0xda,0x26,0xb0,0x8f,0xba,0xd2,0x19,0xea,0x5a,0x9a,0x43,0x5d, +0x19,0x35,0xd4,0xb5,0x6c,0x2d,0xc8,0x06,0xd5,0xd4,0xb5,0x7c,0x31,0xc8,0x05,0x3b, +0xa8,0x2b,0x13,0xf5,0x32,0xf7,0x53,0x57,0x56,0x3a,0x28,0xa2,0xae,0x9c,0xf5,0xd4, +0x95,0x5b,0x40,0x5d,0x45,0x68,0x67,0x0b,0x8e,0x6d,0x59,0x0a,0x50,0x77,0x4b,0x31, +0x75,0x6d,0xad,0xa4,0xae,0xd2,0x15,0xd4,0xb5,0x1b,0xed,0x96,0xa1,0x9d,0x3d,0x59, +0x60,0x33,0x40,0xbe,0x7c,0x37,0x28,0xa7,0xae,0x2a,0xe8,0x55,0xc1,0xa6,0x2a,0x36, +0xdf,0x48,0x5d,0x35,0x15,0x00,0xb6,0xe2,0x99,0xdf,0x55,0xb7,0x17,0x60,0x1f,0x66, +0xd8,0x5d,0x78,0xc0,0x75,0x35,0xa0,0x2d,0x3c,0x70,0xba,0x1a,0xd0,0x6e,0x53,0x12, +0x75,0xa7,0xa7,0x83,0xfd,0xd4,0xbd,0x24,0x83,0xba,0xd7,0x94,0x81,0xbd,0xd4,0xbd, +0x2e,0x0d,0xac,0x07,0x5b,0x40,0x0d,0x75,0xaf,0xdf,0x04,0xb6,0x52,0x77,0xce,0x1e, +0xea,0xce,0x45,0xf9,0xdc,0xed,0xd4,0xbd,0x0b,0xfb,0x4a,0x37,0x03,0x1c,0xdf,0x5d, +0x09,0x1f,0xa2,0x7e,0xd9,0x1a,0x90,0x43,0xdd,0xb0,0xb1,0x7b,0x0f,0xf2,0xb8,0x0e, +0x7a,0x16,0x97,0x50,0x4f,0xfa,0x4e,0xb0,0x1f,0xd4,0x81,0x26,0xea,0x59,0x92,0x06, +0x36,0x82,0x1c,0xea,0x59,0xba,0x8b,0x7a,0x32,0x93,0xc1,0x12,0xea,0x59,0x9d,0x0b, +0xb6,0x51,0xcf,0x9a,0x0d,0xa0,0x00,0x6c,0x07,0x7b,0xa8,0x67,0x5d,0x06,0x58,0x45, +0x3d,0x1b,0xd1,0xc6,0xc6,0x06,0xea,0xc9,0xde,0x0d,0xd0,0x4e,0x0e,0xd2,0x02,0xb4, +0x51,0xb0,0x19,0x54,0x52,0xcf,0x96,0x5a,0xea,0xd9,0x56,0x0d,0x1a,0xa9,0x67,0x07, +0xb4,0x4b,0x50,0xaf,0xa4,0x86,0x7a,0x30,0x8a,0x7b,0x2a,0xb1,0x1f,0x0f,0xe7,0x1e, +0x3c,0x80,0x7b,0x1a,0x97,0x82,0x06,0xea,0x65,0x16,0x83,0x65,0x60,0x15,0xa8,0xa4, +0xde,0xc5,0x4d,0xd4,0x9b,0xb8,0x84,0x7a,0xd3,0x8a,0xc0,0x4e,0x80,0x7d,0x69,0xf5, +0xd4,0x9b,0x8e,0x32,0xe9,0x39,0xa0,0x80,0x7a,0x97,0xec,0x06,0x15,0xa0,0x9a,0x7a, +0x37,0x2e,0x07,0x25,0xd4,0x5b,0xc8,0x00,0x94,0x29,0x44,0xbd,0xad,0x8d,0xd4,0xbb, +0x2d,0x83,0x7a,0x8b,0xd1,0xe6,0x76,0xec,0xc7,0xf5,0xdf,0x8b,0xeb,0xb8,0x17,0xd7, +0x63,0x6f,0x39,0xea,0xe0,0x5a,0xe8,0xdd,0xb7,0x05,0xec,0xa1,0xde,0xfd,0x68,0x1f, +0x93,0xa9,0xde,0xba,0xa5,0xd4,0xdb,0x88,0xf6,0xf1,0x18,0xed,0xc5,0xf2,0xa3,0x2f, +0x71,0x25,0xf5,0xa5,0x2c,0xa1,0xbe,0xb4,0x54,0xb0,0x0c,0x60,0x7b,0x6d,0x15,0xf5, +0xad,0x63,0xa8,0x6f,0x43,0x2e,0xf5,0x65,0xef,0x07,0x35,0xd4,0x97,0xb3,0x9d,0xfa, +0xf2,0x70,0x2c,0x2f,0x1f,0x6c,0x06,0x3b,0xa8,0xaf,0x20,0x03,0x94,0x82,0x4a,0xea, +0xdb,0xb4,0x98,0xfa,0x36,0xa3,0x4c,0x51,0x0e,0x28,0xa0,0xbe,0x6d,0xeb,0xc0,0x46, +0xb0,0x8b,0xfa,0x76,0x62,0x7f,0xc9,0x06,0x80,0xfd,0xbb,0xb6,0x82,0x32,0x50,0x01, +0xea,0xa9,0xaf,0x34,0x9b,0xfa,0x2a,0xb1,0x0f,0xf3,0xc8,0x3e,0x8c,0xa1,0x3e,0x4c, +0xfe,0xfa,0x30,0xa9,0xeb,0xc3,0x44,0xae,0x0f,0x13,0xb7,0x3e,0x4c,0xda,0xfa,0x30, +0xd1,0xea,0xc3,0x24,0xab,0xaf,0x3e,0x13,0xac,0x06,0x9b,0x00,0xca,0x34,0x2c,0x05, +0xab,0x70,0x3d,0xb1,0xd7,0x14,0x6c,0x6d,0xdc,0x44,0xfe,0x78,0x4e,0xac,0xc2,0xc8, +0x4f,0x06,0x29,0xe4,0x7e,0x21,0x71,0x23,0x1b,0x65,0xd3,0x85,0xc4,0xf4,0x0b,0x89, +0x4b,0x91,0x54,0x5e,0x48,0x4a,0xa7,0x73,0xc9,0x98,0x32,0x25,0x63,0xca,0x94,0x8a, +0x99,0x7d,0x32,0xa6,0x0e,0xa9,0x58,0x54,0xa4,0x62,0x9a,0x97,0x8c,0xe9,0x53,0x32, +0xa6,0x4f,0xc9,0x98,0x3e,0xa5,0xe2,0xf1,0x9f,0x8a,0x89,0x46,0x2a,0x26,0x10,0xa9, +0x98,0x76,0xa5,0x62,0xda,0x95,0x8a,0x69,0x57,0x32,0x16,0x31,0xc9,0x98,0xd2,0x25, +0x63,0x4a,0x97,0xcc,0xb6,0x85,0xe9,0x41,0x32,0xa6,0x9a,0xc9,0x58,0x08,0x25,0x63, +0xba,0x99,0xbc,0x0c,0x60,0xca,0x99,0x9c,0x09,0x30,0xed,0x4c,0xc6,0x1c,0x23,0x19, +0x73,0x8c,0x64,0x4c,0xfb,0x52,0x50,0x36,0x05,0xd3,0xaf,0x14,0x4c,0xbf,0x52,0x30, +0xfd,0xc2,0xd5,0x7d,0x2e,0x05,0xd3,0xaf,0x14,0x4c,0xbf,0x52,0xb0,0xd0,0x49,0xc1, +0x94,0x33,0x05,0x36,0xe1,0x8a,0x3f,0x97,0x02,0x9b,0x52,0x60,0x53,0x0a,0x16,0x3a, +0x29,0x98,0x7e,0xa6,0xc0,0x9e,0x14,0xd8,0x93,0x02,0x7b,0x52,0x60,0x4f,0x0a,0xec, +0x49,0x61,0xed,0xc1,0x34,0x32,0x19,0x53,0xbc,0x34,0xd8,0x93,0x06,0x7b,0x70,0x16, +0xcf,0xa5,0x41,0x3b,0x0d,0x53,0xbf,0x34,0x4c,0xfb,0xd2,0x30,0xcd,0x4d,0xc6,0x1a, +0x27,0x0d,0xd3,0xdc,0x34,0x4c,0x73,0x93,0x91,0x26,0x63,0xf1,0x95,0x8c,0xa9,0x4d, +0x32,0x6c,0x49,0x86,0x2d,0xc9,0xd0,0x4f,0x86,0x76,0x32,0x74,0x93,0xa1,0x9b,0xcc, +0xfa,0x02,0xba,0xc9,0xd0,0x4d,0x86,0x5e,0x32,0xa6,0x9a,0x29,0xf0,0x59,0x0a,0x34, +0x52,0xd8,0xf6,0x61,0x47,0x1a,0x6b,0x07,0xda,0x4f,0xc1,0xe2,0x2e,0x05,0x1a,0x78, +0x9e,0x9f,0x4b,0x65,0xfd,0x06,0x1b,0x52,0xd1,0xdf,0x54,0xf4,0x37,0x15,0xb6,0xa5, +0x42,0x2b,0xb5,0x10,0x77,0xb9,0x25,0xb8,0xfb,0xe4,0x20,0x5d,0x0a,0x4a,0x01,0xae, +0x98,0x35,0x15,0x48,0x71,0xe7,0xc3,0x6a,0xa9,0x6b,0x0b,0xee,0x56,0xb9,0x7b,0x48, +0x85,0x93,0xa3,0x66,0xe3,0x44,0x2e,0x4e,0xe2,0xe2,0x14,0x2e,0x4e,0xe5,0xe2,0x34, +0x2e,0x5e,0xc2,0xc5,0x19,0x5c,0xbc,0x8c,0x8b,0x33,0xb9,0x38,0x8b,0x8b,0x57,0x70, +0xf1,0x4a,0x2e,0x5e,0x85,0xf8,0xe2,0x1e,0xb6,0xcd,0x4b,0x89,0x1b,0xd8,0x38,0x63, +0x0b,0x1b,0xe7,0xd5,0xb3,0x71,0x71,0x3a,0x1b,0xef,0x59,0x83,0xf8,0xe3,0xc4,0x5d, +0x6c,0xbc,0x36,0x99,0x8d,0xf3,0xd9,0x16,0x3e,0xde,0xb3,0x9d,0x8d,0x6b,0xf6,0x22, +0xfe,0x24,0x89,0x6d,0xe1,0x93,0x65,0xac,0xd6,0x27,0x6b,0xd9,0x76,0x3e,0x2e,0x62, +0x5b,0xf8,0x78,0xc3,0x96,0x8f,0x37,0x25,0x9b,0x32,0x9f,0xe4,0xb0,0x19,0xdc,0xda, +0xd9,0xb8,0x76,0x19,0x97,0x67,0xed,0x44,0xb7,0xb9,0x3d,0xac,0x4a,0x57,0x4a,0x29, +0xb7,0x3f,0x89,0xcb,0x97,0xb0,0xf9,0x9a,0x3c,0x36,0xbf,0x7c,0x31,0x62,0xdc,0xf2, +0x10,0xe3,0x46,0xc6,0xe6,0xf7,0xec,0xe5,0xf6,0xb0,0x36,0xe0,0xb2,0x64,0xcb,0xe4, +0x16,0xb0,0x7b,0xd6,0x6f,0x65,0xe3,0x4d,0x3b,0xb9,0xa3,0x6c,0xfb,0x3d,0x5b,0x1a, +0xd9,0xa3,0x2b,0x96,0xb3,0xf9,0x25,0x35,0x88,0x7b,0x2b,0x0a,0xd9,0xfc,0x56,0xae, +0xe5,0xa5,0x6c,0x3b,0x1f,0xd5,0x15,0xb1,0xf9,0x95,0xac,0xcd,0x5d,0xa5,0xdb,0xd8, +0xa3,0x39,0xec,0x9e,0x8f,0xea,0x59,0xdd,0xde,0xca,0x34,0xce,0x86,0x35,0x5c,0x2d, +0xce,0xc2,0x7a,0x56,0x11,0xb7,0x26,0x2e,0xae,0x54,0x53,0xd7,0x5a,0x3c,0x0d,0x6a, +0xea,0xa9,0x67,0x77,0x16,0xcd,0x7d,0xfe,0x19,0xd2,0x04,0x91,0x46,0x43,0x1a,0xcc, +0x17,0x83,0x49,0x83,0x99,0x62,0x28,0x69,0x74,0xa4,0x09,0x23,0x4d,0x38,0x69,0x03, +0x49,0x1b,0x44,0x5a,0x0d,0x69,0xb5,0xa4,0x0d,0x26,0x6d,0x08,0xc1,0xff,0x04,0xef, +0x13,0x7c,0x4f,0xf0,0x3c,0xc1,0xef,0x04,0xaf,0x13,0x7c,0x4e,0xf0,0x38,0xc1,0xdf, +0x04,0x6f,0x13,0x7c,0x4d,0xf0,0x34,0xc1,0xcf,0x04,0x2f,0x63,0x5f,0xf5,0xc5,0xca, +0x4d,0x04,0x57,0x7f,0x9c,0x87,0xad,0xec,0x3d,0x78,0x30,0xae,0xc1,0x03,0x91,0x1d, +0x3e,0x49,0x78,0x68,0xe6,0x11,0xfc,0x80,0x87,0x04,0x6e,0xe8,0x5b,0xf0,0xe0,0x59, +0xb1,0x1c,0x37,0xfa,0x1a,0xdc,0xf8,0x0a,0x09,0x7d,0xc7,0xc3,0x11,0x37,0xe6,0x62, +0xf6,0x06,0x8f,0x1b,0xda,0x62,0x0c,0xaf,0xe4,0x9d,0xb8,0x2d,0xe0,0xc1,0x52,0x89, +0x1b,0xd2,0x26,0x3c,0x6c,0xb1,0x1a,0xeb,0x4a,0xdd,0x88,0x07,0x0b,0x1e,0x8c,0x55, +0xdb,0xf0,0x80,0xc4,0x83,0x6a,0x59,0x1d,0x1e,0x80,0x78,0x48,0x96,0xe2,0xe1,0x90, +0x53,0x84,0x32,0xb8,0x71,0x63,0x02,0x00,0xdf,0x60,0x88,0xe6,0x92,0x36,0x94,0xb4, +0x3a,0xd2,0x62,0xda,0x1b,0x4e,0xc1,0x98,0x9d,0x07,0x51,0xb0,0x86,0x82,0xb5,0x14, +0x1c,0x4c,0xc1,0x98,0x23,0x87,0x52,0xb0,0x8e,0x82,0xc3,0x28,0x38,0x9c,0x42,0x30, +0x59,0x65,0x1f,0x61,0x1a,0x36,0xd2,0xb2,0x51,0x30,0x1b,0x85,0xb0,0x51,0x28,0x1b, +0xe9,0xd8,0x28,0x8c,0x8d,0xc2,0xd9,0x28,0x28,0x90,0x8b,0xb9,0x3a,0x41,0x5c,0xa5, +0x67,0xa7,0xd2,0x33,0xf3,0xc0,0x02,0x9a,0xf9,0xfc,0x64,0xdc,0xbb,0x36,0x83,0x2d, +0x60,0x1b,0xd8,0x0e,0x76,0x82,0x12,0x50,0x0a,0xca,0x40,0x39,0x7b,0x7f,0x03,0xfb, +0x40,0x15,0xa8,0x01,0x75,0xa0,0x01,0x34,0xd1,0x85,0xa4,0xc5,0x20,0x19,0xa4,0x12, +0x7b,0x13,0xbc,0x90,0x84,0xfb,0x61,0x52,0x06,0x58,0x06,0x96,0x83,0x4c,0x90,0x05, +0x56,0x81,0xb5,0x60,0x03,0xc8,0x01,0xf9,0xa0,0x00,0x6c,0x02,0x85,0x00,0x76,0x24, +0xc1,0x8e,0x24,0xd8,0x91,0x04,0x3b,0x92,0x76,0x00,0xd8,0x92,0x04,0x5b,0x92,0x76, +0x01,0xd8,0x93,0x04,0x7b,0x92,0xf6,0x00,0xd8,0x94,0x84,0x8b,0xbc,0x6e,0x4b,0xd7, +0xaa,0x65,0x6c,0x17,0x2e,0x24,0xad,0xbc,0x90,0x54,0xcf,0xe9,0xb3,0x1b,0x25,0x50, +0xba,0x90,0x58,0x68,0xda,0xc0,0xbd,0x39,0xdb,0xd4,0xcb,0xcd,0x5c,0x19,0xb6,0x6f, +0x5b,0x60,0x22,0x7b,0x24,0x71,0x8f,0x69,0xa3,0x92,0xeb,0x46,0xe2,0xb6,0x0b,0x89, +0x3b,0xb0,0xc1,0x3a,0x02,0xfd,0x44,0xf7,0xb9,0x0a,0x4b,0xb8,0x6d,0xe4,0x12,0xd1, +0x6e,0x3d,0xeb,0x21,0xae,0x6a,0x8d,0x29,0x57,0xcf,0xf5,0x00,0x87,0xd8,0x76,0x38, +0xdf,0xc1,0xf4,0x0b,0x49,0x49,0x26,0x63,0xb0,0x51,0x8a,0xdd,0xa6,0x7a,0xbb,0xb8, +0x8d,0x4a,0x53,0xae,0x92,0xf3,0x40,0xe2,0x6e,0x6c,0x70,0x09,0x6b,0x10,0x5b,0x08, +0x25,0xb6,0x5e,0xaf,0xb1,0x9b,0xeb,0x0b,0x73,0xfd,0x48,0xa9,0x39,0x81,0xe1,0x9c, +0xca,0xa6,0x81,0xed,0xa4,0x42,0x53,0xff,0x4d,0xdd,0x33,0xed,0x2a,0xbb,0x6e,0xc5, +0x8d,0xc2,0xe6,0x1c,0x57,0x92,0x35,0xa4,0x8c,0x15,0x48,0xac,0xe7,0x8c,0x2f,0x35, +0x6d,0x97,0x72,0x2d,0x2d,0x67,0xcf,0x3c,0xd7,0xe9,0x1a,0xd3,0xf3,0xad,0x84,0x3b, +0xb3,0x6c,0x0e,0x47,0xf3,0xd8,0xf1,0xc0,0x56,0xe2,0x1a,0xe0,0x36,0x38,0x1f,0x5e, +0x77,0x47,0x15,0xd7,0x05,0xb3,0x83,0xeb,0xae,0x3b,0xd8,0x94,0x63,0x47,0x09,0x33, +0xd0,0x76,0x52,0x1a,0x37,0xac,0x92,0x96,0x98,0xce,0xb4,0xc9,0xae,0xa4,0xa5,0xa6, +0x71,0x93,0x39,0xd0,0x85,0xa4,0x2c,0xce,0x44,0x76,0x9c,0x71,0x67,0xfa,0xa6,0x96, +0x4c,0x67,0x9e,0x3d,0xb2,0x82,0xcb,0xed,0x32,0x35,0xb4,0x86,0x3d,0xdf,0x38,0x89, +0x66,0x9f,0xb0,0xdb,0x65,0xd7,0x73,0xac,0xc4,0x6a,0xd3,0x16,0x3b,0x50,0x06,0xce, +0xd8,0x12,0xd3,0x76,0xd1,0xc0,0x58,0x4a,0x5a,0xc7,0xee,0x46,0x67,0x12,0x8b,0x07, +0x0a,0x27,0x99,0x06,0x48,0xd2,0x06,0xb6,0xb9,0xc4,0xa6,0x81,0x11,0xc5,0x0e,0xb1, +0x06,0x2e,0x61,0xcf,0xe3,0x2a,0xae,0x00,0xeb,0xb2,0x64,0xd3,0x3e,0xd3,0x70,0x61, +0x73,0x30,0xbd,0x1a,0xb9,0x8d,0x5c,0x8e,0xbd,0x7c,0xf2,0x06,0x06,0x20,0xab,0x97, +0xcb,0x55,0x62,0x73,0x39,0x26,0x99,0x3c,0xee,0xd0,0x12,0xd3,0x0e,0xb3,0x94,0x29, +0xc7,0x1e,0xcd,0x1f,0x38,0x05,0xa5,0x03,0x1b,0x5c,0x81,0x7c,0xae,0x33,0x59,0xa6, +0x5c,0x09,0x77,0x15,0xb3,0xb9,0x4a,0xee,0xb4,0x14,0x9b,0xaa,0x16,0x0c,0x9c,0x6b, +0xd3,0x06,0x77,0xa5,0x15,0x70,0x27,0x6d,0xc5,0x75,0xa1,0x42,0x6e,0x6c,0x72,0xc9, +0xf5,0x13,0x73,0xf3,0x38,0x4b,0xda,0x32,0x70,0x7d,0x98,0x73,0xec,0xbe,0x6d,0xa6, +0x8b,0x8e,0xb8,0xb6,0x92,0xae,0x17,0xdd,0x69,0xba,0xa0,0x4b,0x58,0xf7,0xb3,0xa3, +0x99,0xcd,0xd5,0x73,0x0e,0xe6,0xae,0x6f,0xd3,0x6d,0xc0,0x74,0x59,0x60,0x4e,0x55, +0x61,0x6a,0x61,0x60,0x04,0x07,0xf6,0xc0,0x7d,0x41,0x6c,0xa4,0x61,0x23,0x2d,0x1b, +0x05,0xb3,0x51,0x08,0x1b,0x85,0xb2,0x91,0x8e,0x8d,0xc2,0xd8,0x28,0x9c,0x2b,0x6c, +0xaa,0xc2,0xd5,0x09,0xe2,0x2a,0x05,0x71,0xb5,0x82,0xb8,0x6a,0x41,0x5c,0xbd,0x20, +0xae,0x62,0x10,0x57,0x33,0x88,0xab,0x1a,0xc4,0xd5,0xd5,0x70,0x75,0x35,0x26,0x3d, +0xae,0xae,0x86,0xab,0xab,0xe1,0xea,0x3e,0x3b,0x77,0x02,0x4d,0x9e,0x40,0x13,0x5e, +0xa0,0x89,0x13,0xe6,0xd1,0x9c,0x05,0x34,0x77,0x12,0x4d,0x9e,0x85,0x1f,0x0d,0xd0, +0xd2,0xb4,0x17,0xf0,0x3c,0xab,0xec,0x4e,0x5f,0x41,0xdd,0x1b,0x4a,0xd9,0xbb,0x13, +0xd6,0x40,0xec,0x93,0xa0,0x7b,0x43,0x66,0x37,0x56,0x82,0x78,0xb0,0x74,0xd5,0x67, +0x7d,0x54,0x9f,0xcd,0x3e,0x59,0xd0,0xd2,0xec,0x09,0x74,0xac,0x7e,0x02,0xcd,0x9a, +0x40,0x33,0xf0,0x33,0x91,0x66,0x4d,0xa4,0xa9,0x13,0x69,0xd2,0x84,0x99,0x34,0x83, +0x8d,0xe6,0x4e,0xa1,0xd9,0x53,0x50,0x82,0x65,0x2a,0xcd,0x9a,0x4a,0x33,0xa6,0xd2, +0xb3,0x2f,0xd3,0x0c,0x30,0x0b,0x4c,0x05,0xcf,0x83,0x63,0xf5,0x33,0x69,0xd6,0x4c, +0x9a,0x8c,0x5a,0x33,0x69,0xca,0x2c,0x9a,0x3d,0x0b,0xbb,0x66,0xd1,0xac,0x59,0x34, +0x69,0x16,0xcd,0x60,0x33,0x1a,0xe4,0x34,0x84,0x9f,0x19,0x6c,0x02,0x3b,0x27,0x01, +0xfc,0xcc,0x60,0x93,0xf3,0xe9,0x6b,0xe7,0x9b,0x62,0x1c,0x87,0x51,0xb3,0xc0,0x54, +0x30,0x6f,0xc2,0x64,0x16,0xee,0xb0,0x39,0xd5,0xd0,0xdc,0xf9,0x34,0x7b,0x3e,0x9a, +0x47,0x8d,0xf9,0x34,0x77,0x01,0xcd,0x5e,0x80,0x8d,0x05,0x34,0x6b,0x01,0xcd,0x80, +0x2f,0x16,0xd2,0xec,0x85,0xd8,0x5e,0x48,0xb3,0x16,0xd2,0x0c,0xfc,0xb4,0x2f,0xa1, +0x59,0x60,0xe2,0x73,0x34,0x69,0x12,0x4d,0x9a,0x4c,0x93,0xd0,0x08,0xfa,0x30,0x19, +0xdd,0x7c,0x89,0x9e,0x9d,0x00,0x6f,0xd2,0xb4,0xd9,0x34,0x63,0x06,0xcd,0x78,0x9e, +0x66,0xce,0xa2,0x99,0xb3,0x69,0xe6,0x9c,0xa9,0x34,0xf3,0x45,0x9a,0x35,0x0d,0x5d, +0x9a,0x03,0x0f,0x3c,0x4b,0x73,0xe7,0xce,0xa2,0xb9,0xf3,0x68,0x3e,0x7e,0x16,0xd0, +0xc2,0x89,0xb4,0x00,0x6d,0xcc,0xa2,0x09,0x5c,0x1c,0xc4,0x2e,0xeb,0x34,0x6c,0xa4, +0x65,0xa3,0x60,0x36,0x0a,0x61,0xa3,0x50,0x36,0xd2,0xb1,0x51,0x18,0x1b,0x85,0xb3, +0x11,0x9e,0x85,0x6c,0xcc,0xd5,0x09,0xe2,0x2a,0x05,0x71,0xb5,0x82,0xb8,0x6a,0x41, +0x5c,0xbd,0x20,0xae,0x62,0x10,0x57,0x33,0x88,0xab,0x1a,0xc4,0xd5,0xd5,0x70,0x75, +0x35,0x26,0x3d,0xae,0xae,0x86,0xab,0xab,0xe1,0xea,0x6a,0xb8,0xba,0x1a,0xae,0xae, +0x86,0xab,0xab,0xe1,0xea,0x6a,0xb8,0xba,0x5a,0xae,0xae,0x96,0xab,0x3b,0x15,0x67, +0xf5,0xe2,0xc6,0xc5,0x20,0x09,0xa4,0x80,0x34,0xb0,0x04,0x2c,0x07,0x59,0x60,0x25, +0x58,0x0d,0xd6,0x82,0xf5,0x60,0x23,0xc8,0x01,0x79,0xa0,0x00,0x14,0x82,0x22,0xb0, +0x15,0x14,0x83,0x1d,0xa0,0x04,0x94,0xd2,0xc5,0x6c,0xb4,0x9b,0x8d,0x76,0xb3,0xd1, +0x6e,0x36,0xda,0xcd,0x46,0xbb,0xd9,0x19,0x00,0x6d,0x67,0xa3,0xed,0x6c,0xb4,0x9d, +0x8d,0xb6,0xb3,0xd1,0x76,0x36,0xda,0xce,0x46,0xdb,0xd9,0x68,0x3b,0x17,0xed,0xe5, +0xa2,0xbd,0x5c,0xb4,0x97,0x8b,0xf6,0x72,0xd1,0x5e,0x2e,0xda,0xcb,0x2d,0x03,0x95, +0x60,0x1f,0xa8,0x02,0x35,0xa0,0x0e,0x34,0x80,0x26,0xba,0x98,0x07,0xbd,0x3c,0xe8, +0xe5,0x41,0x2f,0x0f,0x7a,0x79,0xd0,0xcb,0x83,0x5e,0x1e,0xf4,0xf2,0xa0,0x87,0xa5, +0xdd,0xc5,0x3c,0xe8,0xe5,0x41,0x2f,0x0f,0x7a,0x79,0xd0,0xcb,0x83,0x5e,0x1e,0xfa, +0x92,0x87,0xbe,0xe4,0xa1,0x2f,0x79,0xd0,0xce,0x83,0x76,0x1e,0xb4,0xb1,0xfc,0xbb, +0x98,0x07,0xed,0x3c,0x68,0xe7,0x41,0x3b,0xaf,0x16,0xd4,0xd3,0xb9,0x7d,0xd0,0xcd, +0x83,0x5e,0x3e,0xf4,0xf2,0xa1,0x97,0x0f,0xbd,0x7c,0xe8,0xe5,0x2f,0x03,0xd0,0xc8, +0x87,0x46,0x3e,0xda,0xcf,0x47,0xfb,0xf9,0x68,0x3f,0x1f,0xed,0xe7,0xa3,0xfd,0x7c, +0xb4,0x9f,0x8f,0xf6,0xf3,0xd1,0x7e,0x3e,0xda,0xcf,0xdf,0x41,0x6d,0xbb,0xe8,0x48, +0x3e,0x1d,0x41,0xe5,0x52,0xb6,0x12,0x3a,0x96,0x8f,0x8e,0xe5,0x43,0x20,0x1f,0x1d, +0xcb,0x47,0xc7,0xf2,0x21,0x54,0x00,0xa1,0x02,0x56,0x08,0x2b,0x8d,0xfd,0x99,0xc8, +0xa7,0x83,0xa5,0xd4,0xb6,0x05,0x09,0xfa,0x56,0x80,0xbe,0x15,0x40,0xb7,0x00,0x4d, +0x14,0xa0,0x6f,0x05,0xd0,0x2e,0x80,0x36,0x96,0xf2,0x87,0x20,0x5f,0xb0,0x9f,0x2e, +0xee,0x42,0xab,0xa5,0xab,0xe8,0x08,0x96,0x6c,0x99,0x58,0x12,0x65,0x62,0x89,0x96, +0x89,0x65,0x51,0x26,0x96,0x45,0x99,0x58,0xa2,0x65,0x62,0x89,0x96,0x89,0x25,0x5a, +0x26,0x96,0x48,0x99,0x58,0xa2,0x65,0x62,0x99,0x94,0x89,0x25,0x5a,0x26,0x96,0x4a, +0x99,0x58,0x2a,0x65,0x62,0xa9,0x94,0x89,0xa5,0x52,0x26,0x96,0x4a,0x99,0x58,0xa2, +0x65,0x62,0x69,0x94,0x89,0xa5,0x51,0x26,0x96,0x68,0x99,0x58,0xa2,0x65,0x62,0x89, +0x96,0x89,0xe5,0x53,0x66,0x15,0xa8,0x06,0x35,0xa0,0x16,0xd4,0x01,0x78,0x2c,0xb3, +0x01,0x34,0x82,0x26,0x3a,0x97,0x85,0x25,0x56,0x16,0x96,0xa5,0x59,0x58,0x92,0x66, +0x61,0x29,0x9a,0x85,0x25,0x55,0x16,0x96,0x54,0x59,0x58,0x6e,0x66,0x61,0xe9,0x95, +0x85,0xa5,0x55,0x16,0x96,0x9a,0x59,0x58,0x6a,0x66,0x61,0xa9,0x99,0x85,0xa5,0x58, +0x16,0xec,0xce,0xc2,0x72,0x2f,0x0b,0x4b,0xcd,0x2c,0x2c,0x35,0xb3,0xb0,0xf4,0xca, +0xc2,0xd2,0x2b,0x0b,0xcb,0xbf,0x2c,0x38,0x25,0x0b,0x4b,0xc3,0xac,0x75,0x00,0x4b, +0xb5,0x2c,0x2c,0xd5,0xb2,0xb0,0x54,0xcb,0xc2,0x12,0x36,0x2b,0x07,0xb0,0xdf,0xed, +0x61,0x39,0x98,0x85,0x25,0x5a,0x16,0x96,0x86,0x59,0xe8,0x7f,0x16,0xfa,0x9f,0x85, +0xfe,0x67,0xa1,0xff,0x59,0xe8,0x7f,0x16,0xfa,0x9f,0x85,0xfe,0x67,0xa1,0xff,0x59, +0xe8,0x7f,0x16,0xfa,0x9f,0x85,0xfe,0x67,0xa1,0xff,0x59,0xe8,0x7f,0x16,0xfa,0x9f, +0x85,0xfe,0x67,0x95,0x51,0x6f,0x79,0x3a,0x75,0xe7,0xec,0xc5,0x7c,0x19,0x29,0x16, +0xee,0x1f,0x55,0x57,0x60,0x4e,0xbd,0x95,0xba,0xb6,0x62,0x9e,0xbd,0x0e,0x73,0xe8, +0xad,0xd8,0x9f,0xc6,0xbe,0x58,0xd9,0x41,0x3d,0x8d,0x29,0xd4,0xbb,0xa1,0x89,0x7a, +0xf3,0x6b,0xa9,0xb7,0xa8,0x9a,0xfa,0x12,0xb3,0xa8,0x7b,0x7b,0x22,0x75,0xef,0xcd, +0xa1,0x9e,0xa4,0x8d,0xd4,0x03,0x9b,0x7a,0x57,0x60,0xd1,0x8f,0xe5,0x70,0x5f,0x71, +0x39,0xe6,0xfd,0x89,0x98,0x83,0xef,0xa3,0xee,0x5d,0xc9,0xd4,0xc3,0xbe,0x20,0xd9, +0x50,0x4a,0x7d,0xd5,0xf9,0xd4,0xb5,0x0f,0xf7,0xef,0xa6,0x12,0xea,0x5d,0xbf,0x9c, +0x7a,0xb7,0x6e,0xa1,0xee,0x0c,0xf6,0xa5,0xca,0x06,0xea,0xdd,0x54,0x40,0x5d,0x75, +0x4b,0xb1,0x36,0x58,0x4f,0xdd,0xfb,0x76,0x52,0x4f,0x46,0x3d,0xf5,0x61,0xa6,0xf2, +0x51,0x63,0x2a,0xe6,0xfc,0x55,0xd4,0x95,0x91,0x4f,0xdd,0xab,0x93,0xa9,0xbb,0x64, +0x35,0xda,0x5b,0x81,0xb9,0x7e,0x31,0xda,0x4c,0xa5,0xde,0x8d,0xb9,0xd4,0x5b,0x55, +0x46,0x7d,0xb9,0x15,0xd4,0x57,0x8a,0xb4,0xaa,0x96,0x7a,0x36,0x2f,0xc3,0x7a,0xa2, +0x89,0x7a,0xf6,0x6f,0xa2,0x5e,0xf8,0xbf,0x6f,0x59,0x32,0xf5,0x96,0xac,0xa3,0xae, +0x22,0x68,0xd4,0xc3,0x9e,0x72,0xec,0x5f,0xdc,0x88,0xb5,0xc7,0x66,0xea,0x29,0x5a, +0x8a,0xfe,0x27,0x52,0x5f,0x0e,0x34,0x8a,0x36,0x50,0x57,0xf9,0x66,0xf4,0x6b,0x35, +0x75,0x57,0x65,0x53,0x77,0x7d,0x16,0xf5,0xec,0x2d,0xa3,0x9e,0x6a,0xac,0x47,0x36, +0x66,0xc0,0x86,0x55,0xd4,0x9b,0x88,0x34,0x2d,0x17,0x40,0x63,0x7b,0x2e,0x34,0x1a, +0xa1,0x51,0x8e,0xe3,0xfb,0xa8,0x77,0x37,0x83,0xfe,0x64,0x41,0xab,0x11,0xbe,0xac, +0xa1,0xae,0xb2,0x62,0xea,0x66,0x56,0x51,0x4f,0x66,0x1a,0xf5,0xac,0xdd,0x83,0xb5, +0xca,0x7a,0xe8,0xd5,0xa1,0x4f,0x4d,0xd4,0xd5,0xb8,0x03,0x65,0x96,0x63,0x6d,0xb3, +0x8c,0xba,0xd7,0x56,0x43,0x67,0x33,0x7c,0x9f,0x44,0x5d,0x85,0xf9,0xd4,0x93,0x8b, +0x35,0xcc,0x4a,0xf8,0x65,0x27,0xd6,0x4a,0xbb,0x6b,0xa9,0xbb,0x02,0xe7,0x21,0x03, +0x3a,0x19,0x5b,0xa9,0x1b,0x63,0xbe,0x67,0xed,0x56,0xf8,0x77,0x37,0xd6,0x55,0x58, +0x23,0xa5,0x2d,0xa1,0xee,0xcd,0x8b,0xa9,0xa7,0x12,0xfe,0x58,0x82,0x73,0x5a,0xb2, +0x8a,0xfa,0xd2,0xb0,0xf4,0xcb,0xd8,0x47,0x5d,0x2b,0x71,0x0e,0xea,0x76,0x51,0xf7, +0xfa,0x14,0xf8,0x1c,0xfd,0xdd,0x82,0x73,0xb3,0x0e,0xe7,0x61,0x07,0xd2,0xda,0xf5, +0xd4,0x57,0x97,0x89,0xf3,0x9f,0x8a,0xf5,0x54,0x15,0xf5,0x36,0x40,0x1f,0xab,0xb9, +0xee,0x54,0x9c,0x9f,0x74,0xf4,0x63,0x15,0xdb,0xff,0x22,0xea,0x49,0xc1,0x5a,0x6d, +0x15,0x28,0x5e,0x4a,0x3d,0x55,0x18,0x2b,0x8b,0xa1,0x51,0xbf,0x8d,0x7a,0x57,0xef, +0xa6,0x3e,0xa6,0x88,0xfa,0x96,0x2f,0xa5,0xae,0x74,0xac,0xbf,0x96,0x62,0x4d,0xb6, +0xaa,0x01,0x63,0x21,0x1d,0xe3,0x83,0xd5,0x5d,0x42,0x5d,0x4d,0x38,0xff,0xcb,0xf1, +0x68,0xde,0xbd,0x9b,0x7a,0xf6,0x40,0x1f,0xe3,0x01,0x2b,0x0b,0xea,0xca,0x81,0x6f, +0xf6,0xa3,0x5f,0x0c,0xfc,0x87,0x6b,0xaf,0x67,0x25,0x3b,0xbe,0xb2,0xd1,0x76,0x2a, +0xf5,0xa5,0xef,0xc5,0xb9,0xd8,0x4f,0x7d,0x79,0xe9,0x58,0xf3,0x6d,0x80,0xaf,0x32, +0xa8,0x67,0x1b,0xb4,0x52,0xb1,0x3f,0xbb,0x9a,0xba,0xb1,0xa2,0xf9,0xa8,0x16,0x63, +0x22,0x29,0x1b,0xfe,0x85,0x0f,0xf6,0x34,0x51,0xf7,0x3a,0x8c,0xbf,0xb4,0x4c,0x8c, +0xd3,0x44,0xd8,0x85,0x71,0xb3,0xb8,0x9e,0xba,0xb3,0x51,0x7f,0x03,0x8e,0x2f,0x85, +0x7f,0xf2,0x60,0x43,0x41,0x25,0xc6,0xd5,0x62,0xea,0xae,0x85,0xe6,0x0a,0xf4,0x67, +0x2d,0xea,0x14,0x96,0xc0,0xef,0x2b,0xa8,0x0f,0x3e,0xef,0x4e,0x87,0xc6,0xc6,0x6a, +0xea,0x62,0x4a,0xa8,0x6b,0x2f,0xd6,0x98,0x55,0x3b,0xd1,0x4f,0xac,0x3f,0xa1,0xdf, +0x9d,0x82,0x71,0xb7,0x09,0xfe,0xca,0x86,0x6e,0x3a,0x7c,0xbe,0x02,0xfe,0x2d,0xc7, +0xb9,0xd8,0x80,0x71,0x92,0x07,0x1f,0x6e,0xde,0x8e,0xf3,0xb8,0x15,0xed,0xa6,0x52, +0xcf,0x7a,0x8c,0xa9,0x06,0xac,0x69,0x8b,0x30,0x0e,0x8a,0x0a,0xd1,0x17,0xf8,0x75, +0x19,0x6c,0x64,0x5f,0x10,0xaf,0xc8,0x83,0x9d,0x18,0xbb,0xab,0x30,0xde,0xd7,0xd7, +0xfe,0x3f,0xf6,0xde,0x06,0xa8,0xa9,0x6b,0xed,0xfb,0x5e,0x51,0x50,0xa2,0x50,0x82, +0x82,0x82,0x82,0x05,0x25,0x0a,0x96,0x40,0x52,0x93,0x96,0x20,0xb4,0xa0,0xa0,0x04, +0x12,0xbe,0xa3,0x44,0x41,0xa1,0x05,0x4c,0x20,0x91,0x04,0x12,0x20,0x90,0x40,0x02, +0x49,0x48,0x42,0x62,0x49,0x05,0x0a,0x2d,0xb4,0xa0,0xa0,0x60,0xc1,0x8a,0x10,0x05, +0x0b,0x56,0xee,0x91,0xe7,0x96,0x3e,0x32,0x23,0x33,0x72,0x17,0x5a,0x79,0x47,0x4e, +0x09,0xc2,0x3d,0xf2,0x0e,0xcc,0xc8,0x8c,0xcc,0xc8,0xcc,0xbb,0x56,0xd8,0xf6,0xf5, +0x9c,0xe7,0x9c,0xfb,0x7c,0xf5,0x9c,0xe7,0x7c,0x90,0x5f,0xd7,0x7f,0xed,0xf5,0xb1, +0xf7,0x5e,0xeb,0xba,0xae,0xb5,0xf6,0x8e,0x61,0xa6,0xf0,0x7a,0xd0,0x7e,0xdd,0xf0, +0xba,0x77,0xbe,0x02,0xb3,0x70,0x97,0x9d,0xbd,0x5d,0x05,0xd7,0x42,0x3b,0x78,0xd6, +0x09,0x7d,0x7c,0x13,0xc6,0x4d,0x95,0x02,0x3c,0x2b,0x6f,0x00,0x73,0x5d,0xd0,0x0e, +0xdf,0x2a,0xc0,0x9c,0xe1,0x16,0xbc,0x3f,0xbc,0x8e,0x16,0xae,0xcd,0x3b,0x57,0x60, +0x4c,0xc0,0xb5,0xd0,0x03,0xe3,0xfa,0x3a,0xf4,0x6f,0x2f,0x9c,0xc3,0xe7,0xd0,0x3f, +0xe8,0x1f,0xda,0xe0,0x13,0xcf,0xf2,0xed,0x45,0x18,0x1f,0x0a,0x60,0xf9,0x0c,0xa6, +0x16,0xe8,0xcb,0x86,0x5e,0x18,0x2b,0x30,0xb6,0x0c,0x70,0x6d,0x7d,0x01,0x7d,0xd9, +0x3a,0x00,0xd7,0x08,0x2c,0xb7,0xc1,0x71,0x5f,0xf9,0x04,0xda,0xbb,0x0e,0xde,0x13, +0xc6,0x58,0x3d,0x8c,0xf1,0xaf,0xe1,0xfa,0x56,0xc0,0x54,0x01,0xd7,0xf3,0x65,0xb8, +0xa6,0x2e,0x43,0x9b,0xb6,0xc2,0xef,0xe0,0xb7,0xa0,0x0f,0xe0,0x77,0xab,0xf9,0xcf, +0x6f,0x43,0xbf,0x40,0xdb,0x56,0x5c,0x85,0xf7,0x80,0xf7,0x82,0x6b,0xd8,0x52,0x05, +0xfd,0x6a,0x44,0xfb,0x06,0xfc,0x1e,0x0f,0xd7,0xa5,0xa5,0xa1,0x1d,0xde,0x17,0xde, +0x1b,0xda,0xc6,0xd2,0x0d,0xd7,0x79,0x79,0x0d,0xb4,0x23,0xb4,0x93,0x06,0xda,0xab, +0xf2,0x26,0x8c,0x79,0xb8,0x7f,0x40,0x5b,0xcd,0xc2,0x27,0xe7,0xec,0x25,0x38,0x7e, +0xf3,0x6d,0x30,0xdb,0x87,0x62,0x0e,0xda,0x4f,0x0d,0xe3,0x45,0x0b,0x7d,0x53,0x0d, +0x8f,0x2f,0x99,0xe0,0x18,0xa1,0xbf,0xe0,0x5e,0xf4,0xac,0x0d,0xda,0xae,0x0d,0x8e, +0xf3,0x8a,0x11,0x26,0xe8,0xef,0x0e,0x68,0x9f,0x6b,0x30,0xf6,0xbf,0x81,0x79,0x1f, +0xec,0xd3,0x0f,0x8f,0x07,0x6f,0x82,0x39,0x05,0xdc,0xab,0x2a,0xbb,0xe0,0x7a,0x80, +0x7e,0x30,0x7d,0x06,0xe6,0x5a,0xab,0xc1,0xdc,0x95,0x3a,0x30,0xd7,0x09,0xd7,0x55, +0x27,0xac,0xeb,0xb9,0x08,0xe6,0x7a,0x61,0x9c,0xde,0x85,0x71,0xf6,0x05,0xf4,0xc1, +0x57,0xdf,0xc1,0x58,0x83,0x31,0xa2,0x34,0x83,0xc5,0xd6,0xaa,0xeb,0x60,0x4e,0x0b, +0x0d,0xde,0x77,0x05,0x6e,0x3c,0x70,0x11,0xc1,0x41,0xcf,0xdc,0x85,0x13,0x51,0xab, +0x61,0x19,0xe6,0x55,0xd0,0xf8,0x55,0xd0,0x09,0xb5,0xb5,0x70,0xb2,0x0d,0xd0,0xc0, +0xd0,0xc1,0x97,0x7a,0xe0,0x66,0xa9,0x82,0xa9,0x06,0x58,0x3a,0x60,0xb9,0x13,0x4e, +0xfa,0xdb,0x4f,0x61,0x82,0xed,0x83,0x30,0x60,0xee,0x76,0xc1,0xc0,0xad,0x87,0x06, +0x80,0x93,0x57,0xc1,0xc5,0xac,0x6e,0x86,0x01,0x07,0x17,0x1b,0x7c,0x60,0xcc,0x56, +0x37,0x82,0x59,0xd3,0xa7,0xd0,0x20,0x75,0x70,0xf3,0xfb,0x02,0x06,0x14,0xcc,0xbf, +0x85,0xf9,0xb7,0x30,0xf0,0x15,0xd0,0x41,0xf0,0xf1,0xfa,0x4c,0x6b,0x06,0xcf,0xf4, +0x70,0x23,0x32,0x75,0x83,0x67,0x35,0x30,0xc8,0x6a,0xbe,0x05,0xcf,0xea,0x61,0x30, +0xd5,0x7f,0x05,0x9d,0x09,0x37,0x60,0xb8,0x89,0x3f,0x6b,0x82,0x4e,0x6d,0x82,0x86, +0xb8,0x0c,0x37,0xa6,0x6b,0xb0,0x5f,0x37,0xec,0x63,0x86,0x6d,0x03,0xd0,0xa9,0x46, +0xe8,0x54,0xb4,0xe1,0x37,0xc1,0xc9,0xb7,0x41,0x23,0x5c,0x81,0x1b,0xe7,0x35,0xb8, +0x99,0x7f,0x0d,0x03,0xee,0x6b,0x68,0xa8,0xeb,0x70,0x13,0x1c,0x80,0x0e,0x57,0xc2, +0x4d,0x54,0xd3,0x00,0xe6,0x75,0xd0,0x30,0x0d,0xd0,0xe9,0xf0,0xb1,0x3b,0xdf,0x5c, +0x05,0xe6,0x3b,0x3f,0x05,0x8b,0x97,0x5a,0xf4,0x48,0x54,0x60,0xf1,0x32,0x7c,0x46, +0xfd,0x7c,0xbd,0x09,0xcc,0x28,0xa0,0x99,0x14,0xfd,0x60,0xb1,0x4d,0xa7,0x83,0xd2, +0x53,0x0d,0x16,0xaf,0xc2,0xb0,0x9b,0x1f,0xac,0x00,0xf3,0x77,0x2f,0x80,0xac,0x2c, +0x90,0xc5,0x03,0x59,0xf0,0xbd,0x19,0x65,0x30,0xcf,0x17,0x83,0xf1,0x5e,0xf4,0xc7, +0x4b,0xbd,0xe8,0x8f,0x9e,0x7a,0xd1,0xdf,0x39,0xdd,0x5d,0x2b,0x76,0x81,0x1f,0x1a, +0xfe,0xab,0x17,0xfc,0x70,0xf3,0xbf,0x6e,0x83,0x1f,0x2e,0x81,0x1f,0x6a,0xc0,0x0f, +0x5f,0x80,0x1f,0x1a,0xc1,0x0f,0x4d,0xe0,0x87,0x76,0xf0,0xc3,0x35,0xf0,0x43,0xc7, +0x0f,0x4a,0x24,0xe5,0x50,0xfe,0x6b,0xc0,0x7a,0x0c,0x33,0x58,0xaa,0x46,0x67,0x54, +0xff,0x57,0x1f,0x92,0x01,0xf0,0x83,0x09,0xc9,0xa7,0x48,0x2e,0x22,0xa9,0x41,0x52, +0x8b,0xa4,0x0e,0x49,0x3d,0x92,0x06,0x24,0x9f,0x23,0xf9,0x02,0x49,0x23,0x92,0x2f, +0x91,0x34,0x23,0x69,0x41,0x72,0x19,0x49,0x2b,0x92,0x2b,0x48,0xae,0x22,0x69,0x47, +0xd2,0x81,0xe4,0xda,0xda,0x45,0xfb,0xd1,0xdd,0xbe,0x43,0x57,0xf9,0x0e,0x75,0x86, +0x52,0x0d,0x47,0x3c,0xd9,0x0d,0x26,0xbf,0x05,0x93,0x77,0xc1,0x8f,0x0a,0x30,0x79, +0x07,0x4c,0x7e,0x07,0x26,0xfb,0xc1,0x8f,0xad,0xe0,0xc7,0x2b,0xe0,0x47,0x15,0xf8, +0xb1,0x02,0xfc,0xa8,0x01,0x3f,0x56,0x82,0x1f,0x8d,0xe0,0x47,0x03,0xf8,0xf1,0x02, +0xf8,0x51,0x0b,0x7e,0xac,0x07,0x3f,0x9a,0xc0,0x8f,0x1d,0xe0,0xc7,0x6f,0xc0,0x8f, +0x3d,0xe0,0xc7,0x6e,0xf0,0xe3,0x1d,0xf0,0xe3,0xb7,0xe0,0x27,0x05,0xf8,0x49,0x09, +0x7e,0xbc,0x0b,0x7e,0xfa,0x14,0xfc,0x74,0x11,0xfc,0xd8,0x05,0x7e,0xaa,0x04,0x3f, +0x69,0xc0,0x4f,0x5a,0xf0,0x53,0x15,0xf8,0x49,0x0d,0x7e,0xd2,0x81,0x9f,0xaa,0xc1, +0xa4,0x0e,0x4c,0x5c,0x99,0xb8,0x0a,0xe5,0xa7,0x5a,0x28,0x93,0x5a,0x74,0x54,0x89, +0x44,0x83,0xc4,0x5a,0xac,0x46,0x0d,0xb0,0xb7,0x01,0x75,0xed,0x44,0xd2,0x85,0x6a, +0xd4,0x48,0xf4,0x60,0xa2,0x1d,0xd5,0xb5,0xa3,0xba,0xf6,0x89,0xeb,0x50,0x50,0x43, +0x3b,0xba,0x6e,0x3b,0x6a,0xbd,0x86,0x5a,0xaf,0xa1,0xd6,0x6b,0xa8,0xf5,0x1a,0x6a, +0xbd,0x86,0x5a,0xaf,0xa1,0xd6,0xaf,0x51,0xeb,0xd7,0xa8,0xee,0x6b,0x54,0xf7,0x35, +0xaa,0xeb,0x44,0x9d,0x3b,0x51,0x5d,0x17,0x6a,0xed,0x42,0x47,0xd7,0xd1,0xd1,0x75, +0xd4,0x70,0x1d,0x15,0x7b,0x50,0xb1,0x07,0x15,0x7b,0xd0,0x45,0x7b,0x50,0x9d,0x19, +0x15,0xcd,0xe8,0xe8,0x16,0x6a,0xbd,0x85,0x8a,0xb7,0x50,0xeb,0x2d,0x54,0x77,0x1b, +0x15,0x6f,0xa3,0xa3,0x3e,0x24,0xfd,0xa8,0x4b,0x3f,0x3a,0xba,0x83,0x8e,0xee,0xc0, +0xa3,0x49,0x25,0x3c,0x82,0xd2,0x85,0xe4,0x3a,0x14,0x6b,0x1d,0x1c,0x15,0x14,0x3d, +0x98,0x2c,0x47,0x0d,0xe5,0xa8,0xae,0x1c,0xd5,0x95,0xa3,0xba,0x0a,0x68,0x38,0x28, +0x9d,0x48,0xba,0x90,0xc0,0xd3,0x2a,0x26,0x55,0x48,0xd4,0x48,0x74,0x48,0x60,0x3f, +0x15,0xea,0xa2,0x42,0x5d,0x54,0xa8,0x8b,0x0a,0xb5,0xaa,0x50,0xab,0x0a,0xb5,0xaa, +0x51,0xab,0x1a,0xb5,0xaa,0x51,0xab,0x1a,0xb5,0xaa,0x51,0xab,0x1a,0xb5,0x6a,0x50, +0xab,0x06,0xb5,0x6a,0x50,0xab,0x06,0xb5,0x6a,0x50,0xab,0x06,0xb5,0x56,0xa2,0xd6, +0x4a,0x54,0x57,0x89,0xea,0x2a,0x51,0x9d,0x1e,0xd5,0xe9,0xd1,0x19,0x7a,0x74,0x86, +0x1e,0xb5,0xea,0x51,0xab,0x1e,0x59,0xf7,0xc6,0xe4,0x0d,0x30,0xd1,0x0d,0x65,0x52, +0x07,0xc5,0x73,0xd2,0x30,0x69,0x82,0x6a,0xb4,0xea,0x05,0xab,0x7e,0x62,0xd5,0x6a, +0xab,0x9a,0x50,0xef,0x2b,0x13,0xdd,0x48,0x6e,0x22,0x7f,0x6b,0x90,0x97,0xbb,0x91, +0xdc,0x44,0x0e,0xd6,0x20,0xb7,0x76,0x23,0xb9,0x89,0x3c,0xaa,0x41,0x1e,0xed,0x46, +0x72,0x13,0x39,0x53,0x83,0xa6,0x74,0x15,0x8d,0xbc,0x1b,0xc9,0x4d,0x34,0x68,0x0d, +0x1a,0x56,0x37,0x92,0x9b,0x68,0x44,0x28,0xca,0x90,0x93,0xae,0x4c,0x56,0xa2,0xeb, +0x55,0xa2,0xab,0x54,0x22,0x67,0x5a,0xed,0x54,0x89,0xce,0xa8,0x44,0xf3,0xba,0x81, +0x3a,0x57,0xa2,0x8b,0x56,0x22,0x7f,0x43,0xe9,0x45,0xde,0xeb,0x45,0xad,0x0a,0xeb, +0xc0,0x61,0xf6,0xc9,0x5a,0x86,0x86,0x0e,0x7d,0xad,0x43,0xa2,0x47,0x6e,0xd6,0x21, +0xd1,0x23,0x37,0xeb,0x90,0xe8,0xd1,0x15,0x74,0x48,0xf4,0xe8,0x0a,0x3a,0x24,0x7a, +0x14,0x68,0x3a,0x24,0x28,0x02,0xd1,0x51,0x27,0x3a,0xba,0x8e,0x8e,0xae,0xa3,0x23, +0x33,0x3a,0x32,0xa3,0xa3,0x5b,0xe8,0xe8,0x96,0xf5,0x5c,0x14,0x3b,0xbd,0x28,0xb2, +0x7a,0xd1,0x1c,0x7a,0xd1,0xd4,0x7b,0x90,0x98,0x91,0xdc,0x42,0x72,0x75,0xb2,0xca, +0xba,0x06,0xac,0x61,0xbf,0x16,0xd0,0xd7,0xd6,0x42,0xfa,0xda,0x5a,0x28,0x5f,0xb3, +0xfa,0xdf,0x9a,0x75,0xad,0x65,0xd7,0xad,0xd1,0x8f,0x4a,0x5d,0xd6,0x10,0xb0,0x66, +0x3a,0x6b,0xbc,0xaf,0x85,0x7d,0xe7,0x5a,0xe0,0x77,0xae,0xcd,0xc1,0xda,0xb3,0x67, +0xed,0x2a,0x3d,0xd6,0xe8,0x41,0x4b,0x01,0x5b,0x0c,0x56,0x1b,0xad,0xdd,0xaf,0x77, +0x6d,0x46,0xbd,0x6b,0x77,0xe8,0x5d,0x6b,0xbb,0xb5,0x36,0xeb,0x5b,0x6b,0x63,0xb9, +0xbd,0x76,0xb1,0xdb,0x6b,0x6d,0xb7,0xd7,0xee,0xde,0xbf,0x36,0xf8,0xfe,0xb5,0xca, +0xfe,0xb5,0xb1,0xdc,0x59,0x2b,0xdd,0x59,0xeb,0x72,0x67,0x2d,0x5e,0x95,0xd6,0xab, +0xa0,0x45,0x82,0xad,0x15,0x6b,0x9c,0x5b,0xef,0x6e,0xcd,0xf4,0x6b,0x99,0xce,0xba, +0x20,0xd6,0x96,0xc4,0xf5,0xb5,0xa5,0x80,0x45,0x7f,0x17,0xb6,0x12,0xac,0x2b,0x60, +0xed,0x04,0xb5,0x75,0xb6,0x28,0x5b,0xab,0xbc,0xbe,0xd6,0xe5,0xfa,0x5a,0xa9,0x13, +0x85,0x49,0xe5,0xda,0x0a,0xaa,0x5c,0xbb,0x9f,0x66,0xed,0x74,0xcd,0xda,0x8d,0x34, +0x6b,0xe7,0x69,0xac,0xc6,0x42,0x8b,0xc7,0xba,0xa4,0xd6,0x86,0xab,0x5f,0x9b,0x43, +0xfb,0x9a,0x7f,0xaf,0xad,0x99,0xe7,0xda,0x9a,0x59,0xaf,0xbd,0xae,0xbc,0xbe,0xb6, +0x55,0x59,0xa7,0x79,0x6d,0x6d,0xee,0x9d,0x6b,0xa5,0xce,0x35,0xd3,0x75,0xbe,0x76, +0x8e,0xb5,0xa7,0x79,0x2d,0x80,0x7a,0xd7,0xb2,0x5b,0xaf,0x27,0xdd,0x69,0xcd,0xd6, +0xee,0xae,0x5f,0xab,0xd4,0xaf,0x55,0xea,0xd7,0x2a,0xd5,0x6b,0x59,0xf9,0xeb,0x35, +0xdf,0xb5,0x16,0xb8,0xd6,0x52,0xc5,0x2f,0x1b,0x01,0xb6,0x47,0xbc,0xbe,0xa6,0x7a, +0xad,0x4d,0xbd,0x36,0x16,0xbd,0x75,0xbf,0xc4,0x6c,0x86,0x32,0xe5,0xda,0x38,0xdb, +0xd7,0xda,0x7a,0xd6,0xce,0xd3,0xac,0x4d,0xd3,0x3c,0xa9,0x82,0xcf,0x05,0x78,0x3f, +0x94,0xc1,0x20,0x55,0x59,0x17,0x1b,0x3c,0xa8,0xb0,0x2e,0xef,0x35,0x27,0x4c,0x7c, +0x63,0xed,0xb8,0xb6,0x4f,0x76,0xc3,0xe0,0xd2,0xc2,0xbd,0x0d,0x96,0x54,0xd6,0xa5, +0x38,0xa9,0x85,0x35,0x2a,0x6b,0xb8,0x59,0x37,0xb3,0xb5,0xcc,0xf3,0xf5,0xc5,0x3c, +0x5f,0x77,0xf4,0xfc,0xff,0x3b,0x76,0x4e,0xaa,0x3c,0x91,0x58,0xfb,0xc0,0xdb,0x75, +0xff,0x64,0x40,0x87,0xc0,0x0f,0xfc,0xac,0x50,0x82,0x20,0xe0,0x05,0x3e,0x84,0x47, +0x75,0x30,0x7d,0x06,0x7e,0xa3,0x40,0x7f,0x56,0x75,0x11,0x9c,0x05,0x25,0x40,0x0e, +0x6b,0x6a,0x60,0x82,0x2f,0x0e,0x8a,0x6a,0x98,0x4c,0x30,0xe9,0x61,0xaa,0x82,0xc9, +0x00,0x93,0x11,0xa6,0x0b,0x30,0x7d,0x02,0x4e,0x83,0x54,0xb0,0x0f,0xec,0x07,0x07, +0x01,0x09,0x04,0x83,0x0f,0x40,0x0a,0xf0,0x06,0x44,0x10,0x0a,0x77,0xb2,0x2a,0xb4, +0x33,0x54,0xa1,0x0d,0x0f,0x6d,0x77,0x68,0xb3,0xb3,0x6e,0x1c,0x68,0xbf,0xb3,0x6e, +0x1d,0x68,0xcb,0xb3,0x6e,0x1e,0x68,0xd7,0x43,0x07,0x68,0xfb,0xfb,0x14,0x1d,0x40, +0x03,0xb5,0x80,0x89,0x4b,0x60,0xe2,0x32,0x98,0x68,0x05,0x13,0x6d,0x70,0xb3,0x02, +0xe8,0x89,0xd9,0x0e,0x26,0x3a,0x60,0x50,0xc0,0x3d,0x09,0x58,0x9f,0x53,0x00,0xad, +0x2b,0x68,0x32,0xb4,0xbf,0x02,0xb4,0x01,0xf6,0xc0,0x40,0x80,0x66,0x81,0x71,0x00, +0x17,0x13,0x7c,0xf0,0x40,0xdb,0xc1,0xb5,0x02,0x1d,0x03,0x0d,0x0f,0x5d,0x07,0xd0, +0x93,0x02,0x05,0x27,0xb0,0x5a,0x13,0xac,0xb9,0xf5,0x12,0x92,0xcb,0x48,0xda,0x90, +0x5c,0x05,0x7b,0xc1,0x01,0x10,0x00,0xce,0x00,0x19,0x28,0x05,0xbf,0xb9,0xa2,0x86, +0x09,0xfd,0xa2,0x83,0x7e,0xe9,0x41,0x3f,0xa4,0x5c,0x86,0xa9,0x0d,0xa6,0xab,0x30, +0xa1,0x7f,0xc8,0x85,0xe5,0x0a,0x58,0x86,0xef,0xd6,0x3f,0x57,0x54,0x80,0xb5,0x7f, +0xd2,0x45,0x3f,0x28,0x34,0x00,0xf4,0xc3,0xf8,0x7f,0x5c,0x02,0xff,0x71,0x19,0xfc, +0x47,0x27,0xf8,0x8f,0x2b,0xe0,0x3f,0xda,0xc0,0x6f,0xe0,0x29,0xbf,0xa9,0x29,0x07, +0xbf,0x81,0x5f,0xdb,0x7e,0xa3,0x31,0xc1,0xf4,0x29,0x4c,0x17,0xc1,0x6f,0xea,0x9a, +0xc1,0x6f,0x3e,0xab,0x02,0x8b,0xd5,0xd5,0xed,0x48,0x3a,0x90,0x5c,0x43,0xf2,0x35, +0x92,0x4e,0x24,0x5d,0x48,0xae,0x23,0xf9,0x06,0xc9,0x0d,0x24,0xdd,0x48,0x6e,0x22, +0xe9,0x41,0xd2,0x8b,0xc4,0x8c,0xe4,0x16,0x92,0xdb,0x48,0xfa,0x90,0xf4,0x23,0xb9, +0x83,0xe4,0x5b,0x24,0x03,0x48,0x06,0x91,0xdc,0x45,0xf2,0x1d,0x14,0x93,0x02,0x89, +0x12,0x49,0x39,0x92,0x0a,0x24,0x2a,0x24,0x6a,0x24,0x1a,0x24,0x95,0x48,0xb4,0x48, +0x74,0x48,0xf4,0x48,0xd0,0x98,0x4d,0x06,0x24,0x46,0x24,0x17,0x90,0x7c,0x02,0xe5, +0x62,0x3d,0x92,0x06,0x24,0x9f,0x23,0xf9,0x02,0x49,0x23,0x92,0x26,0x24,0x5f,0x22, +0xf9,0x0a,0x49,0x33,0x92,0x16,0x24,0x97,0x90,0x5c,0x46,0xd2,0x8a,0xa4,0x0d,0xc9, +0x15,0x24,0x57,0x91,0x20,0xbb,0x5c,0x44,0x76,0xb9,0x88,0xec,0x72,0x11,0xd9,0xe5, +0x22,0xb2,0xcb,0x45,0x64,0x97,0x8b,0xc8,0x2e,0x17,0x91,0x5d,0x2e,0x22,0xbb,0x5c, +0x44,0x76,0xb9,0x88,0xec,0x72,0x11,0xd9,0xe5,0x22,0xb2,0xcb,0x45,0x64,0x97,0x8b, +0xc8,0x2e,0x17,0x91,0x5d,0x2e,0x22,0xbb,0x5c,0x44,0x76,0xb9,0x88,0xec,0x72,0x11, +0xd9,0xa5,0xee,0x33,0x24,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0, +0x75,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0,0x75, +0x68,0xe0,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68, +0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc, +0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75, +0x68,0xb8,0x75,0x68,0xb8,0x75,0x68,0xb8,0x75,0x68,0xb8,0x75,0x68,0xb8,0x75,0x68, +0xb8,0x75,0x68,0xb8,0x75,0xd6,0x91,0x0e,0x80,0xff,0x5d,0x0d,0xfe,0xb7,0x09,0x7c, +0xdf,0x00,0xbe,0xbf,0x0c,0xfe,0xbb,0xeb,0x0a,0xf8,0xbe,0x0d,0x7c,0xdf,0x0a,0xa6, +0x6f,0x99,0xc0,0x48,0x3d,0x18,0xf9,0x12,0x7c,0xdf,0x01,0x46,0x2e,0x81,0xef,0xbf, +0x00,0xdf,0x37,0x82,0x91,0xab,0xe0,0x7b,0x15,0xf8,0xfe,0x1a,0xf8,0x1e,0x0e,0xa1, +0x69,0x40,0x05,0xfe,0xfb,0xcb,0x0b,0x60,0xe4,0x3a,0x3a,0x56,0x83,0xef,0x2f,0xa0, +0x5c,0x03,0x46,0x6e,0x81,0x91,0xdb,0x60,0xe4,0x0e,0x2a,0x69,0xc1,0xc8,0x5d,0xf0, +0x7d,0x3b,0xf8,0xfe,0x0a,0xbc,0x36,0x3c,0xf9,0x2a,0xf8,0x4d,0x77,0x37,0xf8,0xfe, +0x13,0xf0,0x7d,0x0b,0xf8,0x1e,0x5e,0xb5,0x1e,0xfc,0xa7,0x02,0xfc,0xa7,0x12,0xfc, +0x67,0x39,0xea,0xad,0x47,0x82,0x0c,0xd3,0x83,0x82,0xa8,0x07,0x05,0x51,0x0f,0x0a, +0xa2,0x1e,0x14,0x44,0x3d,0x28,0x88,0x7a,0x50,0x10,0xf5,0xa0,0x20,0xea,0x41,0x41, +0xd4,0x83,0x82,0xa8,0x07,0x05,0x51,0x0f,0x0a,0xa2,0x1e,0x14,0x44,0x3d,0x28,0x88, +0x7a,0x50,0x10,0xf5,0xa0,0x20,0xea,0x41,0x41,0x84,0xbe,0xa2,0x54,0xf7,0x98,0x90, +0x7c,0x8a,0xe4,0x22,0x92,0x1a,0x24,0xb5,0x48,0xea,0x90,0x20,0x9f,0xf5,0x20,0x9f, +0xf5,0x20,0x9f,0xf5,0x20,0x9f,0xf5,0x20,0x9f,0xf5,0x20,0x9f,0xf5,0x20,0x9f,0xf5, +0x58,0x87,0x86,0x7c,0xd6,0x83,0x7c,0xd6,0x83,0x7c,0xd6,0x83,0x82,0xad,0x07,0x39, +0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae, +0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07, +0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x05,0x9b,0x19,0x15, +0xcd,0xa8,0x68,0xb6,0x16,0x91,0x33,0xcd,0xc8,0x99,0x66,0xe4,0x4c,0x33,0x72,0xa6, +0x19,0x39,0xd3,0x8c,0x9c,0x69,0x46,0xce,0x34,0xa3,0xd8,0x33,0x23,0x8f,0x9a,0xd1, +0x9a,0x34,0xa3,0x35,0x69,0x46,0x6b,0xd2,0x8c,0xd6,0xe4,0x2d,0x64,0xce,0x5b,0xc8, +0x9c,0xb7,0x90,0x39,0x6f,0x21,0x73,0xde,0x42,0xe6,0xbc,0x05,0xcd,0x69,0xba,0xac, +0x40,0xa2,0x44,0x52,0x8e,0xa4,0x02,0x89,0x0a,0x89,0xb5,0x55,0x83,0xa4,0x12,0x89, +0x16,0x89,0x0e,0x89,0x1e,0x49,0x15,0x12,0x03,0x12,0x23,0x92,0x0b,0x48,0x3e,0x41, +0x52,0x8d,0xc4,0x84,0xe4,0x53,0x24,0x17,0x91,0xd4,0x20,0xa9,0x45,0x52,0x87,0xe4, +0x33,0x24,0xf5,0x48,0x1a,0x90,0x7c,0x8e,0xe4,0x0b,0x24,0x8d,0x48,0x9a,0x90,0x7c, +0x89,0x04,0x1a,0xbb,0xae,0xbf,0x19,0x49,0x0b,0x92,0x4b,0x48,0x2e,0x23,0x69,0x45, +0xd2,0x86,0xe4,0x0a,0x92,0xab,0x48,0xda,0x91,0x74,0x20,0xb9,0x86,0xe4,0x6b,0x24, +0x9d,0x48,0xba,0x90,0x5c,0x47,0xf2,0x0d,0x92,0x1b,0x48,0xba,0x91,0xdc,0x44,0xd2, +0x83,0xa4,0x17,0x89,0x19,0xc9,0x2d,0x24,0xb7,0x91,0xf4,0x21,0xe9,0x47,0x72,0x07, +0xc9,0xb7,0x48,0x06,0x90,0x0c,0x22,0xb9,0x8b,0x04,0x5a,0xb7,0xee,0x0e,0x6a,0xb8, +0x83,0x1a,0xee,0xa0,0x86,0x3b,0xa8,0xe1,0x0e,0x6a,0xf8,0x56,0x81,0x44,0x89,0xa4, +0x1c,0x49,0x05,0x12,0x15,0x12,0x35,0x12,0x0d,0x92,0x4a,0x24,0x5a,0x24,0x3a,0x24, +0x7a,0x24,0x55,0x48,0x0c,0x48,0x8c,0x48,0x2e,0x20,0xf9,0x04,0x49,0x35,0x12,0x13, +0x92,0x4f,0x91,0x40,0xc3,0x36,0xa9,0x3f,0x83,0xa9,0x0d,0x1d,0xd4,0xff,0xd6,0x01, +0x4c,0xd7,0xdf,0x2c,0x7c,0xf3,0x66,0xe1,0xc6,0x9b,0x85,0xee,0x37,0x0b,0xd0,0x20, +0x4d,0x9a,0x7e,0xec,0x4a,0x9a,0x3b,0xaf,0x0f,0xfa,0xdf,0xb8,0xe4,0x5a,0xed,0xeb, +0x42,0xff,0x1b,0xd7,0xff,0xa5,0xe5,0x1b,0x70,0xbf,0x1b,0x3c,0xb8,0x0d,0x7e,0xa3, +0xad,0x84,0x09,0xce,0xfd,0xcb,0xd6,0x4b,0x48,0x2e,0x23,0x69,0x45,0xd2,0x86,0xe4, +0x0a,0x92,0xab,0x48,0xda,0x91,0x74,0x20,0xb9,0x86,0xe4,0x6b,0x24,0x9d,0x48,0xba, +0x90,0x5c,0x47,0xf2,0x0d,0x92,0x1b,0x48,0xba,0x91,0xdc,0x44,0xd2,0x83,0xa4,0x17, +0x89,0x19,0xc9,0x2d,0x24,0xb7,0x91,0xf4,0x21,0xe9,0x47,0x72,0x07,0xc9,0xb7,0x48, +0x06,0x90,0x0c,0x22,0xb9,0x8b,0x04,0x3a,0xe8,0xcb,0x36,0x05,0x12,0x25,0x12,0x34, +0xc8,0x36,0xf8,0x60,0xbf,0x0e,0x7e,0x6c,0x01,0x93,0xdf,0x00,0xb2,0x1f,0xa0,0xf8, +0x81,0x77,0xfd,0xc0,0x21,0x3f,0x40,0xf5,0x03,0x34,0x3f,0xf0,0x9e,0x1f,0x78,0xdf, +0x0f,0x04,0xfa,0x01,0x3a,0x7a,0xe9,0xa9,0xc9,0x47,0x2f,0x35,0x85,0xc5,0x80,0x5b, +0x00,0xf2,0x33,0x40,0x7e,0x3e,0x10,0x0a,0x0b,0x40,0xe1,0xc7,0x40,0x00,0xff,0xcb, +0x00,0x82,0x3c,0x90,0x91,0x0d,0x7e,0x56,0x7e,0xfb,0xb3,0xb2,0xca,0xfa,0x1b,0x7f, +0x39,0xfa,0x9b,0xcd,0xcf,0x80,0xe5,0x13,0xf4,0x47,0x1c,0x95,0xc0,0xd2,0xfa,0x39, +0x98,0xbb,0x7a,0x19,0xcc,0xdc,0x69,0x05,0xb3,0xf5,0xcd,0xe0,0x99,0xaa,0x05,0x58, +0x74,0x46,0x60,0xb9,0x6b,0x00,0x16,0x8d,0x11,0xcc,0xc2,0xad,0xdc,0xa2,0x6d,0x02, +0xcf,0xcc,0xe5,0x60,0xee,0x66,0x07,0xb0,0x5c,0x86,0x65,0xf8,0xf4,0x9d,0x1d,0xa8, +0x01,0xb3,0xfa,0x5a,0x30,0x6b,0xac,0x05,0xf3,0x4a,0x3d,0x98,0x35,0x54,0x82,0x59, +0xdd,0x45,0xf0,0xec,0x8a,0x12,0x3c,0xeb,0x40,0xff,0xd4,0xa8,0x05,0xb3,0x77,0x14, +0xe0,0x59,0x0d,0xbc,0x9f,0xee,0x26,0xb0,0xc0,0x9d,0x7f,0x5e,0x8d,0xde,0xb2,0x6a, +0x66,0x1b,0x3b,0xd7,0xde,0xc3,0x6a,0x66,0xfa,0x74,0xaf,0x8f,0xee,0x18,0xb0,0x23, +0xcb,0xf5,0xd7,0x75,0xcf,0xca,0xfb,0xb1,0x23,0x78,0xe1,0xd7,0x75,0x5f,0x7c,0xf6, +0xba,0x5f,0x55,0xd3,0xeb,0xd6,0x5a,0x6b,0x9d,0xe5,0x2e,0x9a,0xd5,0x37,0x60,0xa6, +0x6f,0x10,0xa6,0x3e,0x30,0xd3,0x0f,0xed,0xd9,0xac,0xba,0x04,0x66,0x06,0x9b,0xc1, +0xcc,0xdd,0x6f,0x81,0x45,0x51,0x0e,0x2c,0x4a,0x38,0x34,0xf8,0x26,0x63,0x41,0xbf, +0xa1,0x7f,0x0a,0x57,0x76,0x73,0x3d,0xac,0x50,0xa3,0x3f,0x11,0x6a,0x85,0x09,0xfa, +0xac,0xb9,0xa6,0x11,0xb6,0xf4,0xc3,0x02,0x0c,0x88,0xe6,0xda,0x2a,0x68,0x05,0x78, +0x5d,0x4d,0x2b,0x98,0xf9,0x16,0x59,0x04,0x06,0x43,0x47,0xe5,0x57,0xd0,0x24,0xf0, +0xcd,0xe8,0x22,0xca,0xe1,0x75,0x75,0x1a,0x98,0x6e,0x83,0x9f,0x6b,0xd0,0x9f,0xd4, +0xaa,0x61,0x82,0x65,0xa3,0x0e,0xa6,0xcf,0x61,0x82,0xd3,0x37,0x0e,0xc2,0x04,0xdd, +0xdc,0xdc,0xde,0x09,0x9e,0x29,0xa1,0xfd,0x3e,0xd1,0xc3,0x04,0x77,0x94,0x66,0xf4, +0x77,0x44,0x9f,0x7c,0x0d,0x53,0x37,0x34,0x18,0x3c,0x0b,0x8e,0xc8,0x02,0xdf,0x6f, +0x2c,0xf0,0x9d,0xc4,0x62,0x6a,0x87,0xe5,0x4b,0xc0,0x02,0x9f,0xf0,0x96,0x9a,0x6a, +0x60,0xa9,0xbd,0x08,0x13,0xec,0x5f,0xa7,0x82,0x09,0x9e,0x03,0x9f,0xac,0x96,0xcf, +0xe0,0x8c,0x1a,0xeb,0x60,0x82,0x43,0x6c,0x30,0xc1,0xd4,0x0b,0x1d,0x74,0x1d,0x58, +0xbe,0xba,0x00,0x13,0x3c,0x6e,0x86,0x8e,0xfc,0x12,0x4e,0xa1,0x19,0x3a,0xa0,0x19, +0xde,0xe3,0x12,0x1c,0x7e,0x0b,0x7c,0x19,0xb1,0x5c,0x86,0x15,0x97,0x6f,0x43,0xef, +0xc3,0x9b,0xc2,0x25,0x61,0x69,0x83,0xcb,0xa2,0xe5,0x73,0x18,0xfd,0x2d,0x5f,0x5c, +0x03,0x96,0xab,0x9d,0xc0,0xd2,0xfe,0x05,0x4c,0x57,0xe1,0x71,0x3d,0xb0,0x74,0x5c, +0x01,0x3f,0x7f,0x71,0x1d,0xa6,0x01,0x60,0xe9,0x84,0x43,0xeb,0x84,0x81,0xdb,0x72, +0x15,0x1e,0x7c,0x53,0x01,0x13,0xec,0xf0,0x0d,0x5c,0x00,0x2d,0x9d,0xe8,0xe0,0x3b, +0x60,0xb9,0x01,0xaf,0x39,0x78,0x11,0xfc,0xfc,0xa5,0x12,0x58,0xba,0x9b,0x81,0x05, +0x3e,0x43,0x2d,0x37,0xe1,0x06,0xd2,0x72,0x1b,0xde,0xd8,0x5c,0x81,0x0e,0xae,0xc0, +0x03,0x38,0x4c,0x33,0x9c,0x06,0x7c,0x4c,0x58,0x6e,0xc3,0x98,0xbb,0x7d,0x09,0xfc, +0xdc,0xfc,0x0d,0xcc,0xa1,0xb1,0xfa,0xe0,0xd4,0xa1,0x17,0x2d,0x70,0x0f,0xfd,0xb9, +0x05,0x8e,0xec,0x92,0x06,0x5a,0xbb,0x05,0x76,0xbc,0x03,0x8d,0x77,0x07,0xce,0xfb, +0x0e,0x5c,0x61,0xd7,0x2e,0xa0,0x7f,0x13,0x34,0x74,0x83,0x39,0x2d,0xbc,0xd1,0x00, +0x3c,0x1d,0x3d,0x1c,0x2e,0xeb,0xe1,0x92,0xbb,0x52,0x09,0x2d,0x8f,0x7e,0x4f,0x18, +0xfc,0x1a,0xd6,0x42,0x9b,0xdd,0x85,0xe5,0xef,0xa0,0x2d,0xbe,0x83,0x76,0xfa,0x0e, +0x06,0x6f,0xb9,0x12,0xfc,0x0c,0x57,0xe4,0xcf,0xad,0x70,0x97,0xbf,0xf4,0x05,0x8c, +0x64,0xb8,0x12,0x66,0xd5,0xe8,0xdf,0x45,0x0d,0x30,0xdd,0x01,0xb3,0x9a,0x9b,0x30, +0xc1,0x15,0xa1,0xf9,0x06,0xcc,0x56,0xa2,0x7f,0x9c,0x47,0x3f,0x4a,0x7c,0x01,0x23, +0xbc,0x09,0x46,0x7d,0x37,0x98,0xad,0x82,0xe7,0x18,0xe1,0x2e,0x78,0xa9,0x13,0x9e, +0x60,0x18,0x84,0x15,0x03,0xb0,0xa2,0x1d,0xcc,0x5e,0xa8,0x00,0xb3,0x9f,0xc0,0x9d, +0xe5,0xd2,0x37,0xb0,0x57,0xf5,0x25,0x58,0x50,0xc3,0x4a,0x38,0x8f,0xf6,0xeb,0x60, +0xd6,0xd4,0x01,0xd3,0x5d,0x30,0xfb,0x29,0xbc,0x8a,0x09,0x06,0x4c,0x47,0x27,0x98, +0xad,0x85,0x2e,0xb9,0x0c,0xbf,0x8a,0xcc,0x7e,0x76,0x19,0xcc,0x7e,0xd1,0x07,0x66, +0x1b,0x74,0xe0,0xe7,0x4e,0xf8,0xae,0x0d,0x0d,0xfd,0xf3,0xd7,0xd0,0x62,0xf0,0x85, +0xda,0xa2,0x81,0x0b,0xad,0x51,0x01,0x66,0x3f,0x6f,0x04,0x73,0xe5,0x5d,0x60,0xe6, +0x93,0x06,0x58,0x6e,0x01,0xb3,0x4d,0x70,0x68,0x4d,0x17,0xd1,0x3f,0x88,0x42,0x03, +0x75,0xe9,0xc0,0xec,0x57,0x70,0xec,0x5f,0xc2,0x3b,0xb6,0x40,0xdb,0x5c,0x36,0x75, +0x81,0xd9,0x4b,0x17,0xc0,0x6c,0xf3,0x57,0x60,0xb6,0x15,0x0e,0x18,0xee,0x2d,0xb3, +0x57,0xe0,0x5d,0xae,0x5e,0x03,0xb3,0xd7,0xa0,0xaf,0x2f,0x7f,0x0e,0x0b,0x5f,0x7f, +0x01,0x7e,0xbe,0x51,0x0f,0x66,0x3b,0xe1,0x73,0xed,0xf2,0xa5,0xab,0x60,0xb6,0x0b, +0x7e,0x4d,0xea,0x86,0x67,0x75,0x41,0x13,0x5c,0x87,0x67,0x5e,0x87,0x9b,0xd6,0xe5, +0x6b,0xc8,0x7f,0xbd,0xf0,0x79,0x70,0xf9,0x6b,0x78,0x07,0xd8,0xbc,0x78,0xf9,0x26, +0x9c,0xf1,0xcd,0xef,0xc0,0x2c,0x7c,0xc3,0x99,0xed,0x86,0xe7,0xf5,0xd6,0xc1,0x04, +0x27,0x67,0x86,0x93,0x84,0xef,0x03,0xb3,0xe8,0x91,0x7e,0x19,0xfd,0x28,0xd0,0xdb, +0x0b,0x66,0xfb,0xa0,0x1d,0xe1,0x83,0xef,0xe7,0xde,0x1e,0x30,0x8b,0x1e,0x35,0x97, +0xe1,0xd3,0x63,0xf6,0x36,0xf4,0xc4,0x20,0xdc,0x53,0x2f,0x0f,0xc2,0x85,0x78,0xf9, +0x2e,0xbc,0xe7,0x77,0x1a,0xf0,0x4c,0xd1,0x0f,0x13,0x1c,0xd4,0xad,0x3a,0xb8,0x58, +0xf4,0x30,0x0d,0xc2,0x74,0x1b,0x3c,0x83,0xf3,0x86,0x8b,0xb3,0x0d,0x3c,0x53,0xc3, +0x0b,0xb7,0xea,0x2e,0x83,0x67,0x1a,0xe8,0xbd,0xd6,0x0b,0xe8,0x6f,0xb8,0xdb,0xc1, +0x33,0x1d,0xf4,0x46,0x6b,0xbd,0x16,0x3c,0xd3,0xc3,0x4d,0x07,0x6e,0x4c,0x8b,0xad, +0x8d,0xe8,0x1f,0xd3,0x9b,0x6b,0xc0,0x33,0xe3,0x1d,0xf0,0xec,0x02,0xdc,0xfd,0xee, +0xa0,0x3f,0xe7,0x86,0xdf,0x6c,0xee,0xf4,0x81,0x67,0xf0,0xd5,0xff,0x99,0xa9,0x11, +0x3c,0xfb,0x54,0x0d,0x9e,0x5d,0x84,0x5f,0x04,0x07,0xbe,0x80,0x5b,0x15,0xf4,0x5b, +0xeb,0x8d,0x5b,0xf0,0x00,0xc6,0x77,0xeb,0x4d,0x14,0x5e,0x9a,0xaf,0xc0,0xb3,0x7a, +0x74,0xe5,0xbb,0x2d,0x48,0x60,0x6c,0xb5,0x29,0x55,0xe0,0xe7,0xef,0x06,0xc0,0x8c, +0x02,0x3e,0x2c,0xdb,0xe0,0x17,0x23,0x28,0xf0,0x19,0xd0,0xa6,0x6a,0x40,0xd2,0x03, +0x9e,0x35,0xa2,0xdf,0xcf,0xe0,0x69,0x70,0xdd,0xcd,0x28,0x35,0x60,0xa6,0x1c,0xbe, +0x67,0xb4,0xa1,0x1f,0x5e,0x5a,0x2e,0x80,0x19,0xf8,0xe5,0x6a,0xb1,0xad,0x1e,0x3e, +0x6f,0xda,0x3e,0x87,0xaf,0x1a,0x6d,0x5f,0xc0,0xbb,0x5f,0xfd,0x1a,0xcc,0xa8,0xbe, +0x81,0x9b,0x26,0x9c,0x6b,0x07,0x7c,0xba,0xb6,0xb5,0xc1,0x07,0x44,0xdb,0xb5,0xab, +0xe0,0xd9,0xd7,0xd7,0xc1,0x0c,0x7a,0x68,0xb5,0x5d,0x87,0x73,0xfc,0x06,0x9a,0xe6, +0x1b,0x1d,0xac,0x80,0xdb,0x52,0xdb,0x4d,0x38,0x47,0xf8,0x02,0x39,0xa3,0x87,0x1b, +0x36,0x7c,0xb5,0x7b,0x06,0xdf,0xfb,0x9e,0xf5,0xc2,0x67,0x48,0xdb,0x5d,0xd8,0xcb, +0x0c,0x77,0x73,0x03,0xdc,0x85,0x6f,0xc3,0x29,0xf6,0x95,0x83,0x67,0xfd,0x6a,0x58, +0x86,0x0f,0xa7,0x2b,0xd0,0x4c,0x8b,0x57,0x74,0x95,0x60,0xc6,0x08,0xc7,0x7a,0xa5, +0xaa,0x01,0x3c,0x1b,0x84,0x4f,0xa5,0x2b,0x86,0xbb,0xe0,0xd9,0xdd,0x5a,0xf0,0xec, +0x3b,0x54,0x40,0xdf,0x6d,0xae,0xd4,0x5c,0x06,0x73,0x4a,0xf8,0xb2,0x73,0x05,0xbe, +0xef,0xcf,0xc1,0x0d,0x6b,0xf1,0xb2,0xf1,0x2b,0x18,0x74,0xb5,0x30,0xf8,0x6e,0x82, +0x39,0x55,0x05,0x98,0xa9,0xae,0x82,0xf9,0x5d,0x60,0xb9,0x06,0x6d,0x7c,0xe5,0xcb, +0xab,0x48,0xe0,0xd1,0xe5,0x0b,0x28,0x16,0x2f,0xc0,0x20,0xd5,0xaa,0xc0,0xdc,0xdd, +0x2f,0xc1,0x8c,0xe9,0x6b,0x30,0xa7,0x37,0xc1,0x04,0xfb,0xeb,0xd1,0x1f,0x58,0xf6, +0xc0,0x1c,0x2e,0x59,0x6b,0x3e,0x08,0xe6,0xaa,0xa0,0x29,0xae,0x74,0x0e,0x80,0x39, +0x43,0x13,0x98,0x33,0xc2,0xdb,0x5e,0xe8,0x82,0xc7,0x28,0x87,0x8d,0x9f,0x5c,0x85, +0x75,0x17,0x61,0xae,0x87,0xc9,0x00,0x13,0xf4,0xf7,0x15,0xe8,0x9f,0xc5,0x2b,0x70, +0xe3,0x58,0xbc,0x02,0x5f,0x99,0x67,0x6a,0xe0,0xf5,0xe1,0x77,0xa3,0x39,0xf8,0xad, +0x68,0xae,0x06,0x1a,0xfa,0x2a,0xea,0x5b,0x0b,0xfd,0x78,0x65,0xa0,0x13,0xcc,0xd4, +0x36,0xc1,0x04,0x1d,0x77,0xe5,0x2e,0x7c,0x54,0x5f,0xad,0x80,0x06,0xab,0x85,0xfd, +0x1b,0xaa,0x61,0x82,0x97,0x6e,0xe8,0x00,0x73,0x9f,0xa3,0xa4,0x05,0x73,0x8d,0x17, +0xc0,0xdc,0x17,0x97,0x60,0x0e,0x27,0xdc,0x04,0xfb,0x7c,0x09,0x1d,0xf7,0xd9,0x67, +0x60,0xee,0xab,0x16,0x30,0xd7,0xac,0x84,0xc7,0xfd,0x60,0xae,0x05,0x5a,0xe4,0x2a, +0x3a,0x11,0xbe,0x34,0xce,0xc1,0xb7,0xc2,0x99,0x7a,0x33,0xcc,0xe1,0x2e,0xf2,0x29, +0x5c,0x21,0x57,0x2f,0xc1,0x40,0xbe,0xda,0x76,0x05,0xcc,0x7c,0x7e,0x17,0xcc,0x7c, +0x51,0x09,0xe6,0xae,0xa1,0xee,0x37,0xe1,0xf5,0x6e,0xc2,0xeb,0xc1,0xaf,0x10,0x73, +0xbd,0x5f,0x80,0x39,0xf4,0xb6,0x7c,0x75,0x00,0xbe,0x42,0x34,0x37,0x43,0x0b,0xa1, +0x9f,0xdb,0x6e,0xc1,0xc9,0xdf,0x86,0x26,0x6e,0x86,0x57,0x9c,0xfb,0x16,0xbe,0x9d, +0xb6,0x7f,0xf6,0x29,0x92,0x2e,0x30,0x5f,0x5e,0x03,0xe6,0x2b,0xba,0xc1,0xbc,0x0a, +0xbe,0x69,0xb5,0x37,0x5e,0x87,0x07,0x5f,0x80,0x79,0x6d,0x1f,0x98,0xaf,0xfa,0x0c, +0xa6,0x7a,0x30,0xaf,0x1b,0x00,0xf3,0x9f,0xf4,0x83,0xf9,0x6a,0x18,0xee,0xed,0xdf, +0xdc,0x01,0xf3,0x75,0x30,0xe6,0xae,0xc0,0x07,0x32,0xfa,0x86,0xd5,0x0e,0xef,0x35, +0x73,0xf5,0x0a,0x98,0xff,0x02,0x6e,0xd2,0xb7,0x6e,0x82,0xf9,0x46,0x18,0x7b,0x1d, +0x68,0xf1,0x74,0x68,0x3f,0x07,0x33,0x1d,0x30,0xb8,0x3a,0xe0,0x33,0xf9,0x2b,0x38, +0xcc,0x8e,0x6a,0x3d,0x98,0xb9,0x06,0xa3,0xb8,0xe3,0xd3,0x3a,0x30,0xdf,0x0c,0xdf, +0x7f,0x3a,0xd0,0xe3,0xfa,0x32,0x7c,0x76,0x76,0xf6,0x80,0x79,0xf8,0x42,0x34,0x7f, +0xe5,0x2a,0x98,0xbf,0x5a,0x0e,0x13,0x9c,0xdd,0x37,0x70,0xf9,0x77,0x74,0xde,0x00, +0xf3,0xdd,0x0a,0x30,0xdf,0x03,0x9f,0xb6,0xf0,0xfb,0xcd,0x0c,0xfc,0x22,0x31,0x6f, +0x86,0x81,0x70,0x0d,0xfd,0x66,0xde,0x03,0x17,0xca,0x35,0x15,0xbc,0xd5,0x35,0x2d, +0xec,0x7b,0x0d,0x46,0xc0,0x8c,0x19,0x5e,0xf9,0xdb,0xbb,0x60,0x1e,0x7e,0x3f,0x9b, +0x1f,0xf8,0x04,0x26,0xe8,0xad,0x6b,0xf5,0x0a,0x00,0x70,0x1b,0x36,0xda,0xd8,0x6e, +0xda,0xbc,0xd9,0x0e,0xbf,0x65,0xab,0xbd,0xc3,0x5b,0x8e,0x9b,0x7f,0xf9,0x10,0x36, +0x3b,0x6d,0xdb,0xee,0xec,0xb2,0x63,0xa7,0xab,0xb5,0xe8,0xb6,0x79,0xd7,0x6e,0x77, +0x8f,0x3d,0x6f,0x7b,0x7a,0x6d,0xfe,0xbb,0x7f,0xf6,0xee,0x83,0xe2,0xfd,0xab,0x5e, +0x92,0xb8,0xff,0x80,0x8f,0xef,0xc1,0x77,0xb0,0x92,0xdf,0xeb,0x6a,0x92,0xff,0xe6, +0x00,0x32,0x05,0x1e,0xbc,0xbb,0xf9,0x9f,0xf3,0x73,0x68,0x33,0x95,0xf6,0xde,0xfb, +0x81,0xaf,0x8b,0xf4,0x37,0xdb,0x82,0x0e,0x6f,0x0e,0x0e,0xf9,0xe0,0x75,0xe9,0xc3, +0xcd,0xff,0xc6,0x9f,0xd0,0xb0,0x23,0x9b,0xd7,0x3f,0xeb,0x9f,0xf5,0xcf,0xfa,0x67, +0xfd,0xb3,0xfe,0x59,0xff,0xac,0x7f,0xd6,0x3f,0xeb,0x9f,0xf5,0xcf,0xfa,0x67,0xfd, +0xf3,0xef,0xf3,0x01,0x36,0xeb,0xfc,0x55,0xd8,0x02,0xbb,0xdf,0x02,0x0f,0x08,0xc0, +0x09,0x38,0x63,0xb8,0x00,0x77,0x88,0x07,0xf0,0x02,0x44,0x40,0x02,0x64,0x08,0x05, +0xd0,0x41,0x08,0x08,0x05,0x61,0x80,0x05,0x38,0x20,0x03,0xc2,0x07,0x62,0x20,0x03, +0x2a,0x60,0x00,0x35,0x90,0x46,0xd0,0x0a,0x3a,0x41,0x2f,0x18,0x00,0xf7,0xc1,0x43, +0xf0,0x18,0x3c,0x81,0xcc,0x80,0xe7,0xe0,0x05,0x78,0x05,0x6c,0x70,0xf6,0x56,0x9c, +0x71,0xee,0x38,0x6f,0x9c,0x1f,0x8e,0x6a,0x25,0x18,0x17,0x8e,0x63,0xe2,0x92,0x70, +0x29,0xb8,0x0c,0x08,0x1f,0x27,0xc6,0xc9,0x70,0x2a,0x9c,0x01,0x57,0x83,0x6b,0xc4, +0xb5,0xe2,0x3a,0x21,0xbd,0xb8,0x01,0xdc,0x7d,0xdc,0x43,0xdc,0x63,0xdc,0x13,0x2b, +0x33,0xb8,0xe7,0xb8,0x17,0xb8,0x57,0x38,0x9b,0x0d,0x36,0x1b,0xec,0x21,0xce,0x1b, +0xdc,0x37,0x78,0x6f,0xf0,0xdb,0x40,0xdd,0x10,0xbc,0x21,0x7c,0x03,0x73,0x43,0xd2, +0x86,0x94,0x0d,0x19,0x1b,0xf8,0x1b,0xc4,0x1b,0x64,0x1b,0x54,0x1b,0x0c,0x56,0x6a, +0x36,0x34,0x6e,0x68,0xdd,0xd0,0xb9,0xa1,0x77,0xc3,0xc0,0x86,0xfb,0x1b,0x1e,0x6e, +0x78,0xbc,0xe1,0xc9,0x86,0x99,0x0d,0xcf,0x37,0xbc,0xd8,0xf0,0x6a,0x83,0xcd,0x46, +0xfb,0x8d,0xce,0x1b,0xdd,0x37,0x7a,0x6f,0xf4,0xb3,0x42,0xdd,0x18,0xbc,0x31,0x7c, +0x23,0x73,0x63,0xd2,0xc6,0x94,0x8d,0x19,0x1b,0xf9,0x1b,0xc5,0x1b,0x25,0x1b,0xe5, +0x1b,0x55,0x1b,0x0d,0x1b,0x6b,0x36,0x36,0x6e,0x6c,0x85,0x74,0x6e,0xec,0xdd,0x38, +0xb0,0xf1,0xfe,0xc6,0x87,0x1b,0xc7,0x37,0x4e,0x6d,0x9c,0xb1,0xf2,0x7c,0xe3,0x8b, +0x8d,0xaf,0x36,0xda,0xd8,0xd8,0xdb,0xb8,0xd8,0xb8,0x5b,0xf1,0xb6,0xf1,0xb3,0xa1, +0xda,0x04,0xdb,0x84,0xdb,0x30,0xad,0x24,0xd9,0xa4,0xd8,0x64,0xd8,0xf0,0x6d,0xc4, +0x36,0x32,0x1b,0x95,0x8d,0xc1,0xa6,0xc6,0xa6,0xd1,0xa6,0xd5,0xa6,0xd3,0xa6,0xd7, +0x66,0xc0,0xe6,0xbe,0xcd,0x43,0x9b,0xc7,0x36,0x4f,0xac,0xcc,0xd8,0x3c,0xb7,0x79, +0x61,0xf3,0xca,0xc6,0xc6,0xd6,0xde,0xd6,0xd9,0xd6,0xdd,0xd6,0xdb,0xd6,0xcf,0x96, +0x6a,0x1b,0x6c,0x1b,0x6e,0xcb,0xb4,0x4d,0xb2,0x4d,0xb1,0xcd,0xb0,0xe5,0xdb,0x8a, +0x6d,0x65,0xb6,0x2a,0x5b,0x83,0x6d,0xad,0x6d,0xfd,0x5f,0x4d,0xb3,0x6d,0xfb,0xff, +0xc0,0x0d,0xdb,0xbe,0x3f,0x89,0x7e,0xdb,0x61,0xdb,0x31,0xdb,0x29,0x5b,0x8b,0xed, +0x82,0xed,0xb2,0xed,0xaa,0xad,0xed,0x26,0xfb,0x4d,0xce,0x9b,0xdc,0x37,0x79,0x6f, +0xf2,0xdb,0x44,0xdd,0x14,0xbc,0x29,0x7c,0x13,0x73,0x53,0xf2,0xa6,0x8c,0x4d,0xc2, +0x4d,0xb2,0x4d,0xda,0x4d,0x35,0x9b,0x9a,0x37,0x75,0x42,0xfa,0x36,0xdd,0xdf,0xf4, +0x68,0xd3,0x93,0x4d,0x33,0x9b,0x9e,0x5b,0x79,0xb1,0xe9,0xd5,0x26,0x9b,0xcd,0xf6, +0x9b,0x9d,0x37,0xbb,0x6f,0xf6,0xd9,0x4c,0xdd,0x1c,0xbc,0x39,0x7c,0x33,0x6b,0x33, +0x7b,0x73,0xea,0xe6,0x8c,0xcd,0xfc,0xcd,0x62,0x2b,0xb2,0xcd,0xaa,0xcd,0xd5,0x9b, +0x1b,0x37,0xb7,0x6e,0xee,0xdc,0xdc,0xbb,0x79,0x00,0x72,0x7f,0xf3,0xc3,0xcd,0x8f, +0x37,0x3f,0xd9,0x3c,0xb3,0xf9,0xf9,0xe6,0x17,0x9b,0x5f,0x6d,0xb6,0xb1,0xb3,0xb7, +0x73,0xb6,0x73,0xb7,0xf3,0xb6,0xf3,0xb3,0xa3,0xda,0x05,0xdb,0x85,0xdb,0x31,0xed, +0x92,0xec,0x52,0xec,0x32,0xec,0xf8,0x76,0x62,0x3b,0x99,0x9d,0xca,0xce,0x60,0x57, +0x63,0xd7,0x68,0xa5,0xd5,0xae,0xf3,0xb7,0xe8,0xb5,0x1b,0xb0,0xbb,0x6f,0xf7,0xd0, +0x6e,0xc2,0x6e,0xc6,0x6e,0xd1,0xee,0x95,0x9d,0x0d,0xde,0x1e,0xef,0x8a,0xf7,0xc6, +0xfb,0xe1,0xa9,0xff,0xa6,0xd0,0xf0,0x74,0x7c,0x08,0x3e,0x0c,0x1f,0x81,0x67,0xe0, +0x59,0xf8,0x78,0x3c,0x1b,0x9f,0xfc,0x57,0xc1,0xc1,0xa7,0xe3,0x79,0x78,0x11,0x5e, +0x8a,0x57,0xe2,0xb5,0x10,0x1d,0xde,0x88,0x37,0xe1,0x6b,0xf1,0x0d,0xf8,0xc6,0x7f, +0x5a,0x9a,0xf1,0xad,0x90,0x76,0xfc,0x8d,0xbf,0x31,0xbd,0xbf,0x60,0xc6,0x0f,0x60, +0xdc,0xfb,0x85,0x21,0xfc,0xf7,0xf8,0x47,0xf8,0x09,0xfc,0x13,0xfc,0x0c,0xfe,0x39, +0xfe,0x05,0xe4,0x15,0xc4,0x66,0x8b,0xfd,0x16,0xd7,0xbf,0x00,0xcf,0x2d,0x3e,0x5b, +0xc8,0x5b,0x02,0xb7,0x84,0x6e,0x89,0xdc,0x92,0xf4,0x17,0x90,0xb2,0x25,0x63,0x0b, +0x7f,0x8b,0x78,0x8b,0x6c,0x8b,0x7c,0x8b,0x72,0x8b,0x7a,0x8b,0x7e,0xcb,0xa7,0x5b, +0x1a,0xb6,0x34,0x6d,0x69,0xfe,0xb3,0x69,0xd9,0xd2,0xb6,0xa5,0x63,0x4b,0xe7,0x96, +0xae,0x2d,0xdd,0x5b,0x7a,0xad,0x98,0xb7,0xf4,0xfd,0x0e,0xf7,0xb6,0x3c,0x80,0x3c, +0xc2,0x98,0xf8,0x85,0xa7,0x5b,0xe6,0xb6,0x2c,0xfe,0x5e,0x5e,0xfe,0x95,0x80,0xad, +0x7f,0x0e,0x76,0x5b,0x09,0x10,0x57,0x0c,0xcf,0x5f,0xf0,0xd9,0x4a,0xde,0x1a,0xf8, +0x67,0x12,0xba,0x35,0xf2,0x1f,0x90,0xb8,0xad,0xc9,0xff,0x03,0x69,0x5b,0xb9,0x5b, +0x85,0x5b,0x8b,0xac,0x28,0xb6,0x6a,0xad,0x54,0x6f,0xad,0xdf,0xda,0xbc,0xb5,0x7d, +0xeb,0x8d,0xad,0x7d,0x56,0xee,0x6d,0x7d,0xb0,0xf5,0xd1,0xd6,0x89,0xad,0x4f,0xb7, +0xce,0x59,0x59,0xdc,0xfa,0x72,0x2b,0xb0,0xb7,0xb3,0x27,0xd8,0xbb,0xda,0x7b,0xda, +0xfb,0xd8,0x93,0xed,0x03,0xed,0x43,0xed,0x23,0xad,0xc4,0xd9,0x27,0xaf,0xf3,0x07, +0xe1,0xd8,0xa7,0xad,0xf3,0x17,0xc1,0xb5,0x17,0xda,0x17,0xd9,0x2b,0xec,0xb5,0xff, +0xc0,0xe8,0xec,0x4d,0xf6,0x0d,0xf6,0x2d,0xf6,0xed,0xff,0x60,0xdc,0x80,0xf4,0xfd, +0x51,0xee,0xfd,0xcd,0x00,0xeb,0x9f,0x7f,0xf3,0xcf,0xdf,0x22,0xaa,0x1e,0xfc,0x0e, +0x8f,0xac,0x4c,0xfc,0x4a,0x3c,0xb5,0x9f,0xb3,0x5f,0xb4,0x7f,0x69,0x0f,0x1c,0xec, +0x1c,0x08,0x0e,0xae,0xff,0xa2,0x78,0x3a,0xf8,0xfc,0x11,0xc8,0x0e,0x81,0x90,0xd0, +0x7f,0x1a,0x22,0xad,0xc4,0xfd,0x2a,0x24,0x3b,0xa4,0x39,0x70,0xad,0x08,0xd7,0xf9, +0x17,0xa4,0xc8,0x8a,0xc2,0x41,0xfb,0x47,0xa8,0x76,0xa8,0xff,0xbb,0xd2,0xfc,0x77, +0xa4,0xdd,0xe1,0x86,0x43,0xdf,0xbf,0x2d,0xf7,0xfe,0xcd,0x78,0xf0,0x5b,0x3c,0x72, +0x98,0x80,0x3c,0x75,0x78,0xfe,0x6f,0xce,0x0b,0x87,0x57,0x0e,0x36,0x6f,0xad,0xf3, +0x87,0xb0,0x87,0x38,0xbf,0xe5,0xf9,0x96,0xcf,0x3f,0x0d,0xbe,0x6f,0x91,0xff,0xad, +0xa1,0xbc,0x15,0xf8,0x2b,0x43,0x7f,0x2b,0xec,0xad,0xc8,0xbf,0x29,0x8c,0xb7,0x98, +0x7f,0x57,0x92,0x7e,0x0f,0x29,0xbf,0x90,0xf1,0x0b,0xfc,0x5f,0x10,0xff,0x41,0x64, +0xbf,0x07,0x15,0xc4,0xf0,0x56,0xed,0x5b,0xcd,0x6f,0x75,0xbc,0xd5,0xfb,0x3b,0x0c, +0xfc,0x09,0xdc,0xff,0x3d,0x3c,0xfc,0x85,0xc7,0xbf,0xf0,0xe4,0x17,0x66,0xfe,0x20, +0xcf,0xff,0x85,0x79,0xb1,0xce,0x3f,0x09,0xcb,0x6f,0xbd,0xfc,0xbd,0x00,0x47,0xe0, +0x68,0x07,0x21,0x40,0x5c,0x21,0x9e,0x18,0x3e,0xbf,0x3a,0x64,0x48,0xa0,0x95,0x50, +0xc7,0x48,0x48,0xdc,0x3a,0xff,0x62,0xc4,0x3b,0xb2,0x1d,0x39,0x8e,0x29,0x8e,0xa9, +0x8e,0xe9,0x8e,0x99,0x8e,0x3c,0x47,0x81,0xa3,0xc8,0x51,0xe2,0x28,0x75,0x94,0x3b, +0x2a,0x1d,0xd5,0x8e,0x5a,0x47,0x9d,0xa3,0xd1,0xd1,0xe4,0x58,0xeb,0xd8,0xe0,0xd8, +0xe4,0xd8,0xe2,0xd8,0xe6,0xd8,0xe1,0xd8,0xe5,0xd8,0xed,0x68,0x76,0xec,0x77,0x1c, +0x74,0x1c,0x72,0x1c,0x76,0x1c,0x71,0x1c,0x75,0x7c,0xe4,0x38,0xe6,0x38,0xee,0x38, +0xe9,0x38,0xe5,0x38,0xed,0x68,0x71,0x9c,0x77,0x5c,0x70,0x5c,0x72,0x5c,0x76,0x5c, +0x71,0x5c,0x75,0xc4,0x11,0x6c,0x09,0x78,0x82,0x03,0xc1,0x89,0xe0,0x42,0x70,0x23, +0x78,0x10,0xbc,0x08,0x44,0x82,0x2f,0x81,0x44,0xa0,0x10,0x68,0x04,0x3a,0x21,0x84, +0x10,0xfa,0x07,0x09,0x23,0x84,0xff,0x0a,0x44,0x10,0x18,0x04,0x16,0x21,0x9e,0xc0, +0x26,0x70,0x08,0xa9,0x84,0x74,0x42,0x26,0x81,0x47,0x10,0x10,0x44,0x04,0x09,0x41, +0x4a,0x90,0x13,0x94,0x04,0x35,0x41,0x47,0x30,0x12,0x4c,0x84,0x5a,0x42,0x03,0xa1, +0x89,0xd0,0x42,0x68,0x23,0x74,0x10,0xba,0x08,0xdd,0x04,0x33,0xa1,0x9f,0x30,0x48, +0x18,0x22,0x0c,0x13,0x46,0x08,0xa3,0x84,0x31,0xc2,0x38,0x61,0xe2,0x1f,0x80,0xa7, +0x84,0x39,0xc2,0x22,0xe1,0x25,0x01,0x38,0xd9,0x39,0x11,0x9c,0x5c,0x9d,0xbc,0x9d, +0xc8,0x4e,0x81,0x4e,0xa1,0x4e,0x91,0x4e,0x71,0x4e,0xc9,0x4e,0x69,0x4e,0x5c,0x27, +0xa1,0x53,0x91,0x93,0xc2,0xc9,0xe0,0x54,0xef,0xd4,0xea,0x74,0xc3,0xa9,0xcf,0xe9, +0x9e,0xd3,0x03,0xa7,0x47,0x4e,0x4f,0x9c,0xe6,0x9c,0x16,0x9d,0x5e,0x3a,0x81,0x6d, +0x76,0xdb,0x08,0xdb,0x5c,0xb7,0x79,0x6e,0xf3,0xd9,0x46,0xde,0x16,0xb8,0x2d,0x74, +0x5b,0xe4,0xb6,0xb8,0x6d,0xc9,0xdb,0xd2,0xb6,0x71,0xb7,0x89,0xb7,0x29,0xb6,0x69, +0xb7,0x55,0x6f,0xab,0xdf,0xd6,0xbc,0xad,0x7d,0xdb,0x8d,0x6d,0x7d,0xdb,0xee,0x6d, +0x7b,0xb8,0x6d,0x62,0xdb,0xd3,0x6d,0x73,0xdb,0x16,0xb7,0xbd,0xdc,0x06,0xb6,0xdb, +0x6d,0x27,0x6c,0x77,0xdd,0xee,0xb9,0xdd,0x67,0x3b,0x79,0x7b,0xe0,0xf6,0xd0,0xed, +0x91,0xdb,0xe3,0xb6,0x27,0x6f,0x4f,0xdb,0xce,0xdd,0x2e,0xde,0xae,0xd8,0x6e,0xd8, +0x5e,0xbf,0xbd,0x75,0xfb,0x8d,0xed,0x03,0xdb,0x1f,0x6c,0x7f,0xb4,0x7d,0x62,0xfb, +0xd3,0xed,0x73,0xdb,0x17,0xb7,0xbf,0xdc,0x0e,0x9c,0xed,0x9c,0x9d,0x9d,0x3d,0x9d, +0x7d,0x9c,0xc9,0xce,0x81,0xce,0xa1,0xce,0x91,0xce,0x71,0xce,0x29,0xce,0x5c,0x67, +0xb1,0xb3,0xc2,0xd9,0xe0,0x5c,0xef,0xdc,0xec,0xdc,0xee,0x7c,0xc3,0xb9,0xcf,0xf9, +0x9e,0xf3,0x03,0xe7,0x47,0xce,0x13,0xce,0x4f,0x9d,0xe7,0x9c,0x17,0x9d,0x5f,0x3a, +0x03,0x17,0x3b,0x17,0x67,0x17,0x4f,0x17,0x3f,0x97,0x40,0x97,0x50,0x97,0x48,0x97, +0x38,0x97,0x64,0x97,0x34,0x17,0xae,0x8b,0xd0,0xa5,0xc8,0x45,0xe1,0xa2,0x75,0xa9, +0x76,0xa9,0x77,0x69,0x76,0x69,0x77,0xb9,0xe1,0xd2,0xe7,0x72,0xcf,0xe5,0x81,0xcb, +0x23,0x97,0x09,0x97,0xa7,0x2e,0x73,0x2e,0x8b,0x2e,0x2f,0x5d,0xc0,0x0e,0xbb,0x1d, +0x84,0x1d,0xae,0x3b,0x3c,0x77,0xf8,0xee,0x78,0x77,0x47,0xe0,0x2f,0x84,0xee,0x88, +0xdc,0x11,0xb7,0x23,0x79,0x47,0xc6,0x0e,0xe1,0x0e,0xd9,0x0e,0xed,0x8e,0x9a,0x1d, +0xcd,0x3b,0x3a,0x77,0xf4,0xed,0xb8,0xbf,0xe3,0xd1,0x8e,0x27,0x3b,0xe6,0x76,0xbc, +0xd8,0x01,0x76,0xda,0xef,0x74,0xdd,0xe9,0xbd,0x93,0xbc,0x33,0x78,0x67,0xe4,0xce, +0xb8,0x9d,0xc9,0x3b,0xd3,0x76,0x72,0x77,0x0a,0x77,0x16,0xed,0x54,0xed,0xac,0xde, +0xd9,0xb8,0xb3,0x7d,0x67,0xef,0xce,0x7b,0x3b,0x1f,0xee,0x9c,0xd8,0x39,0xb3,0x73, +0x71,0xe7,0xcb,0x9d,0xc0,0xd5,0xce,0x95,0xe0,0xea,0xea,0xea,0xe9,0xea,0xe3,0x4a, +0x76,0x0d,0x76,0x8d,0x74,0x4d,0x72,0x4d,0x73,0xe5,0xbb,0x16,0xb9,0xaa,0x5c,0xab, +0x5d,0x1b,0x5d,0xdb,0x5d,0x7b,0x5d,0xef,0xb9,0x3e,0x74,0x9d,0x70,0x9d,0x71,0x5d, +0x74,0x7d,0xe5,0x6a,0xe7,0xe6,0xec,0xe6,0xe9,0xe6,0xe3,0x46,0x76,0x0b,0x74,0x0b, +0x75,0x63,0xba,0x25,0xbb,0x65,0xb8,0x09,0xdd,0x64,0x6e,0x5a,0xb7,0x1a,0xb7,0x66, +0xb7,0x4e,0xb7,0x3e,0xb7,0x7b,0x6e,0x0f,0xdc,0x1e,0xb9,0x4d,0xb8,0x3d,0x75,0x9b, +0x73,0x5b,0x74,0x7b,0xf9,0x3b,0x80,0x5d,0x76,0xbb,0x9c,0x77,0x79,0xee,0xf2,0xdb, +0x15,0xb8,0x2b,0x7c,0x57,0xdc,0xae,0xe4,0x5d,0x69,0xbb,0xf8,0xbb,0x8a,0x76,0xa9, +0x76,0x55,0xef,0x6a,0xdc,0xd5,0xbe,0xeb,0xc6,0xae,0xbe,0x5d,0xf7,0x77,0x3d,0xda, +0xf5,0x64,0xd7,0x9c,0x95,0xc5,0x5d,0x2f,0x77,0xd9,0xec,0x26,0xec,0x76,0xdf,0xed, +0x63,0x85,0xbc,0x3b,0x70,0x77,0xf8,0xee,0xb8,0xdd,0x29,0xbb,0xb9,0xbb,0xc5,0xbb, +0x15,0xbb,0xb5,0xbb,0xab,0x77,0x37,0xee,0x6e,0xdf,0xdd,0xbb,0xfb,0xde,0xee,0x87, +0xbb,0x27,0x76,0x3f,0xdd,0x3d,0xb7,0xfb,0xc5,0x6e,0xe0,0x6e,0xef,0xee,0xea,0xee, +0xed,0x4e,0x76,0x0f,0x74,0x0f,0x75,0x67,0xba,0x27,0xbb,0x67,0xb8,0x0b,0xdd,0x65, +0xee,0x5a,0xf7,0x6a,0xf7,0x7a,0xf7,0x56,0xf7,0x1b,0xee,0x03,0xee,0x0f,0xac,0x3c, +0x72,0x9f,0x70,0x9f,0x71,0x5f,0x74,0x7f,0xe5,0x6e,0xe7,0x81,0x20,0x78,0xb8,0x7a, +0x78,0x7b,0x90,0x3d,0x82,0x3d,0x22,0x3d,0x92,0x3c,0xd2,0x20,0x5c,0x88,0x18,0xa2, +0x80,0x18,0x3c,0x6a,0x3c,0x1a,0x3d,0xda,0x3d,0x7a,0x3d,0xee,0x79,0x3c,0xf4,0x98, +0xf0,0x98,0xf1,0x78,0xee,0xf1,0xc2,0x03,0xec,0xb1,0xdf,0xe3,0xba,0xc7,0x7b,0x0f, +0x79,0x4f,0xf0,0x9e,0xf0,0x3d,0xcc,0x3d,0x49,0x7b,0x52,0xf6,0x64,0xec,0xe1,0xef, +0x11,0xef,0x91,0xed,0x51,0xed,0x31,0xec,0xa9,0xd9,0xd3,0xb8,0xa7,0x75,0x4f,0xa7, +0x95,0xbe,0x3d,0xf7,0xf7,0x3c,0xde,0x33,0xb3,0xe7,0xc5,0x1e,0x9b,0xb7,0x9d,0xdf, +0xf6,0x7e,0x9b,0xfc,0x76,0xf0,0xdb,0xcc,0xb7,0x53,0xde,0xe6,0xbf,0x2d,0x7b,0xdb, +0xf0,0x76,0xe3,0xdb,0xed,0x6f,0xf7,0xbe,0x7d,0xff,0xed,0xc7,0x6f,0xcf,0xbc,0xfd, +0xe2,0x6d,0x1b,0x4f,0x67,0x4f,0x4f,0x4f,0x3f,0xcf,0x60,0x4f,0xa6,0x67,0x8a,0x27, +0xdf,0x53,0xe6,0x69,0xf0,0xac,0xf7,0x6c,0xf5,0xec,0xf5,0xbc,0xef,0xf9,0xd8,0x73, +0xc6,0xf3,0x85,0xa7,0x8d,0x17,0xc1,0xcb,0xdd,0xcb,0xcf,0x2b,0xd8,0x8b,0xe9,0x95, +0xe2,0xc5,0xf7,0x92,0x79,0xa9,0xbc,0x0c,0x5e,0xf5,0x5e,0xcd,0x5e,0x9d,0x90,0x5e, +0xaf,0x7b,0x5e,0x0f,0xbc,0x1e,0x79,0x4d,0x78,0x3d,0xf5,0x9a,0xf7,0x5a,0xf4,0x5a, +0xf6,0x5a,0xf5,0xda,0xb4,0xd7,0x7e,0xaf,0xeb,0x5e,0xcf,0xbd,0x7e,0x10,0xea,0xde, +0xd0,0xbd,0x91,0x7b,0xe3,0xf6,0x26,0xef,0x4d,0xdb,0x9b,0xbd,0x37,0x6f,0x6f,0xf1, +0x5e,0xc5,0x5e,0xed,0xde,0xea,0xbd,0x8d,0x7b,0xdb,0xad,0xdc,0xd8,0x3b,0xb0,0xf7, +0xfe,0xde,0x87,0x7b,0x1f,0xef,0x7d,0xb2,0xf7,0xff,0xd9,0x3b,0xbb,0xf7,0xff,0xdd, +0xfb,0x62,0xef,0xab,0xbd,0x36,0xfb,0x08,0xfb,0xdc,0xf7,0x79,0xef,0xf3,0xdb,0x47, +0xdd,0x17,0xba,0x2f,0x72,0x5f,0xdc,0xbe,0xe4,0x7d,0x69,0xfb,0xb2,0xf7,0xe5,0xed, +0x2b,0xda,0x27,0xb3,0xa2,0xdd,0x57,0xbd,0xaf,0x11,0xd2,0xba,0xef,0xc6,0xbe,0xbe, +0x7d,0xf7,0xf6,0x3d,0xd8,0xf7,0x68,0xdf,0x8f,0xfb,0xa6,0xf6,0xcd,0xec,0x9b,0x85, +0xfc,0xf7,0xbe,0x85,0x7d,0x4b,0xfb,0x96,0xf7,0xad,0xec,0x5b,0xdd,0x87,0xf3,0xb6, +0xf5,0xc6,0x7b,0x3b,0x78,0x13,0xde,0xc0,0xc9,0xdb,0xf9,0x17,0x5c,0xbc,0xdd,0xff, +0x00,0x1e,0xde,0x5e,0xde,0xbe,0xde,0xd4,0xdf,0x81,0xe6,0x1d,0x68,0x85,0xee,0x1d, +0xe6,0xcd,0xf4,0x66,0x79,0xb3,0xbd,0xd3,0x30,0xd2,0xbd,0xb9,0xde,0x3c,0x6f,0xe1, +0xef,0x20,0xf2,0x96,0x7a,0x2b,0xbd,0xb5,0x7f,0x10,0x9d,0x77,0xfd,0x6f,0xd1,0xe0, +0xdd,0xf8,0x47,0x68,0xf2,0x6e,0xf1,0x6e,0x85,0xb4,0x79,0x77,0x78,0x77,0x79,0x77, +0x7b,0x9b,0xbd,0xfb,0xbd,0x07,0xbd,0x87,0xbc,0x87,0xbd,0x47,0xbc,0x47,0xbd,0xc7, +0xbc,0xc7,0xbd,0x27,0xbd,0xa7,0xbc,0xa7,0xbd,0x2d,0xde,0xf3,0xde,0x0b,0xde,0x4b, +0xde,0xcb,0xde,0x2b,0xde,0xab,0xde,0x38,0xa2,0x2d,0x11,0x4f,0x74,0x20,0x12,0x88, +0x4e,0x44,0x17,0xa2,0x1b,0xd1,0x83,0xe8,0x45,0x24,0x12,0x7d,0x89,0x24,0x22,0x85, +0x48,0x23,0xd2,0x89,0x21,0xc4,0x30,0x62,0xf8,0xef,0x25,0x82,0xc8,0xfc,0xa7,0x82, +0x05,0xe1,0x10,0x33,0x89,0x3c,0xa2,0x90,0x28,0x22,0xca,0x89,0x3a,0xa2,0x81,0x68, +0x24,0xd6,0x12,0x1b,0x88,0x4d,0xc4,0x16,0x62,0x1b,0xb1,0x83,0xd8,0x45,0xec,0x26, +0x9a,0x89,0xfd,0xc4,0x01,0xe2,0x20,0x71,0x88,0xf8,0x00,0x32,0x42,0x1c,0x25,0x8e, +0x11,0xc7,0x89,0x93,0xc4,0x27,0x90,0x29,0xa2,0x85,0xb8,0x44,0x7c,0x49,0x5c,0x21, +0xbe,0x82,0x80,0xfd,0xb8,0xfd,0x36,0x10,0xbb,0xfd,0x4e,0xfb,0x5d,0xf6,0xbb,0xee, +0x77,0xdb,0xef,0xb1,0xdf,0x6b,0xbf,0xf7,0x7e,0xe2,0x7e,0xdf,0xfd,0xa4,0xfd,0x94, +0xfd,0xb4,0xfd,0xf4,0xfd,0x21,0xfb,0x43,0xf7,0x87,0xed,0x67,0xed,0x8f,0xdf,0xcf, +0xde,0xcf,0xd9,0x9f,0xba,0x3f,0x0d,0x23,0x7d,0x7f,0xe6,0x7e,0xde,0x7e,0xc1,0x7e, +0xd1,0x7e,0xf1,0x1b,0x48,0xf6,0x2b,0xf7,0x1b,0xf7,0x37,0xed,0xef,0xd8,0x6f,0xde, +0x3f,0xb4,0x7f,0x74,0xff,0xe4,0x7e,0xcb,0xfe,0xa5,0xfd,0xab,0xfb,0xf1,0x07,0x5c, +0x0e,0x78,0x1d,0x20,0x1d,0xa0,0x1d,0xa0,0x1f,0x08,0x3b,0xc0,0x3a,0xc0,0x3e,0xc0, +0x39,0x90,0x7e,0x40,0x70,0x40,0x7e,0x40,0x7d,0x40,0x77,0xc0,0x74,0xa0,0xe9,0x40, +0xcb,0x81,0xb6,0x03,0x1d,0x07,0xba,0x0e,0x74,0x1f,0xe8,0x3f,0x30,0x7c,0x60,0xf4, +0xc0,0xd8,0x81,0xc9,0x03,0x96,0x03,0xcb,0x07,0x56,0x0f,0xe0,0x7c,0xf0,0x3e,0x2e, +0x3e,0x6e,0x3e,0x1e,0x3e,0x5e,0x3e,0xde,0xff,0x07,0x44,0x1f,0xf2,0x1f,0x25,0xd0, +0x27,0xf4,0x4f,0x22,0xf2,0xaf,0x22,0xce,0x27,0xd9,0x27,0xed,0xef,0x08,0xf7,0x17, +0x84,0x56,0x8a,0xfe,0x4c,0x14,0x10,0xed,0x2f,0xe8,0x7c,0x4c,0x3e,0x8d,0x3e,0x4d, +0x3e,0x6d,0x3e,0x37,0xfe,0x28,0x7d,0x56,0xee,0x59,0x79,0x00,0x79,0xf4,0x67,0x31, +0x01,0x79,0xfa,0x7b,0x99,0xf3,0x59,0xf4,0x79,0xe9,0x03,0x7c,0xed,0xac,0x10,0x7c, +0x5d,0xad,0x78,0xfa,0xfa,0xfc,0x16,0x64,0xdf,0x40,0x2b,0xa1,0xbe,0x91,0x56,0xe2, +0x7c,0x93,0x7f,0x15,0xd2,0x7c,0xb9,0xbe,0x42,0xdf,0xa2,0xbf,0x39,0x0a,0x5f,0xad, +0x6f,0xb5,0x6f,0xfd,0x6f,0xd1,0xec,0xdb,0xee,0x7b,0xc3,0xb7,0xef,0xff,0x1a,0x03, +0xbe,0xf7,0xd6,0x59,0xe7,0xef,0xc4,0x90,0xef,0xb0,0xef,0x88,0xef,0xa8,0xef,0x98, +0xef,0xb8,0xef,0xa4,0xef,0x94,0xef,0xb4,0xaf,0xc5,0x77,0xc1,0x77,0xd9,0x77,0xd5, +0xd7,0xf6,0xa0,0xc3,0x41,0x97,0x83,0x1e,0x07,0x89,0x07,0x49,0x07,0x69,0x07,0x43, +0x0e,0x32,0x0e,0xb2,0x0f,0xa6,0x1f,0x14,0x1c,0x94,0x1e,0x54,0x1f,0x34,0x1d,0x6c, +0x3a,0xd8,0x71,0xb0,0xff,0xe0,0xc8,0xc1,0xc9,0x83,0xf3,0x07,0x57,0x0e,0xe2,0xdf, +0x71,0x7b,0xc7,0xf7,0x1d,0xfa,0x3b,0x8c,0x77,0x38,0xef,0xa4,0xbf,0xc3,0x7b,0x47, +0xf4,0x8e,0xf4,0x1d,0xe5,0x3b,0xba,0x77,0x4c,0xef,0x34,0xbc,0xd3,0xf2,0x4e,0xd7, +0x3b,0xfd,0xef,0x0c,0xbf,0x33,0xf6,0xce,0xd4,0x3b,0xf3,0xef,0x2c,0xbf,0x83,0xf3, +0x73,0xf0,0x73,0xf3,0x23,0xfa,0x51,0xfc,0x42,0xfc,0x18,0x7e,0x6c,0xbf,0x74,0x3f, +0x81,0x9f,0xd4,0x4f,0xed,0x67,0xf2,0x6b,0xf2,0xeb,0xf0,0x33,0xfb,0x0d,0xf9,0x8d, +0xfa,0x4d,0xfa,0x59,0xfc,0x96,0xfc,0x56,0xfd,0xf0,0x24,0x17,0x92,0x17,0x89,0x44, +0xa2,0x93,0x22,0x48,0xf1,0xa4,0x54,0x52,0x3a,0x29,0x93,0xc4,0x23,0x09,0x48,0x22, +0x92,0x84,0x24,0x25,0xc9,0x49,0x4a,0x92,0x9a,0xa4,0x23,0x19,0x49,0x26,0x52,0x2d, +0xa9,0x81,0xd4,0x44,0x6a,0x21,0xb5,0x91,0x3a,0x48,0x5d,0xa4,0x6e,0x92,0x99,0xd4, +0x4f,0x1a,0x24,0x0d,0x91,0x86,0x49,0x23,0xa4,0x51,0xd2,0x18,0x69,0x9c,0x34,0x49, +0x9a,0x22,0x4d,0x93,0x2c,0xa4,0x79,0xd2,0x02,0x69,0x89,0xb4,0x4c,0x5a,0x21,0xad, +0x92,0x70,0xfe,0xb6,0xfe,0x78,0x7f,0x07,0x7f,0x27,0x7f,0x17,0x7f,0x37,0x7f,0x0f, +0x7f,0x2f,0x7f,0xa2,0xbf,0xaf,0x3f,0xc9,0x9f,0xfc,0x2b,0x40,0xf1,0x0f,0xfd,0x97, +0x22,0xcc,0x9f,0xe5,0xcf,0xf6,0x4f,0xfb,0x17,0x82,0xbb,0xce,0x5f,0x05,0xcf,0x5f, +0xe0,0x2f,0x5c,0xe7,0x5f,0x1e,0x91,0xbf,0x78,0x9d,0x75,0xfe,0x86,0x48,0xfc,0x8b, +0xfe,0x29,0x90,0xfa,0xcb,0xfe,0x00,0x72,0x88,0xd2,0x5f,0xed,0xaf,0xf3,0x37,0xfa, +0x9b,0xfc,0x6b,0xfd,0x1b,0xfc,0x9b,0xfc,0x5b,0xfc,0xdb,0xfc,0x3b,0xfc,0xbb,0xfc, +0xbb,0xfd,0xcd,0xfe,0xfd,0xfe,0x83,0xfe,0x43,0xfe,0xc3,0xfe,0x23,0xfe,0xa3,0xfe, +0x63,0xfe,0xe3,0xfe,0x93,0xfe,0x53,0xfe,0xd3,0xfe,0x16,0xff,0x79,0xff,0x05,0xff, +0x25,0xff,0x65,0xff,0x15,0xff,0x55,0x7f,0x5c,0x80,0x6d,0x00,0x3e,0xc0,0x21,0xc0, +0x29,0xc0,0x25,0xc0,0x2d,0xc0,0x23,0xc0,0x2b,0x80,0x18,0xe0,0x1b,0x40,0x0a,0xa0, +0x04,0xd0,0x02,0xe8,0x01,0x21,0x01,0x61,0x01,0x11,0x01,0x8c,0x00,0x56,0x40,0x7c, +0x00,0x3b,0x80,0x13,0x90,0x1a,0x90,0x1e,0x90,0x19,0xc0,0x0b,0x10,0x04,0x88,0x02, +0x24,0x01,0xd2,0x00,0x79,0x80,0x32,0x40,0x1d,0xa0,0x0b,0x30,0x06,0x98,0x02,0x6a, +0x03,0x1a,0x02,0x9a,0x02,0x5a,0x02,0xda,0x02,0x3a,0x02,0xba,0x02,0xba,0x03,0xcc, +0x01,0xfd,0x01,0x83,0x01,0x43,0x01,0xc3,0x01,0x23,0x01,0xa3,0x01,0x63,0x01,0xe3, +0x01,0x93,0x01,0x53,0x01,0xd3,0x01,0x96,0x80,0xf9,0x80,0x85,0x80,0xa5,0x80,0xe5, +0x80,0x95,0x80,0xd5,0x00,0x1c,0xd9,0x96,0x8c,0x27,0x3b,0x90,0x9d,0xc8,0x2e,0x64, +0x37,0xb2,0x07,0xd9,0x8b,0x4c,0x24,0xfb,0x92,0x49,0x64,0x0a,0x99,0x46,0xa6,0x93, +0x43,0xc8,0x61,0xe4,0x08,0x32,0x83,0xcc,0x22,0xc7,0x93,0xd9,0x64,0x0e,0x39,0x95, +0x9c,0x4e,0xce,0x24,0xf3,0xc8,0x02,0xb2,0x88,0x2c,0x21,0x4b,0xc9,0x72,0xb2,0x92, +0xac,0x26,0xeb,0xc8,0x46,0xb2,0x89,0x5c,0x4b,0x6e,0x20,0x37,0x91,0x5b,0xc8,0x6d, +0xe4,0x0e,0x72,0x17,0xb9,0x9b,0x6c,0x26,0xf7,0x93,0x07,0xc9,0x43,0xe4,0x61,0xf2, +0x08,0x79,0x94,0x3c,0x46,0x1e,0x27,0x4f,0x92,0xa7,0xc8,0xd3,0x64,0x0b,0x79,0x9e, +0xbc,0x40,0x5e,0x22,0x2f,0x93,0x57,0xc8,0xab,0x64,0x1c,0xc5,0x96,0x82,0xa7,0x38, +0x50,0x9c,0x28,0x2e,0x14,0x37,0x8a,0x07,0xc5,0x8b,0x42,0xa4,0xf8,0x52,0x48,0x14, +0x0a,0x85,0x46,0xa1,0x53,0x42,0x28,0x61,0x94,0x08,0x0a,0x83,0xc2,0xa2,0xc4,0x53, +0xd8,0x14,0x0e,0x25,0x95,0x92,0x4e,0xc9,0xa4,0xf0,0x28,0x02,0x8a,0x88,0x22,0xa1, +0x48,0x29,0x72,0x8a,0x92,0xa2,0xa6,0xe8,0x28,0x46,0x8a,0x89,0x52,0x4b,0x69,0xa0, +0x34,0x51,0x5a,0x28,0x6d,0x94,0x0e,0x4a,0x17,0xa5,0x9b,0x62,0xa6,0xf4,0x53,0x06, +0x29,0x43,0x94,0x61,0xca,0x08,0x65,0x94,0x32,0x46,0x79,0xfc,0x37,0x60,0x1c,0x32, +0xf1,0x77,0x63,0x92,0xf2,0x84,0x32,0x45,0x99,0xa6,0x58,0x28,0x73,0x7f,0x02,0x8b, +0x90,0x97,0x10,0xf0,0x2e,0x78,0xd7,0x0e,0x42,0x80,0xb8,0x42,0x3c,0x21,0x3e,0x10, +0x32,0x24,0x10,0x12,0x0a,0x89,0xb4,0x12,0x07,0x49,0x86,0xa4,0xfd,0x16,0xdc,0x77, +0x85,0x90,0xa2,0x77,0x15,0x10,0xed,0xbb,0xd5,0x90,0xfa,0x77,0x9b,0x21,0xed,0xef, +0xde,0xf8,0xb3,0xe8,0x7b,0x83,0xfe,0x77,0x87,0xde,0x7d,0x00,0x19,0x7b,0x77,0xe2, +0x0f,0xf2,0x14,0x32,0x07,0x59,0x84,0xbc,0x84,0x80,0x43,0xe0,0x90,0x1d,0x84,0x00, +0x71,0x85,0x78,0x42,0x7c,0x20,0x64,0x48,0xa0,0x95,0x50,0x48,0x24,0x24,0xee,0xb7, +0x48,0x3e,0x94,0x06,0xe1,0x1e,0x12,0x42,0x8a,0x0e,0x29,0x20,0xda,0x43,0xd5,0x90, +0xfa,0x43,0xcd,0x7f,0x16,0xed,0x56,0x6e,0x1c,0xea,0x3b,0x74,0xef,0xd0,0x03,0x8c, +0xb1,0x43,0x13,0x7f,0x07,0x26,0x0f,0x4d,0x1d,0x9a,0x3e,0x64,0x39,0x34,0x7f,0x68, +0xe1,0xd0,0xd2,0xa1,0xe5,0x43,0x2b,0x87,0x56,0x0f,0xe1,0xa8,0xb6,0x54,0x3c,0xd5, +0x81,0xea,0x44,0x75,0xa1,0xba,0x51,0x3d,0xa8,0x5e,0x54,0x22,0xd5,0x97,0x4a,0xa2, +0x52,0xa8,0x34,0x2a,0x9d,0x1a,0x42,0x0d,0xa3,0x46,0x50,0x19,0x54,0x16,0x35,0x9e, +0xca,0xa6,0x72,0xa8,0xa9,0xd4,0x74,0x6a,0x26,0x95,0x47,0x15,0x50,0x45,0x54,0x09, +0x55,0x4a,0x95,0x53,0x95,0x54,0x35,0x55,0x47,0x35,0x52,0x4d,0xd4,0x5a,0x6a,0x03, +0xb5,0x89,0xda,0x42,0x6d,0xa3,0x76,0x50,0xbb,0xa8,0xdd,0x54,0x33,0xb5,0x9f,0x3a, +0x48,0x1d,0xa2,0x0e,0x53,0x47,0xa8,0xa3,0xd4,0x31,0xea,0x38,0x75,0x92,0x3a,0x45, +0x9d,0xa6,0x5a,0xa8,0xf3,0xd4,0x05,0xea,0x12,0x75,0x99,0xba,0x42,0x5d,0xa5,0xe2, +0x68,0xb6,0x34,0x3c,0xcd,0x81,0xe6,0x44,0x73,0xa1,0xb9,0xd1,0x3c,0x68,0x5e,0x34, +0x22,0xcd,0x97,0x46,0xa2,0x51,0x68,0x34,0x1a,0x9d,0x16,0x42,0x0b,0xa3,0x45,0xd0, +0x18,0x34,0x16,0x2d,0xce,0x4a,0x3c,0x8d,0x4d,0xe3,0xd0,0x52,0x69,0xe9,0xb4,0x4c, +0x1a,0x8f,0x26,0xa0,0x89,0x68,0x12,0x9a,0x94,0x26,0xa7,0x29,0x69,0x6a,0x9a,0xf6, +0x9f,0x1c,0x1d,0xa4,0x96,0xd6,0x42,0xeb,0xa2,0xf5,0xd3,0x86,0x69,0x63,0xb4,0x29, +0xda,0x3c,0x6d,0x99,0x86,0x7b,0xcf,0xe1,0x3d,0xb7,0xf7,0x88,0xef,0x51,0xde,0x0b, +0x7b,0x2f,0xfe,0xbd,0xf4,0xf7,0x44,0xef,0x29,0xdf,0x33,0xbd,0xd7,0xf2,0x5e,0xf7, +0x7b,0x43,0xef,0x8d,0xbd,0x37,0xfd,0xde,0xd2,0x7b,0xb8,0xf7,0x9d,0xde,0xf7,0x7a, +0x3f,0xe4,0xfd,0xa4,0xf7,0xd9,0xef,0xa7,0xbf,0x2f,0x78,0x5f,0xfa,0xbe,0xfa,0x7d, +0xd3,0xfb,0x4d,0xef,0x77,0xbc,0x6f,0x7e,0x7f,0xe8,0xfd,0xd1,0xf7,0x27,0xdf,0xb7, +0xbc,0xbf,0xf4,0xfe,0xea,0xfb,0xf8,0x40,0x97,0x40,0xaf,0x40,0x52,0x20,0x3d,0x30, +0x22,0x30,0x3e,0x30,0x35,0x90,0x17,0x28,0x09,0x54,0x06,0x1a,0x03,0x1b,0x02,0xdb, +0x02,0xbb,0x03,0x07,0x03,0x47,0x02,0xc7,0x03,0xa7,0x03,0x17,0x02,0x57,0x02,0x6d, +0xe9,0x78,0xba,0x03,0xdd,0x89,0xee,0xfc,0x3b,0xb8,0xd0,0xbd,0xe8,0xbe,0x74,0x0a, +0x9d,0x4e,0x0f,0xa3,0x33,0xe8,0xf1,0x74,0x0e,0x3d,0x9d,0xce,0xa3,0x8b,0xe8,0x52, +0xba,0x92,0xae,0xa3,0x9b,0xe8,0x0d,0xf4,0x26,0x7a,0x0b,0xbd,0x8d,0xde,0x41,0xef, +0xa2,0x77,0xd3,0xcd,0xf4,0x7e,0xfa,0x20,0x7d,0x88,0x3e,0x4c,0x1f,0xa1,0x8f,0xd2, +0xc7,0xe8,0x93,0xf4,0x69,0xfa,0x3c,0x7d,0x89,0xbe,0x42,0xc7,0x05,0xe1,0x83,0x9c, +0x82,0xdc,0x82,0xbc,0x82,0x7c,0x83,0x28,0x41,0xf4,0xa0,0xb0,0x20,0x76,0x50,0x66, +0x10,0x3f,0x48,0x10,0x24,0x0a,0x92,0x04,0x49,0x83,0xe4,0x41,0xca,0x20,0x75,0x90, +0x2e,0xc8,0x18,0x64,0x0a,0xaa,0x0d,0x6a,0x08,0x6a,0x0a,0x6a,0x09,0x6a,0x0b,0xea, +0x08,0xea,0x0a,0xea,0x0e,0x32,0x07,0xf5,0x07,0x0d,0x06,0x0d,0x05,0x0d,0x07,0x8d, +0x04,0x8d,0x06,0x8d,0x05,0x8d,0x07,0x4d,0x06,0x4d,0x05,0x4d,0x07,0x59,0x82,0xe6, +0x83,0x16,0x82,0x96,0x82,0x96,0x83,0x56,0x82,0x56,0x83,0x70,0x87,0x6d,0x0f,0xe3, +0x0f,0x3b,0x1c,0x76,0x3a,0xec,0x72,0xd8,0xed,0xb0,0xc7,0x61,0xaf,0xc3,0xc4,0xc3, +0xbe,0x87,0x49,0x87,0x29,0x87,0xe9,0x87,0xc3,0x0e,0x33,0x0e,0xc7,0x1f,0xe6,0x1c, +0x4e,0x3f,0xcc,0x3b,0x2c,0x3a,0x2c,0x3d,0xac,0x3c,0xac,0x3b,0x6c,0x3a,0xdc,0x70, +0xb8,0xe5,0x70,0xc7,0xe1,0xee,0xc3,0xfd,0x87,0x87,0x0e,0x8f,0x1c,0x1e,0x3b,0x3c, +0x79,0x78,0xfa,0xf0,0xfc,0xe1,0xa5,0xc3,0xab,0x87,0xf1,0xc1,0x2e,0xc1,0x1e,0xc1, +0xbe,0xc1,0x94,0xe0,0x90,0xe0,0xb0,0xe0,0x88,0x60,0x46,0x30,0x2b,0x38,0x3e,0x98, +0x1d,0xcc,0x09,0x4e,0x0d,0x4e,0x0f,0xce,0x0c,0xe6,0x05,0x0b,0x82,0x45,0xc1,0x92, +0x60,0x69,0xb0,0x3c,0x58,0x19,0xac,0x0e,0xd6,0x05,0x1b,0x83,0x4d,0xc1,0xb5,0xc1, +0x0d,0xc1,0x4d,0xc1,0x2d,0xc1,0x6d,0xc1,0x1d,0xc1,0x5d,0xc1,0xdd,0xc1,0xe6,0xe0, +0xfe,0xe0,0xc1,0xe0,0xa1,0xe0,0xe1,0xe0,0x91,0xe0,0xd1,0xe0,0xb1,0xe0,0xf1,0xe0, +0xc9,0xe0,0xa9,0xe0,0xe9,0x60,0x4b,0xf0,0x7c,0xf0,0x42,0xf0,0x52,0xf0,0x72,0xf0, +0x4a,0x30,0x2e,0x04,0x17,0xe2,0x12,0x42,0x0c,0xa1,0x87,0x44,0x84,0x70,0x42,0x32, +0x43,0x44,0x21,0xba,0x90,0x86,0x90,0xb6,0x90,0xee,0x90,0xc1,0x90,0xd1,0x90,0xa9, +0x90,0x85,0x90,0xd5,0x10,0x87,0x0f,0x3c,0x3e,0x20,0x7d,0x10,0xf1,0x01,0xeb,0x83, +0xcc,0x0f,0xe4,0x1f,0x98,0x3e,0x68,0xf9,0xa0,0xff,0x83,0xb1,0x0f,0xa6,0x3f,0x58, +0xf8,0x60,0xe5,0x03,0xfc,0x87,0x6e,0x1f,0x92,0x3e,0x0c,0xfb,0x90,0xf5,0x21,0xe7, +0x43,0xde,0x87,0x92,0x0f,0x95,0x1f,0xea,0x3e,0x34,0x7d,0xd8,0xf4,0x61,0xc7,0x87, +0x43,0x1f,0x8e,0x7d,0x68,0xf9,0x70,0xf5,0x43,0x87,0x50,0xb7,0x50,0x62,0x68,0x48, +0x28,0x2b,0x34,0x33,0x54,0x14,0xaa,0x0e,0x35,0x85,0xb6,0x84,0x76,0x85,0x0e,0x86, +0x8e,0x85,0x4e,0x87,0x2e,0x87,0xda,0x86,0x39,0x84,0x79,0x85,0x91,0xc2,0xe8,0x61, +0x8c,0x30,0x76,0x58,0x7a,0x98,0x20,0x4c,0x19,0x66,0x0a,0x6b,0x08,0xeb,0x0e,0x1b, +0x0c,0x1b,0x0b,0x9b,0x0e,0x5b,0x0a,0x5b,0x0d,0xc3,0x1f,0x71,0x3b,0xe2,0x75,0x84, +0x72,0x24,0xe2,0x08,0xeb,0x48,0xe6,0x11,0xd1,0x11,0xe9,0x11,0xe5,0x11,0xdd,0x11, +0xd3,0x91,0x86,0x23,0x2d,0x47,0x3a,0x8e,0x74,0x1f,0xe9,0x3f,0x32,0x74,0x64,0xf4, +0xc8,0xe4,0x11,0xcb,0x91,0xa5,0x23,0xab,0x47,0xf0,0x47,0x5d,0x8e,0x7a,0x1d,0x25, +0x1d,0xa5,0x1f,0x8d,0x38,0x1a,0x7f,0x34,0xf5,0x28,0xef,0xa8,0xe4,0xa8,0xf2,0xa8, +0xee,0xa8,0xe9,0x68,0xd3,0xd1,0xb6,0xa3,0x5d,0x47,0xcd,0x47,0x87,0x8e,0x8e,0x1e, +0x1d,0x3f,0x3a,0x75,0xd4,0x72,0x74,0xe1,0xe8,0xf2,0x51,0xdb,0x70,0x87,0x70,0x97, +0x70,0x8f,0x70,0x62,0x38,0x29,0x9c,0x16,0x1e,0x12,0x1e,0x11,0x1e,0x1f,0x9e,0x1e, +0xce,0x0b,0x17,0x85,0x4b,0xc3,0x95,0xe1,0xba,0x70,0x53,0x78,0x43,0x78,0x5b,0x78, +0x77,0xf8,0x60,0xf8,0x48,0xf8,0x58,0xf8,0x64,0xf8,0x74,0xf8,0x7c,0xf8,0x52,0xf8, +0x4a,0x38,0x2e,0x02,0x1f,0xe1,0x14,0xe1,0x16,0x41,0x8c,0xa0,0x44,0xd0,0x23,0x22, +0x22,0xe2,0x23,0x52,0x23,0x32,0x23,0x44,0x11,0xf2,0x08,0x63,0x44,0x6d,0x44,0x4b, +0x44,0x57,0x44,0x7f,0xc4,0x70,0xc4,0x64,0xc4,0x52,0xc4,0x4a,0x04,0xee,0x18,0xfe, +0x98,0xd3,0x31,0xb7,0x63,0x5e,0xc7,0x7c,0x8f,0x51,0x8e,0xd1,0x8f,0x85,0x1d,0x63, +0x1c,0x8b,0x3f,0xc6,0x39,0x96,0x7e,0x8c,0x77,0x4c,0x74,0x4c,0x7a,0x4c,0x79,0xcc, +0x74,0xac,0xe1,0x58,0xcb,0xb1,0x8e,0x63,0xfd,0xc7,0x86,0x8f,0x8d,0x1e,0x1b,0x3f, +0x36,0x75,0xcc,0x72,0x6c,0xe1,0xd8,0xf2,0xb1,0xd5,0x63,0xb6,0xc7,0x1d,0x8e,0xbb, +0x1c,0xf7,0x3a,0xee,0x7b,0x9c,0x72,0x3c,0xe4,0x38,0xe3,0x78,0xfc,0xf1,0xf4,0xe3, +0x82,0xe3,0x92,0xe3,0xf2,0xe3,0xea,0xe3,0xc6,0xe3,0x0d,0xc7,0xdb,0x8e,0x77,0x1d, +0x37,0x1f,0x1f,0x3c,0x3e,0x7c,0x7c,0xf4,0xf8,0xf8,0xf1,0xa9,0xe3,0x96,0xe3,0x0b, +0xc7,0x57,0x8e,0xdb,0x46,0x3a,0x45,0x7a,0x44,0xfa,0x46,0xd2,0x22,0xc3,0x22,0x59, +0x91,0x9c,0xc8,0xcc,0x48,0x51,0xa4,0x3c,0x52,0x17,0x59,0x1b,0xd9,0x12,0xd9,0x15, +0xd9,0x1f,0x39,0x1c,0x39,0x16,0x39,0x15,0x39,0x1f,0xb9,0x1c,0x09,0x18,0xeb,0xfc, +0x65,0xe0,0x18,0xb6,0x0c,0xbb,0x75,0xfe,0x09,0xc0,0x33,0xec,0xff,0xed,0x71,0x60, +0x38,0x31,0x5c,0x18,0xae,0x56,0xdc,0x18,0x1e,0x0c,0xcf,0x7f,0x09,0xbc,0x18,0x44, +0x86,0x2f,0x83,0xc4,0x20,0xff,0x1f,0x50,0x18,0xd4,0x75,0xfe,0x2c,0x02,0x19,0xc1, +0x8c,0x50,0x46,0x38,0x23,0x92,0xc1,0x64,0xc4,0x31,0x92,0x18,0xc9,0x8c,0x14,0x46, +0x1a,0x23,0x83,0xc1,0x65,0xf0,0x19,0x42,0x86,0x98,0x51,0xc4,0x90,0x31,0x14,0x0c, +0x15,0x43,0xcb,0x30,0x30,0xaa,0x19,0x35,0x8c,0x7a,0x46,0x23,0xa3,0x99,0xd1,0xca, +0x68,0x67,0x74,0x32,0x6e,0x30,0x7a,0x19,0x7d,0x8c,0x01,0xc6,0x3d,0xc6,0x7d,0xc6, +0x03,0xc6,0x43,0xc6,0x23,0xc6,0x63,0xc6,0x04,0xe3,0x09,0xe3,0x29,0x63,0x86,0x31, +0xc7,0x78,0xce,0x58,0x64,0xbc,0x60,0xbc,0x64,0xbc,0x62,0x80,0x28,0x9b,0x28,0xbb, +0x28,0xfb,0x28,0x42,0x94,0x73,0x94,0x6b,0x94,0x7b,0x94,0x67,0x94,0x77,0x94,0x4f, +0x94,0x5f,0x14,0x39,0x8a,0x1a,0x15,0x18,0x15,0x1c,0x15,0x1a,0x15,0x1e,0x15,0x19, +0xc5,0x8c,0x8a,0x8b,0x4a,0x8a,0x4a,0x8e,0x4a,0x89,0x4a,0x8b,0xca,0x88,0xe2,0x46, +0xf1,0xa3,0x84,0x51,0xe2,0xa8,0xa2,0x28,0x59,0x94,0x22,0x4a,0x15,0xa5,0x8d,0x32, +0x44,0x55,0x47,0xd5,0x44,0xd5,0x47,0x35,0x46,0x35,0x47,0xb5,0x46,0xb5,0x47,0x75, +0x46,0xdd,0x88,0xea,0x8d,0xea,0x8b,0x1a,0x88,0xba,0x17,0x75,0x3f,0xea,0x41,0xd4, +0xc3,0xa8,0x47,0x51,0x8f,0xa3,0x26,0xa2,0x9e,0x44,0x3d,0x8d,0x9a,0x89,0x9a,0x8b, +0x7a,0x1e,0xb5,0x18,0xf5,0x22,0xea,0x65,0xd4,0xab,0x28,0x10,0x6d,0x13,0x6d,0x17, +0x6d,0x1f,0x4d,0x88,0x76,0x8e,0x76,0x8d,0x76,0x8f,0xf6,0x8c,0xf6,0x8e,0xf6,0x89, +0xf6,0x8b,0x26,0x47,0x53,0xa3,0x03,0xa3,0x83,0xa3,0x43,0xa3,0xc3,0xa3,0x23,0xa3, +0x99,0xd1,0x71,0xd1,0x49,0xd1,0xc9,0xd1,0x29,0xd1,0x69,0xd1,0x19,0xd1,0xdc,0x68, +0x7e,0xb4,0x30,0x5a,0x1c,0x5d,0x14,0x2d,0x8b,0x56,0x44,0xab,0xa2,0xb5,0xd1,0x86, +0xe8,0xea,0xe8,0x9a,0xe8,0xfa,0xe8,0xc6,0xe8,0xe6,0xe8,0xd6,0xe8,0xf6,0xe8,0xce, +0xe8,0x1b,0xd1,0xbd,0xd1,0x7d,0xd1,0x03,0xd1,0xf7,0xa2,0xef,0x47,0x3f,0x88,0x7e, +0x18,0xfd,0x28,0xfa,0x71,0xf4,0x44,0xf4,0x93,0xe8,0xa7,0xd1,0x33,0xd1,0x73,0xd1, +0xcf,0xa3,0x17,0xa3,0x5f,0x44,0xbf,0x8c,0x7e,0x15,0x0d,0x98,0x36,0x4c,0x3b,0xa6, +0x3d,0x93,0xc0,0x74,0x66,0xba,0x32,0xdd,0x99,0x9e,0x4c,0x6f,0xa6,0x0f,0xd3,0x8f, +0x49,0x66,0x52,0x99,0x81,0xcc,0x60,0x66,0x28,0x33,0x9c,0x19,0xc9,0x64,0x32,0xe3, +0x98,0x49,0xcc,0x64,0x66,0x0a,0x33,0x8d,0x99,0xc1,0xe4,0x32,0xf9,0x4c,0x21,0x53, +0xcc,0x2c,0x62,0xca,0x98,0x0a,0xa6,0x8a,0xa9,0x65,0x1a,0x98,0xd5,0xcc,0x1a,0x66, +0x3d,0xb3,0x91,0xd9,0xcc,0x6c,0x65,0xb6,0x33,0x3b,0x99,0x37,0x98,0xbd,0xcc,0x3e, +0xe6,0x00,0xf3,0x1e,0xf3,0x3e,0xf3,0x01,0xf3,0x21,0xf3,0x11,0xf3,0x31,0x73,0x82, +0xf9,0x84,0xf9,0x94,0x39,0xc3,0x9c,0x63,0x3e,0x67,0x2e,0x32,0x5f,0x30,0x5f,0x32, +0x5f,0x31,0x01,0xcb,0x86,0x65,0xc7,0xb2,0x67,0x11,0x58,0xce,0x2c,0x57,0x96,0x3b, +0xcb,0x93,0xe5,0xcd,0xf2,0x61,0xf9,0xb1,0xc8,0x2c,0xf8,0x85,0x8b,0x15,0xc8,0x0a, +0x66,0x85,0xb2,0xc2,0x59,0x91,0x2c,0x26,0x2b,0x8e,0x95,0xc4,0x4a,0x66,0xa5,0xb0, +0xd2,0x58,0x19,0x2c,0x2e,0x8b,0x6f,0x45,0x08,0x11,0x5b,0x29,0x62,0xc9,0x58,0x0a, +0x96,0x8a,0xa5,0x65,0x19,0x58,0xd5,0xac,0x1a,0x56,0x3d,0xab,0x11,0xd2,0x0c,0x69, +0xb5,0xd2,0xce,0xea,0xc4,0xb8,0xc1,0xea,0x65,0xf5,0xb1,0x06,0x58,0xf7,0x58,0xf7, +0x59,0x0f,0x58,0x0f,0x59,0x8f,0x58,0x8f,0x59,0x13,0xac,0x27,0xac,0xa7,0xac,0x19, +0xd6,0x1c,0xeb,0x39,0x6b,0x91,0xf5,0x82,0xf5,0x92,0xf5,0x8a,0x05,0x62,0x6c,0x62, +0xec,0x62,0xec,0x63,0x08,0x31,0xce,0x31,0xae,0x31,0xee,0x31,0x9e,0x31,0xde,0x31, +0x3e,0x31,0x7e,0x31,0xe4,0x18,0x6a,0x4c,0x60,0x4c,0x70,0x4c,0x68,0x4c,0x78,0x4c, +0x64,0x0c,0x33,0x26,0x2e,0x26,0x29,0x26,0x39,0x26,0x25,0x26,0x2d,0x26,0x23,0x86, +0x1b,0xc3,0x8f,0x11,0xc6,0x88,0x63,0x8a,0x62,0x64,0x31,0x8a,0x18,0x55,0x8c,0x36, +0xc6,0x10,0x53,0x1d,0x53,0x13,0x53,0x1f,0xd3,0x18,0xd3,0x1c,0xd3,0x1a,0xd3,0x1e, +0xd3,0x19,0x73,0x23,0xa6,0x37,0xa6,0x2f,0x66,0xc0,0xca,0xbd,0x98,0xfb,0x31,0x0f, +0x62,0x1e,0xc6,0x3c,0x8a,0x79,0x1c,0x33,0x11,0xf3,0x24,0xe6,0x69,0xcc,0x4c,0xcc, +0x5c,0xcc,0xf3,0x98,0xc5,0x98,0x17,0x31,0x2f,0x63,0x5e,0xc5,0x80,0x58,0x9b,0x58, +0xbb,0x58,0xfb,0x58,0x42,0xac,0x73,0xac,0x6b,0xac,0x7b,0xac,0x67,0xac,0x77,0xac, +0x4f,0xac,0x5f,0x2c,0x39,0x96,0x1a,0x1b,0x18,0x1b,0x1c,0x1b,0x1a,0x1b,0x1e,0x1b, +0x19,0xcb,0x8c,0x8d,0x8b,0x4d,0x8a,0x4d,0x8e,0x4d,0x89,0x4d,0x8b,0xcd,0x88,0xe5, +0xc6,0xf2,0x63,0x85,0xb1,0xe2,0xd8,0xa2,0x58,0x59,0xac,0x22,0x56,0x15,0xab,0x8d, +0x35,0xc4,0x56,0xc7,0xd6,0xc4,0xd6,0xc7,0x36,0xc6,0x36,0xc7,0xb6,0xc6,0xb6,0xc7, +0x76,0xc6,0xde,0x88,0xed,0x8d,0xed,0x8b,0x1d,0x88,0xbd,0x17,0x7b,0x3f,0xf6,0x41, +0xec,0xc3,0xd8,0x47,0xb1,0x8f,0x63,0x27,0x62,0x9f,0xc4,0x3e,0x8d,0x9d,0x89,0x9d, +0x8b,0x7d,0x1e,0xbb,0x18,0xfb,0x22,0xf6,0x65,0xec,0xab,0x58,0x10,0x67,0x13,0x67, +0x17,0x67,0x1f,0x47,0x88,0x73,0x8e,0x73,0x8d,0x73,0x8f,0xf3,0x8c,0xf3,0x8e,0xf3, +0x89,0xf3,0x8b,0x23,0xc7,0x51,0xe3,0x02,0xe3,0x82,0xe3,0x42,0xe3,0xc2,0xe3,0x22, +0xe3,0x98,0x71,0x71,0x71,0x49,0x71,0xc9,0x71,0x29,0x71,0x69,0x71,0x19,0xbf,0x22, +0x99,0x10,0x41,0x9c,0x24,0x4e,0x1e,0xa7,0x8b,0xab,0x8d,0x6b,0x8a,0x6b,0xfd,0x03, +0xb4,0xc5,0x75,0xc5,0x99,0xe3,0x06,0xe3,0x86,0xe3,0x1e,0xbe,0xc1,0x63,0xc8,0x54, +0xdc,0x74,0x9c,0x25,0x6e,0x3e,0x6e,0x21,0x6e,0x29,0x6e,0x39,0x6e,0x25,0x6e,0x35, +0x0e,0x17,0x6f,0x13,0x6f,0x1f,0xef,0x1c,0xef,0x19,0xef,0x17,0x4f,0x8d,0x0f,0x8e, +0x0f,0x8f,0x67,0xc6,0x27,0xc5,0xa7,0xc4,0x67,0xc4,0xf3,0xe3,0xc5,0x10,0x59,0xbc, +0x2a,0xde,0x10,0x5f,0x13,0xdf,0x08,0x69,0x85,0x74,0xc6,0xf7,0x42,0x06,0xe2,0xef, +0x43,0x1e,0xc6,0x3f,0x8e,0x7f,0x12,0x3f,0x13,0xff,0x3c,0xfe,0x45,0xfc,0xab,0x78, +0x9b,0x04,0x87,0x04,0x97,0x04,0xb7,0x04,0x8f,0x04,0xaf,0x04,0x62,0x82,0x6f,0x02, +0x29,0x81,0x92,0x40,0x4b,0xa0,0x27,0x84,0x24,0x84,0x25,0x44,0x24,0x30,0x12,0x58, +0x09,0xf1,0x09,0xec,0x04,0x4e,0x42,0x6a,0x42,0x7a,0x42,0x66,0x02,0x2f,0x41,0x90, +0x20,0x4a,0x90,0x24,0x48,0x13,0xe4,0x09,0xca,0x04,0x75,0x82,0x2e,0xc1,0x98,0x60, +0x4a,0xa8,0x4d,0x68,0x48,0x68,0x4a,0x68,0x49,0x68,0x4b,0xe8,0x48,0xe8,0x4a,0xe8, +0x4e,0x30,0x27,0xf4,0x27,0x0c,0x26,0x0c,0x25,0x0c,0x27,0x8c,0x24,0x8c,0x26,0x8c, +0x25,0x8c,0x27,0x4c,0x26,0x4c,0x25,0x4c,0x27,0x58,0x12,0xe6,0x13,0x16,0x12,0x96, +0x12,0x96,0x13,0x56,0x12,0x56,0x13,0x70,0x89,0xb6,0x89,0xf8,0x44,0x87,0x44,0xa7, +0x44,0x97,0x44,0xb7,0x44,0x8f,0x44,0xaf,0x44,0x62,0xa2,0x6f,0x22,0x29,0x91,0x92, +0x48,0x4b,0xa4,0x27,0x86,0x24,0x86,0x25,0x46,0x24,0x32,0x12,0x59,0x89,0xf1,0x89, +0xec,0x44,0x4e,0x62,0x6a,0x62,0x7a,0x62,0x66,0xa2,0x20,0x51,0x92,0x28,0x4d,0x94, +0x27,0x2a,0x13,0xd5,0x89,0xba,0x44,0x63,0xa2,0x29,0xb1,0x36,0xb1,0x21,0xb1,0x29, +0xb1,0x2d,0xb1,0xf3,0xaf,0xa6,0x2b,0xb1,0x3b,0xd1,0x9c,0xd8,0x9f,0x38,0x98,0x38, +0x94,0x38,0x9c,0x38,0x92,0x38,0x9a,0x38,0x96,0x38,0x9e,0x38,0x95,0x38,0x9d,0x68, +0x49,0x9c,0x4f,0x5c,0x48,0x5c,0x4a,0x5c,0x4e,0x5c,0x49,0x5c,0x4d,0xc4,0x25,0xd9, +0x26,0xe1,0x93,0x1c,0x92,0xdc,0x92,0x88,0x49,0x94,0xa4,0x90,0x24,0x46,0x12,0x3b, +0x29,0x3d,0x49,0x90,0x24,0x4d,0x52,0x27,0x99,0x92,0x9a,0x92,0x3a,0x92,0xcc,0x49, +0x43,0x49,0xa3,0x49,0x93,0x49,0x96,0xa4,0xf9,0xa4,0x85,0xa4,0xa5,0xa4,0x65,0x08, +0x8e,0xed,0xc0,0x76,0x63,0x13,0xd9,0x14,0x36,0x9d,0x1d,0xc6,0x66,0xb0,0xe3,0xd9, +0x1c,0x76,0x3a,0x9b,0xc7,0x16,0xb1,0xa5,0x6c,0x25,0x5b,0xc7,0x36,0xb1,0x1b,0xd8, +0x2d,0xec,0x0e,0x76,0x37,0xbb,0x9f,0x3d,0xc4,0x1e,0x61,0x8f,0xb1,0x27,0xd9,0xd3, +0xec,0x79,0xf6,0x12,0x7b,0x85,0x8d,0x3b,0x81,0x3f,0xe1,0x74,0xc2,0xed,0x84,0xd7, +0x09,0xdf,0x13,0x94,0x13,0xf4,0x13,0x61,0x27,0x18,0x27,0xe2,0x4f,0x70,0x4e,0xa4, +0x9f,0xe0,0x9d,0x10,0x9d,0x90,0x9e,0x50,0x9e,0xd0,0x9d,0x30,0x9d,0x68,0x38,0xd1, +0x72,0xa2,0xe3,0x44,0xf7,0x89,0xfe,0x13,0x43,0x27,0x46,0x4e,0x8c,0x9d,0x98,0x3c, +0x31,0x7d,0x62,0xfe,0xc4,0xd2,0x89,0x95,0x13,0xb8,0x93,0xf8,0x93,0x4e,0x27,0xdd, +0x4e,0x7a,0x9d,0xf4,0x3d,0x49,0x39,0x49,0x3f,0x19,0x76,0x92,0x71,0x32,0xfe,0x24, +0xe7,0x64,0xfa,0x49,0xde,0x49,0xd1,0x49,0xe9,0x49,0xe5,0x49,0xdd,0x49,0xd3,0xc9, +0x86,0x93,0x2d,0x27,0x3b,0x4e,0x76,0x9f,0xec,0x3f,0x39,0x74,0x72,0xe4,0xe4,0xd8, +0xc9,0xc9,0x93,0xd3,0x27,0xe7,0x4f,0x2e,0x9d,0x5c,0x39,0x69,0x9b,0xec,0x94,0xec, +0x91,0xec,0x9b,0x4c,0x4b,0x0e,0x4b,0x66,0x25,0x73,0x92,0x33,0x93,0x45,0xc9,0xf2, +0x64,0x5d,0xb2,0x29,0xb9,0x21,0xb9,0x25,0xb9,0x23,0xb9,0x3b,0xb9,0x3f,0x79,0x28, +0x79,0x24,0x79,0x2c,0x79,0x32,0x79,0x3a,0x79,0x3e,0x79,0x29,0x79,0x25,0x19,0xc7, +0xc1,0x73,0x9c,0x38,0x6e,0x1c,0x2f,0x8e,0x2f,0x87,0xc2,0xa1,0x73,0xc2,0x38,0x0c, +0x4e,0x3c,0x87,0xc3,0x49,0xe7,0xf0,0x38,0x22,0x8e,0x94,0xa3,0xe4,0xe8,0x38,0x26, +0x4e,0x03,0xa7,0x85,0xd3,0xc1,0xe9,0xe6,0xf4,0x73,0x86,0x38,0x23,0x9c,0x31,0xce, +0x24,0x67,0x9a,0x33,0xcf,0x59,0xe2,0xac,0x72,0xf0,0xa7,0x5c,0x4e,0x79,0x9d,0x22, +0x9d,0xa2,0x9d,0x0a,0x39,0x15,0x71,0x8a,0x75,0x8a,0x7d,0x2a,0xf5,0x54,0xe6,0x29, +0xc1,0x29,0xc9,0x29,0xf9,0x29,0xf5,0x29,0xe3,0xa9,0xda,0x53,0x4d,0xa7,0xda,0x4e, +0x75,0x9d,0x32,0x9f,0x1a,0x3c,0x35,0x7c,0x6a,0xf4,0xd4,0xf8,0xa9,0xa9,0x53,0x96, +0x53,0x0b,0xa7,0x96,0x4f,0xad,0x9e,0xb2,0x3d,0xed,0x70,0xda,0xe5,0xb4,0xc7,0x69, +0xe2,0x69,0xd2,0x69,0xda,0xe9,0x90,0xd3,0x11,0xa7,0x59,0xa7,0xd9,0xa7,0x53,0x4f, +0x67,0x9e,0x16,0x9c,0x96,0x9c,0x96,0x9f,0x56,0x9f,0x36,0x9e,0xae,0x3d,0xdd,0x74, +0xba,0xed,0x74,0xd7,0x69,0xf3,0xe9,0xc1,0xd3,0xc3,0xa7,0x47,0x4f,0x8f,0x9f,0x9e, +0x3a,0x6d,0x39,0xbd,0x70,0x7a,0xf9,0xf4,0xea,0x69,0xdb,0x14,0x87,0x14,0x97,0x14, +0x8f,0x14,0x62,0x0a,0x29,0x85,0x96,0x12,0x92,0x12,0x91,0x12,0x9f,0x92,0x9a,0x92, +0x99,0x22,0x48,0x91,0xa4,0xc8,0x53,0xd4,0x29,0xc6,0x94,0xda,0x94,0xa6,0x94,0xb6, +0x94,0xae,0x14,0x73,0xca,0x60,0xca,0x70,0xca,0x68,0xca,0x78,0xca,0x54,0x8a,0x25, +0x65,0x29,0x65,0x35,0x05,0x9f,0xea,0x94,0xea,0x96,0xea,0x95,0xea,0x9b,0x4a,0x49, +0xa5,0xa7,0x86,0xa5,0x32,0x52,0xe3,0x53,0x39,0xa9,0xe9,0x10,0x5e,0xaa,0x28,0x55, +0x9a,0xaa,0x4c,0xd5,0xa5,0x9a,0x52,0x1b,0x52,0x5b,0x52,0x3b,0x52,0xbb,0x53,0xfb, +0x53,0x87,0x52,0x47,0x52,0xc7,0x52,0x27,0x53,0xa7,0x53,0xe7,0x53,0x97,0x52,0x57, +0x52,0x71,0x67,0xf0,0x67,0x9c,0xce,0xb8,0x9d,0xf1,0x3a,0xe3,0x7b,0x86,0x72,0x86, +0x7e,0x26,0xec,0x0c,0xe3,0x4c,0xfc,0x19,0xce,0x99,0xf4,0x33,0xbc,0x33,0xa2,0x33, +0xd2,0x33,0xca,0x33,0xba,0x33,0xa6,0x33,0x0d,0x67,0x5a,0xce,0x74,0x9c,0xe9,0x3e, +0xd3,0x7f,0x66,0xe8,0xcc,0xc8,0x99,0xb1,0x33,0x93,0x67,0xa6,0xcf,0xcc,0x9f,0x59, +0x3a,0xb3,0x72,0x06,0x77,0x16,0x7f,0xd6,0xe9,0xac,0xdb,0x59,0xaf,0xb3,0xbe,0x67, +0x29,0x67,0xe9,0x67,0xc3,0xce,0x32,0xce,0xc6,0xfd,0x09,0xc4,0x9f,0x4d,0x3d,0xcb, +0x3b,0x2b,0x39,0xab,0x3c,0x6b,0x3c,0xdb,0x70,0xb6,0xed,0x6c,0xf7,0xd9,0xc1,0xb3, +0x23,0x67,0xc7,0xcf,0x4e,0x9f,0x5d,0x38,0xbb,0x72,0xd6,0x36,0xcd,0x29,0xcd,0x23, +0xcd,0x37,0x8d,0x96,0x16,0x96,0xc6,0x4a,0xe3,0xa4,0x65,0xa6,0x89,0xd2,0xe4,0x69, +0xba,0xb4,0xda,0xb4,0x96,0xb4,0xae,0xb4,0xfe,0xb4,0xe1,0xb4,0xb1,0xb4,0xa9,0xb4, +0xf9,0xb4,0xe5,0x34,0x5c,0xba,0x43,0xba,0x5b,0x3a,0x31,0x9d,0x92,0x1e,0x92,0xce, +0x48,0x67,0xa7,0xa7,0xa7,0x0b,0xd2,0xa5,0xe9,0xea,0x74,0x53,0x7a,0x53,0x7a,0x47, +0xba,0x39,0x7d,0x28,0x7d,0x34,0x7d,0x32,0xdd,0x92,0xbe,0x94,0xbe,0x9a,0x8e,0xff, +0xc8,0xe5,0x23,0xaf,0x8f,0x48,0x1f,0xd1,0x3f,0x8a,0xf8,0x28,0x0e,0x12,0xff,0x51, +0xea,0x47,0xbc,0x8f,0x24,0x1f,0x29,0x3f,0x32,0x7e,0xd4,0xf0,0x51,0xdb,0x47,0xdd, +0x1f,0x0d,0x7e,0x34,0xf2,0xd1,0xf8,0x47,0xd3,0x1f,0x2d,0x7c,0xb4,0xf2,0x91,0xed, +0xc7,0x4e,0x1f,0x7b,0x7c,0xec,0xfb,0x31,0xed,0xe3,0xb0,0x8f,0x59,0x1f,0x73,0x3e, +0xce,0xfc,0x58,0xf4,0xb1,0xfc,0x63,0xdd,0xc7,0xb5,0x1f,0xb7,0x7c,0xdc,0xf5,0x71, +0xff,0xc7,0xc3,0x1f,0x8f,0x7d,0x3c,0xf5,0xf1,0xfc,0xc7,0xcb,0x1f,0xe3,0x32,0x1c, +0x32,0xdc,0x32,0x88,0x19,0x94,0x8c,0x90,0x0c,0x46,0x06,0x3b,0x23,0x3d,0x43,0x90, +0x21,0xcd,0x50,0x67,0x98,0x32,0x9a,0x32,0x3a,0x32,0xcc,0x19,0x43,0x19,0xa3,0x19, +0x13,0xbf,0x32,0x93,0x19,0x96,0x8c,0xa5,0x0c,0x5c,0xa6,0x53,0xa6,0x57,0x26,0x25, +0x33,0x2c,0x33,0x3e,0x33,0x3d,0x53,0x90,0x69,0xce,0x1c,0xcf,0x9c,0xf9,0x13,0xb1, +0x64,0xce,0x67,0x2e,0x64,0x2e,0x65,0x2e,0x67,0xae,0x64,0xae,0x66,0xe2,0xb2,0x6c, +0xb3,0xf0,0x59,0xce,0x7f,0x06,0x2e,0x59,0x1e,0x59,0x5e,0x59,0xc4,0x2c,0xdf,0x2c, +0x52,0x16,0x25,0x8b,0x96,0x45,0xcf,0x0a,0xc9,0x0a,0xcb,0x8a,0xc8,0x62,0x64,0xb1, +0xb2,0xe2,0xb3,0xd8,0x59,0x9c,0xac,0xd4,0xac,0xf4,0xac,0xcc,0x2c,0x5e,0x16,0x1f, +0x22,0xc8,0x12,0x65,0x49,0xb2,0xe4,0x59,0xea,0x2c,0x63,0x56,0x6d,0x56,0x43,0x56, +0x53,0x56,0x4b,0x56,0x5b,0x56,0x47,0x56,0x67,0x56,0x57,0x56,0x77,0x96,0x39,0xab, +0x3f,0x6b,0x30,0x6b,0x28,0x6b,0x38,0x6b,0x24,0x6b,0x34,0x6b,0x2c,0x6b,0x3c,0x6b, +0x32,0x6b,0x2a,0x6b,0x3a,0xcb,0x92,0x35,0x9f,0xb5,0x90,0xb5,0x94,0xb5,0x9c,0xf5, +0x32,0x6b,0x25,0x6b,0x35,0x0b,0x77,0xce,0xf6,0x9c,0x1d,0x06,0xfe,0x9c,0xd3,0x39, +0xb7,0x73,0x9e,0xe7,0xbc,0xce,0xf9,0x9c,0xf3,0x3d,0x47,0x39,0x47,0x3f,0x17,0x76, +0x8e,0x71,0x2e,0xfe,0x1c,0xe7,0x5c,0xfa,0x39,0xde,0x39,0xd1,0x39,0xe9,0x39,0xf9, +0x39,0xf5,0x39,0xe3,0xb9,0xda,0x73,0x4d,0xe7,0xda,0xce,0x75,0x9d,0x33,0x9f,0x1b, +0x3c,0x37,0x7c,0x6e,0xf4,0xdc,0xf8,0xb9,0xa9,0x73,0xd3,0xe7,0x2c,0xe7,0xe6,0xcf, +0x2d,0x9c,0x5b,0x3a,0xb7,0x7c,0x6e,0xe5,0xdc,0xea,0x39,0x1c,0xd7,0x96,0x8b,0xe7, +0x3a,0x70,0x9d,0xb8,0x2e,0x5c,0x37,0xae,0x07,0xd7,0x8b,0x4b,0xe4,0xfa,0x72,0x49, +0x5c,0x0a,0x97,0xc6,0xa5,0x73,0x43,0xb8,0x61,0xdc,0x08,0x2e,0x83,0xcb,0xe2,0xc6, +0x73,0xd9,0x5c,0x0e,0x37,0x95,0x9b,0xce,0xcd,0xe4,0xf2,0xb8,0x02,0xae,0x88,0x2b, +0xe1,0x4a,0xb9,0x72,0xae,0x92,0xab,0xe6,0xea,0xb8,0x46,0xae,0x89,0x5b,0xcb,0x6d, +0xe0,0x36,0x71,0x5b,0xb8,0x6d,0xdc,0x0e,0x6e,0x17,0xb7,0x9b,0x6b,0xe6,0xf6,0x73, +0x07,0xb9,0x43,0xdc,0x61,0xee,0x08,0x77,0x94,0x3b,0xc6,0x1d,0xe7,0x4e,0x72,0xa7, +0xb8,0xd3,0x5c,0x0b,0x77,0x9e,0xbb,0xc0,0x5d,0xe2,0x2e,0x73,0x57,0xb8,0xab,0x5c, +0x1c,0xcf,0x96,0x87,0xe7,0x39,0xf0,0x9c,0x78,0x2e,0x3c,0x37,0x9e,0x07,0xcf,0x8b, +0x47,0xe4,0xf9,0xf2,0x48,0x3c,0x0a,0x8f,0xc6,0xa3,0xf3,0x42,0x78,0x61,0xbc,0x08, +0x1e,0x83,0xc7,0xe2,0xc5,0xf3,0xd8,0x3c,0x0e,0x2f,0x95,0x97,0xce,0xcb,0xe4,0xf1, +0x78,0x02,0x9e,0x88,0x27,0xe1,0x49,0x79,0x72,0x9e,0x8e,0x57,0xcb,0x6b,0xe1,0x75, +0xf1,0xfa,0x79,0xc3,0xbc,0x51,0xde,0xe3,0x5f,0x18,0xe7,0x4d,0xf2,0xa6,0x78,0xd3, +0x3c,0x0b,0x6f,0x9e,0xb7,0xc0,0x5b,0xe2,0x2d,0xf3,0x56,0x78,0xab,0x3c,0x5c,0xb6, +0x6d,0x36,0x3e,0xdb,0x21,0xdb,0x29,0xdb,0x25,0xdb,0x2d,0xdb,0x23,0xdb,0x2b,0x9b, +0x98,0xed,0x9b,0x4d,0xca,0xa6,0x64,0xd3,0xb2,0xe9,0xd9,0x21,0xd9,0x61,0xd9,0x11, +0xd9,0x8c,0x6c,0x56,0x76,0x7c,0x36,0x3b,0x9b,0x93,0x9d,0x9a,0x9d,0x9e,0x9d,0x99, +0xcd,0xcb,0x16,0x64,0x8b,0xb2,0x25,0xd9,0xd2,0x6c,0x79,0xb6,0x32,0x5b,0x9d,0xad, +0xcb,0x36,0x66,0x9b,0xb2,0x6b,0xb3,0x1b,0xb2,0x9b,0xb2,0x5b,0xb2,0xdb,0xb2,0x3b, +0xb2,0xbb,0xb2,0xbb,0xb3,0xcd,0xd9,0xfd,0xd9,0x83,0xd9,0x43,0xd9,0xc3,0xd9,0x23, +0xd9,0xa3,0xd9,0x63,0xd9,0xe3,0xd9,0x93,0xd9,0x53,0xd9,0xd3,0xd9,0x96,0xec,0xf9, +0xec,0x85,0xec,0xa5,0xec,0xe5,0xec,0x95,0xec,0xd5,0x6c,0x5c,0x8e,0x6d,0x0e,0x3e, +0xc7,0x21,0xc7,0x29,0xc7,0x25,0xc7,0x2d,0xc7,0x23,0xc7,0x2b,0x87,0x98,0xe3,0x9b, +0x43,0xca,0xa1,0xe4,0xd0,0x72,0xe8,0x39,0x21,0x39,0x61,0x39,0x11,0x39,0x8c,0x1c, +0x56,0x4e,0x7c,0x0e,0x3b,0x87,0x93,0x93,0x9a,0x93,0x9e,0x93,0x99,0xc3,0xcb,0x11, +0xe4,0x88,0x72,0x24,0x39,0xd2,0x1c,0x79,0x8e,0x32,0x47,0x9d,0xa3,0xcb,0x31,0xe6, +0x98,0x72,0x6a,0x73,0x1a,0x72,0x9a,0x72,0x5a,0x72,0xda,0x72,0x3a,0x72,0xba,0x72, +0xba,0x73,0xcc,0x39,0xfd,0x39,0x83,0x39,0x43,0x39,0xc3,0x39,0x23,0x39,0xa3,0x39, +0x63,0x39,0xe3,0x39,0x93,0x39,0x53,0x39,0xd3,0x39,0x96,0x9c,0xf9,0x9c,0x85,0x9c, +0xa5,0x9c,0xe5,0x9c,0x95,0x9c,0xd5,0x1c,0x1c,0xdf,0x96,0x8f,0xe7,0x3b,0xf0,0x9d, +0xf8,0x2e,0x7c,0x37,0xbe,0x07,0xdf,0x8b,0x4f,0xe4,0xfb,0xf2,0x49,0x7c,0x0a,0x9f, +0xc6,0xa7,0xf3,0x43,0xf8,0x61,0xfc,0x08,0x3e,0x03,0xbe,0x28,0xc7,0xf3,0xd9,0x7c, +0x0e,0x3f,0x95,0x9f,0xce,0xcf,0xe4,0xf3,0xf8,0x02,0xbe,0x88,0x2f,0xe1,0x4b,0xf9, +0x72,0xbe,0x92,0xaf,0xe6,0xeb,0xf8,0x46,0xbe,0x89,0x5f,0xcb,0x6f,0xe0,0x37,0xf1, +0x5b,0xf8,0x6d,0xfc,0x0e,0x7e,0x17,0xbf,0x9b,0x6f,0xe6,0xf7,0xf3,0x07,0xf9,0x43, +0xfc,0x61,0xfe,0x08,0xff,0xa1,0x95,0x51,0xfe,0x18,0x7f,0x9c,0x3f,0xc9,0x9f,0xe2, +0x4f,0xf3,0x67,0x20,0x16,0xfe,0x3c,0x7f,0x81,0xbf,0xc4,0x5f,0xe6,0xaf,0xf0,0x5f, +0x41,0x56,0xf9,0x38,0x81,0xad,0x00,0x2f,0x70,0x10,0x38,0x09,0x9c,0x21,0x2e,0x02, +0x37,0x81,0x87,0xc0,0xd3,0x8a,0x97,0x80,0x28,0xf0,0x15,0x90,0x04,0x34,0x01,0x5d, +0x10,0x22,0x08,0x15,0x84,0x09,0x22,0x04,0x0c,0x01,0x4b,0x10,0x2f,0x60,0x0b,0x38, +0x82,0x94,0x75,0xfe,0x04,0x52,0x05,0xe9,0x82,0x4c,0x01,0x4f,0x20,0x10,0x08,0x05, +0x22,0x81,0x44,0x20,0x15,0xc8,0x05,0x4a,0x81,0x5a,0xa0,0x13,0x18,0x05,0x26,0x41, +0xad,0xa0,0x41,0xd0,0x24,0x68,0x11,0xb4,0x09,0x3a,0x04,0x5d,0x82,0x6e,0x81,0x59, +0xd0,0x2f,0x18,0x14,0x0c,0x09,0x86,0x05,0x23,0x82,0x51,0xc1,0x98,0x60,0x5c,0x30, +0x29,0x98,0x12,0x4c,0x0b,0x2c,0x82,0x79,0xc1,0x82,0x60,0x49,0xb0,0x2c,0x58,0x11, +0xac,0x0a,0x70,0xe7,0x6d,0xcf,0xe3,0xcf,0x3b,0x9c,0x77,0x3a,0xef,0x72,0xde,0xf5, +0xbc,0xdb,0x79,0x8f,0xf3,0x5e,0xe7,0x89,0xe7,0x7d,0xcf,0x93,0xce,0x53,0xce,0xd3, +0xce,0xd3,0xcf,0x07,0xaf,0xf3,0x4f,0x4e,0x38,0x84,0xf9,0x3f,0x92,0xb4,0x8e,0x95, +0x94,0xf3,0x19,0xeb,0xac,0xf3,0x17,0xc1,0x3f,0x2f,0x5e,0x67,0x9d,0x7f,0x61,0x64, +0xe7,0x55,0x10,0xc3,0x3a,0xff,0xa6,0xd4,0x9c,0x6f,0xfc,0x37,0xa6,0x75,0x9d,0x75, +0x7e,0x35,0x3a,0xcf,0xf7,0x9e,0xbf,0x77,0xfe,0xe1,0xf9,0x89,0xf3,0x33,0xe7,0x17, +0xff,0xa9,0x78,0x79,0x1e,0xe4,0xda,0xe7,0xba,0xe6,0x7a,0xe7,0x92,0xd7,0x59,0xe7, +0xff,0x22,0x14,0x08,0x2d,0x97,0x9e,0x1b,0x92,0x1b,0x96,0x1b,0x91,0xcb,0xc8,0x65, +0xe5,0xc6,0xe7,0xb2,0x73,0x39,0xb9,0xa9,0xb9,0xe9,0xb9,0x99,0xb9,0xbc,0x5c,0x41, +0xae,0x28,0x57,0x92,0x2b,0xcd,0x95,0xe7,0x2a,0x73,0xd5,0xb9,0xba,0x5c,0x63,0xae, +0x29,0xb7,0x36,0xb7,0x21,0xb7,0x29,0xb7,0x25,0xb7,0x2d,0xb7,0x23,0xb7,0x2b,0xb7, +0x3b,0xd7,0x9c,0xdb,0x9f,0x3b,0x98,0x3b,0x94,0x3b,0x9c,0x3b,0x92,0x3b,0x9a,0x3b, +0x96,0x3b,0x9e,0x3b,0x99,0x3b,0x95,0x3b,0x9d,0x6b,0xc9,0x9d,0xcf,0x5d,0xc8,0x5d, +0xca,0x5d,0xce,0x5d,0xc9,0x5d,0xcd,0xc5,0x09,0x6d,0x85,0x78,0xa1,0x83,0xd0,0x49, +0xe8,0x22,0x74,0x13,0x7a,0x08,0xbd,0x84,0x44,0xa1,0xaf,0x90,0x24,0xa4,0x08,0x69, +0x42,0xba,0x30,0x44,0x18,0x26,0x8c,0x10,0x32,0x84,0x2c,0x61,0xbc,0x90,0x2d,0xe4, +0x08,0x53,0x85,0xe9,0xc2,0x4c,0x21,0x4f,0x28,0x10,0x8a,0x84,0x12,0xa1,0x54,0x28, +0x17,0x2a,0x85,0x2a,0xa1,0x5a,0xa8,0x13,0x1a,0x85,0x26,0x61,0xad,0xb0,0x41,0xd8, +0x24,0x6c,0x11,0xb6,0x09,0x3b,0x84,0x5d,0xc2,0x6e,0xa1,0x59,0xd8,0x2f,0x1c,0x14, +0x0e,0x09,0x87,0x85,0x23,0xc2,0x51,0xe1,0x98,0x70,0x5c,0x38,0x29,0x9c,0x12,0x4e, +0x0b,0x2d,0xc2,0x79,0xe1,0x82,0x70,0x49,0xb8,0x2c,0x5c,0x11,0xae,0x0a,0x71,0x22, +0x5b,0x11,0x5e,0xe4,0x20,0x72,0x12,0xb9,0x88,0xdc,0x44,0x1e,0x22,0x2f,0x11,0x51, +0xe4,0x2b,0x22,0x89,0x28,0x22,0x9a,0x88,0x2e,0x0a,0x11,0x85,0x89,0x22,0x44,0x0c, +0x11,0x4b,0x14,0x2f,0x62,0x8b,0x38,0xa2,0x54,0x51,0xba,0x28,0x53,0xc4,0x13,0x09, +0x44,0x22,0x91,0x44,0x24,0x15,0xc9,0x45,0x4a,0x91,0x5a,0xa4,0x13,0x19,0x45,0x26, +0x51,0xad,0xa8,0x41,0xd4,0x24,0x6a,0x16,0xb5,0x88,0xda,0x44,0xed,0x90,0x0e,0x51, +0x27,0xa4,0x4b,0xd4,0x2d,0xea,0x85,0x98,0x45,0xfd,0xa2,0x41,0xd1,0x90,0xe8,0xbe, +0x68,0x58,0x34,0x22,0x1a,0x15,0x8d,0x89,0xc6,0x45,0x93,0xa2,0x29,0xd1,0xb4,0xc8, +0x22,0x9a,0x17,0x2d,0x88,0x96,0x44,0x2f,0x44,0xcb,0xa2,0x97,0xa2,0x15,0xd1,0xaa, +0x08,0x97,0x67,0x9b,0x87,0xcf,0x73,0xc8,0x73,0xca,0x73,0xce,0x73,0xc9,0x73,0xcb, +0xf3,0xc8,0xf3,0xca,0x23,0xe6,0xf9,0xe6,0x91,0xf2,0x28,0x79,0xb4,0x3c,0x7a,0x5e, +0x48,0x5e,0x58,0x5e,0x44,0x1e,0x23,0x8f,0x95,0x17,0x9f,0xc7,0xce,0xe3,0xe4,0xa5, +0xe6,0xa5,0xe7,0x65,0xe6,0xf1,0xf2,0x04,0x79,0xa2,0x3c,0x49,0x9e,0x34,0x4f,0x9e, +0xa7,0xcc,0x53,0xe7,0xe9,0xf2,0x8c,0x79,0xa6,0xbc,0xda,0xbc,0x86,0xbc,0xa6,0xbc, +0x96,0xbc,0xb6,0xbc,0x8e,0xbc,0xae,0xbc,0xee,0x3c,0x73,0x5e,0x7f,0xde,0x60,0xde, +0x50,0xde,0x70,0xde,0x48,0xde,0x68,0xde,0x58,0xde,0x78,0xde,0x64,0xde,0x54,0xde, +0x74,0x9e,0x25,0x6f,0x3e,0x6f,0x21,0x6f,0x29,0x6f,0x39,0x6f,0x25,0x6f,0x35,0x0f, +0x97,0x8f,0xcb,0xb7,0xcd,0xc7,0xe7,0x3b,0xe4,0x3b,0xe5,0xbb,0xe4,0xbb,0xe6,0xbb, +0xe5,0x7b,0xe4,0x7b,0xe5,0x13,0xf3,0x7d,0x20,0xbe,0xf9,0xa4,0x7c,0x4a,0x3e,0x2d, +0x9f,0x9e,0x1f,0x92,0x1f,0x96,0x1f,0x91,0x1f,0x99,0xcf,0xc8,0x67,0xe5,0xc7,0xe7, +0xb3,0xf3,0x39,0xf9,0xa9,0xf9,0xe9,0xf9,0x19,0xf9,0x99,0xf9,0xbc,0x7c,0x41,0xbe, +0x28,0x5f,0x92,0x2f,0xcd,0x97,0xe7,0x2b,0xf3,0xd5,0xf9,0xba,0x7c,0x63,0xbe,0x29, +0xbf,0x36,0xbf,0x21,0xbf,0x29,0xbf,0x25,0xbf,0x2d,0xbf,0x23,0xbf,0x2b,0xbf,0x3b, +0xdf,0x9c,0xdf,0x9f,0x3f,0x98,0x3f,0x94,0x3f,0x9c,0x3f,0x92,0x3f,0x9a,0x3f,0x96, +0xff,0x38,0x7f,0x3c,0x7f,0x32,0x7f,0x2a,0x7f,0x3a,0x7f,0x26,0xdf,0x92,0x3f,0x9f, +0xbf,0x90,0xbf,0x94,0xbf,0x9c,0xff,0x32,0x7f,0x25,0xff,0x95,0x95,0xd5,0x7c,0x9c, +0xd8,0x56,0x8c,0x17,0x3b,0x88,0x9d,0xc4,0x2e,0x62,0x57,0xb1,0x9b,0xd8,0x43,0xec, +0x25,0x26,0x8a,0x7d,0xc5,0x24,0x31,0x45,0x4c,0x13,0xd3,0xc5,0x21,0xe2,0x30,0x71, +0x84,0x98,0x21,0x66,0x89,0xe3,0xc5,0x6c,0x31,0x47,0x9c,0x2a,0x4e,0x17,0x67,0x8a, +0x79,0x62,0x81,0x58,0x24,0x96,0x88,0xa5,0x62,0xb9,0x58,0x29,0x56,0x8b,0x75,0x62, +0xa3,0xd8,0x24,0xae,0x15,0x37,0x88,0x9b,0xc4,0x2d,0xe2,0x36,0x71,0x87,0xb8,0x4b, +0xdc,0x2d,0x36,0x8b,0xfb,0xc5,0x83,0xe2,0x21,0xf1,0xb0,0x78,0x44,0x3c,0x2a,0x1e, +0x13,0x8f,0x8b,0x27,0xc5,0x53,0xe2,0x69,0xb1,0x45,0x3c,0x2f,0x5e,0x10,0x2f,0x89, +0x97,0xc5,0x2b,0xe2,0x55,0x31,0x4e,0x62,0x2b,0xc1,0x4b,0x1c,0x24,0x4e,0x12,0x17, +0x89,0x9b,0xc4,0x43,0xe2,0x25,0x21,0x4a,0x7c,0x25,0x24,0x09,0x45,0x42,0x93,0xd0, +0x25,0x21,0x92,0x30,0x49,0x84,0x84,0x21,0x61,0x49,0xe2,0x25,0x6c,0x09,0x47,0x92, +0x2a,0x49,0x97,0x64,0x4a,0x78,0x12,0x81,0x44,0x24,0x91,0x48,0xa4,0x12,0xb9,0x44, +0x29,0x51,0x4b,0x74,0x12,0xa3,0xc4,0x24,0xa9,0x95,0x34,0x48,0x9a,0x24,0x2d,0x92, +0x36,0x49,0x87,0xa4,0x4b,0xd2,0x2d,0x31,0x4b,0xfa,0x25,0x83,0x92,0x21,0xc9,0xb0, +0x64,0x44,0x32,0x2a,0x19,0x93,0x8c,0x4b,0x26,0x25,0x53,0x92,0x69,0x89,0x45,0x32, +0x2f,0x59,0x90,0x2c,0x49,0x96,0x25,0x2b,0x92,0x55,0x09,0xae,0xc0,0xb6,0x00,0x5f, +0xe0,0x50,0xe0,0x54,0xe0,0x52,0xe0,0x56,0xe0,0x51,0xe0,0x55,0x40,0x2c,0xf0,0x2d, +0x20,0x15,0x50,0x0a,0x68,0x05,0xf4,0x82,0x90,0x82,0xb0,0x82,0x88,0x02,0x46,0x01, +0xab,0x20,0xbe,0x80,0x5d,0xc0,0x29,0x48,0x2d,0x48,0x2f,0xc8,0x2c,0xe0,0x15,0x08, +0x0a,0x44,0x05,0x92,0x02,0x69,0x81,0xbc,0x40,0x59,0xa0,0x2e,0xd0,0x15,0x18,0x0b, +0x4c,0x05,0xb5,0x05,0x0d,0x05,0x4d,0x05,0x2d,0x05,0x6d,0x05,0x1d,0x05,0x5d,0x05, +0xdd,0x05,0xe6,0x82,0xfe,0x82,0xc1,0x82,0xa1,0x82,0xe1,0x82,0x91,0x82,0xd1,0x82, +0x31,0xc8,0x78,0xc1,0x64,0xc1,0x54,0xc1,0x74,0x81,0xa5,0x60,0xbe,0x60,0xa1,0x60, +0xa9,0x60,0xb9,0x60,0xa5,0x60,0xb5,0x00,0x57,0x68,0x5b,0x88,0x2f,0x74,0x28,0x74, +0x2a,0x74,0x29,0x74,0x2b,0xf4,0x28,0xf4,0x2a,0x24,0x16,0xfa,0x16,0x92,0x0a,0x29, +0x85,0xb4,0x42,0x7a,0x61,0x48,0x61,0x58,0x61,0x44,0x21,0xa3,0x90,0x55,0x18,0x5f, +0xc8,0x2e,0xe4,0x14,0xa6,0x16,0xa6,0x17,0x66,0x16,0xf2,0x0a,0x05,0x85,0xa2,0x42, +0x49,0xa1,0xb4,0x50,0x5e,0xa8,0x2c,0x54,0x17,0xea,0x0a,0x8d,0x85,0xa6,0xc2,0xda, +0xc2,0x86,0xc2,0xa6,0xc2,0x96,0xc2,0xb6,0xc2,0x8e,0xc2,0xae,0xc2,0xee,0x42,0x73, +0x61,0x7f,0xe1,0x60,0xe1,0x50,0xe1,0x70,0xe1,0x48,0xe1,0x68,0xe1,0x58,0xe1,0x78, +0xe1,0x64,0xe1,0x54,0xe1,0x74,0xa1,0xa5,0x70,0xbe,0x70,0xa1,0x70,0xa9,0x70,0xb9, +0x70,0xa5,0x70,0xb5,0x10,0x57,0x64,0x5b,0x84,0x2f,0x72,0x28,0x72,0x2a,0x72,0x29, +0x72,0x2b,0xf2,0x28,0xf2,0x2a,0x22,0x16,0xf9,0x16,0x91,0x8a,0x28,0x45,0xb4,0x22, +0x7a,0x51,0x48,0x51,0x58,0x51,0x44,0x11,0xa3,0x88,0x55,0x14,0x5f,0xc4,0x2e,0xe2, +0x14,0xa5,0x16,0xa5,0x17,0x65,0x16,0xf1,0x8a,0x04,0x45,0xa2,0x22,0x49,0x91,0xb4, +0x48,0x5e,0xa4,0x2c,0x52,0x17,0xe9,0x8a,0x8c,0x45,0xa6,0xa2,0xda,0xa2,0x86,0xa2, +0xa6,0xa2,0x96,0xa2,0xb6,0xa2,0x8e,0xa2,0xae,0xa2,0xee,0x22,0x73,0x51,0x7f,0xd1, +0x60,0xd1,0x50,0xd1,0x70,0xd1,0x48,0xd1,0x68,0xd1,0x58,0xd1,0x78,0xd1,0x64,0xd1, +0x54,0xd1,0x74,0x91,0xa5,0x68,0xbe,0x68,0xa1,0x68,0xa9,0x68,0xb9,0x68,0xa5,0x68, +0xb5,0x08,0x27,0xb5,0x95,0xe2,0xa5,0x0e,0x52,0x27,0xa9,0x8b,0xd4,0x4d,0xea,0x21, +0xf5,0x92,0x12,0xa5,0xbe,0x52,0x92,0x94,0x22,0xa5,0x49,0xe9,0xd2,0x10,0x69,0x98, +0x34,0x42,0xca,0x90,0xb2,0xa4,0xf1,0x52,0xb6,0x94,0x23,0x4d,0x95,0xa6,0x4b,0x33, +0xa5,0x5c,0x08,0x4f,0x2a,0x90,0x8a,0xa4,0x12,0xa9,0x54,0x2a,0x97,0x2a,0xa5,0x6a, +0xa9,0x4e,0x6a,0x94,0x9a,0xa4,0xb5,0xd2,0x06,0x69,0x93,0xb4,0x45,0xda,0x26,0xed, +0x90,0x76,0x49,0xbb,0xa5,0x66,0x69,0xbf,0x74,0x50,0x3a,0x24,0x1d,0x96,0x8e,0x48, +0x47,0xa5,0x63,0xd2,0x71,0xe9,0xa4,0x74,0x4a,0x3a,0x2d,0xb5,0x48,0xe7,0xa5,0x0b, +0xd2,0x25,0xe9,0xb2,0x74,0x45,0xba,0x2a,0xc5,0x15,0xdb,0x16,0xe3,0x8b,0x1d,0x8a, +0x9d,0x8a,0x5d,0x8a,0xdd,0x8a,0x3d,0x8a,0xbd,0x8a,0x89,0xc5,0xbe,0xc5,0xa4,0x62, +0x4a,0x31,0xad,0x98,0x5e,0x1c,0x52,0x1c,0x56,0x1c,0x51,0xcc,0x28,0x66,0x15,0xc7, +0x17,0xb3,0x8b,0x39,0xc5,0xa9,0xc5,0xe9,0xc5,0x99,0xc5,0xbc,0x62,0x41,0xb1,0xa8, +0x58,0x52,0x2c,0x2d,0x96,0x17,0x2b,0x8b,0xd5,0xc5,0xba,0x62,0x63,0xb1,0xa9,0xb8, +0xb6,0xb8,0xa1,0xb8,0xa9,0xb8,0xa5,0xb8,0xad,0xb8,0xa3,0xb8,0xab,0xb8,0xbb,0xd8, +0x5c,0xdc,0x5f,0x3c,0x58,0x3c,0x54,0x3c,0x5c,0x3c,0x02,0x19,0x2d,0x1e,0x2b,0x1e, +0x2f,0x9e,0x2c,0x9e,0x2a,0x9e,0x2e,0xb6,0x14,0xcf,0x17,0x2f,0x14,0x2f,0x15,0x2f, +0x17,0xaf,0x14,0xaf,0x16,0xe3,0x4a,0x6c,0x4b,0xf0,0x25,0x0e,0x25,0x4e,0x25,0x2e, +0x25,0x6e,0x25,0x1e,0x25,0x5e,0x25,0xc4,0x12,0xdf,0x12,0x52,0x09,0xa5,0x84,0x56, +0x42,0x2f,0x09,0x29,0x09,0x2b,0x89,0x28,0x61,0x94,0xb0,0x4a,0xe2,0x4b,0xd8,0x25, +0x9c,0x92,0xd4,0x92,0xf4,0x92,0xcc,0x12,0x5e,0x89,0xa0,0x44,0x54,0x22,0x29,0x91, +0x96,0xc8,0x4b,0x94,0x25,0xea,0x12,0x5d,0x89,0xb1,0xc4,0x54,0x52,0x5b,0xd2,0x50, +0xd2,0x54,0xd2,0x52,0xd2,0x56,0xd2,0x51,0xd2,0x55,0xd2,0x5d,0x62,0x2e,0xe9,0x2f, +0x19,0x2c,0x19,0x2a,0x19,0x2e,0x19,0x29,0x19,0x2d,0x19,0x2b,0x19,0x2f,0x99,0x2c, +0x99,0x2a,0x99,0x2e,0xb1,0x94,0xcc,0x97,0x2c,0x94,0x2c,0x95,0x2c,0x97,0xac,0x94, +0xac,0x96,0xe0,0x64,0xb6,0x32,0xbc,0xcc,0x41,0xe6,0x24,0x73,0x91,0xb9,0xc9,0x3c, +0x64,0x5e,0x32,0xa2,0xcc,0x57,0x46,0x92,0x51,0x64,0x34,0x19,0x5d,0x16,0x22,0x0b, +0x93,0x45,0xc8,0x18,0x32,0x96,0x2c,0x5e,0xc6,0x96,0x71,0x64,0xa9,0xb2,0x74,0x59, +0xa6,0x8c,0x27,0x13,0xc8,0x44,0x32,0x89,0x4c,0x2a,0x93,0xcb,0x94,0x32,0xb5,0x4c, +0x27,0x33,0xca,0x4c,0xb2,0x5a,0x59,0x83,0xac,0x49,0xd6,0x22,0x6b,0x93,0x75,0xc8, +0xba,0x64,0xdd,0x32,0xb3,0xac,0x5f,0x36,0x28,0x1b,0x92,0x0d,0xcb,0x46,0x64,0xa3, +0xb2,0x31,0xd9,0xb8,0x6c,0x52,0x36,0x25,0x9b,0x96,0x59,0x64,0xf3,0xb2,0x05,0xd9, +0x92,0x6c,0x59,0xb6,0x22,0x5b,0x95,0xe1,0xe4,0xb6,0x72,0xbc,0xdc,0x41,0xee,0x24, +0x77,0x91,0xbb,0xc9,0x3d,0xe4,0x5e,0x72,0xa2,0xdc,0x57,0x4e,0x92,0x53,0xe4,0x34, +0x39,0x5d,0x1e,0x22,0x0f,0x93,0x47,0xc8,0x19,0x72,0x96,0x3c,0x5e,0xce,0x96,0x73, +0xe4,0xa9,0xf2,0x74,0x79,0xa6,0x9c,0x27,0x17,0xc8,0x45,0x72,0x89,0x5c,0x2a,0x97, +0xcb,0x95,0x72,0xb5,0x5c,0x27,0x37,0xca,0x4d,0xf2,0x5a,0x79,0x83,0xbc,0x49,0xde, +0x22,0x6f,0x93,0x77,0xc8,0xbb,0xe4,0xdd,0x72,0xb3,0xbc,0x5f,0x3e,0x28,0x1f,0x92, +0x0f,0xcb,0x47,0xe4,0xa3,0xf2,0x31,0xf9,0xb8,0x7c,0x52,0x3e,0x25,0x9f,0x96,0x5b, +0xe4,0xf3,0xf2,0x05,0xf9,0x92,0x7c,0x59,0xfe,0x12,0xb2,0x22,0x5f,0x95,0xe3,0x4a, +0x6d,0x4b,0xf1,0xa5,0x0e,0xa5,0x4e,0xa5,0x2e,0xa5,0x6e,0xa5,0x1e,0xa5,0x5e,0xa5, +0xc4,0x52,0xdf,0x52,0x52,0x29,0xa5,0x94,0x56,0x4a,0x2f,0x0d,0x29,0x0d,0x2b,0x8d, +0x28,0x65,0x94,0xb2,0x4a,0xe3,0x4b,0xd9,0xa5,0x9c,0xd2,0xd4,0xd2,0xf4,0xd2,0xcc, +0x52,0x5e,0xa9,0xa0,0x54,0x54,0x2a,0x29,0x95,0x96,0xca,0x4b,0x95,0xa5,0xea,0x52, +0x5d,0xa9,0xb1,0xd4,0x54,0x5a,0x5b,0xda,0x50,0xda,0x54,0xda,0x52,0xda,0x56,0xda, +0x51,0xda,0x55,0xda,0x5d,0x6a,0x2e,0xed,0x2f,0x1d,0x2c,0xbd,0xf7,0x37,0x67,0xa8, +0x74,0xb8,0x74,0xa4,0x74,0xb4,0x74,0xac,0x74,0xbc,0x74,0xb2,0x74,0xaa,0x74,0xba, +0xd4,0x52,0x3a,0x5f,0xba,0x50,0xba,0x54,0xba,0x5c,0xba,0x52,0xba,0x5a,0x8a,0x2b, +0xb3,0x2d,0xc3,0x97,0x39,0x94,0x39,0x95,0xb9,0x94,0xb9,0x95,0x79,0x94,0x79,0x95, +0x11,0xcb,0x7c,0xcb,0x48,0x65,0x94,0x32,0x5a,0x19,0xbd,0x2c,0xa4,0x2c,0xac,0x2c, +0xa2,0x8c,0x51,0xc6,0x2a,0x8b,0x2f,0x63,0x97,0x71,0xca,0x52,0xcb,0xd2,0xcb,0x32, +0xcb,0x78,0x65,0x82,0x32,0x51,0x99,0xa4,0x4c,0x5a,0x26,0x2f,0x53,0x96,0xa9,0xcb, +0x74,0x65,0xc6,0x32,0x53,0x59,0x6d,0x59,0x43,0x59,0x53,0x59,0x4b,0x59,0x5b,0x59, +0x47,0x59,0x57,0x59,0x77,0x99,0xb9,0xac,0x6f,0x9d,0x75,0xd6,0xf9,0x23,0xf4,0x43, +0x06,0xcb,0x86,0xca,0x86,0xcb,0x1e,0x94,0x8d,0x94,0x8d,0x96,0x8d,0x95,0x8d,0x97, +0x4d,0x96,0x4d,0x95,0x4d,0x97,0x59,0xca,0xe6,0xcb,0x16,0xca,0x96,0xca,0x96,0xcb, +0x56,0xca,0x56,0xcb,0x70,0x0a,0x5b,0x05,0x5e,0xe1,0xa0,0x70,0x52,0xb8,0x28,0xdc, +0x14,0x1e,0x0a,0x2f,0x05,0x51,0xe1,0xab,0x20,0x29,0x28,0x0a,0xaa,0x82,0xa6,0xa0, +0x2b,0x82,0x15,0x21,0x8a,0x50,0x48,0x98,0x22,0x5c,0x11,0xa1,0x60,0x28,0x58,0x8a, +0x78,0x05,0x5b,0xc1,0x51,0xa4,0x2a,0xd2,0x15,0x99,0x0a,0x9e,0x82,0xaf,0x10,0x28, +0x44,0x0a,0x89,0x42,0xaa,0x90,0x29,0xe4,0x0a,0x85,0x42,0xa9,0x50,0xbd,0x81,0x5a, +0xa1,0xc5,0xd0,0x29,0x0c,0x0a,0xa3,0xa2,0x5a,0x61,0x52,0xd4,0x28,0x6a,0x15,0x0d, +0x8a,0x26,0x45,0xb3,0xa2,0x45,0xd1,0xa6,0x68,0x57,0x74,0x28,0x3a,0x21,0x5d,0x8a, +0x1b,0x8a,0x6e,0x45,0xaf,0xc2,0xac,0xe8,0x53,0xf4,0x2b,0x06,0x14,0x83,0x8a,0x7b, +0x8a,0x21,0xc5,0xb0,0xe2,0x81,0x62,0x44,0xf1,0x10,0x32,0xaa,0x18,0x53,0x8c,0x2b, +0x26,0x15,0x4f,0x14,0x53,0x8a,0x69,0x85,0x45,0x31,0xaf,0x58,0x50,0x2c,0x29,0x96, +0x15,0x2f,0x15,0x2b,0x8a,0x55,0x05,0x4e,0x69,0xab,0xb4,0x53,0xe2,0x95,0x0e,0x4a, +0x27,0xa5,0x8b,0xd2,0x55,0xe9,0xa6,0x74,0x57,0x7a,0x28,0xbd,0x94,0x44,0xa5,0xaf, +0x92,0xa4,0xa4,0x28,0x69,0x4a,0xba,0x32,0x44,0x19,0xa6,0x0c,0x57,0x46,0x28,0x19, +0x4a,0x96,0x32,0x5e,0xc9,0x56,0x72,0x94,0xa9,0xca,0x74,0x65,0xa6,0x92,0xa7,0x14, +0x28,0x45,0x4a,0x89,0x52,0xaa,0x94,0x2b,0x95,0x4a,0xb5,0x52,0xfb,0x0b,0x3a,0xa5, +0x51,0x69,0x52,0xd6,0x28,0x6b,0x95,0x0d,0xca,0x26,0x65,0x8b,0xb2,0x4d,0xd9,0xae, +0xec,0x50,0x76,0x29,0xbb,0x95,0x66,0x65,0xbf,0x72,0x50,0x39,0xa4,0x1c,0x56,0x8e, +0x28,0x47,0x95,0x63,0xca,0x71,0xe5,0xa4,0x72,0x4a,0x39,0xad,0xb4,0x28,0xe7,0x95, +0xcf,0xd7,0x59,0xe7,0x1f,0x82,0x05,0xc8,0xb2,0x72,0x55,0x69,0x5b,0xee,0x50,0xee, +0x52,0xee,0x51,0x4e,0x2c,0x27,0x95,0xd3,0xca,0x43,0xca,0xc3,0x7f,0x21,0xa2,0x3c, +0xbe,0x3c,0xb5,0x9c,0x57,0x2e,0x29,0x57,0x96,0x1b,0xcb,0x1b,0xca,0xdb,0xca,0xbb, +0xcb,0x07,0xcb,0x47,0xca,0xc7,0xcb,0xa7,0xcb,0x17,0xca,0x57,0xca,0x6d,0x2b,0x9c, +0x2a,0x3c,0x2a,0x7c,0x2b,0x68,0x15,0x61,0x15,0xac,0x0a,0x4e,0x45,0x66,0x85,0xa8, +0x42,0x5e,0xa1,0xab,0x30,0x56,0x98,0x2a,0x1a,0x2a,0x9a,0x2b,0x5a,0x2a,0xda,0x2a, +0x3a,0x2a,0xba,0x2a,0xba,0x2b,0xcc,0x15,0xfd,0x15,0x83,0x15,0x43,0x15,0xc3,0x15, +0x23,0x15,0xa3,0x15,0x63,0x15,0xe3,0x15,0x93,0x15,0x53,0x15,0xd3,0x15,0x96,0x8a, +0xf9,0x8a,0x85,0x8a,0xa5,0x8a,0xe5,0x8a,0x95,0x8a,0xd5,0x0a,0x9c,0xca,0x56,0x85, +0x57,0x39,0xa9,0xdc,0x54,0x5e,0x2a,0x5f,0x15,0x4d,0x15,0xfc,0x17,0x10,0xa2,0x8a, +0x50,0xb1,0x54,0x49,0xbf,0x0a,0x6c,0x55,0xca,0xbf,0x34,0xa9,0x90,0x4c,0x95,0x40, +0x25,0xfc,0x83,0x88,0x54,0x12,0x95,0x54,0x25,0x57,0xa9,0x55,0x3a,0x95,0x51,0x65, +0x52,0xd5,0xaa,0x1a,0x54,0x4d,0xaa,0x16,0x55,0x9b,0xaa,0x43,0xd5,0xa5,0xea,0x56, +0x99,0x55,0xfd,0xaa,0x41,0xd5,0x90,0x6a,0x58,0x35,0xa2,0x1a,0x55,0x8d,0xa9,0xc6, +0x55,0x93,0xaa,0x29,0xd5,0xb4,0xca,0xa2,0x9a,0x57,0x2d,0xa8,0x96,0x54,0xcb,0xaa, +0x15,0xd5,0xaa,0x0a,0xa7,0xb6,0x55,0xe3,0xd5,0x0e,0x6a,0x27,0xb5,0x8b,0xda,0x4d, +0xed,0xa1,0xf6,0x52,0x7b,0x63,0x10,0xd5,0x14,0x75,0x88,0x9a,0xa1,0x66,0xab,0xd3, +0xd5,0x02,0xb5,0x54,0xad,0x56,0x57,0xff,0x16,0x26,0x75,0xad,0xba,0x7e,0x9d,0x75, +0xd6,0xf9,0x0b,0x69,0x50,0x37,0xa9,0x5b,0xd4,0x6d,0xea,0x0e,0x75,0x97,0xba,0x5b, +0x6d,0x56,0xf7,0xab,0x07,0xd5,0xf7,0x7e,0x87,0xfb,0xea,0x07,0xea,0x87,0xea,0x47, +0xea,0xc7,0xea,0x09,0xf5,0x13,0xf5,0x53,0xf5,0x8c,0x7a,0x4e,0xfd,0x5c,0xbd,0xa8, +0x7e,0xa1,0x7e,0xa9,0x7e,0xa5,0x06,0x1a,0x1b,0x8d,0x9d,0xc6,0x5e,0x43,0xd0,0x38, +0x6b,0x5c,0x35,0xee,0x1a,0x4f,0x8d,0xb7,0xc6,0x47,0xe3,0xa7,0x21,0x6b,0xa8,0x9a, +0x40,0x4d,0xb0,0x26,0x54,0x13,0xae,0x89,0xd4,0x30,0x35,0x71,0x9a,0x24,0x4d,0xb2, +0x26,0x45,0x93,0xa6,0xc9,0xd0,0x70,0x35,0x7c,0x8d,0x50,0x23,0xd6,0x14,0x69,0x64, +0x1a,0x85,0x46,0xa5,0xd1,0x6a,0x0c,0x9a,0x6a,0x4d,0x8d,0xa6,0x5e,0xd3,0xa8,0x69, +0xd6,0xb4,0x6a,0xda,0x35,0x9d,0x9a,0x1b,0x9a,0x5e,0x4d,0x9f,0x66,0x40,0x73,0x4f, +0x73,0x5f,0xf3,0x40,0xf3,0x50,0xf3,0x48,0xf3,0x58,0x33,0xa1,0x79,0xa2,0x79,0xaa, +0x99,0xd1,0xcc,0x69,0x9e,0x6b,0x16,0x35,0x2f,0x34,0x2f,0x35,0xaf,0x34,0xa0,0xd2, +0xa6,0xd2,0xae,0xd2,0xbe,0x92,0x50,0xe9,0x5c,0xe9,0x5a,0xe9,0x5e,0xe9,0x59,0xe9, +0x5d,0xe9,0x53,0xe9,0x57,0x49,0xae,0xa4,0x56,0x06,0x56,0x06,0x57,0x86,0x56,0x86, +0x57,0x46,0x56,0x32,0x2b,0xe3,0x2a,0x93,0x2a,0x93,0x2b,0x53,0x2a,0xd3,0x2a,0x33, +0x2a,0xb9,0x95,0xfc,0x4a,0x61,0xa5,0xb8,0xb2,0xa8,0x52,0x56,0xa9,0xa8,0x54,0x55, +0x6a,0x2b,0x0d,0x95,0xd5,0x95,0x35,0x95,0xf5,0x95,0x8d,0x95,0xcd,0x95,0xad,0x95, +0xed,0x95,0x9d,0x95,0x37,0x2a,0x7b,0x2b,0xfb,0x2a,0x07,0x2a,0xef,0x55,0xde,0xaf, +0x7c,0x50,0xf9,0xb0,0xf2,0x51,0xe5,0xe3,0xca,0x89,0xca,0x27,0x95,0x4f,0x2b,0x67, +0x2a,0xe7,0x2a,0x9f,0x57,0x2e,0x56,0xbe,0xa8,0x7c,0x59,0xf9,0xaa,0x12,0x68,0x6d, +0xb4,0x76,0x5a,0x7b,0x2d,0x41,0xeb,0xac,0x75,0xd5,0xba,0x6b,0x3d,0xb5,0xde,0x5a, +0x1f,0xad,0x9f,0x96,0xac,0xa5,0x6a,0x03,0xb5,0xc1,0xda,0x50,0x6d,0xb8,0x36,0x52, +0xcb,0xd4,0xc6,0x69,0x93,0xb4,0xc9,0xda,0x14,0x6d,0x9a,0x36,0x43,0xcb,0xd5,0xf2, +0xb5,0x42,0xad,0x58,0x5b,0xa4,0x95,0xc1,0xd7,0x5b,0x95,0x56,0xab,0x35,0x68,0xab, +0xb5,0x35,0xda,0x7a,0x6d,0xa3,0xb6,0x59,0xdb,0xaa,0x6d,0xd7,0x76,0x6a,0x6f,0x68, +0x7b,0xb5,0x7d,0xda,0x01,0xed,0x3d,0xed,0x7d,0xed,0x03,0xed,0x43,0xed,0x23,0xed, +0x63,0xed,0x84,0xf6,0x89,0xf6,0xa9,0x76,0x46,0x3b,0xa7,0x7d,0xae,0x5d,0xd4,0xbe, +0xd0,0xbe,0xd4,0xbe,0xd2,0x02,0x9d,0x8d,0xce,0x4e,0x67,0xaf,0x23,0xe8,0x9c,0x75, +0xae,0x3a,0x77,0x9d,0xa7,0xce,0x5b,0xe7,0xa3,0xf3,0xd3,0x91,0x75,0x54,0x5d,0xa0, +0x2e,0x58,0x17,0xaa,0x0b,0xd7,0x45,0xea,0x98,0xba,0x38,0x5d,0x92,0x2e,0x59,0x97, +0xa2,0x4b,0xd3,0x65,0xe8,0xb8,0x3a,0xbe,0x4e,0xa8,0x13,0xeb,0x8a,0x74,0x32,0x9d, +0x42,0xa7,0xd2,0x69,0x75,0x06,0x5d,0xb5,0xae,0x46,0x57,0xaf,0x6b,0xd4,0x35,0xeb, +0x5a,0x75,0xed,0xba,0x4e,0xdd,0x0d,0x5d,0xaf,0xae,0x4f,0x37,0xa0,0xbb,0x07,0xb9, +0xaf,0x7b,0xa0,0x7b,0xa8,0x7b,0xa4,0x7b,0xac,0x9b,0xd0,0x3d,0xd1,0x3d,0xd5,0xcd, +0xe8,0xe6,0x74,0xcf,0x75,0x8b,0xba,0x17,0xba,0x97,0xba,0x57,0x3a,0xa0,0xb7,0xd1, +0xdb,0xe9,0xed,0xf5,0x04,0xbd,0xb3,0xde,0x55,0xef,0xae,0xf7,0xd4,0x7b,0xeb,0x7d, +0xf4,0x7e,0x7a,0xb2,0x9e,0xaa,0x0f,0xd4,0x07,0xeb,0x43,0xf5,0xe1,0xfa,0x48,0x3d, +0x53,0x1f,0xa7,0x4f,0xd2,0x27,0xeb,0x53,0xf4,0x69,0xfa,0x0c,0x3d,0x57,0xcf,0xd7, +0x0b,0xf5,0x62,0x7d,0x91,0x5e,0xa6,0x57,0xe8,0x55,0x7a,0xad,0xde,0xa0,0xaf,0xd6, +0xd7,0xe8,0xeb,0xf5,0x8d,0xfa,0x66,0x7d,0xab,0xbe,0x5d,0xdf,0xa9,0xbf,0xa1,0xef, +0xd5,0xf7,0xe9,0x07,0xf4,0xf7,0xf4,0xf7,0xf5,0x0f,0xf4,0x0f,0xf5,0x8f,0xf4,0x8f, +0xf5,0x13,0xfa,0x27,0xfa,0xa7,0xfa,0x19,0xfd,0x9c,0xfe,0xb9,0x7e,0x51,0xff,0x42, +0xff,0x52,0xff,0x4a,0x0f,0xaa,0x6c,0xaa,0xec,0xaa,0xec,0xab,0x08,0x55,0xce,0x55, +0xae,0x55,0xee,0x55,0x9e,0x55,0xde,0x55,0x3e,0x55,0x7e,0x55,0xe4,0x2a,0x6a,0x55, +0x60,0x55,0x70,0x55,0x68,0x55,0x78,0x55,0x64,0x15,0xb3,0x2a,0xae,0x2a,0xa9,0x2a, +0xb9,0x2a,0xa5,0x2a,0xad,0x2a,0xa3,0x8a,0x5b,0xc5,0xaf,0x12,0x56,0x89,0xab,0x8a, +0xaa,0x64,0x55,0x8a,0x2a,0x55,0x95,0xb6,0xca,0x50,0x55,0x5d,0x55,0x53,0x55,0x5f, +0xd5,0x58,0xd5,0x5c,0xd5,0x5a,0xd5,0x5e,0xd5,0x59,0x75,0xa3,0xaa,0xb7,0xaa,0xaf, +0x6a,0xa0,0xea,0x5e,0xd5,0xfd,0xaa,0x07,0x55,0x0f,0xab,0x1e,0x55,0x3d,0xae,0x9a, +0xa8,0x7a,0x52,0xf5,0xb4,0x6a,0xa6,0x6a,0xae,0xea,0x79,0xd5,0x62,0xd5,0x8b,0xaa, +0x97,0x55,0xaf,0xaa,0x80,0xc1,0xc6,0x60,0x67,0xb0,0x37,0x10,0x0c,0xce,0x06,0x57, +0x83,0xbb,0xc1,0xd3,0xe0,0x6d,0xf0,0x31,0xf8,0x19,0xc8,0x06,0xaa,0x21,0xd0,0x10, +0x6c,0x08,0x35,0x84,0x1b,0x22,0x0d,0x4c,0x43,0x9c,0x21,0xc9,0x90,0x6c,0x48,0x31, +0xa4,0x19,0x32,0x0c,0x5c,0x03,0xdf,0x20,0x34,0x88,0x0d,0x45,0x06,0x99,0x41,0x61, +0x50,0x19,0xb4,0x06,0x83,0xa1,0xda,0x50,0x63,0xa8,0x37,0x34,0x1a,0x9a,0x0d,0xad, +0x86,0x76,0x43,0xa7,0xe1,0x86,0xa1,0xd7,0xd0,0x67,0x18,0x30,0xdc,0x33,0xdc,0x37, +0x3c,0x30,0x3c,0x34,0x3c,0x32,0x3c,0x36,0x4c,0x18,0x9e,0x18,0x9e,0x1a,0x66,0x0c, +0x73,0x86,0xe7,0x86,0x45,0xc3,0x0b,0xc3,0x4b,0xc3,0x2b,0x03,0x30,0xda,0x18,0xed, +0x8c,0xf6,0x46,0x82,0xd1,0xd9,0xe8,0x6a,0x74,0x37,0x7a,0x1a,0xbd,0x8d,0x3e,0x46, +0x3f,0x23,0xd9,0x48,0x35,0x06,0x1a,0x83,0x8d,0xa1,0xc6,0x70,0x63,0xa4,0x91,0x69, +0x8c,0x33,0x26,0x19,0x93,0x8d,0x29,0xc6,0x34,0x63,0x86,0x91,0x6b,0xe4,0x1b,0x85, +0x46,0xb1,0xb1,0xc8,0x28,0x33,0x2a,0x8c,0x2a,0xa3,0xd6,0x68,0x30,0x56,0x1b,0x6b, +0x8c,0xf5,0xc6,0x46,0x63,0xb3,0xb1,0xd5,0xd8,0x6e,0xec,0x34,0xde,0x30,0xf6,0x1a, +0xfb,0x8c,0x03,0xc6,0x7b,0x90,0xfb,0xc6,0x07,0xc6,0x87,0xc6,0x47,0xc6,0xc7,0xc6, +0x09,0xe3,0x13,0xe3,0x53,0xe3,0x8c,0x71,0xce,0xf8,0xdc,0xb8,0x68,0x7c,0x61,0x7c, +0x69,0x7c,0x65,0x04,0x17,0x6c,0x2e,0xd8,0x5d,0xb0,0xbf,0x40,0xb8,0xe0,0x7c,0xc1, +0xf5,0x82,0xfb,0x05,0xcf,0x0b,0xde,0x17,0x7c,0x2e,0xf8,0x5d,0x20,0x5f,0xa0,0x5e, +0x08,0x5c,0xe7,0x5f,0x80,0xb5,0xff,0xf7,0xac,0x27,0x96,0xec,0x36,0x02,0x90,0x8e, +0x1d,0xdb,0xc0,0xe3,0x77,0x61,0x7e,0x08,0x2b,0xe3,0x60,0x79,0x60,0xe3,0xda,0xf1, +0x01,0x98,0x53,0x60,0x9e,0x0b,0xd6,0xf2,0x70,0x58,0x49,0x7d,0xe3,0xf8,0xf5,0x79, +0xaf,0xeb,0xc3,0xd0,0x4d,0x36,0xae,0xe5,0x38,0x2c,0xdf,0x80,0xe5,0x1b,0xb1,0xdc, +0x0e,0xcb,0xb7,0xc0,0xfc,0x28,0x76,0x8f,0x08,0xec,0xbc,0x08,0xec,0xbc,0x08,0xec, +0xbc,0x08,0xac,0x3f,0x03,0x6b,0x67,0x60,0xed,0x0c,0xac,0x9d,0x81,0xb5,0xc7,0x60, +0xd7,0x8f,0xc5,0xfa,0xc5,0x62,0xfd,0x62,0xb1,0x7e,0xb1,0x6f,0xb4,0xa3,0xfe,0x6c, +0xac,0x1f,0x1b,0xeb,0xc7,0xc6,0xfa,0xb1,0xb1,0x76,0x0e,0x56,0x9f,0x8e,0xf5,0x4b, +0x7f,0xa3,0xbc,0x01,0xcb,0x37,0x62,0xf9,0x6b,0x5b,0xa2,0xf9,0x7c,0x8c,0xcd,0x27, +0x13,0x3b,0x2f,0x13,0x3b,0x2f,0x13,0x3b,0x2f,0x13,0xeb,0xcf,0xc3,0xda,0x79,0x58, +0x3b,0x0f,0x6b,0xe7,0x61,0xed,0xe7,0xb1,0xeb,0xe7,0x62,0xfd,0x72,0xb1,0x7e,0xb9, +0x58,0xbf,0xdc,0x37,0xda,0x51,0x7f,0x09,0xd6,0x4f,0x82,0xf5,0x93,0x60,0xfd,0x24, +0x58,0xbb,0x14,0xab,0x97,0xbe,0x61,0x7f,0x1b,0x6c,0xdc,0x36,0x58,0x79,0x13,0x56, +0xde,0x84,0x95,0x7d,0xb0,0xb2,0x0f,0xe6,0x27,0x1c,0x36,0x3f,0x1c,0x56,0xde,0x80, +0x95,0x37,0x60,0xe5,0xcd,0x58,0x79,0x33,0x56,0xb6,0xc7,0xca,0x28,0x0f,0xc7,0xf2, +0x0c,0x2c,0x8f,0xc0,0xee,0x9b,0x89,0xe5,0x11,0xd8,0x7d,0x33,0xb1,0x3c,0x02,0xbb, +0x4e,0x26,0x96,0x47,0x60,0xe3,0xc8,0xc4,0xf2,0x08,0xec,0x3a,0x99,0x58,0x7e,0x1c, +0x1b,0xc7,0x39,0x2c,0x3f,0x8e,0x5d,0xe7,0x1c,0x96,0x1f,0xc7,0xae,0x73,0x0e,0xcb, +0x8f,0x63,0x7e,0x3a,0x87,0xe5,0x91,0xd8,0x79,0xdc,0x37,0xe2,0x6a,0x23,0xe6,0x8f, +0x8d,0x58,0xd9,0x06,0x2b,0xdb,0x60,0xe5,0x4d,0x58,0x79,0x13,0x56,0xf6,0xc1,0xca, +0x3e,0x58,0x79,0x33,0x96,0x47,0x81,0xb5,0xfa,0x6c,0xec,0x18,0x5d,0x3f,0x1b,0xcb, +0xa3,0xb1,0xfb,0xe7,0x60,0x39,0x13,0xb3,0x2f,0x1f,0xcb,0x99,0x58,0x3d,0xff,0x8d, +0x76,0x7b,0xac,0x6c,0x8f,0x95,0x6f,0x83,0xb5,0x32,0xca,0x63,0xb0,0xf3,0xce,0x63, +0x79,0x0c,0x76,0xde,0x79,0x2c,0x8f,0xc1,0xce,0x3b,0x8f,0xe5,0x03,0x1b,0xd6,0x8e, +0x63,0xb1,0x79,0xe5,0x62,0x79,0x2c,0x36,0xaf,0x5c,0x2c,0x47,0xe5,0xad,0x58,0x19, +0xe5,0x09,0xd8,0xf5,0xf3,0xb0,0x3c,0x01,0xbb,0x7e,0x1e,0x96,0x27,0x60,0xd7,0xcf, +0xc3,0xf2,0x44,0xac,0x5f,0x3e,0x96,0x27,0x62,0xf3,0xcf,0xc7,0xf2,0x44,0xec,0xbc, +0x7c,0x2c,0x4f,0xc4,0xce,0xcb,0xc7,0xf2,0x24,0xac,0x5e,0x8c,0xe5,0x49,0x58,0xbd, +0x18,0xcb,0xd9,0x98,0x9f,0x24,0x58,0xce,0xc6,0xe6,0x21,0xc1,0x72,0x36,0x36,0x0f, +0x09,0x96,0xb3,0xb1,0xf5,0x2a,0xc1,0x72,0x36,0x36,0x2f,0x09,0x96,0xb3,0x31,0x3f, +0x4a,0xb0,0xfc,0x24,0x36,0xce,0x42,0x2c,0xe7,0x60,0xb9,0xf4,0x8d,0x32,0x5a,0x57, +0xa7,0xb0,0xf9,0x15,0x63,0xf9,0x29,0x2c,0x0e,0x8a,0xb1,0xfc,0x14,0x36,0xde,0xe2, +0x37,0xe6,0x87,0x6c,0xbb,0x1b,0xb3,0xed,0x6e,0xec,0xde,0xbb,0xb1,0x7b,0xef,0xc6, +0xd6,0xce,0xa9,0x37,0xd6,0x51,0xf1,0x1b,0x6b,0xa9,0xf8,0x8d,0x38,0x40,0xb1,0xc5, +0xc4,0xe2,0x8c,0x8f,0xe5,0x31,0x58,0x7d,0x0c,0x56,0x3e,0x8f,0xe5,0x61,0xd8,0x79, +0xe9,0x58,0xce,0xc0,0x72,0x1e,0x96,0xc7,0x62,0x79,0xee,0x1b,0xf6,0xb5,0xc7,0xc6, +0x64,0xff,0xc6,0x3e,0x69,0xf3,0xc6,0x1e,0x63,0xf3,0x46,0x3d,0xee,0x8d,0x7a,0xdc, +0x1b,0xf5,0xf6,0x6f,0xd4,0xbf,0x79,0x1d,0xf0,0x46,0x3d,0x78,0xe3,0x39,0x61,0xf3, +0xc6,0x1e,0xfb,0x7a,0x9f,0xda,0xfc,0x46,0xfd,0xeb,0xe3,0xff,0x85,0xf9,0x79,0x16, +0xcb,0x8f,0x63,0xe3,0x3c,0x87,0xe5,0xd1,0x58,0x9e,0xf3,0xc6,0xfc,0x7c,0xb0,0xf9, +0xf9,0xbc,0x51,0xb6,0x79,0xa3,0x0e,0x1d,0xdf,0xc6,0xad,0xf5,0xff,0x74,0xc3,0x5a, +0x9e,0xfd,0x86,0x1f,0x90,0x4f,0x5e,0xfb,0xe3,0xb5,0x2f,0x8e,0x63,0x7e,0x3f,0xf7, +0xc6,0xfa,0x03,0xd8,0x7a,0x03,0x6f,0x3c,0xf7,0x70,0x6f,0x3c,0x33,0x70,0xd8,0xf8, +0x71,0xd8,0xf8,0x51,0x3e,0x81,0xe5,0x2f,0xff,0x3f,0xf6,0xce,0x04,0x40,0xc7,0xe2, +0xf1,0xe3,0xcf,0xfb,0xee,0xbe,0xbb,0xd6,0x7d,0x76,0x29,0xd7,0x16,0xc2,0xae,0xbd, +0x59,0xe7,0x5a,0xd6,0x99,0x90,0x90,0x54,0xae,0x90,0x5c,0xeb,0x08,0x95,0xca,0x91, +0xd2,0x49,0x87,0x4a,0x27,0x9d,0xa4,0x72,0x25,0x54,0xce,0x0a,0x91,0x12,0x15,0x65, +0x8b,0x90,0x44,0x42,0xba,0x48,0xf5,0xff,0xcc,0x3e,0xdf,0x27,0xe3,0xf9,0xdb,0x1f, +0xaa,0x5f,0xbf,0x8e,0xf7,0x19,0x1f,0xdf,0x99,0x79,0xe6,0x99,0x67,0x66,0x9e,0x99, +0x79,0x9e,0xf7,0x99,0x79,0x66,0xad,0xfb,0x68,0x11,0x1d,0x53,0x44,0xee,0x62,0x72, +0x17,0x53,0x7f,0x58,0x44,0xfd,0x61,0x11,0xb9,0x8b,0xc9,0x5d,0x4c,0xd7,0xb7,0x88, +0xae,0x6f,0x11,0xb9,0x8b,0xc9,0x5d,0x4c,0xf9,0x2f,0xa2,0xbc,0x17,0x91,0xbb,0x98, +0xdc,0xc5,0xd4,0x9e,0x8b,0xa8,0x3d,0x17,0x91,0xbb,0x98,0xdc,0xc5,0x74,0x1d,0x8b, +0xe8,0x1a,0x16,0x91,0xbb,0x98,0xdc,0xc5,0xd4,0x9e,0x2b,0xaa,0xbe,0x57,0x54,0xfb, +0xad,0xa8,0xf6,0x5b,0x51,0xfd,0x6f,0x41,0xf5,0xbf,0x05,0xad,0xeb,0xdc,0xd5,0xea, +0xff,0xbd,0xfb,0x6a,0x25,0xeb,0x3e,0x1e,0x69,0xdd,0x03,0x23,0xad,0xfb,0x7c,0xa4, +0x75,0x8f,0xf4,0xfc,0xa3,0xe5,0x17,0x6d,0xb9,0x23,0x2d,0xbf,0x48,0xb5,0xe3,0x48, +0xb5,0xeb,0x48,0xa5,0xa7,0x67,0xd0,0xbd,0xee,0x26,0xaf,0x57,0x63,0xbf,0x16,0x46, +0x05,0xdd,0xbe,0xe0,0x6a,0x3d,0x33,0x45,0xe9,0x79,0x29,0x5a,0x9a,0x5f,0x5a,0x59, +0x1a,0x21,0x35,0x7d,0x4b,0xf7,0xa0,0xdb,0x3e,0x4d,0x59,0x0c,0x87,0x89,0x41,0xb7, +0x6e,0x98,0xeb,0x5c,0x22,0xe2,0x48,0x9b,0x59,0x10,0x74,0x8f,0xc9,0xc2,0x5e,0xdb, +0x7a,0x36,0x9b,0x2a,0xbd,0x4b,0xe1,0x4c,0xbf,0x3f,0x51,0xf6,0xfb,0xa5,0x93,0xa4, +0x8f,0x49,0x9f,0x92,0x4e,0xf3,0xe2,0xb6,0xce,0x33,0x49,0xf6,0xa7,0xa4,0xb3,0xe4, +0x3f,0xd7,0x8b,0xdf,0x3a,0xc6,0xe8,0x1b,0x76,0x1a,0x65,0xf7,0xfc,0x16,0x5b,0x61, +0x8c,0xbe,0x29,0x9d,0x0d,0xf3,0x75,0x8e,0x75,0xf2,0x5b,0xa7,0x63,0x96,0xc3,0x12, +0x78,0x19,0x96,0xc2,0x32,0x78,0x40,0xe7,0x7f,0x02,0x4a,0x45,0xba,0xe5,0x63,0xd4, +0x84,0x2f,0x11,0xe9,0x1e,0x1f,0x25,0xf7,0x19,0x72,0x9f,0xa6,0x70,0xb1,0x91,0xee, +0xf5,0x38,0x4d,0x5a,0x53,0x9a,0xaa,0xfd,0xa9,0x3a,0x2e,0x59,0xc7,0xb5,0x97,0xbb, +0x96,0xdc,0x35,0x15,0xae,0xa1,0x8e,0x1b,0x12,0xa9,0xba,0x2d,0x3d,0x45,0xfe,0x69, +0xd2,0xa2,0xd2,0x04,0xcb,0x9d,0x4f,0xee,0x7c,0x4a,0xb7,0x77,0x7e,0xa3,0x1b,0xe5, +0xff,0xa1,0xf4,0x14,0x69,0x9a,0xf4,0x54,0x69,0x0d,0xa9,0xc9,0x47,0xa4,0xd2,0x15, +0x29,0x77,0x3e,0xb9,0x8d,0x96,0x91,0xd6,0x93,0xee,0x94,0x7e,0x21,0x8d,0x93,0xb6, +0x94,0xc6,0x2a,0x9e,0x86,0xd2,0x58,0xf9,0x37,0xb4,0xf6,0x17,0x90,0xdb,0x68,0x25, +0xf9,0x37,0x91,0x56,0x95,0xb6,0x90,0xf6,0x08,0x39,0xce,0x68,0xa8,0x14,0x45,0x3b, +0x8f,0x72,0xf5,0x42,0x68,0x2a,0x35,0xee,0x76,0xd0,0xdc,0x72,0x0f,0xd1,0x7e,0xa3, +0x2b,0xa4,0xcd,0xa5,0xef,0x2b,0xdc,0x52,0xe9,0x3a,0x69,0xe5,0x18,0xc7,0xa9,0x03, +0x09,0xd2,0x64,0x69,0x29,0xe9,0x29,0xd2,0x53,0xa5,0x67,0x4a,0xcb,0x4b,0x2b,0x48, +0xab,0x4a,0xab,0x4b,0x57,0xc0,0x22,0xe9,0x06,0x98,0x02,0xaf,0xc2,0xe3,0xd2,0x19, +0xd2,0xa4,0xfc,0x84,0x87,0x9a,0xd2,0x53,0xa4,0xa7,0x4a,0xcf,0x94,0x56,0x95,0x36, +0x29,0x40,0xdd,0x2a,0xe0,0x6a,0x3d,0x69,0x07,0x28,0x0f,0x75,0xa0,0x82,0xf4,0x6e, +0xd8,0x00,0xcb,0x61,0x11,0xac,0x90,0x2e,0x97,0x7f,0xe3,0x82,0xc4,0x03,0x8b,0xe1, +0x7d,0x58,0x6e,0xe9,0x07,0xd2,0x65,0x96,0x9a,0x7d,0x8d,0x0b,0x71,0x4e,0x68,0x22, +0x35,0xee,0x0e,0xf0,0x21,0xac,0x92,0xbe,0x63,0xa9,0xe7,0xb7,0x19,0x5a,0x16,0x26, +0xaf,0xb0,0x06,0x66,0xc3,0x74,0x98,0x24,0x9d,0x02,0x05,0x8a,0x38,0x4e,0x26,0xcc, +0x83,0xf3,0xa4,0x6d,0xa4,0xed,0xa5,0x9d,0xa4,0x19,0x30,0x17,0x06,0xc2,0x20,0xe9, +0x10,0x98,0x0d,0x23,0xa5,0x03,0x65,0x9f,0x63,0xa9,0xe7,0xe7,0xe9,0xdd,0x8a,0xef, +0x61,0xe9,0x14,0xe9,0xd3,0xd2,0xe9,0xd2,0x09,0x3a,0xdf,0x39,0x45,0x1d,0x27,0x1e, +0x72,0x20,0x54,0x9a,0xb6,0x07,0xd1,0xd2,0x18,0x69,0x01,0x69,0x21,0x69,0x31,0x69, +0x2d,0x69,0x1d,0x69,0x3d,0x69,0x7d,0x69,0xa6,0xd4,0xdc,0xa3,0xcc,0x7d,0x3b,0x53, +0xcf,0x01,0xe6,0x1e,0x75,0x67,0xc0,0x7d,0x06,0x30,0xf7,0x33,0xef,0xd9,0xbf,0x85, +0x9e,0xcb,0x5a,0xea,0x39,0xcc,0xdc,0x7b,0x2a,0xd0,0xb7,0xb7,0x76,0xdc,0xfb,0xa8, +0xb9,0x17,0x9a,0xfb,0xa5,0x79,0xc6,0x34,0xf7,0xbb,0xd6,0xec,0x6b,0x03,0xc1,0xb3, +0x1c,0xa7,0x9b,0x9e,0x2d,0xcc,0x7d,0xaf,0x23,0x7e,0x9d,0xe0,0x92,0xa0,0xfb,0x7c, +0x61,0x9e,0x65,0xfa,0x99,0xf8,0x03,0xee,0x3d,0xec,0x42,0xfc,0x4f,0xe1,0x98,0x53, +0x21,0xdb,0x71,0xef,0xad,0xe6,0xfe,0x7b,0x16,0xee,0x01,0xec,0x1b,0x8a,0xfd,0x9c, +0xb3,0xdc,0xbe,0x78,0x0e,0xbc,0xa8,0xbe,0x77,0x85,0x9e,0x03,0x06,0x29,0xbc,0x09, +0xe7,0x85,0x59,0x6a,0x85,0xa9,0x4b,0x7b,0xbf,0x20,0xe8,0xfe,0xa6,0x6b,0x87,0xee, +0x73,0xdc,0xb4,0xf4,0x44,0x3b,0xa3,0x5d,0xa1,0x07,0x5c,0x01,0xbd,0xcd,0x3d,0xd3, +0xdc,0x2b,0x39,0xdf,0x23,0x68,0x3f,0x18,0x8b,0xfd,0x31,0x74,0x20,0x64,0xc3,0x20, +0x18,0x0c,0x43,0xe0,0x2a,0x18,0x0e,0xa3,0x61,0x0c,0x4c,0x27,0x4f,0xb7,0xa0,0xb7, +0xc2,0x99,0x1c,0x77,0x1b,0x7a,0x7b,0xd0,0x7d,0xc6,0x9a,0x80,0xde,0x15,0x74,0x9f, +0xc9,0xe6,0xeb,0x59,0xe1,0x1c,0x3d,0x2b,0x18,0xcd,0xd4,0x7d,0xb8,0x9b,0xd4,0xb8, +0x63,0xe5,0x8e,0x95,0x3b,0x51,0xee,0x44,0xeb,0x1d,0x44,0xc0,0xfa,0xfd,0x1e,0xd0, +0x33,0x5e,0xb4,0x9e,0xb3,0xa3,0xe5,0x8e,0x95,0x3b,0x56,0xee,0x44,0xb9,0x13,0xe5, +0xae,0x24,0x77,0x25,0xb9,0xe3,0xe4,0x8e,0xb3,0x7e,0xf3,0x3a,0xd6,0xef,0x5e,0xc7, +0xf2,0x0f,0x58,0xfe,0xde,0x3b,0x90,0x38,0xf9,0x79,0xc7,0x27,0xc8,0x9d,0x60,0x3d, +0x13,0x45,0x59,0xcf,0x45,0xc6,0xde,0x58,0xe9,0xed,0x69,0xfd,0xd6,0x8d,0xd4,0x33, +0x69,0xa4,0x9e,0xb5,0xa2,0xf5,0x6c,0x13,0x2d,0x77,0xac,0xdc,0xb1,0x72,0xe7,0x93, +0x3b,0x9f,0xdc,0x95,0xe4,0xf6,0x7e,0x2b,0xc7,0xcb,0x1d,0xaf,0x67,0xc9,0x04,0xd5, +0xa1,0x04,0xeb,0x9d,0x4c,0xc0,0x7a,0x9f,0x11,0xd0,0x33,0x78,0x40,0xcf,0xe0,0x9e, +0x3b,0x56,0xee,0x58,0xb9,0x13,0xe5,0x4e,0xd4,0x6f,0x9a,0x58,0xfd,0xd6,0x8d,0xb5, +0xdc,0x91,0x96,0x5f,0xa4,0xfc,0x13,0xe5,0xe7,0x1d,0x17,0x27,0xb7,0xd1,0x96,0x3a, +0x5f,0x3f,0x69,0x4b,0xe5,0xbb,0x9f,0xb4,0xa5,0xe2,0xea,0x27,0x3d,0x5f,0xfe,0xfd, +0xa5,0xe7,0xcb,0xbf,0xbf,0xb5,0x3f,0x51,0xee,0x44,0xb9,0xe3,0xe4,0x8e,0xb3,0x9e, +0x41,0x03,0xd6,0x33,0x68,0xc0,0xf2,0xcf,0x67,0xf9,0xe7,0x8b,0x38,0xf2,0xdb,0xdb, +0xb1,0x7e,0x7f,0x3b,0x96,0x7f,0xc0,0xf2,0x37,0xf6,0xd6,0xca,0x47,0xb6,0x73,0xc4, +0x1d,0x2d,0x77,0xb4,0x9e,0xcd,0xa3,0xf5,0x6c,0xee,0xb9,0x63,0xe5,0x8e,0xb5,0xdc, +0x91,0x96,0x5f,0xa4,0xfc,0x13,0xe5,0x97,0xa8,0x67,0xf6,0x68,0x3d,0xb3,0x47,0xcb, +0x1d,0x2b,0x77,0xac,0xf5,0x9b,0x3e,0xda,0xfa,0x5d,0x1f,0x6d,0xfd,0x76,0x8f,0xb6, +0x7e,0xbf,0xdb,0xc7,0x47,0x5b,0x71,0x44,0xeb,0xb7,0x40,0xb4,0x7e,0x0b,0x78,0xee, +0x58,0xb9,0x63,0xe5,0x4e,0x94,0x3b,0x51,0xee,0x38,0xb9,0xe3,0xf4,0x5b,0xe3,0x6c, +0xfd,0xd6,0x38,0x5b,0xee,0x04,0xb9,0x13,0xe4,0x8e,0x93,0x3b,0xce,0x7a,0x57,0x10, +0xb0,0xde,0x17,0x04,0xac,0x77,0x06,0xf9,0xac,0xf7,0x06,0xc6,0xde,0x5e,0x61,0x86, +0x4a,0xdb,0x2b,0x5d,0x43,0xa5,0x1d,0xf4,0xdb,0x6e,0x98,0xb4,0x83,0xca,0x62,0x98, +0xb4,0x83,0xda,0xc0,0x30,0x69,0x07,0xe5,0x73,0x98,0xb4,0x83,0xe2,0x19,0x26,0xbd, +0x48,0xfe,0xc3,0xa5,0x17,0xe9,0xb8,0xe1,0xd6,0xbb,0xc9,0x68,0xfd,0x46,0xf1,0xde, +0x29,0x04,0xf5,0x4e,0x21,0x28,0x77,0xac,0xdc,0xb1,0x72,0x27,0xca,0x9d,0xa8,0x76, +0xeb,0x95,0xa7,0x97,0xae,0xfc,0x8a,0x2f,0xbf,0xfa,0xd1,0x45,0xf4,0xad,0x37,0x04, +0xdc,0xf8,0x1b,0x28,0x9e,0xae,0x52,0xe3,0x8e,0x91,0x3b,0xc6,0x7a,0xc7,0x6b,0xbf, +0x1f,0xb5,0xdf,0xfd,0x3a,0x96,0xbf,0x63,0xf9,0xc7,0x58,0xfe,0x76,0x3c,0x11,0x96, +0x7f,0x84,0x75,0xfe,0xa0,0x95,0x86,0xa0,0xf5,0xce,0x32,0x60,0xbd,0xb7,0x0c,0x58, +0xfe,0x8e,0xe5,0xef,0x58,0xfe,0x31,0x96,0x7f,0x8c,0xe5,0x1f,0x61,0xf9,0xdb,0xe7, +0x8d,0xb2,0xce,0xeb,0xbd,0x9b,0x8c,0x55,0x9f,0x1b,0x2b,0x77,0x8c,0xdc,0x31,0x72, +0x47,0xc8,0x1d,0x61,0xbd,0xcb,0xb6,0xdf,0x03,0xdb,0xef,0xb8,0x1d,0xcb,0xdf,0xb1, +0xfc,0x63,0x2c,0xff,0x18,0xcb,0x3f,0xc2,0xf2,0x8f,0xb0,0xd2,0x13,0xb4,0xd2,0xe4, +0xbd,0xc3,0x8c,0x51,0x1f,0x1c,0x23,0x77,0xac,0xdc,0xb1,0xea,0x5f,0x62,0xd5,0xb7, +0x78,0xee,0x18,0xb9,0x63,0xac,0x77,0xe7,0xf6,0x7b,0x67,0xfb,0x9d,0xba,0x63,0xf9, +0x3b,0x96,0x7f,0x8c,0xe5,0x6f,0xc7,0x13,0x61,0xf9,0x47,0x58,0xe7,0x0f,0x5a,0x69, +0xf0,0xde,0xd5,0x97,0xb6,0xce,0x5b,0xda,0x3a,0x6f,0x69,0xeb,0xbc,0xa5,0xad,0xf3, +0x96,0xb6,0xce,0x5b,0xda,0x3a,0x6f,0x69,0xeb,0xbc,0xa5,0xad,0xf3,0x1a,0x7b,0xac, +0xe5,0x1f,0xab,0xf6,0x1f,0xab,0xb6,0xef,0xb9,0x63,0xe4,0x8e,0xb1,0xde,0xcb,0x05, +0xac,0x77,0x73,0x01,0xcb,0xdf,0xb1,0xfc,0x1d,0xcb,0x3f,0xc6,0xf2,0xb7,0xe3,0x89, +0xb0,0xfc,0x23,0x2c,0xff,0x58,0xcb,0x3f,0x56,0xed,0xdd,0x51,0xfb,0x74,0xe4,0x8e, +0x95,0xdb,0xdb,0x1f,0x23,0x77,0x8c,0xdc,0x11,0x72,0x47,0xe8,0xf7,0x7c,0x09,0x69, +0x49,0xcb,0xed,0x58,0x7e,0x8e,0xe5,0x1f,0xb0,0xfc,0x03,0x96,0x7f,0xa6,0xe5,0x9f, +0xa9,0xf7,0x0f,0x25,0xa4,0x25,0x2d,0xb7,0x63,0xf9,0x39,0x96,0x7f,0xc0,0xf2,0x0f, +0x58,0xfe,0x99,0x96,0x7f,0xa6,0x7e,0xf7,0x97,0x90,0x96,0xb4,0xdc,0x8e,0xe5,0xe7, +0x58,0xfe,0x01,0xcb,0xdf,0xd8,0x27,0xca,0x7f,0xa2,0xfc,0x26,0x5a,0xc7,0x4f,0xb4, +0x8e,0x9f,0x68,0x1d,0x3f,0xd1,0x3a,0x7e,0x9e,0xfc,0xe7,0xc9,0x6f,0x9e,0x75,0xfc, +0x3c,0xeb,0xf8,0x79,0xd6,0xf1,0xf3,0x8e,0x71,0x7c,0xa6,0xe5,0x9f,0xa9,0x77,0x33, +0x25,0xa4,0x25,0x2d,0xb7,0x63,0xf9,0x39,0x96,0x7f,0xc0,0xf2,0x0f,0x58,0xfe,0x99, +0x96,0x7f,0xa6,0xde,0xc1,0x94,0x90,0x96,0xb4,0xdc,0x8e,0xe5,0xe7,0x58,0xfe,0x01, +0xcb,0x3f,0x60,0xf9,0x67,0x5a,0xfe,0x99,0x7a,0x2f,0x54,0x42,0x5a,0xd2,0x72,0x3b, +0x96,0x9f,0x63,0xf9,0x07,0x2c,0xff,0x80,0xe5,0x9f,0x69,0xf9,0x67,0xea,0x1d,0x51, +0x09,0x69,0x49,0xcb,0xed,0x58,0x7e,0x8e,0xe5,0x1f,0xb0,0xfc,0xbd,0x77,0x5a,0x25, +0xa4,0x25,0x2d,0xb7,0x63,0xf9,0x39,0x96,0x7f,0xc0,0xf2,0xf7,0xde,0x4d,0x95,0x90, +0x96,0xb4,0xdc,0x8e,0xe5,0xe7,0x58,0xfe,0x01,0xcb,0xdf,0x3e,0x3e,0xd3,0xf2,0xcf, +0xd4,0xbb,0xad,0x92,0x96,0x3a,0x96,0x3d,0x60,0xd9,0x33,0xf5,0x5e,0xac,0x84,0xb4, +0xa4,0xe5,0x76,0x2c,0x3f,0xc7,0xf2,0x0f,0x58,0xfe,0x01,0xcb,0x3f,0xd3,0xf2,0xcf, +0xd4,0xfb,0xbd,0x12,0xd2,0x92,0x96,0xdb,0xb1,0xfc,0x1c,0xcb,0x3f,0x60,0xf9,0x07, +0x2c,0xff,0x4c,0xcb,0xdf,0x6b,0xf7,0x8e,0xef,0xdd,0xa0,0xe3,0x7b,0x47,0xe8,0xf8, +0xde,0x15,0x3a,0xd6,0x3b,0xc3,0xc5,0xd6,0x35,0xf5,0xca,0xd0,0xf1,0xbd,0x27,0x74, +0xac,0xf7,0x85,0x5e,0x9f,0x93,0x65,0xf5,0x39,0x59,0xbe,0xbe,0x2b,0xcb,0xd7,0x7f, +0x65,0xf9,0xfa,0xb0,0x2c,0x5f,0x3f,0x96,0xe5,0xeb,0xcb,0xb2,0x7c,0xfd,0x59,0x96, +0xd5,0x27,0x65,0x59,0x7d,0x52,0x96,0xaf,0x6f,0xcb,0xf2,0xf5,0x6f,0x59,0xbe,0x3e, +0x2e,0xcb,0xd7,0xcf,0x65,0xf9,0xfa,0xba,0x2c,0x5f,0x7f,0x97,0x65,0xf5,0x19,0x59, +0x56,0x9f,0x91,0xe5,0xeb,0x7b,0xb2,0x7c,0xfd,0x4f,0x96,0xaf,0x0f,0xca,0xf2,0xf5, +0x43,0x59,0xbe,0xbe,0x28,0xcb,0xd7,0x1f,0x65,0x59,0x7d,0x4a,0x96,0xd5,0xa7,0x64, +0xf9,0xfa,0xa6,0x2c,0x5f,0xff,0x94,0xe5,0xeb,0xa3,0xb2,0x7c,0xfd,0x54,0x96,0xaf, +0xaf,0xca,0xf2,0xf5,0x57,0x59,0x56,0xfd,0xcd,0xb2,0xea,0x6f,0x96,0xaf,0x1d,0x64, +0xf9,0xda,0x42,0x96,0xaf,0x3d,0x64,0xf9,0xda,0x44,0x96,0xaf,0x5d,0x64,0xf9,0xda, +0x46,0x96,0x55,0xbf,0xb3,0xac,0xfa,0x9d,0xe5,0x6b,0x27,0x59,0xbe,0xb6,0x92,0xe5, +0x6b,0x2f,0x59,0xbe,0x36,0x93,0xe5,0x6b,0x37,0x59,0xbe,0xb6,0xe3,0xd5,0xb3,0x28, +0x69,0xa4,0xd5,0x9e,0xbc,0x7d,0x59,0x56,0xdb,0xf2,0xec,0x99,0x96,0x7a,0x75,0x26, +0x4a,0x1a,0x29,0x75,0xac,0x71,0x80,0xbb,0x14,0xce,0x8c,0x13,0x78,0xf7,0x03,0xcf, +0x6e,0x34,0x53,0x63,0x07,0x99,0x56,0x7b,0xf5,0xea,0x44,0x96,0xd5,0x76,0x3d,0x7b, +0xa6,0xa5,0x59,0xba,0x47,0x7a,0xf7,0x4d,0xef,0x7e,0xe4,0x58,0x63,0x0e,0xf7,0x2b, +0xdc,0xe2,0xb2,0x6a,0xeb,0x65,0xd5,0xf6,0xcb,0x1e,0xb9,0xb7,0x44,0x49,0x23,0xad, +0xb1,0x03,0xc7,0x37,0x1e,0xb1,0xc0,0xba,0x17,0xe5,0xb3,0xee,0x1f,0x51,0xd2,0x48, +0xa9,0x63,0x8d,0x73,0xfc,0xac,0x73,0xfe,0x5c,0xf6,0x88,0xdb,0xeb,0x9f,0xa3,0xa4, +0x91,0xd6,0x38,0x85,0xe3,0x1b,0xc7,0x58,0xaa,0xeb,0xb7,0xd4,0xba,0x27,0x64,0x5a, +0x61,0xbc,0xfe,0x3d,0x4a,0x1a,0x29,0x75,0xac,0xb1,0x95,0x29,0x3a,0x76,0xaa,0x9e, +0xd3,0xbc,0x71,0x9a,0x2e,0xce,0x91,0xfe,0xcd,0xab,0x93,0x59,0x56,0x5f,0xe7,0xd9, +0x33,0x2d,0xcd,0xd2,0x3d,0xcb,0xb1,0xc6,0x70,0xa6,0x59,0x7d,0xb7,0xe7,0x36,0xe1, +0x5e,0xd4,0xd8,0x90,0x39,0x77,0x10,0x4b,0x44,0xb9,0x23,0xf3,0x7c,0xfe,0x13,0x45, +0x15,0x2e,0x99,0xe3,0xe2,0x9d,0x63,0x63,0xf6,0x27,0x95,0xfb,0xff,0xa4,0x1e,0x83, +0xf2,0x8e,0x8b,0x39,0x26,0x44,0x9c,0xf5,0x9d,0x23,0x78,0xfb,0xea,0x1f,0x23,0x3e, +0x13,0x3e,0x41,0x73,0x24,0xcc,0x1c,0xa2,0x54,0x48,0x83,0x1a,0x50,0x13,0xd2,0xa1, +0x2a,0x14,0xaf,0xe0,0x38,0x75,0xcd,0x98,0x1a,0x9c,0xab,0xb1,0xec,0x04,0xcd,0x45, +0xf2,0xe6,0x21,0x9d,0xcc,0xf1,0x5d,0xf5,0x5e,0x75,0x80,0xc6,0xe1,0xcc,0xfb,0xd5, +0x2b,0xf4,0x5e,0xb5,0xaf,0xde,0xad,0x9a,0x73,0x64,0x6b,0xac,0x6e,0x88,0xde,0xd7, +0x0e,0xd6,0xb1,0xd5,0x1d,0xf7,0x7d,0xa1,0x67,0x37,0xfe,0xe6,0x5d,0xe2,0x4c,0x69, +0x77,0xf9,0x0f,0xb0,0xec,0xe6,0xb9,0x7e,0x42,0xc0,0x0d,0x63,0xde,0xd3,0xf5,0xd2, +0xbb,0x62,0x8f,0xdc,0x77,0x6c,0x01,0xf7,0xb7,0x5a,0x33,0xbd,0x37,0xee,0xab,0xf7, +0xc6,0xe7,0x2b,0x2e,0xf3,0xbe,0xa7,0x8d,0xd2,0xe2,0xd1,0x56,0xef,0x97,0x2f,0xd4, +0x7b,0xe8,0xf3,0x64,0x6f,0xa9,0x71,0xea,0x69,0x7a,0x0f,0xd0,0xc2,0x39,0x32,0x06, +0x9d,0xa9,0x74,0xf6,0xd0,0x31,0x8d,0x15,0xde,0x9c,0x63,0x6d,0xc8,0x71,0xde,0x85, +0x75,0xb0,0x3e,0xe4,0x5e,0x9b,0xc6,0x3a,0xd6,0xbc,0x8f,0x58,0xa2,0xf7,0xc3,0xf7, +0xc0,0x64,0x28,0x56,0xc1,0x7d,0xdf,0xe9,0xbd,0xab,0xf6,0xe6,0xbb,0x78,0xf3,0xc4, +0x6a,0x58,0xf6,0x74,0xcb,0x9e,0x68,0x5d,0x43,0xe3,0x4e,0xd6,0xb5,0xf4,0xec,0x9e, +0x7f,0xaa,0xe5,0x9f,0x6a,0xcd,0x39,0x4b,0xd5,0x35,0xf7,0xec,0x5e,0xf8,0x34,0xd5, +0x03,0xcf,0xee,0xf9,0xd7,0xb4,0x8e,0xad,0x69,0x85,0xa9,0xa9,0xfa,0xe2,0xd9,0xbd, +0xf0,0xde,0x75,0x38,0x16,0xed,0x2d,0x9a,0x59,0xea,0xb7,0x7b,0x5c,0x64,0xd1,0xcc, +0x52,0xef,0x3a,0x37,0xd4,0x38,0x42,0x4b,0x95,0x5f,0x5e,0x0c,0xb5,0xe8,0x6d,0xa9, +0xdf,0xee,0x31,0xdc,0xa2,0xb7,0xa5,0xbd,0x55,0xb7,0xba,0xeb,0xba,0xf5,0xd3,0xb5, +0xf0,0xca,0x7e,0x02,0x0d,0xb6,0xa6,0x99,0xfb,0x20,0xbd,0x57,0xba,0x56,0xfa,0x9e, +0x74,0x9d,0x34,0xa2,0x82,0xab,0xf9,0xa4,0x05,0xa4,0xb1,0xd2,0x73,0xa4,0x55,0x2b, +0xfc,0x7f,0xe2,0x8f,0x41,0x1d,0x85,0x6f,0x28,0xcd,0x92,0x36,0x95,0x9a,0xb6,0x6c, +0xb4,0xab,0xdc,0x2d,0xa5,0x75,0xe4,0x5f,0x4f,0x7a,0xb9,0xfc,0x7b,0x48,0x07,0x49, +0x07,0x4b,0x87,0x4a,0x87,0x49,0xaf,0x91,0x5e,0x2b,0x1d,0x2d,0x1d,0x23,0xbd,0x49, +0x7a,0xb3,0xf4,0x71,0xe9,0x54,0xe9,0x34,0xe9,0x74,0xe9,0x08,0xe9,0x75,0xd2,0xbb, +0xa4,0x77,0x4b,0x67,0x4b,0xe7,0x48,0x5f,0x94,0xce,0xf5,0xca,0x93,0x8b,0x12,0x93, +0x70,0x62,0xfd,0x9c,0xdd,0x9e,0x12,0xad,0xbe,0x31,0xd1,0x39,0xd2,0x9e,0xbc,0xf9, +0x9b,0x5e,0x7b,0xf1,0xda,0x87,0xd7,0x46,0xbd,0xfa,0x9f,0xae,0x63,0x13,0xd4,0x67, +0x26,0xaa,0xdf,0xac,0x2c,0x7f,0xcf,0x9e,0x6c,0xd9,0x53,0x2c,0x7b,0xaa,0x65,0x4f, +0xb3,0xec,0x35,0x2c,0x7b,0x4d,0xcb,0x9e,0x6e,0xd9,0xbd,0x7c,0xd8,0xee,0x44,0x9f, +0x3b,0xc9,0xe7,0x4e,0xf6,0xb9,0x53,0x7c,0xee,0x54,0x9f,0x3b,0xcd,0xe7,0xae,0xe1, +0x73,0xd7,0xf4,0xb9,0xd3,0x7d,0xf9,0xf7,0xd2,0x97,0xa8,0x7b,0x65,0x92,0x34,0x59, +0x9a,0x22,0x4d,0x95,0xa6,0x49,0x6b,0x48,0x6b,0x4a,0xd3,0xa5,0x5e,0x9e,0xe3,0xad, +0xfc,0xc6,0x5b,0x79,0x8d,0xb7,0xf2,0x19,0x6f,0xe5,0x31,0xde,0xca,0x5f,0xbc,0x95, +0xb7,0x78,0x2b,0x5f,0xf1,0x56,0x9e,0xe2,0xad,0xfc,0xc4,0x5b,0x79,0x89,0x57,0xde, +0xba,0x5a,0xf9,0xec,0x66,0xd9,0xbb,0x5b,0xf6,0xcb,0x2d,0x7b,0x0f,0xcb,0xde,0xd3, +0xb2,0xf7,0xb2,0xec,0x57,0x58,0xf6,0xde,0x96,0xfd,0x4a,0xcb,0xde,0xc7,0xb2,0xf7, +0xb5,0xec,0xfd,0x2c,0x7b,0x7f,0xcb,0x3e,0xc0,0xb2,0x67,0x5b,0xf6,0x81,0x96,0x7d, +0x90,0x65,0x1f,0x6c,0xd9,0x87,0x58,0xf6,0xab,0x2c,0xfb,0x50,0xcb,0x3e,0xcc,0xb2, +0x0f,0xb7,0xec,0x57,0x5b,0xf6,0x6b,0x64,0x6f,0xe0,0x1c,0xb9,0x9f,0x36,0xb2,0xee, +0xa7,0x27,0x32,0x16,0x6c,0xdf,0xcf,0xdb,0x5a,0xe3,0xc1,0xed,0x35,0x26,0x6c,0xee, +0x13,0x1d,0x75,0x1f,0xef,0xaa,0x6b,0xd2,0xdd,0xba,0xd7,0xf6,0x54,0x59,0x5f,0x61, +0xdd,0x77,0xfd,0xcf,0x30,0x03,0x54,0x46,0x03,0x55,0x26,0x83,0xad,0xf1,0xe1,0xa1, +0xca,0xeb,0x70,0xe5,0xed,0x1a,0xd5,0x07,0x7f,0x1f,0x5d,0xcb,0x71,0xa9,0x9b,0x07, +0x1f,0x57,0x71,0xfb,0xab,0x2b,0x95,0xf6,0xae,0x71,0x8e,0xb3,0x86,0x84,0x3c,0xf6, +0x98,0x9b,0xd9,0xca,0x90,0x06,0xf5,0xa1,0x23,0x8c,0x85,0xdb,0x61,0x32,0xbc,0x6c, +0xfc,0x29,0x84,0x1e,0xd0,0x07,0x46,0xc3,0x7d,0x30,0x1d,0xb6,0xc0,0xb7,0x2a,0xa0, +0x87,0xe0,0x20,0x94,0xa2,0xa0,0xce,0x80,0x9a,0xd0,0x00,0x2e,0x81,0xde,0x30,0x1a, +0x5e,0x82,0x95,0xb0,0x0d,0x36,0x90,0x90,0xb2,0x14,0xe2,0x6e,0x0a,0x31,0x48,0x21, +0xe6,0x87,0x52,0x50,0x09,0x06,0x43,0xeb,0x4e,0x8e,0x33,0x12,0x7e,0x80,0x22,0x97, +0x38,0x4e,0x05,0xa8,0x09,0xfd,0x61,0x20,0x6c,0xba,0xd4,0x71,0x3e,0x83,0xfd,0xf0, +0x33,0x0c,0xba,0x8c,0xf2,0x81,0x1b,0xe0,0x1b,0xf8,0x19,0x0a,0x74,0xe6,0xb7,0x03, +0xb4,0x86,0xae,0x30,0x18,0x5e,0x83,0x7c,0x5c,0xa8,0x34,0x68,0x01,0xd5,0xb9,0x50, +0x29,0x70,0x33,0xdc,0x0f,0x4f,0xc2,0x02,0xd8,0x02,0x9f,0xc1,0x3e,0x2e,0x62,0x3e, +0x2e,0x62,0x65,0x28,0x47,0x99,0x75,0x83,0xab,0x61,0x0e,0xac,0x86,0xf7,0x60,0x13, +0x14,0xe1,0xa2,0x96,0x84,0x14,0xe8,0xc3,0x05,0xad,0xc2,0xc5,0x4c,0x83,0xda,0x50, +0x1f,0x9a,0x40,0x47,0xe8,0x04,0xcf,0xc1,0x8d,0x5c,0xe8,0x5b,0x20,0x87,0x8b,0xbd, +0x03,0x4e,0xe3,0x82,0x97,0x85,0xca,0x90,0x00,0xb7,0xc1,0xdd,0x30,0x94,0x4a,0x70, +0x1d,0xbc,0x00,0x8b,0xe1,0x2b,0xd8,0x44,0xa5,0xd8,0x0a,0x07,0xa0,0x16,0x15,0x63, +0x3e,0x2c,0x82,0x21,0x54,0x90,0xd5,0x70,0x10,0x06,0x8f,0xa0,0xec,0x20,0xed,0x06, +0xea,0x30,0xdc,0x0a,0x0b,0x21,0x30,0xd2,0x71,0x0a,0x42,0x71,0x48,0x86,0x1b,0xe0, +0x16,0xd8,0x36,0xca,0x71,0x76,0xc1,0x01,0x38,0x0c,0x05,0x47,0x3b,0x4e,0x69,0x28, +0x0b,0xfd,0x61,0x10,0x0c,0x87,0x96,0x37,0x91,0x3f,0xc8,0x18,0x47,0x7b,0x81,0xee, +0x70,0xfd,0x2d,0xa4,0x17,0xd6,0x81,0x73,0x2b,0xfd,0xda,0xed,0xb4,0x31,0x68,0x07, +0xc3,0xe1,0x11,0xb8,0xfc,0x0e,0xea,0x39,0xcc,0x81,0xe9,0x77,0x3a,0xce,0x2a,0x78, +0x68,0x3c,0xcf,0xdb,0x30,0x17,0xee,0x9a,0x40,0x5b,0xbc,0xcb,0x71,0x96,0xc3,0x5b, +0xf0,0x2e,0x0c,0x9b,0x48,0x1d,0x80,0x33,0xef,0xa3,0xee,0xc0,0x02,0xd8,0x09,0x6d, +0xee,0x77,0x9c,0xcb,0xa0,0x1b,0xf4,0x86,0xd5,0xb0,0x07,0x0e,0x40,0xe0,0x01,0xee, +0xf7,0xb0,0x09,0x36,0xc3,0x7d,0x93,0xf8,0x2d,0x0a,0xcf,0xc1,0xd4,0x07,0x1d,0x67, +0x23,0x6c,0x86,0x73,0x1e,0xe2,0xda,0x43,0x12,0xd4,0x81,0x8b,0xe1,0xb3,0x87,0x69, +0x77,0x8f,0x52,0x26,0xf0,0x14,0xbc,0x02,0xaf,0xc1,0x1a,0x78,0x17,0x0e,0xc2,0x4f, +0x50,0x98,0x76,0x53,0x02,0xca,0x41,0x6d,0x68,0x0e,0x17,0xc0,0x1d,0xf0,0x30,0x4c, +0x7e,0xcc,0xfd,0xed,0x54,0x3c,0xc1,0x6d,0x03,0x8d,0x20,0x0b,0x5a,0xe0,0x9e,0x04, +0x2d,0xa5,0xad,0xa4,0x6d,0xa4,0x6d,0xa5,0xed,0xa4,0x1d,0xa4,0x1d,0xa5,0x9d,0xa4, +0x97,0x4a,0x3b,0x4b,0xbb,0x4a,0x2f,0x97,0xf6,0x94,0x5e,0x21,0x1d,0x60,0xe9,0x83, +0x30,0x48,0xee,0x41,0x72,0x5f,0x25,0xf7,0x55,0x72,0x0f,0x97,0x7b,0xb8,0xdc,0xd7, +0xca,0x7d,0xad,0xdc,0x8d,0xe5,0x36,0x79,0xf4,0xd4,0xf8,0x3f,0x22,0xff,0x71,0x70, +0x2b,0x4c,0x97,0xfb,0x79,0xe9,0x0c,0xe9,0x2c,0xe9,0x1c,0xe9,0x5c,0xe9,0x3c,0xe9, +0x02,0xe9,0x2b,0xd2,0x85,0xd2,0xc5,0xd2,0xa5,0xd2,0xd7,0xa5,0xcb,0xa5,0x2b,0xa5, +0xef,0x58,0x6a,0xd2,0xb5,0x4e,0xee,0x75,0x72,0xbf,0x2f,0xf7,0xfb,0x72,0x6f,0x94, +0x7b,0xa3,0xdc,0x9b,0xe4,0xde,0x24,0xf7,0xd3,0x72,0xef,0x95,0xee,0x93,0xee,0x97, +0x7e,0x2d,0xfd,0xc9,0xca,0x97,0x49,0x8b,0x53,0x8c,0xfa,0x08,0xcf,0x42,0x10,0x9e, +0x83,0xe7,0x21,0x02,0x22,0x21,0x04,0x33,0x61,0x16,0xcc,0x86,0x39,0xf0,0x22,0xcc, +0x85,0x33,0x20,0x0a,0xa2,0x21,0x1f,0x94,0x87,0x18,0xc8,0x0f,0x05,0xa0,0x20,0x14, +0x82,0xc2,0x50,0x04,0x8a,0x42,0x31,0x28,0x0e,0x5d,0xa1,0x1b,0x74,0x87,0xcb,0xa1, +0x07,0xf4,0x84,0x5e,0x70,0x05,0xf4,0x86,0x2b,0xa1,0x0f,0xf4,0x85,0x7e,0xd0,0x1f, +0x06,0x40,0x36,0x0c,0x84,0x41,0x30,0x18,0x86,0xc0,0x55,0xd0,0x05,0x4a,0x42,0x29, +0x58,0x01,0x2b,0xe1,0x2d,0x78,0x1b,0xd6,0xc3,0x06,0xf8,0x10,0xce,0x84,0x8f,0x61, +0x33,0x9c,0x05,0x65,0xa0,0x1c,0x54,0x80,0x58,0xa8,0x04,0xe7,0x42,0x55,0xa8,0x06, +0x71,0x10,0x0f,0xd5,0x21,0x09,0xd2,0x20,0x03,0x9a,0xc0,0x79,0xb0,0x1f,0xbe,0x86, +0x0e,0x70,0x11,0x74,0x84,0x1b,0x61,0x2c,0x8c,0x83,0xbb,0xe0,0x6e,0xb8,0x17,0x1e, +0x85,0x29,0xc5,0xdc,0x7b,0x9a,0xb9,0x7f,0xc5,0xc0,0x26,0xee,0x33,0xf9,0xd1,0x38, +0x28,0x00,0x49,0x57,0xb9,0xf7,0xb8,0xd3,0x21,0x00,0xe7,0x72,0xaf,0x49,0xe8,0xe0, +0xde,0xe7,0xcc,0x73,0x83,0xb9,0x66,0xde,0x33,0x44,0xd0,0xb2,0x47,0x58,0xf6,0x90, +0x65,0x8f,0xb2,0xec,0xd1,0x96,0x3d,0xc6,0xb2,0x17,0xb0,0xec,0x05,0x2d,0x7b,0x61, +0xcb,0x5e,0xc4,0xb2,0x17,0xb5,0xec,0xc5,0x2c,0x7b,0x71,0xcb,0xee,0xe8,0x3a,0xdb, +0x69,0xed,0xea,0x4b,0x6f,0x57,0x5f,0x9a,0xbb,0xfa,0xd2,0xdd,0xd5,0x97,0xf6,0xae, +0xbe,0xf4,0x77,0xf5,0xe5,0xa1,0xab,0x2f,0x1f,0x5d,0x7d,0x79,0xe9,0xea,0xcb,0x4f, +0x57,0x5f,0x9e,0xba,0xfa,0xf2,0xd5,0xd5,0x97,0x37,0x7f,0xfc,0xfd,0x7d,0xe7,0xef, +0xad,0x7a,0x6f,0xea,0xf3,0xf4,0x63,0xec,0x2b,0xee,0x3b,0xc6,0xd4,0x03,0xcf,0x7e, +0xbb,0x65,0x8f,0xb1,0xec,0xa6,0x7e,0x78,0xf6,0x7b,0x2d,0xff,0x7e,0x6d,0xac,0xb2, +0xb4,0xfc,0xfb,0x58,0xfe,0x97,0x5a,0xfe,0xa6,0x9f,0xf7,0xec,0xe6,0x79,0xe1,0xd7, +0xf0,0xd9,0xd6,0x6f,0xb0,0xbe,0x47,0xec,0x95,0xad,0x30,0xe6,0x5e,0xe7,0xd9,0xcd, +0x33,0x91,0x67,0x37,0xcf,0x1f,0x9e,0xbd,0xca,0x15,0x56,0xfa,0xad,0x63,0xeb,0x5d, +0x7d,0xc4,0x5e,0xe8,0x42,0xeb,0x59,0x78,0xd0,0x11,0xfb,0x94,0xdb,0xad,0x34,0x5b, +0xe1,0x5f,0xbc,0xe0,0x88,0x7d,0x9b,0x95,0x97,0x11,0x56,0x3c,0x3d,0x3b,0x59,0x61, +0x86,0x1e,0xb1,0x07,0x5a,0x1d,0xb1,0xaf,0xb0,0xe2,0xbf,0xd0,0x2a,0x87,0x7e,0xd6, +0xb9,0x8a,0x59,0xe1,0xcd,0x73,0x86,0x67,0x3f,0x20,0x7b,0x2b,0x1e,0xac,0x47,0x5c, +0xe6,0x3e,0x87,0x8d,0xbf,0xd6,0x7d,0xf6,0xf6,0xde,0x99,0x25,0x59,0xbf,0xb5,0x92, +0xac,0xdf,0xda,0x49,0xfa,0x9d,0x95,0xe4,0x1c,0x79,0x0f,0x95,0x26,0xad,0x21,0xad, +0x29,0x4d,0xd7,0x31,0x09,0xd6,0xef,0xed,0x64,0x2b,0xae,0x64,0xeb,0xf7,0x7b,0xb2, +0xe2,0x73,0xd4,0x6f,0x47,0xa8,0xaf,0xf6,0xfa,0xe3,0x18,0xab,0x0f,0x3e,0x56,0xff, +0xeb,0xb5,0x4d,0xaf,0x4d,0x7a,0x6d,0xd1,0x6b,0x83,0x5e,0xdb,0xf3,0xda,0x9c,0xd7, +0xd6,0xbc,0x36,0xe6,0xb5,0x2d,0xaf,0x4d,0x79,0x6d,0xc9,0x6b,0x43,0x5e,0xdb,0x29, +0xee,0x0b,0x37,0x4f,0xe7,0xf6,0xda,0x49,0x7f,0xc5,0x39,0x44,0xda,0xff,0x18,0x7d, +0xa3,0xa9,0xf3,0xa6,0xae,0x9b,0x3a,0x6e,0xea,0xb6,0xa9,0xd3,0xa6,0x2e,0x9b,0x3a, +0x6c,0xea,0xae,0xa9,0xb3,0xa6,0xae,0x9a,0x3a,0x6a,0xea,0xa6,0xa9,0x93,0xa6,0x2e, +0x9a,0x3a,0x68,0xea,0x9e,0xa9,0x73,0xa6,0xae,0x99,0x3a,0x66,0xea,0x96,0xa9,0x53, +0x1b,0xd1,0x1a,0x57,0xb9,0xcf,0xf1,0xbd,0x79,0xae,0xab,0x42,0xbc,0xd9,0xc4,0xb9, +0x93,0xb8,0x42,0x0f,0xb8,0x75,0x61,0x12,0x7e,0xdd,0xfb,0x1c,0xdd,0x37,0xef,0xe0, +0x39,0xfe,0x00,0xe1,0x6a,0xc3,0xfd,0x9d,0xdc,0xba,0x67,0xea,0x9c,0xa9,0x6b,0xa6, +0x8e,0x99,0xba,0x75,0x66,0x47,0xf7,0xfa,0xa4,0xe9,0x3a,0xd5,0x90,0x7a,0xef,0x0f, +0xd3,0x75,0x0d,0x13,0xac,0xf7,0x29,0x29,0x56,0x5d,0xf1,0xae,0x71,0x8a,0xf5,0xae, +0x26,0x45,0xf1,0xa5,0x28,0xbe,0x14,0xc5,0x97,0xa2,0xf8,0x52,0xad,0x77,0x37,0xa6, +0x5c,0x92,0xa4,0xc9,0xd2,0x14,0x69,0xaa,0x34,0x4d,0x5a,0x43,0x5a,0x53,0x9a,0x2e, +0xf5,0xde,0x27,0x78,0xf6,0x44,0xcb,0xee,0xc5,0xdd,0x54,0xbf,0x1d,0x7b,0xe8,0x77, +0xa1,0x67,0x6f,0x6f,0xbd,0x43,0x36,0xbf,0x67,0x1f,0x27,0xa2,0x27,0xf5,0x8c,0x32, +0x15,0x9e,0xd5,0x73,0xd7,0xf3,0x7a,0xde,0x9a,0xa5,0xe7,0x91,0xb9,0x7a,0xbe,0x5a, +0xa0,0xe7,0xaa,0x85,0x7a,0x9e,0x5a,0xaa,0xe7,0xa8,0xe5,0x7a,0x66,0x59,0x05,0xab, +0xe1,0x2d,0x58,0x03,0x6f,0xeb,0x39,0x6a,0x9d,0x9e,0x97,0x36,0xea,0xb9,0xe8,0x13, +0xd8,0x0c,0x5b,0xe0,0x53,0xd8,0x0a,0xdb,0x61,0x07,0xec,0x84,0x2f,0x60,0x17,0xec, +0x86,0x2f,0x61,0x8f,0x9e,0x9f,0xf6,0xe9,0xb9,0xc9,0x3c,0x33,0x6d,0x37,0x75,0xf1, +0x42,0x37,0x0f,0xde,0xb3,0xda,0x61,0xa5,0xe3,0x71,0x1d,0x6b,0xce,0x39,0x45,0xee, +0x03,0xd6,0x33,0xda,0xe3,0xe2,0xb0,0xc2,0x3d,0xa9,0x74,0x1f,0xb0,0x9e,0x33,0x9f, +0x94,0x7b,0xa9,0xca,0x67,0x9a,0xdc,0x53,0x55,0x0e,0x33,0xac,0xf3,0x4d,0x92,0xff, +0x61,0x95,0xdf,0x61,0x95,0xe5,0x01,0x85,0x7d,0x56,0x7e,0x5b,0xb4,0xff,0x49,0xe5, +0x6f,0xba,0xf2,0xfa,0x9a,0xe2,0x99,0xae,0xbc,0xee,0xb2,0xe2,0x9a,0x24,0xbf,0x03, +0x96,0xfb,0x80,0xca,0xd0,0x7b,0x36,0xf6,0x3f,0x2b,0xaf,0xd6,0xf1,0xc6,0xfd,0x99, +0x15,0x9f,0xb7,0x7f,0xb7,0xf5,0x3c,0xec,0xf9,0xef,0xb1,0xd4,0x2b,0x83,0x2f,0x94, +0x66,0xcf,0xff,0x53,0x2b,0xcf,0xbb,0x2d,0xff,0xbd,0x56,0x1e,0xfc,0xc7,0xfa,0xdd, +0x2b,0xad,0x72,0xde,0x6d,0x3d,0xa7,0x3f,0x69,0x9d,0x7b,0x8f,0xce,0xb3,0x46,0x75, +0xf0,0xb0,0xca,0x71,0x8e,0x8e,0x59,0x25,0xfb,0x61,0xeb,0x39,0x7b,0xae,0xe2,0xf0, +0xe2,0x9d,0x6b,0x5d,0x3f,0xaf,0xec,0xe7,0xa9,0x2c,0xec,0xeb,0xfc,0x8a,0x15,0xce, +0xb3,0xaf,0xf4,0x95,0xcf,0x02,0xeb,0x77,0xc2,0x3c,0xeb,0x9a,0xef,0xb6,0xf2,0xb3, +0x4a,0xf5,0xfd,0x6d,0xab,0x2c,0xde,0x51,0x9a,0x5e,0xf7,0xd5,0x51,0xfb,0x3c,0xb6, +0xff,0xeb,0xd6,0xef,0x8f,0xc3,0xaa,0xfb,0xbb,0xad,0xdf,0x1e,0x8f,0x2b,0x2d,0x2b, +0x7d,0xfe,0x33,0x7c,0xee,0x39,0xd6,0xef,0x16,0xbb,0x1d,0xd8,0x75,0xcd,0xfb,0x0d, +0xf3,0x84,0x75,0x4d,0xbd,0xdf,0x36,0xaf,0x29,0x9f,0xcf,0x58,0xc7,0x7f,0x61,0xb5, +0xa1,0x19,0x2a,0x1f,0xaf,0xfd,0x78,0xed,0x6a,0xa1,0x65,0x5f,0xad,0x34,0x6c,0x54, +0x98,0xd7,0xad,0x7d,0x5e,0xbb,0xd8,0x68,0xe5,0x7d,0x9e,0xf5,0x3b,0xca,0xcb,0xff, +0x62,0xeb,0xfa,0x3e,0x69,0x95,0xd9,0x26,0x5f,0xf9,0x6f,0xd2,0xbe,0x4d,0x56,0xfc, +0x2b,0xad,0xdf,0x61,0x5e,0x3a,0x3d,0xbb,0xd7,0x7e,0x9e,0xb4,0xea,0x9b,0xe7,0xde, +0x2d,0xfb,0x6b,0xba,0x16,0x9f,0xc8,0x6f,0x86,0xec,0x07,0x94,0xd6,0xcf,0x65,0xdf, +0x6c,0xc5,0xe1,0xb9,0x77,0x59,0x6a,0x5f,0xcf,0xdd,0x6a,0x43,0x5e,0x7b,0xb5,0xed, +0x5e,0x3d,0xf2,0xb7,0xb1,0xed,0xbe,0x7e,0x66,0xbb,0x15,0xd7,0x0e,0xab,0x6f,0xdb, +0x65,0x5d,0xdb,0xdd,0x72,0x7f,0xe1,0xab,0x17,0xde,0x71,0x87,0xad,0x6b,0xed,0xf5, +0xb1,0x5b,0xa4,0x5e,0xd9,0xcd,0xb2,0xfa,0x1a,0xbb,0x7d,0x9b,0x7b,0xcf,0x82,0x6c, +0xf7,0x7e,0x63,0x34,0x49,0x9a,0x2c,0x4d,0x91,0xa6,0x4a,0xd3,0xa4,0x35,0xa4,0x35, +0xa5,0xe9,0x56,0x3c,0x76,0x9c,0x89,0x96,0x3d,0xc9,0xb2,0x27,0x5b,0xf6,0x14,0xcb, +0x9e,0x6a,0xd9,0xd3,0x2c,0x7b,0x0d,0xcb,0x5e,0xd3,0xb2,0xa7,0x5b,0xe9,0x4e,0xb0, +0xec,0x76,0x7e,0x92,0x2c,0x7b,0xb2,0x65,0xf7,0xce,0x7b,0x85,0xde,0xef,0x76,0xd5, +0xfb,0xda,0xae,0x7a,0x57,0xdc,0x4e,0xef,0x71,0xbb,0xea,0xbe,0x3b,0x40,0xf7,0xdc, +0x6c,0xdf,0x78,0x9c,0xa7,0x49,0x96,0x3d,0x59,0xef,0x93,0x4d,0x1c,0x83,0x79,0x96, +0x2d,0x4a,0x44,0x71,0x3d,0xdd,0x7b,0x9c,0x79,0xaf,0x69,0x9e,0x77,0x0a,0xe3,0x7e, +0xa5,0xaf,0xfb,0x0c,0x55,0xa4,0x33,0xbf,0xf3,0x5b,0xb9,0xcf,0x51,0xd9,0x3a,0x7f, +0x7f,0xe9,0xab,0x9a,0xe7,0xdc,0x4f,0xee,0x3e,0xd2,0x16,0x7a,0x9f,0xdd,0x52,0xda, +0x44,0xea,0x8d,0x77,0xf7,0x55,0x58,0xdb,0x9d,0xad,0x77,0xde,0xfd,0xa5,0xaf,0x46, +0x1c,0xd1,0x5e,0x3a,0x87,0xf7,0xdd,0x92,0x37,0xee,0x7d,0x8d,0xdc,0x9e,0xbd,0xa5, +0x65,0x6f,0x62,0xd9,0x2f,0xb4,0xec,0xaf,0x46,0x1c,0x79,0xb7,0xdd,0x57,0xe5,0xd2, +0xd7,0x7a,0xe7,0xdd,0xd3,0x7a,0xef,0xdd,0x4f,0xe1,0xfb,0x39,0x47,0xe8,0x2e,0xed, +0xe3,0x1c,0xed,0x9f,0x64,0xed,0x4b,0xb2,0xb4,0x8f,0xcf,0xcf,0xbb,0x06,0xdd,0x2d, +0xbb,0xa7,0x7d,0x7c,0x7e,0xa5,0x2a,0xb8,0xef,0xda,0x6d,0x7b,0x92,0x55,0x27,0xfa, +0x58,0xf6,0x96,0x96,0xbd,0x89,0x65,0x1f,0x64,0xd5,0x1f,0xdb,0xee,0xc5,0x77,0x2c, +0xbf,0x24,0x6b,0xde,0x42,0x7f,0xe9,0xab,0x11,0x47,0xd2,0x32,0x58,0xfb,0xdb,0x6b, +0x7f,0x7b,0xed,0x6f,0xaf,0xfd,0xed,0x95,0xb6,0xf6,0x4a,0x97,0x57,0x37,0x3b,0x28, +0x7c,0x07,0x85,0xef,0xa0,0xf0,0x1d,0x14,0xbe,0x83,0xc2,0x7b,0xee,0x69,0xfa,0xbe, +0x66,0x9a,0xe6,0xd0,0xc7,0x2b,0x7c,0xbc,0xea,0xd3,0x40,0x95,0x63,0x77,0xab,0xde, +0x37,0x54,0x3e,0xbc,0x7a,0xd2,0x50,0xed,0x23,0x5e,0xfb,0xbd,0xfa,0x78,0xb5,0xc6, +0x3c,0xba,0xaa,0x6e,0xb4,0xd6,0xf8,0x47,0x7f,0xd5,0x5f,0x8f,0x96,0x4a,0xcb,0x10, +0xe7,0xe8,0x7a,0xd3,0x5f,0x3a,0x40,0xe7,0xe9,0xab,0x31,0x90,0x7e,0x6a,0x9b,0xfd, +0xac,0x31,0xf2,0x7e,0x0a,0xd7,0x57,0xe7,0x69,0xaa,0xf2,0xb0,0xf3,0xd3,0x5a,0x78, +0xd7,0xd1,0x9b,0x2b,0x32,0x48,0xe3,0x3a,0x43,0x55,0x2e,0xdd,0x54,0x9e,0x26,0x8f, +0x5e,0xbb,0xf3,0xec,0x89,0xfa,0x3d,0x9e,0x24,0x4d,0x96,0xa6,0x48,0x53,0xa5,0x69, +0xd2,0x1a,0xd2,0x9a,0xd2,0x74,0xa9,0xd7,0x57,0x7a,0xf6,0x44,0xcb,0x9e,0x64,0xd9, +0x93,0x2d,0x7b,0x8a,0x65,0x4f,0xb5,0xec,0x69,0x96,0xbd,0x86,0x65,0xaf,0x69,0xd9, +0xd3,0xad,0x74,0x27,0x58,0x76,0x3b,0x3f,0x49,0x96,0x3d,0xd9,0xb2,0xa7,0x58,0xf6, +0x54,0xcb,0x9e,0x66,0xd9,0x6b,0x58,0xf6,0x9a,0x96,0x3d,0xdd,0x2a,0xa7,0x04,0xcb, +0xee,0x9d,0xb7,0x97,0xd5,0x3f,0x35,0x8f,0xe4,0x37,0x0d,0x0c,0x78,0xc6,0xad,0x53, +0x8d,0x35,0xee,0x56,0x31,0xc0,0xf5,0x81,0x4a,0xf8,0xd7,0x98,0x4e,0x5d,0x09,0x72, +0xed,0xd0,0x3b,0xd0,0xa6,0xfc,0x1e,0xfc,0xa6,0xa7,0x3b,0x8e,0xb0,0x12,0xfb,0xbb, +0x54,0x9a,0x24,0x7e,0x4f,0x7c,0xd6,0xd6,0x7d,0x07,0x6f,0x68,0xd3,0xd1,0xfd,0xdd, +0x7a,0x33,0x1d,0x72,0x53,0xec,0xdf,0x71,0xc2,0xde,0x5c,0xec,0xb1,0x37,0x38,0x4e, +0xfd,0x9b,0x1c,0xe7,0xe5,0x9b,0x1d,0xe7,0x87,0x71,0x8e,0x33,0x9e,0xdf,0xa8,0xc1, +0x2b,0x1d,0xa7,0x34,0x17,0xfa,0x43,0x2a,0xcf,0x27,0x54,0x8e,0xba,0x37,0x3a,0xce, +0x95,0x1c,0xbb,0x7f,0x92,0xe3,0x8c,0x26,0xde,0xab,0x88,0x37,0x92,0xca,0x5a,0x9a, +0x4a,0x13,0xc7,0xb1,0x65,0x1e,0xa5,0x2e,0xf1,0x7b,0x75,0x37,0x95,0x6f,0xcd,0x58, +0xea,0xff,0x2d,0x8e,0xf3,0x26,0x15,0x68,0xe3,0x28,0x7e,0x27,0x13,0xe7,0x2a,0xfa, +0xff,0x53,0xc9,0xe4,0x95,0xc4,0x79,0x98,0x63,0xde,0xe6,0x1c,0x37,0xd1,0xd7,0xcf, +0x23,0x63,0x9f,0x50,0x01,0x5f,0xa7,0xc1,0xac,0xe7,0x9c,0x45,0xd9,0xf7,0xf9,0x50, +0x77,0x5c,0x26,0x8a,0x78,0x2f,0x81,0xbd,0x77,0x90,0x97,0xfb,0x29,0x8f,0x87,0x1c, +0xe7,0xd0,0x23,0xdc,0x3f,0xa8,0xfc,0x37,0xd0,0xa8,0x26,0x5f,0xc7,0x39,0xc6,0x90, +0x8e,0x7b,0xdc,0x31,0x8a,0x0f,0x6e,0xe5,0x19,0xe5,0x22,0xdc,0xdc,0x47,0xba,0x8c, +0x70,0x9c,0xeb,0x89,0xa3,0x1b,0xf1,0xad,0x22,0xfc,0x32,0xca,0xe4,0xfb,0xfb,0x48, +0x0f,0xfb,0xbb,0x5d,0xe2,0x38,0x25,0x38,0xd7,0x47,0xa4,0xa5,0x08,0xe9,0xad,0x4e, +0x3c,0x35,0xae,0xa7,0x0d,0xb2,0x7f,0x1d,0x69,0xb9,0x8d,0xe3,0x72,0x48,0xd7,0x5b, +0x70,0x26,0x1d,0xf9,0x22,0xf6,0xef,0xe7,0x3c,0x57,0xb1,0x7f,0xe4,0x6d,0x3c,0xff, +0x74,0x73,0xcb,0xe7,0x67,0xce,0x97,0x4e,0x59,0x7c,0xce,0xef,0xf2,0xe2,0x5d,0x28, +0x57,0xca,0x29,0x9b,0xdf,0xf9,0xa7,0x52,0x36,0x3f,0x72,0xce,0xc5,0xe4,0x6f,0x1a, +0x69,0x29,0x44,0x98,0xb7,0xb8,0xb0,0xc3,0xb9,0xce,0x15,0x88,0xeb,0x35,0xf6,0x5f, +0x46,0x3a,0x02,0xc3,0xb8,0x3f,0x52,0xae,0xcf,0x12,0xcf,0xcb,0x7d,0xdc,0xb1,0x9f, +0x71,0x84,0xfb,0x99,0xf8,0x3f,0x1b,0x4d,0xfe,0xe8,0x68,0x7a,0x10,0xdf,0x0b,0x1c, +0xdf,0x9b,0xb4,0xbc,0x09,0xa3,0xe8,0x48,0x3e,0x27,0x6f,0x03,0xd8,0xbf,0x8e,0xe3, +0xde,0xe1,0x9a,0x7c,0x4b,0x9a,0x33,0x2f,0x74,0xdf,0x2f,0x7c,0x49,0x39,0xbf,0xc1, +0x79,0x7e,0x26,0x5f,0x55,0x28,0xa3,0xe7,0x27,0x52,0xe6,0x0f,0x3a,0xce,0xfd,0x94, +0xcf,0xdb,0x8f,0xba,0xe3,0x92,0xcb,0xa9,0x27,0xc3,0xcc,0xd8,0x1d,0xe7,0x1b,0x42, +0xf8,0x09,0x1a,0xac,0x7d,0x90,0x6b,0x10,0xcb,0x71,0xcd,0xe8,0xec,0x6e,0xa1,0x13, +0x5a,0xc5,0xf1,0xdf,0x90,0xde,0x01,0x94,0x47,0x45,0xc2,0x7e,0x45,0x5a,0x63,0xb9, +0x6e,0xcd,0x29,0xef,0x53,0x89,0xe7,0x09,0x58,0xc8,0x79,0x57,0x52,0x47,0x96,0x8d, +0x73,0xf3,0xf1,0x26,0xf1,0x7d,0x4b,0x9e,0xaf,0x25,0xed,0x2f,0x70,0x8e,0x7a,0xa4, +0xf5,0xaa,0xc1,0xee,0x6f,0xdb,0x83,0xed,0xdd,0xb2,0x7a,0x99,0x7a,0x72,0x26,0xe5, +0x35,0x1b,0xff,0xde,0x9c,0xe7,0x41,0xea,0x5f,0x63,0xce,0x91,0x72,0x37,0x75,0x92, +0x32,0x6e,0xca,0xb5,0x3e,0xed,0x01,0xae,0x03,0xe5,0xf7,0x82,0x79,0x87,0x42,0x1e, +0xe7,0xe3,0xff,0x29,0xc7,0xdc,0x44,0x3c,0x1f,0xd1,0x69,0x7d,0x45,0x3c,0xf5,0xb9, +0x8e,0x93,0x7a,0xb8,0xd7,0xe2,0x6d,0xd2,0x9c,0x49,0xbd,0x39,0x4c,0x1a,0x47,0x4c, +0x70,0xc7,0x9e,0xc6,0x91,0xcf,0x78,0x8e,0xbb,0x85,0x74,0x5e,0x4b,0xdd,0x3b,0x00, +0x0d,0xb8,0xe6,0x0f,0xd3,0x36,0x62,0x38,0x6f,0x47,0xca,0xb6,0x0f,0xd7,0xa9,0x28, +0x79,0xbc,0xec,0x01,0xf7,0xbd,0x4f,0x3c,0xe5,0x30,0x9c,0x63,0xaa,0x72,0x8e,0xd3, +0x49,0xe7,0x2e,0xc2,0x57,0x21,0xef,0xb7,0x91,0xa7,0x46,0x94,0xd3,0xa9,0x57,0xb8, +0xd7,0xf9,0x26,0xc2,0x9c,0x4b,0xbc,0x45,0xc8,0x7f,0x0f,0x53,0x9f,0x38,0xd7,0xf9, +0xc4,0x3f,0x95,0xfd,0x9f,0x71,0x0d,0xa3,0x88,0x7f,0x2b,0xf1,0x5f,0x4d,0xde,0xde, +0xa1,0x6c,0x3e,0x1d,0xe7,0x8e,0xe3,0x6d,0xe5,0xb8,0xfa,0x5c,0xff,0x97,0x49,0xc3, +0x59,0x1c,0xbb,0x96,0x74,0x3f,0x40,0xd8,0x43,0xb4,0x99,0x27,0xd8,0xd7,0xe1,0x61, +0xc7,0x79,0x8c,0xeb,0x74,0x3f,0x71,0xad,0xe6,0xdc,0x3b,0x47,0xb9,0x63,0x98,0xe5, +0xae,0x75,0x9c,0xbb,0x29,0xcb,0x25,0xd4,0xe7,0x49,0x94,0xf7,0x45,0xd4,0xc3,0x25, +0x66,0x9c,0x9a,0x7a,0x59,0x8b,0x74,0x44,0xc3,0xd3,0x94,0xfd,0x7a,0xd2,0xff,0x01, +0xe1,0xc6,0x52,0x3e,0x65,0x38,0xfe,0x45,0xd2,0x55,0x7b,0xbc,0x3b,0x36,0xd9,0xf2, +0x3e,0x77,0x5c,0x72,0x3d,0xe1,0x32,0xc8,0xeb,0x12,0xfa,0x81,0x8b,0xa9,0x87,0x43, +0x08,0xf3,0x09,0xee,0x2a,0xe4,0x6b,0x15,0x65,0x58,0x87,0x32,0xbf,0x0c,0x7a,0xc0, +0x78,0x68,0xcf,0xf5,0x58,0x34,0xc2,0x1d,0x2f,0x2d,0x4e,0x7b,0xfc,0x81,0xeb,0x5c, +0x93,0x32,0xfe,0x09,0xf6,0x52,0x6e,0x87,0xa1,0x32,0xfd,0xc2,0x8b,0xb4,0xcd,0x4f, +0xf0,0x9b,0xc7,0x79,0x5e,0xe0,0xda,0x7d,0x4e,0x19,0xb6,0x34,0xf5,0x96,0xb4,0x6d, +0x87,0x36,0xe4,0xfb,0x11,0xce,0x19,0x45,0x3d,0xb8,0x02,0x32,0x38,0xf7,0x54,0xb8, +0x5c,0xe3,0xd8,0xf7,0x72,0x7d,0xaf,0xa0,0x8c,0xef,0x84,0xaf,0xa1,0x15,0xd7,0x76, +0x2b,0xdc,0x45,0xfa,0xc6,0x52,0xae,0xc3,0xc8,0xcf,0x19,0x94,0x5b,0x05,0xea,0x68, +0x7f,0xca,0xad,0x2a,0x65,0x51,0x81,0xb2,0xbb,0x6b,0xb8,0xfb,0xcc,0xd8,0x0c,0x9a, +0x42,0x6b,0x93,0xe6,0xab,0xdd,0xf7,0x6f,0x77,0xc0,0x9d,0x90,0x41,0x19,0x8e,0x82, +0x25,0xd7,0xba,0x75,0x3a,0x86,0xf6,0xde,0x00,0x06,0x91,0xa7,0x10,0x75,0x6f,0x0f, +0xe5,0x7c,0xf5,0x68,0x97,0x0e,0xd4,0xa1,0xa2,0x94,0xd3,0x7d,0x10,0xa0,0x9c,0xd3, +0x61,0x3d,0xfd,0x47,0x3e,0xfa,0xa1,0x97,0xc6,0xbb,0x79,0xdf,0x46,0x1e,0x7f,0xa1, +0x5c,0x6a,0x93,0xf7,0xab,0x48,0xf7,0x57,0x99,0x41,0xe7,0x34,0x8e,0xad,0xc8,0x35, +0x99,0x4b,0x9e,0xaf,0x80,0x91,0x94,0x41,0x96,0x51,0x58,0x41,0xfe,0x0f,0x5d,0xe0, +0xe6,0xbf,0x1d,0x4c,0x82,0xad,0x2a,0xff,0x39,0xd0,0x88,0xb6,0x7b,0x21,0x74,0xbb, +0x98,0xb2,0xe4,0xda,0xad,0xe3,0x1a,0x7d,0x08,0xbd,0xa9,0x77,0xcf,0xc3,0x46,0xce, +0x71,0x3e,0x65,0x92,0x4f,0xe5,0xd3,0x45,0x65,0x94,0xc2,0xf5,0x7e,0x9d,0xb6,0x76, +0x26,0x6d,0xf7,0x02,0x68,0xdf,0xc3,0xbd,0x9e,0xa6,0xaf,0x2d,0x0d,0xed,0x7b,0xb9, +0xe3,0xf3,0xa6,0x7f,0x31,0x75,0x7f,0x13,0xe5,0xb7,0x5a,0x65,0x58,0x26,0xdb,0x2d, +0xc7,0x67,0xe8,0x87,0x52,0x29,0xcb,0x19,0x83,0xdc,0x3a,0x30,0x90,0x32,0x8d,0xa2, +0xee,0xd6,0x86,0xb3,0xa8,0x0f,0x65,0x87,0xba,0xf5,0x62,0x13,0x7c,0x03,0xcd,0x09, +0x9f,0x01,0x6f,0x51,0xee,0xb3,0x54,0xa6,0xd7,0x52,0x3f,0x3a,0x5d,0xe7,0x96,0x6d, +0x3d,0x95,0xe9,0x05,0xd4,0xcd,0xbd,0x70,0x35,0xf7,0x95,0x06,0x94,0xe5,0x4d,0x2a, +0xd3,0xc5,0xb7,0xba,0x75,0x68,0xf5,0xad,0x6e,0xf9,0x9a,0x7e,0x74,0xcf,0xad,0x6e, +0x39,0xdf,0x7a,0x9b,0x5b,0xce,0x35,0x29,0xe7,0x41,0x94,0xf3,0x24,0xda,0xcc,0x50, +0xfa,0x85,0x11,0xf7,0xb9,0x65,0x6e,0xea,0xe2,0xa6,0xfb,0xdd,0xb2,0x2f,0xf0,0x80, +0x5b,0xfe,0xc5,0x1f,0x72,0xef,0x6f,0xcd,0x2b,0x07,0x9d,0x46,0xf0,0x7e,0x72,0xd0, +0x79,0xa4,0x36,0x7d,0x48,0x06,0x71,0x42,0xb3,0x0b,0x82,0xce,0xda,0x4b,0x82,0xce, +0xfa,0xeb,0x83,0x4e,0x43,0xc2,0xdd,0xf9,0x98,0xfb,0xec,0xed,0xd1,0x5b,0xda,0xf7, +0x18,0x7e,0x9e,0xbf,0x37,0x0f,0xc5,0xd3,0x21,0x21,0xd2,0x15,0x72,0xb5,0x87,0xb4, +0x0f,0x5c,0x6f,0xf9,0xf7,0x83,0x0f,0xe1,0x45,0xf8,0x1a,0xe6,0xc1,0xd6,0x90,0x3b, +0x67,0xd5,0xcc,0x55,0x7d,0x0f,0x36,0x41,0x0e,0x7c,0x0c,0x3b,0x61,0x57,0xc8,0x9d, +0x03,0xfc,0x05,0xba,0x34,0xe4,0xea,0x32,0xe9,0xab,0x96,0xdf,0xab,0xf2,0x5f,0xab, +0x78,0x8d,0xce,0x97,0xbe,0xaa,0x39,0xb1,0xaf,0x6a,0x5e,0xec,0xab,0x3a,0xdf,0xab, +0x3a,0xa7,0xd1,0xf7,0xa5,0x1f,0x48,0x37,0x4a,0x3f,0x94,0x7e,0x24,0xdd,0x24,0xcd, +0x91,0x7e,0x22,0xdd,0x22,0xfd,0x54,0xba,0x4d,0xba,0x5d,0xba,0x43,0xfa,0xb9,0x74, +0xa7,0xd4,0x4b,0xfb,0x2e,0x2b,0x1d,0x0b,0x94,0xde,0xc5,0x3a,0xdf,0x62,0xc5,0xb3, +0x58,0xf9,0x31,0xe7,0x1e,0x18,0xe5,0x72,0xad,0x8f,0xeb,0x7d,0x8c,0xf4,0x71,0x8d, +0x8f,0x1b,0x7c,0x5c,0xed,0xe3,0x49,0x1f,0x4f,0xfb,0xb8,0xd1,0xc7,0x18,0x1f,0x37, +0xf9,0xb8,0xd9,0xc7,0x1d,0xe2,0x76,0x71,0xa7,0x18,0x27,0x1e,0x10,0x77,0x89,0x69, +0x3e,0x66,0xf8,0x98,0xe3,0x63,0x96,0x8f,0x97,0xc5,0x2b,0x3e,0xbc,0xb5,0x6b,0xec, +0x35,0x6c,0x6c,0x16,0xf9,0x58,0x67,0x61,0xaf,0x75,0xf3,0xbc,0x8f,0x15,0x62,0xb9, +0x58,0x29,0xbc,0xb5,0x73,0x56,0x8b,0x37,0xc4,0x9b,0x62,0xad,0x8f,0x66,0xc2,0x5e, +0x8b,0xe7,0x58,0xf6,0xf7,0xf3,0xb0,0x37,0xcd,0xc3,0xbe,0x22,0x0f,0xfb,0xf2,0x3c, +0xec,0x2b,0xf3,0xb0,0xaf,0x3d,0x01,0x7b,0xb3,0xff,0x60,0x7f,0xcb,0x87,0xb7,0xaf, +0x9a,0x65,0x8f,0xb3,0xec,0x59,0x79,0xc4,0x65,0xb4,0xb2,0x8e,0xab,0xac,0x63,0x8c, +0xc6,0x4b,0xb3,0xa4,0xcd,0xa4,0x26,0x7c,0x15,0x85,0xaf,0xa2,0xf0,0x55,0x14,0xbe, +0x8a,0xc2,0x57,0x51,0xf8,0x2a,0x0a,0x5f,0x55,0xe1,0xab,0x6a,0x7f,0x55,0xed,0xaf, +0xaa,0xfd,0xd5,0x14,0x4f,0x35,0xed,0x8f,0xb3,0xfc,0xb2,0x14,0x77,0x35,0x69,0x9c, +0xd4,0xf8,0x27,0xcb,0x3f,0x59,0xfe,0xc9,0xda,0x97,0xac,0xfd,0xa9,0xf2,0x4f,0x95, +0x3b,0x4d,0xe1,0xd3,0xe4,0x9f,0xa6,0xf0,0x69,0xda,0x5f,0x43,0xfe,0x35,0xe4,0xae, +0x29,0x4d,0xd7,0x71,0xe9,0x72,0xd7,0x92,0xbb,0x96,0xdc,0x0d,0xe4,0x6e,0xa0,0xe3, +0x1b,0x28,0xde,0x06,0xd6,0xfe,0x66,0x52,0x93,0xdf,0x4c,0x85,0xcb,0xd4,0xfe,0x4c, +0xed,0xcf,0xd4,0xfe,0x86,0xaa,0xa3,0x0d,0x15,0x6f,0x43,0x85,0x6f,0xa8,0x78,0x8d, +0x36,0x92,0x66,0x49,0x9b,0x49,0x9b,0x6b,0x5f,0x35,0x69,0x9c,0x34,0x5e,0x9a,0x25, +0x6d,0x26,0x6d,0x2e,0x3f,0xbb,0xec,0xb3,0xac,0x32,0xf6,0x68,0x66,0xd5,0xa1,0xc6, +0x0a,0xdf,0x58,0xe1,0x1b,0x2b,0x7c,0x63,0x85,0x69,0xac,0xf0,0x8d,0x15,0xbe,0x89, +0xc2,0x37,0xd1,0xfe,0x26,0xda,0xdf,0x44,0xfb,0x9b,0x5b,0xf5,0xd6,0xab,0xb3,0xf1, +0x56,0xda,0x9a,0x5b,0x75,0xd6,0x90,0x00,0xd9,0x90,0x28,0x6d,0x26,0x35,0xf3,0xa6, +0xce,0x43,0xdb,0xc8,0xde,0xd2,0xb2,0x9f,0x6f,0xd9,0x5b,0x59,0xf6,0xd6,0x96,0xbd, +0x8d,0xe2,0xf1,0xda,0x46,0xa2,0x65,0x4f,0xca,0xa3,0x2d,0x35,0x3e,0x4e,0xbb,0x4a, +0x94,0x26,0xf9,0xda,0x53,0xe3,0x3c,0xda,0x55,0xa2,0x34,0xc9,0xd7,0x9e,0x1a,0xe7, +0xd1,0xae,0x12,0xa5,0x49,0xbe,0xf6,0xd5,0xf8,0x18,0xed,0xec,0x58,0xf5,0x30,0xaf, +0x7a,0x77,0xbc,0xfa,0x95,0x57,0x3d,0xaa,0x64,0xd5,0x99,0xc6,0x4a,0x5f,0x63,0xa5, +0xcf,0xae,0x1f,0x8d,0x8f,0x51,0x4f,0x9a,0x59,0xe5,0xef,0x95,0x7d,0x92,0xaf,0x1e, +0x34,0x3e,0x46,0x7d,0x38,0x5e,0xdf,0x17,0x9f,0xc7,0xb5,0x6b,0x72,0x82,0x7d,0x5f, +0x93,0x13,0xec,0xf3,0x9a,0x58,0xd7,0xe0,0x64,0xfa,0xb4,0x93,0xed,0xcb,0xe2,0x7f, +0x43,0x9f,0xf6,0x47,0xf5,0x65,0xfe,0xbe,0xeb,0x44,0xfb,0xa8,0x13,0xe9,0x93,0x9a, +0x9c,0x40,0x5f,0x74,0x22,0x7d,0x4f,0x93,0x3c,0xfa,0x9c,0xec,0x13,0xec,0x6b,0x9a, +0x1c,0xa7,0xbe,0xf8,0xeb,0xc5,0xb1,0xae,0x7f,0x55,0xb9,0x93,0xad,0xeb,0x6b,0xdc, +0x29,0x72,0xa7,0xc8,0x7d,0xac,0x72,0xca,0x3a,0x46,0x7e,0xfc,0xe9,0xcb,0x88,0x3a, +0xd2,0xa7,0x19,0x7b,0x2b,0xcb,0xee,0xf5,0x69,0x35,0xd4,0x4e,0x6a,0xe8,0xb8,0x74, +0xb9,0xd3,0xe5,0xae,0x25,0x77,0x2d,0xb9,0x93,0xe5,0x4e,0x96,0x3b,0x45,0xee,0x14, +0xab,0xbc,0x9a,0x59,0xe5,0x56,0x4d,0xee,0x6a,0x56,0x39,0x36,0xb3,0xca,0x33,0x55, +0xee,0x54,0xb9,0xd3,0xe4,0x4e,0xb3,0xe2,0xaf,0x26,0x8d,0x93,0xc6,0xfb,0xca,0x28, +0x51,0xe9,0x49,0x54,0x3c,0x89,0x3a,0x3e,0xf1,0x5f,0x90,0xbf,0xe3,0x1d,0x6f,0xd7, +0xa9,0x26,0xd6,0x73,0x4b,0x5e,0x7d,0x49,0x5e,0xf1,0xf9,0x9f,0x77,0x4c,0x1f,0xde, +0xc2,0xd2,0x2a,0x56,0x9b,0xac,0x62,0xf5,0x65,0xc7,0xb2,0x67,0x59,0x7d,0x63,0x96, +0xd5,0x3e,0xaa,0x59,0xf6,0x38,0xcb,0x1e,0x7f,0x8c,0x3e,0xd2,0xb3,0xc7,0x59,0x75, +0x3e,0xce,0x7a,0x0e,0x49,0xb6,0xc2,0x26,0x5b,0xfd,0x6a,0xb2,0x75,0xcd,0x92,0xad, +0x78,0x8e,0x65,0xaf,0x66,0xd9,0xb3,0x7c,0xf6,0x54,0xeb,0xfc,0x7e,0x7b,0x96,0x75, +0xed,0xe2,0xf2,0xb0,0x57,0xb3,0xae,0x7f,0x96,0xef,0x9a,0xd9,0xf6,0x2c,0x9f,0x3d, +0xcd,0xaa,0x83,0x69,0x56,0x19,0xda,0xf6,0x1a,0x56,0x5e,0x8e,0x65,0xb7,0xc3,0x34, +0xb7,0xfa,0xfb,0x2c,0xab,0xcf,0xcf,0xcb,0xde,0xcc,0xba,0x0f,0x64,0x59,0xf6,0xe6, +0x96,0xbd,0x99,0x75,0x4f,0xc8,0xf2,0xd9,0x33,0xad,0xf4,0x64,0x5a,0xf1,0x34,0xb2, +0xca,0xa7,0x91,0xd5,0xbe,0x1a,0x59,0xf9,0xf5,0xee,0x0f,0xd5,0x8e,0x61,0x8f,0xb7, +0x8e,0x8d,0xf7,0xf5,0x93,0x71,0x3e,0xfb,0xb1,0xea,0x51,0x96,0x65,0x6f,0xee,0xbb, +0x3f,0xdb,0xf7,0x1b,0x7f,0x7d,0xb4,0xef,0x3b,0xde,0xbd,0xda,0xbe,0x47,0x35,0xf1, +0xdd,0x97,0xe2,0x7c,0xf6,0x66,0xd6,0xfd,0x2a,0x2b,0x0f,0x7b,0x33,0xab,0xaf,0x6f, +0x6e,0xd9,0x9b,0x59,0x69,0xcd,0xf2,0xd9,0x2b,0x5b,0x7d,0x50,0x15,0xab,0xbe,0x55, +0xb1,0xe2,0xac,0xe2,0x0b,0x13,0x6f,0xf9,0x67,0x59,0xfe,0x59,0x56,0x1f,0x97,0xe5, +0xfb,0x3d,0x66,0xfb,0x37,0xb3,0xfa,0x91,0x66,0x56,0xbb,0x68,0x6e,0xd5,0xff,0xe6, +0x56,0x1d,0xb6,0x7f,0x87,0xd8,0xcf,0x8c,0xcd,0x7d,0xf7,0x5e,0xfb,0x7e,0xdc,0xfc, +0x18,0x79,0x6d,0x6e,0xd5,0xa5,0xe6,0x56,0xd9,0x36,0xf7,0xd5,0x37,0xbb,0x8e,0xa5, +0x5b,0xe1,0x1b,0x1e,0xe3,0x77,0x8b,0xfd,0x5c,0x61,0xa7,0x33,0xcb,0x0a,0x9f,0xe5, +0xf3,0x6f,0xec,0x7b,0xa6,0x8b,0xb3,0xf2,0x51,0xcd,0x57,0xaf,0x9a,0x5b,0xcf,0x4b, +0xcd,0xad,0x67,0xcb,0xe6,0xbe,0xf8,0xed,0xb6,0x99,0xea,0xeb,0x8b,0xe2,0x7d,0x69, +0xf6,0xee,0x37,0x8d,0xf4,0xee,0x24,0xd3,0xb2,0x57,0x92,0xdd,0x7b,0x86,0xf2,0x9e, +0xe1,0xbd,0xdf,0x1f,0x76,0x3b,0xa8,0x6e,0xc5,0xe3,0x95,0x93,0x77,0x0f,0x6a,0x6a, +0xf9,0x37,0xb2,0x9e,0x35,0x9a,0x6a,0x7f,0x23,0x2b,0xad,0x8d,0xac,0x7a,0xe0,0xd9, +0x73,0xff,0x8e,0x8a,0x2f,0x2d,0xc6,0xcf,0x1f,0x9f,0xf1,0xf3,0xc7,0xe9,0xb5,0x75, +0xb3,0xcf,0xb3,0x57,0xb2,0xe2,0x49,0xd4,0x7b,0x0e,0xcf,0xaf,0x9a,0x99,0x33,0x9d, +0xe0,0x38,0xc1,0x04,0xf7,0x5b,0xbd,0xda,0xd6,0xba,0x0b,0xa7,0xe0,0x77,0x6a,0xc2, +0xb1,0xd7,0x79,0x28,0xc9,0x09,0x4a,0x40,0x67,0xc7,0xc5,0x5b,0x23,0xe1,0x5a,0xb8, +0xce,0xec,0xe7,0xb8,0x52,0x50,0x14,0x8a,0x41,0x7e,0x28,0x90,0x70,0xe4,0xdb,0xe4, +0x82,0x50,0x08,0x0a,0x43,0x11,0xf3,0x0d,0x91,0x99,0x03,0x6e,0xad,0x05,0x91,0x97, +0x7a,0xe7,0x33,0x78,0x69,0x8f,0x57,0xba,0x6b,0x59,0x6b,0x47,0x98,0xf4,0xe5,0x95, +0xa6,0x58,0x33,0x86,0x6b,0xe6,0xae,0x6b,0x9d,0x87,0x38,0xc7,0xfd,0x06,0xbc,0x9e, +0xbe,0x4b,0xbc,0xc4,0xac,0x0b,0x69,0xd6,0x86,0x85,0x0c,0xa5,0xa9,0x85,0x9e,0x09, +0x5b,0x58,0xbf,0x8f,0xbd,0xdf,0xc6,0xde,0xef,0x62,0xef,0x59,0xd2,0xfb,0x6d,0xec, +0x3d,0x4f,0x7a,0xbf,0x8f,0xbd,0x67,0x4a,0xef,0x37,0x72,0x86,0xf5,0x9b,0xf9,0x02, +0xb9,0x8d,0x96,0x8f,0x3a,0x7a,0x6d,0x6c,0x7b,0x8d,0x6c,0xff,0x5a,0xd9,0xfe,0x35, +0xb3,0xfd,0x6b,0x67,0xe7,0xa5,0x95,0x44,0x65,0x1f,0xe7,0x8a,0x2a,0x3e,0xaa,0xfa, +0xa8,0xe6,0x23,0xce,0x47,0xbc,0x8f,0xea,0x22,0x41,0x24,0x8a,0x24,0x91,0xec,0x23, +0xc5,0x47,0xaa,0x8f,0x34,0x1f,0x35,0x7c,0xd4,0xf4,0x91,0xee,0xa3,0x96,0x8f,0x06, +0x3e,0x32,0x7d,0x34,0xf4,0xd1,0xc8,0x47,0x96,0x8f,0xc6,0x3e,0x9a,0xf8,0x68,0x2a, +0x9a,0x1d,0xe3,0x37,0x78,0x73,0xab,0xdd,0xb6,0xcd,0xc3,0x7e,0x61,0x1e,0xf6,0x76, +0x79,0xd8,0x3d,0x35,0x6d,0xa3,0x82,0xe3,0xb6,0x01,0xaf,0x8e,0x9b,0xb6,0x50,0xc9, +0x6a,0xc3,0x5e,0xbb,0xa8,0xa6,0xb6,0x11,0xaf,0xb5,0x48,0x4e,0x74,0xed,0x14,0xaf, +0x1f,0xa9,0xa3,0xf6,0x54,0x4f,0xed,0x32,0xe3,0x4f,0xfc,0xee,0xb9,0x93,0xda,0xb1, +0xe9,0x53,0x2e,0x53,0x7f,0xd1,0xe5,0x4f,0xfc,0x1e,0xda,0xf4,0x39,0x23,0xd4,0xef, +0x5c,0x0f,0x63,0x29,0xd8,0x9b,0xce,0x75,0xfb,0x59,0xaf,0xef,0x33,0x7d,0xd7,0x8f, +0x9a,0x73,0x3e,0x45,0xf3,0x65,0x9f,0xd2,0xdc,0x58,0x33,0x27,0x7c,0x9b,0xe6,0x58, +0x7f,0xae,0x39,0x92,0x87,0x13,0xfe,0x7e,0xf3,0xea,0x0f,0x68,0xae,0xa7,0x99,0x23, +0xda,0xa5,0xd8,0x3f,0xeb,0xdb,0xc3,0xc7,0xc9,0xce,0x13,0xf0,0x9c,0xf5,0x77,0xd1, +0x9e,0x46,0x9f,0x32,0xf3,0xd7,0xf0,0x08,0x9e,0xe3,0xae,0x89,0x72,0x57,0x79,0x77, +0x4d,0x94,0x7b,0x60,0x32,0x7e,0xab,0x61,0x6d,0xd0,0x71,0xde,0x0d,0xba,0x7f,0xbf, +0x65,0x12,0xda,0x16,0x9e,0x30,0x6b,0xa3,0x4f,0xe7,0x78,0xf4,0x49,0x68,0x0f,0x1d, +0xcc,0xda,0xe5,0x67,0x51,0xb7,0xd1,0xcb,0x60,0x1a,0x5c,0x0e,0xdd,0xa0,0x0b,0x3c, +0x14,0x74,0xd7,0xff,0x79,0xd8,0xac,0xf1,0x0e,0x37,0xc2,0xb3,0x66,0x3d,0x74,0xf3, +0x37,0x43,0x20,0x72,0x73,0xc0,0xb9,0xf3,0x19,0xf2,0x82,0x3d,0x64,0xec,0x68,0x14, +0x6a,0xfe,0x4e,0xcc,0x50,0xf3,0x37,0x49,0x82,0x6e,0x9d,0xbe,0x06,0xcd,0x87,0xff, +0x75,0xe8,0xf5,0x30,0x12,0xa6,0xc2,0xd3,0x26,0x5e,0xd2,0xf4,0x0c,0x3a,0xce,0x84, +0xa5,0x53,0x18,0x8f,0x4e,0x81,0xc7,0xe1,0x01,0x58,0xc2,0xf9,0x97,0xc2,0x32,0xc8, +0x4f,0x1c,0x65,0x60,0x52,0xd1,0x80,0xf3,0x32,0x3c,0x24,0x7d,0x4a,0x9a,0x58,0x2c, +0xe0,0x54,0x82,0x24,0x69,0x93,0x12,0x01,0xa7,0x5e,0x09,0x57,0x3b,0xc0,0x82,0x92, +0x84,0x2b,0xe9,0xea,0x4c,0xe9,0x42,0x98,0x5f,0x2a,0xe0,0xcc,0x80,0x05,0xd2,0xd4, +0xd3,0x03,0x4e,0x02,0x74,0x78,0x37,0xe0,0xf4,0x80,0x8b,0x7c,0xda,0xdf,0xb2,0x0f, +0xb0,0xec,0xd9,0x96,0x7d,0xa0,0x65,0x1f,0x04,0x0b,0x64,0x7f,0x59,0xba,0xc0,0x8a, +0xeb,0x65,0xcb,0xbe,0xc0,0x8a,0xf7,0x65,0xcb,0xfe,0x4f,0x5b,0xd3,0xe1,0xaf,0x90, +0x9f,0x7f,0x52,0x5e,0xfe,0xe8,0x6b,0xe3,0xe5,0xa5,0x89,0x95,0x76,0x7f,0x9a,0x4f, +0x36,0xbd,0x3d,0x8f,0x93,0xce,0x7f,0x7b,0x99,0x67,0x1e,0x23,0x2f,0xc7,0xcb,0xc3, +0x7f,0x4a,0xff,0xff,0x3a,0xed,0xc7,0xba,0x06,0xad,0xfe,0x62,0x69,0x0e,0xf7,0xa7, +0xe1,0xfc,0x84,0xf3,0x13,0xce,0xcf,0x3f,0x2d,0x3f,0x89,0x3c,0x2f,0xd7,0x08,0xba, +0xeb,0xf0,0xde,0xad,0xb5,0x31,0xef,0xd5,0x7a,0xb9,0xf7,0x69,0x7d,0xdc,0x07,0xb4, +0x66,0xed,0x83,0xf0,0x10,0x3c,0x0c,0x8f,0xc0,0xa3,0x5a,0xe7,0x75,0xb2,0xd6,0x91, +0x7d,0x40,0x7f,0xfb,0xee,0x49,0xad,0x2f,0xfb,0x34,0x3c,0x63,0xd6,0x18,0xd4,0xba, +0xaf,0xd1,0x15,0xdc,0xb5,0x81,0xed,0xbf,0xe5,0x64,0xd6,0xe2,0x7e,0x49,0x6b,0xf6, +0xce,0xd7,0xfa,0xb9,0xe6,0x6f,0xea,0xbd,0xa2,0xbf,0xe7,0xbc,0x10,0x16,0x69,0x0d, +0xee,0x25,0xd6,0xdf,0xda,0x7b,0x0d,0x5e,0xd7,0x5a,0xb7,0xde,0xdf,0x7a,0x5a,0xa9, +0xb5,0x68,0x83,0x15,0xdc,0x78,0xe7,0x2b,0xae,0xe5,0x3a,0x6e,0x49,0x44,0x38,0x9f, +0xe1,0x7c,0x86,0xf3,0xf9,0x57,0xce,0x67,0x0e,0x7c,0x1c,0x71,0xe2,0xef,0xf9,0xfe, +0xf2,0xe1,0x22,0x09,0x07,0x49,0x91,0xee,0xdf,0xee,0x4c,0x89,0x74,0xff,0xa6,0xa6, +0xf9,0xbb,0x99,0xe6,0x6f,0x65,0x9a,0xbf,0x87,0x69,0xfe,0x86,0x67,0x6d,0xa8,0x13, +0xe9,0xfe,0x3d,0xcc,0xfa,0x90,0x01,0x0d,0x20,0x33,0xd2,0xfd,0x9b,0x96,0x8d,0x20, +0x0b,0x1a,0x47,0xba,0x7f,0xd3,0xb2,0x69,0xa4,0xfb,0xb7,0x2c,0xcd,0xdf,0xc7,0x3c, +0x1f,0x6e,0x79,0xda,0xfd,0xdb,0x9c,0xe6,0xef,0x82,0x5e,0x14,0xe9,0xfe,0x1d,0xcd, +0x19,0xf0,0x4e,0xe4,0xc9,0xa5,0xc1,0x3b,0x7f,0x83,0xff,0x70,0xde,0xe6,0x3a,0xf7, +0x5d,0x3a,0x5f,0x3b,0xe8,0x0c,0xd3,0xa1,0x0d,0xe9,0x98,0x15,0x79,0xe4,0xbd,0x7e, +0x35,0xbd,0x73,0x6f,0xaa,0x77,0xec,0x71,0xd6,0x1c,0x8f,0x86,0xbe,0x39,0x32,0xc9, +0x7a,0x2f,0xde,0x40,0xef,0xd7,0x33,0xad,0xb9,0x13,0xde,0xfb,0xff,0x78,0xbd,0xbb, +0x4f,0xd3,0x3b,0x75,0xf3,0xde,0xbc,0xbf,0xe6,0x35,0x4f,0x81,0x01,0xd6,0x79,0x9b, +0xf8,0xc6,0xea,0x8e,0x77,0x2e,0xff,0x79,0xd2,0xac,0x39,0x55,0xf6,0x38,0xa8,0x7d, +0xbc,0x7d,0xac,0x7d,0xcc,0xcb,0x79,0xa4,0xa5,0x86,0x6f,0xec,0xf0,0x64,0xd2,0x62, +0xe7,0x77,0x4a,0xd4,0xff,0x2f,0xe3,0x26,0x79,0x94,0xf3,0x1f,0x51,0xc6,0xc7,0xbb, +0x96,0x7f,0xc4,0x39,0xbc,0xf5,0x5c,0x13,0xf4,0xde,0x3f,0x51,0x9a,0x24,0x4d,0x96, +0xa6,0x48,0x53,0xa5,0x69,0xd2,0x1a,0xd2,0x9a,0xd2,0x74,0x69,0x65,0x3d,0xb7,0x79, +0xeb,0x2a,0x65,0x5a,0xf6,0x86,0x96,0xbd,0x91,0x65,0xcf,0xb2,0xec,0x8d,0x2d,0x7b, +0x13,0xcb,0xde,0xd4,0xb2,0x37,0xb3,0xec,0xcd,0x2d,0x7b,0x0b,0xcb,0x7e,0x9e,0x65, +0x6f,0x69,0xd9,0xcf,0xb7,0xec,0xad,0x2c,0x7b,0x6b,0xcb,0xde,0xc6,0xb2,0x5f,0x60, +0xd9,0xdb,0x5a,0xf6,0x0b,0x2d,0x7b,0x3b,0xcb,0xde,0xde,0xb2,0x77,0xb0,0xec,0x17, +0x59,0xf6,0x8e,0x96,0xfd,0x62,0xd9,0xcd,0x58,0xa5,0x89,0xdf,0x8c,0x57,0x36,0xd4, +0x79,0xbd,0xe7,0xde,0x0e,0x0a,0xf7,0x67,0x3d,0x0f,0x37,0xf5,0x7d,0xd7,0xdd,0x56, +0xe7,0x6b,0x2b,0xbc,0xef,0x98,0xbd,0x63,0x1b,0x2a,0xac,0xa7,0xde,0x1a,0xe5,0x17, +0xc8,0x6e,0xd2,0x64,0xd6,0x6c,0x6c,0xa1,0xb1,0x0a,0x6f,0xbc,0xc2,0xac,0x7b,0xda, +0xa1,0x93,0xe3,0xbc,0xd5,0xf6,0xc8,0x9a,0x28,0x66,0x4d,0xa8,0x33,0x48,0xc8,0xb6, +0x5b,0xdc,0x35,0xf1,0x9e,0xc4,0x5d,0x8e,0x87,0xf1,0xf2,0x03,0xdd,0x6f,0x0e,0x5b, +0x12,0xe9,0xed,0x9d,0x1d,0xe7,0x0e,0x32,0x33,0x13,0xf7,0x59,0xe6,0x1b,0xcc,0xeb, +0xdc,0x35,0x4b,0xa7,0xdd,0xee,0x38,0xfb,0xc8,0x48,0x3a,0x99,0x2b,0xc9,0xc3,0xf9, +0x44,0xe2,0x6f,0xd7,0xdd,0x2d,0x04,0xb3,0xce,0x54,0xf3,0x09,0xee,0xda,0x4e,0x66, +0x9d,0x27,0xb3,0xbe,0x53,0x74,0x77,0x77,0x2d,0xd0,0xb6,0x84,0x1b,0xc5,0x43,0xfa, +0x35,0x3c,0xa4,0xe7,0xe3,0xd8,0x91,0xfd,0xdd,0x75,0xa5,0x72,0xd7,0x56,0x22,0xde, +0x41,0x9c,0xe3,0x25,0x0a,0xab,0xe5,0x5d,0xee,0x75,0xaa,0xd6,0xcb,0xbd,0x4e,0xc6, +0x6e,0xe2,0xf5,0xec,0xb7,0x5b,0xf6,0x5b,0x3a,0x1d,0xb1,0x9b,0x75,0x1e,0x3c,0xbb, +0x39,0x97,0x67,0xdf,0x30,0xf4,0x88,0xfd,0xe3,0x0b,0x8e,0xd8,0x3b,0xf4,0x70,0xed, +0xf7,0x93,0xcf,0xbd,0x6d,0x4f,0xfc,0xfe,0x57,0x97,0xf3,0xd7,0x34,0xeb,0x66,0x41, +0x85,0x40,0xd0,0xe9,0xd2,0xca,0xfd,0x1e,0xf0,0x15,0x08,0x72,0xc1,0xae,0x81,0x49, +0xad,0xdd,0xef,0x03,0xdf,0x81,0x47,0x53,0x4c,0x5f,0x10,0xcc,0xfd,0x56,0xf0,0x42, +0xb8,0x1c,0x86,0x99,0x6f,0x6f,0x43,0x41,0x67,0x01,0xfb,0x7a,0xb5,0x71,0xcb,0xb9, +0x05,0xee,0xfb,0xd1,0x27,0xcd,0xb7,0xb9,0xc4,0xfd,0x5c,0x1b,0xf7,0x5b,0xbb,0xcd, +0x77,0x05,0x73,0xd7,0xdd,0x8d,0x20,0xed,0x9b,0x09,0x5f,0x1b,0x6d,0x7c,0x81,0x5b, +0x5e,0xc3,0x4c,0x7e,0x52,0xdd,0xef,0xef,0xbc,0xef,0x10,0xcd,0x77,0x78,0x21,0xf2, +0x13,0xd5,0xd6,0xfd,0x56,0xb7,0x59,0x5b,0xf7,0xdb,0xc4,0x8b,0x61,0x30,0x5c,0x07, +0x37,0x58,0x54,0xcb,0x1f,0x74,0xb2,0x29,0xbb,0x55,0xd8,0x37,0x43,0xf7,0x02,0x41, +0x67,0x37,0xba,0xdf,0xc4,0xc1,0x75,0x7a,0x14,0x6a,0x42,0x53,0xb8,0xc2,0xac,0xdf, +0x04,0xdf,0x41,0x51,0xae,0x55,0x5b,0xe8,0x0e,0x37,0x0a,0xf3,0xdd,0xdf,0x74,0x98, +0x03,0xcb,0xe0,0x94,0x0e,0xee,0xf7,0x90,0xa7,0xa2,0x6d,0xd0,0x21,0xed,0xdd,0x6f, +0x39,0xbf,0xa2,0xfe,0xbc,0x8d,0xdf,0x37,0x50,0x08,0xfb,0x6d,0x68,0x12,0x9a,0x08, +0xcf,0xc1,0xf6,0x92,0x41,0xe7,0x6b,0xf4,0x7b,0x88,0xea,0xe8,0xd6,0xd5,0x0a,0xe6, +0xfb,0x41,0x98,0x7a,0x4a,0xd0,0xd9,0x05,0x5f,0x62,0x2f,0x4d,0x43,0xaa,0x04,0x1b, +0xb1,0xf7,0x44,0xbf,0xe2,0x62,0x1d,0x86,0x7c,0xd4,0x8b,0x7a,0x62,0xe5,0xe9,0x41, +0xe7,0x35,0x74,0x63,0x27,0xf7,0xfb,0xdc,0x03,0x70,0x5a,0xe9,0xa0,0xf3,0x0b,0x1a, +0x75,0x09,0x79,0xe8,0xec,0xae,0x37,0x3c,0x8a,0x8b,0xdc,0x45,0xdf,0x6a,0x2e,0x81, +0x3b,0x60,0xfb,0x59,0x41,0xa7,0x21,0x75,0x79,0x07,0xda,0x1f,0xed,0x03,0x23,0xe0, +0x53,0xd8,0x0a,0xd5,0xa9,0x14,0x3f,0xa1,0x95,0x2f,0xa3,0x5e,0x98,0xef,0x19,0xa1, +0x1b,0x7e,0x63,0xca,0x07,0x9d,0x11,0xe8,0x4c,0xdc,0x73,0xe0,0xa5,0xcb,0xdc,0x6f, +0xc4,0xef,0x7e,0x22,0x98,0xbb,0x56,0x71,0x62,0x6c,0x30,0x97,0xc0,0x68,0xce,0xdd, +0xd9,0x65,0x05,0xe1,0xe7,0x27,0x05,0x9d,0x8f,0xba,0x06,0x9d,0x6e,0xb8,0xfb,0xc0, +0x36,0xfc,0x1e,0x44,0xd7,0xc0,0x06,0x38,0x08,0xa3,0xba,0x50,0x9f,0xa8,0x88,0x67, +0xa6,0xbb,0xdf,0x94,0xbe,0x57,0x31,0xe8,0xac,0x40,0x9b,0xf2,0x03,0xfb,0xbc,0xae, +0xee,0x77,0x94,0x46,0xaf,0xd1,0xb7,0x94,0xb3,0xe1,0x49,0x98,0x01,0x9f,0xe8,0xbb, +0x4a,0xf3,0x6d,0xbc,0x59,0xaf,0xa4,0x34,0x5c,0x0a,0xb3,0xe0,0x3d,0x68,0x4d,0x5b, +0x2d,0x58,0x35,0xe8,0xd4,0x45,0x0f,0xe3,0xbe,0x02,0x1d,0x03,0xdb,0x61,0x3f,0xfe, +0x15,0xf8,0xe1,0xfe,0x06,0xf6,0x69,0x10,0x5f,0x8b,0xfc,0xe2,0xbe,0x1e,0x1e,0x81, +0x61,0xd0,0xb7,0x96,0xfb,0x5d,0x6b,0xdf,0x1e,0x66,0x6e,0x4a,0xd0,0xd9,0x86,0xfe, +0x40,0xbf,0xd2,0x0c,0x4e,0xaf,0xed,0x7e,0xeb,0x9a,0x0f,0xdd,0x4e,0xb8,0xbb,0xa9, +0xd3,0x13,0xdb,0xb8,0x2f,0x00,0x1e,0xc6,0xff,0xf9,0x91,0x3c,0xef,0x35,0x3c,0xf2, +0x6d,0x67,0x79,0xb8,0x0c,0xda,0xc2,0x6b,0xc9,0x41,0xa7,0x19,0xc7,0x1d,0xc2,0x3e, +0x16,0x2e,0xb8,0xc2,0xfd,0x66,0xb6,0x5f,0x4a,0xd0,0xb9,0x13,0x2d,0x0b,0x25,0x7b, +0x3b,0xb9,0xdf,0x45,0x66,0xa2,0x4f,0xc0,0x2e,0x98,0x7a,0x25,0xf6,0xb4,0xa0,0xb3, +0x09,0x3d,0xad,0x0e,0x71,0xf6,0xe1,0xf7,0x41,0xcd,0xa0,0x73,0x21,0x7a,0x3e,0xee, +0x41,0x66,0x5d,0x6c,0x7d,0x3f,0xfa,0x0a,0xdc,0x51,0x2b,0xe8,0x14,0xe0,0x5a,0x1f, +0x42,0xcf,0xef,0xcb,0xef,0x81,0x3a,0x41,0x67,0x31,0xba,0x06,0x7a,0xc1,0x29,0xfd, +0xa8,0x53,0xfd,0xdc,0x6f,0x75,0xcd,0xf7,0xa6,0xbd,0x61,0x38,0x8c,0x85,0x32,0x75, +0x83,0x4e,0x0a,0x5a,0x9d,0x7e,0xad,0x3f,0x24,0xd7,0x75,0xbf,0x45,0x5d,0x01,0xef, +0xd6,0x0b,0x3a,0x07,0xd9,0xd7,0x9f,0xfe,0xf2,0xb2,0xfa,0xa4,0x19,0x96,0x63,0x4f, +0xcf,0x76,0xbf,0x53,0x2d,0x0d,0xf7,0x11,0xbe,0x39,0x7a,0x1d,0x0c,0x83,0xe7,0xe1, +0x1c,0xfa,0x84,0x2c,0xfa,0xe4,0xee,0x99,0x41,0xe7,0x61,0x74,0x7a,0xc3,0xa0,0x53, +0x79,0x90,0xfb,0x3d,0x6b,0x6b,0xc8,0xd7,0x38,0xe8,0x8c,0x44,0x27,0x1a,0xbf,0x26, +0x41,0xa7,0x64,0xd3,0xa0,0x73,0xcd,0x60,0xda,0x13,0x3c,0x57,0x8f,0xdf,0x44,0xe8, +0xfc,0x7a,0x2e,0x4d,0x86,0x38,0xce,0x25,0x43,0xdc,0xef,0x5f,0xc7,0x9a,0xef,0xdf, +0xa1,0x74,0x7d,0xc7,0x39,0x9b,0xbe,0x37,0xed,0xbc,0xa0,0x53,0xcf,0xac,0x41,0x8d, +0x9a,0x6f,0xfc,0x1f,0xa3,0xfe,0x16,0xa5,0xdf,0x9c,0xd2,0x2a,0xe8,0xcc,0x87,0x46, +0xad,0x83,0xce,0x61,0xc2,0xe6,0xcb,0x70,0xbf,0x91,0x3d,0x80,0xfb,0x6b,0x38,0xbd, +0x4d,0xd0,0x49,0x86,0x32,0xc3,0xb8,0x06,0xc2,0x7c,0x3f,0x6b,0xbe,0x4b,0xbd,0x0d, +0x6d,0x8c,0xde,0x97,0x61,0xbe,0x05,0xa7,0x3c,0x87,0xbb,0x6b,0x1b,0x98,0xef,0x6a, +0xb7,0xe1,0x57,0xb1,0x7d,0x30,0xf7,0x3b,0xe6,0x07,0xd1,0x37,0xc0,0x7c,0x8b,0xbd, +0x1b,0xaa,0x37,0x70,0xbf,0x67,0x6e,0x0e,0xad,0x60,0x44,0xc7,0xa0,0xf3,0xcc,0xc5, +0x2e,0x5f,0xe1,0x0e,0x72,0x73,0x9e,0xde,0x89,0xf2,0xbb,0x96,0x3e,0x0f,0x2a,0xe1, +0x1e,0x79,0x49,0xd0,0x59,0x37,0x82,0xdf,0x85,0xd8,0x77,0xa2,0xdb,0x34,0x49,0xe0, +0xa6,0xce,0x41,0xa7,0x3b,0x1a,0xa0,0x5e,0xad,0x40,0x83,0xd7,0x73,0x3f,0x87,0x14, +0xdc,0x95,0xbb,0x05,0x9d,0x26,0xd0,0x11,0xfb,0x87,0xe8,0x35,0x37,0x70,0x6d,0xbb, +0x07,0x9d,0x89,0xe8,0x21,0x7d,0xe3,0xfb,0xd1,0xe5,0x41,0x27,0xb6,0x07,0x7d,0x3c, +0xf6,0xa9,0x68,0x36,0xda,0x99,0xba,0xf8,0x3e,0xc7,0xcc,0xc6,0x1e,0x31,0xca,0x71, +0x0a,0x70,0xf3,0xad,0x87,0xce,0xa5,0xff,0x79,0xa6,0x57,0xd0,0x99,0x0b,0xf7,0x10, +0xe6,0xe1,0x64,0xb7,0x7d,0x47,0xc2,0xa3,0xe3,0x69,0xcf,0x84,0xbb,0x0b,0xfb,0x6d, +0xf0,0x08,0xcc,0xa1,0x1f,0x9c,0x65,0x14,0x16,0xc2,0x0e,0xa8,0xd3,0x27,0x98,0xbb, +0x36,0xc2,0x59,0x63,0xb8,0xe6,0xf0,0x3c,0xc4,0xc2,0x42,0xf8,0x7c,0x8c,0xfb,0xed, +0x76,0x5b,0x74,0x15,0xbc,0x05,0x39,0x90,0xd6,0x37,0xe8,0xf4,0xe9,0x47,0x9a,0xd0, +0xaa,0x3c,0xac,0xec,0x27,0xcc,0x01,0x38,0x65,0x2c,0xe1,0x06,0x07,0x9d,0xcb,0xd1, +0x6a,0x03,0x82,0xce,0xa5,0xec,0xeb,0x0a,0xb3,0xb0,0xaf,0xcb,0xe6,0x18,0xec,0xad, +0xb5,0x06,0x45,0x2f,0xe8,0x0d,0xd3,0x60,0x1c,0x14,0xbe,0x99,0xfe,0xed,0x26,0xf7, +0xdb,0xe6,0xca,0xd0,0x07,0x6e,0x82,0x0d,0x1c,0xf3,0x29,0x1a,0x18,0x47,0x5f,0x84, +0xbd,0x8b,0xd6,0x04,0xef,0x35,0x34,0xe8,0x6c,0x40,0x3f,0x81,0x54,0x1e,0x96,0x0e, +0xa1,0xaf,0x70,0xaf,0x7a,0x61,0x78,0xd0,0xe9,0x79,0x75,0xd0,0x59,0x84,0xdf,0x0a, +0x98,0xac,0x6f,0xa1,0xcd,0x77,0xd0,0x66,0xbd,0xf0,0xa9,0x23,0x82,0xce,0x74,0x74, +0x29,0x94,0xe6,0x19,0x61,0x18,0x54,0xbf,0x21,0xe8,0x44,0xe6,0x0b,0x3a,0xab,0xb1, +0xbf,0x0a,0xfb,0xe0,0x13,0xdc,0xef,0xdd,0xe9,0x7e,0x37,0xbd,0x6e,0x6c,0xd0,0xd9, +0x03,0xf7,0xf2,0x9c,0xb1,0x1f,0x8a,0xf1,0xbc,0x10,0x7f,0x73,0xd0,0x29,0x8d,0xd6, +0xbc,0x9b,0x34,0xc2,0x46,0xf3,0x4d,0x35,0x1c,0xbc,0x87,0xfb,0xe3,0xbd,0xa4,0xe7, +0xb6,0xa0,0x73,0xdb,0x44,0xda,0x09,0x0f,0x6f,0xf3,0x26,0x9a,0xf3,0x04,0x9d,0x1d, +0xd8,0x5f,0xbb,0x8f,0xeb,0x48,0xff,0x1d,0x7b,0x3f,0xf5,0x82,0xfb,0xec,0x19,0x77, +0xd3,0xcf,0xf3,0x20,0x35,0x14,0xb6,0xe0,0x97,0xff,0xde,0xa0,0x33,0x1b,0xfb,0x7d, +0xa8,0xf9,0x1e,0xdb,0x70,0x2e,0xbc,0x34,0x31,0xe8,0x6c,0x45,0x93,0x79,0x08,0x3c, +0x77,0x12,0xd7,0x1d,0x96,0xc1,0xcf,0xf0,0x36,0x7e,0x09,0x0f,0x05,0x73,0xbf,0xdb, +0xce,0x78,0x98,0xfb,0x03,0xbc,0xcd,0x83,0xe2,0x1e,0xe8,0xf5,0x08,0xf6,0xc9,0x41, +0xe7,0x07,0xec,0xa1,0x29,0x41,0xa7,0xf0,0xe3,0x41,0xe7,0x2e,0x30,0x6b,0x8f,0xb7, +0x6f,0xe9,0xae,0x39,0xfe,0x33,0x84,0x1e,0x73,0x9c,0x22,0x70,0x8a,0xd6,0x1c,0xcf, +0x9d,0x30,0x40,0xb1,0x07,0x23,0x22,0x43,0x51,0xd1,0xf9,0x62,0xf2,0x17,0x28,0x58, +0xa8,0x30,0x41,0x72,0x97,0xda,0x2d,0x5e,0xa2,0x64,0xa9,0x53,0xe8,0x37,0x9d,0x23, +0xdb,0x69,0xa7,0x73,0xcf,0x74,0xfe,0x17,0x5b,0x69,0xe7,0xcc,0xb3,0xca,0x94,0xfd, +0x83,0x23,0x75,0xff,0xaa,0x55,0x85,0xd8,0xb3,0x5d,0xe7,0x39,0x74,0x1e,0x95,0x2a, +0x9f,0x5b,0xa5,0x6a,0xb5,0xb8,0xf8,0xea,0x09,0x89,0x49,0xc9,0x4e,0x4a,0x6a,0xee, +0x63,0xda,0x1f,0xb4,0xd5,0xf0,0x1e,0xf5,0xfe,0xb0,0xad,0xd6,0xb1,0x3c,0x6b,0xd7, +0x39,0xca,0x59,0xb7,0x66,0x3d,0x77,0x3e,0x57,0x03,0x27,0xbc,0x85,0xb7,0xf0,0x16, +0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b, +0x78,0x0b,0x6f,0xff,0xd2,0x6d,0xc7,0xb1,0xb6,0x9d,0x39,0x6c,0x3b,0x37,0x9a,0xff, +0x73,0x56,0xad,0x3a,0xf2,0xbf,0xb6,0x80,0xd9,0x8c,0xc5,0x0b,0xbf,0x6f,0x87,0xeb, +0xc8,0xc9,0x71,0x72,0xff,0xc7,0x41,0x14,0x3b,0xbe,0xd8,0xb5,0xcb,0xfc,0x3b,0x2a, +0xea,0x70,0x89,0x1f,0xfb,0x12,0x84,0x8b,0x41,0x5b,0x6e,0xa5,0x32,0xff,0x7d,0xa2, +0xea,0xe5,0xd6,0xb9,0x5c,0xbf,0x4f,0xb6,0xef,0xc8,0x7d,0x47,0x59,0xc4,0xbc,0x9e, +0xcc,0x7d,0x3f,0x79,0xaa,0x79,0x29,0xb9,0x23,0xc7,0x29,0xfe,0x47,0xb7,0x87,0x32, +0x65,0xcb,0x9d,0xec,0xa1,0xa5,0xcd,0x3b,0xca,0x72,0xe5,0x2b,0x98,0x24,0xef,0x50, +0x2e,0x72,0xfc,0x81,0x62,0xff,0xcc,0x56,0xed,0x5a,0x72,0x72,0xd5,0x39,0x56,0x6a, +0x8e,0xb1,0x9d,0x7d,0x9c,0x98,0xdd,0x2b,0x61,0xae,0x88,0xf9,0x97,0x1b,0xbd,0x6b, +0x76,0xfc,0x4d,0xba,0xba,0x9c,0x23,0x09,0xcd,0xf9,0x4f,0x41,0x8f,0x74,0x8d,0xce, +0xaf,0xae,0x93,0xa9,0xc7,0x39,0x39,0xbf,0x2b,0xb1,0xea,0x5e,0x4f,0x32,0x7b,0x39, +0x76,0xb7,0xac,0xd4,0xeb,0x8a,0xb9,0x7b,0xa9,0xa4,0xaa,0x99,0x39,0xbf,0xbb,0xdf, +0x89,0xf6,0x7b,0xc4,0xa8,0x82,0xfc,0x49,0x17,0xf4,0x98,0xe7,0x3f,0xb9,0x52,0xfe, +0x1f,0x9f,0xdf,0x09,0x9f,0xff,0x8f,0xdc,0xfe,0x2a,0xf9,0xbf,0xb0,0xd3,0xbf,0xa1, +0xfc,0x63,0x62,0xfe,0x52,0xd7,0xff,0xcf,0x3d,0x79,0xaf,0x5e,0x47,0x9f,0xaf,0x0f, +0xdb,0x9f,0x79,0xfe,0xa1,0x43,0x8f,0x3e,0xff,0x35,0xd7,0x98,0x19,0x70,0x7f,0xe0, +0x63,0xd8,0x7f,0xba,0x7b,0xe5,0x60,0x36,0xfe,0xc6,0x88,0x47,0x8d,0x76,0x6e,0xcc, +0xb5,0x8c,0x66,0xe3,0x7f,0xee,0x5b,0x31,0xce,0xef,0xbd,0x65,0xe4,0xfc,0xd9,0x95, +0x2d,0xfa,0x18,0xb5,0xff,0x0f,0x28,0xf4,0x7f,0xde,0x2f,0x9b,0xbf,0x63,0xb2,0x8f, +0x77,0x69,0x63,0xfe,0xda,0xa9,0xff,0xa3,0x1e,0x6f,0xfe,0x5a,0xdb,0xf6,0xbf,0x58, +0x7a,0x3e,0xd9,0xf1,0x4f,0x6b,0xad,0x47,0xff,0xfc,0xf8,0x6f,0xde,0x95,0x8f,0xbc, +0x0c,0x3a,0xe9,0xd3,0x1c,0xfd,0x4a,0xc0,0xc9,0xc9,0xb1,0x7f,0x6d,0xff,0x49,0xdd, +0x4d,0xf4,0x6f,0xeb,0x0f,0x76,0xe4,0xfc,0xae,0x77,0x60,0xbf,0xe7,0x86,0x13,0xfd, +0x07,0xc5,0x93,0xf7,0xa3,0xe7,0x5f,0xe9,0x96,0x13,0xf0,0xaa,0x87,0xf9,0xdf,0x09, +0xb8,0x9b,0x75,0x7f,0xdd,0x91,0x1b,0xee,0x9f,0x72,0x8b,0xcd,0xf9,0xf5,0xbd,0xc6, +0x8e,0x5d,0x1f,0xe4,0xac,0xda,0x71,0x22,0xdb,0xce,0xed,0xdb,0x73,0x3e,0xda,0xf1, +0x45,0xce,0x3f,0xaf,0x0f,0xdb,0xb1,0x23,0x10,0x30,0x39,0x0c,0x18,0xf1,0x2e,0x36, +0xf6,0x9c,0x1d,0x7a,0x65,0xed,0xfc,0xab,0xb7,0xbf,0xda,0x13,0x59,0xcc,0x9f,0x90, +0xe1,0xff,0xb8,0x9d,0x78,0x4c,0x1f,0x6d,0xdf,0xf9,0xc9,0x96,0x2d,0x7f,0x5a,0xc9, +0xe4,0xcb,0xf7,0x8f,0xac,0x7f,0x47,0x5f,0x93,0xe3,0x5f,0xbd,0x3f,0xbe,0x3e,0xfc, +0xf6,0x6a,0xf8,0x57,0x7d,0xee,0x8f,0x39,0xa9,0xfa,0xff,0x3b,0x5e,0x09,0xe4,0xfc, +0x25,0x8a,0x29,0xfa,0xef,0xf3,0x5b,0xec,0xbf,0xd1,0x80,0x72,0x87,0x71,0x74,0x19, +0xcd,0xb8,0xc4,0x5f,0xb2,0xdb,0xfd,0xfb,0x35,0x94,0x63,0x6e,0x67,0x38,0xff,0xf6, +0x6d,0x87,0x3d,0x08,0x9b,0x13,0x1e,0xa7,0xfe,0x47,0x6d,0x39,0xe1,0x2c,0xfe,0x0f, +0x5b,0xd5,0x5f,0xb1,0xb0,0x4e,0x38,0x51,0x3b,0x02,0x39,0x7f,0x9f,0x1b,0xc9,0xef, +0xfc,0x99,0x1b,0x9e,0x9f,0xf3,0x17,0x69,0x34,0x7f,0x78,0x7d,0xcf,0xc9,0xf9,0xa3, +0x22,0x72,0x27,0xc2,0xfc,0x96,0x08,0x77,0xfc,0x03,0xde,0xc2,0xc4,0xfc,0xd6,0x90, +0xbf,0xbd,0xff,0x88,0x89,0xfe,0x83,0x2a,0xd5,0x49,0xd7,0xaa,0xdf,0xfb,0x02,0x35, +0xfa,0xbf,0x53,0xf2,0x7f,0xe2,0x2b,0xd9,0x98,0xe8,0xbf,0x5f,0x15,0x8d,0xfe,0xc3, +0x6f,0x55,0xd1,0x27,0x3e,0xff,0xe2,0xc8,0x4f,0xef,0x7f,0xde,0x64,0xcf,0x98,0xff, +0x50,0xf7,0x76,0x84,0x2b,0xe3,0x3f,0x3b,0xf3,0x31,0xff,0xa2,0x6c,0xc7,0x38,0xe1, +0x2d,0xdc,0xec,0xfe,0xff,0x93,0xc0,0x5f,0xba,0x20,0x62,0xfe,0x9c,0x38,0x63,0xfe, +0xa5,0xad,0x2d,0xdc,0x27,0xfc,0x77,0xa6,0xc2,0xc5,0xfc,0xcd,0xfa,0x80,0xf0,0xf6, +0x37,0xd9,0x7e,0x9d,0x0b,0xf2,0xdb,0x7f,0x2f,0x86,0x5f,0x07,0xfd,0x8d,0xb7,0xa8, +0xa8,0xbf,0x55,0x6d,0xfd,0x67,0x14,0xfa,0xc6,0x8d,0x6e,0xa3,0xdb,0xba,0xd1,0x6c, +0x9e,0xaf,0xf7,0x39,0xe9,0xaf,0x93,0xfa,0x8e,0xdf,0xf2,0xfe,0x8a,0x99,0xfb,0x7b, +0xf7,0x06,0xd6,0x27,0x6e,0xfe,0x69,0x02,0x47,0x76,0xfd,0x79,0x6f,0x2d,0xc2,0x1d, +0xeb,0x7f,0xb1,0x78,0xfe,0xed,0x37,0xae,0x9d,0x3b,0xff,0xf9,0xd3,0xff,0x7e,0xed, +0x53,0xff,0xf4,0x3e,0x24,0xfc,0x3e,0xe0,0xef,0xf9,0x40,0x9c,0xbb,0xfa,0x67,0x28, +0x14,0x1d,0xca,0x17,0x93,0x3f,0x14,0x2a,0x10,0xfa,0x75,0x2b,0x18,0x0a,0x15,0x2a, +0x1c,0x2a,0x52,0x34,0x64,0x6f,0xc5,0x42,0xff,0xec,0xad,0x78,0x89,0x50,0xc9,0x52, +0xa7,0x60,0x39,0x35,0x14,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7, +0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0x7f,0xc8,0x16, +0x70,0xfe,0x57,0x26,0xc2,0x09,0x39,0xd1,0xb9,0xa6,0x92,0x13,0xe7,0xd4,0x70,0x1a, +0x3a,0x3d,0x9c,0x5e,0xce,0x55,0xce,0x18,0x67,0x8a,0xf3,0x84,0xf3,0xbc,0xb3,0xc0, +0x59,0xec,0xbc,0xeb,0xec,0x77,0xbe,0xc5,0x84,0x02,0x25,0x02,0xe5,0x03,0x4d,0x02, +0x2d,0x02,0x1d,0x02,0x9d,0x02,0xfd,0x02,0x57,0x1f,0x65,0x26,0x05,0x1e,0x0b,0x4c, +0x0b,0xcc,0x0d,0x6c,0x08,0x7c,0x18,0xf8,0x3c,0xf0,0x7d,0xa0,0x44,0xf0,0xd4,0x60, +0xf9,0x60,0x5c,0x30,0x39,0x98,0x15,0xec,0x11,0xec,0x8d,0xb9,0x3a,0x78,0x73,0xf0, +0xfe,0xe0,0xc2,0xe0,0xd2,0xe0,0x3b,0xc1,0xf5,0xc1,0xcf,0x83,0x07,0xfe,0x8b,0xe6, +0xe0,0x6f,0x30,0x81,0x88,0x40,0x44,0x44,0x44,0x28,0x22,0x26,0xa2,0x40,0xae,0x29, +0xf1,0xab,0x29,0xf5,0xab,0x39,0x2b,0x22,0x36,0xe2,0x1c,0x4c,0x25,0x99,0xea,0x96, +0xa9,0x81,0x49,0x8f,0xa8,0x1d,0x51,0x3f,0xa2,0x41,0xae,0x69,0xf6,0xab,0x69,0xf1, +0xab,0x69,0x1b,0xd1,0x31,0xa2,0x13,0xe6,0x52,0x99,0x1e,0x47,0x99,0x7e,0x11,0x57, +0xfd,0x47,0x73,0x75,0xc4,0x75,0x7f,0xba,0x19,0x15,0x31,0x36,0x4f,0x73,0x73,0xc4, +0x2d,0xbf,0x9a,0xdb,0x22,0xee,0x38,0xca,0x8c,0x8f,0xb8,0x2b,0xe2,0x9e,0x88,0x89, +0x27,0x68,0xee,0xff,0xdd,0x66,0x4a,0xc4,0xf4,0xff,0x60,0xe6,0x46,0x2c,0x3e,0xca, +0x2c,0xfd,0x53,0xcc,0x6b,0x11,0x6f,0xfc,0x8f,0xcc,0x8a,0x88,0x37,0x23,0x56,0x47, +0xac,0xf9,0xd5,0xbc,0x13,0xf1,0xee,0x3f,0xc2,0xac,0x0f,0x9b,0x7f,0xb5,0xf9,0x54, +0xe6,0x0b,0xcc,0x01,0x4c,0x20,0xf2,0x88,0x89,0xc1,0x14,0x90,0x39,0x55,0xa6,0x7c, +0xae,0x89,0xc5,0x9c,0x93,0x6b,0x52,0x65,0xea,0x62,0x9a,0x61,0x3a,0x5a,0xa6,0x2b, +0xa6,0x87,0xcc,0x55,0x32,0xa3,0x22,0x6f,0x8e,0xbc,0x23,0xd7,0x8c,0x97,0xb9,0xe7, +0x4f,0x33,0x13,0x8f,0x61,0x26,0xe5,0x9a,0x87,0x30,0x53,0x22,0x9f,0x8a,0x7c,0x26, +0x72,0x06,0x66,0x96,0xcc,0x9c,0x5f,0xcd,0x2b,0x32,0x0b,0x65,0x16,0x63,0x96,0xe6, +0x9a,0x37,0x72,0xcd,0x0a,0xcc,0x9a,0xc8,0x77,0x23,0xd7,0x47,0x6e,0xc2,0x7c,0x2c, +0xb3,0xf9,0x57,0xf3,0xb9,0xcc,0x17,0x32,0xbb,0x31,0x7b,0xfe,0x9f,0xd9,0xfb,0x3b, +0xcc,0xfe,0xc8,0x03,0xff,0x08,0xf3,0x6d,0xe4,0xf7,0xff,0xd1,0x1c,0x8c,0xfc,0xf1, +0xa4,0x4c,0x78,0x28,0xf0,0xdf,0xbe,0xfd,0x18,0xf9,0xc7,0x9a,0x40,0xe8,0xf7,0x1a, +0x1e,0x89,0xff,0x65,0xbf,0xc7,0xa2,0x8f,0x6b,0x62,0x72,0x4d,0x81,0xbf,0x89,0x29, +0xe4,0x33,0x45,0x72,0x4d,0xb1,0xb0,0x39,0x21,0x53,0xea,0x5f,0x6f,0x4a,0xff,0x25, +0xcd,0x59,0x7f,0x92,0x29,0x1f,0x8a,0xfd,0x97,0x9b,0x73,0xfe,0x75,0xa6,0xd2,0x51, +0x26,0x4e,0xa6,0xfa,0xbf,0xd6,0x24,0x87,0x52,0xc3,0xe6,0xb8,0xa6,0x76,0xae,0xa9, +0xfb,0x17,0x34,0xf5,0xc3,0xe6,0x6f,0x6e,0x1a,0x60,0x1a,0x62,0xb2,0x30,0x4d,0x30, +0xcd,0x64,0x5a,0xfc,0xe1,0xa6,0x25,0xa6,0x15,0xa6,0x4d,0xa8,0x6d,0xae,0x69,0x17, +0x36,0xff,0x12,0xd3,0x21,0xd4,0xf1,0x0f,0x31,0x9d,0x42,0x97,0x1e,0x65,0x3a,0x87, +0xba,0xfe,0xcf,0x4c,0x8f,0x50,0xef,0x93,0x32,0x7d,0x42,0xfd,0x4e,0xc8,0x0c,0x08, +0x0d,0xfc,0x93,0xcc,0xd5,0xa1,0x51,0xa1,0x31,0xa1,0xb1,0xa1,0x9b,0x43,0xb7,0x84, +0x6e,0x0b,0xdd,0x11,0x9a,0x18,0x7a,0x24,0xf4,0x58,0x68,0x4a,0xe8,0x89,0xd0,0x53, +0xa1,0x67,0x42,0xd3,0x42,0xcf,0x87,0x66,0x1d,0x65,0xe6,0x86,0x16,0x1c,0x65,0x96, +0x86,0xde,0x0c,0xad,0x0e,0xad,0x09,0xbd,0x13,0x7a,0x37,0xb4,0x3e,0xf4,0x7e,0xe8, +0xe3,0xd0,0x67,0xa1,0xcf,0x43,0x5f,0x84,0x76,0x87,0xf6,0x84,0xf6,0x86,0xf6,0x87, +0xbe,0x0f,0xfd,0x74,0x94,0x89,0x88,0x8a,0x39,0xca,0x14,0x8a,0x2a,0x76,0x94,0x29, +0x15,0x75,0xfa,0x51,0xa6,0x6c,0xd4,0x39,0x3e,0x53,0xf5,0x28,0x93,0x1c,0x55,0x3b, +0xaa,0x6e,0x54,0xfd,0xa8,0x06,0x51,0x0d,0xa3,0xb2,0xa2,0x9a,0x44,0xb5,0x8a,0xea, +0x10,0xd5,0x31,0xaa,0x53,0xd4,0xa5,0x51,0x9d,0xa3,0xba,0x46,0x75,0x8f,0xea,0x21, +0xd3,0xcb,0x67,0x7a,0xff,0x0f,0x4c,0x9f,0xff,0x67,0x06,0x1e,0x65,0x06,0xff,0x97, +0xcd,0x55,0x3e,0x73,0x6d,0xd8,0x9c,0x80,0xb9,0x0e,0x73,0x03,0x66,0xd4,0xff,0xc8, +0x8c,0xc1,0x8c,0xc5,0xdc,0xfc,0x5f,0x36,0xb7,0xfc,0x6a,0x6e,0xcb,0x35,0x77,0x9c, +0xa4,0x19,0x8f,0xb9,0xeb,0xa4,0xcc,0x3d,0x47,0x99,0x89,0x98,0xfb,0x73,0xcd,0xa4, +0x5f,0xcd,0x43,0x27,0x68,0x1e,0xc9,0x35,0x8f,0x45,0x4d,0xc9,0xd3,0x3c,0x11,0xf5, +0x54,0xae,0x79,0x26,0x6a,0x5a,0xae,0x99,0x1e,0xf5,0x7c,0xd4,0x8c,0xa8,0x59,0xbf, +0x9a,0x39,0x51,0x73,0x73,0xcd,0xbc,0xa8,0x05,0xc7,0x30,0xaf,0x44,0x2d,0x3c,0x8e, +0x59,0x6c,0x99,0xa5,0x51,0xaf,0x61,0xde,0x38,0xca,0xac,0x88,0x7a,0x33,0x6a,0x75, +0xd4,0x9a,0xb0,0x39,0xae,0x79,0xe7,0x57,0xf3,0x2e,0x66,0x3d,0xe6,0x7d,0xcc,0x06, +0xcc,0x87,0x98,0x4d,0x98,0x8f,0x31,0x9b,0x31,0x9f,0x62,0xb6,0x61,0x3e,0xc3,0x7c, +0x9e,0x6b,0xbe,0xc0,0xec,0xc6,0xec,0x39,0xca,0xec,0xcf,0x35,0xdf,0xe6,0x9a,0x83, +0xb9,0xe6,0xa7,0x5c,0x13,0x88,0xfe,0xfd,0x26,0xe2,0xff,0x99,0x23,0x2f,0x72,0xcd, +0x16,0x83,0x29,0x80,0x29,0x84,0x29,0x82,0x29,0x86,0x29,0x81,0x29,0x85,0x39,0x15, +0x73,0x3a,0xa6,0x34,0xe6,0xac,0x5c,0x53,0x16,0x53,0x1e,0x13,0x7b,0x94,0xa9,0x94, +0x6b,0xaa,0xe6,0x9a,0xea,0xb9,0x26,0x39,0xd7,0xd4,0x38,0x41,0x93,0x1e,0x5d,0x3b, +0xba,0x6e,0x74,0xfd,0x63,0x9a,0x06,0x61,0xf3,0x1b,0x4d,0x43,0x4c,0xd6,0x31,0x4c, +0x93,0xb0,0xc9,0xc3,0x34,0x8b,0x6e,0x11,0x36,0x61,0x73,0x82,0xa6,0x55,0xd8,0x84, +0xcd,0x3f,0xde,0xb4,0x0b,0x9b,0x7f,0xb5,0xe9,0x10,0xdd,0xf1,0x5f,0x6b,0x3a,0x85, +0xcd,0x5f,0xd0,0x84,0x67,0x49,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f, +0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc, +0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0, +0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2, +0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b, +0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d, +0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7, +0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde, +0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0xdb,0xdf, +0x6f,0xab,0x19,0xe1,0x38,0xfd,0x2b,0xb8,0xda,0x45,0x3a,0x00,0x75,0xd0,0x25,0x48, +0x00,0x5d,0x8a,0x06,0xd1,0x65,0xc6,0x1b,0x7d,0x0d,0x8d,0x8c,0x30,0x3b,0x1d,0x27, +0x0a,0x0d,0xa2,0xd1,0x68,0xc5,0xa0,0xe3,0xe4,0x43,0x5f,0x67,0x57,0x0c,0xfa,0x78, +0x19,0xc7,0xc9,0x8f,0xbe,0x81,0xbb,0x20,0xba,0x86,0x70,0x45,0xcc,0x71,0x84,0x2b, +0x66,0x8e,0x43,0x63,0xd1,0xc9,0x84,0x3b,0xc7,0xf8,0xa3,0x95,0xd1,0x48,0xc5,0x17, +0x2c,0xe3,0xee,0x8f,0x44,0x13,0xd1,0xa8,0x32,0x6e,0x7a,0xa2,0x02,0x6e,0x7a,0xf2, +0x29,0x5c,0xfe,0x80,0x1b,0x7f,0x41,0xb4,0x12,0xba,0xc2,0x91,0x7f,0x19,0xd7,0xbf, +0x70,0xc0,0x8d,0xa7,0x60,0x19,0x77,0x7f,0x51,0x34,0x0e,0x2d,0xae,0x78,0x0b,0x97, +0x71,0xf3,0xbb,0x52,0xf9,0x7d,0x53,0xf9,0x5d,0xa5,0xfc,0xbe,0x5a,0xc6,0xcd,0x6f, +0x71,0xe5,0xb7,0xa4,0xce,0x7b,0x4a,0xc0,0xcd,0xef,0x6a,0xe5,0xf7,0x65,0x9d,0xef, +0x0c,0xe5,0x33,0x52,0xf9,0x8c,0x52,0x3e,0xe7,0xeb,0xfc,0x95,0x83,0x6e,0x3e,0x4f, +0x0b,0xb8,0xe9,0x38,0x0d,0xff,0x04,0x73,0x5c,0x19,0x37,0xde,0x32,0xca,0xe7,0x37, +0xca,0xe7,0x99,0x01,0xf7,0xfc,0xe5,0xca,0xb8,0xe7,0x2f,0xa3,0xf3,0x97,0x53,0xbe, +0x77,0x28,0xdf,0x15,0x14,0xfe,0x6c,0xed,0xaf,0x50,0xc6,0x4d,0x5f,0x45,0xa5,0xab, +0x8c,0xd2,0x71,0xb6,0x97,0x0e,0x34,0x1e,0xad,0xa2,0xfc,0xbf,0xa5,0xfc,0xaf,0x51, +0xfe,0xdf,0x56,0xfe,0x2b,0xeb,0xfc,0x55,0x94,0xff,0x6a,0x8a,0x3f,0x41,0xf9,0x7f, +0x47,0xf9,0x5f,0xa9,0xf3,0xbc,0xa3,0xfc,0xe7,0x53,0xfe,0xf3,0xeb,0xbc,0xab,0x74, +0x7d,0xe3,0x03,0x6e,0x7e,0xab,0x95,0x71,0xcf,0x93,0x12,0x70,0xcf,0x9b,0xa0,0xe3, +0x77,0xea,0x7a,0x25,0x29,0x9d,0x69,0x01,0xf7,0x3a,0xa5,0xa8,0x5c,0xd2,0x95,0xef, +0xba,0x0a,0x97,0xa6,0x70,0xb5,0x55,0x9e,0x75,0x74,0x5d,0x6b,0x29,0x7c,0x3d,0x95, +0x6b,0x86,0xea,0x53,0xa6,0xf2,0xfb,0x83,0xce,0xdb,0x30,0xe0,0xe6,0xf3,0x5d,0xd5, +0x9b,0x46,0x4a,0x47,0x13,0xc5,0xdf,0x58,0xf1,0x67,0x29,0xfe,0xe6,0x8a,0xbf,0xa9, +0xe2,0x59,0xa7,0x72,0x5b,0xaf,0x72,0x7b,0x4f,0xe5,0xf6,0xbe,0xda,0xc9,0x79,0x2a, +0xb7,0xf3,0x55,0x6e,0xf1,0x6a,0x27,0x1f,0xa8,0xdc,0xde,0x26,0x9e,0x02,0x68,0x6b, +0xe5,0xeb,0x5d,0x95,0x5f,0x41,0x95,0x5f,0x61,0xb4,0xb4,0x69,0x27,0x4a,0xcf,0x5b, +0x2a,0xc7,0x5d,0x4a,0xff,0x85,0xca,0x5f,0x7b,0xe5,0xf7,0x42,0x9d,0xe7,0x22,0xe5, +0xe3,0x22,0xc5,0x57,0x54,0xf1,0x15,0xd7,0xf5,0xb8,0x58,0xf9,0x6a,0xaf,0xf2,0xbd, +0x4c,0xc7,0x5f,0xac,0x7a,0x74,0x89,0xe2,0xe9,0xa2,0x78,0xba,0xe8,0xfc,0xdd,0x70, +0x57,0x34,0xf5,0x36,0xe8,0x1e,0x7f,0x99,0xc2,0x5d,0xa9,0x70,0x97,0x2b,0x5c,0x5f, +0x85,0x3b,0x43,0xe1,0xba,0xa9,0xfc,0xb2,0x55,0x7e,0xfd,0x55,0x7e,0x1f,0xaa,0xfc, +0x3e,0x52,0xf9,0x6d,0x52,0xf9,0x5d,0xa1,0x7a,0x77,0xa5,0xca,0xaf,0xaf,0xea,0x5b, +0x8e,0xca,0x6d,0x87,0xfa,0x97,0xfe,0x01,0xb7,0xfc,0xb2,0x55,0x7e,0xeb,0x95,0xdf, +0x92,0xca,0xef,0x29,0x2a,0xbf,0x19,0x4a,0xd7,0x76,0x8e,0x3b,0x1b,0x1d,0xa4,0x72, +0x1c,0xa4,0x74,0x0d,0x55,0x3b,0x1c,0x52,0xc6,0x3d,0xff,0x08,0xd5,0x97,0xeb,0x95, +0xce,0x91,0x2a,0x9f,0xd1,0xaa,0xb7,0x43,0x94,0xef,0x9b,0xd4,0xce,0x6e,0x54,0xf8, +0x71,0xba,0x1e,0xb7,0xca,0xff,0x76,0x1d,0xff,0xb5,0x8e,0xff,0x58,0xf9,0x1c,0xaa, +0x7a,0xf7,0x83,0xfa,0x97,0xa4,0xa0,0x7b,0xdc,0x9d,0x3a,0x6e,0x78,0xc0,0xcd,0xe7, +0x77,0x8a,0xf7,0x1b,0x1d,0x7f,0xb5,0xae,0xcf,0x04,0x9d,0xe7,0x5a,0xe5,0xfb,0x3a, +0xe5,0xef,0x6e,0x95,0xef,0xbd,0x3a,0xef,0x16,0x95,0xef,0xa7,0x3a,0xef,0x56,0x95, +0xef,0x36,0xd5,0xcf,0x80,0xca,0x37,0x42,0xf9,0xa9,0xa4,0xfa,0xb9,0x5d,0xe5,0xfc, +0x84,0xca,0xf9,0x33,0xf5,0xe3,0x6f,0xab,0x7c,0x03,0x2a,0xdf,0x08,0xd5,0xa7,0x29, +0xea,0xc7,0x03,0x2a,0xd7,0x90,0xe2,0x8b,0x50,0xfa,0x43,0x4a,0x57,0xb4,0xf2,0x11, +0xad,0x7c,0xc4,0x28,0x5c,0x01,0xe5,0xa3,0x90,0xfa,0xb3,0xcf,0xd5,0x1e,0x0b,0xa8, +0x5e,0x15,0x51,0xfe,0x0a,0xa9,0xde,0x16,0x53,0x3f,0x5e,0x42,0xf1,0x16,0x51,0x7e, +0x77,0x2a,0xbf,0x5f,0x28,0xbf,0xbb,0x94,0xdf,0x85,0x2a,0xe7,0x12,0xca,0x6f,0x29, +0x9d,0xf7,0x54,0xd5,0xab,0xdd,0xca,0xef,0x2b,0x3a,0x5f,0x69,0xe5,0x33,0xa4,0x7c, +0x46,0x2b,0x9f,0x0b,0x74,0xfe,0x73,0xd5,0x8f,0x9f,0xae,0xfa,0x73,0xba,0xea,0x4f, +0x69,0x5d,0x97,0xb2,0xca,0xe7,0xb7,0xca,0xe7,0x59,0xaa,0xcf,0xe5,0xd5,0x8f,0x97, +0xd5,0xf9,0xcb,0x2b,0xdf,0x9f,0x2b,0xdf,0xb1,0x0a,0x7f,0x8e,0xf6,0xc7,0xaa,0x3e, +0x54,0x52,0xba,0xca,0x2a,0x1d,0xe7,0x78,0xe9,0x50,0x3f,0x5e,0x55,0xe5,0x70,0x9f, +0xca,0xe1,0x4b,0x95,0xc3,0x1e,0x95,0xc3,0x57,0x2a,0x87,0x73,0x95,0x8e,0xaa,0x2a, +0x87,0x38,0xe5,0x7f,0xaf,0xf2,0xff,0xa6,0xce,0xb3,0x56,0xf9,0x8f,0x51,0xfe,0x0b, +0xe8,0xbc,0xab,0x75,0x7d,0xab,0xab,0x1f,0x8f,0x53,0x7b,0x48,0x55,0x3e,0xf6,0xa9, +0x5f,0x4a,0x54,0x3c,0x5f,0xe8,0xba,0x25,0x2b,0xbd,0x35,0xd4,0xdf,0xa4,0xaa,0x7c, +0x6a,0xe9,0xb8,0x7a,0x0a,0x57,0x43,0xe1,0xea,0xa8,0x5c,0xeb,0x2a,0x5f,0xb5,0x15, +0xbe,0xbe,0xca,0xb7,0x81,0xea,0x55,0x43,0xe5,0xf7,0xa0,0xce,0xdb,0x48,0xed,0x6a, +0xbf,0xea,0x4f,0x96,0xd2,0xd1,0x54,0xf1,0x37,0x51,0xfc,0x8d,0x15,0x7f,0x0b,0xc5, +0xdf,0xcc,0x6b,0xa7,0x2a,0xb7,0x03,0x2a,0xb7,0x6f,0x54,0x6e,0xdf,0xaa,0xbd,0xb4, +0x54,0xb9,0xb5,0xd2,0xf5,0xa9,0xae,0xf6,0xf2,0x9d,0xca,0xef,0x1d,0xf5,0xe7,0x6d, +0x94,0xaf,0x75,0x2a,0xc7,0x42,0x2a,0xc7,0x22,0xea,0x8f,0xa6,0x28,0x3d,0x6b,0x54, +0x9e,0xbb,0x95,0xfe,0x76,0xca,0x5f,0x07,0xe5,0xb7,0x9d,0xce,0xd3,0x51,0xf9,0xe8, +0xa8,0xf8,0x8a,0x29,0xbe,0x12,0xba,0x2e,0x9d,0x94,0xaf,0x0e,0x2a,0xdf,0xce,0x3a, +0xbe,0x93,0xea,0xd3,0xa5,0x8a,0xa7,0xab,0xe2,0xe9,0xaa,0xf3,0x77,0x57,0x3f,0x7d, +0xba,0xfa,0xe9,0xce,0x0a,0xd7,0x47,0xf5,0xee,0x7e,0x85,0xef,0xa1,0xf0,0xfd,0x14, +0xbe,0xb4,0xc2,0x77,0x57,0x39,0x0e,0x54,0x39,0x0e,0xf0,0xae,0x87,0xca,0xf1,0x90, +0xca,0xf1,0x47,0x95,0x63,0x6f,0xd5,0xbf,0x3e,0x2a,0xc7,0x7e,0xaa,0x7f,0x87,0x55, +0x7e,0x9f,0xab,0xbf,0x19,0xa0,0x7e,0x7d,0xa0,0xca,0xf1,0x3d,0xe5,0xbb,0x94,0xf2, +0x7d,0xaa,0xca,0x71,0xa6,0xd2,0xf5,0x99,0xfa,0xf5,0xc1,0x2a,0xcf,0xc1,0x4a,0xd7, +0x30,0xb5,0xcb,0xab,0xd4,0xaf,0x5f,0xa7,0x7a,0x73,0x83,0xd2,0x39,0x4a,0xe5,0x34, +0x46,0xf5,0xf8,0x2a,0xe5,0xff,0x66,0xe5,0x7f,0xac,0xd2,0xf3,0x80,0x8e,0xbb,0x45, +0xd7,0xe7,0x36,0xed,0xbf,0x43,0xf1,0x1c,0x50,0x3c,0x3f,0x29,0xbf,0xc3,0x54,0x0f, +0x0f,0xaa,0xdf,0x49,0x56,0xff,0x3e,0x5e,0xc7,0xfd,0xa2,0xfc,0x7e,0xaf,0xf8,0x27, +0x29,0xfe,0x6f,0x15,0xcf,0x35,0xba,0x6e,0x77,0xe9,0x7c,0x23,0x54,0x0e,0xd7,0x2b, +0xbf,0xf7,0xa8,0xbc,0x27,0xea,0xfc,0x7b,0xca,0xba,0xc7,0x8d,0x35,0xcf,0x38,0xe6, +0xb9,0xbd,0xac,0xeb,0xff,0xb4,0xe2,0x7b,0x52,0xf9,0x7f,0xb6,0x8c,0x7b,0xde,0xa9, +0x4a,0xd7,0x27,0xaa,0x77,0x87,0xa4,0x87,0x75,0x7d,0xb6,0xca,0x9d,0x4f,0xf1,0x2f, +0x51,0x3c,0x8b,0x14,0xcf,0xeb,0x8a,0x67,0x99,0xfc,0xe3,0xbd,0xe7,0x21,0xb9,0xd7, +0x2a,0xdc,0x07,0x0a,0xf7,0x9e,0xfc,0xcf,0xd3,0x79,0xab,0xa9,0xdd,0x9c,0x2f,0x77, +0x95,0xa0,0xbb,0xff,0xe7,0x80,0x1b,0xcf,0x26,0x9d,0x7f,0x83,0xd2,0xf3,0xbe,0xf2, +0xff,0xa1,0xf6,0x3f,0xa3,0xf8,0x9e,0xd2,0x79,0xa6,0xeb,0x3c,0xd3,0x14,0xdf,0x66, +0x1d,0xff,0xa3,0xf4,0x27,0xc5,0xb3,0x4d,0xee,0x18,0xa5,0x77,0xa9,0xe2,0x59,0xac, +0x78,0xde,0x50,0x3c,0xaf,0xc9,0xbf,0xba,0xc2,0xad,0x97,0xfb,0x5d,0x85,0xdb,0xa0, +0x70,0xef,0xcb,0xbf,0xa5,0xce,0x1b,0xa7,0x7c,0xb5,0x92,0xbb,0xaa,0xf2,0xf5,0x8b, +0xd2,0x9d,0xa3,0xf3,0x6f,0x54,0x7a,0x3e,0x50,0xbe,0x3e,0xd2,0xfe,0x99,0x8a,0xef, +0x05,0x9d,0xe7,0x45,0x9d,0x67,0xb6,0xd2,0x31,0x4b,0xfb,0x67,0x68,0xff,0x5c,0xed, +0x9f,0xa3,0xfd,0x25,0xb5,0xff,0x14,0xb9,0x4b,0xc9,0x7d,0xaa,0xdc,0xad,0xe5,0xbe, +0x40,0xee,0x36,0x72,0xb7,0x55,0x3d,0xbb,0x5c,0xda,0x43,0xda,0x53,0xda,0x4b,0xe1, +0x86,0x7b,0xcf,0x21,0xaa,0xc7,0xd7,0x48,0xaf,0x55,0xb8,0x87,0x14,0x6f,0x8e,0xc2, +0x7d,0xa4,0x74,0x6e,0x51,0x3a,0x3f,0x51,0x3d,0xdf,0xaa,0x70,0x1f,0x2b,0xdc,0x26, +0x85,0xfb,0x54,0xe1,0x36,0x2b,0xdc,0x36,0x85,0xdb,0xa5,0x70,0x3b,0x15,0xee,0x2b, +0x85,0xfb,0x52,0xe1,0xf6,0x29,0xdc,0x6e,0x85,0xfb,0x42,0xe1,0xf6,0x2a,0xdc,0x1e, +0x85,0xdb,0xaf,0xfe,0xec,0x2b,0x95,0xff,0x97,0xd2,0x3d,0xd2,0x2d,0xd2,0x4f,0xd5, +0x3f,0x9d,0xa9,0xfb,0xf5,0x59,0xba,0x9e,0x09,0x41,0x57,0x13,0x83,0x6e,0x3c,0x7b, +0x75,0xdd,0x5e,0x56,0xfb,0xbb,0x29,0xc2,0xdd,0xbf,0xa0,0xac,0x7b,0xdc,0x7c,0xb4, +0x84,0x69,0x47,0x68,0x49,0x53,0xef,0xd0,0x2c,0xf3,0xbb,0x52,0xed,0x73,0xa5,0x8e, +0x1b,0x17,0xe1,0x86,0x3b,0x4d,0xe1,0x4e,0xd7,0xfe,0x55,0xda,0x7f,0x8b,0xf6,0x57, +0xd6,0xfe,0x73,0x15,0xcf,0x5b,0x0a,0xf7,0x91,0xc2,0xdd,0xaa,0xf3,0x7f,0xa8,0xf3, +0x6f,0x2c,0xeb,0x5e,0x9f,0x67,0x75,0x7c,0x4d,0x1d,0x9f,0xae,0xe3,0x7e,0xd0,0x71, +0xb7,0x6b,0x7f,0x53,0xed,0x6f,0x26,0xfd,0x52,0xe1,0x76,0x29,0xdc,0x9d,0x8a,0xff, +0x0b,0xc5,0xbf,0x53,0xf1,0x4f,0x8f,0x70,0xc3,0x77,0x54,0xf8,0x43,0x0a,0x3f,0x5e, +0xf1,0x5e,0xa1,0xf8,0x7a,0x2b,0xdd,0x87,0xa5,0x2f,0x4a,0x5f,0xd7,0x71,0xd9,0x3a, +0xee,0x39,0x9d,0x67,0x96,0xce,0x33,0x53,0xe5,0xe8,0x28,0x9e,0x40,0x59,0xb7,0x9f, +0x7b,0x49,0xc7,0xcf,0xd1,0xf1,0x83,0x74,0xfc,0xf3,0x3a,0x6f,0x51,0x85,0x2f,0xa6, +0xfd,0x43,0xb4,0xff,0x05,0xed,0x2f,0xa7,0xfd,0xe5,0x15,0xdf,0x72,0xc5,0xf7,0x9a, +0xc2,0x0f,0x55,0xf8,0x19,0x4a,0xcf,0xbb,0x4a,0xcf,0x5a,0xe5,0x7b,0x95,0xe2,0x49, +0x50,0x3c,0x89,0x8a,0xe7,0x03,0x1d,0x3f,0x5c,0xc7,0xbf,0xa5,0x70,0x19,0x0a,0xd7, +0x40,0xf9,0xd9,0x2e,0xf7,0x67,0x0a,0x7f,0x8d,0xc2,0xaf,0xd1,0xf9,0x3e,0xd5,0xf9, +0xb6,0xe8,0x7c,0xab,0x15,0x4f,0x6b,0x1d,0xd7,0x46,0xe7,0xdb,0xa1,0xe3,0x47,0xe8, +0xf8,0xb7,0x15,0xae,0x8b,0xc2,0x75,0x55,0xb8,0xef,0x94,0xbf,0x03,0x0a,0xbf,0x4e, +0xe1,0x27,0xe8,0xbe,0xb1,0x41,0xfe,0x5b,0xe5,0x3f,0x53,0xfe,0x9f,0xeb,0xb8,0x6f, +0xe4,0xbf,0x3e,0xc2,0x4d,0xcf,0x7b,0xd2,0xe8,0x48,0x95,0x4b,0xa4,0xeb,0x5e,0x17, +0xe9,0x86,0x8b,0x88,0x74,0xe3,0x73,0xb4,0xff,0x03,0xed,0x0f,0xc8,0xbd,0x54,0xee, +0x1c,0xe9,0x27,0x0a,0x5f,0x28,0x52,0xf7,0x21,0x85,0x3b,0x5d,0xfb,0xb7,0x2b,0xde, +0x82,0x72,0xef,0x50,0xb8,0xaf,0x14,0xae,0xb0,0xfc,0xf7,0x45,0xba,0xcf,0x0f,0x5f, +0xcb,0xfd,0x8d,0xf4,0x07,0xe9,0x97,0x0a,0xff,0xae,0xdc,0xeb,0x15,0x6f,0x5b,0x9d, +0xbf,0xb5,0xf6,0x6f,0xd0,0xfe,0x36,0x72,0x2f,0x93,0xfb,0x63,0xe9,0x66,0x85,0xbf, +0x54,0xe9,0xd8,0xa6,0x70,0xe9,0xda,0xff,0x99,0xe2,0xbd,0x44,0xee,0xcf,0x15,0x6e, +0xaf,0xc2,0x5d,0x26,0xff,0xfd,0x4a,0xef,0x01,0xb9,0xbf,0x95,0x1e,0x94,0xee,0x91, +0x76,0x88,0x74,0x9f,0x83,0x86,0x4a,0x87,0xc9,0xff,0x23,0xe9,0x26,0xe9,0x2e,0xe9, +0x6e,0xb4,0x6d,0x94,0xe3,0x54,0x80,0x0b,0x21,0x16,0xda,0xc1,0x39,0x72,0x9f,0x2d, +0xad,0x28,0x5d,0x26,0x5d,0x2f,0x5d,0x02,0x75,0x62,0xe8,0x6f,0x62,0x5c,0x4d,0x94, +0xa6,0xc0,0x22,0x58,0x0d,0x1b,0xe0,0x2d,0xa8,0x57,0x80,0xe7,0x69,0x68,0x0f,0x4d, +0xa1,0x03,0x9c,0x07,0x1b,0xe0,0x5e,0x58,0x04,0xab,0xe4,0x7e,0x4b,0xee,0xd5,0x26, +0x7c,0x41,0xc2,0xc3,0xfb,0xb0,0x04,0x96,0xc1,0x2a,0xb9,0x57,0xc0,0x07,0xb0,0x52, +0xee,0xd5,0x50,0xaf,0x90,0xe3,0x34,0x87,0x0e,0x70,0x5e,0x21,0xd7,0xdd,0x02,0x56, +0xc1,0x47,0xf0,0x0e,0xe4,0xc0,0x66,0xf8,0x44,0xfe,0x1f,0x43,0x7c,0x51,0xf2,0x09, +0xa9,0xa5,0x29,0xfb,0xd2,0xae,0xe6,0x93,0xe6,0x97,0x16,0x94,0x16,0x96,0x16,0x97, +0xd6,0x96,0xd6,0x95,0x66,0x48,0x1b,0x48,0x1b,0x96,0x76,0xaf,0x6b,0x4d,0xdd,0x27, +0xd2,0xa5,0x97,0x48,0x2f,0xd5,0xfd,0xf1,0x0a,0x69,0x6f,0x3d,0x6f,0x3e,0xa7,0xfb, +0xcb,0x4b,0x72,0x3f,0x2f,0xf7,0x3c,0xb9,0x97,0x4b,0x57,0x48,0x37,0x4a,0x3f,0xd4, +0xfd,0x2e,0xa8,0xf6,0x18,0xa9,0xf6,0x1d,0xa5,0x76,0x3a,0x52,0xed,0x38,0x42,0xfb, +0x43,0xda,0x1f,0xad,0xfd,0xa3,0xa4,0xa3,0xa5,0x63,0xa4,0x37,0x4a,0xc7,0x4a,0x6f, +0x92,0xde,0xac,0xf8,0xf2,0x2b,0xbe,0x82,0x8a,0xaf,0xb0,0xf6,0x8f,0xd3,0xfe,0x02, +0xda,0x5f,0x48,0xfb,0x8b,0x68,0xff,0x2d,0xd2,0x5b,0xa5,0xb7,0x49,0x6f,0x97,0xde, +0x21,0xbd,0x53,0x3a,0x5e,0xf1,0x15,0x57,0x7c,0x25,0xe5,0x2e,0x21,0x77,0x29,0xb9, +0xcf,0x90,0xfb,0x4c,0xb9,0x4b,0xcb,0x7d,0x96,0xdc,0x15,0xe4,0x3e,0x5b,0xe9,0xa9, +0xa8,0xf8,0x27,0x68,0x7f,0xac,0xf6,0x9f,0xa3,0xfd,0x95,0xb4,0xff,0x2e,0xe9,0xdd, +0xd2,0x7b,0xa4,0xf7,0x4a,0x27,0x4a,0xef,0x93,0xde,0xaf,0xf8,0xaa,0x28,0xbe,0x6a, +0x8a,0x2f,0x5e,0xfb,0x1f,0xd0,0xfe,0xaa,0xda,0x1f,0xa7,0xfd,0xd5,0xb5,0x7f,0x92, +0xf4,0x41,0xe9,0x43,0xd2,0x87,0xa5,0x8f,0x48,0x1f,0x95,0x3e,0xa6,0xf8,0x92,0x14, +0x5f,0x8a,0xe2,0x4b,0x93,0x7f,0xb2,0xfc,0x53,0xe5,0x5f,0x43,0xfe,0xb5,0xe4,0x5f, +0x47,0xfe,0xf5,0xe4,0x5f,0x5b,0xfe,0x75,0xe5,0x5f,0x5f,0xfe,0x99,0xf2,0x6f,0x24, +0x77,0x43,0xb9,0xb3,0xe4,0x6e,0x2e,0xf7,0x79,0x72,0xb7,0x90,0xbb,0xa5,0xdc,0x17, +0xc8,0x7d,0xa1,0xe2,0x6d,0x2f,0xff,0xb6,0xf2,0x6f,0x27,0xff,0x0e,0xf2,0xef,0x24, +0xff,0x4b,0xe5,0xdf,0x59,0xfe,0xdd,0xe4,0x7f,0xb9,0xfc,0x7b,0xaa,0x1c,0x26,0x6b, +0x7f,0x77,0xed,0xef,0xa1,0xfd,0xbd,0xb4,0x7f,0x8a,0xf4,0x71,0xe9,0x13,0xd2,0x27, +0xa5,0x4f,0x49,0x9f,0x96,0x3e,0xa3,0xf8,0xae,0x54,0x7c,0x7d,0x15,0x5f,0x7f,0xed, +0x9f,0xaa,0xfd,0x7d,0xb4,0xbf,0x9f,0xf6,0x0f,0xd0,0xfe,0x69,0xd2,0x67,0xa5,0xd3, +0xa5,0xcf,0x49,0x9f,0x97,0xbe,0x20,0x9d,0x21,0x9d,0x2d,0x5d,0x26,0xfd,0x5a,0x3a, +0x4f,0xe7,0x5b,0xe3,0xdd,0xd7,0x75,0xbe,0x77,0xb4,0x7f,0x85,0xf4,0x7b,0x85,0xfb, +0x58,0xe1,0x3e,0x51,0xb8,0xcd,0x65,0xdd,0x71,0x9d,0x07,0xcb,0xbb,0xfa,0x90,0xf4, +0x05,0xe9,0x1a,0xe9,0x3b,0xd2,0xb7,0xa5,0x91,0x1a,0x0f,0x8a,0x91,0x16,0x94,0x9e, +0x2d,0xad,0x28,0x6d,0x20,0x6d,0x24,0x6d,0x22,0x6d,0x26,0xed,0x27,0xed,0x26,0xcd, +0x96,0x0e,0x94,0x0e,0x91,0x5e,0x25,0x1d,0x2e,0xbd,0x5a,0x3a,0x52,0x3a,0x4a,0xba, +0x45,0xfa,0xa9,0xf4,0x46,0xe9,0x58,0xe9,0x38,0xe9,0x2d,0xd2,0xad,0xd2,0x6d,0xd2, +0xe7,0xa4,0xcf,0x4b,0x5f,0x90,0xce,0x90,0xee,0x92,0xee,0x96,0x7e,0x29,0xdd,0x83, +0x4e,0x4a,0xa0,0xfd,0x27,0xb8,0x7a,0x9e,0xf4,0x7c,0x69,0x6b,0xe9,0x05,0xd2,0x0b, +0xa5,0xed,0xa5,0x17,0x49,0x2f,0x96,0x5e,0x22,0xbd,0x4c,0xda,0x45,0xda,0x4d,0xda, +0x43,0xda,0x4b,0xda,0x5b,0x9a,0x0d,0x0f,0xc2,0x40,0xb9,0x07,0xcb,0x3d,0x44,0xee, +0xa1,0x72,0x0f,0x93,0xfb,0x6a,0xb9,0xaf,0x91,0x7b,0x84,0xdc,0xd7,0xc9,0xfd,0xa8, +0xf4,0x1b,0xe9,0x73,0xd2,0x17,0xa4,0x33,0xa5,0xb3,0xa5,0x2f,0x4a,0x5f,0x92,0xce, +0x97,0xbe,0x2c,0x7d,0x55,0xba,0x48,0xba,0x44,0xba,0x4c,0xfa,0x86,0x74,0x85,0xf4, +0x4d,0xe9,0x5a,0xa5,0xeb,0x5d,0xb9,0xd7,0xcb,0xfd,0x9e,0xdc,0x1f,0xc8,0xbd,0x41, +0xee,0x0f,0xe5,0xfe,0x48,0xee,0x1c,0xb9,0x3f,0x96,0xfb,0x7b,0xe9,0x0f,0xd2,0x83, +0xd2,0x43,0xd2,0x9f,0x4d,0x9a,0x8b,0x06,0x9c,0x07,0xc1,0xe8,0xc3,0xd2,0xe9,0x50, +0xa9,0x58,0xc0,0x89,0x2f,0xe6,0x6a,0x75,0xa8,0x57,0x22,0xe0,0xb4,0x80,0x0e,0x70, +0x1e,0xcc,0x2c,0x19,0x70,0x5e,0x85,0x97,0xe1,0x15,0x58,0x08,0x8b,0x60,0x46,0x29, +0xfc,0x4a,0xb9,0xfa,0x0a,0x24,0x9c,0x1e,0x70,0x6a,0x02,0xa7,0x72,0xd2,0xa1,0x01, +0x5c,0x0c,0x9d,0x45,0x57,0xb8,0x06,0x9e,0x15,0x73,0xc5,0x3c,0xf1,0xb2,0x30,0x63, +0xb1,0x66,0xbc,0x68,0xa3,0xe3,0xbe,0x67,0xfc,0xc1,0xf8,0xf3,0xbb,0xf3,0x15,0xf1, +0x2a,0x2c,0x86,0x25,0xf0,0x1a,0xbc,0x0e,0xf7,0xf0,0xfb,0xf4,0x5e,0x98,0x08,0xf7, +0xc1,0x0c,0x98,0x09,0x4b,0x61,0x39,0xbc,0x0b,0x5b,0x60,0x3b,0x7c,0x29,0xbe,0x12, +0xa6,0x1f,0x19,0x60,0xda,0xaa,0x79,0x8f,0x66,0xda,0xa8,0x18,0x6a,0x9e,0x37,0xcd, +0x6f,0x14,0x71,0xad,0x79,0x9f,0x66,0xde,0xa5,0x89,0x9b,0xc4,0xcd,0x62,0x9c,0x7e, +0x8f,0xde,0x2e,0xcc,0x6f,0xc7,0x29,0xa6,0x0f,0x36,0xcf,0xb7,0xa6,0xcf,0x32,0xed, +0x9a,0xe7,0xd3,0x31,0x70,0x33,0xdc,0x0a,0xd5,0x43,0x3c,0x63,0x42,0x7b,0xe8,0x28, +0xba,0xc0,0x38,0xb8,0x0b,0x16,0xc2,0x62,0xb1,0x14,0x96,0xc1,0xeb,0xf0,0x06,0xac, +0x10,0x6b,0x61,0x17,0xec,0x85,0xaf,0xa1,0x28,0xcf,0xb0,0x67,0x40,0x39,0xa8,0x0f, +0x19,0xa2,0x01,0x34,0x87,0x16,0xd0,0x19,0xba,0x40,0x6f,0xe8,0x0f,0x03,0x20,0x5b, +0x0c,0xd4,0xf3,0xf0,0xfb,0xe2,0x03,0xc8,0x81,0xcd,0xb0,0x1d,0x3e,0x83,0x1d,0xf0, +0x39,0xec,0x84,0x5d,0xb0,0x07,0xbe,0x82,0xbd,0xb0,0x0f,0x0e,0xc2,0x21,0x38,0x0c, +0xbf,0x88,0xa2,0xd1,0x2e,0xc5,0x44,0x71,0xa8,0x0e,0x09,0xd0,0x1c,0x5a,0xc2,0x53, +0xf0,0x34,0xcc,0x84,0x59,0x62,0x09,0xbc,0x09,0xab,0x60,0x17,0xec,0x86,0x03,0xf0, +0x0d,0x7c,0x0b,0x87,0xc4,0x4f,0xc2,0xc9,0xc7,0xf3,0x12,0x9c,0x02,0xa7,0xc3,0x19, +0xa2,0x34,0xc4,0xc2,0xd9,0xe2,0x1c,0xa8,0x04,0x95,0xc5,0xb9,0x10,0x07,0x19,0x70, +0x11,0x74,0x84,0x4e,0xd0,0x05,0xae,0x84,0x6c,0xb8,0x19,0x6e,0x81,0xf1,0x70,0x3f, +0x3c,0x06,0x93,0x61,0x25,0xbc,0x29,0x56,0xc1,0xa7,0xb0,0x0d,0x82,0xfc,0x4e,0x88, +0x10,0x91,0x90,0x0e,0xb5,0x44,0x6d,0x51,0x47,0xd4,0x15,0xf5,0x20,0x03,0x1a,0x40, +0x53,0x68,0x06,0xe7,0x41,0x4b,0x71,0x3e,0xb4,0x82,0xd6,0xa2,0x0d,0x74,0x80,0x8b, +0xa0,0x2b,0x74,0x83,0xee,0xd0,0x13,0x06,0xc0,0x40,0x31,0x08,0x46,0xc2,0x28,0x31, +0x1a,0xc6,0xc0,0x58,0xb8,0x1d,0xc6,0xc3,0x04,0xb8,0x07,0xa6,0xc2,0xb3,0x30,0x13, +0x66,0x8b,0x97,0x60,0x01,0xbc,0x2a,0x16,0x0a,0xf3,0xbb,0x68,0x09,0x2c,0x85,0xd7, +0x61,0x05,0xac,0xd4,0x6f,0x25,0xf3,0x3b,0x69,0x8d,0x78,0x5b,0x6c,0x10,0x39,0xf0, +0x31,0x6c,0x86,0x4f,0x61,0x2b,0x6c,0x83,0x1d,0xb0,0x17,0xf6,0xc1,0x7e,0x38,0x2c, +0x7e,0x16,0x81,0xfc,0x94,0x2b,0x44,0x88,0x10,0xe4,0x87,0x22,0x50,0x14,0x4a,0x40, +0x65,0xa8,0x02,0x09,0x90,0x04,0xc9,0x90,0x0a,0x69,0x50,0x13,0xd2,0xa1,0x8e,0xa8, +0x07,0x19,0xd0,0x00,0x32,0xa1,0x09,0x34,0x85,0x16,0xd0,0x12,0xda,0x88,0x8e,0x70, +0x09,0x5c,0x26,0x7a,0xc2,0x00,0xc8,0x86,0x81,0x30,0x08,0x86,0xc0,0x55,0x62,0x14, +0x8c,0x86,0x31,0x62,0x2c,0xdc,0x01,0xe3,0xe1,0x2e,0xb8,0x07,0xa6,0xc2,0xb3,0x30, +0x13,0x66,0xc3,0x1c,0x98,0x0b,0x0b,0xe0,0x55,0xb1,0x50,0x2c,0x82,0x25,0xb0,0x14, +0xde,0x80,0x15,0xb0,0x12,0xde,0x14,0xab,0xe1,0x2d,0x58,0x23,0xd6,0x8a,0x2d,0xf0, +0x29,0x6c,0x85,0x6d,0xb0,0x03,0xf6,0xc2,0x41,0x71,0x08,0x7e,0x81,0x40,0x01,0x97, +0x20,0x44,0x40,0x08,0x0a,0x42,0x11,0x28,0x0a,0x25,0xa0,0x32,0x54,0x81,0x04,0x48, +0x82,0x64,0x48,0x85,0x74,0xa8,0x23,0xea,0x8a,0x7a,0xa2,0xbe,0xc8,0x10,0x0d,0xa0, +0x11,0x34,0xd1,0xef,0xe6,0x16,0xfa,0xdd,0xdc,0x52,0xb4,0xd3,0x6f,0xea,0x0e,0xe2, +0x12,0xb8,0x14,0x3a,0x43,0x57,0xe8,0x06,0xdd,0xa1,0x27,0x0c,0x80,0x81,0x62,0xb4, +0x18,0x23,0xc6,0xc2,0xad,0x70,0x27,0x4c,0x80,0xbb,0x61,0x22,0x4c,0x82,0x07,0xe1, +0x61,0xf1,0x28,0x3c,0x06,0x4f,0xc0,0x93,0x30,0x15,0x9e,0x85,0x17,0x60,0x81,0x7e, +0xb7,0x2f,0x86,0x25,0x62,0x29,0x2c,0x83,0xe5,0xb0,0x52,0xbf,0xf1,0xcd,0xef,0xfb, +0x35,0x62,0xad,0xd8,0x20,0x76,0xc0,0xde,0x02,0x66,0x40,0xd9,0x25,0x00,0x11,0x10, +0x29,0x42,0x50,0x10,0x0a,0x43,0x51,0x28,0x0e,0x95,0xa1,0x0a,0xa4,0x43,0x1d,0x51, +0x57,0xd4,0x83,0x0c,0x68,0x00,0x8d,0xa0,0xb1,0xde,0x27,0x34,0x87,0x96,0xd0,0xae, +0xa0,0xfb,0x8e,0xe1,0x22,0xb8,0x18,0x2e,0x81,0x4b,0xa1,0x0b,0x74,0x85,0x6e,0xd0, +0x1d,0x7a,0xc2,0x00,0x18,0x29,0x46,0x89,0xd1,0x30,0x06,0xc6,0xc2,0xed,0x70,0x27, +0x4c,0x80,0xbb,0x61,0x2a,0x3c,0x0b,0x73,0x60,0x2e,0x2c,0x80,0x57,0xc5,0x42,0xb1, +0x48,0x2c,0x16,0xe6,0x1d,0xc7,0xeb,0xb0,0x5c,0xac,0xd0,0xfb,0x8d,0x55,0x7a,0xbf, +0xf1,0x16,0xac,0xd1,0xfb,0x0e,0xf3,0xee,0x23,0x07,0x3e,0x81,0x2d,0xf0,0x29,0x6c, +0x85,0x6d,0xb0,0x03,0xf6,0xc2,0x7e,0xf8,0x1a,0x0e,0x08,0xa7,0x10,0x65,0x0a,0x41, +0x88,0x80,0x48,0x28,0x08,0x85,0xa1,0x28,0x14,0x87,0x5a,0x50,0x1b,0xea,0x40,0x5d, +0x61,0xde,0xa3,0x64,0x40,0x03,0x68,0x04,0x8d,0xa1,0xa9,0xde,0xb5,0x98,0xf7,0x2c, +0x2d,0xc5,0xf9,0xe2,0x42,0x68,0xaf,0xf7,0x30,0x86,0xce,0xd0,0x15,0xba,0x41,0x77, +0xe8,0x09,0x03,0xe0,0x1a,0xb8,0x01,0x46,0x89,0xd1,0x30,0x06,0xc6,0xc2,0x7d,0xf0, +0x20,0xcc,0x82,0x39,0xf0,0x0a,0x2c,0x14,0x4b,0x60,0xb9,0xde,0xdf,0xac,0xd2,0x7b, +0x9d,0x77,0x61,0x1d,0xbc,0x07,0x1f,0x88,0x8d,0x7a,0xd7,0xb3,0x03,0xf6,0xc2,0xd7, +0x70,0xc0,0x94,0x41,0x61,0xda,0x25,0x24,0x8a,0x24,0x48,0x86,0x14,0xa8,0x05,0x19, +0x90,0x05,0x8d,0x45,0x13,0x38,0x1f,0x5a,0x43,0x47,0x18,0x05,0xa3,0xe1,0x46,0x71, +0x13,0xdc,0x0a,0xb7,0xc3,0x13,0xf0,0x94,0x78,0x06,0x66,0xc2,0x2c,0x31,0x1b,0xe6, +0xc0,0x8b,0xf0,0x2a,0x2c,0x14,0x4b,0xe0,0x75,0x58,0x2e,0x56,0xc2,0xdb,0xb0,0x16, +0x3e,0x84,0x1c,0xd8,0x0c,0x4e,0x11,0x97,0xd3,0xe0,0x74,0x28,0x07,0xe7,0x42,0xaa, +0xa8,0x21,0xd2,0x45,0x3d,0xa8,0x0f,0x19,0xd0,0x04,0x9a,0x41,0x5f,0x18,0x08,0xd7, +0xc3,0x0d,0x62,0x24,0xdc,0x08,0x37,0xc1,0xcd,0x30,0x0e,0x6e,0x87,0x3b,0xe0,0x7e, +0x98,0x04,0xaf,0xc2,0x72,0xe1,0x14,0xa5,0xcd,0x41,0x55,0xa8,0x06,0x71,0x90,0x00, +0x89,0x22,0x09,0x6a,0x40,0x4d,0x91,0x0e,0xb5,0xa0,0x36,0xd4,0x81,0xba,0x50,0x0f, +0xea,0x8b,0x0c,0x68,0x06,0xad,0xa1,0x1d,0xb4,0x87,0x0e,0x70,0x11,0x74,0x84,0x8b, +0xe1,0x52,0xb8,0x0c,0xba,0x40,0x57,0xd1,0x0d,0x2e,0x87,0x1e,0xd0,0x13,0x7a,0x41, +0x3f,0xe8,0x0f,0xd9,0x30,0x10,0x86,0xc0,0x55,0x30,0x0a,0x46,0x8b,0x31,0x70,0x23, +0x8c,0x85,0x9b,0xe0,0x66,0xb8,0x1d,0xee,0x10,0x77,0x8a,0xf1,0x62,0x02,0x4c,0x82, +0x07,0xe1,0x61,0x78,0x44,0x4c,0x86,0x37,0x60,0x85,0x58,0x23,0xd6,0xc2,0x21,0x38, +0x2c,0x7e,0x82,0x5f,0xc0,0x29,0x46,0xbb,0x29,0x4e,0xbb,0x81,0x96,0xd0,0x1a,0xda, +0xc3,0x45,0xe2,0x62,0xb8,0x14,0xba,0xc0,0x38,0xb8,0x15,0xee,0x80,0x09,0x30,0x13, +0x66,0xc3,0x5c,0x98,0x0f,0x8b,0x60,0x89,0x58,0x06,0x6f,0xc0,0x4a,0xf8,0x00,0x36, +0x42,0xd1,0x12,0xb4,0x67,0x28,0x05,0xa7,0xc1,0xc5,0x70,0x29,0x74,0x86,0xde,0x30, +0x10,0x46,0xc2,0x78,0x98,0x0c,0xdf,0xc2,0x0f,0xf0,0x13,0x04,0x4a,0x52,0x4f,0x4e, +0xa1,0x8d,0xc2,0x0d,0x30,0x0a,0x1e,0x84,0xc9,0xb0,0x0b,0xbe,0x82,0x7d,0xb0,0x1f, +0x7e,0x00,0xe7,0x54,0xb2,0x06,0xc5,0xa1,0x24,0x94,0x12,0x65,0x21,0x11,0x92,0x20, +0x19,0x52,0x44,0x06,0xb4,0x81,0x0b,0xa0,0x2d,0x74,0x81,0xbe,0xd0,0x1f,0xb2,0x61, +0x10,0x0c,0x86,0x91,0x30,0x07,0x5e,0x84,0xb9,0xf0,0x92,0x98,0x07,0x0b,0x61,0x11, +0xbc,0x01,0xcb,0xc5,0x0a,0x58,0x09,0x6f,0xc2,0x7a,0xd8,0x20,0x72,0xc4,0xc7,0x62, +0x0b,0x7c,0x01,0x05,0x4e,0xa3,0x4b,0x84,0x22,0xa2,0x28,0x9c,0x0e,0xe5,0x20,0x13, +0x1a,0x8a,0x46,0x30,0x1c,0x46,0xc2,0x8d,0x30,0x16,0x6e,0x82,0x9b,0x61,0x2a,0x4c, +0x13,0xcf,0x8a,0x99,0xf0,0x2d,0x38,0xa7,0x3b,0x4e,0x19,0x28,0x07,0x15,0x20,0x16, +0x2a,0x42,0x25,0xa8,0x0c,0xe7,0x42,0x55,0x48,0x80,0x44,0x48,0x12,0xc9,0x50,0x13, +0xd2,0xa1,0x36,0x34,0x86,0x56,0xd0,0x1a,0xfa,0x41,0x36,0x0c,0x81,0x91,0x30,0x1d, +0x66,0xc2,0x9b,0xb0,0x16,0x3e,0x84,0x8f,0x84,0x73,0x06,0xcf,0xf6,0x70,0x2a,0x9c, +0x06,0xa7,0xc3,0x19,0x50,0x5a,0x94,0x83,0x0b,0xa1,0x9d,0x68,0x2f,0x3a,0x88,0x8b, +0xe0,0x32,0xe8,0x22,0xba,0x8a,0x6e,0xa2,0x3b,0x5c,0x0e,0x3d,0xa0,0x2f,0xf4,0x83, +0x41,0x30,0x18,0x46,0xc0,0x0d,0x62,0x24,0xdc,0x02,0x13,0x60,0x12,0x3c,0x23,0x66, +0xc2,0x42,0x58,0x0c,0x1f,0xc3,0x16,0xd8,0x0d,0x4e,0x69,0xee,0x4f,0xe6,0xbd,0xb9, +0x08,0x41,0x32,0xa4,0x88,0x54,0x91,0x06,0xb5,0xf4,0x0e,0xde,0x50,0x47,0xd4,0xd5, +0xfb,0xf7,0x4c,0x61,0xde,0xc1,0x37,0x82,0x2c,0x38,0x0f,0x5a,0x43,0x47,0xe8,0x03, +0x83,0x61,0x24,0x8c,0x82,0xd1,0x62,0x0c,0x4c,0x86,0x29,0xe2,0x71,0x78,0x0a,0x9e, +0x86,0x67,0x60,0x2a,0x4c,0x83,0x67,0xc5,0x74,0x78,0x1e,0x5e,0x80,0x19,0x30,0x13, +0x16,0xc0,0xcb,0xf0,0x19,0xec,0x10,0x9f,0x8b,0x9d,0xf0,0x05,0xec,0x82,0x2f,0x61, +0x8f,0xf8,0x4a,0xec,0x85,0xfd,0xf0,0x35,0x1c,0x00,0xe7,0x4c,0xea,0x0e,0x9c,0x0d, +0x55,0xa1,0x1a,0x24,0x43,0x0a,0xa4,0x42,0x1a,0xd4,0x80,0x0c,0x68,0x06,0x2d,0xa1, +0x15,0xb4,0x86,0x8e,0x70,0x31,0x0c,0x83,0xe1,0x70,0x1d,0x8c,0x84,0x5b,0x61,0x02, +0xbc,0x0c,0x0b,0x61,0x31,0xac,0x85,0x75,0xf0,0x1e,0x6c,0x81,0x4f,0xc5,0x56,0xd8, +0x09,0x5f,0xc0,0x97,0xb0,0x47,0x7c,0x05,0x07,0xe0,0x1b,0xf1,0x2d,0x7c,0x07,0xdf, +0x8b,0x1f,0xe0,0x20,0x1c,0x12,0xce,0x59,0xa4,0x1f,0xaa,0xc1,0x95,0xd0,0x07,0x86, +0xc1,0x70,0x71,0x35,0x3c,0x08,0x0f,0xc1,0x62,0x58,0x02,0xbf,0x9c,0xe5,0xce,0x01, +0x37,0xef,0xf5,0xcd,0x18,0xb8,0x79,0x7f,0x6f,0xc6,0x66,0xcd,0x7b,0x66,0x33,0x26, +0x6d,0xde,0x27,0x9b,0x31,0x4f,0xf3,0x9e,0xb8,0xa3,0xe8,0x24,0x2e,0x15,0xe6,0x5d, +0xf1,0x75,0x65,0xdd,0xb1,0x0f,0x33,0xae,0x6c,0xc6,0x86,0xcd,0x38,0xfb,0x22,0x61, +0xde,0xad,0x9a,0x71,0x66,0x33,0xc6,0x6b,0xc6,0xcd,0xcd,0x18,0xee,0xfa,0xb2,0xee, +0x58,0xed,0xa6,0xb2,0xee,0x18,0xab,0x19,0xef,0x36,0xef,0x5e,0xcd,0x38,0xa7,0x19, +0x2b,0x35,0xe3,0xd4,0x05,0xcb,0xd1,0x7f,0x40,0x7d,0xc8,0x80,0x0b,0xc5,0x40,0x71, +0x83,0x98,0x00,0x0f,0xc3,0x5a,0xc8,0x81,0x4f,0xc5,0x67,0xb0,0x0f,0x82,0xe5,0x5d, +0xa2,0x45,0x7e,0x28,0x01,0xa5,0xc4,0x69,0xe2,0x74,0x38,0x0b,0xce,0x16,0x15,0x45, +0x65,0x51,0x05,0xe2,0x20,0x5e,0x54,0x87,0x14,0x48,0x35,0xef,0x6e,0x21,0x5d,0xd4, +0x81,0xfa,0x90,0x05,0xcd,0xe0,0x7c,0xd1,0x05,0x46,0xc3,0x18,0xb8,0x11,0xc6,0xc2, +0x38,0x70,0xaa,0x39,0xce,0xb5,0x30,0x02,0xae,0x83,0xeb,0x61,0x3b,0xec,0x86,0xaf, +0x60,0x2f,0xec,0x87,0xaf,0xe1,0x00,0x38,0x71,0x8e,0x73,0x0e,0x54,0x12,0x71,0x22, +0x01,0x7a,0xc1,0x00,0x71,0x83,0x18,0x09,0xf7,0xc1,0x64,0x78,0x1a,0xa6,0xc2,0x0b, +0x30,0x13,0x5e,0x82,0xf9,0xb0,0x08,0x96,0xc0,0x72,0x58,0x09,0x6f,0xc3,0x5a,0xf8, +0x00,0x36,0xc2,0x27,0xb0,0x05,0x7e,0x81,0x50,0x82,0x4b,0x94,0x88,0x16,0xe5,0xe1, +0x5c,0xa8,0x02,0x71,0x10,0x0f,0xd5,0x21,0x11,0x52,0xa1,0x26,0xd4,0x82,0xda,0xa2, +0x8e,0x68,0x00,0xf7,0xe9,0xfd,0xa0,0x79,0x97,0xf8,0x10,0x3c,0x0c,0x8f,0xe8,0x3d, +0xe9,0x63,0x62,0x8a,0xde,0x23,0xfe,0x28,0x0e,0xeb,0x7d,0xe2,0x2f,0x22,0x94,0xc8, +0xf9,0x20,0x11,0xee,0x84,0xc9,0xb0,0x18,0xf6,0xc1,0x2f,0xe0,0xa4,0xe0,0x6e,0x89, +0x9e,0xcf,0x7d,0x74,0x32,0xd7,0x5e,0x9c,0x02,0xb7,0x3f,0x49,0x7e,0xe1,0x7b,0xf8, +0x01,0x7e,0x02,0xe7,0x29,0xee,0x61,0x4f,0x53,0x0f,0x45,0x51,0x28,0x0b,0xe5,0xe0, +0x5c,0xa8,0x02,0x55,0x21,0x03,0xfa,0x41,0x7f,0x31,0x40,0x0c,0x81,0xeb,0xe0,0x06, +0x31,0x12,0x1e,0x82,0x87,0xe1,0x11,0x78,0x14,0x1e,0x83,0xc9,0xf0,0x19,0xec,0x80, +0xbd,0xb0,0x0f,0xf6,0xc3,0xa9,0xcf,0x70,0x3e,0xa8,0x00,0x03,0x20,0x5b,0x0c,0x84, +0x9b,0x61,0x9c,0xb8,0x0d,0xee,0x84,0xf1,0x62,0x02,0xe4,0xc0,0x7e,0xf8,0x06,0xbe, +0x85,0xef,0xe0,0x7b,0xf1,0x03,0x1c,0x84,0x43,0xe2,0x47,0x08,0x4c,0xa5,0x8d,0x88, +0x08,0x08,0x41,0x94,0x88,0x86,0xfc,0x50,0x40,0x14,0x84,0x0a,0x10,0x0b,0x67,0xc3, +0x39,0x50,0x11,0x2a,0x89,0x6a,0x22,0x03,0x06,0xc3,0x48,0x18,0x05,0xa3,0x61,0x0e, +0xbc,0x08,0xaf,0xc1,0xeb,0xf0,0x06,0xac,0x85,0x0f,0x61,0x0b,0xec,0x87,0xaf,0xe1, +0x7b,0xf8,0x51,0xfc,0x04,0x3f,0xc3,0x2f,0xc2,0x99,0xe6,0x38,0x31,0x90,0x1f,0xce, +0x81,0x8a,0x10,0x07,0x09,0xd0,0x18,0x9a,0x40,0x1b,0xb8,0x00,0xda,0x42,0x17,0x18, +0x01,0x23,0x61,0x34,0x8c,0x11,0x37,0xc2,0x6c,0x98,0x23,0x5e,0x84,0xb9,0xf0,0x12, +0x2c,0x80,0x97,0xe1,0x15,0x78,0x15,0x16,0xc2,0x22,0x58,0x02,0xef,0x88,0xb5,0xf0, +0x21,0x6c,0x81,0xed,0xf0,0x99,0xd8,0x21,0x3e,0x87,0xbd,0xb0,0x0f,0x0e,0xc2,0x21, +0xf8,0x79,0x9a,0xfb,0xd2,0xb9,0x32,0x9c,0x0b,0xf1,0x50,0x1d,0x12,0x20,0x11,0x92, +0x20,0x19,0x52,0x20,0x15,0xd2,0x20,0x03,0x32,0xa1,0xa1,0x68,0x04,0x2d,0xe0,0x3c, +0xd1,0x52,0xb4,0x86,0x8e,0xd0,0x05,0x06,0x40,0xb6,0x18,0x08,0x43,0xe1,0x1a,0x71, +0xad,0x18,0x21,0xae,0x13,0xd7,0xc3,0x0c,0x98,0x29,0x66,0x89,0xd9,0xf0,0x22,0xcc, +0x85,0x97,0x60,0x1e,0xcc,0x87,0x05,0xb0,0x10,0x16,0xc1,0x62,0x58,0x22,0x96,0x8a, +0x65,0x62,0x13,0xe4,0xc0,0xc7,0x62,0x0b,0xec,0x82,0xdd,0xe2,0x4b,0xd8,0x03,0x5f, +0xc1,0x5e,0xf8,0x5a,0x1c,0x80,0x6f,0xe0,0x5b,0xf1,0x9d,0x08,0x4c,0xa7,0x5e,0x42, +0x0c,0x14,0x86,0x62,0x70,0x0a,0x94,0x83,0x8a,0x50,0x19,0xe2,0x21,0x01,0x2e,0x86, +0x4b,0xa0,0x33,0x74,0x81,0x2b,0xa0,0xb7,0xc8,0x86,0xc5,0xb0,0x04,0xb6,0xc2,0x36, +0xd8,0x0e,0x9f,0x89,0x1d,0xf0,0x39,0xec,0x14,0x5f,0xc0,0x2e,0xf8,0x52,0xec,0x11, +0xfb,0xe0,0x20,0x38,0xcf,0xf1,0xfb,0x74,0x03,0x65,0x07,0xcb,0x61,0x35,0xfc,0x08, +0x66,0x52,0x6e,0xbf,0x43,0x9c,0x0f,0x3e,0x34,0x13,0x73,0x7f,0x24,0xfd,0x50,0x02, +0x4e,0x85,0xb3,0x44,0x19,0x51,0x16,0x2a,0x43,0x15,0x48,0x83,0x9a,0x50,0x07,0xea, +0x89,0x0c,0x68,0x00,0x0d,0xa1,0x11,0x34,0x86,0x59,0xb0,0x1e,0xea,0xfe,0x44,0x3d, +0x80,0xf1,0x70,0x37,0xac,0x80,0x7d,0xf0,0xa3,0x99,0x20,0xfb,0x33,0xcf,0xe1,0x50, +0x0e,0xaa,0x43,0x32,0xa4,0x40,0x4b,0x68,0x05,0xd9,0x30,0x04,0x86,0xc2,0x61,0x28, +0xfa,0x0b,0xf7,0x44,0x28,0x0f,0xb5,0xa0,0xbe,0x68,0x00,0x17,0x43,0x0f,0xd1,0x13, +0x06,0x40,0xb6,0x18,0x08,0x8f,0xc0,0xa3,0xf0,0x18,0x4c,0x86,0x45,0xb0,0x0c,0x56, +0xc0,0x2a,0x78,0x07,0xd6,0xc1,0x06,0xf8,0x08,0x72,0xcc,0xc4,0x5c,0x27,0xe0,0x14, +0x80,0x42,0x50,0x11,0x2a,0x43,0x2d,0xa8,0x03,0x75,0xa1,0x3e,0xb4,0x84,0xd6,0x70, +0x29,0x8c,0x84,0x43,0x90,0x11,0x08,0x38,0x43,0xe0,0x27,0x31,0x32,0x18,0x70,0x1e, +0x86,0xc9,0xb0,0x16,0xb6,0x08,0xf3,0xb1,0x45,0x59,0x88,0x83,0x0c,0x68,0x20,0x32, +0xa1,0x19,0x34,0x17,0xad,0xe1,0x2a,0x18,0x0a,0xd7,0xc0,0x48,0x78,0x04,0x26,0xc3, +0x6b,0xb0,0x12,0xde,0x81,0x77,0xe1,0x7d,0xf3,0x01,0x47,0x64,0xc0,0x69,0x05,0xad, +0xe1,0x11,0x98,0x0c,0xd3,0x60,0x26,0xac,0x87,0x8d,0xf0,0xa3,0xf9,0xc0,0x2e,0x14, +0x70,0x2a,0x41,0x02,0x74,0x87,0x6c,0xb8,0x06,0x46,0xc0,0xad,0x70,0x3b,0xdc,0x0d, +0xf7,0xc2,0x44,0xb8,0x1f,0xa6,0xc0,0x13,0x30,0x0b,0xe6,0xc0,0x02,0x78,0x05,0x5e, +0x85,0x25,0x70,0xc0,0x7c,0xf0,0x11,0x15,0x70,0xd2,0xa2,0xc9,0x13,0xb4,0x83,0x2e, +0xd0,0x0b,0x46,0xc2,0x58,0xb8,0x19,0x66,0xc2,0x6c,0x78,0xd9,0x7c,0x00,0x92,0x2f, +0xe0,0x84,0x20,0x9f,0xc8,0x0f,0xa9,0x50,0x03,0x6a,0x42,0x1d,0x51,0x1f,0xda,0x41, +0x17,0x18,0x0a,0x23,0xe1,0x51,0xd8,0x02,0x5f,0xc3,0x37,0xf0,0xad,0xf9,0x20,0x30, +0x26,0xe0,0x94,0x82,0x72,0x90,0x0e,0x19,0xd0,0x11,0x46,0xc2,0x3c,0x58,0x04,0x8b, +0xcd,0x07,0x27,0xf9,0x5d,0x02,0x10,0x01,0x21,0x88,0x82,0x82,0x50,0x04,0x8a,0x42, +0x09,0x28,0x05,0xa7,0xc2,0xe9,0x90,0x0a,0x35,0xa1,0x16,0xd4,0x17,0x5d,0x60,0x04, +0x8c,0x84,0x87,0x61,0x09,0xac,0x80,0x37,0x61,0x3b,0x7c,0x06,0x3b,0xcc,0xb9,0x0a, +0x70,0x3c,0x64,0x40,0x3b,0xe8,0x02,0x83,0x60,0x24,0xdc,0x95,0xfb,0xe1,0x4b,0xc0, +0x69,0x0a,0x23,0x61,0x36,0x2c,0x81,0xaf,0xcd,0x07,0x8d,0x85,0x02,0x4e,0x2c,0x9c, +0x0d,0x95,0x20,0x01,0xd2,0x21,0x03,0x9a,0x41,0x73,0x68,0x09,0xe7,0x8b,0x56,0xa2, +0x35,0xf4,0x80,0xde,0xd0,0x0f,0x06,0x88,0x6c,0x18,0x0b,0x23,0x0b,0x53,0x2f,0x60, +0x3a,0x3c,0x07,0x33,0x61,0x16,0x2c,0x83,0xd7,0xe1,0x0d,0xb1,0x1c,0x56,0xc0,0x21, +0xf8,0xc5,0x7c,0x48,0x59,0x24,0xe0,0x9c,0x09,0x95,0x44,0x02,0x64,0x41,0x63,0x68, +0x0d,0xd9,0x30,0x0a,0x46,0xc3,0x58,0x98,0x09,0xaf,0xc3,0x16,0xf8,0xce,0x7c,0xc0, +0x53,0xd4,0x25,0x20,0x82,0x22,0x02,0x6a,0x40,0x4d,0x68,0x0c,0x3d,0x61,0x00,0x64, +0x8b,0x81,0x30,0x08,0x06,0xc3,0x10,0xb8,0x4a,0xdc,0x00,0xa3,0x60,0xb4,0x18,0x03, +0x33,0x60,0x26,0xcc,0x86,0x39,0xf0,0x12,0xcc,0x83,0xf9,0xb0,0x40,0x63,0xbc,0xcb, +0xc4,0x5a,0xd8,0x09,0xfb,0xe0,0xa0,0x49,0x5b,0x31,0xd2,0x03,0x11,0x50,0x51,0xe3, +0xbf,0x55,0xa1,0x9a,0x88,0x83,0x14,0x48,0x83,0xfa,0xd0,0x48,0x64,0x41,0x63,0x68, +0x22,0x5a,0xc3,0x20,0x18,0x2c,0x86,0x8a,0x91,0x30,0x0a,0x46,0x8b,0x31,0x30,0x1b, +0xe6,0xc0,0x5c,0x78,0x09,0x16,0xc1,0x62,0x58,0x02,0x4b,0xe1,0x75,0x78,0x13,0xde, +0x82,0xb7,0xc5,0x3b,0x62,0x2d,0x7c,0x08,0x1f,0x89,0x1c,0x61,0x3e,0x56,0x2d,0x06, +0x25,0xa0,0x2a,0x54,0x83,0x78,0xa8,0x0e,0x89,0x90,0x04,0xc9,0x90,0x22,0x52,0x45, +0x1a,0xd4,0x80,0x7a,0xa2,0x3e,0x64,0x40,0x03,0x31,0x12,0x6e,0x82,0x71,0xe2,0x56, +0xb8,0x03,0xc6,0xc3,0x23,0xf0,0x18,0x4c,0x85,0x99,0xf0,0x09,0x6c,0x16,0x5b,0x60, +0x2b,0x6c,0x83,0x5d,0xb0,0x0f,0x0e,0x9a,0x0f,0x6a,0x4b,0x50,0x0f,0x20,0x08,0x11, +0x10,0x82,0x82,0x50,0x04,0x8a,0x42,0x09,0xa8,0x0c,0x55,0x20,0x01,0x92,0x20,0x19, +0x52,0x21,0x1d,0x6a,0x43,0x1d,0xa8,0x2b,0xcc,0x38,0x7d,0x7d,0xc8,0x10,0x0d,0xa0, +0x11,0x34,0x81,0xa6,0x1a,0xc3,0x6f,0x09,0xad,0x45,0x07,0x71,0x29,0x74,0x85,0x6e, +0xd0,0x1d,0x7a,0x42,0x5f,0xc8,0x86,0x21,0x30,0x12,0x6e,0x81,0xdb,0xc4,0x9d,0x62, +0x02,0xcc,0x85,0x79,0x62,0x3e,0xbc,0x0c,0xaf,0xc0,0x12,0x58,0x26,0xde,0x10,0x2b, +0x60,0x15,0xbc,0x05,0x6b,0xe0,0x6d,0xf1,0x8e,0x58,0x2b,0xde,0x15,0xeb,0xc4,0x7a, +0xf1,0x29,0x6c,0x35,0x1f,0xb0,0x95,0xe4,0xba,0x41,0x2a,0xd4,0x80,0x9a,0x50,0x1f, +0x32,0xa0,0x01,0x64,0x42,0x23,0xc8,0x12,0x8d,0x45,0x13,0x68,0x0e,0xad,0xa1,0x23, +0x5c,0x26,0x3a,0x43,0x57,0x18,0x69,0xe6,0x30,0x94,0x74,0xe7,0x37,0xcc,0x86,0x39, +0x30,0x1f,0x16,0x88,0x97,0xad,0x39,0x0f,0x66,0xbe,0xc3,0x62,0x58,0x02,0x4b,0xc5, +0x32,0x78,0x0d,0x5e,0x87,0x37,0x60,0x85,0x58,0x0b,0x1f,0x9a,0xf8,0x4b,0x05,0x9c, +0x17,0x34,0x3f,0x62,0x16,0xcc,0x86,0xb9,0x30,0x5f,0xf3,0x25,0x5e,0x85,0x85,0xb0, +0x48,0x2c,0x86,0x25,0xb0,0x11,0x36,0x41,0x0e,0x7c,0x6c,0x3e,0xdc,0x3b,0x85,0xba, +0x0c,0x09,0x90,0x04,0xc9,0x50,0x0b,0x6a,0x43,0x1d,0xa8,0x2b,0xea,0x89,0xfa,0x90, +0x01,0x8d,0x44,0x6b,0xe8,0x08,0x23,0xe1,0x59,0x98,0x2e,0x9e,0x13,0xcf,0x8b,0x17, +0x60,0x06,0xcc,0x84,0xb9,0xf0,0x92,0x98,0x27,0xe6,0x8b,0x25,0xf0,0x26,0xac,0x85, +0x6d,0xe6,0xc3,0xf0,0x53,0x03,0xce,0x19,0x70,0x96,0x28,0x23,0xca,0x8a,0x72,0x50, +0x1e,0x2a,0xc0,0x39,0x50,0x51,0x54,0x82,0xaa,0x90,0x00,0xe9,0x90,0x01,0x8d,0xcd, +0x07,0x8a,0xa7,0xe1,0x0f,0xd5,0x20,0x1e,0xaa,0x43,0x0d,0xa8,0x29,0xd2,0xa1,0x16, +0x4c,0x86,0xcd,0xb0,0x05,0xbe,0x80,0x5f,0x20,0xea,0xf4,0x80,0x13,0x23,0x0a,0x42, +0x09,0x28,0x05,0xa7,0xc0,0x69,0x50,0xfd,0x74,0x77,0x9e,0x4a,0x2a,0xd4,0xd0,0x7c, +0x95,0xda,0x50,0x07,0xea,0x8a,0x7a,0xa2,0xbe,0xc8,0x10,0x0d,0x44,0xa6,0x68,0x28, +0x5a,0x43,0x47,0x98,0x0c,0xcf,0xc0,0xb3,0xb0,0x16,0xde,0x85,0xf5,0xf0,0x1e,0x6c, +0x80,0x8f,0x60,0x13,0xe4,0xc0,0x66,0xd8,0x22,0x3e,0x15,0xdb,0xc4,0x76,0x91,0xfb, +0x71,0x3d,0x04,0x20,0x3f,0x14,0x80,0x24,0x48,0x86,0x9a,0x90,0x2e,0x6a,0x89,0xda, +0x50,0x0f,0x9a,0x88,0xd6,0xa2,0x0d,0xb4,0x87,0x0e,0x70,0x11,0x74,0x84,0x4e,0x70, +0x09,0xdc,0x02,0xb7,0xc2,0x7d,0x70,0xbf,0x78,0x00,0x26,0xc1,0x23,0x62,0x26,0xfc, +0x00,0x5d,0x4a,0xbb,0x74,0x15,0xdd,0xe0,0x72,0xe8,0x21,0x7a,0x8a,0x5e,0x62,0x09, +0x6c,0x81,0x7d,0x70,0xd0,0x7c,0x60,0x7a,0x26,0xcf,0x3d,0x90,0x1f,0xe2,0xa1,0xba, +0x48,0x80,0x34,0xa8,0x09,0x75,0xa1,0x9e,0xa8,0x2f,0x32,0x44,0x6b,0xe8,0x08,0x83, +0x60,0x3c,0xdc,0x0d,0xcf,0xc0,0x34,0xf1,0x2c,0xcc,0x84,0x59,0x62,0x36,0xcc,0x81, +0x17,0xc5,0x5c,0x78,0xc9,0x2c,0x30,0x70,0x16,0xf5,0x04,0xf2,0x41,0x0c,0x14,0x80, +0x04,0x48,0x84,0x34,0xa8,0x25,0xea,0x40,0x5d,0xa8,0x0f,0x59,0xd0,0x58,0x34,0x11, +0xad,0xa1,0x23,0x74,0x81,0x1e,0xd0,0x0b,0xae,0x80,0x2b,0xe1,0x16,0xb8,0x15,0xee, +0x84,0x09,0x70,0x17,0xdc,0x03,0xf7,0xc2,0x44,0x71,0x9f,0xb8,0x5f,0x3c,0x20,0x26, +0xc3,0x34,0x98,0x09,0x1b,0xe1,0x43,0xf1,0x11,0x6c,0x82,0x2d,0xf0,0x85,0xd1,0x32, +0x3c,0x37,0xc1,0x01,0xf8,0x06,0xbe,0x85,0xef,0xcc,0x82,0x09,0x65,0xa9,0x33,0x10, +0x14,0x11,0x22,0x12,0x8a,0x42,0x71,0x48,0x86,0x14,0x48,0x85,0x34,0xa8,0x05,0xf5, +0xa0,0x3e,0x64,0x88,0x06,0x22,0x53,0xb4,0x86,0x8e,0x70,0xb1,0x98,0x29,0xcc,0xe2, +0x0c,0x93,0xcc,0x87,0xbc,0x67,0x07,0x9c,0xfe,0x30,0x12,0x1a,0x9e,0x43,0xbe,0xab, +0x73,0xed,0x73,0x3f,0x9c,0xe5,0x3a,0xa7,0x10,0xa7,0x68,0x00,0x8d,0xa1,0x09,0xb4, +0x83,0x2e,0x70,0xc8,0x2c,0x4c,0xd0,0x08,0x7f,0xf3,0xa1,0x6a,0x57,0xfa,0x11,0x28, +0x03,0xe7,0x42,0x15,0xa8,0x06,0x71,0x50,0x1d,0x12,0x20,0xdd,0x7c,0xd0,0x79,0x05, +0x75,0xe6,0x4a,0xe2,0x84,0xcb,0xa0,0x0b,0xf4,0x86,0x6c,0x58,0x04,0x4b,0xe0,0x4d, +0x58,0x0b,0x7b,0x60,0x1f,0x7c,0x63,0x3e,0xb0,0xef,0x43,0x3c,0x90,0x00,0x69,0x90, +0x01,0x0d,0xa1,0x35,0x74,0x84,0xee,0x30,0x0c,0xae,0x83,0xf1,0x66,0x7f,0x3f,0xf2, +0x0f,0x0d,0xe1,0x4a,0xe8,0x03,0x7d,0x21,0x1b,0xae,0x86,0x8c,0xfe,0x3c,0x9b,0xc1, +0x64,0x98,0x0f,0xaf,0xc0,0x7a,0xf3,0xa1,0xfe,0x00,0xee,0x3f,0xd0,0x4a,0xb4,0x16, +0x6d,0xe0,0x66,0x18,0x0f,0x77,0xc3,0x3d,0xf0,0x18,0x6c,0x81,0x4f,0x61,0x9b,0xd8, +0x2e,0xf6,0xc1,0x7e,0xf8,0x1a,0x0e,0xc0,0x37,0xf0,0x9d,0xf9,0x60,0x34,0x9b,0xdf, +0x41,0xb7,0xd3,0xef,0x41,0x99,0x3b,0x28,0x77,0xf8,0x1a,0xf6,0xcd,0x20,0x1c,0x7c, +0x0b,0x3f,0xc2,0x4f,0xf0,0xb3,0x59,0x10,0x60,0x26,0x7d,0xf0,0x2c,0xfa,0x10,0xd1, +0x1a,0x2e,0x80,0x76,0xe2,0x72,0xe8,0x05,0xd9,0xf0,0xe3,0x6c,0x77,0xa2,0xdd,0x95, +0x90,0x0d,0x23,0x60,0x24,0x8c,0x83,0x09,0x30,0x09,0x1e,0x81,0x47,0x61,0xdf,0x5b, +0xb4,0x6f,0x30,0x8b,0x61,0xc4,0x41,0x02,0x34,0x86,0x1e,0xef,0xd2,0x1f,0x40,0x2f, +0xe8,0x0d,0xfd,0x60,0x10,0x5c,0x0b,0xa3,0x61,0x2c,0xdc,0x06,0xcf,0xc2,0xf3,0x90, +0xb9,0x8e,0xfb,0x95,0xf9,0x80,0xf8,0xbd,0x80,0x73,0x21,0xb4,0x87,0x87,0xe1,0x51, +0x78,0x0c,0x1e,0x17,0x4f,0xc1,0xd3,0x30,0x0d,0x9e,0x83,0x17,0x60,0x01,0xbc,0x22, +0x16,0xc2,0x6b,0xf0,0x06,0x84,0xde,0x0f,0x38,0xd1,0x90,0x1f,0x0a,0x41,0x49,0x38, +0x05,0xce,0x84,0x32,0x90,0x0e,0xb5,0xa1,0x1e,0x64,0x40,0x23,0x68,0x2c,0x9a,0x43, +0x6b,0xb8,0x00,0x9e,0xfa,0x80,0x67,0x3d,0x58,0x02,0xcb,0xe0,0x23,0xc8,0x81,0x43, +0x70,0x18,0x4a,0x6e,0x20,0x5e,0x48,0x81,0x34,0x38,0x1f,0x5a,0x43,0x7f,0xc8,0x86, +0x71,0x70,0x2b,0x4c,0x85,0x67,0x61,0x19,0xbc,0x0e,0xab,0xe1,0x6d,0xf8,0xc5,0x7c, +0xf8,0xf9,0x11,0xc7,0x42,0x6d,0xe8,0x0b,0x57,0x89,0x1b,0xc5,0x43,0xf0,0x18,0x4c, +0x81,0x19,0xe6,0x03,0xca,0xcd,0xf4,0x5f,0x90,0x5f,0x14,0x80,0x32,0x70,0x0e,0x54, +0x31,0x1f,0x84,0x6e,0xa1,0x9f,0x83,0x7c,0x70,0x1a,0x94,0x86,0xf2,0x10,0x0b,0x67, +0x43,0x45,0xa8,0x02,0x09,0xd0,0x0f,0xc6,0x0b,0xf3,0x31,0x60,0x35,0x48,0x80,0x34, +0xa8,0x01,0x75,0x21,0x03,0x9a,0xc1,0xf9,0x62,0xc2,0x56,0xae,0x1b,0xbc,0x20,0x96, +0xc0,0x6e,0xf8,0x12,0xf6,0xc2,0x3e,0x38,0x08,0x6b,0xb7,0xf3,0x1c,0x0c,0xbb,0xc5, +0x97,0xb0,0x17,0xf6,0xc1,0x41,0x58,0xfb,0x19,0xed,0x13,0xbe,0x82,0xbd,0xb0,0x4f, +0xec,0x87,0x43,0xb0,0x64,0x07,0xcf,0xd7,0xb0,0x05,0xb6,0xc2,0x36,0xb1,0x1d,0x3e, +0x83,0x1d,0xe2,0x73,0xd8,0x03,0x5f,0xc1,0x5e,0xd8,0x07,0xdf,0xc0,0xb7,0xe2,0x67, +0xf1,0x8b,0xd8,0xf2,0x39,0xc7,0xc1,0x4e,0xd8,0x0d,0x7b,0xe0,0x2b,0xd8,0x07,0x3f, +0x9b,0x05,0x0a,0x76,0x72,0x8d,0x60,0x2d,0x7c,0x60,0x16,0x6a,0xf9,0x82,0x3e,0x00, +0x1a,0x41,0x73,0x68,0x21,0x5a,0x43,0x47,0xf3,0xe1,0xff,0x57,0xf4,0xb3,0x10,0x82, +0xb2,0x50,0x1e,0x2a,0xc0,0xd9,0xa2,0x92,0x38,0x17,0x92,0x20,0x05,0x6a,0x40,0xba, +0xa8,0x2d,0x32,0x45,0x13,0xd1,0x4c,0xb4,0x10,0x2d,0xa1,0x15,0xb4,0x81,0x0b,0xe0, +0x42,0xd1,0x41,0x74,0x14,0x9d,0xc4,0xa5,0xa2,0xb3,0xe8,0x0a,0xdd,0xe0,0x72,0xd1, +0x0b,0xae,0x84,0xbe,0x30,0x08,0x86,0xc0,0x30,0xb8,0x1a,0x46,0xc0,0xf5,0x62,0x24, +0xdc,0x02,0xb7,0xc1,0x43,0x30,0x05,0x9e,0x80,0xa7,0x60,0x1a,0x4c,0x87,0x57,0x60, +0xdf,0x8f,0x5c,0x57,0xf3,0x21,0xb2,0x13,0x74,0x36,0x3f,0x1d,0x74,0x9c,0x67,0x82, +0xce,0x59,0xf3,0x83,0x4e,0x39,0x78,0xfe,0xed,0xa0,0x33,0x13,0xb6,0xec,0x0e,0x3a, +0xfb,0xe0,0x52,0x33,0x01,0xf7,0x07,0xf6,0x1f,0x72,0x27,0xe2,0x36,0x2f,0x11,0xc1, +0x6f,0x95,0x08,0xe7,0xea,0x94,0x88,0xdc,0x09,0x2d,0x7b,0xc1,0x9b,0x47,0x9c,0xd7, +0xfc,0xe1,0xff,0xd5,0xbc,0xe1,0xdf,0x3a,0x5f,0xf8,0x44,0xe7,0x09,0x1f,0x6f,0x7e, +0xb0,0x7f,0xde,0x6f,0x5e,0xf3,0x7d,0xbd,0xf9,0xbd,0xfe,0x79,0xbd,0xde,0x3c,0x5e, +0x6f,0xde,0x6e,0x5e,0xf3,0x75,0xbd,0x79,0xba,0xde,0xfc,0x5c,0x6f,0x5e,0xae,0x37, +0x1f,0xd7,0x3f,0x0f,0xd7,0x9b,0x7f,0xeb,0xcd,0xbb,0xf5,0xe6,0xdb,0x7a,0xf3,0x6c, +0xbd,0xf9,0xb5,0x79,0xcd,0xab,0xf5,0xcf,0xa7,0xf5,0xe6,0xcd,0x7a,0xf3,0x63,0xbd, +0x79,0xaf,0xde,0x7c,0x57,0xff,0xfc,0xd6,0x93,0x9d,0xcf,0xea,0xcd,0x63,0xf5,0xe6, +0xa7,0xfa,0xe7,0xa5,0xfa,0xe7,0xa1,0xfe,0xd6,0xf9,0xa6,0xfe,0xf9,0xa3,0xde,0x7c, +0xd1,0x93,0x9d,0x17,0xea,0xcd,0x07,0xf5,0xcf,0xef,0xf4,0xe6,0x73,0x9e,0xec,0xbc, +0x4d,0x6f,0xbe,0xa6,0x7f,0x9e,0xa5,0x37,0xaf,0xf2,0x8f,0x9e,0x4f,0xe9,0xcd,0x8f, +0x3c,0xde,0xbc,0x47,0x6f,0xbe,0x63,0x5e,0xf3,0x18,0xbd,0x79,0x8b,0x27,0x3a,0x4f, +0xd1,0x9b,0x9f,0xe8,0x9f,0x5f,0xe8,0xcd,0x27,0xcc,0x6b,0xde,0xa0,0x37,0x5f,0xd0, +0x3f,0x0f,0xd0,0x9b,0xff,0xe7,0xcd,0xf7,0x3b,0xd1,0xf9,0x7d,0xde,0x3c,0x3d,0x6f, +0x7e,0x9e,0x7f,0x5e,0xde,0xc9,0xce,0xc3,0xf3,0xe6,0xdf,0xe5,0x35,0xef,0xce,0x3f, +0xcf,0xce,0x3f,0x6f,0xce,0x9b,0x17,0xe7,0xcd,0x7f,0xf3,0xe6,0xaf,0x79,0xf3,0xd6, +0xbc,0x79,0x6a,0xde,0xfc,0x34,0x6f,0x5e,0x9a,0x37,0x1f,0xcd,0x9b,0x87,0xe6,0xcd, +0x2f,0xfb,0xbb,0xcd,0x1f,0xfb,0xa3,0xe7,0x8b,0x79,0xf3,0xc3,0xbc,0xf9,0x60,0xfe, +0x79,0x60,0xde,0xfc,0x2f,0xff,0x3c,0xae,0x93,0x9d,0x9f,0x95,0xd7,0xbc,0xac,0xe3, +0xcd,0xa7,0xf2,0xe6,0x4f,0x79,0xf3,0xa4,0xbc,0x79,0x4b,0xde,0x7c,0x24,0x6f,0x3e, +0x91,0x37,0x5f,0xc8,0x9b,0xff,0xe3,0xcd,0xfb,0xf1,0xe6,0xed,0x78,0xf3,0x71,0x4e, +0x74,0x1e,0x8e,0x37,0xcf,0xc6,0x9b,0x5f,0xe3,0xcd,0xab,0xf9,0xad,0xf3,0x68,0xfe, +0xaa,0xf3,0x67,0xf2,0x9a,0x27,0xf3,0x77,0x9f,0x0f,0x73,0xb2,0xf3,0x60,0xfe,0xa8, +0xf9,0x2f,0xc7,0x9b,0xf7,0x72,0xa2,0xf3,0x5c,0x8e,0x37,0xbf,0xe5,0x7f,0x35,0xaf, +0x25,0xaf,0xf9,0x2c,0x79,0xcd,0x5f,0xf1,0xcf,0x5b,0xf9,0xb3,0xe7,0xab,0x78,0xf3, +0x54,0xbc,0xf9,0x29,0xde,0xbc,0x14,0x6f,0xde,0x89,0x37,0xdf,0x24,0xaf,0xf9,0x24, +0xde,0xfc,0x11,0x6f,0xde,0x88,0x37,0x4f,0xc4,0x9b,0x17,0xe2,0xcd,0xf3,0xf0,0xe6, +0x77,0xf8,0xe7,0x75,0xf8,0xe7,0x73,0x78,0xf3,0x34,0xbc,0xf9,0x19,0xc7,0x9b,0x87, +0xe1,0xcd,0xb7,0xf0,0xe6,0x59,0x78,0xf3,0x2b,0xbc,0x79,0x15,0xde,0x7c,0x8a,0xe3, +0xcd,0xa3,0xf0,0xcf,0x97,0xf8,0x6f,0xcd,0x8f,0xf8,0xbd,0xf3,0x1b,0xfe,0x5b,0xf3, +0x1a,0xfc,0xf3,0x16,0xbc,0xf9,0x0a,0xde,0x3c,0x85,0xbf,0xca,0xfc,0x04,0xff,0xbc, +0x84,0x93,0x9d,0x8f,0x70,0xb2,0xf3,0x10,0xc2,0xf3,0x0f,0x8e,0x3d,0xff,0x20,0xaf, +0x79,0x06,0xc7,0x9b,0x57,0xf0,0x7b,0xe7,0x13,0x1c,0x6f,0xde,0x40,0x5e,0xf3,0x05, +0x8e,0x37,0x4f,0x20,0xaf,0xf9,0x01,0xde,0xbc,0x00,0xff,0x7c,0x00,0x6f,0xdc,0xdf, +0x1b,0xdf,0xf7,0xc6,0xf5,0xbd,0x71,0x7c,0x6f,0x7c,0xde,0x1b,0x8f,0xf7,0xc6,0xdb, +0xfd,0xe3,0xec,0xde,0xf8,0xba,0x37,0x9e,0xee,0x8d,0x9b,0x1f,0x6f,0x5c,0xdc,0x1b, +0xdf,0x3e,0xd9,0x71,0xed,0x93,0x1d,0xa7,0xf6,0xc6,0xa7,0xbd,0x71,0x67,0x6f,0xbc, +0xf9,0x44,0xc7,0x95,0xbd,0xf1,0x60,0x6f,0x1c,0xd8,0x1b,0xff,0xf5,0xc6,0x73,0xfd, +0xe3,0xb7,0xfe,0xf1,0x57,0x6f,0xdc,0xd5,0x1b,0x47,0xf5,0xc6,0x4f,0xbd,0xf1,0x50, +0x6f,0x1c,0xd4,0x1b,0xcf,0xf4,0xc6,0x2f,0xfd,0xe3,0x8f,0xde,0xf8,0xe2,0x89,0x8e, +0x2b,0x7a,0xe3,0x85,0xde,0x38,0xa1,0x7f,0x3c,0xd0,0x3f,0xce,0xe7,0x8d,0xef,0x79, +0xe3,0x7a,0xde,0x38,0x9e,0x37,0x6e,0xe7,0x8d,0xcf,0xf9,0xc7,0xe1,0xbc,0x71,0x35, +0xff,0x78,0x9a,0x37,0x4e,0xe6,0x8d,0x8f,0xe5,0x35,0xce,0xe5,0x8d,0x63,0xe5,0x35, +0x6e,0xe5,0x8d,0x43,0xe5,0x39,0xfe,0xa4,0x71,0x27,0x6f,0x7c,0xc9,0x3f,0xae,0x74, +0xb2,0xe3,0x42,0xde,0x78,0x50,0x5e,0xe3,0x40,0xfe,0x71,0x1e,0x6f,0x7c,0xc7,0x1b, +0xd7,0xf1,0xc6,0x73,0xbc,0x71,0x9c,0x13,0x1d,0xbf,0x39,0xde,0xb8,0x8d,0x37,0x5e, +0x93,0xd7,0xf8,0xcc,0x5f,0x6d,0x3c,0xe6,0xdf,0x36,0x6e,0x72,0xbc,0xf1,0x0f,0x6f, +0x5c,0xc3,0x1b,0xcf,0xf0,0xc6,0x31,0xfc,0xe3,0x17,0xde,0xb8,0x85,0x7f,0x9c,0xc2, +0x1b,0x97,0xf0,0xc6,0x23,0xfc,0xe3,0x10,0xde,0xf8,0x83,0x37,0xee,0xe0,0x8d,0x37, +0xfc,0xd6,0x71,0x06,0x6f,0x7c,0xc1,0x1b,0x57,0x08,0x8f,0x27,0xb8,0xe3,0x09,0xbf, +0x7b,0x1c,0xc1,0xac,0x3d,0x0b,0xf9,0xc1,0xfb,0x0c,0xbb,0x10,0x14,0x76,0x5f,0x65, +0x98,0x25,0x16,0x1d,0x7e,0x9e,0x3b,0xe6,0x27,0x70,0x2c,0x54,0x84,0xaa,0xee,0xcf, +0x61,0xf3,0x53,0xd7,0x89,0x07,0xb3,0xa6,0x49,0x2d,0xa8,0xad,0x75,0x4d,0x3a,0x69, +0x3c,0xe2,0x5a,0xb8,0x01,0xc6,0xc2,0x4d,0xc0,0x4f,0x3f,0x67,0x0a,0x3c,0x0e,0x4f, +0x6b,0x9c,0xc2,0x3c,0xc2,0x3f,0x0f,0x2f,0xc0,0x4c,0x98,0x0d,0x2f,0x6a,0xec,0xe2, +0x25,0x58,0xa0,0xf1,0x8b,0x57,0x34,0x86,0xb1,0x41,0x63,0x18,0xdf,0x6b,0x0c,0x63, +0x01,0x59,0x7a,0x05,0x96,0xc1,0x5a,0x58,0xa7,0x31,0x89,0xcf,0x34,0x0e,0xb1,0x57, +0x6b,0x98,0x64,0x5b,0xe3,0x10,0x66,0xfc,0xe1,0x7a,0x8d,0x3b,0xdc,0x68,0xad,0x53, +0x32,0xce,0x1a,0x73,0x30,0xe3,0x0d,0xdf,0x69,0xbc,0x61,0x8c,0xc6,0x1b,0x12,0x35, +0xc6,0x70,0x2b,0xdc,0x01,0xe3,0xb5,0x0e,0xc9,0x22,0xad,0x41,0xb2,0x44,0xeb,0x90, +0xbc,0xa6,0x75,0x48,0x96,0x5b,0x6b,0x90,0x98,0x71,0x08,0x27,0x8a,0x7f,0x90,0x0f, +0x62,0xa0,0x00,0x14,0x84,0x42,0x50,0x38,0xca,0x5d,0x9b,0xa4,0x34,0x94,0xd1,0x3a, +0x24,0x66,0x0d,0x92,0x2b,0xa1,0x0f,0xf4,0xb3,0xd6,0x1f,0x31,0x6b,0x8e,0x7c,0x0c, +0x9f,0x68,0xdd,0x91,0xcf,0xb4,0xde,0xc8,0x17,0x5a,0x6f,0xe4,0x2b,0xad,0x33,0x62, +0xc6,0x2c,0x8a,0x58,0xeb,0x89,0x24,0x68,0x9c,0xe2,0x69,0x6b,0xed,0x90,0xdd,0x1a, +0xa3,0xf8,0xce,0x5a,0x27,0xe4,0xe7,0x68,0x77,0x7d,0x10,0x6f,0x5d,0x10,0x6f,0x3d, +0x10,0x6f,0x1d,0x90,0x04,0x8d,0x53,0x98,0x35,0x40,0x2e,0xd3,0x58,0x85,0x19,0x97, +0x78,0x09,0xd6,0xc3,0x56,0xad,0xef,0x11,0x61,0xad,0xe5,0xe1,0xad,0xe1,0xd1,0x40, +0x6b,0x76,0x78,0x6b,0x75,0xb4,0xd1,0x58,0x85,0x59,0x97,0xe3,0x72,0x6b,0xed,0x8d, +0xb1,0x1a,0xa3,0xb8,0x47,0x63,0x13,0xde,0x98,0x84,0xb7,0xb6,0xc6,0x52,0xad,0xa5, +0xb1,0xda,0x5a,0x3f,0xc3,0x5b,0x37,0x63,0xb3,0xd6,0xcb,0x30,0x6b,0x65,0x7c,0x0d, +0xdf,0xc0,0x8f,0xd6,0x3a,0x19,0x01,0x6b,0x6d,0x8c,0x22,0x1a,0xa3,0xa8,0xa2,0xb1, +0x89,0x54,0x8d,0x49,0x78,0x6b,0x5f,0x34,0xd0,0x9a,0x17,0x2d,0xac,0x75,0x2e,0xbc, +0xf5,0x2d,0xb2,0x35,0x4e,0x61,0xd6,0xb3,0x18,0xaa,0x35,0x2d,0xbc,0xb5,0x2c,0xc6, +0x6b,0xac,0xe2,0x59,0x8d,0x51,0xcc,0xb5,0xd6,0xab,0x58,0xaa,0xf5,0x29,0xbc,0x75, +0x29,0xd6,0x58,0x63,0x15,0x5b,0xb5,0x06,0xc5,0x7e,0x6b,0xfd,0x09,0x6f,0xdd,0x89, +0x90,0xc6,0x2d,0x4a,0x68,0xbc,0x22,0x49,0xe3,0x14,0xde,0xba,0x12,0xf5,0xad,0x35, +0x24,0x9a,0x68,0xed,0x08,0x6f,0xcd,0x08,0x6f,0xad,0x88,0xce,0x5a,0x23,0xa2,0xa7, +0xb5,0x1e,0xc4,0x58,0x8d,0x5b,0xdc,0xad,0xf1,0x0a,0x6f,0x9c,0xe2,0x09,0x8d,0x4f, +0xbc,0xa0,0x75,0x1e,0xbc,0xf5,0x1d,0x96,0x6b,0x5d,0x87,0x35,0xd6,0x5a,0x0e,0x66, +0x1d,0x87,0x03,0x70,0x10,0x0e,0x15,0x38,0xb2,0x96,0x83,0xb7,0x86,0x43,0x61,0x8d, +0x61,0x54,0xb1,0xd6,0x69,0x68,0xa0,0xf5,0x19,0x9a,0x6b,0x5d,0x86,0x8b,0x34,0x7e, +0xd1,0x4d,0xeb,0x2f,0x0c,0x83,0xe1,0x70,0x83,0xb5,0xf6,0xc2,0x9d,0x1a,0xc3,0x78, +0x56,0x63,0x17,0xde,0xda,0x0a,0xcb,0xb5,0x66,0xc2,0x5b,0x5a,0x2b,0xc1,0x1b,0xc3, +0xd8,0xaa,0xb5,0x11,0xf6,0xab,0x63,0x0b,0x6a,0x0c,0xa3,0xb8,0xd6,0x3c,0xa8,0xab, +0x35,0x0e,0x1a,0x6b,0x6d,0x83,0x96,0xd6,0x38,0x46,0x37,0xad,0x5b,0xe0,0xad,0x53, +0x30,0x56,0xe3,0x17,0x73,0xac,0x31,0x0b,0x6f,0x2d,0x82,0x75,0xd6,0xfa,0x03,0x3b, +0xb4,0xee,0x40,0xc0,0x5a,0x6b,0xc0,0xac,0x33,0x50,0x5f,0xe3,0x19,0x66,0x6d,0x81, +0x56,0x1a,0xcb,0xf0,0xc6,0x30,0x6e,0xb7,0xc6,0x2d,0xbc,0x75,0x03,0x5e,0xb4,0xc6, +0x2c,0xbc,0x35,0x02,0xd6,0x6a,0xcc,0xc2,0x5b,0x13,0xe0,0x0c,0xad,0x03,0x90,0xa6, +0x75,0x00,0x6a,0x6a,0x1d,0x80,0x5a,0x5a,0x0b,0xa0,0x99,0xbe,0xfd,0xf7,0xbe,0xf9, +0x1f,0xab,0x6f,0xfe,0xc7,0xe9,0x5b,0x7f,0xf3,0x9d,0xff,0x22,0x7d,0xe3,0xbf,0x02, +0xde,0xd6,0x58,0x47,0x9c,0xf5,0x5d,0xbf,0xf7,0x3d,0x7f,0x6d,0x7d,0xc7,0x5f,0x5f, +0xdf,0xe9,0x5f,0xac,0xef,0xf3,0xbb,0xea,0xbb,0xfb,0xab,0xac,0x6f,0xed,0xc7,0xea, +0x1b,0x7b,0xef,0xdb,0x7a,0xf3,0xed,0xfc,0xa3,0xd6,0x98,0x87,0x19,0xef,0x68,0xae, +0xf1,0x0c,0x6f,0x1c,0xa3,0x8b,0xc6,0x2f,0x26,0x68,0xdc,0x62,0xbe,0x35,0x56,0xb1, +0x52,0x63,0x14,0xc5,0x35,0x36,0x61,0xbe,0x6b,0xef,0xa2,0xf1,0x89,0x09,0x1a,0x9f, +0x30,0x63,0x13,0x4e,0x49,0x77,0x6c,0x62,0xa4,0xc6,0x24,0x1e,0xd2,0x98,0x84,0x19, +0x7f,0x28,0xac,0xef,0xd5,0xcb,0xe9,0xfb,0xf4,0x54,0x8d,0x43,0x5c,0xa0,0x71,0x88, +0xfe,0xff,0x57,0xd9,0xb9,0x40,0x47,0x59,0x98,0x69,0x78,0x26,0x4c,0x92,0x49,0xc2, +0x25,0x56,0x11,0xaf,0x88,0x82,0x02,0xa2,0x24,0x87,0x84,0x8b,0x5c,0xe3,0x0a,0xca, +0xd9,0x2e,0x27,0x41,0x2b,0x95,0x65,0x95,0xb8,0x8a,0x56,0x6a,0x0b,0xd5,0x54,0xad, +0x5a,0x8c,0xa0,0x45,0x50,0x2c,0xa7,0xab,0xed,0xd1,0xe2,0x82,0x6b,0xbd,0x50,0x45, +0xc2,0xa2,0xd6,0xae,0x0a,0x51,0xcb,0x6a,0xab,0x14,0x14,0xad,0xbb,0x5a,0x05,0xb4, +0xed,0x52,0x95,0xca,0x4d,0x91,0x9b,0xd9,0xf7,0x9b,0xff,0xf9,0x92,0x2f,0x63,0x50, +0x3b,0x39,0x6f,0x12,0x26,0x21,0x33,0xf9,0x33,0x13,0x7e,0xde,0xef,0x7d,0x9f,0x8f, +0x1e,0x7a,0x23,0xfd,0x73,0xef,0x9d,0xaf,0x0a,0x5d,0x73,0xeb,0x99,0xbf,0x26,0xbd, +0x15,0xfa,0xe5,0xd6,0x2d,0xdf,0x26,0xa5,0x8e,0x48,0xfa,0xe5,0x5d,0xe9,0x95,0xf7, +0x62,0x3e,0x71,0x33,0x73,0x89,0xa5,0x61,0x26,0x91,0xa2,0x23,0xde,0x9b,0x6e,0x78, +0x7f,0x3a,0xe1,0xde,0x05,0xb7,0x1e,0x78,0x8d,0x34,0x96,0x2e,0xf8,0x4c,0x66,0x15, +0x4d,0x74,0xbe,0xdf,0x61,0x56,0xd1,0x83,0x8e,0xb7,0x75,0xbb,0x7b,0x86,0x2e,0xf7, +0x79,0xa1,0xbf,0xed,0xbd,0xed,0x69,0xf4,0xb5,0xaf,0x0c,0x1d,0x6d,0xeb,0x67,0x2f, +0xa1,0x97,0x9d,0xa2,0x7b,0x5d,0x1d,0xba,0xd6,0x23,0x42,0xbf,0xda,0x7b,0xd5,0x75, +0xf4,0xa8,0x1b,0xe8,0x51,0xcf,0xa6,0x2f,0xfd,0x00,0x3d,0x69,0xef,0x47,0x3f,0x1a, +0x3a,0xd0,0x5b,0xe8,0x3e,0x6f,0x0d,0x7d,0x67,0xeb,0x3a,0xef,0x3f,0x3a,0xe9,0x36, +0x57,0xd3,0x69,0x1e,0xc1,0xec,0x64,0x21,0xb3,0x11,0xeb,0x27,0x6f,0xa0,0x9f,0xec, +0xbd,0xe4,0xbf,0x86,0x2e,0xb2,0x77,0x90,0x3f,0x0d,0x73,0x12,0xeb,0x10,0xef,0x63, +0x06,0x72,0x04,0xb3,0x8f,0xf1,0xcc,0x3c,0x26,0x87,0x39,0xc7,0x54,0xe6,0x1b,0x36, +0xdb,0x78,0x86,0xb9,0xc6,0x6a,0x66,0x1b,0x36,0xd7,0x58,0xcb,0x5c,0xc3,0x66,0x1a, +0x6f,0x33,0xd3,0xd8,0xca,0x4c,0xc3,0xe6,0x19,0x07,0x38,0x39,0x2a,0x93,0xba,0x4a, +0xdd,0xa4,0x72,0xa9,0x9f,0xd4,0x5f,0x3a,0x59,0x1a,0x20,0x9d,0x22,0x9d,0x2a,0x0d, +0x94,0x2a,0xa4,0x4a,0x69,0xb0,0x34,0x56,0x1a,0x27,0x4d,0x95,0xea,0xa5,0x4b,0xa4, +0x4b,0xa5,0x6f,0x49,0x97,0x49,0xd3,0xa5,0x99,0xcc,0x4b,0x1a,0xa4,0x6b,0xa5,0xeb, +0x99,0x9b,0x34,0x4a,0xf3,0xa5,0xdb,0x98,0xa1,0x2c,0xa1,0x6b,0x9c,0x62,0x8e,0xd2, +0x89,0x39,0x4a,0x96,0x59,0xca,0x61,0xcc,0x51,0x0e,0x67,0x86,0xd2,0x93,0xf9,0xc9, +0x89,0xcc,0x4f,0xfa,0x32,0x3f,0xe9,0xcf,0x0c,0xc5,0x67,0x27,0xc3,0x99,0x95,0xd4, +0x30,0x2b,0xf9,0x47,0xe6,0x24,0x75,0xcc,0x4a,0xe6,0x49,0x0b,0xa5,0xaf,0x9d,0xa0, +0x7f,0x97,0xa4,0xc3,0xa4,0x21,0x3a,0x51,0xbc,0x4e,0xba,0x53,0xfa,0xa9,0x54,0xd3, +0x47,0x9f,0x2b,0xdd,0x22,0x2d,0x92,0xde,0x97,0x1e,0xd1,0x89,0xe4,0x32,0x3b,0x99, +0xec,0x27,0xf5,0xd7,0xbf,0x9f,0x3a,0xa9,0xfc,0x19,0x27,0x96,0x95,0x52,0xbd,0xf4, +0x67,0xe6,0x2b,0x1f,0x31,0x5f,0xd9,0xc3,0x49,0x67,0xdf,0x30,0x53,0x99,0x11,0xfa, +0xc4,0x4b,0x98,0xa3,0x34,0x31,0x3f,0x69,0x66,0x6e,0xb2,0x9e,0x79,0xc9,0x26,0x4e, +0x58,0x1b,0xa5,0x9f,0xdb,0x89,0x6b,0x85,0x9e,0xb7,0x15,0xc9,0x09,0x6c,0x9a,0x39, +0x4a,0x96,0xd9,0xc9,0xc9,0x74,0x85,0x2b,0x99,0xa1,0x0c,0x61,0x86,0x32,0x8a,0x99, +0xc9,0x5d,0xcc,0x4c,0x6c,0x5e,0xb2,0x84,0x39,0x89,0xf7,0x7f,0x0b,0x99,0x8b,0x2c, +0x94,0x9a,0x99,0x89,0x1c,0x3b,0x48,0x0f,0x15,0xa9,0x4e,0xaa,0x97,0xae,0x97,0x6e, +0x90,0x56,0x48,0xcd,0xd2,0xcb,0xd2,0x7a,0xe9,0xea,0x2a,0x1d,0x3b,0xe9,0x1d,0x69, +0x93,0xd4,0x52,0x95,0xcc,0x52,0x9a,0x99,0xa5,0xd8,0x49,0xf4,0x42,0xe6,0x27,0x5d, +0x98,0x93,0xd4,0xd0,0xed,0xbd,0x92,0x7e,0xef,0x2c,0xe6,0x22,0xff,0xce,0x3c,0xc4, +0xba,0xbb,0x3b,0xec,0x84,0x9b,0x39,0x88,0xcd,0x3b,0xe6,0x49,0xcf,0x31,0xd7,0xf0, +0x7e,0xad,0xf7,0x6a,0xbd,0x4f,0x7b,0x22,0xdd,0xd9,0x7e,0x74,0x67,0x2b,0xa5,0x61, +0xcc,0x32,0x1a,0xe8,0xd0,0x5a,0x5f,0xf6,0xf7,0xf4,0x64,0x77,0x84,0x2e,0xac,0xf5, +0x5f,0x07,0xd2,0x7b,0xb5,0xce,0xeb,0x54,0xba,0xae,0x73,0x42,0xaf,0xf5,0x09,0xfa, +0xac,0x4f,0xd3,0x63,0xb5,0xb9,0xc6,0x3b,0xa1,0xaf,0x9a,0xa2,0x8f,0x5a,0x41,0x0f, +0xb5,0x8a,0xfe,0x69,0x4d,0xe8,0x9c,0xfe,0x53,0xe8,0x99,0xfe,0x4b,0xe8,0x8e,0x36, +0x85,0x9e,0xe8,0xe3,0xf4,0x43,0x7f,0x4d,0x2f,0xb4,0x39,0x74,0x41,0xdf,0xa2,0xeb, +0xf9,0xb7,0xd0,0xe3,0x2c,0x61,0x3e,0xd1,0x8b,0xb9,0x84,0xcd,0x24,0xa6,0x33,0x7b, +0xf0,0x0e,0xa6,0x77,0x2f,0xbd,0x6b,0x69,0x73,0x88,0x26,0xe6,0x0f,0xf6,0x1f,0x94, +0x99,0xcc,0x1c,0x0e,0x0d,0x3d,0x4a,0x9b,0x35,0xf4,0x67,0xd6,0x30,0x2c,0xcc,0x17, +0xce,0x60,0xae,0x50,0xc7,0x5c,0x61,0x34,0x73,0x85,0x9f,0x30,0x4f,0x38,0x40,0x4f, +0xb2,0x9c,0x9e,0x64,0xa5,0x54,0x27,0x4d,0x94,0xce,0x96,0xbe,0x21,0x9d,0x2b,0x4d, +0x92,0xa6,0x4a,0xf5,0xd2,0xbf,0x4a,0x17,0x4b,0xdf,0x92,0x2e,0x93,0xbe,0x4d,0x97, +0xd2,0xe6,0x11,0x2d,0x52,0xba,0x45,0x3f,0x73,0xa9,0x48,0x2a,0x93,0x3a,0x4b,0x5d, +0xa4,0xae,0x2d,0x49,0xc7,0xf2,0x28,0xe9,0x68,0x7a,0x96,0x23,0x98,0x5b,0x4c,0x61, +0x6e,0xf1,0x1c,0xf3,0x88,0x57,0x99,0x43,0x6c,0x92,0xde,0x95,0xfe,0x2c,0x6d,0x91, +0xf6,0x30,0x97,0xe8,0xc2,0x3c,0x62,0x24,0x73,0x88,0x3a,0xe6,0x0f,0xb6,0x68,0x2a, +0x2d,0x15,0x48,0xc5,0xd2,0xd0,0x74,0x32,0x8f,0x58,0x20,0x2d,0x94,0x96,0x48,0xeb, +0x43,0x6f,0x72,0x09,0x5d,0xc9,0xcd,0xcc,0x27,0x4e,0x65,0xfe,0x70,0x15,0xf3,0x87, +0xc5,0xcc,0x1d,0x52,0xf4,0x1c,0x9b,0x98,0x2f,0xa4,0x98,0x2b,0xcc,0x60,0x1e,0x50, +0xc3,0x1c,0x20,0x15,0x3c,0xfe,0xa1,0xc1,0xd7,0xff,0xa6,0xf4,0x20,0x5e,0xbe,0xf9, +0xf8,0xfb,0xa4,0xe3,0xf0,0xf0,0xc7,0xe0,0xdd,0x3f,0x2d,0xbd,0x5a,0x92,0xf4,0x05, +0x0b,0xe9,0x09,0x96,0xe3,0xdb,0x1f,0x49,0x2f,0xd0,0xfa,0x80,0x35,0x52,0x1d,0xfe, +0x7d,0x33,0xfd,0xbf,0x0f,0xf0,0xeb,0x4f,0xc3,0xaf,0x3f,0x4f,0xba,0x46,0xba,0x4b, +0x5a,0x8a,0x57,0xdf,0x88,0x47,0xbf,0x17,0x8f,0xbe,0x0f,0x5d,0xbf,0xfa,0xae,0x89, +0xf7,0x6e,0x3d,0xbd,0x65,0xf8,0xef,0x29,0x7c,0x75,0xeb,0xdc,0x4d,0xc4,0x53,0xdf, +0xd4,0xad,0xad,0x57,0x57,0x40,0x8f,0xee,0x2c,0xe9,0x6c,0xba,0x74,0x37,0xd0,0x8f, +0x5b,0x49,0x17,0xce,0x7a,0x70,0x4f,0x49,0x6b,0xf1,0xd8,0xb7,0xd1,0x7d,0xeb,0x44, +0xe7,0xcd,0xbb,0x6e,0x43,0xf0,0xd8,0xad,0xc3,0xd6,0x40,0x7f,0x6d,0x36,0x3d,0xb5, +0xd5,0xf4,0xd2,0xd6,0x86,0x2e,0xda,0x66,0x3c,0xf6,0x43,0xe9,0x9a,0x0d,0x0a,0xfd, +0x32,0xeb,0x96,0x0d,0xa3,0x57,0xd6,0x18,0x7c,0xf6,0x1f,0xe3,0xaf,0x37,0x85,0xae, +0xd8,0x7b,0x74,0xc4,0x52,0x74,0xc3,0x0a,0xf1,0xda,0x0f,0xc5,0x63,0x1f,0x84,0xb7, +0x3e,0x02,0x5f,0xdd,0xbb,0x5e,0x67,0xd1,0xf1,0xaa,0x0b,0xbd,0xae,0x4b,0xe8,0x71, +0xa5,0xe8,0x49,0xd5,0xd0,0x8f,0x1a,0x17,0x3a,0x51,0xe7,0x87,0x1e,0x54,0x23,0xbd, +0xa7,0x5f,0x87,0xae,0xd3,0xea,0xd0,0x6f,0xfa,0x0d,0x7d,0xa6,0x46,0xfa,0x4b,0x4f, +0xd2,0x5b,0xf2,0xbe,0xd2,0xb3,0xf4,0x94,0x52,0xf4,0x92,0x46,0x84,0x2e,0x92,0xf5, +0x90,0x4e,0xa7,0x7f,0x54,0x8f,0xef,0xfe,0x70,0xe8,0x1c,0x3d,0x4a,0xd7,0xe8,0x89, +0xd0,0x2f,0x6a,0xc6,0x8f,0x3f,0x96,0xde,0xd0,0x09,0xa1,0x2b,0x54,0x89,0x37,0x5f, +0x11,0x7a,0x40,0x23,0xf0,0xe9,0xcd,0xa3,0x77,0x6f,0xbe,0x3b,0x9e,0xfc,0x50,0xba, +0x3d,0xa3,0x42,0x9f,0xc7,0xfa,0x3a,0x63,0xe9,0xec,0x2c,0xc1,0x9b,0x7f,0x8d,0x6e, +0xce,0x1f,0x43,0x1f,0xc7,0x7b,0x37,0xc5,0x52,0x09,0x1e,0x7d,0x15,0x7d,0x1b,0xeb, +0xd9,0x8c,0x09,0x1d,0x9b,0x89,0x74,0x6b,0x26,0xe3,0xd9,0xcf,0x0f,0x3d,0x9a,0xbb, +0xcd,0xaf,0x3f,0x2a,0xf1,0xea,0x4b,0xe9,0xba,0x0c,0xa3,0xdf,0x62,0x7d,0x96,0x99, +0xf4,0x58,0xbc,0xbf,0xe2,0xbd,0x15,0xef,0xab,0xa4,0xf0,0xef,0xcb,0xe8,0xa7,0x78, +0x2f,0x65,0x4c,0xe8,0xa2,0xd4,0xe1,0xe5,0x5f,0x8a,0x87,0xbf,0x90,0xae,0xc9,0x9d, +0xa1,0x5f,0xe2,0xbd,0x92,0x4d,0xf4,0x45,0xac,0x2b,0x62,0x1e,0x7d,0xb3,0xf4,0xba, +0xf4,0xb6,0xb4,0x59,0x6a,0x39,0x2e,0xf1,0xeb,0x67,0xe2,0xd7,0x9b,0x47,0x5f,0x59, +0x9d,0x78,0xf2,0xe6,0xc3,0xd7,0xd0,0xb3,0xf8,0x2e,0xfe,0xbb,0x75,0x2a,0x3e,0xc6, +0x83,0xb7,0x3e,0xc5,0x50,0x7a,0x14,0x53,0xf0,0xe1,0xcd,0x83,0xaf,0xc1,0x53,0xf7, +0x0e,0xc4,0x8f,0xf1,0xd4,0xcd,0x4f,0x7f,0x37,0x74,0x1d,0xb6,0xe1,0xa1,0xa7,0x6e, +0x91,0x16,0x24,0xfe,0x78,0x1d,0x3e,0xb8,0x79,0xe0,0x29,0xbc,0xef,0x46,0x3c,0xef, +0x45,0x74,0x10,0x16,0x4b,0x4b,0xcc,0xff,0xb6,0x25,0x6e,0xaf,0xa4,0x53,0xfd,0xe9, +0x1c,0x4c,0x97,0xae,0xa4,0x6f,0x30,0x87,0xbe,0xc1,0x6d,0xf4,0x0d,0x1e,0xb5,0xc5, +0x93,0xaf,0x26,0x9d,0x83,0x71,0xd2,0x26,0xeb,0x1d,0x6c,0xd0,0xf7,0xb6,0x21,0xf1, +0xd1,0x27,0xe1,0x9f,0xbb,0x6f,0xbe,0x14,0xbf,0xdc,0x7d,0x72,0xf3,0xc8,0x8b,0xf1, +0xc6,0x0f,0xc7,0x13,0x1f,0x81,0x17,0xee,0x1e,0xb8,0xf9,0xdf,0xe6,0x7d,0xbf,0x85, +0xe7,0xdd,0x1d,0xaf,0xbb,0x16,0x8f,0x7b,0x1e,0xde,0xf6,0xf3,0x78,0xda,0xd6,0x03, +0xc8,0x2d,0x4a,0x7a,0x53,0xc7,0x91,0x1e,0xc0,0x77,0xe8,0x00,0x5c,0x45,0x07,0xe0, +0x66,0x7a,0x00,0xd6,0x01,0x48,0x91,0xed,0x3f,0x9a,0x4c,0xff,0x49,0x78,0xdd,0x95, +0x78,0xdd,0x35,0xf8,0xdc,0xcd,0x64,0xf2,0x2d,0x8f,0xdf,0xf2,0x6e,0xe2,0x37,0xbf, +0x40,0xae,0x3d,0x45,0x9e,0xdd,0x73,0xec,0x17,0x48,0xdf,0xfb,0x50,0x8f,0xfd,0xad, +0x89,0xff,0x5c,0x88,0xef,0xdc,0x27,0x78,0xcd,0xd5,0xc1,0x5f,0xfe,0x87,0xe0,0x29, +0xbb,0x97,0x3c,0x31,0xf8,0xc7,0x93,0x83,0x67,0xec,0x5e,0xb1,0x7b,0xc4,0x97,0xe3, +0x0d,0xff,0x20,0xf8,0xc1,0xb7,0xe2,0x03,0xdf,0x8f,0xff,0xbb,0xcd,0xfc,0xdf,0x6d, +0xfa,0x9e,0xa4,0x25,0xd2,0x0a,0xe9,0x59,0xe9,0x15,0x5b,0xbc,0xb7,0x5d,0xcf,0x0b, +0xa9,0x5c,0xaa,0x90,0x2a,0xa5,0xe9,0xd2,0x4c,0x69,0x99,0xf4,0x17,0xfb,0xd8,0x0e, +0x1d,0x07,0xa9,0x4e,0xaa,0x97,0x52,0x3b,0xf5,0xb3,0xfe,0x44,0x5f,0x57,0x4a,0xed, +0xd6,0x6d,0x4a,0x9b,0x24,0x5b,0x90,0x5a,0x2e,0xd5,0x49,0xf5,0xd2,0x42,0xa9,0xc9, +0x96,0xa6,0xee,0x49,0xa7,0xae,0x95,0xd6,0x4a,0xf5,0x7b,0xf5,0xb5,0xa5,0x6b,0xa4, +0x46,0x69,0xa1,0xd4,0x24,0x35,0x4b,0xeb,0x6d,0xa1,0xd8,0xbe,0x74,0xea,0x8e,0x7d, +0x49,0xfe,0x3d,0xb7,0xf8,0xf7,0xc1,0x82,0x54,0xcd,0xaf,0x12,0xbf,0xda,0xbc,0x6a, +0xf3,0xa7,0xcd,0xa8,0x4d,0xa7,0xba,0xea,0xbf,0x54,0x5d,0x13,0xf3,0x24,0x95,0x98, +0x11,0xd9,0x83,0x78,0xd4,0x47,0x27,0xff,0xc5,0x6b,0xf5,0xa8,0x6d,0x5d,0xf1,0x89, +0xd2,0xc9,0x79,0x1e,0x75,0x05,0xcc,0x6d,0xf3,0xa8,0x6b,0xc8,0xcb,0xd7,0x93,0x97, +0x9f,0x25,0xdd,0x84,0x47,0xbd,0x38,0x78,0xd4,0xf7,0x27,0xa7,0xb1,0x39,0x8f,0xfa, +0x11,0x3c,0xea,0xe5,0xd2,0x0a,0x69,0x65,0xf0,0xa8,0x9f,0x0c,0x1e,0xf5,0x6a,0x32, +0xf6,0x6f,0x90,0xb1,0x37,0x8f,0x5a,0xdf,0x5e,0xea,0xbf,0xc8,0xcc,0xaf,0x23,0x33, +0xbf,0x91,0xcc,0xfc,0x56,0x3c,0xea,0x96,0x82,0x84,0xb1,0x6d,0x79,0xf9,0xef,0x93, +0x93,0xff,0x61,0xf0,0xa8,0x6f,0x0e,0x1e,0xb5,0x67,0xe3,0xef,0x25,0x0f,0x6f,0x1e, +0xf5,0xec,0x8c,0xce,0xe7,0xc9,0xc3,0x5b,0x16,0x7e,0x1e,0x1e,0xf5,0xed,0x78,0xd4, +0xcf,0xe4,0x79,0xd4,0xcf,0xe1,0x51,0xaf,0x09,0x1e,0xb5,0x65,0xe5,0x77,0x49,0x85, +0x45,0xfa,0x3f,0x00,0x1e,0x75,0x69,0x9e,0x47,0xdd,0x0d,0x76,0xf6,0x31,0x64,0xe7, +0xa7,0xc2,0xc8,0x36,0x8f,0xfa,0xf2,0xc0,0xc9,0x7e,0x1d,0x26,0xb6,0x7b,0xd4,0x7f, +0x22,0x4b,0xbf,0x05,0x8f,0x7a,0x2b,0x99,0x7a,0xe3,0x60,0x77,0x09,0xdc,0xeb,0x0a, +0x58,0xd7,0xf7,0x07,0xc6,0xf5,0xfb,0xf0,0xac,0x2d,0x43,0xbf,0x27,0x78,0xd4,0xdd, +0x03,0xbf,0xda,0xb9,0xd5,0xce,0xab,0x36,0x4e,0xf5,0x68,0x72,0xf4,0x53,0xf0,0xa8, +0x2d,0x4b,0xff,0x98,0xf4,0x02,0xfc,0xe9,0x77,0xe1,0x4f,0x9f,0x96,0xe7,0x51,0xd7, +0xc0,0x95,0x76,0xa6,0x74,0x1d,0xfc,0xe8,0x0b,0xe1,0x46,0x3b,0x23,0x7a,0x0e,0x39, +0xfa,0x85,0xe4,0xe7,0x3d,0x3b,0xef,0x0c,0xe8,0x66,0x78,0xcf,0x2f,0x06,0xce,0xb3, +0x7b,0xd4,0x6f,0x93,0x9d,0x7f,0x8f,0xec,0xfc,0x4e,0x69,0x2f,0x1e,0xf5,0x01,0x3c, +0x6a,0x67,0x38,0x97,0x92,0xa3,0xef,0x47,0x7e,0xbe,0x8a,0xdc,0xbc,0x33,0x9a,0x6b, +0xe0,0x32,0x8f,0x0f,0x3c,0x66,0xcf,0xd1,0xcf,0x80,0xbd,0xdc,0x10,0x3c,0x6a,0x67, +0x2e,0x2f,0x20,0x4f,0xff,0x10,0x39,0xfa,0x95,0x81,0xab,0xdc,0x0c,0x43,0xd9,0xf9, +0xc9,0x2f,0x07,0x8f,0x7a,0x33,0x9c,0xe4,0x6d,0xc1,0xa3,0x76,0x3e,0x72,0x27,0xb2, +0xf5,0xe5,0x64,0xea,0x2b,0xc9,0xd2,0x3b,0xff,0x78,0x74,0xf0,0xa8,0xc7,0xc2,0x37, +0x76,0xb6,0xb1,0x33,0x8d,0xcf,0x27,0x5f,0x6f,0x0c,0xe3,0xab,0x83,0x47,0x3d,0x9f, +0x5c,0xfd,0x9d,0x21,0x4f,0xbf,0x98,0x0c,0xfd,0x2f,0xc9,0xce,0x3b,0x87,0xf8,0x39, +0xd8,0xc3,0x2f,0xe7,0x79,0xd4,0x3b,0xa4,0x4f,0xf3,0x3c,0x6a,0x67,0x0d,0x77,0x26, +0x67,0xdf,0x2f,0xe4,0xeb,0x6b,0x60,0x08,0x8f,0x87,0x1d,0x3c,0x89,0xac,0xfd,0x85, +0x30,0x82,0x67,0xe0,0x51,0xcf,0x0a,0x8c,0xe0,0xdb,0xc8,0xd9,0x3f,0x44,0xbe,0xde, +0x19,0xc0,0xbf,0x81,0xeb,0xfb,0x12,0x3c,0xdf,0x3f,0xe0,0x51,0x6f,0x86,0xdf,0xfb, +0x11,0x39,0xfb,0x34,0x39,0xfb,0x72,0xf2,0xf5,0x23,0xe1,0xf0,0x8e,0x85,0xbf,0xeb, +0xec,0xdd,0x5a,0xf2,0xf5,0x17,0x05,0x9e,0xee,0x1c,0x32,0xf6,0x2b,0x42,0xb6,0xde, +0x99,0xb9,0xaf,0x04,0x4e,0xee,0x46,0xd8,0xb8,0xbb,0xba,0xb4,0x31,0x71,0xab,0xe0, +0xe0,0x8e,0x21,0x67,0x6f,0xec,0xdb,0x29,0x21,0x6b,0x3f,0x3f,0xe4,0xeb,0x9d,0x6f, +0xbb,0x32,0x30,0x6d,0x3d,0x53,0xbf,0x16,0x7e,0xad,0x65,0xea,0x7b,0xc0,0xac,0xad, +0x3e,0x88,0x47,0x3d,0x8a,0xac,0xfd,0xe5,0x81,0x4d,0x7b,0x13,0x1e,0xf5,0x5c,0x72, +0xf7,0x3f,0x83,0x43,0xbb,0x06,0x8f,0xfa,0x65,0xe9,0xcd,0x6e,0x09,0x83,0xd6,0xf9, +0xb3,0xce,0x9d,0x1d,0x0e,0x6b,0x76,0x34,0x2c,0xd9,0xc9,0x64,0xf3,0xeb,0xc9,0xe2, +0x37,0x04,0x26,0xec,0x4d,0x70,0x60,0x9d,0x01,0xeb,0x8c,0xd7,0x35,0xc1,0xa3,0x1e, +0x4f,0xe6,0xde,0xf3,0xf6,0xe7,0x93,0xb1,0x5f,0x40,0xb6,0xfe,0xf1,0x90,0xa9,0x5f, +0x43,0x8e,0xbe,0x9c,0xfc,0xfc,0x3f,0xc3,0x5d,0xbd,0x9e,0xfc,0xfc,0x5d,0xe4,0xe7, +0x0f,0xe0,0x51,0x5b,0x66,0xbe,0x91,0xcc,0xfc,0x22,0x32,0xf2,0x9d,0xc9,0xc8,0x1f, +0x46,0x46,0xde,0xb8,0xa9,0x43,0xc8,0xc9,0x9f,0x43,0x4e,0x7e,0x26,0x9c,0xd4,0x95, +0x81,0x8f,0xfa,0x4c,0x60,0xa2,0xbe,0x08,0x07,0xf5,0xcd,0x3c,0x8f,0xda,0xd8,0xa7, +0x7b,0xa4,0x52,0xf8,0xa7,0x5d,0xe1,0x9e,0x5e,0x43,0x7e,0xfe,0x47,0x81,0x6b,0xfa, +0x4b,0x32,0xf3,0x3d,0x61,0x98,0x9e,0x04,0xbb,0x74,0x40,0x60,0x96,0x0e,0x83,0x53, +0x6a,0x1e,0xf5,0x38,0x32,0xf5,0x0d,0x64,0xe9,0x7f,0x0b,0x8b,0xb4,0xe5,0xc8,0x24, +0x4b,0x7f,0x44,0x60,0x90,0x9e,0x1b,0x3c,0xea,0x0b,0xf2,0x3c,0xea,0x8b,0x61,0x8a, +0x5e,0x11,0x58,0xa2,0xf3,0xe0,0x87,0x2e,0x93,0x9a,0x8f,0x4a,0x18,0xa1,0x55,0xc1, +0xa3,0x1e,0x1e,0x3c,0x6a,0xe7,0x7f,0x7e,0x5d,0x9a,0x0e,0xe7,0xf3,0x7a,0x38,0x9f, +0xf7,0xc2,0xf3,0x7c,0x30,0x70,0x3c,0x97,0x05,0x56,0xe7,0xff,0xc1,0xe7,0xfc,0x30, +0x78,0xd4,0xdb,0x61,0x71,0x0e,0x80,0xbd,0x39,0x18,0xe6,0xa6,0xf1,0x36,0x6f,0x21, +0xbf,0xff,0x02,0xfc,0xcc,0x0d,0x81,0x9f,0xb9,0x25,0x30,0x33,0x9d,0x95,0xb9,0x3b, +0x70,0x31,0x2d,0x9f,0xbf,0x07,0xce,0x65,0x77,0xf2,0xf9,0xe3,0xc8,0xe5,0x7f,0x33, +0xcf,0xa3,0xfe,0x21,0xf9,0xfb,0xa7,0x83,0x47,0xfd,0x2c,0xd9,0x7b,0xcb,0xdd,0xaf, +0x23,0x77,0x6f,0x99,0xfb,0x8d,0x64,0xee,0x3f,0x22,0x73,0x6f,0x79,0xfb,0xcf,0xa4, +0x52,0x98,0x95,0xee,0x51,0xf7,0xfd,0x0a,0x1e,0x75,0xb5,0x74,0x06,0x1e,0xf5,0x05, +0x78,0xd4,0x17,0x77,0xe0,0x51,0xcf,0x08,0x1e,0xf5,0x0f,0xa4,0xeb,0xa4,0x59,0x78, +0xd4,0xf3,0xa4,0x5b,0xa5,0xdb,0xc9,0xf8,0xaf,0x86,0x7d,0x99,0xc6,0xa3,0x2e,0xc2, +0xa3,0x2e,0x21,0xeb,0x7f,0x58,0xc8,0xfa,0x5b,0xc6,0xbf,0xf7,0x17,0x78,0xd4,0x9e, +0xf1,0xb7,0x2c,0xff,0x08,0xb2,0xfc,0x63,0xc9,0xf2,0x4f,0x90,0x6a,0xa5,0xa9,0x64, +0xf7,0x6f,0x95,0x0e,0x39,0xa1,0xcd,0xa3,0x1e,0xdc,0x5b,0xe7,0x7e,0xd2,0x1d,0x78, +0xd4,0x27,0xf5,0xd1,0x79,0x87,0x34,0x57,0xfa,0xb9,0xf4,0x57,0xe9,0xe1,0x93,0x12, +0x8f,0xba,0xa5,0xaf,0xd4,0x4f,0x8f,0x25,0x9d,0x50,0xde,0x29,0xb5,0x48,0x03,0x75, +0x62,0x79,0x01,0xf9,0xff,0xf7,0xc9,0xff,0x6f,0x27,0xff,0xdf,0x72,0x4a,0x5b,0xfe, +0xff,0x54,0x32,0xff,0x33,0xf1,0xa8,0x7f,0x4a,0xd6,0xff,0x51,0x32,0xfe,0xab,0xc8, +0xf6,0xff,0x9e,0x4c,0xff,0x3b,0xb0,0x2c,0xcf,0x1e,0xa8,0xc7,0xbc,0xb4,0x53,0x7a, +0x5d,0x27,0xaf,0xfb,0xf0,0xa8,0x33,0x64,0xfb,0x7b,0x91,0xed,0x3f,0x15,0x96,0x65, +0x25,0x19,0xff,0xa1,0x64,0xfa,0xc7,0x90,0xe9,0xbf,0x9b,0x4c,0xff,0x62,0x3c,0x6a, +0xe7,0x54,0x5a,0x7e,0xbf,0x82,0xdc,0xbe,0x65,0xf6,0xdf,0x93,0x8e,0x19,0xa4,0xe7, +0xbb,0x54,0x2b,0x4d,0x95,0xae,0x93,0x66,0x49,0x4d,0xd2,0x6a,0xe9,0x25,0x69,0x9d, +0x74,0x55,0x95,0x8e,0x9d,0xf4,0xb6,0xb4,0x51,0xfa,0x0c,0x8f,0xda,0xb2,0xfe,0x2d, +0xd2,0xfe,0xc5,0x49,0xbe,0xff,0xbf,0x7f,0x91,0xe4,0xf8,0xbb,0x91,0xdf,0xb7,0xcc, +0xfe,0x15,0x78,0xd4,0xce,0x9f,0xbc,0x07,0xd6,0xe4,0x47,0xb0,0x25,0x77,0x4b,0xc7, +0x87,0x5c,0xfe,0x6a,0xe9,0x77,0x81,0x03,0xe9,0xfc,0x47,0xe7,0x3e,0xf6,0x09,0x8c, +0xc7,0x01,0x78,0xd4,0x43,0xa5,0xd3,0xc8,0xda,0x5f,0x0d,0xd3,0x71,0x0d,0x2c,0xc7, +0xed,0x81,0xd9,0x78,0x22,0x7c,0xc6,0x33,0xe1,0x32,0x9e,0x43,0xce,0x7e,0x76,0xe0, +0x2f,0x3e,0x0e,0x73,0xf1,0x29,0x58,0x8b,0x6b,0x61,0x2b,0x3a,0x57,0xd1,0x72,0xf6, +0xfd,0xe0,0x25,0x56,0xc2,0x49,0xac,0x86,0x8f,0xe8,0x6c,0xc4,0xaf,0x07,0x8f,0x7a, +0x72,0x60,0x1c,0x2e,0x0f,0x1e,0xf5,0x63,0x64,0xec,0x9f,0x24,0x63,0xbf,0x3a,0xcf, +0xa3,0xfe,0x00,0x16,0xa1,0xf3,0x06,0x8b,0xc8,0xd0,0x1f,0x4e,0x76,0x7e,0x20,0xd9, +0xf8,0x6f,0x07,0x56,0xa0,0x33,0x02,0x9d,0x09,0x68,0x2c,0xc0,0xfb,0xc8,0xc8,0x5b, +0x3e,0xfe,0x3b,0xe4,0xe2,0x8b,0x42,0x1e,0xbe,0x27,0x59,0xf8,0xfe,0x64,0xe1,0x3d, +0x07,0x7f,0x3a,0xd9,0xf7,0x5a,0xe9,0x59,0x72,0xef,0x63,0xc8,0xbd,0x5b,0xe6,0x7d, +0x3f,0x1e,0xb5,0x71,0xfc,0x8e,0x84,0xe3,0x57,0x7b,0x10,0x8f,0xfa,0x02,0x3c,0xea, +0x0b,0xa5,0x8b,0xa4,0x4b,0xf0,0xa8,0xa7,0xe3,0x51,0x37,0x90,0x97,0x37,0x8f,0xba, +0xa0,0x45,0x3f,0x73,0xa9,0x34,0xcf,0xa3,0xee,0x06,0x03,0xd0,0x3c,0xea,0x5e,0xe4, +0xea,0x6b,0x02,0xff,0x6f,0x15,0x99,0xf9,0x75,0x64,0xe5,0x2d,0x27,0xbf,0x59,0xfa, +0x93,0xf4,0x17,0xe9,0x6f,0xd2,0x01,0xfb,0x9a,0x64,0xe6,0x87,0x93,0x95,0x9f,0x40, +0x46,0x7e,0x6f,0x9e,0x47,0x5d,0x25,0x8d,0x91,0x6e,0x93,0x6e,0x97,0x16,0xe1,0x51, +0xef,0xc7,0xa3,0x5e,0x14,0x98,0x7e,0xfb,0xa4,0xde,0x64,0xe4,0xbf,0x0f,0xab,0xef, +0x1e,0xb2,0xf1,0x96,0x87,0xbf,0x07,0x0e,0xdf,0x06,0xf2,0xef,0x7d,0xc9,0xbd,0x9b, +0x47,0x3d,0x84,0xac,0xba,0xe5,0xd4,0x3d,0x8b,0x3e,0x38,0xe4,0xcf,0xcf,0x25,0x6b, +0xbe,0x9c,0xac,0xb9,0xe5,0xcc,0x8f,0x2e,0x49,0x3c,0xea,0xd3,0xf0,0xa8,0x2d,0x5b, +0xbe,0x8e,0x5c,0x79,0x27,0x58,0x76,0xdd,0xc8,0x96,0xf7,0x20,0x53,0xee,0xdc,0xba, +0xf1,0xd2,0x79,0xd2,0x62,0xb2,0xe4,0xc6,0xa7,0xfb,0xa4,0x34,0xc9,0x93,0x8f,0x21, +0x4f,0x7e,0x05,0x39,0xf2,0x45,0xd2,0xf2,0xb2,0x24,0x4b,0xfe,0x9f,0x64,0xc8,0x5b, +0x3a,0x27,0x19,0xf2,0xbe,0xb0,0xe8,0x66,0x91,0x0d,0x7f,0x04,0x8f,0xda,0xf2,0xe1, +0x7d,0xc9,0x7d,0x1b,0x13,0x6e,0xb2,0xf4,0x52,0xe0,0xbf,0xa5,0xc9,0x7c,0x1b,0xe7, +0x6d,0x82,0x34,0x0d,0xd6,0xdb,0x8d,0x30,0xdb,0x9e,0x80,0xd5,0x66,0x9c,0xb6,0x67, +0xf1,0xa8,0xb7,0xc0,0x67,0x2b,0x20,0x07,0xee,0x4c,0xb6,0x6a,0x72,0xe0,0x57,0x04, +0xce,0xda,0x8d,0xb0,0xd4,0x8c,0xa3,0xf6,0x62,0xe0,0xa6,0x99,0x47,0xbd,0x51,0xda, +0x75,0x48,0x92,0x01,0x1f,0x08,0x0b,0xad,0x2a,0x78,0xd4,0xc6,0x3e,0x1b,0x85,0x47, +0xed,0x79,0xf0,0x05,0x64,0xc0,0x97,0x06,0xa6,0xd9,0xbb,0x70,0xcc,0x8c,0x61,0x96, +0x86,0x5d,0xd6,0x99,0x2c,0x78,0x3f,0x32,0xe0,0x55,0x64,0xbf,0x47,0x06,0x26,0xd9, +0x58,0x38,0x64,0x13,0x82,0x47,0x7d,0x11,0xac,0x31,0xe3,0x8c,0x0d,0x85,0xe3,0x75, +0x7a,0xe0,0x77,0x99,0x47,0x3d,0x25,0x78,0xd4,0x17,0xc2,0xe6,0x7a,0x32,0x78,0xd4, +0xab,0x02,0x87,0xeb,0x79,0x32,0xdf,0xc6,0xdb,0x5a,0x01,0x5f,0xeb,0xa9,0xc0,0xd5, +0x6a,0x26,0x03,0x6e,0x1c,0xad,0x41,0x70,0xb3,0x46,0x06,0x8f,0xda,0x39,0x59,0xc6, +0xc7,0xba,0x3c,0xf0,0xb1,0xdc,0xa3,0x5e,0x1e,0x58,0x58,0xee,0x51,0x1b,0xfb,0xea, +0x28,0xd8,0x56,0xc7,0x07,0xa6,0x95,0xb1,0xac,0xc6,0xf4,0x48,0x98,0x55,0xce,0xab, +0x1a,0x8e,0x47,0xbd,0x23,0x64,0xc8,0x0f,0x25,0x37,0x3e,0x18,0xfe,0xd4,0xc8,0xe0, +0x51,0x3b,0x57,0xea,0x4c,0x98,0x52,0x0f,0xc2,0x90,0x7a,0x03,0x76,0x94,0x73,0xa3, +0x9c,0x0f,0x55,0x24,0x65,0xe1,0x43,0x0d,0x82,0x0b,0x35,0x1c,0x0e,0xd4,0x99,0xc1, +0xa3,0x9e,0x04,0xfb,0x69,0x0a,0x99,0x72,0xe7,0x3d,0x19,0xe7,0xe9,0x3f,0xc8,0x95, +0x67,0xe1,0x31,0x0d,0x81,0xc3,0x34,0x4e,0xba,0x9c,0x2c,0xb9,0x73,0x96,0x9c,0xaf, +0xe4,0x5c,0x25,0xe3,0x29,0x15,0x91,0x2f,0xaf,0x0c,0xfc,0xa4,0x51,0x81,0x99,0x74, +0x16,0x9c,0xa4,0x69,0xe4,0xcc,0x6f,0x87,0x87,0x74,0x47,0x07,0x1e,0xb5,0x71,0x8f, +0x76,0xc0,0x33,0xfa,0x14,0x8f,0xfa,0x35,0xe9,0x8f,0xd2,0x26,0x69,0xfb,0x71,0x49, +0xa6,0xdc,0xf2,0xe4,0x0d,0xe4,0xc9,0x07,0x56,0xeb,0xfb,0xae,0x4e,0x32,0xe3,0xc3, +0xc8,0x88,0x1b,0x07,0x68,0x06,0xf9,0xf0,0x5d,0x78,0xd4,0x15,0xf0,0x7e,0xc6,0xc1, +0xf9,0xb9,0x90,0x9c,0xb8,0x65,0xc4,0xef,0xfe,0x6e,0x1b,0xab,0x67,0x2e,0x5c,0x9e, +0xc5,0xe4,0xbd,0xa3,0x47,0x6d,0x1c,0x9e,0xdd,0x73,0x93,0x9c,0x77,0x76,0x41,0x3a, +0xd5,0x93,0xcc,0xf6,0xa5,0x64,0xb4,0xa7,0x93,0xcd,0xbe,0x85,0x4c,0xf6,0x22,0x18, +0x39,0xe6,0x51,0xdf,0x27,0x7d,0xbc,0x5e,0x8f,0x15,0xb8,0x38,0x97,0xc1,0xc3,0xb9, +0x16,0x1e,0xce,0x4d,0xf0,0x70,0x96,0xc2,0xc3,0xd9,0x22,0x9d,0x0e,0x13,0xc7,0x3c, +0xea,0x9d,0xd2,0xa4,0x0d,0xe9,0xd4,0x35,0x1b,0x92,0x9c,0xf7,0xa2,0x90,0xef,0x7e, +0x80,0x4c,0xb7,0xe7,0xb9,0x9f,0x27,0xc3,0x5d,0x4a,0x76,0xfb,0x18,0x32,0xdb,0xa3, +0x43,0x56,0xbb,0x8e,0x7c,0xf6,0x9b,0x78,0xd4,0x96,0xc5,0xee,0x4e,0x06,0xbb,0x96, +0xec,0xf5,0x3c,0x32,0xd7,0xcf,0x93,0xb9,0x36,0x4e,0x4d,0xcb,0xff,0x26,0x9c,0x9a, +0xe1,0x70,0x6a,0x1a,0xf0,0xa8,0xe7,0xe0,0x51,0xdf,0x0a,0xa7,0xc6,0x18,0x35,0x45, +0xb0,0x67,0x8e,0x87,0x39,0x63,0xbc,0x99,0x53,0xe0,0xca,0x8c,0x82,0x27,0x53,0xbb, +0x39,0xc9,0x5f,0x7f,0x04,0x2f,0xc6,0x3c,0x6a,0xcb,0x43,0xaf,0x83,0xbb,0x72,0x46, +0xe0,0xad,0x18,0x67,0x65,0xaa,0xf4,0xd8,0x87,0xfa,0xfb,0x5b,0x93,0x7c,0xf4,0x71, +0x21,0x17,0xdd,0x97,0x2c,0xf4,0xd0,0x2f,0xf0,0xa8,0x6b,0x43,0xce,0xb9,0x23,0x8f, +0xda,0xb3,0xcc,0xd3,0xc9,0x2f,0x5f,0x1d,0x72,0xcb,0xf3,0xc8,0x2a,0xdf,0x47,0x46, +0xd9,0xf2,0xc9,0xdb,0xa5,0x01,0xdb,0xd2,0xa9,0x7f,0x93,0x1e,0x95,0x56,0x4b,0xeb, +0xa4,0x8f,0xa5,0xd2,0xed,0xfa,0xb7,0x49,0x1a,0x88,0x47,0x7d,0x99,0x34,0x43,0x7a, +0x04,0x8f,0xba,0x60,0x87,0xee,0xa3,0x34,0x5e,0x9a,0x28,0x4d,0x93,0xde,0xf8,0x24, +0x9d,0xfa,0x50,0xda,0x2f,0x5d,0xb9,0x3b,0x9d,0xfa,0x1f,0xe9,0x03,0xa9,0xec,0x53, +0x7d,0x1f,0xd2,0x64,0x69,0xae,0xb4,0x4c,0x5a,0x21,0x5d,0xb3,0x47,0x3f,0x1b,0xe9, +0x9c,0xbd,0x69,0x9d,0xf3,0xe8,0xe7,0x21,0x5d,0x2b,0xfd,0x48,0x7a,0x48,0x7a,0x42, +0x7a,0x4e,0xfa,0x83,0xf4,0x93,0x7d,0xe9,0xd4,0xef,0xe0,0xb3,0xbc,0xfd,0x40,0x41, +0xaa,0xfa,0x57,0x49,0xa6,0xfa,0x5e,0xb2,0xd4,0x96,0x9f,0xb6,0xec,0xb4,0x79,0xd4, +0x37,0xa4,0x12,0xfe,0xca,0x81,0x96,0x6e,0x52,0x79,0x2a,0x7d,0x78,0xf7,0xc3,0x3b, +0x77,0x4f,0xeb,0x55,0xa6,0x2c,0xd3,0xa9,0xa0,0x53,0x41,0x61,0x41,0xa6,0x48,0x2f, +0xe9,0xee,0xe9,0x02,0x5d,0xa3,0x77,0x32,0x65,0x85,0x7a,0x53,0x58,0x94,0x69,0xff, +0x92,0xd5,0x2b,0xde,0x2f,0xb2,0x77,0xb2,0xf6,0x3a,0x53,0x96,0x2d,0xf6,0x97,0xe2, +0xd2,0x4c,0x49,0x59,0x49,0x41,0x49,0x26,0x5b,0x52,0x92,0x2d,0x2d,0x2b,0x2d,0xc9, +0xea,0x8d,0xfe,0x90,0x95,0x0a,0x4b,0xec,0x4f,0x7a,0xd1,0xe7,0x65,0x8a,0xc3,0xdf, +0xc9,0x16,0x97,0xd8,0x67,0x67,0x8b,0xda,0xbf,0x24,0x97,0xdc,0x7b,0xd9,0xe4,0xbd, +0x32,0xbd,0x64,0xfd,0x03,0xf6,0x91,0x6c,0xee,0x4f,0x79,0x9f,0x9e,0x7c,0x7e,0x36, +0x7e,0x2e,0x9f,0xd1,0xfa,0xd9,0x6d,0x97,0x2c,0xd2,0xb7,0xed,0x1f,0xc8,0x7d,0xdd, +0xdc,0xb5,0x99,0xd6,0x6b,0x5a,0x95,0x0d,0x77,0xa9,0xf5,0x2b,0x65,0xb9,0x25,0xbd, +0x2d,0x6b,0x7f,0xc7,0x8b,0xda,0xee,0x5f,0x36,0xd3,0xfa,0x5e,0x36,0x5e,0xdd,0xe1, +0x77,0x5d,0xd4,0xfe,0x2e,0xe6,0x8e,0x7a,0xe7,0xdc,0x51,0x8f,0x37,0x9e,0xbc,0xd8, +0x4d,0x66,0x32,0xd9,0x74,0xb8,0xcd,0xe4,0xe3,0x99,0xdc,0x4f,0x29,0xf7,0x5d,0xb4, +0xde,0x2c,0x77,0x35,0x1b,0x6e,0xb0,0x83,0xfb,0x90,0xf5,0x23,0x1e,0xaf,0x8b,0xf7, +0x2d,0x93,0xdc,0x25,0xde,0x76,0x4e,0x17,0x15,0x67,0x3a,0x77,0xef,0x51,0xde,0xad, +0x6b,0x97,0x82,0xb2,0x4c,0x81,0xae,0x38,0xec,0x90,0xaf,0x1d,0x9a,0x2e,0x2c,0x2a, +0xec,0x94,0xc9,0xa9,0x2c,0x9b,0xc9,0x7f,0x2c,0xe9,0x7e,0xb7,0xbe,0x9f,0xe9,0x54, +0x96,0xbc,0xf5,0x87,0x5c,0xee,0xae,0xdb,0x1d,0xcf,0xb4,0xfe,0x00,0x38,0x18,0x19, +0xbb,0x74,0xce,0xf0,0xc1,0xdc,0xdb,0xf0,0x80,0xfc,0xfc,0x4b,0xf2,0x4a,0x8f,0xbf, +0xe4,0x30,0x64,0x5a,0x0f,0x62,0xee,0x4f,0xd9,0xdc,0xbd,0xe8,0xe0,0x60,0xe4,0x1d, +0xe3,0xa2,0x0e,0x8f,0x4f,0xdb,0xb1,0xe5,0xa2,0x87,0x72,0xa7,0xe2,0xdc,0xa5,0xa4, +0x24,0xa3,0x07,0x75,0xc6,0x6e,0xb7,0x20,0xf7,0xa2,0x27,0x9a,0x9e,0x29,0xba,0x32, +0xdd,0xfe,0x39,0x97,0xfb,0x7b,0x65,0xba,0x2e,0xd3,0x76,0x6c,0x73,0x77,0x3a,0xf7, +0xe0,0xcb,0x16,0xb6,0xfb,0xee,0x73,0xb7,0xd1,0x76,0xc9,0xe4,0x5e,0xeb,0xd1,0x9a, +0x7b,0x9d,0x7b,0xdf,0xaf,0xcc,0xdd,0x87,0x6c,0x69,0xa9,0x5d,0x53,0x6c,0xcf,0xb9, +0x62,0xbe,0xfd,0x6c,0xfb,0x1f,0x6e,0xfb,0x47,0x5e,0xbb,0x07,0xe1,0xe7,0x9e,0x85, +0x45,0xf1,0x81,0x93,0x7f,0xb0,0xda,0x1d,0x9f,0xcc,0xe7,0x3e,0x14,0x8f,0x52,0xdb, +0xcd,0x1d,0xec,0xf1,0x17,0x9e,0xaa,0x7c,0x91,0x6c,0xb6,0xfd,0xdd,0xf6,0x27,0x6d, +0xde,0x13,0xa5,0xdd,0xfd,0xcd,0xe4,0x1d,0xb9,0x6c,0x51,0xf2,0x1c,0x49,0xfb,0x0f, +0xdf,0x0f,0x7f,0xfe,0xa5,0xed,0xd1,0x53,0xd8,0x76,0xaf,0x92,0x4b,0xeb,0xaf,0xa2, +0xe2,0xe4,0x77,0x97,0xfd,0xea,0xfa,0xb2,0x4b,0x26,0xb9,0x14,0x66,0xc2,0xaf,0xce, +0x83,0x5e,0x0a,0xb9,0x0f,0x69,0xdd,0xcb,0xa2,0x54,0xdb,0x4e,0xdb,0x39,0xcc,0xcd, +0xbe,0xea,0x2e,0x59,0xdf,0x1d,0xeb,0x3b,0x62,0x7d,0x27,0x6c,0xfe,0x0e,0xd8,0xfc, +0xdd,0xaf,0xbe,0xd3,0xd5,0x77,0xb9,0xfa,0x0e,0x57,0xdf,0xd5,0xea,0xbb,0x59,0x7d, +0x27,0xab,0xef,0x62,0xf5,0x1d,0xac,0xbe,0x7b,0xd5,0x77,0xae,0x6e,0x08,0x3b,0x54, +0xbd,0x63,0x31,0x92,0xdd,0xa8,0xb5,0x61,0xe7,0xa9,0xef,0x3a,0xf5,0x79,0x95,0xef, +0x26,0x5d,0xd5,0xc1,0x2e,0xd2,0xb5,0x61,0xf7,0xa8,0xef,0x1a,0xfd,0x2c,0xaf,0x2f, +0x11,0x77,0x82,0x7e,0xd1,0x2e,0x50,0xdf,0xf9,0x19,0x77,0x7d,0xce,0x09,0x3b,0x3b, +0x57,0x85,0x1d,0x9d,0xb1,0x03,0xe1,0x3b,0x38,0xf7,0xe6,0xcd,0x94,0x46,0x86,0xf9, +0x51,0xfe,0x6e,0xcc,0xd8,0x6f,0xf0,0xdd,0x97,0xbe,0xeb,0x72,0x55,0x07,0xbb,0x28, +0xd7,0x86,0xdd,0x93,0x29,0x66,0x3f,0xa3,0xbf,0x64,0x57,0xa4,0xef,0x84,0xbc,0x91, +0xdd,0x8f,0xbe,0xd3,0x71,0x55,0xd8,0xdd,0xe8,0x3b,0x1b,0xe3,0xae,0x46,0xdf,0xcd, +0x98,0x62,0xf7,0xa2,0xef,0x58,0x1c,0xdd,0xc1,0x4e,0xc5,0x09,0x61,0x77,0xa2,0xef, +0x4c,0xf4,0x99,0x4e,0xdc,0x79,0xd8,0xd1,0xae,0x43,0xdf,0x71,0xe8,0xbb,0x0d,0x7d, +0xa7,0xa1,0xef,0x30,0xf4,0x5d,0x84,0xbe,0x83,0xf0,0x45,0xe6,0x34,0xbe,0x53,0xf0, +0xcb,0x76,0x09,0x7e,0x2f,0x6f,0x57,0xe0,0xc1,0x76,0x04,0x0e,0x60,0xf6,0x32,0x89, +0xd9,0x8b,0xef,0xee,0xf3,0x9d,0x7d,0xbe,0xab,0xcf,0x77,0xf4,0xcd,0x66,0xf6,0xe2, +0x3b,0xf7,0xee,0x66,0x06,0xe3,0x3b,0xeb,0x7c,0xb7,0xdc,0x20,0x66,0x21,0xbe,0x3b, +0xce,0x77,0xc5,0x3d,0xc6,0xac,0xc3,0x77,0xbc,0xf9,0x6e,0x37,0x67,0x01,0xf9,0x8e, +0xb6,0x5e,0x61,0xe7,0x9a,0xcd,0x2c,0x7a,0x84,0x59,0x84,0xcf,0x20,0xe2,0xee,0xb2, +0x26,0x66,0x0d,0x31,0x0f,0x3f,0x36,0x6f,0x77,0xd8,0x6c,0x66,0x0a,0xcb,0x98,0x1f, +0xd8,0x9c,0xa0,0x0f,0xf3,0x81,0xb8,0x53,0x6b,0x4b,0xd8,0x9d,0xb5,0x2b,0x6f,0x16, +0xd0,0xcc,0x1c,0x60,0x1f,0xb3,0x80,0xf5,0xf8,0xe3,0xbe,0x5b,0xc9,0x77,0x25,0xf9, +0x8e,0xa3,0x93,0xf1,0x7b,0x7d,0x27,0xd1,0x0c,0x3c,0x55,0xdf,0xe9,0xe3,0xbb,0x7b, +0x7c,0x57,0x8f,0xef,0xce,0xf1,0x9d,0x39,0xbe,0x2b,0xa7,0x77,0xde,0x4e,0x1c,0xdf, +0x85,0xf3,0x18,0x5e,0xa9,0xef,0xbc,0xf1,0xdd,0x36,0xbe,0xcb,0xe6,0x2c,0x7c,0xd2, +0x98,0xe3,0x6d,0x0e,0x3b,0x66,0xfa,0xe3,0x7d,0xfa,0x4e,0x18,0xf7,0x3d,0xaf,0x0b, +0x99,0xdc,0xa6,0xb0,0xbb,0xc5,0x77,0xb6,0xf8,0xae,0x16,0xdf,0xd1,0xf2,0x01,0x3b, +0x57,0xdc,0xef,0x7c,0x2f,0xec,0x38,0x31,0x2f,0xd3,0x77,0x92,0xe4,0xef,0x0e,0xf1, +0x5d,0x1b,0xbe,0x5b,0xc3,0x77,0x65,0x1c,0x6c,0xb7,0x43,0xfe,0x0e,0x07,0xdf,0xd1, +0xe0,0x3b,0x16,0x7c,0x27,0x82,0xef,0x34,0x48,0x85,0x4c,0xe5,0x99,0x21,0x4b,0xd9, +0x84,0x47,0xe5,0x3b,0x03,0xfa,0xe2,0x47,0xf9,0x2e,0x00,0x67,0xff,0x7b,0x66,0x72, +0x25,0x4c,0xff,0xdf,0xe6,0x79,0x52,0xa7,0xe4,0x31,0xf7,0x37,0xe2,0x2d,0xa5,0xf0, +0x95,0x9c,0x71,0x3f,0xfa,0x20,0x2c,0x7b,0x67,0xd8,0x1f,0x8c,0x5d,0x3f,0x18,0x0f, +0xc9,0x59,0xef,0x4d,0x78,0x44,0xcb,0x03,0x7b,0xbd,0x39,0xb0,0xd5,0x2b,0xf1,0x80, +0x1e,0xc6,0xdf,0x39,0x16,0x1f,0xe7,0x14,0xbc,0x9b,0x8e,0x58,0xe1,0xa3,0x03,0x13, +0xdc,0xfd,0x9a,0x57,0x02,0xe3,0x7b,0x53,0x60,0x78,0x3b,0xbb,0x3b,0x66,0x07,0x23, +0xa3,0x7b,0x22,0x9e,0xcc,0x7c,0xbc,0x98,0x8a,0xc0,0xc2,0x1e,0x93,0xc7,0xb8,0x36, +0xaf,0xe5,0xcb,0x18,0xd5,0xce,0xa6,0xee,0x88,0x3d,0x6d,0x1e,0xcb,0x4e,0x18,0xd1, +0xce,0x42,0x76,0x06,0xb2,0x33,0x8a,0xf3,0xd9,0xc4,0xf9,0x0c,0x62,0x67,0xfe,0x4e, +0xfb,0x7b,0x99,0xbe,0x7f,0x2f,0xdb,0xf6,0xab,0xb2,0x6b,0xf1,0x12,0x9c,0x39,0xeb, +0xac,0x56,0x67,0xb4,0x3a,0x43,0xf4,0xff,0x01, +}; +} // namespace ada::idna::table_blob +#endif +/* end file src/table_blob.inc */ + +#include +#include +#include +#include +#include + +namespace ada::idna { + +// table_blob.inc is packed little-endian (see scripts/pack_tables.py). After +// inflate the multi-byte sections must be converted to host endianness so +// big-endian platforms (s390x) can load uint16_t/uint32_t/uint64_t natively. +// CRC is checked on the raw little-endian payload before any conversion. +namespace detail { + +template +inline void bswap_inplace(T* data, size_t count) noexcept { + if constexpr (std::endian::native == std::endian::little) { + (void)data; + (void)count; + return; + } + for (size_t i = 0; i < count; ++i) { + if constexpr (sizeof(T) == 2) { +#if defined(__GNUC__) || defined(__clang__) + data[i] = + static_cast(__builtin_bswap16(static_cast(data[i]))); +#else + const auto v = static_cast(data[i]); + data[i] = static_cast(static_cast((v >> 8) | (v << 8))); +#endif + } else if constexpr (sizeof(T) == 4) { +#if defined(__GNUC__) || defined(__clang__) + data[i] = + static_cast(__builtin_bswap32(static_cast(data[i]))); +#else + auto v = static_cast(data[i]); + v = ((v & 0x000000FFu) << 24) | ((v & 0x0000FF00u) << 8) | + ((v & 0x00FF0000u) >> 8) | ((v & 0xFF000000u) >> 24); + data[i] = static_cast(v); +#endif + } else if constexpr (sizeof(T) == 8) { +#if defined(__GNUC__) || defined(__clang__) + data[i] = + static_cast(__builtin_bswap64(static_cast(data[i]))); +#else + auto v = static_cast(data[i]); + v = ((v & 0x00000000000000FFull) << 56) | + ((v & 0x000000000000FF00ull) << 40) | + ((v & 0x0000000000FF0000ull) << 24) | + ((v & 0x00000000FF000000ull) << 8) | + ((v & 0x000000FF00000000ull) >> 8) | + ((v & 0x0000FF0000000000ull) >> 24) | + ((v & 0x00FF000000000000ull) >> 40) | + ((v & 0xFF00000000000000ull) >> 56); + data[i] = static_cast(v); +#endif + } else { + static_assert(sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8); + } + } +} + +// Convert every multi-byte section of the inflated little-endian blob to host +// order. Single-byte sections are left unchanged. Safe no-op on little-endian. +inline void convert_table_blob_to_host_endian(uint8_t* buffer) noexcept { + if constexpr (std::endian::native == std::endian::little) { + (void)buffer; + return; + } + auto u16 = [&](size_t off, size_t count) { + bswap_inplace(reinterpret_cast(buffer + off), count); + }; + auto u32 = [&](size_t off, size_t count) { + bswap_inplace(reinterpret_cast(buffer + off), count); + }; + auto u64 = [&](size_t off, size_t count) { + bswap_inplace(reinterpret_cast(buffer + off), count); + }; + + u16(table_blob::off_idna_stage1, table_blob::count_idna_stage1); + u16(table_blob::off_idna_stage2, table_blob::count_idna_stage2); + u64(table_blob::off_idna_bool_blocks, table_blob::count_idna_bool_blocks); + u16(table_blob::off_decomposition_block, + table_blob::count_decomposition_block); + u32(table_blob::off_decomposition_data, table_blob::count_decomposition_data); + u16(table_blob::off_composition_block, table_blob::count_composition_block); + u32(table_blob::off_composition_data, table_blob::count_composition_data); + u32(table_blob::off_id_continue_flat, table_blob::count_id_continue_flat); + u32(table_blob::off_id_start_flat, table_blob::count_id_start_flat); + u32(table_blob::off_dir_start, table_blob::count_dir_start); + u32(table_blob::off_dir_final, table_blob::count_dir_final); + u32(table_blob::off_combining_flat, table_blob::count_combining_flat); +} + +} // namespace detail + +// --- Blob layout invariants -------------------------------------------------- +static_assert(table_blob::count_decomposition_index == 4352); +static_assert(table_blob::count_ccc_index == 4352); +static_assert(table_blob::count_composition_index == 4352); +static_assert(table_blob::count_decomposition_block == + table_blob::decomposition_block_rows * + table_blob::decomposition_block_cols); +static_assert(table_blob::count_ccc_block == + table_blob::ccc_block_rows * table_blob::ccc_block_cols); +static_assert(table_blob::count_composition_block == + table_blob::composition_block_rows * + table_blob::composition_block_cols); +static_assert(table_blob::count_dir_start == table_blob::dir_table_count && + table_blob::count_dir_final == table_blob::dir_table_count && + table_blob::count_dir_value == table_blob::dir_table_count); +static_assert(table_blob::count_id_continue_flat == + table_blob::id_continue_count * 2); +static_assert(table_blob::count_id_start_flat == + table_blob::id_start_count * 2); +static_assert(table_blob::count_combining_flat == + table_blob::combining_range_count * 2); +static_assert(table_blob::off_idna_stage1 % alignof(uint16_t) == 0); +static_assert(table_blob::off_idna_stage2 % alignof(uint16_t) == 0); +static_assert(table_blob::off_idna_bool_blocks % alignof(uint64_t) == 0); +static_assert(table_blob::off_decomposition_block % alignof(uint16_t) == 0); +static_assert(table_blob::off_decomposition_data % alignof(char32_t) == 0); +static_assert(table_blob::off_composition_block % alignof(uint16_t) == 0); +static_assert(table_blob::off_composition_data % alignof(char32_t) == 0); +static_assert(table_blob::off_id_continue_flat % alignof(uint32_t) == 0); +static_assert(table_blob::off_id_start_flat % alignof(uint32_t) == 0); +static_assert(table_blob::off_dir_start % alignof(uint32_t) == 0); +static_assert(table_blob::off_dir_final % alignof(uint32_t) == 0); +static_assert(table_blob::off_combining_flat % alignof(uint32_t) == 0); +static_assert(table_blob::compressed_size == sizeof(table_blob::compressed)); + +// Every section must lie entirely inside the uncompressed buffer. +#define ADA_IDNA_SECTION_IN_BOUNDS(off, count, width) \ + static_assert((off) + (count) * (width) <= table_blob::uncompressed_size, \ + #off " overflows uncompressed buffer") +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_idna_stage1, + table_blob::count_idna_stage1, 2); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_idna_stage2, + table_blob::count_idna_stage2, 2); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_idna_bool_blocks, + table_blob::count_idna_bool_blocks, 8); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_idna_utf8_mappings, + table_blob::count_idna_utf8_mappings, 1); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_decomposition_index, + table_blob::count_decomposition_index, 1); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_decomposition_block, + table_blob::count_decomposition_block, 2); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_decomposition_data, + table_blob::count_decomposition_data, 4); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_ccc_index, + table_blob::count_ccc_index, 1); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_ccc_block, + table_blob::count_ccc_block, 1); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_composition_index, + table_blob::count_composition_index, 1); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_composition_block, + table_blob::count_composition_block, 2); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_composition_data, + table_blob::count_composition_data, 4); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_id_continue_flat, + table_blob::count_id_continue_flat, 4); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_id_start_flat, + table_blob::count_id_start_flat, 4); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_dir_start, + table_blob::count_dir_start, 4); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_dir_final, + table_blob::count_dir_final, 4); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_dir_value, + table_blob::count_dir_value, 1); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_combining_flat, + table_blob::count_combining_flat, 4); +#undef ADA_IDNA_SECTION_IN_BOUNDS + +// --- Mapping ----------------------------------------------------------------- +inline const uint16_t* idna_stage1 = nullptr; +inline const uint16_t* idna_stage2 = nullptr; +inline const uint64_t* idna_bool_blocks = nullptr; +inline const uint8_t* idna_utf8_mappings = nullptr; + +// --- Normalization (O(1) multi-stage) ---------------------------------------- +inline const uint8_t* decomposition_index = nullptr; +inline const uint16_t* decomposition_block_flat = nullptr; +inline const char32_t* decomposition_data = nullptr; +inline const uint8_t* ccc_index = nullptr; +inline const uint8_t* ccc_block_flat = nullptr; +inline const uint8_t* composition_index = nullptr; +inline const uint16_t* composition_block_flat = nullptr; +inline const char32_t* composition_data = nullptr; + +// --- Identifier -------------------------------------------------------------- +// Pointer-to-array alias. CF17 vs CF22 disagree on spacing inside (*)[2]. +// clang-format off +using range_pair_ptr = const uint32_t(*)[2]; +// clang-format on +inline range_pair_ptr id_continue = nullptr; +inline range_pair_ptr id_start = nullptr; + +// --- Validity (const SoA) ---------------------------------------------------- +inline const uint32_t* dir_start = nullptr; +inline const uint32_t* dir_final = nullptr; +inline const uint8_t* dir_value = nullptr; +inline range_pair_ptr combining_ranges = nullptr; + +inline constexpr size_t id_continue_count = table_blob::id_continue_count; +inline constexpr size_t id_start_count = table_blob::id_start_count; +inline constexpr size_t dir_table_count = table_blob::dir_table_count; +inline constexpr size_t combining_range_count = + table_blob::combining_range_count; +inline constexpr size_t idna_utf8_mappings_size = + table_blob::count_idna_utf8_mappings; +inline constexpr size_t decomposition_data_size = + table_blob::count_decomposition_data; +inline constexpr size_t composition_data_size = + table_blob::count_composition_data; + +inline constexpr size_t kDecompBlockCols = + table_blob::decomposition_block_cols; // 257 +inline constexpr size_t kCccBlockCols = table_blob::ccc_block_cols; // 256 +inline constexpr size_t kCompBlockCols = + table_blob::composition_block_cols; // 257 +inline constexpr size_t kDecompBlockRows = table_blob::decomposition_block_rows; +inline constexpr size_t kCccBlockRows = table_blob::ccc_block_rows; +inline constexpr size_t kCompBlockRows = table_blob::composition_block_rows; + +// Init state: 0=uninit, 1=in progress, 2=ready, 3=failed. +inline constexpr uint8_t kTablesUninit = 0; +inline constexpr uint8_t kTablesInProgress = 1; +inline constexpr uint8_t kTablesReady = 2; +inline constexpr uint8_t kTablesFailed = 3; + +inline std::atomic tables_init_state{kTablesUninit}; +// Process-lifetime allocation published only by the winning init thread. +// Never freed: shared read-only data for the process. Do not dlclose a DSO +// that owns this buffer while other code may still call into ada::idna. +inline uint8_t* tables_buffer = nullptr; + +// Cap spin-wait so a stuck peer cannot hang the process forever. +inline constexpr uint64_t kTablesSpinLimit = 1'000'000'000ull; + +// ISO HDLC / zlib CRC-32 of the uncompressed table payload. +[[nodiscard]] inline uint32_t crc32_ieee(const uint8_t* data, + size_t len) noexcept { + uint32_t c = 0xFFFFFFFFu; + for (size_t i = 0; i < len; ++i) { + c ^= data[i]; + for (int k = 0; k < 8; ++k) { + const uint32_t mask = 0u - (c & 1u); + c = (c >> 1) ^ (0xEDB88320u & mask); + } + } + return ~c; +} + +[[nodiscard]] inline bool tables_are_ready() noexcept { + return tables_init_state.load(std::memory_order_acquire) == kTablesReady; +} + +// Returns true only when all table pointers are safe to use. +[[nodiscard]] inline bool ensure_tables() noexcept { + uint8_t state = tables_init_state.load(std::memory_order_acquire); + if (state == kTablesReady) { + return true; + } + if (state == kTablesFailed) { + return false; + } + + uint8_t expected = kTablesUninit; + if (tables_init_state.compare_exchange_strong(expected, kTablesInProgress, + std::memory_order_acq_rel, + std::memory_order_acquire)) { + uint8_t* buffer = new (std::nothrow) uint8_t[table_blob::uncompressed_size]; + if (buffer == nullptr) { + tables_init_state.store(kTablesFailed, std::memory_order_release); + return false; + } + + const size_t n = deflate::inflate_raw(table_blob::compressed, + table_blob::compressed_size, buffer, + table_blob::uncompressed_size); + if (n != table_blob::uncompressed_size || + crc32_ieee(buffer, n) != table_blob::uncompressed_crc32) { + delete[] buffer; + tables_init_state.store(kTablesFailed, std::memory_order_release); + return false; + } + + // LE payload verified; convert multi-byte fields for big-endian hosts. + detail::convert_table_blob_to_host_endian(buffer); + + auto at = [&](size_t off) noexcept -> const uint8_t* { + return buffer + off; + }; + + // Publish all non-atomic pointers before READY. Waiters synchronize via + // acquire on tables_init_state and then observe these writes. + idna_stage1 = + reinterpret_cast(at(table_blob::off_idna_stage1)); + idna_stage2 = + reinterpret_cast(at(table_blob::off_idna_stage2)); + idna_bool_blocks = + reinterpret_cast(at(table_blob::off_idna_bool_blocks)); + idna_utf8_mappings = at(table_blob::off_idna_utf8_mappings); + + decomposition_index = at(table_blob::off_decomposition_index); + decomposition_block_flat = reinterpret_cast( + at(table_blob::off_decomposition_block)); + decomposition_data = reinterpret_cast( + at(table_blob::off_decomposition_data)); + ccc_index = at(table_blob::off_ccc_index); + ccc_block_flat = at(table_blob::off_ccc_block); + composition_index = at(table_blob::off_composition_index); + composition_block_flat = reinterpret_cast( + at(table_blob::off_composition_block)); + composition_data = + reinterpret_cast(at(table_blob::off_composition_data)); + + id_continue = + reinterpret_cast(at(table_blob::off_id_continue_flat)); + id_start = + reinterpret_cast(at(table_blob::off_id_start_flat)); + + dir_start = + reinterpret_cast(at(table_blob::off_dir_start)); + dir_final = + reinterpret_cast(at(table_blob::off_dir_final)); + dir_value = at(table_blob::off_dir_value); + combining_ranges = + reinterpret_cast(at(table_blob::off_combining_flat)); + + tables_buffer = buffer; + tables_init_state.store(kTablesReady, std::memory_order_release); + return true; + } + + // Another thread owns init (or finished between our loads). + for (uint64_t spins = 0; spins < kTablesSpinLimit; ++spins) { + state = tables_init_state.load(std::memory_order_acquire); + if (state == kTablesReady) { + return true; + } + if (state == kTablesFailed) { + return false; + } +#if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || \ + defined(_M_IX86) +#if defined(__GNUC__) || defined(__clang__) + __builtin_ia32_pause(); +#endif +#elif defined(__aarch64__) || defined(_M_ARM64) +#if defined(__GNUC__) || defined(__clang__) + asm volatile("yield" ::: "memory"); +#endif +#endif + } + // Timed out waiting for a peer - treat as failure rather than hang. + return false; +} + +// O(1) multi-stage accessors. Block indices from the tables are uint8_t and +// theoretically can be out of range if the blob is corrupt; clamp to a valid +// empty/default row (index 0) instead of reading OOB. +inline const uint16_t* decomposition_block_row(uint8_t bi) noexcept { + if (bi >= kDecompBlockRows) { + bi = 0; + } + return decomposition_block_flat + static_cast(bi) * kDecompBlockCols; +} + +inline const uint8_t* ccc_block_row(uint8_t bi) noexcept { + if (bi >= kCccBlockRows) { + bi = 0; + } + return ccc_block_flat + static_cast(bi) * kCccBlockCols; +} + +inline const uint16_t* composition_block_row(uint8_t bi) noexcept { + if (bi >= kCompBlockRows) { + bi = 0; + } + return composition_block_flat + static_cast(bi) * kCompBlockCols; +} + +} // namespace ada::idna +/* end file src/table_store.hpp */ /* begin file src/mapping_tables.cpp */ -// IDNA 17.0.0 +// IDNA 17.0.0 +// Two-level compressed mapping table. +// All constants are derived from the table data; no hardcoded boundaries. +// Total binary size: 48659 bytes (47.5 KB) +// stage1: 6564 bytes (3282 uint16_t entries) +// stage2: 22912 bytes (179 mixed blocks x 64) +// bool_blocks: 1800 bytes (225 uint64_t words) +// utf8 maps: 17383 bytes // clang-format off -#ifndef ADA_IDNA_TABLES_H -#define ADA_IDNA_TABLES_H +#ifndef ADA_IDNA_MAPPING_TABLE_H +#define ADA_IDNA_MAPPING_TABLE_H #include namespace ada::idna { -const uint32_t mappings[5264] = -{ - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 32, 32, 776, 32, 772, 50, 51, 32, 769, - 956, 32, 807, 49, 49, 8260, 52, 49, 8260, 50, 51, 8260, 52, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 248, 249, 250, 251, 252, 253, 254, 257, 259, 261, 263, 265, 267, - 269, 271, 273, 275, 277, 279, 281, 283, 285, 287, 289, 291, 293, 295, 297, 299, - 301, 303, 105, 775, 309, 311, 314, 316, 318, 108, 183, 322, 324, 326, 328, 700, - 110, 331, 333, 335, 337, 339, 341, 343, 345, 347, 349, 351, 353, 355, 357, 359, - 361, 363, 365, 367, 369, 371, 373, 375, 255, 378, 380, 382, 595, 387, 389, 596, - 392, 598, 599, 396, 477, 601, 603, 402, 608, 611, 617, 616, 409, 623, 626, 629, - 417, 419, 421, 640, 424, 643, 429, 648, 432, 650, 651, 436, 438, 658, 441, 445, - 100, 382, 108, 106, 110, 106, 462, 464, 466, 468, 470, 472, 474, 476, 479, 481, - 483, 485, 487, 489, 491, 493, 495, 100, 122, 501, 405, 447, 505, 507, 509, 511, - 513, 515, 517, 519, 521, 523, 525, 527, 529, 531, 533, 535, 537, 539, 541, 543, - 414, 547, 549, 551, 553, 555, 557, 559, 561, 563, 11365, 572, 410, 11366, 578, 384, - 649, 652, 583, 585, 587, 589, 591, 614, 633, 635, 641, 32, 774, 32, 775, 32, 778, - 32, 808, 32, 771, 32, 779, 661, 768, 787, 776, 769, 953, 881, 883, 697, 887, 32, - 953, 59, 1011, 32, 776, 769, 940, 941, 942, 943, 972, 973, 974, 945, 946, 947, 948, - 949, 950, 951, 952, 954, 955, 957, 958, 959, 960, 961, 963, 964, 965, 966, 967, - 968, 969, 970, 971, 983, 985, 987, 989, 991, 993, 995, 997, 999, 1001, 1003, 1005, - 1007, 1016, 1019, 891, 892, 893, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, - 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1072, 1073, 1074, 1075, 1076, 1077, - 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, - 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1121, 1123, - 1125, 1127, 1129, 1131, 1133, 1135, 1137, 1139, 1141, 1143, 1145, 1147, 1149, 1151, - 1153, 1163, 1165, 1167, 1169, 1171, 1173, 1175, 1177, 1179, 1181, 1183, 1185, 1187, - 1189, 1191, 1193, 1195, 1197, 1199, 1201, 1203, 1205, 1207, 1209, 1211, 1213, 1215, - 1231, 1218, 1220, 1222, 1224, 1226, 1228, 1230, 1233, 1235, 1237, 1239, 1241, 1243, - 1245, 1247, 1249, 1251, 1253, 1255, 1257, 1259, 1261, 1263, 1265, 1267, 1269, 1271, - 1273, 1275, 1277, 1279, 1281, 1283, 1285, 1287, 1289, 1291, 1293, 1295, 1297, 1299, - 1301, 1303, 1305, 1307, 1309, 1311, 1313, 1315, 1317, 1319, 1321, 1323, 1325, 1327, - 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, - 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, - 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1381, 1410, 1575, 1652, - 1608, 1652, 1735, 1652, 1610, 1652, 2325, 2364, 2326, 2364, 2327, 2364, 2332, 2364, - 2337, 2364, 2338, 2364, 2347, 2364, 2351, 2364, 2465, 2492, 2466, 2492, 2479, 2492, - 2610, 2620, 2616, 2620, 2582, 2620, 2583, 2620, 2588, 2620, 2603, 2620, 2849, 2876, - 2850, 2876, 3661, 3634, 3789, 3762, 3755, 3737, 3755, 3745, 3851, 3906, 4023, 3916, - 4023, 3921, 4023, 3926, 4023, 3931, 4023, 3904, 4021, 3953, 3954, 3953, 3956, 4018, - 3968, 4018, 3953, 3968, 4019, 3968, 4019, 3953, 3968, 3986, 4023, 3996, 4023, 4001, - 4023, 4006, 4023, 4011, 4023, 3984, 4021, 11520, 11521, 11522, 11523, 11524, 11525, - 11526, 11527, 11528, 11529, 11530, 11531, 11532, 11533, 11534, 11535, 11536, 11537, - 11538, 11539, 11540, 11541, 11542, 11543, 11544, 11545, 11546, 11547, 11548, 11549, - 11550, 11551, 11552, 11553, 11554, 11555, 11556, 11557, 11559, 11565, 4316, 5104, - 5105, 5106, 5107, 5108, 5109, 42571, 7306, 4304, 4305, 4306, 4307, 4308, 4309, 4310, - 4311, 4312, 4313, 4314, 4315, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, - 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, - 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4349, 4350, 4351, 592, 593, 7426, 604, - 7446, 7447, 7453, 7461, 594, 597, 607, 609, 613, 618, 7547, 669, 621, 7557, 671, - 625, 624, 627, 628, 632, 642, 427, 7452, 656, 657, 7681, 7683, 7685, 7687, 7689, - 7691, 7693, 7695, 7697, 7699, 7701, 7703, 7705, 7707, 7709, 7711, 7713, 7715, 7717, - 7719, 7721, 7723, 7725, 7727, 7729, 7731, 7733, 7735, 7737, 7739, 7741, 7743, 7745, - 7747, 7749, 7751, 7753, 7755, 7757, 7759, 7761, 7763, 7765, 7767, 7769, 7771, 7773, - 7775, 7777, 7779, 7781, 7783, 7785, 7787, 7789, 7791, 7793, 7795, 7797, 7799, 7801, - 7803, 7805, 7807, 7809, 7811, 7813, 7815, 7817, 7819, 7821, 7823, 7825, 7827, 7829, - 97, 702, 223, 7841, 7843, 7845, 7847, 7849, 7851, 7853, 7855, 7857, 7859, 7861, - 7863, 7865, 7867, 7869, 7871, 7873, 7875, 7877, 7879, 7881, 7883, 7885, 7887, 7889, - 7891, 7893, 7895, 7897, 7899, 7901, 7903, 7905, 7907, 7909, 7911, 7913, 7915, 7917, - 7919, 7921, 7923, 7925, 7927, 7929, 7931, 7933, 7935, 7936, 7937, 7938, 7939, 7940, - 7941, 7942, 7943, 7952, 7953, 7954, 7955, 7956, 7957, 7968, 7969, 7970, 7971, 7972, - 7973, 7974, 7975, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991, 8000, 8001, 8002, - 8003, 8004, 8005, 8017, 8019, 8021, 8023, 8032, 8033, 8034, 8035, 8036, 8037, 8038, - 8039, 7936, 953, 7937, 953, 7938, 953, 7939, 953, 7940, 953, 7941, 953, 7942, 953, - 7943, 953, 7968, 953, 7969, 953, 7970, 953, 7971, 953, 7972, 953, 7973, 953, 7974, - 953, 7975, 953, 8032, 953, 8033, 953, 8034, 953, 8035, 953, 8036, 953, 8037, 953, - 8038, 953, 8039, 953, 8048, 953, 945, 953, 940, 953, 8118, 953, 8112, 8113, 32, - 787, 32, 834, 32, 776, 834, 8052, 953, 951, 953, 942, 953, 8134, 953, 8050, 32, - 787, 768, 32, 787, 769, 32, 787, 834, 912, 8144, 8145, 8054, 32, 788, 768, 32, 788, - 769, 32, 788, 834, 944, 8160, 8161, 8058, 8165, 32, 776, 768, 96, 8060, 953, 969, - 953, 974, 953, 8182, 953, 8056, 8208, 32, 819, 8242, 8242, 8242, 8242, 8242, 8245, - 8245, 8245, 8245, 8245, 33, 33, 32, 773, 63, 63, 63, 33, 33, 63, 48, 53, 54, 55, - 56, 57, 43, 8722, 61, 40, 41, 97, 47, 99, 97, 47, 115, 176, 99, 99, 47, 111, 99, - 47, 117, 176, 102, 115, 109, 116, 101, 108, 116, 109, 8526, 1488, 1489, 1490, 1491, - 102, 97, 120, 8721, 49, 8260, 55, 49, 8260, 57, 49, 8260, 49, 48, 49, 8260, 51, - 50, 8260, 51, 49, 8260, 53, 50, 8260, 53, 51, 8260, 53, 52, 8260, 53, 49, 8260, - 54, 53, 8260, 54, 49, 8260, 56, 51, 8260, 56, 53, 8260, 56, 55, 8260, 56, 105, 105, - 105, 105, 105, 105, 118, 118, 105, 118, 105, 105, 118, 105, 105, 105, 105, 120, - 120, 105, 120, 105, 105, 8580, 48, 8260, 51, 8747, 8747, 8747, 8747, 8747, 8750, - 8750, 8750, 8750, 8750, 12296, 12297, 49, 50, 49, 51, 49, 52, 49, 53, 49, 54, 49, - 55, 49, 56, 49, 57, 50, 48, 40, 49, 41, 40, 50, 41, 40, 51, 41, 40, 52, 41, 40, - 53, 41, 40, 54, 41, 40, 55, 41, 40, 56, 41, 40, 57, 41, 40, 49, 48, 41, 40, 49, - 49, 41, 40, 49, 50, 41, 40, 49, 51, 41, 40, 49, 52, 41, 40, 49, 53, 41, 40, 49, - 54, 41, 40, 49, 55, 41, 40, 49, 56, 41, 40, 49, 57, 41, 40, 50, 48, 41, 40, 97, - 41, 40, 98, 41, 40, 99, 41, 40, 100, 41, 40, 101, 41, 40, 102, 41, 40, 103, 41, - 40, 104, 41, 40, 105, 41, 40, 106, 41, 40, 107, 41, 40, 108, 41, 40, 109, 41, 40, - 110, 41, 40, 111, 41, 40, 112, 41, 40, 113, 41, 40, 114, 41, 40, 115, 41, 40, 116, - 41, 40, 117, 41, 40, 118, 41, 40, 119, 41, 40, 120, 41, 40, 121, 41, 40, 122, 41, - 58, 58, 61, 61, 61, 10973, 824, 11312, 11313, 11314, 11315, 11316, 11317, 11318, - 11319, 11320, 11321, 11322, 11323, 11324, 11325, 11326, 11327, 11328, 11329, 11330, - 11331, 11332, 11333, 11334, 11335, 11336, 11337, 11338, 11339, 11340, 11341, 11342, - 11343, 11344, 11345, 11346, 11347, 11348, 11349, 11350, 11351, 11352, 11353, 11354, - 11355, 11356, 11357, 11358, 11359, 11361, 619, 7549, 637, 11368, 11370, 11372, 11379, - 11382, 575, 576, 11393, 11395, 11397, 11399, 11401, 11403, 11405, 11407, 11409, - 11411, 11413, 11415, 11417, 11419, 11421, 11423, 11425, 11427, 11429, 11431, 11433, - 11435, 11437, 11439, 11441, 11443, 11445, 11447, 11449, 11451, 11453, 11455, 11457, - 11459, 11461, 11463, 11465, 11467, 11469, 11471, 11473, 11475, 11477, 11479, 11481, - 11483, 11485, 11487, 11489, 11491, 11500, 11502, 11507, 11617, 27597, 40863, 19968, - 20008, 20022, 20031, 20057, 20101, 20108, 20128, 20154, 20799, 20837, 20843, 20866, - 20886, 20907, 20960, 20981, 20992, 21147, 21241, 21269, 21274, 21304, 21313, 21340, - 21353, 21378, 21430, 21448, 21475, 22231, 22303, 22763, 22786, 22794, 22805, 22823, - 22899, 23376, 23424, 23544, 23567, 23586, 23608, 23662, 23665, 24027, 24037, 24049, - 24062, 24178, 24186, 24191, 24308, 24318, 24331, 24339, 24400, 24417, 24435, 24515, - 25096, 25142, 25163, 25903, 25908, 25991, 26007, 26020, 26041, 26080, 26085, 26352, - 26376, 26408, 27424, 27490, 27513, 27571, 27595, 27604, 27611, 27663, 27668, 27700, - 28779, 29226, 29238, 29243, 29247, 29255, 29273, 29275, 29356, 29572, 29577, 29916, - 29926, 29976, 29983, 29992, 30000, 30091, 30098, 30326, 30333, 30382, 30399, 30446, - 30683, 30690, 30707, 31034, 31160, 31166, 31348, 31435, 31481, 31859, 31992, 32566, - 32593, 32650, 32701, 32769, 32780, 32786, 32819, 32895, 32905, 33251, 33258, 33267, - 33276, 33292, 33307, 33311, 33390, 33394, 33400, 34381, 34411, 34880, 34892, 34915, - 35198, 35211, 35282, 35328, 35895, 35910, 35925, 35960, 35997, 36196, 36208, 36275, - 36523, 36554, 36763, 36784, 36789, 37009, 37193, 37318, 37324, 37329, 38263, 38272, - 38428, 38582, 38585, 38632, 38737, 38750, 38754, 38761, 38859, 38893, 38899, 38913, - 39080, 39131, 39135, 39318, 39321, 39340, 39592, 39640, 39647, 39717, 39727, 39730, - 39740, 39770, 40165, 40565, 40575, 40613, 40635, 40643, 40653, 40657, 40697, 40701, - 40718, 40723, 40736, 40763, 40778, 40786, 40845, 40860, 40864, 46, 12306, 21316, - 21317, 32, 12441, 32, 12442, 12424, 12426, 12467, 12488, 4352, 4353, 4522, 4354, - 4524, 4525, 4355, 4356, 4357, 4528, 4529, 4530, 4531, 4532, 4533, 4378, 4358, 4359, - 4360, 4385, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4449, 4450, - 4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463, 4464, - 4465, 4466, 4467, 4468, 4469, 4372, 4373, 4551, 4552, 4556, 4558, 4563, 4567, 4569, - 4380, 4573, 4575, 4381, 4382, 4384, 4386, 4387, 4391, 4393, 4395, 4396, 4397, 4398, - 4399, 4402, 4406, 4416, 4423, 4428, 4593, 4594, 4439, 4440, 4441, 4484, 4485, 4488, - 4497, 4498, 4500, 4510, 4513, 19977, 22235, 19978, 20013, 19979, 30002, 19993, 19969, - 22825, 22320, 40, 4352, 41, 40, 4354, 41, 40, 4355, 41, 40, 4357, 41, 40, 4358, - 41, 40, 4359, 41, 40, 4361, 41, 40, 4363, 41, 40, 4364, 41, 40, 4366, 41, 40, 4367, - 41, 40, 4368, 41, 40, 4369, 41, 40, 4370, 41, 40, 44032, 41, 40, 45208, 41, 40, - 45796, 41, 40, 46972, 41, 40, 47560, 41, 40, 48148, 41, 40, 49324, 41, 40, 50500, - 41, 40, 51088, 41, 40, 52264, 41, 40, 52852, 41, 40, 53440, 41, 40, 54028, 41, 40, - 54616, 41, 40, 51452, 41, 40, 50724, 51204, 41, 40, 50724, 54980, 41, 40, 19968, - 41, 40, 20108, 41, 40, 19977, 41, 40, 22235, 41, 40, 20116, 41, 40, 20845, 41, 40, - 19971, 41, 40, 20843, 41, 40, 20061, 41, 40, 21313, 41, 40, 26376, 41, 40, 28779, - 41, 40, 27700, 41, 40, 26408, 41, 40, 37329, 41, 40, 22303, 41, 40, 26085, 41, 40, - 26666, 41, 40, 26377, 41, 40, 31038, 41, 40, 21517, 41, 40, 29305, 41, 40, 36001, - 41, 40, 31069, 41, 40, 21172, 41, 40, 20195, 41, 40, 21628, 41, 40, 23398, 41, 40, - 30435, 41, 40, 20225, 41, 40, 36039, 41, 40, 21332, 41, 40, 31085, 41, 40, 20241, - 41, 40, 33258, 41, 40, 33267, 41, 21839, 24188, 31631, 112, 116, 101, 50, 50, 50, - 52, 50, 53, 50, 54, 50, 55, 50, 56, 50, 57, 51, 48, 51, 51, 51, 52, 51, 53, 52280, - 44256, 51452, 51032, 50864, 31192, 30007, 36969, 20778, 21360, 27880, 38917, 20889, - 27491, 24038, 21491, 21307, 23447, 22812, 51, 54, 51, 55, 51, 56, 51, 57, 52, 48, - 52, 52, 52, 53, 52, 54, 52, 55, 52, 56, 52, 57, 53, 48, 49, 26376, 50, 26376, 51, - 26376, 52, 26376, 53, 26376, 54, 26376, 55, 26376, 56, 26376, 57, 26376, 49, 48, - 26376, 49, 49, 26376, 49, 50, 26376, 104, 103, 101, 114, 103, 101, 118, 108, 116, - 100, 12450, 12452, 12454, 12456, 12458, 12459, 12461, 12463, 12465, 12469, 12471, - 12473, 12475, 12477, 12479, 12481, 12484, 12486, 12490, 12491, 12492, 12493, 12494, - 12495, 12498, 12501, 12504, 12507, 12510, 12511, 12512, 12513, 12514, 12516, 12518, - 12520, 12521, 12522, 12523, 12524, 12525, 12527, 12528, 12529, 12530, 20196, 21644, - 12450, 12497, 12540, 12488, 12450, 12523, 12501, 12449, 12450, 12531, 12506, 12450, - 12450, 12540, 12523, 12452, 12491, 12531, 12464, 12452, 12531, 12481, 12454, 12457, - 12531, 12456, 12473, 12463, 12540, 12489, 12456, 12540, 12459, 12540, 12458, 12531, - 12473, 12458, 12540, 12512, 12459, 12452, 12522, 12459, 12521, 12483, 12488, 12459, - 12525, 12522, 12540, 12460, 12525, 12531, 12460, 12531, 12510, 12462, 12460, 12462, - 12491, 12540, 12461, 12517, 12522, 12540, 12462, 12523, 12480, 12540, 12461, 12525, - 12461, 12525, 12464, 12521, 12512, 12461, 12525, 12513, 12540, 12488, 12523, 12461, - 12525, 12527, 12483, 12488, 12464, 12521, 12512, 12488, 12531, 12463, 12523, 12476, - 12452, 12525, 12463, 12525, 12540, 12493, 12465, 12540, 12473, 12467, 12523, 12490, - 12467, 12540, 12509, 12469, 12452, 12463, 12523, 12469, 12531, 12481, 12540, 12512, - 12471, 12522, 12531, 12464, 12475, 12531, 12481, 12475, 12531, 12488, 12480, 12540, - 12473, 12487, 12471, 12489, 12523, 12490, 12494, 12494, 12483, 12488, 12495, 12452, - 12484, 12497, 12540, 12475, 12531, 12488, 12497, 12540, 12484, 12496, 12540, 12524, - 12523, 12500, 12450, 12473, 12488, 12523, 12500, 12463, 12523, 12500, 12467, 12499, - 12523, 12501, 12449, 12521, 12483, 12489, 12501, 12451, 12540, 12488, 12502, 12483, - 12471, 12455, 12523, 12501, 12521, 12531, 12504, 12463, 12479, 12540, 12523, 12506, - 12477, 12506, 12491, 12498, 12504, 12523, 12484, 12506, 12531, 12473, 12506, 12540, - 12472, 12505, 12540, 12479, 12509, 12452, 12531, 12488, 12508, 12523, 12488, 12507, - 12531, 12509, 12531, 12489, 12507, 12540, 12523, 12507, 12540, 12531, 12510, 12452, - 12463, 12525, 12510, 12452, 12523, 12510, 12483, 12495, 12510, 12523, 12463, 12510, - 12531, 12471, 12519, 12531, 12511, 12463, 12525, 12531, 12511, 12522, 12511, 12522, - 12496, 12540, 12523, 12513, 12460, 12513, 12460, 12488, 12531, 12516, 12540, 12489, - 12516, 12540, 12523, 12518, 12450, 12531, 12522, 12483, 12488, 12523, 12522, 12521, - 12523, 12500, 12540, 12523, 12540, 12502, 12523, 12524, 12512, 12524, 12531, 12488, - 12466, 12531, 48, 28857, 49, 28857, 50, 28857, 51, 28857, 52, 28857, 53, 28857, - 54, 28857, 55, 28857, 56, 28857, 57, 28857, 49, 48, 28857, 49, 49, 28857, 49, 50, - 28857, 49, 51, 28857, 49, 52, 28857, 49, 53, 28857, 49, 54, 28857, 49, 55, 28857, - 49, 56, 28857, 49, 57, 28857, 50, 48, 28857, 50, 49, 28857, 50, 50, 28857, 50, 51, - 28857, 50, 52, 28857, 104, 112, 97, 100, 97, 97, 117, 98, 97, 114, 111, 118, 112, - 99, 100, 109, 100, 109, 50, 100, 109, 51, 105, 117, 24179, 25104, 26157, 21644, - 22823, 27491, 26126, 27835, 26666, 24335, 20250, 31038, 110, 97, 956, 97, 109, 97, - 107, 97, 107, 98, 109, 98, 103, 98, 99, 97, 108, 107, 99, 97, 108, 112, 102, 110, - 102, 956, 102, 956, 103, 109, 103, 107, 103, 104, 122, 107, 104, 122, 109, 104, - 122, 116, 104, 122, 956, 108, 109, 108, 100, 108, 102, 109, 110, 109, 956, 109, - 109, 109, 99, 109, 107, 109, 109, 109, 50, 99, 109, 50, 107, 109, 50, 109, 109, - 51, 99, 109, 51, 107, 109, 51, 109, 8725, 115, 109, 8725, 115, 50, 107, 112, 97, - 109, 112, 97, 103, 112, 97, 114, 97, 100, 114, 97, 100, 8725, 115, 114, 97, 100, - 8725, 115, 50, 112, 115, 110, 115, 956, 115, 109, 115, 112, 118, 110, 118, 956, - 118, 109, 118, 107, 118, 112, 119, 110, 119, 956, 119, 109, 119, 107, 119, 107, - 969, 109, 969, 98, 113, 99, 8725, 107, 103, 100, 98, 103, 121, 104, 97, 105, 110, - 107, 107, 107, 116, 108, 110, 108, 111, 103, 108, 120, 109, 105, 108, 109, 111, - 108, 112, 104, 112, 112, 109, 112, 114, 115, 118, 119, 98, 118, 8725, 109, 97, 8725, - 109, 49, 26085, 50, 26085, 51, 26085, 52, 26085, 53, 26085, 54, 26085, 55, 26085, - 56, 26085, 57, 26085, 49, 48, 26085, 49, 49, 26085, 49, 50, 26085, 49, 51, 26085, - 49, 52, 26085, 49, 53, 26085, 49, 54, 26085, 49, 55, 26085, 49, 56, 26085, 49, 57, - 26085, 50, 48, 26085, 50, 49, 26085, 50, 50, 26085, 50, 51, 26085, 50, 52, 26085, - 50, 53, 26085, 50, 54, 26085, 50, 55, 26085, 50, 56, 26085, 50, 57, 26085, 51, 48, - 26085, 51, 49, 26085, 103, 97, 108, 42561, 42563, 42565, 42567, 42569, 42573, 42575, - 42577, 42579, 42581, 42583, 42585, 42587, 42589, 42591, 42593, 42595, 42597, 42599, - 42601, 42603, 42605, 42625, 42627, 42629, 42631, 42633, 42635, 42637, 42639, 42641, - 42643, 42645, 42647, 42649, 42651, 42787, 42789, 42791, 42793, 42795, 42797, 42799, - 42803, 42805, 42807, 42809, 42811, 42813, 42815, 42817, 42819, 42821, 42823, 42825, - 42827, 42829, 42831, 42833, 42835, 42837, 42839, 42841, 42843, 42845, 42847, 42849, - 42851, 42853, 42855, 42857, 42859, 42861, 42863, 42874, 42876, 7545, 42879, 42881, - 42883, 42885, 42887, 42892, 42897, 42899, 42903, 42905, 42907, 42909, 42911, 42913, - 42915, 42917, 42919, 42921, 620, 670, 647, 43859, 42933, 42935, 42937, 42939, 42941, - 42943, 42945, 42947, 42900, 7566, 42952, 42954, 612, 42957, 42959, 42961, 42963, - 42965, 42967, 42969, 42971, 411, 42998, 43831, 43858, 653, 5024, 5025, 5026, 5027, - 5028, 5029, 5030, 5031, 5032, 5033, 5034, 5035, 5036, 5037, 5038, 5039, 5040, 5041, - 5042, 5043, 5044, 5045, 5046, 5047, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 5055, - 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 5074, 5075, 5076, 5077, 5078, 5079, 5080, 5081, 5082, 5083, - 5084, 5085, 5086, 5087, 5088, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, - 5098, 5099, 5100, 5101, 5102, 5103, 35912, 26356, 36040, 28369, 20018, 21477, 22865, - 21895, 22856, 25078, 30313, 32645, 34367, 34746, 35064, 37007, 27138, 27931, 28889, - 29662, 33853, 37226, 39409, 20098, 21365, 27396, 29211, 34349, 40478, 23888, 28651, - 34253, 35172, 25289, 33240, 34847, 24266, 26391, 28010, 29436, 37070, 20358, 20919, - 21214, 25796, 27347, 29200, 30439, 34310, 34396, 36335, 38706, 39791, 40442, 30860, - 31103, 32160, 33737, 37636, 35542, 22751, 24324, 31840, 32894, 29282, 30922, 36034, - 38647, 22744, 23650, 27155, 28122, 28431, 32047, 32311, 38475, 21202, 32907, 20956, - 20940, 31260, 32190, 33777, 38517, 35712, 25295, 35582, 20025, 23527, 24594, 29575, - 30064, 21271, 30971, 20415, 24489, 19981, 27852, 25976, 32034, 21443, 22622, 30465, - 33865, 35498, 27578, 27784, 25342, 33509, 25504, 30053, 20142, 20841, 20937, 26753, - 31975, 33391, 35538, 37327, 21237, 21570, 24300, 26053, 28670, 31018, 38317, 39530, - 40599, 40654, 26310, 27511, 36706, 24180, 24976, 25088, 25754, 28451, 29001, 29833, - 31178, 32244, 32879, 36646, 34030, 36899, 37706, 21015, 21155, 21693, 28872, 35010, - 24265, 24565, 25467, 27566, 31806, 29557, 22265, 23994, 24604, 29618, 29801, 32666, - 32838, 37428, 38646, 38728, 38936, 20363, 31150, 37300, 38584, 24801, 20102, 20698, - 23534, 23615, 26009, 29134, 30274, 34044, 36988, 26248, 38446, 21129, 26491, 26611, - 27969, 28316, 29705, 30041, 30827, 32016, 39006, 25134, 38520, 20523, 23833, 28138, - 36650, 24459, 24900, 26647, 38534, 21033, 21519, 23653, 26131, 26446, 26792, 27877, - 29702, 30178, 32633, 35023, 35041, 38626, 21311, 28346, 21533, 29136, 29848, 34298, - 38563, 40023, 40607, 26519, 28107, 33256, 31520, 31890, 29376, 28825, 35672, 20160, - 33590, 21050, 20999, 24230, 25299, 31958, 23429, 27934, 26292, 36667, 38477, 24275, - 20800, 21952, 22618, 26228, 20958, 29482, 30410, 31036, 31070, 31077, 31119, 38742, - 31934, 34322, 35576, 36920, 37117, 39151, 39164, 39208, 40372, 37086, 38583, 20398, - 20711, 20813, 21193, 21220, 21329, 21917, 22022, 22120, 22592, 22696, 23652, 24724, - 24936, 24974, 25074, 25935, 26082, 26257, 26757, 28023, 28186, 28450, 29038, 29227, - 29730, 30865, 31049, 31048, 31056, 31062, 31117, 31118, 31296, 31361, 31680, 32265, - 32321, 32626, 32773, 33261, 33401, 33879, 35088, 35222, 35585, 35641, 36051, 36104, - 36790, 38627, 38911, 38971, 24693, 148206, 33304, 20006, 20917, 20840, 20352, 20805, - 20864, 21191, 21242, 21845, 21913, 21986, 22707, 22852, 22868, 23138, 23336, 24274, - 24281, 24425, 24493, 24792, 24910, 24840, 24928, 25140, 25540, 25628, 25682, 25942, - 26395, 26454, 28379, 28363, 28702, 30631, 29237, 29359, 29809, 29958, 30011, 30237, - 30239, 30427, 30452, 30538, 30528, 30924, 31409, 31867, 32091, 32574, 33618, 33775, - 34681, 35137, 35206, 35519, 35531, 35565, 35722, 36664, 36978, 37273, 37494, 38524, - 38875, 38923, 39698, 141386, 141380, 144341, 15261, 16408, 16441, 152137, 154832, - 163539, 40771, 40846, 102, 102, 102, 105, 102, 108, 102, 102, 108, 1396, 1398, 1396, - 1381, 1396, 1387, 1406, 1398, 1396, 1389, 1497, 1460, 1522, 1463, 1506, 1492, 1499, - 1500, 1501, 1512, 1514, 1513, 1473, 1513, 1474, 1513, 1468, 1473, 1513, 1468, 1474, - 1488, 1463, 1488, 1464, 1488, 1468, 1489, 1468, 1490, 1468, 1491, 1468, 1492, 1468, - 1493, 1468, 1494, 1468, 1496, 1468, 1497, 1468, 1498, 1468, 1499, 1468, 1500, 1468, - 1502, 1468, 1504, 1468, 1505, 1468, 1507, 1468, 1508, 1468, 1510, 1468, 1511, 1468, - 1512, 1468, 1514, 1468, 1493, 1465, 1489, 1471, 1499, 1471, 1508, 1471, 1488, 1500, - 1649, 1659, 1662, 1664, 1658, 1663, 1657, 1700, 1702, 1668, 1667, 1670, 1671, 1677, - 1676, 1678, 1672, 1688, 1681, 1705, 1711, 1715, 1713, 1722, 1723, 1728, 1729, 1726, - 1746, 1747, 1709, 1734, 1736, 1739, 1733, 1737, 1744, 1609, 1574, 1575, 1574, 1749, - 1574, 1608, 1574, 1735, 1574, 1734, 1574, 1736, 1574, 1744, 1574, 1609, 1740, 1574, - 1580, 1574, 1581, 1574, 1605, 1574, 1610, 1576, 1580, 1576, 1581, 1576, 1582, 1576, - 1605, 1576, 1609, 1576, 1610, 1578, 1580, 1578, 1581, 1578, 1582, 1578, 1605, 1578, - 1609, 1578, 1610, 1579, 1580, 1579, 1605, 1579, 1609, 1579, 1610, 1580, 1581, 1580, - 1605, 1581, 1605, 1582, 1580, 1582, 1581, 1582, 1605, 1587, 1580, 1587, 1581, 1587, - 1582, 1587, 1605, 1589, 1581, 1589, 1605, 1590, 1580, 1590, 1581, 1590, 1582, 1590, - 1605, 1591, 1581, 1591, 1605, 1592, 1605, 1593, 1580, 1593, 1605, 1594, 1580, 1594, - 1605, 1601, 1580, 1601, 1581, 1601, 1582, 1601, 1605, 1601, 1609, 1601, 1610, 1602, - 1581, 1602, 1605, 1602, 1609, 1602, 1610, 1603, 1575, 1603, 1580, 1603, 1581, 1603, - 1582, 1603, 1604, 1603, 1605, 1603, 1609, 1603, 1610, 1604, 1580, 1604, 1581, 1604, - 1582, 1604, 1605, 1604, 1609, 1604, 1610, 1605, 1580, 1605, 1605, 1605, 1609, 1605, - 1610, 1606, 1580, 1606, 1581, 1606, 1582, 1606, 1605, 1606, 1609, 1606, 1610, 1607, - 1580, 1607, 1605, 1607, 1609, 1607, 1610, 1610, 1581, 1610, 1582, 1610, 1609, 1584, - 1648, 1585, 1648, 1609, 1648, 32, 1612, 1617, 32, 1613, 1617, 32, 1614, 1617, 32, - 1615, 1617, 32, 1616, 1617, 32, 1617, 1648, 1574, 1585, 1574, 1586, 1574, 1606, - 1576, 1585, 1576, 1586, 1576, 1606, 1578, 1585, 1578, 1586, 1578, 1606, 1579, 1585, - 1579, 1586, 1579, 1606, 1605, 1575, 1606, 1585, 1606, 1586, 1606, 1606, 1610, 1585, - 1610, 1586, 1574, 1582, 1574, 1607, 1576, 1607, 1578, 1607, 1589, 1582, 1604, 1607, - 1606, 1607, 1607, 1648, 1579, 1607, 1587, 1607, 1588, 1605, 1588, 1607, 1600, 1614, - 1617, 1600, 1615, 1617, 1600, 1616, 1617, 1591, 1609, 1591, 1610, 1593, 1609, 1593, - 1610, 1594, 1609, 1594, 1610, 1587, 1609, 1587, 1610, 1588, 1609, 1588, 1610, 1581, - 1609, 1580, 1609, 1580, 1610, 1582, 1609, 1589, 1609, 1589, 1610, 1590, 1609, 1590, - 1610, 1588, 1580, 1588, 1581, 1588, 1582, 1588, 1585, 1587, 1585, 1589, 1585, 1590, - 1585, 1575, 1611, 1578, 1580, 1605, 1578, 1581, 1580, 1578, 1581, 1605, 1578, 1582, - 1605, 1578, 1605, 1580, 1578, 1605, 1581, 1578, 1605, 1582, 1581, 1605, 1610, 1581, - 1605, 1609, 1587, 1581, 1580, 1587, 1580, 1581, 1587, 1580, 1609, 1587, 1605, 1581, - 1587, 1605, 1580, 1587, 1605, 1605, 1589, 1581, 1581, 1589, 1605, 1605, 1588, 1581, - 1605, 1588, 1580, 1610, 1588, 1605, 1582, 1588, 1605, 1605, 1590, 1581, 1609, 1590, - 1582, 1605, 1591, 1605, 1581, 1591, 1605, 1605, 1591, 1605, 1610, 1593, 1580, 1605, - 1593, 1605, 1605, 1593, 1605, 1609, 1594, 1605, 1605, 1594, 1605, 1610, 1594, 1605, - 1609, 1601, 1582, 1605, 1602, 1605, 1581, 1602, 1605, 1605, 1604, 1581, 1605, 1604, - 1581, 1610, 1604, 1581, 1609, 1604, 1580, 1580, 1604, 1582, 1605, 1604, 1605, 1581, - 1605, 1581, 1580, 1605, 1581, 1610, 1605, 1580, 1581, 1605, 1582, 1605, 1605, 1580, - 1582, 1607, 1605, 1580, 1607, 1605, 1605, 1606, 1581, 1605, 1606, 1581, 1609, 1606, - 1580, 1605, 1606, 1580, 1609, 1606, 1605, 1610, 1606, 1605, 1609, 1610, 1605, 1605, - 1576, 1582, 1610, 1578, 1580, 1610, 1578, 1580, 1609, 1578, 1582, 1610, 1578, 1582, - 1609, 1578, 1605, 1610, 1578, 1605, 1609, 1580, 1605, 1610, 1580, 1581, 1609, 1580, - 1605, 1609, 1587, 1582, 1609, 1589, 1581, 1610, 1588, 1581, 1610, 1590, 1581, 1610, - 1604, 1580, 1610, 1604, 1605, 1610, 1610, 1580, 1610, 1610, 1605, 1610, 1605, 1605, - 1610, 1602, 1605, 1610, 1606, 1581, 1610, 1593, 1605, 1610, 1603, 1605, 1610, 1606, - 1580, 1581, 1605, 1582, 1610, 1604, 1580, 1605, 1603, 1605, 1605, 1580, 1581, 1610, - 1581, 1580, 1610, 1605, 1580, 1610, 1601, 1605, 1610, 1576, 1581, 1610, 1587, 1582, - 1610, 1606, 1580, 1610, 1589, 1604, 1746, 1602, 1604, 1746, 1575, 1604, 1604, 1607, - 1575, 1603, 1576, 1585, 1605, 1581, 1605, 1583, 1589, 1604, 1593, 1605, 1585, 1587, - 1608, 1604, 1593, 1604, 1610, 1607, 1608, 1587, 1604, 1605, 1589, 1604, 1609, 1589, - 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, - 1604, 1605, 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607, 1585, 1740, 1575, 1604, - 44, 12289, 12310, 12311, 8212, 8211, 95, 123, 125, 12308, 12309, 12304, 12305, 12298, - 12299, 12300, 12301, 12302, 12303, 91, 93, 35, 38, 42, 45, 60, 62, 92, 36, 37, 64, - 32, 1611, 1600, 1611, 1600, 1617, 32, 1618, 1600, 1618, 1569, 1570, 1571, 1572, - 1573, 1577, 1604, 1570, 1604, 1571, 1604, 1573, 34, 39, 94, 124, 126, 10629, 10630, - 12539, 12453, 12515, 162, 163, 172, 166, 165, 8361, 9474, 8592, 8593, 8594, 8595, - 9632, 9675, 66600, 66601, 66602, 66603, 66604, 66605, 66606, 66607, 66608, 66609, - 66610, 66611, 66612, 66613, 66614, 66615, 66616, 66617, 66618, 66619, 66620, 66621, - 66622, 66623, 66624, 66625, 66626, 66627, 66628, 66629, 66630, 66631, 66632, 66633, - 66634, 66635, 66636, 66637, 66638, 66639, 66776, 66777, 66778, 66779, 66780, 66781, - 66782, 66783, 66784, 66785, 66786, 66787, 66788, 66789, 66790, 66791, 66792, 66793, - 66794, 66795, 66796, 66797, 66798, 66799, 66800, 66801, 66802, 66803, 66804, 66805, - 66806, 66807, 66808, 66809, 66810, 66811, 66967, 66968, 66969, 66970, 66971, 66972, - 66973, 66974, 66975, 66976, 66977, 66979, 66980, 66981, 66982, 66983, 66984, 66985, - 66986, 66987, 66988, 66989, 66990, 66991, 66992, 66993, 66995, 66996, 66997, 66998, - 66999, 67000, 67001, 67003, 67004, 720, 721, 665, 675, 43878, 677, 676, 7569, 600, - 606, 681, 610, 667, 668, 615, 644, 682, 683, 122628, 42894, 622, 122629, 654, 122630, - 630, 631, 634, 122632, 638, 680, 678, 43879, 679, 11377, 655, 673, 674, 664, 448, - 449, 450, 122634, 122654, 68800, 68801, 68802, 68803, 68804, 68805, 68806, 68807, - 68808, 68809, 68810, 68811, 68812, 68813, 68814, 68815, 68816, 68817, 68818, 68819, - 68820, 68821, 68822, 68823, 68824, 68825, 68826, 68827, 68828, 68829, 68830, 68831, - 68832, 68833, 68834, 68835, 68836, 68837, 68838, 68839, 68840, 68841, 68842, 68843, - 68844, 68845, 68846, 68847, 68848, 68849, 68850, 68976, 68977, 68978, 68979, 68980, - 68981, 68982, 68983, 68984, 68985, 68986, 68987, 68988, 68989, 68990, 68991, 68992, - 68993, 68994, 68995, 68996, 68997, 71872, 71873, 71874, 71875, 71876, 71877, 71878, - 71879, 71880, 71881, 71882, 71883, 71884, 71885, 71886, 71887, 71888, 71889, 71890, - 71891, 71892, 71893, 71894, 71895, 71896, 71897, 71898, 71899, 71900, 71901, 71902, - 71903, 93792, 93793, 93794, 93795, 93796, 93797, 93798, 93799, 93800, 93801, 93802, - 93803, 93804, 93805, 93806, 93807, 93808, 93809, 93810, 93811, 93812, 93813, 93814, - 93815, 93816, 93817, 93818, 93819, 93820, 93821, 93822, 93823, 93883, 93884, 93885, - 93886, 93887, 93888, 93889, 93890, 93891, 93892, 93893, 93894, 93895, 93896, 93897, - 93898, 93899, 93900, 93901, 93902, 93903, 93904, 93905, 93906, 93907, 119127, 119141, - 119128, 119141, 119128, 119141, 119150, 119128, 119141, 119151, 119128, 119141, - 119152, 119128, 119141, 119153, 119128, 119141, 119154, 119225, 119141, 119226, - 119141, 119225, 119141, 119150, 119226, 119141, 119150, 119225, 119141, 119151, - 119226, 119141, 119151, 305, 567, 8711, 8706, 125218, 125219, 125220, 125221, 125222, - 125223, 125224, 125225, 125226, 125227, 125228, 125229, 125230, 125231, 125232, - 125233, 125234, 125235, 125236, 125237, 125238, 125239, 125240, 125241, 125242, - 125243, 125244, 125245, 125246, 125247, 125248, 125249, 125250, 125251, 1646, 1697, - 1647, 48, 44, 49, 44, 50, 44, 51, 44, 52, 44, 53, 44, 54, 44, 55, 44, 56, 44, 57, - 44, 12308, 115, 12309, 119, 122, 104, 118, 115, 100, 115, 115, 112, 112, 118, 119, - 99, 109, 114, 100, 106, 12411, 12363, 12467, 12467, 23383, 21452, 22810, 35299, - 20132, 26144, 28961, 21069, 24460, 20877, 26032, 21021, 32066, 36009, 22768, 21561, - 28436, 25237, 25429, 36938, 25351, 25171, 31105, 31354, 21512, 28288, 30003, 21106, - 21942, 37197, 12308, 26412, 12309, 12308, 19977, 12309, 12308, 20108, 12309, 12308, - 23433, 12309, 12308, 28857, 12309, 12308, 25171, 12309, 12308, 30423, 12309, 12308, - 21213, 12309, 12308, 25943, 12309, 24471, 21487, 20029, 20024, 20033, 131362, 20320, - 20411, 20482, 20602, 20633, 20687, 13470, 132666, 20820, 20836, 20855, 132380, 13497, - 20839, 132427, 20887, 20900, 20172, 20908, 168415, 20995, 13535, 21051, 21062, 21111, - 13589, 21253, 21254, 21321, 21338, 21363, 21373, 21375, 133676, 28784, 21450, 21471, - 133987, 21483, 21489, 21510, 21662, 21560, 21576, 21608, 21666, 21750, 21776, 21843, - 21859, 21892, 21931, 21939, 21954, 22294, 22295, 22097, 22132, 22766, 22478, 22516, - 22541, 22411, 22578, 22577, 22700, 136420, 22770, 22775, 22790, 22818, 22882, 136872, - 136938, 23020, 23067, 23079, 23000, 23142, 14062, 14076, 23304, 23358, 137672, 23491, - 23512, 23539, 138008, 23551, 23558, 24403, 14209, 23648, 23744, 23693, 138724, 23875, - 138726, 23918, 23915, 23932, 24033, 24034, 14383, 24061, 24104, 24125, 24169, 14434, - 139651, 14460, 24240, 24243, 24246, 172946, 140081, 33281, 24354, 14535, 144056, - 156122, 24418, 24427, 14563, 24474, 24525, 24535, 24569, 24705, 14650, 14620, 141012, - 24775, 24904, 24908, 24954, 25010, 24996, 25007, 25054, 25115, 25181, 25265, 25300, - 25424, 142092, 25405, 25340, 25448, 25475, 25572, 142321, 25634, 25541, 25513, 14894, - 25705, 25726, 25757, 25719, 14956, 25964, 143370, 26083, 26360, 26185, 15129, 15112, - 15076, 20882, 20885, 26368, 26268, 32941, 17369, 26401, 26462, 26451, 144323, 15177, - 26618, 26501, 26706, 144493, 26766, 26655, 26900, 26946, 27043, 27114, 27304, 145059, - 27355, 15384, 27425, 145575, 27476, 15438, 27506, 27551, 27579, 146061, 138507, - 146170, 27726, 146620, 27839, 27853, 27751, 27926, 27966, 28009, 28024, 28037, 146718, - 27956, 28207, 28270, 15667, 28359, 147153, 28153, 28526, 147294, 147342, 28614, - 28729, 28699, 15766, 28746, 28797, 28791, 28845, 132389, 28997, 148067, 29084, 148395, - 29224, 29264, 149000, 29312, 29333, 149301, 149524, 29562, 29579, 16044, 29605, - 16056, 29767, 29788, 29829, 29898, 16155, 29988, 150582, 30014, 150674, 139679, - 30224, 151457, 151480, 151620, 16380, 16392, 151795, 151794, 151833, 151859, 30494, - 30495, 30603, 16454, 16534, 152605, 30798, 16611, 153126, 153242, 153285, 31211, - 16687, 31306, 31311, 153980, 154279, 31470, 16898, 154539, 31686, 31689, 16935, - 154752, 31954, 17056, 31976, 31971, 32000, 155526, 32099, 17153, 32199, 32258, 32325, - 17204, 156200, 156231, 17241, 156377, 32634, 156478, 32661, 32762, 156890, 156963, - 32864, 157096, 32880, 144223, 17365, 32946, 33027, 17419, 33086, 23221, 157607, - 157621, 144275, 144284, 33284, 36766, 17515, 33425, 33419, 33437, 21171, 33457, - 33459, 33469, 33510, 158524, 33565, 33635, 33709, 33571, 33725, 33767, 33619, 33738, - 33740, 33756, 158774, 159083, 158933, 17707, 34033, 34035, 34070, 160714, 34148, - 159532, 17757, 17761, 159665, 159954, 17771, 34384, 34407, 34409, 34473, 34440, - 34574, 34530, 34600, 34667, 34694, 17879, 34785, 34817, 17913, 34912, 161383, 35031, - 35038, 17973, 35066, 13499, 161966, 162150, 18110, 18119, 35488, 162984, 36011, - 36033, 36123, 36215, 163631, 133124, 36299, 36284, 36336, 133342, 36564, 165330, - 165357, 37012, 37105, 37137, 165678, 37147, 37432, 37591, 37592, 37500, 37881, 37909, - 166906, 38283, 18837, 38327, 167287, 18918, 38595, 23986, 38691, 168261, 168474, - 19054, 19062, 38880, 168970, 19122, 169110, 38953, 169398, 39138, 19251, 39209, - 39335, 39362, 39422, 19406, 170800, 40000, 40189, 19662, 19693, 40295, 172238, 19704, - 172293, 172558, 172689, 19798, 40702, 40709, 40719, 40726, 173568, +// Block size for two-level table (2^6 = 64 code points per block). +constexpr uint32_t IDNA_BLOCK_BITS = 6u; +constexpr uint32_t IDNA_BLOCK_SIZE = 64u; +constexpr uint32_t IDNA_BLOCK_MASK = 63u; -}; -const uint32_t table[8198][2] = -{ - {0, 1}, {65, 16777219}, {66, 16777475}, {67, 16777731}, - {68, 16777987}, {69, 16778243}, {70, 16778499}, {71, 16778755}, - {72, 16779011}, {73, 16779267}, {74, 16779523}, {75, 16779779}, - {76, 16780035}, {77, 16780291}, {78, 16780547}, {79, 16780803}, - {80, 16781059}, {81, 16781315}, {82, 16781571}, {83, 16781827}, - {84, 16782083}, {85, 16782339}, {86, 16782595}, {87, 16782851}, - {88, 16783107}, {89, 16783363}, {90, 16783619}, {91, 1}, - {128, 2}, {160, 16783875}, {161, 1}, {168, 33561347}, - {169, 1}, {170, 16777219}, {171, 1}, {173, 0}, - {174, 1}, {175, 33561859}, {176, 1}, {178, 16785155}, - {179, 16785411}, {180, 33562883}, {181, 16786179}, {182, 1}, - {184, 33563651}, {185, 16786947}, {186, 16780803}, {187, 1}, - {188, 50341635}, {189, 50342403}, {190, 50343171}, {191, 1}, - {192, 16789507}, {193, 16789763}, {194, 16790019}, {195, 16790275}, - {196, 16790531}, {197, 16790787}, {198, 16791043}, {199, 16791299}, - {200, 16791555}, {201, 16791811}, {202, 16792067}, {203, 16792323}, - {204, 16792579}, {205, 16792835}, {206, 16793091}, {207, 16793347}, - {208, 16793603}, {209, 16793859}, {210, 16794115}, {211, 16794371}, - {212, 16794627}, {213, 16794883}, {214, 16795139}, {215, 1}, - {216, 16795395}, {217, 16795651}, {218, 16795907}, {219, 16796163}, - {220, 16796419}, {221, 16796675}, {222, 16796931}, {223, 1}, - {256, 16797187}, {257, 1}, {258, 16797443}, {259, 1}, - {260, 16797699}, {261, 1}, {262, 16797955}, {263, 1}, - {264, 16798211}, {265, 1}, {266, 16798467}, {267, 1}, - {268, 16798723}, {269, 1}, {270, 16798979}, {271, 1}, - {272, 16799235}, {273, 1}, {274, 16799491}, {275, 1}, - {276, 16799747}, {277, 1}, {278, 16800003}, {279, 1}, - {280, 16800259}, {281, 1}, {282, 16800515}, {283, 1}, - {284, 16800771}, {285, 1}, {286, 16801027}, {287, 1}, - {288, 16801283}, {289, 1}, {290, 16801539}, {291, 1}, - {292, 16801795}, {293, 1}, {294, 16802051}, {295, 1}, - {296, 16802307}, {297, 1}, {298, 16802563}, {299, 1}, - {300, 16802819}, {301, 1}, {302, 16803075}, {303, 1}, - {304, 33580547}, {305, 1}, {306, 33556483}, {308, 16803843}, - {309, 1}, {310, 16804099}, {311, 1}, {313, 16804355}, - {314, 1}, {315, 16804611}, {316, 1}, {317, 16804867}, - {318, 1}, {319, 33582339}, {321, 16805635}, {322, 1}, - {323, 16805891}, {324, 1}, {325, 16806147}, {326, 1}, - {327, 16806403}, {328, 1}, {329, 33583875}, {330, 16807171}, - {331, 1}, {332, 16807427}, {333, 1}, {334, 16807683}, - {335, 1}, {336, 16807939}, {337, 1}, {338, 16808195}, - {339, 1}, {340, 16808451}, {341, 1}, {342, 16808707}, - {343, 1}, {344, 16808963}, {345, 1}, {346, 16809219}, - {347, 1}, {348, 16809475}, {349, 1}, {350, 16809731}, - {351, 1}, {352, 16809987}, {353, 1}, {354, 16810243}, - {355, 1}, {356, 16810499}, {357, 1}, {358, 16810755}, - {359, 1}, {360, 16811011}, {361, 1}, {362, 16811267}, - {363, 1}, {364, 16811523}, {365, 1}, {366, 16811779}, - {367, 1}, {368, 16812035}, {369, 1}, {370, 16812291}, - {371, 1}, {372, 16812547}, {373, 1}, {374, 16812803}, - {375, 1}, {376, 16813059}, {377, 16813315}, {378, 1}, - {379, 16813571}, {380, 1}, {381, 16813827}, {382, 1}, - {383, 16781827}, {384, 1}, {385, 16814083}, {386, 16814339}, - {387, 1}, {388, 16814595}, {389, 1}, {390, 16814851}, - {391, 16815107}, {392, 1}, {393, 16815363}, {394, 16815619}, - {395, 16815875}, {396, 1}, {398, 16816131}, {399, 16816387}, - {400, 16816643}, {401, 16816899}, {402, 1}, {403, 16817155}, - {404, 16817411}, {405, 1}, {406, 16817667}, {407, 16817923}, - {408, 16818179}, {409, 1}, {412, 16818435}, {413, 16818691}, - {414, 1}, {415, 16818947}, {416, 16819203}, {417, 1}, - {418, 16819459}, {419, 1}, {420, 16819715}, {421, 1}, - {422, 16819971}, {423, 16820227}, {424, 1}, {425, 16820483}, - {426, 1}, {428, 16820739}, {429, 1}, {430, 16820995}, - {431, 16821251}, {432, 1}, {433, 16821507}, {434, 16821763}, - {435, 16822019}, {436, 1}, {437, 16822275}, {438, 1}, - {439, 16822531}, {440, 16822787}, {441, 1}, {444, 16823043}, - {445, 1}, {452, 33600515}, {455, 33601027}, {458, 33601539}, - {461, 16824835}, {462, 1}, {463, 16825091}, {464, 1}, - {465, 16825347}, {466, 1}, {467, 16825603}, {468, 1}, - {469, 16825859}, {470, 1}, {471, 16826115}, {472, 1}, - {473, 16826371}, {474, 1}, {475, 16826627}, {476, 1}, - {478, 16826883}, {479, 1}, {480, 16827139}, {481, 1}, - {482, 16827395}, {483, 1}, {484, 16827651}, {485, 1}, - {486, 16827907}, {487, 1}, {488, 16828163}, {489, 1}, - {490, 16828419}, {491, 1}, {492, 16828675}, {493, 1}, - {494, 16828931}, {495, 1}, {497, 33606403}, {500, 16829699}, - {501, 1}, {502, 16829955}, {503, 16830211}, {504, 16830467}, - {505, 1}, {506, 16830723}, {507, 1}, {508, 16830979}, - {509, 1}, {510, 16831235}, {511, 1}, {512, 16831491}, - {513, 1}, {514, 16831747}, {515, 1}, {516, 16832003}, - {517, 1}, {518, 16832259}, {519, 1}, {520, 16832515}, - {521, 1}, {522, 16832771}, {523, 1}, {524, 16833027}, - {525, 1}, {526, 16833283}, {527, 1}, {528, 16833539}, - {529, 1}, {530, 16833795}, {531, 1}, {532, 16834051}, - {533, 1}, {534, 16834307}, {535, 1}, {536, 16834563}, - {537, 1}, {538, 16834819}, {539, 1}, {540, 16835075}, - {541, 1}, {542, 16835331}, {543, 1}, {544, 16835587}, - {545, 1}, {546, 16835843}, {547, 1}, {548, 16836099}, - {549, 1}, {550, 16836355}, {551, 1}, {552, 16836611}, - {553, 1}, {554, 16836867}, {555, 1}, {556, 16837123}, - {557, 1}, {558, 16837379}, {559, 1}, {560, 16837635}, - {561, 1}, {562, 16837891}, {563, 1}, {570, 16838147}, - {571, 16838403}, {572, 1}, {573, 16838659}, {574, 16838915}, - {575, 1}, {577, 16839171}, {578, 1}, {579, 16839427}, - {580, 16839683}, {581, 16839939}, {582, 16840195}, {583, 1}, - {584, 16840451}, {585, 1}, {586, 16840707}, {587, 1}, - {588, 16840963}, {589, 1}, {590, 16841219}, {591, 1}, - {688, 16779011}, {689, 16841475}, {690, 16779523}, {691, 16781571}, - {692, 16841731}, {693, 16841987}, {694, 16842243}, {695, 16782851}, - {696, 16783363}, {697, 1}, {728, 33619715}, {729, 33620227}, - {730, 33620739}, {731, 33621251}, {732, 33621763}, {733, 33622275}, - {734, 1}, {736, 16817411}, {737, 16780035}, {738, 16781827}, - {739, 16783107}, {740, 16845571}, {741, 1}, {832, 16845827}, - {833, 16785923}, {834, 1}, {835, 16846083}, {836, 33623555}, - {837, 16846851}, {838, 1}, {847, 0}, {848, 1}, - {880, 16847107}, {881, 1}, {882, 16847363}, {883, 1}, - {884, 16847619}, {885, 1}, {886, 16847875}, {887, 1}, - {888, 2}, {890, 33625347}, {891, 1}, {894, 16848643}, - {895, 16848899}, {896, 2}, {900, 33562883}, {901, 50403587}, - {902, 16849923}, {903, 16805379}, {904, 16850179}, {905, 16850435}, - {906, 16850691}, {907, 2}, {908, 16850947}, {909, 2}, - {910, 16851203}, {911, 16851459}, {912, 1}, {913, 16851715}, - {914, 16851971}, {915, 16852227}, {916, 16852483}, {917, 16852739}, - {918, 16852995}, {919, 16853251}, {920, 16853507}, {921, 16846851}, - {922, 16853763}, {923, 16854019}, {924, 16786179}, {925, 16854275}, - {926, 16854531}, {927, 16854787}, {928, 16855043}, {929, 16855299}, - {930, 2}, {931, 16855555}, {932, 16855811}, {933, 16856067}, - {934, 16856323}, {935, 16856579}, {936, 16856835}, {937, 16857091}, - {938, 16857347}, {939, 16857603}, {940, 1}, {975, 16857859}, - {976, 16851971}, {977, 16853507}, {978, 16856067}, {979, 16851203}, - {980, 16857603}, {981, 16856323}, {982, 16855043}, {983, 1}, - {984, 16858115}, {985, 1}, {986, 16858371}, {987, 1}, - {988, 16858627}, {989, 1}, {990, 16858883}, {991, 1}, - {992, 16859139}, {993, 1}, {994, 16859395}, {995, 1}, - {996, 16859651}, {997, 1}, {998, 16859907}, {999, 1}, - {1000, 16860163}, {1001, 1}, {1002, 16860419}, {1003, 1}, - {1004, 16860675}, {1005, 1}, {1006, 16860931}, {1007, 1}, - {1008, 16853763}, {1009, 16855299}, {1010, 16855555}, {1011, 1}, - {1012, 16853507}, {1013, 16852739}, {1014, 1}, {1015, 16861187}, - {1016, 1}, {1017, 16855555}, {1018, 16861443}, {1019, 1}, - {1021, 16861699}, {1022, 16861955}, {1023, 16862211}, {1024, 16862467}, - {1025, 16862723}, {1026, 16862979}, {1027, 16863235}, {1028, 16863491}, - {1029, 16863747}, {1030, 16864003}, {1031, 16864259}, {1032, 16864515}, - {1033, 16864771}, {1034, 16865027}, {1035, 16865283}, {1036, 16865539}, - {1037, 16865795}, {1038, 16866051}, {1039, 16866307}, {1040, 16866563}, - {1041, 16866819}, {1042, 16867075}, {1043, 16867331}, {1044, 16867587}, - {1045, 16867843}, {1046, 16868099}, {1047, 16868355}, {1048, 16868611}, - {1049, 16868867}, {1050, 16869123}, {1051, 16869379}, {1052, 16869635}, - {1053, 16869891}, {1054, 16870147}, {1055, 16870403}, {1056, 16870659}, - {1057, 16870915}, {1058, 16871171}, {1059, 16871427}, {1060, 16871683}, - {1061, 16871939}, {1062, 16872195}, {1063, 16872451}, {1064, 16872707}, - {1065, 16872963}, {1066, 16873219}, {1067, 16873475}, {1068, 16873731}, - {1069, 16873987}, {1070, 16874243}, {1071, 16874499}, {1072, 1}, - {1120, 16874755}, {1121, 1}, {1122, 16875011}, {1123, 1}, - {1124, 16875267}, {1125, 1}, {1126, 16875523}, {1127, 1}, - {1128, 16875779}, {1129, 1}, {1130, 16876035}, {1131, 1}, - {1132, 16876291}, {1133, 1}, {1134, 16876547}, {1135, 1}, - {1136, 16876803}, {1137, 1}, {1138, 16877059}, {1139, 1}, - {1140, 16877315}, {1141, 1}, {1142, 16877571}, {1143, 1}, - {1144, 16877827}, {1145, 1}, {1146, 16878083}, {1147, 1}, - {1148, 16878339}, {1149, 1}, {1150, 16878595}, {1151, 1}, - {1152, 16878851}, {1153, 1}, {1162, 16879107}, {1163, 1}, - {1164, 16879363}, {1165, 1}, {1166, 16879619}, {1167, 1}, - {1168, 16879875}, {1169, 1}, {1170, 16880131}, {1171, 1}, - {1172, 16880387}, {1173, 1}, {1174, 16880643}, {1175, 1}, - {1176, 16880899}, {1177, 1}, {1178, 16881155}, {1179, 1}, - {1180, 16881411}, {1181, 1}, {1182, 16881667}, {1183, 1}, - {1184, 16881923}, {1185, 1}, {1186, 16882179}, {1187, 1}, - {1188, 16882435}, {1189, 1}, {1190, 16882691}, {1191, 1}, - {1192, 16882947}, {1193, 1}, {1194, 16883203}, {1195, 1}, - {1196, 16883459}, {1197, 1}, {1198, 16883715}, {1199, 1}, - {1200, 16883971}, {1201, 1}, {1202, 16884227}, {1203, 1}, - {1204, 16884483}, {1205, 1}, {1206, 16884739}, {1207, 1}, - {1208, 16884995}, {1209, 1}, {1210, 16885251}, {1211, 1}, - {1212, 16885507}, {1213, 1}, {1214, 16885763}, {1215, 1}, - {1216, 16886019}, {1217, 16886275}, {1218, 1}, {1219, 16886531}, - {1220, 1}, {1221, 16886787}, {1222, 1}, {1223, 16887043}, - {1224, 1}, {1225, 16887299}, {1226, 1}, {1227, 16887555}, - {1228, 1}, {1229, 16887811}, {1230, 1}, {1232, 16888067}, - {1233, 1}, {1234, 16888323}, {1235, 1}, {1236, 16888579}, - {1237, 1}, {1238, 16888835}, {1239, 1}, {1240, 16889091}, - {1241, 1}, {1242, 16889347}, {1243, 1}, {1244, 16889603}, - {1245, 1}, {1246, 16889859}, {1247, 1}, {1248, 16890115}, - {1249, 1}, {1250, 16890371}, {1251, 1}, {1252, 16890627}, - {1253, 1}, {1254, 16890883}, {1255, 1}, {1256, 16891139}, - {1257, 1}, {1258, 16891395}, {1259, 1}, {1260, 16891651}, - {1261, 1}, {1262, 16891907}, {1263, 1}, {1264, 16892163}, - {1265, 1}, {1266, 16892419}, {1267, 1}, {1268, 16892675}, - {1269, 1}, {1270, 16892931}, {1271, 1}, {1272, 16893187}, - {1273, 1}, {1274, 16893443}, {1275, 1}, {1276, 16893699}, - {1277, 1}, {1278, 16893955}, {1279, 1}, {1280, 16894211}, - {1281, 1}, {1282, 16894467}, {1283, 1}, {1284, 16894723}, - {1285, 1}, {1286, 16894979}, {1287, 1}, {1288, 16895235}, - {1289, 1}, {1290, 16895491}, {1291, 1}, {1292, 16895747}, - {1293, 1}, {1294, 16896003}, {1295, 1}, {1296, 16896259}, - {1297, 1}, {1298, 16896515}, {1299, 1}, {1300, 16896771}, - {1301, 1}, {1302, 16897027}, {1303, 1}, {1304, 16897283}, - {1305, 1}, {1306, 16897539}, {1307, 1}, {1308, 16897795}, - {1309, 1}, {1310, 16898051}, {1311, 1}, {1312, 16898307}, - {1313, 1}, {1314, 16898563}, {1315, 1}, {1316, 16898819}, - {1317, 1}, {1318, 16899075}, {1319, 1}, {1320, 16899331}, - {1321, 1}, {1322, 16899587}, {1323, 1}, {1324, 16899843}, - {1325, 1}, {1326, 16900099}, {1327, 1}, {1328, 2}, - {1329, 16900355}, {1330, 16900611}, {1331, 16900867}, {1332, 16901123}, - {1333, 16901379}, {1334, 16901635}, {1335, 16901891}, {1336, 16902147}, - {1337, 16902403}, {1338, 16902659}, {1339, 16902915}, {1340, 16903171}, - {1341, 16903427}, {1342, 16903683}, {1343, 16903939}, {1344, 16904195}, - {1345, 16904451}, {1346, 16904707}, {1347, 16904963}, {1348, 16905219}, - {1349, 16905475}, {1350, 16905731}, {1351, 16905987}, {1352, 16906243}, - {1353, 16906499}, {1354, 16906755}, {1355, 16907011}, {1356, 16907267}, - {1357, 16907523}, {1358, 16907779}, {1359, 16908035}, {1360, 16908291}, - {1361, 16908547}, {1362, 16908803}, {1363, 16909059}, {1364, 16909315}, - {1365, 16909571}, {1366, 16909827}, {1367, 2}, {1369, 1}, - {1415, 33687299}, {1416, 1}, {1419, 2}, {1421, 1}, - {1424, 2}, {1425, 1}, {1480, 2}, {1488, 1}, - {1515, 2}, {1519, 1}, {1525, 2}, {1542, 1}, - {1564, 2}, {1565, 1}, {1653, 33687811}, {1654, 33688323}, - {1655, 33688835}, {1656, 33689347}, {1657, 1}, {1757, 2}, - {1758, 1}, {1806, 2}, {1808, 1}, {1867, 2}, - {1869, 1}, {1970, 2}, {1984, 1}, {2043, 2}, - {2045, 1}, {2094, 2}, {2096, 1}, {2111, 2}, - {2112, 1}, {2140, 2}, {2142, 1}, {2143, 2}, - {2144, 1}, {2155, 2}, {2160, 1}, {2192, 2}, - {2199, 1}, {2274, 2}, {2275, 1}, {2392, 33689859}, - {2393, 33690371}, {2394, 33690883}, {2395, 33691395}, {2396, 33691907}, - {2397, 33692419}, {2398, 33692931}, {2399, 33693443}, {2400, 1}, - {2436, 2}, {2437, 1}, {2445, 2}, {2447, 1}, - {2449, 2}, {2451, 1}, {2473, 2}, {2474, 1}, - {2481, 2}, {2482, 1}, {2483, 2}, {2486, 1}, - {2490, 2}, {2492, 1}, {2501, 2}, {2503, 1}, - {2505, 2}, {2507, 1}, {2511, 2}, {2519, 1}, - {2520, 2}, {2524, 33693955}, {2525, 33694467}, {2526, 2}, - {2527, 33694979}, {2528, 1}, {2532, 2}, {2534, 1}, - {2559, 2}, {2561, 1}, {2564, 2}, {2565, 1}, - {2571, 2}, {2575, 1}, {2577, 2}, {2579, 1}, - {2601, 2}, {2602, 1}, {2609, 2}, {2610, 1}, - {2611, 33695491}, {2612, 2}, {2613, 1}, {2614, 33696003}, - {2615, 2}, {2616, 1}, {2618, 2}, {2620, 1}, - {2621, 2}, {2622, 1}, {2627, 2}, {2631, 1}, - {2633, 2}, {2635, 1}, {2638, 2}, {2641, 1}, - {2642, 2}, {2649, 33696515}, {2650, 33697027}, {2651, 33697539}, - {2652, 1}, {2653, 2}, {2654, 33698051}, {2655, 2}, - {2662, 1}, {2679, 2}, {2689, 1}, {2692, 2}, - {2693, 1}, {2702, 2}, {2703, 1}, {2706, 2}, - {2707, 1}, {2729, 2}, {2730, 1}, {2737, 2}, - {2738, 1}, {2740, 2}, {2741, 1}, {2746, 2}, - {2748, 1}, {2758, 2}, {2759, 1}, {2762, 2}, - {2763, 1}, {2766, 2}, {2768, 1}, {2769, 2}, - {2784, 1}, {2788, 2}, {2790, 1}, {2802, 2}, - {2809, 1}, {2816, 2}, {2817, 1}, {2820, 2}, - {2821, 1}, {2829, 2}, {2831, 1}, {2833, 2}, - {2835, 1}, {2857, 2}, {2858, 1}, {2865, 2}, - {2866, 1}, {2868, 2}, {2869, 1}, {2874, 2}, - {2876, 1}, {2885, 2}, {2887, 1}, {2889, 2}, - {2891, 1}, {2894, 2}, {2901, 1}, {2904, 2}, - {2908, 33698563}, {2909, 33699075}, {2910, 2}, {2911, 1}, - {2916, 2}, {2918, 1}, {2936, 2}, {2946, 1}, - {2948, 2}, {2949, 1}, {2955, 2}, {2958, 1}, - {2961, 2}, {2962, 1}, {2966, 2}, {2969, 1}, - {2971, 2}, {2972, 1}, {2973, 2}, {2974, 1}, - {2976, 2}, {2979, 1}, {2981, 2}, {2984, 1}, - {2987, 2}, {2990, 1}, {3002, 2}, {3006, 1}, - {3011, 2}, {3014, 1}, {3017, 2}, {3018, 1}, - {3022, 2}, {3024, 1}, {3025, 2}, {3031, 1}, - {3032, 2}, {3046, 1}, {3067, 2}, {3072, 1}, - {3085, 2}, {3086, 1}, {3089, 2}, {3090, 1}, - {3113, 2}, {3114, 1}, {3130, 2}, {3132, 1}, - {3141, 2}, {3142, 1}, {3145, 2}, {3146, 1}, - {3150, 2}, {3157, 1}, {3159, 2}, {3160, 1}, - {3163, 2}, {3164, 1}, {3166, 2}, {3168, 1}, - {3172, 2}, {3174, 1}, {3184, 2}, {3191, 1}, - {3213, 2}, {3214, 1}, {3217, 2}, {3218, 1}, - {3241, 2}, {3242, 1}, {3252, 2}, {3253, 1}, - {3258, 2}, {3260, 1}, {3269, 2}, {3270, 1}, - {3273, 2}, {3274, 1}, {3278, 2}, {3285, 1}, - {3287, 2}, {3292, 1}, {3295, 2}, {3296, 1}, - {3300, 2}, {3302, 1}, {3312, 2}, {3313, 1}, - {3316, 2}, {3328, 1}, {3341, 2}, {3342, 1}, - {3345, 2}, {3346, 1}, {3397, 2}, {3398, 1}, - {3401, 2}, {3402, 1}, {3408, 2}, {3412, 1}, - {3428, 2}, {3430, 1}, {3456, 2}, {3457, 1}, - {3460, 2}, {3461, 1}, {3479, 2}, {3482, 1}, - {3506, 2}, {3507, 1}, {3516, 2}, {3517, 1}, - {3518, 2}, {3520, 1}, {3527, 2}, {3530, 1}, - {3531, 2}, {3535, 1}, {3541, 2}, {3542, 1}, - {3543, 2}, {3544, 1}, {3552, 2}, {3558, 1}, - {3568, 2}, {3570, 1}, {3573, 2}, {3585, 1}, - {3635, 33699587}, {3636, 1}, {3643, 2}, {3647, 1}, - {3676, 2}, {3713, 1}, {3715, 2}, {3716, 1}, - {3717, 2}, {3718, 1}, {3723, 2}, {3724, 1}, - {3748, 2}, {3749, 1}, {3750, 2}, {3751, 1}, - {3763, 33700099}, {3764, 1}, {3774, 2}, {3776, 1}, - {3781, 2}, {3782, 1}, {3783, 2}, {3784, 1}, - {3791, 2}, {3792, 1}, {3802, 2}, {3804, 33700611}, - {3805, 33701123}, {3806, 1}, {3808, 2}, {3840, 1}, - {3852, 16924419}, {3853, 1}, {3907, 33701891}, {3908, 1}, - {3912, 2}, {3913, 1}, {3917, 33702403}, {3918, 1}, - {3922, 33702915}, {3923, 1}, {3927, 33703427}, {3928, 1}, - {3932, 33703939}, {3933, 1}, {3945, 33704451}, {3946, 1}, - {3949, 2}, {3953, 1}, {3955, 33704963}, {3956, 1}, - {3957, 33705475}, {3958, 33705987}, {3959, 50483715}, {3960, 33707267}, - {3961, 50484995}, {3962, 1}, {3969, 33706755}, {3970, 1}, - {3987, 33708547}, {3988, 1}, {3992, 2}, {3993, 1}, - {3997, 33709059}, {3998, 1}, {4002, 33709571}, {4003, 1}, - {4007, 33710083}, {4008, 1}, {4012, 33710595}, {4013, 1}, - {4025, 33711107}, {4026, 1}, {4029, 2}, {4030, 1}, - {4045, 2}, {4046, 1}, {4059, 2}, {4096, 1}, - {4256, 16934403}, {4257, 16934659}, {4258, 16934915}, {4259, 16935171}, - {4260, 16935427}, {4261, 16935683}, {4262, 16935939}, {4263, 16936195}, - {4264, 16936451}, {4265, 16936707}, {4266, 16936963}, {4267, 16937219}, - {4268, 16937475}, {4269, 16937731}, {4270, 16937987}, {4271, 16938243}, - {4272, 16938499}, {4273, 16938755}, {4274, 16939011}, {4275, 16939267}, - {4276, 16939523}, {4277, 16939779}, {4278, 16940035}, {4279, 16940291}, - {4280, 16940547}, {4281, 16940803}, {4282, 16941059}, {4283, 16941315}, - {4284, 16941571}, {4285, 16941827}, {4286, 16942083}, {4287, 16942339}, - {4288, 16942595}, {4289, 16942851}, {4290, 16943107}, {4291, 16943363}, - {4292, 16943619}, {4293, 16943875}, {4294, 2}, {4295, 16944131}, - {4296, 2}, {4301, 16944387}, {4302, 2}, {4304, 1}, - {4348, 16944643}, {4349, 1}, {4447, 0}, {4449, 1}, - {4681, 2}, {4682, 1}, {4686, 2}, {4688, 1}, - {4695, 2}, {4696, 1}, {4697, 2}, {4698, 1}, - {4702, 2}, {4704, 1}, {4745, 2}, {4746, 1}, - {4750, 2}, {4752, 1}, {4785, 2}, {4786, 1}, - {4790, 2}, {4792, 1}, {4799, 2}, {4800, 1}, - {4801, 2}, {4802, 1}, {4806, 2}, {4808, 1}, - {4823, 2}, {4824, 1}, {4881, 2}, {4882, 1}, - {4886, 2}, {4888, 1}, {4955, 2}, {4957, 1}, - {4989, 2}, {4992, 1}, {5018, 2}, {5024, 1}, - {5110, 2}, {5112, 16944899}, {5113, 16945155}, {5114, 16945411}, - {5115, 16945667}, {5116, 16945923}, {5117, 16946179}, {5118, 2}, - {5120, 1}, {5760, 2}, {5761, 1}, {5789, 2}, - {5792, 1}, {5881, 2}, {5888, 1}, {5910, 2}, - {5919, 1}, {5943, 2}, {5952, 1}, {5972, 2}, - {5984, 1}, {5997, 2}, {5998, 1}, {6001, 2}, - {6002, 1}, {6004, 2}, {6016, 1}, {6068, 0}, - {6070, 1}, {6110, 2}, {6112, 1}, {6122, 2}, - {6128, 1}, {6138, 2}, {6144, 1}, {6155, 0}, - {6160, 1}, {6170, 2}, {6176, 1}, {6265, 2}, - {6272, 1}, {6315, 2}, {6320, 1}, {6390, 2}, - {6400, 1}, {6431, 2}, {6432, 1}, {6444, 2}, - {6448, 1}, {6460, 2}, {6464, 1}, {6465, 2}, - {6468, 1}, {6510, 2}, {6512, 1}, {6517, 2}, - {6528, 1}, {6572, 2}, {6576, 1}, {6602, 2}, - {6608, 1}, {6619, 2}, {6622, 1}, {6684, 2}, - {6686, 1}, {6751, 2}, {6752, 1}, {6781, 2}, - {6783, 1}, {6794, 2}, {6800, 1}, {6810, 2}, - {6816, 1}, {6830, 2}, {6832, 1}, {6878, 2}, - {6880, 1}, {6892, 2}, {6912, 1}, {6989, 2}, - {6990, 1}, {7156, 2}, {7164, 1}, {7224, 2}, - {7227, 1}, {7242, 2}, {7245, 1}, {7296, 16867075}, - {7297, 16867587}, {7298, 16870147}, {7299, 16870915}, {7300, 16871171}, - {7302, 16873219}, {7303, 16875011}, {7304, 16946435}, {7305, 16946691}, - {7306, 1}, {7307, 2}, {7312, 16946947}, {7313, 16947203}, - {7314, 16947459}, {7315, 16947715}, {7316, 16947971}, {7317, 16948227}, - {7318, 16948483}, {7319, 16948739}, {7320, 16948995}, {7321, 16949251}, - {7322, 16949507}, {7323, 16949763}, {7324, 16944643}, {7325, 16950019}, - {7326, 16950275}, {7327, 16950531}, {7328, 16950787}, {7329, 16951043}, - {7330, 16951299}, {7331, 16951555}, {7332, 16951811}, {7333, 16952067}, - {7334, 16952323}, {7335, 16952579}, {7336, 16952835}, {7337, 16953091}, - {7338, 16953347}, {7339, 16953603}, {7340, 16953859}, {7341, 16954115}, - {7342, 16954371}, {7343, 16954627}, {7344, 16954883}, {7345, 16955139}, - {7346, 16955395}, {7347, 16955651}, {7348, 16955907}, {7349, 16956163}, - {7350, 16956419}, {7351, 16956675}, {7352, 16956931}, {7353, 16957187}, - {7354, 16957443}, {7355, 2}, {7357, 16957699}, {7358, 16957955}, - {7359, 16958211}, {7360, 1}, {7368, 2}, {7376, 1}, - {7419, 2}, {7424, 1}, {7468, 16777219}, {7469, 16791043}, - {7470, 16777475}, {7471, 1}, {7472, 16777987}, {7473, 16778243}, - {7474, 16816131}, {7475, 16778755}, {7476, 16779011}, {7477, 16779267}, - {7478, 16779523}, {7479, 16779779}, {7480, 16780035}, {7481, 16780291}, - {7482, 16780547}, {7483, 1}, {7484, 16780803}, {7485, 16835843}, - {7486, 16781059}, {7487, 16781571}, {7488, 16782083}, {7489, 16782339}, - {7490, 16782851}, {7491, 16777219}, {7492, 16958467}, {7493, 16958723}, - {7494, 16958979}, {7495, 16777475}, {7496, 16777987}, {7497, 16778243}, - {7498, 16816387}, {7499, 16816643}, {7500, 16959235}, {7501, 16778755}, - {7502, 1}, {7503, 16779779}, {7504, 16780291}, {7505, 16807171}, - {7506, 16780803}, {7507, 16814851}, {7508, 16959491}, {7509, 16959747}, - {7510, 16781059}, {7511, 16782083}, {7512, 16782339}, {7513, 16960003}, - {7514, 16818435}, {7515, 16782595}, {7516, 16960259}, {7517, 16851971}, - {7518, 16852227}, {7519, 16852483}, {7520, 16856323}, {7521, 16856579}, - {7522, 16779267}, {7523, 16781571}, {7524, 16782339}, {7525, 16782595}, - {7526, 16851971}, {7527, 16852227}, {7528, 16855299}, {7529, 16856323}, - {7530, 16856579}, {7531, 1}, {7544, 16869891}, {7545, 1}, - {7579, 16960515}, {7580, 16777731}, {7581, 16960771}, {7582, 16793603}, - {7583, 16959235}, {7584, 16778499}, {7585, 16961027}, {7586, 16961283}, - {7587, 16961539}, {7588, 16817923}, {7589, 16817667}, {7590, 16961795}, - {7591, 16962051}, {7592, 16962307}, {7593, 16962563}, {7594, 16962819}, - {7595, 16963075}, {7596, 16963331}, {7597, 16963587}, {7598, 16818691}, - {7599, 16963843}, {7600, 16964099}, {7601, 16818947}, {7602, 16964355}, - {7603, 16964611}, {7604, 16820483}, {7605, 16964867}, {7606, 16839683}, - {7607, 16821507}, {7608, 16965123}, {7609, 16821763}, {7610, 16839939}, - {7611, 16783619}, {7612, 16965379}, {7613, 16965635}, {7614, 16822531}, - {7615, 16853507}, {7616, 1}, {7680, 16965891}, {7681, 1}, - {7682, 16966147}, {7683, 1}, {7684, 16966403}, {7685, 1}, - {7686, 16966659}, {7687, 1}, {7688, 16966915}, {7689, 1}, - {7690, 16967171}, {7691, 1}, {7692, 16967427}, {7693, 1}, - {7694, 16967683}, {7695, 1}, {7696, 16967939}, {7697, 1}, - {7698, 16968195}, {7699, 1}, {7700, 16968451}, {7701, 1}, - {7702, 16968707}, {7703, 1}, {7704, 16968963}, {7705, 1}, - {7706, 16969219}, {7707, 1}, {7708, 16969475}, {7709, 1}, - {7710, 16969731}, {7711, 1}, {7712, 16969987}, {7713, 1}, - {7714, 16970243}, {7715, 1}, {7716, 16970499}, {7717, 1}, - {7718, 16970755}, {7719, 1}, {7720, 16971011}, {7721, 1}, - {7722, 16971267}, {7723, 1}, {7724, 16971523}, {7725, 1}, - {7726, 16971779}, {7727, 1}, {7728, 16972035}, {7729, 1}, - {7730, 16972291}, {7731, 1}, {7732, 16972547}, {7733, 1}, - {7734, 16972803}, {7735, 1}, {7736, 16973059}, {7737, 1}, - {7738, 16973315}, {7739, 1}, {7740, 16973571}, {7741, 1}, - {7742, 16973827}, {7743, 1}, {7744, 16974083}, {7745, 1}, - {7746, 16974339}, {7747, 1}, {7748, 16974595}, {7749, 1}, - {7750, 16974851}, {7751, 1}, {7752, 16975107}, {7753, 1}, - {7754, 16975363}, {7755, 1}, {7756, 16975619}, {7757, 1}, - {7758, 16975875}, {7759, 1}, {7760, 16976131}, {7761, 1}, - {7762, 16976387}, {7763, 1}, {7764, 16976643}, {7765, 1}, - {7766, 16976899}, {7767, 1}, {7768, 16977155}, {7769, 1}, - {7770, 16977411}, {7771, 1}, {7772, 16977667}, {7773, 1}, - {7774, 16977923}, {7775, 1}, {7776, 16978179}, {7777, 1}, - {7778, 16978435}, {7779, 1}, {7780, 16978691}, {7781, 1}, - {7782, 16978947}, {7783, 1}, {7784, 16979203}, {7785, 1}, - {7786, 16979459}, {7787, 1}, {7788, 16979715}, {7789, 1}, - {7790, 16979971}, {7791, 1}, {7792, 16980227}, {7793, 1}, - {7794, 16980483}, {7795, 1}, {7796, 16980739}, {7797, 1}, - {7798, 16980995}, {7799, 1}, {7800, 16981251}, {7801, 1}, - {7802, 16981507}, {7803, 1}, {7804, 16981763}, {7805, 1}, - {7806, 16982019}, {7807, 1}, {7808, 16982275}, {7809, 1}, - {7810, 16982531}, {7811, 1}, {7812, 16982787}, {7813, 1}, - {7814, 16983043}, {7815, 1}, {7816, 16983299}, {7817, 1}, - {7818, 16983555}, {7819, 1}, {7820, 16983811}, {7821, 1}, - {7822, 16984067}, {7823, 1}, {7824, 16984323}, {7825, 1}, - {7826, 16984579}, {7827, 1}, {7828, 16984835}, {7829, 1}, - {7834, 33762307}, {7835, 16978179}, {7836, 1}, {7838, 16985603}, - {7839, 1}, {7840, 16985859}, {7841, 1}, {7842, 16986115}, - {7843, 1}, {7844, 16986371}, {7845, 1}, {7846, 16986627}, - {7847, 1}, {7848, 16986883}, {7849, 1}, {7850, 16987139}, - {7851, 1}, {7852, 16987395}, {7853, 1}, {7854, 16987651}, - {7855, 1}, {7856, 16987907}, {7857, 1}, {7858, 16988163}, - {7859, 1}, {7860, 16988419}, {7861, 1}, {7862, 16988675}, - {7863, 1}, {7864, 16988931}, {7865, 1}, {7866, 16989187}, - {7867, 1}, {7868, 16989443}, {7869, 1}, {7870, 16989699}, - {7871, 1}, {7872, 16989955}, {7873, 1}, {7874, 16990211}, - {7875, 1}, {7876, 16990467}, {7877, 1}, {7878, 16990723}, - {7879, 1}, {7880, 16990979}, {7881, 1}, {7882, 16991235}, - {7883, 1}, {7884, 16991491}, {7885, 1}, {7886, 16991747}, - {7887, 1}, {7888, 16992003}, {7889, 1}, {7890, 16992259}, - {7891, 1}, {7892, 16992515}, {7893, 1}, {7894, 16992771}, - {7895, 1}, {7896, 16993027}, {7897, 1}, {7898, 16993283}, - {7899, 1}, {7900, 16993539}, {7901, 1}, {7902, 16993795}, - {7903, 1}, {7904, 16994051}, {7905, 1}, {7906, 16994307}, - {7907, 1}, {7908, 16994563}, {7909, 1}, {7910, 16994819}, - {7911, 1}, {7912, 16995075}, {7913, 1}, {7914, 16995331}, - {7915, 1}, {7916, 16995587}, {7917, 1}, {7918, 16995843}, - {7919, 1}, {7920, 16996099}, {7921, 1}, {7922, 16996355}, - {7923, 1}, {7924, 16996611}, {7925, 1}, {7926, 16996867}, - {7927, 1}, {7928, 16997123}, {7929, 1}, {7930, 16997379}, - {7931, 1}, {7932, 16997635}, {7933, 1}, {7934, 16997891}, - {7935, 1}, {7944, 16998147}, {7945, 16998403}, {7946, 16998659}, - {7947, 16998915}, {7948, 16999171}, {7949, 16999427}, {7950, 16999683}, - {7951, 16999939}, {7952, 1}, {7958, 2}, {7960, 17000195}, - {7961, 17000451}, {7962, 17000707}, {7963, 17000963}, {7964, 17001219}, - {7965, 17001475}, {7966, 2}, {7968, 1}, {7976, 17001731}, - {7977, 17001987}, {7978, 17002243}, {7979, 17002499}, {7980, 17002755}, - {7981, 17003011}, {7982, 17003267}, {7983, 17003523}, {7984, 1}, - {7992, 17003779}, {7993, 17004035}, {7994, 17004291}, {7995, 17004547}, - {7996, 17004803}, {7997, 17005059}, {7998, 17005315}, {7999, 17005571}, - {8000, 1}, {8006, 2}, {8008, 17005827}, {8009, 17006083}, - {8010, 17006339}, {8011, 17006595}, {8012, 17006851}, {8013, 17007107}, - {8014, 2}, {8016, 1}, {8024, 2}, {8025, 17007363}, - {8026, 2}, {8027, 17007619}, {8028, 2}, {8029, 17007875}, - {8030, 2}, {8031, 17008131}, {8032, 1}, {8040, 17008387}, - {8041, 17008643}, {8042, 17008899}, {8043, 17009155}, {8044, 17009411}, - {8045, 17009667}, {8046, 17009923}, {8047, 17010179}, {8048, 1}, - {8049, 16849923}, {8050, 1}, {8051, 16850179}, {8052, 1}, - {8053, 16850435}, {8054, 1}, {8055, 16850691}, {8056, 1}, - {8057, 16850947}, {8058, 1}, {8059, 16851203}, {8060, 1}, - {8061, 16851459}, {8062, 2}, {8064, 33787651}, {8065, 33788163}, - {8066, 33788675}, {8067, 33789187}, {8068, 33789699}, {8069, 33790211}, - {8070, 33790723}, {8071, 33791235}, {8072, 33787651}, {8073, 33788163}, - {8074, 33788675}, {8075, 33789187}, {8076, 33789699}, {8077, 33790211}, - {8078, 33790723}, {8079, 33791235}, {8080, 33791747}, {8081, 33792259}, - {8082, 33792771}, {8083, 33793283}, {8084, 33793795}, {8085, 33794307}, - {8086, 33794819}, {8087, 33795331}, {8088, 33791747}, {8089, 33792259}, - {8090, 33792771}, {8091, 33793283}, {8092, 33793795}, {8093, 33794307}, - {8094, 33794819}, {8095, 33795331}, {8096, 33795843}, {8097, 33796355}, - {8098, 33796867}, {8099, 33797379}, {8100, 33797891}, {8101, 33798403}, - {8102, 33798915}, {8103, 33799427}, {8104, 33795843}, {8105, 33796355}, - {8106, 33796867}, {8107, 33797379}, {8108, 33797891}, {8109, 33798403}, - {8110, 33798915}, {8111, 33799427}, {8112, 1}, {8114, 33799939}, - {8115, 33800451}, {8116, 33800963}, {8117, 2}, {8118, 1}, - {8119, 33801475}, {8120, 17024771}, {8121, 17025027}, {8122, 17022723}, - {8123, 16849923}, {8124, 33800451}, {8125, 33802499}, {8126, 16846851}, - {8127, 33802499}, {8128, 33803011}, {8129, 50580739}, {8130, 33804291}, - {8131, 33804803}, {8132, 33805315}, {8133, 2}, {8134, 1}, - {8135, 33805827}, {8136, 17029123}, {8137, 16850179}, {8138, 17027075}, - {8139, 16850435}, {8140, 33804803}, {8141, 50583811}, {8142, 50584579}, - {8143, 50585347}, {8144, 1}, {8147, 17031683}, {8148, 2}, - {8150, 1}, {8152, 17031939}, {8153, 17032195}, {8154, 17032451}, - {8155, 16850691}, {8156, 2}, {8157, 50587139}, {8158, 50587907}, - {8159, 50588675}, {8160, 1}, {8163, 17035011}, {8164, 1}, - {8168, 17035267}, {8169, 17035523}, {8170, 17035779}, {8171, 16851203}, - {8172, 17036035}, {8173, 50590723}, {8174, 50403587}, {8175, 17037059}, - {8176, 2}, {8178, 33814531}, {8179, 33815043}, {8180, 33815555}, - {8181, 2}, {8182, 1}, {8183, 33816067}, {8184, 17039363}, - {8185, 16850947}, {8186, 17037315}, {8187, 16851459}, {8188, 33815043}, - {8189, 33562883}, {8190, 33809923}, {8191, 2}, {8192, 16783875}, - {8203, 0}, {8204, 1}, {8206, 2}, {8208, 1}, - {8209, 17039619}, {8210, 1}, {8215, 33817091}, {8216, 1}, - {8228, 2}, {8231, 1}, {8232, 2}, {8239, 16783875}, - {8240, 1}, {8243, 33817603}, {8244, 50595331}, {8245, 1}, - {8246, 33818883}, {8247, 50596611}, {8248, 1}, {8252, 33820163}, - {8253, 1}, {8254, 33820675}, {8255, 1}, {8263, 33821187}, - {8264, 33821699}, {8265, 33822211}, {8266, 1}, {8279, 67372035}, - {8280, 1}, {8287, 16783875}, {8288, 0}, {8293, 2}, - {8298, 0}, {8304, 17045507}, {8305, 16779267}, {8306, 2}, - {8308, 16787715}, {8309, 17045763}, {8310, 17046019}, {8311, 17046275}, - {8312, 17046531}, {8313, 17046787}, {8314, 17047043}, {8315, 17047299}, - {8316, 17047555}, {8317, 17047811}, {8318, 17048067}, {8319, 16780547}, - {8320, 17045507}, {8321, 16786947}, {8322, 16785155}, {8323, 16785411}, - {8324, 16787715}, {8325, 17045763}, {8326, 17046019}, {8327, 17046275}, - {8328, 17046531}, {8329, 17046787}, {8330, 17047043}, {8331, 17047299}, - {8332, 17047555}, {8333, 17047811}, {8334, 17048067}, {8335, 2}, - {8336, 16777219}, {8337, 16778243}, {8338, 16780803}, {8339, 16783107}, - {8340, 16816387}, {8341, 16779011}, {8342, 16779779}, {8343, 16780035}, - {8344, 16780291}, {8345, 16780547}, {8346, 16781059}, {8347, 16781827}, - {8348, 16782083}, {8349, 2}, {8352, 1}, {8360, 33558787}, - {8361, 1}, {8386, 2}, {8400, 1}, {8433, 2}, - {8448, 50602755}, {8449, 50603523}, {8450, 16777731}, {8451, 33827075}, - {8452, 1}, {8453, 50604803}, {8454, 50605571}, {8455, 16816643}, - {8456, 1}, {8457, 33829123}, {8458, 16778755}, {8459, 16779011}, - {8463, 16802051}, {8464, 16779267}, {8466, 16780035}, {8468, 1}, - {8469, 16780547}, {8470, 33557763}, {8471, 1}, {8473, 16781059}, - {8474, 16781315}, {8475, 16781571}, {8478, 1}, {8480, 33829635}, - {8481, 50607363}, {8482, 33830915}, {8483, 1}, {8484, 16783619}, - {8485, 1}, {8486, 16857091}, {8487, 1}, {8488, 16783619}, - {8489, 1}, {8490, 16779779}, {8491, 16790787}, {8492, 16777475}, - {8493, 16777731}, {8494, 1}, {8495, 16778243}, {8497, 16778499}, - {8498, 17054211}, {8499, 16780291}, {8500, 16780803}, {8501, 17054467}, - {8502, 17054723}, {8503, 17054979}, {8504, 17055235}, {8505, 16779267}, - {8506, 1}, {8507, 50609923}, {8508, 16855043}, {8509, 16852227}, - {8511, 16855043}, {8512, 17056259}, {8513, 1}, {8517, 16777987}, - {8519, 16778243}, {8520, 16779267}, {8521, 16779523}, {8522, 1}, - {8528, 50610947}, {8529, 50611715}, {8530, 67389699}, {8531, 50613507}, - {8532, 50614275}, {8533, 50615043}, {8534, 50615811}, {8535, 50616579}, - {8536, 50617347}, {8537, 50618115}, {8538, 50618883}, {8539, 50619651}, - {8540, 50620419}, {8541, 50621187}, {8542, 50621955}, {8543, 33564419}, - {8544, 16779267}, {8545, 33845507}, {8546, 50623235}, {8547, 33846787}, - {8548, 16782595}, {8549, 33847299}, {8550, 50625027}, {8551, 67403011}, - {8552, 33849603}, {8553, 16783107}, {8554, 33850115}, {8555, 50627843}, - {8556, 16780035}, {8557, 16777731}, {8558, 16777987}, {8559, 16780291}, - {8560, 16779267}, {8561, 33845507}, {8562, 50622723}, {8563, 33846787}, - {8564, 16782595}, {8565, 33847299}, {8566, 50625027}, {8567, 67403011}, - {8568, 33849603}, {8569, 16783107}, {8570, 33850115}, {8571, 50627843}, - {8572, 16780035}, {8573, 16777731}, {8574, 16777987}, {8575, 16780291}, - {8576, 1}, {8579, 17074179}, {8580, 1}, {8585, 50628867}, - {8586, 1}, {8588, 2}, {8592, 1}, {8748, 33852419}, - {8749, 50630147}, {8750, 1}, {8751, 33853699}, {8752, 50631427}, - {8753, 1}, {9001, 17077763}, {9002, 17078019}, {9003, 1}, - {9258, 2}, {9280, 1}, {9291, 2}, {9312, 16786947}, - {9313, 16785155}, {9314, 16785411}, {9315, 16787715}, {9316, 17045763}, - {9317, 17046019}, {9318, 17046275}, {9319, 17046531}, {9320, 17046787}, - {9321, 33835779}, {9322, 33564163}, {9323, 33855491}, {9324, 33856003}, - {9325, 33856515}, {9326, 33857027}, {9327, 33857539}, {9328, 33858051}, - {9329, 33858563}, {9330, 33859075}, {9331, 33859587}, {9332, 50637315}, - {9333, 50638083}, {9334, 50638851}, {9335, 50639619}, {9336, 50640387}, - {9337, 50641155}, {9338, 50641923}, {9339, 50642691}, {9340, 50643459}, - {9341, 67421443}, {9342, 67422467}, {9343, 67423491}, {9344, 67424515}, - {9345, 67425539}, {9346, 67426563}, {9347, 67427587}, {9348, 67428611}, - {9349, 67429635}, {9350, 67430659}, {9351, 67431683}, {9352, 2}, - {9372, 50655491}, {9373, 50656259}, {9374, 50657027}, {9375, 50657795}, - {9376, 50658563}, {9377, 50659331}, {9378, 50660099}, {9379, 50660867}, - {9380, 50661635}, {9381, 50662403}, {9382, 50663171}, {9383, 50663939}, - {9384, 50664707}, {9385, 50665475}, {9386, 50666243}, {9387, 50667011}, - {9388, 50667779}, {9389, 50668547}, {9390, 50669315}, {9391, 50670083}, - {9392, 50670851}, {9393, 50671619}, {9394, 50672387}, {9395, 50673155}, - {9396, 50673923}, {9397, 50674691}, {9398, 16777219}, {9399, 16777475}, - {9400, 16777731}, {9401, 16777987}, {9402, 16778243}, {9403, 16778499}, - {9404, 16778755}, {9405, 16779011}, {9406, 16779267}, {9407, 16779523}, - {9408, 16779779}, {9409, 16780035}, {9410, 16780291}, {9411, 16780547}, - {9412, 16780803}, {9413, 16781059}, {9414, 16781315}, {9415, 16781571}, - {9416, 16781827}, {9417, 16782083}, {9418, 16782339}, {9419, 16782595}, - {9420, 16782851}, {9421, 16783107}, {9422, 16783363}, {9423, 16783619}, - {9424, 16777219}, {9425, 16777475}, {9426, 16777731}, {9427, 16777987}, - {9428, 16778243}, {9429, 16778499}, {9430, 16778755}, {9431, 16779011}, - {9432, 16779267}, {9433, 16779523}, {9434, 16779779}, {9435, 16780035}, - {9436, 16780291}, {9437, 16780547}, {9438, 16780803}, {9439, 16781059}, - {9440, 16781315}, {9441, 16781571}, {9442, 16781827}, {9443, 16782083}, - {9444, 16782339}, {9445, 16782595}, {9446, 16782851}, {9447, 16783107}, - {9448, 16783363}, {9449, 16783619}, {9450, 17045507}, {9451, 1}, - {10764, 67406851}, {10765, 1}, {10868, 50675459}, {10869, 33899011}, - {10870, 50675971}, {10871, 1}, {10972, 33899523}, {10973, 1}, - {11124, 2}, {11126, 1}, {11264, 17122819}, {11265, 17123075}, - {11266, 17123331}, {11267, 17123587}, {11268, 17123843}, {11269, 17124099}, - {11270, 17124355}, {11271, 17124611}, {11272, 17124867}, {11273, 17125123}, - {11274, 17125379}, {11275, 17125635}, {11276, 17125891}, {11277, 17126147}, - {11278, 17126403}, {11279, 17126659}, {11280, 17126915}, {11281, 17127171}, - {11282, 17127427}, {11283, 17127683}, {11284, 17127939}, {11285, 17128195}, - {11286, 17128451}, {11287, 17128707}, {11288, 17128963}, {11289, 17129219}, - {11290, 17129475}, {11291, 17129731}, {11292, 17129987}, {11293, 17130243}, - {11294, 17130499}, {11295, 17130755}, {11296, 17131011}, {11297, 17131267}, - {11298, 17131523}, {11299, 17131779}, {11300, 17132035}, {11301, 17132291}, - {11302, 17132547}, {11303, 17132803}, {11304, 17133059}, {11305, 17133315}, - {11306, 17133571}, {11307, 17133827}, {11308, 17134083}, {11309, 17134339}, - {11310, 17134595}, {11311, 17134851}, {11312, 1}, {11360, 17135107}, - {11361, 1}, {11362, 17135363}, {11363, 17135619}, {11364, 17135875}, - {11365, 1}, {11367, 17136131}, {11368, 1}, {11369, 17136387}, - {11370, 1}, {11371, 17136643}, {11372, 1}, {11373, 16958723}, - {11374, 16963331}, {11375, 16958467}, {11376, 16960515}, {11377, 1}, - {11378, 17136899}, {11379, 1}, {11381, 17137155}, {11382, 1}, - {11388, 16779523}, {11389, 16782595}, {11390, 17137411}, {11391, 17137667}, - {11392, 17137923}, {11393, 1}, {11394, 17138179}, {11395, 1}, - {11396, 17138435}, {11397, 1}, {11398, 17138691}, {11399, 1}, - {11400, 17138947}, {11401, 1}, {11402, 17139203}, {11403, 1}, - {11404, 17139459}, {11405, 1}, {11406, 17139715}, {11407, 1}, - {11408, 17139971}, {11409, 1}, {11410, 17140227}, {11411, 1}, - {11412, 17140483}, {11413, 1}, {11414, 17140739}, {11415, 1}, - {11416, 17140995}, {11417, 1}, {11418, 17141251}, {11419, 1}, - {11420, 17141507}, {11421, 1}, {11422, 17141763}, {11423, 1}, - {11424, 17142019}, {11425, 1}, {11426, 17142275}, {11427, 1}, - {11428, 17142531}, {11429, 1}, {11430, 17142787}, {11431, 1}, - {11432, 17143043}, {11433, 1}, {11434, 17143299}, {11435, 1}, - {11436, 17143555}, {11437, 1}, {11438, 17143811}, {11439, 1}, - {11440, 17144067}, {11441, 1}, {11442, 17144323}, {11443, 1}, - {11444, 17144579}, {11445, 1}, {11446, 17144835}, {11447, 1}, - {11448, 17145091}, {11449, 1}, {11450, 17145347}, {11451, 1}, - {11452, 17145603}, {11453, 1}, {11454, 17145859}, {11455, 1}, - {11456, 17146115}, {11457, 1}, {11458, 17146371}, {11459, 1}, - {11460, 17146627}, {11461, 1}, {11462, 17146883}, {11463, 1}, - {11464, 17147139}, {11465, 1}, {11466, 17147395}, {11467, 1}, - {11468, 17147651}, {11469, 1}, {11470, 17147907}, {11471, 1}, - {11472, 17148163}, {11473, 1}, {11474, 17148419}, {11475, 1}, - {11476, 17148675}, {11477, 1}, {11478, 17148931}, {11479, 1}, - {11480, 17149187}, {11481, 1}, {11482, 17149443}, {11483, 1}, - {11484, 17149699}, {11485, 1}, {11486, 17149955}, {11487, 1}, - {11488, 17150211}, {11489, 1}, {11490, 17150467}, {11491, 1}, - {11499, 17150723}, {11500, 1}, {11501, 17150979}, {11502, 1}, - {11506, 17151235}, {11507, 1}, {11508, 2}, {11513, 1}, - {11558, 2}, {11559, 1}, {11560, 2}, {11565, 1}, - {11566, 2}, {11568, 1}, {11624, 2}, {11631, 17151491}, - {11632, 1}, {11633, 2}, {11647, 1}, {11671, 2}, - {11680, 1}, {11687, 2}, {11688, 1}, {11695, 2}, - {11696, 1}, {11703, 2}, {11704, 1}, {11711, 2}, - {11712, 1}, {11719, 2}, {11720, 1}, {11727, 2}, - {11728, 1}, {11735, 2}, {11736, 1}, {11743, 2}, - {11744, 1}, {11870, 2}, {11904, 1}, {11930, 2}, - {11931, 1}, {11935, 17151747}, {11936, 1}, {12019, 17152003}, - {12020, 2}, {12032, 17152259}, {12033, 17152515}, {12034, 17152771}, - {12035, 17153027}, {12036, 17153283}, {12037, 17153539}, {12038, 17153795}, - {12039, 17154051}, {12040, 17154307}, {12041, 17154563}, {12042, 17154819}, - {12043, 17155075}, {12044, 17155331}, {12045, 17155587}, {12046, 17155843}, - {12047, 17156099}, {12048, 17156355}, {12049, 17156611}, {12050, 17156867}, - {12051, 17157123}, {12052, 17157379}, {12053, 17157635}, {12054, 17157891}, - {12055, 17158147}, {12056, 17158403}, {12057, 17158659}, {12058, 17158915}, - {12059, 17159171}, {12060, 17159427}, {12061, 17159683}, {12062, 17159939}, - {12063, 17160195}, {12064, 17160451}, {12065, 17160707}, {12066, 17160963}, - {12067, 17161219}, {12068, 17161475}, {12069, 17161731}, {12070, 17161987}, - {12071, 17162243}, {12072, 17162499}, {12073, 17162755}, {12074, 17163011}, - {12075, 17163267}, {12076, 17163523}, {12077, 17163779}, {12078, 17164035}, - {12079, 17164291}, {12080, 17164547}, {12081, 17164803}, {12082, 17165059}, - {12083, 17165315}, {12084, 17165571}, {12085, 17165827}, {12086, 17166083}, - {12087, 17166339}, {12088, 17166595}, {12089, 17166851}, {12090, 17167107}, - {12091, 17167363}, {12092, 17167619}, {12093, 17167875}, {12094, 17168131}, - {12095, 17168387}, {12096, 17168643}, {12097, 17168899}, {12098, 17169155}, - {12099, 17169411}, {12100, 17169667}, {12101, 17169923}, {12102, 17170179}, - {12103, 17170435}, {12104, 17170691}, {12105, 17170947}, {12106, 17171203}, - {12107, 17171459}, {12108, 17171715}, {12109, 17171971}, {12110, 17172227}, - {12111, 17172483}, {12112, 17172739}, {12113, 17172995}, {12114, 17173251}, - {12115, 17173507}, {12116, 17173763}, {12117, 17174019}, {12118, 17174275}, - {12119, 17174531}, {12120, 17174787}, {12121, 17175043}, {12122, 17175299}, - {12123, 17175555}, {12124, 17175811}, {12125, 17176067}, {12126, 17176323}, - {12127, 17176579}, {12128, 17176835}, {12129, 17177091}, {12130, 17177347}, - {12131, 17177603}, {12132, 17177859}, {12133, 17178115}, {12134, 17178371}, - {12135, 17178627}, {12136, 17178883}, {12137, 17179139}, {12138, 17179395}, - {12139, 17179651}, {12140, 17179907}, {12141, 17180163}, {12142, 17180419}, - {12143, 17180675}, {12144, 17180931}, {12145, 17181187}, {12146, 17181443}, - {12147, 17181699}, {12148, 17181955}, {12149, 17182211}, {12150, 17182467}, - {12151, 17182723}, {12152, 17182979}, {12153, 17183235}, {12154, 17183491}, - {12155, 17183747}, {12156, 17184003}, {12157, 17184259}, {12158, 17184515}, - {12159, 17184771}, {12160, 17185027}, {12161, 17185283}, {12162, 17185539}, - {12163, 17185795}, {12164, 17186051}, {12165, 17186307}, {12166, 17186563}, - {12167, 17186819}, {12168, 17187075}, {12169, 17187331}, {12170, 17187587}, - {12171, 17187843}, {12172, 17188099}, {12173, 17188355}, {12174, 17188611}, - {12175, 17188867}, {12176, 17189123}, {12177, 17189379}, {12178, 17189635}, - {12179, 17189891}, {12180, 17190147}, {12181, 17190403}, {12182, 17190659}, - {12183, 17190915}, {12184, 17191171}, {12185, 17191427}, {12186, 17191683}, - {12187, 17191939}, {12188, 17192195}, {12189, 17192451}, {12190, 17192707}, - {12191, 17192963}, {12192, 17193219}, {12193, 17193475}, {12194, 17193731}, - {12195, 17193987}, {12196, 17194243}, {12197, 17194499}, {12198, 17194755}, - {12199, 17195011}, {12200, 17195267}, {12201, 17195523}, {12202, 17195779}, - {12203, 17196035}, {12204, 17196291}, {12205, 17196547}, {12206, 17196803}, - {12207, 17197059}, {12208, 17197315}, {12209, 17197571}, {12210, 17197827}, - {12211, 17198083}, {12212, 17198339}, {12213, 17198595}, {12214, 17198851}, - {12215, 17199107}, {12216, 17199363}, {12217, 17199619}, {12218, 17199875}, - {12219, 17200131}, {12220, 17200387}, {12221, 17200643}, {12222, 17200899}, - {12223, 17201155}, {12224, 17201411}, {12225, 17201667}, {12226, 17201923}, - {12227, 17202179}, {12228, 17202435}, {12229, 17202691}, {12230, 17202947}, - {12231, 17203203}, {12232, 17203459}, {12233, 17203715}, {12234, 17203971}, - {12235, 17204227}, {12236, 17204483}, {12237, 17204739}, {12238, 17204995}, - {12239, 17205251}, {12240, 17205507}, {12241, 17205763}, {12242, 17206019}, - {12243, 17206275}, {12244, 17206531}, {12245, 17206787}, {12246, 2}, - {12288, 16783875}, {12289, 1}, {12290, 17207043}, {12291, 1}, - {12342, 17207299}, {12343, 1}, {12344, 17158147}, {12345, 17207555}, - {12346, 17207811}, {12347, 1}, {12352, 2}, {12353, 1}, - {12439, 2}, {12441, 1}, {12443, 33985283}, {12444, 33985795}, - {12445, 1}, {12447, 33986307}, {12448, 1}, {12543, 33986819}, - {12544, 2}, {12549, 1}, {12592, 2}, {12593, 17210115}, - {12594, 17210371}, {12595, 17210627}, {12596, 17210883}, {12597, 17211139}, - {12598, 17211395}, {12599, 17211651}, {12600, 17211907}, {12601, 17212163}, - {12602, 17212419}, {12603, 17212675}, {12604, 17212931}, {12605, 17213187}, - {12606, 17213443}, {12607, 17213699}, {12608, 17213955}, {12609, 17214211}, - {12610, 17214467}, {12611, 17214723}, {12612, 17214979}, {12613, 17215235}, - {12614, 17215491}, {12615, 17215747}, {12616, 17216003}, {12617, 17216259}, - {12618, 17216515}, {12619, 17216771}, {12620, 17217027}, {12621, 17217283}, - {12622, 17217539}, {12623, 17217795}, {12624, 17218051}, {12625, 17218307}, - {12626, 17218563}, {12627, 17218819}, {12628, 17219075}, {12629, 17219331}, - {12630, 17219587}, {12631, 17219843}, {12632, 17220099}, {12633, 17220355}, - {12634, 17220611}, {12635, 17220867}, {12636, 17221123}, {12637, 17221379}, - {12638, 17221635}, {12639, 17221891}, {12640, 17222147}, {12641, 17222403}, - {12642, 17222659}, {12643, 17222915}, {12644, 0}, {12645, 17223171}, - {12646, 17223427}, {12647, 17223683}, {12648, 17223939}, {12649, 17224195}, - {12650, 17224451}, {12651, 17224707}, {12652, 17224963}, {12653, 17225219}, - {12654, 17225475}, {12655, 17225731}, {12656, 17225987}, {12657, 17226243}, - {12658, 17226499}, {12659, 17226755}, {12660, 17227011}, {12661, 17227267}, - {12662, 17227523}, {12663, 17227779}, {12664, 17228035}, {12665, 17228291}, - {12666, 17228547}, {12667, 17228803}, {12668, 17229059}, {12669, 17229315}, - {12670, 17229571}, {12671, 17229827}, {12672, 17230083}, {12673, 17230339}, - {12674, 17230595}, {12675, 17230851}, {12676, 17231107}, {12677, 17231363}, - {12678, 17231619}, {12679, 17231875}, {12680, 17232131}, {12681, 17232387}, - {12682, 17232643}, {12683, 17232899}, {12684, 17233155}, {12685, 17233411}, - {12686, 17233667}, {12687, 2}, {12688, 1}, {12690, 17152259}, - {12691, 17153795}, {12692, 17233923}, {12693, 17234179}, {12694, 17234435}, - {12695, 17234691}, {12696, 17234947}, {12697, 17235203}, {12698, 17153283}, - {12699, 17235459}, {12700, 17235715}, {12701, 17235971}, {12702, 17236227}, - {12703, 17154307}, {12704, 1}, {12774, 2}, {12784, 1}, - {12800, 50790915}, {12801, 50791683}, {12802, 50792451}, {12803, 50793219}, - {12804, 50793987}, {12805, 50794755}, {12806, 50795523}, {12807, 50796291}, - {12808, 50797059}, {12809, 50797827}, {12810, 50798595}, {12811, 50799363}, - {12812, 50800131}, {12813, 50800899}, {12814, 50801667}, {12815, 50802435}, - {12816, 50803203}, {12817, 50803971}, {12818, 50804739}, {12819, 50805507}, - {12820, 50806275}, {12821, 50807043}, {12822, 50807811}, {12823, 50808579}, - {12824, 50809347}, {12825, 50810115}, {12826, 50810883}, {12827, 50811651}, - {12828, 50812419}, {12829, 67590403}, {12830, 67591427}, {12831, 2}, - {12832, 50815235}, {12833, 50816003}, {12834, 50816771}, {12835, 50817539}, - {12836, 50818307}, {12837, 50819075}, {12838, 50819843}, {12839, 50820611}, - {12840, 50821379}, {12841, 50822147}, {12842, 50822915}, {12843, 50823683}, - {12844, 50824451}, {12845, 50825219}, {12846, 50825987}, {12847, 50826755}, - {12848, 50827523}, {12849, 50828291}, {12850, 50829059}, {12851, 50829827}, - {12852, 50830595}, {12853, 50831363}, {12854, 50832131}, {12855, 50832899}, - {12856, 50833667}, {12857, 50834435}, {12858, 50835203}, {12859, 50835971}, - {12860, 50836739}, {12861, 50837507}, {12862, 50838275}, {12863, 50839043}, - {12864, 50839811}, {12865, 50840579}, {12866, 50841347}, {12867, 50842115}, - {12868, 17288451}, {12869, 17288707}, {12870, 17169155}, {12871, 17288963}, - {12872, 1}, {12880, 50843651}, {12881, 33855747}, {12882, 34067203}, - {12883, 33562371}, {12884, 34067715}, {12885, 34068227}, {12886, 34068739}, - {12887, 34069251}, {12888, 34069763}, {12889, 34070275}, {12890, 34070787}, - {12891, 33837571}, {12892, 33836803}, {12893, 34071299}, {12894, 34071811}, - {12895, 34072323}, {12896, 17210115}, {12897, 17210883}, {12898, 17211651}, - {12899, 17212163}, {12900, 17214211}, {12901, 17214467}, {12902, 17215235}, - {12903, 17215747}, {12904, 17216003}, {12905, 17216515}, {12906, 17216771}, - {12907, 17217027}, {12908, 17217283}, {12909, 17217539}, {12910, 17247491}, - {12911, 17248259}, {12912, 17249027}, {12913, 17249795}, {12914, 17250563}, - {12915, 17251331}, {12916, 17252099}, {12917, 17252867}, {12918, 17253635}, - {12919, 17254403}, {12920, 17255171}, {12921, 17255939}, {12922, 17256707}, - {12923, 17257475}, {12924, 34072835}, {12925, 34073347}, {12926, 17296643}, - {12927, 1}, {12928, 17152259}, {12929, 17153795}, {12930, 17233923}, - {12931, 17234179}, {12932, 17264131}, {12933, 17264899}, {12934, 17265667}, - {12935, 17155075}, {12936, 17267203}, {12937, 17158147}, {12938, 17170947}, - {12939, 17174019}, {12940, 17173763}, {12941, 17171203}, {12942, 17194755}, - {12943, 17160195}, {12944, 17170435}, {12945, 17274115}, {12946, 17274883}, - {12947, 17275651}, {12948, 17276419}, {12949, 17277187}, {12950, 17277955}, - {12951, 17278723}, {12952, 17279491}, {12953, 17296899}, {12954, 17297155}, - {12955, 17161731}, {12956, 17297411}, {12957, 17297667}, {12958, 17297923}, - {12959, 17298179}, {12960, 17298435}, {12961, 17286403}, {12962, 17298691}, - {12963, 17298947}, {12964, 17234435}, {12965, 17234691}, {12966, 17234947}, - {12967, 17299203}, {12968, 17299459}, {12969, 17299715}, {12970, 17299971}, - {12971, 17281795}, {12972, 17282563}, {12973, 17283331}, {12974, 17284099}, - {12975, 17284867}, {12976, 17300227}, {12977, 34077699}, {12978, 34078211}, - {12979, 34078723}, {12980, 34079235}, {12981, 34079747}, {12982, 33564931}, - {12983, 34067971}, {12984, 34072067}, {12985, 34080259}, {12986, 34080771}, - {12987, 34081283}, {12988, 34081795}, {12989, 34082307}, {12990, 34082819}, - {12991, 34083331}, {12992, 34083843}, {12993, 34084355}, {12994, 34084867}, - {12995, 34085379}, {12996, 34085891}, {12997, 34086403}, {12998, 34086915}, - {12999, 34087427}, {13000, 34087939}, {13001, 50865667}, {13002, 50866435}, - {13003, 50867203}, {13004, 34090755}, {13005, 50868483}, {13006, 34092035}, - {13007, 50869763}, {13008, 17316099}, {13009, 17316355}, {13010, 17316611}, - {13011, 17316867}, {13012, 17317123}, {13013, 17317379}, {13014, 17317635}, - {13015, 17317891}, {13016, 17318147}, {13017, 17209603}, {13018, 17318403}, - {13019, 17318659}, {13020, 17318915}, {13021, 17319171}, {13022, 17319427}, - {13023, 17319683}, {13024, 17319939}, {13025, 17320195}, {13026, 17320451}, - {13027, 17209859}, {13028, 17320707}, {13029, 17320963}, {13030, 17321219}, - {13031, 17321475}, {13032, 17321731}, {13033, 17321987}, {13034, 17322243}, - {13035, 17322499}, {13036, 17322755}, {13037, 17323011}, {13038, 17323267}, - {13039, 17323523}, {13040, 17323779}, {13041, 17324035}, {13042, 17324291}, - {13043, 17324547}, {13044, 17324803}, {13045, 17325059}, {13046, 17325315}, - {13047, 17325571}, {13048, 17325827}, {13049, 17326083}, {13050, 17326339}, - {13051, 17326595}, {13052, 17326851}, {13053, 17327107}, {13054, 17327363}, - {13055, 34104835}, {13056, 67659779}, {13057, 67660803}, {13058, 67661827}, - {13059, 50885635}, {13060, 67663619}, {13061, 50887427}, {13062, 50888195}, - {13063, 84443395}, {13064, 67667459}, {13065, 50891267}, {13066, 50892035}, - {13067, 50892803}, {13068, 67670787}, {13069, 67671811}, {13070, 50895619}, - {13071, 50896387}, {13072, 34119939}, {13073, 50897667}, {13074, 67675651}, - {13075, 67676675}, {13076, 34123267}, {13077, 84455427}, {13078, 101233923}, - {13079, 84458243}, {13080, 50901507}, {13081, 84459523}, {13082, 84460803}, - {13083, 67684867}, {13084, 50908675}, {13085, 50909443}, {13086, 50910211}, - {13087, 67688195}, {13088, 84466435}, {13089, 67690499}, {13090, 50914307}, - {13091, 50915075}, {13092, 50915843}, {13093, 34139395}, {13094, 34139907}, - {13095, 34128643}, {13096, 34140419}, {13097, 50918147}, {13098, 50918915}, - {13099, 84474115}, {13100, 50920963}, {13101, 67698947}, {13102, 84477187}, - {13103, 50924035}, {13104, 34147587}, {13105, 34148099}, {13106, 84480259}, - {13107, 67704323}, {13108, 84482563}, {13109, 50929411}, {13110, 84484611}, - {13111, 34154243}, {13112, 50931971}, {13113, 50932739}, {13114, 50933507}, - {13115, 50934275}, {13116, 50935043}, {13117, 67713027}, {13118, 50936835}, - {13119, 34160387}, {13120, 50938115}, {13121, 50938883}, {13122, 50939651}, - {13123, 67717635}, {13124, 50941443}, {13125, 50942211}, {13126, 50942979}, - {13127, 84498179}, {13128, 67722243}, {13129, 34168835}, {13130, 84500995}, - {13131, 34170627}, {13132, 67725571}, {13133, 67680003}, {13134, 50949379}, - {13135, 50950147}, {13136, 50950915}, {13137, 67728899}, {13138, 34175491}, - {13139, 50953219}, {13140, 67731203}, {13141, 34177795}, {13142, 84509955}, - {13143, 50904323}, {13144, 34179587}, {13145, 34180099}, {13146, 34180611}, - {13147, 34181123}, {13148, 34181635}, {13149, 34182147}, {13150, 34182659}, - {13151, 34183171}, {13152, 34183683}, {13153, 34184195}, {13154, 50961923}, - {13155, 50962691}, {13156, 50963459}, {13157, 50964227}, {13158, 50964995}, - {13159, 50965763}, {13160, 50966531}, {13161, 50967299}, {13162, 50968067}, - {13163, 50968835}, {13164, 50969603}, {13165, 50970371}, {13166, 50971139}, - {13167, 50971907}, {13168, 50972675}, {13169, 50973443}, {13170, 34196995}, - {13171, 34197507}, {13172, 50975235}, {13173, 34198787}, {13174, 34199299}, - {13175, 34199811}, {13176, 50977539}, {13177, 50978307}, {13178, 34201859}, - {13179, 34202371}, {13180, 34202883}, {13181, 34203395}, {13182, 34203907}, - {13183, 67758851}, {13184, 34196483}, {13185, 34205443}, {13186, 34205955}, - {13187, 34206467}, {13188, 34206979}, {13189, 34207491}, {13190, 34208003}, - {13191, 34208515}, {13192, 50986243}, {13193, 67764227}, {13194, 34210819}, - {13195, 34211331}, {13196, 34211843}, {13197, 34212355}, {13198, 34212867}, - {13199, 34213379}, {13200, 34213891}, {13201, 50991619}, {13202, 50992387}, - {13203, 50990851}, {13204, 50993155}, {13205, 34216707}, {13206, 34217219}, - {13207, 34217731}, {13208, 33556995}, {13209, 34218243}, {13210, 34218755}, - {13211, 34219267}, {13212, 34219779}, {13213, 34220291}, {13214, 34220803}, - {13215, 50998531}, {13216, 50999299}, {13217, 34200579}, {13218, 51000067}, - {13219, 51000835}, {13220, 51001603}, {13221, 34201347}, {13222, 51002371}, - {13223, 51003139}, {13224, 67781123}, {13225, 34196483}, {13226, 51004931}, - {13227, 51005699}, {13228, 51006467}, {13229, 51007235}, {13230, 84562435}, - {13231, 101340931}, {13232, 34233603}, {13233, 34234115}, {13234, 34234627}, - {13235, 34235139}, {13236, 34235651}, {13237, 34236163}, {13238, 34236675}, - {13239, 34237187}, {13240, 34237699}, {13241, 34237187}, {13242, 34238211}, - {13243, 34238723}, {13244, 34239235}, {13245, 34239747}, {13246, 34240259}, - {13247, 34239747}, {13248, 34240771}, {13249, 34241283}, {13250, 2}, - {13251, 34241795}, {13252, 33827331}, {13253, 33554947}, {13254, 67796739}, - {13255, 2}, {13256, 34243331}, {13257, 34243843}, {13258, 34244355}, - {13259, 34196227}, {13260, 34244867}, {13261, 34245379}, {13262, 34220803}, - {13263, 34245891}, {13264, 33557251}, {13265, 34246403}, {13266, 51024131}, - {13267, 34247683}, {13268, 34208003}, {13269, 51025411}, {13270, 51026179}, - {13271, 34249731}, {13272, 2}, {13273, 51027459}, {13274, 34251011}, - {13275, 34231811}, {13276, 34251523}, {13277, 34252035}, {13278, 51029763}, - {13279, 51030531}, {13280, 34254083}, {13281, 34254595}, {13282, 34255107}, - {13283, 34255619}, {13284, 34256131}, {13285, 34256643}, {13286, 34257155}, - {13287, 34257667}, {13288, 34258179}, {13289, 51035907}, {13290, 51036675}, - {13291, 51037443}, {13292, 51038211}, {13293, 51038979}, {13294, 51039747}, - {13295, 51040515}, {13296, 51041283}, {13297, 51042051}, {13298, 51042819}, - {13299, 51043587}, {13300, 51044355}, {13301, 51045123}, {13302, 51045891}, - {13303, 51046659}, {13304, 51047427}, {13305, 51048195}, {13306, 51048963}, - {13307, 51049731}, {13308, 51050499}, {13309, 51051267}, {13310, 51052035}, - {13311, 51052803}, {13312, 1}, {42125, 2}, {42128, 1}, - {42183, 2}, {42192, 1}, {42540, 2}, {42560, 17499139}, - {42561, 1}, {42562, 17499395}, {42563, 1}, {42564, 17499651}, - {42565, 1}, {42566, 17499907}, {42567, 1}, {42568, 17500163}, - {42569, 1}, {42570, 16946435}, {42571, 1}, {42572, 17500419}, - {42573, 1}, {42574, 17500675}, {42575, 1}, {42576, 17500931}, - {42577, 1}, {42578, 17501187}, {42579, 1}, {42580, 17501443}, - {42581, 1}, {42582, 17501699}, {42583, 1}, {42584, 17501955}, - {42585, 1}, {42586, 17502211}, {42587, 1}, {42588, 17502467}, - {42589, 1}, {42590, 17502723}, {42591, 1}, {42592, 17502979}, - {42593, 1}, {42594, 17503235}, {42595, 1}, {42596, 17503491}, - {42597, 1}, {42598, 17503747}, {42599, 1}, {42600, 17504003}, - {42601, 1}, {42602, 17504259}, {42603, 1}, {42604, 17504515}, - {42605, 1}, {42624, 17504771}, {42625, 1}, {42626, 17505027}, - {42627, 1}, {42628, 17505283}, {42629, 1}, {42630, 17505539}, - {42631, 1}, {42632, 17505795}, {42633, 1}, {42634, 17506051}, - {42635, 1}, {42636, 17506307}, {42637, 1}, {42638, 17506563}, - {42639, 1}, {42640, 17506819}, {42641, 1}, {42642, 17507075}, - {42643, 1}, {42644, 17507331}, {42645, 1}, {42646, 17507587}, - {42647, 1}, {42648, 17507843}, {42649, 1}, {42650, 17508099}, - {42651, 1}, {42652, 16873219}, {42653, 16873731}, {42654, 1}, - {42744, 2}, {42752, 1}, {42786, 17508355}, {42787, 1}, - {42788, 17508611}, {42789, 1}, {42790, 17508867}, {42791, 1}, - {42792, 17509123}, {42793, 1}, {42794, 17509379}, {42795, 1}, - {42796, 17509635}, {42797, 1}, {42798, 17509891}, {42799, 1}, - {42802, 17510147}, {42803, 1}, {42804, 17510403}, {42805, 1}, - {42806, 17510659}, {42807, 1}, {42808, 17510915}, {42809, 1}, - {42810, 17511171}, {42811, 1}, {42812, 17511427}, {42813, 1}, - {42814, 17511683}, {42815, 1}, {42816, 17511939}, {42817, 1}, - {42818, 17512195}, {42819, 1}, {42820, 17512451}, {42821, 1}, - {42822, 17512707}, {42823, 1}, {42824, 17512963}, {42825, 1}, - {42826, 17513219}, {42827, 1}, {42828, 17513475}, {42829, 1}, - {42830, 17513731}, {42831, 1}, {42832, 17513987}, {42833, 1}, - {42834, 17514243}, {42835, 1}, {42836, 17514499}, {42837, 1}, - {42838, 17514755}, {42839, 1}, {42840, 17515011}, {42841, 1}, - {42842, 17515267}, {42843, 1}, {42844, 17515523}, {42845, 1}, - {42846, 17515779}, {42847, 1}, {42848, 17516035}, {42849, 1}, - {42850, 17516291}, {42851, 1}, {42852, 17516547}, {42853, 1}, - {42854, 17516803}, {42855, 1}, {42856, 17517059}, {42857, 1}, - {42858, 17517315}, {42859, 1}, {42860, 17517571}, {42861, 1}, - {42862, 17517827}, {42863, 1}, {42864, 17517827}, {42865, 1}, - {42873, 17518083}, {42874, 1}, {42875, 17518339}, {42876, 1}, - {42877, 17518595}, {42878, 17518851}, {42879, 1}, {42880, 17519107}, - {42881, 1}, {42882, 17519363}, {42883, 1}, {42884, 17519619}, - {42885, 1}, {42886, 17519875}, {42887, 1}, {42891, 17520131}, - {42892, 1}, {42893, 16961539}, {42894, 1}, {42896, 17520387}, - {42897, 1}, {42898, 17520643}, {42899, 1}, {42902, 17520899}, - {42903, 1}, {42904, 17521155}, {42905, 1}, {42906, 17521411}, - {42907, 1}, {42908, 17521667}, {42909, 1}, {42910, 17521923}, - {42911, 1}, {42912, 17522179}, {42913, 1}, {42914, 17522435}, - {42915, 1}, {42916, 17522691}, {42917, 1}, {42918, 17522947}, - {42919, 1}, {42920, 17523203}, {42921, 1}, {42922, 16841475}, - {42923, 16959235}, {42924, 16961283}, {42925, 17523459}, {42926, 16961795}, - {42927, 1}, {42928, 17523715}, {42929, 17523971}, {42930, 16962307}, - {42931, 17524227}, {42932, 17524483}, {42933, 1}, {42934, 17524739}, - {42935, 1}, {42936, 17524995}, {42937, 1}, {42938, 17525251}, - {42939, 1}, {42940, 17525507}, {42941, 1}, {42942, 17525763}, - {42943, 1}, {42944, 17526019}, {42945, 1}, {42946, 17526275}, - {42947, 1}, {42948, 17526531}, {42949, 16964611}, {42950, 17526787}, - {42951, 17527043}, {42952, 1}, {42953, 17527299}, {42954, 1}, - {42955, 17527555}, {42956, 17527811}, {42957, 1}, {42958, 17528067}, - {42959, 1}, {42960, 17528323}, {42961, 1}, {42962, 17528579}, - {42963, 1}, {42964, 17528835}, {42965, 1}, {42966, 17529091}, - {42967, 1}, {42968, 17529347}, {42969, 1}, {42970, 17529603}, - {42971, 1}, {42972, 17529859}, {42973, 2}, {42993, 16781827}, - {42994, 16777731}, {42995, 16778499}, {42996, 16781315}, {42997, 17530115}, - {42998, 1}, {43000, 16802051}, {43001, 16808195}, {43002, 1}, - {43053, 2}, {43056, 1}, {43066, 2}, {43072, 1}, - {43128, 2}, {43136, 1}, {43206, 2}, {43214, 1}, - {43226, 2}, {43232, 1}, {43348, 2}, {43359, 1}, - {43389, 2}, {43392, 1}, {43470, 2}, {43471, 1}, - {43482, 2}, {43486, 1}, {43519, 2}, {43520, 1}, - {43575, 2}, {43584, 1}, {43598, 2}, {43600, 1}, - {43610, 2}, {43612, 1}, {43715, 2}, {43739, 1}, - {43767, 2}, {43777, 1}, {43783, 2}, {43785, 1}, - {43791, 2}, {43793, 1}, {43799, 2}, {43808, 1}, - {43815, 2}, {43816, 1}, {43823, 2}, {43824, 1}, - {43868, 17508867}, {43869, 17530371}, {43870, 17135363}, {43871, 17530627}, - {43872, 1}, {43881, 17530883}, {43882, 1}, {43884, 2}, - {43888, 17531139}, {43889, 17531395}, {43890, 17531651}, {43891, 17531907}, - {43892, 17532163}, {43893, 17532419}, {43894, 17532675}, {43895, 17532931}, - {43896, 17533187}, {43897, 17533443}, {43898, 17533699}, {43899, 17533955}, - {43900, 17534211}, {43901, 17534467}, {43902, 17534723}, {43903, 17534979}, - {43904, 17535235}, {43905, 17535491}, {43906, 17535747}, {43907, 17536003}, - {43908, 17536259}, {43909, 17536515}, {43910, 17536771}, {43911, 17537027}, - {43912, 17537283}, {43913, 17537539}, {43914, 17537795}, {43915, 17538051}, - {43916, 17538307}, {43917, 17538563}, {43918, 17538819}, {43919, 17539075}, - {43920, 17539331}, {43921, 17539587}, {43922, 17539843}, {43923, 17540099}, - {43924, 17540355}, {43925, 17540611}, {43926, 17540867}, {43927, 17541123}, - {43928, 17541379}, {43929, 17541635}, {43930, 17541891}, {43931, 17542147}, - {43932, 17542403}, {43933, 17542659}, {43934, 17542915}, {43935, 17543171}, - {43936, 17543427}, {43937, 17543683}, {43938, 17543939}, {43939, 17544195}, - {43940, 17544451}, {43941, 17544707}, {43942, 17544963}, {43943, 17545219}, - {43944, 17545475}, {43945, 17545731}, {43946, 17545987}, {43947, 17546243}, - {43948, 17546499}, {43949, 17546755}, {43950, 17547011}, {43951, 17547267}, - {43952, 17547523}, {43953, 17547779}, {43954, 17548035}, {43955, 17548291}, - {43956, 17548547}, {43957, 17548803}, {43958, 17549059}, {43959, 17549315}, - {43960, 17549571}, {43961, 17549827}, {43962, 17550083}, {43963, 17550339}, - {43964, 17550595}, {43965, 17550851}, {43966, 17551107}, {43967, 17551363}, - {43968, 1}, {44014, 2}, {44016, 1}, {44026, 2}, - {44032, 1}, {55204, 2}, {55216, 1}, {55239, 2}, - {55243, 1}, {55292, 2}, {63744, 17551619}, {63745, 17551875}, - {63746, 17192707}, {63747, 17552131}, {63748, 17552387}, {63749, 17552643}, - {63750, 17552899}, {63751, 17206531}, {63753, 17553155}, {63754, 17194755}, - {63755, 17553411}, {63756, 17553667}, {63757, 17553923}, {63758, 17554179}, - {63759, 17554435}, {63760, 17554691}, {63761, 17554947}, {63762, 17555203}, - {63763, 17555459}, {63764, 17555715}, {63765, 17555971}, {63766, 17556227}, - {63767, 17556483}, {63768, 17556739}, {63769, 17556995}, {63770, 17557251}, - {63771, 17557507}, {63772, 17557763}, {63773, 17558019}, {63774, 17558275}, - {63775, 17558531}, {63776, 17558787}, {63777, 17559043}, {63778, 17559299}, - {63779, 17559555}, {63780, 17559811}, {63781, 17560067}, {63782, 17560323}, - {63783, 17560579}, {63784, 17560835}, {63785, 17561091}, {63786, 17561347}, - {63787, 17561603}, {63788, 17561859}, {63789, 17562115}, {63790, 17562371}, - {63791, 17562627}, {63792, 17562883}, {63793, 17563139}, {63794, 17563395}, - {63795, 17563651}, {63796, 17184003}, {63797, 17563907}, {63798, 17564163}, - {63799, 17564419}, {63800, 17564675}, {63801, 17564931}, {63802, 17565187}, - {63803, 17565443}, {63804, 17565699}, {63805, 17565955}, {63806, 17566211}, - {63807, 17566467}, {63808, 17202691}, {63809, 17566723}, {63810, 17566979}, - {63811, 17567235}, {63812, 17567491}, {63813, 17567747}, {63814, 17568003}, - {63815, 17568259}, {63816, 17568515}, {63817, 17568771}, {63818, 17569027}, - {63819, 17569283}, {63820, 17569539}, {63821, 17569795}, {63822, 17570051}, - {63823, 17570307}, {63824, 17570563}, {63825, 17570819}, {63826, 17571075}, - {63827, 17571331}, {63828, 17571587}, {63829, 17571843}, {63830, 17572099}, - {63831, 17572355}, {63832, 17572611}, {63833, 17572867}, {63834, 17573123}, - {63835, 17573379}, {63836, 17555715}, {63837, 17573635}, {63838, 17573891}, - {63839, 17574147}, {63840, 17574403}, {63841, 17574659}, {63842, 17574915}, - {63843, 17575171}, {63844, 17575427}, {63845, 17575683}, {63846, 17575939}, - {63847, 17576195}, {63848, 17576451}, {63849, 17576707}, {63850, 17576963}, - {63851, 17577219}, {63852, 17577475}, {63853, 17577731}, {63854, 17577987}, - {63855, 17578243}, {63856, 17578499}, {63857, 17193219}, {63858, 17578755}, - {63859, 17579011}, {63860, 17579267}, {63861, 17579523}, {63862, 17579779}, - {63863, 17580035}, {63864, 17580291}, {63865, 17580547}, {63866, 17580803}, - {63867, 17581059}, {63868, 17581315}, {63869, 17581571}, {63870, 17581827}, - {63871, 17582083}, {63872, 17582339}, {63873, 17161731}, {63874, 17582595}, - {63875, 17582851}, {63876, 17583107}, {63877, 17583363}, {63878, 17583619}, - {63879, 17583875}, {63880, 17584131}, {63881, 17584387}, {63882, 17156867}, - {63883, 17584643}, {63884, 17584899}, {63885, 17585155}, {63886, 17585411}, - {63887, 17585667}, {63888, 17585923}, {63889, 17586179}, {63890, 17586435}, - {63891, 17586691}, {63892, 17586947}, {63893, 17587203}, {63894, 17587459}, - {63895, 17587715}, {63896, 17587971}, {63897, 17588227}, {63898, 17588483}, - {63899, 17588739}, {63900, 17588995}, {63901, 17589251}, {63902, 17589507}, - {63903, 17589763}, {63904, 17590019}, {63905, 17578243}, {63906, 17590275}, - {63907, 17590531}, {63908, 17590787}, {63909, 17591043}, {63910, 17591299}, - {63911, 17591555}, {63912, 17327619}, {63913, 17591811}, {63914, 17574147}, - {63915, 17592067}, {63916, 17592323}, {63917, 17592579}, {63918, 17592835}, - {63919, 17593091}, {63920, 17593347}, {63921, 17593603}, {63922, 17593859}, - {63923, 17594115}, {63924, 17594371}, {63925, 17594627}, {63926, 17594883}, - {63927, 17595139}, {63928, 17595395}, {63929, 17595651}, {63930, 17595907}, - {63931, 17596163}, {63932, 17596419}, {63933, 17596675}, {63934, 17596931}, - {63935, 17555715}, {63936, 17597187}, {63937, 17597443}, {63938, 17597699}, - {63939, 17597955}, {63940, 17206275}, {63941, 17598211}, {63942, 17598467}, - {63943, 17598723}, {63944, 17598979}, {63945, 17599235}, {63946, 17599491}, - {63947, 17599747}, {63948, 17600003}, {63949, 17600259}, {63950, 17600515}, - {63951, 17600771}, {63952, 17601027}, {63953, 17264899}, {63954, 17601283}, - {63955, 17601539}, {63956, 17601795}, {63957, 17602051}, {63958, 17602307}, - {63959, 17602563}, {63960, 17602819}, {63961, 17603075}, {63962, 17603331}, - {63963, 17574659}, {63964, 17603587}, {63965, 17603843}, {63966, 17604099}, - {63967, 17604355}, {63968, 17604611}, {63969, 17604867}, {63970, 17605123}, - {63971, 17605379}, {63972, 17605635}, {63973, 17605891}, {63974, 17606147}, - {63975, 17606403}, {63976, 17606659}, {63977, 17194499}, {63978, 17606915}, - {63979, 17607171}, {63980, 17607427}, {63981, 17607683}, {63982, 17607939}, - {63983, 17608195}, {63984, 17608451}, {63985, 17608707}, {63986, 17608963}, - {63987, 17609219}, {63988, 17609475}, {63989, 17609731}, {63990, 17609987}, - {63991, 17181955}, {63992, 17610243}, {63993, 17610499}, {63994, 17610755}, - {63995, 17611011}, {63996, 17611267}, {63997, 17611523}, {63998, 17611779}, - {63999, 17612035}, {64000, 17612291}, {64001, 17612547}, {64002, 17612803}, - {64003, 17613059}, {64004, 17613315}, {64005, 17613571}, {64006, 17613827}, - {64007, 17614083}, {64008, 17188867}, {64009, 17614339}, {64010, 17189635}, - {64011, 17614595}, {64012, 17614851}, {64013, 17615107}, {64014, 1}, - {64016, 17615363}, {64017, 1}, {64018, 17615619}, {64019, 1}, - {64021, 17615875}, {64022, 17616131}, {64023, 17616387}, {64024, 17616643}, - {64025, 17616899}, {64026, 17617155}, {64027, 17617411}, {64028, 17617667}, - {64029, 17617923}, {64030, 17183747}, {64031, 1}, {64032, 17618179}, - {64033, 1}, {64034, 17618435}, {64035, 1}, {64037, 17618691}, - {64038, 17618947}, {64039, 1}, {64042, 17619203}, {64043, 17619459}, - {64044, 17619715}, {64045, 17619971}, {64046, 17620227}, {64047, 17620483}, - {64048, 17620739}, {64049, 17620995}, {64050, 17621251}, {64051, 17621507}, - {64052, 17621763}, {64053, 17622019}, {64054, 17622275}, {64055, 17622531}, - {64056, 17622787}, {64057, 17623043}, {64058, 17623299}, {64059, 17623555}, - {64060, 17163523}, {64061, 17623811}, {64062, 17624067}, {64063, 17624323}, - {64064, 17624579}, {64065, 17624835}, {64066, 17625091}, {64067, 17625347}, - {64068, 17625603}, {64069, 17625859}, {64070, 17626115}, {64071, 17626371}, - {64072, 17626627}, {64073, 17626883}, {64074, 17627139}, {64075, 17627395}, - {64076, 17275651}, {64077, 17627651}, {64078, 17627907}, {64079, 17628163}, - {64080, 17628419}, {64081, 17278723}, {64082, 17628675}, {64083, 17628931}, - {64084, 17629187}, {64085, 17629443}, {64086, 17629699}, {64087, 17587459}, - {64088, 17629955}, {64089, 17630211}, {64090, 17630467}, {64091, 17630723}, - {64092, 17630979}, {64093, 17631235}, {64095, 17631491}, {64096, 17631747}, - {64097, 17632003}, {64098, 17632259}, {64099, 17632515}, {64100, 17632771}, - {64101, 17633027}, {64102, 17633283}, {64103, 17618691}, {64104, 17633539}, - {64105, 17633795}, {64106, 17634051}, {64107, 17634307}, {64108, 17634563}, - {64109, 17634819}, {64110, 2}, {64112, 17635075}, {64113, 17635331}, - {64114, 17635587}, {64115, 17635843}, {64116, 17636099}, {64117, 17636355}, - {64118, 17636611}, {64119, 17636867}, {64120, 17622275}, {64121, 17637123}, - {64122, 17637379}, {64123, 17637635}, {64124, 17615363}, {64125, 17637891}, - {64126, 17638147}, {64127, 17638403}, {64128, 17638659}, {64129, 17638915}, - {64130, 17639171}, {64131, 17639427}, {64132, 17639683}, {64133, 17639939}, - {64134, 17640195}, {64135, 17640451}, {64136, 17640707}, {64137, 17624323}, - {64138, 17640963}, {64139, 17624579}, {64140, 17641219}, {64141, 17641475}, - {64142, 17641731}, {64143, 17641987}, {64144, 17642243}, {64145, 17615619}, - {64146, 17561091}, {64147, 17642499}, {64148, 17642755}, {64149, 17171971}, - {64150, 17578499}, {64151, 17599491}, {64152, 17643011}, {64153, 17643267}, - {64154, 17626371}, {64155, 17643523}, {64156, 17626627}, {64157, 17643779}, - {64158, 17644035}, {64159, 17644291}, {64160, 17616131}, {64161, 17644547}, - {64162, 17644803}, {64163, 17645059}, {64164, 17645315}, {64165, 17645571}, - {64166, 17616387}, {64167, 17645827}, {64168, 17646083}, {64169, 17646339}, - {64170, 17646595}, {64171, 17646851}, {64172, 17647107}, {64173, 17629699}, - {64174, 17647363}, {64175, 17647619}, {64176, 17587459}, {64177, 17647875}, - {64178, 17630723}, {64179, 17648131}, {64180, 17648387}, {64181, 17648643}, - {64182, 17648899}, {64183, 17649155}, {64184, 17632003}, {64185, 17649411}, - {64186, 17618435}, {64187, 17649667}, {64188, 17632259}, {64189, 17573635}, - {64190, 17649923}, {64191, 17632515}, {64192, 17650179}, {64193, 17633027}, - {64194, 17650435}, {64195, 17650691}, {64196, 17650947}, {64197, 17651203}, - {64198, 17651459}, {64199, 17633539}, {64200, 17617667}, {64201, 17651715}, - {64202, 17633795}, {64203, 17651971}, {64204, 17634051}, {64205, 17652227}, - {64206, 17206531}, {64207, 17652483}, {64208, 17652739}, {64209, 17652995}, - {64210, 17653251}, {64211, 17653507}, {64212, 17653763}, {64213, 17654019}, - {64214, 17654275}, {64215, 17654531}, {64216, 17654787}, {64217, 17655043}, - {64218, 2}, {64256, 34432515}, {64257, 34433027}, {64258, 34433539}, - {64259, 51209987}, {64260, 51211267}, {64261, 33559043}, {64263, 2}, - {64275, 34434819}, {64276, 34435331}, {64277, 34435843}, {64278, 34436355}, - {64279, 34436867}, {64280, 2}, {64285, 34437379}, {64286, 1}, - {64287, 34437891}, {64288, 17661187}, {64289, 17054467}, {64290, 17055235}, - {64291, 17661443}, {64292, 17661699}, {64293, 17661955}, {64294, 17662211}, - {64295, 17662467}, {64296, 17662723}, {64297, 17047043}, {64298, 34440195}, - {64299, 34440707}, {64300, 51218435}, {64301, 51219203}, {64302, 34442755}, - {64303, 34443267}, {64304, 34443779}, {64305, 34444291}, {64306, 34444803}, - {64307, 34445315}, {64308, 34445827}, {64309, 34446339}, {64310, 34446851}, - {64311, 2}, {64312, 34447363}, {64313, 34447875}, {64314, 34448387}, - {64315, 34448899}, {64316, 34449411}, {64317, 2}, {64318, 34449923}, - {64319, 2}, {64320, 34450435}, {64321, 34450947}, {64322, 2}, - {64323, 34451459}, {64324, 34451971}, {64325, 2}, {64326, 34452483}, - {64327, 34452995}, {64328, 34453507}, {64329, 34441219}, {64330, 34454019}, - {64331, 34454531}, {64332, 34455043}, {64333, 34455555}, {64334, 34456067}, - {64335, 34456579}, {64336, 17679875}, {64338, 17680131}, {64342, 17680387}, - {64346, 17680643}, {64350, 17680899}, {64354, 17681155}, {64358, 17681411}, - {64362, 17681667}, {64366, 17681923}, {64370, 17682179}, {64374, 17682435}, - {64378, 17682691}, {64382, 17682947}, {64386, 17683203}, {64388, 17683459}, - {64390, 17683715}, {64392, 17683971}, {64394, 17684227}, {64396, 17684483}, - {64398, 17684739}, {64402, 17684995}, {64406, 17685251}, {64410, 17685507}, - {64414, 17685763}, {64416, 17686019}, {64420, 17686275}, {64422, 17686531}, - {64426, 17686787}, {64430, 17687043}, {64432, 17687299}, {64434, 1}, - {64467, 17687555}, {64471, 16911619}, {64473, 17687811}, {64475, 17688067}, - {64477, 33688835}, {64478, 17688323}, {64480, 17688579}, {64482, 17688835}, - {64484, 17689091}, {64488, 17689347}, {64490, 34466819}, {64492, 34467331}, - {64494, 34467843}, {64496, 34468355}, {64498, 34468867}, {64500, 34469379}, - {64502, 34469891}, {64505, 34470403}, {64508, 17693699}, {64512, 34471171}, - {64513, 34471683}, {64514, 34472195}, {64515, 34470403}, {64516, 34472707}, - {64517, 34473219}, {64518, 34473731}, {64519, 34474243}, {64520, 34474755}, - {64521, 34475267}, {64522, 34475779}, {64523, 34476291}, {64524, 34476803}, - {64525, 34477315}, {64526, 34477827}, {64527, 34478339}, {64528, 34478851}, - {64529, 34479363}, {64530, 34479875}, {64531, 34480387}, {64532, 34480899}, - {64533, 34481411}, {64534, 34481923}, {64535, 34481667}, {64536, 34482435}, - {64537, 34482947}, {64538, 34483459}, {64539, 34483971}, {64540, 34484483}, - {64541, 34484995}, {64542, 34485507}, {64543, 34486019}, {64544, 34486531}, - {64545, 34487043}, {64546, 34487555}, {64547, 34488067}, {64548, 34488579}, - {64549, 34489091}, {64550, 34489603}, {64551, 34490115}, {64552, 34490627}, - {64553, 34491139}, {64554, 34491651}, {64555, 34492163}, {64556, 34492675}, - {64557, 34493187}, {64558, 34493699}, {64559, 34494211}, {64560, 34494723}, - {64561, 34495235}, {64562, 34495747}, {64563, 34496259}, {64564, 34496771}, - {64565, 34497283}, {64566, 34497795}, {64567, 34498307}, {64568, 34498819}, - {64569, 34499331}, {64570, 34499843}, {64571, 34500355}, {64572, 34500867}, - {64573, 34501379}, {64574, 34501891}, {64575, 34502403}, {64576, 34502915}, - {64577, 34503427}, {64578, 34503939}, {64579, 34504451}, {64580, 34504963}, - {64581, 34505475}, {64582, 34482179}, {64583, 34482691}, {64584, 34505987}, - {64585, 34506499}, {64586, 34507011}, {64587, 34507523}, {64588, 34508035}, - {64589, 34508547}, {64590, 34509059}, {64591, 34509571}, {64592, 34510083}, - {64593, 34510595}, {64594, 34511107}, {64595, 34511619}, {64596, 34512131}, - {64597, 34481155}, {64598, 34512643}, {64599, 34513155}, {64600, 34505219}, - {64601, 34513667}, {64602, 34512387}, {64603, 34514179}, {64604, 34514691}, - {64605, 34515203}, {64606, 51292931}, {64607, 51293699}, {64608, 51294467}, - {64609, 51295235}, {64610, 51296003}, {64611, 51296771}, {64612, 34520323}, - {64613, 34520835}, {64614, 34472195}, {64615, 34521347}, {64616, 34470403}, - {64617, 34472707}, {64618, 34521859}, {64619, 34522371}, {64620, 34474755}, - {64621, 34522883}, {64622, 34475267}, {64623, 34475779}, {64624, 34523395}, - {64625, 34523907}, {64626, 34477827}, {64627, 34524419}, {64628, 34478339}, - {64629, 34478851}, {64630, 34524931}, {64631, 34525443}, {64632, 34479875}, - {64633, 34525955}, {64634, 34480387}, {64635, 34480899}, {64636, 34495235}, - {64637, 34495747}, {64638, 34497283}, {64639, 34497795}, {64640, 34498307}, - {64641, 34500355}, {64642, 34500867}, {64643, 34501379}, {64644, 34501891}, - {64645, 34503939}, {64646, 34504451}, {64647, 34504963}, {64648, 34526467}, - {64649, 34505987}, {64650, 34526979}, {64651, 34527491}, {64652, 34509059}, - {64653, 34528003}, {64654, 34509571}, {64655, 34510083}, {64656, 34515203}, - {64657, 34528515}, {64658, 34529027}, {64659, 34505219}, {64660, 34507267}, - {64661, 34513667}, {64662, 34512387}, {64663, 34471171}, {64664, 34471683}, - {64665, 34529539}, {64666, 34472195}, {64667, 34530051}, {64668, 34473219}, - {64669, 34473731}, {64670, 34474243}, {64671, 34474755}, {64672, 34530563}, - {64673, 34476291}, {64674, 34476803}, {64675, 34477315}, {64676, 34477827}, - {64677, 34531075}, {64678, 34479875}, {64679, 34481411}, {64680, 34481923}, - {64681, 34481667}, {64682, 34482435}, {64683, 34482947}, {64684, 34483971}, - {64685, 34484483}, {64686, 34484995}, {64687, 34485507}, {64688, 34486019}, - {64689, 34486531}, {64690, 34531587}, {64691, 34487043}, {64692, 34487555}, - {64693, 34488067}, {64694, 34488579}, {64695, 34489091}, {64696, 34489603}, - {64697, 34490627}, {64698, 34491139}, {64699, 34491651}, {64700, 34492163}, - {64701, 34492675}, {64702, 34493187}, {64703, 34493699}, {64704, 34494211}, - {64705, 34494723}, {64706, 34496259}, {64707, 34496771}, {64708, 34498819}, - {64709, 34499331}, {64710, 34499843}, {64711, 34500355}, {64712, 34500867}, - {64713, 34502403}, {64714, 34502915}, {64715, 34503427}, {64716, 34503939}, - {64717, 34532099}, {64718, 34505475}, {64719, 34482179}, {64720, 34482691}, - {64721, 34505987}, {64722, 34507523}, {64723, 34508035}, {64724, 34508547}, - {64725, 34509059}, {64726, 34532611}, {64727, 34510595}, {64728, 34511107}, - {64729, 34533123}, {64730, 34481155}, {64731, 34512643}, {64732, 34513155}, - {64733, 34505219}, {64734, 34510339}, {64735, 34472195}, {64736, 34530051}, - {64737, 34474755}, {64738, 34530563}, {64739, 34477827}, {64740, 34531075}, - {64741, 34479875}, {64742, 34533635}, {64743, 34486019}, {64744, 34534147}, - {64745, 34534659}, {64746, 34535171}, {64747, 34500355}, {64748, 34500867}, - {64749, 34503939}, {64750, 34509059}, {64751, 34532611}, {64752, 34505219}, - {64753, 34510339}, {64754, 51312899}, {64755, 51313667}, {64756, 51314435}, - {64757, 34537987}, {64758, 34538499}, {64759, 34539011}, {64760, 34539523}, - {64761, 34540035}, {64762, 34540547}, {64763, 34541059}, {64764, 34541571}, - {64765, 34542083}, {64766, 34542595}, {64767, 34543107}, {64768, 34512899}, - {64769, 34543619}, {64770, 34544131}, {64771, 34544643}, {64772, 34513411}, - {64773, 34545155}, {64774, 34545667}, {64775, 34546179}, {64776, 34546691}, - {64777, 34547203}, {64778, 34547715}, {64779, 34548227}, {64780, 34534659}, - {64781, 34548739}, {64782, 34549251}, {64783, 34549763}, {64784, 34550275}, - {64785, 34537987}, {64786, 34538499}, {64787, 34539011}, {64788, 34539523}, - {64789, 34540035}, {64790, 34540547}, {64791, 34541059}, {64792, 34541571}, - {64793, 34542083}, {64794, 34542595}, {64795, 34543107}, {64796, 34512899}, - {64797, 34543619}, {64798, 34544131}, {64799, 34544643}, {64800, 34513411}, - {64801, 34545155}, {64802, 34545667}, {64803, 34546179}, {64804, 34546691}, - {64805, 34547203}, {64806, 34547715}, {64807, 34548227}, {64808, 34534659}, - {64809, 34548739}, {64810, 34549251}, {64811, 34549763}, {64812, 34550275}, - {64813, 34547203}, {64814, 34547715}, {64815, 34548227}, {64816, 34534659}, - {64817, 34534147}, {64818, 34535171}, {64819, 34490115}, {64820, 34484483}, - {64821, 34484995}, {64822, 34485507}, {64823, 34547203}, {64824, 34547715}, - {64825, 34548227}, {64826, 34490115}, {64827, 34490627}, {64828, 34550787}, - {64830, 1}, {64848, 51328515}, {64849, 51329283}, {64851, 51330051}, - {64852, 51330819}, {64853, 51331587}, {64854, 51332355}, {64855, 51333123}, - {64856, 51259139}, {64858, 51333891}, {64859, 51334659}, {64860, 51335427}, - {64861, 51336195}, {64862, 51336963}, {64863, 51337731}, {64865, 51338499}, - {64866, 51339267}, {64868, 51340035}, {64870, 51340803}, {64871, 51341571}, - {64873, 51342339}, {64874, 51343107}, {64876, 51343875}, {64878, 51344643}, - {64879, 51345411}, {64881, 51346179}, {64883, 51346947}, {64884, 51347715}, - {64885, 51348483}, {64886, 51349251}, {64888, 51350019}, {64889, 51350787}, - {64890, 51351555}, {64891, 51352323}, {64892, 51353091}, {64894, 51353859}, - {64895, 51354627}, {64896, 51355395}, {64897, 51356163}, {64898, 51356931}, - {64899, 51357699}, {64901, 51358467}, {64903, 51359235}, {64905, 51360003}, - {64906, 51259395}, {64907, 51360771}, {64908, 51361539}, {64909, 51282691}, - {64910, 51259907}, {64911, 51362307}, {64912, 1}, {64914, 51363075}, - {64915, 51363843}, {64916, 51364611}, {64917, 51365379}, {64918, 51366147}, - {64919, 51366915}, {64921, 51367683}, {64922, 51368451}, {64923, 51369219}, - {64924, 51369987}, {64926, 51370755}, {64927, 51371523}, {64928, 51372291}, - {64929, 51373059}, {64930, 51373827}, {64931, 51374595}, {64932, 51375363}, - {64933, 51376131}, {64934, 51376899}, {64935, 51377667}, {64936, 51378435}, - {64937, 51379203}, {64938, 51379971}, {64939, 51380739}, {64940, 51381507}, - {64941, 51382275}, {64942, 51289859}, {64943, 51383043}, {64944, 51383811}, - {64945, 51384579}, {64946, 51385347}, {64947, 51386115}, {64948, 51353859}, - {64949, 51355395}, {64950, 51386883}, {64951, 51387651}, {64952, 51388419}, - {64953, 51389187}, {64954, 51389955}, {64955, 51390723}, {64956, 51389955}, - {64957, 51388419}, {64958, 51391491}, {64959, 51392259}, {64960, 51393027}, - {64961, 51393795}, {64962, 51394563}, {64963, 51390723}, {64964, 51348483}, - {64965, 51340803}, {64966, 51395331}, {64967, 51396099}, {64968, 1}, - {64976, 2}, {65008, 51396867}, {65009, 51397635}, {65010, 68175619}, - {65011, 68176643}, {65012, 68177667}, {65013, 68178691}, {65014, 68179715}, - {65015, 68180739}, {65016, 68181763}, {65017, 51405571}, {65018, 303064579}, - {65019, 135297027}, {65020, 68190211}, {65021, 1}, {65024, 0}, - {65040, 17859587}, {65041, 17859843}, {65042, 2}, {65043, 17121027}, - {65044, 16848643}, {65045, 17042947}, {65046, 17043971}, {65047, 17860099}, - {65048, 17860355}, {65049, 2}, {65056, 1}, {65072, 2}, - {65073, 17860611}, {65074, 17860867}, {65075, 17861123}, {65077, 17047811}, - {65078, 17048067}, {65079, 17861379}, {65080, 17861635}, {65081, 17861891}, - {65082, 17862147}, {65083, 17862403}, {65084, 17862659}, {65085, 17862915}, - {65086, 17863171}, {65087, 17077763}, {65088, 17078019}, {65089, 17863427}, - {65090, 17863683}, {65091, 17863939}, {65092, 17864195}, {65093, 1}, - {65095, 17864451}, {65096, 17864707}, {65097, 33820675}, {65101, 17861123}, - {65104, 17859587}, {65105, 17859843}, {65106, 2}, {65108, 16848643}, - {65109, 17121027}, {65110, 17043971}, {65111, 17042947}, {65112, 17860611}, - {65113, 17047811}, {65114, 17048067}, {65115, 17861379}, {65116, 17861635}, - {65117, 17861891}, {65118, 17862147}, {65119, 17864963}, {65120, 17865219}, - {65121, 17865475}, {65122, 17047043}, {65123, 17865731}, {65124, 17865987}, - {65125, 17866243}, {65126, 17047555}, {65127, 2}, {65128, 17866499}, - {65129, 17866755}, {65130, 17867011}, {65131, 17867267}, {65132, 2}, - {65136, 34644739}, {65137, 34645251}, {65138, 34515715}, {65139, 1}, - {65140, 34516483}, {65141, 2}, {65142, 34517251}, {65143, 34535683}, - {65144, 34518019}, {65145, 34536451}, {65146, 34518787}, {65147, 34537219}, - {65148, 34519555}, {65149, 34645763}, {65150, 34646275}, {65151, 34646787}, - {65152, 17870083}, {65153, 17870339}, {65155, 17870595}, {65157, 17870851}, - {65159, 17871107}, {65161, 17689603}, {65165, 16910595}, {65167, 17696003}, - {65171, 17871363}, {65173, 17699075}, {65177, 17702147}, {65181, 17694211}, - {65185, 17694723}, {65189, 17697283}, {65193, 17846787}, {65195, 17736963}, - {65197, 17737475}, {65199, 17743875}, {65201, 17707267}, {65205, 17757443}, - {65209, 17709315}, {65213, 17710339}, {65217, 17712387}, {65221, 17713411}, - {65225, 17713923}, {65229, 17714947}, {65233, 17715971}, {65237, 17719043}, - {65241, 17721091}, {65245, 17723395}, {65249, 17695235}, {65253, 17730307}, - {65257, 17733379}, {65261, 16911107}, {65263, 17689347}, {65265, 16912131}, - {65269, 34648835}, {65271, 34649347}, {65273, 34649859}, {65275, 34634755}, - {65277, 2}, {65279, 0}, {65280, 2}, {65281, 17042947}, - {65282, 17873155}, {65283, 17864963}, {65284, 17866755}, {65285, 17867011}, - {65286, 17865219}, {65287, 17873411}, {65288, 17047811}, {65289, 17048067}, - {65290, 17865475}, {65291, 17047043}, {65292, 17859587}, {65293, 17865731}, - {65294, 17207043}, {65295, 17048579}, {65296, 17045507}, {65297, 16786947}, - {65298, 16785155}, {65299, 16785411}, {65300, 16787715}, {65301, 17045763}, - {65302, 17046019}, {65303, 17046275}, {65304, 17046531}, {65305, 17046787}, - {65306, 17121027}, {65307, 16848643}, {65308, 17865987}, {65309, 17047555}, - {65310, 17866243}, {65311, 17043971}, {65312, 17867267}, {65313, 16777219}, - {65314, 16777475}, {65315, 16777731}, {65316, 16777987}, {65317, 16778243}, - {65318, 16778499}, {65319, 16778755}, {65320, 16779011}, {65321, 16779267}, - {65322, 16779523}, {65323, 16779779}, {65324, 16780035}, {65325, 16780291}, - {65326, 16780547}, {65327, 16780803}, {65328, 16781059}, {65329, 16781315}, - {65330, 16781571}, {65331, 16781827}, {65332, 16782083}, {65333, 16782339}, - {65334, 16782595}, {65335, 16782851}, {65336, 16783107}, {65337, 16783363}, - {65338, 16783619}, {65339, 17864451}, {65340, 17866499}, {65341, 17864707}, - {65342, 17873667}, {65343, 17861123}, {65344, 17037059}, {65345, 16777219}, - {65346, 16777475}, {65347, 16777731}, {65348, 16777987}, {65349, 16778243}, - {65350, 16778499}, {65351, 16778755}, {65352, 16779011}, {65353, 16779267}, - {65354, 16779523}, {65355, 16779779}, {65356, 16780035}, {65357, 16780291}, - {65358, 16780547}, {65359, 16780803}, {65360, 16781059}, {65361, 16781315}, - {65362, 16781571}, {65363, 16781827}, {65364, 16782083}, {65365, 16782339}, - {65366, 16782595}, {65367, 16782851}, {65368, 16783107}, {65369, 16783363}, - {65370, 16783619}, {65371, 17861379}, {65372, 17873923}, {65373, 17861635}, - {65374, 17874179}, {65375, 17874435}, {65376, 17874691}, {65377, 17207043}, - {65378, 17863427}, {65379, 17863683}, {65380, 17859843}, {65381, 17874947}, - {65382, 17327363}, {65383, 17329923}, {65384, 17372931}, {65385, 17875203}, - {65386, 17374467}, {65387, 17334019}, {65388, 17875459}, {65389, 17344259}, - {65390, 17390083}, {65391, 17339651}, {65392, 17328643}, {65393, 17316099}, - {65394, 17316355}, {65395, 17316611}, {65396, 17316867}, {65397, 17317123}, - {65398, 17317379}, {65399, 17317635}, {65400, 17317891}, {65401, 17318147}, - {65402, 17209603}, {65403, 17318403}, {65404, 17318659}, {65405, 17318915}, - {65406, 17319171}, {65407, 17319427}, {65408, 17319683}, {65409, 17319939}, - {65410, 17320195}, {65411, 17320451}, {65412, 17209859}, {65413, 17320707}, - {65414, 17320963}, {65415, 17321219}, {65416, 17321475}, {65417, 17321731}, - {65418, 17321987}, {65419, 17322243}, {65420, 17322499}, {65421, 17322755}, - {65422, 17323011}, {65423, 17323267}, {65424, 17323523}, {65425, 17323779}, - {65426, 17324035}, {65427, 17324291}, {65428, 17324547}, {65429, 17324803}, - {65430, 17325059}, {65431, 17325315}, {65432, 17325571}, {65433, 17325827}, - {65434, 17326083}, {65435, 17326339}, {65436, 17326595}, {65437, 17330435}, - {65438, 17208323}, {65439, 17208835}, {65440, 0}, {65441, 17210115}, - {65442, 17210371}, {65443, 17210627}, {65444, 17210883}, {65445, 17211139}, - {65446, 17211395}, {65447, 17211651}, {65448, 17211907}, {65449, 17212163}, - {65450, 17212419}, {65451, 17212675}, {65452, 17212931}, {65453, 17213187}, - {65454, 17213443}, {65455, 17213699}, {65456, 17213955}, {65457, 17214211}, - {65458, 17214467}, {65459, 17214723}, {65460, 17214979}, {65461, 17215235}, - {65462, 17215491}, {65463, 17215747}, {65464, 17216003}, {65465, 17216259}, - {65466, 17216515}, {65467, 17216771}, {65468, 17217027}, {65469, 17217283}, - {65470, 17217539}, {65471, 2}, {65474, 17217795}, {65475, 17218051}, - {65476, 17218307}, {65477, 17218563}, {65478, 17218819}, {65479, 17219075}, - {65480, 2}, {65482, 17219331}, {65483, 17219587}, {65484, 17219843}, - {65485, 17220099}, {65486, 17220355}, {65487, 17220611}, {65488, 2}, - {65490, 17220867}, {65491, 17221123}, {65492, 17221379}, {65493, 17221635}, - {65494, 17221891}, {65495, 17222147}, {65496, 2}, {65498, 17222403}, - {65499, 17222659}, {65500, 17222915}, {65501, 2}, {65504, 17875715}, - {65505, 17875971}, {65506, 17876227}, {65507, 33561859}, {65508, 17876483}, - {65509, 17876739}, {65510, 17876995}, {65511, 2}, {65512, 17877251}, - {65513, 17877507}, {65514, 17877763}, {65515, 17878019}, {65516, 17878275}, - {65517, 17878531}, {65518, 17878787}, {65519, 2}, {65536, 1}, - {65548, 2}, {65549, 1}, {65575, 2}, {65576, 1}, - {65595, 2}, {65596, 1}, {65598, 2}, {65599, 1}, - {65614, 2}, {65616, 1}, {65630, 2}, {65664, 1}, - {65787, 2}, {65792, 1}, {65795, 2}, {65799, 1}, - {65844, 2}, {65847, 1}, {65935, 2}, {65936, 1}, - {65949, 2}, {65952, 1}, {65953, 2}, {66000, 1}, - {66046, 2}, {66176, 1}, {66205, 2}, {66208, 1}, - {66257, 2}, {66272, 1}, {66300, 2}, {66304, 1}, - {66340, 2}, {66349, 1}, {66379, 2}, {66384, 1}, - {66427, 2}, {66432, 1}, {66462, 2}, {66463, 1}, - {66500, 2}, {66504, 1}, {66518, 2}, {66560, 17879043}, - {66561, 17879299}, {66562, 17879555}, {66563, 17879811}, {66564, 17880067}, - {66565, 17880323}, {66566, 17880579}, {66567, 17880835}, {66568, 17881091}, - {66569, 17881347}, {66570, 17881603}, {66571, 17881859}, {66572, 17882115}, - {66573, 17882371}, {66574, 17882627}, {66575, 17882883}, {66576, 17883139}, - {66577, 17883395}, {66578, 17883651}, {66579, 17883907}, {66580, 17884163}, - {66581, 17884419}, {66582, 17884675}, {66583, 17884931}, {66584, 17885187}, - {66585, 17885443}, {66586, 17885699}, {66587, 17885955}, {66588, 17886211}, - {66589, 17886467}, {66590, 17886723}, {66591, 17886979}, {66592, 17887235}, - {66593, 17887491}, {66594, 17887747}, {66595, 17888003}, {66596, 17888259}, - {66597, 17888515}, {66598, 17888771}, {66599, 17889027}, {66600, 1}, - {66718, 2}, {66720, 1}, {66730, 2}, {66736, 17889283}, - {66737, 17889539}, {66738, 17889795}, {66739, 17890051}, {66740, 17890307}, - {66741, 17890563}, {66742, 17890819}, {66743, 17891075}, {66744, 17891331}, - {66745, 17891587}, {66746, 17891843}, {66747, 17892099}, {66748, 17892355}, - {66749, 17892611}, {66750, 17892867}, {66751, 17893123}, {66752, 17893379}, - {66753, 17893635}, {66754, 17893891}, {66755, 17894147}, {66756, 17894403}, - {66757, 17894659}, {66758, 17894915}, {66759, 17895171}, {66760, 17895427}, - {66761, 17895683}, {66762, 17895939}, {66763, 17896195}, {66764, 17896451}, - {66765, 17896707}, {66766, 17896963}, {66767, 17897219}, {66768, 17897475}, - {66769, 17897731}, {66770, 17897987}, {66771, 17898243}, {66772, 2}, - {66776, 1}, {66812, 2}, {66816, 1}, {66856, 2}, - {66864, 1}, {66916, 2}, {66927, 1}, {66928, 17898499}, - {66929, 17898755}, {66930, 17899011}, {66931, 17899267}, {66932, 17899523}, - {66933, 17899779}, {66934, 17900035}, {66935, 17900291}, {66936, 17900547}, - {66937, 17900803}, {66938, 17901059}, {66939, 2}, {66940, 17901315}, - {66941, 17901571}, {66942, 17901827}, {66943, 17902083}, {66944, 17902339}, - {66945, 17902595}, {66946, 17902851}, {66947, 17903107}, {66948, 17903363}, - {66949, 17903619}, {66950, 17903875}, {66951, 17904131}, {66952, 17904387}, - {66953, 17904643}, {66954, 17904899}, {66955, 2}, {66956, 17905155}, - {66957, 17905411}, {66958, 17905667}, {66959, 17905923}, {66960, 17906179}, - {66961, 17906435}, {66962, 17906691}, {66963, 2}, {66964, 17906947}, - {66965, 17907203}, {66966, 2}, {66967, 1}, {66978, 2}, - {66979, 1}, {66994, 2}, {66995, 1}, {67002, 2}, - {67003, 1}, {67005, 2}, {67008, 1}, {67060, 2}, - {67072, 1}, {67383, 2}, {67392, 1}, {67414, 2}, - {67424, 1}, {67432, 2}, {67456, 1}, {67457, 17907459}, - {67458, 17907715}, {67459, 16791043}, {67460, 17907971}, {67461, 16814083}, - {67462, 2}, {67463, 17908227}, {67464, 17908483}, {67465, 17908739}, - {67466, 17908995}, {67467, 16815363}, {67468, 16815619}, {67469, 17909251}, - {67470, 17909507}, {67471, 17909763}, {67472, 17910019}, {67473, 17527555}, - {67474, 17910275}, {67475, 16817155}, {67476, 17910531}, {67477, 16802051}, - {67478, 17910787}, {67479, 17911043}, {67480, 17911299}, {67481, 17911555}, - {67482, 17911811}, {67483, 17523459}, {67484, 17912067}, {67485, 17912323}, - {67486, 17912579}, {67487, 17912835}, {67488, 17913091}, {67489, 17913347}, - {67490, 16795395}, {67491, 17913603}, {67492, 17913859}, {67493, 16781315}, - {67494, 17914115}, {67495, 17914371}, {67496, 17135875}, {67497, 17914627}, - {67498, 16819971}, {67499, 17914883}, {67500, 17915139}, {67501, 17915395}, - {67502, 17915651}, {67503, 16820995}, {67504, 17915907}, {67505, 2}, - {67506, 17916163}, {67507, 17916419}, {67508, 17916675}, {67509, 17916931}, - {67510, 17917187}, {67511, 17917443}, {67512, 17917699}, {67513, 17917955}, - {67514, 17918211}, {67515, 2}, {67584, 1}, {67590, 2}, - {67592, 1}, {67593, 2}, {67594, 1}, {67638, 2}, - {67639, 1}, {67641, 2}, {67644, 1}, {67645, 2}, - {67647, 1}, {67670, 2}, {67671, 1}, {67743, 2}, - {67751, 1}, {67760, 2}, {67808, 1}, {67827, 2}, - {67828, 1}, {67830, 2}, {67835, 1}, {67868, 2}, - {67871, 1}, {67898, 2}, {67903, 1}, {67930, 2}, - {67968, 1}, {68024, 2}, {68028, 1}, {68048, 2}, - {68050, 1}, {68100, 2}, {68101, 1}, {68103, 2}, - {68108, 1}, {68116, 2}, {68117, 1}, {68120, 2}, - {68121, 1}, {68150, 2}, {68152, 1}, {68155, 2}, - {68159, 1}, {68169, 2}, {68176, 1}, {68185, 2}, - {68192, 1}, {68256, 2}, {68288, 1}, {68327, 2}, - {68331, 1}, {68343, 2}, {68352, 1}, {68406, 2}, - {68409, 1}, {68438, 2}, {68440, 1}, {68467, 2}, - {68472, 1}, {68498, 2}, {68505, 1}, {68509, 2}, - {68521, 1}, {68528, 2}, {68608, 1}, {68681, 2}, - {68736, 17918467}, {68737, 17918723}, {68738, 17918979}, {68739, 17919235}, - {68740, 17919491}, {68741, 17919747}, {68742, 17920003}, {68743, 17920259}, - {68744, 17920515}, {68745, 17920771}, {68746, 17921027}, {68747, 17921283}, - {68748, 17921539}, {68749, 17921795}, {68750, 17922051}, {68751, 17922307}, - {68752, 17922563}, {68753, 17922819}, {68754, 17923075}, {68755, 17923331}, - {68756, 17923587}, {68757, 17923843}, {68758, 17924099}, {68759, 17924355}, - {68760, 17924611}, {68761, 17924867}, {68762, 17925123}, {68763, 17925379}, - {68764, 17925635}, {68765, 17925891}, {68766, 17926147}, {68767, 17926403}, - {68768, 17926659}, {68769, 17926915}, {68770, 17927171}, {68771, 17927427}, - {68772, 17927683}, {68773, 17927939}, {68774, 17928195}, {68775, 17928451}, - {68776, 17928707}, {68777, 17928963}, {68778, 17929219}, {68779, 17929475}, - {68780, 17929731}, {68781, 17929987}, {68782, 17930243}, {68783, 17930499}, - {68784, 17930755}, {68785, 17931011}, {68786, 17931267}, {68787, 2}, - {68800, 1}, {68851, 2}, {68858, 1}, {68904, 2}, - {68912, 1}, {68922, 2}, {68928, 1}, {68944, 17931523}, - {68945, 17931779}, {68946, 17932035}, {68947, 17932291}, {68948, 17932547}, - {68949, 17932803}, {68950, 17933059}, {68951, 17933315}, {68952, 17933571}, - {68953, 17933827}, {68954, 17934083}, {68955, 17934339}, {68956, 17934595}, - {68957, 17934851}, {68958, 17935107}, {68959, 17935363}, {68960, 17935619}, - {68961, 17935875}, {68962, 17936131}, {68963, 17936387}, {68964, 17936643}, - {68965, 17936899}, {68966, 2}, {68969, 1}, {68998, 2}, - {69006, 1}, {69008, 2}, {69216, 1}, {69247, 2}, - {69248, 1}, {69290, 2}, {69291, 1}, {69294, 2}, - {69296, 1}, {69298, 2}, {69314, 1}, {69320, 2}, - {69328, 1}, {69337, 2}, {69370, 1}, {69416, 2}, - {69424, 1}, {69466, 2}, {69488, 1}, {69514, 2}, - {69552, 1}, {69580, 2}, {69600, 1}, {69623, 2}, - {69632, 1}, {69710, 2}, {69714, 1}, {69750, 2}, - {69759, 1}, {69821, 2}, {69822, 1}, {69827, 2}, - {69840, 1}, {69865, 2}, {69872, 1}, {69882, 2}, - {69888, 1}, {69941, 2}, {69942, 1}, {69960, 2}, - {69968, 1}, {70007, 2}, {70016, 1}, {70112, 2}, - {70113, 1}, {70133, 2}, {70144, 1}, {70162, 2}, - {70163, 1}, {70210, 2}, {70272, 1}, {70279, 2}, - {70280, 1}, {70281, 2}, {70282, 1}, {70286, 2}, - {70287, 1}, {70302, 2}, {70303, 1}, {70314, 2}, - {70320, 1}, {70379, 2}, {70384, 1}, {70394, 2}, - {70400, 1}, {70404, 2}, {70405, 1}, {70413, 2}, - {70415, 1}, {70417, 2}, {70419, 1}, {70441, 2}, - {70442, 1}, {70449, 2}, {70450, 1}, {70452, 2}, - {70453, 1}, {70458, 2}, {70459, 1}, {70469, 2}, - {70471, 1}, {70473, 2}, {70475, 1}, {70478, 2}, - {70480, 1}, {70481, 2}, {70487, 1}, {70488, 2}, - {70493, 1}, {70500, 2}, {70502, 1}, {70509, 2}, - {70512, 1}, {70517, 2}, {70528, 1}, {70538, 2}, - {70539, 1}, {70540, 2}, {70542, 1}, {70543, 2}, - {70544, 1}, {70582, 2}, {70583, 1}, {70593, 2}, - {70594, 1}, {70595, 2}, {70597, 1}, {70598, 2}, - {70599, 1}, {70603, 2}, {70604, 1}, {70614, 2}, - {70615, 1}, {70617, 2}, {70625, 1}, {70627, 2}, - {70656, 1}, {70748, 2}, {70749, 1}, {70754, 2}, - {70784, 1}, {70856, 2}, {70864, 1}, {70874, 2}, - {71040, 1}, {71094, 2}, {71096, 1}, {71134, 2}, - {71168, 1}, {71237, 2}, {71248, 1}, {71258, 2}, - {71264, 1}, {71277, 2}, {71296, 1}, {71354, 2}, - {71360, 1}, {71370, 2}, {71376, 1}, {71396, 2}, - {71424, 1}, {71451, 2}, {71453, 1}, {71468, 2}, - {71472, 1}, {71495, 2}, {71680, 1}, {71740, 2}, - {71840, 17937155}, {71841, 17937411}, {71842, 17937667}, {71843, 17937923}, - {71844, 17938179}, {71845, 17938435}, {71846, 17938691}, {71847, 17938947}, - {71848, 17939203}, {71849, 17939459}, {71850, 17939715}, {71851, 17939971}, - {71852, 17940227}, {71853, 17940483}, {71854, 17940739}, {71855, 17940995}, - {71856, 17941251}, {71857, 17941507}, {71858, 17941763}, {71859, 17942019}, - {71860, 17942275}, {71861, 17942531}, {71862, 17942787}, {71863, 17943043}, - {71864, 17943299}, {71865, 17943555}, {71866, 17943811}, {71867, 17944067}, - {71868, 17944323}, {71869, 17944579}, {71870, 17944835}, {71871, 17945091}, - {71872, 1}, {71923, 2}, {71935, 1}, {71943, 2}, - {71945, 1}, {71946, 2}, {71948, 1}, {71956, 2}, - {71957, 1}, {71959, 2}, {71960, 1}, {71990, 2}, - {71991, 1}, {71993, 2}, {71995, 1}, {72007, 2}, - {72016, 1}, {72026, 2}, {72096, 1}, {72104, 2}, - {72106, 1}, {72152, 2}, {72154, 1}, {72165, 2}, - {72192, 1}, {72264, 2}, {72272, 1}, {72355, 2}, - {72368, 1}, {72441, 2}, {72448, 1}, {72458, 2}, - {72544, 1}, {72552, 2}, {72640, 1}, {72674, 2}, - {72688, 1}, {72698, 2}, {72704, 1}, {72713, 2}, - {72714, 1}, {72759, 2}, {72760, 1}, {72774, 2}, - {72784, 1}, {72813, 2}, {72816, 1}, {72848, 2}, - {72850, 1}, {72872, 2}, {72873, 1}, {72887, 2}, - {72960, 1}, {72967, 2}, {72968, 1}, {72970, 2}, - {72971, 1}, {73015, 2}, {73018, 1}, {73019, 2}, - {73020, 1}, {73022, 2}, {73023, 1}, {73032, 2}, - {73040, 1}, {73050, 2}, {73056, 1}, {73062, 2}, - {73063, 1}, {73065, 2}, {73066, 1}, {73103, 2}, - {73104, 1}, {73106, 2}, {73107, 1}, {73113, 2}, - {73120, 1}, {73130, 2}, {73136, 1}, {73180, 2}, - {73184, 1}, {73194, 2}, {73440, 1}, {73465, 2}, - {73472, 1}, {73489, 2}, {73490, 1}, {73531, 2}, - {73534, 1}, {73563, 2}, {73648, 1}, {73649, 2}, - {73664, 1}, {73714, 2}, {73727, 1}, {74650, 2}, - {74752, 1}, {74863, 2}, {74864, 1}, {74869, 2}, - {74880, 1}, {75076, 2}, {77712, 1}, {77811, 2}, - {77824, 1}, {78896, 2}, {78912, 1}, {78934, 2}, - {78944, 1}, {82939, 2}, {82944, 1}, {83527, 2}, - {90368, 1}, {90426, 2}, {92160, 1}, {92729, 2}, - {92736, 1}, {92767, 2}, {92768, 1}, {92778, 2}, - {92782, 1}, {92863, 2}, {92864, 1}, {92874, 2}, - {92880, 1}, {92910, 2}, {92912, 1}, {92918, 2}, - {92928, 1}, {92998, 2}, {93008, 1}, {93018, 2}, - {93019, 1}, {93026, 2}, {93027, 1}, {93048, 2}, - {93053, 1}, {93072, 2}, {93504, 1}, {93562, 2}, - {93760, 17945347}, {93761, 17945603}, {93762, 17945859}, {93763, 17946115}, - {93764, 17946371}, {93765, 17946627}, {93766, 17946883}, {93767, 17947139}, - {93768, 17947395}, {93769, 17947651}, {93770, 17947907}, {93771, 17948163}, - {93772, 17948419}, {93773, 17948675}, {93774, 17948931}, {93775, 17949187}, - {93776, 17949443}, {93777, 17949699}, {93778, 17949955}, {93779, 17950211}, - {93780, 17950467}, {93781, 17950723}, {93782, 17950979}, {93783, 17951235}, - {93784, 17951491}, {93785, 17951747}, {93786, 17952003}, {93787, 17952259}, - {93788, 17952515}, {93789, 17952771}, {93790, 17953027}, {93791, 17953283}, - {93792, 1}, {93851, 2}, {93856, 17953539}, {93857, 17953795}, - {93858, 17954051}, {93859, 17954307}, {93860, 17954563}, {93861, 17954819}, - {93862, 17955075}, {93863, 17955331}, {93864, 17955587}, {93865, 17955843}, - {93866, 17956099}, {93867, 17956355}, {93868, 17956611}, {93869, 17956867}, - {93870, 17957123}, {93871, 17957379}, {93872, 17957635}, {93873, 17957891}, - {93874, 17958147}, {93875, 17958403}, {93876, 17958659}, {93877, 17958915}, - {93878, 17959171}, {93879, 17959427}, {93880, 17959683}, {93881, 2}, - {93883, 1}, {93908, 2}, {93952, 1}, {94027, 2}, - {94031, 1}, {94088, 2}, {94095, 1}, {94112, 2}, - {94176, 1}, {94181, 2}, {94192, 1}, {94199, 2}, - {94208, 1}, {101590, 2}, {101631, 1}, {101663, 2}, - {101760, 1}, {101875, 2}, {110576, 1}, {110580, 2}, - {110581, 1}, {110588, 2}, {110589, 1}, {110591, 2}, - {110592, 1}, {110883, 2}, {110898, 1}, {110899, 2}, - {110928, 1}, {110931, 2}, {110933, 1}, {110934, 2}, - {110948, 1}, {110952, 2}, {110960, 1}, {111356, 2}, - {113664, 1}, {113771, 2}, {113776, 1}, {113789, 2}, - {113792, 1}, {113801, 2}, {113808, 1}, {113818, 2}, - {113820, 1}, {113824, 0}, {113828, 2}, {117760, 1}, - {117974, 16777219}, {117975, 16777475}, {117976, 16777731}, {117977, 16777987}, - {117978, 16778243}, {117979, 16778499}, {117980, 16778755}, {117981, 16779011}, - {117982, 16779267}, {117983, 16779523}, {117984, 16779779}, {117985, 16780035}, - {117986, 16780291}, {117987, 16780547}, {117988, 16780803}, {117989, 16781059}, - {117990, 16781315}, {117991, 16781571}, {117992, 16781827}, {117993, 16782083}, - {117994, 16782339}, {117995, 16782595}, {117996, 16782851}, {117997, 16783107}, - {117998, 16783363}, {117999, 16783619}, {118000, 17045507}, {118001, 16786947}, - {118002, 16785155}, {118003, 16785411}, {118004, 16787715}, {118005, 17045763}, - {118006, 17046019}, {118007, 17046275}, {118008, 17046531}, {118009, 17046787}, - {118010, 1}, {118013, 2}, {118016, 1}, {118452, 2}, - {118458, 1}, {118481, 2}, {118496, 1}, {118513, 2}, - {118528, 1}, {118574, 2}, {118576, 1}, {118599, 2}, - {118608, 1}, {118724, 2}, {118784, 1}, {119030, 2}, - {119040, 1}, {119079, 2}, {119081, 1}, {119134, 34737155}, - {119135, 34737667}, {119136, 51515395}, {119137, 51516163}, {119138, 51516931}, - {119139, 51517699}, {119140, 51518467}, {119141, 1}, {119155, 0}, - {119163, 1}, {119227, 34742019}, {119228, 34742531}, {119229, 51520259}, - {119230, 51521027}, {119231, 51521795}, {119232, 51522563}, {119233, 1}, - {119275, 2}, {119296, 1}, {119366, 2}, {119488, 1}, - {119508, 2}, {119520, 1}, {119540, 2}, {119552, 1}, - {119639, 2}, {119648, 1}, {119673, 2}, {119808, 16777219}, - {119809, 16777475}, {119810, 16777731}, {119811, 16777987}, {119812, 16778243}, - {119813, 16778499}, {119814, 16778755}, {119815, 16779011}, {119816, 16779267}, - {119817, 16779523}, {119818, 16779779}, {119819, 16780035}, {119820, 16780291}, - {119821, 16780547}, {119822, 16780803}, {119823, 16781059}, {119824, 16781315}, - {119825, 16781571}, {119826, 16781827}, {119827, 16782083}, {119828, 16782339}, - {119829, 16782595}, {119830, 16782851}, {119831, 16783107}, {119832, 16783363}, - {119833, 16783619}, {119834, 16777219}, {119835, 16777475}, {119836, 16777731}, - {119837, 16777987}, {119838, 16778243}, {119839, 16778499}, {119840, 16778755}, - {119841, 16779011}, {119842, 16779267}, {119843, 16779523}, {119844, 16779779}, - {119845, 16780035}, {119846, 16780291}, {119847, 16780547}, {119848, 16780803}, - {119849, 16781059}, {119850, 16781315}, {119851, 16781571}, {119852, 16781827}, - {119853, 16782083}, {119854, 16782339}, {119855, 16782595}, {119856, 16782851}, - {119857, 16783107}, {119858, 16783363}, {119859, 16783619}, {119860, 16777219}, - {119861, 16777475}, {119862, 16777731}, {119863, 16777987}, {119864, 16778243}, - {119865, 16778499}, {119866, 16778755}, {119867, 16779011}, {119868, 16779267}, - {119869, 16779523}, {119870, 16779779}, {119871, 16780035}, {119872, 16780291}, - {119873, 16780547}, {119874, 16780803}, {119875, 16781059}, {119876, 16781315}, - {119877, 16781571}, {119878, 16781827}, {119879, 16782083}, {119880, 16782339}, - {119881, 16782595}, {119882, 16782851}, {119883, 16783107}, {119884, 16783363}, - {119885, 16783619}, {119886, 16777219}, {119887, 16777475}, {119888, 16777731}, - {119889, 16777987}, {119890, 16778243}, {119891, 16778499}, {119892, 16778755}, - {119893, 2}, {119894, 16779267}, {119895, 16779523}, {119896, 16779779}, - {119897, 16780035}, {119898, 16780291}, {119899, 16780547}, {119900, 16780803}, - {119901, 16781059}, {119902, 16781315}, {119903, 16781571}, {119904, 16781827}, - {119905, 16782083}, {119906, 16782339}, {119907, 16782595}, {119908, 16782851}, - {119909, 16783107}, {119910, 16783363}, {119911, 16783619}, {119912, 16777219}, - {119913, 16777475}, {119914, 16777731}, {119915, 16777987}, {119916, 16778243}, - {119917, 16778499}, {119918, 16778755}, {119919, 16779011}, {119920, 16779267}, - {119921, 16779523}, {119922, 16779779}, {119923, 16780035}, {119924, 16780291}, - {119925, 16780547}, {119926, 16780803}, {119927, 16781059}, {119928, 16781315}, - {119929, 16781571}, {119930, 16781827}, {119931, 16782083}, {119932, 16782339}, - {119933, 16782595}, {119934, 16782851}, {119935, 16783107}, {119936, 16783363}, - {119937, 16783619}, {119938, 16777219}, {119939, 16777475}, {119940, 16777731}, - {119941, 16777987}, {119942, 16778243}, {119943, 16778499}, {119944, 16778755}, - {119945, 16779011}, {119946, 16779267}, {119947, 16779523}, {119948, 16779779}, - {119949, 16780035}, {119950, 16780291}, {119951, 16780547}, {119952, 16780803}, - {119953, 16781059}, {119954, 16781315}, {119955, 16781571}, {119956, 16781827}, - {119957, 16782083}, {119958, 16782339}, {119959, 16782595}, {119960, 16782851}, - {119961, 16783107}, {119962, 16783363}, {119963, 16783619}, {119964, 16777219}, - {119965, 2}, {119966, 16777731}, {119967, 16777987}, {119968, 2}, - {119970, 16778755}, {119971, 2}, {119973, 16779523}, {119974, 16779779}, - {119975, 2}, {119977, 16780547}, {119978, 16780803}, {119979, 16781059}, - {119980, 16781315}, {119981, 2}, {119982, 16781827}, {119983, 16782083}, - {119984, 16782339}, {119985, 16782595}, {119986, 16782851}, {119987, 16783107}, - {119988, 16783363}, {119989, 16783619}, {119990, 16777219}, {119991, 16777475}, - {119992, 16777731}, {119993, 16777987}, {119994, 2}, {119995, 16778499}, - {119996, 2}, {119997, 16779011}, {119998, 16779267}, {119999, 16779523}, - {120000, 16779779}, {120001, 16780035}, {120002, 16780291}, {120003, 16780547}, - {120004, 2}, {120005, 16781059}, {120006, 16781315}, {120007, 16781571}, - {120008, 16781827}, {120009, 16782083}, {120010, 16782339}, {120011, 16782595}, - {120012, 16782851}, {120013, 16783107}, {120014, 16783363}, {120015, 16783619}, - {120016, 16777219}, {120017, 16777475}, {120018, 16777731}, {120019, 16777987}, - {120020, 16778243}, {120021, 16778499}, {120022, 16778755}, {120023, 16779011}, - {120024, 16779267}, {120025, 16779523}, {120026, 16779779}, {120027, 16780035}, - {120028, 16780291}, {120029, 16780547}, {120030, 16780803}, {120031, 16781059}, - {120032, 16781315}, {120033, 16781571}, {120034, 16781827}, {120035, 16782083}, - {120036, 16782339}, {120037, 16782595}, {120038, 16782851}, {120039, 16783107}, - {120040, 16783363}, {120041, 16783619}, {120042, 16777219}, {120043, 16777475}, - {120044, 16777731}, {120045, 16777987}, {120046, 16778243}, {120047, 16778499}, - {120048, 16778755}, {120049, 16779011}, {120050, 16779267}, {120051, 16779523}, - {120052, 16779779}, {120053, 16780035}, {120054, 16780291}, {120055, 16780547}, - {120056, 16780803}, {120057, 16781059}, {120058, 16781315}, {120059, 16781571}, - {120060, 16781827}, {120061, 16782083}, {120062, 16782339}, {120063, 16782595}, - {120064, 16782851}, {120065, 16783107}, {120066, 16783363}, {120067, 16783619}, - {120068, 16777219}, {120069, 16777475}, {120070, 2}, {120071, 16777987}, - {120072, 16778243}, {120073, 16778499}, {120074, 16778755}, {120075, 2}, - {120077, 16779523}, {120078, 16779779}, {120079, 16780035}, {120080, 16780291}, - {120081, 16780547}, {120082, 16780803}, {120083, 16781059}, {120084, 16781315}, - {120085, 2}, {120086, 16781827}, {120087, 16782083}, {120088, 16782339}, - {120089, 16782595}, {120090, 16782851}, {120091, 16783107}, {120092, 16783363}, - {120093, 2}, {120094, 16777219}, {120095, 16777475}, {120096, 16777731}, - {120097, 16777987}, {120098, 16778243}, {120099, 16778499}, {120100, 16778755}, - {120101, 16779011}, {120102, 16779267}, {120103, 16779523}, {120104, 16779779}, - {120105, 16780035}, {120106, 16780291}, {120107, 16780547}, {120108, 16780803}, - {120109, 16781059}, {120110, 16781315}, {120111, 16781571}, {120112, 16781827}, - {120113, 16782083}, {120114, 16782339}, {120115, 16782595}, {120116, 16782851}, - {120117, 16783107}, {120118, 16783363}, {120119, 16783619}, {120120, 16777219}, - {120121, 16777475}, {120122, 2}, {120123, 16777987}, {120124, 16778243}, - {120125, 16778499}, {120126, 16778755}, {120127, 2}, {120128, 16779267}, - {120129, 16779523}, {120130, 16779779}, {120131, 16780035}, {120132, 16780291}, - {120133, 2}, {120134, 16780803}, {120135, 2}, {120138, 16781827}, - {120139, 16782083}, {120140, 16782339}, {120141, 16782595}, {120142, 16782851}, - {120143, 16783107}, {120144, 16783363}, {120145, 2}, {120146, 16777219}, - {120147, 16777475}, {120148, 16777731}, {120149, 16777987}, {120150, 16778243}, - {120151, 16778499}, {120152, 16778755}, {120153, 16779011}, {120154, 16779267}, - {120155, 16779523}, {120156, 16779779}, {120157, 16780035}, {120158, 16780291}, - {120159, 16780547}, {120160, 16780803}, {120161, 16781059}, {120162, 16781315}, - {120163, 16781571}, {120164, 16781827}, {120165, 16782083}, {120166, 16782339}, - {120167, 16782595}, {120168, 16782851}, {120169, 16783107}, {120170, 16783363}, - {120171, 16783619}, {120172, 16777219}, {120173, 16777475}, {120174, 16777731}, - {120175, 16777987}, {120176, 16778243}, {120177, 16778499}, {120178, 16778755}, - {120179, 16779011}, {120180, 16779267}, {120181, 16779523}, {120182, 16779779}, - {120183, 16780035}, {120184, 16780291}, {120185, 16780547}, {120186, 16780803}, - {120187, 16781059}, {120188, 16781315}, {120189, 16781571}, {120190, 16781827}, - {120191, 16782083}, {120192, 16782339}, {120193, 16782595}, {120194, 16782851}, - {120195, 16783107}, {120196, 16783363}, {120197, 16783619}, {120198, 16777219}, - {120199, 16777475}, {120200, 16777731}, {120201, 16777987}, {120202, 16778243}, - {120203, 16778499}, {120204, 16778755}, {120205, 16779011}, {120206, 16779267}, - {120207, 16779523}, {120208, 16779779}, {120209, 16780035}, {120210, 16780291}, - {120211, 16780547}, {120212, 16780803}, {120213, 16781059}, {120214, 16781315}, - {120215, 16781571}, {120216, 16781827}, {120217, 16782083}, {120218, 16782339}, - {120219, 16782595}, {120220, 16782851}, {120221, 16783107}, {120222, 16783363}, - {120223, 16783619}, {120224, 16777219}, {120225, 16777475}, {120226, 16777731}, - {120227, 16777987}, {120228, 16778243}, {120229, 16778499}, {120230, 16778755}, - {120231, 16779011}, {120232, 16779267}, {120233, 16779523}, {120234, 16779779}, - {120235, 16780035}, {120236, 16780291}, {120237, 16780547}, {120238, 16780803}, - {120239, 16781059}, {120240, 16781315}, {120241, 16781571}, {120242, 16781827}, - {120243, 16782083}, {120244, 16782339}, {120245, 16782595}, {120246, 16782851}, - {120247, 16783107}, {120248, 16783363}, {120249, 16783619}, {120250, 16777219}, - {120251, 16777475}, {120252, 16777731}, {120253, 16777987}, {120254, 16778243}, - {120255, 16778499}, {120256, 16778755}, {120257, 16779011}, {120258, 16779267}, - {120259, 16779523}, {120260, 16779779}, {120261, 16780035}, {120262, 16780291}, - {120263, 16780547}, {120264, 16780803}, {120265, 16781059}, {120266, 16781315}, - {120267, 16781571}, {120268, 16781827}, {120269, 16782083}, {120270, 16782339}, - {120271, 16782595}, {120272, 16782851}, {120273, 16783107}, {120274, 16783363}, - {120275, 16783619}, {120276, 16777219}, {120277, 16777475}, {120278, 16777731}, - {120279, 16777987}, {120280, 16778243}, {120281, 16778499}, {120282, 16778755}, - {120283, 16779011}, {120284, 16779267}, {120285, 16779523}, {120286, 16779779}, - {120287, 16780035}, {120288, 16780291}, {120289, 16780547}, {120290, 16780803}, - {120291, 16781059}, {120292, 16781315}, {120293, 16781571}, {120294, 16781827}, - {120295, 16782083}, {120296, 16782339}, {120297, 16782595}, {120298, 16782851}, - {120299, 16783107}, {120300, 16783363}, {120301, 16783619}, {120302, 16777219}, - {120303, 16777475}, {120304, 16777731}, {120305, 16777987}, {120306, 16778243}, - {120307, 16778499}, {120308, 16778755}, {120309, 16779011}, {120310, 16779267}, - {120311, 16779523}, {120312, 16779779}, {120313, 16780035}, {120314, 16780291}, - {120315, 16780547}, {120316, 16780803}, {120317, 16781059}, {120318, 16781315}, - {120319, 16781571}, {120320, 16781827}, {120321, 16782083}, {120322, 16782339}, - {120323, 16782595}, {120324, 16782851}, {120325, 16783107}, {120326, 16783363}, - {120327, 16783619}, {120328, 16777219}, {120329, 16777475}, {120330, 16777731}, - {120331, 16777987}, {120332, 16778243}, {120333, 16778499}, {120334, 16778755}, - {120335, 16779011}, {120336, 16779267}, {120337, 16779523}, {120338, 16779779}, - {120339, 16780035}, {120340, 16780291}, {120341, 16780547}, {120342, 16780803}, - {120343, 16781059}, {120344, 16781315}, {120345, 16781571}, {120346, 16781827}, - {120347, 16782083}, {120348, 16782339}, {120349, 16782595}, {120350, 16782851}, - {120351, 16783107}, {120352, 16783363}, {120353, 16783619}, {120354, 16777219}, - {120355, 16777475}, {120356, 16777731}, {120357, 16777987}, {120358, 16778243}, - {120359, 16778499}, {120360, 16778755}, {120361, 16779011}, {120362, 16779267}, - {120363, 16779523}, {120364, 16779779}, {120365, 16780035}, {120366, 16780291}, - {120367, 16780547}, {120368, 16780803}, {120369, 16781059}, {120370, 16781315}, - {120371, 16781571}, {120372, 16781827}, {120373, 16782083}, {120374, 16782339}, - {120375, 16782595}, {120376, 16782851}, {120377, 16783107}, {120378, 16783363}, - {120379, 16783619}, {120380, 16777219}, {120381, 16777475}, {120382, 16777731}, - {120383, 16777987}, {120384, 16778243}, {120385, 16778499}, {120386, 16778755}, - {120387, 16779011}, {120388, 16779267}, {120389, 16779523}, {120390, 16779779}, - {120391, 16780035}, {120392, 16780291}, {120393, 16780547}, {120394, 16780803}, - {120395, 16781059}, {120396, 16781315}, {120397, 16781571}, {120398, 16781827}, - {120399, 16782083}, {120400, 16782339}, {120401, 16782595}, {120402, 16782851}, - {120403, 16783107}, {120404, 16783363}, {120405, 16783619}, {120406, 16777219}, - {120407, 16777475}, {120408, 16777731}, {120409, 16777987}, {120410, 16778243}, - {120411, 16778499}, {120412, 16778755}, {120413, 16779011}, {120414, 16779267}, - {120415, 16779523}, {120416, 16779779}, {120417, 16780035}, {120418, 16780291}, - {120419, 16780547}, {120420, 16780803}, {120421, 16781059}, {120422, 16781315}, - {120423, 16781571}, {120424, 16781827}, {120425, 16782083}, {120426, 16782339}, - {120427, 16782595}, {120428, 16782851}, {120429, 16783107}, {120430, 16783363}, - {120431, 16783619}, {120432, 16777219}, {120433, 16777475}, {120434, 16777731}, - {120435, 16777987}, {120436, 16778243}, {120437, 16778499}, {120438, 16778755}, - {120439, 16779011}, {120440, 16779267}, {120441, 16779523}, {120442, 16779779}, - {120443, 16780035}, {120444, 16780291}, {120445, 16780547}, {120446, 16780803}, - {120447, 16781059}, {120448, 16781315}, {120449, 16781571}, {120450, 16781827}, - {120451, 16782083}, {120452, 16782339}, {120453, 16782595}, {120454, 16782851}, - {120455, 16783107}, {120456, 16783363}, {120457, 16783619}, {120458, 16777219}, - {120459, 16777475}, {120460, 16777731}, {120461, 16777987}, {120462, 16778243}, - {120463, 16778499}, {120464, 16778755}, {120465, 16779011}, {120466, 16779267}, - {120467, 16779523}, {120468, 16779779}, {120469, 16780035}, {120470, 16780291}, - {120471, 16780547}, {120472, 16780803}, {120473, 16781059}, {120474, 16781315}, - {120475, 16781571}, {120476, 16781827}, {120477, 16782083}, {120478, 16782339}, - {120479, 16782595}, {120480, 16782851}, {120481, 16783107}, {120482, 16783363}, - {120483, 16783619}, {120484, 17968899}, {120485, 17969155}, {120486, 2}, - {120488, 16851715}, {120489, 16851971}, {120490, 16852227}, {120491, 16852483}, - {120492, 16852739}, {120493, 16852995}, {120494, 16853251}, {120495, 16853507}, - {120496, 16846851}, {120497, 16853763}, {120498, 16854019}, {120499, 16786179}, - {120500, 16854275}, {120501, 16854531}, {120502, 16854787}, {120503, 16855043}, - {120504, 16855299}, {120505, 16853507}, {120506, 16855555}, {120507, 16855811}, - {120508, 16856067}, {120509, 16856323}, {120510, 16856579}, {120511, 16856835}, - {120512, 16857091}, {120513, 17969411}, {120514, 16851715}, {120515, 16851971}, - {120516, 16852227}, {120517, 16852483}, {120518, 16852739}, {120519, 16852995}, - {120520, 16853251}, {120521, 16853507}, {120522, 16846851}, {120523, 16853763}, - {120524, 16854019}, {120525, 16786179}, {120526, 16854275}, {120527, 16854531}, - {120528, 16854787}, {120529, 16855043}, {120530, 16855299}, {120531, 16855555}, - {120533, 16855811}, {120534, 16856067}, {120535, 16856323}, {120536, 16856579}, - {120537, 16856835}, {120538, 16857091}, {120539, 17969667}, {120540, 16852739}, - {120541, 16853507}, {120542, 16853763}, {120543, 16856323}, {120544, 16855299}, - {120545, 16855043}, {120546, 16851715}, {120547, 16851971}, {120548, 16852227}, - {120549, 16852483}, {120550, 16852739}, {120551, 16852995}, {120552, 16853251}, - {120553, 16853507}, {120554, 16846851}, {120555, 16853763}, {120556, 16854019}, - {120557, 16786179}, {120558, 16854275}, {120559, 16854531}, {120560, 16854787}, - {120561, 16855043}, {120562, 16855299}, {120563, 16853507}, {120564, 16855555}, - {120565, 16855811}, {120566, 16856067}, {120567, 16856323}, {120568, 16856579}, - {120569, 16856835}, {120570, 16857091}, {120571, 17969411}, {120572, 16851715}, - {120573, 16851971}, {120574, 16852227}, {120575, 16852483}, {120576, 16852739}, - {120577, 16852995}, {120578, 16853251}, {120579, 16853507}, {120580, 16846851}, - {120581, 16853763}, {120582, 16854019}, {120583, 16786179}, {120584, 16854275}, - {120585, 16854531}, {120586, 16854787}, {120587, 16855043}, {120588, 16855299}, - {120589, 16855555}, {120591, 16855811}, {120592, 16856067}, {120593, 16856323}, - {120594, 16856579}, {120595, 16856835}, {120596, 16857091}, {120597, 17969667}, - {120598, 16852739}, {120599, 16853507}, {120600, 16853763}, {120601, 16856323}, - {120602, 16855299}, {120603, 16855043}, {120604, 16851715}, {120605, 16851971}, - {120606, 16852227}, {120607, 16852483}, {120608, 16852739}, {120609, 16852995}, - {120610, 16853251}, {120611, 16853507}, {120612, 16846851}, {120613, 16853763}, - {120614, 16854019}, {120615, 16786179}, {120616, 16854275}, {120617, 16854531}, - {120618, 16854787}, {120619, 16855043}, {120620, 16855299}, {120621, 16853507}, - {120622, 16855555}, {120623, 16855811}, {120624, 16856067}, {120625, 16856323}, - {120626, 16856579}, {120627, 16856835}, {120628, 16857091}, {120629, 17969411}, - {120630, 16851715}, {120631, 16851971}, {120632, 16852227}, {120633, 16852483}, - {120634, 16852739}, {120635, 16852995}, {120636, 16853251}, {120637, 16853507}, - {120638, 16846851}, {120639, 16853763}, {120640, 16854019}, {120641, 16786179}, - {120642, 16854275}, {120643, 16854531}, {120644, 16854787}, {120645, 16855043}, - {120646, 16855299}, {120647, 16855555}, {120649, 16855811}, {120650, 16856067}, - {120651, 16856323}, {120652, 16856579}, {120653, 16856835}, {120654, 16857091}, - {120655, 17969667}, {120656, 16852739}, {120657, 16853507}, {120658, 16853763}, - {120659, 16856323}, {120660, 16855299}, {120661, 16855043}, {120662, 16851715}, - {120663, 16851971}, {120664, 16852227}, {120665, 16852483}, {120666, 16852739}, - {120667, 16852995}, {120668, 16853251}, {120669, 16853507}, {120670, 16846851}, - {120671, 16853763}, {120672, 16854019}, {120673, 16786179}, {120674, 16854275}, - {120675, 16854531}, {120676, 16854787}, {120677, 16855043}, {120678, 16855299}, - {120679, 16853507}, {120680, 16855555}, {120681, 16855811}, {120682, 16856067}, - {120683, 16856323}, {120684, 16856579}, {120685, 16856835}, {120686, 16857091}, - {120687, 17969411}, {120688, 16851715}, {120689, 16851971}, {120690, 16852227}, - {120691, 16852483}, {120692, 16852739}, {120693, 16852995}, {120694, 16853251}, - {120695, 16853507}, {120696, 16846851}, {120697, 16853763}, {120698, 16854019}, - {120699, 16786179}, {120700, 16854275}, {120701, 16854531}, {120702, 16854787}, - {120703, 16855043}, {120704, 16855299}, {120705, 16855555}, {120707, 16855811}, - {120708, 16856067}, {120709, 16856323}, {120710, 16856579}, {120711, 16856835}, - {120712, 16857091}, {120713, 17969667}, {120714, 16852739}, {120715, 16853507}, - {120716, 16853763}, {120717, 16856323}, {120718, 16855299}, {120719, 16855043}, - {120720, 16851715}, {120721, 16851971}, {120722, 16852227}, {120723, 16852483}, - {120724, 16852739}, {120725, 16852995}, {120726, 16853251}, {120727, 16853507}, - {120728, 16846851}, {120729, 16853763}, {120730, 16854019}, {120731, 16786179}, - {120732, 16854275}, {120733, 16854531}, {120734, 16854787}, {120735, 16855043}, - {120736, 16855299}, {120737, 16853507}, {120738, 16855555}, {120739, 16855811}, - {120740, 16856067}, {120741, 16856323}, {120742, 16856579}, {120743, 16856835}, - {120744, 16857091}, {120745, 17969411}, {120746, 16851715}, {120747, 16851971}, - {120748, 16852227}, {120749, 16852483}, {120750, 16852739}, {120751, 16852995}, - {120752, 16853251}, {120753, 16853507}, {120754, 16846851}, {120755, 16853763}, - {120756, 16854019}, {120757, 16786179}, {120758, 16854275}, {120759, 16854531}, - {120760, 16854787}, {120761, 16855043}, {120762, 16855299}, {120763, 16855555}, - {120765, 16855811}, {120766, 16856067}, {120767, 16856323}, {120768, 16856579}, - {120769, 16856835}, {120770, 16857091}, {120771, 17969667}, {120772, 16852739}, - {120773, 16853507}, {120774, 16853763}, {120775, 16856323}, {120776, 16855299}, - {120777, 16855043}, {120778, 16858627}, {120780, 2}, {120782, 17045507}, - {120783, 16786947}, {120784, 16785155}, {120785, 16785411}, {120786, 16787715}, - {120787, 17045763}, {120788, 17046019}, {120789, 17046275}, {120790, 17046531}, - {120791, 17046787}, {120792, 17045507}, {120793, 16786947}, {120794, 16785155}, - {120795, 16785411}, {120796, 16787715}, {120797, 17045763}, {120798, 17046019}, - {120799, 17046275}, {120800, 17046531}, {120801, 17046787}, {120802, 17045507}, - {120803, 16786947}, {120804, 16785155}, {120805, 16785411}, {120806, 16787715}, - {120807, 17045763}, {120808, 17046019}, {120809, 17046275}, {120810, 17046531}, - {120811, 17046787}, {120812, 17045507}, {120813, 16786947}, {120814, 16785155}, - {120815, 16785411}, {120816, 16787715}, {120817, 17045763}, {120818, 17046019}, - {120819, 17046275}, {120820, 17046531}, {120821, 17046787}, {120822, 17045507}, - {120823, 16786947}, {120824, 16785155}, {120825, 16785411}, {120826, 16787715}, - {120827, 17045763}, {120828, 17046019}, {120829, 17046275}, {120830, 17046531}, - {120831, 17046787}, {120832, 1}, {121484, 2}, {121499, 1}, - {121504, 2}, {121505, 1}, {121520, 2}, {122624, 1}, - {122655, 2}, {122661, 1}, {122667, 2}, {122880, 1}, - {122887, 2}, {122888, 1}, {122905, 2}, {122907, 1}, - {122914, 2}, {122915, 1}, {122917, 2}, {122918, 1}, - {122923, 2}, {122928, 16866563}, {122929, 16866819}, {122930, 16867075}, - {122931, 16867331}, {122932, 16867587}, {122933, 16867843}, {122934, 16868099}, - {122935, 16868355}, {122936, 16868611}, {122937, 16869123}, {122938, 16869379}, - {122939, 16869635}, {122940, 16870147}, {122941, 16870403}, {122942, 16870659}, - {122943, 16870915}, {122944, 16871171}, {122945, 16871427}, {122946, 16871683}, - {122947, 16871939}, {122948, 16872195}, {122949, 16872451}, {122950, 16872707}, - {122951, 16873475}, {122952, 16873987}, {122953, 16874243}, {122954, 17505795}, - {122955, 16889091}, {122956, 16864003}, {122957, 16864515}, {122958, 16891139}, - {122959, 16883715}, {122960, 16886019}, {122961, 16866563}, {122962, 16866819}, - {122963, 16867075}, {122964, 16867331}, {122965, 16867587}, {122966, 16867843}, - {122967, 16868099}, {122968, 16868355}, {122969, 16868611}, {122970, 16869123}, - {122971, 16869379}, {122972, 16870147}, {122973, 16870403}, {122974, 16870915}, - {122975, 16871427}, {122976, 16871683}, {122977, 16871939}, {122978, 16872195}, - {122979, 16872451}, {122980, 16872707}, {122981, 16873219}, {122982, 16873475}, - {122983, 16879875}, {122984, 16864003}, {122985, 16863747}, {122986, 16866307}, - {122987, 16883203}, {122988, 17500931}, {122989, 16883971}, {122990, 2}, - {123023, 1}, {123024, 2}, {123136, 1}, {123181, 2}, - {123184, 1}, {123198, 2}, {123200, 1}, {123210, 2}, - {123214, 1}, {123216, 2}, {123536, 1}, {123567, 2}, - {123584, 1}, {123642, 2}, {123647, 1}, {123648, 2}, - {124112, 1}, {124154, 2}, {124368, 1}, {124411, 2}, - {124415, 1}, {124416, 2}, {124608, 1}, {124639, 2}, - {124640, 1}, {124662, 2}, {124670, 1}, {124672, 2}, - {124896, 1}, {124903, 2}, {124904, 1}, {124908, 2}, - {124909, 1}, {124911, 2}, {124912, 1}, {124927, 2}, - {124928, 1}, {125125, 2}, {125127, 1}, {125143, 2}, - {125184, 17969923}, {125185, 17970179}, {125186, 17970435}, {125187, 17970691}, - {125188, 17970947}, {125189, 17971203}, {125190, 17971459}, {125191, 17971715}, - {125192, 17971971}, {125193, 17972227}, {125194, 17972483}, {125195, 17972739}, - {125196, 17972995}, {125197, 17973251}, {125198, 17973507}, {125199, 17973763}, - {125200, 17974019}, {125201, 17974275}, {125202, 17974531}, {125203, 17974787}, - {125204, 17975043}, {125205, 17975299}, {125206, 17975555}, {125207, 17975811}, - {125208, 17976067}, {125209, 17976323}, {125210, 17976579}, {125211, 17976835}, - {125212, 17977091}, {125213, 17977347}, {125214, 17977603}, {125215, 17977859}, - {125216, 17978115}, {125217, 17978371}, {125218, 1}, {125260, 2}, - {125264, 1}, {125274, 2}, {125278, 1}, {125280, 2}, - {126065, 1}, {126133, 2}, {126209, 1}, {126270, 2}, - {126464, 16910595}, {126465, 17696003}, {126466, 17694211}, {126467, 17846787}, - {126468, 2}, {126469, 16911107}, {126470, 17743875}, {126471, 17694723}, - {126472, 17712387}, {126473, 16912131}, {126474, 17721091}, {126475, 17723395}, - {126476, 17695235}, {126477, 17730307}, {126478, 17707267}, {126479, 17713923}, - {126480, 17715971}, {126481, 17709315}, {126482, 17719043}, {126483, 17737475}, - {126484, 17757443}, {126485, 17699075}, {126486, 17702147}, {126487, 17697283}, - {126488, 17736963}, {126489, 17710339}, {126490, 17713411}, {126491, 17714947}, - {126492, 17978627}, {126493, 17685763}, {126494, 17978883}, {126495, 17979139}, - {126496, 2}, {126497, 17696003}, {126498, 17694211}, {126499, 2}, - {126500, 17733379}, {126501, 2}, {126503, 17694723}, {126504, 2}, - {126505, 16912131}, {126506, 17721091}, {126507, 17723395}, {126508, 17695235}, - {126509, 17730307}, {126510, 17707267}, {126511, 17713923}, {126512, 17715971}, - {126513, 17709315}, {126514, 17719043}, {126515, 2}, {126516, 17757443}, - {126517, 17699075}, {126518, 17702147}, {126519, 17697283}, {126520, 2}, - {126521, 17710339}, {126522, 2}, {126523, 17714947}, {126524, 2}, - {126530, 17694211}, {126531, 2}, {126535, 17694723}, {126536, 2}, - {126537, 16912131}, {126538, 2}, {126539, 17723395}, {126540, 2}, - {126541, 17730307}, {126542, 17707267}, {126543, 17713923}, {126544, 2}, - {126545, 17709315}, {126546, 17719043}, {126547, 2}, {126548, 17757443}, - {126549, 2}, {126551, 17697283}, {126552, 2}, {126553, 17710339}, - {126554, 2}, {126555, 17714947}, {126556, 2}, {126557, 17685763}, - {126558, 2}, {126559, 17979139}, {126560, 2}, {126561, 17696003}, - {126562, 17694211}, {126563, 2}, {126564, 17733379}, {126565, 2}, - {126567, 17694723}, {126568, 17712387}, {126569, 16912131}, {126570, 17721091}, - {126571, 2}, {126572, 17695235}, {126573, 17730307}, {126574, 17707267}, - {126575, 17713923}, {126576, 17715971}, {126577, 17709315}, {126578, 17719043}, - {126579, 2}, {126580, 17757443}, {126581, 17699075}, {126582, 17702147}, - {126583, 17697283}, {126584, 2}, {126585, 17710339}, {126586, 17713411}, - {126587, 17714947}, {126588, 17978627}, {126589, 2}, {126590, 17978883}, - {126591, 2}, {126592, 16910595}, {126593, 17696003}, {126594, 17694211}, - {126595, 17846787}, {126596, 17733379}, {126597, 16911107}, {126598, 17743875}, - {126599, 17694723}, {126600, 17712387}, {126601, 16912131}, {126602, 2}, - {126603, 17723395}, {126604, 17695235}, {126605, 17730307}, {126606, 17707267}, - {126607, 17713923}, {126608, 17715971}, {126609, 17709315}, {126610, 17719043}, - {126611, 17737475}, {126612, 17757443}, {126613, 17699075}, {126614, 17702147}, - {126615, 17697283}, {126616, 17736963}, {126617, 17710339}, {126618, 17713411}, - {126619, 17714947}, {126620, 2}, {126625, 17696003}, {126626, 17694211}, - {126627, 17846787}, {126628, 2}, {126629, 16911107}, {126630, 17743875}, - {126631, 17694723}, {126632, 17712387}, {126633, 16912131}, {126634, 2}, - {126635, 17723395}, {126636, 17695235}, {126637, 17730307}, {126638, 17707267}, - {126639, 17713923}, {126640, 17715971}, {126641, 17709315}, {126642, 17719043}, - {126643, 17737475}, {126644, 17757443}, {126645, 17699075}, {126646, 17702147}, - {126647, 17697283}, {126648, 17736963}, {126649, 17710339}, {126650, 17713411}, - {126651, 17714947}, {126652, 2}, {126704, 1}, {126706, 2}, - {126976, 1}, {127020, 2}, {127024, 1}, {127124, 2}, - {127136, 1}, {127151, 2}, {127153, 1}, {127168, 2}, - {127169, 1}, {127184, 2}, {127185, 1}, {127222, 2}, - {127233, 34756611}, {127234, 34757123}, {127235, 34757635}, {127236, 34758147}, - {127237, 34758659}, {127238, 34759171}, {127239, 34759683}, {127240, 34760195}, - {127241, 34760707}, {127242, 34761219}, {127243, 1}, {127248, 50655491}, - {127249, 50656259}, {127250, 50657027}, {127251, 50657795}, {127252, 50658563}, - {127253, 50659331}, {127254, 50660099}, {127255, 50660867}, {127256, 50661635}, - {127257, 50662403}, {127258, 50663171}, {127259, 50663939}, {127260, 50664707}, - {127261, 50665475}, {127262, 50666243}, {127263, 50667011}, {127264, 50667779}, - {127265, 50668547}, {127266, 50669315}, {127267, 50670083}, {127268, 50670851}, - {127269, 50671619}, {127270, 50672387}, {127271, 50673155}, {127272, 50673923}, - {127273, 50674691}, {127274, 51538947}, {127275, 16777731}, {127276, 16781571}, - {127277, 33554947}, {127278, 34762499}, {127279, 1}, {127280, 16777219}, - {127281, 16777475}, {127282, 16777731}, {127283, 16777987}, {127284, 16778243}, - {127285, 16778499}, {127286, 16778755}, {127287, 16779011}, {127288, 16779267}, - {127289, 16779523}, {127290, 16779779}, {127291, 16780035}, {127292, 16780291}, - {127293, 16780547}, {127294, 16780803}, {127295, 16781059}, {127296, 16781315}, - {127297, 16781571}, {127298, 16781827}, {127299, 16782083}, {127300, 16782339}, - {127301, 16782595}, {127302, 16782851}, {127303, 16783107}, {127304, 16783363}, - {127305, 16783619}, {127306, 34763011}, {127307, 34237187}, {127308, 34763523}, - {127309, 34764035}, {127310, 51541763}, {127311, 34765315}, {127312, 1}, - {127338, 34220035}, {127339, 34200067}, {127340, 34765827}, {127341, 1}, - {127376, 34766339}, {127377, 1}, {127406, 2}, {127462, 1}, - {127488, 34766851}, {127489, 34767363}, {127490, 17318403}, {127491, 2}, - {127504, 17168387}, {127505, 17990659}, {127506, 17990915}, {127507, 17362179}, - {127508, 17153795}, {127509, 17991171}, {127510, 17991427}, {127511, 17235971}, - {127512, 17991683}, {127513, 17991939}, {127514, 17992195}, {127515, 17596931}, - {127516, 17992451}, {127517, 17992707}, {127518, 17992963}, {127519, 17993219}, - {127520, 17993475}, {127521, 17993731}, {127522, 17177603}, {127523, 17993987}, - {127524, 17994243}, {127525, 17994499}, {127526, 17994755}, {127527, 17995011}, - {127528, 17995267}, {127529, 17152259}, {127530, 17233923}, {127531, 17995523}, - {127532, 17299203}, {127533, 17234691}, {127534, 17299459}, {127535, 17995779}, - {127536, 17191939}, {127537, 17996035}, {127538, 17996291}, {127539, 17996547}, - {127540, 17996803}, {127541, 17997059}, {127542, 17274883}, {127543, 17170947}, - {127544, 17997315}, {127545, 17997571}, {127546, 17997827}, {127547, 17998083}, - {127548, 2}, {127552, 51552771}, {127553, 51553539}, {127554, 51554307}, - {127555, 51555075}, {127556, 51555843}, {127557, 51556611}, {127558, 51557379}, - {127559, 51558147}, {127560, 51558915}, {127561, 2}, {127568, 18005251}, - {127569, 18005507}, {127570, 2}, {127584, 1}, {127590, 2}, - {127744, 1}, {128729, 2}, {128732, 1}, {128749, 2}, - {128752, 1}, {128765, 2}, {128768, 1}, {128986, 2}, - {128992, 1}, {129004, 2}, {129008, 1}, {129009, 2}, - {129024, 1}, {129036, 2}, {129040, 1}, {129096, 2}, - {129104, 1}, {129114, 2}, {129120, 1}, {129160, 2}, - {129168, 1}, {129198, 2}, {129200, 1}, {129212, 2}, - {129216, 1}, {129218, 2}, {129232, 1}, {129241, 2}, - {129280, 1}, {129624, 2}, {129632, 1}, {129646, 2}, - {129648, 1}, {129661, 2}, {129664, 1}, {129675, 2}, - {129678, 1}, {129735, 2}, {129736, 1}, {129737, 2}, - {129741, 1}, {129757, 2}, {129759, 1}, {129771, 2}, - {129775, 1}, {129785, 2}, {129792, 1}, {129939, 2}, - {129940, 1}, {130032, 17045507}, {130033, 16786947}, {130034, 16785155}, - {130035, 16785411}, {130036, 16787715}, {130037, 17045763}, {130038, 17046019}, - {130039, 17046275}, {130040, 17046531}, {130041, 17046787}, {130042, 1}, - {130043, 2}, {131072, 1}, {173792, 2}, {173824, 1}, - {178206, 2}, {178208, 1}, {183982, 2}, {183984, 1}, - {191457, 2}, {191472, 1}, {192094, 2}, {194560, 18005763}, - {194561, 18006019}, {194562, 18006275}, {194563, 18006531}, {194564, 18006787}, - {194565, 17620739}, {194566, 18007043}, {194567, 18007299}, {194568, 18007555}, - {194569, 18007811}, {194570, 17620995}, {194571, 18008067}, {194572, 18008323}, - {194573, 18008579}, {194574, 17621251}, {194575, 18008835}, {194576, 18009091}, - {194577, 18009347}, {194578, 18009603}, {194579, 18009859}, {194580, 18010115}, - {194581, 17992963}, {194582, 18010371}, {194583, 18010627}, {194584, 18010883}, - {194585, 18011139}, {194586, 18011395}, {194587, 17635331}, {194588, 18011651}, - {194589, 17156355}, {194590, 18011907}, {194591, 18012163}, {194592, 18012419}, - {194593, 18012675}, {194594, 17997571}, {194595, 18012931}, {194596, 18013187}, - {194597, 17636611}, {194598, 17621507}, {194599, 17621763}, {194600, 17636867}, - {194601, 18013443}, {194602, 18013699}, {194603, 17575171}, {194604, 18013955}, - {194605, 17622019}, {194606, 18014211}, {194607, 18014467}, {194608, 18014723}, - {194609, 18014979}, {194612, 18015235}, {194613, 18015491}, {194614, 18015747}, - {194615, 18016003}, {194616, 18016259}, {194617, 18016515}, {194618, 18016771}, - {194619, 18017027}, {194620, 18017283}, {194621, 18017539}, {194622, 18017795}, - {194623, 18018051}, {194624, 18018307}, {194625, 18018563}, {194626, 18018819}, - {194627, 18019075}, {194628, 18019331}, {194629, 18019587}, {194631, 17637379}, - {194632, 18019843}, {194633, 18020099}, {194634, 18020355}, {194635, 18020611}, - {194636, 17622531}, {194637, 18020867}, {194638, 18021123}, {194639, 18021379}, - {194640, 17612291}, {194641, 18021635}, {194642, 18021891}, {194643, 18022147}, - {194644, 18022403}, {194645, 18022659}, {194646, 18022915}, {194647, 18023171}, - {194648, 18023427}, {194649, 18023683}, {194650, 18023939}, {194651, 18024195}, - {194652, 18024451}, {194653, 17991171}, {194654, 18024707}, {194655, 18024963}, - {194656, 18025219}, {194657, 18025475}, {194658, 18025731}, {194659, 18025987}, - {194660, 18026243}, {194661, 18026499}, {194662, 18026755}, {194663, 18027011}, - {194664, 18027267}, {194665, 18027523}, {194666, 18027779}, {194668, 18028035}, - {194669, 18028291}, {194670, 18028547}, {194671, 17574147}, {194672, 18028803}, - {194673, 18029059}, {194674, 18029315}, {194675, 18029571}, {194676, 18029827}, - {194677, 17163011}, {194678, 18030083}, {194679, 18030339}, {194680, 17163523}, - {194681, 18030595}, {194682, 18030851}, {194683, 18031107}, {194684, 18031363}, - {194685, 18031619}, {194686, 18031875}, {194687, 18032131}, {194688, 18032387}, - {194689, 18032643}, {194690, 18032899}, {194691, 18033155}, {194692, 18033411}, - {194693, 18033667}, {194694, 18033923}, {194695, 18034179}, {194696, 18034435}, - {194697, 18034691}, {194698, 18034947}, {194699, 18035203}, {194700, 18035459}, - {194701, 18035715}, {194702, 17560835}, {194703, 18035971}, {194704, 17166083}, - {194705, 18036227}, {194707, 18036483}, {194708, 18036739}, {194710, 18036995}, - {194711, 18037251}, {194712, 18037507}, {194713, 18037763}, {194714, 18038019}, - {194715, 18038275}, {194716, 18038531}, {194717, 18038787}, {194718, 18039043}, - {194719, 18039299}, {194720, 18039555}, {194721, 18039811}, {194722, 18040067}, - {194723, 17623811}, {194724, 18040323}, {194725, 18040579}, {194726, 18040835}, - {194727, 18041091}, {194728, 17640451}, {194729, 18041091}, {194730, 18041347}, - {194731, 17624323}, {194732, 18041603}, {194733, 18041859}, {194734, 18042115}, - {194735, 18042371}, {194736, 17624579}, {194737, 17553923}, {194738, 17425411}, - {194739, 18042627}, {194740, 18042883}, {194741, 18043139}, {194742, 18043395}, - {194743, 18043651}, {194744, 18043907}, {194745, 18044163}, {194746, 18044419}, - {194747, 18044675}, {194748, 18044931}, {194749, 18045187}, {194750, 18045443}, - {194751, 18045699}, {194752, 18045955}, {194753, 18046211}, {194754, 18046467}, - {194755, 18046723}, {194756, 18046979}, {194757, 18047235}, {194758, 18047491}, - {194759, 18047747}, {194760, 17624835}, {194761, 18048003}, {194762, 18048259}, - {194763, 18048515}, {194764, 18048771}, {194765, 18049027}, {194766, 18049283}, - {194767, 17625347}, {194768, 18049539}, {194769, 18049795}, {194770, 18050051}, - {194771, 18050307}, {194772, 18050563}, {194773, 18050819}, {194774, 18051075}, - {194775, 18051331}, {194776, 17561091}, {194777, 17642499}, {194778, 18051587}, - {194779, 18051843}, {194780, 18052099}, {194781, 18052355}, {194782, 18052611}, - {194783, 18052867}, {194784, 18053123}, {194785, 18053379}, {194786, 17625603}, - {194787, 18053635}, {194788, 18053891}, {194789, 18054147}, {194790, 18054403}, - {194791, 17653251}, {194792, 18054659}, {194793, 18054915}, {194794, 18055171}, - {194795, 18055427}, {194796, 18055683}, {194797, 18055939}, {194798, 18056195}, - {194799, 18056451}, {194800, 18056707}, {194801, 18056963}, {194802, 18057219}, - {194803, 18057475}, {194804, 18057731}, {194805, 17578499}, {194806, 18057987}, - {194807, 18058243}, {194808, 18058499}, {194809, 18058755}, {194810, 18059011}, - {194811, 18059267}, {194812, 18059523}, {194813, 18059779}, {194814, 18060035}, - {194815, 18060291}, {194816, 18060547}, {194817, 17625859}, {194818, 17599491}, - {194819, 18060803}, {194820, 18061059}, {194821, 18061315}, {194822, 18061571}, - {194823, 18061827}, {194824, 18062083}, {194825, 18062339}, {194826, 18062595}, - {194827, 17643267}, {194828, 18062851}, {194829, 18063107}, {194830, 18063363}, - {194831, 18063619}, {194832, 18063875}, {194833, 18064131}, {194834, 18064387}, - {194835, 18064643}, {194836, 17643523}, {194837, 18064899}, {194838, 18065155}, - {194839, 18065411}, {194840, 18065667}, {194841, 18065923}, {194842, 18066179}, - {194843, 18066435}, {194844, 18066691}, {194845, 18066947}, {194846, 18067203}, - {194847, 18067459}, {194848, 18067715}, {194849, 17644035}, {194850, 18067971}, - {194851, 18068227}, {194852, 18068483}, {194853, 18068739}, {194854, 18068995}, - {194855, 18069251}, {194856, 18069507}, {194857, 18069763}, {194858, 18070019}, - {194859, 18070275}, {194860, 18070531}, {194862, 18070787}, {194863, 18071043}, - {194864, 17644547}, {194865, 18071299}, {194866, 18071555}, {194867, 18071811}, - {194868, 18072067}, {194869, 18072323}, {194870, 18072579}, {194871, 18072835}, - {194872, 17574915}, {194873, 18073091}, {194874, 18073347}, {194875, 18073603}, - {194876, 18073859}, {194877, 18074115}, {194878, 18074371}, {194879, 18074627}, - {194880, 17646083}, {194881, 18074883}, {194882, 18075139}, {194883, 18075395}, - {194884, 18075651}, {194885, 18075907}, {194886, 18076163}, {194888, 17646339}, - {194889, 17653763}, {194890, 18076419}, {194891, 18076675}, {194892, 18076931}, - {194893, 18077187}, {194894, 18077443}, {194895, 17565443}, {194896, 17646851}, - {194897, 18077699}, {194898, 18077955}, {194899, 17628419}, {194900, 18078211}, - {194901, 18078467}, {194902, 17617411}, {194903, 18078723}, {194904, 18078979}, - {194905, 17629187}, {194906, 18079235}, {194907, 18079491}, {194908, 18079747}, - {194909, 18080003}, {194911, 18080259}, {194912, 18080515}, {194913, 18080771}, - {194914, 18081027}, {194915, 18081283}, {194916, 18081539}, {194917, 18081795}, - {194918, 18082051}, {194919, 18082307}, {194920, 18082563}, {194921, 18082819}, - {194922, 18083075}, {194923, 18083331}, {194924, 18083587}, {194925, 18083843}, - {194926, 18084099}, {194927, 18084355}, {194928, 18084611}, {194929, 18084867}, - {194930, 18085123}, {194931, 18085379}, {194932, 18085635}, {194933, 18085891}, - {194934, 18086147}, {194935, 18086403}, {194936, 18086659}, {194937, 18086915}, - {194938, 17630723}, {194939, 18087171}, {194940, 18087427}, {194941, 18087683}, - {194942, 18087939}, {194943, 18088195}, {194944, 18088451}, {194945, 18088707}, - {194946, 18088963}, {194947, 18089219}, {194948, 18089475}, {194949, 18089731}, - {194950, 18089987}, {194951, 18090243}, {194952, 18090499}, {194953, 18090755}, - {194954, 18091011}, {194955, 18036483}, {194956, 18091267}, {194957, 18091523}, - {194958, 18091779}, {194959, 18092035}, {194960, 18092291}, {194961, 18092547}, - {194962, 18092803}, {194963, 18093059}, {194964, 18093315}, {194965, 18093571}, - {194966, 18093827}, {194967, 18094083}, {194968, 17579267}, {194969, 18094339}, - {194970, 18094595}, {194971, 18094851}, {194972, 18095107}, {194973, 18095363}, - {194974, 18095619}, {194975, 17631491}, {194976, 18095875}, {194977, 18096131}, - {194978, 18096387}, {194979, 18096643}, {194980, 18096899}, {194981, 18097155}, - {194982, 18097411}, {194983, 18097667}, {194984, 18097923}, {194985, 18098179}, - {194986, 18098435}, {194987, 18098691}, {194988, 18098947}, {194989, 18099203}, - {194990, 18099459}, {194991, 18099715}, {194992, 18099971}, {194993, 18100227}, - {194994, 18100483}, {194995, 18100739}, {194996, 17564163}, {194997, 18100995}, - {194998, 18101251}, {194999, 18101507}, {195000, 18101763}, {195001, 18102019}, - {195002, 18102275}, {195003, 17648643}, {195004, 18102531}, {195005, 18102787}, - {195006, 18103043}, {195007, 18103299}, {195008, 18103555}, {195009, 18103811}, - {195010, 18104067}, {195011, 18104323}, {195012, 17189123}, {195013, 18104579}, - {195014, 18104835}, {195015, 18105091}, {195016, 18105347}, {195017, 18105603}, - {195018, 18105859}, {195019, 18106115}, {195020, 18106371}, {195021, 18106627}, - {195022, 18106883}, {195023, 18107139}, {195024, 17649923}, {195025, 17650179}, - {195026, 17190915}, {195027, 18107395}, {195028, 18107651}, {195029, 18107907}, - {195030, 18108163}, {195031, 18108419}, {195032, 18108675}, {195033, 18108931}, - {195034, 18109187}, {195035, 18109443}, {195036, 18109699}, {195037, 18109955}, - {195038, 18110211}, {195039, 17650435}, {195040, 18110467}, {195041, 18110723}, - {195042, 18110979}, {195043, 18111235}, {195044, 18111491}, {195045, 18111747}, - {195046, 18112003}, {195047, 18112259}, {195048, 18112515}, {195049, 18112771}, - {195050, 18113027}, {195051, 18113283}, {195052, 18113539}, {195053, 18113795}, - {195054, 18114051}, {195055, 18114307}, {195056, 18114563}, {195057, 18114819}, - {195058, 18115075}, {195059, 18115331}, {195060, 18115587}, {195061, 18115843}, - {195062, 18116099}, {195063, 18116355}, {195064, 18116611}, {195065, 18116867}, - {195066, 18117123}, {195067, 18117379}, {195068, 18117635}, {195069, 18117891}, - {195070, 17651971}, {195072, 18118147}, {195073, 18118403}, {195074, 18118659}, - {195075, 18118915}, {195076, 18119171}, {195077, 18119427}, {195078, 18119683}, - {195079, 18119939}, {195080, 18120195}, {195081, 18120451}, {195082, 17652227}, - {195083, 18120707}, {195084, 18120963}, {195085, 18121219}, {195086, 18121475}, - {195087, 18121731}, {195088, 18121987}, {195089, 18122243}, {195090, 18122499}, - {195091, 18122755}, {195092, 18123011}, {195093, 17203203}, {195094, 18123267}, - {195095, 17204227}, {195096, 18123523}, {195097, 18123779}, {195098, 18124035}, - {195099, 18124291}, {195100, 17205507}, {195101, 18124547}, {195102, 2}, - {196608, 1}, {201547, 2}, {201552, 1}, {210042, 2}, - {917760, 0}, {918000, 2} -}; +// Sentinel values stored in stage2 / returned by lookup. +constexpr uint16_t IDNA_VALID = 0xFFFF; // code point is valid as-is +constexpr uint16_t IDNA_DISALLOWED = 0xFFFE; // code point is disallowed +constexpr uint16_t IDNA_IGNORED = 0x0000; // ignored (index into empty UTF-8 entry) + +// Bit 15 of a stage1 entry: set = boolean block, clear = mixed block. +constexpr uint16_t IDNA_BOOL_FLAG = 0x8000; + +// Two-level table covers code points [0, IDNA_LOW_RANGE_END). +// Derived from the highest non-disallowed code point below the high-ignored range, +// rounded up to the next 64-code-point block boundary. +constexpr uint32_t IDNA_LOW_RANGE_END = 0x00033480; + +// Variation selectors supplement: U+E0100..U+E01EF are all ignored. +// These are handled with a simple range check; everything else above +// IDNA_LOW_RANGE_END is disallowed. +constexpr uint32_t IDNA_HIGH_IGNORED_START = 0x000E0100; +constexpr uint32_t IDNA_HIGH_IGNORED_END = 0x000E01F0; // exclusive +// idna_stage1[cp >> 6]: one entry per 64-code-point block. +// Bit 15 set -> lower 15 bits = index into idna_bool_blocks[]. +// Bit 15 clear -> value = base offset into idna_stage2[] for this block. -} // namespace ada::idna -#endif // ADA_IDNA_TABLES_H +} // namespace ada::idna +#endif // ADA_IDNA_MAPPING_TABLE_H /* end file src/mapping_tables.cpp */ namespace ada::idna { -// This can be greatly accelerated. For now we just use a simply -// binary search. In practice, you should *not* do that. -uint32_t find_range_index(uint32_t key) { - //////////////// - // This could be implemented with std::lower_bound, but we roll our own - // because we want to allow further optimizations in the future. - //////////////// - uint32_t len = std::size(table); - uint32_t low = 0; - uint32_t high = len - 1; - while (low <= high) { - uint32_t middle_index = (low + high) >> 1; // cannot overflow - uint32_t middle_value = table[middle_index][0]; - if (middle_value < key) { - low = middle_index + 1; - } else if (middle_value > key) { - high = middle_index - 1; +// --- O(1) two-level table lookup --------------------------------------------- +// +// Returns one of: +// IDNA_VALID - keep code point in output unchanged +// IDNA_DISALLOWED - code point is not allowed (map() returns error) +// IDNA_IGNORED - code point is ignored (index 0 = empty UTF-8 entry) +// other - byte offset into idna_utf8_mappings[] (null-terminated) +// +// Assumes ensure_tables() has already been called by the public entry point. +static uint16_t idna_lookup(uint32_t cp) noexcept { + if (cp < IDNA_LOW_RANGE_END) { + uint16_t ref = idna_stage1[cp >> IDNA_BLOCK_BITS]; + if (ref & IDNA_BOOL_FLAG) { + uint32_t bit_idx = + static_cast(ref & ~IDNA_BOOL_FLAG) * IDNA_BLOCK_SIZE + + (cp & IDNA_BLOCK_MASK); + bool is_valid = (idna_bool_blocks[bit_idx >> 6] >> (bit_idx & 63u)) & 1u; + return is_valid ? IDNA_VALID : IDNA_DISALLOWED; + } + return idna_stage2[ref + (cp & IDNA_BLOCK_MASK)]; + } + + if (cp >= IDNA_HIGH_IGNORED_START && cp < IDNA_HIGH_IGNORED_END) { + return IDNA_IGNORED; + } + + return IDNA_DISALLOWED; +} + +// Advances *ptr past one well-formed UTF-8 code point from the mapping table. +static char32_t utf8_next(const uint8_t*& ptr) noexcept { + uint8_t b0 = *ptr++; + if (b0 < 0x80u) return static_cast(b0); + if (b0 < 0xE0u) { + uint32_t cp = (b0 & 0x1Fu) << 6; + cp |= (*ptr++ & 0x3Fu); + return static_cast(cp); + } + if (b0 < 0xF0u) { + uint32_t cp = (b0 & 0x0Fu) << 12; + cp |= ((*ptr++ & 0x3Fu) << 6); + cp |= (*ptr++ & 0x3Fu); + return static_cast(cp); + } + uint32_t cp = (b0 & 0x07u) << 18; + cp |= ((*ptr++ & 0x3Fu) << 12); + cp |= ((*ptr++ & 0x3Fu) << 6); + cp |= (*ptr++ & 0x3Fu); + return static_cast(cp); +} + +// Count UTF-8 code points in a null-terminated mapping string (trusted table). +static size_t utf8_count_codepoints(const uint8_t* ptr) noexcept { + size_t n = 0; + while (*ptr != 0) { + ++n; + if (*ptr < 0x80u) { + ++ptr; + } else if (*ptr < 0xE0u) { + ptr += 2; + } else if (*ptr < 0xF0u) { + ptr += 3; } else { - return middle_index; // perfect match + ptr += 4; } } - return low == 0 ? 0 : low - 1; + return n; } +// --- ASCII fast path --------------------------------------------------------- void ascii_map(char* input, size_t length) { auto broadcast = [](uint8_t v) -> uint64_t { return 0x101010101010101ull * v; @@ -2824,4966 +5141,115 @@ void ascii_map(char* input, size_t length) { for (; i + 7 < length; i += 8) { uint64_t word{}; - memcpy(&word, input + i, sizeof(word)); + std::memcpy(&word, input + i, sizeof(word)); word ^= (((word + broadcast_Ap) ^ (word + broadcast_Zp)) & broadcast_80) >> 2; - memcpy(input + i, &word, sizeof(word)); + std::memcpy(input + i, &word, sizeof(word)); } if (i < length) { uint64_t word{}; - memcpy(&word, input + i, length - i); + std::memcpy(&word, input + i, length - i); word ^= (((word + broadcast_Ap) ^ (word + broadcast_Zp)) & broadcast_80) >> 2; - memcpy(input + i, &word, length - i); + std::memcpy(input + i, &word, length - i); } } -// Map the characters according to IDNA, returning the empty string on error. -std::u32string map(std::u32string_view input) { +// Two-pass map: first validate + exact size, then write once (no growth +// realloc). +bool map(std::u32string_view input, std::u32string& out) { // [Map](https://www.unicode.org/reports/tr46/#ProcessingStepMap). - // For each code point in the domain_name string, look up the status - // value in Section 5, [IDNA Mapping - // Table](https://www.unicode.org/reports/tr46/#IDNA_Mapping_Table), - // and take the following actions: - // * disallowed: Leave the code point unchanged in the string, and - // record that there was an error. - // * ignored: Remove the code point from the string. This is - // equivalent to mapping the code point to an empty string. - // * mapped: Replace the code point in the string by the value for - // the mapping in Section 5, [IDNA Mapping - // Table](https://www.unicode.org/reports/tr46/#IDNA_Mapping_Table). - // * valid: Leave the code point unchanged in the string. - static std::u32string error = U""; - std::u32string answer; - answer.reserve(input.size()); + out.clear(); + if (!ensure_tables()) { + return false; + } + + // Pass 1: validate and compute exact output length. + size_t out_size = 0; for (char32_t x : input) { - size_t index = find_range_index(x); - uint32_t descriptor = table[index][1]; - uint8_t code = uint8_t(descriptor); - switch (code) { - case 0: - break; // nothing to do, ignored - case 1: - answer.push_back(x); // valid, we just copy it to output - break; - case 2: - return error; // disallowed - // case 3 : - default: - // We have a mapping - { - size_t char_count = (descriptor >> 24); - uint16_t char_index = uint16_t(descriptor >> 8); - for (size_t idx = char_index; idx < char_index + char_count; idx++) { - answer.push_back(mappings[idx]); - } - } + uint16_t status = idna_lookup(static_cast(x)); + if (status == IDNA_DISALLOWED) { + return false; + } + if (status == IDNA_VALID) { + ++out_size; + continue; } + if (static_cast(status) >= idna_utf8_mappings_size) { + return false; + } + out_size += utf8_count_codepoints(idna_utf8_mappings + status); + } + + // Pass 2: write into a single allocation. + out.resize(out_size); + size_t w = 0; + for (char32_t x : input) { + uint16_t status = idna_lookup(static_cast(x)); + if (status == IDNA_VALID) { + out[w++] = x; + continue; + } + // IGNORED or mapped (status already validated in pass 1). + const uint8_t* ptr = idna_utf8_mappings + status; + while (*ptr != 0) { + out[w++] = utf8_next(ptr); + } + } + return true; +} + +std::u32string map(std::u32string_view input) { + std::u32string answer; + if (!map(input, answer)) { + return {}; } return answer; } + } // namespace ada::idna /* end file src/mapping.cpp */ /* begin file src/normalization.cpp */ -/* begin file src/normalization_tables.cpp */ -// IDNA 17.0.0 +/* begin file include/ada/idna/normalization.h */ +#ifndef ADA_IDNA_NORMALIZATION_H +#define ADA_IDNA_NORMALIZATION_H +#include +#include + +namespace ada::idna { + +// Returns true if `input` is already in Unicode Normalization Form C. +// Requires that internal tables have been loaded (call ensure via normalize +// or map first, or this returns false if tables are unavailable). +[[nodiscard]] bool is_already_nfc(std::u32string_view input) noexcept; + +// Normalize the characters according to IDNA (Unicode Normalization Form C). +// Returns false if the internal Unicode tables could not be loaded; in that +// case `input` is left unchanged. Skips work when the string is already NFC. +[[nodiscard]] bool normalize(std::u32string& input); + +} // namespace ada::idna +#endif +/* end file include/ada/idna/normalization.h */ +/* begin file src/normalization_tables.cpp */ +// Normalization table helpers. +// Array payloads live in the DEFLATE blob (table_store.hpp). // clang-format off #ifndef ADA_IDNA_NORMALIZATION_TABLES_H #define ADA_IDNA_NORMALIZATION_TABLES_H -#include - -/** - * Unicode Standard Annex #15 - * - * UNICODE NORMALIZATION FORMS - * https://www.unicode.org/reports/tr15/ - * - * See https://github.com/uni-algo/uni-algo/blob/c612968c5ed3ace39bde4c894c24286c5f2c7fe2/include/uni_algo/impl/data/data_norm.h for reference. - */ namespace ada::idna { -const uint8_t decomposition_index[4352] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 16, 7, 17, 18, 19, 20, 21, 22, 23, 24, 7, - 7, 7, 7, 7, 25, 7, 26, 27, 28, 29, 30, 31, 32, 33, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 34, 35, 7, 7, 7, - 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 37, 38, 39, 40, 41, 42, 43, 7, 7, 7, 7, 7, 7, 7, 44, 7, 7, - 7, 7, 7, 7, 7, 7, 45, 46, 7, 47, 48, 49, 7, 7, 7, 50, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 51, 7, 52, 53, 54, 55, 56, 7, 7, 7, - 7, 7, 7, 7, 7, 57, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 58, - 59, 7, 60, 61, 62, 7, 7, 7, 7, 7, 7, 7, 7, 63, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 64, 65, 66, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7}; - -const uint16_t decomposition_block[67][257] = { - {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 8, 8, 8, 8, - 8, 8, 8, 9, 16, 17, 20, 20, 20, 20, 21, 28, 28, 29, 33, - 37, 45, 48, 48, 49, 57, 61, 64, 65, 77, 89, 100, 100, 108, 116, - 124, 132, 140, 148, 148, 156, 164, 172, 180, 188, 196, 204, 212, 220, 220, - 228, 236, 244, 252, 260, 268, 268, 268, 276, 284, 292, 300, 308, 308, 308, - 316, 324, 332, 340, 348, 356, 356, 364, 372, 380, 388, 396, 404, 412, 420, - 428, 428, 436, 444, 452, 460, 468, 476, 476, 476, 484, 492, 500, 508, 516, - 516, 524}, - {524, 532, 540, 548, 556, 564, 572, 580, 588, 596, 604, 612, - 620, 628, 636, 644, 652, 652, 652, 660, 668, 676, 684, 692, - 700, 708, 716, 724, 732, 740, 748, 756, 764, 772, 780, 788, - 796, 804, 812, 812, 812, 820, 828, 836, 844, 852, 860, 868, - 876, 884, 885, 893, 900, 908, 916, 924, 932, 932, 940, 948, - 956, 964, 972, 981, 989, 996, 996, 996, 1004, 1012, 1020, 1028, - 1036, 1045, 1052, 1052, 1052, 1060, 1068, 1076, 1084, 1092, 1100, 1100, - 1100, 1108, 1116, 1124, 1132, 1140, 1148, 1156, 1164, 1172, 1180, 1188, - 1196, 1204, 1212, 1220, 1228, 1236, 1244, 1244, 1244, 1252, 1260, 1268, - 1276, 1284, 1292, 1300, 1308, 1316, 1324, 1332, 1340, 1348, 1356, 1364, - 1372, 1380, 1388, 1396, 1404, 1412, 1420, 1429, 1432, 1432, 1432, 1432, - 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, - 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, - 1432, 1432, 1432, 1432, 1432, 1440, 1448, 1448, 1448, 1448, 1448, 1448, - 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1456, 1464, 1464, 1464, - 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - 1464, 1464, 1464, 1464, 1465, 1477, 1489, 1501, 1509, 1517, 1525, 1533, - 1541, 1548, 1556, 1564, 1572, 1580, 1588, 1596, 1604, 1612, 1624, 1636, - 1648, 1660, 1672, 1684, 1696, 1708, 1708, 1720, 1732, 1744, 1756, 1764, - 1772, 1772, 1772, 1780, 1788, 1796, 1804, 1812, 1820, 1832, 1844, 1852, - 1860, 1869, 1877, 1885, 1892, 1900, 1908, 1908, 1908, 1916, 1924, 1936, - 1948, 1956, 1964, 1972, 1980}, - {1980, 1988, 1996, 2004, 2012, 2020, 2028, 2036, 2044, 2052, 2060, 2068, - 2076, 2084, 2092, 2100, 2108, 2116, 2124, 2132, 2140, 2148, 2156, 2164, - 2172, 2180, 2188, 2196, 2204, 2204, 2204, 2212, 2220, 2220, 2220, 2220, - 2220, 2220, 2220, 2228, 2236, 2244, 2252, 2264, 2276, 2288, 2300, 2308, - 2316, 2328, 2340, 2348, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2357, 2361, 2365, 2369, - 2373, 2377, 2381, 2385, 2389, 2392, 2392, 2392, 2392, 2392, 2392, 2392, - 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, - 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, - 2393, 2401, 2409, 2417, 2425, 2433, 2440, 2440, 2441, 2445, 2449, 2453, - 2457, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, - 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, - 2460, 2460, 2460, 2460, 2460}, - {2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, - 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, - 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, - 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, - 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, - 2460, 2460, 2460, 2460, 2460, 2464, 2468, 2468, 2472, 2480, 2480, 2480, - 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, - 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, - 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, - 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2484, 2484, 2484, - 2484, 2484, 2485, 2492, 2492, 2492, 2492, 2496, 2496, 2496, 2496, 2496, - 2497, 2506, 2512, 2520, 2524, 2532, 2540, 2548, 2548, 2556, 2556, 2564, - 2572, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, - 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, - 2584, 2584, 2584, 2592, 2600, 2608, 2616, 2624, 2632, 2644, 2644, 2644, - 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, - 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2652, - 2660, 2668, 2676, 2684, 2685, 2689, 2693, 2698, 2706, 2713, 2717, 2720, - 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, - 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, - 2721, 2725, 2729, 2732, 2733, 2737, 2740, 2740, 2740, 2741, 2744, 2744, - 2744, 2744, 2744, 2744, 2744}, - {2744, 2752, 2760, 2760, 2768, 2768, 2768, 2768, 2776, 2776, 2776, 2776, - 2776, 2784, 2792, 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800, - 2800, 2800, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, - 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, - 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2816, 2816, - 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, - 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2824, 2832, 2832, - 2840, 2840, 2840, 2840, 2848, 2848, 2848, 2848, 2848, 2856, 2864, 2872, - 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, - 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2880, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2896, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, - 2904, 2904, 2904, 2904, 2904, 2912, 2920, 2928, 2936, 2936, 2936, 2944, - 2952, 2952, 2952, 2960, 2968, 2976, 2984, 2992, 3000, 3000, 3000, 3008, - 3016, 3024, 3032, 3040, 3048, 3048, 3048, 3056, 3064, 3072, 3080, 3088, - 3096, 3104, 3112, 3120, 3128, 3136, 3144, 3144, 3144, 3152, 3160, 3160, - 3160, 3160, 3160, 3160, 3160}, - {3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3161, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168}, - {3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3176, - 3184, 3192, 3200, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, - 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, - 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, - 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, - 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, - 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, - 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3209, 3217, 3225, - 3233, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, - 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, - 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, - 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, - 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, - 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, - 3240, 3248, 3248, 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256, - 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3264, 3264, 3264, 3264, - 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, - 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, - 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, - 3264, 3264, 3264, 3264, 3264}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, - 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, - 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, - 3264, 3264, 3264, 3264, 3264, 3264, 3272, 3272, 3272, 3272, 3272, 3272, - 3272, 3272, 3280, 3280, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3296, 3304, 3312, 3320, 3328, 3336, 3344, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3360, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, - 3368, 3368, 3368, 3368, 3368, 3376, 3384, 3384, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3392}, - {3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3400, 3400, 3400, 3408, 3408, 3408, 3408, 3408, - 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, - 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, - 3408, 3408, 3408, 3408, 3408, 3408, 3416, 3424, 3432, 3432, 3432, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440}, - {3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3448, 3448, 3448, 3456, 3464, 3464, 3464, 3464, 3464, 3464, 3464, - 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3472, 3480, 3480, - 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, - 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, - 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, - 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, - 3480, 3480, 3480, 3480, 3480, 3488, 3488, 3488, 3488, 3488, 3488, 3488, - 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, - 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, - 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, - 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3496, - 3504, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512}, - {3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3528, 3528, 3528, 3528, 3528, 3528, 3528, 3536, 3544, 3544, 3552, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564}, - {3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3572, 3580, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3596, 3596, 3604, 3616, 3624, 3624, 3624, 3624, 3624, - 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, - 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, - 3624, 3624, 3624, 3624, 3624}, - {3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, - 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, - 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, - 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, - 3624, 3624, 3624, 3625, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3633, - 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, - 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, - 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, - 3640, 3640, 3640, 3640, 3641, 3649, 3656, 3656, 3656, 3656, 3656, 3656, - 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, - 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, - 3656, 3656, 3656, 3656, 3656}, - {3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, - 3657, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3668, 3668, 3668, 3668, - 3668, 3668, 3668, 3668, 3668, 3668, 3676, 3676, 3676, 3676, 3676, 3684, - 3684, 3684, 3684, 3684, 3692, 3692, 3692, 3692, 3692, 3700, 3700, 3700, - 3700, 3700, 3700, 3700, 3700, 3700, 3700, 3700, 3700, 3700, 3708, 3708, - 3708, 3708, 3708, 3708, 3708, 3708, 3708, 3708, 3716, 3716, 3724, 3733, - 3744, 3753, 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3772, 3772, - 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, - 3772, 3772, 3772, 3772, 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, - 3780, 3780, 3788, 3788, 3788, 3788, 3788, 3796, 3796, 3796, 3796, 3796, - 3804, 3804, 3804, 3804, 3804, 3812, 3812, 3812, 3812, 3812, 3812, 3812, - 3812, 3812, 3812, 3812, 3812, 3812, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820}, - {3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3829, 3832, 3832, 3832, 3832}, - {3832, 3832, 3832, 3832, 3832, 3832, 3832, 3840, 3840, 3848, 3848, 3856, - 3856, 3864, 3864, 3872, 3872, 3872, 3872, 3880, 3880, 3880, 3880, 3880, - 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, - 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, - 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, - 3888, 3888, 3896, 3896, 3896, 3904, 3912, 3912, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920}, - {3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3921, 3925, 3929, 3932, - 3933, 3937, 3941, 3945, 3949, 3953, 3957, 3961, 3965, 3969, 3973, 3976, - 3977, 3981, 3985, 3989, 3993, 3997, 4001, 4005, 4009, 4013, 4017, 4021, - 4025, 4029, 4033, 4037, 4041, 4045, 4048, 4049, 4053, 4057, 4061, 4065, - 4069, 4073, 4077, 4081, 4085, 4089, 4093, 4097, 4101, 4105, 4109, 4113, - 4117, 4121, 4125, 4129, 4133, 4137, 4141, 4145, 4149, 4153, 4157, 4160, - 4160, 4160, 4160, 4160, 4160, 4160, 4160, 4160, 4160, 4160, 4160, 4160, - 4161, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, - 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, - 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4165, - 4169, 4173, 4177, 4181, 4185, 4189, 4193, 4197, 4201, 4205, 4209, 4213, - 4217, 4221, 4225, 4229, 4233, 4237, 4241, 4245, 4249, 4253, 4257, 4261, - 4265, 4269, 4273, 4277, 4281, 4285, 4289, 4293, 4297, 4301, 4305, 4309, - 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, - 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, - 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, - 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, - 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, - 4312, 4312, 4312, 4312, 4312}, - {4312, 4320, 4328, 4336, 4344, 4352, 4360, 4368, 4376, 4388, 4400, 4408, - 4416, 4424, 4432, 4440, 4448, 4456, 4464, 4472, 4480, 4492, 4504, 4516, - 4528, 4536, 4544, 4552, 4560, 4572, 4584, 4592, 4600, 4608, 4616, 4624, - 4632, 4640, 4648, 4656, 4664, 4672, 4680, 4688, 4696, 4704, 4712, 4724, - 4736, 4744, 4752, 4760, 4768, 4776, 4784, 4792, 4800, 4812, 4824, 4832, - 4840, 4848, 4856, 4864, 4872, 4880, 4888, 4896, 4904, 4912, 4920, 4928, - 4936, 4944, 4952, 4960, 4968, 4980, 4992, 5004, 5016, 5028, 5040, 5052, - 5064, 5072, 5080, 5088, 5096, 5104, 5112, 5120, 5128, 5140, 5152, 5160, - 5168, 5176, 5184, 5192, 5200, 5212, 5224, 5236, 5248, 5260, 5272, 5280, - 5288, 5296, 5304, 5312, 5320, 5328, 5336, 5344, 5352, 5360, 5368, 5376, - 5384, 5396, 5408, 5420, 5432, 5440, 5448, 5456, 5464, 5472, 5480, 5488, - 5496, 5504, 5512, 5520, 5528, 5536, 5544, 5552, 5560, 5568, 5576, 5584, - 5592, 5600, 5608, 5616, 5624, 5632, 5640, 5648, 5656, 5664, 5673, 5682, - 5688, 5688, 5688, 5688, 5688, 5696, 5704, 5712, 5720, 5732, 5744, 5756, - 5768, 5780, 5792, 5804, 5816, 5828, 5840, 5852, 5864, 5876, 5888, 5900, - 5912, 5924, 5936, 5948, 5960, 5968, 5976, 5984, 5992, 6000, 6008, 6020, - 6032, 6044, 6056, 6068, 6080, 6092, 6104, 6116, 6128, 6136, 6144, 6152, - 6160, 6168, 6176, 6184, 6192, 6204, 6216, 6228, 6240, 6252, 6264, 6276, - 6288, 6300, 6312, 6324, 6336, 6348, 6360, 6372, 6384, 6396, 6408, 6420, - 6432, 6440, 6448, 6456, 6464, 6476, 6488, 6500, 6512, 6524, 6536, 6548, - 6560, 6572, 6584, 6592, 6600, 6608, 6616, 6624, 6632, 6640, 6648, 6648, - 6648, 6648, 6648, 6648, 6648}, - {6648, 6656, 6664, 6676, 6688, 6700, 6712, 6724, 6736, 6744, 6752, 6764, - 6776, 6788, 6800, 6812, 6824, 6832, 6840, 6852, 6864, 6876, 6888, 6888, - 6888, 6896, 6904, 6916, 6928, 6940, 6952, 6952, 6952, 6960, 6968, 6980, - 6992, 7004, 7016, 7028, 7040, 7048, 7056, 7068, 7080, 7092, 7104, 7116, - 7128, 7136, 7144, 7156, 7168, 7180, 7192, 7204, 7216, 7224, 7232, 7244, - 7256, 7268, 7280, 7292, 7304, 7312, 7320, 7332, 7344, 7356, 7368, 7368, - 7368, 7376, 7384, 7396, 7408, 7420, 7432, 7432, 7432, 7440, 7448, 7460, - 7472, 7484, 7496, 7508, 7520, 7520, 7528, 7528, 7540, 7540, 7552, 7552, - 7564, 7572, 7580, 7592, 7604, 7616, 7628, 7640, 7652, 7660, 7668, 7680, - 7692, 7704, 7716, 7728, 7740, 7748, 7756, 7764, 7772, 7780, 7788, 7796, - 7804, 7812, 7820, 7828, 7836, 7844, 7852, 7852, 7852, 7864, 7876, 7892, - 7908, 7924, 7940, 7956, 7972, 7984, 7996, 8012, 8028, 8044, 8060, 8076, - 8092, 8104, 8116, 8132, 8148, 8164, 8180, 8196, 8212, 8224, 8236, 8252, - 8268, 8284, 8300, 8316, 8332, 8344, 8356, 8372, 8388, 8404, 8420, 8436, - 8452, 8464, 8476, 8492, 8508, 8524, 8540, 8556, 8572, 8580, 8588, 8600, - 8608, 8620, 8620, 8628, 8640, 8648, 8656, 8664, 8672, 8681, 8688, 8693, - 8701, 8710, 8716, 8728, 8736, 8748, 8748, 8756, 8768, 8776, 8784, 8792, - 8800, 8810, 8818, 8826, 8832, 8840, 8848, 8860, 8872, 8872, 8872, 8880, - 8892, 8900, 8908, 8916, 8924, 8926, 8934, 8942, 8948, 8956, 8964, 8976, - 8988, 8996, 9004, 9012, 9024, 9032, 9040, 9048, 9056, 9066, 9074, 9080, - 9084, 9084, 9084, 9096, 9104, 9116, 9116, 9124, 9136, 9144, 9152, 9160, - 9168, 9178, 9181, 9188, 9190}, - {9190, 9194, 9197, 9201, 9205, 9209, 9213, 9217, 9221, 9225, 9229, 9232, - 9232, 9232, 9232, 9232, 9232, 9233, 9236, 9236, 9236, 9236, 9236, 9237, - 9244, 9244, 9244, 9244, 9244, 9244, 9244, 9244, 9244, 9244, 9244, 9244, - 9245, 9249, 9257, 9268, 9268, 9268, 9268, 9268, 9268, 9268, 9268, 9269, - 9272, 9272, 9272, 9273, 9281, 9292, 9293, 9301, 9312, 9312, 9312, 9312, - 9313, 9320, 9321, 9328, 9328, 9328, 9328, 9328, 9328, 9328, 9328, 9329, - 9337, 9345, 9352, 9352, 9352, 9352, 9352, 9352, 9352, 9352, 9352, 9352, - 9352, 9352, 9352, 9353, 9368, 9368, 9368, 9368, 9368, 9368, 9368, 9369, - 9372, 9372, 9372, 9372, 9372, 9372, 9372, 9372, 9372, 9372, 9372, 9372, - 9372, 9372, 9372, 9372, 9373, 9377, 9380, 9380, 9381, 9385, 9389, 9393, - 9397, 9401, 9405, 9409, 9413, 9417, 9421, 9425, 9429, 9433, 9437, 9441, - 9445, 9449, 9453, 9457, 9461, 9465, 9469, 9473, 9477, 9481, 9485, 9488, - 9489, 9493, 9497, 9501, 9505, 9509, 9513, 9517, 9521, 9525, 9529, 9533, - 9537, 9540, 9540, 9540, 9540, 9540, 9540, 9540, 9540, 9540, 9540, 9540, - 9541, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, - 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, - 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, - 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, - 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, - 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, - 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, - 9548, 9548, 9548, 9548, 9549}, - {9549, 9561, 9573, 9577, 9584, 9585, 9597, 9609, 9612, 9613, - 9621, 9625, 9629, 9633, 9637, 9641, 9645, 9649, 9653, 9657, - 9660, 9661, 9665, 9672, 9672, 9673, 9677, 9681, 9685, 9689, - 9692, 9692, 9693, 9701, 9713, 9720, 9721, 9724, 9724, 9728, - 9729, 9732, 9732, 9736, 9745, 9749, 9752, 9753, 9757, 9761, - 9764, 9765, 9769, 9773, 9777, 9781, 9785, 9789, 9792, 9793, - 9805, 9809, 9813, 9817, 9821, 9824, 9824, 9824, 9824, 9825, - 9829, 9833, 9837, 9841, 9844, 9844, 9844, 9844, 9844, 9844, - 9845, 9857, 9869, 9885, 9897, 9909, 9921, 9933, 9945, 9957, - 9969, 9981, 9993, 10005, 10017, 10029, 10037, 10041, 10049, 10061, - 10069, 10073, 10081, 10093, 10109, 10117, 10121, 10129, 10141, 10145, - 10149, 10153, 10157, 10161, 10169, 10181, 10189, 10193, 10201, 10213, - 10229, 10237, 10241, 10249, 10261, 10265, 10269, 10273, 10276, 10276, - 10276, 10276, 10276, 10276, 10276, 10276, 10276, 10277, 10288, 10288, - 10288, 10288, 10288, 10288, 10288, 10288, 10288, 10288, 10288, 10288, - 10288, 10288, 10288, 10288, 10288, 10296, 10304, 10304, 10304, 10304, - 10304, 10304, 10304, 10304, 10304, 10304, 10304, 10304, 10304, 10304, - 10304, 10304, 10304, 10304, 10304, 10312, 10312, 10312, 10312, 10312, - 10312, 10312, 10312, 10312, 10312, 10312, 10312, 10312, 10312, 10312, - 10312, 10312, 10312, 10312, 10312, 10312, 10312, 10312, 10312, 10312, - 10312, 10312, 10312, 10312, 10312, 10312, 10320, 10328, 10336, 10336, - 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, - 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, - 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, - 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, - 10336, 10336, 10336, 10336, 10336, 10336, 10336}, - {10336, 10336, 10336, 10336, 10336, 10344, 10344, 10344, 10344, 10344, - 10352, 10352, 10352, 10360, 10360, 10360, 10360, 10360, 10360, 10360, - 10360, 10360, 10360, 10360, 10360, 10360, 10360, 10360, 10360, 10360, - 10360, 10360, 10360, 10360, 10360, 10360, 10360, 10368, 10368, 10376, - 10376, 10376, 10376, 10376, 10377, 10385, 10396, 10397, 10405, 10416, - 10416, 10416, 10416, 10416, 10416, 10416, 10416, 10416, 10416, 10416, - 10416, 10416, 10416, 10416, 10416, 10416, 10424, 10424, 10424, 10432, - 10432, 10432, 10440, 10440, 10448, 10448, 10448, 10448, 10448, 10448, - 10448, 10448, 10448, 10448, 10448, 10448, 10448, 10448, 10448, 10448, - 10448, 10448, 10448, 10448, 10448, 10448, 10448, 10456, 10456, 10464, - 10464, 10464, 10464, 10464, 10464, 10464, 10464, 10464, 10464, 10464, - 10472, 10480, 10488, 10496, 10504, 10504, 10504, 10512, 10520, 10520, - 10520, 10528, 10536, 10536, 10536, 10536, 10536, 10536, 10536, 10544, - 10552, 10552, 10552, 10560, 10568, 10568, 10568, 10576, 10584, 10584, - 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, - 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, - 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, - 10584, 10584, 10584, 10592, 10600, 10608, 10616, 10616, 10616, 10616, - 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, - 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, - 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, - 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, - 10616, 10616, 10616, 10616, 10616, 10624, 10632, 10640, 10648, 10648, - 10648, 10648, 10648, 10648, 10648, 10656, 10664, 10672, 10680, 10680, - 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, - 10680, 10680, 10680, 10680, 10680, 10680, 10680}, - {10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, - 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, - 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, - 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, - 10680, 10680, 10684, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688}, - {10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10689, 10693, 10697, 10701, - 10705, 10709, 10713, 10717, 10721, 10725, 10733, 10741, 10749, 10757, - 10765, 10773, 10781, 10789, 10797, 10805, 10813, 10825, 10837, 10849, - 10861, 10873, 10885, 10897, 10909, 10921, 10937, 10953, 10969, 10985, - 11001, 11017, 11033, 11049, 11065, 11081, 11097, 11105, 11113, 11121, - 11129, 11137, 11145, 11153, 11161, 11169, 11181, 11193, 11205, 11217, - 11229, 11241, 11253, 11265, 11277, 11289, 11301, 11313, 11325, 11337, - 11349, 11361, 11373, 11385, 11397, 11409, 11421, 11433, 11445, 11457, - 11469, 11481, 11493, 11505, 11517, 11529, 11541, 11553, 11565, 11577, - 11589, 11601, 11613, 11617, 11621, 11625, 11629, 11633, 11637, 11641, - 11645, 11649, 11653, 11657, 11661, 11665, 11669, 11673, 11677, 11681, - 11685, 11689, 11693, 11697, 11701, 11705, 11709, 11713, 11717, 11721, - 11725, 11729, 11733, 11737, 11741, 11745, 11749, 11753, 11757, 11761, - 11765, 11769, 11773, 11777, 11781, 11785, 11789, 11793, 11797, 11801, - 11805, 11809, 11813, 11817, 11821, 11824, 11824, 11824, 11824, 11824, - 11824, 11824, 11824, 11824, 11824, 11824, 11824, 11824, 11824, 11824, - 11824, 11824, 11824, 11824, 11824, 11824, 11824}, - {11824, 11824, 11824, 11824, 11824, 11824, 11824, 11824, 11824, 11824, - 11824, 11824, 11825, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11841, 11853, 11861, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880}, - {11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11881, 11885, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888}, - {11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11889, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892}, - {11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11893, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11897, 11900, 11900, 11900, 11900, 11900, 11900, - 11900, 11900, 11900, 11900, 11900, 11900, 11901}, - {11901, 11905, 11909, 11913, 11917, 11921, 11925, 11929, 11933, 11937, - 11941, 11945, 11949, 11953, 11957, 11961, 11965, 11969, 11973, 11977, - 11981, 11985, 11989, 11993, 11997, 12001, 12005, 12009, 12013, 12017, - 12021, 12025, 12029, 12033, 12037, 12041, 12045, 12049, 12053, 12057, - 12061, 12065, 12069, 12073, 12077, 12081, 12085, 12089, 12093, 12097, - 12101, 12105, 12109, 12113, 12117, 12121, 12125, 12129, 12133, 12137, - 12141, 12145, 12149, 12153, 12157, 12161, 12165, 12169, 12173, 12177, - 12181, 12185, 12189, 12193, 12197, 12201, 12205, 12209, 12213, 12217, - 12221, 12225, 12229, 12233, 12237, 12241, 12245, 12249, 12253, 12257, - 12261, 12265, 12269, 12273, 12277, 12281, 12285, 12289, 12293, 12297, - 12301, 12305, 12309, 12313, 12317, 12321, 12325, 12329, 12333, 12337, - 12341, 12345, 12349, 12353, 12357, 12361, 12365, 12369, 12373, 12377, - 12381, 12385, 12389, 12393, 12397, 12401, 12405, 12409, 12413, 12417, - 12421, 12425, 12429, 12433, 12437, 12441, 12445, 12449, 12453, 12457, - 12461, 12465, 12469, 12473, 12477, 12481, 12485, 12489, 12493, 12497, - 12501, 12505, 12509, 12513, 12517, 12521, 12525, 12529, 12533, 12537, - 12541, 12545, 12549, 12553, 12557, 12561, 12565, 12569, 12573, 12577, - 12581, 12585, 12589, 12593, 12597, 12601, 12605, 12609, 12613, 12617, - 12621, 12625, 12629, 12633, 12637, 12641, 12645, 12649, 12653, 12657, - 12661, 12665, 12669, 12673, 12677, 12681, 12685, 12689, 12693, 12697, - 12701, 12705, 12709, 12713, 12717, 12721, 12725, 12729, 12733, 12737, - 12741, 12745, 12749, 12753, 12756, 12756, 12756, 12756, 12756, 12756, - 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, - 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, - 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, - 12756, 12756, 12756, 12756, 12756, 12756, 12757}, - {12757, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, - 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, - 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, - 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, - 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, - 12760, 12760, 12760, 12760, 12761, 12764, 12765, 12769, 12773, 12776, - 12776, 12776, 12776, 12776, 12776, 12776, 12776, 12776, 12776, 12776, - 12776, 12776, 12776, 12776, 12776, 12776, 12776, 12784, 12784, 12792, - 12792, 12800, 12800, 12808, 12808, 12816, 12816, 12824, 12824, 12832, - 12832, 12840, 12840, 12848, 12848, 12856, 12856, 12864, 12864, 12872, - 12872, 12872, 12880, 12880, 12888, 12888, 12896, 12896, 12896, 12896, - 12896, 12896, 12896, 12904, 12912, 12912, 12920, 12928, 12928, 12936, - 12944, 12944, 12952, 12960, 12960, 12968, 12976, 12976, 12976, 12976, - 12976, 12976, 12976, 12976, 12976, 12976, 12976, 12976, 12976, 12976, - 12976, 12976, 12976, 12976, 12976, 12976, 12976, 12976, 12976, 12984, - 12984, 12984, 12984, 12984, 12984, 12985, 12993, 13000, 13000, 13009, - 13016, 13016, 13016, 13016, 13016, 13016, 13016, 13016, 13016, 13016, - 13016, 13016, 13016, 13024, 13024, 13032, 13032, 13040, 13040, 13048, - 13048, 13056, 13056, 13064, 13064, 13072, 13072, 13080, 13080, 13088, - 13088, 13096, 13096, 13104, 13104, 13112, 13112, 13112, 13120, 13120, - 13128, 13128, 13136, 13136, 13136, 13136, 13136, 13136, 13136, 13144, - 13152, 13152, 13160, 13168, 13168, 13176, 13184, 13184, 13192, 13200, - 13200, 13208, 13216, 13216, 13216, 13216, 13216, 13216, 13216, 13216, - 13216, 13216, 13216, 13216, 13216, 13216, 13216, 13216, 13216, 13216, - 13216, 13216, 13216, 13216, 13216, 13224, 13224, 13224, 13232, 13240, - 13248, 13256, 13256, 13256, 13256, 13265, 13272}, - {13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, - 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, - 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, - 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, - 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13273, - 13277, 13281, 13285, 13289, 13293, 13297, 13301, 13305, 13309, 13313, - 13317, 13321, 13325, 13329, 13333, 13337, 13341, 13345, 13349, 13353, - 13357, 13361, 13365, 13369, 13373, 13377, 13381, 13385, 13389, 13393, - 13397, 13401, 13405, 13409, 13413, 13417, 13421, 13425, 13429, 13433, - 13437, 13441, 13445, 13449, 13453, 13457, 13461, 13465, 13469, 13473, - 13477, 13481, 13485, 13489, 13493, 13497, 13501, 13505, 13509, 13513, - 13517, 13521, 13525, 13529, 13533, 13537, 13541, 13545, 13549, 13553, - 13557, 13561, 13565, 13569, 13573, 13577, 13581, 13585, 13589, 13593, - 13597, 13601, 13605, 13609, 13613, 13617, 13621, 13625, 13629, 13633, - 13637, 13641, 13645, 13648, 13648, 13648, 13649, 13653, 13657, 13661, - 13665, 13669, 13673, 13677, 13681, 13685, 13689, 13693, 13697, 13701, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13705}, - {13705, 13717, 13729, 13741, 13753, 13765, 13777, 13789, 13801, 13813, - 13825, 13837, 13849, 13861, 13873, 13889, 13905, 13921, 13937, 13953, - 13969, 13985, 14001, 14017, 14033, 14049, 14065, 14081, 14097, 14113, - 14141, 14164, 14165, 14177, 14189, 14201, 14213, 14225, 14237, 14249, - 14261, 14273, 14285, 14297, 14309, 14321, 14333, 14345, 14357, 14369, - 14381, 14393, 14405, 14417, 14429, 14441, 14453, 14465, 14477, 14489, - 14501, 14513, 14525, 14537, 14549, 14561, 14573, 14585, 14597, 14601, - 14605, 14609, 14612, 14612, 14612, 14612, 14612, 14612, 14612, 14612, - 14613, 14625, 14633, 14641, 14649, 14657, 14665, 14673, 14681, 14689, - 14697, 14705, 14713, 14721, 14729, 14737, 14745, 14749, 14753, 14757, - 14761, 14765, 14769, 14773, 14777, 14781, 14785, 14789, 14793, 14797, - 14801, 14809, 14817, 14825, 14833, 14841, 14849, 14857, 14865, 14873, - 14881, 14889, 14897, 14905, 14913, 14933, 14949, 14956, 14957, 14961, - 14965, 14969, 14973, 14977, 14981, 14985, 14989, 14993, 14997, 15001, - 15005, 15009, 15013, 15017, 15021, 15025, 15029, 15033, 15037, 15041, - 15045, 15049, 15053, 15057, 15061, 15065, 15069, 15073, 15077, 15081, - 15085, 15089, 15093, 15097, 15101, 15105, 15109, 15113, 15117, 15121, - 15125, 15129, 15133, 15137, 15141, 15145, 15149, 15153, 15161, 15169, - 15177, 15185, 15193, 15201, 15209, 15217, 15225, 15233, 15241, 15249, - 15257, 15265, 15273, 15281, 15289, 15297, 15305, 15313, 15321, 15329, - 15337, 15345, 15357, 15369, 15381, 15389, 15401, 15409, 15421, 15425, - 15429, 15433, 15437, 15441, 15445, 15449, 15453, 15457, 15461, 15465, - 15469, 15473, 15477, 15481, 15485, 15489, 15493, 15497, 15501, 15505, - 15509, 15513, 15517, 15521, 15525, 15529, 15533, 15537, 15541, 15545, - 15549, 15553, 15557, 15561, 15565, 15569, 15573, 15577, 15581, 15585, - 15589, 15593, 15597, 15601, 15605, 15609, 15617}, - {15617, 15637, 15653, 15673, 15685, 15705, 15717, 15729, 15753, 15769, - 15781, 15793, 15805, 15821, 15837, 15853, 15869, 15885, 15901, 15917, - 15941, 15949, 15973, 15997, 16017, 16033, 16057, 16081, 16097, 16109, - 16121, 16137, 16153, 16173, 16193, 16205, 16217, 16233, 16245, 16257, - 16265, 16273, 16285, 16297, 16321, 16337, 16357, 16381, 16397, 16409, - 16421, 16445, 16461, 16485, 16497, 16517, 16529, 16545, 16557, 16573, - 16593, 16609, 16629, 16645, 16653, 16673, 16685, 16697, 16713, 16725, - 16737, 16749, 16769, 16785, 16793, 16817, 16829, 16849, 16865, 16881, - 16893, 16905, 16921, 16929, 16945, 16965, 16973, 16997, 17009, 17017, - 17025, 17033, 17041, 17049, 17057, 17065, 17073, 17081, 17089, 17101, - 17113, 17125, 17137, 17149, 17161, 17173, 17185, 17197, 17209, 17221, - 17233, 17245, 17257, 17269, 17281, 17289, 17297, 17309, 17317, 17325, - 17333, 17345, 17357, 17365, 17373, 17381, 17389, 17397, 17413, 17421, - 17429, 17437, 17445, 17453, 17461, 17469, 17477, 17489, 17505, 17513, - 17521, 17529, 17537, 17545, 17553, 17561, 17573, 17585, 17597, 17609, - 17617, 17625, 17633, 17641, 17649, 17657, 17665, 17673, 17681, 17689, - 17701, 17713, 17721, 17733, 17745, 17757, 17765, 17777, 17789, 17805, - 17813, 17825, 17837, 17849, 17861, 17881, 17905, 17913, 17921, 17929, - 17937, 17945, 17953, 17961, 17969, 17977, 17985, 17993, 18001, 18009, - 18017, 18025, 18033, 18041, 18049, 18065, 18073, 18081, 18089, 18105, - 18117, 18125, 18133, 18141, 18149, 18157, 18165, 18173, 18181, 18189, - 18197, 18209, 18217, 18225, 18237, 18249, 18257, 18273, 18285, 18293, - 18301, 18309, 18317, 18329, 18341, 18349, 18357, 18365, 18373, 18381, - 18389, 18397, 18405, 18413, 18425, 18437, 18449, 18461, 18473, 18485, - 18497, 18509, 18521, 18533, 18545, 18557, 18569, 18581, 18593, 18605, - 18617, 18629, 18641, 18653, 18665, 18677, 18688}, - {18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18689, 18693, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696}, - {18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18697, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18701, 18705, 18709, 18712, 18712, 18712, 18713, 18717, - 18720, 18720, 18720, 18720, 18720, 18720, 18720}, - {18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18721, 18725, 18729, 18733, 18736, 18736, 18736, 18736, - 18736, 18736, 18736, 18736, 18736, 18737, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740}, - {18740, 18744, 18748, 18752, 18756, 18760, 18764, 18768, 18772, 18776, - 18780, 18784, 18788, 18792, 18796, 18800, 18804, 18808, 18812, 18816, - 18820, 18824, 18828, 18832, 18836, 18840, 18844, 18848, 18852, 18856, - 18860, 18864, 18868, 18872, 18876, 18880, 18884, 18888, 18892, 18896, - 18900, 18904, 18908, 18912, 18916, 18920, 18924, 18928, 18932, 18936, - 18940, 18944, 18948, 18952, 18956, 18960, 18964, 18968, 18972, 18976, - 18980, 18984, 18988, 18992, 18996, 19000, 19004, 19008, 19012, 19016, - 19020, 19024, 19028, 19032, 19036, 19040, 19044, 19048, 19052, 19056, - 19060, 19064, 19068, 19072, 19076, 19080, 19084, 19088, 19092, 19096, - 19100, 19104, 19108, 19112, 19116, 19120, 19124, 19128, 19132, 19136, - 19140, 19144, 19148, 19152, 19156, 19160, 19164, 19168, 19172, 19176, - 19180, 19184, 19188, 19192, 19196, 19200, 19204, 19208, 19212, 19216, - 19220, 19224, 19228, 19232, 19236, 19240, 19244, 19248, 19252, 19256, - 19260, 19264, 19268, 19272, 19276, 19280, 19284, 19288, 19292, 19296, - 19300, 19304, 19308, 19312, 19316, 19320, 19324, 19328, 19332, 19336, - 19340, 19344, 19348, 19352, 19356, 19360, 19364, 19368, 19372, 19376, - 19380, 19384, 19388, 19392, 19396, 19400, 19404, 19408, 19412, 19416, - 19420, 19424, 19428, 19432, 19436, 19440, 19444, 19448, 19452, 19456, - 19460, 19464, 19468, 19472, 19476, 19480, 19484, 19488, 19492, 19496, - 19500, 19504, 19508, 19512, 19516, 19520, 19524, 19528, 19532, 19536, - 19540, 19544, 19548, 19552, 19556, 19560, 19564, 19568, 19572, 19576, - 19580, 19584, 19588, 19592, 19596, 19600, 19604, 19608, 19612, 19616, - 19620, 19624, 19628, 19632, 19636, 19640, 19644, 19648, 19652, 19656, - 19660, 19664, 19668, 19672, 19676, 19680, 19684, 19688, 19692, 19696, - 19700, 19704, 19708, 19712, 19716, 19720, 19724, 19728, 19732, 19736, - 19740, 19744, 19748, 19752, 19756, 19760, 19764}, - {19764, 19768, 19772, 19776, 19780, 19784, 19788, 19792, 19796, 19800, - 19804, 19808, 19812, 19816, 19820, 19820, 19820, 19824, 19824, 19828, - 19828, 19828, 19832, 19836, 19840, 19844, 19848, 19852, 19856, 19860, - 19864, 19868, 19868, 19872, 19872, 19876, 19876, 19876, 19880, 19884, - 19884, 19884, 19884, 19888, 19892, 19896, 19900, 19904, 19908, 19912, - 19916, 19920, 19924, 19928, 19932, 19936, 19940, 19944, 19948, 19952, - 19956, 19960, 19964, 19968, 19972, 19976, 19980, 19984, 19988, 19992, - 19996, 20000, 20004, 20008, 20012, 20016, 20020, 20024, 20028, 20032, - 20036, 20040, 20044, 20048, 20052, 20056, 20060, 20064, 20068, 20072, - 20076, 20080, 20084, 20088, 20092, 20096, 20100, 20104, 20108, 20112, - 20116, 20120, 20124, 20128, 20132, 20136, 20140, 20144, 20148, 20152, - 20156, 20156, 20156, 20160, 20164, 20168, 20172, 20176, 20180, 20184, - 20188, 20192, 20196, 20200, 20204, 20208, 20212, 20216, 20220, 20224, - 20228, 20232, 20236, 20240, 20244, 20248, 20252, 20256, 20260, 20264, - 20268, 20272, 20276, 20280, 20284, 20288, 20292, 20296, 20300, 20304, - 20308, 20312, 20316, 20320, 20324, 20328, 20332, 20336, 20340, 20344, - 20348, 20352, 20356, 20360, 20364, 20368, 20372, 20376, 20380, 20384, - 20388, 20392, 20396, 20400, 20404, 20408, 20412, 20416, 20420, 20424, - 20428, 20432, 20436, 20440, 20444, 20448, 20452, 20456, 20460, 20464, - 20468, 20472, 20476, 20480, 20484, 20488, 20492, 20496, 20500, 20504, - 20508, 20512, 20516, 20520, 20524, 20528, 20532, 20536, 20540, 20544, - 20548, 20552, 20556, 20560, 20564, 20568, 20572, 20576, 20580, 20580, - 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, - 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, - 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, - 20580, 20580, 20580, 20580, 20580, 20580, 20581}, - {20581, 20589, 20597, 20605, 20617, 20629, 20637, 20644, 20644, 20644, - 20644, 20644, 20644, 20644, 20644, 20644, 20644, 20644, 20644, 20645, - 20653, 20661, 20669, 20677, 20684, 20684, 20684, 20684, 20684, 20684, - 20692, 20692, 20701, 20705, 20709, 20713, 20717, 20721, 20725, 20729, - 20733, 20737, 20740, 20748, 20756, 20768, 20780, 20788, 20796, 20804, - 20812, 20820, 20828, 20836, 20844, 20852, 20852, 20860, 20868, 20876, - 20884, 20892, 20892, 20900, 20900, 20908, 20916, 20916, 20924, 20932, - 20932, 20940, 20948, 20956, 20964, 20972, 20980, 20988, 20996, 21005, - 21013, 21017, 21021, 21025, 21029, 21033, 21037, 21041, 21045, 21049, - 21053, 21057, 21061, 21065, 21069, 21073, 21077, 21081, 21085, 21089, - 21093, 21097, 21101, 21105, 21109, 21113, 21117, 21121, 21125, 21129, - 21133, 21137, 21141, 21145, 21149, 21153, 21157, 21161, 21165, 21169, - 21173, 21177, 21181, 21185, 21189, 21193, 21197, 21201, 21205, 21209, - 21213, 21217, 21221, 21225, 21229, 21233, 21237, 21241, 21245, 21249, - 21253, 21257, 21261, 21265, 21269, 21273, 21277, 21281, 21285, 21289, - 21293, 21297, 21301, 21305, 21309, 21313, 21317, 21321, 21325, 21329, - 21333, 21337, 21341, 21345, 21349, 21357, 21365, 21369, 21373, 21377, - 21381, 21385, 21389, 21393, 21397, 21401, 21405, 21413, 21420, 21420, - 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, - 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, - 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, - 21420, 21421, 21425, 21429, 21433, 21437, 21441, 21445, 21449, 21453, - 21457, 21461, 21469, 21473, 21477, 21481, 21485, 21489, 21493, 21497, - 21501, 21505, 21509, 21513, 21517, 21529, 21541, 21553, 21565, 21577, - 21589, 21601, 21613, 21625, 21637, 21649, 21661, 21673, 21685, 21697, - 21709, 21721, 21733, 21737, 21741, 21745, 21749}, - {21749, 21761, 21773, 21785, 21797, 21809, 21817, 21825, 21833, 21841, - 21849, 21857, 21865, 21873, 21881, 21889, 21897, 21905, 21913, 21921, - 21929, 21937, 21945, 21953, 21961, 21969, 21977, 21985, 21993, 22001, - 22009, 22017, 22025, 22033, 22041, 22049, 22057, 22065, 22073, 22081, - 22089, 22097, 22105, 22113, 22121, 22129, 22137, 22145, 22153, 22161, - 22169, 22177, 22185, 22193, 22201, 22209, 22217, 22225, 22233, 22241, - 22249, 22257, 22265, 22273, 22281, 22289, 22297, 22305, 22313, 22321, - 22329, 22337, 22345, 22353, 22361, 22369, 22377, 22385, 22393, 22401, - 22409, 22417, 22425, 22433, 22441, 22449, 22457, 22465, 22473, 22481, - 22489, 22497, 22505, 22513, 22521, 22533, 22545, 22557, 22569, 22581, - 22593, 22605, 22617, 22629, 22641, 22653, 22665, 22673, 22681, 22689, - 22697, 22705, 22713, 22721, 22729, 22737, 22745, 22753, 22761, 22769, - 22777, 22785, 22793, 22801, 22809, 22817, 22825, 22833, 22841, 22849, - 22857, 22865, 22873, 22881, 22889, 22897, 22905, 22913, 22921, 22929, - 22937, 22945, 22953, 22961, 22969, 22977, 22985, 22993, 23001, 23009, - 23017, 23025, 23037, 23049, 23061, 23073, 23085, 23093, 23101, 23109, - 23117, 23125, 23133, 23141, 23149, 23157, 23165, 23173, 23181, 23189, - 23197, 23205, 23213, 23221, 23229, 23237, 23245, 23253, 23261, 23269, - 23277, 23285, 23293, 23301, 23309, 23317, 23325, 23333, 23341, 23349, - 23357, 23365, 23373, 23381, 23389, 23397, 23405, 23413, 23421, 23429, - 23437, 23445, 23453, 23461, 23469, 23477, 23485, 23493, 23501, 23509, - 23517, 23525, 23533, 23541, 23549, 23557, 23565, 23573, 23581, 23589, - 23597, 23605, 23613, 23621, 23633, 23645, 23653, 23661, 23669, 23677, - 23685, 23693, 23701, 23709, 23717, 23725, 23733, 23741, 23749, 23757, - 23765, 23773, 23781, 23793, 23805, 23817, 23825, 23833, 23841, 23849, - 23857, 23865, 23873, 23881, 23889, 23897, 23905}, - {23905, 23913, 23921, 23929, 23937, 23945, 23953, 23961, 23969, 23977, - 23985, 23993, 24001, 24009, 24017, 24025, 24033, 24041, 24049, 24057, - 24065, 24073, 24081, 24089, 24097, 24105, 24113, 24121, 24129, 24137, - 24145, 24153, 24161, 24169, 24177, 24185, 24193, 24201, 24209, 24217, - 24225, 24233, 24241, 24249, 24257, 24265, 24273, 24281, 24289, 24297, - 24305, 24313, 24321, 24329, 24337, 24345, 24353, 24361, 24369, 24377, - 24385, 24393, 24400, 24400, 24400, 24400, 24400, 24400, 24400, 24400, - 24400, 24400, 24400, 24400, 24400, 24400, 24400, 24400, 24400, 24400, - 24401, 24413, 24425, 24437, 24449, 24461, 24473, 24485, 24497, 24509, - 24521, 24533, 24545, 24557, 24569, 24581, 24593, 24605, 24617, 24629, - 24641, 24653, 24665, 24677, 24689, 24701, 24713, 24725, 24737, 24749, - 24761, 24773, 24785, 24797, 24809, 24821, 24833, 24845, 24857, 24869, - 24881, 24893, 24905, 24917, 24929, 24941, 24953, 24965, 24977, 24989, - 25001, 25013, 25025, 25037, 25049, 25061, 25073, 25085, 25097, 25109, - 25121, 25133, 25145, 25157, 25168, 25168, 25169, 25181, 25193, 25205, - 25217, 25229, 25241, 25253, 25265, 25277, 25289, 25301, 25313, 25325, - 25337, 25349, 25361, 25373, 25385, 25397, 25409, 25421, 25433, 25445, - 25457, 25469, 25481, 25493, 25505, 25517, 25529, 25541, 25553, 25565, - 25577, 25589, 25601, 25613, 25625, 25637, 25649, 25661, 25673, 25685, - 25697, 25709, 25721, 25733, 25745, 25757, 25769, 25781, 25793, 25805, - 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, - 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, - 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, - 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, - 25817, 25829, 25841, 25857, 25873, 25889, 25905, 25921, 25937, 25953, - 25965, 26037, 26069, 26084, 26084, 26084, 26084}, - {26084, 26084, 26084, 26084, 26084, 26084, 26084, 26084, 26084, 26084, - 26084, 26084, 26084, 26084, 26084, 26084, 26085, 26089, 26093, 26097, - 26101, 26105, 26109, 26113, 26117, 26121, 26132, 26132, 26132, 26132, - 26132, 26132, 26132, 26132, 26132, 26132, 26132, 26132, 26132, 26132, - 26132, 26132, 26132, 26132, 26132, 26132, 26132, 26132, 26133, 26141, - 26145, 26149, 26153, 26157, 26161, 26165, 26169, 26173, 26177, 26181, - 26185, 26189, 26193, 26197, 26201, 26205, 26209, 26213, 26217, 26220, - 26220, 26221, 26225, 26229, 26237, 26245, 26253, 26261, 26265, 26269, - 26273, 26277, 26281, 26284, 26285, 26289, 26293, 26297, 26301, 26305, - 26309, 26313, 26317, 26321, 26325, 26329, 26333, 26337, 26341, 26345, - 26349, 26353, 26357, 26360, 26361, 26365, 26369, 26373, 26376, 26376, - 26376, 26376, 26377, 26385, 26393, 26400, 26401, 26408, 26409, 26417, - 26425, 26433, 26441, 26449, 26457, 26465, 26473, 26481, 26489, 26493, - 26501, 26509, 26517, 26525, 26533, 26541, 26549, 26557, 26565, 26573, - 26581, 26589, 26593, 26597, 26601, 26605, 26609, 26613, 26617, 26621, - 26625, 26629, 26633, 26637, 26641, 26645, 26649, 26653, 26657, 26661, - 26665, 26669, 26673, 26677, 26681, 26685, 26689, 26693, 26697, 26701, - 26705, 26709, 26713, 26717, 26721, 26725, 26729, 26733, 26737, 26741, - 26745, 26749, 26753, 26757, 26761, 26765, 26769, 26773, 26777, 26781, - 26785, 26789, 26793, 26797, 26801, 26805, 26809, 26813, 26817, 26821, - 26825, 26829, 26833, 26837, 26841, 26845, 26849, 26853, 26857, 26861, - 26865, 26869, 26873, 26877, 26881, 26885, 26889, 26893, 26897, 26901, - 26905, 26909, 26913, 26917, 26921, 26925, 26929, 26933, 26937, 26941, - 26945, 26949, 26953, 26957, 26961, 26965, 26969, 26973, 26977, 26981, - 26985, 26989, 26993, 26997, 27001, 27005, 27017, 27029, 27041, 27053, - 27065, 27077, 27085, 27092, 27092, 27092, 27092}, - {27092, 27093, 27097, 27101, 27105, 27109, 27113, 27117, 27121, 27125, - 27129, 27133, 27137, 27141, 27145, 27149, 27153, 27157, 27161, 27165, - 27169, 27173, 27177, 27181, 27185, 27189, 27193, 27197, 27201, 27205, - 27209, 27213, 27217, 27221, 27225, 27229, 27233, 27237, 27241, 27245, - 27249, 27253, 27257, 27261, 27265, 27269, 27273, 27277, 27281, 27285, - 27289, 27293, 27297, 27301, 27305, 27309, 27313, 27317, 27321, 27325, - 27329, 27333, 27337, 27341, 27345, 27349, 27353, 27357, 27361, 27365, - 27369, 27373, 27377, 27381, 27385, 27389, 27393, 27397, 27401, 27405, - 27409, 27413, 27417, 27421, 27425, 27429, 27433, 27437, 27441, 27445, - 27449, 27453, 27457, 27461, 27465, 27469, 27473, 27477, 27481, 27485, - 27489, 27493, 27497, 27501, 27505, 27509, 27513, 27517, 27521, 27525, - 27529, 27533, 27537, 27541, 27545, 27549, 27553, 27557, 27561, 27565, - 27569, 27573, 27577, 27581, 27585, 27589, 27593, 27597, 27601, 27605, - 27609, 27613, 27617, 27621, 27625, 27629, 27633, 27637, 27641, 27645, - 27649, 27653, 27657, 27661, 27665, 27669, 27673, 27677, 27681, 27685, - 27689, 27693, 27697, 27701, 27705, 27709, 27713, 27717, 27721, 27725, - 27729, 27733, 27737, 27741, 27745, 27749, 27753, 27757, 27761, 27765, - 27769, 27773, 27777, 27781, 27785, 27789, 27793, 27797, 27801, 27805, - 27809, 27813, 27817, 27821, 27825, 27829, 27833, 27837, 27841, 27845, - 27849, 27852, 27852, 27852, 27853, 27857, 27861, 27865, 27869, 27873, - 27876, 27876, 27877, 27881, 27885, 27889, 27893, 27897, 27900, 27900, - 27901, 27905, 27909, 27913, 27917, 27921, 27924, 27924, 27925, 27929, - 27933, 27936, 27936, 27936, 27937, 27941, 27945, 27949, 27957, 27961, - 27965, 27968, 27969, 27973, 27977, 27981, 27985, 27989, 27993, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996}, - {27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27997, - 28001, 28005, 28009, 28013, 28016, 28017, 28021, 28025, 28029, 28033, - 28037, 28041, 28045, 28049, 28053, 28057, 28061, 28065, 28069, 28073, - 28077, 28081, 28085, 28089, 28093, 28097, 28101, 28105, 28109, 28113, - 28117, 28121, 28125, 28129, 28133, 28137, 28141, 28145, 28149, 28153, - 28157, 28161, 28165, 28169, 28173, 28177, 28181, 28184, 28185, 28189, - 28193, 28197, 28201, 28205, 28209, 28213, 28217, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220}, - {28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28228, 28228, 28236, 28236, 28236, - 28236, 28236, 28236, 28236, 28236, 28236, 28236, 28236, 28236, 28236, - 28236, 28236, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244}, - {28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28252, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260}, - {28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28268, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276}, - {28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28284, 28292, - 28292, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300}, - {28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28308, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316}, - {28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324}, - {28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28332, 28340, 28352, 28364, 28376, - 28388, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28408, 28416, - 28428, 28440, 28452, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464}, - {28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28465}, - {28465, 28469, 28473, 28477, 28481, 28485, 28489, 28493, 28497, 28501, - 28505, 28509, 28513, 28517, 28521, 28525, 28529, 28533, 28537, 28541, - 28545, 28549, 28553, 28557, 28561, 28565, 28569, 28573, 28577, 28581, - 28585, 28589, 28593, 28597, 28601, 28605, 28609, 28613, 28617, 28621, - 28625, 28629, 28633, 28637, 28641, 28645, 28649, 28653, 28657, 28661, - 28665, 28669, 28673, 28677, 28681, 28685, 28689, 28693, 28697, 28701, - 28705, 28709, 28713, 28717, 28721, 28725, 28729, 28733, 28737, 28741, - 28745, 28749, 28753, 28757, 28761, 28765, 28769, 28773, 28777, 28781, - 28785, 28789, 28793, 28797, 28801, 28804, 28805, 28809, 28813, 28817, - 28821, 28825, 28829, 28833, 28837, 28841, 28845, 28849, 28853, 28857, - 28861, 28865, 28869, 28873, 28877, 28881, 28885, 28889, 28893, 28897, - 28901, 28905, 28909, 28913, 28917, 28921, 28925, 28929, 28933, 28937, - 28941, 28945, 28949, 28953, 28957, 28961, 28965, 28969, 28973, 28977, - 28981, 28985, 28989, 28993, 28997, 29001, 29005, 29009, 29013, 29017, - 29021, 29025, 29029, 29033, 29037, 29041, 29045, 29049, 29053, 29057, - 29061, 29065, 29069, 29073, 29077, 29081, 29085, 29088, 29089, 29093, - 29096, 29096, 29097, 29100, 29100, 29101, 29105, 29108, 29108, 29109, - 29113, 29117, 29121, 29124, 29125, 29129, 29133, 29137, 29141, 29145, - 29149, 29153, 29157, 29161, 29165, 29169, 29172, 29173, 29176, 29177, - 29181, 29185, 29189, 29193, 29197, 29201, 29204, 29205, 29209, 29213, - 29217, 29221, 29225, 29229, 29233, 29237, 29241, 29245, 29249, 29253, - 29257, 29261, 29265, 29269, 29273, 29277, 29281, 29285, 29289, 29293, - 29297, 29301, 29305, 29309, 29313, 29317, 29321, 29325, 29329, 29333, - 29337, 29341, 29345, 29349, 29353, 29357, 29361, 29365, 29369, 29373, - 29377, 29381, 29385, 29389, 29393, 29397, 29401, 29405, 29409, 29413, - 29417, 29421, 29425, 29429, 29433, 29437, 29441}, - {29441, 29445, 29449, 29453, 29457, 29461, 29464, 29465, 29469, 29473, - 29477, 29480, 29480, 29481, 29485, 29489, 29493, 29497, 29501, 29505, - 29509, 29512, 29513, 29517, 29521, 29525, 29529, 29533, 29537, 29540, - 29541, 29545, 29549, 29553, 29557, 29561, 29565, 29569, 29573, 29577, - 29581, 29585, 29589, 29593, 29597, 29601, 29605, 29609, 29613, 29617, - 29621, 29625, 29629, 29633, 29637, 29641, 29645, 29649, 29652, 29653, - 29657, 29661, 29665, 29668, 29669, 29673, 29677, 29681, 29685, 29688, - 29689, 29692, 29692, 29692, 29693, 29697, 29701, 29705, 29709, 29713, - 29717, 29720, 29721, 29725, 29729, 29733, 29737, 29741, 29745, 29749, - 29753, 29757, 29761, 29765, 29769, 29773, 29777, 29781, 29785, 29789, - 29793, 29797, 29801, 29805, 29809, 29813, 29817, 29821, 29825, 29829, - 29833, 29837, 29841, 29845, 29849, 29853, 29857, 29861, 29865, 29869, - 29873, 29877, 29881, 29885, 29889, 29893, 29897, 29901, 29905, 29909, - 29913, 29917, 29921, 29925, 29929, 29933, 29937, 29941, 29945, 29949, - 29953, 29957, 29961, 29965, 29969, 29973, 29977, 29981, 29985, 29989, - 29993, 29997, 30001, 30005, 30009, 30013, 30017, 30021, 30025, 30029, - 30033, 30037, 30041, 30045, 30049, 30053, 30057, 30061, 30065, 30069, - 30073, 30077, 30081, 30085, 30089, 30093, 30097, 30101, 30105, 30109, - 30113, 30117, 30121, 30125, 30129, 30133, 30137, 30141, 30145, 30149, - 30153, 30157, 30161, 30165, 30169, 30173, 30177, 30181, 30185, 30189, - 30193, 30197, 30201, 30205, 30209, 30213, 30217, 30221, 30225, 30229, - 30233, 30237, 30241, 30245, 30249, 30253, 30257, 30261, 30265, 30269, - 30273, 30277, 30281, 30285, 30289, 30293, 30297, 30301, 30305, 30309, - 30313, 30317, 30321, 30325, 30329, 30333, 30337, 30341, 30345, 30349, - 30353, 30357, 30361, 30365, 30369, 30373, 30377, 30381, 30385, 30389, - 30393, 30397, 30401, 30405, 30409, 30413, 30417}, - {30417, 30421, 30425, 30429, 30433, 30437, 30441, 30445, 30449, 30453, - 30457, 30461, 30465, 30469, 30473, 30477, 30481, 30485, 30489, 30493, - 30497, 30501, 30505, 30509, 30513, 30517, 30521, 30525, 30529, 30533, - 30537, 30541, 30545, 30549, 30553, 30557, 30561, 30565, 30569, 30573, - 30577, 30581, 30585, 30589, 30593, 30597, 30601, 30605, 30609, 30613, - 30617, 30621, 30625, 30629, 30633, 30637, 30641, 30645, 30649, 30653, - 30657, 30661, 30665, 30669, 30673, 30677, 30681, 30685, 30689, 30693, - 30697, 30701, 30705, 30709, 30713, 30717, 30721, 30725, 30729, 30733, - 30737, 30741, 30745, 30749, 30753, 30757, 30761, 30765, 30769, 30773, - 30777, 30781, 30785, 30789, 30793, 30797, 30801, 30805, 30809, 30813, - 30817, 30821, 30825, 30829, 30833, 30837, 30841, 30845, 30849, 30853, - 30857, 30861, 30865, 30869, 30873, 30877, 30881, 30885, 30889, 30893, - 30897, 30901, 30905, 30909, 30913, 30917, 30921, 30925, 30929, 30933, - 30937, 30941, 30945, 30949, 30953, 30957, 30961, 30965, 30969, 30973, - 30977, 30981, 30985, 30989, 30993, 30997, 31001, 31005, 31009, 31013, - 31017, 31021, 31025, 31029, 31033, 31037, 31041, 31045, 31049, 31053, - 31057, 31061, 31065, 31069, 31073, 31077, 31080, 31080, 31081, 31085, - 31089, 31093, 31097, 31101, 31105, 31109, 31113, 31117, 31121, 31125, - 31129, 31133, 31137, 31141, 31145, 31149, 31153, 31157, 31161, 31165, - 31169, 31173, 31177, 31181, 31185, 31189, 31193, 31197, 31201, 31205, - 31209, 31213, 31217, 31221, 31225, 31229, 31233, 31237, 31241, 31245, - 31249, 31253, 31257, 31261, 31265, 31269, 31273, 31277, 31281, 31285, - 31289, 31293, 31297, 31301, 31305, 31309, 31313, 31317, 31321, 31325, - 31329, 31333, 31337, 31341, 31345, 31349, 31353, 31357, 31361, 31365, - 31369, 31373, 31377, 31381, 31385, 31389, 31393, 31397, 31401, 31405, - 31409, 31413, 31417, 31421, 31425, 31429, 31433}, - {31433, 31437, 31441, 31445, 31449, 31453, 31457, 31461, 31465, 31469, - 31473, 31477, 31481, 31485, 31489, 31493, 31497, 31501, 31505, 31509, - 31513, 31517, 31521, 31525, 31529, 31533, 31537, 31541, 31545, 31549, - 31553, 31557, 31561, 31565, 31569, 31573, 31577, 31581, 31585, 31589, - 31593, 31597, 31601, 31605, 31609, 31613, 31617, 31621, 31625, 31629, - 31633, 31637, 31641, 31645, 31649, 31653, 31657, 31661, 31665, 31669, - 31673, 31677, 31681, 31685, 31689, 31693, 31697, 31701, 31705, 31709, - 31713, 31717, 31721, 31725, 31729, 31733, 31737, 31741, 31745, 31749, - 31753, 31757, 31761, 31765, 31769, 31773, 31777, 31781, 31785, 31789, - 31793, 31797, 31801, 31805, 31809, 31813, 31817, 31821, 31825, 31829, - 31833, 31837, 31841, 31845, 31849, 31853, 31857, 31861, 31865, 31869, - 31873, 31877, 31881, 31885, 31889, 31893, 31897, 31901, 31905, 31909, - 31913, 31917, 31921, 31925, 31929, 31933, 31937, 31941, 31945, 31949, - 31953, 31957, 31961, 31965, 31969, 31973, 31977, 31981, 31985, 31989, - 31993, 31997, 32001, 32005, 32009, 32013, 32017, 32021, 32025, 32029, - 32033, 32037, 32041, 32045, 32049, 32053, 32057, 32061, 32065, 32069, - 32073, 32077, 32081, 32085, 32089, 32093, 32097, 32101, 32105, 32109, - 32113, 32117, 32121, 32125, 32129, 32133, 32137, 32141, 32145, 32149, - 32153, 32157, 32161, 32165, 32169, 32173, 32177, 32181, 32185, 32189, - 32193, 32197, 32201, 32205, 32209, 32213, 32217, 32221, 32225, 32229, - 32233, 32237, 32241, 32245, 32248, 32248, 32249, 32253, 32257, 32261, - 32265, 32269, 32273, 32277, 32281, 32285, 32289, 32293, 32297, 32301, - 32305, 32309, 32313, 32317, 32321, 32325, 32329, 32333, 32337, 32341, - 32345, 32349, 32353, 32357, 32361, 32365, 32369, 32373, 32377, 32381, - 32385, 32389, 32393, 32397, 32401, 32405, 32409, 32413, 32417, 32421, - 32425, 32429, 32433, 32437, 32441, 32445, 32448}, - {32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, - 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, - 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, - 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, - 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32449, 32453, - 32457, 32461, 32465, 32469, 32473, 32477, 32481, 32485, 32489, 32493, - 32497, 32501, 32505, 32509, 32513, 32517, 32521, 32525, 32529, 32533, - 32537, 32541, 32545, 32549, 32553, 32557, 32561, 32565, 32569, 32573, - 32577, 32581, 32585, 32589, 32593, 32597, 32601, 32605, 32609, 32613, - 32617, 32621, 32625, 32629, 32633, 32637, 32641, 32645, 32649, 32653, - 32657, 32661, 32665, 32669, 32673, 32677, 32681, 32685, 32689, 32693, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696}, - {32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32697}, - {32697, 32701, 32705, 32709, 32712, 32713, 32717, 32721, 32725, 32729, - 32733, 32737, 32741, 32745, 32749, 32753, 32757, 32761, 32765, 32769, - 32773, 32777, 32781, 32785, 32789, 32793, 32797, 32801, 32805, 32809, - 32813, 32817, 32820, 32821, 32825, 32828, 32829, 32832, 32832, 32833, - 32836, 32837, 32841, 32845, 32849, 32853, 32857, 32861, 32865, 32869, - 32873, 32876, 32877, 32881, 32885, 32889, 32892, 32893, 32896, 32897, - 32900, 32900, 32900, 32900, 32900, 32900, 32901, 32904, 32904, 32904, - 32904, 32905, 32908, 32909, 32912, 32913, 32916, 32917, 32921, 32925, - 32928, 32929, 32933, 32936, 32937, 32940, 32940, 32941, 32944, 32945, - 32948, 32949, 32952, 32953, 32956, 32957, 32960, 32961, 32965, 32968, - 32969, 32972, 32972, 32973, 32977, 32981, 32985, 32988, 32989, 32993, - 32997, 33001, 33005, 33009, 33013, 33016, 33017, 33021, 33025, 33029, - 33032, 33033, 33037, 33041, 33045, 33048, 33049, 33052, 33053, 33057, - 33061, 33065, 33069, 33073, 33077, 33081, 33085, 33089, 33092, 33093, - 33097, 33101, 33105, 33109, 33113, 33117, 33121, 33125, 33129, 33133, - 33137, 33141, 33145, 33149, 33153, 33157, 33160, 33160, 33160, 33160, - 33160, 33161, 33165, 33169, 33172, 33173, 33177, 33181, 33185, 33189, - 33192, 33193, 33197, 33201, 33205, 33209, 33213, 33217, 33221, 33225, - 33229, 33233, 33237, 33241, 33245, 33249, 33253, 33257, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260}, - {33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33261}, - {33261, 33269, 33277, 33285, 33293, 33301, 33309, 33317, 33325, 33333, - 33341, 33348, 33348, 33348, 33348, 33348, 33349, 33361, 33373, 33385, - 33397, 33409, 33421, 33433, 33445, 33457, 33469, 33481, 33493, 33505, - 33517, 33529, 33541, 33553, 33565, 33577, 33589, 33601, 33613, 33625, - 33637, 33649, 33661, 33673, 33677, 33681, 33689, 33696, 33697, 33701, - 33705, 33709, 33713, 33717, 33721, 33725, 33729, 33733, 33737, 33741, - 33745, 33749, 33753, 33757, 33761, 33765, 33769, 33773, 33777, 33781, - 33785, 33789, 33793, 33797, 33801, 33809, 33817, 33825, 33833, 33845, - 33852, 33852, 33852, 33852, 33852, 33852, 33852, 33852, 33852, 33852, - 33852, 33852, 33852, 33852, 33852, 33852, 33852, 33852, 33852, 33852, - 33852, 33852, 33852, 33852, 33852, 33852, 33853, 33861, 33869, 33876, - 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, - 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, - 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, - 33876, 33876, 33876, 33876, 33877, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33885}, - {33885, 33893, 33901, 33904, 33904, 33904, 33904, 33904, 33904, 33904, - 33904, 33904, 33904, 33904, 33904, 33904, 33905, 33909, 33913, 33917, - 33925, 33929, 33933, 33937, 33941, 33945, 33949, 33953, 33957, 33961, - 33965, 33969, 33973, 33977, 33981, 33985, 33989, 33993, 33997, 34001, - 34005, 34009, 34013, 34017, 34021, 34025, 34029, 34033, 34037, 34041, - 34045, 34049, 34053, 34057, 34061, 34065, 34069, 34073, 34077, 34081, - 34084, 34084, 34084, 34084, 34085, 34097, 34109, 34121, 34133, 34145, - 34157, 34169, 34181, 34192, 34192, 34192, 34192, 34192, 34192, 34192, - 34193, 34197, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200}, - {34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34201, 34205, 34209, 34213, 34217, 34221, 34225, 34229, 34233, 34237, - 34240, 34240, 34240, 34240, 34240, 34240, 34240}, - {34240, 34244, 34248, 34252, 34256, 34260, 34264, 34268, 34272, 34276, - 34280, 34284, 34288, 34292, 34296, 34300, 34304, 34308, 34312, 34316, - 34320, 34324, 34328, 34332, 34336, 34340, 34344, 34348, 34352, 34356, - 34360, 34364, 34368, 34372, 34376, 34380, 34384, 34388, 34392, 34396, - 34400, 34404, 34408, 34412, 34416, 34420, 34424, 34428, 34432, 34436, - 34440, 34444, 34448, 34452, 34456, 34460, 34464, 34468, 34472, 34476, - 34480, 34484, 34488, 34492, 34496, 34500, 34504, 34508, 34512, 34516, - 34520, 34524, 34528, 34532, 34536, 34540, 34544, 34548, 34552, 34556, - 34560, 34564, 34568, 34572, 34576, 34580, 34584, 34588, 34592, 34596, - 34600, 34604, 34608, 34612, 34616, 34620, 34624, 34628, 34632, 34636, - 34640, 34644, 34648, 34652, 34656, 34660, 34664, 34668, 34672, 34676, - 34680, 34684, 34688, 34692, 34696, 34700, 34704, 34708, 34712, 34716, - 34720, 34724, 34728, 34732, 34736, 34740, 34744, 34748, 34752, 34756, - 34760, 34764, 34768, 34772, 34776, 34780, 34784, 34788, 34792, 34796, - 34800, 34804, 34808, 34812, 34816, 34820, 34824, 34828, 34832, 34836, - 34840, 34844, 34848, 34852, 34856, 34860, 34864, 34868, 34872, 34876, - 34880, 34884, 34888, 34892, 34896, 34900, 34904, 34908, 34912, 34916, - 34920, 34924, 34928, 34932, 34936, 34940, 34944, 34948, 34952, 34956, - 34960, 34964, 34968, 34972, 34976, 34980, 34984, 34988, 34992, 34996, - 35000, 35004, 35008, 35012, 35016, 35020, 35024, 35028, 35032, 35036, - 35040, 35044, 35048, 35052, 35056, 35060, 35064, 35068, 35072, 35076, - 35080, 35084, 35088, 35092, 35096, 35100, 35104, 35108, 35112, 35116, - 35120, 35124, 35128, 35132, 35136, 35140, 35144, 35148, 35152, 35156, - 35160, 35164, 35168, 35172, 35176, 35180, 35184, 35188, 35192, 35196, - 35200, 35204, 35208, 35212, 35216, 35220, 35224, 35228, 35232, 35236, - 35240, 35244, 35248, 35252, 35256, 35260, 35264}, - {35264, 35268, 35272, 35276, 35280, 35284, 35288, 35292, 35296, 35300, - 35304, 35308, 35312, 35316, 35320, 35324, 35328, 35332, 35336, 35340, - 35344, 35348, 35352, 35356, 35360, 35364, 35368, 35372, 35376, 35380, - 35384, 35388, 35392, 35396, 35400, 35404, 35408, 35412, 35416, 35420, - 35424, 35428, 35432, 35436, 35440, 35444, 35448, 35452, 35456, 35460, - 35464, 35468, 35472, 35476, 35480, 35484, 35488, 35492, 35496, 35500, - 35504, 35508, 35512, 35516, 35520, 35524, 35528, 35532, 35536, 35540, - 35544, 35548, 35552, 35556, 35560, 35564, 35568, 35572, 35576, 35580, - 35584, 35588, 35592, 35596, 35600, 35604, 35608, 35612, 35616, 35620, - 35624, 35628, 35632, 35636, 35640, 35644, 35648, 35652, 35656, 35660, - 35664, 35668, 35672, 35676, 35680, 35684, 35688, 35692, 35696, 35700, - 35704, 35708, 35712, 35716, 35720, 35724, 35728, 35732, 35736, 35740, - 35744, 35748, 35752, 35756, 35760, 35764, 35768, 35772, 35776, 35780, - 35784, 35788, 35792, 35796, 35800, 35804, 35808, 35812, 35816, 35820, - 35824, 35828, 35832, 35836, 35840, 35844, 35848, 35852, 35856, 35860, - 35864, 35868, 35872, 35876, 35880, 35884, 35888, 35892, 35896, 35900, - 35904, 35908, 35912, 35916, 35920, 35924, 35928, 35932, 35936, 35940, - 35944, 35948, 35952, 35956, 35960, 35964, 35968, 35972, 35976, 35980, - 35984, 35988, 35992, 35996, 36000, 36004, 36008, 36012, 36016, 36020, - 36024, 36028, 36032, 36036, 36040, 36044, 36048, 36052, 36056, 36060, - 36064, 36068, 36072, 36076, 36080, 36084, 36088, 36092, 36096, 36100, - 36104, 36108, 36112, 36116, 36120, 36124, 36128, 36132, 36136, 36140, - 36144, 36148, 36152, 36156, 36160, 36164, 36168, 36172, 36176, 36180, - 36184, 36188, 36192, 36196, 36200, 36204, 36208, 36212, 36216, 36220, - 36224, 36228, 36232, 36236, 36240, 36244, 36248, 36252, 36256, 36260, - 36264, 36268, 36272, 36276, 36280, 36284, 36288}, - {36288, 36292, 36296, 36300, 36304, 36308, 36312, 36316, 36320, 36324, - 36328, 36332, 36336, 36340, 36344, 36348, 36352, 36356, 36360, 36364, - 36368, 36372, 36376, 36380, 36384, 36388, 36392, 36396, 36400, 36404, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408}}; -const char32_t decomposition_data[9102] = { - 0, 32, 32, 776, 97, 32, 772, 50, 51, - 32, 769, 956, 32, 807, 49, 111, 49, 8260, - 52, 49, 8260, 50, 51, 8260, 52, 65, 768, - 65, 769, 65, 770, 65, 771, 65, 776, 65, - 778, 67, 807, 69, 768, 69, 769, 69, 770, - 69, 776, 73, 768, 73, 769, 73, 770, 73, - 776, 78, 771, 79, 768, 79, 769, 79, 770, - 79, 771, 79, 776, 85, 768, 85, 769, 85, - 770, 85, 776, 89, 769, 97, 768, 97, 769, - 97, 770, 97, 771, 97, 776, 97, 778, 99, - 807, 101, 768, 101, 769, 101, 770, 101, 776, - 105, 768, 105, 769, 105, 770, 105, 776, 110, - 771, 111, 768, 111, 769, 111, 770, 111, 771, - 111, 776, 117, 768, 117, 769, 117, 770, 117, - 776, 121, 769, 121, 776, 65, 772, 97, 772, - 65, 774, 97, 774, 65, 808, 97, 808, 67, - 769, 99, 769, 67, 770, 99, 770, 67, 775, - 99, 775, 67, 780, 99, 780, 68, 780, 100, - 780, 69, 772, 101, 772, 69, 774, 101, 774, - 69, 775, 101, 775, 69, 808, 101, 808, 69, - 780, 101, 780, 71, 770, 103, 770, 71, 774, - 103, 774, 71, 775, 103, 775, 71, 807, 103, - 807, 72, 770, 104, 770, 73, 771, 105, 771, - 73, 772, 105, 772, 73, 774, 105, 774, 73, - 808, 105, 808, 73, 775, 73, 74, 105, 106, - 74, 770, 106, 770, 75, 807, 107, 807, 76, - 769, 108, 769, 76, 807, 108, 807, 76, 780, - 108, 780, 76, 183, 108, 183, 78, 769, 110, - 769, 78, 807, 110, 807, 78, 780, 110, 780, - 700, 110, 79, 772, 111, 772, 79, 774, 111, - 774, 79, 779, 111, 779, 82, 769, 114, 769, - 82, 807, 114, 807, 82, 780, 114, 780, 83, - 769, 115, 769, 83, 770, 115, 770, 83, 807, - 115, 807, 83, 780, 115, 780, 84, 807, 116, - 807, 84, 780, 116, 780, 85, 771, 117, 771, - 85, 772, 117, 772, 85, 774, 117, 774, 85, - 778, 117, 778, 85, 779, 117, 779, 85, 808, - 117, 808, 87, 770, 119, 770, 89, 770, 121, - 770, 89, 776, 90, 769, 122, 769, 90, 775, - 122, 775, 90, 780, 122, 780, 115, 79, 795, - 111, 795, 85, 795, 117, 795, 68, 90, 780, - 68, 122, 780, 100, 122, 780, 76, 74, 76, - 106, 108, 106, 78, 74, 78, 106, 110, 106, - 65, 780, 97, 780, 73, 780, 105, 780, 79, - 780, 111, 780, 85, 780, 117, 780, 85, 776, - 772, 117, 776, 772, 85, 776, 769, 117, 776, - 769, 85, 776, 780, 117, 776, 780, 85, 776, - 768, 117, 776, 768, 65, 776, 772, 97, 776, - 772, 65, 775, 772, 97, 775, 772, 198, 772, - 230, 772, 71, 780, 103, 780, 75, 780, 107, - 780, 79, 808, 111, 808, 79, 808, 772, 111, - 808, 772, 439, 780, 658, 780, 106, 780, 68, - 90, 68, 122, 100, 122, 71, 769, 103, 769, - 78, 768, 110, 768, 65, 778, 769, 97, 778, - 769, 198, 769, 230, 769, 216, 769, 248, 769, - 65, 783, 97, 783, 65, 785, 97, 785, 69, - 783, 101, 783, 69, 785, 101, 785, 73, 783, - 105, 783, 73, 785, 105, 785, 79, 783, 111, - 783, 79, 785, 111, 785, 82, 783, 114, 783, - 82, 785, 114, 785, 85, 783, 117, 783, 85, - 785, 117, 785, 83, 806, 115, 806, 84, 806, - 116, 806, 72, 780, 104, 780, 65, 775, 97, - 775, 69, 807, 101, 807, 79, 776, 772, 111, - 776, 772, 79, 771, 772, 111, 771, 772, 79, - 775, 111, 775, 79, 775, 772, 111, 775, 772, - 89, 772, 121, 772, 104, 614, 106, 114, 633, - 635, 641, 119, 121, 32, 774, 32, 775, 32, - 778, 32, 808, 32, 771, 32, 779, 611, 108, - 115, 120, 661, 768, 769, 787, 776, 769, 697, - 32, 837, 59, 32, 769, 168, 769, 913, 769, - 183, 917, 769, 919, 769, 921, 769, 927, 769, - 933, 769, 937, 769, 953, 776, 769, 921, 776, - 933, 776, 945, 769, 949, 769, 951, 769, 953, - 769, 965, 776, 769, 953, 776, 965, 776, 959, - 769, 965, 769, 969, 769, 946, 952, 933, 978, - 769, 978, 776, 966, 960, 954, 961, 962, 920, - 949, 931, 1045, 768, 1045, 776, 1043, 769, 1030, - 776, 1050, 769, 1048, 768, 1059, 774, 1048, 774, - 1080, 774, 1077, 768, 1077, 776, 1075, 769, 1110, - 776, 1082, 769, 1080, 768, 1091, 774, 1140, 783, - 1141, 783, 1046, 774, 1078, 774, 1040, 774, 1072, - 774, 1040, 776, 1072, 776, 1045, 774, 1077, 774, - 1240, 776, 1241, 776, 1046, 776, 1078, 776, 1047, - 776, 1079, 776, 1048, 772, 1080, 772, 1048, 776, - 1080, 776, 1054, 776, 1086, 776, 1256, 776, 1257, - 776, 1069, 776, 1101, 776, 1059, 772, 1091, 772, - 1059, 776, 1091, 776, 1059, 779, 1091, 779, 1063, - 776, 1095, 776, 1067, 776, 1099, 776, 1381, 1410, - 1575, 1619, 1575, 1620, 1608, 1620, 1575, 1621, 1610, - 1620, 1575, 1652, 1608, 1652, 1735, 1652, 1610, 1652, - 1749, 1620, 1729, 1620, 1746, 1620, 2344, 2364, 2352, - 2364, 2355, 2364, 2325, 2364, 2326, 2364, 2327, 2364, - 2332, 2364, 2337, 2364, 2338, 2364, 2347, 2364, 2351, - 2364, 2503, 2494, 2503, 2519, 2465, 2492, 2466, 2492, - 2479, 2492, 2610, 2620, 2616, 2620, 2582, 2620, 2583, - 2620, 2588, 2620, 2603, 2620, 2887, 2902, 2887, 2878, - 2887, 2903, 2849, 2876, 2850, 2876, 2962, 3031, 3014, - 3006, 3015, 3006, 3014, 3031, 3142, 3158, 3263, 3285, - 3270, 3285, 3270, 3286, 3270, 3266, 3270, 3266, 3285, - 3398, 3390, 3399, 3390, 3398, 3415, 3545, 3530, 3545, - 3535, 3545, 3535, 3530, 3545, 3551, 3661, 3634, 3789, - 3762, 3755, 3737, 3755, 3745, 3851, 3906, 4023, 3916, - 4023, 3921, 4023, 3926, 4023, 3931, 4023, 3904, 4021, - 3953, 3954, 3953, 3956, 4018, 3968, 4018, 3953, 3968, - 4019, 3968, 4019, 3953, 3968, 3953, 3968, 3986, 4023, - 3996, 4023, 4001, 4023, 4006, 4023, 4011, 4023, 3984, - 4021, 4133, 4142, 4316, 6917, 6965, 6919, 6965, 6921, - 6965, 6923, 6965, 6925, 6965, 6929, 6965, 6970, 6965, - 6972, 6965, 6974, 6965, 6975, 6965, 6978, 6965, 65, - 198, 66, 68, 69, 398, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 546, 80, 82, 84, - 85, 87, 97, 592, 593, 7426, 98, 100, 101, - 601, 603, 604, 103, 107, 109, 331, 111, 596, - 7446, 7447, 112, 116, 117, 7453, 623, 118, 7461, - 946, 947, 948, 966, 967, 105, 114, 117, 118, - 946, 947, 961, 966, 967, 1085, 594, 99, 597, - 240, 604, 102, 607, 609, 613, 616, 617, 618, - 7547, 669, 621, 7557, 671, 625, 624, 626, 627, - 628, 629, 632, 642, 643, 427, 649, 650, 7452, - 651, 652, 122, 656, 657, 658, 952, 65, 805, - 97, 805, 66, 775, 98, 775, 66, 803, 98, - 803, 66, 817, 98, 817, 67, 807, 769, 99, - 807, 769, 68, 775, 100, 775, 68, 803, 100, - 803, 68, 817, 100, 817, 68, 807, 100, 807, - 68, 813, 100, 813, 69, 772, 768, 101, 772, - 768, 69, 772, 769, 101, 772, 769, 69, 813, - 101, 813, 69, 816, 101, 816, 69, 807, 774, - 101, 807, 774, 70, 775, 102, 775, 71, 772, - 103, 772, 72, 775, 104, 775, 72, 803, 104, - 803, 72, 776, 104, 776, 72, 807, 104, 807, - 72, 814, 104, 814, 73, 816, 105, 816, 73, - 776, 769, 105, 776, 769, 75, 769, 107, 769, - 75, 803, 107, 803, 75, 817, 107, 817, 76, - 803, 108, 803, 76, 803, 772, 108, 803, 772, - 76, 817, 108, 817, 76, 813, 108, 813, 77, - 769, 109, 769, 77, 775, 109, 775, 77, 803, - 109, 803, 78, 775, 110, 775, 78, 803, 110, - 803, 78, 817, 110, 817, 78, 813, 110, 813, - 79, 771, 769, 111, 771, 769, 79, 771, 776, - 111, 771, 776, 79, 772, 768, 111, 772, 768, - 79, 772, 769, 111, 772, 769, 80, 769, 112, - 769, 80, 775, 112, 775, 82, 775, 114, 775, - 82, 803, 114, 803, 82, 803, 772, 114, 803, - 772, 82, 817, 114, 817, 83, 775, 115, 775, - 83, 803, 115, 803, 83, 769, 775, 115, 769, - 775, 83, 780, 775, 115, 780, 775, 83, 803, - 775, 115, 803, 775, 84, 775, 116, 775, 84, - 803, 116, 803, 84, 817, 116, 817, 84, 813, - 116, 813, 85, 804, 117, 804, 85, 816, 117, - 816, 85, 813, 117, 813, 85, 771, 769, 117, - 771, 769, 85, 772, 776, 117, 772, 776, 86, - 771, 118, 771, 86, 803, 118, 803, 87, 768, - 119, 768, 87, 769, 119, 769, 87, 776, 119, - 776, 87, 775, 119, 775, 87, 803, 119, 803, - 88, 775, 120, 775, 88, 776, 120, 776, 89, - 775, 121, 775, 90, 770, 122, 770, 90, 803, - 122, 803, 90, 817, 122, 817, 104, 817, 116, - 776, 119, 778, 121, 778, 97, 702, 383, 775, - 65, 803, 97, 803, 65, 777, 97, 777, 65, - 770, 769, 97, 770, 769, 65, 770, 768, 97, - 770, 768, 65, 770, 777, 97, 770, 777, 65, - 770, 771, 97, 770, 771, 65, 803, 770, 97, - 803, 770, 65, 774, 769, 97, 774, 769, 65, - 774, 768, 97, 774, 768, 65, 774, 777, 97, - 774, 777, 65, 774, 771, 97, 774, 771, 65, - 803, 774, 97, 803, 774, 69, 803, 101, 803, - 69, 777, 101, 777, 69, 771, 101, 771, 69, - 770, 769, 101, 770, 769, 69, 770, 768, 101, - 770, 768, 69, 770, 777, 101, 770, 777, 69, - 770, 771, 101, 770, 771, 69, 803, 770, 101, - 803, 770, 73, 777, 105, 777, 73, 803, 105, - 803, 79, 803, 111, 803, 79, 777, 111, 777, - 79, 770, 769, 111, 770, 769, 79, 770, 768, - 111, 770, 768, 79, 770, 777, 111, 770, 777, - 79, 770, 771, 111, 770, 771, 79, 803, 770, - 111, 803, 770, 79, 795, 769, 111, 795, 769, - 79, 795, 768, 111, 795, 768, 79, 795, 777, - 111, 795, 777, 79, 795, 771, 111, 795, 771, - 79, 795, 803, 111, 795, 803, 85, 803, 117, - 803, 85, 777, 117, 777, 85, 795, 769, 117, - 795, 769, 85, 795, 768, 117, 795, 768, 85, - 795, 777, 117, 795, 777, 85, 795, 771, 117, - 795, 771, 85, 795, 803, 117, 795, 803, 89, - 768, 121, 768, 89, 803, 121, 803, 89, 777, - 121, 777, 89, 771, 121, 771, 945, 787, 945, - 788, 945, 787, 768, 945, 788, 768, 945, 787, - 769, 945, 788, 769, 945, 787, 834, 945, 788, - 834, 913, 787, 913, 788, 913, 787, 768, 913, - 788, 768, 913, 787, 769, 913, 788, 769, 913, - 787, 834, 913, 788, 834, 949, 787, 949, 788, - 949, 787, 768, 949, 788, 768, 949, 787, 769, - 949, 788, 769, 917, 787, 917, 788, 917, 787, - 768, 917, 788, 768, 917, 787, 769, 917, 788, - 769, 951, 787, 951, 788, 951, 787, 768, 951, - 788, 768, 951, 787, 769, 951, 788, 769, 951, - 787, 834, 951, 788, 834, 919, 787, 919, 788, - 919, 787, 768, 919, 788, 768, 919, 787, 769, - 919, 788, 769, 919, 787, 834, 919, 788, 834, - 953, 787, 953, 788, 953, 787, 768, 953, 788, - 768, 953, 787, 769, 953, 788, 769, 953, 787, - 834, 953, 788, 834, 921, 787, 921, 788, 921, - 787, 768, 921, 788, 768, 921, 787, 769, 921, - 788, 769, 921, 787, 834, 921, 788, 834, 959, - 787, 959, 788, 959, 787, 768, 959, 788, 768, - 959, 787, 769, 959, 788, 769, 927, 787, 927, - 788, 927, 787, 768, 927, 788, 768, 927, 787, - 769, 927, 788, 769, 965, 787, 965, 788, 965, - 787, 768, 965, 788, 768, 965, 787, 769, 965, - 788, 769, 965, 787, 834, 965, 788, 834, 933, - 788, 933, 788, 768, 933, 788, 769, 933, 788, - 834, 969, 787, 969, 788, 969, 787, 768, 969, - 788, 768, 969, 787, 769, 969, 788, 769, 969, - 787, 834, 969, 788, 834, 937, 787, 937, 788, - 937, 787, 768, 937, 788, 768, 937, 787, 769, - 937, 788, 769, 937, 787, 834, 937, 788, 834, - 945, 768, 945, 769, 949, 768, 949, 769, 951, - 768, 951, 769, 953, 768, 953, 769, 959, 768, - 959, 769, 965, 768, 965, 769, 969, 768, 969, - 769, 945, 787, 837, 945, 788, 837, 945, 787, - 768, 837, 945, 788, 768, 837, 945, 787, 769, - 837, 945, 788, 769, 837, 945, 787, 834, 837, - 945, 788, 834, 837, 913, 787, 837, 913, 788, - 837, 913, 787, 768, 837, 913, 788, 768, 837, - 913, 787, 769, 837, 913, 788, 769, 837, 913, - 787, 834, 837, 913, 788, 834, 837, 951, 787, - 837, 951, 788, 837, 951, 787, 768, 837, 951, - 788, 768, 837, 951, 787, 769, 837, 951, 788, - 769, 837, 951, 787, 834, 837, 951, 788, 834, - 837, 919, 787, 837, 919, 788, 837, 919, 787, - 768, 837, 919, 788, 768, 837, 919, 787, 769, - 837, 919, 788, 769, 837, 919, 787, 834, 837, - 919, 788, 834, 837, 969, 787, 837, 969, 788, - 837, 969, 787, 768, 837, 969, 788, 768, 837, - 969, 787, 769, 837, 969, 788, 769, 837, 969, - 787, 834, 837, 969, 788, 834, 837, 937, 787, - 837, 937, 788, 837, 937, 787, 768, 837, 937, - 788, 768, 837, 937, 787, 769, 837, 937, 788, - 769, 837, 937, 787, 834, 837, 937, 788, 834, - 837, 945, 774, 945, 772, 945, 768, 837, 945, - 837, 945, 769, 837, 945, 834, 945, 834, 837, - 913, 774, 913, 772, 913, 768, 913, 769, 913, - 837, 32, 787, 953, 32, 787, 32, 834, 168, - 834, 951, 768, 837, 951, 837, 951, 769, 837, - 951, 834, 951, 834, 837, 917, 768, 917, 769, - 919, 768, 919, 769, 919, 837, 8127, 768, 8127, - 769, 8127, 834, 953, 774, 953, 772, 953, 776, - 768, 953, 776, 769, 953, 834, 953, 776, 834, - 921, 774, 921, 772, 921, 768, 921, 769, 8190, - 768, 8190, 769, 8190, 834, 965, 774, 965, 772, - 965, 776, 768, 965, 776, 769, 961, 787, 961, - 788, 965, 834, 965, 776, 834, 933, 774, 933, - 772, 933, 768, 933, 769, 929, 788, 168, 768, - 168, 769, 96, 969, 768, 837, 969, 837, 969, - 769, 837, 969, 834, 969, 834, 837, 927, 768, - 927, 769, 937, 768, 937, 769, 937, 837, 180, - 32, 788, 8194, 8195, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 8208, 32, 819, 46, 46, - 46, 46, 46, 46, 32, 8242, 8242, 8242, 8242, - 8242, 8245, 8245, 8245, 8245, 8245, 33, 33, 32, - 773, 63, 63, 63, 33, 33, 63, 8242, 8242, - 8242, 8242, 32, 48, 105, 52, 53, 54, 55, - 56, 57, 43, 8722, 61, 40, 41, 110, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, - 43, 8722, 61, 40, 41, 97, 101, 111, 120, - 601, 104, 107, 108, 109, 110, 112, 115, 116, - 82, 115, 97, 47, 99, 97, 47, 115, 67, - 176, 67, 99, 47, 111, 99, 47, 117, 400, - 176, 70, 103, 72, 72, 72, 104, 295, 73, - 73, 76, 108, 78, 78, 111, 80, 81, 82, - 82, 82, 83, 77, 84, 69, 76, 84, 77, - 90, 937, 90, 75, 65, 778, 66, 67, 101, - 69, 70, 77, 111, 1488, 1489, 1490, 1491, 105, - 70, 65, 88, 960, 947, 915, 928, 8721, 68, - 100, 101, 105, 106, 49, 8260, 55, 49, 8260, - 57, 49, 8260, 49, 48, 49, 8260, 51, 50, - 8260, 51, 49, 8260, 53, 50, 8260, 53, 51, - 8260, 53, 52, 8260, 53, 49, 8260, 54, 53, - 8260, 54, 49, 8260, 56, 51, 8260, 56, 53, - 8260, 56, 55, 8260, 56, 49, 8260, 73, 73, - 73, 73, 73, 73, 73, 86, 86, 86, 73, - 86, 73, 73, 86, 73, 73, 73, 73, 88, - 88, 88, 73, 88, 73, 73, 76, 67, 68, - 77, 105, 105, 105, 105, 105, 105, 105, 118, - 118, 118, 105, 118, 105, 105, 118, 105, 105, - 105, 105, 120, 120, 120, 105, 120, 105, 105, - 108, 99, 100, 109, 48, 8260, 51, 8592, 824, - 8594, 824, 8596, 824, 8656, 824, 8660, 824, 8658, - 824, 8707, 824, 8712, 824, 8715, 824, 8739, 824, - 8741, 824, 8747, 8747, 8747, 8747, 8747, 8750, 8750, - 8750, 8750, 8750, 8764, 824, 8771, 824, 8773, 824, - 8776, 824, 61, 824, 8801, 824, 8781, 824, 60, - 824, 62, 824, 8804, 824, 8805, 824, 8818, 824, - 8819, 824, 8822, 824, 8823, 824, 8826, 824, 8827, - 824, 8834, 824, 8835, 824, 8838, 824, 8839, 824, - 8866, 824, 8872, 824, 8873, 824, 8875, 824, 8828, - 824, 8829, 824, 8849, 824, 8850, 824, 8882, 824, - 8883, 824, 8884, 824, 8885, 824, 12296, 12297, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 49, - 48, 49, 49, 49, 50, 49, 51, 49, 52, - 49, 53, 49, 54, 49, 55, 49, 56, 49, - 57, 50, 48, 40, 49, 41, 40, 50, 41, - 40, 51, 41, 40, 52, 41, 40, 53, 41, - 40, 54, 41, 40, 55, 41, 40, 56, 41, - 40, 57, 41, 40, 49, 48, 41, 40, 49, - 49, 41, 40, 49, 50, 41, 40, 49, 51, - 41, 40, 49, 52, 41, 40, 49, 53, 41, - 40, 49, 54, 41, 40, 49, 55, 41, 40, - 49, 56, 41, 40, 49, 57, 41, 40, 50, - 48, 41, 49, 46, 50, 46, 51, 46, 52, - 46, 53, 46, 54, 46, 55, 46, 56, 46, - 57, 46, 49, 48, 46, 49, 49, 46, 49, - 50, 46, 49, 51, 46, 49, 52, 46, 49, - 53, 46, 49, 54, 46, 49, 55, 46, 49, - 56, 46, 49, 57, 46, 50, 48, 46, 40, - 97, 41, 40, 98, 41, 40, 99, 41, 40, - 100, 41, 40, 101, 41, 40, 102, 41, 40, - 103, 41, 40, 104, 41, 40, 105, 41, 40, - 106, 41, 40, 107, 41, 40, 108, 41, 40, - 109, 41, 40, 110, 41, 40, 111, 41, 40, - 112, 41, 40, 113, 41, 40, 114, 41, 40, - 115, 41, 40, 116, 41, 40, 117, 41, 40, - 118, 41, 40, 119, 41, 40, 120, 41, 40, - 121, 41, 40, 122, 41, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 48, 8747, 8747, 8747, 8747, 58, - 58, 61, 61, 61, 61, 61, 61, 10973, 824, - 106, 86, 11617, 27597, 40863, 19968, 20008, 20022, 20031, - 20057, 20101, 20108, 20128, 20154, 20799, 20837, 20843, 20866, - 20886, 20907, 20960, 20981, 20992, 21147, 21241, 21269, 21274, - 21304, 21313, 21340, 21353, 21378, 21430, 21448, 21475, 22231, - 22303, 22763, 22786, 22794, 22805, 22823, 22899, 23376, 23424, - 23544, 23567, 23586, 23608, 23662, 23665, 24027, 24037, 24049, - 24062, 24178, 24186, 24191, 24308, 24318, 24331, 24339, 24400, - 24417, 24435, 24515, 25096, 25142, 25163, 25903, 25908, 25991, - 26007, 26020, 26041, 26080, 26085, 26352, 26376, 26408, 27424, - 27490, 27513, 27571, 27595, 27604, 27611, 27663, 27668, 27700, - 28779, 29226, 29238, 29243, 29247, 29255, 29273, 29275, 29356, - 29572, 29577, 29916, 29926, 29976, 29983, 29992, 30000, 30091, - 30098, 30326, 30333, 30382, 30399, 30446, 30683, 30690, 30707, - 31034, 31160, 31166, 31348, 31435, 31481, 31859, 31992, 32566, - 32593, 32650, 32701, 32769, 32780, 32786, 32819, 32895, 32905, - 33251, 33258, 33267, 33276, 33292, 33307, 33311, 33390, 33394, - 33400, 34381, 34411, 34880, 34892, 34915, 35198, 35211, 35282, - 35328, 35895, 35910, 35925, 35960, 35997, 36196, 36208, 36275, - 36523, 36554, 36763, 36784, 36789, 37009, 37193, 37318, 37324, - 37329, 38263, 38272, 38428, 38582, 38585, 38632, 38737, 38750, - 38754, 38761, 38859, 38893, 38899, 38913, 39080, 39131, 39135, - 39318, 39321, 39340, 39592, 39640, 39647, 39717, 39727, 39730, - 39740, 39770, 40165, 40565, 40575, 40613, 40635, 40643, 40653, - 40657, 40697, 40701, 40718, 40723, 40736, 40763, 40778, 40786, - 40845, 40860, 40864, 32, 12306, 21313, 21316, 21317, 12363, - 12441, 12365, 12441, 12367, 12441, 12369, 12441, 12371, 12441, - 12373, 12441, 12375, 12441, 12377, 12441, 12379, 12441, 12381, - 12441, 12383, 12441, 12385, 12441, 12388, 12441, 12390, 12441, - 12392, 12441, 12399, 12441, 12399, 12442, 12402, 12441, 12402, - 12442, 12405, 12441, 12405, 12442, 12408, 12441, 12408, 12442, - 12411, 12441, 12411, 12442, 12358, 12441, 32, 12441, 32, - 12442, 12445, 12441, 12424, 12426, 12459, 12441, 12461, 12441, - 12463, 12441, 12465, 12441, 12467, 12441, 12469, 12441, 12471, - 12441, 12473, 12441, 12475, 12441, 12477, 12441, 12479, 12441, - 12481, 12441, 12484, 12441, 12486, 12441, 12488, 12441, 12495, - 12441, 12495, 12442, 12498, 12441, 12498, 12442, 12501, 12441, - 12501, 12442, 12504, 12441, 12504, 12442, 12507, 12441, 12507, - 12442, 12454, 12441, 12527, 12441, 12528, 12441, 12529, 12441, - 12530, 12441, 12541, 12441, 12467, 12488, 4352, 4353, 4522, - 4354, 4524, 4525, 4355, 4356, 4357, 4528, 4529, 4530, - 4531, 4532, 4533, 4378, 4358, 4359, 4360, 4385, 4361, - 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, - 4449, 4450, 4451, 4452, 4453, 4454, 4455, 4456, 4457, - 4458, 4459, 4460, 4461, 4462, 4463, 4464, 4465, 4466, - 4467, 4468, 4469, 4448, 4372, 4373, 4551, 4552, 4556, - 4558, 4563, 4567, 4569, 4380, 4573, 4575, 4381, 4382, - 4384, 4386, 4387, 4391, 4393, 4395, 4396, 4397, 4398, - 4399, 4402, 4406, 4416, 4423, 4428, 4593, 4594, 4439, - 4440, 4441, 4484, 4485, 4488, 4497, 4498, 4500, 4510, - 4513, 19968, 20108, 19977, 22235, 19978, 20013, 19979, 30002, - 20057, 19993, 19969, 22825, 22320, 20154, 40, 4352, 41, - 40, 4354, 41, 40, 4355, 41, 40, 4357, 41, - 40, 4358, 41, 40, 4359, 41, 40, 4361, 41, - 40, 4363, 41, 40, 4364, 41, 40, 4366, 41, - 40, 4367, 41, 40, 4368, 41, 40, 4369, 41, - 40, 4370, 41, 40, 4352, 4449, 41, 40, 4354, - 4449, 41, 40, 4355, 4449, 41, 40, 4357, 4449, - 41, 40, 4358, 4449, 41, 40, 4359, 4449, 41, - 40, 4361, 4449, 41, 40, 4363, 4449, 41, 40, - 4364, 4449, 41, 40, 4366, 4449, 41, 40, 4367, - 4449, 41, 40, 4368, 4449, 41, 40, 4369, 4449, - 41, 40, 4370, 4449, 41, 40, 4364, 4462, 41, - 40, 4363, 4457, 4364, 4453, 4523, 41, 40, 4363, - 4457, 4370, 4462, 41, 40, 19968, 41, 40, 20108, - 41, 40, 19977, 41, 40, 22235, 41, 40, 20116, - 41, 40, 20845, 41, 40, 19971, 41, 40, 20843, - 41, 40, 20061, 41, 40, 21313, 41, 40, 26376, - 41, 40, 28779, 41, 40, 27700, 41, 40, 26408, - 41, 40, 37329, 41, 40, 22303, 41, 40, 26085, - 41, 40, 26666, 41, 40, 26377, 41, 40, 31038, - 41, 40, 21517, 41, 40, 29305, 41, 40, 36001, - 41, 40, 31069, 41, 40, 21172, 41, 40, 20195, - 41, 40, 21628, 41, 40, 23398, 41, 40, 30435, - 41, 40, 20225, 41, 40, 36039, 41, 40, 21332, - 41, 40, 31085, 41, 40, 20241, 41, 40, 33258, - 41, 40, 33267, 41, 21839, 24188, 25991, 31631, 80, - 84, 69, 50, 49, 50, 50, 50, 51, 50, - 52, 50, 53, 50, 54, 50, 55, 50, 56, - 50, 57, 51, 48, 51, 49, 51, 50, 51, - 51, 51, 52, 51, 53, 4352, 4354, 4355, 4357, - 4358, 4359, 4361, 4363, 4364, 4366, 4367, 4368, 4369, - 4370, 4352, 4449, 4354, 4449, 4355, 4449, 4357, 4449, - 4358, 4449, 4359, 4449, 4361, 4449, 4363, 4449, 4364, - 4449, 4366, 4449, 4367, 4449, 4368, 4449, 4369, 4449, - 4370, 4449, 4366, 4449, 4535, 4352, 4457, 4364, 4462, - 4363, 4468, 4363, 4462, 19968, 20108, 19977, 22235, 20116, - 20845, 19971, 20843, 20061, 21313, 26376, 28779, 27700, 26408, - 37329, 22303, 26085, 26666, 26377, 31038, 21517, 29305, 36001, - 31069, 21172, 31192, 30007, 22899, 36969, 20778, 21360, 27880, - 38917, 20241, 20889, 27491, 19978, 20013, 19979, 24038, 21491, - 21307, 23447, 23398, 30435, 20225, 36039, 21332, 22812, 51, - 54, 51, 55, 51, 56, 51, 57, 52, 48, - 52, 49, 52, 50, 52, 51, 52, 52, 52, - 53, 52, 54, 52, 55, 52, 56, 52, 57, - 53, 48, 49, 26376, 50, 26376, 51, 26376, 52, - 26376, 53, 26376, 54, 26376, 55, 26376, 56, 26376, - 57, 26376, 49, 48, 26376, 49, 49, 26376, 49, - 50, 26376, 72, 103, 101, 114, 103, 101, 86, - 76, 84, 68, 12450, 12452, 12454, 12456, 12458, 12459, - 12461, 12463, 12465, 12467, 12469, 12471, 12473, 12475, 12477, - 12479, 12481, 12484, 12486, 12488, 12490, 12491, 12492, 12493, - 12494, 12495, 12498, 12501, 12504, 12507, 12510, 12511, 12512, - 12513, 12514, 12516, 12518, 12520, 12521, 12522, 12523, 12524, - 12525, 12527, 12528, 12529, 12530, 20196, 21644, 12450, 12495, - 12442, 12540, 12488, 12450, 12523, 12501, 12449, 12450, 12531, - 12504, 12442, 12450, 12450, 12540, 12523, 12452, 12491, 12531, - 12463, 12441, 12452, 12531, 12481, 12454, 12457, 12531, 12456, - 12473, 12463, 12540, 12488, 12441, 12456, 12540, 12459, 12540, - 12458, 12531, 12473, 12458, 12540, 12512, 12459, 12452, 12522, - 12459, 12521, 12483, 12488, 12459, 12525, 12522, 12540, 12459, - 12441, 12525, 12531, 12459, 12441, 12531, 12510, 12461, 12441, - 12459, 12441, 12461, 12441, 12491, 12540, 12461, 12517, 12522, - 12540, 12461, 12441, 12523, 12479, 12441, 12540, 12461, 12525, - 12461, 12525, 12463, 12441, 12521, 12512, 12461, 12525, 12513, - 12540, 12488, 12523, 12461, 12525, 12527, 12483, 12488, 12463, - 12441, 12521, 12512, 12463, 12441, 12521, 12512, 12488, 12531, - 12463, 12523, 12475, 12441, 12452, 12525, 12463, 12525, 12540, - 12493, 12465, 12540, 12473, 12467, 12523, 12490, 12467, 12540, - 12507, 12442, 12469, 12452, 12463, 12523, 12469, 12531, 12481, - 12540, 12512, 12471, 12522, 12531, 12463, 12441, 12475, 12531, - 12481, 12475, 12531, 12488, 12479, 12441, 12540, 12473, 12486, - 12441, 12471, 12488, 12441, 12523, 12488, 12531, 12490, 12494, - 12494, 12483, 12488, 12495, 12452, 12484, 12495, 12442, 12540, - 12475, 12531, 12488, 12495, 12442, 12540, 12484, 12495, 12441, - 12540, 12524, 12523, 12498, 12442, 12450, 12473, 12488, 12523, - 12498, 12442, 12463, 12523, 12498, 12442, 12467, 12498, 12441, - 12523, 12501, 12449, 12521, 12483, 12488, 12441, 12501, 12451, - 12540, 12488, 12501, 12441, 12483, 12471, 12455, 12523, 12501, - 12521, 12531, 12504, 12463, 12479, 12540, 12523, 12504, 12442, - 12477, 12504, 12442, 12491, 12498, 12504, 12523, 12484, 12504, - 12442, 12531, 12473, 12504, 12442, 12540, 12471, 12441, 12504, - 12441, 12540, 12479, 12507, 12442, 12452, 12531, 12488, 12507, - 12441, 12523, 12488, 12507, 12531, 12507, 12442, 12531, 12488, - 12441, 12507, 12540, 12523, 12507, 12540, 12531, 12510, 12452, - 12463, 12525, 12510, 12452, 12523, 12510, 12483, 12495, 12510, - 12523, 12463, 12510, 12531, 12471, 12519, 12531, 12511, 12463, - 12525, 12531, 12511, 12522, 12511, 12522, 12495, 12441, 12540, - 12523, 12513, 12459, 12441, 12513, 12459, 12441, 12488, 12531, - 12513, 12540, 12488, 12523, 12516, 12540, 12488, 12441, 12516, - 12540, 12523, 12518, 12450, 12531, 12522, 12483, 12488, 12523, - 12522, 12521, 12523, 12498, 12442, 12540, 12523, 12540, 12501, - 12441, 12523, 12524, 12512, 12524, 12531, 12488, 12465, 12441, - 12531, 12527, 12483, 12488, 48, 28857, 49, 28857, 50, - 28857, 51, 28857, 52, 28857, 53, 28857, 54, 28857, - 55, 28857, 56, 28857, 57, 28857, 49, 48, 28857, - 49, 49, 28857, 49, 50, 28857, 49, 51, 28857, - 49, 52, 28857, 49, 53, 28857, 49, 54, 28857, - 49, 55, 28857, 49, 56, 28857, 49, 57, 28857, - 50, 48, 28857, 50, 49, 28857, 50, 50, 28857, - 50, 51, 28857, 50, 52, 28857, 104, 80, 97, - 100, 97, 65, 85, 98, 97, 114, 111, 86, - 112, 99, 100, 109, 100, 109, 50, 100, 109, - 51, 73, 85, 24179, 25104, 26157, 21644, 22823, 27491, - 26126, 27835, 26666, 24335, 20250, 31038, 112, 65, 110, - 65, 956, 65, 109, 65, 107, 65, 75, 66, - 77, 66, 71, 66, 99, 97, 108, 107, 99, - 97, 108, 112, 70, 110, 70, 956, 70, 956, - 103, 109, 103, 107, 103, 72, 122, 107, 72, - 122, 77, 72, 122, 71, 72, 122, 84, 72, - 122, 956, 108, 109, 108, 100, 108, 107, 108, - 102, 109, 110, 109, 956, 109, 109, 109, 99, - 109, 107, 109, 109, 109, 50, 99, 109, 50, - 109, 50, 107, 109, 50, 109, 109, 51, 99, - 109, 51, 109, 51, 107, 109, 51, 109, 8725, - 115, 109, 8725, 115, 50, 80, 97, 107, 80, - 97, 77, 80, 97, 71, 80, 97, 114, 97, - 100, 114, 97, 100, 8725, 115, 114, 97, 100, - 8725, 115, 50, 112, 115, 110, 115, 956, 115, - 109, 115, 112, 86, 110, 86, 956, 86, 109, - 86, 107, 86, 77, 86, 112, 87, 110, 87, - 956, 87, 109, 87, 107, 87, 77, 87, 107, - 937, 77, 937, 97, 46, 109, 46, 66, 113, - 99, 99, 99, 100, 67, 8725, 107, 103, 67, - 111, 46, 100, 66, 71, 121, 104, 97, 72, - 80, 105, 110, 75, 75, 75, 77, 107, 116, - 108, 109, 108, 110, 108, 111, 103, 108, 120, - 109, 98, 109, 105, 108, 109, 111, 108, 80, - 72, 112, 46, 109, 46, 80, 80, 77, 80, - 82, 115, 114, 83, 118, 87, 98, 86, 8725, - 109, 65, 8725, 109, 49, 26085, 50, 26085, 51, - 26085, 52, 26085, 53, 26085, 54, 26085, 55, 26085, - 56, 26085, 57, 26085, 49, 48, 26085, 49, 49, - 26085, 49, 50, 26085, 49, 51, 26085, 49, 52, - 26085, 49, 53, 26085, 49, 54, 26085, 49, 55, - 26085, 49, 56, 26085, 49, 57, 26085, 50, 48, - 26085, 50, 49, 26085, 50, 50, 26085, 50, 51, - 26085, 50, 52, 26085, 50, 53, 26085, 50, 54, - 26085, 50, 55, 26085, 50, 56, 26085, 50, 57, - 26085, 51, 48, 26085, 51, 49, 26085, 103, 97, - 108, 1098, 1100, 42863, 67, 70, 81, 294, 339, - 42791, 43831, 619, 43858, 653, 35912, 26356, 36554, 36040, - 28369, 20018, 21477, 40860, 40860, 22865, 37329, 21895, 22856, - 25078, 30313, 32645, 34367, 34746, 35064, 37007, 27138, 27931, - 28889, 29662, 33853, 37226, 39409, 20098, 21365, 27396, 29211, - 34349, 40478, 23888, 28651, 34253, 35172, 25289, 33240, 34847, - 24266, 26391, 28010, 29436, 37070, 20358, 20919, 21214, 25796, - 27347, 29200, 30439, 32769, 34310, 34396, 36335, 38706, 39791, - 40442, 30860, 31103, 32160, 33737, 37636, 40575, 35542, 22751, - 24324, 31840, 32894, 29282, 30922, 36034, 38647, 22744, 23650, - 27155, 28122, 28431, 32047, 32311, 38475, 21202, 32907, 20956, - 20940, 31260, 32190, 33777, 38517, 35712, 25295, 27138, 35582, - 20025, 23527, 24594, 29575, 30064, 21271, 30971, 20415, 24489, - 19981, 27852, 25976, 32034, 21443, 22622, 30465, 33865, 35498, - 27578, 36784, 27784, 25342, 33509, 25504, 30053, 20142, 20841, - 20937, 26753, 31975, 33391, 35538, 37327, 21237, 21570, 22899, - 24300, 26053, 28670, 31018, 38317, 39530, 40599, 40654, 21147, - 26310, 27511, 36706, 24180, 24976, 25088, 25754, 28451, 29001, - 29833, 31178, 32244, 32879, 36646, 34030, 36899, 37706, 21015, - 21155, 21693, 28872, 35010, 35498, 24265, 24565, 25467, 27566, - 31806, 29557, 20196, 22265, 23527, 23994, 24604, 29618, 29801, - 32666, 32838, 37428, 38646, 38728, 38936, 20363, 31150, 37300, - 38584, 24801, 20102, 20698, 23534, 23615, 26009, 27138, 29134, - 30274, 34044, 36988, 40845, 26248, 38446, 21129, 26491, 26611, - 27969, 28316, 29705, 30041, 30827, 32016, 39006, 20845, 25134, - 38520, 20523, 23833, 28138, 36650, 24459, 24900, 26647, 29575, - 38534, 21033, 21519, 23653, 26131, 26446, 26792, 27877, 29702, - 30178, 32633, 35023, 35041, 37324, 38626, 21311, 28346, 21533, - 29136, 29848, 34298, 38563, 40023, 40607, 26519, 28107, 33256, - 31435, 31520, 31890, 29376, 28825, 35672, 20160, 33590, 21050, - 20999, 24230, 25299, 31958, 23429, 27934, 26292, 36667, 34892, - 38477, 35211, 24275, 20800, 21952, 22618, 26228, 20958, 29482, - 30410, 31036, 31070, 31077, 31119, 38742, 31934, 32701, 34322, - 35576, 36920, 37117, 39151, 39164, 39208, 40372, 37086, 38583, - 20398, 20711, 20813, 21193, 21220, 21329, 21917, 22022, 22120, - 22592, 22696, 23652, 23662, 24724, 24936, 24974, 25074, 25935, - 26082, 26257, 26757, 28023, 28186, 28450, 29038, 29227, 29730, - 30865, 31038, 31049, 31048, 31056, 31062, 31069, 31117, 31118, - 31296, 31361, 31680, 32244, 32265, 32321, 32626, 32773, 33261, - 33401, 33401, 33879, 35088, 35222, 35585, 35641, 36051, 36104, - 36790, 36920, 38627, 38911, 38971, 24693, 148206, 33304, 20006, - 20917, 20840, 20352, 20805, 20864, 21191, 21242, 21917, 21845, - 21913, 21986, 22618, 22707, 22852, 22868, 23138, 23336, 24274, - 24281, 24425, 24493, 24792, 24910, 24840, 24974, 24928, 25074, - 25140, 25540, 25628, 25682, 25942, 26228, 26391, 26395, 26454, - 27513, 27578, 27969, 28379, 28363, 28450, 28702, 29038, 30631, - 29237, 29359, 29482, 29809, 29958, 30011, 30237, 30239, 30410, - 30427, 30452, 30538, 30528, 30924, 31409, 31680, 31867, 32091, - 32244, 32574, 32773, 33618, 33775, 34681, 35137, 35206, 35222, - 35519, 35576, 35531, 35585, 35582, 35565, 35641, 35722, 36104, - 36664, 36978, 37273, 37494, 38524, 38627, 38742, 38875, 38911, - 38923, 38971, 39698, 40860, 141386, 141380, 144341, 15261, 16408, - 16441, 152137, 154832, 163539, 40771, 40846, 102, 102, 102, - 105, 102, 108, 102, 102, 105, 102, 102, 108, - 115, 116, 115, 116, 1396, 1398, 1396, 1381, 1396, - 1387, 1406, 1398, 1396, 1389, 1497, 1460, 1522, 1463, - 1506, 1488, 1491, 1492, 1499, 1500, 1501, 1512, 1514, - 43, 1513, 1473, 1513, 1474, 1513, 1468, 1473, 1513, - 1468, 1474, 1488, 1463, 1488, 1464, 1488, 1468, 1489, - 1468, 1490, 1468, 1491, 1468, 1492, 1468, 1493, 1468, - 1494, 1468, 1496, 1468, 1497, 1468, 1498, 1468, 1499, - 1468, 1500, 1468, 1502, 1468, 1504, 1468, 1505, 1468, - 1507, 1468, 1508, 1468, 1510, 1468, 1511, 1468, 1512, - 1468, 1513, 1468, 1514, 1468, 1493, 1465, 1489, 1471, - 1499, 1471, 1508, 1471, 1488, 1500, 1649, 1649, 1659, - 1659, 1659, 1659, 1662, 1662, 1662, 1662, 1664, 1664, - 1664, 1664, 1658, 1658, 1658, 1658, 1663, 1663, 1663, - 1663, 1657, 1657, 1657, 1657, 1700, 1700, 1700, 1700, - 1702, 1702, 1702, 1702, 1668, 1668, 1668, 1668, 1667, - 1667, 1667, 1667, 1670, 1670, 1670, 1670, 1671, 1671, - 1671, 1671, 1677, 1677, 1676, 1676, 1678, 1678, 1672, - 1672, 1688, 1688, 1681, 1681, 1705, 1705, 1705, 1705, - 1711, 1711, 1711, 1711, 1715, 1715, 1715, 1715, 1713, - 1713, 1713, 1713, 1722, 1722, 1723, 1723, 1723, 1723, - 1749, 1620, 1749, 1620, 1729, 1729, 1729, 1729, 1726, - 1726, 1726, 1726, 1746, 1746, 1746, 1620, 1746, 1620, - 1709, 1709, 1709, 1709, 1735, 1735, 1734, 1734, 1736, - 1736, 1735, 1652, 1739, 1739, 1733, 1733, 1737, 1737, - 1744, 1744, 1744, 1744, 1609, 1609, 1610, 1620, 1575, - 1610, 1620, 1575, 1610, 1620, 1749, 1610, 1620, 1749, - 1610, 1620, 1608, 1610, 1620, 1608, 1610, 1620, 1735, - 1610, 1620, 1735, 1610, 1620, 1734, 1610, 1620, 1734, - 1610, 1620, 1736, 1610, 1620, 1736, 1610, 1620, 1744, - 1610, 1620, 1744, 1610, 1620, 1744, 1610, 1620, 1609, - 1610, 1620, 1609, 1610, 1620, 1609, 1740, 1740, 1740, - 1740, 1610, 1620, 1580, 1610, 1620, 1581, 1610, 1620, - 1605, 1610, 1620, 1609, 1610, 1620, 1610, 1576, 1580, - 1576, 1581, 1576, 1582, 1576, 1605, 1576, 1609, 1576, - 1610, 1578, 1580, 1578, 1581, 1578, 1582, 1578, 1605, - 1578, 1609, 1578, 1610, 1579, 1580, 1579, 1605, 1579, - 1609, 1579, 1610, 1580, 1581, 1580, 1605, 1581, 1580, - 1581, 1605, 1582, 1580, 1582, 1581, 1582, 1605, 1587, - 1580, 1587, 1581, 1587, 1582, 1587, 1605, 1589, 1581, - 1589, 1605, 1590, 1580, 1590, 1581, 1590, 1582, 1590, - 1605, 1591, 1581, 1591, 1605, 1592, 1605, 1593, 1580, - 1593, 1605, 1594, 1580, 1594, 1605, 1601, 1580, 1601, - 1581, 1601, 1582, 1601, 1605, 1601, 1609, 1601, 1610, - 1602, 1581, 1602, 1605, 1602, 1609, 1602, 1610, 1603, - 1575, 1603, 1580, 1603, 1581, 1603, 1582, 1603, 1604, - 1603, 1605, 1603, 1609, 1603, 1610, 1604, 1580, 1604, - 1581, 1604, 1582, 1604, 1605, 1604, 1609, 1604, 1610, - 1605, 1580, 1605, 1581, 1605, 1582, 1605, 1605, 1605, - 1609, 1605, 1610, 1606, 1580, 1606, 1581, 1606, 1582, - 1606, 1605, 1606, 1609, 1606, 1610, 1607, 1580, 1607, - 1605, 1607, 1609, 1607, 1610, 1610, 1580, 1610, 1581, - 1610, 1582, 1610, 1605, 1610, 1609, 1610, 1610, 1584, - 1648, 1585, 1648, 1609, 1648, 32, 1612, 1617, 32, - 1613, 1617, 32, 1614, 1617, 32, 1615, 1617, 32, - 1616, 1617, 32, 1617, 1648, 1610, 1620, 1585, 1610, - 1620, 1586, 1610, 1620, 1605, 1610, 1620, 1606, 1610, - 1620, 1609, 1610, 1620, 1610, 1576, 1585, 1576, 1586, - 1576, 1605, 1576, 1606, 1576, 1609, 1576, 1610, 1578, - 1585, 1578, 1586, 1578, 1605, 1578, 1606, 1578, 1609, - 1578, 1610, 1579, 1585, 1579, 1586, 1579, 1605, 1579, - 1606, 1579, 1609, 1579, 1610, 1601, 1609, 1601, 1610, - 1602, 1609, 1602, 1610, 1603, 1575, 1603, 1604, 1603, - 1605, 1603, 1609, 1603, 1610, 1604, 1605, 1604, 1609, - 1604, 1610, 1605, 1575, 1605, 1605, 1606, 1585, 1606, - 1586, 1606, 1605, 1606, 1606, 1606, 1609, 1606, 1610, - 1609, 1648, 1610, 1585, 1610, 1586, 1610, 1605, 1610, - 1606, 1610, 1609, 1610, 1610, 1610, 1620, 1580, 1610, - 1620, 1581, 1610, 1620, 1582, 1610, 1620, 1605, 1610, - 1620, 1607, 1576, 1580, 1576, 1581, 1576, 1582, 1576, - 1605, 1576, 1607, 1578, 1580, 1578, 1581, 1578, 1582, - 1578, 1605, 1578, 1607, 1579, 1605, 1580, 1581, 1580, - 1605, 1581, 1580, 1581, 1605, 1582, 1580, 1582, 1605, - 1587, 1580, 1587, 1581, 1587, 1582, 1587, 1605, 1589, - 1581, 1589, 1582, 1589, 1605, 1590, 1580, 1590, 1581, - 1590, 1582, 1590, 1605, 1591, 1581, 1592, 1605, 1593, - 1580, 1593, 1605, 1594, 1580, 1594, 1605, 1601, 1580, - 1601, 1581, 1601, 1582, 1601, 1605, 1602, 1581, 1602, - 1605, 1603, 1580, 1603, 1581, 1603, 1582, 1603, 1604, - 1603, 1605, 1604, 1580, 1604, 1581, 1604, 1582, 1604, - 1605, 1604, 1607, 1605, 1580, 1605, 1581, 1605, 1582, - 1605, 1605, 1606, 1580, 1606, 1581, 1606, 1582, 1606, - 1605, 1606, 1607, 1607, 1580, 1607, 1605, 1607, 1648, - 1610, 1580, 1610, 1581, 1610, 1582, 1610, 1605, 1610, - 1607, 1610, 1620, 1605, 1610, 1620, 1607, 1576, 1605, - 1576, 1607, 1578, 1605, 1578, 1607, 1579, 1605, 1579, - 1607, 1587, 1605, 1587, 1607, 1588, 1605, 1588, 1607, - 1603, 1604, 1603, 1605, 1604, 1605, 1606, 1605, 1606, - 1607, 1610, 1605, 1610, 1607, 1600, 1614, 1617, 1600, - 1615, 1617, 1600, 1616, 1617, 1591, 1609, 1591, 1610, - 1593, 1609, 1593, 1610, 1594, 1609, 1594, 1610, 1587, - 1609, 1587, 1610, 1588, 1609, 1588, 1610, 1581, 1609, - 1581, 1610, 1580, 1609, 1580, 1610, 1582, 1609, 1582, - 1610, 1589, 1609, 1589, 1610, 1590, 1609, 1590, 1610, - 1588, 1580, 1588, 1581, 1588, 1582, 1588, 1605, 1588, - 1585, 1587, 1585, 1589, 1585, 1590, 1585, 1591, 1609, - 1591, 1610, 1593, 1609, 1593, 1610, 1594, 1609, 1594, - 1610, 1587, 1609, 1587, 1610, 1588, 1609, 1588, 1610, - 1581, 1609, 1581, 1610, 1580, 1609, 1580, 1610, 1582, - 1609, 1582, 1610, 1589, 1609, 1589, 1610, 1590, 1609, - 1590, 1610, 1588, 1580, 1588, 1581, 1588, 1582, 1588, - 1605, 1588, 1585, 1587, 1585, 1589, 1585, 1590, 1585, - 1588, 1580, 1588, 1581, 1588, 1582, 1588, 1605, 1587, - 1607, 1588, 1607, 1591, 1605, 1587, 1580, 1587, 1581, - 1587, 1582, 1588, 1580, 1588, 1581, 1588, 1582, 1591, - 1605, 1592, 1605, 1575, 1611, 1575, 1611, 1578, 1580, - 1605, 1578, 1581, 1580, 1578, 1581, 1580, 1578, 1581, - 1605, 1578, 1582, 1605, 1578, 1605, 1580, 1578, 1605, - 1581, 1578, 1605, 1582, 1580, 1605, 1581, 1580, 1605, - 1581, 1581, 1605, 1610, 1581, 1605, 1609, 1587, 1581, - 1580, 1587, 1580, 1581, 1587, 1580, 1609, 1587, 1605, - 1581, 1587, 1605, 1581, 1587, 1605, 1580, 1587, 1605, - 1605, 1587, 1605, 1605, 1589, 1581, 1581, 1589, 1581, - 1581, 1589, 1605, 1605, 1588, 1581, 1605, 1588, 1581, - 1605, 1588, 1580, 1610, 1588, 1605, 1582, 1588, 1605, - 1582, 1588, 1605, 1605, 1588, 1605, 1605, 1590, 1581, - 1609, 1590, 1582, 1605, 1590, 1582, 1605, 1591, 1605, - 1581, 1591, 1605, 1581, 1591, 1605, 1605, 1591, 1605, - 1610, 1593, 1580, 1605, 1593, 1605, 1605, 1593, 1605, - 1605, 1593, 1605, 1609, 1594, 1605, 1605, 1594, 1605, - 1610, 1594, 1605, 1609, 1601, 1582, 1605, 1601, 1582, - 1605, 1602, 1605, 1581, 1602, 1605, 1605, 1604, 1581, - 1605, 1604, 1581, 1610, 1604, 1581, 1609, 1604, 1580, - 1580, 1604, 1580, 1580, 1604, 1582, 1605, 1604, 1582, - 1605, 1604, 1605, 1581, 1604, 1605, 1581, 1605, 1581, - 1580, 1605, 1581, 1605, 1605, 1581, 1610, 1605, 1580, - 1581, 1605, 1580, 1605, 1605, 1582, 1580, 1605, 1582, - 1605, 1605, 1580, 1582, 1607, 1605, 1580, 1607, 1605, - 1605, 1606, 1581, 1605, 1606, 1581, 1609, 1606, 1580, - 1605, 1606, 1580, 1605, 1606, 1580, 1609, 1606, 1605, - 1610, 1606, 1605, 1609, 1610, 1605, 1605, 1610, 1605, - 1605, 1576, 1582, 1610, 1578, 1580, 1610, 1578, 1580, - 1609, 1578, 1582, 1610, 1578, 1582, 1609, 1578, 1605, - 1610, 1578, 1605, 1609, 1580, 1605, 1610, 1580, 1581, - 1609, 1580, 1605, 1609, 1587, 1582, 1609, 1589, 1581, - 1610, 1588, 1581, 1610, 1590, 1581, 1610, 1604, 1580, - 1610, 1604, 1605, 1610, 1610, 1581, 1610, 1610, 1580, - 1610, 1610, 1605, 1610, 1605, 1605, 1610, 1602, 1605, - 1610, 1606, 1581, 1610, 1602, 1605, 1581, 1604, 1581, - 1605, 1593, 1605, 1610, 1603, 1605, 1610, 1606, 1580, - 1581, 1605, 1582, 1610, 1604, 1580, 1605, 1603, 1605, - 1605, 1604, 1580, 1605, 1606, 1580, 1581, 1580, 1581, - 1610, 1581, 1580, 1610, 1605, 1580, 1610, 1601, 1605, - 1610, 1576, 1581, 1610, 1603, 1605, 1605, 1593, 1580, - 1605, 1589, 1605, 1605, 1587, 1582, 1610, 1606, 1580, - 1610, 1589, 1604, 1746, 1602, 1604, 1746, 1575, 1604, - 1604, 1607, 1575, 1603, 1576, 1585, 1605, 1581, 1605, - 1583, 1589, 1604, 1593, 1605, 1585, 1587, 1608, 1604, - 1593, 1604, 1610, 1607, 1608, 1587, 1604, 1605, 1589, - 1604, 1609, 1589, 1604, 1609, 32, 1575, 1604, 1604, - 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, - 1604, 1605, 1580, 1604, 32, 1580, 1604, 1575, 1604, - 1607, 1585, 1740, 1575, 1604, 44, 12289, 12290, 58, - 59, 33, 63, 12310, 12311, 46, 46, 46, 46, - 46, 8212, 8211, 95, 95, 40, 41, 123, 125, - 12308, 12309, 12304, 12305, 12298, 12299, 12296, 12297, 12300, - 12301, 12302, 12303, 91, 93, 32, 773, 32, 773, - 32, 773, 32, 773, 95, 95, 95, 44, 12289, - 46, 59, 58, 63, 33, 8212, 40, 41, 123, - 125, 12308, 12309, 35, 38, 42, 43, 45, 60, - 62, 61, 92, 36, 37, 64, 32, 1611, 1600, - 1611, 32, 1612, 32, 1613, 32, 1614, 1600, 1614, - 32, 1615, 1600, 1615, 32, 1616, 1600, 1616, 32, - 1617, 1600, 1617, 32, 1618, 1600, 1618, 1569, 1575, - 1619, 1575, 1619, 1575, 1620, 1575, 1620, 1608, 1620, - 1608, 1620, 1575, 1621, 1575, 1621, 1610, 1620, 1610, - 1620, 1610, 1620, 1610, 1620, 1575, 1575, 1576, 1576, - 1576, 1576, 1577, 1577, 1578, 1578, 1578, 1578, 1579, - 1579, 1579, 1579, 1580, 1580, 1580, 1580, 1581, 1581, - 1581, 1581, 1582, 1582, 1582, 1582, 1583, 1583, 1584, - 1584, 1585, 1585, 1586, 1586, 1587, 1587, 1587, 1587, - 1588, 1588, 1588, 1588, 1589, 1589, 1589, 1589, 1590, - 1590, 1590, 1590, 1591, 1591, 1591, 1591, 1592, 1592, - 1592, 1592, 1593, 1593, 1593, 1593, 1594, 1594, 1594, - 1594, 1601, 1601, 1601, 1601, 1602, 1602, 1602, 1602, - 1603, 1603, 1603, 1603, 1604, 1604, 1604, 1604, 1605, - 1605, 1605, 1605, 1606, 1606, 1606, 1606, 1607, 1607, - 1607, 1607, 1608, 1608, 1609, 1609, 1610, 1610, 1610, - 1610, 1604, 1575, 1619, 1604, 1575, 1619, 1604, 1575, - 1620, 1604, 1575, 1620, 1604, 1575, 1621, 1604, 1575, - 1621, 1604, 1575, 1604, 1575, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, - 10629, 10630, 12290, 12300, 12301, 12289, 12539, 12530, 12449, - 12451, 12453, 12455, 12457, 12515, 12517, 12519, 12483, 12540, - 12450, 12452, 12454, 12456, 12458, 12459, 12461, 12463, 12465, - 12467, 12469, 12471, 12473, 12475, 12477, 12479, 12481, 12484, - 12486, 12488, 12490, 12491, 12492, 12493, 12494, 12495, 12498, - 12501, 12504, 12507, 12510, 12511, 12512, 12513, 12514, 12516, - 12518, 12520, 12521, 12522, 12523, 12524, 12525, 12527, 12531, - 12441, 12442, 4448, 4352, 4353, 4522, 4354, 4524, 4525, - 4355, 4356, 4357, 4528, 4529, 4530, 4531, 4532, 4533, - 4378, 4358, 4359, 4360, 4385, 4361, 4362, 4363, 4364, - 4365, 4366, 4367, 4368, 4369, 4370, 4449, 4450, 4451, - 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, - 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, - 162, 163, 172, 32, 772, 166, 165, 8361, 9474, - 8592, 8593, 8594, 8595, 9632, 9675, 720, 721, 230, - 665, 595, 675, 43878, 677, 676, 598, 599, 7569, - 600, 606, 681, 612, 610, 608, 667, 295, 668, - 615, 644, 682, 683, 620, 122628, 42894, 622, 122629, - 654, 122630, 248, 630, 631, 113, 634, 122632, 637, - 638, 640, 680, 678, 43879, 679, 648, 11377, 655, - 673, 674, 664, 448, 449, 450, 122634, 122654, 69785, - 69818, 69787, 69818, 69797, 69818, 69937, 69927, 69938, 69927, - 70471, 70462, 70471, 70487, 70841, 70842, 70841, 70832, 70841, - 70845, 71096, 71087, 71097, 71087, 71989, 71984, 119127, 119141, - 119128, 119141, 119128, 119141, 119150, 119128, 119141, 119151, 119128, - 119141, 119152, 119128, 119141, 119153, 119128, 119141, 119154, 119225, - 119141, 119226, 119141, 119225, 119141, 119150, 119226, 119141, 119150, - 119225, 119141, 119151, 119226, 119141, 119151, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 97, 98, 99, 100, 101, 102, - 103, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, - 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 65, - 67, 68, 71, 74, 75, 78, 79, 80, 81, - 83, 84, 85, 86, 87, 88, 89, 90, 97, - 98, 99, 100, 102, 104, 105, 106, 107, 108, - 109, 110, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 65, 66, 68, 69, 70, 71, 74, - 75, 76, 77, 78, 79, 80, 81, 83, 84, - 85, 86, 87, 88, 89, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 65, 66, 68, 69, 70, - 71, 73, 74, 75, 76, 77, 79, 83, 84, - 85, 86, 87, 88, 89, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, - 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 305, 567, 913, 914, 915, 916, 917, 918, - 919, 920, 921, 922, 923, 924, 925, 926, 927, - 928, 929, 920, 931, 932, 933, 934, 935, 936, - 937, 8711, 945, 946, 947, 948, 949, 950, 951, - 952, 953, 954, 955, 956, 957, 958, 959, 960, - 961, 962, 963, 964, 965, 966, 967, 968, 969, - 8706, 949, 952, 954, 966, 961, 960, 913, 914, - 915, 916, 917, 918, 919, 920, 921, 922, 923, - 924, 925, 926, 927, 928, 929, 920, 931, 932, - 933, 934, 935, 936, 937, 8711, 945, 946, 947, - 948, 949, 950, 951, 952, 953, 954, 955, 956, - 957, 958, 959, 960, 961, 962, 963, 964, 965, - 966, 967, 968, 969, 8706, 949, 952, 954, 966, - 961, 960, 913, 914, 915, 916, 917, 918, 919, - 920, 921, 922, 923, 924, 925, 926, 927, 928, - 929, 920, 931, 932, 933, 934, 935, 936, 937, - 8711, 945, 946, 947, 948, 949, 950, 951, 952, - 953, 954, 955, 956, 957, 958, 959, 960, 961, - 962, 963, 964, 965, 966, 967, 968, 969, 8706, - 949, 952, 954, 966, 961, 960, 913, 914, 915, - 916, 917, 918, 919, 920, 921, 922, 923, 924, - 925, 926, 927, 928, 929, 920, 931, 932, 933, - 934, 935, 936, 937, 8711, 945, 946, 947, 948, - 949, 950, 951, 952, 953, 954, 955, 956, 957, - 958, 959, 960, 961, 962, 963, 964, 965, 966, - 967, 968, 969, 8706, 949, 952, 954, 966, 961, - 960, 913, 914, 915, 916, 917, 918, 919, 920, - 921, 922, 923, 924, 925, 926, 927, 928, 929, - 920, 931, 932, 933, 934, 935, 936, 937, 8711, - 945, 946, 947, 948, 949, 950, 951, 952, 953, - 954, 955, 956, 957, 958, 959, 960, 961, 962, - 963, 964, 965, 966, 967, 968, 969, 8706, 949, - 952, 954, 966, 961, 960, 988, 989, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, - 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 1072, 1073, 1074, 1075, 1076, 1077, - 1078, 1079, 1080, 1082, 1083, 1084, 1086, 1087, 1088, - 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1099, - 1101, 1102, 42633, 1241, 1110, 1112, 1257, 1199, 1231, - 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, - 1082, 1083, 1086, 1087, 1089, 1091, 1092, 1093, 1094, - 1095, 1096, 1098, 1099, 1169, 1110, 1109, 1119, 1195, - 42577, 1201, 1575, 1576, 1580, 1583, 1608, 1586, 1581, - 1591, 1610, 1603, 1604, 1605, 1606, 1587, 1593, 1601, - 1589, 1602, 1585, 1588, 1578, 1579, 1582, 1584, 1590, - 1592, 1594, 1646, 1722, 1697, 1647, 1576, 1580, 1607, - 1581, 1610, 1603, 1604, 1605, 1606, 1587, 1593, 1601, - 1589, 1602, 1588, 1578, 1579, 1582, 1590, 1594, 1580, - 1581, 1610, 1604, 1606, 1587, 1593, 1589, 1602, 1588, - 1582, 1590, 1594, 1722, 1647, 1576, 1580, 1607, 1581, - 1591, 1610, 1603, 1605, 1606, 1587, 1593, 1601, 1589, - 1602, 1588, 1578, 1579, 1582, 1590, 1592, 1594, 1646, - 1697, 1575, 1576, 1580, 1583, 1607, 1608, 1586, 1581, - 1591, 1610, 1604, 1605, 1606, 1587, 1593, 1601, 1589, - 1602, 1585, 1588, 1578, 1579, 1582, 1584, 1590, 1592, - 1594, 1576, 1580, 1583, 1608, 1586, 1581, 1591, 1610, - 1604, 1605, 1606, 1587, 1593, 1601, 1589, 1602, 1585, - 1588, 1578, 1579, 1582, 1584, 1590, 1592, 1594, 48, - 46, 48, 44, 49, 44, 50, 44, 51, 44, - 52, 44, 53, 44, 54, 44, 55, 44, 56, - 44, 57, 44, 40, 65, 41, 40, 66, 41, - 40, 67, 41, 40, 68, 41, 40, 69, 41, - 40, 70, 41, 40, 71, 41, 40, 72, 41, - 40, 73, 41, 40, 74, 41, 40, 75, 41, - 40, 76, 41, 40, 77, 41, 40, 78, 41, - 40, 79, 41, 40, 80, 41, 40, 81, 41, - 40, 82, 41, 40, 83, 41, 40, 84, 41, - 40, 85, 41, 40, 86, 41, 40, 87, 41, - 40, 88, 41, 40, 89, 41, 40, 90, 41, - 12308, 83, 12309, 67, 82, 67, 68, 87, 90, - 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 72, - 86, 77, 86, 83, 68, 83, 83, 80, 80, - 86, 87, 67, 77, 67, 77, 68, 77, 82, - 68, 74, 12411, 12363, 12467, 12467, 12469, 25163, 23383, - 21452, 12486, 12441, 20108, 22810, 35299, 22825, 20132, 26144, - 28961, 26009, 21069, 24460, 20877, 26032, 21021, 32066, 29983, - 36009, 22768, 21561, 28436, 25237, 25429, 19968, 19977, 36938, - 24038, 20013, 21491, 25351, 36208, 25171, 31105, 31354, 21512, - 28288, 26377, 26376, 30003, 21106, 21942, 37197, 12308, 26412, - 12309, 12308, 19977, 12309, 12308, 20108, 12309, 12308, 23433, - 12309, 12308, 28857, 12309, 12308, 25171, 12309, 12308, 30423, - 12309, 12308, 21213, 12309, 12308, 25943, 12309, 24471, 21487, - 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 20029, 20024, 20033, 131362, 20320, 20398, 20411, 20482, - 20602, 20633, 20711, 20687, 13470, 132666, 20813, 20820, 20836, - 20855, 132380, 13497, 20839, 20877, 132427, 20887, 20900, 20172, - 20908, 20917, 168415, 20981, 20995, 13535, 21051, 21062, 21106, - 21111, 13589, 21191, 21193, 21220, 21242, 21253, 21254, 21271, - 21321, 21329, 21338, 21363, 21373, 21375, 21375, 21375, 133676, - 28784, 21450, 21471, 133987, 21483, 21489, 21510, 21662, 21560, - 21576, 21608, 21666, 21750, 21776, 21843, 21859, 21892, 21892, - 21913, 21931, 21939, 21954, 22294, 22022, 22295, 22097, 22132, - 20999, 22766, 22478, 22516, 22541, 22411, 22578, 22577, 22700, - 136420, 22770, 22775, 22790, 22810, 22818, 22882, 136872, 136938, - 23020, 23067, 23079, 23000, 23142, 14062, 14076, 23304, 23358, - 23358, 137672, 23491, 23512, 23527, 23539, 138008, 23551, 23558, - 24403, 23586, 14209, 23648, 23662, 23744, 23693, 138724, 23875, - 138726, 23918, 23915, 23932, 24033, 24034, 14383, 24061, 24104, - 24125, 24169, 14434, 139651, 14460, 24240, 24243, 24246, 24266, - 172946, 24318, 140081, 140081, 33281, 24354, 24354, 14535, 144056, - 156122, 24418, 24427, 14563, 24474, 24525, 24535, 24569, 24705, - 14650, 14620, 24724, 141012, 24775, 24904, 24908, 24910, 24908, - 24954, 24974, 25010, 24996, 25007, 25054, 25074, 25078, 25104, - 25115, 25181, 25265, 25300, 25424, 142092, 25405, 25340, 25448, - 25475, 25572, 142321, 25634, 25541, 25513, 14894, 25705, 25726, - 25757, 25719, 14956, 25935, 25964, 143370, 26083, 26360, 26185, - 15129, 26257, 15112, 15076, 20882, 20885, 26368, 26268, 32941, - 17369, 26391, 26395, 26401, 26462, 26451, 144323, 15177, 26618, - 26501, 26706, 26757, 144493, 26766, 26655, 26900, 15261, 26946, - 27043, 27114, 27304, 145059, 27355, 15384, 27425, 145575, 27476, - 15438, 27506, 27551, 27578, 27579, 146061, 138507, 146170, 27726, - 146620, 27839, 27853, 27751, 27926, 27966, 28023, 27969, 28009, - 28024, 28037, 146718, 27956, 28207, 28270, 15667, 28363, 28359, - 147153, 28153, 28526, 147294, 147342, 28614, 28729, 28702, 28699, - 15766, 28746, 28797, 28791, 28845, 132389, 28997, 148067, 29084, - 148395, 29224, 29237, 29264, 149000, 29312, 29333, 149301, 149524, - 29562, 29579, 16044, 29605, 16056, 16056, 29767, 29788, 29809, - 29829, 29898, 16155, 29988, 150582, 30014, 150674, 30064, 139679, - 30224, 151457, 151480, 151620, 16380, 16392, 30452, 151795, 151794, - 151833, 151859, 30494, 30495, 30495, 30538, 16441, 30603, 16454, - 16534, 152605, 30798, 30860, 30924, 16611, 153126, 31062, 153242, - 153285, 31119, 31211, 16687, 31296, 31306, 31311, 153980, 154279, - 154279, 31470, 16898, 154539, 31686, 31689, 16935, 154752, 31954, - 17056, 31976, 31971, 32000, 155526, 32099, 17153, 32199, 32258, - 32325, 17204, 156200, 156231, 17241, 156377, 32634, 156478, 32661, - 32762, 32773, 156890, 156963, 32864, 157096, 32880, 144223, 17365, - 32946, 33027, 17419, 33086, 23221, 157607, 157621, 144275, 144284, - 33281, 33284, 36766, 17515, 33425, 33419, 33437, 21171, 33457, - 33459, 33469, 33510, 158524, 33509, 33565, 33635, 33709, 33571, - 33725, 33767, 33879, 33619, 33738, 33740, 33756, 158774, 159083, - 158933, 17707, 34033, 34035, 34070, 160714, 34148, 159532, 17757, - 17761, 159665, 159954, 17771, 34384, 34396, 34407, 34409, 34473, - 34440, 34574, 34530, 34681, 34600, 34667, 34694, 17879, 34785, - 34817, 17913, 34912, 34915, 161383, 35031, 35038, 17973, 35066, - 13499, 161966, 162150, 18110, 18119, 35488, 35565, 35722, 35925, - 162984, 36011, 36033, 36123, 36215, 163631, 133124, 36299, 36284, - 36336, 133342, 36564, 36664, 165330, 165357, 37012, 37105, 37137, - 165678, 37147, 37432, 37591, 37592, 37500, 37881, 37909, 166906, - 38283, 18837, 38327, 167287, 18918, 38595, 23986, 38691, 168261, - 168474, 19054, 19062, 38880, 168970, 19122, 169110, 38923, 38923, - 38953, 169398, 39138, 19251, 39209, 39335, 39362, 39422, 19406, - 170800, 39698, 40000, 40189, 19662, 19693, 40295, 172238, 19704, - 172293, 172558, 172689, 40635, 19798, 40697, 40702, 40709, 40719, - 40726, 40763, 173568}; - -const uint8_t canonical_combining_class_index[4352] = { - 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 0, - 15, 0, 0, 0, 16, 17, 18, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 25, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 28, 29, 30, - 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 32, 0, 0, 33, 0, 0, 34, 35, 36, 0, 0, 0, 0, 0, 0, - 37, 0, 0, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 52, - 53, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 55, 56, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 61, 56, 62, 0, 63, 0, 0, 0, 64, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}; -const uint8_t canonical_combining_class_block[67][256] = { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 232, 220, 220, 220, 220, 232, 216, 220, 220, - 220, 220, 220, 202, 202, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 1, 1, 1, 1, 1, 220, 220, 220, - 220, 230, 230, 230, 230, 230, 230, 230, 230, 240, 230, 220, 220, 220, 230, - 230, 230, 220, 220, 0, 230, 230, 230, 220, 220, 220, 220, 230, 232, 220, - 220, 230, 233, 234, 234, 233, 234, 234, 233, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, - 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 230, 230, 230, 230, - 220, 230, 230, 230, 222, 220, 230, 230, 230, 230, 230, 230, 220, 220, 220, - 220, 220, 220, 230, 230, 220, 230, 230, 222, 228, 230, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, - 0, 230, 220, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 230, 230, 230, 230, 230, 230, 230, 230, 30, 31, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 27, 28, 29, 30, 31, 32, 33, 34, 230, 230, 220, 220, 230, 230, 230, - 230, 230, 220, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 230, 230, - 230, 230, 220, 230, 0, 0, 230, 230, 0, 220, 230, 230, 220, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 220, 230, 230, 220, 230, 230, 220, 220, 220, 230, 220, - 220, 230, 220, 230, 230, 230, 220, 230, 220, 230, 220, 230, 220, 230, 230, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, - 230, 230, 220, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 0, 230, 230, 230, 0, 230, 230, 230, 230, - 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, - 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 230, 220, 220, 220, 230, 230, 230, 230, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 220, 220, 220, - 220, 220, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 0, 220, 230, 230, 220, 230, 230, 220, 230, 230, 230, 220, 220, 220, - 27, 28, 29, 230, 230, 230, 220, 230, 230, 220, 220, 230, 230, 230, 230, - 230}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 230, 220, 230, 230, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 103, 103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 118, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 122, 122, 122, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 220, 0, 216, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 132, 0, 0, 0, - 0, 0, 130, 130, 130, 130, 0, 0, 130, 0, 230, 230, 9, 0, 230, - 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 230, 220, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, - 230, 230, 230, 230, 230, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, - 230, 220, 220, 220, 220, 220, 220, 230, 230, 220, 0, 220, 220, 230, 230, - 220, 220, 230, 230, 230, 230, 230, 220, 230, 230, 230, 230, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 230, 230, 230, 230, 230, - 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, - 230, 0, 1, 220, 220, 220, 220, 220, 230, 230, 220, 220, 220, 220, 230, - 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 220, 0, 0, - 0, 0, 0, 0, 230, 0, 0, 0, 230, 230, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 220, - 230, 230, 230, 230, 230, 230, 230, 220, 230, 230, 234, 214, 220, 202, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 232, 228, 228, 220, 218, 230, 233, 220, 230, - 220}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 230, 1, 1, 230, 230, 230, 230, 1, 1, 1, 230, 230, 0, 0, 0, - 0, 230, 0, 0, 0, 1, 1, 230, 220, 230, 1, 1, 220, 220, 220, 220, - 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 218, 228, 232, 222, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, - 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, - 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 230, 230, 220, 0, 0, 230, 230, 0, 0, 0, 0, 0, - 230, 230, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 230, 230, 230, 230, 230, 230, 230, 220, 220, 220, 220, 220, 220, - 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 230, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 1, 220, 0, - 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, - 230, 230, 230, 220, 230, 220, 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 230, 220, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, - 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 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, 1, 1, 1, 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, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 216, 216, 1, 1, 1, 0, 0, 0, 226, 216, 216, - 216, 216, 216, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 220, 220, - 220, 220, 220, 0, 0, 230, 230, 230, 230, 230, 220, 220, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {230, 230, 230, 230, 230, 230, 230, 0, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 230, 230, 230, - 230, 230, 230, 230, 0, 230, 230, 0, 230, 230, 230, 230, 230, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 232, 220, 230, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 220, 220, 220, 220, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; - -const uint8_t composition_index[4352] = { - 0, 1, 2, 3, 4, 5, 6, 5, 5, 7, 5, 8, 9, 10, 5, 5, 11, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 12, 5, 5, 13, 14, 5, 15, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 17, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 18, 19, 5, 20, 21, 22, 5, 5, 5, 23, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}; -const uint16_t composition_block[67][257] = { - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 5, 7, 7, 7, 39, 45, 55, 67, 101, 103, 117, 131, 161, - 163, 173, 185, 191, 209, 241, 245, 245, 261, 275, 289, 327, 331, 343, 347, - 365, 377, 377, 377, 377, 377, 377, 377, 409, 415, 425, 437, 471, 473, 487, - 503, 531, 535, 545, 557, 563, 581, 613, 617, 617, 633, 647, 663, 701, 705, - 719, 723, 743, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, - 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, - 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, - 755, 755, 755, 755, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, - 769, 769, 771, 773, 777, 779, 779, 779, 787, 787, 787, 787, 787, 789, 789, - 789, 789, 789, 797, 803, 805, 805, 807, 807, 807, 807, 815, 815, 815, 815, - 815, 815, 823, 823, 825, 827, 831, 833, 833, 833, 841, 841, 841, 841, 841, - 843, 843, 843, 843, 843, 851, 857, 859, 859, 861, 861, 861, 861, 869, 869, - 869, 869}, - {869, 869, 869, 877, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, - 885, 885, 885, 885, 889, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, - 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, - 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, - 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, - 893, 893, 897, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, - 901, 903, 905, 905, 905, 905, 905, 907, 909, 909, 909, 909, 909, 909, 909, - 911, 913, 915, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, - 917, 917, 917, 917, 917, 917, 917, 917, 919, 919, 919, 919, 919, 919, 919, - 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, - 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 929, 939, 939, 939, - 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 949, 959, 959, 959, - 959, 959, 959, 959, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, - 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, - 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, - 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 963, 965, 965, 965, 965, - 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, - 965, 965}, - {965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, - 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, - 965, 965, 965, 965, 965, 965, 965, 965, 965, 967, 969, 971, 973, 973, 973, - 973, 973, 975, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979}, - {979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 993, 993, 993, 993, 1001, 1001, 1011, 1011, 1025, 1025, - 1025, 1025, 1025, 1025, 1033, 1033, 1035, 1035, 1035, 1035, 1047, 1047, - 1047, 1047, 1057, 1057, 1057, 1059, 1059, 1061, 1061, 1061, 1077, 1077, - 1077, 1077, 1085, 1085, 1097, 1097, 1113, 1113, 1113, 1113, 1113, 1113, - 1121, 1121, 1125, 1125, 1125, 1125, 1141, 1141, 1141, 1141, 1153, 1159, - 1165, 1165, 1165, 1167, 1167, 1167, 1167, 1171, 1171, 1171, 1171, 1171, - 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, - 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, - 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, - 1171, 1171, 1171, 1171, 1171}, - {1171, 1171, 1171, 1171, 1171, 1171, 1171, 1173, 1173, 1173, 1173, 1173, - 1173, 1173, 1173, 1173, 1173, 1177, 1177, 1177, 1179, 1179, 1185, 1189, - 1191, 1199, 1199, 1201, 1201, 1201, 1201, 1203, 1203, 1203, 1203, 1203, - 1211, 1211, 1211, 1211, 1213, 1213, 1213, 1213, 1215, 1215, 1217, 1217, - 1217, 1221, 1221, 1221, 1223, 1223, 1229, 1233, 1235, 1243, 1243, 1245, - 1245, 1245, 1245, 1247, 1247, 1247, 1247, 1247, 1255, 1255, 1255, 1255, - 1257, 1257, 1257, 1257, 1259, 1259, 1261, 1261, 1261, 1261, 1261, 1261, - 1261, 1261, 1261, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, - 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, - 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1265, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1269, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1273, 1275, 1275, 1275, 1275, 1275, 1275, - 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, - 1275, 1275, 1275, 1275, 1275}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, - 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, - 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, - 1275, 1275, 1275, 1275, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, - 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, - 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, - 1281, 1283, 1283, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1289, 1289, 1289, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291}, - {1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1293, 1293, 1293, 1293, 1293, 1293, 1293, - 1293, 1295, 1295, 1295, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301}, - {1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, - 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, - 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, - 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, - 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, - 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, - 1307, 1307, 1307, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, - 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, - 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, - 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, - 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1313, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315}, - {1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1325, 1325, 1325, 1325, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327}, - {1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1331, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1339, 1339, 1339, 1341, 1341, 1341, 1341, 1341, 1341, 1341, - 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, - 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, - 1341, 1341, 1341, 1341, 1341}, - {1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, - 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, - 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, - 1341, 1341, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343}, - {1343, 1343, 1343, 1343, 1343, 1343, 1345, 1345, 1347, 1347, 1349, 1349, - 1351, 1351, 1353, 1353, 1353, 1353, 1355, 1355, 1355, 1355, 1355, 1355, - 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, - 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, - 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1357, - 1357, 1359, 1359, 1361, 1363, 1363, 1363, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365}, - {1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1367, 1369, 1369, 1369, 1369, - 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, - 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, - 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1371, 1373, 1373, 1373, 1373, - 1373, 1373, 1373, 1375, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, - 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, - 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, - 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, - 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, - 1377, 1377, 1377, 1377, 1377, 1381, 1385, 1385, 1385, 1385, 1385, 1385, - 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, - 1385, 1385, 1385, 1385, 1385, 1387, 1389, 1389, 1389, 1389, 1389, 1389, - 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, - 1389, 1391, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393}, - {1393, 1401, 1409, 1411, 1413, 1415, 1417, 1419, 1421, 1429, 1437, 1439, - 1441, 1443, 1445, 1447, 1449, 1453, 1457, 1457, 1457, 1457, 1457, 1457, - 1457, 1461, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1473, 1481, 1483, - 1485, 1487, 1489, 1491, 1493, 1501, 1509, 1511, 1513, 1515, 1517, 1519, - 1521, 1527, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1539, 1545, 1545, - 1545, 1545, 1545, 1545, 1545, 1549, 1553, 1553, 1553, 1553, 1553, 1553, - 1553, 1557, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1567, 1573, 1573, - 1573, 1573, 1573, 1573, 1573, 1573, 1579, 1579, 1579, 1579, 1579, 1579, - 1579, 1587, 1595, 1597, 1599, 1601, 1603, 1605, 1607, 1615, 1623, 1625, - 1627, 1629, 1631, 1633, 1635, 1637, 1637, 1637, 1637, 1639, 1639, 1639, - 1639, 1639, 1639, 1639, 1639, 1641, 1641, 1641, 1641, 1641, 1641, 1641, - 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, - 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, - 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, - 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, - 1641, 1641, 1641, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, - 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1651, 1651, 1651, 1651, 1651, - 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, - 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, - 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, - 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1653, 1653, 1653, 1653, 1653, - 1653, 1653, 1653, 1659, 1659}, - {1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1661, 1661, 1663, 1663, 1665, 1665, 1665, 1665, 1665, 1665, 1665, - 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, - 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, - 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, - 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, - 1665, 1665, 1665, 1665, 1665, 1667, 1667, 1669, 1669, 1671, 1671, 1671, - 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, - 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, - 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, - 1671, 1671, 1671, 1671, 1671}, - {1671, 1671, 1671, 1671, 1673, 1673, 1673, 1673, 1673, 1675, 1675, 1675, - 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, - 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, - 1679, 1679, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, - 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, - 1681, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1685, 1685, 1687, 1687, - 1687, 1689, 1689, 1689, 1689, 1689, 1691, 1691, 1691, 1691, 1691, 1691, - 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, - 1691, 1691, 1693, 1693, 1693, 1695, 1697, 1697, 1697, 1697, 1697, 1697, - 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1699, 1701, 1701, 1701, 1703, - 1705, 1705, 1705, 1707, 1709, 1711, 1713, 1713, 1713, 1713, 1713, 1715, - 1717, 1717, 1717, 1719, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - 1721, 1721, 1723, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, - 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1727, 1727, 1727, 1727, 1727, - 1727, 1729, 1731, 1731, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1735, - 1737, 1739, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741}, - {1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1743, - 1743, 1743, 1743, 1743, 1745, 1745, 1747, 1747, 1749, 1749, 1751, 1751, - 1753, 1753, 1755, 1755, 1757, 1757, 1759, 1759, 1761, 1761, 1763, 1763, - 1765, 1765, 1767, 1767, 1767, 1769, 1769, 1771, 1771, 1773, 1773, 1773, - 1773, 1773, 1773, 1773, 1777, 1777, 1777, 1781, 1781, 1781, 1785, 1785, - 1785, 1789, 1789, 1789, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, - 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, - 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, - 1793, 1793, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1797, - 1797, 1797, 1797, 1797, 1799, 1799, 1801, 1801, 1803, 1803, 1805, 1805, - 1807, 1807, 1809, 1809, 1811, 1811, 1813, 1813, 1815, 1815, 1817, 1817, - 1819, 1819, 1821, 1821, 1821, 1823, 1823, 1825, 1825, 1827, 1827, 1827, - 1827, 1827, 1827, 1827, 1831, 1831, 1831, 1835, 1835, 1835, 1839, 1839, - 1839, 1843, 1843, 1843, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, - 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, - 1849, 1851, 1853, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, - 1855, 1855, 1857, 1857, 1857}, - {1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1859, 1859, - 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863}, - {1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1865, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867}, - {1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871}, - {1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877}, - {1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1879, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881}, - {1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883}}; -const char32_t composition_data[1883] = { - 0, 824, 8814, 824, 8800, 824, 8815, 768, 192, 769, 193, - 770, 194, 771, 195, 772, 256, 774, 258, 775, 550, 776, - 196, 777, 7842, 778, 197, 780, 461, 783, 512, 785, 514, - 803, 7840, 805, 7680, 808, 260, 775, 7682, 803, 7684, 817, - 7686, 769, 262, 770, 264, 775, 266, 780, 268, 807, 199, - 775, 7690, 780, 270, 803, 7692, 807, 7696, 813, 7698, 817, - 7694, 768, 200, 769, 201, 770, 202, 771, 7868, 772, 274, - 774, 276, 775, 278, 776, 203, 777, 7866, 780, 282, 783, - 516, 785, 518, 803, 7864, 807, 552, 808, 280, 813, 7704, - 816, 7706, 775, 7710, 769, 500, 770, 284, 772, 7712, 774, - 286, 775, 288, 780, 486, 807, 290, 770, 292, 775, 7714, - 776, 7718, 780, 542, 803, 7716, 807, 7720, 814, 7722, 768, - 204, 769, 205, 770, 206, 771, 296, 772, 298, 774, 300, - 775, 304, 776, 207, 777, 7880, 780, 463, 783, 520, 785, - 522, 803, 7882, 808, 302, 816, 7724, 770, 308, 769, 7728, - 780, 488, 803, 7730, 807, 310, 817, 7732, 769, 313, 780, - 317, 803, 7734, 807, 315, 813, 7740, 817, 7738, 769, 7742, - 775, 7744, 803, 7746, 768, 504, 769, 323, 771, 209, 775, - 7748, 780, 327, 803, 7750, 807, 325, 813, 7754, 817, 7752, - 768, 210, 769, 211, 770, 212, 771, 213, 772, 332, 774, - 334, 775, 558, 776, 214, 777, 7886, 779, 336, 780, 465, - 783, 524, 785, 526, 795, 416, 803, 7884, 808, 490, 769, - 7764, 775, 7766, 769, 340, 775, 7768, 780, 344, 783, 528, - 785, 530, 803, 7770, 807, 342, 817, 7774, 769, 346, 770, - 348, 775, 7776, 780, 352, 803, 7778, 806, 536, 807, 350, - 775, 7786, 780, 356, 803, 7788, 806, 538, 807, 354, 813, - 7792, 817, 7790, 768, 217, 769, 218, 770, 219, 771, 360, - 772, 362, 774, 364, 776, 220, 777, 7910, 778, 366, 779, - 368, 780, 467, 783, 532, 785, 534, 795, 431, 803, 7908, - 804, 7794, 808, 370, 813, 7798, 816, 7796, 771, 7804, 803, - 7806, 768, 7808, 769, 7810, 770, 372, 775, 7814, 776, 7812, - 803, 7816, 775, 7818, 776, 7820, 768, 7922, 769, 221, 770, - 374, 771, 7928, 772, 562, 775, 7822, 776, 376, 777, 7926, - 803, 7924, 769, 377, 770, 7824, 775, 379, 780, 381, 803, - 7826, 817, 7828, 768, 224, 769, 225, 770, 226, 771, 227, - 772, 257, 774, 259, 775, 551, 776, 228, 777, 7843, 778, - 229, 780, 462, 783, 513, 785, 515, 803, 7841, 805, 7681, - 808, 261, 775, 7683, 803, 7685, 817, 7687, 769, 263, 770, - 265, 775, 267, 780, 269, 807, 231, 775, 7691, 780, 271, - 803, 7693, 807, 7697, 813, 7699, 817, 7695, 768, 232, 769, - 233, 770, 234, 771, 7869, 772, 275, 774, 277, 775, 279, - 776, 235, 777, 7867, 780, 283, 783, 517, 785, 519, 803, - 7865, 807, 553, 808, 281, 813, 7705, 816, 7707, 775, 7711, - 769, 501, 770, 285, 772, 7713, 774, 287, 775, 289, 780, - 487, 807, 291, 770, 293, 775, 7715, 776, 7719, 780, 543, - 803, 7717, 807, 7721, 814, 7723, 817, 7830, 768, 236, 769, - 237, 770, 238, 771, 297, 772, 299, 774, 301, 776, 239, - 777, 7881, 780, 464, 783, 521, 785, 523, 803, 7883, 808, - 303, 816, 7725, 770, 309, 780, 496, 769, 7729, 780, 489, - 803, 7731, 807, 311, 817, 7733, 769, 314, 780, 318, 803, - 7735, 807, 316, 813, 7741, 817, 7739, 769, 7743, 775, 7745, - 803, 7747, 768, 505, 769, 324, 771, 241, 775, 7749, 780, - 328, 803, 7751, 807, 326, 813, 7755, 817, 7753, 768, 242, - 769, 243, 770, 244, 771, 245, 772, 333, 774, 335, 775, - 559, 776, 246, 777, 7887, 779, 337, 780, 466, 783, 525, - 785, 527, 795, 417, 803, 7885, 808, 491, 769, 7765, 775, - 7767, 769, 341, 775, 7769, 780, 345, 783, 529, 785, 531, - 803, 7771, 807, 343, 817, 7775, 769, 347, 770, 349, 775, - 7777, 780, 353, 803, 7779, 806, 537, 807, 351, 775, 7787, - 776, 7831, 780, 357, 803, 7789, 806, 539, 807, 355, 813, - 7793, 817, 7791, 768, 249, 769, 250, 770, 251, 771, 361, - 772, 363, 774, 365, 776, 252, 777, 7911, 778, 367, 779, - 369, 780, 468, 783, 533, 785, 535, 795, 432, 803, 7909, - 804, 7795, 808, 371, 813, 7799, 816, 7797, 771, 7805, 803, - 7807, 768, 7809, 769, 7811, 770, 373, 775, 7815, 776, 7813, - 778, 7832, 803, 7817, 775, 7819, 776, 7821, 768, 7923, 769, - 253, 770, 375, 771, 7929, 772, 563, 775, 7823, 776, 255, - 777, 7927, 778, 7833, 803, 7925, 769, 378, 770, 7825, 775, - 380, 780, 382, 803, 7827, 817, 7829, 768, 8173, 769, 901, - 834, 8129, 768, 7846, 769, 7844, 771, 7850, 777, 7848, 772, - 478, 769, 506, 769, 508, 772, 482, 769, 7688, 768, 7872, - 769, 7870, 771, 7876, 777, 7874, 769, 7726, 768, 7890, 769, - 7888, 771, 7894, 777, 7892, 769, 7756, 772, 556, 776, 7758, - 772, 554, 769, 510, 768, 475, 769, 471, 772, 469, 780, - 473, 768, 7847, 769, 7845, 771, 7851, 777, 7849, 772, 479, - 769, 507, 769, 509, 772, 483, 769, 7689, 768, 7873, 769, - 7871, 771, 7877, 777, 7875, 769, 7727, 768, 7891, 769, 7889, - 771, 7895, 777, 7893, 769, 7757, 772, 557, 776, 7759, 772, - 555, 769, 511, 768, 476, 769, 472, 772, 470, 780, 474, - 768, 7856, 769, 7854, 771, 7860, 777, 7858, 768, 7857, 769, - 7855, 771, 7861, 777, 7859, 768, 7700, 769, 7702, 768, 7701, - 769, 7703, 768, 7760, 769, 7762, 768, 7761, 769, 7763, 775, - 7780, 775, 7781, 775, 7782, 775, 7783, 769, 7800, 769, 7801, - 776, 7802, 776, 7803, 775, 7835, 768, 7900, 769, 7898, 771, - 7904, 777, 7902, 803, 7906, 768, 7901, 769, 7899, 771, 7905, - 777, 7903, 803, 7907, 768, 7914, 769, 7912, 771, 7918, 777, - 7916, 803, 7920, 768, 7915, 769, 7913, 771, 7919, 777, 7917, - 803, 7921, 780, 494, 772, 492, 772, 493, 772, 480, 772, - 481, 774, 7708, 774, 7709, 772, 560, 772, 561, 780, 495, - 768, 8122, 769, 902, 772, 8121, 774, 8120, 787, 7944, 788, - 7945, 837, 8124, 768, 8136, 769, 904, 787, 7960, 788, 7961, - 768, 8138, 769, 905, 787, 7976, 788, 7977, 837, 8140, 768, - 8154, 769, 906, 772, 8153, 774, 8152, 776, 938, 787, 7992, - 788, 7993, 768, 8184, 769, 908, 787, 8008, 788, 8009, 788, - 8172, 768, 8170, 769, 910, 772, 8169, 774, 8168, 776, 939, - 788, 8025, 768, 8186, 769, 911, 787, 8040, 788, 8041, 837, - 8188, 837, 8116, 837, 8132, 768, 8048, 769, 940, 772, 8113, - 774, 8112, 787, 7936, 788, 7937, 834, 8118, 837, 8115, 768, - 8050, 769, 941, 787, 7952, 788, 7953, 768, 8052, 769, 942, - 787, 7968, 788, 7969, 834, 8134, 837, 8131, 768, 8054, 769, - 943, 772, 8145, 774, 8144, 776, 970, 787, 7984, 788, 7985, - 834, 8150, 768, 8056, 769, 972, 787, 8000, 788, 8001, 787, - 8164, 788, 8165, 768, 8058, 769, 973, 772, 8161, 774, 8160, - 776, 971, 787, 8016, 788, 8017, 834, 8166, 768, 8060, 769, - 974, 787, 8032, 788, 8033, 834, 8182, 837, 8179, 768, 8146, - 769, 912, 834, 8151, 768, 8162, 769, 944, 834, 8167, 837, - 8180, 769, 979, 776, 980, 776, 1031, 774, 1232, 776, 1234, - 769, 1027, 768, 1024, 774, 1238, 776, 1025, 774, 1217, 776, - 1244, 776, 1246, 768, 1037, 772, 1250, 774, 1049, 776, 1252, - 769, 1036, 776, 1254, 772, 1262, 774, 1038, 776, 1264, 779, - 1266, 776, 1268, 776, 1272, 776, 1260, 774, 1233, 776, 1235, - 769, 1107, 768, 1104, 774, 1239, 776, 1105, 774, 1218, 776, - 1245, 776, 1247, 768, 1117, 772, 1251, 774, 1081, 776, 1253, - 769, 1116, 776, 1255, 772, 1263, 774, 1118, 776, 1265, 779, - 1267, 776, 1269, 776, 1273, 776, 1261, 776, 1111, 783, 1142, - 783, 1143, 776, 1242, 776, 1243, 776, 1258, 776, 1259, 1619, - 1570, 1620, 1571, 1621, 1573, 1620, 1572, 1620, 1574, 1620, 1730, - 1620, 1747, 1620, 1728, 2364, 2345, 2364, 2353, 2364, 2356, 2494, - 2507, 2519, 2508, 2878, 2891, 2902, 2888, 2903, 2892, 3031, 2964, - 3006, 3018, 3031, 3020, 3006, 3019, 3158, 3144, 3285, 3264, 3266, - 3274, 3285, 3271, 3286, 3272, 3285, 3275, 3390, 3402, 3415, 3404, - 3390, 3403, 3530, 3546, 3535, 3548, 3551, 3550, 3530, 3549, 4142, - 4134, 6965, 6918, 6965, 6920, 6965, 6922, 6965, 6924, 6965, 6926, - 6965, 6930, 6965, 6971, 6965, 6973, 6965, 6976, 6965, 6977, 6965, - 6979, 772, 7736, 772, 7737, 772, 7772, 772, 7773, 775, 7784, - 775, 7785, 770, 7852, 774, 7862, 770, 7853, 774, 7863, 770, - 7878, 770, 7879, 770, 7896, 770, 7897, 768, 7938, 769, 7940, - 834, 7942, 837, 8064, 768, 7939, 769, 7941, 834, 7943, 837, - 8065, 837, 8066, 837, 8067, 837, 8068, 837, 8069, 837, 8070, - 837, 8071, 768, 7946, 769, 7948, 834, 7950, 837, 8072, 768, - 7947, 769, 7949, 834, 7951, 837, 8073, 837, 8074, 837, 8075, - 837, 8076, 837, 8077, 837, 8078, 837, 8079, 768, 7954, 769, - 7956, 768, 7955, 769, 7957, 768, 7962, 769, 7964, 768, 7963, - 769, 7965, 768, 7970, 769, 7972, 834, 7974, 837, 8080, 768, - 7971, 769, 7973, 834, 7975, 837, 8081, 837, 8082, 837, 8083, - 837, 8084, 837, 8085, 837, 8086, 837, 8087, 768, 7978, 769, - 7980, 834, 7982, 837, 8088, 768, 7979, 769, 7981, 834, 7983, - 837, 8089, 837, 8090, 837, 8091, 837, 8092, 837, 8093, 837, - 8094, 837, 8095, 768, 7986, 769, 7988, 834, 7990, 768, 7987, - 769, 7989, 834, 7991, 768, 7994, 769, 7996, 834, 7998, 768, - 7995, 769, 7997, 834, 7999, 768, 8002, 769, 8004, 768, 8003, - 769, 8005, 768, 8010, 769, 8012, 768, 8011, 769, 8013, 768, - 8018, 769, 8020, 834, 8022, 768, 8019, 769, 8021, 834, 8023, - 768, 8027, 769, 8029, 834, 8031, 768, 8034, 769, 8036, 834, - 8038, 837, 8096, 768, 8035, 769, 8037, 834, 8039, 837, 8097, - 837, 8098, 837, 8099, 837, 8100, 837, 8101, 837, 8102, 837, - 8103, 768, 8042, 769, 8044, 834, 8046, 837, 8104, 768, 8043, - 769, 8045, 834, 8047, 837, 8105, 837, 8106, 837, 8107, 837, - 8108, 837, 8109, 837, 8110, 837, 8111, 837, 8114, 837, 8130, - 837, 8178, 837, 8119, 768, 8141, 769, 8142, 834, 8143, 837, - 8135, 837, 8183, 768, 8157, 769, 8158, 834, 8159, 824, 8602, - 824, 8603, 824, 8622, 824, 8653, 824, 8655, 824, 8654, 824, - 8708, 824, 8713, 824, 8716, 824, 8740, 824, 8742, 824, 8769, - 824, 8772, 824, 8775, 824, 8777, 824, 8813, 824, 8802, 824, - 8816, 824, 8817, 824, 8820, 824, 8821, 824, 8824, 824, 8825, - 824, 8832, 824, 8833, 824, 8928, 824, 8929, 824, 8836, 824, - 8837, 824, 8840, 824, 8841, 824, 8930, 824, 8931, 824, 8876, - 824, 8877, 824, 8878, 824, 8879, 824, 8938, 824, 8939, 824, - 8940, 824, 8941, 12441, 12436, 12441, 12364, 12441, 12366, 12441, 12368, - 12441, 12370, 12441, 12372, 12441, 12374, 12441, 12376, 12441, 12378, 12441, - 12380, 12441, 12382, 12441, 12384, 12441, 12386, 12441, 12389, 12441, 12391, - 12441, 12393, 12441, 12400, 12442, 12401, 12441, 12403, 12442, 12404, 12441, - 12406, 12442, 12407, 12441, 12409, 12442, 12410, 12441, 12412, 12442, 12413, - 12441, 12446, 12441, 12532, 12441, 12460, 12441, 12462, 12441, 12464, 12441, - 12466, 12441, 12468, 12441, 12470, 12441, 12472, 12441, 12474, 12441, 12476, - 12441, 12478, 12441, 12480, 12441, 12482, 12441, 12485, 12441, 12487, 12441, - 12489, 12441, 12496, 12442, 12497, 12441, 12499, 12442, 12500, 12441, 12502, - 12442, 12503, 12441, 12505, 12442, 12506, 12441, 12508, 12442, 12509, 12441, - 12535, 12441, 12536, 12441, 12537, 12441, 12538, 12441, 12542, 69818, 69786, - 69818, 69788, 69818, 69803, 69927, 69934, 69927, 69935, 70462, 70475, 70487, - 70476, 70832, 70844, 70842, 70843, 70845, 70846, 71087, 71098, 71087, 71099, - 71984, 71992}; +// Accessors and multi-stage tables are provided by table_store.hpp after +// ensure_tables(). Lookup code matches the classic O(1) uni-algo layout. } // namespace ada::idna #endif // ADA_IDNA_NORMALIZATION_TABLES_H /* end file src/normalization_tables.cpp */ +#include + namespace ada::idna { // See @@ -7799,6 +5265,30 @@ constexpr char32_t hangul_ncount = hangul_vcount * hangul_tcount; constexpr char32_t hangul_scount = hangul_lcount * hangul_vcount * hangul_tcount; +// Canonical decomposition length (0 if none / compatibility-only / Hangul +// syllable). Length 1 means a singleton mapping (character is not NFC form). +// Length >= 2 means a primary composite that is already the NFC form of its +// decomposition (e.g. U+00E9 LATIN SMALL LETTER E WITH ACUTE). +static size_t canonical_decomp_length(char32_t current_character) noexcept { + if (current_character >= hangul_sbase && + current_character < hangul_sbase + hangul_scount) { + // Hangul precomposed syllables are NFC. + return 0; + } + if (current_character >= 0x110000) { + return 0; + } + const uint8_t di = decomposition_index[current_character >> 8]; + const uint16_t* const decomposition = + decomposition_block_row(di) + (current_character % 256); + size_t decomposition_length = + (decomposition[1] >> 2) - (decomposition[0] >> 2); + if ((decomposition_length > 0) && (decomposition[0] & 1)) { + decomposition_length = 0; // compatibility-only: ignored for NFC + } + return decomposition_length; +} + std::pair compute_decomposition_length( const std::u32string_view input) noexcept { bool decomposition_needed{false}; @@ -7808,6 +5298,7 @@ std::pair compute_decomposition_length( if (current_character >= hangul_sbase && current_character < hangul_sbase + hangul_scount) { + // Full NFD-style Hangul decomp for the decompose() step. decomposition_length = 2; if ((current_character - hangul_sbase) % hangul_tcount) { decomposition_length = 3; @@ -7815,7 +5306,7 @@ std::pair compute_decomposition_length( } else if (current_character < 0x110000) { const uint8_t di = decomposition_index[current_character >> 8]; const uint16_t* const decomposition = - decomposition_block[di] + (current_character % 256); + decomposition_block_row(di) + (current_character % 256); decomposition_length = (decomposition[1] >> 2) - (decomposition[0] >> 2); if ((decomposition_length > 0) && (decomposition[0] & 1)) { decomposition_length = 0; @@ -7845,9 +5336,9 @@ void decompose(std::u32string& input, size_t additional_elements) { hangul_vbase + (s_index % hangul_ncount) / hangul_tcount; input[--descending_idx] = hangul_lbase + s_index / hangul_ncount; } else if (input[input_count] < 0x110000) { - // Check decomposition_data. const uint16_t* decomposition = - decomposition_block[decomposition_index[input[input_count] >> 8]] + + decomposition_block_row( + decomposition_index[input[input_count] >> 8]) + (input[input_count] % 256); uint16_t decomposition_length = (decomposition[1] >> 2) - (decomposition[0] >> 2); @@ -7855,26 +5346,29 @@ void decompose(std::u32string& input, size_t additional_elements) { decomposition_length = 0; } if (decomposition_length > 0) { - // Non-recursive decomposition. - while (decomposition_length-- > 0) { - input[--descending_idx] = decomposition_data[(decomposition[0] >> 2) + - decomposition_length]; + const size_t base = static_cast(decomposition[0] >> 2); + if (base + decomposition_length > decomposition_data_size) { + input[--descending_idx] = input[input_count]; + } else { + while (decomposition_length-- > 0) { + input[--descending_idx] = + decomposition_data[base + decomposition_length]; + } } } else { - // No decomposition. input[--descending_idx] = input[input_count]; } } else { - // Non-Unicode character. input[--descending_idx] = input[input_count]; } } } uint8_t get_ccc(char32_t c) noexcept { - return c < 0x110000 ? canonical_combining_class_block - [canonical_combining_class_index[c >> 8]][c % 256] - : 0; + if (c >= 0x110000) { + return 0; + } + return ccc_block_row(ccc_index[c >> 8])[c % 256]; } void sort_marks(std::u32string& input) { @@ -7882,7 +5376,7 @@ void sort_marks(std::u32string& input) { uint8_t ccc = get_ccc(input[idx]); if (ccc == 0) { continue; - } // Skip non-combining characters. + } auto current_character = input[idx]; size_t back_idx = idx; while (back_idx != 0 && get_ccc(input[back_idx - 1]) > ccc) { @@ -7906,6 +5400,98 @@ void decompose_nfc(std::u32string& input) { sort_marks(input); } +// Returns true if a composition step would change the string. +static bool would_compose(std::u32string_view input) noexcept { + for (size_t input_count = 0; input_count < input.size();) { + const char32_t current = input[input_count]; + if (current >= hangul_lbase && current < hangul_lbase + hangul_lcount) { + if (input_count + 1 < input.size() && + input[input_count + 1] >= hangul_vbase && + input[input_count + 1] < hangul_vbase + hangul_vcount) { + return true; + } + ++input_count; + continue; + } + if (current >= hangul_sbase && current < hangul_sbase + hangul_scount) { + if ((current - hangul_sbase) % hangul_tcount && + input_count + 1 < input.size() && + input[input_count + 1] > hangul_tbase && + input[input_count + 1] < hangul_tbase + hangul_tcount) { + return true; + } + ++input_count; + continue; + } + if (current < 0x110000) { + const uint16_t* composition = + composition_block_row(composition_index[current >> 8]) + + (current % 256); + int32_t previous_ccc = -1; + size_t j = input_count; + for (; j + 1 < input.size(); ++j) { + uint8_t ccc = get_ccc(input[j + 1]); + if (composition[1] != composition[0] && previous_ccc < ccc) { + int left = composition[0]; + int right = composition[1]; + if (left < 0 || right < left || + static_cast(right) > composition_data_size) { + break; + } + while (left + 2 < right) { + int middle = left + (((right - left) >> 1) & ~1); + if (composition_data[static_cast(middle)] <= input[j + 1]) { + left = middle; + } + if (composition_data[static_cast(middle)] >= input[j + 1]) { + right = middle; + } + } + if (static_cast(left + 1) < composition_data_size && + composition_data[static_cast(left)] == input[j + 1]) { + return true; + } + } + if (ccc == 0) { + break; + } + previous_ccc = ccc; + } + input_count = j + 1; + continue; + } + ++input_count; + } + return false; +} + +bool is_already_nfc(std::u32string_view input) noexcept { + if (input.empty()) { + return true; + } + if (!tables_are_ready() && !ensure_tables()) { + return false; + } + // 1) Singleton decompositions are never NFC (e.g. U+212B ANGSTROM SIGN). + // Multi-code-point decomps are primary composites that are NFC as-is. + for (char32_t c : input) { + if (canonical_decomp_length(c) == 1) { + return false; + } + } + // 2) Combining marks already in canonical order. + uint8_t prev_ccc = 0; + for (char32_t c : input) { + uint8_t ccc = get_ccc(c); + if (ccc != 0 && prev_ccc > ccc) { + return false; + } + prev_ccc = ccc; + } + // 3) No pairwise composition would apply (including Hangul L+V / LV+T). + return !would_compose(input); +} + void compose(std::u32string& input) { /** * Compose the domain_name string to Unicode Normalization Form C. @@ -7942,40 +5528,46 @@ void compose(std::u32string& input) { } } else if (input[input_count] < 0x110000) { const uint16_t* composition = - &composition_block[composition_index[input[input_count] >> 8]] - [input[input_count] % 256]; + composition_block_row(composition_index[input[input_count] >> 8]) + + (input[input_count] % 256); size_t initial_composition_count = composition_count; for (int32_t previous_ccc = -1; input_count + 1 < input.size(); input_count++) { uint8_t ccc = get_ccc(input[input_count + 1]); if (composition[1] != composition[0] && previous_ccc < ccc) { - // Try finding a composition. int left = composition[0]; int right = composition[1]; + if (left < 0 || right < left || + static_cast(right) > composition_data_size) { + break; + } while (left + 2 < right) { - // mean without overflow int middle = left + (((right - left) >> 1) & ~1); - if (composition_data[middle] <= input[input_count + 1]) { + if (composition_data[static_cast(middle)] <= + input[input_count + 1]) { left = middle; } - if (composition_data[middle] >= input[input_count + 1]) { + if (composition_data[static_cast(middle)] >= + input[input_count + 1]) { right = middle; } } - if (composition_data[left] == input[input_count + 1]) { - input[initial_composition_count] = composition_data[left + 1]; + if (static_cast(left + 1) < composition_data_size && + composition_data[static_cast(left)] == + input[input_count + 1]) { + char32_t composed = composition_data[static_cast(left + 1)]; + input[initial_composition_count] = composed; composition = - &composition_block - [composition_index[composition_data[left + 1] >> 8]] - [composition_data[left + 1] % 256]; + composition_block_row(composition_index[composed >> 8]) + + (composed % 256); continue; } } if (ccc == 0) { break; - } // Not a combining character. + } previous_ccc = ccc; input[++composition_count] = input[input_count + 1]; } @@ -7987,18 +5579,43 @@ void compose(std::u32string& input) { } } -void normalize(std::u32string& input) { +bool normalize(std::u32string& input) { /** - * Normalize the domain_name string to Unicode Normalization Form C. + * Normalize the characters according to IDNA (Unicode Normalization Form C). * @see https://www.unicode.org/reports/tr46/#ProcessingStepNormalize */ + if (!ensure_tables() || decomposition_index == nullptr || + composition_index == nullptr) { + return false; + } + if (is_already_nfc(input)) { + return true; + } decompose_nfc(input); compose(input); + return true; } } // namespace ada::idna /* end file src/normalization.cpp */ /* begin file src/punycode.cpp */ +/* begin file include/ada/idna/punycode.h */ +#ifndef ADA_IDNA_PUNYCODE_H +#define ADA_IDNA_PUNYCODE_H + +#include +#include + +namespace ada::idna { + +bool punycode_to_utf32(std::string_view input, std::u32string& out); +bool verify_punycode(std::string_view input); +bool utf32_to_punycode(std::u32string_view input, std::string& out); + +} // namespace ada::idna + +#endif // ADA_IDNA_PUNYCODE_H +/* end file include/ada/idna/punycode.h */ #include @@ -8038,10 +5655,6 @@ static constexpr int32_t adapt(int32_t d, int32_t n, bool firsttime) { } bool punycode_to_utf32(std::string_view input, std::u32string &out) { - // See https://github.com/whatwg/url/issues/803 - if (input.starts_with("xn--")) { - return false; - } int32_t written_out{0}; out.reserve(out.size() + input.size()); uint32_t n = initial_n; @@ -8098,13 +5711,20 @@ bool punycode_to_utf32(std::string_view input, std::u32string &out) { written_out++; ++i; } + // See https://github.com/whatwg/url/issues/803 + // Reject labels whose decoded form begins with "xn--" (double-encoded ACE). + if (out.size() >= 4 && out[0] == U'x' && out[1] == U'n' && out[2] == U'-' && + out[3] == U'-') { + return false; + } return true; } bool verify_punycode(std::string_view input) { - if (input.starts_with("xn--")) { - return false; - } + // Track only the first 4 decoded code points to check for the "xn--" prefix. + // This avoids heap allocation while still detecting double-encoded ACE + // labels. + uint32_t first4[4]{}; size_t written_out{0}; uint32_t n = initial_n; int32_t i = 0; @@ -8116,6 +5736,9 @@ bool verify_punycode(std::string_view input) { if (c >= 0x80) { return false; } + if (written_out < 4) { + first4[written_out] = c; + } written_out++; } input.remove_prefix(end_of_ascii + 1); @@ -8155,10 +5778,23 @@ bool verify_punycode(std::string_view input) { if (n < 0x80) { return false; } + // Simulate insert at position i, maintaining only the first 4 slots. + size_t insert_pos = size_t(i); + if (insert_pos < 4) { + for (size_t j = 3; j > insert_pos; j--) { + first4[j] = first4[j - 1]; + } + first4[insert_pos] = n; + } written_out++; ++i; } - + // See https://github.com/whatwg/url/issues/803 + // Reject labels whose decoded form begins with "xn--" (double-encoded ACE). + if (written_out >= 4 && first4[0] == U'x' && first4[1] == U'n' && + first4[2] == U'-' && first4[3] == U'-') { + return false; + } return true; } @@ -8226,7 +5862,9 @@ bool utf32_to_punycode(std::u32string_view input, std::string &out) { } // namespace ada::idna /* end file src/punycode.cpp */ /* begin file src/validity.cpp */ + #include +#include #include namespace ada::idna { @@ -8258,755 +5896,28 @@ enum direction : uint8_t { LRE }; -struct directions { - uint32_t start_code; - uint32_t final_code; - direction direct; -}; - -static directions dir_table[] = { - {0x0, 0x8, direction::BN}, {0x9, 0x9, direction::S}, - {0xa, 0xa, direction::B}, {0xb, 0xb, direction::S}, - {0xc, 0xc, direction::WS}, {0xd, 0xd, direction::B}, - {0xe, 0x1b, direction::BN}, {0x1c, 0x1e, direction::B}, - {0x1f, 0x1f, direction::S}, {0x20, 0x20, direction::WS}, - {0x21, 0x22, direction::ON}, {0x23, 0x25, direction::ET}, - {0x26, 0x2a, direction::ON}, {0x2b, 0x2b, direction::ES}, - {0x2c, 0x2c, direction::CS}, {0x2d, 0x2d, direction::ES}, - {0x2e, 0x2f, direction::CS}, {0x30, 0x39, direction::EN}, - {0x3a, 0x3a, direction::CS}, {0x3b, 0x40, direction::ON}, - {0x41, 0x5a, direction::L}, {0x5b, 0x60, direction::ON}, - {0x61, 0x7a, direction::L}, {0x7b, 0x7e, direction::ON}, - {0x7f, 0x84, direction::BN}, {0x85, 0x85, direction::B}, - {0x86, 0x9f, direction::BN}, {0xa0, 0xa0, direction::CS}, - {0xa1, 0xa1, direction::ON}, {0xa2, 0xa5, direction::ET}, - {0xa6, 0xa9, direction::ON}, {0xaa, 0xaa, direction::L}, - {0xab, 0xac, direction::ON}, {0xad, 0xad, direction::BN}, - {0xae, 0xaf, direction::ON}, {0xb0, 0xb1, direction::ET}, - {0xb2, 0xb3, direction::EN}, {0xb4, 0xb4, direction::ON}, - {0xb5, 0xb5, direction::L}, {0xb6, 0xb8, direction::ON}, - {0xb9, 0xb9, direction::EN}, {0xba, 0xba, direction::L}, - {0xbb, 0xbf, direction::ON}, {0xc0, 0xd6, direction::L}, - {0xd7, 0xd7, direction::ON}, {0xd8, 0xf6, direction::L}, - {0xf7, 0xf7, direction::ON}, {0xf8, 0x2b8, direction::L}, - {0x2b9, 0x2ba, direction::ON}, {0x2bb, 0x2c1, direction::L}, - {0x2c2, 0x2cf, direction::ON}, {0x2d0, 0x2d1, direction::L}, - {0x2d2, 0x2df, direction::ON}, {0x2e0, 0x2e4, direction::L}, - {0x2e5, 0x2ed, direction::ON}, {0x2ee, 0x2ee, direction::L}, - {0x2ef, 0x2ff, direction::ON}, {0x300, 0x36f, direction::NSM}, - {0x370, 0x373, direction::L}, {0x374, 0x375, direction::ON}, - {0x376, 0x377, direction::L}, {0x37a, 0x37d, direction::L}, - {0x37e, 0x37e, direction::ON}, {0x37f, 0x37f, direction::L}, - {0x384, 0x385, direction::ON}, {0x386, 0x386, direction::L}, - {0x387, 0x387, direction::ON}, {0x388, 0x38a, direction::L}, - {0x38c, 0x38c, direction::L}, {0x38e, 0x3a1, direction::L}, - {0x3a3, 0x3f5, direction::L}, {0x3f6, 0x3f6, direction::ON}, - {0x3f7, 0x482, direction::L}, {0x483, 0x489, direction::NSM}, - {0x48a, 0x52f, direction::L}, {0x531, 0x556, direction::L}, - {0x559, 0x589, direction::L}, {0x58a, 0x58a, direction::ON}, - {0x58d, 0x58e, direction::ON}, {0x58f, 0x58f, direction::ET}, - {0x591, 0x5bd, direction::NSM}, {0x5be, 0x5be, direction::R}, - {0x5bf, 0x5bf, direction::NSM}, {0x5c0, 0x5c0, direction::R}, - {0x5c1, 0x5c2, direction::NSM}, {0x5c3, 0x5c3, direction::R}, - {0x5c4, 0x5c5, direction::NSM}, {0x5c6, 0x5c6, direction::R}, - {0x5c7, 0x5c7, direction::NSM}, {0x5d0, 0x5ea, direction::R}, - {0x5ef, 0x5f4, direction::R}, {0x600, 0x605, direction::AN}, - {0x606, 0x607, direction::ON}, {0x608, 0x608, direction::AL}, - {0x609, 0x60a, direction::ET}, {0x60b, 0x60b, direction::AL}, - {0x60c, 0x60c, direction::CS}, {0x60d, 0x60d, direction::AL}, - {0x60e, 0x60f, direction::ON}, {0x610, 0x61a, direction::NSM}, - {0x61b, 0x61c, direction::AL}, {0x61e, 0x64a, direction::AL}, - {0x64b, 0x65f, direction::NSM}, {0x660, 0x669, direction::AN}, - {0x66a, 0x66a, direction::ET}, {0x66b, 0x66c, direction::AN}, - {0x66d, 0x66f, direction::AL}, {0x670, 0x670, direction::NSM}, - {0x671, 0x6d5, direction::AL}, {0x6d6, 0x6dc, direction::NSM}, - {0x6dd, 0x6dd, direction::AN}, {0x6de, 0x6de, direction::ON}, - {0x6df, 0x6e4, direction::NSM}, {0x6e5, 0x6e6, direction::AL}, - {0x6e7, 0x6e8, direction::NSM}, {0x6e9, 0x6e9, direction::ON}, - {0x6ea, 0x6ed, direction::NSM}, {0x6ee, 0x6ef, direction::AL}, - {0x6f0, 0x6f9, direction::EN}, {0x6fa, 0x70d, direction::AL}, - {0x70f, 0x710, direction::AL}, {0x711, 0x711, direction::NSM}, - {0x712, 0x72f, direction::AL}, {0x730, 0x74a, direction::NSM}, - {0x74d, 0x7a5, direction::AL}, {0x7a6, 0x7b0, direction::NSM}, - {0x7b1, 0x7b1, direction::AL}, {0x7c0, 0x7ea, direction::R}, - {0x7eb, 0x7f3, direction::NSM}, {0x7f4, 0x7f5, direction::R}, - {0x7f6, 0x7f9, direction::ON}, {0x7fa, 0x7fa, direction::R}, - {0x7fd, 0x7fd, direction::NSM}, {0x7fe, 0x815, direction::R}, - {0x816, 0x819, direction::NSM}, {0x81a, 0x81a, direction::R}, - {0x81b, 0x823, direction::NSM}, {0x824, 0x824, direction::R}, - {0x825, 0x827, direction::NSM}, {0x828, 0x828, direction::R}, - {0x829, 0x82d, direction::NSM}, {0x830, 0x83e, direction::R}, - {0x840, 0x858, direction::R}, {0x859, 0x85b, direction::NSM}, - {0x85e, 0x85e, direction::R}, {0x860, 0x86a, direction::AL}, - {0x8a0, 0x8b4, direction::AL}, {0x8b6, 0x8c7, direction::AL}, - {0x8d3, 0x8e1, direction::NSM}, {0x8e2, 0x8e2, direction::AN}, - {0x8e3, 0x902, direction::NSM}, {0x903, 0x939, direction::L}, - {0x93a, 0x93a, direction::NSM}, {0x93b, 0x93b, direction::L}, - {0x93c, 0x93c, direction::NSM}, {0x93d, 0x940, direction::L}, - {0x941, 0x948, direction::NSM}, {0x949, 0x94c, direction::L}, - {0x94d, 0x94d, direction::NSM}, {0x94e, 0x950, direction::L}, - {0x951, 0x957, direction::NSM}, {0x958, 0x961, direction::L}, - {0x962, 0x963, direction::NSM}, {0x964, 0x980, direction::L}, - {0x981, 0x981, direction::NSM}, {0x982, 0x983, direction::L}, - {0x985, 0x98c, direction::L}, {0x98f, 0x990, direction::L}, - {0x993, 0x9a8, direction::L}, {0x9aa, 0x9b0, direction::L}, - {0x9b2, 0x9b2, direction::L}, {0x9b6, 0x9b9, direction::L}, - {0x9bc, 0x9bc, direction::NSM}, {0x9bd, 0x9c0, direction::L}, - {0x9c1, 0x9c4, direction::NSM}, {0x9c7, 0x9c8, direction::L}, - {0x9cb, 0x9cc, direction::L}, {0x9cd, 0x9cd, direction::NSM}, - {0x9ce, 0x9ce, direction::L}, {0x9d7, 0x9d7, direction::L}, - {0x9dc, 0x9dd, direction::L}, {0x9df, 0x9e1, direction::L}, - {0x9e2, 0x9e3, direction::NSM}, {0x9e6, 0x9f1, direction::L}, - {0x9f2, 0x9f3, direction::ET}, {0x9f4, 0x9fa, direction::L}, - {0x9fb, 0x9fb, direction::ET}, {0x9fc, 0x9fd, direction::L}, - {0x9fe, 0x9fe, direction::NSM}, {0xa01, 0xa02, direction::NSM}, - {0xa03, 0xa03, direction::L}, {0xa05, 0xa0a, direction::L}, - {0xa0f, 0xa10, direction::L}, {0xa13, 0xa28, direction::L}, - {0xa2a, 0xa30, direction::L}, {0xa32, 0xa33, direction::L}, - {0xa35, 0xa36, direction::L}, {0xa38, 0xa39, direction::L}, - {0xa3c, 0xa3c, direction::NSM}, {0xa3e, 0xa40, direction::L}, - {0xa41, 0xa42, direction::NSM}, {0xa47, 0xa48, direction::NSM}, - {0xa4b, 0xa4d, direction::NSM}, {0xa51, 0xa51, direction::NSM}, - {0xa59, 0xa5c, direction::L}, {0xa5e, 0xa5e, direction::L}, - {0xa66, 0xa6f, direction::L}, {0xa70, 0xa71, direction::NSM}, - {0xa72, 0xa74, direction::L}, {0xa75, 0xa75, direction::NSM}, - {0xa76, 0xa76, direction::L}, {0xa81, 0xa82, direction::NSM}, - {0xa83, 0xa83, direction::L}, {0xa85, 0xa8d, direction::L}, - {0xa8f, 0xa91, direction::L}, {0xa93, 0xaa8, direction::L}, - {0xaaa, 0xab0, direction::L}, {0xab2, 0xab3, direction::L}, - {0xab5, 0xab9, direction::L}, {0xabc, 0xabc, direction::NSM}, - {0xabd, 0xac0, direction::L}, {0xac1, 0xac5, direction::NSM}, - {0xac7, 0xac8, direction::NSM}, {0xac9, 0xac9, direction::L}, - {0xacb, 0xacc, direction::L}, {0xacd, 0xacd, direction::NSM}, - {0xad0, 0xad0, direction::L}, {0xae0, 0xae1, direction::L}, - {0xae2, 0xae3, direction::NSM}, {0xae6, 0xaf0, direction::L}, - {0xaf1, 0xaf1, direction::ET}, {0xaf9, 0xaf9, direction::L}, - {0xafa, 0xaff, direction::NSM}, {0xb01, 0xb01, direction::NSM}, - {0xb02, 0xb03, direction::L}, {0xb05, 0xb0c, direction::L}, - {0xb0f, 0xb10, direction::L}, {0xb13, 0xb28, direction::L}, - {0xb2a, 0xb30, direction::L}, {0xb32, 0xb33, direction::L}, - {0xb35, 0xb39, direction::L}, {0xb3c, 0xb3c, direction::NSM}, - {0xb3d, 0xb3e, direction::L}, {0xb3f, 0xb3f, direction::NSM}, - {0xb40, 0xb40, direction::L}, {0xb41, 0xb44, direction::NSM}, - {0xb47, 0xb48, direction::L}, {0xb4b, 0xb4c, direction::L}, - {0xb4d, 0xb4d, direction::NSM}, {0xb55, 0xb56, direction::NSM}, - {0xb57, 0xb57, direction::L}, {0xb5c, 0xb5d, direction::L}, - {0xb5f, 0xb61, direction::L}, {0xb62, 0xb63, direction::NSM}, - {0xb66, 0xb77, direction::L}, {0xb82, 0xb82, direction::NSM}, - {0xb83, 0xb83, direction::L}, {0xb85, 0xb8a, direction::L}, - {0xb8e, 0xb90, direction::L}, {0xb92, 0xb95, direction::L}, - {0xb99, 0xb9a, direction::L}, {0xb9c, 0xb9c, direction::L}, - {0xb9e, 0xb9f, direction::L}, {0xba3, 0xba4, direction::L}, - {0xba8, 0xbaa, direction::L}, {0xbae, 0xbb9, direction::L}, - {0xbbe, 0xbbf, direction::L}, {0xbc0, 0xbc0, direction::NSM}, - {0xbc1, 0xbc2, direction::L}, {0xbc6, 0xbc8, direction::L}, - {0xbca, 0xbcc, direction::L}, {0xbcd, 0xbcd, direction::NSM}, - {0xbd0, 0xbd0, direction::L}, {0xbd7, 0xbd7, direction::L}, - {0xbe6, 0xbf2, direction::L}, {0xbf3, 0xbf8, direction::ON}, - {0xbf9, 0xbf9, direction::ET}, {0xbfa, 0xbfa, direction::ON}, - {0xc00, 0xc00, direction::NSM}, {0xc01, 0xc03, direction::L}, - {0xc04, 0xc04, direction::NSM}, {0xc05, 0xc0c, direction::L}, - {0xc0e, 0xc10, direction::L}, {0xc12, 0xc28, direction::L}, - {0xc2a, 0xc39, direction::L}, {0xc3d, 0xc3d, direction::L}, - {0xc3e, 0xc40, direction::NSM}, {0xc41, 0xc44, direction::L}, - {0xc46, 0xc48, direction::NSM}, {0xc4a, 0xc4d, direction::NSM}, - {0xc55, 0xc56, direction::NSM}, {0xc58, 0xc5a, direction::L}, - {0xc60, 0xc61, direction::L}, {0xc62, 0xc63, direction::NSM}, - {0xc66, 0xc6f, direction::L}, {0xc77, 0xc77, direction::L}, - {0xc78, 0xc7e, direction::ON}, {0xc7f, 0xc80, direction::L}, - {0xc81, 0xc81, direction::NSM}, {0xc82, 0xc8c, direction::L}, - {0xc8e, 0xc90, direction::L}, {0xc92, 0xca8, direction::L}, - {0xcaa, 0xcb3, direction::L}, {0xcb5, 0xcb9, direction::L}, - {0xcbc, 0xcbc, direction::NSM}, {0xcbd, 0xcc4, direction::L}, - {0xcc6, 0xcc8, direction::L}, {0xcca, 0xccb, direction::L}, - {0xccc, 0xccd, direction::NSM}, {0xcd5, 0xcd6, direction::L}, - {0xcde, 0xcde, direction::L}, {0xce0, 0xce1, direction::L}, - {0xce2, 0xce3, direction::NSM}, {0xce6, 0xcef, direction::L}, - {0xcf1, 0xcf2, direction::L}, {0xd00, 0xd01, direction::NSM}, - {0xd02, 0xd0c, direction::L}, {0xd0e, 0xd10, direction::L}, - {0xd12, 0xd3a, direction::L}, {0xd3b, 0xd3c, direction::NSM}, - {0xd3d, 0xd40, direction::L}, {0xd41, 0xd44, direction::NSM}, - {0xd46, 0xd48, direction::L}, {0xd4a, 0xd4c, direction::L}, - {0xd4d, 0xd4d, direction::NSM}, {0xd4e, 0xd4f, direction::L}, - {0xd54, 0xd61, direction::L}, {0xd62, 0xd63, direction::NSM}, - {0xd66, 0xd7f, direction::L}, {0xd81, 0xd81, direction::NSM}, - {0xd82, 0xd83, direction::L}, {0xd85, 0xd96, direction::L}, - {0xd9a, 0xdb1, direction::L}, {0xdb3, 0xdbb, direction::L}, - {0xdbd, 0xdbd, direction::L}, {0xdc0, 0xdc6, direction::L}, - {0xdca, 0xdca, direction::NSM}, {0xdcf, 0xdd1, direction::L}, - {0xdd2, 0xdd4, direction::NSM}, {0xdd6, 0xdd6, direction::NSM}, - {0xdd8, 0xddf, direction::L}, {0xde6, 0xdef, direction::L}, - {0xdf2, 0xdf4, direction::L}, {0xe01, 0xe30, direction::L}, - {0xe31, 0xe31, direction::NSM}, {0xe32, 0xe33, direction::L}, - {0xe34, 0xe3a, direction::NSM}, {0xe3f, 0xe3f, direction::ET}, - {0xe40, 0xe46, direction::L}, {0xe47, 0xe4e, direction::NSM}, - {0xe4f, 0xe5b, direction::L}, {0xe81, 0xe82, direction::L}, - {0xe84, 0xe84, direction::L}, {0xe86, 0xe8a, direction::L}, - {0xe8c, 0xea3, direction::L}, {0xea5, 0xea5, direction::L}, - {0xea7, 0xeb0, direction::L}, {0xeb1, 0xeb1, direction::NSM}, - {0xeb2, 0xeb3, direction::L}, {0xeb4, 0xebc, direction::NSM}, - {0xebd, 0xebd, direction::L}, {0xec0, 0xec4, direction::L}, - {0xec6, 0xec6, direction::L}, {0xec8, 0xecd, direction::NSM}, - {0xed0, 0xed9, direction::L}, {0xedc, 0xedf, direction::L}, - {0xf00, 0xf17, direction::L}, {0xf18, 0xf19, direction::NSM}, - {0xf1a, 0xf34, direction::L}, {0xf35, 0xf35, direction::NSM}, - {0xf36, 0xf36, direction::L}, {0xf37, 0xf37, direction::NSM}, - {0xf38, 0xf38, direction::L}, {0xf39, 0xf39, direction::NSM}, - {0xf3a, 0xf3d, direction::ON}, {0xf3e, 0xf47, direction::L}, - {0xf49, 0xf6c, direction::L}, {0xf71, 0xf7e, direction::NSM}, - {0xf7f, 0xf7f, direction::L}, {0xf80, 0xf84, direction::NSM}, - {0xf85, 0xf85, direction::L}, {0xf86, 0xf87, direction::NSM}, - {0xf88, 0xf8c, direction::L}, {0xf8d, 0xf97, direction::NSM}, - {0xf99, 0xfbc, direction::NSM}, {0xfbe, 0xfc5, direction::L}, - {0xfc6, 0xfc6, direction::NSM}, {0xfc7, 0xfcc, direction::L}, - {0xfce, 0xfda, direction::L}, {0x1000, 0x102c, direction::L}, - {0x102d, 0x1030, direction::NSM}, {0x1031, 0x1031, direction::L}, - {0x1032, 0x1037, direction::NSM}, {0x1038, 0x1038, direction::L}, - {0x1039, 0x103a, direction::NSM}, {0x103b, 0x103c, direction::L}, - {0x103d, 0x103e, direction::NSM}, {0x103f, 0x1057, direction::L}, - {0x1058, 0x1059, direction::NSM}, {0x105a, 0x105d, direction::L}, - {0x105e, 0x1060, direction::NSM}, {0x1061, 0x1070, direction::L}, - {0x1071, 0x1074, direction::NSM}, {0x1075, 0x1081, direction::L}, - {0x1082, 0x1082, direction::NSM}, {0x1083, 0x1084, direction::L}, - {0x1085, 0x1086, direction::NSM}, {0x1087, 0x108c, direction::L}, - {0x108d, 0x108d, direction::NSM}, {0x108e, 0x109c, direction::L}, - {0x109d, 0x109d, direction::NSM}, {0x109e, 0x10c5, direction::L}, - {0x10c7, 0x10c7, direction::L}, {0x10cd, 0x10cd, direction::L}, - {0x10d0, 0x1248, direction::L}, {0x124a, 0x124d, direction::L}, - {0x1250, 0x1256, direction::L}, {0x1258, 0x1258, direction::L}, - {0x125a, 0x125d, direction::L}, {0x1260, 0x1288, direction::L}, - {0x128a, 0x128d, direction::L}, {0x1290, 0x12b0, direction::L}, - {0x12b2, 0x12b5, direction::L}, {0x12b8, 0x12be, direction::L}, - {0x12c0, 0x12c0, direction::L}, {0x12c2, 0x12c5, direction::L}, - {0x12c8, 0x12d6, direction::L}, {0x12d8, 0x1310, direction::L}, - {0x1312, 0x1315, direction::L}, {0x1318, 0x135a, direction::L}, - {0x135d, 0x135f, direction::NSM}, {0x1360, 0x137c, direction::L}, - {0x1380, 0x138f, direction::L}, {0x1390, 0x1399, direction::ON}, - {0x13a0, 0x13f5, direction::L}, {0x13f8, 0x13fd, direction::L}, - {0x1400, 0x1400, direction::ON}, {0x1401, 0x167f, direction::L}, - {0x1680, 0x1680, direction::WS}, {0x1681, 0x169a, direction::L}, - {0x169b, 0x169c, direction::ON}, {0x16a0, 0x16f8, direction::L}, - {0x1700, 0x170c, direction::L}, {0x170e, 0x1711, direction::L}, - {0x1712, 0x1714, direction::NSM}, {0x1720, 0x1731, direction::L}, - {0x1732, 0x1734, direction::NSM}, {0x1735, 0x1736, direction::L}, - {0x1740, 0x1751, direction::L}, {0x1752, 0x1753, direction::NSM}, - {0x1760, 0x176c, direction::L}, {0x176e, 0x1770, direction::L}, - {0x1772, 0x1773, direction::NSM}, {0x1780, 0x17b3, direction::L}, - {0x17b4, 0x17b5, direction::NSM}, {0x17b6, 0x17b6, direction::L}, - {0x17b7, 0x17bd, direction::NSM}, {0x17be, 0x17c5, direction::L}, - {0x17c6, 0x17c6, direction::NSM}, {0x17c7, 0x17c8, direction::L}, - {0x17c9, 0x17d3, direction::NSM}, {0x17d4, 0x17da, direction::L}, - {0x17db, 0x17db, direction::ET}, {0x17dc, 0x17dc, direction::L}, - {0x17dd, 0x17dd, direction::NSM}, {0x17e0, 0x17e9, direction::L}, - {0x17f0, 0x17f9, direction::ON}, {0x1800, 0x180a, direction::ON}, - {0x180b, 0x180d, direction::NSM}, {0x180e, 0x180e, direction::BN}, - {0x1810, 0x1819, direction::L}, {0x1820, 0x1878, direction::L}, - {0x1880, 0x1884, direction::L}, {0x1885, 0x1886, direction::NSM}, - {0x1887, 0x18a8, direction::L}, {0x18a9, 0x18a9, direction::NSM}, - {0x18aa, 0x18aa, direction::L}, {0x18b0, 0x18f5, direction::L}, - {0x1900, 0x191e, direction::L}, {0x1920, 0x1922, direction::NSM}, - {0x1923, 0x1926, direction::L}, {0x1927, 0x1928, direction::NSM}, - {0x1929, 0x192b, direction::L}, {0x1930, 0x1931, direction::L}, - {0x1932, 0x1932, direction::NSM}, {0x1933, 0x1938, direction::L}, - {0x1939, 0x193b, direction::NSM}, {0x1940, 0x1940, direction::ON}, - {0x1944, 0x1945, direction::ON}, {0x1946, 0x196d, direction::L}, - {0x1970, 0x1974, direction::L}, {0x1980, 0x19ab, direction::L}, - {0x19b0, 0x19c9, direction::L}, {0x19d0, 0x19da, direction::L}, - {0x19de, 0x19ff, direction::ON}, {0x1a00, 0x1a16, direction::L}, - {0x1a17, 0x1a18, direction::NSM}, {0x1a19, 0x1a1a, direction::L}, - {0x1a1b, 0x1a1b, direction::NSM}, {0x1a1e, 0x1a55, direction::L}, - {0x1a56, 0x1a56, direction::NSM}, {0x1a57, 0x1a57, direction::L}, - {0x1a58, 0x1a5e, direction::NSM}, {0x1a60, 0x1a60, direction::NSM}, - {0x1a61, 0x1a61, direction::L}, {0x1a62, 0x1a62, direction::NSM}, - {0x1a63, 0x1a64, direction::L}, {0x1a65, 0x1a6c, direction::NSM}, - {0x1a6d, 0x1a72, direction::L}, {0x1a73, 0x1a7c, direction::NSM}, - {0x1a7f, 0x1a7f, direction::NSM}, {0x1a80, 0x1a89, direction::L}, - {0x1a90, 0x1a99, direction::L}, {0x1aa0, 0x1aad, direction::L}, - {0x1ab0, 0x1ac0, direction::NSM}, {0x1b00, 0x1b03, direction::NSM}, - {0x1b04, 0x1b33, direction::L}, {0x1b34, 0x1b34, direction::NSM}, - {0x1b35, 0x1b35, direction::L}, {0x1b36, 0x1b3a, direction::NSM}, - {0x1b3b, 0x1b3b, direction::L}, {0x1b3c, 0x1b3c, direction::NSM}, - {0x1b3d, 0x1b41, direction::L}, {0x1b42, 0x1b42, direction::NSM}, - {0x1b43, 0x1b4b, direction::L}, {0x1b50, 0x1b6a, direction::L}, - {0x1b6b, 0x1b73, direction::NSM}, {0x1b74, 0x1b7c, direction::L}, - {0x1b80, 0x1b81, direction::NSM}, {0x1b82, 0x1ba1, direction::L}, - {0x1ba2, 0x1ba5, direction::NSM}, {0x1ba6, 0x1ba7, direction::L}, - {0x1ba8, 0x1ba9, direction::NSM}, {0x1baa, 0x1baa, direction::L}, - {0x1bab, 0x1bad, direction::NSM}, {0x1bae, 0x1be5, direction::L}, - {0x1be6, 0x1be6, direction::NSM}, {0x1be7, 0x1be7, direction::L}, - {0x1be8, 0x1be9, direction::NSM}, {0x1bea, 0x1bec, direction::L}, - {0x1bed, 0x1bed, direction::NSM}, {0x1bee, 0x1bee, direction::L}, - {0x1bef, 0x1bf1, direction::NSM}, {0x1bf2, 0x1bf3, direction::L}, - {0x1bfc, 0x1c2b, direction::L}, {0x1c2c, 0x1c33, direction::NSM}, - {0x1c34, 0x1c35, direction::L}, {0x1c36, 0x1c37, direction::NSM}, - {0x1c3b, 0x1c49, direction::L}, {0x1c4d, 0x1c88, direction::L}, - {0x1c90, 0x1cba, direction::L}, {0x1cbd, 0x1cc7, direction::L}, - {0x1cd0, 0x1cd2, direction::NSM}, {0x1cd3, 0x1cd3, direction::L}, - {0x1cd4, 0x1ce0, direction::NSM}, {0x1ce1, 0x1ce1, direction::L}, - {0x1ce2, 0x1ce8, direction::NSM}, {0x1ce9, 0x1cec, direction::L}, - {0x1ced, 0x1ced, direction::NSM}, {0x1cee, 0x1cf3, direction::L}, - {0x1cf4, 0x1cf4, direction::NSM}, {0x1cf5, 0x1cf7, direction::L}, - {0x1cf8, 0x1cf9, direction::NSM}, {0x1cfa, 0x1cfa, direction::L}, - {0x1d00, 0x1dbf, direction::L}, {0x1dc0, 0x1df9, direction::NSM}, - {0x1dfb, 0x1dff, direction::NSM}, {0x1e00, 0x1f15, direction::L}, - {0x1f18, 0x1f1d, direction::L}, {0x1f20, 0x1f45, direction::L}, - {0x1f48, 0x1f4d, direction::L}, {0x1f50, 0x1f57, direction::L}, - {0x1f59, 0x1f59, direction::L}, {0x1f5b, 0x1f5b, direction::L}, - {0x1f5d, 0x1f5d, direction::L}, {0x1f5f, 0x1f7d, direction::L}, - {0x1f80, 0x1fb4, direction::L}, {0x1fb6, 0x1fbc, direction::L}, - {0x1fbd, 0x1fbd, direction::ON}, {0x1fbe, 0x1fbe, direction::L}, - {0x1fbf, 0x1fc1, direction::ON}, {0x1fc2, 0x1fc4, direction::L}, - {0x1fc6, 0x1fcc, direction::L}, {0x1fcd, 0x1fcf, direction::ON}, - {0x1fd0, 0x1fd3, direction::L}, {0x1fd6, 0x1fdb, direction::L}, - {0x1fdd, 0x1fdf, direction::ON}, {0x1fe0, 0x1fec, direction::L}, - {0x1fed, 0x1fef, direction::ON}, {0x1ff2, 0x1ff4, direction::L}, - {0x1ff6, 0x1ffc, direction::L}, {0x1ffd, 0x1ffe, direction::ON}, - {0x2000, 0x200a, direction::WS}, {0x200b, 0x200d, direction::BN}, - {0x200e, 0x200e, direction::L}, {0x200f, 0x200f, direction::R}, - {0x2010, 0x2027, direction::ON}, {0x2028, 0x2028, direction::WS}, - {0x2029, 0x2029, direction::B}, {0x202a, 0x202a, direction::LRE}, - {0x202b, 0x202b, direction::RLE}, {0x202c, 0x202c, direction::PDF}, - {0x202d, 0x202d, direction::LRO}, {0x202e, 0x202e, direction::RLO}, - {0x202f, 0x202f, direction::CS}, {0x2030, 0x2034, direction::ET}, - {0x2035, 0x2043, direction::ON}, {0x2044, 0x2044, direction::CS}, - {0x2045, 0x205e, direction::ON}, {0x205f, 0x205f, direction::WS}, - {0x2060, 0x2064, direction::BN}, {0x2066, 0x2066, direction::LRI}, - {0x2067, 0x2067, direction::RLI}, {0x2068, 0x2068, direction::FSI}, - {0x2069, 0x2069, direction::PDI}, {0x206a, 0x206f, direction::BN}, - {0x2070, 0x2070, direction::EN}, {0x2071, 0x2071, direction::L}, - {0x2074, 0x2079, direction::EN}, {0x207a, 0x207b, direction::ES}, - {0x207c, 0x207e, direction::ON}, {0x207f, 0x207f, direction::L}, - {0x2080, 0x2089, direction::EN}, {0x208a, 0x208b, direction::ES}, - {0x208c, 0x208e, direction::ON}, {0x2090, 0x209c, direction::L}, - {0x20a0, 0x20bf, direction::ET}, {0x20d0, 0x20f0, direction::NSM}, - {0x2100, 0x2101, direction::ON}, {0x2102, 0x2102, direction::L}, - {0x2103, 0x2106, direction::ON}, {0x2107, 0x2107, direction::L}, - {0x2108, 0x2109, direction::ON}, {0x210a, 0x2113, direction::L}, - {0x2114, 0x2114, direction::ON}, {0x2115, 0x2115, direction::L}, - {0x2116, 0x2118, direction::ON}, {0x2119, 0x211d, direction::L}, - {0x211e, 0x2123, direction::ON}, {0x2124, 0x2124, direction::L}, - {0x2125, 0x2125, direction::ON}, {0x2126, 0x2126, direction::L}, - {0x2127, 0x2127, direction::ON}, {0x2128, 0x2128, direction::L}, - {0x2129, 0x2129, direction::ON}, {0x212a, 0x212d, direction::L}, - {0x212e, 0x212e, direction::ET}, {0x212f, 0x2139, direction::L}, - {0x213a, 0x213b, direction::ON}, {0x213c, 0x213f, direction::L}, - {0x2140, 0x2144, direction::ON}, {0x2145, 0x2149, direction::L}, - {0x214a, 0x214d, direction::ON}, {0x214e, 0x214f, direction::L}, - {0x2150, 0x215f, direction::ON}, {0x2160, 0x2188, direction::L}, - {0x2189, 0x218b, direction::ON}, {0x2190, 0x2211, direction::ON}, - {0x2212, 0x2212, direction::ES}, {0x2213, 0x2213, direction::ET}, - {0x2214, 0x2335, direction::ON}, {0x2336, 0x237a, direction::L}, - {0x237b, 0x2394, direction::ON}, {0x2395, 0x2395, direction::L}, - {0x2396, 0x2426, direction::ON}, {0x2440, 0x244a, direction::ON}, - {0x2460, 0x2487, direction::ON}, {0x2488, 0x249b, direction::EN}, - {0x249c, 0x24e9, direction::L}, {0x24ea, 0x26ab, direction::ON}, - {0x26ac, 0x26ac, direction::L}, {0x26ad, 0x27ff, direction::ON}, - {0x2800, 0x28ff, direction::L}, {0x2900, 0x2b73, direction::ON}, - {0x2b76, 0x2b95, direction::ON}, {0x2b97, 0x2bff, direction::ON}, - {0x2c00, 0x2c2e, direction::L}, {0x2c30, 0x2c5e, direction::L}, - {0x2c60, 0x2ce4, direction::L}, {0x2ce5, 0x2cea, direction::ON}, - {0x2ceb, 0x2cee, direction::L}, {0x2cef, 0x2cf1, direction::NSM}, - {0x2cf2, 0x2cf3, direction::L}, {0x2cf9, 0x2cff, direction::ON}, - {0x2d00, 0x2d25, direction::L}, {0x2d27, 0x2d27, direction::L}, - {0x2d2d, 0x2d2d, direction::L}, {0x2d30, 0x2d67, direction::L}, - {0x2d6f, 0x2d70, direction::L}, {0x2d7f, 0x2d7f, direction::NSM}, - {0x2d80, 0x2d96, direction::L}, {0x2da0, 0x2da6, direction::L}, - {0x2da8, 0x2dae, direction::L}, {0x2db0, 0x2db6, direction::L}, - {0x2db8, 0x2dbe, direction::L}, {0x2dc0, 0x2dc6, direction::L}, - {0x2dc8, 0x2dce, direction::L}, {0x2dd0, 0x2dd6, direction::L}, - {0x2dd8, 0x2dde, direction::L}, {0x2de0, 0x2dff, direction::NSM}, - {0x2e00, 0x2e52, direction::ON}, {0x2e80, 0x2e99, direction::ON}, - {0x2e9b, 0x2ef3, direction::ON}, {0x2f00, 0x2fd5, direction::ON}, - {0x2ff0, 0x2ffb, direction::ON}, {0x3000, 0x3000, direction::WS}, - {0x3001, 0x3004, direction::ON}, {0x3005, 0x3007, direction::L}, - {0x3008, 0x3020, direction::ON}, {0x3021, 0x3029, direction::L}, - {0x302a, 0x302d, direction::NSM}, {0x302e, 0x302f, direction::L}, - {0x3030, 0x3030, direction::ON}, {0x3031, 0x3035, direction::L}, - {0x3036, 0x3037, direction::ON}, {0x3038, 0x303c, direction::L}, - {0x303d, 0x303f, direction::ON}, {0x3041, 0x3096, direction::L}, - {0x3099, 0x309a, direction::NSM}, {0x309b, 0x309c, direction::ON}, - {0x309d, 0x309f, direction::L}, {0x30a0, 0x30a0, direction::ON}, - {0x30a1, 0x30fa, direction::L}, {0x30fb, 0x30fb, direction::ON}, - {0x30fc, 0x30ff, direction::L}, {0x3105, 0x312f, direction::L}, - {0x3131, 0x318e, direction::L}, {0x3190, 0x31bf, direction::L}, - {0x31c0, 0x31e3, direction::ON}, {0x31f0, 0x321c, direction::L}, - {0x321d, 0x321e, direction::ON}, {0x3220, 0x324f, direction::L}, - {0x3250, 0x325f, direction::ON}, {0x3260, 0x327b, direction::L}, - {0x327c, 0x327e, direction::ON}, {0x327f, 0x32b0, direction::L}, - {0x32b1, 0x32bf, direction::ON}, {0x32c0, 0x32cb, direction::L}, - {0x32cc, 0x32cf, direction::ON}, {0x32d0, 0x3376, direction::L}, - {0x3377, 0x337a, direction::ON}, {0x337b, 0x33dd, direction::L}, - {0x33de, 0x33df, direction::ON}, {0x33e0, 0x33fe, direction::L}, - {0x33ff, 0x33ff, direction::ON}, {0x3400, 0x4dbf, direction::L}, - {0x4dc0, 0x4dff, direction::ON}, {0x4e00, 0x9ffc, direction::L}, - {0xa000, 0xa48c, direction::L}, {0xa490, 0xa4c6, direction::ON}, - {0xa4d0, 0xa60c, direction::L}, {0xa60d, 0xa60f, direction::ON}, - {0xa610, 0xa62b, direction::L}, {0xa640, 0xa66e, direction::L}, - {0xa66f, 0xa672, direction::NSM}, {0xa673, 0xa673, direction::ON}, - {0xa674, 0xa67d, direction::NSM}, {0xa67e, 0xa67f, direction::ON}, - {0xa680, 0xa69d, direction::L}, {0xa69e, 0xa69f, direction::NSM}, - {0xa6a0, 0xa6ef, direction::L}, {0xa6f0, 0xa6f1, direction::NSM}, - {0xa6f2, 0xa6f7, direction::L}, {0xa700, 0xa721, direction::ON}, - {0xa722, 0xa787, direction::L}, {0xa788, 0xa788, direction::ON}, - {0xa789, 0xa7bf, direction::L}, {0xa7c2, 0xa7ca, direction::L}, - {0xa7f5, 0xa801, direction::L}, {0xa802, 0xa802, direction::NSM}, - {0xa803, 0xa805, direction::L}, {0xa806, 0xa806, direction::NSM}, - {0xa807, 0xa80a, direction::L}, {0xa80b, 0xa80b, direction::NSM}, - {0xa80c, 0xa824, direction::L}, {0xa825, 0xa826, direction::NSM}, - {0xa827, 0xa827, direction::L}, {0xa828, 0xa82b, direction::ON}, - {0xa82c, 0xa82c, direction::NSM}, {0xa830, 0xa837, direction::L}, - {0xa838, 0xa839, direction::ET}, {0xa840, 0xa873, direction::L}, - {0xa874, 0xa877, direction::ON}, {0xa880, 0xa8c3, direction::L}, - {0xa8c4, 0xa8c5, direction::NSM}, {0xa8ce, 0xa8d9, direction::L}, - {0xa8e0, 0xa8f1, direction::NSM}, {0xa8f2, 0xa8fe, direction::L}, - {0xa8ff, 0xa8ff, direction::NSM}, {0xa900, 0xa925, direction::L}, - {0xa926, 0xa92d, direction::NSM}, {0xa92e, 0xa946, direction::L}, - {0xa947, 0xa951, direction::NSM}, {0xa952, 0xa953, direction::L}, - {0xa95f, 0xa97c, direction::L}, {0xa980, 0xa982, direction::NSM}, - {0xa983, 0xa9b2, direction::L}, {0xa9b3, 0xa9b3, direction::NSM}, - {0xa9b4, 0xa9b5, direction::L}, {0xa9b6, 0xa9b9, direction::NSM}, - {0xa9ba, 0xa9bb, direction::L}, {0xa9bc, 0xa9bd, direction::NSM}, - {0xa9be, 0xa9cd, direction::L}, {0xa9cf, 0xa9d9, direction::L}, - {0xa9de, 0xa9e4, direction::L}, {0xa9e5, 0xa9e5, direction::NSM}, - {0xa9e6, 0xa9fe, direction::L}, {0xaa00, 0xaa28, direction::L}, - {0xaa29, 0xaa2e, direction::NSM}, {0xaa2f, 0xaa30, direction::L}, - {0xaa31, 0xaa32, direction::NSM}, {0xaa33, 0xaa34, direction::L}, - {0xaa35, 0xaa36, direction::NSM}, {0xaa40, 0xaa42, direction::L}, - {0xaa43, 0xaa43, direction::NSM}, {0xaa44, 0xaa4b, direction::L}, - {0xaa4c, 0xaa4c, direction::NSM}, {0xaa4d, 0xaa4d, direction::L}, - {0xaa50, 0xaa59, direction::L}, {0xaa5c, 0xaa7b, direction::L}, - {0xaa7c, 0xaa7c, direction::NSM}, {0xaa7d, 0xaaaf, direction::L}, - {0xaab0, 0xaab0, direction::NSM}, {0xaab1, 0xaab1, direction::L}, - {0xaab2, 0xaab4, direction::NSM}, {0xaab5, 0xaab6, direction::L}, - {0xaab7, 0xaab8, direction::NSM}, {0xaab9, 0xaabd, direction::L}, - {0xaabe, 0xaabf, direction::NSM}, {0xaac0, 0xaac0, direction::L}, - {0xaac1, 0xaac1, direction::NSM}, {0xaac2, 0xaac2, direction::L}, - {0xaadb, 0xaaeb, direction::L}, {0xaaec, 0xaaed, direction::NSM}, - {0xaaee, 0xaaf5, direction::L}, {0xaaf6, 0xaaf6, direction::NSM}, - {0xab01, 0xab06, direction::L}, {0xab09, 0xab0e, direction::L}, - {0xab11, 0xab16, direction::L}, {0xab20, 0xab26, direction::L}, - {0xab28, 0xab2e, direction::L}, {0xab30, 0xab69, direction::L}, - {0xab6a, 0xab6b, direction::ON}, {0xab70, 0xabe4, direction::L}, - {0xabe5, 0xabe5, direction::NSM}, {0xabe6, 0xabe7, direction::L}, - {0xabe8, 0xabe8, direction::NSM}, {0xabe9, 0xabec, direction::L}, - {0xabed, 0xabed, direction::NSM}, {0xabf0, 0xabf9, direction::L}, - {0xac00, 0xd7a3, direction::L}, {0xd7b0, 0xd7c6, direction::L}, - {0xd7cb, 0xd7fb, direction::L}, {0xd800, 0xfa6d, direction::L}, - {0xfa70, 0xfad9, direction::L}, {0xfb00, 0xfb06, direction::L}, - {0xfb13, 0xfb17, direction::L}, {0xfb1d, 0xfb1d, direction::R}, - {0xfb1e, 0xfb1e, direction::NSM}, {0xfb1f, 0xfb28, direction::R}, - {0xfb29, 0xfb29, direction::ES}, {0xfb2a, 0xfb36, direction::R}, - {0xfb38, 0xfb3c, direction::R}, {0xfb3e, 0xfb3e, direction::R}, - {0xfb40, 0xfb41, direction::R}, {0xfb43, 0xfb44, direction::R}, - {0xfb46, 0xfb4f, direction::R}, {0xfb50, 0xfbc1, direction::AL}, - {0xfbd3, 0xfd3d, direction::AL}, {0xfd3e, 0xfd3f, direction::ON}, - {0xfd50, 0xfd8f, direction::AL}, {0xfd92, 0xfdc7, direction::AL}, - {0xfdf0, 0xfdfc, direction::AL}, {0xfdfd, 0xfdfd, direction::ON}, - {0xfe00, 0xfe0f, direction::NSM}, {0xfe10, 0xfe19, direction::ON}, - {0xfe20, 0xfe2f, direction::NSM}, {0xfe30, 0xfe4f, direction::ON}, - {0xfe50, 0xfe50, direction::CS}, {0xfe51, 0xfe51, direction::ON}, - {0xfe52, 0xfe52, direction::CS}, {0xfe54, 0xfe54, direction::ON}, - {0xfe55, 0xfe55, direction::CS}, {0xfe56, 0xfe5e, direction::ON}, - {0xfe5f, 0xfe5f, direction::ET}, {0xfe60, 0xfe61, direction::ON}, - {0xfe62, 0xfe63, direction::ES}, {0xfe64, 0xfe66, direction::ON}, - {0xfe68, 0xfe68, direction::ON}, {0xfe69, 0xfe6a, direction::ET}, - {0xfe6b, 0xfe6b, direction::ON}, {0xfe70, 0xfe74, direction::AL}, - {0xfe76, 0xfefc, direction::AL}, {0xfeff, 0xfeff, direction::BN}, - {0xff01, 0xff02, direction::ON}, {0xff03, 0xff05, direction::ET}, - {0xff06, 0xff0a, direction::ON}, {0xff0b, 0xff0b, direction::ES}, - {0xff0c, 0xff0c, direction::CS}, {0xff0d, 0xff0d, direction::ES}, - {0xff0e, 0xff0f, direction::CS}, {0xff10, 0xff19, direction::EN}, - {0xff1a, 0xff1a, direction::CS}, {0xff1b, 0xff20, direction::ON}, - {0xff21, 0xff3a, direction::L}, {0xff3b, 0xff40, direction::ON}, - {0xff41, 0xff5a, direction::L}, {0xff5b, 0xff65, direction::ON}, - {0xff66, 0xffbe, direction::L}, {0xffc2, 0xffc7, direction::L}, - {0xffca, 0xffcf, direction::L}, {0xffd2, 0xffd7, direction::L}, - {0xffda, 0xffdc, direction::L}, {0xffe0, 0xffe1, direction::ET}, - {0xffe2, 0xffe4, direction::ON}, {0xffe5, 0xffe6, direction::ET}, - {0xffe8, 0xffee, direction::ON}, {0xfff9, 0xfffd, direction::ON}, - {0x10000, 0x1000b, direction::L}, {0x1000d, 0x10026, direction::L}, - {0x10028, 0x1003a, direction::L}, {0x1003c, 0x1003d, direction::L}, - {0x1003f, 0x1004d, direction::L}, {0x10050, 0x1005d, direction::L}, - {0x10080, 0x100fa, direction::L}, {0x10100, 0x10100, direction::L}, - {0x10101, 0x10101, direction::ON}, {0x10102, 0x10102, direction::L}, - {0x10107, 0x10133, direction::L}, {0x10137, 0x1013f, direction::L}, - {0x10140, 0x1018c, direction::ON}, {0x1018d, 0x1018e, direction::L}, - {0x10190, 0x1019c, direction::ON}, {0x101a0, 0x101a0, direction::ON}, - {0x101d0, 0x101fc, direction::L}, {0x101fd, 0x101fd, direction::NSM}, - {0x10280, 0x1029c, direction::L}, {0x102a0, 0x102d0, direction::L}, - {0x102e0, 0x102e0, direction::NSM}, {0x102e1, 0x102fb, direction::EN}, - {0x10300, 0x10323, direction::L}, {0x1032d, 0x1034a, direction::L}, - {0x10350, 0x10375, direction::L}, {0x10376, 0x1037a, direction::NSM}, - {0x10380, 0x1039d, direction::L}, {0x1039f, 0x103c3, direction::L}, - {0x103c8, 0x103d5, direction::L}, {0x10400, 0x1049d, direction::L}, - {0x104a0, 0x104a9, direction::L}, {0x104b0, 0x104d3, direction::L}, - {0x104d8, 0x104fb, direction::L}, {0x10500, 0x10527, direction::L}, - {0x10530, 0x10563, direction::L}, {0x1056f, 0x1056f, direction::L}, - {0x10600, 0x10736, direction::L}, {0x10740, 0x10755, direction::L}, - {0x10760, 0x10767, direction::L}, {0x10800, 0x10805, direction::R}, - {0x10808, 0x10808, direction::R}, {0x1080a, 0x10835, direction::R}, - {0x10837, 0x10838, direction::R}, {0x1083c, 0x1083c, direction::R}, - {0x1083f, 0x10855, direction::R}, {0x10857, 0x1089e, direction::R}, - {0x108a7, 0x108af, direction::R}, {0x108e0, 0x108f2, direction::R}, - {0x108f4, 0x108f5, direction::R}, {0x108fb, 0x1091b, direction::R}, - {0x1091f, 0x1091f, direction::ON}, {0x10920, 0x10939, direction::R}, - {0x1093f, 0x1093f, direction::R}, {0x10980, 0x109b7, direction::R}, - {0x109bc, 0x109cf, direction::R}, {0x109d2, 0x10a00, direction::R}, - {0x10a01, 0x10a03, direction::NSM}, {0x10a05, 0x10a06, direction::NSM}, - {0x10a0c, 0x10a0f, direction::NSM}, {0x10a10, 0x10a13, direction::R}, - {0x10a15, 0x10a17, direction::R}, {0x10a19, 0x10a35, direction::R}, - {0x10a38, 0x10a3a, direction::NSM}, {0x10a3f, 0x10a3f, direction::NSM}, - {0x10a40, 0x10a48, direction::R}, {0x10a50, 0x10a58, direction::R}, - {0x10a60, 0x10a9f, direction::R}, {0x10ac0, 0x10ae4, direction::R}, - {0x10ae5, 0x10ae6, direction::NSM}, {0x10aeb, 0x10af6, direction::R}, - {0x10b00, 0x10b35, direction::R}, {0x10b39, 0x10b3f, direction::ON}, - {0x10b40, 0x10b55, direction::R}, {0x10b58, 0x10b72, direction::R}, - {0x10b78, 0x10b91, direction::R}, {0x10b99, 0x10b9c, direction::R}, - {0x10ba9, 0x10baf, direction::R}, {0x10c00, 0x10c48, direction::R}, - {0x10c80, 0x10cb2, direction::R}, {0x10cc0, 0x10cf2, direction::R}, - {0x10cfa, 0x10cff, direction::R}, {0x10d00, 0x10d23, direction::AL}, - {0x10d24, 0x10d27, direction::NSM}, {0x10d30, 0x10d39, direction::AN}, - {0x10e60, 0x10e7e, direction::AN}, {0x10e80, 0x10ea9, direction::R}, - {0x10eab, 0x10eac, direction::NSM}, {0x10ead, 0x10ead, direction::R}, - {0x10eb0, 0x10eb1, direction::R}, {0x10f00, 0x10f27, direction::R}, - {0x10f30, 0x10f45, direction::AL}, {0x10f46, 0x10f50, direction::NSM}, - {0x10f51, 0x10f59, direction::AL}, {0x10fb0, 0x10fcb, direction::R}, - {0x10fe0, 0x10ff6, direction::R}, {0x11000, 0x11000, direction::L}, - {0x11001, 0x11001, direction::NSM}, {0x11002, 0x11037, direction::L}, - {0x11038, 0x11046, direction::NSM}, {0x11047, 0x1104d, direction::L}, - {0x11052, 0x11065, direction::ON}, {0x11066, 0x1106f, direction::L}, - {0x1107f, 0x11081, direction::NSM}, {0x11082, 0x110b2, direction::L}, - {0x110b3, 0x110b6, direction::NSM}, {0x110b7, 0x110b8, direction::L}, - {0x110b9, 0x110ba, direction::NSM}, {0x110bb, 0x110c1, direction::L}, - {0x110cd, 0x110cd, direction::L}, {0x110d0, 0x110e8, direction::L}, - {0x110f0, 0x110f9, direction::L}, {0x11100, 0x11102, direction::NSM}, - {0x11103, 0x11126, direction::L}, {0x11127, 0x1112b, direction::NSM}, - {0x1112c, 0x1112c, direction::L}, {0x1112d, 0x11134, direction::NSM}, - {0x11136, 0x11147, direction::L}, {0x11150, 0x11172, direction::L}, - {0x11173, 0x11173, direction::NSM}, {0x11174, 0x11176, direction::L}, - {0x11180, 0x11181, direction::NSM}, {0x11182, 0x111b5, direction::L}, - {0x111b6, 0x111be, direction::NSM}, {0x111bf, 0x111c8, direction::L}, - {0x111c9, 0x111cc, direction::NSM}, {0x111cd, 0x111ce, direction::L}, - {0x111cf, 0x111cf, direction::NSM}, {0x111d0, 0x111df, direction::L}, - {0x111e1, 0x111f4, direction::L}, {0x11200, 0x11211, direction::L}, - {0x11213, 0x1122e, direction::L}, {0x1122f, 0x11231, direction::NSM}, - {0x11232, 0x11233, direction::L}, {0x11234, 0x11234, direction::NSM}, - {0x11235, 0x11235, direction::L}, {0x11236, 0x11237, direction::NSM}, - {0x11238, 0x1123d, direction::L}, {0x1123e, 0x1123e, direction::NSM}, - {0x11280, 0x11286, direction::L}, {0x11288, 0x11288, direction::L}, - {0x1128a, 0x1128d, direction::L}, {0x1128f, 0x1129d, direction::L}, - {0x1129f, 0x112a9, direction::L}, {0x112b0, 0x112de, direction::L}, - {0x112df, 0x112df, direction::NSM}, {0x112e0, 0x112e2, direction::L}, - {0x112e3, 0x112ea, direction::NSM}, {0x112f0, 0x112f9, direction::L}, - {0x11300, 0x11301, direction::NSM}, {0x11302, 0x11303, direction::L}, - {0x11305, 0x1130c, direction::L}, {0x1130f, 0x11310, direction::L}, - {0x11313, 0x11328, direction::L}, {0x1132a, 0x11330, direction::L}, - {0x11332, 0x11333, direction::L}, {0x11335, 0x11339, direction::L}, - {0x1133b, 0x1133c, direction::NSM}, {0x1133d, 0x1133f, direction::L}, - {0x11340, 0x11340, direction::NSM}, {0x11341, 0x11344, direction::L}, - {0x11347, 0x11348, direction::L}, {0x1134b, 0x1134d, direction::L}, - {0x11350, 0x11350, direction::L}, {0x11357, 0x11357, direction::L}, - {0x1135d, 0x11363, direction::L}, {0x11366, 0x1136c, direction::NSM}, - {0x11370, 0x11374, direction::NSM}, {0x11400, 0x11437, direction::L}, - {0x11438, 0x1143f, direction::NSM}, {0x11440, 0x11441, direction::L}, - {0x11442, 0x11444, direction::NSM}, {0x11445, 0x11445, direction::L}, - {0x11446, 0x11446, direction::NSM}, {0x11447, 0x1145b, direction::L}, - {0x1145d, 0x1145d, direction::L}, {0x1145e, 0x1145e, direction::NSM}, - {0x1145f, 0x11461, direction::L}, {0x11480, 0x114b2, direction::L}, - {0x114b3, 0x114b8, direction::NSM}, {0x114b9, 0x114b9, direction::L}, - {0x114ba, 0x114ba, direction::NSM}, {0x114bb, 0x114be, direction::L}, - {0x114bf, 0x114c0, direction::NSM}, {0x114c1, 0x114c1, direction::L}, - {0x114c2, 0x114c3, direction::NSM}, {0x114c4, 0x114c7, direction::L}, - {0x114d0, 0x114d9, direction::L}, {0x11580, 0x115b1, direction::L}, - {0x115b2, 0x115b5, direction::NSM}, {0x115b8, 0x115bb, direction::L}, - {0x115bc, 0x115bd, direction::NSM}, {0x115be, 0x115be, direction::L}, - {0x115bf, 0x115c0, direction::NSM}, {0x115c1, 0x115db, direction::L}, - {0x115dc, 0x115dd, direction::NSM}, {0x11600, 0x11632, direction::L}, - {0x11633, 0x1163a, direction::NSM}, {0x1163b, 0x1163c, direction::L}, - {0x1163d, 0x1163d, direction::NSM}, {0x1163e, 0x1163e, direction::L}, - {0x1163f, 0x11640, direction::NSM}, {0x11641, 0x11644, direction::L}, - {0x11650, 0x11659, direction::L}, {0x11660, 0x1166c, direction::ON}, - {0x11680, 0x116aa, direction::L}, {0x116ab, 0x116ab, direction::NSM}, - {0x116ac, 0x116ac, direction::L}, {0x116ad, 0x116ad, direction::NSM}, - {0x116ae, 0x116af, direction::L}, {0x116b0, 0x116b5, direction::NSM}, - {0x116b6, 0x116b6, direction::L}, {0x116b7, 0x116b7, direction::NSM}, - {0x116b8, 0x116b8, direction::L}, {0x116c0, 0x116c9, direction::L}, - {0x11700, 0x1171a, direction::L}, {0x1171d, 0x1171f, direction::NSM}, - {0x11720, 0x11721, direction::L}, {0x11722, 0x11725, direction::NSM}, - {0x11726, 0x11726, direction::L}, {0x11727, 0x1172b, direction::NSM}, - {0x11730, 0x1173f, direction::L}, {0x11800, 0x1182e, direction::L}, - {0x1182f, 0x11837, direction::NSM}, {0x11838, 0x11838, direction::L}, - {0x11839, 0x1183a, direction::NSM}, {0x1183b, 0x1183b, direction::L}, - {0x118a0, 0x118f2, direction::L}, {0x118ff, 0x11906, direction::L}, - {0x11909, 0x11909, direction::L}, {0x1190c, 0x11913, direction::L}, - {0x11915, 0x11916, direction::L}, {0x11918, 0x11935, direction::L}, - {0x11937, 0x11938, direction::L}, {0x1193b, 0x1193c, direction::NSM}, - {0x1193d, 0x1193d, direction::L}, {0x1193e, 0x1193e, direction::NSM}, - {0x1193f, 0x11942, direction::L}, {0x11943, 0x11943, direction::NSM}, - {0x11944, 0x11946, direction::L}, {0x11950, 0x11959, direction::L}, - {0x119a0, 0x119a7, direction::L}, {0x119aa, 0x119d3, direction::L}, - {0x119d4, 0x119d7, direction::NSM}, {0x119da, 0x119db, direction::NSM}, - {0x119dc, 0x119df, direction::L}, {0x119e0, 0x119e0, direction::NSM}, - {0x119e1, 0x119e4, direction::L}, {0x11a00, 0x11a00, direction::L}, - {0x11a01, 0x11a06, direction::NSM}, {0x11a07, 0x11a08, direction::L}, - {0x11a09, 0x11a0a, direction::NSM}, {0x11a0b, 0x11a32, direction::L}, - {0x11a33, 0x11a38, direction::NSM}, {0x11a39, 0x11a3a, direction::L}, - {0x11a3b, 0x11a3e, direction::NSM}, {0x11a3f, 0x11a46, direction::L}, - {0x11a47, 0x11a47, direction::NSM}, {0x11a50, 0x11a50, direction::L}, - {0x11a51, 0x11a56, direction::NSM}, {0x11a57, 0x11a58, direction::L}, - {0x11a59, 0x11a5b, direction::NSM}, {0x11a5c, 0x11a89, direction::L}, - {0x11a8a, 0x11a96, direction::NSM}, {0x11a97, 0x11a97, direction::L}, - {0x11a98, 0x11a99, direction::NSM}, {0x11a9a, 0x11aa2, direction::L}, - {0x11ac0, 0x11af8, direction::L}, {0x11c00, 0x11c08, direction::L}, - {0x11c0a, 0x11c2f, direction::L}, {0x11c30, 0x11c36, direction::NSM}, - {0x11c38, 0x11c3d, direction::NSM}, {0x11c3e, 0x11c45, direction::L}, - {0x11c50, 0x11c6c, direction::L}, {0x11c70, 0x11c8f, direction::L}, - {0x11c92, 0x11ca7, direction::NSM}, {0x11ca9, 0x11ca9, direction::L}, - {0x11caa, 0x11cb0, direction::NSM}, {0x11cb1, 0x11cb1, direction::L}, - {0x11cb2, 0x11cb3, direction::NSM}, {0x11cb4, 0x11cb4, direction::L}, - {0x11cb5, 0x11cb6, direction::NSM}, {0x11d00, 0x11d06, direction::L}, - {0x11d08, 0x11d09, direction::L}, {0x11d0b, 0x11d30, direction::L}, - {0x11d31, 0x11d36, direction::NSM}, {0x11d3a, 0x11d3a, direction::NSM}, - {0x11d3c, 0x11d3d, direction::NSM}, {0x11d3f, 0x11d45, direction::NSM}, - {0x11d46, 0x11d46, direction::L}, {0x11d47, 0x11d47, direction::NSM}, - {0x11d50, 0x11d59, direction::L}, {0x11d60, 0x11d65, direction::L}, - {0x11d67, 0x11d68, direction::L}, {0x11d6a, 0x11d8e, direction::L}, - {0x11d90, 0x11d91, direction::NSM}, {0x11d93, 0x11d94, direction::L}, - {0x11d95, 0x11d95, direction::NSM}, {0x11d96, 0x11d96, direction::L}, - {0x11d97, 0x11d97, direction::NSM}, {0x11d98, 0x11d98, direction::L}, - {0x11da0, 0x11da9, direction::L}, {0x11ee0, 0x11ef2, direction::L}, - {0x11ef3, 0x11ef4, direction::NSM}, {0x11ef5, 0x11ef8, direction::L}, - {0x11fb0, 0x11fb0, direction::L}, {0x11fc0, 0x11fd4, direction::L}, - {0x11fd5, 0x11fdc, direction::ON}, {0x11fdd, 0x11fe0, direction::ET}, - {0x11fe1, 0x11ff1, direction::ON}, {0x11fff, 0x12399, direction::L}, - {0x12400, 0x1246e, direction::L}, {0x12470, 0x12474, direction::L}, - {0x12480, 0x12543, direction::L}, {0x13000, 0x1342e, direction::L}, - {0x13430, 0x13438, direction::L}, {0x14400, 0x14646, direction::L}, - {0x16800, 0x16a38, direction::L}, {0x16a40, 0x16a5e, direction::L}, - {0x16a60, 0x16a69, direction::L}, {0x16a6e, 0x16a6f, direction::L}, - {0x16ad0, 0x16aed, direction::L}, {0x16af0, 0x16af4, direction::NSM}, - {0x16af5, 0x16af5, direction::L}, {0x16b00, 0x16b2f, direction::L}, - {0x16b30, 0x16b36, direction::NSM}, {0x16b37, 0x16b45, direction::L}, - {0x16b50, 0x16b59, direction::L}, {0x16b5b, 0x16b61, direction::L}, - {0x16b63, 0x16b77, direction::L}, {0x16b7d, 0x16b8f, direction::L}, - {0x16e40, 0x16e9a, direction::L}, {0x16f00, 0x16f4a, direction::L}, - {0x16f4f, 0x16f4f, direction::NSM}, {0x16f50, 0x16f87, direction::L}, - {0x16f8f, 0x16f92, direction::NSM}, {0x16f93, 0x16f9f, direction::L}, - {0x16fe0, 0x16fe1, direction::L}, {0x16fe2, 0x16fe2, direction::ON}, - {0x16fe3, 0x16fe3, direction::L}, {0x16fe4, 0x16fe4, direction::NSM}, - {0x16ff0, 0x16ff1, direction::L}, {0x17000, 0x187f7, direction::L}, - {0x18800, 0x18cd5, direction::L}, {0x18d00, 0x18d08, direction::L}, - {0x1b000, 0x1b11e, direction::L}, {0x1b150, 0x1b152, direction::L}, - {0x1b164, 0x1b167, direction::L}, {0x1b170, 0x1b2fb, direction::L}, - {0x1bc00, 0x1bc6a, direction::L}, {0x1bc70, 0x1bc7c, direction::L}, - {0x1bc80, 0x1bc88, direction::L}, {0x1bc90, 0x1bc99, direction::L}, - {0x1bc9c, 0x1bc9c, direction::L}, {0x1bc9d, 0x1bc9e, direction::NSM}, - {0x1bc9f, 0x1bc9f, direction::L}, {0x1bca0, 0x1bca3, direction::BN}, - {0x1d000, 0x1d0f5, direction::L}, {0x1d100, 0x1d126, direction::L}, - {0x1d129, 0x1d166, direction::L}, {0x1d167, 0x1d169, direction::NSM}, - {0x1d16a, 0x1d172, direction::L}, {0x1d173, 0x1d17a, direction::BN}, - {0x1d17b, 0x1d182, direction::NSM}, {0x1d183, 0x1d184, direction::L}, - {0x1d185, 0x1d18b, direction::NSM}, {0x1d18c, 0x1d1a9, direction::L}, - {0x1d1aa, 0x1d1ad, direction::NSM}, {0x1d1ae, 0x1d1e8, direction::L}, - {0x1d200, 0x1d241, direction::ON}, {0x1d242, 0x1d244, direction::NSM}, - {0x1d245, 0x1d245, direction::ON}, {0x1d2e0, 0x1d2f3, direction::L}, - {0x1d300, 0x1d356, direction::ON}, {0x1d360, 0x1d378, direction::L}, - {0x1d400, 0x1d454, direction::L}, {0x1d456, 0x1d49c, direction::L}, - {0x1d49e, 0x1d49f, direction::L}, {0x1d4a2, 0x1d4a2, direction::L}, - {0x1d4a5, 0x1d4a6, direction::L}, {0x1d4a9, 0x1d4ac, direction::L}, - {0x1d4ae, 0x1d4b9, direction::L}, {0x1d4bb, 0x1d4bb, direction::L}, - {0x1d4bd, 0x1d4c3, direction::L}, {0x1d4c5, 0x1d505, direction::L}, - {0x1d507, 0x1d50a, direction::L}, {0x1d50d, 0x1d514, direction::L}, - {0x1d516, 0x1d51c, direction::L}, {0x1d51e, 0x1d539, direction::L}, - {0x1d53b, 0x1d53e, direction::L}, {0x1d540, 0x1d544, direction::L}, - {0x1d546, 0x1d546, direction::L}, {0x1d54a, 0x1d550, direction::L}, - {0x1d552, 0x1d6a5, direction::L}, {0x1d6a8, 0x1d6da, direction::L}, - {0x1d6db, 0x1d6db, direction::ON}, {0x1d6dc, 0x1d714, direction::L}, - {0x1d715, 0x1d715, direction::ON}, {0x1d716, 0x1d74e, direction::L}, - {0x1d74f, 0x1d74f, direction::ON}, {0x1d750, 0x1d788, direction::L}, - {0x1d789, 0x1d789, direction::ON}, {0x1d78a, 0x1d7c2, direction::L}, - {0x1d7c3, 0x1d7c3, direction::ON}, {0x1d7c4, 0x1d7cb, direction::L}, - {0x1d7ce, 0x1d7ff, direction::EN}, {0x1d800, 0x1d9ff, direction::L}, - {0x1da00, 0x1da36, direction::NSM}, {0x1da37, 0x1da3a, direction::L}, - {0x1da3b, 0x1da6c, direction::NSM}, {0x1da6d, 0x1da74, direction::L}, - {0x1da75, 0x1da75, direction::NSM}, {0x1da76, 0x1da83, direction::L}, - {0x1da84, 0x1da84, direction::NSM}, {0x1da85, 0x1da8b, direction::L}, - {0x1da9b, 0x1da9f, direction::NSM}, {0x1daa1, 0x1daaf, direction::NSM}, - {0x1e000, 0x1e006, direction::NSM}, {0x1e008, 0x1e018, direction::NSM}, - {0x1e01b, 0x1e021, direction::NSM}, {0x1e023, 0x1e024, direction::NSM}, - {0x1e026, 0x1e02a, direction::NSM}, {0x1e100, 0x1e12c, direction::L}, - {0x1e130, 0x1e136, direction::NSM}, {0x1e137, 0x1e13d, direction::L}, - {0x1e140, 0x1e149, direction::L}, {0x1e14e, 0x1e14f, direction::L}, - {0x1e2c0, 0x1e2eb, direction::L}, {0x1e2ec, 0x1e2ef, direction::NSM}, - {0x1e2f0, 0x1e2f9, direction::L}, {0x1e2ff, 0x1e2ff, direction::ET}, - {0x1e800, 0x1e8c4, direction::R}, {0x1e8c7, 0x1e8cf, direction::R}, - {0x1e8d0, 0x1e8d6, direction::NSM}, {0x1e900, 0x1e943, direction::R}, - {0x1e944, 0x1e94a, direction::NSM}, {0x1e94b, 0x1e94b, direction::R}, - {0x1e950, 0x1e959, direction::R}, {0x1e95e, 0x1e95f, direction::R}, - {0x1ec71, 0x1ecb4, direction::AL}, {0x1ed01, 0x1ed3d, direction::AL}, - {0x1ee00, 0x1ee03, direction::AL}, {0x1ee05, 0x1ee1f, direction::AL}, - {0x1ee21, 0x1ee22, direction::AL}, {0x1ee24, 0x1ee24, direction::AL}, - {0x1ee27, 0x1ee27, direction::AL}, {0x1ee29, 0x1ee32, direction::AL}, - {0x1ee34, 0x1ee37, direction::AL}, {0x1ee39, 0x1ee39, direction::AL}, - {0x1ee3b, 0x1ee3b, direction::AL}, {0x1ee42, 0x1ee42, direction::AL}, - {0x1ee47, 0x1ee47, direction::AL}, {0x1ee49, 0x1ee49, direction::AL}, - {0x1ee4b, 0x1ee4b, direction::AL}, {0x1ee4d, 0x1ee4f, direction::AL}, - {0x1ee51, 0x1ee52, direction::AL}, {0x1ee54, 0x1ee54, direction::AL}, - {0x1ee57, 0x1ee57, direction::AL}, {0x1ee59, 0x1ee59, direction::AL}, - {0x1ee5b, 0x1ee5b, direction::AL}, {0x1ee5d, 0x1ee5d, direction::AL}, - {0x1ee5f, 0x1ee5f, direction::AL}, {0x1ee61, 0x1ee62, direction::AL}, - {0x1ee64, 0x1ee64, direction::AL}, {0x1ee67, 0x1ee6a, direction::AL}, - {0x1ee6c, 0x1ee72, direction::AL}, {0x1ee74, 0x1ee77, direction::AL}, - {0x1ee79, 0x1ee7c, direction::AL}, {0x1ee7e, 0x1ee7e, direction::AL}, - {0x1ee80, 0x1ee89, direction::AL}, {0x1ee8b, 0x1ee9b, direction::AL}, - {0x1eea1, 0x1eea3, direction::AL}, {0x1eea5, 0x1eea9, direction::AL}, - {0x1eeab, 0x1eebb, direction::AL}, {0x1eef0, 0x1eef1, direction::ON}, - {0x1f000, 0x1f02b, direction::ON}, {0x1f030, 0x1f093, direction::ON}, - {0x1f0a0, 0x1f0ae, direction::ON}, {0x1f0b1, 0x1f0bf, direction::ON}, - {0x1f0c1, 0x1f0cf, direction::ON}, {0x1f0d1, 0x1f0f5, direction::ON}, - {0x1f100, 0x1f10a, direction::EN}, {0x1f10b, 0x1f10f, direction::ON}, - {0x1f110, 0x1f12e, direction::L}, {0x1f12f, 0x1f12f, direction::ON}, - {0x1f130, 0x1f169, direction::L}, {0x1f16a, 0x1f16f, direction::ON}, - {0x1f170, 0x1f1ac, direction::L}, {0x1f1ad, 0x1f1ad, direction::ON}, - {0x1f1e6, 0x1f202, direction::L}, {0x1f210, 0x1f23b, direction::L}, - {0x1f240, 0x1f248, direction::L}, {0x1f250, 0x1f251, direction::L}, - {0x1f260, 0x1f265, direction::ON}, {0x1f300, 0x1f6d7, direction::ON}, - {0x1f6e0, 0x1f6ec, direction::ON}, {0x1f6f0, 0x1f6fc, direction::ON}, - {0x1f700, 0x1f773, direction::ON}, {0x1f780, 0x1f7d8, direction::ON}, - {0x1f7e0, 0x1f7eb, direction::ON}, {0x1f800, 0x1f80b, direction::ON}, - {0x1f810, 0x1f847, direction::ON}, {0x1f850, 0x1f859, direction::ON}, - {0x1f860, 0x1f887, direction::ON}, {0x1f890, 0x1f8ad, direction::ON}, - {0x1f8b0, 0x1f8b1, direction::ON}, {0x1f900, 0x1f978, direction::ON}, - {0x1f97a, 0x1f9cb, direction::ON}, {0x1f9cd, 0x1fa53, direction::ON}, - {0x1fa60, 0x1fa6d, direction::ON}, {0x1fa70, 0x1fa74, direction::ON}, - {0x1fa78, 0x1fa7a, direction::ON}, {0x1fa80, 0x1fa86, direction::ON}, - {0x1fa90, 0x1faa8, direction::ON}, {0x1fab0, 0x1fab6, direction::ON}, - {0x1fac0, 0x1fac2, direction::ON}, {0x1fad0, 0x1fad6, direction::ON}, - {0x1fb00, 0x1fb92, direction::ON}, {0x1fb94, 0x1fbca, direction::ON}, - {0x1fbf0, 0x1fbf9, direction::EN}, {0x20000, 0x2a6dd, direction::L}, - {0x2a700, 0x2b734, direction::L}, {0x2b740, 0x2b81d, direction::L}, - {0x2b820, 0x2cea1, direction::L}, {0x2ceb0, 0x2ebe0, direction::L}, - {0x2f800, 0x2fa1d, direction::L}, {0x30000, 0x3134a, direction::L}, - {0xe0001, 0xe0001, direction::BN}, {0xe0020, 0xe007f, direction::BN}, - {0xe0100, 0xe01ef, direction::NSM}, {0xf0000, 0xffffd, direction::L}, - {0x100000, 0x10fffd, direction::L}}; +// Bidi direction ranges live in the compressed blob as const SoA arrays +// (dir_start / dir_final / dir_value). See table_store.hpp layout asserts. // CheckJoiners and CheckBidi are true for URL specification. +// Assumes ensure_tables() has already been called by is_label_valid(). inline static direction find_direction(uint32_t code_point) noexcept { - auto it = std::lower_bound( - std::begin(dir_table), std::end(dir_table), code_point, - [](const directions& d, uint32_t c) { return d.final_code < c; }); - - // next check is almost surely in vain, but we use it for safety. - if (it == std::end(dir_table)) { - return direction::NONE; + // Binary search on dir_final (sorted upper bounds). + size_t lo = 0, hi = dir_table_count; + while (lo < hi) { + size_t mid = lo + (hi - lo) / 2; + if (dir_final[mid] < code_point) { + lo = mid + 1; + } else { + hi = mid; + } } - // We have that d.final_code >= c. - if (code_point >= it->start_code) { - return it->direct; + if (lo == dir_table_count) { + return direction::NONE; } - return direction::NONE; + return code_point >= dir_start[lo] ? static_cast(dir_value[lo]) + : direction::NONE; } inline static size_t find_last_not_of_nsm( @@ -9034,6 +5945,10 @@ bool is_label_valid(const std::u32string_view label) { if (label.empty()) { return true; } + if (!ensure_tables() || combining_ranges == nullptr || dir_start == nullptr || + dir_final == nullptr || dir_value == nullptr) { + return false; + } /////////////// // We have a normalization step which ensures that we are in NFC. @@ -9054,298 +5969,13 @@ bool is_label_valid(const std::u32string_view label) { // The label must not contain a U+002E ( . ) FULL STOP. // if (label.find('.') != std::string_view::npos) return false; - // The label must not begin with a combining mark, that is: - // General_Category=Mark. - constexpr static uint32_t combining[] = { - 0x300, 0x301, 0x302, 0x303, 0x304, 0x305, 0x306, 0x307, - 0x308, 0x309, 0x30a, 0x30b, 0x30c, 0x30d, 0x30e, 0x30f, - 0x310, 0x311, 0x312, 0x313, 0x314, 0x315, 0x316, 0x317, - 0x318, 0x319, 0x31a, 0x31b, 0x31c, 0x31d, 0x31e, 0x31f, - 0x320, 0x321, 0x322, 0x323, 0x324, 0x325, 0x326, 0x327, - 0x328, 0x329, 0x32a, 0x32b, 0x32c, 0x32d, 0x32e, 0x32f, - 0x330, 0x331, 0x332, 0x333, 0x334, 0x335, 0x336, 0x337, - 0x338, 0x339, 0x33a, 0x33b, 0x33c, 0x33d, 0x33e, 0x33f, - 0x340, 0x341, 0x342, 0x343, 0x344, 0x345, 0x346, 0x347, - 0x348, 0x349, 0x34a, 0x34b, 0x34c, 0x34d, 0x34e, 0x34f, - 0x350, 0x351, 0x352, 0x353, 0x354, 0x355, 0x356, 0x357, - 0x358, 0x359, 0x35a, 0x35b, 0x35c, 0x35d, 0x35e, 0x35f, - 0x360, 0x361, 0x362, 0x363, 0x364, 0x365, 0x366, 0x367, - 0x368, 0x369, 0x36a, 0x36b, 0x36c, 0x36d, 0x36e, 0x36f, - 0x483, 0x484, 0x485, 0x486, 0x487, 0x488, 0x489, 0x591, - 0x592, 0x593, 0x594, 0x595, 0x596, 0x597, 0x598, 0x599, - 0x59a, 0x59b, 0x59c, 0x59d, 0x59e, 0x59f, 0x5a0, 0x5a1, - 0x5a2, 0x5a3, 0x5a4, 0x5a5, 0x5a6, 0x5a7, 0x5a8, 0x5a9, - 0x5aa, 0x5ab, 0x5ac, 0x5ad, 0x5ae, 0x5af, 0x5b0, 0x5b1, - 0x5b2, 0x5b3, 0x5b4, 0x5b5, 0x5b6, 0x5b7, 0x5b8, 0x5b9, - 0x5ba, 0x5bb, 0x5bc, 0x5bd, 0x5bf, 0x5c1, 0x5c2, 0x5c4, - 0x5c5, 0x5c7, 0x610, 0x611, 0x612, 0x613, 0x614, 0x615, - 0x616, 0x617, 0x618, 0x619, 0x61a, 0x64b, 0x64c, 0x64d, - 0x64e, 0x64f, 0x650, 0x651, 0x652, 0x653, 0x654, 0x655, - 0x656, 0x657, 0x658, 0x659, 0x65a, 0x65b, 0x65c, 0x65d, - 0x65e, 0x65f, 0x670, 0x6d6, 0x6d7, 0x6d8, 0x6d9, 0x6da, - 0x6db, 0x6dc, 0x6df, 0x6e0, 0x6e1, 0x6e2, 0x6e3, 0x6e4, - 0x6e7, 0x6e8, 0x6ea, 0x6eb, 0x6ec, 0x6ed, 0x711, 0x730, - 0x731, 0x732, 0x733, 0x734, 0x735, 0x736, 0x737, 0x738, - 0x739, 0x73a, 0x73b, 0x73c, 0x73d, 0x73e, 0x73f, 0x740, - 0x741, 0x742, 0x743, 0x744, 0x745, 0x746, 0x747, 0x748, - 0x749, 0x74a, 0x7a6, 0x7a7, 0x7a8, 0x7a9, 0x7aa, 0x7ab, - 0x7ac, 0x7ad, 0x7ae, 0x7af, 0x7b0, 0x7eb, 0x7ec, 0x7ed, - 0x7ee, 0x7ef, 0x7f0, 0x7f1, 0x7f2, 0x7f3, 0x7fd, 0x816, - 0x817, 0x818, 0x819, 0x81b, 0x81c, 0x81d, 0x81e, 0x81f, - 0x820, 0x821, 0x822, 0x823, 0x825, 0x826, 0x827, 0x829, - 0x82a, 0x82b, 0x82c, 0x82d, 0x859, 0x85a, 0x85b, 0x8d3, - 0x8d4, 0x8d5, 0x8d6, 0x8d7, 0x8d8, 0x8d9, 0x8da, 0x8db, - 0x8dc, 0x8dd, 0x8de, 0x8df, 0x8e0, 0x8e1, 0x8e3, 0x8e4, - 0x8e5, 0x8e6, 0x8e7, 0x8e8, 0x8e9, 0x8ea, 0x8eb, 0x8ec, - 0x8ed, 0x8ee, 0x8ef, 0x8f0, 0x8f1, 0x8f2, 0x8f3, 0x8f4, - 0x8f5, 0x8f6, 0x8f7, 0x8f8, 0x8f9, 0x8fa, 0x8fb, 0x8fc, - 0x8fd, 0x8fe, 0x8ff, 0x900, 0x901, 0x902, 0x903, 0x93a, - 0x93b, 0x93c, 0x93e, 0x93f, 0x940, 0x941, 0x942, 0x943, - 0x944, 0x945, 0x946, 0x947, 0x948, 0x949, 0x94a, 0x94b, - 0x94c, 0x94d, 0x94e, 0x94f, 0x951, 0x952, 0x953, 0x954, - 0x955, 0x956, 0x957, 0x962, 0x963, 0x981, 0x982, 0x983, - 0x9bc, 0x9be, 0x9bf, 0x9c0, 0x9c1, 0x9c2, 0x9c3, 0x9c4, - 0x9c7, 0x9c8, 0x9cb, 0x9cc, 0x9cd, 0x9d7, 0x9e2, 0x9e3, - 0x9fe, 0xa01, 0xa02, 0xa03, 0xa3c, 0xa3e, 0xa3f, 0xa40, - 0xa41, 0xa42, 0xa47, 0xa48, 0xa4b, 0xa4c, 0xa4d, 0xa51, - 0xa70, 0xa71, 0xa75, 0xa81, 0xa82, 0xa83, 0xabc, 0xabe, - 0xabf, 0xac0, 0xac1, 0xac2, 0xac3, 0xac4, 0xac5, 0xac7, - 0xac8, 0xac9, 0xacb, 0xacc, 0xacd, 0xae2, 0xae3, 0xafa, - 0xafb, 0xafc, 0xafd, 0xafe, 0xaff, 0xb01, 0xb02, 0xb03, - 0xb3c, 0xb3e, 0xb3f, 0xb40, 0xb41, 0xb42, 0xb43, 0xb44, - 0xb47, 0xb48, 0xb4b, 0xb4c, 0xb4d, 0xb55, 0xb56, 0xb57, - 0xb62, 0xb63, 0xb82, 0xbbe, 0xbbf, 0xbc0, 0xbc1, 0xbc2, - 0xbc6, 0xbc7, 0xbc8, 0xbca, 0xbcb, 0xbcc, 0xbcd, 0xbd7, - 0xc00, 0xc01, 0xc02, 0xc03, 0xc04, 0xc3e, 0xc3f, 0xc40, - 0xc41, 0xc42, 0xc43, 0xc44, 0xc46, 0xc47, 0xc48, 0xc4a, - 0xc4b, 0xc4c, 0xc4d, 0xc55, 0xc56, 0xc62, 0xc63, 0xc81, - 0xc82, 0xc83, 0xcbc, 0xcbe, 0xcbf, 0xcc0, 0xcc1, 0xcc2, - 0xcc3, 0xcc4, 0xcc6, 0xcc7, 0xcc8, 0xcca, 0xccb, 0xccc, - 0xccd, 0xcd5, 0xcd6, 0xce2, 0xce3, 0xd00, 0xd01, 0xd02, - 0xd03, 0xd3b, 0xd3c, 0xd3e, 0xd3f, 0xd40, 0xd41, 0xd42, - 0xd43, 0xd44, 0xd46, 0xd47, 0xd48, 0xd4a, 0xd4b, 0xd4c, - 0xd4d, 0xd57, 0xd62, 0xd63, 0xd81, 0xd82, 0xd83, 0xdca, - 0xdcf, 0xdd0, 0xdd1, 0xdd2, 0xdd3, 0xdd4, 0xdd6, 0xdd8, - 0xdd9, 0xdda, 0xddb, 0xddc, 0xddd, 0xdde, 0xddf, 0xdf2, - 0xdf3, 0xe31, 0xe34, 0xe35, 0xe36, 0xe37, 0xe38, 0xe39, - 0xe3a, 0xe47, 0xe48, 0xe49, 0xe4a, 0xe4b, 0xe4c, 0xe4d, - 0xe4e, 0xeb1, 0xeb4, 0xeb5, 0xeb6, 0xeb7, 0xeb8, 0xeb9, - 0xeba, 0xebb, 0xebc, 0xec8, 0xec9, 0xeca, 0xecb, 0xecc, - 0xecd, 0xf18, 0xf19, 0xf35, 0xf37, 0xf39, 0xf3e, 0xf3f, - 0xf71, 0xf72, 0xf73, 0xf74, 0xf75, 0xf76, 0xf77, 0xf78, - 0xf79, 0xf7a, 0xf7b, 0xf7c, 0xf7d, 0xf7e, 0xf7f, 0xf80, - 0xf81, 0xf82, 0xf83, 0xf84, 0xf86, 0xf87, 0xf8d, 0xf8e, - 0xf8f, 0xf90, 0xf91, 0xf92, 0xf93, 0xf94, 0xf95, 0xf96, - 0xf97, 0xf99, 0xf9a, 0xf9b, 0xf9c, 0xf9d, 0xf9e, 0xf9f, - 0xfa0, 0xfa1, 0xfa2, 0xfa3, 0xfa4, 0xfa5, 0xfa6, 0xfa7, - 0xfa8, 0xfa9, 0xfaa, 0xfab, 0xfac, 0xfad, 0xfae, 0xfaf, - 0xfb0, 0xfb1, 0xfb2, 0xfb3, 0xfb4, 0xfb5, 0xfb6, 0xfb7, - 0xfb8, 0xfb9, 0xfba, 0xfbb, 0xfbc, 0xfc6, 0x102b, 0x102c, - 0x102d, 0x102e, 0x102f, 0x1030, 0x1031, 0x1032, 0x1033, 0x1034, - 0x1035, 0x1036, 0x1037, 0x1038, 0x1039, 0x103a, 0x103b, 0x103c, - 0x103d, 0x103e, 0x1056, 0x1057, 0x1058, 0x1059, 0x105e, 0x105f, - 0x1060, 0x1062, 0x1063, 0x1064, 0x1067, 0x1068, 0x1069, 0x106a, - 0x106b, 0x106c, 0x106d, 0x1071, 0x1072, 0x1073, 0x1074, 0x1082, - 0x1083, 0x1084, 0x1085, 0x1086, 0x1087, 0x1088, 0x1089, 0x108a, - 0x108b, 0x108c, 0x108d, 0x108f, 0x109a, 0x109b, 0x109c, 0x109d, - 0x135d, 0x135e, 0x135f, 0x1712, 0x1713, 0x1714, 0x1732, 0x1733, - 0x1734, 0x1752, 0x1753, 0x1772, 0x1773, 0x17b4, 0x17b5, 0x17b6, - 0x17b7, 0x17b8, 0x17b9, 0x17ba, 0x17bb, 0x17bc, 0x17bd, 0x17be, - 0x17bf, 0x17c0, 0x17c1, 0x17c2, 0x17c3, 0x17c4, 0x17c5, 0x17c6, - 0x17c7, 0x17c8, 0x17c9, 0x17ca, 0x17cb, 0x17cc, 0x17cd, 0x17ce, - 0x17cf, 0x17d0, 0x17d1, 0x17d2, 0x17d3, 0x17dd, 0x180b, 0x180c, - 0x180d, 0x1885, 0x1886, 0x18a9, 0x1920, 0x1921, 0x1922, 0x1923, - 0x1924, 0x1925, 0x1926, 0x1927, 0x1928, 0x1929, 0x192a, 0x192b, - 0x1930, 0x1931, 0x1932, 0x1933, 0x1934, 0x1935, 0x1936, 0x1937, - 0x1938, 0x1939, 0x193a, 0x193b, 0x1a17, 0x1a18, 0x1a19, 0x1a1a, - 0x1a1b, 0x1a55, 0x1a56, 0x1a57, 0x1a58, 0x1a59, 0x1a5a, 0x1a5b, - 0x1a5c, 0x1a5d, 0x1a5e, 0x1a60, 0x1a61, 0x1a62, 0x1a63, 0x1a64, - 0x1a65, 0x1a66, 0x1a67, 0x1a68, 0x1a69, 0x1a6a, 0x1a6b, 0x1a6c, - 0x1a6d, 0x1a6e, 0x1a6f, 0x1a70, 0x1a71, 0x1a72, 0x1a73, 0x1a74, - 0x1a75, 0x1a76, 0x1a77, 0x1a78, 0x1a79, 0x1a7a, 0x1a7b, 0x1a7c, - 0x1a7f, 0x1ab0, 0x1ab1, 0x1ab2, 0x1ab3, 0x1ab4, 0x1ab5, 0x1ab6, - 0x1ab7, 0x1ab8, 0x1ab9, 0x1aba, 0x1abb, 0x1abc, 0x1abd, 0x1abe, - 0x1abf, 0x1ac0, 0x1b00, 0x1b01, 0x1b02, 0x1b03, 0x1b04, 0x1b34, - 0x1b35, 0x1b36, 0x1b37, 0x1b38, 0x1b39, 0x1b3a, 0x1b3b, 0x1b3c, - 0x1b3d, 0x1b3e, 0x1b3f, 0x1b40, 0x1b41, 0x1b42, 0x1b43, 0x1b44, - 0x1b6b, 0x1b6c, 0x1b6d, 0x1b6e, 0x1b6f, 0x1b70, 0x1b71, 0x1b72, - 0x1b73, 0x1b80, 0x1b81, 0x1b82, 0x1ba1, 0x1ba2, 0x1ba3, 0x1ba4, - 0x1ba5, 0x1ba6, 0x1ba7, 0x1ba8, 0x1ba9, 0x1baa, 0x1bab, 0x1bac, - 0x1bad, 0x1be6, 0x1be7, 0x1be8, 0x1be9, 0x1bea, 0x1beb, 0x1bec, - 0x1bed, 0x1bee, 0x1bef, 0x1bf0, 0x1bf1, 0x1bf2, 0x1bf3, 0x1c24, - 0x1c25, 0x1c26, 0x1c27, 0x1c28, 0x1c29, 0x1c2a, 0x1c2b, 0x1c2c, - 0x1c2d, 0x1c2e, 0x1c2f, 0x1c30, 0x1c31, 0x1c32, 0x1c33, 0x1c34, - 0x1c35, 0x1c36, 0x1c37, 0x1cd0, 0x1cd1, 0x1cd2, 0x1cd4, 0x1cd5, - 0x1cd6, 0x1cd7, 0x1cd8, 0x1cd9, 0x1cda, 0x1cdb, 0x1cdc, 0x1cdd, - 0x1cde, 0x1cdf, 0x1ce0, 0x1ce1, 0x1ce2, 0x1ce3, 0x1ce4, 0x1ce5, - 0x1ce6, 0x1ce7, 0x1ce8, 0x1ced, 0x1cf4, 0x1cf7, 0x1cf8, 0x1cf9, - 0x1dc0, 0x1dc1, 0x1dc2, 0x1dc3, 0x1dc4, 0x1dc5, 0x1dc6, 0x1dc7, - 0x1dc8, 0x1dc9, 0x1dca, 0x1dcb, 0x1dcc, 0x1dcd, 0x1dce, 0x1dcf, - 0x1dd0, 0x1dd1, 0x1dd2, 0x1dd3, 0x1dd4, 0x1dd5, 0x1dd6, 0x1dd7, - 0x1dd8, 0x1dd9, 0x1dda, 0x1ddb, 0x1ddc, 0x1ddd, 0x1dde, 0x1ddf, - 0x1de0, 0x1de1, 0x1de2, 0x1de3, 0x1de4, 0x1de5, 0x1de6, 0x1de7, - 0x1de8, 0x1de9, 0x1dea, 0x1deb, 0x1dec, 0x1ded, 0x1dee, 0x1def, - 0x1df0, 0x1df1, 0x1df2, 0x1df3, 0x1df4, 0x1df5, 0x1df6, 0x1df7, - 0x1df8, 0x1df9, 0x1dfb, 0x1dfc, 0x1dfd, 0x1dfe, 0x1dff, 0x20d0, - 0x20d1, 0x20d2, 0x20d3, 0x20d4, 0x20d5, 0x20d6, 0x20d7, 0x20d8, - 0x20d9, 0x20da, 0x20db, 0x20dc, 0x20dd, 0x20de, 0x20df, 0x20e0, - 0x20e1, 0x20e2, 0x20e3, 0x20e4, 0x20e5, 0x20e6, 0x20e7, 0x20e8, - 0x20e9, 0x20ea, 0x20eb, 0x20ec, 0x20ed, 0x20ee, 0x20ef, 0x20f0, - 0x2cef, 0x2cf0, 0x2cf1, 0x2d7f, 0x2de0, 0x2de1, 0x2de2, 0x2de3, - 0x2de4, 0x2de5, 0x2de6, 0x2de7, 0x2de8, 0x2de9, 0x2dea, 0x2deb, - 0x2dec, 0x2ded, 0x2dee, 0x2def, 0x2df0, 0x2df1, 0x2df2, 0x2df3, - 0x2df4, 0x2df5, 0x2df6, 0x2df7, 0x2df8, 0x2df9, 0x2dfa, 0x2dfb, - 0x2dfc, 0x2dfd, 0x2dfe, 0x2dff, 0x302a, 0x302b, 0x302c, 0x302d, - 0x302e, 0x302f, 0x3099, 0x309a, 0xa66f, 0xa670, 0xa671, 0xa672, - 0xa674, 0xa675, 0xa676, 0xa677, 0xa678, 0xa679, 0xa67a, 0xa67b, - 0xa67c, 0xa67d, 0xa69e, 0xa69f, 0xa6f0, 0xa6f1, 0xa802, 0xa806, - 0xa80b, 0xa823, 0xa824, 0xa825, 0xa826, 0xa827, 0xa82c, 0xa880, - 0xa881, 0xa8b4, 0xa8b5, 0xa8b6, 0xa8b7, 0xa8b8, 0xa8b9, 0xa8ba, - 0xa8bb, 0xa8bc, 0xa8bd, 0xa8be, 0xa8bf, 0xa8c0, 0xa8c1, 0xa8c2, - 0xa8c3, 0xa8c4, 0xa8c5, 0xa8e0, 0xa8e1, 0xa8e2, 0xa8e3, 0xa8e4, - 0xa8e5, 0xa8e6, 0xa8e7, 0xa8e8, 0xa8e9, 0xa8ea, 0xa8eb, 0xa8ec, - 0xa8ed, 0xa8ee, 0xa8ef, 0xa8f0, 0xa8f1, 0xa8ff, 0xa926, 0xa927, - 0xa928, 0xa929, 0xa92a, 0xa92b, 0xa92c, 0xa92d, 0xa947, 0xa948, - 0xa949, 0xa94a, 0xa94b, 0xa94c, 0xa94d, 0xa94e, 0xa94f, 0xa950, - 0xa951, 0xa952, 0xa953, 0xa980, 0xa981, 0xa982, 0xa983, 0xa9b3, - 0xa9b4, 0xa9b5, 0xa9b6, 0xa9b7, 0xa9b8, 0xa9b9, 0xa9ba, 0xa9bb, - 0xa9bc, 0xa9bd, 0xa9be, 0xa9bf, 0xa9c0, 0xa9e5, 0xaa29, 0xaa2a, - 0xaa2b, 0xaa2c, 0xaa2d, 0xaa2e, 0xaa2f, 0xaa30, 0xaa31, 0xaa32, - 0xaa33, 0xaa34, 0xaa35, 0xaa36, 0xaa43, 0xaa4c, 0xaa4d, 0xaa7b, - 0xaa7c, 0xaa7d, 0xaab0, 0xaab2, 0xaab3, 0xaab4, 0xaab7, 0xaab8, - 0xaabe, 0xaabf, 0xaac1, 0xaaeb, 0xaaec, 0xaaed, 0xaaee, 0xaaef, - 0xaaf5, 0xaaf6, 0xabe3, 0xabe4, 0xabe5, 0xabe6, 0xabe7, 0xabe8, - 0xabe9, 0xabea, 0xabec, 0xabed, 0xfb1e, 0xfe00, 0xfe01, 0xfe02, - 0xfe03, 0xfe04, 0xfe05, 0xfe06, 0xfe07, 0xfe08, 0xfe09, 0xfe0a, - 0xfe0b, 0xfe0c, 0xfe0d, 0xfe0e, 0xfe0f, 0xfe20, 0xfe21, 0xfe22, - 0xfe23, 0xfe24, 0xfe25, 0xfe26, 0xfe27, 0xfe28, 0xfe29, 0xfe2a, - 0xfe2b, 0xfe2c, 0xfe2d, 0xfe2e, 0xfe2f, 0x101fd, 0x102e0, 0x10376, - 0x10377, 0x10378, 0x10379, 0x1037a, 0x10a01, 0x10a02, 0x10a03, 0x10a05, - 0x10a06, 0x10a0c, 0x10a0d, 0x10a0e, 0x10a0f, 0x10a38, 0x10a39, 0x10a3a, - 0x10a3f, 0x10ae5, 0x10ae6, 0x10d24, 0x10d25, 0x10d26, 0x10d27, 0x10eab, - 0x10eac, 0x10f46, 0x10f47, 0x10f48, 0x10f49, 0x10f4a, 0x10f4b, 0x10f4c, - 0x10f4d, 0x10f4e, 0x10f4f, 0x10f50, 0x11000, 0x11001, 0x11002, 0x11038, - 0x11039, 0x1103a, 0x1103b, 0x1103c, 0x1103d, 0x1103e, 0x1103f, 0x11040, - 0x11041, 0x11042, 0x11043, 0x11044, 0x11045, 0x11046, 0x1107f, 0x11080, - 0x11081, 0x11082, 0x110b0, 0x110b1, 0x110b2, 0x110b3, 0x110b4, 0x110b5, - 0x110b6, 0x110b7, 0x110b8, 0x110b9, 0x110ba, 0x11100, 0x11101, 0x11102, - 0x11127, 0x11128, 0x11129, 0x1112a, 0x1112b, 0x1112c, 0x1112d, 0x1112e, - 0x1112f, 0x11130, 0x11131, 0x11132, 0x11133, 0x11134, 0x11145, 0x11146, - 0x11173, 0x11180, 0x11181, 0x11182, 0x111b3, 0x111b4, 0x111b5, 0x111b6, - 0x111b7, 0x111b8, 0x111b9, 0x111ba, 0x111bb, 0x111bc, 0x111bd, 0x111be, - 0x111bf, 0x111c0, 0x111c9, 0x111ca, 0x111cb, 0x111cc, 0x111ce, 0x111cf, - 0x1122c, 0x1122d, 0x1122e, 0x1122f, 0x11230, 0x11231, 0x11232, 0x11233, - 0x11234, 0x11235, 0x11236, 0x11237, 0x1123e, 0x112df, 0x112e0, 0x112e1, - 0x112e2, 0x112e3, 0x112e4, 0x112e5, 0x112e6, 0x112e7, 0x112e8, 0x112e9, - 0x112ea, 0x11300, 0x11301, 0x11302, 0x11303, 0x1133b, 0x1133c, 0x1133e, - 0x1133f, 0x11340, 0x11341, 0x11342, 0x11343, 0x11344, 0x11347, 0x11348, - 0x1134b, 0x1134c, 0x1134d, 0x11357, 0x11362, 0x11363, 0x11366, 0x11367, - 0x11368, 0x11369, 0x1136a, 0x1136b, 0x1136c, 0x11370, 0x11371, 0x11372, - 0x11373, 0x11374, 0x11435, 0x11436, 0x11437, 0x11438, 0x11439, 0x1143a, - 0x1143b, 0x1143c, 0x1143d, 0x1143e, 0x1143f, 0x11440, 0x11441, 0x11442, - 0x11443, 0x11444, 0x11445, 0x11446, 0x1145e, 0x114b0, 0x114b1, 0x114b2, - 0x114b3, 0x114b4, 0x114b5, 0x114b6, 0x114b7, 0x114b8, 0x114b9, 0x114ba, - 0x114bb, 0x114bc, 0x114bd, 0x114be, 0x114bf, 0x114c0, 0x114c1, 0x114c2, - 0x114c3, 0x115af, 0x115b0, 0x115b1, 0x115b2, 0x115b3, 0x115b4, 0x115b5, - 0x115b8, 0x115b9, 0x115ba, 0x115bb, 0x115bc, 0x115bd, 0x115be, 0x115bf, - 0x115c0, 0x115dc, 0x115dd, 0x11630, 0x11631, 0x11632, 0x11633, 0x11634, - 0x11635, 0x11636, 0x11637, 0x11638, 0x11639, 0x1163a, 0x1163b, 0x1163c, - 0x1163d, 0x1163e, 0x1163f, 0x11640, 0x116ab, 0x116ac, 0x116ad, 0x116ae, - 0x116af, 0x116b0, 0x116b1, 0x116b2, 0x116b3, 0x116b4, 0x116b5, 0x116b6, - 0x116b7, 0x1171d, 0x1171e, 0x1171f, 0x11720, 0x11721, 0x11722, 0x11723, - 0x11724, 0x11725, 0x11726, 0x11727, 0x11728, 0x11729, 0x1172a, 0x1172b, - 0x1182c, 0x1182d, 0x1182e, 0x1182f, 0x11830, 0x11831, 0x11832, 0x11833, - 0x11834, 0x11835, 0x11836, 0x11837, 0x11838, 0x11839, 0x1183a, 0x11930, - 0x11931, 0x11932, 0x11933, 0x11934, 0x11935, 0x11937, 0x11938, 0x1193b, - 0x1193c, 0x1193d, 0x1193e, 0x11940, 0x11942, 0x11943, 0x119d1, 0x119d2, - 0x119d3, 0x119d4, 0x119d5, 0x119d6, 0x119d7, 0x119da, 0x119db, 0x119dc, - 0x119dd, 0x119de, 0x119df, 0x119e0, 0x119e4, 0x11a01, 0x11a02, 0x11a03, - 0x11a04, 0x11a05, 0x11a06, 0x11a07, 0x11a08, 0x11a09, 0x11a0a, 0x11a33, - 0x11a34, 0x11a35, 0x11a36, 0x11a37, 0x11a38, 0x11a39, 0x11a3b, 0x11a3c, - 0x11a3d, 0x11a3e, 0x11a47, 0x11a51, 0x11a52, 0x11a53, 0x11a54, 0x11a55, - 0x11a56, 0x11a57, 0x11a58, 0x11a59, 0x11a5a, 0x11a5b, 0x11a8a, 0x11a8b, - 0x11a8c, 0x11a8d, 0x11a8e, 0x11a8f, 0x11a90, 0x11a91, 0x11a92, 0x11a93, - 0x11a94, 0x11a95, 0x11a96, 0x11a97, 0x11a98, 0x11a99, 0x11c2f, 0x11c30, - 0x11c31, 0x11c32, 0x11c33, 0x11c34, 0x11c35, 0x11c36, 0x11c38, 0x11c39, - 0x11c3a, 0x11c3b, 0x11c3c, 0x11c3d, 0x11c3e, 0x11c3f, 0x11c92, 0x11c93, - 0x11c94, 0x11c95, 0x11c96, 0x11c97, 0x11c98, 0x11c99, 0x11c9a, 0x11c9b, - 0x11c9c, 0x11c9d, 0x11c9e, 0x11c9f, 0x11ca0, 0x11ca1, 0x11ca2, 0x11ca3, - 0x11ca4, 0x11ca5, 0x11ca6, 0x11ca7, 0x11ca9, 0x11caa, 0x11cab, 0x11cac, - 0x11cad, 0x11cae, 0x11caf, 0x11cb0, 0x11cb1, 0x11cb2, 0x11cb3, 0x11cb4, - 0x11cb5, 0x11cb6, 0x11d31, 0x11d32, 0x11d33, 0x11d34, 0x11d35, 0x11d36, - 0x11d3a, 0x11d3c, 0x11d3d, 0x11d3f, 0x11d40, 0x11d41, 0x11d42, 0x11d43, - 0x11d44, 0x11d45, 0x11d47, 0x11d8a, 0x11d8b, 0x11d8c, 0x11d8d, 0x11d8e, - 0x11d90, 0x11d91, 0x11d93, 0x11d94, 0x11d95, 0x11d96, 0x11d97, 0x11ef3, - 0x11ef4, 0x11ef5, 0x11ef6, 0x16af0, 0x16af1, 0x16af2, 0x16af3, 0x16af4, - 0x16b30, 0x16b31, 0x16b32, 0x16b33, 0x16b34, 0x16b35, 0x16b36, 0x16f4f, - 0x16f51, 0x16f52, 0x16f53, 0x16f54, 0x16f55, 0x16f56, 0x16f57, 0x16f58, - 0x16f59, 0x16f5a, 0x16f5b, 0x16f5c, 0x16f5d, 0x16f5e, 0x16f5f, 0x16f60, - 0x16f61, 0x16f62, 0x16f63, 0x16f64, 0x16f65, 0x16f66, 0x16f67, 0x16f68, - 0x16f69, 0x16f6a, 0x16f6b, 0x16f6c, 0x16f6d, 0x16f6e, 0x16f6f, 0x16f70, - 0x16f71, 0x16f72, 0x16f73, 0x16f74, 0x16f75, 0x16f76, 0x16f77, 0x16f78, - 0x16f79, 0x16f7a, 0x16f7b, 0x16f7c, 0x16f7d, 0x16f7e, 0x16f7f, 0x16f80, - 0x16f81, 0x16f82, 0x16f83, 0x16f84, 0x16f85, 0x16f86, 0x16f87, 0x16f8f, - 0x16f90, 0x16f91, 0x16f92, 0x16fe4, 0x16ff0, 0x16ff1, 0x1bc9d, 0x1bc9e, - 0x1d165, 0x1d166, 0x1d167, 0x1d168, 0x1d169, 0x1d16d, 0x1d16e, 0x1d16f, - 0x1d170, 0x1d171, 0x1d172, 0x1d17b, 0x1d17c, 0x1d17d, 0x1d17e, 0x1d17f, - 0x1d180, 0x1d181, 0x1d182, 0x1d185, 0x1d186, 0x1d187, 0x1d188, 0x1d189, - 0x1d18a, 0x1d18b, 0x1d1aa, 0x1d1ab, 0x1d1ac, 0x1d1ad, 0x1d242, 0x1d243, - 0x1d244, 0x1da00, 0x1da01, 0x1da02, 0x1da03, 0x1da04, 0x1da05, 0x1da06, - 0x1da07, 0x1da08, 0x1da09, 0x1da0a, 0x1da0b, 0x1da0c, 0x1da0d, 0x1da0e, - 0x1da0f, 0x1da10, 0x1da11, 0x1da12, 0x1da13, 0x1da14, 0x1da15, 0x1da16, - 0x1da17, 0x1da18, 0x1da19, 0x1da1a, 0x1da1b, 0x1da1c, 0x1da1d, 0x1da1e, - 0x1da1f, 0x1da20, 0x1da21, 0x1da22, 0x1da23, 0x1da24, 0x1da25, 0x1da26, - 0x1da27, 0x1da28, 0x1da29, 0x1da2a, 0x1da2b, 0x1da2c, 0x1da2d, 0x1da2e, - 0x1da2f, 0x1da30, 0x1da31, 0x1da32, 0x1da33, 0x1da34, 0x1da35, 0x1da36, - 0x1da3b, 0x1da3c, 0x1da3d, 0x1da3e, 0x1da3f, 0x1da40, 0x1da41, 0x1da42, - 0x1da43, 0x1da44, 0x1da45, 0x1da46, 0x1da47, 0x1da48, 0x1da49, 0x1da4a, - 0x1da4b, 0x1da4c, 0x1da4d, 0x1da4e, 0x1da4f, 0x1da50, 0x1da51, 0x1da52, - 0x1da53, 0x1da54, 0x1da55, 0x1da56, 0x1da57, 0x1da58, 0x1da59, 0x1da5a, - 0x1da5b, 0x1da5c, 0x1da5d, 0x1da5e, 0x1da5f, 0x1da60, 0x1da61, 0x1da62, - 0x1da63, 0x1da64, 0x1da65, 0x1da66, 0x1da67, 0x1da68, 0x1da69, 0x1da6a, - 0x1da6b, 0x1da6c, 0x1da75, 0x1da84, 0x1da9b, 0x1da9c, 0x1da9d, 0x1da9e, - 0x1da9f, 0x1daa1, 0x1daa2, 0x1daa3, 0x1daa4, 0x1daa5, 0x1daa6, 0x1daa7, - 0x1daa8, 0x1daa9, 0x1daaa, 0x1daab, 0x1daac, 0x1daad, 0x1daae, 0x1daaf, - 0x1e000, 0x1e001, 0x1e002, 0x1e003, 0x1e004, 0x1e005, 0x1e006, 0x1e008, - 0x1e009, 0x1e00a, 0x1e00b, 0x1e00c, 0x1e00d, 0x1e00e, 0x1e00f, 0x1e010, - 0x1e011, 0x1e012, 0x1e013, 0x1e014, 0x1e015, 0x1e016, 0x1e017, 0x1e018, - 0x1e01b, 0x1e01c, 0x1e01d, 0x1e01e, 0x1e01f, 0x1e020, 0x1e021, 0x1e023, - 0x1e024, 0x1e026, 0x1e027, 0x1e028, 0x1e029, 0x1e02a, 0x1e130, 0x1e131, - 0x1e132, 0x1e133, 0x1e134, 0x1e135, 0x1e136, 0x1e2ec, 0x1e2ed, 0x1e2ee, - 0x1e2ef, 0x1e8d0, 0x1e8d1, 0x1e8d2, 0x1e8d3, 0x1e8d4, 0x1e8d5, 0x1e8d6, - 0x1e944, 0x1e945, 0x1e946, 0x1e947, 0x1e948, 0x1e949, 0x1e94a, 0xe0100, - 0xe0101, 0xe0102, 0xe0103, 0xe0104, 0xe0105, 0xe0106, 0xe0107, 0xe0108, - 0xe0109, 0xe010a, 0xe010b, 0xe010c, 0xe010d, 0xe010e, 0xe010f, 0xe0110, - 0xe0111, 0xe0112, 0xe0113, 0xe0114, 0xe0115, 0xe0116, 0xe0117, 0xe0118, - 0xe0119, 0xe011a, 0xe011b, 0xe011c, 0xe011d, 0xe011e, 0xe011f, 0xe0120, - 0xe0121, 0xe0122, 0xe0123, 0xe0124, 0xe0125, 0xe0126, 0xe0127, 0xe0128, - 0xe0129, 0xe012a, 0xe012b, 0xe012c, 0xe012d, 0xe012e, 0xe012f, 0xe0130, - 0xe0131, 0xe0132, 0xe0133, 0xe0134, 0xe0135, 0xe0136, 0xe0137, 0xe0138, - 0xe0139, 0xe013a, 0xe013b, 0xe013c, 0xe013d, 0xe013e, 0xe013f, 0xe0140, - 0xe0141, 0xe0142, 0xe0143, 0xe0144, 0xe0145, 0xe0146, 0xe0147, 0xe0148, - 0xe0149, 0xe014a, 0xe014b, 0xe014c, 0xe014d, 0xe014e, 0xe014f, 0xe0150, - 0xe0151, 0xe0152, 0xe0153, 0xe0154, 0xe0155, 0xe0156, 0xe0157, 0xe0158, - 0xe0159, 0xe015a, 0xe015b, 0xe015c, 0xe015d, 0xe015e, 0xe015f, 0xe0160, - 0xe0161, 0xe0162, 0xe0163, 0xe0164, 0xe0165, 0xe0166, 0xe0167, 0xe0168, - 0xe0169, 0xe016a, 0xe016b, 0xe016c, 0xe016d, 0xe016e, 0xe016f, 0xe0170, - 0xe0171, 0xe0172, 0xe0173, 0xe0174, 0xe0175, 0xe0176, 0xe0177, 0xe0178, - 0xe0179, 0xe017a, 0xe017b, 0xe017c, 0xe017d, 0xe017e, 0xe017f, 0xe0180, - 0xe0181, 0xe0182, 0xe0183, 0xe0184, 0xe0185, 0xe0186, 0xe0187, 0xe0188, - 0xe0189, 0xe018a, 0xe018b, 0xe018c, 0xe018d, 0xe018e, 0xe018f, 0xe0190, - 0xe0191, 0xe0192, 0xe0193, 0xe0194, 0xe0195, 0xe0196, 0xe0197, 0xe0198, - 0xe0199, 0xe019a, 0xe019b, 0xe019c, 0xe019d, 0xe019e, 0xe019f, 0xe01a0, - 0xe01a1, 0xe01a2, 0xe01a3, 0xe01a4, 0xe01a5, 0xe01a6, 0xe01a7, 0xe01a8, - 0xe01a9, 0xe01aa, 0xe01ab, 0xe01ac, 0xe01ad, 0xe01ae, 0xe01af, 0xe01b0, - 0xe01b1, 0xe01b2, 0xe01b3, 0xe01b4, 0xe01b5, 0xe01b6, 0xe01b7, 0xe01b8, - 0xe01b9, 0xe01ba, 0xe01bb, 0xe01bc, 0xe01bd, 0xe01be, 0xe01bf, 0xe01c0, - 0xe01c1, 0xe01c2, 0xe01c3, 0xe01c4, 0xe01c5, 0xe01c6, 0xe01c7, 0xe01c8, - 0xe01c9, 0xe01ca, 0xe01cb, 0xe01cc, 0xe01cd, 0xe01ce, 0xe01cf, 0xe01d0, - 0xe01d1, 0xe01d2, 0xe01d3, 0xe01d4, 0xe01d5, 0xe01d6, 0xe01d7, 0xe01d8, - 0xe01d9, 0xe01da, 0xe01db, 0xe01dc, 0xe01dd, 0xe01de, 0xe01df, 0xe01e0, - 0xe01e1, 0xe01e2, 0xe01e3, 0xe01e4, 0xe01e5, 0xe01e6, 0xe01e7, 0xe01e8, - 0xe01e9, 0xe01ea, 0xe01eb, 0xe01ec, 0xe01ed, 0xe01ee, 0xe01ef}; - if (std::binary_search(std::begin(combining), std::end(combining), - label.front())) { + // The label must not begin with a combining mark. + // Range membership via lower_bound on range end. + const std::span comb_span{combining_ranges, + combining_range_count}; + const auto comb_it = std::ranges::lower_bound( + comb_span, label.front(), {}, [](const auto& range) { return range[1]; }); + if (comb_it != comb_span.end() && label.front() >= (*comb_it)[0]) { return false; } // We verify this next step as part of the mapping: @@ -9421,8 +6051,7 @@ bool is_label_valid(const std::u32string_view label) { uint32_t c = label[i]; if (c == 0x200c) { if (i > 0) { - if (std::binary_search(std::begin(virama), std::end(virama), - label[i - 1])) { + if (std::ranges::binary_search(virama, label[i - 1])) { return true; } } @@ -9431,12 +6060,12 @@ bool is_label_valid(const std::u32string_view label) { } // we go backward looking for L or D auto is_l_or_d = [](uint32_t code) { - return std::binary_search(std::begin(L), std::end(L), code) || - std::binary_search(std::begin(D), std::end(D), code); + return std::ranges::binary_search(L, code) || + std::ranges::binary_search(D, code); }; auto is_r_or_d = [](uint32_t code) { - return std::binary_search(std::begin(R), std::end(R), code) || - std::binary_search(std::begin(D), std::end(D), code); + return std::ranges::binary_search(R, code) || + std::ranges::binary_search(D, code); }; std::u32string_view before = label.substr(0, i); std::u32string_view after = label.substr(i + 1); @@ -9446,8 +6075,7 @@ bool is_label_valid(const std::u32string_view label) { after.end()); } else if (c == 0x200d) { if (i > 0) { - if (std::binary_search(std::begin(virama), std::end(virama), - label[i - 1])) { + if (std::ranges::binary_search(virama, label[i - 1])) { return true; } } @@ -9503,18 +6131,18 @@ bool is_label_valid(const std::u32string_view label) { // In an LTR label, only characters with the Bidi properties L, EN, // ES, CS, ET, ON, BN, or NSM are allowed. - for (size_t i = 0; i < last_non_nsm_char; i++) { + for (size_t i = 0; i <= last_non_nsm_char; i++) { const direction d = find_direction(label[i]); if (!(d == direction::L || d == direction::EN || d == direction::ES || d == direction::CS || d == direction::ET || d == direction::ON || d == direction::BN || d == direction::NSM)) { return false; } + } - if ((i == last_non_nsm_char) && - !(d == direction::L || d == direction::EN)) { - return false; - } + const direction last_dir = find_direction(label[last_non_nsm_char]); + if (!(last_dir == direction::L || last_dir == direction::EN)) { + return false; } return true; @@ -9522,6 +6150,13 @@ bool is_label_valid(const std::u32string_view label) { } else { // Eval as RTL + // The first character must be R or AL; a leading AN (or any other + // direction) does not start a valid RTL label. + const direction first_dir = find_direction(label[0]); + if (first_dir != direction::R && first_dir != direction::AL) { + return false; + } + bool has_an = false; bool has_en = false; for (size_t i = 0; i <= last_non_nsm_char; i++) { @@ -9558,11 +6193,84 @@ bool is_label_valid(const std::u32string_view label) { } // namespace ada::idna /* end file src/validity.cpp */ /* begin file src/to_ascii.cpp */ +/* begin file include/ada/idna/to_ascii.h */ +#ifndef ADA_IDNA_TO_ASCII_H +#define ADA_IDNA_TO_ASCII_H + +#include +#include + +/* begin file include/ada/idna/limits.h */ +#ifndef ADA_IDNA_LIMITS_H +#define ADA_IDNA_LIMITS_H + +#include + +namespace ada::idna { + +// Maximum accepted UTF-8 domain length for to_ascii / to_unicode. +// Bounds heap growth under untrusted input (DoS resistance). DNS wire limits +// are smaller; this allows long Unicode labels used in URL tests/fixtures. +inline constexpr size_t max_domain_input_bytes = 16384; + +} // namespace ada::idna + +#endif // ADA_IDNA_LIMITS_H +/* end file include/ada/idna/limits.h */ + +namespace ada::idna { + +// Converts a domain (e.g., www.google.com) possibly containing international +// characters to an ascii domain (with punycode). It will not do percent +// decoding: percent decoding should be done prior to calling this function. We +// do not remove tabs and spaces, they should have been removed prior to calling +// this function. We also do not trim control characters. We also assume that +// the input is not empty. We return "" on error. Inputs longer than +// max_domain_input_bytes are rejected. +// +// This function may accept or even produce invalid domains (WHATWG carve-outs). +std::string to_ascii(std::string_view ut8_string); + +// Same as to_ascii, but writes into `out` and returns false on error without +// relying on empty-string ambiguity. +[[nodiscard]] bool to_ascii(std::string_view ut8_string, std::string& out); + +// Returns true if the string contains a forbidden code point according to the +// WHATGL URL specification: +// https://url.spec.whatwg.org/#forbidden-domain-code-point +bool contains_forbidden_domain_code_point(std::string_view ascii_string); + +bool constexpr is_ascii(std::u32string_view view); +bool constexpr is_ascii(std::string_view view); + +} // namespace ada::idna + +#endif // ADA_IDNA_TO_ASCII_H +/* end file include/ada/idna/to_ascii.h */ #include #include +#include #include +/* begin file include/ada/idna/validity.h */ +#ifndef ADA_IDNA_VALIDITY_H +#define ADA_IDNA_VALIDITY_H + +#include +#include + +namespace ada::idna { + +/** + * @see https://www.unicode.org/reports/tr46/#Validity_Criteria + */ +bool is_label_valid(std::u32string_view label); + +} // namespace ada::idna + +#endif // ADA_IDNA_VALIDITY_H +/* end file include/ada/idna/validity.h */ #ifdef ADA_USE_SIMDUTF #include "simdutf.h" @@ -9611,190 +6319,241 @@ bool contains_forbidden_domain_code_point(std::string_view view) { return std::ranges::any_of(view, is_forbidden_domain_code_point); } -// We return "" on error. -static std::string from_ascii_to_ascii(std::string_view ut8_string) { - static const std::string error = ""; - // copy and map - // we could be more efficient by avoiding the copy when unnecessary. - std::string mapped_string = std::string(ut8_string); - ascii_map(mapped_string.data(), mapped_string.size()); - std::string out; - size_t label_start = 0; +// Per the WHATWG URL "domain to ASCII" algorithm, when beStrict is false and +// the input domain is an ASCII string, the result is the input lowercased, +// regardless of the outcome of Unicode ToASCII. +// +// See https://url.spec.whatwg.org/#concept-domain-to-ascii +static void from_ascii_to_ascii(std::string_view ut8_string, std::string& out) { + out.assign(ut8_string); + ascii_map(out.data(), out.size()); +} - while (label_start != mapped_string.size()) { - size_t loc_dot = mapped_string.find('.', label_start); - bool is_last_label = (loc_dot == std::string_view::npos); - size_t label_size = is_last_label ? mapped_string.size() - label_start - : loc_dot - label_start; - size_t label_size_with_dot = is_last_label ? label_size : label_size + 1; - std::string_view label_view(mapped_string.data() + label_start, label_size); - label_start += label_size_with_dot; - if (label_size == 0) { - // empty label? Nothing to do. - } else if (label_view.starts_with("xn--")) { - // The xn-- part is the expensive game. - out.append(label_view); - std::string_view puny_segment_ascii( - out.data() + out.size() - label_view.size() + 4, - label_view.size() - 4); - std::u32string tmp_buffer; - bool is_ok = ada::idna::punycode_to_utf32(puny_segment_ascii, tmp_buffer); - if (!is_ok) { - return error; - } - // If the input is just ASCII, it should not have been encoded - // as punycode. - // https://github.com/whatwg/url/issues/760 - if (is_ascii(tmp_buffer)) { - return error; - } - std::u32string post_map = ada::idna::map(tmp_buffer); - if (tmp_buffer != post_map) { - return error; - } - std::u32string pre_normal = post_map; - normalize(post_map); - if (post_map != pre_normal) { - return error; - } - if (post_map.empty()) { - return error; - } - if (!is_label_valid(post_map)) { - return error; - } - } else { - out.append(label_view); - } - if (!is_last_label) { - out.push_back('.'); - } +// Append ASCII code units from a UTF-32 label (all values < 0x80). +static void append_ascii_label(std::string& out, std::u32string_view label) { + const size_t old = out.size(); + out.resize(old + label.size()); + char* dest = out.data() + old; + for (char32_t c : label) { + *dest++ = static_cast(c); } - return out; } -// We return "" on error. -std::string to_ascii(std::string_view ut8_string) { +// True if label begins with "xn--" (already lowercased by mapping). +static bool is_ace_prefix(std::u32string_view label) noexcept { + return label.size() >= 4 && label[0] == U'x' && label[1] == U'n' && + label[2] == U'-' && label[3] == U'-'; +} + +[[nodiscard]] bool to_ascii(std::string_view ut8_string, std::string& out) { + out.clear(); + if (ut8_string.size() > max_domain_input_bytes) { + return false; + } if (is_ascii(ut8_string)) { - return from_ascii_to_ascii(ut8_string); + from_ascii_to_ascii(ut8_string, out); + return true; } - static const std::string error = ""; - // We convert to UTF-32 #ifdef ADA_USE_SIMDUTF size_t utf32_length = simdutf::utf32_length_from_utf8(ut8_string.data(), ut8_string.size()); - std::u32string utf32(utf32_length, '\0'); + if (utf32_length == 0 && !ut8_string.empty()) { + return false; + } + std::u32string working(utf32_length, U'\0'); size_t actual_utf32_length = simdutf::convert_utf8_to_utf32( - ut8_string.data(), ut8_string.size(), utf32.data()); + ut8_string.data(), ut8_string.size(), working.data()); #else size_t utf32_length = ada::idna::utf32_length_from_utf8(ut8_string.data(), ut8_string.size()); - std::u32string utf32(utf32_length, '\0'); + if (utf32_length == 0 && !ut8_string.empty()) { + return false; + } + std::u32string working(utf32_length, U'\0'); size_t actual_utf32_length = ada::idna::utf8_to_utf32( - ut8_string.data(), ut8_string.size(), utf32.data()); + ut8_string.data(), ut8_string.size(), working.data()); #endif - if (actual_utf32_length == 0) { - return error; + if (actual_utf32_length == 0 || actual_utf32_length != utf32_length) { + return false; } - // mapping - utf32 = ada::idna::map(utf32); - normalize(utf32); - std::string out; - size_t label_start = 0; + working.resize(actual_utf32_length); + + // Map into a second buffer with exact sizing (no growth reallocs). + std::u32string mapped; + if (!ada::idna::map(working, mapped)) { + return false; + } + // Drop UTF-32 input; reuse `working` as scratch for ACE validation below. + working.clear(); + + // Skip NFC when already normalized (ASCII is a fast subset of this check). + if (!is_ascii(mapped) && !is_already_nfc(mapped)) { + if (!normalize(mapped)) { + return false; + } + } + + // Estimate ASCII output size (punycode may expand non-ASCII labels). + out.reserve(mapped.size() + 8); + + // Walk labels with a single pointer scan (no repeated string::find). + const char32_t* p = mapped.data(); + const char32_t* const end = p + mapped.size(); + std::u32string post_map; + + while (p < end) { + const char32_t* label_begin = p; + while (p < end && *p != U'.') { + ++p; + } + const size_t label_size = static_cast(p - label_begin); + std::u32string_view label_view(label_begin, label_size); + const bool is_last_label = (p == end); + if (p < end) { + ++p; // skip dot + } - while (label_start != utf32.size()) { - size_t loc_dot = utf32.find('.', label_start); - bool is_last_label = (loc_dot == std::string_view::npos); - size_t label_size = - is_last_label ? utf32.size() - label_start : loc_dot - label_start; - size_t label_size_with_dot = is_last_label ? label_size : label_size + 1; - std::u32string_view label_view(utf32.data() + label_start, label_size); - label_start += label_size_with_dot; if (label_size == 0) { - // empty label? Nothing to do. - } else if (label_view.starts_with(U"xn--")) { - // we do not need to check, e.g., Xn-- because mapping goes to lower case + // empty label + } else if (is_ace_prefix(label_view)) { for (char32_t c : label_view) { if (c >= 0x80) { - return error; + out.clear(); + return false; } - out += (unsigned char)(c); } + append_ascii_label(out, label_view); std::string_view puny_segment_ascii( - out.data() + out.size() - label_view.size() + 4, - label_view.size() - 4); - std::u32string tmp_buffer; - bool is_ok = ada::idna::punycode_to_utf32(puny_segment_ascii, tmp_buffer); - if (!is_ok) { - return error; - } - // If the input is just ASCII, it should not have been encoded - // as punycode. - // https://github.com/whatwg/url/issues/760 - if (is_ascii(tmp_buffer)) { - return error; + out.data() + (out.size() - label_size) + 4, label_size - 4); + working.clear(); + if (!ada::idna::punycode_to_utf32(puny_segment_ascii, working)) { + out.clear(); + return false; } - std::u32string post_map = ada::idna::map(tmp_buffer); - if (tmp_buffer != post_map) { - return error; + if (is_ascii(working)) { + out.clear(); + return false; } - std::u32string pre_normal = post_map; - normalize(post_map); - if (post_map != pre_normal) { - return error; + if (!ada::idna::map(working, post_map) || working != post_map) { + out.clear(); + return false; } - if (post_map.empty()) { - return error; + // Mapping must be stable; NFC must not change the mapped form either. + if (!is_ascii(post_map) && !is_already_nfc(post_map)) { + if (!normalize(post_map) || post_map != working) { + out.clear(); + return false; + } } - if (!is_label_valid(post_map)) { - return error; + if (post_map.empty() || !is_label_valid(post_map)) { + out.clear(); + return false; } + } else if (is_ascii(label_view)) { + append_ascii_label(out, label_view); } else { - // The fast path here is an ascii label. - if (is_ascii(label_view)) { - // no validation needed. - for (char32_t c : label_view) { - out += (unsigned char)(c); - } - } else { - // slow path. - // first check validity. - if (!is_label_valid(label_view)) { - return error; - } - // It is valid! So now we must encode it as punycode... - out.append("xn--"); - bool is_ok = ada::idna::utf32_to_punycode(label_view, out); - if (!is_ok) { - return error; - } + if (!is_label_valid(label_view)) { + out.clear(); + return false; + } + out.append("xn--"); + if (!ada::idna::utf32_to_punycode(label_view, out)) { + out.clear(); + return false; } } if (!is_last_label) { out.push_back('.'); } } + return true; +} + +std::string to_ascii(std::string_view ut8_string) { + std::string out; + if (!to_ascii(ut8_string, out)) { + return {}; + } return out; } } // namespace ada::idna -/* end file src/to_ascii.cpp */ -/* begin file src/to_unicode.cpp */ +/* end file src/to_ascii.cpp */ +/* begin file src/to_unicode.cpp */ +/* begin file include/ada/idna/to_unicode.h */ +#ifndef ADA_IDNA_TO_UNICODE_H +#define ADA_IDNA_TO_UNICODE_H + +#include +#include + + +namespace ada::idna { + +// UTS #46 ToUnicode. Never fails per the standard: on step failure the original +// label is kept. Inputs longer than max_domain_input_bytes are returned +// unchanged as a safety measure under untrusted input. +std::string to_unicode(std::string_view input); + +// Writes into `out`. Returns false only if the input exceeds +// max_domain_input_bytes (out is left empty). Otherwise always returns true +// (ToUnicode does not fail). +[[nodiscard]] bool to_unicode(std::string_view input, std::string& out); + +} // namespace ada::idna + +#endif // ADA_IDNA_TO_UNICODE_H +/* end file include/ada/idna/to_unicode.h */ #include #include +/* begin file include/idna.h */ +#ifndef ADA_IDNA_H +#define ADA_IDNA_H + +/* begin file include/ada/idna/identifier.h */ +#ifndef ADA_IDNA_IDENTIFIER_H +#define ADA_IDNA_IDENTIFIER_H + +#include +#include + +namespace ada::idna { + +// Verify if it is valid name code point given a Unicode code point and a +// boolean first: If first is true return the result of checking if code point +// is contained in the IdentifierStart set of code points. Otherwise return the +// result of checking if code point is contained in the IdentifierPart set of +// code points. Returns false if the input is empty or the code point is not +// valid. There is minimal Unicode error handling: the input should be valid +// UTF-8. https://urlpattern.spec.whatwg.org/#is-a-valid-name-code-point +bool valid_name_code_point(char32_t code_point, bool first); + +} // namespace ada::idna + +#endif +/* end file include/ada/idna/identifier.h */ + +#endif +/* end file include/idna.h */ #ifdef ADA_USE_SIMDUTF #include "simdutf.h" #endif namespace ada::idna { -std::string to_unicode(std::string_view input) { - std::string output; + +[[nodiscard]] bool to_unicode(std::string_view input, std::string& output) { + output.clear(); + if (input.size() > max_domain_input_bytes) { + return false; + } output.reserve(input.size()); size_t label_start = 0; + std::u32string tmp_buffer; + std::u32string post_map; while (label_start < input.size()) { size_t loc_dot = input.find('.', label_start); bool is_last_label = (loc_dot == std::string_view::npos); @@ -9804,26 +6563,54 @@ std::string to_unicode(std::string_view input) { if (label_view.starts_with("xn--") && ada::idna::is_ascii(label_view)) { label_view.remove_prefix(4); - if (ada::idna::verify_punycode(label_view)) { - std::u32string tmp_buffer; - if (ada::idna::punycode_to_utf32(label_view, tmp_buffer)) { + tmp_buffer.clear(); + if (ada::idna::punycode_to_utf32(label_view, tmp_buffer)) { + // Per UTS #46, the decoded label must be re-validated. Reject decodings + // that are pure ASCII (xn-- encoding of an ASCII-only label), or whose + // mapping/normalization is not stable, or that fail label validity. + bool accept_decoded = true; + if (ada::idna::is_ascii(tmp_buffer)) { + accept_decoded = false; + } else { + post_map.clear(); + if (!ada::idna::map(tmp_buffer, post_map) || post_map != tmp_buffer) { + accept_decoded = false; + } else if (!ada::idna::normalize(post_map) || + post_map != tmp_buffer || post_map.empty() || + !ada::idna::is_label_valid(post_map)) { + accept_decoded = false; + } + } + + if (accept_decoded) { #ifdef ADA_USE_SIMDUTF auto utf8_size = simdutf::utf8_length_from_utf32(tmp_buffer.data(), tmp_buffer.size()); - std::string final_utf8(utf8_size, '\0'); - simdutf::convert_utf32_to_utf8(tmp_buffer.data(), tmp_buffer.size(), - final_utf8.data()); + size_t old_size = output.size(); + output.resize(old_size + utf8_size); + size_t written = simdutf::convert_utf32_to_utf8( + tmp_buffer.data(), tmp_buffer.size(), output.data() + old_size); + if (written != utf8_size) { + output.resize(old_size); + output.append( + std::string_view(input.data() + label_start, label_size)); + } #else auto utf8_size = ada::idna::utf8_length_from_utf32(tmp_buffer.data(), tmp_buffer.size()); - std::string final_utf8(utf8_size, '\0'); - ada::idna::utf32_to_utf8(tmp_buffer.data(), tmp_buffer.size(), - final_utf8.data()); + size_t old_size = output.size(); + output.resize(old_size + utf8_size); + size_t written = ada::idna::utf32_to_utf8( + tmp_buffer.data(), tmp_buffer.size(), output.data() + old_size); + if (written != utf8_size) { + output.resize(old_size); + output.append( + std::string_view(input.data() + label_start, label_size)); + } #endif - output.append(final_utf8); } else { - // ToUnicode never fails. If any step fails, then the original input - // sequence is returned immediately in that step. + // ToUnicode never fails. If any step fails, return the original + // input sequence for the label. output.append( std::string_view(input.data() + label_start, label_size)); } @@ -9841,6 +6628,16 @@ std::string to_unicode(std::string_view input) { label_start += label_size + 1; } + return true; +} + +std::string to_unicode(std::string_view input) { + std::string output; + if (!to_unicode(input, output)) { + // Over-limit input: return original (ToUnicode never fails in the sense of + // producing no answer for valid-length inputs). + return std::string(input); + } return output; } } // namespace ada::idna @@ -9849,10 +6646,12 @@ std::string to_unicode(std::string_view input) { #include #include +#include #include /* begin file src/id_tables.cpp */ // IDNA 17.0.0 +// Identifier range tables are stored in the compressed blob (table_store.hpp). // clang-format off #ifndef ADA_IDNA_IDENTIFIER_TABLES_H @@ -9861,565 +6660,10 @@ std::string to_unicode(std::string_view input) { namespace ada::idna { -const uint32_t id_continue[1418][2] = -{ - {48, 57}, {65, 90}, {95, 95}, {97, 122}, - {170, 170}, {181, 181}, {183, 183}, {186, 186}, - {192, 214}, {216, 246}, {248, 442}, {443, 443}, - {444, 447}, {448, 451}, {452, 659}, {660, 661}, - {662, 687}, {688, 705}, {710, 721}, {736, 740}, - {748, 748}, {750, 750}, {768, 879}, {880, 883}, - {884, 884}, {886, 887}, {890, 890}, {891, 893}, - {895, 895}, {902, 902}, {903, 903}, {904, 906}, - {908, 908}, {910, 929}, {931, 1013}, {1015, 1153}, - {1155, 1159}, {1162, 1327}, {1329, 1366}, {1369, 1369}, - {1376, 1416}, {1425, 1469}, {1471, 1471}, {1473, 1474}, - {1476, 1477}, {1479, 1479}, {1488, 1514}, {1519, 1522}, - {1552, 1562}, {1568, 1599}, {1600, 1600}, {1601, 1610}, - {1611, 1631}, {1632, 1641}, {1646, 1647}, {1648, 1648}, - {1649, 1747}, {1749, 1749}, {1750, 1756}, {1759, 1764}, - {1765, 1766}, {1767, 1768}, {1770, 1773}, {1774, 1775}, - {1776, 1785}, {1786, 1788}, {1791, 1791}, {1808, 1808}, - {1809, 1809}, {1810, 1839}, {1840, 1866}, {1869, 1957}, - {1958, 1968}, {1969, 1969}, {1984, 1993}, {1994, 2026}, - {2027, 2035}, {2036, 2037}, {2042, 2042}, {2045, 2045}, - {2048, 2069}, {2070, 2073}, {2074, 2074}, {2075, 2083}, - {2084, 2084}, {2085, 2087}, {2088, 2088}, {2089, 2093}, - {2112, 2136}, {2137, 2139}, {2144, 2154}, {2160, 2183}, - {2185, 2191}, {2199, 2207}, {2208, 2248}, {2249, 2249}, - {2250, 2273}, {2275, 2306}, {2307, 2307}, {2308, 2361}, - {2362, 2362}, {2363, 2363}, {2364, 2364}, {2365, 2365}, - {2366, 2368}, {2369, 2376}, {2377, 2380}, {2381, 2381}, - {2382, 2383}, {2384, 2384}, {2385, 2391}, {2392, 2401}, - {2402, 2403}, {2406, 2415}, {2417, 2417}, {2418, 2432}, - {2433, 2433}, {2434, 2435}, {2437, 2444}, {2447, 2448}, - {2451, 2472}, {2474, 2480}, {2482, 2482}, {2486, 2489}, - {2492, 2492}, {2493, 2493}, {2494, 2496}, {2497, 2500}, - {2503, 2504}, {2507, 2508}, {2509, 2509}, {2510, 2510}, - {2519, 2519}, {2524, 2525}, {2527, 2529}, {2530, 2531}, - {2534, 2543}, {2544, 2545}, {2556, 2556}, {2558, 2558}, - {2561, 2562}, {2563, 2563}, {2565, 2570}, {2575, 2576}, - {2579, 2600}, {2602, 2608}, {2610, 2611}, {2613, 2614}, - {2616, 2617}, {2620, 2620}, {2622, 2624}, {2625, 2626}, - {2631, 2632}, {2635, 2637}, {2641, 2641}, {2649, 2652}, - {2654, 2654}, {2662, 2671}, {2672, 2673}, {2674, 2676}, - {2677, 2677}, {2689, 2690}, {2691, 2691}, {2693, 2701}, - {2703, 2705}, {2707, 2728}, {2730, 2736}, {2738, 2739}, - {2741, 2745}, {2748, 2748}, {2749, 2749}, {2750, 2752}, - {2753, 2757}, {2759, 2760}, {2761, 2761}, {2763, 2764}, - {2765, 2765}, {2768, 2768}, {2784, 2785}, {2786, 2787}, - {2790, 2799}, {2809, 2809}, {2810, 2815}, {2817, 2817}, - {2818, 2819}, {2821, 2828}, {2831, 2832}, {2835, 2856}, - {2858, 2864}, {2866, 2867}, {2869, 2873}, {2876, 2876}, - {2877, 2877}, {2878, 2878}, {2879, 2879}, {2880, 2880}, - {2881, 2884}, {2887, 2888}, {2891, 2892}, {2893, 2893}, - {2901, 2902}, {2903, 2903}, {2908, 2909}, {2911, 2913}, - {2914, 2915}, {2918, 2927}, {2929, 2929}, {2946, 2946}, - {2947, 2947}, {2949, 2954}, {2958, 2960}, {2962, 2965}, - {2969, 2970}, {2972, 2972}, {2974, 2975}, {2979, 2980}, - {2984, 2986}, {2990, 3001}, {3006, 3007}, {3008, 3008}, - {3009, 3010}, {3014, 3016}, {3018, 3020}, {3021, 3021}, - {3024, 3024}, {3031, 3031}, {3046, 3055}, {3072, 3072}, - {3073, 3075}, {3076, 3076}, {3077, 3084}, {3086, 3088}, - {3090, 3112}, {3114, 3129}, {3132, 3132}, {3133, 3133}, - {3134, 3136}, {3137, 3140}, {3142, 3144}, {3146, 3149}, - {3157, 3158}, {3160, 3162}, {3164, 3165}, {3168, 3169}, - {3170, 3171}, {3174, 3183}, {3200, 3200}, {3201, 3201}, - {3202, 3203}, {3205, 3212}, {3214, 3216}, {3218, 3240}, - {3242, 3251}, {3253, 3257}, {3260, 3260}, {3261, 3261}, - {3262, 3262}, {3263, 3263}, {3264, 3268}, {3270, 3270}, - {3271, 3272}, {3274, 3275}, {3276, 3277}, {3285, 3286}, - {3292, 3294}, {3296, 3297}, {3298, 3299}, {3302, 3311}, - {3313, 3314}, {3315, 3315}, {3328, 3329}, {3330, 3331}, - {3332, 3340}, {3342, 3344}, {3346, 3386}, {3387, 3388}, - {3389, 3389}, {3390, 3392}, {3393, 3396}, {3398, 3400}, - {3402, 3404}, {3405, 3405}, {3406, 3406}, {3412, 3414}, - {3415, 3415}, {3423, 3425}, {3426, 3427}, {3430, 3439}, - {3450, 3455}, {3457, 3457}, {3458, 3459}, {3461, 3478}, - {3482, 3505}, {3507, 3515}, {3517, 3517}, {3520, 3526}, - {3530, 3530}, {3535, 3537}, {3538, 3540}, {3542, 3542}, - {3544, 3551}, {3558, 3567}, {3570, 3571}, {3585, 3632}, - {3633, 3633}, {3634, 3635}, {3636, 3642}, {3648, 3653}, - {3654, 3654}, {3655, 3662}, {3664, 3673}, {3713, 3714}, - {3716, 3716}, {3718, 3722}, {3724, 3747}, {3749, 3749}, - {3751, 3760}, {3761, 3761}, {3762, 3763}, {3764, 3772}, - {3773, 3773}, {3776, 3780}, {3782, 3782}, {3784, 3790}, - {3792, 3801}, {3804, 3807}, {3840, 3840}, {3864, 3865}, - {3872, 3881}, {3893, 3893}, {3895, 3895}, {3897, 3897}, - {3902, 3903}, {3904, 3911}, {3913, 3948}, {3953, 3966}, - {3967, 3967}, {3968, 3972}, {3974, 3975}, {3976, 3980}, - {3981, 3991}, {3993, 4028}, {4038, 4038}, {4096, 4138}, - {4139, 4140}, {4141, 4144}, {4145, 4145}, {4146, 4151}, - {4152, 4152}, {4153, 4154}, {4155, 4156}, {4157, 4158}, - {4159, 4159}, {4160, 4169}, {4176, 4181}, {4182, 4183}, - {4184, 4185}, {4186, 4189}, {4190, 4192}, {4193, 4193}, - {4194, 4196}, {4197, 4198}, {4199, 4205}, {4206, 4208}, - {4209, 4212}, {4213, 4225}, {4226, 4226}, {4227, 4228}, - {4229, 4230}, {4231, 4236}, {4237, 4237}, {4238, 4238}, - {4239, 4239}, {4240, 4249}, {4250, 4252}, {4253, 4253}, - {4256, 4293}, {4295, 4295}, {4301, 4301}, {4304, 4346}, - {4348, 4348}, {4349, 4351}, {4352, 4680}, {4682, 4685}, - {4688, 4694}, {4696, 4696}, {4698, 4701}, {4704, 4744}, - {4746, 4749}, {4752, 4784}, {4786, 4789}, {4792, 4798}, - {4800, 4800}, {4802, 4805}, {4808, 4822}, {4824, 4880}, - {4882, 4885}, {4888, 4954}, {4957, 4959}, {4969, 4977}, - {4992, 5007}, {5024, 5109}, {5112, 5117}, {5121, 5740}, - {5743, 5759}, {5761, 5786}, {5792, 5866}, {5870, 5872}, - {5873, 5880}, {5888, 5905}, {5906, 5908}, {5909, 5909}, - {5919, 5937}, {5938, 5939}, {5940, 5940}, {5952, 5969}, - {5970, 5971}, {5984, 5996}, {5998, 6000}, {6002, 6003}, - {6016, 6067}, {6068, 6069}, {6070, 6070}, {6071, 6077}, - {6078, 6085}, {6086, 6086}, {6087, 6088}, {6089, 6099}, - {6103, 6103}, {6108, 6108}, {6109, 6109}, {6112, 6121}, - {6155, 6157}, {6159, 6159}, {6160, 6169}, {6176, 6210}, - {6211, 6211}, {6212, 6264}, {6272, 6276}, {6277, 6278}, - {6279, 6312}, {6313, 6313}, {6314, 6314}, {6320, 6389}, - {6400, 6430}, {6432, 6434}, {6435, 6438}, {6439, 6440}, - {6441, 6443}, {6448, 6449}, {6450, 6450}, {6451, 6456}, - {6457, 6459}, {6470, 6479}, {6480, 6509}, {6512, 6516}, - {6528, 6571}, {6576, 6601}, {6608, 6617}, {6618, 6618}, - {6656, 6678}, {6679, 6680}, {6681, 6682}, {6683, 6683}, - {6688, 6740}, {6741, 6741}, {6742, 6742}, {6743, 6743}, - {6744, 6750}, {6752, 6752}, {6753, 6753}, {6754, 6754}, - {6755, 6756}, {6757, 6764}, {6765, 6770}, {6771, 6780}, - {6783, 6783}, {6784, 6793}, {6800, 6809}, {6823, 6823}, - {6832, 6845}, {6847, 6877}, {6880, 6891}, {6912, 6915}, - {6916, 6916}, {6917, 6963}, {6964, 6964}, {6965, 6965}, - {6966, 6970}, {6971, 6971}, {6972, 6972}, {6973, 6977}, - {6978, 6978}, {6979, 6980}, {6981, 6988}, {6992, 7001}, - {7019, 7027}, {7040, 7041}, {7042, 7042}, {7043, 7072}, - {7073, 7073}, {7074, 7077}, {7078, 7079}, {7080, 7081}, - {7082, 7082}, {7083, 7085}, {7086, 7087}, {7088, 7097}, - {7098, 7141}, {7142, 7142}, {7143, 7143}, {7144, 7145}, - {7146, 7148}, {7149, 7149}, {7150, 7150}, {7151, 7153}, - {7154, 7155}, {7168, 7203}, {7204, 7211}, {7212, 7219}, - {7220, 7221}, {7222, 7223}, {7232, 7241}, {7245, 7247}, - {7248, 7257}, {7258, 7287}, {7288, 7293}, {7296, 7306}, - {7312, 7354}, {7357, 7359}, {7376, 7378}, {7380, 7392}, - {7393, 7393}, {7394, 7400}, {7401, 7404}, {7405, 7405}, - {7406, 7411}, {7412, 7412}, {7413, 7414}, {7415, 7415}, - {7416, 7417}, {7418, 7418}, {7424, 7467}, {7468, 7530}, - {7531, 7543}, {7544, 7544}, {7545, 7578}, {7579, 7615}, - {7616, 7679}, {7680, 7957}, {7960, 7965}, {7968, 8005}, - {8008, 8013}, {8016, 8023}, {8025, 8025}, {8027, 8027}, - {8029, 8029}, {8031, 8061}, {8064, 8116}, {8118, 8124}, - {8126, 8126}, {8130, 8132}, {8134, 8140}, {8144, 8147}, - {8150, 8155}, {8160, 8172}, {8178, 8180}, {8182, 8188}, - {8204, 8205}, {8255, 8256}, {8276, 8276}, {8305, 8305}, - {8319, 8319}, {8336, 8348}, {8400, 8412}, {8417, 8417}, - {8421, 8432}, {8450, 8450}, {8455, 8455}, {8458, 8467}, - {8469, 8469}, {8472, 8472}, {8473, 8477}, {8484, 8484}, - {8486, 8486}, {8488, 8488}, {8490, 8493}, {8494, 8494}, - {8495, 8500}, {8501, 8504}, {8505, 8505}, {8508, 8511}, - {8517, 8521}, {8526, 8526}, {8544, 8578}, {8579, 8580}, - {8581, 8584}, {11264, 11387}, {11388, 11389}, {11390, 11492}, - {11499, 11502}, {11503, 11505}, {11506, 11507}, {11520, 11557}, - {11559, 11559}, {11565, 11565}, {11568, 11623}, {11631, 11631}, - {11647, 11647}, {11648, 11670}, {11680, 11686}, {11688, 11694}, - {11696, 11702}, {11704, 11710}, {11712, 11718}, {11720, 11726}, - {11728, 11734}, {11736, 11742}, {11744, 11775}, {12293, 12293}, - {12294, 12294}, {12295, 12295}, {12321, 12329}, {12330, 12333}, - {12334, 12335}, {12337, 12341}, {12344, 12346}, {12347, 12347}, - {12348, 12348}, {12353, 12438}, {12441, 12442}, {12443, 12444}, - {12445, 12446}, {12447, 12447}, {12449, 12538}, {12539, 12539}, - {12540, 12542}, {12543, 12543}, {12549, 12591}, {12593, 12686}, - {12704, 12735}, {12784, 12799}, {13312, 19903}, {19968, 40980}, - {40981, 40981}, {40982, 42124}, {42192, 42231}, {42232, 42237}, - {42240, 42507}, {42508, 42508}, {42512, 42527}, {42528, 42537}, - {42538, 42539}, {42560, 42605}, {42606, 42606}, {42607, 42607}, - {42612, 42621}, {42623, 42623}, {42624, 42651}, {42652, 42653}, - {42654, 42655}, {42656, 42725}, {42726, 42735}, {42736, 42737}, - {42775, 42783}, {42786, 42863}, {42864, 42864}, {42865, 42887}, - {42888, 42888}, {42891, 42894}, {42895, 42895}, {42896, 42972}, - {42993, 42996}, {42997, 42998}, {42999, 42999}, {43000, 43001}, - {43002, 43002}, {43003, 43009}, {43010, 43010}, {43011, 43013}, - {43014, 43014}, {43015, 43018}, {43019, 43019}, {43020, 43042}, - {43043, 43044}, {43045, 43046}, {43047, 43047}, {43052, 43052}, - {43072, 43123}, {43136, 43137}, {43138, 43187}, {43188, 43203}, - {43204, 43205}, {43216, 43225}, {43232, 43249}, {43250, 43255}, - {43259, 43259}, {43261, 43262}, {43263, 43263}, {43264, 43273}, - {43274, 43301}, {43302, 43309}, {43312, 43334}, {43335, 43345}, - {43346, 43347}, {43360, 43388}, {43392, 43394}, {43395, 43395}, - {43396, 43442}, {43443, 43443}, {43444, 43445}, {43446, 43449}, - {43450, 43451}, {43452, 43453}, {43454, 43456}, {43471, 43471}, - {43472, 43481}, {43488, 43492}, {43493, 43493}, {43494, 43494}, - {43495, 43503}, {43504, 43513}, {43514, 43518}, {43520, 43560}, - {43561, 43566}, {43567, 43568}, {43569, 43570}, {43571, 43572}, - {43573, 43574}, {43584, 43586}, {43587, 43587}, {43588, 43595}, - {43596, 43596}, {43597, 43597}, {43600, 43609}, {43616, 43631}, - {43632, 43632}, {43633, 43638}, {43642, 43642}, {43643, 43643}, - {43644, 43644}, {43645, 43645}, {43646, 43695}, {43696, 43696}, - {43697, 43697}, {43698, 43700}, {43701, 43702}, {43703, 43704}, - {43705, 43709}, {43710, 43711}, {43712, 43712}, {43713, 43713}, - {43714, 43714}, {43739, 43740}, {43741, 43741}, {43744, 43754}, - {43755, 43755}, {43756, 43757}, {43758, 43759}, {43762, 43762}, - {43763, 43764}, {43765, 43765}, {43766, 43766}, {43777, 43782}, - {43785, 43790}, {43793, 43798}, {43808, 43814}, {43816, 43822}, - {43824, 43866}, {43868, 43871}, {43872, 43880}, {43881, 43881}, - {43888, 43967}, {43968, 44002}, {44003, 44004}, {44005, 44005}, - {44006, 44007}, {44008, 44008}, {44009, 44010}, {44012, 44012}, - {44013, 44013}, {44016, 44025}, {44032, 55203}, {55216, 55238}, - {55243, 55291}, {63744, 64109}, {64112, 64217}, {64256, 64262}, - {64275, 64279}, {64285, 64285}, {64286, 64286}, {64287, 64296}, - {64298, 64310}, {64312, 64316}, {64318, 64318}, {64320, 64321}, - {64323, 64324}, {64326, 64433}, {64467, 64829}, {64848, 64911}, - {64914, 64967}, {65008, 65019}, {65024, 65039}, {65056, 65071}, - {65075, 65076}, {65101, 65103}, {65136, 65140}, {65142, 65276}, - {65296, 65305}, {65313, 65338}, {65343, 65343}, {65345, 65370}, - {65381, 65381}, {65382, 65391}, {65392, 65392}, {65393, 65437}, - {65438, 65439}, {65440, 65470}, {65474, 65479}, {65482, 65487}, - {65490, 65495}, {65498, 65500}, {65536, 65547}, {65549, 65574}, - {65576, 65594}, {65596, 65597}, {65599, 65613}, {65616, 65629}, - {65664, 65786}, {65856, 65908}, {66045, 66045}, {66176, 66204}, - {66208, 66256}, {66272, 66272}, {66304, 66335}, {66349, 66368}, - {66369, 66369}, {66370, 66377}, {66378, 66378}, {66384, 66421}, - {66422, 66426}, {66432, 66461}, {66464, 66499}, {66504, 66511}, - {66513, 66517}, {66560, 66639}, {66640, 66717}, {66720, 66729}, - {66736, 66771}, {66776, 66811}, {66816, 66855}, {66864, 66915}, - {66928, 66938}, {66940, 66954}, {66956, 66962}, {66964, 66965}, - {66967, 66977}, {66979, 66993}, {66995, 67001}, {67003, 67004}, - {67008, 67059}, {67072, 67382}, {67392, 67413}, {67424, 67431}, - {67456, 67461}, {67463, 67504}, {67506, 67514}, {67584, 67589}, - {67592, 67592}, {67594, 67637}, {67639, 67640}, {67644, 67644}, - {67647, 67669}, {67680, 67702}, {67712, 67742}, {67808, 67826}, - {67828, 67829}, {67840, 67861}, {67872, 67897}, {67904, 67929}, - {67968, 68023}, {68030, 68031}, {68096, 68096}, {68097, 68099}, - {68101, 68102}, {68108, 68111}, {68112, 68115}, {68117, 68119}, - {68121, 68149}, {68152, 68154}, {68159, 68159}, {68192, 68220}, - {68224, 68252}, {68288, 68295}, {68297, 68324}, {68325, 68326}, - {68352, 68405}, {68416, 68437}, {68448, 68466}, {68480, 68497}, - {68608, 68680}, {68736, 68786}, {68800, 68850}, {68864, 68899}, - {68900, 68903}, {68912, 68921}, {68928, 68937}, {68938, 68941}, - {68942, 68942}, {68943, 68943}, {68944, 68965}, {68969, 68973}, - {68975, 68975}, {68976, 68997}, {69248, 69289}, {69291, 69292}, - {69296, 69297}, {69314, 69316}, {69317, 69317}, {69318, 69319}, - {69370, 69375}, {69376, 69404}, {69415, 69415}, {69424, 69445}, - {69446, 69456}, {69488, 69505}, {69506, 69509}, {69552, 69572}, - {69600, 69622}, {69632, 69632}, {69633, 69633}, {69634, 69634}, - {69635, 69687}, {69688, 69702}, {69734, 69743}, {69744, 69744}, - {69745, 69746}, {69747, 69748}, {69749, 69749}, {69759, 69761}, - {69762, 69762}, {69763, 69807}, {69808, 69810}, {69811, 69814}, - {69815, 69816}, {69817, 69818}, {69826, 69826}, {69840, 69864}, - {69872, 69881}, {69888, 69890}, {69891, 69926}, {69927, 69931}, - {69932, 69932}, {69933, 69940}, {69942, 69951}, {69956, 69956}, - {69957, 69958}, {69959, 69959}, {69968, 70002}, {70003, 70003}, - {70006, 70006}, {70016, 70017}, {70018, 70018}, {70019, 70066}, - {70067, 70069}, {70070, 70078}, {70079, 70080}, {70081, 70084}, - {70089, 70092}, {70094, 70094}, {70095, 70095}, {70096, 70105}, - {70106, 70106}, {70108, 70108}, {70144, 70161}, {70163, 70187}, - {70188, 70190}, {70191, 70193}, {70194, 70195}, {70196, 70196}, - {70197, 70197}, {70198, 70199}, {70206, 70206}, {70207, 70208}, - {70209, 70209}, {70272, 70278}, {70280, 70280}, {70282, 70285}, - {70287, 70301}, {70303, 70312}, {70320, 70366}, {70367, 70367}, - {70368, 70370}, {70371, 70378}, {70384, 70393}, {70400, 70401}, - {70402, 70403}, {70405, 70412}, {70415, 70416}, {70419, 70440}, - {70442, 70448}, {70450, 70451}, {70453, 70457}, {70459, 70460}, - {70461, 70461}, {70462, 70463}, {70464, 70464}, {70465, 70468}, - {70471, 70472}, {70475, 70477}, {70480, 70480}, {70487, 70487}, - {70493, 70497}, {70498, 70499}, {70502, 70508}, {70512, 70516}, - {70528, 70537}, {70539, 70539}, {70542, 70542}, {70544, 70581}, - {70583, 70583}, {70584, 70586}, {70587, 70592}, {70594, 70594}, - {70597, 70597}, {70599, 70602}, {70604, 70605}, {70606, 70606}, - {70607, 70607}, {70608, 70608}, {70609, 70609}, {70610, 70610}, - {70611, 70611}, {70625, 70626}, {70656, 70708}, {70709, 70711}, - {70712, 70719}, {70720, 70721}, {70722, 70724}, {70725, 70725}, - {70726, 70726}, {70727, 70730}, {70736, 70745}, {70750, 70750}, - {70751, 70753}, {70784, 70831}, {70832, 70834}, {70835, 70840}, - {70841, 70841}, {70842, 70842}, {70843, 70846}, {70847, 70848}, - {70849, 70849}, {70850, 70851}, {70852, 70853}, {70855, 70855}, - {70864, 70873}, {71040, 71086}, {71087, 71089}, {71090, 71093}, - {71096, 71099}, {71100, 71101}, {71102, 71102}, {71103, 71104}, - {71128, 71131}, {71132, 71133}, {71168, 71215}, {71216, 71218}, - {71219, 71226}, {71227, 71228}, {71229, 71229}, {71230, 71230}, - {71231, 71232}, {71236, 71236}, {71248, 71257}, {71296, 71338}, - {71339, 71339}, {71340, 71340}, {71341, 71341}, {71342, 71343}, - {71344, 71349}, {71350, 71350}, {71351, 71351}, {71352, 71352}, - {71360, 71369}, {71376, 71395}, {71424, 71450}, {71453, 71453}, - {71454, 71454}, {71455, 71455}, {71456, 71457}, {71458, 71461}, - {71462, 71462}, {71463, 71467}, {71472, 71481}, {71488, 71494}, - {71680, 71723}, {71724, 71726}, {71727, 71735}, {71736, 71736}, - {71737, 71738}, {71840, 71903}, {71904, 71913}, {71935, 71942}, - {71945, 71945}, {71948, 71955}, {71957, 71958}, {71960, 71983}, - {71984, 71989}, {71991, 71992}, {71995, 71996}, {71997, 71997}, - {71998, 71998}, {71999, 71999}, {72000, 72000}, {72001, 72001}, - {72002, 72002}, {72003, 72003}, {72016, 72025}, {72096, 72103}, - {72106, 72144}, {72145, 72147}, {72148, 72151}, {72154, 72155}, - {72156, 72159}, {72160, 72160}, {72161, 72161}, {72163, 72163}, - {72164, 72164}, {72192, 72192}, {72193, 72202}, {72203, 72242}, - {72243, 72248}, {72249, 72249}, {72250, 72250}, {72251, 72254}, - {72263, 72263}, {72272, 72272}, {72273, 72278}, {72279, 72280}, - {72281, 72283}, {72284, 72329}, {72330, 72342}, {72343, 72343}, - {72344, 72345}, {72349, 72349}, {72368, 72440}, {72544, 72544}, - {72545, 72545}, {72546, 72548}, {72549, 72549}, {72550, 72550}, - {72551, 72551}, {72640, 72672}, {72688, 72697}, {72704, 72712}, - {72714, 72750}, {72751, 72751}, {72752, 72758}, {72760, 72765}, - {72766, 72766}, {72767, 72767}, {72768, 72768}, {72784, 72793}, - {72818, 72847}, {72850, 72871}, {72873, 72873}, {72874, 72880}, - {72881, 72881}, {72882, 72883}, {72884, 72884}, {72885, 72886}, - {72960, 72966}, {72968, 72969}, {72971, 73008}, {73009, 73014}, - {73018, 73018}, {73020, 73021}, {73023, 73029}, {73030, 73030}, - {73031, 73031}, {73040, 73049}, {73056, 73061}, {73063, 73064}, - {73066, 73097}, {73098, 73102}, {73104, 73105}, {73107, 73108}, - {73109, 73109}, {73110, 73110}, {73111, 73111}, {73112, 73112}, - {73120, 73129}, {73136, 73176}, {73177, 73177}, {73178, 73179}, - {73184, 73193}, {73440, 73458}, {73459, 73460}, {73461, 73462}, - {73472, 73473}, {73474, 73474}, {73475, 73475}, {73476, 73488}, - {73490, 73523}, {73524, 73525}, {73526, 73530}, {73534, 73535}, - {73536, 73536}, {73537, 73537}, {73538, 73538}, {73552, 73561}, - {73562, 73562}, {73648, 73648}, {73728, 74649}, {74752, 74862}, - {74880, 75075}, {77712, 77808}, {77824, 78895}, {78912, 78912}, - {78913, 78918}, {78919, 78933}, {78944, 82938}, {82944, 83526}, - {90368, 90397}, {90398, 90409}, {90410, 90412}, {90413, 90415}, - {90416, 90425}, {92160, 92728}, {92736, 92766}, {92768, 92777}, - {92784, 92862}, {92864, 92873}, {92880, 92909}, {92912, 92916}, - {92928, 92975}, {92976, 92982}, {92992, 92995}, {93008, 93017}, - {93027, 93047}, {93053, 93071}, {93504, 93506}, {93507, 93546}, - {93547, 93548}, {93552, 93561}, {93760, 93823}, {93856, 93880}, - {93883, 93907}, {93952, 94026}, {94031, 94031}, {94032, 94032}, - {94033, 94087}, {94095, 94098}, {94099, 94111}, {94176, 94177}, - {94179, 94179}, {94180, 94180}, {94192, 94193}, {94194, 94195}, - {94196, 94198}, {94208, 101589}, {101631, 101662}, {101760, 101874}, - {110576, 110579}, {110581, 110587}, {110589, 110590}, {110592, 110882}, - {110898, 110898}, {110928, 110930}, {110933, 110933}, {110948, 110951}, - {110960, 111355}, {113664, 113770}, {113776, 113788}, {113792, 113800}, - {113808, 113817}, {113821, 113822}, {118000, 118009}, {118528, 118573}, - {118576, 118598}, {119141, 119142}, {119143, 119145}, {119149, 119154}, - {119163, 119170}, {119173, 119179}, {119210, 119213}, {119362, 119364}, - {119808, 119892}, {119894, 119964}, {119966, 119967}, {119970, 119970}, - {119973, 119974}, {119977, 119980}, {119982, 119993}, {119995, 119995}, - {119997, 120003}, {120005, 120069}, {120071, 120074}, {120077, 120084}, - {120086, 120092}, {120094, 120121}, {120123, 120126}, {120128, 120132}, - {120134, 120134}, {120138, 120144}, {120146, 120485}, {120488, 120512}, - {120514, 120538}, {120540, 120570}, {120572, 120596}, {120598, 120628}, - {120630, 120654}, {120656, 120686}, {120688, 120712}, {120714, 120744}, - {120746, 120770}, {120772, 120779}, {120782, 120831}, {121344, 121398}, - {121403, 121452}, {121461, 121461}, {121476, 121476}, {121499, 121503}, - {121505, 121519}, {122624, 122633}, {122634, 122634}, {122635, 122654}, - {122661, 122666}, {122880, 122886}, {122888, 122904}, {122907, 122913}, - {122915, 122916}, {122918, 122922}, {122928, 122989}, {123023, 123023}, - {123136, 123180}, {123184, 123190}, {123191, 123197}, {123200, 123209}, - {123214, 123214}, {123536, 123565}, {123566, 123566}, {123584, 123627}, - {123628, 123631}, {123632, 123641}, {124112, 124138}, {124139, 124139}, - {124140, 124143}, {124144, 124153}, {124368, 124397}, {124398, 124399}, - {124400, 124400}, {124401, 124410}, {124608, 124638}, {124640, 124642}, - {124643, 124643}, {124644, 124645}, {124646, 124646}, {124647, 124653}, - {124654, 124655}, {124656, 124660}, {124661, 124661}, {124670, 124670}, - {124671, 124671}, {124896, 124902}, {124904, 124907}, {124909, 124910}, - {124912, 124926}, {124928, 125124}, {125136, 125142}, {125184, 125251}, - {125252, 125258}, {125259, 125259}, {125264, 125273}, {126464, 126467}, - {126469, 126495}, {126497, 126498}, {126500, 126500}, {126503, 126503}, - {126505, 126514}, {126516, 126519}, {126521, 126521}, {126523, 126523}, - {126530, 126530}, {126535, 126535}, {126537, 126537}, {126539, 126539}, - {126541, 126543}, {126545, 126546}, {126548, 126548}, {126551, 126551}, - {126553, 126553}, {126555, 126555}, {126557, 126557}, {126559, 126559}, - {126561, 126562}, {126564, 126564}, {126567, 126570}, {126572, 126578}, - {126580, 126583}, {126585, 126588}, {126590, 126590}, {126592, 126601}, - {126603, 126619}, {126625, 126627}, {126629, 126633}, {126635, 126651}, - {130032, 130041}, {131072, 173791}, {173824, 178205}, {178208, 183981}, - {183984, 191456}, {191472, 192093}, {194560, 195101}, {196608, 201546}, - {201552, 210041}, {917760, 917999} -}; -const uint32_t id_start[776][2] = -{ - {65, 90}, {97, 122}, {170, 170}, {181, 181}, - {186, 186}, {192, 214}, {216, 246}, {248, 442}, - {443, 443}, {444, 447}, {448, 451}, {452, 659}, - {660, 661}, {662, 687}, {688, 705}, {710, 721}, - {736, 740}, {748, 748}, {750, 750}, {880, 883}, - {884, 884}, {886, 887}, {890, 890}, {891, 893}, - {895, 895}, {902, 902}, {904, 906}, {908, 908}, - {910, 929}, {931, 1013}, {1015, 1153}, {1162, 1327}, - {1329, 1366}, {1369, 1369}, {1376, 1416}, {1488, 1514}, - {1519, 1522}, {1568, 1599}, {1600, 1600}, {1601, 1610}, - {1646, 1647}, {1649, 1747}, {1749, 1749}, {1765, 1766}, - {1774, 1775}, {1786, 1788}, {1791, 1791}, {1808, 1808}, - {1810, 1839}, {1869, 1957}, {1969, 1969}, {1994, 2026}, - {2036, 2037}, {2042, 2042}, {2048, 2069}, {2074, 2074}, - {2084, 2084}, {2088, 2088}, {2112, 2136}, {2144, 2154}, - {2160, 2183}, {2185, 2191}, {2208, 2248}, {2249, 2249}, - {2308, 2361}, {2365, 2365}, {2384, 2384}, {2392, 2401}, - {2417, 2417}, {2418, 2432}, {2437, 2444}, {2447, 2448}, - {2451, 2472}, {2474, 2480}, {2482, 2482}, {2486, 2489}, - {2493, 2493}, {2510, 2510}, {2524, 2525}, {2527, 2529}, - {2544, 2545}, {2556, 2556}, {2565, 2570}, {2575, 2576}, - {2579, 2600}, {2602, 2608}, {2610, 2611}, {2613, 2614}, - {2616, 2617}, {2649, 2652}, {2654, 2654}, {2674, 2676}, - {2693, 2701}, {2703, 2705}, {2707, 2728}, {2730, 2736}, - {2738, 2739}, {2741, 2745}, {2749, 2749}, {2768, 2768}, - {2784, 2785}, {2809, 2809}, {2821, 2828}, {2831, 2832}, - {2835, 2856}, {2858, 2864}, {2866, 2867}, {2869, 2873}, - {2877, 2877}, {2908, 2909}, {2911, 2913}, {2929, 2929}, - {2947, 2947}, {2949, 2954}, {2958, 2960}, {2962, 2965}, - {2969, 2970}, {2972, 2972}, {2974, 2975}, {2979, 2980}, - {2984, 2986}, {2990, 3001}, {3024, 3024}, {3077, 3084}, - {3086, 3088}, {3090, 3112}, {3114, 3129}, {3133, 3133}, - {3160, 3162}, {3164, 3165}, {3168, 3169}, {3200, 3200}, - {3205, 3212}, {3214, 3216}, {3218, 3240}, {3242, 3251}, - {3253, 3257}, {3261, 3261}, {3292, 3294}, {3296, 3297}, - {3313, 3314}, {3332, 3340}, {3342, 3344}, {3346, 3386}, - {3389, 3389}, {3406, 3406}, {3412, 3414}, {3423, 3425}, - {3450, 3455}, {3461, 3478}, {3482, 3505}, {3507, 3515}, - {3517, 3517}, {3520, 3526}, {3585, 3632}, {3634, 3635}, - {3648, 3653}, {3654, 3654}, {3713, 3714}, {3716, 3716}, - {3718, 3722}, {3724, 3747}, {3749, 3749}, {3751, 3760}, - {3762, 3763}, {3773, 3773}, {3776, 3780}, {3782, 3782}, - {3804, 3807}, {3840, 3840}, {3904, 3911}, {3913, 3948}, - {3976, 3980}, {4096, 4138}, {4159, 4159}, {4176, 4181}, - {4186, 4189}, {4193, 4193}, {4197, 4198}, {4206, 4208}, - {4213, 4225}, {4238, 4238}, {4256, 4293}, {4295, 4295}, - {4301, 4301}, {4304, 4346}, {4348, 4348}, {4349, 4351}, - {4352, 4680}, {4682, 4685}, {4688, 4694}, {4696, 4696}, - {4698, 4701}, {4704, 4744}, {4746, 4749}, {4752, 4784}, - {4786, 4789}, {4792, 4798}, {4800, 4800}, {4802, 4805}, - {4808, 4822}, {4824, 4880}, {4882, 4885}, {4888, 4954}, - {4992, 5007}, {5024, 5109}, {5112, 5117}, {5121, 5740}, - {5743, 5759}, {5761, 5786}, {5792, 5866}, {5870, 5872}, - {5873, 5880}, {5888, 5905}, {5919, 5937}, {5952, 5969}, - {5984, 5996}, {5998, 6000}, {6016, 6067}, {6103, 6103}, - {6108, 6108}, {6176, 6210}, {6211, 6211}, {6212, 6264}, - {6272, 6276}, {6277, 6278}, {6279, 6312}, {6314, 6314}, - {6320, 6389}, {6400, 6430}, {6480, 6509}, {6512, 6516}, - {6528, 6571}, {6576, 6601}, {6656, 6678}, {6688, 6740}, - {6823, 6823}, {6917, 6963}, {6981, 6988}, {7043, 7072}, - {7086, 7087}, {7098, 7141}, {7168, 7203}, {7245, 7247}, - {7258, 7287}, {7288, 7293}, {7296, 7306}, {7312, 7354}, - {7357, 7359}, {7401, 7404}, {7406, 7411}, {7413, 7414}, - {7418, 7418}, {7424, 7467}, {7468, 7530}, {7531, 7543}, - {7544, 7544}, {7545, 7578}, {7579, 7615}, {7680, 7957}, - {7960, 7965}, {7968, 8005}, {8008, 8013}, {8016, 8023}, - {8025, 8025}, {8027, 8027}, {8029, 8029}, {8031, 8061}, - {8064, 8116}, {8118, 8124}, {8126, 8126}, {8130, 8132}, - {8134, 8140}, {8144, 8147}, {8150, 8155}, {8160, 8172}, - {8178, 8180}, {8182, 8188}, {8305, 8305}, {8319, 8319}, - {8336, 8348}, {8450, 8450}, {8455, 8455}, {8458, 8467}, - {8469, 8469}, {8472, 8472}, {8473, 8477}, {8484, 8484}, - {8486, 8486}, {8488, 8488}, {8490, 8493}, {8494, 8494}, - {8495, 8500}, {8501, 8504}, {8505, 8505}, {8508, 8511}, - {8517, 8521}, {8526, 8526}, {8544, 8578}, {8579, 8580}, - {8581, 8584}, {11264, 11387}, {11388, 11389}, {11390, 11492}, - {11499, 11502}, {11506, 11507}, {11520, 11557}, {11559, 11559}, - {11565, 11565}, {11568, 11623}, {11631, 11631}, {11648, 11670}, - {11680, 11686}, {11688, 11694}, {11696, 11702}, {11704, 11710}, - {11712, 11718}, {11720, 11726}, {11728, 11734}, {11736, 11742}, - {12293, 12293}, {12294, 12294}, {12295, 12295}, {12321, 12329}, - {12337, 12341}, {12344, 12346}, {12347, 12347}, {12348, 12348}, - {12353, 12438}, {12443, 12444}, {12445, 12446}, {12447, 12447}, - {12449, 12538}, {12540, 12542}, {12543, 12543}, {12549, 12591}, - {12593, 12686}, {12704, 12735}, {12784, 12799}, {13312, 19903}, - {19968, 40980}, {40981, 40981}, {40982, 42124}, {42192, 42231}, - {42232, 42237}, {42240, 42507}, {42508, 42508}, {42512, 42527}, - {42538, 42539}, {42560, 42605}, {42606, 42606}, {42623, 42623}, - {42624, 42651}, {42652, 42653}, {42656, 42725}, {42726, 42735}, - {42775, 42783}, {42786, 42863}, {42864, 42864}, {42865, 42887}, - {42888, 42888}, {42891, 42894}, {42895, 42895}, {42896, 42972}, - {42993, 42996}, {42997, 42998}, {42999, 42999}, {43000, 43001}, - {43002, 43002}, {43003, 43009}, {43011, 43013}, {43015, 43018}, - {43020, 43042}, {43072, 43123}, {43138, 43187}, {43250, 43255}, - {43259, 43259}, {43261, 43262}, {43274, 43301}, {43312, 43334}, - {43360, 43388}, {43396, 43442}, {43471, 43471}, {43488, 43492}, - {43494, 43494}, {43495, 43503}, {43514, 43518}, {43520, 43560}, - {43584, 43586}, {43588, 43595}, {43616, 43631}, {43632, 43632}, - {43633, 43638}, {43642, 43642}, {43646, 43695}, {43697, 43697}, - {43701, 43702}, {43705, 43709}, {43712, 43712}, {43714, 43714}, - {43739, 43740}, {43741, 43741}, {43744, 43754}, {43762, 43762}, - {43763, 43764}, {43777, 43782}, {43785, 43790}, {43793, 43798}, - {43808, 43814}, {43816, 43822}, {43824, 43866}, {43868, 43871}, - {43872, 43880}, {43881, 43881}, {43888, 43967}, {43968, 44002}, - {44032, 55203}, {55216, 55238}, {55243, 55291}, {63744, 64109}, - {64112, 64217}, {64256, 64262}, {64275, 64279}, {64285, 64285}, - {64287, 64296}, {64298, 64310}, {64312, 64316}, {64318, 64318}, - {64320, 64321}, {64323, 64324}, {64326, 64433}, {64467, 64829}, - {64848, 64911}, {64914, 64967}, {65008, 65019}, {65136, 65140}, - {65142, 65276}, {65313, 65338}, {65345, 65370}, {65382, 65391}, - {65392, 65392}, {65393, 65437}, {65438, 65439}, {65440, 65470}, - {65474, 65479}, {65482, 65487}, {65490, 65495}, {65498, 65500}, - {65536, 65547}, {65549, 65574}, {65576, 65594}, {65596, 65597}, - {65599, 65613}, {65616, 65629}, {65664, 65786}, {65856, 65908}, - {66176, 66204}, {66208, 66256}, {66304, 66335}, {66349, 66368}, - {66369, 66369}, {66370, 66377}, {66378, 66378}, {66384, 66421}, - {66432, 66461}, {66464, 66499}, {66504, 66511}, {66513, 66517}, - {66560, 66639}, {66640, 66717}, {66736, 66771}, {66776, 66811}, - {66816, 66855}, {66864, 66915}, {66928, 66938}, {66940, 66954}, - {66956, 66962}, {66964, 66965}, {66967, 66977}, {66979, 66993}, - {66995, 67001}, {67003, 67004}, {67008, 67059}, {67072, 67382}, - {67392, 67413}, {67424, 67431}, {67456, 67461}, {67463, 67504}, - {67506, 67514}, {67584, 67589}, {67592, 67592}, {67594, 67637}, - {67639, 67640}, {67644, 67644}, {67647, 67669}, {67680, 67702}, - {67712, 67742}, {67808, 67826}, {67828, 67829}, {67840, 67861}, - {67872, 67897}, {67904, 67929}, {67968, 68023}, {68030, 68031}, - {68096, 68096}, {68112, 68115}, {68117, 68119}, {68121, 68149}, - {68192, 68220}, {68224, 68252}, {68288, 68295}, {68297, 68324}, - {68352, 68405}, {68416, 68437}, {68448, 68466}, {68480, 68497}, - {68608, 68680}, {68736, 68786}, {68800, 68850}, {68864, 68899}, - {68938, 68941}, {68942, 68942}, {68943, 68943}, {68944, 68965}, - {68975, 68975}, {68976, 68997}, {69248, 69289}, {69296, 69297}, - {69314, 69316}, {69317, 69317}, {69318, 69319}, {69376, 69404}, - {69415, 69415}, {69424, 69445}, {69488, 69505}, {69552, 69572}, - {69600, 69622}, {69635, 69687}, {69745, 69746}, {69749, 69749}, - {69763, 69807}, {69840, 69864}, {69891, 69926}, {69956, 69956}, - {69959, 69959}, {69968, 70002}, {70006, 70006}, {70019, 70066}, - {70081, 70084}, {70106, 70106}, {70108, 70108}, {70144, 70161}, - {70163, 70187}, {70207, 70208}, {70272, 70278}, {70280, 70280}, - {70282, 70285}, {70287, 70301}, {70303, 70312}, {70320, 70366}, - {70405, 70412}, {70415, 70416}, {70419, 70440}, {70442, 70448}, - {70450, 70451}, {70453, 70457}, {70461, 70461}, {70480, 70480}, - {70493, 70497}, {70528, 70537}, {70539, 70539}, {70542, 70542}, - {70544, 70581}, {70583, 70583}, {70609, 70609}, {70611, 70611}, - {70656, 70708}, {70727, 70730}, {70751, 70753}, {70784, 70831}, - {70852, 70853}, {70855, 70855}, {71040, 71086}, {71128, 71131}, - {71168, 71215}, {71236, 71236}, {71296, 71338}, {71352, 71352}, - {71424, 71450}, {71488, 71494}, {71680, 71723}, {71840, 71903}, - {71935, 71942}, {71945, 71945}, {71948, 71955}, {71957, 71958}, - {71960, 71983}, {71999, 71999}, {72001, 72001}, {72096, 72103}, - {72106, 72144}, {72161, 72161}, {72163, 72163}, {72192, 72192}, - {72203, 72242}, {72250, 72250}, {72272, 72272}, {72284, 72329}, - {72349, 72349}, {72368, 72440}, {72640, 72672}, {72704, 72712}, - {72714, 72750}, {72768, 72768}, {72818, 72847}, {72960, 72966}, - {72968, 72969}, {72971, 73008}, {73030, 73030}, {73056, 73061}, - {73063, 73064}, {73066, 73097}, {73112, 73112}, {73136, 73176}, - {73177, 73177}, {73178, 73179}, {73440, 73458}, {73474, 73474}, - {73476, 73488}, {73490, 73523}, {73648, 73648}, {73728, 74649}, - {74752, 74862}, {74880, 75075}, {77712, 77808}, {77824, 78895}, - {78913, 78918}, {78944, 82938}, {82944, 83526}, {90368, 90397}, - {92160, 92728}, {92736, 92766}, {92784, 92862}, {92880, 92909}, - {92928, 92975}, {92992, 92995}, {93027, 93047}, {93053, 93071}, - {93504, 93506}, {93507, 93546}, {93547, 93548}, {93760, 93823}, - {93856, 93880}, {93883, 93907}, {93952, 94026}, {94032, 94032}, - {94099, 94111}, {94176, 94177}, {94179, 94179}, {94194, 94195}, - {94196, 94198}, {94208, 101589}, {101631, 101662}, {101760, 101874}, - {110576, 110579}, {110581, 110587}, {110589, 110590}, {110592, 110882}, - {110898, 110898}, {110928, 110930}, {110933, 110933}, {110948, 110951}, - {110960, 111355}, {113664, 113770}, {113776, 113788}, {113792, 113800}, - {113808, 113817}, {119808, 119892}, {119894, 119964}, {119966, 119967}, - {119970, 119970}, {119973, 119974}, {119977, 119980}, {119982, 119993}, - {119995, 119995}, {119997, 120003}, {120005, 120069}, {120071, 120074}, - {120077, 120084}, {120086, 120092}, {120094, 120121}, {120123, 120126}, - {120128, 120132}, {120134, 120134}, {120138, 120144}, {120146, 120485}, - {120488, 120512}, {120514, 120538}, {120540, 120570}, {120572, 120596}, - {120598, 120628}, {120630, 120654}, {120656, 120686}, {120688, 120712}, - {120714, 120744}, {120746, 120770}, {120772, 120779}, {122624, 122633}, - {122634, 122634}, {122635, 122654}, {122661, 122666}, {122928, 122989}, - {123136, 123180}, {123191, 123197}, {123214, 123214}, {123536, 123565}, - {123584, 123627}, {124112, 124138}, {124139, 124139}, {124368, 124397}, - {124400, 124400}, {124608, 124638}, {124640, 124642}, {124644, 124645}, - {124647, 124653}, {124656, 124660}, {124670, 124670}, {124671, 124671}, - {124896, 124902}, {124904, 124907}, {124909, 124910}, {124912, 124926}, - {124928, 125124}, {125184, 125251}, {125259, 125259}, {126464, 126467}, - {126469, 126495}, {126497, 126498}, {126500, 126500}, {126503, 126503}, - {126505, 126514}, {126516, 126519}, {126521, 126521}, {126523, 126523}, - {126530, 126530}, {126535, 126535}, {126537, 126537}, {126539, 126539}, - {126541, 126543}, {126545, 126546}, {126548, 126548}, {126551, 126551}, - {126553, 126553}, {126555, 126555}, {126557, 126557}, {126559, 126559}, - {126561, 126562}, {126564, 126564}, {126567, 126570}, {126572, 126578}, - {126580, 126583}, {126585, 126588}, {126590, 126590}, {126592, 126601}, - {126603, 126619}, {126625, 126627}, {126629, 126633}, {126635, 126651}, - {131072, 173791}, {173824, 178205}, {178208, 183981}, {183984, 191456}, - {191472, 192093}, {194560, 195101}, {196608, 201546}, {201552, 210041} -}; - +// id_continue / id_start pointers and counts are provided by table_store.hpp. -} // namespace ada::idna -#endif // ADA_IDNA_IDENTIFIER_TABLES_H +} // namespace ada::idna +#endif // ADA_IDNA_IDENTIFIER_TABLES_H /* end file src/id_tables.cpp */ namespace ada::idna { @@ -10434,39 +6678,51 @@ constexpr bool is_ascii_letter_or_digit(char32_t c) noexcept { bool valid_name_code_point(char32_t code_point, bool first) { // https://tc39.es/ecma262/#prod-IdentifierStart - // Fast paths: - if (first && - (code_point == '$' || code_point == '_' || is_ascii_letter(code_point))) { + + // Fast paths (no table needed) + if (first && (code_point == U'$' || code_point == U'_' || + is_ascii_letter(code_point))) { return true; } - if (!first && (code_point == '$' || is_ascii_letter_or_digit(code_point))) { + if (!first && (code_point == U'$' || is_ascii_letter_or_digit(code_point))) { return true; } - // Slow path... - if (code_point == 0xffffffff) { - return false; // minimal error handling + + // Minimal error handling for invalid code point + if (code_point > 0x10FFFF) { + return false; } - if (first) { - auto iter = std::lower_bound( - std::begin(ada::idna::id_start), std::end(ada::idna::id_start), - code_point, - [](const uint32_t* range, uint32_t cp) { return range[1] < cp; }); - return iter != std::end(id_start) && code_point >= (*iter)[0]; - } else { - auto iter = std::lower_bound( - std::begin(id_continue), std::end(id_continue), code_point, - [](const uint32_t* range, uint32_t cp) { return range[1] < cp; }); - return iter != std::end(id_start) && code_point >= (*iter)[0]; + if (code_point >= 0xD800 && code_point <= 0xDFFF) { + return false; } + + if (!ensure_tables() || id_start == nullptr || id_continue == nullptr) { + return false; + } + + // Slow path: binary search through the appropriate Unicode range table. + // Each entry is a [low, high] inclusive range. + const std::span ranges = + first ? std::span{ada::idna::id_start, + ada::idna::id_start_count} + : std::span{ada::idna::id_continue, + ada::idna::id_continue_count}; + + const auto iter = std::ranges::lower_bound( + ranges, code_point, {}, + [](const auto& range) { return range[1]; }); // project to range-high + + return iter != ranges.end() && code_point >= (*iter)[0]; } } // namespace ada::idna /* end file src/identifier.cpp */ /* end file src/idna.cpp */ -// NOLINTEND /* end file src/ada_idna.cpp */ ADA_POP_DISABLE_WARNINGS #include +#include +#include #if ADA_SSSE3 #include #elif ADA_NEON @@ -10939,6 +7195,88 @@ std::string percent_decode(const std::string_view input, size_t first_percent) { return dest; } +// 0..15 for hex digits, 0xFF otherwise - validate and decode with two loads. +constexpr static std::array unhex_table = []() consteval { + std::array t{}; + for (size_t i = 0; i < 256; ++i) { + t[i] = 0xFF; + } + for (uint8_t i = 0; i < 10; ++i) { + t[static_cast('0') + i] = i; + } + for (uint8_t i = 0; i < 6; ++i) { + t[static_cast('A') + i] = static_cast(10 + i); + t[static_cast('a') + i] = static_cast(10 + i); + } + return t; +}(); + +std::string form_urlencoded_decode(const std::string_view input) { + const size_t len = input.size(); + if (len == 0) [[unlikely]] { + return {}; + } + + // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage) + const char* const src = input.data(); + const char* const end = src + len; + const char* p = src; + + // Advance over the untransformed prefix. + while (p < end && *p != '+' && *p != '%') { + ++p; + } + if (p == end) { + return std::string(input); + } + + // Output is always at most as long as the input: write into a single + // pre-sized buffer, then shrink to the final length. + std::string out(len, '\0'); + char* d = out.data(); + char* const d0 = d; + + const size_t prefix = static_cast(p - src); + std::memcpy(d, src, prefix); + d += prefix; + + while (p < end) { + const char c = *p; + if (c == '+') { + *d++ = ' '; + ++p; + } else if (c == '%') { + // Decode runs of valid %XX tightly (common for nested URL query values). + while (p + 2 < end && *p == '%') { + const uint8_t hi = unhex_table[static_cast(p[1])]; + const uint8_t lo = unhex_table[static_cast(p[2])]; + if ((hi | lo) >= 16) { + break; + } + *d++ = static_cast((hi << 4) | lo); + p += 3; + } + if (p < end && *p == '%') { + // Invalid escape: copy '%' literally and continue. + *d++ = *p++; + } + } else { + // Copy a plain run until the next '+' or '%'. + const char* start = p; + ++p; + while (p < end && *p != '+' && *p != '%') { + ++p; + } + const size_t n = static_cast(p - start); + std::memcpy(d, start, n); + d += n; + } + } + + out.resize(static_cast(d - d0)); + return out; +} + std::string percent_encode(const std::string_view input, const uint8_t character_set[]) { auto pointer = std::ranges::find_if(input, [character_set](const char c) { @@ -11037,51 +7375,106 @@ std::string percent_encode(const std::string_view input, } // namespace ada::unicode /* end file src/unicode.cpp */ /* begin file src/serializers.cpp */ + #include -#include +#include +#include #include namespace ada::serializers { +namespace { + +// Digit pair LUT for fast decimal write: index 0..99 -> two chars. +constexpr std::array make_digit_pairs() noexcept { + std::array t{}; + for (size_t i = 0; i < 100; ++i) { + t[i * 2] = static_cast('0' + i / 10); + t[i * 2 + 1] = static_cast('0' + i % 10); + } + return t; +} + +constexpr auto digit_pairs = make_digit_pairs(); + +ada_really_inline char* write_u8(char* p, uint8_t v) noexcept { + if (v < 10) { + *p++ = static_cast('0' + v); + } else if (v < 100) { + std::memcpy(p, &digit_pairs[static_cast(v) * 2], 2); + p += 2; + } else { + *p++ = static_cast('0' + v / 100); + std::memcpy(p, &digit_pairs[static_cast(v % 100) * 2], 2); + p += 2; + } + return p; +} + +ada_really_inline char* write_hex_u16(char* p, uint16_t v) noexcept { + static constexpr char kHex[] = "0123456789abcdef"; + if (v >= 0x1000) { + *p++ = kHex[(v >> 12) & 0xf]; + *p++ = kHex[(v >> 8) & 0xf]; + *p++ = kHex[(v >> 4) & 0xf]; + *p++ = kHex[v & 0xf]; + } else if (v >= 0x100) { + *p++ = kHex[(v >> 8) & 0xf]; + *p++ = kHex[(v >> 4) & 0xf]; + *p++ = kHex[v & 0xf]; + } else if (v >= 0x10) { + *p++ = kHex[(v >> 4) & 0xf]; + *p++ = kHex[v & 0xf]; + } else { + *p++ = kHex[v & 0xf]; + } + return p; +} + +} // namespace void find_longest_sequence_of_ipv6_pieces( const std::array& address, size_t& compress, size_t& compress_length) noexcept { - for (size_t i = 0; i < 8; i++) { - if (address[i] == 0) { - size_t next = i + 1; - while (next != 8 && address[next] == 0) ++next; - const size_t count = next - i; - if (compress_length < count) { - compress_length = count; - compress = i; - if (next == 8) break; - i = next; - } + compress = 0; + compress_length = 0; + size_t i = 0; + while (i < 8) { + if (address[i] != 0) { + ++i; + continue; + } + size_t next = i + 1; + while (next < 8 && address[next] == 0) { + ++next; } + const size_t count = next - i; + if (count > compress_length) { + compress_length = count; + compress = i; + } + i = next; } } std::string ipv6(const std::array& address) { - size_t compress_length = 0; // The length of a long sequence of zeros. - size_t compress = 0; // The start of a long sequence of zeros. + size_t compress = 0; + size_t compress_length = 0; find_longest_sequence_of_ipv6_pieces(address, compress, compress_length); + // Skip compression when the longest zero run is a single piece. if (compress_length <= 1) { - // Optimization opportunity: Find a faster way then snprintf for imploding - // and return here. compress = compress_length = 8; } + // Max: '[' + 8*4 hex + 7 ':' + ']' = 41 std::string output(4 * 8 + 7 + 2, '\0'); - size_t piece_index = 0; char* point = output.data(); - char* point_end = output.data() + output.size(); *point++ = '['; + size_t piece_index = 0; while (true) { if (piece_index == compress) { *point++ = ':'; - // If we skip a value initially, we need to write '::', otherwise - // a single ':' will do since it follows a previous ':'. + // If we skip a value initially, we need to write '::'. if (piece_index == 0) { *point++ = ':'; } @@ -11090,28 +7483,29 @@ std::string ipv6(const std::array& address) { break; } } - point = std::to_chars(point, point_end, address[piece_index], 16).ptr; - piece_index++; + point = write_hex_u16(point, address[piece_index]); + ++piece_index; if (piece_index == 8) { break; } *point++ = ':'; } *point++ = ']'; - output.resize(point - output.data()); + output.resize(static_cast(point - output.data())); return output; } std::string ipv4(const uint64_t address) { std::string output(15, '\0'); char* point = output.data(); - char* point_end = output.data() + output.size(); - point = std::to_chars(point, point_end, uint8_t(address >> 24)).ptr; - for (int i = 2; i >= 0; i--) { - *point++ = '.'; - point = std::to_chars(point, point_end, uint8_t(address >> (i * 8))).ptr; - } - output.resize(point - output.data()); + point = write_u8(point, static_cast(address >> 24)); + *point++ = '.'; + point = write_u8(point, static_cast(address >> 16)); + *point++ = '.'; + point = write_u8(point, static_cast(address >> 8)); + *point++ = '.'; + point = write_u8(point, static_cast(address)); + output.resize(static_cast(point - output.data())); return output; } @@ -11119,16 +7513,274 @@ std::string ipv4(const uint64_t address) { /* end file src/serializers.cpp */ /* begin file src/implementation.cpp */ +#include +#include +#include #include namespace ada { +static std::atomic max_input_length_{ + std::numeric_limits::max()}; + +void set_max_input_length(uint32_t length) { + max_input_length_.store(length, std::memory_order_relaxed); +} + +uint32_t get_max_input_length() { + return max_input_length_.load(std::memory_order_relaxed); +} + +namespace { + +// @private +// Fast-path validator for can_parse. +// +// Validates absolute special (non-file) URLs without constructing any +// url_aggregator object and without running the state machine. +// Performs a single forward scan over the input bytes. +// +// Returns: +// true -- URL is structurally valid +// false -- URL is definitely invalid +// nullopt -- edge case; fall through to the full parser +// (credentials, IDNA, IPv4/6, tabs/newlines, relative URLs, ...) +std::optional try_can_parse_absolute_fast( + std::string_view input) noexcept { + const uint8_t* b = reinterpret_cast(input.data()); + size_t len = input.size(); + + // -- Inline C0 whitespace trim (no allocation) -------------------------- + // Note: \t (0x09), \n (0x0a), \r (0x0d) are all <= 0x20, so any + // leading/trailing tabs or newlines are correctly stripped here, matching + // the WHATWG spec's "remove leading/trailing C0 control and space" step. + while (len > 0 && b[0] <= 0x20) { + b++; + len--; + } + while (len > 0 && b[len - 1] <= 0x20) { + len--; + } + if (len == 0) return false; + + // -- Scheme detection ----------------------------------------------------- + // Fast path for HTTP and HTTPS (covers ~90%+ of real-world URLs). + // Avoids the general scheme loop, buffer copy, and perfect hash lookup. + // We know HTTP and HTTPS are special non-file schemes, so no further + // scheme_type checks are needed on the fast path -- only `pos` matters. + size_t pos; + + if (len >= 7 && (b[0] | 0x20) == 'h' && (b[1] | 0x20) == 't' && + (b[2] | 0x20) == 't' && (b[3] | 0x20) == 'p') { + if (b[4] == ':' && b[5] == '/' && b[6] == '/') { + pos = 7; + goto skip_extra_slashes; + } + if (len >= 8 && (b[4] | 0x20) == 's' && b[5] == ':' && b[6] == '/' && + b[7] == '/') { + pos = 8; + goto skip_extra_slashes; + } + // Fall through: could be "httpe://", tabs in scheme, etc. + } + + { + // General scheme detection for ws, wss, ftp, and edge cases. + if (!checkers::is_alpha(static_cast(b[0]))) return false; + + // Scan for ':' within the first 7 bytes. All special schemes are <= 5 + // chars ("https"), so any URL whose first ':' is beyond byte 6 is either + // non-special or relative -- both require the full parser. + size_t colon_pos = 0; + for (size_t i = 1;; ++i) { + if (i >= 7 || i >= len) return std::nullopt; + const char c = static_cast(b[i]); + if (c == ':') { + colon_pos = i; + break; + } + // Tabs/newlines in the scheme require the full parser to strip them. + if (c == '\t' || c == '\n' || c == '\r') return std::nullopt; + if (!unicode::is_alnum_plus(c)) return false; + } + + // Lowercase scheme bytes inline and classify via the existing perfect + // hash. + char scheme_buf[6]; + scheme_buf[0] = static_cast(b[0] | 0x20); + for (size_t i = 1; i < colon_pos; ++i) + scheme_buf[i] = static_cast(b[i] | 0x20); + + const ada::scheme::type scheme_type = + ada::scheme::get_scheme_type({scheme_buf, colon_pos}); + + // Only handle special, non-file schemes. + if (scheme_type == ada::scheme::NOT_SPECIAL) return std::nullopt; + if (scheme_type == ada::scheme::FILE) return std::nullopt; + + // Per WHATWG, special URLs don't require "//": "http:example.com" is valid + // (SPECIAL_AUTHORITY_IGNORE_SLASHES just skips leading slashes and + // proceeds to AUTHORITY). Defer to the inline fallback for any input + // without "://". + pos = colon_pos + 1; + if (pos + 2 > len || b[pos] != '/' || b[pos + 1] != '/') { + return std::nullopt; + } + pos += 2; + } + +skip_extra_slashes: + // SPECIAL_AUTHORITY_IGNORE_SLASHES: the full parser skips any additional + // leading '/' or '\' after the initial "//". Mirror that here so we don't + // mis-identify the host as empty when there are extra slashes. + while (pos < len && (b[pos] == '/' || b[pos] == '\\')) { + ++pos; + } + + // Early IPv6 bail-out: if the authority starts with '[', it's an IPv6 + // literal which requires the full parser. Checking here avoids scanning + // the entire bracketed address only to bail out afterward. + if (pos < len && b[pos] == '[') return std::nullopt; + + // -- Merged authority + host scan ------------------------------------------ + // A single forward pass over the authority bytes that simultaneously: + // - finds the authority end and port colon + // - validates host characters (forbidden domain code points) + // - tracks IPv4 indicators (all-decimal-dots, last non-dot char) + // - detects xn-- prefixes (IDNA punycode) + // - detects tabs/newlines (which require the full parser to strip) + // This replaces 4 separate scans over the host bytes. + const size_t auth_start = pos; + size_t auth_end = pos; + size_t port_colon = SIZE_MAX; + bool all_dec_dots = true; + uint8_t last_non_dot = 0; + + for (; auth_end < len; ++auth_end) { + const uint8_t c = b[auth_end]; + + // Non-ASCII -> needs IDNA processing -> full parser. + if (c >= 0x80) return std::nullopt; + + // Authority delimiters. + if (c == '/' || c == '?' || c == '#' || c == '\\') break; + + // Port separator. + if (c == ':') { + if (port_colon == SIZE_MAX) port_colon = auth_end; + continue; + } + + // Credentials or percent-encoding -> full parser. + if (c == '@' || c == '%') return std::nullopt; + + // Tabs/newlines anywhere in the authority require the full parser to + // strip them before validation. Without this, a tab in the port (e.g. + // "http://host:8\t0/") would be mis-rejected by port validation. + if (c == '\t' || c == '\n' || c == '\r') return std::nullopt; + + // Skip remaining host-specific checks for port bytes. Port digits are + // validated separately below, and no forbidden-domain-code-point check + // is needed on port characters. + if (port_colon != SIZE_MAX) continue; + + // -- Host byte validation (inlined) ------------------------------------ + // Forbidden domain code points that are not already caught above: + // C0 controls and space (0x00-0x20), DEL (0x7F), <, >, [, ], ^, |. + // At this stage, the input may still be userinfo or be normalized later + // (e.g., percent-encoded), so we do not reject here and defer to the + // parser. Characters already caught: >= 0x80 (non-ASCII), '/' '?' '#' '\\' + // (delimiters), ':' (port), '@' '%' (bail), '\t' '\n' '\r' (bail). + if (c <= 0x20 || c == 0x7F || c == '<' || c == '>' || c == '[' || + c == ']' || c == '^' || c == '|') { + return std::nullopt; + } + + // Track whether host is all decimal digits and dots (potential IPv4). + if (c != '.' && (c < '0' || c > '9')) all_dec_dots = false; + + // Track last non-dot character for the IPv4 hex/octal heuristic. + if (c != '.') last_non_dot = c; + + // Detect xn-- prefix inline (IDNA punycode -> needs full parser). + // Checking at every position mirrors the original behavior: any + // occurrence of "xn--" in the host (not just at label boundaries) + // triggers a bail-out to the full IDNA validator. + if ((c | 0x20) == 'x' && auth_end + 4 <= len && + (b[auth_end + 1] | 0x20) == 'n' && b[auth_end + 2] == '-' && + b[auth_end + 3] == '-') { + return std::nullopt; + } + } + + const size_t host_end = (port_colon != SIZE_MAX) ? port_colon : auth_end; + + // Empty host is invalid for special URLs. + if (auth_start == host_end) return false; + + // -- IPv4 handling --------------------------------------------------------- + const char* host_ptr = reinterpret_cast(b + auth_start); + const size_t host_len = host_end - auth_start; + + if (all_dec_dots) { + // Host is all decimal digits and dots -> try the fast IPv4 parser. + if (checkers::try_parse_ipv4_fast({host_ptr, host_len}) != + checkers::ipv4_fast_fail) { + // Valid decimal IPv4 host. Do NOT return true yet: the port still + // needs to be validated below before we can declare the URL valid. + goto validate_port; + } + // Fast IPv4 parsing failed (e.g. host is ".", "..", "1.2.3.500"). + // Such hosts may still be valid domain names; defer to the full parser. + return std::nullopt; + } + + // Last-significant-character heuristic for non-decimal IPv4 (hex/octal): + // if the last non-dot char is a digit, 'a'-'f', or 'x' the host might be + // an IPv4 address that the fast path can't validate -- fall through. + // last_non_dot was tracked during the authority scan above. + { + const uint8_t lc = last_non_dot | 0x20; + if ((last_non_dot >= '0' && last_non_dot <= '9') || + (lc >= 'a' && lc <= 'f') || lc == 'x') { + return std::nullopt; + } + } + + // -- Port validation ------------------------------------------------------- +validate_port: + if (port_colon != SIZE_MAX) { + const uint8_t* pp = b + port_colon + 1; + size_t pl = auth_end - port_colon - 1; + if (pl > 0) { + // Strip leading zeros: "0000001" == 1, "0000000000000" == 0, both valid. + // Only the significant digits count toward the 5-digit maximum. + while (pl > 0 && *pp == '0') { + ++pp; + --pl; + } + if (pl > 5) return false; // significant digits > 99999 + uint32_t pv = 0; + for (size_t i = 0; i < pl; ++i) { + if (pp[i] < '0' || pp[i] > '9') return false; + pv = pv * 10 + (pp[i] - '0'); + } + if (pv > 65535) return false; + } + } + + // Path, query, and fragment are structurally always valid for can_parse -- + // the parser would encode whatever is there. + return true; +} + +} // namespace + template ada_warn_unused tl::expected parse( std::string_view input, const result_type* base_url) { - result_type u = - ada::parser::parse_url_impl(input, base_url); + result_type u = ada::parser::parse_url_impl(input, base_url); if (!u.is_valid) { return tl::unexpected(errors::type_error); } @@ -11141,6 +7793,14 @@ template ada::result parse( std::string_view input, const url_aggregator* base_url = nullptr); std::string href_from_file(std::string_view input) { + // Match ada::parse / setters: refuse inputs that already exceed the limit. + // Path percent-encoding can still expand the result, so we also check the + // final href below. + const uint32_t max_length = ada::get_max_input_length(); + if (input.size() > max_length) { + return {}; + } + // This is going to be much faster than constructing a URL. std::string tmp_buffer; std::string_view internal_input; @@ -11160,26 +7820,89 @@ std::string href_from_file(std::string_view input) { } else { helpers::parse_prepared_path(internal_input, ada::scheme::type::FILE, path); } - return "file://" + path; + std::string result = "file://" + path; + if (result.size() > max_length) { + return {}; + } + return result; } bool can_parse(std::string_view input, const std::string_view* base_input) { - ada::url_aggregator base_aggregator; - ada::url_aggregator* base_pointer = nullptr; + // Must match parse().has_value(), including post-normalization max length. + // Percent-encoding expands a byte by at most 3x, but IDNA expands more: a + // 3-byte UTF-8 label such as U+337F becomes the 17-byte "xn--6oqv20b1zgzxr", + // so a dotted host sustains 4.5x. When the input (plus base, if any) fits in + // max_length/5, the normalized href cannot exceed max_length, so + // validation-only parsing (store_values=false) is safe. + + // Hot path first: absolute special URLs, no base. Avoid loading max_length + // until we need it (common absolute-fast true/false cases). + if (base_input == nullptr) { + if (const auto r = try_can_parse_absolute_fast(input)) { + if (!*r) { + return false; + } + // size <= max/5 => normalized href cannot exceed max (4.5x expansion). + // Check this first: default max is ~4GB so almost all URLs return true. + const uint32_t max_length = ada::get_max_input_length(); + if (input.size() <= static_cast(max_length) / 5) { + return true; + } + if (input.size() > max_length) { + return false; + } + return ada::parser::parse_url_impl(input, + nullptr) + .is_valid; + } + } - if (base_input != nullptr) { - base_aggregator = ada::parser::parse_url_impl( - *base_input, nullptr); - if (!base_aggregator.is_valid) { - return false; + const uint32_t max_length = ada::get_max_input_length(); + if (input.size() > max_length) { + return false; + } + if (base_input != nullptr && base_input->size() > max_length) { + return false; + } + + // Relative resolution combines base + input; bound the sum so 4.5x expansion + // of either side cannot push the final href past max_length. + const size_t combined = + input.size() + (base_input == nullptr ? 0 : base_input->size()); + const bool size_safe = combined <= static_cast(max_length) / 5; + + if (size_safe) { + // Validation-only: no buffer build, host still fully checked. + ada::url_aggregator base_agg; + ada::url_aggregator* base_ptr = nullptr; + if (base_input != nullptr) { + base_agg = ada::parser::parse_url_impl( + *base_input, nullptr); + if (!base_agg.is_valid) { + return false; + } + base_ptr = &base_agg; } - base_pointer = &base_aggregator; + return ada::parser::parse_url_impl(input, + base_ptr) + .is_valid; } - ada::url_aggregator result = - ada::parser::parse_url_impl(input, - base_pointer); - return result.is_valid; + // Near the limit: full parse so post-normalization length matches parse(). + if (base_input == nullptr) { + return ada::parser::parse_url_impl(input, + nullptr) + .is_valid; + } + ada::url_aggregator base_agg = + ada::parser::parse_url_impl(*base_input, + nullptr); + if (!base_agg.is_valid) { + return false; + } + return ada::parser::parse_url_impl(input, + &base_agg) + .is_valid; } ada_warn_unused std::string_view to_string(ada::encoding_type type) { @@ -11489,7 +8212,7 @@ ada_really_inline size_t find_next_host_delimiter_special( uint8x16_t classify = vandq_u8(lowpart, highpart); if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) { uint8x16_t is_zero = vceqq_u8(classify, zero); - uint16_t is_non_zero = ~to_bitmask(is_zero); + uint16_t is_non_zero = static_cast(~to_bitmask(is_zero)); return i + trailing_zeroes(is_non_zero); } } @@ -11502,7 +8225,7 @@ ada_really_inline size_t find_next_host_delimiter_special( uint8x16_t classify = vandq_u8(lowpart, highpart); if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) { uint8x16_t is_zero = vceqq_u8(classify, zero); - uint16_t is_non_zero = ~to_bitmask(is_zero); + uint16_t is_non_zero = static_cast(~to_bitmask(is_zero)); return view.length() - 16 + trailing_zeroes(is_non_zero); } } @@ -11778,7 +8501,7 @@ ada_really_inline size_t find_next_host_delimiter(std::string_view view, uint8x16_t classify = vandq_u8(lowpart, highpart); if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) { uint8x16_t is_zero = vceqq_u8(classify, zero); - uint16_t is_non_zero = ~to_bitmask(is_zero); + uint16_t is_non_zero = static_cast(~to_bitmask(is_zero)); return i + trailing_zeroes(is_non_zero); } } @@ -11791,7 +8514,7 @@ ada_really_inline size_t find_next_host_delimiter(std::string_view view, uint8x16_t classify = vandq_u8(lowpart, highpart); if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) { uint8x16_t is_zero = vceqq_u8(classify, zero); - uint16_t is_non_zero = ~to_bitmask(is_zero); + uint16_t is_non_zero = static_cast(~to_bitmask(is_zero)); return view.length() - 16 + trailing_zeroes(is_non_zero); } } @@ -12262,10 +8985,205 @@ ada_warn_unused std::string to_string(ada::state state) { } // namespace ada /* end file src/helpers.cpp */ /* begin file src/url.cpp */ +/* begin file include/ada/url_ip-inl.h */ +/** + * @file url_ip-inl.h + * @brief Shared IPv4/IPv6 parsing helpers used by url and url_aggregator. + * + * Not part of the public API. Defined inline so the single-TU amalgamation + * (ada.cpp) can include them from multiple translation-unit sources once. + */ +#ifndef ADA_URL_IP_INL_H +#define ADA_URL_IP_INL_H + + +#include +#include + +#if defined(ADA_AVX512) +#include +#endif + +namespace ada::detail { + +// 256-entry: 0xff = not hex, else nibble value. +inline constexpr std::array make_hex_nibble_table() noexcept { + std::array t{}; + for (size_t i = 0; i < 256; ++i) { + t[i] = 0xff; + } + for (size_t d = 0; d < 10; ++d) { + t[size_t{'0'} + d] = static_cast(d); + } + for (size_t d = 0; d < 6; ++d) { + t[size_t{'a'} + d] = static_cast(10 + d); + t[size_t{'A'} + d] = static_cast(10 + d); + } + return t; +} + +inline constexpr auto hex_nibble = make_hex_nibble_table(); + +inline bool parse_ipv4_number(const char*& p, const char* end, uint64_t& value, + bool& is_pure_decimal) noexcept { + is_pure_decimal = false; + if (p >= end) [[unlikely]] { + return false; + } + if (end - p >= 2 && p[0] == '0' && ((p[1] | 0x20) == 'x')) { + p += 2; + if (p == end || *p == '.') { + value = 0; + return true; + } + uint64_t v = 0; + int digits = 0; + while (p < end && *p != '.') { + const uint8_t nib = hex_nibble[static_cast(*p)]; + if (nib == 0xff) [[unlikely]] { + return false; + } + if (v > (0xFFFFFFFFULL >> 4)) [[unlikely]] { + return false; + } + v = (v << 4) | nib; + ++p; + ++digits; + } + if (digits == 0) [[unlikely]] { + return false; + } + value = v; + return true; + } + if (end - p >= 2 && p[0] == '0' && p[1] >= '0' && p[1] <= '9') { + ++p; + uint64_t v = 0; + while (p < end && *p != '.') { + const char c = *p; + if (c < '0' || c > '7') [[unlikely]] { + return false; + } + if (v > (0xFFFFFFFFULL >> 3)) [[unlikely]] { + return false; + } + v = (v << 3) | static_cast(c - '0'); + ++p; + } + value = v; + return true; + } + if (*p < '0' || *p > '9') [[unlikely]] { + return false; + } + is_pure_decimal = true; + uint64_t v = static_cast(*p - '0'); + ++p; + while (p < end && *p != '.') { + const char c = *p; + if (c < '0' || c > '9') [[unlikely]] { + return false; + } + if (v > 429496729ULL) [[unlikely]] { + return false; + } + v = v * 10u + static_cast(c - '0'); + if (v > 0xFFFFFFFFULL) [[unlikely]] { + return false; + } + ++p; + } + value = v; + return true; +} + +// Parse up to 4 hex digits. Returns digit count (0 if none). +inline int parse_hex_piece(const char*& pointer, const char* end, + uint16_t& value) noexcept { + if (pointer == end) { + return 0; + } + const uint8_t n0 = hex_nibble[static_cast(*pointer)]; + if (n0 == 0xff) { + return 0; + } + uint32_t v = n0; + ++pointer; + int length = 1; + if (pointer != end) { + const uint8_t n1 = hex_nibble[static_cast(*pointer)]; + if (n1 != 0xff) { + v = (v << 4) | n1; + ++pointer; + ++length; + if (pointer != end) { + const uint8_t n2 = hex_nibble[static_cast(*pointer)]; + if (n2 != 0xff) { + v = (v << 4) | n2; + ++pointer; + ++length; + if (pointer != end) { + const uint8_t n3 = hex_nibble[static_cast(*pointer)]; + if (n3 != 0xff) { + v = (v << 4) | n3; + ++pointer; + ++length; + } + } + } + } + } + } + value = static_cast(v); + return length; +} + +#if defined(ADA_AVX512) +// Classify an IPv6 host (no brackets) with one masked 512-bit load. +// Returns false if the colon/dot shape is impossible (e.g. two "::", >8 +// colons, full form without 7 colons). Used as a cheap prefilter before the +// full WHATWG piece parser. +ada_really_inline bool ipv6_structure_plausible(const char* data, + size_t len) noexcept { + if (len < 2 || len > 45) { + return false; + } + const __mmask64 live = static_cast<__mmask64>((1ULL << len) - 1ULL); + const __m512i input = + _mm512_maskz_loadu_epi8(live, reinterpret_cast(data)); + const __mmask64 is_colon = + _mm512_mask_cmpeq_epi8_mask(live, input, _mm512_set1_epi8(':')); + const __mmask64 is_dot = + _mm512_mask_cmpeq_epi8_mask(live, input, _mm512_set1_epi8('.')); + const int colons = + static_cast(_mm_popcnt_u64(static_cast(is_colon))); + if (colons > 8) { + return false; + } + const uint64_t doubles = + static_cast(is_colon) & (static_cast(is_colon) << 1); + if (doubles != 0 && (doubles & (doubles - 1)) != 0) { + return false; // more than one "::" (or ":::...") + } + const bool has_double = doubles != 0; + const bool has_dot = is_dot != 0; + if (!has_double && !has_dot && colons != 7) { + return false; + } + return true; +} +#endif // ADA_AVX512 + +} // namespace ada::detail + +#endif // ADA_URL_IP_INL_H +/* end file include/ada/url_ip-inl.h */ -#include #include +#include +#include #include +#include #include #include #include @@ -12287,303 +9205,197 @@ bool url::parse_opaque_host(std::string_view input) { bool url::parse_ipv4(std::string_view input) { ada_log("parse_ipv4 ", input, " [", input.size(), " bytes]"); + if (input.empty()) { + return is_valid = false; + } + std::string_view original_input = input; + if (original_input.back() == '.') { + original_input.remove_suffix(1); + } if (input.back() == '.') { input.remove_suffix(1); + if (input.empty()) { + return is_valid = false; + } } - size_t digit_count{0}; - int pure_decimal_count = 0; // entries that are decimal - std::string_view original_input = - input; // we might use this if pure_decimal_count == 4. - uint64_t ipv4{0}; - // we could unroll for better performance? - for (; (digit_count < 4) && !(input.empty()); digit_count++) { - uint32_t - segment_result{}; // If any number exceeds 32 bits, we have an error. - bool is_hex = checkers::has_hex_prefix(input); - if (is_hex && ((input.length() == 2) || - ((input.length() > 2) && (input[2] == '.')))) { - // special case - segment_result = 0; - input.remove_prefix(2); - } else { - std::from_chars_result r{}; - if (is_hex) { - r = std::from_chars(input.data() + 2, input.data() + input.size(), - segment_result, 16); - } else if ((input.length() >= 2) && input[0] == '0' && - checkers::is_digit(input[1])) { - r = std::from_chars(input.data() + 1, input.data() + input.size(), - segment_result, 8); - } else { - pure_decimal_count++; - r = std::from_chars(input.data(), input.data() + input.size(), - segment_result, 10); - } - if (r.ec != std::errc()) { - return is_valid = false; - } - input.remove_prefix(r.ptr - input.data()); + + const uint64_t fast = checkers::try_parse_ipv4_fast(input); + if (fast < checkers::ipv4_fast_fail) [[likely]] { + host = original_input; + host_type = IPV4; + return true; + } + + const char* p = input.data(); + const char* end = p + input.size(); + uint64_t ipv4 = 0; + int digit_count = 0; + int pure_decimal_count = 0; + + for (; digit_count < 4 && p < end; ++digit_count) { + uint64_t segment = 0; + bool pure = false; + if (!detail::parse_ipv4_number(p, end, segment, pure)) { + return is_valid = false; } - if (input.empty()) { - // We have the last value. - // At this stage, ipv4 contains digit_count*8 bits. - // So we have 32-digit_count*8 bits left. - if (segment_result >= (uint64_t(1) << (32 - digit_count * 8))) { - return is_valid = false; - } - ipv4 <<= (32 - digit_count * 8); - ipv4 |= segment_result; - goto final; - } else { - // There is more, so that the value must no be larger than 255 - // and we must have a '.'. - if ((segment_result > 255) || (input[0] != '.')) { + if (pure) { + ++pure_decimal_count; + } + if (p >= end) { + const unsigned shift = static_cast(32 - digit_count * 8); + if (segment >= (uint64_t{1} << shift)) { return is_valid = false; } - ipv4 <<= 8; - ipv4 |= segment_result; - input.remove_prefix(1); // remove '.' + ipv4 = (ipv4 << shift) | segment; + host = (pure_decimal_count == 4) ? std::string(original_input) + : ada::serializers::ipv4(ipv4); + host_type = IPV4; + return true; + } + if (segment > 255 || *p != '.') { + return is_valid = false; } + ipv4 = (ipv4 << 8) | segment; + ++p; } - if ((digit_count != 4) || (!input.empty())) { + if (digit_count != 4 || p != end) { return is_valid = false; } -final: - // We could also check r.ptr to see where the parsing ended. - if (pure_decimal_count == 4) { - host = original_input; // The original input was already all decimal and we - // validated it. - } else { - host = ada::serializers::ipv4(ipv4); // We have to reserialize the address. - } + host = (pure_decimal_count == 4) ? std::string(original_input) + : ada::serializers::ipv4(ipv4); host_type = IPV4; return true; } bool url::parse_ipv6(std::string_view input) { ada_log("parse_ipv6 ", input, " [", input.size(), " bytes]"); - - if (input.empty()) { + if (input.empty() || input.size() > 45) [[unlikely]] { return is_valid = false; } - // Let address be a new IPv6 address whose IPv6 pieces are all 0. - std::array address{}; +#if defined(ADA_AVX512) + // One masked load classifies colon/dot shape; rejects impossible inputs + // before the piece parser (free on AVX-512BW+VL builds). + if (!detail::ipv6_structure_plausible(input.data(), input.size())) + [[unlikely]] { + return is_valid = false; + } +#endif - // Let pieceIndex be 0. + std::array address{}; + const char* pointer = input.data(); + const char* const end = pointer + input.size(); int piece_index = 0; + int compress = -1; - // Let compress be null. - std::optional compress{}; - - // Let pointer be a pointer for input. - std::string_view::iterator pointer = input.begin(); - - // If c is U+003A (:), then: - if (input[0] == ':') { - // If remaining does not start with U+003A (:), validation error, return - // failure. - if (input.size() == 1 || input[1] != ':') { - ada_log("parse_ipv6 starts with : but the rest does not start with :"); + if (*pointer == ':') { + if (input.size() == 1 || pointer[1] != ':') [[unlikely]] { return is_valid = false; } - - // Increase pointer by 2. pointer += 2; - - // Increase pieceIndex by 1 and then set compress to pieceIndex. compress = ++piece_index; } - // While c is not the EOF code point: - while (pointer != input.end()) { - // If pieceIndex is 8, validation error, return failure. - if (piece_index == 8) { - ada_log("parse_ipv6 piece_index == 8"); + while (pointer != end) { + if (piece_index == 8) [[unlikely]] { return is_valid = false; } - - // If c is U+003A (:), then: if (*pointer == ':') { - // If compress is non-null, validation error, return failure. - if (compress.has_value()) { - ada_log("parse_ipv6 compress is non-null"); + if (compress != -1) [[unlikely]] { return is_valid = false; } - - // Increase pointer and pieceIndex by 1, set compress to pieceIndex, and - // then continue. - pointer++; + ++pointer; compress = ++piece_index; continue; } - // Let value and length be 0. - uint16_t value = 0, length = 0; + uint16_t value = 0; + const int length = detail::parse_hex_piece(pointer, end, value); - // While length is less than 4 and c is an ASCII hex digit, - // set value to value times 0x10 + c interpreted as hexadecimal number, and - // increase pointer and length by 1. - while (length < 4 && pointer != input.end() && - unicode::is_ascii_hex_digit(*pointer)) { - // https://stackoverflow.com/questions/39060852/why-does-the-addition-of-two-shorts-return-an-int - value = uint16_t(value * 0x10 + unicode::convert_hex_to_binary(*pointer)); - pointer++; - length++; - } - - // If c is U+002E (.), then: - if (pointer != input.end() && *pointer == '.') { - // If length is 0, validation error, return failure. - if (length == 0) { - ada_log("parse_ipv6 length is 0"); + if (pointer != end && *pointer == '.') { + if (length == 0) [[unlikely]] { return is_valid = false; } - - // Decrease pointer by length. pointer -= length; - - // If pieceIndex is greater than 6, validation error, return failure. - if (piece_index > 6) { - ada_log("parse_ipv6 piece_index > 6"); + if (piece_index > 6) [[unlikely]] { return is_valid = false; } - // Let numbersSeen be 0. int numbers_seen = 0; - - // While c is not the EOF code point: - while (pointer != input.end()) { - // Let ipv4Piece be null. - std::optional ipv4_piece{}; - - // If numbersSeen is greater than 0, then: + while (pointer != end) { + int ipv4_piece = -1; if (numbers_seen > 0) { - // If c is a U+002E (.) and numbersSeen is less than 4, then increase - // pointer by 1. if (*pointer == '.' && numbers_seen < 4) { - pointer++; - } - // Otherwise, validation error, return failure. - else { - ada_log("parse_ipv6 Otherwise, validation error, return failure"); + ++pointer; + } else { return is_valid = false; } } - - // If c is not an ASCII digit, validation error, return failure. - if (pointer == input.end() || !checkers::is_digit(*pointer)) { - ada_log( - "parse_ipv6 If c is not an ASCII digit, validation error, return " - "failure"); + if (pointer == end || *pointer < '0' || *pointer > '9') [[unlikely]] { return is_valid = false; } - - // While c is an ASCII digit: - while (pointer != input.end() && checkers::is_digit(*pointer)) { - // Let number be c interpreted as decimal number. - int number = *pointer - '0'; - - // If ipv4Piece is null, then set ipv4Piece to number. - if (!ipv4_piece.has_value()) { - ipv4_piece = number; - } - // Otherwise, if ipv4Piece is 0, validation error, return failure. - else if (ipv4_piece == 0) { - ada_log("parse_ipv6 if ipv4Piece is 0, validation error"); + ipv4_piece = *pointer - '0'; + ++pointer; + if (pointer != end && *pointer >= '0' && *pointer <= '9') { + if (ipv4_piece == 0) [[unlikely]] { return is_valid = false; } - // Otherwise, set ipv4Piece to ipv4Piece times 10 + number. - else { - ipv4_piece = *ipv4_piece * 10 + number; - } - - // If ipv4Piece is greater than 255, validation error, return failure. - if (ipv4_piece > 255) { - ada_log("parse_ipv6 ipv4_piece > 255"); - return is_valid = false; + ipv4_piece = ipv4_piece * 10 + (*pointer - '0'); + ++pointer; + if (pointer != end && *pointer >= '0' && *pointer <= '9') { + ipv4_piece = ipv4_piece * 10 + (*pointer - '0'); + ++pointer; + if (ipv4_piece > 255) [[unlikely]] { + return is_valid = false; + } } - - // Increase pointer by 1. - pointer++; } - - // Set address[pieceIndex] to address[pieceIndex] times 0x100 + - // ipv4Piece. - // https://stackoverflow.com/questions/39060852/why-does-the-addition-of-two-shorts-return-an-int - address[piece_index] = - uint16_t(address[piece_index] * 0x100 + *ipv4_piece); - - // Increase numbersSeen by 1. - numbers_seen++; - - // If numbersSeen is 2 or 4, then increase pieceIndex by 1. + address[static_cast(piece_index)] = static_cast( + address[static_cast(piece_index)] * 0x100 + + static_cast(ipv4_piece)); + ++numbers_seen; if (numbers_seen == 2 || numbers_seen == 4) { - piece_index++; + ++piece_index; } } - - // If numbersSeen is not 4, validation error, return failure. - if (numbers_seen != 4) { + if (numbers_seen != 4) [[unlikely]] { return is_valid = false; } - - // Break. break; } - // Otherwise, if c is U+003A (:): - else if ((pointer != input.end()) && (*pointer == ':')) { - // Increase pointer by 1. - pointer++; - // If c is the EOF code point, validation error, return failure. - if (pointer == input.end()) { - ada_log( - "parse_ipv6 If c is the EOF code point, validation error, return " - "failure"); + if (length == 0) [[unlikely]] { + return is_valid = false; + } + + if (pointer != end && *pointer == ':') { + ++pointer; + if (pointer == end) [[unlikely]] { return is_valid = false; } - } - // Otherwise, if c is not the EOF code point, validation error, return - // failure. - else if (pointer != input.end()) { - ada_log( - "parse_ipv6 Otherwise, if c is not the EOF code point, validation " - "error, return failure"); + } else if (pointer != end) [[unlikely]] { return is_valid = false; } - // Set address[pieceIndex] to value. - address[piece_index] = value; - - // Increase pieceIndex by 1. - piece_index++; + address[static_cast(piece_index)] = value; + ++piece_index; } - // If compress is non-null, then: - if (compress.has_value()) { - // Let swaps be pieceIndex - compress. - int swaps = piece_index - *compress; - - // Set pieceIndex to 7. - piece_index = 7; - - // While pieceIndex is not 0 and swaps is greater than 0, - // swap address[pieceIndex] with address[compress + swaps - 1], and then - // decrease both pieceIndex and swaps by 1. - while (piece_index != 0 && swaps > 0) { - std::swap(address[piece_index], address[*compress + swaps - 1]); - piece_index--; - swaps--; + if (compress != -1) { + const int right = piece_index - compress; + if (right > 0) { + const size_t dest = static_cast(8 - right); + const size_t src = static_cast(compress); + if (dest != src) { + for (size_t i = static_cast(right); i-- > 0;) { + address[dest + i] = address[src + i]; + address[src + i] = 0; + } + } } - } - // Otherwise, if compress is null and pieceIndex is not 8, validation error, - // return failure. - else if (piece_index != 8) { - ada_log( - "parse_ipv6 if compress is null and pieceIndex is not 8, validation " - "error, return failure"); + } else if (piece_index != 8) [[unlikely]] { return is_valid = false; } + host = ada::serializers::ipv6(address); ada_log("parse_ipv6 ", *host); host_type = IPV6; @@ -12616,7 +9428,7 @@ ada_really_inline bool url::parse_scheme(const std::string_view input) { // If url's scheme is "file" and its host is an empty host, then return. // An empty host is the empty string. if (type == ada::scheme::type::FILE && host.has_value() && - host.value().empty()) { + host->empty()) { return false; } } @@ -12644,24 +9456,29 @@ ada_really_inline bool url::parse_scheme(const std::string_view input) { unicode::to_lower_ascii(_buffer.data(), _buffer.size()); if constexpr (has_state_override) { + // The state-override validation errors below ("return" in the WHATWG URL + // parser) leave the URL unchanged. The setter contract is + // "true on success, false if the scheme is invalid" -- the fast path + // above already returns false here, so the slow path must agree. + // If url's scheme is a special scheme and buffer is not a special scheme, // then return. If url's scheme is not a special scheme and buffer is a // special scheme, then return. if (is_special() != ada::scheme::is_special(_buffer)) { - return true; + return false; } // If url includes credentials or has a non-null port, and buffer is // "file", then return. if ((has_credentials() || port.has_value()) && _buffer == "file") { - return true; + return false; } // If url's scheme is "file" and its host is an empty host, then return. // An empty host is the empty string. if (type == ada::scheme::type::FILE && host.has_value() && - host.value().empty()) { - return true; + host->empty()) { + return false; } } @@ -12720,6 +9537,7 @@ ada_really_inline bool url::parse_host(std::string_view input) { host = input; } host_type = IPV4; + is_valid = true; ada_log("parse_host fast path decimal ipv4"); return true; } @@ -12735,7 +9553,8 @@ ada_really_inline bool url::parse_host(std::string_view input) { unicode::to_lower_ascii(buffer.data(), buffer.size()); bool is_forbidden = unicode::contains_forbidden_domain_code_point( buffer.data(), buffer.size()); - if (is_forbidden == 0 && buffer.find("xn-") == std::string_view::npos) { + static constexpr std::string_view xn_dash{"xn-", 3}; + if (is_forbidden == 0 && buffer.find(xn_dash) == std::string_view::npos) { // fast path host = std::move(buffer); @@ -12745,18 +9564,19 @@ ada_really_inline bool url::parse_host(std::string_view input) { return parse_ipv4(host.value()); } ada_log("parse_host fast path ", *host); + is_valid = true; return true; } ada_log("parse_host calling to_ascii"); is_valid = ada::unicode::to_ascii(host, input, input.find('%')); - if (!is_valid) { + if (!is_valid || !host.has_value()) { ada_log("parse_host to_ascii returns false"); return is_valid = false; } ada_log("parse_host to_ascii succeeded ", *host, " [", host->size(), " bytes]"); - if (std::any_of(host.value().begin(), host.value().end(), + if (std::any_of(host->begin(), host->end(), ada::unicode::is_forbidden_domain_code_point)) { host = std::nullopt; return is_valid = false; @@ -12764,9 +9584,9 @@ ada_really_inline bool url::parse_host(std::string_view input) { // If asciiDomain ends in a number, then return the result of IPv4 parsing // asciiDomain. - if (checkers::is_ipv4(host.value())) { + if (checkers::is_ipv4(*host)) { ada_log("parse_host got ipv4 ", *host); - return parse_ipv4(host.value()); + return parse_ipv4(*host); } return true; @@ -12862,7 +9682,7 @@ ada_really_inline void url::parse_path(std::string_view input) { if (!host.has_value()) { return false; } - return checkers::verify_dns_length(host.value()); + return checkers::verify_dns_length(*host); } [[nodiscard]] std::string url::get_origin() const { @@ -12920,8 +9740,7 @@ ada_really_inline void url::parse_path(std::string_view input) { [[nodiscard]] std::string url::get_search() const { // If this's URL's query is either null or the empty string, then return the // empty string. Return U+003F (?), followed by this's URL's query. - return (!query.has_value() || (query.value().empty())) ? "" - : "?" + query.value(); + return (!query.has_value() || (query->empty())) ? "" : "?" + query.value(); } [[nodiscard]] const std::string& url::get_username() const noexcept { @@ -12939,8 +9758,7 @@ ada_really_inline void url::parse_path(std::string_view input) { [[nodiscard]] std::string url::get_hash() const { // If this's URL's fragment is either null or the empty string, then return // the empty string. Return U+0023 (#), followed by this's URL's fragment. - return (!hash.has_value() || (hash.value().empty())) ? "" - : "#" + hash.value(); + return (!hash.has_value() || (hash->empty())) ? "" : "#" + hash.value(); } template @@ -12949,8 +9767,7 @@ bool url::set_host_or_hostname(const std::string_view input) { return false; } - std::optional previous_host = host; - std::optional previous_port = port; + url saved_url(*this); size_t host_end_pos = input.find('#'); std::string _host(input.data(), host_end_pos != std::string_view::npos @@ -12959,6 +9776,14 @@ bool url::set_host_or_hostname(const std::string_view input) { helpers::remove_ascii_tab_or_newline(_host); std::string_view new_host(_host); + auto check_url_size = [&]() -> bool { + if (get_href_size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } + return true; + }; + // If url's scheme is "file", then set state to file host state, instead of // host state. if (type != ada::scheme::type::FILE) { @@ -12986,8 +9811,7 @@ bool url::set_host_or_hostname(const std::string_view input) { // Let host be the result of host parsing buffer with url is not special. bool succeeded = parse_host(buffer); if (!succeeded) { - host = std::move(previous_host); - update_base_port(previous_port); + *this = std::move(saved_url); return false; } @@ -12997,7 +9821,7 @@ bool url::set_host_or_hostname(const std::string_view input) { if (!port_buffer.empty()) { set_port(port_buffer); } - return true; + return check_url_size(); } // Otherwise, if one of the following is true: // - c is the EOF code point, U+002F (/), U+003F (?), or U+0023 (#) @@ -13020,16 +9844,15 @@ bool url::set_host_or_hostname(const std::string_view input) { // special. if (host_view.empty() && !is_special()) { host = ""; - return true; + return check_url_size(); } bool succeeded = parse_host(host_view); if (!succeeded) { - host = std::move(previous_host); - update_base_port(previous_port); + *this = std::move(saved_url); return false; } - return true; + return check_url_size(); } } @@ -13044,8 +9867,7 @@ bool url::set_host_or_hostname(const std::string_view input) { } else { // Let host be the result of host parsing buffer with url is not special. if (!parse_host(new_host)) { - host = std::move(previous_host); - update_base_port(previous_port); + *this = std::move(saved_url); return false; } @@ -13054,7 +9876,7 @@ bool url::set_host_or_hostname(const std::string_view input) { host = ""; } } - return true; + return check_url_size(); } bool url::set_host(const std::string_view input) { @@ -13069,8 +9891,13 @@ bool url::set_username(const std::string_view input) { if (cannot_have_credentials_or_port()) { return false; } + auto previous_username = std::move(username); username = ada::unicode::percent_encode( input, character_sets::USERINFO_PERCENT_ENCODE); + if (get_href_size() > ada::get_max_input_length()) { + username = std::move(previous_username); + return false; + } return true; } @@ -13078,8 +9905,13 @@ bool url::set_password(const std::string_view input) { if (cannot_have_credentials_or_port()) { return false; } + auto previous_password = std::move(password); password = ada::unicode::percent_encode( input, character_sets::USERINFO_PERCENT_ENCODE); + if (get_href_size() > ada::get_max_input_length()) { + password = std::move(previous_password); + return false; + } return true; } @@ -13115,6 +9947,10 @@ bool url::set_port(const std::string_view input) { std::optional previous_port = port; parse_port(digits_to_parse); if (is_valid) { + if (get_href_size() > ada::get_max_input_length()) { + port = std::move(previous_port); + return false; + } return true; } port = std::move(previous_port); @@ -13132,8 +9968,12 @@ void url::set_hash(const std::string_view input) { std::string new_value; new_value = input[0] == '#' ? input.substr(1) : input; helpers::remove_ascii_tab_or_newline(new_value); + auto previous_hash = std::move(hash); hash = unicode::percent_encode(new_value, ada::character_sets::FRAGMENT_PERCENT_ENCODE); + if (get_href_size() > ada::get_max_input_length()) { + hash = std::move(previous_hash); + } } void url::set_search(const std::string_view input) { @@ -13151,15 +9991,24 @@ void url::set_search(const std::string_view input) { is_special() ? ada::character_sets::SPECIAL_QUERY_PERCENT_ENCODE : ada::character_sets::QUERY_PERCENT_ENCODE; + auto previous_query = std::move(query); query = ada::unicode::percent_encode(new_value, query_percent_encode_set); + if (get_href_size() > ada::get_max_input_length()) { + query = std::move(previous_query); + } } bool url::set_pathname(const std::string_view input) { if (has_opaque_path) { return false; } + auto previous_path = std::move(path); path.clear(); parse_path(input); + if (get_href_size() > ada::get_max_input_length()) { + path = std::move(previous_path); + return false; + } return true; } @@ -13181,8 +10030,14 @@ bool url::set_protocol(const std::string_view input) { std::ranges::find_if_not(view, unicode::is_alnum_plus); if (pointer != view.end() && *pointer == ':') { - return parse_scheme( + url saved_url(*this); + bool result = parse_scheme( std::string_view(view.data(), pointer - view.begin())); + if (result && get_href_size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } + return result; } return false; } @@ -13191,6 +10046,11 @@ bool url::set_href(const std::string_view input) { ada::result out = ada::parse(input); if (out) { + // The parser enforces get_max_input_length() on both the input and the + // normalized result. This is a defense-in-depth check. + if (out->get_href_size() > ada::get_max_input_length()) { + return false; + } *this = *out; } @@ -13201,12 +10061,315 @@ bool url::set_href(const std::string_view input) { /* end file src/url.cpp */ /* begin file src/parser.cpp */ +#include +#include #include #include namespace ada::parser { +// 0 = host byte, 1 = host delimiter (/ ? #), 2 = reject +namespace { + +constexpr std::array k_host_class = []() consteval { + std::array t{}; + for (size_t i = 0; i < 256; ++i) { + t[i] = 2; + } + for (size_t i = 0x21; i <= 0x7E; ++i) { + t[i] = 0; + } + for (uint8_t c : + {'#', '/', ':', '<', '>', '?', '@', '[', '\\', ']', '^', '|', '%'}) { + t[c] = 2; + } + t[static_cast('/')] = 1; + t[static_cast('?')] = 1; + t[static_cast('#')] = 1; + return t; +}(); + +// 0 = ok, 1 = ?/#, 2 = reject. Path rejects '%' so "%2e" falls through. +constexpr std::array k_rest = []() consteval { + std::array t{}; + for (size_t i = 0; i < 256; ++i) { + t[i] = 2; + } + for (uint8_t c = 0x21; c <= 0x7E; ++c) { + t[c] = 0; + } + for (uint8_t c : {static_cast('"'), static_cast('<'), + static_cast('>'), static_cast('`'), + static_cast('{'), static_cast('}'), + static_cast('^'), static_cast('\\'), + static_cast('%'), static_cast('\'')}) { + t[c] = 2; + } + t[static_cast('?')] = 1; + t[static_cast('#')] = 1; + return t; +}(); + +} // namespace + +// Fast path for already-normalized absolute http(s) URLs. noinline keeps +// the fallthrough path small (IPv4 microbenches). +template +ada_never_inline bool try_parse_simple_absolute(std::string_view input, + result_type& out) { + constexpr bool is_ada_url = std::is_same_v; + constexpr bool is_aggregator = + std::is_same_v; + static_assert(is_ada_url || is_aggregator); + + const size_t len = input.size(); + if (len < 8) [[unlikely]] { + return false; + } + const auto* b = reinterpret_cast(input.data()); + + size_t pos; + ada::scheme::type scheme_type; + uint32_t protocol_end; + if (b[0] == 'h' && b[1] == 't' && b[2] == 't' && b[3] == 'p') { + if (b[4] == ':' && b[5] == '/' && b[6] == '/') { + pos = 7; + scheme_type = ada::scheme::type::HTTP; + protocol_end = 5; + } else if (len >= 8 && b[4] == 's' && b[5] == ':' && b[6] == '/' && + b[7] == '/') { + pos = 8; + scheme_type = ada::scheme::type::HTTPS; + protocol_end = 6; + } else { + return false; + } + } else { + return false; + } + if (pos < len && (b[pos] == '/' || b[pos] == '\\')) [[unlikely]] { + return false; + } + + // Digit-led hosts are IPv4/numeric; skip before scanning. + if (pos < len && b[pos] >= '0' && b[pos] <= '9') { + return false; + } + + const size_t host_start = pos; + bool has_upper = false; + size_t i = pos; + for (; i < len; ++i) { + const uint8_t c = b[i]; + const uint8_t cls = k_host_class[c]; + if (cls == 1) { + break; + } + if (cls == 2) [[unlikely]] { + return false; + } + if (c >= 'A' && c <= 'Z') { + has_upper = true; + } + } + const size_t host_end = i; + if (host_start == host_end) [[unlikely]] { + return false; + } + const size_t host_len = host_end - host_start; + if (host_len > 253) [[unlikely]] { + return false; + } + { + std::string_view hv(input.data() + host_start, host_len); + char host_buf[256]; + if (has_upper) [[unlikely]] { + std::memcpy(host_buf, input.data() + host_start, host_len); + unicode::to_lower_ascii(host_buf, host_len); + hv = std::string_view(host_buf, host_len); + } + if (checkers::is_ipv4(hv)) [[unlikely]] { + return false; + } + static constexpr std::string_view xn{"xn-", 3}; + if (hv.find(xn) != std::string_view::npos) [[unlikely]] { + return false; + } + } + + size_t path_start = host_end; + size_t path_end = host_end; + size_t query_start = std::string_view::npos; + size_t hash_start = std::string_view::npos; + bool has_path = false; + bool path_has_dot = false; + + if (i < len && b[i] == '/') { + has_path = true; + path_start = i; + ++i; + for (; i < len; ++i) { + const uint8_t c = b[i]; + const uint8_t cls = k_rest[c]; + if (cls == 0) { + path_has_dot |= (c == '.'); + continue; + } + if (cls == 1) { + path_end = i; + if (c == '?') { + query_start = i; + ++i; + goto scan_query; + } + hash_start = i; + ++i; + goto scan_hash; + } + return false; + } + path_end = i; + } else if (i < len && b[i] == '?') { + query_start = i; + ++i; + goto scan_query; + } else if (i < len && b[i] == '#') { + hash_start = i; + ++i; + goto scan_hash; + } + goto after_rest; + +scan_query: + for (; i < len; ++i) { + const uint8_t c = b[i]; + if (c == '#') { + hash_start = i; + ++i; + goto scan_hash; + } + if (c == '?' || c == '%') { + continue; + } + if (k_rest[c] == 2) [[unlikely]] { + return false; + } + } + goto after_rest; + +scan_hash: + for (; i < len; ++i) { + const uint8_t c = b[i]; + if (c == '?' || c == '#' || c == '%') { + continue; + } + if (k_rest[c] == 2) [[unlikely]] { + return false; + } + } + +after_rest: + if (path_has_dot) [[unlikely]] { + const std::string_view path_body(input.data() + path_start, + path_end - path_start); + if (path_body.size() >= 2 && path_body[1] == '.') { + if (path_body.size() == 2 || path_body[2] == '/' || + (path_body.size() >= 3 && path_body[2] == '.' && + (path_body.size() == 3 || path_body[3] == '/'))) { + return false; + } + } + static constexpr std::string_view slash_dot{"/.", 2}; + size_t p = 1; + while ((p = path_body.find(slash_dot, p)) != std::string_view::npos) { + const size_t after = p + 2; + if (after == path_body.size() || path_body[after] == '/' || + (after + 1 <= path_body.size() && path_body[after] == '.' && + (after + 1 == path_body.size() || path_body[after + 1] == '/'))) { + return false; + } + p = after; + } + } + + const bool need_slash = !has_path; + out.type = scheme_type; + out.is_valid = true; + out.has_opaque_path = false; + out.host_type = DEFAULT; + + if constexpr (is_aggregator) { + if (!need_slash) { + out.buffer.resize(len); + // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage) + std::memcpy(out.buffer.data(), input.data(), len); + if (has_upper) { + unicode::to_lower_ascii(out.buffer.data() + host_start, + host_end - host_start); + } + out.components.protocol_end = protocol_end; + out.components.username_end = protocol_end + 2; + out.components.host_start = protocol_end + 2; + out.components.host_end = static_cast(host_end); + out.components.port = url_components::omitted; + out.components.pathname_start = static_cast(path_start); + out.components.search_start = (query_start != std::string_view::npos) + ? static_cast(query_start) + : url_components::omitted; + out.components.hash_start = (hash_start != std::string_view::npos) + ? static_cast(hash_start) + : url_components::omitted; + } else { + out.buffer.resize(len + 1); + // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage) + std::memcpy(out.buffer.data(), input.data(), host_end); + out.buffer[host_end] = '/'; + if (host_end < len) { + std::memcpy(out.buffer.data() + host_end + 1, input.data() + host_end, + len - host_end); + } + if (has_upper) { + unicode::to_lower_ascii(out.buffer.data() + host_start, + host_end - host_start); + } + out.components.protocol_end = protocol_end; + out.components.username_end = protocol_end + 2; + out.components.host_start = protocol_end + 2; + out.components.host_end = static_cast(host_end); + out.components.port = url_components::omitted; + out.components.pathname_start = static_cast(host_end); + out.components.search_start = (query_start != std::string_view::npos) + ? static_cast(query_start + 1) + : url_components::omitted; + out.components.hash_start = (hash_start != std::string_view::npos) + ? static_cast(hash_start + 1) + : url_components::omitted; + } + } else { + std::string host_str(input.substr(host_start, host_end - host_start)); + if (has_upper) { + unicode::to_lower_ascii(host_str.data(), host_str.size()); + } + out.host = std::move(host_str); + if (need_slash) { + out.path = "/"; + } else { + out.path.assign(input.data() + path_start, path_end - path_start); + } + if (query_start != std::string_view::npos) { + const size_t q_end = + (hash_start != std::string_view::npos) ? hash_start : len; + out.query.emplace(input.data() + query_start + 1, + q_end - query_start - 1); + } + if (hash_start != std::string_view::npos) { + out.hash.emplace(input.data() + hash_start + 1, len - hash_start - 1); + } + } + return true; +} + template result_type parse_url_impl(std::string_view user_input, const result_type* base_url) { @@ -13229,9 +10392,12 @@ result_type parse_url_impl(std::string_view user_input, state state = state::SCHEME_START; result_type url{}; - // We refuse to parse URL strings that exceed 4GB. Such strings are almost - // surely the result of a bug or are otherwise a security concern. - if (user_input.size() > std::numeric_limits::max()) [[unlikely]] { + const uint32_t max_input_length = ada::get_max_input_length(); + + // We refuse to parse URL strings that exceed the maximum input length. + // By default, this is 4GB but can be configured via + // ada::set_max_input_length(). + if (user_input.size() > max_input_length) [[unlikely]] { url.is_valid = false; } // Going forward, user_input.size() is in [0, @@ -13243,6 +10409,48 @@ result_type parse_url_impl(std::string_view user_input, if (!url.is_valid) { return url; } + + // Simple absolute http(s) fast path (before tabs/newline scan). + // Skip digit-led hosts (IPv4) with a cheap peek. + if constexpr (store_values) { + if (base_url == nullptr) { + const auto* p = reinterpret_cast(user_input.data()); + const size_t n = user_input.size(); + const bool digit_led_host = (n >= 8 && p[4] == ':' && p[5] == '/' && + p[6] == '/' && p[7] >= '0' && p[7] <= '9') || + (n >= 9 && p[5] == ':' && p[6] == '/' && + p[7] == '/' && p[8] >= '0' && p[8] <= '9'); + if (!digit_led_host && try_parse_simple_absolute(user_input, url)) { + if constexpr (result_type_is_ada_url_aggregator) { + if (url.buffer.size() > max_input_length) [[unlikely]] { + url.is_valid = false; + } + } else { + if (url.get_href_size() > max_input_length) [[unlikely]] { + url.is_valid = false; + } + } + return url; + } + } + } + + std::string tmp_buffer; + std::string_view url_data; + if (unicode::has_tabs_or_newline(user_input)) [[unlikely]] { + tmp_buffer = user_input; + // Optimization opportunity: Instead of copying and then pruning, we could + // just directly build the string from user_input. + helpers::remove_ascii_tab_or_newline(tmp_buffer); + url_data = tmp_buffer; + } else [[likely]] { + url_data = user_input; + } + + // Leading and trailing control characters are uncommon and easy to deal with + // (no performance concern). + helpers::trim_c0_whitespace(url_data); + if constexpr (result_type_is_ada_url_aggregator && store_values) { // Most of the time, we just need user_input.size(). // In some instances, we may need a bit more. @@ -13258,25 +10466,10 @@ result_type parse_url_impl(std::string_view user_input, uint32_t reserve_capacity = (0xFFFFFFFF >> helpers::leading_zeroes(uint32_t(1 | user_input.size()))) + - 1; - url.reserve(reserve_capacity); - } - std::string tmp_buffer; - std::string_view url_data; - if (unicode::has_tabs_or_newline(user_input)) [[unlikely]] { - tmp_buffer = user_input; - // Optimization opportunity: Instead of copying and then pruning, we could - // just directly build the string from user_input. - helpers::remove_ascii_tab_or_newline(tmp_buffer); - url_data = tmp_buffer; - } else [[likely]] { - url_data = user_input; + 1; + url.reserve(reserve_capacity); } - // Leading and trailing control characters are uncommon and easy to deal with - // (no performance concern). - helpers::trim_c0_whitespace(url_data); - // Optimization opportunity. Most websites do not have fragment. std::optional fragment = helpers::prune_hash(url_data); // We add it last so that an implementation like ada::url_aggregator @@ -13339,6 +10532,7 @@ result_type parse_url_impl(std::string_view user_input, ada_log("SCHEME the scheme is ", url.get_protocol()); // If url's scheme is "file", then: + // NOLINTNEXTLINE(bugprone-branch-clone) if (url.type == scheme::type::FILE) { // Set state to file state. state = state::FILE; @@ -13382,10 +10576,14 @@ result_type parse_url_impl(std::string_view user_input, } case state::NO_SCHEME: { ada_log("NO_SCHEME ", helpers::substring(url_data, input_position)); + // The fragment was pruned from url_data before the state machine ran, + // so 'c is U+0023 (#)' holds exactly when a fragment was found and + // nothing else remains in front of it. + const bool c_is_hash = + fragment.has_value() && input_position == input_size; // If base is null, or base has an opaque path and c is not U+0023 (#), // validation error, return failure. - if (base_url == nullptr || - (base_url->has_opaque_path && !fragment.has_value())) { + if (base_url == nullptr || (base_url->has_opaque_path && !c_is_hash)) { ada_log("NO_SCHEME validation error"); url.is_valid = false; return url; @@ -13393,8 +10591,7 @@ result_type parse_url_impl(std::string_view user_input, // Otherwise, if base has an opaque path and c is U+0023 (#), // set url's scheme to base's scheme, url's path to base's path, url's // query to base's query, and set state to fragment state. - else if (base_url->has_opaque_path && fragment.has_value() && - input_position == input_size) { + else if (base_url->has_opaque_path && c_is_hash) { ada_log("NO_SCHEME opaque base with fragment"); url.copy_scheme(*base_url); url.has_opaque_path = base_url->has_opaque_path; @@ -13417,6 +10614,7 @@ result_type parse_url_impl(std::string_view user_input, } // Otherwise, if base's scheme is not "file", set state to relative // state and decrease pointer by 1. + // NOLINTNEXTLINE(bugprone-branch-clone) else if (base_url->type != scheme::type::FILE) { ada_log("NO_SCHEME non-file relative path"); state = state::RELATIVE_SCHEME; @@ -13677,6 +10875,7 @@ result_type parse_url_impl(std::string_view user_input, helpers::substring(url_data, input_position)); // If url is special and c is U+002F (/) or U+005C (\), then: + // NOLINTNEXTLINE(bugprone-branch-clone) if (url.is_special() && (input_position != input_size) && (url_data[input_position] == '/' || url_data[input_position] == '\\')) { @@ -13818,6 +11017,17 @@ result_type parse_url_impl(std::string_view user_input, } case state::OPAQUE_PATH: { ada_log("OPAQUE_PATH ", helpers::substring(url_data, input_position)); + // Opaque path, query, and fragment are structurally always valid: + // the parser would just percent-encode whatever is there. When we + // are not storing values (can_parse), we can return immediately. + // We must set has_opaque_path = true before returning so that when + // this URL is used as an internal base inside can_parse, NO_SCHEME + // correctly rejects relative inputs against an opaque-path base + // (e.g. can_parse("", &"W:") must return false). + if constexpr (!store_values) { + url.has_opaque_path = true; + return url; + } std::string_view view = url_data.substr(input_position); // If c is U+003F (?), then set url's query to the empty string and // state to query state. @@ -13856,6 +11066,13 @@ result_type parse_url_impl(std::string_view user_input, } case state::PATH_START: { ada_log("PATH_START ", helpers::substring(url_data, input_position)); + // Path, query, and fragment are structurally always valid: the + // parser would just percent-encode whatever is there. When we are + // not storing values (can_parse), we can return immediately since + // no subsequent state can invalidate the URL. + if constexpr (!store_values) { + return url; + } // If url is special, then: if (url.is_special()) { @@ -13903,6 +11120,13 @@ result_type parse_url_impl(std::string_view user_input, } case state::PATH: { ada_log("PATH ", helpers::substring(url_data, input_position)); + // Path, query, and fragment are structurally always valid: the + // parser would just percent-encode whatever is there. When we are + // not storing values (can_parse), we can return immediately since + // no subsequent state can invalidate the URL. + if constexpr (!store_values) { + return url; + } std::string_view view = url_data.substr(input_position); // Most time, we do not need percent encoding. @@ -13986,9 +11210,8 @@ result_type parse_url_impl(std::string_view user_input, std::string_view view = url_data.substr(input_position); size_t location = view.find_first_of("/\\?"); - std::string_view file_host_buffer( - view.data(), - (location != std::string_view::npos) ? location : view.size()); + std::string_view file_host_buffer = view.substr( + 0, (location != std::string_view::npos) ? location : view.size()); if (checkers::is_windows_drive_letter(file_host_buffer)) { state = state::PATH; @@ -14120,12 +11343,30 @@ result_type parse_url_impl(std::string_view user_input, url.update_unencoded_base_hash(*fragment); } } + // Check the resulting (normalized) URL size against the maximum input length. + // Normalization (percent-encoding, IDNA, etc.) can expand the URL beyond the + // original input size. + if constexpr (store_values) { + if (url.is_valid) { + if constexpr (result_type_is_ada_url_aggregator) { + if (url.buffer.size() > max_input_length) { + url.is_valid = false; + } + } else { + if (url.get_href_size() > max_input_length) { + url.is_valid = false; + } + } + } + } return url; } -template url parse_url_impl(std::string_view user_input, - const url* base_url = nullptr); -template url_aggregator parse_url_impl( +template url parse_url_impl(std::string_view user_input, + const url* base_url = nullptr); +template url_aggregator parse_url_impl( + std::string_view user_input, const url_aggregator* base_url = nullptr); +template url_aggregator parse_url_impl( std::string_view user_input, const url_aggregator* base_url = nullptr); template @@ -14192,11 +11433,32 @@ namespace ada { /* end file src/url_components.cpp */ /* begin file src/url_aggregator.cpp */ +#include +#include +#include #include #include #include #include +namespace { + +ada_really_inline void apply_shifted_non_scheme_offsets( + ada::url_components& components, uint32_t new_difference) { + components.username_end += new_difference; + components.host_start += new_difference; + components.host_end += new_difference; + components.pathname_start += new_difference; + if (components.search_start != ada::url_components::omitted) { + components.search_start += new_difference; + } + if (components.hash_start != ada::url_components::omitted) { + components.hash_start += new_difference; + } +} + +} // namespace + namespace ada { template [[nodiscard]] ada_really_inline bool url_aggregator::parse_scheme_with_colon( @@ -14242,10 +11504,12 @@ template // This is uncommon. uint16_t urls_scheme_port = get_special_port(); - // If url's port is url's scheme's default port, then set url's port to - // null. - if (components.port == urls_scheme_port) { - clear_port(); + if (urls_scheme_port) { + // If url's port is url's scheme's default port, then set url's port to + // null. + if (components.port == urls_scheme_port) { + clear_port(); + } } } } else { // slow path @@ -14256,25 +11520,30 @@ template unicode::to_lower_ascii(_buffer.data(), _buffer.size()); if constexpr (has_state_override) { + // The state-override validation errors below ("return" in the WHATWG URL + // parser) leave the URL unchanged. The setter contract is + // "true on success, false if the scheme is invalid" -- the fast path + // above already returns false here, so the slow path must agree. + // If url's scheme is a special scheme and buffer is not a special scheme, // then return. If url's scheme is not a special scheme and buffer is a // special scheme, then return. if (is_special() != ada::scheme::is_special(_buffer)) { - return true; + return false; } // If url includes credentials or has a non-null port, and buffer is // "file", then return. if ((has_credentials() || components.port != url_components::omitted) && _buffer == "file") { - return true; + return false; } // If url's scheme is "file" and its host is an empty host, then return. // An empty host is the empty string. if (type == ada::scheme::type::FILE && components.host_start == components.host_end) { - return true; + return false; } } @@ -14284,10 +11553,12 @@ template // This is uncommon. uint16_t urls_scheme_port = get_special_port(); - // If url's port is url's scheme's default port, then set url's port to - // null. - if (components.port == urls_scheme_port) { - clear_port(); + if (urls_scheme_port) { + // If url's port is url's scheme's default port, then set url's port to + // null. + if (components.port == urls_scheme_port) { + clear_port(); + } } } } @@ -14301,6 +11572,7 @@ inline void url_aggregator::copy_scheme(const url_aggregator& u) { // next line could overflow but unsigned arithmetic has well-defined // overflows. uint32_t new_difference = u.components.protocol_end - components.protocol_end; + type = u.type; buffer.erase(0, components.protocol_end); buffer.insert(0, u.get_protocol()); @@ -14311,17 +11583,7 @@ inline void url_aggregator::copy_scheme(const url_aggregator& u) { return; } - // Update the rest of the components. - components.username_end += new_difference; - components.host_start += new_difference; - components.host_end += new_difference; - components.pathname_start += new_difference; - if (components.search_start != url_components::omitted) { - components.search_start += new_difference; - } - if (components.hash_start != url_components::omitted) { - components.hash_start += new_difference; - } + apply_shifted_non_scheme_offsets(components, new_difference); ADA_ASSERT_TRUE(validate()); } @@ -14345,17 +11607,7 @@ inline void url_aggregator::set_scheme_from_view_with_colon( } components.protocol_end += new_difference; - // Update the rest of the components. - components.username_end += new_difference; - components.host_start += new_difference; - components.host_end += new_difference; - components.pathname_start += new_difference; - if (components.search_start != url_components::omitted) { - components.search_start += new_difference; - } - if (components.hash_start != url_components::omitted) { - components.hash_start += new_difference; - } + apply_shifted_non_scheme_offsets(components, new_difference); ADA_ASSERT_TRUE(validate()); } @@ -14377,17 +11629,7 @@ inline void url_aggregator::set_scheme(std::string_view new_scheme) { } components.protocol_end = uint32_t(new_scheme.size() + 1); - // Update the rest of the components. - components.username_end += new_difference; - components.host_start += new_difference; - components.host_end += new_difference; - components.pathname_start += new_difference; - if (components.search_start != url_components::omitted) { - components.search_start += new_difference; - } - if (components.hash_start != url_components::omitted) { - components.hash_start += new_difference; - } + apply_shifted_non_scheme_offsets(components, new_difference); ADA_ASSERT_TRUE(validate()); } @@ -14412,8 +11654,14 @@ bool url_aggregator::set_protocol(const std::string_view input) { std::ranges::find_if_not(view, unicode::is_alnum_plus); if (pointer != view.end() && *pointer == ':') { - return parse_scheme_with_colon( + url_aggregator saved_url(*this); + bool result = parse_scheme_with_colon( view.substr(0, pointer - view.begin() + 1)); + if (result && buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } + return result; } return false; } @@ -14425,6 +11673,7 @@ bool url_aggregator::set_username(const std::string_view input) { if (cannot_have_credentials_or_port()) { return false; } + url_aggregator saved_url(*this); size_t idx = ada::unicode::percent_encode_index( input, character_sets::USERINFO_PERCENT_ENCODE); if (idx == input.size()) { @@ -14434,6 +11683,10 @@ bool url_aggregator::set_username(const std::string_view input) { update_base_username(ada::unicode::percent_encode( input, character_sets::USERINFO_PERCENT_ENCODE, idx)); } + if (buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } ADA_ASSERT_TRUE(validate()); return true; } @@ -14445,6 +11698,7 @@ bool url_aggregator::set_password(const std::string_view input) { if (cannot_have_credentials_or_port()) { return false; } + url_aggregator saved_url(*this); size_t idx = ada::unicode::percent_encode_index( input, character_sets::USERINFO_PERCENT_ENCODE); if (idx == input.size()) { @@ -14454,6 +11708,10 @@ bool url_aggregator::set_password(const std::string_view input) { update_base_password(ada::unicode::percent_encode( input, character_sets::USERINFO_PERCENT_ENCODE, idx)); } + if (buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } ADA_ASSERT_TRUE(validate()); return true; } @@ -14490,12 +11748,16 @@ bool url_aggregator::set_port(const std::string_view input) { std::string_view(trimmed.data(), first_non_digit - trimmed.begin()); // Revert changes if parse_port fails. - uint32_t previous_port = components.port; + url_aggregator saved_url(*this); parse_port(digits_to_parse); if (is_valid) { + if (buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } return true; } - update_base_port(previous_port); + *this = std::move(saved_url); is_valid = true; ADA_ASSERT_TRUE(validate()); return false; @@ -14508,6 +11770,7 @@ bool url_aggregator::set_pathname(const std::string_view input) { if (has_opaque_path) { return false; } + url_aggregator saved_url(*this); clear_pathname(); parse_path(input); if (get_pathname().starts_with("//") && !has_authority() && !has_dash_dot()) { @@ -14520,6 +11783,10 @@ bool url_aggregator::set_pathname(const std::string_view input) { components.hash_start += 2; } } + if (buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } ADA_ASSERT_TRUE(validate()); return true; } @@ -14583,7 +11850,12 @@ void url_aggregator::set_search(const std::string_view input) { is_special() ? ada::character_sets::SPECIAL_QUERY_PERCENT_ENCODE : ada::character_sets::QUERY_PERCENT_ENCODE; + url_aggregator saved_url(*this); update_base_search(new_value, query_percent_encode_set); + if (buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return; + } ADA_ASSERT_TRUE(validate()); } @@ -14603,7 +11875,12 @@ void url_aggregator::set_hash(const std::string_view input) { std::string new_value; new_value = input[0] == '#' ? input.substr(1) : input; helpers::remove_ascii_tab_or_newline(new_value); + url_aggregator saved_url(*this); update_unencoded_base_hash(new_value); + if (buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return; + } ADA_ASSERT_TRUE(validate()); } @@ -14614,6 +11891,11 @@ bool url_aggregator::set_href(const std::string_view input) { ada_log("url_aggregator::set_href, success :", out.has_value()); if (out) { + // The parser enforces get_max_input_length() on both the input and the + // normalized result. This is a defense-in-depth check. + if (out->buffer.size() > ada::get_max_input_length()) { + return false; + } ada_log("url_aggregator::set_href, parsed ", out->to_string()); // TODO: Figure out why the following line puts test to never finish. *this = *out; @@ -14670,6 +11952,7 @@ ada_really_inline bool url_aggregator::parse_host(std::string_view input) { update_base_hostname(input); } host_type = IPV4; + is_valid = true; ada_log("parse_host fast path decimal ipv4"); ADA_ASSERT_TRUE(validate()); return true; @@ -14683,8 +11966,9 @@ ada_really_inline bool url_aggregator::parse_host(std::string_view input) { // could also check whether x and n and - are present, and so we could skip // some of the checks below. However, the gains are likely to be small, and // the code would be more complex. + static constexpr std::string_view xn_dash{"xn-", 3}; if (is_forbidden_or_upper == 0 && - input.find("xn-") == std::string_view::npos) { + input.find(xn_dash) == std::string_view::npos) { // fast path update_base_hostname(input); @@ -14694,6 +11978,7 @@ ada_really_inline bool url_aggregator::parse_host(std::string_view input) { return parse_ipv4(get_hostname(), true); } ada_log("parse_host fast path ", get_hostname()); + is_valid = true; return true; } // We have encountered at least one forbidden code point or the input contains @@ -14736,8 +12021,7 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { return false; } - std::string previous_host(get_hostname()); - uint32_t previous_port = components.port; + url_aggregator saved_url(*this); size_t host_end_pos = input.find('#'); std::string _host(input.data(), host_end_pos != std::string_view::npos @@ -14746,6 +12030,14 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { helpers::remove_ascii_tab_or_newline(_host); std::string_view new_host(_host); + auto check_url_size = [&]() -> bool { + if (buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } + return true; + }; + // If url's scheme is "file", then set state to file host state, instead of // host state. if (type != ada::scheme::type::FILE) { @@ -14773,9 +12065,13 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { // Let host be the result of host parsing buffer with url is not special. bool succeeded = parse_host(host_buffer); if (!succeeded) { - update_base_hostname(previous_host); - update_base_port(previous_port); + *this = std::move(saved_url); return false; + } else if (has_dash_dot()) { + // The url now has a non-null host, so the "/." that guarded a + // leading "//" path is no longer needed. Drop it before the port is + // inserted at host_end, otherwise it stays wedged in the path. + delete_dash_dot(); } // Set url's host to host, buffer to the empty string, and state to port @@ -14784,7 +12080,7 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { if (!port_buffer.empty()) { set_port(port_buffer); } - return true; + return check_url_size(); } // Otherwise, if one of the following is true: // - c is the EOF code point, U+002F (/), U+003F (?), or U+0023 (#) @@ -14811,20 +12107,23 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { } else if (has_dash_dot()) { add_authority_slashes_if_needed(); delete_dash_dot(); + } else { + // The url has no authority yet (e.g. "foo:/bar"); setting an empty + // host must still give it an (empty) authority, matching ada::url. + add_authority_slashes_if_needed(); } - return true; + return check_url_size(); } bool succeeded = parse_host(host_view); if (!succeeded) { - update_base_hostname(previous_host); - update_base_port(previous_port); + *this = std::move(saved_url); return false; } else if (has_dash_dot()) { // Should remove dash_dot from pathname delete_dash_dot(); } - return true; + return check_url_size(); } } @@ -14839,8 +12138,7 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { } else { // Let host be the result of host parsing buffer with url is not special. if (!parse_host(new_host)) { - update_base_hostname(previous_host); - update_base_port(previous_port); + *this = std::move(saved_url); return false; } @@ -14851,7 +12149,7 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { } } ADA_ASSERT_TRUE(validate()); - return true; + return check_url_size(); } bool url_aggregator::set_host(const std::string_view input) { @@ -15094,7 +12392,14 @@ bool url_aggregator::set_hostname(const std::string_view input) { if (components.host_start == components.host_end) { return false; } - return checkers::verify_dns_length(get_hostname()); + // Avoid allocation: construct a string_view directly into the buffer. + size_t start = components.host_start; + if (components.host_end > components.host_start && + buffer[components.host_start] == '@') { + start++; + } + return checkers::verify_dns_length( + std::string_view(buffer.data() + start, components.host_end - start)); } bool url_aggregator::parse_ipv4(std::string_view input, bool in_place) { @@ -15102,91 +12407,70 @@ bool url_aggregator::parse_ipv4(std::string_view input, bool in_place) { " bytes], overlaps with buffer: ", helpers::overlaps(input, buffer) ? "yes" : "no"); ADA_ASSERT_TRUE(validate()); + if (input.empty()) { + return is_valid = false; + } const bool trailing_dot = (input.back() == '.'); if (trailing_dot) { input.remove_suffix(1); + if (input.empty()) { + return is_valid = false; + } } - size_t digit_count{0}; - int pure_decimal_count = 0; // entries that are decimal - uint64_t ipv4{0}; - // we could unroll for better performance? - for (; (digit_count < 4) && !(input.empty()); digit_count++) { - uint32_t - segment_result{}; // If any number exceeds 32 bits, we have an error. - bool is_hex = checkers::has_hex_prefix(input); - if (is_hex && ((input.length() == 2) || - ((input.length() > 2) && (input[2] == '.')))) { - // special case - segment_result = 0; - input.remove_prefix(2); - } else { - std::from_chars_result r{}; - if (is_hex) { - ada_log("parse_ipv4 trying to parse hex number"); - r = std::from_chars(input.data() + 2, input.data() + input.size(), - segment_result, 16); - } else if ((input.length() >= 2) && input[0] == '0' && - checkers::is_digit(input[1])) { - ada_log("parse_ipv4 trying to parse octal number"); - r = std::from_chars(input.data() + 1, input.data() + input.size(), - segment_result, 8); - } else { - ada_log("parse_ipv4 trying to parse decimal number"); - pure_decimal_count++; - r = std::from_chars(input.data(), input.data() + input.size(), - segment_result, 10); - } - if (r.ec != std::errc()) { - ada_log("parse_ipv4 parsing failed"); - return is_valid = false; - } - ada_log("parse_ipv4 parsed ", segment_result); - input.remove_prefix(r.ptr - input.data()); + + const uint64_t fast = checkers::try_parse_ipv4_fast(input); + if (fast < checkers::ipv4_fast_fail) [[likely]] { + // Pure decimal: keep the buffer when it already holds the address. + // Otherwise write the (trailing-dot-stripped) input. + if (!(in_place && !trailing_dot)) { + update_base_hostname(input); } - if (input.empty()) { - // We have the last value. - // At this stage, ipv4 contains digit_count*8 bits. - // So we have 32-digit_count*8 bits left. - if (segment_result >= (uint64_t(1) << (32 - digit_count * 8))) { - return is_valid = false; - } - ipv4 <<= (32 - digit_count * 8); - ipv4 |= segment_result; - goto final; - } else { - // There is more, so that the value must no be larger than 255 - // and we must have a '.'. - if ((segment_result > 255) || (input[0] != '.')) { + host_type = IPV4; + ADA_ASSERT_TRUE(validate()); + return true; + } + + const char* p = input.data(); + const char* end = p + input.size(); + uint64_t ipv4 = 0; + int digit_count = 0; + int pure_decimal_count = 0; + + for (; digit_count < 4 && p < end; ++digit_count) { + uint64_t segment = 0; + bool pure = false; + if (!detail::parse_ipv4_number(p, end, segment, pure)) { + return is_valid = false; + } + if (pure) { + ++pure_decimal_count; + } + if (p >= end) { + const unsigned shift = static_cast(32 - digit_count * 8); + if (segment >= (uint64_t{1} << shift)) { return is_valid = false; } - ipv4 <<= 8; - ipv4 |= segment_result; - input.remove_prefix(1); // remove '.' + ipv4 = (ipv4 << shift) | segment; + goto ipv4_done; + } + if (segment > 255 || *p != '.') { + return is_valid = false; } + ipv4 = (ipv4 << 8) | segment; + ++p; } - if ((digit_count != 4) || (!input.empty())) { - ada_log("parse_ipv4 found invalid (more than 4 numbers or empty) "); + if (digit_count != 4 || p != end) { return is_valid = false; } -final: +ipv4_done: ada_log("url_aggregator::parse_ipv4 completed ", get_href(), " host: ", get_host()); - - // We could also check r.ptr to see where the parsing ended. if (in_place && pure_decimal_count == 4 && !trailing_dot) { ada_log( "url_aggregator::parse_ipv4 completed and was already correct in the " "buffer"); - // The original input was already all decimal and we validated it. So we - // don't need to do anything. } else { - ada_log("url_aggregator::parse_ipv4 completed and we need to update it"); - // Optimization opportunity: Get rid of unnecessary string return in ipv4 - // serializer. - // TODO: This is likely a bug because it goes back update_base_hostname, not - // what we want to do. - update_base_hostname( - ada::serializers::ipv4(ipv4)); // We have to reserialize the address. + update_base_hostname(ada::serializers::ipv4(ipv4)); } host_type = IPV4; ADA_ASSERT_TRUE(validate()); @@ -15194,237 +12478,143 @@ bool url_aggregator::parse_ipv4(std::string_view input, bool in_place) { } bool url_aggregator::parse_ipv6(std::string_view input) { - // TODO: Implement in_place optimization: we know that input points - // in the buffer, so we can just check whether the buffer is already - // well formatted. - // TODO: Find a way to merge parse_ipv6 with url.cpp implementation. ada_log("parse_ipv6 ", input, " [", input.size(), " bytes]"); ADA_ASSERT_TRUE(validate()); ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer)); - if (input.empty()) { + if (input.empty() || input.size() > 45) [[unlikely]] { return is_valid = false; } - // Let address be a new IPv6 address whose IPv6 pieces are all 0. - std::array address{}; +#if defined(ADA_AVX512) + if (!detail::ipv6_structure_plausible(input.data(), input.size())) + [[unlikely]] { + return is_valid = false; + } +#endif - // Let pieceIndex be 0. + std::array address{}; + const char* pointer = input.data(); + const char* const end = pointer + input.size(); int piece_index = 0; + int compress = -1; - // Let compress be null. - std::optional compress{}; - - // Let pointer be a pointer for input. - std::string_view::iterator pointer = input.begin(); - - // If c is U+003A (:), then: - if (input[0] == ':') { - // If remaining does not start with U+003A (:), validation error, return - // failure. - if (input.size() == 1 || input[1] != ':') { - ada_log("parse_ipv6 starts with : but the rest does not start with :"); + if (*pointer == ':') { + if (input.size() == 1 || pointer[1] != ':') [[unlikely]] { return is_valid = false; } - - // Increase pointer by 2. pointer += 2; - - // Increase pieceIndex by 1 and then set compress to pieceIndex. compress = ++piece_index; } - // While c is not the EOF code point: - while (pointer != input.end()) { - // If pieceIndex is 8, validation error, return failure. - if (piece_index == 8) { - ada_log("parse_ipv6 piece_index == 8"); + while (pointer != end) { + if (piece_index == 8) [[unlikely]] { return is_valid = false; } - - // If c is U+003A (:), then: if (*pointer == ':') { - // If compress is non-null, validation error, return failure. - if (compress.has_value()) { - ada_log("parse_ipv6 compress is non-null"); + if (compress != -1) [[unlikely]] { return is_valid = false; } - - // Increase pointer and pieceIndex by 1, set compress to pieceIndex, and - // then continue. - pointer++; + ++pointer; compress = ++piece_index; continue; } - // Let value and length be 0. - uint16_t value = 0, length = 0; - - // While length is less than 4 and c is an ASCII hex digit, - // set value to value times 0x10 + c interpreted as hexadecimal number, and - // increase pointer and length by 1. - while (length < 4 && pointer != input.end() && - unicode::is_ascii_hex_digit(*pointer)) { - // https://stackoverflow.com/questions/39060852/why-does-the-addition-of-two-shorts-return-an-int - value = uint16_t(value * 0x10 + unicode::convert_hex_to_binary(*pointer)); - pointer++; - length++; - } + uint16_t value = 0; + const int length = detail::parse_hex_piece(pointer, end, value); - // If c is U+002E (.), then: - if (pointer != input.end() && *pointer == '.') { - // If length is 0, validation error, return failure. - if (length == 0) { - ada_log("parse_ipv6 length is 0"); + if (pointer != end && *pointer == '.') { + if (length == 0) [[unlikely]] { return is_valid = false; } - - // Decrease pointer by length. pointer -= length; - - // If pieceIndex is greater than 6, validation error, return failure. - if (piece_index > 6) { - ada_log("parse_ipv6 piece_index > 6"); + if (piece_index > 6) [[unlikely]] { return is_valid = false; } - // Let numbersSeen be 0. int numbers_seen = 0; - - // While c is not the EOF code point: - while (pointer != input.end()) { - // Let ipv4Piece be null. - std::optional ipv4_piece{}; - - // If numbersSeen is greater than 0, then: + while (pointer != end) { + int ipv4_piece = -1; if (numbers_seen > 0) { - // If c is a U+002E (.) and numbersSeen is less than 4, then increase - // pointer by 1. if (*pointer == '.' && numbers_seen < 4) { - pointer++; + ++pointer; } else { - // Otherwise, validation error, return failure. - ada_log("parse_ipv6 Otherwise, validation error, return failure"); return is_valid = false; } } - - // If c is not an ASCII digit, validation error, return failure. - if (pointer == input.end() || !checkers::is_digit(*pointer)) { - ada_log( - "parse_ipv6 If c is not an ASCII digit, validation error, return " - "failure"); + if (pointer == end || *pointer < '0' || *pointer > '9') [[unlikely]] { return is_valid = false; } - - // While c is an ASCII digit: - while (pointer != input.end() && checkers::is_digit(*pointer)) { - // Let number be c interpreted as decimal number. - int number = *pointer - '0'; - - // If ipv4Piece is null, then set ipv4Piece to number. - if (!ipv4_piece.has_value()) { - ipv4_piece = number; - } - // Otherwise, if ipv4Piece is 0, validation error, return failure. - else if (ipv4_piece == 0) { - ada_log("parse_ipv6 if ipv4Piece is 0, validation error"); + ipv4_piece = *pointer - '0'; + ++pointer; + if (pointer != end && *pointer >= '0' && *pointer <= '9') { + if (ipv4_piece == 0) [[unlikely]] { return is_valid = false; } - // Otherwise, set ipv4Piece to ipv4Piece times 10 + number. - else { - ipv4_piece = *ipv4_piece * 10 + number; - } - - // If ipv4Piece is greater than 255, validation error, return failure. - if (ipv4_piece > 255) { - ada_log("parse_ipv6 ipv4_piece > 255"); - return is_valid = false; + ipv4_piece = ipv4_piece * 10 + (*pointer - '0'); + ++pointer; + if (pointer != end && *pointer >= '0' && *pointer <= '9') { + ipv4_piece = ipv4_piece * 10 + (*pointer - '0'); + ++pointer; + if (ipv4_piece > 255) [[unlikely]] { + return is_valid = false; + } } - - // Increase pointer by 1. - pointer++; } - - // Set address[pieceIndex] to address[pieceIndex] times 0x100 + - // ipv4Piece. - // https://stackoverflow.com/questions/39060852/why-does-the-addition-of-two-shorts-return-an-int - address[piece_index] = - uint16_t(address[piece_index] * 0x100 + *ipv4_piece); - - // Increase numbersSeen by 1. - numbers_seen++; - - // If numbersSeen is 2 or 4, then increase pieceIndex by 1. + address[static_cast(piece_index)] = static_cast( + address[static_cast(piece_index)] * 0x100 + + static_cast(ipv4_piece)); + ++numbers_seen; if (numbers_seen == 2 || numbers_seen == 4) { - piece_index++; + ++piece_index; } } - - // If numbersSeen is not 4, validation error, return failure. - if (numbers_seen != 4) { + if (numbers_seen != 4) [[unlikely]] { return is_valid = false; } - - // Break. break; } - // Otherwise, if c is U+003A (:): - else if ((pointer != input.end()) && (*pointer == ':')) { - // Increase pointer by 1. - pointer++; - // If c is the EOF code point, validation error, return failure. - if (pointer == input.end()) { - ada_log( - "parse_ipv6 If c is the EOF code point, validation error, return " - "failure"); + if (length == 0) [[unlikely]] { + return is_valid = false; + } + + if (pointer != end && *pointer == ':') { + ++pointer; + if (pointer == end) [[unlikely]] { return is_valid = false; } - } - // Otherwise, if c is not the EOF code point, validation error, return - // failure. - else if (pointer != input.end()) { - ada_log( - "parse_ipv6 Otherwise, if c is not the EOF code point, validation " - "error, return failure"); + } else if (pointer != end) [[unlikely]] { return is_valid = false; } - // Set address[pieceIndex] to value. - address[piece_index] = value; - - // Increase pieceIndex by 1. - piece_index++; + address[static_cast(piece_index)] = value; + ++piece_index; } - // If compress is non-null, then: - if (compress.has_value()) { - // Let swaps be pieceIndex - compress. - int swaps = piece_index - *compress; - - // Set pieceIndex to 7. - piece_index = 7; - - // While pieceIndex is not 0 and swaps is greater than 0, - // swap address[pieceIndex] with address[compress + swaps - 1], and then - // decrease both pieceIndex and swaps by 1. - while (piece_index != 0 && swaps > 0) { - std::swap(address[piece_index], address[*compress + swaps - 1]); - piece_index--; - swaps--; + if (compress != -1) { + const int right = piece_index - compress; + if (right > 0) { + const size_t dest = static_cast(8 - right); + const size_t src = static_cast(compress); + if (dest != src) { + for (size_t i = static_cast(right); i-- > 0;) { + address[dest + i] = address[src + i]; + address[src + i] = 0; + } + } } - } - // Otherwise, if compress is null and pieceIndex is not 8, validation error, - // return failure. - else if (piece_index != 8) { - ada_log( - "parse_ipv6 if compress is null and pieceIndex is not 8, validation " - "error, return failure"); + } else if (piece_index != 8) [[unlikely]] { return is_valid = false; } - // TODO: Optimization opportunity: Get rid of unnecessary string creation. - // TODO: This is likely a bug because it goes back update_base_hostname, not - // what we want to do. - update_base_hostname(ada::serializers::ipv6(address)); + + // Serialize once; skip rewrite when hostname is already canonical. + const std::string serialized = ada::serializers::ipv6(address); + const std::string_view current = get_hostname(); + if (current.size() == serialized.size() && + std::memcmp(current.data(), serialized.data(), serialized.size()) == 0) { + ada_log("parse_ipv6 in-place canonical match"); + } else { + update_base_hostname(serialized); + } ada_log("parse_ipv6 ", get_hostname()); ADA_ASSERT_TRUE(validate()); host_type = IPV6; @@ -15928,22 +13118,28 @@ tl::expected url_pattern_init::process( // "search", then: if (!init.protocol && !init.hostname && !init.port && !init.pathname && !init.search) { - // Let baseQuery be baseURL's query. + // Let baseQuery be baseURL's query. get_search() carries the leading "?" + // delimiter, but the spec inherits the query itself, so drop it. + std::string_view base_query = base_url->get_search(); + if (base_query.starts_with("?")) base_query.remove_prefix(1); // Set result["search"] to the result of processing a base URL string // given baseQuery and type. - result.search = url_pattern_helpers::process_base_url_string( - base_url->get_search(), type); + result.search = + url_pattern_helpers::process_base_url_string(base_query, type); } // If init contains none of "protocol", "hostname", "port", "pathname", // "search", and "hash", then: if (!init.protocol && !init.hostname && !init.port && !init.pathname && !init.search && !init.hash) { - // Let baseFragment be baseURL's fragment. + // Let baseFragment be baseURL's fragment. get_hash() carries the leading + // "#" delimiter, but the spec inherits the fragment itself, so drop it. + std::string_view base_fragment = base_url->get_hash(); + if (base_fragment.starts_with("#")) base_fragment.remove_prefix(1); // Set result["hash"] to the result of processing a base URL string given // baseFragment and type. - result.hash = url_pattern_helpers::process_base_url_string( - base_url->get_hash(), type); + result.hash = + url_pattern_helpers::process_base_url_string(base_fragment, type); } } @@ -16496,13 +13692,21 @@ tl::expected canonicalize_hostname( return ""; } - // Fast path: simple hostnames (lowercase ASCII, digits, -, .) need no IDNA + // Fast path: simple hostnames (lowercase ASCII, digits, -, .) need no IDNA. + // The simple character set also covers IPv4-shaped hosts, which the slow + // path rewrites ("0" -> "0.0.0.0", "0x7f.1" -> "127.0.0.1"). Exclude those + // so the fast path can't return a non-canonical hostname. + // + // Pure-ASCII "xn--" labels are intentionally left on the fast path: with + // beStrict=false, domain-to-ASCII returns the lowercased ASCII input even + // when Unicode ToASCII would fail (e.g. invalid ACE "xn--a"). See + // https://url.spec.whatwg.org/#concept-domain-to-ascii bool needs_processing = false; for (char c : input) { needs_processing |= !(char_class_table[static_cast(c)] & CHAR_SIMPLE_HOSTNAME); } - if (!needs_processing) { + if (!needs_processing && !checkers::is_ipv4(input)) { return std::string(input); } @@ -16566,8 +13770,18 @@ tl::expected canonicalize_port( std::string_view digits_to_parse = std::string_view(trimmed.data(), first_non_digit - trimmed.begin()); - // Here we have that a range of ASCII digit characters identified - // by digits_to_parse. It is none empty. + // Here we have a range of ASCII digit characters identified by + // digits_to_parse. It is non-empty. The port state of the URL parser reads + // it as an integer, so leading zeros are part of the number: "0080" is 80 + // and "065535" is 65535, not a six-digit overflow. Only the significant + // digits count toward the 5-digit maximum, matching the fast path in + // implementation.cpp. + size_t first_significant = digits_to_parse.find_first_not_of('0'); + if (first_significant == std::string_view::npos) { + // The value is all zeros, i.e. port 0. + return "0"; + } + digits_to_parse.remove_prefix(first_significant); // We want to determine whether it is a valid port number (0-65535). // Clearly, if the length is greater than 5, it is invalid. // If the length is 5, we need to compare lexicographically to "65535". @@ -16579,10 +13793,6 @@ tl::expected canonicalize_port( } else if (digits_to_parse.size() > 5) { return tl::unexpected(errors::type_error); } - if (digits_to_parse[0] == '0' && digits_to_parse.size() > 1) { - // Leading zeros are not allowed for multi-digit ports - return tl::unexpected(errors::type_error); - } // It is valid! Most times, we do not need to parse it into an integer. return std::string(digits_to_parse); } @@ -16622,6 +13832,7 @@ tl::expected canonicalize_port_with_protocol( // Parse the port number uint16_t parsed_port{}; + // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage) auto result = std::from_chars(digits_to_parse.data(), digits_to_parse.data() + digits_to_parse.size(), parsed_port); @@ -16668,25 +13879,33 @@ tl::expected canonicalize_pathname( const bool leading_slash = input.starts_with("/"); // Let modified value be "/-" if leading slash is false and otherwise the // empty string. - const auto modified_value = leading_slash ? "" : "/-"; - const auto full_url = - std::string("fake://fake-url") + modified_value + std::string(input); - if (auto url = ada::parse(full_url, nullptr)) { - const auto pathname = url->get_pathname(); - // If leading slash is false, then set result to the code point substring - // from 2 to the end of the string within result. - if (!leading_slash) { - // pathname should start with "/-" but path traversal (e.g. "../../") - // can reduce it to just "/" which is shorter than 2 characters. - if (pathname.size() < 2) { - return tl::unexpected(errors::type_error); - } - return std::string(pathname.substr(2)); + const auto modified_value = + (leading_slash ? std::string() : std::string("/-")) + std::string(input); + // The spec runs the basic URL parser with the path in state override, where + // '?' and '#' are ordinary path code points (percent-encoded) and leading or + // trailing C0 control or space is kept. Building a full URL string and + // parsing it (no state override) instead let '?' and '#' start the + // query/fragment, so the pathname was silently truncated at the first literal + // '?' or '#'. set_pathname runs the parser in path state override, matching + // how canonicalize_hostname uses set_hostname. + auto url = ada::parse("fake://fake-url", nullptr); + ADA_ASSERT_TRUE(url); + if (!url->set_pathname(modified_value)) { + // If parseResult is failure, then throw a TypeError. + return tl::unexpected(errors::type_error); + } + const auto pathname = url->get_pathname(); + // If leading slash is false, then set result to the code point substring + // from 2 to the end of the string within result. + if (!leading_slash) { + // pathname should start with "/-" but path traversal (e.g. "../../") + // can reduce it to just "/" which is shorter than 2 characters. + if (pathname.size() < 2) { + return tl::unexpected(errors::type_error); } - return std::string(pathname); + return std::string(pathname.substr(2)); } - // If parseResult is failure, then throw a TypeError. - return tl::unexpected(errors::type_error); + return std::string(pathname); } tl::expected canonicalize_opaque_pathname( @@ -16713,9 +13932,10 @@ tl::expected canonicalize_search(std::string_view input) { if (input.empty()) [[unlikely]] { return ""; } - // Remove leading '?' if present - std::string new_value; - new_value = input[0] == '?' ? input.substr(1) : input; + // A leading '?' is a valid query code point here: it is the caller (process a + // search) that removes a single delimiter, not this step, which mirrors the + // basic URL parser's query state. + std::string new_value(input); // Remove ASCII tab or newline characters helpers::remove_ascii_tab_or_newline(new_value); @@ -16742,9 +13962,10 @@ tl::expected canonicalize_hash(std::string_view input) { if (input.empty()) [[unlikely]] { return ""; } - // Remove leading '#' if present - std::string new_value; - new_value = input[0] == '#' ? input.substr(1) : input; + // A leading '#' is a valid fragment code point here: it is the caller + // (process a hash) that removes a single delimiter, not this step, which + // mirrors the basic URL parser's fragment state. + std::string new_value(input); // Remove ASCII tab or newline characters helpers::remove_ascii_tab_or_newline(new_value); @@ -16777,6 +13998,16 @@ tl::expected, errors> tokenize(std::string_view input, // index. tokenizer.seek_and_get_next_code_point(tokenizer.index); + // Malformed UTF-8 must not stall tokenization: report an invalid-char + // token (lenient) or fail fast (strict), while always making progress. + if (tokenizer.had_invalid_code_point()) { + if (auto error = tokenizer.process_tokenizing_error(tokenizer.next_index, + tokenizer.index)) { + return tl::unexpected(*error); + } + continue; + } + // If tokenizer's code point is U+002A (*): if (tokenizer.code_point == '*') { // Run add a token with default position and length given tokenizer and @@ -16815,6 +14046,13 @@ tl::expected, errors> tokenize(std::string_view input, auto escaped_index = tokenizer.next_index; // Run get the next code point given tokenizer. tokenizer.get_next_code_point(); + if (tokenizer.had_invalid_code_point()) { + if (auto error = tokenizer.process_tokenizing_error( + tokenizer.next_index, escaped_index)) { + return tl::unexpected(*error); + } + continue; + } // Run add a token with default length given tokenizer, "escaped-char", // tokenizer's next index, and escaped index. tokenizer.add_token_with_default_length( @@ -16849,11 +14087,20 @@ tl::expected, errors> tokenize(std::string_view input, auto name_position = tokenizer.next_index; // Let name start be name position. auto name_start = name_position; + bool invalid_name = false; // While name position is less than tokenizer's input's code point length: while (name_position < tokenizer.input.size()) { // Run seek and get the next code point given tokenizer and name // position. tokenizer.seek_and_get_next_code_point(name_position); + if (tokenizer.had_invalid_code_point()) { + if (auto error = tokenizer.process_tokenizing_error( + tokenizer.next_index, name_position)) { + return tl::unexpected(*error); + } + invalid_name = true; + break; + } // Let first code point be true if name position equals name start and // false otherwise. bool first_code_point = name_position == name_start; @@ -16870,6 +14117,10 @@ tl::expected, errors> tokenize(std::string_view input, name_position = tokenizer.next_index; } + if (invalid_name) { + continue; + } + // If name position is less than or equal to name start: if (name_position <= name_start) { // Run process a tokenizing error given tokenizer, name start, and @@ -16907,6 +14158,14 @@ tl::expected, errors> tokenize(std::string_view input, // Run seek and get the next code point given tokenizer and regexp // position. tokenizer.seek_and_get_next_code_point(regexp_position); + if (tokenizer.had_invalid_code_point()) { + if (auto process_error = tokenizer.process_tokenizing_error( + tokenizer.next_index, regexp_position)) { + return tl::unexpected(*process_error); + } + error = true; + break; + } // TODO: Optimization opportunity: The next 2 if statements can be // merged. If the result of running is ASCII given tokenizer's code @@ -16952,7 +14211,16 @@ tl::expected, errors> tokenize(std::string_view input, break; } // Run get the next code point given tokenizer. + auto escaped_index = tokenizer.next_index; tokenizer.get_next_code_point(); + if (tokenizer.had_invalid_code_point()) { + if (auto process_error = tokenizer.process_tokenizing_error( + tokenizer.next_index, escaped_index)) { + return tl::unexpected(*process_error); + } + error = true; + break; + } // If the result of running is ASCII given tokenizer's code point is // false: if (!unicode::is_ascii(tokenizer.code_point)) { @@ -17004,6 +14272,14 @@ tl::expected, errors> tokenize(std::string_view input, auto temporary_position = tokenizer.next_index; // Run get the next code point given tokenizer. tokenizer.get_next_code_point(); + if (tokenizer.had_invalid_code_point()) { + if (auto process_error = tokenizer.process_tokenizing_error( + tokenizer.next_index, temporary_position)) { + return tl::unexpected(*process_error); + } + error = true; + break; + } // If tokenizer's code point is not U+003F (?): if (tokenizer.code_point != '?') { // Run process a tokenizing error given tokenizer, regexp start, and @@ -17220,8 +14496,8 @@ std::string generate_pattern_string( // point. bool needs_grouping = !part.suffix.empty() || - (!part.prefix.empty() && !options.get_prefix().empty() && - part.prefix[0] != options.get_prefix()[0]); + (!part.prefix.empty() && (options.get_prefix().empty() || + part.prefix[0] != options.get_prefix()[0])); // If all of the following are true: // - needs grouping is false; and @@ -17394,14 +14670,23 @@ std_regex_provider::regex_search(std::string_view input, return std::nullopt; } std::vector> matches; - // If input is empty, let's assume the result will be empty as well. - if (input.empty() || match_result.empty()) { + // An empty input can still match with capture groups (e.g. "(x*)" or an + // optional ":a?" against ""), so the group values must be extracted here + // just like for a non-empty input. A successful regex_search always leaves + // the full match at index 0, so match_result is never empty at this point. + if (match_result.empty()) { return matches; } matches.reserve(match_result.size()); for (size_t i = 1; i < match_result.size(); ++i) { if (auto entry = match_result[i]; entry.matched) { matches.emplace_back(entry.str()); + } else { + // A capture group that did not participate in the match is undefined, + // not absent. Emitting nullopt keeps the result aligned by position with + // the component's group name list; dropping it shifts every later group + // onto the wrong name. + matches.emplace_back(std::nullopt); } } return matches; @@ -18170,6 +15455,14 @@ bool ada_search_params_entries_iter_has_next( return (*r)->has_next(); } +void ada_set_max_input_length(uint32_t length) noexcept { + ada::set_max_input_length(length); +} + +uint32_t ada_get_max_input_length() noexcept { + return ada::get_max_input_length(); +} + typedef struct { int major; int minor; diff --git a/deps/ada/ada.h b/deps/ada/ada.h index 8f9089d2210a..dc96fe834308 100644 --- a/deps/ada/ada.h +++ b/deps/ada/ada.h @@ -1,4 +1,4 @@ -/* auto-generated on 2026-03-23 17:52:13 -0400. Do not edit! */ +/* auto-generated on 2026-07-27 16:10:09 -0400. Do not edit! */ /* begin file include/ada.h */ /** * @file ada.h @@ -30,7 +30,7 @@ #define ADA_H /* begin file include/ada/ada_idna.h */ -/* auto-generated on 2026-01-30 12:00:02 -0500. Do not edit! */ +/* auto-generated on 2026-07-12 20:34:08 -0400. Do not edit! */ /* begin file include/idna.h */ #ifndef ADA_IDNA_H #define ADA_IDNA_H @@ -69,6 +69,10 @@ namespace ada::idna { void ascii_map(char* input, size_t length); // Map the characters according to IDNA, returning the empty string on error. std::u32string map(std::u32string_view input); +// Map into an existing buffer (cleared on entry). Returns false if any code +// point is disallowed. Reusing the buffer avoids repeated heap allocations +// when called in a loop over multiple labels. +bool map(std::u32string_view input, std::u32string& out); } // namespace ada::idna @@ -83,8 +87,15 @@ std::u32string map(std::u32string_view input); namespace ada::idna { +// Returns true if `input` is already in Unicode Normalization Form C. +// Requires that internal tables have been loaded (call ensure via normalize +// or map first, or this returns false if tables are unavailable). +[[nodiscard]] bool is_already_nfc(std::u32string_view input) noexcept; + // Normalize the characters according to IDNA (Unicode Normalization Form C). -void normalize(std::u32string& input); +// Returns false if the internal Unicode tables could not be loaded; in that +// case `input` is left unchanged. Skips work when the string is already NFC. +[[nodiscard]] bool normalize(std::u32string& input); } // namespace ada::idna #endif @@ -131,6 +142,24 @@ bool is_label_valid(std::u32string_view label); #include #include +/* begin file include/ada/idna/limits.h */ +#ifndef ADA_IDNA_LIMITS_H +#define ADA_IDNA_LIMITS_H + +#include + +namespace ada::idna { + +// Maximum accepted UTF-8 domain length for to_ascii / to_unicode. +// Bounds heap growth under untrusted input (DoS resistance). DNS wire limits +// are smaller; this allows long Unicode labels used in URL tests/fixtures. +inline constexpr size_t max_domain_input_bytes = 16384; + +} // namespace ada::idna + +#endif // ADA_IDNA_LIMITS_H +/* end file include/ada/idna/limits.h */ + namespace ada::idna { // Converts a domain (e.g., www.google.com) possibly containing international @@ -138,12 +167,16 @@ namespace ada::idna { // decoding: percent decoding should be done prior to calling this function. We // do not remove tabs and spaces, they should have been removed prior to calling // this function. We also do not trim control characters. We also assume that -// the input is not empty. We return "" on error. +// the input is not empty. We return "" on error. Inputs longer than +// max_domain_input_bytes are rejected. // -// -// This function may accept or even produce invalid domains. +// This function may accept or even produce invalid domains (WHATWG carve-outs). std::string to_ascii(std::string_view ut8_string); +// Same as to_ascii, but writes into `out` and returns false on error without +// relying on empty-string ambiguity. +[[nodiscard]] bool to_ascii(std::string_view ut8_string, std::string& out); + // Returns true if the string contains a forbidden code point according to the // WHATGL URL specification: // https://url.spec.whatwg.org/#forbidden-domain-code-point @@ -157,16 +190,24 @@ bool constexpr is_ascii(std::string_view view); #endif // ADA_IDNA_TO_ASCII_H /* end file include/ada/idna/to_ascii.h */ /* begin file include/ada/idna/to_unicode.h */ - #ifndef ADA_IDNA_TO_UNICODE_H #define ADA_IDNA_TO_UNICODE_H +#include #include namespace ada::idna { +// UTS #46 ToUnicode. Never fails per the standard: on step failure the original +// label is kept. Inputs longer than max_domain_input_bytes are returned +// unchanged as a safety measure under untrusted input. std::string to_unicode(std::string_view input); +// Writes into `out`. Returns false only if the input exceeds +// max_domain_input_bytes (out is left empty). Otherwise always returns true +// (ToUnicode does not fail). +[[nodiscard]] bool to_unicode(std::string_view input, std::string& out); + } // namespace ada::idna #endif // ADA_IDNA_TO_UNICODE_H @@ -254,10 +295,10 @@ bool valid_name_code_point(char32_t code_point, bool first); #endif // Align to N-byte boundary -#define ADA_ROUNDUP_N(a, n) (((a) + ((n)-1)) & ~((n)-1)) -#define ADA_ROUNDDOWN_N(a, n) ((a) & ~((n)-1)) +#define ADA_ROUNDUP_N(a, n) (((a) + ((n) - 1)) & ~((n) - 1)) +#define ADA_ROUNDDOWN_N(a, n) ((a) & ~((n) - 1)) -#define ADA_ISALIGNED_N(ptr, n) (((uintptr_t)(ptr) & ((n)-1)) == 0) +#define ADA_ISALIGNED_N(ptr, n) (((uintptr_t)(ptr) & ((n) - 1)) == 0) #if defined(ADA_REGULAR_VISUAL_STUDIO) @@ -457,6 +498,12 @@ namespace ada { #define ADA_SSE2 1 #endif +// AVX-512 byte/word ops + 128/256-bit vectors of AVX-512 instructions. +// Used for optional high-performance IP address parsing kernels. +#if defined(__AVX512BW__) && defined(__AVX512VL__) +#define ADA_AVX512 1 +#endif + #if defined(__aarch64__) || defined(_M_ARM64) #define ADA_NEON 1 #endif @@ -1041,6 +1088,8 @@ ada_really_inline constexpr bool bit_at(const uint8_t a[], const uint8_t i) { #define ADA_CHECKERS_INL_H #include +#include +#include #include /* begin file include/ada/checkers.h */ /** @@ -1163,8 +1212,7 @@ ada_really_inline constexpr bool verify_dns_length( * This is optimized for the common case where the input is a well-formed * decimal IPv4 address with exactly 4 octets. */ -ada_really_inline constexpr uint64_t try_parse_ipv4_fast( - std::string_view input) noexcept; +ada_really_inline uint64_t try_parse_ipv4_fast(std::string_view input) noexcept; /** * Sentinel value indicating try_parse_ipv4_fast() did not succeed. @@ -1177,6 +1225,10 @@ constexpr uint64_t ipv4_fast_fail = uint64_t(1) << 32; #endif // ADA_CHECKERS_H /* end file include/ada/checkers.h */ +#if defined(ADA_AVX512) +#include +#endif + namespace ada::checkers { constexpr bool has_hex_prefix_unsafe(std::string_view input) { @@ -1215,67 +1267,153 @@ constexpr bool is_windows_drive_letter(std::string_view input) noexcept { constexpr bool is_normalized_windows_drive_letter( std::string_view input) noexcept { - return input.size() >= 2 && (is_alpha(input[0]) && (input[1] == ':')); + return input.size() == 2 && (is_alpha(input[0]) && (input[1] == ':')); } -ada_really_inline constexpr uint64_t try_parse_ipv4_fast( - std::string_view input) noexcept { - const char* p = input.data(); - const char* const pend = p + input.size(); +namespace detail { +// Unrolled pure-decimal IPv4. The common portable path for 7-16 byte hosts. +ada_really_inline uint64_t +parse_ipv4_decimal_scalar(const char* p, const char* pend) noexcept { uint32_t ipv4 = 0; - for (int i = 0; i < 4; ++i) { - if (p == pend) { + if (p == pend) [[unlikely]] { return ipv4_fast_fail; } - uint32_t val; char c = *p; - if (c >= '0' && c <= '9') { - val = c - '0'; - p++; + if (c >= '0' && c <= '9') [[likely]] { + val = static_cast(c - '0'); + ++p; } else { return ipv4_fast_fail; } - if (p < pend) { c = *p; if (c >= '0' && c <= '9') { - if (val == 0) return ipv4_fast_fail; - val = val * 10 + (c - '0'); - p++; + if (val == 0) [[unlikely]] { + return ipv4_fast_fail; + } + val = val * 10u + static_cast(c - '0'); + ++p; if (p < pend) { c = *p; if (c >= '0' && c <= '9') { - val = val * 10 + (c - '0'); - p++; - if (val > 255) return ipv4_fast_fail; + val = val * 10u + static_cast(c - '0'); + ++p; + if (val > 255u) [[unlikely]] { + return ipv4_fast_fail; + } } } } } - ipv4 = (ipv4 << 8) | val; - if (i < 3) { - if (p == pend || *p != '.') { + if (p == pend || *p != '.') [[unlikely]] { return ipv4_fast_fail; } - p++; + ++p; } } - if (p != pend) { if (p == pend - 1 && *p == '.') { return ipv4; } return ipv4_fast_fail; } - return ipv4; } +#if defined(ADA_AVX512) +// After SIMD validation: fewer rejection branches on convert. +ada_really_inline uint64_t +parse_ipv4_decimal_trusted(const char* p, const char* pend) noexcept { + uint32_t ipv4 = 0; + for (int i = 0; i < 4; ++i) { + uint32_t val = static_cast(*p - '0'); + ++p; + if (p < pend && static_cast(*p - '0') <= 9) { + if (val == 0) [[unlikely]] { + return ipv4_fast_fail; + } + val = val * 10u + static_cast(*p - '0'); + ++p; + if (p < pend && static_cast(*p - '0') <= 9) { + val = val * 10u + static_cast(*p - '0'); + ++p; + if (val > 255u) [[unlikely]] { + return ipv4_fast_fail; + } + } + } + ipv4 = (ipv4 << 8) | val; + if (i < 3) { + ++p; // trusted '.' + } + } + return ipv4; // trailing-dot already accounted for by caller via pend +} + +// AVX-512 pure-decimal IPv4 (Lemire/Mula-style masked load + parallel checks). +// No over-read of the source string. Wins when the binary is built with +// -mavx512bw -mavx512vl (or -march that enables them). +ada_really_inline uint64_t try_parse_ipv4_avx512(const char* data, + size_t len) noexcept { + const __mmask16 live = static_cast<__mmask16>((1u << len) - 1u); + const __m128i input = + _mm_maskz_loadu_epi8(live, reinterpret_cast(data)); + const __mmask16 is_dot = + _mm_mask_cmpeq_epi8_mask(live, input, _mm_set1_epi8('.')); + const __m128i shifted = _mm_sub_epi8(input, _mm_set1_epi8('0')); + const __mmask16 is_digit = + _mm_mask_cmplt_epu8_mask(live, shifted, _mm_set1_epi8(10)); + if ((is_digit | is_dot) != live) { + return ipv4_fast_fail; + } + const unsigned dot_count = + static_cast(_mm_popcnt_u32(static_cast(is_dot))); + size_t effective_len = len; + if (dot_count == 3) { + // ok + } else if (dot_count == 4 && data[len - 1] == '.') { + effective_len = len - 1; // strip trailing dot for convert + } else { + return ipv4_fast_fail; + } + // Convert from a tiny stack copy so trusted peeks stay in-bounds. + alignas(16) char buf[16]{}; + std::memcpy(buf, data, effective_len); + return parse_ipv4_decimal_trusted(buf, buf + effective_len); +} +#endif // ADA_AVX512 + +} // namespace detail + +/** + * Fast pure-decimal IPv4 parse. Returns packed address or ipv4_fast_fail. + * Accepts an optional single trailing dot. + * + * On AVX-512BW+VL targets, uses a masked-load SIMD kernel (no source + * over-read) inspired by Lemire/Mula. Otherwise uses an unrolled scalar path + * (typically faster than SSE2/NEON pre-validation for these 7-16 byte hosts). + */ +ada_really_inline uint64_t +try_parse_ipv4_fast(std::string_view input) noexcept { + const size_t len = input.size(); + // Shortest pure decimal: "0.0.0.0" (7). Longest + trailing dot: 16. + if (len < 7 || len > 16) [[unlikely]] { + return ipv4_fast_fail; + } + const char* data = input.data(); + +#if defined(ADA_AVX512) + return detail::try_parse_ipv4_avx512(data, len); +#else + return detail::parse_ipv4_decimal_scalar(data, data + len); +#endif +} + } // namespace ada::checkers #endif // ADA_CHECKERS_INL_H @@ -2002,25 +2140,25 @@ class unexpected { static_assert(!std::is_same::value, "E must not be void"); unexpected() = delete; - constexpr explicit unexpected(const E &e) : m_val(e) {} + constexpr explicit unexpected(const E& e) : m_val(e) {} - constexpr explicit unexpected(E &&e) : m_val(std::move(e)) {} + constexpr explicit unexpected(E&& e) : m_val(std::move(e)) {} template ::value>::type * = nullptr> - constexpr explicit unexpected(Args &&...args) + E, Args&&...>::value>::type* = nullptr> + constexpr explicit unexpected(Args&&... args) : m_val(std::forward(args)...) {} template < class U, class... Args, typename std::enable_if &, Args &&...>::value>::type * = nullptr> - constexpr explicit unexpected(std::initializer_list l, Args &&...args) + E, std::initializer_list&, Args&&...>::value>::type* = nullptr> + constexpr explicit unexpected(std::initializer_list l, Args&&... args) : m_val(l, std::forward(args)...) {} - constexpr const E &value() const & { return m_val; } - TL_EXPECTED_11_CONSTEXPR E &value() & { return m_val; } - TL_EXPECTED_11_CONSTEXPR E &&value() && { return std::move(m_val); } - constexpr const E &&value() const && { return std::move(m_val); } + constexpr const E& value() const& { return m_val; } + TL_EXPECTED_11_CONSTEXPR E& value() & { return m_val; } + TL_EXPECTED_11_CONSTEXPR E&& value() && { return std::move(m_val); } + constexpr const E&& value() const&& { return std::move(m_val); } private: E m_val; @@ -2032,32 +2170,32 @@ unexpected(E) -> unexpected; #endif template -constexpr bool operator==(const unexpected &lhs, const unexpected &rhs) { +constexpr bool operator==(const unexpected& lhs, const unexpected& rhs) { return lhs.value() == rhs.value(); } template -constexpr bool operator!=(const unexpected &lhs, const unexpected &rhs) { +constexpr bool operator!=(const unexpected& lhs, const unexpected& rhs) { return lhs.value() != rhs.value(); } template -constexpr bool operator<(const unexpected &lhs, const unexpected &rhs) { +constexpr bool operator<(const unexpected& lhs, const unexpected& rhs) { return lhs.value() < rhs.value(); } template -constexpr bool operator<=(const unexpected &lhs, const unexpected &rhs) { +constexpr bool operator<=(const unexpected& lhs, const unexpected& rhs) { return lhs.value() <= rhs.value(); } template -constexpr bool operator>(const unexpected &lhs, const unexpected &rhs) { +constexpr bool operator>(const unexpected& lhs, const unexpected& rhs) { return lhs.value() > rhs.value(); } template -constexpr bool operator>=(const unexpected &lhs, const unexpected &rhs) { +constexpr bool operator>=(const unexpected& lhs, const unexpected& rhs) { return lhs.value() >= rhs.value(); } template -unexpected::type> make_unexpected(E &&e) { +unexpected::type> make_unexpected(E&& e) { return unexpected::type>(std::forward(e)); } @@ -2068,7 +2206,7 @@ static constexpr unexpect_t unexpect{}; namespace detail { template -[[noreturn]] TL_EXPECTED_11_CONSTEXPR void throw_exception(E &&e) { +[[noreturn]] TL_EXPECTED_11_CONSTEXPR void throw_exception(E&& e) { #ifdef TL_EXPECTED_EXCEPTIONS_ENABLED throw std::forward(e); #else @@ -2127,16 +2265,16 @@ template struct is_pointer_to_non_const_member_func : std::true_type {}; template -struct is_pointer_to_non_const_member_func +struct is_pointer_to_non_const_member_func : std::true_type {}; template -struct is_pointer_to_non_const_member_func +struct is_pointer_to_non_const_member_func : std::true_type {}; template struct is_const_or_const_ref : std::false_type {}; template -struct is_const_or_const_ref : std::true_type {}; +struct is_const_or_const_ref : std::true_type {}; template struct is_const_or_const_ref : std::true_type {}; #endif @@ -2150,7 +2288,7 @@ template < is_const_or_const_ref::value)>, #endif typename = enable_if_t>::value>, int = 0> -constexpr auto invoke(Fn &&f, Args &&...args) noexcept( +constexpr auto invoke(Fn&& f, Args&&... args) noexcept( noexcept(std::mem_fn(f)(std::forward(args)...))) -> decltype(std::mem_fn(f)(std::forward(args)...)) { return std::mem_fn(f)(std::forward(args)...); @@ -2158,7 +2296,7 @@ constexpr auto invoke(Fn &&f, Args &&...args) noexcept( template >::value>> -constexpr auto invoke(Fn &&f, Args &&...args) noexcept( +constexpr auto invoke(Fn&& f, Args&&... args) noexcept( noexcept(std::forward(f)(std::forward(args)...))) -> decltype(std::forward(f)(std::forward(args)...)) { return std::forward(f)(std::forward(args)...); @@ -2198,7 +2336,7 @@ namespace swap_adl_tests { struct tag {}; template -tag swap(T &, T &); +tag swap(T&, T&); template tag swap(T (&a)[N], T (&b)[N]); @@ -2207,14 +2345,14 @@ tag swap(T (&a)[N], T (&b)[N]); template std::false_type can_swap(...) noexcept(false); template (), std::declval()))> -std::true_type can_swap(int) noexcept(noexcept(swap(std::declval(), - std::declval()))); + class = decltype(swap(std::declval(), std::declval()))> +std::true_type can_swap(int) noexcept(noexcept(swap(std::declval(), + std::declval()))); template std::false_type uses_std(...); template -std::is_same(), std::declval())), tag> +std::is_same(), std::declval())), tag> uses_std(int); template @@ -2271,7 +2409,7 @@ using is_expected = is_expected_impl>; template using expected_enable_forward_value = detail::enable_if_t< - std::is_constructible::value && + std::is_constructible::value && !std::is_same, in_place_t>::value && !std::is_same, detail::decay_t>::value && !std::is_same, detail::decay_t>::value>; @@ -2280,14 +2418,14 @@ template using expected_enable_from_other = detail::enable_if_t< std::is_constructible::value && std::is_constructible::value && - !std::is_constructible &>::value && - !std::is_constructible &&>::value && - !std::is_constructible &>::value && - !std::is_constructible &&>::value && - !std::is_convertible &, T>::value && - !std::is_convertible &&, T>::value && - !std::is_convertible &, T>::value && - !std::is_convertible &&, T>::value>; + !std::is_constructible&>::value && + !std::is_constructible&&>::value && + !std::is_constructible&>::value && + !std::is_constructible&&>::value && + !std::is_convertible&, T>::value && + !std::is_convertible&&, T>::value && + !std::is_convertible&, T>::value && + !std::is_convertible&&, T>::value>; template using is_void_or = conditional_t::value, std::true_type, U>; @@ -2325,29 +2463,29 @@ struct expected_storage_base { constexpr expected_storage_base(no_init_t) : m_no_init(), m_has_val(false) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr expected_storage_base(in_place_t, Args &&...args) + constexpr expected_storage_base(in_place_t, Args&&... args) : m_val(std::forward(args)...), m_has_val(true) {} template &, Args &&...>::value> * = nullptr> + T, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr expected_storage_base(in_place_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_val(il, std::forward(args)...), m_has_val(true) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + constexpr explicit expected_storage_base(unexpect_t, Args&&... args) : m_unexpect(std::forward(args)...), m_has_val(false) {} template &, Args &&...>::value> * = nullptr> + E, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_unexpect(il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() { @@ -2373,29 +2511,29 @@ struct expected_storage_base { constexpr expected_storage_base(no_init_t) : m_no_init(), m_has_val(false) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr expected_storage_base(in_place_t, Args &&...args) + constexpr expected_storage_base(in_place_t, Args&&... args) : m_val(std::forward(args)...), m_has_val(true) {} template &, Args &&...>::value> * = nullptr> + T, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr expected_storage_base(in_place_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_val(il, std::forward(args)...), m_has_val(true) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + constexpr explicit expected_storage_base(unexpect_t, Args&&... args) : m_unexpect(std::forward(args)...), m_has_val(false) {} template &, Args &&...>::value> * = nullptr> + E, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_unexpect(il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() = default; @@ -2415,29 +2553,29 @@ struct expected_storage_base { : m_no_init(), m_has_val(false) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr expected_storage_base(in_place_t, Args &&...args) + constexpr expected_storage_base(in_place_t, Args&&... args) : m_val(std::forward(args)...), m_has_val(true) {} template &, Args &&...>::value> * = nullptr> + T, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr expected_storage_base(in_place_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_val(il, std::forward(args)...), m_has_val(true) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + constexpr explicit expected_storage_base(unexpect_t, Args&&... args) : m_unexpect(std::forward(args)...), m_has_val(false) {} template &, Args &&...>::value> * = nullptr> + E, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_unexpect(il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() { @@ -2461,29 +2599,29 @@ struct expected_storage_base { constexpr expected_storage_base(no_init_t) : m_no_init(), m_has_val(false) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr expected_storage_base(in_place_t, Args &&...args) + constexpr expected_storage_base(in_place_t, Args&&... args) : m_val(std::forward(args)...), m_has_val(true) {} template &, Args &&...>::value> * = nullptr> + T, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr expected_storage_base(in_place_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_val(il, std::forward(args)...), m_has_val(true) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + constexpr explicit expected_storage_base(unexpect_t, Args&&... args) : m_unexpect(std::forward(args)...), m_has_val(false) {} template &, Args &&...>::value> * = nullptr> + E, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_unexpect(il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() { @@ -2514,17 +2652,17 @@ struct expected_storage_base { constexpr expected_storage_base(in_place_t) : m_has_val(true) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + constexpr explicit expected_storage_base(unexpect_t, Args&&... args) : m_unexpect(std::forward(args)...), m_has_val(false) {} template &, Args &&...>::value> * = nullptr> + E, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_unexpect(il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() = default; @@ -2545,17 +2683,17 @@ struct expected_storage_base { constexpr expected_storage_base(in_place_t) : m_dummy(), m_has_val(true) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + constexpr explicit expected_storage_base(unexpect_t, Args&&... args) : m_unexpect(std::forward(args)...), m_has_val(false) {} template &, Args &&...>::value> * = nullptr> + E, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_unexpect(il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() { @@ -2578,20 +2716,20 @@ struct expected_operations_base : expected_storage_base { using expected_storage_base::expected_storage_base; template - void construct(Args &&...args) noexcept { + void construct(Args&&... args) noexcept { new (std::addressof(this->m_val)) T(std::forward(args)...); this->m_has_val = true; } template // NOLINTNEXTLINE(bugprone-exception-escape) - void construct_with(Rhs &&rhs) noexcept { + void construct_with(Rhs&& rhs) noexcept { new (std::addressof(this->m_val)) T(std::forward(rhs).get()); this->m_has_val = true; } template - void construct_error(Args &&...args) noexcept { + void construct_error(Args&&... args) noexcept { new (std::addressof(this->m_unexpect)) unexpected(std::forward(args)...); this->m_has_val = false; @@ -2606,9 +2744,9 @@ struct expected_operations_base : expected_storage_base { // This overload handles the case where we can just copy-construct `T` // directly into place without throwing. template ::value> - * = nullptr> - void assign(const expected_operations_base &rhs) noexcept { + detail::enable_if_t::value>* = + nullptr> + void assign(const expected_operations_base& rhs) noexcept { if (!this->m_has_val && rhs.m_has_val) { geterr().~unexpected(); construct(rhs.get()); @@ -2621,9 +2759,9 @@ struct expected_operations_base : expected_storage_base { // `T`, then no-throw move it into place if the copy was successful. template ::value && - std::is_nothrow_move_constructible::value> - * = nullptr> - void assign(const expected_operations_base &rhs) noexcept { + std::is_nothrow_move_constructible::value>* = + nullptr> + void assign(const expected_operations_base& rhs) noexcept { if (!this->m_has_val && rhs.m_has_val) { T tmp = rhs.get(); geterr().~unexpected(); @@ -2639,10 +2777,10 @@ struct expected_operations_base : expected_storage_base { // then we move the old unexpected value back into place before rethrowing the // exception. template ::value && - !std::is_nothrow_move_constructible::value> - * = nullptr> - void assign(const expected_operations_base &rhs) { + detail::enable_if_t< + !std::is_nothrow_copy_constructible::value && + !std::is_nothrow_move_constructible::value>* = nullptr> + void assign(const expected_operations_base& rhs) { if (!this->m_has_val && rhs.m_has_val) { auto tmp = std::move(geterr()); geterr().~unexpected(); @@ -2664,9 +2802,9 @@ struct expected_operations_base : expected_storage_base { // These overloads do the same as above, but for rvalues template ::value> - * = nullptr> - void assign(expected_operations_base &&rhs) noexcept { + detail::enable_if_t::value>* = + nullptr> + void assign(expected_operations_base&& rhs) noexcept { if (!this->m_has_val && rhs.m_has_val) { geterr().~unexpected(); construct(std::move(rhs).get()); @@ -2676,9 +2814,9 @@ struct expected_operations_base : expected_storage_base { } template ::value> - * = nullptr> - void assign(expected_operations_base &&rhs) { + detail::enable_if_t< + !std::is_nothrow_move_constructible::value>* = nullptr> + void assign(expected_operations_base&& rhs) { if (!this->m_has_val && rhs.m_has_val) { auto tmp = std::move(geterr()); geterr().~unexpected(); @@ -2700,7 +2838,7 @@ struct expected_operations_base : expected_storage_base { #else // If exceptions are disabled then we can just copy-construct - void assign(const expected_operations_base &rhs) noexcept { + void assign(const expected_operations_base& rhs) noexcept { if (!this->m_has_val && rhs.m_has_val) { geterr().~unexpected(); construct(rhs.get()); @@ -2709,7 +2847,7 @@ struct expected_operations_base : expected_storage_base { } } - void assign(expected_operations_base &&rhs) noexcept { + void assign(expected_operations_base&& rhs) noexcept { if (!this->m_has_val && rhs.m_has_val) { geterr().~unexpected(); construct(std::move(rhs).get()); @@ -2722,7 +2860,7 @@ struct expected_operations_base : expected_storage_base { // The common part of move/copy assigning template - void assign_common(Rhs &&rhs) { + void assign_common(Rhs&& rhs) { if (this->m_has_val) { if (rhs.m_has_val) { get() = std::forward(rhs).get(); @@ -2739,22 +2877,22 @@ struct expected_operations_base : expected_storage_base { bool has_value() const { return this->m_has_val; } - TL_EXPECTED_11_CONSTEXPR T &get() & { return this->m_val; } - constexpr const T &get() const & { return this->m_val; } - TL_EXPECTED_11_CONSTEXPR T &&get() && { return std::move(this->m_val); } + TL_EXPECTED_11_CONSTEXPR T& get() & { return this->m_val; } + constexpr const T& get() const& { return this->m_val; } + TL_EXPECTED_11_CONSTEXPR T&& get() && { return std::move(this->m_val); } #ifndef TL_EXPECTED_NO_CONSTRR - constexpr const T &&get() const && { return std::move(this->m_val); } + constexpr const T&& get() const&& { return std::move(this->m_val); } #endif - TL_EXPECTED_11_CONSTEXPR unexpected &geterr() & { + TL_EXPECTED_11_CONSTEXPR unexpected& geterr() & { return this->m_unexpect; } - constexpr const unexpected &geterr() const & { return this->m_unexpect; } - TL_EXPECTED_11_CONSTEXPR unexpected &&geterr() && { + constexpr const unexpected& geterr() const& { return this->m_unexpect; } + TL_EXPECTED_11_CONSTEXPR unexpected&& geterr() && { return std::move(this->m_unexpect); } #ifndef TL_EXPECTED_NO_CONSTRR - constexpr const unexpected &&geterr() const && { + constexpr const unexpected&& geterr() const&& { return std::move(this->m_unexpect); } #endif @@ -2776,19 +2914,19 @@ struct expected_operations_base : expected_storage_base { // This function doesn't use its argument, but needs it so that code in // levels above this can work independently of whether T is void template - void construct_with(Rhs &&) noexcept { + void construct_with(Rhs&&) noexcept { this->m_has_val = true; } template - void construct_error(Args &&...args) noexcept { + void construct_error(Args&&... args) noexcept { new (std::addressof(this->m_unexpect)) unexpected(std::forward(args)...); this->m_has_val = false; } template - void assign(Rhs &&rhs) noexcept { + void assign(Rhs&& rhs) noexcept { if (!this->m_has_val) { if (rhs.m_has_val) { geterr().~unexpected(); @@ -2805,15 +2943,15 @@ struct expected_operations_base : expected_storage_base { bool has_value() const { return this->m_has_val; } - TL_EXPECTED_11_CONSTEXPR unexpected &geterr() & { + TL_EXPECTED_11_CONSTEXPR unexpected& geterr() & { return this->m_unexpect; } - constexpr const unexpected &geterr() const & { return this->m_unexpect; } - TL_EXPECTED_11_CONSTEXPR unexpected &&geterr() && { + constexpr const unexpected& geterr() const& { return this->m_unexpect; } + TL_EXPECTED_11_CONSTEXPR unexpected&& geterr() && { return std::move(this->m_unexpect); } #ifndef TL_EXPECTED_NO_CONSTRR - constexpr const unexpected &&geterr() const && { + constexpr const unexpected&& geterr() const&& { return std::move(this->m_unexpect); } #endif @@ -2839,7 +2977,7 @@ struct expected_copy_base : expected_operations_base { using expected_operations_base::expected_operations_base; expected_copy_base() = default; - expected_copy_base(const expected_copy_base &rhs) + expected_copy_base(const expected_copy_base& rhs) : expected_operations_base(no_init) { if (rhs.has_value()) { this->construct_with(rhs); @@ -2848,9 +2986,9 @@ struct expected_copy_base : expected_operations_base { } } - expected_copy_base(expected_copy_base &&rhs) = default; - expected_copy_base &operator=(const expected_copy_base &rhs) = default; - expected_copy_base &operator=(expected_copy_base &&rhs) = default; + expected_copy_base(expected_copy_base&& rhs) = default; + expected_copy_base& operator=(const expected_copy_base& rhs) = default; + expected_copy_base& operator=(expected_copy_base&& rhs) = default; }; // This class manages conditionally having a trivial move constructor @@ -2875,9 +3013,9 @@ struct expected_move_base : expected_copy_base { using expected_copy_base::expected_copy_base; expected_move_base() = default; - expected_move_base(const expected_move_base &rhs) = default; + expected_move_base(const expected_move_base& rhs) = default; - expected_move_base(expected_move_base &&rhs) noexcept( + expected_move_base(expected_move_base&& rhs) noexcept( std::is_nothrow_move_constructible::value) : expected_copy_base(no_init) { if (rhs.has_value()) { @@ -2886,8 +3024,8 @@ struct expected_move_base : expected_copy_base { this->construct_error(std::move(rhs.geterr())); } } - expected_move_base &operator=(const expected_move_base &rhs) = default; - expected_move_base &operator=(expected_move_base &&rhs) = default; + expected_move_base& operator=(const expected_move_base& rhs) = default; + expected_move_base& operator=(expected_move_base&& rhs) = default; }; // This class manages conditionally having a trivial copy assignment operator @@ -2910,14 +3048,14 @@ struct expected_copy_assign_base : expected_move_base { using expected_move_base::expected_move_base; expected_copy_assign_base() = default; - expected_copy_assign_base(const expected_copy_assign_base &rhs) = default; + expected_copy_assign_base(const expected_copy_assign_base& rhs) = default; - expected_copy_assign_base(expected_copy_assign_base &&rhs) = default; - expected_copy_assign_base &operator=(const expected_copy_assign_base &rhs) { + expected_copy_assign_base(expected_copy_assign_base&& rhs) = default; + expected_copy_assign_base& operator=(const expected_copy_assign_base& rhs) { this->assign(rhs); return *this; } - expected_copy_assign_base &operator=(expected_copy_assign_base &&rhs) = + expected_copy_assign_base& operator=(expected_copy_assign_base&& rhs) = default; }; @@ -2950,17 +3088,17 @@ struct expected_move_assign_base using expected_copy_assign_base::expected_copy_assign_base; expected_move_assign_base() = default; - expected_move_assign_base(const expected_move_assign_base &rhs) = default; + expected_move_assign_base(const expected_move_assign_base& rhs) = default; - expected_move_assign_base(expected_move_assign_base &&rhs) = default; + expected_move_assign_base(expected_move_assign_base&& rhs) = default; - expected_move_assign_base &operator=(const expected_move_assign_base &rhs) = + expected_move_assign_base& operator=(const expected_move_assign_base& rhs) = default; - expected_move_assign_base &operator=( - expected_move_assign_base - &&rhs) noexcept(std::is_nothrow_move_constructible::value && - std::is_nothrow_move_assignable::value) { + expected_move_assign_base& + operator=(expected_move_assign_base&& rhs) noexcept( + std::is_nothrow_move_constructible::value && + std::is_nothrow_move_assignable::value) { this->assign(std::move(rhs)); return *this; } @@ -2975,44 +3113,44 @@ template ::value)> struct expected_delete_ctor_base { expected_delete_ctor_base() = default; - expected_delete_ctor_base(const expected_delete_ctor_base &) = default; - expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept = default; - expected_delete_ctor_base &operator=(const expected_delete_ctor_base &) = + expected_delete_ctor_base(const expected_delete_ctor_base&) = default; + expected_delete_ctor_base(expected_delete_ctor_base&&) noexcept = default; + expected_delete_ctor_base& operator=(const expected_delete_ctor_base&) = default; - expected_delete_ctor_base &operator=(expected_delete_ctor_base &&) noexcept = + expected_delete_ctor_base& operator=(expected_delete_ctor_base&&) noexcept = default; }; template struct expected_delete_ctor_base { expected_delete_ctor_base() = default; - expected_delete_ctor_base(const expected_delete_ctor_base &) = default; - expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept = delete; - expected_delete_ctor_base &operator=(const expected_delete_ctor_base &) = + expected_delete_ctor_base(const expected_delete_ctor_base&) = default; + expected_delete_ctor_base(expected_delete_ctor_base&&) noexcept = delete; + expected_delete_ctor_base& operator=(const expected_delete_ctor_base&) = default; - expected_delete_ctor_base &operator=(expected_delete_ctor_base &&) noexcept = + expected_delete_ctor_base& operator=(expected_delete_ctor_base&&) noexcept = default; }; template struct expected_delete_ctor_base { expected_delete_ctor_base() = default; - expected_delete_ctor_base(const expected_delete_ctor_base &) = delete; - expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept = default; - expected_delete_ctor_base &operator=(const expected_delete_ctor_base &) = + expected_delete_ctor_base(const expected_delete_ctor_base&) = delete; + expected_delete_ctor_base(expected_delete_ctor_base&&) noexcept = default; + expected_delete_ctor_base& operator=(const expected_delete_ctor_base&) = default; - expected_delete_ctor_base &operator=(expected_delete_ctor_base &&) noexcept = + expected_delete_ctor_base& operator=(expected_delete_ctor_base&&) noexcept = default; }; template struct expected_delete_ctor_base { expected_delete_ctor_base() = default; - expected_delete_ctor_base(const expected_delete_ctor_base &) = delete; - expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept = delete; - expected_delete_ctor_base &operator=(const expected_delete_ctor_base &) = + expected_delete_ctor_base(const expected_delete_ctor_base&) = delete; + expected_delete_ctor_base(expected_delete_ctor_base&&) noexcept = delete; + expected_delete_ctor_base& operator=(const expected_delete_ctor_base&) = default; - expected_delete_ctor_base &operator=(expected_delete_ctor_base &&) noexcept = + expected_delete_ctor_base& operator=(expected_delete_ctor_base&&) noexcept = default; }; @@ -3030,49 +3168,45 @@ template ::value)> struct expected_delete_assign_base { expected_delete_assign_base() = default; - expected_delete_assign_base(const expected_delete_assign_base &) = default; - expected_delete_assign_base(expected_delete_assign_base &&) noexcept = + expected_delete_assign_base(const expected_delete_assign_base&) = default; + expected_delete_assign_base(expected_delete_assign_base&&) noexcept = default; + expected_delete_assign_base& operator=(const expected_delete_assign_base&) = default; - expected_delete_assign_base &operator=(const expected_delete_assign_base &) = - default; - expected_delete_assign_base &operator=( - expected_delete_assign_base &&) noexcept = default; + expected_delete_assign_base& operator=( + expected_delete_assign_base&&) noexcept = default; }; template struct expected_delete_assign_base { expected_delete_assign_base() = default; - expected_delete_assign_base(const expected_delete_assign_base &) = default; - expected_delete_assign_base(expected_delete_assign_base &&) noexcept = - default; - expected_delete_assign_base &operator=(const expected_delete_assign_base &) = + expected_delete_assign_base(const expected_delete_assign_base&) = default; + expected_delete_assign_base(expected_delete_assign_base&&) noexcept = default; + expected_delete_assign_base& operator=(const expected_delete_assign_base&) = default; - expected_delete_assign_base &operator=( - expected_delete_assign_base &&) noexcept = delete; + expected_delete_assign_base& operator=( + expected_delete_assign_base&&) noexcept = delete; }; template struct expected_delete_assign_base { expected_delete_assign_base() = default; - expected_delete_assign_base(const expected_delete_assign_base &) = default; - expected_delete_assign_base(expected_delete_assign_base &&) noexcept = - default; - expected_delete_assign_base &operator=(const expected_delete_assign_base &) = + expected_delete_assign_base(const expected_delete_assign_base&) = default; + expected_delete_assign_base(expected_delete_assign_base&&) noexcept = default; + expected_delete_assign_base& operator=(const expected_delete_assign_base&) = delete; - expected_delete_assign_base &operator=( - expected_delete_assign_base &&) noexcept = default; + expected_delete_assign_base& operator=( + expected_delete_assign_base&&) noexcept = default; }; template struct expected_delete_assign_base { expected_delete_assign_base() = default; - expected_delete_assign_base(const expected_delete_assign_base &) = default; - expected_delete_assign_base(expected_delete_assign_base &&) noexcept = - default; - expected_delete_assign_base &operator=(const expected_delete_assign_base &) = + expected_delete_assign_base(const expected_delete_assign_base&) = default; + expected_delete_assign_base(expected_delete_assign_base&&) noexcept = default; + expected_delete_assign_base& operator=(const expected_delete_assign_base&) = delete; - expected_delete_assign_base &operator=( - expected_delete_assign_base &&) noexcept = delete; + expected_delete_assign_base& operator=( + expected_delete_assign_base&&) noexcept = delete; }; // This is needed to be able to construct the expected_default_ctor_base which @@ -3090,13 +3224,13 @@ template struct expected_default_ctor_base { constexpr expected_default_ctor_base() noexcept = delete; constexpr expected_default_ctor_base( - expected_default_ctor_base const &) noexcept = default; - constexpr expected_default_ctor_base(expected_default_ctor_base &&) noexcept = + expected_default_ctor_base const&) noexcept = default; + constexpr expected_default_ctor_base(expected_default_ctor_base&&) noexcept = + default; + expected_default_ctor_base& operator=( + expected_default_ctor_base const&) noexcept = default; + expected_default_ctor_base& operator=(expected_default_ctor_base&&) noexcept = default; - expected_default_ctor_base &operator=( - expected_default_ctor_base const &) noexcept = default; - expected_default_ctor_base &operator=( - expected_default_ctor_base &&) noexcept = default; constexpr explicit expected_default_ctor_base(default_constructor_tag) {} }; @@ -3123,14 +3257,14 @@ class bad_expected_access : public std::exception { public: explicit bad_expected_access(E e) : m_val(std::move(e)) {} - virtual const char *what() const noexcept override { + virtual const char* what() const noexcept override { return "Bad expected access"; } - const E &error() const & { return m_val; } - E &error() & { return m_val; } - const E &&error() const && { return std::move(m_val); } - E &&error() && { return std::move(m_val); } + const E& error() const& { return m_val; } + E& error() & { return m_val; } + const E&& error() const&& { return std::move(m_val); } + E&& error() && { return std::move(m_val); } private: E m_val; @@ -3158,26 +3292,26 @@ class expected : private detail::expected_move_assign_base, "T must not be unexpected"); static_assert(!std::is_reference::value, "E must not be a reference"); - T *valptr() { return std::addressof(this->m_val); } - const T *valptr() const { return std::addressof(this->m_val); } - unexpected *errptr() { return std::addressof(this->m_unexpect); } - const unexpected *errptr() const { + T* valptr() { return std::addressof(this->m_val); } + const T* valptr() const { return std::addressof(this->m_val); } + unexpected* errptr() { return std::addressof(this->m_unexpect); } + const unexpected* errptr() const { return std::addressof(this->m_unexpect); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR U &val() { + detail::enable_if_t::value>* = nullptr> + TL_EXPECTED_11_CONSTEXPR U& val() { return this->m_val; } - TL_EXPECTED_11_CONSTEXPR unexpected &err() { return this->m_unexpect; } + TL_EXPECTED_11_CONSTEXPR unexpected& err() { return this->m_unexpect; } template ::value> * = nullptr> - constexpr const U &val() const { + detail::enable_if_t::value>* = nullptr> + constexpr const U& val() const { return this->m_val; } - constexpr const unexpected &err() const { return this->m_unexpect; } + constexpr const unexpected& err() const { return this->m_unexpect; } using impl_base = detail::expected_move_assign_base; using ctor_base = detail::expected_default_ctor_base; @@ -3190,46 +3324,46 @@ class expected : private detail::expected_move_assign_base, #if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) template - TL_EXPECTED_11_CONSTEXPR auto and_then(F &&f) & { + TL_EXPECTED_11_CONSTEXPR auto and_then(F&& f) & { return and_then_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR auto and_then(F &&f) && { + TL_EXPECTED_11_CONSTEXPR auto and_then(F&& f) && { return and_then_impl(std::move(*this), std::forward(f)); } template - constexpr auto and_then(F &&f) const & { + constexpr auto and_then(F&& f) const& { return and_then_impl(*this, std::forward(f)); } #ifndef TL_EXPECTED_NO_CONSTRR template - constexpr auto and_then(F &&f) const && { + constexpr auto and_then(F&& f) const&& { return and_then_impl(std::move(*this), std::forward(f)); } #endif #else template - TL_EXPECTED_11_CONSTEXPR auto and_then(F &&f) & -> decltype(and_then_impl( - std::declval(), std::forward(f))) { + TL_EXPECTED_11_CONSTEXPR auto and_then(F&& f) & -> decltype(and_then_impl( + std::declval(), std::forward(f))) { return and_then_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR auto and_then(F &&f) && -> decltype(and_then_impl( - std::declval(), std::forward(f))) { + TL_EXPECTED_11_CONSTEXPR auto and_then(F&& f) && -> decltype(and_then_impl( + std::declval(), std::forward(f))) { return and_then_impl(std::move(*this), std::forward(f)); } template - constexpr auto and_then(F &&f) const & -> decltype(and_then_impl( - std::declval(), std::forward(f))) { + constexpr auto and_then(F&& f) const& -> decltype(and_then_impl( + std::declval(), std::forward(f))) { return and_then_impl(*this, std::forward(f)); } #ifndef TL_EXPECTED_NO_CONSTRR template - constexpr auto and_then(F &&f) const && -> decltype(and_then_impl( - std::declval(), std::forward(f))) { + constexpr auto and_then(F&& f) const&& -> decltype(and_then_impl( + std::declval(), std::forward(f))) { return and_then_impl(std::move(*this), std::forward(f)); } #endif @@ -3238,46 +3372,45 @@ class expected : private detail::expected_move_assign_base, #if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) template - TL_EXPECTED_11_CONSTEXPR auto map(F &&f) & { + TL_EXPECTED_11_CONSTEXPR auto map(F&& f) & { return expected_map_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR auto map(F &&f) && { + TL_EXPECTED_11_CONSTEXPR auto map(F&& f) && { return expected_map_impl(std::move(*this), std::forward(f)); } template - constexpr auto map(F &&f) const & { + constexpr auto map(F&& f) const& { return expected_map_impl(*this, std::forward(f)); } template - constexpr auto map(F &&f) const && { + constexpr auto map(F&& f) const&& { return expected_map_impl(std::move(*this), std::forward(f)); } #else template TL_EXPECTED_11_CONSTEXPR decltype(expected_map_impl( - std::declval(), std::declval())) - map(F &&f) & { + std::declval(), std::declval())) map(F&& f) & { return expected_map_impl(*this, std::forward(f)); } template TL_EXPECTED_11_CONSTEXPR decltype(expected_map_impl(std::declval(), - std::declval())) - map(F &&f) && { + std::declval())) + map(F&& f) && { return expected_map_impl(std::move(*this), std::forward(f)); } template - constexpr decltype(expected_map_impl(std::declval(), - std::declval())) - map(F &&f) const & { + constexpr decltype(expected_map_impl(std::declval(), + std::declval())) + map(F&& f) const& { return expected_map_impl(*this, std::forward(f)); } #ifndef TL_EXPECTED_NO_CONSTRR template - constexpr decltype(expected_map_impl(std::declval(), - std::declval())) - map(F &&f) const && { + constexpr decltype(expected_map_impl(std::declval(), + std::declval())) map(F&& f) + const&& { return expected_map_impl(std::move(*this), std::forward(f)); } #endif @@ -3286,46 +3419,45 @@ class expected : private detail::expected_move_assign_base, #if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) template - TL_EXPECTED_11_CONSTEXPR auto transform(F &&f) & { + TL_EXPECTED_11_CONSTEXPR auto transform(F&& f) & { return expected_map_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR auto transform(F &&f) && { + TL_EXPECTED_11_CONSTEXPR auto transform(F&& f) && { return expected_map_impl(std::move(*this), std::forward(f)); } template - constexpr auto transform(F &&f) const & { + constexpr auto transform(F&& f) const& { return expected_map_impl(*this, std::forward(f)); } template - constexpr auto transform(F &&f) const && { + constexpr auto transform(F&& f) const&& { return expected_map_impl(std::move(*this), std::forward(f)); } #else template TL_EXPECTED_11_CONSTEXPR decltype(expected_map_impl( - std::declval(), std::declval())) - transform(F &&f) & { + std::declval(), std::declval())) transform(F&& f) & { return expected_map_impl(*this, std::forward(f)); } template TL_EXPECTED_11_CONSTEXPR decltype(expected_map_impl(std::declval(), - std::declval())) - transform(F &&f) && { + std::declval())) + transform(F&& f) && { return expected_map_impl(std::move(*this), std::forward(f)); } template - constexpr decltype(expected_map_impl(std::declval(), - std::declval())) - transform(F &&f) const & { + constexpr decltype(expected_map_impl(std::declval(), + std::declval())) + transform(F&& f) const& { return expected_map_impl(*this, std::forward(f)); } #ifndef TL_EXPECTED_NO_CONSTRR template - constexpr decltype(expected_map_impl(std::declval(), - std::declval())) - transform(F &&f) const && { + constexpr decltype(expected_map_impl(std::declval(), + std::declval())) transform(F&& f) + const&& { return expected_map_impl(std::move(*this), std::forward(f)); } #endif @@ -3334,46 +3466,45 @@ class expected : private detail::expected_move_assign_base, #if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) template - TL_EXPECTED_11_CONSTEXPR auto map_error(F &&f) & { + TL_EXPECTED_11_CONSTEXPR auto map_error(F&& f) & { return map_error_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR auto map_error(F &&f) && { + TL_EXPECTED_11_CONSTEXPR auto map_error(F&& f) && { return map_error_impl(std::move(*this), std::forward(f)); } template - constexpr auto map_error(F &&f) const & { + constexpr auto map_error(F&& f) const& { return map_error_impl(*this, std::forward(f)); } template - constexpr auto map_error(F &&f) const && { + constexpr auto map_error(F&& f) const&& { return map_error_impl(std::move(*this), std::forward(f)); } #else template - TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), - std::declval())) - map_error(F &&f) & { + TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl( + std::declval(), std::declval())) map_error(F&& f) & { return map_error_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), - std::declval())) - map_error(F &&f) && { + TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), + std::declval())) + map_error(F&& f) && { return map_error_impl(std::move(*this), std::forward(f)); } template - constexpr decltype(map_error_impl(std::declval(), - std::declval())) - map_error(F &&f) const & { + constexpr decltype(map_error_impl(std::declval(), + std::declval())) + map_error(F&& f) const& { return map_error_impl(*this, std::forward(f)); } #ifndef TL_EXPECTED_NO_CONSTRR template - constexpr decltype(map_error_impl(std::declval(), - std::declval())) - map_error(F &&f) const && { + constexpr decltype(map_error_impl(std::declval(), + std::declval())) map_error(F&& f) + const&& { return map_error_impl(std::move(*this), std::forward(f)); } #endif @@ -3381,149 +3512,147 @@ class expected : private detail::expected_move_assign_base, #if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) template - TL_EXPECTED_11_CONSTEXPR auto transform_error(F &&f) & { + TL_EXPECTED_11_CONSTEXPR auto transform_error(F&& f) & { return map_error_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR auto transform_error(F &&f) && { + TL_EXPECTED_11_CONSTEXPR auto transform_error(F&& f) && { return map_error_impl(std::move(*this), std::forward(f)); } template - constexpr auto transform_error(F &&f) const & { + constexpr auto transform_error(F&& f) const& { return map_error_impl(*this, std::forward(f)); } template - constexpr auto transform_error(F &&f) const && { + constexpr auto transform_error(F&& f) const&& { return map_error_impl(std::move(*this), std::forward(f)); } #else template - TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), - std::declval())) - transform_error(F &&f) & { + TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl( + std::declval(), + std::declval())) transform_error(F&& f) & { return map_error_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), - std::declval())) - transform_error(F &&f) && { + TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), + std::declval())) + transform_error(F&& f) && { return map_error_impl(std::move(*this), std::forward(f)); } template - constexpr decltype(map_error_impl(std::declval(), - std::declval())) - transform_error(F &&f) const & { + constexpr decltype(map_error_impl(std::declval(), + std::declval())) + transform_error(F&& f) const& { return map_error_impl(*this, std::forward(f)); } #ifndef TL_EXPECTED_NO_CONSTRR template - constexpr decltype(map_error_impl(std::declval(), - std::declval())) - transform_error(F &&f) const && { + constexpr decltype(map_error_impl(std::declval(), + std::declval())) transform_error(F&& f) + const&& { return map_error_impl(std::move(*this), std::forward(f)); } #endif #endif template - expected TL_EXPECTED_11_CONSTEXPR or_else(F &&f) & { + expected TL_EXPECTED_11_CONSTEXPR or_else(F&& f) & { return or_else_impl(*this, std::forward(f)); } template - expected TL_EXPECTED_11_CONSTEXPR or_else(F &&f) && { + expected TL_EXPECTED_11_CONSTEXPR or_else(F&& f) && { return or_else_impl(std::move(*this), std::forward(f)); } template - expected constexpr or_else(F &&f) const & { + expected constexpr or_else(F&& f) const& { return or_else_impl(*this, std::forward(f)); } #ifndef TL_EXPECTED_NO_CONSTRR template - expected constexpr or_else(F &&f) const && { + expected constexpr or_else(F&& f) const&& { return or_else_impl(std::move(*this), std::forward(f)); } #endif constexpr expected() = default; - constexpr expected(const expected &rhs) = default; - constexpr expected(expected &&rhs) = default; - expected &operator=(const expected &rhs) = default; - expected &operator=(expected &&rhs) = default; + constexpr expected(const expected& rhs) = default; + constexpr expected(expected&& rhs) = default; + expected& operator=(const expected& rhs) = default; + expected& operator=(expected&& rhs) = default; template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr expected(in_place_t, Args &&...args) + constexpr expected(in_place_t, Args&&... args) : impl_base(in_place, std::forward(args)...), ctor_base(detail::default_constructor_tag{}) {} template &, Args &&...>::value> * = nullptr> - constexpr expected(in_place_t, std::initializer_list il, Args &&...args) + T, std::initializer_list&, Args&&...>::value>* = nullptr> + constexpr expected(in_place_t, std::initializer_list il, Args&&... args) : impl_base(in_place, il, std::forward(args)...), ctor_base(detail::default_constructor_tag{}) {} - template ::value> * = - nullptr, - detail::enable_if_t::value> * = - nullptr> - explicit constexpr expected(const unexpected &e) + template < + class G = E, + detail::enable_if_t::value>* = nullptr, + detail::enable_if_t::value>* = nullptr> + explicit constexpr expected(const unexpected& e) : impl_base(unexpect, e.value()), ctor_base(detail::default_constructor_tag{}) {} template < class G = E, - detail::enable_if_t::value> * = - nullptr, - detail::enable_if_t::value> * = nullptr> - constexpr expected(unexpected const &e) + detail::enable_if_t::value>* = nullptr, + detail::enable_if_t::value>* = nullptr> + constexpr expected(unexpected const& e) : impl_base(unexpect, e.value()), ctor_base(detail::default_constructor_tag{}) {} template < class G = E, - detail::enable_if_t::value> * = nullptr, - detail::enable_if_t::value> * = nullptr> - explicit constexpr expected(unexpected &&e) noexcept( - std::is_nothrow_constructible::value) + detail::enable_if_t::value>* = nullptr, + detail::enable_if_t::value>* = nullptr> + explicit constexpr expected(unexpected&& e) noexcept( + std::is_nothrow_constructible::value) : impl_base(unexpect, std::move(e.value())), ctor_base(detail::default_constructor_tag{}) {} template < class G = E, - detail::enable_if_t::value> * = nullptr, - detail::enable_if_t::value> * = nullptr> - constexpr expected(unexpected &&e) noexcept( - std::is_nothrow_constructible::value) + detail::enable_if_t::value>* = nullptr, + detail::enable_if_t::value>* = nullptr> + constexpr expected(unexpected&& e) noexcept( + std::is_nothrow_constructible::value) : impl_base(unexpect, std::move(e.value())), ctor_base(detail::default_constructor_tag{}) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr explicit expected(unexpect_t, Args &&...args) + constexpr explicit expected(unexpect_t, Args&&... args) : impl_base(unexpect, std::forward(args)...), ctor_base(detail::default_constructor_tag{}) {} template &, Args &&...>::value> * = nullptr> + E, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr explicit expected(unexpect_t, std::initializer_list il, - Args &&...args) + Args&&... args) : impl_base(unexpect, il, std::forward(args)...), ctor_base(detail::default_constructor_tag{}) {} template ::value && - std::is_convertible::value)> * = + detail::enable_if_t::value && + std::is_convertible::value)>* = nullptr, - detail::expected_enable_from_other - * = nullptr> - explicit TL_EXPECTED_11_CONSTEXPR expected(const expected &rhs) + detail::expected_enable_from_other* = nullptr> + explicit TL_EXPECTED_11_CONSTEXPR expected(const expected& rhs) : ctor_base(detail::default_constructor_tag{}) { if (rhs.has_value()) { this->construct(*rhs); @@ -3532,13 +3661,13 @@ class expected : private detail::expected_move_assign_base, } } - template ::value && - std::is_convertible::value)> * = - nullptr, - detail::expected_enable_from_other - * = nullptr> - TL_EXPECTED_11_CONSTEXPR expected(const expected &rhs) + template < + class U, class G, + detail::enable_if_t<(std::is_convertible::value && + std::is_convertible::value)>* = nullptr, + detail::expected_enable_from_other* = + nullptr> + TL_EXPECTED_11_CONSTEXPR expected(const expected& rhs) : ctor_base(detail::default_constructor_tag{}) { if (rhs.has_value()) { this->construct(*rhs); @@ -3549,10 +3678,10 @@ class expected : private detail::expected_move_assign_base, template < class U, class G, - detail::enable_if_t::value && - std::is_convertible::value)> * = nullptr, - detail::expected_enable_from_other * = nullptr> - explicit TL_EXPECTED_11_CONSTEXPR expected(expected &&rhs) + detail::enable_if_t::value && + std::is_convertible::value)>* = nullptr, + detail::expected_enable_from_other* = nullptr> + explicit TL_EXPECTED_11_CONSTEXPR expected(expected&& rhs) : ctor_base(detail::default_constructor_tag{}) { if (rhs.has_value()) { this->construct(std::move(*rhs)); @@ -3563,10 +3692,10 @@ class expected : private detail::expected_move_assign_base, template < class U, class G, - detail::enable_if_t<(std::is_convertible::value && - std::is_convertible::value)> * = nullptr, - detail::expected_enable_from_other * = nullptr> - TL_EXPECTED_11_CONSTEXPR expected(expected &&rhs) + detail::enable_if_t<(std::is_convertible::value && + std::is_convertible::value)>* = nullptr, + detail::expected_enable_from_other* = nullptr> + TL_EXPECTED_11_CONSTEXPR expected(expected&& rhs) : ctor_base(detail::default_constructor_tag{}) { if (rhs.has_value()) { this->construct(std::move(*rhs)); @@ -3575,33 +3704,31 @@ class expected : private detail::expected_move_assign_base, } } - template < - class U = T, - detail::enable_if_t::value> * = nullptr, - detail::expected_enable_forward_value * = nullptr> - explicit TL_EXPECTED_MSVC2015_CONSTEXPR expected(U &&v) + template ::value>* = nullptr, + detail::expected_enable_forward_value* = nullptr> + explicit TL_EXPECTED_MSVC2015_CONSTEXPR expected(U&& v) : expected(in_place, std::forward(v)) {} - template < - class U = T, - detail::enable_if_t::value> * = nullptr, - detail::expected_enable_forward_value * = nullptr> - TL_EXPECTED_MSVC2015_CONSTEXPR expected(U &&v) + template ::value>* = nullptr, + detail::expected_enable_forward_value* = nullptr> + TL_EXPECTED_MSVC2015_CONSTEXPR expected(U&& v) : expected(in_place, std::forward(v)) {} template < class U = T, class G = T, - detail::enable_if_t::value> * = + detail::enable_if_t::value>* = nullptr, - detail::enable_if_t::value> * = nullptr, + detail::enable_if_t::value>* = nullptr, detail::enable_if_t< (!std::is_same, detail::decay_t>::value && !detail::conjunction, std::is_same>>::value && std::is_constructible::value && - std::is_assignable::value && - std::is_nothrow_move_constructible::value)> * = nullptr> - expected &operator=(U &&v) { + std::is_assignable::value && + std::is_nothrow_move_constructible::value)>* = nullptr> + expected& operator=(U&& v) { if (has_value()) { val() = std::forward(v); } else { @@ -3615,17 +3742,17 @@ class expected : private detail::expected_move_assign_base, template < class U = T, class G = T, - detail::enable_if_t::value> * = + detail::enable_if_t::value>* = nullptr, - detail::enable_if_t::value> * = nullptr, + detail::enable_if_t::value>* = nullptr, detail::enable_if_t< (!std::is_same, detail::decay_t>::value && !detail::conjunction, std::is_same>>::value && std::is_constructible::value && - std::is_assignable::value && - std::is_nothrow_move_constructible::value)> * = nullptr> - expected &operator=(U &&v) { + std::is_assignable::value && + std::is_nothrow_move_constructible::value)>* = nullptr> + expected& operator=(U&& v) { if (has_value()) { val() = std::forward(v); } else { @@ -3651,8 +3778,8 @@ class expected : private detail::expected_move_assign_base, template ::value && - std::is_assignable::value> * = nullptr> - expected &operator=(const unexpected &rhs) { + std::is_assignable::value>* = nullptr> + expected& operator=(const unexpected& rhs) { if (!has_value()) { err() = rhs; } else { @@ -3666,8 +3793,8 @@ class expected : private detail::expected_move_assign_base, template ::value && - std::is_move_assignable::value> * = nullptr> - expected &operator=(unexpected &&rhs) noexcept { + std::is_move_assignable::value>* = nullptr> + expected& operator=(unexpected&& rhs) noexcept { if (!has_value()) { err() = std::move(rhs); } else { @@ -3680,8 +3807,8 @@ class expected : private detail::expected_move_assign_base, } template ::value> * = nullptr> - void emplace(Args &&...args) { + T, Args&&...>::value>* = nullptr> + void emplace(Args&&... args) { if (has_value()) { val().~T(); } else { @@ -3692,8 +3819,8 @@ class expected : private detail::expected_move_assign_base, } template ::value> * = nullptr> - void emplace(Args &&...args) { + T, Args&&...>::value>* = nullptr> + void emplace(Args&&... args) { if (has_value()) { val().~T(); ::new (valptr()) T(std::forward(args)...); @@ -3718,8 +3845,8 @@ class expected : private detail::expected_move_assign_base, template &, Args &&...>::value> * = nullptr> - void emplace(std::initializer_list il, Args &&...args) { + T, std::initializer_list&, Args&&...>::value>* = nullptr> + void emplace(std::initializer_list il, Args&&... args) { if (has_value()) { T t(il, std::forward(args)...); val() = std::move(t); @@ -3732,8 +3859,8 @@ class expected : private detail::expected_move_assign_base, template &, Args &&...>::value> * = nullptr> - void emplace(std::initializer_list il, Args &&...args) { + T, std::initializer_list&, Args&&...>::value>* = nullptr> + void emplace(std::initializer_list il, Args&&... args) { if (has_value()) { T t(il, std::forward(args)...); val() = std::move(t); @@ -3764,30 +3891,30 @@ class expected : private detail::expected_move_assign_base, using e_is_nothrow_move_constructible = std::true_type; using move_constructing_e_can_throw = std::false_type; - void swap_where_both_have_value(expected & /*rhs*/, t_is_void) noexcept { + void swap_where_both_have_value(expected& /*rhs*/, t_is_void) noexcept { // swapping void is a no-op } - void swap_where_both_have_value(expected &rhs, t_is_not_void) { + void swap_where_both_have_value(expected& rhs, t_is_not_void) { using std::swap; swap(val(), rhs.val()); } - void swap_where_only_one_has_value(expected &rhs, t_is_void) noexcept( + void swap_where_only_one_has_value(expected& rhs, t_is_void) noexcept( std::is_nothrow_move_constructible::value) { ::new (errptr()) unexpected_type(std::move(rhs.err())); rhs.err().~unexpected_type(); std::swap(this->m_has_val, rhs.m_has_val); } - void swap_where_only_one_has_value(expected &rhs, t_is_not_void) { + void swap_where_only_one_has_value(expected& rhs, t_is_not_void) { swap_where_only_one_has_value_and_t_is_not_void( rhs, typename std::is_nothrow_move_constructible::type{}, typename std::is_nothrow_move_constructible::type{}); } void swap_where_only_one_has_value_and_t_is_not_void( - expected &rhs, t_is_nothrow_move_constructible, + expected& rhs, t_is_nothrow_move_constructible, e_is_nothrow_move_constructible) noexcept { auto temp = std::move(val()); val().~T(); @@ -3798,7 +3925,7 @@ class expected : private detail::expected_move_assign_base, } void swap_where_only_one_has_value_and_t_is_not_void( - expected &rhs, t_is_nothrow_move_constructible, + expected& rhs, t_is_nothrow_move_constructible, move_constructing_e_can_throw) { auto temp = std::move(val()); val().~T(); @@ -3821,7 +3948,7 @@ class expected : private detail::expected_move_assign_base, } void swap_where_only_one_has_value_and_t_is_not_void( - expected &rhs, move_constructing_t_can_throw, + expected& rhs, move_constructing_t_can_throw, e_is_nothrow_move_constructible) { auto temp = std::move(rhs.err()); rhs.err().~unexpected_type(); @@ -3849,7 +3976,7 @@ class expected : private detail::expected_move_assign_base, detail::is_swappable::value && (std::is_nothrow_move_constructible::value || std::is_nothrow_move_constructible::value)> - swap(expected &rhs) noexcept(std::is_nothrow_move_constructible::value && + swap(expected& rhs) noexcept(std::is_nothrow_move_constructible::value && detail::is_nothrow_swappable::value && std::is_nothrow_move_constructible::value && detail::is_nothrow_swappable::value) { @@ -3865,36 +3992,36 @@ class expected : private detail::expected_move_assign_base, } } - constexpr const T *operator->() const { + constexpr const T* operator->() const { TL_ASSERT(has_value()); return valptr(); } - TL_EXPECTED_11_CONSTEXPR T *operator->() { + TL_EXPECTED_11_CONSTEXPR T* operator->() { TL_ASSERT(has_value()); return valptr(); } template ::value> * = nullptr> - constexpr const U &operator*() const & { + detail::enable_if_t::value>* = nullptr> + constexpr const U& operator*() const& { TL_ASSERT(has_value()); return val(); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR U &operator*() & { + detail::enable_if_t::value>* = nullptr> + TL_EXPECTED_11_CONSTEXPR U& operator*() & { TL_ASSERT(has_value()); return val(); } template ::value> * = nullptr> - constexpr const U &&operator*() const && { + detail::enable_if_t::value>* = nullptr> + constexpr const U&& operator*() const&& { TL_ASSERT(has_value()); return std::move(val()); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR U &&operator*() && { + detail::enable_if_t::value>* = nullptr> + TL_EXPECTED_11_CONSTEXPR U&& operator*() && { TL_ASSERT(has_value()); return std::move(val()); } @@ -3903,62 +4030,62 @@ class expected : private detail::expected_move_assign_base, constexpr explicit operator bool() const noexcept { return this->m_has_val; } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR const U &value() const & { + detail::enable_if_t::value>* = nullptr> + TL_EXPECTED_11_CONSTEXPR const U& value() const& { if (!has_value()) detail::throw_exception(bad_expected_access(err().value())); return val(); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR U &value() & { + detail::enable_if_t::value>* = nullptr> + TL_EXPECTED_11_CONSTEXPR U& value() & { if (!has_value()) detail::throw_exception(bad_expected_access(err().value())); return val(); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR const U &&value() const && { + detail::enable_if_t::value>* = nullptr> + TL_EXPECTED_11_CONSTEXPR const U&& value() const&& { if (!has_value()) detail::throw_exception(bad_expected_access(std::move(err()).value())); return std::move(val()); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR U &&value() && { + detail::enable_if_t::value>* = nullptr> + TL_EXPECTED_11_CONSTEXPR U&& value() && { if (!has_value()) detail::throw_exception(bad_expected_access(std::move(err()).value())); return std::move(val()); } - constexpr const E &error() const & { + constexpr const E& error() const& { TL_ASSERT(!has_value()); return err().value(); } - TL_EXPECTED_11_CONSTEXPR E &error() & { + TL_EXPECTED_11_CONSTEXPR E& error() & { TL_ASSERT(!has_value()); return err().value(); } - constexpr const E &&error() const && { + constexpr const E&& error() const&& { TL_ASSERT(!has_value()); return std::move(err().value()); } - TL_EXPECTED_11_CONSTEXPR E &&error() && { + TL_EXPECTED_11_CONSTEXPR E&& error() && { TL_ASSERT(!has_value()); return std::move(err().value()); } template - constexpr T value_or(U &&v) const & { + constexpr T value_or(U&& v) const& { static_assert(std::is_copy_constructible::value && - std::is_convertible::value, + std::is_convertible::value, "T must be copy-constructible and convertible to from U&&"); return bool(*this) ? **this : static_cast(std::forward(v)); } template - TL_EXPECTED_11_CONSTEXPR T value_or(U &&v) && { + TL_EXPECTED_11_CONSTEXPR T value_or(U&& v) && { static_assert(std::is_move_constructible::value && - std::is_convertible::value, + std::is_convertible::value, "T must be move-constructible and convertible to from U&&"); return bool(*this) ? std::move(**this) : static_cast(std::forward(v)); } @@ -3974,10 +4101,10 @@ using ret_t = expected>; #ifdef TL_EXPECTED_CXX14 template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), *std::declval()))> -constexpr auto and_then_impl(Exp &&exp, F &&f) { +constexpr auto and_then_impl(Exp&& exp, F&& f) { static_assert(detail::is_expected::value, "F must return an expected"); return exp.has_value() @@ -3986,9 +4113,9 @@ constexpr auto and_then_impl(Exp &&exp, F &&f) { } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval()))> -constexpr auto and_then_impl(Exp &&exp, F &&f) { +constexpr auto and_then_impl(Exp&& exp, F&& f) { static_assert(detail::is_expected::value, "F must return an expected"); return exp.has_value() ? detail::invoke(std::forward(f)) @@ -4000,8 +4127,8 @@ struct TC; template (), *std::declval())), - detail::enable_if_t>::value> * = nullptr> -auto and_then_impl(Exp &&exp, F &&f) -> Ret { + detail::enable_if_t>::value>* = nullptr> +auto and_then_impl(Exp&& exp, F&& f) -> Ret { static_assert(detail::is_expected::value, "F must return an expected"); return exp.has_value() @@ -4011,8 +4138,8 @@ auto and_then_impl(Exp &&exp, F &&f) -> Ret { template ())), - detail::enable_if_t>::value> * = nullptr> -constexpr auto and_then_impl(Exp &&exp, F &&f) -> Ret { + detail::enable_if_t>::value>* = nullptr> +constexpr auto and_then_impl(Exp&& exp, F&& f) -> Ret { static_assert(detail::is_expected::value, "F must return an expected"); return exp.has_value() ? detail::invoke(std::forward(f)) @@ -4022,11 +4149,11 @@ constexpr auto and_then_impl(Exp &&exp, F &&f) -> Ret { #ifdef TL_EXPECTED_CXX14 template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), *std::declval())), - detail::enable_if_t::value> * = nullptr> -constexpr auto expected_map_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +constexpr auto expected_map_impl(Exp&& exp, F&& f) { using result = ret_t>; return exp.has_value() ? result(detail::invoke(std::forward(f), *std::forward(exp))) @@ -4034,11 +4161,11 @@ constexpr auto expected_map_impl(Exp &&exp, F &&f) { } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), *std::declval())), - detail::enable_if_t::value> * = nullptr> -auto expected_map_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +auto expected_map_impl(Exp&& exp, F&& f) { using result = expected>; if (exp.has_value()) { detail::invoke(std::forward(f), *std::forward(exp)); @@ -4049,20 +4176,20 @@ auto expected_map_impl(Exp &&exp, F &&f) { } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval())), - detail::enable_if_t::value> * = nullptr> -constexpr auto expected_map_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +constexpr auto expected_map_impl(Exp&& exp, F&& f) { using result = ret_t>; return exp.has_value() ? result(detail::invoke(std::forward(f))) : result(unexpect, std::forward(exp).error()); } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval())), - detail::enable_if_t::value> * = nullptr> -auto expected_map_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +auto expected_map_impl(Exp&& exp, F&& f) { using result = expected>; if (exp.has_value()) { detail::invoke(std::forward(f)); @@ -4073,12 +4200,12 @@ auto expected_map_impl(Exp &&exp, F &&f) { } #else template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), *std::declval())), - detail::enable_if_t::value> * = nullptr> + detail::enable_if_t::value>* = nullptr> -constexpr auto expected_map_impl(Exp &&exp, F &&f) +constexpr auto expected_map_impl(Exp&& exp, F&& f) -> ret_t> { using result = ret_t>; @@ -4088,12 +4215,12 @@ constexpr auto expected_map_impl(Exp &&exp, F &&f) } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), *std::declval())), - detail::enable_if_t::value> * = nullptr> + detail::enable_if_t::value>* = nullptr> -auto expected_map_impl(Exp &&exp, F &&f) -> expected> { +auto expected_map_impl(Exp&& exp, F&& f) -> expected> { if (exp.has_value()) { detail::invoke(std::forward(f), *std::forward(exp)); return {}; @@ -4103,11 +4230,11 @@ auto expected_map_impl(Exp &&exp, F &&f) -> expected> { } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval())), - detail::enable_if_t::value> * = nullptr> + detail::enable_if_t::value>* = nullptr> -constexpr auto expected_map_impl(Exp &&exp, F &&f) +constexpr auto expected_map_impl(Exp&& exp, F&& f) -> ret_t> { using result = ret_t>; @@ -4116,11 +4243,11 @@ constexpr auto expected_map_impl(Exp &&exp, F &&f) } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval())), - detail::enable_if_t::value> * = nullptr> + detail::enable_if_t::value>* = nullptr> -auto expected_map_impl(Exp &&exp, F &&f) -> expected> { +auto expected_map_impl(Exp&& exp, F&& f) -> expected> { if (exp.has_value()) { detail::invoke(std::forward(f)); return {}; @@ -4133,11 +4260,11 @@ auto expected_map_impl(Exp &&exp, F &&f) -> expected> { #if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -constexpr auto map_error_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +constexpr auto map_error_impl(Exp&& exp, F&& f) { using result = expected, detail::decay_t>; return exp.has_value() ? result(*std::forward(exp)) @@ -4145,11 +4272,11 @@ constexpr auto map_error_impl(Exp &&exp, F &&f) { std::forward(exp).error())); } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -auto map_error_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +auto map_error_impl(Exp&& exp, F&& f) { using result = expected, monostate>; if (exp.has_value()) { return result(*std::forward(exp)); @@ -4159,11 +4286,11 @@ auto map_error_impl(Exp &&exp, F &&f) { return result(unexpect, monostate{}); } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -constexpr auto map_error_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +constexpr auto map_error_impl(Exp&& exp, F&& f) { using result = expected, detail::decay_t>; return exp.has_value() ? result() @@ -4171,11 +4298,11 @@ constexpr auto map_error_impl(Exp &&exp, F &&f) { std::forward(exp).error())); } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -auto map_error_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +auto map_error_impl(Exp&& exp, F&& f) { using result = expected, monostate>; if (exp.has_value()) { return result(); @@ -4186,11 +4313,11 @@ auto map_error_impl(Exp &&exp, F &&f) { } #else template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -constexpr auto map_error_impl(Exp &&exp, F &&f) + detail::enable_if_t::value>* = nullptr> +constexpr auto map_error_impl(Exp&& exp, F&& f) -> expected, detail::decay_t> { using result = expected, detail::decay_t>; @@ -4201,11 +4328,11 @@ constexpr auto map_error_impl(Exp &&exp, F &&f) } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -auto map_error_impl(Exp &&exp, F &&f) -> expected, monostate> { + detail::enable_if_t::value>* = nullptr> +auto map_error_impl(Exp&& exp, F&& f) -> expected, monostate> { using result = expected, monostate>; if (exp.has_value()) { return result(*std::forward(exp)); @@ -4216,11 +4343,11 @@ auto map_error_impl(Exp &&exp, F &&f) -> expected, monostate> { } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -constexpr auto map_error_impl(Exp &&exp, F &&f) + detail::enable_if_t::value>* = nullptr> +constexpr auto map_error_impl(Exp&& exp, F&& f) -> expected, detail::decay_t> { using result = expected, detail::decay_t>; @@ -4231,11 +4358,11 @@ constexpr auto map_error_impl(Exp &&exp, F &&f) } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -auto map_error_impl(Exp &&exp, F &&f) -> expected, monostate> { + detail::enable_if_t::value>* = nullptr> +auto map_error_impl(Exp&& exp, F&& f) -> expected, monostate> { using result = expected, monostate>; if (exp.has_value()) { return result(); @@ -4250,8 +4377,8 @@ auto map_error_impl(Exp &&exp, F &&f) -> expected, monostate> { template (), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -constexpr auto or_else_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +constexpr auto or_else_impl(Exp&& exp, F&& f) { static_assert(detail::is_expected::value, "F must return an expected"); return exp.has_value() ? std::forward(exp) : detail::invoke(std::forward(f), @@ -4261,8 +4388,8 @@ constexpr auto or_else_impl(Exp &&exp, F &&f) { template (), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -detail::decay_t or_else_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +detail::decay_t or_else_impl(Exp&& exp, F&& f) { return exp.has_value() ? std::forward(exp) : (detail::invoke(std::forward(f), std::forward(exp).error()), @@ -4272,8 +4399,8 @@ detail::decay_t or_else_impl(Exp &&exp, F &&f) { template (), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -auto or_else_impl(Exp &&exp, F &&f) -> Ret { + detail::enable_if_t::value>* = nullptr> +auto or_else_impl(Exp&& exp, F&& f) -> Ret { static_assert(detail::is_expected::value, "F must return an expected"); return exp.has_value() ? std::forward(exp) : detail::invoke(std::forward(f), @@ -4283,8 +4410,8 @@ auto or_else_impl(Exp &&exp, F &&f) -> Ret { template (), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -detail::decay_t or_else_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +detail::decay_t or_else_impl(Exp&& exp, F&& f) { return exp.has_value() ? std::forward(exp) : (detail::invoke(std::forward(f), std::forward(exp).error()), @@ -4294,65 +4421,65 @@ detail::decay_t or_else_impl(Exp &&exp, F &&f) { } // namespace detail template -constexpr bool operator==(const expected &lhs, - const expected &rhs) { +constexpr bool operator==(const expected& lhs, + const expected& rhs) { return (lhs.has_value() != rhs.has_value()) ? false : (!lhs.has_value() ? lhs.error() == rhs.error() : *lhs == *rhs); } template -constexpr bool operator!=(const expected &lhs, - const expected &rhs) { +constexpr bool operator!=(const expected& lhs, + const expected& rhs) { return (lhs.has_value() != rhs.has_value()) ? true : (!lhs.has_value() ? lhs.error() != rhs.error() : *lhs != *rhs); } template -constexpr bool operator==(const expected &lhs, - const expected &rhs) { +constexpr bool operator==(const expected& lhs, + const expected& rhs) { return (lhs.has_value() != rhs.has_value()) ? false : (!lhs.has_value() ? lhs.error() == rhs.error() : true); } template -constexpr bool operator!=(const expected &lhs, - const expected &rhs) { +constexpr bool operator!=(const expected& lhs, + const expected& rhs) { return (lhs.has_value() != rhs.has_value()) ? true : (!lhs.has_value() ? lhs.error() == rhs.error() : false); } template -constexpr bool operator==(const expected &x, const U &v) { +constexpr bool operator==(const expected& x, const U& v) { return x.has_value() ? *x == v : false; } template -constexpr bool operator==(const U &v, const expected &x) { +constexpr bool operator==(const U& v, const expected& x) { return x.has_value() ? *x == v : false; } template -constexpr bool operator!=(const expected &x, const U &v) { +constexpr bool operator!=(const expected& x, const U& v) { return x.has_value() ? *x != v : true; } template -constexpr bool operator!=(const U &v, const expected &x) { +constexpr bool operator!=(const U& v, const expected& x) { return x.has_value() ? *x != v : true; } template -constexpr bool operator==(const expected &x, const unexpected &e) { +constexpr bool operator==(const expected& x, const unexpected& e) { return x.has_value() ? false : x.error() == e.value(); } template -constexpr bool operator==(const unexpected &e, const expected &x) { +constexpr bool operator==(const unexpected& e, const expected& x) { return x.has_value() ? false : x.error() == e.value(); } template -constexpr bool operator!=(const expected &x, const unexpected &e) { +constexpr bool operator!=(const expected& x, const unexpected& e) { return x.has_value() ? true : x.error() != e.value(); } template -constexpr bool operator!=(const unexpected &e, const expected &x) { +constexpr bool operator!=(const unexpected& e, const expected& x) { return x.has_value() ? true : x.error() != e.value(); } @@ -4361,9 +4488,9 @@ template ::value) && detail::is_swappable::value && std::is_move_constructible::value && - detail::is_swappable::value> * = nullptr> -void swap(expected &lhs, - expected &rhs) noexcept(noexcept(lhs.swap(rhs))) { + detail::is_swappable::value>* = nullptr> +void swap(expected& lhs, + expected& rhs) noexcept(noexcept(lhs.swap(rhs))) { lhs.swap(rhs); } } // namespace tl @@ -4640,10 +4767,16 @@ template result_type parse_url_impl(std::string_view user_input, const result_type* base_url = nullptr); -extern template url_aggregator parse_url_impl( +extern template url_aggregator parse_url_impl( + std::string_view user_input, const url_aggregator* base_url); +extern template url_aggregator parse_url_impl( std::string_view user_input, const url_aggregator* base_url); -extern template url parse_url_impl(std::string_view user_input, - const url* base_url); +extern template url parse_url_impl(std::string_view user_input, + const url* base_url); + +/** @private */ +template +bool try_parse_simple_absolute(std::string_view input, result_type& out); #if ADA_INCLUDE_URL_PATTERN template @@ -4760,10 +4893,10 @@ struct url_components { constexpr static uint32_t omitted = uint32_t(-1); url_components() = default; - url_components(const url_components &u) = default; - url_components(url_components &&u) noexcept = default; - url_components &operator=(url_components &&u) noexcept = default; - url_components &operator=(const url_components &u) = default; + url_components(const url_components& u) = default; + url_components(url_components&& u) noexcept = default; + url_components& operator=(url_components&& u) noexcept = default; + url_components& operator=(const url_components& u) = default; ~url_components() = default; /** Offset of the end of the protocol/scheme (position of ':'). */ @@ -4849,25 +4982,19 @@ struct url_aggregator; */ struct url : url_base { url() = default; - url(const url &u) = default; - url(url &&u) noexcept = default; - url &operator=(url &&u) noexcept = default; - url &operator=(const url &u) = default; + url(const url& u) = default; + url(url&& u) noexcept = default; + url& operator=(url&& u) noexcept = default; + url& operator=(const url& u) = default; ~url() override = default; - /** - * @private - * A URL's username is an ASCII string identifying a username. It is initially - * the empty string. - */ - std::string username{}; - - /** - * @private - * A URL's password is an ASCII string identifying a password. It is initially - * the empty string. - */ - std::string password{}; + // Fields are ordered so that the most frequently accessed components + // tend to occupy earlier cache lines and remain close together in memory. + // + // Note: The exact object layout (including cache-line boundaries, byte + // offsets, and member sizes) is implementation- and platform-dependent. + // This ordering expresses an intent for better cache locality but does not + // guarantee any specific in-memory layout. /** * @private @@ -4875,13 +5002,6 @@ struct url : url_base { */ std::optional host{}; - /** - * @private - * A URL's port is either null or a 16-bit unsigned integer that identifies a - * networking port. It is initially null. - */ - std::optional port{}; - /** * @private * A URL's path is either an ASCII string or a list of zero or more ASCII @@ -4903,6 +5023,27 @@ struct url : url_base { */ std::optional hash{}; + /** + * @private + * A URL's port is either null or a 16-bit unsigned integer that identifies a + * networking port. It is initially null. + */ + std::optional port{}; + + /** + * @private + * A URL's username is an ASCII string identifying a username. It is initially + * the empty string. + */ + std::string username{}; + + /** + * @private + * A URL's password is an ASCII string identifying a password. It is initially + * the empty string. + */ + std::string password{}; + /** * Checks if the URL has an empty hostname (host is set but empty string). * @return `true` if host exists but is empty, `false` otherwise. @@ -4942,6 +5083,12 @@ struct url : url_base { */ [[nodiscard]] ada_really_inline std::string get_href() const; + /** + * Returns the byte length of the serialized URL without allocating a string. + * @return Size of the href in bytes. + */ + [[nodiscard]] size_t get_href_size() const noexcept; + /** * Returns the URL's origin as a string (scheme + host + port for special * URLs). @@ -5000,7 +5147,7 @@ struct url : url_base { * @return A constant reference to the username string. * @see https://url.spec.whatwg.org/#dom-url-username */ - [[nodiscard]] const std::string &get_username() const noexcept; + [[nodiscard]] const std::string& get_username() const noexcept; /** * Sets the URL's username, percent-encoding special characters. @@ -5085,7 +5232,7 @@ struct url : url_base { * @return A constant reference to the password string. * @see https://url.spec.whatwg.org/#dom-url-password */ - [[nodiscard]] const std::string &get_password() const noexcept; + [[nodiscard]] const std::string& get_password() const noexcept; /** * Returns the URL's port as a string (e.g., "8080"). @@ -5128,8 +5275,7 @@ struct url : url_base { * @return A newly constructed url_components struct. * @see https://github.com/servo/rust-url */ - [[nodiscard]] ada_really_inline ada::url_components get_components() - const noexcept; + [[nodiscard]] ada_really_inline ada::url_components get_components() const; /** * Checks if the URL has a fragment/hash component. @@ -5145,22 +5291,27 @@ struct url : url_base { private: friend ada::url ada::parser::parse_url(std::string_view, - const ada::url *); + const ada::url*); friend ada::url_aggregator ada::parser::parse_url( - std::string_view, const ada::url_aggregator *); + std::string_view, const ada::url_aggregator*); friend void ada::helpers::strip_trailing_spaces_from_opaque_path( - ada::url &url); + ada::url& url); friend ada::url ada::parser::parse_url_impl(std::string_view, - const ada::url *); + const ada::url*); friend ada::url_aggregator ada::parser::parse_url_impl< - ada::url_aggregator, true>(std::string_view, const ada::url_aggregator *); + ada::url_aggregator, true>(std::string_view, const ada::url_aggregator*); + friend ada::url_aggregator ada::parser::parse_url_impl< + ada::url_aggregator, false>(std::string_view, const ada::url_aggregator*); + template + friend bool ada::parser::try_parse_simple_absolute(std::string_view, + result_type&); inline void update_unencoded_base_hash(std::string_view input); inline void update_base_hostname(std::string_view input); inline void update_base_search(std::string_view input, const uint8_t query_percent_encode_set[]); - inline void update_base_search(std::optional &&input); + inline void update_base_search(std::optional&& input); inline void update_base_pathname(std::string_view input); inline void update_base_username(std::string_view input); inline void update_base_password(std::string_view input); @@ -5250,23 +5401,23 @@ struct url : url_base { * scheme string, be lower-cased, not contain spaces or tabs. It should * have no spurious trailing or leading content. */ - inline void set_scheme(std::string &&new_scheme) noexcept; + inline void set_scheme(std::string&& new_scheme) noexcept; /** * Take the scheme from another URL. The scheme string is moved from the * provided url. */ - constexpr void copy_scheme(ada::url &&u); + constexpr void copy_scheme(ada::url&& u); /** * Take the scheme from another URL. The scheme string is copied from the * provided url. */ - constexpr void copy_scheme(const ada::url &u); + constexpr void copy_scheme(const ada::url& u); }; // struct url -inline std::ostream &operator<<(std::ostream &out, const ada::url &u); +inline std::ostream& operator<<(std::ostream& out, const ada::url& u); } // namespace ada #endif // ADA_URL_H @@ -5317,6 +5468,11 @@ using result = tl::expected; * * @note The parser is fully compliant with the WHATWG URL Standard. * + * Parsing fails if the input or the resulting normalized URL exceeds + * `get_max_input_length()` bytes (default ~4 GB, configurable via + * `set_max_input_length()`). This accounts for percent-encoding expansion: + * a short input that normalizes into a long URL is still rejected. + * * @example * ```cpp * // Parse an absolute URL @@ -5351,29 +5507,12 @@ extern template ada::result parse( /** * Checks whether a URL string can be successfully parsed. * - * This is a fast validation function that checks if a URL string is valid - * according to the WHATWG URL Standard without fully constructing a URL - * object. Use this when you only need to validate URLs without needing - * their parsed components. + * Equivalent to `parse(input, base).has_value()` for every input, including + * when `set_max_input_length` rejects a normalized href that exceeds the limit. * * @param input The URL string to validate. Must be valid ASCII or UTF-8. - * @param base_input Optional pointer to a base URL string for resolving - * relative URLs. If nullptr (default), the input is validated as - * an absolute URL. - * - * @return `true` if the URL can be parsed successfully, `false` otherwise. - * - * @example - * ```cpp - * // Check absolute URL - * bool valid = ada::can_parse("https://example.com"); // true - * bool invalid = ada::can_parse("not a url"); // false - * - * // Check relative URL with base - * std::string_view base = "https://example.com/"; - * bool relative_valid = ada::can_parse("../path", &base); // true - * ``` - * + * @param base_input Optional base URL string for relative inputs. + * @return `true` if parsing would succeed, `false` otherwise. * @see https://url.spec.whatwg.org/#dom-url-canparse */ bool can_parse(std::string_view input, @@ -5413,11 +5552,37 @@ parse_url_pattern(std::variant&& input, * Creates a properly formatted file URL from a local file system path. * Handles platform-specific path separators and percent-encoding. * + * Respects `get_max_input_length()`: if the input path or the resulting + * `file://` href would exceed the limit, returns an empty string. + * * @param path The file system path to convert. Must be valid ASCII or UTF-8. * - * @return A file:// URL string representing the given path. + * @return A file:// URL string representing the given path, or empty on + * length-limit rejection. */ std::string href_from_file(std::string_view path); + +/** + * Sets the maximum allowed length for URLs. + * + * Both the raw input and the resulting normalized URL (the href) are checked + * against this limit. Parsing or setter calls that would produce a URL + * exceeding this length are rejected. The same limit also applies to + * `href_from_file` and to query strings passed to `url_search_params` + * construction / `reset`. The value must fit in a uint32_t. + * The default is std::numeric_limits::max() (approximately 4 GB). + * + * @param length The new maximum URL length in bytes. + */ +void set_max_input_length(uint32_t length); + +/** + * Returns the current maximum allowed length for URLs. + * + * @return The current maximum URL length in bytes. + */ +uint32_t get_max_input_length(); + } // namespace ada #endif // ADA_IMPLEMENTATION_H @@ -5515,7 +5680,7 @@ struct url_pattern_compile_component_options { url_pattern_compile_component_options() = default; explicit url_pattern_compile_component_options( std::optional new_delimiter = std::nullopt, - std::optional new_prefix = std::nullopt) + std::optional new_prefix = std::nullopt) noexcept : delimiter(new_delimiter), prefix(new_prefix) {} inline std::string_view get_delimiter() const ada_warn_unused; @@ -5935,6 +6100,9 @@ class Tokenizer { // @see https://urlpattern.spec.whatwg.org/#get-the-next-code-point constexpr void get_next_code_point(); + // True when the most recent decoded unit was malformed UTF-8. + bool had_invalid_code_point() const { return invalid_code_point; } + // @see https://urlpattern.spec.whatwg.org/#seek-and-get-the-next-code-point constexpr void seek_and_get_next_code_point(size_t index); @@ -5971,6 +6139,8 @@ class Tokenizer { size_t next_index = 0; // has an associated code point, a Unicode code point, initially null. char32_t code_point{}; + // Tracks whether the last decoded code point was malformed UTF-8. + bool invalid_code_point = false; }; // @see https://urlpattern.spec.whatwg.org/#constructor-string-parser @@ -6483,7 +6653,7 @@ constexpr uint64_t scheme_keys[] = { // @private // branchless load of up to 5 characters into a uint64_t, padding with zeros if // n < 5 -inline uint64_t branchless_load5(const char *p, size_t n) { +inline uint64_t branchless_load5(const char* p, size_t n) { uint64_t input = (uint8_t)p[0]; input |= ((uint64_t)(uint8_t)p[n > 1] << 8) & (0 - (uint64_t)(n > 1)); input |= ((uint64_t)(uint8_t)p[(n > 2) * 2] << 16) & (0 - (uint64_t)(n > 2)); @@ -6955,6 +7125,16 @@ ada_really_inline unsigned constexpr convert_hex_to_binary(char c) noexcept; */ std::string percent_decode(std::string_view input, size_t first_percent); +/** + * Decode an application/x-www-form-urlencoded component: map '+' to space, + * then percent-decode. Single allocation; no intermediate string. + * + * @param input A form-urlencoded component (key or value). + * @return The decoded string. + * @see https://url.spec.whatwg.org/#concept-urlencoded-parser + */ +std::string form_urlencoded_decode(std::string_view input); + /** * @private * Returns a percent-encoding string whether percent encoding was needed or not. @@ -7042,6 +7222,7 @@ url_base::scheme_default_port() const noexcept { #include +#include #include #include #if ADA_REGULAR_VISUAL_STUDIO @@ -7056,19 +7237,18 @@ namespace ada { return port.has_value(); } [[nodiscard]] inline bool url::cannot_have_credentials_or_port() const { - return !host.has_value() || host.value().empty() || - type == ada::scheme::type::FILE; + return !host.has_value() || host->empty() || type == ada::scheme::type::FILE; } [[nodiscard]] inline bool url::has_empty_hostname() const noexcept { if (!host.has_value()) { return false; } - return host.value().empty(); + return host->empty(); } [[nodiscard]] inline bool url::has_hostname() const noexcept { return host.has_value(); } -inline std::ostream &operator<<(std::ostream &out, const ada::url &u) { +inline std::ostream& operator<<(std::ostream& out, const ada::url& u) { return out << u.to_string(); } @@ -7081,7 +7261,7 @@ inline std::ostream &operator<<(std::ostream &out, const ada::url &u) { } [[nodiscard]] ada_really_inline ada::url_components url::get_components() - const noexcept { + const { url_components out{}; // protocol ends with ':'. for example: "https:" @@ -7104,12 +7284,12 @@ inline std::ostream &operator<<(std::ostream &out, const ada::url &u) { out.host_start += uint32_t(password.size() + 1); } - out.host_end = uint32_t(out.host_start + host.value().size()); + out.host_end = uint32_t(out.host_start + host->size()); } else { out.username_end = out.host_start; // Host does not start with "@" if it does not include credentials. - out.host_end = uint32_t(out.host_start + host.value().size()) - 1; + out.host_end = uint32_t(out.host_start + host->size()) - 1; } running_index = out.host_end + 1; @@ -7166,7 +7346,7 @@ inline void url::update_base_search(std::string_view input, query = ada::unicode::percent_encode(input, query_percent_encode_set); } -inline void url::update_base_search(std::optional &&input) { +inline void url::update_base_search(std::optional&& input) { query = std::move(input); } @@ -7200,7 +7380,7 @@ constexpr void url::clear_search() { query = std::nullopt; } constexpr void url::set_protocol_as_file() { type = ada::scheme::type::FILE; } -inline void url::set_scheme(std::string &&new_scheme) noexcept { +inline void url::set_scheme(std::string&& new_scheme) noexcept { type = ada::scheme::get_scheme_type(new_scheme); // We only move the 'scheme' if it is non-special. if (!is_special()) { @@ -7208,48 +7388,142 @@ inline void url::set_scheme(std::string &&new_scheme) noexcept { } } -constexpr void url::copy_scheme(ada::url &&u) { +constexpr void url::copy_scheme(ada::url&& u) { non_special_scheme = u.non_special_scheme; type = u.type; } -constexpr void url::copy_scheme(const ada::url &u) { +constexpr void url::copy_scheme(const ada::url& u) { non_special_scheme = u.non_special_scheme; type = u.type; } [[nodiscard]] ada_really_inline std::string url::get_href() const { - std::string output = get_protocol(); + if (is_special() && host.has_value() && username.empty() && + password.empty() && !port.has_value()) [[likely]] { + const std::string_view scheme = ada::scheme::details::is_special_list[type]; + const size_t host_size = host->size(); + const size_t path_size = path.size(); + const size_t query_size = query.has_value() ? query->size() : 0; + const size_t hash_size = hash.has_value() ? hash->size() : 0; + const size_t total = scheme.size() + 3 + host_size + path_size + + (query.has_value() ? query_size + 1 : 0) + + (hash.has_value() ? hash_size + 1 : 0); + std::string output(total, '\0'); + char* p = output.data(); + std::memcpy(p, scheme.data(), scheme.size()); + p += scheme.size(); + p[0] = ':'; + p[1] = '/'; + p[2] = '/'; + p += 3; + // NOLINTNEXTLINE(bugprone-not-null-terminated-result) + std::memcpy(p, host->data(), host_size); + p += host_size; + std::memcpy(p, path.data(), path_size); + p += path_size; + if (query.has_value()) { + *p++ = '?'; + // NOLINTNEXTLINE(bugprone-not-null-terminated-result) + std::memcpy(p, query->data(), query_size); + p += query_size; + } + if (hash.has_value()) { + *p++ = '#'; + // NOLINTNEXTLINE(bugprone-not-null-terminated-result) + std::memcpy(p, hash->data(), hash_size); + } + return output; + } + + std::string output; + output.reserve(get_href_size()); + + if (is_special()) { + output.append(ada::scheme::details::is_special_list[type]); + output += ':'; + } else { + output.append(non_special_scheme); + output += ':'; + } if (host.has_value()) { - output += "//"; + output += '/'; + output += '/'; if (has_credentials()) { - output += username; + output.append(username); if (!password.empty()) { - output += ":" + get_password(); + output += ':'; + output.append(password); } - output += "@"; + output += '@'; } - output += host.value(); + output.append(*host); if (port.has_value()) { - output += ":" + get_port(); + output += ':'; + char port_buf[5]; + auto [ptr, ec] = std::to_chars(port_buf, port_buf + 5, *port); + (void)ec; + output.append(port_buf, static_cast(ptr - port_buf)); } } else if (!has_opaque_path && path.starts_with("//")) { // If url's host is null, url does not have an opaque path, url's path's // size is greater than 1, and url's path[0] is the empty string, then // append U+002F (/) followed by U+002E (.) to output. - output += "/."; + output += '/'; + output += '.'; } - output += path; + output.append(path); if (query.has_value()) { - output += "?" + query.value(); + output += '?'; + output.append(*query); } if (hash.has_value()) { - output += "#" + hash.value(); + output += '#'; + output.append(*hash); } return output; } +[[nodiscard]] inline size_t url::get_href_size() const noexcept { + size_t size = 0; + if (is_special()) { + size += ada::scheme::details::is_special_list[type].size() + 1; + } else { + size += non_special_scheme.size() + 1; + } + if (host.has_value()) { + size += host->size(); + size += 2; + if (has_credentials()) { + size += username.size(); + if (!password.empty()) { + size += 1 + password.size(); + } + size += 1; + } + if (port.has_value()) { + size += 1; + uint16_t p = *port; + size += (p >= 10000) ? 5 + : (p >= 1000) ? 4 + : (p >= 100) ? 3 + : (p >= 10) ? 2 + : 1; + } + } else if (!has_opaque_path && path.starts_with("//")) { + size += 2; + } + size += path.size(); + if (query.has_value()) { + size += 1 + query->size(); + } + if (hash.has_value()) { + size += 1 + hash->size(); + } + return size; +} + ada_really_inline size_t url::parse_port(std::string_view view, bool check_trailing_content) noexcept { ada_log("parse_port('", view, "') ", view.size()); @@ -7419,10 +7693,10 @@ namespace parser {} */ struct url_aggregator : url_base { url_aggregator() = default; - url_aggregator(const url_aggregator &u) = default; - url_aggregator(url_aggregator &&u) noexcept = default; - url_aggregator &operator=(url_aggregator &&u) noexcept = default; - url_aggregator &operator=(const url_aggregator &u) = default; + url_aggregator(const url_aggregator& u) = default; + url_aggregator(url_aggregator&& u) noexcept = default; + url_aggregator& operator=(url_aggregator&& u) noexcept = default; + url_aggregator& operator=(const url_aggregator& u) = default; ~url_aggregator() override = default; /** @@ -7478,6 +7752,12 @@ struct url_aggregator : url_base { [[nodiscard]] constexpr std::string_view get_href() const noexcept ada_lifetime_bound; + /** + * Returns the byte length of the serialized URL without allocating a string. + * @return Size of the href in bytes. + */ + [[nodiscard]] constexpr size_t get_href_size() const noexcept; + /** * Returns the URL's username component. * Does not allocate memory. The returned view becomes invalid if this @@ -7593,7 +7873,7 @@ struct url_aggregator : url_base { * @return A constant reference to the url_components struct. * @see https://github.com/servo/rust-url */ - [[nodiscard]] ada_really_inline const url_components &get_components() + [[nodiscard]] ada_really_inline const url_components& get_components() const noexcept; /** @@ -7681,27 +7961,32 @@ struct url_aggregator : url_base { private: // helper methods friend void helpers::strip_trailing_spaces_from_opaque_path( - url_aggregator &url); + url_aggregator& url); // parse_url methods friend url_aggregator parser::parse_url( - std::string_view, const url_aggregator *); + std::string_view, const url_aggregator*); friend url_aggregator parser::parse_url_impl( - std::string_view, const url_aggregator *); + std::string_view, const url_aggregator*); friend url_aggregator parser::parse_url_impl( - std::string_view, const url_aggregator *); + std::string_view, const url_aggregator*); + template + friend bool parser::try_parse_simple_absolute(std::string_view, result_type&); #if ADA_INCLUDE_URL_PATTERN // url_pattern methods template friend tl::expected, errors> parse_url_pattern_impl( - std::variant &&input, - const std::string_view *base_url, const url_pattern_options *options); + std::variant&& input, + const std::string_view* base_url, const url_pattern_options* options); #endif // ADA_INCLUDE_URL_PATTERN - std::string buffer{}; + // components is declared before buffer so that the offset fields land + // close to url_base in memory, improving cache locality for getter calls. + // Note: exact cache-line placement is implementation- and platform-dependent. url_components components{}; + std::string buffer{}; /** * Returns true if neither the search, nor the hash nor the pathname @@ -7759,12 +8044,12 @@ struct url_aggregator : url_base { ada_really_inline bool parse_host(std::string_view input); inline void update_base_authority(std::string_view base_buffer, - const url_components &base); + const url_components& base); inline void update_unencoded_base_hash(std::string_view input); inline void update_base_hostname(std::string_view input); inline void update_base_search(std::string_view input); inline void update_base_search(std::string_view input, - const uint8_t *query_percent_encode_set); + const uint8_t* query_percent_encode_set); inline void update_base_pathname(std::string_view input); inline void update_base_username(std::string_view input); inline void append_base_username(std::string_view input); @@ -7793,13 +8078,13 @@ struct url_aggregator : url_base { */ inline void set_scheme_from_view_with_colon( std::string_view new_scheme_with_colon); - inline void copy_scheme(const url_aggregator &u); + inline void copy_scheme(const url_aggregator& u); inline void update_host_to_base_host(const std::string_view input); }; // url_aggregator -inline std::ostream &operator<<(std::ostream &out, const url &u); +inline std::ostream& operator<<(std::ostream& out, const url& u); } // namespace ada #endif @@ -7870,7 +8155,7 @@ ada_really_inline size_t percent_encode_index(const std::string_view input, namespace ada { inline void url_aggregator::update_base_authority( - std::string_view base_buffer, const ada::url_components &base) { + std::string_view base_buffer, const ada::url_components& base) { std::string_view input = base_buffer.substr( base.protocol_end, base.host_start - base.protocol_end); ada_log("url_aggregator::update_base_authority ", input); @@ -8578,7 +8863,7 @@ constexpr bool url_aggregator::cannot_have_credentials_or_port() const { components.host_start == components.host_end; } -[[nodiscard]] ada_really_inline const ada::url_components & +[[nodiscard]] ada_really_inline const ada::url_components& url_aggregator::get_components() const noexcept { return components; } @@ -8589,8 +8874,8 @@ url_aggregator::get_components() const noexcept { // Performance: instead of doing this potentially expensive check, we could // have a boolean in the struct. return components.protocol_end + 2 <= components.host_start && - helpers::substring(buffer, components.protocol_end, - components.protocol_end + 2) == "//"; + buffer[components.protocol_end] == '/' && + buffer[components.protocol_end + 1] == '/'; } inline void ada::url_aggregator::add_authority_slashes_if_needed() { @@ -8702,6 +8987,10 @@ constexpr bool url_aggregator::has_port() const noexcept { return buffer; } +[[nodiscard]] constexpr size_t url_aggregator::get_href_size() const noexcept { + return buffer.size(); +} + ada_really_inline size_t url_aggregator::parse_port(std::string_view view, bool check_trailing_content) { ada_log("url_aggregator::parse_port('", view, "') ", view.size()); @@ -8956,8 +9245,8 @@ constexpr void url_aggregator::set_protocol_as_file() { return helpers::substring(buffer, components.pathname_start, ending_index); } -inline std::ostream &operator<<(std::ostream &out, - const ada::url_aggregator &u) { +inline std::ostream& operator<<(std::ostream& out, + const ada::url_aggregator& u) { return out << u.to_string(); } @@ -9043,6 +9332,10 @@ using url_search_params_entries_iter = * All string inputs must be valid UTF-8. The caller is responsible for * ensuring UTF-8 validity. * + * Construction and `reset` refuse query strings longer than + * `get_max_input_length()` (the object is left empty). Individual `append` / + * `set` calls are not length-capped. + * * @see https://url.spec.whatwg.org/#interface-urlsearchparams */ struct url_search_params { @@ -9051,15 +9344,16 @@ struct url_search_params { /** * Constructs url_search_params by parsing a query string. * @param input A query string (with or without leading '?'). Must be UTF-8. + * If longer than `get_max_input_length()`, the object stays empty. */ explicit url_search_params(const std::string_view input) { initialize(input); } - url_search_params(const url_search_params &u) = default; - url_search_params(url_search_params &&u) noexcept = default; - url_search_params &operator=(url_search_params &&u) noexcept = default; - url_search_params &operator=(const url_search_params &u) = default; + url_search_params(const url_search_params& u) = default; + url_search_params(url_search_params&& u) noexcept = default; + url_search_params& operator=(url_search_params&& u) noexcept = default; + url_search_params& operator=(const url_search_params& u) = default; ~url_search_params() = default; /** @@ -9211,11 +9505,11 @@ struct url_search_params { template struct url_search_params_iter { inline url_search_params_iter() : params(EMPTY) {} - url_search_params_iter(const url_search_params_iter &u) = default; - url_search_params_iter(url_search_params_iter &&u) noexcept = default; - url_search_params_iter &operator=(url_search_params_iter &&u) noexcept = + url_search_params_iter(const url_search_params_iter& u) = default; + url_search_params_iter(url_search_params_iter&& u) noexcept = default; + url_search_params_iter& operator=(url_search_params_iter&& u) noexcept = default; - url_search_params_iter &operator=(const url_search_params_iter &u) = default; + url_search_params_iter& operator=(const url_search_params_iter& u) = default; ~url_search_params_iter() = default; /** @@ -9232,9 +9526,9 @@ struct url_search_params_iter { private: static url_search_params EMPTY; - inline url_search_params_iter(url_search_params ¶ms_) : params(params_) {} + inline url_search_params_iter(url_search_params& params_) : params(params_) {} - url_search_params ¶ms; + url_search_params& params; size_t pos = 0; friend struct url_search_params; @@ -9253,6 +9547,7 @@ struct url_search_params_iter { #include +#include #include #include #include @@ -9261,6 +9556,10 @@ struct url_search_params_iter { namespace ada { +// Declared in implementation.h; used here as a DoS bound on untrusted query +// strings (ada.h includes both headers). +uint32_t get_max_input_length(); + // A default, empty url_search_params for use with empty iterators. template url_search_params url_search_params_iter::EMPTY; @@ -9274,28 +9573,29 @@ inline void url_search_params::initialize(std::string_view input) { if (!input.empty() && input.front() == '?') { input.remove_prefix(1); } + if (input.empty()) { + return; + } + // Refuse overlong query strings (same process-wide cap as URL parsing). + if (input.size() > get_max_input_length()) { + return; + } - auto process_key_value = [&](const std::string_view current) { - auto equal = current.find('='); + params.reserve(size_t(std::count(input.begin(), input.end(), '&')) + 1); + auto process_key_value = [&](const std::string_view current) { + const auto equal = current.find('='); if (equal == std::string_view::npos) { - std::string name(current); - std::ranges::replace(name, '+', ' '); - params.emplace_back(unicode::percent_decode(name, name.find('%')), ""); + params.emplace_back(unicode::form_urlencoded_decode(current), ""); } else { - std::string name(current.substr(0, equal)); - std::string value(current.substr(equal + 1)); - - std::ranges::replace(name, '+', ' '); - std::ranges::replace(value, '+', ' '); - - params.emplace_back(unicode::percent_decode(name, name.find('%')), - unicode::percent_decode(value, value.find('%'))); + params.emplace_back( + unicode::form_urlencoded_decode(current.substr(0, equal)), + unicode::form_urlencoded_decode(current.substr(equal + 1))); } }; while (!input.empty()) { - auto ampersand_index = input.find('&'); + const auto ampersand_index = input.find('&'); if (ampersand_index == std::string_view::npos) { if (!input.empty()) { @@ -9320,7 +9620,7 @@ inline size_t url_search_params::size() const noexcept { return params.size(); } inline std::optional url_search_params::get( const std::string_view key) { auto entry = std::ranges::find_if( - params, [&key](const auto ¶m) { return param.first == key; }); + params, [&key](const auto& param) { return param.first == key; }); if (entry == params.end()) { return std::nullopt; @@ -9333,7 +9633,7 @@ inline std::vector url_search_params::get_all( const std::string_view key) { std::vector out{}; - for (auto ¶m : params) { + for (auto& param : params) { if (param.first == key) { out.emplace_back(param.second); } @@ -9344,13 +9644,13 @@ inline std::vector url_search_params::get_all( inline bool url_search_params::has(const std::string_view key) noexcept { auto entry = std::ranges::find_if( - params, [&key](const auto ¶m) { return param.first == key; }); + params, [&key](const auto& param) { return param.first == key; }); return entry != params.end(); } inline bool url_search_params::has(std::string_view key, std::string_view value) noexcept { - auto entry = std::ranges::find_if(params, [&key, &value](const auto ¶m) { + auto entry = std::ranges::find_if(params, [&key, &value](const auto& param) { return param.first == key && param.second == value; }); return entry != params.end(); @@ -9379,7 +9679,7 @@ inline std::string url_search_params::to_string() const { inline void url_search_params::set(const std::string_view key, const std::string_view value) { - const auto find = [&key](const auto ¶m) { return param.first == key; }; + const auto find = [&key](const auto& param) { return param.first == key; }; auto it = std::ranges::find_if(params, find); @@ -9394,12 +9694,12 @@ inline void url_search_params::set(const std::string_view key, inline void url_search_params::remove(const std::string_view key) { std::erase_if(params, - [&key](const auto ¶m) { return param.first == key; }); + [&key](const auto& param) { return param.first == key; }); } inline void url_search_params::remove(const std::string_view key, const std::string_view value) { - std::erase_if(params, [&key, &value](const auto ¶m) { + std::erase_if(params, [&key, &value](const auto& param) { return param.first == key && param.second == value; }); } @@ -9407,8 +9707,8 @@ inline void url_search_params::remove(const std::string_view key, inline void url_search_params::sort() { // Keys are expected to be valid UTF-8, but percent_decode can produce // arbitrary byte sequences. Handle truncated/invalid sequences gracefully. - std::ranges::stable_sort(params, [](const key_value_pair &lhs, - const key_value_pair &rhs) { + std::ranges::stable_sort(params, [](const key_value_pair& lhs, + const key_value_pair& rhs) { size_t i = 0, j = 0; uint32_t low_surrogate1 = 0, low_surrogate2 = 0; while ((i < lhs.first.size() || low_surrogate1 != 0) && @@ -10496,9 +10796,13 @@ constexpr bool constructor_string_parser::is_port_prefix() constexpr void Tokenizer::get_next_code_point() { ada_log("Tokenizer::get_next_code_point called with index=", next_index); ADA_ASSERT_TRUE(next_index < input.size()); - // this assumes that we have a valid, non-truncated UTF-8 stream. + // Decode the next UTF-8 code point. If malformed or truncated, mark it as + // invalid, return the offending byte as the code point, and advance by one + // to guarantee forward progress. + invalid_code_point = false; code_point = 0; size_t number_bytes = 0; + const size_t initial_index = next_index; unsigned char first_byte = input[next_index]; if ((first_byte & 0x80) == 0) { @@ -10526,10 +10830,40 @@ constexpr void Tokenizer::get_next_code_point() { number_bytes = 4; ada_log("Tokenizer::get_next_code_point four bytes"); } - ADA_ASSERT_TRUE(number_bytes + next_index <= input.size()); + + // Invalid leading bytes that still match a multi-byte prefix. + if ((number_bytes == 2 && first_byte < 0xC2) || + (number_bytes == 4 && first_byte > 0xF4)) { + invalid_code_point = true; + code_point = first_byte; + next_index = initial_index + 1; + return; + } + + // Invalid leading byte (e.g., continuation byte outside a sequence). + if (number_bytes == 0) { + invalid_code_point = true; + code_point = first_byte; + next_index = initial_index + 1; + return; + } + + // Truncated UTF-8 sequence. + if (number_bytes + next_index > input.size()) { + invalid_code_point = true; + code_point = first_byte; + next_index = initial_index + 1; + return; + } for (size_t i = 1 + next_index; i < number_bytes + next_index; ++i) { unsigned char byte = input[i]; + if ((byte & 0xC0) != 0x80) { + invalid_code_point = true; + code_point = first_byte; + next_index = initial_index + 1; + return; + } ada_log("Tokenizer::get_next_code_point read byte=", uint32_t(byte)); code_point = (code_point << 6) | (byte & 0x3F); } @@ -10959,7 +11293,8 @@ bool protocol_component_matches_special_scheme( component.exact_match_value == "https" || component.exact_match_value == "ws" || component.exact_match_value == "wss" || - component.exact_match_value == "ftp"; + component.exact_match_value == "ftp" || + component.exact_match_value == "file"; case url_pattern_component_type::FULL_WILDCARD: // Full wildcard matches everything including special schemes return true; @@ -10970,7 +11305,8 @@ bool protocol_component_matches_special_scheme( regex_provider::regex_match("https", regex) || regex_provider::regex_match("ws", regex) || regex_provider::regex_match("wss", regex) || - regex_provider::regex_match("ftp", regex); + regex_provider::regex_match("ftp", regex) || + regex_provider::regex_match("file", regex); } ada::unreachable(); } @@ -11067,6 +11403,8 @@ constructor_string_parser::parse(std::string_view input) { parser.group_depth += 1; // Increment parser's token index by parser's token increment. parser.token_index += parser.token_increment; + // Continue. + continue; } // If parser's group depth is greater than 0: @@ -11268,14 +11606,14 @@ constructor_string_parser::parse(std::string_view input) { #ifndef ADA_ADA_VERSION_H #define ADA_ADA_VERSION_H -#define ADA_VERSION "3.4.4" +#define ADA_VERSION "4.0.0" namespace ada { enum { - ADA_VERSION_MAJOR = 3, - ADA_VERSION_MINOR = 4, - ADA_VERSION_REVISION = 4, + ADA_VERSION_MAJOR = 4, + ADA_VERSION_MINOR = 0, + ADA_VERSION_REVISION = 0, }; } // namespace ada diff --git a/deps/ada/ada_c.h b/deps/ada/ada_c.h index 5e124984cf76..98e4ce20ccd5 100644 --- a/deps/ada/ada_c.h +++ b/deps/ada/ada_c.h @@ -13,7 +13,12 @@ // It represents "uint32_t(-1)" #define ada_url_omitted 0xffffffff -// string that is owned by the ada_url instance +// string that points to data stored in the ada_url instance +// +// Lifetime rules: +// - This pointer remains valid only while the underlying ada_url is unchanged. +// - Any mutation (e.g., ada_set_* and ada_clear_*) may invalidate previously +// returned ada_string pointers. typedef struct { const char* data; size_t length; @@ -57,6 +62,9 @@ bool ada_is_valid(ada_url result); // url_aggregator getters // if ada_is_valid(result)) is false, an empty string is returned +// +// Important: this invalidation rule applies only to getters that return +// ada_string. The ada_get_origin getter returns ada_owned_string. ada_owned_string ada_get_origin(ada_url result); ada_string ada_get_href(ada_url result); ada_string ada_get_username(ada_url result); @@ -184,6 +192,10 @@ ada_string_pair ada_search_params_entries_iter_next( bool ada_search_params_entries_iter_has_next( ada_url_search_params_entries_iter result); +// max URL length configuration +void ada_set_max_input_length(uint32_t length); +uint32_t ada_get_max_input_length(void); + // Definitions for Ada's version number. typedef struct { int major; diff --git a/deps/amaro/dist/index.js b/deps/amaro/dist/index.js index 1511107e4365..4ce1359bb259 100644 --- a/deps/amaro/dist/index.js +++ b/deps/amaro/dist/index.js @@ -456,7 +456,7 @@ ${val.stack}`; const ret = false; return ret; }; - module2.exports.__wbindgen_closure_wrapper5462 = function(arg0, arg1, arg2) { + module2.exports.__wbindgen_closure_wrapper5465 = function(arg0, arg1, arg2) { const ret = makeMutClosure(arg0, arg1, 900, __wbg_adapter_50); return addHeapObject(ret); }; @@ -545,7 +545,7 @@ ${val.stack}`; throw new Error(getStringFromWasm0(arg0, arg1)); }; var { Buffer: Buffer2 } = require("node:buffer"); - var bytes = Buffer2.from("AGFzbQEAAAAB7QROYAAAYAABf2AAAX5gAX8AYAF/AX9gAX8BfmABfwF8YAJ/fwBgAn9/AX9gAn9/AX5gAn9/AXxgA39/fwBgA39/fwF/YAN/f38BfmAEf39/fwBgBH9/f38Bf2AEf39/fwF+YAV/f39/fwBgBX9/f39/AX9gBn9/f39/fwBgBn9/f39/fwF/YAd/f39/f39/AGAHf39/f39/fwF/YAh/f39/f39/fwBgCH9/f39/f39/AX9gC39/f39/f39/f39/AX9gDX9/f39/f39/f39/f38AYA5/f39/f39/f39/f39/fwF/YA9/f39/f39/f39/f39/f38Bf2ATf39/f39/f39/f39/f39/f39/fwF/YBd/f39/f39/f39/f39/f39/f39/f39/fwF/YAl/f39/f39+fn4AYAV/f39/fgBgBn9/f39+fwBgBH9/f34AYAZ/f39+f38AYAN/f34Bf2AEf39+fwBgBH9/fn8Bf2AFf39+f38AYAZ/f35/fn8AYAV/f31/fwBgBX9/fH9/AGACf34AYAJ/fgF/YAN/fn8AYAN/fn8Bf2AEf35/fwBgBH9+f34BfmADf35+AGAEf35+fwBgBX9+fn5/AGAFf35+fn4AYAR/fX9/AGACf3wAYAN/fH8AYAN/fH8Bf2AEf3x/fwBgBH98f38Bf2ABfgBgAX4Bf2ABfgF+YAJ+fwBgAn5/AX5gA35/fwF/YAN+f34BfmACfn4AYAJ+fgF+YAN+fn8AYAR+fn9/AX5gBH5+fn8BfmAHfn5+f39/fwF+YAF8AX9gAXwBfGACfH8Bf2ACfH8BfGACfHwBfGADfHx8AXwCyxo9GF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diaW5kZ2VuX29iamVjdF9kcm9wX3JlZgADGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2Vycm9yX25ldwAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2lzX2JpZ2ludAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX251bWJlcl9nZXQABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18kX193YmdfaXNTYWZlSW50ZWdlcl8zNDNlMmJlZWVlY2UxYmIwAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JpbmRnZW5fYmlnaW50X2Zyb21faTY0ADwYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JpbmRnZW5fYmlnaW50X2Zyb21fdTY0ADwYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHV9fd2JnX2xlbmd0aF9lMmQyYTQ5MTMyYzFiMjU2AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fH19fd2JnX2l0ZXJhdG9yXzlhMjRjODhkZjg2MGRjNjUAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18lX193YmdfaW5zdGFuY2VvZl9NYXBfZjM0NjljZTIyNDRkMjQzMAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfM2YxZDBiOTg0ZWQyNzJlZAALGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX251bWJlcl9uZXcASBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18VX193YmluZGdlbl9zdHJpbmdfbmV3AAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fE19fd2JpbmRnZW5faXNfZmFsc3kABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18kX193YmdfZ2V0d2l0aHJlZmtleV8xZGMzNjFiZDEwMDUzYmZlAAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFF9fd2JpbmRnZW5faXNfc3RyaW5nAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX2dldF9iOWI5MzA0N2ZlM2NmNDViAAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fH19fd2JnX3RvU3RyaW5nXzUyODU1OTc5NjA2NzZiN2IABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmdfbmV3XzQwNWUyMmYzOTA1NzZjZTIAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmdfbmV3Xzc4ZmViMTA4YjY0NzI3MTMAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193Ymdfc2V0XzM3ODM3MDIzZjNkNzQwZTgACxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18XX193YmluZGdlbl9pc191bmRlZmluZWQABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18NX193YmluZGdlbl9pbgAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxZfX3diaW5kZ2VuX2Jvb2xlYW5fZ2V0AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFV9fd2JpbmRnZW5fc3RyaW5nX2dldAAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2lzX29iamVjdAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxNfX3diaW5kZ2VuX2pzdmFsX2VxAAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX25ld18yM2EyNjY1ZmFjODNjNjExAAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JpbmRnZW5fb2JqZWN0X2Nsb25lX3JlZgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxZfX3diaW5kZ2VuX2lzX2Z1bmN0aW9uAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fIF9fd2JnX25ld25vYXJnc18xMDVlZDQ3MTQ3NWFhZjUwAAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2NhbGxfNjcyYTRkMjE2MzRkNGEyNAAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXy1fX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMXzg4YTkwMmQxM2E1NTdkMDcAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18yX193Ymdfc3RhdGljX2FjY2Vzc29yX0dMT0JBTF9USElTXzU2NTc4YmU3ZTlmODMyYjAAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18tX193Ymdfc3RhdGljX2FjY2Vzc29yX1dJTkRPV181ZGUzNzA0M2E5MWE5YzQwAAEYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fK19fd2JnX3N0YXRpY19hY2Nlc3Nvcl9TRUxGXzM3YzVkNDE4ZTRiZjU4MTkAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmdfZ2V0XzY3YjJiYTYyZmMzMGRlMTIACBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfbmV4dF8yNWZlYWRmYzA5MTNmZWE5AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHl9fd2JnX2lzQXJyYXlfYTFlYWI3ZTBkMDY3MzkxYgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ19jYWxsXzdjY2NkZDY5ZTA3OTFhZTIADBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18dX193YmdfbGVuZ3RoX2E0NDYxOTNkYzIyYzEyZjgABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18RX193YmluZGdlbl9tZW1vcnkAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18dX193YmdfYnVmZmVyXzYwOWNjM2VlZTUxZWQxNTgABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmdfbmV3X2ExMjAwMmE3ZjkxYzc1YmUABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193Ymdfc2V0XzY1NTk1YmRkODY4YjMwMDkACxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfbmV4dF82NTc0ZTFhOGE2MmQxMDU1AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2RvbmVfNzY5ZTVlZGU0YjMxYzY3YgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxxfX3diZ192YWx1ZV9jZDFmZmE3YjFhYjc5NGYxAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fLF9fd2JnX2luc3RhbmNlb2ZfVWludDhBcnJheV8xNzE1NmJjZjExODA4NmE5AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGV9fd2JpbmRnZW5fanN2YWxfbG9vc2VfZXEACBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18tX193YmdfaW5zdGFuY2VvZl9BcnJheUJ1ZmZlcl9lMTQ1ODU0MzJlMzczN2ZjAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHl9fd2JnX2VudHJpZXNfMzI2NWQ0MTU4YjMzZTVkYwAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxBfX3diaW5kZ2VuX3Rocm93AAcYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHF9fd2JpbmRnZW5fYmlnaW50X2dldF9hc19pNjQABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18XX193YmluZGdlbl9kZWJ1Z19zdHJpbmcABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18SX193YmluZGdlbl9jYl9kcm9wAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX3RoZW5fNDRiNzM5NDZkMmZiM2U3ZAAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyVfX3diZ19xdWV1ZU1pY3JvdGFza185N2Q5MmI0ZmNjOGE2MWM1AAMYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJV9fd2JnX3F1ZXVlTWljcm90YXNrX2QzMjE5ZGVmODI1NTI0ODUABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmdfcmVzb2x2ZV80ODUxNzg1YzljNWY1NzNkAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHl9fd2JpbmRnZW5fY2xvc3VyZV93cmFwcGVyNTQ2MgAMA88lzSUOBxELDhEOCwcOEQcLCwsLBwcLBwcOCwsHBw4HBwcLBwcODhMHDhEHDgcHCwcOCwcHBwcOBw4LCA4LBw4HOgsHCAcLBwcTLwsPFQcTBwQHCxEHBwcLCwsOBwcIBxMLBwMHBwcOCw4OBwcHCAsHBxMHCw4HBw4TBwcHEwcHBwQHBwcHBxMLBwcLEQcHBwcHDhUOBwcLGgsRBxMHEwgHEwsDCwsLExMOBxEHIQMLBwsHDgcHBxEHBwsHBwcHEwcHDgwHEwcHBwMHCwsHA0wHBw4DDgMTBwcOBwcLBwcOBwcHDhEHSggDDgcTCwcHBwcRCAsHCwcREQsTDg4IBwwHBwwMBwwRERoMCBEICAcIBw4ECwgICAcLCwgOBwcREQgHDgQHBwMHCxEIDgcTEQcHCwcOBxUDBwcHCwcHBwcBBwcHBwcHCwwRBwcMCAgDBwcREQcHFQsHCwgLB00HEQ4OBwcLDgcDEREHBwsEEwsOCAQHBwcLCAQLBwMOBw4LBw4LCwcLBwsHAQcONA4HDg4HCBULCAcHDAsMCAcHDAcECwcHBwcLBwsHCwsLBwMHBxMHDAsHBw4LBwcHBwsHAwQODgcHCwMHBwcLBwQHBwsODgcHBwwHAwgHBAQHCBEHCxEMNwcHBAcHCwcDBAsLAwMDAwwHBwsOBAcHBwMDAwcDBwcPBwcHFSEDCw0ODwsHCwsOBwcHFgsLDw4MCwgPCwcVExEHBwcEBAQHBwcHOAcbBA4HDgcHAwcOBAcHFRMIBwcVBAcLEwsMDwsDCwcLDgMIEQMLBwcLBwcHBwcLDAcHBwcMCAMMBwcIBwcHCAcHOgcHDgcHAwwKDAsOCwcOBw8DCAgHBwMHDggHBwcHBwcHDgQHBwcLDgsDDgcLBwMDAwgIAwcLCAMYCwwMBwgICwcHAwcOBwMHAwsOBwsOCwwDBwsLAw4DBwgLBwsHCAcHBwsDBxcECAgHEw4HBwwLESgHCAcDBw4ICygIDA4OBw4HBwcLTAsDBwQHCA4LCwUOCAgLCxEEBwcDCAgHCw8LCBNBCA8HMBQHAwcDBwcVBwsLExMHBwcHCAwHCCwHCwcODggTAxELBwcOBxEHBwcIBwcOCwctCAcHBwcHBwMuBwcHBwsLBxMHCAcOBxELCAMHCAgHBwcHDAcDAw4EEw4HEQgHCwcHBw4HEwgIEQsRBwgVFQcLBwMLCwcLBwsHBwcHBwcHCAsHBwhFRRMRCBULE0UVBxMHBwQHBxMHBwcHBwsLBAMLEwsLDg4DDg4TBwMHEwcTBwcLBzEHCxUHBxETDg4HBw4IDAcHBwgMCwcLCwcHBxUEAw4OBwcHAwQHCxMHCwcLCAMHBwsLBwcIBwcHBwcIDg4LBwsLBwwHBwcICAcHBz4HBwsTBwsDCw4fDgcHBwcLCwcHCwsLBwMHEwMLCwgLBwwWBw4TDg4ODhMECwcHCwcESQcLBwcHDgsHBwcDEQQHBwQIDgcHCwgHBwMDBwcHBw4ICwcHBwcEBAQEBwcHByIDCwsHBwsOEwcHBxEODggIBwcHCwsTCwQLCwQHCAcPBAQHBwsTBxEODgsgAwcDCwwIBwgHAwcHCA4lCwcDBwcLCwcHBwMIBwcDBw4IEQMHFQsDBAcHCAgDCwgDCwgHBwcMAwcDDhETCAgDBwgHCw4SBAQECwcLEQcHDxUECwcHCAMICwMIBQcHBwcHDgsMDgcHCwwHBwcIAwcICAcHCwsLBQcHBwcPDhMMAwcIBwcLIwcIBwgHCwsHBwAIAwgICwMHAwcHCwgHCwgRAwsLAwcHBAgICw8OFAcDBwcTBxELCAgIDAcDBwcIBwcLCwcECwcIBwMEBAcHDhIODggHBwsDCAcHBxMIBAMKCAgIEw4DCAsDBw4WCAMODggICAgICAgOCwcHAwcDCxEHBxcOCwsIBwMHBwgDCwMLEwsOCwsLBwMHCwMTAwQHBwMIERMTCAgHCBMLEwcTBwcTCAcHBw8LCAMMExMPDw8HBwMDCAgIAwcMDA4FCAsHAwsODggHBwMLBwcHCwMTExMIAwcHBwctBwcHBAcHEgcHCAgIBwcIBwcHBwsLBwsLDgcICAwMBwcHBw8REQQHBQcHHgsHCwcHBwcHBwcHAwcIBwcLCA4ICAcHCxELDgMDBwcHCAgICAcDCwcLKxEICAgHBwcDCAgICAMICAgDAwsHER0DDgsHBwgHBwcHDgsHCAcHDwcPCA4HCwsHEwssBwMIAwgHBAcVBwMEBAgODggmCwMDCwsLDhMcBxEMDgcLCAgECAgHCxEREQcEFQ4OBAcDBActBwMDAwgLExMHCwcDAwQICAcLCA4HBwcHBwwMCwQLCxkLDxEDAwMECAgHNgcLBxEIBAwDBAMvCAcHAxMTEwgVEwcECwcHDg4ICAcHFg4HDgcIDgMDCAgICAgIAwcDAwcDBwsHCxEDBwcDAwwTAwQICA4IBwcIDggIBwcTDAcMCwgDCAgIBwMHEwMHDg4IQAcEDg4IBwMECAMDBwsHBwsHDgcHBwwEBwgICAgHBwcHCAsHCBELCwMDAwgICAgICAgDCAsDBwMOBw8REQ4RBwgDDgcTCwdLBwgECwQNEQ4DBw4EBAQICwgLBwgIBwQIBwcICAgICAgICAgICAgICAgHCAgICAgICAgICAgICAgIBwcHDgcHCxEHBwsHAwgITExMBwcICAgICAcHBwcICAgIDAwRCAgICAMLCAMDCAgICAgICAgICAgICAgIBwMICAgICAgICAgICAgICAgHBwcLDgsEDxMDEwMHDgwHCAMIAwdMBxMHBy0LCwcHBw4HCwQDAwgDAwgDCAMDDggLBwcOBwgrAwgICy1MTAcDCwsLDggEEwMOCAgIBwgIBwcRDgsHBwMLBw4HAwsHAwcIKxAHCAgICAgIBxALBwsLCwsHAwcHAwMOBAsLBwcHBw4DCwgICBIRBwMTBwsPBwcHFQMMNAsrBwcMBwsHCwgDCAMEEREIDBELBwMHCwcDAwcHBwgMCAgkCwcLJCQHBwcHBAcHByQLBw8HAwcIAwgHCAgMDgsEDggOAwMDCwcHAwMHBwcHBysHCBMHCwgIBwcDCAMDAxEECAgIEQsHAwcPBwcIBAMMDAwHEwcLAwQHBwwHBwgICAMHAwsHAwMPAwMHCAMDCwMHBAMDAwcICAgLDwcHCA4OCAgICAcICAgIBwcDBwcHBwQHBwcICAgIBwhGCwsDAwgICAgICAgICAgICAgtCAgICAgICAMICAgICAgHAwMOCAgLCwcHBw4ODgQDDhMLDggLBA4LBwcDAwcHBwcHBAcDAysPAwgHDwMHCAwDBwMICAgICAsICAgICAgIQgcHBwMHBwMHBwgIBggHBxEIDwgGDAMHCwMDDhMHDAwHCwQICAgICAgICAgICAcHBwsHDgcEBwcIBw4ICAgOBwQICAgICAgICAcHBAUEBQQLEQgICAgzAxMMBwsODAgICAMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAMICAgICAMLBwcHBwsHBwgICAcDCwQICAgOAwgEAwMDCAMHAw4HAwcHDwcICAgHCxEIDgwIAwcHBwgICAgIAwMDCAgIBAMDCwMHCAgIBAgICAgICAgIDAgIAwgICAgICAgICAgICAgIBwcHAwcHBwsIAw8REwcHCwcICAwIBwsLCwsHAw4HDj4ICAgICAgICAgDAwgICAgICAgIBwM+CwMDMjIHDAsICAgICAgMPgM+BwgICAgICAgICAgIAwgICAgICAgICAgICAgICAgDCAgDBAMREQgRBwcOCwsDCAsLBxELCA4LAwMDAwcHBwQICAcHBwgICAcHCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDBwsLCwsOBQgHBwcOBw4HCAwLCxMDAQcHDgMIBwcRAwMDDgQDDAgICAQDCAgEAwMDDgwDCAgIAwAEBAgIAwMHCwcHBwQHDAMHBwMBCwcLAwgHDgwDAwMDCwcECAgHAwMDCwsHCAcHAwcIAwcDBwQDAwMDBwcLCAsHBwQHBwcHBwMDAwgHAwsICAgICAgICAcDBwQICAsICAcOCQkICAgIAwsLCAgICAgLCwcECAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NBwMDCAQLBwMHEQgHAwMDAwMDAwMDAwMDCAMDAwMDAwcDAwMDAwMDAwQDAwMDAwMDBwMDAwMDAwgDAwMDAwMDAw4DAwMDAwMDAwMDAwMDDgsIAwMDEQgRCAgICAsLCBELDgQTDQgICAgICAgICAgIEQgEBwgHBwcICAg+CAsDCBMDBAgIAwcHEQcIAwMHBwMHDgQLEQMDAwMDRwgHAwMIAww/BwcHBwgHBw4LBxEICAgLCxEOEQcTCwgIRBMTAgICAgIMAgICAgICAgICAgICAgICAwICAgICAgIHAgICAwMRDwMICAcLCwgVBw4HNgcHBw8IBwMHAwIDAzsCBwcEAwsHCwcDDAcOCAgIEREMCAMJAwgICAwIBA8EBAwDCAgDDAQECAgDCwQEBwcLBwcOCw4OAxMICAgIBAsDEgcIAwcPBwgDCwgICAsLCwcICEMDDj0LCAgICAgICAgICAQICAcICAsPBwcHBwcHBwcHBwcHNDQHAxEICwgICwcJDBERCAgDCAsDCAgDCAgICAcEDQgICDsEBDsICDsIOwgOAwgHBwcHBwcHBwgICAwICAgICAgICAgICAMIDAwHCwgICAcHAwcDBwgECAgICA4MCBEICAkICAgEAAgPCAgIBwgICAgICAMIEQgHBwcDDgcOCwcMDA4DCwgLBwcDAwcLBwcHBAQDAwcDAwMLAwgDBwcHBwcHBwcHBwcHBwMHCwMHCwcDBwMMBwcODgMDBAQHCwQDAwMDAwMHBwcLCw4OEQMLAwgIAwMHBAcIBxEDAwMHAwMHBAcOBQMDBAcOAw8DAwcDBAMMBwEDCwsDCBMICAcDEQMDBwcIAwMDAwQIAwMOBwcECwcIAwULBwcDAwcHBwgLAwcHBwcDBAcIAwQIBwMHBwcHBwcHCAMHBwcDAwQHBwcDCAcIAwQIFA8ICAgICAgDDwwICAgICAgICA8PDwMLDwcPBwcLCAcPCw8PERISESopEScLAwsECwMICwsECA8IDQQEBAwHBwcHBwsDAwcOCwcOBAcHDwsLAwcHBAg7DggHDQ0HCAgICAgEBwMHAwMHBwsLCwQDAwMDAwMPBwsOBQUMBwsDAwQEBAMDCAMDAwgHCBEHAwQDBAMDBwMHCwsDAwMECAgDAwgDCDwBCAMIAwMODggLCwcDAwgDAwMDBwcHBwcHBwcDAwMEAwQDBwEBBAMIAQgBCAQDBwEBAQEBAwMDAwMDAwMBBAMJOwM7AwMDAwMDAwMDAwMDAwMDAwMDAwMHAwMDAwgLCAgIAwcHCAgDAwMDCwgIAwgIAwgIDQgIAwM+AwMDAwMDAwkHBwcHBwcHBwcDBwMDCwMHAwMHBwsHCAgICAgICAgIBwcICAgICAgHCwsPCAMICAgHBwgDAwMDCAMDAwgDAwMLCAcICAMHAwsLBwcHBwcDBwcHBwcHBwcDAwMDAwMOAwMDAwMDAwcLBwcHBwcMBwwHAwsDAxEICAQEAwMLDgMDAAMDAzsDAwMDAwMDAwMDAwMDAwMHBwcHCAgHAwcLCwcIDg4ODg4ODgwIBwMIAwgICwsICwcICCsLCwcDAwMDCAMHBwcHBAMDAwMDAwMDAwMDAwMLAwMDBwwHBwcDAAQICAMDBwcHBwcHAwwMBwcADAgHDwwADAMMBAwMAwAAAAcHAAADBwcDBwMHCAwMDAcHAwwMDAAHBwcHBwcHBwcHBwcHBwwODggICAgIDQcDAwMLBwsLBwMMCwMDDAMHAwQDAwQEBwQEBwgICwsMBwgDDgwICAQLBAgICAgECAgICAgIBAMEBAQECAgICAgLBwgHBwcIBAQHCAgICAgHBAgIDAwHBwcHBwcHBwcHBwcHBwcHBwcHBwcMDAwICAgICAgICAgICAgICAgECAgICAgICAgEBwgICAgIBwMEAwMLAwMDCAgHQj5CBwcHBwcHBwcHBwcHBAcEA00HFQgECwIEBAQEBwMBAwICAgICAgcHCAICAgICAgICAgQHCAgIBwMDTEwEBAQEBAgEBAQEBAQDBAQEAQQEBEkEBAAEBAQEBAQEBAQEBAAEBAwEBAELBwcLBAcBcAGlDKUMBQMBACgGCQF/AUGAgIABCwfUAQoGbWVtb3J5AgAJdHJhbnNmb3JtAMYVDXRyYW5zZm9ybVN5bmMA9hYTX193YmluZGdlbl9leHBvcnRfMADLIhNfX3diaW5kZ2VuX2V4cG9ydF8xAQATX193YmluZGdlbl9leHBvcnRfMgCHGxNfX3diaW5k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BSAFINgBNgLABSAFINkBOgC8BSAFINoBNgK4BSAFINsBNgK0BSAFINwBNgKwBSAFQQA6AKwFIAVCADcCpAUgBSAhNgKgBSAFIMEDOgCcBSAFIMADNgKYBSAFIL8DNgKUBSAFIL4DNgKQBSAFIL0DOgCMBSAFILwDNgKIBSAFILsDNgKEBSAFILoDNgKABSAFILkDOgD8BCAFILgDNgL4BCAFILcDNgL0BCAFILYDNgLwBCAFILUDOgDsBCAFILQDNgLoBCAFILMDNgLkBCAFILIDNgLgBCAFILEDOgDcBCAFILADNgLYBCAFIK8DNgLUBCAFIK4DNgLQBCAFIK0DOgDMBCAFIKwDNgLIBCAFIKsDNgLEBCAFIKoDNgLABCAFIKkDOgC8BCAFIKgDNgK4BCAFIKcDNgK0BCAFIKYDNgKwBCAFIKUDOgCsBCAFIKQDNgKoBCAFIKMDNgKkBCAFIKIDNgKgBCAFIKEDOgCcBCAFIKADNgKYBCAFIJ8DNgKUBCAFIJ4DNgKQBCAFIJ0DOgCMBCAFIJwDNgKIBCAFIJsDNgKEBCAFIJoDNgKABCAFIJkDOgD8AyAFIJgDNgL4AyAFIJcDNgL0AyAFIJYDNgLwAyAFIJUDOgDsAyAFIJQDNgLoAyAFIJMDNgLkAyAFIJIDNgLgAyAFIJEDOgDcAyAFIJADNgLYAyAFII8DNgLUAyAFII4DNgLQAyAFII0DOgDMAyAFIIwDNgLIAyAFIIsDNgLEAyAFIIoDNgLAAyAFIIkDOgC8AyAFIIgDNgK4AyAFIIcDNgK0AyAFIIYDNgKwAyAFIIUDOgCsAyAFIIQDNgKoAyAFIIMDNgKkAyAFIIIDNgKgAyAFIIEDOgCcAyAFIIADNgKYAyAFIP8CNgKUAyAFIP4CNgKQAyAFIP0COgCMAyAFIPwCNgKIAyAFIPsCNgKEAyAFIPoCNgKAAyAFIPkCOgD8AiAFIPgCNgL4AiAFIPcCNgL0AiAFIPYCNgLwAiAFIPUCOgDsAiAFIPQCNgLoAiAFIPMCNgLkAiAFIPICNgLgAiAFIPECOgDcAiAFIPACNgLYAiAFIO8CNgLUAiAFIO4CNgLQAiAFIO0COgDMAiAFIOwCNgLIAiAFIOsCNgLEAiAFIOoCNgLAAiAFIOkCOgC8AiAFIOgCNgK4AiAFIOcCNgK0AiAFIOYCNgKwAiAF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BSAFINwBNgKwBSAFQQA6AKwFIAVCADcCpAUgBSAhNgKgBSAFIMEDOgCcBSAFIMADNgKYBSAFIL8DNgKUBSAFIL4DNgKQBSAFIL0DOgCMBSAFILwDNgKIBSAFILsDNgKEBSAFILoDNgKABSAFILkDOgD8BCAFILgDNgL4BCAFILcDNgL0BCAFILYDNgLwBCAFILUDOgDsBCAFILQDNgLoBCAFILMDNgLkBCAFILIDNgLgBCAFILEDOgDcBCAFILADNgLYBCAFIK8DNgLUBCAFIK4DNgLQBCAFIK0DOgDMBCAFIKwDNgLIBCAFIKsDNgLEBCAFIKoDNgLABCAFIKkDOgC8BCAFIKgDNgK4BCAFIKcDNgK0BCAFIKYDNgKwBCAFIKUDOgCsBCAFIKQDNgKoBCAFIKMDNgKkBCAFIKIDNgKgBCAFIKEDOgCcBCAFIKADNgKYBCAFIJ8DNgKUBCAFIJ4DNgKQBCAFIJ0DOgCMBCAFIJwDNgKIBCAFIJsDNgKEBCAFIJoDNgKABCAFIJkDOgD8AyAFIJgDNgL4AyAFIJcDNgL0AyAFIJYDNgLwAyAFIJUDOgDsAyAFIJQDNgLoAyAFIJMDNgLkAyAFIJIDNgLgAyAFIJEDOgDcAyAFIJADNgLYAyAFII8DNgLUAyAFII4DNgLQAyAFII0DOgDMAyAFIIwDNgLIAyAFIIsDNgLEAyAFIIoDNgLAAyAFIIkDOgC8AyAFIIgDNgK4AyAFIIcDNgK0AyAFIIYDNgKwAyAFIIUDOgCsAyAFIIQDNgKoAyAFIIMDNgKkAyAFIIIDNgKgAyAFIIEDOgCcAyAFIIADNgKYAyAFIP8CNgKUAyAFIP4CNgKQAyAFIP0COgCMAyAFIPwCNgKIAyAFIPsCNgKEAyAFIPoCNgKAAyAFIPkCOgD8AiAFIPgCNgL4AiAFIPcCNgL0AiAFIPYCNgLwAiAFIPUCOgDsAiAFIPQCNgLoAiAFIPMCNgLkAiAFIPICNgLgAiAFIPECOgDcAiAFIPACNgLYAiAFIO8CNgLUAiAFIO4CNgLQAiAFIO0COgDMAiAFIOwCNgLIAiAFIOsCNgLEAiAFIOoCNgLAAiAFIOkCOgC8AiAFIOgCNgK4AiAFIOcCNgK0AiAFIOYCNgKwAiAFIOUCOgCsAiAFIOQCNgKoAiAFIOMCNgKkAiAFIOICNgKgAiAF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NgKgBSAFIMEDOgCcBSAFIMADNgKYBSAFIL8DNgKUBSAFIL4DNgKQBSAFIL0DOgCMBSAFILwDNgKIBSAFILsDNgKEBSAFILoDNgKABSAFILkDOgD8BCAFILgDNgL4BCAFILcDNgL0BCAFILYDNgLwBCAFILUDOgDsBCAFILQDNgLoBCAFILMDNgLkBCAFILIDNgLgBCAFILEDOgDcBCAFILADNgLYBCAFIK8DNgLUBCAFIK4DNgLQBCAFIK0DOgDMBCAFIKwDNgLIBCAFIKsDNgLEBCAFIKoDNgLABCAFIKkDOgC8BCAFIKgDNgK4BCAFIKcDNgK0BCAFIKYDNgKwBCAFIKUDOgCsBCAFIKQDNgKoBCAFIKMDNgKkBCAFIKIDNgKgBCAFIKEDOgCcBCAFIKADNgKYBCAFIJ8DNgKUBCAFIJ4DNgKQBCAFIJ0DOgCMBCAFIJwDNgKIBCAFIJsDNgKEBCAFIJoDNgKABCAFIJkDOgD8AyAFIJgDNgL4AyAFIJcDNgL0AyAFIJYDNgLwAyAFIJUDOgDsAyAFIJQDNgLoAyAFIJMDNgLkAyAFIJIDNgLgAyAFIJEDOgDcAyAFIJADNgLYAyAFII8DNgLUAyAFII4DNgLQAyAFII0DOgDMAyAFIIwDNgLIAyAFIIsDNgLEAyAFIIoDNgLAAyAFIIkDOgC8AyAFIIgDNgK4AyAFIIcDNgK0AyAFIIYDNgKwAyAFIIUDOgCsAyAFIIQDNgKoAyAFIIMDNgKkAyAFIIIDNgKgAyAFIIEDOgCcAyAFIIADNgKYAyAFIP8CNgKUAyAFIP4CNgKQAyAFIP0COgCMAyAFIPwCNgKIAyAFIPsCNgKEAyAFIPoCNgKAAyAFIPkCOgD8AiAFIPgCNgL4AiAFIPcCNgL0AiAFIPYCNgLwAiAFIPUCOgDsAiAFIPQCNgLoAiAFIPMCNgLkAiAFIPICNgLgAiAFIPECOgDcAiAFIPACNgLYAiAFIO8CNgLUAiAFIO4CNgLQAiAFIO0COgDMAiAFIOwCNgLIAiAFIOsCNgLEAiAFIOoCNgLAAiAFIOkCOgC8AiAFIOgCNgK4AiAFIOcCNgK0AiAFIOYCNgKwAiAFIOUCOgCsAiAFIOQCNgKoAiAFIOMCNgKkAiAFIOICNgKgAiAFIOECOgCcAiAFIOACNgKYAiAFIN8CNgKUAiAFIN4CNgKQAiAFIN0COgCMAiAFINwCNgKIAiAFINsCNgKEAiAFINoCNgKAAiAFINkCOgD8ASAFINgCNgL4ASAFINcCNgL0ASAFINYCNgLwASAFINUCOgDsASAFINQCNgLoASAFINMCNgLkASAFINICNgLgASAFINECOgDcASAFINACNgLYASAFIM8CNgLUASAFIM4CNgLQASAFIM0COgDMASAFIMwCNgLIASAFIMsCNgLEASAFIMoCNgLAASAFIMkCOgC8ASAFIMgCNgK4ASAFIMcCNgK0ASAFIMYCNgKwASAFIMUCOgCsASAFIMQCNgKoASAFIMMCNgKkASAFIMICNgKgASAFIMECOgCcASAFIMACNgKYASAFIL8CNgKUASAFIL4CNgKQASAFIL0COgCMASAFILwCNgKIASAFILsCNgKEASAFILoCNgKAASAFILkCOgB8IAUguAI2AnggBSC3AjYCdCAFILYCNgJwIAUgtQI6AGwgBSC0AjYCaCAFILMCNgJkIAUgsgI2AmAgBSCxAjoAXCAFILACNgJYIAUgrwI2AlQgBSCuAjYCUCAFIK0COgBMIAUgrAI2AkggBSCrAjYCRCAFIKoCNgJAIAUgqQI2AjAgBUEBNgIEIAVBATYCACAFQc8NaiADQRB2OgAAIAVBrw1qIIUCQRB2OgAAIAVBnw1qIIcCQRB2OgAAIAVBjw1qIIgCQRB2OgAAIAVB/wxqIIkCQRB2OgAAIAVB7wxqIIoCQRB2OgAAIAVB3wxqIIsCQRB2OgAAIAVBzwxqIIwCQRB2OgAAIAVBvwxqII0CQRB2OgAAIAVBrwxqII4CQRB2OgAAIAVBnwxqII8CQRB2OgAAIAVBjwxqIJACQRB2OgAAIAVB/wtqIJECQRB2OgAAIAVB7wtqIJICQRB2OgAAIAVB3wtqIJMCQRB2OgAAIAVBzwtqIJQCQRB2OgAAIAVBvwtqIJUCQRB2OgAAIAVBrwtqIJYCQRB2OgAAIAVBnwtqIJcCQRB2OgAAIAVBjwtqIJgCQRB2OgAAIAVB/wpqIJkCQRB2OgAAIAVB3wpqIJoCQRB2OgAAIAVBzwpqIJsCQRB2OgAAIAVBrwpqIIQCQRB2OgAAIAVBnwpqIIMCQRB2OgAAIAVBjwpqIIICQRB2OgAAIAVB/wlqIIECQRB2OgAAIAVB7wlqIIACQRB2OgAAIAVB3wlqIP8BQRB2OgAAIAVBzwlqIP4BQRB2OgAAIAVBvwlqIP0BQRB2OgAAIAVBrwlqIPwBQRB2OgAAIAVBnwlqIPsBQRB2OgAAIAVBjwlqIPoBQRB2OgAAIAVB/whqIPkBQRB2OgAAIAVB7whqIPgBQRB2OgAAIAVB3whqIPcBQRB2OgAAIAVBzwhqIPYBQRB2OgAAIAVBvwhqIPUBQRB2OgAAIAVBrwhqIPQBQRB2OgAAIAVBnwhqIPMBQRB2OgAAIAVBjwhqIPIBQRB2OgAAIAVB/wdqIPEBQRB2OgAAIAVB7wdqIPABQRB2OgAAIAVB3wdqIO8BQRB2OgAAIAVBzwdqIO4BQRB2OgAAIAVBvwdqIO0BQRB2OgAAIAVBrwdqIOwBQRB2OgAAIAVBnwdqIOsBQRB2OgAAIAVBjwdqIOoBQRB2OgAAIAVB/wZqIOkBQRB2OgAAIAVB7wZqIOgBQRB2OgAAIAVB3wZqIOcBQRB2OgAAIAVBzwZqIOYBQRB2OgAAIAVBvwZqIOUBQRB2OgAAIAVBrwZqIOQBQRB2OgAAIAVBnwZqIOMBQRB2OgAAIAVBjwZqIOIBQRB2OgAAIAVB/wVqIOEBQRB2OgAAIAVB7wVqIOABQRB2OgAAIAVB3wVqIN8BQRB2OgAAIAVBzwVqIN4BQRB2OgAAIAVBvwVqIDxBEHY6AAAgBUGvBWpBADoAACAFQZ8FaiA7QRB2OgAAIAVBjwVqIDpBEHY6AAAgBUH/BGogOUEQdjoAACAFQe8EaiA4QRB2OgAAIAVB3wRqIDdBEHY6AAAgBUHPBGogNkEQdjoAACAFQb8EaiA1QRB2OgAAIAVBrwRqIDRBEHY6AAAgBUGfBGogM0EQdjoAACAFQY8EaiAyQRB2OgAAIAVB/wNqIDFBEHY6AAAgBUHvA2ogMEEQdjoAACAFQd8DaiAvQRB2OgAAIAVBzwNqIC5BEHY6AAAgBUG/A2ogK0EQdjoAACAFQa8DaiAoQRB2OgAAIAVBnwNqICRBEHY6AAAgBUGPA2ogF0EQdjoAACAFQf8CaiAcQRB2OgAAIAVB7wJqIBJBEHY6AAAgBUHfAmogEEEQdjoAACAFQc8CaiARQRB2OgAAIAVBvwJqIBZBEHY6AAAgBUGvAmogG0EQdjoAACAFQZ8CaiAZQRB2OgAAIAVBjwJqIBhBEHY6AAAgBUH/AWogGkEQdjoAACAFQe8BaiAiQRB2OgAAIAVB3wFqICNBEHY6AAAgBUHPAWogJUEQdjoAACAFQb8BaiAmQRB2OgAAIAVBrwFqICdBEHY6AAAgBUGfAWogKUEQdjoAACAFQY8BaiAqQRB2OgAAIAVB/wBqICxBEHY6AAAgBUHvAGogLUEQdjoAACAFQd8AaiCGAkEQdjoAACAFQc8AaiDdAUEQdjoAACAFIJIENwMYIAUglARCIIYgqAKthDcDICAFIB9BCHStIB6tQv8Bg4Q+AjwgBSAdrUIghiCcAq2ENwI0IAUglQRCIIYglARCIIiENwMoIABBlI+FATYCCCAAIAU2AgQMAQtBEEHQDRCgJAALQQIhBwwBCwJAIAlBAkYNACAIIAgoAgAiB0F/ajYCACAHQQFHDQAgCCANEO8RCyCSBEIgiCGVBCCSBEIghiGSBCABIAEoAgAiCEF/ajYCAEEBIQcCQCAIQQFHDQAgARDcEAsgACAFOwA9IAAgBjsALSAAIJQENwIUIAAgkgQ3AgQgACADNgJEIAAgCjYCQCAAIAI6ADwgACALNgI4IAAgDjYCNCAAIAw2AjAgACATOgAsIAAgFDYCKCAAIBU2AiQgACAPNgIgIAAgEDYCECAAQT9qIAVBEHY6AAAgAEEvaiAGQRB2OgAAIAAgkwQ+AhwgACCVBD4CDAsgACAHNgIAIAQtAExBAkYNACAEKAJAIgUgBSgCACIFQX9qNgIAIAVBAUcNACAEKAJAIAQoAkQQ7xELIARBgCBqJAAL7q4CAgV/A34jAEHgBmsiAiQAAkACQAJAAkAgASgCBCIDQf////8HTw0AIAEgA0EBajYCBCABLQAIRQ0DQQAgASgCABDBBiEEQdjimQFBGxCGGSEHIAJB8+KZAUEqEIYZIgg3A9gGIAJB0AZqIAJB2AZqEI0UIAIoAtAGIAIoAtQGEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgtByAAQigEiA0UNASADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQIgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAwtByOKZARCCHgALQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAAlFDQBBACABKAIAEMEGIQRBneOZAUEUEIYZIQcgAkGx45kBQSMQhhkiCDcD2AYgAkHIBmogAkHYBmoQjRQgAigCyAYgAigCzAYQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0ACkUNAEEAIAEoAgAQwQYhBEHU45kBQREQhhkhByACQeXjmQFBIBCGGSIINwPYBiACQcAGaiACQdgGahCNFCACKALABiACKALEBhCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQALRQ0AQQAgASgCABDBBiEEQYXkmQFBFBCGGSEHIAJBmeSZAUEjEIYZIgg3A9gGIAJBuAZqIAJB2AZqEI0UIAIoArgGIAIoArwGEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAAxFDQBBACABKAIAEMEGIQRBvOSZAUEYEIYZIQcgAkHU5JkBQScQhhkiCDcD2AYgAkGwBmogAkHYBmoQjRQgAigCsAYgAigCtAYQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0ADUUNAEEAIAEoAgAQwQYhBEH75JkBQRAQhhkhByACQYvlmQFBHxCGGSIINwPYBiACQagGaiACQdgGahCNFCACKAKoBiACKAKsBhCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQAORQ0AQQAgASgCABDBBiEEQarlmQFBGRCGGSEHIAJBw+WZAUEoEIYZIgg3A9gGIAJBoAZqIAJB2AZqEI0UIAIoAqAGIAIoAqQGEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAA9FDQBBACABKAIAEMEGIQRB6+WZAUEPEIYZIQcgAkH65ZkBQR4QhhkiCDcD2AYgAkGYBmogAkHYBmoQjRQgAigCmAYgAigCnAYQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AEEUNAEEAIAEoAgAQwQYhBEGY5pkBQRMQhhkhByACQavmmQFBIhCGGSIINwPYBiACQZAGaiACQdgGahCNFCACKAKQBiACKAKUBhCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQARRQ0AQQAgASgCABDBBiEEQc3mmQFBFhCGGSEHIAJB4+aZAUElEIYZIgg3A9gGIAJBiAZqIAJB2AZqEI0UIAIoAogGIAIoAowGEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtABJFDQBBACABKAIAEMEGIQRBiOeZAUEMEIYZIQcgAkGU55kBQRsQhhkiCDcD2AYgAkGABmogAkHYBmoQjRQgAigCgAYgAigChAYQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AE0UNAEEAIAEoAgAQwQYhBEGv55kBQQsQhhkhByACQbrnmQFBGhCGGSIINwPYBiACQfgFaiACQdgGahCNFCACKAL4BSACKAL8BRCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQAURQ0AQQAgASgCABDBBiEEQdTnmQFBHBCGGSEHIAJB8OeZAUErEIYZIgg3A9gGIAJB8AVqIAJB2AZqEI0UIAIoAvAFIAIoAvQFEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtABVFDQBBACABKAIAEMEGIQRBm+iZAUEjEIYZIQcgAkG+6JkBQTIQhhkiCDcD2AYgAkHoBWogAkHYBmoQjRQgAigC6AUgAigC7AUQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AFkUNAEEAIAEoAgAQwQYhBEHw6JkBQRsQhhkhByACQYvpmQFBKhCGGSIINwPYBiACQeAFaiACQdgGahCNFCACKALgBSACKALkBRCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQAXRQ0AQQAgASgCABDBBiEEQbXpmQFBGxCGGSEHIAJB0OmZAUEqEIYZIgg3A9gGIAJB2AVqIAJB2AZqEI0UIAIoAtgFIAIoAtwFEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtABhFDQBBACABKAIAEMEGIQRB+umZAUEeEIYZIQcgAkGY6pkBQS0QhhkiCDcD2AYgAkHQBWogAkHYBmoQjRQgAigC0AUgAigC1AUQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AGUUNAEEAIAEoAgAQwQYhBEHF6pkBQREQhhkhByACQdbqmQFBIBCGGSIINwPYBiACQcgFaiACQdgGahCNFCACKALIBSACKALMBRCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQAaRQ0AQQAgASgCABDBBiEEQfbqmQFBLBCGGSEHIAJBouuZAUE7EIYZIgg3A9gGIAJBwAVqIAJB2AZqEI0UIAIoAsAFIAIoAsQFEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtABtFDQBBACABKAIAEMEGIQRB3euZAUEfEIYZIQcgAkH865kBQS4QhhkiCDcD2AYgAkG4BWogAkHYBmoQjRQgAigCuAUgAigCvAUQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AHEUNAEEAIAEoAgAQwQYhBEGq7JkBQRUQhhkhByACQb/smQFBJBCGGSIINwPYBiACQbAFaiACQdgGahCNFCACKAKwBSACKAK0BRCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQAdRQ0AQQAgASgCABDBBiEEQePsmQFBGBCGGSEHIAJB++yZAUEnEIYZIgg3A9gGIAJBqAVqIAJB2AZqEI0UIAIoAqgFIAIoAqwFEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAB5FDQBBACABKAIAEMEGIQRBou2ZAUEZEIYZIQcgAkG77ZkBQSgQhhkiCDcD2AYgAkGgBWogAkHYBmoQjRQgAigCoAUgAigCpAUQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AH0UNAEEAIAEoAgAQwQYhBEHj7ZkBQR8QhhkhByACQYLumQFBLhCGGSIINwPYBiACQZgFaiACQdgGahCNFCACKAKYBSACKAKcBRCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQAgRQ0AQQAgASgCABDBBiEEQbDumQFBHhCGGSEHIAJBzu6ZAUEtEIYZIgg3A9gGIAJBkAVqIAJB2AZqEI0UIAIoApAFIAIoApQFEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtACFFDQBBACABKAIAEMEGIQRB++6ZAUEYEIYZIQcgAkGT75kBQScQhhkiCDcD2AYgAkGIBWogAkHYBmoQjRQgAigCiAUgAigCjAUQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AIkUNAEEAIAEoAgAQwQYhBEG675kBQRsQhhkhByACQdXvmQFBKhCGGSIINwPYBiACQYAFaiACQdgGahCNFCACKAKABSACKAKEBRCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQAjRQ0AQQAgASgCABDBBiEEQf/vmQFBGRCGGSEHIAJBmPCZAUEoEIYZIgg3A9gGIAJB+ARqIAJB2AZqEI0UIAIoAvgEIAIoAvwEEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtACRFDQBBACABKAIAEMEGIQRBwPCZAUEaEIYZIQcgAkHa8JkBQSkQhhkiCDcD2AYgAkHwBGogAkHYBmoQjRQgAigC8AQgAigC9AQQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AJUUNAEEAIAEoAgAQwQYhBEGD8ZkBQRkQhhkhByACQZzxmQFBKBCGGSIINwPYBiACQegEaiACQdgGahCNFCACKALoBCACKALsBBCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQAmRQ0AQQAgASgCABDBBiEEQcTxmQFBJBCGGSEHIAJB6PGZAUEzEIYZIgg3A9gGIAJB4ARqIAJB2AZqEI0UIAIoAuAEIAIoAuQEEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtACdFDQBBACABKAIAEMEGIQRBm/KZAUEkEIYZIQcgAkG/8pkBQTMQhhkiCDcD2AYgAkHYBGogAkHYBmoQjRQgAigC2AQgAigC3AQQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AKEUNAEEAIAEoAgAQwQYhBEHy8pkBQSIQhhkhByACQZTzmQFBMRCGGSIINwPYBiACQdAEaiACQdgGahCNFCACKALQBCACKALUBBCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQApRQ0AQQAgASgCABDBBiEEQcXzmQFBChCGGSEHIAJBz/OZAUEZEIYZIgg3A9gGIAJByARqIAJB2AZqEI0UIAIoAsgEIAIoAswEEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtACpFDQBBACABKAIAEMEGIQRB6POZAUENEIYZIQcgAkH185kBQRwQhhkiCDcD2AYgAkHABGogAkHYBmoQjRQgAigCwAQgAigCxAQQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AK0UNAEEAIAEoAgAQwQYhBEGR9JkBQQkQhhkhByACQZr0mQFBGBCGGSIINwPYBiACQbgEaiACQdgGahCNFCACKAK4BCACKAK8BBCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQAsRQ0AQQAgASgCABDBBiEEQbL0mQFBCRCGGSEHIAJBu/SZAUEYEIYZIgg3A9gGIAJBsARqIAJB2AZqEI0UIAIoArAEIAIoArQEEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAC1FDQBBACABKAIAEMEGIQRB0/SZAUEdEIYZIQcgAkHw9JkBQSwQhhkiCDcD2AYgAkGoBGogAkHYBmoQjRQgAigCqAQgAigCrAQQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0ALkUNAEEAIAEoAgAQwQYhBEGc9ZkBQRAQhhkhByACQaz1mQFBHxCGGSIINwPYBiACQaAEaiACQdgGahCNFCACKAKgBCACKAKkBBCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQAvRQ0AQQAgASgCABDBBiEEQcv1mQFBDBCGGSEHIAJB1/WZAUEbEIYZIgg3A9gGIAJBmARqIAJB2AZqEI0UIAIoApgEIAIoApwEEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtADBFDQBBACABKAIAEMEGIQRB8vWZAUEIEIYZIQcgAkH69ZkBQRcQhhkiCDcD2AYgAkGQBGogAkHYBmoQjRQgAigCkAQgAigClAQQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AMUUNAEEAIAEoAgAQwQYhBEGR9pkBQQQQhhkhByACQZX2mQFBExCGGSIINwPYBiACQYgEaiACQdgGahCNFCACKAKIBCACKAKMBBCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQAyRQ0AQQAgASgCABDBBiEEQaj2mQFBERCGGSEHIAJBufaZAUEgEIYZIgg3A9gGIAJBgARqIAJB2AZqEI0UIAIoAoAEIAIoAoQEEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtADNFDQBBACABKAIAEMEGIQRB2faZAUEJEIYZIQcgAkHi9pkBQRgQhhkiCDcD2AYgAkH4A2ogAkHYBmoQjRQgAigC+AMgAigC/AMQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0ANEUNAEEAIAEoAgAQwQYhBEH69pkBQQ8QhhkhByACQYn3mQFBHhCGGSIINwPYBiACQfADaiACQdgGahCNFCACKALwAyACKAL0AxCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQA1RQ0AQQAgASgCABDBBiEEQaf3mQFBHBCGGSEHIAJBw/eZAUErEIYZIgg3A9gGIAJB6ANqIAJB2AZqEI0UIAIoAugDIAIoAuwDEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtADZFDQBBACABKAIAEMEGIQRB7veZAUEbEIYZIQcgAkGJ+JkBQSoQhhkiCDcD2AYgAkHgA2ogAkHYBmoQjRQgAigC4AMgAigC5AMQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AN0UNAEEAIAEoAgAQwQYhBEGz+JkBQQsQhhkhByACQb74mQFBGhCGGSIINwPYBiACQdgDaiACQdgGahCNFCACKALYAyACKALcAxCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQA4RQ0AQQAgASgCABDBBiEEQdj4mQFBGBCGGSEHIAJB8PiZAUEnEIYZIgg3A9gGIAJB0ANqIAJB2AZqEI0UIAIoAtADIAIoAtQDEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtADlFDQBBACABKAIAEMEGIQRBl/mZAUEZEIYZIQcgAkGw+ZkBQSgQhhkiCDcD2AYgAkHIA2ogAkHYBmoQjRQgAigCyAMgAigCzAMQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AOkUNAEEAIAEoAgAQwQYhBEHY+ZkBQRMQhhkhByACQev5mQFBIhCGGSIINwPYBiACQcADaiACQdgGahCNFCACKALAAyACKALEAxCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQA7RQ0AQQAgASgCABDBBiEEQY36mQFBEhCGGSEHIAJBn/qZAUEhEIYZIgg3A9gGIAJBuANqIAJB2AZqEI0UIAIoArgDIAIoArwDEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtADxFDQBBACABKAIAEMEGIQRBwPqZAUEYEIYZIQcgAkHY+pkBQScQhhkiCDcD2AYgAkGwA2ogAkHYBmoQjRQgAigCsAMgAigCtAMQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0APUUNAEEAIAEoAgAQwQYhBEH/+pkBQR4QhhkhByACQZ37mQFBLRCGGSIINwPYBiACQagDaiACQdgGahCNFCACKAKoAyACKAKsAxCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQA+RQ0AQQAgASgCABDBBiEEQcr7mQFBBBCGGSEHIAJBzvuZAUETEIYZIgg3A9gGIAJBoANqIAJB2AZqEI0UIAIoAqADIAIoAqQDEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAD9FDQBBACABKAIAEMEGIQRB4fuZAUEQEIYZIQcgAkHx+5kBQR8QhhkiCDcD2AYgAkGYA2ogAkHYBmoQjRQgAigCmAMgAigCnAMQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AQEUNAEEAIAEoAgAQwQYhBEGQ/JkBQRIQhhkhByACQaL8mQFBIRCGGSIINwPYBiACQZADaiACQdgGahCNFCACKAKQAyACKAKUAxCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQBBRQ0AQQAgASgCABDBBiEEQcP8mQFBFBCGGSEHIAJB1/yZAUEjEIYZIgg3A9gGIAJBiANqIAJB2AZqEI0UIAIoAogDIAIoAowDEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAEJFDQBBACABKAIAEMEGIQRB+vyZAUEbEIYZIQcgAkGV/ZkBQSoQhhkiCDcD2AYgAkGAA2ogAkHYBmoQjRQgAigCgAMgAigChAMQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AQ0UNAEEAIAEoAgAQwQYhBEG//ZkBQQ4QhhkhByACQc39mQFBHRCGGSIINwPYBiACQfgCaiACQdgGahCNFCACKAL4AiACKAL8AhCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQBERQ0AQQAgASgCABDBBiEEQer9mQFBFBCGGSEHIAJB/v2ZAUEjEIYZIgg3A9gGIAJB8AJqIAJB2AZqEI0UIAIoAvACIAIoAvQCEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAEVFDQBBACABKAIAEMEGIQRBof6ZAUEaEIYZIQcgAkG7/pkBQSkQhhkiCDcD2AYgAkHoAmogAkHYBmoQjRQgAigC6AIgAigC7AIQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0ARkUNAEEAIAEoAgAQwQYhBEHk/pkBQSAQhhkhByACQYT/mQFBLxCGGSIINwPYBiACQeACaiACQdgGahCNFCACKALgAiACKALkAhCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQBHRQ0AQQAgASgCABDBBiEEQbP/mQFBDxCGGSEHIAJBwv+ZAUEeEIYZIgg3A9gGIAJB2AJqIAJB2AZqEI0UIAIoAtgCIAIoAtwCEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAEhFDQBBACABKAIAEMEGIQRB4P+ZAUEcEIYZIQcgAkH8/5kBQSsQhhkiCDcD2AYgAkHQAmogAkHYBmoQjRQgAigC0AIgAigC1AIQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0ASUUNAEEAIAEoAgAQwQYhBEGngJoBQRAQhhkhByACQbeAmgFBHxCGGSIINwPYBiACQcgCaiACQdgGahCNFCACKALIAiACKALMAhCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQBKRQ0AQQAgASgCABDBBiEEQdaAmgFBBBCGGSEHIAJB2oCaAUETEIYZIgg3A9gGIAJBwAJqIAJB2AZqEI0UIAIoAsACIAIoAsQCEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAEtFDQBBACABKAIAEMEGIQRB7YCaAUEREIYZIQcgAkH+gJoBQSAQhhkiCDcD2AYgAkG4AmogAkHYBmoQjRQgAigCuAIgAigCvAIQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0ATEUNAEEAIAEoAgAQwQYhBEGegZoBQRoQhhkhByACQbiBmgFBKRCGGSIINwPYBiACQbACaiACQdgGahCNFCACKAKwAiACKAK0AhCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQBNRQ0AQQAgASgCABDBBiEEQeGBmgFBEBCGGSEHIAJB8YGaAUEfEIYZIgg3A9gGIAJBqAJqIAJB2AZqEI0UIAIoAqgCIAIoAqwCEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAE5FDQBBACABKAIAEMEGIQRBkIKaAUEWEIYZIQcgAkGmgpoBQSUQhhkiCDcD2AYgAkGgAmogAkHYBmoQjRQgAigCoAIgAigCpAIQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AT0UNAEEAIAEoAgAQwQYhBEHLgpoBQRAQhhkhByACQduCmgFBHxCGGSIINwPYBiACQZgCaiACQdgGahCNFCACKAKYAiACKAKcAhCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQBQRQ0AQQAgASgCABDBBiEEQfqCmgFBGBCGGSEHIAJBkoOaAUEnEIYZIgg3A9gGIAJBkAJqIAJB2AZqEI0UIAIoApACIAIoApQCEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAFFFDQBBACABKAIAEMEGIQRBuYOaAUEeEIYZIQcgAkHXg5oBQS0QhhkiCDcD2AYgAkGIAmogAkHYBmoQjRQgAigCiAIgAigCjAIQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AUkUNAEEAIAEoAgAQwQYhBEGEhJoBQQYQhhkhByACQYqEmgFBFRCGGSIINwPYBiACQYACaiACQdgGahCNFCACKAKAAiACKAKEAhCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQBTRQ0AQQAgASgCABDBBiEEQZ+EmgFBCRCGGSEHIAJBqISaAUEYEIYZIgg3A9gGIAJB+AFqIAJB2AZqEI0UIAIoAvgBIAIoAvwBEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAFRFDQBBACABKAIAEMEGIQRBwISaAUEUEIYZIQcgAkHUhJoBQSMQhhkiCDcD2AYgAkHwAWogAkHYBmoQjRQgAigC8AEgAigC9AEQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AVUUNAEEAIAEoAgAQwQYhBEH3hJoBQQ0QhhkhByACQYSFmgFBHBCGGSIINwPYBiACQegBaiACQdgGahCNFCACKALoASACKALsARCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQBWRQ0AQQAgASgCABDBBiEEQaCFmgFBEBCGGSEHIAJBsIWaAUEfEIYZIgg3A9gGIAJB4AFqIAJB2AZqEI0UIAIoAuABIAIoAuQBEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAFdFDQBBACABKAIAEMEGIQRBz4WaAUEHEIYZIQcgAkHWhZoBQRYQhhkiCDcD2AYgAkHYAWogAkHYBmoQjRQgAigC2AEgAigC3AEQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AWEUNAEEAIAEoAgAQwQYhBEHshZoBQQgQhhkhByACQfSFmgFBFxCGGSIINwPYBiACQdABaiACQdgGahCNFCACKALQASACKALUARCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQBZRQ0AQQAgASgCABDBBiEEQYuGmgFBHhCGGSEHIAJBqYaaAUEtEIYZIgg3A9gGIAJByAFqIAJB2AZqEI0UIAIoAsgBIAIoAswBEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAFpFDQBBACABKAIAEMEGIQRB1oaaAUEVEIYZIQcgAkHrhpoBQSQQhhkiCDcD2AYgAkHAAWogAkHYBmoQjRQgAigCwAEgAigCxAEQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AW0UNAEEAIAEoAgAQwQYhBEGPh5oBQRIQhhkhByACQaGHmgFBIRCGGSIINwPYBiACQbgBaiACQdgGahCNFCACKAK4ASACKAK8ARCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQBcRQ0AQQAgASgCABDBBiEEQcKHmgFBDRCGGSEHIAJBz4eaAUEcEIYZIgg3A9gGIAJBsAFqIAJB2AZqEI0UIAIoArABIAIoArQBEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAF1FDQBBACABKAIAEMEGIQRB64eaAUEREIYZIQcgAkH8h5oBQSAQhhkiCDcD2AYgAkGoAWogAkHYBmoQjRQgAigCqAEgAigCrAEQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AXkUNAEEAIAEoAgAQwQYhBEGciJoBQSAQhhkhByACQbyImgFBLxCGGSIINwPYBiACQaABaiACQdgGahCNFCACKAKgASACKAKkARCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQBfRQ0AQQAgASgCABDBBiEEQeuImgFBJxCGGSEHIAJBkomaAUE2EIYZIgg3A9gGIAJBmAFqIAJB2AZqEI0UIAIoApgBIAIoApwBEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAGBFDQBBACABKAIAEMEGIQRByImaAUEgEIYZIQcgAkHoiZoBQS8QhhkiCDcD2AYgAkGQAWogAkHYBmoQjRQgAigCkAEgAigClAEQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AYUUNAEEAIAEoAgAQwQYhBEGXipoBQSIQhhkhByACQbmKmgFBMRCGGSIINwPYBiACQYgBaiACQdgGahCNFCACKAKIASACKAKMARCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQBiRQ0AQQAgASgCABDBBiEEQeqKmgFBHBCGGSEHIAJBhouaAUErEIYZIgg3A9gGIAJBgAFqIAJB2AZqEI0UIAIoAoABIAIoAoQBEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAGNFDQBBACABKAIAEMEGIQRBsYuaAUENEIYZIQcgAkG+i5oBQRwQhhkiCDcD2AYgAkH4AGogAkHYBmoQjRQgAigCeCACKAJ8EIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAGRFDQBBACABKAIAEMEGIQRB2ouaAUEkEIYZIQcgAkH+i5oBQTMQhhkiCDcD2AYgAkHwAGogAkHYBmoQjRQgAigCcCACKAJ0EIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAGVFDQBBACABKAIAEMEGIQRBsYyaAUEMEIYZIQcgAkG9jJoBQRsQhhkiCDcD2AYgAkHoAGogAkHYBmoQjRQgAigCaCACKAJsEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAGZFDQBBACABKAIAEMEGIQRB2IyaAUENEIYZIQcgAkHljJoBQRwQhhkiCDcD2AYgAkHgAGogAkHYBmoQjRQgAigCYCACKAJkEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAGdFDQBBACABKAIAEMEGIQRBgY2aAUEMEIYZIQcgAkGNjZoBQRsQhhkiCDcD2AYgAkHYAGogAkHYBmoQjRQgAigCWCACKAJcEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAGhFDQBBACABKAIAEMEGIQRBqI2aAUEJEIYZIQcgAkGxjZoBQRgQhhkiCDcD2AYgAkHQAGogAkHYBmoQjRQgAigCUCACKAJUEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAGlFDQBBACABKAIAEMEGIQRByY2aAUEKEIYZIQcgAkHTjZoBQRkQhhkiCDcD2AYgAkHIAGogAkHYBmoQjRQgAigCSCACKAJMEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAGpFDQBBACABKAIAEMEGIQRB7I2aAUEbEIYZIQcgAkGHjpoBQSoQhhkiCDcD2AYgAkHAAGogAkHYBmoQjRQgAigCQCACKAJEEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAGtFDQBBACABKAIAEMEGIQRBsY6aAUEVEIYZIQcgAkHGjpoBQSQQhhkiCDcD2AYgAkE4aiACQdgGahCNFCACKAI4IAIoAjwQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AbEUNAEEAIAEoAgAQwQYhBEHqjpoBQSUQhhkhByACQY+PmgFBNBCGGSIINwPYBiACQTBqIAJB2AZqEI0UIAIoAjAgAigCNBCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQBtRQ0AQQAgASgCABDBBiEEQcOPmgFBEhCGGSEHIAJB1Y+aAUEhEIYZIgg3A9gGIAJBKGogAkHYBmoQjRQgAigCKCACKAIsEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAG5FDQBBACABKAIAEMEGIQRB9o+aAUEQEIYZIQcgAkGGkJoBQR8QhhkiCDcD2AYgAkEgaiACQdgGahCNFCACKAIgIAIoAiQQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0Ab0UNAEEAIAEoAgAQwQYhBEGlkJoBQQkQhhkhByACQa6QmgFBGBCGGSIINwPYBiACQRhqIAJB2AZqEI0UIAIoAhggAigCHBCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsCQCABLQBwRQ0AQQAgASgCABDBBiEEQcaQmgFBCBCGGSEHIAJBzpCaAUEXEIYZIgg3A9gGIAJBEGogAkHYBmoQjRQgAigCECACKAIUEIcZIQkCQCAIQgODQgBSDQAgCKciAyADKAIAIgVBf2o2AgAgBUEBRw0AIAMgAygCEBDsHgsCQAJAQcgAEIoBIgNFDQAgA0IANwMQIANCkb4BNwMIIANCADcDACADQgA3ABUgA0IANwM4IANBADoANCADIAQ2AjAgA0IANwMoIAMgBzcDICADQQA6AEBBGBCKASIFRQ0BIAVCADcDCCAFIAk3AwAgBUIANwMQAkAgACgCCCIGIAAoAgBHDQAgABC4GgsgACgCBCAGQThsaiIEQgA3AhQgBCAFNgIQIARBATYCDCAEIAM2AgggBEKAgICAEDcDACAEQgA3ARogACAGQQFqNgIIDAILQQhByAAQoCQAC0EIQRgQoCQACwJAIAEtAHFFDQBBACABKAIAEMEGIQRB5ZCaAUEGEIYZIQcgAkHrkJoBQRUQhhkiCDcD2AYgAkEIaiACQdgGahCNFCACKAIIIAIoAgwQhxkhCQJAIAhCA4NCAFINACAIpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEOweCwJAAkBByAAQigEiA0UNACADQgA3AxAgA0KRvgE3AwggA0IANwMAIANCADcAFSADQgA3AzggA0EAOgA0IAMgBDYCMCADQgA3AyggAyAHNwMgIANBADoAQEEYEIoBIgVFDQEgBUIANwMIIAUgCTcDACAFQgA3AxACQCAAKAIIIgYgACgCAEcNACAAELgaCyAAKAIEIAZBOGxqIgRCADcCFCAEIAU2AhAgBEEBNgIMIAQgAzYCCCAEQoCAgIAQNwMAIARCADcBGiAAIAZBAWo2AggMAgtBCEHIABCgJAALQQhBGBCgJAALAkAgAS0AckUNAEEAIAEoAgAQwQYhBEGAkZoBQQoQhhkhByACQYqRmgFBGRCGGSIINwPYBiACIAJB2AZqEI0UIAIoAgAgAigCBBCHGSEJAkAgCEIDg0IAUg0AIAinIgMgAygCACIFQX9qNgIAIAVBAUcNACADIAMoAhAQ7B4LAkACQEHIABCKASIDRQ0AIANCADcDECADQpG+ATcDCCADQgA3AwAgA0IANwAVIANCADcDOCADQQA6ADQgAyAENgIwIANCADcDKCADIAc3AyAgA0EAOgBAQRgQigEiBUUNASAFQgA3AwggBSAJNwMAIAVCADcDEAJAIAAoAggiBiAAKAIARw0AIAAQuBoLIAAoAgQgBkE4bGoiBEIANwIUIAQgBTYCECAEQQE2AgwgBCADNgIIIARCgICAgBA3AwAgBEIANwEaIAAgBkEBajYCCAwCC0EIQcgAEKAkAAtBCEEYEKAkAAsgASABKAIEQX9qNgIEIAJB4AZqJAALktMBAh1/Bn4jAEGADmsiBSQAIAQtABshBiAELQARIQdBBSEIIAVBBTYCsAsCQCAEKAIAQYCAgIB4Rg0AIAVBsAtqEP4aQQIhCAsgAygCCCEJQQRB0AAQ6CAiCiAINgIIIApCgYCAgBA3AgAgCiAEKQIANwIMIAogBCgCCDYCFCAFQdgFaiADEKcRIAUgCjYC4AgCQAJAIAUoAtwFIgMgBSgC4AUiC0H//QMQnhhFDQACQAJAIAtBBEkNACADLAADQb9/Sg0BDAMLIAtBA0cNAgsgBSADQQNqNgLcBSAFIAtBfWoiCzYC4AULIAogCigCACIDQQFqNgIAAkACQAJAAkACQAJAAkACQAJAIANBf0wNACAKIQNBACEMAkAgCigCCCINQQJHDQAgAUHYAGooAgAiDiABQdwAaigCAEEYbGohDyAFQbkLaiEDIAooAhQhECAKKAIQIREDQAJAAkACQAJAIA4gD0YNACAPQXBqKAIAIQhBACESQQAhEwJAIBBFDQAgES0AAEEvRiETCyAPQWxqKAIAIQwCQCAIRQ0AIAwtAABBL0YhEgsgD0FoaiEUIAUgEjoA3gJBBiEVIAVBBjoAyAIgBSAINgLEAiAFIAw2AsACIAVBgQQ7AdwCQQEhFkECIRcgECEMIBEhGANAIAMgBSkAmAc3AAAgAyAFKQCgBzcACCADIAUoAKcHNgAPIAUgFToAuAsgBSATOgDOCyAFIAw2ArQLIAUgGDYCsAsgBSAXOgDNCyAFIBY6AMwLIAVB8AhqIAVBsAtqEJEEIAVBkApqIAVBwAJqEJEEIAUtAJAKIQgCQAJAAkAgBS0A8AgiEkEKRg0AIAhBCkYNASASQXtqQQAgEkEFSxsiDCAIQXtqQQAgCEEFSxtHDQcgBSgCmAohGCAFKAKUCiEWIAUoAvgIIRMgBSgC9AghFwJAAkACQAJAIAwOBQAGBgYBBgsgEiAIRw0KIAUoAqAKIRkgBSgCnAohGiAFLQCRCiEMIAUoAoAJIQggBSgC/AghGyAFLQDxCCEVAkACQAJAAkAgEg4GAAEGBQIDAAsgEyAYRw0NIBcgFiATELIYDQ0MCAsgEyAYRw0MIBcgFiATELIYDQwgCCAZRw0MIBsgGiAIELIYDQwMBwsgEyAYRw0LIBcgFiATELIYDQsgCCAZRw0LIBsgGiAIELIYDQsMBgsgFUH/AXEgDEH/AXFHDQoMBQsgEyAYRw0JIBcgFiATELIYRQ0EDAkLIBMgGEcNCCAXIBYgExCyGA0IDAMLIBVB/wFxIAxB/wFxRw0HDAILIAhBCkcNBgsgBSAFKACnBzYAtwYgBSAFKQOgBzcDsAYgBSAFKQOYBzcDqAYgE0H/AXFBAkYNBSAFIAUoALcGNgDYAiAFIAUpA7AGNwDRAiAFIAUpA6gGNwDJAiAFIBk6AN8CIAUgEzoA3gIgBSAXOgDdAiAFIBU6AMgCIAUgDDYCxAIgBSAYNgLAAiAFIBY6ANwCAkACQAJAAkAgFkH/AXFBAkcNAEEAIRIgDEUNAwJAA0BBACEDAkADQAJAIBggA2otAABBL0cNAEEBIQgMAgsgDCADQQFqIgNHDQALQQAhCCAMIQMLAkACQCADDgIBAAMLIBgtAABBLkcNAgsgDCAIIANqIgNJDQMgGCADaiEYIAwgA2siDA0AC0EAIQwLIAUgDDYCxAIgBSAYNgLAAgsgF0H/AXFBAkcNAQJAAkAgFkH/AXFBAUsNAAJAAkAgE0EBcQ0ADAELIAxBAkkNBANAIAVBsAtqIAVBwAJqEIUJIAUtALQLQQpHDQUgDCAFKAKwCyIIayEDIAwgCEkNAyAFIAM2AsQCIAMhDCADQQFLDQALIAMhEgwFCwNAIAwhAwJAAkACQAJAIAwOAgMAAQtBACEDIBgtAABBLkYNAQwCC0EAIQMgGC0AAEEuRw0BIBgtAAFBL0cNAQtBASEDCyAMIANNDQQgBUGwC2ogBUHAAmoQhQkgBS0AtAtBCkcNBCAMIAUoArALIghrIQMgDCAISQ0CIAUgAzYCxAIgAyEMDAALC0EAIRIgDEUNAwNAIAVBsAtqIAVBwAJqEIUJIAUtALQLQQpHDQMgDCAFKAKwCyIIayEDIAwgCEkNASAFIAM2AsQCIAMhDCADRQ0EDAALC0EAIAMgDEHwtpgBEI8KAAsgAyAMIAxBoLeYARCPCgALIAwhEgsgBUGwC2ogD0F4aigCACAPQXxqKAIAIBggEhD3CQwDCyAFIAMpAAA3A5gHIAUgAykACDcDoAcgBSADKAAPNgCnByAFLQDPCyEZIAUtAM4LIRMgBS0AzQshFyAFLQDMCyEWIAUtALgLIRUgBSgCtAshDCAFKAKwCyEYDAALC0EBIQMCQCAQRQ0AIBAQigEiA0UNAiAQRQ0AIAMgESAQ/AoAAAsgBSAQNgK4CyAFIAM2ArQLIAUgEDYCsAsLIA4gD0chDCAFIAUoArgLNgLIAiAFIAUpArALNwPAAkEEQdAAEOgeIgNBAjYCCCADQoGAgIAQNwIAIAMgBSkDwAI3AgwgAyAFKALIAjYCFAwDC0EBIBAQ/CAACyAUIQ8MAAsLIAFB6ABqIhcQiAUgASALIAEoAogBIhJqQQFqNgKIASAFKALYBSEYIAUoAuQFIRYgBSgC3AUhEyAFKALgBSEIIAVCADcDyAogBUIANwPACiAFQgA3A7gKIAVCADcDsAogBULzytHLp4zZsvQANwOoCiAFQoPfkfOWzNy35AA3A6AKIAVC4eSV89bs2bzsADcDmAogBUL1ys2D16zbt/MANwOQCiAFQZAKaiATIAgQ6AsgBUHAAmpBEGogBUGQCmoQqQ0gBUIANwPoCyAFQgA3A+ALIAVCADcD2AsgBUIANwPQCyAFQvPK0cunjNmy9AA3A8gLIAVCg9+R85bM3LfkADcDwAsgBULh5JXz1uzZvOwANwO4CyAFQvXKzYPXrNu38wA3A7ALIAMgBUGwC2oQ1gggBUHgAmogBUGwC2oQqQ0gBSAMOgCsAyAFIAM2ApgDIAUgFjYCzAIgBSAINgLIAiAFIBM2AsQCIAUgGDYCwAIgBSAIIBJqNgKoAyAFIBI2AqQDIAVBADYCoAMgBSAKNgKcAyAFQoCAgICAgICAgH83A/ACIAVBsAtqQQhqIAVBwAJqQfAA/AoAAEEQQYABEOgeIgNCgYCAgBA3AwAgA0EIaiAFQbALakH4APwKAAAgAyADKAIAIghBAWo2AgAgCEF/TA0AAkAgASgCdCIIIAEoAmxHDQAgAUHsAGoQjRoLIAEoAnAgCEECdGogAzYCACABIAhBAWo2AnQgBUIANwPoCyAFQgA3A+ALIAVCADcD2AsgBUIANwPQCyAFQvPK0cunjNmy9AA3A8gLIAVCg9+R85bM3LfkADcDwAsgBULh5JXz1uzZvOwANwO4CyAFQvXKzYPXrNu38wA3A7ALIAMoAmggBUGwC2oQ1gggBUGwC2ogAy0AfBCRECAFQbALaiADKAJsIghBAEcQkiACQCAIRQ0AIAggBUGwC2oQ1ggLIAVBwAJqIAVBsAtqEKkNIAUpA8gCISIgBSkDwAIhIyADIAMoAgAiCEEBajYCACAIQX9MDQAgBSAjNwOwCyAFICI3A7gLIAFB+ABqIQggIyAiEMwcISQgBSAFQbALajYCkAoCQCABKAKAAQ0AIAggAUGIAWoQmQcaCyAHRSETIAUgCDYCxAIgBSAFQZAKajYCwAIgBUH4AGogASgCeCABKAJ8ICQgBUHAAmpBCxDaCiABKAJ4IQggBSgCfCESAkACQCAFKAJ4QQFHDQAgCCASaiIMLQAAIRggDCAkQhmIpyIWOgAAIAggASgCfCASQXhqcWpBCGogFjoAACABIAEoAoQBQQFqNgKEASABIAEoAoABIBhBAXFrNgKAASAIIBJBBXRrIghBYGoiEiAiNwMIIBIgIzcDACAIQXBqIAM2AgAMAQsgCCASQQV0a0FwaiIIKAIAIRIgCCADNgIAIAUgEjYCwAIgBUHAAmoQ+h4LIAYgE3IhCCAXELEOAkAgDUECRw0AIAVB4AhqEPseCyAFQQI6AIYBIAUgBCgADDYAhwEgBSAELQAQOgCLASAFIAM2AoABEOMeIRIgBRDjHjYClAEgBSASNgKQASADQRBqIRICQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAIQQFxDQAgBUGwC2ogEhDDFCAFQcAEaiAFQYYBaiAFQbALaiAFQZABahDzCCAFIAUoArgFIghBgICBgAJyIAhB///+/31xQYCAgIACciAFKALABUGACHEbNgK4BSAFKAK8BSEIIAVBsAtqIAVBwARqQfwA/AoAACAFQQA2AvgMIAVCgICAgIABNwPwDCAFQX82AowNIAVBADoAkA0gBSAINgLkDCAFIAg2AuAMIAUgCDYC3AwgBSAINgLYDCAFQQs2ArgMIAUgCDYCrAwgBUEAKQOgppwBNwL8DCAFQQApA6imnAE3AoQNIAUgBSkDwAU3A7AMIAVBowE7AegMIAVBwAJqIAVBsAtqELkEIAUgBSkD4Aw3A9gMIAUgBSkCwAI3A+AMIAUgBSgCyAIiEjYC6AwCQCASQf8BcUGjAUcNACAFIAg2AuQMIAUgCDYC4AwLIAVBwAJqIAVBsAtqQegB/AoAACAELQATDgMCAwEDCyAFQbALaiASEMMUIAVBqAFqIAVBhgFqIAVBsAtqIAVBkAFqEPMIIAVBADYCuAIgBUKAgICAwAA3A7ACIAUgBSgCoAIiCEGAgIGAAnIgCEH///7/fXFBgICAgAJyIAUoAqgCQYAIcRs2AqACIAVBsAtqIAVBqAFqQZgB/AoAACAFQQA2AogNIAVCgICAgIABNwOADSAFQX82ApwNIAVCADcD6AwgBUELNgLIDCAFQgA3A/AMIAVBADoAoA0gBUEAKQOgppwBNwKMDSAFQQApA6imnAE3ApQNIAVBowE7AfgMIAVBwAJqIAVBsAtqELkEIAVB8AxqIQgCQCAFLQDIAkGjAUYNACAFQbALaiAFQcACahCjDwsgBSkD8AwhIiAIIAUoAsgCNgIIIAggBSkCwAI3AgAgBSAiNwPoDAJAIAUtAPgMQaMBRw0AIAVCADcD8AwLIAVBwAJqIAVBsAtqQfgB/AoAACAELQATDgMEBQMFCyAFQfADaiEVQgAhIiAFKALwAyESAkAgBS0A+ANBoQFHDQAgBSAFKQPQAjcDuAsgBSAFKQPIAiIiNwOwCyAFQQo2AsgCAkACQCAipyIIQQpGDQAgCEECRg0BIAVBsAtqELwLC0GI85oBQShBsIebARC3IQALIAUpA7gLISICQAJAIAUoAsgDIghBC0cNACAFQbALaiAFQcACahDGASAFKALwAyEIDAELIAVBCzYCyAMgBSAFKQPYAzcDsAsgBSAFKALgAzYCuAsgBSAINgLIAiAFIAUpAswDNwLMAiAFIAUoAtQDNgLUAiASIQgLIAUoAvQDIRMgFSAFKQOwCzcCACAVIAUoArgLNgIIIAUgEzYC7AMgBSAINgLoAwsgBSAFKAK4AyIZQYSAgIACcjYCuAMgBUGwC2ogBUHAAmpBAUGkARClBiAFIBk2ArgDIAUoArQLIRYCQCAFKAKwCyIPQYCAgIB4Rw0AQgIhIyAiUA0PICJCA4NCAFINDyAipyIIIAgoAgAiEkF/ajYCACASQQFHDQ8gCCAIKAIQEOweDA8LIAUoArgLIRMCQAJAIAUtAKAEDQAgFiATQThsIhhqIRdBACEIA0AgGCAIRg0CIBYgCGohDCAIQThqIQggDCgCAEEJRg0ACwtCACEjIBlBAnENDSAFIBlBjoCAgAJyNgK4AwwNCyAPQThsIhlBMG4hCCAWIQwgFiEYAkAgE0UNACAWIRggFiETA0AgEygCAEEJRw0HIBggE0EIakEw/AoAACAYQTBqIRggE0E4aiITIBdHDQALIBchDAtBAEEIEPUjIBcgDGtBOG4hEwJAIBcgDEYNAANAIAwQ/AUgDEE4aiEMIBNBf2oiEw0ACwsgFiEMIA9FDQsgFiEMIBkgCEEwbCITRg0LAkAgGUEvSw0AQQghDCAZRQ0MIBYgGUEIENQUDAwLIBYgGUEIIBMQuwQiDA0LQQggExCgJAALIAUgBSgCuANB/f///31xQYCAgIACcjYCuAMgBUHwA2ohE0IAISIgBSgC8AMhEgJAIAUtAPgDQaEBRw0AIAUgBSkD0AI3A7gLIAUgBSkDyAIiIjcDsAsgBUEKNgLIAgJAAkAgIqciCEEKRg0AIAhBAkYNASAFQbALahC8CwtBiPOaAUEoQbCHmwEQtyEACyAFKQO4CyEiAkACQCAFKALIAyIIQQtHDQAgBUGwC2ogBUHAAmoQxgEgBSgC8AMhCAwBCyAFQQs2AsgDIAUgBSkD2AM3A7ALIAUgBSgC4AM2ArgLIAUgCDYCyAIgBSAFKQLMAzcCzAIgBSAFKALUAzYC1AIgEiEICyAFKAL0AyEMIBMgBSkDsAs3AgAgEyAFKAK4CzYCCCAFIAw2AuwDIAUgCDYC6AMLIAVBsAtqIAVBwAJqQQFBpAEQpAYCQAJAIAUoArALIghBgICAgHhHDQAgBSgCtAshEgJAICJQDQAgIkIDg0IAUg0AICKnIgggCCgCACITQX9qNgIAIBNBAUcNACAIIAgoAhAQ7B4LQYCAgIB4IQgMAQsgBSgC7AMhGCAFKQK0CyEkAkACQCAFKALIAyIMQQtHDQAgBUGwC2ogBUHAAmoQxgEMAQsgBUELNgLIAyAFIAUpA9gDNwOwCyAFIAUoAuADNgK4CyAFQcwDaiEWAkAgBSgCyAJBCkYNACAFQcgCahC8CwsgBSAMNgLIAiAFIBYpAgA3AswCIAUgFigCCDYC1AILIAUpA/ADISMgEyAFKQOwCzcCACATIAUoArgLNgIIIAUgIzcD6AMLQgJCASAIQYCAgIB4RhshIyAkQiCIpyETICSnIQwMDgsgBSAFKAK4A0GOgICAAnI2ArgDIAVB8ANqIQhCACEiIAUoAvADIRYCQCAFLQD4A0GhAUcNACAFIAUpA9ACNwO4CyAFIAUpA8gCIiI3A7ALIAVBCjYCyAICQAJAICKnIhJBCkYNACASQQJGDQEgBUGwC2oQvAsLQYjzmgFBKEGwh5sBELchAAsgBSkDuAshIgJAAkAgBSgCyAMiEkELRw0AIAVBsAtqIAVBwAJqEMYBIAUoAvADIRIMAQsgBUELNgLIAyAFIAUpA9gDNwOwCyAFIAUoAuADNgK4CyAFIBI2AsgCIAUgBSkCzAM3AswCIAUgBSgC1AM2AtQCIBYhEgsgBSgC9AMhEyAIIAUpA7ALNwIAIAggBSgCuAs2AgggBSATNgLsAyAFIBI2AugDCyAFQbALaiAFQcACakEBQaQBEKUGIAUoArQLIRICQAJAIAUoArALIgxBgICAgHhHDQACQCAiUA0AICJCA4NCAFINACAipyIIIAgoAgAiE0F/ajYCACATQQFHDQAgCCAIKAIQEOweC0GAgICAeCETIAVBkApqIQgMAQsgBSgC7AMhGCAFKAK4CyETAkACQCAFKALIAyIXQQtHDQAgBUGwC2ogBUHAAmoQxgEMAQsgBUELNgLIAyAFIAUpA9gDNwOwCyAFIAUoAuADNgK4CyAFQcwDaiEVAkAgBSgCyAJBCkYNACAFQcgCahC8CwsgBSAXNgLIAiAFIBUpAgA3AswCIAUgFSgCCDYC1AILIAUpA/ADISMgCCAFKQOwCzcCACAIIAUoArgLNgIIIAUgIzcD6AMgBSAMNgKQCiAFQbALaiEIIBIhDCAWIRILIAggEzYCAEICQgAgBSgCkAoiCEGAgICAeEYbISMgBSgCsAshEwwNCyAFKAKABCESIAVBsAtqIAVBwAJqENEeAkAgBSgCsAtBAUcNACAFKAK0CyESQgIhIwwICyAFIAUoArgDIhdBhICAgAJyNgK4AyAFKQO4CyEiIAVBsAtqIAVBwAJqQQFBpAEQuwggBSAXNgK4AyAFKAK0CyEWAkAgBSgCsAsiFUGAgICAeEcNACAiEN4iQgIhIyAWIRIMCAsgBSgCuAshEwJAAkAgBS0AsAQNACATQThsIRhBACEIA0AgGCAIRg0CIBYgCGohDCAIQThqIQggDCgCAEEJRg0ACwtCACEjIBdBAnENBiAFIBdBjoCAgAJyNgK4AwwGCyATQThsIQwgFUE4bCIXQTBuIQggFiETIBYhGAJAA0AgDEUNASATKAIAQQlHDQUgGCATQQhqQTD8CgAAIAxBSGohDCAYQTBqIRggE0E4aiETDAALCyAFQQg2ArALIAVBADYCuAtBAEEIEPUjIAVBCDYCvAsgBUEINgK0CyAWIQwCQCAVRQ0AIBYhDCAXIAhBMGwiE0YNACAWIBcgExDhHiIMRQ0FCyAYIBZrQTBuIRMgBUGwC2oQ/xlCASEjDAYLIAUgBSgCuANB/f///31xQYCAgIACcjYCuAMgBSgCgAQhEiAFQbALaiAFQcACahDRHgJAIAUoArALQQFHDQAgBSgCtAshEkICISNBgICAgHghCAwHCyAFKQO4CyEiIAVBsAtqIAVBwAJqQQFBpAEQughBgICAgHghCAJAIAUoArALIhZBgICAgHhHDQAgBSgCtAshEiAiEN4iQgIhIwwHCyAFKQK0CyIjQiCIpyETIAUoAvwDIRggBUHAAmoQ5REgI6chDEIBISMgFiEIDAYLIAUgBSgCuANBjoCAgAJyNgK4AyAFKAKABCEWIAVBsAtqIAVBwAJqENEeAkACQCAFKAKwC0EBRw0AIAUoArQLIRJBgICAgHghCCAFQbALaiETDAELIAUpA7gLISIgBUGwC2ogBUHAAmpBAUGkARC7CEGAgICAeCEIIAUoArQLIRICQCAFKAKwCyITQYCAgIB4Rw0AICIQ3iIgBUGwC2ohEwwBCyAFKAL8AyEYIAUoArgLIQggBUHAAmoQ5REgBSATNgKwCyAFQZAKaiETIBIhDCAWIRILIBMgCDYCAAJAIAUoArALIghBgICAgHhHDQBCAiEjDAYLQgAhIyAFKAKQCiETDAULQbb1mgFBgwFB+PWaARDkGwALQbb1mgFBgwFB+PWaARDkGwALQQggExCgJAALIBUhCCAWIQwLIAUoAvwDIRggBUHAAmoQ5RELIAVBzAVqIAVBwAJqEO0NIAUoAtADIRYgBSgCzAMhGSAFQgQ3AswDIAUoAsgDIRogBUEANgLIAyAFQZAEahCCGyAFQcACahD7DSAFKALIAyAFKALMAxCOJCAFQdgDahCyIgwFC0EAQQgQ9SMgGCAWa0EwbiETQgEhIwwBCyAPIQggFiEMCyAFKALsAyEYAkACQCAFKALIAyIWQQtHDQAgBUGwC2ogBUHAAmoQxgEMAQsgBUELNgLIAyAFIAUpA9gDNwOwCyAFIAUoAuADNgK4CyAFQcwDaiEXAkAgBSgCyAJBCkYNACAFQcgCahC8CwsgBSAWNgLIAiAFIBcpAgA3AswCIAUgFygCCDYC1AILIAUpA/ADISQgFSAFKQOwCzcCACAVIAUoArgLNgIIIAUgJDcD6AMMAQsgFiESCyAFQcwFaiAFQcACahDtDSAFQYAEahCCGyAFQcACahD7DSAFQcgDahCyIkEEIRlBACEWQQAhGgsgBSAFKALUBTYCoAEgBSAFKQLMBTcDmAECQAJAAkACQCAjQgJSDQAgBUHAAmogEiACEIwFIAVBsAtqQQRqIhNBpPuaAUENELUUIAVBADYCsAsgBSgCxAIiAxDcICADIAUpArgLNwIIIAMgBSkCsAs3AgAgBUHAAmoQ7wIgBUHAAmoQnQ4gBSgCoAEhCCAFKAKcASEDIAUgBSgCmAE2AsgCIAUgAzYCwAIgBSADIAhBAnQiCGoiDDYCzAIDQCAIRQ0CIAVBkApqIAMoAgAgAhCMBSATQaT7mgFBDRC1FCAFQQA2ArALIAUoApQKIhIQ3CAgEiAFKQK4CzcCCCASIAUpArALNwIAIAhBfGohCCADQQRqIQMgBUGQCmoQ7wIgBUGQCmoQnQ4MAAsLIAUgEzYC+AUgBSAMNgL0BSAFIAg2AvAFIAUgIjcD6AUgBSAYNgLkBSAFIBI2AuAFIAUgIzcD2AUCQCAFKAKgASIIRQ0AIAUoApwBIQMgBSAFKAKYATYCyAIgBSADNgLAAiAFIAMgCEECdCIIaiIMNgLMAiAFQbALakEEaiETAkADQCAIRQ0BIAVBkApqIAMoAgAgAhCMBSATQaT7mgFBDRC1FCAFQQA2ArALIAUoApQKIhIQ3CAgEiAFKQK4CzcCCCASIAUpArALNwIAIAhBfGohCCADQQRqIQMgBUGQCmoQ7wIgBUGQCmoQnQ4MAAsLIAUgDDYCxAIgBUHAAmoQ2xUgAEEEakGY+5oBQQwQtRQgAEGAgICAeDYCACAAQQA6ABAgBUHYBWoQiB8MCwsgBUHwBWohDCAHDQIgFkECSQ0BAkAgFkEVSQ0AIBkgFhCFEQwCCyAWQQxsIRJBDCEIA0AgEiAIRg0CIBkgGSAIahC3DSAIQQxqIQgMAAsLIAUgDDYCxAIgBUHAAmoQ2xUgAEEEakGY+5oBQQwQtRQgAEGAgICAeDYCACAAQQA6ABAMCQsCQCAGQQFxRQ0AIAUgFjYCvAsgBSAZNgK4CyAFIANBFGopAgA3ArALIAVB2AVqIAVBsAtqEIYfIAIoAgBFDQAgAEEEakGE9JoBQRIQtRQgAEGAgICAeDYCACAAQQE6ABAMBwsgBUHUC2oiGyADQRBqEMkgIAUgFjYC0AsgBSAZNgLMCyAFIBo2AsgLIAVCBDcCwAsgBUIANwK4CyAFQoCAgIDAADcCsAsCQAJAIAUpA9gFQgFSDQAgDCAFQbALahDrHAwBCyAFKAL0BSIMIAUoAvgFQThsaiEYIAVBwAJqQQRqIRkDQCAMIgggGEYNASAIQThqIQwCQCAIKAIAIhJBCUcNACAIQQhqIAVBsAtqEOIEDAELAkACQAJAAkACQAJAAkACQAJAAkAgEg4JAAECAwQFBgcKAAsCQCAILQAgDQAgCCgCDEHIAGwhEyAIKAIIIRICQANAIBNFDQECQCASKQMAQgJWDQAgEkHAAGotAABBAUcNACASQThqKAIAIRYCQAJAIAUoAswLIAUoAtALIBJBPGooAgAiFxDHIiIVLQAIQQdGDQAgFiEVDAELIBYgFSgCBCIXIBYgF0kbIRUgFiAXIBYgF0sbIRcLIAVBsAtqIBUgFxCAHAsgEkHIAGohEiATQbh/aiETDAALCyAIKAIcIAVBsAtqEO8iDAoLIAVBsAtqIAgoAhQiEiAIKAIYIggQgBwgBUGwC2ogEiAIEMoPDAkLAkAgCEEIaiISEMkSDQAgEhCeDg0AIAVBsAtqIBIQsQgMCQsgBUGwC2ogCCgCMCISIAgoAjQiCBCAHCAFQbALaiASIAgQyg8MCAsgCC0AIA0FIAgoAgxB0ABsIRIgCCgCCCEIA0AgEkUNCAJAIAgpAwBCAVYNACAIQcgAai0AAEEBRw0AIAhBwABqKAIAIRMCQAJAIAUoAswLIAUoAtALIAhBxABqKAIAIhYQxyIiFy0ACEEHRg0AIBMhFwwBCyATIBcoAgQiFiATIBZJGyEXIBMgFiATIBZLGyEWCyAFQbALaiAXIBYQgBwLIAhB0ABqIQggEkGwf2ohEgwACwtBACESAkACQAJAIAgoAggiEw4DAQACAQsgCCgCKCgCGEGAgICAeEYhEgsgEg0AIBNBAkYNACAIQShqIQgCQCATDQAgCCAFQbALahCDAgwICyAIIAVBsAtqEMsNDAcLIAVBsAtqIAgoAjAiEiAIKAI0IggQgBwgBUGwC2ogEiAIEMoPDAYLIAhBBGogBUGwC2oQqSUMBQsCQCAILQAUDQAgCCgCECAFQbALahDvIgwFCyAFQbALaiAIKAIIIhIgCCgCDCIIEIAcIAVBsAtqIBIgCBDKDwwECyAIKAIEIggtAEENAkEAKALslZ0BIhJFDQMgBUGQCmogEiAIKAIgIAgoAiRBwPqaAUHIABDcEiAZQer2mgFBERC1FCAFQQA2AsACIAUoApQKIggQ3CAgCCAFKQLIAjcCCCAIIAUpAsACNwIAIAVBkApqEO8CIAVBkApqEJ0ODAMLQQAoAuyVnQEiEkUNAiAFQZAKaiASIAgoAgggCCgCDEGA+poBQcAAENwSIBlB6vaaAUERELUUIAVBADYCwAIgBSgClAoiCBDcICAIIAUpAsgCNwIIIAggBSkCwAI3AgAgBUGQCmoQ7wIgBUGQCmoQnQ4MAgsgBUGwC2ogCCgCECISIAgoAhQiCBCAHCAFQbALaiASIAgQyg8MAQsgBUGwC2ogCCgCICISIAgoAiQiCBCAHCAFQbALaiASIAgQyg8MAAsLAkACQCACKAIADQAgBSgCxAshESAFKALACyEUIAUoArwLIQ4gBSgCtAshECAFKAKwCyEBAkACQAJAIAUoArgLIggNACARRQ0BCyAFQcACaiADQRBqEMkgIAVBhAZqIANBFGooAgAgA0EYaigCABDLEyAQIAhBA3RqIQ8gECEVDAELIAAgA0EUaigCACADQRhqKAIAEMsTIABBgICAgHg2AgwgDiAUEL4jIAEgEBC+IyAbEOwgDAILA0ACQAJAIBUgD0YNACAFQfAAaiAFKALEAiAFKALIAiAVKAIAIhlBf2oiFiAVKAIEQX9qQcT7mgEQuRsgBSgCdCEDIAUoAnAhEyAFQQA2ApgKIAUgEyADaiIINgKUCiAFIBM2ApAKDAELIAEgEBC+IyARQQN0IQggFCEDAkADQCAIRQ0BIAMtAAQhEiAFKAKIBiAFKAKMBiADKAIAQX9qQbT7mgEQqiAgEjoAACAIQXhqIQggA0EIaiEDDAALCyAOIBQQviMgAEGAgICAeDYCDCAAIAUoAowGNgIIIAAgBSkChAY3AgAgBUHAAmoQ7CAgGxDsICAFKALICyAFKALMCxCOJCAFQdgFahCIHwwJCwJAA0AgBUHoAGogBUGQCmoQ4QwgBSgCaEEBRw0BIAUoAmwhAyAFIAUoApgKIgwgCGogEyAFKAKUCiISamsgBSgCkAoiE2o2ApgKIAwgFmohGCASIQggA0GAQGpBC0kNAAJAIANBd2oiF0EXSw0AIBIhCEEBIBd0QZ+AgARxDQELAkAgA0HYv39qIhdBB0sNACASIQhBASAXdEGDAXENAQsgEiEIIANBoAFGDQAgEiEIIANBgC1GDQAgEiEIIANB38AARg0AIBIhCCADQYDgAEYNACASIQggA0H//QNGDQACQAJAAkAgA0GAAUkNACADQYAQSQ0BIBhBAmohFyAMIBlqIRogBSgCjAYhCCAFKAKIBiEMIANBgIAETw0CIAwgCCAYQYT8mgEQqiBB4gE6AAAgDCAIIBpBlPyaARCqIEGAAToAACAFKAKIBiAFKAKMBiAXQaT8mgEQqiBBggE6AAAgEiEIDAMLIAUoAogGIAUoAowGIBhB1PuaARCqIEEgOgAAIBIhCAwCCyAFKAKIBiAFKAKMBiAYQeT7mgEQqiBBwgE6AAAgBSgCiAYgBSgCjAYgDCAZakH0+5oBEKogQaABOgAAIBIhCAwBCyAMIAggGEG0/JoBEKogQSA6AAAgDCAIIBpBxPyaARCqIEHvAToAACAFKAKIBiAFKAKMBiAXQdT8mgEQqiBBuwE6AAAgBSgCiAYgBSgCjAYgGEEDakHk/JoBEKogQb8BOgAAIBIhCAwACwsgFUEIaiEVDAALCyAAQQRqQYT0mgFBEhC1FCAAQYCAgIB4NgIAIABBAToAECAbEOwgIAUoArALIAUoArQLEL4jIAUoArwLIAUoAsALEL4jCyAFKALICyAFKALMCxCOJCAFQdgFahCIHwwHCxDsJSETEOwlIRggBUEAEKYUNgKwCyAFQQA6AKQMIAVBtAtqQQBB7wD8CwBBACgC9JWdASEVQQAgBUGwC2o2AvSVnQEgBSAEKAAVNgLwDSAFIAQvABk7AfQNIAQtABQhFyAFQQA2ApAKIAUgEzYC8AgCQAJAAkACQCATRQ0AQQAgExDBBhpBACAYEMEGGiAFQQA2AfoCIAVBgAI7AfgCIAVBAToA9AIgBSAYNgLwAiAFIBM2AuwCIAVBAToA6AIgBSAYNgLkAiAFQQA2AuACIAVBACkDoKacASIiNwPAAiAFQQApA6imnAEiIzcDyAIgBSAiNwPQAiAFICM3A9gCAkACQCAFKQPYBUIBUg0AIAUoAvQFIQhBACESAkAgBSgC+AUiD0UNACAIKAIAIAhBBGooAgAQhxghEgsgBSASOgD9AiAFQQA6ALYKIAVBADsBtAogBUEAKQOgppwBIiI3A5AKIAVBACkDqKacASIjNwOYCiAFICI3A6AKIAUgIzcDqAogBSAFQcACajYCsAogBUGQCmogDBCACCAFQZAKahDxGCAFQaAKahDxGCAPRQ0BIA9BMGwhEgNAIAggBUHAAmoQwgEgCEEwaiEIIBJBUGoiEg0ADAILCyAFQQE6APsCIAVBAToA/QIgBUHAAmogDBCdBwsCQCAFKALEAiIIRQ0AIAUoAsACIAUoAswCEPMNIAggCEEEdEEXakFwcSISakEJaiIIRQ0AIAUoAsACIBJrIAhBCBDUFAsgBUHQAmoQ8RggBkEBcUUNAiAWQQJJDQECQCAWQRVJDQAgGSAWEIQRDAILIBZBDGwhEkEMIQgDQCASIAhGDQIgGSAZIAhqELcNIAhBDGohCAwACwsgBUHwCGogBUGQCmpB+KGaAUGwopoBEM4cAAsgBSAWNgLMAiAFIBk2AsgCIAUgA0EUaikCADcCwAIgBUHYBWogBUHAAmoQhh8gAigCAEUNACAFQZgHakGE9JoBQRIQtRQgBUEBOgCkByAFKAKYByEDDAELAkACQCAXQf8BcUECRg0AIAUgBS8B9A07AeQIIAUgBSgC8A02AuAIDAELQQAhFyAFQQA7AeQIIAVBADYC4AgLIAUgFzoA2AIgBSAFKALgCDYA2QIgBSAFLwHkCDsA3QIgBSAYNgLUAiAFIBM2AtACIAVBACkDoKacATcDwAIgBUEAKQOoppwBNwPIAiAFQcACaiAFQdgFahBIIAVBwAJqEPwYIAUgEzYCsAYgBUEANgKoBgJAAkACQAJAAkACQAJAAkACQAJAAkAgBSkD2AVCAVINAEEAKAL0lZ0BIgNFDQEgAygCACEIQQghA0EAIRJBACEbQQAhFwJAEMEDRQ0AIAVBACAIEMEGNgKsBiAFQQE2AqgGIAVBADYCyAIgBUKAgICAgAE3AsACQQAoAvSVnQEiA0UNAyAFQcACaiATIAMQSSAFKALIAiEbIAUoAsQCIQMgBSgCwAIhFwsgBSgC9AUhECADIBtBMGwiE2ohFAJAIAUoAvgFIg9FDQAgECAPQTBsaiEWQQAhEiAQIQgDQCAIKAIAQRJHDQEgCEEEaigCACIYKAIAQRtHDQEgGCgCCA0BIBJBAWohEiAIQTBqIgggFkcNAAsgDyESCyAFQdgAaiASIBIgDxCOGyAFIBQ2ArAKIAUgFzYCrAogBSADNgKoCiAFIAM2AqQKIAUgDDYCmAogBSAFKAJYIgg2AvgFIAUgBSgCXCIXNgKcCiAFIA8gF2s2AqAKAkAgCCAXRg0AIBAgF0EwbGohGCAQIAhBMGxqIQggBUHAAmpBBHIhFgNAIAgoAgAiEkETRg0BIBYgCEEEakEs/AoAACAFIBI2AsACIAVBwAJqELgEIAhBMGoiCCAYRw0ACwsgBUGkCmohGCAFQoiAgICAATcCkAoCQCAPIBdHDQAgDCAbEKgfIAUoAvgFIRICQCAbRQ0AIAUoAvQFIBJBMGxqIQgDQCAIIANBMPwKAAAgCEEwaiEIIBJBAWohEiADQTBqIQMgE0FQaiITDQALIAUgAzYCqAoLIAUgEjYC+AUMCgsgDCAXIBgQiwpFDQkCQCAFKAKwCiIDIAUoAqgKIhNHDQAgEyEDDAkLIAVBkApqIAMgE2tBMG4QlxMgBSgCmAogBSgCnAogGBCLCkUNCSAFKAKwCiETIAUoAqgKIQMMCAtBACgC9JWdASIDRQ0CIAMoAgAhA0EIIRBBACEIQQAhF0EAIQoCQBDBA0UNACAFQQAgAxDBBjYCrAYgBUEBNgKoBiAFQQA2AsgCIAVCgICAgIABNwLAAkEAKAL0lZ0BIgNFDQQgBUHAAmogAxA+IAUoAsgCIRcgBSgCxAIhECAFKALAAiEKCyAFKAL0BSEYAkAgBSgC+AUiG0UNACAYIBtBOGxqIRNBACEIIBghAwNAIAMoAgBBCUcNASADQQhqKAIAQRJHDQEgA0EMaigCACISKAIAQRtHDQEgEigCCA0BIAhBAWohCCADQThqIgMgE0cNAAsgGyEICyAXQThsIRIgBUHgAGogCCAIIBsQjhsgBSAFKAJgIgM2AvgFAkAgAyAFKAJkIhZGDQAgGCAWQThsaiETIBggA0E4bGohAyAFQcACakEEciEYA0AgAygCACIIQQpGDQEgGCADQQRqQTT8CgAAIAUgCDYCwAIgBUHAAmoQ/gUgA0E4aiIDIBNHDQALCyAQIBJqIRgCQCAbIBZHDQACQAJAAkAgFyAFKALwBSAFKAL4BSITa00NACAMIBMgF0EIQTgQ0hogBSgC9AUhAyAFKAL4BSETDAELAkAgFw0AIBAhAwwCCyAFKAL0BSEDCyADIBNBOGxqIQggECEDA0AgCCADQTj8CgAAIAhBOGohCCATQQFqIRMgA0E4aiEDIBJBSGoiEg0ACwsgBSATNgL4BQwHCyAbIBZrIQcgECEIAkACQAJAAkACQAJAIAUoAvgFIhcgFk8NACAXQThsIRMgECEDA0AgEkUNAyADKAIAIghBCkYNAiAFQcACaiADQQRqQTT8CgAAIAUoAvQFIBNqIg8gCDYCACAPQQRqIAVBwAJqQTT8CgAAIAUgBSgC+AVBAWo2AvgFIBNBOGohEyASQUhqIRIgA0E4aiIIIQMgFiAXQQFqIhdHDQALCyAYIAhrQThuIRMgGCAIRw0CIBYhFAwDCyADQThqIQMLIBYhFAwICwJAIBMgBSgC8AUgG2tNDQAgDCAbIBNBCEE4ENIaCyATIBZqIRQCQCAHQThsIgNFDQAgBSgC9AUiEiAUQThsaiASIBZBOGxqIAP8CgAACyAFKAL4BSISIBRJDQELIAghEgwFCyASQThsIQMgEyAWaiASayETAkADQAJAIAggGEcNACAIIQMMCAsgCCgCACISQQpGDQEgBUHAAmogCEEEakE0/AoAACAFKAL0BSADaiIXIBI2AgAgF0EEaiAFQcACakE0/AoAACAFIAUoAvgFQQFqNgL4BSADQThqIQMgCEE4aiISIQggE0F/aiITDQALIBggEmtBOG4hEwwFCyAIQThqIQMMBQtB4OSaAUHIAEGo5ZoBEMYkAAtB4OSaAUHIAEGo5ZoBEMYkAAtB4OSaAUHIAEGo5ZoBEMYkAAtB4OSaAUHIAEGo5ZoBEMYkAAsgBUHAAmogE0EIQTgQgw8gBSgCxAIhDQJAAkACQAJAIAUoAsACQQFGDQAgBSgCyAIhFwJAIBIgGEcNACASIQMMBAtBACEIQQAhEwNAIBcgCGogEiAIakE4/AoAACATIg9BAWohEyASIAhBOGoiCGoiAyAYRw0ACwJAIA8gBSgC8AUgFCAHaiISa0kNACAMIBIgE0EIQTgQ0hoLIBQgE2ohBgJAIAdBOGwiEkUNACAFKAL0BSIPIAZBOGxqIA8gFEE4bGogEvwKAAALIBchEiAFKAL4BSIPIAZPDQEgD0E4bCEOIBdBOGohESAUIA9rIBNqIQsgCCEUIBchDwNAIBRFDQMCQCAPKAIAIhJBCkYNACAFQcACaiAPQQRqQTT8CgAAIAUoAvQFIA5qIgIgEjYCACACQQRqIAVBwAJqQTT8CgAAIAUgBSgC+AVBAWo2AvgFIA5BOGohDiAUQUhqIRQgESESIBFBOGohESAPQThqIQ8gC0F/aiILRQ0DDAELCyARIRIMAQsgDSAFKALIAhD8IAALIBcgE0E4bGogEkYNACAXIBJrIAhqQThuIQgDQCASEP4FIBJBOGohEiAIQX9qIggNAAsLIAYhFAsgDSAXEPUjCyAbIBZGDQACQCAUIAUoAvgFIghGDQAgB0E4bCISRQ0AIAUoAvQFIhMgCEE4bGogEyAUQThsaiAS/AoAAAsgBSAIIAdqNgL4BQsgGCADa0E4biEIAkAgGCADRg0AA0AgAxD+BSADQThqIQMgCEF/aiIIDQALCyAKIBAQ9SMMAgsgBUHAAmogEyADa0EwbiISQQhBMBCDDyAFKALEAiEIAkACQCAFKALAAkEBRg0AIAVBADYC+AggBSAFKALIAjYC9AggBSAINgLwCCAFQfAIaiASEKgfIAUoAvgIIRIgBSgC9AghFgJAIAMgE0YNACAWIBJBMGxqIQgDQCAIIANBMPwKAAAgCEEwaiEIIBJBAWohEiADQTBqIgMgE0cNAAsgBSADNgKoCgsgBSAFKALwCDYCyAIgBSAWNgLAAiAFIBY2AsQCIAUgFiASQTBsajYCzAIgEkUNASAFQZAKaiASEJcTIAUoApgKIAUoApwKIAVBwAJqEIsKGgwBCyAIIAUoAsgCEPwgAAsgBUHAAmoQgBoLIAUoApQKIRIgBSgCkAohAyAFQoiAgICAATcCkAogEiADa0EwbiEIIAUoApgKIRMCQAJAAkAgEiADRw0AIAUoAqAKIgNFDQIgBSgCnAoiEiATKAIIIghGDQEgA0EwbCIWRQ0BIBMoAgQiFyAIQTBsaiAXIBJBMGxqIBb8CgAADAELA0AgAxCCAiADQTBqIQMgCEF/aiIIDQALIAUoAqAKIgNFDQECQCAFKAKcCiISIBMoAggiCEYNACADQTBsIhZFDQAgEygCBCIXIAhBMGxqIBcgEkEwbGogFvwKAAALIBMgCCADajYCCAwBCyATIAggA2o2AggLIBgQgBogG0UNACAFKAL4BSIDRQ0AIANBMGwhCCAFKAL0BSEDA0AgAyAFQagGahDXAyADQTBqIQMgCEFQaiIIDQALC0EAIQNBABCmFCEIIAVBADYCwAIgBUEAOwGEAyAFIAg2AoADIAVBACkDoKacASIiNwLQAiAFQQApA6imnAEiIzcC2AIgBSAiNwLgAiAFICM3AugCIAUgIjcC8AIgBSAjNwL4AgJAAkACQAJAAkACQCAFKQPYBUIBUg0AIAUoAvQFIRIgBSgC+AUhEyAFQYACOwCQCiATQTBsIQhBACEDAkADQCAIIANGDQECQCAFLQCQCg0AIBIgA2ogBUGQCmoQrAMLIANBMGohAwwACwsgBUHwCGogBUHAAmogEiATIAUtAJAKIgMQsAIgAw0BDAQLIAUoAvQFIRIgBSgC+AUhGCAFQYACOwCQCiAYQThsIRMCQANAIBMgA0YNAQJAAkAgEiADaiIIKAIAQQlHDQAgBS0AkAoNASAIQQhqIAVBkApqEKwDDAELIAggBUGQCmoQ3gQLIANBOGohAwwACwsgBUHwCGogBUHAAmogEiAYIAUtAJAKIgMQqgIgAw0BDAILIAwgBUHAAmoQ5RwMAgsgBUHAAmogDBDvDAsCQCAFKAL8CEUNACAFIAUpAoADNwKcCiAFQQA2ApgKIAVCgICAgIABNwKQCiAFIAVB8AhqNgKkCiAFQZAKaiAMEGQgBUGQCmoQrCELIAVB8AhqEIsNDAELAkAgBSgC/AhFDQAgBSAFKQKAAzcCnAogBUEANgKYCiAFQoCAgICAATcCkAogBSAFQfAIajYCpAogBUGQCmogDBCZBiAFQZAKahCsIQsgBUHwCGoQiw0LIAVBwAJqQTBqIRMgBUHgAmohDCAFQdACaiEYIAVBiANqIRIgBSgC+AUhCCAFKAL0BSEDAkACQCAFKQPYBUIBUg0AIAhBMGwhCANAIAhFDQIgAyASEMADIAhBUGohCCADQTBqIQMMAAsLIAhBOGwhCANAIAhFDQECQAJAIAMoAgBBCUcNACADQQhqIBIQwAMMAQsgAyASEIsECyADQThqIQMgCEFIaiEIDAALCyAYEPwYIAwQ8RggExCLDQJAIAUoAsACRQ0AIAVBwAJqEIsNCyAFQoCAgIDAADcCwAIgBUEAKQOgppwBNwLMAiAFQQApA6imnAE3AtQCIAVBADoA6AIgBUEAOwHmAiAFQQA6AOQCIAVBwPOaATYC4AIgBSkD2AUhIiAFIAVBkAFqNgLcAiAFKAL4BSEIIAUoAvQFIQMCQAJAAkACQCAiQgFSDQAgBUEANgLIAgJAAkAgCA0AIAVBkAFqIQgMAQsgCEEwbCEIIAUtAOUCIRIDQCAFQQM6AOQCIAMgBUHAAmoQfiAFIBI6AOUCIAVBADoA5AIgA0EwaiEDIAhBUGoiCA0ACyAFKALcAiIIRQ0ECyAFKALgAiEYIAVBwAJqIAUoAsgCIgMQ5QMgBUHIAGpBACADIAUoAsgCIg8QjhsgBSAFKAJIIgM2AsgCAkAgAyAFKAJMIhdGDQAgA0EUbCAXQRRsIgNrIRIgAyAFKALEAmpBbGohAyAYKAIYIRYDQCADQQxqKAIAIRMgA0EEaigCACEMIAggA0EIaigCACADKAIAIBYRCwAgCCATIAwgGCgCMBELACADQWxqIQMgEkEUaiISDQALCyAPIBdGDQMgDyAXayEDIBcgBSgCyAIiCEYNASADQRRsIhJFDQEgBSgCxAIiEyAIQRRsaiATIBdBFGxqIBL8CgAADAELIAVBADYCyAICQAJAIAgNACAFQZABaiEIDAELIAhBOGwhCANAAkACQCADKAIAQQlHDQAgBS8B5AIhEiAFQQM6AOQCIANBCGogBUHAAmoQfiAFIBI7AeQCDAELIAMgBUHAAmoQ9AILIANBOGohAyAIQUhqIggNAAsgBSgC3AIiCEUNAwsgBSgC4AIhGCAFQcACaiAFKALIAiIDEOUDIAVB0ABqQQAgAyAFKALIAiIPEI4bIAUgBSgCUCIDNgLIAgJAIAMgBSgCVCIXRg0AIANBFGwgF0EUbCIDayESIAMgBSgCxAJqQWxqIQMgGCgCGCEWA0AgA0EMaigCACETIANBBGooAgAhDCAIIANBCGooAgAgAygCACAWEQsAIAggEyAMIBgoAjARCwAgA0FsaiEDIBJBFGoiEg0ACwsgDyAXRg0CIA8gF2shAwJAIBcgBSgCyAIiCEYNACADQRRsIhJFDQAgBSgCxAIiEyAIQRRsaiATIBdBFGxqIBL8CgAACyAIIANqIQMMAQsgCCADaiEDCyAFIAM2AsgCCyAFKALMAiAFKALQAhCXHiAFKALAAiAFKALEAkEEQRQQzxNBgICAgHghAwtB9KGaASAVEIggQYCAgIB4IQgCQCADQYCAgIB4Rg0AIAAgBSgCpAc2AhAgACAFKQKcBzcCCCAAQYCAgIB4NgIAIAAgAzYCBAwGCyAFQcAAaiAJQQFBARCOGEEAIQMgBUEANgKYBiAFIAUpA0A3ApAGAkAgBC0AEiISQQFHDQAgBUIENwKgBiAFQZABaiEDQQAhCAsgBSAINgKcBiABIAEoAgAiCEEBajYCACAIQX9MDQAgASABKAIAIghBAWo2AgAgCEF/TA0AIAVB6AVqIRggBUEANgLgBiAFIAE2ArALIAVBAToA9AYgBUEENgLABiAFQdz+mgE2ArwGIAVCADcC5AYgBUEBNgLIBiAFQfLxmgE2AsQGIAVBADYC8AYgBUEANgKoBiAFQoCAgIDAADcCsAYgBUEANgK4BiAFIAVBnAZqQQAgEhs2AuwGIAVBACkDoKacATcCzAYgBUEAKQOoppwBNwLUBiAFIAVBkAZqNgLcBiAFQbALahCJHyAFQQA2AoQHIAVBADoAiAcgBUGBGDsAiQcgBUHA85oBNgKAByAFIAM2AvwGIAUgATYC+AYCQAJAAkACQAJAIAUpA9gFQgFSDQAgBSgC+AUiFkEwbCEIIAUoAuAFIQwgBSgC9AUiEyEDAkADQCAIIhJFDQEgEkFQaiEIIAVBKGogAxDWDiADQTBqIQMgBSgCKCAMRw0ACwsgBSAFKALkBSIINgK4CyAFIAw2ArQLIAVBATYCsAsCQCAFKALwBkUNACAFQcACaiAFQagGakEAIAVBAEEAIAVBsAtqEPoJIAUtAMACQQRGDQAgBSkDwAIiIkL/AYNCBFINAwsCQCASDQAgBUGwC2ogBUGoBmogDEEAELUCIAUtALALQQRGDQAgBSkDsAsiIkL/AYNCBFINAwsgFg0BIAxFDQEgBUGwC2ogBUGoBmogDBDtHSAFLQCwC0EERg0BIAUpA7ALIiJC/wGDQgRRDQEMAgsgBSgC+AUiFkE4bCEIIAUoAuAFIQwgBSgC9AUiEyEDAkADQCAIIhJFDQEgEkFIaiEIIAVBOGogAxC+DyADQThqIQMgBSgCOCAMRw0ACwsgBSAFKALkBSIINgK4CyAFIAw2ArQLIAVBATYCsAsCQAJAIAUoAvAGRQ0AIAVBwAJqIAVBqAZqQQAgBUEBQQAgBUGwC2oQ+gkgBS0AwAJBBEYNACAFKQPAAiIiQv8Bg0IEUg0BCwJAIBINACAFQbALaiAFQagGaiAMQQAQtQIgBS0AsAtBBEYNACAFKQOwCyIiQv8Bg0IEUg0BCwJAIBYNACAMRQ0AIAVBsAtqIAVBqAZqIAwQ7R0gBS0AsAtBBEYNACAFKQOwCyIiQv8Bg0IEUg0BCwJAIAUpA+gFUA0AIAVBADYCsAsgBUHAAmogBUGoBmogBUGwC2pB8O6aAUECEOsNAkAgBS0AwAJBBEYNACAFKQPAAiIiQv8Bg0IEUg0CCyAFQTBqIBgQjRQgBUGwC2ogBUGoBmpBAEEAIAUoAjAgBSgCNBD/DgJAIAUtALALQQRGDQAgBSkDsAsiIkL/AYNCBFINAgsgBUGwC2ogBUGoBmoQsxQgBS0AsAtBBEYNACAFKQOwCyIiQv8Bg0IEUg0BCyAWQThsIQMCQANAIANFDQEgBUGwC2ogEyAFQagGahBTAkAgBS0AsAtBBEYNACAFKQOwCyIiQv8Bg0IEUg0DCyATQThqIRMgA0FIaiEDDAALCyAFQbALaiAFQagGaiAIQQEQrwQCQCAFLQCwC0EERg0AIAUpA7ALIiJC/wGDQgRSDQELIAUoAvAGRQ0EIAVBsAtqIAVBqAZqEJoTIAUtALALQQRGDQQgBSkDsAsiIkL/AYNCBFENBAsgIkL/AYNCBFENAwwCCwJAIAUpA+gFUA0AIAVBADYCsAsgBUHAAmogBUGoBmogBUGwC2pB8O6aAUECEOsNAkAgBS0AwAJBBEYNACAFKQPAAiIiQv8Bg0IEUg0CCyAFQSBqIBgQjRQgBUGwC2ogBUGoBmpBAEEAIAUoAiAgBSgCJBD/DgJAIAUtALALQQRGDQAgBSkDsAsiIkL/AYNCBFINAgsgBUGwC2ogBUGoBmoQsxQgBS0AsAtBBEYNACAFKQOwCyIiQv8Bg0IEUg0BCyAWQTBsIQMCQANAIANFDQEgBUGwC2ogEyAFQagGahBPAkAgBS0AsAtBBEYNACAFKQOwCyIiQv8Bg0IEUg0DCyATQTBqIRMgA0FQaiEDDAALCyAFQbALaiAFQagGaiAIQQEQrwQCQCAFLQCwC0EERg0AIAUpA7ALIiJC/wGDQgRSDQELIAUoAvAGRQ0CIAVBsAtqIAVBqAZqEJoTIAUtALALQQRGDQIgBSkDsAsiIkL/AYNCBFENAgsgIkL/AYNCBFENAQsgIkL/AYNCBFINAwsCQCAFKAKcBiIGQYCAgIB4Rw0AQYCAgIB4IQgMBAsgAUEIaiEXIAUoAqAGIRwgBSkCoAYhIiAFQQA2ApwDIAVBACkDoKacASIjNwL8AiAFQQApA6imnAEiJDcChAMgBUIENwLQAiAFQgA3AsgCIAVCgICAgMAANwLAAiAFICM3AowDIAUgJDcClAMgBUEANgKsAyAFQQA6AMgDIAVBADYCxAMgBUEANgK8AyAFQQA2AvgCIAVCgICAgMAANwLwAiAFQgQ3AugCIAVCADcC4AIgBUKAgICAwAA3AtgCIAVBADYCrAsgBUEANgLQDSAFQgA3AsgNIAVBADYC7A0gBUIANwLkDSAipyIIICJCIIinQQxsaiETIAVBkApqQQxqIRUgBUGwC2pBDGohDyAFQbwDaiEbIAVB8AJqIRAgBUHkAmohASAFQdgCaiEUIAVBjANqIREgBUGcA2ohDkEAIRgDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAIIgMgE0YNACADQQxqIQggAygCACISQYGABGpBgIAESQ0YIANBBGooAgAiDCASciADQQhqKAIAIgNyRQ0YIBJBf0YNDSAFKAKsCyIWRQ0BIBYoAnQgEksNASASIBYoAnhPDQFBACEKIAVBrAtqIQQMFQsgBUGwC2ogBUHAAmpBrAH8CgAAIAUoAtQLQYCAgIB4IAUoAtwLIhYbIQMgBSgC2AshFQJAIAUoAsQLIghBAkkNACAFKALACyESAkAgCEEVSQ0AIBIgCBDdCAwBCyAIQRxsIRNBHCEIA0AgEiASIAhqEO4KIBMgCEEcaiIIRw0ACwtBACEPIAVB8AhqQQAgFiADQYCAgIB4RiIIGyISQQRBJBCDDyAFKAL0CCETIAUoAvAIQQFGDQ4gBUHIC2ohDCAFQbwLaiEYIAVBjAxqIRdBBCAVIAgbIRtBACADIAgbIRAgBUGQCmpBJGohFSAFQQA2AugIIAUgBSgC+AgiAzYC5AggBSATNgLgCAJAIBJFDQAgEkEEdCISQXBqQQR2QQFqIQ8gGyEIA0ACQCAIKAIAIhNFDQAgBSAIQQxqKAIANgL4CCAFIAhBBGopAgA3A/AICyAIQRBqIQggAyATNgIAIANBBGogBSkD8Ag3AgAgA0EMaiAFKAL4CDYCACADQSBqQQA2AgAgA0EYakKAgICAwAA3AgAgA0EUakEAOgAAIANBEGpBADYCACADQSRqIQMgEkFwaiISDQALCyAQIBtBBEEQENsTIBUgDzYCCCAVIAUpAuAINwIAIAVBADYC3AogBUEANgLsCiAFIAUpArALNwKcCiAFIAUoArgLNgKkCiAFIBcpAgA3AswKIAUgFykCCDcC1AogBSAYKQIANwOQCiAFIBgoAgg2ApgKIAUgDCgCCDYCsAogBSAMKQIANwOoCiAFQQA6AIgLIAVBADYChAsgBUEANgL8CiAFQYCAgIB4NgLACgJAAkACQCAFKAKcDCIDRQ0AIAUgAzYC7AogBSAFKQKgDDcD8AogBSAFKAKoDDYC+AogBSgC9ApFDQEgBSgCrAohAyAFQfAIaiAFKAKwCiIXQQRBEBCDDyAFKAL0CCETIAUoAvAIQQFGDRBBACESIAVBADYC+A0gBSAFKAL4CCIINgL0DSAFIBM2AvANAkAgF0UNACAXIQwDQCAFKALwCiESIAUoAvQKIRMgBSADNgK0CCAFQS82AvAIIBIgEyAFQfAIakEBENoeIRggBSASNgK4DSAFIBMgGGs2ArwNAkACQAJAIANBCGooAgAiEkUNACADQQRqKAIAIhMgEkEvEJ4YDQEgEyASQYjemgFBBRDWHw0BIBMgEkGN3poBQQYQ1h8NAQsgBUEMNgL8CCAFQQE2AvQIIAUgBUG0CGo2AvgIIAUgBUG4DWo2AvAIIAVB4AhqQeuAgAEgBUHwCGoQzQggBUHwCGogBUHgCGoQpxEMAQsgBUHwCGogA0EMaiATIBIgAygCACgCABEOAAsgCCAFKQL4CDcCCCAIIAUpAvAINwIAIAhBEGohCCADQRBqIQMgDEF/aiIMDQALIBchEgsgBUHACmohAyAFIAUpAvANNwPwCCAFIBI2AvgIAkAgBSgCwApBgICAgHhGDQAgAxDgFQsgAyAFKAL4CDYCCCADIAUpA/AINwIADAILIAVBADYC7AogBSAFKQPwCDcD8AogBSAFKAL4CDYC+AoLIAVBgICAgHg2AsAKCyAFQfwKaiEIIAVBiAtqIAVBuAxqQSH8CgAAIAUoArAMIRIgBSAFKAK0DEEAIAUoAqwMIgMbNgKQCSAFIBI2AowJIAUgAzYCiAkgBUEANgKECSAFIANBAEciEzYCgAkgBSASNgL8CCAFIAM2AvgIIAVBADYC9AggBSATNgLwCAJAA0AgBUHgCGogBUHwCGoQnwcgBSgC4AgiA0UNASAIIAMgBSgC6AhBAnRqKAIEEO4DDAALCwNAIAVB4AhqIAVB8AhqEJ8HIAUoAuAIDQALIAVB8AhqIAVBkApqQZwB/AoAACAFQewLahCVDCAFQfwLahCVDAJAIBYNACAFKALUCyAFKALYC0EEQRAQ2xMLIAUoAuALIAUoAuQLQQQQ3BMgBUGYB2ogBUHwCGpBnAH8CgAAIAVBrAtqEO0iIAVBADYCvAggBUKAgICAEDcCtAggBSAFQbQIajYCrAsgBUEAOgC3DSAFQQA2AuQIIAUgBUG3DWo2AugIIAUgBUGYB2o2AuAIIAVBCGogBUHgCGoQkxQgBSgCCEEBcUUNAyAFKAIMIgMNAUGAgICAeCEDDAILIAVBGGogFyASEKgNIAUoAhwhFiAFKAIYQQFGDQogFkUNFiAFIBY2AvANIBYoAmgiCigCCEEJRg0UIAVBADYCuAsgBUKAgICAEDcCsAsgCkEIaiAFQbALakGwy5gBENoJDQkgBSAFKAK4CzYC+AggBSAFKQKwCzcD8AggBUGQCmogBUHwCGoQpxEgBSgC4AIhByAFQbALaiAVIAUoApQKIAUoApgKIAUoApAKKAIAEQ4AQQAhCSAFQQA2AvAIIAUoArQLIgIgBSgCuAsiCiAFQfAIahDnCCAFKAKQAyINIAUoAvAIQQ93IhhxIQQgGK0iJUIZiCImQoGChIiQoMCAAX4hIyAFKAKMAyELAkACQAJAA0ACQCALIARqKQAAIiQgI4UiIkJ/hSAiQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIiJQDQADQAJAIAtBACAieqdBA3YgBGogDXFrQRRsaiIYQXRqKAIAIApHDQAgGEFwaigCACACIAoQshhFDQQLICJCf3wgIoMiIlBFDQALCyAkICRCAYaDQoCBgoSIkKDAgH+DUEUNAiAEIAlBCGoiCWogDXEhBAwACwsgDyACIAogBSgCsAsoAhARCwAMAQsCQCAFKAKUAw0AIBEgDhDDAhoLAkAgBSgCsAsiDQ0AIAIhGAwBCwJAIAUoAowDIhggBSgCkAMiCyAlp3EiBGopAABCgIGChIiQoMCAf4MiIkIAUg0AQQghCQNAIAQgCWohBCAJQQhqIQkgGCAEIAtxIgRqKQAAQoCBgoSIkKDAgH+DIiJQDQALCwJAIBggInqnQQN2IARqIAtxIgRqLAAAIglBAEgNACAYIBgpAwBCgIGChIiQoMCAf4N6p0EDdiIEai0AACEJCyAFKAK8CyEdIBggBGogJqciHjoAACAYIARBeGogC3FqQQhqIB46AAAgGEEAIARrQRRsaiIYQXxqIAc2AgAgGEF4aiAdNgIAIBhBdGogCjYCACAYQXBqIAI2AgAgGEFsaiANNgIAIAUgBSgCmANBAWo2ApgDIAUgBSgClAMgCUEBcWs2ApQDCwJAAkAgGEF8aigCACIYIAdGDQAgFSAFKAKUCiAFKAKYCiAFKAKQCigCEBELAAwBCyAFIAUpApgKNwO4CyAFIAUpApAKNwOwCwJAIAUoAuACIgogBSgC2AJHDQAgFBDIGgsgBSgC3AIgCkEEdGoiBCAFKQO4CzcCCCAEIAUpA7ALNwIAIAUgCkEBajYC4AICQCAFKAL4AiIKIAUoAvACRw0AIBAQlBoLIAUoAvQCIApBAnRqQX82AgAgBSAKQQFqNgL4AgsCQCAWKAJoKAIIIgpBAkkNACAKQXtqQXtxDQAgGyAYEO4DIBYoAmgoAgghCgsCQAJAIApBfmpBBiAKQQFLGyIKQXpqDgMUARQACyAKRQ0TCyAFQeAIaiAWQRBqEMkgIBhBf0YNCAJAIAUoAuACIgsgBSgC7AIiBE0NACAFQQA2AvAIIAUgBSkC+Ag3A5gKIAUgBSkC8Ag3A5AKIAQhAgJAIAsgBGsiByAFKALkAiAEa00NACABIAQgB0EEQRAQ0hogBSgC7AIhAgsgBSgC6AIgAkEEdGohCgJAIAdBAkkNACAEQX9zIAtqIQQDQAJAAkAgBSgCkAoiC0UNACAFQbALaiAVIAUoApQKIAUoApgKIAsoAgARDgAMAQsgBUEANgKwCwsgCiAFKQK4CzcCCCAKIAUpArALNwIAIApBEGohCiAEQX9qIgQNAAsgAiAHakF/aiECCyAKIAUpA5gKNwIIIAogBSkDkAo3AgAgBSACQQFqIgQ2AuwCCyAYIARPDQcCQCAFKALoAiAYQQR0aiIKKAIAIgRFDQAgCkEMaiAKKAIEIAooAgggBCgCEBELAAsgCiAFKQLoCDcCCCAKIAUpAuAINwIADBILIAUoAugIQQE6AAAgBUEANgLIAiAFQoCAgIAQNwLAAiAFQdzimgE2ArQLIAVCoICAgAY3ArgLIANBBGooAgAhCCADQQhqKAIAIQMgBSAFQcACajYCsAsgCCADIAVBsAtqEKokDQUgBSgCwAIiA0GBgICAeEYNASAFKQLEAiEiCyAFQbALakEEQQRBDBCDDyAFKAK0CyEIIAUoArALQQFGDQMgBSgCuAsiDCAiNwIEIAwgAzYCACAFQQE2AvgIIAUgDDYC9AggBSAINgLwCCAFIAUoAugINgKYCiAFIAUpAuAINwOQCkEQIQhBASEDAkADQCAFIAVBkApqEJMUIAUoAgBBAUcNAQJAAkAgBSgCBCISDQBBgICAgHghEgwBCyAFKAKYCkEBOgAAIAVBADYCyAIgBUKAgICAEDcCwAIgBUHc4poBNgK0CyAFQqCAgIAGNwK4CyASQQRqKAIAIRMgEkEIaigCACESIAUgBUHAAmo2ArALIBMgEiAFQbALahCqJA0FIAUoAsACIhJBgYCAgHhGDQIgBSkCxAIhIgsCQCADIAUoAvAIRw0AIAVB8AhqIANBAUEEQQwQ0hogBSgC9AghDAsgDCAIaiITICI3AgAgE0F8aiASNgIAIAUgA0EBaiIDNgL4CCAIQQxqIQgMAAsLIAUgBSkC8Ag3A7gNIAUgBSgC+Ag2AsANDAELIAVBADYCwA0gBUKAgICAwAA3ArgNCwJAAkACQCAFKALUBw0AQQYhHgwBCyAFQQA2AsgCIAVCgICAgBA3AsACIAVB3OKaATYCtAsgBUKggICABjcCuAsgBSAFQcACajYCsAsgBSgC2AcgBSgC3AcgBUGwC2oQqiQNASAFIAUoAsgCNgDrCCAFIAUpAsACNwDjCEEDIR4LIAUoArQHIRMgBUGwC2ogBSgCuAciDEEEQQwQgw8gBSgCtAshEgJAIAUoArALQQFGDQBBACEIIAVBADYC+AggBSAFKAK4CyIDNgL0CCAFIBI2AvAIAkACQCAMRQ0AIBNBCGohCCAMIRIDQCAFQQA2AsgCIAVCgICAgBA3AsACIAVB3OKaATYCtAsgBUKggICABjcCuAsgCEF8aigCACETIAUgBUHAAmo2ArALIBMgCCgCACAFQbALahCqJA0CIAUgBSgCyAIiEzYCmAogBSAFKQLAAiIiNwOQCiADIBM2AgggAyAiNwIAIANBDGohAyAIQRBqIQggEkF/aiISDQALIAwhCAsgBSAFKQLwCDcDyA0gBSAINgLQDQJAAkACQCAFKAL0Bw0AQYCAgIB4IR8MAQsgBUEANgLIAiAFQoCAgIAQNwLAAiAFQdzimgE2ArQLIAVCoICAgAY3ArgLIAUgBUHAAmo2ArALIAUoAvgHIAUoAvwHIAVBsAtqEKokDQEgBSkCxAIhIiAFKALAAiEfCyAFLQC3DSENIAUoArgNISAgBSkCvA0hIwJAAkACQAJAAkAgBSgCrAcNAEEIIRRBACEJQQAhGwwBCyAFKAKoByEDIAVBADYCyAIgBUKAgICAEDcCwAIgBUHc4poBNgK0CyAFQqCAgIAGNwK4CyADQQRqKAIAIQggA0EIaigCACEDIAUgBUHAAmo2ArALIAggAyAFQbALahCqJA0DIAUgBSgCyAI2APsIIAUgBSkCwAI3APMIIAVBsAtqQQRBCEEYEIMPQQEhGyAFKAK0CyEJIAUoArALQQFGDQIgBSgCuAsiFCAFKQD3CDcACCAUIAUpAPAINwABIBRBAzoAACAFQQE2AuwNIAUgFDYC6A0gBSAJNgLkDSAFKAKsB0ECSQ0AIAVBwAJqQQNqIRNBGSEIQRghA0EBIRsDQCAFKAKoByESIAVBADYC+A0gBUKAgICAEDcC8A0gBUHc4poBNgK0CyAFQqCAgIAGNwK4CyASIANqIhJBfGooAgAhDCASKAIAIRIgBSAFQfANajYCsAsgDCASIAVBsAtqEKokDQIgEyAFKAL4DTYACCATIAUpAvANNwAAIAUgBSkAwAI3A5AKIAUgBSkAxwI3AJcKAkAgGyAFKALkDUcNACAFQeQNaiAbQQFBCEEYENwaIAUoAugNIRQLIBQgCGoiEkF/akEDOgAAIBIgBSkAlwo3AAcgEiAFKQOQCjcAACAFIBtBAWoiGzYC7A0gA0EQaiEDIAhBGGohCCAbIAUoAqwHSQ0ACyAFKALoDSEUIAUoAuQNIQkLAkACQAJAIAUoAuQHDQBBgICAgHghIQwBCyAFQQA2AsgCIAVCgICAgBA3AsACIAVB3OKaATYCtAsgBUKggICABjcCuAsgBSAFQcACajYCsAsgBSgC6AcgBSgC7AcgBUGwC2oQqiQNASAFKQLEAiEkIAUoAsACISELQQAhAyAFQQA2ApgKIAVCgICAgBA3ApAKIAVBADYCyAIgBUKAgICAEDcCwAICQAJAAkAgBSgCoAcNAEEBIQwMAQsgBUH0DWohD0EBIQxBASEWQQAhEkEAIQhBACEDQQEhFUEAIRdBACEYA0ACQAJAAkACQAJAIAUoApwHIBhBHGxqIhMtABhFDQACQAJAIAUoAsACIBJrQQFNDQAgEiEDDAELIAVBwAJqIBJBAkEBQQEQhRsgBSgCxAIhFiAFKALIAiEDCyAWIANqQQA7AAAgBSADQQJqIhI2AsgCIANB////H08NAiAFKALEAiEMIAUgGCAXayIWNgLkDSAFQQA2AvANIAUgEkEDdEH4////AXEiAzYC9A0gFiADTw0BQQEhAyAMIBZBA3ZqIhUgFS0AAEEBIBZBB3F0cjoAAEEAIRUgDCEWCyATKAIAIAhGDQMDQAJAIANBAXFFDQAgBUGQCmogDCASEMYEQQAhEgsCQCAFKAKYCiIDIAUoApAKRw0AIAVBkApqENMTCyAFKAKUCiADakE7OgAAIAUgA0EBajYCmApBACEDIAhBAWoiCCATKAIARg0DDAALCyAFIA82AvQIIAVBATYC8AggBUENNgK8CyAFQQc2ArQLIAUgBUHwCGo2ArgLIAUgBUHkDWo2ArALQe2TgAEgBUGwC2pB5NWaARDkGwALIAVBAjYCsAsgBUF/IBJBA3QgA0H9////AUsbNgK0C0HU/ZoBQSsgBUGwC2pB/NyaAUHc3JoBENUUAAsgBSASNgLIAkEAIQMgDCEWIBghFwsgGEEBaiIYIAUoAqAHSQ0ACyAVQQFxRQ0BIAUoAsACIQMLIAMgDBCxIyAFKAKQCiAFKAKUChCxI0KAgICACCElDBQLIANBAXFFDRIgBUGQCmogDCASEMYEDBILQYGVmwFBNyAFQf8NakH04poBQbiVmwEQ1RQAC0GBlZsBQTcgBUH/DWpB9OKaAUG4lZsBENUUAAsgCSAFKAK4CxD8IAALQYGVmwFBNyAFQf8NakH04poBQbiVmwEQ1RQAC0GBlZsBQTcgBUH/DWpB9OKaAUG4lZsBENUUAAtBgZWbAUE3IAVB/w1qQfTimgFBuJWbARDVFAALIBIgBSgCuAsQ/CAAC0GBlZsBQTcgBUH/DWpB9OKaAUG4lZsBENUUAAtBgZWbAUE3IAVB/w1qQfTimgFBuJWbARDVFAALIAggBSgCuAsQ/CAAC0GBlZsBQTcgBUH/DWpB9OKaAUG4lZsBENUUAAsgGCAEQcjdmgEQ9RYAC0GM3ZoBQSpBuN2aARDGJAALQYGVmwFBNyAFQf8NakHIy5gBQbiVmwEQ1RQACyAFIBY2ArALQdT9mgFBKyAFQbALakHE/ZoBQazmmgEQ1RQACyAFQbALaiAFQcACaiAMIANBAEEAIBgQ5BEMCgsgEyAFKAL4CBD8IAALIBMgBSgC+AgQ/CAACyAFKAKQCiEDIAVBsAtqIAUpApQKIiWnIgggJUIgiCImpyIdENQFAkACQCAFKAKwCw0AICVC/////w+DISYMAQsgBSkCtAshJyADQYCAgIB4Rw0CICenIR0gCCEDCyAFKALAAiAMELEjICZCIIYgA62EISULQQAhEyAFQQA2AuANIAVCgICAgBA3AtgNAkAgBSgCoAciF0UNAEEAIQxBACERQQAhDkEAIQFBACEKQQAhB0EAIRgDQCAFKAKcByISIBNBZGxqIBhBHGwiD2ohBCAXIBNBf2oiAyAXIANLG0ECaiECIBNBAWohFiATQRxsIRAgGCATa0EBaiELAkADQCAYQQFqIRUCQAJAAkAgEiAPaiIDKAIAIAxGDQAgBSgC4A0hCANAIAVB2A1qQQEQix8gBSgC3A0gBSgC4A1qQTs6AAAgBSAIQQFqIgg2AuANIAxBAWoiDCADKAIARw0AC0EAIREgFSEYIBYhEwwBCwJAIBZBAUcNACAEIQMgCyEYQQEhEwwBCwJAAkACQAJAIBNBf2ogF0kNACACIRMMAQsgDCASIBBqIgNBZGooAgBHDQEgE0EBaiETIBIgD2oiCEEEaigCACADQWhqKAIARw0AIAhBCGooAgAgA0FsaigCAEcNACAIQQxqKAIAIANBcGooAgBHDQAgCEEQaigCACADQXRqKAIARw0AIAhBFGooAgAgA0F4aigCAEcNACAIQRhqLQAAIANBfGotAABGDQQLIBhBAWohGCASIA9qIQMMAQsgGEEBaiEYIBIgD2ohAyAWIRMLIAUoAuANIQggBUHYDWpBARCLHyAFKALcDSAFKALgDWpBLDoAACAFIAhBAWo2AuANCyAFQdgNaiADNQIEIBGtfRC5EiADKAIEIREgAygCECIIQX9GDQIgBUHYDWogCK0gDq19ELkSIAMoAhAhDiAFQdgNaiADNQIIIAGtfRC5EiADKAIIIQEgBUHYDWogAzUCDCAKrX0QuRIgAygCDCEKIAMoAhQiCEF/Rg0CIAggBSgCrAdPDQIgBUHYDWogCK0gB619ELkSIAMoAhQhBwwCCyAWQQFqIRYgEkEcaiESIBUhGCAVIBdJDQAMAwsLIBggBSgCoAciF0kNAAsLAkACQAJAAkACQCAFKAKMCCIDDQBBgICAgHghFQwBC0EAIQggBSgCiAghEyAFQbALaiADQQAgBSgChAgiEhsiD0EEQQQQgw8gBSgCtAshFSAFKAKwC0EBRg0BIBJBAEchAyAFQQA2AsgCIAUgBSgCuAsiFzYCxAIgBSAVNgLAAiAPIRhBACEWAkADQCAYRQ0BIANBAXFFDQUCQAJAIAhFDQAgEiEDDAELQQAhAwJAIBNFDQADQCASKAI0IRIgE0F/aiITDQALCyASIQhBACETCwJAAkAgEyAILwEyTw0AIAghEiATIQwMAQsDQCAIKAIAIhJFDQYgA0EBaiEDIAgvATAhDCASIQggDCASLwEyTw0ACwsCQAJAIAMNACAMQQFqIRMgEiEIDAELIBIgDEECdGpBOGohEwNAIBMoAgAiCEE0aiETIANBf2oiAw0AC0EAIRMLIBhBf2ohGCAXIBZBAnRqIBIgDEECdGooAgQ2AgBBASEDIBZBAWohFkEAIRIMAAsLIAUgDzYCyAIgBSkCxAIhJgsgBUHgDGogBUGQCGpBIfwKAAAgBSAeOgC4CyAFQoGAgIAwNwOwCyAFIB02AqAMIAUgJTcDmAwgBSAkNwOQDCAFICE2AowMIAUgGzYCiAwgBSAUNgKEDCAFIAk2AoAMIAVBgICAgHg2AvQLIAUgIzcC7AsgBSAgQYCAgIB4IA0bNgLoCyAFICI3A+ALIAUgHzYC3AsgBSAFKQDgCDcAuQsgBSAFKQDnCDcAwAsgBSAFKQPIDTcD0AsgBSAFKALQDTYC2AsgBSAVNgKwDCAFICY3ArQMIAVBgICAgHg2ArwMIAVBgICAgHg2AsgMIAVBgICAgHg2AtQMIAVBADoAgQ0gBSAFKALgDTYCrAwgBSAFKQLYDTcCpAwCQCANDQAgBUG4DWoQ3hgLIAUgBUGsC2o2AsACIAVBsAtqIAVBwAJqEJIDIQggBUGwC2oQrgYCQCAIRQ0AIAVBsAtqEPsgQQRBMBDoICIDQcDjmgE2AgAgAyAINgIoIANCmoCAgKCAgICAfzcCICADQZb0mgE2AhwgAyAFKQKwCzcCBCADIAUpArgLNwIMIAMgBSkCwAs3AhQgBSgCtAggBSgCuAgQ0yUgBUGYB2oQ3wkgBiAcEJYkDAULIAUgBSgCvAg2AsgCIAUgBSkCtAg3A8ACIAVBsAtqIAVBwAJqEIcUIAVBjAdqIAVBsAtqQbD0mgFBFxCJECAFKAKQByEDIAUoAowHIRIgBUGYB2oQ3wkgBiAcEJYkQYCAgIB4IQgCQCASQYCAgIB4ag4CBQ4ACyAFKAKUByETIBIhCAwNCyAVIAUoArgLEPwgAAtBrNyaARDDIwALQdjdmgEQwyMACyAFICc3ArwLIAUgJTcCtAsgBSADNgKwC0Gk35oBQQwgBUGwC2pB7NyaAUGw35oBENUUAAsgAEEEaiADEMsPIABBgICAgHg2AgAgBUGoBmoQmx4gBSgCkAYgBSgClAYQ0yUMCgsgFiAWKAIAIgpBAWo2AgAgBUEANgLQDSAFQgA3AsgNIAVBADYC7A0gBUIANwLkDSAKQX9MDQQgBUGsC2oQ7SIgBSAWNgKsC0EBIQogBUHwDWohBAsCQCAWKAJoKAIIQQlGDQAgBUEQaiAWQRBqIBIQ1A0gBSgCEEEBcQ0CCyAKRQ0CCyAFQfANahD6HgwBCyAFKAIUIhYgBCgCAEEQahDaEyILKAIIIgJPDQIgBUGwC2ogBUHAAmogDCADIBYgEiAEKAIAQRBqIAsoAgQgFkECdGooAgAiCyAFQeQNahCNC2ogCyAEKAIAQRBqIBIgBUHIDWoQjQtqayAYEOQRIApFDQAgBUHwDWoQ+h4MAAsLAAsgFiACQbzmmgEQ9RYACyAFICI3A7ALQdT9mgFBKyAFQbALakGQ/poBQfT8mgEQ1RQACyAFIAUoApgGNgLIAiAFIAUpApAGNwPAAiAFQbALaiAFQcACahCHFCAFQZAKaiAFQbALakGE/ZoBQRwQiRAgBSgClAohEgJAIAUoApAKIgxBgICAgHhHDQAgAEEEaiASEMsPIABBgICAgHg2AgAgCCADEKAiIAVBqAZqEJseDAILIAUoApgKIRggACATNgIUIAAgAzYCECAAIAg2AgwgACAYNgIIIAAgEjYCBCAAIAw2AgAgBUGoBmoQmx4gBUHYBWoQiB8gGiAZEI4kCyAFQZgBahCQGAwDCyAFQdgFahCIHyAaIBkQjiQLIAVBmAFqEJAYDAELIBogGRCOJAsgBUGQAWoQsCMgBUGAAWoQ+h4gBUGADmokAA8LQbjogQFBO0HY6IEBEOQbAAvbuAECLX8FfiMAQdAHayIDJAACQAJAAkAgASgCeCIEQYCAgIAGcQ0AIAEoArQBIQQgASgCsAEhBSADQcaAgIB4NgLoBiAFIAQgA0HoBmoQwBshBSABLQC4AUGiAUcNASABIAEQhQ4QkwkMAQsCQAJAAkAgAS0AuAFBqH9qDggAAQEBAQEBAgELIAMgAikCADcDkAEgAyACKAIINgKYAQJAIARBgoCAgAJxQYCAgIACRw0AIAEgBEEKcjYCeAsgAUGwAWohBCABKAKwASEGAkACQCABKAKIASIFQQtHDQAgA0HoBmogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A+gGIAMgASgCoAE2AvAGIAFBjAFqIQcCQCABKAIIQQpGDQAgAUEIahC8CwsgASAFNgIIIAEgBykCADcCDCABIAcoAgg2AhQLIAEpA7ABITAgBCADKQPoBjcCACAEIAMoAvAGNgIIIAEgMDcDqAECQAJAAkACQAJAAkACQAJAIAEtALgBIgVBowFGDQAgAUGIAWohByABKAKAASIIQYDAAHEhCSAFQfwARw0CIAlFDQIgASgCsAEhBQJAAkAgBygCACIJQQtHDQAgA0HoBmogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A+gGIAMgASgCoAE2AvAGIAFBjAFqIQgCQCABKAIIQQpGDQAgAUEIahC8CwsgASAJNgIIIAEgCCkCADcCDCABIAgoAgg2AhQLIAEpA7ABITAgBCADKQPoBjcCACAEIAMoAvAGNgIIIAEgMDcDqAEgA0G4AmogAhC+CiADQegGaiABIAUgA0G4AmoQywFBCSEJIAMoAuwGIQUCQCADKALoBiIIQQlHDQBBACEKQQAhBAwECyADIAMpAYIHNwPYBSADIAMpAYgHNwHeBSAIQQhGDQEgAy0AgQchCyADLQCAByEMIAMoAvwGIQcgAygC+AYhDSADKAL0BiEEIAMoAvAGIQ4gAyADKQHeBTcBpgUgAyADKQPYBTcDoAUgBEGAfnEhCiABKAKsASEPQQEhCSAFIQIMBQtBCSEJQQAhCiABKAJwEKoeIQVBACEEDAILIAEoAoABIghBgMAAcSEJIAEtALgBIQULAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgCUUNAAJAAkACQAJAAkAgBUH/AXFBtX9qIglBH0sNAEEBIAl0QYGAgpB4cQ0BCyAFQbR/akH/AXFB1QBPDQMMAQsgBUH/AXFBywBHDQAgA0EAIAFBCGogASgCCCIJQQpGIgUbNgK4AgJAIAUNACAJQQJHDQAgASkDECIwQgODQgBSDQIgMKciBSAFKAIAIgVBAWo2AgAgBUF/TA0dDAILIANB0AStQiCGIANBuAJqrYQ3A+gGQbjlmgEgA0HoBmpB7OWaARDkGwALAkACQCABKAKwASIFIAEoAmwiCUkNACABKAK0ASIIIAEoAnBNDQELQbyOmwFB1gBBlI+bARC3IQALIAEoAmAgBSAJa2ogCCAFaxCGGSEwCyADQfAFaiACEL4KIAMoAvgFIQUgAygC9AUhAiADKALwBSEJAkACQCABLQCBAUEgcUUNACABKAJ4IQpBCiEQIAEoAhghDSABKAIEIQsgASgCACEOIAEtABwhEQJAIAEoAghBCkYNACADQbgCaiABQQhqEJQGIAMgAykCvAI3A8gGIAMgAygCxAI2AtAGIAMoArgCIRALQQAhCEEAIQwCQCABKAIgQYCAgIB4Rg0AIAEoAjQhDCABKAIoIQgLIAEoAmghEiABLQAdIRNBCyEPAkAgBygCACIUQQtGDQAgAUGYAWohFUEKIQ8CQCAUQQpGDQAgA0G4AmogBxCUBiADIAMpArwCNwOoBiADIAMoAsQCNgKwBiADKAK4AiEPCyADIAMpA6gGNwO4AiADIAMoArAGNgLAAiADIBUoAgg2AswCIAMgFSkCADcCxAILIAMgEDYC8AYgAyALNgLsBiADIA42AugGIAMgAykDyAY3AvQGIAMgAygC0AY2AvwGIAMgEjYClAcgAyAMNgKMByADIAg2AogHIAMgEzoAhQcgAyAROgCEByADIA02AoAHIAMgASgCrAEiDDYCvAcgAyABKAKoASINNgK4ByADIAo2ApAHIAMgDzYCmAcgAyAEKAIINgLIByADIAQpAwA3A8AHIAMgAykDuAI3ApwHIAMgAykDwAI3AqQHIAMgAykDyAI3AqwHIAMgAygC0AI2ArQHIAEgCkEBcjYCeCADIAU2ArAGIAMgAjYCrAYgAyAJNgKoBiADQbgCaiABIAEoArABIANBqAZqIDBBARDmASADQZgHaiEFIANBwAdqIQkgAygCvAIhAiADKAK4AiIIQQlHDQEgASADQegGahDLCCAEIAkoAgg2AgggBCAJKQMANwMAAkAgASgCiAFBDnFBCkYNACAHELwLCyABIAw2AqwBIAEgDTYCqAEgByAFKQMYNwMYIAcgBSkDEDcDECAHIAUpAwg3AwggByAFKQMANwMAIAJBCGoQ5gMgAkEgQQgQ1BQgAS0AuAEhBQwCCyACIAUQ6B0gCSACEPojAkAgMEIDg0IAUg0AIDCnIgIgAigCACIFQX9qNgIAIAVBAUcNACACIAIoAhAQ7B4LIAEtALgBIQUMAQsgAyADKQHSAjcDyAYgAyADKQHYAjcBzgYCQCAIQQhGDQAgAy0A0QIhCyADLQDQAiEMIAMoAswCIQcgAygCyAIhDSADKALEAiEEIAMoAsACIQ4gASABKAJ4QX5xIApBAXFyNgJ4IAMgAykBzgY3AZYGIAMgAykDyAY3A5AGAkAgEEEKRg0AIANB6AZqQQhqELwLCwJAIA9BDnFBCkYNACAFELwLCyADIAMpA5AGNwOgBSADIAMpAZYGNwGmBSAEQYB+cSEKIAEoAqwBIQ9BASEJDCYLIAEgA0HoBmoQywggBCAJKAIINgIIIAQgCSkDADcDAAJAIAEoAogBQQ5xQQpGDQAgBxC8CwsgASAMNgKsASABIA02AqgBIAcgBSkDGDcDGCAHIAUpAxA3AxAgByAFKQMINwMIIAcgBSkDADcDACABLQC4ASEFCwJAAkAgBUH/AXEiAkEXRg0AIAJB9QBGDQMgAkHfAEcNAQJAAkAgBygCACICQQtHDQAgA0HoBmogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A+gGIAMgASgCoAE2AvAGIAFBjAFqIQUCQCABKAIIQQpGDQAgAUEIahC8CwsgASACNgIIIAEgBSkCADcCDCABIAUoAgg2AhQLIAEpA7ABITAgBCADKQPoBjcCACAEIAMoAvAGNgIIIAEgMDcDqAFBACECIAEtALgBQZcBRw0PIAcoAgBBC0cNDCABKQMIITAgAUEKNgIIIAMgASkDEDcDwAIgAyAwNwO4AiADQfgGaiABEMYBIAEpAwghMCABQQo2AgggAyABKQMQNwPwBiADIDA3A+gGIAFBCGohBCABKAKIAUEOcUEKRw0KIAcgAykDgAc3AxggByADKQP4BjcDECAHIAMpA/AGNwMIIAcgAykD6AY3AwAMCwsCQAJAIAcoAgAiAkELRw0AIANB6AZqIAEQxgEMAQsgAUELNgKIASADIAEpApgBNwPoBiADIAEoAqABNgLwBiABQYwBaiEFAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgAjYCCCABIAUpAgA3AgwgASAFKAIINgIUCyABKQOwASEwIAQgAykD6AY3AgAgBCADKALwBjYCCCABIDA3A6gBIANB+ABqIAEQuANBCSEJQQAhCiADKAJ8IQUgAygCeEEBcUUNCAwiCyABKAKAASEICyAEKAIAIQ0gCEENdiAFQf8BcSICQZcBRnEiDA0BIAJB1ABHDQIgBygCACICQQtHDQMgA0HoBmogARDGAQwECwJAAkAgBygCACICQQtHDQAgA0HoBmogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A+gGIAMgASgCoAE2AvAGIAFBjAFqIQUCQCABKAIIQQpGDQAgAUEIahC8CwsgASACNgIIIAEgBSkCADcCDCABIAUoAgg2AhQLIAEpA7ABITAgBCADKQPoBjcCACAEIAMoAvAGNgIIIAEgMDcDqAEgAS0AuAEiAkGGAUYNBCABKAK0ASEEIAEoArABIQUgA0HcAWogAhDGJSADQY8CrUIghkGlgpsBrYQ3A7gCIANB6AZqQc2VgAEgA0G4AmoQrxAgAyADKQLcATcC9AYgAyADKALkATYC/AYgBSAEIANB6AZqEMAbIQVBCSEJQQAhCiABLQC4AUGiAUcNHyABIAEQhQ4QkwlBACEEDCALAkACQCAHKAIAIgJBC0cNACADQegGaiABEMYBDAELIAFBCzYCiAEgAyABKQKYATcD6AYgAyABKAKgATYC8AYgAUGMAWohBQJAIAEoAghBCkYNACABQQhqELwLCyABIAI2AgggASAFKQIANwIMIAEgBSgCCDYCFAsgASkDsAEhMCAEIAMpA+gGNwIAIAQgAygC8AY2AgggASAwNwOoAQtBASECQQIhCQwNCyABQQs2AogBIAMgASkCmAE3A+gGIAMgASgCoAE2AvAGIAFBjAFqIQUCQCABKAIIQQpGDQAgAUEIahC8CwsgASACNgIIIAEgBSkCADcCDCABIAUoAgg2AhQLIAEpA7ABITAgBCADKQPoBjcCACAEIAMoAvAGNgIIIAEgMDcDqAEgAS0AuAEiAkEYRw0IIAEoArABIQVBACEKIANB6AZqIAFBABDdASADKALsBiEQAkAgAygC6AYiAkGAgICAeEcNAEEJIQlBACEEIBAhBQwfCyADKALwBiEJIAMoApgBRQ0FIAEoAqwBIQQgA0G1gYCAeDYC6AYgBSAEIANB6AZqEMAbIQUCQCABLQC4AUGiAUcNACABIAEQhQ4QkwkLIBAgCRDoHSACIBAQ+iMMDAsCQAJAIAcoAgAiAkELRw0AIANB6AZqIAEQxgEMAQsgAUELNgKIASADIAEpApgBNwPoBiADIAEoAqABNgLwBiABQYwBaiEFAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgAjYCCCABIAUpAgA3AgwgASAFKAIINgIUCyABKQOwASEwIAQgAykD6AY3AgAgBCADKALwBjYCCCABIDA3A6gBIANB6AZqIAFBAEEAELYDIAMoAugGIQUCQCADLQD8BiICQQJHDQBBCSEJQQAhCkEAIQQgBiEIDB4LIAMgAykC9AY3AsQCIAMgAykC7AY3ArwCIAMgAy8A/QY7AM0CIAMgAy0A/wY6AM8CIAMgAjoAzAIgAyAFNgK4AgJAIAEQiQkiEEUNACADQbgCahCaHEEJIQlBACEKQQAhBCAGIQggECEFDB4LIAMgAygBygI2AqAFIAMgAy8BzgI7AaQFIAMoArwCIgRBgH5xIQogASgCrAEhAkEIIQkgAy0AyQIhCyADLQDIAiEMIAMoAsQCIQcgAygCwAIhDSAFIQ4gBiEIDB0LAkAgARCJCSIQRQ0AIAUQjAIgBUHAAEEIENQUQQAhBCAQIQUMHQsgASgCrAEhAkEHIQkMBwsgBxC8CyAHIAMpA+gGNwMAIAcgAykD8AY3AwggByADKQP4BjcDECAHIAMpA4AHNwMYIAQoAgBBCkYNACAEELwLCyAEIAMpA8ACNwMIIAQgAykDuAI3AwAgBygCAEELRg0DCwJAIAEtAKABIgVBtX9qIgRBH0sNAEEBIAR0QYGAgpB4cQ0CCyAFQbR/akH/AXFB1QBJDQEMAgsgAygClAEiBUEAEOgdIAMoApABIAUQ+iMgAyAJNgKYASADIBA2ApQBIAMgAjYCkAEgAS0AuAEhAgwCCyABELIQQQEhAgsgA0HoBmogARC2CCADKALwBiEFIAMpA+gGIjBQDQQgAygC9AYhB0EAIQQgA0EANgL4BiADIAc2AvQGIAMgBTYC8AYgA0EAOgD8BiADIDA3A+gGIANB8ABqIAEgBiADQegGakEBIAIQ+AFBCUEGIAMoAnBBAXEbIQkgAygCdCEFQQAhCgwUCwJAIAEtAIEBQSBxRQ0AAkACQAJAIAJB/wFxQfMARw0AAkACQCAHKAIAQQtHDQAgASkDCCEwIAFBCjYCCCADIAEpAxA3A8ACIAMgMDcDuAIgA0H4BmogARDGASABKQMIITAgAUEKNgIIIAMgASkDEDcD8AYgAyAwNwPoBiABQQhqIQICQAJAIAEoAogBQQ5xQQpHDQAgByADKQOABzcDGCAHIAMpA/gGNwMQIAcgAykD8AY3AwggByADKQPoBjcDAAwBCyAHELwLIAcgAykD6AY3AwAgByADKQPwBjcDCCAHIAMpA/gGNwMQIAcgAykDgAc3AxggAigCAEEKRg0AIAIQvAsLIAIgAykDwAI3AwggAiADKQO4AjcDACAHKAIAQQtGDQELIAEtAKABQdAARw0AIAEQnwsNACABKAKwASECIAEQshAgAS0AuAFBogFGDQMgA0GAA2ogASAGIAIgA0GQAWpBARCmCEEDIQkgAygCgAMiCEEDRw0CIAMoAoQDIQUMGwsgAS0AuAEiAkHzAEcNAAJAIAEQngtB/wFxQYIBRw0AIAEoArQBIQIgASgCsAEhBSADQZ+BgIB4NgLoBiABIAUgAiADQegGahDqHSABELIQCyABLQC4ASECCyACQf8BcUGCAUcNAiABKAKwASECIAEQshAgA0HoAGogASACELoDQQAhCiADKAJsIQUgAygCaEEBcQ0UIAEoAqwBIQ9BAyEJQQIhCAwLCyADIAMpAZoDNwOgBSADIAMpAaADNwGmBSADKAKMAyIEQYB+cSEKIAMoAqwDIQ8gAygCqAMhBiADLQCZAyELIAMtAJgDIQwgAygClAMhByADKAKQAyENIAMoAogDIQ4gAygChAMhAgwIC0EJIQlBACEKIAEQhQ4hBUEAIQQMFAsCQAJAAkACQCACQf8BcSICQdAARg0AIAJB+ABHDQEgARCeC0H/AXFB3QBHDQEgARCfCw0BIANB6AZqIAEgBiADQZABahDwB0EDIQkgAygC7AYhBSADKALoBiIIQQNGDRogAyADKQGCBzcDoAUgAyADKQGIBzcBpgUgAygC9AYiBEGAfnEhCgwCCyADQegGaiABIAYgASgCsAEgA0GQAWpBABCmCEEDIQkgAygC7AYhBSADKALoBiIIQQNGDRkgAyADKQGCBzcDoAUgAyADKQGIBzcBpgUgAygC9AYiBEGAfnEhCgwBCwJAAkACQAJAIAEtALgBIgJB3QBGDQAgAkH9AEcNBSABKAKAAUGAwABxRQ0FIAEQngsiCUH/AXEiBUG1f2oiAkEfTQ0BDAILIANB6AZqIAEgBiADQZABahDHD0EDIQkgAygC7AYhBSADKALoBiIIQQNGDRsgAyADKQGCBzcDoAUgAyADKQGIBzcBpgUgAygC9AYiBEGAfnEhCgwDC0EBIAJ0QYGAgpB4cQ0BCyAFQaQBRg0CIAlBtH9qQf8BcUHUAEsNAgsgARCfCw0BIAEoArABIQIgARCyEEEAIQogA0HgAGogASACQQAQsQFBASEJIAMoAmQhBSADKAJgQQFxDRMMCQsgAy0AgQchCyADLQCAByEMIAMoAvwGIQcgAygC+AYhDSADKALwBiEOIAMoApAHIQYgAygClAchDyAFIQIMGAsCQCABLQCAAUEQcUUNAAJAIAEtALgBIgJB/gBHDQAgARCeC0H/AXFBwABGDQMgAS0AuAEhAgsgAkH/AXFBB0cNACABEJ4LQf8BcUF+ag4OAgAAAAAAAAAAAAAAAAIACyADQdgAaiABEJMSQQkhCSADKAJcIQQCQAJAAkAgAygCWEEBcUUNAAwBCyADIAQ2AugGAkAgARCJCSIFRQ0AIANB6AZqEJEiDAILIAEoAqwBIQJBBCEJCyAEIQULQQAhCgtBACEEIAYhCAwUCyABKAKsASEIIAEoAqgBIQtC8ciVs5asnbb0AEECEPgaQQAhCUEAIQILIAEtALgBQRhHDQIgASgCsAEhBUEAIQogA0HoBmogAUEAEN0BIAMoAuwGIRACQCADKALoBiIPQYCAgIB4Rw0AQQkhCUEAIQQgECEFDBMLIAMoAvAGIQogAygCmAFFDQEgASgCrAEhAiADQbWBgIB4NgLoBiAFIAIgA0HoBmoQwBshBQJAIAEtALgBQaIBRw0AIAEgARCFDhCTCQsgECAKEOgdIA8gEBD6IwtBCSEJQQAhCkEAIQQMDwsgAygClAEiBUEAEOgdIAMoApABIAUQ+iMgAyAKNgKYASADIBA2ApQBIAMgDzYCkAELIAwNAwJAAkACQCABLQC4ASIFQfgARg0AIAVB0ABHDQEgA0HoBmogASABKAKwASADQZABakEAELUHIAMoAuwGIQUgAygC6AYiCEEIRg0TIAMgAykBggc3A+gDIAMgAykBiAc3Ae4DDAILAkACQCAHKAIAQQtHDQAgASkDCCEwIAFBCjYCCCADIAEpAxA3A8ACIAMgMDcDuAIgA0H4BmogARDGASABKQMIITAgAUEKNgIIIAMgASkDEDcD8AYgAyAwNwPoBiABQQhqIQUCQAJAIAEoAogBQQ5xQQpHDQAgByADKQOABzcDGCAHIAMpA/gGNwMQIAcgAykD8AY3AwggByADKQPoBjcDAAwBCyAHELwLIAcgAykD6AY3AwAgByADKQPwBjcDCCAHIAMpA/gGNwMQIAcgAykDgAc3AxggBSgCAEEKRg0AIAUQvAsLIAUgAykDwAI3AwggBSADKQO4AjcDACAHKAIAQQtGDQELIAEtAKABQd0ARw0AIAEQnwsNACADQegGaiABIANBkAFqENQJIAMoAuwGIQUgAygC6AYiCEEIRg0TIAMgAykBggc3A+gDIAMgAykBiAc3Ae4DDAILIAEtALgBIQULAkAgBUH/AXEiBUHdAEcNACADQegGaiABQQAgAyADQZABahD0CiADKALsBiEFIAMoAugGIghBCEYNEiADIAMpAYIHNwPoAyADIAMpAYgHNwHuAwwBCwJAAkACQCAFQf0ARw0AIAEoAoABQYDAAHFFDQACQAJAIAEQngsiD0H/AXEiCkG1f2oiBUEfSw0AQQEgBXRBgYCCkHhxDQELIApBpAFGDQEgD0G0f2pB/wFxQdQASw0BCyABEJ8LDQAgASgCsAEhAiABELIQQQAhCiADQdAAaiABIAJBABCxASADKAJUIQIgAygCUEEBcQ0BQQYhCAwCCyABLQC4ASEFAkACQAJAAkAgAS0AgQFBIHFFDQAgBUH/AXFB0QBHDQAgARCeC0H/AXFB/QBGDQEgAS0AuAEhBQsgBUH/AXFBr39qDh0CCQkJCQkJCQkJCQkJCQkJCQEJCQkJCQkJCQkJAgkLIAEoArABIQIgARCyECABELIQQQEhCSADQcAAaiABIAJBARCxAUEAIQogAygCRCEFIAMoAkBBAXENEAwGCyABEJ4LIgVB/wFxQaQBRg0HIAUQ2xxFDQcLQQAhCiADQcgAaiABQQAQ0AEgAygCTCECIAMoAkhBAXENAEECIQgMAQtBCSEJQQAhBCACIQUMEQsgAyADKQPoAzcDoAUgAyADKQHuAzcBpgUgASgCrAEhD0LxyJWzlqydtvQAIAkQ+BogAygClAEiASADKAKYARDoHSADKAKQASABEPojQQEhCUEAIQRBACEKDBILIAMtAIEHIQsgAy0AgAchDCADKAL8BiEHIAMoAvgGIQ0gAygC9AYhBCADKALwBiEOIAUhAiADIAMpA+gDNwOgBSADIAMpAe4DNwGmBSAEQYB+cSEKIAEoAqwBIQ9BASEJCwwQCyABKAKsASEPQQYhCAtBACEEIAUhAgwMCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAg0AQfHIlbMGIQVB4eqxowchCkEAIQ8MAQsgAS0AuAEhAiABLQCAAUEQcUUNAQJAAkAgAkG1f2oiBUEfSw0AQQEgBXRBgYCCkHhxDQELIAJBtH9qQf8BcUHUAEsNAgtBACEKIANB6AZqIAFBAEEAELYDIAMoAugGIQUgAy0A/AYiCUECRg0UIAMgAy8A/QY7AYwEIAMgAy0A/wY6AI4EIAMoAvgGIQ8gAygC9AYhCCADKALwBiELIAMoAuwGIQoLIANBADYC+AEgA0KAgICAgAE3AvABIANB8AFqEMAaIAMoAvQBIgIgAy0AjgQ6AB8gAiADLwGMBDsAHSACIAk6ABwgAiAPNgIYIAIgCDYCFCACIAs2AhAgAiAKNgIMIAIgBTYCCCACQgM3AwAgA0EBNgL4ASABLQC4ASICQQdHDQYgBygCAEELRw0DIAEpAwghMCABQQo2AgggAyABKQMQNwPAAiADIDA3A7gCIANB+AZqIAEQxgEgASkDCCEwIAFBCjYCCCADIAEpAxA3A/AGIAMgMDcD6AYgAUEIaiECIAEoAogBQQ5xQQpHDQEgByADKQOABzcDGCAHIAMpA/gGNwMQIAcgAykD8AY3AwggByADKQPoBjcDAAwCCwJAAkACQAJAIAJBD0cNAAJAIAcoAgAiAkELRw0AIAEpAwghMCABQQo2AgggAyABKQMQNwPAAiADIDA3A7gCIANB+AZqIAEQxgEgASkDCCEwIAFBCjYCCCADIAEpAxA3A/AGIAMgMDcD6AYgAUEIaiECAkACQCABKAKIAUEOcUEKRw0AIAcgAykDgAc3AxggByADKQP4BjcDECAHIAMpA/AGNwMIIAcgAykD6AY3AwAMAQsgBxC8CyAHIAMpA+gGNwMAIAcgAykD8AY3AwggByADKQP4BjcDECAHIAMpA4AHNwMYIAIoAgBBCkYNACACELwLCyACIAMpA8ACNwMIIAIgAykDuAI3AwAgBygCACICQQtGDQILIAEtAKABQfUARw0CIAEtALgBIQILIANBADYC+AEgA0KAgICAgAE3AvABIAJB/wFxQQ9GDQYMDQsgA0HoBmogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A+gGIAMgASgCoAE2AvAGIAFBjAFqIQUCQCABKAIIQQpGDQAgAUEIahC8CwsgASACNgIIIAEgBSkCADcCDCABIAUoAgg2AhQLIAEpA7ABITAgBCADKQPoBjcCACAEIAMoAvAGNgIIIAEgMDcDqAEgA0HoBmogARCABCADKALsBiEFQQAhCiADKALoBiIQRQ0SIAEoAqwBIQJBBSEJIAwhBCAFIQ4gBiEIIBAhBQwWCyAHELwLIAcgAykD6AY3AwAgByADKQPwBjcDCCAHIAMpA/gGNwMQIAcgAykDgAc3AxggAigCAEEKRg0AIAIQvAsLIAIgAykDwAI3AwggAiADKQO4AjcDACAHKAIAQQtGDQILIAEtAKABQQ9HDQEgARCyEAsCQAJAIAcoAgAiAkELRw0AIANB6AZqIAEQxgEMAQsgAUELNgKIASADIAEpApgBNwPoBiADIAEoAqABNgLwBiABQYwBaiEFAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgAjYCCCABIAUpAgA3AgwgASAFKAIINgIUCyABKQOwASEwIAQgAykD6AY3AgAgBCADKALwBjYCCCABIDA3A6gBIAEtALgBIgJB9QBHDQICQAJAIAcoAgAiAkELRw0AIANB6AZqIAEQxgEMAQsgAUELNgKIASADIAEpApgBNwPoBiADIAEoAqABNgLwBiABQYwBaiEFAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgAjYCCCABIAUpAgA3AgwgASAFKAIINgIUCyABKQOwASEwIAQgAykD6AY3AgAgBCADKALwBjYCCCABIDA3A6gBIANB6AZqIAEQ6wogAygC8AYhBSADKQPoBiIwQgJRDQ0gAykDgAchMSADKAL8BiEIIAMoAvgGIQogAygC9AYhCyABKAKsASEPAkAgAygC+AEiCSADKALwAUcNACADQfABahDAGgsgAygC9AEgCUHQAGxqIgIgDzYCLCACIA02AiggAiAxNwMgIAIgCDYCHCACIAo2AhggAiALNgIUIAIgBTYCECACIDA3AwggAkICNwMAIAMgCUEBajYC+AELIAEtALgBIQILIAJB/wFxQf4ARg0BIAEtAIABQRBxDQIgASgCtAEhBCABKAKwASEFIANBuANqIAIQxiUgA0GPAq1CIIZBioKbAa2ENwO4AiADQegGakHNlYABIANBuAJqEK8QIAMgAykCuAM3AvQGIAMgAygCwAM2AvwGIAUgBCADQegGahDAGyEFIAEtALgBQaIBRw0LIAEgARCFDhCTCQwLCyABKAK0ASEEIAEoArABIQUgA0HwBGogAhDGJSADQY8CrUIghkGB9ZoBrYQ3A7gCIANB6AZqQc2VgAEgA0G4AmoQrxAgAyADKQLwBDcC9AYgAyADKAL4BDYC/AYgBSAEIANB6AZqEMAbIQUgAS0AuAFBogFHDQogASABEIUOEJMJDAoLIANB6AZqIAEQgAQgAygC7AYhByADKALoBiINDQEgByEFDAkLAkAgAkH/AXFBB0cNAAJAAkAgBygCACICQQtHDQAgA0HoBmogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A+gGIAMgASgCoAE2AvAGIAFBjAFqIQUCQCABKAIIQQpGDQAgAUEIahC8CwsgASACNgIIIAEgBSkCADcCDCABIAUoAgg2AhQLIAEpA7ABITAgBCADKQPoBjcCACAEIAMoAvAGNgIIIAEgMDcDqAEgAS0AuAEhAgwCCyABKAK0ASEEIAEoArABIQUgA0HQA2ogAhDGJSADQY8CrUIghkH845oBrYQ3A7gCIANB6AZqQc2VgAEgA0G4AmoQrxAgAyADKQLQAzcC9AYgAyADKALYAzYC/AYgBSAEIANB6AZqEMAbIQUgAS0AuAFBogFHDQggASABEIUOEJMJDAgLIAEoAqwBIgRBgH5xIQoMBQsgAkH/AXFBAkcNBQJAAkAgBygCACICQQtHDQAgA0HoBmogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A+gGIAMgASgCoAE2AvAGIAFBjAFqIQUCQCABKAIIQQpGDQAgAUEIahC8CwsgASACNgIIIAEgBSkCADcCDCABIAUoAgg2AhQLIAEpA7ABITAgBCADKQPoBjcCACAEIAMoAvAGNgIIIAEgMDcDqAECQCABLQC4ASIIQQNGDQAgAUEMaiEWIAFBCGohEiABQZgBaiEXIAFBjAFqIRggA0GFB2ohGSADQcgGakEIaiEaIANBuAJqQQhqIRsgA0G4AmpBDGohECADQegGakEMaiERA0AgASgCsAEhAiADQegGaiABEOsKIAMoAvAGIQkCQAJAIAMpA+gGIjBCAlINAEICITAMAQsgECARKAIQNgIQIBAgESkCCDcCCCAQIBEpAgA3AgAgAyAJNgLAAiADIDA3A7gCAkACQAJAAkACQAJAAkACQCAwQgFSDQAgAyADKQPQAjcD4AYgAyADKQPIAjcD2AYgAyADKQPAAjcD0AYgAyADKQO4AjcDyAZBACETDAELIAMpA9ACITIgAygCzAIhHCADKALIAiEdIAMpA8ACITMCQAJAAkAgCEH/AXFBlwFHDQAgASgCgAFBgMAAcUUNACADKALEAiEeAkACQCABLQC4ASIfQbV/aiIIQR9LDQBBASAIdEGBgIKQeHENAQsgH0G0f2pB/wFxQdQASw0BCyADQbgEaiABELYIAkAgAykDuAQiMFBFDQBCAiEwIAMoAsAEIQgMCAsgA0EANgKABiADIAMoAsQEIiA2AvwFIAMgAygCwAQiITYC+AUgAyAwQiCIpyIiNgL0BSADQQA6AIQGIAMgMKciCDYC8AUCQCAfQfUARw0AAkACQCABLQC4ASIjQbV/aiIfQR9LDQBBASAfdEGBgIKQeHENAQsgI0G0f2pB/wFxQdUASQ0AIAxFDQogA0GogYCAeDYC6AYgASAdIBwgA0HoBmoQ6h0MCgsgA0GABWogARC2CCADKQOABSIwUA0GIANBADYCuAYgAyADKAKMBSIfNgK0BiADIAMoAogFIiQ2ArAGIAMgMEIgiKciJTYCrAYgA0EAOgC8BiADIDCnIiY2AqgGAkAgI0H1AEcNAAJAAkAgAS0AuAEiJ0G1f2oiI0EfSw0AQQEgI3RBgYCCkHhxDQELICdBtH9qQf8BcUHUAEsNAQsgA0G4BWogARC2CAJAIAMpA7gFIjBCAFINACADKALABSEIIANBqAZqEJocIANB8AVqEJocDAkLIDBCIIghMSAwpyEFIAMoAsQFISggAygCwAUhKSAMRQ0GIANBqIGAgHg2AugGIAEgHSAcIANB6AZqEOodDAYLIANB8AVqEJocQQAhFEIAITAgHiEKIB0hDSAcIQsgMiE0QgAhMSAmIQUgAiEPIBwhDkEAIRMgJSEVICQhKSAfIShBACEqDAsLIAwNAQwCCyADIDI3A+AGIAMgHDYC3AYgAyAdNgLYBiADIDM3A9AGIANCADcDyAZBACETDAILIANBqIGAgHg2AugGIAEgHSAcIANB6AZqEOodCyAaIAMpA4AGNwMQIBogAykD+AU3AwggGiADKQPwBTcDACADQgA3A8gGQQEhEyAzQgODQgBSDQAgM6ciBSAFKAIAIglBf2o2AgACQCAJQQFHDQAgBSAFKAIQEOweCyADKAK4AkUNACAbEK4SC0ICITECQAJAIAEtALgBQfUARw0AAkACQCAHKAIAIgVBC0cNACADQegGaiABEMYBDAELIAdBCzYCACADIBcpAgA3A+gGIAMgFygCCDYC8AYCQCASKAIAQQpGDQAgEhC8CwsgEiAFNgIAIBYgGCkCADcCACAWIBgoAgg2AggLIAEpA7ABITAgBCADKQPoBjcCACAEIAMoAvAGNgIIIAEgMDcDqAEgA0HoBmogARDrCiADKALwBiEFAkAgAykD6AYiMUICUg0AIAMoAsgGDQIgAykD0AYiMEIDg0IAUg0SIDCnIgEgASgCACICQX9qNgIAIAJBAUcNEiABIAEoAhAQ7B4MEgsgAyAZLwAAOwHIASADIBktAAI6AMoBIAMtAIQHISsgAygCgAchLCADKAL8BiEtIAMoAvgGIS4gAygC9AYhLwsgAyADLwHIATsBuAEgAyADLQDKAToAugEgASgCrAEhDiADKQPgBiE0IAMoAtwGIQsgAygC2AYhDSADKALUBiEKIAMoAtAGIQkgAykDyAYhMCArIRQgAiEPIC8hFSAuISkgLSEoICwhKgwHCyAaEK4SDA8LIDGnIRUgAykDgAYhNCADQagGahCaHEEAIRRBASETQgAhMEIAITFBACEqDAQLIAMoAogFIQggA0HwBWoQmhwLQgIhMAsgCiEiIA0hISALISAgDyECIA4hHAwBCyABKAKsASEcQQEhE0ICITFCACEwIAMpA4AGITQLAkAgM0IDg0IAUg0AIDOnIgkgCSgCACIKQX9qNgIAAkAgCkEBRw0AIAkgCSgCEBDsHgsgAygCuAJFDQAgGxCuEgsgCCEJICIhCiAhIQ0gICELIAIhDyAcIQ4LAkAgMEICUg0AIAkhBQwJCyADIAMtALoBOgDqBiADIAMvAbgBOwHoBgJAIAMoAvgBIgggAygC8AFHDQAgA0HwAWoQwBoLIAMoAvQBIAhB0ABsaiICIBQ6ADwgAiAqNgI4IAIgKDYCNCACICk2AjAgAiAVNgIsIAIgBTYCKCACIDE3AyAgAiA0NwMYIAIgCzYCFCACIA02AhAgAiAKNgIMIAIgCTYCCCACIDA3AwAgAiADLwHoBjsAPSACIAMtAOoGOgA/IAIgEzoASCACIA42AkQgAiAPNgJAIAMgCEEBajYC+AECQCABLQC4ASICQQdGDQAgAkEDRg0CIAEoArQBIQQgASgCsAEhBSADQdgEaiACEMYlIANBjwKtQiCGQfzjmgGthDcDuAIgA0HoBmpBzZWAASADQbgCahCvECADIAMpAtgENwL0BiADIAMoAuAENgL8BiAFIAQgA0HoBmoQwBshBSABLQC4AUGiAUcNCSABIAEQhQ4QkwkMCQsCQAJAIAcoAgAiAkELRw0AIANB6AZqIAEQxgEMAQsgB0ELNgIAIAMgFykCADcD6AYgAyAXKAIINgLwBgJAIBIoAgBBCkYNACASELwLCyASIAI2AgAgFiAYKQIANwIAIBYgGCgCCDYCCAsgASkDsAEhMCAEIAMpA+gGNwIAIAQgAygC8AY2AgggASAwNwOoASABLQC4ASIIQQNHDQALCwJAAkAgBygCACICQQtHDQAgA0HoBmogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A+gGIAMgASgCoAE2AvAGIAFBjAFqIQUCQCABKAIIQQpGDQAgAUEIahC8CwsgASACNgIIIAEgBSkCADcCDCABIAUoAgg2AhQLIAEpA7ABITAgBCADKQPoBjcCACAEIAMoAvAGNgIIIAEgMDcDqAECQCABLQC4ASICQf4ARg0AIAMoAvgBIgVFDQMgBUHQAGwhCiADKAL0ASEIQQAhAgNAAkACQCAIIAJqIgUpAwAiMKciCUF+akECIDBCAVYbIg1BAkYNAAJAAkAgDQ4CAQABCyAFQRRqKAIAIQkgBUEQaigCACENAkAgBUEIaikDACIwQgODQgBSDQAgMKciBSAFKAIAIgVBAWo2AgAgBUF/TA0GCyADQe2AgIB4NgLoBiADIDA3A/AGIAEgDSAJIANB6AZqEOodDAILAkACQCAFQQhqKAIADQAgBUEQaikDACIwQgODQgBSDQEgMKciCSAJKAIAIglBAWo2AgAgCUF/Sg0BDAYLIANBOGogBUEQahCMFCADQegGaiADKAI4IAMoAjwQwQkgA0HoBmoQ0x4hMAsgBUEsaigCACEJIAVBKGooAgAhBSADQe2AgIB4NgLoBiADIDA3A/AGIAEgBSAJIANB6AZqEOodDAELAkAgCUEBcQ0AIAVBCGoiCRC1IEUNASAFQRRqKAIAIQ0gBUEQaigCACEFAkAgCSkDACIwQgODQgBSDQAgMKciCSAJKAIAIglBAWo2AgAgCUF/TA0FCyADQe2AgIB4NgLoBiADIDA3A/AGIAEgBSANIANB6AZqEOodDAELIAVBFGooAgAhCSAFQRBqKAIAIQUgA0HxgICAeDYC6AYgASAFIAkgA0HoBmoQ6h0LIAogAkHQAGoiAkYNAwwACwsgA0HoBmogARCABCADKALsBiIHIQUgAygC6AYiDQ0DDAYLAAsgAS0AuAEhAgtBACENAkAgAkH/AXFBBkcNAAJAAkAgBygCACICQQtHDQAgA0HoBmogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A+gGIAMgASgCoAE2AvAGIAFBjAFqIQUCQCABKAIIQQpGDQAgAUEIahC8CwsgASACNgIIIAEgBSkCADcCDCABIAUoAgg2AhQLIAEpA7ABITAgBCADKQPoBjcCACAEIAMoAvAGNgIIIAEgMDcDqAELQQAhBwsgASgCrAEiBEGAfnEhCgtBAiEJIAMoAvgBIQIgAygC9AEhCCADKALwASEFIAYhDgwGCyABKAK0ASEEIAEoArABIQUgA0GgBGogAhDGJSADQY8CrUIghkHe9JoBrYQ3A7gCIANB6AZqQc2VgAEgA0G4AmoQrxAgAyADKQKgBDcC9AYgAyADKAKoBDYC/AYgBSAEIANB6AZqEMAbIQUgAS0AuAFBogFHDQAgASABEIUOEJMJCyADKAL0ASIBIAMoAvgBEOoIIAMoAvABIAEQ9iNBCSEJQQAhCkEAIQQgBiEODAMLQQkhCUEAIQQMAQtBACEECwsLIAMoApQBIgEgAygCmAEQ6B0gAygCkAEgARD6IyAJQQlHDQELIABBCjYCACAAIAU2AgQMBAsgAyADKQGmBTcBhgEgAyADKQOgBTcDgAEgACALOgAhIAAgDDoAICAAIAc2AhwgACANNgIYIAAgCiAEQf8BcXI2AhQgACAONgIQIAAgAjYCDCAAIAg2AgggACAFNgIEIAAgCTYCACAAIAMpA4ABNwEiIAAgAykBhgE3ASggACAPNgI0IAAgBjYCMAwDC0G86JoBQfkBQbjpmgEQ5BsACyABQYgBaiEEIAFBsAFqIQcgASgCsAEhCAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCiAEiCUELRw0AIAEpAwghMCABQQo2AgggAyABKQMQNwOIAyADIDA3A4ADIANB+AZqIAEQxgEgASkDCCEwIAFBCjYCCCADIAEpAxA3A/AGIAMgMDcD6AYgAUEIaiEFAkACQCABKAKIAUEOcUEKRw0AIAQgAykDgAc3AxggBCADKQP4BjcDECAEIAMpA/AGNwMIIAQgAykD6AY3AwAMAQsgBBC8CyAEIAMpA+gGNwMAIAQgAykD8AY3AwggBCADKQP4BjcDECAEIAMpA4AHNwMYIAUoAgBBCkYNACAFELwLCyAFIAMpA4gDNwMIIAUgAykDgAM3AwAgBCgCACIJQQtHDQAgBSkDACEwIAUpAwghMSABQQo2AgggAyAxNwOIAyADIDA3A4ADIANB+AZqIAEQxgEgBSkDACEwIAUpAwghMSABQQo2AgggAyAxNwPwBiADIDA3A+gGIAEoAogBQQ5xQQpHDQEgBCADKQOABzcDGCAEIAMpA/gGNwMQIAQgAykD8AY3AwggBCADKQPoBjcDAAwDCyABLQCgASIFQQhHDQMgA0EwaiABELgDIAMoAjQhDCADKAIwQQFxRQ0BIAwhBQwiCyAEELwLIAQgAykD6AY3AwAgBCADKQPwBjcDCCAEIAMpA/gGNwMQIAQgAykDgAc3AxggBSgCAEEKRg0BIAUQvAsMAQsCQAJAIAEtALgBQQZGDQAgASgCrAEhBgwBCwJAAkAgBCgCACIEQQtHDQAgA0HoBmogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A+gGIAMgASgCoAE2AvAGIAFBjAFqIQUCQCABKAIIQQpGDQAgAUEIahC8CwsgASAENgIIIAEgBSkCADcCDCABIAUoAgg2AhQLIAEgASgCtAEiBjYCrAEgASABKAKwATYCqAEgByADKQPoBjcCACAHIAMoAvAGNgIIC0EJIQRBEiEKIAghCSAGIQgMHwsgBSADKQOIAzcDCCAFIAMpA4ADNwMAIAQoAgAiCUELRg0BIAEtAKABIQULIAVB/wFxDQEgA0EoaiABELgDIAMoAiwhDCADKAIoQQFxRQ0CIAwhBQweC0ELIQkLAkAgASgCeCIFQQJxDQAgASAFQQpyNgJ4CwJAAkACQAJAAkACQAJAIAEtALgBIgVB3wBHDQACQAJAIAlBC0cNACADQegGaiABEMYBDAELIAFBCzYCiAEgAyABKQKYATcD6AYgAyABKAKgATYC8AYgAUGMAWohBQJAIAEoAghBCkYNACABQQhqELwLCyABIAk2AgggASAFKQIANwIMIAEgBSgCCDYCFAsgASkDsAEhMCAHIAMpA+gGNwIAIAcgAygC8AY2AgggASAwNwOoASABLQC4AUHAAEYNASADQegGakEEQQhByAAQgw8gAygC7AYhBSADKALoBkUNAiAFIAMoAvAGEPwgAAsgASgCtAEhBCABKAKwASEHIANBnAFqIAUQxiUgA0GPAq1CIIZB/eOaAa2ENwOAAyADQegGakHNlYABIANBgANqEM0IIAMgAykCnAE3AvQGIAMgAygCpAE2AvwGIAcgBCADQegGahDAGyEFIAEtALgBQaIBRw0iIAEgARCFDhCTCQwiCyADQegGaiABEJUKQRgQigEiCUUNBiAJIAMpA/gGNwMQIAkgAykD8AY3AwggCSADKQPoBjcDACABLQC4ASEFQQAhBiABLQC5AQ0EIAVBkH9qDggCBAQEBAQEAQQLIANBADYCsAEgAyADKALwBiIKNgKsASADIAU2AqgBIAEoAnghBQJAAkACQCABLQC4ASIJQbV/aiIMQR9LDQBBASAMdEGBgIKQeHENAQsgCUG0f2pB/wFxQdQASw0BCwJAIAkgBRDjDUUNAEEAIQxBACENQQAhBgwSCyABIAVB/3xxNgJ4IANBgANqIAFBABC6BiABIAU2AnggAygCgAMhBSADLQCUAyIMQQJGDR4gAyADKQKMAzcC9AYgAyADKQKEAzcC7AYgAyADKQCVAzcA/QYgAyADKACcAzYAhAcgAyAMOgD8BiADIAU2AugGIANByAZqIANB6AZqEPIaIAMoAsgGIQUgAy0A3AYiDEECRg0eIAMgAykC1AY3ArQGIAMgAykCzAY3AqwGIAMgAy8A3QY7AL0GIAMgAy0A3wY6AL8GIAMgDDoAvAYgAyAFNgKoBiADQb0GaiEMIANBqAZqQQRyIQ1BACELIAlBlwFHDQogASgCgAFBgMAAcUUNCkEBIQYCQCABLQC4ASIFQX5qDg4MAAAAAAAAAAAAAAAADAALIAEoAnghCQJAAkAgBUG1f2oiBkEfSw0AQQEgBnRBgYCCkHhxDQELIAVBtH9qQf8BcUHUAEsNCwsgBSAJEOMNDQogBUH+AEcNByABEJ4LQf8BcUH+AEYNByABEJ4LQf8BcUEXRw0KIANByAFqIAEQtgggAykDyAEiMEIAUg0IIAMoAtABIQUMFAtBACEMQQAhBkEAIQ1BACELIAlBD0cNEQwUCwJAAkAgBCgCACIFQQtHDQAgA0HoBmogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A+gGIAMgASgCoAE2AvAGIAFBjAFqIQwCQCABKAIIQQpGDQAgAUEIahC8CwsgASAFNgIIIAEgDCkCADcCDCABIAwoAgg2AhQLIAEpA7ABITAgByADKQPoBjcCACAHIAMoAvAGNgIIIAEgMDcDqAEMAQsCQAJAIAQoAgAiBUELRw0AIANB6AZqIAEQxgEMAQsgAUELNgKIASADIAEpApgBNwPoBiADIAEoAqABNgLwBiABQYwBaiEMAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBTYCCCABIAwpAgA3AgwgASAMKAIINgIUCyABKQOwASEwIAcgAykD6AY3AgAgByADKALwBjYCCCABIDA3A6gBCyABIAEoAngiBUH//3txNgJ4IANB6AZqIAEQlQEgASAFNgJ4IAMoAuwGIQUCQCADKALoBiIMQTJHDQAgCRCuEiAJQRhBCBDUFAweCyADIAMpA6AHNwOwAyADIAMpA5gHNwOoAyADIAMpA5AHNwOgAyADIAMpA4gHNwOYAyADIAMpA4AHNwOQAyADIAMpA/gGNwOIAyADIAMpA/AGNwOAAwJAAkAgDEEORw0AQRQQigEiBg0BQQRBFBCgJAALQYjzmgFBKEHIgpsBELchAAsgBiADKQOAAzcCBCAGIAU2AgAgBiADKQOIAzcCDCABLQC4ASEFCwJAAkAgBUH/AXFBBkYNACABKAKsASEPDAELAkACQCAEKAIAIgRBC0cNACADQegGaiABEMYBDAELIAFBCzYCiAEgAyABKQKYATcD6AYgAyABKAKgATYC8AYgAUGMAWohBQJAIAEoAghBCkYNACABQQhqELwLCyABIAQ2AgggASAFKQIANwIMIAEgBSgCCDYCFAsgASABKAK0ASIPNgKsASABIAEoArABNgKoASAHIAMpA+gGNwIAIAcgAygC8AY2AggLQQAhBEEIIQpBACEFQQAhDEEAIQtBACENDBsLAkACQCABLQC4AUEGRg0AIAEoAqwBIQYMAQsCQAJAIAQoAgAiBEELRw0AIANB6AZqIAEQxgEMAQsgAUELNgKIASADIAEpApgBNwPoBiADIAEoAqABNgLwBiABQYwBaiEFAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBDYCCCABIAUpAgA3AgwgASAFKAIINgIUCyABIAEoArQBIgY2AqwBIAEgASgCsAE2AqgBIAcgAykD6AY3AgAgByADKALwBjYCCAtBCSEEQRIhCiAIIQkgBiEIDBoLQQhBGBCgJAALIANB6AZqIAEQ5xAgAygC6AYhBSADLQD8BiILQQJGDQwgAyADKQL0BjcDwAEgAyADKQLsBjcDuAEgAyADLwD9BjsBtAEgAyADLQD/BjoAtgEgA0G0AWohCSADQbgBaiEGDAELQQAhCyADQQA2AugBIAMgAykD0AE3AuABIAMgMEIgiD4C3AEgMKchBSADQdkBaiEJIANB3AFqIQYLIANBqAZqEJocIA0gBikCADcCACANIAYpAgg3AgggDCAJLwAAOwAAIAwgCS0AAjoAAiADIAU2AqgGIAMgCzoAvAZBASELCwJAAkACQCABLQCBAUEgcUUNACABLQC4AUH/AXFBF0YNAQsgA0EgaiADQagGahCNFEEAIQUgAygCICEJAkACQCADKAIkQXtqDgIBAAgLIAkoAABB897VkwdzIAlBBGovAABB48oBc3INBwwCCyAJKAAAQeTKmasGcyAJQQRqLQAAQfIAc3JFDQEMBgtBACEMIANBEGogASAIIANBqAZqQQAgCxD4AUEKQQYgAygCEEEBcRshBCADKAIUIQUMFQsgA0EYaiADQagGahCNFCADKAIYIQkCQAJAAkAgAygCHEF7ag4CAQAGCyAJKAAAQfPe1ZMHcyAJQQRqLwAAQePKAXNyDQVBASEJQQAhDwwBCyAJKAAAQeTKmasGcyAJQQRqLQAAQfIAc3INBEECIQlBASEPCwJAIAEtALgBIgZBfmoODgMAAAAAAAAAAAAAAAADAAsgASgCeCEOAkACQAJAAkAgBkG1f2oiEEEfSw0AQQEgEHRBgYCCkHhxDQELIAZBtH9qQf8BcUHUAEsNAQsgBiAOEOMNIQ4gBkH+AEYNACAORQ0BCyABEJ4LQf8BcUH+AEcNBQsgD0UNASALIQYLIANBqAZqEJocQQAhDEEAIQ0MBQsgA0HoBmogARDnECADKALoBiEFIAMtAPwGIgZBAkYNByADIAMpAvQGNwP4ASADIAMpAuwGNwPwASADIAMvAP0GOwHsASADIAMtAP8GOgDuASADQagGahCaHCANIAMpA/ABNwIAIA0gAykD+AE3AgggDCADLwHsATsAACAMIAMtAO4BOgACIAMgBTYCqAYgAyAGOgC8BiAJIQUMAgsgA0GoBmoQmhxBACEMIAkhBQwCC0GI85oBQShBqIKbARC3IQALAkAgAS0AuAEiCUH+AEYNACAJQQdHDQQgARCyEAsgAykDuAYhMCAKIAMpA7AGIjE3AwggAykDqAYhNCAKQgM3AwAgCiA0NwMQIAogMTcDGCAKIDA3AyBBASEMIANBATYCsAELQQEhDSAFQQFGDQkgBSENIAshBgsgAS0AuAEiCUEPRg0DIA0NByAGIQsLIAlBAkYNA0EAIQ0MCAsgASgCtAEhBCABKAKwASEFIANBhAJqIAkQxiUgA0GPAq1CIIZB/OOaAa2ENwOAAyADQegGakHNlYABIANBgANqEK8QIAMgAykChAI3AvQGIAMgAygCjAI2AvwGIAUgBCADQegGahDAGyEFIAEtALgBQaIBRw0AIAEgARCFDhCTCQsgA0GoBmoQmhwMCQsgBygCACELAkACQCAEKAIAIgVBC0cNACADQegGaiABEMYBDAELIAFBCzYCiAEgAyABKQKYATcD6AYgAyABKAKgATYC8AYgAUGMAWohCQJAIAEoAghBCkYNACABQQhqELwLCyABIAU2AgggASAJKQIANwIMIAEgCSgCCDYCFAsgASkDsAEhMCAHIAMpA+gGNwIAIAcgAygC8AY2AgggASAwNwOoASABLQC4ASIFQfUARw0BAkACQCAEKAIAIgVBC0cNACADQegGaiABEMYBDAELIAFBCzYCiAEgAyABKQKYATcD6AYgAyABKAKgATYC8AYgAUGMAWohCQJAIAEoAghBCkYNACABQQhqELwLCyABIAU2AgggASAJKQIANwIMIAEgCSgCCDYCFAsgASkDsAEhMCAHIAMpA+gGNwIAIAcgAygC8AY2AgggASAwNwOoASABIAEoAngiBUH/fHE2AnggA0GAA2ogAUEAELoGIAEgBTYCeCADKAKAAyEFAkAgAy0AlAMiCUECRg0AIAMgAykCjAM3AvQGIAMgAykChAM3AuwGIAMgAykAlQM3AP0GIAMgAygAnAM2AIQHIAMgCToA/AYgAyAFNgLoBiADQcgGaiADQegGahDyGiADKALIBiEFIAMtANwGIg9BAkcNAwtBCiEEDAkLAkACQCAEKAIAIgVBC0cNACADQegGaiABEMYBDAELIAFBCzYCiAEgAyABKQKYATcD6AYgAyABKAKgATYC8AYgAUGMAWohCQJAIAEoAghBCkYNACABQQhqELwLCyABIAU2AgggASAJKQIANwIMIAEgCSgCCDYCFAsgASkDsAEhMCAHIAMpA+gGNwIAIAcgAygC8AY2AgggASAwNwOoAQJAIAEtALgBIilBA0YNACABQQxqIRMgAUEIaiEPIAFBmAFqIRQgAUGMAWohFUGPAq1CIIYiNEGB9ZoBrYQhMyADQcgGakEVaiEXIANBqAZqQRVqISogA0HIBmpBBHIhGCADQagGakEEciEWIANB6ANqQQRyISggA0G4BWpBFWohICADQbgFakEEciEhIANBgAVqQRVqISwgA0GABWpBBHIhHCADQfAFakEVaiEvIANB8AVqQQRyIS4gA0GAA2pBFGohDSADQdgEakEEciEaIANB6AZqQRRqIRkgA0G4BGpBFWohHSADQbgEakEEciEfIANBqAZqQQxqIQYgA0HoA2pBDGohLSADQdADakEEciEOA0AgASgCsAEhDCADQagGaiABEOsKIAMoArAGIQkCQCADKQOoBiIwQgJSDQAgCSEFDAkLIAMgBigCEDYCyAMgAyAGKQIINwPAAyADIAYpAgA3A7gDAkACQAJAAkACQAJAAkACQAJAAkACQAJAIDBCAVINACAoIAMpA7gDNwIAICggAykDwAM3AgggKCADKALIAzYCECADIAk2AugDIAEtALgBQfUARg0BIAMoAvQDIQQgAygC8AMhBSADQQhqIANB6ANqEIwUIANB0ANqIAMoAgggAygCDBDBCSADIANB0ANqENMeNwOwBiADQfCAgIB4NgKoBiAFIAQgA0GoBmoQwBshBSABLQC4AUGiAUcNEyABEMQUIQQgARCyECABIAQQkwkMEwsgDiADKQO4AzcC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ISUgESAEKQOIATcCACARIAQoApABNgIIIAEgJTcDqAECQAJAIAJBC0cNACAEQYgBaiABEMYBDAELIAZBCzYCACAEIAopAgA3A4gBIAQgCigCCDYCkAECQCAFQQpGDQAgCBC8CwsgCCACNgIAIBMgCSkCADcCACATIAkoAgg2AggLIAEpA7ABISUgESAEKQOIATcCACARIAQoApABNgIIIAEgJTcDqAFBASELCyABLQC4ASEFCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAVB/wFxIgJBBEcNAAJAAkAgBigCACIFQQtHDQAgBEGIAWogARDGAQwBCyAGQQs2AgAgBCAKKQIANwOIASAEIAooAgg2ApABAkAgCCgCAEEKRg0AIAgQvAsLIAggBTYCACATIAkpAgA3AgAgEyAJKAIINgIICyABIAEoArQBNgKsASABIAEoArABIh02AqgBIBEgBCkDiAE3AgAgESAEKAKQATYCCCABIAEoAngiBUHAAHI2AnggBEEYaiABELgDIAQoAhghAiABIAU2AnggBCgCHCESIAJBAXENASAEIBI2AqACIAEtALgBIgVBBUciHg0GIAYoAgAiBUELRw0EIARBiAFqIAEQxgEMBQsgC0EBcyIHIAJBEkdyDQIgBEEgaiABEK0DIAQoAiQhEiAEKAIgQQFxRQ0BC0ECIQUgDA0HIBIhAgweCwJAIAYoAgAiBUELRw0AIARBiAFqIAEQxgEMDAsgBkELNgIAIAQgCikCADcDiAEgBCAKKAIINgKQAQJAIAgoAgBBCkYNACAIELwLCyAIIAU2AgAgEyAJKQIANwIAIBMgCSgCCDYCCAwLC0EAIRIgBEEANgKgAiACRQ0LDA4LIAZBCzYCACAEIAopAgA3A4gBIAQgCigCCDYCkAECQCAIKAIAQQpGDQAgCBC8CwsgCCAFNgIAIBMgCSkCADcCACATIAkoAgg2AggLIAEgASgCtAEiBzYCrAEgASABKAKwATYCqAEgESAEKQOIATcCACARIAQoApABNgIIAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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IAFBCGoQvAsLIAEgAjYCCCABIAMpAgA3AgwgASADKAIINgIUCyABQYgBaiECIAEpA7ABIR4gBiAFKQOwAjcCACAGIAUoArgCNgIIIAEgHjcDqAEgASgCsAEhDSABLQC4ASIIIQMCQCAIQcwARw0AAkACQCACKAIAIgNBC0cNACAFQbACaiABEMYBDAELIAFBCzYCiAEgBSABKQKYATcDsAIgBSABKAKgATYCuAIgAUGMAWohBwJAIAEoAghBCkYNACABQQhqELwLCyABIAM2AgggASAHKQIANwIMIAEgBygCCDYCFAsgASABKAK0ASILNgKsASABIAEoArABNgKoASAGIAUpA7ACNwIAIAYgBSgCuAI2AgggAS0AuAEhAwsCQCADQf8BcQ0AAkACQCACKAIAIgNBC0cNACAFQbACaiABEMYBDAELIAFBCzYCiAEgBSABKQKYATcDsAIgBSABKAKgATYCuAIgAUGMAWohBwJAIAEoAghBCkYNACABQQhqELwLCyABIAM2AgggASAHKQIANwIMIAEgBygCCDYCFAsgASkDsAEhHiAGIAUpA7ACNwIAIAYgBSgCuAI2AgggASAeNwOoASABIAEoAngiB0EwciAHQU9xQRByIAhBzABGGzYCeAJAIAEtALgBIgNBr39qDh0jJSUlJSUlJSUlJSUlJSUlJQAlJSUlJSUlJSUlIyULIAIoAgBBC0YNIAwhCyABKAK0ASEGIAEoArABIQIgBUGYBGogAxDGJSAFQY8CrUIghkGftoEBrYQ3A8gEIAVBsAJqQc2VgAEgBUHIBGoQzQggBSAFKQKYBDcCvAIgBSAFKAKgBDYCxAIgAiAGIAVBsAJqEMAbIQYCQCABLQC4AUGiAUcNACABIAEQhQ4QkwkLIABBEzYCACAAIAY2AgQMKgsCQAJAIAEoAogBIgZBC0cNACAFQbACaiABEMYBDAELIAFBCzYCiAEgBSABKQKYATcDsAIgBSABKAKgATYCuAIgAUGMAWohAgJAIAEoAghBCkYNACABQQhqELwLCyABIAY2AgggASACKQIANwIMIAEgAigCCDYCFAsgASAFKAK4AjYCuAEgASABKAK0ATYCrAEgASABKAKwASIDNgKoASABIAUpA7ACNwKwAUEAIQYCQAJAAkAgAS0AuAEiAkF9ag4EAgEBAgALIAJBowFGDQEL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ACAFNgIAIARB8AJqJAALy3YCKn8HfiMAQbAGayIDJAAgAyABNgKAASADIAIpAgA3AoQBIAMgAigCCDYCjAEgA0GEAWohBAJAAkACQAJAIAEoAngiBUGAgICABnENACABKALEASECIAEoAsABIQUgA0HGgICAeDYC8AQgBSACIANB8ARqEMAbIQIgAS0AyAFBogFHDQEgASABEJ8jEIYUDAELAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAS0AyAEiBkHfAEYNACAGQdgARg0BQbzomgFB+QFBuOmaARDkGwALIAEoAsABIQcCQCABELkOQf8BcUEIRg0AAkAgARC5DkH/AXFFDQACQCABKAJ4IgJBAnENACABIAJBCnI2AngLAkAgAS0AyAEiAkHfAEYNACABKALEASEFIAEoAsABIQYgA0GoAWogAhDXJSADQY8CrUIghkH945oBrYQ3A8gCIANB8ARqQc2VgAEgA0HIAmoQhR8gAyADKQKoATcC/AQgAyADKAKwATYChAUgBiAFIANB8ARqEMAbIQIgAS0AyAFBogFHDTwgASABEJ8jEIYUDDwLIAEQ5RECQCABLQDIAUHAAEYNACADQfAEakEEQQhByAAQgw8gAygC9AQhBSADKALwBA0EQQAhAiADQQA2ArwBIAMgAygC+AQiCDYCuAEgAyAFNgK0AQJAIAEoAnggAS0AyAEiBRDHGEUNACADQfAEaiABEOwQIAMoAvAEIQYgAy0AhAUiAkECRg05IAMgAykC/AQ3AtQCIAMgAykC9AQ3AswCIAMgAy8AhQU7AN0CIAMgAy0AhwU6AN8CIAMgAjoA3AIgAyAGNgLIAiADQd0CaiEJIANByAJqQQRyIQpBACELIAVB/wFxQZcBRw0qIAEoAoABQYDAAHFFDSpBASEMIAEtAMgBIgJBAkYNKyACQQ9GDSsgASgCeCACEMcYRQ0qIAJB/gBHDSggARC5DkH/AXFB/gBGDSggARC5DkH/AXFBF0cNKiADQdABaiABEO0MIAMpA9ABIi1CAFINJyADKALYASEGDDILQQAhDEEAIQ0gBUH/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BmoQ+x8gCyEFDA8LIAMgES8AADsB0AEgAyARLQACOgDSASADLQCMBSEkIAMoAogFISUgAygChAUhJiADKAKABSEnIAMoAvwEISgLIAMgAy8B0AE7AcABIAMgAy0A0gE6AMIBIAMpA6AGIi9CKIinIRogL0IgiKchGSAvpyEbIAEoArwBIQkgKCEYICQhHCAnIRQgJiESICUhHgsgBiEMIAQhBSASIRYgFCEXIAkhBiANIQogDiEJCyADIAMtAMIBOgDyBCADIAMvAcABOwHwBCAarUIohiAZrUL/AYNCIIaEIButhCEvAkAgByADKALoA0cNACADQegDahDAGgsgAygC7AMgEGoiBCAtNwMAIARBPGogHDoAACAEQThqIB42AgAgBEE0aiAWNgIAIARBMGogFzYCACAEQSxqIBg2AgAgBEEoaiALNgIAIARBIGogLjcDACAEQRhqIC83AwAgBEEUaiAMNgIAIARBEGogCTYCACAEQQxqIAo2AgAgBEEIaiAFNgIAIARBPWogAy8B8AQ7AAAgBEE/aiADLQDyBDoAACAEQcgAaiAdOgAAIARBxABqIAY2AgAgBEHAAGogDzYCACADIAdBAWoiBDYC8AMCQAJAIAEtAMgBIgVBfWoOBQMBAQEAAQsgARDlESAQQdAAaiEQIAQhByAMIR8gCSEgIAohISAPISIgBiEjDAELCyABKALEASECIAEoAsABIQYgA0GAA2ogBRDXJSADQY8CrUIghkH845oBrYQ3A4gGIANB8ARqQc2VgAEgA0GIBmoQhR8gAyADKQKAAzcC/AQgAyADKAKIAzYChAUgBiACIANB8ARqEMAbIQUgAS0AyAFBogFHDQggASABEJ8jEIYUDAgLIAdBAWohBwsgARDlESABLQDIAUH+AEYNASAHQdAAbCELQQAhBSADKALsAyEEA0ACQAJAAkACQAJAIAsgBUYNACAEIAVqIgYpAwAiLaciDUF+akECIC1CAVYbDgMCAQMCCyABEKUcGkEAIQxBACELDAkLIAZBFGooAgAhDSAGQRBqKAIAIQwCQCAGQQhqKQMAIi1CA4NCAFINACAtpyIGIAYoAgAiBkEBajYCACAGQX9MDQULIANB7YCAgHg2AvAEIAMgLTcD+AQgASAMIA0gA0HwBGoQ8R0MAgsCQAJAIAZBCGooAgANACAGQRBqKQMA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QCABKAKEAQ0AIANBtAJqIRMgA0G2AmohFCABQX82AoQBIAFBiAFqIhUQ5gogAUGgAWohFiABQawBaiEXIANBsAJqQQFqIRggA0H4AmpBBGohGSADQRBqQQJyIRogAUGQAWohByABQYwBaiEIIAFBsAFqIRsgA0GBA2ohHCADQf4CaiEdIAFBpAFqIR4DQCARIBJGDQIgA0HAAmogESgCACARKAIEEIIdIBFBCGohEQJAA0AgA0HsAWogA0HAAmoQggMgAy0A7AFBBEYNASADIAMtAPQBOgC4AiADIAMpAOwBIjE3A7ACQQAhAgJAAkACQAJAAkAgMaciBEH/AXEOBAQAAQMECyADLwCzAiEFIAMgAy0AsQI6ALMCIAMtALICIQIgAyAFOwCxAiATIQUMAQsgAy8AtQIhBSADIAMtALECOgC1AiADLQCyAiECIAMgBTsAsQIgFCEFCyAFIAI6AAAgBCECDAELQQQhBCAYIQIDQCACLwAAIQUgAiADQbACaiAEakEDaiIGLwAAOwAAIAYgBTsAACACQQJqIQIgBEF+aiIEDQALIAMtALACIQILIAFBADYCtAEgASkCrAEhMSABQoCAgIDAADcCrAEgA0EANgLYASADIDE3A9ABIANBuANqQQEgGCACQQFqQf8BcRCpEgJAAkAgMadFDQAgMUIgiKchAgwBCyADQdABahCfGiADKALUASECCyACIAMpAsADNwIIIAIgAykCuAM3AgBBASECA0AgAyACQX9qIgI2AtgBIAMgAygC1AEgAkEEdGoiAikCCCIxNwMYIAMgAikCADcDEAJAAkACQCADLQAcIglBBU8NAAJAIAlFDQACQCAxpyIfIAcoAgAiAk8NACADLQARISAgAy0AECEhAkACQAJAIAgoAgAgH0EMbCIiaiICKAIIIgYNAEEAISMMAQsgAigCBCEKQQAhIyAGIQQDQCAEICNqQQF2IgIgBk8NAiACQQFqICMgIUH/AXEgCiACQQN0ai0ABUsiBRsiIyAEIAIgBRsiBEkNAAsLIAlBf2ohJAJAICMgBkcNACAVIANB0AFqIBogJBDSEiECIAgoAgAgBygCACAfICEgICACELwSDAULA0ACQAJAAkACQAJAAkAgIyAIKAIAICJqIgIoAggiBE8NACACKAIEICNBA3RqIgIoAgAhJQJAAkAgIEH/AXEi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ASACKAIEICNBA3RqIgIgIDoABSACICE6AAQgAiAlNgIADAMLIB8gAkGc4YQBEPUWAAsgIyAEQajghAEQ9RYACwJAAkAgHyAHKAIAIgJPDQAgLCAnRw0BICMgCCgCACAiaiIEKAIITw0BICBB/wFxIAQoAgQgI0EDdGoiBC0ABEkNASAELQAFQf8BcSAhQf8BcU8NBgwBCyAfIAJBuOCEARD1FgALIBUgA0HQAWogGiAkENISIQICQCArQQFxDQAgCCgCACAHKAIAICMgHyAhICAgAhC2DgwBCwJAAkAgHyAHKAIAIgRPDQAgIyAIKAIAICJqIgQoAggiBU8NASAEKAIEICNBA3RqIgQgIDoABSAEICE6AAQgBCACNgIADAILIB8gBEGc4YQBEPUWAAsgIyAFQajghAEQ9RYACyAjQQFqISNBACErIC1BA2oiLSAqRw0ADAkLCwJAICQNAEEBIScMCAsgA0G4A2ogJSAaICQQqRICQCADKALYASICIAMoAtABRw0AIANB0AFqEJ8aCyADKALUASACQQR0aiIEIAMpArgDNwIAIAQgAykCwAM3AghBASEnIAMgAkEBaiICNgLYAQwICyAVIANB0AFqIBogJBDSEiECIAgoAgAgBygCACAjIB8gISAgIAIQtg4gBygCACECCyAfIAJJDQALIB8gAkG44IQBEPUWAAsgAiAGQejXhAEQ9RYACyAfIAJBuOCEARD1FgALQdjghAFBJEH84IQBELchAAtBACAJQQRBoOiEARCPCgALIAMoAtgBIQILIAINAAsgASgCrAEgGygCAEEEQRAQ0RMgFyADKALYATYCCCAXIAMpA9ABNwIADAALCyADKALAAiADKALEAkEEQQgQ0RMMAAsLQczwhAEQgR4ACwJAAkAgASgCIA0AIAFBfzYCIAJAIAEoAmANACABQX82AmAgA0G4A2ogAUEkaiABQeQAahClCCADIAMpArwDNwP4AiADIAMoAsQDNgKAAwJAIAMoArgDIgJBKkYNACAAQRBqIANBuANqQRBqQTD8CgAAIAAgAygCgAM2AgwgACADKQP4AjcCBCAAIAI2AgAMAwsgAyADKQP4AjcDECADIAMoAoADNgIYAkAgASgCuAENACABQQA2AsQBIAFBfzYCuAECQCABKALIAQ0AIAFBvAFqIQ8gAUEANgLUASABQX82AsgBAkAgASgCvAENACAPEJEaCyABQcwBaiENIAEoAsABQgE3AgAgAUGQAWoiDCgCACEGIAFBjAFqIQhBASECAkADQCABIAJBf2oiAjYCxAECQAJAIAEoAsABIAJBA3RqIgIoAgAiBSAGTw0AIAIoAgQiAiAIKAIAIAVBDGxqIgQoAghPDQEDQCAEKAIEIAJBA3RqIgQtAAUhCiAELQAEIQkCQCABKALUASIGIAEoAswBRw0AIA0QoRoLIAEoAtABIAZBAXRqIgcgCjoAASAHIAk6AAAgASAGQQFqIgY2AtQBAkACQCAEKAIARQ0AAkAgASgCxAEiBiABKAK8AUcNACAPEJEaCyABKALAASAGQQN0aiIKIAJBAWo2AgQgCiAFNgIAIAEgBkEBajYCxAEgBCgCACEFQQAhAgwBCyADQbgDaiADQRBqIAEoAtABIAYQkQcCQCADKAK4AyIEQSpGDQAgA0H4AmogA0G4A2pBBHJBPPwKAAAMBgsCQCABKALUASIERQ0AIAEgBEF/ajYC1AELIAJBAWohAgsgBSAMKAIAIgZPDQEgAiAIKAIAIAVBDGxqIgQoAghPDQIMAAsLIAUgBkG44IQBEPUWAAsCQCABKALUASICRQ0AIAEgAkF/ajYC1AELIAEoAsQBIgINAAtBKiEECyABIAEoAsgBQQFqNgLIASABIAEoArgBQQFqNgK4AQJAIARBKkYNACAAQQRqIANB+AJqQTz8CgAAIAAgBDYCAAwFCyAAIANBEGoQ1wogASABKAJgQQFqNgJgIAEgASgCIEEBajYCICABIAEoAoQBQQFqNgKEAQwLC0Hc0IQBEIEeAAtBzNCEARCBHgALQezwhAEQgR4AC0Hc8IQBEIEeAAsgASABKAJgQQFqNgJgIAEgASgCIEEBajYCICABIAEoAoQBQQFqNgKEAQwGCwJAAkACQCABKALYAQ0AIAFBfzYC2AEgAUHcAWohAiABKALkAUUNASABIAEvAewBQQFqIgQ7AewBIARB//8DcSAERg0CIANBADYCwAMgA0IANwO4AyADQQA7AcQDIANB+AJqIANBuANqIAEoAugBEOULIAEoAtwBIAFB4AFqKAIAQQRBEBDREyACIAMoAoADNgIIIAIgAykC+AI3AgAMAgtBvPGEARCBHgALIANBADYCwAMgA0IANwO4AyADQQA7AcQDIANB+AJqIANBuANqIAEoAugBEOULIAEoAtwBIAFB4AFqKAIAQQRBEBDREyACIAMoAoADNgIIIAIgAykC+AI3AgALIANBuANqIAEQhhcgAygCvAMhDAJAAkAgAygCuAMiAkEqRg0AIABBCGogA0G4A2pBCGpBOPwKAAAgACAMNgIEIAAgAjYCAAwBCyADQbgDaiABELkYIAMoArwDIQ0CQCADKAK4AyICQSpGDQAgAEEIaiADQbgDakEIakE4/AoAACAAIA02AgQgACACNgIADAELIANBEGpBAWohDwJAAkADQCARIBJGDQIgA0H4AmogESgCACARKAIEEIIdIBFBCGohEQNAIANBwAJqIANB+AJqEIIDAkACQAJAAkACQCADLQDAAkEERg0AIAMgAy0AyAI6ABggAyADKQDAAiIxNwMQIA8gMadBAXRB/gFxaiEIIA0hBCAPIQIDQCABKALkASIFRQ0CIAUgBK0iMUKlxoihyJyn+UuFQrODgICAIH4gAi0AACIKrUL/AYMiM4VCs4OAgIAgfiACQQFqLQAAIgmtQv8BgyIyhUKzg4CAgCB+IAWtgqciBk0NAwJAAkAgASgC4AEgBkEEdCIHaiIFLwEMIAEvAewBRw0AIApB/wFxIAUtAARHDQAgCUH/AXEgBS0ABUcNACAEIAUoAgBHDQAgBSgCCCEEDAELIANBuANqIAEgCiAJEMYOIAMoAsADIQogAygCvAMhBQJAIAMoArgDIglBKkYNACAAQQxqIANBuANqQQxqQTT8CgAAIAAgCjYCCCAAIAU2AgQgACAJNgIADAoLIANBuANqIAEgCiAEELYKAkAgAygCuAMiBEEqRg0AIABBBGogA0G4A2pBBHJBPPwKAAAgACAENgIADAoLIAEoAuQBIgQgBk0NBSABKALgASAHaiIEIAEvAewBOwEMIAQgBTYCCCAEIDNCIIYgMkIohoQgMYQ3AgAgBSEECyACIAhGIQUgAkECaiECIAUNBQwACwsgAygC+AIgAygC/AJBBEEIENETDAULQfCFhQEQvCMACyAGIAVB0IWFARD1FgALIAYgBEHghYUBEPUWAAsgA0G4A2ogASAMIAQQtgogAygCuAMiAkEqRg0ACwsgAEEEaiADQbgDakEEckE8/AoAACAAIAI2AgALIAMoAvgCIAMoAvwCQQRBCBDREwwBCyAAIA02AgggACAMNgIEIABBKjYCAAsgASABKALYAUEBajYC2AEMBQsgASABKAJgQQFqNgJgIAEgASgCIEEBajYCIAwECyADQbgDaiABELkYIAMoArwDIQkCQCADKAK4AyIEQSpGDQAgAEEIaiADQbgDakEIakE4/AoAACAAIAk2AgQgACAENgIADAQLQQAhBSADQbgDaiACKAIQIgZBAEEEQQgQwA8gAygCvAMhBAJAIAMoArgDQQFGDQAgA0EANgLAASADIAMoAsADIgo2ArwBIAMgBDYCuAEgBkEBdCEEIAmtITIgAigCDCECQQAhBgJAA0AgBEUNASACMQABITEgAjEAACEzAkAgBiADKAK4AUcNACADQbgBahCRGiADKAK8ASEKCyACQQJqIQIgCiAFaiAzQiCGIDKEIDFCKIaENwIAIAMgBkEBaiIGNgLAASAEQX5qIQQgBUEIaiEFDAALCyADQbgDaiABIANBuAFqEK8VIAMoArwDIQICQCADKAK4AyIEQSpGDQAgAEEIaiADQbgDakEIakE4/AoAACAAIAI2AgQgACAENgIADAULIAAgCTYCCCAAIAI2AgQgAEEqNgIADAQLIAQgAygCwAMQ/CAACyAAIAU2AgggACAHNgIEIABBKjYCAAwCCwJAAkACQAJAIAEoAiANACABQX82AiAgA0IANwL4AiADQbgDaiABQSRqIgwgA0H4AmoQsQ0gAygCvAMhCAJAIAMoArgDIgJBKkYNACAAQQhqIANBuANqQQhqQTj8CgAAIAAgCDYCBCAAIAI2AgAgAygCyAIhBCADKALEAiEKDAQLIANBADYC9AEgA0KAgICAwAA3AuwBAkAgAygCyAIiBEUNACADQfgBaiADKALEAiIKEJAOIANBEGpBBGohDSADQfgBakEYaiEHIANB+AFqQQRqIQ4gCK0hMyADQYQCaiEJQQQhEEEAIQ8DQAJAIAMoAqgCIgIgAygCrAJGDQAgAyACQQhqNgKoAgJAIAIoAgAiBSAETw0AIAIxAAQhMSADKAKEAiEGIAMoAowCIQICQCAKIAVBGGxqIgUoAghFDQACQCACIAZHDQAgCRCRGgsgAygCiAIgAkEDdGogMUIohiAxQiCGhDcCACADIAJBAWo2AowCAkAgDyADKALsAUcNACADQewBahCiGiADKALwASEQCyAQIA9BOGxq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kR8gAigCjAUgAigCkAUiA2oiAUEAKQCYxZcBNwAAIAFBACkAoMWXATcACCABQQAoAKfFlwE2AA8gAiADQRNqNgKQBSACQfABaiACQdgEahD1ByACQYwDaiACQfABahDHAiACQfABahCuFSACQfIANgL0ASACIAJBjANqNgLwAQJAIAJBiAVqQZTPhAFBzZWAASACQfABahDLBg0AIAJB9AA2AvQBIAIgDjYC8AEgAkGIBWpBlM+EAUHxkYABIAJB8AFqEMsGDQAgAigCjAMgAigCkANBAUEBENcTDAcLIAIoAowDIAIoApADQQFBARDXEwwECyACQoCAgIAQNwLwASACQQA2AvgBIAJB8AFqQf4AQc8AEN8RIAIgAigC+AE2AjggAiACKQLwATcDMCACQYgFakETEJEfIAIoAowFIAIoApAFIgNqIgFBACkAmMWXATcAACABQQApAKDFlwE3AAggAUEAKACnxZcBNgAPIAIgA0ETajYCkAUgAkHyADYC9AEgAiACQTBqNgLwASACQYgFakGUz4QBQZy2gQEgAkHwAWoQywZFDQEMAgsgAkKAgICAEDcC8AEgAkEANgL4ASACQfABakESEJEfIA8gAikC8AE3AgAgAigC9AEgAigC+AEiA2oiAUEAKQCsloUBNwAAIAFBACkAtJaFATcACCABQQAvALyWhQE7ABAgDyADQRJqNgIIDAwLIAJBzAFqIAJBqARqEMcCIAJB8gA2AvQBIAIgAkHMAWo2AvABAkAgAkGIBWpBlM+EAUHNlYABIAJB8AFqEMsGDQAgAkHyADYC9AEgAiACQTBqNgLwASACQYgFakGUz4QBQZy2gQEgAkHwAWoQywYNAAJAIAIoArwEIgNFDQBBACEEIAJBADYC8AIgAkKAgICAwAA3AugCIAIoArgEIglBEGohASAJQRRqIQkgA0EYbCEKQQQhDUEAIQMDQCACIAkoAgBBf2o2AvwEIAJBBzYCjAIgAkEHNgKEAiACQQc2AvwBIAJBBzYC9AEgAiABNgKAAiACIAFBeGo2AvgBIAIgAUF0ajYC8AEgAiACQfwEajYCiAIgAkGMA2pB37GBASACQfABahDNCAJAIAMgAigC6AJHDQAgAkHoAmoQnBogAigC7AIhDQsgDSAEaiILIAIoApQDNgIIIAsgAikCjAM3AgAgAiADQQFqIgM2AvACIAFBGGohASAJQRhqIQkgBEEMaiEEIApBaGoiCg0ACyACQfABaiACKALsAiADQfLxmgFBARC8BiACQfIANgKQAyACIAJB8AFqNgKMAyACQYgFakGUz4QBQZy2gQEgAkGMA2oQywYhASACKALwASACKAL0AUEBQQEQ1xMgAkHoAmoQlhggAQ0BCyACQfQANgL0ASACIA42AvABIAJBiAVqQZTPhAFB8ZGAASACQfABahDLBkUNAwsgAigCzAEgAigC0AFBAUEBENcTCyACKAIwIAIoAjRBAUEBENcTCyACQagEahCuFQwFCyACKALMASACKALQAUEBQQEQ1xMgAigCMCACKAI0QQFBARDXEwsgAkGoBGoQrhUMBgsgAkHMAWogAkGoBGoQxwIgAkHyADYC9AEgAiACQcwBajYC8AECQCACQYgFakGUz4QBQc2VgAEgAkHwAWoQywYNACACQfIANgL0ASACIAJBMGo2AvABIAJBiAVqQZTPhAFBnLaBASACQfABahDLBg0AAkAgAigCvAQiA0UNAEEAIQQgAkEANgLwAiACQoCAgIDAADcC6AIgAigCuAQiCUEQaiEBIAlBFGohCSADQRhsIQpBBCENQQAhAwNAIAIgCSgCAEF/ajYC/AQgAkEHNgKMAiACQQc2AoQCIAJBBzYC/AEgAkEHNgL0ASACIAE2AoACIAIgAUF4ajYC+AEgAiABQXRqNgLwASACIAJB/ARqNgKIAiACQYwDakHfsYEBIAJB8AFqEM0IAkAgAyACKALoAkcNACACQegCahCcGiACKALsAiENCyANIARqIgsgAigClAM2AgggCyACKQKMAzcCACACIANBAWoiAzYC8AIgAUEYaiEBIAlBGGohCSAEQQxqIQQgCkFoaiIKDQALIAJB8AFqIAIoAuwCIANB8vGaAUEBELwGIAJB8gA2ApADIAIgAkHwAWo2AowDIAJBiAVqQZTPhAFBnLaBASACQYwDahDLBiEBIAIoAvABIAIoAvQBQQFBARDXEyACQegCahCWGCABDQELIAJB8wA2AvQBIAIgDjYC8AEgAkGIBWpBlM+EAUHxkYABIAJB8AFqEMsGRQ0ECyACKALMASACKALQAUEBQQEQ1xMLIAIoAjAgAigCNEEBQQEQ1xMLIAJBqARqEK4VC0GBlZsBQTcgAkHvBWpBrM+EAUG4lZsBENUUAAsgAigCzAEgAigC0AFBAUEBENcTIAIoAjAgAigCNEEBQQEQ1xMLIAJBqARqEK4VCyAPIAIoApAFNgIIIA8gAikCiAU3AgALAkACQCACKAKwA0UNAAJAQQAgAigCuAMiAUFeaiIDIAMgAUsbDgIBAAILIAIoAsADQYSAgIB4SA0BIAJBwANqEN0jDAELIAwQgCELIABBADYCAAsgAkHYAGoQkhsgAkHwBWokAA8LIAIgCzYCnAMgAiAMNgKYAyACIAQ2ApQDIAIgCjYCkAMgAiADNgKMAwwDC0GDgICAeCEDIAJBg4CAgHg2ArQDCyACKALEAyEKIAIoAsADIQwgAigCvAMhDSACKAK4AyEPIAJBmAVqIAFBJPwKAAACQAJAAkACQAJAAkACQCADQYKAgIB4SQ0AAkACQAJAAkAgA0H+////B2oOBQABAgMEAAtBIBCKASILRQ0FIAsgCjYCDCALIAw2AgggCyANNgIEIAsgDzYCACALIAIpA5gFNwIQIAsgAikDoAU3AhhBAiEDDAQLQRwQigEiC0UNBSALIAo2AgwgCyAMNgIIIAsgDTYCBCALIA82AgAgCyACKQOYBTcCECALIAIoAqAFNgIYQQQhAwwDC0EYEIoBIgtFDQUgCyAKNgIMIAsgDDYCCCALIA02AgQgCyAPNgIAIAsgAikDmAU3AhBBAyEDDAILQRwQigEiC0UNBSALIAo2AgwgCyAMNgIIIAsgDTYCBCALIA82AgAgCyACKQOYBTcCECALIAIoAqAFNgIYQQYhAwwBC0E4EIoBIgtFDQUgCyAKNgIQIAsgDDYCDCALIA02AgggCyAPNgIEIAsgAzYCACALQRRqIAJBmAVqQST8CgAAQQUhAwsCQCAEIAIoAowDRw0AIAJBjANqEJcaCyACKAKQAyIKIARBA3RqIgwgCzYCBCAMIAM2AgAMBQtBBEEgEKAkAAtBBEEcEKAkAAtBBEEYEKAkAAtBBEEcEKAkAAtBBEE4EKAkAAsgAiAEQQFqIgQ2ApQDDAALCwALi14CJH8FfiMAQeACayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIAIgNBdGpBByADQQtLGw4mBAABAgMGBwgJCgsMDQ4PEBESExQVFhcYQxkaG01MS0pJSEdGRUQECyABKAIIIQQgASgCFCEFIAEoAhAhBiACQcABaiABKAIMIgdBBEEQEIMPIAIoAsQBIQggAigCwAFBAUYNQSACKALIASEJAkAgCEUNACAHQQR0IQogCSEDIAghCwNAIApFDQFBAiEMAkAgBCgCAEECRg0AQcAAEIoBIgFFDUMgAkHAAWogBEEMaigCABBOIAEgAikD+AE3AzggASACKQPwATcDMCABIAIpA+gBNwMoIAEgAikD4AE3AyAgASACKQPYATcDGCABIAIpA9ABNwMQIAEgAikDyAE3AwggASACKQPAATcDACAEQQRqKQIAISYgBCgCACEMCyAEQRBqIQQgAyAMNgIAIANBDGogATYCACADQQRqICY3AgAgA0EQaiEDIApBcGohCiALQX9qIgsNAAsLIAAgBTYCFCAAIAY2AhAgACAHNgIMIAAgCTYCCCAAIAg2AgQgAEENNgIADFALIAEoAgghBCABKAIUIQ0gASgCECEOIAJBwAFqIAEoAgwiBUEEQQwQgw8gAigCxAEhCSACKALAAUEBRg0+IAIoAsgBIQYCQCAJRQ0AIAVBDGwhCiAGIQMgCSELA0AgCkUNAQJAAkAgBCgCACIHDQBB8AAQigEiDEUNQSACQcABaiAEQQRqKAIAENoCIAwgAkHAAWpB8AD8CgAAQQAhAQwBCyAEQQhqKAIAIQggBEEEaigCACEMQcAAEIoBIgFFDT8gAkHAAWogBxBOIAEgAikD+AE3AzggASACKQPwATcDMCABIAIpA+gBNwMoIAEgAikD4AE3AyAgASACKQPYATcDGCABIAIpA9ABNwMQIAEgAikDyAE3AwggASACKQPAATcDAAsgBEEMaiEEIAMgATYCACADQQhqIAg2AgAgA0EEaiAMNgIAIANBDGohAyAKQXRqIQogC0F/aiILDQALCyAAIA02AhQgACAONgIQIAAgBTYCDCAAIAY2AgggACAJNgIEIABBDjYCAAxPCwJAAkAgAS0AHCIEQQJHDQAMAQsgASgCGCELIAEoAhQhDCABKAIQIQogASkDCCImQgODQgBSDQAgJqciAyADKAIAIgNBAWo2AgAgA0F/TA1OC0HIABCKASIDRQ06IAMgASgCIBCJAyAAIAM2AiAgACAEOgAcIAAgCzYCGCAAIAw2AhQgACAKNgIQIAAgJjcDCCAAQQ82AgAMTgsgAS0AECEEIAEoAgwhCiABKAIIIQxBwAAQigEiAw0BQQhBwAAQoCQACyAAIAEpAzg3AzggACABKQMwNwMwIAAgASkDKDcDKCAAIAEpAyA3AyAgACABKQMYNwMYIAAgASkDEDcDECAAIAEpAwg3AwggACABKQMANwMADEwLIAMgASgCBBBOIAAgBDoAECAAIAo2AgwgACAMNgIIIAAgAzYCBCAAQRA2AgAMSwsgAS0AESEEIAEtABAhCiABKAIIIQwgASgCBCELQcAAEIoBIgNFDTUgAyABKAIMEE4gACAEOgARIAAgCjoAECAAIAM2AgwgACAMNgIIIAAgCzYCBCAAQRE2AgAMSgsgAS0AFCEKIAEoAhAhDCABKAIMIQtBwAAQigEiA0UNMyADIAEoAgQQTkHAABCKASIERQ0yIAQgASgCCBBOIAAgCjoAFCAAIAw2AhAgACALNgIMIAAgBDYCCCAAIAM2AgQgAEESNgIADEkLIAEtADwhCiABKAI0IQwgASgCMCELAkACQCADQQtHDQAgAUEIaiEIAkACQAJAAkACQAJAIAEoAgQiDw4DAAECAAsgASgCGCEFIAEoAhQhBCACQcABaiAIEOYJIAEtACAhBiABKAIcDQJBACENDAMLIAJBwAFqIAgQwg0gAikCyAEiJkIgiKchBCACKALYASEGIAIoAtQBIQ0gAigC0AEhBSACKALEASEOIAIoAsABIRAgJqchEQwDCyABKQMQIiZCIIinIQQgASgCICEGIAEoAhwhDSABKAIYIQUgASgCDCEOIAEoAgghECAmpyERDAILIAFBHGoQtxUhDQsgAigCyAEhESACKALEASEOIAIoAsABIRALIAStQiCGISYMAQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAw4LAAEKAgMEBQYHCAkACyACQcABaiABQQhqEOoMIAIpA8gBIidCgICAgHCDISYgJ6ciEUGAfnEhBCACKALcASEIIAIoAtgBIQYgAigC1AEhDSACKALQASEFIAIoAsQB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ASgCBBBOAkACQCABKAIYDQBBACERDAELIAFBGGoQsQshEQtBIBCKASILRQ0YIAEoAggiCCgCBCEDIAgoAhwhDyAIKAIYIRIgAkHAAWogCCgCCCIFQQRBBBCDDyACKALEASEHIAIoAsABQQFGDRcgAigCyAEhBgJAIAdFDQAgBUECdCEEIAYhCiAHIQwDQCAERQ0BQcAAEIoBIgFFDRggAkHAAWogAygCABBOIAEgAikD+AE3AzggASACKQPwATcDMCABIAIpA+gBNwMoIAEgAikD4AE3AyAgASACKQPYATcDGCABIAIpA9ABNwMQIAEgAikDyAE3AwggASACKQPAATcDACAKIAE2AgAgBEF8aiEEIApBBGohCiADQQRqIQMgDEF/aiIMDQALCyALQQxqIAhBEGooAgAgCEEUaigCABDlCSALIA82AhwgCyASNgIYIAsgBTYCCCALIAY2AgQgCyAHNgIAIAAgETYCGCAAIA02AhQgACAONgIQIAAgEDYCDCAAIAs2AgggACAJNgIEIABBHTYCAAw+CyABKAIIIQQgASgCHCEQIAEoAhghESABKAIUIQ8gAkHAAWogASgCDCIGQQhBKBCDDyACKALEASEJIAIoAsABQQFGDRQgAigCyAEhDQJAIAlFDQAgBkEobCEKIA0hAyAJIQwDQCAKRQ0BIAJBwAFqIAQQjAMgAyACKQPgATcDICADIAIpA9gBNwMYIAMgAikD0AE3AxAgAyACKQPIATcDCCADIAIpA8ABNwMAIANBKGohAyAKQVhqIQogBEEoaiEEIAxBf2oiDA0ACwtBGBCKASIMRQ0TAkACQCABKAIQIgMoAgBBgICAgHhHDQBBwAAQigEiC0UNFCALIAMoAgQQTkGAgICAeCEFDAELIAMoAgQhCCADKAIUIRMgAygCECEUIAMoAgwhEiACQcABaiADKAIIIg5BCEEwEIMPIAIoAsQBIQUgAigCwAFBAUYNEiACKALIASELAkAgBQ0AQQAhBQwBCyAOQTBsIQdBACEEIAUhCgNAIAcgBEYNASACQcABaiAIIARqEI4BIAsgBGoiAyACKQPoATcDKCADIAIpA+ABNwMgIAMgAikD2AE3AxggAyACKQPQATcDECADIAIpA8gBNwMIIAMgAikDwAE3AwAgBEEwaiEEIApBf2oiCg0ACwsgDCATNgIUIAwg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igEiA0UNASACQcABaiABQQRqKAIAEE4gAyACKQP4ATcDOCADIAIpA/ABNwMwIAMgAikD6AE3AyggAyACKQPgATcDICADIAIpA9gBNwMYIAMgAikD0AE3AxAgAyACKQPIATcDCCADIAIpA8ABNwMAQQUhCAwGCyABQSxqKAIAIQkgAUEoaigCACEFAkACQCABQTBqKQMAIiZQDQAgAUE8aigCACEeIAFBOGooAgAhFSABQdQAaigCACENIAFB0ABqKAIAIQYCQCAmQgODQgBSDQAgJqciAyADKAIAIgNBAWo2AgAgA0F/TA1DCyABQcwAaigCACEOIAFByABqKAIAIRAgAUHAAGopAwAiJ6chFAJAICdCA4NCAFINACAUIBQoAgAiA0EBajYCACADQX9MDUMLICdCIIinIR8MAQsgAUHEAGooAgAhHyABQcAAaigCACEUIAFBOGopAwAiJqchFQJAICZCA4NCAFINACAVIBUoAgAiA0EBajYCACADQX9MDUILICZCIIinIR5CACEmCwJAIAEoAgAiCEEERw0AICAhAyAhIQwgIiELDAULAkACQAJAAkACQCAIDgQABAECAAsgAUEMaigCACELIAFBCGoiAygCACEMIAFBFGooAgAhDyABQRBqKAIAIRICQCADKQMAIidCA4NCAFINACAnpyIDIAMoAgAiA0EBajYCACADQX9MDUULIAFBGGopAwAiKFBFDQJCACEoICMhAwwHC0GgARCKASIDRQ0EIAJBwAFqIAFBBGooAgAQ/QEgAyACQcABakGgAfwKAAAgJCEMICUhCwwGCyABQRhqKQIAISggAUEUaigCACEPIAFBEGooAgAhEiACQcABaiABQQhqKAIAIAFBDGooAgAQ/wQgAUEgaikCACEpIAIoAsgBIQsgAigCxAEhDCACKALAASEDDAULAkAgKEIDg0IAUQ0AICMhAwwFCyAopyIBIAEoAgAiAUEBajYCACAjIQMgAUF/TA1BDAQLIAFBFGooAgAhDyABQRBqKAIAIRIgAUEEaigCAA0CIAFBDGooAgAhCyABQQhqKAIAIQxBACEDDAMLQQhBwAAQoCQAC0EIQaABEKAkAAtBwAAQigEiDEUNBSACQcABaiABQQhqKAIAEE4gDCACKQP4ATcDOCAMIAIpA/ABNwMwIAwgAikD6AE3AyggDCACKQPg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BDYC+AQgAiACKQKcBDcD8AQCQAJAAkACQCABLQCBAUEgcUUNACACQdgCaiABEO4MIAItANgCDQYgAi0A2QIhISACQdgCaiABQfKCmwFBAUEAEJMHIAItANgCQQFGDQYgAi0A2QIhAyACQdgCaiABQaD/mgFBAUEAEJMHIAItANgCQQFGDQYgAi0A2QIhJgJAICFB/wFxQQNHDQAgA0GkAUcNACAmQaQBRg0BCyACQdgCaiABELIDIAIoAtwCITIgAigC2AIiMUEHRw0BIDIhMwwICyACQdgCaiABELIDIAIoAtwCITMgAigC2AIiJkEHRg0HIAIgCykAADcD4AQgAiALKAAHNgDnBCACIAIpApwENwPQBCACIAIoAqQENgLYBCACLQD0AiExIAIoAvACITIgAikD6AIhPyACKALkAiE0IAIoAuACITUgASgCvAEhNiA3ISEMAQsgAiALKQAANwOgBSACIAsoAAc2AKcFIAItAPQCITggAigC8AIhOSACKALsAiE0IAIpAuQCIUAgAigC4AIhNgJAAkACQCAxDgUABAQEAQQLIAIgAigApwU2AJcFIAIgAikDoAU3A5AFIDStQiCGIEBCIIiEIT8gQKchNCA2ITUgOSEyIDghMQwBC0ECITEgMiE1IDYhNCBAIT8LIANBpAFHITogJkGkAUchOyACIAIpApwENwPQBCACIAIoAqQENgLYBCACIAIpA5AFNwPgBCACIAIoAJcFNgDnBCABKAK8ASE2QQchJgsgAiACKQPgBDcDgAUgAiACKADnBDYAhwUgAiACKQPQBDcD0AMgAiACKALYBDYC2AMCQCAtIAIoApAERw0AIAJBkARqELoaIAIoApQEISkLICkgIGoiAyAmNgIAIANBHGogMToAACADQRhqIDI2AgAgA0EQaiA/NwMAIANBDGogNDYCACADQQhqIDU2AgAgA0EEaiAzNgIAIANBHWogAikDgAU3AAAgA0EkaiACKACHBTYAACADQSxqIDY2AgAgA0EoaiAqNgIAIANBMGogAikD0AM3AwAgA0E4aiACKALYAzYCACADQT5qICE6AAAgA0E9aiA7OgAAIANBPGogOjoAACACIC1BAWo2ApgEICoaICEhNwwCCyALIAIpA6AFNwAAIAsgAigApwU2AAcgAiA4OgD0AiACIDk2AvACIAIgNDYC7AIgAiBANwLkAiACIDY2AuACIAIgMjYC3AIgAiAxNgLYAiACQSBqIAJB2AJqEMkNIAIoAiQhAyACKAIgIRwgAkHcgICAeDYCqAQgHCADIAJBqARqEMAbITMCQCABLQDIAUGiAUcNACABIAEQnyMQhhQLIAJB2AJqEMEVDAQLIAEoAsABISwgARDlESABKAK8ASEmIAJB2AJqIAFBABDBASACKALcAiEhAkAgAigC2AIiA0EHRg0AIAcgBikDGDcDGCAHIAYpAxA3AxAgByAGKQMINwMIIAcgBikDADcDACACICE2AqwEIAIgAzYCqARBACEhAkACQCABLQCBAUEgcUUNACABLQDIAUH/AXFBCUcNACACQRhqIAFBASABKALAARDXECACKAIcISEgAigCGEEBcQ0BCyABKAK8ASEuQQhBKBDoICIxIAJBqARqQSj8CgAAIAEoArwBITICQCAtIAIoApAERw0AIAJBkARqELoaCyACKAKUBCIpICBqIgNBAjYCACADQSxqIDI2AgAgA0EoaiAqNgIAIANBGGogITYCACADQRRqICY2AgAgA0EQaiAsNgIAIANBDGogLjYCACADQQhqICw2AgAgA0EEaiAxNgIAIANBMGogAikCnAQ3AgAgA0E4aiACKAKkBDYCACACIC1BAWo2ApgEDAILIAJBqARqEMEVCyACQZwEahCgIQwECwJAIAEtAMgBIgNBAUYNAAJAIANBB0YNACABKALEASEcIAEoAsABIR0gAkGwA2ogAxDXJSACID43A6gEIAJB2AJqQc2VgAEgAkGoBGoQhR8gCiACKAK4AzYCCCAKIAIpArADNwIAIB0gHCACQdgCahDAGyEhIAEtAMgBQaIBRw0FIAEgARCfIxCGFAwFCyABEOURIC9BHEcNACABLQDIAUH/AXFBAUcNACABKAK8ASEDIAEoArgBISEgAkG6gICAeDYC2AIgASAhIAMgAkHYAmoQ8R0LICBBwABqISAgLUEBaiEtDAELCyACKALcAiEzCyACQfAEahCgISAzISELIAJBkARqEK0hCyACICE2AlwgAkENNgJYAkAgAigCuAJBBUcNACACQbgCahDIIAwHCyACQbgCahCFGgwGCwJAIAEtAMgBQRJHDQAgASgCxAEhLSABKALAASEgIAJB9YCAgHg2AtgCIAEgICAtIAJB2AJqEPEd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KCAiIR5BACEvDAcLIAEoAqwBITAgASgCqAEhMUEAIR9BACEvQQAhKCAiIR4CQAJAAkACQCAyQY1/ag4iAwgICAgICAgICAgICAgICAgICAgICAgICAIICAgIAQgIAAgLQQEhHkEAIS9BACEfQQAhKAwHC0EBIS9BACEoDAULAkAgJw0AQQEhHyABLQB6QcAAcQ0EIAJBtIGAgHg2AtACIAEgMSAwIAJB0AJqEOodDAQLEMUbITcgAkLxyJWbxq2YueUANwPgAiACIDc3A9gCIAJBoIGAgHg2AtACIAEgMSAwIAJB0AJqEOodQQAhL0EBIR9BACEoDAQLQQEhKEEAIS9BACEfDAMLAkAgLkEXSw0AQQEgLnRByICABHENAQsgAiAgNgLsASACIB82AugBIAIgHjYC5AFBACEyQQEhLkEAIR8MBgsgAiArNgLkAiACICg2AuACIAJC4ebRi8au2jE3A9gCIAJBADYC0AICQCAuQQpGICFBAEdxIiFBAUcNACABELIQCyACICA2AuADIAIgHzYC3AMgAiAeNgLYAyACQThqIAEgHSACQdgDaiAjIAJB0AJqQQAgAkHYAWogIUEAICdBAEEAENEBDAkLQQAhL0EAISgLICIhHgsCQCABLQCBAUEgcQ0AIC8hMyAwISAgMSEhDAILIDEhISAwISAgLyEzA0AgAkHQAmogAUHugpsBQQRBARDnAiACLQDQAg0BIAItANECIi5BpAFGDQIgASgCrAEhICABKAKoASEhAkACQAJAAkACQAJAAkACQAJAIC5BjX9qDiICCAgICAgICAgICAgICAgICAgICAgICAgIAwgICAgACAgBCAsgL0EBRg0DQQEhMyAgITAgISExQQEhLwwHC0EBIR4gH0EBcQ0DQQAhHwwGCwJAAkAgKEEBcQ0AQQEhKCAfQQFxDQFBACEfDAcLEMYbITcgAkH7gICAeDYC0AIgAiA3NwPYAiABICEgICACQdACahDqHUEBISgMBgsQxxshNyACEMgbNwPgAiACIDc3A9gCIAJB+oCAgHg2AtACIAEgISAgIAJB0AJqEOodQQEhH0EBISgMBQsgH0EBcQ0CAkAgL0EBRw0AEMkbITcgAhDKGzcD4AIgAiA3NwPYAiACQfqAgIB4NgLQAiABICEgICACQdACahDqHUEBIR9BASEvDAULICcNA0EA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cRDFASACKALUAiElAkAgAigC0AIiLUGBgICAeEcNACACICU2AjwgAkENNgI4DAILIAIgCigCEDYCgAIgAiAKKQIINwP4ASACIAopAgA3A/ABIC1BgICAgHhGDQAgEiACKAKAAjYCECASIAIpA/gBNwIIIBIgAikD8AE3AgAgAiAlNgJAIAIgLTYCPCACQQk2AjgMAQsCQAJAAkACQAJAAkACQCABLQC4ASIlQQ9HDQACQAJAIAkoAgAiHkELRw0AIAJB0AJqIAEQxgEMAQsgCUELNgIAIAIgBykCADcD0AIgAiAHKAIINgLYAgJAIAYoAgBBCkYNACAGELwLCyAGIB42AgAgBSAIKQIANwIAIAUgCCgCCDYCCAsgASkDsAEhNyAEIAIpA9ACNwIAIAQgAigC2AI2AgggASA3NwOoASACQdACaiABEL8KIAIoAtQCIR4gAigC0AIiIEEGRw0BIAIgHjYCPCACQQ02AjgMBwsgLw0BDAILIAIgCikDECI3NwOYAiACIAopAwgiODcDkAIgAiAKKQMAIjk3A4gCIAwgOTcDACAMIDg3AwggDCA3NwMQIAIgHjYC3AMgAiAgNgLYAwJAIC9FDQAgASgCrAEhISACQeOAgIB4NgLQAiABIB0gISACQdACahDqHQsCQCACQdgDakG575oBQQsQuApFDQAgASgCrAEhISACQeSAgIB4NgLQAiABIB0gISACQdACahDqHQsgCyACKALsATYCCCALIAIpAuQBNwIAIAogAikDiAI3AwAgCiACKQOQAjcDCCAKIAIpA5gCNwMQIAIgIzoAjAMgAiAdNgLwAiACQQA6AI8DIAIgKzYCiAMgAiAsNgKEAyACICI2AoADIAIgHjYC1AIgAiAgNgLQAiACIChBAXE6AI4DIAIgH0EBcToAkAMgAkGAAjsAkQMgAkEAOgCNAyACQThqIAEgAkHQAmoQ0QMMBwsgJUF3ag4DAQABAAsgAkHQAmogARC/CiACKALUAiEtIAIoAtACIi5BBkcNASACIC02AjwgAkENNgI4DAMLEM4bITcgAiAwNgK0AiACIDE2ArACIAIgNzcDqAJBACEuDAELIBEgCikDEDcDECARIAopAwg3AwggESAKKQMANwMAIAIgLTYCpAILIAIgLjYCoAICQAJAIAEtAIEBQSBxQQV2Ii1FDQBBACExIAEt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CyAEQYGAgIB4Rg0AIAFBFGotAAAhDyACKQLkAiI6QiCIpyEQIDqnIREgAkHQAmogDEEBIAFBDGooAgAiBiABQRBqKAIAIhIgDiAOEIYBIAIoAtACRQ0BIAIgAikC1AI3A7gCIAJBrLiBATYCjAEgAiAALwGAATsBmAEgAiAAKQJ4NwKQASACQQYgECAEQYCAgIB4RiIBGzYCyAIgAkG0uIEBIBEgARs2AsQCIAIgAC8BqAEiATsB9AEgAiAAKQKgASI6NwLsASACIDo3AqABIAIgATsBqAEgAiACQcQCajYCnAEgAiAGNgK4ASACIAApAqABNwLMASACIAAvAagBOwHUASACIAJBuAFqNgLIASACIBI2AqwCIAIgAkGsAmo2AugBIAIgAC8BigE7AZQCIAIgACkBggE3AowCIAIgAkG4Amo2AogCIAJBEjYChAMgAkETNgL8AiACQRM2AvQCIAJBFDYC7AIgAkEUNgLkAiACIAJBiAJqNgKAAyACIAJB6AFqNgL4AiACIAJByAFqNgLwAiACIAJBnAFqNgLoAiACIAJBjAFqNgLgAiACQfQAakHSs4EBIAJB4AJqELIjIQsgAi0AuAIgAigCvAIQtBggBCAREOUhIAIoAoQBIQoCQCACKAKIASIERQ0AIAohAQNAIAEoAgAgAUEEaigCABDwISABQRhqKAIAIAFBHGooAgAQpB4gAUEgaiEBIARBf2oiBA0ACwsgAigCgAEgCkEEQSAQ0BMgCSAHEP4dIAggCRDCIyALRQ0DDAULIAIoAogBIQQgAigChAEhASACIAIoAoABNgKkASACIAE2AqABIAIgATYCnAEgAiABIARBBXRqIhM2AqgBIABBEGohFCAAQcAAaiEVIABBxABqIRYgAEEYaiEXIABBFGohGCAAQSRqIRkgAEE4aiEaIABBBGohGyAAKAJwIhwgACgCdEEKbGohHSACQeACakEEaiEeIAJBiAJqQQRqIR8gAkHgAmpBCGohICACQeACakEYaiEhIAJB4AJqQRBqISIgACgCuAEhIwJAA0AgASATRg0BIAIgAUEgaiIkNgKgASABKAIAIiVBgYCAgHhGDQEgASgCHCEmIAEoAhghJyABKAIEISggAkHgAmogDEEBIAEoAgwgASgCECAOIA4QhgECQCACKALgAkEBRw0AIAIoAuQCIAIoAugCELQYDAYLIAJBKGogAigC5AIiKSACKALoAiIqKAIMEQcAIAJBjAFqIAIoAiggAigCLBDXBiApICooAhwRBAAhBCApICooAhARBAAoAgAhESACQSBqIAIoApQBIgFBAUEBEPgXQQAhEiACQQA2AtABIAIgAikDIDcCyAEgAkEYakEBQQRBFBD4FyACQQA2AvABIAIgAigCHCIQNgLsASACIAIoAhg2AugBIAIgASACKAKQASIKajYCkAIgAiAKNgKMAkGBgMQAIQEgESELA0AgAkGBgMQANgKIAgJAIAFBgYDEAEcNACAfEM0NIQELAkACQAJAIAFBgIDEAEYNAAJAAkAgAUGAAU8NAEEBIQoMAQsCQCABQYAQTw0AQQIhCgwBC0EDQQQgAUGAgARJGyEKCyAKIAtqIQtBACEFAkACQCABQXZqDgQEAQEAAQsgAigCiAIhCiACQYGAxAA2AogCAkACQAJAIApBgYDEAEcNAAJAIAIoAowCIgYgAigCkAJHDQBBgIDEACEGDAMLIAIgBkEBajYCjAIgBi0AACIKwEF/Sg0BIAIgBkECajYCjAIgBi0AAUE/cSEPIApBH3EhKwJAIApB3wFLDQAgK0EGdCAPciEKDAILIAIgBkEDajYCjAIgD0EGdCAGLQACQT9xciEPAkAgCkHwAU8NACAPICtBDHRyIQoMAgsgAiAGQQRqNgKMAiAPQQZ0IAYtAANBP3FyICtBEnRBgIDwAHFyIQoLQYCAxAAhBiAKQYCAxABGDQELIAohBiAKQQpGDQMLIAIgBjYCiAILIAJByAFqIAEQwxUgBEF/Rg0CAkAgAigCiAIiAUGBgMQARw0AIAIgHxDNDSIBNgKIAgsgBEEBaiIEIQUgAUGAgMQARw0DDAILIAIpAuwBITogAigC6AEhASACKALIASACKALMARCxIyACKAKMASACKAKQARDqISApICoQoB4gAUGAgICAeEYNCCACIAE2AqwBIAIgOjcCsAEgAkIANwLgASACIB02AtwBIAIgHDYC2AEgAiAdNgLUASACIBw2AtABIAIgDTYCzAEgAiAJNgLIASACQegBaiACQcgBahDVBSA6QiCIpyEFIDqnISsCQAJAIAIoAugBQYGAgIB4Rg0AIAJB4AJqIAJByAFqELsUQQEhBEEgIQogAkEQaiACKALgAkEBaiIBQX8gARsiAUEEIAFBBEsbQQRBIBD4FyACKAIQIQEgAigCFCILIAIpAoACNwIYIAsgAikC+AE3AhAgCyACKQLwATcCCCALIAIpAugBNwIAIAJBATYC2AIgAiALNgLUAiACIAE2AtACIAIgAikC4AE3A6ACIAIgAikC2AE3A5gCIAIgAikC0AE3A5ACIAIgAikCyAE3A4gCAkADQCACQeACaiACQYgCahDVBSACKALgAkGBgICAeEYNAQJAIAQgAigC0AJHDQAgAkGMAWogAkGIAmoQuxQgAkHQAmogBCACKAKMAUEBaiIBQX8gARtBBEEgENIaIAIoAtQCIQsLIAsgCmoiASACKQLgAjcCACABIAIpAvgCNwIYIAEgAikC8AI3AhAgASACKQLoAjcCCCACIARBAWoiBDYC2AIgCkEgaiEKDAALCyACIAIpAtACNwO4ASACIAIoAtgCIio2AsABIAIoArwBIQ8MAQtBACEqIAJBADYCwAEgAkKAgICAwAA3A7gBQQQhDwsgDyAqQQV0aiERICsgBUEUbGohLEEAISkgKyEEA0ACQAJAIAQgLEYNAEEAIRAgDyEKA0AgCiIBIBFGDQIgAUEQaigCACELIARBEGooAgAhBQJAIAFBDGooAgAiBiAEQQxqKAIAIhJJDQAgAUEgaiEKIAsgBmogBSASak0NAQsgAUEgaiEKIBAgEiAFIAYgCxCNFmohEAwACwsDQAJAAkACQAJAAkACQAJAAkAgKyAsRg0AIClFDQVBACEtIAJBADYC2AIgAkKAgICAEDcC0AIgK0EQaiIGKAIAICtBDGoiEigCACIuaiEvIA8gKkEFdGohBSAPIQQDQAJAIAQiASAFRw0AQQMhAQwGCyABQSBqIQQgEigCACILIAYoAgAiECABQQxqKAIAIgogAUEQaigCACIREI0WRQ0AAkACQAJAIAogC08NAAJAIBEgCmoiESALSQ0AIBEgECALak0NAwsgLUEBaiEtAkAgCiAuTw0AIBEgL0sNAgsgAkHQAmpBIBDDFQwDCyAeIAEvARw7AQggHiABKQIUNwIAIB8gASkCFDcCACAfIAEvARw7AQggAiAXNgKIAiACQegBaiACQYgCahDNEyACQdACaiACKALsASIEIAIoAvABEKkcIAIoAugBIAQQsSMgAkHoAWogACgCABDxHCACQcgBaiACKALsASIEIAIoAvABQQAgKSAtayIKIAogKUsbEL4LIB8gAS8BHDsBCCAfIAEpAhQ3AgAgAiACQcgBajYCiAIgAkGMAWogAkGIAmoQzhMgAkHQAmogAigCkAEiASACKAKUARCpHCACKAKMASABELEjIAIoAsgBIAIoAswBELEjIAIoAugBIAQQsSMgAiAYNgLgAiACQYgCaiACQeACahDNEyACQdACaiACKAKMAiIBIAIoApACEKkcIAIoAogCIAEQsSMMBgsgHiABLwEcOwEIIB4gASkCFDcCACACIBs2AuACIAJBiAJqIAJB4AJqEM0TIAJB0AJqIAIoAowCIgEgAigCkAIQqRwgAigCiAIgARCxIwwBCwsgAkHgAmogARCYCCACKALgAiIEIAIoAuQCEOUhIAFBFGohASAEQYCAgIB4Rg0BIB4gAS8BCDsBCCAeIAEpAgA3AgAgAiAaNgLgAiACQYgCaiACQeACahDNEyACQdACaiACKAKMAiIEIAIoApACEKkcIAIoAogCIAQQsSMMAgsgAkG4AWoQsxggAkGsAWoQyxggJSAoEOUhICcgJhCgHiAkIQEMDQsgHiABLwEIOwEIIB4gASkCADcCACACIBk2AuACIAJBiAJqIAJB4AJqEM0TIAJB0AJqIAIoAowCIgQgAigCkAIQqRwgAigCiAIgBBCxIwsgAkHoAWogACgCABDxHCACQcgBaiACKALsASIEIAIoAvABQQAgKSAtayIKIAogKUsbEL4LIB4gAS8BCDsBCCAeIAEpAgA3AgAgHyABKQIANwIAIB8gAS8BCDsBCCACIAJByAFqNgKIAiACQYwBaiACQYgCahDOEyACQdACaiACKAKQASIBIAIoApQBEKkcIAIoAowBIAEQsSMgAigCyAEgAigCzAEQsSMgAigC6AEgBBCxIyACIBg2AuACIAJBiAJqIAJB4AJqEM0TIAJB0AJqIAIoAowCIgEgAigCkAIQqRwgAigCiAIgARCxIwtBASEBCyACKALUAiEEAkACQCACKALYAiIKQRBJDQAgBCAKEMoGIQQMAQsgBCAKEPQcIQQLIAJBiAJqQaDjmgFBAUEAICkgBGsiBCAEIClLGyABahC+CyACQQI2AuwCIAJBAjYC5AIgAiACQYgCajYC6AIgAiACQdACajYC4AIgAkH0AGpBgICAASACQeACahCyIyEBIAIoAogCIAIoAowCELEjIAIoAtACIAIoAtQCELEjIAENAQsgK0EUaiEwICsoAgghBCArKAIEIQEgAkEAOgCAAyACQQA2AvwCIAIgIzYC+AIgAiABIARqIgQ2AvQCIAIgATYC8AIgAkIANwLoAiACIAQ2AuQCIAIgATYC4AICQANAIAJB4AJqEM0NIgRBgIDEAEYNASAiEM0NIgFBgIDEAEYNASAhIAEQqwghAQJAIARBCUYNACACQfQAaiAEEMMVDAELA0AgAUUNASACQfQAakEgEMMVIAFBf2ohAQwACwsLIAJB9ABqQQoQwxUgAkEANgKQAiACQoCAgIDAADcCiAIgAkEANgLoAiACQoCAgIDAADcC4AICQAJAAkACQCAqDQBBBCExQQAhMkEAITNBBCE0QQAhNUEAISoMAQtBBCESA0ACQCArQQxqIhAoAgAiBCArQRBqIi0oAgAiCyAPQQxqKAIAIgogD0EQaigCACIFEOsTRQ0AQQAhBiACQeACaiEBAkAgCiAESQ0AIAUgCmogCyAEaksNAEEBIQYgAkGIAmohAQsCQCABKAIIIgQgASgCAEcNACABEI0aIAIoAowCIRILIBIgAigC5AIgBhsgBEECdGogDzYCACABIARBAWo2AggLIA9BIGohDyAqQX9qIioNAAsgAigCwAEhKiACKAK8ASEPIAIoAugCITUgAigC5AIhNCACKALgAiEzIAIoAowCITEgAigCiAIhMiACKAKQAiIuRQ0AIAAgAkH0AGogKSAQKAIAIC0oAgAgDyAqQQAQ4AUNAkEAIQQgAkEANgK0AiACQoCAgIAQNwKsAiACQQhqIC5BBEEIEPgXIAJBADYCwAIgAiACKAIMIjY2ArwCIAIgAigCCCIKNgK4AiAuQQJ0IQtBACEBAkAgLiAKTQ0AIAJBuAJqQQAgLkEEQQgQ0hogAigCvAIhNiACKALAAiEBCyAxIAtqITcgASAuaiE4IDYgAUEDdGohBSAxIQYDQCAGKAIAIgEoAhAhCyAEIAAoArgBICsgASgCDCISQQEQpAoiCiAEIApLGyEKAkACQCABKAIQDQAgCkEBaiELDAELIApBAWoiESAAKAK4ASArIAsgEmpBABCkCiILIBEgC0sbIQsLIAJBjAFqIBYoAgAQ8RwgAkHQAmogAigCkAEiLyACKAKUASALIApqQQF2IhIgCmsQvgsgFCERAkAgASgCEEUNACACQeACaiABEJgIIAIoAuACIhEgAigC5AIQ5SEgFiAVIBFBgICAgHhGGyERCyACIBEoAgA2AtwCIAJB6AFqIBYoAgAQ8RwgAkHIAWogAigC7AEiESACKALwASALIBJBf3NqEL4LICBBACAKIARrIjkgOSAKSxtB7MGBARDmHiACQQI2AoQDIAJBAzYC/AIgAkECNgL0AiACQQE2AuQCIAJBsLeYATYC4AIgAiACQcgBajYCgAMgAiACQdwCajYC+AIgAiACQdACajYC8AIgAkHEAmpB/MGBASACQeACahDlHiACKALIASACKALMARCxIyACKALoASARELEjIAIoAtACIAIoAtQCELEjIAIoAowBIC8QsSMgHyABLwEcOwEIIB8gASkCFDcCACACIAJBxAJqNgKIAiACQeACaiACQYgCahDOEyACQawCaiACKALkAiIBIAIoAugCEKkcIAIoAuACIAEQsSMgAigCxAIgAigCyAIQsSMgBUEEaiASNgIAIAUgBjYCACALIAQgCyAESxshBCAGQQRqIQYgBUEIaiEFIC5Bf2oiLg0ACyACKAK4AiEFIAJBAjYC5AIgAiACQawCajYC4AIgAkH0AGpBnLaBASACQeACahCyIw0BA0ACQAJAIDEgN0YNACACQeACaiA3QXxqIjcoAgAQ7AsgAigC4AJBgICAgHhGDQIgAigC5AIhAQJAAkAgAigC6AIiBEEBRw0AIAAgAkH0AGogECgCACAtKAIAICkgDyAqIAAgNiA4IDcoAgAgASgCBCABKAIIQQAQ6AQNAQwDCyAEQQxsIQRBASEKA0AgBEUNAyAEQXRqIQQgACACQfQAaiAQKAIAIC0oAgAgKSAPICogACA2IDggNygCACABKAIEIAEoAgggChDoBCELIAFBDGohAUECIQogC0UNAAsLIAJB4AJqEMoYDAQLIAUgNkEEQQgQzxMgAigCrAIgAigCsAIQsSMMAgsgAkHgAmoQyhgMAAsLIDQgNUECdGohCyA0IQEDQCABIAtGDQQgAkHgAmogASgCACIEEJgIIAIoAuACIgogAigC5AIQ5SEgAUEEaiEBIApBgICAgHhGDQAgBEEQaigCACAEQQxqKAIAIhJqIgYgK0EMaiIFKAIAIgpJDQAgBiArQRBqIhEoAgAgCmpL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ACADKQMgNwMgIAAgAykDGDcDGCAAIAMpAxA3AxAgACADKQMINwMIIAAgAykDADcDACADQcAAQQgQ1BQMAgsgBEEEaiABEL4GDAELIARBDGooAgAiAEUNACAAQShsIQMgBEEIaigCACEAA0AgACABENwGIABBKGohACADQVhqIgMNAAsLIARBKGoiBCAHRw0ACwsgBUHYAGoiBSAIRw0ACwsCQCAGKAJ4IgBFDQAgAEEIaigCACIDRQ0AIANBAnQhAyAAQQRqKAIAIQADQCAAKAIAIAEQuAEgAEEEaiEAIANBfGoiAw0ACwsCQCAGKAKYASIARQ0AIABBKGwhAyAGKAKUASEAA0AgACABEKMCIABBKGohACADQVhqIgMNAAsLIAYtADwiAEEGRg0IAkAgAEECSw0AIAZBKGohAwJAIABBAkcNACADIAEQ3R4LIAEgAxCoCSAGLQA8IQALIABB/wFxQQNHDQggAiABIAZBEGoiABCiDSACLQAsQQZGDQggABCUEyAAIAIpAyg3AyggACACKQMgNwMgIAAgAikDGDcDGCAAIAIpAxA3AxAgACACKQMINwMIIAAgAikDADcDAAwICyAAKAIMIgNFDQcgACgCCCIEIANBKGxqIQUDQAJAAkACQAJAAkAgBCgCAA4FBAABAgMECyAEKAIEQQFHDQMgBCgCCCIAIAEQXCAAKAIAQRpHDQMgASAAQQhqEJILIgNFDQMgABCHAiAAIAMpAzg3AzggACADKQMwNwMwIAAgAykDKDcDKCAAIAMpAyA3AyAgACADKQMYNwMYIAAgAykDEDcDECAAIAMpAwg3AwggACADKQMANwMAIANBwABBCBDUFAwDCyAEKAIEIgAgARBcIAAoAgBBGkcNAiABIABBCGoQkgsiA0UNAiAAEIcCIAAgAykDODcDOCAAIAMpAzA3AzAgACADKQMoNwMoIAAgAykDIDcDICAAIAMpAxg3AxggACADKQMQNwMQIAAgAykDCDcDCCAAIAMpAwA3AwAgA0HAAEEIENQUDAILIARBBGogARC+BgwBCyAEQQxqKAIAIgBFDQAgAEEobCEDIARBCGooAgAhAANAIAAgARDcBiAAQShqIQAgA0FYaiIDDQALCyAEQShqIgQgBUcNAAwICwsgACgCBCIDIAEQXAJAIAMoAgBBGkcNACABIANBCGoQkgsiBEUNACADEIcCIAMgBCkDODcDOCADIAQpAzA3AzAgAyAEKQMoNwMoIAMgBCkDIDcDICADIAQpAxg3AxggAyAEKQMQNwMQIAMgBCkDCDcDCCADIAQpAwA3AwAgBEHAAEEIENQUCyAAKAIIIAEQuAEMBgsgACgCBCIAIAEQXCAAKAIAQRpHDQUgASAAQQhqEJILIgFFDQUgABCHAiAAIAEpAzg3AzggACABKQMwNwMwIAAgASkDKDcDKCAAIAEpAyA3AyAgACABKQMYNwMYIAAgASkDEDcDECAAIAEpAwg3AwggACABKQMANwMAIAFBwABBCBDUFAwFCyAAKAIEIgAgARBcIAAoAgBBGkcNBCABIABBCGoQkgsiAUUNBCAAEIcCIAAgASkDODcDOCAAIAEpAzA3AzAgACABKQMoNwMoIAAgASkDIDcDICAAIAEpAxg3AxggACABKQMQNwMQIAAgASkDCDcDCCAAIAEpAwA3AwAgAUHAAEEIENQUDAQLIAAoAgQiAyABEFwCQCADKAIAQRpHDQAgASADQQhqEJILIgRFDQAgAxCHAiADIAQpAzg3AzggAyAEKQMwNwMwIAMgBCkDKDcDKCADIAQpAyA3AyAgAyAEKQMYNwMYIAMgBCkDEDcDECADIAQpAwg3AwggAyAEKQMANwMAIARBwABBCBDUFAsgACgCCCABELgBDAMLIAAoAgQiAyABEFwCQCADKAIAQRpHDQAgASADQQhqEJILIgRFDQAgAxCHAiADIAQpAzg3AzggAyAEKQMwNwMwIAMgBCkDKDcDKCADIAQpAyA3AyAgAyAEKQMYNwMYIAMgBCkDEDcDECADIAQpAwg3AwggAyAEKQMANwMAIARBwABBCBDUFAsgACgCCCIAQQhqKAIAIgNFDQIgA0ECdCEDIABBBGooAgAhAANAIAAoAgAgARC4ASAAQQRqIQAgA0F8aiIDDQAMAwsLIAAoAgQiAyABEFwCQCADKAIAQRpHDQAgASADQQhqEJILIgRFDQAgAxCHAiADIAQpAzg3AzggAyAEKQMwNwMwIAMgBCkDKDcDKCADIAQpAyA3AyAgAyAEKQMYNwMYIAMgBCkDEDcDECADIAQpAwg3AwggAyAEKQMANwMAIARBwABBCBDUFAsgACgCCCABELgBDAELAkAgACgCBCIAKAIAQQNHDQAgAEEEaiABEIEJDAELIAAgARDyCwsgAkEwaiQAC9hAAxF/A34BfCMAQZAGayICJAAgAUGwAWohAyABKAKwASEEAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEtALgBIgVBjX9qQf8BcUEuSQ0AAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAUOcgMCBQIEAgICAgICAgICAQICAgICAgICAgICAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgsKAgICAhkZGQICAgICAgICAgICAgACAgICCAICAgIZAgIZBwIAAgYCGQICGQILAkACQAJAAkACQAJAAkACQCAFQRpGDQAgAkHYAGogARCvAiACKAJcIQUgAigCWCIDQQdGDQEgAiACKQNwNwOgBSACIAIpA2g3A5gFIAIgAikDYDcDkAUgAiAFNgKMBSACIAM2AogFIAMOBQMGAgQFAgsCQAJAIAEoAogBIgVBC0cNACACQdgAaiABEMYBDAELIAFBCzYCiAEgAiABKQKYATcDWCACIAEoAqABNgJgIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahC8CwsgASAFNgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEpA7ABIRMgAyACKQNYNwIAIAMgAigCYDYCCCABIBM3A6gBQQAhByACQQA2ArwFIAJCgICAgMAANwK0BSACQdgAaiABQQAQuwMgAigCWCEFAkAgAi0AcCIGQQJHDQBBBCEBDCwLIAIgAigCbDYC2AUgAiACKQJkNwPQBSACIAIpAlw3A8gFIAIgAigAcTYCwAUgAiACKAB0NgDDBUEgEIoBIghFDRYgCCAFNgIAIAggAikDyAU3AgQgCCACKQPQBTcCDCAIIAIoAtgFNgIUIAggBjoAGCAIIAIoAsAFNgAZIAggAigAwwU2ABxBASEJIAJBATYC5AUgAiAINgLgBSACQQE2AtwFAkACQCAGQQFxRQ0AQQQhCkEAIQtBACEHQQEhBgwBCyABQQxqIQwgAUEIaiENIAFBmAFqIQ4gAUGMAWohDyACQfEAaiEQIAJB2ABqQQRyIRFBACELQQQhEkEAIQcCQAJAA0ACQAJAAkAgAS0AuAEiBUE9Rw0AAkACQCABKAKIASIF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ISQgSqchJSBHpyEmIEpCIIinIhUhIwsgSEIoiKchJyBIQiCIpyEoIAFBwABqLQAAISkgSKchFiAlIRcgSyFHICQhGCAmIRkMAgsgAUEgaigCACEWIAFBHGooAgAhFSABQRhqKAIAIRcgAUEMaigCACEYIAFBCGooAgAhGQJAIAFBEGopAwAiR0IDg0IAUg0AIEenIiggKCgCACIoQQFqNgIAIChBf0wNKQsgAUEkai0AACEoQgMhSQwBCyABQSBqKAIAIRYgAUEcaigCACEVIAFBGGooAgAhFyABQQxqKAIAIRggAUEIaigCACEZAkAgAUEQaikDACJHQgODQgBSDQAgR6ciKCAoKAIAIihBAWo2AgAgKEF/TA0oCyABQSRqLQAAIShCBCFJCyAKIAZqIgEgSTcDACABQcAAaiApOgAAIAFBPGogIDYCACABQThqICE2AgAgAUE0aiAiOgAAIAFBMGogHTYCACABQSxqIB42AgAgAUEoaiAfNgIAIAFBHGogFTYCACABQRhqIBc2AgAgAUEQaiBHNwMAIAFBDGogGDYCACABQQhqIBk2AgAgAUEgaiAorUL/AYNCIIYgJ61CKIaEIBathDcDACAGQcgAaiEGIAtBf2oiCw0ACwsgAygCECEBQRgQigEiKEUNCSABKAIMIQYgASgCCCELAkAgASkDACJJQgODQgBSDQAgSaciFSAVKAIAIhVBAWo2AgAgFUF/TA0lCwJAIAEpAxAiR1ANACBHQgODQgBSDQAgR6ciASABKAIAIgFBAWo2AgAgAUF/TA0lCyAoIEc3AxAgKCAGNgIMICggCzYCCCAoIEk3AwAgAy0AICELAkACQCADKAIcIgENAEEAIQYMAQtBFBCKASIGRQ0LIAEpAgwhRyACQcAAaiABKAIEIAEoAggQnQkgBiBHNwIMIAYgAigCSDYCCCAGIAIpAkA3AgALIAMtACFBCHQgKkGAgHxxIAtyciILISogKyEVDB4LIAMoAjQhLCADKAIwIS0gAkHAAGogA0EIahC3ASACIBIvAAA7ARAgAiASLQACOgASIAIpA0giR0IgiKchGyACLQBcIRUgAigCWCELIAIoAlQhBiACKAJQIQcgAigCRCEIIAIoAkAhCiACKAJgIS4gAigCZCEvIEenISgMHQsgA0EIaigCACEYIAMoAhQhGyADKAIQISggAkHAAGogA0EMaigCACIIQQhB0AAQgw8gAigCRCEEIAIoAkBBAUYNCSACKAJIIQoCQCAERQ0AIAhB0ABsIRlBACEGIAQhFQNAIBkgBkYNAQJAAkACQAJAIBggBmoiASkDACJHp0F+akECIEdCAVYbDgMAAQIACyABQRxqKAIAIQcgAUEYaigCACEWIAFBLGooAgAhMCABQShqKAIAITECQAJAIAFBCGopAwBCAVINAAJAIAFBEGopAwAiSUIDg0IAUg0AIEmnIgsgCygCACILQQFqNgIAIAtBf0wNKgsgAUEgaikDACJHpyEyAkAgR1ANACBHQgODUEUNACAyIDIoAgAiAUEBajYCACABQX9MDSoLIEdCKIinITMgR0IgiKchNCBJpyELQgEhRwwBCyABQRBqKQMAIkmnIQsgAUEgaigCACEyAkAgSUIDg0IAUg0AIAsgCygCACIXQQFqNgIAIBdBf0wNKQsgAUEkai0AACE0QgAhRwsgB0EIdiE1IElCIIinIRdCAiFJDAILIAFBGGooAgAhFiABQRRqKAIAIRcgAUEQaigCACELAkAgAUEIaikDACJHQgODQgBSDQAgR6ciByAHKAIAIgdBAWo2AgAgB0F/TA0nCyABQRxqLQAAIQdCAyFJDAELIAFBFGooAgAhByABQRBqKAIAIQsgAUHEAGooAgAhNiABQcAAaigCACE3AkACQCBHQgFSDQACQCABQQhqKQMAIkdCA4NCAFINACBHpyIWIBYoAgAiFkEBajYCACAWQX9MDSgLAkAgAUEYaikDACJMUA0AIExCA4NQRQ0AIEynIhYgFigCACIWQQFqNgIAIBZBf0wNKAsgB61CIIYgC62EIUhCASFJDAELIAFBGGo1AgAhSQJAIAFBCGopAwAiR0IDg0IAUg0AIEenIhYgFigCACIWQQFqNgIAIBZBf0wNJwsgTEKAgICAgGCDIEmEIAFBHGoxAABCIIaEIUwgB61CIIYgC62EIUhCACFJC0ECITICQCABQSBqKQMAIktCAlENACABQTRqKAIAITggAUEwaigCACE5AkACQCBLQgFSDQACQCABQShqKQMAIktCA4NCAFINACBLpyIHIAcoAgAiB0EBajYCACAHQX9MDSkLQQEhMiABQThqKQMAIk1QDQEgTUIDg1BFDQFBASEyIE2nIgcgBygCACIHQQFq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BiARKAIINgIIIAYgESkDADcDAAJAIAEoAogBQQ5xQQpGDQAgBRC8CwsgASAjNgKsASABICA2AqgBIAUgECkDGDcDGCAFIBApAxA3AxAgBSAQKQMINwMIIAUgECkDADcDAAwGCyACICY6APwBIAIgAzYC+AEgAiAlNgLwASACIB82AuwBQQchFCACQQc2AugBIAIgASgCrAEiBDYC9AEgAyEDICUhHiAfIRwLIAEgASgCeEF+cSAdQQFxcjYCeCACIA0pAwA3A3AgAiANKQMINwN4IAIpA4gCITIgAigChAIhHyACKAKAAiEgIAIoAvwBISECQCAkQQpGDQAgEhC8CwsCQCAiQQ5xQQpGDQAgEBC8CwsgAiACKQNwNwNQIAIgAikDeDcDWCAyQjCIpyElIDJCKIinISggMkIgiKchJyAypyEmIB8hHyAEISMgHiEkICAhICAhISEgAyEiIBwhHgwHC0HM9JoBEMMjAAtBBEEMEKAkAAsgHxCMAiAfQcAAQQgQ1BQLIAEgAkGAAWoQywggBiARKAIINgIIIAYgESkDADcDAAJAIAEoAogBQQ5xQQpGDQAgBRC8CwsgASAjNgKsASABICA2AqgBIAUgECkDGDcDGCAFIBApAxA3AxAgBSAQKQMINwMIIAUgECkDADcDACACKALsASIDQQhqEOYDIANBIEEIENQUCyACQYABaiABEMkDIAIoAoQBISICQCACLQCAASIfQQJHDQAgIiEeDAELIAEtALgBIiQhAwJAICRBCkcNAAJAAkAgBSgCACIDQQtHDQAgAkGAAWogARDGAQwBCyAFQQs2AgAgAiAJKQIANwOAASACIAkoAgg2AogBAkAgCigCAEEKRg0AIAoQvAsLIAogAzYCACAHIAgpAgA3AgAgByAIKAIINgIICyABKQOwASEyIAYgAikDgAE3AgAgBiACKAKIATYCCCABIDI3A6gBIAEtALgBIQMLAkACQAJAAkACQAJAAkACQAJAAkACQAJAIANB/wFxIhQOEwEEBAQEBAQEBAAEBAQEBAQEBAEECyABIAEoAngiIEGAIHI2AnggASgCsAEhIQJAAkAgASgCiAEiA0ELRw0AIAJBgAFqIAEQxgEMAQsgBUELNgIAIAIgCSkCADcDgAEgAiAJKAIINgKIAQJAIAooAgBBCkYNACAKELwLCyAKIAM2AgAgByAIKQIANwIAIAcgCCgCCDYCCAsgASkDsAEhMiAGIAIpA4ABNwIAIAYgAigCiAE2AgggASAyNwOoASABIAEoAngiA0H///+/f3E2AnggAkEYaiABKAKwASABEOwDIAIoAhghIyABIAM2AnggAigCHCEUICNBAXENASABKAKsASEjQQwQigEiAw0CQQRBDBCgJAALAkACQAJAIAQNAEEAISkgFEESRw0CIAEgASgCeCIDQYAgcjYCeCACQQA6AOgBIAJBAToAgAEgAkEQaiACQegBaiACQYABaiABEOIBIAIoAhAhBCABIAM2AnggAigCFCEpIARBAXFFDQEgKSEUDAwLIAEoArQBIQMgASgCsAEhBCACQeOAgIB4NgKAASAEIAMgAkGAAWoQwBshFCABLQC4AUGiAUcNCyABIAEQhQ4QkwkMCwsgAS0AuAEhAwsCQAJAIANB/wFxDQACQAJAIAUoAgAiA0ELRw0AIAJBgAFqIAEQxgEMAQsgBUELNgIAIAIgCSkCADcDgAEgAiAJKAIINgKIAQJAIAooAgBBCkYNACAKELwLCyAKIAM2AgAgByAIKQIANwIAIAcgCCgCCDYCCAsgASkDsAEhMiAGIAIpA4ABNwIAIAYgAigCiAE2AgggASAyNwOoASACQYABaiABEPwCIAIoAoQBIQMgAigCgAEiBEGAgICAeEcNASADIRQMCgsgASgCtAEhBCABKAKwASEeIAJB6AJqIAMQxiUgAiAwNwPoASACQYABakHNlYABIAJB6AFqEK8QIAsgAigC8AI2AgggCyACKQLoAjcCACAeIAQgAkGAAWoQwBshFCABLQC4AUGiAUcNCSABIAEQhQ4QkwkMCQsgAiACKAKIASIjNgLwASACIAM2AuwBIAIgBDYC6AEgAS0AuAFBCUcNBCABIAEoAngiFEGAIHI2AnggAkEJOgCAASACQQhqIAJBgAFqIAEQhQIgAigCCCEgIAEgFDYCeCACKAIMISoCQCAgQQFxRQ0AICohFAwICyABEJ0KIhRFDQUgKkUNByAqKAIAIgEQpwQgAUHgAEEIENQUICpBDEEEENQUDAcLIAEgIDYCeAwICyADICM2AgggAyAhNgIEIAMgFDYCACABICA2AnggARCdCiIURQ0BIAMoAgAiARCnBCABQeAAQQgQ1BQgA0EMQQQQ1BQMBwtBACED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DiADQoGAgIDAADcCrAQgA0EgakEAQQFBARD4FyADKQMgIR4gA0EYakEAQQFBARD4FyADKQMYIR8gA0EQakEAQQFBARD4FyADKQMQISAgA0GABWoQwgogAykCkAUhISADKQKwBSEiIAMpArgFISMgAykCwAUhJCADQbgEahDhDiADQfgCahC0ISADQQA2AuADIAMgIDcC2AMgA0EANgLUAyADIB83AswDIANBADYCyAMgAyAeNwLAAyADICQ3ArgDIAMgIzcCsAMgAyAiNwKoAyADQqCAgICABDcCoAMgA0KggICAgAQ3ApgDIANCoICAgIAENwKQAyADICE3AogDIANCoICAgIAENwKAAyADQqCAgICABDcC+AIgDiADQbgEakHIAPwKAAAgA0GwAWogA0H4AmpBvAH8CgAAIAMgFTYC8AIgAyAWNgLsAiADQYAFahCvHyAWIBYoAgAiDkEBajYCACAOQX9MDQEgAykCsAEhHiADKQK4ASEfIAMpAsABISAgAykCyAEhISADKQLQASEiIAMpAtgBISMgAykC4AEhJCADKQLoASElIAMpAvABISYgA0H4AmpByABqIAMoAvwBIAMoAoACEM4YIANBzANqIAMoAogCIAMoAowCEM4YIANB2ANqIAMoApQCIAMoApgCEM4YIAMgJjcCuAMgAyAlNwKwAyADICQ3AqgDIAMgIzcCoAMgAyAiNwKYAyADICE3ApADIAMgIDcCiAMgAyAfNwKAAyADIB43AvgCIAMoAqACIQ4gA0GABWogAygCpAIiD0EBQQoQgg8gAygChAUhEyADKAKABUEBRg0EIAMoAogFIRQCQAJAIA8NAEEAIQ8MAQsgD0EKbCISRQ0AIBQgDiAS/AoAAAsgA0GABWogA0H4AmpB7AD8CgAAIBUgFSgCACIOQQFqNgIAIA5Bf0wNASADKALoAiESIAMoAuQCIRAgA0H4AmogA0GABWpB7AD8CgAAQcQBEPggIg4gA0H4AmpB7AD8CgAAIA4gDzYCdCAOIBQ2AnAgDiATNgJsIA4gA0GoAmoiDykCADcCeCAOIA8vAQg7AYABIA4gA0GyAmoiDykBADcBggEgDiAPLwEIOwGKASAOIANBvAJqIg8pAgA3AowBIA4gDy8BCDsBlAEgDiADQcYCaiIPKQEANwGWASAOIA8vAQg7AZ4BIA4gEDYCtAEgDiASNgK4ASAOIBY2ArwBIA4gFTYCwAEgDiADQdACaiIVLwEIOwGoASAOIBUpAgA3AqABIA4gA0HaAmoiFSkBADcBqgEgDiAVLwEIOwGyASADQQE6ANYDIANBADYA1wMgA0EAOgD8AiADQQA2AvgCIAMgDjYCgAMgA0GgtoEBNgKEAyADQYACOwHUAyADQQA6AIgDIANBADoAmAMgA0EANgKUAyADQoCAgIDAADcCjAMgA0EAKQOoppwBIh43APsFIANBACkDoKacASIfNwDzBSADIB83ALsEIAMgHjcAwwQgAyAfNwCDBSADIB43AIsFIAMgAygA/wU2AKgDIAMgAykA+AU3AKEDIAMgAykA8AU3AJkDIANBADoArAMgAyADKADHBDYAvAMgAyADKQDABDcAtQMgAyADKQC4BDcArQMgA0EAOgDAAyADIAMoAI8FNgDQAyADIAMpAIgFNwDJAyADIAMpAIAFNwDBAyADIAU6AKcFIAMgGDYAowUgAyAZOwChBSADIAg6AKAFIAMgCToAnwUgAyAKOgCeBSADIAs6AJ0FIAMgBzYAmQUgAyAGOgCYBSADIB02ApQFIAMgDTYCkAUgAyAMNgKMBSADIAMoAqgBNgKIBSADIAMpA6ABNwOABSADIANB+AJqNgKsBSADIANBnAFqNgKoBUEAKALslZ0BIRVBACADQfgCajYC7JWdASADQfAFaiADKAKcASADQfgCaiADQaABaiADQYwFahA/AkACQCADKALwBUGAgICAeEcNACADQbgEahD7ICADIAMpArwENwOIBiADIAMpAsQENwOQBiADIAMoAswENgKYBiADKAK4BCEMQSwQ+CAiDiAMNgIEIA5BpLeBATYCACAOIAMpA4gGNwIIIA4gAykDkAY3AhAgDiADKAKYBjYCGCAOIAMpAvQFNwIcIA4gAykC/AU3AiQgAyAONgK8BCADQYCAgIB4NgK4BAwBCyADIAMpAoAGNwPIBCADIAMpAvgFNwPABCADIAMpAvAFNwO4BAtB0MaYASAVEIggAkACQCADKAL4Ag0AIAMoArwEIQ8gAygCuAQiBUGAgICAeEYNByADKQPIBCEfIAMpA8AEIR4MAQsgFkEIahD+GEEAOgAAIBYpAhAhHiAWQgQ3AhAgFigCDCEPIBZBADYCDEGAgICAeCEFAkACQCADKAK4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oCAWIBZEAAAAAAAAAABjG/wDQX9ztyEWDB0LIAIoAhAhCSACKAIMIQogAi0AFCEHIAIoAgghBSACKAIEIQYQjCEhBCADQbACaiAGEE4gBCADKQPoAjcDOCAEIAMpA+ACNwMwIAQgAykD2AI3AyggBCADKQPQAjcDICAEIAMpA8gCNwMYIAQgAykDwAI3AxAgBCADKQO4AjcDCCAEIAMpA7ACNwMAEIwhIQggA0GwAmogBRBOIAggAykD6AI3AzggCCADKQPgAjcDMCAIIAMpA9gCNwMoIAggAykD0AI3AyAgCCADKQPIAjcDGCAIIAMpA8ACNwMQIAggAykDuAI3AwggCCADKQOwAjcDAAJAIAdBeGpBC0kNACAHQRdGDQAQliEiASAHOgAUIAEgCTYCECABIAo2AgwgASAINgIIIAEgBDYCBCABQRI2AgAgACABNgIEIABBAjYCACAGIAUQvyAMHgsgA0HIAGogASAGEGsgA0HYAGogASAFEGsgAyADKQNQNwNwIAMgAykDSCIQNwNoIAMgAykDWDcDeCADIAMpA2A3A4ABIAMgBzoAiAEgA0H4AGohAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQpw4CAAEkCyADKAJ4IgUOAiIBIwsgAygCeCIFDgICASILIAdBC0cNISADIAMpA3A3A5ABIANB0AFqIAMrA4ABEKIOIANB5QStQiCGIANB0AFqrYQ3A7gCIANB4AStQiCGIANBkAFqrYQ3A7ACIANBmAJqIANBsAJqENMQIANBmAJqEK4gIRAgAEEANgIAIAAgEDcDCCADKALQASADKALUARCxIyADKQOQARCUHQwjCyADKwOAASEWIAMrA3AhFSAHQXhqDhACAwQFBgcICQoLDAEBAQENAQsgB0ELRw0fIAMrA3AhFiADIAMpA4ABNwOQASADQdABaiAWEKIOIANB4AStQiCGIANBkAFqrYQ3A7gCIANB5QStQiCGIANB0AFqrYQ3A7ACIANB/AJqIANBsAJqENMQIANB/AJqEK4gIRAgAEEANgIAIAAgEDcDCCADKALQASADKALUARCxIyADKQOQARCUHQwdC0GI85oBQShBpNCaARC3IQALIBUgFhCVECEXDBoLIBUgFhCWECEXDBkLIBUgFhCXECEXDBgLIBUgFqAhFwwX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C0Gow5cBEMMjAAsgBEH1ADYCnAEgBCAEQegAajYCmAFBgI6AASAEQZgBakGM5oYBEOQbAAtByMOXARDDIwALIARB9QA2ApwBIAQgBEHoAGo2ApgBQbKOgAEgBEGYAWpBnOaGARDkGwALQYCAgIB4IQEMAQsgACAGOgAEIABBBWogBEEQakEj/AoAAAsgACABNgIAIARB0AFqJAALpS8CE38DfiMAQcACayIDJAACQAJAAkACQAJAAkACQAJAAkACQCABLQC4ASIEQbV/aiIFQR9LDQBBASAFdEGBgIKQeHENAQsgBEG0f2pB/wFxQdUASQ0AAkACQAJAIARBfmoOAwEFAAQLIAFBsAFqIQQgASgCsAEhBgJAAkAgASgCiAEiAkELRw0AIANBwABqIAEQxgEMAQsgAUELNgKIASADIAEpApgBNwNAIAMgASgCoAE2AkggAUGMAWohBQJAIAEoAghBCkYNACABQQhqELwLCyABIAI2AgggASAFKQIANwIMIAEgBSgCCDYCFAsgASkDsAEhFiAEIAMpA0A3AgAgBCADKAJINgIIIAEgFjcDqAEgA0EANgLgASADQoCAgICAATcC2AEgAUEMaiEHQQghCCABQQhqIQkgAUGYAWohCiABQYwBaiELIANBwABqQQhqIQxBACECQQAhDUEAIQ4CQAJAAkADQCACQShsIQUCQAJAAkACQAJAA0ACQCABLQC4ASIPQQdGDQAgD0EFRg0CAkAgDkH+/3tLDQAgDiANckUNACADQbuAgIB4NgJAIAEgDiANIANBwABqEOodIAEtALgBIQ8LIA9B/wFxQRxHIhANBSAEKAIAIQ4gASgCiAEiBUELRw0DIANBwABqIAEQxgEMBAsCQAJAIAEoAogBIg9BC0cNACADQcAAaiABEMYBDAELIAFBCzYCiAEgAyAKKQIANwNAIAMgCigCCDYCSAJAIAEoAghBCkYNACAJELwLCyAJIA82AgAgByALKQIANwIAIAcgCygCCDYCCAsgASkDsAEhFiAEIAMpA0A3AgAgBCADKAJINgIIIAEgFjcDqAECQCACIAMoAtgBRw0AIANB2AFqELYaIAMoAtwBIQgLIAggBWpBBzYCACADIAJBAWoiAjYC4AEgBUEoaiEFDAALCwJAAkAgASgCiAEiAkELRw0AIANBwABqIAEQxgEMAQsgAUELNgKIASADIAopAgA3A0AgAyAKKAIINgJIAkAgASgCCEEKRg0AIAkQvAsLIAkgAjYCACAHIAspAgA3AgAgByALKAIINgIICyABIAEoArQBIgI2AqwBIAEgASgCsAE2AqgBIAQgAykDQDcCACAEIAMoAkg2AgggAS0AgQFBBHENBkEAIQUgAS0AeUHAAHFFDREgAS0AuAFB/wFxQQpGDQcMEQsgAUELNgKIASADIAopAgA3A0AgAyAKKAIINgJIAkAgASgCCEEKRg0AIAkQvAsLIAkgBTYCACAHIAspAgA3AgAgByALKAIINgIICyABIAEoArQBIhE2AqwBIAEgASgCsAE2AqgBIAQgAykDQDcCACAEIAMoAkg2AgggA0HAAGogAUEAEHMgAygCRCEPIAMoAkAiCEEHRg0DIAMgDCkDGDcDkAIgAyAMKQMQNwOIAiADIAwpAwg3A4ACIAMgDCkDADcD+AEgASgCrAEhDUEoEIoBIgVFDQcgBSAPNgIEIAUgCDYCACAFIAMpA/gBNwMIIAUgAykDgAI3AxAgBSADKQOIAjcDGCAFIAMpA5ACNwMgAkAgAiADKALYAUcNACADQdgBahC2GgsgAygC3AEiCCACQShsaiIPQQA2AhggDyARNgIUIA8gDjYCECAPIA02AgwgDyAONgIIIA8gBTYCBCAPQQI2AgAMAQsgA0HAAGogARCnBSADKAJEIQ8gAygCQCIRQQdGDQIgAyAMKQMYNwOQASADIAwpAxA3A4gBIAMgDCkDCDcDgAEgAyAMKQMANwN4AkAgAiADKALYAUcNACADQdgBahC2GgsgAygC3AEiCCACQShsaiIFIA82AgQgBSARNgIAIAUgAykDeDcDCCAFIAMpA4ABNwMQIAUgAykDiAE3AxggBSADKQOQATcDIAsgAyACQQFqIgI2AuABAkACQCABLQC4ASIFQXtqDgMCAQABCwJAAkAgASgCiAEiBUELRw0AIANBwABqIAEQxgEMAQsgAUELNgKIASADIAopAgA3A0AgAyAKKAIINgJIAkAgASgCCEEKRg0AIAkQvAsLIAkgBTYCACAHIAspAgA3AgAgByALKAIINgIICyABIAEoArQBIgU2AqwBIAEgASgCsAEiDzYCqAEgBCADKQNANwIAIAQgAygCSDYCCCAQDQEgAS0AuAFB/wFxQQVHDQEgA0G6gICAeDYCQCABIA8gBSADQcAAahDqHQwBCwsgASgCtAEhBCABKAKwASEIIANBoAJqIAUQxiUgA0GPAq1CIIZB/OOaAa2ENwO4ASADQcAAakHNlYABIANBuAFqEK8QIAMgAykCoAI3AkwgAyADKAKoAjYCVCAIIAQgA0HAAGoQwBshDyABLQC4AUGiAUcNACABIAEQhQ4QkwkLIABBBzYCACAAIA82AgQgAygC3AEiASACEOcdIAMoAtgBIAEQ8iMMDAtBACEFIAEtALgBQQpHDQoLAkACQCABKAKIASICQQtHDQAgA0HAAGogARDGAQwBCyABQQs2AogBIAMgCikCADcDQCADIAooAgg2AkgCQCABKAIIQQpGDQAgCRC8CwsgCSACNgIAIAcgCykCADcCACAHIAsoAgg2AggLIAEgASgCtAEiAjYCrAEgASABKAKwATYCqAEgBCADKQNANwIAIAQgAygCSDYCCEEBIQUMCQsgASABKAJ4IgxB//97cTYCeCABQbABaiEPIAEoArABIQsCQAJAIAEoAogBIgJBC0cNACADQcAAaiABEMYBDAELIAFBCzYCiAEgAyABKQKYATcDQCADIAEoAqABNgJIIAFBjAFqIQUCQCABKAIIQQpGDQAgAUEIahC8CwsgASACNgIIIAEgBSkCADcCDCABIAUoAgg2AhQLIAEpA7ABIRYgDyADKQNANwIAIA8gAygCSDYCCCABIBY3A6gBIANBwABqQQhBCEE4EIMPIAMoAkQhBQJAIAMoAkBBAUYNAEEAIQIgA0EANgI8IAMgAygCSCIJNgI4IAMgBTYCNCABLQC4ASIEQQNGDQggAUEMaiENIAFBCGohESABQZgBaiEGIAFBjAFqIRAgA0H4AWpBCGohCCADQfgBakEEaiESIANB0ABqIRMgA0HYAWpBCGohDiADQcAAakEIaiEFIANBwABqQQRyIRQDQCAPKAIAIQcCQAJAAkACQAJAAkACQAJAAkACQCAEQf8BcUEcRw0AAkACQCABKAKIASICQQtHDQAgA0H4AWogARDGAQwBCyABQQs2AogBIAMgBikCADcD+AEgAyAGKAIINgKAAgJAIAEoAghBCkYNACARELwLCyARIAI2AgAgDSAQKQIANwIAIA0gECgCCDYCCAsgASABKAK0ASIKNgKsASABIAEoArABNgKoASAPIAMpA/gBNwIAIA8gAygCgAI2AgggA0H4AWogAUEAEHMgAygC/AEhBCADKAL4ASIVQQdHDQEMEQsgA0H4AWogARCKAiADKAL8ASEEIAMoAvgBIgJBBUYNECAOIAgpAxA3AxAgDiAIKQMINwMIIA4gCCkDADcDACADIAQ2AtwBIAMgAjYC2AECQAJAIAEtALgBIgRBCUcNAAJAAkAgASgCiAEiBEELRw0AIANB+AFqIAEQxgEMAQsgAUELNgKIASADIAYpAgA3A/gBIAMgBigCCDYCgAICQCABKAIIQQpGDQAgERC8CwsgESAENgIAIA0gECkCADcCACANIBAoAgg2AggLIAEpA7ABIRYgDyADKQP4ATcCACAPIAMoAoACNgIIIAEgFjcDqAEgA0H4AWogARCnBSADKAL8ASEEIAMoAvgBIgdBB0cNASADIAQ2AkQgA0EDNgJAIAINBiADKQPgASIWQgODQgBSDQcgFqciAiACKAIAIgRBf2o2AgAgBEEBRw0HIAIgAigCEBDsHgwHCyACRQ0EIANB+AFqQQRyIAQQxiUgA0ENNgKMAiADQayJmwE2AogCIANBsICAgHg2AvgBIAEoArABIAEoArQBIANB+AFqEMAbIQICQCABLQC4AUGiAUcNACABIAEQhQ4QkwkLIANBAzYCQCADIAI2AkQMBQsgAyAIKQMYNwO4AiADIAgpAxA3A7ACIAMgCCkDCDcDqAIgAyAIKQMANwOgAkEoEIoBIgJFDQEgAiAENgIEIAIgBzYCACACIAMpA6ACNwMIIAIgAykDqAI3AxAgAiADKQOwAjcDGCACIAMpA7gCNwMgIBIgAykD8AE3AhggEiADKQPoATcCECASIAMpA+ABNwIIIBIgAykD2AE3AgAgFCADKQL4ATcCACAUIAMpAoACNwIIIBQgAykCiAI3AhAgFCADKQKQAjcCGCAUIAMoApgCNgIgQQAhCiADQQA2AkAgAyACNgJoDAcLIAMgCCkDGDcD0AEgAyAIKQMQNwPIASADIAgpAwg3A8ABIAMgCCkDADcDuAFBKBCKASICRQ0BIAIgBDYCBCACIBU2AgAgAiADKQO4ATcDCCACIAMpA8ABNwMQIAIgAykDyAE3AxggAiADKQPQATcDICADQQA2AlggAyAKNgJUIAMgBzYCUCADIAc2AkggAyACNgJEIANBAjYCQCADIAEoAqwBNgJMDAQLQQhBKBCgJAALQQhBKBCgJAALIAMpA+gBIRcgAykD4AEhFgJAIARBF0YNAEEAIQQMAwsCQAJAIAEoAogBIgJBC0cNACADQfgBaiABEMYBDAELIAFBCzYCiAEgAyAGKQIANwP4ASADIAYoAgg2AoACAkAgASgCCEEKRg0AIBEQvAsLIBEgAjYCACANIBApAgA3AgAgDSAQKAIINgIICyABKQOwASEYIA8gAykD+AE3AgAgDyADKAKAAjYCCCABIBg3A6gBIAEgASgCeCICQcAAcjYCeAJAAkAgAS0AuAFBPkcNACABLQCBAUEgcUUNACABEPsEIgRFDQBBACEKDAELIANBCGogARCAASADKAIMIQQgAygCCCEKCyABIAI2AnggCkEBRw0CIANBAzYCQCADIAQ2AkQgFkIDg0IAUg0NIBanIgIgAigCACIEQX9qNgIAAkAgBEEBRw0AIAIgAigCEBDsHgsgAygC2AFFDQELIANB2AFqEMsOCyADKAJEIQQgAygCQCIKQQNHDQIgAygCOCEJDAsLIAEoAqwBIQIgAyAXNwOAAiADIBY3A/gBIBMgA0H4AWoQ/h4gAyAENgJwIAMgAjYCTCADIAc2AkhBASEKIANBATYCQAsgAygCRCEECyADIAUpAyg3A6ABIAMgBSkDIDcDmAEgAyAFKQMYNwOQASADIAUpAxA3A4gBIAMgBSkDCDcDgAEgAyAFKQMANwN4AkAgAygCPCIHIAMoAjRHDQAgA0E0ahC4GgsgAygCOCIJIAdBOGxqIgIgAykDoAE3AzAgAiADKQOYATcDKCACIAMpA5ABNwMgIAIgAykDiAE3AxggAiADKQOAATcDECACIAMpA3g3AwggAiAENgIEIAIgCjYCACADIAdBAWo2AjxBACECAkACQCABLQC4ASIEQX1qDgULAQEBAAELAkACQCABKAKIASICQQtHDQAgA0HAAGogARDGAQwBCyABQQs2AogBIAMgBikCADcDQCADIAYoAgg2AkgCQCABKAIIQQpGDQAgERC8CwsgESACNgIAIA0gECkCADcCACANIBAoAgg2AggLIAEgASgCtAEiCjYCrAEgASABKAKwASIHNgKoASAPIAMpA0A3AgAgDyADKAJINgIIQQEhAiABLQC4ASIEQQNHDQEMCgsLIAEoArQBIQIgASgCsAEhBSADQawBaiAEEMYlIANBjwKtQiCGQfzjmgGthDcD+AEgA0HAAGpBzZWAASADQfgBahCvECADIAMpAqwBNwJMIAMgAygCtAE2AlQgBSACIANBwABqEMAbIQQgAS0AuAFBogFHDQcgARDEFCECIAEQshAgASACEJMJDAcLIAUgAygCSBD8IAALQQhBKBCgJAALIANBEGogASACELoGAkAgAy0AJEECRg0AIAMgAykDEDcCRCAAIAMpAkA3AgQgAyADKQMYNwJMIAAgAykCSDcCDCADIAMpAyA3AlQgACADKQJQNwIUIAMgAykDKDcCXCAAIAMpAlg3AhwgACADKAJgNgIkIABBADYCAAwICyAAIAMoAhA2AgQgAEEHNgIADAcLIARBogFGDQELIANBwABqQQRyIAQQxiUgA0EcNgJUIANBpI2bATYCUCADQbCAgIB4NgJAIAEoArABIAEoArQBIANBwABqEMAbIQICQCABLQC4AUGiAUcNACABIAEQhQ4QkwkLIABBBzYCACAAIAI2AgQMBQsgASkDCCEWIAFBCjYCCCADIAEpAxA3A0ggAyAWNwNAAkACQCAWpyICQQpGDQAgAkEJRg0BIANBwABqELwLC0GI85oBQShBwIebARC3IQALIAMoAkQhAgJAAkAgASgCiAEiBUELRw0AIANBwABqIAEQxgEMAQsgAUELNgKIASABIAU2AgggASABKQKMATcCDCABIAEoApQBNgIUIAMgASkCmAE3A0AgAyABKAKgATYCSAsgASADKAJINgK4ASABIAEpA7ABNwOoASABIAMpA0A3ArABIABBBzYCACAAIAI2AgQMBAsgAyAENgJECyAAQQc2AgAgACAENgIEIANBNGoQmhEgAygCNCAJEPUjIAEgDDYCeAwCCwJAAkAgASgCiAEiBUELRw0AIANBwABqIAEQxgEMAQsgAUELNgKIASADIAEpApgBNwNAIAMgASgCoAE2AkggAUGMAWohBAJAIAEoAghBCkYNACABQQhqELwLCyABIAU2AgggASAEKQIANwIMIAEgBCgCCDYCFAsgASABKAK0ASIJNgKsASABIAEoArABNgKoASAPIAMpA0A3AgAgDyADKAJINgIIIAMgAykCNDcDQCADIAMoAjwiBTYCSCADIAo2AmAgAyAHNgJcIAMgAjYCWCADIAk2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NgL0ASANIAkgA0HgAWoQwBshESABLQC4AUGiAUcNCCABIAEQhQ4QkwkMCAsgASgCtAEhCSABKAKwASEKIANB3AJqIAUQxiUgA0GPAq1CIIZBn7aBAa2ENwPoAiADQeABakHNlYABIANB6AJqEM0IIAMgAykC3AI3AuwBIAMgAygC5AI2AvQBIAogCSADQeABahDAGyEFAkAgAS0AuAFBogFHDQAgASABEIUOEJMJCwJAIAxFDQAgDBCtDyAMKAIAIAxBBGooAgAQ9CMgDEEUQQQQ1BQLIAUhDAwICwJAAkAgASgCiAEiBUELRw0AIANB4AFqIAEQxgEMAQsgAUELNgKIASADIAEpApgBNwPgASADIAEoAqABNgLoASABQYwBaiEJAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBTYCCCABIAkpAgA3AgwgASAJKAIINgIUCyABKQOwASEVIA8gAykD4AE3AgAgDyADKALoATYCCCABIBU3A6gBQQAhBUEAIRECQCABLQCBAUEgcUUNAEEAIREgAS0AuAFB/wFxQQlHDQAgASABKAJ4IglBgCByNgJ4IANBCToA4AEgA0EQaiADQeABaiABEIUCIAMoAhAhDSABIAk2AnggAygCFCERIA1BAXENBwsgEEEGdCENAkADQCANIAVGIg8NASAKIAVqIQkgBUHAAGohBSAJKAIARQ0ACwsgA0HgAWogAUEAQQAgDxDbBCADKALkASENAkAgAygC4AEiD0GBgICAeEcNAAJAIBENACANIREMCAsgESgCACIFEKcEIAVB4ABBCBDUFCARQQxBBBDUFCANIREMBwsgAyADKQLwATcDSCADIAMpAugBNwNAIA9BgICAgHhHDQUgASgCgAFBgMAAcUUNBSAQRQ0FIBBBBnQhCSAKIQUDQAJAIAUoAgBBBEcNACAFQRBqKAIAIRIgBUEMaigCACETIANBqoGAgHg2AuABIAEgEyASIANB4AFqEOodCyAFQcAAaiEFIAlBQGoiCUUNBgwACwsgCCgCACELIAEgBkH//G9xIgU2AnhBACEPAkAgAS0AgQFBIHFFDQAgASAFQYAgciIJNgJ4AkAgAS0AuAEiCkESRg0AIApBPkYNACABIAU2AngMAQsgASAJNgJ4IANBADoA6AIgA0EBOgDgASADQThqIANB6AJqIANB4AFqIAEQ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AwICAgACAgECCwJAAkAgASgCiAEiBEELRw0AIAJBgAJqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwOAAiACIAEoAqABNgKIAiABQYwBaiEDAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBDYCCCABIAMpAgA3AgwgASADKAIINgIUCyABIAIoAogCNgK4ASABIAEoArQBNgKsASABIAEoArABIgU2AqgBIAEgAikDgAI3ArABIAEtALgBQQhHDQMgAUGwAWohBAJAAkAgASgCiAEiA0ELRw0AIAJBgAJqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwOAAiACIAEoAqABNgKIAiABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgAzYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABKQOwASENIAQgAikDgAI3AgAgBCACKAKIAjYCCCABIA03A6gBIAEtALgBIgNBoAFHDQcgASgCiAEiA0ELRw0EIAJBgAJqIAEQxgEMBQsCQAJAIAEoAogBIgRBC0cNACACQYACaiABEMYBDAELIAFBCzYCiAEgAiABKQKYATcDgAIgAiABKAKgATYCiAIgAUGMAWohAwJAIAEoAghBCkYNACABQQhqELwLCyABIAQ2AgggASADKQIANwIMIAEgAygCCDYCFAsgASACKAKIAjYCuAEgASABKAK0ASIFNgKsASABIAEoArABIgQ2AqgBIAEgAikDgAI3ArABQQEhAyACQfgAaiABIAQgBCAFQQEQswIgAigCfCEEIAIoAnhBAUYNGSACQfAAaiABIARBARBBIAIoAnQhBCACKAJwIQMMGQsgAUGwAWohByABKALcASEIIAEoArABIQYCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAw55ACIGIgEiIiIiIiIiIiIiIgIiIiIiIiIiIiIiIiIiIiIiIgIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIgoKCiIiCAkiIiIiIiIiIiIiIiIiIiIiIiIiCiIiAyIiIiIiIgoiIiIEIgoiIiIiIiIiIiIiIiIiBSILIAJBADYCgAIgAkEwaiABIAggBkYgAkGAAmoQRiACKAI0IQQgAigCMCEFDCILIAEgASgCeCIEQf//e3E2AnggAkE4aiABEKkCIAIoAjghBSABIAQ2AnggAigCPCEEDCELIAEgBjYCBCABQQE2AgACQAJAIAEoAogBIgRBC0cNACACQYACaiABEMYBDAELIAFBCzYCiAEgAiABKQKYATcDgAIgAiABKAKgATYCiAIgAUGMAWohAwJAIAEoAghBCkYNACABQQhqELwLCyABIAQ2AgggASADKQIANwIMIAEgAygCCDYCFAsgASkDsAEhDSAHIAIpA4ACNwIAIAcgAigCiAI2AgggASANNwOoASABLQC4ASIDQcMARw0fIAFBADYCACABKAKwASEFIAEoArQBIQMgASkDCCENIAFBCjYCCCACIAEpAxA3A4gCIAIgDTcDgAIgDaciBEEKRg0PIARBBkcNDyACKAKEAiEEIAJBgAJqELwLIAVBAWoiBSABKAJsIghJDRAgBCABKAJwSw0QQgEhDSABKAJgIAUgCGtqIAQgBWsQhhkhDgJAIAMgBEEBaiIESQ0AIAQgASgCbCIFSQ0SIAMgASgCcEsNEiABKAJgIAQgBWtqIAMgBGsQhhkhDQsCQAJAIAEoAogBIgRBC0cNACACQYACaiABEMYBDAELIAFBCzYCiAEgAiABKQKYATcDgAIgAiABKAKgATYCiAIgAUGMAWohAwJAIAEoAghBCkYNACABQQhqELwLCyABIAQ2AgggASADKQIANwIMIAEgAygCCDYCFAsgASABKAK0ASIDNgKsASABIAEoArABNgKoASAHIAIpA4ACNwIAIAcgAigCiAI2AghBwAAQigEiBA0EQQhBwAAQoCQACyACQcAAaiABEMcMIAIoAkQhBCACKAJAIQUMHwtBACEFIAEgBhDmDSEEDB4LIAJByABqIAEgCCAGRhDeASACKAJIIgVBAkYNGyACKAJMIQQMHQsgASABKAJ4IgRB//97cTYCeCACQYgBaiABEJUBIAEgBDYCeCACKAKIAUEyRg0ZQQhBwAAQ4iAiBCACKQPAATcDOCAEIAIpA7gBNwMwIAQgAikDsAE3AyggBCACKQOoATcDICAEIAIpA6ABNwMYIAQgAikDmAE3AxAgBCACKQOQATcDCCAEIAIpA4gBNwMADAQLIAQgAzYCJCAEIAY2AiAgBCANNwMYIAQgDjcDECAEQQU2AgggBEEbNgIADAMLQQAhBSACQYACaiABQQAQqgcgAigChAIhBCACKAKAAiIGQYCAgIB4Rg0W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IAMtAChBBEYNACADKQMoIg1C/wGDQgRSDQELIANBADYCQCADQShqIAIgA0HAAGpB/+6aAUEEEOoNAkAgAy0AKEEERg0AIAMpAygiDUL/AYNCBFINAQsgA0EoaiACENUQAkAgAy0AKEEERg0AIAMpAygiDUL/AYNCBFINAQsgA0EoaiABIAIQihYCQCADLQAoQQRGDQAgAykDKCINQv8Bg0IEUg0BCwJAIAItAF0NACADQShqIAIQ1RAgAy0AKEEERg0AIAMpAygiDUL/AYNCBFINAQsgA0EoaiACIANBwABqQf/qmgFBARDrDQJAIAMtAChBBEYNACADKQMoIg1C/wGDQgRSDQELIAEoAiQhBSADQShqIAIgCSABKAIoIgxB0QAgDBD9GgJAAkACQCADLQAoQQVGDQAgAykDKCENDAELAkACQAJAAkAgDEUNAAJAIAItAF0NACADQShqIAIQsxQgAy0AKEEERg0AIAMpAygiDUL/AYNCBFINBQsgA0EAOgBPIAItAF1FDQEMAgsgAi0AXQ0CIANBKGogAhCzFCADLQAoQQRGDQIgAykDKCINQv8Bg0IEUQ0CDAMLIAIgAigCOEEBajYCOAsgA0EAOgA4IAVBKGohASAMIQVBACEGA0ACQAJAAkACQAJAAkAgBUUNACABQXxqKAIAIQogA0EoaiACIARB0QAgBiALIANBOGogA0HPAGoQjAYCQCADLQAoQQRGDQAgAykDKCINQv8Bg0IEUg0JCyADQShqIAIgAUF4aigCAEEAELUCAkAgAy0AKEEERg0AIAMpAygiDUL/AYNCBFINBQsgAUFgaiELIAFBWGopAwBCAVINASADQShqIAsgAhCRASADLQAoQQRGDQMgAykDKCINQv8Bg0IEUg0CDAMLIANBKGogAiAJIARB0QAgBiALEO4CIAMtAChBBEYNBiADKQMoIg1C/wGDQgRSDQcMBgsgA0EoaiALIAIQihYgAy0AKEEERg0BIAMpAygiDUL/AYNCBFENAQsgDUL/AYNCBFINAQsgASgCAEUNAQJAIAItAF0NACADQShqIAIQ1RAgAy0AKEEERg0AIAMpAygiDUL/AYNCBFINAQsgA0EANgIoIANBGGogAiADQShqQfXsmgFBARDrDQJAIAMtABhBBEYNACADKQMYIg1C/wGDQgRSDQELAkAgAi0AXQ0A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QQAgAUEoQZSEggEQjwoAC0EAIAlBKEGUhIIBEI8KAAtBKEEoQZSEggEQ9RYAC0EAIAxBKEGUhIIBEI8KAAtBKEEoQZSEggEQ9RYAC0EoQShBlISCARD1FgALQfeDggFBGkGUhIIBELchAAtBACAQQShBlISCARCPCgALQfeDggFBGkGUhIIBELchAAtBACAaQShBlISCARCPCgALQfeDggFBGkGUhIIBELchAAtBACAQQShBlISCARCPCgALQfeDggFBGkGUhIIBELchAAtBACABQShBlISCARCPCgALQShBKEGUhIIBEPUWAAtBACABQShBlISCARCPCgALQRFBEUH4hoMBEPUWAAtBKEEoQZSEggEQ9RYAC0EoQShBlISCARD1FgALQShBKEGUhIIBEPUWAAtBACABQShBlISCARCPCgALIBhBEE0NAEEAIBdBEUGYh4MBEI8KAAsgACAGOwEIIAAgFzYCBCAAIAI2AgAgA0GwCmokAAudIAIMfwN+IwBBwABrIgUkACABKAIAIQYCQAJAAkACQAJAIAIOAwEAAgELIAYoAoAFQbACaiEHDAILIAYoAoAFQbQCaiEHDAELAkAgBi0AWUEBcUUNAAJAIAMgBigCgAUiBygC3AJPDQAgBygC2AIgA0ECdGohBwwCCyAGQYQFaigCABCZGCEHIABBBTYCACAAIAc2AgQMAgsgACADrUIghkIChDcCAAwBCyAHKAIAIQggASgCBCIHKQKkASERIAdCgICAgBA3AqQBIAcoAqwBIQkgB0EANgKsASAFIBE3AzAgBSAJNgI4IAVBMGpBtOqEAUG96oQBEN8UIAUgBSgCODYCKCAFIAUpAzA3AyAgBigCgAUiCigCuAIhCSAKLQDgAiELIAotAOQCIQoCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIARB/wFxDgYAAQIDBAUACyAJQcD/D3FFDTggBSgCJCIJIAUoAigiChCQHCELIApFDQUgCkF/aiIMRQ0GIAkgCzoAASAMQQFGDQcgCSALQYCA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AgQhCiACKAIIIQFBACEDIAJBADYC6AEgAkKAgICAEDcC4AEgAUUNAiAKIAFBHGxqIQlBASELIAohAQNAAkAgASgCAEEBRg0AIAIoAuABIQQMBgsgAigC4AEhBCABQQhqKAIAQQFHDQUgAUEEaigCAC0AACEHAkAgAyAERw0AIAJB4AFqENMTIAIoAuQBIQsLIAsgA2ogBzoAACACIANBAWoiAzYC6AEgAUEcaiIBIAlHDQALIAIoAuABIgxBgICAgHhGDQUgAikC5AEhDQwDC0GI2IkBEMMjAAsgAyACKAKgARD8IAALIAIpAuQBIQ1BACEMCyACQZgBaiANQiCIIg6nIgtBAUECEKwRIAIoApwBIQQCQCACKAKYAUEBRg0AIAJB5AFqIQggDachB0EAIQMgAkEANgJYIAIgAigCoAEiATYCVCACIAQ2AlACQCAOUA0AQQAhAwNAIAFBAWogByADai0AACIEOgAAIAEgBDoAACABQQJqIQEgCyADQQFqIgNHDQALCyAMIAdBAUEBENcTIAIgAikDUDcDmAEgAiADNgKgASACIANFOgCkASACQZgBahDRBSAIIAIpA6ABNwIIIAggAikDmAE3AgAgAkEBNgLgASAAIAJB4AFqEN0KDAQLIAQgAigCoAEQ/CAACyAEIAtBAUEBENcTCyACQQA2AugBIAJCgICAgMAANwLgASACQdAAaiACQeABahDSGCACQeABakEEciEMIAJBmAFqQQRqIQUgCiELAkACQANAIAsoAgBBAkcNAgJAAkAgCygCBEEBRw0AIAtBEGooAgAiA0EBdCEIIAtBDGooAgAhAQJAIANFDQAgASAIaiIEQX5qRQ0AIARBf2osAABBAEgNBQsgAkHgAWogA0H/////B3EiB0EEQQgQrBEgAigC5AEhBiACKALgAUEBRg0DQQAhBCACQQA2ApABIAIgAigC6AEiAzYCjAEgAiAGNgKIAQJAIAhFDQBBACEEA0AgAyABLQAANgIAIANBBGogAUEBai0AADYCACADQQhqIQMgAUECaiEBIAcgBEEBaiIERw0ACwsgAiACKQOIATcD4AEgAiAENgLoASACIARFOgDsASACQeABahDfBSACIAwpAgA3A9ABIAIgDCgCCDYC2AEgAigC4AEiAUGAgICAeEYNBCAFIAIoAtgBNgIIIAUgAikD0AE3AgAgAiABNgKYASACQdAAaiACQZgBahDnDCABIAIoApwBQQRBCBDXEwwBCyACQdAAaiALQQhqEOcMCyALQRxqIgsgCUcNAAsgAiACKQJYNwI0IAIgAikCUDcCLCACQQA2AiggACACQShqEN0KDAMLIAYgAigC6AEQ/CAACyACKAJQIAIoAlRBBEEIENcTIAJBADYC6AEgAkKAgICAEDcC4AEgAkHQAGogAkHgAWoQ0RggAkHgAWpBBHIhDCACQZgBakEEaiEFAkACQAJAAkADQCAKKAIAQQJHDQQCQAJAIAooAgRBAUcNACACQdAAaiAKQQhqEMMMDAELIApBEGooAgAiA0EDdCEHIApBDGooAgAhAQJAIANFDQAgASAHaiIEQXhqRQ0AIARBfGooAgBB/wBLDQYLIAJB4AFqIANB/////wFxIghBAUECEKwRIAIoAuQBIQsgAigC4AFBAUYNAkEAIQQgAkEANgKQASACIAIoAugBIgM2AowBIAIgCzYCiAECQCAHRQ0AQQAhBANAIAEoAgAiB0GAAk8NBSABQQRqKAIAIgtBgAJPDQYgAyAHOgAAIANBAWogCzoAACADQQJqIQMgAUEIaiEBIAggBEEBaiIERw0ACwsgAiACKQOIATcD4AEgAiAENgLoASACIARFOgDsASACQeABahDRBSACIAwpAgA3A9ABIAIgDCgCCDYC2AEgAigC4AEiAUGAgICAeEYNBSAFIAIoAtgBNgIIIAUgAikD0AE3AgAgAiABNgKYASACQdAAaiACQZgBahDDDCABIAIoApwBQQFBAhDXEwsgCkEcaiIKIAlHDQALIAIgAikCWDcCSCACIAIpAlA3AkAgAkEBNgI8IAAgAkE8ahDdCgwFCyALIAIoAugBEPwgAAtB1P2aAUErIAJB/wFqQZjihgFBmLGFARDVFAALQdT9mgFBKyACQf8BakGY4oYBQaixhQEQ1RQACyACKAJQIAIoAlRBAUECENcTAkACQAJAAkAgAigCCCIBQQJJDQAgAigCBCIDKAIAQQZHDQAgAygCDCIERQ0AIAMoAgghDCADIAFBHGxqIQlBACEBIAMhCkEBIQcDQAJAAkAgAUEBcUUNACAKIQEgCiAJRw0BDAULIAcgCSAKa0Ecbk8NBCAKIAdBHGxqIQELIAEoAgBBBkcNASABKAIMIgdFDQEgAUEcaiEKIAcgBCAHIARJGyEIIAEoAgghAUEAIQsgDCEHAkACQANAIAcgARCJBUUNASAHQRxqIQcgAUEcaiEBIAggC0EBaiILRw0ACyAIIQQMAQsgCyAESw0DIAshBAtBACEHQQEhASAEDQALCyACIAIoAgg2AlwgAiACKQIANwJUDAILQQAgCyAEQazuiQEQjwoACyACQQA2AnggAkKAgICAwAA3AnAgAkEANgKEASACQoCAgIDAADcCfCACKAIAIQEgAiAJNgKUASACIAE2ApABIAIgAzYCiAEgAkGYAWpBBGohCkEAIQdBASELQQQhBgJAA0ACQAJAIAMgB2oiASgCACIIQQhGDQAgCiABQRRqKQIANwIQIAogAUEMaiIMKQIANwIIIAogAUEEaiIFKQIANwIAIAJBADYCmAEgAiAMKAIANgLoASACIAUpAgA3A+ABIAJBmAFqEMohIAhBBkYNAUGI85oBQShBnO6JARC3IQALIAFBHGohCQwCCyACIAIoAugBIgg2AsABIAIgAikD4AE3A7gBAkACQCAIIARJDQAgAkHgAWogCCAEayIIQQRBHBCsESACKALkASEMIAIoAuABQQFHDQEgDCACKALoARD8IAALIAQgCBD7FgALIAIgAigC6AEiBTYCyAEgAiAMNgLEASACIAg2AswBIAIgBDYCwAECQCAIQRxsIghFDQAgBSACKAK8ASAEQRxsaiAI/AoAAAsgAkHgAWogAkHEAWoQ1gECQCALQX9qIAIoAnxHDQAgAkH8AGoQmxogAigCgAEhBgsgBiAHaiIIIAIpAuABNwIAIAggAigC+AE2AhggCCACKQLwATcCECAIIAIpAugBNwIIIAIgCzYChAECQAJAIAIoAnhFDQAgAkG4AWoQlRsMAQsgAkHwAGoQlRsgAiACKALAATYCeCACIAIpA7gBNwNwCyAHQRxqIQcgC0EBaiELIAFBHGogCUcNAAsLIAIgCTYCjAEgAkGIAWoQ1hggAiACKQNwNwPQASACIAIoAng2AtgBIAJB4AFqIAJB/ABqEI8BAkAgAigC2AEiAyACKALQAUcNACACQdABahCbGgsgAigC1AEgA0EcbGoiASACKQLgATcCACABIAIpAugBNwIIIAEgAikC8AE3AhAgASACKAL4ATYCGCACIANBAWo2AtgBIAJB0ABqIAJB0AFqENYB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AAALIAMgBjYC4AEgAyABNgLcASADIAQ2AtgBDAELIANBADYA7wEgA0IANwPoASADIAFBwAFyOgDzAQJAIAFFDQAgA0HoAWogBSAB/AoAAAsgAyADKALwATYC4AEgAyADKQPoATcD2AELIAMgAykC0AE3A4ACIAMgAykCyAE3A/gBIAMgAykCwAE3A/ABIAMgAykCuAE3A+gBIANBADYCiAIgA0HwAWohBwNAIAMoAugBIQEgA0ECNgLoAQJAAkAgAUECRg0AIAMoAuwBIQUMAQsgA0EoaiAHEIYJIAMoAiwhBSADKAIoIQELAkAgAUEBRw0AIAMgAygCiAJBAWoiATYCiAIgA0EQaiADQdgBahCNGwJAIAEgBWoiAUUNAAJAIAEgAygCFCIFTw0AIAMoAhAgAWosAABBv39KDQEMBgsgASAFRw0FCyADLQDjASEEIAMoAtwBIQYgA0HYAWpBARChCCADQQhqIANB2AFqELUYIAMoAgggAWohBQJAIAYgBEHAAGpB/wFxIglBDCAJQQxJGyAEQf4BRhsiBCABayIBRQ0AIAVBAWogBSAB/AoAAAsgBUHcADoAACAEQQFqIQECQCADLQDjAUH+AUcNACADIAE2AtwBDAILIAFBC0sNASADIAFBwAFyOgDjAQwBCwsgAyADKQPYATcDqAEgAyADKALgATYCsAEMAQsgA0H/AToAswEgAyABNgKsASADIAU2AqgBCyADQSBqIANBqAFqEKAWIANBuAFqIAMoAiAgAygCJEHX7JoBQQRB2+yaAUEHEMoNIANB2AFqIAMoArwBIgkgAygCwAFB4uyaAUEDQeXsmgFBBhDKDQJAAkACQAJAIAMoAtgBIgVB/v//B0sNACAFDQFBACEBQYCAgIB8IQcgAygC3AEhBEEAIQYMAgsgAygC3AEhBCADQegBaiADKALgASIBEMUOIAMoAugBIQcgAygC7AEhBiABRQ0BIAYgBCAB/AoAAAwBCyADKALcASEEAkAgAygC4AEiAUEMTQ0AIAVB////ByAFQf///wdJG0GAgIBwciEHIAQhBgwCCyADQQA2AO8BIANCADcD6AEgAyABQcABcjoA8wECQCABRQ0AIANB6AFqIAQgAfwKAAALIAMoAvABIQcgAygC7AEhASADKALoASEGCyAFIAQQvRQLIANBnAFqEOcgIAMgBzYCpAEgAyABNgKgASADIAY2ApwBIAMoArgBIAkQ0yUgA0GoAWoQ5yAMAQtB6OiBAUE7QYjpgQEQ5BsACyADIAw6ALgBIANB6AFqIAIgA0G4AWpBARDUDwJAAkAgAy0A6AFBBEYNACADKQPoASINQv8Bg0IEUg0BCyADQRhqIANBnAFqEKAWIANB6AFqIAJBAEEAIAMoAhggAygCHBD/DgJAIAMtAOgBQQRGDQAgAykD6AEiDUL/AYNCBFINAQsgA0HoAWogAiADQbgBakEBENQPAkAgAy0A6AFBBEYNACADKQPoASINQv8Bg0IEUg0BCyAAQQQ6AAAgA0GcAWoQ5yAMAQsgACANNwIAIANBnAFqEOcgCyADQZACaiQAC+EhAhx/Bn4jAEHgBGsiAyQAIAEgASgCeCIEQf+/f3E2AnggASgCwAEhBQJAAkAgAUESEK4OIgZFDQAgAEGBgICAeDYCkAEgACAGNgIADAELIAFBwAFqIQcgARC7FgJAAkACQAJAAkACQAJAAkACQAJAIAEtAMgBQRNGDQAgASABKAJ4IgZB/79/cTYCeCADQaACaiABEJMGIAEgBjYCeCADKAKgAiEIIAMtAMwCIglBBkcNASAAQYGAgIB4NgKQASAAIAg2AgAMCgsgARDdGyABKAK8ASEIIANBwAFqIAEQ6wIgASgCwAEhCQJAAkAgAUE8EK4OIgYNAAJAIAEtAMgBIgZBW2oiCkESSw0AQQEgCnRBg4AacUUNACADQaACaiABIAEoAsABEM0aIAcgAygCqAI2AgggByADKQKgAjcCACABLQDIASEGCyADQRM6AFggBkH/AXFBE0YNASABKALEASEIIAEoAsABIQkgA0HQA2ogBhDXJSADQY8CrUIghiADQdgAaq2ENwMYIANBoAJqQc2VgAEgA0EYahCFHyADIAMpAtADNwKsAiADIAMoAtgDNgK0AiAJIAggA0GgAmoQwBshBiABLQDIAUGiAUcNACABEM8UIQggARDlESABIAgQhhQLIABBgYCAgHg2ApABIAAgBjYCACADQcABahDjIgwKCyACDQEgASgCwAEhCiABKALEASEGIANBoAJqIAEQ9gEgASAGNgK8ASABIAo2ArgBIAcgAykCoAI3AgAgByADKAKoAjYCCAwCCyADQRhqQQRyIANBoAJqQQRyQSj8CgAAIAMgAy0AzwI6AEcgAyADLwDNAjsARSADIAk6AEQgAyAINgIYQQAhCwJAIAEtAIEBQSBxRQ0AIAEtAMgBQf8BcUESRw0AIANBoAJqIAEQzQUgASAGQQFyNgJ4IANBEGogARC9BSADKAIUIQsCQAJAIAMoAhBBAXENACABEOURAkAgCw0AIAEgA0GgAmoQthQMAgsgASABKAJ4QX5xIAZBAXFyNgJ4IANBoAJqELMiDAILIANBATYC0AMgAyALNgLUAyABIANBoAJqELYUIANB0ANqEPofC0EAIQsLIANBoAJqQQhBCEHYABCDDyADKAKkAiEGIAMoAqACQQFGDQIgAyADKAKoAiIMNgKIASADIAY2AoQBIAFBvAFqIQ1BjwKtQiCGIh9B3/SaAa2EISAgA0GgAmpBDGohDiADQbQDaiEPIANBoAJqQSRqIRAgA0HYAGpBCGohEUEAIQlBACEIAkADQCADIAg2AowBIAEQuxYCQCABLQDIASIGQXBqDgQCAAACAAsCQAJAIAZBAkYNACABKALAASESIAEQghIgA0GgAmogARCtCyADKAKgAiEGIAMtALQCQQJGDQkgAygCrAIhCiADKAKoAiETIAMoAqQCIRQCQAJAIAEtAMgBQQlHDQAgARDlESABEIISIANBoAJqIAEQrQsCQCADLQC0AkECRw0AIAatISEgAygCoAIhBiAhIBStQiCGhBCaIQwMCyADIAMoAqACNgLQAyADIAMoAqQCNgLAASAKrUIghiATrYQhIiAUrUIghiAGrYQhISADKAKoAiEVIANB8AFqIQYgA0HYAGohFCASIRMgAygCrAIiFiEKDAELIBStQiCGIAathCEiIANBwAFqIQYgA0HQA2ohFEIAISELIAYgCjYCACAUIBM2AgAgAygC8AEhFyADKAJYIRggAzUC0AMhIyADNQLAASEkIAEgASgCeCIKQf//eXE2AnggIyAkQiCGhCEjQQQhEwJAAkACQCABLQDIAUEXRw0AIANBoAJqIAEQ4wEgASADQaACahCjDyAHIAMoAqgCNgIIIAcgAykCoAI3AgACQAJAAkAgAS0AyAEiBkECRg0AIAZBEkYNASAGQcAARg0CIAEoAsQBIQYgASgCwAEhCCADQdaAgIB4NgKgAiAIIAYgA0GgAmoQwBshBiABLQDIAUGiAUcNDiABIAEQnyMQhhQMDgsg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AikDqAE3AgAgAyACKAKwATYCCCABIBk3A6gBIAJBqAFqIAEQigIgAigCrAEhBSACKAKoASIIQQVHDQIgAiAFNgI8IAJBATYCOAwTCyABLQCBAUEgcUUNDiABEPsEIgVFDQ5BACEIDA8LIAJBqAFqIAEQqQggAi0AqAENASACLQCpASETIAEoAqwBIRUgASgCqAEhFiACIAEtALgBIgg6AH8gAkGoAWogARCKAiACKAKsASEFAkAgAigCqAEiFEEFRw0AIAIgBTYCPCACQQE2AjhBAUUNEAwSCyAOIA8pAxA3AxAgDiAPKQMINwMIIA4gDykDADcDACACIAU2AoQBIAIgFDYCgAEgAS0AuAEhBQJAAkACQAJAAkACQAJAAkAgAS0AgQFBIHFFDQAgBQ5rBQICAgYCAgYCAQYCAgICBgICAgICAgIGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGAgICAgICAgICBgICAgICAgICAgICAgICBgICAgICAgICAgYCAgICAgYCCyAFDgoEBQUFBQUFBQUABQsCQAJAIAEoAogBIgVBC0cNACACQagBaiABEMYBDAELIAFBCzYCiAEgAiALKQIANwOoASACIAsoAgg2ArABAkAgASgCCEEKRg0AIAoQvAsLIAogBTYCACAJIAwpAgA3AgAgCSAMKAIINgIICyABKQOwASEZIAMgAikDqAE3AgAgAyACKAKwATYCCCABIBk3A6gBIAEgASgCeCISQcAAcjYCeCABLQC4AUE+Rg0BDA4LIAVBEkYNASAFQbR/akH/AXFB1QBJDQECQCAUDQAgBUEDRw0AIAIoApQBIRcgAigCkAEhGCACKQOIASEZDAsLIAEoArQBIQUgASgCsAEhFCACQfaAgIB4NgKoASABIBQgBSACQagBahDqHSABKAKsASEFQQhBwAAQ4iAiFCAFNgIIIBQgEjYCBCAUQTE2AgAgDSACKQOAATcCACANIAIpA4gBNwIIIA0gAikDkAE3AhAgDSACKQOYATcCGEEIQfAAEOIgIgVBBjYCACAFIBQ2AiggBSACKQKoATcCBCAFIAIpArABNwIMIAUgAikCuAE3AhQgBSACKQLAATcCHCAFIAIoAsgBNgIkIAIgBTYCQAwRCyABLQCBAUEgcUUNDCABEPsEIgVFDQxB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AigCBCABEOgJDAMLIAJBDGooAgAiBUUNAiAFQThsIQYgAkEIaigCACEHQQAhAgNAAkACQAJAAkAgByACaiIFKAIADgMAAQIACwJAIAVBCGooAgBBA0cNACABLQAAQQFxDQAgBUEMaigCACABEJgBCyAFQShqKAIAIAEQ6AkMAgsgBUEwaigCACIFRQ0BIAEtAABBAXENASAFIAEQmAEMAQsgBUEEaigCACABEOgJCyAGIAJBOGoiAkcNAAwDCwsgAigCBCABEOgJIAEtAAANASACKAIIIAEQmAEMAQsgAS0AAA0AIAIoAgQgARCYAQsgAyAERw0ADAILCwJAAkACQAJAAkACQAJAAkACQAJAIAIOCwoAAQIDBAUGBwgKCgsgAS0AAA0JIAAoAiggARCYASAAKAIIQQJHDQkgAS0AAEEBcQ0JIABBDGohAgwICyAAKAIIQQFHDQggAS0AAEEBcQ0IIABBDGohAgwHCyABLQAADQcgAEEEaiECDAYLAkAgACgCBCICKAIAIgNBA0cNACABLQAAQQFGDQcgAigCECABEJgBIAJBDGooAgAiA0UNByABLQAAQQFxDQcgA0EEdCEDIAJBCGooAgBBDGohAgNAAkAgAS0AAA0AIAIoAgAgARCYAQsgAkEQaiECIANBcGoiAw0ADAgLCyABLQAADQYgAigCICABEJgBIANBAkcNBiABLQAAQQFxDQYgAkEEaiECDAULIAEtAAANBSAAQQRqIQIMBAsgAS0AAA0EIABBBGohAgwDCyABLQAADQMgAEEEaiECDAILIAEtAAANAiAAQQRqIQIMAQsgAS0AAA0BIABBBGohAgsgAigCACABEJgBCyABLQAADRggACgCOCEADBYLIAEtAAANFyAAKAIoIAEQmAEgACgCCEECRw0XIAEtAABBAXENFyAAKAIMIQAMFQsgACgCCEEBRw0WIAEtAABBAXENFiAAKAIMIQAMFAsgAS0AAA0VIAAoAgQgARCYASABLQAADRUgACgCCCABEJgBIAEtAAANFSAAKAIMIQAMEwsCQCAALQAYQQVHDQACQAJAIAAoAhAiAigCAEEaRw0AIAJBCGpBl+SaAUEEELcdDQELIAEtAAANASACIAEQmAEMAQsgAUEBOgAACyAAKAIMIgJFDRQgAS0AAEEBcQ0UIAJBBHQhAiAAKAIIQQxqIQAD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NgIAIAkhBwwDCyADIAc2AjAgAyALNgJAAkAgCUUNACADQcAAahDJHiADQTBqEJEiIAEtALgBIQsMAQsgA0EoahC5ICADIAc2AigCQCALRQ0AIANBLGoQyR4gAyALNgIsIAshCiABLQC4ASELDAILIANBwABqEMkeIAEtALgBIQsMAQsgCSEHCwJAAkACQCALQf8BcUECRw0AAkACQCABKAKIASILQQtHDQAgA0HAAGogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A0AgAyABKAKgATYCSCABQYwBaiEJAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgCzYCCCABIAkpAgA3AgwgASAJKAIINgIUCyABKQOwASERIAYgAykDQDcCACAGIAMoAkg2AgggASARNwOoASAHRQ0BIAEgASgCeCILQYCAgAJyNgJ4IANBwABqIAEQUSABIAs2AnggAygCRCELIAMoAkAiCUGAgICAeEcNAiAAQQM6ABQgACALNgIADAMLIAEoArQBIQYgASgCsAEhCSADQTBqIAsQxiUgA0GPAq1CIIZB3vSaAa2ENwNYIANBwABqQc2VgAEgA0HYAGoQrxAgAyADKQIwNwJMIAMgAygCODYCVCAJIAYgA0HAAGoQwBshBgJAIAEtALgBQaIBRw0AIAEgARCFDhCTCQsgAEEDOgAUIAAgBjYCAAwCCyABIAEoAngiC0H///99cTYCeCADQcAAaiABEFEgASALNgJ4IAMoAkQhCyADKAJAIglBgICAgHhHDQAgAEEDOgAUIAAgCzYCAEEAIQcMAQsgAygCSCEPAkACQAJAAkAgAS0AuAEiDkEDRg0AIA5BowFHDQIgA0EwakGjARDGJSABKAK0ASEGIAEoArABIQ4gA0GPAq1CIIZB3/SaAa2ENwNYIANBwABqQc2VgAEgA0HYAGoQrxAgAyADKQIwNwJMIAMgAygCODYCVCABIA4gBiADQcAAahDqHSABKAKsASEODAELAkACQCABKAKIASIOQQtHDQAgA0HAAGogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A0AgAyABKAKgATYCSCABQYwBaiEQAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgDjYCCCABIBApAgA3AgwgASAQKAIINgIUCyABIAEoArQBIg42AqwBIAEgASgCsAE2AqgBIAYgAykDQDcCACAGIAMoAkg2AggLIAIoAhAoAgAhEEHAABCKASIGRQ0BIAYgAigCCDYCCCAGIAIpAgA3AgAgBiAJNgIMIAYgDzYCFCAGIAs2AhAgBkEAOgA8IAYgCjYCOCAGIAU2AjQgBiAHNgIwIAZBADYCLCAGIA42AiggBiAQNgIkIAYgDDYCICAGIAg2AhwgBiANNgIYIAAgAykDEDcDACAAIAMpAxg3AwggACADKQMgNwMQIAAgBjYCGEEAQQQQ+iNBAEEIEPgjQQBBBBDzIwwHCyABKAK0ASEGIAEoArABIRAgA0EwaiAOEMYlIANBjwKtQiCGQd/0mgGthDcDWCADQcAAakHNlYABIANB2ABqEM0IIAMgAykCMDcCTCADIAMoAjg2AlQgECAGIANBwABqEMAbIQYCQCABLQC4AUGiAUcNACABIAEQhQ4QkwkLIABBAzoAFCAAIAY2AgAgCyAPEKAfIAkgCxD4IwwBC0EEQcAAEKAkAAsgCCAMEJ0PIA0gCBDzIwsCQCAKRQ0AIAoQ9xsgCigCACAKQQRqKAIAEPEjIApBFEEEENQUCyAHRQ0AIAcQjAIgB0HAAEEIENQUCyAFRQ0AIAUQrQ8gBSgCACAFQQRqKAIAEPQjIAVBFEEEENQUCyADLQAkQQJGDQAgAykDECIRQgODQgBSDQAgEaciACAAKAIAIgVBf2o2AgAgBUEBRw0AIAAgACgCEBDsHgsgAigCBCIAIAIoAggQ6B0gAigCACAAEPojCyABIAQ2AnggA0HgAGokAAvkHwIlfwV+IwBBgANrIgIkACABKAKwASEDAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEtALgBIgRBBEcNACABQbABaiEEAkACQCABKAKIASIFQQtHDQAgAkGwAWogARDGAQwBCyABQQs2AogBIAIgASkCmAE3A7ABIAIgASgCoAE2ArgBIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahC8CwsgASAFNgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAFBiAFqIQYgASkDsAEhJyAEIAIpA7ABNwIAIAQgAigCuAE2AgggASAnNwOoASACQQA2AjggAkKAgICAgAE3AjAgAUEMaiEHIAFBCGohCCABQZgBaiEJIAFBjAFqIQpBjwKtQiCGIihBx/SaAa2EISkgAkGIAWpBCGohCyACQeACakEEaiEMIAJB4AJqQQxqIQ0gAkHkAWohDkEwIQ8gAkGwAWpBMGohECACQYgCaiERIAJBsAFqQQxqIRIgAkGwAWpBCGohEyACQcACakEEciEUQQghFUEAIRYCQANAIAEtALgBIgVBBUYNASABKAKwASEXAkACQCABLQCBAUEgcUUNAEEKIRggASgCGCEZIAEoAgQhGiABKAIAIRsgAS0AHCEcIAEoAngiHSEFAkAgASgCCEEKRg0AIAJBwAJqIAgQlAYgAiAUKQIANwPQAiACIBQoAgg2AtgCIAIoAsACIRggASgCeCEFCyABKAJoIR4gAS0AHSEfQQAhIEEAISECQCABKAIgQYCAgIB4Rg0AIAEoAjQhISABKAIoISALQQshIiAFISMCQCAGKAIAIiRBC0YNAEEKISIgBSEjAkAgJEEKRg0AIAJBwAJqIAYQlAYgAiAUKQIANwOYAiACIBQoAgg2AqACIAIoAsACISIgASgCeCEjCyANIAkoAgg2AgggDSAJKQIANwIAIAIgAikDmAI3A+ACIAIgAigCoAI2AugCCyASIAIpA9ACNwIAIBIgAigC2AI2AgggAiAYNgK4ASACIBo2ArQBIAIgGzYCsAEgAiAeNgLcASACIAU2AtgBIAIgITYC1AEgAiAgNgLQASACIB86AM0BIAIgHDoAzAEgAiAZNgLIASACIAEoAqwBIhs2AoQCIAIgASgCqAEiHDYCgAIgESAEKAIINgIIIBEgBCkDADcDACAOIAIpA+ACNwIAIA4gAikD6AI3AgggDiACKQPwAjcCECAOIAIoAvgCNgIYIAIgIjYC4AEgASAjQQFyNgJ4IAEoArABIRkCQCABLQC4ASIjQRxHDQACQAJAIAYoAgAiBUELRw0AIAJB4AJqIAEQxgEMAQsgBkELNgIAIAIgCSkCADcD4AIgAiAJKAIINgLoAgJAIAgoAgBBCkYNACAIELwLCyAIIAU2AgAgByAKKQIANwIAIAcgCigCCDYCCAsgASABKAK0ASIgNgKsASABIAEoArABIiE2AqgBIAQgAikD4AI3AgAgBCACKALoAjYCCAsgAkHAAmogARC2CAJAAkACQAJAIAIpA8ACIidCAFINACACKALIAiEFDAELIAJBADYCuAIgAiACKALMAiIeNgK0AiACIAIoAsgCIgU2ArACIAIgJ0IgiKciHzYCrAIgAkEAOgC8AiACICenIiQ2AqgCAkAgAS0AuAEiGkEKRw0AAkACQCAGKAIAIhpBC0cNACACQeACaiABEMYBDAELIAZBCzYCACACIAkpAgA3A+ACIAIgCSgCCDYC6AICQCAIKAIAQQpGDQAgCBC8CwsgCCAaNgIAIAcgCikCADcCACAHIAooAgg2AggLIAEgASgCtAEiGjYCrAEgASABKAKwATYCqAEgBCACKQPgAjcCACAEIAIoAugCNgIIIAJBAToAvAIgAiAFIBogBSAaSxsiHjYCtAIgAiAFIBogBSAaSRsiBTYCsAIgAS0AuAEhGgsCQCAaQf8BcUEJRw0AAkACQCAGKAIAIiVBC0cNACACQeACaiABEMYBDAELIAZBCzYCACACIAkpAgA3A+ACIAIgCSgCCDYC6AICQCAIKAIAQQpGDQAgCBC8CwsgCCAlNgIAIAcgCikCADcCACAHIAooAgg2AggLIAEgASgCtAEiGjYCrAEgASABKAKwATYCqAEgBCACKQPgAjcCACAEIAIoAugCNgIIICNBHEcNAiAMIAIpA7gCNwIQIAwgAikDsAI3AgggDCACKQOoAjcCAEEoEIoBIiVFDQogJUEANgIAICUgAikC4AI3AgQgJSACKQLoAjcCDCAlIAIpAvACNwIUICUgAigC+AI2AhwgJUEANgIgQQIhIwwDCyABKAK0ASEFIAEoArABISIgAkHQAmogGhDGJSACICk3A5gCIAJB4AJqQc2VgAEgAkGYAmoQrxAgDSACKALYAjYCCCANIAIpAtACNwIAICIgBSACQeACahDAGyEFAkAgAS0AuAFBogFHDQAgARDEFCEiIAEQshAgASAiEJMJCyACQagCahCaHAsgASACQbABahDLCCAEIBEoAgg2AgggBCARKQMANwMAAkAgASgCiAFBDnFBCkYNACAGELwLCyABIBs2AqwBIAEgHDYCqAEgBiAQKQMYNwMYIAYgECkDEDcDECAGIBApAwg3AwggBiAQKQMANwMAQQchIyACQQc2AogBIAVBCGoQ5gMgBUEgQQgQ1BQgAS0AuAEhBQwDC0EAISMgAigCvAIhJiAkIRkgHyEaIAUhISAeISALIAEgASgCeEF+cSAdQQFxcjYCeCACQQA2AqgBIAIgJjYCpAEgAkEANgKgASACICA2ApwB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CyANQRtqIQ0MBQsgDUEcaiENDAQLIA1BHWohDQwDCyANQR5qIQ0MAgsgDUEfaiENDAELIAYhDQsgASANIAxqIgY2AmggASAKIA1rIgo2AlwgASAFIA1qIgU2AlgCQAJAAkAgA0F2ag4ZBQICBQICAgICAgICAgICAgICAgICAgICAQALIANB3ABGDQYMAQsgBw0ECyABIAZBAWoiDDYCaCABIApBf2oiCjYCXCABIAVBAWoiBTYCWAwACwsgCSEMA0BBACEGAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIApBIUkNAEEAIQ0DQCAIIAUgDWoiBi0AACIDai0AAA0hIAggBkEBai0AACIDai0AAA0gIAggBkECai0AACIDai0AAA0fIAggBkEDai0AACIDai0AAA0eIAggBkEEai0AACIDai0AAA0dIAggBkEFai0AACIDai0AAA0cIAggBkEGai0AACIDai0AAA0bIAggBkEHai0AACIDai0AAA0aIAggBkEIai0AACIDai0AAA0ZIAggBkEJai0AACIDai0AAA0YIAggBkEKai0AACIDai0AAA0XIAggBkELai0AACIDai0AAA0WIAggBkEMai0AACIDai0AAA0VIAggBkENai0AACIDai0AAA0UIAggBkEOai0AACIDai0AAA0TIAggBkEPai0AACIDai0AAA0SIAggBkEQai0AACIDai0AAA0RIAggBkERai0AACIDai0AAA0QIAggBkESai0AACIDai0AAA0PIAggBkETai0AACIDai0AAA0OIAggBkEUai0AACIDai0AAA0NIAggBkEVai0AACIDai0AAA0MIAggBkEWai0AACIDai0AAA0LIAggBkEXai0AACIDai0AAA0KIAggBkEYai0AACIDai0AAA0JIAggBkEZai0AACIDai0AAA0IIAggBkEaai0AACIDai0AAA0HIAggBkEbai0AACIDai0AAA0GIAggBkEcai0AACIDai0AAA0FIAggBkEdai0AACIDai0AAA0EIAggBkEeai0AACIDai0AAA0DIAggBkEfai0AACIDai0AAA0CIA1BwABqIQMgDUEgaiIGIQ0gAyAKSQ0ACwsgCiAGRg0mAkADQCAIIAUgBmot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CCAEIBIpAwA3AwACQCABKAKIAUEOcUEKRg0AIBAQvAsLIAEgDDYCrAEgASANNgKoASAQIBEpAxg3AxggECARKQMQNwMQIBAgESkDCDcDCCAQIBEpAwA3AwBBACEGDA0LIAItAIkBIQcgAkEIaiABEF0gAigCDCEGAkACQAJAIAIoAghBAXENAEEAIQQgAS0AuQENACABQbABaiEDIAFBDGohECABQQhqIQkgAUGYAWohBSABQYwBaiERIAdB/wFxQaQBRyELA0AgAS0AuAFBBEcNAQJAAkAgASgCiAEiB0ELRw0AIAJBiAFqIAEQxgEMAQsgAUELNgKIASACIAUpAgA3A4gBIAIgBSgCCDYCkAECQCABKAIIQQpGDQAgCRC8CwsgCSAHNgIAIBAgESkCADcCACAQIBEoAgg2AggLIAEpA7ABIRcgAyACKQOIATcCACADIAIoApABNgIIIAEgFzcDqAECQAJAAkACQAJAAkACQAJAAkACQAJAIAEtALgBQQVHDQACQAJAIAEoAogBIgdBC0cNACACQYgBaiABEMYBDAELIAFBCzYCiAEgAiAFKQIANwOIASACIAUoAgg2ApABAkAgASgCCEEKRg0AIAkQvAsLIAkgBzYCACAQIBEpAgA3AgAgECARKAIINgIICyABIAEoArQBIhU2AqwBIAEgASgCsAE2AqgBIAMgAikDiAE3AgAgAyACKAKQATYCCEEEIQcgBigCAA4UCAgBAgIDAgMCAgQEAgICBQIGBwIICyABIAEoAngiB0H///+/f3E2AnggAiABKAKwASABEOwDIAIoAgAhFSABIAc2AnggAigCBCEKIBVBAXFFDQggCiEDDA0LQRhBFCAGKAIEQYCAgIB4RhshBwwGC0EIIQcMBQtBECEHDAQLQRQhBwwDC0EMIQcMAgtBKCEHDAELQSAhBwsgBiAHaigCACEKQeAAEIoBIgdFDQwgByAVNgIMIAcgCjYCCCAHIAY2AgQgB0EGNgIAIAchBgwBCyABLQC4ASIHQQVHDQMCQAJAIAEoAogBIgdBC0cNACACQYgBaiABEMYBDAELIAFBCzYCiAEgAiAFKQIANwOIASACIAUoAgg2ApABAkAgASgCCEEKRg0AIAkQvAsLIAkgBzYCACAQIBEpAgA3AgAgECARKAIINgIICyABIAEoArQBIhU2AqwBIAEg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AXFBkQFHDQUgASgCiAEiBUELRw0BIAJByABqIAEQxgEMAgsgASgCtAEhBSACQSRqIAQQxiUgAkGPAq1CIIZB3vSaAa2ENwOgASACQcgAakHNlYABIAJBoAFqEM0IIAIgAikCJDcCVCACIAIoAiw2AlwgAyAFIAJByABqEMAbIQQCQCABLQC4AUGiAUcNACABIAEQhQ4QkwkLIABBAjoAMiAAIAQ2AgAMBQsgAUELNgKIASACIAEpApgBNwNIIAIgASgCoAE2AlAgAUGMAWohBgJAIAEoAghBCkYNACABQQhqELwLCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhCyAEIAIpA0g3AgAgBCACKAJQNgIIIAEgCzcDqAFBACEHDAELAkACQCABKAKIASIGQQtHDQAgAkHIAGogARDGAQwBCyABQQs2AogBIAIgASkCmAE3A0ggAiABKAKgATYCUCABQYwBaiEHAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBjYCCCABIAcpAgA3AgwgASAHKAIINgIUCyABKQOwASELIAQgAikDSDcCACAEIAIoAlA2AgggASALNwOoAQJAIAEtALgBIgZBkQFHDQAgBUH/AXFBDUYhBQJAAkAgASgCiAEiBkELRw0AIAJByABqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwNIIAIgASgCoAE2AlAgAUGMAWohBwJAIAEoAghBCkYNACABQQhqELwLCyABIAY2AgggASAHKQIANwIMIAEgBygCCDYCFAtBAUECIAUbIQcgASkDsAEhCyAEIAIpA0g3AgAgBCACKAJQNgIIIAEgCzcDqAEMAQsgASgCtAEhBCABKAKwASEFIAJBMGogBhDGJSACQY8CrUIghkGg/5oBrYQ3A6ABIAJByABqQc2VgAEgAkGgAWoQzQggAiACKQIwNwJUIAIgAigCODYCXCAFIAQgAkHIAGoQwBshBAJAIAEtALgBQaIBRw0AIAEgARCFDhCTCQsgAEECOgAyIAAgBDYCAAwCCyABLQC4ASEFCwJAAkAgBUH/AXFBBEcNAAJAAkAgASgCiAEiBUELRw0AIAJByABqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwNIIAIgASgCoAE2AlAgAUGMAWohBgJAIAEoAghBCkYNACABQQhq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CkYbciEaIAEoArwBIQ5BgICAgHghDSASIRAgBSESIAMhBQsgAiASNgKAASACIA42AnwgAiAFNgJ4AkACQCANQYCAgIB4Rw0AQQYhDCACKQJ8ISAgHCENIBohDwwBC0EJIQwgAikDeCEgIBghHSAbIR4gGSEfIBAhDyAaIQ4gDSEFIBIhECAXIg0hHAsgIEIgiKchESAgpyESIB0hEyAeIRYgHyEVDAQLIAUhFwsgGBCiIwsgAkHoAGoQuSILIBchBQwDCyACIAIpA1A3A2AgAiACKQNINwNYIBStQjCGIBWtQv8Bg0IohoQgFq1C/wGDQiCGhCATrYQhIAJAIAQgAigCPEcNACACQTxqELgaIAIoAkAhBgsgBiAEQThsaiIDICA3AyAgAyANNgIcIAMgDjYCGCADIA82AhQgAyAQNgIQIAMgETYCDCADIBI2AgggAyAFNgIEIAMgDDYCACADIAIpA1g3AyggAyACKQNgNwMwIAIgBEEBaiIENgJEDAALCyADIAIoAoABEPwgAAsgAkE8ahCdIQsgAEGAgICAeDYCACAAIAU2AgQLIAJBkANqJAAL6xwCCX8BfiMAQfABayICJAAgAUGwAWohAyABKAKwASEEAkACQCABKAKIASIFQQtHDQAgAkGgAWogARDGAQwBCyABQQs2AogBIAIgASkCmAE3A6ABIAIgASgCoAE2AqgBIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahC8CwsgASAFNgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEpA7ABIQsgAyACKQOgATcCACADIAIoAqgBNgIIIAEgCzcDqAECQAJAAkACQAJAIAEtALgBIgUNAAJAAkAgASgCiAEiBUELRw0AIAJBoAFqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwOgASACIAEoAqABNgKoASABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBTYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABKQOwASELIAMgAikDoAE3AgAgAyACKAKoATYCCCABIAs3A6gBIAEtALgBIgVBwABGDQIgBUGiAUYNASABKAK0ASEFIAEoArABIQYgARCyECACQZKBgIB4NgKgASABIAYgBSACQaABahDqHRC3JSELIAIgBTYCJCACIAY2AiAgAkKhxIgBNwMoIAIgCzcDGAwDCyABKAK0ASEDIAEoArABIQYgAkEMaiAFEMYlIAJBjwKtQiCGQZ+2gQGthDcDaCACQaABakHNlYABIAJB6ABqEM0IIAIgAikCDDcCrAEgAiACKAIUNgK0ASAGIAMgAkGgAWoQwBshAwJAIAEtALgBQaIBRw0AIAEgARCFDhCTCQsgAEEEOgA0IAAgAzYCAAwDCyABKQMIIQsgAUEKNgIIIAIgASkDEDcDqAEgAiALNwOgAQJAAkAgC6ciBUEKRg0AIAVBCUYNASACQaABahC8CwtBiPOaAUEoQcCHmwEQtyEACyACKAKkASEFAkACQCABKAKIASIGQQtHDQAgAkGgAWogARDGAQwBCyABQQs2AogBIAEgBjYCCCABIAEpAowBNwIMIAEgASgClAE2AhQgAiABKQKYATcDoAEgAiABKAKgATYCqAELIAEpA7ABIQsgAyACKQOgATcCACADIAIoAqgBNgIIIAEgCzcDqAEgAEEEOgA0IAAgBTYCAAwCCyACQRhqIAEQlQoLQQAhBQJAAkACQCABLQC4ASIGQQdHDQACQAJAIAEoAogBIgZBC0cNACACQaABaiABEMYBDAELIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohBwJAIAEoAghBCkYNACABQQhqELwLCyABIAY2AgggASAHKQIANwIMIAEgBygCCDYCFAsgASkDsAEhCyADIAIpA6ABNwIAIAMgAigCqAE2AgggASALNwOoASABLQC4ASIGQQJHDQAgASgCsAEhBwJAAkAgASgCiAEiBUELRw0AIAJBoAFqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwOgASACIAEoAqABNgKoASABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBTYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABKQOwASELIAMgAikDoAE3AgAgAyACKAKoATYCCCABIAs3A6gBAkACQAJAAkACQAJAIAEtALgBIgVB8ABHDQACQAJAIAEoAogBIgVBC0cNACACQaABaiABEMYBDAELIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohBgJAIAEoAghBCkYNACABQQhqELwLCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhCyADIAIpA6ABNwIAIAMgAigCqAE2AgggASALNwOoASABLQC4ASIFQQlHDQICQAJAIAEoAogBIgVBC0cNACACQaABaiABEMYBDAELIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohBgJAIAEoAghBCkYNACABQQhqELwLCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhCyADIAIpA6ABNwIAIAMgAigCqAE2AgggASALNwOoASABIAEoAngiBUH//3txNgJ4IAJBoAFqIAEQlQEgASAFNgJ4IAIoAqQBIQUCQCACKAKgASIGQTJHDQAgBSEDDAYLIAIgAikD2AE3A5gBIAIgAikD0AE3A5ABIAIgAikDyAE3A4gBIAIgAikDwAE3A4ABIAIgAikDuAE3A3ggAiACKQOwATcDcCACIAIpA6gBNwNoIAZBDkcNAyACIAIpA3A3AmAgAiACKQNoNwJYIAIgBTYCVAJAIAEtALgBIgZBB0cNAAJAAkAgASgCiAEiBkELRw0AIAJBoAFqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwOgASACIAEoAqABNgKoASABQYwBaiEIAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBjYCCCABIAgpAgA3AgwgASAIKAIINgIUCyABKQOwASELIAMgAikDoAE3AgAgAyACKAKoATYCCCABIAs3A6gBIAEtALgBIQYLAkAgBkH/AXFBA0cNAAJAAkAgASgCiAEiBUELRw0AIAJBoAFqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwOgASACIAEoAqABNgKoASABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBTYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABIAEoArQBIgg2AqwBIAEgASgCsAE2AqgBIAMgAikDoAE3AgAgAyACKAKoATYCCEEUEIoBIgUNAkEEQRQQoCQACyABKAK0ASEDIAEoArABIQQgAkHkAWogBhDGJSACQY8CrUIghkHf9JoBrYQ3A2ggAkGgAWpBzZWAASACQegAahDNCCACIAIpAuQBNwKsASACIAIoAuwBNgK0ASAEIAMgAkGgAWoQwBshAwJAIAEtALgBQaIBRw0AIAEgARCFDhCTCQsgAkHUAGoQuBUgBSACKAJYEPojDAULIAEoArQBIQMgASgCsAEhBiACQTxqIAUQxiUgAkGPAq1CIIZBof+aAa2ENwNoIAJBoAFqQc2VgAEgAkHoAGoQzQggAiACKQI8NwKsASACIAIoAkQ2ArQBIAYgAyACQaABahDAGyEDIAEtALgBQaIBRw0EDAMLIAUgAigCZDYCECAFIAIpAlw3AgggBSACKQJUNwIAIAEtALgBIQYMBQsgASgCtAEhAyABKAKwASEGIAJByABqIAUQxiUgAkGPAq1CIIZBx/SaAa2ENwNoIAJBoAFqQc2VgAEgAkHoAGoQzQggAiACKQJINwKsASACIAIoAlA2ArQBIAYgAyACQaABahDAGyEDIAEtALgBQaIBRw0CDAELQYjzmgFBKEGk/5oBELchAAsgASABEIUOEJMJCyAAQQQ6ADQgACADNgIADAILCwJAAkACQAJAAkAgBkH/AXFBAUcNAAJAAkAgASgCiAEiBkELRw0AIAJBoAFqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwOgASACIAEoAqABNgKoASABQYwBaiEJAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBjYCCCABIAkpAgA3AgwgASAJKAIINgIUCyABKQOwASELIAMgAikDoAE3AgAgAyACKAKoATYCCCABIAs3A6gBIAEtALgBIgZBCEcNAQJAAkAgASgCiAEiCUELRw0AIAJBoAFqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwOgASACIAEoAqABNgKoASABQYwBaiEKAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgCTYCCCABIAopAgA3AgwgASAKKAIINgIUCyABKQOwASELIAMgAikDoAE3AgAgAyACKAKoATYCCCABIAs3A6gBIAJBoAFqIAFBABCkAyACKAKgASEJIAItALQBIgpBA0cNAiAAQQQ6ADQgACAJNgIADAQLIAEoArQBIQMgASgCsAEhBCACQTBqIAYQxiUgAkGPAq1CIIZBkvCaAa2ENwNoIAJBoAFqQc2VgAEgAkHoAGoQzQggAiACKQIwNwKsASACIAIoAjg2ArQBIAQgAyACQaABahDAGyEDAkAgAS0AuAFBogFHDQAgASABEIUOEJMJCyAAQQQ6ADQgACADNgIADAML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ACACQXRqIgINAAsLAkAgA0EUaigCACIARQ0AIABB2ABsIQIgA0EQaigCACEAA0AgACABEJ4DIABB2ABqIQAgAkGof2oiAg0ACwsgAygCMCIADQcMCQsgACgCDCIADQYMCAsgACgCBCEADAULIABBIGohAgJAIAAtADRBAkcNAANAIAIoAgAiAEEYaiECIAAtACxBAkYNAAsLIAEgAikDACACQRBqKAIAEPcNDwsgASAAKAIEIgZBwABqELsKAkAgBkGEAWooAgAiAEUNACAGQYABaigCACICIABB2ABsaiEFA0ACQAJAAkAgAigCACIAQXxqDgICAAELIAIoAgQgARC7AQwBCwJAAkACQCAADgQDAAECAwsgAigCBEEBRw0CIAIoAgggARC7AQwCCyABIAIoAgQiBEHAAGoQuwoCQCAEQYQBaigCACIARQ0AIABB2ABsIQMgBEGAAWooAgAhAANAAkACQAJAIAAoAgBBfGoOAgIAAQsgAEEEaigCACABELsBDAELIAAgARDtCgsgAEHYAGohACADQah/aiIDDQALCwJAIARBmAFqKAIAIgBFDQAgAEEobCEDIARBlAFqKAIAIQADQCAAIAEQwAggAEEoaiEAIANBWGoiAw0ACwsgBC0APEEGRg0BIAEgBEEQahC7CgwBCyACKAIMIgBFDQAgAEEobCEDIAIoAgghAANAIAEgABD3BiAAQShqIQAgA0FYaiIDDQALCyACQdgAaiICIAVHDQALCwJAIAZBmAFqKAIAIgBFDQAgAEEobCECIAZBlAFqKAIAIQADQCABIAAQ9wYgAEEoaiEAIAJBWGoiAg0ACwsgBi0APEEGRg0FIAEgBkEQahC7Cg8LIAAoAgwiAkUNBCACQShsIQIgACgCCCEAA0AgACABEMAIIABBKGohACACQVhqIgINAAwFCwsgACgCBCEADAELAkAgACgCBCIAKAIAIgJBA0cNACAAKAIQIAEQuwEgACgCDCICRQ0DIAJBBHQhAiAAKAIIQQxqIQADQCAAKAIAIAEQuwEgAEEQaiEAIAJBcGoiAg0ADAQLCyAAKAIgIAEQuwEgAkECRw0CIAAoAgQhAAwACwsgASAAKQMIIABBGGooAgAQ9w0LC+IXAgp/An4jAEHgAGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADgkAAQIDBAUGBwgACwJAIAAoAgwiA0UNACADQcgAbCEEIAAoAgghBSABQSxqIQYgAUGAAWohB0EAIQgDQAJAAkACQAJAIAUgCGoiAykDACIMp0F+akEAIAxCAlYbDgMAAQIACyADQTBqKAIAIQkCQCABLQCQAQ0AIAlFDQACQCADQSBqKQMAIgxCA4NCAFINACAMpyIKIAooAgAiCkEBajYCACAKQX9MDRALIAcgDCAJEIUHGiADKQMAIQwLAkAgDEICUQ0AIAynQQFxDQAgAS0AkAENACADQRhqKAIAIgpFDQACQCADQQhqKQMAIgxCA4NCAFINACAMpyILIAsoAgAiC0EBajYCACALQX9MDRALIAcgDCAKEIUHGgsCQCADQSBqKQMAIgxCA4NCAFINACAMpyIDIAMoAgAiA0EBajYCACADQX9MDQ8LIAYgDCAJQQEQrQ4gASAMIAkQjhEMAgsgA0EQaikDACIMQgODIQ0gA0EgaigCACEDAkAgAS0AkAENACADRQ0AAkAgDUIAUg0AIAynIgkgCSgCACIJQQFqNgIAIAlBf0wNDwsgByAMIAMQhQcaCwJAIA1CAFINACAMpyIJIAkoAgAiCUEBajYCACAJQX9MDQ4LIAYgDCADQQEQrQ4gASAMIAMQjhEMAQsgA0EQaikDACIMQgODIQ0gA0EgaigCACEDAkAgAS0AkAENACADRQ0AAkAgDUIAUg0AIAynIgkgCSgCACIJQQFqNgIAIAlBf0wNDgsgByAMIAMQhQcaCwJAIA1CAFINACAMpyIJIAkoAgAiCUEBajYCACAJQX9MDQ0LIAYgDCADQQEQrQ4gASAMIAMQjhELIAQgCEHIAGoiCEcNAAsLIAAoAhwiA0UNCCADQQhqKAIAIghFDQggCEEMbCEAIANBBGooAgAhAyABQSxqIQYDQAJAAkAgAygCACIIDQAgA0EEaigCACIIIAEQ2gMgCCgCAEEFRw0BIAhBGGooAgAhCQJAIAgpAwgiDEIDg0IAUg0AIAynIgggCCgCACIIQQFqNgIAIAhBf0wNDQsgBiAMIAkQugwMAQsgAS0AKCEJIAFBADoAKCABLQB5IQUgAUEAOgB5AkAgCCgCAEEaRw0AIAhBGGooAgAhBAJAIAgpAwgiDEIDg0IAUg0AIAynIgcgBygCACIHQQFqNgIAIAdBf0wNDQsgBiAMIAQQugwLIAggARBuIAEgCToAKCABIAU6AHkLIANBDGohAyAAQXRqIgANAAwJCwsgAEEIaiABELoCDAcLAkAgACgCGEUNACABLQCQASEGIAFBAToAkAECQCAAKAIMIgNFDQAgA0HQAGwhCCAAKAIIIQMgAUEsaiEFA0ACQCADKQMAIgxCAVYNACABQQE6AJABAkAgDKdBAXENACADQRhqKAIAIQkCQCADQQhqKQMAIgxCA4NCAFINACAMpyIEIAQoAgAiBEEBajYCACAEQX9MDQ0LIAUgDCAJELoMCyADIAEQ6A0gAUEBOgCQAQsgA0HQAGohAyAIQbB/aiIIDQALCwJAIAAoAhwiA0UNACADQQRqKAIAIANBCGooAgAgARD+CgsgASAGOgCQAQwHCwJAIAAoAgwiA0UNACADQdAAbCEIIAAoAgghAyABQSxqIQQDQAJAIAMpAwAiDEIBVg0AIAEtAJABIQkgAUEBOgCQAQJAIAynQQFxDQAgA0EYaigCACEFAkAgA0EIaikDACIMQgODQgBSDQAgDKciBiAGKAIAIgZBAWo2AgAgBkF/TA0MCyAEIAwgBRC6DAsgAyABEOgNIAEgCToAkAELIANB0ABqIQMgCEGwf2oiCA0ACwsgACgCHCIDRQ0GIANBBGooAgAgA0EIaigCACABEP4KDAYLAkACQAJAIAAoAggOAwABCAALIAFBLGoiBiAAQRBqIgcQog8CQCAALQAkIgRBAkYNACABIAApAxAgACgCIBCOEQtBACEDIAJBADYBWiACQQA2AhQgAkKAgICAgAE3AgwgAkKAgICAgAE3AkggAkKAgICAwAA3AjggAkEANgJQIAJBADoARCACQQA2AkAgAiABLwF4OwFYIAIgASgCdDYCVCACQQApA6CmnAEiDDcCGCACQQApA6imnAEiDTcCICACIAw3AiggAiANNwIwIAIgAS0AfjoAXgNAIANB1ABGDQIgASADakEsaiIIKAIAIQkgCCACQQxqIANqIgUoAgA2AgAgBSAJNgIAIANBBGohAwwACwsCQCAALQAkQQJGDQAgACgCICEDAkAgACkDECIMQgODQgBSDQAgDKciCCAIKAIAIghBAWo2AgAgCEF/TA0JCyABQSxqIAwgA0EBEK0OCyABIABBEGoQgAIMBgsCQCAEQQJGDQAgAS0AkAENACAAKAIgIgNF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IQoLIAZB0ABqQRBBCCAOQQFqEIYRIAogBigCWGsgBigCUCAGKAJUEOghCyAAKAI0QTxsIQcgACgCMCEKAkADQCAHRQ0BIAogAUGgppwBIAMgBCAFEMABQaCmnAEQiw0gB0FEaiEHIApBPGohCgwACwsgBkHgAGokAAvdGQEUfyMAQbACayIDJAACQAJAAkACQAJAAkAgAS0AyAEiBBDmEw0AAkAgBEF+ag4DBQMAAgsgASgCwAEhBSABEOURIANBADYC0AEgA0KAgICAgAE3AsgBIANBwABqQQhqIQZBCCEHQQAhBEEAIQhBACEJA0AgBEEobCECAkACQAJAAkADQAJAAkAgAS0AyAEiCkF7ag4DAwABAAsgCUH+/3tLDQUgCSAIcg0DDAULIAEQ5RECQCAEIAMoAsgBRw0AIANByAFqELYaIAMoAswBIQcLIAcgAmpBBzYCACADIARBAWoiBDYC0AEgAkEoaiECDAALCyABEOURAkACQCABLQCBAUEEcQ0AQQAhBCABLQB5QcAAcUUNAyABLQDIAUH/AXFBCkYNAQwDC0EAIQQgAS0AyAFBCkcNAgsgARDlEUEBIQQMAQsgA0G7gICAeDYCQCABIAkgCCADQcAAahDxHSABLQDIASEKDAELIAAgAykCyAE3AgQgACADKALQATYCDCAAIAQ6ABwgAEEANgIYIAAgBTYCECAAQQE2AgAgACABKAK8ATYCFAwHCwJAAkACQAJAIApB/wFxIgtBHEYNACADQcAAaiABEPoIIAMoAkQhCiADKAJAIgxBB0YNAiADIAYpAxg3A5ABIAMgBikDEDcDiAEgAyAGKQMINwOAASADIAYpAwA3A3gCQCAEIAMoAsgBRw0AIANByAFqELYaCyADKALMASIHIARBKGxqIgIgCjYCBCACIAw2AgAgAiADKQN4NwMIIAIgAykDgAE3AxAgAiADKQOIATcDGCACIAMpA5ABNwMgDAELIAEoAsABIQkgARDlESABKAK8ASEMIANBwABqIAFBABDBASADKAJEIQogAygCQCIHQQdGDQEgAyAGKQMYNwOAAiADIAYpAxA3A/gBIAMgBikDCDcD8AEgAyAGKQMANwPoASABKAK8ASEIQQhBKBDoICICIAo2AgQgAiAHNgIAIAIgAykD6AE3AwggAiADKQPwATcDECACIAMpA/gBNwMYIAIgAykDgAI3AyACQCAEIAMoAsgBRw0AIANByAFqELYaCyADKALMASIHIARBKGxqIgpBADYCGCAKIAw2AhQgCiAJNgIQIAogCDYCDCAKIAk2AgggCiACNgIEIApBAjYCAAsgAyAEQQFqIgQ2AtABAkAgAS0AyAEiAkF7ag4DAwACAAsgASgCxAEhBCABKALAASEHIANBkAJqIAIQ1yUgA0GPAq1CIIZB/OOaAa2ENwOoASADQcAAakHNlYABIANBqAFqEIUfIAMgAykCkAI3AkwgAyADKAKYAjYCVCAHIAQgA0HAAGoQwBshCiABLQDIAUGiAUcNACABIAEQnyMQhhQLIABBBzYCACAAIAo2AgQgA0HIAWoQqCEMBwsgARDlESALQRxHDQAgAS0AyAFB/wFxQQVHDQAgASgCvAEhAiABKAK4ASEKIANBuoCAgHg2AkAgASAKIAIgA0HAAGoQ8R0MAAsLIANBEGogASACEIoHAkACQCADLQAkQQJGDQAgAyADKQMoNwJcIAMgAykDIDcCVCADIAMpAxg3AkwgAyADKQMQNwJEIABBBGogA0HAAGpBJPwKAABBACEBDAELIAAgAygCEDYCBEEHIQELIAAgATYCAAwECyAEQaIBRg0BCyADQcAAakEEciAEENclIANBHDYCVCADQaSNmwE2AlAgA0GwgICAeDYCQCABKALAASABKALEASADQcAAahDAGyEEAkAgAS0AyAFBogFHDQAgASABEJ8jEIYUCyAAQQc2AgAgACAENgIEDAILIAEQnyMhASAAQQc2AgAgACABNgIEDAELIAEgASgCeCINQf//e3E2AnggASgCwAEhDiABEOURIANBwABqQQhBCEE4EIMPIAMoAkQhBAJAAkACQAJAAkACQAJAIAMoAkBBAUYNACADQQA2AjwgAyADKAJIIgg2AjggAyAENgI0IANB6AFqQQhqIQQgA0HoAWpBBGohDCADQdAAaiEPIANB6AFqQQRyIRAgA0HIAWpBCGohBSADQcAAakEIaiELIANBwABqQQRyIREgAS0AyAEhAkEAIQpBACESA0AgCkE4bCEGAkADQAJAIAJB/wFxIgJBA0cNACABEOURIAEoArwBIQkgAyADKQI0NwNAIAMgAygCPCIENgJIIAMgEzYCYCADIBQ2AlwgAyASNgJYIAMgCTYCVCADIA42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IAFBAjoAOSABIABBEGoQsBIgASADOgA5IAAoAighAAwICyABLQA5IQMgAUECOgA5AkAgAC0AJEECRg0AIAEgAEEQahCwEgsgASADOgA5DA0LIAEtADkhAyABQQI6ADkCQCAALQAkQQJGDQAgASAAQRBqELASCyABIAM6ADkMDAsgAS0AOSEDIAFBAToAOSAAKAIEIAEQeSABIAM6ADkgACgCCCABEMIBIAAoAhQiAA0FDAsLIAEtADkhAyABQQE6ADkgACgCECABEHkgASADOgA5IAEoAjAQphQhAyACIAE2AqgBIAIgAzYCrAEgAkEBOgDBASACIAEpAiw3ArQBIAIgASgCNDYCvAEgAiABKAE6NgHCASACIAEtADg6AMABIAJBADoAsAEgAkEAKQOgppwBIgc3A4gBIAJBACkDqKacASIINwOQASACIAc3A5gBIAIgCDcDoAECQCAAKAIMIgFFDQAgACgCCCIDIAFBGGxqIQQgAkH4AWohBQNAIAJBADsAjQIgBSAHNwIAIAUgCDcCCCACIAItAMABOgCMAiACIAc3A+gBIAIgCDcD8AEgAiACQYgBajYCiAIgAkHoAWogAxCACCACQegBahDxGCAFEPEYAkAgAygCCCIBRQ0AIAFBMGwhACADKAIEIQEDQCABIAJBiAFqEMIBIAFBMGohASAAQVBqIgANAAsLAkAgAygCFCIBRQ0AIAItAMEBIQAgAkEBOgDBASABIAJBiAFqEHkgAiAAOgDBAQsgA0EYaiIDIARHDQALCwJAIAIoAowBIgFFDQAgAigCiAEgAigClAEQ8w0gASABQQR0QRdqQXBxIgBqQQlqIgFFDQAgAigCiAEgAGsgAUEIENQUCyACQZgBahDxGAwKCyABLQA5IQMgAUEBOgA5IAAoAgQgARB5IAEgAzoAOQwJCyABIAAoAgQiAEHIAGoQoAkgAEHgAGohBQJAIAAoAgAiBEEIRg0AIAEoAjAQphQhAyACIAE2AqgBIAIgAzYCrAEgAkEBOgCwASACIAEpAiw3ArQBIAIgASgCNDYCvAEgAiABKAE6NgHCASACIAEtADg6AMABIAJBADoAwQEgAkEAKQOgppwBIgc3A4gBIAJBACkDqKacASIINwOQASACIAc3A5gBIAIgCDcDoAECQCAEQQdGDQAgACACQYgBahCmBSACKAKsASED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AyADKQLEATcDmAEgAyADKALMATYCoAEgAygCwAEhESABKAJ4IRILIAMgAykDmAE3A8ABIAMgAygCoAE2AsgBIAMgFCgCCDYC1AEgAyAUKQIANwLMAQsgAyAGNgIoIAMgCDYCJCADIAk2AiAgAyADKQOoATcCLCADIAMoArABNgI0IAMgDjYCTCADIAQ2AkggAyANNgJEIAMgDDYCQCADIA86AD0gAyAKOgA8IAMgBzYCOCADIAEoAqwBIhQ2AnQgAyABKAKoASIVNgJwIAMgETYCUCADIAEoArgBNgKAASADIAEpA7ABNwN4IAMgAykDwAE3AlQgAyADKQPIATcCXCADIAMpA9ABNwJkIAMgAygC2AE2AmwgASASQYEgcjYCeCADQQA6AMABIANBADoAuAEgA0EYaiADQbgBaiADQcABaiABEOIBIAMoAhghBCABIBJBAXI2AnggAUGwAWohDiADKAIcIQ8gA0HQAGohCiADQfgAaiETAkACQCAEQQFHDQAgDyEIDAELAkACQAJAIAEtAIABQQFxRQ0AIA8oAghBAUcNACAPKAIEIgQoAiANACAEKAIkDQAgDygCECAEKAIEa0EBSw0AQYCAgIB4IRYMAQsCQAJAIAEtALgBIgQNAAJAAkAgECgCACIEQQtHDQAgA0HAAWogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A8ABIAMgASgCoAE2AsgBIAFBjAFqIRICQCABKAIIQQpGDQAgBRC8CwsgASAENgIIIAEgEikCADcCDCABIBIoAgg2AhQLIAEpA7ABIRkgDiADKQPAATcCACAOIAMoAsgBNgIIIAEgGTcDqAEgA0HAAWogARDuASADKALEASEIIAMoAsABIhdBgICAgHhHDQFBgYCAgHghFgwCCyABKAK0ASESIAEoArABIQwgA0GMAWogBBDGJSADQY8CrUIghkGftoEBrYQ3A7gBIANBwAFqQc2VgAEgA0G4AWoQrxAgAyADKQKMATcCzAEgAyADKAKUATYC1AEgDCASIANBwAFqEMAbIQhBgYCAgHghFiABLQC4AUGiAUcNASABIAEQhQ4QkwkMAQsgF0EGdCIYQShuIRYgCCADKALIASIMQQZ0aiEJIAghBCAIIRICQCAMRQ0AIAghEiAIIQQDQCADIAQpAyg3A+gBIAMgBCkDIDcD4AEgAyAE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ASkDODcDOCACIAEpAzA3AzAgAiABKQMoNwMoIAIgASkDIDcDICACIAEpAxg3AxggAiABKQMQNwMQIAIgEjcDCCACIBA3AwBBwAAQigEiA0UNASADIAIpAzg3AzggAyACKQMwNwMwIAMgAikDKDcDKCADIAIpAyA3AyAgAyACKQMYNwMYIAMgAikDEDcDECADIAIpAwg3AwggAyACKQMANwMAIAEQ5wEgAUEAIAUgBEF+RiIAGzYCDCABQQAgBCAAGzYCCCABIAM2AgQgAUEjNgIACyACQcAAaiQADwtBCEHAABCgJAALmxcCFn8BfiMAQYACayIDJAAgASgCsAEhBEEAIQVBAiEGAkACQAJAAkAgAS0AuAFBr39qDh0DAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAgALQYjzmgFBKEG4hpsBELchAAtBASEGDAELQQAhBiACIQULIAFBsAFqIQcCQAJAIAEoAogBIghBC0cNACADQdgAaiABEMYBDAELIAFBCzYCiAEgAyABKQKYATcDWCADIAEoAqABNgJgIAFBjAFqIQkCQCABKAIIQQpGDQAgAUEIahC8CwsgASAINgIIIAEgCSkCADcCDCABIAkoAgg2AhQLIAFBiAFqIQogASABKAK0ASILNgKsASABIAEoArABNgKoASAHIAMpA1g3AgAgByADKAJgNgIIAkACQCACRQ0AIAEoAoABQYDAAHFFDQACQCABLQC4ASIIQeAARg0AIAhBigFHDQELIAFBCGohDEEKIQ0gASgCGCEOIAEoAgQhDyABKAIAIRAgAS0AHCERAkAgASgCCEEKRg0AIANB2ABqIAwQlAYgAyADKQJcNwPwASADIAMoAmQ2AvgBIAMoAlghDQtBACESQQAhEwJAIAEoAiBBgICAgHhGDQAgASgCNCETIAEoAighEgsgASgCaCEUIAEtAB0hFUELIQggASgCeCIWIQkCQCAKKAIAIhdBC0YNACABQZgBaiEYQQohCCAWIQkCQCAXQQpGDQAgA0HYAGogChCUBiADIAMpAlw3A+ABIAMgAygCZDYC6AEgAygCWCEIIAEoAnghCQsgAyADKQPgATcDwAEgAyADKALoATYCyAEgAyAYKAIINgLUASADIBgpAgA3AswBCyADIA02AmAgAyAPNgJcIAMgEDYCWCADIAMpA/ABNwJk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AqgBIAcgAykDWDcCACAHIAMoAmA2AgggDUE4aiENIAEtALgBQQZHDQALCyADQfeAgIB4NgJYIAEgCCASIBIgBEYbIBIgCCALRhsgCCADQdgAahDqHQsCQCACDQACQAJAIAEtALgBIghBfWoOBAIBAQABCwJAAkAgCigCACIIQQtHDQAgA0HYAGogARDGAQwBCyABQQs2AogBIAMgASkCmAE3A1ggAyABKAKgATYCYCABQYwBaiEJAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgCDYCCCABIAkpAgA3AgwgASAJKAIINgIUCyABKQOwASEZIAcgAykDWDcCACAHIAMoAmA2AgggASAZNwOoAQwBCyAIQaMBRg0AIAEtALkBQQFxDQAgASgCtAEhCCABKAKwASEJIANB9oCAgHg2AlggASAJIAggA0HYAGoQ6h0gA0EIaiABELgDIAMoAgggAygCDBDMHgNAIAEQ5Q0NASABELIQIAEtALgBQaIBRw0ACwsgASgCrAEhCAJAQRwQigEiEkUNACASIAMoAiQ2AgggEiADKQIcNwIAIBIgBjoAGUEAIQEgEkEAOgAYIBJBADYCFCASIAg2AhAgEiAENgIMQQBBCBD1IwwBC0EEQRwQoCQACyAAIBI2AgQgACABNgIAIANBgAJqJAALkxYCEH8BfiMAQaABayINJAAgDSAEOgAYIA0gAjYCFCANIAY6ABkgDSAIOgAaIA0gCToAGyANIAo6ABwgDSALOgAdIA0gDDoAHiAFQbnvmgFBCxC4CiECIAUoAgAhBAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAINACAEQQVHDQICQCAKDQAgC0UNAyAFKAIUIQogBSgCECELDAILIAUoAhQhCiAFKAIQIQsgDUHhgICAeDYCICANQvHIlZvGrZi55QA3AyggASALIAogDUEgahDqHSANLQAdDQEMAgsgBUEMQRQgBEF+akEDSSIKG2ooAgAhCyAFQQhBECAKG2ooAgAhCiANQd+AgIB4NgIgIAogCyANQSBqEMAbIQoCQCABLQC4AUGiAUcNACABIAEQhQ4QkwkgBSgCACEECyAAQQ02AgAgACAKNgIEDAILENIbIR0gDUHhgICAeDYCICANIB03AyggASALIAogDUEgahDqHQtBACEKAkAgAS0AgQFBIHFFDQAgDS0AGkEBcQ0AAkAgAS0AuAEiCkELRw0AAkACQCABKAKIASILQQtHDQAgDUEgaiABEMYBDAELIAFBCzYCiAEgDSABKQKYATcDICANIAEoAqABNgIoIAFBjAFqIQICQCABKAIIQQpGDQAgAUEIahC8CwsgASALNgIIIAEgAikCADcCDCABIAIoAgg2AhQLIAEgDSgCKDYCuAEgASABKQOwATcDqAEgASANKQMgNwKwAQsgCkELRiEKCyANIAo6AB8CQAJAAkAgAS0AuAEiAkEJRg0AIAEoAnghC0EAIQoMAQsgASABKAJ4IgtBgCByNgJ4IAFBsAFqIQogASgCsAEhCAJAAkAgASgCiAEiAkELRw0AIA1BIGogARDGAQwBCyABQQs2AogBIA0gASkCmAE3AyAgDSABKAKgATYCKCABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgAjYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABKQOwASEdIAogDSkDIDcCACAKIA0oAig2AgggASAdNwOoASABIAEoAngiCkH///+/f3E2AnggDUEIaiABKAKwASABEOwDIA0oAgghAiABIAo2AnggDSgCDCEGIAJBAXENASABKAKsASEEQQwQigEiCkUNAyAKIAQ2AgggCiAINgIEIAogBjYCACABLQC4ASECCyANIAo2AnQgDSAHNgJYIA0gBSkDADcDICANIAUpAwg3AyggDSAFKQMQNwMwIA0gBSkDGDcDOCANIAMpAgA3A0AgDSADKAIINgJIIA0gDUEUajYCUCANIA1BHGo2AkwgDSANQRpqNgJUIA0gDUEZajYCXCANIA1BGGo2AmAgDSANQR1qNgJkIA0gDUEeajYCaCANIA1BH2o2AmwgDSANQRtqNgJwIAEgC0HAgBByNgJ4AkAgAkH/AXFBF0YNAEEAIQRBASEGDAYLAkACQCABKAKIASIEQQtHDQAgDUH4AGogARDGAQwBCyABQQs2AogBIA0gASkCmAE3A3ggDSABKAKgATYCgAEgAUGMAWohAgJAIAEoAghBCkYNACABQQhqELwLCyABIAQ2AgggASACKQIANwIMIAEgAigCCDYCFAsgASANKAKAATYCuAEgASABKQOwATcDqAEgASANKQN4NwKwASABLQC4AUE+Rw0DIAEtAIEB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DCADIAMpApwBNwO4ASADIAMpAqQBNwPAASADIAMoAqwBNgLIAUEEIQcgAygCmAEhDiADKAKwASENIAMoArQBIQxBACELAkAgAkEERg0AIAIhBwwPCyADQYCBgIB4NgKQASAKIAkgCCADQZABahDqHQwOCyAAQQA2AiggAEEANgIwIABBATYCACAAIAQpAxg3AyAgACAEKAIUIgI2AhwgACAEKAIQIgE2AhggACAEKQMINwMQIAAgAjYCDCAAIAE2AggMCgsgAEEANgIoIABBATYCACAAIAQpAxA3AxAgACAEKQMYNwMYIAAgBCkDIDcDICAAIAQoAig2AjAgACAEKQMINwMIDAkLIAQoAigiAigCACEFIAMgBCkDIDcDaCADIAQpAxg3A2AgAyAEKQMQNwNYIAMgBCkDCDcDUCABKAIAIQogASgCBC0AAEECSQ0EAkAgBUExRw0AIANBBTYCkAEgAyACKQIENwKUASACEIwCIAJBwABBCBDUFAwGCyADQZABaiAKQQMgAhBqDAULIARBxABqIQIgBEHAAGohBQwCCyAEQeQAaiECIARB4ABqIQUMAQsgBCgCKCIFQTRqIQIgBUEwaiEFCyAFKAIAIQUgAigCACECIANBvoCAgHg2ApABIAUgAiADQZABahDAGyECAkAgASgCACIBLQC4AUGiAUcNACABEMQUIQUgARCyECABIAUQkwkLIABBAzYCACAAIAI2AgQMAgsCQCAFQTFHDQAgA0EFNgKQASADIAIpAgQ3ApQBIAIQjAIgAkHAAEEIENQUDAELIANBkAFqIApBASACEGoLIAMoApQBIQECQCADKAKQASIFQQdHDQAgAEEDNgIAIAAgATYCBCADQdAAahDLDgwBCyADIAMpA7ABNwOIASADIAMpA6gBNwOAASADIAMpA6ABNwN4IAMgAykDmAE3A3BBKBCKASICRQ0BIAIgATYCBCACIAU2AgAgAiADKQNwNwMIIAIgAykDeDcDECACIAMpA4ABNwMYIAIgAykDiAE3AyAgAyADKQNQNwMwIAMgAykDWDcDOCADIAMpA2A3A0AgAyADKQNoNwNIIAMgAykDSDcCKCADIAMpA0A3AiAgAyADKQM4NwIYIAMgAykDMDcCECAAQQA2AgAgACADKQIMNwIEIAAgAykCFDcCDCAAIAMpAhw3AhQgACADKQIk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ASADIAMtAEc6AMIBIAMgAy8ARTsBwAEgAygCSCEFQcAAEIoBIgFFDQIgASAENgIIIAFBDzYCACABIAMpA5gBNwIMIAEgAykDoAE3AhQgASACOgAcIAEgAy8BwAE7AB0gASADLQDCAToAHyABIAU2AiBBACEFIAEhBAwGCyABKAK0ASEEIANBmAFqIAIQxiUgA0GPAq1CIIZB6IKbAa2ENwPQASADQTBqQc2VgAEgA0HQAWoQzQggAyADKQKYATcCPCADIAMoAqABNgJEIAYgBCADQTBqEMAbIQRBASEFIAJBogFHDQUgASABEIUOEJMJDAULAkACQCABLQCBAUEgcUUNAAJAIAZBC0cNACABKQMIIRQgAUEKNgIIIAMgASkDEDcDoAEgAyAUNwOYASADQcAAaiABEMYBIAEpAwghFCABQQo2AgggAyABKQMQNwM4IAMgFDcDMCABQQhqIQICQAJAIAEoAogBQQ5xQQpHDQAgBCADKQNINwMYIAQgAykDQDcDECAEIAMpAzg3AwggBCADKQMwNwMADAELIAQQvAsgBCADKQMwNwMAIAQgAykDODcDCCAEIAMpA0A3AxAgBCADKQNINwMYIAIoAgBBCkYNACACELwLCyACIAMpA6ABNwMIIAIgAykDmAE3AwAgBCgCAEELRg0FCyABLQCgAUESRw0FIAEtAIEBQSBxRQ0FIAFBCGohByABKAJ4IQhBCiEJIAEoAhghCiABKAIEIQsgASgCACEMIAEtABwhDQJAIAEoAggiDkEKRg0AIANBmAFqIAcQlAYgAyADKQKcATcD0AEgAyADKAKkATYC2AEgAygCmAEhCQtBACECQQAhDwJAIAEoAiBBgICAgHhGDQAgASgCNCEPIAEoAighAgsgASgCaCEQIAEtAB0hEUELIRICQCAEKAIAIgZBC0YNACABQZgBaiETQQohEgJAIAZBCkYNACADQZgBaiAEEJQGIAMgAykCnAE3A8ABIAMgAygCpAE2AsgBIAMoApgBIRILIAMgAykDwAE3A5gBIAMgAygCyAE2AqABIAMgEygCCDYCrAEgAyATKQIANwKkAQsgAyAJNgI4IAMgCzYCNCADIAw2AjAgAyADKQPQATcCPCADIAMoAtgBNgJEIAMgEDYCXCADIA82AlQgAyACNgJQIAMgEToATSADIA06AEwgAyAKNgJIIAMgASgCrAEiCzYChAEgAyABKAKoASIMNgKAASADIAg2AlggAyASNgJgIAMgASgCuAE2ApABIAMgASkDsAE3A4gBIAMgAykDmAE3AmQgAyADKQOgATcCbCADIAMpA6gBNwJ0IAMgAygCsAE2AnwgASAIQQFyNgJ4IAFBsAFqIQIgASgCsAEhCgJAAkAgBkELRw0AIANB0AFqIAEQxgEMAQsgAUELNgKIASADIAEpApgBNwPQASADIAEoAqABNgLYASABQYwBaiEPAkAgDkEKRg0AIAcQvAsLIAEgBjYCCCABIA8pAgA3AgwgASAPKAIINgIUCyADQeAAaiEGIANBiAFqIQ8gASkDsAEhFCACIAMpA9ABNwIAIAIgAygC2AE2AgggASAUNwOoASADQZgBaiABIAoQxAECQAJAAkAgAygCmAEiCkGAgICAeGoOAgEABAsgASADQTBqEMsIIAIgDygCCDYCCCACIA8pAwA3AwACQCABKAKIAUEOcUEKRg0AIAQQvAsLIAEgCzYCrAEgASAMNgKoASAEIAYpAxg3AxggBCAGKQMQNwMQIAQgBikDCDcDCCAEIAYpAwA3AwAgAygCnAEiAkEIahDmAyACQSBBCBDUFAwBCyABIANBMGoQywggAiAPKAIINgIIIAIgDykDADcDAAJAIAEoAogBQQ5xQQpGDQAgBBC8CwsgASALNgKsASABIAw2AqgBIAQgBikDGDcDGCAEIAYpAxA3AxAgBCAGKQMINwMIIAQgBikDADcDAAsgBCgCACEGCyAGQQtGDQMMBAsgASABKAJ4QX5xIAhBAXFyNgJ4IAMgAygCvAE2AiggAyADKQK0ATcDICADIAMpAqwBNwMYIAMgAykCpAE3AxAgAyADKQKcATcDCAJAIAlBCkYNACADQThqELwLCwJAIBJBDnFBCkYNACAGELwLC0HAABCKASIERQ0BIAQgCjYCBCAEQR42AgAgBCADKQMINwIIIAQgAykDEDcCECAEIAMpAxg3AhggBCADKQMgNwIgIAQgAygCKDYCKEEAIQUMBAtBCEHAABCgJAALQQhBwAAQoCQACyABKQMIIRQgAUEKNgIIIAMgASkDEDcDoAEgAyAUNwOYASADQcAAaiABEMYBIAEpAwghFCABQQo2AgggAyABKQMQNwM4IAMgFDcDMCABQQhqIQICQAJAIAEo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IQADQAJAAkAgACgCAEEJRw0AIABBCGogARD5AgwBCyAAIAEQmwMLIABBOGohACACQUhqIgINAAsLDwsAC78TAgh/A34jAEHAGmsiAyQAIANCg4CAgBA3AhwgA0KDgICAEDcCECADQoOAgIAQNwIoIANBADoAMSADQYACOwEkIANBAjYCDCADQQE6ABggA0ECQQEgAkH1A0kbIgQ6ADAgA0GADmogA0EoahDhCCADIAMpAY4ONwPwDSADIAMvAZYOOwH4DSADLQCNDiEFIAMtAIwOIQYgAygCiA4hByADKAKEDiEIIAMoAoAOIQkCQAJAAkACQAJAIAMoArQRIgpBgICAgHhHDQAgAyADKQPwDTcD8AUgAyADLwH4DTsB+AUgBiEEDAELIANBoBRqQRhqIANBgA5qQRhqQZwD/AoAACADQaAUakG4A2ogA0GADmpBuANqQegC/AoAACADIAU6AK0UIAMgBjoArBQgAyAHNgKoFCADIAg2AqQUIAMgCTYCoBQgAyAKNgLUFyADIAMpA/ANNwGuFCADIAMvAfgNOwG2FCADQeAXaiEFAkAgAygC6BciCSADKALgF0cNACAFEJIaCyADKALkFyAJQQlsaiIIQgA3AAAgCEEAOgAIIAMgCUEBajYC6BcgA0H4F2ohBwJAIAMoAoAYIgkgAygC+BdHDQAgBxCRGgsgA0HUF2ohBiADKAL8FyAJQQN0akIANwIAIAMgCUEBajYCgBggA0HsF2ohCgJAIAMoAvQXIgkgAygC7BdHDQAgChCPGgsgAygC8BcgCUECdGpBADYCACADIAlBAWo2AvQXIANBgA5qIAZBABCMEAJAAkACQCADKAKADiIJQQNGDQAgAyADKQGODjcD4A0gAyADLwGWDjsB6A0MAQsgA0GADmogBkEAEIwQAkAgAygCgA4iCUEDRg0AIAMgAykBjg43A+ANIAMgAy8Blg47AegNDAELIANBgA5qIAZBABCMECADKAKEDiEIAkACQCADKAKADiIJQQNGDQAgAyADKQGODjcD4A0gAyADLwGWDjsB6A0MAQsgAyAINgKsGiADQYAOaiAGQQAQjBAgAygChA4hCAJAIAMoAoAOIglBA0YNACADIAMpAY4ONwPgDSADIAMvAZYOOwHoDQwBCyADIAg2ArAaIANBgA5qIANBoBRqEJYPAkAgAygCgA4i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IAYoAgg2AhQLIAEgASgCtAEiBzYCrAEgASABKAKwASIINgKoASADIAIpA2A3AgAgAyACKAJoNgIIAkACQAJAIAEtALgBIgUNAAJAAkAgASgCiAEiBUELRw0AIAJB4ABqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwNgIAIgASgCoAE2AmggAUGMAWohBgJAIAEoAghBCkYNACABQQhqELwLCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhEyADIAIpA2A3AgAgAyACKAJoNgIIIAEgEzcDqAEgASABKAJ4IgVBv///X3FBwAByNgJ4IAIgARC4AyACKAIAIQYgASAFNgJ4IAIoAgQhCSAGQQFxRQ0BIAggByAJENoSIQEgAEEANgIAIAAgATYCBAwCCyABKAK0ASEDIAEoArABIQYgAkEIaiAFEMYlIAJBjwKtQiCGQZ+2gQGthDcDICACQeAAakHNlYABIAJBIGoQzQggAiACKQIINwJsIAIgAigCEDYCdCAGIAMgAkHgAGoQwBshBQJAIAEtALgBQaIBRw0AIAEgARCFDhCTCQsgAEEANgIAIAAgBTYCBAwBCwJAAkACQAJAIAEtALgBIgVBAUcNAAJAAkAgASgCiAEiBUELRw0AIAJB4ABqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwNgIAIgASgCoAE2AmggAUGMAWohBgJAIAEoAghBCkYNACABQQhqELwLCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhEyADIAIpA2A3AgAgAyACKAJoNgIIIAEgEzcDqAEgASABKAJ4IgVB////331xNgJ4IAJBoAFqIAEQjQogASAFNgJ4IAIoAqABQRNGDQFBMBCKASIKDQJBCEEwEKAkAAsgASgCtAEhAyABKAKwASEGIAJBFGogBRDGJSACQY8CrUIghkGS8JoBrYQ3AyAgAkHgAGpBzZWAASACQSBqEM0IIAIgAikCFDcCbCACIAIoAhw2AnQgBiADIAJB4ABqEMAbIQUCQCABLQC4AUGiAUcNACABIAEQhQ4QkwkLIABBADYCACAAIAU2AgQMAgsgACACKAKkATYCBCAAQQA2AgAMAQsgCiACKQPIATcDKCAKIAIpA8ABNwMgIAogAikDuAE3AxggCiACKQOwATcD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DkEIaigCACEQQcAAEIoBIhFFDQEgAkHwAGogDkEEaigCABBOIBEgAikDqAE3AzggESACKQOgATcDMCARIAIpA5gBNwMoIBEgAikDkAE3AyAgESACKQOIATcDGCARIAIpA4ABNwMQIBEgAikDeDcDCCARIAIpA3A3AwBBBSESDAULIA5BLGooAgAhEyAOQShqKAIAIRQCQAJAAkACQCAOQTBqKQMAIiBQDQAgDkE8aigCACEQIA5BOGooAgAhDyAOQdQAaigCACEVIA5B0ABqKAIAIRYCQCAgQgODQgBSDQAgIKciESARKAIAIhFBAWo2AgAgEUF/TA0DCyAOQcwAaigCACEXIA5ByABqKAIAIRggDkHAAGopAwAiIachEQJAICFCA4NCAFINACARIBEoAgAiEkEBajYCACASQX9MDQMLICFCIIinIRkMAQsgDkHEAGooAgAhGSAOQcAAaigCACERIA5BOGopAwAiIKchDwJAICBCA4NCAFINACAPIA8oAgAiEkEBajYCACASQX9MDQILICBCIIinIRBCACEgCyAOKAIAIhJBBEYNBQJAAkACQAJAIBIOBAAFAQIACyAOQQxqKAIAIRogDkEIaiIbKAIAIRwgDkEUaigCACEdIA5BEGooAgAhHgJAIBspAwAiIUIDg0IAUg0AICGnIhsgGygCACIbQQFqNgIAIBtBf0wNBAsgDkEYaikDACIiUEUNAkIAISIMCAtBoAEQigEiH0UNBSACQfAAaiAOQQRqKAIAEP0BIB8gAkHwAGpBoAH8CgAADAcLIA5BGGopAgAhIiAOQRRqKAIAIR0gDkEQaigCACEeIAJB8ABqIA5BBGoQ+QQgDkEgaikCACEjIAIoAnghGiACKAJ0IRwgAigCcCEfDAYLICJCA4NCAFINBSAipyIOIA4oAgAiDkEBajYCACAOQX9KDQULAAsgDkEUaigCACEdIA5BEGooAgAhHiAOQQRqKAIADQIgDkEMaigCACEaIA5BCGooAgAhHEEAIR8MAwtBCEHAABCgJAALQQhBoAEQoCQAC0HAABCKASIcRQ0EIAJB8ABqIA5BCGooAgAQTiAcIAIpA6gBNwM4IBwgAikDoAE3AzAgHCACKQOYATcDKCAcIAIpA5ABNwMgIBwgAikDiAE3AxggHCACKQOAATcDECAcIAIpA3g3AwggHCACKQNw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AhQgACACKQOgAjcCDCAAQYYIOwEkIABBDTYCCCAAQqKAgICggICAgH83AgAMDAsgACACKQOwAjcCHCAAIAIpA6gCNwIUIAAgAikDoAI3AgwgAEGGCjsBJCAAQQs2AgggAEKigICAoICAgIB/NwIADAsLIAAgAikDsAI3AhggACACKQOoAjcCECAAIAIpA6ACNwIIIABBAjoAICAAQqKAgICwgICAgH83AgAMCgsgACACKQOwAjcCGCAAIAIpA6gCNwIQIAAgAikDoAI3AgggAEEDOgAgIABCooCAgLCAgICAfzcCAAwJCyACIAIpA7ACNwPIAiACIAIpA6gCNwPAAiACIAIpA6ACNwO4AkEEIQMgBCgCACABKAIIRg0EIAEQmwpB+wBHDQQgAkHQAmogASACQRBqEJgEIAItANQCIQEgAigC0AIiBUEiRg0DIABBBWogAkHQAmpBBWpBO/wKAAAgACABOgAEIAAgBTYCAAwICyAAIAIpA7ACNwIYIAAgAikDqAI3AhAgACACKQOgAjcCCCAAQQU6ACAgAEKigICAsICAgIB/NwIADAcLIAAgAikDsAI3AhggACACKQOoAjcCECAAIAIpA6ACNwIIIABBCDoAICAAQqKAgICwgICAgH83AgAMBgsgACACKQOwAjcCGCAAIAIpA6gCNwIQIAAgAikDoAI3AgggAEEJOgAgIABCooCAgLCAgICAfzcCAAwFCyABQf8BcUEMRg0AIAIgBCgCCDYCzAIgAiAEKQIANwLEAiABIQMLIAAgAikDyAI3AhggACACKQPAAjcCECAAIAIpA7gCNwIIIAAgAzoAICAAQqKAgICwgICAgH83AgAMAwsCQCADLQBlDQAgAkHYAGogARCPDiACIAIoAmw2AlQgAiACKQJkNwJMIAIgAikDEDcDQCACIAIoAhg2AkggAkEgNgKQASACQdACaiABKAIEIAEoAgggAkHAAGogAkGQAWoQ3A4gACACQdACakHAAPwKAAAMAwsgAkEgaiABEIQGIABCooCAgKCAgICAfzcCACAAIAIpAjA3AhggACACKQI4NwIgIAIgAikDEDcCJCAAIAIpAiA3AgggAiACKAIYNgIsIAAgAikCKDcCEAwCCyACQQxqQdDaiQFB1NqJARDGHAALIAJBgAJqIAEQuQwgAEKigICA0ICAgIB/NwIAIAAg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lYABIAJByAJqEK8QIAIgAikCvAI3AiwgAiACKALEAjYCNCANIAkgAkEgahDAGyEOAkAgAS0AuAFBogFHDQAgARDEFCEJIAEQshAgASAJEJMJCyAPIRALIBAQjAIgEEHAAEEIENQUIAEgAzYCeAwDCyAIKQMAIRUgCEEKNgIAIAIgCCkDCDcDKCACIBU3AyACQAJAIBWnIgNBCkYNACADQQVGDQEgAkEgahC8CwtBiPOaAUEoQZCImwEQtyEACyABKAKwASIDIAEoAmwiEUkNCSABKAK0ASIPIAEoAnBLDQkgAikDKCEWIAEoAmAgAyARa2ogDyADaxCGGSEVIAJBIGogARD2ASABIA82AqwBIAEgAzYCqAEgCSACKQIgNwIAIAkgAigCKDYCCCAPrUIghiADrYQhFyAWQiCIpyERIBanIRBBACESDAYLIAEgASgCeCIDQf+/f3E2AnggAkEgaiABKAKwAUEAIAEQZSABIAM2AnggAigCICEOIAIoArABIgNBgYCAgHhGDQEgAikCPCEWIAIpAjQhGCACKQIsIRkgAigCKCETIAIoAiQhFCACQcwBaiALQewA/AoAACACIAooAgg2AsgBIAIgCikCADcDwAFBBCESAkAgA0GAgICAeEcNACAYIRcgFiEaIBkhFSATIREgFCEQIA4hDwwGC0GgARCKASIPRQ0JIA8gFjcCHCAPIBg3AhQgDyAZNwIMIA8gEzYCCCAPIBQ2AgQgDyAONgIAIA9BJGogAkHMAWpB7AD8CgAAIA8gAzYCkAEgDyACKQPAATcClAEgDyACKALIATYCnAFBAyESDAULIAJBIGpBBHJBowEQxiUgAkEgNgI0IAJBnISbATYCMCACQbCAgIB4NgIgIAEoArABIAEoArQBIAJBIGoQwBshDgsgDkEIahDmAyAOQSBBCBDUFAsgACACKAIcNgIIIAAgAikCFDcCACACQdACaiQADwsgASgCsAEhEiABKAK0ASERIAJBIGogARD2ASABIBE2AqwBIAEgEjYCqAEgCSACKQIgNwIAIAkgAigCKDYCCEECIRIgDiEQCyABIAM2AngLAkAgDSACKAIURw0AIAJBFGoQthogAigCGCEECyAEIAxqIgMgGjcDACADQXhqIBc3AwAgA0FwaiAVNwMAIANBbGogETYCACADQWhqIBA2AgAgA0FkaiAPNgIAIANBYGogEjYCACAMQShqIQwgDUEBaiENDAALCyADIAIoAigQ/CAAC0G8jpsBQdYAQZSPmwEQtyEAC0EIQaABEKAkAAupDwEFfyMAQRBrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOFBISAAECAwQFBgcICQoLDA0ODxAREgsgAS0ANEEBRw0RAkAgAEEEaiIDKAIAQYCAgIB4Rg0AIAIgAzYCBCACIABBEGo2AgwgAiAAQRxqNgIIIAEgAkEEahD/BQwSCyACIABBFGo2AgwgAiAAQSBqNgIIIAIgAEEIajYCBCABIAJBBGoQ/wUMEQsgAS0ANEEBRw0QIAEtADohBCABQQE6ADogAEEQaiEDIAEtADkhBQJAIAAtACRBAkcNAANAIAMoAgAiBkEYaiEDIAYtACxBAkYNAAsgAUEBOgA5CyABIAMQsBICQCAAKAIoIgBFDQAgACABEJUSCyABIAQ6ADogASAFOgA5DBALIAEtADRBAUcNDyABLQA6IQUgAUEBOgA6IABBEGohAyABLQA5IQQCQAJAIAAtAERBBEYNACABIAMQxxEMAQsCQCAALQAkQQJHDQADQCADKAIAIgZBGGohAyAGLQAsQQJGDQALIAFBAToAOQsgASADELASCyABQQE6ADogASAEOgA5AkAgACgCWCIARQ0AIAAgARCVEgsgASAFOgA6IAEgBDoAOQwPCyABLQA0QQFHDQ4gACgCDCIDRQ0OIANBOGwhAyAAKAIIIQADQAJAIAEtADRBAUcNACAAIAEQswELIABBOGohACADQUhqIgMNAAwPCwsgAS0ANEUNDSABLwA5IQMgAUGBAjsAOSAAKAIEIAEQkQIgASADOwA5DA0LIAEtADRBAUcNDCABLQA6IQYgAUEBOgA6IAEtADkhBAJAIAAoAgwiA0UNACADQThsIQMgACgCCEEwaiEAA0ACQCABLQA0QQFHDQAgAUGBAjsAOSAAKAIAIAEQkQIgAUGBAjsAOQsgAEE4aiEAIANBSGoiAw0ACwsgASAGOgA6IAEgBDoAOQwMCyABLQA0QQFHDQsgAS8AOSEDIAFBgQI7ADkgACgCBCABEJECIAEgAzsAOQwLCyABLQA0QQFHDQogAS8AOSEDIAFBgQI7ADkgACgCBCABEJECIAEgAzsAOQwKCyABLQA0QQFHDQkgACgCBEEBRxogAEEIaiABEOIRDAkLIAEtADRBAUcNCCABLQA6IQMgAS0AOSEGIAFBgQI7ADkgACgCBCABEJECAkAgAS0ANEEBRw0AIAFBgQI7ADkgACgCCCABEJECIAEtADRBAUcNACABQYECOwA5IAAoAgwgARCRAiABLQA0QQFHDQAgAUGBAjsAOSAAKAIQIAEQkQILIAEgAzoAOiABIAY6ADkMCAsgAS0ANEEBRw0HIAEtADohBiABQQE6ADogAS0AOSEEIAEgAEEYahCwEiABLQA0IQMCQCAAKAI0IgVFDQAgA0EBcUUNACABQYECOwA5IAUgARCRAiABLQA0IQMLAkAgACgCMCIARQ0AIANBAXFFDQAgAUGBAjsAOSAAIAEQkQILIAEgBjoAOiABIAQ6ADkMBwsgAS0ANEEBRw0GIAEvADkhAyABQYECOwA5IAAoAgQgARCRAiABIAM7ADkMBgsgAS0ANEEBRw0FIAEvADkhAyABQYECOwA5IAAoAgQgARCRAiABIAM7ADkMBQsgAS0ANEEBRw0EIAEtADkhAyABLQA6IQYgAUGBAjsAOSAAKAIEIAEQkQIgASAGOgA6IAEgAzoAOSABLQA0QQFHDQQgAUGBAjsAOSAAKAIIIAEQkQIgASAGOgA6IAEgAzoAOQwECyABLQA0QQFHDQMgAUEAOgA5IAEgAEEYahCwEiABLQA0IQMCQCAAKAI0IgZFDQAgA0EBcUUNACABLQA6IQMgAUGBAjsAOSAGIAEQkQIgASADOgA6IAEtADQhAwsCQCAAKAIwIgZFDQAgA0EBcUUNACABLQA6IQMgAUGBAjsAOSAGIAEQkQIgASADOgA6IAEtADQhAwsCQCAAKAJAIgZFDQAgA0EBcUUNACABLQA6IQMgAUGBAjsAOSAGIAEQkQIgASADOgA6IAEtADQhAwsgAUEBOgA5IAAoAkQiAEUNAyADQQFxRQ0DIAEtADohAyABQQE6ADogACABEJECIAEgAzoAOiABQQE6ADkMAwsgACgCCEEASA0CIAAoAhAiA0UNAiABLQA0QQFHDQIgA0ECdCEDIAAoAgwhAANAAkAgAS0ANEEBRw0AIAEvADkhBiABQYECOwA5IAAoAgAgARCRAiABIAY7ADkLIABBBGohACADQXxqIgMNAAwDCwsgAS0ANEEBRw0BIAEtADohAyABQQE6ADogAS0AOSEGAkAgAC0AHEECRg0AIAEgAEEIahCwEgsgASADOgA6IAEgBjoAOSAAKAIoIgBFDQEgACABEM8eDAELIAEtADRBAUcNACAAKAJAIgBFDQAgAS0AOiEGIAEtADkhBCABQYECOwA5AkAgACgCCCIDRQ0AIANBAnQhAyAAKAIEIQADQAJAIAEtADRBAUcNACABQYECOwA5IAAoAgAgARCRAiABQYECOwA5CyAAQQRqIQAgA0F8aiIDDQALCyABIAY6ADogASAEOgA5CyACQRBqJAALgw8CEX8BfiMAQcAAayIEJAACQAJAIAMoAgANACAEQQRqIAEoArANIAEoArQNIgUoAghBf2pBeHFqQQhqIgYgAygCCCIHIAMoAgwiCCADKAIQIgkgAygCFCIKIAUoAhAiCxETAAJAAkAgBCgCBEEBRw0AIAJBmANqIQwgAUGQBWohDSADLQAYIQ5BACEPIAEtAKwNQQFxIRAgASkDAEIChSABKQMIhCEVIAkhEQNAIAQoAgghEiAEIAQoAgwiBTYCJCAEIAk2AiACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBSAISw0AIAkgBUEBaksNACAEIBNBgH5xIA5yIhM2AhwgBCAFNgIYIAQgCTYCFCAEIAg2AhAgBCAHNgIMIARBATYCBCAQDQEgFVANAyACKALIBEECRg0CIARBMGogDSAMIARBBGogDxDwASAEKAI0IRQCQAJAAkACQCAEKAIwIg9BAkcNACAUQQFxRQ0DIARBBGogASACIAMQyQUgBCgCBA0BQQAhBQwCCyAPRQ0OIAQgBCgCOCIFNgIgIAQgCjYCJCAKIAhLDQcgBSAKQQFqSw0HIAQgDjYCHCAEIAo2AhggBCAFNgIUIAQgCDYCECAEIAc2AgwgBCAUNgIIIARBAjYCBCACKALIBEECRg0IIAJB2AFqIQUCQAJAAkACQAJAAkACQAJAIAEoAoAFIgktAOICDQAgBEEwaiABIAUgBEEEahBSIAQoAjAiBUECRg0BIAVBAXFFDQcgBCgCOCEJIAQoAjQhCAwUCyAJLQDjAiESIARBMGogASAFIARBBGoQUiAEKAIwIglBAkcNAQsgBCAEKAI0IgU2AiQgBEECNgIgDAELIAlBAUcNBCAEKAI4IQkgBCgCNCEIIBJBAXFFDREgBEEgaiAEQQRqIAggCSAJIAEgBRCCCCAEKAIgIgVBAkcNASAEKAIkIQULIAUQ6BUaIARBMGogASACIAMQyQUgBCgCMA0BQQAhBQwCCyAFRQ0CIAQoAighCSAEKAIkIQgMEAsgACAEKQI4QiCJNwIEQQEhBQsgACAFNgIADBQLQbOfhQFBzwFBnKCFARDkGwALIAAgBCkCDEIgiTcCBEEBIQULIAAgBTYCAAwRCyACKALIBEECRg0GIAJB2AFqIQUCQAJAAkACQAJAIAEoAoAFIgktAOICDQAgBEEEaiABIAUgAxBSIAQoAgQiBUECRg0BQQEhCSAFQQFGDQRBACEJDA0LIAktAOMCIQogBEEEaiABIAUgAxBSIAQoAgQiCUECRw0BCyAEIAQoAggiBTYCNCAEQQI2AjAMAQsgBCgCDCEIIAQoAgghEiAJQQFHDQogCkEBcUUNCiAEQTBqIAMgEiAIIAggASAFEIIIIAQoAjAiCUECRw0JIAQoAjQhBQsgBRDoFRogBEEEaiABIAIgAxDJBQJAAkAgBCgCBA0AQQAhBQwBCyAAIAQpAgxCIIk3AgRBASEFCyAAIAU2AgAMEQsgBCgCDCEIIAQoAgghEgwICyAEIAg2AiwgBEEHNgI8IARB+AA2AjQgBCAEQSxqNgI4IAQgBEEgajYCMEHgh4ABIARBMGpB6OOaARDkGwALQYjzmgFBKEGwjIUBELchAAtB7IGFARDDIwALQYz9hAFBkQFB5P2EARDkGwALIAQgCDYCLCAEQQc2AjwgBEH4ADYCNCAEIARBLGo2AjggBCAEQSBqNgIwQeCHgAEgBEEwakHo45oBEOQbAAtBvIGFARDDIwALQbyBhQEQwyMACyAEKAI4IQggBCgCNCESCyAAIAg2AgggACASNgIEIAAgCTYCAAwHC0EBIQULIAAgCTYCCCAAIAg2AgQgACAFNgIADAULIBEgCk8NASASQX9GDQIgBEEEaiAGIAcgCCASQQFqIhEgCiALERMAIAUhDyAEKAIEDQALCyAAQQA2AgAMAgtB1P2EARDDIwALAkACQAJAAkAgAS0ArA1BAUYNAAJAAkACQCABKQMAQgKFIAEpAwiEUA0AIAIoAsgEQQJGDQQgAkHYAWohBQJAAkACQCABKAKABSIJLQDiAg0AIARBBGogASAFIAMQUiAEKAIEIgVBAkcNAQwICyAJLQDjAiEKIARBBGogASAFIAMQUiAEKAIEIglBAkYNByAEKAIMIQggBCgCCCESIAlBAUcNBCAKQQFxRQ0EIARBMGogAyASIAggCCABIAUQggggBCgCMCIJQQJHDQEgBCgCNCEFDAgLQQEhCSAFQQFGDQJBACEJDAMLIAQoAjghCCAEKAI0IRIMAgsgBEEEaiABIAIgAxDJBQJAAkAgBCgCBA0AQQAhBQwBCyAAIAQpAgxCIIk3AgRBASEFCyAAIAU2AgAMBgsgBCgCDCEIIAQoAgghEgsgACAINgIIIAAgEjYCBCAAIAk2AgAMBAtBiPOaAUEoQYCMhQEQtyEAC0G8gYUBEMMjAAsgBCgCCCEFCyAFEOgVGiAEQQRqIAEgAiADEMkFAkACQCAEKAIEDQBBACEFDAELIAAgBCkCDEIgiTcCBEEBIQULIAAgBTYCAAsgBEHAAGokAAu0DgIHfwF+AkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOCwABAgMEBQYHCAkKAAsgASAAQQhqEOkJDwsgAS0AKCECIAFBADoAKCABLQB5IQMgAUEAOgB5IAFBLGohBAJAIAAoAigiBSgCAEEaRw0AIAVBGGooAgAhBgJAIAUpAwgiCUIDg0IAUg0AIAmnIgcgBygCACIHQQFqNgIAIAdBf0wNCwsgBCAJIAYQugwLIAUgARBuIAEgAjoAKCABIAM6AHkgACgCCEECRw0IIAFBADoAeSABQQA6ACgCQCAAKAIMIgAoAgBBGkcNACAAQRhqKAIAIQUCQCAAKQMIIglCA4NCAFINACAJpyIGIAYoAgAiBkEBajYCACAGQX9MDQsLIAQgCSAFELoMCyAAIAEQbiABIAI6ACggASADOgB5DwsgACgCCEUNByABLQAoIQUgAUEAOgAoIAEtAHkhAiABQQA6AHkCQCAAKAIMIgAoAgBBGkcNACAAQRhqKAIAIQMCQCAAKQMIIglCA4NCAFINACAJpyIEIAQoAgAiBEEBajYCACAEQX9MDQoLIAFBLGogCSADELoMCyAAIAEQbiABIAU6ACggASACOgB5DwsgAS0AKCEFIAFBADoAKCABLQB5IQIgAUEAOgB5AkAgACgCBCIAKAIAQRpHDQAgAEEYaigCACEDAkAgACkDCCIJQgODQgBSDQAgCaciBCAEKAIAIgRBAWo2AgAgBEF/TA0JCyABQSxqIAkgAxC6DAsgACABEG4gASAFOgAoIAEgAjoAeQ8LAkAgACgCBCIAKAIAIgVBA0cNACABLQAoIQMgAUEAOgAoIAEtAHkhBCABQQA6AHkgAUEsaiEHAkAgACgCECIFKAIAQRpHDQAgBUEYaigCACECAkAgBSkDCCIJQgODQgBSDQAgCaciBiAGKAIAIgZBAWo2AgAgBkF/TA0JCyAHIAkgAhC6DAsgBSABEG4gASADOgAoIAEgBDoAeSAAQQxqKAIAIgVFDQYgBUEEdCECIABBCGooAgBBDGohAANAIAFBADoAeSABQQA6ACgCQCAAKAIAIgUoAgBBGkcNACAFQRhqKAIAIQYCQCAFKQMIIglCA4NCAFINACAJpyIIIAgoAgAiCEEBajYCACAIQX9MDQoLIAcgCSAGELoMCyAFIAEQbiABIAM6ACggASAEOgB5IABBEGohACACQXBqIgINAAwHCwsgAS0AKCEDIAFBADoAKCABLQB5IQQgAUEAOgB5AkAgACgCICICKAIAQRpHDQAgAkEYaigCACEGAkAgAikDCCIJQgODQgBSDQAgCaciByAHKAIAIgdBAWo2AgAgB0F/TA0ICyABQSxqIAkgBhC6DAsgAiABEG4gASADOgAoIAEgBDoAeSAFQQJHDQUgAUEAOgB5IAFBADoAKAJAIAAoAgQiACgCAEEaRw0AIABBGGooAgAhBQJAIAApAwgiCUIDg0IAUg0AIAmnIgIgAigCACICQQFqNgIAIAJBf0wNCAsgAUEsaiAJIAUQugwLIAAgARBuIAEgAzoAKCABIAQ6AHkPCyABLQAoIQUgAUEAOgAoIAEtAHkhAiABQQA6AHkCQCAAKAIEIgAoAgBBGkcNACAAQRhqKAIAIQMCQCAAKQMIIglCA4NCAFINACAJpyIEIAQoAgAiBEEBajYCACAEQX9MDQcLIAFBLGogCSADELoMCyAAIAEQbiABIAU6ACggASACOgB5DwsgAS0AKCEFIAFBADoAKCABLQB5IQIgAUEAOgB5AkAgACgCBCIAKAIAQRpHDQAgAEEYaigCACEDAkAgACkDCCIJQgODQgBSDQAgCaciBCAEKAIAIgRBAWo2AgAgBEF/TA0GCyABQSxqIAkgAxC6DAsgACABEG4gASAFOgAoIAEgAjoAeQ8LIAEtACghBSABQQA6ACggAS0AeSECIAFBADoAeQJAIAAoAgQiACgCAEEaRw0AIABBGGooAgAhAwJAIAApAwgiCUIDg0IAUg0AIAmnIgQgBCgCACIEQQFqNgIAIARBf0wNBQsgAUEsaiAJIAMQugwLIAAgARBuIAEgBToAKCABIAI6AHkPCyABLQAoIQUgAUEAOgAoIAEtAHkhAiABQQA6AHkCQCAAKAIEIgAoAgBBGkcNACAAQRhqKAIAIQMCQCAAKQMIIglCA4NCAFINACAJpyIEIAQoAgAiBEEBajYCACAEQX9MDQQLIAFBLGogCSADELoMCyAAIAEQbiABIAU6ACggASACOgB5DwsgAS0AKCEFIAFBADoAKCABLQB5IQIgAUEAOgB5AkAgACgCBCIAKAIAQRpHDQAgAEEYaigCACEDAkAgACkDCCIJQgODQgBSDQAgCaciBCAEKAIAIgRBAWo2AgAgBEF/TA0DCyABQSxqIAkgAxC6DAsgACABEG4gASAFOgAoIAEgAjoAeQsPCwAL8g8CCX8FfiMAQZABayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCACIDQX9qDhEKAQEBAQEBAQEBAQEBAQEBAAELAkACQAJAAkAgASgCCCIDDggDAAEHCQkCBQMLIAFBLGohBAwFCyABKAIMQRhqIQQMBAsgASgCDEEsaiEEDAMLIAFBLGohBAwCCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMOEwAZGAECAwQFBgcICQoLDA0OGQ8ACyAAIAFBBGoQ1AMMEgsgACABKAIEEIkBIAAgASgCCBCUAgwRCyABKAIMIgNFDRAgACADEIkBDBALIAFBADoAJCAAIAEoAigQlAIMDwsgAS0AJEECRg0OIAFBADoAJAwOCyABLQAkQQJGDQ0gAUEAOgAkDA0LIAAgASgCBBCJASAAIAEoAggQlAIgASgCFCIDRQ0MIAAgAxCUAgwMCyAAIAEoAhAQiQEgASgCDCIDRQ0LIANBGGwhBCABKAIIIQMDQAJAIANBFGooAgAiBUUNACAAIAUQiQELIAAgAxDUAyADQRhqIQMgBEFoaiIEDQAMDAsLIAAgASgCBBCJAQwKCyAAIAEoAgQiA0HIAGoQ1AMgA0HgAGohBAJAIAMoAgAiBUEIRg0AIANBKGohBgJAIAVBB0YNACADIAAQogUgACgCAEUNACAAIAMQ/wgLIAAgBhDUAwsgBCgCAEGAgICAeEYNCSAAIAQQ1AMMCQsgACABKAIEEIkBIAAgASgCCBCUAgwICyAAIAEoAgQQiQEgACABKAIIEJQCDAcLAkAgASgCBCIDQQJGDQACQCADQQFHDQAgACABKAIIEIkBDAELIAEoAggiAygCCCIERQ0AIAMoAgQiByAEQThsaiEIA0AgACkCACELIABBADYCACACIAApAgg3A2ggAiALNwNgIAcgABCiBQJAIAAoAgBFDQAgACAHEP8IIAAoAgAiCUUNACAAKAIEIgpFDQACQCAAKAIMIgZFDQAgCUEIaiEEIAkpAwBCf4VCgIGChIiQoMCAf4MhCyAJIQMDQAJAIAtCAFINAANAIAQiBUEIaiEEIANBgH5qIQMgBSkDAEKAgYKEiJCgwIB/gyILQoCBgoSIkKDAgH9RDQALIAtCgIGChIiQoMCAf4UhCwsgAyALeqdBAnRB4ANxa0FgahCyEiALQn98IAuDIQsgBkF/aiIGDQALCyAKIApBBXRBJ2pBYHEiA2pBCWoiBEUNACAJIANrIARBCBDUFAsgACACKQNoNwIIIAAgAikDYDcCAAJAIAcoAjAiA0UNACAAIAMQiQELIAdBOGoiByAIRw0ACwsCQCABKAIYIgNFDQAgACADEIkBCwJAIAEoAhwiA0UNACAAIAMQiQELIAAgASgCDBCUAgwGCwJAAkACQAJAIAEoAgQOAwABAgALIAEoAggiAygCCCIERQ0CIARBOGwhBCADKAIEIQMDQCADIAAQigogA0E4aiEDIARBSGoiBA0ADAMLCyABKAIIIgMoAggiBEUNASAEQThsIQQgAygCBCEDA0AgAyAAEIoKIANBOGohAyAEQUhqIgQNAAwCCwsgASgCCCAAEOUgCyAAIAEoAgwQiQEgACABKAIQEJQCDAULAkACQAJAAkAgASgCBA4DAAECAAsgASgCCCIDKAIIIgRFDQIgBEE4bCEEIAMoAgQhAwNAIAMgABCKCiADQThqIQMgBEFIaiIEDQAMAwsLIAEoAggiAygCCCIERQ0BIARBOGwhBCADKAIEIQMDQCADIAAQigogA0E4aiEDIARBSGoiBA0ADAILCyABKAIIIAAQ5SALIAAgASgCDBCJASAAIAEoAhAQlAIMBAsgACABKAIEEIkBDAMLIAEoAgwiBC0AUA0DIARB0QBqIQQLIAQtAAANAgJAAkAgAw4IAgECAgQEAgACCyABKAIMIgMtAEVBA0YNAyADQSBqEMgNDQEMAwsgASgCKCgCGEGAgICAeEYNAgsgAUEIaiAAEMsFCyABKAIAQRFHDQQgAkHgAGoQ9hsgASkDCCELIAEgAikDYDcDCCABKQMQIQwgASACKQNoNwMQIAEpAxghDSABIAIpA3A3AxggASkDICEOIAEgAikDeDcDICABKQMoIQ8gASACKQOAATcDKCACIA83A1ggAiAONwNQIAIgDTcDSCACIAw3A0AgAiALNwM4IAJBCGogACACQThqQQAQXyACKAIIIgNBbWpBAiADQRJLGw4DAQIDAQsgASkDCCELIAFBADYCCCABKQMAIQwgAUIBNwMAIAIgASkDKDcDiAEgAiABKQMgNwOAASACIAEpAxg3A3ggAiABKQMQNwNwIAIgCzcDaCACIAw3A2AgAkHgAGoQtgQMAwsgASkDCCELIAFBADYCCCABKQMAIQwgAUIBNwMAIAIgASkDKDcDiAEgAiABKQMgNwOAASACIAEpAxg3A3ggAiABKQMQNwNwIAIgCzcDaCACIAw3A2AgAkHgAGoQtgQMAgsgAUEIaiIBENgFIAEgAikDMDcDICABIAIpAyg3AxggASACKQMgNwMQIAEgAikDGDcDCCABIAIpAxA3AwAMAQsgARC2BCABIAIpAzA3AyggASACKQMoNwMgIAEgAikDIDcDGCABIAIpAxg3AxAgASACKQMQNwMIIAEgAikDCDcDAAsgAkGQAWokAA8LAAu+DwIOfwF+IwBB8ABrIgMkAEEAIQQCQAJAAkAgAi0AgQFBIHFFDQAgAiACKAJ4IgVBgCByIgY2AngCQCACLQC4ASIHQRJGDQAgB0E+Rg0AIAIgBTYCeAwBCyACIAY2AnggA0EAOgBAIANBAToAWCADQSBqIANBwABqIANB2ABqIAIQ4gEgAygCJCEEIAMoAiAhBiACIAU2AnggBkEBcQ0BCwJAAkACQAJAIAItALgBIgUNAAJAAkAgAigCiAEiBUELRw0AIANB2ABqIAIQxgEMAQsgAkELNgKIASADIAIpApgBNwNYIAMgAigCoAE2AmAgAkGMAWohBgJAIAIoAghBCkYNACACQQhqELwLCyACIAU2AgggAiAGKQIANwIMIAIgBigCCDYCFAsgAiADKAJgNgK4ASACIAIpA7ABNwOoASACIAMpA1g3ArABIAIgAigCeCIIQf//335xIgdBgICAAXIiCTYCeCABKAIQIQUgASgCDCIKLQAAIQYCQAJAIAEoAhQiCy0AAA0AIAlB//xfcSIHQYACciAHIAZBAXEbIQYMAQsgB0GAg4ABciAIQf/8335xQYCBgAFyIAZBAXEbIQYLIAIgBjYCeCAFQQRqKAIAIQwgBSgCACENIANB2ABqIAIQ7gEgAygCXCEOAkAgAygCWCIPQYCAgIB4Rw0AIAIgCDYCeCAEDQIgDiEEDAULIAMoAmAiEEUNAkEAIQcgDiEFIBAhCQNAQQEhBgJAIAUoAgANACADQRhqIAVBCGoQjRQgAygCHEEERw0AIAMoAhgoAABB9NClmwdHIQYLIAVBwABqIQUgBiAHaiEHIAlBf2oiCQ0ACwJAIAdBAUYNACADQZKAgIB4NgJYIAIgDSAMIANB2ABqEOodCyAOKAIAQQJHDQMgA0EQaiAOEM8DIAMoAhQhBSADKAIQIQYgA0GZgICAeDYCWCACIAYgBSADQdgAahDqHQwDCyACKAK0ASEGIAIoArABIQcgA0EoaiAFEMYlIANBjwKtQiCGQZ+2gQGthDcDQCADQdgAakHNlYABIANBwABqEM0IIAMgAykCKDcCZCADIAMoAjA2AmwgByAGIANB2ABqEMAbIQUCQCACLQC4AUGiAUcNACACIAIQhQ4QkwkLAkAgBEUNACAEEK0PIAQoAgAgBEEEaigCABD0IyAEQRRBBBDUFAsgBSEEDAMLIAQQrQ8gBCgCACAEQQRqKAIAEPQjIARBFEEEENQUIA4hBAwCCyADQZKAgIB4NgJYIAIgDSAMIANB2ABqEOodCyACIAg2AngCQAJAAkACQCACLQC4ASIFQQFHDQAgAkGwAWohBQJAAkAgAigCiAEiBkELRw0AIANB2ABqIAIQxgEMAQsgAkELNgKIASADIAIpApgBNwNYIAMgAigCoAE2AmAgAkGMAWohBwJAIAIoAghBCkYNACACQQhqELwLCyACIAY2AgggAiAHKQIANwIMIAIgBygCCDYCFAsgAikDsAEhESAFIAMpA1g3AgAgBSADKAJgNgIIIAIgETcDqAFBACEFQQAhCAJAIAItAIEBQSBxRQ0AQQAhCCACLQC4AUH/AXFBCUcNACACIAIoAngiBkGAIHI2AnggA0EJOgBYIANBCGogA0HYAGogAhCFAiADKAIIIQcgAiAGNgJ4IAMoAgwhCCAHQQFxDQQLIBBBBnQhByAKLQAAIQwgCy0AACENAkADQCAHIAVGIgkNASAOIAVqIQYgBUHAAGohBSAGKAIARQ0ACwsgA0HYAGogAiANQQFxIAxBAXEgCRDbBCADKAJcIQcgAygCWCIJQYGAgIB4Rw0CIAgNASAHIQgMAwsgAigCtAEhBiACKAKwASEHIANBNGogBRDGJSADQY8CrUIghkGS8JoBrYQ3A0AgA0HYAGpBzZWAASADQcAAahDNCCADIAMpAjQ3AmQgAyADKAI8NgJsIAcgBiADQdgAahDAGyEIIAItALgBQaIBRw0CIAIgAhCFDhCTCQwCCyAIKAIAIgUQpwQgBUHgAEEIENQUIAhBDEEEENQUIAchCAwBCyADIAMpAmg3A1AgAyADKQJgNwNIAkAgCUGAgICAeEcNACACKAKAAUGAwABxRQ0AIBBFDQAgEEEGdCEGIA4hBQNAAkAgBSgCAEEERw0AIAVBEGooAgAhDCAFQQxqKAIAIQ0gA0GqgYCAeDYCWCACIA0gDCADQdgAahDqHQsgBUHAAGohBSAGQUBqIgYNAAsLIAotAAAhBiALLQAAIQogAigCrAEhAiABKAIYKAIAIQsCQEHIABCKASIFRQ0AIAUgEDYCCCAFIA42AgQgBSAPNgIAIAUgBzYCHCAFIAk2AhggBSADKQNINwIgIAUgAykDUDcCKCAFIAo6AEUgBSAGOgBEIAUgCDYCQCAFIAQ2AjxBACEGIAVBADYCOCAFIAI2AjQgBSALNgIwIAUgASkCADcCDCAFIAEoAgg2AhQgBSEEDAMLQQRByAAQoCQACyAOIBAQox8gDyAOEPwjAkAgBEUNACAEEK0PIAQoAgAgBEEEaigCABD0IyAEQRRBBBDUFAsgCCEECyABKAIEIgUgASgCCBDoHSABKAIAIAUQ+iNBASEGCyAAIAQ2AgQgACAGNgIAIANB8ABqJAAL9g8CCX8BfiMAQdACayICJABBAiEDAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAMgBIgRB+wBqIgVBBnQgBUH8AXFBAnZyQf8BcQ4HBAEBAgEDAAELIAEoAsABIQYCQCAEQf8BcUGdAUYNACABKALEASEFIAJBnAFqIAQQ1yUgAkGPAq1CIIZB9P6aAa2ENwOwAiACQagBakHNlYABIAJBsAJqEIUfIAIgAikCnAE3ArQBIAIgAigCpAE2ArwBIAYgBSACQagBahDAGyEFIARB/wFxQaIBRw0JIAEgARCfIxCGFAwJCyABEOURIAJBqAFqIAEQ7QwgAigCsAEhAyACKQOoASILUA0HIAIoArQBIQdBACEEQQAhCCABLQCBAUEgcUUNDyABKAJ4IQUgAkGoAWogARDNBSABIAVBAXI2AngCQCABLQDIASIJQdkARg0AIAEoAsQBIQUgASgCwAEhCCACQaACaiAJENclIAJBjwKtQiCGQcj0mgGthDcDyAIgAkGwAmpBzZWAASACQcgCahCFHyACIAIpAqACNwK8AiACIAIoAqgCNgLEAiAIIAUgAkGwAmoQwBshCCAJQaIBRw0OIAEgARCfIxCGFAwOCyABEOURIAJBKGogARCpBiACIAIoAiwiCDYCtAIgAiACKAIoIgk2ArACAkACQCABKAJ4IgpBgICAwABxDQAgAS0AyAFB/wFxQQpGDQELIAlBAXENDiABIApBfnEgBUEBcXI2AnggAkGoAWoQsyIMEAsgAkG0AmohBQJAAkAgCQ0AIAUQ8QcMAQsgBRCbIQsgASACQagBahC2FAwOCyABEIwJDQhBASEEIAJBqAFqIAFBoP+aAUEBQQAQkwcCQCACLQCoAUUNACACKAKsASEFDAgLIAItAKkBIQUgAkEYaiABEFggAigCHCEDIAIoAhhBAXENCyAFQf8BcUGkAUchBgNAQQAhBCABLQDJAQ0MIAEtAMgBQf8BcUEERw0MIAEQ5RECQAJAIAEtAMgBQQVGDQAgAkEQaiABEIIGIAIoAhQhBQJAAkAgAigCEEEBcQ0AIAIgBTYCnAEgAS0AyAEiBEEFRg0DIAIgAzYCyAIgASgCwAEhBSABKALEASEDIAJBsAJqIAQQ1yUgAkGPAq1CIIZB++OaAa2ENwOgAiACQagBakHNlYABIAJBoAJqEIUfIAIgAikCsAI3ArQBIAIgAigCuAI2ArwBIAUgAyACQagBahDAGyEFAkAgAS0AyAFBogFHDQAgASABEJ8jEIYUCyACQZwBahDxBwwBCyACIAM2AsgCCyACQcgCahDxBwwKCyABEOURIAIgAxCIECABKAK8ASEEIAIoAgAhCEEIQeAAEOggIgUgBDYCDCAFIAg2AgggBSADNgIEIAVBBjYCACAFIQMMAQsgARDlESACQQhqIAMQiBAgASgCvAEhCCACKAIIIQdBCEHgABDoICIEIAY6ABQgBCAINgIQIAQgBzYCDCAEIAU2AgggBCADNgIEIARBDzYCACAEIQMMAAsLIAEoAsABIQggBEH/AXFBkQFGDQIgASgCxAEhBSACQbACaiAEENclIAJBjwKtQiCGQaD/mgGthDcDyAIgAkGoAWpBzZWAASACQcgCahCFHyACIAIpArACNwK0ASACIAIoArgCNgK8ASAIIAUgAkGoAWoQwBshBSAEQf8BcUGiAUcNBgwECyABKALAASEIAkAgBEH/AXFBmQFHDQBBASEDDAILIAEoAsQBIQUgAkGcAWogBBDXJSACQY8CrUIghkHT/5oBrYQ3A8gCIAJBqAFqQc2VgAEgAkHIAmoQhR8gAiACKQKcATcCtAEgAiACKAKkATYCvAEgCCAFIAJBqAFqEMAbIQUgBEH/AXFBogFHDQUMAwsgASgCwAEhCCAEQf8BcUGFAUcNAUEAIQMLIAEQ5REgAkEgaiABEJYCIAIoAiQhBAJAIAIoAiBBAXFFDQAgBCEFDAQLIAEoArwBIQFBCEHgABDoICIFIAM6ABAgBSABNgIMIAUgCDYCCCAFIAQ2AgQgBUEONgIADAULIAEoAsQBIQUgAkGgAmogBBDXJSACQY8CrUIghkHS/5oBrYQ3A8gCIAJBqAFqQc2VgAEgAkHIAmoQhR8gAiACKQKgAjcCtAEgAiACKAKoAjYCvAEgCCAFIAJBqAFqEMAbIQUgBEH/AXFBogFHDQILIAEgARCfIxCGFAwBCyADIQULQQEhBAwHC0EBIQQgAkGoAWogAUEBEIMGIAIoAqgBIgFBgYCAgHhGDQEgAiACKALEATYCWCACIAIpArwBNwNQIAIgAikCtAE3A0ggAiACKQKsATcDQEEIQeAAEOggIgUgATYCBCAFQQI2AgAgBUEIaiACQcAAakHYAPwKAAALQQAhBAwFCyACKAKsASEFDAQLIAMhBQwDCyACIAg2ApwCIAJBATYCmAIgASACQagBahC2FCACQZwCahCbIQtBACEICyACQQA2AjggAkEAOwE8IAEoArwBIQFBCEHgABDoICIFIAg2AjAgBUEAOgAsIAVBADYCKCAFIAc2AiQgBSADNgIgIAUgCzcDGCAFIAc2AhQgBSADNgIQIAUgATYCDCAFIAY2AgggBUEMNgIAIAVBADoAOiAFIAIoAjg2AjQgBSACLwE8OwE4CyAAIAU2AgQgACAENgIAIAJB0AJqJAAL8w0CBH8BfgJAAkACQAJAAkACQAJAAkACQAJAAkBBACAAKAIAIgJBfGoiAyADIAJLGw4JAAECAwQFCQcIAAsCQCACQQNHDQAgACgCBCABEL0BCwJAIAAoAkgiAkUNACAAKAJEIgQgAkEGdGohBQNAAkACQCAEKAIAQQdGDQACQCAEQThqKAIAIgJFDQAgAkEMbCEDIARBNGooAgAhAgNAIAIoAgAgARC9ASACQQxqIQIgA0F0aiIDDQALCyAEIAEQ3gsMAQsCQCAEQThqKAIAIgJFDQAgAkEMbCEDIARBNGooAgAhAgNAIAIoAgAgARC9ASACQQxqIQIgA0F0aiIDDQALCwJAIAQtABxBAkcNACAEKAIIIAEQ3gsgBCgCDCABEL0BDAELIAEgBEEIahCjFQsgBEHAAGoiBCAFRw0ACwsgACgCIEGAgICAeEYNCCAAKAIoIgJFDQggAkEwbCEDIAAoAiQhAgNAIAIgARD5AiACQTBqIQIgA0FQaiIDDQAMCQsLAkAgACgCCEEDRw0AIAAoAgwgARC9AQsCQCAAKAIwIgVBCGooAgAiAkUNACAFQQRqKAIAIgQgAkEGdGohAANAAkAgBEE4aigCACICRQ0AIAJBDGwhAyAEQTRqKAIAIQIDQCACKAIAIAEQvQEgAkEMaiECIANBdGoiAw0ACwsgBCABEN4LIARBwABqIgIhBCACIABHDQALCwJAIAVBFGooAgAiAkUNACACQQxsIQMgBUEQaigCACECA0AgAigCACABEL0BIAJBDGohAiADQXRqIgMNAAsLAkAgBSgCGEGAgICAeEYNACAFQSBqKAIAIgJFDQAgAkEwbCEDIAVBHGooAgAhAgNAIAIgARD5AiACQTBqIQIgA0FQaiIDDQALCwJAIAUoAjwiAkUNACACQQhqKAIAIgNFDQAgA0EwbCEDIAJBBGooAgBBJGohAiABQQxqIQADQAJAIAJBZGopAwAiBkIDg0IAUg0AIAanIgQgBCgCACIEQQFqNgIAIARBf0wNCwsgACAGEOMGGgJAIAJBfGooAgAiBEUNACAEIAEQmQILAkAgAigCACIERQ0AIAQgARCZAgsgAkEwaiECIANBUGoiAw0ACwsgBSgCQCICDQQMBwsCQCAAKAIgIgVBCGooAgAiAkUNACAFQQRqKAIAIgQgAkEGdGohAANAAkAgBEE4aigCACICRQ0AIAJBDGwhAyAEQTRqKAIAIQIDQCACKAIAIAEQvQEgAkEMaiECIANBdGoiAw0ACwsgBCABEN4LIARBwABqIgIhBCACIABHDQALCwJAIAVBFGooAgAiAkUNACACQQxsIQMgBUEQaigCACECA0AgAigCACABEL0BIAJBDGohAiADQXRqIgMNAAsLAkAgBSgCGEGAgICAeEYNACAFQSBqKAIAIgJFDQAgAkEwbCEDIAVBHGooAgAhAgNAIAIgARD5AiACQTBqIQIgA0FQaiIDDQALCwJAIAUoAjwiAkUNACACQQhqKAIAIgNFDQAgA0EwbCEDIAJBBGooAgBBJGohAiABQQxqIQADQAJAIAJBZGopAwAiBkIDg0IAUg0AIAanIgQgBCgCACIEQQFqNgIAIARBf0wNCgsgACAGEOMGGgJAIAJBfGooAgAiBEUNACAEIAEQmQILAkAgAigCACIERQ0AIAQgARCZAgsgAkEwaiECIANBUGoiAw0ACwsgBSgCQCICDQMMBgsCQCAAKAIIQQNHDQAgACgCDCABEL0BCwJAIAAoAjwiAkUNACACIAEQvQELAkAgACgCQCICRQ0AIAIoAgAgARCZAgsgACgCOCICRQ0FIAJBDGwhAyAAKAI0IQIDQCACKAIAIAEQvQEgAkEMaiECIANBdGoiAw0ADAYLCwJAIAAoAiQiAkUNACACIAEQvQELAkAgACgCKCICRQ0AIAIoAgAgARCZAgsgACgCNCICRQ0EIAJBDGwhAyAAKAIwIQIDQCACKAIAIAEQvQEgAkEMaiECIANBdGoiAw0ADAULCwJAIAAoAgwiAkUNACACQShsIQMgACgCCCECA0AgAiABENsMIAJBKGohAiADQVhqIgMNAAsLIAAoAhAiAkUNAwsgAigCACABEJkCDwsgACgCDCICRQ0BIAJBMGwhAyAAKAIIIQIDQCACIAEQ+QIgAkEwaiECIANBUGoiAw0ADAILCwJAIAAoAggiAkEFRg0AIAJBA0cNACAAKAIMIAEQvQELAkAgACgCPCICRQ0AIAIgARC9AQsCQCAAKAJAIgJFDQAgAigCACABEJkCCyAAKAI4IgJFDQAgAkEMbCEDIAAoAjQhAgNAIAIoAgAgARC9ASACQQxqIQIgA0F0aiIDDQALCw8LAAvvDgIXfwN+IwBB4ABrIgQkAAJAAkACQCADKAIADQAgBEEoaiABKALAEiABKALEEiIFKAIIQX9qQXhxakEIaiIGIAMoAggiByADKAIMIgggAygCECIJIAMoAhQiCiAFKAIQIgsREwACQCAEKAIoQQFHDQAgAkHYAWohDCAKQQFqIQ0gAkEYaiEOIAFBsA1qIQ8gASkDCCEbIAEpAwAhHCABLQCsDSEQIAMtABghEUEAIRIgAS0A1BJBAXEhEyABKQOwDUIChSABKQO4DYQhHSAJIRRBACEVA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBCgCLCIFIBVJDQAgBCgCMCEWIAQgCTYCUCAEIAU2AlQgBSAISw0BIAkgBUEBaiIXSw0BIAQgGEGAfnEgEXIiGDYCJCAEIAU2AiAgBCAJNgIcIAQgCDYCGCAEIAc2AhQgBEEBNgIMIBMNAiAdUA0EIAIoAsgBQQJGDQMgBEEoaiAPIA4gBEEMaiASEPABIAQoAiwhGQJAIAQoAigiEkECRw0AIBlBAXFFDQEMEAsCQAJAIBJFDQAgBCAEKAIwIhI2AkQgBCAKNgJIIAogCEsNByASIA1LDQcgBCAaQYB+cSARciIaNgJAIAQgCjYCPCAEIBI2AjggBCAINgI0IAQgBzYCMCAEIBk2AiwgBEECNgIoIBBBAXENCAJAIBxCAoUgG4RQDQAgAigCyARBAkYNCiAEQdAAaiABIAwgBEEoahCiAiAEKAJQIhVBAkYNEiAVQQFHDQIgBUF/Rg0LIAQoAlQhFQwOC0HEgIUBQY8BQYyBhQEQ5BsACyAUIApPDQ4gBUF/Rw0MQaSAhQEQwyMACwJAIBIgBCgCWCIFTQ0AQfzWhAFBJUGQ14QBEOQbAAsgACAFNgIIIAAgGTYCBCAAQQE2AgAMEAsgEEEBcQ0IAkACQAJAAkACQCAcQgKFIBuEUA0AIAIoAsgEQQJGDQ4CQAJAAkACQAJAIAEoAoAFIgUtAOICDQAgBEEoaiABIAwgAxBSIAQoAigiCEECRg0BQQEhBSAIQQFGDQhBACEFDAkLIAUtAOMCIQkgBEEoaiABIAwgAxBSIAQoAigiBUECRw0BCyAEIAQoAiwiBTYCECAEQQI2AgwMAQsgBCgCMCEIIAQoAiwhCiAFQQFHDQYgCUEBcUUNBiAEQQxqIAMgCiAIIAggASAMEIIIIAQoAgwiBUECRw0BIAQoAhAhBQsgBRDoFRogBEEoaiABIAIgAxDJBSAEKAIoDQJBACEFDAMLIAQoAhQhCCAEKAIQIQoMBAsgBEEoaiABIAIgAxDJBQJAAkAgBCgCKA0AQQAhBQwBCyAAIAQpAjBCIIk3AgRBASEFCyAAIAU2AgAMEwsgACAEKQIwQiCJNwIEQQEhBQsgACAFNgIADBELIAQoAjAhCCAEKAIsIQoLIAAgCDYCCCAAIAo2AgQgACAFNgIADA8LIAQgCDYCRCAEQQc2AjQgBEH4ADYCLCAEIARBxABqNgIwIAQgBEHQAGo2AihB4IeAASAEQShqQejjmgEQ5BsAC0GI85oBQShBvI2FARC3IQALQYyNhQEQwyMAC0HEgIUBQY8BQZyBhQEQ5BsACyAEIAg2AkwgBEEHNgJcIARB+AA2AlQgBCAEQcwAajYCWCAEIARBxABqNgJQQeCHgAEgBEHQAGpB6OOaARDkGwALQYjzmgFBKEGgjIUBELchAAtB3IGFARDDIwALQbSAhQEQwyMAC0GI85oBQShBgIyFARC3IQALQbyBhQEQwyMACyAEQShqIAYgByAIIBcgCiALERMAIBchFCAWIRIgBCgCKA0ACwsgAEEANgIADAILAkACQAJAAkAgAS0ArA1BAUYNAAJAAkACQCABKQMAQgKFIAEpAwiEUA0AIAIoAsgEQQJGDQQgAkHYAWohBQJAAkACQCABKAKABSIILQDiAg0AIARBKGogASAFIAMQUiAEKAIoIgVBAkcNAQwICyAILQDjAiEXIARBKGogASAFIAMQUiAEKAIoIghBAkYNByAEKAIwIQogBCgCLCEJIAhBAUcNBCAXQQFxRQ0EIARBDGogAyAJIAogCiABIAUQggggBCgCDCIIQQJHDQEgBCgCECEFDAgLQQEhCCAFQQFGDQJBACEIDAMLIAQoAhQhCiAEKAIQIQkMAgsgBEEoaiABIAIgAxDJBQJAAkAgBCgCKA0AQQAhBQwBCyAAIAQpAjBCIIk3AgRBASEFCyAAIAU2AgAMBwsgBCgCMCEKIAQoAiwhCQsgACAKNgIIIAAgCTYCBCAAIAg2AgAMBQtBiPOaAUEoQYCMhQEQtyEAC0G8gYUBEMMjAAsgBCgCLCEFCyAFEOgVGiAEQShqIAEgAiADEMkFAkACQCAEKAIoDQBBACEFDAELIAAgBCkCMEIgiTcCBEEBIQULIAAgBTYCAAwBCyAEQShqIAEgAiADEMkFAkACQCAEKAIoDQBBACEFDAELIAAgBCkCMEIgiTcCBEEBIQULIAAgBTYCAAsgBEHgAGokAAuQDgIFfwF+IAFBDGohAgJAAkACQANAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOFBERAAECAwQFBgYHCAkKCgsMDQ4QEQsCQCAAKAIEQYCAgIB4Rg0AAkAgACgCDCIDRQ0AIAAoAggiBCADQShsaiEFA0ACQAJAAkACQAJAIAQoAgAOBAABAgMACyAEQQhqIAEQpBUMAwsCQCAEQQxqKAIAIgNFDQAgA0EobCEGIARBCGooAgAhAwNAAkAgAygCAEEHRg0AIAMgARDeCwsgA0EoaiEDIAZBWGoiBg0ACwsgBCgCGCIDRQ0CIAMoAgAgARCZAgwCCyAEKAIEIAEQ3gsgBCgCGCIDRQ0BIAMoAgAgARCZAgwBCyAEQQRqIAEQtQ0LIARBKGoiBCAFRw0ACwsCQCAAKAIcIgNFDQAgA0EIaigCACIGRQ0AIAZBMGwhBiADQQRqKAIAIQMDQCADIAEQ4hMgA0EwaiEDIAZBUGoiBg0ACwsgACgCECgCACEADA8LAkAgACgCECIDRQ0AIAAoAgwiBCADQShsaiEFA0ACQAJAAkACQAJAIAQoAgAOBAABAgMACyAEQQhqIAEQpBUMAwsCQCAEQQxqKAIAIgNFDQAgA0EobCEGIARBCGooAgAhAwNAAkAgAygCAEEHRg0AIAMgARDeCwsgA0EoaiEDIAZBWGoiBg0ACwsgBCgCGCIDRQ0CIAMoAgAgARCZAgwCCyAEKAIEIAEQ3gsgBCgCGCIDRQ0BIAMoAgAgARCZAgwBCyAEQQRqIAEQtQ0LIARBKGoiBCAFRw0ACwsCQCAAKAIgIgNFDQAgA0EIaigCACIGRQ0AIAZBMGwhBiADQQRqKAIAIQMDQCADIAEQ4hMgA0EwaiEDIAZBUGoiBg0ACwsgACgCFCgCACEADA4LIABBEGogARDhEyAAKAIoIgNFDQ8gA0EIaigCACIGRQ0PIAZBAnQhBiADQQRqKAIAIQMDQCADKAIAIAEQmQIgA0EEaiEDIAZBfGoiBg0ADBALCwJAAkAgAC0ARCIDQQRGDQACQCADQQNGDQAgAEEwaiABEOETCwJAIAAoAkgiA0UNACADKAIIIgZFDQAgBkECdCEGIAMoAgQhAwNAIAMoAgAgARCZAiADQQRqIQMgBkF8aiIGDQALCyAAKAJMIgNFDQEgA0EIaigCACIGRQ0BIAZBDGwhBiADQQRqKAIAIQMDQAJAAkAgAygCACIEDQAgA0EEaigCACABEL0EDAELIAQgARC9AQsgA0EMaiEDIAZBdGoiBg0ADAILCyAAQRBqIAEQ4RMLIAAoAlgiA0UNDiADQQhqKAIAIgZFDQ4gBkECdCEGIANBBGooAgAhAwNAIAMoAgAgARCZAiADQQRqIQMgBkF8aiIGDQAMDwsLIAAoAgwiA0UNDSADQThsIQYgACgCCCEDA0AgAyABEPECIANBOGohAyAGQUhqIgYNAAwOCwsgACgCBCEADAoLIAAoAgwiA0UNCyADQThsIQYgACgCCCEDA0ACQCADKAIAQQdGDQAgAyABEN4LCyADQTBqKAIAIAEQmQIgA0E4aiEDIAZBSGoiBg0ADAwLCyAAKAIEIQAMCAsCQCAAKAIEQQFHDQAgACgCECIDRQ0KIANBAnQhBiAAKAIMIQMDQCADKAIAIAEQmQIgA0EEaiEDIAZBfGoiBg0ADAsLCyAAKAIQIgNFDQkgA0ECdCEGIAAoAgwhAwNAIAMoAgAgARCZAiADQQRqIQMgBkF8aiIGDQAMCgsLIAAoAgQgARCZAiAAKAIIIAEQmQIgACgCDCABEJkCIAAoAhAhAAwGCyAAQRBqIAEQ4hMPCyAAKAIEIQAMBAsgACgCBCABEJkCIAAoAgghAAwDCyAAQRBqIAEQ4hMCQCAAKAJAIgNFDQAgAyABEJkCCyAAKAJEIgANAgwECyAAKAIIQQBIDQMgACgCECIDRQ0DIANBAnQhBiAAKAIMIQMDQCADKAIAIAEQmQIgA0EEaiEDIAZBfGoiBg0ADAQLCwJAIAAtABxBAkYNAAJAIAApAwgiB0IDg0IAUg0AIAenIgMgAygCACIDQQFqNgIAIANBf0wNBQsgAiAHEOMGGgsgACgCKCIDRQ0CIAMoAgAhAAwACwsCQCAALQA8QQNGDQAgAEEoaiABEOETCwJAIAAoAkAiA0UNACADQQhqKAIAIgZFDQAgBkECdCEGIANBBGooAgAhAwNAIAMoAgAgARCZAiADQQRqIQMgBkF8aiIGDQALCyAAKAJEIgNFDQAgA0EIaigCACIGRQ0AIAZBDGwhBiADQQRqKAIAIQMDQAJAAkAgAygCACIEDQAgA0EEaigCACABEL0EDAELIAQgARC9AQsgA0EMaiEDIAZBdGoiBg0ACwsPCwALyhADBX8BfgF8IwBB4AFrIgIkACACIAE2AjQCQAJAAkACQAJAAkACQAJAIAEQuCMNAAJAIAEQ0SBB/wFxIgNBAkYNACAAIAM6AAQgAEGAgICAeDYCAAwHCwJAAkACQCABEAJBAUYNACACQbABaiABEAMgAigCsAFFDQIgAisDuAEhCCABEAQNASAAIAg5AwggAEGKgICAeDYCAAwJCyACQbABaiABEIobAkAgAikDsAFCAVINACABIAIpA7gBIgcQBSIDELkjIQQgAxDNIiAEDQQLIAJBsAFqIAEQihsCQCACKQOwAUIBUg0AIAEgAikDuAEiBxAGIgMQuSMhBCADEM0iIAQNBQtBjMCBAUHPABDhGyEDIABBlYCAgHg2AgAgACADNgIEDAgLIABBiICAgHg2AgAgACAI/AY3AwgMBwsgAkE4aiABEMUVAkAgAigCOEGAgICAeEYNACAAIAIoAkA2AgwgACACKQI4NwIEIABBjICAgHg2AgAMBwsCQAJAIAEQmyQNACACQcQAaiACQTRqEIUSIAIoAkRBgICAgHhGDQEgACACKAJMNgIMIAAgAikCRDcCBCAAQY6AgIB4NgIADAgLIAIgATYCpAECQCABEJskRQ0AIAIgARAHIgM2AtgBIAJBADYC1AEgAkEANgLcASACIAJBpAFqNgLQASACQZABaiADQYCABCADQYCABEkbEKocIAJBpAFqIQMCQANAIANFDQEgAkEIaiACQdABahCJGiACKAIIQQFHDQEgAigCDCEDIAIgAigC3AFBAWo2AtwBIAJBsAFqIAMQmgIgAigCtAEhAwJAIAIoArABIgRBlYCAgHhHDQAgAEGVgICAeDYCACAAIAM2AgQgAkGQAWoQiRsMCwsgAiACKQO4ATcDYCACIAM2AlwgAiAENgJYIAJBkAFqIAJB2ABqEIsbIAIoAtABIQMMAAsLIAAgAigCmAE2AgwgACACKQKQATcCBCAAQZSAgIB4NgIADAgLIAJBsAFqIAEQ9QwgAigCsAEhAwJAAkACQCACLQC0ASIEQX5qDgICAAELIABBlYCAgHg2AgAgACADNgIEDAkLIAIgBDoAlAEgAiADNgKQASACQdABakEAEKocAkACQANAIAJBEGogAkGQAWoQzQ8gAigCFCEDAkACQAJAIAIoAhAOAwABBAELIAJBsAFqIAMQmgIgAigCtAEhAyACKAKwASIEQZWAgIB4Rw0BCyAAQZWAgIB4NgIAIAAgAzYCBCACQdABahCJGwwDCyACIAIpA7gBNwNgIAIgAzYCXCACIAQ2AlggAkHQAWogAkHYAGoQixsMAAsLIAAgAigC2AE2AgwgACACKQLQATcCBCAAQZSAgIB4NgIACyACKAKQARDNIgwICyAAIAJBpAFqEMMdDAcLIAEQnCRFDQMQCCIDIAEQuiMhBCADEM0iAkAgBEUNACABEAlFDQQLIAIgATYCUCACQbABaiABEPUMIAIoArABIQMCQAJAAkAgAi0AtAEiBEF+ag4CAgABCyAAQZWAgIB4NgIAIAAgAzYCBAwICyACIAQ6AJwBIAIgAzYCmAEgAkEANgKQASACQaQBakEAEKscIAJBwAFqIQUgAkGYAWohBgJAAkADQCACQSBqIAYQzQ8gAigCJCEDAkACQAJAIAIoAiAOAwABBAELIAJBGGogAxCKHyACKAIYIQMgAigCHCEEIAIoApABIAIoApQBEPQiIAIgBDYClAEgAkEBNgKQASACQdgAaiADEJoCIAIoAlwhAyACKAJYIgRBlYCAgHhGDQAgAiACKQNgIgc3A9gBIAIgAzYC1AEgAiAENgLQASACQdgAaiACQZABahDPHyACKAJYQZWAgIB4Rw0BIAIoAlwhAyACQdABahCIFAsgAEGVgICAeDYCACAAIAM2AgQgAkGkAWoQ4BsMAwsgBSACKQNgNwMIIAUgAikDWDcDACACIAc3A7gBIAIgAzYCtAEgAiAENgKwASACQaQBaiACQbABahD3FwwACwsgACACKAKsATYCCCAAIAIpAqQBNwIACyACQZABahDsIQwHCyACQShqIAEQ+h0CQCACKAIoQQFHDQAgAiACKAIsIgU2AlQgAiAFEAciAzYCaCACQQA2AmQgAkEANgJsIAJBADYCWCACIAJB1ABqNgJgIAJB9ABqIANBgIACIANBgIACSRsQqxwgAkHAAWohBgJAA0AgAkGkAWogAkHYAGoQiRQgAigCpAFBAUcNASACKAKsASEDIAJB0AFqIAIoAqgBEJoCAkAgAigC0AFBlYCAgHhHDQAgAigC1AEhBCADEM0iDAgLIAIgAikD2AE3A5gBIAIgAikD0AE3A5ABIAJB0AFqIAMQmgICQCACKALQAUGVgICAeEcNACACKALUASEEIAJBkAFqEIgUDAgLIAIgAikD2AE3A4gBIAIgAikD0AE3A4ABIAIoApQBIQQCQCACKAKQASIDQev///8Hag4CAggACyACKQOYASEHIAYgAikDgAE3AwAgBiACKQOIATcDCCACIAc3A7gBIAIgBDYCtAEgAiADNgKwASACQfQAaiACQbABahD3FwwACwsgACACKAJ8NgIIIAAgAikCdDcCAAwGCyAAIAJB0ABqEMMdDAYLIABBkoCAgHg2AgAMBQsgARDNIiAAIAc3AwggAEGIgICAeDYCAAwFCyABEM0iIAAgBzcDCCAAQYSAgIB4NgIADAQLIAAgAkE0ahDDHQwCCyAAQZWAgIB4NgIAIAAgBDYCBCACQfQAahDgGwsgAigCWCACKAJcEPQiIAUQzSILIAEQzSILIAJB4AFqJAAL6w4CDn8EfiMAQbABayICJAAgASgCGCIDKAIIIgRBBnQhBSADKAIEIQYCQAJAIAAtAH4iB0EBcUUNAANAAkAgBQ0AQQAhBAwDC0EBIQQCQCAGKAIAIghBfmoOAwMAAwALIAVBQGohBSAGQcAAaiEGQQEhBCAIQQVxQQFHDQAMAgsLAkAgBA0AQQAhBAwBCwNAQQEhBAJAIAYoAgBBfmoOAwIAAgALIAZBwABqIQYgBUFAaiIFDQALQQAhBAsgAEEsaiEJIAAtAH0hBiAAQQA6AH0CQAJAAkACQAJAAkACQAJAAkACQCAGQQFHDQAgAC0AfEEBcQ0BCyABKAIQIQogASkDACIQQgODIhFCAFINAiAQpyIGIAYoAgAiBUEBajYCACAFQX9MDQggCSAQIApBARCtDiAEDQEgAC0AkAENBiAKRQ0GIABBgAFqIQUgEUIAUg0FIAYgBigCACIEQQFqNgIAIARBf0oNBQwICyABKAIQIQoCQCAALQCQAQ0AIApFDQACQCABKQMAIhBCA4NCAFINACAQpyIGIAYoAgAiBkEBajYCACAGQX9MDQkLIABBgAFqIBAgChCFBxogAC0AfiEHC0EAIQYgAkEANgIQIAJCgICAgIABNwIIIAJBADYCPCACQQA6AEAgAkEANgJMIAIgBzoAWiACQQA2AVYgAkKAgICAwAA3AjQgAkKAgICAgAE3AkQgAiAALwF4OwFUIAIgACgCdDYCUCACQQApA6CmnAEiEDcCFCACQQApA6imnAEiETcCHCACIBA3AiQgAiARNwIsAkADQCAGQdQARg0BIAkgBmoiBSgCACEEIAUgAkEIaiAGaiIIKAIANgIAIAggBDYCACAGQQRqIQYMAAsLIAJB3ABqIAJBCGpB1AD8CgAADAYLIAYgBigCACIFQQFqNgIAIAVBf0wNBgwBCyAJIBAgCkEBEK0OIARFDQELIAkgECAKELoMAkAgAC0AkAENACAKRQ0AAkAgEUIAUg0AIBCnIgYgBigCACIGQQFqNgIAIAZBf0wNBgsgAEGAAWogECAKEIUHGgtBACEGIAJBADYBqgEgAkEANgJkIAJCgICAgIABNwJcIAJCgICAgIABNwKYASACQoCAgIDAADcCiAEgAkEANgKgASACQQA6AJQBIAJBADYCkAEgAiAALwF4OwGoASACIAAoAnQ2AqQBIAJBACkDoKacASISNwJoIAJBACkDqKacASITNwJwIAIgEjcCeCACIBM3AoABIAIgAC0AfjoArgECQANAIAZB1ABGDQEgCSAGaiIFKAIAIQQgBSACQdwAaiAGaiIIKAIANgIAIAggBDYCACAGQQRqIQYMAAsLAkAgEUIAUg0AIBCnIgYgBigCACIGQQFqNgIAIAZBf0wNBQsgCSAQIAoQugwMAwsgAC0AkAENASAKRQ0BIABBgAFqIQULIAUgECAKEIUHGgtBACEGIAJBADYBViACQQA2AhAgAkKAgICAgAE3AgggAkEANgI8IAJBADoAQCACQQA2AkwgAkKAgICAwAA3AjQgAkKAgICAgAE3AkQgAiAALwF4OwFUIAIgACgCdDYCUCACQQApA6CmnAEiEDcCFCACQQApA6imnAEi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IBVBAWohFSAeQiCIpyEaAkAgHqciG0H/AXEgHkIIiKciGEH/AXFGDQAgAiAbOgACIAIgGDoAAyACIBo2AhwgAkE9NgIYIAJBzgA2AhAgAkHOADYCCCACIAJBHGo2AhQgAiACQQNqNgIMIAIgAkECajYCBCADIARByYyAASACQQRqEMsGDQYMAQsgAiAbOgADIAIgGjYCHCACQT02AhAgAkHOADYCCCACIAJBHGo2AgwgAiACQQNqNgIEIAMgBEHMjIABIAJBBGoQywYNBQwACwsgESAGSQ0ACwsgAkHLADYCCCACIABB2AJqNgIEIAMgBEHetYEBIAJBBGoQywYNACACIAAoAigiAUEARzoAHCACQcwANgIIIAIgAkEcajYCBCADIARBtbSBASACQQRqEMsGDQAgAkE9NgIIIAIgAEE0ajYCBCADIARBq7WBASACQQRqEMsGDQAgAiAAKAIgIho2AhwgAkE9NgIIIAIgAkEcajYCBCADIARBlrWBASACQQRqEMsGDQAgAkE9NgIIIAIgAEHAAmo2AgQgAyAEQdu0gQEgAkEEahDLBg0AIAJBPTYCCCACIABBxAJqNgIEIAMgBEH5tIEBIAJBBGoQywYNACACQT02AgggAiAAQThqNgIEQQEhEyADIARBxbSBASACQQRqEMsGDQFBASETIAJBASAAKAI8dDYCHCACQdIANgIIIAIgAkEcajYCBCADIARB0bWBASACQQRqEMsGDQEgAkHNADYCCCACIABBwABqNgIEIAMgBEH9s4EBIAJBBGoQywYNASACIAAoAhRBDGwgACgCCCAaakECdGogACgCJGogACgCMEEAIAEbajYCHCACQT02AgggAiACQRxqNgIEIAMgBEG+tYEBIAJBBGoQywYNASADQfKbhQFBAiAFEQwAIRMMAQtBASETCyACQSBqJAAgEwvcDgIRfwR+IwBB0AZrIgMkACADQgA3A8AEIANCADcDsAQgA0IANwPIBCADQgA3A7gEIAMgAUEQaiIEIANBsARqIAEoAgBBAXEbIgUpAwA3A5AEIAMgBSkDCDcDmAQgAyAFKQMQNwOgBCADIAUpAxg3A6gEAkACQAJAAkAgAi8AuQJBswZxRQ0AAkAgAS0AW0EBcUUNAEGAASEFA0AgA0HAAGpCAUIAIAVB/wBxEL0WIANBkARqIAVBA3ZBEHFq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QQpGDQAgAUEIahC8CwsgASAGNgIIIAEgBykCADcCDCABIAcoAgg2AhQLIAEgASgCtAEiBjYCrAEgASABKAKwATYCqAEgBSACKQMQNwIAIAUgAigCGDYCCCAEQeoARiEEQQEhBUIAIQoMCwsgAyABKAJsIgRJDQUgASgCtAEiBiABKAJwSw0FIAEoAmAgAyAEa2ogBiADaxCGGSELIAEpAwghCiABQQo2AgggAiABKQMQNwMYIAIgCjcDEAJAAkAgCqciBEEKRg0AIARBBEYNASACQRBqELwLC0GI85oBQShBgIibARC3IQALIAIpAxghDAJAAkAgASgCiAEiBEELRw0AIAJBEGogARDGAQwBCyABQQs2AogBIAEgBDYCCCABIAEpAowBNwIMIAEgASgClAE2AhQgAiABKQKYATcDECACIAEoAqABNgIYCyABIAEoArQBIgg2AqwBIAEgASgCsAE2AqgBIAUgAikDEDcCACAFIAIoAhg2AgggC0KAgICAcIMhCiAMQiiIpyEBIAxCIIinIQQgC6chCSAMpyEGQQAhBSADIQcMCwsgAyABKAJsIgRJDQUgASgCtAEiBiABKAJwSw0FIAEoAmAgAyAEa2ogBiADaxCGGSEMIAEpAwghCiABQQo2AgggAiABKQMQNwMYIAIgCjcDECAKpyIEQQpGDQYgBEEHRw0GIAIpAxghCyACQRBqELwLAkACQCABKAKIASIEQQtHDQAgAkEQaiABEMYBDAELIAFBCzYCiAEgAiABKQKYATcDECACIAEoAqABNgIYIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahC8CwsgASAENgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEgASgCtAEiBDYCrAEgASABKAKwATYCqAEgBSACKQMQNwIAIAUgAigCGDYCCCAMQoCAgIBwgyEKIARBCHYhASALQiCIpyEIIAynIQkgC6chB0EDIQUgAyEGDAoLIAMgASgCbCIESQ0GIAEoArQBIgYgASgCcEsNBiABKAJgIAMgBGtqIAYgA2sQhhkhDCABKQMIIQogAUEKNgIIIAIgASkDEDcDGCACIAo3AxACQAJAIAqnIgRBCkYNACAEQQhGDQEgAkEQahC8CwtBiPOaAUEoQeCHmwEQtyEACyACKAIUIQkCQAJAIAEoAogBIgRBC0cNACAC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MCAAIAIpAyg3AyggACACKQMgNwMgIAAgAikDGDcDGCAAIAIpAxA3AxAgACACKQMINwMIIAAgAikDADcDACACQcAAQQgQ1BQLIANBDGohAyAEQXRqIgQNAAsLAkAgBSgCGEGAgICAeEYNACAFQSBqKAIAIgBFDQAgAEEwbCECIAVBHGooAgAhAANAIAAgARDOASAAQTBqIQAgAkFQaiICDQALCwJAIAUoAjwiAEUNACAAQQhqKAIAIgJFDQAgAkEwbCECIABBBGooAgBBJGohAANAAkAgAEF8aigCACIDRQ0AIAMgARC4AQsCQCAAKAIAIgNFDQAgAyABELgBCyAAQTBqIQAgAkFQaiICDQALCyAFKAJAIgBFDQAgACgCACABELgBCwu5DQEHfyMAQTBrIgMkACAALAAJIQQgAC0AACEFAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAALQABQQRHDQACQCAALQAFIgZBBEcNACAFQQFxDQAgBA0CQQAhBgwmCyABQejhgwFBAiACKAIMIgcRDABFDQdBASEGDCULQQEhBiABQejhgwFBAiACKAIMIgcRDAANJCAAKAABIghBCHYhCSAIQf8BcQ4EAQIDBAELIAFB6OGDAUECIAIoAgwRDAAiBg0jIARFDSMgBEEBcUUNBwwLCyABIAlB/wFxQQJ0KALYqZwBQQIgBxEMAEUNAwwiCyABIAlB/wFxQYABc0ECdCgCnKqcAUEQIAcRDABFDQIMIQsgASAJQYABc0H/AXFBAnQiBygCnLqcASAHKAKcspwBIAIoAgwiBxEMAEUNAQwgCyADIAk6AAkgAyAIQRh2OgALIAMgCEEQdjoACiADIANBCWo2AgxBASEGIAMgA0EJakEBajYCECADIANBC2o2AhQgA0HsADYCLCADQewANgIkIANB7AA2AhwgAyADQRRqNgIoIAMgA0EQajYCICADIANBDGo2AhggASACQcuAgAEgA0EYahDLBg0fCyAALQAFQQRHDQFBASEGDAULIAZBBEcNAkEAIQYMBAsgACgABSEAQQEhBiABQfDvmgFBASAHEQwADRwMAgsCQCAEQQJxRQ0AIAIoAgwhAAwHCyAEQQRxDQgCQCAEQQhx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ACgCbCIGayIFazYCXCAAIAAoAmAiAyAFajYCWCAFIAggBmsiBmshBCADIAZqIQUCQCAMRQ0AIAAgCDYCaCAAIAU2AlggACAJIAZrNgJcCyACIAhqIQYgACgCdEEIaiAFIAQQwwQhDQJAIAsNACAAKAIYIQUCQCAAKAIoIgsgCkcNACAAQSBqELIaCyAAIAtBAWo2AiggACgCJCALQQV0aiILQQE6ABwgCyAFNgIYIAtBAToAECALIAY2AgwgCyAHNgIIIAsgDTcDAAwBCwJAIAAoAjQiCyAAKAIsRw0AIABBLGoQsRoLIAAgC0EBajYCNCAAKAIwIAtBGGxqIgtBAToAECALIAY2AgwgCyAHNgIIIAsgDTcDAAsgACAAKAJcIAJrNgJcIAAgACgCWCACajYCWCAAIAAoAmggAmo2AmgLQQEhAgsgAUEgaiQAIAILrA0CDn8BfiMAQeAAayIDJABBACEEAkACQAJAIAItAIEBQSBxRQ0AIAIoAnghBQJAIAItALgBIgZBPkYNACAGQRJHDQELIAIgBUGAIHI2AnggA0EAOgAwIANBAToASCADQRBqIANBMGogA0HIAGogAhDiASADKAIUIQQgAygCECEGIAIgBTYCeCAGQQFxDQELAkACQAJAIAItALgBIgUNAAJAAkAgAigCiAEiBUELRw0AIANByABqIAIQxgEMAQsgAkELNgKIASADIAIpApgBNwNIIAMgAigCoAE2AlAgAkGMAWohBgJAIAIoAghBCkYNACACQQhqELwLCyACIAU2AgggAiAGKQIANwIMIAIgBigCCDYCFAsgAiADKAJQNgK4ASACIAIpA7ABNwOoASACIAMpA0g3ArABIAEoAgwhByACIAIoAngiBUH//99+cSIIQYCAgAFyIgk2AnggBy0AACEGAkACQCABKAIQIgotAAANACAJQf/8X3EiCEGAAnIgCCAGQQFxGyEGDAELIAhBgIOAAXIgBUH//N9+cUGAgYABciAGQQFxGyEGCyACIAY2AnggA0HIAGogAhDuASACIAU2AnggAygCTCEIIAMoAkgiC0GAgICAeEcNAiAEDQEgCCEEDAMLIAIoArQBIQYgAigCsAEhCCADQRhqIAUQxiUgA0GPAq1CIIZBn7aBAa2ENwMwIANByABqQc2VgAEgA0EwahDNCCADIAMpAhg3AlQgAyAD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BGohACAEQXxqIgQNAAsLIANB4ABqIQUgByAGQQRBBBDPEyABIAg6ACUCQCADKAIAIghBCEYNAAJAAkAgASgCBCIADQAgAkEAKQOoppwBNwMYIAJBACkDoKacATcDEAwBCyACQSRqQQhBCCAAQQFqEIsOIAIgAikCLDcCGCACIAIpAiQ3AhAgAkEQaiABEKALCyABEPEYQQAhACABQQApA6imnAE3AgggAUEAKQOgppwBNwIAIAEtACYhCSACQQA2AiwgAkKAgICAgAE3AiRBCCEHQQAhCgJAIAhBB0YNACADIAJBJGoQyAwgAigCLCEAIAIoAiQhCiACKAIoIQcLIAFBEGohBgJAAkAgASgCFCIEDQAgAkEAKQOoppwBNwMIIAJBACkDoKacATcDAAwBCyACQSRqQQhBCCAEQQFqEIsOIAIgAikCLDcCCCACIAIpAiQ3AgAgAiAGEKALCyAGIABBAWpBAXYgACABKAIcGxCIIQJAIABFDQAgAEEEdCEEIAchAANAIAYgACkDABDjBhogAEEQaiEAIARBcGoiBA0ACwsgCiAHQQhBEBDPEyABLQAlIQogAUGBAjsAJSACIAE2AiwgAiADKAIsIgA2AiQgAiAAIAMoAjBBMGxqNgIoIAJBNGogAkEkahDECCACKAI0IQsgAigCOCEHAkAgAigCPCIARQ0AIABBAnQhBCAHIQADQCAAKAIAIAEQ3QIgAEEEaiEAIARBfGoiBA0ACwsgCyAHQQRBBBDPEyABQQA6ACYgASAKOgAlAkACQAJAIAgOCAABAQEBAQECAQsgASADQQhqENMODAELIAMgARCQCwsgBhDxGCABIAk6ACYgBiACKQMINwIIIAYgAikDADcCACABEPEYIAEgAikDGDcCCCABIAIpAxA3AgALIAUoAgBBgICAgHhGDQYgAS0AJSEAIAFBAToAJSABIAUQgAggASAAOgAlDAYLIAAoAgghAAwDCwJAIAAoAgQiBEECRg0AIARBAXENACAAKAIIIgQtABkNAAJAIAQtABhBAUcNACABKAIgLQA0QQFHDQELIAEtACQhAyABQQI6ACQCQCAEKAIIIgZFDQAgBkE4bCEGIAQoAgQhBANAAkACQCAEKAIADQAgASAEQQhqENMODAELIAQgARCQCwsgBEE4aiEEIAZBSGoiBg0ACwsgASADOgAkCyAA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QAJAAkACQAJAAkACQANAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIAIgNBdGpBByADQQtLGw4lAxMTBBMTExMACBMJExMFDBMTEwETExMTExMTExMTExMTExMTAhMLIAEoAggOAwUSBgULIAEtABxBAkcNAwwRCyABKAIEIgEoAgAiA0EDRg0HIAMOAwwNCwwLIAJBKGpBBEEBQQEQgw8gAigCLCEDIAIoAigNDiACKAIwIQEgAEEENgIIIAAgATYCBCAAIAM2AgAgAUH00KWbBzYAAAwQCyABLQAcQQJGDQ4LIAJBADYCICACQoCAgIAQNwIYIAJBpNSaATYCLCACQqCAgIAGNwIwIAIgAkEYajYCKCABQQhqIAJBKGoQ4x0NByAAIAIoAiA2AgggACACKQIYNwIADA4LIAJBKGogASgCKBDlAgJAAkAgAigCKEGAgICAeEYNACACIAIoAjA2AiAgAiACKQIoNwMYDAELIAJBADYCICACQoCAgIAQNwMYCyACQeAErUIghiABQRBqrYQ3AzAgAkHlBK1CIIYgAkEYaq2ENwMoIABBuICAASACQShqEM0IIAIoAhggAigCHBCxIwwNCyACQShqIAEoAigQ5QICQAJAIAIoAihBgICAgHhGDQAgAiACKAIwNgIQIAIgAikCKDcDCAwBCyACQQA2AhAgAkKAgICAEDcDCAsgAkEoaiABKAIMEOUCAkACQCACKAIoQYCAgIB4Rg0AIAIgAigCMDYCICACIAIpAig3AxgMAQsgAkEANgIgIAJCgICAgBA3AxgLIAJB5QStQiCGIgggAkEYaq2ENwMwIAIgCCACQQhqrYQ3AyggAEG4gIABIAJBKGoQzQggAigCGCACKAIcELEjIAIoAgggAigCDBCxIwwMCwJAIAEoAggNACACQeAErUIghiABQRBqrYQ3AyggAEGcgIABIAJBKGoQzQgMDAsgAkEoaiABKAIMEOUCAkACQCACKAIoQYCAgIB4Rg0AIAIgAigCMDYCICACIAIpAig3AxgMAQsgAkEANgIgIAJCgICAgBA3AxgLIAJB5QStQiCGIAJBGGqthDcDKCAAQZyAgAEgAkEoahDNCCACKAIYIAIoAhwQsSMMCwsgAS0AGEEFRw0JCyABKAIQIQEMAAsLIAEoAggNBiACIAFBEGoQjBQgAigCACEEAkAg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NwJcIAIgCTcDUCACIAE2AlggAiACQdAAahDxGyACKAIEIQNBCBCKASIBRQ0EIAFBADYCACAAIAIpAiA3AjAgACACKQIoNwI4IAAgAikCMDcCQCABIAM2AgQgACACQbABakEo/AoAACAAIAE2AiwgACAFOgAoDAULIAJBHGpBnNKJAUHk2IkBEMYcAAsgAiACKAIoNgJYIAIgAikCIDcDUCACIAEoAgAiAykCUDcCXCACIAMoAlg2AmQgAkEhNgKwASAAQQRqIAEoAgQgASgCCCACQdAAaiACQbABahDcDiAAQYSAgIB4NgIADAMLQQRBCBCgJAALIAJBFTYCsAEgAEEEaiABKAIEIAQgAkEgaiACQbABahDcDiAAQYSAgIB4NgIADAELQQRBCBCgJAALIAJB8AFqJAALjQwBBX8jAEEgayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiA0F0akEHIANBC0sbDiYfAAECAwQFBgcICQoLDB8fDQ4PEBEfEhMUHx8VFhcYGRobHB8dHx8LIAAoAgxBBHQhAyAAKAIIIQADQCADRQ0fAkAgACgCAEECRg0AIABBDGogARCpJQsgAEEQaiEAIANBcGohAwwACwsgAEEEaiABELwHDB0LIABBIGogARDLDQwcCyAAQQRqIAEQqSUMGwsgAEEMaiABEKklDBoLIABBBGogARCpJSAAQQhqIAEQqSUMGQsgAEE4aiEEAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMODAECAwQFBgcICQoLAAELAkACQCAAKAIEDgMAAQwACyABIABBCGoQvREMCwsgASAAQQhqEK0NDAoLIAEgAEEIahD2FwwJCyAAQQhqIAEQrh8MCAsgAEEIaiABEPMgDAcLIABBBGogARCpJQwGCyAAQQRqIAEQpxwMBQsgASAAQQRqEIEPDAQLIAEgAEEEahCBDwwDCyABIABBBGoQ9x0MAgsgASAAQQRqEIMSDAELIAEgAEEEahCxGAsgBCABEKklDBgLIABBCGogARCuHwwXCyAAQQhqIAEQ8yAMFgsgAEEEaiABEKklIABBCGogARCpJSAAQQxqIAEQqSUMFQsgAEEEaiEDAkAgAC0AGEEFRw0AIABB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aCABIAEoAmQgDCABKAJsayIMazYCXCABIAEoAmAgDGo2AlgLIAJBgAFqIAEQ9gEgASACQYABahCjDyAGIAIoAogBNgIIIAYgAikCgAE3AgACQAJAAkACQAJAAkACQAJAIAEtAMgBIgxBAkYNACAMQRJGDQIgDEE8Rg0HIAxBygBGDQEgDEGjAUYNA0GI85oBQShBvISbARC3IQALIAEgASgCeCINQf//eXE2AnggASgCwAEhDiABEOURAkACQAJAAkAgAS0AyAEiDEEcRg0AIAxBA0YNASACQRBqIAEQtQogAigCFCEMIAIoAhBBAXENDSACIAw2ArwDQQEhDyACQQE2ArgDIAEtAMgBIRAgAkEDOgDLAyAQQQNGDQIgASgCxAEhAyABKALAASEGIAJBzANqIBAQ1yUgAkGPAq1CIIYgAkHLA2qthDcD2AMgAkGAAWpBzZWAASACQdgDahCFHyACIAIpAswDNwKMASACIAIoAtQDNgKUASAGIAMgAkGAAWoQwBshDAJAIAEtAMgBQaIBRw0AIAEQzxQhAyABEOURIAEgAxCGFAsgAkG4A2oQ2CEMDQsgARDlESACQQhqIAEQtQogAigCDCEPIAIoAghBAXFFDQIgDyEMDAwLQQAhDyAGKAIAIhEhDAsgARDdGyABNQK8AUIghiAOrYQhEkEBIRAMBQsgAiAPNgLYAyACQQM6AMsDIAEtAMgBIgxBA0YNAyABKALEASEDIAEoAsABIQYgAkHMA2ogDBDXJSACQY8CrUIghiACQcsDaq2ENwO4AyACQYABakHNlYABIAJBuANqEIUfIAIgAikCzAM3AowBIAIgAigC1AM2ApQBIAYgAyACQYABahDAGyEMAkAgAS0AyAFBogFHDQAgARDPFCEDIAEQ5REgASADEIYUCyACQdgDahC5IgwJCyAFKQMAIRIgBUEKNgIAIAIgBSkDCDcDiAEgAiASNwOAAQJAAkAgEqciDEEKRg0AIAxBBUYNASACQYABahCMFgtBiPOaAUEoQZCImwEQtyEACyACKQOIASESIAJBGGogASABKALAASIMIAEoAsQBIg8QzBogAigCGCACKAIcEIYZIRMgAkGAAWogARD2ASABIA82ArwBIAEgDDYCuAEgBiACKQKAATcCACAGIAIoAogBNgIIIAIgDzYCdCACIAw2AnAgAiATNwNo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AiABLQARDQIMAwsgA0EEaiAAENcJDAULIANBDGooAgAiAUUNBCABQShsIQIgA0EIaigCACEBA0AgASAAEPEGIAFBKGohASACQVhqIgINAAwFCwsgAEEDOgAkCyAALQAlIQYgACABEOUBIAEgABBVIAAgBjoAJSAAIAI6ACQgACABELkBDAILIABBAzoAJAsgAC0AJSEGIAAgARDlASABIAAQVSAAIAY6ACUgACACOgAkIAAgARC5AQsgA0EoaiIDIARHDQALCyAFLQA8IgBBBkYNASAAQQJHDQEgBUEQaiEAA0AgACgCGCIALQAsQQJGDQAMAgsLIAEoAgwiAkUNACABKAIIIgMgAkEobGohBgNAAkACQAJAAkACQAJAAkAgAygCAA4FBgABAwQGCyADKAIEQQFHDQUgAC0AJSEEIAMoAgghASAALQAkIgINBCABKAIAIgJBdGpBByACQQtLG0F7aiIFQR9LDQFBACECQQEgBXRBrqKAgHhxDQQgBQ0BIAEtABENAQwECyAALQAlIQQgAygCBCEBIAAtACQiAg0DIAEoAgAiAkF0akEHIAJBC0sbQXtqIgVBH0sNAEEAIQJBASAFdEGuooCAeHENAyAFDQAgAS0AEUUNAwsgAEEDOgAkQQAhAgwCCwJAIAMoAgQiBC0AbEECRw0AIARBwABqIQEDQCABKAIYIgEtACxBAkYNAAsLAkAgBEGEAWooAgAiAUUNACABQdgAbCECIARBgAFqKAIAIQEDQCABIAAQhwcgAUHYAGohASACQah/aiICDQALCwJAIARBmAFqKAIAIgFFDQAgAUEobCECIARBlAFqKAIAIQEDQCAAIAEQ8gIgAUEoaiEBIAJBWGoiAg0ACwsgBC0APCIBQQZGDQIgAUECRw0CIARBEGohAQNAIAEoAhgiAS0ALEECRg0ADAMLCyADQQxqKAIAIgFFDQEgAUEobCECIANBCGooAgAhAQNAIAEgABCtAiABQShqIQEgAkFYaiICDQAMAgsLIAAgARDlASABIAAQVSAAIAQ6ACUgACACOgAkIAAgARC5AQsgA0EoaiIDIAZHDQALCw8LIABBAzoAJAsgACABEOUBIAEgABBVIAAgAjoAJSAAIAM6ACQgACABELkBDwsgAEEDOgAkCyAAIAEQ5QEgASAAEFUgACACOgAlIAAgAzoAJCAAIAEQ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QQEhCwwIC0EMIQpBASELDAcLIAEgBEECajYCaCABIAZBfmoiCjYCXCABIAhBAmoiCzYCWAJAIApFDQAgCy0AAEEKRw0AIAEgBEEDajYCaCABIAZBfWo2AlwgASAIQQNqNgJYCyAAQQA2AgAMCgsgCkHYv39qQQJPDQELIABBADYCACABQQFBAkEDIApBgBBJGyAKQYABSRsiCiAFajYCaCABIAcgCms2AlwgASAJIApqNgJYDAgLIApB+P//AHFBMEYNBCAKQYABTw0CQQEhCwwDCyABIARBAmo2AmggASAGQX5qNgJcIAEgCEECajYCWCADQQhqIAFBAhCEBSADKAIIIgpBAkYNBQJAIApBAUcNACAAIAMoAgwiATYCBCAAIAFBgIDEAEk2AgAMBwsgA0EQNgIQIANB/JqZATYCDCADQaSAgIB4NgIIIAEoAmggBCADQQhqEPEkIQEgAEECNgIAIAAgATYCBAwGCyADIAEQjgQgAygCAEEDRg0DIAAgAygCBDYCBCAAQQE2AgAMBQtBAiELIApBgBBJDQBBA0EEIApBgIAESRshCwsgACAKNgIEIABBATYCACABIAsgBWo2AmggASAHIAtrNgJcIAEgCSALajYCWAwDCyABIARBAmoiBTYCaCABIAZBfmoiCzYCXCABIAhBAmoiCTYCWAJAIApBMEcNAAJAIAtFDQAgCS0AAEH4AXFBMEYNAQsgAEIBNwIADAMLAkACQCACDQAgA0GVgICAeDYCCCABIAQgA0EIahD2DiAKQThPDQEgCkFQaiEKAkACQCABKAJcIgtFDQAgASgCWCIJLQAAQVBqIgZBCEkNAQsgACAKNgIEIABBATYCAAwFCyABIAtBf2oiCDYCXCABIAlBAWoiBTYCWCABIAEoAmgiB0EBajYCaCAKQQN0IAZyIQoCQAJAIAhFDQAgBS0AAEFQaiIGQQhJDQELIABBATYCACAAIApB/wFxNgIEDAULAkAgCkH/AXEiCEEfSw0AIABBATYCACABIAdBAmo2AmggASALQX5qNgJcIAEgCUECajYCWCAAIApBA3QgBnJB/wFxNgIEDAULIABBATYCACAAIAg2AgQMBAsgA0GVgICAeDYCCCAFIAQgA0EIahDaJCEBIABBAjYCACAAIAE2AgQMAwtBjJuZARDDIwALIAMgAygCBCIKKQMYNwMY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IAEtALgBQRRHDQACQAJAQQQQigEiB0UNACAHIAM2AgAgAkEBNgL8ASACIAc2AvgBIAJBATYC9AECQCABLQC4AUEURw0AIAFBDGohCCABQQhqIQkgAUGYAWohCiABQYwBaiELQQQhDEEBIQ0DQAJAAkAgASgCiAEiA0ELRw0AIAJB0AFqIAEQxgEMAQsgAUELNgKIASACIAopAgA3A9ABIAIgCigCCDYC2AECQCABKAIIQQpGDQAgCRC8CwsgCSADNgIAIAggCykCADcCACAIIAsoAgg2AggLIAEpA7ABIQ4gBSACKQPQATcCACAFIAIoAtgBNgIIIAEgDjcDqAEgAiABEO8FIAIoAgQhAwJAIAIoAgBBAXFFDQAgAkH0AWoQ9xsgAigC9AEgAigC+AEQ8SNBASEEDAULAkAgDSACKAL0AUcNACACQfQBahCzGiACKAL4ASEHCyAHIAxqIAM2AgAgAiANQQFqIg02AvwBIAxBBGohDCABLQC4AUEURg0ACwsgASgCrAEhAUHgABCKASIDDQFBCEHgABCgJAALQQRBBBCgJAALIANCCjcDACADIAIpAvQBNwIIIAMgAigC/AE2AhAgAyABNgIYIAMgBjYCFAsgACADNgIEIAAgBDYCACACQYACaiQAC5kLAgZ/AX4jAEHgAGsiByQAIAEoArABIQggAUGwAWohCQJAAkAgASgCiAEiCkELRw0AIAdByABqIAEQxgEMAQsgAUELNgKIASAHIAEpApgBNwNIIAcgASgCoAE2AlAgAUGMAWohCwJAIAEoAghBCkYNACABQQhqELwLCyABIAo2AgggASALKQIANwIMIAEgCygCCDYCFAsgASkDsAEhDSAJIAcpA0g3AgAgCSAHKAJQNgIIIAEgDTcDqAECQCABLQC4ASIKQQ9HDQACQAJAIAEoAogBIgtBC0cNACAHQcgAaiABEMYBDAELIAFBCzYCiAEgByABKQKYATcDSCAHIAEoAqABNgJQIAFBjAFqIQwCQCABKAIIQQpGDQAgAUEIahC8CwsgASALNgIIIAEgDCkCADcCDCABIAwoAgg2AhQLIAEpA7ABIQ0gCSAHKQNINwIAIAkgBygCUDYCCCABIA03A6gBCwJAAkACQAJAIAUNACABIAEoAngiCUH//+9vcTYCeCAHQcgAaiABIAZBABCiByABIAk2Angg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AWokAA8LAAtBBEEMEKAkAAtBCEHgABCgJAALIBQgAygCEBD8IAALQQhBKBCgJAALQQRBDBCgJAALQQhB4AAQoCQAC0EEQQwQoCQAC0EIQeAAEKAkAAtBBEEMEKAkAAtBCEHgABCgJAALIAQgAygCEBD8IAAL5goCCn8BfiMAQeAAayIEJABBACEFIAEoArABIQYgBEE4aiABIANB/wFxQQBHEHMgBCgCPCEHAkACQCAEKAI4IghBB0cNACAAQQc2AgAgACAHNgIEDAELIAFBsAFqIQkgBCAEKQNYNwMwIAQgBCkDUDcDKCAEIAQpA0g3AyAgBCAEKQNANwMYIAQgBzYCFCAEIAg2AhACQAJAAkAgAS0AuAEiB0F3ag4DAAEAAQsgASgCgAFBgMAAcSEKAkACQAJAIAgNACAKDQELQQAhBSAKDQEMAgtBACEFIAdBC0cNAAJAAkAgASgCiAEiB0ELRw0AIARBOGogARDGAQwBCyABQQs2AogBIAQgASkCmAE3AzggBCABKAKgATYCQCABQYwBaiEFAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBzYCCCABIAUpAgA3AgwgASAFKAIINgIUCyABKQOwASEOIAkgBCkDODcCACAJIAQoAkA2AgggASAONwOoASABLQC4ASEHQQEhBQsgB0H/AXFBCUcNACABIAEoAngiC0GAIHI2AnggASgCsAEhDAJAAkAgASgCiAEiB0ELRw0AIARBOGogARDGAQwBCyABQQs2AogBIAQgASkCmAE3AzggBCABKAKgATYCQCABQYwBaiEKAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBzYCCCABIAopAgA3AgwgASAKKAIINgIUCyABKQOwASEOIAkgBCkDODcCACAJIAQoAkA2AgggASAONwOoASABIAEoAngiB0H///+/f3E2AnggBEEIaiABKAKwASABEOwDIAQoAgghCiABIAc2AnggBCgCDCEHAkACQCAKQQFxDQAgASgCrAEhDUEMEIoBIgpFDQEgCiANNgIIIAogDDYCBCAKIAc2AgAgASALNgJ4AkACQCAIQX9qQQNJDQACQCAIDQAgBEEwaiEHDAILIARBnwStQiCGIARBEGqthDcDOEGUkYABIARBOGpBzIabARDkGwALIARBKGohBwsCQCAHKAIAIgtFDQAgCygC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NgIYIAAgASkCEDcCECAAIAEpAgg3AgggACABKQIANwIADAELIAAgAkEIahD1CDYCGCAAQQQ2AgAgACACKAIYNgIUIAAgAikCEDcCDCAAIAIpAgg3AgQMAQsgAUEcQQQQ1BQLIAJB0ABqJAALpQoCEH8CfiMAQTBrIgMkACABLQC4ASEEIAEoArABIQUgA0EYaiABELYIIAMoAiAhBgJAAkAgAykDGCITQgBSDQAgAEEDOgAUIAAgBjYCAAwBCyATQiCIIRQgAygCJCEHIBOnIQgCQCAEQf8BcUHuAEcNACABKAKsASEEIAEoArABIQkgA0H2gICAeDYCGCABIAkgBCADQRhqEOodCyAUpyEJQQAhBAJAAkACQCABLQC4AUEIRw0AIAFBsAFqIQQgAUEMaiEKIAFBCGohCyABQZgBaiEMIAFBjAFqIQ0CQAJAIAEoAogBIg5BC0YNACABQQs2AogBIAMgDCkCADcDGCADIAwoAgg2AiACQCABKAIIQQpGDQAgCxC8CwsgCyAONgIAIAogDSkCADcCACAKIA0oAgg2AggMAQsgA0EYaiABEMYBCyABKQOwASETIAQgAykDGDcCACAEIAMoAiA2AgggASATNwOoAQJAAkAgAS0AuAEiD0G1f2oiDkEfSw0AQQEgDnRBgYCCkHhxDQELIA9BGUYNACAPQbR/akH/AXFB1ABNDQBBACEODAILIANBADoAFCADQQA2AhAgAyAHNgIMIAMgBjYCCCADIAk2AgQgAyAINgIAAkACQAJAAkACQAJAIAINACADQRhqIAFBAEEAELYDIAMtACxBAkYNAyADKAIkIQ4gAygCICEPIAMoAhwhECADKAIYIREMAQsgA0EYaiABELYIIAMpAxgiE1ANASATQiCIpyEQIAMoAiQhDiADKAIgIQ8gE6chEQsgASgCrAEhEgJAQTAQigEiCEUNACAIIBI2AhQgCCAFNgIQIAggDjYCDCAIIA82AgggCCADKQMANwMYIAggAykDCDcDICAIIAMpAxA3AyggCCAQrUIghiARrYQ3AwAgAS0AuAFBCEcNBANAAkACQCABKAKIASIOQQtHDQAgA0EYaiABEMYBDAELIAFBCzYCiAEgAyAMKQIANwMYIAMgDCgCCDYCIAJAIAEoAghBCkYNACALELwLCyALIA42AgAgCiANKQIANwIAIAog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DAkLIAEtAAANCyAAKAIEIAEQmAEgAS0AAA0LIAAoAgggARCsAyAAKAIUIgBFDQsgAS0AAEEBcUUNCAwLCwJAIAEtAAANACAAKAIQIAEQmAELIAAoAgwiAkUNCiAAKAIIIgMgAkEYbGohBANAIAEtAAAhAAJAIAMoAhQiAkUNACAAQQFxDQAgAiABEJgBIAEtAAAhAAsCQCADQQhqKAIAIgJFDQAgAEEBcQ0AIAJBMGwhAiADQQRqKAIAIQADQAJAIAEtAAANACAAIAEQrAMLIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0LDAALCyABLQAADQkgACgCBCABEJgBDAkLIABBCGogARDyAw8LAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCABEMgIDAILIAAoAgggARDJCAwBCyAAKAIIIAEQsQoLIAEtAAANByAAKAIMIAEQmAEgAS0AAA0HIAAoAhAhAAwECwJAAkACQAJAIAAoAgQOAwABAgALIAAoAgggARDICAwCCyAAKAIIIAEQyQgMAQsgACgCCCABELEKCyABLQAADQYgACgCDCABEJgBIAEtAAANBiAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNAAJAIAJBAUcNACABLQAADQEgACgCCCABEJgBDAELIAAoAggiAkEIaigCACIDRQ0AIAJBBGooAgAiAiADQThsaiEEA0AgAiABEOgJAkAgAkEwaigCACIDRQ0AIAEtAABBAXENACADIAEQmAELIAJBOGoiAiAERw0ACwsgAS0AACECAkAgACgCGCIDRQ0AIAJBAXENACADIAEQmAEgAS0AACECCwJAAkAgACgCHCIDRQ0AIAJBAXENACADIAEQmAEgAS0AAEUNAQwHCyACQQFxDQYLIAAoAgwhAAwCCyABLQAADQQgACgCBCABEJgBIAEtAAANBCAAKAIIIQAMAQsgAS0AAA0DIAAoAgQgARCYASABLQAADQMgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAEUNACABLQAAQQFxDQAgAEEwbCECIANBzABqKAIAIQADQAJAIAEtAAANACAAIAEQrAMLIABBMGohACACQVBqIgINAAsLAkACQAJAIAMoAgBBeWoOAgECAAsgAyABEOgJCyADQTBqKAIAIgBFDQAgAS0AAEEBcQ0AIABBMGwh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IQkgASgCwAEhCiADQdQBaiAGENclIANBjwKtQiCGQZLwmgGthDcD+AEgA0HgAWpBzZWAASADQfgBahCFHyADIAMpAtQBNwLsASADIAMoAtwBNgL0ASAKIAkgA0HgAWoQwBshBgJAIAEtAMgBQaIBRw0AIAEgARCfIxCGFAsgA0EBOgAcIAMgBjYCIAwCCyABEOURIANBgAI7ARwgASADQeAAahC2FCADQZGBgIB4NgJgIAEgCCAIIANB4ABqEPEdIAEoArwBIQYgA0IANwJsIANCgICAgIABNwJgIANCADcBckEAIQEgA0EANgJoQQRBHBDoICILIAc6ABkgC0EAOgAYIAtBADYCFCALIAY2AhAgCyAENgIMIAtBADYCCCALQoCAgICAATcCACADQeAAahCrISADQRxqENMhDAQLIANBADsBHAsgASADQeAAahC2FAsgA0EcahDTIQtBCCEJIANB4ABqQQRBCEE4EIMPIAMoAmQhCgJAIAMoAmBFDQAgCiADKAJoEPwgAAtBACEGIANBADYCLCADIAMoAmgiDDYCKCADIAo2AiQgA0HgAGpBCGohDQJAAkADQCABLQDIAUEGRg0BAkACQCAFRQ0AIANB4ABqIAEgAiAHEJ4GDAELIAEgASgCeCIKQcAAcjYCeCADQeAAaiABIAIgBxCeBiABIAo2AngLIAMoAmQhCwJAIAMoAmAiDkEHRw0AIANBJGoQqyFBASEBDAQLIANBMGogDUEw/AoAAAJAIAYgAygCJEcNACADQSRqELgaIAMoAighDAsgDCAJaiIKQXxqIAs2AgAgCkF4aiAONgIAIAogA0EwakEw/AoAACADIAZBAWoiBjYCLCABLQDIAUEHRw0CIAEQ5REgCUE4aiEJDAALCyABKAK4ASEGIAEoArwBIQkgA0H3gICAeDYCYCABIAkgBiAJIAhGGyAGIAYgBEYbIAkgA0HgAGoQ8R0LAkAgAg0AIAEQpRwNACABKALEASEGIAEoAsABIQkgA0H2gICAeDYCYCABIAkgBiADQeAAahDxHSADQQhqIAEQtQogAyADKAIMNgJkIAMgAygCCCIGNgJgIANB5ABqIQkCQAJAIAYNACAJELkiDAELIAkQmyELA0AgARClHA0BIAEQ5REgAS0AyAFBogFHDQALCyABKAK8ASEGIANCADcCbCADQoCAgICA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ASAHNgIgIAFBADoAHCABQQA2AhggASAGNgIUIAEgBDYCECABIBA3AwggASAPNgIEIAEgAjYCACABIQQMAgsgEKciASABKAIAIgRBf2o2AgBBASEFAkAgBEEBRg0AIAkhBAwCCyABIAEoAhAQ7B4gCSEEDAELQQhByAAQoCQACyAAIAQ2AgQgACAFNgIAIANBwABqJAALoAoCB38DfiMAQSBrIgMkACABQbABaiEEAkAgAS0AuAEiBUEDRw0AIANBCGogASABKAKwAUEAELMFIAQgAygCEDYCCCAEIAMpAgg3AgAgAS0AuAEhBQsgASgCtAEhBiABKAKwASEHAkACQAJAAkACQAJAAkACQAJAAkACQCAFQf8BcSIIQbl/ag4CAQIACyAIQaIBRg0CIANBCGpBBHIgBRDGJSADQQM2AhwgA0G0hZsBNgIYIANBsICAgHg2AgggASgCsAEgASgCtAEgA0EIahDAGyEHAkAgAS0AuAFBogFHDQAgARDEFCEEIAEQshAgASAEEJMJCyAAQQI6ABggACAHNgIADAkLIAcgASgCbCIISQ0EIAZBfmoiBSABKAJwSw0EIAEoAmAgByAIa2ogBSAHaxCGGSEKIAEpAwghCyABQQo2AgggAyABKQMQNwMQIAMgCzcDCAJAAkAgC6ciCEEKRg0AIAhBAkkNASADQQhqELwLC0GI85oBQShBoIibARC3IQALIAMpAxAhCyADKAIMIQYCQAJAIAEoAogBIglBC0cNACADQQhqIAEQxgEMAQsgAUELNgKIASABIAk2AgggASABKQKMATcCDCABIAEoApQBNgIUIAMgASkCmAE3AwggAyABKAKgATYCEAsgASkDsAEhDCAEIAMpAwg3AgAgBCADKAIQNgIIIAEgDDcDqAFBACEBIAhBAXFFDQcgAkUNAkEAIQEMBgsgByABKAJsIghJDQQgBkF/aiIFIAEoAnBLDQQgASgCYCAHIAhraiAFIAdrEIYZIQogASkDCCELIAFBCjYCCCADIAEpAxA3AxAgAyALNwMIAkACQCALpyIIQQpGDQAgCEECSQ0BIANBCGoQvAsLQYjzmgFBKEGgiJsBELchAAsgAykDECELIAMoAgwhBgJAAkAgASgCiAEiCUELRw0AIANBCGogARDGAQwBCyABQQs2AogBIAEgCTYCCCABIAEpAowBNwIM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gJQBOwEAIAJBMGokAAuzCgIJfwF+IwBB0ABrIgMkACABQbABaiEEIAEoArABIQVBACEGQQAhBwJAAkACQAJAAkACQAJAAkACQCACDQAgAS0AuAEiCCEHAkAgCEHzAEcNAAJAAkAgASgCiAEiB0ELRw0AIANBKGogARDGAQwBCyABQQs2AogBIAMgASkCmAE3AyggAyABKAKgATYCMCABQYwBaiEJAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBzYCCCABIAkpAgA3AgwgASAJKAIINgIUCyABKQOwASEMIAQgAykDKDcCACAEIAMoAjA2AgggASAMNwOoASABLQC4ASEHCyAHQf8BcUHjAEcNASAIQfMARiEHAkACQCABKAKIASIIQQtHDQAgA0EoaiABEMYBDAELIAFBCzYCiAEgAyABKQKYATcDKCADIAEoAqABNgIwIAFBjAFqIQkCQCABKAIIQQpGDQAgAUEIahC8CwsgASAINgIIIAEgCSkCADcCDCABIAkoAgg2AhQLIAEpA7ABIQwgBCADKQMoNwIAIAQgAygCMDYCCCABIAw3A6gBCwJAIAEtALgBIghBEkcNACABIAEoAngiBkGAIHI2AnggA0EAOgBAIANBAToAKCADQQhqIANBwABqIANBKGogARDiASADKAIIIQggASAGNgJ4IAMoAgwhBiAIQQFxDQIgAS0AuAEhCAsgCEH/AXENBCABKAKIASIIQQtHDQIgA0EoaiABEMYBDAMLIAEoArQBIQYgASgCsAEhBCADQRBqIAcQxiUgA0GPAq1CIIZB1IGbAa2ENwNAIANBKGpBzZWAASADQcAAahDNCCADIAMpAhA3AjQgAyADKAIYNgI8IAQgBiADQShqEMAbIQYCQCABLQC4AUGiAUcNACABIAEQhQ4QkwkLIABBgYCAgHg2AgAgACAGNgIEDAYLIABBgYCAgHg2AgAgACAGNgIEDAULIAFBCzYCiAEgAyABKQKYATcDKCADIAEoAqABNgIwIAFBjAFqIQkCQCABKAIIQQpGDQAgAUEIahC8CwsgASAINgIIIAEgCSkCADcCDCABIAkoAgg2AhQLIAEpA7ABIQwgBCADKQMoNwIAIAQgAygCMDYCCCABIAw3A6gBIANBKGogARD8AiADKAIsIQQgAygCKCIIQYCAgIB4Rw0BIABBgYCAgHg2AgAgACAENgIEDAILIAEoArQBIQQgASgCsAEhAiADQRxqIAgQxiUgA0GPAq1CIIZBn7aBAa2ENwNAIANBKGpBzZWAASADQcAAahDNCCADIAMpAhw3AjQgAyADKAIkNgI8IAIgBCADQShqEMAbIQQCQCABLQC4AUGiAUcNACABIAEQhQ4QkwkLIABBgYCAgHg2AgAgACAENgIEDAELIAMgAygCMCIKNgJIIAMgBDYCRCADIAg2AkAgASABKAJ4IglBgCByNgJ4IANBGzoAKCADIANBKGogARCFAiADKAIAIQsgASAJNgJ4IAMoAgQhCQJAIAtBAUcNACAAQYGAgIB4NgIAIAAgCTYCBCADQcAAahCMCiAIIAQQ8iMMAQsgASgCrAEhAQJAAkAgAg0AIAMpAkQhDCAFIQQgASEFIAYhAQwBC0GAgICAeCEIIAMpA0AhDCAJIQQgBiEHIAohCQsgACAHNgIcIAAgATYCGCAAIAU2AhQgACAENgIQIAAgCTYCDCAAIAw3AgQgACAINgIADAELIAZFDQAgBhCtDyAGKAIAIAZBBGooAgAQ9CMgBkEUQQQQ1BQLIANB0ABqJAAL6QkBCH8jAEEwayICJAACQCAALQAsIgNBAksNACAAQRhqIQQCQCADQQJHDQAgBCABEN0eCyABIAQQqAkgAC0ALCEDCwJAIANB/wFxQQNHDQAgAiABIAAQog0gAi0ALEEGRg0AIAAQlBMgACACKQMoNwMoIAAgAikDIDcDICAAIAIpAxg3AxggACACKQMQNwMQIAAgAikDCDcDCCAAIAIpAwA3AwALAkAgACgCRCIDRQ0AIAAoAkAiBSADQdgAbGohBgNAAkACQAJAIAUoAgAiA0F8ag4CAgABCyAFKAIEIgMgARBcIAMoAgBBGkcNASABIANBCGoQkgsiBEUNASADEIcCIAMgBCkDODcDOCADIAQpAzA3AzAgAyAEKQMoNwMoIAMgBCkDIDcDICADIAQpAxg3AxggAyAEKQMQNwMQIAMgBCkDCDcDCCADIAQpAwA3AwAgBEHAAEEIENQUDAELAkACQAJAIAMOBAMAAQIDCyAFKAIEQQFHDQIgBSgCCCIDIAEQXCADKAIAQRpHDQIgASADQQhqEJILIgRFDQIgAxCHAiADIAQpAzg3AzggAyAEKQMwNwMwIAMgBCkDKDcDKCADIAQpAyA3AyAgAyAEKQMYNwMYIAMgBCkDEDcDECADIAQpAwg3AwggAyAEKQMANwMAIARBwABBCBDUFAwCCyAFKAIEIgdBwABqIAEQvgMCQCAHQZgBaigCACIDRQ0AIAdBlAFqKAIAIgggA0EobGohCQNAAkACQAJAAkACQCAIKAIADgUEAAECAwQLIAgoAgRBAUcNAyAIKAIIIgMgARBcIAMoAgBBGkcNAyABIANBCGoQkgsiBEUNAyADEIcCIAMgBCkDODcDOCADIAQpAzA3AzAgAyAEKQMoNwMoIAMgBCkDIDcDICADIAQpAxg3AxggAyAEKQMQNwMQIAMgBCkDCDcDCCADIAQpAwA3AwAgBEHAAEEIENQUDAMLIAgoAgQiAyABEFwgAygCAEEaRw0CIAEgA0EIahCSCyIERQ0CIAMQhwIgAyAEKQM4NwM4IAMgBCkDMDcDMCADIAQpAyg3AyggAyAEKQMgNwMgIAMgBCkDGDcDGCADIAQpAxA3AxAgAyAEKQMINwMIIAMgBCkDADcDACAEQcAAQQgQ1BQMAgsgCEEEaiABEL4GDAELIAhBDGooAgAiA0UNACADQShsIQQgCEEIaigCACEDA0AgAyABENwGIANBKGohAyAEQVhqIgQNAAsLIAhBKGoiCCAJRw0ACwsgBy0APCIDQQZGDQECQCADQQJLDQAgB0EoaiEEAkAgA0ECRw0AIAQgARDdHgsgASAEEKgJIActADwhAwsgA0H/AXFBA0cNASACIAEgB0EQaiIDEKINIAItACxBBkYNASADEJQTIAMgAikDKDcDKCADIAIpAyA3AyAgAyACKQMYNwMYIAMgAikDEDcDECADIAIpAwg3AwggAyACKQMANwMADAELIAUoAgwiA0UNACADQShsIQQgBSgCCCEDA0AgAyABEKMCIANBKGohAyAEQVhqIgQNAAsLIAVB2ABqIgUgBkcNAAsLAkAgACgCOCIDRQ0AIANBCGooAgAiBEUNACAEQQJ0IQQgA0EEaigCACEDA0AgAygCACABELgBIANBBGohAyAEQXxqIgQNAAsLIAJBMGokAAvLCQILfwF+IwBBgAFrIgMkAAJAAkACQCABKAIAIgQoAkANACAEQQA2AkwgBEF/NgJAIAMgBCkCUDcDACADIAQoAlg2AgggA0HMAGogARCPDiADIAMoAmA2AhggAyADKQJYNwMQIARB0ABqIQUgBEHEAGohBgNAIAEQ+B5FDQIgARCbCkH9AEYNAgJAIAEQmwoiB0FQakEKSQ0AIAdBv39qQQZJDQAgB0Gff2pBBkkNACADQTBqIAEQjw4gA0EJNgJMIAAgASgCBCABKAIIIANBMGogA0HMAGoQ3A4MBAsCQAJAIAEQmwoiB0GAAUkiCEUNAEEBIQkMAQsCQCAHQYAQTw0AQQIhCQwBC0EDQQQgB0GAgARJGyEJCyAEKAJMIgohCwJAIAkgBigCACAKa00NACAGIAogCUEBQQEQ7RogBCgCTCELCyAEKAJIIAtqIQsCQAJAIAgNACAHQT9xQYB/ciEIIAdBBnYhDAJAIAdBgBBPDQAgCyAIOgABIAsgDEHAAXI6AAAMAgsgB0EMdiENIAxBP3FBgH9yIQwCQCAHQf//A0sNACALIAg6AAIgCyAMOgABIAsgDUHgAXI6AAAMAgsgCyAIOgADIAsgDDoAAiALIA1BP3FBgH9yOgABIAsgB0ESdkFwcjoAAAwBCyALIAc6AAALIAQgCSAKajYCTAwACwtB9NqJARCBHgALAkACQAJAAkACQAJAAkAgBSgCACIHIAEoAggiCEYNACADIAUoAgg2AiggAyAFKQIANwMgIAQoAkghCiAEKAJMIQkgAyABEJsKIgc2AiwgB0H9AEcNASABEPgeGiAJDgIFAgMLIAMgAykDADcDMCADIAMoAgg2AjggAyAFKAIINgJEIAMgBSkCADcCPCADQQo2AkwgACABKAIEIAcgA0EwaiADQcwAahDcDgwGCyADQSxqQYTbiQFBiNuJARDGHAALIAotAAAiB0FVag4DAwEDAQsgCi0AACEHCyAKIAdB/wFxQStGIgtqIQcCQAJAAkAgCSALayIKQQlJDQBBACELA0AgCkUNAiALQf////8ASw0FIActAAAiCUG/f2pBX3FBCmogCUFQaiAJQTlLGyIJQQ9LDQUgB0EBaiEHIApBf2ohCiAJIAtBBHRqIgsgCU8NAAwFCwtBACELIApFDQEDQCAHLQAAIglBv39qQV9xQQpqIAlBUGogCUE5SxsiCUEPSw0EIAdBAWohByAJIAtBBHRyIQsgCkF/aiIKDQALCyALQYCwA3NBgIC8f2pBgJC8f0kNAgsgACALNgIEIAAgAykDECIONwIIIAAgAjoAISAAQQU6ACAgAyADKAIYNgJwIAMgBSkCADcCdCAAIAMpA3A3AhAgAyAFKAIINgJ8IAAgAykDeDcCGCADIA43A2ggAEEiNgIADAILIAMgAykDADcDMCADIAMoAgg2AjggAyAFKAIINgJEIAMgBSkCADcCPCADQQc2AkwgACABKAIEIAggA0EwaiADQcwAahDcDgwBCyADIAMoAhg2AjggAyADKQMQNwMwIAMgAykDIDcCPCADIAMoAig2AkQgA0EINgJMIAAgASgCBCAIIANBMGogA0HMAGoQ3A4LIAQgBCgCQEEBajYCQCADQYABaiQAC9UJAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4TABERAQIDBAUGBxIQDg0MCwoJCAALIAAoAgwiAkUNECACQTBsIQIgACgCCCEAA0AgACABEMADIABBMGohACACQVBqIgINAAwRCwsgACgCBCABEKYBIAAoAgghAAwNCyAAKAIMIgBFDQ4gACABEKYBDwsgAEEANgIgIAAoAighAAwLCyAALQAkQQJGDQwgAEEANgIgDwsgAC0AJEECRg0LIABBADYCIA8LIAAoAgQgARCmASAAKAIIIAEQwAMgACgCFCIADQgMCgsgACgCECABEKYBIAAoAgwiAkUNCSAAKAIIIgMgAkEYbGohBANAAkAgAygCFCIARQ0AIAAgARCmAQsCQCADQQhqKAIAIgBFDQAgAEEwbCECIANBBGooAgAhAANAIAAgARDAAyAAQTBqIQAgAkFQaiICDQALCyADQRhqIgMgBEYNCgwACwsgACgCBCABEKYBDAgLIABBCGogARCUBA8LAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCICKAIIIgNFDQIgAigCBCICIANBOGxqIQQDQCACIAEQqAoCQCACQTBqKAIAIgNFDQAgAyABEKYBCyACQThqIgIgBEcNAAwDCwsgACgCCCICKAIIIgNFDQEgAigCBCICIANBOGxqIQQDQCACIAEQqAoCQCACQTBqKAIAIgNFDQAgAyABEKYBCyACQThqIgIgBEcNAAwCCwsgACgCCCABENsLCyAAKAIMIAEQpgEgACgCECEADAQLAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCICKAIIIgNFDQIgAigCBCICIANBOGxqIQQDQCACIAEQqAoCQCACQTBqKAIAIgNFDQAgAyABEKYBCyACQThqIgIgBEcNAAwDCwsgACgCCCICKAIIIgNFDQEgAigCBCICIANBOGxqIQQDQCACIAEQqAoCQCACQTBqKAIAIgNFDQAgAyABEKYBCyACQThqIgIgBEcNAAwCCwsgACgCCCABENsLCyAAKAIMIAEQpgEgACgCECEADAMLAkAgACgCBCICQQJGDQACQCACQQFHDQAgACgCCCABEKYBDAELIAAoAggiAigCCCIDRQ0AIAIoAgQiAiADQThsaiEEA0AgAiABEKgKAkAgAkEwaigCACIDRQ0AIAMgARCmAQsgAkE4aiICIARHDQALCwJAIAAoAhgiAkUNACACIAEQpgELAkAgACgCHCICRQ0AIAIgARCmAQsgACgCDCEADAILIAAoAgQgARCmASAAKAIIIQAMAQsgACgCBCABEKYBIAAoAgghAAwACwsCQCAAKAIEIgMoAlAiAEUNACAAQTBsIQIgAygCTCEAA0AgACABEMADIABBMGohACACQVBqIgINAAsLAkACQAJAIAMoAgBBeWoOAgECAAsgAyABEKgKCyADKAIwIgBFDQAgAEEwbCECIAMoAiwhAANAIAAgARDAAyAAQTBqIQAgAkFQaiICDQALCyADKAJgQYCAgIB4Rg0AIAMoAmgiAEUNACAAQTBsIQIgAygCZCEAA0AgACABEMADIABBMGohACACQVBqIgINAAsLDwsgACgCBCABEKYBC90JAQJ/AkACQEEAKAL0lZ0BIgBFDQAgACgCBEH/////B08NAUEBIQECQCAALQAIDQBBASEBIAAtAAkNAEEBIQEgAC0ACg0AQQEhASAALQALDQBBASEBIAAtAAwNAEEBIQEgAC0ADQ0AQQEhASAALQAODQBBASEBIAAtAA8NAEEBIQEgAC0AEA0AQQEhASAALQARDQBBASEBIAAtABINAEEBIQEgAC0AEw0AQQEhASAALQAUDQBBASEBIAAtABUNAEEBIQEgAC0AFg0AQQEhASAALQAXDQBBASEBIAAtABgNAEEBIQEgAC0AGQ0AQQEhASAALQAaDQBBASEBIAAtABsNAEEBIQEgAC0AHA0AQQEhASAALQAdDQBBASEBIAAtAB4NAEEBIQEgAC0AHw0AQQEhASAALQAgDQBBASEBIAAtACENAEEBIQEgAC0AIg0AQQEhASAALQAjDQBBASEBIAAtACQNAEEBIQEgAC0AJQ0AQQEhASAALQAmDQBBASEBIAAtACcNAEEBIQEgAC0AKA0AQQEhASAALQApDQBBASEBIAAtACoNAEEBIQEgAC0AKw0AQQEhASAALQAsDQBBASEBIAAtAC0NAEEBIQEgAC0ALg0AQQEhASAALQAvDQBBASEBIAAtADANAEEBIQEgAC0AMQ0AQQEhASAALQAyDQBBASEBIAAtADMNAEEBIQEgAC0ANA0AQQEhASAALQA1DQBBASEBIAAtADYNAEEBIQEgAC0ANw0AQQEhASAALQA4DQBBASEBIAAtADkNAEEBIQEgAC0AOg0AQQEhASAALQA7DQBBASEBIAAtADwNAEEBIQEgAC0APQ0AQQEhASAALQA+DQBBASEBIAAtAD8NAEEBIQEgAC0AQA0AQQEhASAALQBBDQBBASEBIAAtAEINAEEBIQEgAC0AQw0AQQEhASAALQBEDQBBASEBIAAtAEUNAEEBIQEgAC0ARg0AQQEhASAALQBHDQBBASEBIAAtAEgNAEEBIQEgAC0ASQ0AQQEhASAALQBKDQBBASEBIAAtAEsNAEEBIQEgAC0ATA0AQQEhASAALQBNDQBBASEBIAAtAE4NAEEBIQEgAC0ATw0AQQEhASAALQBQDQBBASEBIAAtAFENAEEBIQEgAC0AUg0AQQEhASAALQBTDQBBASEBIAAtAFQNAEEBIQEgAC0AVQ0AQQEhASAALQBWDQBBASEBIAAtAFcNAEEBIQEgAC0AWA0AQQEhASAALQBZDQBBASEBIAAtAFoNAEEBIQEgAC0AWw0AQQEhASAALQBcDQBBASEBIAAtAF0NAEEBIQEgAC0AXg0AQQEhASAALQBfDQBBASEBIAAtAGANAEEBIQEgAC0AYQ0AQQEhASAALQBiDQBBASEBIAAtAGMNAEEBIQEgAC0AZA0AQQEhASAALQBlDQBBASEBIAAtAGYNAEEBIQEgAC0AZw0AQQEhASAALQBoDQBBASEBIAAtAGkNAEEBIQEgAC0Aag0AQQEhASAALQBrDQBBASEBIAAtAGwNAEEBIQEgAC0AbQ0AQQEhASAALQBuDQBBASEBIAAtAG8NAEEBIQEgAC0AcA0AQQEhASAALQBxDQAgAC0AciEBCyABQQFxDwtB4OSaAUHIAEGo5ZoBEMYkAAtByOKZARCCHgALzwkBA38CQAJAAkADQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOEwAPDwECAw8PBAUQDgwLCgkIBwYACyAAKAIMIgJFDQ4gAkEwbCECIAAoAgghAANAIAAgARDCAyAAQTBqIQAgAkFQaiICDQAMDwsLIAEgACgCBBDKASAAKAIIIQAMCwsgACgCDCIARQ0MIAEgABDKAQ8LIAAoAighAAwJCyABIAAoAgQQygEgACgCCCABEMIDIAAoAhQiAA0IDAoLIAEgACgCEBDKASAAKAIMIgJFDQkgACgCCCIDIAJBGGxqIQQDQAJAIAMoAhQiAEUNACABIAAQygELAkAgA0EIaigCACIARQ0AIABBMGwhAiADQQRqKAIAIQADQCAAIAEQwgMgAEEwaiEAIAJBUGoiAg0ACwsgA0EYaiIDIARGDQoMAAsLIAEtAAwhAiABQQE6AAwgASAAKAIEEMoBIAEgAjoADAwICyAAQQhqIAEQ6QUPCwJAAkACQAJAIAAoAgQOAwABAgALIAAoAggiAigCCCIDRQ0CIAIoAgQiAiADQThsaiEEA0AgAiABEM8KAkAgAkEwaigCACIDRQ0AIAEgAxDKAQsgAkE4aiICIARHDQAMAwsLIAAoAggiAigCCCIDRQ0BIAIoAgQiAiADQThsaiEEA0AgAiABEM8KAkAgAkEwaigCACIDRQ0AIAEgAxDKAQsgAkE4aiICIARHDQAMAgsLIAAoAgggARC4CAsgASAAKAIMEMoBIAAoAhAhAAwECwJAAkACQAJAIAAoAgQOAwABAgALIAAoAggiAigCCCIDRQ0CIAIoAgQiAiADQThsaiEEA0AgAiABEM8KAkAgAkEwaigCACIDRQ0AIAEgAxDKAQsgAkE4aiICIARHDQAMAwsLIAAoAggiAigCCCIDRQ0BIAIoAgQiAiADQThsaiEEA0AgAiABEM8KAkAgAkEwaigCACIDRQ0AIAEgAxDKAQsgAkE4aiICIARHDQAMAgsLIAAoAgggARC4CAsgASAAKAIMEMoBIAAoAhAhAAwDCwJAIAAoAgQiAkECRg0AAkAgAkEBRw0AIAEgACgCCBDKAQwBCyAAKAIIIgIoAggiA0UNACACKAIEIgIgA0E4bGohBANAIAIgARDPCgJAIAJBMGooAgAiA0UNACABIAMQygELIAJBOGoiAiAERw0ACwsCQCAAKAIYIgJFDQAgASACEMoBCwJAIAAoAhwiAkUNACABIAIQygELIAAoAgwhAAwCCyABIAAoAgQQygEgACgCCCEADAELIAEgACgCBBDKASAAKAIIIQAMAAsLAkAgACgCBCIDQdAAaigCACIARQ0AIABBMGwhAiADQcwAaigCACEAA0AgACABEMIDIABBMGohACACQVBqIgINAAsLAkACQAJAIAMoAgBBeWoOAgECAAsgAyABEM8KCyADQTBqKAIAIgBFDQAgAEEwbCECIANBLGooAgAhAANAIAAgARDCAyAAQTBqIQAgAkFQaiICDQALCyADKAJgQYCAgIB4Rg0AIANB6ABqKAIAIgBFDQAgAEEwbCECIANB5ABqKAIAIQADQCAAIAEQwgMgAEEwaiEAIAJBUGoiAg0ACwsPCyABIAAoAgQQygEL9AkBCH8jAEEwayIEJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACKAIAIgVBdGpBByAFQQtLGw4mAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUACyACQQRqIQUMLAsgAkEQaiEFDCsLIAJBEGohBQwqCyACKAIgQTBqIQUMKQsgAkEIaiEFDCgLIAJBBGohBQwnCyACQQxqIQUMJgsgAkEwaiEFDCULIAJBIGohBQwkCyACQSBqIQUMIwsgAkEQaiEFDCILIAJBHGohBQwhCyACQRRqIQUMIAsgAkEQaiEFDB8LIAJBEGohBQweCyACKAIIDgcWFxgZGhscFgsgAkEcaiEFDBwLIAJBDGohBQwbCyACQRRqIQUMGgsgAigCIEEkaiEFDBkLIAJBBGohBQwYCyACQQRqIQUMFwsgAkEIaiEFDBYLIAJBCGohBQwVCyACQRhqIQUMFAsgAkEoaiEFDBMLIAJBBGohBQwSCyACKAIEIQUMEQsgAkEQaiEFDBALIAJBDGohBQwPCyACQQhqIQUMDgsgAkEIaiEFDA0LIAJBDGohBQwMCyACQQxqIQUMCwsgAkEMaiEFDAoLIAJBEGohBQwJCyACQQhqIQUMCAsgAkEEaiEFDAcLIAJBGGohBQwGCyACQQxqIQUMBQsgAkEMaiEFDAQLIAJBEGohBQwDCyACQRBqIQUMAgsgAkEgaiEFDAELIAJBIGohBQsgBSgCACEGAkACQAJAAkACQAJAAkAgAS0AuAFBxQBGDQAgASgCsAEhByAEIAFBARC0BSAEKAIEIQggBCgCACIJQYCAgIB4Rg0BIAQgBCkCDDcDICAEIAQoAhQ2AiggBCgCCCEKIAEoAqwBIQsMAgsgBCABIAEoArABQQEQswUgAUGwAWoiBSAEKAIINgIIIAUgBCkCADcCACAEIAFBARCqByAEKAIEIQggBCgCACIJQYCAgIB4Rg0AIAQgBCkCDDcDICAEIAQoAhQ2AiggBCgCCCEKIAQoAhghByAEKAIcIQsMAQsgAEEANgIAIAAgCDYCBAJAIANFDQAgAxD3GyADKAIAIANBBGooAgAQ8SMgA0EUQQQQ1BQLIAIQjAIgAkHAAEEIENQUDAELQSAQigEiBUUNASAFIAQoAig2AhQgBSAEKQMgNwIMIAUgCjYCCCAFIAg2AgQgBSAJNgIAIAUgCzYCHCAFIAc2AhggASgCrAEhCQJAIAIoAgBBMEcNACAEQemAgIB4NgIAIAEgBiAJIAQQ6h0LQcAAEIoBIghFDQIgCEEANgIIIAhCMTcDAEEgEIoBIgFFDQMgAUIANwIYIAFCgICAgMAANwIAIAAgAzYCFCAAQQA2AhAgACAJNgIMIAAgBjYCCCAAIAU2AgQgACACNgIAIAFBEGoiAkIINwIAIAFBCGoiAEIANwIAIAgQjAIgCEHAAEEIENQUIAFBBGooAgAiBSAAKAIAEOYdIAEoAgAgBRDxIyACKAIAIgIgAUEUaigCABDmDyABKAIMIAIQ+SMgAUEgQQQQ1BQLIARBMGokAA8LQQRBIBCgJAALQQhBwAAQoCQAC0EEQSAQoCQAC4kIAgR/BX4jAEGwAWsiBSQAQgAhCQJAAkACQAJAAkACQAJAAkAgBHkgA3lCwAB8IARCAFIbpyIGIAJ5IAF5QsAAfCACQgBSG6ciB00NACAHQT9LDQEgBkHfAEsNAiAGIAdrQSBJDQMgBUGgAWogAyAEQeAAIAZrIggQvBYgBTUCoAFCAXwhCkIAIQtCACEJDAQLIAEgA1QiByACIARUIAIgBFEbRQ0FQgAhDAwGCyABIAEgA4AiDCADfn0hAUIAIQlCACECDAULIAIgAiADQv////8PgyIEgCIJIAN+fUIghiABQiCIIgyEIASAIgJCIIYgDCACIAN+fUIghiABQv////8Pg4QiASAEgCIDhCEMIAEgAyAEfn0hASACQiCIIAmEIQlCACECDAQLIAVBMGogASACQcAAIAdrIgcQvBYgBUEgaiADIAQgBxC8FkIAIQkgBSADQgAgBSkDMCAFKQMggCIMQgAQ5xEgBUEQaiAEQgAgDEIAEOcRIAUpAwAhCgJAIAUpAxggBSkDCCINIAUpAxB8IgsgDVStfEIAUg0AIAEgClQiByACIAtUIAIgC1EbRQ0CCyAEIAJ8IAMgAXwiASADVK18IAt9IAEgClStfSECIAxCf3whDCABIAp9IQEMAwsCQAJAA0AgBUGQAWogASACQcAAIAdrIgcQvBYgBSkDkAEhDAJAIAcgCE8NACAFQdAAaiADIAQgBxC8FiAFQcAAaiADIAQgDCAFKQNQgCINQgAQ5xECQCABIAUpA0AiClQiByACIAUpA0giDFQgAiAMURsNACACIAx9IAetfSECIAEgCn0hASAJIAsgDXwiDCALVK18IQkMBwsgAiAEfCABIAN8IgQgAVStfCAMfSAEIApUrX0hAiAEIAp9IQEgCSANIAt8Qn98IgwgC1StfCEJDAYLIAVBgAFqIAwgCoAiDEIAIAcgCGsiBxC9FiAFQfAAaiADIAQgDEIAEOcRIAVB4ABqIAUpA3AgBSkDeCAHEL0WIAUpA4gBIAl8IAUpA4ABIgkgC3wiCyAJVK18IQkCQCAGIAIgBSkDaH0gASAFKQNgIgxUrX0iAnkgASAMfSIBeULAAHwgAkIAUhunIgdNDQAgB0E/Sw0CDAELCyABIANUIgcgAiAEVCACIARRG0UNASALIQwMBAsgASABIAOAIgIgA359IQEgCSALIAJ8IgwgC1StfCEJQgAhAgwDCyACIAR9IAetfSECIAEgA30hASAJIAtCAXwiDFCtfCEJDAILIAIgC30gB619IQIgASAKfSEBQgAhCQwBCyACIAR9IAetfSECIAEgA30hAUIBIQwLIAAgATcDECAAIAw3AwAgACACNwMYIAAgCTcDCCAFQbABaiQAC+4JAhd/A34jAEHgAGsiBCQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMoAgANACAEQShqIAEoAsASIAEoAsQSIgUoAghBf2pBeHFqQQhqIgYgAygCCCIHIAMoAgwiCCADKAIQIgkgAygCFCIKIAUoAhAiCxETAAJAAkACQCAEKAIoQQFHDQAgAkHYAWohDCAKQQFqIQ0gAkEYaiEOIAFBsA1qIQ8gASkDCCEbIAEpAwAhHCABLQCsDSEQIAMtABghEUEAIRIgAS0A1BJBAXEhEyABKQOwDUIChSABKQO4DYQhHSAJIRRBACEVA0ACQAJAIAQoAiwiBSAVSQ0AIAQoAjAhFiAEIAk2AlAgBCAFNgJUIAUgCEsNCCAJIAVBAWoiF0sNCCAEIBhBgH5xIBFyIhg2AiQgBCAFNgIgIAQgCTYCHCAEIAg2AhggBCAHNgIUIARBATYCDCATDQkgHVANCyACKALIAUECRg0KIARBKGogDyAOIARBDGogEhDwASAEKAIsIRkgBCgCKCISQQJHDQEgGUEBcQ0WCyAQQQFxDRIgHEIChSAbhFANFSACKALIBEECRg0TIARBKGogASAMIAMQ8QQgBCgCKCIFQQJHDQYgBCgCLBDoFRoMFQsCQAJAIBJFDQAgBCAEKAIwIhI2AkQgBCAKNgJIIAogCEsNDCASIA1LDQwgBCAaQYB+cSARciIaNgJAIAQgCjYCPCAEIBI2AjggBCAINgI0IAQgBzYCMCAEIBk2AiwgBEECNgIoIBBBAXENDQJAIBxCAoUgG4RQDQAgAigCyARBAkYNDyAEQdAAaiABIAwgBEEoahCiAiAEKAJQIhVBAkYNFyAVQQFHDQUgBUF/Rg0QIAQoAlQhFQwCC0HEgIUBQY8BQYyBhQEQ5BsACyAUIApPDQIgBUF/Rg0UCyAEQShqIAYgByAIIBcgCiALERMAIBchFCAWIRIgBCgCKA0ACwtBACEBDAELIBIgBCgCWCIFSw0LQQEhAQsgACAZNgIMIAAgBTYCCCAAIBI2AgQgACABNgIADBELIAEtAKwNQQFGDQogASkDAEIChSABKQMIhFANDyACKALIBEECRg0LIARBKGogASACQdgBaiADEPEEAkAgBCgCKCIFQQJHDQAgBCgCLBDoFRoMEAsgBCgCLCEBIAAgBCkCMDcCCCAAIAE2AgQgACAFNgIADBALIAQoAiwhASAAIAQpAjA3AgggACABNgIEIAAgBTYCAAwPCyAEIAg2AkQgBEEHNgI0IARB+AA2AiwgBCAEQcQAajYCMCAEIARB0ABqNgIoQeCHgAEgBEEoakHo45oBEOQbAAtBiPOaAUEoQbyNhQEQtyEAC0GMjYUBEMMjAAtBxICFAUGPAUGcgYUBEOQbAAsgBCAINgJMIARBBzYCXCAEQfgANgJUIAQgBEHMAGo2AlggBCAEQcQAajYCUEHgh4ABIARB0ABqQejjmgEQ5BsAC0GI85oBQShBoIyFARC3IQALQdyBhQEQwyMAC0G0gIUBEMMjAAtB/NaEAUElQZDXhAEQ5BsAC0GI85oBQShB4IuFARC3IQALQayBhQEQwyMAC0GI85oBQShB4IuFARC3IQALQayBhQEQwyMAC0GkgIUBEMMjAAsgACABIAIgAxDJBQsgBEHgAGokAAuSCgIKfwF+IwBBsAFrIgIkAAJAAkACQAJAAkACQAJAIAEoAgAiA0F7akEESw0AA0BBwAAQigEiA0UNAiADQQA2AgggA0IxNwMAIAEoAgQhBCABIAM2AgQgAkHQAGogBBD+ByACKAJQQQtGDQMgAiACKQN4NwNIIAIgAikDcDcDQCACIAIpA2g3AzggAiACKQNgNwMwIAIgAikDWDcDKCACIAIpA1A3AyAgARCOCiABIAIpA0g3AyggASACKQNANwMgIAEgAikDODcDGCABIAIpAzA3AxAgASACKQMoNwMIIAEgAikDIDcDACABKAIAIgNBe2pBBUkNAAsLAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAw4LAAECAwQFBgcICQoACyABQQA6ABwCQCABKAIgIgNFDQAgAygCACIEEKkEIARB4ABBCBDUFCADQQxBBBDUFAsgAUEANgIgIAAoAgANCgwLCyAALQDfASEEIABBADoA3wEgACABKAIoEIkBAkAgASgCCEECRw0AIAAgASgCDBCJAQsgACAEOgDfAQwICyABKAIIQQFHDQcgACABKAIMEIkBDAcLIAAgASgCBBCJAQwGCwJAIAEoAgQiBSgCACIEQQNHDQAgACAFKAIQEIkBAkAgBUEMaigCACIERQ0AIARBBHQhBiAFQQhqKAIAQQxqIQQDQCAAIAQoAgAQiQEgBEEQaiEEIAZBcGoiBg0ACwsCQCAFKAIgIgRFDQAgBBD3GyAEKAIAIARBBGooAgAQ8SMgBEEUQQQQ1BQLIAVBADYCIAwGCyAALQDfASEGIABBADoA3wEgACAFKAIgEIkBAkAgBEECRw0AIAAgBSgCBBCJAQsgACAGOgDfAQwFCyAAIAEoAgQQiQEMBAsgACABKAIEEIkBDAMLIAAgASgCBBCJAQwCCyAAIAEoAgQQiQEMAQsgACABKAIEEIkBCyAAKAIARQ0BIAMNAQsgASgCGCEGIAEoAhQhBSABKAIQIQcCQCABKQMIIgxCA4NCAFINACAMpyIDIAMoAgAiA0EBajYCACADQX9MDQcLIAEtABwhCAJAAkAgASgCICIEDQBBACEDDAELQQwQigEiA0UNBCAEKAIAIQkgBCgCCCEKIAQoAgQhC0HgABCKASIERQ0FIAJB0ABqIAkQbyAEIAJB0ABqQeAA/AoAACADIAo2AgggAyALNgIEIAMgBDYCAAsgAiADNgJoIAIgCDoAZCACIAY2AmAgAiAFNgJcIAIgBzYCWCACIAw3A1AgAkEIaiACQdAAahDyGgJAIAAgAkEIahCABiIDRQ0AIAJB0ABqIAMQ/gcgAigCUEELRg0GIAIgAikDeDcDSCACIAIpA3A3A0AgAiACKQNoNwM4IAIgAikDYDcDMCACIAIpA1g3AyggAiACKQNQNwMgIAEQjgogASACKQNINwMoIAEgAikDQDcDICABIAIpAzg3AxggASACKQMwNwMQIAEgAikDKDcDCCABIAIpAyA3AwALIAIpAwgiDEIDg0IAUg0AIAynIgEgASgCACIDQX9qNgIAIANBAUcNACABIAEoAhAQ7B4LIAJBsAFqJAAPC0EIQcAAEKAkAAsgAiACKAJUNgIgQdT9mgFBKyACQSBqQeTOmgFB7NGaARDVFAALQQRBDBCgJAALQQhB4AAQoCQACyACIAIoAlQ2AiBB1P2aAUErIAJBIGpB5M6aAUHE0ZoBENUUCwAL6wkCDX8BfiMAQdAAayIEJAAgAy0APSEFIAMtAEAhBiADLQA/IQcgAygCMCEIIAMtAD4hCSADLQA8IQogASgCeCELIAMoAiAhDCADLQBBIQ0gBCADLQBCIg46AE8gBCANOgBOIAQgDDYCSCADQSRqIQ8gC0H//O9vcSEQAkACQCANDQACQCAOQQFxDQAgASAQQYCAgBByNgJ4IAQgAjYCMCAEIA8oAgg2AiggBCAPKQIANwMgIAQgBEHIAGo2AjggBCAEQc4AajYCNCAEIARBzwBqNgIsIARBGGogBEEgaiABEOoBIAQoAhwhDSAEKAIYIQ8MAgsgASAQQYCCgBByNgJ4IAQgAjYCMCAEIA8oAgg2AiggBCAPKQIANwMgIAQgBEHIAGo2AjggBCAEQc4AajYCNCAEIARBzwBqNgIsIARBEGogBEEgaiABEOoBIAQoAhQhDSAEKAIQIQ8MAQsCQCAOQQFxDQAgASALQf/8729xQYCBgBByNgJ4IAQgAjYCMCAEIA8oAgg2AiggBCAPKQIANwMgIAQgBEHIAGo2AjggBCAEQc4AajYCNCAEIARBzwBqNgIsIARBCGogBEEgaiABEOoBIAQoAgwhDSAEKAIIIQ8MAQsgASAQQYCDgBByNgJ4IAQgAjYCMCAEIA8oAgg2AiggBCAPKQIANwMgIAQgBEHIAGo2AjggBCAEQc4AajYCNCAEIARBzwBqNgIsIAQgBEEgaiABEOoBIAQoAgQhDSAEKAIAIQ8LIAEgCzYCeAJAAkACQAJAAkAgD0EBRw0AIABBDTYCACAAIA02AgQgAygCAEEFRw0BIAMpAwgiEUIDg0IAUg0EIBGnIgMgAygCACIAQX9qNgIAIABBAUcNBCADIAMoAhAQ7B4MBAsCQAJAIAUOAwQAAQQLIAEtAIEBQSBxRQ0DIAEtAIQBQf8BcQ0DDAILIAEtAIEBQSBxRQ0CIAEtAIQBQf8BcUUNAQwCCyADEMsODAILIANBCEEQIAMoAgBBfmpBA0kiCxtqKAIAIQ8gA0EMQRQgCxtqKAIAIQsgBEGBgYCAeDYCICABIA8gCyAEQSBqEOodCwJAAkACQCADKAIAQQVGDQAgASgCrAEhCyAJQQFxDQEMAgsgA0EIaiELIAEoAqwBIQ8gAygCFCEDAkAgCkH/AXFBA0YNACAEQbaBgIB4NgIgIAEgDCADIAwgA0kbIAwgAyAMIANLGyAEQSBqEOodCyAAQQY2AgAgACAGOgApIAAgBzoAKCAAIAk6ACcgACAFOgAlIAAgCjoAJCAAIA02AiAgACAPNgIcIAAgDDYCGCAAIAM2AhQgACAIQQFGOgAmIAQgCykCADcCJCAAIAQpAiA3AgQgBCALKAIINgIsIAAgBCkCKDcCDAwCCyANKAIYQYCAgIB4Rg0AIARBooGAgHg2AiAgASAMIAsgBEEgahDqHQsgAEEFNgIAIAQgAykCADcCJCAAIAQpAiA3AgQgBCADKQIINwIsIAAgBCkCKDcCDCAEIAMpAhA3AjQgACAEKQIwNwIUIAQgAykCGDcCPCAAIAQpAjg3AhwgACAEKAJANgIkIAAgCjoAOSAAIAU6ADggACAGOgA3IAAgBzoANiAAIAk6ADUgACAIQQFGOgA0IAAgDTYCMCAAIAs2AiwgACAMNgIoCyAEQdAAaiQAC+sJAg1/AX4jAEHQAGsiBCQAIAMtAD0hBSADLQBAIQYgAy0APyEHIAMoAjAhCCADLQA+IQkgAy0APCEKIAEoAnghCyADKAIgIQwgAy0AQSENIAQgAy0AQiIOOgBPIAQgDToATiAEIAw2AkggA0EkaiEPIAtB//zvb3EhEAJAAkAgDQ0AAkAgDkEBcQ0AIAEgEEGAgIAQcjYCeCAEIAI2AjAgBCAPKAIINgIoIAQgDykCADcDICAEIARByABqNgI4IAQgBEHOAGo2AjQgBCAEQc8AajYCLCAEQRhqIARBIGogARCVAiAEKAIcIQ0gBCgCGCEPDAILIAEgEEGAgoAQcjYCeCAEIAI2AjAgBCAPKAIINgIoIAQgDykCADcDICAEIARByABqNgI4IAQgBEHOAGo2AjQgBCAEQc8AajYCLCAEQRBqIARBIGogARCVAiAEKAIUIQ0gBCgCECEPDAELAkAgDkEBcQ0AIAEgC0H//O9vcUGAgYAQcjYCeCAEIAI2AjAgBCAPKAIINgIoIAQgDykCADcDICAEIARByABqNgI4IAQgBEHOAGo2AjQgBCAEQc8AajYCLCAEQQhqIARBIGogARCVAiAEKAIMIQ0gBCgCCCEPDAELIAEgEEGAg4AQcjYCeCAEIAI2AjAgBCAPKAIINgIoIAQgDykCADcDICAEIARByABqNgI4IAQgBEHOAGo2AjQgBCAEQc8AajYCLCAEIARBIGogARCVAiAEKAIEIQ0gBCgCACEPCyABIAs2AngCQAJAAkACQAJAIA9BAUcNACAAQQ02AgAgACANNgIEIAMoAgBBBUcNASADKQMIIhFCA4NCAFINBCARpyIDIAMoAgAiAEF/ajYCACAAQQFHDQQgAyADKAIQEOweDAQLAkACQCAFDgMEAAEECyABLQCBAUEgcUUNAyABLQCEAUH/AXENAwwCCyABLQCBAUEgcUUNAiABLQCEAUH/AXFFDQEMAgsgAxDLDgwCCyADQQhBECADKAIAQX5qQQNJIgsbaigCACEPIANBDEEUIAsbaigCACELIARBgYGAgHg2AiAgASAPIAsgBEEgahDqHQsCQAJAAkAgAygCAEEFRg0AIAEoAqwBIQsgCUEBcQ0BDAILIANBCGohCyABKAKsASEPIAMoAhQhAwJAIApB/wFxQQNGDQAgBEG2gYCAeDYCICABIAwgAyAMIANJGyAMIAMgDCADSxsgBEEgahDqHQsgAEEGNgIAIAAgBjoAKSAAIAc6ACggACAJOgAnIAAgBToAJSAAIAo6ACQgACANNgIgIAAgDzYCHCAAIAw2AhggACADNgIUIAAgCEEBRjoAJiAEIAspAgA3AiQgACAEKQIgNwIEIAQgCygCCDYCLCAAIAQpAig3AgwMAgsgDSgCGEGAgICAeEYNACAEQaKBgIB4NgIgIAEgDCALIARBIGoQ6h0LIABBBTYCACAEIAMpAgA3AiQgACAEKQIgNwIEIAQgAykCCDcCLCAAIAQpAig3AgwgBCADKQIQNwI0IAAgBCkCMDcCFCAEIAMpAhg3AjwgACAEKQI4NwIcIAAgBCgCQDYCJCAAIAo6ADkgACAFOgA4IAAgBjoANyAAIAc6ADYgACAJOgA1IAAgCEEBRjoANCAAIA02AjAgACALNgIsIAAgDDYCKAsgBEHQAGokAAv0CQIIfwJ+IwBBwABrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQC4ASIDQQRHDQACQAJAIAEoAogBIgRBC0cNACACQShqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwMoIAIgASgCoAE2AjAgAUGMAWohBQJAIAEoAghBCkYNACABQQhqELwLCyABIAQ2AgggASAFKQIANwIMIAEgBSgCCDYCFAsgASACKAIwNgK4ASABIAEpA7ABNwOoASABIAIpAyg3ArABIAEtALgBQT5GDQEMCAsgASABKAJ4IgVBgICABHI2AngCQCADQUBqQQJJDQACQCADQaIBRg0AAkACQCADQRlHDQAgAkEoaiABEP4JIAIpAygiClANBSAKpyEGQgAhCwwBCyACQShqIAEQtgggAikDKCIKUA0EIAqnIQZCASELCyACKAI0IQcgAigCMCEIDAQLIAEpAwghCyABQQo2AgggAiABKQMQNwMwIAIgCzcDKAJAAkAgC6ciBEEKRg0AIARBCUYNASACQShqELwLC0GI85oBQShBwIebARC3IQALIAIoAiwhBAJAAkAgASgCiAEiA0ELRw0AIAJBKGogARDGAQwBCyABQQs2AogBIAEgAzYCCCABIAEpAowBNwIMIAEgASgClAE2AhQgAiABKQKYATcDKCACIAEoAqABNgIwCyABIAIoAjA2ArgBIAEgASkDsAE3A6gBIAEgAikDKDcCsAEMBAsCQCAFQYAgcUUNACABIAVBgMCABHI2AngLIAJBCGogARB8IAIoAgwhBCACKAIIQQFxDQMMBQsgAS0AgQFBIHFFDQYgARD7BCIERQ0GQQAhBQwHC0ICIQsgAigCMCEGCyALQgJSDQEgBiEECyAAIAQ2AgQgASAFNgJ4IABBAjoAAAwGCyAKQiCIpyEJAkAgC0IBUg0AQcAAEIoBIgRFDQIgBEEAOgAcIARBADYCGCAEIAc2AhQgBCAINgIQIAQgCTYCDCAEIAY2AgggBEEaNgIADAELIAJBh4CAgHg2AiggASAIIAcgAkEoahDqHUEIQcAAEOIgIgQgBzYCFCAEIAg2AhAgBCAJNgIMIAQgBjYCCCAEQS82AgALIAEgBTYCeAwDC0EIQcAAEKAkAAsgAiABEIABIAIoAgQhBCACKAIAIQULAkAgBUEBcUUNACAAQQI6AAAgACAENgIEDAILIAIgBDYCEAJAIAEtALgBIgVBBUcNACABQbABaiEFAkACQCABKAKIASIGQQtHDQAgAkEoaiABEMYBDAELIAFBCzYCiAEgAiABKQKYATcDKCACIAEoAqABNgIwIAFBjAFqIQgCQCABKAIIQQpGDQAgAUEIahC8CwsgASAGNgIIIAEgCCkCADcCDCABIAgoAgg2AhQLIAEpA7ABIQsgBSACKQMoNwIAIAUgAigCMDYCCCABIAs3A6gBDAELIAEoArQBIQQgASgCsAEhAyACQRRqIAUQxiUgAkGPAq1CIIZB++OaAa2ENwMgIAJBKGpBzZWAASACQSBqEK8QIAIgAikCFDcCNCACIAIoAhw2AjwgAyAEIAJBKGoQwBshBAJAIAEtALgBQaIBRw0AIAEgARCFDhCTCQsgAEECOgAAIAAgBDYCBCACQRBqEJEiDAELIAAgBDYCBCAAIANBBEY6AAALIAJBwABqJAAL3gkBCX8jAEHAAGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiAygCAA4JAAEIAgMEBQYHAAsgA0EEaiABEJENIQAMCAsgAygCBCEEQQAhACACQRRqIAMoAggiBUEAQQRBDBDADyACKAIYIQYgAigCFEEBRg0JIAIoAhwhBwJAIAVFDQAgByEAIAUhAwNAIAIgBDYCNCACQaABNgI8IAIgAkE0ajYCOCACQRRqQc2VgAEgAkE4ahDNCCAAIAIoAhw2AgggACACKQIUNwIAIABBDGohACAEQQhqIQQgA0F/aiIDDQALIAUhAAsgAkEUaiAHIAAQiyMgByAAEKEdIAYgBxDGIyACQfIANgI8IAIgAkEUajYCOCABKAIAIAEoAgRBz66BASACQThqEMsGIQAgAigCFCACKAIYEMcjDAcLIAIgA0EIajYCNCACIAMoAgQ2AjggAkE9NgIgIAJBoQE2AhggAiACQThqNgIcIAIgAkE0ajYCFCABKAIAIAEoAgRBzIyAASACQRRqEMsGIQAMBgsgAygCBCEEQQAhACACQRRqIAMoAggiBUEAQQRBDBDADyACKAIYIQYgAigCFEEBRg0GIAIoAhwhBwJAIAVFDQAgByEAIAUhAwNAIAIgBCgCADYCNCACQT02AjwgAiACQTRqNgI4IAJBFGpBzZWAASACQThqEM0IIAAgAigCHDYCCCAAIAIpAhQ3AgAgAEEMaiEAIARBBGohBCADQX9qIgMNAAsgBSEACyACQRRqIAcgABCLIyAHIAAQoR0gBiAHEMYjIAJB8gA2AjwgAiACQRRqNgI4IAEoAgAgASgCBEG3roEBIAJBOGoQywYhACACKAIUIAIoAhgQxyMMBQsgAygCCCEAIAIgAygCBDYCNCACIAA2AjggAkEHNgIgIAJBBzYCGCACIAJBOGo2AhwgAiACQTRqNgIUIAEoAgAgASgCBEG0soEBIAJBFGoQywYhAAwECyADKAIEIQAgAygCECEEIAMoAgwhByACIAMoAgg2AgwgAiAHNgIQIAIgBDYCNCACIAA2AjggAkE9NgIwIAJBPTYCKCACQT02AiAgAkE9NgIYIAIgAkE4ajYCLCACIAJBNGo2AiQgAiACQRBqNgIcIAIgAkEMajYCFCABKAIAIAEoAgRBoIyAASACQRRqEMsGIQAMAwsgASgCAEGynoUBQQQgASgCBCgCDBEMACEADAILIAIgAygCBDYCOCACQT02AhggAiACQThqNgIUIAEoAgAgASgCBEHbroEBIAJBFGoQywYhAAwBC0EBIQAgASgCACIGQayehQFBBiABKAIEIggoAgwiCREMAA0AIAMoAgQiACADKAIIQQJ0aiEHQQAhBEEAIQoCQANAIAQhAwJAAkAgACAHRg0AIANBAWohBCAAKAIAIQEgAEEEaiIFIQAgAUUNAiACIANB/wFxrUKAgICAkCB+IAGthDcDOCAKRQ0BIAZB36aYAUECIAkRDABFDQEMAwsgBkH37JoBQQEgCREMACEADAMLIAJBogE2AhggAiACQThqNgIUIAYgCEHNlYABIAJBFGoQywYNASAKQQFqIQogBSEADAALC0EBIQALIAJBwABqJAAgAA8LIAYgAigCHBD8IAALIAYgAigCHBD8IAAL2wgCC38BfiMAQTBrIgckAAJAAkACQAJAAkACQAJAAkAgBEEQSQ0AIAZBf2ohCCABQRhqIQlBASEKIAEoAgQhCyABKAIAQQFHDQECQCAGDQBBASEKDAMLIAEoAhAiDCAGIAwgBksbIQ0gASkDCCESQQAhCiAMQX9qIAZPIQ5BACEPA0AgDyAGaiAESw0HAkAgAhCPG0UNACAHQRhqIA8gAyAEQZzfgwEQzR0gB0EQaiACIAkgBygCGCAHKAIcEPcRIAcoAhBBAXFFDQggBygCFCAPaiIPIAZqIARLDQgLIA8gCGoiASAETw0FIAYhEAJAIBIgAyABajEAAIhCAYNQDQAgAyAPaiEQIAwhAQJAA0ACQCANIAFHDQAgDCEBAkACQANAIAFFDQ0gAUF/aiEBIA4NAiABIA9qIhAgBE8NASAFIAFqLQAAIAMgEGotAABGDQALIAshEAwFCyAQIARB3N+DARD1FgALIAEgBkHM34MBEPUWAAsgDyABaiAETw0BAkAgBSABai0AACAQIAFqLQAARw0AIAFBAWohAQwBCwsgDyAMayABakEBaiEPDAILIAQgDCAPaiIBIAQgAUsbIARBvN+DARD1FgALIBAgD2ohDwwACwsgB0EIaiABKAIoIAEoAiwgAyAEIAUgBhDvDSAHKAIMIQ8gBygCCCEKDAYLIAYNAQtBACEPDAQLIAYgC2shESABKQMIIRIgASgCECEMQQAhCkEAIQ8CQAJAAkADQCAPIAZqIARLDQMCQAJAIAIQjxsNACAKIAwgCiAMSxshDgwBCyAHQShqIA8gAyAEQezfgwEQzR0gB0EgaiACIAkgBygCKCAHKAIsEPcRIAcoAiBBAXFFDQRBACEKIAwhDiAHKAIkIA9qIg8gBmogBEsNCAsCQCAPIAhqIgEgBEkNACABIARB/N+DARD1FgALAkACQCASIAMgAWoxAACIQgGDUA0AIA4gBiAOIAZLGyENIAMgD2ohECAOIQECQAJAAkADQAJAIA0gAUcNACAMIQEMAgsgDyABaiAETw0FIAUgAWotAAAgECABai0AAEcNAiABQQFqIQEMAAsLAkACQANAIAEgCk0NAiABIAZPDQggDyABaiINIARPDQECQCAFIAFqLQAAIBAgAWotAABHDQAgAUF/aiEBDAELCyARIQogCyEBDAMLIA0gBEGs4IMBEPUWAAsgCiAGTw0GAkAgDyAKaiIQIARPDQAgBSAKaiENIBEhCiALIQEgDS0AACADIBBqLQAARg0KDAILIBAgBEHM4IMBEPUWAAsgASAMa0EBaiEBQQAhCgsgASAPaiEPDAILIA8gBmohD0EAIQoMAQsLIAQgDiAPaiIBIAQgAUsbIARBjOCDARD1FgALIAEgBkGc4IMBEPUWAAsgCiAGQbzggwEQ9RYAC0EAIQoMAwsgASAEQazfgwEQ9RYAC0EBIQoMAQsLIAAgCjYCACAAIA82AgQgB0EwaiQAC4kJAgp/AX4jAEHAAGsiAyQAIANBGGogAiABKAIYIgQoAjBBABC1AgJAAkAgAy0AGEEERg0AIAMpAxgiDUL/AYNCBFENACAAIA03AgAMAQsCQAJAAkACQCAEKAIwIgVFDQAgA0EYaiACIAUQ7R0gAy0AGEEERg0AIAMpAxgiDUL/AYNCBFINAQsCQAJAIAEtABQiBkECRw0AQQAhBQwBCyADIAEQjRQgAygCBCEHIAMoAgAhBQsgA0EBNgIYIAMgBCkCMDcCHCACKAJIRQ0CIANBCGogAiAFIAdBAkEBIANBGGoQ+gkgAy0ACEEERg0BIAMpAwgiDUL/AYNCBFENASAAIA03AgAMAwsgACANNwIADAILIAIoAkhFDQAgA0EANgIQIANCgICAgMAANwIIIAQoAghBBnQhBSAEKAIEIQcgAyADQQhqNgIYAkADQCAFRQ0BIAVBQGohBSAHIANBGGoQrAsgB0HAAGohBwwACwsgAygCECEHIAMoAgwhBSADIAMoAgg2AiAgAyAFNgIYIAMgBSAHQQxsIgdqIgg2AiQDQAJAAkAgB0UNAAJAIAUoAgAiCUGAgICAeEYNACAFQQxqIQogBUEEaiILKAIAIQUgAigCSEUNAiADQThqIAIgCykCACINpyILIA1CIIinIgwgCyAMQQEQ2QcgAy0AOEEERg0CIAMpAzgiDUL/AYNCBFENAiAAIA03AgAgAyAKNgIcIAkgBRDTJSADQRhqEIYYDAULIAVBDGohCAsgAyAINgIcIANBGGoQhhgMAgsgCSAFENMlIAdBdGohByAKIQUMAAsLAkACQCAELQBFDQAgA0EANgIYIANBCGogAiADQRhqQeXtmgFBCBDqDSADLQAIQQRGDQEgAykDCCINQv8Bg0IEUQ0BIAAgDTcCAAwCCyADQQA2AiwgA0EYaiACIANBLGpB4O2aAUEFEOoNAkAgAy0AGEEERg0AIAMpAxgiDUL/AYNCBFENACAAIA03AgAMAgsgA0EYaiACENUQAkAgAy0AGEEERg0AIAMpAxgiDUL/AYNCBFENACAAIA03AgAMAgsgA0EYaiACIANBLGpB5e2aAUEIEOoNIAMtABhBBEYNACADKQMYIg1C/wGDQgRRDQAgACANNwIADAELAkAgBC0AREUNACADQQA2AhggA0EIaiACIANBGGpB2O2aAUEBEOsNIAMtAAhBBEYNACADKQMIIg1C/wGDQgRRDQAgACANNwIADAELAkAgBkECRg0AIANBGGogAhDVEAJAIAMtABhBBEYNACADKQMYIg1C/wGDQgRRDQAgACANNwIADAILIANBGGogASACEIoWIAMtABhBBEYNACADKQMYIg1C/wGDQgRRDQAgACANNwIADAELIANBGGogAiAEEIEGAkAgAy0AGEEERg0AIAMpAxgiDUL/AYNCBFENACAAIA03AgAMAQsCQCACKAJIRQ0AIANBGGogAhCaEyADLQAYQQRGDQAgAykDGCINQv8Bg0IEUQ0AIAAgDTcCAAwBCyAAQQQ6AAALIANBwABqJAAL7wgCC38CfiMAQRBrIgIkAEEBIQMCQAJAAkACQAJAAkACQAJAAkACQCABKAIADgoDCQEJBQkCCQkACQtBASEDIAEoAghBEUcNCEEBIQMgASgCEEEHRw0IQQEhAyABKAIUIgQtAEVBA0YNCCAAIARBIGoQyA9BASEDDAgLIAEtACBFDQJBACEDDAcLIAEoAgQiBC0AQUUNA0EAIQMMBgtBASEDIAEtACANBUEBIQMgASgCDCIFRQ0FQQAhBCABKAIIIgYhAwJAAkADQCAAIAMQhQZFDQEgA0HIAGohA0EBIQcgBSAEQQFqIgRHDQAMAgsLIAMQ7AoCQCAEQQFqIAVPDQAgBEF/cyAFaiEFIANByABqIQMDQAJAAkAgACADEIUGDQAgAxDsCgwBCyAGIARByABsaiADQcgA/AoAACAEQQFqIQQLIANByABqIQMgBUF/aiIFDQALCyABIAQ2AgwgBEEARyEHCyAALQDZASAHciEDDAULQQAhBAJAIAEoAgwiB0UNACABQRhqIQYgAEHAAGohCCAAQTBqIQkgASgCCCIKQdAAaiEDQQAhBAJAAkADQAJAIANBsH9qKQMAIg1CAVYNACADQXhqLQAAIQUCQCANp0EBcQ0AIAVBAXENACAGKAIADQEgA0FIaigCACEFAkAgA0G4f2opAwAiDUIDg0IAUiILDQAgDaciDCAMKAIAIgxBAWo2AgAgDEF/TA0JCyACIAU2AgggAiANNwMAQQEhBQJAIAkgAhDzDEUNACAIIAIQ8wwhBQsCQCALDQAgDaciCyALKAIAIgxBf2o2AgAgDEEBRw0AIAsgCygCEBDsHgsgBQ0BIANBsH9qIQUMBAsgBUEBcQ0CCyADQdAAaiEDIAcgBEEBaiIERw0ACyABKAIMQQBHIQMMBwsgA0Gwf2ohBQsgBRDYCQJAIARBAWogB08NACAEQX9zIAdqIQUDQAJAAkAgBiAAIAMQnAwNACADENgJDAELIAogBEHQAGxqIANB0AD8CgAAIARBAWohBAsgA0HQAGohAyAFQX9qIgUNAAsLIAEgBDYCDAsgBEEARyEDDAQLQQEhAyABKAIEIgQoAgBBGkcNAyAEQRhqKAIAIQMCQCAEKQMIIg1CA4MiDkIAUg0AIA2nIgQgBCgCACIEQQFqNgIAIARBf0wNAgsgAiADNgIIIAIgDTcDAEEBIQMCQCAAQTBqIAIQ8wxFDQAgAEHAAGogAhDzDCEDCyAOQgBSDQMgDaciBCAEKAIAIgFBf2o2AgAgAUEBRw0DIAQgBCgCEBDsHgwDC0EBIQMgBC0AQA0CIARBOGooAgAhAyAEKQMoIg1CA4NCAFINASANpyIEIAQoAgAiAUEBajYCACABQX9MDQAgAiADNgIIIAIgDTcDACAAQSBqIAIQ8wwhAyAEIAQoAgAiAUF/ajYCACABQQFHDQIgBCAEKAIQEOweDAILAAsgAiADNgIIIAIgDTcDACAAQSBqIAIQ8wwhAwsgAkEQaiQAIANBAXELgQoBCX8jAEHgAWsiAiQAIAEoAsABIQMgARDlEQJAAkAgAS0AyAEiBEUNACABKALEASEFIAEoAsABIQYgAkEQaiAEENclIAJBjwKtQiCGQZ+2gQGthDcDMCACQfAAakHNlYABIAJBMGoQhR8gAiACKQIQNwJ8IAIgAigCGDYChAEgBiAFIAJB8ABqEMAbIQQCQCABLQDIAUGiAUcNACABIAEQnyMQhhQLIABBADYCACAAIAQ2AgQMAQsgASgCvAEhBiABKAK4ASEHIAEQ5REgASABKAJ4IgRBv///X3FBwAByNgJ4IAJBCGogARC1CiACKAIIIQUgASAENgJ4IAIoAgwhCAJAAkACQAJAAkACQAJAAkAgBUEBcQ0AIAIgCDYCHAJAIAEtAMgBIgRBAUYNACABKALEASEFIAEoAsABIQYgAkEgaiAEENclIAJBjwKtQiCGQZLwmgGthDcDMCACQfAAakHNlYABIAJBMGoQhR8gAiACKQIgNwJ8IAIgAigCKDYChAEgBiAFIAJB8ABqEMAbIQQCQCABLQDIAUGiAUcNACABIAEQnyMQhhQLIABBADYCACAAIAQ2AgQMCAsgARDlESACQbABaiABQYCAgKACEJgKIAIoArABQRNGDQZBCEEwEOggIgkgAkGwAWpBMPwKAAAgAiAJNgIsQQAhBCABLQB7QQRxDQUgAkEANgIwIAJBMGpBCGohCiACQfAAakEIaiEGA0ACQCABLQDIAUHXAEYNACACKAIwRQ0DIAIgAigCQDYCgAEgAiACKQI4NwN4IAIgAikCMDcDcAwFCyABEOURAkAgAS0AyAFB3gBGDQAgAkHwAGogAUGAgICgAhCYCiACKAJ0IQUgAigCcCIGQRNGDQQgAkHIAGogAkHwAGpBCGpBKPwKAAAgAigCMEUNBiACIAIoAkA2AoABIAIgAikCODcDeCACIAIpAjA3A3BBCEEwEOggIgQgBTYCBCAEIAY2AgAgBEEIaiACQcgAakEo/AoAACABKAK8ASACQfAAaiAEEP4bDAULIAEgASgCeCIEQYCAgCByNgJ4IAJB8ABqIAEQzgMgASAENgJ4IAIoAnQhBSACKAJwIgdFDQMgAiAGKAIINgKoASACIAYpAgA3A6ABAkAgAigCMEUNAEEIQTAQ6CAiBCAFNgIIIAQgBzYCBCAEQQg2AgAgBCACKQOgATcCDCAEIAIoAqgBNgIUIAEoArwBIAJBMGogBBD+GwwBCyACQTBqEOkiIAogAikDoAE3AgAgCiACKAKoATYCCCACIAU2AjQgAiAHNgIwDAALCyAIKAIEIQEgCCgCACEEQQRBBBDoICIFIAg2AgAgAiAGNgKEASACIAc2AoABIAIgBTYCdCACQTA2AnwgAkGG9ZoBNgJ4IAJBuYGAgHg2AnAgBCABIAJB8ABqEMAbIQEgAEEANgIAIAAgATYCBAwHC0EAIQQMAwsgAEEANgIAIAAgBTYCBCACQTBqEOkiIAJBLGoQ0gYMBAsgAiACKQJ0NwNIIAIgAikCfDcDUCACKAJwIQVBCCEGC0EIQTAQ6CAiBCAFNgIEIAQgBjYCACAEQQhqIAJByABqQSj8CgAACyAAIAQ2AhAgACADNgIIIAAgCTYCBCAAIAg2AgAgACABKAK8ATYCDAwCCyAAIAIoArQBNgIEIABBADYCAAsgAkEcahC5IgsgAkHgAWokAAvjCAECfwJAAkACQAJAAkACQAJAIAEoAgAOBwUBAAECAwQFCyABKAIMIQIgASgCCCEBDAULIAEoAhQhAiABKAIQIQEMBAsgASgCECECIAEoAgwhAQwDCyABKAIIIQIgASgCBCEBDAILAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCBCIBKAIAIgJBdGpBByACQQtLGw4mAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUACyABQQhqIQIgAUEEaiEBDCwLIAFBFGohAiABQRBqIQEMKwsgAUEUaiECIAFBEGohAQwqCyABKAIgIgFBNGohAiABQTBqIQEMKQsgAUEMaiECIAFBCGohAQwoCyABQQhqIQIgAUEEaiEBDCcLIAFBEGohAiABQQxqIQEMJgsgAUE0aiECIAFBMGohAQwlCyABQSRqIQIgAUEgaiEBDCQLIAFBJGohAiABQSBqIQEMIwsgAUEUaiECIAFBEGohAQwiCyABQSBqIQIgAUEcaiEBDCELIAFBGGohAiABQRRqIQEMIAsgAUEUaiECIAFBEGohAQwfCyABQRRqIQIgAUEQaiEBDB4LIAEoAggOBxYXGBkaGxwWCyABQSBqIQIgAUEcaiEBDBwLIAFBEGohAiABQQxqIQEMGwsgAUEYaiECIAFBFGohAQwaCyABKAIgIgFBKGohAiABQSRqIQEMGQsgAUEIaiECIAFBBGohAQwYCyABQQhqIQIgAUEEaiEBDBcLIAFBDGohAiABQQhqIQEMFgsgAUEMaiECIAFBCGohAQwVCyABQRxqIQIgAUEYaiEBDBQLIAFBLGohAiABQShqIQEMEwsgAUEIaiECIAFBBGohAQwSCyABKAIEIgFBBGohAgwRCyABQRRqIQIgAUEQaiEBDBALIAFBEGohAiABQQxqIQEMDwsgAUEMaiECIAFBCGohAQwOCyABQQxqIQIgAUEIaiEBDA0LIAFBEGohAiABQQxqIQEMDAsgAUEQaiECIAFBDGohAQwLCyABQRBqIQIgAUEMaiEBDAoLIAFBFGohAiABQRBqIQEMCQsgAUEMaiECIAFBCGohAQwICyABQQhqIQIgAUEEaiEBDAcLIAFBHGohAiABQRhqIQEMBgsgAUEQaiECIAFBDGohAQwFCyABQRBqIQIgAUEMaiEBDAQLIAFBFGohAiABQRBqIQEMAwsgAUEUaiECIAFBEGohAQwCCyABQSRqIQIgAUEgaiEBDAELIAFBJGohAiABQSBqIQELIAIoAgAhAiABKAIAIQEMAQsgASgCECEDAkAgASgCICICRQ0AIAMgAigCCCICIAMgAkkbIQEgAyACIAMgAksbIQIMAQsgASgCFCECIAMhAQsgACACNgIEIAAgATYCAAujCgEIfyMAQdABayIDJAACQAJAAkAgACgCAC0AACIEQaQBRw0AIAEtALgBIgBBowFGDQEgA0HAAGohBSADQZQBaiEGA0AgASgCsAEhBEEAIQdBBCEIQQAhCQJAIABB/wFxQRhHDQAgA0GQAWogAUEBEN0BIAMoApQBIQggAygCkAEiB0GAgICAeEYNBCADKAKYASEJIAEtALgBIQALAkACQAJAIABB/wFxQah/ag4IAQAAAAAAAAEACyABIAEoAngiAEH///v/fnFBgICAgAFyNgJ4IAMgCTYCzAEgAyAINgLIASADIAc2AsQBIANBkAFqIAEgBEEBIANBxAFqEEIgASAANgJ4AkAgAygCkAFBE0cNACADIAMoApQBNgI8IANBEzYCOAwCCyADIAMpA7gBNwNgIAMgAykDsAE3A1ggAyADKQOoATcDUCADIAMpA6ABNwNIIAMgAykDmAE3A0AgAyADKQOQATcDOAwBCyADIAk2ApwBIAMgCDYCmAEgAyAHNgKUASADIAE2ApABIANBOGogASAGEOMDCyADKAI8IQggAygCOCIJQRNGDQMgAyAFKQMgNwOIASADIAUpAxg3A4ABIAMgBSkDEDcDeCADIAUpAwg3A3AgAyAFKQMANwNoAkAgAigCCCIHIAIoAgBHDQAgAhC5GgsgAigCBCAHQTBsaiIAIAMpA4gBNwMoIAAgAykDgAE3AyAgACADKQN4NwMYIAAgAykDcDcDECAAIAMpA2g3AwggACAINgIEIAAgCTYCACACIAdBAWo2AgggAS0AuAEiAEGjAUcNAAwCCwsgAyAEOgADAkAgAS0AuAEiAEGjAUYNACADQcAAaiEFIANBlAFqIQoDQCAAQf8BcSIIIARGDQIgASgCsAEhBgJAAkAgCEEYRg0AQQAhB0EEIQhBACEJDAELIANBkAFqIAFBARDdASADKAKUASEIIAMoApABIgdBgICAgHhGDQQgAygCmAEhCSABLQC4ASEACwJAAkACQCAAQf8BcUGof2oOCAEAAAAAAAABAAsgASABKAJ4IgBB///7/35xQYCAgIABcjYCeCADIAk2AswBIAMgCDYCyAEgAyAHNgLEASADQZABaiABIAZBASADQcQBahBCIAEgADYCeAJAIAMoApABQRNHDQAgAyADKAKUATYCPCADQRM2AjgMAgsgAyADKQO4ATcDYCADIAMpA7ABNwNYIAMgAykDqAE3A1AgAyADKQOgATcDSCADIAMpA5gBNwNAIAMgAykDkAE3AzgMAQsgAyAJNgKcASADIAg2ApgBIAMgBzYClAEgAyABNgKQASADQThqIAEgChDjAwsgAygCPCEIIAMoAjgiCUETRg0DIAMgBSkDIDcDMCADIAUpAxg3AyggAyAFKQMQNwMgIAMgBSkDCDcDGCADIAUpAwA3AxACQCACKAIIIgcgAigCAEcNACACELkaCyACKAIEIAdBMGxqIgAgAykDMDcDKCAAIAMpAyg3AyAgACADKQMgNwMYIAAgAykDGDcDECAAIAMpAxA3AwggACAINgIEIAAgCTYCACACIAdBAWo2AgggAS0AuAEiAEGjAUcNAAsLIANBBGpBowEQxiUgASgCtAEhAiABKAKwASEAIANBjwKtQiCGIANBA2qthDcDOCADQZABakHNlYABIANBOGoQrxAgAyADKQIENwKcASADIAMoAgw2AqQBIAEgACACIANBkAFqEOodC0EAIQgLIANB0AFqJAAgCAvPCQINfwF+IwBB0ABrIgMkACACLQA9IQQgAi0AQCEFIAItAD8hBiACKAIwIQcgAi0APiEIIAItADwhCSABKAJ4IQogAigCICELIAItAEEhDCADIAItAEIiDToATyADIAw6AE4gAyALNgJIIAJBJGohDiAKQf/8729xIQ8CQAJAIAwNAAJAIA1BAXENACABIA9BgICAEHI2AnggAyAOKAIINgIoIAMgDikCADcDICADIANByABqNgI0IAMgA0HOAGo2AjAgAyADQc8AajYCLCADQRhqIANBIGogARDMAiADKAIcIQwgAygCGCEODAILIAEgD0GAgoAQcjYCeCADIA4oAgg2AiggAyAOKQIANwMgIAMgA0HIAGo2AjQgAyADQc4AajYCMCADIANBzwBqNgIsIANBEGogA0EgaiABEMwCIAMoAhQhDCADKAIQIQ4MAQsCQCANQQFxDQAgASAKQf/8729xQYCBgBByNgJ4IAMgDigCCDYCKCADIA4pAgA3AyAgAyADQcgAajYCNCADIANBzgBqNgIwIAMgA0HPAGo2AiwgA0EIaiADQSBqIAEQzAIgAygCDCEMIAMoAgghDgwBCyABIA9BgIOAEHI2AnggAyAOKAIINgIoIAMgDikCADcDICADIANByABqNgI0IAMgA0HOAGo2AjAgAyADQc8AajYCLCADIANBIGogARDMAiADKAIEIQwgAygCACEOCyABIAo2AngCQAJAAkACQAJAIA5BAUcNACAAQQ02AgAgACAMNgIEIAIoAgBBBUcNASACKQMIIhBCA4NCAFINBCAQpyICIAIoAgAiAEF/ajYCACAAQQFHDQQgAiACKAIQEOweDAQLAkACQCAEDgMEAAEECyABLQCBAUEgcUUNAyABLQCEAUH/AXENAwwCCyABLQCBAUEgcUUNAiABLQCEAUH/AXFFDQEMAgsgAhDLDgwCCyACQQhBECACKAIAQX5qQQNJIgobaigCACEOIAJBDEEUIAobaigCACEKIANBgYGAgHg2AiAgASAOIAogA0EgahDqHQsCQAJAAkAgAigCAEEFRg0AIAEoAqwBIQogCEEBcQ0BDAILIAJBCGohCiABKAKsASEOIAIoAhQhAgJAIAlB/wFxQQNGDQAgA0G2gYCAeDYCICABIAsgAiALIAJJGyALIAIgCyACSxsgA0EgahDqHQsgAEEGNgIAIAAgBToAKSAAIAY6ACggACAIOgAnIAAgBDoAJSAAIAk6ACQgACAMNgIgIAAgDjYCHCAAIAs2AhggACACNgIUIAAgB0EBRjoAJiADIAopAgA3AiQgACADKQIgNwIEIAMgCigCCDYCLCAAIAMpAig3AgwMAgsgDCgCGEGAgICAeEYNACADQaKBgIB4NgIgIAEgCyAKIANBIGoQ6h0LIABBBTYCACADIAIpAgA3AiQgACADKQIgNwIEIAMgAikCCDcCLCAAIAMpAig3AgwgAyACKQIQNwI0IAAgAykCMDcCFCADIAIpAhg3AjwgACADKQI4NwIcIAAgAygCQDYCJCAAIAk6ADkgACAEOgA4IAAgBToANyAAIAY6ADYgACAIOgA1IAAgB0EBRjoANCAAIAw2AjAgACAKNgIsIAAgCzYCKAsgA0HQAGokAAvJCAEHfwJAIAEgACgCCCIDSw0AQQEPCyABIANrIQQgA0EwbCEFIAIoAgQhBiACKAIMIQcDQAJAIAYiASAHRw0AQQAPCyACIAFBBGoiBjYCBAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgAiAygCACIBQXRqQQcgAUELSxsOJiwAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkLAsgA0EUaiEBIANBEGohCAwsCyADQRRqIQEgA0EQaiEIDCsLIAMoAiAiCEE0aiEBIAhBMGohCAwqCyADQQxqIQEgA0EIaiEIDCkLIANBCGohASADQQRqIQgMKAsgA0EQaiEBIANBDGohCAwnCyADQTRqIQEgA0EwaiEIDCYLIANBJGohASADQSBqIQgMJQsgA0EkaiEBIANBIGohCAwkCyADQRRqIQEgA0EQaiEIDCMLIANBIGohASADQRxqIQgMIgsgA0EYaiEBIANBFGohCAwhCyADQRRqIQEgA0EQaiEIDCALIANBFGohASADQRBqIQgMHwsgAygCCA4HFhcYGRobHBYLIANBIGohASADQRxqIQgMHQsgA0EQaiEBIANBDGohCAwcCyADQRhqIQEgA0EUaiEIDBsLIAMoAiAiCEEoaiEBIAhBJGohCAwaCyADQQhqIQEgA0EEaiEIDBkLIANBCGohASADQQRqIQgMGAsgA0EMaiEBIANBCGohCAwXCyADQQxqIQEgA0EIaiEIDBYLIANBHGohASADQRhqIQgMFQsgA0EsaiEBIANBKGohCAwUCyADQQhqIQEgA0EEaiEIDBMLIAMoAgQiCEEEaiEBDBILIANBFGohASADQRBqIQgMEQsgA0EQaiEBIANBDGohCAwQCyADQQxqIQEgA0EIaiEIDA8LIANBDGohASADQQhqIQgMDgsgA0EQaiEBIANBDGohCAwNCyADQRBqIQEgA0EMaiEIDAwLIANBEGohASADQQxqIQgMCwsgA0EUaiEBIANBEGohCAwKCyADQQxqIQEgA0EIaiEIDAkLIANBCGohASADQQRqIQgMCAsgA0EcaiEBIANBGGohCAwHCyADQRBqIQEgA0EMaiEIDAYLIANBEGohASADQQxqIQgMBQsgA0EUaiEBIANBEGohCAwECyADQRRqIQEgA0EQaiEIDAMLIANBJGohASADQSBqIQgMAgsgA0EkaiEBIANBIGohCAwBCyADQQhqIQEgA0EEaiEICyAIKAIAIQggASgCACEJIAAoAgQgBWoiAUESNgIAIAFBDGogCTYCACABQQhqIAg2AgAgAUEEaiADNgIAIAAgACgCCEEBajYCCCAFQTBqIQUgBEF/aiIEDQALQQELgQkBBX8jAEEwayICJAAgACgCACIDQQRqKAIAIQACQAJAAkACQAJAAkACQAJAIAMoAgAiA0F3akEFSQ0AIANB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CkEIahDFBUEoEIoBIgxFDQUgA0EwaiAKQShqKAIAEIwDIAwgAykDUDcDICAMIAMpA0g3AxggDCADKQNANwMQIAwgAykDODcDCCAMIAMpAzA3AwAgAygCECENIAMoAhQhDiADKAIYIQ8gAygCHCEQIAMoAiAhESADKAIkIRIgAygCKCETIAMtACwhFCADIActAAI6AA4gAyAHLwAAOwEMDAILIApBIGooAgAhEyAKQRxqKAIAIRIgCkEYaigCACERIApBDGooAgAhDiAKQQhqKAIAIQ0CQCAKQRBqKQMAIhpCA4NCAFINACAapyIMIAwoAgAiDEEBajYCACAMQX9MDQYLIApBJGotAAAhFEEAIRVBACEMAkAgCkEoaigCACIPRQ0AQQwQigEiDEUNByAPKAIIIRYgDygCBCEXQeAAEIoBIhBFDQggA0EwaiAPKAIAEG8gECADQTBqQeAA/AoAACAMIBY2AgggDCAXNgIEIAwgEDYCAAsCQCAKQTBqKAIAIgpFDQBBwAAQigEiFUUNDCADQTBqIAoQTiAVIAMpA2g3AzggFSADKQNgNwMwIBUgAykDWDcDKCAVIAMpA1A3AyAgFSADKQNINwMYIBUgAykDQDcDECAVIAMpAzg3AwggFSADKQMwNwMACyAaQiCIpyEQIBqnIQ8MAQsgCkEUaigCACEQIApBEGooAgAhDyAKQQxqKAIAIQ4gCkEIaigCACENQSgQigEiGEUNByADQTBqIApBBGooAgAQjAMgGCADKQNQNwMgIBggAykDSDcDGCAYIAMpA0A3AxAgGCADKQM4NwMIIBggAykDMDcDAAJAIApBGGooAgAiCg0AQQAhEQwBC0EMEIoBIhFFDQggCigCCCEXIAooAgQhGUHgABCKASIWRQ0JIANBMGogCigCABBvIBYgA0EwakHgAPwKAAAgESAXNgIIIBEgGTYCBCARIBY2AgALIAUgCGoiCiALNgIAIApBJGogFDoAACAKQSBqIBM2AgAgCkEcaiASNgIAIApBGGogETYCACAKQRRqIBA2AgAgCkEQaiAPNgIAIApBDGogDjYCACAKQQhqIA02AgAgCkEEaiAYNgIAIApBJWogAy8BDDsAACAKQSdqIAMtAA46AAAgCkEwaiAVNgIAIApBKGogDDYCACAIQThqIQggCUF/aiIJDQALCyAAIAI2Aggg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NgIUIAsgDTYCECALIBE3AwggC0EaNgIAIAJBEGogASALQQEQQyACKAIUIQsCQCACKAIQQQFxRQ0AIAshDQwECwJAAkAgCygCACINQXRqQQcgDUELSxtBeGoiDkEZSw0AQQEgDnRBwYCAEHENAQsgASgCrAEhDSACQbKBgIB4NgI4IAEgDCANIAJBOGoQ6h0gCygCACENCwJAAkAgDUEtRg0AAkAgAS0AuAFBEkYNACABKAKsASEPQQAhDQwCCyACQQhqIAEQrQMgAigCDCENAkAgAigCCEEBRw0AAkAgCygCAEEtRg0AIAsQjAILIAtBwABBCBDUFAwGCwJAAkAgASgCiAEiDkELRw0AIAJBOGogARDGAQwBCyABQQs2AogBIAIgBikCADcDOCACIAYoAgg2AkACQCABKAIIQQpGDQAgBRC8CwsgBSAONgIAIAQgBykCADcCACAEIAcoAgg2AggLIAEgASgCtAEiDzYCrAEgASABKAKwATYCqAEgCCACKQM4NwIAIAggAigCQDYCCAwBCyALKAIIIQ0gCygCBCEOIAsoAhAhDyALKAIMIQwgC0HAAEEIENQUIA4hCwsCQCAKIAIoAhhHDQAgAkEYahC8GiACKAIcIQkLIAkgA2oiDiANNgIAIA5BfGogDzYCACAOQXhqIAw2AgAgDkF0aiALNgIAIAIgCkEBaiIKNgIgAkAgAS0AuAEiC0EHRg0AIAtBAkYNAiALQdkARg0CIAtBgQFGDQIgASgCtAEhDSABKAKwASEOIAJBJGogCxDGJSACIBBB/OOaAa2ENwMwIAJBOGpBzZWAASACQTBqEM0IIAIgAikCJDcCRCACIAIoAiw2AkwgDiANIAJBOGoQwBshDSABLQC4AUGiAUcNBCABEMQUIQsgARCyECABIAsQkwkMBAsCQAJAIAEoAogBIgtBC0cNACACQThqIAEQxgEMAQsgAUELNgKIASACIAYpAgA3AzggAiAGKAIINgJAAkAgASgCCEEKRg0AIAUQvAsLIAUgCzYCACAEIAcpAgA3AgAgBCAHKAIINgIICyABKQOwASERIAggAikDODcCACAIIAIoAkA2AgggASARNwOoASADQRBqIQMMAAsLIAAgAigCIDYCCCAAIAIpAhg3AgAMAgtBCEHAABCgJAALIABBgICAgHg2AgAgACANNgIEIAIoAhwiASAKEJ0PIAIoAhggARDzIwsgAkHQAGokAAuoCAINfwF+IwBB4ABrIgMkAAJAAkACQAJAAkACQCABKAIAIgQoAkANAEEAIQUgBEEANgJMIARBfzYCQCADIAQpAlA3AwAgAyAEKAJYNgIIIARB0ABqIQYgBEHEAGohByACQf8BcUECdCgCwOGcASEIA0ACQCAFRQ0AIAEQ+B4NACADIAYoAggiCTYCJCADIAYpAgAiEDcCHCADIBA3AxAgAyAJNgIYIANBCjYCLCAAIAEoAgQgASgCCCADQRBqIANBLGoQ3A4MBwsCQCABEJsKIglBUGpBCkkNACAJQb9/akEGSQ0AIAlBn39qQQZJDQAgA0EQaiABEI8OIANBCTYCLCAAIAEoAgQgASgCCCADQRBqIANBLGoQ3A4MBwsCQAJAIAEQmwoiCUGAAUkiCkUNAEEBIQsMAQsCQCAJQYAQTw0AQQIhCwwBC0EDQQQgCUGAgARJGyELCyAEKAJMIgwhDQJAIAsgBygCACAMa00NACAHIAwgC0EBQQEQ7RogBCgCTCENCyAEKAJIIA1qIQ0CQAJAIAoNACAJQT9xQYB/ciEKIAlBBnYhDgJAIAlBgBBPDQAgDSAKOgABIA0gDkHAAXI6AAAMAgsgCUEMdiEPIA5BP3FBgH9yIQ4CQCAJQf//A0sNACANIAo6AAIgDSAOOgABIA0gD0HgAXI6AAAMAgsgDSAKOgADIA0gDjoAAiANIA9BP3FBgH9yOgABIA0gCUESdkFwcjoAAAwBCyANIAk6AAALIAQgCyAMajYCTCAIIAVBAWoiBUcNAAsgARD4HhogBCgCSCEJIAQoAkwiBQ4CBAIBC0HU3IkBEIEeAAsgCS0AACELDAELIAktAAAiC0FVag4DAQABAAsgCSALQf8BcUErRiILaiEJAkACQAJAIAUgC2siC0EJSQ0AQQAhDANAIAtFDQIgDEH/////AEsNBCAJLQAAIgVBv39qQV9xQQpqIAVBUGogBUE5SxsiBUEPSw0EIAlBAWohCSALQX9qIQsgBSAMQQR0aiIMIAVPDQAMBAsLQQAhDCALRQ0BA0AgCS0AACIFQb9/akFfcUEKaiAFQVBqIAVBOUsbIgVBD0sNAyAJQQFqIQkgBSAMQQR0ciEMIAtBf2oiCw0ACwsgDEGAsANzQYCAvH9qQYCQvH9JDQELIAAgDDYCBCAAIAMpAwAiEDcCCCAAIAI6ACEgAEEEOgAgIAMgAygCCDYCUCADIAYpAgA3AlQgACADKQNQNwIQIAMgBigCCDYCXCAAIAMpA1g3AhggAyAQNwNIIABBIjYCAAwBCyADIAMoAgg2AhggAyADKQMANwMQIAMgBikCADcCHCADIAYoAgg2AiQgA0EINgIsIAAgASgCBCABKAIIIANBEGogA0EsahDcDgsgBCAEKAJAQQFqNgJAIANB4ABqJAAL0AgCBH8BfgJAAkACQAJAAkACQAJAAkACQEEAIAAoAgAiAUF8aiICIAIgAUsbDggBAgMEBQYHCAALAkACQCAAKAIIIgFBBUcNACAAKQMQIgVCA4NCAFINASAFpyIBIAEoAgAiAkF/ajYCACACQQFHDQEgASABKAIQEOweDAELAkACQAJAAkACQCABDgQBAgMEAAsgACkDGCAAKAIgEMgWDAQLIAApAxAQlB0MAwsgAEEQahCtEgwCCyAAKQMgEPgbDAELIABBDGoQjiILAkAgACgCPCIBRQ0AIAEQnAEgAUHAAEEIENQUCwJAIAAoAkAiAUUNACABKAIAIgIQ3wIgAkHgAEEIENQUIAFBDEEEENQUCyAAKAI0IQMCQCAAKAI4IgJFDQAgAyEBA0AgASgCACIEEJwBIARBwABBCBDUFCABQQxqIQEgAkF/aiICDQALCyAAKAIwIANBBEEMEM8TDwsgABDKDiAAKAJEIQQCQCAAKAJIIgJFDQAgBCEBA0AgARCuCiABQcAAaiEBIAJBf2oiAg0ACwsgACgCQCAEQQhBwAAQzxMgACgCICICQYCAgIB4Rg0FIAAoAiQhBAJAIAAoAigiAEUNACAEIQEDQCABEIcDIAFBMGohASAAQX9qIgANAAsLIAIgBEEIQTAQzxMPCyAAQQhqEMoOIABBMGoQoQcPCwJAIAApAwgiBUIDg0IAUg0AIAWnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQ7B4LIABBIGoQoQcPCyAAQQhqEMoOAkAgACgCPCIBRQ0AIAEQnAEgAUHAAEEIENQUCwJAIAAoAkAiAUUNACABKAIAIgIQ3wIgAkHgAEEIENQUIAFBDEEEENQUCyAAKAI0IQMCQCAAKAI4IgJFDQAgAyEBA0AgASgCACIEEJwBIARBwABBCBDUFCABQQxqIQEgAkF/aiICDQALCyAAKAIwIANBBEEMEM8TDwsCQCAAKQMIIgVCA4NCAFINACAFpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOweCwJAIAAoAiQiAUUNACABEJwBIAFBwABBCBDUFAsCQCAAKAIoIgFFDQAgASgCACICEN8CIAJB4ABBCBDUFCABQQxBBBDUFAsgACgCMCEDAkAgACgCNCICRQ0AIAMhAQNAIAEoAgAiBBCcASAEQcAAQQgQ1BQgAUEMaiEBIAJBf2oiAg0ACwsgACgCLCADQQRBDBDPEw8LIAAoAgghBAJAIAAoAgwiAkUNACAEIQEDQCABEIMLIAFBKGohASACQX9qIgINAAsLIAAoAgQgBEEIQSgQzxMgACgCECIBRQ0AIAEoAgAiABDfAiAAQeAAQQgQ1BQgAUEMQQQQ1BQLDwsgACgCCCEEAkAgACgCDCICRQ0AIAQhAQNAIAEQhwMgAUEwaiEBIAJBf2oiAg0ACwsgACgCBCAEQQhBMBDPEwvuBwEDfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgwiAigCACIDQXRqQQcgA0ELSxsOJgABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlAAsgAkEIaiEDIAJBBGohBAwsCyACQRRqIQMgAkEQaiEEDCsLIAJBFGohAyACQRBqIQQMKgsgAigCICICQTRqIQMgAkEwaiEEDCkLIAJBDGohAyACQQhqIQQMKAsgAkEIaiEDIAJBBGohBAwnCyACQRBqIQMgAkEMaiEEDCYLIAJBNGohAyACQTBqIQQMJQsgAkEkaiEDIAJBIGohBAwkCyACQSRqIQMgAkEgaiEEDCMLIAJBFGohAyACQRBqIQQMIgsgAkEgaiEDIAJBHGohBAwhCyACQRhqIQMgAkEUaiEEDCALIAJBFGohAyACQRBqIQQMHwsgAkEUaiEDIAJBEGohBAweCyACKAIIDgcWFxgZGhscFgsgAkEgaiEDIAJBHGohBAwcCyACQRBqIQMgAkEMaiEEDBsLIAJBGGohAyACQRRqIQQMGgsgAigCICICQShqIQMgAkEkaiEEDBkLIAJBCGohAyACQQRqIQQMGAsgAkEIaiEDIAJBBGohBAwXCyACQQxqIQMgAkEIaiEEDBYLIAJBDGohAyACQQhqIQQMFQsgAkEcaiEDIAJBGGohBAwUCyACQSxqIQMgAkEoaiEEDBMLIAJBCGohAyACQQRqIQQMEgsgAigCBCIEQQRqIQMMEQsgAkEUaiEDIAJBEGohBAwQCyACQRBqIQMgAkEMaiEEDA8LIAJBDGohAyACQQhqIQQMDgsgAkEMaiEDIAJBCGohBAwNCyACQRBqIQMgAkEMaiEEDAwLIAJBEGohAyACQQxqIQQMCwsgAkEQaiEDIAJBDGohBAwKCyACQRRqIQMgAkEQaiEEDAkLIAJBDGohAyACQQhqIQQMCAsgAkEIaiEDIAJBBGohBAwHCyACQRxqIQMgAkEYaiEEDAYLIAJBEGohAyACQQxqIQQMBQsgAkEQaiEDIAJBDGohBAwECyACQRRqIQMgAkEQaiEEDAMLIAJBFGohAyACQRBqIQQMAgsgAkEkaiEDIAJBIGohBAwBCyACQSRqIQMgAkEgaiEECyADKAIAIQICQAJAIAEoAgBBAUYNACAEKAIAIQEMAQsgASgCBCIDIAIgAyACSRshASADIAIgAyACSxshAgsgACACNgIEIAAgATYCAAuvCQIFfwF+IwBBkAFrIgIkAAJAAkACQCABLQC4ASIDQf4ARw0AAkACQCABKAKIASIDQQtHDQAgAkHQAGogARDGAQwBCyABQQs2AogBIAIgASkCmAE3A1AgAiABKAKgATYCWCABQYwBaiEEAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgAzYCCCABIAQpAgA3AgwgASAEKAIINgIUCyABIAIoAlg2ArgBIAEgASkDsAE3A6gBIAEgAikDUDcCsAEgAS0AuAEiA0HAAEYNASACQdAAakEEciADEMYlIAJBEDYCZCACQfmBmwE2AmAgAkGwgICAeDYCUCABKAKwASABKAK0ASACQdAAahDAGyEDAkAgAS0AuAFBogFHDQAgASABEIUOEJMJCyAAQQA2AgAgACADNgIEDAILIAEoArQBIQQgASgCsAEhBSACQQxqIAMQxiUgAkGPAq1CIIZBioKbAa2ENwMYIAJB0ABqQc2VgAEgAkEYahDNCCACIAIpAgw3AlwgAiACKAIUNgJkIAUgBCACQdAAahDAGyEDAkAgAS0AuAFBogFHDQAgASABEIUOEJMJCyAAQQA2AgAgACADNgIEDAELIAJB0ABqIAEQlQoCQAJAQRgQigEiA0UNACADIAIpA2A3AxAgAyACKQNYNwMIIAMgAikDUDcDAEEAIQQCQCABLQC5AQ0AIAFBsAFqIQUCQAJAAkAgAS0AuAFBkH9qDggBAwMDAwMDAAMLAkACQCABKAKIASIEQQtHDQAgAkHQAGogARDGAQwBCyABQQs2AogBIAIgASkCmAE3A1AgAiABKAKgATYCWCABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBDYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABKQOwASEHIAUgAikDUDcCACAFIAIoAlg2AgggASAHNwOoAQwBCwJAAkAgASgCiAEiBEELRw0AIAJB0ABqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwNQIAIgASgCoAE2AlggAUGMAWohBgJAIAEoAghBCkYNACABQQhqELwLCyABIAQ2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhByAFIAIpA1A3AgAgBSACKAJYNgIIIAEgBzcDqAELIAEgASgCeCIEQf//e3E2AnggAkHQAGogARCVASABIAQ2AnggAigCVCEFAkAgAigCUCIEQTJHDQAgAEEANgIAIAAgBTYCBAwDCyACIAIpA4gBNwNIIAIgAikDgAE3A0AgAiACKQN4NwM4IAIgAikDcDcDMCACIAIpA2g3AyggAiACKQNgNwMgIAIgAikDWDcDGAJAAkAgBEEORw0AQRQQigEiBA0BQQRBFBCgJAALQYjzmgFBKEHYgpsBELchAAsgBCAFNgIAIAQgAikDGDcCBCAEIAIpAyA3AgwLAkAgARCJCSIBRQ0AIABBADYCACAAIAE2AgQgBEUNAiAEELgVIAQoAgAgBEEEaigCABD6IyAEQRRBBBDUFAwCCyAAIAQ2AgQgACADNgIADAILQQhBGBCgJAALIAMQrhIgA0EYQQgQ1BQLIAJBkAFqJAALlQkCBn8BfiMAQfAAayICJAACQCABLQCBAUEgcUUNACABKAK0ASEDIAEoArABIQQgAkGsgYCAeDYCICABIAQgAyACQSBqEOodCyABKAK0ASEDIAEoArABIQQgAkHKgICAeDYCICABIAQgAyACQSBqEIcTIAFBsAFqIQMgASgCsAEhBQJAAkAgASgCiAEiBEELRw0AIAJBIGogARDGAQwBCyABQQs2AogBIAIgASkCmAE3AyAgAiABKAKgATYCKCABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBDYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABKQOwASEIIAMgAikDIDcCACADIAIoAig2AgggASAINwOoAQJAAkACQCABLQC4ASIEDQACQAJAIAEoAogBIgRBC0cNACACQSBqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwMgIAIgASgCoAE2AiggAUGMAWohBgJAIAEoAghBCkYNACABQQhqELwLCyABIAQ2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhCCADIAIpAyA3AgAgAyACKAIoNgIIIAEgCDcDqAEgASABKAJ4IgRBwAByNgJ4IAIgARC4AyACKAIAIQYgASAENgJ4IAIoAgQhBCAGQQFxRQ0BIABBEzYCACAAIAQ2AgQMAgsgASgCtAEhAyABKAKwASEGIAJBCGogBBDGJSACQY8CrUIghkGftoEBrYQ3AzggAkEgakHNlYABIAJBOGoQzQggAiACKQIINwIsIAIgAigCEDYCNCAGIAMgAkEgahDAGyEDAkAgAS0AuAFBogFHDQAgASABEIUOEJMJCyAAQRM2AgAgACADNgIEDAELAkACQAJAIAEtALgBIgZBAUcNAAJAAkAgASgCiAEiBkELRw0AIAJBIGogARDGAQwBCyABQQs2AogBIAIgASkCmAE3AyAgAiABKAKgATYCKCABQYwBaiEHAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBjYCCCABIAcpAgA3AgwgASAHKAIINgIUCyABKQOwASEIIAMgAikDIDcCACADIAIoAig2AgggASAINwOoASABIAEoAngiA0H//9//fXFBgIAgcjYCeCACQcAAaiABEI0KIAEgAzYCeCACKAJAQRNHDQIgAigCRCEDDAELIAEoArQBIQMgASgCsAEhBSACQRRqIAYQxiUgAkGPAq1CIIZBkvCaAa2ENwM4IAJBIGpBzZWAASACQThqEM0IIAIgAikCFDcCLCACIAIoAhw2AjQgBSADIAJBIGoQwBshAyAB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QCAAIAEQ1QIgAEHYAGohACADQah/aiIDDQALCyACKAIwIgBFDQUgACABEKYBDwsgAEEANgIYAkAgACgCICIEQQhqKAIAIgBFDQAgBEEEaigCACICIABBBnRqIQUDQAJAIAJBOGooAgAiAEUNACAAQQxsIQMgAkE0aigCACEAA0AgACgCACABEKYBIABBDGohACADQXRqIgMNAAsLIAIgARDbCyACQcAAaiIAIQIgACAFRw0ACwsCQCAEQRRqKAIAIgBFDQAgAEEMbCEDIARBEGooAgAhAANAIAAoAgAgARCmASAAQQxqIQAgA0F0aiIDDQALCyAEKAIYQYCAgIB4Rg0EIARBIGooAgAiAEUNBCAAQTBsIQMgBEEcaigCACEAA0AgACABEMADIABBMGohACADQVBqIgMNAAwFCwsgACgCBCIAQQhqKAIAIgNFDQMgAEEEaigCACIAIANBOGxqIQIDQCAAIAEQqAoCQCAAQTBqKAIAIgNFDQAgAyABEKYBCyAAQThqIgAgAkcNAAwECwsgACgCBCIAQQhqKAIAIgNFDQIgAEEEaigCACIAIANBOGxqIQIDQCAAIAEQqAoCQCAAQTBqKAIAIgNFDQAgAyABEKYBCyAAQThqIgAgAkcNAAwDCwsgACgCBCIAQQA2AhAgAEEoaigCACIDRQ0BIABBJGooAgAiACADQTBsaiECA0ACQCAAKAIADQAgAEEYakEANgIACwJAIABBKGooAgAiA0UNACADIAEQpgELIABBMGoiACACRw0ADAILCwJAIAAoAgQiACgCAA0AIABBADYCGAsgAC0ARSIDQQNGDQACQCADQQJGDQAgAEEANgI4AkAgACgCQCIALQAlQQJGDQAgAEEANgIYIABBIGogARDIEQ8LIABBCGooAgAiA0UNASADQThsIQMgAEEEaigCACEAA0ACQAJAIAAoAgBBCUcNACAAQQhqIAEQwAMMAQsgACABEIsECyAAQThqIQAgA0FIaiIDDQAMAgsLIABBKGooAgAiA0UNACADQThsIQMgAEEkaigCACEAA0ACQAJAIAAoAgBBCUcNACAAQQhqIAEQwAMMAQsgACABEIsECyAAQThqIQAgA0FIaiIDDQALCwvrBwILfwN+IwBBwABrIgIkACACIAE2AgwgACgCDCEDIAIgAkEMajYCEAJAIANBAWoiAUUN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AWoQ8R0MAgsCQAJAAkAgBkH/AXEiBkHYAEYNACAGQd8ARw0BCyADIAg2AqQBIAMgADYCoAEgAyAHNgKcASADIAE2ApgBIANBOGogASAJEKQcDAELIAMgCDYC1AEgAyAANgLQASADIAc2AswBIAMgA0GTAWo2AtwBIAMgA0GUAWo2AtgBIANBmAFqIAEgA0HMAWoQ8x0CQCADKAKYAUETRw0AIAMgAygCnAE2AjwgA0ETNgI4DAELIANBOGogA0GYAWpBMPwKAAALIAMoAjwhACADKAI4IghBE0YNAiADQRBqIAVBKPwKAAACQCACKAIIIgYgAigCAEcNACACELkaCyACKAIEIAZBMGxqIgcgADYCBCAHIAg2AgAgB0EIaiADQRBqQSj8CgAAIAIgBkEBajYCCAwACwtBACEACyADQeABaiQAIAALoggDB38CfgF8IwBB4ABrIgIkACABKALAASEDAkACQAJAAkACQAJAAkACQAJAAkACQCABLQDIASIEQUBqDgMDAAECCyABKALEASEEIAEQmBQhCyABEOURIAJBEGogASADIAQQzBogASgCvAEhBSACKAIQIAIoAhQQhhkiCUKAgICAcIMhCiAJpyEGQQIhAQwECyABKALEASEEIAEQ0RQhBiABEOURIAJBGGogASADIAQQzBogASgCvAEhBSACKAIYIAIoAhwQhhm/IQtBBCEBQgAhCgwDCyAEEOYTDQECQCAEQQRGDQAgAkHIAGpBBHIgBBDXJSACQcUANgJcIAJBvIqbATYCWCACQbCAgIB4NgJIIAEoAsABIAEoAsQBIAJByABqEMAbIQMCQCABLQDIAUGiAUcNACABIAEQnyMQhhQLIABBBTYCACAAIAM2AgQMCAsgARDlESABKALAASEHIAJBCGogAUHAABCsGCACKAIMIQQCQCACKAIIQQFxDQAgAiAENgIkIAEtAIEBQSBxRQ0FIAEtAMgBIgVBB0cNBkEEQQQQ6CAiCCAENgIAIAIgCDYCLCACQQE2AihBBCEFQQEhBANAIAIgBDYCMAJAIAEtAMgBQQdGDQAgASgCvAEhBCACQZWBgIB4NgJIIAEgByAEIAJByABqEPEdIAEoArwBIQVBCEHAABDoICIEQRk2AgAgBCAFNgIUIAQgBzYCECAEIAIpAig3AgQgBCACKAIwNgIMIAIgBDYCJAwHCyABEOURIAIgAUHAABCsGCACKAIEIQYgAigCAEEBcQ0FAkAgBCACKAIoRw0AIAJBKGoQsxogAigCLCEICyAIIAVqIAY2AgAgBUEEaiEFIARBAWohBAwACwsgAEEFNgIAIAAgBDYCBAwHCyACQcgAaiABEMIVIAIpA1giCUKAgICAcIMhCiACKwNQIQsgAigCTCEFIAIoAkghAyAJpyEGQQEhAQwBCyABEPMXIgpCIIinIQUgATUCvAFCIIYgA62EvyELIAqnIQNBACEBQgAhCgsMAwsgAEEFNgIAIAAgBjYCBCACQShqEKIhDAMLIAEtAMgBIQULAkAgBUH/AXFBBUYNACABKALEASEDIAEoAsABIQQgAkE0aiAFENclIAJBjwKtQiCGQfvjmgGthDcDQCACQcgAakHNlYABIAJBwABqEIUfIAIgAikCNDcCVCACIAIoAjw2AlwgBCADIAJByABqEMAbIQMCQCABLQDIAUGiAUcNACABIAEQnyMQhhQLIABBBTYCACAAIAM2AgQgAkEkahC5IgwCCyABEOURIAEoArwBIQVBAyEBQgAhCgsgACALOQMQIAAgBTYCDCAAIAM2AgggACAENgIEIAAgATYCACAAIAogBq2ENwMYCyACQeAAaiQAC7MIAgZ/AX4jAEHwAGsiAiQAIAFBsAFqIQMgASgCsAEhBAJAAkAgASgCiAEiBUELRw0AIAJBIGogARDGAQwBCyABQQs2AogBIAIgASkCmAE3AyAgAiABKAKgATYCKCABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBTYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABKQOwASEIIAMgAikDIDcCACADIAIoAig2AgggASAINwOoAQJAAkACQCABLQC4ASIFDQACQAJAIAEoAogBIgVBC0cNACACQSBqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwMgIAIgASgCoAE2AiggAUGMAWohBgJAIAEoAghBCkYNACABQQhqELwLCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhCCADIAIpAyA3AgAgAyACKAIoNgIIIAEgCDcDqAEgASABKAJ4IgVBwAByNgJ4IAIgARC4AyACKAIAIQYgASAFNgJ4IAIoAgQhBSAGQQFxRQ0BIABBEzYCACAAIAU2AgQMAgsgASgCtAEhAyABKAKwASEGIAJBCGogBRDGJSACQY8CrUIghkGftoEBrYQ3AzggAkEgakHNlYABIAJBOGoQzQggAiACKQIINwIsIAIgAigCEDYCNCAGIAMgAkEgahDAGyEDAkAgAS0AuAFBogFHDQAgASABEIUOEJMJCyAAQRM2AgAgACADNgIEDAELAkACQAJAIAEtALgBIgZBAUcNAAJAAkAgASgCiAEiBkELRw0AIAJBIGogARDGAQwBCyABQQs2AogBIAIgASkCmAE3AyAgAiABKAKgATYCKCABQYwBaiEHAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBjYCCCABIAcpAgA3AgwgASAHKAIINgIUCyABKQOwASEIIAMgAikDIDcCACADIAIoAig2AgggASAINwOoASABIAEoAngiA0H/5///fXFBgBhyNgJ4IAJBwABqIAEQjQogASADNgJ4IAIoAkBBE0cNAiACKAJEIQMMAQsgASgCtAEhAyABKAKwASEEIAJBFGogBhDGJSACQY8CrUIghkGS8JoBrYQ3AzggAkEgakHNlYABIAJBOGoQzQggAiACKQIUNwIsIAIgAigCHDYCNCAEIAMgAkEgahDAGyEDIAEtALgBQaIBRw0AIAEgARCFDhCTCQsgAEETNgIAIAAgAzYCBCAFEIwCIAVBwABBCBDUFAwBCwJAQTAQigEiAw0AQQhBMBCgJAALIAMgAikDaDcDKCADIAIpA2A3AyAgAyACKQNYNwMYIAMgAikDUDcDECADIAIpA0g3AwggAyACKQNANwMAIAAgBDYCDCAAIAM2AgggACAFNgIEIABBDDYCACAAIAEoAqwBNgIQCyACQfAAaiQAC/gHAgV/AX4jAEHgAGsiAyQAIAEoAgQhBCADQcgAaiACIAEoAgAiBUEAELUCAkACQCADLQBIQQRGDQAgAykDSCIIQv8Bg0IEUQ0AIAAgCDcCAAwBCwJAAkAgAi0AXQ0AAkACQAJAIAEpAwhQDQAgA0EgaiABQQhqIgEQjRQCQCADKAIkQQNJDQAgAi0AYkH/AXFBCE8NACADQRhqIAEQjRQgAygCGCADKAIcQd8AEO8dDQILIANBEGogARCNFCADQcgAaiACIAUgBCADKAIQIAMoAhQQ/w4gAy0ASEEERg0EIAMpA0giCEL/AYNCBFENBCAAIAg3AgAMBQsgA0HIAGogAUEQahDlEyADQThqIAIgBSAEIAMoAkwiASADKAJQEP8OIAMtADhBBEYNASADKQM4IghC/wGDQgRRDQEgACAINwIAIAMoAkggARDTJQwECyADQQhqIAEQjRQgA0HIAGogAygCCCADKAIMQd8AQQFBABDPCSADQThqIAIgBSAEIAMoAkwiASADKAJQEP8OAkAgAy0AOEEERg0AIAMpAzgiCEL/AYNCBFENACAAIAg3AgAgAygCSCABENMlDAQLIAMoAkggARDTJQwCCyADKAJIIAEQ0yUgA0HIAGogAiAFIARBgO6aAUEBEP8OIAMtAEhBBEYNASADKQNIIghC/wGDQgRRDQEgACAINwIADAILIAEoAhAhBiADQcgAahC+FSADQQI6AFQgBiADQcgAahCLFiEHIAMoAkggAygCTBCSJQJAAkAgB8BBf0oNACADQcgAahC+FSADQQA6AFQgBiADQcgAahCLFiEHIAMoAkggAygCTBCSJQJAIAfAQQFIDQAgA0EsaiABQRBqEOUTDAILIAMgBhClGCIBKAIINgJQIAMgASkCADcDSCADIAEvAA07AFUgAyABLQAPOgBXIANBAiABLQAMazoAVCADQThqIANByABqEOwJIANBAjYCXCADIANBOGo2AlggA0EsakGIgIABIANB2ABqEIUfIAMoAjggAygCPBDTJSADKAJIIAMoAkwQkiUgARCTJQwBCyADQcgAaiAGEOwJIANBAjYCPCADIANByABqNgI4IANBLGpBjoCAASADQThqEIUfIAMoAkggAygCTBDTJQsgA0HIAGogAiAFIAQgAygCMCIBIAMoAjQQ/w4CQAJAIAMtAEhBBEYNACADKQNIIghC/wGDQgRSDQELIANByABqIAIgBSAEQYDumgFBARD/DgJAIAMtAEhBBEYNACADKQNIIghC/wGDQgRSDQELIAMoAiwgARDTJQwBCyAAIAg3AgAgAygCLCABENMlDAELIABBBDoAAAsgA0HgAGokAAvBBwIDfwF+IwBBMGsiBCQAIARBHGogASgCVCABKAJYIAIQ7B0CQAJAIAQoAhxBgICAgHhGDQAgBCgCJEEYbCEFIANBAXMhBiAEKAIgIQICQANAAkACQAJAAkAgBUUNACAGIAEtAF1yIQMCQAJAIAJBEGotAABF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CGoQvAsLIAEgBjYCCCABIAcpAgA3AgwgASAHKAIINgIUCyABIAEoArQBIgY2AqwBIAEgASgCsAE2AqgBIAQgAikDaDcCACAEIAIoAnA2AggLIABBCGogAkEgakHIAPwKAAAgACAFNgJQIAAgBjYCBCAAIAM2AgAMAQsgAEEFOgA8IAAgBTYCAAsgAkGwAWokAAvgBgEEfwJAAkACQAJAAkACQAJAAkAgACgCAA4JAAECAwQFBwYHAAsgACgCHCIARQ0GIABBCGooAgAiAkUNBiACQQxsIQIgAEEEaigCACEAA0ACQAJAIAAoAgAiAw0AIABBBGooAgAgARCjBQwBCyABLQAADQAgAyABEJgBCyAAQQxqIQAgAkF0aiICDQAMBwsLIABBCGogARDyAw8LIAAoAhgNBCAAKAIcIgBFDQQgAEEIaigCACICRQ0EIAJBDGwhAiAAQQRqKAIAIQADQAJAAkAgACgCACIDDQAgAEEEaigCACABEKMFDAELIAEtAAANACADIAEQmAELIABBDGohACACQXRqIgINAAwFCwsCQAJAIAAoAggOAwABBQALAkAgACgCKCIDQQhqKAIAIgBFDQAgAS0AAEEBcQ0AIABBDGwhAiADQQRqKAIAIQADQAJAIAEtAAANACAAKAIAIAEQmAELIABBDGohACACQXRqIgINAAsLAkAgA0EUaigCACIARQ0AIABB2ABsIQIgA0EQaigCACEAA0AgACABEL0CIABB2ABqIQAgAkGof2oiAg0ACwsgAygCMCIARQ0EIAEtAABBAXENBCAAIAEQmAEPCwJAIAAoAigiBEEIaigCACICRQ0AIARBBGooAgAiACACQQZ0aiEFA0ACQCAAIgNBOGooAgAiAEUNACABLQAAQQFxDQAgAEEMbCECIANBNGooAgAhAANAAkAgAS0AAA0AIAAoAgAgARCYAQsgAEEMaiEAIAJBdGoiAg0ACwsgAyABEOgJIANBwABqIgAgBUcNAAsLIARBGGohAwJAIARBFGooAgAiAEUNACABLQAAQQFxDQAgAEEMbCECIARBEGooAgAhAANAAkAgAS0AAA0AIAAoAgAgARCYAQsgAEEMaiEAIAJBdGoiAg0ACwsgAygCAEGAgICAeEYNAyABIAMQxRgPCyABLQAADQIgACgCBCABEJgBDwsgACgCECIARQ0BIABB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AmA2AgggASALNwOoASACQdgAaiABQQAQsAggAigCXCEFAkACQAJAIAIoAlgiBkGAgICAeEcNACAAQRM2AgAgACAFNgIEDAELIAIgAikCZDcDACACIAIoAmw2AgggAigCYCEHIAEoArABIQggAkHYAGogARD6AiACKAJcIQkCQAJAAkACQCACKAJYIgpBCUcNACAAQRM2AgAgACAJNgIEDAELIAIgAikDmAE3A1AgAiACKQOQATcDSCACIAIpA4gBNwNAIAIgAikDgAE3AzggAiACKQN4NwMwIAIgAikDcDcDKCACIAIpA2g3AyAgAiACKQNgNwMYIAIgCTYCFCACIAo2AhAgAS0AuAFB2wBHDQECQAJAIAEoAogBIglBC0cNACACQdgAaiABEMYBDAELIAFBCzYCiAEgAiABKQKYATcDWCACIAEoAqABNgJgIAFBjAFqIQgCQCABKAIIQQpGDQAgAUEIahC8CwsgASAJNgIIIAEgCCkCADcCDCABIAgoAgg2AhQLIAEpA7ABIQsgAyACKQNYNwIAIAMgAigCYDYCCCABIAs3A6gBIAJB2ABqIAFBABCwCCACKAJcIQMCQCACKAJYIglBgICAgHhGDQAgAiACKQJoNwOoASACIAIpAmA3A6ABDAMLIABBEzYCACAAIAM2AgQCQAJAIApBeWoOAgECAAsgAkEQahDPCwsgAigCPCIBIAIoAkAQnx8gAigCOCABEPQjCyAFIAcQnx8gBiAFEPQjDAILQYCAgIB4IQkCQCAKQQhHDQAgAkH2gICAeDYCWCABIAggCCACQdgAahDqHQsLIAEoAqwBIQpBgAEQigEiAUUNASABIAJBEGpByAD8CgAAIAEgBzYCUCABIAU2AkwgASAGNgJIIAEgAzYCZCABIAk2AmAgASAKNgJ8IAEgBDYCeCAAIAE2AgQgAEELNgIAIAEgAikDADcCVCABIAIoAgg2AlwgASACKQOgATcDaCABIAIpA6gBNwNwCyACQbABaiQADwtBCEGAARCgJAALkAcCCn8BfiMAQeAAayIEJAAgBEEgaiABELYIIAQoAighBQJAAkACQCAEKQMgIg5CAFINAEEBIQYMAQsgBCgCLCEHAkACQAJAAkAgAS0AuAFBCEcNAAJAAkAgASgCiAEiBkELRw0AIARBIGogARDGAQwBCyABQQs2AogBIAQg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NgLQASACIAc3AtQBIAIgATYC3AEgAEH0AGogAkEYakEk/AoAACAAQgQ3AgggAEKHgMQANwIAIAAgBUHeAEY6AHAgACACKQPIATcCECAAIAIpA9ABNwIYIAAgAikD2AE3AiAgACACKQOwATcCWCAAIAIpA7gBNwJgIAAgAikDwAE3AmgMAQsgAEGJgMQANgIAIAJBGGoQlhsLIAJB4AFqJAALsgYCDn8DfiMAQaABayICJAAgASgCBCEDIAIgASgCCCIEQQhBKBCDDyACKAIEIQUCQAJAAkACQCACKAIAQQFGDQAgAigCCCEGAkAgBUUNACAEQShsIQdBACEIIAUhCQNAIAcgCEYNAQJAAkACQAJAAkACQCADIAhqIgEoAgAiCg4FAAECAwQACyABQRxqKAIAIQsgAUEYaigCACEMAkACQCABQQhqKQMAIhBCA4NCAFINACAQpyINIA0oAgAiDUEBajYCACANQX9MDQELIAFBEGopAwAiEUIDg0IAUg0FIBGnIgEgASgCACIBQQFqNgIAIAFBf0oNBQsACyABQRBqKQIAIRECQAJAIAFBBGooAgBBAUcNAEHAABCKASINRQ0JIAIgAUEIaigCABBOIA0gAikDODcDOCANIAIpAzA3AzAgDSACKQMoNwMoIA0gAikDIDcDICANIAIpAxg3AxggDSACKQMQNwMQIA0gAikDCDcDCCANIAIpAwA3AwBBASEODAELIAFBDGooAgAhDyABQQhqKAIAIQ1BACEOCyAPrUIghiANrYQhEAwDCyABQQhqKQIAIRBBwAAQigEiDkUNByACIAFBBGooAgAQTiAOIAIpAzg3AzggDiACKQMwNwMwIA4gAikDKDcDKCAOIAIpAyA3AyAgDiACKQMYNwMYIA4gAikDEDcDECAOIAIpAwg3AwggDiACKQMANwMADAILQaABEIoBIg5FDQcgAiABQQRqKAIAEP0BIA4gAkGgAfwKAAAMAQsgAUEcaigCACELIAFBGGooAgAhDCABQRBqKQIAIREgAiABQQhqKAIAIAFBDGooAgAQ/wQgAUEgaikCACESIAIpAgQhECACKAIAIQ4LIAYgCGoiASAKNgIAIAFBIGogEjcDACABQRxqIAs2AgAgAUEYaiAMNgIAIAFBEGogETcDACABQQhqIBA3AwAgAUEEaiAONgIAIAhBKGohCCAJ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ACEDAkACQAJAAkACQAJAIAAoAgwiBEERSQ0AIARBcGohBULTkYytiNHanyQhB0LE5sGb4MXijBMhCEEAIQADQCAIIQkCQCAAIAVJDQAgAUEQaiAFIAIgBEH4wZgBEOQdIAEoAhQiAEEHTQ0EIABBD00NBSABKAIQIgApAAggCYUhCCAAKQAAIAeFIQcMAwsgAiAAaiIGQQhqKQAAQtDj/MyihM6EpH+FIghC/////w+DIAYpAAAgB4UiB0IgiH5CIIkgCEIgiCAHQv////8Pg36FIQggAEEQaiEAIAkhBwwACwsCQAJAAkAgBEEHSw0AIARBA0sNASAEDQJC05GMrYjR2p8kIQdCxObBm+DF4owTIQgMAwsgAikAACEIIAEgBEF4aiACIARByMKYARDkHSABKAIEQQhHDQUgCELTkYytiNHanySFIQcgASgCACkAAELE5sGb4MXijBOFIQgMAgsgAjUAACEIIAFBCGogBEF8aiACIARBqMKYARDkHSABKAIMQQRHDQUgCELTkYytiNHanySFIQcgASgCCDUAAELE5sGb4MXijBOFIQgMAQsgAiAEakF/ajEAAEIIhiACIARBAXZqMQAAhELE5sGb4MXijBOFIQggAjEAAELTkYytiNHanySFIQcLIAFBIGokACADQd3L3Z55bCAHQv////8PgyAIQiCIfiAErYUgB0IgiCAIQv////8Pg35CIImFIginakHdy92eeWwgCEIgiKdqQcnB+P0AbEGj7rmcBGpBD3etDwtBAEEIIABBiMKYARCPCgALQQhBECAAQZjCmAEQjwoAC0HU/ZoBQSsgAUEfakGYw5gBQdjCmAEQ1RQAC0HU/ZoBQSsgAUEfakGYw5gBQbjCmAEQ1RQAC5EFAQR/IwBBIGsiBCQAAkACQAJAAkACQCABLQC4AUEGRw0AAkACQCABKAKIASIFQQtHDQAgBEEQaiABEMYBDAELIAFBCzYCiAEgBCABKQKYATcDECAEIAEoAqABNgIYIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahC8CwsgASAFNgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEgBCgCGDYCuAEgASABKQOwATcDqAEgASAEKQMQNwKwAUEAIQUMAQsgASABKAJ4IgVBwAByNgJ4IARBCGogARC4AyAEKAIIIQYgASAFNgJ4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Ag0AIARBywBHDQEMAgsgBEHLAEYNASAEQeIARw0AIANBGGpBBHJB4gAQxiUgA0EwNgIsIANB7IabATYCKCADQbCAgIB4NgIYIAEoArABIAEoArQBIANBGGoQwBshBAJAIAEtALgBQaIBRw0AIAEQxBQhAiABELIQIAEgAhCTCQsgAEECOgAUIAAgBDYCAAwCCyADQRhqIAFBAUEBELYDIAMoAhghAgJAIAMtACwiBUECRg0AIAMgAy8ALTsBFCADIAMtAC86ABYgAygCKCEGIAMoAiQhByADKAIgIQggAygCHCEJIAEoAnghCgJAAkACQCAEQcwARw0AIApBgAVxDQELIARB8QBHDQEgCkGAAnFFDQELIANBwoCAgHg2AhggASAIIAcgA0EYahDqHQsgACAFOgAUIAAgBjYCECAAIAc2AgwgACAINgIIIAAgCTYCBCAAIAI2AgAgACADLwEUOwAVIAAgAy0AFjoAFyAAQQA2AhgMAgsgAEECOgAUIAAgAjYCAAwBCyABKAK0ASEEIAEoArABIQIgAyABELAKIgs3AwggAxDCGyIMNwMYAkACQAJAIANBGGogA0EIahDWDA0AAkAgDEIDg0IAUg0AIAynIgUgBSgCACIHQX9qNgIAIAdBAUcNACAFIAUoAhAQ7B4LIANCwcrZi8YNNwMYIANBGGogA0EIahDWDEUNAkLBytmLxg0Qlx0MAQsgDBCXHQsgA0GpgICAeDYCGCABIAIgBCADQRhqEIcTCyAAQQA2AhggAEEAOgAUIABBADYCECAAIAQ2AgwgACACNgIIIAAgCzcDAAsgA0EwaiQAC40FAgV/AX4jAEGAAWsiAyQAAkACQAJAAkACQAJAIAEtALgBIgRBgAFGDQACQCAEQcAARg0AIANBwABqQQRyIAQQxiUgA0EaNgJUIANBi4KbATYCUCADQbCAgIB4NgJAIAEoArABIAEoArQBIANBwABqEMAbIQVBASEGIAEtALgBQaIBRw0FIAEgARCFDhCTCQwFCyADQShqIAEQlQpCASEIDAELIANBwABqIAEQtgggAygCSCEFIAMpA0AiCFANASADQQA2AjggAyADKAJMNgI0IAMgBTYCMCADQQA6ADwgAyAINwMoQgAhCAsgAyAINwMIIAMgAykDKDcDECADIAMpAzA3AxggAyADKQM4NwMgAkACQCAB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Awg3AwggACAGKQMANwMAIAZBwABBCBDUFAwDCyAEKAIEIgAgARBcIAAoAgBBGkcNAiABIABBCGoQkgsiBkUNAiAAEIcCIAAgBikDODcDOCAAIAYpAzA3AzAgACAGKQMoNwMoIAAgBikDIDcDICAAIAYpAxg3AxggACAGKQMQNwMQIAAgBikDCDcDCCAAIAYpAwA3AwAgBkHAAEEIENQUDAILIARBBGogARC+BgwBCyAEQQxqKAIAIgBFDQAgAEEobCEGIARBCGooAgAhAANAIAAgARDcBiAAQShqIQAgBkFYaiIGDQALCyAEQShqIgQgBUcNAAsLAkAgAy0APCIAQQZGDQACQCAAQQJLDQAgA0EoaiEGAkAgAEECRw0AIAYgARDdHgsgASAGEKgJIAMtADwhAAsgAEH/AXFBA0cNACACIAEgA0EQaiIAEKINIAItACxBBkYNACAAEJQTIAAgAikDKDcDKCAAIAIpAyA3AyAgACACKQMYNwMYIAAgAikDEDcDECAAIAIpAwg3AwggACACKQMANwMACyACQTBqJAAL7gQDCH8DfgF8IwBBMGsiAiQAIAEoAsABIQMgAiABLQDIASIEOgAnAkACQAJAAkACQAJAAkACQAJAAkACQCAEQUBqDgMBAgMACwJAIARB2gBGDQACQCAEQeQARg0AIARB6gBGDQEgBEHefmoOAgUGBwsgARDlESABKAK8ASEFQQIhAUIAIQoMCAsgBEHqAEYhBiABEOURIAEoArwBIQVBASEBQgAhCgwHCyACQQhqIAEgAyABKALEARDMGiACKAIIIAIoAgwQhhkhCyABENAUIQwgARDlESALQoCAgIBwgyEKIAunIQcgDEIoiKchBCAMQiCIpyEGIAynIQUgASgCvAEhCEEAIQEgAyEJDAcLIAJBEGogASADIAEoAsQBEMwaIAIoAhAgAigCFBCGGSEMIAEQmBQhDSABEOURIAxCgICAgHCDIQogASgCvAEiBkEIdiEEIAynIQcgDb0iDEIgiKchCCAMpyEJQQMhASADIQUMBgsgAkEYaiABIAMgASgCxAEQzBogAigCGCACKAIcEIYZIQogARDRFCEHIAEQ5REgASgCvAEiBkEIdiEEIAqnIQkgCkIgiKchCEEEIQFCACEKIAMhBQwFCyABEM8UIQMgARDlEQwCCyABKAJwEK0eIQMM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IQUDQAJAIARBOGooAgAiAUUNACABQQxsIQIgBEE0aigCACEBA0AgASgCACAAEL0BIAFBDGohASACQXRqIgINAAsLIAQgABDeCyAEQcAAaiIBIQQgASAFRw0ACwsCQCADQRRqKAIAIgFFDQAgAUEMbCECIANBEGooAgAhAQNAIAEoAgAgABC9ASABQQxqIQEgAkF0aiICDQALCwJAIAMoAhhBgICAgHhGDQAgA0EgaigCACIBRQ0AIAFBMGwhAiADQRxqKAIAIQEDQCABIAAQ+QIgAUEwaiEBIAJBUGoiAg0ACwsCQCADKAI8IgFFDQAgAUEIaigCACICRQ0AIAJBMGwhAiABQQRqKAIAQSRqIQEgAEEMaiEFA0ACQCABQWRqKQMAIgZCA4NCAFINACAGpyIEIAQoAgAiBEEBajYCACAEQX9MDQMLIAUgBhDjBhoCQCABQXxqKAIAIgRFDQAgBCAAEJkCCwJAIAEoAgAiBEUNACAEIAAQmQILIAFBMGohASACQVBqIgINAAsLAkAgAygCQCIBRQ0AIAEoAgAgABCZAgsPCwAL7gQBBX8jAEEgayICJAACQAJAIAANAEEAIQEMAQsCQCAAKAIAQScgAEEEaiIDKAIAKAIQEQgADQADQAJAAkACQAJAAkACQCABQSJGDQACQCABQYCAxABHDQAgACgCAEEnIABBBGooAgAoAhARCAAhAQwJCwJAAkACQAJAAkACQAJAIAFBJkoNACABQXdqDgUCBAkJAwELIAFBJ0YNBSABQdwARg0EDAgLIAENByACQgA3AQIgAkHc4AA7AQAMBgsgAkIANwECIAJB3OgBOwEADAULIAJCADcBAiACQdzkATsBAAwECyACQgA3AQIgAkHc3AE7AQAMAwsgAkIANwECIAJB3LgBOwEADAILIAJCADcBAiACQdzOADsBAAwBC0GAgMQAIQEgACgCAEEiIAMoAgAoAhARCAANBgwFC0EAIQFBAiEEDAELAkACQAJAIAFB/wVNDQAgARCiCUUNACACQRBqIAEQlg0gAiACLwAYOwEIIAIgAikAEDcDAAwBCyABEN8EDQEgAkEQaiABEJYNIAIgAi8AGDsBCCACIAIpABA3AwALIAItABohASACLQAbIQQgAiACLwEIOwEYIAIgAikDADcDECABQf8BcSAEQf8BcUkNAgwDCyACIAE2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AzYCCCAFIAI2AgRBACABEMEGIQMCQAJAAkACQAJAAkBBwAAQigEiAUUNACABQQA6ABwgASADNgIYIAFCADcDECABQvHklYvXrpq55QA3AwggAUEaNgIAQRAQigEiBkUNASAFQQGtQiCGIAVBBGqthCIHNwMYIAVBDGpBpYCAASAFQRhqEM0IIAVBDGoQryAhCEHAABCKASIDRQ0CIANCADcDGCADIAg3AxAgA0EANgIIIANBGzYCACADQgA3AyAgBiADNgIMIAZBADYCACAFQgA3AjAgBUEDOgAsIAVBADYCKCAFQgA3AjggBUIANwIgIAVCgICAgMAANwIYIAVBGGoQmhtBAEEEEPMjQQAgBBDBBiEEQTgQigEiA0UNAyAFIAc3AxggBUHEAGpBuYCAASAFQRhqEM0IIAVBxABqEK4gIQhBwAAQigEiAkUNBCACQgA3AhwgAkEFOgAYIAIgATYCECACQQE2AgwgAiAGNgIIIAJCl4CAgBA3AwAgAkIANwIkIANBADYCICADQQA6ABwgAyAENgIYIANCADcCECADIAg3AgggA0EAOgA0IAMgAjYCMCADQgA3AyggA0EANgIAQRwQigEiAkUNBSACQgA3AgwgAkEBNgIIIAIgAzYCBCACQQE2AgAgAkIANwESIAAgAjYCDCAAQQI2AgggAEERNgIAQQBBCBD1IyAFQdAAaiQADwtBCEHAABCgJAALQQRBEBCgJAALQQhBwAAQoCQAC0EIQTgQoCQAC0EIQcAAEKAkAAtBBEEcEKAkAAucBAEKfwJAAkACQAJAAkACQAJAAkACQAJAIAAoAgQiAyACKAIIIgRPDQAgACgCACIFIARPDQEgACgCDCIGIARPDQIgACgCCCIHIARPDQMgAEEMQQggAigCBCICIAdBDGxqKAIIIAIgBkEMbGooAghJIggbaiIGKAIAIgcgBE8NBCAAIAIgBUEMbGooAggiCSACIANBDGxqKAIIIgpJQQJ0aiILKAIAIgMgBE8NBSAAQQhBDCAIG2oiBSgCACIMIARPDQYgACAJIApPQQJ0aiIAKAIAIgkgBE8NByAFIAAgBiACIANBDGxqKAIIIAIgB0EMbGooAghJIggbIAIgCUEMbGooAgggAiAMQQxsaigCCEkiCRsiCigCACIMIARPDQggCyAGIAAgCRsgCBsiBigCACILIARPDQkgAiAMQQxsaigCCCEEIAIgC0EMbGooAgghAiABIAcgAyAIGzYCACABIAogBiACIARJIgQbKAIANgIEIAEgBiAKIAQbKAIANgIIIAEgACAFIAkbKAIANgIMDwsgAyAEQYzIgQEQ9RYACyAFIARBnMiBARD1FgALIAYgBEGMyIEBEPUWAAsgByAEQZzIgQEQ9RYACyAHIARBjMiBARD1FgALIAMgBEGcyIEBEPUWAAsgDCAEQYzIgQEQ9RYACyAJIARBnMiBARD1FgALIAwgBEGMyIEBEPUWAAsgCyAEQZzIgQEQ9RYAC5EEAQ5/IwBBEGsiAiQAQQAhAwJAAkAgAS0AJUUNAAwBCyABKAIEIQQCQAJAIAEoAhAiBSABKAIIIgZLDQAgBSABKAIMIgdJDQAgAUEUaiIIIAEtABgiCWpBf2otAAAiCkH/AXEhCyAJQQVJIQwDQCAEIAdqIQ0CQAJAIAUgB2siDkEHSw0AQQAhDwJAIA4NAEEAIQ0MAgsDQAJAIA0gD2otAAAgC0cNAEEBIQ0MAwsgDiAPQQFqIg9HDQALQQAhDSAOIQ8MAQsgAkEIaiAKIA0gDhCZCiACKAIMIQ8gAigCCCENCwJAAkACQCANQQFHDQAgASAHIA9qQQFqIgc2AgwgByAJSQ0CIAcgBksNAiAMRQ0BIAQgByAJa2ogCCAJELIYDQIgASgCHCEOIAEgBzYCHCAHIA5rIQ8MBQsgASAFNgIMDAMLQQAgCUEEQdyVmwEQjwoACyAFIAdPDQALCyABQQE6ACUCQAJAIAEtACRBAUcNACABKAIgIQcgASgCHCEODAELIAEoAiAiByABKAIcIg5GDQILIAcgDmshDwsgBCAOaiEDIA9FDQAgAyAPQX9qIg5qLQAAQQpHDQAgD0F+aiEPAkACQCAODQBBACEHDAELIANBACADIA9qLQAAQf8BcUENRhshBwsgDyAOIAcbIQ8gByADIAcbIQMLIAAgDzYCBCAAIAM2AgAgAkEQaiQAC6oEAgh/AX4CQAJAIAAoAgAiAkEERg0AAkACQAJAIAIOBAMAAQIDCyAAKAIEQQFHDQIgAS0AKCECIAFBADoAKCABLQB5IQMgAUEAOgB5AkAgACgCCCIAKAIAQRpHDQAgAEEYaigCACEEAkAgACkDCCIKQgODQgBSDQAgCqciBSAFKAIAIgVBAWo2AgAgBUF/TA0FCyABQSxqIAogBBC6DAsgACABEG4gASACOgAoIAEgAzoAeQ8LIAAoAgQiBkHAAGogARD0CQJAIAZBhAFqKAIAIgBFDQAgAEHYAGwhAiAGQYABaigCACEAIAFBLGohBwNAAkACQCAAKAIAQQVHDQAgAS0AKCEEIAFBADoAKCABLQB5IQUgAUEAOgB5AkAgAEEEaigCACIDKAIAQRpHDQAgA0EYaigCACEIAkAgAykDCCIKQgODQgBSDQAgCqciCSAJKAIAIglBAWo2AgAgCUF/TA0ICyAHIAogCBC6DAsgAyABEG4gASAEOgAoIAEgBToAeQwBCyAAIAEQ7wYLIABB2ABqIQAgAkGof2oiAg0ACwsCQCAGQZgBaigCACIARQ0AIABBKGwhAiAGQZQBaigCACEAA0AgACABEN8HIABBKGohACACQVhqIgINAAsLIAYtADxBBkYNASAGQRBqIAEQ9AkPCyAAKAIMIgJFDQAgAkEobCECIAAoAgghAANAIAAgARDfByAAQShqIQAgAkFYaiICDQALCw8LAAuWBAIIfwR+IAApAxAgACkDGCABIAIQ0QchDAJAIAAoAggNACAAIABBEGoQzwIaCyABQQhqIQQgACgCBCIFIAyncSEGIAxCGYgiDUL/AINCgYKEiJCgwIABfiEOIAAoAgAhB0EAIQhBACEJAkADQAJAIAcgBmopAAAiDyAOhSIMQn+FIAxC//379+/fv/9+fINCgIGChIiQoMCAf4MiDFANAANAAkAgAiAHQQAgDHqnQQN2IAZqIAVxa0EMbGoiCkF4aigCAEcNACAEIApBdGooAgBBCGogAhCyGEUNBAsgDEJ/fCAMgyIMUEUNAAsLIA9CgIGChIiQoMCAf4MhDAJAAkACQCAIQQFGDQACQCAMUEUNAEEAIQgMAgsgDHqnQQN2IAZqIAVxIQsLIAwgD0IBhoNCAFINAUEBIQgLIAlBCGoiCSAGaiAFcSEGDAELCwJAIAcgC2osAAAiBkEASA0AIAcgBykDAEKAgYKEiJCgwIB/g3qnQQN2IgtqLQAAIQYLIAcgC2ogDadB/wBxIgo6AAAgByALQXhqIAVxakEIaiAKOgAAIAAgACgCCCAGQQFxazYCCCAAIAAoAgxBAWo2AgwgB0EAIAtrQQxsaiIAQXRqIAE2AgAgAEF4aiACNgIAIABBfGogAzYCAA8LIApBfGogAzYCACABIAEoAgAiAEF/ajYCAAJAIABBAUcNACABIAIQsxsLC68EAQN/AkACQAJAAkACQAJAAkACQAJAIAAoAgAOBQQAAQIDBAsgACgCBEEBRw0DIAEtACUhAiAAKAIIIQAgAS0AJCIDDQcgACgCACIEQXRqQQcgBEELSxtBe2oiBEEfSw0GQQEgBHRBrqKAgHhxDQcgBA0GIAAtABENBgwHCyABLQAlIQIgACgCBCEAIAEtACQiAw0EIAAoAgAiBEF0akEHIARBC0sbQXtqIgRBH0sNA0EBIAR0Qa6igIB4cQ0EIAQNAyAALQARDQMMBAsCQCAAKAIEIgMtAGxBAkcNACADQcAAaiEAA0AgACgCGCIALQAsQQJGDQALCwJAIANBhAFqKAIAIgBFDQAgAEHYAGwhAiADQYABaigCACEAA0AgACABEIcHIABB2ABqIQAgAkGof2oiAg0ACwsCQCADQZgBaigCACIARQ0AIABBKGwhAiADQZQBaigCACEAA0AgASAAEPICIABBKGohACACQVhqIgINAAsLIAMtADwiAUEGRg0BIAFBAkcNASADQRBqIQEDQCABKAIYIgEtACxBAkYNAAwCCwsgACgCDCICRQ0AIAJBKGwhAiAAKAIIIQADQCAAIAEQrQIgAEEoaiEAIAJBWGoiAg0ACwsPCyABQQM6ACQLIAEgABDlASAAIAEQVSABIAI6ACUgASADOgAkIAEgABC5AQ8LIAFBAzoAJAsgASAAEOUBIAAgARBVIAEgAjoAJSABIAM6ACQgASAAELkBC6cEAQd/AkACQAJAAkACQAJAAkACQAJAIAIgASgCCCIFTw0AAkAgASgCBCACQRRsaiIGKAIEIgdFDQAgByABIANB/wFxai0ASGoiByABKAIgIghPDQIgASgCHCAHQQJ0aiAENgIACwJAIAYoAgAiBg0AIAEoAhQhBwwHCyAGIAEoAhQiB08NAiADQf8BcSIJIAEoAhAiCCAGQQlsaiIKLQAAIgtJDQYgCSALRg0DIAFBDGohCiADQf8BcSEFA0ACQCAIIAYiAkEJbGooAAUiBg0AQQAhBgwHCyAGIAdPDQUgBSAIIAZBCWxqIgstAAAiCUsNAAsgA0H/AXEgCUkNBSALIAQ2AAEMBwsgAiAFQYzagQEQ9RYACyAHIAhBnNqBARD1FgALIAYgB0Gs2oEBEPUWAAsgCiAENgABDAMLIAYgB0G82oEBEPUWAAsCQCAHIAooAgBHDQAgChCSGiABKAIQIQgLIAEgB0EBaiIFNgIUIAggB0EJbGoiASAGNgAFIAEgBDYAASABIAM6AAACQCACIAdLDQAgCCACQQlsaiAHNgAFDAILIAIgBUHM2oEBEPUWAAsCQCAHIAEoAgxHDQAgAUEMahCSGiABKAIIIQULIAEgB0EBajYCFCABKAIQIAdBCWxqIgggBjYABSAIIAQ2AAEgCCADOgAAIAIgBU8NASABKAIEIAJBFGxqIAc2AgALIABBAzYCAA8LIAIgBUHc2oEBEPUWAAvUBAIFfwF+IwBBIGsiAiQAIAIgARCHASACKAIEIQMCQAJAAkAgAigCAEEBRg0AIAMhBAwBCwJAAkACQAJAAkAgAS0AuAEiBEGgf2oOAgACAQsgAS0AeEHAAHENAQwCCyAEQaIBRg0CIARBUWpB/wFxQQ1JDQAgBEFzakH/AXFBCUsNAQsgASgCtAEhBCABKAKwASEFIAJBjIGAgHg2AgggASAFIAQgAkEIahDqHSADKAIEIQUgAygCACEGAkBBwAAQigEiBEUNACAEIAU2AgggBCAGNgIEIARBMTYCACADQQhqEOYDIANBIEEIENQUDAMLQQhBwAAQoCQAC0EBIQUgAyEEDAILIAEpAwghByABQQo2AgggAiABKQMQNwMQIAIgBzcDCAJAAkAgB6ciBEEKRg0AIARBCUYNASACQQhqELwLC0GI85oBQShBwIebARC3IQALIAIoAgwhBAJAAkAgASgCiAEiBUELRw0AIAJBCGogARDGAQwBCyABQQs2AogBIAEgBTYCCCABIAEpAowBNwIMIAEgASgClAE2AhQgAiABKQKYATcDCCACIAEoAqABNgIQCyABIAIoAhA2ArgBIAEgASkDsAE3A6gBIAEgAikDCDcCsAEgA0EIahDmAyADQSBBCBDUFEEBIQUMAQsCQCAEKAIAQR5GDQBBACEDA0AgAkEIaiABIAQgAxDNASACKAIIIQQCQCACLQAMIgVBAkcNAEEBIQUMAwsgAi0ADSEDIAVBAXENAAsLQQAhBQsgACAENgIEIAAgBTYCACACQSBqJAALtwQBBH9BBCECAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRFDQNBCCECCyAAIAEgAmooAgAQ4wwPCwJAIAEoAgQiAy0AbEECRw0AIANBwABqIQEDQCABKAIYIgEtACxBAkYNAAsLAkAgA0GEAWooAgAiAUUNACABQdgAbCECIANBgAFqKAIAIQEDQCABIAAQ4wQgAUHYAGohASACQah/aiICDQALCwJAIANBmAFqKAIAIgFFDQAgA0GUAWooAgAiBCABQShsaiEFA0ACQAJAAkACQAJAIAQoAgAOBQQAAQIDBAsgBCgCBEEBRw0DIAAgBCgCCBDjDAwDCyAAIAQoAgQQ4wwMAgsgBEEEaiAAEIULDAELIARBDGooAgAiAUUNACABQShsIQIgBEEIaigCACEBA0AgASAAEIcGIAFBKGohASACQVhqIgINAAsLIARBKGoiBCAFRw0ACwsgAy0APCIBQQZGDQEgAUECRw0BIANBEGohAQNAIAEoAhgiAS0ALEECRg0ADAILCyABKAIMIgJFDQAgASgCCCIEIAJBKGxqIQUDQAJAAkACQAJAAkAgBCgCAA4FBAABAgMECyAEKAIEQQFHDQMgACAEKAIIEOMMDAMLIAAgBCgCBBDjDAwCCyAAIAQoAgQQsgQMAQsgBEEMaigCACIBRQ0AIAFBKGwhAiAEQQhqKAIAIQEDQCABIAAQqQUgAUEoaiEBIAJBWGoiAg0ACwsgBEEoaiIEIAVHDQALCwvjBAIEfwR+IwBB8ABrIgIkAAJAAkACQAJAIAEoAgBBAUcNACAAIAFBEGoiAxCABiIERQ0AIAEoAjAhBSABQQA2AjACQAJAIAUNACAEIQAMAQsQjCEhACACQTBqIAQQTiAAIAIpA2g3AzggACACKQNgNwMwIAAgAikDWDcDKCAAIAIpA1A3AyAgACACKQNINwMYIAAgAikDQDcDECAAIAIpAzg3AwggACACKQMwNwMAIAIgABDzEiACKAIAQQxGDQIgAiACKQMoNwNYIAIgAikDIDcDUCACIAIpAxg3A0ggAiACKQMQNwNAIAIgAikDCDcDOCACIAIpAwA3AzBBwAAQigEiAEUNAyAAIAIpA1g3AyggACACKQNQNwMgIAAgAikDSDcDGCAAIAIpA0A3AxAgACACKQM4NwMIIAAgAikDMDcDACAAQQA6ADwgACAFNgI4IABCADcDMCAEEIcCIARBwABBCBDUFAsgAykDCCEGIAMpAxAhByADKQMYIQggAUIANwMYIAMpAwAhCSABQgE3AxAgAUIANwAdIAFBADYCKCACIAg3A0ggAiAHNwNAIAIgBjcDOCACIAk3AzAgAiACQTBqEPIaIAIpAwAhBiACKAIMIQQgAigCCCEFQSgQigEiA0UNAyADIAA2AgQgA0EGNgIAIAEQyhEgASADNgIoIAEgBDYCHCABIAU2AhggASAGNwMQIAFBADYCCCABQQA2AgALIAJB8ABqJAAPCyACIAIoAgQ2AjBB1P2aAUErIAJBMGpB5M6aAUH0zpoBENUUAAtBCEHAABCgJAALQQhBKBCgJAALmQQCBX8FfiMAQRBrIgIkACABKAIQIQMCQAJAIAEpAwAiB0IDgyIIQgBSDQAgB6ciBCAEKAIAIgRBAWo2AgAgBEF/TA0BCyACIAM2AgggAiAHNwMAAkACQAJAIAAoAgxFDQAgByADEJ8bIglCGYhCgYKEiJCgwIABfiEKIAAoAgQiBCAJp3EhAyAAKAIAIQBBACEFA0ACQCAAIANqKQAAIgsgCoUiCUJ/hSAJQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIglQDQADQCACIABBACAJeqdBA3YgA2ogBHFrQRhsaiIGQWhqEM8hDQQgCUJ/fCAJgyIJUEUNAAsLIAsgC0IBhoNCgIGChIiQoMCAf4NQRQ0BIAMgBUEIaiIFaiAEcSEDDAALC0EBIQAgCEIAUg0BIAenIgEgASgCACIDQX9qNgIAQQEhACADQQFHDQEgASABKAIQEOweDAELAkAgASAGQXhqIgMQ1gwiAA0AIAFBADYCECAHIQkCQCADKQMAIgpCA4NCAFINACAKpyIDIAMoAgAiA0EBajYCACADQQBIDQMgASkDACEJCwJAIAlCA4NCAFINACAJpyIDIAMoAgAiBEF/ajYCACAEQQFHDQAgAyADKAIQEOweCyABIAo3AwALIAhCAFINACAHpyIBIAEoAgAiA0F/ajYCACADQQFHDQAgASABKAIQEOweCyACQRBqJAAgAA8LAAu/BAEEfwJAAkACQAJAAkAgASgCAA4FBAABAgMECyABKAIEQQFHDQMgASgCCCAAELsBDwsgASgCBCAAELsBDwsgACABKAIEIgJBwABqELsKAkAgAkGEAWooAgAiAUUNACABQdgAbCEDIAJBgAFqKAIAIQEDQAJAAkACQCABKAIAQXxqDgICAAELIAFBBGooAgAgABC7AQwBCyABIAAQ7QoLIAFB2ABqIQEgA0Gof2oiAw0ACwsCQCACQZgBaigCACIBRQ0AIAFBKGwhAyACQZQBaigCACEBA0AgASAAEMAIIAFBKGohASADQVhqIgMNAAsLIAItADxBBkYNASAAIAJBEGoQuwoPCyABKAIMIgNFDQAgASgCCCICIANBKGxqIQQDQAJAAkACQAJAAkAgAigCAA4FBAABAgMECyACKAIEQQFHDQMgAigCCCAAELsBDAMLIAIoAgQgABC7AQwCCyAAIAIoAgQiBUHAAGoQuwoCQCAFQYQBaigCACIBRQ0AIAFB2ABsIQMgBUGAAWooAgAhAQNAAkACQAJAIAEoAgBBfGoOAgIAAQsgAUEEaigCACAAELsBDAELIAEgABDtCgsgAUHYAGohASADQah/aiIDDQALCwJAIAVBmAFqKAIAIgFFDQAgAUEobCEDIAVBlAFqKAIAIQEDQCABIAAQwAggAUEoaiEBIANBWGoiAw0ACwsgBS0APEEGRg0BIAAgBUEQahC7CgwBCyACQQRqIAAQiBYLIAJBKGoiAiAERw0ACwsLtwQBBH9BBCECAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRFDQNBCCECCyAAIAEgAmooAgAQygEPCwJAIAEoAgQiAy0AbEECRw0AIANBwABqIQEDQCABKAIYIgEtACxBAkYNAAsLAkAgA0GEAWooAgAiAUUNACABQdgAbCECIANBgAFqKAIAIQEDQCABIAAQ5QQgAUHYAGohASACQah/aiICDQALCwJAIANBmAFqKAIAIgFFDQAgA0GUAWooAgAiBCABQShsaiEFA0ACQAJAAkACQAJAIAQoAgAOBQQAAQIDBAsgBCgCBEEBRw0DIAAgBCgCCBDKAQwDCyAAIAQoAgQQygEMAgsgBEEEaiAAEIcLDAELIARBDGooAgAiAUUNACABQShsIQIgBEEIaigCACEBA0AgASAAEIgGIAFBKGohASACQVhqIgINAAsLIARBKGoiBCAFRw0ACwsgAy0APCIBQQZGDQEgAUECRw0BIANBEGohAQNAIAEoAhgiAS0ALEECRg0ADAILCyABKAIMIgJFDQAgASgCCCIEIAJBKGxqIQUDQAJAAkACQAJAAkAgBCgCAA4FBAABAgMECyAEKAIEQQFHDQMgACAEKAIIEMoBDAMLIAAgBCgCBBDKAQwCCyAAIAQoAgQQswQMAQsgBEEMaigCACIBRQ0AIAFBKGwhAiAEQQhqKAIAIQEDQCABIAAQqgUgAUEoaiEBIAJBWGoiAg0ACwsgBEEoaiIEIAVHDQALCwviBAIKfwF+IwBB4ABrIgQkACAEQSBqIAEQ7QwgBCgCKCEFAkACQCAEKQMgIg5CAFINAEEBIQEgBSEGDAELIAQoAiwhBwJAAkACQCABLQDIAUEIRg0AIARBIGogARD5CgJAIAQoAiAiCEGAgICAeEcNACAEKAIkIQYMAwsgBCAEKQIoNwNIIAQgBCgCMDYCUCAEKAIkIQlBAiEKDAELIAEQ5REgBCABIAEoAsABIAMQ+QYgBCgCBCEGIAQoAgBBAXENAQJAAkAgBikDAEIBUQ0AIAYoAkwhCSAGKAJIIQggBCAGKQMYNwMYIAQgBikDEDcDECAEIAYpAwg3AwggBi0ARSIKQQNGDQEgBi8BRiELIARBIGogBkEgakEl/AoAAEEIQSgQ6CAiDCAEQSBqQSX8CgAAIAwgCzsBJiAMIAo6ACUgBCAEKQMINwNIIAQgBCkDEDcDUCAEIAQpAxg3A1ggBi0AUSEKIAYtAFAhCwJAIAYoAgBFDQAgBhD7HwsgBkHYAEEIENQUDAILQYjzmgFBKEHogZsBELchAAtB2IGbARDDIwALIAEoArwBIQ1BCEHYABDoICIGIAk2AiQgBiAINgIgQQAhASAGQQA6ABwgBkEANgIYIAYgBzYCFCAGIAU2AhAgBiAONwMIIAZCADcDACAGIAM6AFIgBkEAOwFQIAYgDTYCTCAGIAI2AkggBiAKOgBFIAYgCzoARCAGIAw2AkAgBiAEKQNINwMoIAYgBCkDUDcDMCAGIAQpA1g3AzgMAQsgDhCaIUEBIQELIAAgBjYCBCAAIAE2AgAgBEHgAGokAAvbBAIIfwF+IwBB4ABrIgMkACADIAEQmwoiBDYCFAJAAkACQCAEQfwARw0AIAIgASgCACIEKQJQNwIYIAIgBCgCWDYCICAEKAIQDQEgBEHQAGohBSAEQX82AhACQAJAAkAgBCgCHCIGRQ0AIAQoAhggBkHwAGxqIgZBkH9qIgdFDQAgBygCAEGAgICAeEYNAQsgAyACKAIUNgJQIAMgAikCDDcDSCADIAUpAgA3AlQgAyAFKAIINgJcQQgQigEiBkUNBCADIAIQ9BAgBiADKQMANwIAIAMgAykDSDcDMCADIAMpA1A3AzggAyADKQNYNwNAAkAgBCgCHCICIAQoAhRHDQAgBEEUahCrGgsgBCACQQFqNgIcIAQoAhggAkHwAGxqIgJBATYCDCACIAY2AgggAkKAgICAGDcCACACIAMpAzA3AhAgAiADKQM4NwIYIAIgAykDQDcCIAwBCyADQQhqIAIQ9BAgAygCDCEHIAMoAgghCAJAIAZBnH9qIgkoAgAiAiAGQZR/aiIKKAIARw0AIAoQlxoLIAkgAkEBajYCACAGQZh/aigCACACQQN0aiICIAc2AgQgAiAINgIACyAEIAQoAhBBAWo2AhAgARClCRogAEEANgIMIABCgICAgMAANwIEIABBIjYCACAAIAUpAgAiCzcCECADIAUoAggiBDYCICADIAs3AiQgACADKQMgNwIYIAMgBDYCLCAAIAMpAyg3AiAgAyALNwMYIANB4ABqJAAPCyADQRRqQZDTiQFBlNOJARDGHAALQcTUiQEQgR4AC0EEQQgQoCQAC7sEAQh/IwBBIGsiAiQAIAEgASgCaCIDQQFqNgJoIAEgASgCXCIEQX9qIgU2AlwgASABKAJYIgZBAWoiBzYCWCABLQAcIQgCQAJAIAEtAIEBQSBxRQ0AIAEoAnhBgOAAcUGAIEcNACAAQYAkOwEADAELQRIhCQJAAkAgBUUNACAHLQAAIQcCQCAFQQFGDQAgB0EhRw0AIAVBAkYNASAGLQACQf8BcUEtRw0BIAYtAANBLUcNASABQQMQ0AIgARC0GiACQaaAgIB4NgIIIAEgAyACQQhqEK8RIAFBADoAhQECQCABKAJcDQAgAEGAxgI7AQAMBAsgACABIAEoAlgtAABBAnQoAoC4mQERBwAMAwsCQAJAAkAgB0FEag4CAAEDCyABIANBAmo2AmggASAEQX5qIgU2AlwgASAGQQJqIgc2AlgCQCAFRQ0AIActAABBPUcNACABIANBA2o2AmggASAEQX1qIgU2AlwgASAGQQNqIgc2AlhBJCEJIAhBAXFFDQMMAgtBNSEJIAhBAXENAQwCCyABIANBAmo2AmggASAEQX5qNgJcIAEgBkECajYCWEEzIQkMAQsgByAFQajZmAFBBhDWH0UNACACQZyBgIB4NgIIIAEgAyADQQdqIAJBCGoQoRYgAUEFENACIAEQtBogAUEAOgCFASABKAJcDQEgAEGAxgI7AQAMAgsgAEEAOgAAIAAgCToAAQwBCyAAIAEgASgCWC0AAEECdCgCgLiZAREHAAsgAkEgaiQAC5MEAgh/BH4jAEEQayIDJAAgAyABNwMIIAEQzxwhCwJAIAAoAggNACAAIABBEGoQzQIaCyALQhmIIgxCgYKEiJCgwIABfiENIAAoAgQiBCALp3EhBSAAKAIAIQZBACEHQQAhCANAAkACQAJAAkACQCAGIAVqKQAAIg4gDYUiC0J/hSALQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIgtQDQADQCADQQhqIAAoAgAgC3qnQQN2IAVqIARxIglBBHRrQXBqENYMDQIgC0J/fCALgyILUEUNAAsLIA5CgIGChIiQoMCAf4MhCwJAIAdBAUYNACALUA0DIAt6p0EDdiAFaiAEcSEKCwJAIAsgDkIBhoNCAFINAEEBIQcMBAsCQCAGIApqLAAAQQBIDQAgBikDAEKAgYKEiJCgwIB/g3qnQQN2IQoLIAAoAgAiBSAKaiIGLQAAIQQgBiAMpyIHOgAAIAUgACgCBCAKQXhqcWpBCGogBzoAACAAIAAoAgxBAWo2AgwgACAAKAIIIARBAXFrNgIIIAUgCkEEdGsiAEF4aiACOgAAIABBcGogATcDAAwBCyAAKAIAQQAgCWtBBHRqQXhqIAI6AAAgAUIDg0IAUg0AIAGnIgAgACgCACIFQX9qNgIAIAVBAUcNACAAIAAoAhAQ7B4LIANBEGokAA8LQQAhBwsgCEEIaiIIIAVqIARxIQUMAAsLxQQBBH8jAEEQayICJAACQAJAAkAgAC0AAEEBRg0AIAAoAgQhAwJAIAAtAAFBAUYNACADKAIAKAIAIgRBARCbHyAEKAIEIAQoAggiBWpBLDoAACAEIAVBAWo2AggLIABBAjoAASACQQhqIAMoAgBBxNuaAUEUEMAFAkAgAi0ACEEERg0AIAIpAwgQ2SAhAAwDCyADKAIAKAIAIgBBARCbHyAAKAIEIAAoAggiBGpBOjoAACAAIARBAWo2AggCQCABKAIAQYCAgIB4Rw0AIAMoAgAoAgAiAEEEEJsfIAAoAgQgACgCCCIDakHu6rHjBjYAACAAIANBBGo2AghBACEADAMLIAEoAgQhBSABKAIIIQEgAygCACIEKAIAIgBBARCbHyAAKAIEIAAoAggiA2pB2wA6AAAgACADQQFqNgIIIAFFDQEgAUEMbCEBIAVBCGohAEEBIQMCQANAAkAgA0EBcQ0AIAQoAgAiA0EBEJsfIAMoAgQgAygCCCIFakEsOgAAIAMgBUEBajYCCAsgAkEIaiAEIABBfGooAgAgACgCABDABSACLQAIQQRHDQEgAEEMaiEAQQAhAyABQXRqIgENAAsgBCgCACIAQQEQmx8gACgCBCAAKAIIIgNqQd0AOgAAIAAgA0EBajYCCEEAIQAMAwsgAikDCBDZICEADAILQYjzmgFBKEH825oBELchAAsgBCgCACIAQQEQmx8gACgCBCAAKAIIIgNqQd0AOgAAIAAgA0EBajYCCEEAIQALIAJBEGokACAAC6cEAgh/AX4CQAJAAkACQAJAIAAoAgAOBAMAAQIDCyAAKAIEQQFHDQIgAS0AKCECIAFBADoAKCABLQB5IQMgAUEAOgB5AkAgACgCCCIAKAIAQRpHDQAgAEEYaigCACEEAkAgACkDCCIKQgODQgBSDQAgCqciBSAFKAIAIgVBAWo2AgAgBUF/TA0FCyABQSxqIAogBBC6DAsgACABEG4gASACOgAoIAEgAzoAeQ8LIAAoAgQiBkHAAGogARD0CQJAIAZBhAFqKAIAIgBFDQAgAEHYAGwhAiAGQYABaigCACEAIAFBLGohBwNAAkACQAJAIAAoAgBBfGoOAgIAAQsgAS0AKCEEIAFBADoAKCABLQB5IQUgAUEAOgB5AkAgAEEEaigCACIDKAIAQRpHDQAgA0EYaigCACEIAkAgAykDCCIKQgODQgBSDQAgCqciCSAJKAIAIglBAWo2AgAgCUF/TA0ICyAHIAogCBC6DAsgAyABEG4gASAEOgAoIAEgBToAeQwBCyAAIAEQxgULIABB2ABqIQAgAkGof2oiAg0ACwsCQCAGQZgBaigCACIARQ0AIABBKGwhAiAGQZQBaigCACEAA0AgACABEN8HIABBKGohACACQVhqIgINAAsLIAYtADxBBkYNASAGQRBqIAEQ9AkPCyAAKAIMIgJFDQAgAkEobCECIAAoAgghAANAIAAgARCGBCAAQShqIQAgAkFYaiICDQALCw8LAAuqBAEGfyMAQRBrIgIkAAJAAkACQAJAAkACQCABKAIADgUFAAECBQULIAEoAgRBAUcNBCAALQAlIQMgASgCCCEBIAAtACQiBA0DIAEoAgAiBUF0akEHIAVBC0sbQXtqIgVBH0sNAkEBIAV0Qa6igIB4cQ0DIAUNAiABLQARDQIMAwsCQCABKAIEIgYtAGxBAkcNACAGQcAAaiEBA0AgASgCGCIBLQAsQQJGDQALCwJAIAZBhAFqKAIAIgFFDQAgAUHYAGwhAyAGQYABaigCACEBA0ACQAJAIAEoAgBBBUcNACAALQAkIQcgAEECOgAkIAAtACUhBCAAIAFBBGooAgAiBRDlASAFIAAQVSAAIAQ6ACUgAEECOgAkIAAgBRC5ASAAIAQ6ACUgACAHOgAkDAELIAAgARD/BgsgAUHYAGohASADQah/aiIDDQALCyAGQZQBaigCACEBIAZBmAFqKAIAIQMgAiAANgIMAkAgA0UNACADQShsIQADQCACQQxqIAEQhgcgAUEoaiEBIABBWGoiAA0ACwsgBi0APCIAQQZGDQMgAEECRw0DIAZBEGohAANAIAAoAhgiAC0ALEECRg0ADAQLCyABKAIMIgNFDQIgA0EobCEDIAEoAgghAQNAIAEgABDxBiABQShqIQEgA0FYaiIDDQAMAwsLIABBAzoAJAsgACABEOUBIAEgABBVIAAgAzoAJSAAIAQ6ACQgACABELkBCyACQRBqJAALsQQBE38jAEHAAGsiAiQAIAEoAgQhAyACIAEoAggiBEEIQcAAEIMPIAIoAgQhBQJAAkACQCACKAIAQQFGDQAgAigCCCEGAkAgBUUNACADIARBBnRqIQdBACEIIAUhCQNAIAghCiADIgsgB0YNASALKAI0IQMgCygCLCEMIAsoAighDSACIAsoAjgiDkEEQQwQgw8gAigCBCEPIAIoAgBBAUYNAyACKAIIIRACQCAPRQ0AIA5BDGwhESAQIQggDyESA0AgEUUNASADKAIIIRMgAygCBCEUQcAAEIoBIgFFDQYgAiADKAIAEE4gASACKQM4NwM4IAEgAikDMDcDMCABIAIpAyg3AyggASACKQMgNwMgIAEgAikDGDcDGCABIAIpAxA3AxAgASACKQMINwMIIAEgAikDADcDACAIQQhqIBM2AgAgCEEEaiAUNgIAIAggATYCACAIQQxqIQggEUF0aiERIANBDGohAyASQX9qIhINAAsLIAtBwABqIQMgCkEBaiEIIAIgCxCMAyAGIApBBnRqIgEgDjYCOCABIBA2AjQgASAPNgIwIAEgDDYCLCABIA02AiggASACKQMgNwMgIAEgAikDGDcDGCABIAIpAxA3AxAgASACKQMINwMIIAEgAikDADcDACAJQX9qIgkNAAsLIAAgBDYCCCAAIAY2AgQgACAFNgIAIAJBwABqJAAPCyAFIAIoAggQ/CAACyAPIAIoAggQ/CAAC0EIQcAAEKAkAAuzBAEFfyMAQRBrIgIkAAJAAkACQAJAIAAoAgAOBQMAAQIDAwsgACgCBEEBRw0CIAEtADkhAyABQQE6ADkgACgCCCABEHkgASADOgA5DAILIAEgACgCBCIEQcAAahCXCiABIARB/ABqEJQPAkAgBCgCeCIARQ0AIAEtADRBAUcNACABLQA6IQUgAS0AOSEGIAFBgQI7ADkCQCAAKAIIIgNFDQAgA0ECdCEDIAAoAgQhAANAAkAgAS0ANEEBRw0AIAFBgQI7ADkgACgCACABEJECIAFBgQI7ADkLIABBBGohACADQXxqIgMNAAsLIAEgBToAOiABIAY6ADkLIARBlAFqKAIAIQAgBEGYAWooAgAhAyACIAE2AgwCQCADRQ0AIANBKGwhAwNAIAJBDGogABCtCCAAQShqIQAgA0FYaiIDDQALCyAELQA8QQZGDQEgASAEQRBqEJcKDAELIAAoAgwiA0UNACAAKAIIIgQgA0EobGohBQNAAkACQAJAAkACQCAEKAIADgUEAAECAwQLIAQoAgRBAUcNAyABLQA5IQAgAUEBOgA5IAQoAgggARB5IAEgADoAOQwDCyABLQA5IQAgAUEBOgA5IAQoAgQgARB5IAEgADoAOQwCCyABIAQoAgQQ+QUMAQsgBEEMaigCACIARQ0AIABBKGwhAyAEQQhqKAIAIQADQCAAIAEQtwQgAEEoaiEAIANBWGoiAw0ACwsgBEEoaiIEIAVHDQALCyACQRBqJAALugQBA38CQAJAAkAgASgCAA4DAAECAAsgAC0AJSECIAAtACQhAwJAIAEoAghBA0cNACAAQQM6ACQgACABKAIMIgQQ5QEgBCAAEFUgACACOgAlIABBAzoAJCAAIAQQuQEgACACOgAlIABBAjoAJCAEKAIAQRlHDQAgACAEEM8BCyAAIAI6ACUgACADOgAkIAEoAiggABCtBQ8LIAAtACQhBCAAQQI6ACQgAC0AJiEDIABBADoAJiAALQAlIQICQCABKAIwIgFFDQAgACABEOUBIAEgABBVIAAgAjoAJSAAQQI6ACQgACABELkBCyAAIAI6ACUgACAEOgAkIAAgAzoAJg8LAkACQAJAAkACQAJAIAEoAgQiASgCAA4HBQABAgMFBAULIAFBDGooAgAiAkUNBCACQShsIQIgAUEIaigCACEBA0ACQCABKAIAQQdGDQAgASAAEK0FCyABQShqIQEgAkFYaiICDQAMBQsLIAEoAgQgABCtBQ8LIAFBDGooAgAiAkUNAiACQThsIQIgAUEIaigCACEBA0AgACABEIIHIAFBOGohASACQUhqIgINAAwDCwsgACABQQRqEPAODwsgAC0AJSECIAEoAgQhAQJAIAAtACQiBA0AAkAgASgCACIDQXRqQQcgA0ELSxtBe2oiA0EfSw0AQQEgA3RBrqKAgHhxDQEgAw0AIAEtABFFDQELIABBAzoAJAsgACABEOUBIAEgABBVIAAgAjoAJSAAIAQ6ACQgACABELkBCwvABAEGfwJAAkACQAJAIAEoAgAOAwABAwALIAEoAgwiAkUNASACQShsIQMgASgCCCECA0ACQCACKAIAQQdGDQAgAiAAEMwEIAAgAhCACQsgAkEoaiECIANBWGoiAw0ADAILCyABKAIMIgJFDQAgAkE4bCEEIAEoAgghBUEAIQMDQAJAAkACQAJAIAUgA2oiAigCAA4DAAECAAsCQCACQQhqKAIAQQNHDQAgAkEMaigCACIGIAAQXCAGKAIAQRpHDQAgACAGQQhqEJILIgdFDQAgBhCHAiAGIAcpAzg3AzggBiAHKQMwNwMwIAYgBykDKDcDKCAGIAcpAyA3AyAgBiAHKQMYNwMYIAYgBykDEDcDECAGIAcpAwg3AwggBiAHKQMANwMAIAdBwABBCBDUFAsgAkEoaigCACICIAAQzAQgACACEIAJDAILAkAgAkEoaigCACIGRQ0AIAYoAgAgABC4AQsgAkEwaigCACICRQ0BIAIgABBcIAIoAgBBGkcNASAAIAJBCGoQkgsiBkUNASACEIcCIAIgBikDODcDOCACIAYpAzA3AzAgAiAGKQMoNwMoIAIgBikDIDcDICACIAYpAxg3AxggAiAGKQMQNwMQIAIgBikDCDcDCCACIAYpAwA3AwAgBkHAAEEIENQUDAELIAJBBGooAgAiBiAAEMwEIAAgBhCACSACQRhqKAIAIgJFDQAgAigCACAAELgBCyAEIANBOGoiA0cNAAsLIAEoAhgiAkUNACACKAIAIAAQuAELC7wEAQF/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgFBdGpBByABQQtLG0F/ag4kAAECAwQFBgcICQoLDA0ODxAREhMiFBUWFyIYGRobHB0eHyAhIgsgAEEEahChIQ8LIABBBGoQ4SIPCyAAKQMIIAAtABwQ0iEgACgCIBCYHg8LIABBBGoQuSIPCyAAQQxqELkiDwsgAEEEahC5IiAAQQhqELkiDwsgABCmIw8LIABBCGoQpyMPCyAAQQhqEMUgDwsgAEEEahC5IiAAQQhqELkiIABBDGoQuSIPCyAAQQRqENQhDwsgAEEEahDVIQ8LIABBBGoQoiEPCyAAKQMIEJohDwsgAEEIahC6Fg8LIABBBGoQqCMPCyAAQQRqEKQgDwsgAEEEahClIA8LIAApAwggAC0AHBDSISAAQSBqELoiDwsgAEEMahDiIg8LIABBBGoQuSIPCyAAQQRqELkiDwsgAEEIahDyHQ8LIAApAwggACkDGBCgJQ8LIAAoAgQiAEHAAGoQ1iEgAEGQAWoQ4yICQCAALQA8QQZGDQAgAEEQahDcGwsgAEGgAUEIENQUDwsgAEEEahDjIg8LIABBBGoQqSMPCyAAQQRqELkiDwsgAEEEahC5Ig8LIABBBGoQqSMPCyAAQQRqEJUkDwsgAEEEahCpIw8LIAApAwgQmiEPCyAAQQRqEK4eCwuRBAIHfwR+IwBBEGsiAyQAIAMgAjYCCCADIAE3AwAgASACEJ8bIQoCQCAAKAIIDQAgAEEBIABBEGoQwgIaCyAKQhmIIgtCgYKEiJCgwIABfiEMIAAoAgQiBCAKp3EhBSAAKAIAIQZBACEHQQAhCAN/AkACQAJAAkACQCAGIAVqKQAAIg0gDIUiCkJ/hSAKQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIgpQDQADQCADIAAoAgAgCnqnQQN2IAVqIARxQQR0a0FwahDPIQ0CIApCf3wgCoMiClBFDQALCyANQoCBgoSIkKDAgH+DIQoCQCAHQQFGDQAgClANAyAKeqdBA3YgBWogBHEhCQsCQCAKIA1CAYaDQgBSDQBBASEHDAQLQQAhBQJAIAYgCWosAABBAEgNACAGKQMAQoCBgoSIkKDAgH+DeqdBA3YhCQsgACgCACIGIAlqIgQtAAAhByAEIAunIgg6AAAgBiAAKAIEIAlBeGpxakEIaiAIOgAAIAAgACgCDEEBajYCDCAAIAAoAgggB0EBcWs2AgggBiAJQQR0ayIAQXhqIAI2AgAgAEFwaiABNwMADAELQQEhBSABQgODQgBSDQAgAaciACAAKAIAIgJBf2o2AgBBASEFIAJBAUcNACAAIAAoAhAQ7B4LIANBEGokACAFDwtBACEHCyAIQQhqIgggBWogBHEhBQwACwujBAEEfyMAQRBrIgIkACAAKAIAIQMCQAJAAkACQAJAAkACQAJAAkAgASgCAA4FCAABAgMICyABKAIEQQFHDQcgAy0AJSEAIAEoAgghASADLQAkIgQNBiABKAIAIgVBdGpBByAFQQtLG0F7aiIFQR9LDQVBASAFdEGuooCAeHENBiAFDQUgAS0AEQ0FDAYLIAMtACUhACABKAIEIQEgAy0AJCIEDQMgASgCACIFQXRqQQcgBUELSxtBe2oiBUEfSw0CQQEgBXRBrqKAgHhxDQMgBQ0CIAEtABENAgwDCyABKAIEIgRB/ABqIQACQCAELQBsQQJHDQAgBEHAAGohAQNAIAEoAhgiAS0ALEECRg0ACwsgAyAAEM0JIARBlAFqKAIAIQEgBEGYAWooAgAhACACIAM2AgwCQCAARQ0AIABBKGwhAANAIAJBDGogARCGByABQShqIQEgAEFYaiIADQALCyAELQA8IgFBBkYNBSABQQJHDQUgBEEQaiEBA0AgASgCGCIBLQAsQQJGDQAMBgsLIAEoAgwiAEUNBCAAQShsIQAgASgCCCEBA0AgASADEPEGIAFBKGohASAAQVhqIgANAAwFCwsgA0EDOgAkCyADIAEQ5QEgASADEFUgAyAAOgAlIAMgBDoAJCADIAEQuQEMAgsgA0EDOgAkCyADIAEQ5QEgASADEFUgAyAAOgAlIAMgBDoAJCADIAEQuQELIAJBEGokAAuoBAEEfyMAQRBrIgIkAAJAAkACQCAAKAIAIgNBfGoOAgIAAQsgAS0AJCEEIAFBAjoAJCABLQAlIQMgASAAKAIEIgAQ5QEgACABEFUgASADOgAlIAFBAjoAJCABIAAQuQEgASADOgAlIAEgBDoAJAwBCwJAAkACQAJAAkAgAw4EBQABAgULIAAoAgRBAUcNBCABLQAlIQMgACgCCCEAIAEtACQiBA0DIAAoAgAiBUF0akEHIAVBC0sbQXtqIgVBH0sNAkEBIAV0Qa6igIB4cQ0DIAUNAiAALQARDQIMAwsCQCAAKAIEIgQtAGxBAkcNACAEQcAAaiEAA0AgACgCGCIALQAsQQJGDQALCwJAIARBhAFqKAIAIgBFDQAgAEHYAGwhAyAEQYABaigCACEAA0AgACABEJAIIABB2ABqIQAgA0Gof2oiAw0ACwsgBEGUAWooAgAhACAEQZgBaigCACEDIAIgATYCDAJAIANFDQAgA0EobCEBA0AgAkEMaiAAEIYHIABBKGohACABQVhqIgENAAsLIAQtADwiAUEGRg0DIAFBAkcNAyAEQRBqIQEDQCABKAIYIgEtACxBAkYNAAwECwsgACgCDCIDRQ0CIANBKGwhAyAAKAIIIQADQCAAIAEQrQIgAEEoaiEAIANBWGoiAw0ADAMLCyABQQM6ACQLIAEgABDlASAAIAEQVSABIAM6ACUgASAEOgAkIAEgABC5AQsgAkEQaiQAC6wEAQV/IwBBEGsiAiQAAkACQAJAIAAoAgAiA0F8ag4CAgABCyABLQA5IQMgAUEBOgA5IAAoAgQgARB5IAEgAzoAOQwBCwJAAkACQCADDgQDAAECAwsgACgCBEEBRw0CIAEtADkhAyABQQE6ADkgACgCCCABEHkgASADOgA5DAILIAEgACgCBCIEQcAAahCXCgJAIARBhAFqKAIAIgBFDQAgAEHYAGwhAyAEQYABaigCACEAA0ACQAJAIAAoAgBBBUcNACABLQA5IQUgAUEBOgA5IABBBGooAgAgARB5IAEgBToAOQwBCyAAIAEQgQcLIABB2ABqIQAgA0Gof2oiAw0ACwsCQCAEKAJ4IgBFDQAgAS0ANEEBRw0AIAEtADohBSABLQA5IQYgAUGBAjsAOQJAIAAoAggiA0UNACADQQJ0IQMgACgCBCEAA0ACQCABLQA0QQFHDQAgAUGBAjsAOSAAKAIAIAEQkQIgAUGBAjsAOQsgAEEEaiEAIANBfGoiAw0ACwsgASAFOgA6IAEgBjoAOQsgBEGUAWooAgAhACAEQZgBaigCACEDIAIgATYCDAJAIANFDQAgA0EobCEDA0AgAkEMaiAAEK0IIABBKGohACADQVhqIgMNAAsLIAQtADxBBkYNASABIARBEGoQlwoMAQsgACgCDCIDRQ0AIANBKGwhAyAAKAIIIQADQCAAIAEQtwQgAEEoaiEAIANBWGoiAw0ACwsgAkEQaiQAC7AEAQN/AkACQAJAAkACQAJAAkADQAJAIAAoAgAiAkECRg0AAkACQCACDgcIAQAEBwYFCAsACyAAKAIMIgJFDQYgAkEobCECIAAoAgghAANAAkAgACgCAEEHRg0AIAAgARCJBwsgAEEoaiEAIAJBWGoiAg0ADAcLCyAAKAIEIQAMAAsLIAAoAgwiAkUNAyACQThsIQIgACgCCCEAA0ACQAJAAkACQAJAAkAgACgCAA4DAAECAAsgAEEIaiABEJQMIABBKGooAgAgARCJBwwECyAAQTBqKAIAIgNFDQMgAS0ABEEBRw0DAkACQCADKAIAIgRBdGpBByAEQQtLG0Fyag4DBAABAwsgAygCCEEFRg0DDAILIAMoAgxFDQEgAUEAOgAEDAMLIABBBGooAgAgARCJBwwCCyADIAEQ+QEMAQsgAUEAOgAECyAAQThqIQAgAkFIaiICDQAMBAsLIAEtAARBAUcNAgJAAkACQAJAIAAoAgQiAigCACIAQXRqQQcgAEELSxtBcmoOAwMAAQILIAIoAghBBUYNAgwBCyACKAIMRQ0AIAFBADoABAwECyACIAEQ+QEPCyABQQA6AAQPCyABQQA6AAQPCyAAKAIEIAEQiQcgAS0ABEEBRw0AAkACQCAAKAIIIgIoAgAiAEF0akEHIABBC0sbQXJqDgMEAAEDCyACKAIIQQVGDQMMAgsgAigCDEUNASABQQA6AAQPCw8LIAIgARD5AQ8LIAFBADoABAvSBAIIfwJ+IwBBMGsiAyQAIAEtAMgBIQQCQAJAAkACQCACDQAgBEHLAEcNAQwCCyAEQcsARg0BIARB4gBHDQAgA0EYakEEckHiABDXJSADQTA2AiwgA0HshpsBNgIoIANBsICAgHg2AhggASgCwAEgASgCxAEgA0EYahDAGyEEAkAgAS0AyAFBogFHDQAgARDPFCECIAEQ5REgASACEIYUCyAAQQI6ABQgACAENgIADAILIANBGGogAUEBQQEQ7wMgAygCGCECAkAgAy0ALCIFQQJGDQAgAyADLwAtOwEUIAMgAy0ALzoAFiADKAIoIQYgAygCJCEHIAMoAiAhCCADKAIcIQkgASgCeCEKAkACQAJAIARBzABHDQAgCkGABXENAQsgBEHxAEcNASAKQYACcUUNAQsgA0HCgICAeDYCGCABIAggByADQRhqEPEdCyAAIAU6ABQgACAGNgIQIAAgBzYCDCAAIAg2AgggACAJNgIEIAAgAjYCACAAIAMvARQ7ABUgACADLQAWOgAXIABBADYCGAwCCyAAQQI6ABQgACACNgIADAELIAEoAsQBIQQgASgCwAEhAiADIAEQ8xciCzcDCCADEMIbIgw3AxggA0EYaiADQQhqENYMIQUgDBCaIQJAAkAgBQ0AIANCwcrZi8YNNwMYIANBGGogA0EIahDWDEUNAQsgA0GpgICAeDYCGCABIAIgBCADQRhqEKcbCyAAQQA2AhggAEEAOgAUIABBADYCECAAIAQ2AgwgACACNgIIIAAgCzcDAAsgA0EwaiQAC6QEAgV/AX4jAEEwayIDJABBDCEEAkACQCAAKAIEIAAtAAsiBUHAAGpB/wFxIgZBDCAGQQxJGyAFQf4BRhsiByACaiIGIAdJDQACQCAFQf4BRw0AIAAoAggiBEEYdiEFAkAgBEH///93Rg0AIARB////B3EhBAwBCyAAKAIAQXxqKAAAIQQLAkAgBiAESQ0AAkACQCAGQQ1JDQAgBUH+AUYNASADQRhqIAAQjRsgA0EgaiADKAIYIAMoAhwgAhCbESAAEN8gIAAgAygCKDYCCCAAIAMpAiA3AgAMAgsgA0EIaiAAEI0bIANCADcDICADQQA2ACcgAyADKAIMIgVBwAFyOgArAkAgBUUNACADQSBqIAMoAgggBfwKAAALIAAQ3yAgACADKAIoNgIIIAAgAykDIDcCAAwBCyAAQX8gBiAGIAdJGyIFQf////8HIAetQgN+IginQQF2IAhCIIinGyIEIAUgBEsbELkGRQ0AIANBEGogABCNGyADQSBqIAMoAhAgAygCFCACEJsRIAAQ3yAgACADKAIoNgIIIAAgAykCIDcCAAsgAyAAELUYIAYgAygCBCIFSw0BAkAgAkUNACADKAIAIAdqIAEgAvwKAAALAkACQCAALQALQf4BRw0AIAAgBjYCBAwBCyAGQQtLDQAgACAGQcABcjoACwsgA0EwaiQADwtBnNWYAUEsQcjVmAEQ5RsACyAHIAYgBUHY1ZgBEI8KAAvDBAIGfwJ+IwBB0ABrIgIkAAJAAkACQAJAIAEtAMgBIgNBBEYNACABIAEoAngiBEGAgIAEcjYCeAJAAkACQAJAAkAgA0FAakECSQ0AIANBogFGDQEgAkEgaiABEKQPAkAgAikDICIIQgJSDQAgAigCKCEFDAMLIAIoAjQhBiACKAIwIQcgAikDKCEJIAhCAVINA0EIQcAAEOggIgVBADoAHCAFQQA2AhggBSAGNgIUIAUgBzYCECAFIAk3AwggBUEaNgIADAQLIAJBCGogARD+EiACKAIMIQUgAigCCEEBcQ0BDAMLIAEQnyMhBQsgACAFNgIEIAEgBDYCeCAAQQI6AAAMBQsgAkGHgICAeDYCOCABIAcgBiACQThqEPEdQQhBwAAQ6CAiBSAGNgIUIAUgBzYCECAFIAk3AwggBUEvNgIACyABIAQ2AngMAQsgARDlESACIAEQvwwgAigCBCEFIAIoAgBBAXENASACIAU2AhACQCABLQDIASIEQQVGDQAgASgCxAEhBSABKALAASEDIAJBFGogBBDXJSACQY8CrUIghkH745oBrYQ3AyAgAkE4akHNlYABIAJBIGoQhR8gAiACKQIUNwJEIAIgAigCHDYCTCADIAUgAkE4ahDAGyEFAkAgAS0AyAFBogFHDQAgASABEJ8jEIYUCyAAQQI6AAAgACAFNgIEIAJBEGoQuSIMAwsgARDlEQsgACAFNgIEIAAgA0EERjoAAAwBCyAAQQI6AAAgACAFNgIECyACQdAAaiQAC44EAQl/AkACQAJAAkACQAJAAkAgBSAESQ0AIAUgA0sNACAFIARGDQMgAiAEaiEGIAEtAIECIQcgAS0AgAIhCAJAIAUgBGsiCUEDSw0AIAYhBQNAIAggBS0AACIKRg0GIAcgCkYNBiAFQQFqIQUgCUF/aiIJDQAMBQsLQYCChAggBigAACILIAhBgYKECGwiDHMiCmsgCnJBgIGChHhxQYCBgoR4Rw0CQYCChAggCyAHQYGChAhsIg1zIgprIApyQYCBgoR4cUGAgYKEeEcNAiACIAVqIQsgBkEEIAZBA3FrIgpqIQUgCiAJQXxqSg0BIAtBfGohDgNAQYCChAggBSgCACIKIAxzIglrIAlyQYCBgoR4cUGAgYKEeEcNAkGAgoQIIAogDXMiCWsgCXJBgIGChHhxQYCBgoR4Rw0CIAVBBGoiBSAOTQ0ADAILCyAEIAUgA0Gg4oEBEI8KAAsgBSALTw0BA0AgCCAFLQAAIglGDQMgByAJRg0DIAVBAWoiBSALRg0CDAALCyAGIQUDQCAIIAUtAAAiCkYNAiAHIApGDQIgBUEBaiEFIAlBf2oiCQ0ACwtBACEFDAELIAUgBmsgBGoiBSADTw0BIABBACAFIAEgAiAFai0AAGotAABrIgkgCSAFSxsiBSAEIAUgBEsbNgIEQQIhBQsgACAFNgIADwsgBSADQdDJgQEQ9RYAC5EFAgN/An4jAEGgAmsiAiQAAkBBAC0AkJadAQ0AENUdC0EAQQApA4CWnQEiBUIBfDcDgJadAUEAKQOIlp0BIQYgASgCgAUoAtACIQMgAkIENwIYIAJCADcCECACQoCAgIDAADcCCAJAIANBf0wNACACQQA2AiACQAJAAkAgA0UNACACQQhqIAMQjhAgAyACKAIcIgRLDQELIAIgAzYCHAwBCyACQRRqIAMgBGsQjhALIAIgAigCIDYCmAIgAiACKQIYNwOQAiACIAIpAhA3A4gCIAIgAikCCDcDgAIgAkEANgIgIAJCBDcCGCACQgA3AhAgAkKAgICAwAA3AggCQAJAAkAgA0UNACACQQhqIAMQjhAgAyACKAIcIgRLDQELIAIgAzYCHAwBCyACQRRqIAMgBGsQjhALIAIgAigCIDYC/AEgAiACKQIYNwL0ASACIAIpAhA3AuwBIAIgAikCCDcC5AEgAiACKQOAAjcDyAEgAiACKQOIAjcD0AEgAiACKQOQAjcD2AEgAiACKAKYAjYC4AEgAkEANgKcASACQoCAgIDAADcClAEgAkIENwKMASACQgA3AoQBIAJCgICAgMAANwJ8IAJBACkDqKacATcDECACQQApA6CmnAE3AwggAiAGNwMgIAIgBTcDGCACQThqIAJByAFqQTj8CgAAIAJCATcDsAEgAkIANwOoASACQoCAgIDAADcDoAEgAkEANgK4ASACQQA2AnggAkIANwNwIAJBADYCKCACIAE2AsgBIAIgAkEIajYCzAEgAkHIAWoQoQIgACACQQhqQcAB/AoAACACQaACaiQADwsgAkE9NgLMASACQaDphAE2AsgBQfOLgAEgAkHIAWpBsISFARDkGwALuwUAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4ZAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGAALIAEoAgAgACgCBCAAKAIIIAEoAgQoAgwRDAAPCyAAQQRqIAEQkwoPCyABKAIAQfymmAFBGCABKAIEKAIMEQwADwsgASgCAEGUp5gBQRsgASgCBCgCDBEMAA8LIAEoAgBBr6eYAUEaIAEoAgQoAgwRDAAPCyABKAIAQcmnmAFBGSABKAIEKAIMEQwADwsgASgCAEHip5gBQQwgASgCBCgCDBEMAA8LIAEoAgBB7qeYAUETIAEoAgQoAgwRDAAPCyABKAIAQYGomAFBEyABKAIEKAIMEQwADwsgASgCAEGUqJgBQQ4gASgCBCgCDBEMAA8LIAEoAgBBoqiYAUEOIAEoAgQoAgwRDAAPCyABKAIAQbComAFBDCABKAIEKAIMEQwADwsgASgCAEG8qJgBQQ4gASgCBCgCDBEMAA8LIAEoAgBByqiYAUEOIAEoAgQoAgwRDAAPCyABKAIAQdiomAFBEyABKAIEKAIMEQwADwsgASgCAEHrqJgBQRogASgCBCgCDBEMAA8LIAEoAgBBhamYAUE+IAEoAgQoAgwRDAAPCyABKAIAQcOpmAFBFCABKAIEKAIMEQwADwsgASgCAEHXqZgBQTQgASgCBCgCDBEMAA8LIAEoAgBBi6qYAUEsIAEoAgQoAgwRDAAPCyABKAIAQbeqmAFBJCABKAIEKAIMEQwADwsgASgCAEHbqpgBQQ4gASgCBCgCDBEMAA8LIAEoAgBB6aqYAUETIAEoAgQoAgwRDAAPCyABKAIAQfyqmAFBHCABKAIEKAIMEQwADwsgASgCAEGYq5gBQRggASgCBCgCDBEMAAu4BAEHfwJAAkACQAJAIAAoAgAOAwABAwALAkAgACgCDCICRQ0AIAJBKGwhAyAAKAIIIQIDQAJAIAIoAgBBB0YNACACIAEQogUgASgCAEUNACABIAIQ/wgLIAJBKGohAiADQVhqIgMNAAsLAkAgACgCGCIBRQ0AIAEoAgAiAhCpBCACQeAAQQgQ1BQgAUEMQQQQ1BQLIABBADYCGAwBCwJAIAAoAgwiAkUNACACQThsIQQgACgCCCEFQQAhAwNAAkACQAJAAkACQCAFIANqIgIoAgAOAwABAgALAkAgAkEIaigCAEEDRw0AIAEgAkEMaigCABCJAQsgAkEoaigCACIGIAEQogUgASgCAEUNAyABIAYQ/wgMAgsgAkEkakEAOgAAAkAgAkEoaiIHKAIAIgZFDQAgBigCACIIEKkEIAhB4ABBCBDUFCAGQQxBBBDUFAsgB0EANgIAIAEtAN8BIQYgAUEAOgDfAQJAIAJBMGooAgAiB0UNACABIAcQiQELIAEgBjoA3wEMAQsgAkEEaigCACIGIAEQogUCQCABKAIARQ0AIAEgBhD/CAsCQCACQRhqIgcoAgAiBkUNACAGKAIAIggQqQQgCEHgAEEIENQUIAZBDEEEENQUCyAHQQA2AgALIAEoAgBFDQAgASACEPUGCyAEIANBOGoiA0cNAAsLAkAgACgCGCIBRQ0AIAEoAgAiAhCpBCACQeAAQQgQ1BQgAUEMQQQQ1BQLIABBADYCGAsgAEEAOgAcCwuMBAEIfyMAQcAAayIEJAACQAJAIAEoAgQiBSgCHCIGIAMgBiADSRsiBw0AQQAhCAwBCyAFKAIYQQ5qIQZBACEIIAIhCQNAIAZBfmotAABBAUcNASAGQX9qLQAAIAktAABHDQEgBi0AAEH/AXEgCUEBai0AAEH/AXFHDQEgBkEQaiEGIAlBAmohCSAHIAhBAWoiCEcNAAsgByEICwJAAkACQCADIAhNDQAgBCABIAgQtwoCQAJAIAQoAgAiCkEqRg0AIABBBGogBEEEckE8/AoAAAwBCyAFKAIcIgZFDQIgBSgCGCAGQQR0aiIGQXxqIgktAABBAUYNAyAJQQE6AAAgBkF9aiACIAhBAXRqIgYvAAA7AABBKiEKIAMgCGsiCUEBRg0AIAVBFGohAiAGIAlBAXRqIQsgBkECaiEJIAUoAhwiCEEEdCEHA0AgCUEBai0AACEDIAktAAAhAQJAIAggAigCAEcNACACEJ8aCyAFKAIYIAdqIgZCgICAgMAANwIAIAZBDmogAzoAACAGQQ1qIAE6AAAgBkEMakEBOgAAIAZBCGpBADYCACAFIAhBAWoiCDYCHCAHQRBqIQcgCUECaiIJIAtHDQALCyAAIAo2AgAgBEHAAGokAA8LQeT7hAFBK0GQ/IQBELchAAtB2PqEAUEPQej6hAEQ5RsAC0H4+oQBQTxBtPuEARC3IQALtQQCB38CfiMAQeAAayICJAAgAC0AKCEDIABBAToAKEEAIQQgAkEANgFaIAJBADYCFCACQoCAgICAATcCDCACQoCAgICAATcCSCACQoCAgIDAADcCOCACQQA2AlAgAkEAOgBEIAJBADYCQCACIAAvAXg7AVggAiAAKAJ0NgJUIAJBACkDoKacASIJNwIYIAJBACkDqKacASIKNwIgIAIgCjcCMCACIAk3AiggAiAALQB+OgBeIABBLGohBQJAA0AgBEHUAEYNASAAIARqQSxqIgYoAgAhByAGIAJBDGogBGoiCCgCADYCACAIIAc2AgAgBEEEaiEEDAALCyAALQB5IQcgAEEBOgB5AkAgASgCCCIERQ0AIARBKGwhBiABKAIEIQQDQCAEIAAQ7gQgBEEoaiEEIAZBWGoiBg0ACwsgAEEAOgB5AkACQAJAIAEoAgwiBCgCAEGAgICAeEcNACAEKAIEIQQgAEEAOgB5IAAtACghBiAAQQA6ACgCQCAEKAIAQRpHDQAgBEEYaigCACEIAkAgBCkDCCIJQgODQgBSDQAgCaciASABKAIAIgFBAWo2AgAgAUF/TA0ECyAFIAkgCBC6DAsgBCAAEG4gACAGOgAoDAELIARBCGooAgAiBkUNACAGQTBsIQYgBEEEaigCACEEA0AgAEEAOgB9IAQgABBpIARBMGohBCAGQVBqIgYNAAsLIAAgBzoAeSAFIAJBDGoQnAQgACADOgAoIAJB4ABqJAAPCwALpwQBBH8jAEGAAWsiBSQAIAEtAMgBIQZBACEHAkADQCADIAdGIggNASACIAdqLQAAIAZGDQEgB0EBaiEHDAALCwJAAkACQAJAAkACQAJAIAZB3n5qDgICAAELIAAgASgCcBCtHjYCBAwCCyAIDQMgBEUNAiAGQZQBRw0CIAEQuQ5B/wFxQQJHDQIgAEGkAToAAUEAIQcMBAsgARDPFCEHIAEQ5REgACAHNgIEC0EBIQcMAgsgAS0AgQFBIHFFDQAgASgCeCEGIAVBCGogARDNBSABIAZBAXI2AnggARDlESABLQDIASEIAkACQAJAAkACQAJAAkACQCABLQDJAQ0AIAhBtX9qIgRBH00NAQwCCyAIQbV/aiIEQR9LDQJBASAEdEGBgIKQeHENAwwCC0EBIAR0QYGAgpB4cQ0CCyAIQUBqQQNJDQECQCAIQX5qDgMCAQIACwJAIAhBZ2oOBAIBAQIACyAIQQ9GDQELIAhBjX9qQf8BcUEtSw0BCyAFQYACOwF4DAELIAVBADoAeCAFIAhBtH9qQf8BcSIIQSdJOgB5IAhBJksNAQsgASABKAJ4QX5xIAZBAXFyNgJ4IAVB+ABqENMhIAVBCGoQsyICQCAHIANPDQAgACACIAdqLQAAOgABQQAhBwwDCyAHIANB4P6aARD1FgALIAEgBUEIahC2FCAFQfgAahDTIQsgAEGkAToAAUEAIQcLIAAgBzoAACAFQYABaiQAC8YEAgV/An4jAEEwayIDJAACQCABLQDIASIEQQNHDQAgA0EYaiABIAEoAsABQQAQuCIgAUHAAWoiBCADKAIgNgIIIAQgAykCGDcCACABLQDIASEECyABKALEASEFIAEoAsABIQYCQAJAAkACQAJAAkACQAJAIARB/wFxIgdBuX9qDgIBAgALIAdBogFGDQIgA0EYakEEciAEENclIANBAzYCLCADQbSFmwE2AiggA0GwgICAeDYCGCABKALAASABKALEASADQRhqEMAbIQQCQCABLQDIAUGiAUcNACABEM8UIQYgARDlESABIAYQhhQLIABBAjoAGCAAIAQ2AgAMBgsgAyABIAYgBUF+aiIEEMwaIAMoAgAgAygCBBCGGSEIIANBGGogARDnEyABEOURAkAgAygCGA0AIAMpAyAhCQwECyADIAMoAhwiATYCFAJAIAINACAAQQI6ABggACABNgIAIAgQmiEMBgsgA0EUahCbIUIAIQkMAwsgA0EIaiABIAYgBUF/aiIEEMwaIAMoAgggAygCDBCGGSEIIANBGGogARDnEyABEOURAkAgAygCGA0AIAMpAyAhCQwCCyADIAMoAhwiATYCFAJAIAINACAAQQI6ABggACABNgIAIAgQmiEMBQsgA0EUahCbIUIAIQkMAQsgARDPFCEEIAEQ5REgAEECOgAYIAAgBDYCAAwDC0EBIQEMAQtBACEBCyAAIAE6ABggACAJNwMQIAAgBDYCDCAAIAY2AgggACAINwMACyADQTBqJAALiQQCCn8CfiMAQcAAayICJAAgAiABNgIMIAAoAgwh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QCACKAJQIgRBMkcNACAAQQA2AgAgACAFNgIEDAMLIAJBGGogAkHYAGpBOPwKAAAgBEEORw0BQQRBFBDoICIEIAU2AgAgBCACKQMYNwIEIAQgAikDIDcCDAsCQCABEL4MIgFFDQAgAEEANgIAIAAgATYCBCAEEKMjDAILIAAgBDYCBCAAIAM2AgAMAgtBiPOaAUEoQdiCmwEQtyEACyADEOsgCyACQZABaiQAC6EEAQN/IwBBEGsiAiQAIAAoAgAhAwJAAkACQAJAAkAgASgCAA4FBAABAgMECyABKAIEQQFHDQMgASgCCCADEKYBDAMLIAEoAgQgAxCmAQwCCwJAAkACQCABKAIEIgQtAGwiAEF9akEBIABBAksbQf8BcQ4DAAECAAsgBEEANgJQDAELIARBwABqIQECQCAAQQJHDQADQCABKAIYIgEtACxBAkYNAAsLIAFBADYCKAsCQCAEQYQBaigCACIBRQ0AIAFB2ABsIQAgBEGAAWooAgBBBGohAQNAAkACQAJAAkACQCABQXxqKAIADgYEAQIDBAAECyABKAIAIAMQpgEMAwsgASgCAEEBRw0CIAFBBGooAgAgAxCmAQwCCyABIAMQ0QYMAQsgASADEPwOCyABQdgAaiEBIABBqH9qIgANAAsLIARBlAFqKAIAIQEgBEGYAWooAgAhACACIAM2AgwCQCAARQ0AIABBKGwhAANAIAJBDGogARCcByABQShqIQEgAEFYaiIADQALCyAELQA8IgBBBkYNAQJAAkAgAEF9akEBIABBAksbQf8BcQ4DAAEDAAsgBEEANgIgDAILIARBEGohAQJAIABBAkcNAANAIAEoAhgiAS0ALEECRg0ACwsgAUEANgIoDAELIAEoAgwiAEUNACAAQShsIQAgASgCCCEBA0AgASADENsSIAFBKGohASAAQVhqIgANAAsLIAJBEGokAAucBAIGfwJ+IwBBMGsiAiQAAkACQAJAIAAtADwNACAALQAoQf8BcUUNAQsgAiAANgIoIAIgAC0AODoALEEAIQMgAkEAOwAtIAJBACkDoKacASIINwMIIAJBACkDqKacASIJNwMQIAIgCDcDGCACIAk3AyAgAkEIakEQaiEEAkAgASgCCCIFRQ0AIAVBOGwhBSABKAIEIQEDQAJAAkACQAJAAkACQAJAAkACQCABIANqIgYoAgBB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/////////x9WIgYbIAVqIgRB/g9LDQNCACABQgGIQv/////////3/wCDIAYbIQEMAQtBACEEIAVBw3dJDQEgCEGCeCAFa62IIgFCAYMgAXwiAUL/////////D1YhBCABQgGIIQELIAAgATcDAAsgACAENgIICyADQSBqJAALuAMBBn8jAEEgayICJAACQAJAAkACQAJAAkAgASgCCCIDRQ0AIAEoAgQiASADQTBsIgNqIQQDQCABKAIAQRFHDQIgAUEIaigCAEF/akEBSw0DIAEgABDdAiABQTBqIQEgA0FQaiIDDQALC0EEIQNBACEFDAMLIAFBMGohAwwBCyABQTBqIQMLIAJBFGpBBEEEQQQQgw9BASEFIAIoAhghBiACKAIUQQFGDQEgAigCHCIHIAE2AgAgAkEBNgIQIAIgBzYCDCACIAY2AggCQCADIARGDQBBASEFA0AgAyEBAkADQCABKAIAQRFHDQEgAUEIaigCAEF/akEBSw0BIAEgABDdAiABQTBqIgMhASADIARHDQAMAwsLIAFBMGohAwJAIAUgAigCCEcNACACQQhqIAVBAUEEQQQQ0hogAigCDCEHCyAHIAVBAnRqIAE2AgAgAiAFQQFqIgU2AhAgAyAERw0ACwsgBUECdCEEIAIoAgwhAyACKAIIIQVBACEBA0AgAyABaigCACAAEN0CIAQgAUEEaiIBRw0ACwsgBSADQQRBBBDPEyACQSBqJAAPCyAGIAIoAhwQ/CAAC4YEAgN/A34jAEHwCmsiAyQAAkACQAJAIAEtAEUNAEIAIQZCAiEHDAELIANCADcD6AUgA0IANwPgBSADQYKEiBA2ALkGIANBADoAuAYgA0ECNgKwBiADQQI2AqgGIANBADYCoAYgA0EDOgCcBiADQQI6AL0GIANBAjoAjAUgAyADQeAFaiADQYAFahC6GCADQQA6AFkgA0GABWogA0HAAPwKAAAgA0KBgICAoAE3A9AFIANCgYCAgDA3A8gFIAMpA1ghBiADIAEoAgxBgICAASABKAIIGzYCxAUgAS0ASSEBIANBATYCwAUgA0EBIAEgAUECRhutQhCGIAZC//+DgICAQIOEQoCAgAiENwPYBSADQeAAaiIEEO4LIANCADcDCCADQgA3AwAgA0GChIgQNgJYIANBAjYCUCADQQI2AkggA0EANgJAIANBAzoA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QQZGDQEgACAEQRBqEJcKDAELIAEoAgwiA0UNACADQShsIQMgASgCCCEBA0AgASAAEIYQIAFBKGohASADQVhqIgMNAAsLIAJBEGokAAuzAwECfwJAAkACQCAAKAIAIgJBBEYNAAJAAkACQCACDgQDAAECAwsgACgCBEEBRw0CIAEtAARBAUcNAgJAAkAgACgCCCICKAIAIgBBdGpBByAAQQtLG0Fyag4DBgABBQsgAigCCEEFRg0FDAQLIAIoAgxFDQMgAUEAOgAEDwsCQCAAKAIEIgMtAGxBAkcNACADQcAAaiEAA0AgACgCGCIALQAsQQJGDQALCwJAIANBhAFqKAIAIgBFDQAgAEHYAGwhAiADQYABaigCACEAA0ACQAJAIAAoAgBBBUcNACABQQA6AAQMAQsgACABEK4ICyAAQdgAaiEAIAJBqH9qIgINAAsLAkAgA0GYAWooAgAiAEUNACAAQShsIQIgA0GUAWooAgAhAANAIAAgARC8BSAAQShqIQAgAkFYaiICDQALCyADLQA8IgBBBkYNASAAQQJHDQEgA0EQaiEAA0AgACgCGCIALQAsQQJGDQAMAgsLIAAoAgwiAkUNACACQShsIQIgACgCCCEAA0AgACABELwFIABBKGohACACQVhqIgINAAsLDwsgAiABEPkBDwsgAUEAOgAEC7QDAQh/IwBBMGsiAyQAAkACQAJAAkAgASgCACIELQAUQX9qQf8BcUECSQ0AIANBCGogAi0AGEECdCgCpOCcAS0AABDXHiADQRRqIAMoAgwiBSADKAIIIgZrQQF2IgdBAUECEKwRIAMoAhghCCADKAIUDQFBACEJIANBADYCLCADIAMoAhwiCjYCKCADIAg2AiQCQCAGIAVGDQBBACEJA0AgCkEBaiAGLQAAIgggBkEBai0AACIFIAggBUsbOgAAIAogCCAFIAggBUkbOgAAIApBAmohCiAGQQJqIQYgByAJQQFqIglHDQALCyADIAk2AiwgA0EUaiADQSRqENEYIAItABkNAgwDC0HZ6okBQSlBhOuJARC3IQALIAggAygCHBD8IAALIANBFGoQ+AULAkACQAJAIAQtABdFDQAgAygCHCIGRQ0AIAMoAhggBkEBdGoiBkF+akUNACAGQX9qLAAAQQBIDQELIAAgAykCHDcCDCAAIAMpAhQ3AgQgAEGAgICAeDYCAAwBCyAAIAEoAgQgASgCCCACQQEQqRAgAygCFCADKAIYQQFBAhDXEwsgA0EwaiQAC+MDAgV/AX4jAEEwayIDJAAgASgCsAEhBAJAAkACQCABLQC4ASIFQQJHDQAgAUGwAWohBQJAAkAgASgCiAEiBkELRw0AIANBEGogARDGAQwBCyABQQs2AogBIAMgASkCmAE3AxAgAyABKAKgATYCGCABQYwBaiEHAkAgASgCCEEKRg0AIAFBCGoQvAsLIAEgBjYCCCABIAcpAgA3AgwgASAHKAIINgIUCyABKQOwASEIIAUgAykDEDcCACAFIAMoAhg2AgggASAINwOoASABIAEoAngiBUH/////fXE2AnggA0EQaiABIAJBAxCkBiABIAU2AnggAygCFCEFIAMoAhAiAkGAgICAeEcNASAAQYCAgIB4NgIAIAAgBTYCBAwCCyABKAK0ASECIANBBGogBRDGJSADQY8CrUIghkHe9JoBrYQ3AyggA0EQakHNlYABIANBKGoQzQggAyADKQIENwIcIAMgAygCDDYCJCAEIAIgA0EQahDAGyEFAkAgAS0AuAFBogFHDQAgASABEIUOEJMJCyAAQYCAgIB4NgIAIAAgBTYCBAwBCyADKAIYIQYgAEEANgIUIAAgBDYCDCAAIAY2AgggACAFNgIEIAAgAjYCACAAIAEoAqwBNgIQCyADQTBqJAAL2gMBAn8jAEEwayICJAACQAJAAkAgARDJEg0AIAEQng5FDQELIAJBCGogARCjDSAAIAIoAgggAigCDBCAHCACIAEQow0gACACKAIAIAIoAgQQyg8MAQsCQAJAAkACQAJAAkACQAJAIAEoAgAOCAABAgMEBQYHAAsgAUEgaiAAEIMCDAcLIAFBIGogABDLDQwGCyABQQRqIAAQqyUMBQsgAUEEaiAAEK4lDAQLIAFBBGogABDtCQwDCyAAIAEoAgQiASgCACIDIAFBBGooAgAiARCAHCAAIAMgARDKDwwCC0EAKALslZ0BIgBFDQEgAkEUaiAAIAEoAgQiAUEYaigCACABQRxqKAIAQcD3mgFBMxDcEiACQSRqQer2mgFBERC1FCACQQA2AiAgAigCGCIBENwgIAEgAikCKDcCCCABIAIpAiA3AgAgAkEUahDvAiACQRRqEJ0ODAELQQAoAuyVnQEiAEUNACACQRRqIAAgASgCBCIBQcgAaigCACABQcwAaigCAEHz95oBQcQAENwSIAJBJGpB6vaaAUERELUUIAJBADYCICACKAIYIgEQ3CAgASACKQIoNwIIIAEgAikCIDcCACACQRRqEO8CIAJBFGoQnQ4LIAJBMGokAAvjAwIFfwF+IwBBMGsiAiQAIAEoArABIQMCQAJAAkAgAS0AuAEiBEECRw0AIAFBsAFqIQQCQAJAIAEoAogBIgVBC0cNACACQRBqIAEQxgEMAQsgAUELNgKIASACIAEpApgBNwMQIAIgASgCoAE2AhggAUGMAWohBgJAIAEoAghBCkYNACABQQhqELwLCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhByAEIAIpAxA3AgAgBCACKAIYNgIIIAEgBzcDqAEgASABKAJ4IgRB/////3lxQYCAgIAEcjYCeCACQRBqIAFBAEEDEKUGIAEgBDYCeCACKAIUIQQgAigCECIFQYCAgIB4Rw0BIABBgICAgHg2AgAgACAENgIEDAILIAEoArQBIQUgAkEEaiAEEMYlIAJBjwKtQiCGQd70mgGthDcDKCACQRBqQc2VgAEgAkEoahDNCCACIAIpAgQ3AhwgAiACKAIMNgIkIAMgBSACQRBqEMAbIQQCQCABLQC4AUGiAUcNACABIAEQhQ4QkwkLIABBgICAgHg2AgAgACAENgIEDAELIAIoAhghBiAAIAM2AgwgACAGNgIIIAAgBDYCBCAAIAU2AgAgACABKAKsATYCEAsgAkEwaiQAC6MDAQV/IwBBIGsiAiQAQX8gAEEDbCIAQX9qZ3ZBAWpBASAAQQFLGyIDQQZ0IQBBACEEAkACQAJAIANB////H0sNACAAQcD///8HSw0AQcAAIQVBACEGAkAgAEUNAEHAACEEIAJBCGpBwAAgABDkHyADIQYgAigCCCIFRQ0BCyACIAU2AhggAiAGNgIUQQwhBEEAIQACQANAIAIgADYCHCADIABGDQECQCAAIAIoAhRHDQAgAkEUahCdCyACKAIYIQULIAUgBGoiBiAAQQFqIgA2AgAgBkF8akEANgIAIAZBdGpCADcDACAEQcAAaiEEDAALCyACKAIUIgAgA00NAiAAQQZ0IQAgAigCGCEEAkAgAw0AQcAAIQYgBEHAACAAEOghDAILIAQgAEHAACADQQZ0IgUQuwQiBg0BQcAAIAUQ/CAACyAEIAAQ/CAACyACIAY2AhgLIAIoAhghBCACQQRBEBDkHwJAIAIoAgAiAEUNACAAIAE2AgwgACADNgIEIAAgBDYCACAAQR8gA2drNgIIIAJBIGokACAADwtBBEEQEKAkAAvoAwIEfwF+IwBB0ABrIgIkAAJAAkACQAJAAkACQAJAAkAgASgCAA4HBAEAAgADBgALIABBDDYCACAAIAEpAyA3AyggACABKQMYNwMgIAAgASkDEDcDGCAAIAEpAwg3AxAgACABKQMANwMIDAYLIAIgASkCDDcDCCACIAEpAhQ3AxAgAiABKAIcNgIYIAEoAgghAyABKAIEIQFBCyEEQQAhBQwDCyACIAEpAgw3AwggAiABKQIUNwMQIAIgASgCHDYCGCABKAIIIQMgASgCBCEBQQshBEEBIQUMAgsgAEEKNgIAIAAgASkCBDcCBCABEKIIDAMLIAIgASkCEDcDCCACIAEpAhg3AxAgAiABKQIgNwMYIAEoAgwhAyABKAIIIQFBACEECyAAIAM2AgwgACABNgIIIAAgBTYCBCAAIAQ2AgAgACACKQMINwIQIAAgAikDEDcCGCAAIAIpAxg3AiAMAQsgAkEgaiABKAIEEP4HIAIoAiQhAQJAIAIoAiAiA0ELRg0AIAAgAikDMDcDECAAIAIpAzg3AxggACACKQNANwMgIAIpAyghBiAAIAIpA0g3AyggACAGNwMIIAAgATYCBCAAIAM2AgAMAQsgACABNgIMIABBBjYCCCAAQQw2AgALIAJB0ABqJAAL1AMCAn8CfgJAAkACQAJAAkACQAJAIAAoAgAiAkF7akEEIAJBBEsbDgYAAQIDBAUACyAAQQA6ABwMBQsCQCAAKAIIQQNHDQAgASAAKAIMEIkBCyABIAAoAigQiQEMBAsgAEEAOgAkIAEgACgCKBCJAQwDCwJAIAAoAghBA0cNACABIAAoAgwQiQELAkAgACgCSCICRQ0AIAIoAgAiAxCpBCADQeAAQQgQ1BQgAkEMQQQQ1BQLIABBADYCSCAAKAIoQYCAgIB4Rg0CIAEgAEEoahDUAwwCCwJAIAAoAiBBB0YNACAAQSBqENwLCyAAQQc2AiACQCACQQNHDQAgASAAKAIEEIkBCyAAQcgAaiECIAAoAmgiAyABEKIFAkAgASgCAEUNACABIAMQ/wgLIAIoAgBBgICAgHhGDQEgASACENQDDAELAkAgACgCCEEDRw0AIAEgACgCDBCJAQsgASAAKAIoEKoGCwJAIAEoAgBFDQAgACgCAEEFRw0AIAEgAEEIahCABiIBRQ0AIAApAxAhBCAAQgA3AxAgACkDCCEFIABCATcDCCAAQgA3ABUgABCVCSAAIAE2AiggACAENwMYIAAgBTcDECAAQQA2AgggAEEGNgIACwvZAwIEfwF+IwBBIGsiAiQAIAEoArABIQMCQAJAAkACQCABLQC4ASIEQbV/aiIFQR9LDQBBASAFdEGBgIKQeHENAQsgBEG0f2pB/wFxQdUASQ0AAkACQCAEQckARw0AIAEtAHlBEHENAQsgASgCtAEhBSACQcKAgIB4NgIIIAMgBSACQQhqEMAbIQMCQCABLQC4AUGiAUcNACABEMQUIQUgARCyECABIAUQkwkLIABCADcDACAAIAM2AggMAwsgASkDCCEGIAFBCjYCCCACIAEpAxA3AxAgAiAGNwMIAkACQCAGpyIFQQpGDQAgBUECRg0BIAJBCGoQvAsLQYjzmgFBKEGwh5sBELchAAsgAUGwAWohBCACKQMQIQYCQAJAIAEoAogBIgVBC0cNACACQQhqIAEQxgEgASgCsAEhBQwBCyABQQs2AogBIAEgBTYCCCABIAEpAowBNwIMIAEgASgClAE2AhQgAiABKQKYATcDCCACIAEoAqABNgIQIAMhBQsgASAFNgKoASABIAEoArQBIgU2AqwBIAQgAikDCDcCACAEIAIoAhA2AggMAQsgARCwCiEGIAEoAqwBIQULIAAgBTYCDCAAIAM2AgggACAGNwMACyACQSBqJAALsAMBAn8CQAJAAkACQAJAAkAgACgCAA4EAwABAgMLIAAoAgRBAUcNAiABLQAEQQFHDQICQAJAIAAoAggiAigCACIAQXRqQQcgAEELSxtBcmoOAwYAAQULIAIoAghBBUYNBQwECyACKAIMRQ0DIAFBADoABA8LAkAgACgCBCIDLQBsQQJHDQAgA0HAAGohAANAIAAoAhgiAC0ALEECRg0ACwsCQCADQYQBaigCACIARQ0AIABB2ABsIQIgA0GAAWooAgAhAANAAkACQAJAIAAoAgBBfGoOAgIAAQsgAUEAOgAEDAELIAAgARDcAwsgAEHYAGohACACQah/aiICDQALCwJAIANBmAFqKAIAIgBFDQAgAEEobCECIANBlAFqKAIAIQADQCAAIAEQvAUgAEEoaiEAIAJBWGoiAg0ACwsgAy0APCIAQQZGDQEgAEECRw0BIANBEGohAANAIAAoAhgiAC0ALEECRg0ADAILCyAAKAIMIgJFDQAgAkEobCECIAAoAgghAANAIAAgARDzBCAAQShqIQAgAkFYaiICDQALCw8LIAIgARD5AQ8LIAFBADoABAvAAwEDfwJAAkACQAJAAkACQCAAKAIADgcFAAECAwUEBQsgACgCDCICRQ0EIAJBKGwhAiAAKAIIIQADQAJAIAAoAgBBB0YNACAAIAEQzwoLIABBKGohACACQVhqIgINAAwFCwsgACgCBCABEM8KDwsgACgCDCICRQ0CIAAoAggiACACQThsaiEDA0ACQAJAAkACQCAAKAIADgMAAQIACyAAQQhqIAEQ3AwMAgsgACgCMCICRQ0BIAEgAhDKAQwBCwJAAkACQAJAAkAgACgCBCICKAIADgcFAAECAwUEBQsgAkEMaigCACIERQ0EIARBKGwhBCACQQhqKAIAIQIDQAJAIAIoAgBBB0YNACACIAEQzwoLIAJBKGohAiAEQVhqIgQNAAwFCwsgAigCBCABEM8KDAMLIAJBDGooAgAiBEUNAiAEQThsIQQgAkEIaigCACECA0AgASACEIgMIAJBOGohAiAEQUhqIgQNAAwDCwsgAigCBCABEM8KIAEgAigCCBDKAQwBCyABIAIoAgQQygELIABBOGoiACADRw0ADAMLCyAAKAIEIAEQzwogASAAKAIIEMoBDwsgASAAKAIEEMoBCwvyAgEFf0EAIQICQCABQc3/eyAAQRAgAEEQSxsiAGtPDQAgAEEQIAFBC2pBeHEgAUELSRsiA2pBDGoQigEiAUUNACABQXhqIQICQAJAIABBf2oiBCABcQ0AIAIhAAwBCyABQXxqIgUoAgAiBkF4cSAEIAFqQQAgAGtxQXhqIgFBACAAIAEgAmtBEEsbaiIAIAJrIgFrIQQCQCAGQQNxRQ0AIAAgBCAAKAIEQQFxckECcjYCBCAAIARqIgQgBCgCBEEBcjYCBCAFIAEgBSgCAEEBcXJBAnI2AgAgAiABaiIEIAQoAgRBAXI2AgQgAiABEMQHDAELIAIoAgAhAiAAIAQ2AgQgACACIAFqNgIACwJAIAAoAgQiAUEDcUUNACABQXhxIgIgA0EQak0NACAAIAMgAUEBcXJBAnI2AgQgACADaiIBIAIgA2siA0EDcjYCBCAAIAJqIgIgAigCBEEBcjYCBCABIAMQxAcLIABBCGohAgsgAguyAwEBfyMAQTBrIgQkACAEIAM6ABMgBEEgakEIQQhBMBCDDyAEKAIkIQMCQAJAAkACQAJAAkACQCAEKAIgQQFGDQAgBEEANgIcIAQgBCgCKDYCGCAEIAM2AhQgAkUNAiABLQDIAUH/AXFBwABHDQIgASgCxAEiAyABKALAASICa0EMRw0CIARBCGogASACIAMQzBogBCgCDEEMRw0CAkAgBCgCCCIDQf/jmgFBDBCyGA0AIAQgBEEvajYCJCAEIARBE2o2AiAMAgsgA0GL5JoBQQwQshghAyAEIARBL2o2AiQgBCAEQRNqNgIgIANFDQEMAwsgAyAEKAIoEPwgAAsgASABKAJ4IgJBCHI2AnggBEEgaiABIARBFGoQqwQhAyABIAI2AnggA0UNAgwDCyAEIARBL2o2AiQgBCAEQRNqNgIgCyAEQSBqIAEgBEEUahCrBCIDDQELAkAgAS0AyAFBowFGDQAgBC0AE0H/AXFBpAFGDQAgARDlEQsgACAEKAIcNgIIIAAgBCkCFDcCAAwBCyAAQYCAgIB4NgIAIAAgAzYCBCAEQRRqEKchCyAEQTBqJAALsgMBAX8jAEEwayIEJAAgBCADOgATIARBIGpBCEEIQTgQgw8gBCgCJCEDAkACQAJAAkACQAJAAkAgBCgCIEEBRg0AIARBADYCHCAEIAQoAig2AhggBCADNgIUIAJFDQIgAS0AyAFB/wFxQcAARw0CIAEoAsQBIgMgASgCwAEiAmtBDEcNAiAEQQhqIAEgAiADEMwaIAQoAgxBDEcNAgJAIAQoAggiA0H/45oBQQwQshgNACAEIARBL2o2AiQgBCAEQRNqNgIgDAILIANBi+SaAUEMELIYIQMgBCAEQS9qNgIkIAQgBEETajYCICADRQ0BDAMLIAMgBCgCKBD8IAALIAEgASgCeCICQQhyNgJ4IARBIGogASAEQRRqEI0EIQMgASACNgJ4IANFDQIMAwsgBCAEQS9qNgIkIAQgBEETajYCIAsgBEEgaiABIARBFGoQjQQiAw0BCwJAIAEtAMgBQaMBRg0AIAQtABNB/wFxQaQBRg0AIAEQ5RELIAAgBCgCHDYCCCAAIAQpAhQ3AgAMAQsgAEGAgICAeDYCACAAIAM2AgQgBEEUahCsIQsgBEEwaiQAC9cDAQN/IwBBsANrIgMkACADIAEQmwoiBDYCDAJAAkACQAJAAkACQCAEQd0ARw0AIANBEGogAhDFESADQegAaiABKAIAIgQgA0EQahCgBiAEKAIgDQQgBEF/NgIgIAQoAiwiAkUNASAEIAJBf2oiAjYCLCAEKAIoIAJBmAFsaiICKAIAIgVB9/+7f2oOAgIBAwsgA0EMakG01YkBQazWiQEQxhwAC0HI1YkBQc0AQfDViQEQ5BsAC0GA1okBQTNBnNaJARDkGwALIANBwAFqIAJB9ABqQST8CgAAIAMgBTYC5AEgA0HkAWpBBGogAkEEakHwAPwKAAAgARClCRogAyAEKAJYNgLQAiADIAQpAlA3AsgCIANB5AFqEKMEIANB5AFqIANB6ABqQdgA/AoAAAJAAkAgBCgCLEUNAEH0ABCKASIBRQ0DIAEgA0HkAWpB9AD8CgAAIANBhoDEADYC2AIgAyABNgLcAiADQcABaiADQdgCahCzCSAAQQRqIANBwAFqQST8CgAAIABBiYDEADYCAAwBCyAAIANB5AFqQfQA/AoAACADQcABahCWGwsgBCAEKAIgQQFqNgIgIANBsANqJAAPC0G41YkBEIEeAAtBBEH0ABCgJAALpwMBA38jAEEQayICJAAgACgCACEDAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRBAUcNAyABKAIIIAMQvQEMAwsgASgCBCADEL0BDAILIAEoAgQiBEHAAGogAxCWEwJAIARBhAFqKAIAIgBFDQAgAEHYAGwhASAEQYABaigCACEAA0ACQAJAAkAgACgCAEF8ag4CAgABCyAAQQRqKAIAIAMQvQEMAQsgACADEKEJCyAAQdgAaiEAIAFBqH9qIgENAAsLAkAgBCgCeCIARQ0AIABBCGooAgAiAUUNACABQQJ0IQEgAEEEaigCACEAA0AgACgCACADEJkCIABBBGohACABQXxqIgENAAsLAkAgBEGYAWooAgAiAEUNACAAQShsIQEgBEGUAWooAgAhAANAIAAgAxDIByAAQShqIQAgAUFYaiIBDQALCyAELQA8QQZGDQEgBEEQaiADEJYTDAELIAEoAgghACABKAIMIQEgAiADNgIMIAFFDQAgAUEobCEDA0AgAkEMaiAAEL0IIABBKGohACADQVhqIgMNAAsLIAJBEGokAAuWAwEDfyMAQRBrIgMkAAJAAkAgAg0AIABBAjoAAAwBCwJAAkACQAJAIAEsAAAiBEF/Sg0AAkAgBEFASQ0AAkACQAJAIARBYE8NAEECIQUMAQsgBEFwTw0BQQMhBQsgBSACTQ0EDAULIARBeEkNAgsgACAEOgABIABBAToAAAwECyAAIARB/wFxNgIEIABBADoAAAwDC0EEIQUgAkEESQ0BCyADQQRqIAEgBRDUBQJAIAMoAgRBAUcNACAAIAQ6AAEgAEEBOgAADAILAkAgAygCDEUNAAJAAkAgAygCCCIBLAAAIgJBf0wNACACQf8BcSECDAELIAEtAAFBP3EhBCACQR9xIQUCQCACQV9LDQAgBUEGdCAEciECDAELIARBBnQgAS0AAkE/cXIhBAJAIAJBcE8NACAEIAVBDHRyIQIMAQsgBEEGdCABLQADQT9xciAFQRJ0QYCA8ABxciICQYCAxABGDQELIAAgAjYCBCAAQQA6AAAMAgtBvO6JARDDIwALIAAgBDoAASAAQQE6AAALIANBEGokAAuEAwIEfwF+IwBB0ABrIgMkACADIAEgAkGoy5cBQQEQlwMDQCADQcQAaiADEN8DIAMoAkQiBEUNAAsCQAJAAkAgBEF/ag4CAAEACyADKAJIIQQMAQsgAiEEC0IAIQcCQAJAIAIgBGtBEEsNAEIAIQcCQCACIARGDQAgASACaiEFIAEgBGohBEIAIQcDQAJAAkAgBCwAACICQX9MDQAgBEEBaiEEIAJB/wFxIQIMAQsgBC0AAUE/cSEBIAJBH3EhBgJAIAJBX0sNACAGQQZ0IAFyIQIgBEECaiEEDAELIAFBBnQgBC0AAkE/cXIhAQJAIAJBcE8NACABIAZBDHRyIQIgBEEDaiEEDAELIAFBBnQgBC0AA0E/cXIgBkESdEGAgPAAcXIhAiAEQQRqIQQLIAJBv39qQV9xQQpqIAJBUGogAkE5SxsiAkEQTw0DIAdCBIYgAq2EIQcgBCAFRw0ACwsgACAHNwMIQgEhBwsgACAHNwMAIANB0ABqJAAPC0Gsy5cBEMMjAAuxAwEEfwJAAkACQAJAAkAgACgCAA4FBAABAgMECyAAKAIEQQFHDQMgACgCCCABELsBDwsgACgCBCABELsBDwsgASAAKAIEIgJBwABqELsKAkAgAkGEAWooAgAiAEUNACAAQdgAbCEDIAJBgAFqKAIAIQADQAJAAkACQCAAKAIAQXxqDgICAAELIABBBGooAgAgARC7AQwBCyAAIAEQ3AULIABB2ABqIQAgA0Gof2oiAw0ACwsCQCACQZgBaigCACIARQ0AIAJBlAFqKAIAIgQgAEEobGohBQNAAkACQAJAAkACQCAEKAIADgUEAAECAwQLIAQoAgRBAUcNAyAEKAIIIAEQuwEMAwsgBCgCBCABELsBDAILIAEgBCgCBBDfDgwBCyAEQQxqKAIAIgBFDQAgAEEobCEDIARBCGooAgAhAANAIAEgABD3BiAAQShqIQAgA0FYaiIDDQALCyAEQShqIgQgBUcNAAsLIAItADxBBkYNASABIAJBEGoQuwoPCyAAKAIMIgNFDQAgA0EobCEDIAAoAgghAANAIAEgABD3BiAAQShqIQAgA0FYaiIDDQALCwugAwEGfyMAQRBrIgMkAAJAAkACQCACKAIEIgRFDQAgACACKAIAIAQgASgCDBEMAA0BCwJAIAIoAgwiBA0AQQAhAgwCCyACKAIIIgUgBEEMbGohBgNAAkACQAJAAkACQAJAAkACQCAFLwEADgMAAQIACyAFKAIEIgJBwQBJDQIgAUEMaigCACEEA0AgAEGchYIBQcAAIAQRDAANCSACQUBqIgJBwABLDQAMBAsLIAUvAQIhAiADQQA6AAwgA0EANgIIIAINA0EBIQcMBAsgACAFKAIEIAUoAgggAUEMaigCABEMAEUNBAwGCyACRQ0DIAFBDGooAgAhBAsgAEGchYIBIAIgBBEMAA0EDAILIAJB9v8XaiACQZz/H2pxIAJBmPg3aiACQfCxH2pxc0ERdkEBaiEHCyAHIQQDQCAEQX9qIgQgA0EIamogAiACQf//A3FBCm4iCEEKbGtBMHI6AAAgCCECIAQNAAsgACADQQhqIAcgAUEMaigCABEMAA0CCyAFQQxqIgUgBkcNAAtBACECDAELQQEhAgsgA0EQaiQAIAILqAMBA38jAEEQayICJAAgACgCACEDAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRBAUcNAyADLQAADQMgASgCCCADEJgBDAMLIAMtAAANAiABKAIEIAMQmAEMAgsCQCABKAIEIgQtAGxBAkcNACAEQcAAaiEAA0AgACgCGCIALQAsQQJGDQALCwJAIARBhAFqKAIAIgBFDQAgAEHYAGwhASAEQYABaigCACEAA0ACQAJAAkAgACgCAEF8ag4CAgABCyADLQAADQEgAEEEaigCACADEJgBDAELIAAgAxC7CQsgAEHYAGohACABQah/aiIBDQALCwJAIARBmAFqKAIAIgBFDQAgAEEobCEBIARBlAFqKAIAIQADQCAAIAMQrQcgAEEoaiEAIAFBWGoiAQ0ACwsgBC0APCIAQQZGDQEgAEECRw0BIARBEGohAANAIAAoAhgiAC0ALEECRg0ADAILCyABKAIIIQAgASgCDCEBIAIgAzYCDCABRQ0AIAFBKGwhAwNAIAJBDGogABDCCCAAQShqIQAgA0FYaiIDDQALCyACQRBqJAALkAMBCX8jAEEQayICJAACQAJAAkAgASgCBCIDIAFBdGooAgAgASgCCCIEIAFBeGooAgAiBSAEIAVJGxCyGCIGIAQgBWsgBhsiBQ0AQQAhByABLQAMIAFBfGotAABJDQEMAgsgBUF/Sg0BIAEtAAwhBwsgAS0ADyEFIAEvAA0hCCABIAFBcGoiBikCCDcCCCABKAIAIQkgASAGKQIANwIAIAIgCDsBDCACIAU6AA4CQCAGIABGDQAgAUFgaiEBIAdB/wFxIQoCQANAAkACQCADIAFBBGooAgAgBCABQQhqKAIAIgUgBCAFSRsQshgiCCAEIAVrIAgbIgUNACAKIAFBDGotAABJDQEMBAsgBUF/Sg0CCyAGQXBqIQYgAUEQaiIFIAEpAgg3AgggBSABKQIANwIAIAEgAEchBSABQXBqIgghASAFDQALIAhBEGohBgwBCyABQRBqIQYLIAYgBzoADCAGIAQ2AgggBiADNgIEIAYgCTYCACAGIAIvAQw7AA0gBiACLQAOOgAPCyACQRBqJAALlwMBBn8jAEEQayICJAACQAJAAkACQAJAAkAgASgCACIDIAEoAgQiBEYNACABKAIIIQUDQCABIANBMGoiBjYCACADKAIAQRFHDQIgA0EIaigCAEF/akEBSw0DIAMgBRDdAiAGIQMgBiAERw0ACwsgAEEANgIIIABCgICAgMAANwIADAMLIANBMGohBgwBCyADQTBqIQYLIAJBBGpBBEEEQQQQgw8gAigCCCEBIAIoAgRBAUYNASACKAIMIgcgAzYCACACQQE2AgwgAiAHNgIIIAIgATYCBAJAIAYgBEYNAEEBIQEDQCAGIQMCQANAIAMoAgBBEUcNASADQQhqKAIAQX9qQQFLDQEgAyAFEN0CIANBMGoiBiEDIAYgBEcNAAwDCwsgA0EwaiEGAkAgASACKAIERw0AIAJBBGogAUEBQQRBBBDSGiACKAIIIQcLIAcgAUECdGogAzYCACACIAFBAWoiATYCDCAGIARHDQALCyAAIAIoAgw2AgggACACKQIENwIACyACQRBqJAAPCyABIAIoAgwQ/CAAC8YDAQF/IwBBEGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiACgCAA4LAAECAwQFBgcICQoACyACIABBCGo2AgwgAUG/lJsBQQUgAkEMakGPBBDBDCEBDAoLIAIgAEEIajYCDCABQfWmmgFBBiACQQxqQa8CEMEMIQEMCQsgAiAAQQhqNgIMIAFB+6aaAUEJIAJBDGpBsAIQwQwhAQwICyACIABBBGo2AgwgAUG4p5oBQQUgAkEMakG+AhDBDCEBDAcLIAIgAEEEajYCDCABQcWomgFBCCACQQxqQcsCEMEMIQEMBgsgAiAAQQRqNgIMIAFBnKiaAUEEIAJBDGpBxwIQwQwhAQwFCyACIABBBGo2AgwgAUGvqJoBQQsgAkEMakHJAhDBDCEBDAQLIAIgAEEEajYCDCABQZOomgFBCSACQQxqQcYCEMEMIQEMAwsgAiAAQQRqNgIMIAFB9KeaAUEPIAJBDGpBxAIQwQwhAQwCCyACIABBBGo2AgwgAUGgqJoBQQ8gAkEMakHIAhDBDCEBDAELIAIgAEEEajYCDCABQdmUmwFBByACQQxqQcwCEMEMIQELIAJBEGokACABC8YDAQF/IwBBEGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiACgCAA4LAAECAwQFBgcICQoACyACIABBCGo2AgwgAUG/lJsBQQUgAkEMakHnBBDBDCEBDAoLIAIgAEEIajYCDCABQfWmmgFBBiACQQxqQfgEEMEMIQEMCQsgAiAAQQhqNgIMIAFB+6aaAUEJIAJBDGpB+QQQwQwhAQwICyACIABBBGo2AgwgAUG4p5oBQQUgAkEMakGEBRDBDCEBDAcLIAIgAEEEajYCDCABQcWomgFBCCACQQxqQY4FEMEMIQEMBgsgAiAAQQRqNgIMIAFBnKiaAUEEIAJBDGpBiwUQwQwhAQwFCyACIABBBGo2AgwgAUGvqJoBQQsgAkEMakGNBRDBDCEBDAQLIAIgAEEEajYCDCABQZOomgFBCSACQQxqQYoFEMEMIQEMAwsgAiAAQQRqNgIMIAFB9KeaAUEPIAJBDGpBiAUQwQwhAQwCCyACIABBBGo2AgwgAUGgqJoBQQ8gAkEMakGMBRDBDCEBDAELIAIgAEEEajYCDCABQdmUmwFBByACQQxqQcwCEMEMIQELIAJBEGokACABC5YDAQZ/IwBBIGsiAiQAAkACQCABKAJYIgMsAAAiBEF/TA0AIARB/wFxIQQMAQsgAy0AAUE/cSEFIARBH3EhBgJAIARBX0sNACAGQQZ0IAVyIQQMAQsgBUEGdCADLQACQT9xciEFAkAgBEFwTw0AIAUgBkEMdHIhBAwBCyAFQQZ0IAMtAANBP3FyIAZBEnRBgIDwAHFyIQQLAkACQAJAAkAgBEHcAEYNACABKAJcIQUCQCAEQf8ASw0AIAQtAMCcmQENASABKAJoIQdBASEGDAMLIAQQlRxFDQELIAAgARC4DgwCCyABKAJoIQdBAiEGIARBgBBJDQBBA0EEIARBgIAESRshBgsgASAGIAdqNgJoIAEgBSAGazYCXCABIAMgBmo2AlggAkGhgICAeDYCCCACIAQ2AgwgAiAHIAcgAkEIahDgIAJAIAItAAAiAUECRw0AIAIoAgQhASAAQQE6AAAgACABNgIEDAELIAAgAi0AAzoAAyAAIAIvAAE7AAEgACACKAIENgIEIAAgAToAAAsgAkEgaiQAC6EDAQV/AkAgACgCCCICRQ0AIAAoAgQiAyACQThsaiEEA0ACQAJAAkACQAJAAkAgAygCAA4HBQABAgMFBAULIANBDGooAgAiAEUNBCAAQShsIQIgA0EIaigCACEAA0ACQCAAKAIAQQdGDQAgACABEOgJCyAAQShqIQAgAkFYaiICDQAMBQsLIAMoAgQgARDoCQwDCyADQQxqKAIAIgBFDQIgAEE4bCEFIANBCGooAgAhBkEAIQADQAJAAkACQAJAIAYgAGoiAigCAA4DAAECAAsCQCACQQhqKAIAQQNHDQAgAS0AAEEBcQ0AIAJBDGooAgAgARCYAQsgAkEoaigCACABEOgJDAILIAJBMGooAgAiAkUNASABLQAAQQFxDQEgAiABEJgBDAELIAJBBGooAgAgARDoCQsgBSAAQThqIgBHDQAMAwsLIAMoAgQgARDoCSABLQAADQEgAygCCCABEJgBDAELIAEtAAANACADKAIEIAEQmAELAkAgAygCMCIARQ0AIAEtAABBAXENACAAIAEQmAELIANBOGoiAyAERw0ACwsLoQMBBX8CQCAAKAIIIgJFDQAgACgCBCIDIAJBOGxqIQQDQAJAAkACQAJAAkACQCADKAIADgcFAAECAwUEBQsgA0EMaigCACIARQ0EIABBKGwhAiADQQhqKAIAIQADQAJAIAAoAgBBB0YNACAAIAEQ6AkLIABBKGohACACQVhqIgINAAwFCwsgAygCBCABEOgJDAMLIANBDGooAgAiAEUNAiAAQThsIQUgA0EIaigCACEGQQAhAANAAkACQAJAAkAgBiAAaiICKAIADgMAAQIACwJAIAJBCGooAgBBA0cNACABLQAAQQFxDQAgAkEMaigCACABEJgBCyACQShqKAIAIAEQ6AkMAgsgAkEwaigCACICRQ0BIAEtAABBAXENASACIAEQmAEMAQsgAkEEaigCACABEOgJCyAFIABBOGoiAEcNAAwDCwsgAygCBCABEOgJIAEtAAANASADKAIIIAEQmAEMAQsgAS0AAA0AIAMoAgQgARCYAQsCQCADKAIwIgBFDQAgAS0AAEEBcQ0AIAAgARCYAQsgA0E4aiIDIARHDQALCwulAwIFfwF+AkACQCAAQoCAgIAQWg0AIAEhAiAAIQcMAQsgAUF4aiICIABCgMLXL4AiB0KAvqjQD34gAHynIgNBkM4AbiIEQZDOAHAiBUH//wNxQeQAbiIGQQF0LwCwq5gBOwAAIAFBfGogAyAEQZDOAGxrIgNB//8DcUHkAG4iBEEBdC8AsKuYATsAACABQXpqIAUgBkHkAGxrQf//A3FBAXQvALCrmAE7AAAgAUF+aiADIARB5ABsa0H//wNxQQF0LwCwq5gBOwAACyACQXxqIQIgB6chAQJAAkADQAJAIAFBj84ASw0AIAJBBGohAiABQeMASw0CIAEhAwwDCyACIAFBkM4AbiIDQfCxf2wgAWoi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CCEHIARBEGoiBCADSQ0ACyAAIANqIgQpAAggBoUhBiAEKQAAIAiFIQcMAQsCQCABQQdLDQACQAJAIAFBA0sNACABDQFC05GMrYjR2p8kIQdCxObBm+DF4owTIQYMAwsgADUAAELTkYytiNHanySFIQcgACABakF8ajUAAELE5sGb4MXijBOFIQYMAgsgACABakF/ajEAAEIIhiAAIAFBAXZqMQAAhELE5sGb4MXijBOFIQYgADEAAELTkYytiNHanySFIQcMAQsgACkAAELTkYytiNHanySFIQcgACABakF4aikAAELE5sGb4MXijBOFIQYLIAIgAigCACAHQv////8PgyAGQiCIfiABrYUgB0IgiCAGQv////8Pg35CIImFIganakHdy92eeWwgBkIgiKdqQcnB+P0AbEGj7rmcBGo2AgAL/QICBn8DfgJAIAAoAgwNAEEADwsCQCABKQMAIghCA4NCAFINACAIpykDCCEICyAIp0Hdy92eeWwgCEIgiKdqQd3L3Z55bCABKAIIIgJqQd3L3Z55bCEDAkAgASkDECIIQgODQgBSDQAgCKcpAwghCAsgAUEQaiEEIAMgCKdqQd3L3Z55bCAIQiCIp2pB3cvdnnlsQQ93IgVBGXatQoGChIiQoMCAAX4hCSAAKAIAIQMgACgCBCEGQQAhBwJAA0ACQCADIAUgBnEiBWopAAAiCiAJhSIIQn+FIAhC//379+/fv/9+fINCgIGChIiQoMCAf4MiCFANAANAAkAgASADQQAgCHqnQQN2IAVqIAZxa0EobGoiAEFYahDWDEUNACACIABBYGooAgBHDQAgBCAAQWhqENYMDQQLIAhCf3wgCIMiCFBFDQALC0EAIQAgCiAKQgGGg0KAgYKEiJCgwIB/g1BFDQEgBSAHQQhqIgdqIQUMAAsLIABBcGpBACAAGwvaAgEIfyACIAFBDGxBdGoiA2ohBCAAIANqIQUgACABQQF2IgZBDGxqIgNBdGohBwJAA0ACQCAGDQAgB0EMaiEHAkAgAUEBcUUNACACIAAgAyAAIAdJIgQbIgYoAgg2AgggAiAGKQIANwIAIAMgACAHT0EMbGohAyAAIARBDGxqIQALAkAgACAHRw0AIAMgBUEMakYNAwsQtyMACyACIAMgACADKAIEIAAoAgRJIAMoAgAiCCAAKAIAIglJIAggCUYb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A0HkAGpBwAD8CgAAIANBvAJqIANBEGpBMPwKAAAgA0GsA2ogA0EQakEwakEk/AoAACABKAIAIgEoAiANAiABQX82AiACQCABKAIsIgUgASgCJEcNACABQSRqEKwaCyABKAIoIAVBmAFsaiIGIAQ2AgAgBkEEaiADQewCakHAAPwKAAAgBkHEAGogA0G8AmpBMPwKAAAgBkH0AGogAkEk/AoAACABIAVBAWo2AiwgASABKAIgQQFqNgIgIABBBGogA0GsA2pBJPwKAAAgAEEiNgIACyADQdADaiQADwsgA0EMakGk04kBQbjTiQEQxhwAC0Go04kBEIEeAAv1AgEFfwJAIAAoAggiAkUNACAAKAIEIgMgAkE4bGohBANAAkACQAJAAkACQAJAIAMoAgAOBwUAAQIDBQQFCyADQQxqKAIAIgBFDQQgAEEobCECIANBCGooAgAhAANAAkAgACgCAEEHRg0AIAAgARDOCgsgAEEoaiEAIAJBWGoiAg0ADAULCyADKAIEIAEQzgoMAwsgA0EMaigCACIARQ0CIABBOGwhBSADQQhqKAIAIQZBACEAA0ACQAJAAkACQCAGIABqIgIoAgAOAwABAgALAkAgAkEIaigCAEEDRw0AIAJBDGooAgAgARC7AQsgAkEoaigCACABEM4KDAILIAJBMGooAgAiAkUNASACIAEQuwEMAQsgAkEEaigCACABEM4KCyAFIABBOGoiAEcNAAwDCwsgAygCBCABEM4KIAMoAgggARC7AQwBCyADKAIEIAEQuwELAkAgAygCMCIARQ0AIAAgARC7AQsgA0E4aiIDIARHDQALCwv1AgEFfwJAIAAoAggiAkUNACAAKAIEIgMgAkE4bGohBANAAkACQAJAAkACQAJAIAMoAgAOBwUAAQIDBQQFCyADQQxqKAIAIgBFDQQgAEEobCECIANBCGooAgAhAANAAkAgACgCAEEHRg0AIAAgARDOCgsgAEEoaiEAIAJBWGoiAg0ADAULCyADKAIEIAEQzgoMAwsgA0EMaigCACIARQ0CIABBOGwhBSADQQhqKAIAIQZBACEAA0ACQAJAAkACQCAGIABqIgIoAgAOAwABAgALAkAgAkEIaigCAEEDRw0AIAJBDGooAgAgARC7AQsgAkEoaigCACABEM4KDAILIAJBMGooAgAiAkUNASACIAEQuwEMAQsgAkEEaigCACABEM4KCyAFIABBOGoiAEcNAAwDCwsgAygCBCABEM4KIAMoAgggARC7AQwBCyADKAIEIAEQuwELAkAgAygCMCIARQ0AIAAgARC7AQsgA0E4aiIDIARHDQALCwuLAwEEfyMAQSBrIgMkAAJAAkAgAi0ADCIEQQFHDQAgACABKQIINwIIIAAgASkCADcCACACKAIAIAIoAgQQ2iMMAQsCQAJAAkACQAJAAkACQAJAAkAgAS0ADCIFDgMBAAIBCyAAIAItAA86AA8gACACLwANOwANIAAgAikCADcCACAAIAIoAgg2AgggAEECIARrOgAMIAEoAgQhBAwHCyAERQ0BDAILIARFDQELIAEoAgQiBCABKAIIIAIoAgQiBiACKAIIEL4cQf8BcQ4CAgMBCyADQRBqIAEgAhCLEiAAIAUgA0EQahD/FwwECyADIAIoAgg2AhggAyACKQIANwMQIANBBGogA0EQaiABEL0eIABBAiAFayADQQRqEP8XDAMLIABBACkCgOODATcCCCAAQQApAvjigwE3AgAgAigCACAGENojDAELIAMgASgCCDYCGCADIAEpAgA3AxAgA0EEaiADQRBqIAIQvR4gACAFIANBBGoQ/xcMAQsgASgCACAEENojCyADQSBqJAAL4wIBBH8jAEEgayIEJAACQAJAAkACQCACIAEoAgQiBSABIAEoAgAiBkGAgICAeEYiBxsoAghPDQACQAJAIAcNACABKAIIIgEgAkkNAwJAAkAgASACayIBDQBBACEBDAELIAJFDQAgAUECdCIHRQ0AIAUgBSACQQJ0aiAH/AoAAAsgBCABNgIcIAQgBTYCGCAEIAY2AhQMAQsgBCACIAVBBGooAgAgBUEIaigCAEGY6IMBEPwcIARBFGogBCgCACAEKAIEENYTCyADQf8BcSIHRQ0CIAQoAhxBAnQhASAEKAIYQXxqIQZBACECQQAgA2tBH3EhAwNAIAFFDQMgBiABaiIFIAUoAgAiBSAHdiACcjYCACABQXxqIQEgBSADdCECDAALCyAEQQhqIAEQ7BsgAEEANgIIIAAgBCkCCDcCAAwCC0EAQQFBAEHc74kBEI8KAAsgACAEQRRqEO0bCyAEQSBqJAAL+AIBA38jAEEQayIGJAACQAJAAkACQAJAAkAgASgCJCIHLQDiAg0AIAZBCGog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AgALAkAgAkEIaigCAEEDRw0AIAEgAkEMaigCABDjDAsgAkEoaigCACABEKgMDAILIAJBMGooAgAiAkUNASABIAIQ4wwMAQsgAkEEaigCACABEKgMCyADIABBOGoiAEcNAAwECwsgACgCBCABEM0KIABBCGohAAwBCyAAQQRqIQALIAEgACgCABDjDAsLvgIBA38CQAJAAkACQAJAA0ACQCAAKAIAIgJBAkYNAAJAAkAgAg4HCAEABAUIBggLAAsgACgCDCICRQ0GIAJBKGwhAiAAKAIIIQADQAJAIAAoAgBBB0YNACAAIAEQzgoLIABBKGohACACQVhqIgINAAwHCwsgACgCBCEADAALCyAAKAIMIgJFDQMgAkE4bCEDIAAoAgghBEEAIQADQAJAAkACQAJAIAQgAGoiAigCAA4DAAECAAsCQCACQQhqKAIAQQNHDQAgAkEMaigCACABELsBCyACQShqKAIAIAEQzgoMAgsgAkEwaigCACICRQ0BIAIgARC7AQwBCyACQQRqKAIAIAEQzgoLIAMgAEE4aiIARw0ADAQLCyAAKAIEIAEQzgogAEEIaiEADAELIABBBGohAAsgACgCACABELsBCwu+AgEDfwJAAkACQAJAAkADQAJAIAAoAgAiAkECRg0AAkACQCACDgcIAQAEBQgGCAsACyAAKAIMIgJFDQYgAkEobCECIAAoAgghAANAAkAgACgCAEEHRg0AIAAgARDPCgsgAEEoaiEAIAJBWGoiAg0ADAcLCyAAKAIEIQAMAAsLIAAoAgwiAkUNAyACQThsIQMgACgCCCEEQQAhAANAAkACQAJAAkAgBCAAaiICKAIADgMAAQIACwJAIAJBCGooAgBBA0cNACABIAJBDGooAgAQygELIAJBKGooAgAgARC4CAwCCyACQTBqKAIAIgJFDQEgASACEMoBDAELIAJBBGooAgAgARC4CAsgAyAAQThqIgBHDQAMBAsLIAAoAgQgARDPCiAAQQhqIQAMAQsgAEEEaiEACyABIAAoAgAQygELC8wCAQR/IwBBEGsiBCQAAkACQAJAIAAtAABBAUYNACAAKAIEIQUCQCAALQABQQFGDQAgBSgCACgCACIGQQEQmx8gBigCBCAGKAIIIgdqQSw6AAAgBiAHQQFqNgIICyAAQQI6AAEgBEEIaiAFKAIAIAEgAhDABQJA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AgIDfwF+IwBBIGsiAyQAIAEoAgAiASgCECEEIANBCGogAiABKAIMIgVBABC1AgJAAkAgAy0ACEEERg0AIAMpAwgiBkL/AYNCBFENACAAIAY3AgAMAQsgA0EANgIIIANBGGogAiADQQhqQYvsmgFBARDrDQJAIAMtABhBBEYNACADKQMYIgZC/wGDQgRRDQAgACAGNwIADAELIANBGGogAiAFIAQgASgCBCABKAIIQZDSARD1BAJAIAMtABhBBEYNACADKQMYIgZC/wGDQgRRDQAgACAGNwIADAELIANBGGogAiADQQhqQY3smgFBARDrDQJAIAMtABhBBEYNACADKQMYIgZC/wGDQgRRDQAgACAGNwIADAELIABBBDoAAAsgA0EgaiQAC6QCAgN/AX4jAEEgayIDJAAgASgCECEEIANBEGogAiABKAIMIgVBABC1AgJAAkAgAy0AEEEERg0AIAMpAxAiBkL/AYNCBFENACAAIAY3AgAMAQsgA0EANgIQIANBCGogAiADQRBqQY7wmgFBAhDrDQJAIAMtAAhBBEYNACADKQMIIgZC/wGDQgRRDQAgACAGNwIADAELIANBEGogAiAFIAQgASgCBCABKAIIENoEAkAgAy0AEEEERg0AIAMpAxAiBkL/AYNCBFENACAAIAY3AgAMAQsgA0EANgIQIANBCGogAiADQRBqQZXwmgFBAxDrDQJAIAMtAAhBBEYNACADKQMIIgZC/wGDQgRRDQAgACAGNwIADAELIABBBDoAAAsgA0EgaiQAC7ECAQd/IwBBEGsiASQAIAAoAgQhAiAAKAIAIQMgAEKBgICAIDcCAAJAAkACQAJAIANBAUcNACABIAI2AgwgAkECRw0BQQFB6IybASABQQxqQQAgAEHsjJsBELEcAAsCQCAALQAMDQAgACgCCCEAQQAQ9REhAyAAQYQGaiIEKAIAIgVFDQMgAygCACAFcCEGQQshAyAAQYAGaiEHA0AgA0F/aiIDRQ0BIAcoAgAgBCgCACAGQbiLmwEQyx8iAC0AACEFIABBAToAACAFDQALAkAgACgCDCIDIAAoAgRHDQAgAEEEahCNGgsgACgCCCADQQJ0aiACNgIAIABBADoAACAAIANBAWo2AgwMAgsgAhCaIwwBCyAAKAIIIAI2AvgFCyABQRBqJAAPC0Goi5sBELwjAAvFAgEF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ahCyIyEECyAGQTBqJAAgBAudAgIFfwJ+AkACQAJAIAEoAgAiAiABQWhqIgMoAgAiBEcNACABKAIMIgUgAUF0aigCAEkNAQwCCyACIARPDQEgASgCDCEFCyABKQIEIQcgASADKQIANwIAIAEgAykCCDcCCCABKQIQIQggASADKQIQNwIQAkAgAyAARg0AIAFBUGohAQJAA0ACQAJAIAIgASgCACIERw0AIAUgAUEMaigCAEkNAQwECyACIARPDQILIANBaGohAyABQRhqIgQgASkCEDcCECAEIAEpAgg3AgggBCABKQIANwIAIAEgAEchBCABQWhqIgYhASAEDQALIAZBGGohAwwBCyABQRhqIQMLIAMgCDcCECADIAU2AgwgAyAHNwIEIAMgAjYCAA8LC64CAgN/AX4CQAJAAkACQAJAAkACQCAAKAIADgQBAgMAAQsgACgCCCEBAkAgACgCDCICRQ0AIAEhAwNAIAMQ1BEgA0E4aiEDIAJBf2oiAg0ACwsgACgCBCABQQhBOBDPEwwDCwJAIAApAwgiBEIDg0IAUg0AIASnIgMgAygCACICQX9qNgIAIAJBAUcNACADIAMoAhAQ7B4LIAAoAiAiAw0DDAQLIAAoAgghAQJAIAAoAgwiAkUNACABIQMDQAJAIAMoAgBBB0YNACADEKIICyADQShqIQMgAkF/aiICDQALCyAAKAIEIAFBCEEoEM8TDAELIAAoAgQiAxCiCCADQShBCBDUFAsgACgCGCIDRQ0BCyADKAIAIgIQ3wIgAkHgAEEIENQUIANBDEEEENQUCwu4AgIGfwJ+IwBB4ABrIgIkAEEAIQMgAkEANgFaIAJBADYCFCACQoCAgICAATcCDCACQoCAgICAATcCSCACQoCAgIDAADcCOCACQQA2AlAgAkEBOgBEIAJBADYCQCACIAAvAXg7AVggAiAAKAJ0NgJUIAJBACkDoKacASIINwIYIAJBACkDqKacASIJNwIgIAIgCDcCKCACIAk3AjAgAiAALQB+OgBeIABBLGohBAJAA0AgA0HUAEYNASAAIANqQSxqIgUoAgAhBiAFIAJBDGogA2oiBygCADYCACAHIAY2AgAgA0EEaiEDDAALCwJAIAEoAggiA0UNACADQTBsIQUgASgCBCEDA0AgAEEAOgB9IAMgABBpIANBMGohAyAFQVBqIgUN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FAwFCyAAQQhqEJsVDAQLIABBCGoiASgCACAAQQxqKAIAEOcdIAAoAgQgASgCABDyIyAAKAIYIgFFDQMgASgCACICEKgEIAJB4ABBCBDUFCABQQxBBBDUFAwDCyAAQQRqEKoLIAAoAhgiAUUNAiABKAIAIgIQqAQgAkHgAEEIENQUIAFBDEEEENQUDAILIABBBGoQmhEgACgCBCAAQQhqKAIAEPUjIAAoAhgiAUUNASABKAIAIgIQqAQgAkHgAEEIENQUIAFBDEEEENQUDAELIABBBGoQqgsgACgCCCIBEOcBIAFBwABBCBDUFAsgAEEoQQgQ1BQLqQIBBH8jAEEQayICJAACQCAALQAAQQFGDQAgACgCBCEDAkAgAC0AAUEBRg0AIAMoAgAoAgAiBEEBEJsfIAQoAgQgBCgCCCIFakEsOgAAIAQgBUEBajYCCAsgAEECOgABIAJBCGogAygCAEGI25oBQQUQwAUCQAJAIAItAAhBBEYNACACKQMIENkgIQAMAQsgAygCACgCACIAQQEQmx8gACgCBCAAKAIIIgRqQTo6AAAgACAEQQFqNgIIAkACQCABKAIAQYCAgIB4Rw0AIAMoAgAoAgAiAEEEEJsfIAAoAgQgACgCCCIDakHu6rHjBjYAACAAIANBBGo2AggMAQsgAyABEKsNIgANAQtBACEACyACQRBqJAAgAA8LQYjzmgFBKEH825oBELchAAujAgECfyMAQTBrIgIkAAJAAkACQAJAA0ACQCAAKAIADgcCAwAEAAUFAgsgACgCBCEADAALCyACQQhqIABBCGoQjRQgASgCACACKAIIIAIoAgwQrB4MAgsgACgCDCEDIAIgACgCCCIANgIoIAJBADYCICACQQA2AhggAiAAIANBKGxqNgIsA0AgAkEYahCPGCIARQ0CIAAgARCsCwwACwsgACgCDEE4bCEDIAAoAgghAANAIANFDQECQAJAAkACQCAAKAIADgMAAQIACyAAQShqKAIAIAEQrAsMAgsgAkEQaiAAQRBqEI0UIAEoAgAgAigCECACKAIUEKweDAELIABBBGooAgAgARCsCwsgAEE4aiEAIANBSGohAwwACwsgAkEwaiQAC7cCAgN/AX4jAEEgayICJAACQAJAAkACQAJAIAEtAMgBIgNBt39qDgMAAQABCyABLQCFAUEBcUUNASABKALE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AwwBCyAAKAIEIAIoAgRJIQMLAkAgBCADRw0AAkACQCAFIAZGDQAgBSAGSSEADAELIAEoAgQgAigCBEkhAAsgAiABIAQgAHMbIQALIAAL5gEBA38CQCADQQhJDQAgACAAIANBeHEiBGogACADQQN2IgNBDmwiBWogAxCRDCEAIAEgASAEaiABIAVqIAMQkQwhASACIAIgBGogAiAFaiADEJEMIQILAkACQCAALQAAIgMgAS0AACIFRg0AIAMgBUkhBAwBCyAALQABIAEtAAFJIQQLAkACQCADIAItAAAiBkYNACADIAZJIQMMAQsgAC0AASACLQABSSEDCwJAIAQgA0cNAAJAAkAgBSAGRg0AIAUgBkkhAAwBCyABLQABIAItAAFJIQALIAIgASAEIABzGyEACyAAC+gBAQN/AkAgA0EISQ0AIAAgACADQQN2IgNB4ABsIgRqIAAgA0GoAWwiBWogAxCSDCEAIAEgASAEaiABIAVqIAMQkgwhASACIAIgBGogAiAFaiADEJIMIQILAkACQCAAKAIAIgMgASgCACIFRg0AIAMgBUkhBAwBCyAAKAIMIAEoAgxJIQQLAkACQCADIAIoAgAiBkYNACADIAZJIQMMAQsgACgCDCACKAIMSSEDCwJAIAQgA0cNAAJAAkAgBSAGRg0AIAUgBkkhAAwBCyABKAIMIAIoAgxJIQALIAIgASAEIABzGyEACyAAC/kBAQN/IwBBMGsiAiQAIAFBwABqIAAQvgMCQCABKAKYASIDRQ0AIANBKGwhBCABKAKUASEDA0AgACADEPACIANBKGohAyAEQVhqIgQNAAsLAkAgAS0APCIDQQZGDQACQCADQQJLDQAgAUEoaiEEAkAgA0ECRw0AIAQgABDdHgsgACAEEKgJIAEtADwhAwsgA0H/AXFBA0cNACACIAAgAUEQaiIDEKINIAItACxBBkYNACADEJQTIAMgAikDKDcDKCADIAIpAyA3AyAgAyACKQMYNwMYIAMgAikDEDcDECADIAIpAwg3AwggAyACKQMANwMACyACQTBqJAALiAIBAn8jAEEQayICJAACQCABLQAEQQFHDQACQAJAAkACQAJAAkACQAJAIAAoAgAOBQIDAAEFAgsCQCABLQAFDQAgACsDEJlEAAAAAAAA8H9iDQAgAUEAOgAECyABIAEoAgBBBWo2AgAM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AkAgASkDCCIEQgODQgBSDQAgBKciAyADKAIAIgNBAWo2AgAgA0F/TA0BCyAAKAIYIQMgACACNgIYIAApAxAhBSAAIAQ3AxACQAJAIAEoAiAiAS0AJUECRg0AIAAgARDKDAwBCwJAIAAtANsBDQAgASAAEKQFCyAALQDeASECIABBAToA3gEgACABELwEIAAgAjoA3gELAkAgACkDECIEUA0AIARCA4NCAFINACAEpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOweCyAAIAM2AhggACAFNwMQDwsAC9oBAQd/IwBBEGsiAiQAIAIgACABQQF2IgMgA0Ho6ZoBEN4bQQAhBCACKAIEIQUgAigCACEGIAIgACABQQxsakEAIANrQQxsaiADIANB+OmaARDeGyADQQxsIAIoAgBqQXRqIQEgA0F/aiACKAIEIgdJIQACQAJAA0AgAyAEaiIIRQ0BIAUgBGpFDQICQCAARQ0AIAYgAUEDEPUcIAZBDGohBiABQXRqIQEgBEF/aiEEDAELCyAIQX9qIAdBmOqaARD1FgALIAJBEGokAA8LIAUgBUGI6poBEPUWAAvpAQECfyMAQSBrIgIkAAJAAkAgAUH///93Rg0AIAIgAUH///8HcTYCGCACQQE2AhQgAkEANgIcIAJBCGogAkEUakH06YEBENoaIAAgAigCCCIBIAIoAgxqQX9qQQAgAWtxIAEQ1BQMAQtBACEBAkAgAEF8aiIAKAAAIgNBf3NBH3YgA0G46YEBEMsdIgNB+P///wdLDQBBBCEBIAJBBDYCHCACIANBBGo2AhgLIAIgATYCFCACQQhqIAJBFGpB1OmBARDaGiAAIAIoAggiASACKAIMakF/akEAIAFrcSABENQUCyACQSBqJAAL1AEBBX8jAEEQayICJAACQAJAAkACQCABQQhJDQAgAUH/////AUsNAkF/IAFBA3RBB25Bf2pndkEBaiEBDAELIAFBBHFBBGohAQsgAkEEakEEQQggARDXDyACKAIEIgNFDQAgAigCDCEEIAMgAigCCCIFEL8hIgYNASADIAUQoCQACxDYIwALIAYgBGohAwJAIAFBCGoiBEUNACADQf8BIAT8CwALIAAgAUF/aiIENgIEIAAgAzYCACAAIAQgAUEDdkEHbCABQQlJG603AgggAkEQaiQAC/wBAQd/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ASgCFCEDIAEpAgQhBSABKAIQIQQgAkEQaiABENESIAIgBDYCICACIAU3AhggAiACKQMQNwIoIAIgBCADQQN0ajYCJCACQQhqIAJBGGoQqBECQCACKAIIIgENAEGw6IQBEMMjAAsgAigCDCEEIAAgAikCKDcCKCAAIAIpAiA3AiAgACACKQIYNwIYIAAgATYCMCAAQgQ3AhAgAEIANwIIIABCgICAgMAANwIAIAAgASAEQQN0ajYCNCACQTBqJAALygEBBH8jAEEQayIDJABBACEEAkACQCACKAIQIgUgAigCFCIGSw0AAkAgAigCAA0AIANBBGogACACKAIIIAIoAgwgBSAGENIKQQAhBCADKAIEQQFHDQFBASEEIAMoAgggAygCDE0NAUH81oQBQSVBkNeEARDkGwALIANBBGogACACKAIIIAIoAgwgBSAGEOQLQQAhBCADKAIEQQFHDQBBASEEIAMoAgggAygCDEsNAQsgA0EQaiQAIAQPC0H81oQBQSVBkNeEARDkGwALygEBBH8jAEEQayIDJABBACEEAkACQCACKAIQIgUgAigCFCIGSw0AAkAgAigCAA0AIANBBGogACACKAIIIAIoAgwgBSAGEOMOQQAhBCADKAIEQQFHDQFBASEEIAMoAgggAygCDE0NAUH81oQBQSVBkNeEARDkGwALIANBBGogACACKAIIIAIoAgwgBSAGEKAUQQAhBCADKAIEQQFHDQBBASEEIAMoAgggAygCDEsNAQsgA0EQaiQAIAQPC0H81oQBQSVBkNeEARDkGwAL1gECAn8BfiMAQTBrIgMkACADQQhqIAEgAhCBDiADKQIMIQUCQAJAIAMoAggiBEGAgICAeEYNACAAIAMoAiw2AiQgACADKQIkNwIcIAAgAykCHDcCFCAAIAMpAhQ3AgwgACAFNwIEIAAgBDYCAAwBCwJAIAWnQQFxRQ0AIABBgICAgHg2AgAgACAFQgiIPAAEDAELAkAgBUKAgICAgBBUDQAgACABKAIEIAEoAgggAkEEakEAEKkQDAELIABBgICAgHg2AgAgACAFQiCIPAAECyADQTBqJAALwwEBBH8jAEEQayIBJAAgACgCACICKAIAIQMgAkEANgIAIAMoAhQhAiADQQA2AhQCQCACRQ0AIAEgAhEDAAJAIAAoAgQiACgCACIDKAIAIgJFDQAg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NgIAIAAgAzYCBCACQRBqJAALjQEBA38CQCADQQhJDQAgACAAIANBA3YiA0HgAGwiBGogACADQagBbCIFaiADEL8PIQAgASABIARqIAEgBWogAxC/DyEBIAIgAiAEaiACIAVqIAMQvw8hAgsgACACIAEgAEEMaigCACIDIAFBDGooAgAiBEkiBSAEIAJBDGooAgAiBklzGyAFIAMgBklzGwulAQEBfgJAAkACQAJAIAStIAGtfiIFQiCIpw0AIAWnIgRBgICAgHggA2tLDQAgBA0BIAAgAzYCCEEAIQMgAEEANgIEDAMLIABBADYCBAwBCwJAAkAgAg0AIAQgAxDSICECDAELIAQgAxDQGCECCwJAIAINACAAIAQ2AgggACADNgIEDAELIAAgAjYCCCAAIAE2AgRBACEDDAELQQEhAwsgACADNgIAC6UBAQF+AkACQAJAAkAgBK0gAa1+IgVCIIinDQAgBaciBEGAgICAeCADa0sNACAEDQEgACADNgIIQQAhAyAAQQA2AgQMAwsgAEEANgIEDAELAkACQCACDQAgBCADENIgIQIMAQsgBCADENAYIQILAkAgAg0AIAAgBDYCCCAAIAM2AgQMAQsgACACNgIIIAAgATYCBEEAIQMMAQtBASEDCyAAIAM2AgALnwEBBH8jAEEQayIEJAACQCABLQDfBEEBaiIFIANB////P3FqIgYgAigCfCIHTw0AQQAhBwJAIAIoAnggBkECdGooAgAiBkEATg0AIAQgAjYCDCAEIAE2AgggBCAEQQhqIAMgBUEQdEEBchCuASAEKAIEIQYgBCgCACEHCyAAIAc2AgAgACAGNgIEIARBEGokAA8LIAYgB0HI5oQBEPUWAAugAQEDfyMAQRBrIgUkAAJAIANB////P3EgASAEQf8BcSIGai0A4AJqIgcgAigCfCIETw0AQQAhBAJAIAIoAnggB0ECdGooAgAiB0EATg0AIAUgAjYCDCAFIAE2AgggBSAFQQhqIAMgBkEIdBCuASAFKAIEIQcgBSgCACEECyAAIAQ2AgAgACAHNgIEIAVBEGokAA8LIAcgBEG45oQBEPUWAAulAQEDfwJAAkACQCABKAIAIgINAEEAIQMMAQtBACEDA0ACQCABKAIIIgQgASgCBE8NACACIARqLQAAQcUARw0AIAEgBEEBajYCCAwCCwJAIANFDQAgASgCECICRQ0AIAJB36aYAUECEJ4HRQ0AQQEhAgwDC0EBIQIgAUEBELYCDQIgA0EBaiEDIAEoAgAiAg0ACwtBACECCyAAIAM2AgQgACACNgIAC8MBAQF/IwBBEGsiAiQAAkACQCAAKQMAQv///////////wCDQoCAgICAgID4/wBTDQAgAkH1ATYCDCACIAA2AgggASgCACABKAIEQc2VgAEgAkEIahDMIyEADAELIAJBADoABCACIAE2AgAgAkH1ATYCDCACIAA2AggCQCACQc2VgAEgAkEIahDnIw0AAkAgAi0ABA0AIAEoAgBB4aaYAUECIAEoAgQoAgwRDAANAQtBACEADAELQQEhAAsgAkEQaiQAIAALrgEBBH8gACgCBCEBAkAgACgCCCICRQ0AIAFBBGohAwNAAkACQAJAAkACQAJAIANBfGooAgAOBAECAwQACyADEMYPDAQLIANBBGoQ8RIMAwsgAygCAEUNAiADQQRqKAIAIgQQnAEgBEHAAEEIENQUDAILIAMoAgAiBBCcASAEQcAAQQgQ1BQMAQsgAxDnCQsgA0EoaiEDIAJBf2oiAg0ACwsgACgCACABQQhBKBDPEwusAQEDfyMAQSBrIgQkACAEIAFBACAEIANBAEEAEI4DQQMhAyAEKAIAIQUCQAJAIAQtABQiBkEDRw0AIAAgBTYCBAwBCyAAIAQpAgw3AhQgACAEKQIENwIMIAAgBC8AFTsAHSAAIAQtABc6AB8gBCgCGCEDIAAgAjYCKCAAIAM2AiAgACAGOgAcIAAgBTYCCCAAIAEoAqwBNgIsQQEhAwsgACADNgIAIARBIGokAAubAQECfwJAIAEtACVBAkYNAANAIAEoAiAiAS0AJUECRw0ACwsgASAAEKQFAkAgASgCCCICRQ0AIAJBOGwhAiABKAIEIQEDQAJAIAEoAgBBCUcNACABQQhqKAIAQRFHDQAgAUEQaigCAEEHRw0AIAFBFGooAgAiAy0ARUEDRg0AIAAgA0EgahDIDwsgAUE4aiEBIAJBSGoiAg0ACwsLrAEBAX8jAEEgayIGJAAgBiABIAMgBCAFQQBBABDVBkEDIQUgBigCACEEAkACQCAGLQAUIgNBA0cNACAAIAQ2AgQMAQsgACAGKQIMNwIUIAAgBikCBDcCDCAAIAYvABU7AB0gACAGLQAXOgAfIAYoAhghBSAAIAI2AiggACAFNgIgIAAgAzoAHCAAIAQ2AgggACABKAK8ATYCLEEBIQULIAAgBTYCACAGQSBqJAALrgEBA38CQCAAKAIcIgMgACgCICIEIAEQ5hEiBUUNACADIAQgBUF/akHIjJsBEM4fIQUgAyAEIAJBf2oQ5hEiAiAEQX9qRg0AIAMgBCACQQFqQdiMmwEQzh8iBC0ACUEBRw0AAkACQCAELQAIIgQOBQECAgIBAAsCQCAEQb1/ag4DAQIBAAsgBEFzakECTw0BCwJAIAUtAAhBBkcNACAFKAIAIQELIAAgAUE7EKgbCwu3AQECfyMAQTBrIgIkACACQQA2AhggAkKAgICAEDcCECACQQhqIAEgASgCACgCBBEHACACIAIpAwg3AhwgAkHUADYCKCACIAJBHGo2AiQCQCACQRBqQfyAmwFBzZWAASACQSRqEMwjDQAgACACKQIQNwIAIAAgAigCGDYCCCABKAIAIQMgAEECOgAMIAEgAygCABEDACACQTBqJAAPC0GBlZsBQTcgAkEvakGUgZsBQbiVmwEQ1RQAC64BAAJAAkACQAJAIAFB/wdKDQAgAUGCeE4NAyAARAAAAAAAAGADoiEAIAFBuHBNDQEgAUHJB2ohAQwDCyAARAAAAAAAAOB/oiEAIAFB/g9LDQEgAUGBeGohAQwCCyAARAAAAAAAAGADoiEAIAFB8GggAUHwaEsbQZIPaiEBDAELIABEAAAAAAAA4H+iIQAgAUH9FyABQf0XSRtBgnBqIQELIAAgAUH/B2qtQjSGv6ILngEBBH8jAEEQayICJAACQAJAIAEtAARFDQBBAiEDDAELIAEoAgAQLSEEIAJBCGoQ7R5BASEDIAIoAgwgBCACKAIIIgVBAXEbIQQCQCAFQQFHDQAgAUEBOgAEIAQhAQwBCwJAAkAgBBAuDQBBACEDIAQQLyEBDAELIAFBAToABEECIQMLIAQQzSILIAAgATYCBCAAIAM2AgAgAkEQaiQAC5cBAQN/IwBBEGsiAiQAQQMhAyAALQAAIgAhBAJAIABBCkkNAEEBIQMgAiAAIABB5ABuIgRB5ABsa0H/AXFBAXQvALCrmAE7AA4LAkACQCAARQ0AIARFDQELIAJBDWogA0F/aiIDaiAEQQF0LQCxq5gBOgAACyABQQFBAUEAIAJBDWogA2pBAyADaxDOBiEDIAJBEGokACADC54BAQR/IwBBIGsiASQAQQAhAgJAIABBf3NBH3YgAEG46YEBEMsdIgNB+P///wdLDQBBBCECIAFBBDYCHCABIANBBGo2AhgLIAEgAjYCFCABQQhqIAFBFGpB1OmBARDaGgJAIAEoAggiACABKAIMakF/akEAIABrcSIEIAAQ0iAiAg0AIAAgBBCgJAALIAIgAzYAACABQSBqJAAgAkEEagufAQEDfyMAQZADayIDJAAgAyABIAIQ1AQCQAJAIAMoAgBBh4CAgHhGDQACQAJAIAINAEEAIQQMAQsgAUEIaigCACEEIAJBAUYNACABQRhqIQEgAkF/akH/////AHEhAgNAIAQgASgCACIFIAQgBUsbIQQgAUEQaiEBIAJBf2oiAg0ACwsgACADIAQQ1gcMAQsgAEECOgAMCyADQZADaiQAC7MBAQF/AkACQAJAAkAgACgCkAFBgICAgHhGDQBBoAEQigEiAUUNASABIABBoAH8CgAAQcAAEIoBIgBFDQIgACABNgIEIABBJzYCACAADwtBwAAQigEiAUUNAiABQSg2AgAgASAAKQIANwIEIAEgACkCCDcCDCABIAApAhA3AhQgASAAKQIYNwIcIAEgACgCIDYCJCABDwtBCEGgARCgJAALQQhBwAAQoCQAC0EIQcAAEKAkAAuVAQECfgJAIAEoAgBBACACa0EobGoiAkFYaikDACIDQgODQgBSDQAgA6cpAwghAwsgAkFgaigCACEBAkAgAkFoaikDACIEQgODQgBSDQAgBKcpAwghBAsgA6dB3cvdnnlsIANCIIinakHdy92eeWwgAWpB3cvdnnlsIASnakHdy92eeWwgBEIgiKdqQd3L3Z55bEEPd60LkgEBAX9B/wEhBQJAIANB/wFxRQ0AQX9BACADa0EHcXRBf3MgA0EHcXQhBQsgAEEIOgAOIAAgAzoADSAAIAU6AAwgACABNgIIIAAgBDoAFiAAQQA6ABUgACACQX5qNgIEIAAgAUEBajYCACAAIAEgAmpBf2o2AhAgAEF/QX8gBEEHcXRBf3MgBEH/AXFBCEYbOgAUC6MBAgJ/AX4jAEEQayIEJAACQAJAAkAgA0UNAAJAIAEtAExBAUcNACAEQQhqIAEQvRUCQCAELQAIQQRGDQAgBCkDCCIGQv8Bg0IEUg0DCyABQQA6AEwgASgCACEFIAFBADYCACAFQQFHDQAgASABKAIEEK8GCyABKAI0IAIgAxCNIyABIAIgAxDdBQsgAEEEOgAADAELIAAgBjcCAAsgBEEQaiQAC6UBAQF/AkACQAJAAkACQAJAIAAoAgAiAUF7akEEIAFBBEsbDgUBAgMEBQALIABBCGoQhRogACgCKBCYHg8LIAApAwgQmiEPCyAAQQhqEIUaIABBKGoQuSIPCyAAKQMQEJohIABBKGoQuSIPCyAAQQhqEIUaIABByABqEN8iIABBKGoQvSIPCyAAEIUaIABBIGoQtyIgAEHoAGoQviIgAEHIAGoQvSILnwECAn8EfiMAQRBrIgIkACACQgFCACABQf8AcRC9FgJAIAAgAUGAAXFBA3ZqIgMpA4ACIgQgAikDACIFgyADQYgCaikDACIGIAIpAwgiB4OEQgBSDQAgA0GAAmoiAyAEIAWENwMAIAMgBiAHhDcDCCAAIAAoAqACQQFqNgKgAiAAIAAvAaQCIAFB/wFxLQDs74kBajsBpAILIAJBEGokAAuQAQIBfwF+AkAgAa0gA61+IgVCIIinRQ0AIABBADYCAA8LAkAgAiAFpyIBakF/aiIEIAFPDQAgAEEANgIADwsCQCADQQhqIgMgBEEAIAJrcSIEaiIBIANPDQAgAEEANgIADwsCQCABQYCAgIB4IAJrSw0AIAAgBDYCCCAAIAE2AgQgACACNgIADwsgAEEANgIAC5YBAQR/AkACQCAAQf8BSw0AQQEhASAAQd8BcUG/f2pB/wFxQRpJDQEgAEHfAEYNASAAQVBqQf8BcUEKSQ0BC0EAIQFBgwYhAgNAIAEgAkEBdiIDIAFqIgQgBEEDdCgCnJGQASAASxshASACIANrIgJBAUsNAAsgAUEDdCIBKAKckZABIABNIAAgASgCoJGQAU1xIQELIAELmQEBAn8CQAJAIABBd2oiAUEXSw0AQQEhAkGfgIAEIAF2QQFxDQELQQAhAiAAQYUBSQ0AAkACQCAAQQh2IgFFDQACQCABQTBGDQAgAUEgRg0CIAFBFkcNAyAAQYAtRiECDAMLIABBgOAARiECDAILIABB/wFxLQC0l5sBIQIMAQsgAEH/AXEtALSXmwFBAnFBAXYhAgsgAkEBcQumAQEDfyMAQdAAayIBJAAgACgCACICKAIAIQMgAkEANgIAIAMoAlAhAiADQQA2AlACQCACRQ0AIAFBCGogAhEDAAJAIAAoAgQiAigCACIDKAI4IgBBAkYNACAARQ0AIAMoAkAiAEUNACADKAI8IABBARDUFCACKAIAIQMLIAMgAUEIakHIAPwKAAAgAUHQAGokAEEBDwtBxqecAUHVAEG0mZsBEOQbAAu4AQECf0EAIQICQAJAAkACQAJAAkACQAJAIAAoAgAiA0F0akEHIANBC0sbDiYEBAQEBAQEBAABBAQEBAIEBAQEBAQEBAMEBAQEBAcEBwcHBwQEBAQLIAAoAigoAgAiA0F0akEHIANBC0sbIgNBCEYNBCADQSRGDQMLQQEPCyABDQNBAQ8LIABBBGogARCcESECCyACDwsgAEEoaiABEJwRDwsgAEEIahC2IEEBcw8LIABBBGogARCcEQuaAQICfwF+IwBBEGsiAyQAIAFBCGohBAJAAkACQAJAIAEpAwBCAVINACADQQhqIAQgAhCRASADLQAIQQRGDQIgAykDCCIFQv8Bg0IEUg0BDAILIANBCGogBCACEIoWIAMtAAhBBEYNASADKQMIIgVC/wGDQgRRDQEgACAFNwIADAILIAAgBTcCAAwBCyAAQQQ6AAALIANBEGokAAuaAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIQMgASgCAEHy7poBQQEgASgCBCgCDBEMACEEIAJBADoACSACIAQ6AAggAiABNgIEAkAgA0UNACADQQN0IQEDQCACIAA2AgwgAkEEaiACQQxqQScQjQwaIABBCGohACABQXhqIgENAAsLIAJBBGoQ/x0hACACQRBqJAAgAAuZAQEEfyMAQYAgayIDJAACQAJAIAFBgIn6ACABQYCJ+gBJGyIEIAEgAUEBdmsiBSAEIAVLGyIEQYEISQ0AIAMgBBCpFSAAIAEgAygCBCIEIAMoAggiBUECdGogAygCACIGIAVrIAFBwQBJIAIQpAIgBiAEQQRBBBDREwwBCyAAIAEgA0GACCABQcEASSACEKQCCyADQYAgaiQAC44BAQZ/IABBBGohAiAAIAFBAnRqIQNBACEEA0ACQCACKAIAIgUgAkF8aigCACIGTw0AIAQhAQJAA0AgACABakEEaiAGNgIAAkAgAQ0AIAAhAQwCCyAFIAFBfGoiASAAaiIHKAIAIgZJDQALIAdBBGohAQsgASAFNgIACyAEQQRqIQQgAkEEaiICIANHDQALC5UBAQF/IwBBIGsiAiQAAkACQCAALQAEQQFHDQAgAiAALQAFOgAPIAJBB61CIIYgAK2ENwMYIAJB0wCtQiCGIAJBD2qthDcDECABKAIAIAEoAgRBgoKAASACQRBqEMsGIQAMAQsgAkEHrUIghiAArYQ3AxAgASgCACABKAIEQbOCgAEgAkEQahDLBiEACyACQSBqJAAgAAubAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIQMgASgCAEHy7poBQQEgASgCBCgCDBEMACEEIAJBADoACSACIAQ6AAggAiABNgIEAkAgA0UNACADQQN0IQEDQCACIAA2AgwgAkEEaiACQQxqQYMBEI0MGiAAQQhqIQAgAUF4aiIBDQALCyACQQRqEP8dIQAgAkEQaiQAIAALrgEBA38jAEEgayICJAAgAkIAEI8NAkACQCACKAIAQYSAgIB4Rw0AIAIoAgQhA0EQEIoBIgRFDQEgBCABOwEMIAQgAzYCCCAEQoGAgIAQNwIAIARBDmogAUEQdjoAACAAIAQ2AgAgAEHc24QBNgIEIAJBIGokAA8LIAIgAikDCDcDGCACIAIpAwA3AxBB1P2aAUErIAJBEGpBjNmEAUHs2YQBENUUAAtBBEEQEKAkAAufAQECfyAAEKYKIQEgACgCwBIgACgCxBIiAigCCEF/akF4cWpBCGogAigCGBEEACECAkAgAC0A1BJBAUcNAEGI85oBQShBrI2FARC3IQALIAEgAmogACgC0BIiACgC0AJBFGxqIAAoAtwCQQJ0aiAAKALEAiICKAIQQQN0aiACKAIcQQV0aiACKAIoQQxsaiACKAIsaiAAKALAAmpBiANqC5sBAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgghAyABKAIAQfLumgFBASABKAIEKAIMEQwAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQCQCADRQ0AIANBHGwhAQNAIAIgADYCDCACQQRqIAJBDGpB9gAQjQwaIABBHGohACABQWRqIgENAAsLIAJBBGoQ/x0hACACQRBqJAAgAAuhAQEDfwJAAkACQAJAIAEoAgAiAg0AQQAhAwwBC0EAIQMDQAJAIAEoAggiBCABKAIETw0AIAIgBGotAABBxQBHDQAgASAEQQFqNgIIDAILAkAgA0UNACABKAIQIgJFDQAgAkHfppgBQQIQngcNAwsgARCqAw0CIANBAWohAyABKAIAIgINAAsLQQAhAQwBC0EBIQELIAAgAzYCBCAAIAE2AgALkwECAn8BfgJAIAFFDQADQAJAIABBEGopAwAiBFANACAEQgODQgBSDQAgBKciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDsHgsCQCAAKQMAIgRCA4NCAFINACAEpyICIAIoAgAiA0F/ajYCACADQQFHDQAgAiACKAIQEOweCyAAQSBqIQAgAUF/aiIBDQALCwubAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIQMgASgCAEHy7poBQQEgASgCBCgCDBEMACEEIAJBADoACSACIAQ6AAggAiABNgIEAkAgA0UNACADQQJ0IQEDQCACIAA2AgwgAkEEaiACQQxqQfkCEI0MGiAAQQRqIQAgAUF8aiIBDQALCyACQQRqEP8dIQAgAkEQaiQAIAALmwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCEDIAEoAgBB8u6aAUEBIAEoAgQoAgwRDAAhBCACQQA6AAkgAiAEOgAIIAIgATYCBAJAIANFDQAgA0EMbCEBA0AgAiAANgIMIAJBBGogAkEMakGrAxCNDBogAEEMaiEAIAFBdGoiAQ0ACwsgAkEEahD/HSEAIAJBEGokACAAC5sBAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgghAyABKAIAQfLumgFBASABKAIEKAIMEQwAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQCQCADRQ0AIANBMGwhAQNAIAIgADYCDCACQQRqIAJBDGpBngMQjQwaIABBMGohACABQVBqIgENAAsLIAJBBGoQ/x0hACACQRBqJAAgAAubAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIQMgASgCAEHy7poBQQEgASgCBCgCDBEMACEEIAJBADoACSACIAQ6AAggAiABNgIEAkAgA0UNACADQTBsIQEDQCACIAA2AgwgAkEEaiACQQxqQb8DEI0MGiAAQTBqIQAgAUFQaiIBDQALCyACQQRqEP8dIQAgAkEQaiQAIAALmwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCEDIAEoAgBB8u6aAUEBIAEoAgQoAgwRDAAhBCACQQA6AAkgAiAEOgAIIAIgATYCBAJAIANFDQAgA0E4bCEBA0AgAiAANgIMIAJBBGogAkEMakHtAxCNDBogAEE4aiEAIAFBSGoiAQ0ACwsgAkEEahD/HSEAIAJBEGokACAAC5sBAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgghAyABKAIAQfLumgFBASABKAIEKAIMEQwAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQCQCADRQ0AIANBMGwhAQNAIAIgADYCDCACQQRqIAJBDGpBggQQjQwaIABBMGohACABQVBqIgENAAsLIAJBBGoQ/x0hACACQRBqJAAgAAubAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIQMgASgCAEHy7poBQQEgASgCBCgCDBEMACEEIAJBADoACSACIAQ6AAggAiABNgIEAkAgA0UNACADQThsIQEDQCACIAA2AgwgAkEEaiACQQxqQYQEEI0MGiAAQThqIQAgAUFIaiIBDQALCyACQQRqEP8dIQAgAkEQaiQAIAALmwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCEDIAEoAgBB8u6aAUEBIAEoAgQoAgwRDAAhBCACQQA6AAkgAiAEOgAIIAIgATYCBAJAIANFDQAgA0E4bCEBA0AgAiAANgIMIAJBBGogAkEMakGeBBCNDBogAEE4aiEAIAFBSGoiAQ0ACwsgAkEEahD/HSEAIAJBEGokACAAC5sBAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgghAyABKAIAQfLumgFBASABKAIEKAIMEQwAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQCQCADRQ0AIANBBHQhAQNAIAIgADYCDCACQQRqIAJBDGpBnQQQjQwaIABBEGohACABQXBqIgENAAsLIAJBBGoQ/x0hACACQRBqJAAgAAubAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIQMgASgCAEHy7poBQQEgASgCBCgCDBEMACEEIAJBADoACSACIAQ6AAggAiABNgIEAkAgA0UNACADQRhsIQEDQCACIAA2AgwgAkEEaiACQQxqQbMEEI0MGiAAQRhqIQAgAUFoaiIBDQALCyACQQRqEP8dIQAgAkEQaiQAIAALmwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCEDIAEoAgBB8u6aAUEBIAEoAgQoAgwRDAAhBCACQQA6AAkgAiAEOgAIIAIgATYCBAJAIANFDQAgA0EFdCEBA0AgAiAANgIMIAJBBGogAkEMakG2BBCNDBogAEEgaiEAIAFBYGoiAQ0ACwsgAkEEahD/HSEAIAJBEGokACAAC5sBAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgghAyABKAIAQfLumgFBASABKAIEKAIMEQwAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQCQCADRQ0AIANBOGwhAQNAIAIgADYCDCACQQRqIAJBDGpBuAQQjQwaIABBOGohACABQUhqIgENAAsLIAJBBGoQ/x0hACACQRBqJAAgAAubAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIQMgASgCAEHy7poBQQEgASgCBCgCDBEMACEEIAJBADoACSACIAQ6AAggAiABNgIEAkAgA0UNACADQQJ0IQEDQCACIAA2AgwgAkEEaiACQQxqQdICEI0MGiAAQQRqIQAgAUF8aiIBDQALCyACQQRqEP8dIQAgAkEQaiQAIAALmwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCEDIAEoAgBB8u6aAUEBIAEoAgQoAgwRDAAhBCACQQA6AAkgAiAEOgAIIAIgATYCBAJAIANFDQAgA0EEdCEBA0AgAiAANgIMIAJBBGogAkEMakH+AhCNDBogAEEQaiEAIAFBcGoiAQ0ACwsgAkEEahD/HSEAIAJBEGokACAAC5sBAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgghAyABKAIAQfLumgFBASABKAIEKAIMEQwAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQCQCADRQ0AIANBBHQhAQNAIAIgADYCDCACQQRqIAJBDGpBzwQQjQwaIABBEGohACABQXBqIgENAAsLIAJBBGoQ/x0hACACQRBqJAAgAAu0AQECf0EIIQJBBCEDAkACQAJAAkACQAJAAkACQCABKAIADhQHBwABAQIBAgEBAwMBAQEEAQUGAQcLQRxBGCABKAIEQYCAgIB4RiIDGyECQRhBFCADGyEDDAYLQQwhAkEIIQMMBQtBFCECQRAhAwwEC0EYIQJBFCEDDAMLQRAhAkEMIQMMAgtBLCECQSghAwwBC0EkIQJBICEDCyAAIAEgAmooAgA2AgQgACABIANqKAIANgIAC5sBAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgghAyABKAIAQfLumgFBASABKAIEKAIMEQwAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgA0EDdCEBAkADQCABRQ0BIAIgADYCDCACQQRqIAJBDGpB2wQQjQwaIAFBeGohASAAQQhqIQAMAAsLIAJBBGoQ/x0hASACQRBqJAAgAQubAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIQMgASgCAEHy7poBQQEgASgCBCgCDBEMACEEIAJBADoACSACIAQ6AAggAiABNgIEAkAgA0UNACADQQJ0IQEDQCACIAA2AgwgAkEEaiACQQxqQaQFEI0MGiAAQQRqIQAgAUF8aiIBDQALCyACQQRqEP8dIQAgAkEQaiQAIAALmwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCEDIAEoAgBB8u6aAUEBIAEoAgQoAgwRDAAhBCACQQA6AAkgAiAEOgAIIAIgATYCBAJAIANFDQAgA0EMbCEBA0AgAiAANgIMIAJBBGogAkEMakHOBRCNDBogAEEMaiEAIAFBdGoiAQ0ACwsgAkEEahD/HSEAIAJBEGokACAAC5sBAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgghAyABKAIAQfLumgFBASABKAIEKAIMEQwAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQCQCADRQ0AIANBMGwhAQNAIAIgADYCDCACQQRqIAJBDGpBxwUQjQwaIABBMGohACABQVBqIgENAAsLIAJBBGoQ/x0hACACQRBqJAAgAAubAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIQMgASgCAEHy7poBQQEgASgCBCgCDBEMACEEIAJBADoACSACIAQ6AAggAiABNgIEAkAgA0UNACADQTBsIQEDQCACIAA2AgwgAkEEaiACQQxqQeAFEI0MGiAAQTBqIQAgAUFQaiIBDQALCyACQQRqEP8dIQAgAkEQaiQAIAALmwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCEDIAEoAgBB8u6aAUEBIAEoAgQoAgwRDAAhBCACQQA6AAkgAiAEOgAIIAIgATYCBAJAIANFDQAgA0E4bCEBA0AgAiAANgIMIAJBBGogAkEMakGIBhCNDBogAEE4aiEAIAFBSGoiAQ0ACwsgAkEEahD/HSEAIAJBEGokACAAC5sBAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgghAyABKAIAQfLumgFBASABKAIEKAIMEQwAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQCQCADRQ0AIANBMGwhAQNAIAIgADYCDCACQQRqIAJBDGpBnwYQjQwaIABBMGohACABQVBqIgENAAsLIAJBBGoQ/x0hACACQRBqJAAgAAubAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIQMgASgCAEHy7poBQQEgASgCBCgCDBEMACEEIAJBADoACSACIAQ6AAggAiABNgIEAkAgA0UNACADQThsIQEDQCACIAA2AgwgAkEEaiACQQxqQaAGEI0MGiAAQThqIQAgAUFIaiIBDQALCyACQQRqEP8dIQAgAkEQaiQAIAALmwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCEDIAEoAgBB8u6aAUEBIAEoAgQoAgwRDAAhBCACQQA6AAkgAiAEOgAIIAIgATYCBAJAIANFDQAgA0E4bCEBA0AgAiAANgIMIAJBBGogAkEMakGsBhCNDBogAEE4aiEAIAFBSGoiAQ0ACwsgAkEEahD/HSEAIAJBEGokACAAC5sBAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgghAyABKAIAQfLumgFBASABKAIEKAIMEQwAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQCQCADRQ0AIANBBHQhAQNAIAIgADYCDCACQQRqIAJBDGpBqwYQjQwaIABBEGohACABQXBqIgENAAsLIAJBBGoQ/x0hACACQRBqJAAgAAubAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIQMgASgCAEHy7poBQQEgASgCBCgCDBEMACEEIAJBADoACSACIAQ6AAggAiABNgIEAkAgA0UNACADQRhsIQEDQCACIAA2AgwgAkEEaiACQQxqQcAGEI0MGiAAQRhqIQAgAUFoaiIBDQALCyACQQRqEP8dIQAgAkEQaiQAIAALmwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCEDIAEoAgBB8u6aAUEBIAEoAgQoAgwRDAAhBCACQQA6AAkgAiAEOgAIIAIgATYCBAJAIANFDQAgA0E4bCEBA0AgAiAANgIMIAJBBGogAkEMakHFBhCNDBogAEE4aiEAIAFBSGoiAQ0ACwsgAkEEahD/HSEAIAJBEGokACAAC5sBAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgghAyABKAIAQfLumgFBASABKAIEKAIMEQwAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQCQCADRQ0AIANBAnQhAQNAIAIgADYCDCACQQRqIAJBDGpB7AQQjQwaIABBBGohACABQXxqIgENAAsLIAJBBGoQ/x0hACACQRBqJAAgAAubAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIQMgASgCAEHy7poBQQEgASgCBCgCDBEMACEEIAJBADoACSACIAQ6AAggAiABNgIEAkAgA0UNACADQQR0IQEDQCACIAA2AgwgAkEEaiACQQxqQagFEI0MGiAAQRBqIQAgAUFwaiIBDQALCyACQQRqEP8dIQAgAkEQaiQAIAALmwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCEDIAEoAgBB8u6aAUEBIAEoAgQoAgwRDAAhBCACQQA6AAkgAiAEOgAIIAIgATYCBAJAIANFDQAgA0EEdCEBA0AgAiAANgIMIAJBBGogAkEMakHZBhCNDBogAEEQaiEAIAFBcGoiAQ0ACwsgAkEEahD/HSEAIAJBEGokACAAC6UBAQF/AkACQAJAAkACQCAAKAIADgUEAAECAwQLIAAoAgRBAUcNAyABLQA5IQIgAUEBOgA5IAAoAgggARB5IAEgAjoAOQ8LIAEtADkhAiABQQE6ADkgACgCBCABEHkgASACOgA5DwsgASAAKAIEEPkFDwsgACgCDCICRQ0AIAJBKGwhAiAAKAIIIQADQCAAIAEQtwQgAEEoaiEAIAJBWGoiAg0ACwsLpgEAAkAgACgCAEUNACAAIAEQzAQgASAAEIAJCwJAIAAoAjAiAEUNACAAIAEQXCAAKAIAQRpHDQAgASAAQQhqEJILIgFFDQAgABCHAiAAIAEpAzg3AzggACABKQMwNwMwIAAgASkDKDcDKCAAIAEpAyA3AyAgACABKQMYNwMYIAAgASkDEDcDECAAIAEpAwg3AwggACABKQMANwMAIAFBwABBCBDUFAsLtAEBAn9BCCECQQQhAwJAAkACQAJAAkACQAJAAkAgASgCAA4UBwcAAQECAQIBAQMDAQEBBAEFBgEHC0EcQRggASgCBEGAgICAeEYiAxshAkEYQRQgAxshAwwGC0EMIQJBCCEDDAULQRQhAkEQIQMMBAtBGCECQRQhAwwDC0EQIQJBDCEDDAILQSwhAkEoIQMMAQtBJCECQSAhAwsgACABIAJqKAIANgIEIAAgASADaigCADYCAAuzAQECfyMAQSBrIgQkAAJAAkAgASgCAEGAgICAeEYNACAEQQhqEPsgQQRBOBDoICIFQajjmgE2AgAgBSADNgIgIAUgAjYCHCAFIAQpAgg3AgQgBSAEKQIQNwIMIAUgBCkCGDcCFCAFIAEpAgA3AiQgBSABKQIINwIsIAUgASgCEDYCNCAAQYCAgIB4NgIAIAAgBTYCBAwBCyAAIAEoAgw2AgggACABKQIENwIACyAEQSBqJAALmgEBA38jAEEQayICJAACQCABRQ0AIAAoAhwgACgCICABKAIQEMciIQMgAiAAKAIoIAAoAiwgASgCDCIEIAMoAgAiAyAEIANJGyAEIAMgBCADSxsQhxogAiACKAIAIgQgAigCBGo2AgwgAiAENgIIIAJBCGoQuRRFDQAgASgCDCEBIAAgA0EgEKgbIAAgAUEoEKgbCyACQRBqJAALrgEBAn8jAEEgayICJAAgASgCACEDIAFBlYCAgHg2AgACQAJAAkAgA0GVgICAeEYNACACIAEoAgw2AhQgAiABKQIENwIMIAIgAzYCCAJAIANBgICAgHhHDQAgACACLQAMOgABIAJBCGoQiBRBACEBDAMLIAAgAkEIaiACQR9qQcC5gQEQoh42AgQMAQsgAEHkwIEBQRAQ4Rs2AgQLQQEhAQsgACABOgAAIAJBIGokAAujAQEDfyMAQRBrIgMkAAJAIAJB/////wdPDQAgASgC2AIhBAJAIAEoAggiBSABKAIARw0AIAEQkxoLIAAgBTYCBCAAQQM2AgAgASAFQQFqNgIIIAEoAgQgBUEUbGoiASACNgIQIAEgBDYCDCABQQA2AgggAUIANwIAIANBEGokAA8LIAMgAq03AwhB2NiBAUE0IANBCGpB8MmBAUGM2YEBENUUAAuSAQEBfyMAQRBrIgUkAAJAAkAgASgCACIBQQFxDQAgACABIAIgAxDEDgwBCyAFIAEgBBEEACIBNgIAIAUgAiABayICIANqIgE2AgggBSABNgIEIAVBICABQQp2Z2siAUEHIAFBB0kbQQJ0QQFyNgIMIAUgAhCvDSAAIAUpAgg3AgggACAFKQIANwIACyAFQRBqJAALkQEBA38CQCABIAAoAgAgACgCCCICa00NACAAIAIgAUEEQQQQ1BogACgCCCECCyAAKAIEIAJBAnRqIQMCQAJAAkAgAUECSQ0AIAFBf2ohBANAIANBADYCACADQQRqIQMgBEF/aiIEDQALIAIgAWpBf2ohAgwBCyABRQ0BCyADQQA2AgAgAkEBaiECCyAAIAI2AggLkQEBA38CQCABIAAoAgAgACgCCCICa00NACAAIAIgAUEEQQQQ1BogACgCCCECCyAAKAIEIAJBAnRqIQMCQAJAAkAgAUECSQ0AIAFBf2ohBANAIANBADYCACADQQRqIQMgBEF/aiIEDQALIAIgAWpBf2ohAgwBCyABRQ0BCyADQQA2AgAgAkEBaiECCyAAIAI2AggLlQEBA38jAEEQayIDJAACQAJAAkAgAkEBcUUNACADQQRqIAJBAXYiAkEAQQFBARDBDyADKAIIIQQgAygCBEEBRg0CIAMoAgwhBQJAIAJFDQAgAkUNACAFIAEgAvwKAAALIAAgAjYCCCAAIAU2AgQgACAENgIADAELIAAgASACEM0ICyADQRBqJAAPCyAEIAMoAgwQ/CAAC5IBAgF/An4gACAAKAI4QQFqNgI4IAAgAa1C/wGDIgMgACgCPCIBQQN0rYYgACkDMIQiBDcDMAJAAkBBCCABayICQQFLDQAgACAAKQMYIASFNwMYIAAQmw4gACkDMCEEIAAgAyACQQN0rYg3AzAgACAEIAApAwCFNwMAIAFBeWohAQwBCyABQQFqIQELIAAgATYCPAuZAQIDfwF+AkAgACgCCCIBRQ0AIAAoAgQhAANAIABBCGohAgJAAkAgACgCAA0AIAIpAwAiBEIDg0IAUg0BIASnIgIgAigCACIDQX9qNgIAIANBAUcNASACIAIoAhAQ7B4MAQsgAhCtEgsCQCAAQShqKAIAIgJFDQAgAhCcASACQcAAQQgQ1BQLIABBMGohACABQX9qIgENAAsLC6MBAgF/AX4jAEEQayICJAACQAJAAkACQCAAKAIAIgApAwAiA6dBfmpBAiADQgFWGw4DAAECAAsgAiAAQQhqNgIEIAFBoamaAUEJIAJBBGpBlgYQwQwhAAwCCyACIABBCGo2AgggAUGaqZoBQQcgAkEIakGXBhDBDCEADAELIAIgADYCDCABQZWpmgFBBSACQQxqQZgGEMEMIQALIAJBEGokACAAC6MBAgF/AX4jAEEQayICJAACQAJAAkACQCAAKAIAIgApAwAiA6dBfmpBACADQgJWGw4DAAECAAsgAiAANgIEIAFBlamaAUEFIAJBBGpBnAYQwQwhAAwCCyACIABBCGo2AgggAUGaqZoBQQcgAkEIakGdBhDBDCEADAELIAIgAEEIajYCDCABQaGpmgFBCSACQQxqQZ4GEMEMIQALIAJBEGokACAAC9MBAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDQR9xIQILIAMgAnS3C9MBAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDQR9xIQILIAMgAnW3C9MBAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv//////////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ASAANgI8C5cBAQJ/IwBBIGsiAiQAIAIgATYCACACQQA2AhAgAkIANwIIIAIgACABIAJBCGoQjQsiAzYCBAJAIAEgAyAAKAJkaiIDTw0AIAJBFzYCHCACQQc2AhQgAkEXNgIMIAIgAEHkAGo2AgggAiACNgIYIAIgAkEEajYCEEHUjIABIAJBCGpBuMSYARDkGwALIAJBIGokACABIANrC58BAQZ/IwBBEGsiASQAIAFBCEEIQQQQiw4gASgCCCECIAEoAgQhAwJAAkAgASgCACIEDQAMAQsgASgCDCEFIANBCWoiBkUNACAEQf8BIAb8CwALIAEgBTYCDCABIAI2AgggASADNgIEIAEgBDYCACABQsHK2YvGDRDjBhogARC/GxDjBhogACABKQIINwIIIAAgASkCADcCACABQRBqJAALqAEAAkACQAJAAkACQCABQXtqDgUAAQMEAgQLIAAoAABB9eal8wZzIABBBGotAABB5wBzcg0DQZsBDwsgACgAAEH13KWLB3MgAEEEai8AAEH1ygFzcg0CQZkBDwsgACkAAEL13JGr5qyat+UAhSAAQQhqMQAAQuQAhYRQRQ0BQZgBDwsgACgAAEH13K3zBnMgAEEDaigAAEHu3t3zBnNyDQBBmgEPC0GkAQuiAQEBfwJAIAAoAgAiAUEDRg0AAkACQAJAIAEOAgECAAsgACgCGCEBIAAoAgQiABDPCyAAQShBCBDUFCABRQ0CIAEoAgAiABCnBCAAQeAAQQgQ1BQgAUEMQQQQ1BQPCyAAQQhqEMsOIAAoAigiABDPCyAAQShBCBDUFA8LIAApAxAgACgCKBCiFiAAKAIwIgBFDQAgABCMAiAAQcAAQQgQ1BQLC58BAQJ/IwBBwABrIgIkACABIAEoAngiA0H/fHE2AnggAiABQQAQugYgASADNgJ4IAIoAgAhAQJAAkAgAi0AFCIDQQJHDQAgAEECOgAUIAAgATYCAAwBCyACIAIpAgw3AiwgAiACKQIENwIkIAIgAikAFTcANSACIAIoABw2ADwgAiADOgA0IAIgATYCICAAIAJBIGoQ8hoLIAJBwABqJAAL1wEBAX9BACECAkAgAL1C////////////AINC//////////f/AFUNACAAnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/AMhAgtEAAAAAAAAAAAhAAJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIAJxtyEACyAAC5sBAgV/AX4gASgCDCECIAEoAgAiAykDACEHAkACQCABKAIEIgENAEEAIQQMAQsgAyABQQR0IgRrQXBqIQUgBCABakEZaiEGQQghBAsgACAFNgIoIAAgBjYCJCAAIAQ2AiAgACACNgIYIAAgAzYCECAAIANBCGo2AgggACADIAFqQQFqNgIMIAAgB0J/hUKAgYKEiJCgwIB/gzcDAAuYAQECfyMAQRBrIgYkAEEAIQcCQAJAAkAgAS0AyAFBhAFHDQAgARDlESAGQQhqIAFBACABKALAARDXECAGKAIMIQcgBigCCEEBcQ0BCyAAIAc2AiAgACACNgIYIABBAjoAFCAAIAEoArwBNgIcIAAgBa1CIIYgBK2ENwMADAELIAAgBzYCAEECIQMLIAAgAzoAJCAGQRBqJAALqgEBAn8jAEEwayICJAACQAJAAkAgAS0AyAFB2wBGDQBBgICAgHghAwwBCyABEOURIAJBCGogAUEAEO8KIAIoAgwhAQJAIAIoAggiA0GAgICAeEYNACACIAIpAhg3AyggAiACKQIQNwMgDAELIABBgYCAgHg2AgAgACABNgIEDAELIAAgATYCBCAAIAM2AgAgACACKQMgNwIIIAAgAikDKDcCEAsgAkEwaiQAC58BAQJ/IwBBwABrIgIkACABIAEoAngiA0H/fHE2AnggAiABQQAQigcgASADNgJ4IAIoAgAhAQJAAkAgAi0AFCIDQQJHDQAgAEECOgAUIAAgATYCAAwBCyACIAIpAgw3AiwgAiACKQIENwIkIAIgAikAFTcANSACIAIoABw2ADwgAiADOgA0IAIgATYCICAAIAJBIGoQ8hoLIAJBwABqJAALjgEBBn8gACgCACEDIAMgAyAAKAIEIgQgARCPEiIFaiIGLQAAIQcgBiABp0EZdiIIOgAAIAMgBCAFQXhqcWpBCGogCDoAACAAIAAoAgxBAWo2AgwgACAAKAIIIAdBAXFrNgIIIANBACAFa0EYbGpBaGoiACACKQMANwMA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QAJAAkACQCABQXxqDgUAAQMDAgMLIAAoAABB48LNqwZHDQJBzgAPCwJAIAAoAABB48LRmwZzIABBBGoiAS0AAEHoAHNyDQBBzwAPCwJAIAAoAABB49iFmwdzIAEtAABB8wBzcg0AQdAADwsgACgAAEHj3rmbB3MgAEEEai0AAEH0AHNyDQFB0QAPCyAAKQAAQuPeuaOXzdu65QBSDQBB0gAPC0GkAQuwAQACQAJAAkACQAJAAkAgAUF+ag4HAwUFBQIBAAULIAApAABC5MqJq/fs2bLyAFINBEHTAA8LIAAoAABB5MqZiwZzIABBA2oiASgAAEHh6rGjB3NyDQJB1AAPCyAAKAAAQeTKsasGcyAAQQRqLwAAQfTKAXNyDQJB1QAPCyAALwAAQeTeAUcNAUHWAA8LIAAoAABB5MqN4wZzIAEoAABB7MLJqwZzcg0AQfwADwtBpAELmgECAn8BfiMAQTBrIgMkACABKAJ4IQQgA0EAOgAXIANBADoAFiADIAI2AhAgASAEQf/8729xQYCAgBByNgJ4IANBADYCICADQoCAgIDAADcCGCADIANBEGo2AiwgAyADQRZqNgIoIAMgA0EXajYCJCADQQhqIANBGGogARDMAiADKQMIIQUgASAENgJ4IAAgBTcDACADQTBqJAALhgECAn8BfiABQgODIQUCQAJAAkACQCAAKAIAQQFHDQAgAiAAKAIERg0BC0EIIQMgBUIAUg0BIAGnIgQgBCgCACIEQQFqNgIAIARBf0oNAQwCC0EYIQMgBUIAUg0AIAGnIgQgBCgCACIEQQFqNgIAIARBf0wNAQsgACADaiABIAIQhQcaDwsAC8wBAQF/QQAhAgJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQILAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/AMgAnIhAgsgArcLzAEBAX9BACECAkAgAL1C////////////AINC//////////f/AFUNACAAnSIAIABEAAAAAAAA8D2i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IARqIAE6AAAgAkF/aiICDQALCwt2AQF/AkAgASADRg0AQQAPCwJAIAENAEEBDwsgAUF/aiEBAkADQCAALQAAIAItAABGIABBAWotAABB/wFxIAJBAWotAABB/wFxRnEiBEEBRw0BIAFBAEchAyAAQQJqIQAgAkECaiECIAFBf2ohASADDQALCyAEC5cBAgJ/AXwjAEEwayICJAACQAJAIAErAwAiBEQAAAAAAAAAAGENAAJAAkAgBL1C////////////AINC//////////f/AFUNACAEIAJBF2oQnwIgAkEXamshASACQRdqIQMMAQsgAkEIaiAEEOsbIAIoAgwhASACKAIIIQMLIAAgAyABEOYUDAELIAAgARDdEwsgAkEwaiQAC4gBAQN/AkAgAS0ANEEBRw0AIAEtADkhAiABLQA6IQMCQCAAKAIIIgRFDQAgBEECdCEEIAAoAgQhAANAAkAgAS0ANEEBRw0AIAFBgQI7ADkgACgCACABEJECIAFBAToAOiABIAI6ADkLIABBBGohACAEQXxqIgQNAAsLIAEgAzoAOiABIAI6ADkLC5EBAQN/AkACQEEAKALolZ0BIgJFDQAgASgCECIDIAIQ/hgiAkEMaigCACIESQ0BIAMgBEG44pkBEPUWAAtB4OSaAUHIAEGo5ZoBEMYkAAsgAkEIaigCACADQQN0aigCACEDIAJBADoAAAJAIAMgACgCLEcNACABQQA2AhALIABBAToAOiAAIAEQsBIgAEEAOgA6C4oBACAAQQA6ABggAEF/NgIUIAAgBjYCECAAIAU2AgwgACAENgIIIAAgAzYCBCAAIAI2AgACQCABKAIUIgYgASgCDEcNACABQQxqEMkaCyABIAZBAWo2AhQgASgCECAGQRxsaiIBIAApAgA3AgAgASAAKQIINwIIIAEgACkCEDcCECABIAAoAhg2AhgLlwEBAn8jAEEgayIBJAACQAJAIAAoApgBIgJBC0cNACABIAAQwiAMAQsgAEELNgKYASABIAI2AhAgASAAKQKoATcDACABIAAoArABNgIIIAEgACkCnAE3AhQgASAAKAKkATYCHCAAIAFBEGoQqx4LIAAgASgCCDYCyAEgACAAKQPAATcDuAEgACABKQMANwLAASABQSBqJAALcwEEf0F/IQNBACEEAkAgAUUNAAJAA0ACQCABQQFLDQAgACAEQQxsaigCACIBIAJHDQJBACEDDAMLIAQgAUEBdiIFIARqIgYgACAGQQxsaigCACACSxshBCABIAVrIQEMAAsLIAQgASACSWohBAsgAyAEagtuAQZ+IAAgA0L/////D4MiBSABQv////8PgyIGfiIHIANCIIgiCCAGfiIGIAUgAUIgiCIJfnwiBUIghnwiCjcDACAAIAggCX4gBSAGVK1CIIYgBUIgiIR8IAogB1StfCAEIAF+IAMgAn58fDcDCAt5AgF/AX4CQAJAIAGtIAKtfiIEQiCIpw0AIASnIgFBeEsNACACQQhqIgMgAUEHakF4cSIBaiICIANJDQECQCACQfj///8HSw0AIAAgATYCCCAAIAI2AgQgAEEINgIADwsgAEEANgIADwsgAEEANgIADwsgAEEANgIAC44BAQJ/IwBBEGsiAiQAAkACQAJAAkACQAJAAkAgAUIDVg0AIAGnDgQBAgMEAQtBASEDIAJBAToAACACIAE3AwggACACQdS/gQEQkhg2AgQMBQtBACEDIABBADoAAQwECyAAQQE6AAEMAgsgAEECOgABDAELIABBAzoAAQtBACEDCyAAIAM6AAAgAkEQaiQAC48BAQN/IwBBEGsiAiQAAkACQAJAAkAgASgCAEGVgICAeEcNAEEAIQMMAQtBACEDAkACQCABKAIAIgRBgICAgHhzQRUgBEEASBtBbmoOBAEDAwADCyABKAIIDQILIAEQiBQLDAELQQEhAyABIAJBD2pBrMGBARCiHiEBCyAAIAE2AgQgACADNgIAIAJBEGokAAuJAQECfyMAQRBrIgIkACABKAIAIQMgAUEANgIAIAEoAgQhASADEPkgAkACQCABELgjDQAgAkEIaiABELoUQQEhAQJAAkAgAi0ACEEBRw0AIAAgAigCDDYCBAwBCyAAIAItAAk6AAFBACEBCyAAIAE6AAAMAQsgAEGABDsBACABEM0iCyACQRBqJAALgAEBAn8jAEEQayIDJAAgAigCAEHy7poBQQEgAigCBCgCDBEMACEEIANBADoACSADIAQ6AAggAyACNgIEAkAgAUUNAANAIAMgADYCDCADQQRqIANBDGpBKxCNDBogAEEBaiEAIAFBf2oiAQ0ACwsgA0EEahD/HSEAIANBEGokACAAC3UBAX8CQCABKAIAIgJFDQAgACABKAIIQX9qQXhxakEIaiACEQMACwJAIABBf0YNACAAIAAoAgQiAkF/ajYCBCACQQFHDQAgASgCBCABKAIIIgFBBCABQQRLGyIBakEHakEAIAFrcSICRQ0AIAAgAiABENQUCwt5AgF/AX4CQAJAIAGtIAKtfiIEQiCIpw0AIASnIgFBeEsNACACQQhqIgMgAUEHakF4cSIBaiICIANJDQECQCACQfj///8HSw0AIAAgATYCCCAAIAI2AgQgAEEINgIADwsgAEEANgIADwsgAEEANgIADwsgAEEANgIAC3UBAX8CQCABKAIAIgJFDQAgACABKAIIQX9qQXhxakEIaiACEQMACwJAIABBf0YNACAAIAAoAgQiAkF/ajYCBCACQQFHDQAgASgCBCABKAIIIgFBBCABQQRLGyIBakEHakEAIAFrcSICRQ0AIAAgAiABENQUCwt6AQF/IAIgARDVJCABQQR0IQMgAEEMaiEBAkADQCADRQ0BIAFBeGooAgAgAUF8aigCACACENYiIAIgAS0AACIAQXdqQQsgAEEISxtB/wFxIgAQkiACQCAAQQtHDQAgAS0AACACEO8jCyADQXBqIQMgAUEQaiEBDAALCwuPAQECfyMAQRBrIgIkACAAQQRqIQMCQAJAAkACQCAAKAIADgMAAQIACyACIAM2AgQgAUGfrpoBQQcgAkEEakHeAxDBDCEADAILIAIgAzYCCCABQeqqmgFBCSACQQhqQd8DEMEMIQAMAQsgAiADNgIMIAFBkLqaAUEDIAJBDGpBmAQQwQwhAAsgAkEQaiQAIAALhQECAn8BfgJAAkAgACgCACIALQAlQQJHDQAgAEEEaiIBKAIAIABBCGooAgAQoR8gACgCACABKAIAEPUjDAELAkAgACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDsHgsgAEEgahDyEQsgAEEoQQgQ1BQLjwEBAn8jAEEQayICJAAgAEEEaiEDAkACQAJAAkAgACgCAA4DAAECAAsgAiADNgIEIAFBn66aAUEHIAJBBGpB+gUQwQwhAAwCCyACIAM2AgggAUHqqpoBQQkgAkEIakH7BRDBDCEADAELIAIgAzYCDCABQZC6mgFBAyACQQxqQb0GEMEMIQALIAJBEGokACAAC4UBAgJ/AX4CQAJAIAAoAgAiAC0AJUECRw0AIABBBGoiASgCACAAQQhqKAIAEKEfIAAoAgAgASgCABD1IwwBCwJAIAApAwgiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQ7B4LIABBIGoQ9BELIABBKEEIENQUC6ABAQJ/AkACQAJAQQAtAPyVnQEiAUEBRg0AAkACQCAARQ0AIAAoAgAhAiAAQQA2AgAgAkUNACAAKAIEIQAMAQtBAEEAKALQkJ0BIgBBAWo2AtCQnQEgAEUNAgsgAUECRg0CQQBBAToA/JWdAUEAIAA2AviVnQELQfiVnQEPC0H+jZsBQdcAQayOmwEQ5BsAC0HIpZwBQf0AQYimnAEQ5BsAC38BAX8CQAJAIAIgASgCCCIFTw0AAkACQCADQQFGDQAgASgCBCACQRRsaiEBDAELIAQgASgCFCICTw0CIAEoAhAgBEEJbGpBBWohAQsgACABKAAAIgE2AgQgACABQQBHNgIADwsgAiAFQajcgQEQ9RYACyAEIAJBsMmBARD1FgALeAECfyMAQRBrIgUkACAFQQhqIAIgAyAEIAIoAgARDgAgBSgCDCECIAUoAgghAyABIAEoAgBBAWoiBkF/IAYbNgIAIAFBfyABKAIEIgYgAiAEIANBAXEbaiIEIAQgBkkbNgIEIAAgAjYCBCAAIAM2AgAgBUEQaiQAC4IBAQN/IwBBEGsiAiQAIAAoAgAhA0EAIQAgASgCAEHy7poBQQEgASgCBCgCDBEMACEEIAJBADoACSACIAQ6AAggAiABNgIEA0AgAiADIABqNgIMIAJBBGogAkEMakH+ABCNDCEBIABBAWoiAEGAAkcNAAsgARD/HSEAIAJBEGokACAAC3wBAX8CQAJAAkAgAUUNAEEAIQMCQCAAQQhqIgAtAABBAnFFDQAgASACQQJ0QQ1qIgNJDQIgASADayIBQQNNDQMgACADaigAACEDCyADDwtBAEEAQaT/hAEQ9RYACyADIAEgAUGU/4QBEI8KAAtBAEEEIAFBoJOFARCPCgALgAEBAX8CQCABKAIAIgUtABBBAXFFDQAgBBCrCQsCQCADRQ0AIAQQ+AULAkACQCAFLQAXRQ0AIAQoAggiA0UNACAEKAIEIANBAXRqIgRBfmpFDQAgBEF/aiwAAEEASA0BCyAAQYCAgIB4NgIADwsgACABKAIEIAEoAgggAkEBEKkQC38BA38jAEEQayIDJAAgA0EEaiACQQFBARCsESADKAIIIQQCQCADKAIEQQFGDQAgAygCDCEFIABBADYCCCAAIAU2AgQgACAENgIAAkAgAkUNAAJAIAJFDQAgBSABIAL8CgAACyAAIAI2AggLIANBEGokAA8LIAQgAygCDBD8IAALlAECAn8BfiMAQSBrIgIkAAJAIAEoAgBBgICAgHhHDQAgASgCDCEDIAJBADYCHCACQoCAgIAQNwIUIAJBFGpBkK+YASADKAIAIgMoAgAgAygCBBDLBhogAiACKAIcIgM2AhAgAiACKQIUIgQ3AwggASADNgIIIAEgBDcCAAsgAEGgu5gBNgIEIAAgATYCACACQSBqJAALgQEBAX8gACgCCCIBIAEoAgAiAUF/ajYCAAJAIAFBAUcNACAAKAIIIABBDGooAgAQ7xELIAAoAhAiASABKAIAIgFBf2o2AgACQCABQQFHDQAgACgCEBDcEAsCQCAAQX9GDQAgACAAKAIEIgFBf2o2AgQgAUEBRw0AIABBFEEEENQUCwt9AQF/AkAgAC0AeEECcUUNAAJAIAAoAkgiAiAAKAJARw0AIABBwABqELMaCyAAIAJBAWo2AkggACgCRCACQQJ0aiABNgIADwsCQCAAKAJUIgIgACgCTEcNACAAQcwAahCzGgsgACACQQFqNgJUIAAoAlAgAkECdGogATYCAAt/AQR/IwBBEGsiAyQAIAEgASgCeCIEQcAAcjYCeEEAIQUCQANAIANBCGogASACIAUQzQEgAygCCCECAkAgAy0ADCIGQQJHDQBBASEFDAILIAMtAA0hBSAGQQFxDQALQQAhBQsgASAENgJ4IAAgAjYCBCAAIAU2AgAgA0EQaiQAC3sBAX8DQCAAKAIAIgJBIGohACACLQAlQQJHDQALAkAgAkEIaigCACIARQ0AIABBOGwhACACQQRqKAIAIQIDQAJAAkAgAigCAEEJRw0AIAEtAAANASACQQhqIAEQrAMMAQsgAiABEN4ECyACQThqIQIgAEFIaiIADQALCwt9AgR/AX4CQCAAKAIMIgEgACgCBCICRg0AIAEgAmtBBHYhAQNAAkAgAikDACIFQgODQgBSDQAgBaciAyADKAIAIgRBf2o2AgAgBEEBRw0AIAMgAygCEBDsHgsgAkEQaiECIAFBf2oiAQ0ACwsgACgCCCAAKAIAQQhBEBDPEwuCAQEDfyMAQRBrIgEkAAJAAkACQCAALQDIASICQbV/aiIDQR9LDQBBASADdEGBgIKQeHENAQsgAkG0f2pB/wFxQdQASw0BCyABQQRqIAAgACgCwAEQ3wEgACABQQRqEKMPIABBwAFqIgAgASgCDDYCCCAAIAEpAgQ3AgALIAFBEGokAAuLAQECfyMAQSBrIgIkAAJAQQAoAuyVnQEiA0UNACACQQRqIAMgASgCCCABKAIMQbf4mgFBiAEQ3BIgAkEUakHq9poBQREQtRQgAkEANgIQIAIoAggiAxDcICADIAIpAhg3AgggAyACKQIQNwIAIAJBBGoQ7wIgAkEEahCdDgsgASAAEKklIAJBIGokAAuLAQEDfyMAQSBrIgIkACACIAE2AgwgAkEQaiABEMUVAkACQCACKAIQIgNBgICAgHhGDQAgAEEEaiACKAIUIgQgAigCGBCcFCADIAQQsSNBjICAgHghAwwBCyAAIAJBDGogAkEfakGguoEBEOsINgIEQZWAgIB4IQMLIAAgAzYCACABEM0iIAJBIGokAAuFAQEBfyMAQRBrIgIkAAJAAkAgASgCACIBEJ8kRQ0AIAJBBGogARCfECAAIAIoAgw2AgggACACKQIENwIADAELAkAgARAyRQ0AIAJBBGogARArIgEQnxAgACACKAIMNgIIIAAgAikCBDcCACABEM0iDAELIABBgICAgHg2AgALIAJBEGokAAtzAQJ/IwBBEGsiAiQAIAAtAAAhA0EDIQADQCACQQ5qIABqQX5qIANBD3FB0KScAWotAAA6AAAgAEF/aiEAIANBBHZBD3EiAw0ACyABQQFBrMyXAUECIAJBDmogAGpBf2pBAyAAaxDOBiEAIAJBEGokACAAC3YBA38jAEEQayIDJAAgACgCCCIEIAEgBCABSxshBQN/AkACQCAFIARGDQAgA0EIaiACEOgbIAMtAAgNASAEIQULIANBEGokACAFIAFPDwsgACgCBCAEaiADLQAJOgAAIAAgACgCCEEBajYCCCAEQQFqIQQMAAsLdAECfyMAQRBrIgIkACAALwEAIQNBBSEAA0AgAkEMaiAAakF+aiADQQ9xQeCLgwFqLQAAOgAAIABBf2ohACADQQR2Qf8fcSIDDQALIAFBAUGszJcBQQIgAkEMaiAAakF/akEFIABrEM4GIQAgAkEQaiQAIAALdAECfyMAQRBrIgIkACAALwEAIQNBBSEAA0AgAkEMaiAAakF+aiADQQ9xQdCknAFqLQAAOgAAIABBf2ohACADQQR2Qf8fcSIDDQALIAFBAUGszJcBQQIgAkEMaiAAakF/akEFIABrEM4GIQAgAkEQaiQAIAALewECfyABIAKncSEDQQghBAJAA0AgACADaikAAEKAgYKEiJCgwIB/gyICQgBSDQEgAyAEaiABcSEDIARBCGohBAwACwsCQCAAIAJ6p0EDdiADaiABcSIDaiwAAEEASA0AIAApAwBCgIGChIiQoMCAf4N6p0EDdiEDCyADC4YBAQR/IwBBEGsiAyQAAkACQCABKAIAIgQgAigCACIFTw0AIAMgAigCCDYCCCADIAIpAgA3AwAgACADIAEoAgQiBiABKAIIELANDAELIAMgASgCCDYCCCADIAEpAgA3AwAgACADIAIoAgQiBiACKAIIELANIAUhBAsgBCAGENojIANBEGokAAt0AQJ/QQAhAgJAIAEoAhAiA0UNAEEAIQIgASgCDCADQQN0aiIBQXhqRQ0AIAFBfGooAgAhAgsCQAJAQQAgAiADQQF0ayIBIAEgAksbIgIgACgCCCIBSw0AIAAgAjYCCAwBCyAAIAIgAWsQjxALIAAgAjYCDAuCAQECfyMAQSBrIgMkACADQRRqQcLOhQFBBhDSDEEBIQQCQAJAAkAgAy0AFEEBRw0AIAAgAy0AFToAAQwBCyADKAIYIgRFDQEgA0EIaiAEIAMoAhwgASACEN8MIAAgAykDCDcCBEEAIQQLIAAgBDoAACADQSBqJAAPC0Hs7okBEMMjAAt6AQJ/IAEgAqdxIQNBCCEEA38CQCAAIANqKQAAQoCBgoSIkKDAgH+DIgJQDQACQCAAIAJ6p0EDdiADaiABcSIDaiwAAEEASA0AIAApAwBCgIGChIiQoMCAf4N6p0EDdiEDCyADDwsgAyAEaiABcSEDIARBCGohBAwACwt6AQJ/IAEgAqdxIQNBCCEEA38CQCAAIANqKQAAQoCBgoSIkKDAgH+DIgJQDQACQCAAIAMgAnqnQQN2aiABcSIDaiwAAEEASA0AIAApAwBCgIGChIiQoMCAf4N6p0EDdiEDCyADDwsgAyAEaiABcSEDIARBCGohBAwACwt7AQZ/IAEgASgCXCICQX9qIgM2AlwgASABKAJYIgRBAWoiBTYCWCABIAEoAmgiBkEBajYCaEERIQcCQCADRQ0AIAUtAABBPUcNACABIAZBAmo2AmggASACQX5qNgJcIAEgBEECajYCWEEjIQcLIABBADoAACAAIAc6AAELewEGfyABIAEoAlwiAkF/aiIDNgJcIAEgASgCWCIEQQFqIgU2AlggASABKAJoIgZBAWo2AmhBECEHAkAgA0UNACAFLQAAQT1HDQAgASAGQQJqNgJoIAEgAkF+ajYCXCABIARBAmo2AlhBIiEHCyAAQQA6AAAgACAHOgABC3sBBn8gASABKAJcIgJBf2oiAzYCXCABIAEoAlgiBEEBaiIFNgJYIAEgASgCaCIGQQFqNgJoQRUhBwJAIANFDQAgBS0AAEE9Rw0AIAEgBkECajYCaCABIAJBfmo2AlwgASAEQQJqNgJYQSghBwsgAEEAOgAAIAAgBzoAAQt+AQR/IwBBEGsiAiQAIAEgASgCeCIDQcAAcjYCeAJAAkAgAS0AuAFBPkcNACABLQCBAUEgcUUNACABEPsEIgRFDQBBACEFDAELIAJBCGogARCAASACKAIMIQQgAigCCCEFCyABIAM2AnggACAENgIEIAAgBTYCACACQRBqJAALgAEBA38jAEEQayIBJABBASECAkACQAJAIAAoAgAiA0F0akEHIANBC0sbQXJqDgkAAQEBAQEBAQIBCyABQQhqIABBCGoQjRQgASgCDEEFRw0AIAEoAggiACgAAEHh7oXLBnMgAEEEai0AAEH0AHNyRQ0BC0EAIQILIAFBEGokACACC4IBAQN/AkAgAS0ANEEBRw0AIAEtADkhAiABLQA6IQMCQCAAKAIIIgRFDQAgBEECdCEEIAAoAgQhAANAAkAgAS0ANEEBRw0AIAFBgQI7ADkgACgCACABEJECIAFBgQI7ADkLIABBBGohACAEQXxqIgQNAAsLIAEgAzoAOiABIAI6ADkLC4gBACABKAIAIgEgABBcAkAgASgCAEEaRw0AIAAgAUEIahCSCyIARQ0AIAEQhwIgASAAKQM4NwM4IAEgACkDMDcDMCABIAApAyg3AyggASAAKQMgNwMgIAEgACkDGDcDGCABIAApAxA3AxAgASAAKQMINwMIIAEgACkDADcDACAAQcAAQQgQ1BQLC4gBACAAKAIAIgAgARBcAkAgACgCAEEaRw0AIAEgAEEIahCSCyIBRQ0AIAAQhwIgACABKQM4NwM4IAAgASkDMDcDMCAAIAEpAyg3AyggACABKQMgNwMgIAAgASkDGDcDGCAAIAEpAxA3AxAgACABKQMINwMIIAAgASkDADcDACABQcAAQQgQ1BQLC3sBAn8gASACp3EhA0EIIQQCQANAIAAgA2opAABCgIGChIiQoMCAf4MiAkIAUg0BIAMgBGogAXEhAyAEQQhqIQQMAAsLAkAgACADIAJ6p0EDdmogAXEiA2osAABBAEgNACAAKQMAQoCBgoSIkKDAgH+DeqdBA3YhAwsgAwuFAQECfwJAAkAgASgCCCIDRQ0AIAIoAggiBA0BCyAAQQAoAtiQmwE2AgggAEEAKQLQkJsBNwIADwsgAigCBCECIAEoAgQhAQJAIARBAUYNAAJAIANBAUcNACAAIAIgBCABKAIAELEbDwsgACABIAMgAiAEEM0SDwsgACABIAMgAigCABCxGwuDAQECfwJAIAAoAgANACAAQX82AgACQCAAKAIMIgIgACgCBEcNACAAQQRqEJsaCyAAKAIIIAJBHGxqIgMgASkCADcCACADIAEpAgg3AgggAyABKQIQNwIQIAMgASgCGDYCGCAAIAJBAWo2AgwgACAAKAIAQQFqNgIADwtB3OuJARCBHgALbgEBfwJAIAEgA0YNAEEADwsCQCABDQBBAQ8LIAFBf2ohAQJAA0AgACgCACACKAIARiAAQQRqKAIAIAJBBGooAgBGcSIEQQFHDQEgAUEARyEDIABBCGohACACQQhqIQIgAUF/aiEBIAMNAAsLIAQLewEEfyABKAIEIQIgASgCACEDAkACQAJAIAEoAggiASAAKAIAIAAoAggiBGtNDQAgACAEIAFBCEEYENIaIAAoAgghBAwBCyABRQ0BCyABQRhsIgVFDQAgACgCBCAEQRhsaiACIAX8CgAACyAAIAQgAWo2AgggAyACEPAjC4EBAgJ/AX4CQCAAKQMIIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOweCwJAIAAoAiAiAUUNACABKAIAIgIQ3wIgAkHgAEEIENQUIAFBDEEEENQUCwJAIAAoAigiAEUNACAAEJwBIABBwABBCBDUFAsLfAEDfyMAQRBrIgIkAEEAIQNBACEEAkAgAS0AuAFBEkcNACABIAEoAngiA0GAIHI2AnggAkEBOgAPIAJBADoADiACIAJBDmogAkEPaiABEOIBIAIoAgAhBCABIAM2AnggAigCBCEDCyAAIAM2AgQgACAENgIAIAJBEGokAAt/AQF/IwBBIGsiAiQAIAAoAgAoAgAhACACIAEoAgBBAUEAIAEoAgQoAgwRDAA6ABQgAiABNgIQIAJBAToAFSACQQA2AgwgAiAANgIYIAIgAEEIajYCHCACQQxqIAJBGGpBggIQnQwgAkEcakHZBBCdDBDZECEBIAJBIGokACABC4UBAQF/IABBBGohAQJAAkACQCAAKAIADgIBAgALIAEQqgsPCyABKAIAIgBBBGoiASgCACAAQQhqKAIAEPQaIAAoAgAgASgCABD1IyAAQRxBBBDUFA8LIAEoAgAiAEEEaiIBKAIAIABBCGooAgAQ9BogACgCACABKAIAEPUjIABBGEEEENQUC4sBAQJ/IwBBEGsiAiQAIABBBGohAwJAAkACQAJAIAAoAgAOAwABAgALIAIgAzYCCCABQejfmgFBCCACQQhqQeQGEMEMIQAMAgsgAiADNgIMIAFB8N+aAUEIIAJBDGpB5AYQwQwhAAwBCyABKAIAQfjfmgFBCSABKAIEKAIMEQwAIQALIAJBEGokACAAC4kBAQJ/IwBBIGsiAiQAIAIgASgCNDYCGCACIAEpAiw3AxAgAiABKQIkNwMIIAIgASkCHDcDAEEEQRwQ6CAiAyACKAIYNgIYIAMgAikDEDcCECADIAIpAwg3AgggAyACKQMANwIAIAFBBGoQ9SAgARCWJSAAQdzmmgE2AgQgACADNgIAIAJBIGokAAt/AQR/QQEhAgJAIABBBGogASgCACIDIAEoAgQiBBC4Ag0AIAEgACgCACIFKAIEIAUoAggQngcNAAJAIAAtAAVBBEcNACAALQAJQQRHDQAgAC0ABEEBcQ0AQQAhAiAALQANQf8BcUUNAQsgA0Hz4YMBQQQgBCgCDBEMACECCyACC3oBAX8jAEEgayICJAAgACgCACEAIAIgASgCAEEBQQAgASgCBCgCDBEMADoAFCACIAE2AhAgAkEBOgAVIAJBADYCDCACIAA2AhggAiAAQQRqNgIcIAJBDGogAkEYakEoEJ0MIAJBHGpBKRCdDBDZECEBIAJBIGokACABC3ABAX8jAEEQayIDJAAgAyACNgIMAkAgACgCECACRw0AQQAhAAJAIAJFDQADQCAAQQF0IAEtAABqIQAgAUEBaiEBIAJBf2oiAg0ACwsgA0EQaiQAIAAPC0EAIABBEGogA0EMakEAIAFBkMyBARCxHAALewEBf0EAIQQCQAJAIANBAE4NAEEBIQFBBCECDAELAkACQCABRQ0AIAIgAUEBIAMQuwQhBAwBCyADEIoBIQQLAkACQCAEDQBBASEBIABBATYCBAwBCyAAIAQ2AgRBACEBC0EIIQIgAyEECyAAIAJqIAQ2AgAgACABNgIAC3gBAX8jAEGAAmsiAyQAIANBAEGAAvwLACABQQhqIQEgAkEEdCECAkADQAJAIAEoAgBBAUYNACAAQQI6AAAMAgsgAyABQXxqKAIALQAAakEBOgAAIAFBEGohASACQXBqIgINAAsgACADQYAC/AoAAAsgA0GAAmokAAtvAQF/IAAoAgwoAhBBA3QgACgCCEEMbGogACgCGCIBKAIQQQxsIAEoAhxBAnRqIAEoAiRqaiAAKAIkQQAgACgCHBtqIAAoAkRBDGxqIAAoAlRqIAAoAlAgACgCOGpBAnRqIAAoAmBBACAAKAJYG2oLgAEBAn8jAEEQayIEJAACQAJAIANFDQAgA0EFTw0BIARCADcDCAJAIANBAXQiBUUNACAEQQhqIAIgBfwKAAALIAAgATYCCCAAIAM6AAwgACAEKQMINwIAIARBEGokAA8LQcjnhAFBGUHk54QBELchAAtB9OeEAUEaQZDohAEQtyEAC3wBAX8jAEEgayICJAAgACgCACEAIAIgASgCAEEBQQAgASgCBCgCDBEMADoAFCACIAE2AhAgAkEBOgAVIAJBADYCDCACIAA2AhggAiAAQQRqNgIcIAJBDGogAkEYakGFARCdDCACQRxqQYUBEJ0MENkQIQEgAkEgaiQAIAELewEBf0EAIQQCQAJAIANBAE4NAEEBIQFBBCECDAELAkACQCABRQ0AIAIgAUEBIAMQuwQhBAwBCyADEIoBIQQLAkACQCAEDQBBASEBIABBATYCBAwBCyAAIAQ2AgRBACEBC0EIIQIgAyEECyAAIAJqIAQ2AgAgACABNgIAC4ABAQN/AkACQCAAKAIAIgFBgICAgHhGDQAgAUUNASAAKAIEIAFBARDUFA8LIAAtAARBA0cNACAAKAIIIgAoAgAhAgJAIABBBGooAgAiASgCACIDRQ0AIAIgAxEDAAsCQCABKAIEIgNFDQAgAiADIAEoAggQ1BQLIABBDEEEENQUCwt1AgJ/AX4CQCAAKQMAIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOweCwJAIAApAxAiA1ANACADQgODQgBSDQAgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDsHgsLdQICfwF+AkAgACkDACIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDsHgsCQCAAKQMQIgNQDQAgA0IDg0IAUg0AIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQ7B4LC3MBA38gAkEwbCEDIAFBUGohAgJAA0BBACEEIANFDQEgAkEwaiIFKAIAQRJHDQEgAkE0aigCACIBKAIAQRtHDQEgASgCCA0BIANBUGohAyAFIQJBEiABEIcYRQ0ACyAAIAUpAgg3AgRBASEECyAAIAQ2AgALhAEBAX8jAEEQayICJAACQCABKAIQDQACQAJAIAAtADkOAwABAgALIAAgASAALQA4ELkPDAELIAJBCGogACABQQAQ/QUCQCACKAIIQQFHDQAgAUEAIAIoAgwQwQY2AhAMAQsgAUEAIAAoAiwQwQY2AhAgACABIAAtADgQuQ8LIAJBEGokAAt0AQF/A0AgACgCACICQSBqIQAgAi0AJUECRw0ACwJAIAJBCGooAgAiAEUNACAAQThsIQAgAkEEaigCACECA0ACQAJAIAIoAgBBCUcNACACQQhqIAEQ1wMMAQsgAiABEL8FCyACQThqIQIgAEFIaiIADQALCwt1AgJ/AX4CQCAAKQMAIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOweCwJAIAApAxAiA1ANACADQgODQgBSDQAgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDsHgsLdQICfwF+AkAgACkDECIDUA0AIANCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOweCwJAIAApAwAiA0IDg0IAUg0AIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQ7B4LC4MBACAAIAEQXAJAIAAoAgBBGkcNACABIABBCGoQkgsiAUUNACAAEIcCIAAgASkDODcDOCAAIAEpAzA3AzAgACABKQMoNwMoIAAgASkDIDcDICAAIAEpAxg3AxggACABKQMQNwMQIAAgASkDCDcDCCAAIAEpAwA3AwAgAUHAAEEIENQUCwt0AQF/A0AgACgCACICQSBqIQAgAi0AJUECRw0ACwJAIAJBCGooAgAiAEUNACAAQThsIQAgAkEEaigCACECA0ACQAJAIAIoAgBBCUcNACACQQhqIAEQzgEMAQsgAiABEMcBCyACQThqIQIgAEFIaiIADQALCwt7AQJ/IAEgACgCDBCJAQJAIAAoAggiAkUNACACQQR0IQMgACgCBEEMaiECA0AgASACKAIAEIkBIAJBEGohAiADQXBqIgMNAAsLAkAgACgCHCICRQ0AIAIQ9xsgAigCACACQQRqKAIAEPEjIAJBFEEEENQUCyAAQQA2AhwLdAEBfwNAIAAoAgAiAkEgaiEAIAItACVBAkcNAAsCQCACQQhqKAIAIgBFDQAgAEE4bCEAIAJBBGooAgAhAgNAAkACQCACKAIAQQlHDQAgAkEIaiABEMIDDAELIAIgARC1BQsgAkE4aiECIABBSGoiAA0ACwsLdAEBfwNAIAAoAgAiAkEgaiEAIAItACVBAkcNAAsCQCACQQhqKAIAIgBFDQAgAEE4bCEAIAJBBGooAgAhAgNAAkACQCACKAIAQQlHDQAgAkEIaiABEO8BDAELIAIgARDzBQsgAkE4aiECIABBSGoiAA0ACwsLcgICfwJ+QgEgAUIBhiIEfSAEIAFCAFMbIQEgACgCCCECA0AgAEEBEIsfIAAoAgghAyAAIAJBAWoiAjYCCCADIAAoAgRqIAFCH4MiBUIghCAFIAFCBYciBEIAVRunLQDk3poBOgAAIAQhASAEQgBSDQALC3gBAn8gACgCCEE4bCECIAAoAgQiAEEUaiEDAkADQCACRQ0BAkAgAC0ANEEBRw0AIAAoAgANACABIAEoAhwgASgCICADKAIAEOMSEKsgCyAAIAEQzBMgASAAQTBqEMgiIAJBSGohAiADQThqIQMgAEE4aiEADAALCwtsAQJ/IwBBEGsiAiQAQQMhAwNAIAJBDmogA2pBfmogAEEPcUHgi4MBai0AADoAACADQX9qIQMgAEEEdkEPcSIADQALIAFBAUGszJcBQQIgAkEOaiADakF/akEDIANrEM4GIQMgAkEQaiQAIAMLagACQCACIAFPDQACQCAAIAJBDGxqIgIoAggiASACKAIARw0AIAIQkRoLIAIoAgQgAUEDdGogBK1C/wGDQiiGIAOtQv8Bg0IghoQgBa2ENwIAIAIgAUEBajYCCA8LIAIgAUGc4YQBEPUWAAt5AQJ/IwBBIGsiAiQAIAJBFGogAUEAQQRBBBDADyACKAIYIQMCQCACKAIUQQFHDQAgAyACKAIcEPwgAAsgAkEANgIQIAIgAigCHDYCDCACIAM2AgggAkEIaiABEI8QIAAgAigCEDYCCCAAIAIpAgg3AgAgAkEgaiQAC3UBA38jAEEQayIDJAAgA0EEaiACQQFBARCsESADKAIIIQQCQCADKAIEQQFGDQAgAygCDCEFAkAgAkUNACACRQ0AIAUgASAC/AoAAAsgACACNgIIIAAgBTYCBCAAIAQ2AgAgA0EQaiQADwsgBCADKAIMEPwgAAt9AQF/IwBBIGsiAiQAAkACQCAAKAIAIgAoAgwNACAAIAEQjwchAAwBCyACQQc2AhwgAkEHNgIUIAIgAEEMajYCECACQfYBNgIMIAIgADYCCCACIABBEGo2AhggASgCACABKAIEQcmHgAEgAkEIahDMIyEACyACQSBqJAAgAAt9AQF/IwBBIGsiAiQAIAJCADcDGCACQRhqIAAoAgAQNiACIAIoAhwiADYCFCACIAIoAhg2AhAgAiAANgIMIAJBAjYCHCACIAJBDGo2AhggASgCACABKAIEQcKugQEgAkEYahDLBiEBIAIoAgwgAigCEBDZIyACQSBqJAAgAQt4AQV/IwBBEGsiAiQAIAEoAgAhAyABKAIEIQQgAkEIaiABEOEMAkACQCACKAIIQQFGDQBBgIDEACEFDAELIAIoAgwhBSABIAEoAggiBiAEaiADIAEoAgRqayABKAIAajYCCAsgACAFNgIEIAAgBjYCACACQRBqJAALgAECBH8BfiABKAIMIQIgASgCCCEDAkACQEHAABCKASIERQ0AIAQgASgCABBOQRQQigEiBUUNASABKAIEIgEpAgwhBiAFIAEQhQ0gACACNgIMIAAgAzYCCCAFIAY3AgwgACAFNgIEIAAgBDYCAA8LQQhBwAAQoCQAC0EEQRQQoCQAC3wBA38gACgCACIBEJwBIAFBwABBCBDUFCAAKAIEIgJBBGooAgAhAAJAIAIoAggiAUUNAANAIAAoAgAiAxDfAiADQeAAQQgQ1BQgAEEEaiEAIAFBf2oiAQ0ACyACQQRqKAIAIQALIAIoAgAgAEEEQQQQzxMgAkEUQQQQ1BQLjAEAAkACQAJAAkACQCABQX5qDgcAAgQEAQQDBAsgAC8AAEHvzAFHDQNBigEPCyAAKAAAQe/EqasGcyAAQQRqLwAAQePoAXNyDQJBiQEPCyAALwAAQe/qAXMgAEECai0AAEH0AHNyQf//A3ENAUGLAQ8LIAApAABC7+yVk6eumrLlAFINAEGMAQ8LQaQBC3oBA38gACgCDCIBIAAoAgQiAmtBDG4hAwJAIAEgAkYNAANAAkACQCACKAIAIgFFDQAgARCMAiABQcAAQQgQ1BQMAQsgAkEEaigCACIBEIcJIAFB8ABBCBDUFAsgAkEMaiECIANBf2oiAw0ACwsgACgCCCAAKAIAEPojC3cCBH8BfiAAKAIEIQECQCAAKAIIIgJFDQADQAJAIAEpAwAiBUIDg0IAUg0AIAWnIgMgAygCACIEQX9qNgIAIARBAUcNACADIAMoAhAQ7B4LIAFBEGohASACQX9qIgINAAsgACgCBCEBCyAAKAIAIAFBCEEQEM8TC3cCBH8BfiAAKAIEIQECQCAAKAIIIgJFDQADQAJAIAEpAwAiBUIDg0IAUg0AIAWnIgMgAygCACIEQX9qNgIAIARBAUcNACADIAMoAhAQ7B4LIAFBIGohASACQX9qIgINAAsgACgCBCEBCyAAKAIAIAFBCEEgEM8TC3oCAX8BfiMAQRBrIgUkAAJAAkACQCAEQYA8cUGAPEcNACADRQ0BIAVBCGogASACQQEQtQIgBS0ACEEERg0BIAUpAwgiBkL/AYNCBFENASAAIAY3AgAMAgsgAEEEOgAADAELQYjzmgFBKEGozpgBELchAAsgBUEQaiQAC44BAQF/QQEhAQJAAkACQAJAAkACQAJAIAAoAgAOCAAEAQMGBgIFAAsgAC0AJCEBDAULIAAoAgQtABghAQwECyAAKAIELQAsIQEMAwtBACEBDAILQQEhASAALQAkDQEgACgCICgCGEGAgICAeEYhAQwBC0EBIQEgACgCBCIALQBQDQAgACgCACEBCyABQQFxC20BAn8jAEEQayICJAAgACgCACEDQQkhAANAIAJBCGogAGpBfmogA0EPcS0A4IuDAToAACAAQX9qIQAgA0EEdiIDDQALIAFBAUGszJcBQQIgAkEIaiAAakF/akEJIABrEM4GIQAgAkEQaiQAIAALbQECfyMAQRBrIgIkACAAKAIAIQNBCSEAA0AgAkEIaiAAakF+aiADQQ9xLQDQpJwBOgAAIABBf2ohACADQQR2IgMNAAsgAUEBQazMlwFBAiACQQhqIABqQX9qQQkgAGsQzgYhACACQRBqJAAgAAuJAQECfyMAQRBrIgIkACAAKAIAIQAgASgCAEHcq4UBQQggASgCBCgCDBEMACEDIAJBADoADSACIAM6AAwgAiABNgIIIAJBCGpBpuGDAUEEQcDhgwFBIxCaCkGDpJoBQQRB4OGDAUEjEJoKQeSrhQFBCSAAQShqQccAEJoKENITIQEgAkEQaiQAIAELdQEEfyMAQRBrIgUkACAFQQRqIAIgBGpBAWoQrRUgBSgCBCEGIAUoAggiByAFKAIMIgggASACIAMgBBCrASAFIAg2AgwgBSAHNgIIIAUgBjYCBCAFQQRqEIUKIAAgBSgCDDYCCCAAIAUpAgQ3AgAgBUEQaiQAC38BAX8jAEEgayIDJAAgA0EUaiABIAIQ1hMgA0EIaiADQRRqEO0bAkACQCADKAIQRQ0AIABBAjoADCAAIAMpAgg3AgAgACADKAIQNgIIDAELIABBACkCgOODATcCCCAAQQApAvjigwE3AgAgAygCCCADKAIMENojCyADQSBqJAALgQEBAX8CQAJAAkACQAJAIAEoAgAOBAABAgMACyABKAIEIQFBACECDAMLIAEoAgQhAUEBIQIMAgsgASgCCCIBQQRBACABKAIAQYiAxABGIgIbaiEBDAELIAEoAggiAUEEQQAgASgCAEGIgMQARiICG2ohAQsgACABNgIEIAAgAjYCAAuBAQECfyAAKAIAIAAoAgRBBEEUENETIAAoAgwgACgCEEEBQQkQ0RMgACgCGCAAKAIcEOEjIAAoAiQgACgCKEEEQQgQ0RMgACgCMCAAKAI0EOEjAkAgACgCPCIBRQ0AIAEgASgCACICQX9qNgIAIAJBAUcNACAAKAI8IAAoAkAQ7RELC3MBAn8CQAJAAkAgASgCFCICRQ0AIAEoAhAgAkEDdGoiAkF4ag0BCyABKAIIIQNBACECDAELIAJBfGooAgAiAiABKAIIIgNNDQAgAiADIANBpOqEARCPCgALIAAgAyACazYCBCAAIAEoAgQgAkEDdGo2AgALdgEBfyMAQRBrIgQkAAJAAkAgAw0AQQAhAAwBCyAEIAAQhw8iACACIAMQqRICQCABKAIIIgMgASgCAEcNACABEJ8aCyABIANBAWo2AgggASgCBCADQQR0aiIBIAQpAgA3AgAgASAEKQIINwIICyAEQRBqJAAgAAt0AQF/IwBBEGsiAiQAAkACQCABKQMAQgKFIAEpAwiEUA0AIAAoAvACQQJGDQEgAiAANgIMIAIgATYCCCACQQhqEPwJIAIgAEHAAWo2AgwgAiABQZAFajYCCCACQQhqEPwJCyACQRBqJAAPC0HAg4UBEMMjAAuBAQEEfyMAQRBrIgIkAEEAIQMCQCABKAIEIgQoAnwiBUGAgIDAAEkNAAJAIAEQ5Q5FDQBBASEDDAELIAQoAnwiBUGAgIDAAEkNACACIAWtNwMIQdT9mgFBKyACQQhqQZzZhAFBwPWEARDVFAALIAAgBTYCBCAAIAM2AgAgAkEQaiQAC4gBAQF/IwBBEGsiAiQAAkACQAJAAkAgACgCACIAKAIADgMAAQIACyABKAIAQcSihQFBAiABKAIEKAIMEQwAIQEMAgsgASgCAEHGooUBQQMgASgCBCgCDBEMACEBDAELIAIgAEEEajYCDCABQcmihQFBByACQQxqQZIBEMEMIQELIAJBEGokACABC3kBAn8CQCAAKAIIIgEgACgCAEcNACAAEJwaCyAAIAFBAWo2AgggACgCBCABQQxsaiICQQA2AgggAkKAgICAwAA3AgACQCAAKAIUIgIgACgCDEcNACAAQQxqEKcaCyAAIAJBAWo2AhQgACgCECACQQJ0akEANgIAIAELeQEDfyAAKAIEIQECQCAAKAIIIgJFDQAgASEDA0ACQCADKAIAQQdGDQAgAxCiCAsgA0EoaiEDIAJBf2oiAg0ACwsgACgCACABQQhBKBDPEwJAIAAoAhQiA0UNACADKAIAIgIQ3wIgAkHgAEEIENQUIANBDEEEENQUCwt+AQR/IwBBIGsiAyQAIAIoAgQhBCACKAIAIQUCQEEEEIoBIgYNAEEEQQQQoCQACyAGIAI2AgAgAyABNgIcIAMgADYCGCADIAY2AgwgA0EjNgIUIANB1fKaATYCECADQbmBgIB4NgIIIAUgBCADQQhqEMAbIQIgA0EgaiQAIAILfgEEfyMAQSBrIgMkACACKAIEIQQgAigCACEFAkBBBBCKASIGDQBBBEEEEKAkAAsgBiACNgIAIAMgATYCHCADIAA2AhggAyAGNgIMIANBITYCFCADQeD0mgE2AhAgA0G5gYCAeDYCCCAFIAQgA0EIahDAGyECIANBIGokACACC34BBH8jAEEgayIDJAAgAigCBCEEIAIoAgAhBQJAQQQQigEiBg0AQQRBBBCgJAALIAYgAjYCACADIAE2AhwgAyAANgIYIAMgBjYCDCADQTA2AhQgA0GG9ZoBNgIQIANBuYGAgHg2AgggBSAEIANBCGoQwBshAiADQSBqJAAgAgt9AQF/AkACQAJAAkACQCAAKAIADgUEAAECAwQLIAAoAgRBAUcNAyAAKAIIIAEQpgEPCyAAKAIEIAEQpgEPCyABIAAoAgQQ8AQPCyAAKAIMIgJFDQAgAkEobCECIAAoAgghAANAIAAgARCKBCAAQShqIQAgAkFYaiICDQALCwt4AQF/IwBBEGsiBiQAIAZBBGogAUEDIAQgBRCqDyAGKAIIIQVBBEEIEOgeIgQgAzYCBCAEIAI2AgAgBUEcahC+HyAFQgQ3AiwgBUIBNwIkIAUgBDYCICAFQQE2AhwgACAGKQIENwIAIAAgBigCDDYCCCAGQRBqJAALfQEBfwJAAkACQAJAAkAgACgCAA4FBAABAgMECyAAKAIEQQFHDQMgACgCCCABEL4BDwsgACgCBCABEL4BDwsgASAAKAIEENgEDwsgACgCDCICRQ0AIAJBKGwhAiAAKAIIIQADQCAAIAEQ9AMgAEEoaiEAIAJBWGoiAg0ACwsLdgIDfwF+IwBBEGsiAyQAIAEoAhQhBCABKAIQIQUgAyABQQhqEI0UIANBCGogAiAFIAQgAygCACADKAIEEP8OAkACQCADLQAIQQRGDQAgAykDCCIGQv8Bg0IEUQ0AIAAgBjcCAAwBCyAAQQQ6AAALIANBEGokAAt0AgV/AX4gACgCBCEBAkAgACgCCCICRQ0AIAEhAwNAAkAgAykDACIGQgODQgBSDQAgBqciBCAEKAIAIgVBf2o2AgAgBUEBRw0AIAQgBCgCEBDsHgsgA0EIaiEDIAJBf2oiAg0ACwsgACgCACABQQhBCBDPEwt4AgN/AX4gACgCECEBIAAoAgghAiAAKQMAIQQDfwJAIARQDQAgACAEQn98IASDNwMAIAEgBHqnQfgAcWsPCyAAIAFBQGoiATYCECAAIAJBCGoiAzYCCCAAIAIpAwBCf4VCgIGChIiQoMCAf4MiBDcDACADIQIMAAsLdgEBfyAAKAIIQThsIQIgACgCBCEAA0ACQAJAIAJFDQACQAJAAkAgACgCAA4DAAECAAsgAEEIaiABEPAgIABBKGogARCmJQwDCyABIABBMGoQwCIMAgsgAEEEaiABEKYlDAELDwsgAEE4aiEAIAJBSGohAgwACwt6AQF/IAEoAghBKGwhAiABKAIEIQECQANAIAJFDQECQAJAAkACQAJAIAEoAgAOBQQAAQIDBAsgAUEEaiAAEPEgDAMLIAFBBGogABCTBQwCCyABQQRqIAAQpQ8MAQsgACABQQRqEOISCyABQShqIQEgAkFYaiECDAALCwtlAQN/QQAhAwJAIAFFDQADQAJAIAFBAUsNACAAIANBDGxqKAIAIgEgAkYNAiADIAEgAklqIQMMAgsgAyABQQF2IgQgA2oiBSAAIAVBDGxqKAIAIAJLGyEDIAEgBGshAQwACwsgAwt6AQF/IAAoAghBKGwhAiAAKAIEIQACQANAIAJFDQECQAJAAkACQAJAIAAoAgAOBQQAAQIDBAsgAEEEaiABEPQgDAMLIABBBGogARCpJQwCCyAAQQRqIAEQ8Q4MAQsgAEEEaiABEOQSCyAAQShqIQAgAkFYaiECDAALCwt+AQJ/IwBBIGsiAiQAAkBBACgC7JWdASIDRQ0AIAJBBGogAyAAIAFBiPaaAUHiABDcEiACQRRqQer2mgFBERC1FCACQQA2AhAgAigCCCIBENwgIAEgAikCGDcCCCABIAIpAhA3AgAgAkEEahDvAiACQQRqEJ0OCyACQSBqJAALeQEBfyMAQRBrIgIkACACIAAoAgAiAEEkajYCDCABQYDggQFBCEGDpJoBQQQgAEEoakE6QYjggQFBBSAAQQhqQTtBjeCBAUEFIABBFGpBPEHEmYUBQQsgAEEgakE9QZLggQFBEyACQQxqQSgQ5QwhACACQRBqJAAgAAttAgF/AX4jAEEQayICJAAgACkDACEDQREhAANAIAIgAGpBfmogA6dBD3EtANCknAE6AAAgAEF/aiEAIANCBIgiA0IAUg0ACyABQQFBrMyXAUECIAIgAGpBf2pBESAAaxDOBiEAIAJBEGokACAAC4UBAgJ/AnwgASgCCCICQYCAgAFxIQMgACsDACEEAkAgAkGAgICAAXENAAJAIASZIgVEAIDgN3nDQUNmDQAgBEQAAAAAAAAAAGIgBUQtQxzr4jYaP2NxDQAgASAEIANBAEdBARCoBQ8LIAEgBCADQQBHEOYEDwsgASAEIANBAEcgAS8BDhB6C2YBBX4gACAAKQMYIgFCEIkgASAAKQMIfCIBhSICIAApAxAiAyAAKQMAfCIEQiCJfCIFNwMAIAAgAkIViSAFhTcDGCAAIAEgA0INiSAEhSICfCIBIAJCEYmFNwMQIAAgAUIgiTcDCAt9AQF/AkAgASgCAA0AIAFBfzYCAAJAAkAgASgCDCICDQAgAEEQNgIADAELIAEgAkF/aiICNgIMIAAgASgCCCACQRxsaiICKQIANwIAIAAgAikCCDcCCCAAIAIpAhA3AhAgACACKAIYNgIYCyABQQA2AgAPC0HM64kBEIEeAAt+AQF/IAAQpg0gACgCwBIiASABKAIAIgFBf2o2AgACQCABQQFHDQAgACgCwBIgACgCxBIQ7xELIAAoAtASIgEgASgCACIBQX9qNgIAAkAgAUEBRw0AIAAoAtASEIMdCwJAIAApA7ANQgKFIAApA7gNhFANACAAQbANahCFHgsLgAEBAn8jAEEgayIDJABBgICAgHghBAJAIAFBA0YNACADQgA3AhggA0KAgICAwAA3AhAgA0EQaiACQcQCaigCABCMEiADIAMpAhQ3AwAgAyADKAIcNgIIIAMoAhAhBAsgACAENgIAIAAgAykDADcCBCAAIAMoAgg2AgwgA0EgaiQAC3QBA38gACgCCCECIABBBBCRHyAAKAIEIgMgACgCCCIEakEANgAAIAAgBEEEaiIENgIIAkACQCAEIAJJDQAgBCACayIAQQNNDQEgAyACaiABNgAADwsgAiAEIARBlJWFARCPCgALQQBBBCAAQciehQEQjwoAC4ABAQN/IwBBEGsiASQAAkAgACgCACICKAIEIgNBAXFFDQAgAigCACECIAEgA0EBdjYCBCABIAI2AgAgAUGor5gBIAAoAggiAC0ACCAALQAJEOgOAAsgAUGAgICAeDYCACABIAA2AgwgAUHEr5gBIAAoAggiAC0ACCAALQAJEOgOAAt0AQJ/QRAhAQJAAkACQCAAKAIIIgJBfmpBBiACQQFLG0F+ag4FAgICAgEAC0EEIQELIABBCGogAWoiAigCACACQQRqKAIAELEjCwJAIABBf0YNACAAIAAoAgQiAkF/ajYCBCACQQFHDQAgAEHQAEEEENQUCwt2AQF/IwBBEGsiBCQAIARBCGogACgCAEEIakGswJgBELodIAQoAgwhAAJAAkAgBCgCCCABEI4dIgFFDQAgAiADIAEoAgQgASgCCBCBBSEBDAELIAIgA0EIQQAQgQUhAQsgACAAKAIAQX9qNgIAIARBEGokACABC3ACAn8BfgJAIAApAwAiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQ7B4LAkAgACkDCCIDQgODQgBSDQAgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDsHgsLcAICfwF+AkAgACkDACIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDsHgsCQCAAKQMQIgNCA4NCAFINACADpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEOweCwt5AQN/IwBBMGsiAiQAIAIgARD+B0EMIQEgAigCBCEDAkAgAigCACIEQQtGDQAgACACKQMoNwMoIAAgAikDIDcDICAAIAIpAxg3AxggACACKQMQNwMQIAAgAikDCDcDCCAEIQELIAAgATYCACAAIAM2AgQgAkEwaiQAC4YBAAJAAkACQAJAIAFBfGoOBAADAQIDCwJAIAAoAABB5djNqwZHDQBB1wAPCyAAKAAAQeXc1esGRw0CQf0ADwsgACgAAEHl8MH7BnMgAEEEai8AAEHy6AFzcg0BQdgADwsgACgAAEHl8NGrBnMgAEEDaigAAEHl3JGbB3NyDQBB2QAPC0GkAQtwAgJ/AX4CQCAAKQMAIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOweCwJAIAApAxAiA0IDg0IAUg0AIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQ7B4LC3cBAX8gAEEIahCuEgJAIAAtADRBA0YNACAAQSBqELEQCwJAIAAoAjgiAUUNACABEPcbIAEoAgAgAUEEaigCABDxIyABQRRBBBDUFAsCQCAAKAI8IgBFDQAgABC4FSAAKAIAIABBBGooAgAQ+iMgAEEUQQQQ1BQLC2wCAX8BfiMAQTBrIgMkACADIAE2AhAgAyAANgIMIAMgAjYCFCADQQetQiCGIgQgA0EUaq2ENwMoIANB1AGtQiCGIANBDGqthDcDICADIAQgA0EQaq2ENwMYQbfCmQEgA0EYakHArZkBEOQbAAt0AQN/IAAoAgwiASAAKAIEIgJrQShuIQMCQCABIAJGDQADQAJAAkAgAigCAEEHRw0AIAJBEGooAgAiARCMAiABQcAAQQgQ1BQMAQsgAhDPCwsgAkEoaiECIANBf2oiAw0ACwsgACgCCCAAKAIAQQhBKBDPEwt/AQJ/IwBBIGsiAiQAAkACQCABKAIEIgMNACACQQApA6imnAE3AwggAkEAKQOgppwBNwMADAELIAJBEGpBCEEIIANBAWoQiw4gAiACKQIYNwIIIAIgAikCEDcCACACIAEQoAsLIAAgAikDCDcCCCAAIAIpAwA3AgAgAkEgaiQAC3QBA38jAEEQayIBJABBACECIAFBADYCCCABQYECOwEMAkACQAJAAkAgACgCACIDQXRqQQcgA0ELSxtBcmoOAwMAAQILIAAoAghBBUYNAgwBCyAAKAIMDQELIAAgAUEIahD5ASABLQAMIQILIAFBEGokACACC3cBAX8gAEEIahCtEgJAIAAtADRBA0YNACAAQSBqEK4QCwJAIAAoAjgiAUUNACABEPcbIAEoAgAgAUEEaigCABDxIyABQRRBBBDUFAsCQCAAKAI8IgBFDQAgABC4FSAAKAIAIABBBGooAgAQ+iMgAEEUQQQQ1BQLC3ACAn8BfgJAIAApAwAiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQ7B4LAkAgACkDECIDQgODQgBSDQAgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDsHgsLcAICfwF+AkAgACkDACIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDsHgsCQCAAKQMQIgNCA4NCAFINACADpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEOweCwt1AQN/IwBBEGsiAiQAAkACQCABKAJ4IgNBgCBxDQAgAiABEHcgAigCBCEBIAIoAgAhBAwBCyABIANBgMAAcjYCeCACQQhqIAEQdyACKAIIIQQgASADNgJ4IAIoAgwhAQsgACAENgIAIAAgATYCBCACQRBqJAALdQEDf0EBIQICQCAAQQRqIAEoAgAiAyABKAIEIgQQuAINACAAKAIAIAEQmwsNAAJAIAAtAAVBBEcNACAALQAJQQRHDQAgAC0ABEEBcQ0AQQAhAiAALQANQf8BcUUNAQsgA0Hz4YMBQQQgBCgCDBEMACECCyACC3cBAX9BASECAkAgAEEEaiABKAIAIAEoAgQQuAINACAAKAIAIAEQwQoNAAJAIAAtAAVBBEcNACAALQAJQQRHDQAgAC0ABEEBcQ0AQQAhAiAALQANQf8BcUUNAQsgASgCAEHz4YMBQQQgASgCBCgCDBEMACECCyACC3UBA39BASECAkAgAEEEaiABKAIAIgMgASgCBCIEELgCDQAgACgCACABEPIiDQACQCAALQAFQQRHDQAgAC0ACUEERw0AIAAtAARBAXENAEEAIQIgAC0ADUH/AXFFDQELIANB8+GDAUEEIAQoAgwRDAAhAgsgAgt/AQF/IwBBEGsiAyQAAkAgACgCBEEDRg0AIAEpAgBCmJbfiuTu1fGBf4UgASkCCELlwoaZ/dyA8nGFhEIAUg0AIAEoAhANACABIABBBGo2AhALIANBCGogACAAKAIAKAIEEQcAIAMoAgggASACIAMoAgwoAigRCwAgA0EQaiQAC2QBA38gAyABIAMgAUkbIQFBACEDAkADQCABRQ0BIAIgACgCACIEIAIoAgAiBWsiBiADQf8BcSIDazYCACAEIAVJIAYgA0lyIQMgAUF/aiEBIAJBBGohAiAAQQRqIQAMAAsLIAMLeQEDf0EAIQICQAJAAkACQAJAIAEoAgAiA0F6ag4CAgEACyADDQMgASgCBCEEQQEhAgwDCyABKAIMQQFGDQEMAgsgASgCDEEBRw0BIAEoAggoAgAhBEEBIQIMAQsgASgCCCgCACEEQQEhAgsgACAENgIEIAAgAjYCAAtqAQJ/IAAvAQwhAiAAQQA6AAwCQCACIABBDmotAABBEHRyIgJBAXFFDQACQCAAKAIIIgMgACgCAEcNACAAEJEaCyAAIANBAWo2AgggACgCBCADQQN0aiACrUKA/v8Hg0IYhiABrYQ3AgALC30AAkACQAJAAkAgAUF7ag4DAAIBAwsgACgAAEHi5JWLBnMgAEEEai0AAEHrAHNyDQJBzQAPCyAAKAAAQeLeveMGcyAAQQNqKAAAQezKhfMGc3INAUH6AA8LIAAoAABB4tKdywZzIABBBGovAABB7ugBc3INAEH5AA8LQaQBC20BAX8CQCAAKAJ4IgRBAXFFDQAgAxDmAw8LIAEgAiADEMAbIQMCQCAEQQhxRQ0AAkAgACgCSCICIAAoAkBHDQAgAEHAAGoQsxoLIAAgAkEBajYCSCAAKAJEIAJBAnRqIAM2AgAPCyAAIAMQ/hELbAEBfwJAIAMoAgAiBEF0akEHIARBC0sbIgRBJUcNACAAQQU2AgAgACADKQIENwIEIAMQjAIgA0HAAEEIENQUDwsCQCACQf8BcUECRw0AIARBf2pBAkkNACABIANBARDKCgsgACABIAIgAxBqC34BAX8jAEEQayICJAAgAiAAKAIAKAIAIgA2AgwgAUGfrpoBQQdBk6OaAUEEIABBDGpB/AFBhKyaAUEEIABBFGpB2wJBg6SaAUEEIABBGWpB5ANB2e2aAUEHIABBGGpB1AJB+6qaAUEFIAJBDGpB5QMQ5QwhACACQRBqJAAgAAt+AQF/IwBBEGsiAiQAIAIgACgCACgCACIAQSRqNgIMIAFBpcCaAUEPQZOjmgFBBCAAQfwBQdntmgFBByAAQShqQdQCQbTAmgFBAiAAQQhqQbQDQcmmmgFBCyAAQSBqQeYDQcylmgFBCCACQQxqQfkCEOUMIQAgAkEQaiQAIAALfgEBfyMAQRBrIgIkACACIAAoAgAoAgAiAEEgajYCDCABQbbAmgFBCkGTo5oBQQQgAEEYakH8AUHZ7ZoBQQcgAEEsakHUAkHAwJoBQQggAEEtakHUAkG0wJoBQQIgAEG0A0H8upoBQQcgAkEMakHnAxDlDCEAIAJBEGokACAAC4ABAQF/IwBBEGsiAiQAIAIgACgCACgCACIANgIMIAFBs8eaAUESQZOjmgFBBCAAQSBqQfwBQcXHmgFBCSAAQcAAakHUAkHps5oBQQwgAEHBAGpB1AJBtMCaAUECIABBKGpBtANBzseaAUEKIAJBDGpB/QMQ5QwhACACQRBqJAAgAAt4AAJAAkACQCAADgIBAgALIAEQzwsgAUEoQQgQ1BQPCyABQQRqIgAoAgAgAUEIaigCABD0GiABKAIAIAAoAgAQ9SMgAUEcQQQQ1BQPCyABQQRqIgAoAgAgAUEIaigCABD0GiABKAIAIAAoAgAQ9SMgAUEYQQQQ1BQLfgEBfyMAQRBrIgIkACACIAAoAgAoAgAiADYCDCABQZ+umgFBB0GTo5oBQQQgAEEMakH8AUGErJoBQQQgAEEUakHbAkGDpJoBQQQgAEEZakHkA0HZ7ZoBQQcgAEEYakHUAkH7qpoBQQUgAkEMakGABhDlDCEAIAJBEGokACAAC34BAX8jAEEQayICJAAgAiAAKAIAKAIAIgBBJGo2AgwgAUGlwJoBQQ9Bk6OaAUEEIABB/AFB2e2aAUEHIABBKGpB1AJBtMCaAUECIABBCGpBtANByaaaAUELIABBIGpBgQZBzKWaAUEIIAJBDGpBpAUQ5QwhACACQRBqJAAgAAt+AQF/IwBBEGsiAiQAIAIgACgCACgCACIAQSBqNgIMIAFBtsCaAUEKQZOjmgFBBCAAQRhqQfwBQdntmgFBByAAQSxqQdQCQcDAmgFBCCAAQS1qQdQCQbTAmgFBAiAAQbQDQfy6mgFBByACQQxqQYIGEOUMIQAgAkEQaiQAIAALgAEBAX8jAEEQayICJAAgAiAAKAIAKAIAIgA2AgwgAUGzx5oBQRJBk6OaAUEEIABBIGpB/AFBxceaAUEJIABBwABqQdQCQemzmgFBDCAAQcEAakHUAkG0wJoBQQIgAEEoakG0A0HOx5oBQQogAkEMakGUBhDlDCEAIAJBEGokACAAC2sBBH8CQCABIAAoAggiAigCACAAKAIQIgMgACgCDCIEaiIFa00NACACIAUgAUEIQTgQ0hoLIAQgAWohAQJAIANBOGwiA0UNACACKAIEIgIgAUE4bGogAiAEQThsaiAD/AoAAAsgACABNgIMC2wCAX8BfiMAQSBrIgIkAAJAIAAtAChFDQAgAkEIaiABQQhqEPUTIAAgAikDCCIDIAIoAhgQjhEgA0IDg0IAUg0AIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQ7B4LIAJBIGokAAtzAgF/AX4CQAJAAkACQCAALQAsIgFBfWpBASABQQJLG0H/AXEOAgECAAsgACkDACAAKQMQEIQUDwsgACkDACICQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDsHg8LIAAQ+BALC3gAAkACQAJAIAAOAgECAAsgARDcCyABQShBCBDUFA8LIAFBBGoiACgCACABQQhqKAIAEPQaIAEoAgAgACgCABD1IyABQRxBBBDUFA8LIAFBBGoiACgCACABQQhqKAIAEPQaIAEoAgAgACgCABD1IyABQRhBBBDUFAtuAgF/AX4CQAJAAkACQCAALQAsIgJBfWpBASACQQJLG0H/AXEOAwABAgALAkAgACkDACIDQgODQgBSDQAgA6ciACAAKAIAIgBBAWo2AgAgAEF/TA0DCyABQQxqIAMQ4wYaDwsgACABELsPCw8LAAtrAQR/AkAgASAAKAIIIgIoAgAgACgCECIDIAAoAgwiBGoiBWtNDQAgAiAFIAFBCEEwENIaCyAEIAFqIQECQCADQTBsIgNFDQAgAigCBCICIAFBMGxqIAIgBEEwbGogA/wKAAALIAAgATYCDAt4AAJAAkACQCAADgIBAgALIAEQ0QsgAUEoQQgQ1BQPCyABQQRqIgAoAgAgAUEIaigCABD0GiABKAIAIAAoAgAQ9SMgAUEcQQQQ1BQPCyABQQRqIgAoAgAgAUEIaigCABD0GiABKAIAIAAoAgAQ9SMgAUEYQQQQ1BQLcAEDfyMAQRBrIgEkAEEAIQICQANAQQAhAwJAAkAgAC8BCA0AIAFBCGogABDhDCABKAIIQQFHDQMgASgCDCIDQYCABEkNASADQf8HcUGAuH9yIQMLIAAgAzsBCAsgAkEBaiECDAALCyABQRBqJAAgAgtxAQN/AkAgASgCECICRQ0AIAEgAkF/aiIDNgIQIAEoAkgiAkUNACABKAIMIANBAnRqKAIAIgMgAigCCE8NACABKAI8IQQgAigCBCADQcQAbGoiAiABKAJANgIQIAIgBDYCDCACQQE2AggLIABBBDoAAAtsAQN/IwBBEGsiAiQAIAJBCGogASgCDBCiBCACKAIMIQMCQAJAIAEoAgBBAUYNACACKAIIIQEMAQsgASgCBCIEIAMgBCADSRshASAEIAMgBCADSxshAwsgACABNgIAIAAgAzYCBCACQRBqJAALcAECfwJAAkAgAS0AFEECRw0AIAEoAgwhAiABKAIIIQEMAQsgASgCCCEDAkAgASgCGCICRQ0AIAMgAigCCCICIAMgAkkbIQEgAyACIAMgAksbIQIMAQsgASgCDCECIAMhAQsgACACNgIEIAAgATYCAAtmAQJ/IwBBEGsiAiQAQQkhAwNAIAJBCGogA2pBfmogAEEPcS0A4IuDAToAACADQX9qIQMgAEEEdiIADQALIAFBAUGszJcBQQIgAkEIaiADakF/akEJIANrEM4GIQMgAkEQaiQAIAMLZgECfyMAQRBrIgIkAEEJIQMDQCACQQhqIANqQX5qIABBD3EtANCknAE6AAAgA0F/aiEDIABBBHYiAA0ACyABQQFBrMyXAUECIAJBCGogA2pBf2pBCSADaxDOBiEDIAJBEGokACADC2YBAn8jAEEQayICJABBCSEDA0AgAkEIaiADakF+aiAAQQ9xLQDgi4MBOgAAIANBf2ohAyAAQQR2IgANAAsgAUEBQazMlwFBAiACQQhqIANqQX9qQQkgA2sQzgYhAyACQRBqJAAgAwtmAQJ/IwBBEGsiAiQAQQkhAwNAIAJBCGogA2pBfmogAEEPcS0A0KScAToAACADQX9qIQMgAEEEdiIADQALIAFBAUGszJcBQQIgAkEIaiADakF/akEJIANrEM4GIQMgAkEQaiQAIAMLaAEDfwJAIAEgACgCCCICTQ0AIAAgASACayIDEJAfIANBf2ohASAAKAIEIAAoAggiBEECdGohAgJAA0AgAkEANgIAIAFFDQEgAUF/aiEBIAJBBGohAgwACwsgBCADaiEBCyAAIAE2AggLbAEEfwJAIAAgAUsNAEEAIQJBvhYhAwNAIAIgA0EBdiIEIAJqIgUgBUEMbCgCtMOHASABSxshAiADIARrIgNBAUsNAAsgAkEMbCgCtMOHASICIAFNIAAgAk1xDwtB6MKYAUEeQdzRiQEQtyEAC2cBAX8jAEEwayIEJAAgBEEgaiABQgAgAEIAEOcRIARBEGogAkIAIABCABDnESAEIAQpAygiACAEKQMQfCIBIAQpAxggASAAVK18IANB/wBxQcAAcxC8FiAEKQMAIQAgBEEwaiQAIAALdAEBfyMAQRBrIgMkACADQQhqIAEoAgBBCGpBsMmYARC6HSADKAIMIQECQAJAIAMoAgggAhCOHSICRQ0AIAAgAkEEaigCACACQQhqKAIAEOkLDAELIABBgICAgHg2AgALIAEgASgCAEF/ajYCACADQRBqJAALdAEBfyMAQRBrIgMkACADQQhqIAEoAgRBCGpB4MmYARC6HSADKAIMIQECQAJAIAMoAgggAhCOHSICRQ0AIAAgAkEEaigCACACQQhqKAIAEOkLDAELIABBgICAgHg2AgALIAEgASgCAEF/ajYCACADQRBqJAALcwICfwF+AkAgACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDsHgsCQCAAKAIgIgFFDQAgARDfAiABQeAAQQgQ1BQLAkAgACgCJCIARQ0AIAAQ3wIgAEHgAEEIENQUCwtzAgJ/AX4CQCAAKQMIIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOweCwJAIAAoAiAiAUUNACABEKcEIAFB4ABBCBDUFAsCQCAAKAIkIgBFDQAgABCnBCAAQeAAQQgQ1BQLC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBJGo2AgwgAUGeu5oBQQhBk6OaAUEEIABBGGpB/AFBhKyaAUEEIABBIGpB2wJB5rqaAUEGIABBDGpB3AJB7LqaAUEEIABB3QJBvK2aAUEJIAJBDGpB3gIQ5QwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQRxqNgIMIAFB37qaAUEHQZOjmgFBBCAAQRBqQfwBQYSsmgFBBCAAQRhqQdsCQea6mgFBBiAAQQxqQaYCQey6mgFBBCAAQd8CQbytmgFBCSACQQxqQd4CEOUMIQAgAkEQaiQAIAALewEBfyMAQRBrIgIkACACIAAoAgAiAEEEajYCDCABQZinmgFBCUGTo5oBQQQgAEEIakH8AUGErJoBQQQgAEEQakHbAkGivpoBQQMgAEGmAkHJppoBQQsgAEEUakHsAkGlvpoBQQMgAkEMakHtAhDlDCEAIAJBEGokACAAC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBHGo2AgwgAUHRwZoBQQdBk6OaAUEEIABBEGpB/AFBhKyaAUEEIABBGGpB2wJB5rqaAUEGIABBDGpBpgJB7LqaAUEEIABB3QJBvK2aAUEJIAJBDGpB3gIQ5QwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQQxqNgIMIAFB0bKaAUERQZOjmgFBBCAAQRBqQfwBQa68mgFBCiAAQZ0DQbi8mgFBDCAAQQRqQZ0DQcS8mgFBCSAAQQhqQZ0DQc28mgFBCiACQQxqQfkCEOUMIQAgAkEQaiQAIAALewEBfyMAQRBrIgIkACACIAAoAgAiAEE8ajYCDCABQcWzmgFBDEGTo5oBQQQgAEH8AUHJpZoBQQMgAEEIakGjA0G8upoBQQkgAEEgakGkA0G8rZoBQQkgAEE4akHsAkHFupoBQQogAkEMakGlAxDlDCEAIAJBEGokACAAC34BAX8jAEEQayICJAAgAiAAKAIAIgBByABqNgIMIAFBx8WaAUEKQZOjmgFBBCAAQeAAakH8AUGApJoBQQMgAEGzA0HRxZoBQQogAEEgakG3A0GwtZoBQQUgAEHoAGpBuANB7aiaAUEEIAJBDGpBtgMQ5QwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQQhqNgIMIAFB8LaaAUEHQZOjmgFBBCAAQQxqQfwBQdWpmgFBBCAAQdoDQdqwmgFBBCAAQRRqQe8CQaOdmgFBBiAAQRhqQe8CQe2omgFBBCACQQxqQdIDEOUMIQAgAkEQaiQAIAALewEBfyMAQRBrIgIkACACIAAoAgAiAEEMajYCDCABQZe3mgFBCUGTo5oBQQQgAEEQakH8AUHzqpoBQQggAEEYakHUAkGXo5oBQQQgAEHbA0Gbo5oBQQUgAEEIakGmAkHtqJoBQQQgAkEMakHSAxDlDCEAIAJBEGokACAAC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBIGo2AgwgAUHlwZoBQQ9Bk6OaAUEEIABB/AFB2e2aAUEHIABBJGpB1AJBo/KaAUEGIABBJWpB1AJBtMCaAUECIABBCGpBtANB7aiaAUEEIAJBDGpB6wMQ5QwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQRhqNgIMIAFB7KyaAUELQZOjmgFBBCAAQQxqQfwBQfesmgFBCiAAQfgDQbWrmgFBAyAAQRRqQfkDQbirmgFBCSAAQRxqQdQCQZLtmgFBBCACQQxqQfoDEOUMIQAgAkEQaiQAIAALewEBfyMAQRBrIgIkACACIAAoAgAiAEEQajYCDCABQfitmgFBEEHDppoBQQYgAEGMBEHMpZoBQQggAEEMakG1A0GI75oBQQggAEEYakHUAkGHpJoBQQkgAEEZakHUAkGTo5oBQQQgAkEMakGCAhDlDCEAIAJBEGokACAAC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBHGo2AgwgAUHCtpoBQRFBk6OaAUEEIABBEGpB/AFBw6aaAUEGIABBjARByaaaAUELIABBGGpB5gNBzKWaAUEIIABBDGpBuQRBnaSaAUELIAJBDGpB4gIQ5QwhACACQRBqJAAgAAtpAQF/AkACQCABQgODQgBSDQAgAaciAyADKAIAIgNBAWo2AgAgA0F/TA0BCwJAIAAoAggiAyAAKAIARw0AIAAQwxoLIAAgA0EBajYCCCAAKAIEIANBBHRqIgAgAjYCCCAAIAE3AwAPCwALewEBfyMAQRBrIgIkACACIAAoAgAiAEEkajYCDCABQZ67mgFBCEGTo5oBQQQgAEEYakH8AUGErJoBQQQgAEEgakHbAkHmupoBQQYgAEEMakGWBUHsupoBQQQgAEGXBUG8rZoBQQkgAkEMakGYBRDlDCEAIAJBEGokACAAC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBHGo2AgwgAUHfupoBQQdBk6OaAUEEIABBEGpB/AFBhKyaAUEEIABBGGpB2wJB5rqaAUEGIABBDGpBkgVB7LqaAUEEIABBmQVBvK2aAUEJIAJBDGpBmAUQ5QwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQQRqNgIMIAFBmKeaAUEJQZOjmgFBBCAAQQhqQfwBQYSsmgFBBCAAQRBqQdsCQaK+mgFBAyAAQZIFQcmmmgFBCyAAQRRqQZwFQaW+mgFBAyACQQxqQZ0FEOUMIQAgAkEQaiQAIAALewEBfyMAQRBrIgIkACACIAAoAgAiAEEcajYCDCABQdHBmgFBB0GTo5oBQQQgAEEQakH8AUGErJoBQQQgAEEYakHbAkHmupoBQQYgAEEMakGSBUHsupoBQQQgAEGXBUG8rZoBQQkgAkEMakGYBRDlDCEAIAJBEGokACAAC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBDGo2AgwgAUHRspoBQRFBk6OaAUEEIABBEGpB/AFBrryaAUEKIABBxgVBuLyaAUEMIABBBGpBxgVBxLyaAUEJIABBCGpBxgVBzbyaAUEKIAJBDGpBpAUQ5QwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQTxqNgIMIAFBxbOaAUEMQZOjmgFBBCAAQfwBQcmlmgFBAyAAQQhqQaMDQby6mgFBCSAAQSBqQckFQbytmgFBCSAAQThqQZwFQcW6mgFBCiACQQxqQcoFEOUMIQAgAkEQaiQAIAALfgEBfyMAQRBrIgIkACACIAAoAgAiAEHIAGo2AgwgAUHHxZoBQQpBk6OaAUEEIABB4ABqQfwBQYCkmgFBAyAAQdYFQdHFmgFBCiAAQSBqQdkFQbC1mgFBBSAAQegAakHvBEHtqJoBQQQgAkEMakHYBRDlDCEAIAJBEGokACAAC3MCAn8BfgJAIAApAwgiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQ7B4LAkAgACgCICIBRQ0AIAEQqAQgAUHgAEEIENQUCwJAIAAoAiQiAEUNACAAEKgEIABB4ABBCBDUFAsLewEBfyMAQRBrIgIkACACIAAoAgAiAEEIajYCDCABQfC2mgFBB0GTo5oBQQQgAEEMakH8AUHVqZoBQQQgAEH2BUHasJoBQQQgAEEUakGfBUGjnZoBQQYgAEEYakGfBUHtqJoBQQQgAkEMakHvBRDlDCEAIAJBEGokACAAC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBDGo2AgwgAUGXt5oBQQlBk6OaAUEEIABBEGpB/AFB86qaAUEIIABBGGpB1AJBl6OaAUEEIABB9wVBm6OaAUEFIABBCGpBkgVB7aiaAUEEIAJBDGpB7wUQ5QwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQSBqNgIMIAFB5cGaAUEPQZOjmgFBBCAAQfwBQdntmgFBByAAQSRqQdQCQaPymgFBBiAAQSVqQdQCQbTAmgFBAiAAQQhqQbQDQe2omgFBBCACQQxqQYYGEOUMIQAgAkEQaiQAIAALewEBfyMAQRBrIgIkACACIAAoAgAiAEEYajYCDCABQeysmgFBC0GTo5oBQQQgAEEMakH8AUH3rJoBQQogAEH4A0G1q5oBQQMgAEEUakH5A0G4q5oBQQkgAEEcakHUAkGS7ZoBQQQgAkEMakGSBhDlDCEAIAJBEGokACAAC3sBAX8jAEEQayICJAAgAiAAKAIAIgBBEGo2AgwgAUH4rZoBQRBBw6aaAUEGIABBqAZBzKWaAUEIIABBDGpB1wVBiO+aAUEIIABBGGpB1AJBh6SaAUEJIABBGWpB1AJBk6OaAUEEIAJBDGpBggIQ5QwhACACQRBqJAAgAAt7AQF/IwBBEGsiAiQAIAIgACgCACIAQRxqNgIMIAFBwraaAUERQZOjmgFBBCAAQRBqQfwBQcOmmgFBBiAAQagGQcmmmgFBCyAAQRhqQYEGQcylmgFBCCAAQQxqQcYGQZ2kmgFBCyACQQxqQeICEOUMIQAgAkEQaiQAIAALcAEEfyAALQAmIQIgAEEAOgAmAkAgASgCCCIDRQ0AIANBMGwhAyABKAIEIQEgAC0AJSEEIAAtACQhBQNAIABBAzoAJCABIAAQfiAAIAQ6ACUgACAFOgAkIAFBMGohASADQVBqIgMNAAsLIAAgAjoAJgtzAgJ/AX4CQCAAKQMIIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOweCwJAIAAoAiAiAUUNACABEKkEIAFB4ABBCBDUFAsCQCAAKAIkIgBFDQAgABCpBCAAQeAAQQgQ1BQLC3MCAn8BfgJAIAApAwgiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQ7B4LAkAgACgCICIBRQ0AIAEQqgQgAUHgAEEIENQUCwJAIAAoAiQiAEUNACAAEKoEIABB4ABBCBDUFAsLcQIBfwF+IwBBIGsiBCQAIAQgAjYCHCAEIAE2AhggBEEBNgIUIARBCGogAyAEQRRqQfHvmgFBBRDqDQJAAkAgBC0ACEEERg0AIAQpAwgiBUL/AYNCBFENACAAIAU3AgAMAQsgAEEEOgAACyAEQSBqJAALeQECfyMAQRBrIgIkACABKAIAQcaPmwFBBSABKAIEKAIMEQwAIQMgAkEAOgAJIAIgAzoACCACIAE2AgQgAiAANgIMIAJBBGpBy4+bAUEHIAJBDGpB9wYQmgpBgu2aAUEGIABBCGpB+AYQmgoQ0hMhASACQRBqJAAgAQt5AQJ/IwBBEGsiAiQAIAEoAgBBxo+bAUEFIAEoAgQoAgwRDAAhAyACQQA6AAkgAiADOgAIIAIgATYCBCACIAA2AgwgAkEEakHLj5sBQQcgAkEMakH3BhCaCkGC7ZoBQQYgAEEIakH6BhCaChDSEyEBIAJBEGokACABC3ABBH8jAEEQayIDJAAgASABKAJ4IgRBgCByNgJ4QQAhBUEAIQYCQCABLQDIASACQf8BcUcNACABEOURIANBCGogARCCBiADKAIMIQUgAygCCCEGCyABIAQ2AnggACAFNgIEIAAgBjYCACADQRBqJAALggEBAX8jAEEgayIDJAAgA0EANgIIIANCgICAgBA3AgAgA0H8gJsBNgIQIANCoICAgAY3AhQgAyADNgIMAkAgASACIANBDGoQqiRFDQBBgZWbAUE3IANBH2pBlIGbAUG4lZsBENUUAAsgACADKAIINgIIIAAgAykCADcCACADQSBqJAALcQACQAJAAkACQAJAAkACQCAAKAIADgcAAQIDBAYFAAsgASAAQQhqEPYXDwsgASAAQQRqEL0RDwsgAEEEaiABEPAiDwsgASAAQQRqEK0NDwsgAEEEaiABEKwlIABBCGogARCpJQ8LIABBBGogARCpJQsLgAEBAX8jAEEgayICJAAgAkEANgIIIAJCgICAgBA3AgAgAkG0xIEBNgIQIAJCoICAgAY3AhQgAiACNgIMAkAgASACQQxqEP8SRQ0AQYGVmwFBNyACQR9qQczEgQFBuJWbARDVFAALIAAgAigCCDYCCCAAIAIpAgA3AgAgAkEgaiQAC4ABAQF/IwBBIGsiAiQAIAJBADYCCCACQoCAgIAQNwIAIAJBtMSBATYCECACQqCAgIAGNwIUIAIgAjYCDAJAIAEgAkEMahCjEkUNAEGBlZsBQTcgAkEfakHMxIEBQbiVmwEQ1RQACyAAIAIoAgg2AgggACACKQIANwIAIAJBIGokAAtnAQF/IwBBEGsiBCQAAkACQCAADQBBACEAIARBDGohAwwBCyAEIAI2AgwgACADbCEAIARBCGohAwsgAyAANgIAAkAgBCgCDCIARQ0AIAQoAggiA0UNACABIAMgABDUFAsgBEEQaiQAC2cBAX8jAEEQayIEJAACQAJAIAANAEEAIQAgBEEMaiEDDAELIAQgAjYCDCAAIANsIQAgBEEIaiEDCyADIAA2AgACQCAEKAIMIgBFDQAgBCgCCCIDRQ0AIAEgAyAAENQUCyAEQRBqJAALZwEBfyMAQRBrIgQkAAJAAkAgAA0AQQAhACAEQQxqIQMMAQsgBCACNgIMIAAgA2whACAEQQhqIQMLIAMgADYCAAJAIAQoAgwiAEUNACAEKAIIIgNFDQAgASADIAAQ1BQLIARBEGokAAt5AQJ/IAAtAAQiASECAkAgAC0ABUUNAEEBIQICQCABQQFxDQACQCAAKAIAIgItAApBgAFxDQAgAigCAEGnzJcBQQIgAigCBCgCDBEMACECDAELIAIoAgBBgOuaAUEBIAIoAgQoAgwRDAAhAgsgACACOgAECyACQQFxC2kBA38jAEEQayIBJAAgAUEEaiAAKAIAIgIgACgCBCACQQF0IgJBCCACQQhLGyICEKYSAkAgASgCBEEBRw0AIAEoAgggASgCDBD8IAALIAEoAgghAyAAIAI2AgAgACADNgIEIAFBEGokAAtnAQF/IwBBEGsiBCQAAkACQCAADQBBACEAIARBDGohAwwBCyAEIAI2AgwgACADbCEAIARBCGohAwsgAyAANgIAAkAgBCgCDCIARQ0AIAQoAggiA0UNACABIAMgABDUFAsgBEEQaiQAC3EBAX9BDBD/ICIGQQI2AgggBiADNgIAIAYgBCADayAFajYCBCABIAYgASgCACIDIAMgAkYiAhs2AgACQCACDQAgACADIAQgBRDpGyAGEKgkDwsgACAGNgIMIAAgBTYCCCAAIAQ2AgQgAEG854EBNgIAC2sBA38jAEEQayIDJAAgA0EIaiACQQRBBBD/FiADKAIIIQQgAygCDCEFIABBADYCCCAAIAU2AgQgACAENgIAAkAgAkUNAAJAIAJBAnQiBEUNACAFIAEgBPwKAAALIAAgAjYCCAsgA0EQaiQAC2cBAX8jAEEQayIEJAACQAJAIAANAEEAIQAgBEEMaiEDDAELIAQgAjYCDCAAIANsIQAgBEEIaiEDCyADIAA2AgACQCAEKAIMIgBFDQAgBCgCCCIDRQ0AIAEgAyAAENQUCyAEQRBqJAALdgEBfyMAQRBrIgIkAAJAAkAgAC0AAEEBRw0AIAEoAgBB0KKFAUEDIAEoAgQoAgwRDAAhAQwBCyACIAAtAAE6AAcgAkGGATYCDCACIAJBB2o2AgggASgCACABKAIEQc2VgAEgAkEIahDLBiEBCyACQRBqJAAgAQttAQF/IwBBEGsiAyQAIANBCGogASACEKgNIAMoAgwhAQJAAkACQCADKAIIQQFHDQAgAEEANgIAIAAgATYCBAwBCyABRQ0BIAAgATYCACAAIAIgASgCdGs2AgQLIANBEGokAA8LQdjDmAEQwyMAC2gBAn8jAEEgayIBJAAgAEE0aiECAkAgACgCMEECRg0AIAEgADYCCCABIAI2AgwgASABQR9qNgIYIAEgAUEMajYCFCABIAFBCGo2AhAgAEEwaiABQRBqQZjAmAEQtAcLIAFBIGokACACC2cBAX8jAEEQayIEJAACQAJAIAANAEEAIQAgBEEMaiEDDAELIAQgAjYCDCAAIANsIQAgBEEIaiEDCyADIAA2AgACQCAEKAIMIgBFDQAgBCgCCCIDRQ0AIAEgAyAAENQUCyAEQRBqJAALZwEBfyMAQRBrIgMkAAJAAkAgAA0AQQAhACADQQxqIQIMAQsgA0EENgIMIAAgAmwhACADQQhqIQILIAIgADYCAAJAIAMoAgwiAEUNACADKAIIIgJFDQAgASACIAAQ1BQLIANBEGokAAuAAQEBfyMAQSBrIgIkACACQQA2AgggAkKAgICAEDcCACACQYzZmAE2AhAgAkKggICABjcCFCACIAI2AgwCQCABIAJBDGoQ2xpFDQBBgZWbAUE3IAJBH2pB0NSYAUG4lZsBENUUAAsgACACKAIINgIIIAAgAikCADcCACACQSBqJAALgAEBAX8jAEEgayICJAAgAkEANgIIIAJCgICAgBA3AgAgAkGk2pgBNgIQIAJCoICAgAY3AhQgAiACNgIMAkAgASACQQxqENsaRQ0AQYGVmwFBNyACQR9qQbzamAFBuJWbARDVFAALIAAgAigCCDYCCCAAIAIpAgA3AgAgAkEgaiQAC20BA38CQCAAKAIMIgEgACgCBCICRg0AIAEgAmtBBnYhAQNAIAJBNGoiAygCACACQThqKAIAEOgdIAJBMGooAgAgAygCABD6IyACEM8LIAJBwABqIQIgAUF/aiIBDQALCyAAKAIIIAAoAgAQ/CMLbwICfwF+IABBCGohAQJAAkAgACgCAA0AIAEpAwAiA0IDg0IAUg0BIAOnIgEgASgCACICQX9qNgIAIAJBAUcNASABIAEoAhAQ7B4MAQsgARCtEgsCQCAAKAIoIgBFDQAgABCHAiAAQcAAQQgQ1BQLC2cCAX8BfgJAIAAtABRBAkcNAANAIAAoAgAiAkEYaiEAIAItACxBAkYNAAsLAkACQCAAKQMAIgNCA4NCAFINACADpyIAIAAoAgAiAEEBajYCACAAQX9MDQELIAFBDGogAxDjBhoPCwALaQIBfwF+AkACQCAAKQMIIgNCA4NCAFINACADpyICIAIoAgAiAkEBajYCACACQX9MDQELIAFBDGogAxDjBhoCQCAAKAIgIgJFDQAgAiABEJkCCwJAIAAoAiQiAEUNACAAIAEQmQILDwsAC3UAAkACQAJAAkAgACgCAA4DAAECAAsCQCAAKAIIQQNHDQAgACgCDCABEL0BCyAAKAIoIAEQ3gsPCyAAQRBqIAEQpBUgACgCMCIARQ0BIAAgARC9AQ8LIAAoAgQgARDeCyAAKAIYIgBFDQAgACgCACABEJkCCwtvAQR/QQAhAgJAAkAgAS0AJUUNAAwBCyABQQE6ACUCQAJAIAEtACRBAUcNACABKAIgIQMgASgCHCEEDAELIAEoAiAiAyABKAIcIgRGDQELIAMgBGshBSABKAIEIARqIQILIAAgBTYCBCAAIAI2AgALgAEBAX8jAEEgayICJAAgAkEANgIIIAJCgICAgBA3AgAgAkH8gJsBNgIQIAJCoICAgAY3AhQgAiACNgIMAkAgASACQQxqEPskRQ0AQYGVmwFBNyACQR9qQZSBmwFBuJWbARDVFAALIAAgAigCCDYCCCAAIAIpAgA3AgAgAkEgaiQAC2UBAn8CQAJAAkAgAEG1f2pB/wFxIgFBIEkNAEEBIQIgAEGNf2pB/wFxQS5JDQEMAgtBASECIABBjX9qQf8BcUEuSQ0AQYGAgpB4IAF2QQFxRQ0BCyACDwsgAEG0f2pB/wFxQSdJC3UCAX8BfiMAQRBrIgIkACABKQMIIQMgAUEKNgIIIAIgASkDEDcDCCACIAM3AwACQAJAIAOnIgFBCkYNACABQQFNDQEgAhCMFgtBiPOaAUEoQaCImwEQtyEACyAAIAIpAwg3AwggACACKQMANwMAIAJBEGokAAtpAQN/IwBBEGsiASQAIAFBBGogACgCACICIAAoAgQgAkEBdCICQQQgAkEESxsiAhC4CwJAIAEoAgRBAUcNACABKAIIIAEoAgwQ/CAACyABKAIIIQMgACACNgIAIAAgAzYCBCABQRBqJAALbgEBfyAAQegAahD7HgJAIAAoAmxFDQAgAEHsAGoQ+x4LIABBHGogACgCFCAAKAIYIAAoAhAoAhARCwAgAEHEAGoQ9BsCQCAAQX9GDQAgACAAKAIEIgFBf2o2AgQgAUEBRw0AIABBgAFBEBDUFAsLcQECfyMAQRBrIgIkAAJAAkACQAJAIAFCAVYNACABpw4CAQIBC0EBIQMgAkEBOgAAIAIgATcDCCAAIAJBhMCBARCSGDYCBAwCC0EAIQMgAEEAOgABDAELIABBAToAAUEAIQMLIAAgAzoAACACQRBqJAALXAEBfyABIABqIQECQCACIABJDQAgAiABTw0AQQEPC0EBIQQgAiADQQEgA0EBSxtqIQMCQAJAIAIgAE8NACADIAFLDQELAkAgAyAASw0AQQAPCyADIAFNIQQLIAQLaQECfwJAIAAoAgwiASAAKAIEIgJGDQAgASACa0EFdiEBA0AgAigCACACQQRqKAIAEPAhIAJBGGooAgAgAkEcaigCABCkHiACQSBqIQIgAUF/aiIBDQALCyAAKAIIIAAoAgBBBEEgENATC24BAn8jAEEQayICJAAgACgCACIAQQRqIQMCQAJAIAAoAgBBAUcNACACIAM2AgwgAUGt4IEBQQUgAkEMakHKABDBDCEADAELIAIgAzYCCCABQaXggQFBCCACQQhqQcoAEMEMIQALIAJBEGokACAAC28BA38jAEEQayICJAACQAJAIAEoAgQiAw0AQQAhAwwBCyACIAEoAgAgAyABKAIIIgQgAyAEIANJG0Gki4QBEIkcIAIoAgQhBCACKAIAIQMgASACKQIINwIACyAAIAQ2AgQgACADNgIAIAJBEGokAAteAQN/AkADQEEBIQQgASAARiIFDQECQCADIAJHDQAgAiEDDAILIAFBfGoiASgCACIEIANBfGoiAygCACIGRg0ACyAEIAZLIAQgBklrIQQLQX9BACACIANHGyAEIAUbC2MBBH9BACEBA0AgACgCACECAkADQCACQQFxDQEgACACQQFyIAAoAgAiAyADIAJGIgQbNgIAIAMhAiAERQ0ACw8LAkACQCACQQNLDQAgAUEKSQ0BCxDbIwALIAFBAWohAQwACwttAQJ/IwBBEGsiAiQAAkACQCABKAIAIAEoAggiA00NACACQQhqIAEgA0EEQQQQpg4gAigCCCIDQYGAgIB4Rw0BIAEoAgghAwsgACADNgIEIAAgASgCBDYCACACQRBqJAAPCyADIAIoAgwQ/CAAC3oBAX8jAEEQayICJAAgAiAAQdQSajYCDCABQf6nhQFBDEHTp4UBQQQgAEGHAUGKqIUBQQggAEHAEmpBiAFBwKaFAUEGIABB0BJqQYkBQdymhQFBBiAAQbANakGKAUHipoUBQQMgAkEMakGLARDlDCEAIAJBEGokACAAC24BAn8jAEEQayIDJAACQAJAIAIoAgBFDQBBCSECQe23mAEhBAwBCyADQQRqIAIoAgQgAigCCBDUBUHtt5gBIAMoAgggAygCBCICGyEEQQkgAygCDCACGyECCyAEIAIgARCaBCECIANBEGokACACC2sCAX8BfgJAAkACQAJAIAAtACwiAUF9akEBIAFBAksbQf8BcQ4CAQIACyAAEPISDwsgACkDACICQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDsHg8LIAAQ+BALC20CBH8BfiABKAIQIQIgASgCDCEDIAEoAgghBAJAIAEpAwAiBkIDg0IAUg0AIAanIgUgBSgCACIFQQFqNgIAIAVBf0oNAAALIAAgAjYCECAAIAM2AgwgACAENgIIIAAgBjcDACAAIAEtABQ6ABQLawIBfwF+AkACQAJAAkAgAC0ALCIBQX1qQQEgAUECSxtB/wFxDgIBAgALIAAQ9RIPCyAAKQMAIgJCA4NCAFINASACpyIAIAAoAgAiAUF/ajYCACABQQFHDQEgACAAKAIQEOweDwsgABD7EAsLbgECfyMAQRBrIgIkACAAKAIAIgBBBGohAwJAAkAgACgCAEEBRw0AIAIgAzYCDCABQZy8mgFBEiACQQxqQZsDEMEMIQAMAQsgAiADNgIIIAFBkbyaAUELIAJBCGpBnAMQwQwhAAsgAkEQaiQAIAALbgECfyMAQRBrIgIkACAAKAIAIgBBBGohAwJAAkAgACgCAEEBRw0AIAIgAzYCDCABQeCUmwFBBCACQQxqQdICEMEMIQAMAQsgAiADNgIIIAFBn66aAUEHIAJBCGpB3gMQwQwhAAsgAkEQaiQAIAALbgECfyMAQRBrIgIkACAAKAIAIgBBBGohAwJAAkAgACgCAEEBRw0AIAIgAzYCDCABQeCUmwFBBCACQQxqQdICEMEMIQAMAQsgAiADNgIIIAFB7MKaAUEMIAJBCGpBwQIQwQwhAAsgAkEQaiQAIAALdwEBfyMAQRBrIgIkACACIABBOGo2AgwgAUGarZoBQRFB3qiaAUEEIABBvwRBk6OaAUEEIABBMGpB/AFBq62aAUEFIABBPGpBwARBsK2aAUEMIABByABqQdQCQbytmgFBCSACQQxqQd4CEOUMIQAgAkEQaiQAIAALbQEBfyMAQRBrIgIkAAJAAkAgACgCACIAKAIAQQFHDQAgAiAAQQRqNgIMIAFB9aWaAUEIIAJBDGpBuQMQwQwhAAwBCyACIABBCGo2AgggAUG/lJsBQQUgAkEIakHyAhDBDCEACyACQRBqJAAgAAtoAQN/IwBBEGsiAyQAQQAhBAJAA0AgA0EIaiABIAIgBBDNASADKAIIIQICQCADLQAMIgVBAkcNAEEBIQQMAgsgAy0ADSEEIAVBAXENAAtBACEECyAAIAI2AgQgACAENgIAIANBEGokAAttAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgBBAUcNACACIABBBGo2AgwgAUGv4ZkBQQMgAkEMakHXBBDBDCEADAELIAIgAEEIajYCCCABQa3hmQFBAiACQQhqQdMEEMEMIQALIAJBEGokACAAC24BAn8jAEEQayICJAAgACgCACIAQQRqIQMCQAJAIAAoAgBBAUcNACACIAM2AgwgAUGcvJoBQRIgAkEMakHEBRDBDCEADAELIAIgAzYCCCABQZG8mgFBCyACQQhqQcUFEMEMIQALIAJBEGokACAAC24BAn8jAEEQayICJAAgACgCACIAQQhqIQMCQAJAIAApAwBCAVINACACIAM2AgwgAUHvpZoBQQMgAkEMakHjAhDBDCEADAELIAIgAzYCCCABQb+UmwFBBSACQQhqQbUCEMEMIQALIAJBEGokACAAC24BAn8jAEEQayICJAAgACgCACIAQQRqIQMCQAJAIAAoAgBBAUcNACACIAM2AgwgAUHglJsBQQQgAkEMakHsBBDBDCEADAELIAIgAzYCCCABQZ+umgFBByACQQhqQfoFEMEMIQALIAJBEGokACAAC24BAn8jAEEQayICJAAgACgCACIAQQRqIQMCQAJAIAAoAgBBAUcNACACIAM2AgwgAUHglJsBQQQgAkEMakHsBBDBDCEADAELIAIgAzYCCCABQezCmgFBDCACQQhqQcECEMEMIQALIAJBEGokACAAC3cB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IABBgICAgHhGDQAgACABENMlDwsCQAJAAkACQCABKAIAIgBBdWpBBCAAQQpLG0F+ag4DAAECAwsgAUEEahD7HiABQQxqEPseDAILIAFBBGoQ+x4MAQsgARD+GgsgAUHIAEEEENQUC2YBA38jAEEQayIDJAAgA0EIaiACQQFBARCOGCADKAIIIQQgAygCDCEFIABBADYCCCAAIAU2AgQgACAENgIAAkAgAkUNAAJAIAJFDQAgBSABIAL8CgAACyAAIAI2AggLIANBEGokAAt8AQF/AkAgASgCMCICIAAoApABSw0AIAAgAjYCkAELIAAgARDLCCAAIAEoAmg2AsgBIAAgASkDYDcDwAEgAEGYAWoQsiIgACABKQNQNwOwASAAIAEpA0g3A6gBIAAgASkDQDcDoAEgACABKQM4NwOYASAAIAEpA1g3A7gBC2QBAn8jAEEQayIEJAACQANAIARBCGogASACIAMQuQMgBCgCCCECAkAgBC0ADCIFQQJHDQBBASEDDAILIAQtAA0hAyAFQQFxDQALQQAhAwsgACACNgIEIAAgAzYCACAEQRBqJAALZgECfyAAKAIIQQZ0IQIgACgCBCEDAkADQCACRQ0BIAMgARDfISACQUBqIQIgA0HAAGohAwwACwsgACgCECAAKAIUIAEQ9R0gAEEYaiABEMsgIAEgAEE8ahCDGyAAQcAAaiABEMIiC2sBAn8jAEEQayIBJAACQAJAA0AgAUEIaiAAEOEMAkAgASgCDEGAgMQAIAEoAghBAXEbIgJBdmoOBAIBAQIACyACQdi/f2pBAkkNASACQYCAxABHDQALQQAhAgwBC0EBIQILIAFBEGokACACC2UBAn8jAEEQayICJAAgAiABNgIIAkACQCABENEgQf8BcSIDQQJGDQAgACADOgABQQAhAwwBCyAAIAJBCGogAkEPakHAuYEBEOsINgIEQQEhAwsgACADOgAAIAEQzSIgAkEQaiQAC1oBBH8gAEEBNgIEIABBf0EAIAEoAgwiAiABKAIIIgNHIgQbIgUgASgCBCABKAIAa0EYbiIBIAUgAUkbNgIAIAAgASACIANrQQpuIgIgASACIAFJGyAEGzYCCAthAQF/IwBBIGsiAiQAAkAgACgCCEECRg0AIAIgATYCCCACIAA2AgwgAiACQR9qNgIYIAIgAkEMajYCFCACIAJBCGo2AhAgAEEIaiACQRBqQezcgwEQtAcLIAJBIGokACAAC2ABAn8jAEEQayICJAACQAJAIAANAEEAIQAgAkEMaiEDDAELIAJBATYCDCACQQhqIQMLIAMgADYCAAJAIAIoAgwiAEUNACACKAIIIgNFDQAgASADIAAQ1BQLIAJBEGokAAtgAQF/IwBBEGsiBCQAAkACQCAADQBBACEAIARBDGohAwwBCyAEIAI2AgwgACADbCEAIARBCGohAwsgAyAANgIAAkAgBCgCDCIARQ0AIAEgACAEKAIIEOghCyAEQRBqJAALZAEEfyMAQRBrIgIkACAALQAMIQMgAkEEaiAAKAIEIAAoAghBChDsASACKAIIIgAgAigCDCIEEI0NIAIoAgQhBSABIANBAEdBAUEAIAAgBBDOBiEBIAUgABDZIyACQRBqJAAgAQtqAQF/IwBBEGsiAiQAAkACQCAAKAIAIgApAwBCAoUgACkDCIRQDQAgAiAANgIMIAFByJWbAUEEIAJBDGpBlAEQwQwhAQwBCyABKAIAQfaNmwFBBCABKAIEKAIMEQwAIQELIAJBEGokACABC2oBAX8jAEEQayICJAACQAJAIAAoAgAiACkDAEIChSAAKQMIhFANACACIAA2AgwgAUHIlZsBQQQgAkEMakGmARDBDCEBDAELIAEoAgBB9o2bAUEEIAEoAgQoAgwRDAAhAQsgAkEQaiQAIAELYAEBfyMAQRBrIgQkAAJAAkAgAA0AQQAhACAEQQxqIQMMAQsgBCACNgIMIAAgA2whACAEQQhqIQMLIAMgADYCAAJAIAQoAgwiAEUNACABIAAgBCgCCBDoIQsgBEEQaiQAC20BA38CQCABKAJkIgIgASgCaCIDTQ0AQejCmAFBHkGIw5gBELchAAsgAUEIaigCACEEIAFBBGooAgAhASAAIAM2AhggACACNgIUIAAgBDYCDCAAIAE2AgggACAENgIEIAAgATYCACAAIAI2AhALagIBfwF+IwBBEGsiASQAIAApAwghAiAAQQo2AgggASAAKQMQNwMIIAEgAjcDAAJAAkAgAqciAEEKRg0AIABBCUYNASABELwLC0GI85oBQShBwIebARC3IQALIAEoAgQhACABQRBqJAAgAAtxAQF/IwBBEGsiAiQAIAIgACgCACgCACIAQQhqNgIMIAFB36eaAUEKQZOj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akHIBBDBDCEACyACQRBqJAAgAAtdAQN/AkAgACgCDCIBIAAoAgQiAkYNACABIAJrQQR2IQEgAkEMaiECA0AgAigCACIDEIwCIANBwABBCBDUFCACQRBqIQIgAUF/aiIBDQALCyAAKAIIIAAoAgAQ8yMLXQEDfwJAIAAoAgwiASAAKAIEIgJGDQAgASACa0EEdiEBIAJBDGohAgNAIAIoAgAiAxCMAiADQcAAQQgQ1BQgAkEQaiECIAFBf2oiAQ0ACwsgACgCCCAAKAIAEPMjC1wBA38CQCAAKAIMIgEgACgCBCICRg0AIAEgAmtBAnYhAQNAIAIoAgAiA0EIahDmAyADQSBBCBDUFCACQQRqIQIgAUF/aiIBDQALCyAAKAIIIAAoAgBBBEEEEM8TC2IBAX8jAEEQayICJAACQAJAIAAtABRBAkYNACACIAA2AgwgAUG/lJsBQQUgAkEMakG1AhDBDCEADAELIAIgADYCCCABQYSjmgFBDyACQQhqQZUGEMEMIQALIAJBEGokACAAC2IBAX8jAEEQayICJAACQAJAIAAtADRBBEYNACACIAA2AgwgAUHQuZoBQQYgAkEMakG8BRDBDCEADAELIAIgADYCCCABQcS5mgFBDCACQQhqQcsFEMEMIQALIAJBEGokACAAC2IBAX8jAEEQayICJAACQAJAIAAtABRBAkYNACACIAA2AgwgAUG/lJsBQQUgAkEMakG1AhDBDCEADAELIAIgADYCCCABQcusmgFBDSACQQhqQdMGEMEMIQALIAJBEGokACAAC2wBAX8CQEHAABCKASIBDQBBCEHAABCgJAALIAEgACkDODcDOCABIAApAzA3AzAgASAAKQMoNwMoIAEgACkDIDcDICABIAApAxg3AxggASAAKQMQNwMQIAEgACkDCDcDCCABIAApAwA3AwAgAQtdAQN/IAAoAgQhAQJAIAAoAggiAkUNACABIQMDQCADQQxqIANBBGooAgAgA0EIaigCACADKAIAKAIQEQsAIANBEGohAyACQX9qIgINAAsLIAAoAgAgAUEEQRAQ2xMLXQEDfyAAKAIEIQECQCAAKAIIIgJFDQAgASEDA0AgA0EMaiADQQRqKAIAIANBCGooAgAgAygCACgCEBELACADQRBqIQMgAkF/aiICDQALCyAAKAIAIAFBBEEQENsTC2YBAn8C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CyAAKAIEEI0PDwtBAQ8LQQALOwEBfyAAIAIQix8gACgCCCEDAkAgAkUNACACRQ0AIAAoAgQgA2ogASAC/AoAAAsgACADIAJqNgIIQQALOwIBfwF+AkAgACkDACICQgODQgBSDQAgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDsHgsLNgECfyABQQZ0IQECQANAIAEiAkUNASACQUBqIQEgACgCACEDIABBwABqIQAgA0UNAAsLIAJFCzUBAn8gAUEobCEBAkADQCABIgJFDQEgAkFYaiEBIAAoAgAhAyAAQShqIQAgA0UNAAsLIAJFCzsCAX8BfgJAIAApAwAiAkIDg0IAUg0AIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQ7B4LCzsBAX8gACACEIsfIAAoAgghAwJAIAJFDQAgAkUNACAAKAIEIANqIAEgAvwKAAALIAAgAyACajYCCEEACzgBAn8jAEEQayIBJABBACECAkAgACgCAEECRg0AIAFBCGogABCbEyABKAIMIQILIAFBEGokACACCzgBAn8jAEEQayIBJABBACECAkAgACgCAEEHRg0AIAFBCGogABDJDSABKAIMIQILIAFBEGokACACCzoBAX8jAEEQayICJAAgAkEANgIMIAIgASACQQxqEOEYIAAgAigCACACKAIEEIQDIQEgAkEQaiQAIAELPAEBfyMAQRBrIgIkACACQQhqIAAgACgCACgCBBEHACACKAIIIAEgAigCDCgCEBEIACEAIAJBEGokACAACz0AAkACQAJAAkAgACgCAA4EAQIDAAELIABBBGoQqyMPCyAAQQhqEOUiDwsgAEEEahCqIw8LIABBBGoQrCMLOwEBfyMAQRBrIgMkACADIAE2AgAgAyACKQIANwIEIAMgAigCCDYCDCAAIAEgA0EEahDECSADQRBqJAALQgECf0EBIQECQAJAAkAgAC0AyAEiAkF9ag4EAgEBAAELIAAQ5RFBASEBDAELIAJBowFGIAAtAMkBciEBCyABQQFxCzsBA38gACgCACEBIAAoAgQhAgJAA0AgASIDIAJGDQEgACADQcAAaiIBNgIAIAMQ2hhFDQALCyADIAJHCzoAAkAgACgCACIAKAIAQQNHDQAgAEEQaiABEKklIABBBGogARCBHCAAKAIgIAEQqBwPCyAAIAEQrh8LNQEBfwJAIABFDQAgASAAQQxqKAIAIgIgAEEQaigCACIAIAIgAEkbIAIgACACIABLGxCAHAsLOQEBfyAAIAIQix8gACgCCCEDAkAgAkUNACACRQ0AIAAoAgQgA2ogASAC/AoAAAsgACADIAJqNgIICzkCAX8BfiMAQRBrIgIkACACQQhqIAFBCEEQEPgXIAIpAwghAyAAQQA2AgggACADNwIAIAJBEGokAAs5AgF/AX4jAEEQayICJAAgAkEIaiABQQhBIBD4FyACKQMIIQMgAEEANgIIIAAgAzcCACACQRBqJAALPAEBfyMAQRBrIgQkACAEIAE2AgwgBCAANgIIQQAgBEEIakHkrpgBIARBDGpB5K6YASACQcEAIAMQ1gsAC0EAAkACQCABIAIQ/xhFDQAgACEBDAELIAAgASkCEDcCECAAIAEpAgg3AgggACABKQIANwIACyABQYGAgIB4NgIACzsBAX8jAEEQayIEJAAgBCACNgIMIAQgATYCCCAAIARBCGpBwKScASAEQQxqQcCknAFBACAEIAMQ1gsACz4BAX8jAEEQayIEJAAgBCAANgIMIARByMSYATYCCEEAIARBCGpBuMeBASAEQQxqQbjHgQEgASACIAMQ1gsAC0EBAX8jAEEQayIBJAAgASAANgIMIAFByMSYATYCCEEAIAFBCGpByMeBASABQQxqQcjHgQFBACABQfjPgQEQ1gsACzsBAX8jAEEQayIGJAAgBiACNgIMIAYgATYCCCAAIAZBCGpBwIGCASAGQQxqQcCBggEgAyAEIAUQ1gsACzwBAX8jAEEQayICJAAgAiAAKAIANgIMIAFB4uCBAUEOQbeylwFBAyACQQxqQSsQww4hACACQRBqJAAgAAtAAQF/AkAgASgCCCICQYCAgBBxDQACQCACQYCAgCBxDQAgACABEMEKDwsgACgCACABEJ0TDwsgACgCACABEJ4TCz0BAX8jAEEQayICJAAgAiAAKAIANgIMIAFB2qGFAUEPQemhhQFBCSACQQxqQdAAEMMOIQAgAkEQaiQAIAALQAEBfwJAIAEoAggiAkGAgIAQcQ0AAkAgAkGAgIAgcQ0AIAAgARCECg8LIAAoAgAgARCfEw8LIAAoAgAgARCgEwswAAJAIABBv39qQf8BcUEaSQ0AIABB3wBxIAAgAEGff2pB/wFxQRpJGw8LIABBIHILOQEBfyAAIAIQ1R8gACgCCCEDAkAgAkUNACACRQ0AIAAoAgQgA2ogASAC/AoAAAsgACADIAJqNgIIC0EBAX8jAEEQayIBJAAgASAANgIMIAFBuOKGATYCCEEAIAFBCGpBsIGCASABQQxqQbCBggFBACABQdDXiQEQ1gsACzkAAkAgAkGAgMQARg0AIAAgAiABKAIQEQgARQ0AQQEPCwJAIAMNAEEADwsgACADIAQgASgCDBEMAAs+AQF/IwBBEGsiAiQAIAIgATYCDCACIAA2AghBACACQQhqQdCBggEgAkEMakHQgYIBQQAgAkHMg4IBENYLAAtAAQF/AkAgASgCCCICQYCAgBBxDQACQCACQYCAgCBxDQAgACABEMEKDwsgACgCACABEJ0TDwsgACgCACABEJ4TC0UBAX8jAEEQayIBJAAgAUHIxJgBNgIMIAEgADYCCEEAIAFBCGpBnOKDASABQQxqQZzigwFB0OeDAUHLAEH454MBENYLAAs5AgF/AX4jAEEQayICJAAgAkEIaiABQQRBBBD/FiACKQMIIQMgAEEANgIIIAAgAzcCACACQRBqJAALLgACQCABIANGDQAgASADSyABIANJaw8LIAAgACABQQJ0IgFqIAIgAiABahDvEws5AgF/AX4jAEEQayICJAAgAkEIaiABQQFBARD/FiACKQMIIQMgAEEANgIIIAAgAzcCACACQRBqJAALOQEBfwJAIAEgACgCPHZBfmoiASAAKAIUIgJJDQAgASACQZyWhQEQ9RYACyAAKAIQIAFBDGxqKAIIC0EBAX8jAEEQayIBJAAgASAANgIMIAFByMSYATYCCEEAIAFBCGpBrNKEASABQQxqQazShAFBACABQZzlhAEQ1gsACzsBAX8jAEEQayIDJAAgAyABNgIMIAMgADYCCEEAIANBCGpByNeEASADQQxqQcjXhAFBACADIAIQ1gsACz0BAX8jAEEQayICJAAgAiAAKAIANgIMIAFB3JyFAUEHQYyihQFBBCACQQxqQZYBEMMOIQAgAkEQaiQAIAALPQEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUGUxpcBQQxBmO6aAUEDIAJBDGpB2AEQww4hACACQRBqJAAgAAs9AQF/IwBBEGsiAiQAIAIgACgCADYCDCABQaCylwFBCkGY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1BQLCzQBAX8jAEEQayIFJAAgBUEIaiADIAQQ7yEgBSgCDCEEIAAgASACELcHIAQQCiAFQRBqJAALMwEBf0EAIQICQCABRQ0AA0AgAiAALAAAQb9/SmohAiAAQQFqIQAgAUF/aiIBDQALCyACCzYBAX8DQCAAKAAAIQMgACABKAAANgAAIAEgAzYAACAAQQRqIQAgAUEEaiEBIAJBf2oiAg0ACws9AQF/AkAgASgCCCICQYCAgBBxDQACQCACQYCAgCBxDQAgACABEM4PDwsgAC0AACABELsSDwsgACABEIYSCzkBAX8jAEEQayICJAAgAiAANgIMIAFBrOGBAUENQfzggQFBBSACQQxqQSsQww4hACACQRBqJAAgAAs6AQF/AkAgAiABKAIIIgNJDQAgAiADQcjYgQEQ9RYACyAAIAE2AgAgACABKAIEIAJBFGxqKAIANgIECzYBAX8jAEEQayICJAAgAkEANgIMIAIgASACQQxqEMANIAAgAigCACACKAIEEIkOIAJBEGokAAsyAQF+QgAhAgJAA0AgAUUNASABQX9qIQFCASAAMQAAhiAChCECIABBAWohAAwACwsgAgs0AQF/IwBBEGsiAyQAIANBADYCDCADIAI6AAwgACABIANBDGpBARDWHyECIANBEGokACACCzAAAkAgAyABSQ0AIAAgAyABazYCBCAAIAIgAUECdGo2AgAPCyABIAMgAyAEEI8KAAswAAJAIAMgAUkNACAAIAMgAWs2AgQgACACIAFBAnRqNgIADwsgASADIAMgBBCPCgALOgEBfyMAQRBrIgIkACACIAA2AgwgAUGZnIUBQQtBpJyFAUECIAJBDGpB+QAQww4hACACQRBqJAAgAAs6AQF/IwBBEGsiAiQAIAIgADYCDCABQdCchQFBBkHWnIUBQQYgAkEMakHDABDDDiEAIAJBEGokACAACzUBAX8gAEEIahCWCQJAIABBf0YNACAAIAAoAgQiAUF/ajYCBCABQQFHDQAgAEEwQQQQ1BQLCzoBAX8jAEEQayICJAAgAiAANgIMIAFB2qGFAUEPQemhhQFBCSACQQxqQdAAEMMOIQAgAkEQaiQAIAALOwEBfwJAQQgQigEiAw0AQQRBCBCgJAALIAMgAjYCBCADIAE2AgAgAEEBNgIIIAAgAzYCBCAAQQE2AgALNgEBfyAAQRBqEKoMAkAgAEF/Rg0AIAAgACgCBCIBQX9qNgIEIAFBAUcNACAAQfACQRAQ1BQLCzoBAX8jAEEQayICJAAgAiAANgIMIAFBkqiFAUEQQemhhQFBCSACQQxqQdAAEMMOIQAgAkEQaiQAIAALOgEBfyMAQRBrIgIkACACIAA2AgwgAUHcnIUBQQdBjKKFAUEEIAJBDGpBlgEQww4hACACQRBqJAAgAAs5AQF/AkAgAC0ADEECRg0AIAAoAgAiASABKAIAIgFBf2o2AgAgAUEBRw0AIAAoAgAgACgCBBDvEQsLOgEBfyMAQRBrIgIkACACIAA2AgwgAUHEp4UBQQ9B06eFAUEEIAJBDGpBwAEQww4hACACQRBqJAAgAAs6AQF/IwBBEGsiAiQAIAIgADYCDCABQbathQFBDkGDpJoBQQQgAkEMakHRARDDDiEAIAJBEGokACAACzoBAX8jAEEQayICJAAgAiAANgIMIAFBoOGZAUENQYOkmgFBBCACQQxqQfIBEMMOIQAgAkEQaiQAIAALOgEBfyMAQRBrIgIkACACIAA2AgwgAUGg4ZkBQQ1Bg6SaAUEEIAJBDGpB8gEQww4hACACQRBqJAAgAAs2AQF/IwBBEGsiAiQAIAJBCGogARCYFiACKAIMIQEgACACKAIINgIAIAAgATYCBCACQRBqJAALPgEBfyMAQRBrIgEkAAJAIABB/////wdJDQBB1P2aAUErIAFBD2pBwK2YAUHQrZgBENUUAAsgAUEQaiQAIAALMwAgASgCAEEAIAJrQQxsaiICQXRqKAIAQd3L3Z55bCACQXhqKAIAakHdy92eeWxBD3etCzUAAkAgACgCDA0AQQAPCyAAKAIAIAAoAgQgAUHdy92eeWxBD3etIAEQ0w0iAEF0akEAIAAbCzUBAX8gACgCACgCACICKQMAIAAoAgQoAgAgAUEEdGtBcGoiACkDAIUgAikDCCAAKQMIhYRQCzUBAX8gACgCACgCACICKQMAIAAoAgQoAgAgAUEFdGtBYGoiACkDAIUgAikDCCAAKQMIhYRQCzQBAn8CQCAAQgODQgBSDQAgAKciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDsHgsLPgIBfwF+AkBBFBCKASIBDQBBBEEUEKAkAAsgACgCACIAKQIMIQIgASAAKAIEIAAoAggQnQkgASACNwIMIAELPgIBfwF+AkBBFBCKASIBDQBBBEEUEKAkAAsgACgCACIAKQIMIQIgASAAKAIEIAAoAggQwQcgASACNwIMIAELNAECfwJAIABCA4NCAFINACAApyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOweCws6AQF/IwBBEGsiAiQAIAIgADYCDCABQffImQFBD0GDpJoBQQQgAkEMakGlAhDDDiEAIAJBEGokACAACzoBAX8jAEEQayICJAAgAiAANgIMIAFBoOGZAUENQYOkmgFBBCACQQxqQfIBEMMOIQAgAkEQaiQAIAALNAECfwJAIABCA4NCAFINACAApyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEOweCws6AQF/IwBBEGsiAiQAIAIgADYCDCABQYO0mgFBEkGTo5oBQQQgAkEMakGCAhDDDiEAIAJBEGokACAACzQBAn8CQCAAQgODQgBSDQAgAKciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDsHgsLOgEBfyMAQRBrIgIkACACIAA2AgwgAUGovpoBQQVBk6OaAUEEIAJBDGpBggIQww4hACACQRBqJAAgAAs7AQF/IAEoAgQhBAJAAkAgASgCAEEBRg0AIAEoAgghAwwBCyAEEI0YIAIhBAsgACADNgIEIAAgBDYCAAs6AQF/IAAoArwBIgEgASgCACIBQX9qNgIAAkAgAUEBRw0AIAAoArwBEPIcCyAAELQhIABBwAFqEOceCzoBAX8CQCABKAIIIgJBgICAEHENAAJAIAJBgICAIHENACAAIAEQwQoPCyAAIAEQyhIPCyAAIAEQyxILMQACQCABRQ0AA0AgACgCACAAQQRqKAIAQQRBCBDREyAAQQxqIQAgAUF/aiIBDQALCwsxAAJAIAFFDQADQCAAKAIAIABBBGooAgBBAUEBENETIABBDGohACABQX9qIgENAAsLCzEAAkAgAUUNAANAIAAoAgAgAEEEaigCAEEEQQQQ0RMgAEEMaiEAIAFBf2oiAQ0ACwsLMQACQCABRQ0AA0AgACgCACAAQQRqKAIAQQFBARDREyAAQQxqIQAgAUF/aiIBDQALCws1AQF/AkAgACgCCCICIAAoAgBHDQAgABCVGgsgACACQQFqNgIIIAAoAgQgAkECdGogATYCAAsxAAJAIAFFDQADQCAAKAIAIABBBGooAgBBAUEBENcTIABBEGohACABQX9qIgENAAsLCzEAAkAgAUUNAANAIAAoAgAgAEEEaigCAEEEQQgQ0RMgAEEUaiEAIAFBf2oiAQ0ACwsLMQACQCABRQ0AA0AgACgCACAAQQRqKAIAQQRBCBDREyAAQQxqIQAgAUF/aiIBDQALCws2AQF/IwBBEGsiAiQAIAIgACgCADYCDCABQbOuhQFBCiACQQxqQckAEMEMIQAgAkEQaiQAIAALNgEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUGImYUBQQogAkEMakGEARDBDCEAIAJBEGokACAACzYBAX8jAEEQayICJAAgAiAAKAIANgIMIAFB8qGFAUEKIAJBDGpBjQEQwQwhACACQRBqJAAgAAs2AAJAIAJB////P3EgAHYiAiABKAKUASIASQ0AIAIgAEGY+oQBEPUWAAsgASgCkAEgAkEDdGoLOAEBf0EBIQICQCABQYCAgIB4Rg0AIAEgAEGEBWoiACgCABCZGEYNACABIAAoAgAQ5hhGIQILIAILNgEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUGTn4UBQQsgAkEMakHJABDBDCEAIAJBEGokACAACzUBAX8jAEEQayICJAAgAiAAKAIANgIMIAFB/KGFAUEQIAJBDGpBJhDBDCEAIAJBEGokACAACzYBAX8jAEEQayICJAAgAiAAKAIANgIMIAFBx6GFAUETIAJBDGpBlQEQwQwhACACQRBqJAAgAAs2AQF/IwBBEGsiAiQAIAIgACgCADYCDCABQZilhQFBAyACQQxqQaMBEMEMIQAgAkEQaiQAIAALNQEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUHgsIUBQQkgAkEMakEmEMEMIQAgAkEQaiQAIAALNgEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUHDroUBQQwgAkEMakGnARDBDCEAIAJBEGokACAACzYBAX8jAEEQayICJAAgAiAAKAIANgIMIAFB4K2FAUENIAJBDGpBqwEQwQwhACACQRBqJAAgAAs2AQF/IwBBEGsiAiQAIAIgACgCADYCDCABQbeshQFBGCACQQxqQbIBEMEMIQAgAkEQaiQAIAALNgEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUGUqYUBQQwgAkEMakG3ARDBDCEAIAJBEGokACAACzYBAX8jAEEQayICJAAgAiAAKAIANgIMIAFBoKmFAUEJIAJBDGpBwwEQwQwhACACQRBqJAAgAAs5AQF/IAAQ3hAgAEEwahDbFCAAKAKQAyIBIAEoAgAiAUF/ajYCAAJAIAFBAUcNACAAKAKQAxCAHQsLNgEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUGanYUBQQ4gAkEMakHPABDBDCEAIAJBEGokACAACzMBAX8jAEEQayIDJAAgA0EIaiAAEI0UIAMoAgggAygCDCABIAIQ7R8hACADQRBqJAAgAAszAQF/IwBBEGsiAyQAIANBCGogABCNFCADKAIIIAMoAgwgASACEO0fIQAgA0EQaiQAIAALNQEBfwJAIAAoAggiAiAAKAIARw0AIAAQjRoLIAAgAkEBajYCCCAAKAIEIAJBAnRqIAE2AgALOAEBfwJAIAEoAgAiA0H/////B0kNACACEIIeAAsgASADQQFqNgIAIAAgATYCBCAAIAFBBGo2AgALNgEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUHnzJgBQQQgAkEMakHJABDBDCEAIAJBEGokACAACzcBAX9BpAEhAgJAIAFBBUcNAEGkf0GFfyAAKAAAQevK5fsGcyAAQQRqLQAAQeYAc3IbIQILIAILNwEBf0GkASECAkAgAUEFRw0AQaR/QfEAIAAoAABB+dKV4wZzIABBBGotAABB5ABzchshAgsgAgs3ACAAEIwCIABBwABBCBDUFAJAIAFFDQAgARD3GyABKAIAIAFBBGooAgAQ8SMgAUEUQQQQ1BQLCz0BAX8gAS0A3wEhAiABQQA6AN8BIAEgACgCIBCJAQJAIAAoAgBBAkcNACABIAAoAgQQiQELIAEgAjoA3wELOwEBfyAAKAIAIgEQ3AEgAUHAAEEIENQUIAAoAgQiABD3GyAAKAIAIABBBGooAgAQ8SMgAEEUQQQQ1BQLNQEBfwJAIAAoAggiAiAAKAIARw0AIAAQlBoLIAAgAkEBajYCCCAAKAIEIAJBAnRqIAE2AgALNgACQCAALQAUQQJHDQAgACgCACIAQRhqEMIdIAApAwAQmiEgAEEwQQgQ1BQPCyAAKQMAEJohCzcBAX8jAEEQayICJAAgASACQQ9qQeC5gQEQ6wghASAAQZWAgIB4NgIAIAAgATYCBCACQRBqJAALMgEBfyMAQRBrIgIkACACIAA2AgwgAUGen4UBQQ8gAkEMakEmEMEMIQAgAkEQaiQAIAALJgEBf0EBIABBAXJnQR9zIgFBAXYgAUEBcWoiAXQgACABdmpBAXYLMgEBfyMAQRBrIgIkACACIAA2AgwgAUHw4oEBQQYgAkEMakE2EMEMIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUHQnIUBQQYgAkEMakHDABDBDCEAIAJBEGokACAACzMBAX8jAEEQayICJAAgAiAANgIMIAFB+N+BAUEIIAJBDGpBxgAQwQwhACACQRBqJAAgAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQdTegQFBDCACQQxqQc8AEMEMIQAgAkEQaiQAIAALMQEBfwJAIAEoAgAiBEEBcQ0AIAAgBCACIAMQ6RsPCyAAIAEgBCAEQX5xIAIgAxDVEws0AQF/IwBBEGsiAyQAAkAgAA0AQajpgQFBDiADQQ9qQZjpgQEgAhDVFAALIANBEGokACABCzEBAX8jAEEQayICJAAgAkEIaiAAEI0bIAEgAigCCCACKAIMEJ4HIQAgAkEQaiQAIAALLQACQCADIAFJDQAgACADIAFrNgIEIAAgAiABajYCAA8LIAEgAyADIAQQjwoACzIBAX8jAEEQayICJAAgAiAANgIMIAFB1syYAUERIAJBDGpBJhDBDCEAIAJBEGokACAACzMBAX8jAEEQayICJAAgAiAANgIMIAFBvNCZAUEEIAJBDGpByQAQwQwhACACQRBqJAAgAAsrAAJAIAAgAUECdGpBfGoiAA0AQejigwEQwyMACyABrUIFhiAAKAIAZ619CzMBAX8jAEEQayICJAAgAiAANgIMIAFB/piFAUEKIAJBDGpB+wAQwQwhACACQRBqJAAgAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQdychQFBByACQQxqQf0AEMEMIQAgAkEQaiQAIAALMgEBfyMAQRBrIgIkACACIAA2AgwgAUGtn4UBQQYgAkEMakErEMEMIQAgAkEQaiQAIAALLQAgACgCJCAAKAIUQQxsaiAAKAIgIAAoAghqQQJ0aiAAKAIwQQAgACgCKBtqCz0BAX8jAEEQayIAJAAgABC2GEEAQQE6AJCWnQFBACAAKQMANwOAlp0BQQAgACkDCDcDiJadASAAQRBqJAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUHpsIUBQQ0gAkEMakGMARDBDCEAIAJBEGokACAACzUBAX9BACEEAkAgACgC3AJBAUYNACABIAIgAxCpHSIEKAIAIARBBGooAgBBABD5ESEECyAECzMBAX8jAEEQayICJAAgAiAANgIMIAFBk5+FAUELIAJBDGpByQAQwQwhACACQRBqJAAgAAsyAQF/IwBBEGsiAiQAIAIgADYCDCABQaKohQFBCiACQQxqQSYQwQwhACACQRBqJAAgAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQf6YhQFBCiACQQxqQZABEMEMIQAgAkEQaiQAIAALOAECfwJAIAEoAgwiAiABKAIIIgNNDQBBACACIANBlICFARCPCgALIAAgAjYCBCAAIAEoAgQ2AgALMwEBfyMAQRBrIgIkACACIAA2AgwgAUG9roUBQQYgAkEMakGlARDBDCEAIAJBEGokACAACzMBAX8jAEEQayICJAAgAiAANgIMIAFB2a2FAUEHIAJBDGpBqQEQwQwhACACQRBqJAAgAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQeynhQFBEiACQQxqQbABEMEMIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUGOqYUBQQYgAkEMakG2ARDBDCEAIAJBEGokACAACzMBAX8jAEEQayICJAAgAiAANgIMIAFBra2FAUEJIAJBDGpBuwEQwQwhACACQRBqJAAgAAsyAQF/IwBBEGsiAiQAIAIgADYCDCABQZCylwFBECACQQxqQSYQwQwhACACQRBqJAAgAAsyAQF/IAAoAgghASAAKAIEIQACQANAIAFFDQEgAUF/aiEBIAAQ8hsgAEEYaiEADAALCwsxAQF/IwBBEGsiAiQAIAJBCGogABCNFCABIAIoAgggAigCDBCeByEAIAJBEGokACAACy0AAkAgAyABSQ0AIAAgAyABazYCBCAAIAIgAWo2AgAPCyABIAMgAyAEEI8KAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQcjHmAFBByACQQxqQckAEMEMIQAgAkEQaiQAIAALMwEBfwJAIAFFDQADQCAAKAIAIgIQnAEgAkHAAEEIENQUIABBBGohACABQX9qIgENAAsLCy8AAkAg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ACgCAC0AAEECdCIAKALU/pwBIAAoAsj+nAEgASgCBCgCDBEMAAstACABKAIAIAAoAgAtAABBAnQiACgC+P6cASAAKALs/pwBIAEoAgQoAgwRDAALLQAgASgCACAAKAIALQAAQQJ0IgAoArj/nAEgACgChP+cASABKAIEKAIMEQwACy0AIAEoAgAgACgCAC0AAEECdCIAKALIgJ0BIAAoAryAnQEgASgCBCgCDBEMAAstACABKAIAIAAoAgAtAABBAnQiACgC4ICdASAAKALUgJ0BIAEoAgQoAgwRDAALLQAgASgCACAAKAIALQAAQQJ0IgAoAoSBnQEgACgC+ICdASABKAIEKAIMEQwACy0AIAEoAgAgACgCAC0AAEECdCIAKALEgZ0BIAAoApCBnQEgASgCBCgCDBEMAAseAAJAIAIgAUkNACACIAEgAxD1FgALIAAgAkEFdGoLHgACQCACIAFJDQAgAiABIAMQ9RYACyAAIAJBAnRqCx4AAkAgAiABSQ0AIAIgASADEPUWAAsgACACQQZ0agsnACAAKQMIIAApAxgQniUgAEEgahC2IiAAKAI4EKAjIAAoAjwQoyMLJwEBfyABIAEoAngiA0H//3txNgJ4IAAgASACQQAQiwggASADNgJ4Cx4AAkAgAiABSQ0AIAIgASADEPUWAAsgACACQQxsagslAQF/IAEoAgAhAiABQQA2AgAgASgCBCEBIAIQ+SAgACABEJoCCyABAX9BACEEAkAgASADRw0AIAAgAiABELIYRSEECyAECyUBAX8gASgCACECIAFBADYCACABKAIEIQEgAhD5ICAAIAEQuhQLJQAgACABKAIINgIEIABBACABKAIEIAEoAgBBgICAgHhGGzYCAAsfACAAIAIQrg0gAEEQaiACQRBqEK4NIAJBCCABELwKCyoAIAEoAgAgAC0AAEECdCIAKAKAqZwBIAAoAvSonAEgASgCBCgCDBEMAAsiAQF/AkAgASAAKAIAIAAoAggiAmtNDQAgACACIAEQ4AoLCyABAX9BACEEAkAgASADSQ0AIAIgACADELIYRSEECyAECyAAAkAgACgCACIAQQFxDQAgABCLFA8LIAAgASACEIEZCyABAX9BACEEAkAgASADRw0AIAAgAiABELIYRSEECyAECyABAX9BACEEAkAgASADRw0AIAAgAiABELIYRSEECyAECyQAAkAgAA0AQZSnnAFBMhCdJAALIAAgAiADIAQgASgCEBEOAAskAAJAIAANAEGUp5wBQTIQnSQACyAAIAIgAyAEIAEoAhARDwALJAACQCAADQBBlKecAUEyEJ0kAAsgACACIAMgBCABKAIQEQ8ACyQAAkAgAA0AQZSnnAFBMhCdJAALIAAgAiADIAQgASgCEBEOAAskAAJAIAANAEGUp5wBQTIQnSQACyAAIAIgAyAEIAEoAhAROQALJAACQCAADQBBlKecAUEyEJ0kAAsgACACIAMgBCABKAIQETUACyQAAkAgAA0AQZSnnAFBMhCdJAALIAAgAiADIAQgASgCEBEOAAskAAJAIAANAEGUp5wBQTIQnSQACyAAIAIgAyAEIAEoAhARLwALIQACQCACRQ0AIAIgARDSICEBCyAAIAI2AgQgACABNgIACyIBAX8gACAAKAIAIgFBf2o2AgACQCABQQFHDQAgABCQDwsLIQACQCACRQ0AIAIgARDSICEBCyAAIAI2AgQgACABNgIACx4AIAAoAiRBACAAKAIcGyAAKAIUIAAoAghqQQJ0agshACAAIAIQzwYgAEHAAGogAkHAAGoQzwYgAkEIIAEQ7gcLJAAgACgCACAAKAIEQQRBBBDREyAAKAIMIAAoAhBBBEEEENETCyoAIAEoAgAgAC0AAEECdCIAKALk3JwBIAAoAszcnAEgASgCBCgCDBEMAAsfACAAIAIQjwkgAEEgaiACQSBqEI8JIAJBCCABEIMJCx8AIAAgAhCQCSAAQQhqIAJBCGoQkAkgAkEIIAEQ/ggLJwEBfwJAQcQAEIoBIgENAEEEQcQAEKAkAAsgASAAQcQA/AoAACABCyoAIAEoAgAgAC0AAEECdCIAKAKQ6ZwBIAAoAujnnAEgASgCBCgCDBEMAAsgAQF/QQAhBAJAIAEgA0cNACAAIAIgARCyGEUhBAsgBAsqACABKAIAIAAtAABBAnQiACgC3OqcASAAKAK46pwBIAEoAgQoAgwRDAALHgAgASgCACACQQR0a0FwaigCAEHdy92eeWxBD3etCyUBAX8CQEHAABCKASIBDQBBCEHAABCgJAALIAEgACgCABBOIAELJAEBfwJAQSgQigEiAQ0AQQhBKBCgJAALIAEgACgCABDCBSABCyUBAX8CQEHgABCKASIBDQBBCEHgABCgJAALIAEgACgCABBvIAELIgBByPCaAUG+8JoBIABBAXEiABtBC0EKIAAbIAEgAhDFBAskACAAQQA2AhAgAEEAOgAUIAAgASkDCDcDCCAAIAEpAwA3AwALIwAgASAAKAIgEOMMAkAgACgCAEECRw0AIAEgACgCBBDjDAsLIwAgACgCICABEL0BAkAgACgCAEECRw0AIAAoAgQgARC9AQsLIwAgASAAKAIgEMoBAkAgACgCAEECRw0AIAEgACgCBBDKAQsLJQAgACABKAIINgIEIABBACABKAIEIAEoAgBBgICAgHhGGzYCAAskAAJAIAEoAgBBgICAgHhGDQAgACABIAIQ8BcPCyAAQQQ6AAALIwEBfyAAQQRqIQECQCAAKAIADQAgASgCABCgIw8LIAEQmyELJQEBfiAAKQMIIQECQCAAKAIADQAgARCaIQ8LIAEgACkDGBCeJQsiAAJAA0AgAC0AJUECRg0BIAAoAiAhAAwACwsgACABEJsUCxsAIAAgASACIAMgAUEBcmdBAXRBPnNBABDgAQsfACAAIAIQmgkgAEEwaiACQTBqEJoJIAJBCCABEOkICyIAAkADQCAALQAlQQJGDQEgACgCICEADAALCyABIAAQ7wwLGwAgACABIAIgAyABQQFyZ0EBdEE+c0EAEOEBCyEBAX9BACEBAkAgACgCAEERRw0AIABBCGoQyRIhAQsgAQsfAAJAIABFDQAgASAAQQRqKAIAIABBCGooAgAQgBwLCx8AAkAgAEUNACABIABBDGooAgAgAEEQaigCABCAHAsLIAEBf0EAIQQCQCABIANHDQAgACACIAEQshhFIQQLIAQLIQACQCACRQ0AIAIgARDSICEBCyAAIAI2AgQgACABNgIACyEAAkAgAkUNACACIAEQ0iAhAQsgACACNgIEIAAgATYCAAsjAQF/IAAoAgAhASAAQQA2AgAgACgCBCEAIAEQ+SAgABDNIgsjAAJAQQAgACgCABEEACIADQBBuKWcARCKHgALIAAgATYCAAsjACAAQQE2AgQgACABKAIAQYGAgIB4RyIBNgIIIAAgATYCAAshAQF/AkBBAhCKASIBDQBBAUECEKAkAAsgASAAOgAAIAELJQACQCAALQAADQAgAUGO7JoBQQUQngcPCyABQZPsmgFBBBCeBwsZAAJAIABQDQAgAEIDg1BFDQAgAKcQjx8LCyIAAkAgAA0AQZSnnAFBMhCdJAALIAAgAiADIAEoAhARCwALIQAgACgCACIAKAIAQQhqIAAoAgQgASgCACABKAIEEMUECyAAAkAgASgCAEUNACAAQai6mAE2AgQgACABNgIADwsACx0AIAEoAgAgAkEFdGtBYGoiAikDACACKQMIEMwcCx0AIAEoAgAgAkEEdGtBcGoiAikDACACKQMIEMwcCx0AAkAgAUH/AUkNACAAIAGsEJEjDwsgACABEJEQCycAIAAtAABBAnQiACgCjOucASAAKAKA65wBIAEoAgAgASgCBBDFBAsnACAALQAAQQJ0IgAoAvzrnAEgACgCmOucASABKAIAIAEoAgQQxQQLJwAgAC0AAEECdCIAKALs7JwBIAAoAuDsnAEgASgCACABKAIEEMUECycAIAAtAABBAnQiACgClO2cASAAKAL47JwBIAEoAgAgASgCBBDFBAsnACAALQAAQQJ0IgAoAvDtnAEgACgCsO2cASABKAIAIAEoAgQQxQQLHQAgACgCACIAQRBBICAAKAIAQQNGG2ooAgAQ/QkLHQACQCAAQQJHDQAgAUEIahDmAyABQSBBCBDUFAsLJgEBfwJAIAAoAgAiAUGAgICAeEYNACAAEJobIAEgACgCBBDzIwsLHwACQCABQf8BcUEFSQ0AIAAQjAIgAEHAAEEIENQUCwsgACAAEPcbIAAoAgAgAEEEaigCABDxIyAAQRRBBBDUFAsdAAJAIAAoAgBBCUYNACAAEJwGDwsgAEEIahC2BAseAAJAIAAtACVBAkYNACABIAAQtgwPCyABIAAQyQELJQAgACABQf8BcUECdCIBKALwhp0BNgIEIAAgASgCjIedATYCAAseAAJAIAEoAgBFDQAgACABIAIQiiQPCyAAQQQ6AAALHgACQCABKAIARQ0AIAAgASACEOEFDwsgAEEEOgAACx4AAkAgASgCAEUNACAAIAEgAhD2Cg8LIABBBDoAAAsjAAJAAkAgAC0AyAFBemoOAgAAAQsgABDlEUEADwsgABC+DAsiACAAELkiIAAoAhQQoCMgACgCBCIAEKgjIABBIEEEENQUCx8AIAAQoyEgAEEMahCvHiAAKAIcEKIjIABBIGoQ3yILIAEBfyAAQQRqIQECQCAAKAIADQAgARDiIg8LIAEQmyELIwACQAJA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Z290IMAAGGV4cGVjdGVkIGNoYXIgYXQgb2Zmc2V0IMAAHGdhdmUgdXAgc2VhcmNoaW5nIGF0IG9mZnNldCDAACFxdWl0IHNlYXJjaCBhZnRlciBvYnNlcnZpbmcgYnl0ZSDACyBhdCBvZmZzZXQgwAAWc2xpY2UgaW5kZXggc3RhcnRzIGF0IMANIGJ1dCBlbmRzIGF0IMAAFWJ5dGUgcmFuZ2Ugc3RhcnRzIGF0IMANIGJ1dCBlbmRzIGF0IMAAwAQgYXQgwAAgaW5kZXggb3V0IG9mIGJvdW5kczogdGhlIGxlbiBpcyDAEiBidXQgdGhlIGluZGV4IGlzIMAAKmludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IMAXIGlzIGFscmVhZHkgcmVuYW1lZCB0byDAFiwgYnV0IGl0J3MgcmVuYW1lZCBhcyDAAE1pbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBwYXJzZV9saXQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZm9yIMAAA29yIMAAFVVuZXhwZWN0ZWQgY2hhcmFjdGVyIMAAEWNhbGxlZCBleHBlY3Qgb24gwADACSBhdCBsaW5lIMAIIGNvbHVtbiDAAA1pbnZhbGlkIHNwYW4gwBggZm9yIGhheXN0YWNrIG9mIGxlbmd0aCDAABFzdGFydCBieXRlIGluZGV4IMAnIGlzIG91dCBvZiBib3VuZHMgZm9yIHN0cmluZyBvZiBsZW5ndGggwAAPZW5kIGJ5dGUgaW5kZXggwCcgaXMgb3V0IG9mIGJvdW5kcyBmb3Igc3RyaW5nIG9mIGxlbmd0aCDAABJyYW5nZSBzdGFydCBpbmRleCDAIiBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCDAABByYW5nZSBlbmQgaW5kZXggwCIgb3V0IG9mIHJhbmdlIGZvciBzbGljZSBvZiBsZW5ndGggwADAFSBleGNlZWRzIGNhcGFjaXR5IG9mIMAQIHdoZW4gaW5zZXJ0aW5nIMAAB3N0cmluZyDAAChCYWQgY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZSwgZXhwZWN0ZWQgwAARdW5rbm93biB2YXJpYW50IGDADGAsIGV4cGVjdGVkIMAAD2ludmFsaWQgbGVuZ3RoIMALLCBleHBlY3RlZCDAAA9pbnZhbGlkIHZhbHVlOiDACywgZXhwZWN0ZWQgwAAOaW52YWxpZCB0eXBlOiDACywgZXhwZWN0ZWQgwAASVW5leHBlY3RlZCB0b2tlbiBgwAxgLiBFeHBlY3RlZCDAACJzcGFyc2Ugc2V0IGNhcGFjaXR5IGNhbm5vdCBleGNjZWQgwAABW8ACXSDAAAxjYXB0dXJlKHBpZD3ACCwgZ3JvdXA9wAcsIHNsb3Q9wAUpID0+IMAAwAEtwAQgPT4gwAAQbWFwLnN0YXJ0X3BvcyA9IMAWOyB0b3RhbF9leHRyYV9ieXRlcyA9IMAJOyBicG9zID0gwAAdaW52YWxpZCByYW5nZSBtYXBwaW5nIGluZGV4OiDAAFNpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBgdG9rZW5fdmFsdWVgIHNob3VsZCBiZSBhIHdvcmQsIGJ1dCBnb3Q6IMAAL3RyaWVkIHRvIHVud3JhcCBieXRlIGNsYXNzIGZyb20gSGlyRnJhbWUsIGdvdDogwAAydHJpZWQgdG8gdW53cmFwIFVuaWNvZGUgY2xhc3MgZnJvbSBIaXJGcmFtZSwgZ290OiDAACl0cmllZCB0byB1bndyYXAgZXhwciBmcm9tIEhpckZyYW1lLCBnb3Q6IMAAKnRyaWVkIHRvIHVud3JhcCBncm91cCBmcm9tIEhpckZyYW1lLCBnb3Q6IMAAL3RyaWVkIHRvIHVud3JhcCByZXBldGl0aW9uIGZyb20gSGlyRnJhbWUsIGdvdDogwAAtdHJpZWQgdG8gdW53cmFwIGFsdCBwaXBlIGZyb20gSGlyRnJhbWUsIGdvdDogwAAQYXNzZXJ0aW9uIGBsZWZ0IMAXIHJpZ2h0YCBmYWlsZWQKICBsZWZ0OiDACQogcmlnaHQ6IMAAEGFzc2VydGlvbiBgbGVmdCDAECByaWdodGAgZmFpbGVkOiDACQogIGxlZnQ6IMAJCiByaWdodDogwAA/aW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogaW52YWxpZCBzeW50YXg6IFBhdDogwAAGcmFuZ2UgwBAgb3V0IG9mIGJvdW5kczogwAAHZXJyb3I6IMAAGmludmFsaWQgYmFzZTY0IGNoYXJhY3RlcjogwAAmY2Fubm90IGZsYXR0ZW4gdGhlIGluZGV4ZWQgc291cmNlbWFwOiDAAApiYWQganNvbjogwABIY2Fubm90IGFjY2VzcyBhIFRocmVhZCBMb2NhbCBTdG9yYWdlIHZhbHVlIGR1cmluZyBvciBhZnRlciBkZXN0cnVjdGlvbjogwABRaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZm91bmQgaW1wb3NzaWJsZSBlcnJvciBpbiBtZXRhIGVuZ2luZTogwAAGaW5kZXggwA8gb3V0IG9mIHJhbmdlOiDAACppbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiDAAC1VbmV4cGVjdGVkIGVzY2FwZSBzZXF1ZW5jZSBpbiByZXNlcnZlZCB3b3JkOiDAABFpbnZhbGlkICd0bycgaWQ6IMAAE2ludmFsaWQgJ2Zyb20nIGlkOiDAAClub3QgeWV0IGltcGxlbWVudGVkOiBqc29uIHN1YmRpYWdub3N0aWM6IMAAwAI6IMAAwMDAASDAAAIgIMABIMAAA1x1e8ABfQAJRXhwZWN0ZWQgwAYgZGlnaXQAASfATScgbW9kaWZpZXIgY2FuIG9ubHkgYXBwZWFyIG9uIGEgdHlwZSBwYXJhbWV0ZXIgb2YgYSBmdW5jdGlvbiwgbWV0aG9kIG9yIGNsYXNzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL2VtcHR5LnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL21hcC9lbnRyeS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbWV0YS9zdHJhdGVneS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9wcmVmaWx0ZXIvdGVkZHkucnMAL3J1c3QvZGVwcy9ydXN0Yy1kZW1hbmdsZS0wLjEuMjcvc3JjL2xlZ2FjeS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9tZW1jaHItMi43LjYvc3JjL2FyY2gvYWxsL3R3b3dheS5ycwBjcmF0ZXMvc3djX2VjbWFfcGFyc2VyL3NyYy9wYXJzZXIvanN4LnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9oeWJyaWQvcmVnZXgucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9pbmRleC5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2FsbG9jL3NyYy9ib3Jyb3cucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9jb3JlL3NyYy9udW0vaW1wL2ZsdDJkZWMvc3RyYXRlZ3kvZ3Jpc3UucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd3l6LTAuNS4xL3NyYy9jb211LnJzAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL3BhcnNlci9pbnB1dC5ycwBjcmF0ZXMvc3djX2NvbW1vbi9zcmMvaW5wdXQucnMAY3JhdGVzL3N3Y19lY21hX2FzdC9zcmMvbGlzdC5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL3NvcnQvc2hhcmVkL3NtYWxsc29ydC5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL3NvcnQvdW5zdGFibGUvcXVpY2tzb3J0LnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvY29yZS9zcmMvc2xpY2Uvc29ydC9zdGFibGUvcXVpY2tzb3J0LnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvY29udmVydC5ycwBjcmF0ZXMvc3djX2VjbWFfcGFyc2VyL3NyYy9wYXJzZXIvdHlwZXNjcmlwdC5ycwBjcmF0ZXMvc3djX2VjbWFfdHJhbnNmb3Jtc190eXBlc2NyaXB0L3NyYy90eXBlc2NyaXB0LnJzAGNyYXRlcy9zd2NfZWNtYV9jb2RlZ2VuL3NyYy90eXBlc2NyaXB0LnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3BhcmtpbmdfbG90X2NvcmUtMC45LjEwL3NyYy9wYXJraW5nX2xvdC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50LnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvc3RkL3NyYy90aHJlYWQvY3VycmVudC5ycwBjcmF0ZXMvc3djX2VjbWFfcGFyc2VyL3NyYy9wYXJzZXIvaWRlbnQucnMAY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvcGFyc2VyL3N0bXQucnMAY3JhdGVzL3N3Y19lY21hX2NvZGVnZW4vc3JjL3N0bXQucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9hbGxvYy9zcmMvZm10LnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2FueWhvdy0xLjAuMTAwL3NyYy9mbXQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvdXVpZC0xLjE2LjAvc3JjL2ZtdC5ycwBjcmF0ZXMvc3djX2VjbWFfY29kZWdlbi9zcmMvbGl0LnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvc2hpZnQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlnaW50L3NoaWZ0LnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3ByZWZpbHRlci9ieXRlc2V0LnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3NwYXJzZV9zZXQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvYWxwaGFiZXQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy91dGlsL2FscGhhYmV0LnJzAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL3BhcnNlci9vYmplY3QucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL21ldGEvc3RvcGF0LnJzAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL3BhcnNlci9wYXQucnMAY3JhdGVzL3N3Y19lY21hX2FzdC9zcmMvcGF0LnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvY29yZS9zcmMvbnVtL2ltcC9kaXlfZmxvYXQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9uZmEvbm9uY29udGlndW91cy5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL25mYS9jb250aWd1b3VzLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1pbnRlZ2VyLTAuMS40Ni9zcmMvcm9vdHMucnMAY3JhdGVzL3N3Y19jb21tb24vc3JjL2NvbW1lbnRzLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2NvbXBhY3Rfc3RyLTAuNy4xL3NyYy90cmFpdHMucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL2RmYS9vbmVwYXNzLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9tZXRhL3dyYXBwZXJzLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvY29yZS9zcmMvZm10L2J1aWxkZXJzLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LTEuMTAuNi9zcmMvYnVpbGRlcnMucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc21hcnRzdHJpbmctMS4wLjEvc3JjL29wcy5ycwBjcmF0ZXMvc3djX2NvbW1vbi9zcmMvc3ludGF4X3Bvcy5ycwBjcmF0ZXMvc3djX2VjbWFfY29kZWdlbi9zcmMvbW9kdWxlX2RlY2xzLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3ByaW1pdGl2ZXMucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy91dGlsL3ByaW1pdGl2ZXMucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYnl0ZXMtMS4xMS4xL3NyYy9ieXRlcy5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9jYXB0dXJlcy5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi91bmljb2RlLXdpZHRoLTAuMi4yL3NyYy90YWJsZXMucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9jb3JlL3NyYy9jaGFyL21ldGhvZHMucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL211dGV4L25vX3RocmVhZHMucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9zdGQvc3JjL3N5cy90aHJlYWRfbG9jYWwvbm9fdGhyZWFkcy5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L3N0ZC9zcmMvc3lzL3N5bmMvcndsb2NrL25vX3RocmVhZHMucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL29uY2Uvbm9fdGhyZWFkcy5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9ieXRlcy1zdHItMC4yLjUvc3JjL2J5dGVfc3RyLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvYWxsb2Mvc3JjL3N0ci5ycwBjcmF0ZXMvc3djX2VjbWFfcGFyc2VyL3NyYy9wYXJzZXIvZXhwci5ycwBjcmF0ZXMvc3djX2VjbWFfdXRpbHMvc3JjL2NvbnN0cnVjdG9yLnJzAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL2Vycm9yLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvZXJyb3IucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYW55aG93LTEuMC4xMDAvc3JjL2Vycm9yLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9tZXRhL2Vycm9yLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3ByZWZpbHRlci9tZW1jaHIucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9tZW1jaHIucnMAY3JhdGVzL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS9zcmMvZml4ZXIucnMAYmluZGluZ3MvYmluZGluZ190eXBlc2NyaXB0X3dhc20vc3JjL2Vycm9yX3JlcG9ydGVyLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2Foby1jb3Jhc2ljay0xLjEuMy9zcmMvdXRpbC9wcmVmaWx0ZXIucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvaXRlci5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL2l0ZXIucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc2VyZGVfanNvbi0xLjAuMTQwL3NyYy9zZXIucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy91dGlsL3JlbWFwcGVyLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9kZmEvcmVtYXBwZXIucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL21ldGEvcmV2ZXJzZV9pbm5lci5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbmZhL3Rob21wc29uL2NvbXBpbGVyLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL21lbWNoci0yLjcuNi9zcmMvbWVtbWVtL3NlYXJjaGVyLnJzAGNyYXRlcy9zd2Nfc291cmNlbWFwL3NyYy9lbmNvZGVyLnJzAGNyYXRlcy9zd2NfY29tbW9uL3NyYy9lcnJvcnMvZGlhZ25vc3RpY19idWlsZGVyLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9uZmEvdGhvbXBzb24vYnVpbGRlci5ycwBjcmF0ZXMvc3djX3NvdXJjZW1hcC9zcmMvYnVpbGRlci5ycwBjcmF0ZXMvc3djX2VjbWFfcGFyc2VyL3NyYy9sZXhlci9udW1iZXIucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9jb3JlL3NyYy9udW0vaW1wL2RlYzJmbHQvZGVjaW1hbF9zZXEucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9wYWNrZWQvcmFiaW5rYXJwLnJzAGNyYXRlcy9zd2NfY29tbW9uL3NyYy9zb3VyY2VfbWFwLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9uZmEvdGhvbXBzb24vbWFwLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2NvbXBhY3Rfc3RyLTAuNy4xL3NyYy9yZXByL2hlYXAucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9jb3JlL3NyYy9zdHIvcGF0dGVybi5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3BhY2tlZC9wYXR0ZXJuLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTAwL3NyYy9jYWNoZS9pbnRlcm4ucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9hdXRvbWF0b24ucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9hZGRpdGlvbi5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL29wcy9mdW5jdGlvbi5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L3N1YnRyYWN0aW9uLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvbXVsdGlwbGljYXRpb24ucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9kaXZpc2lvbi5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL251bS9pbXAvZmx0MmRlYy9zdHJhdGVneS9kcmFnb24ucnMAY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvcGFyc2VyL2NsYXNzX2FuZF9mbi5ycwBjcmF0ZXMvc3djX2VjbWFfcGFyc2VyL3NyYy9sZXhlci90b2tlbi5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbmZhL3Rob21wc29uL3Bpa2V2bS5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL251bS9pbXAvYmlnbnVtLnJzAGNyYXRlcy9zd2NfZWNtYV90cmFuc2Zvcm1zX3R5cGVzY3JpcHQvc3JjL3RzX2VudW0ucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcGFya2luZ19sb3RfY29yZS0wLjkuMTAvc3JjL3RocmVhZF9wYXJrZXIvd2FzbS5ycwBjcmF0ZXMvc3djX2VjbWFfdHJhbnNmb3Jtc190eXBlc2NyaXB0L3NyYy90cmFuc2Zvcm0ucnMAY3JhdGVzL2hzdHIvc3JjL3d0ZjhfYXRvbS5ycwBjcmF0ZXMvc3djX2VjbWFfcGFyc2VyL3NyYy9wYXJzZXIvbW9kdWxlX2l0ZW0ucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvcHJlZmlsdGVyL21lbW1lbS5ycwBjcmF0ZXMvc3djX2VjbWFfY29kZWdlbi9zcmMvdGV4dF93cml0ZXIvYmFzaWNfaW1wbC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9wb29sLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvaGlyL2ludGVydmFsLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvaGlyL2xpdGVyYWwucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL21ldGEvbGl0ZXJhbC5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L3N0ZC9zcmMvdGhyZWFkL2xvY2FsLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL2xvb2sucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9zdGQvc3JjL3N5bmMvbGF6eV9sb2NrLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2Foby1jb3Jhc2ljay0xLjEuMy9zcmMvYWhvY29yYXNpY2sucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL25mYS90aG9tcHNvbi9iYWNrdHJhY2sucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYml0dmVjLTEuMC4xL3NyYy9zbGljZS9hcGkucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9wYWNrZWQvYXBpLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvc3RkL3NyYy9wYXRoLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3NlYXJjaC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvc2VhcmNoLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9oeWJyaWQvc2VhcmNoLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2Foby1jb3Jhc2ljay0xLjEuMy9zcmMvdXRpbC9kZWJ1Zy5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1zeW50YXgtMC44LjQvc3JjL2RlYnVnLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tZnV0dXJlcy0wLjQuNTAvc3JjL3F1ZXVlLnJzAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL2xleGVyL3N0YXRlLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL2RldGVybWluaXplL3N0YXRlLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvaGlyL3RyYW5zbGF0ZS5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2FsbG9jL3NyYy9jb2xsZWN0aW9ucy9idHJlZS9uYXZpZ2F0ZS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1zeW50YXgtMC44LjQvc3JjL2FzdC9wYXJzZS5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL251bS9pbXAvZGVjMmZsdC9wYXJzZS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9pbmRleG1hcC0yLjEyLjAvc3JjL21hcC9jb3JlLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3dpcmUucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvZXNjYXBlLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3NtYXJ0c3RyaW5nLTEuMC4xL3NyYy9pbmxpbmUucnMAY3JhdGVzL3N3Y19jb21tb24vc3JjL3N5bnRheF9wb3MvaHlnaWVuZS5ycwBjcmF0ZXMvc3djX2NvbW1vbi9zcmMvc3ludGF4X3Bvcy9hbmFseXplX3NvdXJjZV9maWxlLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvY29yZS9zcmMvdW5pY29kZS9wcmludGFibGUucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL25mYS90aG9tcHNvbi9saXRlcmFsX3RyaWUucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL25mYS90aG9tcHNvbi9yYW5nZV90cmllLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL25vZGUucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtc3ludGF4LTAuOC40L3NyYy91bmljb2RlLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvc3RkL3NyYy9zeW5jL29uY2UucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9hbGxvYy9zcmMvc2xpY2UucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYml0dmVjLTEuMC4xL3NyYy9zbGljZS5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L3N0ZC9zcmMvYmFja3RyYWNlLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL29uY2VfY2VsbC0xLjIxLjMvc3JjL2ltcF9zdGQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvaGFzaGJyb3duLTAuMTQuNS9zcmMvcmF3L21vZC5ycwAvcnVzdC9kZXBzL2hhc2hicm93bi0wLjE2LjEvc3JjL3Jhdy9tb2QucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvaGFzaGJyb3duLTAuMTYuMC9zcmMvcmF3L21vZC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1zeW50YXgtMC44LjQvc3JjL2FzdC9tb2QucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9jb3JlL3NyYy9mbXQvbW9kLnJzAGNyYXRlcy9zd2NfY29tbW9uL3NyYy9lcnJvcnMvbW9kLnJzAGNyYXRlcy9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2Uvc3JjL2hlbHBlcnMvbW9kLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvY29yZS9zcmMvYnN0ci9tb2QucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvY29tcGFjdF9zdHItMC43LjEvc3JjL3JlcHIvbW9kLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvaGlyL21vZC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9tZW1jaHItMi43LjYvc3JjL2FyY2gvYWxsL3BhY2tlZHBhaXIvbW9kLnJzAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL2xleGVyL21vZC5ycwBjcmF0ZXMvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlL3NyYy9yZXNvbHZlci9tb2QucnMAY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvcGFyc2VyL21vZC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9tZW1jaHItMi43LjYvc3JjL2FyY2gvYWxsL21vZC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9kZXRlcm1pbml6ZS9tb2QucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9zdGQvc3JjLy4uLy4uL2JhY2t0cmFjZS9zcmMvc3ltYm9saXplL21vZC5ycwBjcmF0ZXMvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlL3NyYy9yZW5hbWUvbW9kLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3NlcmRlX2NvcmUtMS4wLjIyOC9zcmMvZGUvbW9kLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvY29yZS9zcmMvc2xpY2UvbW9kLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvYWxsb2Mvc3JjL3ZlYy9tb2QucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9jb3JlL3NyYy9udW0vaW1wL2ZsdDJkZWMvbW9kLnJzAGNyYXRlcy9oc3RyL3NyYy93dGY4L21vZC5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L3N0ZC9zcmMvdGhyZWFkL2lkLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3NtYXJ0c3RyaW5nLTEuMC4xL3NyYy9ib3hlZC5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2FsbG9jL3NyYy92ZWMvc3BlY19mcm9tX2l0ZXJfbmVzdGVkLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9tZXRhL2xpbWl0ZWQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLWZ1dHVyZXMtMC40LjUwL3NyYy90YXNrL3NpbmdsZXRocmVhZC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi90cmlvbXBoZS0wLjEuMTQvc3JjL2FyYy5ycwAvcnVzdC9kZXBzL2RsbWFsbG9jLTAuMi4xMS9zcmMvZGxtYWxsb2MucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9hbGxvYy9zcmMvc3luYy5ycwBjcmF0ZXMvc3djX2VjbWFfdHJhbnNmb3Jtc190eXBlc2NyaXB0L3NyYy9zZW1hbnRpYy5ycwBjcmF0ZXMvaHN0ci9zcmMvZHluYW1pYy5ycwBjcmF0ZXMvc3djX2VjbWFfdXRpbHMvc3JjL2xpYi5ycwBjcmF0ZXMvaHN0ci9zcmMvbGliLnJzAGNyYXRlcy9zd2NfdHNfZmFzdF9zdHJpcC9zcmMvbGliLnJzAGNyYXRlcy9zd2NfZWNtYV9jb2RlZ2VuL3NyYy9saWIucnMAYmluZGluZ3MvYmluZGluZ190eXBlc2NyaXB0X3dhc20vc3JjL2xpYi5ycwAvcnVzdC9kZXBzL3J1c3RjLWRlbWFuZ2xlLTAuMS4yNy9zcmMvbGliLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3NlcmRlLXdhc20tYmluZGdlbi0wLjYuNS9zcmMvbGliLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL29uY2VfY2VsbC0xLjIxLjMvc3JjL2xpYi5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9waGZfc2hhcmVkLTAuMTEuMy9zcmMvbGliLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2NvbXBhY3Rfc3RyLTAuNy4xL3NyYy9saWIucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcnVzdGMtaGFzaC0yLjEuMS9zcmMvbGliLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3Njb3BlZC10bHMtMS4wLjEvc3JjL2xpYi5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tZnV0dXJlcy0wLjQuNTAvc3JjL2xpYi5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbmZhL3Rob21wc29uL25mYS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvaHlicmlkL2RmYS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL2RmYS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC91dGY4LnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvdXRmOC5ycwAvcnVzdC9kZXBzL3J1c3RjLWRlbWFuZ2xlLTAuMS4yNy9zcmMvdjAucnMAHXVuZXhwZWN0ZWQgcmVnZXggZmluZCBlcnJvcjogwDUKdG8gaGFuZGxlIGZpbmQgZXJyb3JzLCB1c2UgJ3RyeScgb3IgJ3NlYXJjaCcgbWV0aG9kcwABJ8BSJyBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlciBvZiBhIGNsYXNzLCBpbnRlcmZhY2Ugb3IgdHlwZSBhbGlhcwABJ8AsJyBtb2RpZmllciBjYW5ub3QgYXBwZWFyIG9uIGEgdHlwZSBwYXJhbWV0ZXIAASfAMycgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgd2l0aCBhIHByaXZhdGUgaWRlbnRpZmllcgABJ8A1JyBtb2RpZmllciBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24AE2hheXN0YWNrIG9mIGxlbmd0aCDADCBpcyB0b28gbG9uZwABYMAmYCBjYW5ub3QgYmUgdXNlZCB3aXRob3V0IGBmcm9tYCBjbGF1c2UAAWDAMGAgY2Fubm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZQA5aW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogc3RyOjpmcm9tX3V0ZjgowAQpID0gwCIgd2FzIGV4cGVjdGVkIHRvIGhhdmUgMSBjaGFyLCBidXQgwBEgY2hhcnMgd2VyZSBmb3VuZAAGTGFiZWwgwBQgaXMgYWxyZWFkeSBkZWNsYXJlZAAqYW5jaG9yZWQgc2VhcmNoZXMgZm9yIGEgc3BlY2lmaWMgcGF0dGVybiAowB4pIGFyZSBub3Qgc3VwcG9ydGVkIG9yIGVuYWJsZWQAEGZsb2F0aW5nIHBvaW50IGDAAWAAAWDABmAgb3IgYMABYAALY2hhcmFjdGVyIGDAAWAACWludGVnZXIgYMABYAAJYm9vbGVhbiBgwAFgABFkdXBsaWNhdGUgZmllbGQgYMABYAABYMABYABcAMAFID0+IFsAUkEgc3RyaW5nIGxpdGVyYWwgY2Fubm90IGJlIHVzZWQgYXMgYW4gaW1wb3J0ZWQgYmluZGluZy4KLSBEaWQgeW91IG1lYW4gYGltcG9ydCB7ICLADCIgYXMgZm9vIH1gPwAfVW5leHBlY3RlZCB0b2tlbi4gRGlkIHlvdSBtZWFuIMABPwABPMAIIG1hY3Jvcz4ALEV4cGVjdGVkIGNvcnJlc3BvbmRpbmcgSlNYIGNsb3NpbmcgdGFnIGZvciA8wAE+AAE8wAE+AAEmwAE7AMAJOiBicG9zID0gwA07IGxpbmVicG9zID0gwAE7AA1CaXRTcGFuRXJyb3I8wAM+OjoABGdvdCDAGiBzZWdtZW50cywgZXhwZWN0ZWQgNCBvciA1AAEnwCAnIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggJ8ALJyBtb2RpZmllci4AASfAGScgbW9kaWZpZXIgbXVzdCBwcmVjZWRlICfACycgbW9kaWZpZXIuAAEnwBgnIG1vZGlmaWVyIGFscmVhZHkgc2Vlbi4AJER1cGxpY2F0ZWQgcmVndWxhciBleHByZXNzaW9uIGZsYWcgJ8ACJy4AEXN0YXJ0IGJ5dGUgaW5kZXggwCYgaXMgbm90IGEgY2hhciBib3VuZGFyeTsgaXQgaXMgaW5zaWRlIMAIIChieXRlcyDACyBvZiBzdHJpbmcpAA9lbmQgYnl0ZSBpbmRleCDAJiBpcyBub3QgYSBjaGFyIGJvdW5kYXJ5OyBpdCBpcyBpbnNpZGUgwAggKGJ5dGVzIMALIG9mIHN0cmluZykAQGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGludmFsaWQgcGF0dGVybjogRXhwcijAASkABnVuaW9uKMABKQAISnNWYWx1ZSjAASkAB3NwYXJzZSjAASkABk1BVENIKMABKQA6ZXhjZWVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgcGFyZW50aGVzZXMvYnJhY2tldHMgKMABKQAxZXhjZWVkZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNhcHR1cmluZyBncm91cHMgKMABKQAmY29weV9mcm9tX3NsaWNlOiBzb3VyY2Ugc2xpY2UgbGVuZ3RoICjAKykgZG9lcyBub3QgbWF0Y2ggZGVzdGluYXRpb24gc2xpY2UgbGVuZ3RoICjAASkAAiAowAEpABVgYXRgIHNwbGl0IGluZGV4IChpcyDAFykgc2hvdWxkIGJlIDw9IGxlbiAoaXMgwAEpABRpbnNlcnRpb24gaW5kZXggKGlzIMAXKSBzaG91bGQgYmUgPD0gbGVuIChpcyDAASkAEnJlbW92YWwgaW5kZXggKGlzIMAWKSBzaG91bGQgYmUgPCBsZW4gKGlzIMABKQDACyAob3MgZXJyb3IgwAEpAAhvbiBsaW5lIMAJIChjb2x1bW4gwA8pIHRocm91Z2ggbGluZSDACSAoY29sdW1uIMABKQAGRXJyb3IowAgsIGxpbmU6IMAKLCBjb2x1bW46IMABKQANYmluYXJ5LXVuaW9uKMACLCDAASkAI2V4cGVjdGVkIHZhbGlkIFBlcmwgY2xhc3MgYnV0IGdvdCAnwAEnAApFeHBlY3RlZCAnwAgnLCBnb3QgJ8ABJwA8VHlwZXNjcmlwdCBub24tbnVsbCBhc3NlcnRpb24gb3BlcmF0b3IgaXMgbm90IGFsbG93ZWQgd2l0aCAnwAEnAAEi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AwgEAQgFBwkBAAEFBgIFAQEJAgAJAggJBQUABwgBAgUFCQYABAYEBAcHBQMJAAYCBQIJCAACAwICAwgHBgkFAwECBQEECQABAQYBAQkDCAQHBgUGAgUHBAUABQgABQkGCQIDCAIIAQIFAwcCBQIJAAIJCAQGAQkBBAAGAgUBCAYCBgQFAQQJAgMACQUHAAMBAgUJAwEDAgIFBwQGAQUEBwgFAQUGAgUEBgUGBgECCAcDAAcHAwkCBQcIAQIFAgMCCAMABgQDBgUDCAYJBgIICQAGAgUBAQYEAQUDAgEIAgYJAwQIAQQEBQMBAgUFCAIABwYGAAkBAwQGBwQABwICBgUGAgUCCQEAAwgDAAQFBgcDAwcAAwYBAwIIAQIFAQQFBQEJAQUCAggDBgYIBQEIAAYGBAAGAgUHAgcFCQUHBgEEAQgDBAIFCQADAwIAAwECBQMGAwcJBwgIAAcACQEHAQIJBQEGBgABBQYCBQEIAQgJCAkEAAMFBAUIBQYEBwUIAwAABwgBAgUJAAkECQQHAAEHBwIJAggCAwcJAQUAAwkABgIFBAUEBwQHAwUACAgGBAYEAQEICQUHBQEJBQMBAgUCAgcDBwMGBwUEBAMCAwIABQkEBwgHBQkHBgUGAgUBAQMGCAYIAwcHAgEGAQYAAgkHAwkDBwkICAIIAQIFBQYIBAMEAQgIBgAIAAgAAQQIBgkGCAkJBAEEAAYCBQIIBAIBBwAJBAMABAAEAAAHBAMECAQECQcABwADAQIFAQQCAQAIBQQHAQUCAAIAAAMHAQcEAgIECAUDBQEFBgIFBwEABQQCBwMFBwYAAQAAAQgFCAcBAQIEAgYHBQcIAQIFAwUFAgcBAwYHCAgAAAUAAAkCCQMFBQYCAQMDBwgJAAYCBQEHBwYDBQYIAwkEAAACBQAEBgQGBwcIAQAGBggJBAUDAQIFCAgIAQcIBAEJBwAAAQIFAgMCAwMICQAFAwMEBAcCBgUGAgUEBAQACAkCAAkIBQAABgIGAQYBBgkEBQIGBgcCAwYDAggBAgUCAgIABAQGAAQJAgUAAwEDAAgACAQHAgYDAwMGAQgBBgQABgIFAQEBAAICAwACBAYCBQEFBgUEAAQCAwYDAQYGCAAJAAgCAAMBAgUFBQUBAQEFAQIDAQIFBwgCBwACAQEIAQUIAwQABAUEAQABBQYCBQIHBwUFBQcF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AADEQCAAZAAAAKEAAAA2AAAAxEAgAGQAAACbAAAACQAAADQwNDE0MjQzNDQ0NTQ2NDc0OTEwMDEwMTEwMjEwMzEwNDEwNTEwNjEwNzMwMzEzMjMzMzQzNTM2MzczOTkwOTE5MjkzOTQ5NTk2OTc0ODsyOzI0MDsyNDg7MjU1NDg7MjsyNTA7MjM1OzIxNTQ4OzI7MDAwOzI1NTsyNTU0ODsyOzEyNzsyNTU7MjEyNDg7MjsyNDA7MjU1OzI1NTQ4OzI7MjQ1OzI0NTsyMjA0ODsyOzI1NTsyMjg7MTk2NDg7MjswMDA7MDAwOzAwMDQ4OzI7MjU1OzIzNTsyMDU0ODsyOzAwMDswMDA7MjU1NDg7MjsxMzg7MDQzOzIyNjQ4OzI7MTY1OzA0MjswNDI0ODsyOzIyMjsxODQ7MTM1NDg7MjswOTU7MTU4OzE2MDQ4OzI7MTI3OzI1NTswMDA0ODsyOzIxMDsxMDU7MDMwNDg7MjsyNTU7MTI3OzA4MDQ4OzI7MTAwOzE0OTsyMzc0ODsyOzI1NTsyNDg7MjIwNDg7MjsyMjA7MDIwOzA2MDQ4OzI7MDAwOzAwMDsxMzk0ODsyOzAwMDsxMzk7MTM5NDg7MjsxODQ7MTM0OzAxMTQ4OzI7MTY5OzE2OTsxNjk0ODsyOzAwMDsxMDA7MDAwNDg7MjsxODk7MTgzOzEwNzQ4OzI7MTM5OzAwMDsxMzk0ODsyOzA4NTsxMDc7MDQ3NDg7MjsyNTU7MTQwOzAwMDQ4OzI7MTUzOzA1MDsyMDQ0ODsyOzEzOTswMDA7MDAwNDg7MjsyMzM7MTUwOzEyMjQ4OzI7MTQzOzE4ODsxNDM0ODsyOzA3MjswNjE7MTM5NDg7MjswNDc7MDc5OzA3OTQ4OzI7MDAwOzIwNjsyMDk0ODsyOzE0ODswMDA7MjExNDg7MjsyNTU7MDIwOzE0NzQ4OzI7MDAwOzE5MTsyNTU0ODsyOzEwNTsxMDU7MTA1NDg7MjswMzA7MTQ0OzI1NTQ4OzI7MTc4OzAzNDswMzQ0ODsyOzI1NTsyNTA7MjQwNDg7MjswMzQ7MTM5OzAzNDQ4OzI7MjU1OzAwMDsyNTU0ODsyOzIyMDsyMjA7MjIwNDg7MjsyNDg7MjQ4OzI1NTQ4OzI7MjU1OzIxNTswMDA0ODsyOzIxODsxNjU7MDMyNDg7MjsxMjg7MTI4OzEyODQ4OzI7MDAwOzEyODswMDA0ODsyOzE3MzsyNTU7MDQ3NDg7MjsyNDA7MjU1OzI0MDQ4OzI7MjU1OzEwNTsxODA0ODsyOzIwNTswOTI7MDkyNDg7MjswNzU7MDAwOzEzMDQ4OzI7MjU1OzI1NTsyNDA0ODsyOzI0MDsyMzA7MTQwNDg7MjsyMzA7MjMwOzI1MDQ4OzI7MjU1OzI0MDsyNDU0ODsyOzEyNDsyNTI7MDAwNDg7MjsyNTU7MjUwOzIwNTQ4OzI7MTczOzIxNjsyMzA0ODsyOzI0MDsxMjg7MTI4NDg7MjsyMjQ7MjU1OzI1NTQ4OzI7MjUwOzI1MDsyMTA0ODsyOzIxMTsyMTE7MjExNDg7MjsxNDQ7MjM4OzE0NDQ4OzI7MjU1OzE4MjsxOTM0ODsyOzI1NTsxNjA7MTIyNDg7MjswMzI7MTc4OzE3MDQ4OzI7MTM1OzIwNjsyNTA0ODsyOzExOTsxMzY7MTUzNDg7MjsxNzY7MTk2OzIyMjQ4OzI7MjU1OzI1NTsyMjQ0ODsyOzAwMDsyNTU7MDAwNDg7MjswNTA7MjA1OzA1MDQ4OzI7MjUwOzI0MDsyMzA0ODsyOzEyODswMDA7MDAwNDg7MjsxMDI7MjA1OzE3MDQ4OzI7MDAwOzAwMDsyMDU0ODsyOzE4NjswODU7MjExNDg7MjsxNDc7MTEyOzIxOTQ4OzI7MDYwOzE3OTsxMTM0ODsyOzEyMzsxMDQ7MjM4NDg7MjswMDA7MjUwOzE1NDQ4OzI7MDcyOzIwOTsyMDQ0ODsyOzE5OTswMjE7MTMzNDg7MjswMjU7MDI1OzExMjQ4OzI7MjQ1OzI1NTsyNTA0ODsyOzI1NTsyMjg7MjI1NDg7MjsyNTU7MjI4OzE4MTQ4OzI7MjU1OzIyMjsxNzM0ODsyOzAwMDswMDA7MTI4NDg7MjsyNTM7MjQ1OzIzMDQ4OzI7MTI4OzEyODswMDA0ODsyOzEwNzsxNDI7MDM1NDg7MjsyNTU7MTY1OzAwMDQ4OzI7MjU1OzA2OTswMDA0ODsyOzIxODsxMTI7MjE0NDg7MjsyMzg7MjMyOzE3MDQ4OzI7MTUyOzI1MTsxNTI0ODsyOzE3NTsyMzg7MjM4NDg7MjsyMTk7MTEyOzE0NzQ4OzI7MjU1OzIzOTsyMTM0ODsyOzI1NTsyMTg7MTg1NDg7MjsyMDU7MTMzOzA2MzQ4OzI7MjU1OzE5MjsyMDM0ODsyOzIyMTsxNjA7MjIxNDg7MjsxNzY7MjI0OzIzMDQ4OzI7MTI4OzAwMDsxMjg0ODsyOzEwMjswNTE7MTUzNDg7MjsyNTU7MDAwOzAwMDQ4OzI7MTg4OzE0MzsxNDM0ODsyOzA2NTsxMDU7MjI1NDg7MjsxMzk7MDY5OzAxOTQ4OzI7MjUwOzEyODsxMTQ0ODsyOzI0NDsxNjQ7MDk2NDg7MjswNDY7MTM5OzA4NzQ4OzI7MjU1OzI0NTsyMzg0ODsyOzE2MDswODI7MDQ1NDg7MjsxOTI7MTkyOzE5MjQ4OzI7MTM1OzIwNjsyMzU0ODsyOzEwNjswOTA7MjA1NDg7MjsxMTI7MTI4OzE0NDQ4OzI7MjU1OzI1MDsyNTA0ODsyOzAwMDsyNTU7MTI3NDg7MjswNzA7MTMwOzE4MDQ4OzI7MjEwOzE4MDsxNDA0ODsyOzAwMDsxMjg7MTI4NDg7MjsyMTY7MTkxOzIxNjQ4OzI7MjU1OzA5OTswNzE0ODsyOzA2NDsyMjQ7MjA4NDg7MjsyMzg7MTMwOzIzODQ4OzI7MjQ1OzIyMjsxNzk0ODsyOzI1NTsyNTU7MjU1NDg7MjsyNDU7MjQ1OzI0NTQ4OzI7MjU1OzI1NTswMDA0ODsyOzE1NDsyMDU7MDUwMzg7MjsyNDA7MjQ4OzI1NTM4OzI7MjUwOzIzNTsyMTUzODsyOzAwMDsyNTU7MjU1Mzg7MjsxMjc7MjU1OzIxMjM4OzI7MjQwOzI1NTsyNTUzODsyOzI0NTsyNDU7MjIwMzg7MjsyNTU7MjI4OzE5NjM4OzI7MDAwOzAwMDswMDAzODsyOzI1NTsyMzU7MjA1Mzg7MjswMDA7MDAwOzI1NTM4OzI7MTM4OzA0MzsyMjYzODsyOzE2NTswNDI7MDQyMzg7MjsyMjI7MTg0OzEzNTM4OzI7MDk1OzE1ODsxNjAzODsyOzEyNzsyNTU7MDAwMzg7MjsyMTA7MTA1OzAzMDM4OzI7MjU1OzEyNzswODAzODsyOzEwMDsxNDk7MjM3Mzg7MjsyNTU7MjQ4OzIyMDM4OzI7MjIwOzAyMDswNjAzODsyOzAwMDswMDA7MTM5Mzg7MjswMDA7MTM5OzEzOTM4OzI7MTg0OzEzNDswMTEzODsyOzE2OTsxNjk7MTY5Mzg7MjswMDA7MTAwOzAwMDM4OzI7MTg5OzE4MzsxMDczODsyOzEzOTswMDA7MTM5Mzg7MjswODU7MTA3OzA0NzM4OzI7MjU1OzE0MDswMDAzODsyOzE1MzswNTA7MjA0Mzg7MjsxMzk7MDAwOzAwMDM4OzI7MjMzOzE1MDsxMjIzODsyOzE0MzsxODg7MTQzMzg7MjswNzI7MDYxOzEzOTM4OzI7MDQ3OzA3OTswNzkzODsyOzAwMDsyMDY7MjA5Mzg7MjsxNDg7MDAwOzIxMTM4OzI7MjU1OzAyMDsxNDczODsyOzAwMDsxOTE7MjU1Mzg7MjsxMDU7MTA1OzEwNTM4OzI7MDMwOzE0NDsyNTUzODsyOzE3ODswMzQ7MDM0Mzg7MjsyNTU7MjUwOzI0MDM4OzI7MDM0OzEzOTswMzQzODsyOzI1NTswMDA7MjU1Mzg7MjsyMjA7MjIwOzIyMDM4OzI7MjQ4OzI0ODsyNTUzODsyOzI1NTsyMTU7MDAwMzg7MjsyMTg7MTY1OzAzMjM4OzI7MTI4OzEyODsxMjgzODsyOzAwMDsxMjg7MDAwMzg7MjsxNzM7MjU1OzA0NzM4OzI7MjQwOzI1NTsyNDAzODsyOzI1NTsxMDU7MTgwMzg7MjsyMDU7MDkyOzA5MjM4OzI7MDc1OzAwMDsxMzAzODsyOzI1NTsyNTU7MjQwMzg7MjsyNDA7MjMwOzE0MDM4OzI7MjMwOzIzMDsyNTAzODsyOzI1NTsyNDA7MjQ1Mzg7MjsxMjQ7MjUyOzAwMDM4OzI7MjU1OzI1MDsyMDUzODsyOzE3MzsyMTY7MjMwMzg7MjsyNDA7MTI4OzEyODM4OzI7MjI0OzI1NTsyNTUzODsyOzI1MDsyNTA7MjEwMzg7MjsyMTE7MjExOzIxMTM4OzI7MTQ0OzIzODsxNDQzODsyOzI1NTsxODI7MTkzMzg7MjsyNTU7MTYwOzEyMjM4OzI7MDMyOzE3ODsxNzAzODsyOzEzNTsyMDY7MjUwMzg7MjsxMTk7MTM2OzE1MzM4OzI7MTc2OzE5NjsyMjIzODsyOzI1NTsyNTU7MjI0Mzg7MjswMDA7MjU1OzAwMDM4OzI7MDUwOzIwNTswNTAzODsyOzI1MDsyNDA7MjMwMzg7MjsxMjg7MDAwOzAwMDM4OzI7MTAyOzIwNTsxNzAzODsyOzAwMDswMDA7MjA1Mzg7MjsxODY7MDg1OzIxMTM4OzI7MTQ3OzExMjsyMTkzODsyOzA2MDsxNzk7MTEzMzg7MjsxMjM7MTA0OzIzODM4OzI7MDAwOzI1MDsxNTQzODsyOzA3MjsyMDk7MjA0Mzg7MjsxOTk7MDIxOzEzMzM4OzI7MDI1OzAyNTsxMTIzODsyOzI0NTsyNTU7MjUwMzg7MjsyNTU7MjI4OzIyNTM4OzI7MjU1OzIyODsxODEzODsyOzI1NTsyMjI7MTczMzg7MjswMDA7MDAwOzEyODM4OzI7MjUzOzI0NTsyMzAzODsyOzEyODsxMjg7MDAwMzg7MjsxMDc7MTQyOzAzNTM4OzI7MjU1OzE2NTswMDAzODsyOzI1NTswNjk7MDAwMzg7MjsyMTg7MTEyOzIxNDM4OzI7MjM4OzIzMjsxNzAzODsyOzE1MjsyNTE7MTUyMzg7MjsxNzU7MjM4OzIzODM4OzI7MjE5OzExMjsxNDczODsyOzI1NTsyMzk7MjEzMzg7MjsyNTU7MjE4OzE4NTM4OzI7MjA1OzEzMzswNjMzODsyOzI1NTsxOTI7MjAzMzg7MjsyMjE7MTYwOzIyMTM4OzI7MTc2OzIyNDsyMzAzODsyOzEyODswMDA7MTI4Mzg7MjsxMDI7MDUxOzE1MzM4OzI7MjU1OzAwMDswMDAzODsyOzE4ODsxNDM7MTQzMzg7MjswNjU7MTA1OzIyNTM4OzI7MTM5OzA2OTswMTkzODsyOzI1MDsxMjg7MTE0Mzg7MjsyNDQ7MTY0OzA5NjM4OzI7MDQ2OzEzOTswODczODsyOzI1NTsyNDU7MjM4Mzg7MjsxNjA7MDgyOzA0NTM4OzI7MTkyOzE5MjsxOTIzODsyOzEzNTsyMDY7MjM1Mzg7MjsxMDY7MDkwOzIwNTM4OzI7MTEyOzEyODsxNDQzODsyOzI1NTsyNTA7MjUwMzg7MjswMDA7MjU1OzEyNzM4OzI7MDcwOzEzMDsxODAzODsyOzIxMDsxODA7MTQwMzg7MjswMDA7MTI4OzEyODM4OzI7MjE2OzE5MTsyMTYzODsyOzI1NTswOTk7MDcxMzg7MjswNjQ7MjI0OzIwODM4OzI7MjM4OzEzMDsyMzgzODsyOzI0NTsyMjI7MTc5Mzg7MjsyNTU7MjU1OzI1NTM4OzI7MjQ1OzI0NTsyNDUzODsyOzI1NTsyNTU7MDAwMzg7MjsxNTQ7MjA1OzA1MDQ4OzU7MDQ4OzU7MTQ4OzU7MjQ4OzU7MzQ4OzU7NDQ4OzU7NTQ4OzU7NjQ4OzU7NzQ4OzU7ODQ4OzU7OTQ4OzU7MTA0ODs1OzExNDg7NTsxMjQ4OzU7MTM0ODs1OzE0NDg7NTsxNTQ4OzU7MTY0ODs1OzE3NDg7NTsxODQ4OzU7MTk0ODs1OzIwNDg7NTsyMTQ4OzU7MjI0ODs1OzIzNDg7NTsyNDQ4OzU7MjU0ODs1OzI2NDg7NTsyNzQ4OzU7Mjg0ODs1OzI5NDg7NTszMDQ4OzU7MzE0ODs1OzMyNDg7NTszMzQ4OzU7MzQ0ODs1OzM1NDg7NTszNjQ4OzU7Mzc0ODs1OzM4NDg7NTszOTQ4OzU7NDA0ODs1OzQxNDg7NTs0MjQ4OzU7NDM0ODs1OzQ0NDg7NTs0NTQ4OzU7NDY0ODs1OzQ3NDg7NTs0ODQ4OzU7NDk0ODs1OzUwNDg7NTs1MTQ4OzU7NTI0ODs1OzUzNDg7NTs1NDQ4OzU7NTU0ODs1OzU2NDg7NTs1NzQ4OzU7NTg0ODs1OzU5NDg7NTs2MDQ4OzU7NjE0ODs1OzYyNDg7NTs2MzQ4OzU7NjQ0ODs1OzY1NDg7NTs2NjQ4OzU7Njc0ODs1OzY4NDg7NTs2OTQ4OzU7NzA0ODs1OzcxNDg7NTs3MjQ4OzU7NzM0ODs1Ozc0NDg7NTs3NTQ4OzU7NzY0ODs1Ozc3NDg7NTs3ODQ4OzU7Nzk0ODs1OzgwNDg7NTs4MTQ4OzU7ODI0ODs1OzgzNDg7NTs4NDQ4OzU7ODU0ODs1Ozg2NDg7NTs4NzQ4OzU7ODg0ODs1Ozg5NDg7NTs5MDQ4OzU7OTE0ODs1OzkyNDg7NTs5MzQ4OzU7OTQ0ODs1Ozk1NDg7NTs5NjQ4OzU7OTc0ODs1Ozk4NDg7NTs5OTQ4OzU7MTAwNDg7NTsxMDE0ODs1OzEwMjQ4OzU7MTAzNDg7NTsxMDQ0ODs1OzEwNTQ4OzU7MTA2NDg7NTsxMDc0ODs1OzEwODQ4OzU7MTA5NDg7NTsxMTA0ODs1OzExMTQ4OzU7MTEyNDg7NTsxMTM0ODs1OzExNDQ4OzU7MTE1NDg7NTsxMTY0ODs1OzExNzQ4OzU7MTE4NDg7NTsxMTk0ODs1OzEyMDQ4OzU7MTIxNDg7NTsxMjI0ODs1OzEyMzQ4OzU7MTI0NDg7NTsxMjU0ODs1OzEyNjQ4OzU7MTI3NDg7NTsxMjg0ODs1OzEyOTQ4OzU7MTMwNDg7NTsxMzE0ODs1OzEzMjQ4OzU7MTMzNDg7NTsxMzQ0ODs1OzEzNTQ4OzU7MTM2NDg7NTsxMzc0ODs1OzEzODQ4OzU7MTM5NDg7NTsxNDA0ODs1OzE0MTQ4OzU7MTQyNDg7NTsxNDM0ODs1OzE0NDQ4OzU7MTQ1NDg7NTsxNDY0ODs1OzE0NzQ4OzU7MTQ4NDg7NTsxNDk0ODs1OzE1MDQ4OzU7MTUxNDg7NTsxNTI0ODs1OzE1MzQ4OzU7MTU0NDg7NTsxNTU0ODs1OzE1NjQ4OzU7MTU3NDg7NTsxNTg0ODs1OzE1OTQ4OzU7MTYwNDg7NTsxNjE0ODs1OzE2MjQ4OzU7MTYzNDg7NTsxNjQ0ODs1OzE2NTQ4OzU7MTY2NDg7NTsxNjc0ODs1OzE2ODQ4OzU7MTY5NDg7NTsxNzA0ODs1OzE3MTQ4OzU7MTcyNDg7NTsxNzM0ODs1OzE3NDQ4OzU7MTc1NDg7NTsxNzY0ODs1OzE3NzQ4OzU7MTc4NDg7NTsxNzk0ODs1OzE4MDQ4OzU7MTgxNDg7NTsxODI0ODs1OzE4MzQ4OzU7MTg0NDg7NTsxODU0ODs1OzE4NjQ4OzU7MTg3NDg7NTsxODg0ODs1OzE4OTQ4OzU7MTkwNDg7NTsxOTE0ODs1OzE5MjQ4OzU7MTkzNDg7NTsxOTQ0ODs1OzE5NTQ4OzU7MTk2NDg7NTsxOTc0ODs1OzE5ODQ4OzU7MTk5NDg7NTsyMDA0ODs1OzIwMTQ4OzU7MjAyNDg7NTsyMDM0ODs1OzIwNDQ4OzU7MjA1NDg7NTsyMDY0ODs1OzIwNzQ4OzU7MjA4NDg7NTsyMDk0ODs1OzIxMDQ4OzU7MjExNDg7NTsyMTI0ODs1OzIxMzQ4OzU7MjE0NDg7NTsyMTU0ODs1OzIxNjQ4OzU7MjE3NDg7NTsyMTg0ODs1OzIxOTQ4OzU7MjIwNDg7NTsyMjE0ODs1OzIyMjQ4OzU7MjIzNDg7NTsyMjQ0ODs1OzIyNTQ4OzU7MjI2NDg7NTsyMjc0ODs1OzIyODQ4OzU7MjI5NDg7NTsyMzA0ODs1OzIzMTQ4OzU7MjMyNDg7NTsyMzM0ODs1OzIzNDQ4OzU7MjM1NDg7NTsyMzY0ODs1OzIzNzQ4OzU7MjM4NDg7NTsyMzk0ODs1OzI0MDQ4OzU7MjQxNDg7NTsyNDI0ODs1OzI0MzQ4OzU7MjQ0NDg7NTsyNDU0ODs1OzI0NjQ4OzU7MjQ3NDg7NTsyNDg0ODs1OzI0OTQ4OzU7MjUwNDg7NTsyNTE0ODs1OzI1MjQ4OzU7MjUzNDg7NTsyNTQ0ODs1OzI1NTM4OzU7MDM4OzU7MTM4OzU7MjM4OzU7MzM4OzU7NDM4OzU7NTM4OzU7NjM4OzU7NzM4OzU7ODM4OzU7OTM4OzU7MTAzODs1OzExMzg7NTsxMjM4OzU7MTMzODs1OzE0Mzg7NTsxNTM4OzU7MTYzODs1OzE3Mzg7NTsxODM4OzU7MTkzODs1OzIwMzg7NTsyMTM4OzU7MjIzODs1OzIzMzg7NTsyNDM4OzU7MjUzODs1OzI2Mzg7NTsyNzM4OzU7MjgzODs1OzI5Mzg7NTszMDM4OzU7MzEzODs1OzMyMzg7NTszMzM4OzU7MzQzODs1OzM1Mzg7NTszNjM4OzU7MzczODs1OzM4Mzg7NTszOTM4OzU7NDAzODs1OzQxMzg7NTs0MjM4OzU7NDMzODs1OzQ0Mzg7NTs0NTM4OzU7NDYzODs1OzQ3Mzg7NTs0ODM4OzU7NDkzODs1OzUwMzg7NTs1MTM4OzU7NTIzODs1OzUzMzg7NTs1NDM4OzU7NTUzODs1OzU2Mzg7NTs1NzM4OzU7NTgzODs1OzU5Mzg7NTs2MDM4OzU7NjEzODs1OzYyMzg7NTs2MzM4OzU7NjQzODs1OzY1Mzg7NTs2NjM4OzU7NjczODs1OzY4Mzg7NTs2OTM4OzU7NzAzODs1OzcxMzg7NTs3MjM4OzU7NzMzODs1Ozc0Mzg7NTs3NTM4OzU7NzYzODs1Ozc3Mzg7NTs3ODM4OzU7NzkzODs1OzgwMzg7NTs4MTM4OzU7ODIzODs1OzgzMzg7NTs4NDM4OzU7ODUzODs1Ozg2Mzg7NTs4NzM4OzU7ODgzODs1Ozg5Mzg7NTs5MDM4OzU7OTEzODs1OzkyMzg7NTs5MzM4OzU7OTQzODs1Ozk1Mzg7NTs5NjM4OzU7OTczODs1Ozk4Mzg7NTs5OTM4OzU7MTAwMzg7NTsxMDEzODs1OzEwMjM4OzU7MTAzMzg7NTsxMDQzODs1OzEwNTM4OzU7MTA2Mzg7NTsxMDczODs1OzEwODM4OzU7MTA5Mzg7NTsxMTAzODs1OzExMTM4OzU7MTEyMzg7NTsxMTMzODs1OzExNDM4OzU7MTE1Mzg7NTsxMTYzODs1OzExNzM4OzU7MTE4Mzg7NTsxMTkzODs1OzEyMDM4OzU7MTIxMzg7NTsxMjIzODs1OzEyMzM4OzU7MTI0Mzg7NTsxMjUzODs1OzEyNjM4OzU7MTI3Mzg7NTsxMjgzODs1OzEyOTM4OzU7MTMwMzg7NTsxMzEzODs1OzEzMjM4OzU7MTMzMzg7NTsxMzQzODs1OzEzNTM4OzU7MTM2Mzg7NTsxMzczODs1OzEzODM4OzU7MTM5Mzg7NTsxNDAzODs1OzE0MTM4OzU7MTQyMzg7NTsxNDMzODs1OzE0NDM4OzU7MTQ1Mzg7NTsxNDYzODs1OzE0NzM4OzU7MTQ4Mzg7NTsxNDkzODs1OzE1MDM4OzU7MTUxMzg7NTsxNTIzODs1OzE1MzM4OzU7MTU0Mzg7NTsxNTUzODs1OzE1NjM4OzU7MTU3Mzg7NTsxNTgzODs1OzE1OTM4OzU7MTYwMzg7NTsxNjEzODs1OzE2MjM4OzU7MTYzMzg7NTsxNjQzODs1OzE2NTM4OzU7MTY2Mzg7NTsxNjczODs1OzE2ODM4OzU7MTY5Mzg7NTsxNzAzODs1OzE3MTM4OzU7MTcyMzg7NTsxNzMzODs1OzE3NDM4OzU7MTc1Mzg7NTsxNzYzODs1OzE3NzM4OzU7MTc4Mzg7NTsxNzkzODs1OzE4MDM4OzU7MTgxMzg7NTsxODIzODs1OzE4MzM4OzU7MTg0Mzg7NTsxODUzODs1OzE4NjM4OzU7MTg3Mzg7NTsxODgzODs1OzE4OTM4OzU7MTkwMzg7NTsxOTEzODs1OzE5MjM4OzU7MTkzMzg7NTsxOTQzODs1OzE5NTM4OzU7MTk2Mzg7NTsxOTczODs1OzE5ODM4OzU7MTk5Mzg7NTsyMDAzODs1OzIwMTM4OzU7MjAyMzg7NTsyMDMzODs1OzIwNDM4OzU7MjA1Mzg7NTsyMDYzODs1OzIwNzM4OzU7MjA4Mzg7NTsyMDkzODs1OzIxMDM4OzU7MjExMzg7NTsyMTIzODs1OzIxMzM4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cG93UGF0dGVybklEQWxsTGVmdG1vc3RGaXJzdE1hdGNoRXJyb3JQcm9wZXJ0aWVzAAAAAAAACAAAAAQAAADCBAAAAAAAAAQAAAAEAAAAwwQAAAAAAAABAAAAAQAAAEwAAABtaW5pbXVtX2xlbm1heGltdW1fbGVubG9va19zZXRsb29rX3NldF9wcmVmaXhsb29rX3NldF9zdWZmaXhsb29rX3NldF9wcmVmaXhfYW55bG9va19zZXRfc3VmZml4X2FueXV0ZjhleHBsaWNpdF9jYXB0dXJlc19sZW5zdGF0aWNfZXhwbGljaXRfY2FwdHVyZXNfbGVubGl0ZXJhbGFsdGVybmF0aW9uX2xpdGVyYWwAAADETCEACwAAAM9MIQALAAAA2kwhAAgAAADiTCEADwAAAPFMIQAPAAAAAE0hABMAAAATTSEAEwAAACZNIQAEAAAAKk0hABUAAAA/TSEAHAAAAFtNIQAHAAAAYk0hABMAAABQcm9wZXJ0aWVzSXRob21wc29uOjpORkEoCikKBlNUQVJUKMMgAABpBgADKTogwAEKAMDDIAAAaQYAAjogwAEKAEFob0NvcmFzaWNrYWNUZWRkeXNlYXJjaGVyYW5jaG9yZWRfYWMAANkiIAB2AAAAZAAAADYAAABNZW1tZW1maW5kZXJCeXRlU2V0UXVpdGJ5dGVHYXZlVXBIYXlzdGFja1Rvb0xvbmdsZW5VbnN1cHBvcnRlZEFuY2hvcmVkbW9kZVBhdHRlcm5JREVycm9yU3RhdGVJRHNob3VsZCBmaW5kIGEgbWF0Y2gAAAkMIABuAAAAWAMAABIAAABCeXRlQ2xhc3NlcyhCeXRlQ2xhc3Nlcyh7c2luZ2xldG9uc30pUHJlZmlsdGVycHJlaXNfZmFzdG1heF9uZWVkbGVfbGVuAADJPSAAegAAAMcBAAAqAAAAZGVuc2UoRkFJTAAA2SIgAHYAAACiAAAAPgAAANI7IABqAAAAeAMAAAwAAACHFiAAbgAAADYCAAA0AAAAVG9vTWFueVBhdHRlcm5zb25lcGFzczo6REZBKAogICogRCDDIAAAaQYAAExhenlTdGF0ZUlEVHJ5RnJvbUludEVycm9yTWVtY2hyaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogc3VmZml4IG1hdGNoIHBsdXMgcmV2ZXJzZSBtYXRjaCBpbXBsaWVzIHRoZXJlIG11c3QgYmUgYSBtYXRjaAAACQwgAG4AAACABQAAGQAAAAkMIABuAAAARQUAABkAAABmb3J3YXJkcmV2ZXJzZU1lbWNocjJOb25Xb3JkQnl0ZVdvcmRCeXRlVGV4dExpbmVMRkxpbmVDUkN1c3RvbUxpbmVUZXJtaW5hdG9yxAQAABAAAAAEAAAAtQAAAENvbmZpZ3Zpc2l0ZWRfY2FwYWNpdHkAAAAAAAAEAAAABAAAAFEAAABNZW1jaHIzUmV2ZXJzZUh5YnJpZEVuZ2luZVNtYWxsSW5kZXhFcnJvcmF0dGVtcHRlZFJldmVyc2VERkFSZXZlcnNlREZBRW5naW5lYml0c1N0YW5kYXJkTGVmdG1vc3RMb25nZXN0UGF0dGVyblNldEluc2VydEVycm9yY2FwYWNpdHlOb1llc1BhdHRlcm5FT0lhaG8tY29yYXNpY2sgREZBIHNob3VsZCBuZXZlciBmYWlsAAAAeAwgAHUAAABxAAAAEgAAANkiIAB2AAAAJwAAAC0AAAAJMSAAdgAAACsAAAAnAAAACTEgAHYAAAA7AAAAGAAAAJ4VIAB3AAAAIwAAABEAAABQcmVncm91cF9pbmZvAAAAxQQAAGAAAAAQAAAAxgQAAMcEAAAEAAAABAAAAIkAAAAAAAAAAAEAAAEAAADIBAAAAAAAAAABAAABAAAAnwAAAAAAAAAgAAAAEAAAAMkEAABjb25maWduZmFzdHJpZGUyc3RhcnRfbWFwY2xhc3Nlc3F1aXRzZXRjYWNoZV9jYXBhY2l0eQAAAChSIQAGAAAALlIhAAMAAAAxUiEABwAAADhSIQAJAAAAQVIhAAcAAABIUiEABwAAAE9SIQAOAAAAREZBAAAAAAABAAAAAQAAALkAAABtYXRjaF9raW5kTi9BAAAAygQAAAQAAAAEAAAAywQAAMwEAAAQAAAABAAAAM0EAADOBAAABAAAAAQAAADPBAAA0AQAABgAAAAEAAAA0QQAANIEAAAcAAAABAAAANMEAADUBAAAPAEAAAQAAADVBAAA1gQAACAFAAAQAAAA1wQAAAAAAAAEAAAABAAAANgEAABpbmZvbmZhcmV2cGlrZXZtYmFja3RyYWNrb25lcGFzc2h5YnJpZGRmYQAAADxTIQAEAAAAAk8hAAMAAAAuUiEAAwAAAEBTIQAGAAAARlMhAAYAAABMUyEACQAAAFVTIQAHAAAAXFMhAAYAAABiUyEAAwAAAENvcmVtIiAAawAAAO0AAAARAAAAUmV2ZXJzZUFuY2hvcmVkY29yZUltcGxpY2l0UmV2ZXJzZVN1ZmZpeEJvdW5kZWRCYWNrdHJhY2tlclJldmVyc2VJbm5lcnByZWlubmVyTGF6eVN0YXRlSURFcnJvckNhY2hlRXJyb3JJbnZhbGlkSW5wdXRBbmNob3JlZEludmFsaWRJbnB1dFVuYW5jaG9yZWRVbnN1cHBvcnRlZFN0cmVhbVVuc3VwcG9ydGVkT3ZlcmxhcHBpbmdVbnN1cHBvcnRlZEVtcHR5U1Bpa2VWTVBpa2VWTUVuZ2luZUdyb3VwSW5mbwAAAAAAAAABAAAAAQAAANkEAAAAAAAAMAAAABAAAADaBAAAAAAAAAgAAAAEAAAA2wQAAAAAAAAEAAAABAAAANwEAABzdGFydHNfZm9yX2VhY2hfcGF0dGVybmJ5dGVfY2xhc3Nlc3VuaWNvZGVfd29yZF9ib3VuZGFyeXNwZWNpYWxpemVfc3RhcnRfc3RhdGVzc2tpcF9jYWNoZV9jYXBhY2l0eV9jaGVja21pbmltdW1fY2FjaGVfY2xlYXJfY291bnRtaW5pbXVtX2J5dGVzX3Blcl9zdGF0ZaxSIQAKAAAAAk8hAAMAAADsVCEAFwAAAANVIQAMAAAAD1UhABUAAABIUiEABwAAACRVIQAXAAAAT1IhAA4AAAA7VSEAGQAAAFRVIQAZAAAAbVUhABcAAABTZWFyY2hlcnJhYmlua2FycHNlYXJjaF9raW5kR3JvdXBJbmZvSW5uZXJzbG90X3Jhbmdlc25hbWVfdG9faW5kZXhpbmRleF90b19uYW1lbWVtb3J5X2V4dHJhQm91bmRlZEJhY2t0cmFja2VyRW5naW5ldW5hbmNob3JlZCBzZWFyY2hlcyBhcmUgbm90IHN1cHBvcnRlZCBvciBlbmFibGVkYW5jaG9yZWQgc2VhcmNoZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb3IgZW5hYmxlZFJlZ2V4SW5mb0dyb3VwSW5mb0Vycm9yUmVnZXhJbmZvSXByb3BzX3VuaW9uT25lUGFzc09uZVBhc3NFbmdpbmVlcnJUb29NYW55R3JvdXBzcGF0dGVybm1pbmltdW1NaXNzaW5nR3JvdXBzRmlyc3RNdXN0QmVVbm5hbWVkRHVwbGljYXRlU21hbGxJbmRleEh5YnJpZEh5YnJpZEVuZ2luZQAAAAAAAQAAAAEAAADdBAAAdXRmOF9lbXB0eWF1dG9wcmV3aGljaF9jYXB0dXJlc25mYV9zaXplX2xpbWl0b25lcGFzc19zaXplX2xpbWl0aHlicmlkX2NhY2hlX2NhcGFjaXR5ZGZhX3NpemVfbGltaXRkZmFfc3RhdGVfbGltaXRsaW5lX3Rlcm1pbmF0b3KsUiEACgAAAGBXIQAKAAAAalchAAcAAAACTyEAAwAAAHFXIQAOAAAAf1chAA4AAACNVyEAEgAAAJ9XIQAVAAAAXFMhAAYAAABiUyEAAwAAALRXIQAOAAAAwlchAA8AAABVUyEABwAAAExTIQAJAAAAA1UhAAwAAADRVyEADwAAAERGQUVuZ2luZVJldmVyc2VIeWJyaWQAAAAAAAAEAAAABAAAAN4EAACqOiAAaAAAAOcBAAAgAAAA3EMgAGYAAAC/BAAALgAAANxDIABmAAAAwAQAACoAAAAZPyAAZgAAAEUCAAASAAAAYWdlQWdlYWhleEFTQ0lJX0hleF9EaWdpdEFscGhhYmV0aWNhbHBoYWJldGljYXNjaWloZXhkaWdpdGJjQmlkaV9DbGFzc2JpZGljQmlkaV9Db250cm9sYmlkaWNsYXNzYmlkaWNvbnRyb2xiaWRpbUJpZGlfTWlycm9yZWRiaWRpbWlycm9yZWRiaWRpbWlycm9yaW5nZ2x5cGhCaWRpX01pcnJvcmluZ19HbHlwaGJpZGlwYWlyZWRicmFja2V0QmlkaV9QYWlyZWRfQnJhY2tldGJpZGlwYWlyZWRicmFja2V0dHlwZUJpZGlfUGFpcmVkX0JyYWNrZXRfVHlwZWJsa2JtZ2JwYmJwdGNhbm9uaWNhbGNvbWJpbmluZ2NsYXNzQ2Fub25pY2FsX0NvbWJpbmluZ19DbGFzc2Nhc2VkQ2FzZWRjYXNlZm9sZGluZ0Nhc2VfRm9sZGluZ2Nhc2VpZ25vcmFibGVDYXNlX0lnbm9yYWJsZWNjY2NlQ29tcG9zaXRpb25fRXhjbHVzaW9uY2ZjaGFuZ2Vzd2hlbmNhc2Vmb2xkZWRDaGFuZ2VzX1doZW5fQ2FzZWZvbGRlZGNoYW5nZXN3aGVuY2FzZW1hcHBlZENoYW5nZXNfV2hlbl9DYXNlbWFwcGVkY2hhbmdlc3doZW5sb3dlcmNhc2VkQ2hhbmdlc19XaGVuX0xvd2VyY2FzZWRjaGFuZ2Vzd2hlbm5ma2NjYXNlZm9sZGVkQ2hhbmdlc19XaGVuX05GS0NfQ2FzZWZvbGRlZGNoYW5nZXN3aGVudGl0bGVjYXNlZENoYW5nZXNfV2hlbl9UaXRsZWNhc2VkY2hhbmdlc3doZW51cHBlcmNhc2VkQ2hhbmdlc19XaGVuX1VwcGVyY2FzZWRjaWNqa2FjY291bnRpbmdudW1lcmlja0FjY291bnRpbmdOdW1lcmljY2prY29tcGF0aWJpbGl0eXZhcmlhbnRrQ29tcGF0aWJpbGl0eVZhcmlhbnRjamtpaWNvcmVrSUlDb3JlY2praXJnZ3NvdXJjZWtJUkdfR1NvdXJjZWNqa2lyZ2hzb3VyY2VrSVJHX0hTb3VyY2Vjamtpcmdqc291cmNla0lSR19KU291cmNlY2praXJna3Bzb3VyY2VrSVJHX0tQU291cmNlY2praXJna3NvdXJjZWtJUkdfS1NvdXJjZWNqa2lyZ21zb3VyY2VrSVJHX01Tb3VyY2Vjamtpcmdzc291cmNla0lSR19TU291cmNlY2praXJndHNvdXJjZWtJUkdfVFNvdXJjZWNqa2lyZ3Vrc291cmNla0lSR19VS1NvdXJjZWNqa2lyZ3Vzb3VyY2VrSVJHX1VTb3VyY2Vjamtpcmd2c291cmNla0lSR19WU291cmNlY2prb3RoZXJudW1lcmlja090aGVyTnVtZXJpY2Nqa3ByaW1hcnludW1lcmlja1ByaW1hcnlOdW1lcmljY2prcnN1bmljb2Rla1JTVW5pY29kZWNvbXBleEZ1bGxfQ29tcG9zaXRpb25fRXhjbHVzaW9uY29tcG9zaXRpb25leGNsdXNpb25jd2NmY3djbWN3a2NmY3dsY3d0Y3d1ZGFzaERhc2hkZWNvbXBvc2l0aW9ubWFwcGluZ0RlY29tcG9zaXRpb25fTWFwcGluZ2RlY29tcG9zaXRpb250eXBlRGVjb21wb3NpdGlvbl9UeXBlZGVmYXVsdGlnbm9yYWJsZWNvZGVwb2ludERlZmF1bHRfSWdub3JhYmxlX0NvZGVfUG9pbnRkZXBEZXByZWNhdGVkZGVwcmVjYXRlZGRpZGlhRGlhY3JpdGljZGlhY3JpdGljZG1kdGVhRWFzdF9Bc2lhbl9XaWR0aGVhc3Rhc2lhbndpZHRoZWJhc2VFbW9qaV9Nb2RpZmllcl9CYXNlZWNvbXBFbW9qaV9Db21wb25lbnRlbW9kRW1vamlfTW9kaWZpZXJlbW9qaUVtb2ppZW1vamljb21wb25lbnRlbW9qaW1vZGlmaWVyZW1vamltb2RpZmllcmJhc2VlbW9qaXByZXNlbnRhdGlvbkVtb2ppX1ByZXNlbnRhdGlvbmVwcmVzZXF1aWRlb0VxdWl2YWxlbnRfVW5pZmllZF9JZGVvZ3JhcGhlcXVpdmFsZW50dW5pZmllZGlkZW9ncmFwaGV4cGFuZHNvbm5mY0V4cGFuZHNfT25fTkZDZXhwYW5kc29ubmZkRXhwYW5kc19Pbl9ORkRleHBhbmRzb25uZmtjRXhwYW5kc19Pbl9ORktDZXhwYW5kc29ubmZrZEV4cGFuZHNfT25fTkZLRGV4dEV4dGVuZGVyZXh0ZW5kZWRwaWN0b2dyYXBoaWNFeHRlbmRlZF9QaWN0b2dyYXBoaWNleHRlbmRlcmV4dHBpY3RmY25ma2NGQ19ORktDX0Nsb3N1cmVmY25ma2NjbG9zdXJlZnVsbGNvbXBvc2l0aW9uZXhjbHVzaW9uZ2NHZW5lcmFsX0NhdGVnb3J5Z2NiR3JhcGhlbWVfQ2x1c3Rlcl9CcmVha2dlbmVyYWxjYXRlZ29yeWdyYXBoZW1lYmFzZUdyYXBoZW1lX0Jhc2VncmFwaGVtZWNsdXN0ZXJicmVha2dyYXBoZW1lZXh0ZW5kR3JhcGhlbWVfRXh0ZW5kZ3JhcGhlbWVsaW5rR3JhcGhlbWVfTGlua2dyYmFzZWdyZXh0Z3JsaW5raGFuZ3Vsc3lsbGFibGV0eXBlSGFuZ3VsX1N5bGxhYmxlX1R5cGVoZXhIZXhfRGlnaXRoZXhkaWdpdGhzdGh5cGhlbkh5cGhlbmlkY0lEX0NvbnRpbnVlaWRjb250aW51ZWlkZW9JZGVvZ3JhcGhpY2lkZW9ncmFwaGljaWRzSURfU3RhcnRpZHNiSURTX0JpbmFyeV9PcGVyYXRvcmlkc2JpbmFyeW9wZXJhdG9yaWRzdElEU19UcmluYXJ5X09wZXJhdG9yaWRzdGFydGlkc3RyaW5hcnlvcGVyYXRvcmluZGljcG9zaXRpb25hbGNhdGVnb3J5SW5kaWNfUG9zaXRpb25hbF9DYXRlZ29yeWluZGljc3lsbGFiaWNjYXRlZ29yeUluZGljX1N5bGxhYmljX0NhdGVnb3J5aW5wY2luc2Npc2NJU09fQ29tbWVudGphbW9zaG9ydG5hbWVKYW1vX1Nob3J0X05hbWVqZ0pvaW5pbmdfR3JvdXBqb2luY0pvaW5fQ29udHJvbGpvaW5jb250cm9sam9pbmluZ2dyb3Vwam9pbmluZ3R5cGVKb2luaW5nX1R5cGVqc25qdGthY2NvdW50aW5nbnVtZXJpY2tjb21wYXRpYmlsaXR5dmFyaWFudGtpaWNvcmVraXJnZ3NvdXJjZWtpcmdoc291cmNla2lyZ2pzb3VyY2VraXJna3Bzb3VyY2VraXJna3NvdXJjZWtpcmdtc291cmNla2lyZ3Nzb3VyY2VraXJndHNvdXJjZWtpcmd1a3NvdXJjZWtpcmd1c291cmNla2lyZ3Zzb3VyY2Vrb3RoZXJudW1lcmlja3ByaW1hcnludW1lcmlja3JzdW5pY29kZWxiTGluZV9CcmVha2xjTG93ZXJjYXNlX01hcHBpbmdsaW5lYnJlYWtsb2VMb2dpY2FsX09yZGVyX0V4Y2VwdGlvbmxvZ2ljYWxvcmRlcmV4Y2VwdGlvbmxvd2VyTG93ZXJjYXNlbG93ZXJjYXNlbG93ZXJjYXNlbWFwcGluZ21hdGhNYXRobmFOYW1lbmExVW5pY29kZV8xX05hbWVuYW1lYWxpYXNOYW1lX0FsaWFzbmNoYXJOb25jaGFyYWN0ZXJfQ29kZV9Qb2ludG5mY3FjTkZDX1F1aWNrX0NoZWNrbmZjcXVpY2tjaGVja25mZHFjTkZEX1F1aWNrX0NoZWNrbmZkcXVpY2tjaGVja25ma2NjYXNlZm9sZE5GS0NfQ2FzZWZvbGRuZmtjY2ZuZmtjcWNORktDX1F1aWNrX0NoZWNrbmZrY3F1aWNrY2hlY2tuZmtkcWNORktEX1F1aWNrX0NoZWNrbmZrZHF1aWNrY2hlY2tub25jaGFyYWN0ZXJjb2RlcG9pbnRudE51bWVyaWNfVHlwZW51bWVyaWN0eXBlbnVtZXJpY3ZhbHVlTnVtZXJpY19WYWx1ZW52b2FscGhhT3RoZXJfQWxwaGFiZXRpY29jb21tZW50b2RpT3RoZXJfRGVmYXVsdF9JZ25vcmFibGVfQ29kZV9Qb2ludG9ncmV4dE90aGVyX0dyYXBoZW1lX0V4dGVuZG9pZGNPdGhlcl9JRF9Db250aW51ZW9pZHNPdGhlcl9JRF9TdGFydG9sb3dlck90aGVyX0xvd2VyY2FzZW9tYXRoT3RoZXJfTWF0aG90aGVyYWxwaGFiZXRpY290aGVyZGVmYXVsdGlnbm9yYWJsZWNvZGVwb2ludG90aGVyZ3JhcGhlbWVleHRlbmRvdGhlcmlkY29udGludWVvdGhlcmlkc3RhcnRvdGhlcmxvd2VyY2FzZW90aGVybWF0aG90aGVydXBwZXJjYXNlT3RoZXJfVXBwZXJjYXNlb3VwcGVycGF0c3luUGF0dGVybl9TeW50YXhwYXR0ZXJuc3ludGF4cGF0dGVybndoaXRlc3BhY2VQYXR0ZXJuX1doaXRlX1NwYWNlcGF0d3NwY21QcmVwZW5kZWRfQ29uY2F0ZW5hdGlvbl9NYXJrcHJlcGVuZGVkY29uY2F0ZW5hdGlvbm1hcmtxbWFya1F1b3RhdGlvbl9NYXJrcXVvdGF0aW9ubWFya3JhZGljYWxSYWRpY2FscmVnaW9uYWxpbmRpY2F0b3JSZWdpb25hbF9JbmRpY2F0b3JyaXNiU2VudGVuY2VfQnJlYWtzY1NjcmlwdHNjZlNpbXBsZV9DYXNlX0ZvbGRpbmdzY3JpcHRleHRlbnNpb25zU2NyaXB0X0V4dGVuc2lvbnNzY3hzZFNvZnRfRG90dGVkc2VudGVuY2VicmVha3NlbnRlbmNldGVybWluYWxTZW50ZW5jZV9UZXJtaW5hbHNmY3NpbXBsZWNhc2Vmb2xkaW5nc2ltcGxlbG93ZXJjYXNlbWFwcGluZ1NpbXBsZV9Mb3dlcmNhc2VfTWFwcGluZ3NpbXBsZXRpdGxlY2FzZW1hcHBpbmdTaW1wbGVfVGl0bGVjYXNlX01hcHBpbmdzaW1wbGV1cHBlcmNhc2VtYXBwaW5nU2ltcGxlX1VwcGVyY2FzZV9NYXBwaW5nc2xjc29mdGRvdHRlZHNwYWNlV2hpdGVfU3BhY2VzdGNzdGVybXN1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AABleiEABAAAAP96IQADAAAAbHohAAQAAAACeyEAAwAAAHN6IQAEAAAABXshAAMAAAB6eiEABAAAAAh7IQADAAAAgXohAAQAAAALeyEAAwAAAIh6IQAEAAAADnshAAMAAACPeiEABAAAABF7IQADAAAAlnohAAQAAAAUeyEAAwAAAJ16IQAEAAAAF3shAAMAAACkeiEABAAAABp7IQADAAAAq3ohAAQAAAAdeyEAAwAAALJ6IQAEAAAAIHshAAMAAAC5eiEABAAAAGNhc2VkbGV0dGVyQ2FzZWRfTGV0dGVyY2NDb250cm9sRm9ybWF0Y2xvc2VwdW5jdHVhdGlvbkNsb3NlX1B1bmN0dWF0aW9uY25jbnRybGNvUHJpdmF0ZV9Vc2Vjb21iaW5pbmdtYXJrY29ubmVjdG9ycHVuY3R1YXRpb25Db25uZWN0b3JfUHVuY3R1YXRpb25jb250cm9sY3NTdXJyb2dhdGVjdXJyZW5jeXN5bWJvbEN1cnJlbmN5X1N5bWJvbGRhc2hwdW5jdHVhdGlvbkRhc2hfUHVuY3R1YXRpb25kZWNpbWFsbnVtYmVyRGVjaW1hbF9OdW1iZXJkaWdpdGVuY2xvc2luZ21hcmtFbmNsb3NpbmdfTWFya2ZpbmFscHVuY3R1YXRpb25GaW5hbF9QdW5jdHVhdGlvbmZvcm1hdGluaXRpYWxwdW5jdHVhdGlvbkluaXRpYWxfUHVuY3R1YXRpb25MZXR0ZXJsZXR0ZXJsZXR0ZXJudW1iZXJMZXR0ZXJfTnVtYmVybGluZXNlcGFyYXRvckxpbmVfU2VwYXJhdG9ybGxMb3dlcmNhc2VfTGV0dGVybG1Nb2RpZmllcl9MZXR0ZXJsb090aGVyX0xldHRlcmxvd2VyY2FzZWxldHRlclRpdGxlY2FzZV9MZXR0ZXJsdVVwcGVyY2FzZV9MZXR0ZXJtbWFya21hdGhzeW1ib2xNYXRoX1N5bWJvbG1jU3BhY2luZ19NYXJrbWVtbk5vbnNwYWNpbmdfTWFya21vZGlmaWVybGV0dGVybW9kaWZpZXJzeW1ib2xNb2RpZmllcl9TeW1ib2xuZG5sbm9PdGhlcl9OdW1iZXJub25zcGFjaW5nbWFya29wZW5wdW5jdHVhdGlvbk9wZW5fUHVuY3R1YXRpb25vdGhlcm90aGVybGV0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AABAhyEACgAAAE2HIQACAAAAT4chAAoAAABZhyEACQAAAE+HIQAKAAAAYochAAIAAABkhyEABgAAAGqHIQAGAAAAZIchAAYAAABwhyEAAwAAAHOHIQAOAAAAgYchAAwAAABzhyEADgAAAH6/JgABAAAAjYchAAEAAACOhyEAAgAAAJCHIQACAAAAkochAAIAAACUhyEAAgAAAJaHIQADAAAAmYchAAMAAAARgSEABQAAALIfJgAFAAAAnIchAAIAAACehyEABwAAAKWHIQAHAAAAnochAAcAAAALZyEAEQAAABxnIQASAAAALmchAAIAAAAcZyEAEgAAAM+BIQACAAAArIchAAsAAADwgSEACwAAAKyHIQALAAAAt4chAAEAAAC4hyEAAQAAALmHIQABAAAAuochAAEAAAC7hyEAAgAAALIfJgAFAAAA21omAAMAAAC9hyEAAwAAAGFkbGFtQWRsYW1hZGxtYWdoYkNhdWNhc2lhbl9BbGJhbmlhbmFob21BaG9tYW5hdG9saWFuaGllcm9nbHlwaHNBbmF0b2xpYW5fSGllcm9nbHlwaHNhcmFiQXJhYmljYXJhYmljYXJtZW5pYW5Bcm1lbmlhbmFybWlJbXBlcmlhbF9BcmFtYWljYXJtbmF2ZXN0YW5BdmVzdGFuYXZzdGJhbGlCYWxpbmVzZWJhbGluZXNlYmFtdUJhbXVtYmFtdW1iYXNzQmFzc2FfVmFoYmFzc2F2YWhiYXRha0JhdGFrYmF0a2JlbmdCZW5nYWxpYmVuZ2FsaWJoYWlrc3VraUJoYWlrc3VraWJoa3Nib3BvQm9wb21vZm9ib3BvbW9mb2JyYWhCcmFobWlicmFobWlicmFpQnJhaWxsZWJyYWlsbGVidWdpQnVnaW5lc2VidWdpbmVzZWJ1aGRCdWhpZGJ1aGlkY2FrbUNoYWttYWNhbmFkaWFuYWJvcmlnaW5hbENhbmFkaWFuX0Fib3JpZ2luYWxjYW5zY2FyaUNhcmlhbmNhcmlhbmNhdWNhc2lhbmFsYmFuaWFuY2hha21hY2hhbUNoYW1jaGVyQ2hlcm9rZWVjaGVyb2tlZWNob3Jhc21pYW5DaG9yYXNtaWFuY2hyc2NvbW1vbkNvbW1vbmNvcHRDb3B0aWNjb3B0aWNjcG1uQ3lwcm9fTWlub2FuY3BydEN5cHJpb3RjdW5laWZvcm1DdW5laWZvcm1jeXByaW90Y3lwcm9taW5vYW5jeXJpbGxpY0N5cmlsbGljY3lybGRlc2VyZXREZXNlcmV0ZGV2YURldmFuYWdhcmlkZXZhbmFnYXJpZGlha0RpdmVzX0FrdXJ1ZGl2ZXNha3VydWRvZ3JEb2dyYWRvZ3JhZHNydGR1cGxEdXBsb3lhbmR1cGxveWFuZWd5cEVneXB0aWFuX0hpZXJvZ2x5cGhzZWd5cHRpYW5oaWVyb2dseXBoc2VsYmFFbGJhc2FuZWxiYXNhbmVseW1FbHltYWljZWx5bWFpY2V0aGlFdGhpb3BpY2V0aGlvcGljZ2Vvckdlb3JnaWFuZ2VvcmdpYW5nbGFnR2xhZ29saXRpY2dsYWdvbGl0aWNnb25nR3VuamFsYV9Hb25kaWdvbm1NYXNhcmFtX0dvbmRpZ290aEdvdGhpY2dvdGhpY2dyYW5HcmFudGhhZ3JhbnRoYWdyZWVrR3JlZWtncmVrZ3VqYXJhdGlHdWphcmF0aWd1anJndW5qYWxhZ29uZGlndXJtdWtoaUd1cm11a2hpZ3VydWhhbkhhbmhhbmdIYW5ndWxoYW5ndWxoYW5paGFuaWZpcm9oaW5neWFIYW5pZmlfUm9oaW5neWFoYW5vSGFudW5vb2hhbnVub29oYXRySGF0cmFuaGF0cmFuaGVickhlYnJld2hlYnJld2hpcmFIaXJhZ2FuYWhpcmFnYW5haGx1d2htbmdQYWhhd2hfSG1vbmdobW5wTnlpYWtlbmdfUHVhY2h1ZV9IbW9uZ2hya3RLYXRha2FuYV9Pcl9IaXJhZ2FuYWh1bmdPbGRfSHVuZ2FyaWFuaW1wZXJpYWxhcmFtYWljaW5oZXJpdGVkSW5oZXJpdGVkaW5zY3JpcHRpb25hbHBhaGxhdmlJbnNjcmlwdGlvbmFsX1BhaGxhdmlpbnNjcmlwdGlvbmFscGFydGhpYW5JbnNjcmlwdGlvbmFsX1BhcnRoaWFuaXRhbE9sZF9JdGFsaWNqYXZhSmF2YW5lc2VqYXZhbmVzZWthaXRoaUthaXRoaWthbGlLYXlhaF9MaWthbmFLYXRha2FuYWthbm5hZGFLYW5uYWRha2F0YWthbmFrYXRha2FuYW9yaGlyYWdhbmFrYXdpS2F3aWtheWFobGlraGFyS2hhcm9zaHRoaWtoYXJvc2h0aGlraGl0YW5zbWFsbHNjcmlwdEtoaXRhbl9TbWFsbF9TY3JpcHRraG1lcktobWVya2htcmtob2pLaG9qa2lraG9qa2lraHVkYXdhZGlLaHVkYXdhZGlraXRza25kYWt0aGlsYW5hVGFpX1RoYW1sYW9MYW9sYW9vbGF0aW5MYXRpbmxhdG5sZXBjTGVwY2hhbGVwY2hhbGltYkxpbWJ1bGltYnVsaW5hTGluZWFyX0FsaW5iTGluZWFyX0JsaW5lYXJhbGluZWFyYmxpc3VMaXN1bHljaUx5Y2lhbmx5Y2lhbmx5ZGlMeWRpYW5seWRpYW5tYWhhamFuaU1haGFqYW5pbWFoam1ha2FNYWthc2FybWFrYXNhcm1hbGF5YWxhbU1hbGF5YWxhbW1hbmRNYW5kYWljbWFuZGFpY21hbmlNYW5pY2hhZWFubWFuaWNoYWVhbm1hcmNNYXJjaGVubWFyY2hlbm1hc2FyYW1nb25kaW1lZGVmYWlkcmluTWVkZWZhaWRyaW5tZWRmbWVldGVpbWF5ZWtNZWV0ZWlfTWF5ZWttZW5kTWVuZGVfS2lrYWt1aW1lbmRla2lrYWt1aW1lcmNNZXJvaXRpY19DdXJzaXZlbWVyb01lcm9pdGljX0hpZXJvZ2x5cGhzbWVyb2l0aWNjdXJzaXZlbWVyb2l0aWNoaWVyb2dseXBoc21pYW9NaWFvbWx5bW1vZGlNb2RpbW9uZ01vbmdvbGlhbm1vbmdvbGlhbm1yb01yb21yb29tdGVpbXVsdE11bHRhbmltdWx0YW5pbXlhbm1hck15YW5tYXJteW1ybmFiYXRhZWFuTmFiYXRhZWFubmFnbU5hZ19NdW5kYXJpbmFnbXVuZGFyaW5hbmROYW5kaW5hZ2FyaW5hbmRpbmFnYXJpbmFyYk9sZF9Ob3J0aF9BcmFiaWFubmJhdG5ld2FOZXdhbmV3dGFpbHVlTmV3X1RhaV9MdWVua29Oa29ua29vbnNodU51c2h1bnVzaHVueWlha2VuZ3B1YWNodWVobW9uZ29nYW1PZ2hhbW9naGFtb2xjaGlraU9sX0NoaWtpb2xja29sZGh1bmdhcmlhbm9sZGl0YWxpY29sZG5vcnRoYXJhYmlhbm9sZHBlcm1pY09sZF9QZXJtaWNvbGRwZXJzaWFuT2xkX1BlcnNpYW5vbGRzb2dkaWFuT2xkX1NvZ2RpYW5vbGRzb3V0aGFyYWJpYW5PbGRfU291dGhfQXJhYmlhbm9sZHR1cmtpY09sZF9UdXJraWNvbGR1eWdodXJPbGRfVXlnaHVyb3JpeWFPcml5YW9ya2hvcnlhb3NhZ2VPc2FnZW9zZ2Vvc21hT3NtYW55YW9zbWFueWFvdWdycGFoYXdoaG1vbmdwYWxtUGFsbXlyZW5lcGFsbXlyZW5lcGF1Y1BhdV9DaW5fSGF1cGF1Y2luaGF1cGVybXBoYWdQaGFnc19QYXBoYWdzcGFwaGxpcGhscFBzYWx0ZXJfUGFobGF2aXBobnhQaG9lbmljaWFucGhvZW5pY2lhbnBscmRwcnRpcHNhbHRlcnBhaGxhdmlxYWFjcWFhaXJlamFuZ1JlamFuZ3Jqbmdyb2hncnVuaWNSdW5pY3J1bnJzYW1hcml0YW5TYW1hcml0YW5zYW1yc2FyYnNhdXJTYXVyYXNodHJhc2F1cmFzaHRyYXNnbndTaWduV3JpdGluZ3NoYXJhZGFTaGFyYWRhc2hhdmlhblNoYXZpYW5zaGF3c2hyZHNpZGRTaWRkaGFtc2lkZGhhbXNpZ253cml0aW5nc2luZHNpbmhTaW5oYWxhc2luaGFsYXNvZ2RTb2dkaWFuc29nZGlhbnNvZ29zb3JhU29yYV9Tb21wZW5nc29yYXNvbXBlbmdzb3lvU295b21ib3NveW9tYm9zdW5kU3VuZGFuZXNlc3VuZGFuZXNlc3lsb1N5bG90aV9OYWdyaXN5bG90aW5hZ3Jpc3lyY1N5cmlhY3N5cmlhY3RhZ2Fsb2dUYWdhbG9ndGFnYlRhZ2JhbndhdGFnYmFud2F0YWlsZVRhaV9MZXRhaXRoYW10YWl2aWV0VGFpX1ZpZXR0YWtyVGFrcml0YWtyaXRhbGV0YWx1dGFtaWxUYW1pbHRhbWx0YW5nVGFuZ3V0dGFuZ3NhVGFuZ3NhdGFuZ3V0dGF2dHRlbHVUZWx1Z3V0ZWx1Z3V0Zm5nVGlmaW5hZ2h0Z2xndGhhYVRoYWFuYXRoYWFuYXRoYWlUaGFpdGliZXRhblRpYmV0YW50aWJ0dGlmaW5hZ2h0aXJoVGlyaHV0YXRpcmh1dGF0bnNhdG90b1RvdG91Z2FyVWdhcml0aWN1Z2FyaXRpY3ZhaVZhaXZhaWl2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bnVlc2VTZXBzZXBzcFNwc3RTVGVybXVwVXBwZXIABKshAAIAAAAGqyEABQAAAAurIQAFAAAABqshAAUAAAAQqyEAAgAAABKrIQAFAAAAF6shAAUAAAASqyEABQAAACyHIQACAAAALochAAIAAABihyEAAgAAAGSHIQAGAAAAaochAAYAAABkhyEABgAAAByrIQACAAAAhH4hAAYAAACffyEABgAAAIR+IQAGAAAA3lomAAIAAAAeqyEABwAAAI6HIQACAAAAkIchAAIAAAAtgCEAAgAAACWrIQAFAAAAtWMhAAUAAAAlqyEABQAAANdaJgACAAAAKqshAAcAAAAxqyEABwAAACqrIQAHAAAAOKshAAcAAAAeqyEABwAAABGBIQAFAAAAsh8mAAUAAABAZyEAAgAAAD+rIQAJAAAASKshAAkAAAA/qyEACQAAAFGrIQACAAAAU6shAAMAAABWqyEAAwAAAFOrIQADAAAAWashAAIAAABbqyEAAgAAAF2rIQACAAAAX6shAAUAAAB7aCEABQAAAF+rIQAFAAAAZKshAAIAAABmqyEABQAAACppIQAFAAAAZqshAAUAAAC7hyEAAgAAALIfJgAFAAAAYWxldHRlckFMZXR0ZXJkb3VibGVxdW90ZURvdWJsZV9RdW90ZWRxRXh0ZW5kTnVtTGV0ZXh0ZW5kbnVtbGV0aGVicmV3bGV0dGVySGVicmV3X0xldHRlcmhsa2FtYk1pZE51bUxldG1pZGxldHRlck1pZExldHRlcm1pZG51bU1pZE51bW1pZG51bWxldG1sbmV3bGluZU5ld2xpbmVzaW5nbGVxdW90ZVNpbmdsZV9RdW90ZXNxd3NlZ3NwYWNlV1NlZ1NwYWNlAAAAHK0hAAcAAAAjrSEABwAAACyHIQACAAAALochAAIAAAAqrSEACwAAADWtIQAMAAAAQa0hAAIAAAA1rSEADAAAADCHIQACAAAAMochAAYAAABfXiEABQAAADKHIQAGAAAAOIchAAgAAABAhyEACgAAAEqHIQADAAAAQIchAAoAAABNhyEAAgAAAE+HIQAKAAAAWYchAAkAAABPhyEACgAAAGKHIQACAAAAQ60hAAwAAABqhyEABgAAAGSHIQAGAAAAT60hAAwAAABDrSEADAAAAByrIQACAAAAhH4hAAYAAACffyEABgAAAIR+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AAAvAQAALgEAADMBAAAyAQAANQEAADQBAAA3AQAANgEAADoBAAA5AQAAPAEAADsBAAA+AQAAPQEAAEABAAA/AQAAQgEAAEEBAABEAQAAQwEAAEYBAABFAQAASAEAAEcBAABLAQAASgEAAE0BAABMAQAATwEAAE4BAABRAQAAUAEAAFMBAABSAQAAVQEAAFQBAABXAQAAVgEAAFkBAABYAQAAWwEAAFoBAABdAQAAXAEAAF8BAABeAQAAYQEAAGABAABjAQAAYgEAAGUBAABkAQAAZwEAAGYBAABpAQAAaAEAAGsBAABqAQAAbQEAAGwBAABvAQAAbgEAAHEBAABwAQAAcwEAAHIBAAB1AQAAdAEAAHcBAAB2AQAA/wAAAHoBAAB5AQAAfAEAAHsBAAB+AQAAfQEAAFMAAABzAAAAQwIAAFMCAACDAQAAggEAAIUBAACEAQAAVAIAAIgBAACHAQAAVgIAAFcCAACMAQAAiwEAAN0BAABZAgAAWwIAAJIBAACRAQAAYAIAAGMCAAD2AQAAaQIAAGgCAACZAQAAmAEAAD0CAABvAgAAcgIAACACAAB1AgAAoQEAAKABAACjAQAAogEAAKUBAACkAQAAgAIAAKgBAACnAQAAgwIAAK0BAACsAQAAiAIAALABAACvAQAAigIAAIsCAAC0AQAAswEAALYBAAC1AQAAkgIAALkBAAC4AQAAvQEAALwBAAD3AQAAxQEAAMYBAADEAQAAxgEAAMQBAADFAQAAyAEAAMkBAADHAQAAyQEAAMcBAADIAQAAywEAAMwBAADKAQAAzAEAAMoBAADLAQAAzgEAAM0BAADQAQAAzwEAANIBAADRAQAA1AEAANMBAADWAQAA1QEAANgBAADXAQAA2gEAANkBAADcAQAA2wEAAI4BAADfAQAA3gEAAOEBAADgAQAA4wEAAOIBAADlAQAA5AEAAOcBAADmAQAA6QEAAOgBAADrAQAA6gEAAO0BAADsAQAA7wEAAO4BAADyAQAA8wEAAPEBAADzAQAA8QEAAPIBAAD1AQAA9AEAAJUBAAC/AQAA+QEAAPgBAAD7AQAA+gEAAP0BAAD8AQAA/wEAAP4BAAABAgAAAAIAAAMCAAACAgAABQIAAAQCAAAHAgAABgIAAAkCAAAIAgAACwIAAAoCAAANAgAADAIAAA8CAAAOAgAAEQIAABACAAATAgAAEgIAABUCAAAUAgAAFwIAABYCAAAZAgAAGAIAABsCAAAaAgAAHQIAABwCAAAfAgAAHgIAAJ4BAAAjAgAAIgIAACUCAAAkAgAAJwIAACYCAAApAgAAKAIAACsCAAAqAgAALQIAACwCAAAvAgAALgIAADECAAAwAgAAMwIAADICAABlLAAAPAIAADsCAACaAQAAZiwAAH4sAAB/LAAAQgIAAEECAACAAQAAiQIAAIwCAABHAgAARgIAAEkCAABIAgAASwIAAEoCAABNAgAATAIAAE8CAABOAgAAbywAAG0sAABwLAAAgQEAAIYBAACJAQAAigEAAI8BAACQAQAAq6cAAJMBAACspwAAlAEAAI2nAACqpwAAlwEAAJYBAACupwAAYiwAAK2nAACcAQAAbiwAAJ0BAACfAQAAZCwAAKYBAADFpwAAqQEAALGnAACuAQAARAIAALEBAACyAQAARQIAALcBAACypwAAsKcAAJkDAAC5AwAAvh8AAHEDAABwAwAAcwMAAHIDAAB3AwAAdgMAAP0DAAD+AwAA/wMAAPMDAACsAwAArQMAAK4DAACvAwAAzAMAAM0DAADOAwAAsQMAALIDAADQAwAAswMAALQDAAC1AwAA9QMAALYDAAC3AwAAuAMAANEDAAD0AwAARQMAALkDAAC+HwAAugMAAPADAAC7AwAAtQAAALwDAAC9AwAAvgMAAL8DAADAAwAA1gMAAMEDAADxAwAAwgMAAMMDAADEAwAAxQMAAMYDAADVAwAAxwMAAMgDAADJAwAAJiEAAMoDAADLAwAAhgMAAIgDAACJAwAAigMAAJEDAACSAwAA0AMAAJMDAACUAwAAlQMAAPUDAACWAwAAlwMAAJgDAADRAwAA9AMAAEUDAACZAwAAvh8AAJoDAADwAwAAmwMAALUAAACcAwAAnQMAAJ4DAACfAwAAoAMAANYDAAChAwAA8QMAAKMDAADDAwAAowMAAMIDAACkAwAApQMAAKYDAADVAwAApwMAAKgDAACpAwAAJiEAAKoDAACrAwAAjAMAAI4DAACPAwAA1wMAAJIDAACyAwAAmAMAALgDAAD0AwAApgMAAMYDAACgAwAAwAMAAM8DAADZAwAA2AMAANsDAADaAwAA3QMAANwDAADfAwAA3gMAAOEDAADgAwAA4wMAAOIDAADlAwAA5AMAAOcD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AAB4IQAAeSEAAHohAAB7IQAAfCEAAH0hAAB+IQAAfyEAAGAhAABhIQAAYiEAAGMhAABkIQAAZSEAAGYhAABnIQAAaCEAAGkhAABqIQAAayEAAGwhAABtIQAAbiEAAG8hAACEIQAAgyEAANAkAADRJAAA0iQAANMkAADUJAAA1SQAANYkAADXJAAA2CQAANkkAADaJAAA2yQAANwkAADdJAAA3iQAAN8kAADgJAAA4SQAAOIkAADjJAAA5CQAAOUkAADmJAAA5yQAAOgkAADpJAAAtiQAALckAAC4JAAAuSQAALokAAC7JAAAvCQAAL0kAAC+JAAAvyQAAMAkAADBJAAAwiQAAMMkAADEJAAAxSQAAMYkAADHJAAAyCQAAMkkAADKJAAAyyQAAMwkAADNJAAAziQAAM8kAAAwLAAAMSwAADIsAAAzLAAANCwAADUsAAA2LAAANywAADgsAAA5LAAAOiwAADssAAA8LAAAPSwAAD4sAAA/LAAAQCwAAEEsAABCLAAAQywAAEQsAABFLAAARiwAAEcsAABILAAASSwAAEosAABLLAAATCwAAE0sAABOLAAATywAAFAsAABRLAAAUiwAAFMsAABULAAAVSwAAFYsAABXLAAAWCwAAFksAABaLAAAWywAAFwsAABdLAAAXiwAAF8sAAAALAAAASwAAAIsAAADLAAABCwAAAUsAAAGLAAABywAAAgsAAAJLAAACiwAAAssAAAMLAAADSwAAA4sAAAPLAAAECwAABEsAAASLAAAEywAABQsAAAVLAAAFiwAABcsAAAYLAAAGSwAABosAAAbLAAAHCwAAB0sAAAeLAAAHywAACAsAAAhLAAAIiwAACMsAAAkLAAAJSwAACYsAAAnLAAAKCwAACksAAAqLAAAKywAACwsAAAtLAAALiwAAC8sAABhLAAAYCwAAGsCAAB9HQAAfQIAADoCAAA+AgAAaCwAAGcsAABqLAAAaSwAAGwsAABrLAAAUQIAAHECAABQAgAAUgIAAHMsAAByLAAAdiwAAHUsAAA/AgAAQAIAAIEsAACALAAAgywAAIIsAACFLAAAhCwAAIcsAACGLAAAiSwAAIgsAACLLAAAiiwAAI0sAACMLAAAjywAAI4sAACRLAAAkCwAAJMsAACSLAAAlSwAAJQsAACXLAAAliwAAJksAACYLAAAmywAAJosAACdLAAAnCwAAJ8sAACeLAAAoSwAAKAsAACjLAAAoiwAAKUsAACkLAAApywAAKYsAACpLAAAqCwAAKssAACqLAAArSwAAKwsAACvLAAAriwAALEsAACwLAAAsywAALIsAAC1LAAAtCwAALcsAAC2LAAAuSwAALgsAAC7LAAAuiwAAL0sAAC8LAAAvywAAL4sAADBLAAAwCwAAMMsAADCLAAAxSwAAMQsAADHLAAAxiwAAMksAADILAAAyywAAMosAADNLAAAzCwAAM8sAADOLAAA0SwAANAsAADTLAAA0iwAANUsAADULAAA1ywAANYsAADZLAAA2CwAANssAADaLAAA3SwAANwsAADfLAAA3iwAAOEsAADgLAAA4ywAAOIsAADsLAAA6ywAAO4sAADtLAAA8ywAAPIsAACgEAAAoRAAAKIQAACjEAAApBAAAKUQAACmEAAApxAAAKgQAACpEAAAqhAAAKsQAACsEAAArRAAAK4QAACvEAAAsBAAALEQAACyEAAAsxAAALQQAAC1EAAAthAAALcQAAC4EAAAuRAAALoQAAC7EAAAvBAAAL0QAAC+EAAAvxAAAMAQAADBEAAAwhAAAMMQAADEEAAAxRAAAMcQAADNEAAAQaYAAECmAABDpgAAQqYAAEWmAABEpgAAR6YAAEamAABJpgAASKYAAIgcAABLpgAAiBwAAEqmAABNpgAATKYAAE+mAABOpgAAUaYAAFCmAABTpgAAUqYAAFWmAABUpgAAV6YAAFamAABZpgAAWKYAAFumAABapgAAXaYAAFymAABfpgAAXqYAAGGmAABgpgAAY6YAAGKmAABlpgAAZKYAAGemAABmpgAAaaYAAGimAABrpgAAaqYAAG2mAABspgAAgaYAAICmAACDpgAAgqYAAIWmAACEpgAAh6YAAIamAACJpgAAiKYAAIumAACKpgAAjaYAAIymAACPpgAAjqYAAJGmAACQpgAAk6YAAJKmAACVpgAAlKYAAJemAACWpgAAmaYAAJimAACbpgAAmqYAACOnAAAipwAAJacAACSnAAAnpwAAJqcAACmnAAAopwAAK6cAACqnAAAtpwAALKcAAC+nAAAupwAAM6cAADKnAAA1pwAANKcAADenAAA2pwAAOacAADinAAA7pwAAOqcAAD2nAAA8pwAAP6cAAD6nAABBpwAAQKcAAEOnAABCpwAARacAAESnAABHpwAARqcAAEmnAABIpwAAS6cAAEqnAABNpwAATKcAAE+nAABOpwAAUacAAFCnAABTpwAAUqcAAFWnAABUpwAAV6cAAFanAABZpwAAWKcAAFunAABapwAAXacAAFynAABfpwAAXqcAAGGnAABgpwAAY6cAAGKnAABlpwAAZKcAAGenAABmpwAAaacAAGinAABrpwAAaqcAAG2nAABspwAAb6cAAG6nAAB6pwAAeacAAHynAAB7pwAAeR0AAH+nAAB+pwAAgacAAICnAACDpwAAgqcAAIWnAACEpwAAh6cAAIanAACMpwAAi6cAAGUCAACRpwAAkKcAAJOnAACSpwAAxKcAAJenAACWpwAAmacAAJinAACbpwAAmqcAAJ2nAACcpwAAn6cAAJ6nAAChpwAAoKcAAKOnAACipwAApacAAKSnAACnpwAApqcAAKmnAACopwAAZgIAAFwCAABhAgAAbAIAAGoCAACeAgAAhwIAAJ0CAABTqwAAtacAALSnAAC3pwAAtqcAALmnAAC4pwAAu6cAALqnAAC9pwAAvKcAAL+nAAC+pwAAwacAAMCnAADDpwAAwqcAAJSnAACCAgAAjh0AAMinAADHpwAAyqcAAMmnAADRpwAA0KcAANenAADWpwAA2acAANinAAD2pwAA9acAALOnAACgEwAAoRMAAKITAACjEwAApBMAAKUTAACmEwAApxMAAKgTAACpEwAAqhMAAKsTAACsEwAArRMAAK4TAACvEwAAsBMAALETAACyEwAAsxMAALQTAAC1EwAAthMAALcTAAC4EwAAuRMAALoTAAC7EwAAvBMAAL0TAAC+EwAAvxMAAMATAADBEwAAwhMAAMMTAADEEwAAxRMAAMYTAADHEwAAyBMAAMkTAADKEwAAyxMAAMwTAADNEwAAzhMAAM8TAADQEwAA0RMAANITAADTEwAA1BMAANUTAADWEwAA1xMAANgTAADZEwAA2hMAANsTAADcEwAA3RMAAN4TAADfEwAA4BMAAOETAADiEwAA4xMAAOQTAADlEwAA5hMAAOcTAADoEwAA6RMAAOoTAADrEwAA7BMAAO0TAADuEwAA7xMAAEH/AABC/wAAQ/8AAET/AABF/wAARv8AAEf/AABI/wAASf8AAEr/AABL/wAATP8AAE3/AABO/wAAT/8AAFD/AABR/wAAUv8AAFP/AABU/wAAVf8AAFb/AABX/wAAWP8AAFn/AABa/wAAIf8AACL/AAAj/wAAJP8AACX/AAAm/wAAJ/8AACj/AAAp/wAAKv8AACv/AAAs/wAALf8AAC7/AAAv/wAAMP8AADH/AAAy/wAAM/8AADT/AAA1/wAANv8AADf/AAA4/wAAOf8AADr/AAAoBAEAKQQBACoEAQArBAEALAQBAC0EAQAuBAEALwQBADAEAQAxBAEAMgQBADMEAQA0BAEANQQBADYEAQA3BAEAOAQBADkEAQA6BAEAOwQBADwEAQA9BAEAPgQBAD8EAQBABAEAQQQBAEIEAQBDBAEARAQBAEUEAQBGBAEARwQBAEgEAQBJBAEASgQBAEsEAQBMBAEATQQBAE4EAQBPBAEAAAQBAAEEAQACBAEAAwQBAAQEAQAFBAEABgQBAAcEAQAIBAEACQQBAAoEAQALBAEADAQBAA0EAQAOBAEADwQBABAEAQARBAEAEgQBABMEAQAUBAEAFQQBABYEAQAXBAEAGAQBABkEAQAaBAEAGwQBABwEAQAdBAEAHgQBAB8EAQAgBAEAIQQBACIEAQAjBAEAJAQBACUEAQAmBAEAJwQBANgEAQDZBAEA2gQBANsEAQDcBAEA3QQBAN4EAQDfBAEA4AQBAOEEAQDiBAEA4wQBAOQEAQDlBAEA5gQBAOcEAQDoBAEA6QQBAOoEAQDrBAEA7AQBAO0EAQDuBAEA7wQBAPAEAQDxBAEA8gQBAPMEAQD0BAEA9QQBAPYEAQD3BAEA+AQBAPkEAQD6BAEA+wQBALAEAQCxBAEAsgQBALMEAQC0BAEAtQQBALYEAQC3BAEAuAQBALkEAQC6BAEAuwQBALwEAQC9BAEAvgQBAL8EAQDABAEAwQQBAMIEAQDDBAEAxAQBAMUEAQDGBAEAxwQBAMgEAQDJBAEAygQBAMsEAQDMBAEAzQQBAM4EAQDPBAEA0AQBANEEAQDSBAEA0wQBAJcFAQCYBQEAmQUBAJoFAQCbBQEAnAUBAJ0FAQCeBQEAnwUBAKAFAQChBQEAowUBAKQFAQClBQEApgUBAKcFAQCoBQEAqQUBAKoFAQCrBQEArAUBAK0FAQCuBQEArwUBALAFAQCxBQEAswUBALQFAQC1BQEAtgUBALcFAQC4BQEAuQUBALsFAQC8BQEAcAUBAHEFAQByBQEAcwUBAHQFAQB1BQEAdgUBAHcFAQB4BQEAeQUBAHoFAQB8BQEAfQUBAH4FAQB/BQEAgAUBAIEFAQCCBQEAgwUBAIQFAQCFBQEAhgUBAIcFAQCIBQEAiQUBAIoFAQCMBQEAjQUBAI4FAQCPBQEAkAUBAJEFAQCSBQEAlAUBAJUFAQDADAEAwQwBAMIMAQDDDAEAxAwBAMUMAQDGDAEAxwwBAMgMAQDJDAEAygwBAMsMAQDMDAEAzQwBAM4MAQDPDAEA0AwBANEMAQDSDAEA0wwBANQMAQDVDAEA1gwBANcMAQDYDAEA2QwBANoMAQDbDAEA3AwBAN0MAQDeDAEA3wwBAOAMAQDhDAEA4gwBAOMMAQDkDAEA5QwBAOYMAQDnDAEA6AwBAOkMAQDqDAEA6wwBAOwMAQDtDAEA7gwBAO8MAQDwDAEA8QwBAPIMAQCADAEAgQwBAIIMAQCDDAEAhAwBAIUMAQCGDAEAhwwBAIgMAQCJDAEAigwBAIsMAQCMDAEAjQwBAI4MAQCPDAEAkAwBAJEMAQCSDAEAkwwBAJQMAQCVDAEAlgwBAJcMAQCYDAEAmQwBAJoMAQCbDAEAnAwBAJ0MAQCeDAEAnwwBAKAMAQChDAEAogwBAKMMAQCkDAEApQwBAKYMAQCnDAEAqAwBAKkMAQCqDAEAqwwBAKwMAQCtDAEArgwBAK8MAQCwDAEAsQwBALIMAQDAGAEAwRgBAMIYAQDDGAEAxBgBAMUYAQDGGAEAxxgBAMgYAQDJGAEAyhgBAMsYAQDMGAEAzRgBAM4YAQDPGAEA0BgBANEYAQDSGAEA0xgBANQYAQDVGAEA1hgBANcYAQDYGAEA2RgBANoYAQDbGAEA3BgBAN0YAQDeGAEA3xgBAKAYAQChGAEAohgBAKMYAQCkGAEApRgBAKYYAQCnGAEAqBgBAKkYAQCqGAEAqxgBAKwYAQCtGAEArhgBAK8YAQCwGAEAsRgBALIYAQCzGAEAtBgBALUYAQC2GAEAtxgBALgYAQC5GAEAuhgBALsYAQC8GAEAvRgBAL4YAQC/GAEAYG4BAGFuAQBibgEAY24BAGRuAQBlbgEAZm4BAGduAQBobgEAaW4BAGpuAQBrbgEAbG4BAG1uAQBubgEAb24BAHBuAQBxbgEAcm4BAHNuAQB0bgEAdW4BAHZuAQB3bgEAeG4BAHluAQB6bgEAe24BAHxuAQB9bgEAfm4BAH9uAQBAbgEAQW4BAEJuAQBDbgEARG4BAEVuAQBGbgEAR24BAEhuAQBJbgEASm4BAEtuAQBMbgEATW4BAE5uAQBPbgEAUG4BAFFuAQBSbgEAU24BAFRuAQBVbgEAVm4BAFduAQBYbgEAWW4BAFpuAQBbbgEAXG4BAF1uAQBebgEAX24BACLpAQAj6QEAJOkBACXpAQAm6QEAJ+kBACjpAQAp6QEAKukBACvpAQAs6QEALekBAC7pAQAv6QEAMOkBADHpAQAy6QEAM+kBADTpAQA16QEANukBADfpAQA46QEAOekBADrpAQA76QEAPOkBAD3pAQA+6QEAP+kBAEDpAQBB6QEAQukBAEPpAQAA6QEAAekBAALpAQAD6QEABOkBAAXpAQAG6QEAB+kBAAjpAQAJ6QEACukBAAvpAQAM6QEADekBAA7pAQAP6QEAEOkBABHpAQAS6QEAE+kBABTpAQAV6QEAFukBABfpAQAY6QEAGekBABrpAQAb6QEAHOkBAB3pAQAe6QEAH+kBACDpAQAh6QEAQQAAADyzIQABAAAAQgAAAECzIQABAAAAQwAAAESzIQABAAAARAAAAEizIQABAAAARQAAAEyzIQABAAAARgAAAFCzIQABAAAARwAAAFSzIQABAAAASAAAAFizIQABAAAASQAAAFyzIQABAAAASgAAAGCzIQABAAAASwAAAGSzIQACAAAATAAAAGyzIQABAAAATQAAAHCzIQABAAAATgAAAHSzIQABAAAATwAAAHizIQABAAAAUAAAAHyzIQABAAAAUQAAAICzIQABAAAAUgAAAISzIQABAAAAUwAAAIizIQACAAAAVAAAAJCzIQABAAAAVQAAAJSzIQABAAAAVgAAAJizIQABAAAAVwAAAJyzIQABAAAAWAAAAKCzIQABAAAAWQAAAKSzIQABAAAAWgAAAKizIQABAAAAYQAAAKyzIQABAAAAYgAAALCzIQABAAAAYwAAALSzIQABAAAAZAAAALizIQABAAAAZQAAALyzIQABAAAAZgAAAMCzIQABAAAAZwAAAMSzIQABAAAAaAAAAMizIQABAAAAaQAAAMyzIQABAAAAagAAANCzIQABAAAAawAAANSzIQACAAAAbAAAANyzIQABAAAAbQAAAOCzIQABAAAAbgAAAOSzIQABAAAAbwAAAOizIQABAAAAcAAAAOyzIQABAAAAcQAAAPCzIQABAAAAcgAAAPSzIQABAAAAcwAAAPizIQACAAAAdAAAAAC0IQABAAAAdQAAAAS0IQABAAAAdgAAAAi0IQABAAAAdwAAAAy0IQABAAAAeAAAABC0IQABAAAAeQAAABS0IQABAAAAegAAABi0IQABAAAAtQAAABy0IQACAAAAwAAAACS0IQABAAAAwQAAACi0IQABAAAAwgAAACy0IQABAAAAwwAAADC0IQABAAAAxAAAADS0IQABAAAAxQAAADi0IQACAAAAxgAAAEC0IQABAAAAxwAAAES0IQABAAAAyAAAAEi0IQABAAAAyQAAAEy0IQABAAAAygAAAFC0IQABAAAAywAAAFS0IQABAAAAzAAAAFi0IQABAAAAzQAAAFy0IQABAAAAzgAAAGC0IQABAAAAzwAAAGS0IQABAAAA0AAAAGi0IQABAAAA0QAAAGy0IQABAAAA0gAAAHC0IQABAAAA0wAAAHS0IQABAAAA1AAAAHi0IQABAAAA1QAAAHy0IQABAAAA1gAAAIC0IQABAAAA2AAAAIS0IQABAAAA2QAAAIi0IQABAAAA2gAAAIy0IQABAAAA2wAAAJC0IQABAAAA3AAAAJS0IQABAAAA3QAAAJi0IQABAAAA3gAAAJy0IQABAAAA3wAAAKC0IQABAAAA4AAAAKS0IQABAAAA4QAAAKi0IQABAAAA4gAAAKy0IQABAAAA4wAAALC0IQABAAAA5AAAALS0IQABAAAA5QAAALi0IQACAAAA5gAAAMC0IQABAAAA5wAAAMS0IQABAAAA6AAAAMi0IQABAAAA6QAAAMy0IQABAAAA6gAAANC0IQABAAAA6wAAANS0IQABAAAA7AAAANi0IQABAAAA7QAAANy0IQABAAAA7gAAAOC0IQABAAAA7wAAAOS0IQABAAAA8AAAAOi0IQABAAAA8QAAAOy0IQABAAAA8gAAAPC0IQABAAAA8wAAAPS0IQABAAAA9AAAAPi0IQABAAAA9QAAAPy0IQABAAAA9gAAAAC1IQABAAAA+AAAAAS1IQABAAAA+QAAAAi1IQABAAAA+gAAAAy1IQABAAAA+wAAABC1IQABAAAA/AAAABS1IQABAAAA/QAAABi1IQABAAAA/gAAABy1IQABAAAA/wAAACC1IQABAAAAAAEAACS1IQABAAAAAQEAACi1IQABAAAAAgEAACy1IQABAAAAAwEAADC1IQABAAAABAEAADS1IQABAAAABQEAADi1IQABAAAABgEAADy1IQABAAAABwEAAEC1IQABAAAACAEAAES1IQABAAAACQEAAEi1IQABAAAACgEAAEy1IQABAAAACwEAAFC1IQABAAAADAEAAFS1IQABAAAADQEAAFi1IQABAAAADgEAAFy1IQABAAAADwEAAGC1IQABAAAAEAEAAGS1IQABAAAAEQEAAGi1IQABAAAAEgEAAGy1IQABAAAAEwEAAHC1IQABAAAAFAEAAHS1IQABAAAAFQEAAHi1IQABAAAAFgEAAHy1IQABAAAAFwEAAIC1IQABAAAAGAEAAIS1IQABAAAAGQEAAIi1IQABAAAAGgEAAIy1IQABAAAAGwEAAJC1IQABAAAAHAEAAJS1IQABAAAAHQEAAJi1IQABAAAAHgEAAJy1IQABAAAAHwEAAKC1IQABAAAAIAEAAKS1IQABAAAAIQEAAKi1IQABAAAAIgEAAKy1IQABAAAAIwEAALC1IQABAAAAJAEAALS1IQABAAAAJQEAALi1IQABAAAAJgEAALy1IQABAAAAJwEAAMC1IQABAAAAKAEAAMS1IQABAAAAKQEAAMi1IQABAAAAKgEAAMy1IQABAAAAKwEAANC1IQABAAAALAEAANS1IQABAAAALQEAANi1IQABAAAALgEAANy1IQABAAAALwEAAOC1IQABAAAAMgEAAOS1IQABAAAAMwEAAOi1IQABAAAANAEAAOy1IQABAAAANQEAAPC1IQABAAAANgEAAPS1IQABAAAANwEAAPi1IQABAAAAOQEAAPy1IQABAAAAOgEAAAC2IQABAAAAOwEAAAS2IQABAAAAPAEAAAi2IQABAAAAPQEAAAy2IQABAAAAPgEAABC2IQABAAAAPwEAABS2IQABAAAAQAEAABi2IQABAAAAQQEAABy2IQABAAAAQgEAACC2IQABAAAAQwEAACS2IQABAAAARAEAACi2IQABAAAARQEAACy2IQABAAAARgEAADC2IQABAAAARwEAADS2IQABAAAASAEAADi2IQABAAAASgEAADy2IQABAAAASwEAAEC2IQABAAAATAEAAES2IQABAAAATQEAAEi2IQABAAAATgEAAEy2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IQABAAAA8QEAANC4IQACAAAA8gEAANi4IQACAAAA8wEAAOC4IQACAAAA9AEAAOi4IQABAAAA9QEAAOy4IQABAAAA9gEAAPC4IQABAAAA9wEAAPS4IQABAAAA+AEAAPi4IQABAAAA+QEAAPy4IQABAAAA+gEAAAC5IQABAAAA+wEAAAS5IQABAAAA/AEAAAi5IQABAAAA/QEAAAy5IQABAAAA/gEAABC5IQABAAAA/wEAABS5IQABAAAAAAIAABi5IQABAAAAAQIAABy5IQABAAAAAgIAACC5IQABAAAAAwIAACS5IQABAAAABAIAACi5IQABAAAABQIAACy5IQABAAAABgIAADC5IQABAAAABwIAADS5IQABAAAACAIAADi5IQABAAAACQIAADy5IQABAAAACgIAAEC5IQABAAAACwIAAES5IQABAAAADAIAAEi5IQABAAAADQIAAEy5IQABAAAADgIAAFC5IQABAAAADwIAAFS5IQABAAAAEAIAAFi5IQABAAAAEQIAAFy5IQABAAAAEgIAAGC5IQABAAAAEwIAAGS5IQABAAAAFAIAAGi5IQABAAAAFQIAAGy5IQABAAAAFgIAAHC5IQABAAAAFwIAAHS5IQABAAAAGAIAAHi5IQABAAAAGQIAAHy5IQABAAAAGgIAAIC5IQABAAAAGwIAAIS5IQABAAAAHAIAAIi5IQABAAAAHQIAAIy5IQABAAAAHgIAAJC5IQABAAAAHwIAAJS5IQABAAAAIAIAAJi5IQABAAAAIgIAAJy5IQABAAAAIwIAAKC5IQABAAAAJAIAAKS5IQABAAAAJQIAAKi5IQABAAAAJgIAAKy5IQABAAAAJwIAALC5IQABAAAAKAIAALS5IQABAAAAKQIAALi5IQABAAAAKgIAALy5IQABAAAAKwIAAMC5IQABAAAALAIAAMS5IQABAAAALQIAAMi5IQABAAAALgIAAMy5IQABAAAALwIAANC5IQABAAAAMAIAANS5IQABAAAAMQIAANi5IQABAAAAMgIAANy5IQABAAAAMwIAAOC5IQABAAAAOgIAAOS5IQABAAAAOwIAAOi5IQABAAAAPAIAAOy5IQABAAAAPQIAAPC5IQABAAAAPgIAAPS5IQABAAAAPwIAAPi5IQABAAAAQAIAAPy5IQABAAAAQQIAAAC6IQABAAAAQgIAAAS6IQABAAAAQwIAAAi6IQABAAAARAIAAAy6IQABAAAARQIAABC6IQABAAAARgIAABS6IQABAAAARwIAABi6IQABAAAASAIAABy6IQABAAAASQIAACC6IQABAAAASgIAACS6IQABAAAASwIAACi6IQABAAAATAIAACy6IQABAAAATQIAADC6IQABAAAATgIAADS6IQABAAAATwIAADi6IQABAAAAUAIAADy6IQABAAAAUQIAAEC6IQABAAAAUgIAAES6IQABAAAAUwIAAEi6IQABAAAAVAIAAEy6IQABAAAAVgIAAFC6IQABAAAAVwIAAFS6IQABAAAAWQIAAFi6IQABAAAAWwIAAFy6IQABAAAAXAIAAGC6IQABAAAAYAIAAGS6IQABAAAAYQIAAGi6IQABAAAAYwIAAGy6IQABAAAAZQIAAHC6IQABAAAAZgIAAHS6IQABAAAAaAIAAHi6IQABAAAAaQIAAHy6IQABAAAAagIAAIC6IQABAAAAawIAAIS6IQABAAAAbAIAAIi6IQABAAAAbwIAAIy6IQABAAAAcQIAAJC6IQABAAAAcgIAAJS6IQABAAAAdQIAAJi6IQABAAAAfQIAAJy6IQABAAAAgAIAAKC6IQABAAAAggIAAKS6IQABAAAAgwIAAKi6IQABAAAAhwIAAKy6IQABAAAAiAIAALC6IQABAAAAiQIAALS6IQABAAAAigIAALi6IQABAAAAiwIAALy6IQABAAAAjAIAAMC6IQABAAAAkgIAAMS6IQABAAAAnQIAAMi6IQABAAAAngIAAMy6IQABAAAARQMAANC6IQADAAAAcAMAANy6IQABAAAAcQMAAOC6IQABAAAAcgMAAOS6IQABAAAAcwMAAOi6IQABAAAAdgMAAOy6IQABAAAAdwMAAPC6IQABAAAAewMAAPS6IQABAAAAfAMAAPi6IQABAAAAfQMAAPy6IQABAAAAfwMAAAC7IQABAAAAhgMAAAS7IQABAAAAiAMAAAi7IQABAAAAiQMAAAy7IQABAAAAigMAABC7IQABAAAAjAMAABS7IQABAAAAjgMAABi7IQABAAAAjwMAABy7IQABAAAAkQMAACC7IQABAAAAkgMAACS7IQACAAAAkwMAACy7IQABAAAAlAMAADC7IQABAAAAlQMAADS7IQACAAAAlgMAADy7IQABAAAAlwMAAEC7IQABAAAAmAMAAES7IQADAAAAmQMAAFC7IQADAAAAmgMAAFy7IQACAAAAmwMAAGS7IQABAAAAnAMAAGi7IQACAAAAnQMAAHC7IQABAAAAngMAAHS7IQABAAAAnwMAAHi7IQABAAAAoAMAAHy7IQACAAAAoQMAAIS7IQACAAAAowMAAIy7IQACAAAApAMAAJS7IQABAAAApQMAAJi7IQABAAAApgMAAJy7IQACAAAApwMAAKS7IQABAAAAqAMAAKi7IQABAAAAqQMAAKy7IQACAAAAqgMAALS7IQABAAAAqwMAALi7IQABAAAArAMAALy7IQABAAAArQMAAMC7IQABAAAArgMAAMS7IQABAAAArwMAAMi7IQABAAAAsQMAAMy7IQABAAAAsgMAANC7IQACAAAAswMAANi7IQABAAAAtAMAANy7IQABAAAAtQMAAOC7IQACAAAAtgMAAOi7IQABAAAAtwMAAOy7IQABAAAAuAMAAPC7IQADAAAAuQMAAPy7IQADAAAAugMAAAi8IQACAAAAuwMAABC8IQABAAAAvAMAABS8IQACAAAAvQMAABy8IQABAAAAvgMAACC8IQABAAAAvwMAACS8IQABAAAAwAMAACi8IQACAAAAwQMAADC8IQACAAAAwgMAADi8IQACAAAAwwMAAEC8IQACAAAAxAMAAEi8IQABAAAAxQMAAEy8IQABAAAAxgMAAFC8IQACAAAAxwMAAFi8IQABAAAAyAMAAFy8IQABAAAAyQMAAGC8IQACAAAAygMAAGi8IQABAAAAywMAAGy8IQABAAAAzAMAAHC8IQABAAAAzQMAAHS8IQABAAAAzgMAAHi8IQABAAAAzwMAAHy8IQABAAAA0AMAAIC8IQACAAAA0QMAAIi8IQADAAAA1QMAAJS8IQACAAAA1gMAAJy8IQACAAAA1wMAAKS8IQABAAAA2AMAAKi8IQABAAAA2QMAAKy8IQABAAAA2gMAALC8IQABAAAA2wMAALS8IQABAAAA3AMAALi8IQABAAAA3QMAALy8IQABAAAA3gMAAMC8IQABAAAA3wMAAMS8IQABAAAA4AMAAMi8IQABAAAA4QMAAMy8IQABAAAA4gMAANC8IQABAAAA4wMAANS8IQABAAAA5AMAANi8IQABAAAA5QMAANy8IQABAAAA5gMAAOC8IQABAAAA5wMAAOS8IQABAAAA6AMAAOi8IQABAAAA6QMAAOy8IQABAAAA6gMAAPC8IQABAAAA6wMAAPS8IQABAAAA7AMAAPi8IQABAAAA7QMAAPy8IQABAAAA7gMAAAC9IQABAAAA7wMAAAS9IQABAAAA8AMAAAi9IQACAAAA8QMAABC9IQACAAAA8gMAABi9IQABAAAA8wMAABy9IQABAAAA9AMAACC9IQADAAAA9QMAACy9IQACAAAA9wMAADS9IQABAAAA+AMAADi9IQABAAAA+QMAADy9IQABAAAA+gMAAEC9IQABAAAA+wMAAES9IQABAAAA/QMAAEi9IQABAAAA/gMAAEy9IQABAAAA/wMAAFC9IQABAAAAAAQAAFS9IQABAAAAAQQAAFi9IQABAAAAAgQAAFy9IQABAAAAAwQAAGC9IQABAAAABAQAAGS9IQABAAAABQQAAGi9IQABAAAABgQAAGy9IQABAAAABwQAAHC9IQABAAAACAQAAHS9IQABAAAACQQAAHi9IQABAAAACgQAAHy9IQABAAAACwQAAIC9IQABAAAADAQAAIS9IQABAAAADQQAAIi9IQABAAAADgQAAIy9IQABAAAADwQAAJC9IQABAAAAEAQAAJS9IQABAAAAEQQAAJi9IQABAAAAEgQAAJy9IQACAAAAEwQAAKS9IQABAAAAFAQAAKi9IQACAAAAFQQAALC9IQABAAAAFgQAALS9IQABAAAAFwQAALi9IQABAAAAGAQAALy9IQABAAAAGQQAAMC9IQABAAAAGgQAAMS9IQABAAAAGwQAAMi9IQABAAAAHAQAAMy9IQABAAAAHQQAANC9IQABAAAAHgQAANS9IQACAAAAHwQAANy9IQABAAAAIAQAAOC9IQABAAAAIQQAAOS9IQACAAAAIgQAAOy9IQADAAAAIwQAAPi9IQABAAAAJAQAAPy9IQABAAAAJQQAAAC+IQABAAAAJgQAAAS+IQABAAAAJwQAAAi+IQABAAAAKAQAAAy+IQABAAAAKQQAABC+IQABAAAAKgQAABS+IQACAAAAKwQAABy+IQABAAAALAQAACC+IQABAAAALQQAACS+IQABAAAALgQAACi+IQABAAAALwQAACy+IQABAAAAMAQAADC+IQABAAAAMQQAADS+IQABAAAAMgQAADi+IQACAAAAMwQAAEC+IQABAAAANAQAAES+IQACAAAANQQAAEy+IQABAAAANgQAAFC+IQABAAAANwQAAFS+IQABAAAAOAQAAFi+IQABAAAAOQQAAFy+IQABAAAAOgQAAGC+IQABAAAAOwQAAGS+IQABAAAAPAQAAGi+IQABAAAAPQQAAGy+IQABAAAAPgQAAHC+IQACAAAAPwQAAHi+IQABAAAAQAQAAHy+IQABAAAAQQQAAIC+IQACAAAAQgQAAIi+IQADAAAAQwQAAJS+IQABAAAARAQAAJi+IQABAAAARQQAAJy+IQABAAAARgQAAKC+IQABAAAARwQAAKS+IQABAAAASAQAAKi+IQABAAAASQQAAKy+IQABAAAASgQAALC+IQACAAAASwQAALi+IQABAAAATAQAALy+IQABAAAATQQAAMC+IQABAAAATgQAAMS+IQABAAAATwQAAMi+IQABAAAAUAQAAMy+IQABAAAAUQQAANC+IQABAAAAUgQAANS+IQABAAAAUwQAANi+IQABAAAAVAQAANy+IQABAAAAVQQAAOC+IQABAAAAVgQAAOS+IQABAAAAVwQAAOi+IQABAAAAWAQAAOy+IQABAAAAWQQAAPC+IQABAAAAWgQAAPS+IQABAAAAWwQAAPi+IQABAAAAXAQAAPy+IQABAAAAXQQAAAC/IQABAAAAXgQAAAS/IQABAAAAXwQAAAi/IQABAAAAYAQAAAy/IQABAAAAYQQAABC/IQABAAAAYgQAABS/IQACAAAAYwQAABy/IQACAAAAZAQAACS/IQABAAAAZQQAACi/IQABAAAAZgQAACy/IQABAAAAZwQAADC/IQABAAAAaAQAADS/IQABAAAAaQQAADi/IQABAAAAagQAADy/IQABAAAAawQAAEC/IQABAAAAbAQAAES/IQABAAAAbQQAAEi/IQABAAAAbgQAAEy/IQABAAAAbwQAAFC/IQABAAAAcAQAAFS/IQABAAAAcQQAAFi/IQABAAAAcgQAAFy/IQABAAAAcwQAAGC/IQABAAAAdAQAAGS/IQABAAAAdQQAAGi/IQABAAAAdgQAAGy/IQABAAAAdwQAAHC/IQABAAAAeAQAAHS/IQABAAAAeQQAAHi/IQABAAAAegQAAHy/IQABAAAAewQAAIC/IQABAAAAfAQAAIS/IQABAAAAfQQAAIi/IQABAAAAfgQAAIy/IQABAAAAfwQAAJC/IQABAAAAgAQAAJS/IQABAAAAgQQAAJi/IQABAAAAigQAAJy/IQABAAAAiwQAAKC/IQABAAAAjAQAAKS/IQABAAAAjQQAAKi/IQABAAAAjgQAAKy/IQABAAAAjwQAALC/IQABAAAAkAQAALS/IQABAAAAkQQAALi/IQABAAAAkgQAALy/IQABAAAAkwQAAMC/IQABAAAAlAQAAMS/IQABAAAAlQQAAMi/IQABAAAAlgQAAMy/IQABAAAAlwQAANC/IQABAAAAmAQAANS/IQABAAAAmQQAANi/IQABAAAAmgQAANy/IQABAAAAmwQAAOC/IQABAAAAnAQAAOS/IQABAAAAnQQAAOi/IQABAAAAngQAAOy/IQABAAAAnwQAAPC/IQABAAAAoAQAAPS/IQABAAAAoQQAAPi/IQABAAAAogQAAPy/IQABAAAAowQAAADAIQABAAAApAQAAATAIQABAAAApQQAAAjAIQABAAAApgQAAAzAIQABAAAApwQAABDAIQABAAAAqAQAABTAIQABAAAAqQQAABjAIQABAAAAqgQAABzAIQABAAAAqwQAACDAIQABAAAArAQAACTAIQABAAAArQQAACjAIQABAAAArgQAACzAIQABAAAArwQAADDAIQABAAAAsAQAADTAIQABAAAAsQQAADjAIQABAAAAsgQAADzAIQABAAAAswQAAEDAIQABAAAAtAQAAETAIQABAAAAtQQAAEjAIQABAAAAtgQAAEzAIQABAAAAtwQAAFDAIQABAAAAuAQAAFTAIQABAAAAuQQAAFjAIQABAAAAugQAAFzAIQABAAAAuwQAAGDAIQABAAAAvAQAAGTAIQABAAAAvQQAAGjAIQABAAAAvgQAAGzAIQABAAAAvwQAAHDAIQABAAAAwAQAAHTAIQABAAAAwQQAAHjAIQABAAAAwgQAAHzAIQABAAAAwwQAAIDAIQABAAAAxAQAAITAIQABAAAAxQQAAIjAIQABAAAAxgQAAIzAIQABAAAAxwQAAJDAIQABAAAAyAQAAJTAIQABAAAAyQQAAJjAIQABAAAAygQAAJzAIQABAAAAywQAAKDAIQABAAAAzAQAAKTAIQABAAAAzQQAAKjAIQABAAAAzgQAAKzAIQABAAAAzwQAALDAIQABAAAA0AQAALTAIQABAAAA0QQAALjAIQABAAAA0gQAALzAIQABAAAA0wQAAMDAIQABAAAA1AQAAMTAIQABAAAA1QQAAMjAIQABAAAA1gQAAMzAIQABAAAA1wQAANDAIQABAAAA2AQAANTAIQABAAAA2QQAANjAIQABAAAA2gQAANzAIQABAAAA2wQAAODAIQABAAAA3AQAAOTAIQABAAAA3QQAAOjAIQABAAAA3gQAAOzAIQABAAAA3wQAAPDAIQABAAAA4AQAAPTAIQABAAAA4QQAAPjAIQABAAAA4gQAAPzAIQABAAAA4wQAAADBIQABAAAA5AQAAATBIQABAAAA5QQAAAjBIQABAAAA5gQAAAzBIQABAAAA5wQAABDBIQABAAAA6AQAABTBIQABAAAA6QQAABjBIQABAAAA6gQAABzBIQABAAAA6wQAACDBIQABAAAA7AQAACTBIQABAAAA7QQAACjBIQABAAAA7gQAACzBIQABAAAA7wQAADDBIQABAAAA8AQAADTBIQABAAAA8QQAADjBIQABAAAA8gQAADzBIQABAAAA8wQAAEDBIQABAAAA9AQAAETBIQABAAAA9QQAAEjBIQABAAAA9gQAAEzBIQABAAAA9wQAAFDBIQABAAAA+AQAAFTBIQABAAAA+QQAAFjBIQABAAAA+gQAAFzBIQABAAAA+wQAAGDBIQABAAAA/AQAAGTBIQABAAAA/QQAAGjBIQABAAAA/gQAAGzBIQABAAAA/wQAAHDBIQABAAAAAAUAAHTBIQABAAAAAQUAAHjBIQABAAAAAgUAAHzBIQABAAAAAwUAAIDBIQABAAAABAUAAITBIQABAAAABQUAAIjBIQABAAAABgUAAIzBIQABAAAABwUAAJDBIQABAAAACAUAAJTBIQABAAAACQUAAJjBIQABAAAACgUAAJzBIQABAAAACwUAAKDBIQABAAAADAUAAKTBIQABAAAADQUAAKjBIQABAAAADgUAAKzBIQABAAAADwUAALDBIQABAAAAEAUAALTBIQABAAAAEQUAALjBIQABAAAAEgUAALzBIQABAAAAEwUAAMDBIQABAAAAFAUAAMTBIQABAAAAFQUAAMjBIQABAAAAFgUAAMzBIQABAAAAFwUAANDBIQABAAAAGAUAANTBIQABAAAAGQUAANjBIQABAAAAGgUAANzBIQABAAAAGwUAAODBIQABAAAAHAUAAOTBIQABAAAAHQUAAOjBIQABAAAAHgUAAOzBIQABAAAAHwUAAPDBIQABAAAAIAUAAPTBIQABAAAAIQUAAPjBIQABAAAAIgUAAPzBIQABAAAAIwUAAADCIQABAAAAJAUAAATCIQABAAAAJQUAAAjCIQABAAAAJgUAAAzCIQABAAAAJwUAABDCIQABAAAAKAUAABTCIQABAAAAKQUAABjCIQABAAAAKgUAABzCIQABAAAAKwUAACDCIQABAAAALAUAACTCIQABAAAALQUAACjCIQABAAAALgUAACzCIQABAAAALwUAADDCIQABAAAAMQUAADTCIQABAAAAMgUAADjCIQABAAAAMwUAADzCIQABAAAANAUAAEDCIQABAAAANQUAAETCIQABAAAANgUAAEjCIQABAAAANwUAAEzCIQABAAAAOAUAAFDCIQABAAAAOQUAAFTCIQABAAAAOgUAAFjCIQABAAAAOwUAAFzCIQABAAAAPAUAAGDCIQABAAAAPQUAAGTCIQABAAAAPgUAAGjCIQABAAAAPwUAAGzCIQABAAAAQAUAAHDCIQABAAAAQQUAAHTCIQABAAAAQgUAAHjCIQABAAAAQwUAAHzCIQABAAAARAUAAIDCIQABAAAARQUAAITCIQABAAAARgUAAIjCIQABAAAARwUAAIzCIQABAAAASAUAAJDCIQABAAAASQUAAJTCIQABAAAASgUAAJjCIQABAAAASwUAAJzCIQABAAAATAUAAKDCIQABAAAATQUAAKTCIQABAAAATgUAAKjCIQABAAAATwUAAKzCIQABAAAAUAUAALDCIQABAAAAUQUAALTCIQABAAAAUgUAALjCIQABAAAAUwUAALzCIQABAAAAVAUAAMDCIQABAAAAVQUAAMTCIQABAAAAVgUAAMjCIQABAAAAYQUAAMzCIQABAAAAYgUAANDCIQABAAAAYwUAANTCIQABAAAAZAUAANjCIQABAAAAZQUAANzCIQABAAAAZgUAAODCIQABAAAAZwUAAOTCIQABAAAAaAUAAOjCIQABAAAAaQUAAOzCIQABAAAAagUAAPDCIQABAAAAawUAAPTCIQABAAAAbAUAAPjCIQABAAAAbQUAAPzCIQABAAAAbgUAAADDIQABAAAAbwUAAATDIQABAAAAcAUAAAjDIQABAAAAcQUAAAzDIQABAAAAcgUAABDDIQABAAAAcwUAABTDIQABAAAAdAUAABjDIQABAAAAdQUAABzDIQABAAAAdgUAACDDIQABAAAAdwUAACTDIQABAAAAeAUAACjDIQABAAAAeQUAACzDIQABAAAAegUAADDDIQABAAAAewUAADTDIQABAAAAfAUAADjDIQABAAAAfQUAADzDIQABAAAAfgUAAEDDIQABAAAAfwUAAETDIQABAAAAgAUAAEjDIQABAAAAgQUAAEzDIQABAAAAggUAAFDDIQABAAAAgwUAAFTDIQABAAAAhAUAAFjDIQABAAAAhQUAAFzDIQABAAAAhgUAAGDDIQABAAAAoBAAAGTDIQABAAAAoRAAAGjDIQABAAAAohAAAGzDIQABAAAAoxAAAHDDIQABAAAApBAAAHTDIQABAAAApRAAAHjDIQABAAAAphAAAHzDIQABAAAApxAAAIDDIQABAAAAqBAAAITDIQABAAAAqRAAAIjDIQABAAAAqhAAAIzDIQABAAAAqxAAAJDDIQABAAAArBAAAJTDIQABAAAArRAAAJjDIQABAAAArhAAAJzDIQABAAAArxAAAKDDIQABAAAAsBAAAKTDIQABAAAAsRAAAKjDIQABAAAAshAAAKzDIQABAAAAsxAAALDDIQABAAAAtBAAALTDIQABAAAAtRAAALjDIQABAAAAthAAALzDIQABAAAAtxAAAMDDIQABAAAAuBAAAMTDIQABAAAAuRAAAMjDIQABAAAAuhAAAMzDIQABAAAAuxAAANDDIQABAAAAvBAAANTDIQABAAAAvRAAANjDIQABAAAAvhAAANzDIQABAAAAvxAAAODDIQABAAAAwBAAAOTDIQABAAAAwRAAAOjDIQABAAAAwhAAAOzDIQABAAAAwxAAAPDDIQABAAAAxBAAAPTDIQABAAAAxRAAAPjDIQABAAAAxxAAAPzDIQABAAAAzRAAAADEIQABAAAA0BAAAATEIQABAAAA0RAAAAjEIQABAAAA0hAAAAzEIQABAAAA0xAAABDEIQABAAAA1BAAABTEIQABAAAA1RAAABjEIQABAAAA1hAAABzEIQABAAAA1xAAACDEIQABAAAA2BAAACTEIQABAAAA2RAAACjEIQABAAAA2hAAACzEIQABAAAA2xAAADDEIQABAAAA3BAAADTEIQABAAAA3RAAADjEIQABAAAA3hAAADzEIQABAAAA3xAAAEDEIQABAAAA4BAAAETEIQABAAAA4RAAAEjEIQABAAAA4hAAAEzEIQABAAAA4xAAAFDEIQABAAAA5BAAAFTEIQABAAAA5RAAAFjEIQABAAAA5hAAAFzEIQABAAAA5xAAAGDEIQABAAAA6BAAAGTEIQABAAAA6RAAAGjEIQABAAAA6hAAAGzEIQABAAAA6xAAAHDEIQABAAAA7BAAAHTEIQABAAAA7RAAAHjEIQABAAAA7hAAAHzEIQABAAAA7xAAAIDEIQABAAAA8BAAAITEIQABAAAA8RAAAIjEIQABAAAA8hAAAIzEIQABAAAA8xAAAJDEIQABAAAA9BAAAJTEIQABAAAA9RAAAJjEIQABAAAA9hAAAJzEIQABAAAA9xAAAKDEIQABAAAA+BAAAKTEIQABAAAA+RAAAKjEIQABAAAA+hAAAKzEIQABAAAA/RAAALDEIQABAAAA/hAAALTEIQABAAAA/xAAALjEIQABAAAAoBMAALzEIQABAAAAoRMAAMDEIQABAAAAohMAAMTEIQABAAAAoxMAAMjEIQABAAAApBMAAMzEIQABAAAApRMAANDEIQABAAAAphMAANTEIQABAAAApxMAANjEIQABAAAAqBMAANzEIQABAAAAqRMAAODEIQABAAAAqhMAAOTEIQABAAAAqxMAAOjEIQABAAAArBMAAOzEIQABAAAArRMAAPDEIQABAAAArhMAAPTEIQABAAAArxMAAPjEIQABAAAAsBMAAPzEIQABAAAAsRMAAADFIQABAAAAshMAAATFIQABAAAAsxMAAAjFIQABAAAAtBMAAAzFIQABAAAAtRMAABDFIQABAAAAthMAABTFIQABAAAAtxMAABjFIQABAAAAuBMAABzFIQABAAAAuRMAACDFIQABAAAAuhMAACTFIQABAAAAuxMAACjFIQABAAAAvBMAACzFIQABAAAAvRMAADDFIQABAAAAvhMAADTFIQABAAAAvxMAADjFIQABAAAAwBMAADzFIQABAAAAwRMAAEDFIQABAAAAwhMAAETFIQABAAAAwxMAAEjFIQABAAAAxBMAAEzFIQABAAAAxRMAAFDFIQABAAAAxhMAAFTFIQABAAAAxxMAAFjFIQABAAAAyBMAAFzFIQABAAAAyRMAAGDFIQABAAAAyhMAAGTFIQABAAAAyxMAAGjFIQABAAAAzBMAAGzFIQABAAAAzRMAAHDFIQABAAAAzhMAAHTFIQABAAAAzxMAAHjFIQABAAAA0BMAAHzFIQABAAAA0RMAAIDFIQABAAAA0hMAAITFIQABAAAA0xMAAIjFIQABAAAA1BMAAIzFIQABAAAA1RMAAJDFIQABAAAA1hMAAJTFIQABAAAA1xMAAJjFIQABAAAA2BMAAJzFIQABAAAA2RMAAKDFIQABAAAA2hMAAKTFIQABAAAA2xMAAKjFIQABAAAA3BMAAKzFIQABAAAA3RMAALDFIQABAAAA3hMAALTFIQABAAAA3xMAALjFIQABAAAA4BMAALzFIQABAAAA4RMAAMDFIQABAAAA4hMAAMTFIQABAAAA4xMAAMjFIQABAAAA5BMAAMzFIQABAAAA5RMAANDFIQABAAAA5hMAANTFIQABAAAA5xMAANjFIQABAAAA6BMAANzFIQABAAAA6RMAAODFIQABAAAA6hMAAOTFIQABAAAA6xMAAOjFIQABAAAA7BMAAOzFIQABAAAA7RMAAPDFIQABAAAA7hMAAPTFIQABAAAA7xMAAPjFIQABAAAA8BMAAPzFIQABAAAA8RMAAADGIQABAAAA8hMAAATGIQABAAAA8xMAAAjGIQABAAAA9BMAAAzGIQABAAAA9RMAABDGIQABAAAA+BMAABTGIQABAAAA+RMAABjGIQABAAAA+hMAABzGIQABAAAA+xMAACDGIQABAAAA/BMAACTGIQABAAAA/RMAACjGIQABAAAAgBwAACzGIQACAAAAgRwAADTGIQACAAAAghwAADzGIQACAAAAgxwAAETGIQACAAAAhBwAAEzGIQADAAAAhRwAAFjGIQADAAAAhhwAAGTGIQACAAAAhxwAAGzGIQACAAAAiBwAAHTGIQACAAAAkBwAAHzGIQABAAAAkRwAAIDGIQABAAAAkhwAAITGIQABAAAAkxwAAIjGIQABAAAAlBwAAIzGIQABAAAAlRwAAJDGIQABAAAAlhwAAJTGIQABAAAAlxwAAJjGIQABAAAAmBwAAJzGIQABAAAAmRwAAKDGIQABAAAAmhwAAKTGIQABAAAAmxwAAKjGIQABAAAAnBwAAKzGIQABAAAAnRwAALDGIQABAAAAnhwAALTGIQABAAAAnxwAALjGIQABAAAAoBwAALzGIQABAAAAoRwAAMDGIQABAAAAohwAAMTGIQABAAAAoxwAAMjGIQABAAAApBwAAMzGIQABAAAApRwAANDGIQABAAAAphwAANTGIQABAAAApxwAANjGIQABAAAAqBwAANzGIQABAAAAqRwAAODGIQABAAAAqhwAAOTGIQABAAAAqxwAAOjGIQABAAAArBwAAOzGIQABAAAArRwAAPDGIQABAAAArhwAAPTGIQABAAAArxwAAPjGIQABAAAAsBwAAPzGIQABAAAAsRwAAADHIQABAAAAshwAAATHIQABAAAAsxwAAAjHIQABAAAAtBwAAAzHIQABAAAAtRwAABDHIQABAAAAthwAABTHIQABAAAAtxwAABjHIQABAAAAuBwAABzHIQABAAAAuRwAACDHIQABAAAAuhwAACTHIQABAAAAvRwAACjHIQABAAAAvhwAACzHIQABAAAAvxwAADDHIQABAAAAeR0AADTHIQABAAAAfR0AADjHIQABAAAAjh0AADzHIQABAAAAAB4AAEDHIQABAAAAAR4AAETHIQABAAAAAh4AAEjHIQABAAAAAx4AAEzHIQABAAAABB4AAFDHIQABAAAABR4AAFTHIQABAAAABh4AAFjHIQABAAAABx4AAFzHIQABAAAACB4AAGDHIQABAAAACR4AAGTHIQABAAAACh4AAGjHIQABAAAACx4AAGzHIQABAAAADB4AAHDHIQABAAAADR4AAHTHIQABAAAADh4AAHjHIQABAAAADx4AAHzHIQABAAAAEB4AAIDHIQABAAAAER4AAITHIQABAAAAEh4AAIjHIQABAAAAEx4AAIzHIQABAAAAFB4AAJDHIQABAAAAFR4AAJTHIQABAAAAFh4AAJjHIQABAAAAFx4AAJzHIQABAAAAGB4AAKDHIQABAAAAGR4AAKTHIQABAAAAGh4AAKjHIQABAAAAGx4AAKzHIQABAAAAHB4AALDHIQABAAAAHR4AALTHIQABAAAAHh4AALjHIQABAAAAHx4AALzHIQABAAAAIB4AAMDHIQABAAAAIR4AAMTHIQABAAAAIh4AAMjHIQABAAAAIx4AAMzHIQABAAAAJB4AANDHIQABAAAAJR4AANTHIQABAAAAJh4AANjHIQABAAAAJx4AANzHIQABAAAAKB4AAODHIQABAAAAKR4AAOTHIQABAAAAKh4AAOjHIQABAAAAKx4AAOzHIQABAAAALB4AAPDHIQABAAAALR4AAPTHIQABAAAALh4AAPjHIQABAAAALx4AAPzHIQABAAAAMB4AAADIIQABAAAAMR4AAATIIQABAAAAMh4AAAjIIQABAAAAMx4AAAzIIQABAAAANB4AABDIIQABAAAANR4AABTIIQABAAAANh4AABjIIQABAAAANx4AABzIIQABAAAAOB4AACDIIQABAAAAOR4AACTIIQABAAAAOh4AACjIIQABAAAAOx4AACzIIQABAAAAPB4AADDIIQABAAAAPR4AADTIIQABAAAAPh4AADjIIQABAAAAPx4AADzIIQABAAAAQB4AAEDIIQABAAAAQR4AAETIIQABAAAAQh4AAEjIIQABAAAAQx4AAEzIIQABAAAARB4AAFDIIQABAAAARR4AAFTIIQABAAAARh4AAFjIIQABAAAARx4AAFzIIQABAAAASB4AAGDIIQABAAAASR4AAGTIIQABAAAASh4AAGjIIQABAAAASx4AAGzIIQABAAAATB4AAHDIIQABAAAATR4AAHTIIQABAAAATh4AAHjIIQABAAAATx4AAHzIIQABAAAAUB4AAIDIIQABAAAAUR4AAITIIQABAAAAUh4AAIjIIQABAAAAUx4AAIzIIQABAAAAVB4AAJDIIQABAAAAVR4AAJTIIQABAAAAVh4AAJjIIQABAAAAVx4AAJzIIQABAAAAWB4AAKDIIQABAAAAWR4AAKTIIQABAAAAWh4AAKjIIQABAAAAWx4AAKzIIQABAAAAXB4AALDIIQABAAAAXR4AALTIIQABAAAAXh4AALjIIQABAAAAXx4AALzIIQABAAAAYB4AAMDIIQACAAAAYR4AAMjIIQACAAAAYh4AANDIIQABAAAAYx4AANTIIQABAAAAZB4AANjIIQABAAAAZR4AANzIIQABAAAAZh4AAODIIQABAAAAZx4AAOTIIQABAAAAaB4AAOjIIQABAAAAaR4AAOzIIQABAAAAah4AAPDIIQABAAAAax4AAPTIIQABAAAAbB4AAPjIIQABAAAAbR4AAPzIIQABAAAAbh4AAADJIQABAAAAbx4AAATJIQABAAAAcB4AAAjJIQABAAAAcR4AAAzJIQABAAAAch4AABDJIQABAAAAcx4AABTJIQABAAAAdB4AABjJIQABAAAAdR4AABzJIQABAAAAdh4AACDJIQABAAAAdx4AACTJIQABAAAAeB4AACjJIQABAAAAeR4AACzJIQABAAAAeh4AADDJIQABAAAAex4AADTJIQABAAAAfB4AADjJIQABAAAAfR4AADzJIQABAAAAfh4AAEDJIQABAAAAfx4AAETJIQABAAAAgB4AAEjJIQABAAAAgR4AAEzJIQABAAAAgh4AAFDJIQABAAAAgx4AAFTJIQABAAAAhB4AAFjJIQABAAAAhR4AAFzJIQABAAAAhh4AAGDJIQABAAAAhx4AAGTJIQABAAAAiB4AAGjJIQABAAAAiR4AAGzJIQABAAAAih4AAHDJIQABAAAAix4AAHTJIQABAAAAjB4AAHjJIQABAAAAjR4AAHzJIQABAAAAjh4AAIDJIQABAAAAjx4AAITJIQABAAAAkB4AAIjJIQABAAAAkR4AAIzJIQABAAAAkh4AAJDJIQABAAAAkx4AAJTJIQABAAAAlB4AAJjJIQABAAAAlR4AAJzJIQABAAAAmx4AAKDJIQACAAAAnh4AAKjJIQABAAAAoB4AAKzJIQABAAAAoR4AALDJIQABAAAAoh4AALTJIQABAAAAox4AALjJIQABAAAApB4AALzJIQABAAAApR4AAMDJIQABAAAAph4AAMTJIQABAAAApx4AAMjJIQABAAAAqB4AAMzJIQABAAAAqR4AANDJIQABAAAAqh4AANTJIQABAAAAqx4AANjJIQABAAAArB4AANzJIQABAAAArR4AAODJIQABAAAArh4AAOTJIQABAAAArx4AAOjJIQABAAAAsB4AAOzJIQABAAAAsR4AAPDJIQABAAAAsh4AAPTJIQABAAAAsx4AAPjJIQABAAAAtB4AAPzJIQABAAAAtR4AAADKIQABAAAAth4AAATKIQABAAAAtx4AAAjKIQABAAAAuB4AAAzKIQABAAAAuR4AABDKIQABAAAAuh4AABTKIQABAAAAux4AABjKIQABAAAAvB4AABzKIQABAAAAvR4AACDKIQABAAAAvh4AACTKIQABAAAAvx4AACjKIQABAAAAwB4AACzKIQABAAAAwR4AADDKIQABAAAAwh4AADTKIQABAAAAwx4AADjKIQABAAAAxB4AADzKIQABAAAAxR4AAEDKIQABAAAAxh4AAETKIQABAAAAxx4AAEjKIQABAAAAyB4AAEzKIQABAAAAyR4AAFDKIQABAAAAyh4AAFTKIQABAAAAyx4AAFjKIQABAAAAzB4AAFzKIQABAAAAzR4AAGDKIQABAAAAzh4AAGTKIQABAAAAzx4AAGjKIQABAAAA0B4AAGzKIQABAAAA0R4AAHDKIQABAAAA0h4AAHTKIQABAAAA0x4AAHjKIQABAAAA1B4AAHzKIQABAAAA1R4AAIDKIQABAAAA1h4AAITKIQABAAAA1x4AAIjKIQABAAAA2B4AAIzKIQABAAAA2R4AAJDKIQABAAAA2h4AAJTKIQABAAAA2x4AAJjKIQABAAAA3B4AAJzKIQABAAAA3R4AAKDKIQABAAAA3h4AAKTKIQABAAAA3x4AAKjKIQABAAAA4B4AAKzKIQABAAAA4R4AALDKIQABAAAA4h4AALTKIQABAAAA4x4AALjKIQABAAAA5B4AALzKIQABAAAA5R4AAMDKIQABAAAA5h4AAMTKIQABAAAA5x4AAMjKIQABAAAA6B4AAMzKIQABAAAA6R4AANDKIQABAAAA6h4AANTKIQABAAAA6x4AANjKIQABAAAA7B4AANzKIQABAAAA7R4AAODKIQABAAAA7h4AAOTKIQABAAAA7x4AAOjKIQABAAAA8B4AAOzKIQABAAAA8R4AAPDKIQABAAAA8h4AAPTKIQABAAAA8x4AAPjKIQABAAAA9B4AAPzKIQABAAAA9R4AAADLIQABAAAA9h4AAATLIQABAAAA9x4AAAjLIQABAAAA+B4AAAzLIQABAAAA+R4AABDLIQABAAAA+h4AABTLIQABAAAA+x4AABjLIQABAAAA/B4AABzLIQABAAAA/R4AACDLIQABAAAA/h4AACTLIQABAAAA/x4AACjLIQABAAAAAB8AACzLIQABAAAAAR8AADDLIQABAAAAAh8AADTLIQABAAAAAx8AADjLIQABAAAABB8AADzLIQABAAAABR8AAEDLIQABAAAABh8AAETLIQABAAAABx8AAEjLIQABAAAACB8AAEzLIQABAAAACR8AAFDLIQABAAAACh8AAFTLIQABAAAACx8AAFjLIQABAAAADB8AAFzLIQABAAAADR8AAGDLIQABAAAADh8AAGTLIQABAAAADx8AAGjLIQABAAAAEB8AAGzLIQABAAAAER8AAHDLIQABAAAAEh8AAHTLIQABAAAAEx8AAHjLIQABAAAAFB8AAHzLIQABAAAAFR8AAIDLIQABAAAAGB8AAITLIQABAAAAGR8AAIjLIQABAAAAGh8AAIzLIQABAAAAGx8AAJDLIQABAAAAHB8AAJTLIQABAAAAHR8AAJjLIQABAAAAIB8AAJzLIQABAAAAIR8AAKDLIQABAAAAIh8AAKTLIQABAAAAIx8AAKjLIQABAAAAJB8AAKzLIQABAAAAJR8AALDLIQABAAAAJh8AALTLIQABAAAAJx8AALjLIQABAAAAKB8AALzLIQABAAAAKR8AAMDLIQABAAAAKh8AAMTLIQABAAAAKx8AAMjLIQABAAAALB8AAMzLIQABAAAALR8AANDLIQABAAAALh8AANTLIQABAAAALx8AANjLIQABAAAAMB8AANzLIQABAAAAMR8AAODLIQABAAAAMh8AAOTLIQABAAAAMx8AAOjLIQABAAAANB8AAOzLIQABAAAANR8AAPDLIQABAAAANh8AAPTLIQABAAAANx8AAPjLIQABAAAAOB8AAPzLIQABAAAAOR8AAADMIQABAAAAOh8AAATMIQABAAAAOx8AAAjMIQABAAAAPB8AAAzMIQABAAAAPR8AABDMIQABAAAAPh8AABTMIQABAAAAPx8AABjMIQABAAAAQB8AABzMIQABAAAAQR8AACDMIQABAAAAQh8AACTMIQABAAAAQx8AACjMIQABAAAARB8AACzMIQABAAAARR8AADDMIQABAAAASB8AADTMIQABAAAASR8AADjMIQABAAAASh8AADzMIQABAAAASx8AAEDMIQABAAAATB8AAETMIQABAAAATR8AAEjMIQABAAAAUR8AAEzMIQABAAAAUx8AAFDMIQABAAAAVR8AAFTMIQABAAAAVx8AAFjMIQABAAAAWR8AAFzMIQABAAAAWx8AAGDMIQABAAAAXR8AAGTMIQABAAAAXx8AAGjMIQABAAAAYB8AAGzMIQABAAAAYR8AAHDMIQABAAAAYh8AAHTMIQABAAAAYx8AAHjMIQABAAAAZB8AAHzMIQABAAAAZR8AAIDMIQABAAAAZh8AAITMIQABAAAAZx8AAIjMIQABAAAAaB8AAIzMIQABAAAAaR8AAJDMIQABAAAAah8AAJTMIQABAAAAax8AAJjMIQABAAAAbB8AAJzMIQABAAAAbR8AAKDMIQABAAAAbh8AAKTMIQABAAAAbx8AAKjMIQABAAAAcB8AAKzMIQABAAAAcR8AALDMIQABAAAAch8AALTMIQABAAAAcx8AALjMIQABAAAAdB8AALzMIQABAAAAdR8AAMDMIQABAAAAdh8AAMTMIQABAAAAdx8AAMjMIQABAAAAeB8AAMzMIQABAAAAeR8AANDMIQABAAAAeh8AANTMIQABAAAAex8AANjMIQABAAAAfB8AANzMIQABAAAAfR8AAODMIQABAAAAgB8AAOTMIQABAAAAgR8AAOjMIQABAAAAgh8AAOzMIQABAAAAgx8AAPDMIQABAAAAhB8AAPTMIQABAAAAhR8AAPjMIQABAAAAhh8AAPzMIQABAAAAhx8AAADNIQABAAAAiB8AAATNIQABAAAAiR8AAAjNIQABAAAAih8AAAzNIQABAAAAix8AABDNIQABAAAAjB8AABTNIQABAAAAjR8AABjNIQABAAAAjh8AABzNIQABAAAAjx8AACDNIQABAAAAkB8AACTNIQABAAAAkR8AACjNIQABAAAAkh8AACzNIQABAAAAkx8AADDNIQABAAAAlB8AADTNIQABAAAAlR8AADjNIQABAAAAlh8AADzNIQABAAAAlx8AAEDNIQABAAAAmB8AAETNIQABAAAAmR8AAEjNIQABAAAAmh8AAEzNIQABAAAAmx8AAFDNIQABAAAAnB8AAFTNIQABAAAAnR8AAFjNIQABAAAAnh8AAFzNIQABAAAAnx8AAGDNIQABAAAAoB8AAGTNIQABAAAAoR8AAGjNIQABAAAAoh8AAGzNIQABAAAAox8AAHDNIQABAAAApB8AAHTNIQABAAAApR8AAHjNIQABAAAAph8AAHzNIQABAAAApx8AAIDNIQABAAAAqB8AAITNIQABAAAAqR8AAIjNIQABAAAAqh8AAIzNIQABAAAAqx8AAJDNIQABAAAArB8AAJTNIQABAAAArR8AAJjNIQABAAAArh8AAJzNIQABAAAArx8AAKDNIQABAAAAsB8AAKTNIQABAAAAsR8AAKjNIQABAAAAsx8AAKzNIQABAAAAuB8AALDNIQABAAAAuR8AALTNIQABAAAAuh8AALjNIQABAAAAux8AALzNIQABAAAAvB8AAMDNIQABAAAAvh8AAMTNIQADAAAAwx8AANDNIQABAAAAyB8AANTNIQABAAAAyR8AANjNIQABAAAAyh8AANzNIQABAAAAyx8AAODNIQABAAAAzB8AAOTNIQABAAAA0B8AAOjNIQABAAAA0R8AAOzNIQABAAAA2B8AAPDNIQABAAAA2R8AAPTNIQABAAAA2h8AAPjNIQABAAAA2x8AAPzNIQABAAAA4B8AAADOIQABAAAA4R8AAATOIQABAAAA5R8AAAjOIQABAAAA6B8AAAzOIQABAAAA6R8AABDOIQABAAAA6h8AABTOIQABAAAA6x8AABjOIQABAAAA7B8AABzOIQABAAAA8x8AACDOIQABAAAA+B8AACTOIQABAAAA+R8AACjOIQABAAAA+h8AACzOIQABAAAA+x8AADDOIQABAAAA/B8AADTOIQABAAAAJiEAADjOIQACAAAAKiEAAEDOIQACAAAAKyEAAEjOIQACAAAAMiEAAFDOIQABAAAATiEAAFTOIQABAAAAYCEAAFjOIQABAAAAYSEAAFzOIQABAAAAYiEAAGDOIQABAAAAYyEAAGTOIQABAAAAZCEAAGjOIQABAAAAZSEAAGzOIQABAAAAZiEAAHDOIQABAAAAZyEAAHTOIQABAAAAaCEAAHjOIQABAAAAaSEAAHzOIQABAAAAaiEAAIDOIQABAAAAayEAAITOIQABAAAAbCEAAIjOIQABAAAAbSEAAIzOIQABAAAAbiEAAJDOIQABAAAAbyEAAJTOIQABAAAAcCEAAJjOIQABAAAAcSEAAJzOIQABAAAAciEAAKDOIQABAAAAcyEAAKTOIQABAAAAdCEAAKjOIQABAAAAdSEAAKzOIQABAAAAdiEAALDOIQABAAAAdyEAALTOIQABAAAAeCEAALjOIQABAAAAeSEAALzOIQABAAAAeiEAAMDOIQABAAAAeyEAAMTOIQABAAAAfCEAAMjOIQABAAAAfSEAAMzOIQABAAAAfiEAANDOIQABAAAAfyEAANTOIQABAAAAgyEAANjOIQABAAAAhCEAANzOIQABAAAAtiQAAODOIQABAAAAtyQAAOTOIQABAAAAuCQAAOjOIQABAAAAuSQAAOzOIQABAAAAuiQAAPDOIQABAAAAuyQAAPTOIQABAAAAvCQAAPjOIQABAAAAvSQAAPzOIQABAAAAviQAAADPIQABAAAAvyQAAATPIQABAAAAwCQAAAjPIQABAAAAwSQAAAzPIQABAAAAwiQAABDPIQABAAAAwyQAABTPIQABAAAAxCQAABjPIQABAAAAxSQAABzPIQABAAAAxiQAACDPIQABAAAAxyQAACTPIQABAAAAyCQAACjPIQABAAAAySQAACzPIQABAAAAyiQAADDPIQABAAAAyyQAADTPIQABAAAAzCQAADjPIQABAAAAzSQAADzPIQABAAAAziQAAEDPIQABAAAAzyQAAETPIQABAAAA0CQAAEjPIQABAAAA0SQAAEzPIQABAAAA0iQAAFDPIQABAAAA0yQAAFTPIQABAAAA1CQAAFjPIQABAAAA1SQAAFzPIQABAAAA1iQAAGDPIQABAAAA1yQAAGTPIQABAAAA2CQAAGjPIQABAAAA2SQAAGzPIQABAAAA2iQAAHDPIQABAAAA2yQAAHTPIQABAAAA3CQAAHjPIQABAAAA3SQAAHzPIQABAAAA3iQAAIDPIQABAAAA3yQAAITPIQABAAAA4CQAAIjPIQABAAAA4SQAAIzPIQABAAAA4iQAAJDPIQABAAAA4yQAAJTPIQABAAAA5CQAAJjPIQABAAAA5SQAAJzPIQABAAAA5iQAAKDPIQABAAAA5yQAAKTPIQABAAAA6CQAAKjPIQABAAAA6SQAAKzPIQABAAAAACwAALDPIQABAAAAASwAALTPIQABAAAAAiwAALjPIQABAAAAAywAALzPIQABAAAABCwAAMDPIQABAAAABSwAAMTPIQABAAAABiwAAMjPIQABAAAABywAAMzPIQABAAAACCwAANDPIQABAAAACSwAANTPIQABAAAACiwAANjPIQABAAAACywAANzPIQABAAAADCwAAODPIQABAAAADSwAAOTPIQABAAAADiwAAOjPIQABAAAADywAAOzPIQABAAAAECwAAPDPIQABAAAAESwAAPTPIQABAAAAEiwAAPjPIQABAAAAEywAAPzPIQABAAAAFCwAAADQIQABAAAAFSwAAATQIQABAAAAFiwAAAjQIQABAAAAFywAAAzQIQABAAAAGCwAABDQIQABAAAAGSwAABTQIQABAAAAGiwAABjQIQABAAAAGywAABzQIQABAAAAHCwAACDQIQABAAAAHSwAACTQIQABAAAAHiwAACjQIQABAAAAHywAACzQIQABAAAAICwAADDQIQABAAAAISwAADTQIQABAAAAIiwAADjQIQABAAAAIywAADzQIQABAAAAJCwAAEDQIQABAAAAJSwAAETQIQABAAAAJiwAAEjQIQABAAAAJywAAEzQIQABAAAAKCwAAFDQIQABAAAAKSwAAFTQIQABAAAAKiwAAFjQIQABAAAAKywAAFzQIQABAAAALCwAAGDQIQABAAAALSwAAGTQIQABAAAALiwAAGjQIQABAAAALywAAGzQIQABAAAAMCwAAHDQIQABAAAAMSwAAHTQIQABAAAAMiwAAHjQIQABAAAAMywAAHzQIQABAAAANCwAAIDQIQABAAAANSwAAITQIQABAAAANiwAAIjQIQABAAAANywAAIzQIQABAAAAOCwAAJDQIQABAAAAOSwAAJTQIQABAAAAOiwAAJjQIQABAAAAOywAAJzQIQABAAAAPCwAAKDQIQABAAAAPSwAAKTQIQABAAAAPiwAAKjQIQABAAAAPywAAKzQIQABAAAAQCwAALDQIQABAAAAQSwAALTQIQABAAAAQiwAALjQIQABAAAAQywAALzQIQABAAAARCwAAMDQIQABAAAARSwAAMTQIQABAAAARiwAAMjQIQABAAAARywAAMzQIQABAAAASCwAANDQIQABAAAASSwAANTQIQABAAAASiwAANjQIQABAAAASywAANzQIQABAAAATCwAAODQIQABAAAATSwAAOTQIQABAAAATiwAAOjQIQABAAAATywAAOzQIQABAAAAUCwAAPDQIQABAAAAUSwAAPTQIQABAAAAUiwAAPjQIQABAAAAUywAAPzQIQABAAAAVCwAAADRIQABAAAAVSwAAATRIQABAAAAViwAAAjRIQABAAAAVywAAAzRIQABAAAAWCwAABDRIQABAAAAWSwAABTRIQABAAAAWiwAABjRIQABAAAAWywAABzRIQABAAAAXCwAACDRIQABAAAAXSwAACTRIQABAAAAXiwAACjRIQABAAAAXywAACzRIQABAAAAYCwAADDRIQABAAAAYSwAADTRIQABAAAAYiwAADjRIQABAAAAYywAADzRIQABAAAAZCwAAEDRIQABAAAAZSwAAETRIQABAAAAZiwAAEjRIQABAAAAZywAAEzRIQABAAAAaCwAAFDRIQABAAAAaSwAAFTRIQABAAAAaiwAAFjRIQABAAAAaywAAFzRIQABAAAAbCwAAGDRIQABAAAAbSwAAGTRIQABAAAAbiwAAGjRIQABAAAAbywAAGzRIQABAAAAcCwAAHDRIQABAAAAciwAAHTRIQABAAAAcywAAHjRIQABAAAAdSwAAHzRIQABAAAAdiwAAIDRIQABAAAAfiwAAITRIQABAAAAfywAAIjRIQABAAAAgCwAAIzRIQABAAAAgSwAAJDRIQABAAAAgiwAAJTRIQABAAAAgywAAJjRIQABAAAAhCwAAJzRIQABAAAAhSwAAKDRIQABAAAAhiwAAKTRIQABAAAAhywAAKjRIQABAAAAiCwAAKzRIQABAAAAiSwAALDRIQABAAAAiiwAALTRIQABAAAAiywAALjRIQABAAAAjCwAALzRIQABAAAAjSwAAMDRIQABAAAAjiwAAMTRIQABAAAAjywAAMjRIQABAAAAkCwAAMzRIQABAAAAkSwAANDRIQABAAAAkiwAANTRIQABAAAAkywAANjRIQABAAAAlCwAANzRIQABAAAAlSwAAODRIQABAAAAliwAAOTRIQABAAAAlywAAOjRIQABAAAAmCwAAOzRIQABAAAAmSwAAPDRIQABAAAAmiwAAPTRIQABAAAAmywAAPjRIQABAAAAnCwAAPzRIQABAAAAnSwAAADSIQABAAAAniwAAATSIQABAAAAnywAAAjSIQABAAAAoCwAAAzSIQABAAAAoSwAABDSIQABAAAAoiwAABTSIQABAAAAoywAABjSIQABAAAApCwAABzSIQABAAAApSwAACDSIQABAAAApiwAACTSIQABAAAApywAACjSIQABAAAAqCwAACzSIQABAAAAqSwAADDSIQABAAAAqiwAADTSIQABAAAAqywAADjSIQABAAAArCwAADzSIQABAAAArSwAAEDSIQABAAAAriwAAETSIQABAAAArywAAEjSIQABAAAAsCwAAEzSIQABAAAAsSwAAFDSIQABAAAAsiwAAFTSIQABAAAAsywAAFjSIQABAAAAtCwAAFzSIQABAAAAtSwAAGDSIQABAAAAtiwAAGTSIQABAAAAtywAAGjSIQABAAAAuCwAAGzSIQABAAAAuSwAAHDSIQABAAAAuiwAAHTSIQABAAAAuywAAHjSIQABAAAAvCwAAHzSIQABAAAAvSwAAIDSIQABAAAAviwAAITSIQABAAAAvywAAIjSIQABAAAAwCwAAIzSIQABAAAAwSwAAJDSIQABAAAAwiwAAJTSIQABAAAAwywAAJjSIQABAAAAxCwAAJzSIQABAAAAxSwAAKDSIQABAAAAxiwAAKTSIQABAAAAxywAAKjSIQABAAAAyCwAAKzSIQABAAAAySwAALDSIQABAAAAyiwAALTSIQABAAAAyywAALjSIQABAAAAzCwAALzSIQABAAAAzSwAAMDSIQABAAAAziwAAMTSIQABAAAAzywAAMjSIQABAAAA0CwAAMzSIQABAAAA0SwAANDSIQABAAAA0iwAANTSIQABAAAA0ywAANjSIQABAAAA1CwAANzSIQABAAAA1SwAAODSIQABAAAA1iwAAOTSIQABAAAA1ywAAOjSIQABAAAA2CwAAOzSIQABAAAA2SwAAPDSIQABAAAA2iwAAPTSIQABAAAA2ywAAPjSIQABAAAA3CwAAPzSIQABAAAA3SwAAADTIQABAAAA3iwAAATTIQABAAAA3ywAAAjTIQABAAAA4CwAAAzTIQABAAAA4SwAABDTIQABAAAA4iwAABTTIQABAAAA4ywAABjTIQABAAAA6ywAABzTIQABAAAA7CwAACDTIQABAAAA7SwAACTTIQABAAAA7iwAACjTIQABAAAA8iwAACzTIQABAAAA8ywAADDTIQABAAAAAC0AADTTIQABAAAAAS0AADjTIQABAAAAAi0AADzTIQABAAAAAy0AAEDTIQABAAAABC0AAETTIQABAAAABS0AAEjTIQABAAAABi0AAEzTIQABAAAABy0AAFDTIQABAAAACC0AAFTTIQABAAAACS0AAFjTIQABAAAACi0AAFzTIQABAAAACy0AAGDTIQABAAAADC0AAGTTIQABAAAADS0AAGjTIQABAAAADi0AAGzTIQABAAAADy0AAHDTIQABAAAAEC0AAHTTIQABAAAAES0AAHjTIQABAAAAEi0AAHzTIQABAAAAEy0AAIDTIQABAAAAFC0AAITTIQABAAAAFS0AAIjTIQABAAAAFi0AAIzTIQABAAAAFy0AAJDTIQABAAAAGC0AAJTTIQABAAAAGS0AAJjTIQABAAAAGi0AAJzTIQABAAAAGy0AAKDTIQABAAAAHC0AAKTTIQABAAAAHS0AAKjTIQABAAAAHi0AAKzTIQABAAAAHy0AALDTIQABAAAAIC0AALTTIQABAAAAIS0AALjTIQABAAAAIi0AALzTIQABAAAAIy0AAMDTIQABAAAAJC0AAMTTIQABAAAAJS0AAMjTIQABAAAAJy0AAMzTIQABAAAALS0AANDTIQABAAAAQKYAANTTIQABAAAAQaYAANjTIQABAAAAQqYAANzTIQABAAAAQ6YAAODTIQABAAAARKYAAOTTIQABAAAARaYAAOjTIQABAAAARqYAAOzTIQABAAAAR6YAAPDTIQABAAAASKYAAPTTIQABAAAASaYAAPjTIQABAAAASqYAAPzTIQACAAAAS6YAAATUIQACAAAATKYAAAzUIQABAAAATaYAABDUIQABAAAATqYAABTUIQABAAAAT6YAABjUIQABAAAAUKYAABzUIQABAAAAUaYAACDUIQABAAAAUqYAACTUIQABAAAAU6YAACjUIQABAAAAVKYAACzUIQABAAAAVaYAADDUIQABAAAAVqYAADTUIQABAAAAV6YAADjUIQABAAAAWKYAADzUIQABAAAAWaYAAEDUIQABAAAAWqYAAETUIQABAAAAW6YAAEjUIQABAAAAXKYAAEzUIQABAAAAXaYAAFDUIQABAAAAXqYAAFTUIQABAAAAX6YAAFjUIQABAAAAYKYAAFzUIQABAAAAYaYAAGDUIQABAAAAYqYAAGTUIQABAAAAY6YAAGjUIQABAAAAZKYAAGzUIQABAAAAZaYAAHDUIQABAAAAZqYAAHTUIQABAAAAZ6YAAHjUIQABAAAAaKYAAHzUIQABAAAAaaYAAIDUIQABAAAAaqYAAITUIQABAAAAa6YAAIjUIQABAAAAbKYAAIzUIQABAAAAbaYAAJDUIQABAAAAgKYAAJTUIQABAAAAgaYAAJjUIQABAAAAgqYAAJzUIQABAAAAg6YAAKDUIQABAAAAhKYAAKTUIQABAAAAhaYAAKjUIQABAAAAhqYAAKzUIQABAAAAh6YAALDUIQABAAAAiKYAALTUIQABAAAAiaYAALjUIQABAAAAiqYAALzUIQABAAAAi6YAAMDUIQABAAAAjKYAAMTUIQABAAAAjaYAAMjUIQABAAAAjqYAAMzUIQABAAAAj6YAANDUIQABAAAAkKYAANTUIQABAAAAkaYAANjUIQABAAAAkqYAANzUIQABAAAAk6YAAODUIQABAAAAlKYAAOTUIQABAAAAlaYAAOjUIQABAAAAlqYAAOzUIQABAAAAl6YAAPDUIQABAAAAmKYAAPTUIQABAAAAmaYAAPjUIQABAAAAmqYAAPzUIQABAAAAm6YAAADVIQABAAAAIqcAAATVIQABAAAAI6cAAAjVIQABAAAAJKcAAAzVIQABAAAAJacAABDVIQABAAAAJqcAABTVIQABAAAAJ6cAABjVIQABAAAAKKcAABzVIQABAAAAKacAACDVIQABAAAAKqcAACTVIQABAAAAK6cAACjVIQABAAAALKcAACzVIQABAAAALacAADDVIQABAAAALqcAADTVIQABAAAAL6cAADjVIQABAAAAMqcAADzVIQABAAAAM6cAAEDVIQABAAAANKcAAETVIQABAAAANacAAEjVIQABAAAANqcAAEzVIQABAAAAN6cAAFDVIQABAAAAOKcAAFTVIQABAAAAOacAAFjVIQABAAAAOqcAAFzVIQABAAAAO6cAAGDVIQABAAAAPKcAAGTVIQABAAAAPacAAGjVIQABAAAAPqcAAGzVIQABAAAAP6cAAHDVIQABAAAAQKcAAHTVIQABAAAAQacAAHjVIQABAAAAQqcAAHzVIQABAAAAQ6cAAIDVIQABAAAARKcAAITVIQABAAAARacAAIjVIQABAAAARqcAAIzVIQABAAAAR6cAAJDVIQABAAAASKcAAJTVIQABAAAASacAAJjVIQABAAAASqcAAJzVIQABAAAAS6cAAKDVIQABAAAATKcAAKTVIQABAAAATacAAKjVIQABAAAATqcAAKzVIQABAAAAT6cAALDVIQABAAAAUKcAALTVIQABAAAAUacAALjVIQABAAAAUqcAALzVIQABAAAAU6cAAMDVIQABAAAAVKcAAMTVIQABAAAAVacAAMjVIQABAAAAVqcAAMzVIQABAAAAV6cAANDVIQABAAAAWKcAANTVIQABAAAAWacAANjVIQABAAAAWqcAANzVIQABAAAAW6cAAODVIQABAAAAXKcAAOTVIQABAAAAXacAAOjVIQABAAAAXqcAAOzVIQABAAAAX6cAAPDVIQABAAAAYKcAAPTVIQABAAAAYacAAPjVIQABAAAAYqcAAPzVIQABAAAAY6cAAADWIQABAAAAZKcAAATWIQABAAAAZacAAAjWIQABAAAAZqcAAAzWIQABAAAAZ6cAABDWIQABAAAAaKcAABTWIQABAAAAaacAABjWIQABAAAAaqcAABzWIQABAAAAa6cAACDWIQABAAAAbKcAACTWIQABAAAAbacAACjWIQABAAAAbqcAACzWIQABAAAAb6cAADDWIQABAAAAeacAADTWIQABAAAAeqcAADjWIQABAAAAe6cAADzWIQABAAAAfKcAAEDWIQABAAAAfacAAETWIQABAAAAfqcAAEjWIQABAAAAf6cAAEzWIQABAAAAgKcAAFDWIQABAAAAgacAAFTWIQABAAAAgqcAAFjWIQABAAAAg6cAAFzWIQABAAAAhKcAAGDWIQABAAAAhacAAGTWIQABAAAAhqcAAGjWIQABAAAAh6cAAGzWIQABAAAAi6cAAHDWIQABAAAAjKcAAHTWIQABAAAAjacAAHjWIQABAAAAkKcAAHzWIQABAAAAkacAAIDWIQABAAAAkqcAAITWIQABAAAAk6cAAIjWIQABAAAAlKcAAIzWIQABAAAAlqcAAJDWIQABAAAAl6cAAJTWIQABAAAAmKcAAJjWIQABAAAAmacAAJzWIQABAAAAmqcAAKDWIQABAAAAm6cAAKTWIQABAAAAnKcAAKjWIQABAAAAnacAAKzWIQABAAAAnqcAALDWIQABAAAAn6cAALTWIQABAAAAoKcAALjWIQABAAAAoacAALzWIQABAAAAoqcAAMDWIQABAAAAo6cAAMTWIQABAAAApKcAAMjWIQABAAAApacAAMzWIQABAAAApqcAANDWIQABAAAAp6cAANTWIQABAAAAqKcAANjWIQABAAAAqacAANzWIQABAAAAqqcAAODWIQABAAAAq6cAAOTWIQABAAAArKcAAOjWIQABAAAAracAAOzWIQABAAAArqcAAPDWIQABAAAAsKcAAPTWIQABAAAAsacAAPjWIQABAAAAsqcAAPzWIQABAAAAs6cAAADXIQABAAAAtKcAAATXIQABAAAAtacAAAjXIQABAAAAtqcAAAzXIQABAAAAt6cAABDXIQABAAAAuKcAABTXIQABAAAAuacAABjXIQABAAAAuqcAABzXIQABAAAAu6cAACDXIQABAAAAvKcAACTXIQABAAAAvacAACjXIQABAAAAvqcAACzXIQABAAAAv6cAADDXIQABAAAAwKcAADTXIQABAAAAwacAADjXIQABAAAAwqcAADzXIQABAAAAw6cAAEDXIQABAAAAxKcAAETXIQABAAAAxacAAEjXIQABAAAAxqcAAEzXIQABAAAAx6cAAFDXIQABAAAAyKcAAFTXIQABAAAAyacAAFjXIQABAAAAyqcAAFzXIQABAAAA0KcAAGDXIQABAAAA0acAAGTXIQABAAAA1qcAAGjXIQABAAAA16cAAGzXIQABAAAA2KcAAHDXIQABAAAA2acAAHTXIQABAAAA9acAAHjXIQABAAAA9qcAAHzXIQABAAAAU6sAAIDXIQABAAAAcKsAAITXIQABAAAAcasAAIjXIQABAAAAcqsAAIzXIQABAAAAc6sAAJDXIQABAAAAdKsAAJTXIQABAAAAdasAAJjXIQABAAAAdqsAAJzXIQABAAAAd6sAAKDXIQABAAAAeKsAAKTXIQABAAAAeasAAKjXIQABAAAAeqsAAKzXIQABAAAAe6sAALDXIQABAAAAfKsAALTXIQABAAAAfasAALjXIQABAAAAfqsAALzXIQABAAAAf6sAAMDXIQABAAAAgKsAAMTXIQABAAAAgasAAMjXIQABAAAAgqsAAMzXIQABAAAAg6sAANDXIQABAAAAhKsAANTXIQABAAAAhasAANjXIQABAAAAhqsAANzXIQABAAAAh6sAAODXIQABAAAAiKsAAOTXIQABAAAAiasAAOjXIQABAAAAiqsAAOzXIQABAAAAi6sAAPDXIQABAAAAjKsAAPTXIQABAAAAjasAAPjXIQABAAAAjqsAAPzXIQABAAAAj6sAAADYIQABAAAAkKsAAATYIQABAAAAkasAAAjYIQABAAAAkqsAAAzYIQABAAAAk6sAABDYIQABAAAAlKsAABTYIQABAAAAlasAABjYIQABAAAAlqsAABzYIQABAAAAl6sAACDYIQABAAAAmKsAACTYIQABAAAAmasAACjYIQABAAAAmqsAACzYIQABAAAAm6sAADDYIQABAAAAnKsAADTYIQABAAAAnasAADjYIQABAAAAnqsAADzYIQABAAAAn6sAAEDYIQABAAAAoKsAAETYIQABAAAAoasAAEjYIQABAAAAoqsAAEzYIQABAAAAo6sAAFDYIQABAAAApKsAAFTYIQABAAAApasAAFjYIQABAAAApqsAAFzYIQABAAAAp6sAAGDYIQABAAAAqKsAAGTYIQABAAAAqasAAGjYIQABAAAAqqsAAGzYIQABAAAAq6sAAHDYIQABAAAArKsAAHTYIQABAAAArasAAHjYIQABAAAArqsAAHzYIQABAAAAr6sAAIDYIQABAAAAsKsAAITYIQABAAAAsasAAIjYIQABAAAAsqsAAIzYIQABAAAAs6sAAJDYIQABAAAAtKsAAJTYIQABAAAAtasAAJjYIQABAAAAtqsAAJzYIQABAAAAt6sAAKDYIQABAAAAuKsAAKTYIQABAAAAuasAAKjYIQABAAAAuqsAAKzYIQABAAAAu6sAALDYIQABAAAAvKsAALTYIQABAAAAvasAALjYIQABAAAAvqsAALzYIQABAAAAv6sAAMDYIQABAAAAIf8AAMTYIQABAAAAIv8AAMjYIQABAAAAI/8AAMzYIQABAAAAJP8AANDYIQABAAAAJf8AANTYIQABAAAAJv8AANjYIQABAAAAJ/8AANzYIQABAAAAKP8AAODYIQABAAAAKf8AAOTYIQABAAAAKv8AAOjYIQABAAAAK/8AAOzYIQABAAAALP8AAPDYIQABAAAALf8AAPTYIQABAAAALv8AAPjYIQABAAAAL/8AAPzYIQABAAAAMP8AAADZIQABAAAAMf8AAATZIQABAAAAMv8AAAjZIQABAAAAM/8AAAzZIQABAAAANP8AABDZIQABAAAANf8AABTZIQABAAAANv8AABjZIQABAAAAN/8AABzZIQABAAAAOP8AACDZIQABAAAAOf8AACTZIQABAAAAOv8AACjZIQABAAAAQf8AACzZIQABAAAAQv8AADDZIQABAAAAQ/8AADTZIQABAAAARP8AADjZIQABAAAARf8AADzZIQABAAAARv8AAEDZIQABAAAAR/8AAETZIQABAAAASP8AAEjZIQABAAAASf8AAEzZIQABAAAASv8AAFDZIQABAAAAS/8AAFTZIQABAAAATP8AAFjZIQABAAAATf8AAFzZIQABAAAATv8AAGDZIQABAAAAT/8AAGTZIQABAAAAUP8AAGjZIQABAAAAUf8AAGzZIQABAAAAUv8AAHDZIQABAAAAU/8AAHTZIQABAAAAVP8AAHjZIQABAAAAVf8AAHzZIQABAAAAVv8AAIDZIQABAAAAV/8AAITZIQABAAAAWP8AAIjZIQABAAAAWf8AAIzZIQABAAAAWv8AAJDZIQABAAAAAAQBAJTZIQABAAAAAQQBAJjZIQABAAAAAgQBAJzZIQABAAAAAwQBAKDZIQABAAAABAQBAKTZIQABAAAABQQBAKjZIQABAAAABgQBAKzZIQABAAAABwQBALDZIQABAAAACAQBALTZIQABAAAACQQBALjZIQABAAAACgQBALzZIQABAAAACwQBAMDZIQABAAAADAQBAMTZIQABAAAADQQBAMjZIQABAAAADgQBAMzZIQABAAAADwQBANDZIQABAAAAEAQBANTZIQABAAAAEQQBANjZIQABAAAAEgQBANzZIQABAAAAEwQBAODZIQABAAAAFAQBAOTZIQABAAAAFQQBAOjZIQABAAAAFgQBAOzZIQABAAAAFwQBAPDZIQABAAAAGAQBAPTZIQABAAAAGQQBAPjZIQABAAAAGgQBAPzZIQABAAAAGwQBAADaIQABAAAAHAQBAATaIQABAAAAHQQBAAjaIQABAAAAHgQBAAzaIQABAAAAHwQBABDaIQABAAAAIAQBABTaIQABAAAAIQQBABjaIQABAAAAIgQBABzaIQABAAAAIwQBACDaIQABAAAAJAQBACTaIQABAAAAJQQBACjaIQABAAAAJgQBACzaIQABAAAAJwQBADDaIQABAAAAKAQBADTaIQABAAAAKQQBADjaIQABAAAAKgQBADzaIQABAAAAKwQBAEDaIQABAAAALAQBAETaIQABAAAALQQBAEjaIQABAAAALgQBAEzaIQABAAAALwQBAFDaIQABAAAAMAQBAFTaIQABAAAAMQQBAFjaIQABAAAAMgQBAFzaIQABAAAAMwQBAGDaIQABAAAANAQBAGTaIQABAAAANQQBAGjaIQABAAAANgQBAGzaIQABAAAANwQBAHDaIQABAAAAOAQBAHTaIQABAAAAOQQBAHjaIQABAAAAOgQBAHzaIQABAAAAOwQBAIDaIQABAAAAPAQBAITaIQABAAAAPQQBAIjaIQABAAAAPgQBAIzaIQABAAAAPwQBAJDaIQABAAAAQAQBAJTaIQABAAAAQQQBAJjaIQABAAAAQgQBAJzaIQABAAAAQwQBAKDaIQABAAAARAQBAKTaIQABAAAARQQBAKjaIQABAAAARgQBAKzaIQABAAAARwQBALDaIQABAAAASAQBALTaIQABAAAASQQBALjaIQABAAAASgQBALzaIQABAAAASwQBAMDaIQABAAAATAQBAMTaIQABAAAATQQBAMjaIQABAAAATgQBAMzaIQABAAAATwQBANDaIQABAAAAsAQBANTaIQABAAAAsQQBANjaIQABAAAAsgQBANzaIQABAAAAswQBAODaIQABAAAAtAQBAOTaIQABAAAAtQQBAOjaIQABAAAAtgQBAOzaIQABAAAAtwQBAPDaIQABAAAAuAQBAPTaIQABAAAAuQQBAPjaIQABAAAAugQBAPzaIQABAAAAuwQBAADbIQABAAAAvAQBAATbIQABAAAAvQQBAAjbIQABAAAAvgQBAAzbIQABAAAAvwQBABDbIQABAAAAwAQBABTbIQABAAAAwQQBABjbIQABAAAAwgQBABzbIQABAAAAwwQBACDbIQABAAAAxAQBACTbIQABAAAAxQQBACjbIQABAAAAxgQBACzbIQABAAAAxwQBADDbIQABAAAAyAQBADTbIQABAAAAyQQBADjbIQABAAAAygQBADzbIQABAAAAywQBAEDbIQABAAAAzAQBAETbIQABAAAAzQQBAEjbIQABAAAAzgQBAEzbIQABAAAAzwQBAFDbIQABAAAA0AQBAFTbIQABAAAA0QQBAFjbIQABAAAA0gQBAFzbIQABAAAA0wQBAGDbIQABAAAA2AQBAGTbIQABAAAA2QQBAGjbIQABAAAA2gQBAGzbIQABAAAA2wQBAHDbIQABAAAA3AQBAHTbIQABAAAA3QQBAHjbIQABAAAA3gQBAHzbIQABAAAA3wQBAIDbIQABAAAA4AQBAITbIQABAAAA4QQBAIjbIQABAAAA4gQBAIzbIQABAAAA4wQBAJDbIQABAAAA5AQBAJTbIQABAAAA5QQBAJjbIQABAAAA5gQBAJzbIQABAAAA5wQBAKDbIQABAAAA6AQBAKTbIQABAAAA6QQBAKjbIQABAAAA6gQBAKzbIQABAAAA6wQBALDbIQABAAAA7AQBALTbIQABAAAA7QQBALjbIQABAAAA7gQBALzbIQABAAAA7wQBAMDbIQABAAAA8AQBAMTbIQABAAAA8QQBAMjbIQABAAAA8gQBAMzbIQABAAAA8wQBANDbIQABAAAA9AQBANTbIQABAAAA9QQBANjbIQABAAAA9gQBANzbIQABAAAA9wQBAODbIQABAAAA+AQBAOTbIQABAAAA+QQBAOjbIQABAAAA+gQBAOzbIQABAAAA+wQBAPDbIQABAAAAcAUBAPTbIQABAAAAcQUBAPjbIQABAAAAcgUBAPzbIQABAAAAcwUBAADcIQABAAAAdAUBAATcIQABAAAAdQUBAAjcIQABAAAAdgUBAAzcIQABAAAAdwUBABDcIQABAAAAeAUBABTcIQABAAAAeQUBABjcIQABAAAAegUBABzcIQABAAAAfAUBACDcIQABAAAAfQUBACTcIQABAAAAfgUBACjcIQABAAAAfwUBACzcIQABAAAAgAUBADDcIQABAAAAgQUBADTcIQABAAAAggUBADjcIQABAAAAgwUBADzcIQABAAAAhAUBAEDcIQABAAAAhQUBAETcIQABAAAAhgUBAEjcIQABAAAAhwUBAEzcIQABAAAAiAUBAFDcIQABAAAAiQUBAFTcIQABAAAAigUBAFjcIQABAAAAjAUBAFzcIQABAAAAjQUBAGDcIQABAAAAjgUBAGTcIQABAAAAjwUBAGjcIQABAAAAkAUBAGzcIQABAAAAkQUBAHDcIQABAAAAkgUBAHTcIQABAAAAlAUBAHjcIQABAAAAlQUBAHzcIQABAAAAlwUBAIDcIQABAAAAmAUBAITcIQABAAAAmQUBAIjcIQABAAAAmgUBAIzcIQABAAAAmwUBAJDcIQABAAAAnAUBAJTcIQABAAAAnQUBAJjcIQABAAAAngUBAJzcIQABAAAAnwUBAKDcIQABAAAAoAUBAKTcIQABAAAAoQUBAKjcIQABAAAAowUBAKzcIQABAAAApAUBALDcIQABAAAApQUBALTcIQABAAAApgUBALjcIQABAAAApwUBALzcIQABAAAAqAUBAMDcIQABAAAAqQUBAMTcIQABAAAAqgUBAMjcIQABAAAAqwUBAMzcIQABAAAArAUBANDcIQABAAAArQUBANTcIQABAAAArgUBANjcIQABAAAArwUBANzcIQABAAAAsAUBAODcIQABAAAAsQUBAOTcIQABAAAAswUBAOjcIQABAAAAtAUBAOzcIQABAAAAtQUBAPDcIQABAAAAtgUBAPTcIQABAAAAtwUBAPjcIQABAAAAuAUBAPzcIQABAAAAuQUBAADdIQABAAAAuwUBAATdIQABAAAAvAUBAAjdIQABAAAAgAwBAAzdIQABAAAAgQwBABDdIQABAAAAggwBABTdIQABAAAAgwwBABjdIQABAAAAhAwBABzdIQABAAAAhQwBACDdIQABAAAAhgwBACTdIQABAAAAhwwBACjdIQABAAAAiAwBACzdIQABAAAAiQwBADDdIQABAAAAigwBADTdIQABAAAAiwwBADjdIQABAAAAjAwBADzdIQABAAAAjQwBAEDdIQABAAAAjgwBAETdIQABAAAAjwwBAEjdIQABAAAAkAwBAEzdIQABAAAAkQwBAFDdIQABAAAAkgwBAFTdIQABAAAAkwwBAFjdIQABAAAAlAwBAFzdIQABAAAAlQwBAGDdIQABAAAAlgwBAGTdIQABAAAAlwwBAGjdIQABAAAAmAwBAGzdIQABAAAAmQwBAHDdIQABAAAAmgwBAHTdIQABAAAAmwwBAHjdIQABAAAAnAwBAHzdIQABAAAAnQwBAIDdIQABAAAAngwBAITdIQABAAAAnwwBAIjdIQABAAAAoAwBAIzdIQABAAAAoQwBAJDdIQABAAAAogwBAJTdIQABAAAAowwBAJjdIQABAAAApAwBAJzdIQABAAAApQwBAKDdIQABAAAApgwBAKTdIQABAAAApwwBAKjdIQABAAAAqAwBAKzdIQABAAAAqQwBALDdIQABAAAAqgwBALTdIQABAAAAqwwBALjdIQABAAAArAwBALzdIQABAAAArQwBAMDdIQABAAAArgwBAMTdIQABAAAArwwBAMjdIQABAAAAsAwBAMzdIQABAAAAsQwBANDdIQABAAAAsgwBANTdIQABAAAAwAwBANjdIQABAAAAwQwBANzdIQABAAAAwgwBAODdIQABAAAAwwwBAOTdIQABAAAAxAwBAOjdIQABAAAAxQwBAOzdIQABAAAAxgwBAPDdIQABAAAAxwwBAPTdIQABAAAAyAwBAPjdIQABAAAAyQwBAPzdIQABAAAAygwBAADeIQABAAAAywwBAATeIQABAAAAzAwBAAjeIQABAAAAzQwBAAzeIQABAAAAzgwBABDeIQABAAAAzwwBABTeIQABAAAA0AwBABjeIQABAAAA0QwBABzeIQABAAAA0gwBACDeIQABAAAA0wwBACTeIQABAAAA1AwBACjeIQABAAAA1QwBACzeIQABAAAA1gwBADDeIQABAAAA1wwBADTeIQABAAAA2AwBADjeIQABAAAA2QwBADzeIQABAAAA2gwBAEDeIQABAAAA2wwBAETeIQABAAAA3AwBAEjeIQABAAAA3QwBAEzeIQABAAAA3gwBAFDeIQABAAAA3wwBAFTeIQABAAAA4AwBAFjeIQABAAAA4QwBAFzeIQABAAAA4gwBAGDeIQABAAAA4wwBAGTeIQABAAAA5AwBAGjeIQABAAAA5QwBAGzeIQABAAAA5gwBAHDeIQABAAAA5wwBAHTeIQABAAAA6AwBAHjeIQABAAAA6QwBAHzeIQABAAAA6gwBAIDeIQABAAAA6wwBAITeIQABAAAA7AwBAIjeIQABAAAA7QwBAIzeIQABAAAA7gwBAJDeIQABAAAA7wwBAJTeIQABAAAA8AwBAJjeIQABAAAA8QwBAJzeIQABAAAA8gwBAKDeIQABAAAAoBgBAKTeIQABAAAAoRgBAKjeIQABAAAAohgBAKzeIQABAAAAoxgBALDeIQABAAAApBgBALTeIQABAAAApRgBALjeIQABAAAAphgBALzeIQABAAAApxgBAMDeIQABAAAAqBgBAMTeIQABAAAAqRgBAMjeIQABAAAAqhgBAMzeIQABAAAAqxgBANDeIQABAAAArBgBANTeIQABAAAArRgBANjeIQABAAAArhgBANzeIQABAAAArxgBAODeIQABAAAAsBgBAOTeIQABAAAAsRgBAOjeIQABAAAAshgBAOzeIQABAAAAsxgBAPDeIQABAAAAtBgBAPTeIQABAAAAtRgBAPjeIQABAAAAthgBAPzeIQABAAAAtxgBAADfIQABAAAAuBgBAATfIQABAAAAuRgBAAjfIQABAAAAuhgBAAzfIQABAAAAuxgBABDfIQABAAAAvBgBABTfIQABAAAAvRgBABjfIQABAAAAvhgBABzfIQABAAAAvxgBACDfIQABAAAAwBgBACTfIQABAAAAwRgBACjfIQABAAAAwhgBACzfIQABAAAAwxgBADDfIQABAAAAxBgBADTfIQABAAAAxRgBADjfIQABAAAAxhgBADzfIQABAAAAxxgBAEDfIQABAAAAyBgBAETfIQABAAAAyRgBAEjfIQABAAAAyhgBAEzfIQABAAAAyxgBAFDfIQABAAAAzBgBAFTfIQABAAAAzRgBAFjfIQABAAAAzhgBAFzfIQABAAAAzxgBAGDfIQABAAAA0BgBAGTfIQABAAAA0RgBAGjfIQABAAAA0hgBAGzfIQABAAAA0xgBAHDfIQABAAAA1BgBAHTfIQABAAAA1RgBAHjfIQABAAAA1hgBAHzfIQABAAAA1xgBAIDfIQABAAAA2BgBAITfIQABAAAA2RgBAIjfIQABAAAA2hgBAIzfIQABAAAA2xgBAJDfIQABAAAA3BgBAJTfIQABAAAA3RgBAJjfIQABAAAA3hgBAJzfIQABAAAA3xgBAKDfIQABAAAAQG4BAKTfIQABAAAAQW4BAKjfIQABAAAAQm4BAKzfIQABAAAAQ24BALDfIQABAAAARG4BALTfIQABAAAARW4BALjfIQABAAAARm4BALzfIQABAAAAR24BAMDfIQABAAAASG4BAMTfIQABAAAASW4BAMjfIQABAAAASm4BAMzfIQABAAAAS24BANDfIQABAAAATG4BANTfIQABAAAATW4BANjfIQABAAAATm4BANzfIQABAAAAT24BAODfIQABAAAAUG4BAOTfIQABAAAAUW4BAOjfIQABAAAAUm4BAOzfIQABAAAAU24BAPDfIQABAAAAVG4BAPTfIQABAAAAVW4BAPjfIQABAAAAVm4BAPzfIQABAAAAV24BAADgIQABAAAAWG4BAATgIQABAAAAWW4BAAjgIQABAAAAWm4BAAzgIQABAAAAW24BABDgIQABAAAAXG4BABTgIQABAAAAXW4BABjgIQABAAAAXm4BABzgIQABAAAAX24BACDgIQABAAAAYG4BACTgIQABAAAAYW4BACjgIQABAAAAYm4BACzgIQABAAAAY24BADDgIQABAAAAZG4BADTgIQABAAAAZW4BADjgIQABAAAAZm4BADzgIQABAAAAZ24BAEDgIQABAAAAaG4BAETgIQABAAAAaW4BAEjgIQABAAAAam4BAEzgIQABAAAAa24BAFDgIQABAAAAbG4BAFTgIQABAAAAbW4BAFjgIQABAAAAbm4BAFzgIQABAAAAb24BAGDgIQABAAAAcG4BAGTgIQABAAAAcW4BAGjgIQABAAAAcm4BAGzgIQABAAAAc24BAHDgIQABAAAAdG4BAHTgIQABAAAAdW4BAHjgIQABAAAAdm4BAHzgIQABAAAAd24BAIDgIQABAAAAeG4BAITgIQABAAAAeW4BAIjgIQABAAAAem4BAIzgIQABAAAAe24BAJDgIQABAAAAfG4BAJTgIQABAAAAfW4BAJjgIQABAAAAfm4BAJzgIQABAAAAf24BAKDgIQABAAAAAOkBAKTgIQABAAAAAekBAKjgIQABAAAAAukBAKzgIQABAAAAA+kBALDgIQABAAAABOkBALTgIQABAAAABekBALjgIQABAAAABukBALzgIQABAAAAB+kBAMDgIQABAAAACOkBAMTgIQABAAAACekBAMjgIQABAAAACukBAMzgIQABAAAAC+kBANDgIQABAAAADOkBANTgIQABAAAADekBANjgIQABAAAADukBANzgIQABAAAAD+kBAODgIQABAAAAEOkBAOTgIQABAAAAEekBAOjgIQABAAAAEukBAOzgIQABAAAAE+kBAPDgIQABAAAAFOkBAPTgIQABAAAAFekBAPjgIQABAAAAFukBAPzgIQABAAAAF+kBAADhIQABAAAAGOkBAAThIQABAAAAGekBAAjhIQABAAAAGukBAAzhIQABAAAAG+kBABDhIQABAAAAHOkBABThIQABAAAAHekBABjhIQABAAAAHukBABzhIQABAAAAH+kBACDhIQABAAAAIOkBACThIQABAAAAIekBACjhIQABAAAAIukBACzhIQABAAAAI+kBADDhIQABAAAAJOkBADThIQABAAAAJekBADjhIQABAAAAJukBADzhIQABAAAAJ+kBAEDhIQABAAAAKOkBAEThIQABAAAAKekBAEjhIQABAAAAKukBAEzhIQABAAAAK+kBAFDhIQABAAAALOkBAFThIQABAAAALekBAFjhIQABAAAALukBAFzhIQABAAAAL+kBAGDhIQABAAAAMOkBAGThIQABAAAAMekBAGjhIQABAAAAMukBAGzhIQABAAAAM+kBAHDhIQABAAAANOkBAHThIQABAAAANekBAHjhIQABAAAANukBAHzhIQABAAAAN+kBAIDhIQABAAAAOOkBAIThIQABAAAAOekBAIjhIQABAAAAOukBAIzhIQABAAAAO+kBAJDhIQABAAAAPOkBAJThIQABAAAAPekBAJjhIQABAAAAPukBAJzhIQABAAAAP+kBAKDhIQABAAAAQOkBAKThIQABAAAAQekBAKjhIQABAAAAQukBAKzhIQABAAAAQ+kBALDhIQABAAAAGT8gAGYAAAB+AAAADQAAAGFzc2VydGlvbiBmYWlsZWQ6IGkgPiBzZWxmLm5leHQAGT8gAGYAAACbAAAAEQAAABk/IABmAAAAtQAAAAkAAACqOiAAaAAAAEUCAAAoAAAAqjogAGgAAABhAgAAJQAAAKo6IABoAAAAbQIAABcAAAAoAAAAqjogAGgA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AACqOiAAaAAAAG0GAAAxAAAAc3RhcnRlbmSqOiAAaAAAAFUGAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5jaGFyKCkgPT0gJ3gnIHx8IHNlbGYuY2hhcigpID09ICd1JyB8fCBzZWxmLmNoYXIoKSA9PSAnVSeqOiAAaAAAALIGAAAJAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBVbmljb2RlIGNsYXNzAAAA3TkgAGwAAAAIAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgYnl0ZSBjbGFzcwAA3TkgAGwAAAALAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgcmVwZXRpdGlvbgAA3TkgAGwAAAAOAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgZ3JvdXAAAADdOSAAbAAAABEDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBjb25jYXQgbWFya2VyAAAA3TkgAGwAAAAUAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgYWx0IGJyYW5jaCBtYXJrZXIAAADdOSAAbAAAABcDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBVbmljb2RlIGNsYXNz3TkgAGwAAADpAgAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgY29uY2F0LCBnb3QgYnl0ZSBjbGFzcwAAAN05IABsAAAA7AIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IHJlcGV0aXRpb24AAADdOSAAbAAAAO8CAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBncm91cN05IABsAAAA8gIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IGFsdCBtYXJrZXIAAADdOSAAbAAAAPUCAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBhbHQgYnJhbmNoIG1hcmtlct05IABsAAAA+AIAABEAAAAMYXNzZXJ0aW9uIGZhaWxlZDogIXNlbGYuZmxhZ3MoKS51bmljb2RlKCkAAN05IABsAAAAWQQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmZsYWdzKCkudW5pY29kZSgp3TkgAGwAAABDBAAACQAAAN05IABsAAAA2wIAABwAAADdOSAAbAAAALgCAAAcAAAA3TkgAGwAAADRAgAALAAAAN05IABsAAAAwwIAACwAAACqOiAAaAAAAAAJAAAwAAAApyEgAGQAAADdAAAAIgAAAKchIABkAAAA+AAAAD8AAACnISAAZAAAALsAAAAZAAAAz1AgAGMAAAC0AQAALQAAAM9QIABjAAAAtQEAACsAAADPUCAAYwAAALgBAAAJAAAAjTIgAGoAAADeCAAAKAAAAI0yIABqAAAA8ggAABUAAACNMiAAagAAAOIIAAAeAAAAjTIgAGoAAADlCAAANAAAAI0yIABqAAAA6wgAACAAAACNMiAAagAAAOsIAAAtAAAAjTIgAGoAAADOCAAAFQAAANxDIABmAAAAOgYAADYAAAAeQiAAZgAAAPMEAAAjAAAA3EMgAGYAAAD5CwAALQAAANxDIABmAAAA9wsAABIAAADcQyAAZgAAAOgLAAAZAAAAHDggAGQAAABoAAAAKwAAABk/IABmAAAA/QEAAEAAAABBU0NJSUFzc2lnbmVkQW55GT8gAGYAAAAGAgAALgAAABk/IABmAAAAdwMAABwAAAAZPyAAZgAAAKoDAAAJAAAAGT8gAGYAAACrAwAACQAAABk/IABmAAAArgMAAA8AAAAZPyAAZgAAAKADAAANAAAAGT8gAGYAAACdAwAADQAAAB0OIABPAAAA/AMAADMAAAA3NDMyMTAvLi1n8kJD5SwrKikoJyYlJCMiITggHx4dHP+UpJWIoJut3d6GeujK1+DQ3My7t7OxqLLI4sOauK5+eL+dwqq9oqGWwY6Jq7C5p7pwr8C8nIyPe4WAk4qSct+X+dju7P3j2ub3h7Tx6fb054v18/vrycTw1pi2zbV/G9TT0tXkxamfg6xpUGJgYVHPkXRzkIKZeWuEbW58b1Jsdo1xgXd9pXVcalNIY11BT6bto8e+4dHLxtnbzur4nu//////////////////////////////////////////////////////////////////////////////////////MDlBWmF6QVphegB/CQkgIAAff38wOSF+YXogfiEvOkBbYHt+CQkKCgsLDAwNDSAgQVowOUFaX19hejA5QUZhZjAAAAA5AAAAYAYAAGkGAADwBgAA+QYAAMAHAADJBwAAZgkAAG8JAADmCQAA7wkAAGYKAABvCgAA5goAAO8KAABmCwAAbwsAAOYLAADvCwAAZgwAAG8MAADmDAAA7wwAAGYNAABvDQAA5g0AAO8NAABQDgAAWQ4AANAOAADZDgAAIA8AACkPAABAEAAASRAAAJAQAACZEAAA4BcAAOkXAAAQGAAAGRgAAEYZAABPGQAA0BkAANkZAACAGgAAiRoAAJAaAACZGgAAUBsAAFkbAACwGwAAuRsAAEAcAABJHAAAUBwAAFkcAAAgpgAAKaYAANCoAADZqAAAAKkAAAmpAADQqQAA2akAAPCpAAD5qQAAUKoAAFmqAADwqwAA+asAABD/AAAZ/wAAoAQBAKkEAQAwDQEAOQ0BAGYQAQBvEAEA8BABAPkQAQA2EQEAPxEBANARAQDZEQEA8BIBAPkSAQBQFAEAWRQBANAUAQDZFAEAUBYBAFkWAQDAFgEAyRYBADAXAQA5FwEA4BgBAOkY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AABYHgAAWB4AAFoeAABaHgAAXB4AAFweAABeHgAAXh4AAGAeAABgHgAAYh4AAGIeAABkHgAAZB4AAGYeAABmHgAAaB4AAGgeAABqHgAAah4AAGweAABsHgAAbh4AAG4eAABwHgAAcB4AAHIeAAByHgAAdB4AAHQeAAB2HgAAdh4AAHgeAAB4HgAAeh4AAHoeAAB8HgAAfB4AAH4eAAB+HgAAgB4AAIAeAACCHgAAgh4AAIQeAACEHgAAhh4AAIYeAACIHgAAiB4AAIoeAACKHgAAjB4AAIweAACOHgAAjh4AAJAeAACQHgAAkh4AAJIeAACUHgAAlB4AAJoeAACbHgAAnh4AAJ4eAACgHgAAoB4AAKIeAACiHgAApB4AAKQeAACmHgAAph4AAKgeAACoHgAAqh4AAKoeAACsHgAArB4AAK4eAACuHgAAsB4AALAeAACyHgAAsh4AALQeAAC0HgAAth4AALYeAAC4HgAAuB4AALoeAAC6HgAAvB4AALweAAC+HgAAvh4AAMAeAADAHgAAwh4AAMIeAADEHgAAxB4AAMYeAADGHgAAyB4AAMgeAADKHgAAyh4AAMweAADMHgAAzh4AAM4eAADQHgAA0B4AANIeAADSHgAA1B4AANQeAADWHgAA1h4AANgeAADYHgAA2h4AANoeAADcHgAA3B4AAN4eAADeHgAA4B4AAOAeAADiHgAA4h4AAOQeAADkHgAA5h4AAOYeAADoHgAA6B4AAOoeAADqHgAA7B4AAOweAADuHgAA7h4AAPAeAADwHgAA8h4AAPIeAAD0HgAA9B4AAPYeAAD2HgAA+B4AAPgeAAD6HgAA+h4AAPweAAD8HgAA/h4AAP4eAAAIHwAADx8AABgfAAAdHwAAKB8AAC8fAAA4HwAAPx8AAEgfAABNHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAF8fAABoHwAAbx8AAIAfAACvHwAAsh8AALQfAAC3HwAAvB8AAMIfAADEHwAAxx8AAMwfAADYHwAA2x8AAOgfAADsHwAA8h8AAPQfAAD3HwAA/B8AACYhAAAmIQAAKiEAACshAAAyIQAAMiEAAGAhAABvIQAAgyEAAIMhAAC2JAAAzyQAAAAsAAAvLAAAYCwAAGAsAABiLAAAZCwAAGcsAABnLAAAaSwAAGksAABrLAAAaywAAG0sAABwLAAAciwAAHIsAAB1LAAAdSwAAH4sAACALAAAgiwAAIIsAACELAAAhCwAAIYsAACGLAAAiCwAAIgsAACKLAAAiiwAAIwsAACMLAAAjiwAAI4sAACQLAAAkCwAAJIsAACSLAAAlCwAAJQsAACWLAAAliwAAJgsAACYLAAAmiwAAJosAACcLAAAnCwAAJ4sAACeLAAAoCwAAKAsAACiLAAAoiwAAKQsAACkLAAApiwAAKYsAACoLAAAqCwAAKosAACqLAAArCwAAKwsAACuLAAAriwAALAsAACwLAAAsiwAALIsAAC0LAAAtCwAALYsAAC2LAAAuCwAALgsAAC6LAAAuiwAALwsAAC8LAAAviwAAL4sAADALAAAwCwAAMIsAADCLAAAxCwAAMQsAADGLAAAxiwAAMgsAADILAAAyiwAAMosAADMLAAAzCwAAM4sAADOLAAA0CwAANAsAADSLAAA0iwAANQsAADULAAA1iwAANYsAADYLAAA2CwAANosAADaLAAA3CwAANwsAADeLAAA3iwAAOAsAADgLAAA4iwAAOIsAADrLAAA6ywAAO0sAADtLAAA8iwAAPIsAABApgAAQKYAAEKmAABCpgAARKYAAESmAABGpgAARqYAAEimAABIpgAASqYAAEqmAABMpgAATKYAAE6mAABOpgAAUKYAAFCmAABSpgAAUqYAAFSmAABUpgAAVqYAAFamAABYpgAAWKYAAFqmAABapgAAXKYAAFymAABepgAAXqYAAGCmAABgpgAAYqYAAGKmAABkpgAAZKYAAGamAABmpgAAaKYAAGimAABqpgAAaqYAAGymAABspgAAgKYAAICmAACCpgAAgqYAAISmAACEpgAAhqYAAIamAACIpgAAiKYAAIqmAACKpgAAjKYAAIymAACOpgAAjqYAAJCmAACQpgAAkqYAAJKmAACUpgAAlKYAAJamAACWpgAAmKYAAJimAACapgAAmqYAACKnAAAipwAAJKcAACSnAAAmpwAAJqcAACinAAAopwAAKqcAACqnAAAspwAALKcAAC6nAAAupwAAMqcAADKnAAA0pwAANKcAADanAAA2pwAAOKcAADinAAA6pwAAOqcAADynAAA8pwAAPqcAAD6nAABApwAAQKcAAEKnAABCpwAARKcAAESnAABGpwAARqcAAEinAABIpwAASqcAAEqnAABMpwAATKcAAE6nAABOpwAAUKcAAFCnAABSpwAAUqcAAFSnAABUpwAAVqcAAFanAABYpwAAWKcAAFqnAABapwAAXKcAAFynAABepwAAXqcAAGCnAABgpwAAYqcAAGKnAABkpwAAZKcAAGanAABmpwAAaKcAAGinAABqpwAAaqcAAGynAABspwAAbqcAAG6nAAB5pwAAeacAAHunAAB7pwAAfacAAH6nAACApwAAgKcAAIKnAACCpwAAhKcAAISnAACGpwAAhqcAAIunAACLpwAAjacAAI2nAACQpwAAkKcAAJKnAACSpwAAlqcAAJanAACYpwAAmKcAAJqnAACapwAAnKcAAJynAACepwAAnqcAAKCnAACgpwAAoqcAAKKnAACkpwAApKcAAKanAACmpwAAqKcAAKinAACqpwAArqcAALCnAAC0pwAAtqcAALanAAC4pwAAuKcAALqnAAC6pwAAvKcAALynAAC+pwAAvqcAAMCnAADApwAAwqcAAMKnAADEpwAAx6cAAMmnAADJpwAA0KcAANCnAADWpwAA1qcAANinAADYpwAA9acAAPWnAABwqwAAv6sAAAD7AAAG+wAAE/sAABf7AAAh/wAAOv8AAAAEAQAnBAEAsAQBANMEAQBwBQEAegUBAHwFAQCKBQEAjAUBAJIFAQCUBQEAlQUBAIAMAQCyDAEAoBgBAL8YAQBAbgEAX24BAADpAQAh6QEAQQAAAFoAAABhAAAAegAAALUAAAC1AAAAwAAAANYAAADYAAAA9gAAAPgAAAA3AQAAOQEAAIwBAACOAQAAmgEAAJwBAACpAQAArAEAALkBAAC8AQAAvQEAAL8BAAC/AQAAxAEAACACAAAiAgAAMwIAADoCAABUAgAAVgIAAFcCAABZAgAAWQIAAFsCAABcAgAAYAIAAGECAABjAgAAYwIAAGUCAABmAgAAaAIAAGwCAABvAgAAbwIAAHECAAByAgAAdQIAAHUCAAB9AgAAfQIAAIACAACAAgAAggIAAIMCAACHAgAAjAIAAJICAACSAgAAnQIAAJ4CAABFAwAARQMAAHADAABzAwAAdgMAAHcDAAB7AwAAfQMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAKEDAACjAwAA0QMAANUDAAD1AwAA9wMAAPsDAAD9AwAAgQQAAIoE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AAC0HgAAth4AALYeAAC4HgAAuB4AALoeAAC6HgAAvB4AALweAAC+HgAAvh4AAMAeAADAHgAAwh4AAMIeAADEHgAAxB4AAMYeAADGHgAAyB4AAMgeAADKHgAAyh4AAMweAADMHgAAzh4AAM4eAADQHgAA0B4AANIeAADSHgAA1B4AANQeAADWHgAA1h4AANgeAADYHgAA2h4AANoeAADcHgAA3B4AAN4eAADeHgAA4B4AAOAeAADiHgAA4h4AAOQeAADkHgAA5h4AAOYeAADoHgAA6B4AAOoeAADqHgAA7B4AAOweAADuHgAA7h4AAPAeAADwHgAA8h4AAPIeAAD0HgAA9B4AAPYeAAD2HgAA+B4AAPgeAAD6HgAA+h4AAPweAAD8HgAA/h4AAP4eAAAIHwAADx8AABgfAAAdHwAAKB8AAC8fAAA4HwAAPx8AAEgfAABNHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAF8fAABoHwAAbx8AAIgfAACPHwAAmB8AAJ8fAACoHwAArx8AALgfAAC8HwAAyB8AAMwfAADYHwAA2x8AAOgfAADsHwAA+B8AAPwfAAAmIQAAJiEAACohAAArIQAAMiEAADIhAABgIQAAbyEAAIMhAACDIQAAtiQAAM8kAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALyn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AAA1HgAANR4AADceAAA3HgAAOR4AADkeAAA7HgAAOx4AAD0eAAA9HgAAPx4AAD8eAABBHgAAQR4AAEMeAABDHgAARR4AAEUeAABHHgAARx4AAEkeAABJHgAASx4AAEseAABNHgAATR4AAE8eAABPHgAAUR4AAFEeAABTHgAAUx4AAFUeAABVHgAAVx4AAFceAABZHgAAWR4AAFseAABbHgAAXR4AAF0eAABfHgAAXx4AAGEeAABhHgAAYx4AAGMeAABlHgAAZR4AAGceAABnHgAAaR4AAGkeAABrHgAAax4AAG0eAABtHgAAbx4AAG8eAABxHgAAcR4AAHMeAABzHgAAdR4AAHUeAAB3HgAAdx4AAHkeAAB5HgAAex4AAHseAAB9HgAAfR4AAH8eAAB/HgAAgR4AAIEeAACDHgAAgx4AAIUeAACFHgAAhx4AAIceAACJHgAAiR4AAIseAACLHgAAjR4AAI0eAACPHgAAjx4AAJEeAACRHgAAkx4AAJMeAACVHgAAmx4AAKEeAAChHgAAox4AAKMeAAClHgAApR4AAKceAACnHgAAqR4AAKkeAACrHgAAqx4AAK0eAACtHgAArx4AAK8eAACxHgAAsR4AALMeAACzHgAAtR4AALUeAAC3HgAAtx4AALkeAAC5HgAAux4AALseAAC9HgAAvR4AAL8eAAC/HgAAwR4AAMEeAADDHgAAwx4AAMUeAADFHgAAxx4AAMceAADJHgAAyR4AAMseAADLHgAAzR4AAM0eAADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AAIcfAACQHwAAlx8AAKAfAACnHwAAsB8AALQfAAC2HwAAtx8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAABOIQAATiEAAHAhAAB/IQAAhCEAAIQhAADQJAAA6SQAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHMsAABzLAAAdiwAAHYsAACBLAAAgSwAAIMsAACDLAAAhSwAAIUsAACHLAAAhywAAIksAACJLAAAiywAAIssAACNLAAAjSwAAI8sAACPLAAAkSwAAJEsAACTLAAAkywAAJUsAACVLAAAlywAAJcsAACZLAAAmSwAAJssAACbLAAAnSwAAJ0sAACfLAAAnywAAKEsAAChLAAAoywAAKMsAAClLAAApSwAAKcsAACnLAAAqSwAAKksAACrLAAAqywAAK0sAACtLAAArywAAK8sAACxLAAAsSwAALMsAACzLAAAtSwAALUsAAC3LAAAtywAALksAAC5LAAAuywAALssAAC9LAAAvSwAAL8sAAC/LAAAwSwAAMEsAADDLAAAwywAAMUsAADFLAAAxywAAMcsAADJLAAAySwAAMssAADLLAAAzSwAAM0sAADPLAAAzywAANEsAADRLAAA0ywAANMsAADVLAAA1SwAANcsAADXLAAA2SwAANksAADbLAAA2ywAAN0sAADdLAAA3ywAAN8sAADhLAAA4SwAAOMsAADjLAAA7CwAAOwsAADuLAAA7iwAAPMsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQaYAAEGmAABDpgAAQ6YAAEWmAABFpgAAR6YAAEemAABJpgAASaYAAEumAABLpgAATaYAAE2mAABPpgAAT6YAAFGmAABRpgAAU6YAAFOmAABVpgAAVaYAAFemAABXpgAAWaYAAFmmAABbpgAAW6YAAF2mAABdpgAAX6YAAF+mAABhpgAAYaYAAGOmAABjpgAAZaYAAGWmAABnpgAAZ6YAAGmmAABppgAAa6YAAGumAABtpgAAbaYAAIGmAACBpgAAg6YAAIOmAACFpgAAhaYAAIemAACHpgAAiaYAAImmAACLpgAAi6YAAI2mAACNpgAAj6YAAI+mAACRpgAAkaYAAJOmAACTpgAAlaYAAJWmAACXpgAAl6YAAJmmAACZpgAAm6YAAJumAAAjpwAAI6cAACWnAAAlpwAAJ6cAACenAAAppwAAKacAACunAAArpwAALacAAC2nAAAvpwAAL6cAADOnAAAzpwAANacAADWnAAA3pwAAN6cAADmnAAA5pwAAO6cAADunAAA9pwAAPacAAD+nAAA/pwAAQacAAEGnAABDpwAAQ6cAAEWnAABFpwAAR6cAAEenAABJpwAASacAAEunAABLpwAATacAAE2nAABPpwAAT6cAAFGnAABRpwAAU6cAAFOnAABVpwAAVacAAFenAABXpwAAWacAAFmnAABbpwAAW6cAAF2nAABdpwAAX6cAAF+nAABhpwAAYacAAGOnAABjpwAAZacAAGWnAABnpwAAZ6cAAGmnAABppwAAa6cAAGunAABtpwAAbacAAG+nAABvpwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAJGnAACRpwAAk6cAAJSnAACXpwAAl6cAAJmnAACZpwAAm6cAAJunAACdpwAAnacAAJ+nAACfpwAAoacAAKGnAACjpwAAo6cAAKWnAAClpwAAp6cAAKenAACppwAAqacAALWnAAC1pwAAt6cAALenAAC5pwAAuacAALunAAC7pwAAvacAAL2nAAC/pwAAv6cAAMGnAADBpwAAw6cAAMOnAADIpwAAyKcAAMqnAADKpwAA0acAANGnAADXpwAA16cAANmnAADZpwAA9qcAAPanAABTqwAAU6sAAHCrAAC/qwAAAPsAAAb7AAAT+wAAF/sAAEH/AABa/wAAKAQBAE8EAQDYBAEA+wQBAJcFAQChBQEAowUBALEFAQCzBQEAuQUBALsFAQC8BQEAwAwBAPIMAQDAGAEA3xgBAGBuAQB/bgEAIukBAEPpAQBhAAAAegAAALUAAAC1AAAA3wAAAPYAAAD4AAAA/wAAAAEBAAABAQAAAwEAAAMBAAAFAQAABQEAAAcBAAAHAQAACQEAAAkBAAALAQAACwEAAA0BAAANAQAADwEAAA8BAAARAQAAEQEAABMBAAATAQAAFQEAABUBAAAXAQAAFwEAABkBAAAZAQAAGwEAABsBAAAdAQAAHQEAAB8BAAAfAQAAIQEAACEBAAAjAQAAIwEAACUBAAAlAQAAJwEAACcBAAApAQAAKQEAACsBAAArAQAALQEAAC0BAAAvAQAALwEAADEBAAAxAQAAMwEAADMBAAA1AQAANQEAADcBAAA3AQAAOgEAADoBAAA8AQAAPAEAAD4BAAA+AQAAQAEAAEABAABCAQAAQgEAAEQBAABEAQAARgEAAEYBAABIAQAASQEAAEsBAABLAQAATQEAAE0BAABPAQAATwEAAFEBAABRAQAAUwEAAFMBAABVAQAAVQEAAFcBAABXAQAAWQEAAFkBAABbAQAAWwEAAF0BAABdAQAAXwEAAF8BAABhAQAAYQEAAGMBAABjAQAAZQEAAGUBAABnAQAAZwEAAGkBAABpAQAAawEAAGsBAABtAQAAbQEAAG8BAABvAQAAcQEAAHEBAABzAQAAcwEAAHUBAAB1AQAAdwEAAHcBAAB6AQAAegEAAHwBAAB8AQAAfgEAAIABAACDAQAAgwEAAIUBAACFAQAAiAEAAIgBAACMAQAAjAEAAJIBAACSAQAAlQEAAJUBAACZAQAAmgEAAJ4BAACeAQAAoQEAAKEBAACjAQAAowEAAKUBAAClAQAAqAEAAKgBAACtAQAArQEAALABAACwAQAAtAEAALQBAAC2AQAAtgEAALkBAAC5AQAAvQEAAL0BAAC/AQAAvwEAAMUBAADGAQAAyAEAAMkBAADLAQAAzAEAAM4BAADOAQAA0AEAANABAADSAQAA0gEAANQBAADUAQAA1gEAANYBAADYAQAA2AEAANoBAADaAQAA3AEAAN0BAADfAQAA3wEAAOEBAADhAQAA4wEAAOMBAADlAQAA5QEAAOcBAADnAQAA6QEAAOkBAADrAQAA6wEAAO0BAADtAQAA7wEAAPABAADyAQAA8wEAAPUBAAD1AQAA+QEAAPkBAAD7AQAA+wEAAP0BAAD9AQAA/wEAAP8BAAABAgAAAQIAAAMCAAADAgAABQIAAAUCAAAHAgAABwIAAAkCAAAJAgAACwIAAAsCAAANAgAADQIAAA8CAAAPAgAAEQIAABECAAATAgAAEwIAABUCAAAVAgAAFwIAABcCAAAZAgAAGQIAABsCAAAbAgAAHQIAAB0CAAAfAgAAHwIAACMCAAAjAgAAJQIAACUCAAAnAgAAJwIAACkCAAApAgAAKwIAACsCAAAtAgAALQIAAC8CAAAvAgAAMQIAADECAAAzAgAAMwIAADwCAAA8AgAAPwIAAEACAABCAgAAQgIAAEcCAABHAgAASQIAAEkCAABLAgAASwIAAE0CAABNAgAATwIAAFQCAABWAgAAVwIAAFkCAABZAgAAWwIAAFwCAABgAgAAYQIAAGMCAABjAgAAZQIAAGYCAABoAgAAbAIAAG8CAABvAgAAcQIAAHICAAB1AgAAdQIAAH0CAAB9AgAAgAIAAIACAACCAgAAgwIAAIcCAACMAgAAkgIAAJICAACdAgAAngIAAEUDAABFAwAAcQMAAHEDAABzAwAAcwMAAHcDAAB3AwAAewMAAH0DAACQAwAAkAMAAKwDAADOAwAA0AMAANEDAADVAwAA1wMAANkDAADZAwAA2wMAANsDAADdAwAA3QMAAN8DAADfAwAA4QMAAOEDAADjAwAA4wMAAOUDAADlAwAA5wMAAOcDAADpAwAA6QMAAOsDAADrAwAA7QMAAO0DAADvAwAA8wMAAPUDAAD1AwAA+AMAAPgDAAD7AwAA+wMAADAEAABfBAAAYQQAAGEEAABjBAAAYwQAAGUEAABlBAAAZwQAAGcEAABpBAAAaQQAAGsEAABrBAAAbQQAAG0EAABvBAAAbwQAAHEEAABxBAAAcwQAAHMEAAB1BAAAdQQAAHcEAAB3BAAAeQQAAHkEAAB7BAAAewQAAH0EAAB9BAAAfwQAAH8EAACBBAAAgQQAAIsEAACLBAAAjQQAAI0EAACPBAAAjwQAAJEEAACRBAAAkwQAAJMEAACVBAAAlQQAAJcEAACXBAAAmQQAAJkEAACbBAAAmwQAAJ0EAACdBAAAnwQAAJ8EAAChBAAAoQQAAKMEAACjBAAApQQAAKUEAACnBAAApwQAAKkEAACpBAAAqwQAAKsEAACtBAAArQQAAK8EAACvBAAAsQQAALEEAACzBAAAswQAALUEAAC1BAAAtwQAALcEAAC5BAAAuQQAALsEAAC7BAAAvQQAAL0EAAC/BAAAvwQAAMIEAADCBAAAxAQAAMQEAADGBAAAxgQAAMgEAADIBAAAygQAAMoEAADMBAAAzAQAAM4EAADPBAAA0QQAANEEAADTBAAA0wQAANUEAADVBAAA1wQAANcEAADZBAAA2QQAANsEAADbBAAA3QQAAN0EAADfBAAA3wQAAOEEAADhBAAA4wQAAOMEAADlBAAA5QQAAOcEAADnBAAA6QQAAOkEAADrBAAA6wQAAO0EAADtBAAA7wQAAO8EAADxBAAA8QQAAPMEAADzBAAA9QQAAPUEAAD3BAAA9wQAAPkEAAD5BAAA+wQAAPsEAAD9BAAA/QQAAP8EAAD/BAAAAQUAAAEFAAADBQAAAwUAAAUFAAAFBQAABwUAAAcFAAAJBQAACQUAAAsFAAALBQAADQUAAA0FAAAPBQAADwUAABEFAAARBQAAEwUAABMFAAAVBQAAFQUAABcFAAAXBQAAGQUAABkFAAAbBQAAGwUAAB0FAAAdBQAAHwUAAB8FAAAhBQAAIQUAACMFAAAjBQAAJQUAACUFAAAnBQAAJwUAACkFAAApBQAAKwUAACsFAAAtBQAALQUAAC8FAAAvBQAAYQUAAIcFAADQEAAA+hAAAP0QAAD/EAAA+BMAAP0TAACAHAAAiBwAAHkdAAB5HQAAfR0AAH0dAACOHQAAjh0AAAEeAAABHgAAAx4AAAMeAAAFHgAABR4AAAceAAAHHgAACR4AAAkeAAALHgAACx4AAA0eAAANHgAADx4AAA8eAAARHgAAER4AABMeAAATHgAAFR4AABUeAAAXHgAAFx4AABkeAAAZHgAAGx4AABseAAAdHgAAHR4AAB8eAAAfHgAAIR4AACEeAAAjHgAAIx4AACUeAAAlHgAAJx4AACceAAApHgAAKR4AACseAAArHgAALR4AAC0eAAAvHgAALx4AADEeAAAxHgAAMx4AADMeAAA1HgAANR4AADceAAA3HgAAOR4AADkeAAA7HgAAOx4AAD0eAAA9HgAAPx4AAD8eAABBHgAAQR4AAEMeAABDHgAARR4AAEUeAABHHgAARx4AAEkeAABJHgAASx4AAEseAABNHgAATR4AAE8eAABPHgAAUR4AAFEeAABTHgAAUx4AAFUeAABVHgAAVx4AAFceAABZHgAAWR4AAFseAABbHgAAXR4AAF0eAABfHgAAXx4AAGEeAABhHgAAYx4AAGMeAABlHgAAZR4AAGceAABnHgAAaR4AAGkeAABrHgAAax4AAG0eAABtHgAAbx4AAG8eAABxHgAAcR4AAHMeAABzHgAAdR4AAHUeAAB3HgAAdx4AAHkeAAB5HgAAex4AAHseAAB9HgAAfR4AAH8eAAB/HgAAgR4AAIEeAACDHgAAgx4AAIUeAACFHgAAhx4AAIceAACJHgAAiR4AAIseAACLHgAAjR4AAI0eAACPHgAAjx4AAJEeAACRHgAAkx4AAJMeAACVHgAAmx4AAKEeAAChHgAAox4AAKMeAAClHgAApR4AAKceAACnHgAAqR4AAKkeAACrHgAAqx4AAK0eAACtHgAArx4AAK8eAACxHgAAsR4AALMeAACzHgAAtR4AALUeAAC3HgAAtx4AALkeAAC5HgAAux4AALseAAC9HgAAvR4AAL8eAAC/HgAAwR4AAMEeAADDHgAAwx4AAMUeAADFHgAAxx4AAMceAADJHgAAyR4AAMseAADLHgAAzR4AAM0eAADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AALQfAAC2HwAAtx8AALwfAAC8HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAAzB8AAMwfAADQHwAA0x8AANYfAADXHwAA4B8AAOcfAADyHwAA9B8AAPYfAAD3HwAA/B8AAPwfAABOIQAATiEAAHAhAAB/IQAAhCEAAIQhAADQJAAA6SQAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHMsAABzLAAAdiwAAHYsAACBLAAAgSwAAIMsAACDLAAAhSwAAIUsAACHLAAAhywAAIksAACJLAAAiywAAIssAACNLAAAjSwAAI8sAACPLAAAkSwAAJEsAACTLAAAkywAAJUsAACVLAAAlywAAJcsAACZLAAAmSwAAJssAACbLAAAnSwAAJ0sAACfLAAAnywAAKEsAAChLAAAoywAAKMsAAClLAAApSwAAKcsAACnLAAAqSwAAKksAACrLAAAqywAAK0sAACtLAAArywAAK8sAACxLAAAsSwAALMsAACzLAAAtSwAALUsAAC3LAAAtywAALksAAC5LAAAuywAALssAAC9LAAAvSwAAL8sAAC/LAAAwSwAAMEsAADDLAAAwywAAMUsAADFLAAAxywAAMcsAADJLAAAySwAAMssAADLLAAAzSwAAM0sAADPLAAAzywAANEsAADRLAAA0ywAANMsAADVLAAA1SwAANcsAADXLAAA2SwAANksAADbLAAA2ywAAN0sAADdLAAA3ywAAN8sAADhLAAA4SwAAOMsAADjLAAA7CwAAOwsAADuLAAA7iwAAPMsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQaYAAEGmAABDpgAAQ6YAAEWmAABFpgAAR6YAAEemAABJpgAASaYAAEumAABLpgAATaYAAE2mAABPpgAAT6YAAFGmAABRpgAAU6YAAFOmAABVpgAAVaYAAFemAABXpgAAWaYAAFmmAABbpgAAW6YAAF2mAABdpgAAX6YAAF+mAABhpgAAYaYAAGOmAABjpgAAZaYAAGWmAABnpgAAZ6YAAGmmAABppgAAa6YAAGumAABtpgAAbaYAAIGmAACBpgAAg6YAAIOmAACFpgAAhaYAAIemAACHpgAAiaYAAImmAACLpgAAi6YAAI2mAACNpgAAj6YAAI+mAACRpgAAkaYAAJOmAACTpgAAlaYAAJWmAACXpgAAl6YAAJmmAACZpgAAm6YAAJumAAAjpwAAI6cAACWnAAAlpwAAJ6cAACenAAAppwAAKacAACunAAArpwAALacAAC2nAAAvpwAAL6cAADOnAAAzpwAANacAADWnAAA3pwAAN6cAADmnAAA5pwAAO6cAADunAAA9pwAAPacAAD+nAAA/pwAAQacAAEGnAABDpwAAQ6cAAEWnAABFpwAAR6cAAEenAABJpwAASacAAEunAABLpwAATacAAE2nAABPpwAAT6cAAFGnAABRpwAAU6cAAFOnAABVpwAAVacAAFenAABXpwAAWacAAFmnAABbpwAAW6cAAF2nAABdpwAAX6cAAF+nAABhpwAAYacAAGOnAABjpwAAZacAAGWnAABnpwAAZ6cAAGmnAABppwAAa6cAAGunAABtpwAAbacAAG+nAABvpwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAJGnAACRpwAAk6cAAJSnAACXpwAAl6cAAJmnAACZpwAAm6cAAJun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AADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAhx8AAJAfAACXHwAAoB8AAKcfAACwHwAAtB8AALYfAAC3HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAAAohAAAKIQAADiEAAA8hAAATIQAAEyEAAC8hAAAvIQAANCEAADQhAAA5IQAAOSEAADwhAAA9IQAARiEAAEkhAABOIQAATiEAAHAhAAB/IQAAhCEAAIQhAADQJAAA6SQAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHEsAABxLAAAcywAAHQsAAB2LAAAfSwAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOQsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAnaYAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAxpwAAM6cAADOnAAA1pwAANacAADenAAA3pwAAOacAADmnAAA7pwAAO6cAAD2nAAA9pwAAP6cAAD+nAABBpwAAQacAAEOnAABDpwAARacAAEWnAABHpwAAR6cAAEmnAABJpwAAS6cAAEunAABNpwAATacAAE+nAABPpwAAUacAAFGnAABTpwAAU6cAAFWnAABVpwAAV6cAAFenAABZpwAAWacAAFunAABbpwAAXacAAF2nAABfpwAAX6cAAGGnAABhpwAAY6cAAGOnAABlpwAAZacAAGenAABnpwAAaacAAGmnAABrpwAAa6cAAG2nAABtpwAAb6cAAHinAAB6pwAAeqcAAHynAAB8pwAAf6cAAH+nAACBpwAAgacAAIOnAACDpwAAhacAAIWnAACHpwAAh6cAAIynAACMpwAAjqcAAI6nAACRpwAAkacAAJOnAACVpwAAl6cAAJenAACZpwAAmacAAJunAACbpwAAnacAAJ2nAACfpwAAn6cAAKGnAAChpwAAo6cAAKOnAAClpwAApacAAKenAACnpwAAqacAAKmnAACvpwAAr6cAALWnAAC1pwAAt6cAALenAAC5pwAAuacAALunAAC7pwAAvacAAL2nAAC/pwAAv6cAAMGnAADBpwAAw6cAAMOn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AADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAuB8AALsfAADIHwAAyx8AANgfAADbHwAA6B8AAOwfAAD4HwAA+x8AAAIhAAACIQAAByEAAAchAAALIQAADSEAABAhAAASIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAAMCEAADMhAAA+IQAAPyEAAEUhAABFIQAAYCEAAG8hAACDIQAAgyEAALYkAADPJAAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKnAABEpwAARKcAAEanAABGpwAASKcAAEinAABKpwAASqcAAEynAABMpwAATqcAAE6nAABQpwAAUKcAAFKnAABSpwAAVKcAAFSnAABWpwAAVqcAAFinAABYpwAAWqcAAFqnAABcpwAAXKcAAF6nAABepwAAYKcAAGCnAABipwAAYqcAAGSnAABkpwAAZqcAAGanAABopwAAaKcAAGqnAABqpwAAbKcAAGynAABupwAAbqcAAHmnAAB5pwAAe6cAAHunAAB9pwAAfqcAAICnAACApwAAgqcAAIKnAACEpwAAhKcAAIanAACGpwAAi6cAAIunAACNpwAAjacAAJCnAACQpwAAkqcAAJKnAACWpwAAlqcAAJinAACYpwAAmqcAAJqnAACcpwAAnKcAAJ6nAACepwAAoKcAAKCnAACipwAAoqcAAKSnAACkpwAApqcAAKanAACopwAAqKcAAKqnAACupwAAsKcAALSnAAC2pwAAtqcAALinAAC4pwAAuqcAALqnAAC8pwAAvKcAAL6nAAC+pwAAwKcAAMCnAADCpwAAwqcAAMSnAADHpwAAyacAAMmnAADQpwAA0KcAANanAADWpwAA2KcAANinAAD1pwAA9acAACH/AAA6/wAAAAQBACcEAQCwBAEA0wQBAHAFAQB6BQEAfAUBAIoF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AAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AAIcfAACQHwAAlx8AAKAfAACnHwAAsB8AALQfAAC2HwAAtx8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAABxIAAAcSAAAH8gAAB/IAAAkCAAAJwgAAAKIQAACiEAAA4hAAAPIQAAEyEAABMhAAAvIQAALyEAADQhAAA0IQAAOSEAADkhAAA8IQAAPSEAAEYhAABJIQAATiEAAE4hAABwIQAAfyEAAIQhAACEIQAA0CQAAOkkAAAwLAAAXywAAGEsAABhLAAAZSwAAGYsAABoLAAAaCwAAGosAABqLAAAbCwAAGwsAABxLAAAcSwAAHMsAAB0LAAAdiwAAH0sAACBLAAAgSwAAIMsAACDLAAAhSwAAIUsAACHLAAAhywAAIksAACJLAAAiywAAIssAACNLAAAjSwAAI8sAACPLAAAkSwAAJEsAACTLAAAkywAAJUsAACVLAAAlywAAJcsAACZLAAAmSwAAJssAACbLAAAnSwAAJ0sAACfLAAAnywAAKEsAAChLAAAoywAAKMsAAClLAAApSwAAKcsAACnLAAAqSwAAKksAACrLAAAqywAAK0sAACtLAAArywAAK8sAACxLAAAsSwAALMsAACzLAAAtSwAALUsAAC3LAAAtywAALksAAC5LAAAuywAALssAAC9LAAAvSwAAL8sAAC/LAAAwSwAAMEsAADDLAAAwywAAMUsAADFLAAAxywAAMcsAADJLAAAySwAAMssAADLLAAAzSwAAM0sAADPLAAAzywAANEsAADRLAAA0ywAANMsAADVLAAA1SwAANcsAADXLAAA2SwAANksAADbLAAA2ywAAN0sAADdLAAA3ywAAN8sAADhLAAA4SwAAOMsAADkLAAA7CwAAOwsAADuLAAA7iwAAPMsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQaYAAEGmAABDpgAAQ6YAAEWmAABFpgAAR6YAAEemAABJpgAASaYAAEumAABLpgAATaYAAE2mAABPpgAAT6YAAFGmAABRpgAAU6YAAFOmAABVpgAAVaYAAFemAABXpgAAWaYAAFmmAABbpgAAW6YAAF2mAABdpgAAX6YAAF+mAABhpgAAYaYAAGOmAABjpgAAZaYAAGWmAABnpgAAZ6YAAGmmAABppgAAa6YAAGumAABtpgAAbaYAAIGmAACBpgAAg6YAAIOmAACFpgAAhaYAAIemAACHpgAAiaYAAImmAACLpgAAi6YAAI2mAACNpgAAj6YAAI+mAACRpgAAkaYAAJOmAACTpgAAlaYAAJWmAACXpgAAl6YAAJmmAACZpgAAm6YAAJ2mAAAjpwAAI6cAACWnAAAlpwAAJ6cAACenAAAppwAAKacAACunAAArpwAALacAAC2nAAAvpwAAMacAADOnAAAzpwAANacAADWnAAA3pwAAN6cAADmnAAA5pwAAO6cAADunAAA9pwAAPacAAD+nAAA/pwAAQacAAEGnAABDpwAAQ6cAAEWnAABFpwAAR6cAAEenAABJpwAASacAAEunAABLpwAATacAAE2nAABPpwAAT6cAAFGnAABRpwAAU6cAAFOnAABVpwAAVacAAFenAABXpwAAWacAAFmnAABbpwAAW6cAAF2nAABdpwAAX6cAAF+nAABhpwAAYacAAGOnAABjpwAAZacAAGWnAABnpwAAZ6cAAGmnAABppwAAa6cAAGunAABtpwAAbacAAG+nAAB4pwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAI6nAACOpwAAkacAAJGnAACTpwAAlacAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAr6cAAK+nAAC1pwAAtacAALenAAC3pwAAuacAALmnAAC7pwAAu6cAAL2nAAC9pwAAv6cAAL+nAADBpwAAwacAAMOnAADDpwAAyKcAAMinAADKpwAAyqcAANGnAADRpwAA06cAANOnAADVpwAA1acAANenAADXpwAA2acAANmnAADypwAA9KcAAPanAAD2pwAA+KcAAPqnAAAwqwAAWqsAAFyrAABpqwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAQf8AAFr/AAAoBAEATwQBANgEAQD7BAEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQCABwEAgAcBAIMHAQCFBwEAhwcBALAHAQCyBwEAugcBAMAMAQDyDAEAwBgBAN8YAQBgbgEAf24BABrUAQAz1AEATtQBAFTUAQBW1AEAZ9QBAILUAQCb1AEAttQBALnUAQC71AEAu9QBAL3UAQDD1AEAxdQBAM/UAQDq1AEAA9UBAB7VAQA31QEAUtUBAGvVAQCG1QEAn9UBALrVAQDT1QEA7tUBAAfWAQAi1gEAO9YBAFbWAQBv1gEAitYBAKXWAQDC1gEA2tYBANzWAQDh1gEA/NYBABTXAQAW1wEAG9cBADbXAQBO1wEAUNcBAFXXAQBw1wEAiNcBAIrXAQCP1wEAqtcBAMLXAQDE1wEAydcBAMvXAQDL1wEAAN8BAAnfAQAL3wEAHt8BACXfAQAq3wEAMOABAG3gAQAi6QEAQ+kBADAAAAA5AAAAYAYAAGkGAABrBgAAbAYAAPAGAAD5BgAAwAcAAMkHAABmCQAAbwkAAOYJAADvCQAAZgoAAG8KAADmCgAA7woAAGYLAABvCwAA5gsAAO8LAABmDAAAbwwAAOYMAADvDAAAZg0AAG8NAADmDQAA7w0AAFAOAABZDgAA0A4AANkOAAAgDwAAKQ8AAEAQAABJEAAAkBAAAJkQAADgFwAA6RcAABAYAAAZGAAARhkAAE8ZAADQGQAA2RkAAIAaAACJGgAAkBoAAJkaAABQGwAAWRsAALAbAAC5GwAAQBwAAEkcAABQHAAAWRwAACCmAAAppgAA0KgAANmoAAAAqQAACakAANCpAADZqQAA8KkAAPmpAABQqgAAWaoAAPCrAAD5qwAAEP8AABn/AACgBAEAqQQBADANAQA5DQEAZhABAG8QAQDwEAEA+RABADYRAQA/EQEA0BEBANkRAQDwEgEA+RIBAFAUAQBZFAEA0BQBANkUAQBQFgEAWRYBAMAWAQDJFgEAMBcBADkXAQDgGAEA6RgBAFAZAQBZGQEAUBwBAFkcAQBQHQEAWR0BAKAdAQCpHQEAUB8BAFkfAQBgagEAaWoBAMBqAQDJagEAUGsBAFlrAQDO1wEA/9cBAEDhAQBJ4QEA8OIBAPniAQDw5AEA+eQBAFDpAQBZ6QEA8PsBAPn7AQC7AQAAuwEAAMABAADDAQAAlAIAAJQCAAC5AgAAvwIAAMYCAADRAgAA7AIAAOwCAADuAgAA7gIAAHQDAAB0AwAAWQUAAFkFAADQBQAA6gUAAO8FAADzBQAAIAYAAEoGAABuBgAAbwYAAHEGAADTBgAA1QYAANUGAADlBgAA5gYAAO4GAADvBgAA+gYAAPwGAAD/BgAA/wYAABAHAAAQBwAAEgcAAC8HAABNBwAApQcAALEHAACxBwAAygcAAOoHAAD0BwAA9QcAAPoHAAD6BwAAAAgAABUIAAAaCAAAGggAACQIAAAkCAAAKAgAACgIAABACAAAWAgAAGAIAABqCAAAcAgAAIcIAACJCAAAjggAAKAIAADJCAAABAkAADkJAAA9CQAAPQkAAFAJAABQCQAAWAkAAGEJAABxCQAAgAkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAAL0JAAC9CQAAzgkAAM4JAADcCQAA3QkAAN8JAADhCQAA8AkAAPEJAAD8CQAA/AkAAAUKAAAKCgAADwoAABAKAAATCgAAKAoAACoKAAAwCgAAMgoAADMKAAA1CgAANgoAADgKAAA5CgAAWQoAAFwKAABeCgAAXgoAAHIKAAB0CgAAhQoAAI0KAACPCgAAkQoAAJMKAACoCgAAqgoAALAKAACyCgAAswoAALUKAAC5CgAAvQoAAL0KAADQCgAA0AoAAOAKAADhCgAA+QoAAPkKAAAFCwAADAsAAA8LAAAQCwAAEwsAACgLAAAqCwAAMAsAADILAAAzCwAANQsAADkLAAA9CwAAPQsAAFwLAABdCwAAXwsAAGELAABxCwAAcQsAAIMLAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAA0AsAANALAAAFDAAADAwAAA4MAAAQDAAAEgwAACgMAAAqDAAAOQwAAD0MAAA9DAAAWAwAAFoMAABdDAAAXQwAAGAMAABhDAAAgAwAAIAMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvQwAAL0MAADdDAAA3gwAAOAMAADhDAAA8QwAAPIMAAAEDQAADA0AAA4NAAAQDQAAEg0AADoNAAA9DQAAPQ0AAE4NAABODQAAVA0AAFYNAABfDQAAYQ0AAHoNAAB/DQAAhQ0AAJYNAACaDQAAsQ0AALMNAAC7DQAAvQ0AAL0NAADADQAAxg0AAAEOAAAwDgAAMg4AADMOAABADgAARg4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAsA4AALIOAACzDgAAvQ4AAL0OAADADgAAxA4AAMYOAADGDgAA3A4AAN8OAAAADwAAAA8AAEAPAABHDwAASQ8AAGwPAACIDwAAjA8AAAAQAAAqEAAAPxAAAD8QAABQEAAAVRAAAFoQAABdEAAAYRAAAGEQAABlEAAAZhAAAG4QAABwEAAAdRAAAIEQAACOEAAAjhAAANAQAAD6EAAA/RAAAEgSAABKEgAATRIAAFASAABWEgAAWBIAAFgSAABaEgAAXRIAAGASAACIEgAAihIAAI0SAACQEgAAsBIAALISAAC1EgAAuBIAAL4SAADAEgAAwBIAAMISAADFEgAAyBIAANYSAADYEgAAEBMAABITAAAVEwAAGBMAAFoTAACAEwAAjxMAAAEUAABsFgAAbxYAAH8WAACBFgAAmhYAAKAWAADqFgAA7hYAAPgWAAAAFwAAERcAAB8XAAAxFwAAQBcAAFEXAABgFwAAbBcAAG4XAABwFwAAgBcAALMXAADXFwAA1xcAANwXAADcFwAAIBgAAHgYAACAGAAAhBgAAIcYAACoGAAAqhgAAKoYAACwGAAA9RgAAAAZAAAeGQAAUBkAAG0ZAABwGQAAdBkAAIAZAACrGQAAsBkAAMkZAAAAGgAAFhoAACAaAABUGgAApxoAAKcaAAAFGwAAMxsAAEUbAABMGwAAgxsAAKAbAACuGwAArxsAALobAADlGwAAABwAACMcAABNHAAATxwAAFocAAB9HAAAkBwAALocAAC9HAAAvxwAAOkcAADsHAAA7hwAAPMcAAD1HAAA9hwAAPocAAD6HAAANSEAADghAACAIQAAgiEAAIUhAACIIQAAMC0AAGctAABvLQAAby0AAIAtAACWLQAAoC0AAKYtAACoLQAAri0AALAtAAC2LQAAuC0AAL4tAADALQAAxi0AAMgtAADOLQAA0C0AANYtAADYLQAA3i0AAC8uAAAvLgAABTAAAAcwAAAhMAAAKTAAADEwAAA1MAAAODAAADwwAABBMAAAljAAAJ0wAACfMAAAoTAAAPowAAD8MAAA/zAAAAUxAAAvMQAAMTEAAI4xAACgMQAAvzEAAPAxAAD/MQAAADQAAL9NAAAATgAAjKQAANCkAAD9pAAAAKUAAAymAAAQpgAAH6YAACqmAAArpgAAbqYAAG6mAAB/pgAAf6YAAKCmAADvpgAAF6cAAB+nAACIpwAAiKcAAI+nAACPpwAA96cAAPenAAD7pwAAAagAAAOoAAAFqAAAB6gAAAqoAAAMqAAAIqgAAECoAABzqAAAgqgAALOoAADyqAAA96gAAPuoAAD7qAAA/agAAP6oAAAKqQAAJakAADCpAABGqQAAYKkAAHypAACEqQAAsqkAAM+pAADPqQAA4KkAAOSpAADmqQAA76kAAPqpAAD+qQAAAKoAACiqAABAqgAAQqoAAESqAABLqgAAYKoAAHaqAAB6qgAAeqoAAH6qAACvqgAAsaoAALGqAAC1qgAAtqoAALmqAAC9qgAAwKoAAMCqAADCqgAAwqoAANuqAADdqgAA4KoAAOqqAADyqgAA9KoAAAGrAAAGqwAACasAAA6rAAARqwAAFqsAACCrAAAmqwAAKKsAAC6rAADAqwAA4qsAAACsAACj1wAAsNcAAMbXAADL1wAA+9cAAAD5AABt+gAAcPoAANn6AAAd+wAAHfsAAB/7AAAo+wAAKvsAADb7AAA4+wAAPPsAAD77AAA++wAAQPsAAEH7AABD+wAARPsAAEb7AACx+wAA0/sAAD39AABQ/QAAj/0AAJL9AADH/QAA8P0AAPv9AABw/gAAdP4AAHb+AAD8/gAAZv8AAJ3/AACg/wAAvv8AAML/AADH/wAAyv8AAM//AADS/wAA1/8AANr/AADc/wAAAAABAAsAAQANAAEAJgABACgAAQA6AAEAPAABAD0AAQA/AAEATQABAFAAAQBdAAEAgAABAPoAAQBAAQEAdAEBAIACAQCcAgEAoAIBANACAQAAAwEAHwMBAC0DAQBKAwEAUAMBAHUDAQCAAwEAnQMBAKADAQDDAwEAyAMBAM8DAQDRAwEA1QMBAFAEAQCdBAEAAAUBACcFAQAwBQEAYwUBAAAGAQA2BwEAQAcBAFUHAQBgBwEAZwcBAIEHAQCCBwEAAAgBAAUIAQAICAEACAgBAAoIAQA1CAEANwgBADgIAQA8CAEAPAgBAD8IAQBVCAEAYAgBAHYIAQCACAEAnggBAOAIAQDyCAEA9AgBAPUIAQAACQEAFQkBACAJAQA5CQEAgAkBALcJAQC+CQEAvwkBAAAKAQAACgEAEAoBABMKAQAVCgEAFwoBABkKAQA1CgEAYAoBAHwKAQCACgEAnAoBAMAKAQDHCgEAyQoBAOQKAQAACwEANQsBAEALAQBVCwEAYAsBAHILAQCACwEAkQsBAAAMAQBIDAEAAA0BACMNAQCADgEAqQ4BALAOAQCxDgEAAA8BABwPAQAnDwEAJw8BADAPAQBFDwEAcA8BAIEPAQCwDwEAxA8BAOAPAQD2DwEAAxABADcQAQBxEAEAchABAHUQAQB1EAEAgxABAK8QAQDQEAEA6BABAAMRAQAmEQEARBEBAEQRAQBHEQEARxEBAFARAQByEQEAdhEBAHYRAQCDEQEAshEBAMERAQDEEQEA2hEBANoRAQDcEQEA3BEBAAASAQAREgEAExIBACsSAQA/EgEAQBIBAIASAQCGEgEAiBIBAIgSAQCKEgEAjRIBAI8SAQCdEgEAnxIBAKgSAQCwEgEA3hIBAAUTAQAMEwEADxMBABATAQATEwEAKBMBACoTAQAwEwEAMhMBADMTAQA1EwEAORMBAD0TAQA9EwEAUBMBAFATAQBdEwEAYRMBAAAUAQA0FAEARxQBAEoUAQBfFAEAYRQBAIAUAQCvFAEAxBQBAMUUAQDHFAEAxxQBAIAVAQCuFQEA2BUBANsVAQAAFgEALxYBAEQWAQBEFgEAgBYBAKoWAQC4FgEAuBYBAAAXAQAaFwEAQBcBAEYXAQAAGAEAKxgBAP8YAQAGGQEACRkBAAkZAQAMGQEAExkBABUZAQAWGQEAGBkBAC8ZAQA/GQEAPxkBAEEZAQBBGQEAoBkBAKcZAQCqGQEA0BkBAOEZAQDhGQEA4xkBAOMZAQAAGgEAABoBAAsaAQAyGgEAOhoBADoaAQBQGgEAUBoBAFwaAQCJGgEAnRoBAJ0aAQCwGgEA+BoBAAAcAQAIHAEAChwBAC4cAQBAHAEAQBwBAHIcAQCPHAEAAB0BAAYdAQAIHQEACR0BAAsdAQAwHQEARh0BAEYdAQBgHQEAZR0BAGcdAQBoHQEAah0BAIkdAQCYHQEAmB0BAOAeAQDyHgEAAh8BAAIfAQAEHwEAEB8BABIfAQAzHwEAsB8BALAfAQAAIAEAmSMBAAAkAQBuJAEAgCQBAEMlAQCQLwEA8C8BAAAwAQAvNAEAQTQBAEY0AQAARAEARkYBAABoAQA4agEAQGoBAF5qAQBwagEAvmoBANBqAQDtagEAAGsBAC9rAQBAawEAQ2sBAGNrAQB3awEAfWsBAI9rAQAAbwEASm8BAFBvAQBQbwEAk28BAJ9vAQDgbwEA4W8BAONvAQDjbwEAAHABAPeHAQAAiAEA1YwBAACNAQAIjQEA8K8BAPOvAQD1rwEA+68BAP2vAQD+rwEAALABACKxAQAysQEAMrEBAFCxAQBSsQEAVbEBAFWxAQBksQEAZ7EBAHCxAQD7sgEAALwBAGq8AQBwvAEAfLwBAIC8AQCIvAEAkLwBAJm8AQAK3wEACt8BAADhAQAs4QEAN+EBAD3hAQBO4QEATuEBAJDiAQCt4gEAwOIBAOviAQDQ5AEA6+QBAODnAQDm5wEA6OcBAOvnAQDt5wEA7ucBAPDnAQD+5wEAAOgBAMToAQBL6QEAS+kBAADuAQAD7gEABe4BAB/uAQAh7gEAIu4BACTuAQAk7gEAJ+4BACfuAQAp7gEAMu4BADTuAQA37gEAOe4BADnuAQA77gEAO+4BAELuAQBC7gEAR+4BAEfuAQBJ7gEASe4BAEvuAQBL7gEATe4BAE/uAQBR7gEAUu4BAFTuAQBU7gEAV+4BAFfuAQBZ7gEAWe4BAFvuAQBb7gEAXe4BAF3uAQBf7gEAX+4BAGHuAQBi7gEAZO4BAGTuAQBn7gEAau4BAGzuAQBy7gEAdO4BAHfuAQB57gEAfO4BAH7uAQB+7gEAgO4BAInuAQCL7gEAm+4BAKHuAQCj7gEApe4BAKnuAQCr7gEAu+4BAAAAAgDfpgIAAKcCADm3AgBAtwIAHbgCACC4AgChzgIAsM4CAODrAgAA+AIAHfoCAAAAAwBKEwMAUBMDAK8jAwAsAAAALQAAADoAAAA6AAAAXQUAAF0FAAAMBgAADQYAAPgHAAD4BwAAAhgAAAIYAAAIGAAACBgAABMgAAAUIAAAATAAAAEwAAAQ/gAAEf4AABP+AAAT/gAAMf4AADL+AABQ/gAAUf4AAFX+AABV/gAAWP4AAFj+AABj/gAAY/4AAAz/AAAN/wAAGv8AABr/AABk/wAAZP8AACEAAAAhAAAAPwAAAD8AAACJBQAAiQUAAB0GAAAfBgAA1AYAANQGAAAABwAAAgcAAPkHAAD5BwAANwgAADcIAAA5CAAAOQgAAD0IAAA+CAAAZAkAAGUJAABKEAAASxAAAGITAABiEwAAZxMAAGgTAABuFgAAbhYAADUXAAA2FwAAAxgAAAMYAAAJGAAACRgAAEQZAABFGQAAqBoAAKsaAABaGwAAWxsAAF4bAABfGwAAfRsAAH4bAAA7HAAAPBwAAH4cAAB/HAAAPCAAAD0gAABHIAAASSAAAC4uAAAuLgAAPC4AADwuAABTLgAAVC4AAAIwAAACMAAA/6QAAP+kAAAOpgAAD6YAAPOmAADzpgAA96YAAPemAAB2qAAAd6gAAM6oAADPqAAAL6kAAC+pAADIqQAAyakAAF2qAABfqgAA8KoAAPGqAADrqwAA66sAAFb+AABX/gAAAf8AAAH/AAAf/wAAH/8AAGH/AABh/wAAVgoBAFcKAQBVDwEAWQ8BAIYPAQCJDwEARxABAEgQAQC+EAEAwRABAEERAQBDEQEAxREBAMYRAQDNEQEAzREBAN4RAQDfEQEAOBIBADkSAQA7EgEAPBIBAKkSAQCpEgEASxQBAEwUAQDCFQEAwxUBAMkVAQDXFQEAQRYBAEIWAQA8FwEAPhcBAEQZAQBEGQEARhkBAEYZAQBCGgEAQxoBAJsaAQCcGgEAQRwBAEIcAQD3HgEA+B4BAEMfAQBEHwEAbmoBAG9qAQD1agEA9WoBADdrAQA4awEARGsBAERrAQCYbgEAmG4BAJ+8AQCfvAEAiNoBAIjaAQCFAAAAhQAAACggAAApIAAACQAAAAkAAAALAAAADAAAACAAAAAgAAAAoAAAAKAAAACAFgAAgBYAAAAgAAAKIAAALyAAAC8gAABfIAAAXyAAAAAwAAAAMAAAQQAAAFoAAADAAAAA1gAAANgAAADeAAAAAAEAAAABAAACAQAAAgEAAAQBAAAEAQAABgEAAAYBAAAIAQAACAEAAAoBAAAKAQAADAEAAAwBAAAOAQAADgEAABABAAAQAQAAEgEAABIBAAAUAQAAFAEAABYBAAAWAQAAGAEAABgBAAAaAQAAGgEAABwBAAAcAQAAHgEAAB4BAAAgAQAAIAEAACIBAAAiAQAAJAEAACQBAAAmAQAAJgEAACgBAAAoAQAAKgEAACoBAAAsAQAALAEAAC4BAAAuAQAAMAEAADABAAAyAQAAMgEAADQBAAA0AQAANgEAADYBAAA5AQAAOQEAADsBAAA7AQAAPQEAAD0BAAA/AQAAPwEAAEEBAABBAQAAQwEAAEMBAABFAQAARQEAAEcBAABHAQAASgEAAEoBAABMAQAATAEAAE4BAABOAQAAUAEAAFABAABSAQAAUgEAAFQBAABUAQAAVgEAAFYBAABYAQAAWAEAAFoBAABaAQAAXAEAAFwBAABeAQAAXgEAAGABAABgAQAAYgEAAGIBAABkAQAAZAEAAGYBAABmAQAAaAEAAGgBAABqAQAAagEAAGwBAABsAQAAbgEAAG4BAABwAQAAcAEAAHIBAAByAQAAdAEAAHQBAAB2AQAAdgEAAHgBAAB5AQAAewEAAHsBAAB9AQAAfQEAAIEBAACCAQAAhAEAAIQBAACGAQAAhwEAAIkBAACLAQAAjgEAAJEBAACTAQAAlAEAAJYBAACYAQAAnAEAAJ0BAACfAQAAoAEAAKIBAACiAQAApAEAAKQBAACmAQAApwEAAKkBAACpAQAArAEAAKwBAACuAQAArwEAALEBAACzAQAAtQEAALUBAAC3AQAAuAEAALwBAAC8AQAAxAEAAMUBAADHAQAAyAEAAMoBAADLAQAAzQEAAM0BAADPAQAAzwEAANEBAADRAQAA0wEAANMBAADVAQAA1QEAANcBAADXAQAA2QEAANkBAADbAQAA2wEAAN4BAADeAQAA4AEAAOABAADiAQAA4gEAAOQBAADkAQAA5gEAAOYBAADoAQAA6AEAAOoBAADqAQAA7AEAAOwBAADuAQAA7gEAAPEBAADyAQAA9AEAAPQBAAD2AQAA+AEAAPoBAAD6AQAA/AEAAPwBAAD+AQAA/gEAAAACAAAAAgAAAgIAAAICAAAEAgAABAIAAAYCAAAGAgAACAIAAAgCAAAKAgAACgIAAAwCAAAMAgAADgIAAA4CAAAQAgAAEAIAABICAAASAgAAFAIAABQCAAAWAgAAFgIAABgCAAAYAgAAGgIAABoCAAAcAgAAHAIAAB4CAAAeAgAAIAIAACACAAAiAgAAIgIAACQCAAAkAgAAJgIAACYCAAAoAgAAKAIAACoCAAAqAgAALAIAACwCAAAuAgAALgIAADACAAAwAgAAMgIAADICAAA6AgAAOwIAAD0CAAA+AgAAQQIAAEECAABDAgAARgIAAEgCAABIAgAASgIAAEoCAABMAgAATAIAAE4CAABOAgAAcAMAAHADAAByAwAAcgMAAHYDAAB2AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAjwMAAJEDAAChAwAAowMAAKsDAADPAwAAzwMAANIDAADUAwAA2AMAANgDAADaAwAA2gMAANwDAADcAwAA3gMAAN4DAADgAwAA4AMAAOIDAADiAwAA5AMAAOQDAADmAwAA5gMAAOgDAADoAwAA6gMAAOoDAADsAwAA7AMAAO4DAADuAwAA9AMAAPQDAAD3AwAA9wMAAPkDAAD6AwAA/QMAAC8EAABgBAAAYAQAAGIEAABiBAAAZAQAAGQEAABmBAAAZgQAAGgEAABoBAAAagQAAGoEAABsBAAAbAQAAG4EAABuBAAAcAQAAHAEAAByBAAAcgQAAHQEAAB0BAAAdgQAAHYEAAB4BAAAeAQAAHoEAAB6BAAAfAQAAHwEAAB+BAAAfgQAAIAEAACABAAAigQAAIoEAACMBAAAjAQAAI4EAACOBAAAkAQAAJAEAACSBAAAkgQAAJQEAACUBAAAlgQAAJYEAACYBAAAmAQAAJoEAACaBAAAnAQAAJwEAACeBAAAngQAAKAEAACgBAAAogQAAKIEAACkBAAApAQAAKYEAACmBAAAqAQAAKgEAACqBAAAqgQAAKwEAACsBAAArgQAAK4EAACwBAAAsAQAALIEAACyBAAAtAQAALQEAAC2BAAAtgQAALgEAAC4BAAAugQAALoEAAC8BAAAvAQAAL4EAAC+BAAAwAQAAMEEAADDBAAAwwQAAMUEAADFBAAAxwQAAMcEAADJBAAAyQQAAMsEAADLBAAAzQQAAM0EAADQBAAA0AQAANIEAADSBAAA1AQAANQEAADWBAAA1gQAANgEAADYBAAA2gQAANoEAADcBAAA3AQAAN4EAADeBAAA4AQAAOAEAADiBAAA4gQAAOQEAADkBAAA5gQAAOYEAADoBAAA6AQAAOoEAADqBAAA7AQAAOwEAADuBAAA7gQAAPAEAADwBAAA8gQAAPIEAAD0BAAA9AQAAPYEAAD2BAAA+AQAAPgEAAD6BAAA+gQAAPwEAAD8BAAA/gQAAP4EAAAABQAAAAUAAAIFAAACBQAABAUAAAQFAAAGBQAABgUAAAgFAAAIBQAACgUAAAoFAAAMBQAADAUAAA4FAAAOBQAAEAUAABAFAAASBQAAEgUAABQFAAAUBQAAFgUAABYFAAAYBQAAGAUAABoFAAAaBQAAHAUAABwFAAAeBQAAHgUAACAFAAAgBQAAIgUAACIFAAAkBQAAJAUAACYFAAAmBQAAKAUAACgFAAAqBQAAKgUAACwFAAAsBQAALgUAAC4FAAAxBQAAVgUAAKAQAADFEAAAxxAAAMcQAADNEAAAzRAAAKATAAD1EwAAAB4AAAAeAAACHgAAAh4AAAQeAAAEHgAABh4AAAYeAAAIHgAACB4AAAoeAAAKHgAADB4AAAweAAAOHgAADh4AABAeAAAQHgAAEh4AABIeAAAUHgAAFB4AABYeAAAWHgAAGB4AABgeAAAaHgAAGh4AABweAAAcHgAAHh4AAB4eAAAgHgAAIB4AACIeAAAiHgAAJB4AACQeAAAmHgAAJh4AACgeAAAoHgAAKh4AACoeAAAsHgAALB4AAC4eAAAuHgAAMB4AADAeAAAyHgAAMh4AADQeAAA0HgAANh4AADYeAAA4HgAAOB4AADoeAAA6HgAAPB4AADweAAA+HgAAPh4AAEAeAABAHgAAQh4AAEIeAABEHgAARB4AAEYeAABGHgAASB4AAEgeAABKHgAASh4AAEweAABMHgAATh4AAE4eAABQHgAAUB4AAFIeAABSHgAAVB4AAFQeAABWHgAAVh4AAFgeAABYHgAAWh4AAFoeAABcHgAAXB4AAF4eAABeHgAAYB4AAGAeAABiHgAAYh4AAGQeAABkHgAAZh4AAGYeAABoHgAAaB4AAGoeAABqHgAAbB4AAGweAABuHgAAbh4AAHAeAABwHgAAch4AAHIeAAB0HgAAdB4AAHYeAAB2HgAAeB4AAHgeAAB6HgAAeh4AAHweAAB8HgAAfh4AAH4eAACAHgAAgB4AAIIeAACCHgAAhB4AAIQeAACGHgAAhh4AAIgeAACIHgAAih4AAIoeAACMHgAAjB4AAI4eAACOHgAAkB4AAJAeAACSHgAAkh4AAJQeAACUHgAAnh4AAJ4eAACgHgAAoB4AAKIeAACiHgAApB4AAKQeAACmHgAAph4AAKgeAACoHgAAqh4AAKoeAACsHgAArB4AAK4eAACuHgAAsB4AALAeAACyHgAAsh4AALQeAAC0HgAAth4AALYeAAC4HgAAuB4AALoeAAC6HgAAvB4AALweAAC+HgAAvh4AAMAeAADAHgAAwh4AAMIeAADEHgAAxB4AAMYeAADGHgAAyB4AAMgeAADKHgAAyh4AAMweAADMHgAAzh4AAM4eAADQHgAA0B4AANIeAADSHgAA1B4AANQeAADWHgAA1h4AANgeAADYHgAA2h4AANoeAADcHgAA3B4AAN4eAADeHgAA4B4AAOAeAADiHgAA4h4AAOQeAADkHgAA5h4AAOYeAADoHgAA6B4AAOoeAADqHgAA7B4AAOweAADuHgAA7h4AAPAeAADwHgAA8h4AAPIeAAD0HgAA9B4AAPYeAAD2HgAA+B4AAPgeAAD6HgAA+h4AAPweAAD8HgAA/h4AAP4eAAAIHwAADx8AABgfAAAdHwAAKB8AAC8fAAA4HwAAPx8AAEgfAABNHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAF8fAABoHwAAbx8AAIgfAACPHwAAmB8AAJ8fAACoHwAArx8AALgfAAC8HwAAyB8AAMwfAADYHwAA2x8AAOgfAADsHwAA+B8AAPwfAAACIQAAAiEAAAchAAAHIQAACyEAAA0hAAAQIQAAEiEAABUhAAAVIQAAGSEAAB0hAAAkIQAAJCEAACYhAAAmIQAAKCEAACghAAAqIQAALSEAADAhAAAzIQAAPiEAAD8hAABFIQAARSEAAGAhAABvIQAAgyEAAIMhAAC2JAAAzyQAAAAsAAAvLAAAYCwAAGAsAABiLAAAZCwAAGcsAABnLAAAaSwAAGksAABrLAAAaywAAG0sAABwLAAAciwAAHIsAAB1LAAAdSwAAH4sAACALAAAgiwAAIIsAACELAAAhCwAAIYsAACGLAAAiCwAAIgsAACKLAAAiiwAAIwsAACMLAAAjiwAAI4sAACQLAAAkCwAAJIsAACSLAAAlCwAAJQsAACWLAAAliwAAJgsAACYLAAAmiwAAJosAACcLAAAnCwAAJ4sAACeLAAAoCwAAKAsAACiLAAAoiwAAKQsAACkLAAApiwAAKYsAACoLAAAqCwAAKosAACqLAAArCwAAKwsAACuLAAAriwAALAsAACwLAAAsiwAALIsAAC0LAAAtCwAALYsAAC2LAAAuCwAALgsAAC6LAAAuiwAALwsAAC8LAAAviwAAL4sAADALAAAwCwAAMIsAADCLAAAxCwAAMQsAADGLAAAxiwAAMgsAADILAAAyiwAAMosAADMLAAAzCwAAM4sAADOLAAA0CwAANAsAADSLAAA0iwAANQsAADULAAA1iwAANYsAADYLAAA2CwAANosAADaLAAA3CwAANwsAADeLAAA3iwAAOAsAADgLAAA4iwAAOIsAADrLAAA6ywAAO0sAADtLAAA8iwAAPIsAABApgAAQKYAAEKmAABCpgAARKYAAESmAABGpgAARqYAAEimAABIpgAASqYAAEqmAABMpgAATKYAAE6mAABOpgAAUKYAAFCmAABSpgAAUqYAAFSmAABUpgAAVqYAAFamAABYpgAAWKYAAFqmAABapgAAXKYAAFymAABepgAAXqYAAGCmAABgpgAAYqYAAGKmAABkpgAAZKYAAGamAABmpgAAaKYAAGimAABqpgAAaqYAAGymAABspgAAgKYAAICmAACCpgAAgqYAAISmAACEpgAAhqYAAIamAACIpgAAiKYAAIqmAACKpgAAjKYAAIymAACOpgAAjqYAAJCmAACQpgAAkqYAAJKmAACUpgAAlKYAAJamAACWpgAAmKYAAJimAACapgAAmqYAACKnAAAipwAAJKcAACSnAAAmpwAAJqcAACinAAAopwAAKqcAACqnAAAspwAALKcAAC6nAAAupwAAMqcAADKnAAA0pwAANKcAADanAAA2pwAAOKcAADinAAA6pwAAOqcAADynAAA8pwAAPqcAAD6nAABApwAAQKcAAEKnAABCpwAARKcAAESnAABGpwAARqcAAEinAABIpwAASqcAAEqnAABMpwAATKcAAE6nAABOpwAAUKcAAFCnAABSpwAAUqcAAFSnAABUpwAAVqcAAFanAABYpwAAWKcAAFqnAABapwAAXKcAAFynAABepwAAXqcAAGCnAABgpwAAYqcAAGKnAABkpwAAZKcAAGanAABmpwAAaKcAAGinAABqpwAAaqcAAGynAABspwAAbqcAAG6nAAB5pwAAeacAAHunAAB7pwAAfacAAH6nAACApwAAgKcAAIKnAACCpwAAhKcAAISnAACGpwAAhqcAAIunAACLpwAAjacAAI2nAACQpwAAkKcAAJKnAACSpwAAlqcAAJanAACYpwAAmKcAAJqnAACapwAAnKcAAJynAACepwAAnqcAAKCnAACgpwAAoqcAAKKnAACkpwAApKcAAKanAACmpwAAqKcAAKinAACqpwAArqcAALCnAAC0pwAAtqcAALanAAC4pwAAuKcAALqnAAC6pwAAvKcAALynAAC+pwAAvqcAAMCnAADApwAAwqcAAMKnAADEpwAAx6cAAMmnAADJpwAA0KcAANCnAADWpwAA1qcAANinAADYpwAA9acAAPWnAAAh/wAAOv8AAAAEAQAnBAEAsAQBANMEAQBwBQEAegUBAHwFAQCKBQEAjAUBAJIFAQCUBQEAlQUBAIAMAQCyDAEAoBgBAL8YAQBAbgEAX24BAADUAQAZ1AEANNQBAE3UAQBo1AEAgdQBAJzUAQCc1AEAntQBAJ/UAQCi1AEAotQBAKXUAQCm1AEAqdQBAKzUAQCu1AEAtdQBANDUAQDp1AEABNUBAAXVAQAH1QEACtUBAA3VAQAU1QEAFtUBABzVAQA41QEAOdUBADvVAQA+1QEAQNUBAETVAQBG1QEARtUBAErVAQBQ1QEAbNUBAIXVAQCg1QEAudUBANTVAQDt1QEACNYBACHWAQA81gEAVdYBAHDWAQCJ1gEAqNYBAMDWAQDi1gEA+tYBABzXAQA01wEAVtcBAG7XAQCQ1wEAqNcBAMrXAQDK1wEAAOkBACHpAQAw8QEASfEBAFDxAQBp8QEAcPEBAInxAQAGqyEABQAAALQgJAAEAAAALochAAIAAADUICQAAQAAABKrIQAFAAAA3CAkAC0AAABkhyEABgAAAEQiJAA5AQAAhH4hAAYAAAAMLCQAFQAAAJCHIQACAAAAtCwkAAEAAAAlqyEABQAAALwsJACdAgAAKqshAAcAAACkQSQAQQAAAB6rIQAHAAAArEMkAB8CAAA/qyEACQAAAKRUJAATAAAAX6shAAUAAAA8VSQATQAAAFOrIQADAAAApFckAAIAAABbqyEAAgAAALRXJAAJAAAAZqshAAUAAAD8VyQAjAIAAEEAAABaAAAAYQAAAHoAAACqAAAAqgAAALUAAAC1AAAAugAAALoAAADAAAAA1gAAANgAAAD2AAAA+AAAANcCAADeAgAA/wIAAHADAAB0AwAAdgMAAHcDAAB6AwAAfQMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAKEDAACjAwAA9QMAAPcDAACBBAAAigQAAC8FAAAxBQAAVgUAAFkFAABcBQAAXgUAAF4FAABgBQAAiAUAAIoFAACKBQAA8wUAAPMFAAAgBgAASgYAAG4GAABvBgAAcQYAANMGAADVBgAA1QYAAOUGAADmBgAA7gYAAO8GAAD6BgAA/AYAAP8GAAD/BgAAEAcAABAHAAASBwAALwcAAE0HAAClBwAAsQcAALEHAADKBwAA6gcAAPQHAAD1BwAA+gcAAPoHAAAACAAAFQgAABoIAAAaCAAAJAgAACQIAAAoCAAAKAgAAEAIAABYCAAAYAgAAGoIAABwCAAAhwgAAIkIAACOCAAAoAgAAMkIAAAECQAAOQkAAD0JAAA9CQAAUAkAAFAJAABYCQAAYQkAAHEJAACACQAAhQkAAIwJAACPCQAAkAkAAJMJAACoCQAAqgkAALAJAACyCQAAsgkAALYJAAC5CQAAvQkAAL0JAADOCQAAzgkAANwJAADdCQAA3wkAAOEJAADwCQAA8QkAAPwJAAD8CQAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAABZCgAAXAoAAF4KAABeCgAAcgoAAHQKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC9CgAAvQoAANAKAADQCgAA4AoAAOEKAAD5CgAA+QoAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAAA9CwAAXAsAAF0LAABfCwAAYQsAAHELAABxCwAAgwsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAADQCwAA0AsAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPQwAAD0MAABYDAAAWgwAAF0MAABdDAAAYAwAAGEMAACADAAAgAwAAIUMAACMDAAAjgwAAJAMAACSDAAAqAwAAKoMAACzDAAAtQwAALkMAAC9DAAAvQwAAN0MAADeDAAA4AwAAOEMAADxDAAA8gwAAAQNAAAMDQAADg0AABANAAASDQAAOg0AAD0NAAA9DQAATg0AAE4NAABUDQAAVg0AAF8NAABhDQAAeg0AAH8NAACFDQAAlg0AAJoN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AACIrQAApK0AAKStAADArQAAwK0AANytAADcrQAA+K0AAPitAAAUrgAAFK4AADCuAAAwrgAATK4AAEyuAABorgAAaK4AAISuAACErgAAoK4AAKCuAAC8rgAAvK4AANiuAADYrgAA9K4AAPSuAAAQrwAAEK8AACyvAAAsrwAASK8AAEivAABkrwAAZK8AAICvAACArwAAnK8AAJyvAAC4rwAAuK8AANSvAADUrwAA8K8AAPCvAAAMsAAADLAAACiwAAAosAAARLAAAESwAABgsAAAYLAAAHywAAB8sAAAmLAAAJiwAAC0sAAAtLAAANCwAADQsAAA7LAAAOywAAAIsQAACLEAACSxAAAksQAAQLEAAECxAABcsQAAXLEAAHixAAB4sQAAlLEAAJSxAACwsQAAsLEAAMyxAADMsQAA6LEAAOixAAAEsgAABLIAACCyAAAgsgAAPLIAADyyAABYsgAAWLIAAHSyAAB0sgAAkLIAAJCyAACssgAArLIAAMiyAADIsgAA5LIAAOSyAAAAswAAALMAAByzAAAcswAAOLMAADizAABUswAAVLMAAHCzAABwswAAjLMAAIyzAACoswAAqLMAAMSzAADEswAA4LMAAOCzAAD8swAA/LMAABi0AAAYtAAANLQAADS0AABQtAAAULQAAGy0AABstAAAiLQAAIi0AACktAAApLQAAMC0AADAtAAA3LQAANy0AAD4tAAA+LQAABS1AAAUtQAAMLUAADC1AABMtQAATLUAAGi1AABotQAAhLUAAIS1AACgtQAAoLUAALy1AAC8tQAA2LUAANi1AAD0tQAA9LUAABC2AAAQtgAALLYAACy2AABItgAASLYAAGS2AABktgAAgLYAAIC2AACctgAAnLYAALi2AAC4tgAA1LYAANS2AADwtgAA8LYAAAy3AAAMtwAAKLcAACi3AABEtwAARLcAAGC3AABgtwAAfLcAAHy3AACYtwAAmLcAALS3AAC0twAA0LcAANC3AADstwAA7LcAAAi4AAAIuAAAJLgAACS4AABAuAAAQLgAAFy4AABcuAAAeLgAAHi4AACUuAAAlLgAALC4AACwuAAAzLgAAMy4AADouAAA6LgAAAS5AAAEuQAAILkAACC5AAA8uQAAPLkAAFi5AABYuQAAdLkAAHS5AACQuQAAkLkAAKy5AACsuQAAyLkAAMi5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AACA0gAAgNIAAJzSAACc0gAAuNIAALjSAADU0gAA1NIAAPDSAADw0gAADNMAAAzTAAAo0wAAKNMAAETTAABE0wAAYNMAAGDTAAB80wAAfNMAAJjTAACY0wAAtNMAALTTAADQ0wAA0NMAAOzTAADs0wAACNQAAAjUAAAk1AAAJNQAAEDUAABA1AAAXNQAAFzUAAB41AAAeNQAAJTUAACU1AAAsNQAALDUAADM1AAAzNQAAOjUAADo1AAABNUAAATVAAAg1QAAINUAADzVAAA81QAAWNUAAFjVAAB01QAAdNUAAJDVAACQ1QAArNUAAKzVAADI1QAAyNUAAOTVAADk1QAAANYAAADWAAAc1gAAHNYAADjWAAA41gAAVNYAAFTWAABw1gAAcNYAAIzWAACM1gAAqNYAAKjWAADE1gAAxNYAAODWAADg1gAA/NYAAPzWAAAY1wAAGNcAADTXAAA01wAAUNcAAFDXAABs1wAAbNcAAIjXAACI1wAAAawAABusAAAdrAAAN6wAADmsAABTrAAAVawAAG+sAABxrAAAi6wAAI2sAACnrAAAqawAAMOsAADFrAAA36wAAOGsAAD7rAAA/awAABetAAAZrQAAM60AADWtAABPrQAAUa0AAGutAABtrQAAh60AAImtAACjrQAApa0AAL+tAADBrQAA260AAN2tAAD3rQAA+a0AABOuAAAVrgAAL64AADGuAABLrgAATa4AAGeuAABprgAAg64AAIWuAACfrgAAoa4AALuuAAC9rgAA164AANmuAADzrgAA9a4AAA+vAAARrwAAK68AAC2vAABHrwAASa8AAGOvAABlrwAAf68AAIGvAACbrwAAna8AALevAAC5rwAA068AANWvAADvrwAA8a8AAAuwAAANsAAAJ7AAACmwAABDsAAARbAAAF+wAABhsAAAe7AAAH2wAACXsAAAmbAAALOwAAC1sAAAz7AAANGwAADrsAAA7bAAAAexAAAJsQAAI7EAACWxAAA/sQAAQbEAAFuxAABdsQAAd7EAAHmxAACTsQAAlbEAAK+xAACxsQAAy7EAAM2xAADnsQAA6bEAAAOyAAAFsgAAH7IAACGyAAA7sgAAPbIAAFeyAABZsgAAc7IAAHWyAACPsgAAkbIAAKuyAACtsgAAx7IAAMmyAADjsgAA5bIAAP+yAAABswAAG7MAAB2zAAA3swAAObMAAFOzAABVswAAb7MAAHGzAACLswAAjbMAAKezAACpswAAw7MAAMWzAADfswAA4bMAAPuzAAD9swAAF7QAABm0AAAztAAANbQAAE+0AABRtAAAa7QAAG20AACHtAAAibQAAKO0AACltAAAv7QAAMG0AADbtAAA3bQAAPe0AAD5tAAAE7UAABW1AAAvtQAAMbUAAEu1AABNtQAAZ7UAAGm1AACDtQAAhbUAAJ+1AAChtQAAu7UAAL21AADXtQAA2bUAAPO1AAD1tQAAD7YAABG2AAArtgAALbYAAEe2AABJtgAAY7YAAGW2AAB/tgAAgbYAAJu2AACdtgAAt7YAALm2AADTtgAA1bYAAO+2AADxtgAAC7cAAA23AAAntwAAKbcAAEO3AABFtwAAX7cAAGG3AAB7twAAfbcAAJe3AACZtwAAs7cAALW3AADPtwAA0bcAAOu3AADttwAAB7gAAAm4AAAjuAAAJbgAAD+4AABBuAAAW7gAAF24AAB3uAAAebgAAJO4AACVuAAAr7gAALG4AADLuAAAzbgAAOe4AADpuAAAA7kAAAW5AAAfuQAAIbkAADu5AAA9uQAAV7kAAFm5AABzuQAAdbkAAI+5AACRuQAAq7kAAK25AADHuQAAybkAAOO5AADluQAA/7kAAAG6AAAbugAAHboAADe6AAA5ugAAU7oAAFW6AABvugAAcboAAIu6AACNugAAp7oAAKm6AADDugAAxboAAN+6AADhugAA+7oAAP26AAAXuwAAGbsAADO7AAA1uwAAT7sAAFG7AABruwAAbbsAAIe7AACJuwAAo7sAAKW7AAC/uwAAwbsAANu7AADduwAA97sAAPm7AAATvAAAFbwAAC+8AAAxvAAAS7wAAE28AABnvAAAabwAAIO8AACFvAAAn7wAAKG8AAC7vAAAvbwAANe8AADZvAAA87wAAPW8AAAPvQAAEb0AACu9AAAtvQAAR70AAEm9AABjvQAAZb0AAH+9AACBvQAAm70AAJ29AAC3vQAAub0AANO9AADVvQAA770AAPG9AAALvgAADb4AACe+AAApvgAAQ74AAEW+AABfvgAAYb4AAHu+AAB9vgAAl74AAJm+AACzvgAAtb4AAM++AADRvgAA674AAO2+AAAHvwAACb8AACO/AAAlvwAAP78AAEG/AABbvwAAXb8AAHe/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AABrHgAAbR4AAG0eAABvHgAAbx4AAHEeAABxHgAAcx4AAHMeAAB1HgAAdR4AAHceAAB3HgAAeR4AAHkeAAB7HgAAex4AAH0eAAB9HgAAfx4AAH8eAACBHgAAgR4AAIMeAACDHgAAhR4AAIUeAACHHgAAhx4AAIkeAACJHgAAix4AAIseAACNHgAAjR4AAI8eAACPHgAAkR4AAJEeAACTHgAAkx4AAJUeAACdHgAAnx4AAJ8eAAChHgAAoR4AAKMeAACjHgAApR4AAKUeAACnHgAApx4AAKkeAACpHgAAqx4AAKseAACtHgAArR4AAK8eAACvHgAAsR4AALEeAACzHgAAsx4AALUeAAC1HgAAtx4AALceAAC5HgAAuR4AALseAAC7HgAAvR4AAL0eAAC/HgAAvx4AAMEeAADBHgAAwx4AAMMeAADFHgAAxR4AAMceAADHHgAAyR4AAMkeAADLHgAAyx4AAM0eAADNHgAAzx4AAM8eAADRHgAA0R4AANMeAADTHgAA1R4AANUeAADXHgAA1x4AANkeAADZHgAA2x4AANseAADdHgAA3R4AAN8eAADfHgAA4R4AAOEeAADjHgAA4x4AAOUeAADlHgAA5x4AAOceAADpHgAA6R4AAOseAADrHgAA7R4AAO0eAADvHgAA7x4AAPEeAADxHgAA8x4AAPMeAAD1HgAA9R4AAPceAAD3HgAA+R4AAPkeAAD7HgAA+x4AAP0eAAD9HgAA/x4AAAcfAAAQHwAAFR8AACAfAAAnHwAAMB8AADcfAABAHwAARR8AAFAfAABXHwAAYB8AAGcfAABwHwAAfR8AAIAfAACHHwAAkB8AAJcfAACgHwAApx8AALAfAAC0HwAAth8AALcfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMcfAADQHwAA0x8AANYfAADXHwAA4B8AAOcfAADyHwAA9B8AAPYfAAD3HwAACiEAAAohAAAOIQAADyEAABMhAAATIQAALyEAAC8hAAA0IQAANCEAADkhAAA5IQAAPCEAAD0hAABGIQAASSEAAE4hAABOIQAAhCEAAIQhAAAwLAAAXywAAGEsAABhLAAAZSwAAGYsAABoLAAAaCwAAGosAABqLAAAbCwAAGwsAABxLAAAcSwAAHMsAAB0LAAAdiwAAHssAACBLAAAgSwAAIMsAACDLAAAhSwAAIUsAACHLAAAhywAAIksAACJLAAAiywAAIssAACNLAAAjSwAAI8sAACPLAAAkSwAAJEsAACTLAAAkywAAJUsAACVLAAAlywAAJcsAACZLAAAmSwAAJssAACbLAAAnSwAAJ0sAACfLAAAnywAAKEsAAChLAAAoywAAKMsAAClLAAApSwAAKcsAACnLAAAqSwAAKksAACrLAAAqywAAK0sAACtLAAArywAAK8sAACxLAAAsSwAALMsAACzLAAAtSwAALUsAAC3LAAAtywAALksAAC5LAAAuywAALssAAC9LAAAvSwAAL8sAAC/LAAAwSwAAMEsAADDLAAAwywAAMUsAADFLAAAxywAAMcsAADJLAAAySwAAMssAADLLAAAzSwAAM0sAADPLAAAzywAANEsAADRLAAA0ywAANMsAADVLAAA1SwAANcsAADXLAAA2SwAANksAADbLAAA2ywAAN0sAADdLAAA3ywAAN8sAADhLAAA4SwAAOMsAADkLAAA7CwAAOwsAADuLAAA7iwAAPMsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQaYAAEGmAABDpgAAQ6YAAEWmAABFpgAAR6YAAEemAABJpgAASaYAAEumAABLpgAATaYAAE2mAABPpgAAT6YAAFGmAABRpgAAU6YAAFOmAABVpgAAVaYAAFemAABXpgAAWaYAAFmmAABbpgAAW6YAAF2mAABdpgAAX6YAAF+mAABhpgAAYaYAAGOmAABjpgAAZaYAAGWmAABnpgAAZ6YAAGmmAABppgAAa6YAAGumAABtpgAAbaYAAIGmAACBpgAAg6YAAIOmAACFpgAAhaYAAIemAACHpgAAiaYAAImmAACLpgAAi6YAAI2mAACNpgAAj6YAAI+mAACRpgAAkaYAAJOmAACTpgAAlaYAAJWmAACXpgAAl6YAAJmmAACZpgAAm6YAAJumAAAjpwAAI6cAACWnAAAlpwAAJ6cAACenAAAppwAAKacAACunAAArpwAALacAAC2nAAAvpwAAMacAADOnAAAzpwAANacAADWnAAA3pwAAN6cAADmnAAA5pwAAO6cAADunAAA9pwAAPacAAD+nAAA/pwAAQacAAEGnAABDpwAAQ6cAAEWnAABFpwAAR6cAAEenAABJpwAASacAAEunAABLpwAATacAAE2nAABPpwAAT6cAAFGnAABRpwAAU6cAAFOnAABVpwAAVacAAFenAABXpwAAWacAAFmnAABbpwAAW6cAAF2nAABdpwAAX6cAAF+nAABhpwAAYacAAGOnAABjpwAAZacAAGWnAABnpwAAZ6cAAGmnAABppwAAa6cAAGunAABtpwAAbacAAG+nAABvpwAAcacAAHinAAB6pwAAeqcAAHynAAB8pwAAf6cAAH+nAACBpwAAgacAAIOnAACDpwAAhacAAIWnAACHpwAAh6cAAIynAACMpwAAjqcAAI6nAACRpwAAkacAAJOnAACVpwAAl6cAAJenAACZpwAAmacAAJunAACbpwAAnacAAJ2nAACfpwAAn6cAAKGnAAChpwAAo6cAAKOnAAClpwAApacAAKenAACnpwAAqacAAKmnAACvpwAAr6cAALWnAAC1pwAAt6cAALenAAC5pwAAuacAALunAAC7pwAAvacAAL2nAAC/pwAAv6cAAMGnAADBpwAAw6cAAMOnAADIpwAAyKcAAMqnAADKpwAA0acAANGnAADTpwAA06cAANWnAADVpwAA16cAANenAADZpwAA2acAAPanAAD2pwAA+qcAAPqnAAAwqwAAWqsAAGCrAABoqwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAQf8AAFr/AAAoBAEATwQBANgEAQD7BAEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQDADAEA8gwBAMAYAQDfGAEAYG4BAH9uAQAa1AEAM9QBAE7UAQBU1AEAVtQBAGfUAQCC1AEAm9QBALbUAQC51AEAu9QBALvUAQC91AEAw9QBAMXUAQDP1AEA6tQBAAPVAQAe1QEAN9UBAFLVAQBr1QEAhtUBAJ/VAQC61QEA09UBAO7VAQAH1gEAItYBADvWAQBW1gEAb9YBAIrWAQCl1gEAwtYBANrWAQDc1gEA4dYBAPzWAQAU1wEAFtcBABvXAQA21wEATtcBAFDXAQBV1wEAcNcBAIjXAQCK1wEAj9cBAKrXAQDC1wEAxNcBAMnXAQDL1wEAy9cBAADfAQAJ3wEAC98BAB7fAQAl3wEAKt8BACLpAQBD6QEAAAMAAG8DAACDBAAAiQQAAJEFAAC9BQAAvwUAAL8FAADBBQAAwgUAAMQFAADFBQAAxwUAAMcFAAAQBgAAGgYAAEsGAABfBgAAcAYAAHAG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AACeHgAAoB4AAKAeAACiHgAAoh4AAKQeAACkHgAAph4AAKYeAACoHgAAqB4AAKoeAACqHgAArB4AAKweAACuHgAArh4AALAeAACwHgAAsh4AALIeAAC0HgAAtB4AALYeAAC2HgAAuB4AALgeAAC6HgAAuh4AALweAAC8HgAAvh4AAL4eAADAHgAAwB4AAMIeAADCHgAAxB4AAMQeAADGHgAAxh4AAMgeAADIHgAAyh4AAMoeAADMHgAAzB4AAM4eAADOHgAA0B4AANAeAADSHgAA0h4AANQeAADUHgAA1h4AANYeAADYHgAA2B4AANoeAADaHgAA3B4AANweAADeHgAA3h4AAOAeAADgHgAA4h4AAOIeAADkHgAA5B4AAOYeAADmHgAA6B4AAOgeAADqHgAA6h4AAOweAADsHgAA7h4AAO4eAADwHgAA8B4AAPIeAADyHgAA9B4AAPQeAAD2HgAA9h4AAPgeAAD4HgAA+h4AAPoeAAD8HgAA/B4AAP4eAAD+HgAACB8AAA8fAAAYHwAAHR8AACgfAAAvHwAAOB8AAD8fAABIHwAATR8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAABfHwAAaB8AAG8fAAC4HwAAux8AAMgfAADLHwAA2B8AANsfAADoHwAA7B8AAPgfAAD7HwAAAiEAAAIhAAAHIQAAByEAAAshAAANIQAAECEAABIhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAAC0hAAAwIQAAMyEAAD4hAAA/IQAARSEAAEUhAACDIQAAgyEAAAAsAAAvLAAAYCwAAGAsAABiLAAAZCwAAGcsAABnLAAAaSwAAGksAABrLAAAaywAAG0sAABwLAAAciwAAHIsAAB1LAAAdSwAAH4sAACALAAAgiwAAIIsAACELAAAhCwAAIYsAACGLAAAiCwAAIgsAACKLAAAiiwAAIwsAACMLAAAjiwAAI4sAACQLAAAkCwAAJIsAACSLAAAlCwAAJQsAACWLAAAliwAAJgsAACYLAAAmiwAAJosAACcLAAAnCwAAJ4sAACeLAAAoCwAAKAsAACiLAAAoiwAAKQsAACkLAAApiwAAKYsAACoLAAAqCwAAKosAACqLAAArCwAAKwsAACuLAAAriwAALAsAACwLAAAsiwAALIsAAC0LAAAtCwAALYsAAC2LAAAuCwAALgsAAC6LAAAuiwAALwsAAC8LAAAviwAAL4sAADALAAAwCwAAMIsAADCLAAAxCwAAMQsAADGLAAAxiwAAMgsAADILAAAyiwAAMosAADMLAAAzCwAAM4sAADOLAAA0CwAANAsAADSLAAA0iwAANQsAADULAAA1iwAANYsAADYLAAA2CwAANosAADaLAAA3CwAANwsAADeLAAA3iwAAOAsAADgLAAA4iwAAOIsAADrLAAA6ywAAO0sAADtLAAA8iwAAPIsAABApgAAQKYAAEKmAABCpgAARKYAAESmAABGpgAARqYAAEimAABIpgAASqYAAEqmAABMpgAATKYAAE6mAABOpgAAUKYAAFCmAABSpgAAUqYAAFSmAABUpgAAVqYAAFamAABYpgAAWKYAAFqmAABapgAAXKYAAFymAABepgAAXqYAAGCmAABgpgAAYqYAAGKmAABkpgAAZKYAAGamAABmpgAAaKYAAGimAABqpgAAaqYAAGymAABspgAAgKYAAICmAACCpgAAgqYAAISmAACEpgAAhqYAAIamAACIpgAAiKYAAIqmAACKpgAAjKYAAIymAACOpgAAjqYAAJCmAACQpgAAkqYAAJKmAACUpgAAlKYAAJamAACWpgAAmKYAAJimAACapgAAmqYAACKnAAAipwAAJKcAACSnAAAmpwAAJqcAACinAAAopwAAKqcAACqnAAAspwAALKcAAC6nAAAupwAAMqcAADKnAAA0pwAANKcAADanAAA2pwAAOKcAADinAAA6pwAAOqcAADynAAA8pwAAPqcAAD6nAABApwAAQKcAAEKnAABCpwAARKcAAESnAABGpwAARqcAAEinAABIpwAASqcAAEqnAABMpwAATKcAAE6nAABOpwAAUKcAAFCnAABSpwAAUqcAAFSnAABUpwAAVqcAAFanAABYpwAAWKcAAFqnAABapwAAXKcAAFynAABepwAAXqcAAGCnAABgpwAAYqcAAGKnAABkpwAAZKcAAGanAABmpwAAaKcAAGinAABqpwAAaqcAAGynAABspwAAbqcAAG6nAAB5pwAAeacAAHunAAB7pwAAfacAAH6nAACApwAAgKcAAIKnAACCpwAAhKcAAISnAACGpwAAhqcAAIunAACLpwAAjacAAI2nAACQpwAAkKcAAJKn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IQAGAAAAfM4lAAEAAADblSEABAAAAOT8IwACAAAA5pUhAAcAAAD0/CMABwAAALuVIQAIAAAALP0jAAMAAAD9lSEABwAAAITOJQACAAAAE5YhAAQAAAB0/SMAAQAAABuWIQAIAAAAfP0jAAIAAAAuliEAAwAAAIz9IwABAAAAOZYhAAgAAACU/SMACAAAAE+WIQAGAAAA1P0jAAIAAABZliEACwAAAOT9IwACAAAAfpYhAAYAAACUziUAAwAAAIyWIQACAAAArM4lAAIAAAChliEAEAAAAGT+IwABAAAAJyAnABw4IABkAAAAGAAAAD0AAAAcOCAAZAAAABUAAAANAAAAVHJ5RnJvbUNoYXJFcnJvckNsYXNzQnl0ZXNSZXBldGl0aW9ubWlubWF4Z3JlZWR5aW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgZm91bmQgaW4gY2hhcmFjdGVyIGNsYXNzaW52YWxpZCBjaGFyYWN0ZXIgY2xhc3MgcmFuZ2UsIHRoZSBzdGFydCBtdXN0IGJlIDw9IHRoZSBlbmRpbnZhbGlkIHJhbmdlIGJvdW5kYXJ5LCBtdXN0IGJlIGEgbGl0ZXJhbHVuY2xvc2VkIGNoYXJhY3RlciBjbGFzc2RlY2ltYWwgbGl0ZXJhbCBlbXB0eWRlY2ltYWwgbGl0ZXJhbCBpbnZhbGlkaGV4YWRlY2ltYWwgbGl0ZXJhbCBlbXB0eWhleGFkZWNpbWFsIGxpdGVyYWwgaXMgbm90IGEgVW5pY29kZSBzY2FsYXIgdmFsdWVpbnZhbGlkIGhleGFkZWNpbWFsIGRpZ2l0aW5jb21wbGV0ZSBlc2NhcGUgc2VxdWVuY2UsIHJlYWNoZWQgZW5kIG9mIHBhdHRlcm4gcHJlbWF0dXJlbHl1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlZGFuZ2xpbmcgZmxhZyBuZWdhdGlvbiBvcGVyYXRvcmR1cGxpY2F0ZSBmbGFnZmxhZyBuZWdhdGlvbiBvcGVyYXRvciByZXBlYXRlZGV4cGVjdGVkIGZsYWcgYnV0IGdvdCBlbmQgb2YgcmVnZXh1bnJlY29nbml6ZWQgZmxhZ2R1cGxpY2F0ZSBjYXB0dXJlIGdyb3VwIG5hbWVlbXB0eSBjYXB0dXJlIGdyb3VwIG5hbWVpbnZhbGlkIGNhcHR1cmUgZ3JvdXAgY2hhcmFjdGVydW5jbG9zZWQgY2FwdHVyZSBncm91cCBuYW1ldW5jbG9zZWQgZ3JvdXB1bm9wZW5lZCBncm91cGludmFsaWQgcmVwZXRpdGlvbiBjb3VudCByYW5nZSwgdGhlIHN0YXJ0IG11c3QgYmUgPD0gdGhlIGVuZHJlcGV0aXRpb24gcXVhbnRpZmllciBleHBlY3RzIGEgdmFsaWQgZGVjaW1hbHVuY2xvc2VkIGNvdW50ZWQgcmVwZXRpdGlvbnJlcGV0aXRpb24gb3BlcmF0b3IgbWlzc2luZyBleHByZXNzaW9uc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IGFzc2VydGlvbiBpcyBlaXRoZXIgdW5jbG9zZWQgb3IgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXJ1bnJlY29nbml6ZWQgc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IGFzc2VydGlvbiwgdmFsaWQgY2hvaWNlcyBhcmU6IHN0YXJ0LCBlbmQsIHN0YXJ0LWhhbGYgb3IgZW5kLWhhbGZmb3VuZCBlaXRoZXIgdGhlIGJlZ2lubmluZyBvZiBhIHNwZWNpYWwgd29yZCBib3VuZGFyeSBvciBhIGJvdW5kZWQgcmVwZXRpdGlvbiBvbiBhIFxiIHdpdGggYW4gb3BlbmluZyBicmFjZSwgYnV0IG5vIGNsb3NpbmcgYnJhY2VpbnZhbGlkIFVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzYmFja3JlZmVyZW5jZXMgYXJlIG5vdCBzdXBwb3J0ZWRsb29rLWFyb3VuZCwgaW5jbHVkaW5nIGxvb2stYWhlYWQgYW5kIGxvb2stYmVoaW5kLCBpcyBub3Qgc3VwcG9ydGVkVW5pY29kZSBub3QgYWxsb3dlZCBoZXJlcGF0dGVybiBjYW4gbWF0Y2ggaW52YWxpZCBVVEYtOGludmFsaWQgbGluZSB0ZXJtaW5hdG9yLCBtdXN0IGJlIEFTQ0lJVW5pY29kZSBwcm9wZXJ0eSBub3QgZm91bmRVbmljb2RlIHByb3BlcnR5IHZhbHVlIG5vdCBmb3VuZFVuaWNvZGUtYXdhcmUgUGVybCBjbGFzcyBub3QgZm91bmQgKG1ha2Ugc3VyZSB0aGUgdW5pY29kZS1wZXJs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IHBhcnNpbmcgYSB2YWx1ZWV4cGVjdGVkIGA6YGV4cGVjdGVkIGAsYCBvciBgXWBleHBlY3RlZCBgLGAgb3IgYH1gZXhwZWN0ZWQgaWRlbnRleHBlY3RlZCB2YWx1ZWV4cGVjdGVkIGAiYGludmFsaWQgZXNjYXBlaW52YWxpZCBudW1iZXJudW1iZXIgb3V0IG9mIHJhbmdlaW52YWxpZCB1bmljb2RlIGNvZGUgcG9pbnRjb250cm9sIGNoYXJhY3RlciAoXHUwMDAwLVx1MDAxRikgZm91bmQgd2hpbGUgcGFyc2luZyBhIHN0cmluZ2tleSBtdXN0IGJlIGEgc3RyaW5naW52YWxpZCB2YWx1ZTogZXhwZWN0ZWQga2V5IHRvIGJlIGEgbnVtYmVyIGluIHF1b3Rlc2Zsb2F0IGtleSBtdXN0IGJlIGZpbml0ZSAoZ290IE5hTiBvciArLy1pbmYpbG9uZSBsZWFkaW5nIHN1cnJvZ2F0ZSBpbiBoZXggZXNjYXBldHJhaWxpbmcgY29tbWF0cmFpbGluZyBjaGFyYWN0ZXJzdW5leHBlY3RlZCBlbmQgb2YgaGV4IGVzY2FwZXJlY3Vyc2lvbiBsaW1pdCBleGNlZWRlZDAwMDEwMjAzMDQwNTA2MDcwODA5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk58gQAAAwAAAAEAAAA8wQAAPQEAAD1BAAAAAAAAAAAAAABAAAAtAMAAAAAAAAAAAAAAQAAAK0DAABnTCAAaAAAADUAAAAOAAAAAAAAAAAAAAABAAAA4wMAAL9IIABjAAAAQQAAAA4AAAC/SCAAYwAAAHYAAAAkAAAAv0ggAGMAAAB2AAAAMgAAAKo8IABkAAAAKwAAACsAAABMYXlvdXRFcnJvcgCAPyAATAAAAOIAAAAUAAAAb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gbWF5IG5vdCBiZSBwZXJmb3JtZWQgcmVjdXJzaXZlbHkAAAAABAAAAAQAAAD2BAAAAAAAAAgAAAAEAAAA9wQAAPgEAAD5BAAA+gQAANIDAAAMAAAABAAAAPsEAAD8BAAA/QQAAAAAAAAIAAAABAAAAP4EAAD/BAAAAAUAAAEFAAACBQAAEAAAAAQAAAADBQAABAUAAAUFAAD6BAAAbV3L1ixQ62N4QaZXcRuLuWzgRvuYDRoYMsvtllCR7Mthc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkAADKSiAAKgAAALEEAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPD0gc2l6ZSArIG1heF9vdmVyaGVhZAAAykogACoAAAC3BAAADQAAAGVudGl0eSBub3QgZm91bmRwZXJtaXNzaW9uIGRlbmllZGNvbm5lY3Rpb24gcmVmdXNlZGNvbm5lY3Rpb24gcmVzZXRob3N0IHVucmVhY2hhYmxlbmV0d29yayB1bnJlYWNoYWJsZWNvbm5lY3Rpb24gYWJvcnRlZG5vdCBjb25uZWN0ZWRhZGRyZXNzIGluIHVzZWFkZHJlc3Mgbm90IGF2YWlsYWJsZW5ldHdvcmsgZG93bmJyb2tlbiBwaXBlZW50aXR5IGFscmVhZHkgZXhpc3Rzb3BlcmF0aW9uIHdvdWxkIGJsb2Nrbm90IGEgZGlyZWN0b3J5aXMgYSBkaXJlY3RvcnlkaXJlY3Rvcnkgbm90IGVtcHR5cmVhZC1vbmx5IGZpbGVzeXN0ZW0gb3Igc3RvcmFnZSBtZWRpdW1maWxlc3lzdGVtIGxvb3Agb3IgaW5kaXJlY3Rpb24gbGltaXQgKGUuZy4gc3ltbGluayBsb29wKXN0YWxlIG5ldHdvcmsgZmlsZSBoYW5kbGVpbnZhbGlkIGlucHV0IHBhcmFtZXRlcmludmFsaWQgZGF0YXRpbWVkIG91dHdyaXRlIHplcm9ubyBzdG9yYWdlIHNwYWNlc2VlayBvbiB1bnNlZWthYmxlIGZpbGVxdW90YSBleGNlZWRlZGZpbGUgdG9vIGxhcmdlcmVzb3VyY2UgYnVzeWV4ZWN1dGFibGUgZmlsZSBidXN5ZGVhZGxvY2tjcm9zcy1kZXZpY2UgbGluayBvciByZW5hbWV0b28gbWFueSBsaW5rc2ludmFsaWQgZmlsZW5hbWVhcmd1bWVudCBsaXN0IHRvbyBsb25nb3BlcmF0aW9uIGludGVycnVwdGVkdW5zdXBwb3J0ZWR1bmV4cGVjdGVkIGVuZCBvZiBmaWxlb3V0IG9mIG1lbW9yeWluIHByb2dyZXNzb3RoZXIgZXJyb3J1bmNhdGVnb3JpemVkIGVycm9yAAAAIzYgAEcAAAA3AwAAJwAAACM2IABHAAAAHgMAACYAAAAjNiAARwAAABwDAAAsAAAAIzYgAEcAAAArAwAAJwAAAAEAAAAAAAAA0yAAAGgBAAAgICAgICAgICAgICAgYXQgwyAAAGgEAAI6IADTIAAAaAEAAyAtIAAgICAgICA8dW5rbm93bj7BIACAYADvv70AFUYgAGQAAABnAQAAMAAAAExhenlMb2NrIGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQAACE0IABRAAAAngEAAAUAAAB1c2Ugb2Ygc3RkOjp0aHJlYWQ6OmN1cnJlbnQoKSBpcyBub3QgcG9zc2libGUgYWZ0ZXIgdGhlIHRocmVhZCdzIGxvY2FsIGRhdGEgaGFzIGJlZW4gZGVzdHJveWVkAADXEiAAUQAAADsBAAAJAAAAb3BlcmF0aW9uIHN1Y2Nlc3NmdWxmYWlsZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIHRocmVhZCBJRDogYml0c3BhY2UgZXhoYXVzdGVkAHJIIABMAAAAJgAAAA0AAABXb3VsZEJsb2NrAAAAAAAACAAAAAQAAAAGBQAAdW5zdXBwb3J0ZWQgYmFja3RyYWNlZGlzYWJsZWQgYmFja3RyYWNlAHdAIABMAAAAigEAAB0AAAAHBQAAEAAAAAQAAAAIBQAACQUAAE9zY29kZUtpbmRDdXN0b21BY2Nlc3NFcnJvcgDSAwAADAAAAAQAAAAKBQAATm90Rm91bmRQZXJtaXNzaW9uRGVuaWVkQ29ubmVjdGlvblJlZnVzZWRDb25uZWN0aW9uUmVzZXRIb3N0VW5yZWFjaGFibGVOZXR3b3JrVW5yZWFjaGFibGVDb25uZWN0aW9uQWJvcnRlZE5vdENvbm5lY3RlZEFkZHJJblVzZUFkZHJOb3RBdmFpbGFibGVOZXR3b3JrRG93bkJyb2tlblBpcGVBbHJlYWR5RXhp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bXBsZW1lbnRlZCEAAAAAGiAAZAAAAGgAAAApAAAAsAMAAAwAAAAEAAAAJwUAACgFAACzAwAAPT09PTw8PDw8ID4+Pj4gAAAAAAABAAAAAQAAACkFAABmYWlsZWQgdG8gcGFyc2UgZmxvYXQgbGl0ZXJhbAAAALREIAAnAAAA2QQAABkAAAC0RCAAJwAAAIEEAABWAAAAfHx8fHwgAAD0GyAAYQAAAHoAAAA7AAAAcGFja2FnZQAqBQAADAAAAAQAAAArBQAALAUAALMDAAAAAAAAAAAAAAEAAAAtBQAAVW5leHBlY3RlZCBlb2ZEZWNsYXJhdGlvbiBpcyBub3QgYWxsb3dlZFVzaW5nIGRlY2xhcmF0aW9uIGlzIG5vdCBhbGxvd2VkVXNpbmcgZGVjbGFyYXRpb24gaXMgbm90IGFsbG93ZWQgaW4gZm9yLWluIGxvb3BVc2luZyBkZWNsYXJhdGlvbiBpcyBub3QgZW5hYmxlZC4gU2V0IGpzYy5wYXJzZXIuZXhwbGljaXRSZXNvdXJjZU1hbmFnZW1lbnQgdG8gdHJ1ZVVzaW5nIGRlY2xhcmF0aW9uIG9ubHkgYWxsb3dzIGlkZW50aWZpZXJzVXNpbmcgZGVjbGFyYXRpb24gcmVxdWlyZXMgaW5pdGlhbGl6ZXJwcml2YXRlIG5hbWVzIGFyZSBub3QgYWxsb3dlZCBpbiBpbnRlcmZhY2VJbnZhbGlkIGBzdXBlcigpYEludmFsaWQgYWNjZXNzIHRvIHN1cGVySW5kZXggc3VwZXIgd2l0aCBwcml2YXRlIG5hbWUgaXMgbm90IGFsbG93ZWQnbmV3LnRhcmdldCcgaXMgb25seSBhbGxvd2VkIGluIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIGZ1bmN0aW9uIGV4cHJlc3Npb24sIG9yIGNsYXNzLkltcG9ydCBpcyBub3QgYWxsb3dlZCBoZXJlQW4gYXJyb3cgZnVuY3Rpb24gaXMgbm90IGFsbG93ZWQgaGVyZWBleHBvcnRgIGlzIG5vdCBhbGxvd2VkIGhlcmVBIGdldHRlciBvciBhIHNldHRlciBjYW5ub3QgYmUgcmVhZG9ubHlBIGdldHRlciBvciBhIHNldHRlciBjYW5ub3QgYmUgb3B0aW9uYWxBIGBnZXRgIGFjY2Vzc29yIGNhbm5vdCBoYXZlIHBhcmFtZXRlcnNBIGBzZXRgIGFjY2Vzc29yIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbWV0ZXJ0b3AgbGV2ZWwgYXdhaXQgaXMgb25seSBhbGxvd2VkIGluIG1vZHVsZUxlZ2FjeSBkZWNpbWFsIGVzY2FwZSBpcyBub3QgcGVybWl0dGVkIGluIHN0cmljdCBtb2RlTGVnYWN5IG9jdGFsIGVzY2FwZSBpcyBub3QgcGVybWl0dGVkIGluIHN0cmljdCBtb2RlSW52YWxpZCBjaGFyYWN0ZXIgaW4gaWRlbnRpZmllcmEgYmluYXJ5YW4gb2N0YWxhIGRlY2ltYWxhIGhleGFkZWNpbWFsAIMhIAAjAAAAQgEAABoAAABTZXR0ZXIgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyUmVzdCBwYXR0ZXJuIGlzIG5vdCBhbGxvd2VkIGluIHNldHRlclVudGVybWluYXRlZCBibG9jayBjb21tZW50VW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudEV4cGVjdGVkIHVuaWNvZGUgZXNjYXBlVW50ZXJtaW5hdGVkIHJlZ2V4cCBsaXRlcmFsVW50ZXJtaW5hdGVkIHRlbXBsYXRlSWRlbnRpZmllciBjYW5ub3QgZm9sbG93IG51bWJlckludmFsaWQgc3RyaW5nIGVzY2FwZUludmFsaWQgdW5pY29kZSBlc2NhcGVFeHBlY3RlZCArLCAtIG9yIGRlY2ltYWwgZGlnaXQgYWZ0ZXIgZUxlZ2FjeSBjb21tZW50cyBjYW5ub3QgYmUgdXNlZCBpbiBtb2R1bGUgY29kZWBhd2FpdGAgY2Fubm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBpbiBhbiBhc3luYyBjb250ZXh0J2V2YWwnIGFuZCAnYXJndW1lbnRzJyBjYW5ub3QgYmUgdXNlZCBhcyBhIGJpbmRpbmcgaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZSdhcmd1bWVudHMnIGlzIG9ubHkgYWxsb3dlZCBpbiBmdW5jdGlvbnMgYW5kIGNsYXNzIG1ldGhvZHNJbGxlZ2FsICd1c2Ugc3RyaWN0JyBkaXJlY3RpdmUgaW4gZnVuY3Rpb24gd2l0aCBub24tc2ltcGxlIHBhcmFtZXRlciBsaXN0LicqKicgY2Fubm90IGJlIGFwcGxpZWQgdG8gdW5hcnkvYXdhaXQgZXhwcmVzc2lvbi5VbmV4cGVjdGVkIHRva2VuICcjJ0xpbmVCcmVhayBjYW5ub3QgZm9sbG93ICd0aHJvdydVbmV4cGVjdGVkIGxpbmUgYnJlYWsgYmV0d2VlbiBhcnJvdyBoZWFkIGFuZCBhcnJvdyAsICBvciBjYW5ub3QgaW1wb3J0IGFzIHJlc2VydmVkIHdvcmRhc3NpZ25tZW50IHByb3BlcnR5IGlzIGludmFsaWQgc3ludGF4RXhwZWN0ZWQgJzsnLCAnfScgb3IgPGVvZj5hd2FpdCogaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBhc3luYyBmdW5jdGlvbnMgcHJvcG9zYWwuIFVzZSBQcm9taXNlLmFsbCgpIGluc3RlYWQuQ2Fubm90IHVzZSBhIHJlc2VydmVkIHdvcmQgYXMgYSBzaG9ydGhhbmQgcHJvcGVydHlOdWxsaXNoIGNvYWxlc2Npbmcgb3BlcmF0b3IoPz8pIHJlcXVpcmVzIHBhcmVucyB3aGVuIG1peGluZyB3aXRoIGxvZ2ljYWwgb3BlcmF0b3JzQSBzd2l0Y2ggYmxvY2sgY2Fubm90IGhhdmUgbXVsdGlwbGUgZGVmYXVsdHNUcmFpbGluZyBjb21tYSBpc24ndCBwZXJtaXR0ZWQgYWZ0ZXIgYSByZXN0IGVsZW1lbnRSZXN0IGVsZW1lbnQgbXVzdCBiZSBmaW5hbCBlbGVtZW50UGFyZW50aGVzaXplZCBleHByZXNzaW9uIGNhbm5vdCBjb250YWluIHNwcmVhZCBvcGVyYXRvclBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiBjYW5ub3QgYmUgZW1wdHlOb3QgYSBwYXR0ZXJuTm90IGFuIGV4cHJlc3Npb25DYW5ub3QgYXNzaWduIHRvIHRoaXNJbnZhbGlkIGFzc2lnbm1lbnQgdGFyZ2V0RXhwZWN0ZWQgaWRlbnRFeHBlY3RlZCAnOycgb3IgbGluZSBicmVha0FuIGFzeW5jIGZ1bmN0aW9uIGNhbm5vdCBiZSBnZW5lcmF0b3InaW1wb3J0JywgYW5kICdleHBvcnQnIGFyZSBub3QgcGVybWl0dGVkIGhlcmUnaW1wb3J0JywgYW5kICdleHBvcnQnIGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgbW9kdWxlIGNvZGUnaW1wb3J0Lm1ldGEnIGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgbW9kdWxlIGNvZGUuRGVzdHJ1Y3R1cmluZyBiaW5kaW5ncyByZXF1aXJlIGluaXRpYWxpemVyc1dpdGggc3RhdGVtZW50IGFyZSBub3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZVJldHVybiBzdGF0ZW1lbnQgaXMgbm90IGFsbG93ZWQgaGVyZUV4cGVjdGVkIG9uZSB2YXJpYWJsZSBiaW5kaW5nVW5leHBlY3RlZCBpbml0aWFsaXplciBpbiBmb3IgaW4vb2YgbG9vcEdlbmVyYXRvciBvciBhc3luYyBmdW5jdGlvbiBjYW5ub3QgYmUgbGFiZWxsZWRGdW5jdGlvbiBjYW5ub3QgYmUgbGFiZWxsZWQgaW4gc3RyaWN0IG1vZGUneWllbGQnIGNhbm5vdCBiZSB1c2VkIGFzIGEgcGFyYW1ldGVyIHdpdGhpbiBnZW5lcmF0b3JgYXdhaXRgIGV4cHJlc3Npb25zIGNhbm5vdCBiZSB1c2VkIGluIGEgcGFyYW1ldGVyIGluaXRpYWxpemVyLmZvciBhd2FpdCBzeW50YXggaXMgdmFsaWQgb25seSBmb3IgZm9yLW9mIHN0YXRlbWVudGF3YWl0IGlzbid0IGFsbG93ZWQgaW4gbm9uLWFzeW5jIGZ1bmN0aW9uVW50ZXJtaW5hdGVkIEpTWCBjb250ZW50c0pTWCBhdHRyaWJ1dGVzIG11c3Qgb25seSBiZSBhc3NpZ25lZCBhIG5vbi1lbXB0eSBleHByZXNzaW9uSlNYIHZhbHVlIHNob3VsZCBiZSBlaXRoZXIgYW4gZXhwcmVzc2lvbiBvciBhIHF1b3RlZCBKU1ggdGV4dEV4cGVjdGVkIGNvcnJlc3BvbmRpbmcgSlNYIGNsb3NpbmcgdGFnIGZvciA8PkxlYWRpbmcgZGVjb3JhdG9ycyBtdXN0IGJlIGF0dGFjaGVkIHRvIGEgY2xhc3MgZGVjbGFyYXRpb25Vc2luZyB0aGUgZXhwb3J0IGtleXdvcmQgYmV0d2VlbiBhIGRlY29yYXRvciBhbmQgYSBjbGFzcyBpcyBub3QgYWxsb3dlZC4gUGxlYXNlIHVzZSBgZXhwb3J0IEBkZWMgY2xhc3NgIGluc3RlYWQuQSByZXF1aXJlZCBlbGVtZW50IGNhbm5vdCBmb2xsb3cgYW4gb3B0aW9uYWwgZWxlbWVudC5UeXBlc2NyaXB0IHBhcmFtZXRlciBwcm9wZXJ0eSBtdXN0IGJlIGFuIGlkZW50aWZpZXIgb3IgYXNzaWdubWVudCBwYXR0ZXJuVW5leHBlY3RlZCBzcGFjZSBiZXR3ZWVuICMgYW5kIGlkZW50aWZpZXJDb25zdHJ1Y3RvciBjYW4ndCBiZSBhbiBhc3luYyBmdW5jdGlvbkNsYXNzZXMgbWF5IG5vdCBoYXZlIGEgbm9uLXN0YXRpYyBmaWVsZCBuYW1lZCAnY29uc3RydWN0b3InQ2xhc3NlcyBjYW4ndCBoYXZlIGEgcHJpdmF0ZSBmaWVsZCBuYW1lZCAnI2NvbnN0cnVjdG9yJy5DbGFzcyBjb25zdHJ1Y3RvciBjYW4ndCBiZSBhbiBhY2Nlc3Nvci5BIG1ldGhvZCBjYW5ub3QgYmUgcmVhZG9ubHlBIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBnZW5lcmF0b3JBIGNsYXNzIGNhbiBvbmx5IGhhdmUgb25lIGNvbnN0cnVjdG9yQSBiaW5kaW5nIHBhdHRlcm4gcGFyYW1ldGVyIGNhbm5vdCBiZSBvcHRpb25hbCBpbiBhbiBpbXBsZW1lbnRhdGlvbiBzaWduYXR1cmUuU3VwZXIgY2FsbCBjYW5ub3QgYmUgb3B0aW9uYWxDb25zdHJ1Y3RvciBpbi9hZnRlciBhbiBvcHRpb25hbCBjaGFpbmluZyBpcyBub3QgYWxsb3dlZC5UYWdnZWQgdGVtcGxhdGUgbGl0ZXJhbCBpcyBub3QgYWxsb3dlZCBpbiBvcHRpb25hbCBjaGFpbi5UcmFpbGluZyBjb21tYSBpcyBkaXNhbGxvd2VkIGluc2lkZSBpbXBvcnQoLi4uKSBhcmd1bWVudHNgaW1wb3J0KClgIHJlcXVpcmVzIGV4YWN0bHkgb25lIG9yIHR3byBhcmd1bWVudHNleHBvcnQgZGVmYXVsdCBzdGF0ZW1lbnRzIHJlcXVpcmVkIGZyb20gJy4uLic7YC4uLmAgbXVzdCBiZSBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyIGluIGRlY2xhcmF0aW9uIGNvbnRleHRzQSBudW1lcmljIHNlcGFyYXRvciBpcyBvbmx5IGFsbG93ZWQgYmV0d2VlbiB0d28gZGlnaXRzQSBzdHJpbmcgbGl0ZXJhbCBjYW5ub3QgYmUgdXNlZCBhcyBhbiBleHBvcnRlZCBiaW5kaW5nIHdpdGhvdXQgYGZyb21gLidjb25zdCcgZGVjbGFyYXRpb25zIG11c3QgYmUgaW5pdGlhbGl6ZWRVbmtub3duIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFncy5FeHBlY3RlZCBhbiBpZGVudGlmaWVyRXhwZWN0ZWQgYSBzZW1pY29sb25UcmFpbGluZyBjb21tYSBpcyBub3QgYWxsb3dlZEEgcmVzdCBwYXJhbWV0ZXIgbXVzdCBiZSBsYXN0IGluIGEgcGFyYW1ldGVyIGxpc3RQYXJhbWV0ZXIgY2Fubm90IGhhdmUgcXVlc3Rpb24gbWFyayBhbmQgaW5pdGlhbGl6ZXJgZGVjbGFyZWAgbW9kaWZpZXIgY2Fubm90IGFwcGVhciBvbiBjbGFzcyBlbGVtZW50cyBvZiB0aGlzIGtpbmRgZGVjbGFyZWAgbW9kaWZpZXIgbm90IGFsbG93ZWQgZm9yIGNvZGUgYWxyZWFkeSBpbiBhbiBhbWJpZW50IGNvbnRleHRgYXN5bmNgIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIGhlcmVBIHJlc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBvcHRpb25hbEEgcmVzdCBwYXJhbWV0ZXIgY2Fubm90IGhhdmUgYW4gaW5pdGlhbGl6ZXJqc2MudGFyZ2V0IHNob3VsZCBiZSBlczUgb3IgdXBwZXIgdG8gdXNlIGdldHRlciAvIHNldHRlckxlZ2FjeSBvY3RhbCBsaXRlcmFscyBhcmUgbm90IGF2YWlsYWJsZSB3aGVuIHRhcmdldGluZyBFQ01BU2NyaXB0IDUgYW5kIGhpZ2hlclR5cGUgcGFyYW1ldGVycyBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb25BbiBpbmRleCBzaWduYXR1cmUgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlclR5cGUgcGFyYW1ldGVyIGxpc3QgY2Fubm90IGJlIGVtcHR5SW52YWxpZCB1c2Ugb2YgJ2FyZ3VtZW50cycgaW4gc3RyaWN0IG1vZGUnZGVsZXRlJyBjYW5ub3QgYmUgY2FsbGVkIG9uIGFuIGlkZW50aWZpZXIgaW4gc3RyaWN0IG1vZGVBICdicmVhaycgc3RhdGVtZW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aGluIGFuIGVuY2xvc2luZyBpdGVyYXRpb24gb3Igc3dpdGNoIHN0YXRlbWVudFRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhIGBmb3IuLi5vZmAgc3RhdGVtZW50IG1heSBub3QgYmUgYGFzeW5jYEp1bXAgdGFyZ2V0IGNhbm5vdCBjcm9zcyBmdW5jdGlvbiBib3VuZGFyeUV4cHJlc3Npb24gZXhwZWN0ZWR0eXBlIGV4cGVjdGVkRHVwbGljYXRlIGxhYmVsQSAnY29udGludWUnIHN0YXRlbWVudCBjYW4gb25seSBqdW1wIHRvIGEgbGFiZWwgb2YgYW4gZW5jbG9zaW5nIGl0ZXJhdGlvbiBzdGF0ZW1lbnRBICdicmVhaycgc3RhdGVtZW50IGNhbiBvbmx5IGp1bXAgdG8gYSBsYWJlbCBvZiBhbiBlbmNsb3Npbmcgc3RhdGVtZW50VmFyaWFibGUgZGVjbGFyYXRpb24gbGlzdCBjYW5ub3QgYmUgZW1wdHlsaXRlcmFsIGluIGFuIGltcG9ydCB0eXBlIHNob3VsZCBiZSBzdHJpbmcgbGl0ZXJhbEFuIG9iamVjdCBtZW1iZXIgY2Fubm90IGJlIGRlY2xhcmVkIG9wdGlvbmFsQ29tcHV0ZWQgcHJvcGVydHkgbmFtZXMgYXJlIG5vdCBhbGxvd2VkIGluIGVudW1zQSBjb21tYSBleHByZXNzaW9uIGlzIG5vdCBhbGxvd2VkIGluIGEgY29tcHV0ZWQgcHJvcGVydHkgbmFtZWBleHRlbmRzYCBjbGF1c2UgYWxyZWFkeSBzZWVuLidleHRlbmRzJyBjbGF1c2UgbXVzdCBwcmVjZWRlICdpbXBsZW1lbnRzJyBjbGF1c2UuQ2xhc3NlcyBjYW4gb25seSBleHRlbmQgYSBzaW5nbGUgY2xhc3NgaW1wbGVtZW50c2AgY2xhdXNlIGFscmVhZHkgc2VlbkFuIGltcGxlbWVudGF0aW9uIGNhbm5vdCBiZSBkZWNsYXJlZCBpbiBhbWJpZW50IGNvbnRleHRzTW9kaWZpZXJzIGNhbm5vdCBhcHBlYXIgaGVyZU1lcmdlIGNvbmZsaWN0IG1hcmtlciBlbmNvdW50ZXJlZC5UeXBlIGFubm90YXRpb24gY2Fubm90IGFwcGVhciBvbiBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uQ2F0Y2ggY2xhdXNlIHZhcmlhYmxlIGNhbm5vdCBoYXZlIGEgdHlwZSBhbm5vdGF0aW9uYGFic3RyYWN0YCBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSBjbGFzcyBvciBtZXRob2QgZGVjbGFyYXRpb25BYnN0cmFjdCBtZXRob2RzIGNhbiBvbmx5IGFwcGVhciB3aXRoaW4gYW4gYWJzdHJhY3QgY2xhc3MuQWJzdHJhY3QgbWV0aG9kIGNhbm5vdCBoYXZlIGFuIGltcGxlbWVudGF0aW9uLkFic3RyYWN0IHByb3BlcnR5IGNhbm5vdCBoYXZlIGFuIGluaXRpYWxpemVyLlRoZSAndHlwZScgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgb24gYSBuYW1lZCBpbXBvcnQgd2hlbiAnaW1wb3J0IHR5cGUnIGlzIHVzZWQgb24gaXRzIGltcG9ydCBzdGF0ZW1lbnQuVGhlICd0eXBlJyBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCBvbiBhIG5hbWVkIGV4cG9ydCB3aGVuICdleHBvcnQgdHlwZScgaXMgdXNlZCBvbiBpdHMgZXhwb3J0IHN0YXRlbWVudC5BIHBhcmFtZXRlciBwcm9wZXJ0eSBpcyBvbmx5IGFsbG93ZWQgaW4gYSBjb25zdHJ1Y3RvciBpbXBsZW1lbnRhdGlvbkEgcGFyYW1ldGVyIGluaXRpYWxpemVyIGlzIG9ubHkgYWxsb3dlZCBpbiBhIGZ1bmN0aW9uIG9yIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBtdXN0IGJlIGEgdmFyaWFibGUgb3IgYSBwcm9wZXJ0eSBhY2Nlc3MuVGhlICd3aXRoJyBzdGF0ZW1lbnQgaXMgbm90IHN1cHBvcnRlZC4gQWxsIHN5bWJvbHMgaW4gYSAnd2l0aCcgYmxvY2sgd2lsbCBoYXZlIHR5cGUgJ2FueScuSW52YWxpZCBjbGFzcyBuYW1laW50ZXJmYWNlIG5hbWUgaXMgaW52YWxpZEFuIGVudW0gbWVtYmVyIGNhbm5vdCBoYXZlIGEgbnVtZXJpYyBuYW1lVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGEgJ2Zvci4uLm9mJyBzdGF0ZW1lbnQgY2Fubm90IHVzZSBhIHR5cGUgYW5ub3RhdGlvblRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhICdmb3IuLi5pbicgc3RhdGVtZW50IGNhbm5vdCBiZSBhIGRlc3RydWN0dXJpbmcgcGF0dGVybkFuIGludGVyZmFjZSBjYW4gb25seSBleHRlbmQgYW4gaWRlbnRpZmllci9xdWFsaWZpZWQtbmFtZSB3aXRoIG9wdGlvbmFsIHR5cGUgYXJndW1lbnRzLlRoZSBvcGVyYW5kIG9mIGEgZGVsZXRlIG9wZXJhdG9yIG11c3QgYmUgYSBwcm9wZXJ0eSByZWZlcmVuY2UuVGhpcyBtZW1iZXIgY2Fubm90IGhhdmUgYW4gJ292ZXJyaWRlJyBtb2RpZmllciBiZWNhdXNlIGl0cyBjb250YWluaW5nIGNsYXNzIGRvZXMgbm90IGV4dGVuZCBhbm90aGVyIGNsYXNzLkRlY29yYXRvcnMgbWF5IG5vdCBhcHBlYXIgYWZ0ZXIgYGV4cG9ydGAgb3IgYGV4cG9ydCBkZWZhdWx0YCBpZiB0aGV5IGFsc28gYXBwZWFyIGJlZm9yZSBgZXhwb3J0YC5BbiBhY2Nlc3NpYmlsaXR5IG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggYSBwcml2YXRlIGlkZW50aWZpZXIuVHlwZSBhbm5vdGF0aW9ucyBtdXN0IGNvbWUgYmVmb3JlIGRlZmF1bHQgYXNzaWdubWVudHNUaGlzIHN5bnRheCBpcyByZXNlcnZlZCBpbiBmaWxlcyB3aXRoIHRoZSAubXRzIG9yIC5jdHMgZXh0ZW5zaW9uLiBVc2UgYW4gYGFzYCBleHByZXNzaW9uIGluc3RlYWQuVGhpcyBzeW50YXggaXMgcmVzZXJ2ZWQgaW4gZmlsZXMgd2l0aCB0aGUgLm10cyBvciAuY3RzIGV4dGVuc2lvbi4gQWRkIGEgdHJhaWxpbmcgY29tbWEsIGFzIGluIGA8VCw+KCkgPT4gLi4uYC5UeXBlIGFyZ3VtZW50IGxpc3QgY2Fubm90IGJlIGVtcHR5LlRoaXMgaXMgdGhlIGV4cHJlc3Npb24gcGFydCBvZiBhbiBleHByZXNzaW9uIHN0YXRlbWVudHByZXZpb3VzIGRlZmF1bHQgY2FzZSBpcyBkZWNsYXJlZCBhdCBoZXJlAAAAtEQgACcAAABOAgAAHgAAALREIAAnAAAA9QgAACAAAAC0RCAAJwAAADoJAAAmAAAAtEQgACcAAAB7BQAAJQAAALREIAAnAAAAfAUAADUAAAAyIGhleCBjaGFyYWN0ZXJztEQgACcAAADtBgAAOQAAALREIAAnAAAA/gIAACYAAAC0RCAAJwAAAGcDAAAqAAAANCBoZXggY2hhcmFjdGVyczEtNiBoZXggY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgMCB0byAxMEZGRkYuMS02IGhleCBjaGFyYWN0ZXJzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAC0RCAAJwAAADoFAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAACXHXDIAAAaQQAAGB7Jz4nfWBgJmd0O2Bgeyd9J31gYCZyYnJhY2U7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQAAAAAAAAAAAAABAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALseIABQAAAAGggAAAkAAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAvBQAAMAUAAC8FAAAvBQAAMAUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC8FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAADEFAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIF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AAAMAAAABAAAAIgFAACJBQAABAAAAAQAAACKBQAAiwUAAAwAAAAEAAAAjAUAAAAAAAAEAAAABAAAAI0FAABFb2ZEZWNsTm90QWxsb3dlZFVzaW5nRGVjbE5vdEFsbG93ZWRVc2luZ0RlY2xOb3RBbGxvd2VkRm9yRm9ySW5Mb29wVXNpbmdEZWNsTm90RW5hYmxlZEludmFsaWROYW1lSW5Vc2luZ0RlY2xJbml0UmVxdWlyZWRGb3JVc2luZ0RlY2xQcml2YXRlTmFtZUluSW50ZXJmYWNlSW52YWxpZFN1cGVyQ2FsbEludmFsaWRTdXBlckludmFsaWRTdXBlclByaXZhdGVOYW1lSW52YWxpZE5ld1RhcmdldEludmFsaWRJbXBvcnRBcnJvd05vdEFsbG93ZWRFeHBvcnROb3RBbGxvd2VkR2V0dGVyU2V0dGVyQ2Fubm90QmVSZWFkb25seUdldHRlclNldHRlckNhbm5vdEJlT3B0aW9uYWxHZXR0ZXJQYXJhbVNldHRlclBhcmFtVG9wTGV2ZWxBd2FpdEluU2NyaXB0TGVnYWN5RGVjaW1hbExlZ2FjeU9jdGFsSW52YWxpZElkZW50Q2hhckV4cGVjdGVkRGlnaXRyYWRpeFNldHRlclBhcmFtUmVxdWlyZWRSZXN0UGF0SW5TZXR0ZXJVbnRlcm1pbmF0ZWRCbG9ja0NvbW1lbnRVbnRlcm1pbmF0ZWRTdHJMaXRFeHBlY3RlZFVuaWNvZGVFc2NhcGVFc2NhcGVJblJlc2VydmVkV29yZHdvcmRVbnRlcm1pbmF0ZWRSZWdFeHBVbnRlcm1pbmF0ZWRUcGxJZGVudEFmdGVyTnVtVW5leHBlY3RlZENoYXJJbnZhbGlkU3RyRXNjYXBlSW52YWxpZFVuaWNvZGVFc2NhcGVCYWRDaGFyYWN0ZXJFc2NhcGVTZXF1ZW5jZWV4cGVjdGVkTnVtTGl0VGVybWluYXRlZFdpdGhFeHBMZWdhY3lDb21tZW50SW5Nb2R1bGVJbnZhbGlkSWRlbnRJblN0cmljdEludmFsaWRJZGVudEluQXN5bmNFdmFsQW5kQXJndW1lbnRzSW5TdHJpY3RBcmd1bWVudHNJbkNsYXNzRmllbGRJbGxlZ2FsTGFuZ3VhZ2VNb2RlRGlyZWN0aXZlVW5hcnlJbkV4cGxlZnRfc3Bhbkhhc2hMaW5lQnJlYWtJblRocm93TGluZUJyZWFrQmVmb3JlQXJyb3dVbmV4cGVjdGVkZ290VW5leHBlY3RlZFRva2VuV2l0aFN1Z2dlc3Rpb25zY2FuZGlkYXRlX2xpc3RSZXNlcnZlZFdvcmRJbkltcG9ydEFzc2lnblByb3BlcnR5RXhwZWN0ZWRFeHBlY3RlZFNlbWlGb3JFeHByU3RtdEF3YWl0U3RhclJlc2VydmVkV29yZEluT2JqU2hvcnRoYW5kT3JQYXROdWxsaXNoQ29hbGVzY2luZ1dpdGhMb2dpY2FsT3BNdWx0aXBsZURlZmF1bHRwcmV2aW91c0NvbW1hQWZ0ZXJSZXN0RWxlbWVudE5vbkxhc3RSZXN0UGFyYW1TcHJlYWRJblBhcmVuRXhwckVtcHR5UGFyZW5FeHBySW52YWxpZFBhdEludmFsaWRFeHByTm90U2ltcGxlQXNzaWduSW52YWxpZEFzc2lnblRhcmdldEV4cGVjdGVkSWRlbnRFeHBlY3RlZFNlbWlEdXBsaWNhdGVMYWJlbEFzeW5jR2VuZXJhdG9yTm9uVG9wTGV2ZWxJbXBvcnRFeHBvcnRJbXBvcnRFeHBvcnRJblNjcmlwdEltcG9ydE1ldGFJblNjcmlwdFBhdFZhcldpdGhvdXRJbml0V2l0aEluU3RyaWN0UmV0dXJuTm90QWxsb3dlZFRvb01hbnlWYXJJbkZvckluSGVhZFZhckluaXRpYWxpemVySW5Gb3JJbkhlYWRMYWJlbGxlZEdlbmVyYXRvck9yQXN5bmNMYWJlbGxlZEZ1bmN0aW9uSW5TdHJpY3RZaWVsZFBhcmFtSW5HZW5Bd2FpdFBhcmFtSW5Bc3luY0F3YWl0Rm9yU3RtdEF3YWl0SW5GdW5jdGlvblVudGVybWluYXRlZEpTWENvbnRlbnRzRW1wdHlKU1hBdHRySW52YWxpZEpTWFZhbHVlSlNYRXhwZWN0ZWRDbG9zaW5nVGFnRm9yTHRHdEpTWEV4cGVjdGVkQ2xvc2luZ1RhZ0ludmFsaWRMZWFkaW5nRGVjb3JhdG9yRGVjb3JhdG9yT25FeHBvcnRUc1JlcXVpcmVkQWZ0ZXJPcHRpb25hbFRzSW52YWxpZFBhcmFtUHJvcFBhdFNwYWNlQmV0d2Vlbkhhc2hBbmRJZGVudEFzeW5jQ29uc3RydWN0b3JQcm9wZXJ0eU5hbWVkQ29uc3RydWN0b3JQcml2YXRlQ29uc3RydWN0b3JQcml2YXRlTmFtZU1vZGlmaWVyQ29uc3RydWN0b3JBY2Nlc3NvclJlYWRPbmx5TWV0aG9kR2VuZXJhdG9yQ29uc3RydWN0b3JEdXBsaWNhdGVDb25zdHJ1Y3RvclRzQmluZGluZ1BhdENhbm5vdEJlT3B0aW9uYWxTdXBlckNhbGxPcHRpb25hbE9wdENoYWluQ2Fubm90Rm9sbG93Q29uc3RydWN0b3JDYWxsVGFnZ2VkVHBsSW5PcHRDaGFpblRyYWlsaW5nQ29tbWFJbnNpZGVJbXBvcnRJbXBvcnRSZXF1aXJlc09uZU9yVHdvQXJnc0V4cG9ydERlZmF1bHRXaXRoT3V0RnJvbUV4cG9ydEV4cGVjdEZyb21Eb3RzV2l0aG91dElkZW50aWZpZXJOdW1lcmljU2VwYXJhdG9ySXNBbGxvd2VkT25seUJldHdlZW5Ud29EaWdpdHNJbXBvcnRCaW5kaW5nSXNTdHJpbmdFeHBvcnRCaW5kaW5nSXNTdHJpbmdDb25zdERlY2xhcmF0aW9uc1JlcXVpcmVJbml0aWFsaXphdGlvbkR1cGxpY2F0ZWRSZWdFeHBGbGFnc1Vua25vd25SZWdFeHBGbGFnc1RTMTAwM1RTMTAwNVRTMTAwOVRTMTAxNFRTMTAxNVRTMTAyOVRTMTAzMFRTMTAzMVRTMTAzOFRTMTA0MlRTMTA0N1RTMTA0OFRTMTA1NlRTMTA4NVRTMTA4OVRTMTA5MlRTMTA5NlRTMTA5OFRTMTEwMFRTMTEwMlRTMTEwNVRTMTEwNlRTMTEwN1RTMTEwOVRTMTExMFRTMTExNFRTMTExNVRTMTExNlRTMTEyM1RTMTE0MVRTMTE2MlRTMTE2NFRTMTE3MVRTMTE3MlRTMTE3M1RTMTE3NFRTMTE3NVRTMTE4M1RTMTE4NFRTMTE4NVRTMTA5M1RTMTE5NlRTMTI0MlRTMTI0M1RTMTI0NFRTMTI0NVRTMTI2N1RTMTI3M1RTMTI3NFRTMTI3N1RTMjIwNlRTMjIwN1RTMjM2OVRTMjM3MVRTMjQwNlRTMjQxMFRTMjQxNFRTMjQyN1RTMjQ1MlRTMjQ4M1RTMjQ5MVRTMjQ5OVRTMjcwM1RTNDExMlRTODAzOFRTMTgwMTBUU1R5cGVBbm5vdGF0aW9uQWZ0ZXJBc3NpZ25Uc05vbk51bGxBc3NlcnRpb25Ob3RBbGxvd2VkV2l0aExhYmVsaW5uZXJub3RlUmVzZXJ2ZWRUeXBlQXNzZXJ0aW9uUmVzZXJ2ZWRBcnJvd1R5cGVQYXJhbUVtcHR5VHlwZUFyZ3VtZW50TGlzdAAAAAABAAAAAQAAAI4FAACPBQAAMAAAAAgAAACQBQAAkQUAAAQAAAAEAAAAkgUAAAAAAAAEAAAABAAAAJMFAAAAAAAABAAAAAQAAABMAgAAlAUAAAwAAAAEAAAAlQUAAAAAAAAEAAAABAAAAJYFAACXBQAAIAAAAAgAAAADAgAAAAAAAAQAAAAEAAAAmAUAAAAAAAAEAAAABAAAAJkFAACaBQAADAAAAAQAAACbBQAAnAUAAAQAAAAEAAAAnQUAAFBhcnNlSW50RXJyb3JPa0VycmFzc2VydGlvbiBmYWlsZWQ6IGluZGljZXMuY2FwYWNpdHkoKSAtIGluZGljZXMubGVuKCkgPj0gZW50cmllcy5sZW4oKQBtOyAAZAAAAFQAAAAFAAAAbTsgAGQAAAA7AAAAIwAAAG07IABkAAAAVgAAAEQAAABtOyAAZAAAADMAAAAPAAAADz0gACsAAADRAQAANgAAAPVCIAAyAAAA+wAAAAEAAABfYXBwbHlfZGVjb3JhdGVkX2Rlc2NyaXB0b3JAc3djL2hlbHBlcnMvXy9fYXBwbHlfZGVjb3JhdGVkX2Rlc2NyaXB0b3JfYXJyYXlfbGlrZV90b19hcnJheUBzd2MvaGVscGVycy9fL19hcnJheV9saWtlX3RvX2FycmF5X2FycmF5X3dpdGhfaG9sZXNAc3djL2hlbHBlcnMvXy9fYXJyYXlfd2l0aF9ob2xlc19hcnJheV93aXRob3V0X2hvbGVzQHN3Yy9oZWxwZXJzL18vX2FycmF5X3dpdGhvdXRfaG9sZXNfYXNzZXJ0X3RoaXNfaW5pdGlhbGl6ZWRAc3djL2hlbHBlcnMvXy9fYXNzZXJ0X3RoaXNfaW5pdGlhbGl6ZWRfYXN5bmNfZ2VuZXJhdG9yQHN3Yy9oZWxwZXJzL18vX2FzeW5jX2dlbmVyYXRvcl9hc3luY19nZW5lcmF0b3JfZGVsZWdhdGVAc3djL2hlbHBlcnMvXy9fYXN5bmNfZ2VuZXJhdG9yX2RlbGVnYXRlX2FzeW5jX2l0ZXJhdG9yQHN3Yy9oZWxwZXJzL18vX2FzeW5jX2l0ZXJhdG9yX2FzeW5jX3RvX2dlbmVyYXRvckBzd2MvaGVscGVycy9fL19hc3luY190b19nZW5lcmF0b3JfYXdhaXRfYXN5bmNfZ2VuZXJhdG9yQHN3Yy9oZWxwZXJzL18vX2F3YWl0X2FzeW5jX2dlbmVyYXRvcl9hd2FpdF92YWx1ZUBzd2MvaGVscGVycy9fL19hd2FpdF92YWx1ZV9jYWxsX3N1cGVyQHN3Yy9oZWxwZXJzL18vX2NhbGxfc3VwZXJfY2hlY2tfcHJpdmF0ZV9yZWRlY2xhcmF0aW9uQHN3Yy9oZWxwZXJzL18vX2NoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbl9jbGFzc19hcHBseV9kZXNjcmlwdG9yX2Rlc3RydWN0dXJlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZGVzdHJ1Y3R1cmVfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9nZXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9nZXRfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9zZXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9zZXRfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl91cGRhdGVAc3djL2hlbHBlcnMvXy9fY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl91cGRhdGVfY2xhc3NfY2FsbF9jaGVja0Bzd2MvaGVscGVycy9fL19jbGFzc19jYWxsX2NoZWNrX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2ZpZWxkX2Rlc2NyaXB0b3JAc3djL2hlbHBlcnMvXy9fY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfZmllbGRfZGVzY3JpcHRvcl9jbGFzc19leHRyYWN0X2ZpZWxkX2Rlc2NyaXB0b3JAc3djL2hlbHBlcnMvXy9fY2xhc3NfZXh0cmFjdF9maWVsZF9kZXNjcmlwdG9yX2NsYXNzX25hbWVfdGR6X2Vycm9yQHN3Yy9oZWxwZXJzL18vX2NsYXNzX25hbWVfdGR6X2Vycm9yX2NsYXNzX3ByaXZhdGVfZmllbGRfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfZ2V0X2NsYXNzX3ByaXZhdGVfZmllbGRfaW5pdEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX2luaXRfY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9iYXNlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2VfYmFzZV9jbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2tleUBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2tleV9jbGFzc19wcml2YXRlX2ZpZWxkX3NldEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX3NldF9jbGFzc19wcml2YXRlX2ZpZWxkX3VwZGF0ZUBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX3VwZGF0ZV9jbGFzc19wcml2YXRlX21ldGhvZF9nZXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9tZXRob2RfZ2V0X2NsYXNzX3ByaXZhdGVfbWV0aG9kX2luaXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9tZXRob2RfaW5pdF9jbGFzc19wcml2YXRlX21ldGhvZF9zZXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9tZXRob2Rfc2V0X2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3NwZWNfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3NwZWNfZ2V0X2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3NwZWNfc2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3NwZWNfc2V0X2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3VwZGF0ZUBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF91cGRhdGVfY29uc3RydWN0QHN3Yy9oZWxwZXJzL18vX2NvbnN0cnVjdF9jcmVhdGVfY2xhc3NAc3djL2hlbHBlcnMvXy9fY3JlYXRlX2NsYXNzX2RlY29yYXRlQHN3Yy9oZWxwZXJzL18vX2RlY29yYXRlX2RlZmF1bHRzQHN3Yy9oZWxwZXJzL18vX2RlZmF1bHRzX2RlZmluZV9lbnVtZXJhYmxlX3Byb3BlcnRpZXNAc3djL2hlbHBlcnMvXy9fZGVmaW5lX2VudW1lcmFibGVfcHJvcGVydGllc19kZWZpbmVfcHJvcGVydHlAc3djL2hlbHBlcnMvXy9fZGVmaW5lX3Byb3BlcnR5X2V4cG9ydF9zdGFyQHN3Yy9oZWxwZXJzL18vX2V4cG9ydF9zdGFyX2V4dGVuZHNAc3djL2hlbHBlcnMvXy9fZXh0ZW5kc19nZXRAc3djL2hlbHBlcnMvXy9fZ2V0X2dldF9wcm90b3R5cGVfb2ZAc3djL2hlbHBlcnMvXy9fZ2V0X3Byb3RvdHlwZV9vZl9pbmhlcml0c0Bzd2MvaGVscGVycy9fL19pbmhlcml0c19pbmhlcml0c19sb29zZUBzd2MvaGVscGVycy9fL19pbmhlcml0c19sb29zZV9pbml0aWFsaXplcl9kZWZpbmVfcHJvcGVydHlAc3djL2hlbHBlcnMvXy9faW5pdGlhbGl6ZXJfZGVmaW5lX3Byb3BlcnR5X2luaXRpYWxpemVyX3dhcm5pbmdfaGVscGVyQHN3Yy9oZWxwZXJzL18vX2luaXRpYWxpemVyX3dhcm5pbmdfaGVscGVyX2luc3RhbmNlb2ZAc3djL2hlbHBlcnMvXy9faW5zdGFuY2VvZl9pbnRlcm9wX3JlcXVpcmVfZGVmYXVsdEBzd2MvaGVscGVycy9fL19pbnRlcm9wX3JlcXVpcmVfZGVmYXVsdF9pbnRlcm9wX3JlcXVpcmVfd2lsZGNhcmRAc3djL2hlbHBlcnMvXy9faW50ZXJvcF9yZXF1aXJlX3dpbGRjYXJkX2lzX25hdGl2ZV9mdW5jdGlvbkBzd2MvaGVscGVycy9fL19pc19uYXRpdmVfZnVuY3Rpb25faXRlcmFibGVfdG9fYXJyYXlAc3djL2hlbHBlcnMvXy9faXRlcmFibGVfdG9fYXJyYXlfaXRlcmFibGVfdG9fYXJyYXlfbGltaXRAc3djL2hlbHBlcnMvXy9faXRlcmFibGVfdG9fYXJyYXlfbGltaXRfaXRlcmFibGVfdG9fYXJyYXlfbGltaXRfbG9vc2VAc3djL2hlbHBlcnMvXy9faXRlcmFibGVfdG9fYXJyYXlfbGltaXRfbG9vc2VfanN4QHN3Yy9oZWxwZXJzL18vX2pzeF9uZXdfYXJyb3dfY2hlY2tAc3djL2hlbHBlcnMvXy9fbmV3X2Fycm93X2NoZWNrX25vbl9pdGVyYWJsZV9yZXN0QHN3Yy9oZWxwZXJzL18vX25vbl9pdGVyYWJsZV9yZXN0X25vbl9pdGVyYWJsZV9zcHJlYWRAc3djL2hlbHBlcnMvXy9fbm9uX2l0ZXJhYmxlX3NwcmVhZF9vYmplY3RfZGVzdHJ1Y3R1cmluZ19lbXB0eUBzd2MvaGVscGVycy9fL19vYmplY3RfZGVzdHJ1Y3R1cmluZ19lbXB0eV9vYmplY3Rfc3ByZWFkQHN3Yy9oZWxwZXJzL18vX29iamVjdF9zcHJlYWRfb2JqZWN0X3NwcmVhZF9wcm9wc0Bzd2MvaGVscGVycy9fL19vYmplY3Rfc3ByZWFkX3Byb3BzX29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNAc3djL2hlbHBlcnMvXy9fb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3NlQHN3Yy9oZWxwZXJzL18vX29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfbG9vc2Vfb3ZlcmxvYWRfeWllbGRAc3djL2hlbHBlcnMvXy9fb3ZlcmxvYWRfeWllbGRfcG9zc2libGVfY29uc3RydWN0b3JfcmV0dXJuQHN3Yy9oZWxwZXJzL18vX3Bvc3NpYmxlX2NvbnN0cnVjdG9yX3JldHVybl9yZWFkX29ubHlfZXJyb3JAc3djL2hlbHBlcnMvXy9fcmVhZF9vbmx5X2Vycm9yX3NldEBzd2MvaGVscGVycy9fL19zZXRfc2V0X3Byb3RvdHlwZV9vZkBzd2MvaGVscGVycy9fL19zZXRfcHJvdG90eXBlX29mX3NraXBfZmlyc3RfZ2VuZXJhdG9yX25leHRAc3djL2hlbHBlcnMvXy9fc2tpcF9maXJzdF9nZW5lcmF0b3JfbmV4dF9zbGljZWRfdG9fYXJyYXlAc3djL2hlbHBlcnMvXy9fc2xpY2VkX3RvX2FycmF5X3NsaWNlZF90b19hcnJheV9sb29zZUBzd2MvaGVscGVycy9fL19zbGljZWRfdG9fYXJyYXlfbG9vc2Vfc3VwZXJfcHJvcF9iYXNlQHN3Yy9oZWxwZXJzL18vX3N1cGVyX3Byb3BfYmFzZV90YWdnZWRfdGVtcGxhdGVfbGl0ZXJhbEBzd2MvaGVscGVycy9fL190YWdnZWRfdGVtcGxhdGVfbGl0ZXJhbF90YWdnZWRfdGVtcGxhdGVfbGl0ZXJhbF9sb29zZUBzd2MvaGVscGVycy9fL190YWdnZWRfdGVtcGxhdGVfbGl0ZXJhbF9sb29zZV90aHJvd0Bzd2MvaGVscGVycy9fL190aHJvd190b19hcnJheUBzd2MvaGVscGVycy9fL190b19hcnJheV90b19jb25zdW1hYmxlX2FycmF5QHN3Yy9oZWxwZXJzL18vX3RvX2NvbnN1bWFibGVfYXJyYXlfdG9fcHJpbWl0aXZlQHN3Yy9oZWxwZXJzL18vX3RvX3ByaW1pdGl2ZV90b19wcm9wZXJ0eV9rZXlAc3djL2hlbHBlcnMvXy9fdG9fcHJvcGVydHlfa2V5X3VwZGF0ZUBzd2MvaGVscGVycy9fL191cGRhdGVfdHlwZV9vZkBzd2MvaGVscGVycy9fL190eXBlX29mX3Vuc3VwcG9ydGVkX2l0ZXJhYmxlX3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX3Vuc3VwcG9ydGVkX2l0ZXJhYmxlX3RvX2FycmF5X3dyYXBfYXN5bmNfZ2VuZXJhdG9yQHN3Yy9oZWxwZXJzL18vX3dyYXBfYXN5bmNfZ2VuZXJhdG9yX3dyYXBfbmF0aXZlX3N1cGVyQHN3Yy9oZWxwZXJzL18vX3dyYXBfbmF0aXZlX3N1cGVyX3dyYXBfcmVnX2V4cEBzd2MvaGVscGVycy9fL193cmFwX3JlZ19leHBfd3JpdGVfb25seV9lcnJvckBzd2MvaGVscGVycy9fL193cml0ZV9vbmx5X2Vycm9yX2NsYXNzX3ByaXZhdGVfZmllbGRfZGVzdHJ1Y3R1cmVAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZV9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZUBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZV9jbGFzc19zdGF0aWNfcHJpdmF0ZV9tZXRob2RfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3N0YXRpY19wcml2YXRlX21ldGhvZF9nZXRfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfYWNjZXNzQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2Vzc19pc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3RAc3djL2hlbHBlcnMvXy9faXNfbmF0aXZlX3JlZmxlY3RfY29uc3RydWN0X2NyZWF0ZV9zdXBlckBzd2MvaGVscGVycy9fL19jcmVhdGVfc3VwZXJfY3JlYXRlX2Zvcl9vZl9pdGVyYXRvcl9oZWxwZXJfbG9vc2VAc3djL2hlbHBlcnMvXy9fY3JlYXRlX2Zvcl9vZl9pdGVyYXRvcl9oZWxwZXJfbG9vc2VfdHNfZGVjb3JhdGVAc3djL2hlbHBlcnMvXy9fdHNfZGVjb3JhdGVfdHNfZ2VuZXJhdG9yQHN3Yy9oZWxwZXJzL18vX3RzX2dlbmVyYXRvcl90c19tZXRhZGF0YUBzd2MvaGVscGVycy9fL190c19tZXRhZGF0YV90c19wYXJhbUBzd2MvaGVscGVycy9fL190c19wYXJhbV90c192YWx1ZXNAc3djL2hlbHBlcnMvXy9fdHNfdmFsdWVzX3RzX2FkZF9kaXNwb3NhYmxlX3Jlc291cmNlQHN3Yy9oZWxwZXJzL18vX3RzX2FkZF9kaXNwb3NhYmxlX3Jlc291cmNlX3RzX2Rpc3Bvc2VfcmVzb3VyY2VzQHN3Yy9oZWxwZXJzL18vX3RzX2Rpc3Bvc2VfcmVzb3VyY2VzX3RzX3Jld3JpdGVfcmVsYXRpdmVfaW1wb3J0X2V4dGVuc2lvbkBzd2MvaGVscGVycy9fL190c19yZXdyaXRlX3JlbGF0aXZlX2ltcG9ydF9leHRlbnNpb25fYXBwbHlfZGVjc18yMjAzX3JAc3djL2hlbHBlcnMvXy9fYXBwbHlfZGVjc18yMjAzX3JfYXBwbHlfZGVjc18yMzExQHN3Yy9oZWxwZXJzL18vX2FwcGx5X2RlY3NfMjMxMV9pZGVudGl0eUBzd2MvaGVscGVycy9fL19pZGVudGl0eV9kaXNwb3NlQHN3Yy9oZWxwZXJzL18vX2Rpc3Bvc2VfdXNpbmdAc3djL2hlbHBlcnMvXy9fdXNpbmdfdXNpbmdfY3R4QHN3Yy9oZWxwZXJzL18vX3VzaW5nX2N0eGFwcGx5X2RlY29yYXRlZF9kZXNjcmlwdG9yYXJyYXlfbGlrZV90b19hcnJheWFycmF5X3dpdGhfaG9sZXNhcnJheV93aXRob3V0X2hvbGVzYXNzZXJ0X3RoaXNfaW5pdGlhbGl6ZWRhc3luY19nZW5lcmF0b3Jhc3luY19nZW5lcmF0b3JfZGVsZWdhdGVhc3luY19pdGVyYXRvcmFzeW5jX3RvX2dlbmVyYXRvcmF3YWl0X2FzeW5jX2dlbmVyYXRvcmF3YWl0X3ZhbHVlY2FsbF9zdXBlcmNoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbmNsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZGVzdHJ1Y3R1cmVjbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldGNsYXNzX2FwcGx5X2Rlc2NyaXB0b3Jfc2V0Y2xhc3NfYXBwbHlfZGVzY3JpcHRvcl91cGRhdGVjbGFzc19jYWxsX2NoZWNrY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfZmllbGRfZGVzY3JpcHRvcmNsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvcmNsYXNzX25hbWVfdGR6X2Vycm9yY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXRjbGFzc19wcml2YXRlX2ZpZWxkX2luaXRjbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2Jhc2VjbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2tleWNsYXNzX3ByaXZhdGVfZmllbGRfc2V0Y2xhc3NfcHJpdmF0ZV9maWVsZF91cGRhdGVjbGFzc19wcml2YXRlX21ldGhvZF9nZXRjbGFzc19wcml2YXRlX21ldGhvZF9pbml0Y2xhc3NfcHJpdmF0ZV9tZXRob2Rfc2V0Y2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19nZXRjbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX3NldGNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3VwZGF0ZWNvbnN0cnVjdGNyZWF0ZV9jbGFzc2RlY29yYXRlZGVmYXVsdHNkZWZpbmVfZW51bWVyYWJsZV9wcm9wZXJ0aWVzZGVmaW5lX3Byb3BlcnR5ZXhwb3J0X3N0YXJnZXRfcHJvdG90eXBlX29maW5oZXJpdHNpbmhlcml0c19sb29zZWluaXRpYWxpemVyX2RlZmluZV9wcm9wZXJ0eWluaXRpYWxpemVyX3dhcm5pbmdfaGVscGVyaW50ZXJvcF9yZXF1aXJlX2RlZmF1bHRpbnRlcm9wX3JlcXVpcmVfd2lsZGNhcmRpc19uYXRpdmVfZnVuY3Rpb25pdGVyYWJsZV90b19hcnJheWl0ZXJhYmxlX3RvX2FycmF5X2xpbWl0aXRlcmFibGVfdG9fYXJyYXlfbGltaXRfbG9vc2Vqc3huZXdfYXJyb3dfY2hlY2tub25faXRlcmFibGVfcmVzdG5vbl9pdGVyYWJsZV9zcHJlYWRvYmplY3RfZGVzdHJ1Y3R1cmluZ19lbXB0eW9iamVjdF9zcHJlYWRvYmplY3Rfc3ByZWFkX3Byb3Bzb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfbG9vc2VvdmVybG9hZF95aWVsZHBvc3NpYmxlX2NvbnN0cnVjdG9yX3JldHVybnJlYWRfb25seV9lcnJvcnNldF9wcm90b3R5cGVfb2Zza2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0c2xpY2VkX3RvX2FycmF5c2xpY2VkX3RvX2FycmF5X2xvb3Nlc3VwZXJfcHJvcF9iYXNldGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWx0YWdnZWRfdGVtcGxhdGVfbGl0ZXJhbF9sb29zZXRvX2FycmF5dG9fY29uc3VtYWJsZV9hcnJheXRvX3ByaW1pdGl2ZXRvX3Byb3BlcnR5X2tleXVwZGF0ZXR5cGVfb2Z1bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheXdyYXBfYXN5bmNfZ2VuZXJhdG9yd3JhcF9uYXRpdmVfc3VwZXJ3cmFwX3JlZ19leHB3cml0ZV9vbmx5X2Vycm9yY2xhc3NfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZWNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlY2xhc3Nfc3RhdGljX3ByaXZhdGVfbWV0aG9kX2dldGNsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2Vzc2lzX25hdGl2ZV9yZWZsZWN0X2NvbnN0cnVjdGNyZWF0ZV9zdXBlcmNyZWF0ZV9mb3Jfb2ZfaXRlcmF0b3JfaGVscGVyX2xvb3NldHNfZGVjb3JhdGV0c19nZW5lcmF0b3J0c19tZXRhZGF0YXRzX3BhcmFtdHNfdmFsdWVzdHNfYWRkX2Rpc3Bvc2FibGVfcmVzb3VyY2V0c19kaXNwb3NlX3Jlc291cmNlc3RzX3Jld3JpdGVfcmVsYXRpdmVfaW1wb3J0X2V4dGVuc2lvbmFwcGx5X2RlY3NfMjIwM19yYXBwbHlfZGVjc18yMzExaWRlbnRpdHlkaXNwb3NldXNpbmdfY3R4YXJndW1lbnRzAG07IABkAAAAogIAACwAAABtOyAAZAAAAHoCAAAiAAAAbTsgAGQAAABYAQAAOAAAAG07IABkAAAAyAEAADQAAAAlGCAAHgAAAA0AAAAUAAAAngUAAE1hcmtlciBwcm92aWRlZCB0byByZXNvbHZlciBzaG91bGQgbm90IGJlIHRoZSByb290IG1hcmsA3EQgADMAAACHAAAABQAAAGluZGV4IG5vdCBmb3VuZABtOyAAZAAAAEsAAAAKAAAATnVtYmVyRnVuY3Rpb25CaWdJbnQAAAAACAAAAAQAAAD8AAAAVHNRdWFsaWZpZWROYW1lc3BhbmxlZnRyaWdodG8FAAAQAAAACAAAAHAFAACfBQAABAAAAAQAAACgBQAAAAAAAAEAAAABAAAAoQUAAAAAAAABAAAAAQAAAFQBAAAAAAAAAQAAAAEAAACiBQAAAAAAAAQAAAAEAAAAYgEAAGtleWtpbmRpc19zdGF0aWNhY2Nlc3NpYmlsaXR5aXNfYWJzdHJhY3Rpc19vcHRpb25hbGlzX292ZXJyaWRlAACTkSYABAAAAACSJgADAAAA5bYmAAgAAAADkiYABAAAAAeSJgAJAAAAEJImAA0AAAAdkiYACwAAACiSJgALAAAAM5ImAAsAAABQcml2YXRlTWV0aG9kSlNYU3ByZWFkQ2hpbGRleHByAAAAAAAEAAAABAAAAG0CAABSZXN0UGF0ZG90M190b2tlbmFyZ3R5cGVfYW5udQUAABgAAAAIAAAAtAEAAEZuRGVjbGlkZW50U3RyTnVtQ29tcHV0ZWQAAAB2BQAADAAAAAQAAAAoAwAAowUAAAQAAAAEAAAA1wIAAAAAAAAEAAAABAAAACkDAABUc0NhbGxTaWduYXR1cmVEZWNscGFyYW1zdHlwZV9wYXJhbXNUc0ludGVyZmFjZURlY2xUaGlzVW5hcnlVcGRhdGVCaW5NZW1iZXJTdXBlclByb3BDb25kQ2FsbE5ld1NlcUxpdFRwbFRhZ2dlZFRwbEFycm93WWllbGRNZXRhUHJvcEF3YWl0UGFyZW5KU1hNZW1iZXJKU1hOYW1lc3BhY2VkTmFtZUpTWEVtcHR5SlNYRWxlbWVudEpTWEZyYWdtZW50VHNUeXBlQXNzZXJ0aW9uVHNDb25zdEFzc2VydGlvblRzTm9uTnVsbFRzQXNUc0luc3RhbnRpYXRpb25Uc1NhdGlzZmllc1ByaXZhdGVOYW1lT3B0Q2hhaW5KU1hDbG9zaW5nRWxlbWVudG5hbWVTdGF0aWNCbG9ja2JvZHlUc0NvbnN0cnVjdFNpZ25hdHVyZURlY2xEZWJ1Z2dlclN0bXROYW1lZERlZmF1bHROYW1lc3BhY2VKU1hBdHRydmFsdWUAAKQFAAAEAAAABAAAAJ8CAABWYXJEZWNsYXJhdG9yaW5pdGRlZmluaXRlUHJpdmF0ZVB1YmxpY1JlZ2V4ZXhwZmxhZ3MApQUAAAQAAAAEAAAAkgIAAGNvbXB1dGVkb3B0aW9uYWyTkSYABAAAAIi3JgAIAAAAAJImAAMAAAAMlSYACAAAABSVJgAIAAAAzJImAAgAAABUc1Byb3BlcnR5U2lnbmF0dXJlV2l0aFN0bXRvYmpVc2luZ0RlY2xpc19hd2FpdGRlY2xzSW1wb3J0RGVmYXVsdFNwZWNpZmllcmxvY2FsAHoFAAAEAAAABAAAAPwBAABFeHBvcnRBbGxzcmN0eXBlX29ubHkAAAAAAAAABAAAAAQAAABbAQAApgUAACAAAAAIAAAA1gIAAHwFAAAMAAAABAAAAKcFAAB+BQAAGAAAAAQAAACoBQAAY3R4dJORJgAEAAAABJYmAAQAAAAAkiYAAwAAAEOTJgAGAAAAbZQmAAQAAAAQkiYADQAAACiSJgALAAAAQ29uc3RydWN0b3JKU1hNZW1iZXJFeHBycmF3S2V5VmFsdWVDbGFzc0RlY2xOYW1lZEV4cG9ydHNwZWNpZmllcnNDb21wdXRlZFByb3BOYW1lRGVjb3JhdG9ySlNYT3BlbmluZ0VsZW1lbnRhdHRyc3NlbGZfY2xvc2luZ3R5cGVfYXJnc1RzR2V0dGVyU2lnbmF0dXJlVHNTZXR0ZXJTaWduYXR1cmVUc01ldGhvZFNpZ25hdHVyZVRzSW5kZXhTaWduYXR1cmVFeHByU3RtdEtleVZhbHVlUGF0UHJvcFZhckRlY2xFeHBvcnREZWZhdWx0RGVjbGRlY2xNZXRob2RHZXR0ZXJTZXR0ZXJTcHJlYWRFbGVtZW50Qm9vbEFzc2lnblBhdFByb3BFbXB0eVN0bXRSZXR1cm5TdG10AACpBQAAIAAAAAgAAACqBQAAggUAAAwAAAAEAAAAOwMAAGRlY29yYXRvcnMAAJORJgAEAAAAAJImAAMAAACxlCYABQAAAMySJgAIAAAAB5ImAAkAAACglyYACgAAABCSJgANAAAAHZImAAsAAAAzkiYACwAAANmUJgAIAAAAQXV0b0FjY2Vzc29ySW1wb3J0U3RhckFzU3BlY2lmaWVyVGhpc0V4cHJFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXJKU1hUZXh0SlNYRXhwckNvbnRhaW5lcklmU3RtdHRlc3Rjb25zYWx0QXJyYXlMaXRlbGVtc0V4cG9ydERlZmF1bHRTcGVjaWZpZXJleHBvcnRlZG9wZW5pbmdjaGlsZHJlbmNsb3NpbmdTd2l0Y2hTdG10ZGlzY3JpbWluYW50Y2FzZXNUc0tleXdvcmRUeXBlVHNUaGlzVHlwZVRzRm5PckNvbnN0cnVjdG9yVHlwZVRzVHlwZVJlZlRzVHlwZVF1ZXJ5VHNUeXBlTGl0VHNBcnJheVR5cGVUc1R1cGxlVHlwZVRzT3B0aW9uYWxUeXBlVHNSZXN0VHlwZVRzVW5pb25PckludGVyc2VjdGlvblR5cGVUc0NvbmRpdGlvbmFsVHlwZVRzSW5mZXJUeXBlVHNQYXJlbnRoZXNpemVkVHlwZVRzVHlwZU9wZXJhdG9yVHNJbmRleGVkQWNjZXNzVHlwZVRzTWFwcGVkVHlwZVRzTGl0VHlwZVRzVHlwZVByZWRpY2F0ZVRzSW1wb3J0VHlwZUV4cG9ydE5hbWVkU3BlY2lmaWVyb3JpZ2lzX3R5cGVfb25seU9iamVjdExpdHByb3BzSlNYT3BlbmluZ0ZyYWdtZW50AAAA3EQgADMAAADlBgAAMgAAAIMFAAAMAAAABAAAAKsFAACFBQAABAAAAAQAAAABAwAAaXNfZ2VuZXJhdG9yaXNfYXN5bmNyZXR1cm5fdHlwZQBDkyYABgAAAKCXJgAKAAAAk5EmAAQAAAAEliYABAAAAG2UJgAEAAAASJomAAwAAABUmiYACAAAAEmTJgALAAAAXJomAAsAAABwYXJhbUxhYmVsZWRTdG10bGFiZWxJbXBvcnROYW1lZFNwZWNpZmllcmltcG9ydGVkAAAAk5EmAAQAAAAAkiYAAwAAAAyVJgAIAAAAFJUmAAgAAABDkyYABgAAAMySJgAIAAAASZMmAAsAAABCcmVha1N0bXRDb250aW51ZVN0bXRUaHJvd1N0bXRUc0ZuVHlwZVRzQ29uc3RydWN0b3JUeXBlSlNYQ2xvc2luZ0ZyYWdtZW50VW5hcnlFeHByb3BGb3JTdG10VXBkYXRlRXhwcnByZWZpeEZvckluU3RtdEJpbkV4cHJGb3JPZlN0bXRUcnlTdG10YmxvY2toYW5kbGVyZmluYWxpemVyU3ByZWFkUHJvcFRzQW55S2V5d29yZFRzVW5rbm93bktleXdvcmRUc051bWJlcktleXdvcmRUc09iamVjdEtleXdvcmRUc0Jvb2xlYW5LZXl3b3JkVHNCaWdJbnRLZXl3b3JkVHNTdHJpbmdLZXl3b3JkVHNTeW1ib2xLZXl3b3JkVHNWb2lkS2V5d29yZFRzVW5kZWZpbmVkS2V5d29yZFRzTnVsbEtleXdvcmRUc05ldmVyS2V5d29yZFRzSW50cmluc2ljS2V5d29yZFdoaWxlU3RtdERvV2hpbGVTdG10Rm5FeHByU3dpdGNoQ2FzZWV4cHJfbmFtZU1lbWJlckV4cHJwcm9wVHNFbnRpdHlOYW1lSW1wb3J0VHNJbXBvcnRDYWxsT3B0aW9uc3R5cGVfbmFtZUNhdGNoQ2xhdXNlcGFyYW1fbmFtZUNsYXNzRXhwclBhdEFzc2lnbkV4cHJTdXBlclByb3BFeHByAACGBQAABAAAAAQAAACcAgAAcXVhbGlmaWVyYXR0cmlidXRlc1RzVHVwbGVFbGVtZW50dHlOZXdFeHByY2FsbGVlYXJnc1NlcUV4cHJleHByc21lbWJlcnNlbGVtX3R5cGVDb25kRXhwcmVsZW1fdHlwZXNDYWxsRXhwcgAAhwUAAAwAAAAEAAAArAUAAK0FAAAEAAAABAAAAK4FAACTkSYABAAAAASWJgAEAAAAQ5MmAAYAAABtlCYABAAAAFSaJgAIAAAASJomAAwAAABJkyYACwAAAFyaJgALAAAAQXJyb3dFeHByVHNVbmlvblR5cGVUc0ludGVyc2VjdGlvblR5cGVjaGVja190eXBlZXh0ZW5kc190eXBldHJ1ZV90eXBlZmFsc2VfdHlwZXR5cGVfcGFyYW1Bd2FpdEV4cHJxdWFzaXNUc1R5cGVBbm4AAACLBQAADAAAAAQAAACvBQAAAAAAAAQAAAAEAAAAsAUAAHN1cGVyX2NsYXNzc3VwZXJfdHlwZV9wYXJhbXOTkSYABAAAAASWJgAEAAAAoJcmAAoAAABtlCYABAAAAJyeJgALAAAAHZImAAsAAABJkyYACwAAAKeeJgARAAAAsL4mAAoAAABZaWVsZEV4cHJkZWxlZ2F0ZXR5cGVzTWV0YVByb3BFeHBydGFndHBsU3VwZXIAAAAAAAAAAQAAAAEAAACxBQAAsgUAADAAAAAIAAAAswUAALQFAAAEAAAABAAAALUFAAAAAAAABAAAAAQAAAC2BQAAbmFtZV90eXBlAAAAk5EmAAQAAACItyYACAAAAFeeJgAKAAAAcJ8mAAkAAAAUlSYACAAAAMySJgAIAAAAbGl0AAAAAAAEAAAABAAAAFYDAABwaGFzZVRwbEVsZW1lbnR0YWlsY29va2Vkb2JqX3R5cGVpbmRleF90eXBlUGFyZW5FeHByVHJ1ZVBsdXNNaW51c0V4cHJPclNwcmVhZHNwcmVhZFRzRXhwcldpdGhUeXBlQXJnc1RzVHlwZUFsaWFzRGVjbGlkVHNFbnVtRGVjbGlzX2NvbnN0VHNUcGxMaXRUeXBlQmxvY2tTdG10AAAAlAUAAAwAAAAEAAAAtwUAAAAAAAAEAAAABAAAALgFAACTkSYABAAAADSgJgACAAAA2bYmAAcAAABJkyYACwAAAPi2JgAHAAAAbZQmAAQAAABTaW1wbGVUc0ludGVyZmFjZUJvZHlUc0VudW1NZW1iZXJPcHRDYWxsVHNNb2R1bGVCbG9ja1RzTmFtZXNwYWNlRGVjbFNob3J0aGFuZE9wdENoYWluRXhwcmJhc2UAAACXBQAAIAAAAAgAAAADAgAAAAAAAAQAAAAEAAAAuQUAAJORJgAEAAAA2bYmAAcAAAAjuSYABgAAABS5JgAJAAAANKAmAAIAAABtlCYABAAAAFRzTW9kdWxlRGVjbEpTWEVtcHR5RXhwck1vZHVsZURlY2xTdG10QmxvY2tFbXB0eURlYnVnZ2VyV2l0aFJldHVybkxhYmVsZWRCcmVha0NvbnRpbnVlSWZTd2l0Y2hUaHJvd1RyeVdoaWxlRG9XaGlsZUZvckZvckluRm9yT2ZEZWNsR2V0dGVyUHJvcEFycmF5UGF0AAAAAAAAAAQAAAAEAAAAugUAAJORJgAEAAAAoJcmAAoAAAAQkiYADQAAADOSJgALAAAAiLcmAAgAAACwmiYABQAAAFRzUGFyYW1Qcm9wRXhwb3J0RGVjbAAAAJORJgAEAAAABJYmAAQAAAAAkiYAAwAAALGUJgAFAAAAzJImAAgAAAAHkiYACQAAAKCXJgAKAAAAEJImAA0AAAAokiYACwAAADOSJgALAAAAiLcmAAgAAADZlCYACAAAAFByaXZhdGVQcm9wc3ltT2JqZWN0UGF0U2V0dGVyUHJvcHRoaXNfcGFyYW0AmgUAAAwAAAAEAAAAmwUAAJwFAAAEAAAABAAAALsFAACTkSYABAAAAHeWJgAKAAAAtZUmAAMAAAC4lSYACQAAAJK2JgAEAAAAwJ8mAAUAAABJbXBvcnREZWNsQ2xhc3NNZXRob2RBc3NpZ25QYXRJZGVudE5hbWVFdmFsdWF0aW9uU291cmNlRGVmZXJNZXRob2RQcm9wAAChIyAALAAAAMYAAABAAAAAVHNFeHBvcnRBc3NpZ25tZW50VHNOYW1lc3BhY2VFeHBvcnREZWNsVHNBc0V4cHJUc0ltcG9ydEVxdWFsc0RlY2xpc19leHBvcnRtb2R1bGVfcmVmVHNFeHRlcm5hbE1vZHVsZVJlZnN0bXRzVHNOb25OdWxsRXhwclRzU2F0aXNmaWVzRXhwclByb3RlY3RlZFBhcmFtcGF0RXhwb3J0TmFtZWRFeHBvcnREZWZhdWx0RXhwclRzSW1wb3J0RXF1YWxzVHNOYW1lc3BhY2VFeHBvcnRUc1R5cGVQYXJhbURlY2xLZXlWYWx1ZVByb3BDbGFzc1Byb3Bpc19pbmlzX291dGNvbnN0cmFpbnQAAACTkSYABAAAAF6UJgAEAAAAfKQmAAUAAACBpCYABgAAAECgJgAIAAAAh6QmAAoAAAAEtiYABwAAAFRzVHlwZVBhcmFtbnNBc3NpZ25Qcm9wVHNUeXBlUGFyYW1JbnN0YW50aWF0aW9uAJORJgAEAAAAAJImAAMAAACxlCYABQAAAMySJgAIAAAAB5ImAAkAAACglyYACgAAABCSJgANAAAAHZImAAsAAAAokiYACwAAADOSJgALAAAAiLcmAAgAAADZtiYABwAAANmUJgAIAAAAQmluZGluZ0lkZW50hDAgADYAAABoBAAARQAAALwFAAAoAAAACAAAAC0DAACEMCAANgAAAFsFAABAAAAARVNNLXN0eWxlIG1vZHVsZSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gYSBuYW1lc3BhY2UuSW1wb3J0IGRlY2xhcmF0aW9ucyBpbiBhIG5hbWVzcGFjZSBjYW5ub3QgcmVmZXJlbmNlIGEgbW9kdWxlLkltcG9ydCBhc3NpZ25tZW50IGNhbm5vdCBiZSB1c2VkIHdoZW4gdGFyZ2V0aW5nIEVDTUFTY3JpcHQgbW9kdWxlcy4gQ29uc2lkZXIgdXNpbmcgYGltcG9ydCAqIGFzIG5zIGZyb20gIm1vZCJgLCBgaW1wb3J0IHthfSBmcm9tICJtb2QiYCwgYGltcG9ydCBkIGZyb20gIm1vZCJgLCBvciBhbm90aGVyIG1vZHVsZSBmb3JtYXQgaW5zdGVhZC5FeHBvcnQgYXNzaWdubWVudCBjYW5ub3QgYmUgdXNlZCB3aGVuIHRhcmdldGluZyBFQ01BU2NyaXB0IG1vZHVsZXMuIENvbnNpZGVyIHVzaW5nIGBleHBvcnQgZGVmYXVsdGAgb3IgYW5vdGhlciBtb2R1bGUgZm9ybWF0IGluc3RlYWQuAAC9BQAABAAAAAQAAACSAgAAkEsgACAAAAAJCgAAPAAAAF9jcmVhdGVSZXF1aXJlZXhwb3J0c2NyZWF0ZVJlcXVpcmVfX3JlcXVpcmVOYU5JbmZpbml0eWludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGRlc3RydWN0dXJpbmcgcGF0dGVybiBpbnNpZGUgVHNQYXJhbWV0ZXJQcm9wZXJ0eYQwIAA2AAAACgEAACEAAADYLyAANAAAAOEAAAAaAAAA2C8gADQAAAC3AAAAEgAAAIQwIAA2AAAA7wQAAA0AAACEMCAANgAAAIAFAAAdAAAAhDAgADYAAADyBQAAUQAAAIQwIAA2AAAA/wUAAFYAAACEMCAANgAAAPQGAAAaAAAAhDAgADYAAADyBgAAGgAAAG5vdCBpbXBsZW1lbnRlZACQSyAAIAAAAPsJAAA+AAAAkEsgACAAAADoCQAAJgAAAF9hd2FpdAAAoBEgADcAAABGAAAALAAAAIQwIAA2AAAA9QEAACwAAABuYW1lc3BhY2UgYmxvY2sgc3RhY2sgc2hvdWxkIGNvbnRhaW4gY3VycmVudCBibG9jawAAP0sgADUAAAADAgAADgAAACoFAAAMAAAABAAAACsFAAAsBQAAswMAAAAAAAAAAAAAAQAAAC0FAABPbmx5IGFtYmllbnQgbW9kdWxlcyBjYW4gdXNlIHF1b3RlZCBuYW1lcy4AAIQwIAA2AAAAyAcAAA4AAABDbGFzc0ZuVmFyVXNpbmdUc0ludGVyZmFjZVRzVHlwZUFsaWFzVHNFbnVtVHNNb2R1bGUAAAAAAAwAAAAEAAAAwgUAAMMFAABfX3Byb3RvX19jb25zdHJ1Y3RvciBzaG91bGQgaGF2ZSBhIGJvZHkAWiEgACgAAAAOAAAAIAAAACoFAAAMAAAABAAAACsFAAAsBQAAswMAAAAAAAAAAAAAAQAAAC0FAABTeW1ib2wAAKspIAAjAAAAegIAABQAAACrKSAAIwAAAKICAAA8AAAAqykgACMAAACRAgAAPgAAAAAAAAAAAAAAAQAAALQDAACpKiAATwAAAAkCAAA3AAAAxQUAACwAAAAEAAAAxgUAAMcFAADIBQAAyQUAAMoFAADLBQAAlwMAALADAAAMAAAABAAAABcFAADMBQAAswMAABhAIABeAAAAMQYAAAMAAAAcDyAAWgAAACcBAAACAAAAvT4gAFsAAADwAAAATQAAAGFzc2VydGlvbiBmYWlsZWQ6IGVkZ2UuaGVpZ2h0ID09IHNlbGYubm9kZS5oZWlnaHQgLSAxAAAAvT4gAFsAAAADBAAACQAAAL0+IABbAAAAEwUAACQAAABKOiAAXwAAAFgCAAAwAAAALSUgAGIAAABMCAAAMwAAAHV1dXV1dXV1YnRudWZydXV1dXV1dXV1dXV1dXV1dXV1AAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtJSAAYgAAAD8IAABAAAAAdTgAAOcgIABIAAAAsQAAABYAAABhdHRlbXB0IHRvIGpvaW4gaW50byBjb2xsZWN0aW9uIHdpdGggbGVuID4gdXNpemU6Ok1BWAAAAOcgIABIAAAAmgAAAAoAAABhc3NlcnRpb24gZmFpbGVkOiBzcmMubGVuKCkgPT0gZHN0LmxlbigpvT4gAFsAAABUBwAABQAAAEEQIABhAAAAOAAAABsAAABsaW5lY29sdW1ub2Zmc2V0dXJsbWFwdmVyc2lvbmZpbGVzb3VyY2Vzc291cmNlUm9vdHNvdXJjZXNDb250ZW50c2VjdGlvbnNuYW1lc3Njb3Blc3JhbmdlTWFwcGluZ3NtYXBwaW5nc2lnbm9yZUxpc3R4X2ZhY2Vib29rX29mZnNldHN4X21ldHJvX21vZHVsZV9wYXRoc3hfZmFjZWJvb2tfc291cmNlc2RlYnVnX2lkZGVidWdJZAAAAC0lIABiAAAAfwIAACoAAAAiXCJcXFxiXGZcblxyXHQAqAsgAGAAAACgAQAALgAAAEo6IABfAAAAFgIAAC8AAABWNSAAYgAAAI4KAAABAAAAGEAgAF4AAAD3AAAAHwAAABhAIABeAAAATwEAACMAAADNBQAAFAAAAAQAAADOBQAAAAAAAAgAAAAEAAAAzwUAAENhbm5vdCBzZXQgc291cmNlcyBmb3IgdG9tYnN0b25lIHNvdXJjZSBpZAAAjCggACMAAACDAAAACQAAAIwoIAAjAAAAhwAAAB0AAABKOiAAXwAAAKEAAAAkAAAAvT4gAFsAAADQBAAAIwAAAC0lIABiAAAADQYAABIAAABodHRwOmh0dHBzOmFzc2VydGlvbiBmYWlsZWQ6IGVkZ2UuaGVpZ2h0ID09IHNlbGYuaGVpZ2h0IC0gMQC9PiAAWwAAALYCAAAJAAAASjogAF8AAADGAAAAJwAAAEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9pbnZhbGlkIHV0Zji/JyAAIwAAAGYAAAAhAAAAaW52YWxpZCBieXRlvycgACMAAAAjAAAAEgAAAE51bGxQdHJFcnJvckluY2x1ZGVkRXhjbHVkZWRVbmJvdW5kZWQAAAAtJSAAYgAAAAoCAAAqAAAATWlzYWxpZ25FcnJvcgAAAAEAAAAuLmxlZnRvdmVyIGN1ci9zaGlmdCBpbiB2bHEgZGVjb2RldmxxIGRlY29kZSBkaWQgbm90IHByb2R1Y2UgYW55IHZhbHVlc3ZscSBkZWNvZGUgY2F1c2VkIGFuIG92ZXJmbG93ZW5jb3VudGVyZWQgaW5jb21wYXRpYmxlIHNvdXJjZW1hcCBmb3JtYXR0aGUgcHJvdmlkZWQgZGF0YSBVUkwgaXMgaW52YWxpZGludmFsaWQgbWFnaWMgbnVtYmVyIGZvciByYW0gYnVuZGxlaW52YWxpZCBtb2R1bGUgaW5kZXggaW4gcmFtIGJ1bmRsZWludmFsaWQgcmFtIGJ1bmRsZSBtb2R1bGUgZW50cnlub3QgYSByYW0gYnVuZGxlAAAALSUgAGIAAACkAgAAKgAAANAFAAAMAAAABAAAANEFAADSBQAAswMAAAAAAAAAAAAAAQAAAOYEAABOdWxsTWlzYWxpZ25lZFRvb0xvbmdUb29IaWdoIC8vLyoqLwDTBQAA1AUAANUFAADWBQAA1wUAANgFAADZBQAA2gUAANsFAADcBQAA3QUAAN4FAABzJCAAagAAAH4BAAAZAAAAazYgAGwAAACqAQAACQAAABIEEwUHX0AidXNlIHN0cmljdCIndXNlIHN0cmljdCdldmFsAHpGIAAxAAAAEgEAABkAAAAAAAAADAAAAAQAAADfBQAA4AUAAF124ysQFd0yb8XOlN62NKyKe+NlYivqfIRzbnr0lmMIY2Fubm90IGFjY2VzcyBhIHNjb3BlZCB0aHJlYWQgbG9jYWwgdmFyaWFibGUgd2l0aG91dCBjYWxsaW5nIGBzZXRgIGZpcnN0Vk4gAGAAAACoAAAACQAAACppbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiDBIACAYAAAAADmLiAAKQAAAH0BAAARAAAAqSogAE8AAADlBQAAFAAAAKkqIABPAAAA5QUAACEAAACpKiAATwAAANkFAAAhAAAAqykgACMAAAA5BQAASgAAAKspIAAjAAAAZgUAACYAAADhBQAAHAAAAAQAAADiBQAA4QUAABwAAAAEAAAA4wUAAOIFAABMsyYA5AUAAOUFAACZAwAA5AUAAJoDAADmBQAAFAAAAAQAAADnBQAA5gUAABQAAAAEAAAA6AUAAOcFAACIsyYA6QUAAOoFAACZAwAA6QUAAJoDAADrBQAAOAAAAAQAAAClAwAA6wUAADgAAAAEAAAApgMAAKUDAADEsyYApwMAAOwFAACpAwAAqgMAAKsDAADtBQAAMAAAAAQAAAClAwAA7QUAADAAAAAEAAAApgMAAKUDAAAAtCYApwMAAO4FAACpAwAAqgMAAKsDAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBoYW5kbGVfaW1wb3J0X2V4cG9ydCBzaG91bGQgbm90IGJlIGNhbGxlZCBpZiBjdXJyZW50IHRva2VuIGlzbid0IGltcG9ydCBub3IgZXhwb3J02DAgADAAAABaBAAACQAAAKMQIABfAAAATQAAAB8AAACjECAAXwAAAEcAAAAXAAAAEkcgAE0AAADyAwAAHAAAABJHIABNAAAA8wMAABwAAAASRyAATQAAAPcDAAAgAAAAEkcgAE0AAAD3AwAAKwAAAGFuIGlkZW50aWZpZXIsIFsgZm9yIGFuIGFycmF5IHBhdHRlcm4sIHsgZm9yIGFuIG9iamVjdCBwYXR0ZXIgb3IgLi4uIGZvciBhIHJlc3QgcGF0dGVybnt9AAAA7wUAABQAAAAEAAAA8AUAAO8FAAAUAAAABAAAAHgDAADwBQAAhLUmAJcDAADxBQAAmQMAAJcDAACaAwAA8gUAAAwAAAAEAAAA8wUAAPIFAAAMAAAABAAAAHoDAADzBQAAwLUmAJcDAAD0BQAAmQMAAPUFAACaAwAAYXNleHBvcnRkZWZhdWx0PC8+ZmFsc2V0cnVlbnVsbC4uLjphYnN0cmFjdGNsYXNzYXNzZXJ0c2lzdHlwZW9mc2F0aXNmaWVzdXNlIHN0cmljdHNjcmlwdFx1ezwhLS1ceDNjIS0tLS0+LS1ceDNlYXdhaXR1c2luZz0oKWltcG9ydHR5cGVzb3VyY2VkZWZlcixmcm9td2l0aGFzc2VydGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuc3BlY2lmaWVycy5sZW4oKSA8PSAyehwgACsAAACvAAAAFQAAACpkZWNsYXJlYXN5bmNmdW5jdGlvbmRlYnVnZ2VyZ2V0ZXh0ZW5kcz9uc3RhdGljb3ZlcnJpZGVhY2Nlc3NvciFzZXRuZXdub3QgaW1wbGVtZW50ZWQ6IGNvZGVnZW4gb2YgYGV4cG9ydCBkZWZhdWx0IGZyb20gJ2Zvbyc7YAAAehwgACsAAAAHAQAAEQAAAHJldHVybj0+IyFbXXN3aXRjaGNvbnN0ZW51bWNhdGNocmVhZG9ubHljYXNlfhMgACMAAAARAQAAHQAAAH4TIAAjAAAAFAEAAEEAAAB0aHJvd2NvbnN0cnVjdG9ycHVibGljcHJvdGVjdGVkcHJpdmF0ZSMudGhpc2tleW9mdW5pcXVlaW5vdXQ7c3VwZXI8L3RyeWZpbmFsbHl3aGlsZXJlcXVpcmU8PmRvAT8uPC8+Zm9yPGludmFsaWQ+b2ZicmVha2NvbnRpbnVlaWZlbHNlaW5mZXJuZXcudGFyZ2V0aW1wb3J0Lm1ldGFpbnRlcmZhY2Vhbnl1bmtub3dubnVtYmVyb2JqZWN0Ym9vbGVhbmJpZ2ludHN0cmluZ3N5bWJvbHZvaWR1bmRlZmluZWRuZXZlcmludHJpbnNpY2AA2BEgACkAAAAVAgAAIgAAACR7AADYESAAKQAAABgCAAAhAAAAKy0AAOxLIAAiAAAAcAgAACIAAADsSyAAIgAAAHMIAAAhAAAADQoKAOxLIAAiAAAAowgAADIAAADsSyAAIgAAAJwIAAAwAAAAbmFtZXNwYWNlbW9kdWxlZ2xvYmFseWllbGQoIG9yIGBjFyAAKwAAAMoBAABAAAAAPCAoanN4IHRhZyBzdGFydClUcmllZCB0byBwYXJzZSBhbiBhcmd1bWVudCBvZiB5aWVsZFQTIAApAAAAgwMAAC4AAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlYxcgACsAAADzAQAAIgAAAPcFAAAIAAAABAAAAPgFAAD5BQAA+gUAAPsFAAD8BQAA/QUAAP4FAAD/BQAAAAYAAAEGAAACBgAAAwYAAAQGAAAFBgAAVW5zdXBwb3J0ZWQgc3ludGF4ZmFpbGVkIHRvIHdyaXRlIHNvdXJjZSBtYXBzb3VyY2UgbWFwIHdhcyBub3QgdXRmOAlZkwAAcBEgAC8AAABLDwAANwAAABtQAgNBbiBleHByZXNzaW9uIHNob3VsZCBmb2xsb3cgJy4uLid1ZmFpbFRyaWVkIHRvIHBhcnNlIHRoZSBjb25kaXRpb24gZm9yIGFuIGlmIHN0YXRlbWVudGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IE1vZHVsZSBpcyBoYW5kbGVkIGFib3ZlABBFIAAoAAAASAEAADIAAABUeXBlIGFzc2VydGlvbnMgdGhhdCB3b3VsZCBjaGFuZ2UgYmluYXJ5IGV4cHJlc3Npb24gZ3JvdXBpbmcgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gc3RyaXAtb25seSBtb2RlLlVuc3VwcG9ydGVkU3ludGF4YG1vZHVsZWAga2V5d29yZCBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYG5hbWVzcGFjZWAgaW5zdGVhZC5pbnN0YW5jZW9mVHlwZVNjcmlwdCBlbnVtIGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3RyaXAtb25seSBtb2RlVHlwZVNjcmlwdCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBzdHJpcC1vbmx5IG1vZGVUaGUgYW5nbGUtYnJhY2tldCBzeW50YXggZm9yIHR5cGUgYXNzZXJ0aW9ucywgYDxUPmV4cHJgLCBpcyBub3Qgc3VwcG9ydGVkIGluIHR5cGUgc3RyaXAgbW9k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ZSBleGhhdXN0ZWQAAAC2MSAAagAAAF4BAAARAAAAYXNzZXJ0aW9uIGZhaWxlZDogc3Bhbi5sbyA+PSBzZWxmLmlucHV0LnN0YXJ0X3BvcygpICYmIHNwYW4uaGkgPD0gc2VsZi5pbnB1dC5lbmRfcG9zKCkAADs5IAApAAAAUQAAAAkAAABmaWVsZCBpZGVudGlmaWVydmFyaWFudCBpZGVudGlmaWVyRXJyb3Jjb250ZXh0c3RydWN0IE9wdGlvbnNlbnVtIE1vZGVzdHJ1Y3QgVHJhbnNmb3JtQ29uZmlnRnJvbVV0ZjhFcnJvcmJ5dGVzZXJyb3JOb0ZpbGVGb3IAyEsgACMAAABPAgAAEwAAAMhLIAAjAAAAQgIAABIAAADISyAAIwAAAEYCAAA1AAAAAAAAAAQAAAAAAAAABwYAAAgAAAAEAAAACwYAAAcGAAAIAAAABAAAAAgGAAALBgAAXMgmAAwGAAANBgAAmQMAAA4GAACaAwAAAAAAAAgAAAAEAAAADwYAAAAAAAAIAAAABAAAABAGAAAPBgAAmMgmAJcDAAARBgAAmQMAAJcDAACaAwAAEgYAAAQAAAAEAAAAEwYAABIGAAAEAAAABAAAABQGAAATBgAA1MgmABUGAAAWBgAAmQMAABcGAACaAwAAyEsgACMAAABWBAAALAAAAMhLIAAjAAAA9wMAABgAAADISyAAIwAAAJUGAAAkAAAASW9VdGY4QmFkSnNvblZscUxlZnRvdmVyVmxxTm9WYWx1ZXNWbHFPdmVyZmxvd0JhZFNlZ21lbnRTaXplQmFkU291cmNlUmVmZXJlbmNlQmFkTmFtZVJlZmVyZW5jZUluY29tcGF0aWJsZVNvdXJjZU1hcEludmFsaWREYXRhVXJsQ2Fubm90RmxhdHRlbkludmFsaWRSYW1CdW5kbGVNYWdpY0ludmFsaWRSYW1CdW5kbGVJbmRleEludmFsaWRSYW1CdW5kbGVFbnRyeU5vdEFSYW1CdW5kbGVJbnZhbGlkUmFuZ2VNYXBwaW5nSW5kZXhJbnZhbGlkQmFzZTY0SWRlbnRBcnJheVJlc3RPYmplY3RBc3NpZ25JbnZhbGlkRXhwclV0ZjhFcnJvcnZhbGlkX3VwX3RvZXJyb3JfbGVuYSBEaXNwbGF5IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHVuZXhwZWN0ZWRseYE4IABLAAAAZAsAAA4AAABTb21lgDEgADUAAACmAQAAIAAAAKkqIABPAAAAzQEAADcAAAAAAAAABAAAAAQAAAAYBgAAGQYAABoGAABVbmtub3duAKkqIABPAAAAaQQAACQAAABkZXNjcmlwdGlvbigpIGlzIGRlcHJlY2F0ZWQ7IHVzZSBEaXNwbGF5D4B+6n3GVIXNhXnoAJF7eOqAEr2h+lgcUlnbvH8843Jhz6mLzzHAGhVOekpjKRht6bDx4XKGcj8/bzMQ0MOrxCy3kvBAPEDSEO9rAZLYKj4yJbVjPNzsC9Plx1k8n19WOGn3s9QqngmteX+Z7m9BJgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQTCAAYAAAAB8FAAAZAAAAcndsb2NrIG92ZXJmbG93ZWQgcmVhZCBsb2Nrc8gfIABdAAAAFQAAACwAAAByd2xvY2sgaGFzIG5vdCBiZWVuIGxvY2tlZCBmb3IgcmVhZGluZwAAyB8gAF0AAAA+AAAACQAAAP////8AAAAABAsPExcbHyMnLTE0ODxAAkUAAAAAAEkATQAFBQUFBQUFBQUFBQUGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBVFUWFwFBQUFBQUFBQUFBQUFBQUFBQUFBQUJAAAAAAAAAAAAAAAAAAAAAAFgKGRobHArdHZ6foKGio6SlpqeBTKiAAAAAKQFBaYFBQUFBQVDBawAAAAAAAAAAAAAAACtAAAABbG1uQUFBQUFBQUFBQUFUgUFvQAAAAAAAAAAAAAAAAAAAAC/p8EAAAAAxAAAAAAAAAAAAAAA0NIAAADI2d3hy+UAAOkAAAAAAAAAAAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF6wUFBQUFBQWq7gUFBQUFBQUFBQXxBQUFBQUFBQUFBQUFBewF9AAAAAAFrgAABQUFBQUFBQUF7wUFBQUFBQXyAAAAAAAACA0RFRkdISUqLzE2Oj5CAkcAAAAAAEsATwAFBQUFBQUFBQUFBQUGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBVFWWl4FBQUFBQUFBQUFBQUFBQUFBQUFBQUJAAAAAAAAAAAAAAAAAAAAAAFiKGZqbnIrdHh8gISIjJCUmJygBTKiAAAAAKQFBakFBQUFBQVDBawAAAAAAAAAAAAAAACvAAAABbO3uwUFBQUFBQUFBQUFUgUFvQAAAAAAAAAAAAAAAAAAAAC/p8EAAAAAxwAAAAAAAADKwsXN0NQA1gDI29/jy+cAAOkAAAAAAM4AAAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF6wUFBQUFBQWq7gUFBQUFBQUFBQXxBQUFBQUFBQUFBQUFBewF9AAAAAAFrgAABQUFBQUFBQUF7wUFBQUFBQXyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////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//////////////z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgICAwQFBgcICQoLDA0CAgICAgICDgICAgICAgIOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCAgICAgICAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVVRUAUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQEAAAAAAAAAAAAAEEEQVVVVVVVXVVVVVVVVVVVVUVVVAABAVPXdVVVVVVVVVVUVAAAAAABVVVVV/F1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQUAFAAUBFBVVVVVVVVVFVFVVVVVVVVVAAAAAAAAQFVVVVVVVVVVVdVXVVVVVVVVVVVVVVUFAABUVVVVVVVVVVVVVVVVVRUAAFVVUVVVVVVVBRAAAAEBUFVVVVVVVVVVVVUBVVVVVVX/////f1VVVVAVAABVVVVVVVVVVVVVBQAAAAAAAAAAAAAAAABAVVVVVVVVVVVVVVVVVUVUAQBUUQEAVVUFVVVVVVVVVVFVVVVVVVVVVVVVVVVVVUQBVFVRVRVVVQVVVVVVVVVFQVVVVVVVVVVVVVVVVVVVVEEVFFBRVVVVVVVVVVBRVVVBVVVVVVVVVVVVVVVVVVVUARBUUVVVVVUFVVVVVVUFAFFVVVVVVVVVVVVVVVVVVQQBVFVRVQFVVQVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVRVRVVVFVFVVVVVVVVVVVVVVUVFVVVVVVVVVVVVVVVVUEVAUEUFVBVVUFVVVVVVVVVVFVVVVVVVVVVVVVVVVVVRREBQRQVUFVVQVVVVVVVVVVUFVVVVVVVVVVVVVVVVUVRAFUVUFVFVVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVFFQVEVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVEAQFVVFQBAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUQAAVFVVAEBVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVEVFVVVVVVVVVVVVVVVVVAQAAQAAEVQEAAAEAAAAAAAAAAFRVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBBABBQVVVVVVVVVAFVFVVVQFUVVVFQVVRVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQFVVVVVVVVVVVVVVVUFUFVVVVVVVQVUVVVVVVVVBVVVVVVVVVUFVVVVf//99//911931tXXVRAAUFVFAQAAVVdRVVVVVVVVVVVVVRUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAFVRVRVUBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVxUUVVVVVVVVVVVVVVVVVVVFAEBEAQBUFQAAFFVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAUAAAAFVVVVVVAFVVVVVVVVVVVVVVVQAAUAVUVVVVVVVVVVUVAABVVVVQVVVVVVVVVQVQAFBVVVVVVVVVVVVVVVVVRVARAFVVVVVVVVVVVVVVVVVVAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAABABUUVVUUFVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAAAAAAAAAAAAAFVVFQBVVVVVVVUFQFVVVVVVVVVVVVVVVQAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAFRVVVVVVVVVVVX1VVVVaVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/VfXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX1VVVVVVV9VVVVVVVWqqlVVVVX///9VVVVVVVVVVVVV1VVVparVVVVVXVX1VVVVVX1VX1V1VVdVVVVVdVX1XXVdVV31VVVVVVVVVVdVVVVVVVVVVXfV31VVVVVVVVVVVVVVVVVVVf1VVVVVVVVXVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVXVVVVVVVVVVVVVVVVV11VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVBVVVVVVVVVVVVVVVVVVVX9////////////////X1XVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAqqqqqqqqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVWqqqqqqqqqqqqqqqqqqgoAqqqqaqmqqqqqqqqqqqqqqqqqqqqqqqqqqmqBqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlWpqqqqqqqqqqqqqqmqqqqqqqqqqqqqqqqoqqqqqqqqqqqqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVlaqqqqqqqqqqqqqqaqqqqqqqqqqqqqpVVaqqqqqqqqqqqqqqqqqqqlaqqqqqqqqqqqqqqqqqalVVVVVVVVVVVVVVVVVfVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFUAAAFBVVVVVVVVVBVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVVVUVFFVVVVVVVVUFVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVAAAAAFBVRRVVVVVVVVVVVVUFAFBVVVVVVRUAABBVVVWqqqqqqqqqVkBVVVVVVVVVVVVVVRUFUFBUVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVQFAQUFVVRVVVVRVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVUEFFQFUVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVFFVVVVVqqqqqqqqqqqqVVVVAAAAAABAFQAAAAAAAAAAAAAAAFVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQwAAPCqqlpVAAAAAKqqqqqqqqqqaqqqqqpqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRWpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpWVVVVVVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVVapqVVUAAFRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBUBVAUFVAFVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVUBUFVVVVVVVVVVVVVVVVVVFVRVVVVVVVVVVVVVVVVVVVVVVVUFAFVVVVVVVVVVVVVVVVVVVVVVBQAAVFVVVVVVVVVVVVVVBVBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVQAAAEBVVVVVVVVVVVVVFFRVFVBVVVVVVVVVVVVVVRVAQVVFVVVVVVVVVVVVVVVVVVVVQFVVVVVVVVVVFQABAFRVVVVVVVVVVVVVVVVVVRVVVVVQVVVVVVVVVVVVVVVVBQBABFUBFFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVAAVUVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVFQBAVVVVVVVQVVVVVVVVVVVVVVVVVRVEVFVVUVUVVVVVBQBUAFRVVVVVVVVVVVVVVVVVVVVVFABEEVAFQFVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAVEVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVUUAEQRBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQVQVRBUVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVFQBAEVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVEAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVURBRAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVAABBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVRUAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAFVVRVVVVVVVVVAQBAVVVVVVVVVVVVFQAUQFUVVVUBQAFVVVVVVVVVVVVVAAAAAEBQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQREVVVVVVVVVVVVVVVVVVVVVVVVAEAAEFVVVVVVVVVVVVVVVVVVVVVVVVVVBQAAAAAABQAEQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQFARRAAAFVVVVVVVVVVVVVVVVVVVVVVVVARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVRVVUBVVVVVVVVVVVVVVVUFQFVAVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVAAAAUFVVVVVVVVVVVVVVVVVVVVVVBQAAUAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVFVVVVVVVVVVVVVVVVVVAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV1VdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVFUBVVVVVVVVVVVVVVVVVVVVVVVVVqlRVVaBqVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqpaVVVVVVVVVVVVlaqqqqqqqqpqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqmqaaqqqqqqqqqqalVVVWVVVVVVVVVVallVVVWqVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVVVVVVVVVQQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAUAAAAAAAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQFQAQAAAABAAQBVVVVVVVVVBVBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqalVVqqqqqqpqVVUAAAAAAAAAAAAAAAAAQBUAAAAAAAAAAAAAAABUVVFVVVVUVVVVVRUAAQAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVAEAAAAAAFAAQBEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVFVQVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBAVVVVVVVVVVVVVVVVVVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVVVVVVVVVVVVVVVVVVVVV1/f9/VVVVVVVVVVVVVVVVVVVVVVVV9f///////25VVVWqqrqqqqqq6vq/v1WqqlZVX1VVVapaVVVVVVVV//////////9XVVX9/9////////////////////////f//////1VVVf////////////9/1f9VVVX/////V1f//////////////////////3/3/////////////////////////////////////////////////////////////9f///////////////////9fVVXVf////////1VVVVV1VVVVVVVVfVVVVVdVVVVVVVVVVVVVVVVVVVVVVVVVVdX///////////////////////////9VVVVVVVVVVVVVVVX//////////////////////19VV3/9V/9VVdVXVf//V1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf///1VXVVVVVVVV//////////////9////f/////////////////////////////////////////////////////////////1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///9X//9/9f////////////////9/V/3////X//9/1f//V1WqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqWlVVVVVVVVVVWZZVYaqlWapVVVVVVZVVVVVVVVVVlVVVAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAFVVVVVVlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQCWalpaaqoFQKZZlWVVVVVVVVVVVQAAAABVVlVVqVZVVVVVVVVVVVVWVVVVVVVVVVUAAAAAAAAAAFRVVVWVWVlVVWVVVWlVVVVVVVVVVVVVVaqqqmqqqqpVqqpaVVVVWVWqqqpVVVVVZVVVWlVVVVWlZVZVVVWVVVVVVVVVppaalllZZamWqqpmVapVWllVWlZlVVVVaqqlpVpVVVWlqlpVVVlZVVVZVVVVVVWVVVVVVVVVVVVVVVVVVVVVVVVVVVVlVfVVVVVpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVaqqqqqqqqqqqlZVVaqqqqqlWlVVmqpaVaWlVVpapZalWlVVVaVaVZVVVVV9VWlZpVWvVWZVVVVVqqpVVWZV////VVVVmppqmlVVVdVVVaWq1VVVpV1V9VVVVVW9Va+quqqrqqqaVbqq+q66rlVd9VVVVVVVVVVXVVVVVVlVVVV31d9VVVVVVVVVpaqqqqqqqqr9VVVVVVVVV1VV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVV1VVVVVVVVVVVVVVVVetWlVVVVVVVVVVVaqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqMwAAwKqqWlUAAAAAqqqqqqqqqqpqqqqqqmqqVVVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVWqalVVAABUWaqqqlaqqqqqqqqqWqqqqqqqqqqqqqqqqqqqWlWqqqqqqqqquv7/v6qqqqpWVVVVVVVVVVVVVVVVVfX///////8AAQICAgIDAgIEAgUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0CAh4CAgICAgICHyAhIiMCJCUmJygpAioCAgICKywCAgICLS4CAgIvMDEyMwICAgICAjQCAjU2NwI4OTo7PD0+Pzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlAAgJBQgICQ0RFRkdIAkk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlKAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICOTk5OUsCAgICAkxNTk8CAgJQAlFSAgICAgICAgICAgICAlNUAgJVAlYCAldYWVpbXF1eX2BhYmMCZGVmZwJoAmlqa2xtAm5vcHECcnMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCAgICAgICAgICAgICAgICAgJ2dwICAngCAgJ5ejk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OXt8fQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ+OTl/OTmAAgICAgICAgICAgICAgICAgICAoECAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICg4SFAoYCAgICAgICAgICAgICh4gCAgICAgICAgICiYp3AgKLAgICjAKNAo4CAgKPkAICAgICAgICAgICAgKRkgKTlAKVlpeYmZqbnAKdAgKen6ChAgICAgICAgICAjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5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IQBwEiEAgBIhAJASIQCgEiEAsBIhAMASIQDQEiEA4BIhAPASIQAAEyEAEBMhACATIQAwEyEAQBMhAFATIQBQEyEAYBMhAHATIQCAEyEAkBMhAKATIQCwEyEAsBMhAMATIQDQEyEA4BMhAPATIQAAFCEA8BEhABAUIQAgFCEAMBQhAEAUIQBQFCEAYBQhAHAUIQCAFCEAkBQhAKAUIQCwFCEAwBQhANAUIQDgFCEA8BQhAAAVIQAQFSEAIBUhADAVIQBAFSEAUBUhAGAVIQBwFSEAgBUhAJAVIQCgFSEAsBUhAMAVIQDQFSEA4BUhAPAVIQAAFiEAEBYhACAWIQAwFiEAQBYhAFAWIQBgFiEAcBYhAIAWIQCQFiEAoBYhALAWIQAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAGIQCQBiEAoAYhALAGIQDABiEA0AYhAOAGIQDwBiEAAAchABAHIQAgByEAMAchAEAHIQBQByEAYAchAHAHIQCAByEAkAchAKAHIQCwByEAwAchANAHIQDgByEA8AchAPAHIQAACCEAEAghACAIIQAwCCEAQAghAFAIIQBgCCEAcAghAIAIIQCQCCEAoAghAKAIIQCwCCEAwAghANAIIQDgCCEA8AghAPAIIQAACSEAEAkhACAJIQAwCSEAQAkhAFAJIQBgCSEAcAkhAIAJIQCQCSEAkAkhAKAJIQCwCSEAwAkhANAJIQDgCSEA8AkhAAAKIQAQCiEAIAohADAKIQBACiEAUAohAGAKIQBwCiEAgAohAJAKIQCgCiEAoAohALAKIQDACiEA0AohAOAKIQDwCiEAAAshAAALIQAQCyEAIAshADALIQBACyEAUAshAEAJIQBgCyEAcAshAIALIQCQCyEAoAshALALIQDACyEA0AshAOALIQDwCyEAAAwhABAMIQAgDCEAMAwhAEAMIQBQDCEAYAwhAHAMIQCADCEAkAwhAKAMIQCwDCEAwAwhANAMIQDgDCEA8AwhAAANIQAQDSEAIA0hADANIQBADSEAUA0hAGANIQBwDSEAgA0hAJANIQCgDSEAsA0hAMANIQDQDSEA4A0hAPANIQAADiEACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAHIbIQB6GyEAghshAIobIQCSGyEAmhshAKIbIQCqGyEAshshALobIQDCGyEAyhshANIbIQDaGyEA4hshAOobIQDyGyEA+hshAAIcIQAKHCEAEhwhABocIQAiHCEAKhwhADIcIQA6HCEAQhwhAEocIQBSHCEAWhwhAGIcIQBqHCEAchwhAHocIQCCHCEAihwhAJIcIQCaHCEAohwhAKocIQCyHCEAuhwhAMIcIQDKHCEA0hwhANocIQDiHCEA6hwhAPIcIQD6HCEAAh0hAAodIQASHSEAGh0hACIdIQAqHSEAMh0hADodIQBCHSEASh0hAFIdIQBaHSEAYh0hAGodIQByHSEAeh0hAIIdIQCKHSEAkh0hAJodIQCiHSEAqh0hALIdIQC6HSEAwh0hAModIQDSHSEA2h0hAOIdIQDqHSEA8h0hAPodIQACHiEACh4hABIeIQAaHiEAIh4hACoeIQAyHiEAOh4hAEIeIQBKHiEAUh4hAFoeIQBiHiEAah4hAHIeIQB6HiEAgh4hAIoeIQCSHiEAmh4hAKIeIQCqHiEAsh4hALoeIQDCHiEAyh4hANIeIQDaHiEA4h4hAOoeIQDyHiEA+h4hAAIfIQAKHyEAEh8hABofIQAiHyEAKh8hADIfIQA6HyEAQh8hAEofIQBSHyEAWh8hAGIfIQBqHyEA4BchAOYXIQDsFyEA8hchAPgXIQD+FyEABBghAAoYIQAQGCEAFhghABwYIQAjGCEAKhghADEYIQA4GCEAPxghAEYYIQBNGCEAVBghAFsYIQBiGCEAaRghAHAYIQB3GCEAfhghAIUYIQCMGCEAkxghAJoYIQChGCEAqBghAK8YIQC2GCEAvRghAMQYIQDLGCEA0hghANkYIQDgGCEA5xghAO4YIQD1GCEA/BghAAMZIQAKGSEAERkhABgZIQAfGSEAJhkhAC0ZIQA0GSEAOxkhAEIZIQBJGSEAUBkhAFcZIQBeGSEAZRkhAGwZIQBzGSEAehkhAIEZIQCIGSEAjxkhAJYZIQCdGSEApBkhAKsZIQCyGSEAuRkhAMAZIQDHGSEAzhkhANUZIQDcGSEA4xkhAOoZIQDxGSEA+BkhAP8ZIQAGGiEADRohABQaIQAbGiEAIhohACkaIQAwGiEANxohAD4aIQBFGiEATBohAFMa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AAAIAAAABQAAAAkAAAAEAAAABgAAAAIAAAAOAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAgAAAAMAAAACAAAAAgAAAAIAAAACAAAAAQAAAAIAAAACAAAAAwAAAAMAAAAEAAAAAgAAAAIAAAACAAAAAwAAAAMAAAADAAAAAwAAAAIAAAACAAAAAgAAAAMAAAADAAAAAgAAAAIAAAACAAAAAgAAAAMAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAANAAAACwAAAA4AAAAPAAAADgAAAA4AAAAOAAAAIAAAAA0AAAAPAAAADQAAAAgAAAAIAAAABQAAAAUAAAAFAAAABAAAAAUAAAAFAAAABQAAAAgAAAAIAAAABwAAAAYAAAACAAAABAAAAAYAAAAHAAAABQAAAAcAAAADAAAACAAAAAIAAAAGAAAAAgAAAAoAAAADAAAAAwAAAAQAAAAGAAAABQAAAAYAAAAEAAAABQAAAAQAAAADAAAABgAAAAMAAAAEAAAABQAAAAQAAAAFAAAABgAAAAgAAAADAAAAAgAAAAcAAAAGAAAABQAAAAYAAAAHAAAACwAAAAcA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", "base64"); + var bytes = Buffer2.from("AGFzbQEAAAAB+wRQYAAAYAABf2AAAX5gAX8AYAF/AX9gAX8BfmABfwF8YAJ/fwBgAn9/AX9gAn9/AX5gAn9/AXxgA39/fwBgA39/fwF/YAN/f38BfmAEf39/fwBgBH9/f38Bf2AEf39/fwF+YAV/f39/fwBgBX9/f39/AX9gBn9/f39/fwBgBn9/f39/fwF/YAd/f39/f39/AGAHf39/f39/fwF/YAh/f39/f39/fwBgCH9/f39/f39/AX9gC39/f39/f39/f39/AX9gDX9/f39/f39/f39/f38AYA5/f39/f39/f39/f39/fwF/YA9/f39/f39/f39/f39/f38Bf2ATf39/f39/f39/f39/f39/f39/fwF/YBd/f39/f39/f39/f39/f39/f39/f39/fwF/YAl/f39/f39+fn4AYAV/f39/fgBgBn9/f39+fwBgBH9/f34AYAZ/f39+f38AYAN/f34Bf2AEf39+fwBgBH9/fn8Bf2AFf39+f38AYAZ/f35/fn8AYAV/f31/fwBgBX9/fH9/AGACf34AYAJ/fgF/YAN/fn8AYAN/fn8Bf2AEf35/fwBgBH9+f34BfmADf35+AGAEf35+fwBgBX9+fn5/AGAFf35+fn4AYAR/fX9/AGACf3wAYAN/fH8AYAN/fH8Bf2AEf3x/fwBgBH98f38Bf2ABfgBgAX4Bf2ABfgF+YAJ+fwBgAn5/AX5gA35/fwF/YAN+f34BfmAEfn9+fwF/YAJ+fgBgAn5+AX9gAn5+AX5gA35+fwBgBH5+f38BfmAEfn5+fwF+YAd+fn5/f39/AX5gAXwBf2ABfAF8YAJ8fwF/YAJ8fwF8YAJ8fAF8YAN8fHwBfALLGj0YX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFF9fd2JpbmRnZW5fZXJyb3JfbmV3AAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFF9fd2JpbmRnZW5faXNfYmlnaW50AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFV9fd2JpbmRnZW5fbnVtYmVyX2dldAAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyRfX3diZ19pc1NhZmVJbnRlZ2VyXzM0M2UyYmVlZWVjZTFiYjAABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmluZGdlbl9iaWdpbnRfZnJvbV9pNjQAPBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmluZGdlbl9iaWdpbnRfZnJvbV91NjQAPBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18dX193YmdfbGVuZ3RoX2UyZDJhNDkxMzJjMWIyNTYABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18fX193YmdfaXRlcmF0b3JfOWEyNGM4OGRmODYwZGM2NQABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyVfX3diZ19pbnN0YW5jZW9mX01hcF9mMzQ2OWNlMjI0NGQyNDMwAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX3NldF8zZjFkMGI5ODRlZDI3MmVkAAsYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFV9fd2JpbmRnZW5fbnVtYmVyX25ldwBKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX3N0cmluZ19uZXcACBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18TX193YmluZGdlbl9pc19mYWxzeQAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyRfX3diZ19nZXR3aXRocmVma2V5XzFkYzM2MWJkMTAwNTNiZmUACBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18UX193YmluZGdlbl9pc19zdHJpbmcABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmdfZ2V0X2I5YjkzMDQ3ZmUzY2Y0NWIACBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18fX193YmdfdG9TdHJpbmdfNTI4NTU5Nzk2MDY3NmI3YgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfNDA1ZTIyZjM5MDU3NmNlMgABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfNzhmZWIxMDhiNjQ3MjcxMwABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfMzc4MzcwMjNmM2Q3NDBlOAALGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxdfX3diaW5kZ2VuX2lzX3VuZGVmaW5lZAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXw1fX3diaW5kZ2VuX2luAAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFl9fd2JpbmRnZW5fYm9vbGVhbl9nZXQABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18VX193YmluZGdlbl9zdHJpbmdfZ2V0AAcYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFF9fd2JpbmRnZW5faXNfb2JqZWN0AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fE19fd2JpbmRnZW5fanN2YWxfZXEACBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmdfbmV3XzIzYTI2NjVmYWM4M2M2MTEACBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmluZGdlbl9vYmplY3RfY2xvbmVfcmVmAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFl9fd2JpbmRnZW5faXNfZnVuY3Rpb24ABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmluZGdlbl9vYmplY3RfZHJvcF9yZWYAAxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18gX193YmdfbmV3bm9hcmdzXzEwNWVkNDcxNDc1YWFmNTAACBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfY2FsbF82NzJhNGQyMTYzNGQ0YTI0AAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fLV9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9HTE9CQUxfODhhOTAyZDEzYTU1N2QwNwABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXzJfX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMX1RISVNfNTY1NzhiZTdlOWY4MzJiMAABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXy1fX3diZ19zdGF0aWNfYWNjZXNzb3JfV0lORE9XXzVkZTM3MDQzYTkxYTljNDAAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18rX193Ymdfc3RhdGljX2FjY2Vzc29yX1NFTEZfMzdjNWQ0MThlNGJmNTgxOQABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19nZXRfNjdiMmJhNjJmYzMwZGUxMgAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ19uZXh0XzI1ZmVhZGZjMDkxM2ZlYTkABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmdfaXNBcnJheV9hMWVhYjdlMGQwNjczOTFiAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2NhbGxfN2NjY2RkNjllMDc5MWFlMgAMGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19sZW5ndGhfYTQ0NjE5M2RjMjJjMTJmOAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxFfX3diaW5kZ2VuX21lbW9yeQABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19idWZmZXJfNjA5Y2MzZWVlNTFlZDE1OAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfYTEyMDAyYTdmOTFjNzViZQAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfNjU1OTViZGQ4NjhiMzAwOQALGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ19uZXh0XzY1NzRlMWE4YTYyZDEwNTUABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfZG9uZV83NjllNWVkZTRiMzFjNjdiAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHF9fd2JnX3ZhbHVlX2NkMWZmYTdiMWFiNzk0ZjEABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18sX193YmdfaW5zdGFuY2VvZl9VaW50OEFycmF5XzE3MTU2YmNmMTE4MDg2YTkABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18ZX193YmluZGdlbl9qc3ZhbF9sb29zZV9lcQAIGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXy1fX3diZ19pbnN0YW5jZW9mX0FycmF5QnVmZmVyX2UxNDU4NTQzMmUzNzM3ZmMABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmdfZW50cmllc18zMjY1ZDQxNThiMzNlNWRjAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fEF9fd2JpbmRnZW5fdGhyb3cABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18cX193YmluZGdlbl9iaWdpbnRfZ2V0X2FzX2k2NAAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxdfX3diaW5kZ2VuX2RlYnVnX3N0cmluZwAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxJfX3diaW5kZ2VuX2NiX2Ryb3AABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfdGhlbl80NGI3Mzk0NmQyZmIzZTdkAAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJV9fd2JnX3F1ZXVlTWljcm90YXNrXzk3ZDkyYjRmY2M4YTYxYzUAAxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18lX193YmdfcXVldWVNaWNyb3Rhc2tfZDMyMTlkZWY4MjU1MjQ4NQAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx5fX3diZ19yZXNvbHZlXzQ4NTE3ODVjOWM1ZjU3M2QABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmluZGdlbl9jbG9zdXJlX3dyYXBwZXI1NDY1AAwD0iXQJQ4HEQsOEQ4LBw4RBwsLCwsHBwsHBw4LCwcHDgcHBwsHDgcOEwcOEQcOBwsHCwcHDgcHBwcODgsIDgsHDgcHOgsIBwcLBxMvCw8HFQcTBAcLEQcHBwsLCw4HBwcIEwsHAwcHDgsOBw4HBwcICwcHBxMLDgcHDhMHBxMHBwcEBwcTBwcHCwcLEQcHBwcHDgcVDgcHBwsaCxEHEwcTCAcTCwMLCwsTEw4HEQchAwsHBwsHDgcHBxEHBwcHCwcHEwcODAcTBwcHDgMHCwsHA04HBw4DDgMTBwcOBwcLBwcOBwcHDhEHTAgDDgcTCwcHBwcICxEHCwcRCxMRDggHDAcHDAwHDBERGgwIEQgIBwgHDgQLCAgIBwsLCA4HBwcREQgHDgQHAwcLEQgOBxMRBwsHCwcEDgcVAwcHBwsHBwcHBwEHBwcHBwcLDBEHBwwICAMHBxERBwcVCwgLB08HEQ4ODgcLDgcDBxERBwcLBBMLDggEBwcHCwgLBwMOBwsHDgsLBwsHCwcBBw40DgcODgcIFQsHBwwLDAgHBwwHBAsHBwcLBwsHBwgLCwsHAwcHEwcMCwcHCwcHBwcLBwMEDg4OBwcLAwcHBwsHBAcLDg4HBwcHDAcDCAcEBAcIEQcLEQw3BwcEBwcHCwcDBAsLAwMDAwwHBwsOBAcHBwMDAwcDBwcPBwcHFSENAwsODwsHCwsOBwcHFgsLDw4MCwgPCwcVExEHBwcEBAQHBwcHOAcbBA4HDgcHAwcOBAcHFRMIBwcVBAcLEwsMDwsDCwcLDgMIEQMLBwcLBwcHBwcHCwwHBwcMCAMMBwcIBwcHCAcHOgcHDgcHAwwKDAsOCwcOBw8DCAgHBwMHDggHBwcHBwcHBw4IBAcHBwsOCwMOBwsHAwMDCAgDBwsIAxgLDAwHCAgLBwcDBw4DBwMOCw4HCw4LDAMHCwsDAwcHCwcLBwcHBwsDBxcECAcTCA4HBwsMCAsRBwgHAwcOCAsIDA4OBw4HBwcIC04LAwcEBwgOCwsFDggICxEEBwcHAwgIBygPCwgTQQgPBxQHAwcoAwcHFQcLCxMTBwcHCwcIDAcIBwsHDg4IEwMRCwcHDgcRBwcHBwcOCwcIBwcwBwcHAwcHBwcLBxMHCAcOBxELCAMsBwgIBwcHBwwHAwMOLgQTDgcRCAcLBwcHDgcTCAgRCxEHCwgVFQsHAy0LCwcLBwsHBwcHBwcHCAsHBwhHRxMRCBULE0cVBxMHBwQHBxMHBwcHBwsLBAMLEwsLDg4DDg4TBwMHEwcTBwcLBzEHCxUHJQcREw4OBwcOCAwHBwcIDAsHCwcHBxUEAw4OBwcHAwQHCxMHCwcLCAMHCwsHBwgHBwcHBwgODgsHCwsHDAcHBwgIBwcHPgcHCwsTBwMLDh8OBwcHCwcHCwsLBwMHEwMLCwsHBwwWBw4TDg4ODhMECwcHCwcESwcLBwcHDgsHBwcDEQQHBwQIDgcHCwgHBwMDBwcHBwcOCAsHBwcHBAQEBAcHBwciAwsLBwcLDhMHBwcRDg4HCAgHBwcLCxMLBAcLCAsEBwgPBAQHBwsTBxEODgsIIAMHAwsMCAcIBwMHBw4LBwMHBwsLBwcHAwgHBwMHDggRAwcVCwMEBwcICAMMCwgDCwgHBwcMAwcDDhETCAgDBwgHCwcOEgQEBAsHCxEHDxUECwcHCAMICwcDCAUHBwcHBw4LDgcHCwwHBwgDBwgIBwcLCwsFBwcHBw8OEwwDBwgHBwsjBwgHCAcLCwcHAAgDCAgLJQMHAwcHCwgHCwgRAwsLAwcHBAgICw8OFAcDBwcHEwcRCwgICAwHAwcHCAcHCwsHBAsHCAcDBAQHBw4SDg4IBwcICwMtCAcHBxMIBAMKCAgIEw4DCAsDBw4WCAMODggICAgICAgOCywHBwMIBwMLEQcXDgsLBwMHBwgDCwMLEwsOCwsLBwcDCwMTAwQHBwMIERMTCAgHEwsTBxMHBxMIBwcPCwgDDBMTDw8PBwcDAwgICAMHDA4FCAsHAwcLDg4IBwcDCwcHBwcLAxMTEwgDBwcHBwcHBwQHBxIHBwgICAcHLggHBwcHCwsHCwsOBwgMDAcHBw8REQQHBQcHHgsHCwcHBwcHBwcHBwMHBwcLCA4ICAwHBwsRCw4DAwcHCAgICAcDCwcLKxEICAgHBwcDCAgICAMICAgDAwsHER0DDgsHBwgHBwcHDgsHCAcHDwcPCA4HCwsHEwssBwMIAwgHBAcVBwMEBAgODggmCwMDCwsLDhMcBxEMDgcLCAgECAgHCxEREQcEFQ4OBAcDBActBwMDAwgLExMHCwcDAwQICAcLCA4HBwcHBwwMCwQLCxkLDxEDAwMECAgHNgcLBxEIBAwDBAMHLwgHBwMTExMIFRMIBwQLBwcODggIBwcWDgcOBwgOAwMICAgICAgDAwMHAwcLBwsRAwcHAwMMEwMECAgOCAcHCA4ICAcHEwwHDAsIAwgICAcDBxMDBw4OCEAHBA4OCAcDBAgDAwcLBwcLBw4HBwcMBAcICAgIBwcHBwgLBwgRCwsDAwMICAgICAgIAwgLAwcDDgcPEREOEQcIA0AOBxMLB00HCAQLBA0RDgMHDgQEBAgLCAsHCAgHBAgHBwgICAgICAgICAgICAgICAcICAgICAgICAgICAgICAgHBwcOBwcLEQcHCwcDCAhOTk4HBwgICAgIBwcHBwgICAgMDBEICAgIAwsIAwMICAgICAgICAgICAgICAgHAwgICAgICAgICAgICAgICAcHBwsOCwQPEwMTAwcODAcIAwgDB04HEwcHLQsLBwcHDgcLBAMDCAMDCAMIAwMOCAsHBw4HCCsDCAgLLU5OBwMLCwsOCAQTAw4ICAgHCAgHBxEOCwcHAwsHDgcDCwcDBwgQKwcICAgICAgHEAsHCwsLCwcDBwcDAw4ECwsHBwcHDgMLCAgIEhEHAxMHCw8HBwcVAww0CysHBwwHCwcLCAMIAwQREQgMEQsHAwcLBwMDBwcHCAwICCQLBwskJAcHBwcEBwcHJAsHDwcDBwgDCAcICAwOCwQOCA4DAwMLBwcDAwcHBwcHKwcIEwcLCAgHBwMIAwMDEQQICAgRCwcDBw8HBwgEAwwMDAcTBwsDBAcHDAcHCAgIAwcDCwcDAw8DAwcIAwMLA0IHBAMDAwcICAgLDwcHCA4OCAgICAcICAgIBwcDBwcHBwQHBwcICAgIBwhICwtEAwMICAgICAgICAgICAgILQgICAgICAgDCAgICAgIBwMDDggIC0QLBwcHDg4OBAMOEwsOCAsEDgsHBwMDBwcHBwcEBwMDKw8DCAcPAwcIDAMHAwgICAgICwgICAgICAhDBwcHAwcHAwcHCAgEBggHBxEIDwgGDAMHCwMDDhMHDAwHCwQICAgICAgICAgICAcHBwsHDgcEBwcIBw4ICAgOBwQICAgICAgICAcHBAUEBQgECxEICAgIMwMTDAcLDgwICAgDCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDCAgICAgDCwcHBwcLBwcICAgHAwsECAgIDgMIBAMDAwgDBwMOBwMHBw8HCAgIBwsRCA4MCAMHBwcICAgICAMDAwgICAQDAwsDBwgICAQICAgICAgICAwIAwgICAgICAgICAgICAgIBwcHAwcHBwsIAw8REwcHCwcICAwIBwgLCwsLBwMOBw4+CAgICAgICAgIAwMICAgICAgICAcDPgsDAzIyBwwLCAgICAgIDD4DPgcICAgICAgICAgICAMICAgICAgICAgICAgICAgIAwgIBwMEAxERCBEHBw4LCwMICwsHEQsIDgsDAwMDBwcHBAgIBwcHCAgIBwcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAMHCwsLCw4FCAcHBw4HDgcIDAsLEwMBBwcOAwcHEQMDAw4EAwwICAgEAwgIBAMDAw4MAwgICAMABAQICAMDBwsHBwcEBwwDBwcDAQsHCwMIBw4MAwMDAwsHBAgHAwMDCwsHCAcHAwcIAwcDBwQDAwMDBwcLCAsHBwQHBwcHBwMDAwgHAwsICAgICAgICAcDBwQICAsICAcOCQkICAgIAwsLCAgICAgLCwcECAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NBwcDAwgECwcDBxEIBwMDAwMDAwMDAwMDAwgDAwMDAwMHAwMDAwMDAwMEAwMDAwMDAwcDAwMDAwMIAwMDAwMDAwMOAwMDAwMDAwMDAwMDAw4LCAMDAxEIEQgICAgLCwgRCw4EEw0ICAgICAgICAgICBEIBAcIBwcHCAgIPggLAwgTAwQICAMHBxEHCAMDBwcDBw4ECxEDAwMDA0kIBwMDCAM/BwcHBwgHBw4LBxELCAgIEQ4RBxMLCAhGExMCAgICAgwCAgICAgICAgICAgICAgIDAgICAgICBwIHAgICAwMRDwMICAcLCwgVBw4HNgcHBw8IBwMHAwIDAzsCBwcEAwsHCwcDDA4ICAgREQwIAwkDCAgIDAgEDwQEDAMICAMMBAQICAMLBAQHBwsHBw4LDg4DEwgICAgECwMSBwgDBw8HCAMLCAgICwsLBwgIRQMOPQsICAgICAgICAgIBAgIBwgICw8HBwcHBwcHBwcHBwc0NAcDEQgICAsHCQwREQgIAwgLAwgIAwgICAgHBA0ICAg7BAQ7CAg7CDsIBw4DCAcHBwcHBwcHCAgIDAgICAgICAgICAgIAwgHCwgICAcHAwcDBwgECAgICA4MCBEICAkICAgEAAgPCAgIBwgICAgICAMIEQgHBwcDDgcOCwcMDA4DCwgLBwcDAwcLBwcHBAQDAwcDAwMLAwgDBwcHBwcHBwcHBwcHBwMHCwMHCwcDBwMMBwcODgMDBAQHCwQDAwMDAwMHBwcLCw4OEQMLAwgIAwMHBAcIBxEDAwMHAwMHBAcOBQMDBAcOAw8DAwcDBAMMBwEDCwsDCBMICAcDEQMDBwcIAwMDAwQIAwMOBwcECwcIAwULBwcDAwcHBwgLAwcHBwcDBAcIAwQIBwMHBwcHBwcHCAcDBwcDBwMEBwcHAwgHCAMECBQPCAgICAgIAw8MCAgICAgICAgPDw8DCw8HDwcHCwgHDwsREhIRKikRJwsDCwQLAwgLCwQICA0EBAQMBwcHBwcLAwMHDgsHDgQHDwcLCwMHBwQIOw4IBwcNDQgICAgIBAQEBAcDBwMDBwcLCwsEAwMDAwMDDwcLDgUFDAcLAwMDAwgDAwMIBwgRBwMEAwQDAwcDBwsLAwMDBAgIAwMIAwg8AQgDCAMDDg4ICwsHAwMIAwMDAwcHBwcHBwcHAwMDBAMEAwcBAQQDCAEIAQgEAwcBAQEBAQMDAwMDAwMDAQQDCTsDOwMDAwMDAwMDAwMDAwMDAwMDAwMDBwMDAwMICwgICAMHBwgIAwMDAwsICAMICAMICA0IAwM+AwMDAwMDAwkHBwcHBwcHBwcDBwMDCwMHAwMHBwsHCAgICAgICAgIBwcICAgICAgHCwsPCAMICAgHBwgDAwMDCAMDAwgDAwMLCAcICAMHAwsLBwcHBwcDBwcHBwcHBwcDAwMDAwMOAwMDAwMDAwcLBwcHBwcMBwwHAwsDAxEICAQEAwMLDgMAAwMDAzsDAwMDAwMDAwMDAwMDAwMHBwcHCAgHAwcLCwcIDg4ODg4ODgwIBwMIAwgICwsICwcICCsLCwcDAwMDCAMHBwcHBAMDAwMDAwMDAwMDAwMLAwMDBwwHBwcDAAQICAMDBwcHBwcHAwwMBwcADAgHDwwADAMMBAwMAwAAAAcHAAADBwcDBwMHCAwMDAcHAwwMDAADBwwHBwcHBwcHBwcHBwcHDA4OCAgICAgNBwMDAwsHCwsHAwwLAwMMAwcEAwMEBAcEBAcICAsLDAcIAw4MCAgECwQICAgIBAgICAgICAQDBAQEBAgICAgICwcIBwcHCAQEBwcICAgICAQICAwMBwcHBwcHBwcHBwcHBwcHBwcHBwcHDAwMCAgICAgICAgICAgICAgIBAgICAgICAgIBAcICAgICAcDBAMDCwMDAwgIB0M+QwcHBwcHBwcHBwcHBwQHBANPBxUIBAsCBAQEBAcDAQMCAgICAgIHBwgCAgICAgICAgIEBwgICAdEAwNOTgQEBAQECAQEBAQEBAMEBAQBBAQESwQEAAQEBAQEBAQEBAQEAAQEDAQEAQsHBwsEBwFwAaUMpQwFAwEAKAYJAX8BQYCAgAELB9QBCgZtZW1vcnkCAAl0cmFuc2Zvcm0AzhUNdHJhbnNmb3JtU3luYwD/FhNfX3diaW5kZ2VuX2V4cG9ydF8wAMwiE19fd2JpbmRnZW5fZXhwb3J0XzEBABNfX3diaW5kZ2VuX2V4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XiAEKAL0HiFfIAQoAvAeIWAgBC0A7B4hYSAEKALoHiFiIAQoAuQeIWMgBCgC4B4hZCAELQDcHiFlIAQoAtgeIWYgBCgC1B4hZyAEKALQHiFoIAQtAMweIWkgBCgCyB4haiAEKALEHiFrIAQoAsAeIWwgBC0AvB4hbSAEKAK4HiFuIAQoArQeIW8gBCgCsB4hcCAELQCsHiFxIAQoAqgeIXIgBCgCpB4hcyAEKAKgHiF0IAQtAJweIXUgBCgCmB4hdiAEKAKUHiF3IAQoApAeIXggBC0AjB4heSAEKAKIHiF6IAQoAoQeIXsgBCgCgB4hfCAELQD8HSF9IAQoAvgdIX4gBCgC9B0hfyAEKALwHSGAASAELQDsHSGBASAEKALoHSGCASAEKALkHSGDASAEKALgHSGEASAELQDcHSGFASAEKALYHSGGASAEKALUHSGHASAEKALQHSGIASAELQDMHSGJASAEKALIHSGKASAEKALEHSGLASAEKALAHSGMASAELQC8HSGNASAEKAK4HSGOASAEKAK0HSGPASAEKAKwHSGQASAELQCsHSGRASAEKAKoHSGSASAEKAKkHSGTASAEKAKgHSGUASAELQCcHSGVASAEKAKYHSGWASAEKAKUHSGXASAEKAKQHSGYASAELQCMHSGZASAEKAKIHSGaASAEKAKEHSGbASAEKAKAHSGcASAELQD8HCGdASAEKAL4HCGeASAEKAL0HCGfASAEKALwHCGgASAELQDsHCGhASAEKALoHCGiASAEKALkHCGjASAEKALgHCGkASAELQDcHCGlASAEKALYHCGmASAEKALUHCGnASAEKALQHCGoASAELQDMHCGpASAEKALIHCGqASAEKALEHCGrASAEKALAHCGsASAELQC8HCGtASAEKAK4HCGuASAEKAK0HCGvASAEKAKwHCGwASAELQCsHCGxASAEKAKoHCGyASAEKAKkHCGzASAEKAKgHCG0ASAELQCcHCG1ASAEKAKYHCG2ASAEKAKUHCG3ASAEKAKQHCG4ASAELQCMHCG5ASAEKAKIHCG6ASAEKAKEHCG7ASAEKAKAHCG8ASAELQD8GyG9ASAEKAL4GyG+ASAEKAL0GyG/ASAEKALwGyHAASAELQDsGyHBASAEKALoGyHCASAEKALkGyHDASAEKALgGyHEASAELQDcGyHFASAEKALYGyHGASAEKALUGyHHASAEKALQGyHIASAELQDMGyHJASAEKALIGyHKASAEKALEGyHLASAEKALAGyHMASAELQC8GyHNASAEKAK4GyHOASAEKAK0GyHPASAEKAKwGyHQASAELQCsGyHRASAEKAKoGyHSASAEKAKkGyHTASAEKAKgGyHUASAELQCcGyHVASAEKAKYGyHWASAEKAKUGyHXASAEKAKQGyHYASAELQCMGyHZASAEKAKIGyHaASAEKAKEGyHbASAEKAKAGyHcASAELwCNGyHdASAELwCdGyHeASAELwCtGyHfASAELwC9GyHgASAELwDNGyHhASAELwDdGyHiASAELwDtGyHjASAELwD9GyHkASAELwCNHCHlASAELwCdHCHmASAELwCtHCHnASAELwC9HCHoASAELwDNHCHpASAELwDdHCHqASAELwDtHCHrASAELwD9HCHsASAELwCNHSHtASAELwCdHSHuASAELwCtHSHvASAELwC9HSHwASAELwDNHSHxASAELwDdHSHyASAELwDtHSHzASAELwD9HSH0ASAELwCNHiH1ASAELwCdHiH2ASAELwCtHiH3ASAELwC9HiH4ASAELwDNHiH5ASAELwDdHiH6ASAELwDtHiH7ASAELwD9HiH8ASAELwCNHyH9ASAELwCdHyH+ASAELwCtHyH/ASAELwC9HyGAAiAELwDNHyGBAiAELwDdHyGCAiAELwDtHyGDAiAELwD9HyGEAiAEQYAYakHgAGoQ8gsgBEIANwOIGCAEQgA3A4AYIARBgoSIEDYC2BggBEECNgLQGCAEQQI2AsgYIARBADYCwBggBEEDOgC8GCAEQYIEOwHcGCAEQZAVaiAEQYAYakHQAvwKAAAgBEGcCmo1AgAhlQQgBEGsCmo1AgAhlgQgBEGACmpBP2otAAAhhQIgBEGACmpBzwBqLQAAIYYCIARBgApqQd8Aai0AACGHAiAEQYAKakHvAGotAAAhiAIgBEGACmpB/wBqLQAAIYkCIARBgApqQY8Bai0AACGKAiAEQYAKakGfAWotAAAhiwIgBEGACmpBrwFqLQAAIYwCIARBgApqQb8Bai0AACGNAiAEQYAKakHPAWotAAAhjgIgBEGACmpB3wFqLQAAIY8CIARBgApqQe8Bai0AACGQAiAEQYAKakH/AWotAAAhkQIgBEGACmpBjwJqLQAAIZICIARBgApqQZ8Cai0AACGTAiAEQYAKakGvAmotAAAhlAIgBEGACmpBvwJqLQAAIZUCIARBgApqQc8Cai0AACGWAiAEQYAKakHfAmotAAAhlwIgBEGACmpB7wJqLQAAIZgCIARBgApqQf8Cai0AACGZAiAEQYAKakGPA2otAAAhmgIgBEGACmpBnwNqLQAAIZsCIARBgApqQa8Dai0AACEfIARBgApqQb8Dai0AACEeIARBgApqQc8Dai0AACGcAiAEQYAKakHfA2otAAAhHSAEQYAKakHvA2otAAAhnQIgBEGACmpB/wNqLQAAIZ4CIARBgApqQY8Eai0AACGfAiAEQYAKakGfBGotAAAhoAIgBEGACmpBrwRqLQAAIaECIARBgApqQb8Eai0AACGiAiAEQYAKakHPBGotAAAhowIgBEGACmpB3wRqLQAAIaQCIARBgApqQe8Eai0AACGlAiAEQYAKakH/BGotAAAhpgIgBEGACmpBjwVqLQAAIacCIAQpApQKIZQEIAQoApAKIagCIAQoAqAKIakCIAQoArAKIaoCIAQoArQKIasCIAQoArgKIawCIAQtALwKIa0CIAQoAsAKIa4CIAQoAsQKIa8CIAQoAsgKIbACIAQtAMwKIbECIAQoAtAKIbICIAQoAtQKIbMCIAQoAtgKIbQCIAQtANwKIbUCIAQoAuAKIbYCIAQoAuQKIbcCIAQoAugKIbgCIAQtAOwKIbkCIAQoAvAKIboCIAQoAvQKIbsCIAQoAvgKIbwCIAQtAPwKIb0CIAQoAoALIb4CIAQoAoQLIb8CIAQoAogLIcACIAQtAIwLIcECIAQoApALIcICIAQoApQLIcMCIAQoApgLIcQCIAQtAJwLIcUCIAQoAqALIcYCIAQoAqQLIccCIAQoAqgLIcgCIAQtAKwLIckCIAQoArALIcoCIAQoArQLIcsCIAQoArgLIcwCIAQtALwLIc0CIAQoAsALIc4CIAQoAsQLIc8CIAQoAsgLIdACIAQtAMwLIdECIAQoAtALIdICIAQoAtQLIdMCIAQoAtgLIdQCIAQtANwLIdUCIAQoAuALIdYCIAQoAuQLIdcCIAQoAugLIdgCIAQtAOwLIdkCIAQoAvALIdoCIAQoAvQLIdsCIAQoAvgLIdwCIAQtAPwLId0CIAQoAoAMId4CIAQoAoQMId8CIAQoAogMIeACIAQtAIwMIeECIAQoApAMIeICIAQoApQMIeMCIAQoApgMIeQCIAQtAJwMIeUCIAQoAqAMIeYCIAQoAqQMIecCIAQoAqgMIegCIAQtAKwMIekCIAQoArAMIeoCIAQoArQMIesCIAQoArgMIewCIAQtALwMIe0CIAQoAsAMIe4CIAQoAsQMIe8CIAQoAsgMIfACIAQtAMwMIfECIAQoAtAMIfICIAQoAtQMIfMCIAQoAtgMIfQCIAQtANwMIfUCIAQoAuAMIfYCIAQoAuQMIfcCIAQoAugMIfgCIAQtAOwMIfkCIAQoAvAMIfoCIAQoAvQMIfsCIAQoAvgMIfwCIAQtAPwMIf0CIAQoAoANIf4CIAQoAoQNIf8CIAQoAogNIYADIAQtAIwNIYEDIAQoApANIYIDIAQoApQNIYMDIAQoApgNIYQDIAQtAJwNIYUDIAQoAqANIYYDIAQoAqQNIYcDIAQoAqgNIYgDIAQtAKwNIYkDIAQoArANIYoDIAQoArQNIYsDIAQoArgNIYwDIAQtALwNIY0DIAQoAsANIY4DIAQoAsQNIY8DIAQoAsgNIZADIAQtAMwNIZEDIAQoAtANIZIDIAQoAtQNIZMDIAQoAtgNIZQDIAQtANwNIZUDIAQoAuANIZYDIAQoAuQNIZcDIAQoAugNIZgDIAQtAOwNIZkDIAQoAvANIZoDIAQoAvQNIZsDIAQoAvgNIZwDIAQtAPwNIZ0DIAQoAoAOIZ4DIAQoAoQOIZ8DIAQoAogOIaADIAQtAIwOIaEDIAQoApAOIaIDIAQoApQOIaMDIAQoApgOIaQDIAQtAJwOIaUDIAQoAqAOIaYDIAQoAqQOIacDIAQoAqgOIagDIAQtAKwOIakDIAQoArAOIaoDIAQoArQOIasDIAQoArgOIawDIAQtALwOIa0DIAQoAsAOIa4DIAQoAsQOIa8DIAQoAsgOIbADIAQtAMwOIbEDIAQoAtAOIbIDIAQoAtQOIbMDIAQoAtgOIbQDIAQtANwOIbUDIAQoAuAOIbYDIAQoAuQOIbcDIAQoAugOIbgDIAQtAOwOIbkDIAQoAvAOIboDIAQoAvQOIbsDIAQoAvgOIbwDIAQtAPwOIb0DIAQoAoAPIb4DIAQoAoQPIb8DIAQoAogPIcADIAQtAIwPIcEDIAQpAqQKIZcEIAQvAL0K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AygChAMhBQwbCyABLQC4ASICQfMARw0AAkAgARCgC0H/AXFBggFHDQAgASgCtAEhAiABKAKwASEFIANBn4GAgHg2AugGIAEgBSACIANB6AZqEO4dIAEQtRALIAEtALgBIQILIAJB/wFxQYIBRw0CIAEoArABIQIgARC1ECADQegAaiABIAIQugNBACEKIAMoAmwhBSADKAJoQQFxDRQgASgCrAEhD0EDIQlBAiEIDAsLIAMgAykBmgM3A6AFIAMgAykBoAM3AaYFIAMoAowDIgRBgH5xIQogAygCrAMhDyADKAKoAyEGIAMtAJkDIQsgAy0AmAMhDCADKAKUAyEHIAMoApADIQ0gAygCiAMhDiADKAKEAyECDAgLQQkhCUEAIQogARCGDiEFQQAhBAwUCwJAAkACQAJAIAJB/wFxIgJB0ABGDQAgAkH4AEcNASABEKALQf8BcUHdAEcNASABEKELDQEgA0HoBmogASAGIANBkAFqEPEHQQMhCSADKALsBiEFIAMoAugGIghBA0YNGiADIAMpAYIHNwOgBSADIAMpAYgHNwGmBSADKAL0BiIEQYB+cSEKDAILIANB6AZqIAEgBiABKAKwASADQZABakEAEKcIQQMhCSADKALsBiEFIAMoAugGIghBA0YNGSADIAMpAYIHNwOgBSADIAMpAYgHNwGmBSADKAL0BiIEQYB+cSEKDAELAkACQAJAAkAgAS0AuAEiAkHdAEYNACACQf0ARw0FIAEoAoABQYDAAHFFDQUgARCgCyIJQf8BcSIFQbV/aiICQR9NDQEMAgsgA0HoBmogASAGIANBkAFqEMoPQQMhCSADKALsBiEFIAMoAugGIghBA0YNGyADIAMpAYIHNwOgBSADIAMpAYgHNwGmBSADKAL0BiIEQYB+cSEKDAMLQQEgAnRBgYCCkHhxDQELIAVBpAFGDQIgCUG0f2pB/wFxQdQASw0CCyABEKELDQEgASgCsAEhAiABELUQQQAhCiADQeAAaiABIAJBABCxAUEBIQkgAygCZCEFIAMoAmBBAXENEwwJCyADLQCBByELIAMtAIAHIQwgAygC/AYhByADKAL4BiENIAMoAvAGIQ4gAygCkAchBiADKAKUByEPIAUhAgwYCwJAIAEtAIABQRBxRQ0AAkAgAS0AuAEiAkH+AEcNACABEKALQf8BcUHAAEYN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ASAHIQUMCQsCQCACQf8BcUEHRw0AAkACQCAHKAIAIgJBC0cNACADQegGaiABEMQBDAELIAFBCzYCiAEgAyABKQKYATcD6AYgAyABKAKgATYC8AYgAUGMAWohBQJAIAEoAghBCkYNACABQQhqEMALCyABIAI2AgggASAFKQIANwIMIAEgBSgCCDYCFAsgASkDsAEhMCAEIAMpA+gGNwIAIAQgAygC8AY2AgggASAwNwOoASABLQC4ASECDAILIAEoArQBIQQgASgCsAEhBSADQdADaiACEMglIANBjwKtQiCGQazkmgGthDcDuAIgA0HoBmpBzZWAASADQbgCahCyECADIAMpAtADNwL0BiADIAMoAtgDNgL8BiAFIAQgA0HoBmoQxhshBSABLQC4AUGiAUcNCCABIAEQhg4QkQkMCAsgASgCrAEiBEGAfnEhCgwFCyACQf8BcUECRw0FAkACQCAHKAIAIgJBC0cNACADQegGaiABEMQBDAELIAFBCzYCiAEgAyABKQKYATcD6AYgAyABKAKgATYC8AYgAUGMAWohBQJAIAEoAghBCkYNACABQQhqEMALCyABIAI2AgggASAFKQIANwIMIAEgBSgCCDYCFAsgASkDsAEhMCAEIAMpA+gGNwIAIAQgAygC8AY2AgggASAwNwOoAQJAIAEtALgBIghBA0YNACABQQxqIRYgAUEIaiESIAFBmAFqIRcgAUGMAWohGCADQYUHaiEZIANByAZqQQhqIRogA0G4AmpBCGohGyADQbgCakEMaiEQIANB6AZqQQxqIREDQCABKAKwASECIANB6AZqIAEQ7AogAygC8AYhCQJAAkAgAykD6AYiMEICUg0AQgIhMAwBCyAQIBEoAhA2AhAgECARKQIINwIIIBAgESkCADcCACADIAk2AsACIAMgMDcDuAICQAJAAkACQAJAAkACQAJAIDBCAVINACADIAMpA9ACNwPgBiADIAMpA8gCNwPYBiADIAMpA8ACNwPQBiADIAMpA7gCNwPIBkEAIRMMAQsgAykD0AIhMiADKALMAiEcIAMoAsgCIR0gAykDwAIhMwJAAkACQCAIQf8BcUGXAUcNACABKAKAAUGAwABxRQ0AIAMoAsQCIR4CQAJAIAEtALgBIh9BtX9qIghBH0sNAEEBIAh0QYGAgpB4cQ0BCyAfQbR/akH/AXFB1ABLDQELIANBuARqIAEQtggCQCADKQO4BCIwUEUNAEICITAgAygCwAQhCAwICyADQQA2AoAGIAMgAygCxAQiIDYC/AUgAyADKALABCIhNgL4BSADIDBCIIinIiI2AvQFIANBADoAhAYgAyAwpyIINgLwBQJAIB9B9QBHDQACQAJAIAEtALgBIiNBtX9qIh9BH0sNAEEBIB90QYGAgpB4cQ0BCyAjQbR/akH/AXFB1QBJDQAgDEUNCiADQaiBgIB4NgLoBiABIB0gHCADQegGahDuHQwKCyADQYAFaiABELYIIAMpA4AFIjBQDQYgA0EANgK4BiADIAMoAowFIh82ArQGIAMgAygCiAUiJDYCsAYgAyAwQiCIpyIlNgKsBiADQQA6ALwGIAMgMKciJjYCqAYCQCAjQfUARw0AAkACQCABLQC4ASInQbV/aiIjQR9LDQBBASAjdEGBgIKQeHENAQsgJ0G0f2pB/wFxQdQASw0BCyADQbgFaiABELYIAkAgAykDuAUiMEIAUg0AIAMoAsAFIQggA0GoBmoQoBwgA0HwBWoQoBwMCQsgMEIgiCExIDCnIQUgAygCxAUhKCADKALABSEpIAxFDQYgA0GogYCAeDYC6AYgASAdIBwgA0HoBmoQ7h0MBgsgA0HwBWoQoBxBACEUQgAhMCAeIQogHSENIBwhCyAyITRCACExICYhBSACIQ8gHCEOQQAhEyAlIRUgJCEpIB8hKEEAISoMCwsgDA0BDAILIAMgMjcD4AYgAyAcNgLcBiADIB02AtgGIAMgMzcD0AYgA0IANwPIBkEAIRMMAgsgA0GogYCAeDYC6AYgASAdIBwgA0HoBmoQ7h0LIBogAykDgAY3AxAgGiADKQP4BTcDCCAaIAMpA/AFNwMAIANCADcDyAZBASETIDNCA4NCAFINACAzpyIFIAUoAgAiCUF/ajYCAAJAIAlBAUcNACAFIAUoAhAQ8B4LIAMoArgCRQ0AIBsQsRILQgIhMQJAAkAgAS0AuAFB9QBHDQACQAJAIAcoAgAiBUELRw0AIANB6AZqIAEQxAEMAQsgB0ELNgIAIAMgFykCADcD6AYgAyAXKAIINgLwBgJAIBIoAgBBCkYNACASEMALCyASIAU2AgAgFiAYKQIANwIAIBYgGCgCCDYCCAsgASkDsAEhMCAEIAMpA+gGNwIAIAQgAygC8AY2AgggASAwNwOoASADQegGaiABEOwKIAMoAvAGIQUCQCADKQPoBiIxQgJSDQAgAygCyAYNAiADKQPQBiIwQgODQgBSDRIgMKciASABKAIAIgJBf2o2AgAgAkEBRw0SIAEgASgCEBDwHgwSCyADIBkvAAA7AcgBIAMgGS0AAjoAygEgAy0AhAchKyADKAKAByEsIAMoAvwGIS0gAygC+AYhLiADKAL0BiEvCyADIAMvAcgBOwG4ASADIAMtAMoBOgC6ASABKAKsASEOIAMpA+AGITQgAygC3AYhCyADKALYBiENIAMoAtQGIQogAygC0AYhCSADKQPIBiEwICshFCACIQ8gLyEVIC4hKSAtISggLCEqDAcLIBoQsRIMDwsgMachFSADKQOABiE0IANBqAZqEKAcQQAhFEEBIRNCACEwQgAhMUEAISoMBAsgAygCiAUhCCADQfAFahCgHAtCAiEwCyAKISIgDSEhIAshICAPIQIgDiEcDAELIAEoAqwBIRxBASETQgIhMUIAITAgAykDgAYhNAsCQCAzQgODQgBSDQAgM6ciCSAJKAIAIgpBf2o2AgACQCAKQQFHDQAgCSAJKAIQEPAeCyADKAK4AkUNACAbELESCyAIIQkgIiEKICEhDSAgIQsgAiEPIBwhDgsCQCAwQgJSDQAgCSEFDAkLIAMgAy0AugE6AOoGIAMgAy8BuAE7AegGAkAgAygC+AEiCCADKALwAUcNACADQfABahDIGgsgAygC9AEgCEHQAGxqIgIgFDoAPCACICo2AjggAiAoNgI0IAIgKTYCMCACIBU2AiwgAiAFNgIoIAIgMTcDICACIDQ3AxggAiALNgIUIAIgDTYCECACIAo2AgwgAiAJNgIIIAIgMDcDACACIAMvAegGOwA9IAIgAy0A6gY6AD8gAiATOgBIIAIgDjYCRCACIA82AkAgAyAIQQFqNgL4AQJAIAEtALgBIgJBB0YNACACQQNGDQIgASgCtAEhBCABKAKwASEFIANB2ARqIAIQyCUgA0GPAq1CIIZBrOSaAa2ENwO4AiADQegGakHNlYABIANBuAJqELIQIAMgAykC2AQ3AvQGIAMgAygC4AQ2AvwGIAUgBCADQegGahDGGyEFIAEtALgBQaIBRw0JIAEgARCGDhCRCQwJCwJAAkAgBygCACICQQtHDQAgA0HoBmogARDEAQwBCyAHQQs2AgAgAyAXKQIANwPoBiADIBcoAgg2AvAGAkAgEigCAEEKRg0AIBIQwAsLIBIgAjYCACAWIBgpAgA3AgAgFiAYKAIINgIICyABKQOwASEwIAQgAykD6AY3AgAgBCADKALwBjYCCCABIDA3A6gBIAEtALgBIghBA0cNAAsLAkACQCAHKAIAIgJBC0cNACADQegGaiABEMQBDAELIAFBCzYCiAEgAyABKQKYATcD6AYgAyABKAKgATYC8AYgAUGMAWohBQJAIAEoAghBCkYNACABQQhqEMALCyABIAI2AgggASAFKQIANwIMIAEgBSgCCDYCFAsgASkDsAEhMCAEIAMpA+gGNwIAIAQgAygC8AY2AgggASAwNwOoAQJAIAEtALgBIgJB/gBGDQAgAygC+AEiBUUNAyAFQdAAbCEKIAMoAvQBIQhBACECA0ACQAJAIAggAmoiBSkDACIwpyIJQX5qQQIgMEIBVhsiDUECRg0AAkACQCANDgIBAAELIAVBFGooAgAhCSAFQRBqKAIAIQ0CQCAFQQhqKQMAIjBCA4NCAFINACAwpyIFIAUoAgAiBUEBajYCACAFQX9MDQYLIANB7YCAgHg2AugGIAMgMDcD8AYgASANIAkgA0HoBmoQ7h0MAgsCQAJAIAVBCGooAgANACAFQRBqKQMAIjBCA4NCAFINASAwpyIJIAkoAgAiCUEBajYCACAJQX9KDQEMBgsgA0E4aiAFQRBqEJIUIANB6AZqIAMoAjggAygCPBDBCSADQegGahDXHiEwCyAFQSxqKAIAIQkgBUEoaigCACEFIANB7YCAgHg2AugGIAMgMDcD8AYgASAFIAkgA0HoBmoQ7h0MAQsCQCAJQQFxDQAgBUEIaiIJEJogRQ0BIAVBFGooAgAhDSAFQRBqKAIAIQUCQCAJKQMAIjBCA4NCAFINACAwpyIJIAkoAgAiCUEBajYCACAJQX9MDQULIANB7YCAgHg2AugGIAMgMDcD8AYgASAFIA0gA0HoBmoQ7h0MAQsgBUEUaigCACEJIAVBEGooAgAhBSADQfGAgIB4NgLoBiABIAUgCSADQegGahDuHQsgCiACQdAAaiICRg0DDAALCyADQegGaiABEIAEIAMoAuwGIgchBSADKALoBiINDQMMBgsACyABLQC4ASECC0EAIQ0CQCACQf8BcUEGRw0AAkACQCAHKAIAIgJBC0cNACADQegGaiABEMQBDAELIAFBCzYCiAEgAyABKQKYATcD6AYgAyABKAKgATYC8AYgAUGMAWohBQJAIAEoAghBCkYNACABQQhqEMALCyABIAI2AgggASAFKQIANwIMIAEgBSgCCDYCFAsgASkDsAEhMCAEIAMpA+gGNwIAIAQgAygC8AY2AgggASAwNwOoAQtBACEHCyABKAKsASIEQYB+cSEKC0ECIQkgAygC+AEhAiADKAL0ASEIIAMoAvABIQUgBiEODAYLIAEoArQBIQQgASgCsAEhBSADQaAEaiACEMglIANBjwKtQiCGQf70mgGthDcDuAIgA0HoBmpBzZWAASADQbgCahCyECADIAMpAqAENwL0BiADIAMoAqgENgL8BiAFIAQgA0HoBmoQxhshBSABLQC4AUGiAUcNACABIAEQhg4QkQkLIAMoAvQBIgEgAygC+AEQ5wggAygC8AEgARD5I0EJIQlBACEKQQAhBCAGIQ4MAwtBCSEJQQAhBAwBC0EAIQQLCwsgAygClAEiASADKAKYARDsHSADKAKQASABEP0jIAlBCUcNAQsgAEEKNgIAIAAgBTYCBAwECyADIAMpAaYFNwGGASADIAMpA6AFNwOAASAAIAs6ACEgACAMOgAgIAAgBzYCHCAAIA02AhggACAKIARB/wFxcjYCFCAAIA42AhAgACACNgIMIAAgCDYCCCAAIAU2AgQgACAJNgIAIAAgAykDgAE3ASIgACADKQGGATcBKCAAIA82AjQgACAGNgIwDAMLQezomgFB+QFB6OmaARDrGwALIAFBiAFqIQQgAUGwAWohByABKAKwASEIAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAKIASIJQQtHDQAgASkDCCEwIAFBCjYCCCADIAEpAxA3A4gDIAMgMDcDgAMgA0H4BmogARDEASABKQMIITAgAUEKNgIIIAMgASkDEDcD8AYgAyAwNwPoBiABQQhqIQUCQAJAIAEoAogBQQ5xQQpHDQAgBCADKQOABzcDGCAEIAMpA/gGNwMQIAQgAykD8AY3AwggBCADKQPoBjcDAAwBCyAEEMALIAQgAykD6AY3AwAgBCAD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CEEKRg0AIAkQwAsgBigCACEHCyABIAg2AgggASAFKALYAjYCuAEgASADKQIANwIMIAEgAygCCDYCFCABKQOwASEeIAEgBSkD0AI3ArABIAEgHjcDqAEgAUGwAWohCgJAAkAgB0ELRw0AIAVB0AJqIAEQxAEMAQsgAUEMaiELIAZBCzYCACAFIAFBmAFqIgYpAgA3A9ACIAUgBigCCDYC2AICQCAIQQpGDQAgCRDACwsgCSAHNgIAIAsgAykCADcCACALIAMoAgg2AggLIAEpA7ABIR4gCiAFKQPQAjcCACAKIAUoAtgCNgIIIAEgHjcDqAEgBUHgAWogASACQQEQsQEgBSgC5AEhAQJAIAUoAuABQQFxRQ0AIABBEzYCACAAIAE2AgQMAwsgACABNgIMIABBBjYCCCAAQRE2AgAMAgsgAS0AuAEhBgsgASgCeCEKQQEhCAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAZB/wFxQbR/ag4lAAkRFgwOCAEREQIRERERFQMLDRERERAREQQRBREXERQRDxESExELIApBgICAgAJxIQYCQAJAIAMNAEHMACEDIAYNAQwuCyAGRQ0rCyABQQE6AOABIApBBHFFDQUMKgsCQAJAIAEoAogBIgZBC0cNACAFQdACaiABEMQBDAELIAFBCzYCiAEgBSABKQKYATcD0AIgBSABKAKgATYC2AIgAUGMAWohAwJAIAEoAghBCkYNACABQQhqEMALCyABIAY2AgggASADKQIANwIMIAEgAygCCDYCFAsgASAFKALYAjYCuAEgASABKQOwATcDqAEgASAFKQPQAjcCsAEgARCHCSIGRQ0IIABBEzYCACAAIAY2AgQMLAsgAUGwAWohBiABKAKwASEIAkACQCABKAKIASICQQtHDQAgBUG4BGogARDEAQwBCyABQQs2AogBIAUgASkCmAE3A7gEIAUgASgCoAE2AsAEIAFBjAFqIQMCQCABKAIIQQpGDQAgAUEIahDACwsgASACNgIIIAEgAykCADcCDCABIAMoAgg2AhQLIAEpA7ABIR4gBiAFKQO4BDcCACAGIAUoAsAENgIIIAEgHjcDqAEgASAB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AkGAA2pBKGohDiACQbQDaiEaA0AgA0UNAiAEKQMAIR8gGkIANwIAIBpBADoACCAJQQA2AAAgCUEAOwAEIAJBADYCqAMgAkIENwKsAyACQgA3A5ADIAJCATcDiAMgAkIANwOgAyACQQA2AoADIAJBAzoAwwMgAiAOKQMANwOQASACIA4oAgg2ApgBIAJBgANqENYOIAEoAgQgDGoiAEEHNgIAIABBKGpCADcDACAAQRhqQgA3AwAgAEEQaiAfNwMAIABBCGpBADYCACAAQTBqIAIpA5ABNwMAIABBOGogAigCmAE2AgAgAEE8akIANwIAIABBwwBqQgA3AAAgAEHLAGpBAzoAACABIAEoAghBAWo2AgggDEHYAGohDCADQXBqIQMgBEEQaiEEIApBf2oiCg0ACyACIAQ2AoACCwJAIBIgBEcNACASIQQMAgsCQCASIARrQQR2IgAgASgCACATa00NACABIBMgAEEIQdgAENoaCyAAIBBqIQACQCAVQdgAbCIDRQ0AIAEoAgQiDCAAQdgAbGogDCAQQdgAbGogA/wKAAALIAIgADYC9AEgASgCCCIMIABPDQEgDEHYAGwhAyAAIAxrIQwgAkG9A2ohCiACQYADakEoaiEJIAJBtANqIQ4DQCAEIBJGDQEgBCkDACEfIA5CADcCACAOQQA6AAggCkEANgAAIApBADsABCACQQA2AqgDIAJCBDcCrAMgAkIANwOQAyACQgE3A4gDIAJCADcDoAMgAkEANgKAAyACQQM6AMMDIAIgCSkDADcDkAEgAiAJKAIINgKYASACQYADahDWDiABKAIEIANqIgBBBzYCACAAQShqQgA3AwAgAEEYakIANwMAIABBEGogHzcDACAAQQhqQQA2AgAgAEEwaiACKQOQATcDACAAQThqIAIoApgBNgIAIABBPGpCADcCACAAQcMAakIANwAAIABBywBqQQM6AAAgASABKAIIQQFqNgIIIANB2ABqIQMgBEEQaiEEIAxBf2oiDA0ACyACIAQ2AoACDAELIAIgEjYCgAIMAQsgAkGAA2ogEiAEa0EEdkEIQdgAEIUPIAIoAoQDIQACQCACKAKAA0EBRw0AIAAgAigCiAMQ/iAACyACQQA2ApgBIAIgAigCiAM2ApQBIAIgADYCkAEgAkGQAWogFBDaCCACKAKUASIQIAIoApgBIgNB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AgwhBCAGIAVGDQIgACABIAQgAi0AFCAGIAUQkQYMCgsgAigCDCEEAkACQCACLQAUDQAgA0G4A2ogARCOFwwBCyADQbgDaiABEI8XCyADKAK8AyECAkAgAygCuAMiBUEqRg0AIABBCGogA0G4A2pBCGpBOPwKAAAgACACNgIEIAAgBTYCAAwKCyADQbgDaiABIAQQSyADKALAAyEFIAMoArwDIQQCQCADKAK4AyIGQSpGDQAgAEEMaiADQbgDakEMakE0/AoAACAAIAU2AgggACAENgIEIAAgBjYCAAwKCyADQbgDaiABEMEYIAMoArwDIQYCQCADKAK4AyIKQSpGDQAgAEEIaiADQbgDakEIakE4/AoAACAAIAY2AgQgACAKNgIADAoLIANBuANqIAEgAiAEELgKAkAgAygCuAMiBEEqRg0AIABBBGogA0G4A2pBBHJBPPwKAAAgACAENgIADAoLIANBuANqIAEgAiAGELgKAkAgAygCuAMiBEEqRg0AIABBBGogA0G4A2pBBHJBPPwKAAAgACAENgIADAoLIANBuANqIAEgBSAGELgKAkAgAygCuAMiBEEqRg0AIABBBGogA0G4A2pBBHJBPPwKAAAgACAENgIADAoLIAAgBjYCCCAAIAI2AgQgAEEqNgIADAkLIAAgASACKAIMIAItABQgBhDEAgwICyADIAY2AsQDIANBADYCwAMgAyAENgK8AyADIAE2ArgDIAAgASADQbgDahCKBgwHCyAAIAEgAigCCCACKAIMIAIoAhAgAigCBBCoAwwGCyACKAIIIgQgAigCDCIFQRxsaiECAkACQAJAAkACQCABLQALQQFxDQAgBUUNAiADQbgDaiABIAQQSyADKALAAyEFIAMoArwDIQggAygCuAMhBiADQdAAaiADQcQDakE0/AoAACAEQRxqIQQMAQsgBUUNASADQbgDaiABIAJBZGoiAhBLIAMoAsADIQUgAygCvAMhCCADKAK4AyEGIANB0ABqIANBxANqQTT8CgAACyAGQVZqDgICAAELIANBuANqIAEQwRggAEEIaiEEIAMoArwDIQICQAJAIAMoArgDIgVBKkYNACAEIANBuANqQQhqQTj8CgAADAELIAQgAjYCAAsgACAFNgIAIAAgAjYCBAwHCyAAQQxqIANB0ABqQTT8CgAAIAAgBTYCCCAAIAg2AgQgACAGNgIADAYLIANBxANqIQcDQAJAAkACQAJAAkAgAS0AC0EBcQ0AIAQgAkYNAiADQbgDaiABIAQQSyADKALAAyEJIAMoArwDIQogAygCuAMhBiADQYQBaiAHQTT8CgAAIARBHGohBAwBCyAEIAJGDQEgA0G4A2ogASACQWRqIgIQSyADKALAAyEJIAMoArwDIQogAygCuAMhBiADQYQBaiAHQTT8CgAACyAGQSpGDQIgBkErRw0BCyAAIAU2AgggACAINgIEIABBKjYCAAwICyAAQQxqIANBhAFqQTT8CgAAIAAgCTYCCCAAIAo2AgQgACAGNgIADAcLIANBuANqIAEgBSAKELgKAkAgAygCuAMiBUEqRg0AIABBBGogA0G4A2pBBHJBPPwKAAAgACAFNgIADAcLIAkhBQwACwsCQAJAAkACQCACKAIMIgpFDQAgAigCCCIGIApBHGwiCWohC0EAIQQgBiECIAohBQNAIAQgAigCAEEBRmohBCACQRxqIQIgBUF/aiIFDQALAkAgBEECSQ0AIAQgCk8NBAsgA0G4A2ogASAGEEsgAygCwAMhBSADKAK8AyEEIAMoArgDIQIgA0HAAmogA0G4A2pBDGpBNPwKAAAgAkFWag4CAgABCyAAIAEQ4hAMBwsgAEEMaiADQcACakE0/AoAACAAIAU2AgggACAENgIEIAAgAjYCAAwGCwJAAkACQCAKQQFGDQAgA0G4A2ogASAGQRxqEEsgAygCwAMhCCADKAK8AyEHIAMoArgDIQIgA0EQaiADQbgDakEMakE0/AoAACACQVZqDgICAAELIAAgBTYCCCAAIAQ2AgQgAEEqNgIADAcLIABBDGogA0EQakE0/AoAACAAIAg2AgggACAHNgIEIAAgAjYCAAwGCyADQbgDaiABEI8XIAMoArwDIQICQCADKAK4AyIMQSpGDQAgAEEIaiADQbgDakEIakE4/AoAACAAIAI2AgQgACAMNgIADAYLIANBuANqIAEQwRggAygCvAMhDAJAIAMoArgDIg1BKkYNACAAQQhqIANBuANqQQhqQTj8CgAAIAAgDDYCBCAAIA02AgAMBgsgA0G4A2ogASACIAQQuAoCQCADKAK4AyIEQSpGDQAgAEEEaiADQbgDakEEckE8/AoAACAAIAQ2AgAMBgsgA0G4A2ogASAFIAwQuAoC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AAwJCwsCQCAkDQBBASEnDAgLIANBuANqICUgGiAkEKwSAkAgAygC2AEiAiADKALQAUcNACADQdABahCnGgsgAygC1AEgAkEEdGoiBCADKQK4AzcCACAEIAMpAsADNwIIQQEhJyADIAJBAWoiAjYC2AEMCAsgFSADQdABaiAaICQQ1RIhAiAIKAIAIAcoAgAgIyAfICEgICACELgOIAcoAgAhAgsgHyACSQ0ACyAfIAJBuOCEARD+FgALIAIgBkHo14QBEP4WAAsgHyACQbjghAEQ/hYAC0HY4IQBQSRB/OCEARC5IQALQQAgCUEEQaDohAEQkAoACyADKALYASECCyACDQALIAEoAqwBIBsoAgBBBEEQENcTIBcgAygC2AE2AgggFyADKQPQATcCAAwACwsgAygCwAIgAygCxAJBBEEIENcTDAALC0HM8IQBEIUeAAsCQAJAIAEoAiANACABQX82AiACQCABKAJgDQAgAUF/NgJgIANBuANqIAFBJGogAUHkAGoQpgggAyADKQK8AzcD+AIgAyADKALEAzYCgAMCQCADKAK4AyICQSpGDQAgAEEQaiADQbgDakEQakEw/AoAACAAIAMoAoADNgIMIAAgAykD+AI3AgQgACACNgIADAMLIAMgAykD+AI3AxAgAyADKAKAAzYCGAJAIAEoArgBDQAgAUEANgLEASABQX82ArgBAkAgASgCyAENACABQbwBaiEPIAFBADYC1AEgAUF/NgLIAQJAIAEoArwBDQAgDxCZGgsgAUHMAWohDSABKALAAUIBNwIAIAFBkAFqIgwoAgAhBiABQYwBaiEIQQEhAgJAA0AgASACQX9qIgI2AsQBAkACQCABKALAASACQQN0aiICKAIAIgUgBk8NACACKAIEIgIgCCgCACAFQQxsaiIEKAIITw0BA0AgBCgCBCACQQN0aiIELQAFIQogBC0ABCEJAkAgASgC1AEiBiABKALMAUcNACANEKkaCyABKALQASAGQQF0aiIHIAo6AAEgByAJOgAAIAEgBkEBaiIGNgLUAQJAAkAgBCgCAEUNAAJAIAEoAsQBIgYgASgCvAFHDQAgDxCZGgsgASgCwAEgBkEDdGoiCiACQQFqNgIEIAogBTYCACABIAZBAWo2AsQBIAQoAgAhBUEAIQIMAQsgA0G4A2ogA0EQaiABKALQASAGEI8HAkAgAygCuAMiBEEqRg0AIANB+AJqIANBuANqQQRyQTz8CgAADAYLAkAgASgC1AEiBEUNACABIARBf2o2AtQBCyACQQFqIQILIAUgDCgCACIGTw0BIAIgCCgCACAFQQxsaiIEKAIITw0CDAALCyAFIAZBuOCEARD+FgALAkAgASgC1AEiAkUNACABIAJBf2o2AtQBCyABKALEASICDQALQSohBAsgASABKALIAUEBajYCyAEgASABKAK4AUEBajYCuAECQCAEQSpGDQAgAEEEaiADQfgCakE8/AoAACAAIAQ2AgAMBQsgACADQRBqENcKIAEgASgCYEEBajYCYCABIAEoAiBBAWo2AiAgASABKAKEAUEBajYChAEMCwtB3NCEARCFHgALQczQhAEQhR4AC0Hs8IQBEIUeAAtB3PCEARCFHgALIAEgASgCYEEBajYCYCABIAEoAiBBAWo2AiAgASABKAKEAUEBajYChAEMBgsCQAJAAkAgASgC2AENACABQX82AtgBIAFB3AFqIQIgASgC5AFFDQEgASABLwHsAUEBaiIEOwHsASAEQf//A3EgBEYNAiADQQA2AsADIANCADcDuAMgA0EAOwHEAyADQfgCaiADQbgDaiABKALoARDpCyABKALcASABQeABaigCAEEEQRAQ1xMgAiADKAKAAzYCCCACIAMpAvgCNwIADAILQbzxhAEQhR4ACyADQQA2AsADIANCADcDuAMgA0EAOwHEAyADQfgCaiADQbgDaiABKALoARDpCyABKALcASABQeABaigCAEEEQRAQ1xMgAiADKAKAAzYCCCACIAMpAvgCNwIACyADQbgDaiABEI8XIAMoArwDIQwCQAJAIAMoArgDIgJBKkYNACAAQQhqIANBuANqQQhqQTj8CgAAIAAgDDYCBCAAIAI2AgAMAQsgA0G4A2ogARDBGCADKAK8AyENAkAgAygCuAMiAkEqRg0AIABBCGogA0G4A2pBCGpBOPwKAAAgACANNgIEIAAgAjYCAAwBCyADQRBqQQFqIQ8CQAJAA0AgESASRg0CIANB+AJqIBEoAgAgESgCBBCHHSARQQhqIREDQCADQcACaiADQfgCahCFAwJAAkACQAJAAkAgAy0AwAJBBEYNACADIAMtAMgCOgAYIAMgAykAwAIiMTcDECAPIDGnQQF0Qf4BcWohCCANIQQgDyECA0AgASgC5AEiBUUNAiAFIAStIjFCpcaIocicp/lLhUKzg4CAgCB+IAItAAAiCq1C/wGDIjOFQrODgICAIH4gAkEBai0AACIJrUL/AYMiMoVCs4OAgIAgfiAFrYKnIgZNDQMCQAJAIAEoAuABIAZBBHQiB2oiBS8BDCABLwHsAUcNACAKQf8BcSAFLQAERw0AIAlB/wFxIAUtAAVHDQAgBCAFKAIARw0AIAUoAgghBAwBCyADQbgDaiABIAogCRDJDiADKALAAyEKIAMoArwDIQUCQCADKAK4AyIJQSpGDQAgAEEMaiADQbgDakEMakE0/AoAACAAIAo2AgggACAFNgIEIAAgCTYCAAwKCyADQbgDaiABIAogBBC4CgJAIAMoArgDIgRBKkYNACAAQQRqIANBuANqQQRyQTz8CgAAIAAgBDYCAAwKCyABKALkASIEIAZNDQUgASgC4AEgB2oiBCABLwHsATsBDCAEIAU2AgggBCAzQiCGIDJCKIaEIDGENwIAIAUhBAsgAiAIRiEFIAJBAmohAiAFDQUMAAsLIAMoAvgCIAMoAvwCQQRBCBDXEwwFC0HwhYUBEL0jAAsgBiAFQdCFhQEQ/hYACyAGIARB4IWFARD+FgALIANBuANqIAEgDCAEELgKIAMoArgDIgJBKkYNAAsLIABBBGogA0G4A2pBBHJBPPwKAAAgACACNgIACyADKAL4AiADKAL8AkEEQQgQ1xMMAQsgACANNgIIIAAgDDYCBCAAQSo2AgALIAEgASgC2AFBAWo2AtgBDAULIAEgASgCYEEBajYCYCABIAEoAiBBAWo2AiAMBAsgA0G4A2ogARDBGCADKAK8AyEJAkAgAygCuAMiBEEqRg0AIABBCGogA0G4A2pBCGpBOPwKAAAgACAJNgIEIAAgBDYCAAwEC0EAIQUgA0G4A2ogAigCECIGQQBBBEEIEMIPIAMoArwDIQQCQCADKAK4A0EBRg0AIANBADYCwAEgAyADKALAAyIKNgK8ASADIAQ2ArgBIAZBAXQhBCAJrSEyIAIoAgwhAkEAIQYCQANAIARFDQEgAjEAASExIAIxAAAhMwJAIAYgAygCuAFHDQAgA0G4AWoQmRogAygCvAEhCgsgAkECaiECIAogBWogM0IghiAyhCAxQiiGhDcCACADIAZBAWoiBjYCwAEgBEF+aiEEIAVBCGohBQwACwsgA0G4A2ogASADQbgBahC3FSADKAK8AyECAkAgAygCuAMiBEEqRg0AIABBCGogA0G4A2pBCGpBOPwKAAAgACACNgIEIAAgBDYCAAwFCyAAIAk2AgggACACNgIEIABBKjYCAAwECyAEIAMoAsADEP4gAAsgACAFNgIIIAAgBzYCBCAAQSo2AgAMAgsCQAJAAkACQCABKAIgDQAgAUF/NgIgIANCADcC+AIgA0G4A2ogAUEkaiIMIANB+AJqELINIAMoArwDIQgCQCADKAK4AyICQSpGDQAgAEEIaiADQbgDakEIakE4/AoAACAAIAg2AgQgACACNgIAIAMoAsgCIQQgAygCxAIhCgwECyADQQA2AvQBIANCgICAgMAANwLsAQJAIAMoAsgCIgRFDQAgA0H4AWogAygCxAIiChCRDiADQRBqQQRqIQ0gA0H4AWpBGGohByADQfgBakEEaiEOIAitITMgA0GEAmohCUEEIRBBACEPA0ACQCADKAKoAiICIAMoAqwCRg0AIAMgAkEIajYCqAICQCACKAIAIgUgBE8NACACMQAEITEgAygChAIhBiADKAKMAiECAkAgCiAFQRhsaiIFKAIIRQ0AAkAgAiAGRw0AIAkQmRoLIAMoAogCIAJBA3RqIDFCKIYgMUIghoQ3AgAgAyACQQFqNgKMAgJAIA8gAygC7AFHDQAgA0HsAWoQqhogAygC8AEhEAsgECAPQThsaiADQfgBakE4/AoAACADIA9BAWoiDzYC9AEgA0H4AWogBRCRDgwDCwJAIAIgBkcNACAJEJkaCyADKAKIAiACQQN0aiAxQiCGIDOEIDFCKIaENwIAIAMgAkEBajYCjAIMAgsgBSAEQezhhAEQ/hYACwJAAkACQAJAAkACQCADKAKMAg4CAwEACyANIAkoAgg2AgggDSAJKQIANwIAIANBADYCjAIgA0KAgICAwAA3AoQCIANBAjYCECADQbgDaiAMIANBEGoQsg0gAygCvAMhBSADKAK4AyICQSpGDQEgAEEIaiADQbgDakEIakE4/AoAAAwDCyADQQA2AowCIAMoAogCKQIAITEgA0EBNgIQIAMgMTcCFCADQbgDaiAMIANBEGoQsg0gAygCvAMhBSADKAK4AyICQSpGDQAgAEEIaiADQbgDakEIakE4/AoAAAwCCwJA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IzYCdCACIBk2AnAgAiAiNgJsIAIgHjYCaCACICE2AmQgAiAfNgJgIAIgHDYCXCACIB02AlggAiAJOgCpASACIBI2AqQBIAIgCkEBdDoAoQEgAkECIA1rOgCiASACQQIgD2s6AJ4BIAJBAiAQazoAnQEgAiAROgCjASACQQIgDms6AJ8BIAJBAiAMazoAoAEgAkEBOgCcASACICc2ArABIAIgAzYCrAEgAkEANgK8ASACQoCAgIDAADcCtAEgAkEANgLIASACQoCAgIDAADcCwAEgAkIBNwLIAiACQoCAgIAQNwLAAiACQgE3ArgCIAJCADcCsAIgAkIENwKoAiACQgA3AqACIAJCBDcCmAIgAkIANwKQAiACQgQ3AogCIAJCADcCgAIgAkIENwL4ASACQgA3AvABIAIgAi0AqgE6ANcCIAIgAi0AqAEiAToA1gIgAiACLQCpAToA1QIgAiACKAKkATYC0AIgAiABOgDUAiACQoCAgIBwNwL8ASACQoCAgIBwNwKMAiACKAKsASEDIAIgAigCsAEiDjYC5AIgAiADNgLgAiACQoGAgIAQNwLEAiACIAE6ANQCIAJBADYC8AEgAkEANgKcAiACQQA2AoACIAJBADYCkAIgAiACQfABajYC3AIgAkEBNgK4AyACIAIpAsACIjw3ArwDIAJBATYCxAMgAiA8NwKYAyACQQA2ApQDIAJCgICAgMAANwKMAyACIAIpA7gDNwKgAyACIAIpA8ADNwKoAyACQbADakEYaiEBIAJBsANqQShqIRIgAkH4AmohFSACQbADakEcaiEXIAJBjANqQRRqIQkgAkG8A2ohKCACQbgDaiEpIAJBsANqQcQAaiEaQQQhCkEAIQQDQCACQdwCahDwBAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAigCwAIgDkYNAAJAAkACQAJAAkACQAJAAkACQAJAIAJB3AJqEJ0KIgNBWGoOBAECBgcACwJAIANBhX9qDgIIAwALIANBP0YNBCADQdsARg0DAkACQAJAAkACQCACQdwCahCdCiIDQaR/ag4DBAECAAsgA0EkRg0CIANBLkYNDAsgKCACQdwCahCQDiACQdwCahCkCRogAkEAOgDUAyACIAM2ArgDQYKAgIB4IQMgAkGCgICAeDYCtAMMGAsgKSACQdwCahCQDiACQdwC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IBIoAhA2AhAgFSASKQIINwIIIBUgEikCADcCACACIAIpA4gFNwPoAiACIAIpA5AFNwPwAgwDCyAJIAIpA4gFNwIAIAkgAikDkAU3AggMCwsgKSACQdwCahCQDiACQdwCahCkCRpBhICAgHghAwwMCyACQbwFaiACQYwDakEk/AoAACACQbADaiACQdwCaiACQbwFahDRBSACKAK4AyEKIAIoArQDIQMgAigCsAMiDUEiRg0BIAIoAsQDIQsgAigCwAMhDCACKAK8AyEEIAJB6AJqIAFBJPwKAAALIAIoAuwDIRAMBgsgAiAKNgKMBSACIAM2AogFIAJBsANqIAJB3AJqIAJBiAVqENICAkAgAigCsAMiDUEiRg0AIAIoAsQDIQsgAigCwAMhDCACKAK8AyEEIAIoArgDIQogAigCtAMhAyACQegCaiABQST8CgAAIAIoAuwDIRAgAkGIBWoQjwQMBgsgAigC8AENAyACKAL8ASELIAJBADYC/AEgAigC+AEhDCACKAL0ASEEIAJCgICAgMAANwL0AQwCCyACQegCaiACQbwFakEk/AoAACAqIQogGyEECyACQYwDahCcGyANQSJHDQMLAkAgC0UNACAMIQEDQCABKAIAIAFBBGooAgBBAUEBEN0TIAFBJGohASALQX9qIgsNAAsLIAQgDEEEQSQQ3RMgAkHwAWoQ6woCQCACKAK8ASIEIAIoArQBRw0AIAJBtAFqEJ8aCyACKAK4ASIBIARBA3RqIgkgCjYCBCAJIAM2AgAgAiAEQQFqIgM2ArwBIAEgA0EDdGohGyACQbADakEEaiEMIAJB8AFqQRRqISogAkGwA2pBFGohKCACQbwFakEMaiEOIAJB2ARqQRBqIRUgAkHwAWpBBGohGkEAIRJBACEXA0AgAkH8BGohAwJAAkACQAJAAkACQCASQQhHDQBBCCESIAEhFkEAIQEMAQsgFw0BIBJBCGohBEEBIRcCQCABIBtHDQAgBCESIBshFkEAIQEMAQsgAiACQawBaiASajYC/AQgAUEIaiEWIAJB3AJqIQMgBCESCyADIAE2AgAgAigC/AQiAUUNASACKALcAiENIBUgJS8ABDsABCAVICUoAAA2AAAgAkEBOgDvBCACQgQ3AuAEIAJCADcC2AQgAiAROgDuBCACIAEpAgA3AowFIAIgAkHYBGo2AogF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EGooAgAhCiABQQxqKAIAIQsgASgCACEDIAkOBAUFAgEFCyAEQX9qIQEMBgsgCg0BDAMLIApFDQIMAQsgAkEPNgKwAyACQdgEaiACQbADahCdEgsgASALNgIIIAEgCTYCBCABIAM2AgAgASAKQX9qNgIQIAEgC0EIajYCDAwICyACQbADaiACQYgFaiADKAIAIANBBGooAgAQcSACKAKwAyIDQYCAgIB4Rw0DIAFBbGohASAEQX9qIgQNAAtBACEBCyACIAE2AsQFCwJAIAIoAtgEIgFB/////wdPDQAgAiACKALkBCIDNgKMAyACIAFBAWo2AtgEAkACQCADQQFHDQAgAiABNgLYBCACQbADaiACQdgEahDtEiACKAKwA0EQRw0BQczElwEQxCMAC0EAIAJBjANqQdTgmgFBACACQdzElwEQtxwACyACIAIoAsgDNgLABCACIAIpAsADNwO4BCACIAIpArgDNwOwBCACIAIpArADNwOoBCAaIAJBqARqEMQMQQEhAUGAgICAeCEDDAoLQbzElwEQhh4ACyAaIAxBJPwKAABBACEBDAgLIAFBf2ohASADKAIEIgNBCGohBEEDIQkLIAGtQiCGIASthCE8IAMhCwsCQCACKALEBSIEIAIoArwFRw0AIAJBvAVqEKEaCyACKALABSAEQRRsaiIBIDw3AgwgASADNgIIIAEgCTYCBCABIA02AgAgBEEBaiEECyACIAQ2AsQFIAshDQwACwtBwOqEARDEIwALIAItAJQBISsgAi0AkwEhLCACLQCSASEtIAIoAsgBIQkgAigCxAEhAQJAIAVBAUsNACAGIAYoAgAiA0EBajYCACADQX9MDQ0LIAItAJkBIS4gAi0AmAEhLyACLQCXASEwIAItAJYBITEgAi0AlQEhMkEAITMgAkGwA2ogCUEAQQRBBBDCDyACKAK0AyE0AkAgAigCsANBAUYNACACKAK4AyE1AkAgCUUNACA1IQMgCSEEA0AgAyABNgIAIANBBGohAyABQRxqIQEgBEF/aiIEDQALIAkhMwtBACEVIAJBADYC6AUgAkKAgICAwAA3AuAFAkACQCAzDQBBASE2QQQhN0EAIQtBACE4QQQhEkEAISoMAQsgM0ECdCELQQAhBEEEIQpBACEJA0AgNSAEaigCACEDEP8gIgEgAygCGCIDLQAyOgAyIAEg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ahD2ByACQYwDaiACQfABahDHAiACQfABahC2FSACQfIANgL0ASACIAJBjANqNgLwAQJAIAJBiAVqQZTPhAFBzZWAASACQfABahDNBg0AIAJB8wA2AvQBIAIgDjYC8AEgAkGIBWpBlM+EAUHxkYABIAJB8AFqEM0GDQAgAigCjAMgAigCkANBAUEBEN0TDA4LIAIoAowDIAIoApADQQFBARDdEwwKCyACQoCAgIAQNwLwASACQQA2AvgBIAJB8AFqQf4AQc8AEOIRIAIgAigC+AE2AjggAiACKQLwATcDMCACQYgFakETEJUfIAIoAowFIAIoApAFIgNqIgFBACkAnMWXATcAACABQQApAKTFlwE3AAggAUEAKACrxZcBNgAPIAIgA0ETajYCkAUgAkHyADYC9AEgAiACQTBqNgLwASACQYgFakGUz4QBQZy2gQEgAkHwAWoQzQZFDQcMCAsgAigC3AMhAyACKALYAyEEAkAgDUERSw0AQQEgDXRBgMAJcUUNACACQbwDaiEBCyACIAE2AugEIAIgDDYC4AQgAiADNgLcBCACIAQ2AtgEIAIgAkHgA2o2AuQEIAJBqARqIAJB2ARqEPYHIAJB4ARqIQ4gAigC2AQhAQJAAkACQCACKALcBCIDQQdLDQAgA0UNAQNAIAEtAABBCkYNAyABQQFqIQEgA0F/aiIDDQAMAgsLIAJBCGpBCiABIAMQmwogAigCCEEBRg0BCyACQYgFakETEJUfIAIoAowFIAIoApAFIgNqIgFBACkAnMWXATcAACABQQApAKTFlwE3AAggAUEAKACrxZcBNgAPIAIgA0ETajYCkAUgAkHwAWogAkHYBGoQ9gcgAkGMA2ogAkHwAWoQxwIgAkHwAWoQthUgAkHyADYC9AEgAiACQYwDajYC8AECQCACQYgFakGUz4QBQc2VgAEgAkHwAWoQzQYNACACQfQANgL0ASACIA42AvABIAJBiAVqQZTPhAFB8ZGAASACQfABahDNBg0AIAIoAowDIAIoApADQQFBARDdEwwHCyACKAKMAyACKAKQA0EBQQEQ3RMMBAsgAkKAgICAEDcC8AEgAkEANgL4ASACQfABakH+AEHPABDiESACIAIoAvgBNgI4IAIgAikC8AE3AzAgAkGIBWpBExCVHyACKAKMBSACKAKQBSIDaiIBQQApAJzFlwE3AAAgAUEAKQCkxZcBNwAIIAFBACgAq8WXATYADyACIANBE2o2ApAFIAJB8gA2AvQBIAIgAkEwajYC8AEgAkGIBWpBlM+EAUGctoEBIAJB8AFqEM0GRQ0BDAILIAJCgICAgBA3AvABIAJBADYC+AEgAkHwAWpBEhCVHyAPIAIpAvABNwIAIAIoAvQBIAIoAvgBIgNqIgFBACkArJaFATcAACABQQApALSWhQE3AAggAUEALwC8loUBOwAQIA8gA0ESajYCCAwMCyACQcwBaiACQagEahDHAiACQfIANgL0ASACIAJBzAFqNgLwAQJAIAJBiAVqQZTPhAFBzZWAASACQfABahDNBg0AIAJB8gA2AvQBIAIgAkEwajYC8AEgAkGIBWpBlM+EAUGctoEBIAJB8AFqEM0GDQACQCACKAK8BCIDRQ0AQQAhBCACQQA2AvACIAJCgICAgMAANwLoAiACKAK4BCIJQRBqIQEgCUEUaiEJIANBGGwhCkEEIQ1BACEDA0AgAiAJKAIAQX9qNgL8BCACQQc2AowCIAJBBzYChAIgAkEHNgL8ASACQQc2AvQBIAIgATYCgAIgAiABQXhqNgL4ASACIAFBdGo2AvABIAIgAkH8BGo2AogCIAJBjANqQd+xgQEgAkHwAWoQzggCQCADIAIoAugCRw0AIAJB6AJqEKQaIAIoAuwCIQ0LIA0gBGoiCyACKAKUAzYCCCALIAIpAowDNwIAIAIgA0EBaiIDNgLwAiABQRhqIQEgCUEYaiEJIARBDGohBCAKQWhqIgoNAAsgAkHwAWogAigC7AIgA0Gi8poBQQEQvQYgAkHyADYCkAMgAiACQfABajYCjAMgAkGIBWpBlM+EAUGctoEBIAJBjANqEM0GIQEgAigC8AEgAigC9AFBAUEBEN0TIAJB6AJqEJ4YIAENAQsgAkH0ADYC9AEgAiAONgLwASACQYgFakGUz4QBQfGRgAEgAkHwAWoQzQZFDQMLIAIoAswBIAIoAtABQQFBARDdEwsgAigCMCACKAI0QQFBARDdEwsgAkGoBGoQthUMBQsgAigCzAEgAigC0AFBAUEBEN0TIAIoAjAgAigCNEEBQQEQ3RMLIAJBqARqELYVDAYLIAJBzAFqIAJBqARqEMcCIAJB8gA2AvQBIAIgAkHMAWo2AvABAkAgAkGIBWpBlM+EAUHNlYABIAJB8AFqEM0GDQAgAkHyADYC9AEgAiACQTBqNgLwASACQYgFakGUz4QBQZy2gQEgAkHwAWoQzQYNAAJAIAIoArwEIgNFDQBBACEEIAJBADYC8AIgAkKAgICAwAA3AugCIAIoArgEIglBEGohASAJQRRqIQkgA0EYbCEKQQQhDUEAIQMDQCACIAkoAgBBf2o2AvwEIAJBBzYCjAIgAkEHNgKEAiACQQc2AvwBIAJBBzYC9AEgAiABNgKAAiACIAFBeGo2AvgBIAIgAUF0ajYC8AEgAiACQfwEajYCiAIgAkGMA2pB37GBASACQfABahDOCAJAIAMgAigC6AJHDQAgAkHoAmoQpBogAigC7AIhDQsgDSAEaiILIAIoApQDNgIIIAsgAikCjAM3AgAgAiADQQFqIgM2AvACIAFBGGohASAJQRhqIQkgBEEMaiEEIApBaGoiCg0ACyACQfABaiACKALsAiADQaLymgFBARC9BiACQfIANgKQAyACIAJB8AFqNgKMAyACQYgFakGUz4QBQZy2gQEgAkGMA2oQzQYhASACKALwASACKAL0AUEBQQEQ3RMgAkHoAmoQnhggAQ0BCyACQfMANgL0ASACIA42AvABIAJBiAVqQZTPhAFB8ZGAASACQfABahDNBkUNBAsgAigCzAEgAigC0AFBAUEBEN0TCyACKAIwIAIoAjRBAUEBEN0TCyACQagEahC2FQtBuZWbAUE3IAJB7wVqQazPhAFB8JWbARDdFAALIAIoAswBIAIoAtABQQFBARDdEyACKAIwIAIoAjRBAUEBEN0TCyACQagEahC2FQsgDyACKAKQBTYCCCAPIAIpAogFNwIACwJAAkAgAigCsANFDQACQEEAIAIoArgDIgFBXmoiAyADIAFLGw4CAQACCyACKALAA0GEgICAeEgNASACQcADahDeIwwBCyAMEIIhCyAAQQA2AgALIAJB2ABqEJobIAJB8AVqJAAPCyACIAs2ApwDIAIgDDYCmAMgAiAENgKUAyACIAo2ApADIAIgAzYCjAMMAwtBg4CAgHghAyACQYOAgIB4NgK0AwsgAigCxAMhCiACKALAAyEMIAIoArwDIQ0gAigCuAMhDyACQZgFaiABQST8CgAAAkACQAJAAkACQAJAAkAgA0GCgICAeEkNAAJAAkACQAJAIANB/v///wdqDgUAAQIDBAALQSAQigEiC0UNBSALIAo2AgwgCyAMNgIIIAsgDTYCBCALIA82AgAgCyACKQOYBTcCECALIAIpA6AFNwIYQQIhAwwEC0EcEIoBIgtFDQUgCyAKNgIMIAsgDDYCCCALIA02AgQgCyAPNgIAIAsgAikDmAU3AhAgCyACKAKgBTYCGEEEIQMMAwtBGBCKASILRQ0FIAsgCjYCDCALIAw2AgggCyANNgIEIAsgDzYCACALIAIpA5gFNwIQQQMhAwwCC0EcEIoBIgtFDQUgCyAKNgIMIAsgDDYCCCALIA02AgQgCyAPNgIAIAsgAikDmAU3AhAgCyACKAKgBTYCGEEGIQMMAQtBOBCKASILRQ0FIAsgCjYCECALIAw2AgwgCyANNgIIIAsgDzYCBCALIAM2AgAgC0EUaiACQZgFakEk/AoAAEEFIQMLAkAgBCACKAKMA0cNACACQYwDahCfGgsgAigCkAMiCiAEQQN0aiIMIAs2AgQgDCADNgIADAULQQRBIBCiJAALQQRBHBCiJAALQQRBGBCiJAALQQRBHBCiJAALQQRBOBCiJAALIAIgBEEBaiIENgKUAwwACwsAC4teAiR/BX4jAEHgAmsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCACIDQXRqQQcgA0ELSxsOJgQAAQIDBgcICQoLDA0ODxAREhMUFRYXGEMZGhtNTEtKSUhHRkVEBAsgASgCCCEEIAEoAhQhBSABKAIQIQYgAkHAAWogASgCDCIHQQRBEBCFDyACKALEASEIIAIoAsABQQFGDUEgAigCyAEhCQJAIAhFDQAgB0EEdCEKIAkhAyAIIQsDQCAKRQ0BQQIhDAJAIAQoAgBBAkYNAEHAABCKASIBRQ1DIAJBwAFqIARBDGooAgAQTiABIAIpA/gBNwM4IAEgAikD8AE3AzAgASACKQPoATcDKCABIAIpA+ABNwMgIAEgAikD2AE3AxggASACKQPQATcDECABIAIpA8gBNwMIIAEgAikDwAE3AwAgBEEEaikCACEmIAQoAgAhDAsgBEEQaiEEIAMgDDYCACADQQxqIAE2AgAgA0EEaiAmNwIAIANBEGohAyAKQXBqIQogC0F/aiILDQALCyAAIAU2AhQgACAGNgIQIAAgBzYCDCAAIAk2AgggACAINgIEIABBDTYCAAxQCyABKAIIIQQgASgCFCENIAEoAhAhDiACQcABaiABKAIMIgVBBEEMEIUPIAIoAsQBIQkgAigCwAFBAUYNPiACKALIASEGAkAgCUUNACAFQQxsIQogBiEDIAkhCwNAIApFDQECQAJAIAQoAgAiBw0AQfAAEIoBIgxFDUEgAkHAAWogBEEEaigCABDbAiAMIAJBwAFqQfAA/AoAAEEAIQEMAQsgBEEIaigCACEIIARBBGooAgAhDEHAABCKASIBRQ0/IAJBwAFqIAcQTiABIAIpA/gBNwM4IAEgAikD8AE3AzAgASACKQPoATcDKCABIAIpA+ABNwMgIAEgAikD2AE3AxggASACKQPQATcDECABIAIpA8gBNwMIIAEgAikDwAE3AwALIARBDGohBCADIAE2AgAgA0EIaiAINgIAIANBBGogDDYCACADQQxqIQMgCkF0aiEKIAtBf2oiCw0ACwsgACANNgIUIAAgDjYCECAAIAU2AgwgACAGNgIIIAAgCTYCBCAAQQ42AgAMTwsCQAJAIAEtABwiBEECRw0ADAELIAEoAhghCyABKAIUIQwgASgCECEKIAEpAwgiJkIDg0IAUg0AICanIgMgAygCACIDQQFqNgIAIANBf0wNTgtByAAQigEiA0UNOiADIAEoAiAQjAMgACADNgIgIAAgBDoAHCAAIAs2AhggACAMNgIUIAAgCjYCECAAICY3AwggAEEPNgIADE4LIAEtABAhBCABKAIMIQogASgCCCEMQcAAEIoBIgMNAUEIQcAAEKIkAAsgACABKQM4NwM4IAAgASkDMDcDMCAAIAEpAyg3AyggACABKQMgNwMgIAAgASkDGDcDGCAAIAEpAxA3AxAgACABKQMINwMIIAAgASkDADcDAAxMCyADIAEoAgQQTiAAIAQ6ABAgACAKNgIMIAAgDDYCCCAAIAM2AgQgAEEQNgIADEsLIAEtABEhBCABLQAQIQogASgCCCEMIAEoAgQhC0HAABCKASIDRQ01IAMgASgCDBBOIAAgBDoAESAAIAo6ABAgACADNgIMIAAgDDYCCCAAIAs2AgQgAEERNgIADEoLIAEtABQhCiABKAIQIQwgASgCDCELQcAAEIoBIgNFDTMgAyABKAIEEE5BwAAQigEiBEUNMiAEIAEoAggQTiAAIAo6ABQgACAMNgIQIAAgCzYCDCAAIAQ2AgggACADNgIEIABBEjYCAAxJCyABLQA8IQogASgCNCEMIAEoAjAhCwJAAkAgA0ELRw0AIAFBCGohCAJAAkACQAJAAkACQCABKAIEIg8OAwABAgALIAEoAhghBSABKAIUIQQgAkHAAWogCBDmCSABLQAgIQYgASgCHA0CQQAhDQwDCyACQcABaiAIEMMNIAIpAsgBIiZCIIinIQQgAigC2AEhBiACKALUASENIAIoAtABIQUgAigCxAEhDiACKALAASEQICanIREMAwsgASkDECImQiCIpyEEIAEoAiAhBiABKAIcIQ0gASgCGCEFIAEoAgwhDiABKAIIIRAgJqchEQwCCyABQRxqEL8VIQ0LIAIoAsgBIREgAigCxAEhDiACKALAASEQCyAErUIghiEmDAELAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMOCwABCgIDBAUGBwgJAAsgAkHAAWogAUEIahDrDCACKQPIASInQoCAgIBwgyEmICenIhFBgH5xIQQgAigC3AEhCCACKALYASEGIAIoAtQBIQ0gAigC0AEhBSACKALEASEOIAIoAsABIRAMCgsgASgCJCEIIAEoAiAhBiABQShqEPIfIQcgAkHAAWogAUEIahDuCyACKQPIASInQoCAgIBwgyEmICenIhFBgH5xIQQgAigC1AEhDSACKALQASEFIAIoAsQBIQ4gAigCwAEhEAwJCyABKAIMIQ4gASgCCCEQQQAhBEIAISYgAUEEahDyHyEPDAgLIAEtABAhESABKAIMIQ4gASgCCCEQQQAhBEIAISYgAUEEahDzHyEPDAcLIAEoAhAiEUGAfnEhBCABKAIMIQ5CACEmIAFBBGoQ8h8hDyABQQhqEPQfIRAMBgsgASgCECIRQYB+cSEEIAEoAgwhDkIAISYgAUEEahDyHyEPIAFBCGoQ9B8hEAwFCyABKAIMIQ4gASgCCCEQQQAhBEIAISYgAUEEahDyHyEPDAQLIAEoAhAiEUGAfnEhBCABKAIMIQ5CACEmIAFBBGoQ8h8hDyABQQhqEPQfIRAMAwsgAkHAAWogAUEEahDFEiACKALMASIRQYB+cSEEIAIoAsgBIQ4gAigCxAEhECACKALAASEPQgAhJgwCCyABKQMQIidCgICAgHCDISYgJ6ciEUGAfnEhBCABKAIsIQkgASgCKCEHIAEoAiQhCCABKAIgIQYgASgCHCENIAEoAhghBSABKAIMIQ4gASgCCCEQIAEoAgQhDwwBCyABKAIsIQkgASgCKCEHIAEoAiQhCCABKAIgIQYCQAJAIAEoAggNACABKAIcIQ0gASgCGCEFQQAhEAJAIAEpAxAiJ0IDg0IAUQ0ADAILICenIgQgBCgCACIEQQFqNgIAIARBf0oNAQxLCyABKQMQISdBASEQIAFBDGoQ8h8hDgsgJ0KAgICAcIMhJiAnpyIRQYB+cSEECyAEIBFB/wFxciERC0HAABCKASIERQ0wIAQgASgCOBBOIAAgCjoAPCAAIAQ2AjggACAMNgI0IAAgCzYCMCAAIAk2AiwgACAHNgIoIAAgCDYCJCAAIAY2AiAgACANNgIcIAAgBTYCGCAAICYgEa2ENwMQIAAgDjYCDCAAIBA2AgggACAPNgIEIAAgAzYCAAxICyABKAIkIQogASgCICEMQcAAEIoBIgNFDS4gAyABKAIoEE4CQAJAAkACQCABKAIIIgcOAwABAgALIAEoAhQhBCABKAIQIQsgASgCHCEIIAEoAhghCQJAIAEpAxAiJkIDg0IAUg0AICanIgEgASgCACIBQQFqNgIAIAFBf0wNSgsgAiAENgLAASACQZABaiEBDAILIAEoAhQhBCABKAIQIQsgASgCHCEIIAEoAhghCQJAIAEpAxAiJkIDg0IAUg0AICanIgEgASgCACIBQQFqNgIAIAFBf0wNSQsgAiAENgLAASACQZABaiEBDAELIAEoAhQhCCABKAIQIQtBwAAQigEiBEUNLiAEIAEoAgwQTiACQcABaiEBCyABIAg2AgAgACALNgIQIAAgBDYCDCAAIAc2AgggACAJNgIYIAAgAzYCKCAAIAo2AiQgACAMNgIgIABBFDYCACAAIAIoAsABNgIUIAAgAigCkAE2AhwMRwtBASEEIAEoAiwhCiABKAIoIQwgASgCJCELIAEoAiAhCAJAAkAgASgCCEEBRw0AIAEpAxAhJhCOISEDIAJBwAFqIAEoAgwQTiADIAIpA/gBNwM4IAMgAikD8AE3AzAgAyACKQPoATcDKCADIAIpA+ABNwMgIAMgAikD2AE3AxggAyACKQPQATcDECADIAIpA8gBNwMIIAMgAikDwAE3AwAMAQsgASgCHCEJIAEoAhghB0EAIQQCQCABKQMQIiZCA4NCAFENAAwBCyAmpyIBIAEoAgAiAUEBajYCACABQX9MDUYLIAAgCjYCLCAAIAw2AiggACALNgIkIAAgCDYCICAAIAk2AhwgACAHNgIYIAAgJjcDECAAIAM2AgwgACAENgIIIABBFTYCAAxGCyABKAIUIQwgASgCECELQcAAEIoBIgNFDSogAyABKAIEEE5BwAAQigEiBEUNKSAEIAEoAggQTkHAABCKASIKRQ0oIAogASgCDBBOIAAgDDYCFCAAIAs2AhAgACAKNgIMIAAgBDYCCCAAIAM2AgQgAEEWNgIADEULIAEoAiQhCiABKAIgIQwgASgCHCELAkACQAJAIAEtABgiA0F9akEBIANBAksbQf8BcQ4DAAECAAsgAiABLwAZOwEQIAIgAS0AGzoAEgxDCyACIAEvABk7ARAgAiABLQAbOgASDEILQcAAEIoBIgRFDSYgBCABKAIQEE5BBSEDDEILIAEoAhwhCiABKAIYIQwgASgCFCELQcAAEIoBIgNFDSQgAyABKAIQEE5BgICAgHghBAJAIAEoAgRBgICAgHhGDQAgAkHAAWogAUEEahDYCiACKQLEASEmIAIoAsABIQQLAkACQCABKAIgDQBBACEBDAELIAFBIGoQtQshAQsgACABNgIgIAAgCjYCHCAAIAw2AhggACALNgIUIAAgAzYCECAAICY3AwggACAENgIEIABBGDYCAAxDCyABKAIIIQMgASgCFCEJIAEoAhAhBSACQcABaiABKAIMIghBBEEEEIUPIAIoAsQBIQsgAigCwAFBAUYNIiACKALIASEHAkAgC0UNACAIQQJ0IQQgByEKIAshDANAIARFDQFBwAAQigEiAUUNIyACQcABaiADKAIAEE4gASACKQP4ATcDOCABIAIpA/ABNwMwIAEgAikD6AE3AyggASACKQPgATcDICABIAIpA9gBNwMYIAEgAikD0AE3AxAgASACKQPIATcDCCABIAIpA8ABNwMAIAogATYCACAEQXxqIQQgCkEE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BCAAQSI2AgAMOQsgASgCDCEEIAEoAgghCkHAABCKASIDRQ0DIAMgASgCBBBOIAAgBDYCDCAAIAo2AgggACADNgIEIABBIzYCAAw4CyABKAIUIQMgASgCECEEIAEoAiwhCiABKAIoIQwCQCABKQMIIiZCA4NCAFINACAmpyILIAsoAgAiC0EBajYCACALQX9MDTcLIAEoAiQhCyABKAIgIQgCQCABKQMYIidCA4NCAFINACAnpyIBIAEoAgAiAUEBajYCACABQX9MDTcLIAAgCjYCLCAAIAw2AiggACALNgIkIAAgCDYCICAAICc3AxggACADNgIUIAAgBDYCECAAICY3AwggAEElNgIADDcLIAAgASkDODcDOCAAIAEpAzA3AzAgACABKQMoNwMoIAAgASkDIDcDICAAIAEpAxg3AxggACABKQMQNwMQIAAgASkDCDcDCCAAIAEpAwA3AwAMNgsCQEGgARCKASIKRQ0AIAEoAgQiESgCBCEWIBEoAgAhFyACQZABaiARQcAAahDFBiARKAKAASEYIBEoAnQhGSARKAJwIRogAkHAAWogESgChAEiG0EIQdgAEIUPIAIoAsQBIRwCQCACKALAAUEBRg0AIAIoAsgBIRMCQAJAAkAgHEUNACAbQdgAbCEdQQAhBCAcIQcDQCAdIARGDQECQAJAAkACQAJAAkACQCAYIARqIgEoAgBBBUcNACABQQxqKAIAIQsgAUEIaigCACEMQcAAEIoBIgNFDQEgAkHAAWogAUEEaigCABBOIAMgAikD+AE3AzggAyACKQPwATcDMCADIAIpA+gBNwMoIAMgAikD4AE3AyAgAyACKQPYATcDGCADIAIpA9ABNwMQIAMgAikDyAE3AwggAyACKQPAATcDAEEFIQgMBgsgAUEsaigCACEJIAFBKGooAgAhBQJAAkAgAUEwaikDACImUA0AIAFBPGooAgAhHiABQThqKAIAIRUgAUHUAGooAgAhDSABQdAAaigCACEGAkAgJkIDg0IAUg0AICanIgMgAygCACIDQQFqNgIAIANBf0wNQwsgAUHMAGooAgAhDiABQcgAaigCACEQIAFBwABqKQMAIienIRQCQCAnQgODQgBSDQAgFCAUKAIAIgNBAWo2AgAgA0F/TA1DCyAnQiCIpyEfDAELIAFBxABqKAIAIR8gAUHAAGooAgAh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C0EEQcgAEKIkAAtBCEHAABCiJAALQQhB8AAQoiQACyAJIAIoAsgBEP4gAAtBCEHAABCiJAALIAggAigCyAEQ/iAACyABKAIcIQQgASgCGCEKAkACQCABLQA0IgxBAkYNACABKAIwIQsgASgCLCEIIAEoAighByABKQMgIianIQMCQCAmQgODQgBSDQAgAyADKAIAIglBAWo2AgAgCUF/TA0PCyAmQiCIpyEJDAELIAFBIGoQ/AohAwsgASgCFCEFIAEoAhAhBgJAIAEpAwgiJkIDg0IAUg0AICanIgEgASgCACIBQQFqNgIAIAFBf0wNDQsgACAMOgA0IAAgCzYCMCAAIAg2AiwgACAHNgIoIAAgCTYCJCAAIAM2AiAgACAENgIcIAAgCjYCGCAAIAU2AhQgACAGNgIQIAAgJjcDCCAAQSQ2AgAMDQsgACABKQM4NwM4IAAgASkDMDcDMCAAIAEpAyg3AyggACABKQMgNwMgIAAgASkDGDcDGCAAIAEpAxA3AxAgACABKQMINwMIIAAgASkDADcDAAwMCyABLQAQIQQgASgCDCEKIAEoAgghDAJAQSgQigEiA0UNACADIAEoAgQQwwUgACAEOgAQIAAgCjYCDCAAIAw2AgggACADNgIEIABBMDYCAAwMC0EIQSgQoiQACyABKAIUIQMgASgCECEEAkAgASkDCCImQgODQgBSDQAgJqciASABKAIAIgFBAWo2AgAgAUF/TA0KCyAAIAM2AhQgACAENgIQIAAgJjcDCCAAQS82AgAMCgsgASgCECEKIAEoAgwhDAJAAkBBwAAQigEiA0UNACADIAEoAgQQTkHgABCKASIERQ0BIAQgASgCCBBwIAAgCjYCECAAIAw2AgwgACAENgIIIAAgAzYCBCAAQS42AgAMCwtBCEHAABCiJAALQQhB4AAQoiQACyABKAIQIQYgASgCDCENAkACQAJAAkBBwAAQigEiB0UNACAHIAEoAgQQTkEUEIoBIgtFDQEgASgCCCIDKAIEIQEgAygCECEOIAMoAgwhECACQcABaiADKAIIIglBBEEEEIUPIAIoAsQBIQggAigCwAFBAUYNAiACKALIASEFAkAgCEUNACAJQQJ0IQMgBSEEIAghDANAIANFDQFB4AAQigEiCkUNBSACQcABaiABKAIAEHAgCiACQcABakHgAPwKAAAgBCAKNgIAIARBBGohBCADQXxqIQMgAUEEaiEBIAxBf2oiDA0ACwsgCyAONgIQIAsgEDYCDCALIAk2AgggCyAFNgIEIAsgCDYCACAAIAY2AhAgACANNgIMIAAgCzYCCCAAIAc2AgQgAEEtNgIADAwLQQhBwAAQoiQAC0EEQRQQoiQACyAIIAIoAsgBEP4gAAtBCEHgABCiJAALIAEoAhAhCiABKAIMIQwCQAJAQcAAEIoBIgNFDQAgAyABKAIEEE5B4AAQigEiBEUNASAEIAEoAggQcCAAIAo2AhAgACAMNgIMIAAgBDYCCCAAIAM2AgQgAEEsNgIADAkLQQhBwAAQoiQAC0EIQeAAEKIkAAsgASgCDCEEIAEoAgghCgJAQcAAEIoBIgNFDQAgAyABKAIEEE4gACAENgIMIAAgCjYCCCAAIAM2AgQgAEErNgIADAcLQQhBwAAQoiQACyABKAIMIQQgASgCCCEKAkBBwAAQigEiA0UNACADIAEoAgQQTiAAIAQ2AgwgACAKNgIIIAAgAzYCBCAAQSo2AgAMBgtBCEHAABCiJAALIAEoAhAhCiABKAIMIQwCQAJAQcAAEIoBIgNFDQAgAyABKAIEEE5B4AAQigEiBEUNASAEIAEoAggQcCAAIAo2AhAgACAMNgIMIAAgBDYCCCAAIAM2AgQgAEEpNgIADAYLQQhBwAAQoiQAC0EIQeAAEKIkAAsgASkDECEmIAEpAxghJyACQcABaiABQQRqEPoEIAAgJzcDGCAAICY3AxAgAEEoNgIAIAAgAikCwAE3AgQgACACKALIATYCDCAAIAEpAyA3AyAMAwsgASgCFCEIIAEoAhAhBAsgAkEUaiABQQRqENgKAkACQCABKAIoDQBBACEBDAELIAFBKGoQtQshAQsgACACKAIcNgIMIAAgAikCFDcCBCAAIAM6ABggACAINgIUIAAgBDYCECAAIAIvARA7ABkgACACLQASOgAbIAAgATYCKCAAIAo2AiQgACAMNgIgIAAgCzYCHCAAQRc2AgAMAQsACyACQeACaiQAC8RWAgt/An4jAEHgAGsiAyQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIADhMAAQIDBAUGBwgJCgsUExIREA8OAAsgA0E4aiABQQRqIAIQ+RcgAy0AOEEERg0MIAMpAzgiDkL/AYNCBFENDCAAIA43AgAMJwsgA0E4aiABKAIEIAIQ2RAgAy0AOEEERg0lIAMpAzgiDkL/AYNCBFENJSAAIA43AgAMJgsgASgCCCEEIANBOGogAiABKAIEIgVBABC1AgJAAkAgAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINAQsgAyAENgJAIAMgBTYCPCADQQE2AjggA0HQAGogAiADQThqQZ3umgFBCBDrDQJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELIANBADYCOCADQdAAaiACIANBOGoQ6g0gAy0AUEEERg0lIAMpA1AiDkL/AYNCBFENJQsgDkL/AYNCBFENJCAAIA43AgAMJQsCQAJAIAEoAgwiBEUNACADQdAAaiACIAQQ8R0gAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsgA0EANgI4IANB0ABqIAIgA0E4akHC7ZoBQQQQ6w0CQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCwJAIAItAF0NACADQdAAaiACENgQIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELIANB0ABqIAIgA0E4akGm7ZoBQQEQ7A0CQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQdAAaiABQQRqIAIQjSQCQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQdAAaiACIANBOGpBp+2aAUEBEOwNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsgA0HQAGogAUEIaiACEJQkIAMtAFBBBEYNJCADKQNQIg5C/wGDQgRRDSQLIA5C/wGDQgRRDSMgACAONwIADCQLIANB0ABqIAIgASgCBCIEQQAQtQICQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0iCwJAIARFDQAgA0HQAGogAiAEEPEdIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDSILIANBADYCOCADQdAAaiACIANBOGpBmO+aAUEGEOsNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINIgsgASgCDCIERQ0gAkACQAJAIAIgBBDMBw0AIAQQ/QkNASACLQBdDQIgA0HQAGogAhDYECADLQBQQQRGDQIgAykDUCIOQv8Bg0IEUQ0CDCQLIANB0ABqIAIgA0E4akGm7ZoBQQEQ7A0CQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0kCyADQdAAaiAEIAIQSgJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDSQLIANB0ABqIAIgA0E4akGn7ZoBQQEQ7A0gAy0AUEEERg0iIAMpA1AiDkL/AYNCBFENIgwjCyADQdAAaiACENgQIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDSILIANB0ABqIAQgAhBKIAMtAFBBBEYNICADKQNQIg5C/wGDQgRRDSAMIQsgA0E4aiABQRBqIAIQkRYCQAJAIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDQELIANBADYCOCADQdAAaiACIANBOGpBzuyaAUEBEOwNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsCQCACLQBdDQAgA0E4aiACENgQIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDQELIANBOGogAUEoaiACEJQkIAMtADhBBEYNIiADKQM4Ig5C/wGDQgRRDSILIA5C/wGDQgRRDSEgACAONwIADCILAkAgASgCCCIERQ0AIANB0ABqIAIgBBDxHSADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0eCyADQQA2AjggA0HQAGogAiADQThqQdbwmgFBBRDrDQJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDR4LIAEtACRBAkYNHCADQdAAaiACENgQAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINHgsgA0HQAGogAUEQaiACEJEWIAMtAFBBBEYNHCADKQNQIg5C/wGDQgRRDRwMHQsCQCABKAIIIgRFDQAgA0HQAGogAiAEEPEdIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDRsLIANBADYCOCADQdAAaiACIANBOGpB2/CaAUEIEOsNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINGwsgAS0AJEECRg0ZIANB0ABqIAIQ2BACQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0bCyADQdAAaiABQRBqIAIQkRYgAy0AUEEERg0ZIAMpA1AiDkL/AYNCBFENGQwaCyADQdAAaiACIAEoAgwiBEEAELUCAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINGAsCQCAERQ0AIANB0ABqIAIgBBDxHSADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0YCyADQQA2AjggA0HQAGogAiADQThqQePwmgFBAhDrDQJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDRgLAkAgAi0AXQ0AIANB0ABqIAIQ2BAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINGAsgA0HQAGogAiADQThqQabtmgFBARDsDQJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDRgLIANB0ABqIAFBBGogAhCNJAJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDRgLIANB0ABqIAIgA0E4akGn7ZoBQQEQ7A0CQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0YCwJAIAItAF0NACADQdAAaiACENgQIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDRgLIAEoAggoAgAhBCADQdAAaiABQQhqIAIQlCQCQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0YCyABKAIUIgVFDR4gBA0WIAItAF1BAXENFiADQdAAaiACENgQIAMtAFBBBEYNFiADKQNQIg5C/wGDQgRRDRYMFwsgASgCGCEGIANBOGogAiABKAIUIgVBABC1AgJAIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDRULAkAgBUUNACADQThqIAIgBRDxHSADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0VCyADQQA2AlAgA0E4aiACIANB0ABqQaTvmgFBBhDrDQJAIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDRULIANBOGogAiADQdAAakGm7ZoBQQEQ7A0CQCADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0VCyADQThqIAFBEGogAhCNJAJAIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDRULIANBOGogAiADQdAAakGn7ZoBQQEQ7A0CQCADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0VCyADQThqIAIgA0HQAGpBr+uaAUEBEOwNAkAgAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINFQsgASgCCCEEIANBOGogAiAFIAEoAgwiB0HBACAHEIUbAkAgAy0AOEEFRg0AIAMpAzghDgwTCwJAIAdFDQACQCACLQBdDQAgA0E4aiACELoUIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDRQLIANBADoASCACLQBdRQ0DDBELIAItAF0NESADQThqIAIQuhQgAy0AOEEERg0RIAMpAzgiDkL/AYNCBFENEQwSCyADQdAAaiACIAEoAggiBEEAELUCAkACQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCwJAIARFDQAgA0HQAGogAiAEEPEdIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELIANBADYCOCADQdAAaiACIANBOGpB5O+aAUEFEOsNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsCQAJAAkACQCACIAFBBGoiBCgCACIFEMwHDQAgBRD9CQ0BIAItAF0NAiADQdAAaiACENgQIAMtAFBBBEYNAiADKQNQIg5C/wGDQgRRDQIMBAsgA0HQAGogAiADQThqQabtmgFBARDsDQJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQQLIANB0ABqIAQgAhCNJAJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQQLIANB0ABqIAIgA0E4akGn7ZoBQQEQ7A0gAy0AUEEERg0CIAMpA1AiDkL/AYNCBFENAgwDCyADQdAAaiACENgQIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQILIANB0ABqIAQgAhCNJCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQdAAaiACIANBOGoQ6g0gAy0AUEEERg0dIAMpA1AiDkL/AYNCBFENHQsgDkL/AYNCBFENHCAAIA43AgAMHQsgA0E4aiACIAEoAgQiBCgCeCIFQQAQtQICQCADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0OCwJAIAVFDQAgA0E4aiACIAUQ8R0gAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINDgsgA0EANgIcIANBOGogAiADQRxqQajwmgFBAxDrDQJAIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDQ4LAkAgAi0AXQ0AIANBOGogAhDYECADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0OCyADQThqIARByABqIAIQ+RcCQCADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0OCyAEKAIAQQhGDQwCQCACLQBdDQAgA0E4aiACENgQIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDQ4LIAQoAkQhBiADQThqIAIgBCgCQCIFQQAQtQICQCADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0MCwJAIAVFDQAgA0E4aiACIAUQ8R0gAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINDAsgAyAGNgJAIAMgBTYCPCADQQE2AjgCQCACKAJIRQ0AIANB0ABqIAJBACADQQRBACADQThqEPoJIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQwLIANBADYCKCADQThqIAIgA0EoakGz75oBQQUQ6w0CQCADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0MCwJAIAItAF0NACADQThqIAIQ2BAgAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINDAsgBCgCAEEHRg0KIAIoAkhFDQkgA0EANgJYIANCgICAgMAANwJQIAMgA0HQAGo2AjggBCADQThqELALIAMoAlghBiADKAJUIQUgAyADKAJQNgJAIAMgBTYCOCADIAUgBkEMbCIGaiIINgJEA0ACQAJAIAZFDQACQCAFKAIAIglBgICAgHhGDQAgBUEMaiEKIAVBBGoiCygCACEFIAIoAkhFDQIgA0HIAGogAiALKQIAIg6nIgsgDkIgiKciDCALIAxBARDaByADLQBIQQRGDQIgAykDSCIOQv8Bg0IEUQ0CIAMgCjYCPCAJIAUQ1SUgA0E4ahCPGAwPCyAFQQxqIQgLIAMgCDYCPCADQThqEI8YDAsLIAkgBRDVJSAGQXRqIQYgCiEFDAALCyACIAIoAjhBAWo2AjgMDQsgAEEEOgAADBoLIAEoAgwhBCADQThqIAIgASgCCEEAELUCAkACQAJAIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDQELIANB0ABqIAIoAlQgAigCWCAEEPAdIANBOGogAUEEaiACEI0kAkACQAJAIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDQELIANBADYCOCADQShqIAIgA0E4ahDqDQJAIAMtAChBBEYNACADKQMoIg5C/wGDQgRSDQELQQQhCUIAIQ8gAygCUEGAgICAeEYNASADKAJYQRhsIQUgAygCVCEEQQQhCQNAIAVFDQIgAi0AXSEGAkACQAJAAkACQCAEQRBqLQAAQQFHDQAgBkEBcUUNAQwDCyAGQQFxDQEgA0E4aiACQdDjmgFBARDXDyADLQA4QQRGDQEgAykDOCIOQv8Bg0IEUQ0BDAULIANBOGogAkHQ45oBQQEQ1w8gAy0AOEEERg0BIAMpAzgiDkL/AYNCBFENAQwECwJAIARBCGooAgAiBkUNACADQThqIAIgBhDxHSADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0ECyADQThqIAJB0eOaAUECENcPAkAgAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINBAsgA0EQaiAEEJMUIANBOGogAiADKAIQIAMoAhQQ1w8CQCADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0ECwJAIARBDGooAgAiBkUNACADQThqIAIgBhDxHSADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0ECyADQThqIAIQuhQgAy0AOEEERg0BIAMpAzgiDkL/AYNCBFINAwwBCwJAIARBCGooAgAiBkUNACADQThqIAIgBhDxHSADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0DCyADQThqIAJB0+OaAUECENcPAkAgAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINAwsgA0EIaiAEEJMUIANBOGogAiADKAIIIAMoAgwQ1w8CQCADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0DCwJAIARBDGooAgAiBkECTQ0AIANBOGogAiAGQX5qEPEdIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDQMLIANBOGogAkHV45oBQQIQ1w8CQCADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0DCyACLQBdDQAgA0E4aiACENgQIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDQILIARBGGohBCAFQWhqIQUMAAsLIA5CgH6DIQ8gDqchCQsgA0HQAGoQoCIgCUH/AXFBBEcNAQwaCyAOpyIJQf8BcUEERg0ZIA5CgH6DIQ8LIAAgDyAJrUL/AYOENwIADBkLIAFBCGohBAJAAkACQAJAAkAgASgCCEF+ag4CAQIACyADQThqIAQgAhCEASADLQA4QQRGDRsgAykDOCIOQv8Bg0IEUQ0bIAAgDjcCAAwcCyADQThqIAFBDGogAhD6FyADLQA4QQRGDQEgAykDOCIOQv8Bg0IEUQ0BIAAgDjcCAAwbCyADQThqIAQgAhCEASADLQA4QQRGDQEgAykDOCIOQv8Bg0IEUQ0BIAAgDjcCAAwaCyADQQA2AjggA0HQAGogAiADQThqEOoNIAMtAFBBBEYNGCADKQNQIg5C/wGDQgRRDRggACAONwIADBkLIANBADYCOCADQdAAaiACIANBOGoQ6g0gAy0AUEEERg0XIAMpA1AiDkL/AYNCBFENFyAAIA43AgAMGAsgA0HQAGogAiABKAIUIgRBABC1AgJAAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsCQCAERQ0AIANB0ABqIAIgBBDxHSADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQQA2AjggA0HQAGogAiADQThqQcjwmgFBAxDrDQJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELAkAgAS0AHEUNACADQdAAaiACENgQAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAgsgA0HQAGogAiADQThqQZvtmgFBBRDrDSADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCwJAIAItAF0NACADQdAAaiACENgQIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELIANB0ABqIAIgA0E4akGm7ZoBQQEQ7A0CQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQdAAaiABQQRqIAIQ2g0CQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCwJAAkAgASgCBCABKAIIEMMODQAgAi0AXQ0BIANB0ABqIAIQ2BAgAy0AUEEERg0BIAMpA1AiDkL/AYNCBFENAQwCCyADQdAAaiACENgQIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELIANB0ABqIAIgA0E4akHU8JoBQQIQ6w0CQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCwJAAkAgASgCDBD9CQ0AIAItAF0NASADQdAAaiACENgQIAMtAFBBBEYNASADKQNQIg5C/wGDQgRRDQEMAgsgA0HQAGogAhDYECADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQdAAaiABQQxqIAIQjSQCQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQdAAaiACIANBOGpBp+2aAUEBEOwNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsgA0HQAGogAUEQaiACEJQkIAMtAFBBBEYNFyADKQNQIg5C/wGDQgRRDRcLIA5C/wGDQgRRDRYgACAONwIADBcLIANB0ABqIAIgASgCFCIEQQAQtQICQAJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELAkAgBEUNACADQdAAaiACIAQQ8R0gAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsgA0EANgI4IANB0ABqIAIgA0E4akHI8JoBQQMQ6w0CQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQdAAaiACIANBOGpBpu2aAUEBEOwNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsgA0HQAGogAUEEaiACENoNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsCQAJAIAEoAgQgASgCCBDDDg0AIAItAF0NASADQdAAaiACENgQIAMtAFBBBEYNASADKQNQIg5C/wGDQgRRDQEMAgsgA0HQAGogAhDYECADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQdAAaiACIANBOGpBm/CaAUECEOsNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsCQAJAIAEoAgwQ/QkNACACLQBdDQEgA0HQAGogAhDYECADLQBQQQRGDQEgAykDUCIOQv8Bg0IEUQ0BDAILIANB0ABqIAIQ2BAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsgA0HQAGogAUEMaiACEI0kAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsgA0HQAGogAiADQThqQaftmgFBARDsDQJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELIANB0ABqIAFBEGogAhCUJCADLQBQQQRGDRYgAykDUCIOQv8Bg0IEUQ0WCyAOQv8Bg0IEUQ0VIAAgDjcCAAwWCyADQdAAaiACIAEoAhAiBEEAELUCAkACQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCwJAIARFDQAgA0HQAGogAiAEEPEdIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELIANBADYCOCADQdAAaiACIANBOGpByPCaAUEDEOsNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsgA0HQAGogAiADQThqQabtmgFBARDsDQJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELAkAgASgCBCIEQQJGDQAgAUEIaiEFAkACQCAEQQFHDQAgA0HQAGogBSACEI0kIAMtAFBBBEYNAiADKQNQIg5C/wGDQgRSDQEMAgsgA0HQAGogBSACEPoXIAMtAFBBBEYNASADKQNQIg5C/wGDQgRRDQELIA5C/wGDQgRSDQELIANB0ABqIAIgA0E4akGg8JoBQQEQ7A0CQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCwJAIAEoAhhFDQACQCACLQBdDQAgA0HQAGogAhDYECADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0CCyADQdAAaiABQRhqIAIQjSQgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsgA0HQAGogAiADQThqQaDwmgFBARDsDQJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELAkAgASgCHEUNAAJAIAItAF0NACADQdAAaiACENgQIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQILIANB0ABqIAFBHGogAhCNJCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQdAAaiACIANBOGpBp+2aAUEBEOwNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsgA0HQAGogAUEMaiACEJQkIAMtAFBBBEYNFSADKQNQIg5C/wGDQgRRDRULIA5C/wGDQgRRDRQgACAONwIADBULIAEoAhAhBSADQdAAaiACIAEoAgwiBEEAELUCAkACQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCwJAIARFDQAgA0HQAGogAiAEEPEdIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELIANBADYCOCADQdAAaiACIANBOGpBwPCaAUECEOsNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsCQAJAAkACQCABKAIIIgQoAgAOEwEBAgICAgICAgICAgICAgICAgABCyAEQQRqKAIAEP0JDQELIAItAF0NASADQdAAaiACENgQIAMtAFBBBEYNASADKQNQIg5C/wGDQgRRDQEMAgsgA0HQAGogAhDYECADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQdAAaiABQQhqIAIQlCQCQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQdAAaiACIANBOGpBsvCaAUEFEOsNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsCQCACLQBdDQAgA0HQAGogAhDYECADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQdAAaiACIANBOGpBpu2aAUEBEOwNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsgA0HQAGogAUEEaiACEI0kAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsgA0HQAGogAiADQThqQaftmgFBARDsDQJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELAkAgAi0AYkEBSw0AIANB0ABqIAIgA0E4ahDqDSADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyAFRQ0UIANB0ABqIAIgBRDxHSADLQBQQQRGDRQgAykDUCIOQv8Bg0IEUQ0UCyAOQv8Bg0IEUQ0TIAAgDjcCAAwUCyADQdAAaiACIAEoAgwiBEEAELUCAkACQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCwJAIARFDQAgA0HQAGogAiAEEPEdIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELIANBADYCOCADQdAAaiACIANBOGpBsvCaAUEFEOsNAkAgAy0AUEEERg0AIAMpA1AiDkL/AYNCBFINAQsgA0HQAGogAiADQThqQabtmgFBARDsDQJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELIANB0ABqIAFBBGogAhCNJAJAIAMtAFBBBEYNACADKQNQIg5C/wGDQgRSDQELIANB0ABqIAIgA0E4akGn7ZoBQQEQ7A0CQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQdAAaiABQQhqIAIQlCQgAy0AUEEERg0TIAMpA1AiDkL/AYNCBFENEwsgDkL/AYNCBFENEiAAIA43AgAMEwsgA0E4aiACIANBKGpBpu2aAUEBEOwNAkAgAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINAgsgA0E4aiAEIAIQuwcCQCADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0CCyADQThqIAIgA0EoakGn7ZoBQQEQ7A0gAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINAQsCQCACLQBdDQAgA0E4aiACENgQIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDQELIANBOGogBEEoaiACEPkXAkAgAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINAQsgAigCSEUNASADQThqIAIQnhMgAy0AOEEERg0BIAMpAzgiDkL/AYNCBFENAQsgDkL/AYNCBFINAQsgBCgCYEGAgICAeEYNDgJAIAItAF0NACADQThqIAIQ2BAgAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINAQsgA0E4aiACIANBHGpBq/CaAUEHEOsNAkAgAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINAQsgA0E4aiAEQeAAaiACEPkXIAMtADhBBEYNDiADKQM4Ig5C/wGDQgRRDQ4LIA5C/wGDQgRRDQ0gACAONwIADA4LIANBADoAHCAEQRRqIQQgByEJQQAhDANAAkACQAJAAkACQAJAAkAgCUUNACAEQXxqIggoAgAhCyADQThqIAIgBkHBACAMIAogA0EcaiADQcgAahCNBgJAIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDQoLIAgoAgAhDCADQThqIAIgBEF4aigCACIKQQAQtQICQCADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0GCwJAIApFDQAgA0E4aiACIAoQ8R0gAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINBgsgBCgCACIIRQ0BIANBADYCOCADQShqIAIgA0E4akHA75oBQQQQ6w0CQCADLQAoQQRGDQAgAykDKCIOQv8Bg0IEUg0GCyAIEP0JDQIgAi0AXQ0DIANBOGogAhDYECADLQA4QQRGDQMgAykDOCIOQv8Bg0IEUQ0DDAULIANBOGogAiAFIAZBwQAgDCAKEPACIAMtADhBBEYNByADKQM4Ig5C/wGDQgRSDQgMBwsgA0EANgI4IANBKGogAiADQThqQbTsmgFBBxDrDSADLQAoQQRGDQIgAykDKCIOQv8Bg0IEUQ0CDAMLIANBOGogAhDYECADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0CCyADQThqIAQgAhCNJCADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0BCwJAIARBdGooAgAiCEEBRw0AIARBcGooAgAiDUEBQcTvmgEQpCIgDUEBQdTvmgEQpCILIANBADYCOCADQShqIAIgA0E4akHO7JoBQQEQ7A0CQCADLQAoQQRGDQAgAykDKCIOQv8Bg0IEUg0BCyADQThqIAIgCiAMIARBcGooAgAgCEHBgAUQ+wQgAy0AOEEERg0BIAMpAzgiDkL/AYNCBFENAQsgDkL/AYNCBFINAwsCQAJAIAMtAEgNACADQQE6AEgMAQsgAigCVEUNACADQThqIAIgC0EAELAEIAMtADhBBEYNACADKQM4Ig5C/wGDQgRSDQMLAkAgAy0AHEUNACACIAIoAjhBf2o2AjggA0EAOgAcCyAJQX9qIQkgBEEYaiEEQQEhDCALIQoMAAsLIANBOGogAiAGIAdFQcEAEMsSIAMtADhBBEYNASADKQM4Ig5C/wGDQgRRDQELIA5C/wGDQgRSDQELAkAgBkUNACADQThqIAIgBkF/ahDxHSADLQA4QQRGDQAgAykDOCIOQv8Bg0IEUg0BCyADQThqIAIgA0HQAGpBsOuaAUEBEOwNIAMtADhBBEYNCSADKQM4Ig5C/wGDQgRRDQkLIA5C/wGDQgRRDQggACAONwIADAkLIANB0ABqIAIgA0E4akHl8JoBQQQQ6w0CQCADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCwJAAkACQAJAIAUoAgAOEwEBAgICAgICAgICAgICAgICAgABCyAFQQRqKAIAEP0JDQELIAItAF0NASADQdAAaiACENgQIAMtAFBBBEYNASADKQNQIg5C/wGDQgRRDQEMAgsgA0HQAGogAhDYECADLQBQQQRGDQAgAykDUCIOQv8Bg0IEUg0BCyADQdAAaiABQRRqIAIQlCQgAy0AUEEERg0HIAMpA1AiDkL/AYNCBFENBwsgDkL/AYNCBFENBiAAIA43AgAMBwsgA0HQAGogAiADQThqEOoNIAMtAFBBBEYNBSADKQNQIg5C/wGDQgRRDQULIA5C/wGDQgRRDQQgACAONwIADAULIANB0ABqIAIgA0E4ahDqDSADLQBQQQRGDQMgAykDUCIOQv8Bg0IEUQ0DCyAOQv8Bg0IEUQ0CIAAgDjcCAAwDCyADQdAAaiACIANBOGoQ6g0gAy0AUEEERg0BIAMpA1AiDkL/AYNCBFENAQsgDkL/AYNCBFENACAAIA43AgAMAQsCQAJAIAIoAlRFDQAgAyABENgOIANBOGogAiADKAIEQQEQsAQgAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINAQsCQAJAIAItAF0NACADQThqIAIQuhQgAy0AOEEERg0AIAMpAzgiDkL/AYNCBFINAQsgAEEEOgAADAILIAAgDjcCAAwBCyAAIA43AgALIANB4ABqJAALpmECOn8GfiMAQbAFayICJAAgAkHYAmpBIEEIQdgAEIUPIAIoAtwCIQMCQCACKALYAkEBRg0AIAJBADYCVCACIAIoAuACNgJQIAIgAzYCTEGPAq1CIIYiPEHC8JoBrYQhPSA8QazkmgGthCE+IDxBn7aBAa2EITwgAkG4AmpBCGohBCACQdgCakEkaiEFIAJB2AJqQQhqIQYgAkGoBGpBCGohByACQdgCakEgaiEIIAJB2AJqQcAAaiEJIAJB2AJqQQxqIQogAkHYAmpBHWohCyACQYMDaiEMIAJBqARqQQRqIQ0gAkHYAmpBBHIhDiACQdgAakEoaiEPIAJBsANqQQhqIRAgAkHYAGpBDGohESACQagEakEMaiESIAJBqARqQRRqIRMgAkG4AmpBDGohFCACQbgCakEUaiEVIAJB2ABqQcAAaiEWIAJB2ABqQSRqIRcgAkHYAGpBCGohGCACQdgAakEEciEZQQAhGgNAAkACQAJAAkACQAJAAkACQAJAIAEtAMgBQX1qDgQBAAACAAsgASABKAJ4IhtBgICAEHI2AnggASgCwAEhHCACQdgCaiABQQAQ2AMgAigC3AIhAwJAIAIoAtgCIh1BgICAgHhHDQAgAiADNgJcIAJBDTYCWAwFCyACIAIoAuACNgKAAiACIAM2AvwBIAIgHTYC+AECQCABKAKAASIDQQ12IAEtAMgBQf8BcUH8AEZxIh5BAUcNACABEOgRIAEoAoABIQMLAkAgA0GAwABxDQBBAyEfDAQLIAJB2AJqIAEQ7wwgAi0A2AINAiACLQDZAiEfIAEoAoABIQMMAwsgACACKAJUNgIIIAAgAikCTDcCAAwECyABEOgRIAEoArwBIRwgASgCuAEhHQJAIAIoAlQiAyACKAJMRw0AIAJBzABqEMoaCyACKAJQIANB2ABsaiIbIBw2AgggGyAdNgIEIBtBCjYCACACIANBAWo2AlQMBgsgAiACKALcAjYCXCACQQ02AlggAkH4AWoQoiEMAQsgAS0AyAEhHQJAAkACQCAeDQBBACEgIANBgMAAcUUNASAdQf8BcUH8AEcNASABEOgRIAEoAoABIQMgAS0AyAEhHQsgA0GAwABxISECQCAdQf8BcSIeDQAgIUEARyEiDAILAkAgIUUNAEEBISIgHkESRg0CIB5BPkYNAgsCQAJAIAFBARCFEQ0AICFFDQEgHkEKRw0BCyACIBw2AugCIAJC8ciVm8atmLnlADcD4AIgAiABKAK8ATYC7AIgAkEANgLYAgJAICFBAEcgHkEKRnEiA0UNACABEOgRCyACQQA2AqgEIAJB2ABqIAEgHCACQfgBaiAfIAJB2AJqQQAgAkGoBGogA0EAQQBBAEEAEMECDAMLIAEoArwBISNBASEgIBwhJAtBACElAkAgHUH/AXFBlAFGIiZFDQAgASgCwAEhJyABEOgRIAEoAoABIQMgASgCvAEhKEEBISULAkACQAJAAkAgA0GAAnFFDQAgAS0AyAFBnAFHDQAgASgCwAEhHSABEOgRIAIgHTYCiAIgAkEBNgKEAiACIAEoArwBIh42AowCIAEtAMgBIiFFDQICQCABKAKAASIDQYDAAHEiIkUNACAhQRJGDQMgIUE+Rg0DCwJAIAFBARCFEQ0AQQEhKSAiRQ0CICFBCkcNAgsQyhshPyACIB42AuwCIAIgHTYC6AIgAiA/NwPgAiACQQA2AtgCAkAgAS0AgQFBBXYgAS0AyAFB/wFxQQpGcSIDRQ0AIAEQ6BELIAJBADYCqAQgAkHYAGogASAcIAJB+AFqIB8gAkHYAmogJiACQagEaiADQQAgIEEAQQAQwQIMBQtBACEpIAJBADYChAILICVFDQEgA0GAwABxIR4CQAJAAkAgAS0AyAEiHQ0AIB5BAEchIQwBCyAeRQ0BQQEhISAdQRJGDQAgHUE+Rw0BCyAFIAIoAoACNgIIIAUgAikC+AE3AgAgAiAfOgCUAyACIBw2AvgCIAJBADoAmAMgAkEANgKIAyACQQA7AJkDIAJBADsAlQMgAiAoNgLsAiACICc2AugCIAJC4ebRi8au2jE3A+ACIAJBADYC2AIgAiAhIB1BCkZxOgCXAyACQdgAaiABIAJB2AJqEPQFDAQLAkACQCABQQAQhRENACAeRQ0DIB1BCkcNAwwBCyAdQQJGDQILIAIgKDYC7AIgAiAnNgLoAiACQuHm0YvGrtoxNwPgAiACQQA2AtgCAkAgHkEARyAdQQpGcSIDQQFHDQAgARDoEQsgAkHYAGogASAcIAJB+AFqIB8gAkHYAmpBACACQYQCaiADQQAgIEEAQQAQwQIMAwsQyRshPwJAIAEtAIEBQQV2IAEtAMgBQf8BcUEKRnEiA0UNACABEOgRCyAFIAIoAoACNgIIIAUgAikC+AE3AgAgAiAfOgCUAyACIBw2AvgCIAJBADoAmAMgAiADOgCXAyACICg2ApADIAIgJzYCjAMgAiAlNgKIAyACQQA7AJkDIAJBADsAlQMgAiAeNgLsAiACIB02AugCIAIgPzcD4AIgAkEANgLYAiACQdgAaiABIAJB2AJqEPQFDAILIAIgAigCgAI2ApgCIAIgAikC+AE3A5ACQQAhIUEAISpBACEiQQAhKyAlISxBACEtA0ACQAJAAkACQAJAAkACQAJAIANBgMAAcUUNACACQdgCaiABQaaDmwFBBEEBEJEHAkAgAi0A2AJFDQAgAiACKALcAjYCXCACQQ02AlgMBgsgAi0A2QIiA0GkAUYNACABKAK8ASEdIAEoArgBIR4CQAJAAkACQAJAAkACQCADQe9+ag4EAQ4OAgALIANB8wBGDQIgA0GMAUYNAwwNCyAtQQFGDQNBASEqIB0hLiAeIS9BASEtDAwLQQEhLCAhQQFxDQMMCgsgK0EBcQ0EQQEhKyAhQQFxRQ0JEM0bIT8gAhDOGzcD6AIgAiA/NwPgAiACQfqAgIB4NgLYAiABIB4gHSACQdgCahD1HUEBISFBASErDAoLICFBAXENBAJAIC1BAUcNABDPGyE/IAIQ0Bs3A+gCIAIgPzcD4AIgAkH6gICAeDYC2AIgASAeIB0gAkHYAmoQ9R1BASEhQQEhLQwKCyAgDQVBACEtQQEhISABLQB6QcAAcQ0JIAJBtIGAgHg2AtgCIAEgHiAdIAJB2AJqEPUdDAkLENEbIT8gAkH7gICAeDYC2AIgAiA/NwPgAiABIB4gHSACQdgCahD1HUEBIS0MCAsgAhDSGzcD6AIgAkLh5tGLxq7aMTcD4AIgAkH6gICAeDYC2AIgASAeIB0gAkHYAmoQ9R1BASEhQQEhLAwHCwJAICkNAEEAIQMCQCABLQCBAUEBcUUNACAqDQAgASgCwAEhKiABELwOQf8BcUUNACABLQDIAUH/AXFBnAFHDQAgARDoESACICo2AogCIAIgASgCvAE2AowCQQEhAwsgAiADNgKEAgsCQCAsIAEtAMgBQf8BcSIDQQJGcQ0AIANBlAFHDQQgARC8DkH/AXFBAkcNBAJAICJBAXFFDQAgAkGbgYCAeDYC2AIgASAeIB0gAkHYAmoQ9R0LAkAgJUUNACACQZuBgIB4NgLYAiABICcgKCACQdgCahD1HQsgARDoESACQdgAaiABIBwQhhEMBQsCQCAgRQ0AIAJBm4GAgHg2AtgCIAEgJCAjIAJB2AJqEPUdCwJAIB9B/wFxQQNGDQAgASgCxAEhAyABKALAASEdIAJBm4GAgHg2AtgCIAEgHSADIAJB2AJqEPUdCyACQdgAaiABIBwQhhEMBAsQzBshPyACQfuAgIB4NgLYAiACID83A+ACIAEgHiAdIAJB2AJqEPUdQQEhKwwFCxDTGyE/IAJB+4CAgHg2AtgCIAIgPzcD4AIgASAeIB0gAkHYAmoQ9R1BASEhDAQLEMsbIT8gAkLxyJWbxq2YueUANwPoAiACID83A+ACIAJBoIGAgHg2AtgCIAEgHiAdIAJB2AJqEPUdQQAhLUEBISEMAwsCQCABLQCBAUEgcUUNACAfQf8BcUEDRw0AICsgIXJBAXENACACQdgCaiABIBwgLUEBRiAsQQFxEJYEIAIoAtwCIQMCQCACKALYAiIqQYGAgIB4Rw0AIAIgAzYCXCACQQ02AlgMAgsgAiAGKAIQNgKwAiACIAYpAgg3A6gCIAIgBikCADcDoAIgKkGAgICAeEYNACARIAIoArACNgIQIBEgAikDqAI3AgggESACKQOgAjcCACACIAM2AmAgAiAqNgJcIAJBCTYCWAwBCwJAAkACQCABLQDIASIDQQ9GDQACQCAtQQFGIilFDQACQCADQXdqDgMAAQABCxDUGyE/IAIgLjYCzAIgAiAvNgLIAiACID83A8ACQQAhKgwDCyACQdgCaiABEPAMIAIoAtwCIS4gAigC2AIiKkEGRg0BIAQgBikDEDcDECAEIAYpAwg3AwggBCAGKQMANwMAIAIgLjYCvAIMAgsgARDoESACQdgCaiABEPAMIAIoAtwCIQMCQCACKALYAiIdQQZGDQAgAiAGKQMQIj83A8ADIAIgBikDCCJANwO4AyACIAYpAwAiQTcDsAMgByBBNwMAIAcgQDcDCCAHID83AxAgAiADNgKsBCACIB02AqgEAkAgLUEBRw0AIAEoArwBIR4gAkHjgICAeDYC2AIgASAcIB4gAkHYAmoQ9R0LAkAgAkGoBGoQhCVFDQAgASgCvAEhHiACQeSAgIB4NgLYAiABIBwgHiACQdgCahD1HQsgBSACKAKYAjYCCCAFIAIpA5ACNwIAIAYgAikDsAM3AwAgBiACKQO4AzcDCCAGIAIpA8ADNwMQIAIgHzoAlAMgAiAcNgL4AiACQQA6AJcDIAIgKDYCkAMgAiAnNgKMAyACICU2AogDIAIgAzYC3AIgAiAdNgLYAiACICtBAXE6AJYDIAIgIUEBcToAmAMgAkGAAjsAmQMgAkEAOgCVAyACQdgAaiABIAJB2AJqEPQFDAgLIAIgAzYCXCACQQ02AlgMAgsgAiAuNgJcIAJBDTYCWAwBCyACICo2ArgCAkAgAS0AgQFBBXYgAS0AyAEiLkH/AXFBCkZxIjBFDQAgARDoESABLQDIASEuCwJAAkACQAJAAkACQAJAAkACQAJAIC5B/wFxIi9FDQACQCABKAKAAUGAwABxIjFFDQAgL0ESRg0BIC9BPkYNAQsgAS0AyQEhHQJAAkACQAJAAkAgA0H/AEYiHg0AIANBkwFHDQELIAFBABCFESEiIC9BD0YgHXENACAiDQAgKg4GAQECAgIBAQsgAUEBEIURDQQCQCADQfgARw0AIB1BAXENAAJAICBFDQAgAkH8gICAeDYC2AIgASAkICMgAkHYAmoQ9R0gASgCgAFBgMAAcSExCyAxRQ0JIAJB2AJqIAFBqoObAUEBQQAQkQcCQCACLQDYAkUNACACIAIoAtwCNgJcDAsLIAItANkCQaQBRg0JIAEoArwBIQMgASgCuAEhHRDXGyE/IAJC0cLNy+ftGDcD6AIgAiA/NwPgAiACQfqAgIB4NgLYAiABIB0gAyACQdgCahD1HUEBISEMCQsgDiAuENklIAJBMTYC7AIgAkGrg5sBNgLoAiACQbCAgIB4NgLYAiABKALAASABKALEASACQdgCahDGGyEDAkAgAS0AyAFBogFHDQAgASABEKAjEIwUCyACQQ02AlggAiADNgJcDAsLIAIoAsgCISAgFSEdDAELIAIoAsACISAgFCEdCyACICA2AvAEIAIgHSgCACIsNgL0BCACQdgCaiABEPAMIAIoAtwCIR0CQCACKALYAiIiQQZHDQAgAiAdNgJcDAcLIAIgBikDECI/NwPgAyACIAYpAwgiQDcD2AMgAiAGKQMAIkE3A9ADIBAgQTcDACAQIEA3AwggECA/NwMQIAIgHTYCtAMgAiAiNgKwAwJAIC1BAUcNACACQY+AgIB4NgLYAiABICAgLCACQdgCahD1HQsgAkGwA2oQhCUNAgwECwJAICBFDQAgAkH8gICAeDYC2AIgASAkICMgAkHYAmoQ9R0LAkAgLUEBRw0AIAEoArwBIQMgAkHjgICAeDYC2AIgHCADIAJB2AJqEMYbIQMCQCABLQDIAUGiAUcNACABIAEQoCMQjBQLIAJBDTYCWCACIAM2AlwMCAsCQCADQZMBRiItDQAgA0H/AEcNAwsgAS0AyAFBEkcNAgJAAkAgLQ0AIANB/wBHDQEgAkG4AmpBpe6aAUEDEIMKDQQMAQsgAkG4AmpByO6aAUEDEIMKDQMLIAEoAsQBIQMgASgCwAEhLSACQfWAgIB4NgLYAiABIC0gAyACQdgCahD1HQwCCyACIAIpA9ACNwPwAiACIAIpA8gCNwPoAiACIAIpA8ACNwPgAiACIAIpA7gCNwPYAiACQdgAaiABIBwgAkGQAmogHyACQdgCaiAsQQFxIAJBhAJqIDAgKSAgICtBAXEgIUEBcRDBAgwNCyACQeKAgIB4NgLYAiABICAgLCACQdgCahD1HQwBCwJAAkACQAJAIAJBuAJqEIQlRQ0AIAEoAoABQYDAAHEiLUENdiAhcQ0BDAMLIAUgAigCmAI2AgggBSACKQOQAjcCACACIAIpA7gCNwPYAiACIAIpA8ACNwPgAiACIAIpA8gCNwPoAiACIAIpA9ACNwPwAiACIB86AJQDIAIgHDYC+AIgAiAwOgCXAyACICg2ApADIAIgJzYCjAMgAiAlNgKIAyACICtBAXEiHjoAlgMgAiAhQQFxIiE6AJgDIAEgASgCeCIDQf//729xQYCAgBByNgJ4IAJBADsAmQMgAkEAOgCVAyACQTBqIAEgBSAcQQBBABC7CyACKAIwIR0gASADNgJ4IAIoAjQhAwJAIB1BAUcNACACQQ02AlggAiADNgJcIAJB2AJqEMogDA8LAkACQCACKALYAkEFRg0AIAEoArwBIR0gHg0BDAMLIAEoArwBISIgAigC7AIhHQJAIB9B/wFxQQNGDQAgAkG2gYCAeDYCqAQgASAcIB0gHCAdSRsgHCAdIBwgHUsbIAJBqARqEPUdCyANIAQoAgg2AgggDSAEKQIANwIAIBkgAikCqAQ3AgAgGSACKQKwBDcCCCACQQY2AlggAiAhOgCBASACIDA6AIABIAIgHjoAfyACQQA6AH0gAiAfOgB8IAIgAzYCeCACICI2AnQgAiAcNgJwIAIgHTYCbCACICY6AH4MDwsgAygCGEGAgICAeEYNASACQaKBgIB4NgKoBCABIBwgHSACQagEahD1HQwBCyABKAK8ASEDENUbIT8gAkGDgYCAeDYC2AIgAiA/NwPgAiABIBwgAyACQdgCahD1HSABKAKAAUGAwABxIS0MAQsgDSACKQPQAjcCGCANIAIpA8gCNwIQIA0gAikDwAI3AgggDSACKQO4AjcCACACQQU2AlggGSACQagEakEk/AoAACACIB86AJEBIAJBADoAkAEgAiAhOgCPASACIDA6AI4BIAIgHjoAjQEgAiAmOgCMASACIAM2AogBIAIgHTYChAEgAiAcNgKAAQwMCyABLQDIASEDAkAgLUUNACADQf8BcUESRw0AIAEoAsABIQMCQAJAAkAgARC8DkH/AXFBEkYNACACQShqIAFBAEEBEPsXIAIoAiwhLSACKAIoQQFxRQ0BIAJBDTYCWCACIC02AlwMCAsgARDoESABKALAASEhIAEQ6BEgASgCvAEhLSACQYaBgIB4NgLYAiABIAMgLSACQdgCahD1HSABKAK8ASEDIAJBhIGAgHg2AtgCIAEgISADIAJB2AJqEPUdDAELIC1FDQAgLSgCBCIgQTBqIQMgLSgCCEEwbCIhQVBqISkgICAhaiEvIC0oAgAhKkEAISwgICEuAkADQCAhICxGDQECQCAuLQAqIiZBAkYNACACQdgCaiAuQSr8CgAAIAwgLigAKzYAACAMIC4tAC86AAQgAiAmOgCCAyACKALYAiEmIAIoAtwCITEgAkGEgYCAeDYCqAQgASAmIDEgAkGoBGoQ9R0gA0EwaiEDIClBUGohKSAsQTBqISwgAkHYAmoQ7CAgLkEwaiEuDAELCyAvICAgLGpBMGpGDQAgKUEwbiEhA0AgAxCsEyADQTBqIQMgIUF/aiIhDQALCyAqICAQ9yMgLUEUQQQQ3BQLIAEtAMgBIQMLAkACQCADQf8BcUUNACABKALEASEcIAEoAsABIR0gAkHsA2ogAxDZJSACIDw3A6gEIAJB2AJqQc2VgAEgAkGoBGoQiR8gCiACKAL0AzYCCCAKIAIpAuwDNwIAIB0gHCACQdgCahDGGyEhIAEtAMgBQaIBRw0BIAEgARCgIxCMFAwBCyABEOgRQQAhLSACQQA2ApgEIAJCgICAgIABNwKQBEEIISlBACEgQQAhLEEAIS4CQAJAA0ACQAJAAkACQAJAIAEtAMgBQQFGDQAgLEH+/3tLDQQgLiAscg0BDAQLIAIoApQEISwCQCACKAKQBCIuQYCAgIB4Rw0AIC0aICwhIQwICyACIC02AoAEIAIgLDYC/AMgAiAuNgL4AwJAIAEtAMgBIgNBAUYNACABKALEASEcIAEoAsABIR0gAkGEBGogAxDZJSACID03A6gEIAJB2AJqQc2VgAEgAkGoBGoQiR8gCiACKAKMBDYCCCAKIAIpAoQENwIAIB0gHCACQdgCahDGGyEhIAEtAMgBQaIBRw0DIAEgARCgIxCMFAwDCyABEOgRIAEtAIEBQSBxRQ0BIAEtAMgBQf8BcUEJRw0BIAJBEGogAUEBIAEoAsABENoQIAIoAhQhISACKAIQQQFGDQIgAiAhNgKoBCACQQhqICEoAgAQixAgAigCDCEDIAIoAgghISACQZ2BgIB4NgLYAiABICEgAyACQdgCahD1HSACQagEahC2IgwBCyACQfiAgIB4NgLYAiABICwgLiACQdgCahD1HQwCC0EAIQMCQANAICAgA0YiKg0BICwgA2ohISADQcAAaiEDICEoAgBBf2pBBUsNAAsLIAJB2AJqIAFBAEEAICoQ2QsgAigC3AIhISACKALYAiImQYGAgIB4Rg0AIAIgBikCCDcDsAQgAiAGKQIANwOoBAJAICZBgICAgHhHDQBBACEDAkADQCAgIANGDQECQCAsIANqIiooAgBBB0cNACAqQSxqKAIAIS8gKkEoaigCACEqIAJBqYGAgHg2AtgCIAEgKiAvIAJB2AJqEPUdCyADQcAAaiEDDAALCyABLQCBAUEgcUUNAEEAIQMDQCAgIANGDQFBECEvQQwhKQJAAkACQCAsIANqIiooAgBBfGoOBAECAgACCyAqQRxqLQAAQQJHDQFBFCEvQRAhKQsgLCADIClqaigCACEqICwgAyAvamooAgAhLyACQaqBgIB4NgLYAiABICogLyACQdgCahD1HQsgA0HAAGohAwwACwsCQCAlRQ0AIAJBg4GAgHg2AtgCIAJC4ebRi8au2jE3A+ACIAEgJyAoIAJB2AJqEPUdCwJAICIgK3FBAXFFDQAgAkGfgYCAeDYC2AIgASAeIB0gAkHYAmoQ9R0LAkAgAigCuAJBBUYNACACIAIpA7gCNwNYIAIgAikDwAI3A2AgAiACKQPIAjcDaCACIAIpA9ACNwNwIAEoArwBIQMgAkIANwPoAiACQgE3A+ACIAJCADcDkAMgAkEANgLYAiACQgA3A6ADIAJCgICAgIABNwOYAyACQYCAgIB4NgL4AiACQYAGOwGoAyAPIAIpA6gENwIAIA8gAikDsAQ3AgggAiAfOgCpASACIDA6AKgBIAJBADYCpAEgAiAtNgKgASACICw2ApwBIAIgLjYCmAEgAiADNgKUASACIBw2ApABIAIgITYCfCACICY2AnggAkHYAmoQjRogCRCvISAIEL4iIC0aDA0LQeyDmwFBsQFBxISbARDrGwALIAJB+ANqEK8hIC0aDAQLIAEoAsABISogAkHYAmogAUEAENgDIAIoAtwCISEgAigC2AIiA0GAgICAeEYNAiACIAIoAuACNgKkBCACICE2AqAEIAIgAzYCnAQCQAJAAkAgAS0AyAEiL0EcRg0AIAIgAigCpAQ2AvgEIAIgAikCnAQ3A/AEAkACQAJAAkAgAS0AgQFBIHFFDQAgAkHYAmogARDvDCACLQDYAg0GIAItANkCISEgAkHYAmogAUGqg5sBQQFBABCRByACLQDYAkEBRg0GIAItANkCIQMgAkHYAmogAUHY/5oBQQFBABCRByACLQDYAkEBRg0GIAItANkCISYCQCAhQf8BcUEDRw0AIANBpAFHDQAgJkGkAUYNAQsgAkHYAmogARCzAyACKALcAiEyIAIoAtgCIjFBB0cNASAyITMMCAsgAkHYAmogARCzAyACKALcAiEzIAIoAtgCIiZBB0YNByACIAspAAA3A+AEIAIgCygABzYA5wQgAiACKQKcBDcD0AQgAiACKAKkBDYC2AQgAi0A9AIhMSACKALwAiEyIAIpA+gCIT8gAigC5AIhNCACKALgAiE1IAEoArwBITYg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G0EBajYCVAwACwsgAyACKALgAhD+IAALsGMCM38FfiMAQYAEayICJAAgAkHQAmpBIEEIQdgAEIUPIAIoAtQCIQMCQAJAIAIoAtACQQFGDQAgAkEANgI0IAIgAigC2AI2AjAgAiADNgIsIAFBsAFqIQQgAUEMaiEFIAFBCGohBiABQZgBaiEHIAFBjAFqIQggAUGIAWohCUGPAq1CIIYiNUHC8JoBrYQhNiA1QZ+2gQGthCE1IAJB0AJqQQhqIQogAkHQAmpBJGohCyACQdgDakEIaiEMIAJB0AJqQQxqIQ0gAkHQAmpBK2ohDiACQdgDakEEaiEPIAJBOGpBKGohECACQaACakEIaiERIAJBOGpBDGohEiACQeACaiETIAJB2ANqQQxqIRQgAkHYA2pBFGohFSACQaACakEMaiEWIAJBoAJqQRRqIRcgAkE4akHAAGohGCACQThqQSRqIRkgAkE4akEIaiEaIAJBOGpBBHIhG0EAIRwDQAJAAkAgAS0AuAEiA0EGRg0AIANBA0cNASAAIAIoAjQ2AgggACACKQIsNwIADAQLAkACQCAJKAIAIgNBC0cNACACQdACaiABEMQBDAELIAlBCzYCACACIAcpAgA3A9ACIAIgBygCCDYC2AICQCAGKAIAQQpGDQAgBhDACwsgBiADNgIAIAUgCCkCADcCACAFIAgoAgg2AggLIAEgASgCtAEiHTYCrAEgASABKAKwASIeNgKoASAEIAIpA9ACNwIAIAQgAigC2AI2AggCQCACKAI0IgMgAigCLEcNACACQSxqEMoaCyACKAIwIANB2ABsaiIfIB02AgggHyAeNgIEIB9BCjYCACACIANBAWo2AjQMAQsgASABKAJ4IgNBgICAEHI2AnggASgCsAEhHSACQdACaiABQQAQ3QEgAigC1AIhHwJAAkAgAigC0AIiHkGAgICAeEcNACACIB82AjwgAkENNgI4DAELIAIoAtgCISACQAJAIAEoAoABIiFBDXYgAS0AuAFB/wFxQfwARnEiIkEBRg0AICFBgMAAcSEhDAELAkACQCAJKAIAIiFBC0cNACACQdACaiABEMQBDAELIAlBCzYCACACIAcpAgA3A9ACIAIgBygCCDYC2AICQCAGKAIAQQpGDQAgBhDACwsgBiAhNgIAIAUgCCkCADcCACAFIAgoAgg2AggLIAEp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OgCMAyACIB02AvACIAJBADoAkAMgAiAhOgCPAyACICs2AogDIAIgLDYChAMgAiAiNgKAAyACQQA7AJEDIAJBADsAjQMgAiAvNgLkAiACIC42AuACIAIgNzcD2AIgAkEANgLQAiACQThqIAEgAkHQAmoQ0AMMBAsgMEGjAUYNAQsgAS0AuQENAEEBIS0gMEEKRw0BIDFFDQELEMobITcgAiAvNgLkAiACIC42AuACIAIgNzcD2AIgAkEANgLQAgJAIAEtAIEBQQV2IAEtALgBQf8BcUEKRnEiIUUNACABELUQCyACICA2AqgCIAIgHzYCpAIgAiAeNgKgAiACQQA2AtgDIAJBOGogASAdIAJBoAJqICMgAkHQAmogJkGUAUYgAkHYA2ogIUEAICdBAEEAENEBDAELAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAiRQ0AIAEtALgBIi5FDQ0gIUGAwABxIiFFDQMgLkF9ag48BAEBBAEBBAQEAQEBAQEBDQEBAQEEAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQENAQsgAiAgNgLsASACIB82AugBIAIgHjYC5AEgIUGAwABxDQFBACEfQQEhLkEAITIMCQsgAiAgNgLsASACIB82AugBIAIgHjYC5AELIAJB0AJqIAFBpoObAUEEQQEQ5wIgAi0A0AINBQJAIAItANECIjJBpAFHDQBBACEzQQAhH0EAISggIiEeQQAhLwwHCyABKAKsASEwIAEoAqgBITFBACEfQQAhL0EAISggIiEeAkACQAJAAkAgMkGNf2oOIgMICAgICAgICAgICAgICAgICAgICAgICAgCCAgICAEICAAIC0EBIR5BACEvQQAhH0EAISgMBwtBASEvQQAhKAwFCwJAICcNAEEBIR8gAS0AekHAAHENBCACQbSBgIB4NgLQAiABIDEgMCACQdACahDuHQwECxDLGyE3IAJC8ciVm8atmLnlADcD4AIgAiA3NwPYAiACQaCBgIB4NgLQAiABIDEgMCACQdACahDuHUEAIS9BASEfQQAhKAwEC0EBIShBACEvQQAhHwwDCwJAIC5BF0sNAEEBIC50QciAgARxDQELIAIgIDYC7AEgAiAfNgLoASACIB42AuQBQQAhMkEBIS5BACEfDAYLIAIgKzYC5AIgAiAo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AigCiAEiE0kNACAFIBNBqPqEARD+FgALIAIoAoQBIAVBAnRqKAIAIgVBAEgNAQsgBEEFNgLQAiAEIAU2AtQCDAELIAQgAjYC3AIgBCABNgLYAiAEQdACaiAEQdgCaiAJIAMgDBCNAQsgBEGYAWogBEHQAmogCxDnDCAEKAKcASELIAQoApgBQQFHDQEgACALNgIEQQIhCAsgACAINgIADBsLAkAgAigCsAFBAUcNACACIAIoArQBIgUgAigCuAEiCWsgCSAFayAFIAlLGyACKAJwajYCcAsgAiAINgK4ASACIAg2ArQBIAJBATYCsAECQCAIIAZPDQAgAUHgAGohFCAGQQFqIRUgAUHgAmohCSABQeAEaiINQRhqIRYgDUEQaiEXA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgC0H///8/Sw0AIAggBkkNASAIIQUMFgsgAigCsAFFDQIgAiAINgK4ASAIIBFJDQEgCCARQbCThQEQ/hYACyACKAJ8IRggAigCeCEMIAghBQNAAkAgDCALIAkgECAFaiIDLQAAai0AAGpBAnRqKAIAIghB////P00NACALIQMgBSETDAgLAkAgBUEDaiITIAZJDQAgCCELDBYLIAwgCCAJIANBAWotAABqLQAAakECdGooAgAiC0H///8/Sw0FIAwgCyAJIANBAmotAABqLQAAakECdGooAgAiCEH///8/Sw0GIAwgCCAJIANBA2otAABqLQAAakECdGooAgAiC0H///8/Sw0EIAVBBGoiBSAGSQ0ADBULCyALQf///z9xIAkgECAIai0AACIDai0AAGoiBSACKAJ8IgxPDQECQAJAIAIoAnggBUECdGooAgAiDEEASA0AQQAhBQwBCyAEIAI2ArgCIAQgATYCtAIgBEGIAWogBEG0AmogCyADQQh0EK4BIAQoAowBIQwgBCgCiAEhBQsCQCAFQQFxDQAgDCELIAghBQwHCyAEQQE6ALQCIAQgCDYCuAIgBEG0AmoQ2h4hBSAAQQI2AgAgACAFNgIEDDELQeTphAFBH0GE6oQBEOwbAAsgBSAMQbjmhAEQ/hYACyAIIQMgCyEIDAILIAVBAWohEyAIIQMgCyEIDAELIAVBAmohEyALIQMLAkAgCEEASA0AIBMhBSAIIQsMAgsg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ATYCjAEgAiAALwGAATsBmAEgAiAAKQJ4NwKQASACQQYgECAEQYCAgIB4RiIBGzYCyAIgAkG0uIEBIBEgARs2AsQCIAIgAC8BqAEiATsB9AEgAiAAKQKgASI6NwLsASACIDo3AqABIAIgATsBqAEgAiACQcQCajYCnAEgAiAGNgK4ASACIAApAqABNwLMASACIAAvAagBOwHUASACIAJBuAFqNgLIASACIBI2AqwCIAIgAkGsAmo2AugBIAIgAC8BigE7AZQCIAIgACkBggE3AowCIAIgAkG4Amo2AogCIAJBEjYChAMgAkETNgL8AiACQRM2AvQCIAJBFDYC7AIgAkEUNgLkAiACIAJBiAJqNgKAAyACIAJB6AFqNgL4AiACIAJByAFqNgLwAiACIAJBnAFqNgLoAiACIAJBjAFqNgLgAiACQfQAakHSs4EBIAJB4AJqELMjIQsgAi0AuAIgAigCvAIQvBggBCAREOYhIAIoAoQBIQoCQCACKAKIASIERQ0AIAohAQNAIAEoAgAgAUEEaigCABDxISABQRhqKAIAIAFBHGooAgAQqB4gAUEgaiEBIARBf2oiBA0ACwsgAigCgAEgCkEEQSAQ1hMgCSAHEIIeIAggCRDDIyALRQ0DDAULIAIoAogBIQQgAigChAEhASACIAIoAoABNgKkASACIAE2AqABIAIgATYCnAEgAiABIARBBXRqIhM2AqgBIABBEGohFCAAQcAAaiEVIABBxABqIRYgAEEYaiEXIABBFGohGCAAQSRqIRkgAEE4aiEaIABBBGohGyAAKAJwIhwgACgCdEEKbGohHSACQeACakEEaiEeIAJBiAJqQQRqIR8gAkHgAmpBCGohICACQeACakEYaiEhIAJB4AJqQRBqISIgACgCuAEhIwJAA0AgASATRg0BIAIgAUEgaiIkNgKgASABKAIAIiVBgYCAgHhGDQEgASgCHCEmIAEoAhghJyABKAIEISggAkHgAmogDEEBIAEoAgwgASgCECAOIA4QhwECQCACKALgAkEBRw0AIAIoAuQCIAIoAugCELwYDAYLIAJBKGogAigC5AIiKSACKALoAiIqKAIMEQcAIAJBjAFqIAIoAiggAigCLBDZBiApICooAhwRBAAhBCApICooAhARBAAoAgAhESACQSBqIAIoApQBIgFBAUEBEIEYQQAhEiACQQA2AtABIAIgAikDIDcCyAEgAkEYakEBQQRBFBCBGCACQQA2AvABIAIgAigCHCIQNgLsASACIAIoAhg2AugBIAIgASACKAKQASIKajYCkAIgAiAKNgKMAkGBgMQAIQEgESELA0AgAkGBgMQANgKIAgJAIAFBgYDEAEcNACAfEM4NIQELAkACQAJAIAFBgIDEAEYNAAJAAkAgAUGAAU8NAEEBIQoMAQsCQCABQYAQTw0AQQIhCgwBC0EDQQQgAUGAgARJGyEKCyAKIAtqIQtBACEFAkACQCABQXZqDgQEAQEAAQsgAigCiAIhCiACQYGAxAA2AogCAkACQAJAIApBgYDEAEcNAAJAIAIoAowCIgYgAigCkAJHDQBBgIDEACEGDAMLIAIgBkEBajYCjAIgBi0AACIKwEF/Sg0BIAIgBkECajYCjAIgBi0AAUE/cSEPIApBH3EhKwJAIApB3wFLDQAgK0EGdCAPciEKDAILIAIgBkEDajYCjAIgD0EGdCAGLQACQT9xciEPAkAgCkHwAU8NACAPICtBDHRyIQoMAgsgAiAGQQRqNgKMAiAPQQZ0IAYtAANBP3FyICtBEnRBgIDwAHFyIQoLQYCAxAAhBiAKQYCAxABGDQELIAohBiAKQQpGDQMLIAIgBjYCiAILIAJByAFqIAEQyxUgBEF/Rg0CAkAgAigCiAIiAUGBgMQARw0AIAIgHxDODSIBNgKIAgsgBEEBaiIEIQUgAUGAgMQARw0DDAILIAIpAuwBITogAigC6AEhASACKALIASACKALMARCyIyACKAKMASACKAKQARDrISApICoQpB4gAUGAgICAeEYNCCACIAE2AqwBIAIgOjcCsAEgAkIANwLgASACIB02AtwBIAIgHDYC2AEgAiAdNgLUASACIBw2AtABIAIgDTYCzAEgAiAJNgLIASACQegBaiACQcgBahDYBSA6QiCIpyEFIDqnISsCQAJAIAIoAugBQYGAgIB4Rg0AIAJB4AJqIAJByAFqEMIUQQEhBEEgIQogAkEQaiACKALgAkEBaiIBQX8gARsiAUEEIAFBBEsbQQRBIBCBGCACKAIQIQEgAigCFCILIAIpAoACNwIYIAsgAikC+AE3AhAgCyACKQLwATcCCCALIAIpAugBNwIAIAJBATYC2AIgAiALNgLUAiACIAE2AtACIAIgAikC4AE3A6ACIAIgAikC2AE3A5gCIAIgAikC0AE3A5ACIAIgAikCyAE3A4gCAkADQCACQeACaiACQYgCahDYBSACKALgAkGBgICAeEYNAQJAIAQgAigC0AJHDQAgAkGMAWogAkGIAmoQwhQgAkHQAmogBCACKAKMAUEBaiIBQX8gARtBBEEgENoaIAIoAtQCIQsLIAsgCmoiASACKQLgAjcCACABIAIpAvgCNwIYIAEgAikC8AI3AhAgASACKQLoAjcCCCACIARBAWoiBDYC2AIgCkEgaiEKDAALCyACIAIpAtACNwO4ASACIAIoAtgCIio2AsABIAIoArwBIQ8MAQtBACEqIAJBADYCwAEgAkKAgICAwAA3A7gBQQQhDwsgDyAqQQV0aiERICsgBUEUbGohLEEAISkgKyEEA0ACQAJAIAQgLEYNAEEAIRAgDyEKA0AgCiIBIBFGDQIgAUEQaigCACELIARBEGooAgAhBQJAIAFBDGooAgAiBiAEQQxqKAIAIhJJDQAgAUEgaiEKIAsgBmogBSASak0NAQsgAUEgaiEKIBAgEiAFIAYgCxCUFmohEAwACwsDQAJAAkACQAJAAkACQAJAAkAgKyAsRg0AIClFDQVBACEtIAJBADYC2AIgAkKAgICAEDcC0AIgK0EQaiIGKAIAICtBDGoiEigCACIuaiEvIA8gKkEFdGohBSAPIQQDQAJAIAQiASAFRw0AQQMhAQwGCyABQSBqIQQgEigCACILIAYoAgAiECABQQxqKAIAIgogAUEQaigCACIREJQWRQ0AAkACQAJAIAogC08NAAJAIBEgCmoiESALSQ0AIBEgECALak0NAwsgLUEBaiEtAkAgCiAuTw0AIBEgL0sNAgsgAkHQAmpBIBDLFQwDCyAeIAEvARw7AQggHiABKQIUNwIAIB8gASkCFDcCACAfIAEvARw7AQggAiAXNgKIAiACQegBaiACQYgCahDTEyACQdACaiACKALsASIEIAIoAvABEK8cIAIoAugBIAQQsiMgAkHoAWogACgCABD3HCACQcgBaiACKALsASIEIAIoAvABQQAgKSAtayIKIAogKUsbEMILIB8gAS8BHDsBCCAfIAEpAhQ3AgAgAiACQcgBajYCiAIgAkGMAWogAkGIAmoQ1BMgAkHQAmogAigCkAEiASACKAKUARCvHCACKAKMASABELIjIAIoAsgBIAIoAswBELIjIAIoAugBIAQQsiMgAiAYNgLgAiACQYgCaiACQeACahDTEyACQdACaiACKAKMAiIBIAIoApACEK8cIAIoAogCIAEQsiMMBgsgHiABLwEcOwEIIB4gASkCFDcCACACIBs2AuACIAJBiAJqIAJB4AJqENMTIAJB0AJqIAIoAowCIgEgAigCkAIQrxwgAigCiAIgARCyIwwBCwsgAkHgAmogARCZCCACKALgAiIEIAIoAuQCEOYhIAFBFGohASAEQYCAgIB4Rg0BIB4gAS8BCDsBCCAeIAEpAgA3AgAgAiAaNgLgAiACQYgCaiACQeACahDTEyACQdACaiACKAKMAiIEIAIoApACEK8cIAIoAogCIAQQsiMMAgsgAkG4AWoQuxggAkGsAWoQ0hggJSAoEOYhICcgJhCkHiAkIQEMDQsgHiABLwEIOwEIIB4gASkCADcCACACIBk2AuACIAJBiAJqIAJB4AJqENMTIAJB0AJqIAIoAowCIgQgAigCkAIQrxwgAigCiAIgBBCyIwsgAkHoAWogACgCABD3HCACQcgBaiACKALsASIEIAIoAvABQQAgKSAtayIKIAogKUsbEMILIB4gAS8BCDsBCCAeIAEpAgA3AgAgHyABKQIANwIAIB8gAS8BCDsBCCACIAJByAFqNgKIAiACQYwBaiACQYgCahDUEyACQdACaiACKAKQASIBIAIoApQBEK8cIAIoAowBIAEQsiMgAigCyAEgAigCzAEQsiMgAigC6AEgBBCyIyACIBg2AuACIAJBiAJqIAJB4AJqENMTIAJB0AJqIAIoAowCIgEgAigCkAIQrxwgAigCiAIgARCyIwtBASEBCyACKALUAiEEAkACQCACKALYAiIKQRBJDQAgBCAKEMwGIQQMAQsgBCAKEPocIQQLIAJBiAJqQdDjmgFBAUEAICkgBGsiBCAEIClLGyABahDCCyACQQI2AuwCIAJBAjYC5AIgAiACQYgCajYC6AIgAiACQdACajYC4AIgAkH0AGpBgICAASACQeACahCzIyEBIAIoAogCIAIoAowCELIjIAIoAtACIAIoAtQCELIjIAENAQsgK0EUaiEwICsoAgghBCArKAIEIQEgAkEAOgCAAyACQQA2AvwCIAIgIzYC+AIgAiABIARqIgQ2AvQCIAIgATYC8AIgAkIANwLoAiACIAQ2AuQCIAIgATYC4AICQANAIAJB4AJqEM4NIgRBgIDEAEYNASAiEM4NIgFBgIDEAEYNASAhIAEQrAghAQJAIARBCUYNACACQfQAaiAEEMsVDAELA0AgAUUNASACQfQAakEgEMsVIAFBf2ohAQwACwsLIAJB9ABqQQoQyxUgAkEANgKQAiACQoCAgIDAADcCiAIgAkEANgLoAiACQoCAgIDAADcC4AICQAJAAkACQCAqDQBBBCExQQAhMkEAITNBBCE0QQAhNUEAISoMAQtBBCESA0ACQCArQQxqIhAoAgAiBCArQRBqIi0oAgAiCyAPQQxqKAIAIgogD0EQaigCACIFEPETRQ0AQQAhBiACQeACaiEBAkAgCiAESQ0AIAUgCmogCyAEaksNAEEBIQYgAkGIAmohAQsCQCABKAIIIgQgASgCAEcNACABEJUaIAIoAowCIRILIBIgAigC5AIgBhsgBEECdGogDzYCACABIARBAWo2AggLIA9BIGohDyAqQX9qIioNAAsgAigCwAEhKiACKAK8ASEPIAIoAugCITUgAigC5AIhNCACKALgAiEzIAIoAowCITEgAigCiAIhMiACKAKQAiIuRQ0AIAAgAkH0AGogKSAQKAIAIC0oAgAgDyAqQQAQ4wUNAkEAIQQgAkEANgK0AiACQoCAgIAQNwKsAiACQQhqIC5BBEEIEIEYIAJBADYCwAIgAiACKAIMIjY2ArwCIAIgAigCCCIKNgK4AiAuQQJ0IQtBACEBAkAgLiAKTQ0AIAJBuAJqQQAgLkEEQQgQ2hogAigCvAIhNiACKALAAiEBCyAxIAtqITcgASAuaiE4IDYgAUEDdGohBSAxIQYDQCAGKAIAIgEoAhAhCyAEIAAoArgBICsgASgCDCISQQEQpQoiCiAEIApLGyEKAkACQCABKAIQDQAgCkEBaiELDAELIApBAWoiESAAKAK4ASArIAsgEmpBABClCiILIBEgC0sbIQsLIAJBjAFqIBYoAgAQ9xwgAkHQAmogAigCkAEiLyACKAKUASALIApqQQF2IhIgCmsQwgsgFCERAkAgASgCEEUNACACQeACaiABEJkIIAIoAuACIhEgAigC5AIQ5iEgFiAVIBFBgICAgHhGGyERCyACIBEoAgA2AtwCIAJB6AFqIBYoAgAQ9xwgAkHIAWogAigC7AEiESACKALwASALIBJBf3NqEMILICBBACAKIARrIjkgOSAKSxtB7MGBARDqHiACQQI2AoQDIAJBAzYC/AIgAkECNgL0AiACQQE2AuQCIAJB5LeYATYC4AIgAiACQcgBajYCgAMgAiACQdwCajYC+AIgAiACQdACajYC8AIgAkHEAmpB/MGBASACQeACahDpHiACKALIASACKALMARCyIyACKALoASARELIjIAIoAtACIAIoAtQCELIjIAIoAowBIC8QsiMgHyABLwEcOwEIIB8gASkCFDcCACACIAJBxAJqNgKIAiACQeACaiACQYgCahDUEyACQawCaiACKALkAiIBIAIoAugCEK8cIAIoAuACIAEQsiMgAigCxAIgAigCyAIQsiMgBUEEaiASNgIAIAUgBjYCACALIAQgCyAESxshBCAGQQRqIQYgBUEIaiEFIC5Bf2oiLg0ACyACKAK4AiEFIAJBAjYC5AIgAiACQawCajYC4AIgAkH0AGpBnLaBASACQeACahCzIw0BA0ACQAJAIDEgN0YNACACQeACaiA3QXxqIjcoAgAQ7wsgAigC4AJBgICAgHhGDQIgAigC5AIhAQJAAkAgAigC6AIiBEEBRw0AIAAgAkH0AGogECgCACAtKAIAICkgDyAqIAAgNiA4IDcoAgAgASgCBCABKAIIQQAQ6QQNAQwDCyAEQQxsIQRBASEKA0AgBEUNAyAEQXRqIQQgACACQfQAaiAQKAIAIC0oAgAgKSAPICogACA2IDggNygCACABKAIEIAEoAgggChDpBCELIAFBDGohAUECIQogC0UNAAsLIAJB4AJqENEYDAQLIAUgNkEEQQgQ1RMgAigCrAIgAigCsAIQsiMMAgsgAkHgAmoQ0RgMAAsLIDQgNUECdGohCyA0IQEDQCABIAtGDQQgAkHgAmogASgCACIEEJkIIAIoAuACIgogAigC5AIQ5iEgAUEEaiEBIApBgICAgHhGDQAgBEEQaigCACAEQQxqKAIAIhJqIgYgK0EMaiIFKAIAIgpJDQAgBiArQRBqIhEoAgAgCmpLDQAgEiAKTw0AIAJBiAJqIAQQ7wsCQAJAIAIoAogCQYCAgIB4Rg0AIAIoAowCIQoCQAJAAkACQCACKAKQAiISDgIAAgELQbq4gQFB2gBBlLmBARDsGwALIAAgAkH0AGogKSAFKAIAIBEo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ICggCzYCCCAoIEk3AwAgAy0AICELAkACQCADKAIcIgENAEEAIQYMAQtBFBCKASIGRQ0LIAEpAgwhRyACQcAAaiABKAIEIAEoAggQnAkgBiBHNwIMIAYgAigCSDYCCCAGIAIpAkA3AgALIAMtACFBCHQgKkGAgHxxIAtyciILISogKyEVDB4LIAMoAjQhLCADKAIwIS0gAkHAAGogA0EIahC2ASACIBIvAAA7ARAgAiASLQACOgASIAIpA0giR0IgiKchGyACLQBcIRUgAigCWCELIAIoAlQhBiACKAJQIQcgAigCRCEIIAIoAkAhCiACKAJgIS4gAigCZCEvIEenISgMHQsgA0EIaigCACEYIAMoAhQhGyADKAIQISggAkHAAGogA0EMaigCACIIQQhB0AAQhQ8gAigCRCEEIAIoAkBBAUYNCSACKAJIIQoCQCAERQ0AIAhB0ABsIRlBACEGIAQhFQNAIBkgBkYNAQJAAkACQAJAIBggBmoiASkDACJHp0F+akECIEdCAVYbDgMAAQIACyABQRxqKAIAIQcgAUEYaigCACEWIAFBLGooAgAhMCABQShqKAIAITECQAJAIAFBCGopAwBCAVINAAJAIAFBEGopAwAiSUIDg0IAUg0AIEmnIgsgCygCACILQQFqNgIAIAtBf0wNKgsgAUEgaikDACJHpyEyAkAgR1ANACBHQgODUEUNACAyIDIoAgAiAUEBajYCACABQX9MDSoLIEdCKIinITMgR0IgiKchNCBJpyELQgEhRwwBCyABQRBqKQMAIkmnIQsgAUEgaigCACEyAkAgSUIDg0IAUg0AIAsgCygCACIXQQFqNgIAIBdBf0wNKQsgAUEkai0AACE0QgAhRwsgB0EIdiE1IElCIIinIRdCAiFJDAILIAFBGGooAgAhFiABQRRqKAIAIRcgAUEQaigCACELAkAgAUEIaikDACJHQgODQgBSDQAgR6ciByAHKAIAIgdBAWo2AgAgB0F/TA0nCyABQRxqLQAAIQdCAyFJDAELIAFBFGooAgAhByABQRBqKAIAIQsgAUHEAGooAgAhNiABQcAAaigCACE3AkACQCBHQgFSDQACQCABQQhqKQMAIkdCA4NCAFINACBHpyIWIBYoAgAiFkEBajYCACAWQX9MDSgLAkAgAUEYaikDACJMUA0AIExCA4NQRQ0AIEynIhYgFigCACIWQQFqNgIAIBZBf0wNKAsgB61CIIYgC62EIUhCASFJDAELIAFBGGo1AgAhSQJAIAFBCGopAwAiR0IDg0IAUg0AIEenIhYgFigCACIWQQFqNgIAIBZBf0wNJwsgTEKAgICAgGCDIEmEIAFBHGoxAABCIIaEIUwgB61CIIYgC62EIUhCACFJC0ECITICQCABQSBqKQMAIktCAlENACABQTRqKAIAITggAUEwaigCACE5AkACQCBLQgFSDQACQCABQShqKQMAIktCA4NCAFINACBLpyIHIAcoAgAiB0EBajYCACAHQX9MDSkLQQEhMiABQThqKQMAIk1QDQEgTUIDg1BFDQFBASEyIE2nIgcgBygCACIHQQFqNgIAIAdBf0oNAQwoCyABQThqNQIAIU4CQCABQShqKQMAIktCA4NCAFINACBLpyIHIAcoAgAiB0EBajYCACAHQX9MDSgLIE1CgICAgIBggyBOhCABQTxqMQAAQiCGhCFNQQAhMgsgS0IgiKchOiBLpyE7CyBMQiiIpyE1IExCIIinIQcgSEIgiKchFyABQcgAai0AACE8IEynIRYgSKchC0EAITNBACE0IDohMCA7ITELIAogBmoiASBJNwMAIAFByABqIDw6AAAgAUHEAGogNjYCACABQcAAaiA3NgIAIAFBOGogTTcDACABQTRqIDg2AgAgAUEwaiA5NgIAIAFBLGogMDYCACABQShqIDE2AgAgAUEcaiA1QQh0IAdB/wFxcjYCACABQRhqIBY2AgAgAUEIaiBHNwMAIAFBEGogF61CIIYgC62ENwMAIAFBIGogM61CKIYgNK1C/wGDQiCGhCAyrYQ3AwAgBkHQAGohBiAVQX9qIhUNAAsLQQAhBkEAIQcCQCADKAIYIgFFDQBBGBCKASIHRQ0LIAEoAgwhCyABKAIIIRUCQCABKQMAIklCA4NCAFINACBJpyIWIBYoAgAiFkEBajYCACAWQX9MDSQLAkAgASkDECJHUA0AIEdCA4NCAFINACBHpyIBIAEoAgAiAUEBajYCACABQX9MDSQLIAcgRzcDECAHIAs2AgwgByAVNgIIIAcgSTcDAAsgAy0AICELAkAgAygCHCIBRQ0AQRQQigEiBkUNDCABKQIMIUcgAkHAAGogASgCBCABKAIIEJwJIAYgRzcCDCAGIAIoAkg2Aggg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AgsgAigCjAIiA0UNASADQThsIQUgAigCiAIhAwNAAkACQAJAAkAgAygCAA4DAAECAAsgA0EoaigCACACQbgCahDPBQwCCyACKAK4AiACKAK8AiADQRBqEOQIDAELIANBBGooAgAgAkG4AmoQzwULIANBOGohAyAFQUhqIgUNAAwCCwsgAigChAIgAkG4AmoQowwLAkAgAigCsAIiA0UNACADIAJB4ABqEL4BCyACIAIpA7ACIh43A/gBIAIgAikDqAIiHzcD8AEgAiACKQOgAiIgNwPoASACIAIpA5gCIiE3A+ABIAIgAikDkAIiIjcD2AEgAiACKQOIAiIjNwPQASACIAIpA4ACIiQ3A8gBIAcgHjcDMCAHIB83AyggByAgNwMgIAcgITcDGCAHICI3AxAgByAjNwMIIAcgJDcDACATQQFqIhMgFEcNAAsgAigCgAEhAwtBHBCKASEHIAMNCCAHRQ0PIAdCADcCCCAHQoCAgICAATcCACAHQgA3AhAgB0EAOwEYIAIoAjQhAyACIAc2AjQgAy0AGCEFIAMtABkhEyADKAIUIRcgAygCECEYIAMoAgwhG0EcEIoBIgdFDRAgByAWNgIAIAcgEzoAGSAHIAU6ABggByAXNgIUIAcgGDYCECAHIBs2AgwgByAUNgIIIAcgFTYCBCACKAIoQQlGDQYgAkEoahCeBgwHCyACKAJcIRMgAigCWCEUIAIpA4ABIR8gAikDiAEhICALQgA3AwAgC0IANwAFIAIpA3ghISACQgE3A3ggAiAgNwOQAiACIB83A4gCIAIgITcDgAJBwAAQigEiB0UNCiAHQgA3AiAgB0KAgICAwAA3AhggB0IINwIQIAdCADcCCCAHQoCAgIDAADcCACAHQgA3AiggB0IANwIwIAdCADcANSACIAIpA4ACIh83A8gBIAIgAikDiAIiIDcD0AEgAiACKQOQAiIhNwPYASACLQBUIRUgCiAhNwIQIAogIDcCCCAKIB83AgACQAJAIAIoAihBCUYNACACQShqEJ4GDAELIBEQtwQLIBAgAikCkAE3AgAgECACKQKYATcCCCAQIAIpAqABNwIQIBAgAigCqAE2AhggAkEANgIwIAJBATYCKCACIBM2AlwgAiAUNgJYIAIgFToAVCACIAU2AlAgAw0BIB6nIgMgAygCACIFQX9qNgIAIAVBAUcNASADIAMoAhAQ8B4MAQsgAi0AjAEhG0HAABCKASIHRQ0KIAdCgICAgMAANwIAIAdCADcCICAHQoCAgIDAADcCGCAHQgg3AhAgB0IANwIIIAdCADcCKCAHQgA3AjAgB0IANwA1IAItAFQhHAJAAkAgAigCKEEJRg0AIAJBKGoQngYMAQsgERC3BAsgAiAcOgBcIAIgBTYCWCACIBs6AFQgAiADNgJQIAIgFzYCTCACIBg2AkggAiAfNwNAIAJBADYCOCACQRE2AjAgAkEJNgIoQdAAEIoBIgNFDQsgAyACKQOIATcDGCADIAIpA4ABNwMQIAMgAikDeDcDCCALQgA3AwAgC0IANwAFIANCADcDQCADIBY6ADwgAyATNgI4IAMgFDYCNCADIBU2AjAgAyAeNwMoIANCADcDICADQgA3AwAgA0EAOgBIIAJCATcDeAJAIAIoAmgiEyACKAJgRw0AIAJB4ABqEMAaCyACKAJkIBNBOGxqIgVCADcCGCAFIBo2AhQgBSAZNgIQIAVBATYCDCAFIAM2AgggBUKCgICAEDcDACAFQQA6ACAgAiATQQFqNgJoCyAHEKINIAIpA3giHkIDg0IAUg0XIB6nIgcgBygCACIDQX9qNgIAIANBAUcNFyAHIAcoAhAQ8B4MFwsgDCACKQOAAjcCACAMIAIpA4gCNwIIIAwgAikDkAI3AhAgAi0AVCEDIAIoAlwhBSACKAJYIRMCQAJAIAIoAihBCUYNACACQShqEJ4GDAELIBEQtwQLIBAgAikCrAE3AgAgECACKQK0ATcCCCAQIAIpArwBNwIQIBAgAigCxAE2AhggAkEBNgIwIAJBATYCKCACIAU2AlwgAiATNgJYIAIgAzoAVCACIBQ2AlAgBw0WIB6nIgcgBygCACIDQX9qNgIAIANBAUcNFiAHIAcoAhAQ8B4MFgsgERC3BAsgAiAYOgBcIAIgFDYCWCACIBs6AFQgAiAHNgJQIAIgFjYCTCACIBc2AkggAiAfNwNAIAJBATYCOCACQRE2AjAgAkEJNgIoQdAAEIoBIgdFDQggByACKQOQAjcDGCAHIAIpA4gCNwMQIAcgAikDgAI3AwggB0IANwNAIAcgFToAPCAHIAM2AjggByAFNgI0IAcgEzYCMCAHIB43AyggB0IANwMgIAdCADcDACAHQQA6AEgCQCACKAJoIgUgAigCYEcNACACQeAAahDAGgsgAigCZCAFQThsaiIDQgA3AhggAyAaNgIUIAMgGTYCECADQQE2AgwgAyAHNgIIIANCgoCAgBA3AwAgA0EAOgAgIAIgBUEBajYCaAwUCyARELcECyACIBo2AlwgAiAZNgJYIAIgBzYCNCACQQI2AjAgAkEBNgIoIANBBGoiBygCACADQQhqKAIAEPwaIAMoAgAgBygCABD4IyADQRxBBBDcFCACKAJ8IAIoAoABEOcIIAIoAnggAigCfBD5IwwSCyAHRQ0IIAdCADcCCCAHQoCAgICAATcCACAHQgA3AhAgB0EAOwEYIAIoAjQhAyACIAc2AjQgAy0AGCEFIAMtABkhEyADKAIUIRcgAygCECEYIAMoAgwhG0EcEIoBIgdFDQkgByAWNgIAIAcgEzoAGSAHIAU6ABggByAXNgIUIAcgGDYCECAHIBs2AgwgByAUNgIIIAcgFTYCBAJAAkAgAigCKEEJRg0AIAJBKGoQngYMAQsgERC3BAsgAiAHNgI8IAJBAjYCOCACQRE2AjAgAkEJNgIoIANBBGoiBygCACADQQhqKAIAEPwaIAMoAgAgBygCABD4IyADQRxBBBDcFCACIAIoAoABNgKIAiACIAIpAng3A4ACAkAgAigCaCIDIAIoAmBHDQAgAkHgAGoQwBoLIAIoAmQgA0E4bGoiByACKQOAAjcCBCAHQQI2AgAgByACKAKIAjYCDCAHQgA3AxggByAaNgIUIAcgGTYCECAHQQA6ACAgAiADQQFqNgJoDBELQQRBwAAQoiQAC0EEQcgAEKIkAAtBBEHAABCiJAALQQRBwAAQoiQAC0EIQdAAEKIkAAtBCEHQABCiJAALQQRBHBCiJAALQQRBHBCiJAALQQRBHBCiJAALQQRBHBCiJAALAAsgEiAOEKwGGgwFCyACKAIsIAJB4ABqEL4BDAQLIBIgAigCLEEoahCsBhoMAwsgAigCOCIHRQ0CENoiIAdBCGooAgAiA0UNAiADQQxsIQMgB0EEaigCACEHA0ACQAJAIAcoAgAiBQ0AIAJB4ABqIAdBBGooAgAQ+gIMAQsgBSACQeAAahC+AQsgB0EMaiEHIANBdGoiAw0ADAMLCyACKAIsIAJB4ABqEL4BDAELAkACQCACKAIwDgMAAQIACyACQeAAaiAOEPYIDAELAkAgAi0ATEECRg0AIBIgDhCsBhoLAkAgAigCUCIUQQhqKAIAIgdFDQAgFEEEaigCACIFIAdBBnRqIRMDQAJAIAVBOGooAgAiB0UNACAHQQxsIQMgBUE0aigCACEHA0AgBygCACACQeAAahC+ASAHQQxqIQcgA0F0aiIDDQALCyAFIAJB4ABqEP0MIAVBwABqIgchBSAHIBNHDQALCyAUQRhqIQUCQCAUQRRqKAIAIgdFDQAgB0EMbCEDIBRBEGooAgAhBwNAIAcoAgAgAkHgAGoQvgEgB0EMaiEHIANBdGoiAw0ACwsgBSgCAEGAgICAeEYNACACQeAAaiAFEJsGCyACIAIpA1g3A7ACIAIgAikDUDcDqAIgAiACKQNINwOgAiACIAIpA0A3A5gCIAIgAikDODcDkAIgAiACKQMwNwOIAiACIAIpAyg3A4ACAkAgAigCFCIDIAIoAgxHDQAgAkEMahDAGgsgAigCECADQThsaiIHIAIpA5ACNwMQIAcgAikDiAI3AwggByACKQOAAjcDACAHIAIpA5gCNwMYIAcgAikDoAI3AyAgByACKQOoAjcDKCAHIAIpA7ACNwMwIAIgA0EBajYCFCACKAJkIQUgAkEMaiACKAJoIgcQqx8gAigCFCEDAkAgB0UNACAHQThsIhNFDQAgAigCECADQThsaiAFIBP8CgAACyACQQA2AmggAiADIAdqNgIUIAIoAmAgAigCZBD4IyAGIQcgBiAIRw0ACwsgAkEYahCHGiAAKAIEIQQgAkEMaiAAKAIIIgcQqx8gAigCFCEDAkAgB0UNACAHQThsIgVFDQAgAigCECADQThsaiAEIAX8CgAACyAAQQA2AgggAiADIAdqNgIUIAEoAgQiByABKAIIEKUfIAEoAgAgBxD4IyABIAIoAhQ2AgggASACKQIMNwIAIAJBwAJqJAAPCyAEIAIoAogCEP4gAAubOgIbfwZ+IwBBwARrIgQkAAJAAkAgA0ESELEKIgVFDQAgAEGBgICAeDYCkAEgACAFNgIADAELAkAgAy0AuAEiBUFbaiIGQRJLDQBBASAGdEGDgBpxRQ0AIANBsAFqIQUCQCADKAJoIAMoArABIgZGDQAgAyAGNgJoIAMgAygCZCAGIAMoAmxrIgZrNgJcIAMgAygCYCAGajYCWAsgBEGIAmogAxDIBCAFIAQoApACNgIIIAUgBCkCiAI3AgAgAy0AuAEhBQsCQAJAAkAgBUH/AXFBE0YNACADIAMoAngiBUH/v39xNgJ4IARBiAJqIAMQgQMgAyAFNgJ4IAQoAogCIQYgBC0AtAIiB0EGRw0BIABBgYCAgHg2ApABIAAgBjYCAAwDCyADKAKwASEGIAMoArQBIQUgBEGIAmogAxD4ASADIAU2AqwBIAMgBjYCqAEgAyAEKQKIAjcCsAEgAyAEKAKQAjYCuAEgBEGwAWogAxCRAiADKAKwASEHAkACQCADQTwQsQoiBg0AIANBsAFqIQYCQCADLQC4ASIIQVtqIglBEksNAEEBIAl0QYOAGnFFDQACQCADKAJoIAMoArABIghGDQAgAyAINgJoIAMgAygCZCAIIAMoAmxrIghrNgJcIAMgAygCYCAIajYCWAsgBEGIAmogAxDIBCAGIAQoApACNgIIIAYgBCkCiAI3AgAgAy0AuAEhCAsgBEETOgBQIAhB/wFxQRNGDQEgAygCtAEhBSADKAKwASEGIARBuANqIAgQyCUgBEGPAq1CIIYgBEHQAGqthDcDICAEQYgCakHNlYABIARBIGoQshAgBCAEKQK4AzcClAIgBCAEKALAAzYCnAIgBiAFIARBiAJqEMYbIQYgAy0AuAFBogFHDQAgAxDLFCEFIAMQtRAgAyAFEJEJCyAAQYGAgIB4NgKQASAAIAY2AgAgBEGwAWoQjREgBCgCsAEgBCgCtAEQ9SMMAwsCQCACQQFxDQAgAygCsAEhCSADKAK0ASEIIARBiAJqIAMQ+AEgAyAINgKsASADIAk2AqgBIAYgBCkCiAI3AgAgBiAEKAKQAjYCCAwCCwJAAkAgAygCiAEiCEELRw0AIARBiAJqIAMQxAEMAQsgA0ELNgKIASAEIAMpApgBNwOIAiAEIAMoAqABNgKQAiADQYwBaiEJAkAgAygCCEEKRg0AIANBCGoQwAsLIAMgCDYCCCADIAkpAgA3AgwgAyAJKAIINgIUCyADIAMoArQBIgg2AqwBIAMgAygCsAE2AqgBIAYgBCkDiAI3AgAgBiAEKAKQAjYCCAwBCyAEIAQpAqwCNwJEIAQgBCkCpAI3AjwgBCAEKQKcAjcCNCAEIAQpApQCNwIsIAQgBCkCjAI3AiQgBCAELwC1AjsATSAEIAQtALcCOgBPIAQgBzoATCAEIAY2AiBBACEKAkAgAy0AgQFBIHFFDQAgAy0AuAFB/wFxQRJHDQAgA0EIaiELQQohDCADKAIYIQ0gAygCBCEOIAMoAgAhDyADLQAcIRACQCADKAIIQQpGDQAgBEGIAmogCxCVBiAEIAQpAowCNwOwASAEIAQoApQCNgK4ASAEKAKIAiEMC0EAIQdBACEIAkAgAygCIEGAgICAeEYNACADKAI0IQggAygCKCEHCyADKAJoIREgAy0AHSESIANBiAFqIQZBCyEJAkAgAygCiAEiE0ELRg0AIANBmAFqIRRBCiEJAkAgE0EKRg0AIARBiAJqIAYQlQYgBCAEKQKMAjcDUCAEIAQoApQCNgJYIAQoAogCIQkLIAQgBCkDUDcDuAMgBCAEKAJYNgLAAyAEIBQoAgg2AswDIAQgFCkCADcCxAMLIAQgDDYCkAIgBCAONgKMAiAEIA82AogCIAQgBCkDsAE3ApQCIAQgBCgCuAE2ApwCIAQgETYCtAIgBCAINgKsAiAEIAc2AqgCIAQgEjoApQIgBCAQOgCkAiAEIA02AqACIAQgAygCrAEiDjYC3AIgBCADKAKoASIPNgLYAiAEIAU2ArACIAQgCTYCuAIgBCADKAK4ATYC6AIgBCADKQOwATcD4AIgBCAEKQO4AzcCvAIgBCAEKQPAAzcCxAIgBCAEKQPIAzcCzAIgBCAEKALQAzYC1AIgAyAFQQFyNgJ4IARBGGogAxCvAyADQbABaiEIIARBuAJqIQcgBEHgAmohDSAEKAIcIQoCQAJAIAQoAhhBAXENAAJAAkAgBigCACIQQQtHDQAgBEG4A2ogAxDEAQwBCyADQQs2AogBIAQgAykCmAE3A7gDIAQgAygCoAE2AsADIANBjAFqIRECQCADKAIIQQpGDQAgCxDACwsgAyAQNgIIIAMgESkCADcCDCADIBEoAgg2AhQLIAMpA7ABIR8gCCAEKQO4AzcCACAIIAQoAsADNgIIIAMgHzcDqAEgCg0BIAMgBEGIAmoQywggCCANKAIINgIIIAggDSkDADcDAAJAIAMoAogBQQ5xQQpGDQAgBhDACwsgAyAONgKsASADIA82AqgBIAYgBykDGDcDGCAGIAcpAxA3AxAgBiAHKQMINwMIIAYgBykDADcDAEEAIQoMAgsgAyAEQYgCahDLCCAIIA0oAgg2AgggCCANKQMANwMAAkAgAygCiAFBDnFBCkYNACAGEMALCyADIA42AqwBIAMgDzYCqAEgBiAHKQMYNwMYIAYgBykDEDcDECAGIAcpAwg3AwggBiAHKQMANwMAIApBCGoQ5gMgCkEgQQgQ3BRBACEKDAELIAMgAygCeEF+cSAFQQFxcjYCeAJAIAxBCkYNACAEQZACahDACwsgCUEOcUEKRg0AIAcQwAsLIARBiAJqQQhBCEHYABCFDyAEKAKMAiEFAkAgBCgCiAJBAUYNACAEIAQoApACIhA2AoABIAQgBTYCfCADQawBaiEVIANBDGohCyADQQhqIRYgA0GYAWohEyADQYwBaiEUIANBsAFqIQZBjwKtQiCGIiBB//SaAa2EISEgBEGIAmpBDGohFyAEQZwDaiEYIARBiAJqQSRqIRlBACEIAkACQANAIAQgCDYChAECQCADLQC4ASIFQVtqIgdBEksNAEEBIAd0QYOAGnFFDQACQCADKAJoIAMoArABIgVGDQAgAyAFNgJoIAMgAygCZCAFIAMoAmxrIgVrNgJcIAMgAygCYCAFajYCWAsgBEGIAmogAxDIBCAGIAQoApACNgIIIAYgBCkCiAI3AgAgAy0AuAEhBQsCQAJAAkACQAJAAkACQAJAAkACQCAFQf8BcSIHQXBqDgQBAAABAAsCQAJAAkACQCAHQQJHDQACQAJAIAMoAogBIgVBC0cNACAEQYgCaiADEMQBDAELIANBCzYCiAEgBCATKQIANwOIAiAEIBMoAgg2ApACAkAgAygCCEEKRg0AIBYQwAsLIBYgBTYCACALIBQpAgA3AgAgCyAUKAIINgIICyADKQOwASEiIAYgBCkDiAI3AgAgBiAEKAKQAjYCCCADICI3A6gBIAMoArABIQwgA0EcELEKIgUNDCADKAKsASEJIAMtALgBQT5GDQEMCQsgBigCACENAkACQAJAIAdBtX9qIgdBH0sNAEEBIAd0QYGAgpB4cQ0BCyAFQbR/akH/AXFB1ABLDQELIARBiAJqIAMgDRDfASAGIAQoApACNgIIIAYgBCkCiAI3AgALIARBiAJqIAMQ/QcgBCgCiAIhBSAELQCcAkECRg0HIAQoApQCIQcgBCgCkAIhCCAEKAKMAiEJAkACQCADLQC4AUEJRg0AIARBqANqIQwgBEGoBGohDiAEQfABaiEPIARBuANqIRBBACEaQQAhGwwBCwJAAkAgAygCiAEiDEELRw0AIARBiAJqIAMQxAEMAQsgA0ELNgKIASAEIBMpAgA3A4gCIAQgEygCCDYCkAICQCADKAIIQQpGDQAgFhDACwsgFiAMNgIAIAsgFCkCADcCACALIBQoAgg2AggLIAMpA7ABISIgBiAEKQOIAjcCACAGIAQoApACNgIIIAMgIjcDqAECQAJAAkAgAy0AuAEiDkG1f2oiDEEfSw0AQQEgDHRBgYCCkHhxDQELIA5BtH9qQf8BcUHUAEsNAQsgBEGIAmogAyADKAKwARDfASAGIAQoApACNgIIIAYgBCkCiAI3AgALIARBiAJqIAMQ/QcCQCAELQCcAkECRw0AIAQoAogCIQMCQCAFQQNxRQ0AIAMhBQwKCyAFIAUoAgAiBkF/ajYCAAJAIAZBAUYNACADIQUMCgsgBSAFKAIQEPAeIAMhBQwJCyAEIAg2ArgDIAQgBzYC8AEgBCAEKAKIAjYCqAQgBCAEKAKMAjYCqAMgBEHkAWohDCAEQegBaiEOIARB7AFqIQ8gBEG4BGohECAJIRogBSEbIAQoApACIQUgBCgClAIiByEJIA0hCAsgECAFNgIAIA8gCTYCACAOIAg2AgAgDCAHNgIAIAQgBCgCuAM2ArgBIAQgBCgC8AE2ArwBIAQgBCgCqAQ2AsABIAQgBCgCqAM2AsQBIAQgBCgCuAQ2AsgBIAQgBCgC7AE2AswBIAQgBCgC6AE2AtABIAQgGq1CIIYgG62EIiI3A7ABIAQgBCgC5AE2AtQBIAMgAygCeCIIQf//eXE2AngCQCADLQC4AUEXRg0AQQQhDiAcIQkgHSEMIB4hBwwDCyAEQYgCaiADEOMBIAYgBCgCkAI2AgggBiAEKQKIAjcCAAJAAkACQAJAIAMtALgBIgVBfmoOEQIBAQEBAQEBAQEBAQEBAQEDAAsgBUHAAEYNBAsgAygCtAEhBSADKAKwASEGIARB1oCAgHg2AogCIAYgBSAEQYgCahDGGyEFIAMtALgBQaIBRw0IIAMgAxCGDhCRCQwICyADKAKwASERAkACQCADKAKIASIFQQtHDQAgBEGIAmogAxDEAQwBCyADQQs2AogBIAQgEykCADcDiAIgBCATKAIINgKQAgJAIAMoAghBCkYNACAWEMALCyAWIAU2AgAgCyAUKQIANwIAIAsgFCgCCDYCCAsgAykDsAEhIyAGIAQpA4gCNwIAIAYgBCgCkAI2AgggAyAjNwOoAQJAAkACQAJAAkAgAy0AuAFBA0YiBQ0AIARBEGogAxC4AyAEKAIUIQkgBCgCEEEBcUUNASAJIQUMDAsgBigCACEJDAELIAMtALgBIgdBA0cNAQsCQAJAIAMoAogBIgdBC0cNACAEQYgCaiADEMQBDAELIANBCzYCiAEgBCATKQIANwOIAiAEIBMoAgg2ApACAkAgAygCCEEKRg0AIBYQwAsLIBYgBzYCACALIBQpAgA3AgAgCyAUKAIINgIICyADIAMoArQBIhI2AqwBIAMgAygCsAE2AqgBIAYgBCkDiAI3AgAgBiAEKAKQAjYCCCAFDQFBASEHIAkhDEEBIQ4MBQsgAygCtAEhBSADKAKwASEGIARBqARqIAcQyCUgBCAhNwO4BCAEQYgCakHNlYABIARBuARqELIQIBcgBCgCsAQ2AgggFyAEKQKoBDcCACAGIAUgBEGIAmoQxhshBQJAIAMtALgBQaIBRw0AIAMgAxCGDhCRCQsgCRCNAiAJQcAAQQgQ3BQMCAsgBEHVgICAeDYCiAIgESASIARBiAJqEMYbIQUgAy0AuAFBogFHDQcgAxDLFCEGIAMQtRAgAyAGEJEJDAcLIAMgAygCeCIFQf+/f3E2AnggBEGIAmogAygCsAFBASADEGUgAyAFNgJ4IAQoAogCIQUgBCgCmAMiDkGBgICAeEYNBiAEKQKkAiEiIAQpApwCISMgBCgCmAIhDyAEKAKUAiEQIAQoApACIQkgBCgCjAIhDCAEQbgDaiAZQewA/AoAACAEIBgoAgg2ArADIAQgGCkCADcDqAMCQCAOQYCAgIB4Rg0AQaABEIoBIgdFDQUgByAiNwIcIAcgIzcCFCAHIA82AhAgByAQNgIMIAcgCTYCCCAHIAw2AgQgByAFNgIAIAdBJGogBEG4A2pB7AD8CgAAIAcgDjYCkAEgByAEKQOoAzcClAEgByAEKAKwAzYCnAFBAiEOIBwhCSAdIQwMAwtBAyEOIBAhESAFIQcgDyESICMhHyAiISQMAgsgAy0AgQFBIHFFDQcgAxD8BCIHRQ0HQQAhBQwICyAEQfABaiADEJYKQQAhDiAEKQOAAiEfIAQoAvwBIRIgBCgC+AEhESAEKAL0ASEJIAQoAvABIQwLIAMgCDYCeCAEIAQpA7ABNwOIASAEIAQpA7gBNwOQASAEIAQpA8ABNwOYASAEIAQpA8gBNwOgASAEIAQpA9ABNwOoASADKAKsASEPIAchHiAMIR0gCSEcDAcLAkAgBCgCfCIFQYCAgIB4Rw0AIBAhBQwKCwJAAkAgAy0AuAFBE0YNACADQRAQsQoiB0UNAQwDCyADKQOwASEfIARBiAJqIAMQ+AEgAyAfNwOoASAGIAQpAogCNwIAIAYgBCgCkAI2AgggAygCsAEhByAEIAQpA0g3A7ACIAQgBCkDQDcDqAIgBCAEKQM4NwOgAiAEIAQpAzA3A5gCIAQgBCkDKDcDkAIgBCAEKQMgNwOIAiAEIAg2AswCIAQgEDYCyAIgBCAFNgLEAiAEQQA6ANACIAQgBzYCvAIgBCABNgK4AiAEIAo2AsACIARB8AFqIAMQkQIgAygCsAEhBwJAIANBPBCxCiIFDQAgBEG4A2ogAxCBAyAEKAK4AyEFIAQtAOQDIghBBkYNACAEIAQpAtwDNwLUASAEIAQpAtQDNwLMASAEIAQpAswDNwLEASAEIAQpAsQDNwK8ASAEIAQpArwDNwK0ASAEIAQvAOUDOwDdASAEIAQtAOcDOgDfASAEIAg6ANwBIAQgBTYCsAECQCADLQC4ASIFQVtqIglBEksNAEEBIAl0QYOAGnFFDQACQCADKAJoIAMoArABIgVGDQAgAyAFNgJoIAMgAygCZCAFIAMoAmxrIgVrNgJcIAMgAygCYCAFajYCWAsgBEG4A2ogAxDIBCAGIAQoAsADNgIIIAYgBCkCuAM3AgAgAy0AuAEhBQsgBEETOgB8AkACQCAFQf8BcUETRg0AIAMoArQBIQYgAygCsAEhByAEQYgBaiAFEMglIAQgICAEQfwAaq2ENwOoBCAEQbgDakHNlYABIARBqARqELIQIAQgBCkCiAE3AsQDIAQgBCgCkAE2AswDIAcgBiAEQbgDahDGGyEFIAMtALgBQaIBRw0BIAMQyxQhBiADELUQIAMgBhCRCQwBCwJAAkAgAkEBcQ0AIAMpA7ABIR8gBEG4A2ogAxD4ASADIB83A6gBIAYgBCkCuAM3AgAgBiAEKALAAzYCCAwBCwJAAkAgAygCiAEiBUELRw0AIARBuANqIAMQxAEMAQsgA0ELNgKIASAEIBMpAgA3A7gDIAQgEygCCDYCwAMCQCADKAIIQQpGDQAgFhDACwsgFiAFNgIAIAsgFCkCADcCACALIBQoAgg2AggLIAMpA7ABIR8gBiAEKQO4AzcCACAGIAQoAsADNgIIIAMgHzcDqAELAkACQCAEQYgCahDLCiIfIARBsAFqEMsKIiRRDQAgH6ciBUEDcSIMQQFGDQEgDCAkpyIJQQNxRw0BIAUpAwggCSkDCFINASAFKAIQIgwgCSgCEEcNASAFQRhqIAlBGGogDBC6GA0BCwJAICRCA4NCAFINACAkpyIDIAMoAgAiBUF/ajYCACAFQQFHDQAgAyADKAIQEPAeCyAEQd0BaiEDAkAgH0IDg0IAUg0AIB+nIgUgBSgCACIJQX9qNgIAIAlBAUcNACAFIAUoAhAQ8B4LIAQgBCkDsAE3A1AgBCAEKQO4ATcDWCAEIAQpA8ABNwNgIAQgBCkDyAE3A2ggBCAEKQPQATcDcCAEIAQoAtgBNgJ4IAQgAy8AADsBqAMgBCADLQACOgCqAyAAIBUoAgA2AgwgACAEKQNQNwMQIAAgBCkDWDcDGCAAIAQpA2A3AyAgACAEKQNoNwMoIAAgBCkDcDcDMCAAIAQoAng2AjggACAELwGoAzsAPSAAIAQtAKoDOgA/IBUgBiACQQFxGygCACEDIABBwABqIARBiAJqQdAA/AoAACAAIAg6ADwgACAHNgIIIAAgAzYCBCAAIAE2AgAgACAEKAL4ATYCmAEgACAEKQLwATcCkAEMEQsgBEG8AWohBSAEQbgBaiEGICQQnB0gHxCcHQJAAkACQCAIQX1qQQEgCEECSxtB/wFxDgMCAAECCyAEQcQBaiEFIARBwAFqIQYMAQsgBEHUAWohBSAEQdABaiEGCyAFKAIAIQUgBigCACEGIARBiAJqEMsKIR8gBEHYgICAeDYCuAMgBCAfNwPAAyAGIAUgBEG4A2oQxhshBSADLQC4AUGiAUcNACADEMsUIQYgAxC1ECADIAYQkQkLIARBsAFqEPwTCyAAQYGAgIB4NgKQASAAIAU2AgAgBEHwAWoQjREgBCgC8AEgBCgC9AEQ9SMgBEGIAmoQvxoMDgsgAxDGECAEQRM6AFACQCADLQC4ASIHQRNGDQAgAygCtAEhBiADKAKwASEJIARBuANqIAcQyCUgBCAgIARB0ABqrYQ3A7ABIARBiAJqQc2VgAEgBEGwAWoQshAgBCAEKQK4AzcClAIgBCAEKALAAzYCnAIgCSAGIARBiAJqEMYbIQcgAy0AuAFBogFHDQIgAxDLFCEGIAMQtRAgAyAGEJEJDAILAkACQCACQQFxDQAgAykDsAEhHyAEQYgCaiADEPgBIAMgHzcDqAEgBiAEKQKIAjcCACAGIAQoApACNgIIDAELIAMQtRAgFSEGCyAAIAQpAyA3A0AgACAEKQMoNwNIIAAgBCkDMDcDUCAAIAQpAzg3A1ggACAEKQNANwNgIAAgBCkDSDcDaCAAIAg2AoQBIAAgEDYCgAEgACAFNgJ8IABBADYCmAEgAEKAgICAgAE3A5ABIABBAToAiAEgACAKNgJ4IAAgATYCcCAAQQY6ADwgACABNgIAIAAgBigCACIDNgJ0IAAgAzYCBAwNC0EIQaABEKIkAAsgAEGBgICAeDYCkAEgACAHNgIAIBAgCBDeGCAFIBAQ+yMgCkUNCCAKEP4bIAooAgAgCkEEaigCABD0IyAKQRRBBBDcFAwICyADIAg2AngCQCAiQgBSDQAgBCkDuAEiH0IDg0IAUg0BIB+nIgMgAygCACIGQX9qNgIAIAZBAUcNASADIAMoAhAQ8B4MAQsgBEGwAWoQ+BILIAQoAoQBIQggBCgCgAEhEAwDCyAEQQhqIAMQgQEgBCgCDCEHIAQoAgghBQsCQCAFQQFxRQ0AIAchBQwCC0EFIQ4gA0EDELEKIgVFDQAgBxCNAiAHQcAAQQgQ3BQMAQsgBCAEKQOoATcDcCAEIAQpA6ABNwNoIAQgBCkDmAE3A2AgBCAEKQOQATcDWCAEIAQpA4gBNwNQAkAgBCgChAEiCCAEKAJ8Rw0AIARB/ABqEMoaCyAEKAKAASIQIAhB2ABsaiIFIA82AiwgBSANNgIoIAUgJDcDICAFIB83AxggBSASNgIUIAUgETYCECAFIAk2AgwgBSAMNgIIIAUgBzYCBCAFIA42AgAgBSAEKQNQNwMwIAUgBCkDWDcDOCAFIAQpA2A3A0AgBSAEKQNoNwNIIAUgBCkDcDcDUCAIQQFqIQgMAQsLIBAgCBDeGCAEKAJ8IBAQ+yMLIABBgYCAgHg2ApABIAAgBTYCACAKRQ0AIAoQ/hsgCigCACAKQQRqKAIAEPQjIApBFEEEENwUCyAEQSBqEPwTDAILIAUgBCgCkAIQ/iAACyAAIAQoArgBNgIIIAAgBCkCsAE3AgAgAEGAgICAeDYCkAEgACAINgIgIAAgBzYCHCAAIAU2AhggACABNgIUIAAgCDYCECAAIAE2AgwLIARBwARqJAALvTkCLH8FfiMAQZADayICJAACQAJAIAEtALgBIgNBAkcNAAJAAkAgASgCiAEiA0ELRw0AIAJBgAFqIAEQxAEMAQsgAUELNgKIASACIAEpApgBNwOAASACIAEoAqABNgKIASABQYwBaiEEAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgAzYCCCABIAQpAgA3AgwgASAEKAIINgIUCyABIAIoAogBNgK4ASABIAEpA7ABNwOoASABIAIpA4ABNwKwASACQYABakEIQQhBOBCFDyACKAKEASEDAkAgAigCgAFBAUYNACABQYgBaiEFIAFBsAFqIQYgAkEANgJMIAIgAigCiAE2AkggAiADNgJEIAFBDGohByABQYwBaiEIIAFBmAFqIQkgAUEIaiEKQY8CrUIghiIuQcLwmgGthCEvIC5Bn7aBAa2EITAgLkHp9JoBrYQhMSACQYABakEMaiELIAJB6AJqQQxqIQwgAkHoAWpBKGohDSACQegCakEEciEOIAJBtAFqIQ8gAkGwAWohECACQdgBaiERIAJBgAFqQQhqIRIgAkHoAWpBDGohEwNAAkACQAJAAkACQCABLQC4ASIDQQNGDQACQAJAAkACQAJAAkAgAw4TAQcHBwcHBwcHBwcHBwcHBwcHAQALIANB4wBHDQZBCiEUIAEoAhghFSABKAIEIRYgASgCACEXIAEtABwhGAJAIAEoAggiGUEKRg0AIAJB6AJqIAoQlQYgAiAOKQIANwNwIAIgDigCCDYCeCACKALoAiEUCyABKAJoIRogASgCeCEDIAEtAB0hG0EAIRxBACEdAkAgASgCIEGAgICAeEYNACABKAI0IR0gASgCKCEcC0ELIR4CQCAFKAIAIgRBC0YNAEEKIR4CQCAEQQpGDQAgAkHoAmogBRCVBiACIA4pAgA3A9gCIAIgDigCCDYC4AIgAigC6AIhHgsgEyAJKAIINgIIIBMgCSkCADcCACACIAIpA9gCNwPoASACIAIoAuACNgLwAQsgCyACKQNwNwIAIAsgAigCeDYCCCACIBQ2AogBIAIgFjYChAEgAiAXNgKAASACIBo2AqwBIAIgHTYCpAEgAiAcNgKgASACIBs6AJ0BIAIgGDoAnAEgAiAVNgKYASACIAEoAqwBIhQ2AtQBIAIgASgCqAEiHDYC0AEgAiADNgKoASARIAYoAgg2AgggESAGKQMANwMAIA8gAikD6AE3AgAgDyACKQPwATcCCCAPIAIpA/gBNwIQIA8gAigCgAI2AhggAiAeNgKwASABIANBAXI2AngCQAJAIARBC0cNACACQegBaiABEMQBDAELIAVBCzYCACACIAkpAgA3A+gBIAIgCSgCCDYC8AECQCAZQQpGDQAgChDACwsgCiAENgIAIAcgCCkCADcCACAHIAgoAgg2AggLIAEpA7ABITIgBiACKQPoATcCACAGIAIoAvABNgIIIAEgMjcDqAEgAS0AuAEhAyABIAJBgAFqEMsIIAYgESgCCDYCCCAGIBEpAwA3AwACQCABKAKIAUEOcUEKRg0AIAUQwAsLIAEgFDYCrAEgASAcNgKoASAFIBApAxg3AxggBSAQKQMQNwMQIAUgECkDCDcDCCAFIBApAwA3AwACQCADDhMABwcHBwcHBwcHBwcHBwcHBwcABwsgAkGAAWogAUEBEIIEIAIoAoABIgNBAkYNASADQQRyIRQMAwsgAkGAAWogAUEAEIIEIAIoAoABIgNBAkcNAQtBCyEUDAILIANBBHIhFAsgAigCnAEhHyACKAKYASEgIAIoApQBISEgAigCkAEhIiACKAKMASEjIAIoAogBISQLIAIoAoQBIR4gFEELRw0EDAILIAIoAkghHiACKAJEIgNBgICAgHhGDQIgAigCTCEEAkAgAS0AuAEiFEEDRw0AAkACQCAFKAIAIhRBC0cNACACQYABaiABEMQBDAELIAVBCzYCACACIAkpAgA3A4ABIAIgCSgCCDYCiAECQCAKKAIAQQpGDQAgChDACwsgCiAUNgIAIAcgCCkCADcCACAHIAgoAgg2AggLIAEpA7ABITIgBiACKQOAATcCACAGIAIoAogBNgIIIAEgMjcDqAEgACAENgIIIAAgHjYCBCAAIAM2AgAMCAsgASgCtAEhIiABKAKwASEkIAJBOGogFBDIJSACIC5B//SaAa2ENwPoASACQYABakHNlYABIAJB6AFqEM4IIAIgAikCODcCjAEgAiACKAJANgKUASAkICIgAkGAAWoQxhshFAJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgAEGAgICAeDYCACAAIBQ2AgQgHiAEEKEfIAMgHhD4IwwHCyABKAKwASEeIAJBgAFqIAFB2P+aAUEBQQAQ5wICQCACLQCAAUUNACACKAKEASEeDAELIAJBgAFqIAEgHiACLQCBAUGkAUciBEEAEMMBIAIoAoQBISQCQCACKAKAASIDQYGAgIB4Rw0AICQhHgwBCwJAIANBgICAgHhGDQAgAigCmAEhHyACKAKUASEgIAIoApABISEgAigCjAEhIiACKAKIASEjQQohFCADIR4MAwsCQCABLQCBAUEgcUUNAEEKISQgASgCGCEgIAEoAgQhISABKAIAISUgAS0AHCEmIAEoAngiHSEDAkAgASgCCEEKRg0AIAJB6AJqIAoQlQYgAiAOKQIANwPYAiACIA4oAgg2AuACIAIoAugCISQgASgCeCEDCyABKAJoIScgAS0AHSEoQQAhH0EAISMCQCABKAIgQYCAgIB4Rg0AIAEoAjQhIyABKAIoIR8LQQshIiADIRQCQCAFKAIAIhxBC0YNAEEKISIgAyEUAkAgHEEKRg0AIAJB6AJqIAUQlQYgAiAOKQIANwPIAiACIA4oAgg2AtACIAIoAugCISIgASgCeCEUCyATIAkoAgg2AgggEyAJKQIANwIAIAIgAikDyAI3A+gBIAIgAigC0AI2AvABCyALIAIpA9gCNwIAIAsgAigC4AI2AgggAiAkNgKIASACICE2AoQBIAIgJTYCgAEgAiAnNgKsASACIAM2AqgBIAIgIzYCpAEgAiAfNgKgASACICg6AJ0BIAIgJjoAnAEgAiAgNgKYASACIAEoAqwBIiM2AtQBIAIgASgCqAEiIDYC0AEgESAGKAIINgIIIBEgBikDADcDACAPIAIpA+gBNwIAIA8gAikD8AE3AgggDyACKQP4ATcCECAPIAIoAoACNgIYIAIgIjYCsAEgASAUQQFyNgJ4IAEoArABISUCQAJAAkACQAJAAkACQAJAIAQNAAJAAkACQAJAIAEtALgBIgNB/wBHDQACQAJAIAUoAgAiFEELRw0AIAJB6AJqIAEQxAEMAQsgBUELNgIAIAIgCSkCADcD6AIgAiAJKAIINgLwAgJAIAooAgBBCkYNACAKEMALCyAKIBQ2AgAgByAIKQIANwIAIAcgCCgCCDYCCAsgASkDsAEhMiAGIAIpA+gCNwIAIAYgAigC8AI2AgggASAyNwOoAQwBCyADQZMBRw0BAkACQCAFKAIAIhRBC0cNACACQegCaiABEMQBDAELIAVBCzYCACACIAkpAgA3A+gCIAIgCSgCCDYC8AICQCAKKAIAQQpGDQAgChDACwsgCiAUNgIAIAcgCCkCADcCACAHIAgoAgg2AggLIAEpA7ABITIgBiACKQPoAjcCACAGIAIoAvACNgIIIAEgMjcDqAELIAJB6AJqIAEQyQMgAigC7AIhHyACLQDoAiImQQJHDQEgAkEMNgLoASACIB82AuwBDAkLIAEoArQBIRQgAkGkAmogAxDIJSACIDE3A9gCIAJB6AJqQc2VgAEgAkHYAmoQshAgDCACKAKsAjYCCCAMIAIpAqQCNwIAICUgFCACQegCahDGGyEDAkAgAS0AuAFBogFHDQAgASABEIYOEJEJCyACQQw2AugBIAIgAzYC7AEMCAsgAS0AuAEhFAJAAkACQAJAAkACQAJAAkACQAJAAkAgA0H/AEYNACAUQf8BcQ0BAkACQCAFKAIAIgNBC0cNACACQegCaiABEMQBDAELIAVBCzYCACACIAkpAgA3A+gCIAIgCSgCCDYC8AICQCAKKAIAQQpGDQAgChDACwsgCiADNgIAIAcgCCkCADcCACAHIAgoAgg2AggLIAEpA7ABITIgBiACKQPoAjcCACAGIAIoAvACNgIIIAEgMjcDqAEgAkHoAmogARD/AiACKALsAiEhIAIoAugCIidBgICAgHhHDQIgAiAhNgLsASACQQw2AugBDBELIBRB/wFxDQQCQAJAIAUoAgAiA0ELRw0AIAJB6AJqIAEQxAEMAQsgBUELNgIAIAIgCSkCADcD6AIgAiAJKAIINgLwAgJAIAooAgBBCkYNACAKEMALCyAKIAM2AgAgByAIKQIANwIAIAcgCCgCCDYCCAsgASkDsAEhMiAGIAIpA+gCNwIAIAYgAigC8AI2AgggASAyNwOoASABLQC4ASIDQQFHDQggBSgCACIDQQtHDQIgAkHoAmogARDEAQwDCyABKAK0ASEDIAEoArABISIgAkHIAmogFBDIJSACIDA3A9gCIAJB6AJqQc2VgAEgAkHYAmoQshAgDCACKALQAjYCCCAMIAIpAsgCNwIAICIgAyACQegCahDGGyEDAkAgAS0AuAFBogFHDQAgASABEIYOEJEJCyACQQw2AugBIAIgAzYC7AEMDwsgAiACKALwAiIDNgLgAiACICE2AtwCIAIgJzYC2AICQCADDQAgASgCtAEhAyABKAKwASEUIAJBmICAgHg2AugCIBQgAyACQegCahDGGyEDAkAgAS0AuAFBogFHDQAgASABEIYOEJEJCyACQQw2AugBIAIgAzYC7AEgAkHYAmoQjQogJyAhEPUjDA8LICEoAgAiFEEERg0MIA4gISkCBDcCACAOICEpAgw3AgggDiAhKQIUNwIQIA4gISkCHDcCGCAOICEoAiQ2AiAgAiAUNgLoAiADQShsQVhqQShuIRQCQCADQQFGDQAgIUEoaiEDA0AgAxDGDSADQShqIQMgFEF/aiIUDQALCyAnICEQ9SMgARCfCiIDRQ0JIAJBDDYC6AEgAiADNgLsASACQegCahDGDQwOCyAFQQs2AgAgAiAJKQIANwPoAiACIAkoAgg2AvACAkAgCigCAEEKRg0AIAoQwAsLIAogAzYCACAHIAgpAgA3AgAgByAIKAIINgIICyABKQOwASEyIAYgAikD6AI3AgAgBiACKALwAjYCCCABIDI3A6gBQQAhAyABLQC4AUEJRw0DIAEgASgCeCIhQYAgcjYCeCABKAKwASEoIAEoAogBIgNBC0cNASACQegCaiABEMQBDAILIAEoArQBIQMgASgCsAEhIiACQbACaiAUEMglIAIgMDcD2AIgAkHoAmpBzZWAASACQdgCahCyECAMIAIoArgCNgIIIAwgAikCsAI3AgAgIiADIAJB6AJqEMYbIQMCQCABLQC4AUGiAUcNACABIAEQhg4QkQkLIAJBDDYC6AEgAiADNgLsAQwLCyAFQQs2AgAgAiAJKQIANwPoAiACIAkoAgg2AvACAkAgCigCAEEKRg0AIAoQwAsLIAogAzYCACAHIAgpAgA3AgAgByAIKAIINgIICyABKQOwASEyIAYgAikD6AI3AgAgBiACKALwAjYCCCABIDI3A6gBIAEgASgCeCIDQf///79/cTYCeCACQSBqIAEoArABIAEQ7AMgAigCICEUIAEgAzYCeCACKAIkIScgFEEBcQ0CIAEoAqwBIRRBDBCKASIDRQ0IIAMgFDYCCCADICg2AgQgAyAnNgIAIAEgITYCeAsgARCfCiIURQ0EIAJBDDYC6AEgAiAUNgLsASADRQ0IIAMoAgAiFBCoBCAUQeAAQQgQ3BQgA0EMQQQQ3BQMCAsgASgCtAEhFCABKAKwASEiIAJBvAJqIAMQyCUgAiAvNwPYAiACQegCakHNlYABIAJB2AJqELIQIAwgAigCxAI2AgggDCACKQK8AjcCACAiIBQgAkHoAmoQxhshAwJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgAkEMNgLoASACIAM2AuwBDAcLIAEgITYCeCACICc2AuwBIAJBDDYC6AEMBgsgASgCtAEhAyACQY+AgIB4NgLoAiAlIAMgAkHoAmoQxhshAwJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgAkEMNgLoASACIAM2AuwBDAYLIAIgAikD6AIiMjcD6AEgAiACKQPwAjcD8AEgAiACKQP4AjcD+AEgAiACKQOAAzcDgAIgAiACKQOIAzcDiAIgAiAmOgCcAiACIB82ApgCIAIgJTYCkAIgAiABKAKsATYClAICQAJAIDKnIhRBdWoOAgEHAAsgAigC+AEhAyACKAL0ASEEIAIoAvABIR4gAigC7AEhHAwCCyABIAJBgAFqEMsIIAYgESgCCDYCCCAGIBEpAwA3AwACQCABKAKIAUEOcUEKRg0AIAUQwAsLIAEgIzYCrAEgASAgNgKoASAFIBApAxg3AxggBSAQKQMQNwMQIAUgECkDCDcDCCAFIBApAwA3AwAMBgsgAiAmOgD8ASACIAM2AvgBIAIgJTYC8AEgAiAfNgLsAUEHIRQgAkEHNgLoASACIAEoAqwBIgQ2AvQBIAMhAyAlIR4gHyEcCyABIAEoAnhBfnEgHUEBcXI2AnggAiANKQMANwNwIAIgDSkDCDcDeCACKQOIAiEyIAIoAoQCIR8gAigCgAIhICACKAL8ASEhAkAgJEEKRg0AIBIQwAsLAkAgIkEOcUEKRg0AIBAQwAsLIAIgAikDcDcDUCACIAIpA3g3A1ggMkIwiKchJSAyQiiIpyEoIDJCIIinIScgMqchJiAfIR8gBCEjIB4hJCAgISAgISEhIAMhIiAcIR4MBwtB7PSaARDEIwALQQRBDBCiJAALIB8QjQIgH0HAAEEIENwUCyABIAJBgAFqEMsIIAYgESgCCDYCCCAGIBEpAwA3AwACQCABKAKIAUEOcUEKRg0AIAUQwAsLIAEgIzYCrAEgASAgNgKoASAFIBApAxg3AxggBSAQKQMQNwMQIAUgECkDCDcDCCAFIBApAwA3AwAgAigC7AEiA0EIahDmAyADQSBBCBDcFAsgAkGAAWogARDJAyACKAKEASEiAkAgAi0AgAEiH0ECRw0AICIhHgwBCyABLQC4ASIkIQMCQCAkQQpHDQACQAJAIAUoAgAiA0ELRw0AIAJBgAFqIAEQxAEMAQsgBUELNgIAIAIgCSkCADcDgAEgAiAJKAIINgKIAQJAIAooAgBBCkYNACAKEMALCyAKIAM2AgAgByAIKQIANwIAIAcgCCgCCDYCCAsgASkDsAEhMiAGIAIpA4ABNwIAIAYgAigCiAE2AgggASAyNwOoASABLQC4ASEDCwJAAkACQAJAAkACQAJAAkACQAJAAkACQCADQf8BcSIUDhMBBAQEBAQEBAQABAQEBAQEBAQBBAsgASABKAJ4IiBBgCByNgJ4IAEoArABISECQAJAIAEoAogBIgNBC0cNACACQYABaiABEMQBDAELIAVBCzYCACACIAkpAgA3A4ABIAIgCSgCCDYCiAECQCAKKAIAQQpGDQAgChDACwsgCiADNgIAIAcgCCkCADcCACAHIAgoAgg2AggLIAEpA7ABITIgBiACKQOAATcCACAGIAIoAogBNgIIIAEgMjcDqAEgASABKAJ4IgNB////v39xNgJ4IAJBGGogASgCsAEgARDsAyACKAIYISMgASADNgJ4IAIoAhwhFCAjQQFxDQEgASgCrAEhI0EMEIoBIgMNAkEEQQwQoiQACwJAAkACQCAEDQBBACEpIBRBEkcNAiABIAEoAngiA0GAIHI2AnggAkEAOgDoASACQQE6AIABIAJBEGogAkHoAWogAkGAAWogARDiASACKAIQIQQgASADNgJ4IAIoAhQhKSAEQQFxRQ0BICkhFAwMCyABKAK0ASEDIAEoArABIQQgAkHjgICAeDYCgAEgBCADIAJBgAFqEMYbIRQgAS0AuAFBogFHDQsgASABEIYOEJEJDAsLIAEtALgBIQMLAkACQCADQf8BcQ0AAkACQCAFKAIAIgNBC0cNACACQYABaiABEMQBDAELIAVBCzYCACACIAkpAgA3A4ABIAIgCSgCCDYCiAECQCAKKAIAQQpGDQAgChDACwsgCiADNgIAIAcgCCkCADcCACAHIAgoAgg2AggLIAEpA7ABITIgBiACKQOAATcCACAGIAIoAogBNgIIIAEgMjcDqAEgAkGAAWogARD/AiACKAKEASEDIAIoAoABIgRBgICAgHhHDQEgAyEUDAoLIAEoArQBIQQgASgCsAEhHiACQegCaiADEMglIAIgMDcD6AEgAkGAAWpBzZWAASACQegBahCyECALIAIoAvACNgIIIAsgAikC6AI3AgAgHiAEIAJBgAFqEMYbIRQgAS0AuAFBogFHDQkgASABEIYOEJEJDAkLIAIgAigCiAEiIzYC8AEgAiADNgLsASACIAQ2AugBIAEtALgBQQlHDQQgASABKAJ4IhRBgCByNgJ4IAJBCToAgAEgAkEIaiACQYABaiABEIYCIAIoAgghICABIBQ2AnggAigCDCEqAkAgIEEBcUUNACAqIRQMCAsgARCfCiIURQ0FICpFDQcgKigCACIBEKgEIAFB4ABBCBDcFCAqQQxBBBDcFAwHCyABICA2AngMCAsgAyAjNgIIIAMgITYCBCADIBQ2AgAgASAgNgJ4IAEQnwoiFEUNASADKAIAIgEQqAQgAUHgAEEIENwUIANBDEEEENwUDAcLQQAhAyABEJ8KIhQNBgsgASgCrAEhFCACIAM2AogBIAIgFDYChAEgAiAeNgKAAUEGIRQgAikChAEhMiAiGiArQYCAgHhxIARyIB9BCHRyQYCABEEAICRBCkYbciIrISEMAgtBACEqIAEQnwoiFA0CCyABKAKsASErIAIgIzYChAEgAiADNgKAASACICI2AogBICRBCkYhLEEJIRQgAikDgAEhMiAfGiAiGiAeGiAfIS0gHiEhIAQhHgsgMkIgiKchIyAypyEkICohHyApISYgLSEnICwhKCArISAMBQsgAkHoAWoQjQogBCADEPUjCyApRQ0AICkQrw8gKSgCACApQQRqKAIAEPcjIClBFEEEENwUCyAiEI0CICJBwABBCBDcFCAUIR4LIAIoAkgiASACKAJMEKEfIAIoAkQgARD4IwsgAEGAgICAeDYCACAAIB42AgQMBAsgAiACKQNYNwNoIAIgAikDUDcDYCAlrUIwhiAorUL/AYNCKIaEICetQv8Bg0IghoQgJq2EITICQCACKAJMIgQgAigCREcNACACQcQAahDAGgsgAigCSCAEQThsaiIDIDI3AyAgAyAfNgIcIAMgIDYCGCADICE2AhQgAyAiNgIQIAMgIzYCDCADICQ2AgggAyAeNgIEIAMgFDYCACADIAIpA2A3AyggAyACKQNoNwMwIAIgBEEBajYCTAwACwsgAyACKAKIARD+IAALIAEoArQBIQQgASgCsAEhHiACQSxqIAMQyCUgAkGPAq1CIIZB/vSaAa2ENwPoASACQYABakHNlYABIAJB6AFqEM4IIAIgAikCLDcCjAEgAiACKAI0NgKUASAeIAQgAkGAAWoQxhshAwJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgAEGAgICAeDYCACAAIAM2AgQLIAJBkANqJAAL6TcDDX8FfgN8IwBBkANrIgMkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACKAIAIgRBdGpBByAEQQtLG0F8ag4fAAoBCgIKCgoKCgkIBwoKCgoKCgYKCgoKCgUFBQUFBQoLIAMgAi8AETsBNCADIAItABM6ADYgAigCDCEFIAIoAgghBiACKAIEIQcCQAJAIAItABAiCEEDSw0AIAhBAkcNAQsQmCEiBCAIOgAQIAQgBTYCDCAEIAY2AgggBCAHNgIEIARBEDYCACAAIAQ2AgQgAEECNgIAIAQgAy8BNDsAESAEIAMtADY6ABMMHwsgA0E4aiABIAcQZwJAAkACQAJAIAMoAjhBAUcNACADKwNAIhUhFiAIDgQCIQEDAQsgA0GwAmogA0E4ahDrBUHAABCKASIERQ0GIAQgAykD6AI3AzggBCADKQPgAjcDMCAEIAMpA9gCNwMoIAQgAykD0AI3AyAgBCADKQPIAjcDGCAEIAMpA8ACNwMQIAQgAykDuAI3AwggBCADKQOwAjcDAEHAABCKASIBRQ0FIAEgCDoAECABIAU2AgwgASAGNgIIIAEgBDYCBCABQRA2AgAgACABNgIEIABBAjYCAAwhC0Go85oBQShB7NCaARC5IQALIBWaIRYMHgtEAAAAAAAA8L8hFiAVvUL///////////8Ag0KAgICAgICA+P8AWQ0dIBWdIhYgFkQAAAAAAADwPaKdRAAAAAAAAPBBoqEgFqYiFkQAAAAAAADwQaAgFiAWRAAAAAAAAAAAYxv8A0F/c7chFgwdCyACKAIQIQkgAigCDCEKIAItABQhByACKAIIIQUgAigCBCEGEI4hIQQgA0GwAmogBhBOIAQgAykD6AI3AzggBCADKQPgAjcDMCAEIAMpA9gCNwMoIAQgAykD0AI3AyAgBCADKQPIAjcDGCAEIAMpA8ACNwMQIAQgAykDuAI3AwggBCADKQOwAjcDABCOISEIIANBsAJqIAUQTiAIIAMpA+gCNwM4IAggAykD4AI3AzAgCCADKQPYAjcDKCAIIAMpA9ACNwMgIAggAykDyAI3AxggCCADKQPAAjcDECAIIAMpA7gCNwMIIAggAykDsAI3AwACQCAHQXhqQQtJDQAgB0EXRg0AEJghIgEgBzoAFCABIAk2AhAgASAKNgIMIAEgCDYCCCABIAQ2AgQgAUESNgIAIAAgATYCBCAAQQI2AgAgBiAFEMEgDB4LIANByABqIAEgBhBnIANB2ABqIAEgBRBnIAMgAykDUDcDcCADIAMpA0giEDcDaCADIAMpA1g3A3ggAyADKQNgNwOAASADIAc6AIgBIANB+ABqIQECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgEKcOAgABJAsgAygCeCIFDgIiASMLIAMoAngiBQ4CAgEiCyAHQQtHDSEgAyADKQNwNwOQASADQdABaiADKwOAARCjDiADQeUErUIghiADQdABaq2ENwO4AiADQeAErUIghiADQZABaq2ENwOwAiADQZgCaiADQbACahDWECADQZgCahCzICEQIABBADYCACAAIBA3AwggAygC0AEgAygC1AEQsiMgAykDkAEQmR0MIwsgAysDgAEhFiADKwNwIRUgB0F4ag4QAgMEBQYHCAkKCwwBAQEBDQELIAdBC0cNHyADKwNwIRYgAyADKQOAATcDkAEgA0HQAWogFhCjDiADQeAErUIghiADQZABaq2ENwO4AiADQeUErUIghiADQdABaq2ENwOwAiADQfwCaiADQbACahDWECADQfwCahCzICEQIABBADYCACAAIBA3AwggAygC0AEgAygC1AEQsiMgAykDkAEQmR0MHQtBqPOaAUEoQdzQmgEQuSEACyAVIBYQmBAhFwwaCyAVIBYQmRAhFwwZCyAVIBYQmhAhFwwYCyAVIBagIRcMFwsgFSAWoSEXDBYLIBUgFqIhFwwVCyAVIBajIRcMFAsgFSAWEN4lIRcMEwsgFSAWEJIRIRcMEgsg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QQA6AGAgA0KBgICA8P+/fzcCjAEgAyAVNgKIASADQQE2AoQBIANBADoAgAEgA0EBNgJsIAMgDjYCaCADQQE2AmQgA0EAKQOgpZwBIh43AnAgA0EAKQOopZwBIh83AnhBACgC6JSdASEcQQAgA0HgAGo2AuiUnQFBjAEQ+iAiFUEANgJ0IBVCgICAgMAANwJsIBVBADoAaCAVQbDFmAE2AmQgFUKAgICAEDcCXCAVQoCAgIDAADcCVCAVQQs2AgggFUKCgICAEDcCACAVQQE2AogBIBUgHjcCeCAVIB83AoABIAMgFTYCnAFBAUUNASADIAMoAlg2AqgBIAMgAykDUDcDoAFBGBD6ICIWQQA2AhQgFkKAgICAwAA3AgwgFkEAOgAIIBZCgYCAgBA3AgACQAJAQQAtAPiQnQEOBAAABQEAC0EAQQI6APiQnQFBgAgQigEiDkUNA0EAQQM6APiQnQFBACAONgLwkJ0BCyADQfgCahDCCiADQeQDaiIOEOMOIANCgYCAgMAANwKsBCADQSBqQQBBAUEBEIEYIAMpAyAhHiADQRhqQQBBAUEBEIEYIAMpAxghHyADQRBqQQBBAUEBEIEYIAMpAxAhICADQYAFahDCCiADKQKQBSEhIAMpArAFISIgAykCuAUhIyADKQLABSEkIANBuARqEOMOIANB+AJqELYhIANBADYC4AMgAyAgNwLYAyADQQA2AtQDIAMgHzcCzAMgA0EANgLIAyADIB43AsADIAMgJDcCuAMgAyAjNwKwAyADICI3AqgDIANCoICAgIAENwKgAyADQqCAgICABDcCmAMgA0KggICAgAQ3ApADIAMgITcCiAMgA0KggICAgAQ3AoADIANCoICAgIAENwL4AiAOIANBuARqQcgA/AoAACADQbABaiADQfgCakG8AfwKAAAgAyAVNgLwAiADIBY2AuwCIANBgAVqELQfIBYgFigCACIOQQFqNgIAIA5Bf0wNASADKQKwASEeIAMpArgBIR8gAykCwAEhICADKQLIASEhIAMpAtABISIgAykC2AEhIyADKQLgASEkIAMpAugBISUgAykC8AEhJiADQfgCakHIAGogAygC/AEgAygCgAIQ1RggA0HMA2ogAygCiAIgAygCjAIQ1RggA0HYA2ogAygClAIgAygCmAIQ1RggAyAmNwK4AyADICU3ArAD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CCADQQxqIQkMJgsgA0E0aiEIIANBMGohCQwlCyADQSRqIQggA0EgaiEJDCQLIANBJGohCCADQSBqIQkMIwsgA0EUaiEIIANBEGohCQwiCyADQSBqIQggA0EcaiEJDCELIANBGGohCCADQRRqIQkMIAsgA0EUaiEIIANBEGohCQwfCyADQRRqIQggA0EQaiEJDB4LIAMoAggOBxYXGBkaGxwWCyADQSBqIQggA0EcaiEJDBwLIANBEGohCCADQQxqIQkMGwsgA0EYaiEIIANBFGohCQwaCyADKAIgIglBKGohCCAJQSRqIQkMGQsgA0EIaiEIIANBBGohCQwYCyADQQhqIQggA0EEaiEJDBcLIANBDGohCCADQQhqIQkMFgsgA0EMaiEIIANBCGohCQwVCyADQRxqIQggA0EYaiEJDBQLIANBLGohCCADQShqIQkMEwsgA0EIaiEIIANBBGohCQwSCyADKAIEIglBBGohCAwRCyADQRRqIQggA0EQaiEJDBALIANBEGohCCADQQxqIQkMDwsgA0EMaiEIIANBCGohCQwOCyADQQxqIQggA0EIaiEJDA0LIANBEGohCCADQQxqIQkMDAsgA0EQaiEIIANBDGohCQwLCyADQRBqIQggA0EMaiEJDAoLIANBFGohCCADQRBqIQkMCQsgA0EMaiEIIANBCGohCQwICyADQQhqIQggA0EEaiEJDAcLIANBHGohCCADQRhqIQkMBgsgA0EQaiEIIANBDGohCQwFCyADQRBqIQggA0EMaiEJDAQLIANBFGohCCADQRBqIQkMAwsgA0EUaiEIIANBEGohCQwCCyADQSRqIQggA0EgaiEJDAELIANBJGohCCADQSBqIQkLIAgoAgAhCiAJKAIAIQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACQf8BcQ4EAAMBAgALIAdBY2oiCEEFSw0CQQEgCHRBKXFFDQIgAygCECEJIAMoAgwhByADKAIIIQIgBEGIBWogAUEAIAMoAgQQbCAEKAKMBSEFAkAgBCgCiAUiCEEHRw0AIABBBzYCACAAIAU2AgQgAhCoBCACQeAAQQgQ3BQMIwsgBCAEKQOoBTcDUCAEIAQpA6AFNwNIIAQgBCkDmAU3A0AgBCAEKQOQBTcDOCAEIAU2AjQgBCAINgIwQQwQigEiBUUNDSAFIAk2AgggBSAHNgIEIAUgAjYCACAEIAU2ApAEAkACQAJAIAhBf2pBA0kNAAJAIAgNACAEQTBqQSBqIQIMAgsgBEEgaiAEQTBqEM4DIAQoAiQhBSAEKAIgIQIgBEG+gICAeDYCiAUgASACIAUgBEGIBWoQ7h0gBEGQBGoQ3x4MAgsgBEEwakEYaiECCwJAIAIoAgAiCEUNACAIKAIAIgkQqAQgCUHgAEEIENwUIAhBDEEEENwUCyACIAU2AgALIAAgBCkDUDcDICAAIAQpA0g3AxggACAEKQNANwMQIAAgBCkDODcDCCAAIAQpAzA3AwAMIgsgB0F/akECSQ0BAkACQAJAIAdBcmoOCgEAAAAAAAAAAAIACyAAIAM2AgQgAEEGNgIADCQLIABBADYCACAAQQA2AiAgBCADKQIINwKMBSAAIAQpAogFNwIEIAQgAykCEDcClAUgACAEKQKQBTcCDCAEIAMpAhg3ApwFIAAgBCkCmAU3AhQgACAEKAKgBTYCHAwiCyAAIAM2AgQgAEEGNgIADCILAkAgB0F/ag4iAQECAAAAAQICAAICAAICAgAAAgAAAAIAAAAAAAIAAgICAgALIARBvoCAgHg2AogFIAEgCyAKIARBiAVqEO4dIAMoAgAiBUF0aiEGCyAGQQcgBUELSxtBf2oOFwgBBgYGBgMGBgYGBgYCBAYGBgYFBgYHBgsCQCAEQSxqIAEoAnhBCHFBA3YQnxENACAEQcCAgIB4NgKIBSABIAsgCiAEQYgFahDuHQsCQCADKAIAQRpHDQAgAEEANgIAIABBADYCICAEIAMpAgg3AowFIAAgBCkCiAU3AgQgBCADKQIQNwKUBSAAIAQpApAFNwIMIAQgAykCGDcCnAUgACAEKQKYBTcCFCAAIAQoAqAFNgIcDB8LIAAgAzYCBCAAQQY2AgAMHwsgBCADKQMQNwLMASADKAIEIQkgAygCCCECIAQgAygCDCIFNgLUAUEAIQggBEEANgLAAiAEIAE2AtgCIARBADYC1AIgBCACIAVBDGwiB2oiDDYC0AIgBCAJNgLMAiAEIAI2AsgCIAQgAjYCxAIgBCAEQcACajYC6AIgBCAEQcwBajYC5AIgBCAEQdQBajYC4AIgBCAEQStqNgLcAgJAAkAgBUUNACAEQdgCaiEBIARBkAVqIQUgBEH4AmpBBGohCQNAIAkgAigCCDYCCCAJIAIpAgA3AgAgBCAINgL4AiAEQYgFaiABIARB+AJqENsBIAJBDGohAiAEKAKMBSEGAkAgBCgCiAUiDUEDRw0AIAQgAjYCyAICQCAEKALAAiIFRQ0AIAVBCGoQ5gMgBUEgQQgQ3BQLIAQgBjYCwAIgBCAIQQFqNgLUAiAEIA42ApQEIARBAzYCkAQMFwsgBCAFKQMoNwOABCAEIAUpAyA3A/gDIAQgBSkDGDcD8AMgBCAFKQMQNwPoAyAEIAUpAwg3A+ADIAQgBSkDADcD2AMgBCAIQQFqIgg2AtQCIA1BBEcNAiAGIQ4gB0F0aiIHDQALIAQgDDYCyAILIARBAzYCkAQMFAsgBCAGNgKUBCAEIAQpA9gDNwOYBCAEIAQpA+ADNwOgBCAEIAQpA+gDNwOoBCAEIAQpA/ADNwOwBCAEIAQpA/gDNwO4BCAEIAQpA4AENwPABCAEIAI2AsgCIAQgBCkClAQ3A/gCIAQgBCkCnAQ3A4ADIAQgBCkCpAQ3A4gDIAQgBCkCrAQ3A5ADIAQgBCkCtAQ3A5gDIAQgBCkCvAQ3A6ADIAQgBCgCxAQ2AqgDIARBiAVqQQRBCEE4EIUPIAQoAowFIQUgBCgCiAVBAUYNByAEKAKQBSIMIA02AgAgDCAEKQP4AjcCBCAMIAQpA4ADNwIMIAwgBCkDiAM3AhQgDCAEKQOQAzcCHCAMIAQpA5gDNwIkIAwgBCkDoAM3AiwgDCAEKAKoAzYCNCAEQQE2AvQCIAQgDDYC8AIgBCAFNgLsAiAEIAQpAswCNwO4AyAEIAQpAsQCNwOwAyAEIAQpAuQCNwPQAyAEIAQpAtwCNwPIAyAEIAQpAtQCIho3A8ADIAQoArQDIgIgBCgCvAMiDUYNESAEKALUAyEPIARBxANqIQEgGqchCCAEQZAEakEIaiEKIARBkARqQQRyIQsgBEGIBWpBCGohBSAEQcAFakEEaiEHQQEhEANAIAkhDgNAIAQgAigCCCIJNgLQBCAEIAIpAgAiGjcDyAQgByAJNgIIIAcgGjcCACAEIAg2AsAFIARBiAVqIAEgBEHABWoQ2wEgAkEMaiECIAQoAowFIQkCQCAEKAKIBSIGQQNHDQAgBCACNgK0AwJAIA8oAgAiBUUNACAFQQhqEOYDIAVBIEEIENwUCyAPIAk2AgAgBCAIQQFqNgLAAyAEIA42ApQEIARBAzYCkAQMFQsgBCAFKQMoNwOABSAEIAUpAyA3A/gEIAQgBSkDGDcD8AQgBCAFKQMQNwPoBCAEIAUpAwg3A+AEIAQgBSkDADcD2AQgBCAIQQFqIgg2AsADAkAgBkEERw0AIAkhDiACIA1HDQEMEwsLIAogBCkDgAU3AyggCiAEKQP4BDcDICAKIAQpA/AENwMYIAogBCkD6AQ3AxAgCiAEKQPgBDcDCCAKIAQpA9gENwMAIAQgCTYClAQgBCALKQIANwPYAyAEIAspAgg3A+ADIAQgCykCEDcD6AMgBCALKQIYNwPwAyAEIAspAiA3A/gDIAQgCykCKDcDgAQgBCALKAIwNgKIBAJAIBAgBCgC7AJHDQAgBEHsAmogEEEBQQhBOBDaGiAEKALwAiEMCyAMIBBBOGxqIg4gBjYCACAOIAQpA9gDNwIEIA4gBCkD4AM3AgwgDiAEKQPoAzcCFCAOIAQpA/ADNwIcIA4gBCkD+AM3AiQgDiAEKQOABDcCLCAOIAQoAogENgI0IAQgEEEBaiIQNgL0AiACIA1HDQAMEQsLIABBADYCACAAQQA2AiAgBCADKQIINwKMBSAAIAQpAogFNwIEIAQgAykCEDcClAUgACAEKQKQBTcCDCAEIAMpAhg3ApwFIAAgBCkCmAU3AhQgACAEKAKgBTYCHAwUCyADLQA8RQ0ICyAEQb6AgIB4NgKIBSABIAsgCiAEQYgFahDuHSAAIAo2AgggACALNgIEIABBBTYCAAwSCyABLQB5QQFxDQULIARBvoCAgHg2AogFIAEgCyAKIARBiAVqEO4dIAAgCjYCCCAAIAs2AgQgAEEFNgIADBALIARBvoCAgHg2AogFIAEgCyAKIARBiAVqEO4dIAAgCjYCCCAAIAs2AgQgAEEFNgIADA8LIAMoAgghDiADKAIEIREgAygCDCISRQ0IIBJBBHQiBUFwakEEdkEBaiEIQQAhBwJAA0AgDiAFakFwaigCAEECRw0BIAdBAWohByAFQXBqIgUNAAsgCCEHCyAEQYgFaiASIAdrIglBCEEoEIUPIAQoAowFIQgCQCAEKAKIBUEBRg0AQQAhBSAEQQA2AuADIAQgBCgCkAUiDDYC3AMgBCAINgLYAyAEQRhqIAkgEkF/aiAHGyASEOEaIBIgBCgCHCITayEUIAQoAhgiFSATRg0FIA4gE0EEdCIIaiEWIAggFUEEdCIJayEPIAJBAXIhFyAOIAlqIRAgBEGIBWpBCGohDUEAIQgDQCAQIAhqIgZBDGooAgAhCQJAAkACQAJAAkAgBigCACIYDgMCAQABCwJAIAUgBCgC2ANHDQAgBEHYA2oQvhoLIAQoAtwDIgwgBUEobGpBBzYCAAwCCyAGQQRqKQIAIRogBCAJNgKcBCAEIBo3ApQEIAQgGDYCkAQgBEEQaiAEQZAEahD/AyAEKAIUIQYgBCgCECEYIARBu4CAgHg2AogFIAEgGCAGIARBiAVqEO4dIAkQliMMAgsCQAJAIAkoAgBBMUYNACAEQYgFaiABIBcgCRBsIAQoAowFIRggBCgCiAUiGUEHRw0BIABBBzYCACAAIBg2AgQCQAJAAkAgFiAGQRBqRw0AIBIgE0cNAQwCCyAGQRxqIQAgDyAIa0FwakEEdiECA0ACQCAAQXRqKAIAQQJGDQAgACgCACIIEI0CIAhBwABBCBDcFAsgAEEQaiEAIAJBf2oiAg0ACyASIBNGDQELAkAgFEEEdCIARQ0AIBAgFiAA/AoAAAsgFSAUaiEVCyAMIAUQ6x0gBCgC2AMgDBD1IyAOIBUQ+xogESAOEPYjDBwLQQUhGSAEQQU2AogFIAQgCSgCCDYCkAUgBCAJKAIEIhg2AowFIAkQjQIgCUHAAEEIENwUCyAEIA0pAxg3A/ABIAQgDSkDEDcD6AEgBCANKQMINwPgASAEIA0pAwA3A9gBAkAgBSAEKALYA0cNACAEQdgDahC+GiAEKALcAyEMCyAMIAVBKGxqIgkgGDYCBCAJIBk2AgAgCSAEKQPYATcDCCAJIAQpA+ABNwMQIAkgBCkD6AE3AxggCSAEKQPwATcDIAsgBCAFQQFqIgU2AuADCyAPIAhBEGoiCEYNBwwACwsgCCAEKAKQBRD+IAALIAUgBCgCkAUQ/iAAC0EEQQwQoiQACyAEQb6AgIB4NgKIBSABIAsgCiAEQYgFahDuHSAAIAo2AgggACALNgIEIABBBTYCAAwLCyADQQRqIQggAygCOCEJIAMoAjQhByADKAIwIQYCQAJAAkAgBUELRw0AIAQgCCkCGDcDwAEgBCAIKQIQNwO4ASAEIAgpAgg3A7ABIAQgCCkCADcDqAEgBEGoAWoQng8hBQwBCyAEIAU2AlggBCAIKQIANwJcIAQgCCkCCDcCZCAEIAgpAhA3AmwgBCAIKQIYNwJ0IAQgAykCJDcCfCAEIAMoAiw2AoQBAkACQCAEQdgAahDzBCIFKAIAIghBdGpBByAIQQtLGyIIQSVHDQAgBCAFKAIINgKQBSAFKAIEIQIgBRCNAiAFQcAAQQgQ3BRBBSEIDAELAkAgAkH/AXFBAkcNACAIQX9qQQJJDQAgASAFQQEQygoLIARBiAVqIAEgAiAFEGwgBCgCjAUhAiAEKAKIBSIIQQdHDQAgAEEHNgIAIAAgAjYCBCAJEI0CIAlBwABBCBDcFAwVCyAEIAQpA6gFNwOgASAEIAQpA6AFNwOYASAEIAQpA5gFNwOQASAEIAQpA5AFNwOIAUEoEIoBIgVFDQEgBSACNgIEIAUgCDYCACAFIAQpA4gBNwMIIAUgBCkDkAE3AxAgBSAEKQOYATcDGCAFIAQpA6ABNwMgCyAAIAc2AhAgACAGNgIMIAAgCTYCCCAAIAU2AgQgAEEENgIAIAMoAgAiAEF0akEHIABBC0sbQX9qDiIREQwMDAwRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDQwMDgwPDAtBCEEoEKIkAAtBACEFIBIgE0YNAgwBCyASIBNGDQEgFSATRg0AIBRBBHQiCEUNACAOIBVBBHRqIBYgCPwKAAALIBUgFGohFQsCQAJAIAdFDQAgAEEBNgIAIAAgBCkC2AM3AgQgACAEKALgAzYCDCAAQQA6ABwgAEEANgIYIAAgCjYCFCAAIAs2AhAgDiAVEPsaIBEgDhD2IwwBCwJAAkACQCAVRQ0AIA4oAgAiBkEDRg0AIAQgBjYCkAQgBCAOKQIENwKUBCAEIA4oAgw2ApwEAkAgFUEBRg0AIBVBf2pB/////wBxIQkgDkEcaiEIA0ACQCAIQXRqKAIAQQJGDQAgCCgCACIHEI0CIAdBwABBCBDcFAsgCEEQaiEIIAlBf2oiCQ0ACwsgESAOEPYjIAZBAkcNAUEHIQkMAgtBzI2bARDEIwALIARBCGogBEGQBGoQ/wMCQAJAIAZBAXENACAEQYgFaiABIAJBAXIgBCgCnAQQjBMgBCgCjAUhCCAEKAKIBSIJQQdGDQEgBCAEKQOoBTcDuAIgBCAEKQOgBTcDsAIgBCAEKQOYBTcDqAIgBCAEKQOQBTcDoAIMAgsgBCgCmAQhCSAEKAKUBCEHAkAgBCgCnAQiCCgCAEEMTw0AIAQoAgwhBiAEKAIIIQ0gBEGAgYCAeDYCiAUgASANIAYgBEGIBWoQ7h0LAkAgAUHMAWogCxCpDCIGRQ0AIAYoAgQhDSAGKAIAIQYgBEG6gICAeDYCiAUgASAGIA0gBEGIBWoQ7h0LIAQgCBCfBCAEKAIEIQYgBCgCACENIARB+AFqIAEgAkEBciAIEIwTAkAgBCgC+AFBB0YNAEEIQSgQ5CAiCCAEKQOYAiIaNwMgIAggBCkDkAI3AxggCCAEKQOIAjcDECAIIAQpA4ACNwMIIAggBCkD+AE3AwAgBCAGNgKEAiAEIA02AoACIAQgCTYCjAIgBCAHNgKIAiAEQQA2ApACIAQgGjcDuAIgBCAEKQOAAjcDoAIgBCAEKQOIAjcDqAIgBCAEKQOQAjcDsAJBAiEJDAILIAQoAvwBIQgLIABBBzYCACAAIAg2AgQgBCgC3AMiACAFEOsdIAQoAtgDIAAQ9SMMEAsCQCAFIAQoAtgDRw0AIARB2ANqEL4aCyAEKALcAyAFQShsaiICIAg2AgQgAiAJNgIAIAIgBCkDoAI3AwggAiAEKQOoAjcDECACIAQpA7ACNwMYIAIgBCkDuAI3AyAgBCAFQQFqIgU2AuADIABBATYCACAAIAQpAtgDNwIEIAAgBTYCDCAAQQA6ABwgAEEANgIYIAAgCjYCFCAAIAs2AhALIAMoAgAiAEF0akEHIABBC0sbQX9qDiIMDAcHBwcLBwcHBwcHDAcHBwcHBwcHBwcHBwcHCAcHCQcKBwsgAEEAOgAcIABBADYCGCAAIAo2AhQgACALNgIQIABCCDcDCCAAQgE3AwAgESAOEPYjDA0LIAQgAjYCtAMLIARBAzYCkAQLIARBkARqEOkQIARBsANqEMgSDAELIARBkARqEOkQIARBADYC9AIgBEKAgICAgAE3AuwCIARBxAJqEMgSCwJAIAQoAsACIgVFDQAgBEHsAmoQnREgBCgC7AIgBCgC8AIQ+CMMCAsgBCgC8AIhBSAEKALsAiICQYCAgIB4Rg0HIAQoAvQCIQggAEEAOgAcIABBADYCGCAAIAQpAswBNwMQIAAgCDYCDCAAIAU2AgggACACNgIEIABBAzYCAAsgAygCACIAQXRqQQcgAEELSxtBf2oOIgUFAAAAAAQAAAAAAAAFAAAAAAAAAAAAAAAAAAABAAACAAMACyADEI0CDAQLIAMoAgQiABCNAiAAQcAAQQgQ3BQgAygCCCIAEKgEIABB4ABBCBDcFAwDCyADKAIEIgAQjQIgAEHAAEEIENwUIAMoAggiABCoBCAAQeAAQQgQ3BQMAgsgAygCBCIAEI0CIABBwABBCBDcFCADKAIIIgAQqAQgAEHgAEEIENwUDAELIAMQugUgAygCOCIAEI0CIABBwABBCBDcFAsgA0HAAEEIENwUDAILIABBBzYCACAAIAU2AgQLAkACQCADKAIAIgBBdGpBByAAQQtLG0F/ag4iAQEAAAAAAQAAAAAAAAEAAAAAAAAAAAAAAAAAAAEAAAEAAQALIAMQjQILIANBwABBCBDcFAsgBEHQBWokAAu9MwIYfwR+IwBBoARrIgIkACABIAAQ7hwgAUEwaiEDIAFBEGohBCABQSBqIQUgACgCECIGIAAoAhRB2ABsaiEHIAJB6AJqQThqIQggAkGsAmohCSACQSBqQTxqIQogAkHgA2pBJGohCyACQcQDaiEMIAJB6AJqQSRqIQ0gAkHcAWohDiACQcQBakEIaiEPIAJBxAJqIRAgAkHEAWpBLGohEQNAAkACQAJAAkACQAJAAkACQAJAIAYiEiAHRg0AIBJB2ABqIQYCQAJAAkACQAJAAkACQEEAIBIoAgAiE0F8aiIUIBQgE0sbDgkAAQIDBBAQBQYACwJAIAEtAFUNACACQYACOwDEAQJAIBNBA0cNACASKAIEIAJBxAFqEJcBCwJAIBIoAkgiE0UNACASKAJEIhUgE0EGdGohFgNAAkACQCAVKAIAQQdGDQACQCAVQThqKAIAIhNFDQAgAi0AxAFBAXENACATQQxsIRQgFUE0aigCACETA0ACQCACLQDEAQ0AIBMoAgAgAkHEAWoQlwELIBNBDGohEyAUQXRqIhQNAAsLIBUgAkHEAWoQswoMAQsCQCAVQThqKAIAIhNFDQAgAi0AxAFBAXENACATQQxsIRQgFUE0aigCACETA0ACQCACLQDEAQ0AIBMoAgAgAkHEAWoQlwELIBNBDGohEyAUQXRqIhQNAAsLIBUtABxBAkcNACAVKAIIIAJBxAFqEOgJIAItAMQBDQAgFSgCDCACQcQBahCXAQsgFUHAAGoiFSAWRw0ACwsgAi0AxAEhEwJAIBJBIGoiFSgCAEGAgICAeEYNACASKAIoIhRFDQAgE0EBcQ0AIBRBMGwhFCASKAIkIRMDQAJAIAItAMQBDQAgEyACQcQBahCuAwsgE0EwaiETIBRBUGoiFA0ACyACLQDEAUUNAQwQCyATQQFxDQ8LIAJB8ABqQQAgASgCUEEAELoKIBEgAkHwAGpB1AD8CgAAIBBBACkDqKWcASIaNwIIIBBBACkDoKWcASIbNwIAIA8gGzcCACAPIBo3AgggDiAbNwIAIA4gGjcCCCACQQA6ANQCIAJBADYCxAEgAkEAOgDsASACQcQBaiASEPIDIAIgDykCCDcD4AIgAiAPKQIANwPYAiACQegCaiAQEOwQIAggDhDsECACIBo3A9gDIAIgGzcD0AMgAigCgAMhFSACKAKEAyEWIAIoArwDIRcgAigCiAMhEyACQdADakEAIAIoArgDIhggAigCwAMiGUGBgICAeEYiFBsQiiECQCATQYGAgIB4Rg0AIAsgDSkCADcCACALIA0oAgg2AgggAiACKQP4AjcD8AMgAiACKQPwAjcD6AMgAiACKQPoAjcD4AMgAiATNgKABCACIBY2AvwDIAIgFTYC+AMCQANAIAJBkARqIAJB4ANqEPkNIAIpA5AEIhxQDQECQCACQdgCaiAcIAIoApgEEMsMRQ0AIBwQnCEMAQsgAkHQA2ogHBCVBxoMAAsLIAJB4ANqEOIeCwJAIBQNACALIAwpAgA3AgAgCyAMKAIINgIIIAIgGTYCgAQgAiAXNgL8AyACIBg2AvgDIAIgCCkDEDcD8AMgAiAIKQMINwPoAyACIAgpAwA3A+ADAkADQCACQZAEaiACQeADahD5DSACKQOQBCIcUA0BIAJB0ANqIBwQlQcaDAALCyACQeADahDiHgsgCiACKQPYAzcCCCAKIAIpA9ADNwIAIAJBIGogEUE8/AoAACACQdgCahCDGSAJELEhIAJBxAFqIAJBIGpBPPwKAAAgAiAKKQIINwPgAiACIAopAgA3A9gCIAJBxAFqEMQVIAJB6AJqIAUQ/RIgAkHoAmogAkHYAmoQowsgAiACKQLwAjcD2AMgAiACKQLoAjcD0AMCQCABKAIcIhVFDQAgAkHQA2oQuBghFiAEKAIAIhQpAwAhHCAWIBVBAWpBAXYgFSACKALcAxsQiiEgFEEIaiETIBxCf4VCgIGChIiQoMCAf4MhHANAAkAgHFANAAJAIBQgHHqnQQF0QfABcWtBcGopAwAiHUIDg0IAUg0AIB2nIhcgFygCACIXQQFqNgIAIBdBf0wNEQsgHEJ/fCAcgyEcIBYgHRCVBxogFUF/aiEVDAELIBVFDQEgFEGAf2ohFCATKQMAQn+FQoCBgoSIkKDAgH+DIRwgE0EIaiETDAALCyACQQA2AvACIAJCgICAgIABNwLoAiACQegCahDiEiABKAJMIhMNBwwMCyASQQhqIRYCQAJAIAEtAFUNACACQYACOwDEAQJAIBYoAgBBA0cNACASKAIMIAJBxAFqEJcBCyASKAIwIAJBxAFqELUKIAItAMQBDQELIAJB8ABqQQAgASgCUEEAELoKIBEgAkHwAGpB1AD8CgAAIBBBACkDqKWcASIaNwIIIBBBACkDoKWcASIbNwIAIA8gGzcCACAPIBo3AgggDiAbNwIAIA4gGjcCCCACQQA6ANQCIAJBADYCxAEgAkEAOgDsASACQcQBaiAWELsEIAIgDykCCDcD4AIgAiAPKQIANwPYAiACQegCaiAQEOwQIAggDhDsECACIBo3A9gDIAIgGzcD0AMgAigCgAMhFSACKAKEAyESIAIoArwDIRcgAigCiAMhEyACQdADakEAIAIoArgDIhggAigCwAMiGUGBgICAeEYiFBsQiiECQCATQYGAgIB4Rg0AIAsgDSkCADcCACALIA0oAgg2AgggAiACKQP4AjcD8AMgAiACKQPwAjcD6AMgAiACKQPoAjcD4AMgAiATNgKABCACIBI2AvwDIAIgFTYC+AMCQANAIAJBkARqIAJB4ANqEPkNIAIpA5AEIhxQDQECQCACQdgCaiAcIAIoApgEEMsMRQ0AIBwQnCEMAQsgAkHQA2ogHBCVBxoMAAsLIAJB4ANqEOIeCwJAIBQNACALIAwpAgA3AgAgCyAMKAIINgIIIAIgGTYCgAQgAiAXNgL8AyACIBg2AvgDIAIgCCkDEDcD8AMgAiAIKQMINwPoAyACIAgpAwA3A+ADAkADQCACQZAEaiACQeADahD5DSACKQOQBCIcUA0BIAJB0ANqIBwQlQcaDAALCyACQeADahDiHgsgCiACKQPYAzcCCCAKIAIpA9ADNwIAIAJBIGogEUE8/AoAACACQdgCahCDGSAJELEhIAJBxAFqIAJBIGpBPPwKAAAgAiAKKQIINwPgAiACIAopAgA3A9gCIAJBxAFqEMQVIAJB6AJqIAUQ/RIgAkHoAmogAkHYAmoQowsgAiACKQLwAjcD2AMgAiACKQLoAjcD0AMCQCABKAIcIhVFDQAgAkHQA2oQuBghEiAEKAIAIhQpAwAhHCASIBVBAWpBAXYgFSACKALcAxsQiiEgFEEIaiETIBxCf4VCgIGChIiQoMCAf4MhHANAAkAgHFANAAJAIBQgHHqnQQF0QfABcWtBcGopAwAiHUIDg0IAUg0AIB2nIhcgFygCACIXQQFqNgIAIBdBf0wNEQsgHEJ/fCAcgyEcIBIgHRCVBxogFUF/aiEVDAELIBVFDQEgFEGAf2ohFCATKQMAQn+FQoCBgoSIkKDAgH+DIRwgE0EIaiETDAALCyACQQA2AvACIAJCgICAgIABNwLoAiACQegCahDiEiABKAJMIhMNCAwLCyAWIAEQ8iAgEkEwaiABEKklDA4LIBJBIGohFiASKAIgIRMCQAJAIAEtAFUNACACQYACOwDEASATIAJBxAFqELUKIAItAMQBDQELIAJB8ABqQQAgASgCUEEAELoKIBEgAkHwAGpB1AD8CgAAIBBBACkDqKWcASIaNwIIIBBBACkDoKWcASIbNwIAIA8gGzcCACAPIBo3AgggDiAbNwIAIA4gGjcCCCACQQA6ANQCIAJBADYCxAEgAkEAOgDsASACQcQBaiATEJEFIAIgDykCCDcD4AIgAiAPKQIANwPYAiACQegCaiAQEOwQIAggDhDsECACIBo3A9gDIAIgGzcD0AMgAigCgAMhFSACKAKEAyESIAIoArwDIRcgAigCiAMhEyACQdADakEAIAIoArgDIhggAigCwAMiGUGBgICAeEYiFBsQiiECQCATQYGAgIB4Rg0AIAsgDSkCADcCACALIA0oAgg2AgggAiACKQP4AjcD8AMgAiACKQPwAjcD6AMgAiACKQPoAjcD4AMgAiATNgKABCACIBI2AvwDIAIgFTYC+AMCQANAIAJBkARqIAJB4ANqEPkNIAIpA5AEIhxQDQECQCACQdgCaiAcIAIoApgEEMsMRQ0AIBwQnCEMAQsgAkHQA2ogHBCVBxoMAAsLIAJB4ANqEOIeCwJAIBQNACALIAwpAgA3AgAgCyAMKAIINgIIIAIgGTYCgAQgAiAXNgL8AyACIBg2AvgDIAIgCCkDEDcD8AMgAiAIKQMINwPoAyACIAgpAwA3A+ADAkADQCACQZAEaiACQeADahD5DSACKQOQBCIcUA0BIAJB0ANqIBwQlQcaDAALCyACQeADahDiHgsgCiACKQPYAzcCCCAKIAIpA9ADNwIAIAJBIGogEUE8/AoAACACQdgCahCDGSAJELEhIAJBxAFqIAJBIGpBPPwKAAAgAiAKKQIINwPgAiACIAopAgA3A9gCIAJBxAFqEMQVIAJB6AJqIAUQ/RIgAkHoAmogAkHYAmoQowsgAiACKQLwAjcD2AMgAiACKQLoAjcD0AMCQCABKAIcIhVFDQAgAkHQA2oQuBghEiAEKAIAIhQpAwAhHCASIBVBAWpBAXYgFSACKALcAxsQiiEgFEEIaiETIBxCf4VCgIGChIiQoMCAf4MhHANAAkAgHFANAAJAIBQgHHqnQQF0QfABcWtBcGopAwAiHUIDg0IAUg0AIB2nIhcgFygCACIXQQFqNgIAIBdBf0wNEAsgHEJ/fCAcgyEcIBIgHRCVBxogFUF/aiEVDAELIBVFDQEgFEGAf2ohFCATKQMAQn+FQoCBgoSIkKDAgH+DIRwgE0EIaiETDAALCyACQQA2AvACIAJCgICAgIABNwLoAiACQegCahDiEiABKAJMIhMNCAwJCyAWIAEQqSUMDQsgEkEIaiABEPIgIAEgEkE8ahDBIiABIBJBMGoQ7hwMDAsgASASQSRqEMEiIAEgEkEsahDuHAwLCyASQQRqIAEQ6xwMCgsCQCASKAIIQQVGDQAgEkEIaiABEPIgCyABIBJBPGoQwSIgASASQTBqEO4cDAkLIAEgAEEwahDBIiACQaAEaiQADwsgAkHQA2oQuBghFCACIBM2AoADIAIgASgCQCITNgL4AiACIBNBCGo2AvACIAIgEyABKAJEakEBajYC9AIgAiATKQMAQn+FQoCBgoSIkKDAgH+DNwPoAiAUIAJB6AJqEMwNDAQLIAJB0ANqELgYIRQgAiATNgKAAyACIAEoAkAiEzYC+AIgAiATQQhqNgLwAiACIBMgASgCRGpBAWo2AvQCIAIgEykDAEJ/hUKAgYKEiJCgwIB/gzcD6AIgFCACQegCahDMDQwCCyACQdADahC4GCEUIAIgEzYCgAMgAiABKAJAIhM2AvgCIAIgE0EIajYC8AIgAiATIAEoAkRqQQFqNgL0AiACIBMpAwBCf4VCgIGChIiQoMCAf4M3A+gCIBQgAkHoAmoQzA0LIAIgGjcDmAQgAiAbNwOQBCACQQA2AvgCIAIgGzcD6AIgAiAaNwPwAiACQcQBaiACQZAEaiADIAJB6AJqIAQgAkHQA2ogAigC1AMgAigC0AMbELwBIAJB6AJqEKQMAkAgASgCAEUNACABIAIoApwEIAQQ5iAgAigCkAQiEykDACEcIAIoApQEIRQgAiACKAKcBDYCiAEgAiATNgKAASACIBMgFGpBAWo2AnwgAiATQQhqNgJ4IAIgHEJ/hUKAgYKEiJCgwIB/gzcDcANAIAJBGGogAkHwAGoQvg4gAigCGCITRQ0BIAIoAhwhFAJAIBMpAwAiHEIDg0IAUg0AIBynIhUgFSgCACIVQQFqNgIAIBVBf0wNBQsgAkHoAmogASAcIBMoAggQ6goCQCACKQPoAiIaUA0AIAIoAoADIRMgAikD+AIhGyACKALwAiEVAkAgFCkDACIcQgODQgBSDQAgHKciFCAUKAIAIhRBAWo2AgAgFEF/TA0GCyACIBw3A/gCIAIgFTYC8AIgAiAaNwPoAiATIBsgAkHoAmoQ8BAMAQsLAkAgAigC8AJBeGopAwAiHEIDg0IAUg0AIBynIgEgASgCACIBQQFqNgIAIAFBf0wNBAsgAkEANgLoAyACIBw3A+ADAkAgFCkDACIcQgODQgBSDQAgHKciFCAUKAIAIhRBAWo2AgAgFEF/TA0ECyACQQA2AiggAiAcNwMgIAJB4AStQiCGIhwgAkEgaq2ENwP4AiACIBwgAkHgA2qthDcD8AIgAiAcIBOthDcD6AJB6YWAASACQegCakHM5JoBEOsbAAsgAiACKQOYBDcD8AIgAiACKQOQBDcD6AIgAkHQA2oQ7CIgAkHEAWoQlRECQCACKAL0AkUNACACQQA2AswBIAJCgICAgIABNwLEASACIAEpAlA3AtABIAIgAkHoAmo2AtgBIBYgAkHEAWoQpyUgAkHEAWoQriELIAJB6AJqEIwNDAQLIAIgGjcDmAQgAiAbNwOQBCACQQA2AvgCIAIgGzcD6AIgAiAaNwPwAiACQcQBaiACQZAEaiADIAJB6AJqIAQgAkHQA2ogAigC1AMgAigC0AMbELwBIAJB6AJqEKQMAkAgASgCAEUNACABIAIoApwEIAQQ5iAgAigCkAQiEykDACEcIAIoApQEIRQgAiACKAKcBDYCiAEgAiATNgKAASACIBMgFGpBAWo2AnwgAiATQQhqNgJ4IAIgHEJ/hUKAgYKEiJCgwIB/gzcDcANAIAJBEGogAkHwAGoQvg4gAigCECITRQ0BIAIoAhQhFAJAIBMpAwAiHEIDg0IAUg0AIBynIhUgFSgCACIVQQFqNgIAIBVBf0wNBAsgAkHoAmogASAcIBMoAggQ6goCQCACKQPoAiIaUA0AIAIoAoADIRMgAikD+AIhGyACKALwAiEVAkAgFCkDACIcQgODQgBSDQAgHKciFCAUKAIAIhRBAWo2AgAgFEF/TA0FCyACIBw3A/gCIAIgFTYC8AIgAiAaNwPoAiATIBsgAkHoAmoQ8BAMAQsLAkAgAigC8AJBeGopAwAiHEIDg0IAUg0AIBynIgEgASgCACIBQQFqNgIAIAFBf0wNAwsgAkEANgLoAyACIBw3A+ADAkAgFCkDACIcQgODQgBSDQAgHKciFCAUKAIAIhRBAWo2AgAgFEF/TA0DCyACQQA2AiggAiAcNwMgIAJB4AStQiCGIhwgAkEgaq2ENwP4AiACIBwgAkHgA2qthDcD8AIgAiAcIBOthDcD6AJB6YWAASACQegCakHM5JoBEOsbAAsgAiACKQOYBDcD8AIgAiACKQOQBDcD6AIgAkHQA2oQ7CIgAkHEAWoQlRECQCACKAL0AkUNACACQQA2AswBIAJCgICAgIABNwLEASACIAEpAlA3AtABIAIgAkHoAmo2AtgBIBYgAkHEAWoQ8CAgAkHEAWoQriELIAJB6AJqEIwNDAMLIAIgGjcDmAQgAiAbNwOQBCACQQA2AvgCIAIgGzcD6AIgAiAaNwPwAiACQcQBaiACQZAEaiADIAJB6AJqIAQgAkHQA2ogAigC1AMgAigC0AMbELwBIAJB6AJqEKQMAkAgASgCAEUNACABIAIoApwEIAQQ5iAgAigCkAQiEykDACEcIAIoApQEIRQgAiACKAKcBDYCiAEgAiATNgKAASACIBMgFGpBAWo2AnwgAiATQQhqNgJ4IAIgHEJ/hUKAgYKEiJCgwIB/gzcDcANAIAJBCGogAkHwAGoQvg4gAigCCCITRQ0BIAIoAgwhFAJAIBMpAwAiHEIDg0IAUg0AIBynIhUgFSgCACIVQQFqNgIAIBVBf0wNAwsgAkHoAmogASAcIBMoAggQ6goCQCACKQPoAiIaUA0AIAIoAoADIRMgAikD+AIhGyACKALwAiEVAkAgFCkDACIcQgODQgBSDQAgHKciFCAUKAIAIhRBAWo2AgAgFEF/TA0ECyACIBw3A/gCIAIgFTYC8AIgAiAaNwPoAiATIBsgAkHoAmoQ8BAMAQsLAkAgAigC8AJBeGopAwAiHEIDg0IAUg0AIBynIgEgASgCACIBQQFqNgIAIAFBf0wNAgsgAkEANgLoAyACIBw3A+ADAkAgFCkDACIcQgODQgBSDQAgHKciFCAUKAIAIhRBAWo2AgAgFEF/TA0CCyACQQA2AiggAiAcNwMgIAJB4AStQiCGIhwgAkEgaq2ENwP4AiACIBwgAkHgA2qthDcD8AIgAiAcIBOthDcD6AJB6YWAASACQegCakHM5JoBEOsbAAsgAiACKQOYBDcD8AIgAiACKQOQBDcD6AIgAkHQA2oQ7CIgAkHEAWoQlRECQCACKAL0AkUNACACQQA2AswBIAJCgICAgIABNwLEASACIAEpAlA3AtABIAIgAkHoAmo2AtgBIBIgAkHEAWoQsg4gAkHEAWoQriELIAJB6AJqEIwNDAILAAsgEiABEPIgIBIoAkhBBnQhFCASKAJEIRMDQAJAAkAgFEUNAAJAIBMoAgBBB0YNACATIAEQxSIMAgsgASATQTBqEO4cIBNBHGotAABBAkcNASATQQhqIAEQxiIMAQsgASAVEN4hDAILIBNBwABqIRMgFEFAaiEUDAALCwvfPgIDfwF+IwBBwAJrIgIkAAJAAkACQAJAAkACQANAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIAIgNBgICAgHhzQTQgA0EASBsOvQEAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wvgExMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AbgBugG7AbwBAAsgAEEONgIIIABBvNuYATYCBCAAQYCAgIB4NgIADL4BCyAAQRo2AgggAEHK25gBNgIEIABBgICAgHg2AgAMvQELIABBIDYCCCAAQeTbmAE2AgQgAEGAgICAeDYCAAy8AQsgAEEvNgIIIABBhNyYATYCBCAAQYCAgIB4NgIADLsBCyAAQdMANgIIIABBs9yYATYCBCAAQYCAgIB4NgIADLoBCyAAQSk2AgggAEGG3ZgBNgIEIABBgICAgHg2AgAMuQELIABBJjYCCCAAQa/dmAE2AgQgAEGAgICAeDYCAAy4AQsgAEEqNgIIIABB1d2YATYCBCAAQYCAgIB4NgIADLcBCyAAQRE2AgggAEH/3ZgBNgIEIABBgICAgHg2AgAMtgELIABBFzYCCCAAQZDemAE2AgQgAEGAgICAeDYCAAy1AQsgAEEsNgIIIABBp96YATYCBCAAQYCAgIB4NgIADLQBCyAAQeIANgIIIABB096YATYCBCAAQYCAgIB4NgIADLMBCyAAQRo2AgggAEG135gBNgIEIABBgICAgHg2AgAMsgELIABBJTYCCCAAQc/fmAE2AgQgAEGAgICAeDYCAAyxAQsgAEEcNgIIIABB9N+YATYCBCAAQYCAgIB4NgIADLABCyAAQSc2AgggAEGQ4JgBNgIEIABBgICAgHg2AgAMrwELIABBJzYCCCAAQbfgmAE2AgQgAEGAgICAeDYCAAyuAQsgAEEnNgIIIABB3uCYATYCBCAAQYCAgIB4NgIADK0BCyAAQTA2AgggAEGF4ZgBNgIEIABBgICAgHg2AgAMrAELIABBKTYCCCAAQbXhmAE2AgQgAEGAgICAeDYCAAyrAQsgAEE1NgIIIABB3uGYATYCBCAAQYCAgIB4NgIADKoBCyAAQTM2AgggAEGT4pgBNgIEIABBgICAgHg2AgAMqQELIABBHzYCCCAAQcbimAE2AgQgAEGAgICAeDYCAAyoAQsCQCABLQAEQX5qIgFBB3QgAUH+AXFBAXZyIgNB/wFxIgFBB0sNAEGZASABdkEBcQ2mAQtBqPOaAUEoQYzjmAEQuSEACyAAQSg2AgggAEGc45gBNgIEIABBgICAgHg2AgAMpgELIABBJTYCCCAAQcTjmAE2AgQgAEGAgICAeDYCAAylAQsgAEEaNgIIIABB6eOYATYCBCAAQYCAgIB4NgIADKQBCyAAQRw2AgggAEGD5JgBNgIEIABBgICAgHg2AgAMowELIABBFzYCCCAAQZ/kmAE2AgQgAEGAgICAeDYCAAyiAQsgAiABQQhqNgKoAiACQeMErUIghiACQagCaq2ENwPYASACQRhqQbSUgAEgAkHYAWoQshAgACACKAIgNgIIIAAgAikCGDcCAAyhAQsgAEEbNgIIIABBtuSYATYCBCAAQYCAgIB4NgIADKABCyAAQRU2AgggAEHR5JgBNgIEIABBgICAgHg2AgAMnwELIABBHzYCCCAAQebkmAE2AgQgAEGAgICAeDYCAAyeAQsgAiABQQRqNgKoAiACQdoErUIghiACQagCaq2ENwPYASACQSRqQZ2HgAEgAkHYAWoQshAgACACKAIsNgIIIAAgAikCJDcCAAydAQsgAEEVNgIIIABBheWYATYCBCAAQYCAgIB4NgIADJwBCyAAQRY2AgggAEGa5ZgBNgIEIABBgICAgHg2AgAMmwELIAIgAUEEajYCqAIgAkEkrUIghiACQagCaq2ENwPYASACQTBqQaeKgAEgAkHYAWoQshAgACACKAI4NgIIIAAgAikCMDcCAAyaAQsgAEEmNgIIIABBsOWYATYCBCAAQYCAgIB4NgIADJkBCyAAQS02AgggAEHW5ZgBNgIEIABBgICAgHg2AgAMmAELIAIgAUEIajYCqAIgAkHjBK1CIIYgAkGoAmqthDcD2AEgAkE8akH8pYEBIAJB2AFqELIQIAAgAigCRDYCCCAAIAIpAjw3AgAMlwELIABBOzYCCCAAQYPmmAE2AgQgAEGAgICAeDYCAAyWAQsgAEHMADYCCCAAQb7mmAE2AgQgAEGAgICAeDYCAAyVAQsgAEE6NgIIIABBiueYATYCBCAAQYCAgIB4NgIADJQBCyAAQcoANgIIIABBxOeYATYCBCAAQYCAgIB4NgIADJMBCyAAQTE2AgggAEGO6JgBNgIEIABBgICAgHg2AgAMkgELIABBFDYCCCAAQb/omAE2AgQgAEGAgICAeDYCAAyRAQsgAEEfNgIIIABB0+iYATYCBCAAQYCAgIB4NgIADJABCyAAQTI2AgggAEHy6JgBNgIEIABBgICAgHg2AgAMjwELIAIgAUEEajYCmAIgAiABQRBqNgKoAiACQSStQiCGIAJBqAJqrYQ3A+ABIAJB9wCtQiCGIAJBmAJqrYQ3A9gBIAJByABqQdCLgAEgAkHYAWoQshAgACACKAJQNgIIIAAgAikCSDcCAAyOAQsgAEEeNgIIIABBq+mYATYCBCAAQYCAgIB4NgIADI0BCyAAQSU2AgggAEHJ6ZgBNgIEIABBgICAgHg2AgAMjAELIAIgATYCmAIgAiABQQxqNgKoAiACQfcArUIghiIFIAJBqAJqrYQ3A+ABIAIgBSACQZgCaq2ENwPYASACQdQAakHysoEBIAJB2AFqELIQIAAgAigCXDYCCCAAIAIpAlQ3AgAMiwELIABBGjYCCCAAQe7pmAE2AgQgAEGAgICAeDYCAAyKAQsgAEHVADYCCCAAQYjqmAE2AgQgAEGAgICAeDYCAAyJAQsgAEEyNgIIIABB3eqYATYCBCAAQYCAgIB4NgIADIgBCyAAQdIANgIIIABBj+uYATYCBCAAQYCAgIB4NgIADIcBCyAAQSw2AgggAEHh65gBNgIEIABBgICAgHg2AgAMhgELIABBMzYCCCAAQY3smAE2AgQgAEGAgICAeDYCAAyFAQsgAEEiNgIIIABBwOyYATYCBCAAQYCAgIB4NgIADIQBCyAAQTc2AgggAEHi7JgBNgIEIABBgICAgHg2AgAMgwELIABBKDYCCCAAQZntmAE2AgQgAEGAgICAeDYCAAyCAQsgAEENNgIIIABBwe2YATYCBCAAQYCAgIB4NgIADIEBCyAAQRE2AgggAEHO7ZgBNgIEIABBgICAgHg2AgAMgAELIABBFTYCCCAAQd/tmAE2AgQgAEGAgICAeDYCAAx/CyAAQRk2AgggAEH07ZgBNgIEIABBgICAgHg2AgAMfgsgAEEONgIIIABBje6YATYCBCAAQYCAgIB4NgIADH0LIABBGjYCCCAAQZvumAE2AgQgAEGAgICAeDYCAAx8CyACIAFBCGo2AqgCIAJB4wStQiCGIAJBqAJqrYQ3A9gBIAJB4ABqQamngQEgAkHYAWoQshAgACACKAJoNgIIIAAgAikCYDcCAAx7CyAAQSU2AgggAEG17pgBNgIEIABBgICAgHg2AgAMegsgAEEtNgIIIABB2u6YATYCBCAAQYCAgIB4NgIADHkLIABBPDYCCCAAQYfvmAE2AgQgAEGAgICAeDYCAAx4CyAAQTQ2AgggAEHD75gBNgIEIABBgICAgHg2AgAMdwsgAEErNgIIIABB9++YATYCBCAAQYCAgIB4NgIADHYLIABBLTYCCCAAQaLwmAE2AgQgAEGAgICAeDYCAAx1CyAAQSQ2AgggAEHP8JgBNgIEIABBgICAgHg2AgAMdAsgAEEdNgIIIABB8/CYATYCBCAAQYCAgIB4NgIADHMLIABBKDYCCCAAQZDxmAE2AgQgAEGAgICAeDYCAAxyCyAAQS42AgggAEG48ZgBNgIEIABBgICAgHg2AgAMcQsgAEEqNgIIIABB5vGYATYCBCAAQYCAgIB4NgIADHALIABBNjYCCCAAQZDymAE2AgQgAEGAgICAeDYCAAxvCyAAQT42AgggAEHG8pgBNgIEIABBgICAgHg2AgAMbgsgAEEzNgIIIABBhPOYATYCBCAAQYCAgIB4NgIADG0LIABBKTYCCCAAQbfzmAE2AgQgAEGAgICAeDYCAAxsCyAAQRk2AgggAEHg85gBNgIEIABBgICAgHg2AgAMawsgAEE7NgIIIABB+fOYATYCBCAAQYCAgIB4NgIADGoLIABBPTYCCCAAQbT0mAE2AgQgAEGAgICAeDYCAAxpCyAAQS02AgggAEHx9JgBNgIEIABBgICAgHg2AgAMaAsgAiABQQhqNgKoAiACQeMErUIghiACQagCaq2ENwPYASACQewAakGbqoEBIAJB2AFqELIQIAAgAigCdDYCCCAAIAIpAmw3AgAMZwsgAEE6NgIIIABBnvWYATYCBCAAQYCAgIB4NgIADGYLIABB8AA2AgggAEHY9ZgBNgIEIABBgICAgHg2AgAMZQsgAEE1NgIIIABByPaYATYCBCAAQYCAgIB4NgIADGQLIABByQA2AgggAEH99pgBNgIEIABBgICAgHg2AgAMYwsgAEEpNgIIIABBxveYATYCBCAAQYCAgIB4NgIADGILIABBJjYCCCAAQe/3mAE2AgQgAEGAgICAeDYCAAxhCyAAQTs2AgggAEGV+JgBNgIEIABBgICAgHg2AgAMYAsgAEE4NgIIIABB0PiYATYCBCAAQYCAgIB4NgIADF8LIAIgAUEIajYCqAIgAkHjBK1CIIYgAkGoAmqthDcD2AEgAkH4AGpBvKSBASACQdgBahCyECAAIAIoAoABNgIIIAAgAikCeDcCAAxeCyAAQSc2AgggAEGI+ZgBNgIEIABBgICAgHg2AgAMXQsgAEEbNgIIIABBr/mYATYCBCAAQYCAgIB4NgIADFwLIABBITYCCCAAQcr5mAE2AgQgAEGAgICAeDYCAAxbCyAAQSU2AgggAEHr+ZgBNgIEIABBgICAgHg2AgAMWgsgAEHOADYCCCAAQZD6mAE2AgQgAEGAgICAeDYCAAxZCyAAQR02AgggAEHe+pgBNgIEIABBgICAgHg2AgAMWAsgAEE5NgIIIABB+/qYATYCBCAAQYCAgIB4NgIADFcLIABBOTYCCCAAQbT7mAE2AgQgAEGAgICAeDYCAAxWCyAAQTk2AgggAEHt+5gBNgIEIABBgICAgHg2AgAMVQsgAEEwNgIIIABBpvyYATYCBCAAQYCAgIB4NgIADFQLIABBLjYCCCAAQdb8mAE2AgQgAEGAgICAeDYCAAxTCyACIAFBCGo2AqgCIAJB4wStQiCGIAJBqAJqrYQ3A9gBIAJBhAFqQdGlgQEgAkHYAWoQshAgACACKAKMATYCCCAAIAIpAoQBNwIADFILIABBPzYCCCAAQYT9mAE2AgQgAEGAgICAeDYCAAxRCyAAQTY2AgggAEHD/ZgBNgIEIABBgICAgHg2AgAMUAsgAiABQQhqNgKoAiACQeMErUIghiACQagCaq2ENwPYASACQZABakGIqYEBIAJB2AFqELIQIAAgAigCmAE2AgggACACKQKQATcCAAxPCyAAQcYANgIIIABB+f2YATYCBCAAQYCAgIB4NgIADE4LIABBKDYCCCAAQb/+mAE2AgQgAEGAgICAeDYCAAxNCyACIAFBBGo2AqgCIAJB5AStQiCGIAJBqAJqrYQ3A9gBIAJBnAFqQaasgQEgAkHYAWoQshAgACACKAKkATYCCCAAIAIpApwBNwIADEwLIABBITYCCCAAQef+mAE2AgQgAEGAgICAeDYCAAxLCyAAQRY2AgggAEGI/5gBNgIEIABBgICAgHg2AgAMSgsgAEEUNgIIIABBnv+YATYCBCAAQYCAgIB4NgIADEkLIABBHTYCCCAAQbL/mAE2AgQgAEGAgICAeDYCAAxICyAAQTE2AgggAEHP/5gBNgIEIABBgICAgHg2AgAMRwsgAEEzNgIIIABBgICZATYCBCAAQYCAgIB4NgIADEYLIAIgAUEIajYCmAIgAiABQRBqNgKoAiACQeMErUIghiIFIAJBqAJqrYQ3A+ABIAIgBSACQZgCaq2ENwPYASACQagBakHeq4EBIAJB2AFqELIQIAAgAigCsAE2AgggACACKQKoATcCAAxFCyACIAFBCGo2AqgCIAJB4wStQiCGIAJBqAJqrYQ3A9gBIAJBtAFqQYmsgQEgAkHYAWoQshAgACACKAK8ATYCCCAAIAIpArQBNwIADEQLIABBPzYCCCAAQbOAmQE2AgQgAEGAgICAeDYCAAxDCyAAQcUANgIIIABB8oCZATYCBCAAQYCAgIB4NgIADEILIABBJDYCCCAAQbeBmQE2AgQgAEGAgICAeDYCAAxBCyAAQSM2AgggAEHbgZkBNgIEIABBgICAgHg2AgAMQAsgAEErNgIIIABB/oGZATYCBCAAQYCAgIB4NgIADD8LIABBODYCCCAAQamCmQE2AgQgAEGAgICAeDYCAAw+CyAAQc4ANgIIIABB4YKZATYCBCAAQYCAgIB4NgIADD0LIAIgAUEIajYCqAIgAkHjBK1CIIYgAkGoAmqthDcD2AEgAkHAAWpB9KSBASACQdgBahCyECAAIAIoAsgBNgIIIAAgAikCwAE3AgAMPAsgAEE6NgIIIABBr4OZATYCBCAAQYCAgIB4NgIADDsLIABBMjYCCCAAQemDmQE2AgQgAEGAgICAeDYCAAw6CyAAQSM2AgggAEGbhJkBNgIEIABBgICAgHg2AgAMOQsgAEEpNgIIIABBvoSZATYCBCAAQYCAgIB4NgIADDgLIABBOTYCCCAAQeeEmQE2AgQgAEGAgICAeDYCAAw3CyAAQdYANgIIIABBoIWZATYCBCAAQYCAgIB4NgIADDYLIABBPzYCCCAAQfaFmQE2AgQgAEGAgICAeDYCAAw1CyAAQSo2AgggAEG1hpkBNgIEIABBgICAgHg2AgAMNAsgAEETNgIIIABB34aZATYCBCAAQYCAgIB4NgIADDMLIABBDTYCCCAAQfKGmQE2AgQgAEGAgICAeDYCAAwyCyAAQQ82AgggAEH/hpkBNgIEIABBgICAgHg2AgAMMQsgAEHTADYCCCAAQY6HmQE2AgQgAEGAgICAeDYCAAwwCyAAQcYANgIIIABB4YeZATYCBCAAQYCAgIB4NgIADC8LIABBKTYCCCAAQaeImQE2AgQgAEGAgICAeDYCAAwuCyAAQTI2AgggAEHQiJkBNgIEIABBgICAgHg2AgAMLQsgAEEsNgIIIABBgomZATYCBCAAQYCAgIB4NgIADCwLIABBMDYCCCAAQa6JmQE2AgQgAEGAgICAeDYCAAwrCyAAQT02AgggAEHeiZkBNgIEIABBgICAgHg2AgAMKgsgAEEeNgIIIABBm4qZATYCBCAAQYCAgIB4NgIADCkLIABBMjYCCCAAQbmKmQE2AgQgAEGAgICAeDYCAAwoCyAAQSY2AgggAEHripkBNgIEIABBgICAgHg2AgAMJwsgAEEgNgIIIABBkYuZATYCBCAAQYCAgIB4NgIADCYLIABBODYCCCAAQbGLmQE2AgQgAEGAgICAeDYCAAwlCyAAQRw2AgggAEHpi5kBNgIEIABBgICAgHg2AgAMJAsgAEEiNgIIIABBhYyZATYCBCAAQYCAgIB4NgIADCMLIABBOjYCCCAAQaeMmQE2AgQgAEGAgICAeDYCAAwiCyAAQTM2AgggAEHhjJkBNgIEIABBgICAgHg2AgAMIQsgAEHEADYCCCAAQZSNmQE2AgQgAEGAgICAeDYCAAwgCyACIAFBCGo2ApgCIAIgAUEQajYCqAIgAkHjBK1CIIYiBSACQagCaq2ENwPgASACIAUgAkGYAmqthDcD2AEgAkHMAWpBrKuBASACQdgBahCyECAAIAIoAtQBNgIIIAAgAikCzAE3AgAMHwsgAEE6NgIIIABB2I2ZATYCBCAAQYCAgIB4NgIADB4LIABBLjYCCCAAQZKOmQE2AgQgAEGAgICAeDYCAAwdCyAAQS02AgggAEHAjpkBNgIEIABBgICAgHg2AgAMHAsgAiABQQhqNgKoAiACQeMErUIghiACQagCaq2ENwPYASACQegBakGLpIEBIAJB2AFqELIQIAAgAigC8AE2AgggACACKQLoATcCAAwbCyACIAFBCGo2AqgCIAJB4wStQiCGIAJBqAJqrYQ3A9gBIAJB9AFqQbSjgQEgAkHYAWoQshAgACACKAL8ATYCCCAAIAIpAvQBNwIADBoLIAIgAUEIajYCqAIgAkHjBK1CIIYgAkGoAmqthDcD2AEgAkGAAmpB6pWAASACQdgBahCyECAAIAIoAogCNgIIIAAgAikCgAI3AgAMGQsgAEHoADYCCCAAQe2OmQE2AgQgAEGAgICAeDYCAAwYCyAAQegANgIIIABB1Y+ZATYCBCAAQYCAgIB4NgIADBcLIABBxAA2AgggAEG9kJkBNgIEIABBgICAgHg2AgAMFgsgAEHTADYCCCAAQYGRmQE2AgQgAEGAgICAeDYCAAwVCyAAQdcANgIIIABB1JGZATYCBCAAQYCAgIB4NgIADBQLIABB2gA2AgggAEGrkpkBNgIEIABBgICAgHg2AgAMEwsgAEESNgIIIABBhZOZATYCBCAAQYCAgIB4NgIADBILIABBGTYCCCAAQZeTmQE2AgQgAEGAgICAeDYCAAwRCyAAQSk2AgggAEGwk5kBNgIEIABBgICAgHg2AgAMEAsgAEHJADYCCCAAQdmTmQE2AgQgAEGAgICAeDYCAAwPCyAAQc4ANgIIIABBopSZATYCBCAAQYCAgIB4NgIADA4LIABB1wA2AgggAEHwlJkBNgIEIABBgICAgHg2AgAMDQsgAEE+NgIIIABBx5WZATYCBCAAQYCAgIB4NgIADAwLIABB6gA2AgggAEGFlpkBNgIEIABBgICAgHg2AgAMCwsgAEHhADYCCCAAQe+WmQE2AgQgAEGAgICAeDYCAAwKCyAAQcMANgIIIABB0JeZATYCBCAAQYCAgIB4NgIADAkLIABBNTYCCCAAQZOYmQE2AgQgAEGAgICAeDYCAAwICyACIAFBCGo2AqgCIAJB4wStQiCGIAJBqAJqrYQ3A9gBIAJBjAJqQYuzgQEgAkHYAWoQshAgACACKAKUAjYCCCAAIAIpAowCNwIADAcLIAEoAgQoAgBBCGohAQwACwsgAEHhADYCCCAAQciYmQE2AgQgAEGAgICAeDYCAAwECyAAQe4ANgIIIABBqZmZATYCBCAAQYCAgIB4NgIADAMLIABBIzYCCCAAQZeamQE2AgQgAEGAgICAeDYCAAwCCyACIANBAnRB/AdxIgEoApz/nAE2AqwCIAIgASgC/P6cATYCqAIgAkEBrUIghiACQagCaq2ENwPYASACQQxqQdeVgAEgAkHYAWoQshAgACACKAIUNgIIIAAgAikCDDcCAAwBCwJAAkAgASgCDCIDQQNJDQAgAkGoAmogASgCCCIBIANBf2oiA0Gk6ZgBQQMQmgYgAkEBrUIghiABIANBA3RqrYQ3A5gCIAJB2AFqQZeHgAEgAkGYAmoQshAgAigC3AEhAyACQagCaiACKALgASIBEI8fIAIoArACIQQCQCABRQ0AIAFFDQAgAigCrAIgBGogAyAB/AoAAAsgAiACKQKoAjcDmAIgAiAEIAFqNgKgAiACKALYASADELIjDAELIAJBmAJqIAEoAgggA0Gn6ZgBQQQQmgYLIAJB5QStQiCGIAJBmAJqrYQ3A9gBIAJBtAJqQeqpgQEgAkHYAWoQshAgACACKAK8AjYCCCAAIAIpArQCNwIAIAIoApgCIAIoApwCELIjCyACQcACaiQAC7EuAgx/An4jAEHgAGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiA0F0akEHIANBC0sbDiYgAAEDAgQFBgcICQoLDA0gDg8QERIgExQVICAWFxgZGhscHSAeICALIAAoAgwiA0UNHyADQQR0IQQgACgCCCEDIAFBLGohBQNAAkAgAygCAEECRg0AIAEtACghBiABQQA6ACggAS0AeSEHIAFBADoAeQJAIANBDGooAgAiACgCAEEaRw0AIABBGGooAgAhCAJAIAApAwgiDkIDg0IAUg0AIA6nIgkgCSgCACIJQQFqNgIAIAlBf0wNIgsgBSAOIAgQrgsLIAAgARBvIAEgBjoAKCABIAc6AHkLIANBEGohAyAEQXBqIgQNAAwgCwsgACgCDCIDRQ0eIANBDGwhBCAAKAIIIQMgAUEsaiEFA0ACQAJAIAMoAgAiAA0AIANBBGooAgAiACABENkDIAAoAgBBBUcNASAAQRhqKAIAIQYCQCAAKQMIIg5CA4NCAFINACAOpyIAIAAoAgAiAEEBajYCACAAQX9MDSELIAUgDiAGEK4LDAELIAEtACghBiABQQA6ACggAS0AeSEHIAFBADoAeQJAIAAoAgBBGkcNACAAQRhqKAIAIQgCQCAAKQMIIg5CA4NCAFINACAOpyIJIAkoAgAiCUEBajYCACAJQX9MDSELIAUgDiAIEK4LCyAAIAEQbyABIAY6ACggASAHOgB5CyADQQxqIQMgBEF0aiIEDQAMHwsLIAEtACghBCABQQA6ACggAS0AeSEGIAFBADoAeQJAIAAoAgQiAygCAEEaRw0AIANBGGooAgAhAAJAIAMpAwgiDkIDg0IAUg0AIA6nIgcgBygCACIHQQFqNgIAIAdBf0wNHgsgAUEsaiAOIAAQrgsLIAMgARBvIAEgBDoAKCABIAY6AHkMHQsgASAAQQhqEIACDBwLIAEtACghBCABQQA6ACggAS0AeSEGIAFBADoAeQJAIAAoAgwiAygCAEEaRw0AIANBGGooAgAhAAJAIAMpAwgiDkIDg0IAUg0AIA6nIgcgBygCACIHQQFqNgIAIAdBf0wNHAsgAUEsaiAOIAAQrgsLIAMgARBvIAEgBDoAKCABIAY6AHkMGwsgAS0AKCEEIAFBADoAKCABLQB5IQYgAUEAOgB5IAFBLGohBwJAIAAoAgQiAygCAEEaRw0AIANBGGooAgAhCAJAIAMpAwgiDkIDg0IAUg0AIA6nIgUgBSgCACIFQQFqNgIAIAVBf0wNGwsgByAOIAgQrgsLIAMgARBvIAFBADoAeSABQQA6ACgCQCAAKAIIIgMoAgBBGkcNACADQRhqKAIAIQACQCADKQMIIg5CA4NCAFINACAOpyIIIAgoAgAiCEEBajYCACAIQX9MDRsLIAcgDiAAEK4LCyADIAEQbyABIAQ6ACggASAGOgB5DBoLIAEtAHkhBCABQQA6AHkCQAJAIANBC0cNACABIABBBGoQtgcMAQsgACABEJQCCyABQQA6AHkgAS0AKCEGIAFBADoAKAJAIAAoAjgiAygCAEEaRw0AIANBGGooAgAhAAJAIAMpAwgiDkIDg0IAUg0AIA6nIgcgBygCACIHQQFqNgIAIAdBf0wNGgsgAUEsaiAOIAAQrgsLIAMgARBvIAEgBjoAKCABIAQ6AHkMGQsgAS0AKCEEIAFBADoAKCABLQB5IQYgAUEAOgB5AkAgACgCKCIDKAIAQRpHDQAgA0EYaigCACEHAkAgAykDCCIOQgODQgBSDQAgDqciCCAIKAIAIghBAWo2AgAgCEF/TA0ZCyABQSxqIA4gBxCuCwsgAyABEG8gASAEOgAoIAEgBjoAeSAAKAIIQQJHDRggASAAQQxqEKYRDBgLIAAoAghFDRcgASAAQQxqEKYRDBcLIAEtACghBiABQQA6ACggAS0AeSEHIAFBADoAeSABQSxqIQQCQCAAKAIEIgMoAgBBGkcNACADQRhqKAIAIQgCQCADKQMIIg5CA4NCAFINACAOpyIFIAUoAgAiBUEBajYCACAFQX9MDRcLIAQgDiAIEK4LCyADIAEQbyABQQA6AHkgAUEAOgAoAkAgACgCCCIDKAIAQRpHDQAgA0EYaigCACEIAkAgAykDCCIOQgODQgBSDQAgDqciBSAFKAIAIgVBAWo2AgAgBUF/TA0XCyAEIA4gCBCuCwsgAyABEG8gAUEAOgB5IAFBADoAKAJAIAAoAgwiAygCAEEaRw0AIANBGGooAgAhAAJAIAMpAwgiDkIDg0IAUg0AIA6nIgggCCgCACIIQQFqNgIAIAhBf0wNFwsgBCAOIAAQrgsLIAMgARBvIAEgBjoAKCABIAc6AHkMFgsCQCAALQAYQQVHDQAgACgCECABEN4RCyAAKAIMIgNFDRUgA0EEdCEEIAAoAghBDGohAyABQSxqIQUgAS0AeSEGIAEtACghBwNAIAFBADoAeSABQQA6ACgCQCADKAIAIgAoAgBBGkcNACAAQRhqKAIAIQgCQCAAKQMIIg5CA4NCAFINACAOpyIJIAkoAgAiCUEBajYCACAJQX9MDRcLIAUgDiAIEK4LCyAAIAEQbyABIAc6ACggASAGOgB5IANBEGohAyAEQXBqIgRFDRYMAAsLIAEtACghBCABQQA6ACggAS0AeSEGIAFBADoAeQJAIAAoAhAiAygCAEEaRw0AIANBGGooAgAhBwJAIAMpAwgiDkIDg0IAUg0AIA6nIgggCCgCACIIQQFqNgIAIAhBf0wNFQsgAUEsaiAOIAcQrgsLIAMgARBvIAEgBDoAKCABIAY6AHkgACgCBEGAgICAeEYNFCAAKAIIIAAoAgwgARCWDgwUCyAAKAIMIgNFDRMgA0ECdCEEIAAoAgghAyABQSxqIQUgAS0AeSEGIAEtACghBwNAIAFBADoAeSABQQA6ACgCQCADKAIAIgAoAgBBGkcNACAAQRhqKAIAIQgCQCAAKQMIIg5CA4NCAFINACAOpyIJIAkoAgAiCUEBajYCACAJQX9MDRULIAUgDiAIEK4LCyADQQRqIQMgACABEG8gASAHOgAoIAEgBjoAeSAEQXxqIgRFDRQMAAsLIAEtAJABDRIgACgCGCIDRQ0SAkAgACkDCCIOQgODQgBSDQAgDqciACAAKAIAIgBBAWo2AgAgAEF/TA0SCyABQYABaiAOIAMQogcaDBILIAAoAgwiA0UNESADQQJ0IQQgACgCCCEDIAFBLGohBSABLQB5IQYgAS0AKCEHA0AgAUEAOgB5IAFBADoAKAJAIAMoAgAiACgCAEEaRw0AIABBGGooAgAhCAJAIAApAwgiDkIDg0IAUg0AIA6nIgkgCSgCACIJQQFqNgIAIAlBf0wNEwsgBSAOIAgQrgsLIANBBGohAyAAIAEQbyABIAc6ACggASAGOgB5IARBfGoiBEUNEgwACwsgAS0AKCEGIAFBADoAKCABLQB5IQcgAUEAOgB5IAFBLGohBQJAIAAoAgQiAygCAEEaRw0AIANBGGooAgAhBAJAIAMpAwgiDkIDg0IAUg0AIA6nIgggCCgCACIIQQFqNgIAIAhBf0wNEQsgBSAOIAQQrgsLIAMgARBvIAEgBjoAKCABIAc6AHkgACgCCCIDQQhqKAIAIgBFDRAgAEECdCEEIANBBGooAgAhAwNAIAFBADoAeSABQQA6ACgCQCADKAIAIgAoAgBBGkcNACAAQRhqKAIAIQgCQCAAKQMIIg5CA4NCAFINACAOpyIJIAkoAgAiCUEBajYCACAJQX9MDRILIAUgDiAIEK4LCyADQQRqIQMgACABEG8gASAGOgAoIAEgBzoAeSAEQXxqIgRFDREMAAsLIAEgAEEEahCQBwwPC0EAIQMgAkEANgFaIAJBADYCFCACQoCAgICAATcCDCACQoCAgICAATcCSCACQoCAgIDAADcCOCACQQA2AlAgAkEBOgBEIAJBADYCQCACIAEvAXg7AVggAiABKAJ0NgJUIAJBACkDoKWcASIONwIYIAJBACkDqKWcASIPNwIgIAIgDjcCKCACIA83AjAgAiABLQB+OgBeIAFBLGohCQJAA0AgA0HUAEYNASABIANqQSxqIgQoAgAhBiAEIAJBDGogA2oiBygCADYCACAHIAY2AgAgA0EEaiEDDAALCyAJIABBCGoiAxCkDwJAIAAtABwiCkECRg0AIAEtAJABDQAgACgCGCIERQ0AAkAgAykDACIOQgODQgBSDQAgDqciAyADKAIAIgNBAWo2AgAgA0F/TA0PCyABQYABaiAOIAQQogcaCwJAIAAoAiAiC0EIaigCACIDRQ0AIANBDGwhBiALQQRqKAIAIQMgAS0AeSEHIAEtACghCANAIAFBADoAeSABQQA6ACgCQCADKAIAIgQoAgBBGkcNACAEQRhqKAIAIQUCQCAEKQMIIg5CA4NCAFINACAOpyIMIAwoAgAiDEEBajYCACAMQX9MDRELIAkgDiAFEK4LCyADQQxqIQMgBCABEG8gASAIOgAoIAEgBzoAeSAGQXRqIgYNAAsLAkAgC0EUaigCACIDRQ0AIANB2ABsIQQgC0EQaigCACEDA0AgAyABELkCIANB2ABqIQMgBEGof2oiBA0ACwsCQCALKAIwIgNFDQAgAS0AKCEEIAFBADoAKCABLQB5IQYgAUEAOgB5AkAgAygCAEEaRw0AIANBGGooAgAhBwJAIAMpAwgiDkIDg0IAUg0AIA6nIgggCCgCACIIQQFqNgIAIAhBf0wNEAsgCSAOIAcQrgsLIAMgARBvIAEgBDoAKCABIAY6AHkLAkAgCkECRg0AIAEgACkDCCAAKAIYEJERCyAJIAJBDGoQnAQMDgsgACgCDCIDRQ0NIAMgARDeEQwNCyABLQAoIQQgAUEAOgAoIAEtAHkhBiABQQA6AHkCQCAAKAIEIgMoAgBBGkcNACADQRhqKAIAIQACQCADKQMIIg5CA4NCAFINACAOpyIHIAcoAgAiB0EBajYCACAHQX9MDQ0LIAFBLGogDiAAEK4LCyADIAEQbyABIAQ6ACggASAGOgB5DAwLIAEtACghBCABQQA6ACggAS0AeSEGIAFBADoAeQJAIAAoAgQiAygCAEEaRw0AIANBGGooAgAhAAJAIAMpAwgiDkIDg0IAUg0AIA6nIgcgBygCACIHQQFqNgIAIAdBf0wNDAsgAUEsaiAOIAAQrgsLIAMgARBvIAEgBDoAKCABIAY6AHkMCwsgAEEgaiEDAkAgAC0ANEECRg0AIAEtAJABDQsgACgCMCIARQ0LAkAgAykDACIOQgODQgBSDQAgDqciAyADKAIAIgNBAWo2AgAgA0F/TA0LCyABQYABaiAOIAAQogcaDAsLA0AgAygCACIAQRhqIQMgAC0ALEECRg0ACyABLQCQAQ0KIABBKGooAgAiAEUNCgJAIAMpAwAiDkIDg0IAUg0AIA6nIgMgAygCACIDQQFqNgIAIANBf0wNCgsgAUGAAWogDiAAEKIHGgwKCyAAKAIEIgpBwABqIAEQ9AkCQCAKQYQBaigCACIDRQ0AIApBgAFqKAIAIgAgA0HYAGxqIQcgAUEsaiEJA0ACQAJAAkAgACgCACIDQXxqDgICAAELIAEtACghBCABQQA6ACggAS0AeSEGIAFBADoAeQJAIAAoAgQiAygCAEEaRw0AIANBGGooAgAhCAJAIAMpAwgiDkIDg0IAUg0AIA6nIgUgBSgCACIFQQFqNgIAIAVBf0wNDgsgCSAOIAgQrgsLIAMgARBvIAEgBDoAKCABIAY6AHkMAQsCQAJAAkAgAw4EAwABAgMLIAAoAgRBAUcNAiABLQAoIQQgAUEAOgAoIAEtAHkhBiABQQA6AHkCQCAAKAIIIgMoAgBBGkcNACADQRhqKAIAIQgCQCADKQMIIg5CA4NCAFINACAOpyIFIAUoAgAiBUEBajYCACAFQX9MDQ8LIAkgDiAIEK4LCyADIAEQbyABIAQ6ACggASAGOgB5DAILIAAoAgQiC0HAAGogARD0CQJAIAtBhAFqKAIAIgNFDQAgA0HYAGwhBCALQYABaigCACEDA0ACQAJAAkAgAygCAEF8ag4CAgABCyABLQAoIQggAUEAOgAoIAEtAHkhBSABQQA6AHkCQCADQQRqKAIAIgYoAgBBGkcNACAGQRhqKAIAIQwCQCAGKQMIIg5CA4NCAFINACAOpyINIA0oAgAiDUEBajYCACANQX9MDRILIAkgDiAMEK4LCyAGIAEQbyABIAg6ACggASAFOgB5DAELIAMgARD+BgsgA0HYAGohAyAEQah/aiIEDQALCwJAIAtBmAFqKAIAIgNFDQAgA0EobCEEIAtBlAFqKAIAIQMDQCADIAEQhQQgA0EoaiEDIARBWGoiBA0ACwsgCy0APEEGRg0BIAtBEGogARD0CQwBCyAAKAIMIgNFDQAgA0EobCEEIAAoAgghAwNAIAEgAxCVAyADQShqIQMgBEFYaiIEDQALCyAAQdgAaiIAIAdHDQALCwJAIApBmAFqKAIAIgNFDQAgA0EobCEAIApBlAFqKAIAIQMDQCABIAMQlQMgA0EoaiEDIABBWGoiAA0ACwsgCi0APEEGRg0JIApBEGogARD0CQwJCyAAKAIMIgNFDQggA0EobCEEIAAoAgghAwNAIAMgARCFBCADQShqIQMgBEFYaiIEDQAMCQsLIAEtACghBCABQQA6ACggAS0AeSEGIAFBADoAeQJAIAAoAgQiAygCAEEaRw0AIANBGGooAgAhAAJAIAMpAwgiDkIDg0IAUg0AIA6nIgcgBygCACIHQQFqNgIAIAdBf0wNCAsgAUEsaiAOIAAQrgsLIAMgARBvIAEgBDoAKCABIAY6AHkMBwsgAS0AKCEEIAFBADoAKCABLQB5IQYgAUEAOgB5AkAgACgCBCIDKAIAQRpHDQAgA0EYaigCACEAAkAgAykDCCIOQgODQgBSDQAgDqciByAHKAIAIgdBAWo2AgAgB0F/TA0HCyABQSxqIA4gABCuCwsgAyABEG8gASAEOgAoIAEgBjoAeQwGCyABLQAoIQQgAUEAOgAoIAEtAHkhBiABQQA6AHkCQCAAKAIEIgMoAgBBGkcNACADQRhqKAIAIQACQCADKQMIIg5CA4NCAFINACAOpyIHIAcoAgAiB0EBajYCACAHQX9MDQYLIAFBLGogDiAAEK4LCyADIAEQbyABIAQ6ACggASAGOgB5DAULIAEtACghBCABQQA6ACggAS0AeSEGIAFBADoAeQJAIAAoAgQiAygCAEEaRw0AIANBGGooAgAhAAJAIAMpAwgiDkIDg0IAUg0AIA6nIgcgBygCACIHQQFqNgIAIAdBf0wNBQsgAUEsaiAOIAAQrgsLIAMgARBvIAEgBDoAKCABIAY6AHkMBAsgAS0AKCEEIAFBADoAKCABLQB5IQYgAUEAOgB5AkAgACgCBCIDKAIAQRpHDQAgA0EYaigCACEAAkAgAykDCCIOQgODQgBSDQAgDqciByAHKAIAIgdBAWo2AgAgB0F/TA0ECyABQSxqIA4gABCuCwsgAyABEG8gASAEOgAoIAEgBjoAeQwDCyABLQAoIQQgAUEAOgAoIAEtAHkhBiABQQA6AHkCQCAAKAIEIgMoAgBBGkcNACADQRhqKAIAIQACQCADKQMIIg5CA4NCAFINACAOpyIHIAcoAgAiB0EBajYCACAHQX9MDQMLIAFBLGogDiAAEK4LCyADIAEQbyABIAQ6ACggASAGOgB5DAILAkAgACgCBCIDKAIAQQNHDQAgA0EEaiABELQKDAILIAMgARCqCwwBCwALIAJB4ABqJAALpi8CHH8EfiMAQZABayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgAOFAYAAQIDBAUICQoLDA0ODxAREhMUBgsgACABQeAA/AoAAAw5CwJAAkAgASgCBEGAgICAeEYNACABKAIYIQMgASgCFCEEIAJBCGogASgCCCABKAIMEJ0DAkACQCABKAIcIgUNAEEAIQYMAQsQiyEhBiAFKQIMIR4gAkEwaiAFENcMIAYgHjcCDCAGIAIoAjg2AgggBiACKQIwNwIAC0EMEIoBIgVFDRUgASgCECIHKAIIIQggBygCBCEJQeAAEIoBIgpFDRYgCiAHKAIAEHAgBSAINgIIIAUgCTYCBCAFIAo2AgAgAS0AICEHIAIoAgghASACKQIMIR4MAQsgASgCHCEGIAEoAhghAyACQQhqIAEoAgwgASgCEBCdAwJAAkAgASgCICIEDQBBACEHDAELEIshIQcgBCkCDCEeIAJBMGogBBDXDCAHIB43AgwgByACKAI4NgIIIAcgAikCMDcCAAtBDBCKASIERQ0WIAEoAhQiASgCCCEKIAEoAgQhCEHgABCKASIFRQ0XIAUgASgCABBwIAQgCjYCCCAEIAg2AgQgBCAFNgIAIAIpAwghHiACKAIQIQVBgICAgHghAQsgACAHNgIgIAAgBjYCHCAAIAM2AhggACAENgIUIAAgBTYCECAAIB43AwggACABNgIEIABBAjYCAAw4CyABKAIMIQkgASgCCCELAkACQCABLQAkIgxBAkYNACABKAIgIQ0gASgCHCEOIAEoAhghDyAB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NgIUIA8gDjYCECAPIA02AgwgDyAONgIIIA8gBTYCBCAPQQI2AgAMAQsgA0HAAGogARCoBSADKAJEIQ8gAygCQCIRQQdGDQIgAyAMKQMYNwOQASADIAwpAxA3A4gBIAMgDCkDCDcDgAEgAyAMKQMANwN4AkAgAiADKALYAUcNACADQdgBahC+GgsgAygC3AEiCCACQShsaiIFIA82AgQgBSARNgIAIAUgAykDeDcDCCAFIAMpA4ABNwMQIAUgAykDiAE3AxggBSADKQOQATcDIAsgAyACQQFqIgI2AuABAkACQCABLQC4ASIFQXtqDgMCAQABCwJAAkAgASgCiAEiBUELRw0AIANBwABqIAEQxAEMAQsgAUELNgKIASADIAopAgA3A0AgAyAKKAIINgJIAkAgASgCCEEKRg0AIAkQwAsLIAkgBTYCACAHIAspAgA3AgAgByALKAIINgIICyABIAEoArQBIgU2AqwBIAEgASgCsAEiDzYCqAEgBCADKQNANwIAIAQgAygCSDYCCCAQDQEgAS0AuAFB/wFxQQVHDQEgA0G6gICAeDYCQCABIA8gBSADQcAAahDuHQwBCwsgASgCtAEhBCABKAKwASEIIANBoAJqIAUQyCUgA0GPAq1CIIZBrOSaAa2ENwO4ASADQcAAakHNlYABIANBuAFqELIQIAMgAykCoAI3AkwgAyADKAKoAjYCVCAIIAQgA0HAAGoQxhshDyABLQC4AUGiAUcNACABIAEQhg4QkQkLIABBBzYCACAAIA82AgQgAygC3AEiASACEOsdIAMoAtgBIAEQ9SMMDAtBACEFIAEtALgBQQpHDQoLAkACQCABKAKIASICQQtHDQAgA0HAAGogARDEAQwBCyABQQs2AogBIAMgCikCADcDQCADIAooAgg2AkgCQCABKAIIQQpGDQAgCRDACwsgCSACNgIAIAcgCykCADcCACAHIAsoAgg2AggLIAEgASgCtAEiAjYCrAEgASABKAKwATYCqAEgBCADKQNANwIAIAQgAygCSDYCCEEBIQUMCQsgASABKAJ4IgxB//97cTYCeCABQbABaiEPIAEoArABIQsCQAJAIAEoAogBIgJBC0cNACADQcAAaiABEMQBDAELIAFBCzYCiAEgAyABKQKYATcDQCADIAEoAqABNgJIIAFBjAFqIQUCQCABKAIIQQpGDQAgAUEIahDACwsgASACNgIIIAEgBSkCADcCDCABIAUoAgg2AhQLIAEpA7ABIRYgDyADKQNANwIAIA8gAygCSDYCCCABIBY3A6gBIANBwABqQQhBCEE4EIUPIAMoAkQhBQJAIAMoAkBBAUYNAEEAIQIgA0EANgI8IAMgAygCSCIJNgI4IAMgBTYCNCABLQC4ASIEQQNGDQggAUEMaiENIAFBCGohESABQZgBaiEGIAFBjAFqIRAgA0H4AWpBCGohCCADQfgBakEEaiESIANB0ABqIRMgA0HYAWpBCGohDiADQcAAakEIaiEFIANBwABqQQRyIRQDQCAPKAIAIQcCQAJAAkACQAJAAkACQAJAAkACQCAEQf8BcUEcRw0AAkACQCABKAKIASICQQtHDQAgA0H4AWogARDEAQwBCyABQQs2AogBIAMgBikCADcD+AEgAyAGKAIINgKAAgJAIAEoAghBCkYNACAREMALCyARIAI2AgAgDSAQKQIANwIAIA0gECgCCDYCCAsgASABKAK0ASIKNgKsASABIAEoArABNgKoASAPIAMpA/gBNwIAIA8gAygCgAI2AgggA0H4AWogAUEAEHMgAygC/AEhBCADKAL4ASIVQQdHDQEMEQsgA0H4AWogARCLAiADKAL8ASEEIAMoAvgBIgJBBUYNECAOIAgpAxA3AxAgDiAIKQMINwMIIA4gCCkDADcDACADIAQ2AtwBIAMgAjYC2AECQAJAIAEtALgBIgRBCUcNAAJAAkAgASgCiAEiBEELRw0AIANB+AFqIAEQxAEMAQsgAUELNgKIASADIAYpAgA3A/gBIAMgBigCCDYCgAICQCABKAIIQQpGDQAgERDACwsgESAENgIAIA0gECkCADcCACANIBAoAgg2AggLIAEpA7ABIRYgDyADKQP4ATcCACAPIAMoAoACNgIIIAEgFjcDqAEgA0H4AWogARCoBSADKAL8ASEEIAMoAvgBIgdBB0cNASADIAQ2AkQgA0EDNgJAIAINBiADKQPgASIWQgODQgBSDQcgFqciAiACKAIAIgRBf2o2AgAgBEEBRw0HIAIgAigCEBDwHgwHCyACRQ0EIANB+AFqQQRyIAQQyCUgA0ENNgKMAiADQeSJmwE2AogCIANBsICAgHg2AvgBIAEoArABIAEoArQBIANB+AFqEMYbIQICQCABLQC4AUGiAUcNACABIAEQhg4QkQkLIANBAzYCQCADIAI2AkQMBQsgAyAIKQMYNwO4AiADIAgpAxA3A7ACIAMgCCkDCDcDqAIgAyAIKQMANwOgAkEoEIoBIgJFDQEgAiAENgIEIAIgBzYCACACIAMpA6ACNwMIIAIgAykDqAI3AxAgAiADKQOwAjcDGCACIAMpA7gCNwMgIBIgAykD8AE3AhggEiADKQPoATcCECASIAMpA+ABNwIIIBIgAykD2AE3AgAgFCADKQL4ATcCACAUIAMpAoACNwIIIBQgAykCiAI3AhAgFCADKQKQAjcCGCAUIAMoApgCNgIgQQAhCiADQQA2AkAgAyACNgJoDAcLIAMgCCkDGDcD0AEgAyAIKQMQNwPIASADIAgpAwg3A8ABIAMgCCkDADcDuAFBKBCKASICRQ0BIAIgBDYCBCACIBU2AgAgAiADKQO4ATcDCCACIAMpA8ABNwMQIAIgAykDyAE3AxggAiADKQPQATcDICADQQA2AlggAyAKNgJUIAMgBzYCUCADIAc2AkggAyACNgJEIANBAjYCQCADIAEoAqwBNgJMDAQLQQhBKBCiJAALQQhBKBCiJAALIAMpA+gBIRcgAykD4AEhFgJAIARBF0YNAEEAIQQMAwsCQAJAIAEoAogBIgJBC0cNACADQfgBaiABEMQBDAELIAFBCzYCiAEgAyAGKQIANwP4ASADIAYoAgg2AoACAkAgASgCCEEKRg0AIBEQwAsLIBEgAjYCACANIBApAgA3AgAgDSAQKAIINgIICyABKQOwASEYIA8gAykD+AE3AgAgDyADKAKAAjYCCCABIBg3A6gBIAEgASgCeCICQcAAcjYCeAJAAkAgAS0AuAFBPkcNACABLQCBAUEgcUUNACABEPwEIgRFDQBBACEKDAELIANBCGogARCBASADKAIMIQQgAygCCCEKCyABIAI2AnggCkEBRw0CIANBAzYCQCADIAQ2AkQgFkIDg0IAUg0NIBanIgIgAigCACIEQX9qNgIAAkAgBEEBRw0AIAIgAigCEBDwHgsgAygC2AFFDQELIANB2AFqEM4OCyADKAJEIQQgAygCQCIKQQNHDQIgAygCOCEJDAsLIAEoAqwBIQIgAyAXNwOAAiADIBY3A/gBIBMgA0H4AWoQgh8gAyAENgJwIAMgAjYCTCADIAc2AkhBASEKIANBATYCQAsgAygCRCEECyADIAUpAyg3A6ABIAMgBSkDIDcDmAEgAyAFKQMYNwOQASADIAUpAxA3A4gBIAMgBSkDCDcDgAEgAyAFKQMANwN4AkAgAygCPCIHIAMoAjRHDQAgA0E0ahDAGgsgAygCOCIJIAdBOGxqIgIgAykDoAE3AzAgAiADKQOYATcDKCACIAMpA5ABNwMgIAIgAykDiAE3AxggAiADKQOAATcDECACIAMpA3g3AwggAiAENgIEIAIgCjYCACADIAdBAWo2AjxBACECAkACQCABLQC4ASIEQX1qDgULAQEBAAELAkACQCABKAKIASICQQtHDQAgA0HAAGogARDEAQwBCyABQQs2AogBIAMgBikCADcDQCADIAYoAgg2AkgCQCABKAIIQQpGDQAgERDACwsgESACNgIAIA0gECkCADcCACANIBAoAgg2AggLIAEgASgCtAEiCjYCrAEgASABKAKwASIHNgKoASAPIAMpA0A3AgAgDyADKAJINgIIQQEhAiABLQC4ASIEQQNHDQEMCgsLIAEoArQBIQIgASgCsAEhBSADQawBaiAEEMglIANBjwKtQiCGQazkmgGthDcD+AEgA0HAAGpBzZWAASADQfgBahCyECADIAMpAqwBNwJMIAMgAygCtAE2AlQgBSACIANBwABqEMYbIQQgAS0AuAFBogFHDQcgARDLFCECIAEQtRAgASACEJEJDAcLIAUgAygCSBD+IAALQQhBKBCiJAALIANBEGogASACEJYGAkAgAy0AJEECRg0AIAMgAykDEDcCRCAAIAMpAkA3AgQgAyADKQMYNwJMIAAgAykCSDcCDCADIAMpAyA3AlQgACADKQJQNwIUIAMgAykDKDcCXCAAIAMpAlg3AhwgACADKAJgNgIkIABBADYCAAwICyAAIAMoAhA2AgQgAEEHNgIADAcLIARBogFGDQELIANBwABqQQRyIAQQyCUgA0EcNgJUIANB3I2bATYCUCADQbCAgIB4NgJAIAEoArABIAEoArQBIANBwABqEMYbIQICQCABLQC4AUGiAUcNACABIAEQhg4QkQkLIABBBzYCACAAIAI2AgQMBQsgASkDCCEWIAFBCjYCCCADIAEpAxA3A0ggAyAWNwNAAkACQCAWpyICQQpGDQAgAkEJRg0BIANBwABqEMALC0Go85oBQShB+IebARC5IQALIAMoAkQhAgJAAkAgASgCiAEiBUELRw0AIANBwABqIAEQxAEMAQsgAUELNgKIASABIAU2AgggASABKQKMATcCDCABIAEoApQBNgIUIAMgASkCmAE3A0AgAyABKAKgATYCSAsgASADKAJINgK4ASABIAEpA7ABNwOoASABIAMpA0A3ArABIABBBzYCACAAIAI2AgQMBAsgAyAENgJECyAAQQc2AgAgACAENgIEIANBNGoQnREgAygCNCAJEPgjIAEgDDYCeAwCCwJAAkAgASgCiAEiBUELRw0AIANBwABqIAEQxAEMAQsgAUELNgKIASADIAEpApgBNwNAIAMgASgCoAE2AkggAUGMAWohBAJAIAEoAghBCkYNACABQQhqEMALCyABIAU2AgggASAEKQIANwIMIAEgBCgCCDYCFAsgASABKAK0ASIJNgKsASABIAEoArABNgKoASAPIAMpA0A3AgAgDyADKAJINgIIIAMgAykCNDcDQCADIAMoAjwiBTYCSCADIAo2AmAgAyAHNgJcIAMgAjYCWCADIAk2AlQgAyALNgJQIAMgATYCTAJAAkACQAJAAkAgBUUNACAFQThsIQQgAygCRCEOIAVBf2ohBQJAIAINACAOIQIDQCACKAIAIQgCQAJAIAVFDQAgCEECRw0BIAJBDGooAgAhCCACQQhqKAIAIQcgA0G7gICAeDYC+AEgASAHIAggA0H4AWoQ7h0MAQsgCEECRw0AIAJBBGooAgAoAgANBAsgAkE4aiECIAVBf2ohBSAEQUhqIgQNAAwCCwsgDiECA0AgAigCACEIAkACQCAFRQ0AIAhBAkcNASACQQxqKAIAIQggAkEIaigCACENIANBu4CAgHg2AvgBIAEgDSAIIANB+AFqEO4dDAELIAhBAkcNACACQQRqKAIAKAIADQMgA0G6gICAeDYC+AEgASAHIAogA0H4AWoQ7h0LIAJBOGohAiAFQX9qIQUgBEFIaiIEDQALCyABLQCBAUEEcQ0BQQAhAiABLQB5QcAAcUUNAyABLQC4AUH/AXFBCkYNAgwDCyACKAIMIQUgAigCCCECIANB7oCAgHg2AvgBIAIgBSADQfgBahDGGyECAkAgAS0AuAFBogFHDQAgARDLFCEFIAEQtRAgASAFEJEJCyAAQQc2AgAgACACNgIEIANBwABqEJ0RIAMoAkAgDhD4IyABIAw2AngMBAtBACECIAEtALgBQQpHDQELAkACQCABKAKIASICQQtHDQAgA0H4AWogARDEAQwBCyABQQs2AogBIAMgASkCmAE3A/gBIAMgASgCoAE2AoACIAFBjAFqIQUCQCABKAIIQQpGDQAgAUEIahDACwsgASACNgIIIAEgBSkCADcCDCABIAUoAgg2AhQLIAEpA7ABIRYgDyADKQP4ATcCACAPIAMoAoACNgIIIAEgFjcDqAFBASECCyAAIAMoAjw2AgwgACADKQI0NwIEIAAgAjoAHCAAQQA2AhggACAJNgIUIAAgCzYCECAAQQM2AgAgASAMNgJ4DAELIAAgAygC4AE2AgwgACADKQLYATcCBCAAIAU6ABwgAEEANgIYIAAgAjYCFCAAIAY2AhAgAEEBNgIACyADQcACaiQAC78rAhx/AX4jAEHwAWsiAiQAIAJBMGogACAAKAIAKAIEEQcAIAIgAigCNCIDNgI8IAIgAigCMCIENgI4AkACQAJAAkACQAJAIAEtAApBgAFxDQAgAkHUADYCpAEgAiACQThqNgKgAUEBIQUgASgCACABKAIEQc2VgAEgAkGgAWoQzSMNAiACQShqIAQgAygCGBEHACACKAIoIgNFDQEgAigCLCEEIAEoAgBBgOWBAUEMIAEoAgQoAgwRDAANAiACQSBqIAMgBCgCGBEHACACKAIgIQUgAkEANgKwASACIAQ2AqgBIAIgAzYCpAEgAkEANgKgASAFQQBHIQYDQCACQRhqIAJBoAFqEMMRAkAgAigCGCIFDQAgAigCoAEgAigCqAEQvyEMAwsgAigCHCEDIAIgAigCsAEiBEEBajYCsAEgAiADNgJcIAIgBTYCWAJAIAEoAgBBovKaAUEBIAEoAgQoAgwRDAANACACQQA6AIQBIAIgBDYCfCACIAY2AnggAiABNgKAASACQdQANgJsIAIgAkHYAGo2AmggAkH4AGpBzZWAASACQegAahDOI0UNAQsLIAIoAqABIAIoAqgBEL8hQQEhBQwCCyAEIAEgAygCDBEIACEFDAELAkACQAJAAkACQAJAAkACQAJAIAAoAgQiA0EDRg0AIABBBGohAAwBCyACQRBqIAAgACgCACgCBBEHACACKAIUQShqKAIAIQAgAigCECEFIAJBADYCsAEgAkEAKQLs5IEBNwOoASACQQApAuTkgQE3A6ABIAUgAkGgAWpB9OSBASAAEQsAIAIoArABIgBFDQEgACgCACEDC0EAIQUgA0ECRw0HIAJBADYCVCACQoCAgIAQNwJMIAJBxOaBATYCXCACQqCAgIAGNwJgIAIgAkHMAGo2AlgCQCAAKAIADgMCAwACCwJAAkACQAJAIAAtABQiBQ4EAAABAwALIABBAjoAFAJAIAVBAUYNAEEALQDalJ0BIQVBAEEBOgDalJ0BIAIgBToAoAEgBUUNAiACQaABakGftoEBQZTGmAFBtMaYARCyHAALEM8jAAtBtK6YAUHxAEGkrpgBEOsbAAsgAEEDOgAUQQBBADoA2pSdAQsCQCAAKAIMIgMgACgCECIFSQ0AIAAoAgghACACQQApA5DCmAEiHjcCbCACQYCAgIB4NgJoIAJBADoAdCACQQA6AIgBIAJBADYChAEgAkGku5gBNgKAASACIAJB2ABqNgJ4IAIgAkHoAGo2AnwCQCADIAVHDQAgHkIgiKchACAepyEFDAYLIAAgBUEMbGoiByADIAVrQQxsaiEIIAJBoAFqQQhqIQkgAkGgAWpBB2ohCgNAAkACQCAHKAIIIgUNACACQQA2ApgBIAIgAkH4AGo2ApQBIAJBAzYCoAEgAkECNgLgASACQZQBaiACQaABaiACQeABakEAIAJBACACEM8EIQAgAigClAEiBSAFKAIMQQFqNgIMIABFDQEMDQsgBygCBCIAIAVBLGxqIQsDQCACQQA2ApABIAIgAkH4AGo2AowBAkACQAJAAkACQAJAAkAgACgCIEGAgICAeEYNACACQaABaiAAKAIkIgwgACgCKCINENcFIAIoAqABQQFGDQQgAkGgAWogAigCpAEiDiACKAKoASIPQfPKlwFBBhCYAwJAAkAgAigCoAFFDQAgAigC3AEhBSACKALYASEDIAIoAtQBIQQgAigC0AEhBiACKALEAUF/Rw0BIAJBlAFqIAkgBiAEIAMgBUEBELkHDAULAkADQCACQeABaiACQaABahDdAyACKALgAQ4DBAABBAsLQQAhBQwDCyACQZQBaiAJIAYgBCADIAVBABC5BwwDCyACQQM2AqABDAULIAIgAikC5AE3ApgBQQEhBQsgAiAFNgKUAQsCQCACKAKUAUEBRw0AAkAgAigCmAEiEEEGaiIFRQ0AAkACQCAFIA9JDQAgBSAPRw0BDAILIA4gBWosAABBv39KDQELIA4gDyAFIA9B/MqXARDQIgALIA4gD2ohBCAOIAVqIQUCQANAIAUgBEYNAQJAAkAgBSwAACIDQX9MDQAgBUEBaiEFIANB/wFxIQMMAQsgBS0AAUE/cSEGIANBH3EhEQJAIANBX0sNACARQQZ0IAZyIQMgBUECaiEFDAELIAZBBnQgBS0AAkE/cXIhBgJAIANBcE8NACAGIBFBDHRyIQMgBUEDaiEFDAELIAZBBnQgBS0AA0E/cXIgEUESdEGAgPAAcXIiA0GAgMQARg0CIAVBBGohBQsgA0G5f2pBeEsNACADQUZqQXZPDQAMAgsLIBBFDQECQAJAIBAgD0kNACAQIA9GDQIMAQsgDiAQaiwAAEG/f0wNACAQIQ8MAQsgDiAPQQAgEEGMy5cBENAiAAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgD0EDSQ0AQezNlwEgDkEDELoYRQ0BIA4vAABB2pwBRg0CQQMhECAPQQNGDQkgDigAAEHfvunyBEYNAyAPIRAMCQtBAiEEIA9BAkcNDyAOLwAAQdqcAUcNB0F+IQVBAiEQQQIhAwwGC0EDIQNBfSEFAkAgD0EDRw0AQQMhEAwGCyAOLAADQb9/Sg0CIA4gD0EDIA9BkM6XARDQIgALIA4sAAJBv39MDQNBAiEDQX4hBQwBC0F8IQVBBCEDAkAgD0EFTw0AQQQhEAwECyAOLAAEQb9/TA0BCyAPIRAMAgsgDiAPQQQgD0HwzZcBENAiAAsgDiAPQQIgD0GAzpcBENAiAAsgDiADaiIPIAUgEGoiBmohEiAGIQUgDyEDAkACQANAIAVFDQEgBUF/aiEFIAMsAAAhBCADQQFqIQMgBEEATg0ADAILCyAGRQ0AAkACQCAPLAAAIgVBf0wNACAPQQFqIRMgBUH/AXEhBQwBCyAPLQABQT9xIQMgBUEfcSEEAkAgBUFfSw0AIARBBnQgA3IhBSAPQQJqIRMMAQsgA0EGdCAPLQACQT9xciEDAkAgBUFwTw0AIAMgBEEMdHIhBSAPQQNqIRMMAQsgA0EGdCAPLQADQT9xciAEQRJ0QYCA8ABxciEFIA9BBGohEwtBACERAkAgBUHFAEYNAEEAIREDQCAFQVBqIgRBCUsNAkEAIQMDQCADrUIKfiIeQiCIpw0DIB6nIgUgBGoiAyAFSQ0DIBMgEkYNAwJAAkAgEywAACIFQX9MDQAgE0EBaiETIAVB/wFxIQUMAQsgEy0AAUE/cSEEIAVBH3EhFAJAIAVBX0sNACAUQQZ0IARyIQUgE0ECaiETDAELIARBBnQgEy0AAkE/cXIhBAJAIAVBcE8NACAEIBRBDHRyIQUgE0EDaiETDAELIARBBnQgEy0AA0E/cXIgFEESdEGAgPAAcXIhBSATQQRqIRMLIAVBUGoiBEEKSQ0ACwNAAkAgAw0AIBFBAWohESAFQcUARw0CDAMLIBMgEkYNAwJAAkAgEywAACIFQX9MDQAgE0EBaiETIAVB/wFxIQUMAQsgEy0AAUE/cSEEIAVBH3EhFAJAIAVBX0sNACAUQQZ0IARyIQUgE0ECaiETDAELIARBBnQgEy0AAkE/cXIhBAJAIAVBcE8NACAEIBRBDHRyIQUgE0EDaiETDAELIARBBnQgEy0AA0E/cXIgFEESdEGAgPAAcXIhBSATQQRqIRMLIANBf2ohAwwACwsLIBIgE2shFQwHCyAQQQNPDQELQQIhECAOLQAAQdIARw0GDAELAkAgDi8AAEHfpAFHDQAgDiwAAiIFQb9/TA0CIA5BAmohBkF+IQMMBAsgDi0AAEHSAEcNAgsCQCAOLAABIgVBv39MDQAgDkEBaiEGQX8hAwwDCyAOIBBBASAQQZzNlwEQ0CIACyAOIBBBAiAQQazNlwEQ0CIAC0ECIQQgEEEDRg0DQYnNlwEgDkEDELoYDQMCQCAOLAADIgVBv39MDQAgDkEDaiEGQX0hAwwBCyAOIBBBAyAQQYzNlwEQ0CIAC0ECIQQgBUG/f2pB/wFxQRlLDQIgAyAQaiERQQAhBQJAA0AgESAFRg0BIAYgBWohAyAFQQFqIQUgAywAAEEATg0ADAQLCyAJQgA3AgAgCUIANwIIIAIgETYCpAEgAiAGNgKgAQJAAkACQCACQaABakEAEKECDQAgAigCoAEiA0UNBSACKAKoASIFIAIvAKUBIAotAABBEHRyQQh0IAItAKQBciIPTw0CIAMgBWotAABBv39qQf8BcUEaTw0CIAIoAqwBIRIgAkIANwKwASACIBI2AqwBIAIgBTYCqAEgAiAPNgKkASACIAM2AqABIAJBoAFqQQAQoQINASACKAKgASIDRQ0FIAIoAqgBIQUgAigCpAEhDwwCC0GUyZcBQT0gAkHvAWpBhMmXAUHMzZcBEN0UAAtBlMmXAUE9IAJB7wFqQYTJlwFBzM2XARDdFAALAkACQCAFRQ0AAkAgDyAFSw0AIA8gBUYNAQwCCyADIAVqLAAAQb9/TA0BCyAPIAVrIRUgAyAFaiETQQAhDwwBCyADIA8gBSAPQbzNlwEQ0CIAC0EBIQQCQCAVDQBBACEWIA8hFyAGIRggESEZIA4hGiAQIRsgEyEcDAILIBMtAABBLkcNACATIBVqIRJBLiEDIBMhBQJAA0ACQAJAAkAgA8BBf0oNACAFLQABQT9xIRQgA0EfcSEdIANB/wFxIgNB3wFLDQEgHUEGdCAUciEDIAVBAmohBQwCCyAFQQFqIQUgA0H/AXEhAwwBCyAUQQZ0IAUtAAJBP3FyIRQCQCADQfABTw0AIBQgHUEMdHIhAyAFQQNqIQUMAQsgFEEGdCAFLQADQT9xciAdQRJ0QYCA8ABxciIDQYCAxABGDQIgBUEEaiEFCwJAIANB3///AHFBv39qQRpJDQAgA0FQakEKSQ0AIANBX2pBD0kNACADQUZqQQdJDQAgA0Glf2pBBkkNACADQYV/akEDSw0DCyAFIBJGDQEgBS0AACEDDAALCyAPIRcgBiEYIBEhGSAOIRogECEbIBMhHCAVIRYMAQtBAiEECyACIBY2ArwBIAIgHDYCuAEgAiAbNgK0ASACIBo2ArABIAIgGTYCrAEgAiAYNgKoASACIBc2AqQBIAIgDTYCxAEgAiAMNgLAASACIAQ2AqABC0EBIQUCQAJAAkACQCAAKAIQDgMBAgACCyACQQI2AuABDAILQQAhBQsgAiAFNgLgASACIAApAhg3AuQBCyACQYwBaiACQaABaiACQeABaiAAKAIAIAAoAgQgACgCCCAAKAIMEM8EIQUgAigCjAEiAyADKAIMQQFqNgIMIAUNDSAAQSxqIgAgC0cNAAsLIAdBDGoiByAIRg0FDAALCyAFIAMgA0GUu5gBEJAKAAtB0OWBAUEYQejlgQEQ7BsACyACQcwAakHsupgBQRUQ0CMNCAwECyACQcwAakGBu5gBQRIQ0CNFDQMMBwsgAigCaCIAQYCAgIB4Rw0BIAIoAnAhACACLQBsIQULIAVB/wFxQQNHDQEgACgCACEDAkAgAEEEaigCACIFKAIAIgRFDQAgAyAEEQMACwJAIAUoAgQiBEUNACADIAQgBSgCCBDcFAsgAEEMQQQQ3BQMAQsgAEUNACACKAJsIABBARDcFAsgAiACKAJUNgJIIAIgAikCTDcDQAJAAkAgASgCAEGM5YEBQQIgASgCBCgCDBEMAA0AAkACQCACKAJEIgUgAigCSCIAQY7lgQFBEBDbHw0AIAEoAgBBnuWBAUERIAEoAgQoAgwRDAANAgwBCyAAEL0hAkACQAJAIABBAUsNACAAQQFGDQIMAQsgBSwAAUG/f0oNAQtBuOSBAUHXAEGw5YEBEOsbAAsgABC9ISACQQE2AqwBIAJBADYCSCACQY6phQE2ArgBIAJBjamFATYCtAEgAkKBgICAEDcCoAEgAiAAQX9qIgU2ArABIAIgAkHAAGo2AqgBIAJBtAFqIQACQAJAIAUNACACQcAAaiAAEJAUDAELIAJBwABqQQEgABCKEkUNAAJAAkAgAigCuAEiBSACKAK0ASIDRw0AIAUhBAwBCyACQaABaiAFIANrENEVIAIoAqgBIAIoAqwBIAAQihJFDQEgAigCtAEhBSACKAK4ASEEC0EAIQYCQAJAIAQgBWsiA0EASA0AAkAgBCAFRw0AQQEhBUEAIQMMAgsgAkEIaiADEL4hIAIoAggiBQ0BQQEhBgsgBiADEP4gAAsgAkEANgKAASACIAU2AnwgAiADNgJ4IAJB+ABqIAAQkBQgAigCfCERIAIoAnghDgJAIAIoAoABIgVFDQAgAkGgAWogBRDRFSACKAKoASIDKAIIIgAgAigCrAEiBCAAIARLGyEGIBEhBANAIAYgAEYNASAFRQ0BIAMoAgQgAGogBC0AADoAACADIAMoAghBAWo2AgggBUF/aiEFIABBAWohACAEQQFqIQQMAAsLIA4gERDMIwsgAigCsAEiAEUNAAJAIAIoAqwBIgQgAigCqAEiBSgCCCIDRg0AIABFDQAgBSgCBCIGIANqIAYgBGogAPwKAAALIAUgACADajYCCAsgAigCRCIGIAIoAkgiD2ohBQJAAkADQAJAIAYgBSIDRw0AQQAhAAwCCwJAIANBf2oiBSwAACIAQX9KDQACQAJAIANBfmoiBS0AACIEwCIRQUBIDQAgBEEfcSEEDAELAkACQCADQX1qIgUtAAAiBMAiDkFASA0AIARBD3EhBAwBCyADQXxqIgUtAABBB3FBBnQgDkE/cXIhBAsgBEEGdCARQT9xciEECyAEQQZ0IABBP3FyIQALAkAgAEF3aiIEQRdLDQBBASAEdEGfgIAEcQ0BCwJAIABBhQFJDQACQCAAQQh2IgRFDQACQAJAIARBMEYNACAEQSBGDQEgBEEWRw0DIABBgC1GDQQMAwsgAEGA4ABGDQMMAgsgAEH/AXEtAOyXmwFBAnENAgwBCyAAQf8BcS0A7JebAUEBcQ0BCwsgAyAGayIAIA9LDQEgACAPTw0AIAYgAGosAABBv39MDQULIAIgADYCSAsgAkECNgKkASACIAJBwABqNgKgASABKAIAIAEoAgRBzZWAASACQaABahDNI0UNAQsgAigCQCACKAJEEMwjQQEhBQwBCyACKAJAIAIoAkQQzCNBACEFCyACQfABaiQAIAUPC0HQ1ZgBQTBBwOWBARC5IQALAkACQCACKAJoIgBBgICAgHhGDQAgAEUNAkEBIQMgAigCbCEFDAELIAItAGxBA0cNAUEEIQMgAigCcCIFKAIAIQYCQCAFQQRqKAIAIgQoAgAiAEUNACAGIAARAwALQQwhACAEKAIEIhFFDQAgBiARIAQoAggQ3BQLIAUgACADENwUC0G5lZsBQTcgAkHvAWpB3OaBAUHwlZsBEN0UAAvsLgIVfwF+IwBBgANrIgQkAAJAAkACQAJAIAEtAMgBIgVBGksNAEEBIAV0QZGakCBxDQELIAVBu39qQQJPDQELAkACQAJAAkAgAS0AgQFBIHENACAEQbQBaiEGIARBqAFqQQhqIQcgBEGxAWohCANAIAQgAjYC6AICQAJAAkACQAJAAkACQAJAAkACQCAFQf8BcSIFQXxqDgcBDw8PAg8DAAsgBUG7f2pBAkkNACAFRQ0AIAVBGkcNDgsgBQ0DIAMNA0EAIQkMAgsgARDoESAEQagBaiABEKYPIAQpA6gBIhlCAlENCSAEIAgvAAA7AVwgBCAILQACOgBeIAQgBikCADcDUCAEIAYoAgg2AlggBC0AsAEhCiAEQRBqIAIQowQgGadBAXMhBSABKAK8ASELIAQoAhAhDAJAAkAgAhDIICgCAEEwRw0AQQhBKBDqICIJIAo6AAggCSAFNgIAIAkgAjYCICAJIAs2AhwgCSAMNgIYIAkgBC8BXDsACSAJIAQtAF46AAsgCSAEKQNQNwIMIAkgBCgCWDYCFEEwIQ1BACEKDAELIAQgBC0AXjoAmgEgBCAELwFcOwGYASAEIAQpA1A3A6ACIAQgBCgCWDYCqAJBFCENIAwhDiAFIQwLQQhBwAAQ6iAiBSAKOgAQIAUgCzYCDCAFIAw2AgggBSAJNgIEIAUgDTYCACAFIAI2AiggBSALNgIkIAUgDjYCICAFIAQvAZgBOwARIAUgBC0AmgE6ABMgBSAEKQOgAjcCFCAFIAQoAqgCNgIcIAUhAgwGCyABELwOQf8BcUEIRw0LIAEQ6BEgARDoESABLQDIAQ0CQQEhCQsgBEGoAWogARCPBSAEKAKsASEKIAQoAqgBIg1BgICAgHhHDQIgCiECDAgLAkAgBUG7f2pBAkkNACAFQRpHDQoLIARBqAFqIAEgAhDSHyAEKAKsASEFIAQoAqgBIgkNAiAFIQIMCAsgBEGoAWogARCmDyAEKQOoASIZQgJRDQUgBCAHKQMINwNoIAQgBykDADcDYCAEQQhqIAIQowQgASgCvAEhCSAEKAIIIQtBCEEoEOogIgUgGadBAXM2AgAgBSACNgIgIAUgCTYCHCAFIAs2AhggBSAEKQNgNwMIIAUgBCkDaDcDEEEIQcAAEOogIgJBAToAECACIAk2AgwgAiALNgIIIAIgBTYCBCACQTA2AgAMAgsgBCgCsAEhDiAEIAIQowQgASgCvAEhCyAEKAIAIQwCQAJAIAkNACACEMggKAIAQTBHDQELQQhBwAAQ6iAiBUEANgIIIAVCMTcDACAEQgA3ArgBIAQgBTYCtAEgBEIANwLAASAEQQA2ArABIARCgICAgMAANwKoAUEIQSgQ6iAiBUIANwIcIAUgCzYCGCAFIAw2AhQgBSACNgIQIAUgDjYCDCAFIAo2AgggBSANNgIEIAVBAzYCACAGELoiIARBqAFqEOUiQQhBwAAQ6iAiAiAJOgAQIAIgCzYCDCACIAw2AgggAiAFNgIEIAJBMDYCAAwCCyAEQgA3AsABIARBAzoAvAEgBEEANgK4ASAEQgA3AsgBIARCADcCsAEgBEKAgICAwAA3AqgBIAYQvCIgBEGoAWoQ5SJBCEHAABDqICIFQgA3AiQgBSALNgIgIAUgDDYCHCAFQQU6ABggBSACNgIQIAUgDjYCDCAFIAo2AgggBSANNgIEIAVBFzYCACAFIQIMAQsgBCAHKQIINwPIAiAEIAcpAgA3A8ACQQhBwAAQ6iAiAiAFNgIIIAIgCTYCBCACQR02AgAgAiAEKQPAAjcCDCACIAQpA8gCNwIUCyABLQDIASEFDAALCyAEQcgAaiACEKMEIANBAXMhBiAEQbQBaiEKIARBqAFqQQhqIQ4gBEGxAWohCCAEQcACakEEciEPIARBwAJqQQhqIRAgBCgCSCEMIARBqAFqQQtqIREDQCAEIAI2AnQCQAJAAkACQAJAIAEtAIEBQSBxDQAgBCACNgKgAkEAIQUCQAJAAkACQAJAAkACQAJAIAEtAMgBIglBfGoOBwEMDAwEDAIACyAJQbt/akECSQ0AIAlFDQAgCUEaRw0LCyAJRSAGcUUNA0EAIQsMAQsgARC8DkH/AXFBCEcNCSABEOgRIAEQ6BEgAS0AyAENA0EBIQsLIARBqAFqIAEQjwUgBCgCrAEhCSAEKAKoASIHQYCAgIB4Rw0DIAkhAgwGCyABEOgRIARBqAFqIAEQpg8gBCkDqAEiGUICUQ0EIAQgCC8AADsBpAEgBCAILQACOgCmASAEIAopAgA3A5gBIAQgCigCCDYCoAEgBC0AsAEhDSAEQShqIAIQowQgGadBAXMhCSABKAK8ASELIAQoAighBwJAAkAgAhDIICgCAEEwRw0AQQhBKBDqICIFIA06AAggBSAJNgIAIAUgAjYCICAFIAs2AhwgBSAHNgIYIAUgBC8BpAE7AAkgBSAELQCmAToACyAFIAQpA5gBNwIMIAUgBCgCoAE2AhRBMCESQQAhDQwBCyAEIAQtAKYBOgDCAiAEIAQvAaQBOwHAAiAEIAQpA5gBNwOoASAEIAQoAqABNgKwAUEUIRIgByETIAkhBwtBCEHAABDqICIJIA06ABAgCSALNgIMIAkgBzYCCCAJIAU2AgQgCSASNgIAIAkgAjYCKCAJIAs2AiQgCSATNgIgIAkgBC8BwAI7ABEgCSAELQDCAjoAEyAJIAQpA6gBNwIUIAkgBCgCsAE2AhxBASEFIAkhAgwHCwJAIAlBu39qQQJJDQBBACEFIAlBGkcNBwsgBEGoAWogASACENIfIAQoAqwBIQIgBCgCqAEiBUUNBSAEIA4pAgg3A8gCIAQgDikCADcDwAJBCEHAABDqICIJIAI2AgggCSAFNgIEIAlBHTYCACAJIAQpA8ACNwIMIAkgBCkDyAI3AhRBASEFIAkhAgwGCyAEQagBaiABEKYPIAQpA6gBIhlCAlENAiAEIA4pAwg3A8gCIAQgDikDADcDwAIgBEEgaiACEKMEQQEhBSABKAK8ASELIAQoAiAhB0EIQSgQ6iAiCSAZp0EBczYCACAJIAI2AiAgCSALNgIcIAkgBzYCGCAJIAQpA8ACNwMIIAkgBCkDyAI3AxBBCEHAABDqICICQQE6ABAgAiALNgIMIAIgBzYCCCACIAk2AgQgAkEwNgIADAULIAQoArABIRMgBEEYaiACEKMEIAEoArwBIQ0gBCgCGCESAkACQCALDQAgAhDIICgCAEEwRw0BC0EIQcAAEOogIgVBADYCCCAFQjE3AwAgBEIANwK4ASAEIAU2ArQBIARCADcCwAEgBEEANgKwASAEQoCAgIDAADcCqAFBCEEoEOogIgVCADcCHCAFIA02AhggBSASNgIUIAUgAjYCECAFIBM2AgwgBSAJNgIIIAUgBzYCBCAFQQM2AgAgChC6IiAEQagBahDlIkEIQcAAEOogIgIgCzoAECACIA02AgwgAiASNgIIIAIgBTYCBCACQTA2AgBBASEFDAULIARCADcCwAEgBEEDOgC8ASAEQQA2ArgBIARCADcCyAEgBEIANwKwASAEQoCAgIDAADcCqAEgChC8IiAEQagBahDlIkEIQcAAEOogIgtCADcCJCALIA02AiAgCyASNgIcIAtBBToAGCALIAI2AhAgCyATNgIMIAsgCTYCCCALIAc2AgQgC0EXNgIAQQEhBSALIQIMBAsgAS0AyAEhBQJAAkACQAJAAkACQAJAAkACQCABLQDJAQ0AIAVB/wFxQQtGDQELIAVB/wFxQRJHDQMgASABKAJ4IglBgMAAcjYCeCAEQagBaiABENAFIAEgASgCeEEBcjYCeCADDQEgASgC7AEgAhDaFEUNASAEQcACaiABIAwQ4QIgBCgCxAIhBQJAIAQoAsACIgdBgYCAgHhHDQAgBEEDOgCcAiAEIAU2ApgCDAMLIAQgECkCGDcDuAIgBCAQKQIQNwOwAiAEIBApAgg3A6gCIAQgECkCADcDoAIgB0GAgICAeEYNAUEIQcAAEOogIgsgBTYCCCALIAc2AgQgC0EeNgIAIAsgBCkDoAI3AgwgCyAEKQOoAjcCFCALIAQpA7ACNwIcIAsgBCkDuAI3AiQMBQsgARDoESABKAK8ASEFQQhBwAAQ6iAiCSAFNgIMIAkgDDYCCCAJIAI2AgQgCUErNgIAQQEhBSAJIQIMCgsgBEHAAGogARC+BSAEKAJEIQcCQCAEKAJAQQFxRQ0AIARBAzoAnAIgBCAHNgKYAgwBCyABEOgRIAEtAMgBIQUCQAJAAkACQAJAAkAgAw0AIAVFDQEgBUG7f2pBAkkNAgJAIAVBaWoOBAkEBAMACyAFQfUARg0IIAVBngFHDQMMCAsgBUG7f2pBAkkNAQJAAkAgBUFpag4ECQEBAwALIAVB9QBGDQggBUGeAUYNCAsgDyAFENklIARBATYC1AIgBEHW8ZoBNgLQAiAEQbCAgIB4NgLAAiABKALAASABKALEASAEQcACahDGGyENIAEtAMgBQaIBRw0DIAEgARCgIxCMFAwDCyAEQcACaiABEI8FIAQoAsQCIQ0gBCgCwAIiC0GAgICAeEYNAiAEKALIAiESIAEoArwBIRMgAigCACEUQQhBwAAQ6iAiBUEANgIIIAVCMTcDACAEIAU2AnQCQAJAIBRBMEcNAEEAIRVBCEHAABDqICIFQQA2AgggBUIxNwMAIARCADcC0AIgBCAFNgLMAiAEQgA3AtgCIARBADYCyAIgBEKAgICAwAA3AsACQQhBKBDqICIFIAc2AiAgBUEANgIcIAUgEzYCGCAFIAw2AhQgBSACNgIQIAUgEjYCDCAFIA02AgggBSALNgIEIAVBAzYCACAEQcACahDYIUEwIRYgDCENIBMhEgwBCyAEQgA3AtgCIARBAzoA1AIgBEEANgLQAiAEQgA3AuACIARCADcCyAIgBEKAgICAwAA3AsACIAJBCHYhFCAEQcACahDVIUEXIRYgCyEFIAIhFQtBCEHAABDqICILIBQ7ABEgCyAHNgIoIAtBADYCJCALIBM2AiAgCyAMNgIcIAtCgICAgNAANwIUIAsgFToAECALIBI2AgwgCyANNgIIIAsgBTYCBCALIBY2AgAgC0ETaiAUQRB2OgAADAcLQQhBwAAQ6iAiBUEANgIIIAVCMTcDACAEIAU2AnQgBEHoAmogASACIAcQjQggBCgC6AJFDQJBCEHAABDqICILQR02AgAgCyAEKQLoAjcCBCALIAQpAvACNwIMIAsgBCkC+AI3AhQMBgsgDyAFENklIARBBjYC1AIgBEHe8poBNgLQAiAEQbCAgIB4NgLAAiABKALAASABKALEASAEQcACahDGGyENIAEtAMgBQaIBRw0AIAEgARCgIxCMFAsgBEEDOgCcAiAEIA02ApgCIAcQoiMMAQsgBEEDOgCcAiAEIAQoAuwCNgKYAiAFIQILIAEgBEGoAWoQvRQgBEGYAmoQrCAgAS0AyAEhBSABIAk2AngLQQAhB0EAIQsCQCAFQf8BcUESRw0AIAEQsgYhCyABLQDIASEFC0EAIQkCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAVB/wFxQQpHDQBBACEHQQAhCSABELwOQf8BcUEIRw0AIAEQ6BEgARDoEUEBIQUCQCABLQDIASIJDQBBACEJDAILIAlBEkcNBSAEQThqIAEQvgUgBCgCPCEJAkAgBCgCOEEBcUUNAEECIQUgCw0KDA4LIAEQ6BFBASEHCyABLQDIASINDQEgByEFCyADRQ0BIAUNAUEAIQ0gCQ0BDAoLIAlFDQEgByEFCyAEQagBaiABEI8FIAQoAqwBIQ0gBCgCqAEiEkGAgICAeEcNAkEBIQdBAiEFIA0hAgwDC0EBIQUgBw0AIA1BCEcNByABEOgRQQAhBQsgBEGoAWogARCmDwJAIAQpA6gBIhlCAlINACAEKAKwASECQQEhB0EAIQlBAiEFDAILIAQgCikCADcDeCAEIAooAgg2AoABIBEtAAAhCSAELQCwASEXIAQvALEBIQcgBEEwaiACEKMEIBmnIQ0gCUEQdCEJIAEoArwBIRYgBCgCMCESAkACQCABLQDIAUESRg0AQQAhEwwBCyABELIGIRMLIA1BAXMhGCAHIAlyIQ0CQAJAIAVBf3MgAhDIICgCAEEwR3ENACABKAK8ASEUQQhBKBDqICIHIA07AAkgByAXOgAIIAcgGDYCACAHIAI2AiAgByAWNgIcIAcgEjYCGCAHQQtqIA1BEHY6AAAgByAEKQN4NwIMIAcgBCgCgAE2AhRBMCEVIAwhGAwBCyAEIAQoAoABNgKQASAEIAQpA3g3A4gBQRQhFSAXIQULAkACQCATDQAgByEJIBghEwwBC0EIQcAAEOogIgkgDTsAESAJIAU6ABAgCSAUNgIMIAkgGDYCCCAJIAc2AgQgCSAVNgIAIAkgAjYCKCAJIBY2AiQgCSASNgIgIAlBE2ogDUEQdjoAACAJIAQpA4gBNwIUIAkgBCgCkAE2AhwgASgCvAEiBUEIdiENQS0hFSAMIRQLQQhBwAAQ6iAiByANOwARIAcgBToAECAHIBQ2AgwgByATNgIIIAcgCTYCBCAHIBU2AgAgByACNgIoIAcgFjYCJCAHIBI2AiAgB0ETaiANQRB2OgAAIAcgBCkDiAE3AhQgByAEKAKQATYCHEEAIQlBASEFIAchAkEAIQcMAQsgBCgCsAEhFSABKAK8ASETIAUNASACEMggKAIAQTBGDQEgBEIANwLAASAEQQM6ALwBQQAhByAEQQA2ArgBIARCADcCyAEgBEIANwKwASAEQoCAgIDAADcCqAEgChC8IiAEQagBahDlIkEIQcAAEOogIhRCADcCJCAUIBM2AiAgFCAMNgIcIBRBBToAGCAUIAI2AhAgFCAVNgIMIBQgDTYCCCAUIBI2AgQgFEEXNgIAQQEhBSAUIQILIAkQoSMgCw0CDAMLQQhBwAAQ6iAiB0EANgIIIAdCMTcDACAEQgA3ArgBIAQgBzYCtAEgBEIANwLAASAEQQA2ArABIARCgICAgMAANwKoAUEIQSgQ6iAiByAJNgIgIAdBADYCHCAHIBM2AhggByAMNgIUIAcgAjYCECAHIBU2AgwgByANNgIIIAcgEjYCBCAHQQM2AgAgBEGoAWoQ2CFBCEHAABDqICICIAU6ABAgAiATNgIMIAIgDDYCCCACIAc2AgQgAkEwNgIAQQEhBSALRQ0MIAsQoiMMDAsgCxCiIwwDCyALEKIjCyAHDQUMCQsCQAJAIAsNACACIQUMAQsgASgCvAEhCUEIQcAAEOogIgUgCTYCECAFIAw2AgwgBSALNgIIIAUgAjYCBCAFQS02AgAgAS0AyAEhDQsCQCANQf8BcSICQbt/akECSQ0AIAJBGkYNAEEAIQFBABChIyAFIQIMDwsgASABKAJ4IgJB//97cTYCeCAEQagBaiABIAVBABCNCCABIAI2AnggBCgCrAEhAgJAAkAgBCgCqAEiBQ0AQQIhBQwBCyAEIA4pAgg3A8gCIAQgDikCADcDwAJBCEHAABDqICIJIAI2AgggCSAFNgIEIAlBHTYCACAJIAQpA8ACNwIMIAkgBCkDyAI3AhRBASEFIAkhAgtBABChIwwICyAJIQIMAwsgASgCvAEhDUEAIQVBCEHAABDqICILQQA2AgggC0IxNwMAIAQgCzYCdEEIQcAAEOogIgsgDTYCECALIAw2AgwgCyAHNgIIIAsgAjYCBCALQS02AgAMAQtBASEFCyABIAEoAnhBfnEgCUEBcXI2AnggBEGoAWoQtCIgASAJNgJ4IAshAgsgBEH0AGoQuiIMAwsgBCgCsAEhAgsgBEGgAmoQuiILQQIhBQsgBQ4DBAADAAsLIAQoArABIQILIARB6AJqELoiC0EBIQEMAQtBACEBCyAAIAI2AgQgACABNgIAIARBgANqJAALri4CEn8FfiMAQfACayIDJAAgASABKAJ4IgRB///vb3EiBUGAgIAQciIGNgJ4IAIoAighByACKAIkIQgCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAigCIC0AAEGIf2oOHAEAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAMAC0Go85oBQShB0POaARC5IQALIAgoAgAhCSADIAIoAiwtAAAiCjoAsAEgA0EBOgDcAiADIAk2AkACQAJAIAoNACABIAZB//xvcUGAAXI2AnggA0EANgLoASADQoCAgIDAADcC4AEgAyADQcAAajYC9AEgAyADQdwCajYC8AEgAyADQbABajYC7AEgA0EIaiADQeABaiABEMwCIAMoAgwhCSADKAIIIQUMAQsgASAFQYCDgBByNgJ4IANBADYC6AEgA0KAgICAwAA3AuABIAMgA0HAAGo2AvQBIAMgA0HcAmo2AvABIAMgA0GwAWo2AuwBIAMgA0HgAWogARDMAiADKAIEIQkgAygCACEFCyABIAY2AnggBUEBcUUNAiAAQQE2AgAgACAJNgIEIAIQzg4MCQsgCCgCACELIAEgBkH//G9xIgU2AnhBACEMAkAgAS0AgQFBIHFFDQAgASAFQYAgciIJNgJ4AkAgAS0AuAEiCkESRg0AIApBPkYNACABIAU2AngMAQsgASAJNgJ4IANBADoA6AIgA0EBOgDgASADQSBqIANB6AJqIANB4AFqIAEQ4gEgAygCJCEMIAMoAiAhCSABIAU2AnggCUEBcQ0ICwJAAkAgAS0AuAEiBQ0AAkACQCABKAKIASIFQQtHDQAgA0HgAWogARDEAQwBCyABQQs2AogBIAMgASkCmAE3A+ABIAMgASgCoAE2AugBIAFBjAFqIQkCQCABKAIIQQpGDQAgAUEIahDACwsgASAFNgIIIAEgCSkCADcCDCABIAkoAgg2AhQLIAEgAygC6AE2ArgBIAEgASkDsAE3A6gBIAEgAykD4AE3ArABIAEgASgCeCINQf/8335xQYCAgAFyNgJ4IANB4AFqIAEQ6QEgAygC5AEhCgJAIAMoAuABIg5BgICAgHhHDQAgASANNgJ4AkAgDEUNACAMEK8PIAwoAgAgDEEEaigCABD3IyAMQRRBBBDcFAsgCiEMDAoLIAFBsAFqIQ8gAygC6AEiEEEGdCEJIAohBQJAA0AgCUUNAQJAIAUoAgANACADQRhqIAVBCGoQkxQgAygCHEEERw0AIAVBwABqIQUgCUFAaiEJIAMoAhgoAABB9NClmwdGDQELCyAHKAIEIQUgBygCACEJIANBkYCAgHg2AuABIAEgCSAFIANB4AFqEO4dCyABIA02AnggAS0AuAEiBUEBRg0BIAEoArQBIQkgASgCsAEhDSADQbABaiAFEMglIANBjwKtQiCGQcLwmgGthDcD6AIgA0HgAWpBzZWAASADQegCahDOCCADIAMpArABNwLsASADIAMoArgBNgL0ASANIAkgA0HgAWoQxhshESABLQC4AUGiAUcNCCABIAEQhg4QkQkMCAsgASgCtAEhCSABKAKwASEKIANB3AJqIAUQyCUgA0GPAq1CIIZBn7aBAa2ENwPoAiADQeABakHNlYABIANB6AJqEM4IIAMgAykC3AI3AuwBIAMgAygC5AI2AvQBIAogCSADQeABahDGGyEFAkAgAS0AuAFBogFHDQAgASABEIYOEJEJCwJAIAxFDQAgDBCvDyAMKAIAIAxBBGooAgAQ9yMgDEEUQQQQ3BQLIAUhDAwICwJAAkAgASgCiAEiBUELRw0AIANB4AFqIAEQxAEMAQsgAUELNgKIASADIAEpApgBNwPgASADIAEoAqABNgLoASABQYwBaiEJAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBTYCCCABIAkpAgA3AgwgASAJKAIINgIUCyABKQOwASEVIA8gAykD4AE3AgAgDyADKALoATYCCCABIBU3A6gBQQAhBUEAIRECQCABLQCBAUEgcUUNAEEAIREgAS0AuAFB/wFxQQlHDQAgASABKAJ4IglBgCByNgJ4IANBCToA4AEgA0EQaiADQeABaiABEIYCIAMoAhAhDSABIAk2AnggAygCFCER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OgAcIANBADYCGCADIAk2AhQgAyAKNgIQIAMgDTcDCCADQRo2AgAMAQsgAkEAOgD8AiACQQA2AvgCIAIgCTYC9AIgAiAKNgLwAiACIA03A+gCIAIgATYCgAMgAiADQf8BcUH4AEYiAzoAhAMgAkEQaiACQagCaiABIAJB6AJqIAMQ4gIgAigCFCEDIAIoAhAhBgwBCyACQZACahDAIgwBCyACQZACahDAIgtBASEEIAZBAXENAiADKAIAQR5HDQELQQAhBAwBCwJAAkAgAS0AyAFBEkcNACABLQCBAUEgcUUNACABELIGIgZFDQAgAkEIaiADEKMEIAEoArwBIQkgAigCCCEFQQhBwAAQ6iAiBCAJNgIQIAQgBTYCDCAEIAY2AgggBCADNgIEIARBLTYCAAwBCyADIQQLIAIgASAEQQEQYiACKAIEIQMgAigCACEECyAAIAQ2AgAgACADNgIEIAJBgARqJAALwioCE38CfiMAQaABayIEJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMoAhAiBSADKAIUIgZLDQACQCADLQAYDQACQCAGIAMoAgwiB0kNACADKAIEIQggAygCACEJQQIhCgwNCyADKAIIIAZqLQAAIQsgAygCBCEIIAMoAgAhCSABKQDgBCABQegEaikAAIQgAUHwBGopAAAgAUH4BGopAACEhFBFDQoMCwsCQCAGIAMoAgwiDEkNACADKAIEIQ0gAygCACEJQQIhCgwECyADKAIIIAZqLQAAIQsgAygCBCENIAMoAgAhCSABKQDgBCABQegEaikAAIQgAUHwBGopAAAgAUH4BGopAACEhFBFDQEMAgsgAEEANgIADBELIARBMGogAUHgBGogC0EDdkEQcWoiCikDACAKQQhqKQMAIAtB/wBxEMQWIAQpAzBCAYNQDQAgC60hF0IEIRgMAgsgASALai0AYCEKCyAKQf8BcSELAkACQCAJDgMEAAEECyALQQZqIQsMAwsCQCABLQBZQQFxRQ0AIA0gASgCgAUoAtwCTw0CIA1BBmwgC2pBDGohCwwDCyANrSEXQgIhGAsgF0IghiAYhCEXDAILIAEoAoQFEKEYIQgMAgsCQCALIAIoAogBIghJDQAgCyAIQaj6hAEQ/hYACyACKAKEASALQQJ0aigCACIIQQBO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AkAgAi0AjQIiBA0AAkAgBSgCCA0AIAJBADoAjQIMAQsgAiAFKAIEIgEoAgAgAUEEaigCABC6DjoAjQILIAIgAi0AiAI6AEQgAkEAOwBFIAJBACkDoKWcASIKNwMgIAJBACkDqKWcASILNwMoIAIgCjcDMCACIAs3AzggAiACQdABajYCQCACQSBqIAUQgQggAkEgahD4GCACQTBqEPgYAkAgBSgCCCIBRQ0AIAFBMGwhAyAFKAIEIQEDQCABIAJB0AFqEMoBIAFBMGohASADQVBqIgMNAAsLIAIgBDoAjQILAkAgACgCJCIBRQ0AIAItAIQCQQFHDQAgAi8AiQIhACACQYECOwCJAiABKAIAIAJB0AFqEJICIAIgADsAiQILAkAgAigC1AEiAUUNACACKALQASACKALcARD0DSABIAFBBHRBF2pBcHEiAGpBCWoiAUUNACACKALQASAAayABQQgQ3BQLIAJB4AFqEPgYCyACQbACaiQAC4stAgt/An4jAEGwAmsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQC4ASIDQaF/ag4IAwICAgACAgECCwJAAkAgASgCiAEiBEELRw0AIAJBgAJqIAEQxAEMAQsgAUELNgKIASACIAEpApgBNwOAAiACIAEoAqABNgKIAiABQYwBaiEDAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBDYCCCABIAMpAgA3AgwgASADKAIINgIUCyABIAIoAogCNgK4ASABIAEoArQBNgKsASABIAEoArABIgU2AqgBIAEgAikDgAI3ArABIAEtALgBQQhHDQMgAUGwAWohBAJAAkAgASgCiAEiA0ELRw0AIAJBgAJqIAEQxAEMAQsgAUELNgKIASACIAEpApgBNwOAAiACIAEoAqABNgKIAiABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgAzYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABKQOwASENIAQgAikDgAI3AgAgBCACKAKIAjYCCCABIA03A6gBIAEtALgBIgNBoAFHDQcgASgCiAEiA0ELRw0EIAJBgAJqIAEQxAEMBQsCQAJAIAEoAogBIgRBC0cNACACQYACaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDgAIgAiABKAKgATYCiAIgAUGMAWohAwJAIAEoAghBCkYNACABQQhqEMALCyABIAQ2AgggASADKQIANwIMIAEgAygCCDYCFAsgASACKAKIAjYCuAEgASABKAK0ASIFNgKsASABIAEoArABIgQ2AqgBIAEgAikDgAI3ArABQQEhAyACQfgAaiABIAQgBCAFQQEQswIgAigCfCEEIAIoAnhBAUYNGSACQfAAaiABIARBARBBIAIoAnQhBCACKAJwIQMMGQsgAUGwAWohByABKALcASEIIAEoArABIQYCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAw55ACIGIgEiIiIiIiIiIiIiIgIiIiIiIiIiIiIiIiIiIiIiIgIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIgoKCiIiCAkiIiIiIiIiIiIiIiIiIiIiIiIiCiIiAyIiIiIiIgoiIiIEIgoiIiIiIiIiIiIiIiIiBSILIAJBADYCgAIgAkEwaiABIAggBkYgAkGAAmoQRiACKAI0IQQgAigCMCEFDCILIAEgASgCeCIEQf//e3E2AnggAkE4aiABEKoCIAIoAjghBSABIAQ2AnggAigCPCEEDCELIAEgBjYCBCABQQE2AgACQAJAIAEoAogBIgRBC0cNACACQYACaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDgAIgAiABKAKgATYCiAIgAUGMAWohAwJAIAEoAghBCkYNACABQQhqEMALCyABIAQ2AgggASADKQIANwIMIAEgAygCCDYCFAsgASkDsAEhDSAHIAIpA4ACNwIAIAcgAigCiAI2AgggASANNwOoASABLQC4ASIDQcMARw0fIAFBADYCACABKAKwASEFIAEoArQBIQMgASkDCCENIAFBCjYCCCACIAEpAxA3A4gCIAIgDTcDgAIgDaciBEEKRg0PIARBBkcNDyACKAKEAiEEIAJBgAJqEMALIAVBAWoiBSABKAJsIghJDRAgBCABKAJwSw0QQgEhDSABKAJgIAUgCGtqIAQgBWsQjRkhDgJAIAMgBEEBaiIESQ0AIAQgASgCbCIFSQ0SIAMgASgCcEsNEiABKAJgIAQgBWtqIAMgBGsQjRkhDQsCQAJAIAEoAogBIgRBC0cNACACQYACaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDgAIgAiABKAKgATYCiAIgAUGMAWohAwJAIAEoAghBCkYNACABQQhqEMALCyABIAQ2AgggASADKQIANwIMIAEgAygCCDYCFAsgASABKAK0ASIDNgKsASABIAEoArABNgKoASAHIAIpA4ACNwIAIAcgAigCiAI2AghBwAAQigEiBA0EQQhBwAAQoiQACyACQcAAaiABEMkMIAIoAkQhBCACKAJAIQUMHwtBACEFIAEgBhDnDSEEDB4LIAJByABqIAEgCCAGRhDeASACKAJIIgVBAkYNGyACKAJMIQQMHQsgASABKAJ4IgRB//97cTYCeCACQYgBaiABEJUBIAEgBDYCeCACKAKIAUEyRg0ZQQhBwAAQ5CAiBCACKQPAATcDOCAEIAIpA7gBNwMwIAQgAikDsAE3AyggBCACKQOoATcDICAEIAIpA6ABNwMYIAQgAikDmAE3AxAgBCACKQOQATcDCCAEIAIpA4gBNwMADAQLIAQgAzYCJCAEIAY2AiAgBCANNwMYIAQgDjcDECAEQQU2AgggBEEbNgIADAMLQQAhBSACQYACaiABQQAQqgcgAigChAIhBCACKAKAAiIGQYCAgIB4Rg0WIAIgAikCmAI3A/gBIAIgAikCkAI3A/ABIAIgAikCiAI3A+gBQQhBwAAQ5CAiAyAENgIIIAMgBjYCBCADQRw2AgAgAyACKQPoATcCDCADIAIpA/ABNwIUIAMgAikD+AE3AhwgAyEEDBoLIAJBgAJqIAEQohEgAigChAIhBCACKAKAAiIFQYCAgIB4Rg0UIAIgAikCmAI3A/gBIAIgAikCkAI3A/ABIAIgAikCiAI3A+gBQQhBwAAQ5CAiAyAENgIIIAMgBTYCBCADQRw2AgAgAyACKQPoATcCDCADIAIpA/ABNwIUIAMgAikD+AE3AhxBACEFIAMhBAwZCyACQcgBaiABELACIAIoAsgBQQdGDRIgAiACKQPgATcCnAIgAiACKQPYATcClAIgAiACKQPQATcCjAIgAiACKQPIATcChAJBwAAQigEiBEUNCiAEQRs2AgAgBCACKQKAAjcCBCAEIAIpAogCNwIMIAQgAikCkAI3AhQgBCACKQKYAjcCHCAEIAIoAqACNgIkC0EAIQUMFwsCQAJAIAEoAogBIgRBC0cNACACQYACaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDgAIgAiABKAKgATYCiAIgAUGMAWohAwJAIAEoAghBCkYNACABQQhqEMALCyABIAQ2AgggASADKQIANwIMIAEgAygCCDYCFAsgASACKAKIAjYCuAEgASABKAK0ATYCrAEgASABKAKwASIENgKoASABIAIpA4ACNwKwASACQYABaiABIARBARDTBCACKAKEASEEIAIoAoABIQMMFwsCQAJAIAEoAngiBEGAIHENACACQeAAaiABEHogAigCZCEGIAIoAmAhBwwBCyABIARBgMAAcjYCeCACQegAaiABEHogAigCaCEHIAEgBDYCeCACKAJsIQYLQQEhAyAHQQFxRQ0CIAYhBAwWCyABQQs2AogBIAIgASkCmAE3A4ACIAIgASgCoAE2AogCIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahDACwsgASADNgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEgASgCtAEiAzYCrAEgASABKAKwATYCqAEgBCACKQOAAjcCACAEIAIoAogCNgIIQcAAEIoBIgRFDQYgBEEAOgAMIAQgAzYCCCAEIAU2AgQgBEEhNgIAAkAgAS0AekEycQ0AIAJBi4CAgHg2AoACIAEgBSADIAJBgAJqEO4dCyACQdAAaiABIARBARBBIAIoAlQhBCACKAJQIQMMFAtBACEDIAYhBAJAAkAgBigCACIHQXRqQQcgB0ELSxtBeGoOHQAICAgICAgICAgVCAgICAgICAgICAgICAgICAgBCAsgBigCKCIEKAIAQTBHDQcgBC0AEEEBRw0HIAQoAgwhAyAEKAIIIQQgAkHogICAeDYCgAIgBCADIAJBgAJqEMYbIQQgAS0AuAFBogFHDQggASABEIYOEJEJDAgLIAYtABBFDQYgBigCDCEEIAYoAgghAyACQeiAgIB4NgKAAiADIAQgAkGAAmoQxhshBCABLQC4AUGiAUcNByABIAEQhg4QkQkMBwsgAkGAAmpBBHIgAxDIJSACQQY2ApQCIAJBxIabATYCkAIgAkGwgICAeDYCgAIgASgCsAEgASgCtAEgAkGAAmoQxhshBAJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQtBASEDDBILIAJBgAJqEJQiQajzmgFBKEGIiJsBELkhAAtB9I6bAUHWAEHMj5sBELkhAAtB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IQMgAkGqgICAeDYCgAIgASADIAQgAkGAAmoQ7h0MAQtBCEHAABCiJAALIAEoAqwBIQMgAigCpAIhBwJAAkAgCCAGRg0AQcAAEIoBIgRFDQFBACEFIARBADoAHCAEQQA2AhggBCADNgIUIAQgBzYCECAEIA03AwggBEEaNgIADAMLIAJBADoAnAIgAkEAOgCUAiACQQA2ApACIAIgAzYCjAIgAiAHNgKIAiACIA03A4ACIAIgATYCmAIgAkEgaiACQagCaiABIAJBgAJqQQAQ0wEgAigCJCEEIAIoAiAhBQwEC0EIQcAAEKIkAAsCQAJAIAEoAogBIgRBC0cNACACQYACaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDgAIgAiABKAKgATYCiAIgAUGMAWohAwJAIAEoAghBCkYNACABQQhqEMALCyABIAQ2AgggASADKQIANwIMIAEgAygCCDYCFAsgASkDsAEhDSAHIAIpA4ACNwIAIAcgAigCiAI2AgggASANNwOoASACQYACaiABELYIIAIpA4ACIg1QRQ0BIAIoAogCIQRBASEFCyAJQYCAgIB4Rw0CDAMLIAEoAqwBIQMgAigCpAIhBUHAABCKASIERQ0EIAQgAzYCFCAEIAU2AhAgBCANNwMIIARBLzYCAEEAIQULIAlBgICAgHhGDQELIAogCxDsHSAJIAoQ/SMLQQEhAyAFQQFxDQACQCAEKAIAQR5HDQBBACEDDAELAkACQCABLQC4AUESRg0AIAQhAwwBCwJAIAEtAIEBQSBxDQAgBCEDDAELAkAgARCEBCIFDQAgBCEDDAELIAJBCGogBBCfBCABKAKsASEGIAIoAgghB0EIQcAAEOQgIgMgBjYCECADIAc2AgwgAyAFNgIIIAMgBDYCBCADQS02AgALIAIgASADQQEQQSACKAIEIQQgAigCACEDCyAAIAM2AgAgACAENgIEIAJBsAJqJAAPC0EIQcAAEKIkAAvHJQIdfwl+IwBB8A5rIgQkACABvSIhQv////////8HgyIiQoCAgICAgIAIhCAhQgGGQv7///////8PgyAhQjSIp0H/D3EiBRsiI0IBgyEkQQIhBiADQf//A3EhBwJAAkACQAJAAkACQAJAAkACQCAiUCIIQQJBAyAIG0EEICFCgICAgICAgPj/AIMiIlAbICJCgICAgICA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IAEoAmghESABLQAdIRJBCyETAkAgBSgCACIUQQtGDQAgAUGYAWohFUEKIRMCQCAUQQpGDQAgAkGwAWogBRCVBiACIAIpArQBNwPQASACIAIoArwBNgLYASACKAKwASETCyACIAIpA9ABNwOwASACIAIoAtgBNgK4ASACIBUoAgg2AsQBIAIgFSkCADcCvAELIAIgCzYCUCACIA02AkwgAiAONgJIIAIgAikD4AE3AlQgAiACKALoATYCXCACIBE2AnQgAiAQNgJsIAIgCDYCaCACIBI6AGUgAiAPOgBkIAIgDDYCYCACIAEoAqwBIg42ApwBIAIgASgCqAEiDzYCmAEgAiADNgJwIAIgEzYCeCACIAYoAgg2AqgBIAIgBikDADcDoAEgAiACKQOwATcCfCACIAIpA7gBNwKEASACIAIpA8ABNwKMASACIAIoAsgBNgKUASABIANBgSByNgJ4IAJBADoA4AEgAkEBOgCwASACQcAAaiACQeABaiACQbABaiABEOIBIAIoAkAhDSABIANBAXI2AnggAigCRCEIIAJB+ABqIRAgAkGgAWohDAJAAkACQCANQQFxDQACQAJAIAEtAIABQQFxRQ0AIAgoAghBAUcNACAIKAIEIhEoAiANACARKAIkDQBBACEDQQAhDSAIKAIQIBEoAgRrQQFNDQELIAJBOGogARCBAUEBIQ0gAigCPCEDIAIoAjhBAXENACACIAM2AuABAkAgAygCAEEeRw0AIAMgCCgCDDYCFAJAIAMoAiAiBUUNACAFEK8PIAUoAgAgBUEEaigCABD3IyAFQRRBBBDcFAsgAyAINgIgDAQLIAJBsAFqQQRyIAEtALgBEMglIAJBATYCxAEgAkGm7ZoBNgLAASACQbCAgIB4NgKwASABKAKwASABKAK0ASACQbABahDGGyEDAkAgAS0AuAFBogFHDQAgASABEIYOEJEJCyACQeABahCSIgsgCBCvDyAIKAIAIAhBBGooAgAQ9yMgCEEUQQQQ3BQgDUUNASADIQgLIAEgAkHIAGoQywggBiAMKAIINgIIIAYgDCkDADcDAAJAIAEoAogBQQ5xQQpGDQAgBRDACwsgASAONgKsASABIA82AqgBIAUgECkDGDcDGCAFIBApAxA3AxAgBSAQKQMINwMIIAUgECkDADcDACAIQQhqEOYDIAhBIEEIENwUDAILIAMNACABIAJByABqEMsIIAYgDCgCCDYCCCAGIAwpAwA3AwACQCABKAKIAUEOcUEKRg0AIAUQwAsLIAEgDjYCrAEgASAPNgKoASAFIBApAxg3AxggBSAQKQMQNwMQIAUgECkDCDcDCCAFIBApAwA3AwAMAQsgASABKAJ4QX5xIAdBAXFyNgJ4AkAgC0EKRg0AIAJB0ABqEMALCwJAIBNBDnFBCkYNACAQEMALCyABIAc2AnggBEGA4ABxQYDgAEcNBCACQbuBgIB4NgJIIAEgCiAJIAJByABqEO4dDAQLIAEgBzYCeAtBfyEDDAELIAEoArABIQMLIAEgAzYC3AEgAkEoaiABEPUGQQEhBCACKAIsIQUCQCACKAIoQQFxRQ0AIAUhAwwDCwJAIAUoAgAiBkEeRw0AQQAhBCAFIQMMAwsCQAJAAkAgAS0AuAFBCkYNACAFIQMMAQsCQAJAIAEoAogBIgNBC0cNACACQcgAaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDSCACIAEoAqABNgJQIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahDACwsgASADNgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEgAigCUDYCuAEgASABKQOwATcDqAEgASACKQNINwKwAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAUoAgAiA0F0akEHIANBC0sbDiYAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJQALIAVBBGohAwwsCyAFQRBqIQMMKwsgBUEQaiEDDCoLIAUoAiBBMGohAwwpCyAFQQhqIQMMKAsgBUEEaiEDDCcLIAVBDGohAwwmCyAFQTBqIQMMJQsgBUEgaiEDDCQLIAVBIGohAwwjCyAFQRBqIQMMIgsgBUEcaiEDDCELIAVBFGohAwwgCyAFQRBqIQMMHwsgBUEQaiEDDB4LIAUoAggOBxYXGBkaGxwWCyAFQRxqIQMMHAsgBUEMaiEDDBsLIAVBFGohAwwaCyAFKAIgQSRqIQMMGQsgBUEEaiEDDBgLIAVBBGohAwwXCyAFQQhqIQMMFgsgBUEIaiEDDBULIAVBGGohAwwUCyAFQShqIQMMEwsgBUEEaiEDDBILIAUoAgQhAwwRCyAFQRBqIQMMEAsgBUEMaiEDDA8LIAVBCGohAwwOCyAFQQhqIQMMDQsgBUEMaiEDDAwLIAVBDGohAwwLCyAFQQxqIQMMCgsgBUEQaiEDDAkLIAVBCGohAwwICyAFQQRqIQMMBwsgBUEYaiEDDAYLIAVBDGohAwwFCyAFQQxqIQMMBAsgBUEQaiEDDAMLIAVBEGohAwwCCyAFQSBqIQMMAQsgBUEgaiEDCyADKAIAIQcgASABKAJ4IgNBwIAGcjYCeAJAAkAgAS0AuAFBPkcNACABLQCBAUEgcUUNACABEPwEIgZFDQBBACEIDAELIAJBIGogARCBASACKAIkIQYgAigCICEICyABIAM2AngCQAJAAkAgCEEBcUUNACAGIQMMAQsCQAJAAkACQAJAIAEtALgBIgNBCUcNACABQbABaiEDAkACQCABKAKIASIIQQtHDQAgAkHIAGogARDEAQwBCyABQQs2AogBIAIgASkCmAE3A0ggAiABKAKgATYCUCABQYwBaiEQAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgCDYCCCABIBApAgA3AgwgASAQKAIINgIUCyABKQOwASEWIAMgAikDSDcCACADIAIoAlA2AgggASAWNwOoASABIAEoAngiA0H//3lxQYCAAnI2AnggAS0AuAFBPkYNAQwCCyABKAK0ASEIIAEoArABIQcgAkGwAWogAxDIJSACQY8CrUIghkHn9JoBrYQ3A+ABIAJByABqQc2VgAEgAkHgAWoQshAgAiACKQKwATcCVCACIAIoArgBNgJcIAcgCCACQcgAahDGGyEDIAEtALgBQaIBRw0DIAEgARCGDhCRCQwDCyABLQCBAUEgcUUNACABEPwEIghFDQBBACEQDAELIAJBGGogARCBASACKAIcIQggAigCGCEQCyABIAM2AnggEEEBcUUNAiAIIQMLIAYQjQIgBkHAAEEIENwUCyAFEI0CIAVBwABBCBDcFAwFCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAgoAgAiA0F0akEHIANBC0sb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AUF/aiIDIAxPDQAgASEKIA0gA2otAAAtAJCRhQFFDQoMEQsgAyAMQYzthAEQ/hYACyABIQogASAMTw0IIAEhCiANIAFqLQAALQCQkYUBRQ0IDA8LIAEhCiANIAwgARCyBUH/AXENBwwOCyABIQogDSAMIAEQjwhB/wFxDQYMDQsgAygCCCEOIAMoAgQhBwJAIAIoAggiCiACKAIARw0AIAIQmBoLIAIgCkEBajYCCCACKAIEIApBDGxqIgogATYCCCAKIA42AgQgCkEANgIAIAEhCgwFCyABIAhPDQsgASAMTw0LIAMoAghBA3QhCiADKAIEQQVqIQMgDSABai0AACEQA0AgAyEHIApFDQwgB0F/ai0AACAQQf8BcSIOSw0MIApBeGohCiAHQQhqIQMgDiAHLQAASw0ACyABQQFqIQogB0F7aigCACEHDAwLIAEgCE8NCiABIAxPDQogAygCCCIKIA0gAWotAAAiB00NCCADKAIEIAdBAnRqKAIAIgdFDQogAUEBaiEKDAsLIAMoAggiDkUNCSADKAIEIgooAgAhByAGIAogDkECdGo2AgggBiAKQQRqNgIEIAYgBjYCDCACIAZBBGoQkw8gASEKDAILIAMoAgQhByABIQogAygCECIDIAVPDQEgBCADQQJ0aiIOKAIAIRACQCACKAIIIgogAigCAEcNACACEJgaCyACIApBAWo2AgggDiABQQFqNgIAIAIoAgQgCkEMbGoiCiAQNgIIIAogAzYCBCAKQQE2AgAgASEKDAELCyABIAhJDQUMBgsgAygCBCEHIAAgATYCCCAAIAc2AgQgAEEBNgIADBMLIAcgCkG84oQBEP4WAAsgCiAMQezshAEQ/hYACyAKIAxB3OyEARD+FgALIAcgCkGU/oQBEP4WAAsgASAMTw0AIAMtAAggDSABai0AACIHSw0AIAcgAy0ACUH/AXFLDQAgAUEBaiEKIAMoAgQhBwwBCwsgAigCCCEBCyABDQALCyAVQQFqIhUgCE0NAAsLIABBADYCAAwHCyAHIAVB3PKEARD+FgALIAZBAjoABCAGIAo2AgggBkEEahDaHiEHDAQLAkAgAygCBCIHIAsoAtwCSQ0AIABBADYCAAwFCyALKALYAiAHQQJ0aigCACERDAILIABBADYCAAwDCyALKAKwAiERCwJAIAIoAggiByACKAIA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DEYbIQULQQAhBgsgAUGwAWohBCABKAKwASEHAkACQCABKAKIASIDQQtHDQAgAkHoAWogARDEAQwBCyABQQs2AogBIAIgASkCmAE3A+gBIAIgASgCoAE2AvABIAFBjAFqIQgCQCABKAIIQQpGDQAgAUEIahDACwsgASADNgIIIAEgCCkCADcCDCABIAgoAgg2AhQLIAEpA7ABIQkgBCACKQPoATcCACAEIAIoAvABNgIIIAEgCTcDqAEgASgCsAEhBCACQShqIAEQiAEgAigCLCEDAkAgAigCKEEBRw0AIAEgAxCRCUEIQcAAEOQgIgMgBEF/aiIENgIIIAMgBDYCBCADQTE2AgALIAZFDQEgAS0AgQFBIHENASADKAIAQRpHDQEgAygCFCEEIAMoAhAhBiACQYiBgIB4NgLoASABIAYgBCACQegBahCLEwwBC0EIQcAAEKIkAAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADKAIAIgFBdGpBByABQQtLGw4mAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUACyADQQhqIQEMLAsgA0EUaiEBDCsLIANBFGohAQwqCyADKAIgQTRqIQEMKQsgA0EMaiEBDCgLIANBCGohAQwnCyADQRBqIQEMJgsgA0E0aiEBDCULIANBJGohAQwkCyADQSRqIQEMIwsgA0EUaiEBDCILIANBIGohAQwhCyADQRhqIQEMIAsgA0EUaiEBDB8LIANBFGohAQweCyADKAIIDgcWFxgZGhscFgsgA0EgaiEBDBwLIANBEGohAQwbCyADQRhqIQEMGgsgAygCIEEoaiEBDBkLIANBCGohAQwYCyADQQhqIQEMFwsgA0EMaiEBDBYLIANBDGohAQwVCyADQRxqIQEMFAsgA0EsaiEBDBMLIANBCGohAQwSCyADKAIEQQRqIQEMEQsgA0EUaiEBDBALIANBEGohAQwPCyADQQxqIQEMDgsgA0EMaiEBDA0LIANBEGohAQwMCyADQRBqIQEMCwsgA0EQaiEBDAoLIANBFGohAQwJCyADQQxqIQEMCAsgA0EIaiEBDAcLIANBHGohAQwGCyADQRBqIQEMBQsgA0EQaiEBDAQLIANBFGohAQwDCyADQRRqIQEMAgsgA0EkaiEBDAELIANBJGohAQsgASgCACEBAkBBwAAQigEiBEUNACAEIAU6ABAgBCABNgIMIAQgBzYCCCAEIAM2AgQgBEEQNgIAQQAhBgwEC0EIQcAAEKIkAAsgAUGIAWohBCABKQMIIQkgAUEKNgIIIAIgASkDEDcD4AEgAiAJNwPYASACQfgBaiABEMQBIAEpAwghCSABQQo2AgggAiABKQMQNwPwASACIAk3A+gBIAFBCGohAwJAAkAgASgCiAFBDnFBCkcNACAEIAIpA4ACNwMYIAQgAikD+AE3AxAgBCACKQPwATcDCCAEIAIpA+gBNwMADAELIAQQwAsgBCACKQPoATcDACAEIAIpA/ABNwMIIAQgAikD+AE3AxAgBCACKQOAAjcDGCADKAIAQQpGDQAgAxDACwsgAyACKQPgATcDCCADIAIpA9gBNwMAIAQoAgBBC0YNAQsCQAJAIAEtAKABIgNBtX9qIgRBH0sNAEEBIAR0QYGAgpB4cQ0BCyADQY1/akH/AXFBLkkNACADQRNGDQAgA0G0f2pB/wFxQSdJDQAgA0FbaiIEQRJLDQFBASAEdEGDgBpxRQ0BCyABIAEoAngiBEH/v39xNgJ4QQEhBiACQThqIAEoArABQQEgARBlIAEgBDYCeAJAIAIoAsgBQYGAgIB4Rw0AIAIoAjghBAwCC0EAIQYgAkE4ahDUDyEEDAELIAIgARCpAUEBIQYgAigCBCEEIAIoAgBBAXENAAJAIAQoAgBBHkcNAEEAIQYMAQsCQCABLQC4ASIDQWNqQf8BcUECSQ0AQQAhBgwBCwJAAkAgAS0AuQENACABIARBABDKCgJAAkAgASgCiAEiBkELRw0AIAJB6AFqIAEQxAEMAQsgAUELNgKIASACIAEpApgBNwPoASACIAEoAqABNgLwASABQYwBaiEFAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBjYCCCABIAUpAgA3AgwgASAFKAIINgIUCyABIAIoAvABNgK4ASABIAEoArQBIgU2AqwBIAEgASgCsAE2AqgBIAEgAikD6AE3ArABAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBCgCACIBQXRqQQcgAUELSxsOJgABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlAAsgBEEEaiEBDCwLIARBEGohAQwrCyAEQRBqIQEMKgsgBCgCIEEwaiEBDCkLIARBCGohAQwoCyAEQQRqIQEMJwsgBEEMaiEBDCYLIARBMGohAQwlCyAEQSBqIQEMJAsgBEEgaiEBDCMLIARBEGohAQwiCyAEQRxqIQEMIQsgBEEUaiEBDCALIARBEGohAQwfCyAEQRBqIQEMHgsgBCgCCA4HFhcYGRobHBYLIARBHGohAQwcCyAEQQxqIQEMGwsgBEEUaiEBDBoLIAQoAiBBJGohAQwZCyAEQQRqIQEMGAsgBEEEaiEBDBcLIARBCGohAQwWCyAEQQhqIQEMFQsgBEEYaiEBDBQLIARBKGohAQwTCyAEQQRqIQEMEgsgBCgCBCEBDBELIARBEGohAQwQCyAEQQxqIQEMDwsgBEEIaiEBDA4LIARBCGohAQwNCyAEQQxqIQEMDAsgBEEMaiEBDAsLIARBDGohAQwKCyAEQRBqIQEMCQsgBEEIaiEBDAgLIARBBGohAQwHCyAEQRhqIQEMBgsgBEEMaiEBDAULIARBDGohAQwECyAEQRBqIQEMAwsgBEEQaiEBDAILIARBIGohAQwBCyAEQSBqIQELIAEoAgAhB0HAABCKASIBRQ0BQQAhBiABQQA6ABEgASAENgIMIAEgBTYCCCABIAc2AgQgAUERNgIAIAEgA0H/AXFBHUc6ABAgASEEDAILQQAhBgwBC0EIQcAAEKIkAAsgACAGNgIAIAAgBDYCBCACQZACaiQAC6MgAgZ/AX4jAEHAAGsiBiQAIAZBMGogASACIAVBwQAgBRCFGwJAAkAgBi0AMEEFRg0AIAAgBikDMDcCAAwBCwJAAkACQAJAAkAgBUUNACAEEOMeGgJAIAEtAF0NACAGQTBqIAEQuhQgBi0AMEEERg0AIAYpAzAiDEL/AYNCBFINAgsgBkEAOgAGIAEtAF1FDQIMAwsgAS0AXQ0DIAZBMGogARC6FCAGLQAwQQRGDQMgBikDMCIMQv8Bg0IEUQ0DIAAgDDcCAAwECyAAIAw3AgAMAwsgASABKAI4QQFqNgI4CyAGQQA6AAcgBSEHIAQhCEEAIQkDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAHRQ0AIAgQ4x4aIAZBMGogASADQcEAIAkgCiAGQQdqIAZBBmoQjQYCQCAGLQAwQQRGDQAgBikDMCIMQv8Bg0IEUg0XC0EEIAgoAgAiCkF8aiAKQQRJGw4HAQIDBAUGBwELAkAgBCAFQThsakFIaiIIRQ0AIAgQ4x4aCyAGQTBqIAEgAiADQcEAIAkgChDwAiAGLQAwQQRGDRggBikDMCIMQv8Bg0IEUg0VDBgLIAhBFGooAgAhCiAGQSBqIAEgCEEQaigCACIJQQAQtQICQAJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQELIAZBIGogCEEcaiABEKYgAkAgBi0AIEEERg0AIAYpAyAiDEL/AYNCBFINAQsgBkEANgIwIAZBIGogASAGQTBqQabtmgFBARDsDQJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQELIAZBIGogASAJIAogCEEIaigCACAIQQxqKAIAEPkHAkAgBi0AIEEERg0AIAYpAyAiDEL/AYNCBFINAQsgBkEgaiABIAZBMGpBp+2aAUEBEOwNAkAgBi0AIEEERg0AIAYpAyAiDEL/AYNCBFINAQsgCEEYaiIKKAIARQ0SIAZBIGogARDYEAJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQELIAZBIGogASAGQTBqQc7smgFBARDsDQJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQELIAZBIGogARDYEAJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQELIAZBIGogCiABEKkRIAYtACBBBEYNEiAGKQMgIgxC/wGDQgRRDRILIAxC/wGDQgRRDREMEgsgCEEUaigCACEKIAZBIGogASAIQRBqKAIAIglBABC1AgJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDRALIAZBADYCMCAGQSBqIAEgBkEwakHL7poBQQMQ6w0CQCAGLQAgQQRGDQAgBikDICIMQv8Bg0IEUg0QCyAIQRxqIgsoAgBFDQ4gBkEgaiABENgQAkAgBi0AIEEERg0AIAYpAyAiDEL/AYNCBFINEAsgBkEgaiALIAEQ5AUgBi0AIEEERw0FDA4LIAZBMGogASAIQQRqKAIAQQAQtQICQCAGLQAwQQRGDQAgBikDMCIMQv8Bg0IEUg0NCyAIQRRqLQAARQ0LIAZBADYCMCAGQQhqIAEgBkEwakG475oBQQgQ6w0CQCAGLQAIQQRGDQAgBikDCCIMQv8Bg0IEUg0NCyAGQTBqIAEQ2BAgBi0AMEEERg0LIAYpAzAiDEL/AYNCBFENCwwMCyAGQQA2AjAgBkEgaiABIAZBMGpBpe6aAUEDEOsNAkAgBi0AIEEERg0AIAYpAyAiDEL/AYNCBFINCgsgBkEgaiABENgQAkAgBi0AIEEERg0AIAYpAyAiDEL/AYNCBFINCgsgCEEEaiEKAkAgCEEUai0AAA0AIAZBIGogCiABEI0kIAYtACBBBEYNCSAGKQMgIgxC/wGDQgRSDQoMCQsgBkEgaiABIAZBMGpBou+aAUEBEOwNAkAgBi0AIEEERg0AIAYpAyAiDEL/AYNCBFINCgsgBkEgaiAKIAEQjSQCQCAGLQAgQQRGDQAgBikDICIMQv8Bg0IEUg0KCyAGQSBqIAEgBkEwakGj75oBQQEQ7A0gBi0AIEEERg0IIAYpAyAiDEL/AYNCBFENCAwJCyAGQQA2AjAgBkEgaiABIAZBMGpByO6aAUEDEOsNAkAgBi0AIEEERg0AIAYpAyAiDEL/AYNCBFINBwsgBkEgaiABENgQAkAgBi0AIEEERg0AIAYpAyAiDEL/AYNCBFINBwsCQCAIQTRqLQAADQAgBkEgaiAIQTBqIAEQjSQgBi0AIEEERg0GIAYpAyAiDEL/AYNCBFINBwwGCyAGQSBqIAEgBkEwakGi75oBQQEQ7A0CQCAGLQAgQQRGDQAgBikDICIMQv8Bg0IEUg0HCyAGQSBqIAhBMGogARCNJAJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQcLIAZBIGogASAGQTBqQaPvmgFBARDsDSAGLQAgQQRGDQUgBikDICIMQv8Bg0IEUQ0FDAYLIAhBGGooAgAhCiAGQSBqIAEgCEEUaigCACIJQQAQtQICQCAGLQAgQQRGDQAgBikDICIMQv8Bg0IEUg0ECwJAIAhBJGotAAANACAGQSBqIAhBEGogARCNJCAGLQAgQQRGDQMgBikDICIMQv8Bg0IEUg0EDAMLIAZBADYCCCAGQSBqIAEgBkEIakGi75oBQQEQ7A0CQCAGLQAgQQRGDQAgBikDICIMQv8Bg0IEUg0ECyAGQSBqIAhBEGogARCNJAJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQQLIAZBIGogASAGQQhqQaPvmgFBARDsDSAGLQAgQQRGDQIgBikDICIMQv8Bg0IEUQ0CDAMLIAZBMGogCEEEaiABEMgGIAYtADBBBEYNCyAGKQMwIgxC/wGDQgRSDQwMCwsgBikDICIMQv8Bg0IEUQ0IDAkLAkAgCEElai0AAEUNACAGQQA2AiAgBkEYaiABIAZBIGpBr+6aAUEBEOwNIAYtABhBBEYNACAGKQMYIgxC/wGDQgRSDQELAkAgCEEgaiILKAIARQ0AIAZBIGogCyABEOQFIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQELIAZBADYCMCAGQSBqIAEgBkEwakGm7ZoBQQEQ7A0CQCAGLQAgQQRGDQAgBikDICIMQv8Bg0IEUg0BCyAGQSBqIAEgCSAKIAhBCGooAgAgCEEMaigCABD5BwJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQELIAZBIGogASAGQTBqQaftmgFBARDsDQJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQELIAhBHGoiCigCAEUNCSAGQSBqIAEgBkEwakHO7JoBQQEQ7A0CQCAGLQAgQQRGDQAgBikDICIMQv8Bg0IEUg0BCwJAIAEtAF0NACAGQSBqIAEQ2BAgBi0AIEEERg0AIAYpAyAiDEL/AYNCBFINAQsgBkEgaiAKIAEQqREgBi0AIEEERg0JIAYpAyAiDEL/AYNCBFENCQsgDEL/AYNCBFENCAwJCyAGQSBqIAEgBkEwakGm7ZoBQQEQ7A0CQCAGLQAgQQRGDQAgBikDICIMQv8Bg0IEUg0BCyAGQSBqIAggARDYCwJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQELIAZBIGogASAGQTBqQaftmgFBARDsDSAGLQAgQQRGDQcgBikDICIMQv8Bg0IEUQ0HCyAMQv8Bg0IEUQ0GDAcLIAZBIGogASAGQTBqQabtmgFBARDsDQJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQELIAZBIGogASAGQTBqQaftmgFBARDsDQJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQELIAhBEGooAgAiCkUNBSAGQSBqIAEgBkEwakHO7JoBQQEQ7A0CQCAGLQAgQQRGDQAgBikDICIMQv8Bg0IEUg0BCwJAIAEtAF0NACAGQSBqIAEQ2BAgBi0AIEEERg0AIAYpAyAiDEL/AYNCBFINAQsgBkEgaiAKIAEQVCAGLQAgQQRGDQUgBikDICIMQv8Bg0IEUQ0FCyAMQv8Bg0IEUQ0EDAULAkACQCAIQRVqLQAADQAgBkEwaiAIQRBqIAEQjSQgBi0AMEEERg0BIAYpAzAiDEL/AYNCBFINAgwBCyAGQQA2AiAgBkEwaiABIAZBIGpBou+aAUEBEOwNAkAgBi0AMEEERg0AIAYpAzAiDEL/AYNCBFINAgsgBkEwaiAIQRBqIAEQjSQCQCAGLQAwQQRGDQAgBikDMCIMQv8Bg0IEUg0CCyAGQTBqIAEgBkEgakGj75oBQQEQ7A0gBi0AMEEERg0AIAYpAzAiDEL/AYNCBFINAQsCQCAIQRZqLQAARQ0AIAZBADYCMCAGQQhqIAEgBkEwakGv7poBQQEQ7A0gBi0ACEEERg0AIAYpAwgiDEL/AYNCBFINAQsgCEEMaiIKKAIARQ0DIAZBADYCMCAGQQhqIAEgBkEwakHO7JoBQQEQ7A0CQCAGLQAIQQRGDQAgBikDCCIMQv8Bg0IEUg0BCwJAIAEtAF0NACAGQTBqIAEQ2BAgBi0AMEEERg0AIAYpAzAiDEL/AYNCBFINAQsgBkEwaiAKIAEQqREgBi0AMEEERg0DIAYpAzAiDEL/AYNCBFENAwsgDEL/AYNCBFENAgwDCyAGQSBqIAEgBkEwakGm7ZoBQQEQ7A0CQCAGLQAgQQRGDQAgBikDICIMQv8Bg0IEUg0BCyAGQSBqIAEgCSAKIAhBCGooAgAgCEEMaigCABD5BwJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQELIAZBIGogASAGQTBqQaftmgFBARDsDQJAIAYtACBBBEYNACAGKQMgIgxC/wGDQgRSDQELIAhBGGoiCigCAEUNASAGQSBqIAEgBkEwakHO7JoBQQEQ7A0CQCAGLQAgQQRGDQAgBikDICIMQv8Bg0IEUg0BCyAGQSBqIAEQ2BACQCAGLQAgQQRGDQAgBikDICIMQv8Bg0IEUg0BCyAGQSBqIAogARCpESAGLQAgQQRGDQEgBikDICIMQv8Bg0IEUQ0BCyAMQv8Bg0IEUg0BCyAGQQA2AjAgBkEgaiABIAZBMGoQ6g0gBi0AIEEERg0BIAYpAyAiDEL/AYNCBFENAQsgDEL/AYNCBFINAQsCQCAGLQAGDQAgBkEBOgAGDAILIAEoAlRFDQEgBkEwaiABIAgQ4x5BABCwBCAGLQAwQQRGDQEgBikDMCIMQv8Bg0IEUQ0BCyAAIAw3AgAMAwsCQCAGLQAHRQ0AIAEgASgCOEF/ajYCOCAGQQA6AAcLIAdBf2ohB0EBIQkgCBDjHiEKIAhBOGohCAwACwsgBkEwaiABIAMgBUVBwQAQyxICQCAGLQAwQQRGDQAgBikDMCIMQv8Bg0IEUQ0AIAAgDDcCAAwBCyAAQQQ6AAALIAZBwABqJAAL9SQCCH8BfgJAAkACQAJAIABB9QFJDQACQCAAQcz/e00NAEEADwsgAEELaiIBQXhxIQJBACgCnJSdASIDRQ0CQR8hBCAAQfX//wdPDQEgAkEmIAFBCHZnIgBrdkEBcSAAQQF0a0E+aiEEDAELAkACQAJAAkACQAJAQQAoApiUnQEiBUEQIABBC2pB+ANxIABBC0kbIgJBA3YiAXYiAEEDcUUNACAAQX9zQQFxIAFqIgZBA3QiAEGQkp0BaiIBIABBmJKdAWooAgAiAigCCCIHRg0BIAcgATYCDCABIAc2AggMAgsgAkEAKAKglJ0BTQ0GIAANAkEAKAKclJ0BIgBFDQYgAGhBAnRBgJGdAWooAgAiBygCBEF4cSACayEBIAchBQNAAkAgBygCECIADQAgBygCFCIADQAgBSgCGCEEAkACQAJAIAUoAgwiACAFRw0AIAVBFEEQIAUoAhQiABtqKAIAIgcNAUEAIQAMAgsgBSgCCCIHIAA2AgwgACAHNgIIDAELIAVBFGogBUEQaiAAGyEGA0AgBiEIIAciAEEUaiAAQRBqIAAoAhQiBxshBiAAQRRBECAHG2ooAgAiBw0ACyAIQQA2AgALIARFDQYCQAJAIAUgBSgCHEECdEGAkZ0BaiIHKAIARg0AAkAgBCgCECAFRg0AIAQgADYCFCAADQIMCQsgBCAANgIQIAANAQwICyAHIAA2AgAgAEUNBgsgACAENgIYAkAgBSgCECIHRQ0AIAAgBzYCECAHIAA2AhgLIAUoAhQiB0UNBiAAIAc2AhQgByAANgIYDAYLIAAoAgRBeHEgAmsiByABIAcgAUkiBxshASAAIAUgBxshBSAAIQcMAAsLQQAgBUF+IAZ3cTYCmJSdAQsgAiAAQQNyNgIEIAIgAGoiACAAKAIEQQFyNgIEIAJBCGoPCwJAAkAgACABdEECIAF0IgBBACAAa3JxaCIIQQN0IgFBkJKdAWoiByABQZiSnQFqKAIAIgAoAggiBkYNACAGIAc2AgwgByAGNgIIDAELQQAgBUF+IAh3cTYCmJSdAQsgACACQQNyNgIEIAAgAmoiBSABIAJrIgdBAXI2AgQgACABaiAHNgIAAkBBACgCoJSdASIBRQ0AQQAoAqiUnQEhAgJAAkBBACgCmJSdASIGQQEgAUEDdnQiCHENAEEAIAYgCHI2ApiUnQEgAUF4cUGQkp0BaiIBIQYMAQsgAUF4cSIBQZCSnQFqIQYgAUGYkp0BaigCACEBCyAGIAI2AgggASACNgIMIAIgBjYCDCACIAE2AggLQQAgBTYCqJSdAUEAIAc2AqCUnQEgAEEIag8LQQBBACgCnJSdAUF+IAUoAhx3cTYCnJSdAQsCQAJAAkAgAUEQSQ0AIAUgAkEDcjYCBCAFIAJqIgcgAUEBcjYCBCAHIAFqIAE2AgBBACgCoJSdASIGRQ0BQQAoAqiUnQEhAAJAAkBBACgCmJSdASIIQQEgBkEDdnQiBHENAEEAIAggBHI2ApiUnQEgBkF4cUGQkp0BaiIGIQgMAQsgBkF4cSIGQZCSnQFqIQggBkGYkp0BaigCACEGCyAIIAA2AgggBiAANgIMIAAgCDYCDCAAIAY2AggMAQsgBSABIAJqIgBBA3I2AgQgBSAAaiIAIAAoAgRBAXI2AgQMAQtBACAHNgKolJ0BQQAgATYCoJSdAQsgBUEIaiIARQ0BDAILQQAgAmshAQJAAkACQAJAIARBAnRBgJGdAWooAgAiBQ0AQQAhB0EAIQAMAQtBACEHIAJBAEEZIARBAXZrIARBH0YbdCEGQQAhAANAAkAgBSIFKAIEQXhxIgggAkkNACAIIAJrIgggAU8NACAFIQcgCCEBIAgNAEEAIQEgBSEAIAUhBwwDCyAFKAIUIgggACAIIAUgBkEddkEEcWooAhAiBUcbIAAgCBshACAGQQF0IQYgBQ0ACwsCQCAAIAdyDQBBACEHQQIgBHQiAEEAIABrciADcSIARQ0DIABoQQJ0QYCRnQFqKAIAIQALIABFDQELA0AgACgCBEF4cSIFIAJrIgYgASAGIAFJIggbIQQgBSACSSEGIAAgByAIGyEIAkAgACgCECIFDQAgACgCFCEFCyABIAQgBhshASAHIAggBhshByAFIQAgBQ0ACwsgB0UNAAJAQQAoAqCUnQEiACACSQ0AIAEgACACa08NAQsgBygCGCEEAkACQAJAIAcoAgwiACAHRw0AIAdBFEEQIAcoAhQiABtqKAIAIgUNAUEAIQAMAgsgBygCCCIFIAA2AgwgACAFNgIIDAELIAdBFGogB0EQaiAAGyEGA0AgBiEIIAUiAEEUaiAAQRBqIAAoAhQiBRshBiAAQRRBECAFG2ooAgAiBQ0ACyAIQQA2AgALAkAgBEUNAAJAAkACQCAHIAcoAhxBAnRBgJGdAWoiBSgCAEYNAAJAIAQoAhAgB0YNACAEIAA2AhQgAA0CDAQLIAQgADYCECAADQEMAwsgBSAANgIAIABFDQELIAAgBDYCGAJAIAcoAhAiBUUNACAAIAU2AhAgBSAANgIYCyAHKAIUIgVFDQEgACAFNgIUIAUgADYCGAwBC0EAQQAoApyUnQFBfiAHKAIcd3E2ApyUnQELAkACQCABQRBJDQAgByACQQNyNgIEIAcgAmoiACABQQFyNgIEIAAgAWogATYCAAJAIAFBgAJJDQAgACABEIkKDAILAkACQEEAKAKYlJ0BIgVBASABQQN2dCIGcQ0AQQAgBSAGcjYCmJSdASABQfgBcUGQkp0BaiIBIQUMAQsgAUH4AXEiAUGQkp0BaiEFIAFBmJKdAWooAgAhAQsgBSAANgIIIAEgADYCDCAAIAU2AgwgACABNgIIDAELIAcgASACaiIAQQNyNgIEIAcgAGoiACAAKAIEQQFyNgIECyAHQQhqIgANAQsCQAJAAkACQAJAAkBBACgCoJSdASIAIAJPDQACQEEAKAKklJ0BIgAgAksNAAJAIAJBr4AEaiIHQRB2QAAiAUF/Rw0AQQAPC0EAIQAgAUEQdCIFRQ0HQQBBACgCsJSdASAHQYCAfHEiAEFwaiAAIAVBACAAa0YbIghqIgA2ArCUnQFBACAAQQAoArSUnQEiASAAIAFLGzYCtJSdAQJAAkACQEEAKAKslJ0BIgFFDQBBgJKdASEAA0AgACgCACIHIAAoAgQiBmogBUYNAiAAKAIIIgANAAwDCwsCQAJAQQAoAryUnQEiAEUNACAAIAVNDQELQQAgBTYCvJSdAQtBAEH/HzYCwJSdAUEAIAg2AoSSnQFBACAFNgKAkp0BQQBBkJKdATYCnJKdAUEAQZiSnQE2AqSSnQFBAEGQkp0BNgKYkp0BQQBBoJKdATYCrJKdAUEAQZiSnQE2AqCSnQFBAEGokp0BNgK0kp0BQQBBoJKdATYCqJKdAUEAQbCSnQE2ArySnQFBAEGokp0BNgKwkp0BQQBBuJKdATYCxJKdAUEAQbCSnQE2AriSnQFBAEHAkp0BNgLMkp0BQQBBuJKdATYCwJKdAUEAQciSnQE2AtSSnQFBAEHAkp0BNgLIkp0BQQBBADYCjJKdAUEAQdCSnQE2AtySnQFBAEHIkp0BNgLQkp0BQQBB0JKdATYC2JKdAUEAQdiSnQE2AuSSnQFBAEHYkp0BNgLgkp0BQQBB4JKdATYC7JKdAUEAQeCSnQE2AuiSnQFBAEHokp0BNgL0kp0BQQBB6JKdATYC8JKdAUEAQfCSnQE2AvySnQFBAEHwkp0BNgL4kp0BQQBB+JKdATYChJOdAUEAQfiSnQE2AoCTnQFBAEGAk50BNgKMk50BQQBBgJOdATYCiJOdAUEAQYiTnQE2ApSTnQFBAEGIk50BNgKQk50BQQBBkJOdATYCnJOdAUEAQZiTnQE2AqSTnQFBAEGQk50BNgKYk50BQQBBoJOdATYCrJOdAUEAQZiTnQE2AqCTnQFBAEGok50BNgK0k50BQQBBoJOdATYCqJOdAUEAQbCTnQE2AryTnQFBAEGok50BNgKwk50BQQBBuJOdATYCxJOdAUEAQbCTnQE2AriTnQFBAEHAk50BNgLMk50BQQBBuJOdATYCwJOdAUEAQciTnQE2AtSTnQFBAEHAk50BNgLIk50BQQBB0JOdATYC3JOdAUEAQciTnQE2AtCTnQFBAEHYk50BNgLkk50BQQBB0JOdATYC2JOdAUEAQeCTnQE2AuyTnQFBAEHYk50BNgLgk50BQQBB6JOdATYC9JOdAUEAQeCTnQE2AuiTnQFBAEHwk50BNgL8k50BQQBB6JOdATYC8JOdAUEAQfiTnQE2AoSUnQFBAEHwk50BNgL4k50BQQBBgJSdATYCjJSdAUEAQfiTnQE2AoCUnQFBAEGIlJ0BNgKUlJ0BQQBBgJSdATYCiJSdAUEAIAU2AqyUnQFBAEGIlJ0BNgKQlJ0BQQAgCEFYaiIANgKklJ0BIAUgAEEBcjYCBCAFIABqQSg2AgRBAEGAgIABNgK4lJ0BDAgLIAEgBU8NACAHIAFLDQAgACgCDEUNAwtBAEEAKAK8lJ0BIgAgBSAAIAVJGzYCvJSdASAFIAhqIQdBgJKdASEAAkACQAJAA0AgACgCACIGIAdGDQEgACgCCCIADQAMAgsLIAAoAgxFDQELQYCSnQEhAAJAA0ACQCAAKAIAIgcgAUsNACABIAcgACgCBGoiB0kNAgsgACgCCCEADAALC0EAIAU2AqyUnQFBACAIQVhqIgA2AqSUnQEgBSAAQQFyNgIEIAUgAGpBKDYCBEEAQYCAgAE2AriUnQEgASAHQWBqQXhxQXhqIgAgACABQRBqSRsiBkEbNgIEQQApAoCSnQEhCSAGQRBqQQApAoiSnQE3AgAgBkEIaiIAIAk3AgBBACAINgKEkp0BQQAgBTYCgJKdAUEAIAA2AoiSnQFBAEEANgKMkp0BIAZBHGohAANAIABBBzYCACAAQQRqIgAgB0kNAAsgBiABRg0HIAYgBigCBEF+cTYCBCABIAYgAWsiAEEBcjYCBCAGIAA2AgACQCAAQYACSQ0AIAEgABCJCgwICwJAAkBBACgCmJSdASIHQQEgAEEDdnQiBXENAEEAIAcgBXI2ApiUnQEgAEH4AXFBkJKdAWoiACEHDAELIABB+AFxIgBBkJKdAWohByAAQZiSnQFqKAIAIQALIAcgATYCCCAAIAE2AgwgASAHNgIMIAEgADYCCAwHCyAAIAU2AgAgACAAKAIEIAhqNgIEIAUgAkEDcjYCBCAGQQ9qQXhxQXhqIgEgBSACaiIAayECIAFBACgCrJSdAUYNAyABQQAoAqiUnQFGDQQCQCABKAIEIgdBA3FBAUcNACABIAdBeHEiBxDhCCAHIAJqIQIgASAHaiIBKAIEIQcLIAEgB0F+cTYCBCAAIAJBAXI2AgQgACACaiACNgIAAkAgAkGAAkkNACAAIAIQiQoMBgsCQAJAQQAoApiUnQEiAUEBIAJBA3Z0IgdxDQBBACABIAdyNgKYlJ0BIAJB+AFxQZCSnQFqIgIhAQwBCyACQfgBcSICQZCSnQFqIQEgAkGYkp0BaigCACECCyABIAA2AgggAiAANgIMIAAgATYCDCAAIAI2AggMBQtBACAAIAJrIgE2AqSUnQFBAEEAKAKslJ0BIgAgAmoiBzYCrJSdASAHIAFBAXI2AgQgACACQQNyNgIEIABBCGohAAwGC0EAKAKolJ0BIQECQAJAIAAgAmsiB0EPSw0AQQBBADYCqJSdAUEAQQA2AqCUnQEgASAAQQNyNgIEIAEgAGoiACAAKAIEQQFyNgIEDAELQQAgBzYCoJSdAUEAIAEgAmoiBTYCqJSdASAFIAdBAXI2AgQgASAAaiAHNgIAIAEgAkEDcjYCBAsgAUEIag8LIAAgBiAIajYCBEEAQQAoAqyUnQEiAEEPakF4cSIBQXhqIgc2AqyUnQFBACAAIAFrQQAoAqSUnQEgCGoiAWpBCGoiBTYCpJSdASAHIAVBAXI2AgQgACABakEoNgIEQQBBgICAATYCuJSdAQwDC0EAIAA2AqyUnQFBAEEAKAKklJ0BIAJqIgI2AqSUnQEgACACQQFyNgIEDAELQQAgADYCqJSdAUEAQQAoAqCUnQEgAmoiAjYCoJSdASAAIAJBAXI2AgQgACACaiACNgIACyAFQQhqDwtBACEAQQAoAqSUnQEiASACTQ0AQQAgASACayIBNgKklJ0BQQBBACgCrJSdASIAIAJqIgc2AqyUnQEgByABQQFyNgIEIAAgAkEDcjYCBCAAQQhqDwsgAAvFIAETfyAALQAkIQIgAEEAOgAkIAAtACUhAwJAIAEoAjAiBEUNAAJAAkAgBCgCACIFQXRqQQcgBUELSxtBe2oiBUEfSw0AQQEgBXRBrqKAgHhxDQEgBQ0AIAQtABFFDQELIABBAzoAJAsgACAEEOUBIAQgABBVIAAgAzoAJSAAQQA6ACQgACAEELgBCyAALQAmIQYgAEEAOgAmIAEoAhAhBwJAIAEoAhQiCEUNACAHIAhB2ABsaiEJIAchCgNAAkACQAJAAkACQAJAAkACQAJAQQAgCigCACIFQXxqIgsgCyAFSxsOCQAGBQQDCAgCAQALAkAgBUEDRw0AIAAtACQhDCAAQQM6ACQgAC0AJSELIAAgCigCBCIFEOUBIAUgABBVIAAgCzoAJSAAQQM6ACQgACAFELgBIAAgCzoAJSAAIAw6ACQgBSgCAEEZRw0AIAAgBRDOAQsCQCAKKAJIIgVFDQAgCigCRCINIAVBBnRqIQ4DQAJAAkAgDSgCAEEHRg0AIAAtACQhDyAAQQI6ACQgAC0AJSEQAkAgDUE4aigCACIFRQ0AIAVBDGwhDCANQTRqKAIAIQsDQCALKAIAIQUCQCAALQAkIhENAAJAIAUoAgAiEkF0akEHIBJBC0sbQXtqIhJBH0sNAEEBIBJ0Qa6igIB4cQ0BIBINACAFLQARRQ0BCyAAQQM6ACQLIAtBDGohCyAALQAlIRIgACAFEOUBIAUgABBVIAAgEjoAJSAAIBE6ACQgACAFELgBIAxBdGoiDA0ACwsgDSAAEK4FIAAgEDoAJSAAIA86ACQMAQsCQCANQThqKAIAIgVFDQAgBUEMbCEMIA1BNGooAgAhCwNAIAsoAgAhBQJAIAAtACQiEQ0AAkAgBSgCACISQXRqQQcgEkELSxtBe2oiEkEfSw0AQQEgEnRBrqKAgHhxDQEgEg0AIAUtABFFDQELIABBAzoAJAsgC0EMaiELIAAtACUhEiAAIAUQ5QEgBSAAEFUgACASOgAlIAAgEToAJCAAIAUQuAEgDEF0aiIMDQALCyANLQAcQQJHDQAgAC0AJiEMIABBADoAJgJAAkACQAJAAkACQCANKAIIIgUoAgAOBwUAAQIDBQQFCyAFQQxqKAIAIgtFDQQgC0EobCELIAVBCGooAgAhBQNAAkAgBSgCAEEHRg0AIAUgABCuBQsgBUEoaiEFIAtBWGoiCw0ADAULCyAFKAIEIAAQrgUMAwsgBUEMaigCACILRQ0CIAtBOGwhCyAFQQhqKAIAIQUDQCAAIAUQggcgBUE4aiEFIAtBSGoiCw0ADAMLCyAAIAVBBGoQ8g4MAQsgBSgCBCEFAkAgAC0AJCILDQACQCAFKAIAIhFBdGpBByARQQtLG0F7aiIRQR9LDQBBASARdEGuooCAeHENASARDQAgBS0AEUUNAQsgAEEDOgAkCyAALQAlIREgACAFEOUBIAUgABBVIAAgEToAJSAAIAs6ACQgACAFELgBCyAALQAlIQsgDSgCDCEFAkAgAC0AJCIRDQACQCAFKAIAIhJBdGpBByASQQtLG0F7aiISQR9LDQBBASASdEGuooCAeHENASASDQAgBS0AEUUNAQsgAEEDOgAkCyAAIAUQ5QEgBSAAEFUgACALOgAlIAAgEToAJCAAIAUQuAEgACAMOgAmIA0oAgwiBSgCAEEZRw0AIAAgBRDOAQsgDUHAAGoiDSAORw0ACwsgCigCIEGAgICAeEYNByAALQAmIRIgAEEAOgAmIAooAigiBUUNBiAFQTBsIQsgCigCJCEFIAAtACUhDCAALQAkIREDQCAAQQM6ACQgBSAAEH4gACAMOgAlIAAgEToAJCAFQTBqIQUgC0FQaiILDQAMBwsLAkAgCigCCCIFQQVGDQAgBUEDRw0AIAAtACQhDCAAQQM6ACQgAC0AJSELIAAgCigCDCIFEOUBIAUgABBVIAAgCzoAJSAAQQM6ACQgACAFELgBIAAgCzoAJSAAIAw6ACQgBSgCAEEZRw0AIAAgBRDOAQsCQCAKKAI8IgVFDQACQCAALQAkIgsNAAJAIAUoAgAiDEF0akEHIAxBC0sbQXtqIgxBH0sNAEEBIAx0Qa6igIB4cQ0BIAwNACAFLQARRQ0BCyAAQQM6ACQLIAAtACUhDCAAIAUQ5QEgBSAAEFUgACAMOgAlIAAgCzoAJCAAIAUQuAELIAooAjgiBUUNBiAFQQxsIQwgCigCNCELA0AgCygCACEFAkAgAC0AJCIRDQACQCAFKAIAIhJBdGpBByASQQtLG0F7aiISQR9LDQBBASASdEGuooCAeHENASASDQAgBS0AEUUNAQsgAEEDOgAkCyALQQxqIQsgAC0AJSESIAAgBRDlASAFIAAQVSAAIBI6ACUgACAROgAkIAAgBRC4ASAMQXRqIgwNAAwHCwsgAC0AJiESIABBADoAJiAKKAIMIgVFDQQgBUEwbCELIAooAgghBSAALQAlIQwgAC0AJCERA0AgAEEDOgAkIAUgABB+IAAgDDoAJSAAIBE6ACQgBUEwaiEFIAtBUGoiCw0ADAULCwJAIAooAiQiBUUNAAJAIAAtACQiCw0AAkAgBSgCACIMQXRqQQcgDEELSxtBe2oiDEEfSw0AQQEgDHRBrqKAgHhxDQEgDA0AIAUtABFFDQELIABBAzoAJAsgAC0AJSEMIAAgBRDlASAFIAAQVSAAIAw6ACUgACALOgAkIAAgBRC4AQsgCigCNCIFRQ0EIAVBDGwhDCAKKAIwIQsDQCALKAIAIQUCQCAALQAkIhENAAJAIAUoAgAiEkF0akEHIBJBC0sbQXtqIhJBH0sNAEEBIBJ0Qa6igIB4cQ0BIBINACAFLQARRQ0BCyAAQQM6ACQLIAtBDGohCyAALQAlIRIgACAFEOUBIAUgABBVIAAgEjoAJSAAIBE6ACQgACAFELgBIAxBdGoiDA0ADAULCwJAIAooAghBA0cNACAALQAkIQwgAEEDOgAkIAAtACUhCyAAIAooAgwiBRDlASAFIAAQVSAAIAs6ACUgAEEDOgAkIAAgBRC4ASAAIAs6ACUgACAMOgAkIAUoAgBBGUcNACAAIAUQzgELAkAgCigCPCIFRQ0AAkAgAC0AJCILDQACQCAFKAIAIgxBdGpBByAMQQtLG0F7aiIMQR9LDQBBASAMdEGuooCAeHENASAMDQAgBS0AEUUNAQsgAEEDOgAkCyAALQAlIQwgACAFEOUBIAUgABBVIAAgDDoAJSAAIAs6ACQgACAFELgBCyAKKAI4IgVFDQMgBUEMbCEMIAooAjQhCwNAIAsoAgAhBQJAIAAtACQiEQ0AAkAgBSgCACISQXRqQQcgEkELSxtBe2oiEkEfSw0AQQEgEnRBrqKAgHhxDQEgEg0AIAUtABFFDQELIABBAzoAJAsgC0EMaiELIAAtACUhEiAAIAUQ5QEgBSAAEFUgACASOgAlIAAgEToAJCAAIAUQuAEgDEF0aiIMDQAMBAsLIAAtACYhEyAAQQA6ACYCQCAKKAIgIhQoAggiBUUNACAUKAIEIg0gBUEGdGohDiAALQAlIQ8gAC0AJCEQA0AgAEECOgAkAkAgDUE4aigCACIFRQ0AIAVBDGwhDCANQTRqKAIAIQsDQCALKAIAIQUCQCAALQAkIhENAAJAIAUoAgAiEkF0akEHIBJBC0sbQXtqIhJBH0sNAEEBIBJ0Qa6igIB4cQ0BIBINACAFLQARRQ0BCyAAQQM6ACQLIAtBDGohCyAALQAlIRIgACAFEOUBIAUgABBVIAAgEjoAJSAAIBE6ACQgACAFELgBIAxBdGoiDA0ACwsgDSAAEK4FIAAgDzoAJSAAIBA6ACQgDUHAAGoiBSENIAUgDkcNAAsLIAAgEzoAJgJAIBRBFGooAgAiBUUNACAFQQxsIQwgFEEQaigCACELA0AgCygCACEFAkAgAC0AJCIRDQACQCAFKAIAIhJBdGpBByASQQtLG0F7aiISQR9LDQBBASASdEGuooCAeHENASASDQAgBS0AEUUNAQsgAEEDOgAkCyALQQxqIQsgAC0AJSESIAAgBRDlASAFIAAQVSAAIBI6ACUgACAROgAkIAAgBRC4ASAMQXRqIgwNAAsLIBQoAhhBgICAgHhGDQIgAC0AJiESIABBADoAJiAUQSBqKAIAIgVFDQEgBUEwbCELIBRBHGooAgAhBSAALQAlIQwgAC0AJCERA0AgAEEDOgAkIAUgABB+IAAgDDoAJSAAIBE6ACQgBUEwaiEFIAtBUGoiCw0ADAILCwJAIAooAghBA0cNACAALQAkIQwgAEEDOgAkIAAtACUhCyAAIAooAgwiBRDlASAFIAAQVSAAIAs6ACUgAEEDOgAkIAAgBRC4ASAAIAs6ACUgACAMOgAkIAUoAgBBGUcNACAAIAUQzgELIAAtACYhEyAAQQA6ACYCQCAKKAIwIhQoAggiBUUNACAUKAIEIg0gBUEGdGohDiAALQAlIQ8gAC0AJCEQA0AgAEECOgAkAkAgDUE4aigCACIFRQ0AIAVBDGwhDCANQTRqKAIAIQsDQCALKAIAIQUCQCAALQAkIhENAAJAIAUoAgAiEkF0akEHIBJBC0sbQXtqIhJBH0sNAEEBIBJ0Qa6igIB4cQ0BIBINACAFLQARRQ0BCyAAQQM6ACQLIAtBDGohCyAALQAlIRIgACAFEOUBIAUgABBVIAAgEjoAJSAAIBE6ACQgACAFELgBIAxBdGoiDA0ACwsgDSAAEK4FIAAgDzoAJSAAIBA6ACQgDUHAAGoiBSENIAUgDkcNAAsLIAAgEzoAJgJAIBRBFGooAgAiBUUNACAFQQxsIQwgFEEQaigCACELA0AgCygCACEFAkAgAC0AJCIRDQACQCAFKAIAIhJBdGpBByASQQtLG0F7aiISQR9LDQBBASASdEGuooCAeHENASASDQAgBS0AEUUNAQsgAEEDOgAkCyALQQxqIQsgAC0AJSESIAAgBRDlASAFIAAQVSAAIBI6ACUgACAROgAkIAAgBRC4ASAMQXRqIgwNAAsLIBQoAhhBgICAgHhGDQEgAC0AJiESIABBADoAJiAUQSBqKAIAIgVFDQAgBUEwbCELIBRBHGooAgAhBSAALQAlIQwgAC0AJCERA0AgAEEDOgAkIAUgABB+IAAgDDoAJSAAIBE6ACQgBUEwaiEFIAtBUGoiCw0ACwsgACASOgAmCyAKQdgAaiIKIAlHDQALCyAAIAY6ACYCQCAERQ0AIAQoAgAiBUF0akEHIAVBC0sbIgVBFksNAEEBIAV0QdDJwAJxRQ0AIAAgBBDOAQsgACADOgAlIAAgAjoAJAJAIAhFDQBBACEFIAchAAJAA0AgACgCAEEKRg0BIABB2ABqIQAgCCAFQQFqIgVHDQAMAgsLIAAQ7QUCQCAFQQFqIAhPDQAgBUF/cyAIaiELIABB2ABqIQADQAJAAkAgACgCAEEKRw0AIAAQ7QUMAQsgByAFQdgAbGogAEHYAPwKAAAgBUEBaiEFCyAAQdgAaiEAIAtBf2oiCw0ACwsgASAFNgIUCwutHgIZfwR+IwBBsAprIgMkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASkDACIcQgBRDQAgASkDCCIdQgBRDQEgASkDECIeQgBRDQIgHiAcfCIfIB5UDQMgHCAdVA0EIAEsABohBCABLgEYIQEgAyAcNwMIIANBAUECIBxCgICAgBBUGzYCqAEgA0EIakEIakEAQZgB/AsAIAMgHTcDsAEgA0EBQQIgHUKAgICAEFQbNgLQAiADQbABakEIakEAQZgB/AsAIAMgHjcD2AIgA0EBQQIgHkKAgICAEFQbNgL4AyADQdgCakEIakEAQZgB/AsAIANBgARqQQBBnAH8CwAgA0EBNgL8AyADQQE2ApwFIAGsIB9Cf3x5fULCmsHoBH5CgKHNoLQCfEIgiKciBcEhBgJAAkAgAUEASA0AIANBCGogARDQBxogA0GwAWogARDQBxogA0HYAmogARDQBxoMAQsgA0H8A2pBACABa8EQ0AcaCwJAAkAgBkF/Sg0AIANBCGpBACAGa0H//wNxIgEQwgUaIANBsAFqIAEQwgUaIANB2AJqIAEQwgUaDAELIANB/ANqIAVB//8BcRDCBRoLIANBjAlqIANBCGpBpAH8CgAAAkACQAJAIAMoAvgDIgcgAygCrAoiASAHIAFLGyIIQShLDQAgCA0BQQAhCAwCC0EAIAhBKEGUhIIBEJAKAAtBACEJIANB2AJqIQUgA0GMCWohASAIIQoDQCABIAUoAgAiCyABKAIAaiIMIAlBAXFqIgk2AgAgDCALSSAJIAxJciEJIAFBBGohASAFQQRqIQUgCkF/aiIKDQALIAlFDQAgCEEoRg0GIANBjAlqIAhBAnRqQQE2AgAgCEEBaiEICyADIAg2AqwKIAggAygCnAUiDSAIIA1LGyIBQSlPDQYgAUECdCEBIANBjAlqQXxqIQwCQANAAkAgAQ0AQQAhAQwCCyAMIAFqIQUgAUF8aiIBIANB/ANqaigCACIJIAUoAgAiBUYNAAsgCSAFSyAJIAVJayEBCwJAAkAgASAESA0AIAMoAqgBIglBKU8NCQJAAkAgCQ0AQQAhCQwBCyADQQhqIAlBAnQiBWohDEIAIRwgA0EIaiEBA0AgASABNQIAQgp+IBx8Ihw+AgAgAUEEaiEBIBxCIIghHCAFQXxqIgUNAAsgHFANACAJQShGDQsgDCAcpzYCACAJQQFqIQkLIAMgCTYCqAEgAygC0AIiDEEpTw0LQQAhDkEAIQECQCAMRQ0AIANBsAFqIAxBAnQiBWohCkIAIRwgA0GwAWohAQNAIAEgATUCAEIKfiAcfCIcPgIAIAFBBGohASAcQiCIIRwgBUF8aiIFDQALAkAgHFBFDQAgDCEBDAELIAxBKEYNDSAKIBynNgIAIAxBAWohAQsgAyABNgLQAgJAIAdFDQAgA0HYAmogB0ECdCIFaiEMQgAhHCADQdgCaiEBA0AgASABNQIAQgp+IBx8Ihw+AgAgAUEEaiEBIBxCIIghHCAFQXxqIgUNAAsCQCAcUEUNACADIAciDjYC+AMMAwsgB0EoRg0OIAwgHKc2AgAgB0EBaiEOCyADIA42AvgDDAELIAZBAWohBiADKAKoASEJIAchDgsgA0GgBWogA0H8A2pBpAH8CgAAIANBoAVqQQEQ0AchASADQcQGaiADQfwDakGkAfwKAAAgA0HEBmpBAhDQByEFIANB6AdqIANB/ANqQaQB/AoAAAJAAkACQCADQegHakEDENAHKAKgASIPIAkgDyAJSxsiEEEoSw0AIANB/ANqQXxqIREgA0GMCWpBfGohEiADQbABakF8aiETIANBoAVqQXxqIRQgA0HEBmpBfGohByADQegHakF8aiEIIAEoAqABIRUgBSgCoAEhFkEAIRcDQCAXIRggEEECdCEBAkACQANAIAFFDQEgCCABaiEFIAFBfGoiASADQQhqaigCACIMIAUoAgAiBUYNAAtBACEZIAwgBUkNAQsCQCAQRQ0AQQEhCSADQegHaiEFIANBCGohASAQIQoDQCABIAEoAgAiCyAFKAIAQX9zaiIMIAlBAXFqIgk2AgAgDCALSSAJIAxJciEJIAFBBGohASAFQQRqIQUgCkF/aiIKDQALIAlFDRILIAMgEDYCqAFBCCEZIBAhCQsgFiAJIBYgCUsbIhBBKU8NESAQQQJ0IQECQAJAA0AgAUUNASAHIAFqIQUgAUF8aiIBIANBCGpqKAIAIgwgBSgCACIFRg0ACyAMIAVPDQAgCSEQDAELAkAgEEUNAEEBIQkgA0HEBmohBSADQQhqIQEgECEKA0AgASABKAIAIgsgBSgCAEF/c2oiDCAJQQFxaiIJNgIAIAwgC0kgCSAMSXIhCSABQQRqIQEgBUEEaiEFIApBf2oiCg0ACyAJRQ0UCyADIBA2AqgBIBlBBHIhGQsgFSAQIBUgEEsbIhpBKU8NEyAaQQJ0IQECQAJAA0AgAUUNASAUIAFqIQUgAUF8aiIBIANBCGpqKAIAIgwgBSgCACIFRg0ACyAMIAVPDQAgECEaDAELAkAgGkUNAEEBIQkgA0GgBWohBSADQQhqIQEgGiEKA0AgASABKAIAIgsgBSgCAEF/c2oiDCAJQQFxaiIJNgIAIAwgC0kgCSAMSXIhCSABQQRqIQEgBUEEaiEFIApBf2oiCg0ACyAJRQ0WCyADIBo2AqgBIBlBAmohGQsgDSAaIA0gGksbIhBBKU8NFSAQQQJ0IQECQAJAA0AgAUUNASABQXxqIgEgA0EIamooAgAiBSABIANB/ANqaigCACIMRg0ACyAFIAxPDQAgGiEQDAELAkAgEEUNAEEBIQkgA0H8A2ohBSADQQhqIQEgECEKA0AgASABKAIAIgsgBSgCAEF/c2oiDCAJQQFxaiIJNgIAIAwgC0kgCSAMSXIhCSABQQRqIQEgBUEEaiEFIApBf2oiCg0ACyAJRQ0YCyADIBA2AqgBIBlBAWohGQsgGEERRg0aIAIgGGogGUEwajoAACADKALQAiIaIBAgGiAQSxsiAUEpTw0XIBhBAWohFyABQQJ0IQECQANAAkAgAQ0AQQAhGwwCCyATIAFqIQUgAUF8aiIBIANBCGpqKAIAIgwgBSgCACIFRg0ACyAMIAVLIAwgBUlrIRsLIANBjAlqIANBCGpBpAH8CgAAAkACQAJAIA4gAygCrAoiASAOIAFLGyIZQShLDQAgGQ0BQQAhGQwCC0EAIBlBKEGUhIIBEJAKAAtBACEJIANB2AJqIQUgA0GMCWohASAZIQoDQCABIAUoAgAiCyABKAIAaiIMIAlBAXFqIgk2AgAgDCALSSAJIAxJciEJIAFBBGohASAFQQRqIQUgCkF/aiIKDQALIAlFDQAgGUEoRg0ZIANBjAlqIBlBAnRqQQE2AgAgGUEBaiEZCyADIBk2AqwKIBkgDSAZIA1LGyIBQSlPDRkgAUECdCEBAkADQAJAIAENAEEAIQEMAgsgEiABaiEFIBEgAWohDCABQXxqIQEgDCgCACIMIAUoAgAiBUYNAAsgDCAFSyAMIAVJayEBCyAbIARIDQIgASAESA0DQQAhDEEAIQkCQCAQRQ0AIANBCGogEEECdCIFaiEJQgAhHCADQQhqIQEDQCABIAE1AgBCCn4gHHwiHD4CACABQQRqIQEgHEIgiCEcIAVBfGoiBQ0ACwJAIBxQRQ0AIBAhCQwBCyAQQShGDRwgCSAcpzYCACAQQQFqIQkLIAMgCTYCqAECQCAaRQ0AIANBsAFqIBpBAnQiBWohDEIAIRwgA0GwAWohAQNAIAEgATUCAEIKfiAcfCIcPgIAIAFBBGohASAcQiCIIRwgBUF8aiIFDQALAkAgHFBFDQAgGiEMDAELIBpBKEYNHSAMIBynNgIAIBpBAWohDAsgAyAMNgLQAgJAAkAgDg0AQQAhDgwBCyADQdgCaiAOQQJ0IgVqIQxCACEcIANB2AJqIQEDQCABIAE1AgBCCn4gHHwiHD4CACABQQRqIQEgHEIgiCEcIAVBfGoiBQ0ACyAcUA0AIA5BKEYNHiAMIBynNgIAIA5BAWohDgsgAyAONgL4AyAPIAkgDyAJSxsiEEEpSQ0ACwtBACAQQShBlISCARCQCgALIAEgBE4NHCADQQhqQQEQ0AcaIA0gAygCqAEiASANIAFLGyIBQSlPDRsgAUECdCEBIANBCGpBfGohCSADQfwDakF8aiEKA0AgAUUNASAKIAFqIQUgCSABaiEMIAFBfGohASAMKAIAIgwgBSgCACIFRg0ACyAMIAVJDRwLIAIgF2ohCSAXIQECQANAIAEiBUUNASAFQX9qIgEgAmoiDC0AAEE5Rg0ACyAMIAwtAABBAWo6AAAgFyAFayIBRQ0cIAIgBWpBMCAB/AsADBwLIAJBMToAAAJAIBhFDQAgAkEBakEwIBj8CwALAkAgGEEPSw0AIAlBMDoAACAGQQFqIQYgGEECaiEXDB0LIBdBEUGIh4MBEP4WAAtBwIKDAUEcQciGgwEQuSEAC0Gsg4MBQR1B2IaDARC5IQALQdyDgwFBHEHohoMBELkhAAtBsIWDAUE2QbiHgwEQuSEAC0HohIMBQTdBqIeDARC5IQALQShBKEGUhIIBEP4WAAtBACABQShBlISCARCQCgALQQAgCUEoQZSEggEQkAoAC0EoQShBlISCARD+FgALQQAgDEEoQZSEggEQkAoAC0EoQShBlISCARD+FgALQShBKEGUhIIBEP4WAAtB94OCAUEaQZSEggEQuSEAC0EAIBBBKEGUhIIBEJAKAAtB94OCAUEaQZSEggEQuSEAC0EAIBpBKEGUhIIBEJAKAAtB94OCAUEaQZSEggEQuSEAC0EAIBBBKEGUhIIBEJAKAAtB94OCAUEaQZSEggEQuSEAC0EAIAFBKEGUhIIBEJAKAAtBKEEoQZSEggEQ/hYAC0EAIAFBKEGUhIIBEJAKAAtBEUERQfiGgwEQ/hYAC0EoQShBlISCARD+FgALQShBKEGUhIIBEP4WAAtBKEEoQZSEggEQ/hYAC0EAIAFBKEGUhIIBEJAKAAsgGEEQTQ0AQQAgF0ERQZiHgwEQkAoACyAAIAY7AQggACAXNgIEIAAgAjYCACADQbAKaiQAC50gAgx/A34jAEHAAGsiBSQAIAEoAgAhBgJAAkACQAJAAkAgAg4DAQACAQsgBigCgAVBsAJqIQcMAgsgBigCgAVBtAJqIQcMAQsCQCAGLQBZQQFxRQ0AAkAgAyAGKAKABSIHKALcAk8NACAHKALYAiADQQJ0aiEHDAILIAZBhAVqKAIAEKEYIQcgAEEFNgIAIAAgBzYCBAwCCyAAIAOtQiCGQgKENwIADAELIAcoAgAhCCABKAIEIgcpAqQBIREgB0KAgICAEDcCpAEgBygCrAEhCSAHQQA2AqwBIAUgETcDMCAFIAk2AjggBUEwakG06oQBQb3qhAEQ5xQgBSAFKAI4NgIoIAUgBSkDMDcDICAGKAKABSIKKAK4AiEJIAotAOACIQsgCi0A5AIhCgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBEH/AXEOBgABAgMEBQALIAlBwP8PcUUNOCAFKAIkIgkgBSgCKCIKEJYcIQsgCkUNBSAKQX9qIgxFDQYgCSALOgABIAxBAUYNByAJIAtBgIAFciINQQh2OgACIApBA0wNCCAJIA1BEHY6AAMgDEEDRg0JIAkgC0EYdjoABAw4CyAJQcD/D3FFDTcgBSgCKEUNCSAFKAIkIgkgCS0AAEEEcjoAAAw3CwJAIAlBA3FFDQAgBSgCJCILIAUoAigiDBCWHCEKIAxFDQogDEF/aiINRQ0LIAsgCkEBcjoAASANQQFGDQwgCyAKQQh2OgACIAxBA0wNDSALIApBEHY6AAMgDUEDRg0OIAsgCkEYdjoABAsCQCAJQTxxRQ0AIAUoAiQiCiAFKAIoIgwQlhwhCyAMRQ0PIAxBf2oiDUUNECAKIAtBFHI6AAEgDUEBRg0RIAogC0EIdjoAAiAMQQNMDRIgCiALQRB2OgADIA1BA0YNEyAKIAtBGHY6AAQLIAlBwP8PcUUNNiAFKAIkIgkgBSgCKCIKEJYcIQsgCkUNEyAKQX9qIgxFDRQgCSALOgABIAxBAUYNFSAJIAtBgIAFciINQQh2OgACIApBA0wNFiAJIA1BEHY6AAMgDEEDRg0XIAkgC0EYdjoABAw2CwJAIApBAXENACAJQTxxRQ01IAUoAiQiCiAFKAIoIg0QlhwhDCANRQ0YIA1Bf2oiDkUNGSAKIAxBEHI6AAEgDkEBRg0aIAogDEEIdjoAAiANQQNMDRsgCiAMQRB2OgADIA5BA0YNHAw0CwJAIAlBMHFFDQAgBSgCKEUNHSAFKAIkIgogCi0AAEEIcjoAAAsgCUE8cUUNNCAFKAIkIgogBSgCKCINEJYcIQwgDUUNHSANQX9qIg5FDR4gCiAMQQRyOgABIA5BAUYNHyAKIAxBCHY6AAIgDUEDTA0gIAogDEEQdjoAAyAOQQNHDTNBA0EDQZCFhQEQ/hYACyAJQTBxRQ0xAkAgCkEBcQ0AIAUoAihFDSEgBSgCJCIKIAotAABBCHI6AAAMMgsgBSgCJCIMIAUoAigiDRCWHCEKIA1FDSEgDUF/aiIORQ0iIAwgCkEQcjoAASAOQQFGDSMgDCAKQQh2OgACIA1BA0wNJCAMIApBEHY6AAMgDkEDRg0lIAwgCkEYdjoABAwxCwJAIAlBPHFFDQAgBSgCJCIMIAUoAigiDRCWHCEKIA1FDSYgDUF/aiIORQ0nIAwgCkEEcjoAASAOQQFGDSggDCAKQQh2OgACIA1BA0wNKSAMIApBEHY6AAMgDkEDRg0qIAwgCkEYdjoABAsgCUHA/w9xRQ0zAkAgCy0AkJGFAQ0AIAUoAiQiCSAFKAIoIgoQlhwhCyAKRQ0rIApBf2oiDEUNLCAJIAs6AAEgDEEBRg0tIAkgC0GAgAVyIg1BCHY6AAIgCkEDTA0uIAkgDUEQdjoAAyAMQQNGDS8gCSALQRh2OgAEDDQLIAUoAihFDS8gBSgCJCIJIAktAABBBHI6AAAMMwtBAUEAQQBB/NWEARCQCgALQQBBAEHghIUBEP4WAAtBAUEBQfCEhQEQ/hYAC0ECQQJBgIWFARD+FgALQQNBA0GQhYUBEP4WAAtBAEEAQfCChQEQ/hYAC0EBQQBBAEH81YQBEJAKAAtBAEEAQeCEhQEQ/hYAC0EBQQFB8ISFARD+FgALQQJBAkGAhYUBEP4WAAtBA0EDQZCFhQEQ/hYAC0EBQQBBAEH81YQBEJAKAAtBAEEAQeCEhQEQ/hYAC0EBQQFB8ISFARD+FgALQQJBAkGAhYUBEP4WAAtBA0EDQZCFhQEQ/hYAC0EBQQBBAEH81YQBEJAKAAtBAEEAQeCEhQEQ/hYAC0EBQQFB8ISFARD+FgALQQJBAkGAhYUBEP4WAAtBA0EDQZCFhQEQ/hYAC0EBQQBBAEH81YQBEJAKAAtBAEEAQeCEhQEQ/hYAC0EBQQFB8ISFARD+FgALQQJBAkGAhYUBEP4WAAtBA0EDQZCFhQEQ/hYAC0EAQQBBgIOFARD+FgALQQFBAEEAQfzVhAEQkAoAC0EAQQBB4ISFARD+FgALQQFBAUHwhIUBEP4WAAtBAkECQYCFhQEQ/hYAC0EAQQBBgIOFARD+FgALQQFBAEEAQfzVhAEQkAoAC0EAQQBB4ISFARD+FgALQQFBAUHwhIUBEP4WAAtBAkECQYCFhQEQ/hYAC0EDQQNBkIWFARD+FgALQQFBAEEAQfzVhAEQkAoAC0EAQQBB4ISFARD+FgALQQFBAUHwhIUBEP4WAAtBAkECQYCFhQEQ/hYAC0EDQQNBkIWFARD+FgALQQFBAEEAQfzVhAEQkAoAC0EAQQBB4ISFARD+FgALQQFBAUHwhIUBEP4WAAtBAkECQYCFhQEQ/hYAC0EDQQNBkIWFARD+FgALQQBBAEHwgoUBEP4WAAsCQCALQQ1HDQAgCUE8cUUNACAFKAIkIgogBSgCKCIMEJYcIQsCQAJAAkACQAJAIAxFDQAgDEF/aiINRQ0BIAogC0EEcjoAASANQQFGDQIgCiALQQh2OgACIAxBA0wNAyAKIAtBEHY6AAMgDUEDRg0EIAogC0EYdjoABAwFC0EBQQBBAEH81YQBEJAKAAtBAEEAQeCEhQEQ/hYAC0EBQQFB8ISFARD+FgALQQJBAkGAhYUBEP4WAAtBA0EDQZCFhQEQ/hYACyAJQcD/D3FFDQIgBSgCJCIJIAUoAigiChCWHCELAkACQAJAAkACQCAKRQ0AIApBf2oiDEUNASAJIAs6AAEgDEEBRg0CIAkgC0GAgAVyIg1BCHY6AAIgCkEDTA0DIAkgDUEQdjoAAyAMQQNGDQQgCSALQRh2OgAEDAcLQQFBAEEAQfzVhAEQkAoAC0EAQQBB4ISFARD+FgALQQFBAUHwhIUBEP4WAAtBAkECQYCFhQEQ/hYAC0EDQQNBkIWFARD+FgALIAogDEEYdjoABCALQQpHDQAgCiAKIA0QlhwiC0EYdjoABCAKIAtBEHY6AAMgCiALQQh2OgACIAogC0EEcjoAAQsgCUHA/w9xRQ0AIAUoAiQiCSAFKAIoIgoQlhwhCyAKRQ0FIApBf2oiDEUNBCAJIAs6AAEgDEEBRg0DIAkgC0GAgAVyIg1BCHY6AAIgCkEDTA0CIAkgDUEQdjoAAyAMQQNGDQEgCSALQRh2OgAECyAHQQA2AkggBSgCJCAFKAIoEJccIQkgBigCgAUgCCAJIAdBmAFqIAdBMGoiChCZBCAFQTBqIAVBIGoQ9g4gBigCgAUgCiAFQTBqEMAHIAYtAFwhDyAFKAI4IQkgBSgCNCEIIAUoAjAhDgJAIAcoAgxFDQAgBykDECAHQRhqKQMAIAggCRDZByERIAcoAgQiDSARp3EhCiARQhmIQv8Ag0KBgoSIkKDAgAF+IRIgBygCACELQQAhEAJAA0ACQCALIApqKQAAIhMgEoUiEUJ/hSARQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIhFQDQADQAJAIAkgC0EAIBF6p0EDdiAKaiANcWtBDGxqIgxBeGooAgBHDQAgCCAMQXRqKAIAQQhqIAkQuhhFDQQLIBFCf3wgEYMiEVBFDQALCyATIBNCAYaDQoCBgoSIkKDAgH+DUEUNAiAKIBBBCGoiEGogDXEhCgwACwsgDEF8aigCACEJIAdBADYCrAEgBygCqAEhASAHIAg2AqgBIAcoAqQBIQogByAONgKkASAKIAEQyCMMCAsgBUEYaiAJELURIAUoAhgiDEEIaiEKIAUoAhwhDQJAIAlFDQAgCiAIIAn8CgAACwJAAkACQCANIAcQkRdqQQQgBkGEBWooAgB0akEUaiAGKAKIBU0NACABEOcODQELIAVBEGogARDXEiAFKAIQQQFHDQELIAwgDCgCACIJQX9qNgIAQQEhAQJAIAlBAUYNAAwICyAMIA0QuRsMBwsCQCANRQ0AIAUoAhQhASAKLQAAIQkgB0H0AGpBASAGQYQFaigCAHQQqBQgASAPQQFxQRx0ciAJQQFxQRt0ciEJIAYpAOAEIAZB6ARqKQAAhCAGQfAEaikAACAGQfgEaikAAISEUA0GIAYgCRCwHQ0GIAZB4ARqIQ9BACEKIAZBhAVqKAIAEO0YIRBBACEBA0AgAUGAAkYNByAFIA8gAUEDdkHw////AXFqIgspAwAgCykDCCABQf8AcRDEFgJAIAUoAgBBAXFFDQAgAUH/AUsNCCAGIAcgCSAKIBAQ+gsLIAFBAWohASAKQYACaiEKDAALC0EAQQBB5P+EARD+FgwKC0EDQQNBkIWFARD+FgALQQJBAkGAhYUBEP4WAAtBAUEBQfCEhQEQ/hYAC0EAQQBB4ISFARD+FgALQQFBAEEAQfzVhAEQkAoACyAHIAcoAmggDWo2AmggDCAMKAIAIgFBAWo2AgAgAUF/TA0EAkAgBygClAEiASAHKAKMAUcNACAHQYwBahCZGgsgBygCkAEgAUEDdGoiCiANNgIEIAogDDYCACAHIAFBAWo2ApQBIAcgDCANIAkQ8gZBACEBCyAHQQA2AqwBIAcoAqgBIQogByAINgKoASAHKAKkASEIIAcgDjYCpAEgCCAKEMgjIAENAQsCQCAJQf///z9xIgEgBygCfE8NACABQX8gBigChAV0QX9zcUUNAgtBuPaEAUEsQeT2hAEQuSEACyAAQgM3AgAMBAsgBEH/AXEhAQJAAkAgAg4DBAABBAsgAUEGaiEBDAMLIAYtAFlBAXFFDQEgA0EGbCABakEMaiEBDAILAAtB9PaEAUGnAUHI94QBEOsbAAsCQCABIAcoAogBIgZJDQAgASAGQdj3hAEQ/hYACyAAIAk2AgQgAEEFNgIAIAcoAoQBIAFBAnRqIAk2AgALIAVBwABqJAAL3CACHH8BfiMAQaABayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCAA4TAAMBAgUGBwgJCgsMDQ4PEBESEwALIAEoAgghAyABKAIYIQQgASgCFCEFIAEoAhAhBiACQeAAaiABKAIMIgdBCEEwEIUPIAIoAmQhCCACKAJgQQFGDRkgAigCaCEJAkAgCEUNACAHQTBsIQogCSEBIAghCwNAIApFDQEgAkHgAGogAxCOASABIAIpA4gBNwMoIAEgAikDgAE3AyAgASACKQN4NwMYIAEgAikDcDcDECABIAIpA2g3AwggASACKQNgNwMAIAFBMGohASAKQVBqIQogA0EwaiEDIAtBf2oiCw0ACwsgACAENgIYIAAgBTYCFCAAIAY2AhAgACAHNgIMIAAgCTYCCCAAIAg2AgQgAEEANgIADDcLIAAgASkDKDcDKCAAIAEpAyA3AyAgACABKQMYNwMYIAAgASkDEDcDECAAIAEpAwg3AwggACABKQMANwMADDYLIAEoAhAhCyABKAIMIQhBwAAQigEiA0UNGCADIAEoAgQQTkEwEIoBIgoNAUEIQTAQoiQACyAAIAEpAyg3AyggACABKQMgNwMgIAAgASkDGDcDGCAAIAEpAxA3AxAgACABKQMINwMIIAAgASkDADcDAAw0CyAKIAEoAggQjgEgACALNgIQIAAgCDYCDCAAIAo2AgggACADNgIEIABBAzYCAAwzCyABKAIIIQMgASgCBCEKIAEoAgwiCw0OQQAhAQwPCyABKAIgIQogASgCHCELIAEoAhghCCABKAIMIQcgASgCCCEJAkAgASkDECIeQgODQgBSDQAgHqciAyADKAIAIgNBAWo2AgAgA0F/TA0WCyABLQAkIQRBMBCKASIDRQ0WIAMgASgCKBCOASAAIAM2Aigg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BEEEEN0TIAIgAikDUDcDmAEgAiALNgKgASACIAtFOgCkASACQZgBahDiBSAKIAIpA6ABNwIIIAogAikDmAE3AgAgAkEANgLgASAAIAJB4AFqEN0KDAkLIAIoAuABIAIoAuQBQQRBBBDdEwsgAigCBCEKIAIoAgghAUEAIQMgAkEANgLoASACQoCAgIAQNwLgASABRQ0CIAogAUEcbGohCUEBIQsgCiEBA0ACQCABKAIAQQFGDQAgAigC4AEhBAwGCyACKALgASEEIAFBCGooAgBBAUcNBSABQQRqKAIALQAAIQcCQCADIARHDQAgAkHgAWoQ2RMgAigC5AEhCwsgCyADaiAHOgAAIAIgA0EBaiIDNgLoASABQRxqIgEgCUcNAAsgAigC4AEiDEGAgICAeEYNBSACKQLkASENDAMLQYjYiQEQxCMACyADIAIoAqABEP4gAAsgAikC5AEhDUEAIQwLIAJBmAFqIA1CIIgiDqciC0EBQQIQrxEgAigCnAEhBAJAIAIoApgBQQFGDQAgAkHkAWohCCANpyEHQQAhAyACQQA2AlggAiACKAKgASIBNgJUIAIgBDYCUAJAIA5QDQBBACEDA0AgAUEBaiAHIANqLQAAIgQ6AAAgASAEOgAAIAFBAmohASALIANBAWoiA0cNAAsLIAwgB0EBQQEQ3RMgAiACKQNQNwOYASACIAM2AqABIAIgA0U6AKQBIAJBmAFqENQFIAggAikDoAE3AgggCCACKQOYATcCACACQQE2AuABIAAgAkHgAWoQ3QoMBAsgBCACKAKgARD+IAALIAQgC0EBQQEQ3RMLIAJBADYC6AEgAkKAgICAwAA3AuABIAJB0ABqIAJB4AFqENkYIAJB4AFqQQRyIQwgAkGYAWpBBGohBSAKIQsCQAJAA0AgCygCAEECRw0CAkACQCALKAIEQQFHDQAgC0EQaigCACIDQQF0IQggC0EMaigCACEBAkAgA0UNACABIAhqIgRBfmpFDQAgBEF/aiwAAEEASA0FCyACQeABaiADQf////8HcSIHQQRBCBCvESACKALkASEGIAIoAuABQQFGDQNBACEEIAJBADYCkAEgAiACKALoASIDNgKMASACIAY2AogBAkAgCEUNAEEAIQQDQCADIAEtAAA2AgAgA0EEaiABQQFqLQAANgIAIANBCGohAyABQQJqIQEgByAEQQFqIgRHDQALCyACIAIpA4gBNwPgASACIAQ2AugBIAIgBEU6AOwBIAJB4AFqEOIFIAIgDCkCADcD0AEgAiAMKAIINgLYASACKALgASIBQYCAgIB4Rg0EIAUgAigC2AE2AgggBSACKQPQATcCACACIAE2ApgBIAJB0ABqIAJBmAFqEOgMIAEgAigCnAFBBEEIEN0TDAELIAJB0ABqIAtBCGoQ6AwLIAtBHGoiCyAJRw0ACyACIAIpAlg3AjQgAiACKQJQNwIsIAJBADYCKCAAIAJBKGoQ3QoMAwsgBiACKALoARD+IAALIAIoAlAgAigCVEEEQQgQ3RMgAkEANgLoASACQoCAgIAQNwLgASACQdAAaiACQeABahDYGCACQeABakEEciEMIAJBmAFqQQRqIQUCQAJAAkACQANAIAooAgBBAkcNBAJAAkAgCigCBEEBRw0AIAJB0ABqIApBCGoQxQwMAQsgCkEQaigCACIDQQN0IQcgCkEMaigCACEBAkAgA0UNACABIAdqIgRBeGpFDQAgBEF8aigCAEH/AEsNBgsgAkHgAWogA0H/////AXEiCEEBQQIQrxEgAigC5AEhCyACKALgAUEBRg0CQQAhBCACQQA2ApABIAIgAigC6AEiAzYCjAEgAiALNgKIAQJAIAdFDQBBACEEA0AgASgCACIHQYACTw0FIAFBBGooAgAiC0GAAk8NBiADIAc6AAAgA0EBaiALOgAAIANBAmohAyABQQhqIQEgCCAEQQFqIgRHDQALCyACIAIpA4gBNwPgASACIAQ2AugBIAIgBEU6AOwBIAJB4AFqENQFIAIgDCkCADcD0AEgAiAMKAIINgLYASACKALgASIBQYCAgIB4Rg0FIAUgAigC2AE2AgggBSACKQPQATcCACACIAE2ApgBIAJB0ABqIAJBmAFqEMUMIAEgAigCnAFBAUECEN0TCyAKQRxqIgogCUcNAAsgAiACKQJYNwJIIAIgAikCUDcCQCACQQE2AjwgACACQTxqEN0KDAULIAsgAigC6AEQ/iAAC0Hw/ZoBQSsgAkH/AWpBmOKGAUGYsYUBEN0UAAtB8P2aAUErIAJB/wFqQZjihgFBqLGFARDdFAALIAIoAlAgAigCVEEBQQIQ3RMCQAJAAkACQCACKAIIIgFBAkkNACACKAIEIgMoAgBBBkcNACADKAIMIgRFDQAgAygCCCEMIAMgAUEcbGohCUEAIQEgAyEKQQEhBwNAAkACQCABQQFxRQ0AIAohASAKIAlHDQEMBQsgByAJIAprQRxuTw0EIAogB0EcbGohAQsgASgCAEEGRw0BIAEoAgwiB0UNASABQRxqIQogByAEIAcgBEkbIQggASgCCCEBQQAhCyAMIQcCQAJAA0AgByABEIoFRQ0BIAdBHGohByABQRxqIQEgCCALQQFqIgtHDQALIAghBAwBCyALIARLDQMgCyEEC0EAIQdBASEBIAQNAAsLIAIgAigCCDYCXCACIAIpAgA3AlQMAgtBACALIARBrO6JARCQCgALIAJBADYCeCACQoCAgIDAADcCcCACQQA2AoQBIAJCgICAgMAANwJ8IAIoAgAhASACIAk2ApQBIAIgATYCkAEgAiADNgKIASACQZgBakEEaiEKQQAhB0EBIQtBBCEGAkADQAJAAkAgAyAHaiIBKAIAIghBCEYNACAKIAFBFGopAgA3AhAgCiABQQxqIgwpAgA3AgggCiABQQRqIgUpAgA3AgAgAkEANgKYASACIAwoAgA2AugBIAIgBSkCADcD4AEgAkGYAWoQzCEgCEEGRg0BQajzmgFBKEGc7okBELkhAAsgAUEcaiEJDAILIAIgAigC6AEiCDYCwAEgAiACKQPgATcDuAECQAJAIAggBEkNACACQeABaiAIIARrIghBBEEcEK8RIAIoAuQBIQwgAigC4AFBAUcNASAMIAIoAugBEP4gAAsgBCAIEIQXAAsgAiACKALoASIFNgLIASACIAw2AsQBIAIgCDYCzAEgAiAENgLAAQJAIAhBHGwiCEUNACAFIAIoArwBIARBHGxqIAj8CgAACyACQeABaiACQcQBahDWAQJAIAtBf2ogAigCfEcNACACQfwAahCjGiACKAKAASEGCyAGIAdqIgggAikC4AE3AgAgCCACKAL4ATYCGCAIIAIpAvABNwIQIAggAikC6AE3AgggAiALNgKEAQJAAkAgAigCeEUNACACQbgBahCdGwwBCyACQfAAahCdGyACIAIoAsABNgJ4IAIgAikDuAE3A3ALIAdBHGohByALQQFqIQsgAUEcaiAJRw0ACwsgAiAJNgKMASACQYgBahDdGCACIAIpA3A3A9ABIAIgAigCeDYC2AEgAkHgAWogAkH8AGoQjwEC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IBStQiCGIAathCEhIAMoAqgCIRUgA0HwAWohBiADQdgAaiEUIBIhEyADKAKsAiIWIQoMAQsgFK1CIIYgBq2EISIgA0HAAWohBiADQdADaiEUQgAhIQsgBiAKNgIAIBQgEzYCACADKALwASEXIAMoAlghGCADNQLQAyEjIAM1AsABISQgASABKAJ4IgpB//95cTYCeCAjICRCIIaEISNBBCETAkACQAJAIAEtAMgBQRdHDQAgA0GgAmogARDjASABIANBoAJqEKUPIAcgAygCqAI2AgggByADKQKgAjcCAAJAAkACQCABLQDIASIGQQJGDQAgBkESRg0BIAZBwABGDQIgASgCxAEhBiABKALAASEIIANB1oCAgHg2AqACIAggBiADQaACahDGGyEGIAEtAMgBQaIBRw0OIAEgARCgIxCMFAwOCyABKALAASETIAEQ6BECQAJAIAEtAMgBQQNGDQAgA0EIaiABELcKIAMoAgwhGQJAIAMoAghBAXFFDQAgGSEGDBALIAMgGTYCxARBASEGIANBATYCwAQgAS0AyAEiFEEDRg0BIAEoAsQBIQYgASgCwAEhCCADQcwEaiAUENklIAMgIDcD2AQgA0GgAmpBzZWAASADQdgEahCJHyAOIAMoAtQENgIIIA4gAykCzAQ3AgAgCCAGIANBoAJqEMYbIQYCQCABLQDIAUGiAUcNACABIAEQoCMQjBQLIANBwARqENkhDA8LQQAhBiAHKAIAIhkhGgsgARDoESADIBM2ApgCIAMgGjYClAIgAyAZNgKQAiADIAY2AowCIAMgASgCvAEiGzYCnAIgBg0DIANB1YCAgHg2AqACIBMgGyADQaACahDGGyEGAkAgAS0AyAFBogFHDQAgARDWFCEIIAEQ6BEgASAIEIwUCyADQYwCahDZIQwNCyADQaACaiABQQEQkwEgAygCoAIhBiADKAKwAyITQYGAgIB4Rg0MIAMgDikCADcDwAEgAyAOKQIINwPIASADIA4pAhA3A9ABIAMoAqgCIRQgAygCpAIhHCADQdADaiAQQewA/AoAACADIA8oAgg2AsgDIAMgDykCADcDwAMCQCATQYCAgIB4Rg0AQQhBoAEQ6iAiHSAUNgIIIB0gHDYCBCAdIAY2AgAgHSADKQPAATcCDCAdIAMpA8gBNwIUIB0gAykD0AE3AhwgHUEkaiAD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DAELIAFBCzYCiAEgAiALKQIANwOoASACIAsoAgg2ArABAkAgASgCCEEKRg0AIAoQwAsLIAogBTYCACAJIAwpAgA3AgAgCSAMKAIINgIICyABKQOwASEZIAMgAikDqAE3AgAgAyACKAKwATYCCCABIBk3A6gBIAJBqAFqIAEQiwIgAigCrAEhBSACKAKoASIIQQVHDQIgAiAFNgI8IAJBATYCOAwTCyABLQCBAUEgcUUNDiABEPwEIgVFDQ5BACEIDA8LIAJBqAFqIAEQqgggAi0AqAENASACLQCpASETIAEoAqwBIRUgASgCqAEhFiACIAEtALgBIgg6AH8gAkGoAWogARCLAiACKAKsASEFAkAgAigCqAEiFEEFRw0AIAIgBTYCPCACQQE2AjhBAUUNEAwSCyAOIA8pAxA3AxAgDiAPKQMINwMIIA4gDykDADcDACACIAU2AoQBIAIgFDYCgAEgAS0AuAEhBQJAAkACQAJAAkACQAJAAkAgAS0AgQFBIHFFDQAgBQ5rBQICAgYCAgYCAQYCAgICBgICAgICAgIGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGAgICAgICAgICBgICAgICAgICAgICAgICBgICAgICAgICAgYCAgICAgYCCyAFDgoEBQUFBQUFBQUABQsCQAJAIAEoAogBIgVBC0cNACACQagBaiABEMQBDAELIAFBCzYCiAEgAiALKQIANwOoASACIAsoAgg2ArABAkAgASgCCEEKRg0AIAoQwAsLIAogBTYCACAJIAwpAgA3AgAgCSAMKAIINgIICyABKQOwASEZIAMgAikDqAE3AgAgAyACKAKwATYCCCABIBk3A6gBIAEgASgCeCISQcAAcjYCeCABLQC4AUE+Rg0BDA4LIAVBEkYNASAFQbR/akH/AXFB1QBJDQECQCAUDQAgBUEDRw0AIAIoApQBIRcgAigCkAEhGCACKQOIASEZDAsLIAEoArQBIQUgASgCsAEhFCACQfaAgIB4NgKoASABIBQgBSACQagBahDuHSABKAKsASEFQQhBwAAQ5CAiFCAFNgIIIBQgEjYCBCAUQTE2AgAgDSACKQOAATcCACANIAIpA4gBNwIIIA0gAikDkAE3AhAgDSACKQOYATcCGEEIQfAAEOQgIgVBBjYCACAFIBQ2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A0UNACADQTBsIQMgAkEEaigCAEEkaiECA0ACQCACQXxqKAIAIgdFDQAgByABELcBCwJAIAIoAgAiB0UNACAHIAEQtwELIAJBMGohAiADQVBqIgMNAAsLIAUoAkAiAg0EDAcLAkAgACgCICIFQQhqKAIAIgJFDQAgBUEEaigCACIEIAJBBnRqIQADQAJAIARBOGooAgAiAkUNACACQQxsIQYgBEE0aigCACEHA0AgBygCACICIAEQXAJAIAIoAgBBGkcNACABIAJBCGoQlAsiA0UNACACEIgCIAIgAykDODcDOCACIAMpAzA3AzAgAiADKQMoNwMoIAIgAykDIDcDICACIAMpAxg3AxggAiADKQMQNwMQIAIgAykDCDcDCCACIAMpAwA3AwAgA0HAAEEIENwUCyAHQQxqIQcgBkF0aiIGDQALCyAEIAEQzQQgASAEEP4IIARBwABqIgIhBCACIABHDQALCwJAIAVBFGooAgAiAkUNACACQQxsIQYgBUEQaigCACEHA0AgBygCACICIAEQXAJAIAIoAgBBGkcNACABIAJBCGoQlAsiA0UNACACEIgCIAIgAykDODcDOCACIAMpAzA3AzAgAiADKQMoNwMoIAIgAykDIDcDICACIAMpAxg3AxggAiADKQMQNwMQIAIgAykDCDcDCCACIAMpAwA3AwAgA0HAAEEIENwUCyAHQQxqIQcgBkF0aiIGDQALCwJAIAUoAhhBgICAgHhGDQAgBUEgaigCACICRQ0AIAJBMGwhAyAFQRxqKAIAIQIDQCACIAEQzQEgAkEwaiECIANBUGoiAw0ACwsCQCAFKAI8IgJFDQAgAkEIaigCACIDRQ0AIANBMGwhAyACQQRqKAIAQSRqIQIDQAJAIAJBfGooAgAiB0UNACAHIAEQtwELAkAgAigCACIHRQ0AIAcgARC3AQsgAkEwaiECIANBUGoiAw0ACwsgBSgCQCICDQMMBgsCQCAAKAIIQQNHDQAgACgCDCICIAEQXCACKAIAQRpHDQAgASACQQhqEJQLIgNFDQAgAhCIAiACIAMpAzg3AzggAiADKQMwNwMwIAIgAykDKDcDKCACIAMpAyA3AyAgAiADKQMYNwMYIAIgAykDEDcDECACIAMpAwg3AwggAiADKQMANwMAIANBwABBCBDcFAsCQCAAKAI8IgJFDQAgAiABEFwg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AhQLIAEgASgCtAEiCDYCrAEgASABKAKwASILNgKoASAGIAMpA0A3AgAgBiADKAJINgIIIANBloGAgHg2AkAgASALIAggA0HAAGoQ7h0gA0HAAGogARC0CSADKAJEIQgCQCADKAJAIgsNACAAQQM6ABQgACAINgIADAILIAsgCBDCHSABLQC4ASEIIAchCQsCQAJAAkACQAJAIAEtAIEBQSBxRQ0AIAhB/wFxQYEBRg0BCyADQcAAakEEQQRBEBCFDyADKAJEIQ0gAygCQEUNASANIAMoAkgQ/iAACwJAAkAgASgCiAEiB0ELRw0AIANBwABqIAEQxAEMAQsgAUELNgKIASADIAEpApgBNwNAIAMgASgCoAE2AkggAUGMAWohCAJAIAEoAghBCkYNACABQQhqEMALCyABIAc2AgggASAIKQIANwIMIAEgCCgCCDYCFAsgASkDsAEhESAGIAMpA0A3AgAgBiADKAJINgIIIAEgETcDqAEgA0HAAGogARD8AyADKAJEIQggAygCQCINQYCAgIB4Rw0BIABBAzoAFCAAIAg2AgAgCSEHDAMLIAMoAkghCEEAIQwMAQsgAygCSCEMCyABLQC4ASELAkACQCABKAKAAUGAwABxIgdFDQAgC0H/AXFBgQFHDQACQAJAIAEoAogBIgdBC0cNACADQcAAaiABEMQBDAELIAFBCzYCiAEgAyABKQKYATcDQCADIAEoAqABNgJIIAFBjAFqIQsCQCABKAIIQQpGDQAgAUEIahDACwsgASAHNgIIIAEgCykCADcCDCABIAsoAgg2AhQLIAEgASgCtAEiBzYCrAEgASABKAKwASILNgKoASAGIAMpA0A3AgAgBiADKAJINgIIIANBmYGAgHg2AkAgASALIAcgA0HAAGoQ7h0gA0HAAGogARD8AyADKAJEIQcCQCADKAJAIgtBgICAgHhHDQAgAEEDOgAUIAAgBzYCACAJIQcMAgsgByADKAJIEJ8PIAsgBxD2IyABKAKAAUGAwABxIQcgAS0AuAEhCwsCQAJAIAdFDQAgC0H/AXFB2QBHDQACQAJAIAEoAogBIgdBC0cNACADQcAAaiABEMQBDAELIAFBCzYCiAEgAyABKQKYATcDQCADIAEoAqABNgJIIAFBjAFqIQsCQCABKAIIQQpGDQAgAUEIahDACwsgASAHNgIIIAEgCykCADcCDCABIAsoAgg2AhQLIAEgASgCtAEiBzYCrAEgASABKAKwASILNgKoASAGIAMpA0A3AgAgBiADKAJINgIIIANBl4GAgHg2AkAgASALIAcgA0HAAGoQ7h0gA0HAAGogARC0CSADKAJEIQsCQCADKAJAIgcNACAAQQM6ABQgACALNgIAIAkhBwwDCyADIAc2AjAgAyALNgJAAkAgCUUNACADQcAAahDNHiADQTBqEJIiIAEtALgBIQsMAQsgA0EoahC7ICADIAc2AigCQCALRQ0AIANBLGoQzR4gAyALNgIsIAshCiABLQC4ASELDAILIANBwABqEM0eIAEtALgBIQsMAQsgCSEHCwJAAkACQCALQf8BcUECRw0AAkACQCABKAKIASILQQtHDQAgA0HAAGogARDEAQwBCyABQQs2AogBIAMgASkCmAE3A0AgAyABKAKgATYCSCABQYwBaiEJAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgCzYCCCABIAkpAgA3AgwgASAJKAIINgIUCyABKQOwASERIAYgAykDQDcCACAGIAMoAkg2AgggASARNwOoASAHRQ0BIAEgASgCeCILQYCAgAJyNgJ4IANBwABqIAEQUSABIAs2AnggAygCRCELIAMoAkAiCUGAgICAeEcNAiAAQQM6ABQgACALNgIADAMLIAEoArQBIQYgASgCsAEhCSADQTBqIAsQyCUgA0GPAq1CIIZB/vSaAa2ENwNYIANBwABqQc2VgAEgA0HYAGoQshAgAyADKQIwNwJMIAMgAygCODYCVCAJIAYgA0HAAGoQxhshBgJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgAEEDOgAUIAAgBjYCAAwCCyABIAEoAngiC0H///99cTYCeCADQcAAaiABEFEgASALNgJ4IAMoAkQhCyADKAJAIglBgICAgHhHDQAgAEEDOgAUIAAgCzYCAEEAIQcMAQsgAygCSCEPAkACQAJAAkAgAS0AuAEiDkEDRg0AIA5BowFHDQIgA0EwakGjARDIJSABKAK0ASEGIAEoArABIQ4gA0GPAq1CIIZB//SaAa2ENwNYIANBwABqQc2VgAEgA0HYAGoQshAgAyADKQIwNwJMIAMgAygCODYCVCABIA4gBiADQcAAahDuHSABKAKsASEODAELAkACQCABKAKIASIO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CAsgASABKAK0ASIgNgKsASABIAEoArABIiE2AqgBIAQgAikD4AI3AgAgBCACKALoAjYCCAsgAkHAAmogARC2CAJAAkACQAJAIAIpA8ACIidCAFINACACKALIAiEFDAELIAJBADYCuAIgAiACKALMAiIeNgK0AiACIAIoAsgCIgU2ArACIAIgJ0IgiKciHzYCrAIgAkEAOgC8AiACICenIiQ2AqgCAkAgAS0AuAEiGkEKRw0AAkACQCAGKAIAIhpBC0cNACACQeACaiABEMQBDAELIAZBCzYCACACIAkpAgA3A+ACIAIgCSgCCDYC6AICQCAIKAIAQQpGDQAgCBDACwsgCCAaNgIAIAcgCikCADcCACAHIAooAgg2AggLIAEgASgCtAEiGjYCrAEgASABKAKwATYCqAEgBCACKQPgAjcCACAEIAIoAugCNgIIIAJBAToAvAIgAiAFIBogBSAaSxsiHjYCtAIgAiAFIBogBSAaSRsiBTYCsAIgAS0AuAEhGgsCQCAaQf8BcUEJRw0AAkACQCAGKAIAIiVBC0cNACACQeACaiABEMQBDAELIAZBCzYCACACIAkpAgA3A+ACIAIgCSgCCDYC6AICQCAIKAIAQQpGDQAgCBDACwsgCCAlNgIAIAcgCikCADcCACAHIAooAgg2AggLIAEgASgCtAEiGjYCrAEgASABKAKwATYCqAEgBCACKQPgAjcCACAEIAIoAugCNgIIICNBHEcNAiAMIAIpA7gCNwIQIAwgAikDsAI3AgggDCACKQOoAjcCAEEoEIoBIiVFDQogJUEANgIAICUgAikC4AI3AgQgJSACKQLoAjcCDCAlIAIpAvACNwIUICUgAigC+AI2AhwgJUEANgIgQQIhIwwDCyABKAK0ASEFIAEoArABISIgAkHQAmogGhDIJSACICk3A5gCIAJB4AJqQc2VgAEgAkGYAmoQshAgDSACKALYAjYCCCANIAIpAtACNwIAICIgBSACQeACahDGGyEFAkAgAS0AuAFBogFHDQAgARDLFCEiIAEQtRAgASAiEJEJCyACQagCahCgHAsgASACQbABahDLCCAEIBEoAgg2AgggBCARKQMANwMAAkAgASgCiAFBDnFBCkYNACAGEMALCyABIBs2AqwBIAEgHDYCqAEgBiAQKQMYNwMYIAYgECkDEDcDECAGIBApAwg3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IQYgAkGAgICAeDYCDEGAqpkBQYCsmQEgBkEiRiIHGyEIIARBAWohCSADQX9qIQogBUEBaiEFIAZBJ0YhCwNAAkACQAJAAkAgCw0AIAkhDANAQQAhBgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIApBIUkNAEEAIQ0DQCAIIAUgDWoiBi0AACIDai0AAA0iIAggBkEBai0AACIDai0AAA0CIAggBkECai0AACIDai0AAA0DIAggBkEDai0AACIDai0AAA0EIAggBkEEai0AACIDai0AAA0FIAggBkEFai0AACIDai0AAA0GIAggBkEGai0AACIDai0AAA0HIAggBkEHai0AACIDai0AAA0IIAggBkEIai0AACIDai0AAA0JIAggBkEJai0AACIDai0AAA0KIAggBkEKai0AACIDai0AAA0LIAggBkELai0AACIDai0AAA0MIAggBkEMai0AACIDai0AAA0NIAggBkENai0AACIDai0AAA0OIAggBkEOai0AACIDai0AAA0PIAggBkEPai0AACIDai0AAA0QIAggBkEQai0AACIDai0AAA0RIAggBkERai0AACIDai0AAA0SIAggBkESai0AACIDai0AAA0TIAggBkETai0AACIDai0AAA0UIAggBkEUai0AACIDai0AAA0VIAggBkEVai0AACIDai0AAA0WIAggBkEWai0AACIDai0AAA0XIAggBkEXai0AACIDai0AAA0YIAggBkEYai0AACIDai0AAA0ZIAggBkEZai0AACIDai0AAA0aIAggBkEaai0AACIDai0AAA0bIAggBkEbai0AACIDai0AAA0cIAggBkEcai0AACIDai0AAA0dIAggBkEdai0AACIDai0AAA0eIAggBkEeai0AACIDai0AAA0fIAggBkEfai0AACIDai0AAA0gIA1BwABqIQMgDUEgaiIGIQ0gAyAKSQ0ACwsgCiAGRg0oA0AgCCAFIAZqLQAAIgNqLQAADSAgCiAGQQFqIgZHDQAMKQsLIA1BAWohDQwfCyANQQJqIQ0MHgsgDUEDaiENDB0LIA1BBGohDQwcCyANQQVqIQ0MGwsgDUEGaiENDBoLIA1BB2ohDQwZCyANQQhqIQ0MGAsgDUEJaiENDBcLIA1BCmohDQwWCyANQQtqIQ0MFQsgDUEMaiENDBQLIA1BDWohDQwTCyANQQ5qIQ0MEgsgDUEPaiENDBELIA1BEGohDQwQCyANQRFqIQ0MDwsgDUESaiENDA4LIA1BE2ohDQwNCyANQRRqIQ0MDAsgDUEVaiENDAsLIA1BFmohDQwKCyANQRdqIQ0MCQsgDUEYaiENDAgLIA1BGWohDQwHCyANQRpqIQ0MBgsgDUEbaiENDAULIA1BHGohDQwECyANQR1qIQ0MAwsgDUEeaiENDAILIA1BH2ohDQwBCyAGIQ0LIAEgDSAMaiIGNgJoIAEgCiANayIKNgJcIAEgBSANaiIFNgJYAkACQAJAIANBdmoOGQUCAgUCAgICAgICAgICAgICAgICAgICAgEACyADQdwARg0GDAELIAcNBAsgASAGQQFqIgw2AmggASAKQX9qIgo2AlwgASAFQQFqIgU2AlgMAAsLIAkhDANAQQAhBgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAKQSFJDQBBACENA0AgCCAFIA1qIgYtAAAiA2otAAANISAIIAZBAWotAAAiA2otAAANICAIIAZBAmotAAAiA2otAAANHyAIIAZBA2otAAAiA2otAAANHiAIIAZBBGotAAAiA2otAAANHSAIIAZBBWotAAAiA2otAAANHCAIIAZBBmotAAAiA2otAAANGyAIIAZBB2otAAAiA2otAAANGiAIIAZBCGotAAAiA2otAAANGSAIIAZBCWotAAAiA2otAAANGCAIIAZBCmotAAAiA2otAAANFyAIIAZBC2otAAAiA2otAAANFiAIIAZBDGotAAAiA2otAAANFSAIIAZBDWotAAAiA2otAAANFCAIIAZBDmotAAAiA2otAAANEyAIIAZBD2otAAAiA2otAAANEiAIIAZBEGotAAAiA2otAAANESAIIAZBEWotAAAiA2otAAANECAIIAZBEmotAAAiA2otAAANDyAIIAZBE2otAAAiA2otAAANDiAIIAZBFGotAAAiA2otAAANDSAIIAZBFWotAAAiA2otAAANDCAIIAZBFmotAAAiA2otAAANCyAIIAZBF2otAAAiA2otAAANCiAIIAZBGGotAAAiA2otAAAN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A0AgACABEMADIABBMGohACADQVBqIgMNAAwYCwsgACgCBCEADBQLIAAoAgwhAAwTCyAAKAIEIAEQpQEgACgCCCEADBILAkACQCADQQtHDQACQAJAIAAoAgQOAwABAwALIAAoAhAiA0UNAiADQShsIQYgACgCDCEDA0ACQCADKAIAQQdGDQAgAyABEKkKCyADQShqIQMgBkFYaiIGDQAMAwsLIAAoAhAiA0UNASADQThsIQQgACgCDCEIQQAhAwNAAkACQAJAAkAgCCADaiIGKAIADgMAAQIACwJAIAZBCGooAgBBA0cNACAGQQxqKAIAIAEQpQELIAZBKGooAgAgARCpCgwCCyAGQSBqQQA2AgAgBkEwaigCACIGRQ0BIAYgARClAQwBCyAGQQRqKAIAIAEQqQoLIAQgA0E4aiIDRw0ADAILCwJAAkACQAJAAkACQAJAAkACQAJAIAMOCwABAgMEBQYHCAkKAAsgAEEANgIYIAAoAjghAAwbCyAAKAIoIAEQpQEgACgCCEECRw0IIAAoAgwgARClASAAKAI4IQAMGgsgACgCCEEBRw0HIAAoAgwgARClASAAKAI4IQAMGQsgACgCBCABEKUBIAAoAjghAAwYCwJAIAAoAgQiAygCACIGQQNHDQAgAygCECABEKUBIANBDGooAgAiBkUNBiAGQQR0IQYgA0EIaigCAEEMaiEDA0AgAygCACABEKUBIANBEGohAyAGQXBqIgYNAAwHCwsgAygCICABEKUBIAZBAkcNBSADKAIEIAEQpQEgACgCOCEADBcLIAAoAgQgARClASAAKAI4IQAMFgsgACgCBCABEKUBIAAoAjghAAwVCyAAKAIEIAEQpQEgACgCOCEADBQLIAAoAgQgARClASAAKAI4IQAMEwsgACgCBCABEKUBCyAAKAI4IQAMEQsgACgCKCABEKUBIAAoAghBAkcNEiAAKAIMIQAMEAsgACgCCEEBRw0RIAAoAgwhAAwPCyAAKAIEIAEQpQEgACgCCCABEKUBIAAoAgwhAAwOCwJAIAAtABhBBUcNACAAKAIQIAEQpQELIAAoAgwiA0UNDyADQQR0IQMgACgCCEEMaiEAA0AgACgCACABEKUBIABBEGohACADQXBqIgMNAAwQCwsgACgCECABEKUBIAAoAgRBgICAgHhGDQ4gACgCDCIDRQ0OIANB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KQIANwLsAQsgAiAJNgKAASACIAs2AnwgAiAMNgJ4IAIgAikDkAI3AoQBIAIgAigCmAI2AowBIAIgDjYCpAEgAiAGNgKcASACIAQ2ApgBIAIgDzoAlQEgAiANOgCUASACIAo2ApABIAIgASgCrAEiDDYCzAEgAiABKAKoASINNgLIASACIAg2AqABIAIgEDYCqAEgAiABKAK4ATYC2AEgAiABKQOwATcD0AEgAiACKQPgATcCrAEgAiACKQPoATcCtAEgAiACKQPwATcCvAEgAiACKAL4ATYCxAEgASAIQQFyNgJ4IAJBIGogARCvAyABQbABaiEKIAJBqAFqIQYgAkHQAWohCyACKAIkIQQgAigCIEEBcQ0DIAMoAgAiDkELRw0BIAJB4AFqIAEQxAEMAgsgAUGwAWohAyABKAKwASEEAkACQCABKAKIASIFQQtHDQAgAkH4AGogARDEAQwBCyABQQs2AogBIAIgASkCmAE3A3ggAiABKAKgATYCgAEgAUGMAWohBgJAIAEoAghBCkYNACABQQhqEMALCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhEyADIAIpA3g3AgAgAyACKAKAATYCCCABIBM3A6gBIAJByABqIAEgBEEAENMEIAIoAkwhAyACKAJIIQQMDgsgAUELNgKIASACIAEpApgBNwPgASACIAEoAqABNgLoASABQYwBaiEPAkAgASgCCEEKRg0AIAcQwAsLIAEgDjYCCCABIA8pAgA3AgwgASAPKAIINgIUCyABKQOwASETIAogAikD4AE3AgAgCiACKALoATYCCCABIBM3A6gBIAEtALgBRQ0BIAQQ/hsgBCgCACAEQQRqKAIAEPQjIARBFEEEENwUIAEgAkH4AGoQywggCiALKAIINgIIIAogCykDADcDAAJAIAEoAogBQQ5xQQpGDQAgAxDACwsgASAMNgKsASABIA02AqgBIAMgBikDGDcDGCADIAYpAxA3AxAgAyAGKQMINwMIIAMgBikDADcDAEEAIQQMAgsgASACQfgAahDLCCAKIAsoAgg2AgggCiALKQMANwMAAkAgASgCiAFBDnFBCkYNACADEMALCyABIAw2AqwBIAEgDTYCqAEgAyAGKQMYNwMYIAMgBikDEDcDECADIAYpAwg3AwggAyAGKQMANwMAIARB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IA02AqgBIBAgESkDGDcDGCAQIBEpAxA3AxAgECARKQMINwMIIBAgESkDADcDACAGQQhqEOYDIAZBIEEIENwUQQAhBgwOCwJAAkAgCw0AIAYQqARB4AAhCQwBCyAGQQhqEOYDQSAhCQsgBiAJQQgQ3BQgASACQYgBahDLCCAEIBIoAgg2AgggBCASKQMANwMAAkAgASgCiAFBDnFBCkYNACAQEMALCyABIAw2AqwBIAEgDTYCqAEgECARKQMYNwMYIBAgESkDEDcDECAQIBEpAwg3AwggECARKQMANwMAQQAhBgwNCyACLQCJASEHIAJBCGogARBeIAIoAgwhBgJAAkACQCACKAIIQQFxDQBBACEEIAEtALkBDQAgAUGwAWohAyABQQxqIRAgAUEIaiEJIAFBmAFqIQUgAUGMAWohESAHQf8BcUGkAUchCwNAIAEtALgBQQRHDQECQAJAIAEoAogBIgdBC0cNACACQYgBaiABEMQBDAELIAFBCzYCiAEgAiAFKQIANwOIASACIAUoAgg2ApABAkAgASgCCEEKRg0AIAkQwAsLIAkgBzYCACAQIBEpAgA3AgAgECARKAIINgIICyABKQOwASEXIAMgAikDiAE3AgAgAyACKAKQATYCCCABIBc3A6gBAkACQAJAAkACQAJAAkACQAJAAkACQCABLQC4AUEFRw0AAkACQCABKAKIASIHQQtHDQAgAkGIAWogARDEAQwBCyABQQs2AogBIAIgBSkCADcDiAEgAiAFKAIINgKQAQJAIAEoAghBCkYNACAJEMALCyAJIAc2AgAgECARKQIANwIAIBAgESgCCDYCCAsgASABKAK0ASIVNgKsASABIAEoArABNgKoASADIAIpA4gBNwIAIAMgAigCkAE2AghBBCEHIAYoAgAOFAgIAQICAwIDAgIEBAICAgUCBgcCCAsgASABKAJ4IgdB////v39xNgJ4IAIgASgCsAEgARDsAyACKAIAIRUgASAHNgJ4IAIoAgQhCiAVQQFxRQ0IIAohAwwNC0EYQRQgBigCBEGAgICAeEYbIQcMBgtBCCEHDAULQRAhBwwEC0EUIQcMAwtBDCEHDAILQSghBwwBC0EgIQcLIAYgB2ooAgAhCkHgABCKASIHRQ0MIAcgFTYCDCAHIAo2AgggByAGNgIEIAdBBjYCACAHIQYMAQsgAS0AuAEiB0EFRw0DAkACQCABKAKIASIHQQtHDQAgAkGIAWogARDEAQwBCyABQQs2AogBIAIgBSkCADcDiAEgAiAFKAIINgKQAQJAIAEoAghBCkYNACAJEMALCyAJIAc2AgAgECARKQIANwIAIBAgESgCCDYCCAsgASABKAK0ASIVNgKsASABIAEoArABNgKoASADIAIpA4gBNwIAIAMgAigCkAE2AghBBCEHAkACQAJAAkACQAJAAkACQCAGKAIADhQHBwABAQIBAgEBAwMBAQEEAQUGAQcLQRhBFCAGKAIEQYCAgIB4RhshBwwGC0EIIQcMBQtBECEHDAQLQRQhBwwDC0EMIQcMAgtBKCEHDAELQSAhBwsgBiAHaigCACESQeAAEIoBIgdFDQwgByALOgAUIAcgFTYCECAHIBI2AgwgByAKNgIIIAcgBjYCBCAHQQ82AgAgByEGCyABLQC5AUEBRw0ACwsgBiEDDA8LIAEoArQBIQMgASgCsAEhBCACQfABaiAHEMglIAJBjwKtQiCGQavkmgGthDcDoAIgAkGIAWpBzZWAASACQaACahCyECACIAIpAvABNwKUASACIAIoAvgBNgKcASAEIAMgAkGIAWoQxhshAwJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgChCYIwsgBhCoBCAGQeAAQQgQ3BRBASEEDA0LQQEhBCACQYgBaiABQQEQvQMgAigCiAEiBkGBgICAeEYNCiACIAJBjAFqIgEoAhg2AkggAiABKQIQNwNAIAIgASkCCDcDOCACIAEpAgA3AzBB4AAQigEiA0UNByADIAY2AgQgA0ECNgIAIANBCGogAkEwakHYAPwKAAAMCQtBASEEDAsLIAFBsAFqIQMgASgCsAEhBwJAAkAgASgCiAEiBEELRw0AIAJBiAFqIAEQxAEMAQsgAUELNgKIASACIAEpApgBNwOIASACIAEoAqABNgKQASABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBDYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABKQOwASEXIAMgAikDiAE3AgAgAyACKAKQATYCCCABIBc3A6gBQQAhEAwCCyABQbABaiEDIAEoArABIQcCQAJAIAEoAogBIgRBC0cNACACQYgBaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDiAEgAiABKAKgATYCkAEgAUGMAWohBgJAIAEoAghBCkYNACABQQhqEMALCyABIAQ2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhFyADIAIpA4gBNwIAIAMgAigCkAE2AgggASAXNwOoAUEBIRAMAQsgAUGwAWohAyABKAKwASEHAkACQCABKAKIASIEQQtHDQAgAkGIAWogARDEAQwBCyABQQs2AogBIAIgASkCmAE3A4gBIAIgASgCoAE2ApABIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahDACwsgASAENgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEpA7ABIRcgAyACKQOIATcCACADIAIoApABNgIIIAEgFzcDqAFBAiEQCyACQRBqIAEQqwFBASEEIAIoAhQhBgJAIAIoAhBBAXFFDQAgBiEDDAgLIAEoAqwBIQFB4AAQigEiA0UNAyADIBA6ABAgAyABNgIMIAMgBzYCCCADIAY2AgQgA0EONgIADAQLQQhB4AAQoiQAC0EIQeAAEKIkAAtBCEHgABCiJAALQQhB4AAQoiQAC0EAIQQMAgsgAigCjAEhAwwBCyACQQA2AiggAkEAOwEsIAEoAqwBIRBB4AAQigEiAUUNASABIAY2AjBBACEEIAFBADoALCABQQA2AiggASAHNgIkIAEgAzYCICABIBc3AxggASAHNgIUIAEgAzYCECABIBA2AgwgASAFNgIIIAFBDDYCACABIAIoAig2AjQgASACLwEsOwE4IAFBADoAOiABIQMLIAAgAzYCBCAAIAQ2AgAgAkGwAmokAA8LQQhB4AAQoiQAC/ccAgp/An4jAEHQA2siBiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAA0ACQAJAAkACQCADDQBBACEHDAELIAIoAgBFDQEgAyEHCyACIQgMAQsgA0ECdCEHQQAhCUEAIQoDQCAHIAlGDRECQCACIAlqKAIADQAgCUEEaiEJIApBAWohCgwBCwsgBkHwAGogCiACIANB0OSDARCBHSAGKAJ0IQcgBigCcCEIIAZB6ABqIAogACABQeDkgwEQgh0gBigCbCEBIAYoAmghAAsCQAJAAkACQCAFDQBBACEDDAELIAQoAgBFDQEgBSEDCyAEIQIMAQsgBUECdCECQQAhCUEAIQoDQCAC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EAyfAQsgA0GegICAeDYCAAyeAQsgA0GfgICAeDYCAAydAQsgA0GggICAeDYCAAycAQsgAyAEKQMQNwMQIAMgBCkDCDcDCCADIAQpAwA3AwAMmwELIANBooCAgHg2AgAMmgELIANBo4CAgHg2AgAMmQELIAMgBCkDEDcDECADIAQpAwg3AwggAyAEKQMANwMADJgBCyADQaWAgIB4NgIADJcBCyADQaaAgIB4NgIADJYBCwJAIAEpAxAiBkIDg0IAUg0AIAanIgEgASgCACIBQQFqNgIAIAFBf0wNlwELIABBp4CAgHg2AgggACAGNwMQDJUBCyADQaiAgIB4NgIADJQBCyADQamAgIB4NgIADJMBCyADQaqAgIB4NgIADJIBCyADQauAgIB4NgIADJEBCyACQRRqIAEoAhAgASgCFBDVGCAAQayAgIB4NgIIIAAgAikCFDcCDCAAIAIoAhw2AhQgACABKQMYNwMYDJABCyADQa2AgIB4NgIADI8BCyADQa6AgIB4NgIADI4BCyADQa+AgIB4NgIADI0BCyACQRRqIAEoAhAgASgCFBDVGCAAQbCAgIB4NgIIIAAgAikCFDcCDCAAIAIoAhw2AhQgACABKQMYNwMYDIwBCyACQRRqIAEoAhAgASgCFBDYESAAQbGAgIB4NgIIIAAgAigCHDYCFCAAIAIpAhQ3AgwMiwELIANBsoCAgHg2AgAMigELIANBs4CAgHg2AgAMiQELIAJBCGogASgCDCABKAIQENUYIAJBFGogASgCGCABKAIcENUYIAMgAigCEDYCCCADIAIpAgg3AgAgACACKQIUNwIUIAAgAigCHDYCHAyIAQsgAyAEKQMQNwMQIAMgBCkDCDcDCCADIAQpAwA3AwAMhwELIANBtoCAgHg2AgAMhgELIANBt4CAgHg2AgAMhQELIANBuICAgHg2AgAMhAELIAMgBCkDEDcDECADIAQpAwg3AwggAyAEKQMANwMADIMBCyADQbqAgIB4NgIADIIBCyADQbuAgIB4NgIADIEBCyADQbyAgIB4NgIADIABCyADQb2AgIB4NgIADH8LIANBvoCAgHg2AgAMfgsgA0G/gICAeDYCAAx9CyADQcCAgIB4NgIADHwLIANBwYCAgHg2AgAMewsgA0HCgICAeDYCAAx6CyADQcOAgIB4NgIADHkLAkAgASkD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AlA2AgggASALNwOoASABLQC4ASIFQXNqQf8BcUECSQ0DQQMhByAFQf8BcUGRAUcNBSABKAKIASIFQQtHDQEgAkHIAGogARDEAQwCCyABKAK0ASEFIAJBJGogBBDIJSACQY8CrUIghkH+9JoBrYQ3A6ABIAJByABqQc2VgAEgAkGgAWoQzgggAiACKQIkNwJUIAIgAigCLDYCXCADIAUgAkHIAGoQxhshBAJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgAEECOgAyIAAgBDYCAAwFCyABQQs2AogBIAIgASkCmAE3A0ggAiABKAKgATYCUCABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBTYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABKQOwASELIAQgAikDSDcCACAEIAIoAlA2AgggASALNwOoAUEAIQcMAQsCQAJAIAEoAogBIgZBC0cNACACQcgAaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDSCACIAEoAqABNgJQIAFBjAFqIQcCQCABKAIIQQpGDQAgAUEIahDACwsgASAGNgIIIAEgBykCADcCDCABIAcoAgg2AhQLIAEpA7ABIQsgBCACKQNINwIAIAQgAigCUDYCCCABIAs3A6gBAkAgAS0AuAEiBkGRAUcNACAFQf8BcUENRiEFAkACQCABKAKIASIGQQtHDQAgAkHIAGogARDEAQwBCyABQQs2AogBIAIgASkCmAE3A0ggAiABKAKgATYCUCABQYwBaiEHAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBjYCCCABIAcpAgA3AgwgASAHKAIINgIUC0EBQQIgBRshByABKQOwASELIAQgAikDSDcCACAEIAIoAlA2AgggASALNwOoAQwBCyABKAK0ASEEIAEoArABIQUgAkEwaiAGEMglIAJBjwKtQiCGQdj/mgGthDcDoAEgAkHIAGpBzZWAASACQaABahDOCCACIAIpAjA3AlQgAiACKAI4NgJcIAUgBCACQcgAahDGGyEEAkAgAS0AuAFBogFHDQAgASABEIYOEJEJCyAAQQI6ADIgACAENgIADAILIAEtALgBIQULAkACQCAFQf8BcUEERw0AAkACQCABKAKIASIFQQtHDQAgAkHIAGogARDEAQwBCyABQQs2AogBIAIgASkCmAE3A0ggAiABKAKgATYCUCABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBTYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABKQOwASELIAQgAikDSDcCACAEIAIoAlA2AgggASALNwOoASABKAKwASEGIAJBoAFqIAEQtgggAigCqAEhBQJAIAIpA6ABIgtCAFENACACKAKsASEIIAJBAjYCpAEgAkGb8JoBNgKgASACQRhqIAFB4AAgAkGgAWoQtgkgAigCHCEJIAIoAhhBAUcNAgJAIAtCA4NCAFINACALpyIBIAEoAgAiBEF/ajYCACAEQQFHDQAgASABKAIQEPAeCyAJIQULIABBAjoAMiAAIAU2AgAMAgsgASgCtAEhBCABKAKwASEGIAJBPGogBRDIJSACQY8CrUIghkGp5JoBrYQ3A6ABIAJByABqQc2VgAEgAkGgAWoQzgggAiACKQI8NwJUIAIgAigCRDYCXCAGIAQgAkHIAGoQxhshBAJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgAEECOgAyIAAgBDYCAAwBCyACIAk2AmhBACEJIAJBADoAZCACQQA2AmAgAiAINgJcIAIgBTYCWCACIAs3A1AgAkEANgJsIAJBADsBcCACIAEoAqwBNgJMIAJBADoAciACIAY2AkgCQAJAAkACQAJAIAEtALgBIgVB9QBHDQACQAJAIAEoAogBIgVBC0cNACACQaABaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohBgJAIAEoAghBCkYNACABQQhqEMALCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhCyAEIAIpA6ABNwIAIAQgAigCqAE2AgggASALNwOoASABIAEoAngiBUH///+/f3E2AnggAkEQaiABKAKwASABEOwDIAIoAhAhBiABIAU2AnggAigCFCEJIAZBAXENASABLQC4ASEFCwJAAkACQAJAIAVB/wFxQQVHDQACQAJAIAEoAogBIgVBC0cNACACQaABaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohBgJAIAEoAghBCkYNACABQQhqEMALCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhCyAEIAIpA6ABNwIAIAQgAigCqAE2AgggASALNwOoASABLQC4ASIFQXNqQf8BcUECSQ0DQQMhCCAFQf8BcUEKRw0FIAEoAogBIgVBC0cNASACQaABaiABEMQBDAILIAEoArQBIQQgASgCsAEhBiACQfwAaiAFEMglIAJBjwKtQiCGQavkmgGthDcDuAEgAkGgAWpBzZWAASACQbgBahCyECACIAIpAnw3AqwBIAIgAigChAE2ArQBIAYgBCACQaABahDGGyEEAkAgAS0AuAFBogFHDQAgASABEIYOEJEJCyAAQQI6ADIgACAENgIADAULIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohBgJAIAEoAghBCkYNACABQQhqEMALCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhCyAEIAIpA6ABNwIAIAQgAigCqAE2AgggASALNwOoAUEAIQgMAgsCQAJAIAEoAogBIgZBC0cNACACQaABaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohCAJAIAEoAghBCkYNACABQQhqEMALCyABIAY2AgggASAIKQIANwIMIAEgCCgCCDYCFAsgASkDsAEhCyAEIAIpA6ABNwIAIAQgAigCqAE2AgggASALNwOoAQJAIAEtALgBIgZBCkcNACAFQf8BcUENRiEFAkACQCABKAKIASIGQQtHDQAgAkGgAWogARDEAQwBCyABQQs2AogBIAIgASkCmAE3A6ABIAIgASgCoAE2AqgBIAFBjAFqIQgCQCABKAIIQQpGDQAgAUEIahDACwsgASAGNgIIIAEgCCkCADcCDCABIAgoAgg2AhQLQQFBAiAFGyEIIAEpA7ABIQsgBCACKQOgATcCACAEIAIoAqgBNgIIIAEgCzcDqAEMAgsgASgCtAEhBCABKAKwASEFIAJBiAFqIAYQyCUgAkGPAq1CIIZBovKaAa2ENwO4ASACQaABakHNlYABIAJBuAFqELIQIAIgAikCiAE3AqwBIAIgAigCkAE2ArQBIAUgBCACQaABahDGGyEEAkAgAS0AuAFBogFHDQAgASABEIYOEJEJCyAAQQI6ADIgACAENgIADAILIABBAjoAMiAAIAk2AgAMAgsgASABKAJ4IgZBgCByNgJ4QQAhBQJAIAEtALgBQQlHDQACQAJAIAEoAogBIgVBC0cNACACQaABaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohCgJAIAEoAghBCkYNACABQQhqEMALCyABIAU2AgggASAKKQIANwIMIAEgCigCCDYCFAsgASkDsAEhCyAEIAIpA6ABNwIAIAQgAigCqAE2AgggASALNwOoASABIAEoAngiBUH///+/f3E2AnggAkEIaiABKAKwASABEOwDIAIoAgghCiABIAU2AnggAigCDCEFIApBAXFFDQAgAEECOgAyIAAgBTYCACABIAY2AngMAQsgASAGNgJ4AkAgARCHCSIGDQACQCABLQC4ASIGQQNHDQACQAJAIAEoAogBIgZBC0cNACACQaABaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohCgJAIAEoAghBCkYNACABQQhqEMALCyABIAY2AgggASAKKQIANwIMIAEgCigCCDYCFAsgASABKAK0ASIGNgKsASABIAEoArABNgKoASAEIAIpA6ABNwIAIAQgAigCqAE2AgggACACKQNwNwMwIAAgAikDaDcDKCAAIAIpA2A3AyAgACACKQNYNwMYIAAgAikDUDcDECAAIAIpA0g3AwggACAIOgBBIAAgBzoAQCAAIAU2AjwgACAJNgI4IAAgBjYCBCAAIAM2AgAMBAsgASgCtAEhBCABKAKwASEHIAJBlAFqIAYQyCUgAkGPAq1CIIZB//SaAa2ENwO4ASACQaABakHNlYABIAJBuAFqELIQIAIgAikClAE3AqwBIAIgAigCnAE2ArQBIAcgBCACQaABahDGGyEGIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgAEECOgAyIAAgBjYCACAFRQ0AIAUQqAQgBUHgAEEIENwUCyAJRQ0AIAkQqAQgCUHgAEEIENwUCyACQcgAahCsEwsgAkHAAWokAAv2HAITfwV+IwBB8AFrIgQkACAEQZABaiABELYIIAQoApgBIQUCQAJAIAQpA5ABIhdCAFINAEEBIQEMAQsCQAJAIAEtALgBIgZBAkcNACAEKAKcASEHAkACQCABKAKIASIGQQtHDQAgBEGQ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AkACQCABLQC4ASIFDQACQAJAIAEoAogBIgVBC0cNACACQaABaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohBgJAIAEoAghBCkYNACABQQhqEMALCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhCyADIAIpA6ABNwIAIAMgAigCqAE2AgggASALNwOoASABLQC4ASIFQcAARg0CIAVBogFGDQEgASgCtAEhBSABKAKwASEGIAEQtRAgAkGSgYCAeDYCoAEgASAGIAUgAkGgAWoQ7h0QuSUhCyACIAU2AiQgAiAGNgIgIAJCocSIATcDKCACIAs3AxgMAwsgASgCtAEhAyABKAKwASEGIAJBDGogBRDIJSACQY8CrUIghkGftoEBrYQ3A2ggAkGgAWpBzZWAASACQegAahDOCCACIAIpAgw3AqwBIAIgAigCFDYCtAEgBiADIAJBoAFqEMYbIQMCQCABLQC4AUGiAUcNACABIAEQhg4QkQkLIABBBDoANCAAIAM2AgAMAwsgASkDCCELIAFBCjYCCCACIAEpAxA3A6gBIAIgCzcDoAECQAJAIAunIgVBCkYNACAFQQlGDQEgAkGgAWoQwAsLQajzmgFBKEH4h5sBELkhAAsgAigCpAEhBQJAAkAgASgCiAEiBkELRw0AIAJBoAFqIAEQxAEMAQsgAUELNgKIASABIAY2AgggASABKQKMATcCDCABIAEoApQBNgIUIAIgASkCmAE3A6ABIAIgASgCoAE2AqgBCyABKQOwASELIAMgAikDoAE3AgAgAyACKAKoATYCCCABIAs3A6gBIABBBDoANCAAIAU2AgAMAgsgAkEYaiABEJYKC0EAIQUCQAJAAkAgAS0AuAEiBkEHRw0AAkACQCABKAKIASIGQQtHDQAgAkGgAWogARDEAQwBCyABQQs2AogBIAIgASkCmAE3A6ABIAIgASgCoAE2AqgBIAFBjAFqIQcCQCABKAIIQQpGDQAgAUEIahDACwsgASAGNgIIIAEgBykCADcCDCABIAcoAgg2AhQLIAEpA7ABIQsgAyACKQOgATcCACADIAIoAqgBNgIIIAEgCzcDqAEgAS0AuAEiBkECRw0AIAEoArABIQcCQAJAIAEoAogBIgVBC0cNACACQaABaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohBgJAIAEoAghBCkYNACABQQhqEMALCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhCyADIAIpA6ABNwIAIAMgAigCqAE2AgggASALNwOoAQJAAkACQAJAAkACQCABLQC4ASIFQfAARw0AAkACQCABKAKIASIFQQtHDQAgAkGgAWogARDEAQwBCyABQQs2AogBIAIgASkCmAE3A6ABIAIgASgCoAE2AqgBIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahDACwsgASAFNgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEpA7ABIQsgAyACKQOgATcCACADIAIoAqgBNgIIIAEgCzcDqAEgAS0AuAEiBUEJRw0CAkACQCABKAKIASIFQQtHDQAgAkGgAWogARDEAQwBCyABQQs2AogBIAIgASkCmAE3A6ABIAIgASgCoAE2AqgBIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahDACwsgASAFNgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEpA7ABIQsgAyACKQOgATcCACADIAIoAqgBNgIIIAEgCzcDqAEgASABKAJ4IgVB//97cTYCeCACQaABaiABEJUBIAEgBTYCeCACKAKkASEFAkAgAigCoAEiBkEyRw0AIAUhAwwGCyACIAIpA9gBNwOYASACIAIpA9ABNwOQASACIAIpA8gBNwOIASACIAIpA8ABNwOAASACIAIpA7gBNwN4IAIgAikDsAE3A3AgAiACKQOoATcDaCAGQQ5HDQMgAiACKQNwNwJgIAIgAikDaDcCWCACIAU2AlQCQCABLQC4ASIGQQdHDQACQAJAIAEoAogBIgZBC0cNACACQaABaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohCAJAIAEoAghBCkYNACABQQhqEMALCyABIAY2AgggASAIKQIANwIMIAEgCCgCCDYCFAsgASkDsAEhCyADIAIpA6ABNwIAIAMgAigCqAE2AgggASALNwOoASABLQC4ASEGCwJAIAZB/wFxQQNHDQACQAJAIAEoAogBIgVBC0cNACACQaABaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohBgJAIAEoAghBCkYNACABQQhqEMALCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASABKAK0ASIINgKsASABIAEoArABNgKoASADIAIpA6ABNwIAIAMgAigCqAE2AghBFBCKASIFDQJBBEEUEKIkAAsgASgCtAEhAyABKAKwASEEIAJB5AFqIAYQyCUgAkGPAq1CIIZB//SaAa2ENwNoIAJBoAFqQc2VgAEgAkHoAGoQzgggAiACKQLkATcCrAEgAiACKALsATYCtAEgBCADIAJBoAFqEMYbIQMCQCABLQC4AUGiAUcNACABIAEQhg4QkQkLIAJB1ABqEMAVIAUgAigCWBD9IwwFCyABKAK0ASEDIAEoArABIQYgAkE8aiAFEMglIAJBjwKtQiCGQdn/mgGthDcDaCACQaABakHNlYABIAJB6ABqEM4IIAIgAikCPDcCrAEgAiACKAJENgK0ASAGIAMgAkGgAWoQxhshAyABLQC4AUGiAUcNBAwDCyAFIAIoAmQ2AhAgBSACKQJcNwIIIAUgAikCVDcCACABLQC4ASEGDAULIAEoArQBIQMgASgCsAEhBiACQcgAaiAFEMglIAJBjwKtQiCGQef0mgGthDcDaCACQaABakHNlYABIAJB6ABqEM4IIAIgAikCSDcCrAEgAiACKAJQNgK0ASAGIAMgAkGgAWoQxhshAyABLQC4AUGiAUcNAgwBC0Go85oBQShB3P+aARC5IQALIAEgARCGDhCRCQsgAEEEOgA0IAAgAzYCAAwCCwsCQAJAAkACQAJAIAZB/wFxQQFHDQACQAJAIAEoAogBIgZBC0cNACACQaABaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohCQJAIAEoAghBCkYNACABQQhqEMALCyABIAY2AgggASAJKQIANwIMIAEgCSgCCDYCFAsgASkDsAEhCyADIAIpA6ABNwIAIAMgAigCqAE2AgggASALNwOoASABLQC4ASIGQQhHDQECQAJAIAEoAogBIglBC0cNACACQaABaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDoAEgAiABKAKgATYCqAEgAUGMAWohCgJAIAEoAghBCkYNACAB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IAIoAgBBB0YNACACIAEQzgoLIAJBKGohAiAFQVhqIgUNAAwFCwsgAigCBCABEM4KDAMLIAJBDGooAgAiBUUNAiAFQThsIQYgAkEIaigCACEHQQAhAgNAAkACQAJAAkAgByACaiIFKAIADgMAAQIACwJAIAVBCGooAgBBA0cNACAFQQxqKAIAIAEQugELIAVBKGooAgAgARDOCgwCCyAFQTBqKAIAIgVFDQEgBSABELoBDAELIAVBBGooAgAgARDOCgsgBiACQThqIgJHDQAMAwsLIAIoAgQgARDOCiACKAIIIAEQugEMAQsgAigCBCABELoBCyADIARHDQAMAgsLAkACQAJAAkACQAJAAkACQAJAAkAgAg4LCgABAgMEBQYHCAoKCyAAKAIoIAEQugEgACgCCEECRw0JIABBDGohAgwICyAAKAIIQQFHDQggAEEMaiECDAcLIABBBGohAgwGCwJAIAAoAgQiAigCACIDQQNHDQAgAigCECABELoBIAJBDGooAgAiA0UNByADQQR0IQMgAkEIaigCAEEMaiECA0AgAigCACABELoBIAJBEGohAiADQXBqIgMNAAwICwsgAigCICABELoBIANBAkcNBiACQQRqIQIMBQsgAEEEaiECDAQLIABBBGohAgwDCyAAQQRqIQIMAgsgAEEEaiECDAELIABBBGohAgsgAigCACABELoBCyAAKAI4IQAMEQsgACgCKCABELoBIAAoAghBAkcNEiAAKAIMIQAMEAsgACgCCEEBRw0RIAAoAgwhAAwPCyAAKAIEIAEQugEgACgCCCABELoBIAAoAgwhAAwOCwJAIAAtABhBBUcNACAAKAIQIAEQugELIAAoAgwiAkUNDyACQQR0IQIgACgCCEEMaiEAA0AgACgCACABELoBIABBEGohACACQXBqIgINAAwQCwsgACgCECABELoBIAAoAgRBgICAgHhGDQ4gACgCDCICRQ0OIAJBBHQhAiAAKAIIQQxqIQADQCAAKAIAIAEQugEgAEEQaiEAIAJBcGoiAg0ADA8LCyAAKAIMIgJFDQ0gAkECdCECIAAoAgghAANAIAAoAgAgARC6ASAAQQRqIQAgAkF8aiICDQAMDgsLIAAoAgwiAkUNDCACQQJ0IQIgACgCCCEAA0AgACgCACABELoBIABBBGohACACQXxqIgINAAwNCwsg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C68YAgV/AX4CQAJAAkACQAJAAkADQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiAkF0akEHIAJBC0sbDiYfAAECAwQFBgcICQoLDA0fDg8QERIfExMUHx8VFhcYGBobHB8dHx8LIAAoAgwiAkUNHiACQQR0IQIgACgCCCEAA0ACQCAAKAIAQQJGDQAgAEEMaigCACABEL0BCyAAQRBqIQAgAkFwaiICDQAMHwsLIAAoAgwiAkUNHSACQQxsIQIgACgCCCEAA0ACQAJAIAAoAgAiAw0AIABBBGooAgAgARC+BAwBCyADIAEQvQELIABBDGohACACQXRqIgINAAweCwsgASAAQQhqEOQGDwsgACgCBCEADBULIAAoAgwhAAwUCyAAKAIEIAEQvQEgACgCCCEADBMLAkACQCACQQtHDQACQAJAAkAgACgCBA4DAAEEAAsgACgCECICRQ0BIAJBKGwhAyAAKAIMIQIDQAJAIAIoAgBBB0YNACACIAEQ4gsLIAJBKGohAiADQVhqIgMNAAwCCwsgACgCECICRQ0AIAJBOGwhBCAAKAIMIQVBACEDA0ACQAJAAkACQCAFIANqIgIoAgAOAwABAgALAkAgAkEIaigCAEEDRw0AIAJBDGooAgAgARC9AQsgAkEoaigCACABEOILDAILIAEgAkEQahCrFSACQTBqKAIAIgJFDQEgAiABEL0BDAELIAJBBGooAgAgARDiCyACQRhqKAIAIgJFDQAgAigCACABEJoCCyAEIANBOGoiA0cNAAsLIAAoAhwiAkUNASACKAIAIAEQmgIgACgCOCEADBQLAkACQAJAAkACQAJAAkACQAJAAkAgAg4LAAECAwQFBgcICQoACyABIABBCGoQqxUgACgCOCEADBwLIAAoAiggARC9ASAAKAIIQQJHDQggACgCDCABEL0BIAAoAjghAAwbCyAAKAIIQQFHDQcgACgCDCABEL0BIAAoAjghAAwaCyAAKAIEIAEQvQEgACgCOCEADBkLAkAgACgCBCIEKAIAIgJBA0cNACAEKAIQIAEQvQECQCAEQQxqKAIAIgJFDQAgAkEEdCEDIARBCGooAgBBDGohAgNAIAIoAgAgARC9ASACQRBqIQIgA0FwaiIDDQALCyAEKAIgIgJFDQYg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bWpBAUsNACAGQRJHDQAgAi0AFEEYRw0AIARBuICAgHg2AjggASAJIAUgBEE4ahDuHQsCQEHAABCKASIBRQ0AIAEgBzoAFCABIAU2AhAgASAJNgIMIAEgCDYCCCABIAI2AgQgAUESNgIAIAAgAzoABSAAQQE6AAQgACABNgIADAMLQQhBwAAQoiQACyAAQQI6AAQgACAINgIACyACEI0CIAJBwABBCBDcFAsgBEHQAGokAAumFwEEfwJAAkACQANAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4TABAQAQIDEBAEBQ8ODAsKCQgHBgALIAAoAgwiAkUNDyACQTBsIQIgACgCCCEAA0AgACABEM0BIABBMGohACACQVBqIgINAAwQCwsgACgCBCICIAEQXAJAIAIoAgBBGkcNACABIAJBCGoQlAsiA0UNACACEIgCIAIgAykDODcDOCACIAMpAzA3AzAgAiADKQMoNwMoIAIgAykDIDcDICACIAMpAxg3AxggAiADKQMQNwMQIAIgAykDCDcDCCACIAMpAwA3AwAgA0HAAEEIENwUCyAAKAIIIQAMCwsgACgCDCIARQ0NIAAgARBcIAAoAgBBGkcNDSABIABBCGoQlAsiAUUNDSAAEIgCIAAgASkDODcDOCAAIAEpAzA3AzAgACABKQMoNwMoIAAgASkDIDcDICAAIAEpAxg3AxggACABKQMQNwMQIAAgASkDCDcDCCAAIAEpAwA3AwAgAUHAAEEIENwUDwsgACgCKCEADAkLIAAoAgQiAiABEFwCQCACKAIAQRpHDQAgASACQQhqEJQLIgNFDQAgAhCIAiACIAMpAzg3AzggAiADKQMwNwMwIAIgAykDKDcDKCACIAMpAyA3AyAgAiADKQMYNwMYIAIgAykDEDcDECACIAMpAwg3AwggAiADKQMANwMAIANBwABBCBDcFAsgACgCCCABEM0BIAAoAhQiAA0IDAsLIAAoAhAiAiABEFwCQCACKAIAQRpHDQAgASACQQhqEJQLIgNFDQAgAhCIAiACIAMpAzg3AzggAiADKQMwNwMwIAIgAykDKDcDKCACIAMpAyA3AyAgAiADKQMYNwMYIAIgAykDEDcDECACIAMpAwg3AwggAiADKQMANwMAIANBwABBCBDcFAsgACgCDCICRQ0KIAAoAggiAyAC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ASIIQQFHDQACQAJAIAooAgAiCEELRw0AIANBwAFqIAEQxAEMAQsgAUELNgKIASADIAEpApgBNwPAASADIAEoAqABNgLIASABQYwBaiEJAkAgASgCCEEKRg0AIAwQwAsLIAEgCDYCCCABIAkpAgA3AgwgASAJKAIINgIUCyABKQOwASEZIAcgAykDwAE3AgAgByADKALIATYCCCABIBk3A6gBQQEhEkEAIRYMAQsgASgCtAEhCSABKAKwASEPIANB8AFqIAgQyCUgA0GPAq1CIIZBwvCaAa2ENwPgASADQcABakHNlYABIANB4AFqELIQIAMgAykC8AE3AswBIAMgAygC+AE2AtQBIA8gCSADQcABahDGGyEJIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgA0GIAWohCCABIANB2ABqEMsIIAcgDSgCCDYCCCAHIA0pAwA3AwACQCABKAKIAUEOcUEKRg0AIAoQwAsLIAEgEzYCrAEgASAONgKoASAKIAgpAxg3AxggCiAIKQMQNwMQIAogCCkDCDcDCCAKIAgpAwA3AwACQCAWRQ0AIBINASAJQQhqEOYDIAlBIEEIENwUDAELIANBkYGAgHg2AlggASALIAsgA0HYAGoQ7h0gASgCrAEhCEEEQRwQ5CAiEiAGOgAZQQAhASASQQA6ABggEkEANgIUIBIgCDYCECASIAQ2AgwgEkEANgIIIBJCgICAgIABNwIAQQBBCBD4IwwBCyADQdgAakEEQQhBOBCFDyADKAJcIQgCQCADKAJYRQ0AIAggAygCYBD+IAALQQAhFiADQQA2AiQgAyADKAJgIg42AiAgAyAINgIcAkACQAJAIAEtALgBQQZHDQAgASgCrAEhCCABKAKoASESDAELIAFBDGohEEEIIQ0gAUEIaiEPIAFBmAFqIREgAUGMAWohFCADQdgAakEIaiEJA0ACQAJAIAVFDQAgA0HYAGogASACIAYQngMMAQsgASABKAJ4IghBwAByNgJ4IANB2ABqIAEgAiAGEJ4DIAEgCDYCeAsgAygCXCESAkAgAygCWCITQQdHDQAgAygCICIBIBYQ/BogAygCHCABEPgjQQEhAQwECyADIAkpAyg3A1AgAyAJKQMgNwNIIAMgCSkDGDcDQCADIAkpAxA3AzggAyAJKQMINwMwIAMgCSkDADcDKAJAIBYgAygC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QQpGDQAgCBDACwsgCCAPNgIAIAYgCikCADcCACAGIAooAgg2AggLIAEpA7ABIRkgBCADKQN4NwIAIAQgAygCgAE2AgggASAZNwOoAQJAAkACQAJAAkACQCABLQC4AQ0AAkACQCABKAKIASIPQQtHDQAgA0H4AGogARDEAQwBCyABQQs2AogBIAMgCSkCADcDeCADIAkoAgg2AoABAkAgASgCCEEKRg0AIAgQwAsLIAggDzYCACAGIAopAgA3AgAgBiAKKAIINgIICyABKQOwASEZIAQgAykDeDcCACAEIAMoAoABNgIIIAEgGTcDqAEgA0EIaiABELgDIAMoAgwhECADKAIIQQFxDQ0gAyAQNgIoIAEtALgBIg9BAUcNAyABKAKIASIPQQtHDQEgA0H4AGogARDEAQwCCyADQfgAaiABQQBBABCbAyADLQCMAUECRg0LIAMgAykDiAE3A1AgAyADKQOAATcDSCADIAMpA3g3A0BBwAAQigEiD0UNAyAPQRo2AgAgDyADKQNANwMIIA8gAykDSDcDECAPIAMpA1A3AxggDyADKQNYNwMgIA8gAykDYDcDKCAPIAMpA2g3AzAgDyADKQNwNwM4IANBEGogASAPQQAQQyADKAIUIRAgAygCEEEBcQ0MDAQLIAFBCzYCiAEgAyAJKQIANwN4IAMgCSgCCDYCgAECQCABKAIIQQpGDQAgCBDACwsgCCAPNgIAIAYgCikCADcCACAGIAooAgg2AggLIAEpA7ABIRkgBCADKQN4NwIAIAQgAygCgAE2AgggASAZNwOoAQwCCyABKAK0ASEEIAEoArABIRAgA0EsaiAPEMglIAMgGDcDOCADQfgAakHNlYABIANBOGoQzgggCyADKAI0NgIIIAsgAykCLDcCACAQIAQgA0H4AGoQxhshEAJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgA0EoahCSIgwJC0EIQcAAEKIkAAsgAS0AuAEhDwJAAkACQAJAAkACQCABLQCBAUEgcUUNACAPQf8BcUESRw0AIAMgARCvAyADKAIEIRECQCADKAIAQQFxRQ0AIBEhEgwDCwJAAkAgASgCiAEiD0ELRw0AIANB+ABqIAEQxAEMAQsgAUELNgKIASADIAkpAgA3A3ggAyAJKAIINgKAAQJAIAEoAghBCkYNACAIEMALCyAIIA82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IAEoAjQhDyABKAIoIQILIAEoAmghECABLQAdIRFBCyESAkAgBCgCACIGQQtGDQAgAUGYAWohE0EKIRICQCAGQQpGDQAgA0GYAWogBBCVBiADIAMpApwBNwPAASADIAMoAqQBNgLIASADKAKYASESCyADIAMpA8ABNwOYASADIAMoAsgBNgKgASADIBMoAgg2AqwBIAMgEykCADcCpAELIAMgCTYCOCADIAs2AjQgAyAMNgIwIAMgAykD0AE3AjwgAyADKALYATYCRCADIBA2AlwgAyAPNgJUIAMgAjYCUCADIBE6AE0gAyANOgBMIAMgCjYCSCADIAEoAqwBIgs2AoQBIAMgASgCqAEiDDYCgAEgAyAINgJYIAMgEjYCYCADIAEoArgBNgKQASADIAEpA7ABNwOIASADIAMpA5gBNwJkIAMgAykDoAE3AmwgAyADKQOoATcCdCADIAMoArABNgJ8IAEgCEEBcjYCeCABQbABaiECIAEoArABIQoCQAJAIAZBC0cNACADQdABaiABEMQBDAELIAFBCzYCiAEgAyABKQKYATcD0AEgAyABKAKgATYC2AEgAUGMAWohDwJAIA5BCkYNACAHEMALCyABIAY2AgggASAPKQIANwIMIAEgDygCCDYCFAsgA0HgAGohBiADQYgBaiEPIAEpA7ABIRQgAiADKQPQATcCACACIAMoAtgBNgIIIAEgFDcDqAEgA0GYAWogASAKEMIBAkACQAJAIAMoApgBIgpBgICAgHhqDgIBAAQLIAEgA0EwahDLCCACIA8oAgg2AgggAiAPKQMANwMAAkAgASgCiAFBDnFBCkYNACAEEMALCyABIAs2AqwBIAEgDDYCqAEgBCAGKQMYNwMYIAQgBikDEDcDECAEIAYpAwg3AwggBCAGKQMANwMAIAMoApwBIgJBCGoQ5gMgAkEgQQgQ3BQMAQsgASADQTBqEMsIIAIgDygCCDYCCCACIA8pAwA3AwACQCABKAKIAUEOcUEKRg0AIAQQwAsLIAEgCzYCrAEgASAMNgKoASAEIAYpAxg3AxggBCAGKQMQNwMQIAQgBikDCDcDCCAEIAYpAwA3AwALIAQoAgAhBgsgBkELRg0DDAQLIAEgASgCeEF+cSAIQQFxcjYCeCADIAMoArwBNgIoIAMgAykCtAE3AyAgAyADKQKsATcDGCADIAMp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AwwUCyADQSxqIQQgA0EoaiEDDBMLIANBCGohBCADQQRqIQMMEgsgAygCBCIDQQRqIQQMEQsgA0EUaiEEIANBEGohAwwQCyADQRBqIQQgA0EMaiEDDA8LIANBDGohBCADQQhqIQMMDgsgA0EMaiEEIANBCGohAwwNCyADQRBqIQQgA0EMaiEDDAwLIANBEGohBCADQQxqIQMMCwsgA0EQaiEEIANBDGohAwwKCyADQRRqIQQgA0EQaiEDDAkLIANBDGohBCADQQhqIQMMCAsgA0EIaiEEIANBBGohAwwHCyADQRxqIQQgA0EYaiEDDAYLIANBEGohBCADQQxqIQMMBQsgA0EQaiEEIANBDGohAwwECyADQRRqIQQgA0EQaiEDDAMLIANBFGohBCADQRBqIQMMAgsgA0EkaiEEIANBIGohAwwBCyADQSRqIQQgA0EgaiEDCyABKAIMIQUgASgCCCEGIAQoAgAhByADKAIAIQhBwAAQigEiBEUNAUEAIQkgBEEANgIIIARCMTcDACABKAIEIQMgASAENgIEIAIgAykDADcDACACIAMpAwg3AwggAiADKQMQNwMQIAIgAykDGDcDGCACIAMpAyA3AyAgAiADKQMoNwMoIAIgAykDMDcDMCACIAMpAzg3AzggARDnASABIAIpAzg3AzggASACKQMwNwMwIAEgAikDKDcDKCABIAIpAyA3AyAgASACKQMYNwMYIAEgAikDEDcDECABIAIpAwg3AwggASACKQMANwMAIANBwABBCBDcFCAIQd3L3Z55bCAHakHdy92eeWxBD3chCiAAKAIIIQsgACgCBCEMAkAgACgCFA0AIABBDGogDCALENQEGgsgACgCECINIApxIQ4gCkEZdiIPrUKBgoSIkKDAgAF+IRQgACgCDCEEQQAhEEEAIREDQCAEIA5qKQAAIhUgFIUiFkJ/hSAWQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIRYCQANAIBZQDQEgBCAWeqdBA3YgDmogDXFBAnRrQXxqKAIAIgMgC08NBSAWQn98IBaDIRYgCCAMIANBFGxqIhIoAgBHDQAgByASQQRqKAIARw0ACyADIAAoAggiBE8NBSAAKAIEIANBFGxqIgMgBTYCDCADIAY2AggMCQsCQAJAAkACQCARDQACQCAVQoCBgoSIkKDAgH+DIhZQDQAgFnqnQQN2IA5qIA1xIRMMAgtBACEJQQAhEQwCC0EBIREgCUEBcSEDQQAhCSADRQ0BIBVCgIGChIiQoMCAf4MhFgsgFiAVQgGGg0IAUg0BQQEhCUEBIRELIA4gEEEIaiIQaiANcSEODAELCwJAIAQgE2osAAAiA0EASA0AIAQgBCkDAEKAgYKEiJCgwIB/g3qnQQN2IhNqLQAAIQMLIAAoAgghDiAEIBNqIA86AAAgBCANIBNBeGpxakEIaiAPOgAAIAQgE0ECdGtBfGogDjYCACAAIAAoAhQgA0EBcWs2AhQgACAAKAIYQQFqNgIYIAAoAggiAyAAKAIARw0GIAAoAhggACgCFGoiBEHmzJkzIARB5syZM0kbIANrIgRBAU0NBSAAIAMgBEEEQRQQ3BEhBCAAKAIIIQMgBEGBgICAeEcNBQwGCyABKAIIIQ5BwAAQigEiBEUNAyAEQQA2AgggBEIxNwMAIA4oAgAhAyAOIAQ2AgAgAiADKQMANwMAIAIgAykDCDcDCCACIAMpAxA3AxAgAiADKQMYNwMYIAIgAykDIDcDICACIAMpAyg3AyggAiADKQMwNwMwIAIgAykDODcDOCABEOcBIAEgAikDODcDOCABIAIpAzA3AzAgASACKQMoNwMoIAEgAikDIDcDICABIAIpAxg3AxggASACKQMQNwMQIAEgAikDCDcDCCABIAIpAwA3AwAgA0HAAEEIENwUDAYLQQhBwAAQoiQACyADIAtBwOKZARD+FgALIAMgBEH8oZoBEP4WAAtBCEHAABCiJAALIAAgA0EBQQRBFBDdESAAKAIIIQMLAkAgAyAAKAIARw0AIAAQzRoLIAAoAgQgA0EUbGoiBCAKNgIQIAQgBTYCDCAEIAY2AgggBCAHNgIEIAQgCDYCACAAIANBAWo2AggMAAsLqBMCA38BfiMAQfAAayIGJAAgBiAENwNAIAZBOGogBkHAAGoQkxQgBigCOCEHAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAGKAI8QXxqDgYBEgMSAAISCyAHKQAAQuHEzaOnrtix9ABSDREgBQ0MIAEtALgBQdAARw0RIAEtALkBQQFxDREMDQsgBygAAEHl3NXrBkcNAyABLQCBAUEgcUUNECAFDQkgASgCeCEFAkACQCABLQC4ASIHQbV/aiIIQR9LDQBBASAIdEGBgIKQeHENAQsgB0G0f2pB/wFxQdQASw0RCyAHIAUQ5A0NEAwKCyAHKQAAQunc0aumztmw4wCFIAdBCGoiCDEAAELlAIWEQgBSDQEgBQ0GIAEoAnghBQJAAkAgAS0AuAEiB0G1f2oiCEEfSw0AQQEgCHRBgYCCkHhxDQELIAdBtH9qQf8BcUHUAEsNEAsgByAFEOQNDQ8MBwsgBygAAEHt3pGrB3MgB0EEai8AAEHsygFzcg0OIAEtALkBQQFxRQ0EDA4LIAcpAABC7sK1q7aO3LDjAIUgCDEAAELlAIWEQgBSDQ0gBQ0BIAEoAnghBQJAAkAgAS0AuAEiB0G1f2oiCEEfSw0AQQEgCHRBgYCCkHhxDQELIAdBtH9qQf8BcUHUAEsNDgsgByAFEOQNDQ0MAgsgBygAAEH08sGrBkcNDAJAAkAgBQ0AIAEtALkBDQ4gASgCeCEFAkACQCABLQC4ASIHQbV/aiIIQR9LDQBBASAIdEGBgIKQeHENAQsgB0G0f2pB/wFxQdQASw0PCyAHIAUQ5A0NDgwBCwJAAkAgASgCiAEiB0ELRw0AIAZByABqIAEQxAEMAQsgAUELNgKIASAGIAEpApgBNwNIIAYgASgCoAE2AlAgAUGMAWohBQJAIAEoAghBCkYNACABQQhqEMALCyABIAc2AgggASAFKQIANwIMIAEgBSgCCDYCFAsgASAGKAJQNgK4ASABIAEpA7ABNwOoASABIAYpA0g3ArABCyAGQRBqIAEgAhDNByAGKAIUIQEgBigCEEEBRw0KIABBCTYCACAAIAE2AgQMCwsCQAJAIAEoAogBIgdBC0cNACAGQcgAaiABEMQBDAELIAFBCzYCiAEgBiABKQKYATcDSCAGIAEoAqABNgJQIAFBjAFqIQUCQCABKAIIQQpGDQAgAUEIahDACwsgASAHNgIIIAEgBSkCADcCDCABIAUoAgg2AhQLIAEgBigCUDYCuAEgASABKQOwATcDqAEgASAGKQNINwKwAQsgBkEgaiABIAJBARDtBCAGKAIkIQECQCAGKAIgQQFHDQAgAEEJNgIAIAAgATYCBAwKCyAAIAE2AgQgAEEHNgIADAkLIAVFDQYCQAJAIAEoAogBIgdBC0cNACAGQcgAaiABEMQBDAELIAFBCzYCiAEgBiABKQKYATcDSCAGIAEoAqABNgJQIAFBjAFqIQgCQCABKAIIQQpGDQAgAUEIahDACwsgASAHNgIIIAEgCCkCADcCDCABIAgoAgg2AhQLIAEgBigCUDYCuAEgASABKQOwATcDqAEgASAGKQNINwKwAQwGCwJAAkAgASgCiAEiB0ELRw0AIAZByABqIAEQxAEMAQsgAUELNgKIASAGIAEpApgBNwNIIAYgASgCoAE2AlAgAUGMAWohBQJAIAEoAghBCkYNACABQQhqEMALCyABIAc2AgggASAFKQIANwIMIAEgBSgCCDYCFAsgASAGKAJQNgK4ASABIAEpA7ABNwOoASABIAYpA0g3ArABCyAGQRhqIAEgAhC6AyAGKAIcIQECQCAGKAIYQQFHDQAgAEEJNgIAIAAgATYCBAwHCyAAIAE2AgQgAEEENgIADAYLIAEQtRALIAZBCGogASACQQAQsQEgBigCDCEBAkAgBigCCEEBRw0AIABBCTYCACAAIAE2AgQMBQsgACABNgIEIABBBjYCAAwECwJAAkAgASgCiAEiB0ELRw0AIAZByABqIAEQxAEMAQsgAUELNgKIASAGIAEpApgBNwNIIAYgASgCoAE2AlAgAUGMAWohBQJAIAEoAghBCkYNACABQQhqEMALCyABIAc2AgggASAFKQIANwIMIAEgBSgCCDYCFAsgASAGKAJQNgK4ASABIAEpA7ABNwOoASABIAYpA0g3ArABCyAGQcgAaiABIAIgA0EBELUHQQkhASAGKAJMIQMCQCAGKAJIIgdBCEYNACAAIAYpA2g3AyAgACAGKQNgNwMYIAAgBikDWDcDECAAIAYpA1A3AwggByEBCyAAIAE2AgAgACADNgIEIARCA4NCAFINBCAEpyIBIAEoAgAiA0F/ajYCACADQQFHDQQgASABKAIQEPAeDAQLAkACQAJAAkAgAS0AuAEiB0HefmoOAgACAQsgASkDCCEJIAFBCjYCCCAGIAEpAxA3A1AgBiAJNwNIAkACQCAJpyIHQQpGDQAgB0EJRg0BIAZByABqEMALC0Go85oBQShB+IebARC5IQALIAYoAkwhBwJAAkAgASgCiAEiBUELRw0AIAZByABqIAEQxAEMAQsgAUELNgKIASABIAU2AgggASABKQKMATcCDCABIAEoApQBNgIUIAYgASkCmAE3A0ggBiABKAKgATYCUAsg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wAsLIAEgBTYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABIAEoArQBIgc2AqwBIAEgASgCsAEiCDYCqAEgAyACKQNgNwIAIAMgAigCaDYCCAJAAkACQCABLQC4ASIFDQACQAJAIAEoAogBIgVBC0cNACACQeAAaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDYCACIAEoAqABNgJoIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahDACwsgASAFNgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEpA7ABIRMgAyACKQNgNwIAIAMgAigCaDYCCCABIBM3A6gBIAEgASgCeCIFQb///19xQcAAcjYCeCACIAEQuAMgAigCACEGIAEgBTYCeCACKAIEIQkgBkEBcUUNASAIIAcgCRDdEiEBIABBADYCACAAIAE2AgQMAgsgASgCtAEhAyABKAKwASEGIAJBCGogBRDIJSACQY8CrUIghkGftoEBrYQ3AyAgAkHgAGpBzZWAASACQSBqEM4IIAIgAikCCDcCbCACIAIoAhA2AnQgBiADIAJB4ABqEMYbIQUCQCABLQC4AUGiAUcNACABIAEQhg4QkQkLIABBADYCACAAIAU2AgQMAQsCQAJAAkACQCABLQC4ASIFQQFHDQACQAJAIAEoAogBIgVBC0cNACACQeAAaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDYCACIAEoAqABNgJoIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahDACwsgASAFNgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEpA7ABIRMgAyACKQNgNwIAIAMgAigCaDYCCCABIBM3A6gBIAEgASgCeCIFQf///999cTYCeCACQaABaiABEI4KIAEgBTYCeCACKAKgAUETRg0BQTAQigEiCg0CQQhBMBCiJAALIAEoArQBIQMgASgCsAEhBiACQRRqIAUQyCUgAkGPAq1CIIZBwvCaAa2ENwMgIAJB4ABqQc2VgAEgAkEgahDOCCACIAIpAhQ3AmwgAiACKAIcNgJ0IAYgAyACQeAAahDGGyEFAkAgAS0AuAFBogFHDQAgASABEIYOEJEJCyAAQQA2AgAgACAFNgIEDAILIAAgAigCpAE2AgQgAEEANgIADAELIAogAikDyAE3AyggCiACKQPAATcD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LQDUAiEBIAIoAtACIgVBIkYNAyAAQQVqIAJB0AJqQQVqQTv8CgAAIAAgAToABCAAIAU2AgAMCAsgACACKQOwAjcCGCAAIAIpA6gCNwIQIAAgAikDoAI3AgggAEEFOgAgIABCooCAgLCAgICAfzcCAAwHCyAAIAIpA7ACNwIYIAAgAikDqAI3AhAgACACKQOgAjcCCCAAQQg6ACAgAEKigICAsICAgIB/NwIADAYLIAAgAikDsAI3AhggACACKQOoAjcCECAAIAIpA6ACNwIIIABBCToAICAAQqKAgICwgICAgH83AgAMBQsgAUH/AXFBDEYNACACIAQoAgg2AswCIAIgBCkCADcCxAIgASEDCyAAIAIpA8gCNwIYIAAgAikDwAI3AhAgACACKQO4AjcCCCAAIAM6ACAgAEKigICAsICAgIB/NwIADAMLAkAgAy0AZQ0AIAJB2ABqIAEQkA4gAiACKAJsNgJUIAIgAikCZDcCTCACIAIpAxA3A0AgAiACKAIYNgJIIAJBIDYCkAEgAkHQAmogASgCBCABKAIIIAJBwABqIAJBkAFqEN4OIAAgAkHQAmpBwAD8CgAADAMLIAJBIGogARCGBiAAQqKAgICggICAgH83AgAgACACKQIwNwIYIAAgAikCODcCICACIAIpAxA3AiQgACACKQIgNwIIIAIgAigCGDYCLCAAIAIpAig3AhAMAgsgAkEMakHQ2okBQdTaiQEQzBwACyACQYACaiABELwMIABCooCAgNCAgICAfzcCACAAIAIpAxAiBjcCCCAAIAIpA5ACNwIYIAAgAigCmAI2AiAgAiACKAIYNgKIAiAAIAIpA4gCNwIQIAIgBjcDgAILIAJBkANqJAALzhACDn8EfiMAQYACayICJAACQAJAAkACQAJAAkAgAS0AFCIDQQJGDQBBACEEIAJBADYBUiACQQA2AgwgAkKAgICAgAE3AgQgAkKAgICAgAE3AkAgAkKAgICAwAA3AjAgAkEANgJIIAJBADoAPCACQQA2AjggAiAALwF4OwFQIAIgACgCdDYCTCACQQApA6ClnAEiEDcCECACQQApA6ilnAEiETcCGCACIBA3AiAgAiARNwIoIAIgAC0AfjoAViAAQSxqIQUCQANAIARB1ABGDQEgACAEakEsaiIGKAIAIQcgBiACQQRqIARqIggoAgA2AgAgCCAHNgIAIARBBGohBAwACwsgASgCECEJAkAgASkDACIQQgODIhJCAFINACAQpyIEIAQoAgAiBEEBajYCACAEQX9MDQYLIAUgECAJQQEQrw5BACEEIAJBADYCYCACQoCAgICAATcCWCACQQA2AowBIAJBADoAkAEgAkEANgKcASACQQA2AaYBIAJCgICAgMAANwKEASACQoCAgICAATcClAEgAiAALwF4OwGkASACIAAoAnQ2AqABIAJBACkDoKWcASIRNwJkIAJBACkDqKWcASITNwJsIAIgETcCdCACIBM3AnwgAiAALQB+OgCqAQJAA0AgBEHUAEYNASAAIARqQSxqIgYoAgAhByAGIAJB2ABqIARqIggoAgA2AgAgCCAHNgIAIARBBGohBAwACwsgASgCGCIKKAIIIgdBBnQhBiAKKAIEIQQgAC0AfkEBcUUNAQNAIAZFDQQCQCAEKAIAIgdBfmoOAwQABAALIAZBQGohBiAEQcAAaiEEIAdBBXFBAUcNAAwDCwtBACEEIAJBADYB+gEgAkEANgK0ASACQoCAgICAATcCrAEgAkKAgICAgAE3AugBIAJCgICAgMAANwLYASACQQA2AvABIAJBADoA5AEgAkEANgLgASACIAAvAXg7AfgBIAIgACgCdDYC9AEgAkEAKQOgpZwBIhA3ArgBIAJBACkDqKWcASIRNwLAASACIBA3AsgBIAIgETcC0AEgAiAALQB+OgD+ASAAQSxqIQUgASgCGCEKAkADQCAEQdQARg0BIAAgBGpBLGoiBigCACEHIAYgAkGsAWogBGoiCCgCADYCACAIIAc2AgAgBEEEaiEEDAALCwJAIAooAhQiBEUNACAEQQxsIQcgCigCECEEIAAtAHkhCCAALQAoIQkDQCAAQQA6AHkgAEEAOgAoAkAgBCgCACIGKAIAQRpHDQAgBkEYaigCACELAkAgBikDCCIQQgODQgBSDQAgEKciDCAMKAIAIgxBAWo2AgAgDEF/TA0ICyAFIBAgCxCuCwsgBEEMaiEEIAYgABBvIAAgCToAKCAAIAg6AHkgB0F0aiIHDQALCwJAIAooAggiBEUNACAKKAIEIgsgBEEGdGohDCAALQB6IQ0gAC0AeSEOIAAtACghDwNAIABBAToAKCAAQQA6AHkgACAALQB7QQFzOgB6AkAgCygCOCIERQ0AIARB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EDcCbCACIAIpAwg3AmQgAiACKQMANwJcAkACQCABKAIAQQlGDQAgARCeBgwBCyAAELcECyABQQk2AgAgASACKQJYNwIEIAEgAikCYDcCDCABIAIpAmg3AhQgASACKQJwNwIcIAEgAikCeDcCJCABIAIpAoABNwIsIAEgAigCiAE2AjQLIAJBkAFqJAAPCwALqxACDn8DfiMAQdAAayICJAAgAUGwAWohAyABKAKwASEEAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQC4ASIFQUBqDgMFAAIBCyABKAK0ASEGIAEpAwghECABQQo2AgggAiABKQMQNwNAIAIgEDcDOCAQpyIFQQpGDQYgBUEHRw0GIAIpA0AhECACQThqEMALAkACQCABKAKIASIFQQtHDQAgAkE4aiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDOCACIAEoAqABNgJAIAFBjAFqIQcCQCABKAIIQQpGDQAgAUEIahDACwsgASAFNgIIIAEgBykCADcCDCABIAcoAgg2AhQLIAEgASgCtAEiBTYCrAEgASABKAKwATYCqAEgAyACKQM4NwIAIAMgAigCQDYCCCAEIAEoAmwiA0kNByAGIAEoAnBLDQcgASgCYCAEIANraiAGIARrEI0ZIhFCgICAgHCDIRIgEachB0ECIQMMBQsCQCAFQbV/aiIGQR9LDQBBASAGdEGBgIKQeHENAgsgBUG0f2pB/wFxQdUASQ0BIAVBBEYNAiACQThqQQRyIAUQyCUgAkHFADYCTCACQfSKmwE2AkggAkGwgICAeDYCOCABKAKwASABKAK0ASACQThqEMYbIQQCQCABLQC4AUGiAUcNACABIAEQhg4QkQkLIABBBTYCACAAIAQ2AgQMCwsgASgCtAEhBiABKQMIIRAgAUEKNgIIIAIgASkDEDcDQCACIBA3AzgCQAJAIBCnIgVBCkYNACAFQQhGDQEgAkE4ahDACwtBqPOaAUEoQZiImwEQuSEACyACKAI8IQcCQAJAIAEoAogBIgVBC0cNACACQThqIAEQxAEgASgCtAEhBSABKAKwASEIDAELIAFBCzYCiAEgASAFNgIIIAEgASkCjAE3AgwgASABKAKUATYCFCACIAEpApgBNwM4IAIgASgCoAE2AkAgBiEFIAQhCAsgASAFNgKsASABIAg2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KCACIBU3AyACQAJAIBWnIgNBCkYNACADQQVGDQEgAkEgahDACwtBqPOaAUEoQciImwEQuSEACyABKAKwASIDIAEoAmwiEUkNCSABKAK0ASIPIAEoAnBLDQkgAikDKCEWIAEoAmAgAyARa2ogDyADaxCNGSEVIAJBIGogARD4ASABIA82AqwBIAEgAzYCqAEgCSACKQIgNwIAIAkgAigCKDYCCCAPrUIghiADrYQhFyAWQiCIpyERIBanIRBBACESDAYLIAEgASgCeCIDQf+/f3E2AnggAkEgaiABKAKwAUEAIAEQZSABIAM2AnggAigCICEOIAIoArABIgNBgYCAgHhGDQEgAikCPCEWIAIpAjQhGCACKQIsIRkgAigCKCETIAIoAiQhFCACQcwBaiALQewA/AoAACACIAooAgg2AsgBIAIgCikCADcDwAFBBCESAkAgA0GAgICAeEcNACAYIRcgFiEaIBkhFSATIREgFCEQIA4hDwwGC0GgARCKASIPRQ0JIA8gFjcCHCAPIBg3AhQgDyAZNwIMIA8gEzYCCCAPIBQ2AgQgDyAONgIAIA9BJGogAkHMAWpB7AD8CgAAIA8gAzYCkAEgDyACKQPAATcClAEgDyACKALIATYCnAFBAyESDAULIAJBIGpBBHJBowEQyCUgAkEgNgI0IAJB1ISbATYCMCACQbCAgIB4NgIgIAEoArABIAEoArQBIAJBIGoQxhshDgsgDkEIahDmAyAOQSBBCBDcFAsgACACKAIcNgIIIAAgAikCFDcCACACQdACaiQADwsgASgCsAEhEiABKAK0ASERIAJBIGogARD4ASABIBE2AqwBIAEgEjYCqAEgCSACKQIgNwIAIAkgAigCKDYCCEECIRIgDiEQCyABIAM2AngLAkAgDSACKAIURw0AIAJBFGoQvhogAigCGCEECyAEIAxqIgMgGjcDACADQXhqIBc3AwAgA0FwaiAVNwMAIANBbGogETYCACADQWhqIBA2AgAgA0FkaiAPNgIAIANBYGogEjYCACAMQShqIQwgDUEBaiENDAALCyADIAIoAigQ/iAAC0H0jpsBQdYAQcyPmwEQuSEAC0EIQaABEKIkAAupDwEFfyMAQRBrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOFBISAAEC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AkACQCACLQC0ASIEQX5qDgICAAELIABBlYCAgHg2AgAgACADNgIEDAkLIAIgBDoAlAEgAiADNgKQASACQdABakEAELAcAkACQANAIAJBEGogAkGQAWoQ0A8gAigCFCEDAkACQAJAIAIoAhAOAwABBAELIAJBsAFqIAMQmwIgAigCtAEhAyACKAKwASIEQZWAgIB4Rw0BCyAAQZWAgIB4NgIAIAAgAzYCBCACQdABahCRGwwDCyACIAIpA7gBNwNgIAIgAzYCXCACIAQ2AlggAkHQAWogAkHYAGoQkxsMAAsLIAAgAigC2AE2AgwgACACKQLQATcCBCAAQZSAgIB4NgIACyACKAKQARDOIgwICyAAIAJBpAFqEMcdDAcLIAEQniRFDQMQByIDIAEQuyMhBCADEM4iAkAgBEUNACABEAhFDQQLIAIgATYCUCACQbABaiABEPYMIAIoArABIQMCQAJAAkAgAi0AtAEiBEF+ag4CAgABCyAAQZWAgIB4NgIAIAAgAzYCBAwICyACIAQ6AJwBIAIgAzYCmAEgAkEANgKQASACQaQBakEAELEcIAJBwAFqIQUgAkGYAWohBgJAAkADQCACQSBqIAYQ0A8gAigCJCEDAkACQAJAIAIoAiAOAwABBAELIAJBGGogAxCOHyACKAIYIQMgAigCHCEEIAIoApABIAIoApQBEPUiIAIgBDYClAEgAkEBNgKQASACQdgAaiADEJsCIAIoAlwhAyACKAJYIgRBlYCAgHhGDQAgAiACKQNgIgc3A9gBIAIgAzYC1AEgAiAENgLQASACQdgAaiACQZABahDUHyACKAJYQZWAgIB4Rw0BIAIoAlwhAyACQdABahCOFAsgAEGVgICAeDYCACAAIAM2AgQgAkGkAWoQ5xsMAwsgBSACKQNgNwMIIAUgAikDWDcDACACIAc3A7gBIAIgAzYCtAEgAiAENgKwASACQaQBaiACQbABahCAGAwACwsgACACKAKsATYCCCAAIAIpAqQBNwIACyACQZABahDtIQwHCyACQShqIAEQ/h0CQCACKAIoQQFHDQAgAiACKAIsIgU2AlQgAiAFEAYiAzYCaCACQQA2AmQgAkEANgJsIAJBADYCWCACIAJB1ABqNgJgIAJB9ABqIANBgIACIANBgIACSRsQsRwgAkHAAWohBgJAA0AgAkGkAWogAkHY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GSELIAEpAwghCiABQQo2AgggAiABKQMQNwMYIAIgCjcDEAJAAkAgCqciBEEKRg0AIARBBEYNASACQRBqEMALC0Go85oBQShBuIibARC5IQALIAIpAxghDAJAAkAgASgCiAEiBEELRw0AIAJBEGogARDEAQwBCyABQQs2AogBIAEgBDYCCCABIAEpAowBNwIMIAEgASgClAE2AhQgAiABKQKYATcDECACIAEoAqABNgIYCyABIAEoArQBIgg2AqwBIAEgASgCsAE2AqgBIAUgAikDEDcCACAFIAIoAhg2AgggC0KAgICAcIMhCiAMQiiIpyEBIAxCIIinIQQgC6chCSAMpyEGQQAhBSADIQcMCwsgAyABKAJsIgRJDQUgASgCtAEiBiABKAJwSw0FIAEoAmAgAyAEa2ogBiADaxCNGSEMIAEpAwghCiABQQo2AgggAiABKQMQNwMYIAIgCjcDECAKpyIEQQpGDQYgBEEHRw0GIAIpAxghCyACQRBqEMALAkACQCABKAKIASIEQQtHDQAgAkEQaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDECACIAEoAqABNgIYIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahDACwsgASAENgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEgASgCtAEiBDYCrAEgASABKAKwATYCqAEgBSACKQMQNwIAIAUgAigCGDYCCCAMQoCAgIBwgyEKIARBCHYhASALQiCIpyEIIAynIQkgC6chB0EDIQUgAyEGDAoLIAMgASgCbCIESQ0GIAEoArQBIgYgASgCcEsNBiABKAJgIAMgBGtqIAYgA2sQjRkhDCABKQMIIQogAUEKNgIIIAIgASkDEDcDGCACIAo3AxACQAJAIAqnIgRBCkYNACAEQQhGDQEgAkEQahDACwtBqPOaAUEoQZiImwEQuSEACyACKAIUIQkCQAJAIAEoAogBIgRBC0cNACACQRBqIAEQxAEMAQsgAUELNgKIASABIAQ2AgggASABKQKMATcCDCABIAEoApQBNgIUIAIgASkCmAE3AxAgAiABKAKgATYCGAsgASABKAK0ASIENgKsASABIAEoArABNgKoASAFIAIpAxA3AgAgBSACKAIYNgIIIARBCHYhASAMQiCIpyEIIAynIQdBBCEFQgAhCiADIQYMCQsgASkDCCEKIAFBCjYCCCACIAEpAxA3AxggAiAKNwMQAkACQCAKpyIEQQpGDQAgBEEJRg0BIAJBEGoQwAsLQajzmgFBKEH4h5sBELkhAAsgAigCFCEEAkACQCABKAKIASIGQQtHDQAgAkEQaiABEMQBIAEoArABIQMMAQsgAUELNgKIASABIAY2AgggASABKQKMATcCDCABIAEoApQBNgIUIAIgASkCmAE3AxAgAiABKAKgATYCGAsgASADNgKoASABIAEoArQBNgKsASAFIAIpAxA3AgAgBSACKAIYNgIIDAYLIAEoAnAQrh4hBAwFCyACQY8CrUIghiACQQ9qrYQ3AxBBx4aAASACQRBqQcyGmwEQ6xsAC0H0jpsBQdYAQcyPmwEQuSEAC0H0jpsBQdYAQcyPmwEQuSEACyACQRBqEJQiQajzmgFBKEGoiJsBELkhAAtB9I6bAUHWAEHMj5sBELkhAAsgAEEHNgIAIAAgBDYCBAwCCwsgACABOwANIAAgCDYCFCAAIAc2AhAgACAEOgAMIAAgBjYCCCAAIAM2AgQgACAFNgIAIABBD2ogAUEQdjoAACAAIAogCa2ENwMYCyACQSBqJAAL7A0BBH8jAEHQAGsiBSQAAkACQCABIAIQwg4NACAFQQRqIAJBCGoQ2xUgBUGBgMQANgIQIAUgATYCFCAFIAEgAmo2AhggBEH/AXFBAkkhBkEAIQRBASEBA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAVBEGoQgx8iAg4OCAsLCwsLCwsKBQIEAQMACyACQSJGDQYgAkEnRg0FIAJB3ABGDQggAkGAgMQARw0KIARBAXENCyAAIAUoAgw2AgggACAFKQIENwIADBgLIAVBBGpBw9yaAUECEIkHDBMLIAVBBGpBxdyaAUECEIkHDBILIAVBBGpBx9yaAUECEIkHDBELIAVBBGpB8tSYAUECEIkHDBALIAVBBGpBCRD+HAwPCyAFQQRqQScQ/hwMDgsgBUEEakEiEP4cDA0LAkAgAw0AIAVBBGpB7NSYAUENEIYYGgwNCyAFQQRqQfzTmAFBCRCGGBoMDQsCQAJAIAVBEGoQrR4iAkUNACACKAIAQfUARg0BCyAFQQRqQb/cmgFBAhCJBwwMCyAFIAUoAhg2AiQgBSAFKQIQNwIcIAVBHGoQgx8aAkACQCAFQRxqEK0eIgJFDQAgAigCACIBIQcCQCABQfsARyIIDQAgBUEcahCDHxogBUEcahCtHiICRQ0BIAIoAgAhBwsgB0EgckHkAEYNAQsgBUEEakG/3JoBQQIQiQcMDAsgBUEANgIwIAVCgICAgBA3AiggBUEoakHcABDSCyAFQShqQfUAENILIAFB+wBGIgcNAwwKCyAFQQRqQcHcmgFBAhCJBwwKCwJAIAJBf2pBD0kNAAJAAkACQAJAAkACQCACQfD//wBxQRBGDQAgAkFgakHfAEkNCSACQYF/akGBAUkNBCACQdi/f2oOAgECAwsgAUEBcUUNBAwLCyAFQQRqQfTUmAFBBhCJBwwOCyAFQQRqQfrUmAFBBhCJBwwNCyACQf/9A0cNCCAFQQRqQYDVmAFBBhCJBwwMCwJAIAMNACAFIAI6ABwgBUHmATYCLCAFIAVBHGo2AiggBUEEakHkgIABIAVBKGoQhhgaDAwLIAUgAjoAHCAFQeYBNgIsIAUgBUEcajYCKCAFQQRqQYOAgAEgBUEoahCGGBoMDAsCQCADDQAgBSACOgAcIAVB5gE2AiwgBSAFQRxqNgIoIAVBBGpB5ICAASAFQShqEIYYGgwLCyAFIAI6ABwgBUHmATYCLCAFIAVBHGo2AiggBUEEakGDgIABIAVBKGoQhhgaDAsLIAFBAXFFDQQMBgsgBUHMs4EBNgI4IAVBjAI2AkQgBSAFQcAAajYCPCAFIAVBBGo2AkAgBSAFQThqNgJIIAVBADYALyAFQgA3AyggBUHAAToAMyAFQY0CNgIgIAUgBUHIAGo2AhwgBUEoakHNlYABIAVBHGoQhhgNAiAAIAUoAjA2AgggACAFKQMoNwIAIAVBBGoQ4SAMDAsgBUEoakH7ABDSCwwGCyAFQQRqIAIQ/hwMBgtBxNmYAUElIAVBzwBqQcDVmAFB7NmYARDdFAALAkAgAw0AIAUgAjoAHCAFQeYBNgIsIAUgBUEcajYCKCAFQQRqQeSAgAEgBUEoahCGGBoMBQsgBSACOgAcIAVB5gE2AiwgBSAFQRxqNgIoIAVBBGpBg4CAASAFQShqEIYYGgwFCyACQYABSQ0AIAJB//8DSw0BIAUgAjsBHCAFQfoBNgIsIAUgBUEcajYCKCAFQQRqQcCfmQEgBUEoahCGGBoMAwsgBUEEaiACEP4cDAILAkAgBg0AIAUgAjYCHCAFQdQBNgIsIAUgBUEcajYCKCAFQQRqQYbVmAEgBUEoahCGGBoMAgsgBSACQYCAfGpBCnZBgLADajYCQCAFIAJB/wdxQYC4A3I2AhwgBUHUATYCNCAFQdQBNgIsIAUgBUEcajYCMCAFIAVBwABqNgIoIAVBBGpBlNWYASAFQShqEIYYGgwBCyAFQShqIAIoAgAQ0gsgBUEcahCDHxpBAyEBAkACQANAAkACQCABRQ0AAkAgBUEcahCDHyICQYCAxABGDQAgAkFQakEKSQ0CIAJBv39qQQZJDQIgAkGff2pBBkkNAgsgBw0DDAQLQQUhAgJAIAgNACAFQShqQf0AENILQQchAgsgBUEEaiAFKAIsIAUoAjAQiQcDQCACRQ0EIAJBf2ohAiAFQRBqEIMfGgwACwsgBUEoaiACENILIAFBf2ohAQwACwsgBUEoakH9ABDSCwsgBSgCKCAFKAIsELIjC0EAIQEMAQtBACEBQQEhBAwACwsgAEH/AToACyAAIAI2AgQgACABNgIACyAFQdAAaiQAC5gNAgl/AX4jAEEwayIDJAAgA0EYakEQQQFBARCFDyADKAIcIQQCQAJAIAMoAhhBAUYNAEEAIQUgA0EANgIIIAMgAygCIDYCBCADIAQ2AgBB1AGtQiCGIANBDGqthCEMQQEhBgNAIAEoAmghByABKAJcIQggASgCWCEEAkACQAJAAkADQCAIRQ0BAkACQAJAAkACQAJAIAQsAAAiCUF/Sg0AIAQtAAFBP3EhCiAJQR9xIQsCQCAJQWBPDQAgC0EGdCAKciEJDAMLIApBBnQgBC0AAkE/cXIhCiAJQXBPDQEgCiALQQx0ciEJDAILIAlB/wFxIgotAMCemQENAiAGQQFxRQ0EIAotAICdmQFBAUcNBCABIAdBAWoiBzYCaCABIAhBf2oiCDYCXCAEQQFqIQQMAwsgCkEGdCAELQADQT9xciALQRJ0QYCA8ABxciEJCwJAAkACQAJAQZ+2gQEgCUEJdkGInZsBaiAJQf+DOEsbLQAAQQV0IAlBA3ZBP3FqLQDAq5sBIAlBB3F2QQFxDQAgBkEBcQ0BDAgLIAlBgAFPDQFBASEJDAILIAkQmxxFDQYCQAJAIAlBgAFPDQBBASEJDAELAkAgCUGAEE8NAEECIQkMAQtBA0EEIAlBgIAESRshCQsgASAHIAlqIgc2AmggASAIIAlrIgg2AlwgBCAJaiEEDAMLAkAgCUGAEE8NAEECIQkMAQtBA0EEIAlBgIAESRshCQsgASAHIAlqIgc2AmggASAIIAlrIgg2AlwgASAEIAlqIgQ2AlgMAwsgASAHQQFqIgc2AmggASAIQX9qIgg2AlwgASAEQQFqIgQ2AlgMAgsgASAENgJYQQAhBgwBCwsgCUHcAEcNACABIAhBf2oiCDYCXCABIARBAWoiBDYCWCABIAEoAmgiCUEBajYCaAJAAkACQAJAIAhFDQAgBC0AAEH1AEYNAQsgA0GcgICAeDYCGCAJIAkgA0EYahDyJCEEDAELIAEoAmwhByABKAJgIQogAyAJIAJrIgQQjx8gAygCCCEIAkAgCSACRg0AIARFDQAgAygCBCAIaiAKIAIgB2tqIAT8CgAACyADIAggBGoiBzYCCCADQRhqIAEQjgQgAygCGCIIQQNHDQEgAygCHCEECyAAQYGAgIB4NgIAIAAgBDYCBCADKAIAIAMoAgQQsiMMBwsgAygCHCEEAkACQAJAAkACQCAIRQ0AIAhBf2oOAgECAQsgBEH/AEsNAkEBIQggBC0AwJ6ZAQ0DIANBloCAgHg2AhggASAJIANBGGoQlCMMAwsgAyAEENMLIANBloCAgHg2AhggASAJIANBGGoQlCMMBgsgAyAENgIMIAMgDDcDECADQRhqQcCfmQEgA0EQahCyECADKAIYIQogAygCHCEIIAMgAygCICIEEI8fIAMoAgghBwJAIARFDQAgBEUNACADKAIEIAdqIAggBPwKAAALIAMgByAEajYCCCAKIAgQsiMgA0GWgICAeDYCGCABIAkgA0EYahCUIwwFCwJAQZ+2gQEgBEEJdkGInZsBaiAEQf+DOEsbLQAAQQV0IARBA3ZBP3FqLQDAq5sBIARBB3F2QQFxDQAgA0GWgICAeDYCGCABIAkgA0EYahCUIwtBAiEIIARBgBBJDQBBA0EEIARBgIAESRshCAsgAyAIEI8fIAMoAgQgAygCCGohCSAEQYABSQ0BIARBP3FBgH9yIQogBEEGdiELAkAgBEGAEE8NACAJIAo6AAEgCSALQcABcjoAAAwDCyAEQQx2IQYgC0E/cUGAf3IhCwJAIARB//8DSw0AIAkgCjoAAiAJIAs6AAEgCSAGQeABcjoAAAwDCyAJIAo6AAMgCSALOgACIAkgBkE/cUGAf3I6AAEgCSAEQRJ2QXByOgAADAILIAEgASgCZCABKAJoIgcgASgCbCIIayIEazYCXCABIAEoAmAiCSAEajYCWCAEIAIgCGsiAWshBCAJIAFqIQECQCAFQQFxDQAgAEEAOgAMIAAgBDYCCCAAIAE2AgQgAEGAgICAeDYCACADKAIAIAMoAgQQsiMMBgsgAyAEEI8fIAMoAgQhCCADKAIIIQkCQCAHIAJGDQAgBEUNACAIIAlqIAEgBPwKAAALIABBAToADCAAIAg2AgQgACADKAIANgIAIAAgCSAEajYCCAwFCyAJIAQ6AAALIAMgCCAHajYCCAsgASgCaCECQQAhBkEBIQUMAAsLIAQgAygCIBD+IAALIANBMGokAAvGDgIFfwF+IwBBgAFrIgYkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEtALgBDgkCAwMDAAMDAwEDCwJAAkAgASgCiAEiBUELRw0AIAZBIGogARDEAQwBCyABQQs2AogBIAYgASkCmAE3AyAgBiABKAKgATYCKCABQYwBaiEHAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBTYCCCABIAcpAgA3AgwgASAHKAIINgIUCyABIAYoAig2ArgBIAEgASgCtAE2AqwBIAEgASgCsAEiCDYCqAEgASAGKQMgNwKwASABIAEoAngiBUHAAHI2AnggBkEIaiABELgDIAYoAgghCSABIAU2AnhBASEHIAYoAgwhAiAJQQFxRQ0FIAIhBQwLCwJAAkAgASgCiAEiBUELRw0AIAZBIGogARDEAQwBCyABQQs2AogBIAYgASkCmAE3AyAgBiABKAKgATYCKCABQYwBaiEHAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBTYCCCABIAcpAgA3AgwgASAHKAIINgIUCyABIAYoAig2ArgBIAEgASkDsAE3A6gBIAEgBikDIDcCsAECQCABLQC4AUEZRw0AIAZBIGogARD+CSAGKQMgIgtQDQkgBiAGKAIsNgJoIAYgBikCJDcDYCALpyEFQgAhCwwKCyAGQSBqIAEQtgggBikDICILUA0IIAYgBigCLDYCaCAGIAYpAiQ3A2AgC6chBUIBIQsMCQsgBQ0BIAEgASgCeCIFQf//e3E2AnggBkEgaiABEIcCIAEgBTYCeCAGKAIkIQUgBigCICIJQYCAgIB4Rw0CQQEhBwwJCyAFRQ0DCyABKAK0ASEFIAEoArABIQcgBkGIgICAeDYCICAHIAUgBkEgahDGGyEFQQEhByABLQC4AUGiAUcNByABIAEQhg4QkQkMBwsgBigCKCEIIAEoAqwBIQogBkIANwI4IAZBAzoANEEAIQcgBkEANgIwIAZCADcCQCAGQgA3AiggBkKAgICAwAA3AiBBwAAQigEiAUUNAiABQgA3AiQgASAKNgIgIAEgAjYCHCABQQM6ABggASAENgIUIAEgAzYCECABIAg2AgwgASAFNgIIIAEgCTYCBCABQRc2AgAgBkEgahCiG0EAQQQQ9iMgASEFDAYLIAYgAjYCYAJAAkAgAS0AuAEiBUEFRw0AIAFBsAFqIQUCQAJAIAEoAogBIglBC0cNACAGQSBqIAEQxAEMAQsgAUELNgKIASAGIAEpApgBNwMgIAYgASgCoAE2AiggAUGMAWohCgJAIAEoAghBCkYNACABQQhqEMALCyABIAk2AgggASAKKQIANwIMIAEgCigCCDYCFAsgASABKAK0ASIJNgKsASABIAEoArABNgKoASAFIAYpAyA3AgAgBSAGKAIoNgIIIAEtAHtBAnENASABLQCAAUHAAHENASAGQYmAgIB4NgIgIAMgBCAGQSBqEMYbIQUCQCABLQC4AUGiAUcNACABIAEQhg4QkQkLIAIQmSMMBwsgASgCtAEhAyABKAKwASEEIAZBFGogBRDIJSAGQY8CrUIghkGr5JoBrYQ3A0ggBkEgakHNlYABIAZByABqELIQIAYgBikCFDcCLCAGIAYoAhw2AjQgBCADIAZBIGoQxhshBQJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgBkHgAGoQkiIMBgtBwAAQigEiBUUNAiAFIAQ2AiwgBSADNgIoIAUgCTYCJCAFIAM2AiAgBSAJNgIUIAUgCDYCECAFIAI2AgwgBUEBNgIIIAVBFTYCAEEAIQcMBQsgASgCtAEhBSABKAKwASEHIAZBiYCAgHg2AiAgByAFIAZBIGoQxhshBUEBIQcgAS0AuAFBogFHDQQgASABEIYOEJEJDAQLQQhBwAAQoiQAC0EIQcAAEKIkAAtCAiELIAYoAighBQsCQCALQgJSDQBBASEHDAELIAYgBigCaDYCXCAGIAYpA2A3AlQgBiAFNgJQIAYgC6dBAXM2AkggASgCrAEhAgJAAkACQCABLQB7QQJxDQAgAS0AgAFBwABxDQAgBkGJgICAeDYCICADIAQgBkEgahDGGyEFAkAgAS0AuAFBogFHDQAgASABEIYOEJEJCyALQgFSDQEgBikDUBCeHUEBIQcMAwsCQCALQgFSDQAgBiAGQdAAaiIBKQIINwJ4IAYgASkCADcCcEHAABCKASIFDQJBCEHAABCiJAALIAEoArQBIQUgASgCsAEhByAGQYiAgIB4NgIgIAcgBSAGQSBqEMYbIQUgAS0AuAFBogFHDQAgASABEIYOEJEJCyAGQcgAahD9EEEBIQcMAQtBACEHIAVBADYCCCAFQRU2AgAgBSAGKQJsNwIMIAUgBikCdDcCFCAFIAYoAnw2AhwgBSAENgIsIAUgAzYCKCAFIAI2AiQgBSADNgIgCyAAIAU2AgQgACAHNgIAIAZBgAFqJAALkQ4CBn8DfiMAQfADayIFJAAgBUHwAGogBCABKAJQIgZBABC6CkEAIQcCQCAERQ0AQQEhB0EAIAYQwwYhCAsgBUHwAWoiBiAFQfAAakHUAPwKAAAgBUEAOgDUAiAFIAg2AsgBIAUgBzYCxAEgBUEAOgDsASAFQQApA6ilnAEiCzcCzAIgBUEAKQOgpZwBIgw3AsQCIAUgDDcCzAEgBSALNwLUASAFIAw3AtwBIAUgCzcC5AEgA0EwbCEEIAVB3AFqIQggBUHMAWohByAFQcQCaiEDAkADQCAERQ0BIAVBADoAwQIgBEFQaiEEIAIgBUHEAWoQayACQTBqIQIMAAsLIAUgBykCCDcD4AIgBSAHKQIANwPYAiAFQegCaiADEOwQIAVBoANqIAgQ7BAgBSAFQdgCajYCmAMgBUEAKQOopZwBNwPYAyAFQQApA6ClnAE3A9ADIAUoAoADIQcgBSgChAMhCCAFKAK8AyEDIAUoAogDIQQgBUHQA2pBACAFKAK4AyIJIAUoAsADIgpBgYCAgHhGIgIbEIohAkAgBEGBgICAeEYNACAFIAUpA/gCNwMwIAUgBSkD8AI3AyggBSAFKQPoAjcDICAFIAQ2AkAgBSAINgI8IAUgBzYCOCAFIAUpAowDNwJEIAUgBSgClAM2AkwCQANAIAVB4ANqIAVBIGoQ+Q0gBSkD4AMiC1ANAQJAIAVB2AJqIAsgBSgC6AMQywxFDQAgCxCcIQwBCyAFQdADaiALEJUHGgwACwsgBUEgahDiHgsCQCACDQAgBSAFKQOwAzcDMCAFIAUpA6gDNwMoIAUgBSkDoAM3AyAgBSAKNgJAIAUgAzYCPCAFIAk2AjggBSAFQcQDaiIEKQIANwJEIAUgBCgCCDYCTAJAA0AgBUHgA2ogBUEgahD5DSAFKQPgAyILUA0BIAVB0ANqIAsQlQcaDAALCyAFQSBqEOIeCyAFIAUpA9gDNwJkIAUgBSkD0AM3AlwgBUEgaiAGQTz8CgAAIAVB2AJqEIMZIAVBrAJqELEhIAVBxAFqIAVBIGpBPPwKAAAgBSAFKQJkNwMYIAUgBSkCXDcDECAFQcQBahDEFSABQSBqIgQQ+BggASAFKQMYNwIoIAEgBSkDEDcCICAFIAQ2AtwCIAVBADYC2AICQAJAAkACQCABKAIcRQ0AIAVB2AJqELgYIQggASgCECICKQMAIQsgCCABKAIcIgdBAWpBAXYgByAIKAIMGxCKISACQQhqIQQgC0J/hUKAgYKEiJCgwIB/gyELA0ACQCALUA0AAkAgAiALeqdBAXRB8AFxa0FwaikDACIMQgODQgBSDQAgDKciAyADKAIAIgNBAWo2AgAgA0F/TA0ECyALQn98IAuDIQsgCCAMEJUHGiAHQX9qIQcMAQsgB0UNASACQYB/aiECIAQpAwBCf4VCgIGChIiQoMCAf4MhCyAEQQhqIQQMAAsLIAVBADYC8AIgBUKAgICAgAE3AugCIAVB6AJqEOISIAVBACkDqKWcASILNwPYAyAFQQApA6ClnAEiDDcD0AMgBUEANgL4AiAFIAw3A+gCIAUgCzcD8AIgBUHEAWogBUHQA2ogAUEwaiAFQegCaiABQRBqIgQgBUHYAmogBSgC3AIgBSgC2AIbELwBIAVB6AJqEKQMIAEoAgBFDQEgASAFKALcAyAEEOYgIAUoAtADIgQpAwAhCyAFKALUAyECIAUgBSgC3AM2AogBIAUgBDYCgAEgBSAEIAJqQQFqNgJ8IAUgBEEIajYCeCAFIAtCf4VCgIGChIiQoMCAf4M3A3ADQCAFQQhqIAVB8ABqEL4OIAUoAggiBEUNAiAFKAIMIQICQCAEKQMAIgtCA4NCAFINACALpyIHIAcoAgAiB0EBajYCACAHQX9MDQILIAVB6AJqIAEgCyAEKAIIEOoKAkAgBSkD6AIiDFANACAFKAKAAyEEIAUpA/gCIQ0gBSgC8AIhBwJAIAIpAwAiC0IDg0IAUg0AIAunIgIgAigCACICQQFqNgIAIAJBf0wNAwsgBSALNwP4AiAFIAc2AvACIAUgDDcD6AIgBCANIAVB6AJqEPAQDAELCwJAIAUoAvACQXhqKQMAIgtCA4NCAFINACALpyIHIAcoAgAiB0EBajYCACAHQX9MDQELIAVBADYC6AMgBSALNwPgAyACKQMAIgtCA4NCAFINAiALpyICIAIoAgAiAkEBajYCACACQX9KDQILAAsgACAFKQPYAzcCCCAAIAUpA9ADNwIAIAVB2AJqEOwiIAVBxAFqEJURIAVB8ANqJAAPCyAFQQA2AiggBSALNwMgIAVB4AStQiCGIgsgBUEgaq2ENwP4AiAFIAsgBUHgA2qthDcD8AIgBSALIASthDcD6AJB6YWAASAFQegCakHM5JoBEOsbAAuGDQIDfwF+IwBBwABrIgQkAAJAAkACQAJAAkAgAkECag4DAQACAAsCQCABKAJUIgVFDQAgBEEwaiAFIAIgA2sgASgCWCgCHBELAAJAIAQoAjBBgICAgHhGDQAgBCAEKAI4IgI2AiggBCAEKQIwNwMgIAJBGGwhAyAEKAIkIQICQANAAkACQAJAAkACQAJAAkACQCADRQ0AIAJBCGooAgAhBSACQRBqLQAARQ0BAkAgBUUNACAEQTBqIAEgBRDxHSAELQAwQQRGDQAgBCkDMCIHQv8Bg0IEUg0GCyAEQTBqIAFB0+OaAUECENcPIAQtADBBBEYNAiAEKQMwIgdC/wGDQgRRDQIgACAHNwIADA4LIABBBDoAAAwNCwJAIAVFDQAgBEEwaiABIAUQ8R0gBC0AMEEERg0AIAQpAzAiB0L/AYNCBFINAgsgBEEwaiABQdHjmgFBAhDXDwJAIAQtADBBBEYNACAEKQMwIgdC/wGDQgRRDQAgACAHNwIADA0LIARBCGogAhCTFCAEQTBqIAEgBCgCCCAEKAIMENcPAkAgBC0AMEEERg0AIAQpAzAiB0L/AYNCBFENACAAIAc3AgAMDQsCQCACQQxqKAIAIgVFDQAgBEEwaiABIAUQ8R0gBC0AMEEERg0AIAQpAzAiB0L/AYNCBFINAwsgBEEwaiABELoUIAQtADBBBEYNBSAEKQMwIgdC/wGDQgRRDQUgACAHNwIADAwLIAQgAhCTFCAEQTBqIAEgBCgCACAEKAIEENcPAkAgBC0AMEEERg0AIAQpAzAiB0L/AYNCBFENACAAIAc3AgAMDAsgAkEMaigCACIFQQJNDQMgBEEwaiABIAVBfmoQ8R0gBC0AMEEERg0DIAQpAzAiB0L/AYNCBFENAyAAIAc3AgAMCwsgACAHNwIADAoLIAAgBzcCAAwJCyAAIAc3AgAMCAsgBEEwaiABQdXjmgFBAhDXDwJAIAQtADBBBEYNACAEKQMwIgdC/wGDQgRRDQAgACAHNwIADAgLIAEtAF0NACAEQTBqIAEQ2BAgBC0AMEEERg0AIAQpAzAiB0L/AYNCBFINAgsgAkEYaiECIANBaGohAwwACwsgACAHNwIADAQLIABBBDoAAAwECyAAQQQ6AAAMAwtBCEEYEOogIQYQgBwhByAGQQE6ABAgBkIANwMIIAYgBzcDACAEQQE2AjggBCAGNgI0IARBATYCMEEAIQICQAJAA0ACQAJAAkACQAJAAkACQAJAIAJBGEYNACAGIAJqIgNBCGooAgAhBSADQRBqLQAARQ0BAkAgBUUNACAEQSBqIAEgBRDxHSAELQAgQQRGDQAgBCkDICIHQv8Bg0IEUg0GCyAEQSBqIAFB0+OaAUECENcPIAQtACBBBEYNAiAEKQMgIgdC/wGDQgRRDQIgACAHNwIADAoLIABBBDoAAAwJCwJAIAVFDQAgBEEgaiABIAUQ8R0gBC0AIEEERg0AIAQpAyAiB0L/AYNCBFINAgsgBEEgaiABQdHjmgFBAhDXDwJAIAQtACBBBEYNACAEKQMgIgdC/wGDQgRRDQAgACAHNwIADAkLIARBGGogAxCTFCAEQSBqIAEgBCgCGCAEKAIcENcPAkAgBC0AIEEERg0AIAQpAyAiB0L/AYNCBFENACAAIAc3AgAMCQsCQCADQQxqKAIAIgNFDQAgBEEgaiABIAMQ8R0gBC0AIEEERg0AIAQpAyAiB0L/AYNCBFINAwsgBEEgaiABELoUIAQtACBBBEYNBSAEKQMgIgdC/wGDQgRRDQUgACAHNwIADAgLIARBEGogAxCTFCAEQSBqIAEgBCgCECAEKAIUENcPAkAgBC0AIEEERg0AIAQpAyAiB0L/AYNCBFENACAAIAc3AgAMCAsgA0EMaigCACIDQQJNDQMgBEEgaiABIANBfmoQ8R0gBC0AIEEERg0DIAQpAyAiB0L/AYNCBFENAyAAIAc3AgAMBwsgACAHNwIADAYLIAAgBzcCAAwFCyAAIAc3AgAMBAsgBEEgaiABQdXjmgFBAhDXDwJAIAQtACBBBEYNACAEKQMgIgdC/wGDQgRRDQAgACAHNwIADAQLIAEtAF0NACAEQSBqIAEQ2BAgBC0AIEEERg0AIAQpAyAiB0L/AYNCBFINAgsgAkEYaiECDAALCyAAIAc3AgALIARBMGoQmiEMAgsgAEEEOgAADAELIARBIGoQmiELIARBwABqJAALoA4CB38BfiMAQSBrIgIkAAJAAkACQCAAKAIAIgMNACAAKAIQIgBFDQEgAEGv7poBQQEQnQchAwwCCwJAAkACQAJAAkACQCAAKAIIIgQgACgCBCIFSQ0AIAAoAhAiA0UNASADQdjIlwFBEBCdB0UNAQwFCyAAIARBAWoiBjYCCCADIARqLQAAIQcgACAAKAIMQQFqIgg2AgwCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAIQfQDSw0AAkAgB0Gvf2oOKQwLAhACEQICAgICAgICAgIFCAkCCgICBAUEAgUEBQQDAgIFBAICAgUEAAsgB0G/f2oOAg4FAQsCQCAAKAIQIgNFDQAgA0HoyJcBQRkQnQcNFwsgAEEBOgAEDBMLIAAoAhAiA0UNESADQdjIlwFBEBCdBw0VDBELIAAoAhAiBEUNE0EBIQMgBEGt5JoBQQEQnQdFDRMMFgsgACAHEJMKDRMMEgsgBiAFTw0QIAMgBmotAABB7gBGDQEMEAsgACABEMcMDREMEAsgACAEQQJqNgIIIAAoAhAiBEUNDkEBIQMgBEH98ZoBQQEQnQdFDQ4MEgsgAkEYaiAAEIMMAkAgAigCGCIDDQAgAi0AHCEEAkAgACgCECIBRQ0AQQEhAyABQejIlwFB2MiXASAEQQFxIgUbQRlBECAFGxCdBw0TCyAAIAQ6AAQMDQsgAkEIaiADIAIoAhwQvwgCQAJAAkAgAikDCEIBUg0AIAIpAxAiCUIBVg0AIAmnDgIBAgELIAAoAhAiA0UNDSADQdjIlwFBEBCdBw0RDA0LIAAoAhAiA0UNDyADQb7smgFBBRCdBw0QDA8LIAAoAhAiA0UNDiADQcPsmgFBBBCdBw0PDA4LIAJBGGogABCDDAJAIAIoAhgiAw0AIAItABwhBAJAIAAoAhAiAUUNAEEBIQMgAUHoyJcBQdjIlwEgBEEBcSIFG0EZQRAgBRsQnQcNEgsgACAEOgAEDAwLIAJBCGogAyACKAIcEL8IAkAgAikDCEIBUg0AIAIpAxAiCUKAgICAEFoNACAJpyIDQYCwA3NBgIC8f2pBgJC8f0kNACAAKAIQIAMQ5QYNDwwOCyAAKAIQIgNFDQogA0HYyJcBQRAQnQcNDgwKCwJAIAENACAAKAIQIgRFDQBBASEDIARBr+uaAUEBEJ0HDRALAkAgACgCECIERQ0AQQEhAyAEQYjumgFBARCdBw0QCyAAEOEEDQ0MCAsgBiAFTw0AIAMgBmotAABB5QBGDQELAkAgAQ0AIAAoAhAiBEUNAEEBIQMgBEGv65oBQQEQnQcNDgsCQCAAKAIQIgRFDQBBASEDIARBiIqbAUEBEJ0HDQ4LIAdB0gBHDQEMBQsgACAEQQJqNgIIIAAQ4QQNCgwJCyAAKAIQIgNFDQMgA0GUzJcBQQQQnQcNCQwDCwJAIAENACAAKAIQIgRFDQBBASEDIARBr+uaAUEBEJ0HDQsLAkAgACgCECIERQ0AQQEhAyAEQaLvmgFBARCdBw0LCyAAEJsRDQggACgCECIERQ0HQQEhAyAEQaPvmgFBARCdB0UNAwwKCwJAIAENACAAKAIQIgRFDQBBASEDIARBr+uaAUEBEJ0HDQoLAkAgACgCECIERQ0AQQEhAyAEQabtmgFBARCdBw0KCyACIAAQxg9BASEDIAIoAgBBAXENCQJAIAIoAgRBAUcNACAAKAIQIgRFDQdBASEDIARBve2aAUEBEJ0HDQoLIAAoAhAiBEUNBkEBIQMgBEGn7ZoBQQEQnQdFDQIMCQsCQCABDQAgACgCECIERQ0AQQEhAyAEQa/rmgFBARCdBw0JC0EBIQMgAEEBEKECDQgCQCAAKAIAIgQNACAAKAIQIgBFDQggAEGv7poBQQEQnQchAwwJCwJAIAAoAggiBSAAKAIESQ0AIAAoAhAiBEUNAyAEQdjIlwFBEBCdB0UNAwwJCyAAIAVBAWo2AggCQAJAAkAgBCAFai0AAEGtf2oOAwIBBAALIAAoAhAiA0UNBCADQdjIlwFBEBCdBw0IDAQLAkAgACgCECIERQ0AQQEhAyAEQabtmgFBARCdBw0KCyAAEJsRDQcgACgCECIERQ0GQQEhAyAEQaftmgFBARCdB0UNAgwJCwJAIAAoAhAiA0UNACADQajMlwFBAxCdBw0HC0EBIQMgABDqBw0IIAAoAhAiBEUNBSAEQavMlwFBAhCdB0UNAQwIC0EBIQMgAEEBELYCDQcLIAENAyAAKAIQIgRFDQNBASEDIARBsOuaAUEBEJ0HRQ0DDAYLQQAhAyAAQQA6AAQgAEEANgIADAULQQAhAyAAQQA2AgAMBAsgACAHEJMKDQELQQAhAyAAKAIARQ0CIAAgACgCDEF/ajYCDAwCC0EBIQMMAQtBACEDCyACQSBqJAAgAwvMDQEGfwJAAkACQAJAAkACQCAAKAIAIgJBe2pBBCACQQRLGw4GBQABAgMEBQsCQCAAKAIIQQNHDQAgACgCDCICIAEQXCACKAIAQRpHDQAgASACQQhqEJQLIgNFDQAgAhCIAiACIAMpAzg3AzggAiADKQMwNwMwIAIgAykDKDcDKCACIAMpAyA3AyAgAiADKQMYNwMYIAIgAykDEDcDECACIAMpAwg3AwggAiADKQMANwMAIANBwABBCBDcFAsgACgCKCIAIAEQXCAAKAIAQRpHDQQgASAAQQhqEJQLIgJFDQQgABCIAiAAIAIpAzg3AzggACACKQMwNwMwIAAgAikDKDcDKCAAIAIpAyA3AyAgACACKQMYNwMYIAAgAikDEDcDECAAIAIpAwg3AwggACACKQMANwMAIAJBwABBCBDcFA8LIAAoAigiACABEFwgACgCAEEaRw0DIAEgAEEIahCUCyICRQ0DIAAQiAIgACACKQM4NwM4IAAgAikDMDcDMCAAIAIpAyg3AyggACACKQMgNwMgIAAgAikDGDcDGCAAIAIpAxA3AxAgACACKQMINwMIIAAgAikDADcDACACQcAAQQgQ3BQPCwJAIAAoAghBA0cNACAAKAIMIgIgARBcIAIoAgBBGkcNACABIAJBCGoQlAsiA0UNACACEIgCIAIgAykDODcDOCACIAMpAzA3AzAgAiADKQMoNwMoIAIgAykDIDcDICACIAMpAxg3AxggAiADKQMQNwMQIAIgAykDCDcDCCACIAMpAwA3AwAgA0HAAEEIENwUCwJAIAAoAkgiAkUNACACKAIAIAEQtwELIAAoAihBgICAgHhGDQIgACgCMCICRQ0CIAJBMGwhAiAAKAIsIQADQCAAIAEQzQEgAEEwaiEAIAJBUGoiAg0ADAMLCyAAQSBqIQMCQCACQQNHDQAgACgCBCICIAEQXCACKAIAQRpHDQAgASACQQhqEJQLIgRFDQAgAhCIAiACIAQpAzg3AzggAiAEKQMwNwMwIAIgBCkDKDcDKCACIAQpAyA3AyAgAiAEKQMYNwMYIAIgBCkDEDcDECACIAQpAwg3AwggAiAEKQMANwMAIARBwABBCBDcFAsCQCADKAIAQQdGDQAgAyABEM0EIAEgAxD+CAsgACgCaCICIAEQzQQgASACEP4IIAAoAkhBgICAgHhGDQEgACgCUCICRQ0BIAJBMGwhAiAAKAJMIQADQCAAIAEQzQEgAEEwaiEAIAJBUGoiAg0ADAILCwJAIAAoAghBA0cNACAAKAIMIgIgARBcIAIoAgBBGkcNACABIAJBCGoQlAsiA0UNACACEIgCIAIgAykDODcDOCACIAMpAzA3AzAgAiADKQMoNwMoIAIgAykDIDcDICACIAMpAxg3AxggAiADKQMQNwMQIAIgAykDCDcDCCACIAMpAwA3AwAgA0HAAEEIENwUCwJAIAAoAigiBUEIaigCACIARQ0AIAVBBGooAgAiBiAAQQZ0aiEHA0ACQCAGQThqKAIAIgBFDQAgAEEMbCEEIAZBNGooAgAhAwNAIAMoAgAiACABEFwCQCAAKAIAQRpHDQAgASAAQQhqEJQLIgJFDQAgABCIAiAAIAIpAzg3AzggACACKQMwNwMwIAAgAikDKDcDKCAAIAIpAyA3AyAgACACKQMYNwMYIAAgAikDEDcDECAAIAIpAwg3AwggACACKQMANwMAIAJBwABBCBDcFAsgA0EMaiEDIARBdGoiBA0ACwsgBiABEM0EIAEgBhD+CCAGQcAAaiIAIQYgACAHRw0ACwsCQCAFQRRqKAIAIgBFDQAgAEEMbCEEIAVBEGooAgAhAwNAIAMoAgAiACABEFwCQCAAKAIAQRpHDQAgASAAQQhqEJQLIgJFDQAgABCIAiAAIAIpAzg3AzggACACKQMwNwMwIAAgAikDKDcDKCAAIAIpAyA3AyAgACACKQMYNwMYIAAgAikDEDcDECAAIAIpAwg3AwggACACKQMANwMAIAJBwABBCBDcFAsgA0EMaiEDIARBdGoiBA0ACwsCQCAFKAIYQYCAgIB4Rg0AIAVBIGooAgAiAEUNACAAQTBsIQIgBUEcaigCACEAA0AgACABEM0BIABBMGohACACQVBqIgINAAsLAkAgBSgCPCIARQ0AIABBCGooAgAiAkUNACACQTBsIQIgAEEEaigCAEEkaiEAA0ACQCAAQXxqKAIAIgNFDQAgAyABELcBCwJAIAAoAgAiA0UNACADIAEQtwELIABBMGohACACQVBqIgINAAsLIAUoAkAiAEUNACAAKAIAIAEQtwELC7kNAQd/IwBBMGsiAyQAIAAsAAkhBCAALQAAIQUCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAtAAFBBEcNAAJAIAAtAAUiBkEERw0AIAVBAXENACAEDQJBACEGDCYLIAFB6OGDAUECIAIoAgwiBxEMAEUNB0EBIQYMJQtBASEGIAFB6OGDAUECIAIoAgwiBxEMAA0kIAAoAAEiCEEIdiEJIAhB/wFxDgQBAgMEAQsgAUHo4YMBQQIgAigCDBEMACIGDSMgBEUNIyAEQQFxRQ0HDAsLIAEgCUH/AXFBAnQoAtionAFBAiAHEQwARQ0DDCILIAEgCUH/AXFBgAFzQQJ0KAKcqZwBQRAgBxEMAEUNAgwhCyABIAlBgAFzQf8BcUECdCIHKAKcuZwBIAcoApyxnAEgAigCDCIHEQwARQ0BDCALIAMgCToACSADIAhBGHY6AAsgAyAIQRB2OgAKIAMgA0EJajYCDEEBIQYgAyADQQlqQQFqNgIQIAMgA0ELajYCFCADQewANgIsIANB7AA2AiQgA0HsADYCHCADIANBFGo2AiggAyADQRBqNgIgIAMgA0EMajYCGCABIAJBy4CAASADQRhqEM0GDR8LIAAtAAVBBEcNAUEBIQYMBQsgBkEERw0CQQAhBgwECyAAKAAFIQBBASEGIAFBoPCaAUEBIAcRDAANHAwCCwJAIARBAnFFDQAgAigCDCEADAcLIARBBHENCAJAIARBCHFFDQAgAigCDCEADA4LIARBEHENDwJAIARBIHFFDQAgAigCDCEADBULAkAgBEHAAHFFDQAgAigCDCEADBcLIARBf0oNGiACKAIMIQAMGQsgACgABSEACyAAQQh2IQgCQAJAAkACQCAAQf8BcQ4EAAECAwALQQEhBiABIAhB/wFxQQJ0IgAoAuDBnAEgACgCnMGcASAHEQwARQ0DDBwLQQEhBiABIAhB/wFxQYABc0ECdCgCpMKcAUEQIAcRDABFDQIMGwtBASEGIAEgCEGAAXNB/wFxQQJ0IgAoAqTSnAEgACgCpMqcASAHEQwARQ0BDBoLIAMgCDoACSADIABBGHY6AAsgAyAAQRB2OgAKIAMgA0EJajYCDEEBIQYgAyADQQlqQQFqNgIQIAMgA0ELajYCFCADQewANgIsIANB7AA2AiQgA0HsADYCHCADIANBFGo2AiggAyADQRBqNgIgIAMgA0EMajYCGCABIAJBvYCAASADQRhqEM0GDRkLIARBAEcgBXJBAXFFDRcCQCAFQQFxRQ0AAkACQCAGDQAgAigCDCEADAELQQEhBiABQaDwmgFBASACKAIMIgARDAANGgtBASEGIAFB6uGDAUEBIAARDAANGQsgBEUNFwJAIARBAXFFDQAgBkUNAUEBIQYgAUGg8JoBQQEgAigCDCIAEQwARQ0CDBkLIARBAnFFDQQgAigCDCEAIAZFDQMMAgsgAigCDCEAC0EBIQYgAUHr4YMBQQEgABEMAA0WQQEhBiAEQQJxRQ0CC0EBIQYgAUGg8JoBQQEgABEMAA0VC0EBIQYgAUHs4YMBQQEgABEMAA0UCyAEQQRxRQ0BIAYNAgsgAigCDCEADAILIARBCHFFDQQgAigCDCEAIAZFDQMMAgtBASEGIAFBoPCaAUEBIAIoAgwiABEMAA0QC0EBIQYgAUHt4YMBQQEgABEMAA0PQQEhBiAEQQhxRQ0CC0EBIQYgAUGg8JoBQQEgABEMAA0OC0EBIQYgAUHu4YMBQQEgABEMAA0NCyAEQRBxRQ0CIAYNAQsgAigCDCEADAILQQEhBiABQaDwmgFBASACKAIMIgARDABFDQEMCgsCQCAEQSBxRQ0AIAIoAgwhACAGRQ0DDAILAkAgBEHAAHFFDQAgAigCDCEAIAZFDQUMBAsgBEEATg0IIAIoAgwhACAGDQYMBwtBASEGIAFB7+GDAUEBIAARDAANCCAEQSBxDQAgBEHAAHENAiAEQQBIDQUMBwtBASEGIAFBoPCaAUEBIAARDAANBwtBASEGIAFB8OGDAUEBIAARDAANBiAEQcAAcUUNAgtBASEGIAFBoPCaAUEBIAARDAANBQtBASEGIAFB8eGDAUEBIAARDAANBAsgBEEATg0CC0EBIQYgAUGg8JoBQQEgABEMAA0CCyABQfLhgwFBASAAEQwAIQZBAA0BIAYNAQsgAUHsgIYBQQEgAigCDBEMACEGCyADQTBqJAAgBgv8DAIIfwJ+IwBB4ABrIgIkAEEAIQMCQAJAAkACQAJAAkACQAJAAkBBACAAKAIAIgRBfGoiBSAFIARLGw4JAAECAwQHBwUGAAsgASAAEPIDDAYLIAEgAEEIahC7BAwFCyABIAAoAiAQkQUMBAsCQCAAKAIIQQNHDQAgAS0AKCEEIAFBADoAKCABLQB5IQUgAUEAOgB5AkAgACgCDCIDKAIAQRpHDQAgA0EYaigCACEGAkAgAykDCCIKQgODQgBSDQAgCqciByAHKAIAIgdBAWo2AgAgB0F/TA0HCyABQSxqIAogBhCuCwsgAyABEG8gASAEOgAoIAEgBToAeQsCQCAAKAI8IgNFDQAgAS0AKCEEIAFBADoAKCABLQB5IQUgAUEAOgB5AkAgAygCAEEaRw0AIANBGGooAgAhBgJAIAMpAwgiCkIDg0IAUg0AIAqnIgcgBygCACIHQQFqNgIAIAdBf0wNBwsgAUEsaiAKIAYQrgsLIAMgARBvIAEgBDoAKCABIAU6AHkLIAAoAjgiA0UNAyADQQxsIQUgACgCNCEDIAFBLGohCCABLQB5IQYgAS0AKCEAA0AgAUEAOgB5IAFBADoAKAJAIAMoAgAiBCgCAEEaRw0AIARBGGooAgAhBwJAIAQpAwgiCkIDg0IAUg0AIAqnIgkgCSgCACIJQQFqNgIAIAlBf0wNBwsgCCAKIAcQrgsLIANBDGohAyAEIAEQbyABIAA6ACggASAGOgB5IAVBdGoiBQ0ADAQLCwJAIAAoAiQiA0UNACABLQAoIQQgAUEAOgAoIAEtAHkhBSABQQA6AHkCQCADKAIAQRpHDQAgA0EYaigCACEGAkAgAykDCCIKQgODQgBSDQAgCqciByAHKAIAIgdBAWo2AgAgB0F/TA0GCyABQSxqIAogBhCuCwsgAyABEG8gASAEOgAoIAEgBToAeQsgACgCNCIDRQ0CIANBDGwhBSAAKAIwIQMgAUEsaiEIIAEtAHkhBiABLQAoIQADQCABQQA6AHkgAUEAOgAoAkAgAygCACIEKAIAQRpHDQAgBEEYaigCACEHAkAgBCkDCCIKQgODQgBSDQAgCqciCSAJKAIAIglBAWo2AgAgCUF/TA0GCyAIIAogBxCuCwsgA0EMaiEDIAQgARBvIAEgADoAKCABIAY6AHkgBUF0aiIFDQAMAwsLIAJBADYBWiACQQA2AhQgAkKAgICAgAE3AgwgAkKAgICAgAE3AkggAkKAgICAwAA3AjggAkEANgJQIAJBADoARCACQQA2AkAgAiABLwF4OwFYIAIgASgCdDYCVCACQQApA6ClnAEiCjcCGCACQQApA6ilnAEiCzcCICACIAo3AiggAiALNwIwIAIgAS0AfjoAXiABQSxqIQcCQANAIANB1ABGDQEgASADakEsaiIEKAIAIQUgBCACQQxqIANqIgYoAgA2AgAgBiAFNgIAIANBBGohAwwACwsCQCAAKAIMIgNFDQAgA0EwbCEEIAAoAgghAwNAIAFBADoAfSADIAEQayADQTBqIQMgBEFQaiIEDQALCyAHIAJBDGoQnAQMAQsCQCAAKAIIIgNBBUYNACADQQNHDQAgAS0AKCEEIAFBADoAKCABLQB5IQUgAUEAOgB5AkAgACgCDCIDKAIAQRpHDQAgA0EYaigCACEGAkAgAykDCCIKQgODQgBSDQAgCqciByAHKAIAIgdBAWo2AgAgB0F/TA0ECyABQSxqIAogBhCuCwsgAyABEG8gASAEOgAoIAEgBToAeQsCQCAAKAI8IgNFDQAgAS0AKCEEIAFBADoAKCABLQB5IQUgAUEAOgB5AkAgAygCAEEaRw0AIANBGGooAgAhBgJAIAMpAwgiCkIDg0IAUg0AIAqnIgcgBygCACIHQQFqNgIAIAdBf0wNBAsgAUEsaiAKIAYQrgsLIAMgARBvIAEgBDoAKCABIAU6AHkLIAAoAjgiA0UNACADQQxsIQUgACgCNCEDIAFBLGohCCABLQB5IQYgAS0AKCEAA0AgAUEAOgB5IAFBADoAKAJAIAMoAgAiBCgCAEEaRw0AIARBGGooAgAhBwJAIAQpAwgiCkIDg0IAUg0AIAqnIgkgCSgCACIJQQFqNgIAIAlBf0wNBAsgCCAKIAcQrgsLIANBDGohAyAEIAEQbyABIAA6ACggASAGOgB5IAVBdGoiBQ0ACwsgAkHgAGokAA8LAAu7DAIIfwF+AkACQAJAAkACQAJAAkACQCAAKAIADggAAQIDBgYEBQALIAEgAEEIahDnBQ8LIAEgAEEIahCcAg8LIAEtAHohAiABIAAoAgQiAC0AGUU6AHoCQCAAQQhqKAIAIgNFDQAgAEEEaigCACIAIANBOGxqIQQgAUEsaiEFIAEtAHkhBiABLQAoIQcDQCABQQE6AHkgAUEBOgAoIAAgARDvBAJAIABBMGooAgAiA0UNACABQQA6AHkgAUEAOgAoAkAgAygCAEEaRw0AIANBGGooAgAhCAJAIAMpAwgiCkIDg0IAUg0AIAqnIgkgCSgCACIJQQFqNgIAIAlBf0wNCQsgBSAKIAgQrgsLIAMgARBvCyABIAc6ACggASAGOgB5IABBOGoiACAERw0ACwsgASACOgB6DwsgACgCBCIAQQhqKAIAIgNFDQIgAEEEaigCACIAIANBOGxqIQQgAUEsaiEFIAEtAHkhBiABLQAoIQcDQCABQQE6AHkgAUEBOgAoIAAgARDvBAJAIABBMGooAgAiA0UNACABQQA6AHkgAUEAOgAoAkAgAygCAEEaRw0AIANBGGooAgAhCAJAIAMpAwgiCkIDg0IAUg0AIAqnIgkgCSgCACIJQQFqNgIAIAlBf0wNBwsgBSAKIAgQrgsLIAMgARBvCyABIAc6ACggASAGOgB5IABBOGoiACAERw0ADAMLCyAAKAIEIQACQCABLQCQAQ0AIABBEGooAgAiA0UNAAJAIAApAwAiCkIDg0IAUg0AIAqnIgQgBCgCACIEQQFqNgIAIARBf0wNBAsgAUGAAWogCiADEKIHGgsgAEEoaigCACIDRQ0BIABBJGooAgAiACADQTBsaiEHIAFBLGohBSABQYABaiEJA0ACQCAAKAIADQAgAS0AkAENACAAQRhqKAIAIgNFDQACQCAAQQhqKQMAIgpCA4NCAFINACAKpyIEIAQoAgAiBEEBajYCACAEQX9MDQULIAkgCiADEKIHGgsCQCAAQShqKAIAIgNFDQAgAS0AKCEEIAFBADoAKCABLQB5IQYgAUEAOgB5AkAgAygCAEEaRw0AIANBGGooAgAhCAJAIAMpAwgiCkIDg0IAUg0AIAqnIgIgAigCACICQQFqNgIAIAJBf0wNBgsgBSAKIAgQrgsLIAMgARBvIAEgBDoAKCABIAY6AHkLIABBMGoiACAHRw0ADAILCwJAIAAoAgQiACgCAA0AIAEtAJABDQAgAEEYaigCACIDRQ0AAkAgACkDCCIKQgODQgBSDQAgCqciBCAEKAIAIgRBAWo2AgAgBEF/TA0DCyABQYABaiAKIAMQogcaCyAALQBFIgNBA0YNAAJAIANBAkYNAAJAIAEtAJABDQAgAEE4aigCACIDRQ0AAkAgACkDKCIKQgODQgBSDQAgCqciBCAEKAIAIgRBAWo2AgAgBEF/TA0ECyABQYABaiAKIAMQogcaCwJAIAAoAkAiAC0AJUECRg0AAkAgAS0AkAENACAAKAIYIgNFDQACQCAAKQMIIgpCA4NCAFINACAKpyIEIAQoAgAiBEEBajYCACAEQX9MDQULIAFBgAFqIAogAxCiBxoLAkAgACgCICIALQAlQQJGDQAgAUGAAWohBANAAkAgAS0AkAENACAAQRhqKAIAIgNFDQACQCAAKQMIIgpCA4NCAFINACAKpyIGIAYoAgAiBkEBajYCACAGQX9MDQcLIAQgCiADEKIHGgsgACgCICIALQAlQQJHDQALCyAAQQhqKAIAIgNFDQIgA0E4bCEDIABBBGooAgAhAANAAkACQCAAKAIAQQlHDQAgAUEAOgB9IABBCGogARBrDAELIAAgARC7AQsgAEE4aiEAIANBSGoiAw0ADAMLCyAAKAIIIgNFDQEgA0E4bCEDIAAoAgQhAANAAkACQCAAKAIAQQlHDQAgAUEAOgB9IABBCGogARBrDAELIAAgARC7AQsgAEE4aiEAIANBSGoiAw0ADAILCyAAQShqKAIAIgNFDQAgA0E4bCEDIABBJGooAgAhAANAAkACQCAAKAIAQQlHDQAgAUEAOgB9IABBCGogARBrDAELIAAgARC7AQsgAEE4aiEAIANBSGoiAw0ACwsPCwALtwwCDH8EfiMAQTBrIgMkAAJAIAAoAgwiBCABaiIBIARJDQACQAJAAkAgASAAKAIEIgUgBUEBaiIGQQN2IgdBB2wgBUEISRsiCEEBdk0NAAJAAkAgCEEBaiIIIAEgCCABSxsiAUEPSQ0AIAFB/////wFLDQVBfyABQQN0QQduQX9qZ3ZBAWohAQwBC0EEIAFBCHFBCGogAUEESRshAQsgA0EgakEgQQggARCMDiADKAIkIQkgAygCICIGRQ0CIAMoAighCiADKAIsIQECQCAJQQlqIghFDQAgBkH/ASAI/AsACyADIAE2AhwgAyAKNgIYIAMgCTYCFCADIAY2AhAgA0EINgIMQQAhB0EAIQECQCAERQ0AIAAoAgAiCykDAEJ/hUKAgYKEiJCgwIB/gyEPQQAhASAEIQwgCyEIA0ACQCAPQgBSDQADQCABQQhqIQEgCEEIaiIIKQMAQoCBgoSIkKDAgH+DIg9CgIGChIiQoMCAf1ENAAsgD0KAgYKEiJCgwIB/hSEPCwJAIAYgCSALIA96p0EDdiABaiIFQQV0ayINQWBqKQMAIA1BaGooAgAQphsiEKdxIg1qKQAAQoCBgoSIkKDAgH+DIhFCAFINAEEIIQ4DQCANIA5qIQ0gDkEIaiEOIAYgDSAJcSINaikAAEKAgYKEiJCgwIB/gyIRUA0ACwsgD0J/fCESAkAgBiAReqdBA3YgDWogCXEiDWosAABBAEgNACAGKQMAQoCBgoSIkKDAgH+DeqdBA3YhDQsgEiAPgyEPIAYgDWogEEIZiKciDjoAACAGIA1BeGogCXFqQQhqIA46AAAgBiANQX9zQQV0aiINIAsgBUF/c0EFdGoiBSkAGDcAGCANIAUpABA3ABAgDSAFKQAINwAIIA0gBSkAADcAACAMQX9qIgwNAAsgBCEBCyADQRBqIQ0gAyABNgIcIAMgCiABazYCGAJAA0AgB0EQRg0BIAAgB2oiASgCACEIIAEgDSAHaiIGKAIANgIAIAYgCDYCACAHQQRqIQcMAAsLIAMoAhQiAUUNASABIAFBBXRBJ2pBYHEiCGpBCWoiAUUNASADKAIQIAhrIAFBCBDcFAwBCwJAAkAgBg0AQQAhAQwBCyAHIAZBB3FBAEdqIQcgACgCACIIIQEDQCABIAEpAwAiD0J/hUIHiEKBgoSIkKDAgAGDIA9C//79+/fv37//AIR8NwMAIAFBCGohASAHQX9qIgcNAAsCQAJAIAZBCEkNACAIIAZqIAgpAAA3AAAMAQsgBkUNACAIQQhqIAggBvwKAAALQQAhB0EAIQYDQAJAIAggBiIBai0AAEGAAUcNACAIIAdqIQwgCCABQX9zQQV0aiEOQQAgAWtBBXQhCwNAIAggC2oiBkFgaikDACAGQWhqKAIAEKYbIQ8gACgCBCIGIA+ncSINIQkCQCAIIA1qKQAAQoCBgoSIkKDAgH+DIhFCAFINAEEIIQQgDSEJA0AgCSAEaiEJIARBCGohBCAIIAkgBnEiCWopAABCgIGChIiQoMCAf4MiEVANAAsLAkAgCCAReqdBA3YgCWogBnEiCWosAABBAEgNACAIKQMAQoCBgoSIkKDAgH+DeqdBA3YhCQsCQAJAAkAgCSANayABIA1rcyAGcUEISQ0AIAggCWoiDS0AACEEIA0gD0IZiKciCjoAACAAKAIAIg0gCUF4aiAGcWpBCGogCjoAACAEQf8BRg0BIAggCUEFdGshBEFgIQgDQCAIRQ0DIAwgCGoiBigAACENIAYgBCAIaiIJKAAANgAAIAkgDTYAACAIQQRqIQgMAAsLIAggAWogD0IZiKciDToAACAAKAIAIgggBiABQXhqcWpBCGogDToAAAwDCyANIAFqQf8BOgAAIA0gACgCBCABQXhqcWpBCGpB/wE6AAAgCCAJQX9zQQV0aiIIIA4pABg3ABggCCAOKQAQNwAQIAggDikACDcACCAIIA4pAAA3AAAgDSEIDAILIAAoAgAhCAwACwsgAUEBaiEGIAdBYGohByABIAVHDQALIAAoAgQiASABQQFqQQN2QQdsIAFBCEkbIQELIAAgASAAKAIMazYCCAtBgYCAgHghCQsgA0EwaiQAIAkPCxDXIwALtwwCDH8EfiMAQTBrIgMkAAJAIAAoAgwiBCABaiIBIARJDQACQAJAAkAgASAAKAIEIgUgBUEBaiIGQQN2IgdBB2wgBUEISRsiCEEBdk0NAAJAAkAgCEEBaiIIIAEgCCABSxsiAUEPSQ0AIAFB/////wFLDQVBfyABQQN0QQduQX9qZ3ZBAWohAQwBC0EEIAFBCHFBCGogAUEESRshAQsgA0EgakEgQQggARCMDiADKAIkIQkgAygCICIGRQ0CIAMoAighCiADKAIsIQECQCAJQQlqIghFDQAgBkH/ASAI/AsACyADIAE2AhwgAyAKNgIYIAMgCTYCFCADIAY2AhAgA0EINgIMQQAhB0EAIQECQCAERQ0AIAAoAgAiCykDAEJ/hUKAgYKEiJCgwIB/gyEPQQAhASAEIQwgCyEIA0ACQCAPQgBSDQADQCABQQhqIQEgCEEIaiIIKQMAQoCBgoSIkKDAgH+DIg9CgIGChIiQoMCAf1ENAAsgD0KAgYKEiJCgwIB/hSEPCwJAIAYgCSALIA96p0EDdiABaiIFQQV0ayINQWBqKQMAIA1BaGooAgAQphsiEKdxIg1qKQAAQoCBgoSIkKDAgH+DIhFCAFINAEEIIQ4DQCANIA5qIQ0gDkEIaiEOIAYgDSAJcSINaikAAEKAgYKEiJCgwIB/gyIRUA0ACwsgD0J/fCESAkAgBiAReqdBA3YgDWogCXEiDWosAABBAEgNACAGKQMAQoCBgoSIkKDAgH+DeqdBA3YhDQsgEiAPgyEPIAYgDWogEEIZiKciDjoAACAGIA1BeGogCXFqQQhqIA46AAAgBiANQX9zQQV0aiINIAsgBUF/c0EFdGoiBSkAGDcAGCANIAUpABA3ABAgDSAFKQAINwAIIA0gBSkAADcAACAMQX9qIgwNAAsgBCEBCyADQRBqIQ0gAyABNgIcIAMgCiABazYCGAJAA0AgB0EQRg0BIAAgB2oiASgCACEIIAEgDSAHaiIGKAIANgIAIAYgCDYCACAHQQRqIQcMAAsLIAMoAhQiAUUNASABIAFBBXRBJ2pBYHEiCGpBCWoiAUUNASADKAIQIAhrIAFBCBDcFAwBCwJAAkAgBg0AQQAhAQwBCyAHIAZBB3FBAEdqIQcgACgCACIIIQEDQCABIAEpAwAiD0J/hUIHiEKBgoSIkKDAgAGDIA9C//79+/fv37//AIR8NwMAIAFBCGohASAHQX9qIgcNAAsCQAJAIAZBCEkNACAIIAZqIAgpAAA3AAAMAQsgBkUNACAIQQhqIAggBvwKAAALQQAhB0EAIQYDQAJAIAggBiIBai0AAEGAAUcNACAIIAdqIQwgCCABQX9zQQV0aiEOQQAgAWtBBXQhCwNAIAggC2oiBkFgaikDACAGQWhqKAIAEKYbIQ8gACgCBCIGIA+ncSINIQkCQCAIIA1qKQAAQoCBgoSIkKDAgH+DIhFCAFINAEEIIQQgDSEJA0AgCSAEaiEJIARBCGohBCAIIAkgBnEiCWopAABCgIGChIiQoMCAf4MiEVANAAsLAkAgCCAReqdBA3YgCWogBnEiCWosAABBAEgNACAIKQMAQoCBgoSIkKDAgH+DeqdBA3YhCQsCQAJAAkAgCSANayABIA1rcyAGcUEISQ0AIAggCWoiDS0AACEEIA0gD0IZiKciCjoAACAAKAIAIg0gCUF4aiAGcWpBCGogCjoAACAEQf8BRg0BIAggCUEFdGshBEFgIQgDQCAIRQ0DIAwgCGoiBigAACENIAYgBCAIaiIJKAAANgAAIAkgDTYAACAIQQRqIQgMAAsLIAggAWogD0IZiKciDToAACAAKAIAIgggBiABQXhqcWpBCGogDToAAAwDCyANIAFqQf8BOgAAIA0gACgCBCABQXhqcWpBCGpB/wE6AAAgCCAJQX9zQQV0aiIIIA4pABg3ABggCCAOKQAQNwAQIAggDikACDcACCAIIA4pAAA3AAAgDSEIDAILIAAoAgAhCAwACwsgAUEBaiEGIAdBYGohByABIAVHDQALIAAoAgQiASABQQFqQQN2QQdsIAFBCEkbIQELIAAgASAAKAIMazYCCAtBgYCAgHghCQsgA0EwaiQAIAkPCxDXIwALywwBBH8CQAJAAkACQAJAAkACQAJAQQAgACgCACICQXxqIgMgAyACSxsOCQABAgMEBwcFBgALAkAgAkEDRw0AIAEtAABBAXENACAAKAIEIAEQlwELAkAgACgCSCICRQ0AIAAoAkQiBCACQQZ0aiEFA0ACQAJAIAQoAgBBB0YNAAJAIARBOGooAgAiAkUNACABLQAAQQFxDQAgAkEMbCEDIARBNGooAgAhAgNAAkAgAS0AAA0AIAIoAgAgARCXAQsgAkEMaiECIANBdGoiAw0ACwsgBCABELMKDAELAkAgBEE4aigCACICRQ0AIAEtAABBAXENACACQQxsIQMgBEE0aigCACECA0ACQCABLQAADQAgAigCACABEJcBCyACQQxqIQIgA0F0aiIDDQALCyAELQAcQQJHDQAgBCgCCCABEOgJIAEtAAANACAEKAIMIAEQlwELIARBwABqIgQgBUcNAAsLIAAoAiBBgICAgHhGDQYgACgCKCICRQ0GIAEtAABBAXENBiACQTBsIQMgACgCJCECA0ACQCABLQAADQAgAiABEK4DCyACQTBqIQIgA0FQaiIDDQAMBwsLAkAgACgCCEEDRw0AIAEtAABBAXENACAAKAIMIAEQlwELAkAgACgCMCIFQQhqKAIAIgNFDQAgBUEEaigCACICIANBBnRqIQADQAJAIAIiBEE4aigCACICRQ0AIAEtAABBAXENACACQQxsIQMgBEE0aigCACECA0ACQCABLQAADQAgAigCACABEJcBCyACQQxqIQIgA0F0aiIDDQAL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AICkmQENACAIIAFBBWoiC2otAAAiCi0AgKSZAQ0AIAggAUEGaiILai0AACIKLQCApJkBDQAgCCABQQdqIgtqLQAAIgotAICkmQENACAIIAFBCGoiC2otAAAiCi0AgKSZAQ0AIAggAUEJaiILai0AACIKLQCApJkBDQAgCCABQQpqIgtqLQAAIgotAICkmQENACAIIAFBC2oiC2otAAAiCi0AgKSZAQ0AIAggAUEMaiILai0AACIKLQCApJkBDQAgCCABQQ1qIgtqLQAAIgotAICkmQENACAIIAFBDmoiC2otAAAiCi0AgKSZAQ0AIAggAUEPaiILai0AACIKLQCApJkBDQAgCCABQRBqIgtqLQAAIgotAICkmQENACAIIAFBEWoiC2otAAAiCi0AgKSZAQ0AIAggAUESaiILai0AACIKLQCApJkBDQAgCCABQRNqIgtqLQAAIgotAICkmQENACAIIAFBFGoiC2otAAAiCi0AgKSZAQ0AIAggAUEVaiILai0AACIKLQCApJkBDQAgCCABQRZqIgtqLQAAIgotAICkmQENACAIIAFBF2oiC2otAAAiCi0AgKSZAQ0AIAggAUEYaiILai0AACIKLQCApJkBDQAgCCABQRlqIgtqLQAAIgotAICkmQENACAIIAFBGmoiC2otAAAiCi0AgKSZAQ0AIAggAUEbaiILai0AACIKLQCApJkBDQAgCCABQRxqIgtqLQAAIgotAICkmQENACAIIAFBHWoiC2otAAAiCi0AgKSZAQ0AIAggAUEeaiILai0AACIKLQCApJkBDQAgAUEfaiELIAkhASAIIAtqLQAAIgotAICkmQFFDQELAkAgCkHiAUcNACALQQFqIQEgC0ECaiIKIAZPDQEgASAGTw0CIAggCmotAABBCHQgCCABai0AAHJBgAJyQf//A3FBgNMCRw0BCwsgACALIAdqIgE2AmggACAGIAtrNgJcIAAgCCALajYCWCAAKAIgIgZBgICAgHhGDQEgACgCdEEIaiAAKAJgIAcgACgCbGtqIAsQwgQhDAJAIAUNACAAKAIYIQoCQCAAKAIoIgggBkcNACAAQSBqELoaCyAAIAhBAWo2AiggACgCJCAIQQV0aiIGQQE6ABwgBiAKNgIYIAZBADoAECAGIAE2AgwgBiACNgIIIAYgDDcDAAwCCwJAIAAoAjQiBiAAKAIsRw0AIABBLGoQuRoLIAAgBkEBajYCNCAAKAIwIAZBGGxqIgZBADoAECAGIAE2AgwgBiACNgIIIAYgDDcDAAwBCyABIAZBjJyZARD+FgALIAAoAmggAUYNACAAIAE2AmggACAAKAJkIAEgACgCbGsiAWs2AlwgACAAKAJgIAFqNgJYDwsLvA0CD38BfiMAQbACayIDJAACQAJAAkACQAJAAkACQAJAAkACQCABEJ0KQfsARw0AIAMgASgCACIEKQJQNwMAIAMgBCgCWDYCCCAEQdAAaiEFAkACQAJAIAIoAggiBkUNACACIAZBf2oiBzYCCCADIAIoAgQgB0EDdGoiBygCBCIINgIUIAMgBygCACIJNgIQIAlBAkkNASABEPweDQIgAyADKQMANwOQASADIAMoAgg2ApgBIAMgBSgCCDYCpAEgAyAFKQIANwKcASADQRo2AuwBIAAgASgCBCABKAIIIANBkAFqIANB7AFqEN4ODAoLIAMgBSgCCCIENgKkASADIAUpAgAiEjcCnAEgAyASNwOQASADIAQ2ApgBIANBGzYC7AEgACABKAIEIAEoAgggA0GQAWogA0HsAWoQ3g4MCgsgAyAFKAIIIgQ2AqQBIAMgBSkCACISNwKcASADIBI3A5ABIAMgBDYCmAEgA0EbNgLsASAAIAEoAgQgASgCCCADQZABaiADQewBahDeDgwICyADQewBaiABELYDIANBGTYCdCADQQU2AlggA0EYaiADQewBaiADQdgAaiADQfQAahClBwJAAkACQCAFKAIAIgogASgCCCILRg0AAkAgARCdCkEsRw0AIAEQ/B4NAyADIAMpAwA3A5ABIAMgAygCCDYCmAEgAyAFKAIINgKkASADIAUpAgA3ApwBIANBGjYC7AEgACABKAIEIAsgA0GQAWogA0HsAWoQ3g4MAgtBIiEKIAMoAhwhBCADKAIYIgxBIkcNBEEAIQ1BASEOQQAhD0EAIRAMBwsgAyADKQMANwOQASADIAMoAgg2ApgBIAMgBSgCCDYCpAEgAyAFKQIANwKcASADQRo2AuwBIAAgASgCBCAKIANBkAFqIANB7AFqEN4OCyADKAIYQSJGDQgMBwsgARCdCiEKIAMoAhghDCAKQf0ARg0DAkACQAJAIAxBIkYiEA0AIAxBGUcNASAELQBnDQIgACADQRhqQcAA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IAMpAyA3AyAgACADKQMYNwMYIAAgAykDEDcDECAAIAMpAwg3AwggACADKQMANwMAIANBwABBCBDcFAsgBEECRw0FIAIoAgQiACABEFwgACgCAEEaRw0FIAEgAEEIahCUCyIBRQ0FIAAQiAIgACABKQM4NwM4IAAgASkDMDcDMCAAIAEpAyg3AyggACABKQMgNwMgIAAgASkDGDcDGCAAIAEpAxA3AxAgACABKQMINwMIIAAgASkDADcDACABQcAAQQgQ3BQPCyAAKAIEIgIgARBcAkAgAigCAEEaRw0AIAEgAkEIahCUCyIDRQ0AIAIQiAIgAiADKQM4NwM4IAIgAykDMDcDMCACIAMpAyg3AyggAiADKQMgNwMgIAIgAykDGDcDGCACIAMpAxA3AxAgAiADKQMINwMIIAIgAykDADcDACADQcAAQQgQ3BQLIAAoAgggARC3AQ8LIAAoAgQiAiABEFwCQCACKAIAQRpHDQAgASACQQhqEJQLIgNFDQAgAhCIAiACIAMpAzg3AzggAiADKQMwNwMwIAIgAykDKDcDKCACIAMpAyA3AyAgAiADKQMYNwMYIAIgAykDEDcDECACIAMpAwg3AwggAiADKQMANwMAIANBwABBCBDcFAsgACgCCCABELcBDwsgACgCBCIAIAEQXCAAKAIAQRpHDQIgASAAQQhqEJQLIgFFDQIgABCIAiAAIAEpAzg3AzggACABKQMwNwMwIAAgASkDKDcDKCAAIAEpAyA3AyAgACABKQMYNwMYIAAgASkDEDcDECAAIAEpAwg3AwggACABKQMANwMAIAFBwABBCBDcFA8LIAAoAgQiAiABEFwCQCACKAIAQRpHDQAgASACQQhqEJQLIgNFDQAgAhCIAiACIAMpAzg3AzggAiADKQMwNwMwIAIgAykDKDcDKCACIAMpAyA3AyAgAiADKQMYNwMYIAIgAykDEDcDECACIAMpAwg3AwggAiADKQMANwMAIANBwABBCBDcFAsgACgCCCABELcBDwsgACgCBCICIAEQXAJAIAIoAgBBGkcNACABIAJBCGoQlAsiA0UNACACEIgCIAIgAykDODcDOCACIAMpAzA3AzAgAiADKQMoNwMoIAIgAykDIDcDICACIAMpAxg3AxggAiADKQMQNwMQIAIgAykDCDcDCCACIAMpAwA3AwAgA0HAAEEI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IANB4AJqIQpBACEGQQAhAgJAA0AgByAGaiELIAkgAkYNASADQfABaiAHIAJqIgxBwAD8CgAAIANBsAJqIAxBwAD8CgAAIAoQoiEgCyADQfABakEo/AoAACAGQShqIQYgAkHAAGohAgwACwsgA0EINgLEASADQQA2AswBQQBBCBD/IyADQQg2AtABIANBCDYCyAEgCEEGdCIMQShuIQYgByECAkAgCEUNACAHIQIgDCAGQShsIglGDQAgByAMIAkQ5R4iAkUNAwsgAyACNgK8ASADIAY2ArgBIAMgCyAHa0EobjYCwAEgA0HEAWoQ5RMCQCABLQDIASICQQFGDQAgASgCxAEhBiABKALAASEHIANB1AFqIAIQ2SUgA0GPAq1CIIZBwvCaAa2ENwPwASADQbACakHNlYABIANB8AFqEIkfIAMgAykC1AE3ArwCIAMgAygC3AE2AsQCIAcgBiADQbACahDGGyECAkAgAS0AyAFBogFHDQAgASABEKAjEIwUCyADQYGAgIB4NgKYASADIAI2ApwBDAQLIAEQ6BFBACECAkAgAS0AyAEiBkEJRw0AIANBEGogAUEJEP4EIAMoAhQhAgJAIAMoAhBBAXFFDQAgA0GBgICAeDYCmAEgAyACNgKcAQwFCyABLQDIASEGCyADIAI2AuABIAZB/wFxQRtGDQEgASgCxAEhAiABKALAASEHIANB5AFqIAYQ2SUgA0GPAq1CIIZB/PSaAa2ENwPwASADQbACakHNlYABIANB8AFqEIkfIAMgAykC5AE3ArwCIAMgAygC7AE2AsQCIAcgAiADQbACahDGGyECAkAgAS0AyAFBogFHDQAgASABEKAjEIwUCyADQYGAgIB4NgKYASADIAI2ApwBIANB4AFqEOAiDAMLIAMgBzYCnAEgA0GBgICAeDYCmAEMAwsgARDoESADIAI2AqgBIAMgBTYCpAEgAyADKALAATYCoAEgAyADKQK4ASINNwOYASANpyEGDAQLQQggCRCiJAALIANBuAFqEKUhC0GBgICAeCEGCyAFEKUjCwJAAkAgBkGAgICAeGoOAgACAQsgASADQShqEL0UDAILIAEgASgCeEF+cSAEQQFxcjYCeCADKQKcASENIANBKGoQtCIgASABKAJ4IgdB/3xxQYABcjYCeCADIA03ArQCIAMgBjYCsAIgAyACNgLEAiADIAU2AsACIAMgA0EkajYCvAIgA0EIaiABQQEgDacgDUIgiKcQohwQ0QogAygCDCEGAkACQCADKAIIQQFHDQAgAEGBgICAeDYCACAAIAY2AgQgA0GwAmoQpSEgBRClIyADQcQCahDgIgwBCyAAIAMpArACNwIAIAAgAygCuAI2AgggASgCvAEhDCADKAIkIQlBBEEYEOogIgtCADcCCCALQoCAgICAATcCACALQgA3AhAgAEEBOwEkIAAgAjYCICAAIAU2AhwgAEEANgIYIAAgDDYCFCAAIAk2AhAgACAGNgIMIANBADYCQCADQgA3AjggA0IANwJEIAMgCzYCNCADQQA2AjAgA0KAgICAgAE3AiggA0EAOwFMIANBKGoQqiALIAEgBzYCeAwCCyABIANBKGoQvRQgA0GYAWpBBHIQnSELIABBgICAgHg2AgALIANB8AJqJAALzQ0BBH8jAEHAAWsiBSQAIAItAMgBIQYCQAJAAkACQCAERQ0AIAYQ7BNFDQAgBiACKAJ4IgQQ6w4NACACLQDJAQ0BAkAgBkH/AXFBigFHDQAgBEEQcUUNACACELwOQf8BcUEbRg0AAkAgBEEgcQ0AIAIoArwBIQQgAigCuAEhBiAFQYqBgIB4NgKYASACIAYgBCAFQZgBahD1HQsgBSADKQIQNwKsASAFIAMpAgg3AqQBIAUgAykCADcCnAFBCEHAABDqICIEQRo2AgAgBCAFKQKYATcCBCAEIAUpAqABNwIMIAQgBSkCqAE3AhQgBCAFKAKwATYCHEEAIQYMBAsgBUGYAWogAkEAELcHIAUoApgBIQQCQAJAIAUtAKwBIgdBAkYNACAFIAUpAqQBNwIsIAUgBSkCnAE3AiQgBSAFKQCtATcANSAFIAUoALQBNgA8IAUgBzoANCAFIAQ2AiACQAJAAkACQAJAAkAgBkH/AXFB9QBHDQAgAigCgAFBgMAAcUUNACACLQDIAUH/AXFBG0cNAQsgBSAFKQM4NwJgIAUgBSkDMDcCWCAFIAUpAyg3AlAgBSAFKQMgNwJIQQhBKBDqICIEQQA2AgAgBEEEaiAFQcQAakEk/AoAACAFQQE2AnAgBSAENgJsIAVBATYCaCACLQDIASIGQRtGDQEgAigCxAEhBCACKALAASEBIAVB9ABqIAYQ2SUgBUGPAq1CIIZB/PSaAa2ENwOAASAFQZgBakHNlYABIAVBgAFqEIkfIAUgBSkCdDcCpAEgBSAFKAJ8NgKsASABIAQgBUGYAWoQxhshBCACLQDIAUGiAUcNAiACIAIQoCMQjBQMAgsgBUEYaiACELYYQQEhBiAFKAIcIQQgBSgCGEEBRw0DIAVBIGoQ5iIMBQsgAhDoESAFQRBqIAJBASAEQQEQohwQ0QogBSgCFCEHIAUoAhBBAXFFDQEgByEECyAFQegAahClIQwCCyABKAIAKAIAIQEgAigCvAEhCEEEQRgQ6iAiAkIANwIIIAJCgICAgIABNwIAIAJCADcCEEEAIQYgBUEANgKwASAFQgA3AqgBIAVCADcCtAEgBSACNgKkASAFQQA2AqABIAVCgICAgIABNwKYASAFQQA7AbwBQQhBwAAQ6iAiBEEeNgIAIARBATsBKCAEQQA2AiQgBEIANwIcIAQgCDYCGCAEIAE2AhQgBCAHNgIQIAQgBSkCaDcCBCAEIAUoAnA2AgwgBUGYAWoQpSEgBUGkAWoQsx4MAgsgASgCACgCACEGIAIoArwBIQEgBSADKQIQNwKsASAFIAMpAgg3AqQBIAUgAykCADcCnAFBCEHAABDqICICQRo2AgAgAiAFKQKYATcCBCACIAUpAqABNwIMIAIgBSkCqAE3AhQgAiAFKAKwATYCHEEIQcAAEOogIgMgATYCECADIAY2AgwgAyAENgIIIAMgAjYCBCADQSw2AgAgBUEgahDmIkEAIQYgAyEEDAULQQEhBgsgAykDABCcIQwDCyAGQf8BcUEbRw0AIAItAMkBQQFxRQ0BCyAFIAMpAhA3AqwBIAUgAykCCDcCpAEgBSADKQIANwKcAUEIQcAAEOogIgRBGjYCACAEIAUpApgBNwIEIAQgBSkCoAE3AgwgBCAFKQKoATcCFCAEIAUoArABNgIcQQAhBgwBCwJAIAItAHhBCHFFDQAgAxCbIEUNACADKAIMIQQgAygCCCEGIAVBqYCAgHg2ApgBIAIgBiAEIAVBmAFqEK4bC0EIQSgQ6iAiBEEANgIAIARBADYCICAFIAMpAgA3ApwBIAQgBSkCmAE3AgQgBSADKQIINwKkASAEIAUpAqABNwIMIAUgAykCEDcCrAEgBCAFKQKoATcCFCAEIAUoArABNgIcQQEhBiAFQQE2ApQBIAUgBDYCkAEgBUEBNgKMASACEOgRIAVBCGogAkEAIARBARCiHBDRCiAFKAIMIQQCQCAFKAIIQQFxRQ0AIAVBjAFqEKUhDAELIAEoAgAoAgAhAyACKAK8ASEGQQRBGBDqICICQgA3AgggAkKAgICAgAE3AgAgAkIANwIQIAVBADYCsAEgBUIANwKoASAFQgA3ArQBIAUgAjYCpAEgBUEANgKgASAFQoCAgICAATcCmAEgBUEAOwG8AUEIQcAAEOogIgJBHjYCACACQgA3AhwgAiAGNgIYIAIgAzYCFCACIAQ2AhAgAkIANwEiIAIgBSkCjAE3AgQgAiAFKAKUATYCDCAFQZgBahClISAFQaQBahCzHiACIQRBACEGCyAAIAQ2AgQgACAGNgIAIAVBwAFqJAALyQwBDH8jAEEQayICJAACQCAALQAAQQFGDQAgACgCBCEDAkAgAC0AAUEBRg0AIAMoAgAoAgAiBEEBEJ8fIAQoAgQgBCgCCCIFakEsOgAAIAQgBUEBajYCCAsgAEECOgABIAJBCGogAygCAEGI3JoBQRIQwQUCQAJAIAItAAhBBEYNACACKQMIENsgIQAMAQsgAygCACgCACIAQQEQnx8gACgCBCAAKAIIIgRqQTo6AAAgACAEQQFqNgIIAkACQCABKAIAQYCAgIB4Rw0AIAMoAgAoAgAiAEEEEJ8fIAAoAgQgACgCCCIBakHu6rHjBjYAACAAIAFBBGo2AggMAQsgASgCBCEGIAEoAgghASADKAIAIgUoAgAiAEEBEJ8fIAAoAgQgACgCCCIEakHbADoAACAAIARBAWo2AggCQCABRQ0AIAYgAUEMbGohB0EBIQADQAJAIABBAXENACADKAIAKAIAIgBBARCfHyAAKAIEIAAoAggiAWpBLDoAACAAIAFBAWo2AggLAkACQCAGKAIAQYCAgIB4Rw0AIAMoAgAoAgAiAEEEEJ8fIAAoAgQgACgCCCIBakHu6rHjBjYAACAAIAFBBGo2AggMAQsgBkEEaigCACEIIAZBCGooAgAhBCADKAIAIgEoAgAiAEEBEJ8fIAAoAgQgACgCCCIFakHbADoAACAAIAVBAWo2AgggCCAEQRhsaiEJAkACQAJAIAQNAEEAIQpB3QAhC0EAIQAMAQsgCCAJRg0BIAhBGGohDEGAAiEKQQEhAAsDQAJAAkACQAJAAkACQAJAIAAOAgABAQsgASgCACIAQQEQnx8gACgCBCAAKAIIIgRqIAs6AAAgACAEQQFqNgIIIAggCUYNASADKAIAKAIAIgBBARCfHyAAKAIEIAAoAggiBGpBLDoAACAAIARBAWo2AgggCEEYaiEMDAULIAMoAgAoAgAiAEEBEJ8fIAAoAgQgACgCCCIBakH7ADoAACAAIAFBAWo2AgggCCgCBCEAIAgoAgghDSACQQhqIAMoAgBBuNuaAUEFEMEFAkAgAi0ACEEERg0AIAIpAwgQ2yAhAAwMCyAKQf+BfHFBgARyIQpBASEEIAMoAgAoAgAiAUEBEJ8fIAEoAgQgASgCCCILakE6OgAAIAEgC0EBajYCCCADKAIAIgUoAgAiAUEBEJ8fIAEoAgQgASgCCCILakHbADoAACABIAtBAWo2AghBgAIhCwJAIA0NACAFKAIAIgFBARCfHyABKAIEIAEoAggiC2pB3QA6AAAgASALQQFqNgIIQQAhBEEAIQsLIA1BBHQhAQJAA0AgAUUNAQJAIARBAXENACAFKAIAIgRBARCfHyAEKAIEIAQoAggiDWpBLDoAACAEIA1BAWo2AggLIAJBCGogBSAAQQRqKAIAIABBCGooAgAQwQUCQCACLQAIQQRGDQAgAikDCBDbICEADA4LIABBEGohACABQXBqIQEgC0H/gXxxQYAEciELQQAhBAwACwsgC0EBcQ0BAkAgC0GA/gNxRQ0AIAUoAgAiAEEBEJ8fIAAoAgQgACgCCCIBakHdADoAACAAIAFBAWo2AggLIAgoAhQhCyAIKAIQIQQgAygCACgCACIAQQEQnx8gACgCBCAAKAIIIgFqQSw6AAAgACABQQFqNgIIIAJBCGogAygCAEHQ25oBQQgQwQUCQCACLQAIQQRGDQAgAikDCBDbICEADAwLIAMoAgAoAgAiAEEBEJ8fIAAoAgQgACgCCCIBakE6OgAAIAAgAUEBajYCCCACQQhqIAMoAgAgBCALEMEFAkAgAi0ACEEERg0AIAIpAwgQ2yAhAAwMCyADKAIAIQFB/QAhCyAMIQgMAwsgCkEBcQ0BIApBgP4DcUUNBgwFC0Go85oBQShBtOCaARC5IQALQajzmgFBKEG04JoBELkhAAtBACEADAELQQEhAAwACwsgAygCACgCACIAQQEQnx8gACgCBCAAKAIIIgFqQd0AOgAAIAAgAUEBajYCCAtBACEAIAZBDGoiBiAHRw0ACyADKAIAIQULIAUoAgAiAEEBEJ8fIAAoAgQgACgCCCIBakHdADoAACAAIAFBAWo2AggLQQAhAAsgAkEQaiQAIAAPC0Go85oBQShBrNyaARC5IQAL7QwBDH8jAEGwAmsiBCQAAkACQCACKAIIIgUNACAAQQA2AgggAEKAgICAgAE3AgAMAQsgBEHoAWogBUEIQSgQhQ8gBCgC7AEhBgJAAkAgBCgC6AFBAUYNACAEQQA2AjggBCAEKALwASIHNgI0IAQgBjYCMCAEQShqIAVBf2ogAigCCCIGEOEaIAQoAiwhBSACIAQoAigiCDYCCCAEIAI2AkQgBCAFNgJIIAQgBiAFazYCTCAEIAIoAgQiBiAFQShsIgVqIgk2AkAgBSAIQShsIgprIQggBiAKaiEKIARB6AFqQQhqIQsgBEGoAWohDCAEQZgBakEEciENQQAhBQNAIAohBgJAAkACQCAIRQ0AIARB0ABqIAZBKPwKAAAgBEGYAWogBkEo/AoAACAGQShqIQoCQAJAAkACQAJAIAQoApgBIg5BB0YiDw0AIA5BAkYNAQJAIAUgBCgCMEcNACAEQTBqEL4aCyAEKAI0IgcgBUEobGogBEHQAGpBKPwKAAAgBCAFQQFqIgU2AjggD0UNBwwECyAEKAKcAQ0BIARB6AFqIAFBACAEKAKoARDOESAEKALsASEOAkAgBCgC6AEiD0EHRw0AIAQgCjYCPCAAQYCAgIB4NgIAIAAgDjYCBCAEQTxqEPYKDAoLIAQgCykDGDcDkAEgBCALKQMQNwOIASAEIAspAwg3A4ABIAQgCykDADcDeAJAIAUgBCgCMEcNACAEQTBqEL4aIAQoAjQhBwsgByAFQShsaiIGIA42AgQgBiAPNgIAIAYgBCkDeDcDCCAGIAQpA5ABNwMgIAYgBCkDiAE3AxggBiAEKQOAATcDECAEIAVBAWoiBTYCOCAEKAKYAUEHRg0GDAULIARBIGogBhDKDSAEKAIkIQYgBCgCICEPDAELIARBGGogDRCfEyAEKAIcIQYgBCgCGCEPCyAEQfiAgIB4NgLoASABIA8gBiAEQegBahD1HSAOQQdHDQILIAwQuiIMAgsgBCAJNgI8IARBPGoQ9goCQCACKAIIIgZFDQAgAiAGQX9qIgY2AgggBEGYAWogAigCBCAGQShsaiIGQSj8CgAAAkACQAJAAkACQAJAIAQoApgBIgpBB0YNACAEQRBqIAYQyg0gBCAGKQMINwOQAiAEIAYpAxA3A5gCIAQgBikDGDcDoAIgBCAGKQMgNwOoAiAEKAKcASELIApBAkcNBSADKAIARQ0FIAMoAgQhBiADKAIIIQggBEG6gICAeDYC6AEgASAGIAggBEHoAWoQ9R0MAQsgBEEIaiAEQZgBakEEchCfEyAEKAKcAUEBRw0CIAQoAqQBIQggBCgCoAEhCgJAIAQoAqgBIgYoAgBBDE8NACAEKAIMIQsgBCgCCCEOIARBgIGAgHg2AugBIAEgDiALIARB6AFqEPUdCwJAIAMoAgBBAUcNACADKAIIIQsgAygCBCEOIARBuoCAgHg2AugBIAEgDiALIARB6AFqEPUdCyAEIAYQowQgBCgCBCEOIAQoAgAhDyAEQcABaiABQQAgBhDOESAEKALAAUEHRg0BQQhBKBDqICILIARBwAFqQSj8CgAAIAQgDjYCzAEgBCAPNgLIASAEIAg2AtQBIAQgCjYC0AEgBEEANgLYASAEIAQpA+ABNwOoAiAEIAQpA8gBNwOQAiAEIAQpA9ABNwOYAiAEIAQpA9gBNwOgAgtBAiEKDAMLIAQoAsQBIQsMAQsgBEHoAWogAUEAIAQoAqgBEM4RIAQoAuwBIQsgBCgC6AEiCkEHRg0AIAQgBCkDiAI3A6gCIAQgBCkDgAI3A6ACIAQgBCkD+AE3A5gCIAQgBCkD8AE3A5ACDAELIABBgICAgHg2AgAgACALNgIEDAYLAkAgBSAEKAIwRw0AIARBMGoQvhoLIAQoAjQiBiAFQShsIg5qIgggBCkDqAI3AyAgCCAEKQOgAjcDGCAIIAQpA5gCNwMQIAggBCkDkAI3AwggCCALNgIEIAggCjYCACAEIAVBAWo2AjgCQCABLQB4QQhxRQ0AIA5BKGohBQNAIAVFDQEgASAGEMcKIAVBWGohBSAGQShqIQYMAAsLIAAgBCgCODYCCCAAIAQpAjA3AgAMBgtB+I2bARDEIwALIARBmAFqEMkVCyAIQVhqIQgMAAsLIAYgBCgC8AEQ/iAACyAEQTBqEKUhCyACEKEUIARBsAJqJAAL9gwCBn8BfiMAQcAAayICJAACQAJAAkACQAJAAkACQAJAAkADQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCACIDQXRqQQcgA0ELSxsOJQMTEwQTExMTAAgTCRMTBQwTExMBExMTExMTExMTExMTExMTEwITCyABKAIIDgMFEgYFCyABLQAcQQJHDQMMEQsgASgCBCIBKAIAIgNBA0YNByADDgMMDQsMCyACQShqQQRBAUEBEIUPIAIoAiwhAyACKAIoDQ4gAigCMCEBIABBBDYCCCAAIAE2AgQgACADNgIAIAFB9NClmwc2AAAMEAsgAS0AHEECRg0OCyACQQA2AiAgAkKAgICAEDcCGCACQdTUmgE2AiwgAkKggICABjcCMCACIAJBGGo2AiggAUEIaiACQShqEOcdDQcgACACKAIgNgIIIAAgAikCGDcCAAwOCyACQShqIAEoAigQ5QICQAJAIAIoAihBgICAgHhGDQAgAiACKAIwNgIgIAIgAikCKDcDGAwBCyACQQA2AiAgAkKAgICAEDcDGAsgAkHgBK1CIIYgAUEQaq2ENwMwIAJB5QStQiCGIAJBGGqthDcDKCAAQbiAgAEgAkEoahDOCCACKAIYIAIoAhwQsiMMDQsgAkEoaiABKAIoEOUCAkACQCACKAIoQYCAgIB4Rg0AIAIgAigCMDYCECACIAIpAig3AwgMAQsgAkEANgIQIAJCgICAgBA3AwgLIAJBKGogASgCDBDlAgJAAkAgAigCKEGAgICAeEYNACACIAIoAjA2AiAgAiACKQIoNwMYDAELIAJBADYCICACQoCAgIAQNwMYCyACQeUErUIghiIIIAJBGGqthDcDMCACIAggAkEIaq2ENwMoIABBuICAASACQShqEM4IIAIoAhggAigCHBCyIyACKAIIIAIoAgwQsiMMDAsCQCABKAIIDQAgAkHgBK1CIIYgAUEQaq2ENwMoIABBnICAASACQShqEM4IDAwLIAJBKGogASgCDBDlAgJAAkAgAigCKEGAgICAeEYNACACIAIoAjA2AiAgAiACKQIoNwMYDAELIAJBADYCICACQoCAgIAQNwMYCyACQeUErUIghiACQRhqrYQ3AyggAEGcgIABIAJBKGoQzgggAigCGCACKAIcELIjDAsLIAEtABhBBUcNCQsgASgCECEBDAALCyABKAIIDQYgAiABQRBqEJIUIAIoAgAhBAJAIAIoAgQiBUUNACAEIAVqIQYgBCEBA0AgAUEBaiEDAkACQCABLAAAIgdBf0wNACADIQEMAQsCQAJAIAdBYEkNAAJAIAdBbUcNACADIAZGDQUgAUECaiAGRg0FIAEtAAFBnwFLDQIgAUEDaiEBDAMLIAMgAUECaiADIAZGGyIBIAEgBkdqIQEgB0FwSQ0CIAEgASAGR2ohAQwCCyADIAFBAmogAyAGRhshAQwBCyAAQYCAgIB4NgIADAoLIAEgBkcNAAsLIAJBKGogBUEBQQEQhQ8gAigCLCEDAkAgAigCKEEBRg0AIAIoAjAhASAFRQ0FIAVFDQUgASAEIAX8CgAADAULIAMgAigCMBD+IAALQbmVmwFBNyACQT9qQezUmgFB8JWbARDdFAALIAJBKGogASgCIBDlAgJAAkAgAigCKEGAgICAeEYNACACIAIoAjA2AhAgAiACKQIoNwMIDAELIAJBADYCECACQoCAgIAQNwMICyACQShqIAEoAgQQ5QICQAJAIAIoAihBgICAgHhGDQAgAiACKAIwNgIgIAIgAikCKDcDGAwBCyACQQA2AiAgAkKAgICAEDcDGAsgAkHlBK1CIIYiCCACQRhqrYQ3AzAgAiAIIAJBCGqthDcDKCAAQbiAgAEgAkEoahDOCCACKAIYIAIoAhwQsiMgAigCCCACKAIMELIjDAULIAJBKGogASgCIBDlAgJAAkAgAigCKEGAgICAeEYNACACIAIoAjA2AiAgAiACKQIoNwMYDAELIAJBADYCICACQoCAgIAQNwMYCyACQeAErUIghiABQQhqrYQ3AzAgAkHlBK1CIIYgAkEYaq2ENwMoIABBuICAASACQShqEM4IIAIoAhggAigCHBCyIwwECyAAQYCAgIB4NgIADAMLIAAgBTYCCCAAIAE2AgQgACADNgIADAILIAMgAigCMBD+IAALIABBgICAgHg2AgALIAJBwABqJAALjAwCCn8BfiMAQeAAayIGJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADKAIADQAgBiADLQAYIgc6AFwgBiADKAIUIgg2AlggBiADKAIQNgJUIAYgAygCDCIJNgJQIAYgAygCCCIKNgJMIAZBATYCRCABLQCsDUEBRg0EAkAgASkDAEIChSABKQMIhFANACACKALIBEECRg0GIAFBkAVqIQsgAkGYA2ohDAJAAkACQAJAIAEoApAK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BCEDQQgQigEiAUUNBCABQQA2AgAgACACKQIgNwIwIAAgAikCKDcCOCAAIAIpAjA3AkAgASADNgIEIAAgAkGwAWpBKPwKAAAgACABNgIsIAAgBToAKAwFCyACQRxqQZzSiQFB5NiJARDMHAALIAIgAigCKDYCWCACIAIpAiA3A1AgAiABKAIAIgMpAlA3AlwgAiADKAJYNgJkIAJBITYCsAEgAEEEaiABKAIEIAEoAgggAkHQAGogAkGwAWoQ3g4gAEGEgICAeDYCAAwDC0EEQQgQoiQACyACQRU2ArABIABBBGogASgCBCAEIAJBIGogAkGwAWoQ3g4gAEGEgICAeDYCAAwBC0EEQQgQoiQACyACQfABaiQAC9QLAg9/A34jAEHgAGsiAyQAIAEgASgCeCIEQf////9+cTYCeCACKAIIIQVBACEGIANBADYCCCADQoCAgIDAADcCACACKQMAIRIgASgCxAEhBwJAAkACQAJAIAEoAsgBIggNACASQgODIRNBACEGDAELIAhBA3QhCSASQgODIRMgEqciCkEYaiELIApBA3EhDCACKAIMIQ1BBCEOIAchDwNAAkACQCASIA8pAwAiFFENACAMQQFGDQEgDCAUpyIQQQNxRw0BIAopAwggECkDCFINASAKKAIQIhEgECgCEEcNASALIBBBGGogERC6GA0BCwJAIBNCAFINACAKIAooAgAiEEEBajYCACAQQX9MDQQLIANBxICAgHg2AjAgAyASNwM4IAUgDSADQTBqEMYbIRACQCAGIAMoAgBHDQAgAxC7GiADKAIEIQ4LIA4gBkECdGogEDYCACADIAZBAWoiBjYCCAsgD0EIaiEPIAlBeGoiCQ0ACwsgE0IAUg0BIBKnIg8gDygCACIPQQFqNgIAIA9Bf0oNAQsACwJAIAggAUHAAWoiDygCAEcNACAPEMcaIAEoAsQBIQcLIAcgCEEDdGogEjcDACABIAhBAWo2AsgBAkACQAJAAkACQCABLQC4AUHdAEYNACABIAEoAngiD0H/////fXE2AnggA0EwaiABEI4KIAEgDzYCeCADKAI0IQ8gAygCMCIRQRNGDQEgAyADKQNANwMYIAMgAykDSDcDICADIAMpA1A3AyggAygCPCEMIAMoAjghCSADKAJYIRAgAygCXCEIDAILIANBADYCFCADQoCAgIDAADcC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DiEMCyABIA02AnggAiASNwNoIAIgETYCZCACIAw2AmAgAiAPNgJcIAIgEDYCWAsgAkEwaiACQdgAakEo/AoAAAJAIAMgAigCJEcNACACQSRqEL4aIAIoAighBAsgBCALaiACQTBqQSj8CgAAIAtBKGohCyADQQFqIQMMAQsLIAJBBTYCWAwDCyADIAIoAogBEP4gAAsgASANNgJ4CyACQQY2AlggAiAMNgJcIAoQnSELIAAgAigCLDYCCCAAIAIpAiQ3AgAgAkHgA2okAAvJDAINfwJ+IwBB4AFrIgEkACAAKAIAIgIoAgAhAyACQQA2AgAgA0EIaigCACEEIANBBGooAgAhBSADKAJ8IQZBBEEEEOweIgIgBjYCACABQQE2AnwgASACNgJ4IAFBATYCdCABQQA2AogBIAFCgICAgMAANwKAASABQQA2ApgBIAFCgICAgMAANwKQASAFIARqIQdBBCEIQQAhCUEAIQIDfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACIARPDQAgBSACaiIKLQAAIgtBIEkNAUEBIQwgC0H+AE0NEQJAIAJFDQAgC8BBv39MDQMLIAEgBzYCpAEgASAKNgKgASABQQhqIAFBoAFqEOIMIAEoAghBAUcNAyABKAIMIgtBgIDEAEYNAwJAIAtBgAFJDQBBAkEDQQQgC0GAgARJGyALQYAQSRshDCAJIAEoAoABRg0FDAsLIAIgBmohCkEBIQwgC0H/AEYNCyALQR9LIQ1BASEMDA0LAkAgASgCfCICRQ0AIAEoAnggAkECdGpBfGoiC0UNACAGIARqIgQgCygCACILSQ0FIAsgBEcNACABIAJBf2o2AnwLIAEgASgCfCICNgKoASABIAEpAnQiDjcDoAEgASABKQKAASIPNwKsASABIAEoAogBIgQ2ArQBIAEgASkCkAE3A7gBIAEgASgCmAE2AsABIAEgDjcDaCABIAI2AnAgASAENgKIASABIA83A4ABIAEgASgCwAE2ApgBIAEgASkDuAE3A5ABIAFCADcD2AEgAUIANwPQASABQgA3A8gBIAFCADcDwAEgAULzytHLp4zZsvQANwO4ASABQoPfkfOWzNy35AA3A7ABIAFC4eSV89bs2bzsADcDqAEgAUL1ys2D16zbt/MANwOgASABQaABaiADQQRq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CwJAIANBMGooAgAiBEUNACAEIAEQvQELIANBOGoiAyAFRw0ACwsCQCAAKAIYIgNFDQAgAyABEL0BCwJAIAAoAhwiA0UNACADIAEQvQELIAAoAgwhAAwCCyAAKAIEIAEQvQEgACgCCCEADAELIAAoAgQgARC9ASAAKAIIIQAMAAsLAkAgACgCBCIEQdAAaigCACIARQ0AIABBMGwhAyAEQcwAaigCACEAA0AgACABEPwCIABBMGohACADQVBqIgMNAAsLAkACQAJAIAQoAgBBeWoOAgECAAsgBCABEOILCyAEQTBqKAIAIgBFDQAgAEEwbCEDIARBLGooAgAhAANAIAAgARD8AiAAQTBqIQAgA0FQaiIDDQALCyAEKAJgQYCAgIB4Rg0AIARB6ABqKAIAIgBFDQAgAEEwbCEDIARB5ABqKAIAIQADQCAAIAEQ/AIgAEEwaiEAIANBUGoiAw0ACwsPCyAAKAIEIAEQvQELogwCCn8BfiMAQeABayICJAAgAiABKAKwASIDNgIUAkACQAJAIAEtALgBQc8ARg0AQQghBAwBCyABQbABaiEFAkACQCABKAKIASIEQQtHDQAgAkE4aiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDOCACIAEoAqABNgJAIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahDACwsgASAENgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEpA7ABIQwgBSACKQM4NwIAIAUgAigCQDYCCCABIAw3A6gBAkACQAJAAkACQAJAAkAgAS0AuAENAAJAAkAgASgCiAEiBEELRw0AIAJBOGogARDEAQwBCyABQQs2AogBIAIgASkCmAE3AzggAiABKAKgATYCQCABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBDYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABKQOwASEMIAUgAikDODcCACAFIAIoAkA2AgggASAMNwOoASACQThqIAFBABBzIAIoAjwhBiACKAI4IgRBB0YNBSACIAIpA1g3A8ABIAIgAikDUDcDuAEgAiACKQNINwOwASACIAIpA0A3A6gBIAIgBjYCpAEgAiAENgKgASABLQCBAUEgcUUNAiABLQC4ASIHQQlHDQMgASgCsAEhCAJAAkAgASgCiAEiB0ELRw0AIAJBOGogARDEAQwBCyABQQs2AogBIAIgASkCmAE3AzggAiABKAKgATYCQCABQYwBaiEJAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBzYCCCABIAkpAgA3AgwgASAJKAIINgIUCyABKQOwASEMIAUgAikDODcCACAFIAIoAkA2AgggASAMNwOoASABIAEoAngiB0H/3/+/f3FBgCByNgJ4IAJBCGogASgCsAEgARDsAyACKAIIIQkgASAHNgJ4IAIoAgwhBwJAIAlBAXFFDQAgByEGDAULIAJBwAFqIQkCQAJAIAQOBwEAAAADAwMBCyACQbgBaiEJCyABKAKsASEKQQRBDBDkICILIAo2AgggCyAINgIEIAsgBzYCACAJEN8eIAkgCzYCAAwCC0EHIQQMBQsgBxCYIwsgAS0AuAEhBwsCQCAHQf8BcUEBRw0AIAJBqAFqIQcCQAJAIAEoAogBIglBC0cNACACQThqIAEQxAEMAQsgAUELNgKIASACIAEpApgBNwM4IAIgASgCoAE2AkAgAUGMAWohCAJAIAEoAghBCkYNACABQQhqEMALCyABIAk2AgggASAIKQIANwIMIAEgCCgCCDYCFAsgASkDsAEhDCAFIAIpAzg3AgAgBSACKAJANgIIIAEgDDcDqAEgAiAHKQMANwMYIAIgBykDCDcDICACIAcpAxA3AyggAiAHKQMYNwMwDAMLIAEoArQBIQQgASgCsAEhBiACQcwBaiAHEMglIAJBjwKtQiCGQcLwmgGthDcD2AEgAkE4akHNlYABIAJB2AFqELIQIAIgAikCzAE3AkQgAiACKALUATYCTCAGIAQgAkE4ahDGGyEGIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgAkGgAWoQ1AsLIABBCTYCACAAIAY2AgQMAgsgAiACKQMwNwNYIAIgAikDKDcDUCACIAIpAyA3A0ggAiACKQMYNwNAIAJBoAFqIAFBABCwCCACIAE2AmAgAiAGNgI8IAIgBDYCOCACKAKgASEFIAIgAkEUajYCZAJAIAVBgICAgHhHDQAgAigCpAEhAQJAIARBB0YNACACQThqENQLCyAAQQk2AgAgACABNgIEDAILIAIgAikCsAE3A5gBIAIgAikCqAE3A5ABIAIgAikCoAE3A4gBIAIgAkHAAGoiBSkDADcDaCACIAUpAwg3A3AgAiAFKQMQNwN4IAIgBSkDGDcDgAEgASgCrAEhAQsgACAGNgIEIAAgBDYCACAAIAIpA2g3AwggACACKQNwNwMQIAAgAikDeDcDGCAAIAIpA4ABNwMgIAAgAikDiAE3AyggACACKQOQATcDMCAAIAIpA5gBNwM4IAAgATYCRCAAIAM2AkALIAJB4AFqJAAL2QsCEH8CfiMAQZABayICJAACQAJAAkACQAJAAkACQCABKAIEIgMgASgCDEYNACABKAIkIQQgASADQQxqNgIEIAMoAgghBSADKAIEIQYgAygCACEHIAEoAhAhCCACQQhqIAMQ9QwgAigCDCEJIAIoAgghCgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAcNACAGKAIAIgNBe2oiC0EEIANBBEsbDgYBAwIEBQYBCyABKAIUIQwgCCABKAIcKAIAQX9qRw0HIAxB3AFqIAEoAiAQ4wsiA0UNCiADKAIEIQ0gAygCACEDIAJBuoCAgHg2AlAgDCADIA0gAkHQAGoQ9R0MCgsgBikDCCISQiCIpyEFIAYpAxghEyASpyEDQQEhDEEAIQRBACENIAYoAhQiByEJIAYoAhAiDiEKDAgLIAYoAighBCAGKQMgIRMgBigCHCEHIAYoAhghDiAGKAIUIQUgBigCECEDQQEhDEEAIQ0MBwsgAiAGKQMgNwMoIAIgBikDGDcDICACIAYpAxA3AxggAiAGKQMINwMQIAJB0ABqIAEoAhQgASgCGC0AAEEBciAGKAIoEM4RIAIoAlQhDgJAIAIoAlAiA0EHRg0AIAIgAikDcDcDSCACIAIpA2g3A0AgAiACKQNgNwM4IAIgAikDWDcDMEEIQSgQ6iAiDSAONgIEIA0gAzYCACANIAIpAzA3AwggDSACKQM4NwMQIA0gAikDQDcDGCANIAIpA0g3AyAgAigCECEKIAIoAhQhCSACKAIYIQMgAigCHCEFIAIoAiAhDiACKAIkIQcgAikDKCETIAYoAgBBe2ohC0EAIQwMBwsgAkEQahCNGgwFCyAGQcQAaiENIAZBwABqIQMMAgsgBkHkAGohDSAGQeAAaiEDDAELIAYoAigiA0E0aiENIANBMGohAwsgAygCACEDIA0oAgAhDSACQb6AgIB4NgJQIAMgDSACQdAAahDGGyEOIAEoAhQiAy0AyAFBogFHDQEgAxDWFCENIAMQ6BEgAyANEIwUDAELIAJBu4CAgHg2AlAgDCAKIAkgAkHQAGoQ9R0MAgsCQCAGKAIAQXtqQQNJDQAgBhDYDwsgBkHwAEEIENwUDAILAkAgC0EDSQ0AIAYQ2A8LIAZB8ABBCBDcFCADIQYMBwsCQAJAAkAgASgCGC0AAEECSQ0AIAchAwNAAkAgAygCACINQXRqQQcgDUELSxsiDUEXRg0AIA1Bf2pBAkkNAyACQdAAaiAMQQMgBxDOESACKAJUIQ4gAigCUCIDQQdGDQUgAiACKQJcNwN4IAIgAikCZDcDgAEgAiACKAJsNgKIAUEEIQ0gAigCWCEEIAIoAnAhCyACKAJ0IQ9BACEQIANBBEYNBCADIQ0MCQsgAygCBCEDDAALCyAHKAIAQRpGDQUgAkHugICAeDYCUCAMIAogCSACQdAAahD1HQwECyACQcCAgIB4NgJQIAwgCiAJIAJB0ABqEPUdDAMLIAJBgIGAgHg2AlAgDCAKIAkgAkHQAGoQ9R0MBAsgBBDoIiABIAhBAWo2AhAgBCAONgIACyAAQQM2AgAMBQtBASEQQQUhDSAKIQ4gCSEEQQEhEQwCCyACIAcpAgw3A3ggAiAHKQIUNwOAASACIAcoAhw2AogBIAcoAgghBEEAIQtBASEQQQAhDQtBACERC0EIQSgQ6iAiAyAENgIIIAMgDjYCBCADIA02AgAgAyAPNgIkIAMgCzYCICADIAIpA3g3AgwgAyACKQOAATcCFCADIAIoAogBNgIcQQIhDEEAIQ4CQCAQDQAMAQsCQAJAIAcoAgBBGkcNACARRQ0BIAcpAwgQnCEMAQsgBxCEBwsgB0HAAEEIENwUCyAAIAQ2AjAgACANNgIoIAAgEzcDICAAIAc2AhwgACAONgIYIAAgBTYCFCAAIAY2AhAgACAJNgIMIAAgCjYCCCAAIAM2AgQgACAMNgIAIAEgCEEBajYCEAsgAkGQAWokAAuqCwEQfyMAQaABayICJAAgAkEQaiABEOkBIAIoAhQhAwJAAkAgAigCECIEQYCAgIB4Rw0AIABBgICAgHg2AgAgACADNgIEDAELIAIoAhghBSACQRBqQQRBCEEoEIUPIAIoAhQhBgJAAkACQAJAAkACQCACKAIQQQFGDQBBACEHIAJBADYCDCACIAIoAhgiCDYCCCACIAY2AgQgAyAFQQZ0IglqIQogAyEGIAVFDQEgAkEQakEEciEFQQghC0EAIQwDQAJAAkACQAJAIAMgB2oiBigCACINQQdGDQAgBkE4aigCACEOIAZBNGooAgAhDyAGQTBqKAIAIRAgBSAGQQRqKQIANwIAIAUgBkEMaikCADcCCCAFIAZBFGopAgA3AhAgBSAGQRxqKQIANwIYIAUgBkEkaigCADYCICACIA02AhACQAJAAkAgDQ4EBQABAgQLIAIgBkEIaikCADcDaCACIAZBEGopAgA3A3AgAiAGQRhqKQIANwN4IAIoAhQhEQwFCyACIAZBCGopAgA3A2ggAiAGQRBqKQIANwNwIAIgBkEYaigCADYCeCACKAIUIREMBAsgAiAGQQhqKQIANwNoIAIgBkEQaikCADcDcCACIAZBGGopAgA3A3ggAigCFCERDAMLIAZBwABqIQYMBQsgBkHAAGohBSACQYgBakEEciABLQC4ASILEMglIAJB1wA2ApwBIAJB2OqaATYCmAEgAkGwgICAeDYCiAEgASgCsAEgASgCtAEgAkGIAWoQxhshDSALQaIBRg0GDAcLIAIgBkEgaikCADcDgAEgAiAGQRhqKQIANwN4IAIgBkEQaikCADcDcCACIAZBCGopAgA3A2gLIAIgAikDgAE3A1AgAiACKQN4NwNIIAIgAikDcDcDQCACIAIpA2g3AzgCQCAMIAIoAgRHDQAgAkEEahC+GiACKAIIIQgLIAggC2oiBkF8aiARNgIAIAZBeGogDTYCACAGIAIpAzg3AwAgBiACKQNANwMIIAYgAikDSDcDECAGIAIpA1A3AxggAiAMQQFqIgw2AgwgDyAOEOwdIBAgDxD9IyALQShqIQsgCSAHQcAAaiIHRw0ADAMLCyAGIAIoAhgQ/iAACyAKIAZGDQAgCiAGa0EGdiEFA0AgBkE0aiINKAIAIAZBOGooAgAQ7B0gBkEwaigCACANKAIAEP0jIAYQ1AsgBkHAAGohBiAFQX9qIgUNAAsLIAQgAxD/IwJAIAEtALgBIgZBAUcNAAJAAkAgASgCiAEiBkELRw0AIAJBEGogARDEAQwBCyABQQs2AogBIAIgASkCmAE3AxAgAiABKAKgATYCGCABQYwBaiEFAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBjYCCCABIAUpAgA3AgwgASAFKAIINgIUCyABIAIoAhg2ArgBIAEgASkDsAE3A6gBIAEgAikDEDcCsAEgACACKAIMNgIIIAAgAikCBDcCAAwECyABKAK0ASEFIAEoArABIQ0gAkHcAGogBhDIJSACQY8CrUIghkHC8JoBrYQ3A2ggAkEQakHNlYABIAJB6ABqEM4IIAIgAikCXDcCHCACIAIoAmQ2AiQgDSAFIAJBEGoQxhshBgJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgAEGAgICAeDYCACAAIAY2AgQMAgsgARDLFCELIAEQtRAgASALEJEJCyACQRBqENQLIABBgICAgHg2AgAgACANNgIEIA8gDhDsHSAQIA8Q/SMCQCAKIAVGDQAgBkH4AGohBiAJIAdrQUBqQQZ2IQUDQCAGQXxqIg0oAgAgBigCABDsHSAGQXhqKAIAIA0oAgAQ/SMgBkFIahDUCyAGQcAAaiEGIAVBf2oiBQ0ACwsgBCADEP8jCyACQQRqEI0KIAIoAgQgAigCCBD1IwsgAkGgAWokAAvYCgIIfwF+IwBB0ABrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCACIDDQAgAUEIaiEDAkAgAC0AEA0AIAAoAhQgAxCsBhoCQCABKAIgIgRBCGooAgAiAUUNACABQQxsIQMgBEEEaigCACEBA0AgASgCACAAEL4BIAFBDGohASADQXRqIgMNAAsLENoiAkAgBEEUaigCACIBRQ0AIAFB2ABsIQMgBEEQaigCACEBA0AgASAAEOcDIAFB2ABqIQEgA0Gof2oiAw0ACwsgBCgCMCIBRQ0LIAEgABC+AQwLCyABKAIgIgQoAighBSAEKAIkIQYgAkEIaiAAIAMgBBD5AyACLQAcQQNGDQogASgCGCEEIAEoAhQhByABKAIQIQgCQCABKQMIIgpCA4NCAFINACAKpyIDIAMoAgAiA0EBajYCACADQX9MDQILIAEtABwhCSACIAIpAyA3AkggAiACKQMYNwJAIAIgAikDEDcCOCACIAIpAwg3AjBBwAAQigEiAEUNAiAAQR82AgAgACACKQIsNwIEIAAgAikCNDcCDCAAIAIpAjw3AhQgACACKQJENwIcIAAgAigCTDYCJEE4EIoBIgNFDQMgA0EAOgA0IAMgADYCMCADIAU2AiwgAyAGNgIoIANBADYCICADIAk6ABwgAyAENgIYIAMgBzYCFCADIAg2AhAgAyAKNwMIIANBADYCAEEcEIoBIgBFDQQgAEGAAjsBGCAAQQA2AhQgACAFNgIQIAAgBjYCDCAAQQE2AgggACADNgIEIABBATYCACABENsFIAEgADYCBCABQQI2AgBBAEEIEPgjDAoLIANBf2oOBwgHBgkJBQQICwALQQhBwAAQoiQAC0EIQTgQoiQAC0EEQRwQoiQACwJAIAEoAgQiASgCAA0AIAAoAhQgAUEIahCsBhoLAkACQCABLQBFQX5qDgIBBgALIAAoAhQiAyABQShqEKwGGgJAIAEoAkAiAS0AJUECRg0AIAMgAUEIahCsBhoCQCABKAIgIgEtACVBAkYNAANAIAMgAUEIahCsBhogASgCICIBLQAlQQJHDQALCyAAIAEQZAwGCyAAIAEQZAwFCyAAIAFBIGoQZAwECyAAKAIUIgUgASgCBCIBEKwGGiABQShqKAIAIgNFDQMgAUEkaigCACIBIANBMGxqIQQDQAJAIAEoAgANACAFIAFBCGoQrAYaCwJAIAFBKGooAgAiA0UNACADIAAQvgELIAFBMGoiASAERw0ADAQLCyABKAIEIQEQ2iIgAUEIaigCACIDRQ0CIAFBBGooAgAiASADQThsaiEEA0AgASAAEP0MAkAgAUEwaigCACIDRQ0AIAMgABC+AQsgAUE4aiIBIARHDQAMAwsLIAEoAgQhARDaIiABQQhqKAIAIgNFDQEgAUEEaigCACIBIANBOGxqIQQDQCABIAAQ/QwCQCABQTBqKAIAIgNFDQAgAyAAEL4BCyABQThqIgEgBEcNAAwCCwsgACgCFCABQQhqEKwGGgJAIAEoAiAiBkEIaigCACIBRQ0AIAZBBGooAgAiBCABQQZ0aiEFA0ACQCAEQThqKAIAIgFFDQAgAUEMbCEDIARBNGooAgAhAQNAIAEoAgAgABC+ASABQQxqIQEgA0F0aiIDDQALCyAEIAAQ/QwgBEHAAGoiASEEIAEgBUcNAAsLIAZBGGohBAJAIAZBFGooAgAiAUUNACABQQxsIQMgBkEQaigCACEBA0AgASgCACAAEL4BIAFBDGohASADQXRqIgMNAAsLIAQoAgBBgICAgHhGDQAgACAEEJsGCyACQdAAaiQAC6MLAhF/BH4jAEHQAGsiAiQAIAEoArABIQMgAUGwAWohBAJAAkACQCABLQC4ASIFQbV/aiIGQR9LDQBBASAGdEGBgIKQeHENAQsgBUG0f2pB/wFxQdQASw0BCyACQThqIAEgAxDfASAEIAIoAkA2AgggBCACKQI4NwIACyACQThqIAEQ/QcCQAJAAkACQAJAAkACQAJAIAItAExBAkcNACACKAI4IQEMAQsgAjUCPEIghiACKAI4IgatIhOEIRQgAikDQCEVIAEtALgBQQlHDQICQAJAIAEoAogBIgVBC0cNACACQThqIAEQxAEMAQsgAUELNgKIASACIAEpApgBNwM4IAIgASgCoAE2AkAgAUGMAWohBwJAIAEoAghBCkYNACABQQhqEMALCyABIAU2AgggASAHKQIANwIMIAEgBygCCDYCFAsgASkDsAEhFiAEIAIpAzg3AgAgBCACKAJANgIIIAEgFjcDqAECQAJAAkAgAS0AuAEiB0G1f2oiBUEfSw0AQQEgBXRBgYCCkHhxDQELIAdBtH9qQf8BcUHUAEsNAQsgAkE4aiABIAEoArABEN8BIAQgAigCQDYCCCAEIAIpAjg3AgALIAJBOGogARD9ByACLQBMQQJHDQEgAigCOCEBIBNCA4NCAFINACAGIAYoAgAiBEF/ajYCACAEQQFHDQAgBiAGKAIQEPAeCyAAQQY6ACwgACABNgIADAQLIAIpAzghEyAUUEUNASAVIRQgEyEVC0EAIQggAkEAOgAUIAJBADYCECACIBU+AgggAiAVQiCIPgIMQQMhBQwBCyACKAJAIQYgAiACKAJEIgU2AiQgAiADNgIgIAIgBTYCHCACIAY2AhggAiAVNwMIIAIgEzcDECATQiCIpyEIQQUhBQsgAiAFOgAsIAIgFDcDAAJAIAEtALgBQQhHDQAgAUEMaiEJIAFBCGohCiABQZgBaiELIAFBjAFqIQwgAkEtaiENIAJBHGohDiACQRVqIQ8gAkEEciEQA0ACQAJAIAEoAogBIgZBC0cNACACQThqIAEQxAEMAQsgAUELNgKIASACIAspAgA3AzggAiALKAIINgJAAkAgASgCCEEKRg0AIAoQwAsLIAogBjYCACAJIAwpAgA3AgAgCSAMKAIINgIICyABKQOwASEVIAQgAikDODcCACAEIAIoAkA2AgggASAVNwOoAQJAAkACQCABLQC4ASIHQbV/aiIGQR9LDQBBASAGdEGBgIKQeHENAQsgB0G0f2pB/wFxQdQASw0BCyACQThqIAEgASgCsAEQ3wEgBCACKAJANgIIIAQgAikCODcCAAsgAkE4aiABEP0HAkAgAi0ATEECRw0AIAIoAjghASAAQQY6ACwgACABNgIAIAIQ/BMMAwsgAigCRCERIAIoAkAhEiACKQM4IRUgASgCrAEhBwJAAkACQAJAIAVBfWpBASAFQf8BcUECSxtB/wFxDgMCAAECC0EwEIoBIgZFDQYgBiACKQMoNwMoIAYgAikDIDcDICAGIAIpAxg3AxggBiACKQMQNwMQIAYgAikDCDcDCCAGIAIpAwA3AwBBAiEFDAILQZKFmwFBkQFB3IWbARDrGwALIBSnIQYgAiAQKQIINwNAIAIgECkCADcDOCACIA8vAAA7ATQgAiAPLQACOgA2IAghBQsgDiACKQNANwIIIA4gAikDODcCACANIAIvATQ7AAAgDSACLQA2OgACIAIgBToALCACIAY2AhggAiAHNgIUIAIgAzYCECACIBE2AgwgAiASNgIIIAIgFTcDACAHIQggFSEUIAEtALgBQQhGDQALCyAAIAIpAyg3AyggACACKQMgNwMgIAAgAikDGDcDGCAAIAIpAxA3AxAgACACKQMINwMIIAAgAikDADcDAAsgAkHQAGokAA8LQQhBMBCiJAAL5goBCn8jAEEgayIDJAAgASABKAJoIgRBAWoiBTYCaCABIAEoAlwiBkF/aiIHNgJcIAEgASgCWCIIQQFqIgk2AlgCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAGQQFGDQACQAJAIAksAAAiCkF/TA0AIApB/wFxIQoMAQsgCC0AAkE/cSELIApBH3EhDAJAIApBX0sNACAMQQZ0IAtyIQoMAQsgC0EGdCAILQADQT9xciELAkAgCkFwTw0AIAsgDEEMdHIhCgwBCyALQQZ0IAgtAARBP3FyIAxBEnRBgIDwAHFyIQoLQQEhCwJAIApBpH9qDh0PCwsLCwsFCwsLBwsLCwsLCwsCCwsLAwsEDQYLDAALIApBdmoOBAkKCgcICyADQaKAgIB4NgIIIAQgBCADQQhqENskIQEgAEECNgIAIAAgATYCBAwRC0EKIQpBASELDAwLQQ0hCkEBIQsMCwtBCSEKQQEhCwwKC0EIIQpBASELDAkLQQshCkEBIQsMCAtBDCEKQQEhCwwHCyABIARBAmo2AmggASAGQX5qIgo2AlwgASAIQQJqIgs2AlgCQCAKRQ0AIAstAABBCkcNACABIARBA2o2AmggASAGQX1qNgJcIAEgCEEDajYCWAsgAEEANgIADAoLIApB2L9/akECTw0BCyAAQQA2AgAgAUEBQQJBAyAKQYAQSRsgCkGAAUkbIgogBWo2AmggASAHIAprNgJcIAEgCSAKajYCWAwICyAKQfj//wBxQTBGDQQgCkGAAU8NAkEBIQsMAwsgASAEQQJqNgJoIAEgBkF+ajYCXCABIAhBAmo2AlggA0EIaiABQQIQhQUgAygCCCIKQQJGDQUCQCAKQQFHDQAgACADKAIMIgE2AgQgACABQYCAxABJNgIADAcLIANBEDYCECADQeybmQE2AgwgA0GkgICAeDYCCCABKAJoIAQgA0EIahDzJCEBIABBAjYCACAAIAE2AgQMBgsgAyABEI4EIAMoAgBBA0YNAyAAIAMoAgQ2AgQgAEEBNgIADAULQQIhCyAKQYAQSQ0AQQNBBCAKQYCABEkbIQsLIAAgCjYCBCAAQQE2AgAgASALIAVqNgJoIAEgByALazYCXCABIAkgC2o2AlgMAwsgASAEQQJqIgU2AmggASAGQX5qIgs2AlwgASAIQQJqIgk2AlgCQCAKQTBHDQACQCALRQ0AIAktAABB+AFxQTBGDQELIABCATcCAAwDCwJAAkAgAg0AIANBlYCAgHg2AgggASAEIANBCGoQ+A4gCkE4Tw0BIApBUGohCgJAAkAgASgCXCILRQ0AIAEoAlgiCS0AAEFQaiIGQQhJDQELIAAgCjYCBCAAQQE2AgAMBQsgASALQX9qIgg2AlwgASAJQQFqIgU2AlggASABKAJoIgdBAWo2AmggCkEDdCAGciEKAkACQCAIRQ0AIAUtAABBUGoiBkEISQ0BCyAAQQE2AgAgACAKQf8BcTYCBAwFCwJAIApB/wFxIghBH0sNACAAQQE2AgAgASAHQQJqNgJoIAEgC0F+ajYCXCABIAlBAmo2AlggACAKQQN0IAZyQf8BcTYCBAwFCyAAQQE2AgAgACAINgIEDAQLIANBlYCAgHg2AgggBSAEIANBCGoQ3CQhASAAQQI2AgAgACABNgIEDAMLQfybmQEQxCMACyADIAMoAgQiCikDGDcDGCADIAopAxA3AxAgAyAKKQMINwMIIApBIEEIENwUIAEoAmggBCADQQhqEPMkIQEgAEECNgIAIAAgATYCBAwBCyADKAIMIQEgAEECNgIAIAAgATYCBAsgA0EgaiQAC4kMAQl/IwBBwAJrIgMkAAJAAkACQCAAKAIALQAAIgRBpAFHDQAgAS0AuAEiAEGjAUYNASADQcgAaiEFIANBwABqQQRyIQYgA0GIAmpBBGohBwNAIAEoArABIQRBACEIQQQhCUEAIQoCQCAAQf8BcUEYRw0AIANBiAJqIAFBARDdASADKAKMAiEJIAMoAogCIghBgICAgHhGDQQgAygCkAIhCiABLQC4ASEACwJAAkACQAJAIABB/wFxQah/ag4IAQAAAAAAAAEACyABIAEoAngiAEH///v/fnFBgICAgAFyNgJ4IAMgCjYCkAIgAyAJNgKMAiADIAg2AogCIANBqAFqIAEgBEEBIANBiAJqEEIgASAANgJ4IAMoAqgBQRNHDQEgAygCrAEhCQwGCyADIAo2ApQCIAMgCTYCkAIgAyAINgKMAiADIAE2AogCIANBwABqIAEgBxBAIAMoAkQhCSADKAJAIgpBCkYNBQwBCyAHIAMpA9ABNwIoIAcgAykDyAE3AiAgByADKQPAATcCGCAHIAMpA7gBNwIQIAcgAykDsAE3AgggByADKQOoATcCACAGIAMpAogCNwIAIAYgAykCkAI3AgggBiADKQKYAjcCECAGIAMpAqACNwIYIAYgAykCqAI3AiAgBiADKQKwAjcCKCAGIAMoArgCNgIwQQkhCiADKAJEIQkLIAMgBSkDKDcDoAEgAyAFKQMgNwOYASADIAUpAxg3A5ABIAMgBSkDEDcDiAEgAyAFKQMINwOAASADIAUpAwA3A3gCQCACKAIIIgggAigCAEcNACACEMAaCyACKAIEIAhBOGxqIgAgAykDoAE3AzAgACADKQOYATcDKCAAIAMpA5ABNwMgIAAgAykDiAE3AxggACADKQOAATcDECAAIAMpA3g3AwggACAJNgIEIAAgCjYCACACIAhBAWo2AgggAS0AuAEiAEGjAUcNAAwCCwsgAyAEOgADAkAgAS0AuAEiAEGjAUYNACADQcgAaiEFIANBwABqQQRyIQYgA0GIAmpBBGohCgNAIABB/wFxIgkgBEYNAiABKAKwASELAkACQCAJQRhGDQBBACEIQQQhCUEAIQcMAQsgA0GIAmogAUEBEN0BIAMoAowCIQkgAygCiAIiCEGAgICAeEYNBCADKAKQAiEHIAEtALgBIQALAkACQAJAAkAgAEH/AXFBqH9qDggBAAAAAAAAAQALIAEgASgCeCIAQf//+/9+cUGAgICAAXI2AnggAyAHNgKQAiADIAk2AowCIAMgCDYCiAIgA0HYAWogASALQQEgA0GIAmoQQiABIAA2AnggAygC2AFBE0cNASADKALcASEJDAYLIAMgBzYClAIgAyAJNgKQAiADIAg2AowCIAMgATYCiAIgA0HAAGogASAKEEAgAygCRCEJIAMoAkAiB0EKRw0BDAULIAogAykDgAI3AiggCiADKQP4ATcCICAKIAMpA/ABNwIYIAogAykD6AE3AhAgCiADKQPgATcCCCAKIAMpA9gBNwIAIAYgAykCiAI3AgAgBiADKQKQAjcCCCAGIAMpApgCNwIQIAYgAykCoAI3AhggBiADKQKoAjcCICAGIAMpArACNwIoIAYgAygCuAI2AjBBCSEHIAMoAkQhCQsgAyAFKQMoNwM4IAMgBSkDIDcDMCADIAUpAxg3AyggAyAFKQMQNwMgIAMgBSkDCDcDGCADIAUpAwA3AxACQCACKAIIIgggAigCAEcNACACEMAaCyACKAIEIAhBOGxqIgAgAykDODcDMCAAIAMpAzA3AyggACADKQMoNwMgIAAgAykDIDcDGCAAIAMpAxg3AxAgACADKQMQNwMIIAAgCTYCBCAAIAc2AgAgAiAIQQFqNgIIIAEtALgBIgBBowFHDQALCyADQQRqQaMBEMglIAEoArQBIQAgASgCsAEhAiADQY8CrUIghiADQQNqrYQ3A4gCIANBwABqQc2VgAEgA0GIAmoQshAgAyADKQIENwJMIAMgAygCDDYCVCABIAIgACADQcAAahDuHQtBACEJCyADQcACaiQAIAkLqgkCE38CfiMAQdACayIFJABCgICAgICAgIDAACABrSIYgCIZIBh+QoCAgICAgICAwABSrSEYAkACQCABQYEgSQ0AIAEQyR0hBgwBCyABIAFBAXZrIgdBwAAgB0HAAEkbIQYLIBkgGHwhGCAAQXxqIQggAEEIaiEJQQEhB0EAIQpBACELA0BBACEMQQEhDQJAIAEgCksiDkUNACAAIApBAnQiD2oh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IAEQyAgMAgsgACgCCCABEMkIDAELIAAoAgggARCzCgsgAS0AAA0HIAAoAgwgARCXASABLQAADQcgACgCECEADAQLAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCABEMgIDAILIAAoAgggARDJCAwBCyAAKAIIIAEQswoLIAEtAAANBiAAKAIMIAEQlwEgAS0AAA0GIAAoAhAhAAwDCwJAIAAoAgQiAkECRg0AAkAgAkEBRw0AIAEtAAANASAAKAIIIAEQlwEMAQsgACgCCCICQQhqKAIAIgNFDQAgAkEEaigCACICIANBOGxqIQQDQCACIAEQ6AkCQCACQTBqKAIAIgNFDQAgAS0AAEEBcQ0AIAMgARCXAQsgAkE4aiICIARHDQALCyABLQAAIQICQCAAKAIYIgNFDQAgAkEBcQ0AIAMgARCXASABLQAAIQILAkACQCAAKAIcIgNFDQAgAkEBcQ0AIAMgARCXASABLQAARQ0BDAcLIAJBAXENBgsgACgCDCEADAILIAEtAAANBCAAKAIEIAEQlwEgAS0AAA0EIAAoAgghAAwBCyABLQAADQMgACgCBCABEJcBIAEtAAANAyAAKAIIIQAMAAsLAkAgACgCBCIDQdAAaigCACIARQ0AIAEtAABBAXENACAAQTBsIQIgA0HMAGooAgAhAANAAkAgAS0AAA0AIAAgARCuAwsgAEEwaiEAIAJBUGoiAg0ACwsCQAJAAkAgAygCAEF5ag4CAQIACyADIAEQ6AkLIANBMGooAgAiAEUNACABLQAAQQFxDQAgAEEwbCECIANBLGooAgAhAANAAkAgAS0AAA0AIAAgARCuAwsgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNASADQegAaigCACIARQ0BIAEtAABBAXENASAAQTBsIQIgA0HkAGooAgAhAANAAkAgAS0AAA0AIAAgARCuAwsgAEEwaiEAIAJBUGoiAg0ADAILCyABLQAADQAgACgCBCABEJcBDwsLowoCDn8CfiMAQdAAayICJAAgASgCsAEhAyABIAEoAngiBEGAIHI2AnggAUGwAWohBQJAAkACQAJAIAEtALgBIgZBNUYNAAJAIAZBEkcNAAJAAkAgASgCiAEiBkELRw0AIAJBMGogARDEAQwBCyABQQs2AogBIAIgASkCmAE3AzAgAiABKAKg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/wFxIghBuX9qDgIBAgALIAhBogFGDQIgA0EIakEEciAFEMglIANBAzYCHCADQeyFmwE2AhggA0GwgICAeDYCCCABKAKwASABKAK0ASADQQhqEMYbIQcCQCABLQC4AUGiAUcNACABEMsUIQQgARC1ECABIAQQkQkLIABBAjoAGCAAIAc2AgAMCQsgByABKAJsIghJDQQgBkF+aiIFIAEoAnBLDQQgASgCYCAHIAhraiAFIAdrEI0ZIQogASkDCCELIAFBCjYCCCADIAEpAxA3AxAgAyALNwMIAkACQCALpyIIQQpGDQAgCEECSQ0BIANBCGoQwAsLQajzmgFBKEHYiJsBELkhAAsgAykDECELIAMoAgwhBgJAAkAgASgCiAEiCUELRw0AIANBCGogARDEAQwBCyABQQs2AogBIAEgCTYCCCABIAEpAowBNwIMIAEgASgClAE2AhQgAyABKQKYATcDCCADIAEoAqABNgIQCyABKQOwASEMIAQgAykDCDcCACAEIAMoAhA2AgggASAMNwOoAUEAIQEgCEEBcUUNByACRQ0CQQAhAQwGCyAHIAEoAmwiCEkNBCAGQX9qIgUgASgCcEsNBCABKAJgIAcgCGtqIAUgB2sQjRkhCiABKQMIIQsgAUEKNgIIIAMgASkDEDcDECADIAs3AwgCQAJAIAunIghBCkYNACAIQQJJDQEgA0EIahDACwtBqPOaAUEoQdiImwEQuSEACyADKQMQIQsgAygCDCEGAkACQCABKAKIASIJQQtHDQAgA0EIaiABEMQBDAELIAFBCzYCiAEgASAJNgIIIAEgASkCjAE3AgwgASABKAKUATYCFCADIAEpApgBNwMIIAMgASgCoAE2AhALIAEpA7ABIQwgBCADKQMINwIAIAQgAygCEDYCCCABIAw3A6gBQQEhASAIQQFxRQ0GIAJFDQJBASEBDAULIAEpAwghCiABQQo2AgggAyABKQMQNwMQIAMgCjcDCAJAAkAgCqciBUEKRg0AIAVBCUYNASADQQhqEMALC0Go85oBQShB+IebARC5IQALIAMoAgwhBQJAAkAgASgCiAEiAkELRw0AIANBCGogARDEASABKAK0ASEGIAEoArABIQcMAQsgAUELNgKIASABIAI2AgggASABKQKMATcCDCABIAEoApQBNgIUIAMgASkCmAE3AwggAyAB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IQcCQAJAIAEoAogBIghBC0cNACADQShqIAEQxAEMAQsgAUELNgKIASADIAEpApgBNwMoIAMgASgCoAE2AjAgAUGMAWohCQJAIAEoAghBCkYNACABQQhqEMALCyABIAg2AgggASAJKQIANwIMIAEgCSgCCDYCFAsgASkDsAEhDCAEIAMpAyg3AgAgBCADKAIwNgIIIAEgDDcDqAELAkAgAS0AuAEiCEESRw0AIAEgASgCeCIGQYAgcjYCeCADQQA6AEAgA0EBOgAoIANBCGogA0HAAGogA0EoaiABEOIBIAMoAgghCCABIAY2AnggAygCDCEGIAhBAXENAiABLQC4ASEICyAIQf8BcQ0EIAEoAogBIghBC0cNAiADQShqIAEQxAEMAwsgASgCtAEhBiABKAKwASEEIANBEGogBxDIJSADQY8CrUIghkGMgpsBrYQ3A0AgA0EoakHNlYABIANBwABqEM4IIAMgAykCEDcCNCADIAMoAhg2AjwgBCAGIANBKGoQxhshBgJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgAEGBgICAeDYCACAAIAY2AgQMBgsgAEGBgICAeDYCACAAIAY2AgQMBQsgAUELNgKIASADIAEpApgBNwMoIAMgASgCoAE2AjAgAUGMAWohCQJAIAEoAghBCkYNACABQQhqEMALCyABIAg2AgggASAJKQIANwIMIAEgCSgCCDYCFAsgASkDsAEhDCAEIAMpAyg3AgAgBCADKAIwNgIIIAEgDDcDqAEgA0EoaiABEP8CIAMoAiwhBCADKAIoIghBgICAgHhHDQEgAEGBgICAeDYCACAAIAQ2AgQMAgsgASgCtAEhBCABKAKwASECIANBHGogCBDIJSADQY8CrUIghkGftoEBrYQ3A0AgA0EoakHNlYABIANBwABqEM4IIAMgAykCHDcCNCADIAMoAiQ2AjwgAiAEIANBKGoQxhshBAJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgAEGBgICAeDYCACAAIAQ2AgQMAQsgAyADKAIwIgo2AkggAyAENgJEIAMgCDYCQCABIAEoAngiCUGAIHI2AnggA0EbOgAoIAMgA0EoaiABEIYCIAMoAgAhCyABIAk2AnggAygCBCEJAkAgC0EBRw0AIABBgYCAgHg2AgAgACAJNgIEIANBwABqEI0KIAgg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AQsCQCADQQhqKAIAIgBFDQAgAEEwbCECIANBBGooAgAhAANAIAAgARDCAyAAQTBqIQAgAkFQaiICDQALCyADQRhqIgMgBEYNCgwACwsgAS0ADCECIAFBAToADCABIAAoAgQQyAEgASACOgAMDAgLIABBCGogARDsBQ8LAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCICKAIIIgNFDQIgAigCBCICIANBOGxqIQQDQCACIAEQzwoCQCACQTBqKAIAIgNFDQAgASADEMgBCyACQThqIgIgBEcNAAwDCwsgACgCCCICKAIIIgNFDQEgAigCBCICIANBOGxqIQQDQCACIAEQzwoCQCACQTBqKAIAIgNFDQAgASADEMgBCyACQThqIgIgBEcNAAwCCwsgACgCCCABELgICyABIAAoAgwQyAEgACgCECEADAQLAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCICKAIIIgNFDQIgAigCBCICIANBOGxqIQQDQCACIAEQzwoCQCACQTBqKAIAIgNFDQAgASADEMgBCyACQThqIgIgBEcNAAwDCwsgACgCCCICKAIIIgNFDQEgAigCBCICIANBOGxqIQQDQCACIAEQzwoCQCACQTBqKAIAIgNFDQAgASADEMgBCyACQThqIgIgBEcNAAwCCwsgACgCCCABELgICyABIAAoAgwQyAEgACgCECEADAMLAkAgACgCBCICQQJGDQACQCACQQFHDQAgASAAKAIIEMgBDAELIAAoAggiAigCCCIDRQ0AIAIoAgQiAiADQThsaiEEA0AgAiABEM8KAkAgAkEwaigCACIDRQ0AIAEgAxDIAQsgAkE4aiICIARHDQALCwJAIAAoAhgiAkUNACABIAIQyAELAkAgACgCHCICRQ0AIAEgAhDIAQsgACgCDCEADAILIAEgACgCBBDIASAAKAIIIQAMAQsgASAAKAIEEMgBIAAoAgghAAwACwsCQCAAKAIEIgNB0ABqKAIAIgBFDQAgAEEwbCECIANBzABqKAIAIQADQCAAIAEQwgMgAEEwaiEAIAJBUGoiAg0ACwsCQAJAAkAgAygCAEF5ag4CAQIACyADIAEQzwoLIANBMGooAgAiAEUNACAAQTBsIQIgA0EsaigCACEAA0AgACABEMIDIABBMGohACACQVBqIgINAAsLIAMoAmBBgICA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IAIpAhA3AjQgACADKQIwNwIUIAMgAikCGDcCPCAAIAMpAjg3AhwgACADKAJANgIkIAAgCToAOSAAIAQ6ADggACAFOgA3IAAgBjoANiAAIAg6ADUgACAHQQFGOgA0IAAgDDYCMCAAIAo2AiwgACALNgIoCyADQdAAaiQAC8kIAQd/AkAgASAAKAIIIgNLDQBBAQ8LIAEgA2shBCADQTBsIQUgAigCBCEGIAIoAgwhBwNAAkAgBiIBIAdHDQBBAA8LIAIgAUEEaiIGNgIEAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCACIDKAIAIgFBdGpBByABQQtLGw4mLAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQsCyADQRRqIQEgA0EQaiEIDCwLIANBFGohASADQRBqIQgMKwsgAygCICIIQTRqIQEgCEEwaiEIDCoLIANBDGohASADQQhqIQgMKQsgA0EIaiEBIANBBGohCAwoCyADQRBqIQEgA0EMaiEIDCcLIANBNGohASADQTBqIQgMJgsgA0EkaiEBIANBIGohCAwlCyADQSRqIQEgA0EgaiEIDCQLIANBFGohASADQRBqIQgMIwsgA0EgaiEBIANBHGohCAwiCyADQRhqIQEgA0EUaiEIDCELIANBFGohASADQRBqIQgMIAsgA0EUaiEBIANBEGohCAwfCyADKAIIDgcWFxgZGhscFgsgA0EgaiEBIANBHGohCAwdCyADQRBqIQEgA0EMaiEIDBwLIANBGGohASADQRRqIQgMGwsgAygCICIIQShqIQEgCEEkaiEIDBoLIANBCGohASADQQRqIQgMGQsgA0EIaiEBIANBBGohCAwYCyADQQxqIQEgA0EIaiEIDBcLIANBDGohASADQQhqIQgMFgsgA0EcaiEBIANBGGohCAwVCyADQSxqIQEgA0EoaiEIDBQLIANBCGohASADQQRqIQgMEwsgAygCBCIIQQRqIQEMEgsgA0EUaiEBIANBEGohCAwRCyADQRBqIQEgA0EMaiEIDBALIANBDGohASADQQhqIQgMDwsgA0EMaiEBIANBCGohCAwOCyADQRBq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CQgACyAAKAIMIgJFDRAgAkEwbCECIAAoAgghAANAIAAgARDUAyAAQTBqIQAgAkFQaiICDQAMEQsLIAAoAgQgARC6ASAAKAIIIQAMDQsgACgCDCIARQ0OIAAgARC6AQ8LIAEgACkDECAAQSBqKAIAEPgNIAAoAighAAwLCyAALQAkQQJGDQwgASAAKQMQIABBIGooAgAQ+A0PCyAALQAkQQJGDQsgASAAKQMQIABBIGooAgAQ+A0PCyAAKAIEIAEQugEgACgCCCABENQDIAAoAhQiAA0IDAoLIAAoAhAgARC6ASAAKAIMIgJFDQkgACgCCCIDIAJBGGxqIQQDQAJAIAMoAhQiAEUNACAAIAEQugELAkAgA0EIaigCACIARQ0AIABBMGwhAiADQQRqKAIAIQADQCAAIAEQ1AMgAEEwaiEAIAJBUGoiAg0ACwsgA0EYaiIDIARGDQoMAAsLIAAoAgQgARC6AQwICyAAQQhqIQIgAS0AoAEhAwJAAkACQAJAAkACQAJAAkAgACgCCCIEDggDAAEHBgYCBAMLIABBLGohBQwECyAAKAIMQRhqIQUMAwsgACgCDEEsaiEFDAILIABBLGohBQwBCyAAKAIMIgUtAFANASAFQdEAaiEFCyAFLQAADQACQAJAIAQOCAMAAwMCAgMBAwsgACgCKCgCGEGAgICAeEYNAQwCCyAAKAIMIgAtAEVBA0YNACAAQSBqEMkNDQELIAFBAToAoAELIAIgARCmASABIAM6AKABDwsCQAJAAkACQCAAKAIEDgMAAQIACyAAKAIIIAEQrQkMAgsgACgCCCABEK4JDAELIAAoAgggARCVCwsgACgCDCABELoBIAAoAhAhAAwECwJAAkACQAJAIAAoAgQOAwABAgALIAAoAgggARCtCQwCCyAAKAIIIAEQrgkMAQsgACgCCCABEJULCyAAKAIMIAEQugEgACgCECEADAMLAkAgACgCBCICQQJGDQACQCACQQFHDQAgACgCCCABELoBDAELIAAoAggiAkEIaigCACIDRQ0AIAJBBGooAgAiAiADQThsaiEEA0AgAiABEM4KAkAgAkEwaigCACIDRQ0AIAMgARC6AQsgAkE4aiICIARHDQALCwJAIAAoAhgiAkUNACACIAEQugELAkAgACgCHCICRQ0AIAIgARC6AQsgACgCDCEADAILIAAo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DQALCyADQRhqIgMgBEYNCgwACwsgASAAKAIEEOQMDAgLIABBCGogARCyBA8LAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCICKAIIIgNFDQIgAigCBCICIANBOGxqIQQDQCACIAEQzQoCQCACQTBqKAIAIgNFDQAgASADEOQMCyACQThqIgIgBEcNAAwDCwsgACgCCCICKAIIIgNFDQEgAigCBCICIANBOGxqIQQDQCACIAEQzQoCQCACQTBqKAIAIgNFDQAgASADEOQMCyACQThqIgIgBEcNAAwCCwsgACgCCCABEKoMCyABIAAoAgwQ5AwgACgCECEADAQLAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCICKAIIIgNFDQIgAigCBCICIANBOGxqIQQDQCACIAEQzQoCQCACQTBqKAIAIgNFDQAgASADEOQMCyACQThqIgIgBEcNAAwDCwsgACgCCCICKAIIIgNFDQEgAigCBCICIANBOGxqIQQDQCACIAEQzQoCQCACQTBqKAIAIgNFDQAgASADEOQMCyACQThqIgIgBEcNAAwCCwsgACgCCCABEKoMCyABIAAoAgwQ5AwgACgCECEADAMLAkAgACgCBCICQQJGDQACQCACQQFHDQAgASAAKAIIEOQMDAELIAAoAggiAigCCCIDRQ0AIAIoAgQiAiADQThsaiEEA0AgAiABEM0KAkAgAkEwaigCACIDRQ0AIAEgAxDkDAsgAkE4aiICIARHDQALCwJAIAAoAhgiAkUNACABIAIQ5AwLAkAgACgCHCICRQ0AIAEgAhDkDAsgACgCDCEADAILIAEgACgCBBDkDCAAKAIIIQAMAQsgASAAKAIEEOQMIAAoAgghAAwACwsCQCAAKAIEIgMoAlAiAEUNACAAQTBsIQIgAygCTCEAA0AgACABENYDIABBMGohACACQVBqIgINAAsLAkACQAJAIAMoAgBBeWoOAgECAAsgAyABEM0KCyADKAIwIgBFDQAgAEEwbCECIAMoAiwhAANAIAAgARDWAyAAQTBqIQAgAkFQaiICDQALCyADKAJgQYCAgIB4Rg0AIAMoAmgiAEUNACAAQTBsIQIgAygCZCEAA0AgACABENYDIABBMGohACACQVBqIgINAAsLDwsgASAAKAIEEOQMC80IAg1/AX4jAEHAAGsiASQAAkACQCAAKAIMIgJBAWoiA0UNAAJAAkAgAyAAKAIEIgQgBEEBaiIFQQN2IgZBB2wgBEEISRsiB0EBdk0NAAJAAkAgB0EBaiIGIAMgBiADSxsiA0EISQ0AIANB/////wFLDQRBfyADQQN0QQduQX9qZ3ZBAWohCAwBCyADQQRxQQRqIQgLIAFBDGpBDEEIIAgQ2g8gASgCDCIDRQ0CIAEoAhQhBiADIAEoAhAiBBDBISIHRQ0BIABBEGohAyAHIAZqIQYCQCAIQQhqIgdFDQAgBkH/ASAH/AsACyABIAhBf2oiBzYCHCABIAY2AhggAUKMgICAgAE3AhAgASADNgIMIAAoAgAiBCkDACEOIAEgBDYCOCABIAI2AjQgAUEANgIwIAEgDkJ/hUKAgYKEiJCgwIB/gzcDKCABQRhqIQkgAiEKAkADQCAKRQ0BAkADQCABIAFBKGoQixkgASgCAEEBcQ0BIAEgASgCOCIDQQhqNgI4IAEgASgCMEEIajYCMCABIAMpAwhCf4VCgIGChIiQoMCAf4M3AygMAAsLIAEoAgQhAyABIAEoAjRBf2oiCjYCNCAGIAYgByAEIAMgASgCMGoiBRCbISIOEJsSIgNqIA5CGYinIgs6AAAgBiAHIANBeGpxakEIaiALOgAAIAYgA0F0bGpBdGoiAyAEIAVBdGxqQXRqIgUoAAg2AAggAyAFKQAANwAADAALCyABIAI2AiQgASAHIAhBA3ZBB2wgCEEJSRsgAms2AiAgACAJQQQQshsgASgCHCIDRQ0DIAEoAhggAyABKAIQIAEoAhQQjBkMAwsgBiAFQQdxQQBHaiEHIAAoAgAiBiEDAkADQCAHRQ0BIAMgAykDACIOQn+FQgeIQoGChIiQoMCAAYMgDkL//v379+/fv/8AhHw3AwAgA0EIaiEDIAdBf2ohBwwACwsCQAJAIAVBCEkNACAGIAVqIAYpAAA3AAAMAQsgBUUNACAGQQhqIAYgBfwKAAALQQAhBwNAAkACQCAFIAciA0YNACADQQFqIQcgBiADaiILLQAAQYABRw0CIAYgA0F0bGpBdGohDANAIAMgBCAGIAMQmyEiDqdxIghrIAYgBCAOEJsSIgogCGtzIARxQQhJDQIgBiAKaiIILQAAIQkgCCAOQhmIpyINOgAAIAYgBCAKQXhqcWpBCGogDToAACAGIApBdGxqQXRqIQoCQCAJQf8BRw0AIAtB/wE6AAAgBiAAKAIEIgQgA0F4anFqQQhqQf8BOgAAIAogDCgACDYACCAKIAwpAAA3AAAMBAsgDCAKQQMQshsgACgCBCEEDAALCyAAIAQgBEEBakEDdkEHbCAEQQhJGyACazYCCAwECyALIA5CGYinIgo6AAAgBiAEIANBeGpxakEIaiAKOgAADAALCyADIAQQoiQACxDZIwALIAFBwABqJABBgYCAgHgL7AkCD38BfiMAQbABayIDJABBBCEEAkACQCABLQCAAUEEcQ0AIABBADYCCCAAQoCAgIDAADcCAAwBCyADQQA2AjQgA0KAgICAwAA3AixBjwKtQiCGQcLwmgGthCESIANBiAFqQQxqIQUgASgCwAEhBkEIIQdBACEIAkADQAJAAkACQAJAAkAgAS0AyAEiCUEYRg0AIAgNASAAIAMoAjQ2AgggACADKQIsNwIADAcLIAEoAsABIQogARDoEQJAIAEtAMgBRQ0AIANBiAFqIAFBAEEAEPoDAkAgAy0AnAFBAkcNACADKAKIASELDAcLIAMgAykDmAE3A2AgAyADKQOQATcDWCADIAMpA4gBNwNQQQhBwAAQ6iAiCUEaNgIAIAlBCGogA0HQAGpBOPwKAAAgA0EFOgCQASADIAk2AogBIANBIGogASADQYgBakEAQQEQvwIgAygCJCELIAMoAiBBAXENBgwECyABEOgRIANBGGogARC3CiADKAIcIQsgAygCGEEBcQ0FIAMgCzYCOCABLQDIASIJQQFGDQEgASgCxAEhCyABKALAASEIIANBPGogCRDZJSADIBI3A0ggA0GIAWpBzZWAASADQcgAahCJHyAFIAMoAkQ2AgggBSADKQI8NwIAIAggCyADQYgBahDGGyELAkAgAS0AyAFBogFHDQAgASABEKAjEIwUCyADQThqELoiDAULIAlB2ABHDQEgASgCeCIJQYCACHENASAJQYCAIHEhCQJAIAINACAJDQAgASgCxAEhCSABKALAASELIANBjoCAgHg2AlAgCyAJIANB0ABqEMYbIQsgAS0AyAFBogFHDQUgASABEKAjEIwUDAULIAkNASABLQCAAUEIcQ0BIAEoArwBIQkgA0HagICAeDYCUCAGIAkgA0HQAGoQxhshCyABLQDIAUGiAUcNBCABIAEQoCMQjBQMBAsgARDo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DQAgACANNwIADAILIANBGGogAUEUaiACEKkRIAMtABhBBEYNACADKQMYIg1C/wGDQgRRDQAgACANNwIADAELAkACQCAERQ0AIANBGGogAiAEEPEdIAMtABhBBEYNACADKQMYIg1C/wGDQgRSDQELIABBBDoAAAwBCyAAIA03AgALIANBIGokAAvYCQIGfwJ+IwBBwABrIgMkAAJAAkACQCABLQC4AUHfAEcNACABQbABaiEEIAEoArABIQUgAUGIAWohBgJAAkACQAJAAkAgASgCiAFBC0cNACABKQMIIQkgAUEKNgIIIAMgASkDEDcDGCADIAk3AxAgA0EwaiABEMQBIAEpAwghCSABQQo2AgggAyABKQMQNwMoIAMgCTcDICABQQhqIQcCQAJAIAEoAogBQQ5xQQpHDQAgBiADKQM4NwMYIAYgAykDMDcDECAGIAMpAyg3AwggBiADKQMgNwMADAELIAYQwAsgBiADKQMgNwMAIAYgAykDKDcDCCAGIAMpAzA3AxAgBiADKQM4NwMYIAcoAgBBCkYNACAHEMALCyAHIAMpAxg3AwggByADKQMQNwMAIAYoAgBBC0cNACABLQC4AUHfAEcNBSAHKQMAIQkgBykDCCEKIAFBCjYCCCADIAo3AxggAyAJNwMQIANBMGogARDEASAHKQMAIQkgBykDCCEKIAFBCjYCCCADIAo3AyggAyAJNwMgIAEoAogBQQ5xQQpHDQEgBiADKQM4NwMYIAYgAykDMDcDECAGIAMpAyg3AwggBiADKQMgNwMADAMLAkAgAS0AoAEiBw0AIANBCGogARC4AyADKAIMIQcgAygCCEEBcUUNAiAAQRM2AgAgACAHNgIEDAcLIAEtALgBQd8ARg0DDAQLIAYQwAsgBiADKQMgNwMAIAYgAykDKDcDCCAGIAMpAzA3AxAgBiADKQM4NwMYIAcoAgBBCkYNASAHEMALDAELAkACQCABLQC4AUEGRg0AIAEoAqwBIQYMAQsCQAJAIAYoAgAiBkELRw0AIANBIGogARDEAQwBCyABQQs2AogBIAMgASkCmAE3AyAgAyABKAKgATYCKCABQYwBaiEIAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBjYCCCABIAgpAgA3AgwgASAIKAIINgIUCyABIAEoArQBIgY2AqwBIAEgASgCsAE2AqgB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IAIoAogBIgRBC0cNACADQcAAaiACEMQBDAELIAJBCzYCiAEgAyACKQKYATcDQCADIAIoAqABNgJIIAJBjAFqIQYCQCACKAIIQQpGDQAgAkEIahDACwsgAiAENgIIIAIgBikCADcCDCACIAYoAgg2AhQLIAIgAygCSDYCuAEgAiACKQOwATcDqAEgAiADKQNANwKwASACIAIoAngiBEGAgIDAAHI2AnggA0EYaiACEJADIAMoAhghBiACIAQ2AnhBASEEIAMoAhwhBwJAAkAgBkEBcUUNACAHIQYMAQsCQAJAAkAgAi0AuAEiBkEKRw0AIAJBsAFqIQYCQAJAIAIoAogBIghBC0cNACADQcAAaiACEMQBDAELIAJBCzYCiAEgAyACKQKYATcDQCADIAIoAqABNgJIIAJBjAFqIQkCQCACKAIIQQpGDQAgAkEIahDACwsgAiAINgIIIAIgCSkCADcCDCACIAkoAgg2AhQLIAIpA7ABIQsgBiADKQNANwIAIAYgAygCSDYCCCACIAs3A6gBIAIgAigCeCIIQf///79/cTYCeCADQRBqIAIoArABIAIQ7AMgAygCECEJIAIgCDYCeCADKAIUIQggCUEBcUUNASAIIQYMAgsgAigCtAEhASACKAKwASEIIANBKGogBhDIJSADQY8CrUIghkGi8poBrYQ3A1ggA0HAAGpBzZWAASADQdgAahCyECADIAMpAig3AkwgAyADKAIwNgJUIAggASADQcAAahDGGyEGIAItALgBQaIBRw0BIAIgAhCGDhCRCQwBCwJAAkACQCACLQC4ASIJQQlGDQAgAigCtAEhBiACKAKwASEBIANBNGogCRDIJSADQY8CrUIghkHn9JoBrYQ3A1ggA0HAAGpBzZWAASADQdgAahCyECADIAMpAjQ3AkwgAyADKAI8NgJUIAEgBiADQcAAahDGGyEGIAItALgBQaIBRw0BIAIgAhCGDhCRCSAIEJgjDAMLAkACQCACKAKIASIJQQtHDQAgA0HAAGogAhDEAQwBCyACQQs2AogBIAMgAikCmAE3A0AgAyACKAKgATYCSCACQYwBaiEKAkAgAigCCEEKRg0AIAJBCGoQwAsLIAIgCTYCCCACIAopAgA3AgwgAiAKKAIINgIUCyACKQOwASELIAYgAykDQDcCACAGIAMoAkg2AgggAiALNwOo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AkACQAJAIAItAF0NACADQRhqIAIQ2BAgAy0AGEEERg0AIAMpAxgiBEL/AYNCBFINAQsgA0EANgIYIANBKGogAiADQRhqQa/rmgFBARDsDQJAIAMtAChBBEYNACADKQMoIgRC/wGDQgRSDQMLAkAgAi0AXQ0AIANBKGogAhC6FAJAIAMtAChBBEYNACADKQMoIgRC/wGDQgRSDQQLIAIgAigCOEEBajYCOAsgA0EoaiACIANBGGpBwu2aAUEEEOsNAkAgAy0AKEEERg0AIAMpAygiBEL/AYNCBFINAwsgA0EoaiACIANBGGpBzuyaAUEBEOwNAkAgAy0AKEEERg0AIAMpAygiBEL/AYNCBFINAwsCQCACLQBdDQAgA0EoaiACENgQIAMtAChBBEYNACADKQMoIgRC/wGDQgRSDQMLIANBKGogAUE8aiACEJAkAkAgAy0AKEEERg0AIAMpAygiBEL/AYNCBFINAwsgAi0AXUEBRg0BIAIgAigCOEF/ajYCOCADQShqIAIQuhQgAy0AKEEERg0BIAMpAygiBEL/AYNCBFENAQwCCyAAIAQ3AgAMAwsgA0EoaiACIANBGGpBsOuaAUEBEOwNIAMtAChBBEYNASADKQMoIgRC/wGDQgRRDQELIARC/wGDQgRRDQAgACAENwIADAELIANBGGogAiADQQxqQaftmgFBARDsDQJAIAMtABhBBEYNACADKQMYIgRC/wGDQgRRDQAgACAENwIADAELAkAgAS0ANEEDRg0AIANBGGogAiADQQxqQYvwmgFBARDsDQJAIAMtABhBBEYNACADKQMYIgRC/wGDQgRRDQAgACAENwIADAILIANBGGogAUEgaiACENwIIAMtABhBBEYNACADKQMYIgRC/wGDQgRRDQAgACAENwIADAELIANBGGogAUE4aiACEKcgAkAgAy0AGEEERg0AIAMpAxgiBEL/AYNCBFENACAAIAQ3AgAMAQsgAEEEOgAACyADQTBqJAALjAkCB38BfiMAQTBrIgIkACACIAEQnQoiAzYCBAJAAkACQAJAAkACQAJAAkACQAJAAkAgA0HbAEcNACACIAEoAgAiAykCUDcDCCACIAMoAlg2AhAgA0HQAGohAyABEKQJRQ0JIAEQnQpBOkcNCQJAIAEQpAkNACADIAIoAhA2AgggAyACKQMINwIAQQIhBAwL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QdzihAEQ/hYAC5kJAgp/AX4jAEGQA2siAiQAIAIgARCdCiIDNgIIAkACQCADQdsARw0AIAIgASgCACIEKAJYIgM2AqgBIAIgBCkCUCIMNwKsASACIAM2ArQBIAJCgICAgMAANwIMIAJBADYCFCACIAw3AhggAiACKQOoATcCICACIAIpA7ABNwIoIARB0ABqIQUgAkG4AmpBxABqIQYgAkG4AmpBBGohByACQaABakHEAGohCCACQaABakEEaiEJIAJBMGpBJGohCiABKAIIIQsCQANAIAEQ8AQCQAJAAkACQAJAAkAgBSgCACALRg0AAkACQAJAIAEQnQoiA0HaAEoNACADQSZGDQEgA0EtRw0IIAEQngpBLUcNCCABQbSOmwFBAhDkEEUNBiACQaABaiACQQxqQST8CgAAIAJBDGogBEEBIAJBoAFqENYMDAkLAkACQAJAIANBpX9qDgMBCgIACyADQf4ARg0DDAkLIAQoAiBB/////wdPDQQCQCAEKAIsRQ0AIAJBMGogARDwAyACLQBJQQJGDQAgCSACKAJINgIYIAkgAikCQDcCECAJIAIpAjg3AgggCSACKQIwNwIAIAJBg4DEADYCoAEgAkEMaiACQaABahCyCQwKCyACQaABaiABIAJBDGoQrAkgAigCoAEhAyACQTBqIAlBJPwKAAACQCADQSJGDQAgACACKQLYATcCPCAAIAIpAtABNwI0IAAgAikCyAE3AiwgAEEIaiACQTBqQST8CgAAIABBiYDEADYCACAAIAM2AgQMDQsgAkEMaiACQTBqQST8CgAADAkLIAJBlAJqIAJBDGpBJPwKAAAgAkGgAWogASACQZQCahC8CAJAAkAgAigCoAEiA0GKgMQARg0AIAJBMGogCUHwAPwKAAACQCADQYmAxABGDQAgAEEEaiACQTBqQST8CgAAIABBKGogCkHMAPwKAAAMAgsgAkEMaiACQTBqQST8CgAADAoLIAJBMGogCUHAAPwKAAAgAEEEaiACQTBqQcAA/AoAAEGJgMQAIQMLIAAgAzYCAAwLCyABEJ4KQSZHDQYgAUGLipsBQQIQ5BBFDQMgAkGgAWogAkEMakEk/AoAACACQQxqIARBACACQaABahDWDAwHCyABEJ4KQf4ARw0FIAFBi9eJAUECEOQQRQ0EIAJBoAFqIAJBDGpBJPwKAAAg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ACEDAkAgASkDCCIGQgODQgBSDQAgBqciASABKAIAIgFBAWo2AgAgAUF/TA0ECyAAQSBqIAYgAxCiBxoMAgsgASgCBCIBQRBqKAIAIQMCQCABKQMAIgZCA4NCAFINACAGpyIBIAEoAgAiAUEBajYCACABQX9MDQMLIABBMGogBiADEKIHGgwBCyABKAIEIgEtAFFBAUYNACABKAIADQACQAJAIAEtAEVBA0YNACABQSBqEMkNDQELIAFBGGooAgAhAwJAIAEpAwgiBkIDg0IAUg0AIAanIgEgASgCACIBQQFqNgIAIAFBf0wNAwsgAEEgaiAGIAMQogcaDAELIAFBGGooAgAhAwJAIAEpAwgiBkIDg0IAUg0AIAanIgEgASgCACIBQQFqNgIAIAFBf0wNAgsgAEEwaiAGIAMQogcaCyACQRBqJAAPCwAL6wgCDn8CfiMAQdAAayICJAAgAkEANgIgIAJCgICAgMAANwIYQQwhAyABQQxqIQQgAUEIaiEFIAFBmAFqIQYgAUGMAWohByABQbABaiEIQY8CrUIghiEQQQQhCUEAIQoCQAJAAkACQANAIAEtALgBIgtBAkYNASALQdkARg0BIAtBgQFGDQEgASgCsAEhDCACQThqIAEQtgggAigCQCENIAIpAzgiEUIAUQ0DIAIoAkQhDkHAABCKASILRQ0CIAtBADoAHCALQQA2AhggCyAONgIUIAsgDTYCECALIBE3AwggC0EaNgIAIAJBEGogASALQQEQQyACKAIUIQsCQCACKAIQQQFxRQ0AIAshDQwECwJAAkAgCygCACINQXRqQQcgDUELSxtBeGoiDkEZSw0AQQEgDnRBwYCAEHENAQsgASgCrAEhDSACQbKBgIB4NgI4IAEgDCANIAJBOGoQ7h0gCygCACENCwJAAkAgDUEtRg0AAkAgAS0AuAFBEkYNACABKAKsASEPQQAhDQwCCyACQQhqIAEQrwMgAigCDCENAkAgAigCCEEBRw0AAkAgCygCAEEtRg0AIAsQjQILIAtBwABBCBDcFAwGCwJAAkAgASgCiAEiDkELRw0AIAJBOGogARDEAQwBCyABQQs2AogBIAIgBikCADcDOCACIAYoAgg2AkACQCABKAIIQQpGDQAgBRDACwsgBSAONgIAIAQgBykCADcCACAEIAcoAgg2AggLIAEgASgCtAEi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ApgBNwNQIAIgASgCoAE2AlggAUGMAWohBgJAIAEoAghBCkYNACABQQhqEMALCyABIAQ2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhByAFIAIpA1A3AgAgBSACKAJYNgIIIAEgBzcDqAELIAEgASgCeCIEQf//e3E2AnggAkHQAGogARCVASABIAQ2AnggAigCVCEFAkAgAigCUCIEQTJHDQAgAEEANgIAIAAgBTYCBAwDCyACIAIpA4gBNwNIIAIgAikDgAE3A0AgAiACKQN4NwM4IAIgAikDcDcDMCACIAIpA2g3AyggAiACKQNgNwMgIAIgAikDWDcDGAJAAkAgBEEORw0AQRQQigEiBA0BQQRBFBCiJAALQajzmgFBKEGQg5sBELkhAAsgBCAFNgIAIAQgAikDGDcCBCAEIAIpAyA3AgwLAkAgARCHCSIBRQ0AIABBADYCACAAIAE2AgQgBEUNAiAEEMAVIAQoAgAgBEEEaigCABD9IyAEQRRBBBDcFAwCCyAAIAQ2AgQgACADNgIADAILQQhBGBCiJAALIAMQsRIgA0EYQQgQ3BQLIAJBkAFqJAALlQkCBn8BfiMAQfAAayICJAACQCABLQCBAUEgcUUNACABKAK0ASEDIAEoArABIQQgAkGsgYCAeDYCICABIAQgAyACQSBqEO4dCyABKAK0ASEDIAEoArABIQQgAkHKgICAeDYCICABIAQgAyACQSBqEIsTIAFBsAFqIQMgASgCsAEhBQJAAkAgASgCiAEiBEELRw0AIAJBIGogARDEAQwBCyABQQs2AogBIAIgASkCmAE3AyAgAiABKAKgATYCKCABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBDYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABKQOwASEIIAMgAikDIDcCACADIAIoAig2AgggASAINwOoAQJAAkACQCABLQC4ASIEDQACQAJAIAEoAogBIgRBC0cNACACQSBqIAEQxAEMAQsgAUELNgKIASACIAEpApgBNwMgIAIgASgCoAE2AiggAUGMAWohBgJAIAEoAghBCkYNACABQQhqEMALCyABIAQ2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhCCADIAIpAyA3AgAgAyACKAIoNgIIIAEgCDcDqAEgASABKAJ4IgRBwAByNgJ4IAIgARC4AyACKAIAIQYgASAENgJ4IAIoAgQhBCAGQQFxRQ0BIABBEzYCACAAIAQ2AgQMAgsgASgCtAEhAyABKAKwASEGIAJBCGogBBDIJSACQY8CrUIghkGftoEBrYQ3AzggAkEgakHNlYABIAJBOGoQzgggAiACKQIINwIsIAIgAigCEDYCNCAGIAMgAkEgahDGGyEDAkAgAS0AuAFBogFHDQAgASABEIYOEJEJCyAAQRM2AgAgACADNgIEDAELAkACQAJAIAEtALgBIgZBAUcNAAJAAkAgASgCiAEiBkELRw0AIAJBIGogARDEAQwBCyABQQs2AogBIAIgASkCmAE3AyAgAiABKAKgATYCKCABQYwBaiEHAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBjYCCCABIAcpAgA3AgwgASAHKAIINgIUCyABKQOwASEIIAMgAikDIDcCACADIAIoAig2AgggASAINwOoASABIAEoAngiA0H//9//fXFBgIAgcjYCeCACQcAAaiABEI4KIAEgAzYCeCACKAJAQRNHDQIgAigCRCEDDAELIAEoArQBIQMgASgCsAEhBSACQRRqIAYQyCUgAkGPAq1CIIZBwvCaAa2ENwM4IAJBIGpBzZWAASACQThqEM4IIAIgAikCFDcCLCACIAIoAhw2AjQgBSADIAJBIGoQxhshAyABLQC4AUGiAUcNACABIAEQhg4QkQkLIABBEzYCACAAIAM2AgQgBBCNAiAEQcAAQQgQ3BQMAQsCQEEwEIoBIgMNAEEIQTAQoiQACyADIAIpA2g3AyggAyACKQNgNwMgIAMgAikDWDcDGCADIAIpA1A3AxAgAyACKQNINwMIIAMgAikDQDcDACAAIAU2AgwgACADNgIIIAAgBDYCBCAAQQM2AgAgACABKAKsATYCEAsgAkHwAGokAAv1CAIHfwF+IwBB0ABrIgMkACABQbABaiEEIAEoArABIQUCQAJAAkACQAJAAkACQAJAAkAgAkUNACABLQC4ASIGQeMARw0BAkACQCABKAKIASIGQQtHDQAgA0EoaiABEMQBDAELIAFBCzYCiAEgAyABKQKYATcDKCADIAEoAqABNgIwIAFBjAFqIQcCQCABKAIIQQpGDQAgAUEIahDACwsgASAGNgIIIAEgBykCADcCDCABIAco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aiECIANBdGoiAw0ADAkLCyAAQQhqIAEQlAQPCwJAIAAoAgwiAkUNACACQdAAbCEDIAAoAgghAgNAQRghBAJAAkACQAJAIAIpAwAiBqciBUF+akECIAZCAVYbDgMAAgEACyACQQhqKAIADQJBICEEDAELAkAgBUEBcQ0AIAJBGGpBADYCAAsgAkEgaikDAEIAUg0BQTghBAsgAiAEakEANgIACyACQdAAaiECIANBsH9qIgMNAAsLIAAoAhwiAkUNBiACQQhqKAIAIgNFDQYgA0EMbCEDIAJBBGooAgAhAgNAIAIgARCMBiACQQxqIQIgA0F0aiIDDQAMBwsLAkACQCAAKAIIDgMAAQcACwJAIAAtACRBAkYNACAAQQA2AiALAkAgACgCKCIEQQhqKAIAIgJFDQAgAkEMbCEDIARBBGooAgAhAgNAIAIoAgAgARClASACQQxqIQIgA0F0aiIDDQALCwJAIARBFGooAgAiAkUNACACQdgAbCEDIARBEGooAgAhAgNAIAIgARDVAiACQdgAaiECIANBqH9qIgMNAAsLIAQoAjAiAkUNBiACIAEQpQEPCwJAIAAtACRBAkYNACAAQQA2AiALAkAgACgCKCIFQQhqKAIAIgJFDQAgBUEEaigCACIEIAJBBnRqIQADQAJAIARBOGooAgAiAkUNACACQQxsIQMgBEE0aigCACECA0AgAigCACABEKUBIAJBDGohAiADQXRqIgMNAAsLIAQgARCpCiAEQcAAaiICIQQgAiAARw0ACwsCQCAFQRRqKAIAIgJFDQAgAkEMbCEDIAVBEGooAgAhAgNAIAIoAgAgARClASACQQxqIQIgA0F0aiIDDQALCyAFKAIYQYCAgIB4Rg0FIAUoAiAiAkUNBSACQTBsIQMgBSgCHCECA0AgAiABEMADIAJBMGohAiADQVBqIgMNAAwGCwsgACgCBCABEKUBDwsgACgCECICRQ0DIAJBCGooAgAiA0UNAyADQQxsIQMgAkEEaigCACECA0AgAiABEIwGIAJBDGohAiADQXRqIgMNAAwECwsgACgCBEEANgI4DwsgACgCBCABEKUBDwsgAEEANgIgCwu9CAEDfwJAAkACQANAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOEwASEgECAwQFBgcICQoLDA0OEBEACyABIABBBGoQmwYPCyAAKAIEIAEQvgEgACgCCCEADA0LIAAoAgwiAEUNDyAAIAEQvgEPCyABKAIUIABBEGoQrAYaIAAoAighAAwLCyAALQAkQQJGDQ0gASgCFCAAQRBqEKwGGg8LIAAtACRBAkYNDCABKAIUIABBEGoQrAYaDwsgACgCBCABEL4BIAAoAgggARCMBCAAKAIUIgANCAwLCyAAKAIQIAEQvgEgACgCDCICRQ0KIAJBGGwhAiAAKAIIIQADQAJAIABBFGooAgAiA0UNACADIAEQvgELIAEgABCbBiAAQRhqIQAgAkFoaiICDQAMCwsLIAAoAgQgARC+AQ8LIAEgACgCBCIAQcgAahCbBiAAQeAAaiECAkAgACgCACIDQQhGDQAgAEEoaiEEAkAgA0EHRg0AIAAgARD9DAsgASAEEJsGCyACKAIAQYCAgIB4Rg0IIAEgAhCbBg8LIAAoAgQgARC+ASAAKAIIIQAMBAsgACgCBCABEL4BIAAoAgghAAwDCwJAIAAoAgQiAkECRg0AAkAgAkEBRw0AIAAoAgggARC+AQwBCyAAKAIIIQIQ2iIgAigCCCIDRQ0AIAIoAgQiAiADQThsaiEEA0AgAiABEP0MAkAgAkEwaigCACIDRQ0AIAMgARC+AQsgAkE4aiICIARHDQALCwJAIAAoAhgiAkUNACACIAEQvgELAkAgACgCHCICRQ0AIAIgARC+AQsgACgCDCEADAILAkACQAJAAkAgACgCBA4DAAECAAsgACgCCCECENoiIAIoAggiA0UNAiACKAIEIgIgA0E4bGohBANAIAIgARD9DAJAIAJBMGooAgAiA0UNACADIAEQvgELIAJBOGoiAiAERw0ADAMLCyAAKAIIIQIQ2iIgAigCCCIDRQ0BIAIoAgQiAiADQThsaiEEA0AgAiABEP0MAkAgAkEwaigCACIDRQ0AIAMgARC+AQsgAkE4aiICIARHDQAMAgsLIAAoAgggARD9DAsgACgCDCABEL4BIAAoAhAhAAwBCwJAAkACQAJAIAAoAgQOAwABAgALIAAoAgghAhDaIiACKAIIIgNFDQIgAigCBCICIANBOGxqIQQDQCACIAEQ/QwCQCACQTBqKAIAIgNFDQAgAyABEL4BCyACQThqIgIgBEcNAAwDCwsgACgCCCECENoiIAIoAggiA0UNASACKAIEIgIgA0E4bGohBANAIAIgARD9DAJAIAJBMGooAgAiA0UNACADIAEQvgELIAJBOGoiAiAERw0ADAILCyAAKAIIIAEQ/QwLIAAoAgwgARC+ASAAKAIQIQAMAAsLIAEgAEEIahCAAw8LIAAoAgQgARC+AQsL0ggBCH8jAEHQAmsiAyQAAkACQAJAIAAoAgAtAAAiBEGkAUcNACADQcgAakEIaiEFIANByABqQQRyIQYgA0GYAmpBBGohBANAIAEtAMgBIgdBowFGDQIgA0EBOgDjASADIAEoAsABNgLkAQJAAkAgB0EYRg0AQQAhCEEEIQBBACEJDAELIANBmAJqIAFBARDYAyADKAKcAiEAIAMoApgCIghBgICAgHhGDQQgAygCoAIhCSABLQDIASEHCwJAAkACQCAHQf8BcSIHQdgARg0AIAdB3wBHDQELIAMgCTYCpAIgAyAANgKgAiADIAg2ApwCIAMgATYCmAIgA0HIAGogASAEEEQgAygCTCEAIAMoAkgiCUEKRg0FDAELIAMgCTYCoAIgAyAANgKcAiADIAg2ApgCIAMgA0HjAWo2AqgCIAMgA0HkAWo2AqQCIANBsAFqIAEgA0GYAmoQ9x0CQCADKAKwAUETRw0AIAMoArQBIQAMBQsgBCADQbABakEw/AoAACAGIANBmAJqQTT8CgAAQQkhCSADKAJMIQALIANBgAFqIAVBMPwKAAACQCACKAIIIgcgAigCAEcNACACEMAaCyACKAIEIAdBOGxqIgggADYCBCAIIAk2AgAgCEEIaiADQYABakEw/AoAACACIAdBAWo2AggMAAsLIAMgBDoACyADQcgAakEIaiEGIANByABqQQRyIQogA0GYAmpBBGohBQNAAkACQCABLQDIASIHQaMBRg0AIAcgBEYNAyADQQE6AOMBIAMgASgCwAE2AuQBAkAgB0EYRg0AQQAhCEEEIQBBACEJDAILIANBmAJqIAFBARDYAyADKAKcAiEAIAMoApgCIghBgICAgHhGDQQgAygCoAIhCSABLQDIASEHDAELIANBDGpBowEQ2SUgASgCxAEhAiABKALAASEAIANBjwKtQiCGIANBC2qthDcDmAIgA0HIAGpBzZWAASADQZgCahCJHyADIAMpAgw3AlQgAyADKAIUNgJcIAEgACACIANByABqEPUdDAILAkACQAJAIAdB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AjwhACADKAI4IghBE0YNAiADQRBqIAVBKPwKAAACQCACKAIIIgYgAigCAEcNACACEMEaCyACKAIEIAZBMGxqIgcgADYCBCAHIAg2AgAgB0EIaiADQRBqQSj8CgAAIAIgBkEBajYCCAwACwtBACEACyADQeABaiQAIAALoggDB38CfgF8IwBB4ABrIgIkACABKALAASEDAkACQAJAAkACQAJAAkACQAJAAkACQCABLQDIASIEQUBqDgMDAAECCyABKALEASEEIAEQnxQhCyABEOgRIAJBEGogASADIAQQ1BogASgCvAEhBSACKAIQIAIoAhQQjRkiCUKAgICAcIMhCiAJpyEGQQIhAQwECyABKALEASEEIAEQ2BQhBiABEOgRIAJBGGogASADIAQQ1BogASgCvAEhBSACKAIYIAIoAhwQjRm/IQtBBCEBQgAhCgwDCyAEEOwTDQECQCAEQQRGDQAgAkHIAGpBBHIgBBDZJSACQcUANgJcIAJB9IqbATYCWCACQbCAgIB4NgJIIAEoAsABIAEoAsQBIAJByABqEMYbIQMCQCABLQDIAUGiAUcNACABIAEQoCMQjBQLIABBBTYCACAAIAM2AgQMCAsgARDoESABKALAASEHIAJBCGogAUHAABC0GCACKAIMIQQCQCACKAIIQQFxDQAgAiAENgIkIAEtAIEBQSBxRQ0FIAEtAMgBIgVBB0cNBkEEQQQQ6iAiCCAENgIAIAIgCDYCLCACQQE2AihBBCEFQQEhBANAIAIgBDYCMAJAIAEtAMgBQQdGDQAgASgCvAEhBCACQZWBgIB4NgJIIAEgByAEIAJByABqEPUdIAEoArwBIQVBCEHAABDqICIEQRk2AgAgBCAFNgIUIAQgBzYCECAEIAIpAig3AgQgBCACKAIwNgIMIAIgBDYCJAwHCyABEOgRIAIgAUHAABC0GCACKAIEIQYgAigCAEEBcQ0FAkAgBCACKAIoRw0AIAJBKGoQuxogAigCLCEICyAIIAVqIAY2AgAgBUEEaiEFIARBAWohBAwACwsgAEEFNgIAIAAgBDYCBAwHCyACQcgAaiABEMoVIAIpA1giCUKAgICAcIMhCiACKwNQIQsgAigCTCEFIAIoAkghAyAJpyEGQQEhAQwBCyABEPwXIgpCIIinIQUgATUCvAFCIIYgA62EvyELIAqnIQNBACEBQgAhCgsMAwsgAEEFNgIAIAAgBjYCBCACQShqEKQhDAMLIAEtAMgBIQULAkAgBUH/AXFBBUYNACABKALEASEDIAEoAsABIQQgAkE0aiAFENklIAJBjwKtQiCGQavkmgGthDcDQCACQcgAakHNlYABIAJBwABqEIkfIAIgAikCNDcCVCACIAIoAjw2AlwgBCADIAJByABqEMYbIQMCQCABLQDIAUGiAUcNACABIAEQoCMQjBQLIABBBTYCACAAIAM2AgQgAkEkahC6IgwCCyABEOgRIAEoArwBIQVBAyEBQgAhCgsgACALOQMQIAAgBTYCDCAAIAM2AgggACAENgIEIAAgATYCACAAIAogBq2ENwMYCyACQeAAaiQAC7MIAgZ/AX4jAEHwAGsiAiQAIAFBsAFqIQMgASgCsAEhBAJAAkAgASgCiAEiBUELRw0AIAJBIGogARDEAQwBCyABQQs2AogBIAIgASkCmAE3AyAgAiABKAKgATYCKCABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBTYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABKQOwASEIIAMgAikDIDcCACADIAIoAig2AgggASAINwOoAQJAAkACQCABLQC4ASIFDQACQAJAIAEoAogBIgVBC0cNACACQSBqIAEQxAEMAQsgAUELNgKIASACIAEpApgBNwMgIAIgASgCoAE2AiggAUGMAWohBgJAIAEoAghBCkYNACABQQhqEMALCyABIAU2AgggASAGKQIANwIMIAEgBigCCDYCFAsgASkDsAEhCCADIAIpAyA3AgAgAyACKAIoNgIIIAEgCDcDqAEgASABKAJ4IgVBwAByNgJ4IAIgARC4AyACKAIAIQYgASAFNgJ4IAIoAgQhBSAGQQFxRQ0BIABBEzYCACAAIAU2AgQMAgsgASgCtAEhAyABKAKwASEGIAJBCGogBRDIJSACQY8CrUIghkGftoEBrYQ3AzggAkEgakHNlYABIAJBOGoQzgggAiACKQIINwIsIAIgAigCEDYCNCAGIAMgAkEgahDGGyEDAkAgAS0AuAFBogFHDQAgASABEIYOEJEJCyAAQRM2AgAgACADNgIEDAELAkACQAJAIAEtALgBIgZBAUcNAAJAAkAgASgCiAEiBkELRw0AIAJBIGogARDEAQwBCyABQQs2AogBIAIgASkCmAE3AyAgAiABKAKgATYCKCABQYwBaiEHAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBjYCCCABIAcpAgA3AgwgASAHKAIINgIUCyABKQOwASEIIAMgAikDIDcCACADIAIoAig2AgggASAINwOoASABIAEoAngiA0H/5///fXFBgBhyNgJ4IAJBwABqIAEQjgogASADNgJ4IAIoAkBBE0cNAiACKAJEIQMMAQsgASgCtAEhAyABKAKwASEEIAJBFGogBhDIJSACQY8CrUIghkHC8JoBrYQ3AzggAkEgakHNlYABIAJBOGoQzgggAiACKQIUNwIsIAIgAigCHDYCNCAEIAMgAkEgahDGGyEDIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgAEETNgIAIAAgAzYCBCAFEI0CIAVBwABBCBDcFAwBCwJAQTAQigEiAw0AQQhBMBCiJAALIAMgAikDaDcDKCADIAIpA2A3AyAgAyACKQNYNwMYIAMgAikDUDcDECADIAIpA0g3AwggAyACKQNANwMAIAAgBDYCDCAAIAM2AgggACAFNgIEIABBDDYCACAAIAEoAqwBNgIQCyACQfAAaiQAC/gHAgV/AX4jAEHgAGsiAyQAIAEoAgQhBCADQcgAaiACIAEoAgAiBUEAELUCAkACQCADLQBIQQRGDQAgAykDSCIIQv8Bg0IEUQ0AIAAgCDcCAAwBCwJAAkAgAi0AXQ0AAkACQAJAIAEpAwhQDQAgA0EgaiABQQhqIgEQkxQCQCADKAIkQQNJDQAgAi0AYkH/AXFBCE8NACADQRhqIAEQkxQgAygCGCADKAIcQd8AEPMdDQILIANBEGogARCTFCADQcgAaiACIAUgBCADKAIQIAMoAhQQgQ8gAy0ASEEERg0EIAMpA0giCEL/AYNCBFENBCAAIAg3AgAMBQsgA0HIAGogAUEQahDrEyADQThqIAIgBSAEIAMoAkwiASADKAJQEIEPIAMtADhBBEYNASADKQM4IghC/wGDQgRRDQEgACAINwIAIAMoAkggARDVJQwECyADQQhqIAEQkxQgA0HIAGogAygCCCADKAIMQd8AQQFBABDQCSADQThqIAIgBSAEIAMoAkwiASADKAJQEIEPAkAgAy0AOEEERg0AIAMpAzgiCEL/AYNCBFENACAAIAg3AgAgAygCSCABENUlDAQLIAMoAkggARDVJQwCCyADKAJIIAEQ1SUgA0HIAGogAiAFIARBsO6aAUEBEIEPIAMtAEhBBEYNASADKQNIIghC/wGDQgRRDQEgACAINwIADAILIAEoAhAhBiADQcgAahDGFSADQQI6AFQgBiADQcgAahCSFiEHIAMoAkggAygCTBCUJQJAAkAgB8BBf0oNACADQcgAahDGFSADQQA6AFQgBiADQcgAahCSFiEHIAMoAkggAygCTBCUJQJAIAfAQQFIDQAgA0EsaiABQRBqEOsTDAILIAMgBhCtGCIBKAIINgJQIAMgASkCADcDSCADIAEvAA07AFUgAyABLQAPOgBXIANBAiABLQAMazoAVCADQThqIANByABqEOwJIANBAjYCXCADIANBOGo2AlggA0EsakGIgIABIANB2ABqEIkfIAMoAjggAygCPBDVJSADKAJIIAMoAkwQlCUgARCVJQwBCyADQcgAaiAGEOwJIANBAjYCPCADIANByABqNgI4IANBLGpBjoCAASADQThqEIkfIAMoAkggAygCTBDVJQsgA0HIAGogAiAFIAQgAygCMCIBIAMoAjQQgQ8CQAJAIAMtAEhBBEYNACADKQNIIghC/wGDQgRSDQELIANByABqIAIgBSAEQbDumgFBARCBDwJAIAMtAEhBBEYNACADKQNIIghC/wGDQgRSDQELIAMoAiwgARDVJQwBCyAAIAg3AgAgAygCLCABENUlDAELIABBBDoAAAsgA0HgAGokAAvBBwIDfwF+IwBBMGsiBCQAIARBHGogASgCVCABKAJYIAIQ8B0CQAJAIAQoAhxBgICAgHhGDQAgBCgCJEEYbCEFIANBAXMhBiAEKAIgIQICQANAAkACQAJAAkAgBUUNACAGIAEtAF1yIQMCQAJAIAJBEGotAABFDQAgA0EBcUUNAQwECyADQQFxDQIgBEEoaiABQdDjmgFBARDXDyAELQAoQQRGDQIgBCkDKCIHQv8Bg0IEUQ0CIAAgBzcCAAwICyAEQShqIAFB0OOaAUEBENcPIAQtAChBBEYNAiAEKQMoIgdC/wGDQgRRDQIgACAHNwIADAcLIABBBDoAAAwGCwJAAkACQCACQQhqKAIAIgNFDQAgBEEoaiABIAMQ8R0gBC0AKEEERg0AIAQpAygiB0L/AYNCBFINAQsgBEEoaiABQdHj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ASAIELIjCyADEOYDCyADQTBqJAALkwYBBH8CQAJAAkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgAoAgAOFA8PAAECAwgECAgFBgcICAkLDA0ODwsCQCAAKAIEQYCAgIB4Rg0AIAEgAEEEahDvHCABIABBHGoQixsgAEEQaiABEKolDwsgASAAQQhqEO8cIAEgAEEgahCLGyAAQRRqIAEQqiUPCyAAQRBqIAEoAhQQ5h4gASAAQShqEN8hDwsgAEHYAGohAiAAQRBqIQMCQAJAIAAtAERBBEYNACADIAEQnAsMAQsgAyABKAIUEOYeCyABIAIQ3yEPCyAAKAIMQThsIQQgACgCCCEFQQAhAANAIAQgAEYNDAJAAkACQAJAAkACQAJAAkBBBCAFIABqIgIoAgAiA0F8aiADQQRJGw4HAAECAwQFBgALIAEgAkEEahDvHCACQRhqIAEQwyIgASACQRxqEIsbDAYLIAEgAkEEahDvHCACQRhqIAEQwyIgASACQRxqEIsbDAULIAJBEGooAgAgARC+ASACQQxqIAEQwyIMBAsgAkEEaigCACABEL4BIAJBEGogARDDIgwDCyACQTBqKAIAIAEQvgEgAiABENoLDAILIAJBEGooAgAgARC+ASABIAJBBGoQ7xwgAkEcaiABEMMiIAEgAkEgahCLGwwBCyACQQRqIAEQxCILIABBOGohAAwACwsgACgCDEE4bCECIAAoAgghAANAIAJFDQsgACABEOEhIABBMGogARCOBSACQUhqIQIgAEE4aiEADAALCyABIABBCGoQ8BwPCyAAQQRqIAEQjgUgAEEIaiABEI4FIABBDGogARCOBSAAQRBqIQAMAwsgAEEQaiABEIsfDwsgAEEEaiEADAELIABBBGogARCOBSAAQQhqIQAMAAsLIABBEGogARCLHyABIABBwABqEMciIAEgAEHEAGoQxyIPCyAAKAIIQQBIDQIgASAAQQhqEPAcDwsgAEEoaiECAkAgAC0AHEECRg0AIAEoAhQgAEEIahCsBhoLIAIgARDDIg8LIABBCGogARCcCwsLtAYCCX8BfiMAQdAAayICJAAgASABKAJ4IgNB//97cTYCeAJAAkAgAS0AyAEiBEUNACABKALEASEFIAEoAsABIQYgAkEkaiAEENklIAJBjwKtQiCGQZ+2gQGt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AgAgAEEAOgAEDwsgAyAETw0AIAUgA2otAABB3wBHDQAgASADQQFqIgM2AggLAkACQAJAAkACQCADIAdqIgYgA0kNACABIAY2AgggBiAESw0BIANFDQIgAyAETw0CIAUgA2osAABBv39KDQIMAwsgAEEANgIAIABBADoABA8LIABBADYCACAAQQA6AAQPCwJAIAZFDQAgBiAETw0AIAUgBmosAABBv39MDQELIAUgA2ohBiACDQEgAEIBNwIIIAAgBzYCBCAAIAY2AgAPCyAFIAQgAyAGQdDLlwEQ0CIACyAFIANqQX9qIQQgByEBAkADQAJAIAEiAw0AQQAhAUEBIQMgBiEEDAILIANBf2ohASAEIANqLQAAQd8ARw0ACwJAAkAgAUUNAAJAAkAgASAHSQ0AIAEgB0cNASADDQJBACEIDAMLIAYgAWosAABBv39KDQELIAYgB0EAIAFB4MuXARDQIgALAkACQCADIAdJDQAgByEIIAMgB0cNAQwCCyAGIANqLAAAQb9/TA0AIAMhCAwBCyAGIAcgAyAHQfDLlwEQ0CIACyAGIAhqIQQgByAIayEHIAYhAwsCQCAHDQAgAEEANgIAIABBADoABA8LIAAgBzYCDCAAIAQ2AgggACABNgIEIAAgAzYCAAv1BgIIfwF+IwBBwABrIgIkACABIAEoAngiA0GAIHI2AngCQAJAIAEoAogBIgRBC0cNACACQSBqIAEQxAEMAQsgAUELNgKIASACIAEpApgBNwMgIAIgASgCoAE2AiggAUGMAWohBQJAIAEoAghBCkYNACABQQhqEMALCyABIAQ2AgggASAFKQIANwIMIAEgBSgCCDYCFAsgASACKAIoNgK4ASABIAEpA7ABNwOoASABIAIpAyA3ArABIAEgASgCeEH///+/f3E2AnggAkEIaiABKAKwASABEOwDIAIoAgghBCABIAM2AnggAigCDCEFAkAgA0GAIHENACABLQC4AUH+AXFBEkcNAAJAIAFBiAFqIgMoAgAiBkELRw0AIAEpAwghCiABQQo2AgggAiABKQMQNwMYIAIgCjcDECACQTBqIAEQxAEgASkDCCEKIAFBCjYCCCACIAEpAxA3AyggAiAKNwMgIAFBCGohBgJAAkAgASgCiAFBDnFBCkcNACADIAIpAzg3AxggAyACKQMwNwMQIAMgAikDKDcD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aiIFDQALCyAHIAEQoQggBi0APCIAQQZGDQMgAEECRw0DIAZBEGohAANAIAAoAhgiAC0ALEECRg0ADAQLCyACQQxqKAIAIgBFDQIgAEEobCEFIAJBCGooAgAhAANAIAAgARCrBSAAQShqIQAgBUFYaiIFDQAMAwsLQQghBSACKAIERQ0BCyABIAIgBWooAgAQyAELIAJB2ABqIgIgBEcNAAsLAkAgA0GYAWooAgAiAEUNACAAQShsIQIgA0GUAWooAgAhAANAIAEgABD5BiAAQShqIQAgAkFYaiICDQALCyADLQA8IgFBBkYNASABQQJHDQEgA0EQaiEBA0AgASgCGCIBLQAsQQJGDQAMAgsLIAAoAgwiAkUNACACQShsIQIgACgCCCEAA0AgACABEKsFIABBKGohACACQVhqIgINAAsLC40FAQp/IwBBsAFrIgMkAAJAAkACQAJAAkACQCABLQALQQFxDQAgAigCCCIEIAIoAgwiBU8NAiADQfAAaiACKAIAIgYgAigCBCIHEEsgAygCeCECIAMoAnQhCCADKAJwIQkgA0EIaiADQfwAakE0/AoAACAEQQFqIQQMAQsgAigCCCIEIAIoAgwiBU8NASADQfAAaiACKAIAIgYgAigCBCIHEEsgAygCeCECIAMoAnQhCCADKAJwIQkgA0EIaiADQfwAakE0/AoAACAFQX9qIQULIAlBVmoOAgIAAQsgA0HwAGogARDBGCAAQQhqIQIgAygCdCEBAkACQCADKAJwIgVBKkYNACACIANB8ABqQQhqQTj8CgAADAELIAIgATYCAAsgACAFNgIAIAAgATYCBAwCCyAAQQxqIANBCGpBNPwKAAAgACACNgIIIAAgCDYCBCAAIAk2AgAMAQsgA0H8AGohCgNAAkACQAJAAkACQCABLQALQQFxDQAgBCAFTw0CIANB8ABqIAYgBxBLIAMoAnghCyADKAJ0IQwgAygCcCEJIANBPGogCkE0/AoAACAEQQFqIQQMAQsgBCAFTw0BIANB8ABqIAYgBxBLIAMoAnghCyADKAJ0IQwgAygCcCEJIANBPGogCkE0/AoAACAFQX9qIQULIAlBKkYNAiAJQStHDQELIAAgAjYCCCAAIAg2AgQgAEEqNgIADAMLIABBDGogA0E8akE0/AoAACAAIAs2AgggACAMNgIEIAAgCTYCAAwC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BCgCDCIGQQJHDQAgBCgCEBDwFRoMCQsgBCgCECEBIAAgBCkCFDcCCCAAIAE2AgQgACAGNgIADAkLIABBADYCAAwIC0Go85oBQShBkIyFARC5IQALQcyBhQEQxCMAC0Go85oBQShB4IuFARC5IQALQayBhQEQxCMAC0H81oQBQSVBkNeEARDrGwALIAQoAjghBgsgBhDwFRoLIAAgASACIAMQywULIARBwABqJAAL3gQCAn8BfiMAQcAAayIDJAACQAJAAkACQAJAAkACQAJAIAEoAgAOBQABAgMEAAsgA0EwaiACIAEoAhAiBEEAELUCIAMtADBBBEYNBCADKQMwIgVC/wGDQgRRDQQgACAFNwIADAYLIANBMGogAUEIaiACEJEBIAMtADBBBEYNBCADKQMwIgVC/wGDQgRRDQQgACAFNwIADAULIANBMGogAUEIaiACEPcXIAMtADBBBEYNAyADKQMwIgVC/wGDQgRRDQMgACAFNwIADAQLIANBMGogAUEEaiACEOsJIAMtADBBBEYNAiADKQMwIgVC/wGDQgRRDQIgACAFNwIADAMLIANBMGogAUEIaiACEK8EIAMtADBBBEYNASADKQMwIgVC/wGDQgRRDQEgACAFNwIADAILAkACQAJAIARFDQAgA0EwaiACIAQQ8R0gAy0AMEEERg0AIAMpAzAiBUL/AYNCBFINAQsgAUEIaiEBIAItAFwNASADQTBqIAEgAhDBFiADLQAwQQRGDQIgAykDMCIFQv8Bg0IEUQ0CIAAgBTcCAAwDCyAAIAU3AgAMAgsgA0EQaiABEJMUIANBMGogAygCECADKAIUELMFIANBJGogAygCNCIBIAMoAjhBASACLQBiELECIANBCGogA0EkahCoFiADQRhqIAIgAygCCCADKAIMENcPAkAgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFENACAAIAU3AgAgA0EkahDpICADKAIwIAEQoSIMAgsgA0EkahDpICADKAIwIAEQoSILIABBBDoAAAsgA0HAAGokAAv/BAILfwJ+IwBBMGsiAyQAIAEtAMgBIQQgASgCwAEhBSADQRhqIAEQ7gwgAygCICEGAkACQCADKQMYIg5CAFINACAAQQM6ABQgACAGNgIADAELIA5CIIghDyADKAIkIQcgDqchCAJAIARB/wFxQe4ARw0AIAEoArwBIQQgASgCwAEhCSADQfaAgIB4NgIYIAEgCSAEIANBGGoQ9R0LIA+nIQpBACEEA0ACQAJAAkACQAJAIAEtAMgBQQhHDQAgARDoESABLQDIASILQbV/aiIJQR9NDQEMAgsgACAEOgAUIABBADYCEAwCC0EBIAl0QYGAgpB4cQ0CCyALQRlGDQEgC0G0f2pB/wFxQdUASQ0BIAEoAsABIQkgA0H1gICAeDYCGCABIAkgCSADQRhqEPUdIAAgBDoAFCAAQQA2AhALIAAgBzYCDCAAIAY2AgggACAKNgIEIAAgCDYCAAwCCyADIAQ6ABQgA0EANgIQIAMgBzYCDCADIAY2AgggAyAKNgIEIAMgCDYCAAJAAkACQCACDQAgA0EYaiABQQBBABD6AwJAIAMtACxBAkcNACADKAIYIQQMAwsgAygCJCEJIAMoAiAhBCADKAIcIQsgAygCGCEMDAELIANBGGogARDuDCADKAIgIQQgAykDGCIOUA0BIA5CIIinIQsgAygCJCEJIA6nIQwLIAEoArwBIQ1BCEEwEOogIgggDTYCFCAIIAU2AhAgCCAJNgIMIAggBDYCCCAIIAutQiCGIAythDcDACAIIAMpAwA3AxggCCADKQMINwMgIAggAykDEDcDKEECIQQMAQsLIABBAzoAFCAAIAQ2AgAgAxDGHQsgA0EwaiQAC7QFAgZ/A34jAEEgayIBJAAgACgCCCECIAAoAgAhAwJAAkACQAJAAkACQCAAKAIMIgRBEUkNACAEQXBqIQVC05GMrYjR2p8kIQdCxObBm+DF4owTIQhBACEAA0AgCCEJAkAgACAFSQ0AIAFBEGogBSACIARB4MKYARDoHSABKAIUIgBBB00NBCAAQQ9NDQUgASgCECIAKQAIIAmFIQggACkAACAHhSEHDAMLIAIgAGoiBkEIaikAAELQ4/zMooTOhKR/hSIIQv////8PgyAGKQAAIAeFIgdCIIh+QiCJIAhCIIggB0L/////D4N+hSEIIABBEGohACAJIQcMAAsLAkACQAJAIARBB0sNACAEQQNLDQEgBA0CQtORjK2I0dqfJCEHQsTmwZvgxeKMEyEIDAMLIAIpAAAhCCABIARBeGogAiAEQbDDmAEQ6B0gASgCBEEIRw0FIAhC05GMrYjR2p8khSEHIAEoAgApAABCxObBm+DF4owThSEIDAILIAI1AAAhCCABQQhqIARBfGogAiAEQZDDmAEQ6B0gASgCDEEERw0FIAhC05GMrYjR2p8khSEHIAEoAgg1AABCxObBm+DF4owThSEIDAELIAIgBGpBf2oxAABCCIYgAiAEQQF2ajEAAIRCxObBm+DF4owThSEIIAIxAABC05GMrYjR2p8khSEHCyABQSBqJAAgA0Hdy92eeWwgB0L/////D4MgCEIgiH4gBK2FIAdCIIggCEL/////D4N+QiCJhSIIp2pB3cvdnnlsIAhCIIinakHJwfj9AGxBo+65nARqQQ93rQ8LQQBBCCAAQfDCmAEQkAoAC0EIQRAgAEGAw5gBEJAKAAtB8P2aAUErIAFBH2pBgMSYAUHAw5gBEN0UAAtB8P2aAUErIAFBH2pBgMSYAUGgw5gBEN0UAAuRBQEEfyMAQSBrIgQkAAJAAkACQAJAAkAgAS0AuAFBBkcNAAJAAkAgASgCiAEiBUELRw0AIARBEGogARDEAQwBCyABQQs2AogBIAQgASkCmAE3AxAgBCABKAKgATYCGCABQYwBaiEGAkAgASgCCEEKRg0AIAFBCGoQwAsLIAEgBTYCCCABIAYpAgA3AgwgASAGKAIINgIUCyABIAQoAhg2ArgBIAEgASkDsAE3A6gBIAEgBCkDEDcCsAFBACEFDAELIAEgASgCeCIFQcAAcjYCeCAEQQhqIAEQuAMgBCgCCCEGIAEgBTYCeCAEKAIMIQUCQCAGQQFHDQAgAEEFNgIAIAAgBTYCBAwDCyABLQC4ASIHQQZHDQECQAJAIAEoAogBIgZBC0cNACAEQRBqIAEQxAEMAQsgAUELNgKIASAEIAEpApgBNwMQIAQgASgCoAE2AhggAUGMAWohBwJAIAEoAghBCkYNACABQQhqEMALCyABIAY2AgggASAHKQIANwIMIAEgBygCCDYCFAsgASAEKAIYNgK4ASABIAEpA7ABNwOoASABIAQpAxA3ArABCyABLQC4ASEHC0EAIQYCQCAHQf8BcUEBRg0AIAEgASgCeCIGQcAAcjYCeCAEIAEQuAMgBCgCACEHIAEgBjYCeCAEKAIEIQYgB0EBRw0AIABBBTYCACAAIAY2AgQgBUUNASAFEI0CIAVBwABBCBDcFAwBCyAAIAY2AgwgACAFNgIIIAAgAzYCBCAAIAI2AgAMAQsgAkECRg0AAkAgAg0AIANBBGoiASgCACADQQhqKAIAEPwaIAMoAgAgASgCABD4IyADQRxBBBDcFAwBCyADEI0CIANBwABBCBDcFAsgBEEgaiQAC+AFAQF/IwBBEGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAC0AAA4SAAECAwQFBgcICQoLDA0ODxARAAsgAiAALQABOgAAIAJBHzYCDCACIAI2AgggASgCACABKAIEQdSogQEgAkEIahDNIyEBDBELIAIgACkDCDcDACACQSA2AgwgAiACNgIIIAEoAgAgASgCBEHGqIEBIAJBCGoQzSMhAQwQCyACIAApAwg3AwAgAkEhNgIMIAIgAjYCCCABKAIAIAEoAgRBxqiBASACQQhqEM0jIQEMDwsgAiAAKwMIOQMAIAJBIjYCDCACIAI2AgggASgCACABKAIEQZOogQEgAkEIahDNIyEBDA4LIAIgACgCBDYCACACQQM2AgwgAiACNgIIIAEoAgAgASgCBEG2qIEBIAJBCGoQzSMhAQwNCyACIAApAgQ3AgAgAkEjNgIMIAIgAjYCCCABKAIAIAEoAgRBnYqAASACQQhqEM0jIQEMDAsgASgCAEHMpZgBQQogASgCBCgCDBEMACEBDAsLIAEoAgBB1qWYAUEKIAEoAgQoAgwRDAAhAQwKCyABKAIAQeClmAFBDCABKAIEKAIMEQwAIQEMCQsgASgCAEHspZgBQQ4gASgCBCgCDBEMACEBDAgLIAEoAgBB+qWYAUEIIAEoAgQoAgwRDAAhAQwHCyABKAIAQYPbmgFBAyABKAIEKAIMEQwAIQEMBgsgASgCAEGv75oBQQQgASgCBCgCDBEMACEBDAULIAEoAgBBgqaYAUEMIAEoAgQoAgwRDAAhAQwECyABKAIAQY6mmAFBDyABKAIEKAIMEQwAIQEMAwsgASgCAEGdppgBQQ0gASgCBCgCDBEMACEBDAILIAEoAgBBqqaYAUEOIAEoAgQoAgwRDAAhAQwBCyABKAIAIAAoAgQgACgCCCABKAIEKAIMEQwAIQELIAJBEGokACABC9kEAQd/IwBBIGsiAiQAQQEhAwJAIAFFDQAgASAAKAIESQ0AIAFBECABQRBLGyEEAkACQAJAIAAoAggiBUH///93Rg0AIAFB/v//B00NAQwDCyABQf7//wdNDQJBACEFAkAgACgCAEF8aiIGKAAAIgdBf3NBH3YgB0G46YEBEM8dIgdB+P///wdLDQBBBCEFIAJBBDYCHCACIAdBBGo2AhgLIAIgBTYCFCACQQhqIAJBFGpB1OmBARDiGiACKAIIIQUgAigCDCEIIARBf3NBH3YgBEG46YEBEM8dIQRBACEHAkAgAUH4////B0sNAEEEIQcgAkEENgIcIAIgBEEEajYCGAsgAiAHNgIUIAJBCGogAkEUakHU6YEBEOIaIAIoAggiByACKAIMakF/akEAIAdrcSIHIARJDQIgBiAFIAhqQX9qQQAgBWtxIAUgBxC8BCIFRQ0CIAUgBDYAACAFQQRqIQQMAQtBACEDIAQgBUH///8HcSIFRg0BIAJBADYCHCACIAU2AhhBASEDIAJBATYCFCACQQhqIAJBFGpB9OmBARDiGiACKAIIIQUgAigCDCEGIARBf3NBH3YgBEHk6YEBEM8dIQQgAkEANgIcIAIgBDYCGCACQQE2AhQgAkEIaiACQRRqQfTpgQEQ4hogAigCCCIHIAIoAgxqQX9qQQAgB2txIgcgBEkNASAAKAIAIAUgBmpBf2pBACAFa3EgBSAHELwEIgRFDQELIAAgAUH///8HIAFB////B0kbQYCAgHByNgIIIAAgBDYCAEEAIQMLIAJBIGokACADC40FAgV/AX4jAEGAAWsiAyQAAkACQAJAAkACQAJAIAEtALgBIgRBgAFGDQACQCAEQcAARg0AIANBwABqQQRyIAQQyCUgA0EaNgJUIANBw4KbATYCUCADQbCAgIB4NgJAIAEoArABIAEoArQBIANBwABqEMYbIQVBASEGIAEtALgBQaIBRw0FIAEgARCGDhCRCQwFCyADQShqIAEQlgpCASEIDAELIANBwABqIAEQtgggAygCSCEFIAMpA0AiCFANASADQQA2AjggAyADKAJMNgI0IAMgBTYCMCADQQA6ADwgAyAINwMoQgAhCAsgAyAINwMIIAMgAykDKDcDECADIAMpAzA3AxggAyADKQM4NwMgAkACQCABLQC4AUECRg0AIAEQhwkiBQ0BQQMhBwwDCyADQcAAaiABELIIAkAgAygCQCIGQYCAgIB4Rg0AIAMgAykCTDcDYCADIAMpAkQ3A1hBAiEHDAMLIAMoAkQhBQsCQCAEQYABRw0AQQEhBiADKQMQIghCA4NCAFINAyAIpyIBIAEoAgAiBEF/ajYCAEEBIQYgBEEBRw0DIAEgASgCEBDwHgwDCyADQRBqELESC0EBIQYMAQsgASgCrAEhAUHYABCKASIFRQ0BIAUgAykDIDcDGCAFIAMpAxg3AxAgBSADKQMQNwMIIAUgAykDCDcDACAFIAY2AiAgBSADKQNYNwIkIAUgAykDYDcCLCAFIAMpA2g3AjQgBSADKQNwNwI8IAUgAy0AeDoAREEAIQYgBUEAOgBSIAUgBEGAAUY6AFEgBUEAOgBQIAUgATYCTCAFIAI2AkggBSAHOgBFCyAAIAU2AgQgACAGNgIAIANBgAFqJAAPC0EIQdgAEKIkAAvUBAEGfyMAQSBrIgUkAAJAAkACQAJAAkACQAJAIAJFDQAgBCACQQxsIgZBdGoiB0EMbmwhCCABIQkCQANAIAZFDQEgBkF0aiEGIAkoAgghCiAJQQxqIQkgCiAIaiIIIApPDQALQeDZmgFBNUGY2poBEOwbAAsgBUEUaiAIQQFBARCvESAFKAIYIQYgBSgCFEEBRg0BIAVBADYCECAFIAUoAhw2AgwgBSAGNgIIIAVBCGogASgCBCIGIAYgASgCCGoQ5xQgCCAFKAIQIglrIQYgBSgCDCAJaiEJAkACQCAEQQJHDQAgAkEBRg0BIAFBFGohAgNAIAZBAU0NByACQXxqKAIAIQEgAigCACEKIAkgAy8AADsAACAGQX5qIgYgCkkNCCAJQQJqIQkCQCAKRQ0AIAkgASAK/AoAAAsgAkEMaiECIAYgCmshBiAJIApqIQkgB0F0aiIHDQAMAgsLIAJBAUYNACABQRRqIQIDQCAGRQ0EIAJBfGooAgAhASACKAIAIQogCSADLQAAOgAAIAZBf2oiBiAKSQ0FIAlBAWohCQJAIApFDQAgCSABIAr8CgAACyACQQxqIQIgBiAKayEGIAkgCmohCSAHQXRqIgcNAAsLIAAgBSkCCDcCACAAIAggBms2AggMBgsgAEEANgIIIABCgICAgBA3AgAMBQsgBiAFKAIcEP4gAAtB1P2aAUETQdDZmgEQ6xsAC0HU/ZoBQRNB0NmaARDrGwALQdT9mgFBE0HQ2ZoBEOsbAAtB1P2aAUETQdDZmgEQ6xsACyAFQSBqJAAL6AQBBX8jAEEgayIBJAACQAJAAkAgACgCACICRQ0AQQAhAwNAAkAgACgCCCIEIAAoAgRPDQAgAiAEai0AAEHFAEcNACAAIARBAWo2AggMAgsCQCADRQ0AIAAoAhAiAkUNACACQeXKlwFBAxCdBw0DCyAAEMIJQf8BcSIEQQJGDQICQAJAAkAgACgCACIFRQ0AA0AgACgCCCICIAAoAgRPDQEgBSACai0AAEHwAEcNASAAIAJBAWo2AggCQAJAIARBAXENACAAKAIQIgJFDQEgAkG77JoBQQEQnQcNCAwBCyAAKAIQIgJFDQAgAkHnppgBQQIQnQcNBwsCQCAAKAIADQAgACgCECIERQ0EQQEhAiAEQa/umgFBARCdBw0IDAQLIAEgABCaBQJAIAEoAgANACABLQAEIQQCQCAAKAIQIgVFDQBBASECIAVB6MiXAUHYyJcBIARBAXEiAxtBGUEQIAMbEJ0HDQkLIAAgBDoABEEAIQIgAEEANgIADAgLIAEgASkCCDcDGCABIAEpAgA3AxACQCAAKAIQIgJFDQAgAUEQaiACELEDDQcgACgCECICRQ0AIAJBrcyXAUEDEJ0HDQcLAkACQCAAKAIAIgJFDQAgACgCCCIEIAAoAgRPDQAgAiAEai0AAEHLAEcNACAAIARBAWo2AgggAEEAELYCDQgMAQsgABCsAw0HC0EBIQQgACgCACIFDQAMAgsLIARBAXFFDQELIAAoAhAiBEUNAEEBIQIgBEG97JoBQQEQnQcNBAsgA0EBaiEDIAAoAgAiAg0ACwtBACECDAELQQEhAgsgAUEgaiQAIAIL6wQBBX8jAEEQayICJAAgACgCACEAAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRBAUcNAyAALQA5IQMgAEEBOgA5IAEoAgggABB5IAAgAzoAOQwDCyAALQA5IQMgAEEBOgA5IAEoAgQgABB5IAAgAzoAOQwCCyAAIAEoAgQiBEHAAGoQmAoCQCAEQYQBaigCACIBRQ0AIAFB2ABsIQMgBEGAAWooAgBBBGohAQNAAkACQAJAAkACQCABQXxqKAIADgYEAQIDBAAECyAALQA5IQUgAEEBOgA5IAEoAgAgABB5IAAgBToAOQwDCyABKAIAQQFHDQIgAC0AOSEFIABBAToAOSABQQRqKAIAIAAQeSAAIAU6ADkMAgsgASAAEIIGDAELIAEgABC1DQsgAUHYAGohASADQah/aiIDDQALCwJAIAQoAngiAUUNACAALQA0QQFHDQAgAC0AOiEFIAAtADkhBiAAQYECOwA5AkAgASgCCCIDRQ0AIANBAnQhAyABKAIEIQEDQAJAIAAtADRBAUcNACAAQYECOwA5IAEoAgAgABCSAiAAQYECOwA5CyABQQRqIQEgA0F8aiIDDQALCyAAIAU6ADogACAGOgA5CyAEQZQBaigCACEBIARBmAFqKAIAIQMgAiAANgIMAkAgA0UNACADQShsIQMDQCACQQxqIAEQvwYgAUEoaiEBIANBWGoiAw0ACwsgBC0APEEGRg0BIAAgBEEQahCYCgwBCyABKAIMIgNFDQAgA0EobCEDIAEoAgghAQNAIAEgABCJECABQShqIQEgA0FYaiIDDQALCyACQRBqJAAL7gQBBX8jAEEwayICJAAgACgCACIDQcAAaiABEL4DAkAgA0GYAWooAgAiAEUNACADQZQBaigCACIEIABBKGxqIQUDQAJAAkACQAJAAkAgBCgCAA4FBAABAgMECyAEKAIEQQFHDQMgBCgCCCIAIAEQXCAAKAIAQRpHDQMgASAAQQhqEJQLIgZFDQMgABCIAiAAIAYpAzg3AzggACAGKQMwNwMwIAAgBikDKDcDKCAAIAYpAyA3AyAgACAGKQMYNwMYIAAgBikDEDcDECAAIAYpAwg3AwggACAGKQMANwMAIAZBwABBCBDcFAwDCyAEKAIEIgAgARBcIAAoAgBBGkcNAiABIABBCGoQlAsiBkUNAiAAEIgCIAAgBikDODcDOCAAIAYpAzA3AzAgACAGKQMoNwMoIAAgBikDIDcDICAAIAYpAxg3AxggACAGKQMQNwMQIAAgBikDCDcDCCAAIAYpAwA3AwAgBkHAAEEIENwUDAILIARBBGogARDABgwBCyAEQQxqKAIAIgBFDQAgAEEobCEGIARBCGooAgAhAANAIAAgARDeBiAAQShqIQAgBkFYaiIGDQALCyAEQShqIgQgBUcNAAsLAkAgAy0APCIAQQZGDQACQCAAQQJLDQAgA0EoaiEGAkAgAEECRw0AIAYgARDhHgsgASAGEKcJIAMtADwhAAsgAEH/AXFBA0cNACACIAEgA0EQaiIAEKMNIAItACxBBkYNACAAEJgTIAAgAikDKDcDKCAAIAIpAyA3AyAgACACKQMYNwMYIAAgAikDEDcDECAAIAIpAwg3AwggACACKQMANwMACyACQTBqJAAL7gQDCH8DfgF8IwBBMGsiAiQAIAEoAsABIQMgAiABLQDIASIEOgAnAkACQAJAAkACQAJAAkACQAJAAkACQCAEQUBqDgMBAgMACwJAIARB2gBGDQACQCAEQeQARg0AIARB6gBGDQEgBEHefmoOAgUGBwsgARDoESABKAK8ASEFQQIhAUIAIQoMCAsgBEHqAEYhBiABEOgRIAEoArwBIQVBASEBQgAhCgwHCyACQQhqIAEgAyABKALEARDUGiACKAIIIAIoAgwQjRkhCyABENcUIQwgARDoESALQoCAgIBwgyEKIAunIQcgDEIoiKchBCAMQiCIpyEGIAynIQUgASgCvAEhCEEAIQEgAyEJDAcLIAJBEGogASADIAEoAsQBENQaIAIoAhAgAigCFBCNGSEMIAEQnxQhDSABEOgRIAxCgICAgHCDIQogASgCvAEiBkEIdiEEIAynIQcgDb0iDEIgiKchCCAMpyEJQQMhASADIQUMBgsgAkEYaiABIAMgASgCxAEQ1BogAigCGCACKAIcEI0ZIQogARDYFCEHIAEQ6BEgASgCvAEiBkEIdiEEIAqnIQkgCkIgiKchCEEEIQFCACEKIAMhBQwFCyABENYUIQMgARDoEQwCCyABKAJwELEeIQMMAQsgAkGPAq1CIIYgAkEnaq2ENwMoQceGgAEgAkEoakHMhpsBEOsbAAsgAEEHNgIAIAAgAzYCBAwCCwsgACAEOwANIAAgCDYCFCAAIAk2AhAgACAGOgAMIAAgBTYCCCAAIAM2AgQgACABNgIAIABBD2ogBEEQdjoAACAAIAogB62ENwMYCyACQTBqJAALzwQBCH8jAEHAAGsiASQAIAFBAToACyABQQE2AiQgAUIENwIcIAFCADcCFCABQoCAgIDAADcCDEEAIQIgAUEANgIwIAFCgICAgMAANwIoIAEgAUEoajYCPCABIAFBC2o2AjggASABQQxqNgI0AkAgACgCCCIDRQ0AIANBBHQhBCAAKAIEIQVBACECQQAhBgJAA0AgAUE0aiAFIAZqIgdBBGooAgAgB0EIaigCABDmBUUNASACQQFqIQIgBCAGQRBqIgZHDQALIAMhAgwBCyAHKAIAIAdBBGooAgBBAUEBEN0TAkAgAkEBaiADTw0AIAJBf3MgA2ohBCAHQRBqIQYDQAJAAkAgAUE0aiAGQQRqIgcoAgAgBkEIaigCABDmBQ0AIAYoAgAgBygCAEEBQQEQ3RMMAQsgBSACQQR0aiIHIAYpAgg3AgggByAGKQIANwIAIAJBAWohAgsgBkEQaiEGIARBf2oiBA0ACwsgACACNgIICyABKAIsIQMgASgCKCEIAkACQCABKAIwIgZFDQAgBkECdCEHIAAoAgQhBCADIQYDQCAGKAIAIgUgAk8NAiAEIAVBBHRqQQA6AAwgBkEEaiEGIAdBfGoiBw0ACwsgCCADQQRBBBDdEyABKAIQIQICQCABKAIUIgZFDQADQCACKAIAIAJBBGooAgBBBEEIEN0TIAJBDGohAiAGQX9qIgYNAAsgASgCECECCyABKAIMIAJBBEEMEN0TIAEoAhggASgCHEEEQQQQ3RMgAUHAAGokAA8LIAUgAkHc7YkBEP4WAAvOBAIKfwR+IwBBEGsiAiQAIAIgATYCCCACQQA2AgwCQCABRQ0AAkBBACgC6JSdASIDRQ0AIAMQhRkiA0EgaiEEIANBEGohBSADQQRqIQYgAygCFCIHIABB3cvdnnlsIAFqQd3L3Z55bEEPdyIIcSEJIAitIgxCGYhCgYKEiJCgwIABfiENIAMoAhAhCkEAIQsDQCAKIAlqKQAAIg4gDYUiD0J/hSAPQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIQ8CQAJAAkADQCAPUA0BAkAgCkEAIA96p0EDdiAJaiAHcWtBDGxqIghBdGooAgAgAEcNACAIQXhqKAIAIAFGDQMLIA9Cf3wgD4MhDwwACwsgDiAOQgGGg0KAgYKEiJCgwIB/g1ANAQJAIAMoAhgNACAFIAQQqAcaCwJAIAMoAgwiCSADKAIERw0AIAYQtxoLIAMoAgggCUEDdGoiCCAANgIEIAggATYCACADIAlBAWo2AgwgAygCECEIIAggCCADKAIUIgcgDBCSEiIKaiIGLQAAIQsgBiAMQhmIpyIEOgAAIAggByAKQXhqcWpBCGogBDoAACADIAMoAhxBAWo2AhwgAyADKAIYIAtBAXFrNgIYIAhBACAKa0EMbGoiCEF8aiAJNgIAIAhBeGogATYCACAIQXRqIAA2AgALIAhBfGooAgAhASADQQA6AAAgAkEQaiQAIAEPCyAJIAtBCGoiC2ogB3EhCQwACwtBkOWaAUHIAEHY5ZoBEMgkAAsgAkEIaiACQQxqQQBByMWYARDUHAAL0QQBG38jAEHAAGsiAiQAIAAtAFghAyABLQBYIQQCQAJAIAEtADwiBUEDRg0AIAEoAjghBiABKAI0IQcgASgCMCEIIAIgAS0APzoAPiACIAEvAD07ATwMAQsCQAJAIAAtADwiBUEDRg0AIAVBAkYNACAAKAIwIgggCCgCACIJQQFqNgIAAkAgCUF/TA0AIAAoAjghBiAAKAI0IQcMAgsACwsgAUEwahCbGwsgAC0AWSEKIAEtAFkhCSAALQBaIQsgAS0AWiEMIAAtAFshDSABLQBbIQ4gAiABIAAgASgCAEEBcRtBMPwKAAAgAEHMAGogAUHMAGogASgCSCIPQQJGIhAbKAIAIREgAEHUAGogAUHUAGogASgCUCISQQJGIhMbKAIAIRQgAUHEAGogAEHEAGogASgCQCIVGygCACEWIAAoAkAhFyAAKAJIIRggACgCUCEZIAAtAFwhGiABLQBcIRsgAC0AXSEcIAEtAF0hASAAQTBqEJsbIAAgAkEw/AoAACAAIAU6ADwgACAGNgI4IAAgBzYCNCAAIAg2AjAgACAcIAEgAUECRhs6AF0gACAaIBsgG0ECRhs6AFwgACANIA4gDkECRhs6AFsgACALIAwgDEECRhs6AFogACAKIAkgCUECRhs6AFkgACADIAQgBEH/AXFBAkYbOgBYIAAgFDYCVCAAIBkgEiATGzYCUCAAIBE2AkwgACAYIA8gEBs2AkggACAWNgJEIABBASAXIBUbNgJAIAAgAi8BPDsAPSAAIAItAD46AD8gAkHAAGokACAAC9UEAgp/An4CQAJAAkACQCABLQAsIgJBfWpBASACQQJLG0H/AXEOAwACAQALIAEoAhAhAiABKAIMIQMgASgCCCEEAkAgASkDACIMQgODQgBSDQAgDKciBSAFKAIAIgVBAWo2AgAgBUF/TA0DCyAAIAI2AhAgACADNgIMIAAgBDYCCCAAIAw3AwAgACABLQAUOgAUIABBAzoALA8LIAEoAgwhAiABKAIIIQMgASgCJCEEIAEoAiAhBQJAIAEpAwAiDEIDg0IAUg0AIAynIgYgBigCACIGQQFqNgIAIAZBf0wNAgsgASgCHCEGIAEoAhghBwJAIAEpAxAiDUIDg0IAUg0AIA2nIgEgASgCACIBQQFqNgIAIAFBf0wNAgsgACAENgIkIAAgBTYCICAAIAY2AhwgACAHNgIYIAAgDTcDECAAIAI2AgwgACADNgIIIAAgDDcDACAAQQU6ACwPCyABKAIUIQQgASgCECEFAkACQCACQQJGDQAgASgCKCEGIAEoAiQhByABKAIgIQggASkDGCIMpyEDAkAgDEIDg0IAUg0AIAMgAygCACIJQQFqNgIAIAlBf0wNAwsgDEIgiKchCQwBCyABQRhqEPwKIQMLIAEoAgwhCiABKAIIIQsCQCABKQMAIgxCA4NCAFINACAMpyIBIAEoAgAiAUEBajYCACABQX9MDQELIAAgBjYCKCAAIAc2AiQgACAINgIgIAAgCTYCHCAAIAM2AhggACAENgIUIAAgBTYCECAAIAo2AgwgACALNgIIIAAgDDcDACAAIAI6ACwPCwALvwQCB38EfiACIAMQphshDQJAIAEoAggNACABQQEgAUEQahC8AhoLIA1CGYgiDkKBgoSIkKDAgAF+IQ8gASgCBCIGIA2ncSEHIAEoAgAhCEEAIQlBACEKA0ACQAJAAkACQCAIIAdqKQAAIhAgD4UiDUJ/hSANQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIg1QDQADQCACIAMgCCANeqdBA3YgB2ogBnFBBXRrIgtBYGopAwAgC0FoaigCABD8Eg0CIA1Cf3wgDYMiDVBFDQALCyAQQoCBgoSIkKDAgH+DIQ0CQCAJQQFGDQAgDVANAiANeqdBA3YgB2ogBnEhDAsCQCANIBBCAYaDQgBSDQBBASEJDAMLAkAgCCAMaiwAACIHQQBIDQAgCCAIKQMAQoCBgoSIkKDAgH+DeqdBA3YiDGotAAAhBwsgCCAMaiAOpyILOgAAIAggBiAMQXhqcWpBCGogCzoAACAAQgA3AwAgASABKAIIIAdBAXFrNgIIIAEgASgCDEEBajYCDCAIIAxBBXRrIgFBYGogAjcDACABQWhqIAM2AgAgAUFwaiAENwMAIAFBeGogBTYCAA8LIABCATcDACALQXhqIgEoAgAhCCABIAU2AgAgC0FwaiIBKQMAIQ0gASAENwMAIAAgCDYCECAAIA03AwgCQCACQgODQgBSDQAgAqciASABKAIAIghBf2o2AgAgCEEBRw0AIAEgASgCEBDwHgsPC0EAIQkLIApBCGoiCiAHaiAGcSEHDAALC/YEAQR/IwBBEGsiBCQAAkACQAJAAkAgAC0AAEEBRg0AIAAoAgQhBQJAIAAtAAFBAUYNACAFKAIAKAIAIgZBARCfHyAGKAIEIAYoAggiB2pBLDoAACAGIAdBAWo2AggLIABBAjoAASAEQQhqIAUoAgAgASACEMEFAkAgBC0ACEEERg0AIAQpAwgQ2yAhAAwECyAFKAIAKAIAIgBBARCfHyAAKAIEIAAoAggiAmpBOjoAACAAIAJBAWo2AggCQCADKAIAQYCAgIB4Rw0AIAUoAgAoAgAiAEEEEJ8fIAAoAgQgACgCCCIFakHu6rHjBjYAACAAIAVBBGo2AggMAwsgAygCBCEAIAMoAgghAyAFKAIAIgIoAgAiBUEBEJ8fIAUoAgQgBSgCCCIBakHbADoAACAFIAFBAWo2AgggA0UNASADQQxsIQNBASEFA0ACQCAFQQFxDQAgAigCACIFQQEQnx8gBSgCBCAFKAIIIgFqQSw6AAAgBSABQQFqNgIICwJAAkAgACgCAEGAgICAeEYNACAEQQhqIAIgAEEEaigCACAAQQhqKAIAEMEFIAQtAAhBBEYNASAEKQMIENsgIQAMBgsgAigCACIFQQQQnx8gBSgCBCAFKAIIIgFqQe7qseMGNgAAIAUgAUEEajYCCAsgAEEMaiEAQQAhBSADQXRqIgMNAAsgAigCACIAQQEQnx8gACgCBCAAKAIIIgVqQd0AOgAAIAAgBUEBajYCCAwCC0Go85oBQShBrNyaARC5IQALIAIoAgAiAEEBEJ8fIAAoAgQgACgCCCIFakHdADoAACAAIAVBAWo2AggLQQAhAAsgBEEQaiQAIAAL0gQCA38BfiMAQSBrIgMkACABKAIUIQQgA0EIaiACIAEoAhAiBUEAELUCAkACQCADLQAIQQRGDQAgAykDCCIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAIAEtABhFDQAgA0EANgIIIAMgAiADQQhqQbjvmgFBCBDrDQJAIAMtAABBBEYNACADKQMAIgZC/wGDQgRRDQAgACAGNwIADAILIAItAF0NACADQQhqIAIQ2BAgAy0ACEEERg0AIAMpAwgiBkL/AYNCBFENACAAIAY3AgAMAQsgA0EANgIUIANBCGogAiADQRRqQaLvmgFBARDsDQJAIAMtAAhBBEYNACADKQMIIgZC/wGDQgRRDQAgACAGNwIADAELIANBCGogAiAFIAQgASgCBCABKAIIEPkHAkAgAy0ACEEERg0AIAMpAwgiBkL/AYNCBFENACAAIAY3AgAMAQsgA0EIaiACIANBFGpBo++aAUEBEOwNAkAgAy0ACEEERg0AIAMpAwgiBkL/AYNCBFENACAAIAY3AgAMAQsCQAJAAkAgASgCDEUNACADQQhqIAIgA0EUakHO7JoBQQEQ7A0CQCADLQAIQQRGDQAgAykDCCIGQv8Bg0IEUQ0AIAAgBjcCAAwECwJAIAItAF0NACADQQhqIAIQ2BAgAy0ACEEERg0AIAMpAwgiBkL/AYNCBFINAgsgA0EIaiABQQxqIAIQqREgAy0ACEEERg0AIAMpAwgiBkL/AYNCBFINAgsgAEEEOgAADAILIAAgBjcCAAwBCyAAIAY3AgALIANBIGokAAvnBAELfyMAQSBrIgIkAAJAAkACQAJAAkACQCAAKAIAIgNBdGoiBEEHIANBC0sbQX1qDhACAAUFBQUFBQUFAQUCBQUCBQsgAC0AEEEFRw0EIAAoAgQgARDJBiEFDAMLIAIgATYCHCACQQA2AhQgACgCBCEGIAAoAhQhByAAKAIQIQggACgCCCEJIAIgACgCDCIFNgIAIAkgBUECdCIKaiELIAIgAjYCGCAJIQMgCSEMAkAgBUUNAEEBIQMgCSEMIAkhBQNAIAUoAgAhBAJAAkAgAyACKAIARg0AIAQgARDJBiIERQ0BCyAMIAQ2AgAgDEEEaiEMCyAFQQRqIQUgAiADNgIUIANBAWohAyAKQXxqIgoNAAsgCyEDCyACQQQ2AgQgAkEANgIMQQBBBBD0IyACQQQ2AhAgAkEENgIIIAwgCWshCgJAIAsgA0YNACALIANrQQJ2IQUDQCADKAIAIgQQ5wEgBEHAAEEIENwUIANBBGohAyAFQX9qIgUNAAsLIApBAnYhAyACQQRqEPUXAkACQCAKQQhJDQBBwAAQigEiBUUNAyAFIAc2AhQgBSAINgIQIAUgAzYCDCAFIAk2AgggBSAGNgIEIAVBGTYCAAwBCwJAAkAgDCAJRw0AQQAhBQwBCyAJKAIAIQVBACEDCyAJIAMQ6h0gBiAJEPQjCyAAKAIAIgNBdGohBAwCC0EAIQUgAS0AAA0BIAFBAToAAAwCC0EIQcAAEKIkAAsCQAJAIARBByADQQtLG0F8ag4KAQAAAAAAAAAAAQALIAAQ5wELIABBwABBCBDcFCAFIQALIAJBIGokACAAC8kEAgV/AX4jAEEQayIGJAAgBkEIaiABIAIgBUGBwAEgBRCFGwJAAkAgBi0ACEEFRg0AIAAgBikDCDcCAAwBCwJAAkAgBUUNAAJAAkAgAS0AXQ0AIAZBCGogARC6FCAGLQAIQQRGDQAgBikDCCILQv8Bg0IEUg0BCyAGQQA6AAYgBkEAOgAHIAUhB0EAIQgDQAJAAkACQAJAIAdFDQAgBEEIaigCACEJIAZBCGogASADQYHAASAIIAogBkEHaiAGQQZqEI0GAkAgBi0ACEEERg0AIAYpAwgiC0L/AYNCBFINAwsgBkEIaiAEIAEQ9wgCQCAGLQAIQQRGDQAgBikDCCILQv8Bg0IEUg0DCyAGLQAGDQEgBkEBOgAGDAMLIAZBCGogASACIANBgcABIAggChDwAiAGLQAIQQRGDQYgBikDCCILQv8Bg0IEUg0BDAYLIAEoAlRFDQEgBkEIaiABIAlBABCwBCAGLQAIQQRGDQEgBikDCCILQv8Bg0IEUQ0BCyAAIAs3AgAMBQsCQCAGLQAHRQ0AIAEgASgCOEF/ajYCOCAGQQA6AAcLIAdBf2ohByAEQQxqIQRBASEIIAkhCgwACwsgACALNwIADAILIAEtAF0NACAGQQhqIAEQuhQgBi0ACEEERg0AIAYpAwgiC0L/AYNCBFENACAAIAs3AgAMAQsgBkEIaiABIAMgBUVBgcABEMsSAkAgBi0ACEEERg0AIAYpAwgiC0L/AYNCBFENACAAIAs3AgAMAQsgAEEEOgAACyAGQRBqJAALvgQCA38FfiMAQZABayIDJAACQCACQoCAgICAgICAwABaDQAgACACQgGGWg0AAkACQCACIAJCf3wiBoNQDQAgAiACeaciBEF+aiIFrSIHhiIIQoCAgICAgICAIFgNAiAIQoCAgICAgICAwABaDQIgACAIQgGGIglaDQIgA0GAAWpCAEKAgICAgICAgIB/IAl9IgIgCUIAEPYcIANB8ABqIAMpA4ABIgYgAykDiAEiCiAJQgAQ6hEgA0HgAGogBiAKQgGEIABCAYZCABDqESACIAMpA3h9IAMpA3AiAkIAUq19IQZCACACfSEKIAMpA2ghAiADKQNgIQACQCAFIAFqIgVBPk0NAAJAIAEgBGpBv39qIgFBP25BAXENACADQdAAaiAKIAYgAkIAEOoRIAVBQWohBSADKQNYIABCAYh8IQIgAykDUCEACyABQT9JDQADQCADQcAAaiAKIAYgAkIAEOoRIANBMGogCiAGIABCAYggAykDSHxCABDqESADKQM4IAMpA0BCAYh8IQIgAykDMCEAIAVBgn9qIgVBPksNAAsLIANBIGogACACIAUQxRYgA0EQaiAKIAYgAiAFQT9zrYhCABDqESADIAMpAxggAykDKEL///////////8Ag3wgAykDECICIAMpAyBCfoN8IAJUrXxCAnxCACAJQgAQ6hEgAykDCCICQgAgCCAIIAJWG30gB4ghAgwBC0IAIQIgAUHAAE8NACAGIAAgAa2GgyECCyADQZABaiQAIAIPCwALjgQBCH8gASAAIABBA2pBfHEiAmsiA2oiBEEDcSEFQQAhAUEAIQYCQCAAIAJGDQBBACEGA0AgBiAALAAAQb9/SmohBiAAQQFqIQAgA0EBaiIDDQALCwJAIAVFDQAgAiAEQfz///8HcWohAEEAIQEDQCABIAAsAABBv39KaiEBIABBAWohACAFQX9qIgUNAAsLIARBAnYhAyABIAZqIQcCQANAIAIhBiADRQ0BIANBwAEgA0HAAUkbIgRBA3EhCAJAAkAgBEECdCIJQfAHcSIADQBBACEBDAELIAYgAGohAkEAIQEgBiEAA0AgAEEMaigCACIFQX9zQQd2IAVBBnZyQYGChAhxIABBCGooAgAiBUF/c0EHdiAFQQZ2ckGBgoQIcSAAQQRqKAIAIgVBf3NBB3YgBUEGdnJBgYKECHEgACgCACIFQX9zQQd2IAVBBnZyQYGChAhxIAFqampqIQEgAEEQaiIAIAJHDQALCyADIARrIQMgBiAJaiECIAFBCHZB/4H8B3EgAUH/gfwHcWpBgYAEbEEQdiAHaiEHIAhFDQALIAhBAnQhBSAGIARB/AFxQQJ0aiEAQQAhAQNAIAAoAgAiAkF/c0EHdiACQQZ2ckGBgoQIcSABaiEBIABBBGohACAFQXxqIgUNAAsgAUEIdkH/gfwHcSABQf+B/AdxakGBgARsQRB2IAdqIQcLIAcLwAQBCH8jAEEQayIEJAACQAJAAkAgA0EBcQ0AIAItAAAiBQ0BQQAhBQwCCyAAIAIgA0EBdiABKAIMEQwAIQUMAQsgASgCDCEGQQAhBwNAIAJBAWohCAJAAkACQAJAAkAgBcBBf0oNACAFQf8BcSIJQYABRg0BIAlBwAFHDQMgBCABNgIEIAQgADYCACAEQqCAgIAGNwIIIAMgB0EDdGoiBSgCACAEIAUoAgQRCABFDQJBASEFDAYLAkAgACAIIAVB/wFxIgUgBhEMAA0AIAggBWohAgwEC0EBIQUMBQsCQCAAIAJBA2oiBSACLwABIgIgBhEMAA0AIAUgAmohAgwDC0EBIQUMBAsgB0EBaiEHIAghAgwBC0GggICABiEKAkAgBUEBcUUNACACQQVqIQggAigAASEKC0EAIQkCQAJAIAVBAnENAEEAIQsgCCECDAELIAhBAmohAiAILwAAIQsLAkACQCAFQQRxDQAgAiEIDAELIAJBAmohCCACLwAAIQkLAkACQCAFQQhxDQAgCCECDAELIAhBAmohAiAILwAAIQcLAkAgBUEQcUUNACADIAtB//8DcUEDdGovAQQhCwsCQCAFQSBxRQ0AIAMgCUH//wNxQQN0ai8BBCEJCyAEIAk7AQ4gBCALOwEMIAQgCjYCCCAEIAE2AgQgBCAANgIAAkAgAyAHQQN0aiIFKAIAIAQgBSgCBBEIAEUNAEEBIQUMAwsgB0EBaiEHCyACLQAAIgUNAAtBACEFCyAEQRBqJAAgBQuzBAIJfwR+AkAgACgCACICRQ0AIAFBP3EiA0EBdCIBLwHcmoIBIgRB/w9xIgUgAS8B3pqCAUH/D3FrIQZBACACayEHIABBCGohCCAEQQt2IQRB5HUhAQJAAkACQANAIAYgAWpB5HVGDQMgBSABaiIJRQ0DIAcgAWpB5HVGDQEgAUHke0YNAiAIIAFqIQogAUEBaiEBIApBnApqLQAAIgogCUH6pYIBai0AACIJQf8BcUYNAAsgBCAKIAlB/wFxSWshBAwCCyAEQX9qIQQMAQtBgAZBgAZB/KWCARD+FgALIABBB2oiCSAEaiEKIAOtIQtCACEMA0AgAiIBQX9qIQICQAJAAkAgAUGBBk8NACAJIAFqMQAAIAuGIAx8Ig0gDUIKgCIMQnZ+fCEOIAIgBGpBgAZJDQEgDlANAiAAQQE6AIgGDAILIAJBgAZB7ISCARD+FgALIAogAWogDjwAAAsgAg0ACwJAIA1CClQNACAEQQdqIQIDQCAMIg0gDUIKgCIMQnZ+fCEOAkACQCACQXhqQYAGSQ0AIA5QDQEgAEEBOgCIBgwBCyAAIAJqIA48AAALIAJBf2ohAiANQgpaDQALCyAAIAAoAgQgBGo2AgQgACAAKAIAIARqIgFBgAYgAUGABkkbIgI2AgAgAUUNAANAIAJBf2ohAQJAAkAgAkGABksNACAAIAJqQQdqLQAARQ0BDAMLIAFBgAZB3ISCARD+FgALIAAgATYCACABIQIgAQ0ACwsL0wQCCH8BfkErQYCAxAAgACgCCCIGQYCAgAFxIgcbIQggB0EVdkEBIAEbIAVqIQkCQAJAIAZBgICABHENAEEAIQIMAQtBACEKAkAgA0UNACACIQcgAyELA0AgCiAHLAAAQb9/SmohCiAHQQFqIQcgC0F/aiILDQALCyAKIAlqIQkLIAhBLSABGyEMAkACQCAJIAAvAQwiCE8NAAJAAkACQCAGQYCAgAhxDQAgCCAJayENQQAhB0EAIQgCQAJAAkAgBkEddkEDcQ4EAgABAAILIA0hCAwBCyANQf7/A3FBAXYhCAsgBkH///8AcSEBIAAoAgQhCSAAKAIAIQsDQCAHQf//A3EgCEH//wNxTw0CQQEhCiAHQQFqIQcgCyABIAkoAhARCABFDQAMBQsLIAAgACkCCCIOp0GAgID/eXFBsICAgAJyNgIIQQEhCiAAKAIAIgsgACgCBCIBIAwgAiADEL8cDQNBACEHIAggCWtB//8DcSEJA0AgB0H//wNxIAlPDQJBASEKIAdBAWohByALQTAgASgCEBEIAEUNAAwECwtBASEKIAsgCSAMIAIgAxC/HA0CIAsgBCAFIAkoAgwRDAANAiANIAhrQf//A3EhAEEAIQcDQAJAIAdB//8DcSAASQ0AQQAPC0EBIQogB0EBaiEHIAsgASAJKAIQEQgARQ0ADAMLC0EBIQogCyAEIAUgASgCDBEMAA0BIAAgDjcCCEEADwtBASEKIAAoAgAiByAAKAIEIgsgDCACIAMQvxwNACAHIAQgBSALKAIMEQwAIQoLIAoLrwQBCn8CQAJAIAAoAhQgACgCBCAAKAIYIgIgACgCCCIDIAIgA0kbELoYIgQgAiADayAEGyICRQ0AIAJBH3YhBQwBCyAALQAcIAAtAAxJIQULAkACQCAAKAI0IAAoAiQgACgCOCICIAAoAigiAyACIANJGxC6GCIEIAIgA2sgBBsiAkUNACACQR92IQQMAQsgAC0APCAALQAsSSEECyAAQSBBMCAEG2ohAyAAIAVBAXNBBHRqIQICQAJAIABBMEEgIAQbaiIEKAIEIAAgBUEEdGoiACgCBCAEKAIIIgUgACgCCCIGIAUgBkkbELoYIgcgBSAGayAHGyIFRQ0AIAVBH3YhBwwBCyAELQAMIAAtAAxJIQcLAkACQCADKAIEIAIoAgQgAygCCCIFIAIoAggiBiAFIAZJGxC6GCIIIAUgBmsgCBsiBUUNACAFQR92IQgMAQsgAy0ADCACLQAMSSEICwJAAkAgAyACIAQgBxsgCBsiBSgCBCAAIAQgAiAIGyAHGyIGKAIEIAUoAggiCSAGKAIIIgogCSAKSRsQuhgiCyAJIAprIAsbIglFDQAgCUEfdiEJDAELIAUtAAwgBi0ADEkhCQsgASAEIAAgBxsiACkCCDcCCCABIAApAgA3AgAgASAFIAYgCRsiACkCCDcCGCABIAApAgA3AhAgASAGIAUgCRsiACkCCDcCKCABIAApAgA3AiAgASACIAMgCBsiACkCADcCMCABIAApAgg3AjgL0AQCBX8BfgJAIAAtABRBAkYNACAAKQMAIgZCA4NCAFINACAGpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEPAeCyAAKAIYIgNBBGooAgAhAAJAIAMoAggiAUUNAANAIAAQ6wcgAEHAAGohACABQX9qIgENAAsgA0EEaigCACEACyADKAIAIABBCEHAABDVEyADQRBqKAIAIQACQCADKAIUIgFFDQADQCAAKAIAIgIQnAEgAkHAAEEIENwUIABBDGohACABQX9qIgENAAsgA0EQaigCACEACyADKAIMIABBBEEMENUTAkAgAygCGCICQYCAgIB4Rg0AIANBHGooAgAhAAJAIAMoAiAiAUUNAANAIAAQigMgAEEwaiEAIAFBf2oiAQ0ACyADQRxqKAIAIQAgAygCGCECCyACIABBCEEwENUTCwJAIAMoAjwiBEUNACAEQQRqKAIAIQACQCAEKAIIIgJFDQAgAEEkaiEAA0ACQCAAQWRqKQMAIgZCA4NCAFINACAGpyIBIAEoAgAiBUF/ajYCACAFQQFHDQAgASABKAIQEPAeCwJAIABBfGooAgAiAUUNACABEN8CIAFB4ABBCBDcFAsCQCAAKAIAIgFFDQAgARDfAiABQeAAQQgQ3BQLIABBMGohACACQX9qIgINAAsgBEEEaigCACEACyAEKAIAIABBCEEwENUTIAMoAjxBFEEEENwUCwJAIAMoAkAiAEUNACAAKAIAIgEQ3wIgAUHgAEEIENwUIABBDEEEENwUCyADQcgAQQQQ3BQL0gQBB38jAEEQayICJAACQAJAAkAgACgCACIDLQBsIgRBfWpBASAEQQJLG0H/AXEOAwABAgALIANBADYCUAwBCyADQcAAaiEAAkAgBEECRw0AA0AgACgCGCIALQAsQQJGDQALCyAAQQA2AigLAkAgA0GEAWooAgAiAEUNACADQYABaigCACIFIABB2ABsaiEGA0ACQAJAIAUoAgAiAEEFRw0AIAUoAgQgARClAQwBCwJAAkACQCAADgUDAAECAwMLIAUoAgRBAUcNAiAFKAIIIAEQpQEMAgsgBUEEaiABENIGDAELIAVBDGooAgAiAEUNACAFQQhqKAIAIgcgAEEobGohCANAAkACQAJAAkACQCAHKAIADgUEAAECAwQLIAcoAgRBAUcNAyAHKAIIIAEQpQEMAwsgBygCBCABEKUBDAILIAEgBygCBBDxBAwBCyAHQQxqKAIAIgBFDQAgAEEobCEEIAdBCGooAgAhAANAIAAgARCKBCAAQShqIQAgBEFYaiIEDQALCyAHQShqIgcgCEcNAAsLIAVB2ABqIgUgBkcNAAsLIANBlAFqKAIAIQAgA0GYAWooAgAhBCACIAE2AgwCQCAERQ0AIARBKGwhBANAIAJBDGogABCbByAAQShqIQAgBEFYaiIEDQALCwJAIAMtADwiBEEGRg0AAkACQCAEQX1qQQEgBEECSxtB/wFxDgMAAQIACyADQQA2AiAMAQsgA0EQaiEAAkAgBEECRw0AA0AgACgCGCIALQAsQQJGDQALCyAAQQA2AigLIAJBEGokAAu4BAIHfwR+IAIgAxCmGyENAkAgASgCCA0AIAFBASABQRBqELsCGgsgDUIZiCIOQoGChIiQoMCAAX4hDyABKAIEIgYgDadxIQcgASgCACEIQQAhCUEAIQoDQAJAAkACQAJAIAggB2opAAAiECAPhSINQn+FIA1C//379+/fv/9+fINCgIGChIiQoMCAf4MiDVANAANAIAIgAyAIIA16p0EDdiAHaiAGcUEFdGsiC0FgaikDACALQWhqKAIAEPwSDQIgDUJ/fCANgyINUEUNAAsLIBBCgIGChIiQoMCAf4MhDQJAIAlBAUYNACANUA0CIA16p0EDdiAHaiAGcSEMCwJAIA0gEEIBhoNCAFINAEEBIQkMAwsCQCAIIAxqLAAAIgdBAEgNACAIIAgpAwBCgIGChIiQoMCAf4N6p0EDdiIMai0AACEHCyAIIAxqIA6nIgs6AAAgCCAGIAxBeGpxakEIaiALOgAAIABCADcDACABIAEoAgggB0EBcWs2AgggASABKAIMQQFqNgIMIAggDEEFdGsiAUFgaiACNwMAIAFBaGogAzYCACABQXBqIAQ3AwAgAUF4aiAFNgIADwsgC0F4aiIBKAIAIQggASAFNgIAIAtBcGoiASkDACENIAEgBDcDACAAIAg2AgggACANNwMAAkAgAkIDg0IAUg0AIAKnIgEgASgCACIIQX9qNgIAIAhBAUcNACABIAEoAhAQ8B4LDwtBACEJCyAKQQhqIgogB2ogBnEhBwwACwuMBQEBfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgAoAgAOEgEREQIDBAUGBwgJCgsMDQ4PEAALIABBBGoQuiIMEAsgAEEEahCpIQwPCyAAQQRqELoiIABBCGoQ1AYMDgsgAEEMahDjIgwNCyAAKQMQEJwhIABBKGoQ1AYMDAsgACkDECAALQAkENMhDAsLIAApAxAgAC0AJBDTIQwKCyAAQQRqELAhDAkLIABBEGoQuiIgAEEEahCsIQwICyAAQQRqELoiDAcLIAAoAgQiAUHIAGoQqSEgARDJICABQeAAahC+IiABQYABQQgQ3BQMBgsgAEEEahC6IiAAQQhqENQGDAULIABBBGoQuiIgAEEIahDUBgwECyAAQQRqELUeIABBGGoQ4yIgAEEcahDjIiAAQQxqENQGDAMLIABBBGoQth4gAEEMahC6IiAAQRBqENQGDAILIABBBGoQth4gAEEMahC6IiAAQRBqENQGDAELAkACQAJAAkACQAJAAkACQCAAKAIIDggBAgMEBQYHAAELIAAoAgwiARD9HwJAIAEtAEVBA0YNACABQSBqELceCyABQdgAQQgQ3BQMBwsgACkDEBCcISAAQShqELsiDAYLIAApAxAQnCEgACgCKBCcHgwFCyAAKAIMELAjDAQLIAAoAgwQryMMAwsgACgCDCIBKQMIEJwhIAEoAiAQoyMgAUE4ahCoISABQSRqEJ8hIAFByABBCBDcFAwCCyAAKAIMIgEpAwgQnCEgASgCIBCjIyABQSRqEPIHIAFBMEEIENwUDAELIAAoAgwiASkDABCcISABQSBqEOkiIAFBMEEIENwUCyAAQTBBCBDcFAu+BAEFfwJAIAEoAggiAkUNACABKAIEIgMgAkEobGohBANAAkACQAJAAkACQAJAAkAgAygCAA4FBgABAwQGCyADKAIEQQFHDQUgAC0AJSEFIAMoAgghASAALQAkIgINBCABKAIAIgJBdGpBByACQQtLG0F7aiIGQR9LDQFBACECQQEgBnRBrqKAgHhxDQQgBg0BIAEtABENAQwECyAALQAlIQUgAygCBCEBIAAtACQiAg0DIAEoAgAiAkF0akEHIAJBC0sbQXtqIgZBH0sNAEEAIQJBASAGdEGuooCAeHENAyAGDQAgAS0AEUUNAwsgAEEDOgAkQQAhAgwCCwJAIAMoAgQiBS0AbEECRw0AIAVBwABqIQEDQCABKAIYIgEtACxBAkYNAAsLAkAgBUGEAWooAgAiAUUNACABQdgAbCECIAVBgAFqKAIAIQEDQCABIAAQhgcgAUHYAGohASACQah/aiICDQALCwJAIAVBmAFqKAIAIgFFDQAgAUEobCECIAVBlAFqKAIAIQEDQCAAIAEQ9AIgAUEoaiEBIAJBWGoiAg0ACwsgBS0APCIBQQZGDQIgAUECRw0CIAVBEGohAQNAIAEoAhgiAS0ALEECRg0ADAMLCyADQQxqKAIAIgFFDQEgAUEobCECIANBCGooAgAhAQNAIAEgABCuAiABQShqIQEgAkFYaiICDQAMAgsLIAAgARDlASABIAAQVSAAIAU6ACUgACACOgAkIAAgARC4AQsgA0EoaiIDIARHDQALCwvLBAEEfwJAAkACQAJAIAAoAgAOBAMAAQIDCyAAKAIEQQFHDQIgACgCCCABEL0BDwsgACgCBCICQcAAaiABEJoTAkAgAkGEAWooAgAiA0UNACACQYABaigCACIAIANB2ABsaiEEA0ACQAJAIAAoAgAiA0EFRw0AIAAoAgQgARC9AQwBCyADQQRGDQACQAJAAkAgAw4EAwABAgMLIAAoAgRBAUcNAiAAKAIIIAEQvQEMAgsgASAAKAIEELwJDAELIABBDGooAgAiA0UNACADQShsIQUgAEEIaigCACEDA0AgAyABEOMHIANBKGohAyAFQVhqIgUNAAsLIABB2ABqIgAgBEcNAAsLAkAgAigCeCIARQ0AIABBCGooAgAiA0UNACADQQJ0IQMgAEEEaigCACEAA0AgACgCACABEJoCIABBBGohACADQXxqIgMNAAsLAkAgAkGYAWooAgAiAEUNACAAQShsIQMgAkGUAWooAgAhAANAIAAgARDjByAAQShqIQAgA0FYaiIDDQALCyACLQA8QQZGDQEgAkEQaiABEJoTDwsgACgCDCIDRQ0AIAAoAggiBSADQShsaiEEA0ACQAJAAkACQAJAIAUoAgAOBQQAAQIDBAsgBSgCBEEBRw0DIAUoAgggARC9AQwDCyAFKAIEIAEQvQEMAgsgASAFKAIEELwJDAELIAVBDGooAgAiAEUNACAAQShsIQMgBUEIaigCACEAA0AgASAAEMkFIABBKGohACADQVhqIgMNAAsLIAVBKGoiBSAERw0ACwsL8wQBBn8jAEHAAGsiByQAIAEoAsABIQggARDoEQJAIAEtAMgBIglBD0cNACABEOgRCwJAAkACQAJAIAUNACABIAEoAngiCkH//+9vcTYCeCAHQShqIAEgBkEAEOkGIAEgCjYCeCAHKAIoIQYgBy0APCILQQNGDQEgByAHKQMwNwMYIAcgBygCODYCICAHIAcvAD07ARQgByAHLQA/OgAWDAILIAEgASgCeCIKQf/8729xQYACQQAgCUEPRhtyIAJBB3RyNgJ4IAdBKGogASAGQQAQ6QYgASAKNgJ4IAcoAighBiAHLQA8IgtBA0YNACAHIAcpAzA3AxggByAHKAI4NgIgIAcgBy8APTsBFCAHIActAD86ABYMAQsgAEEDOgAUIAAgBjYCACAEEKIhDAELIAcoAiwhDCABIApB///rb3E2AnggB0EIaiABIAQgAyAIIAJBAXEbIAIgCUEPRhC7CyAHKAIMIQICQAJAAkACQCAHKAIIQQFHDQAgAEEDOgAUIAAgAjYCAAwBCyAFRQ0BIAIoAhhBgICAgHhHDQEgB0EoakEEciABLQDIARDZJSAHQQE2AjwgB0Gv65oBNgI4IAdBsICAgHg2AiggASgCwAEgASgCxAEg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KAIIIQEgAygCACIGKAIAIgBBARCfHyAAKAIEIAAoAggiA2pB2wA6AAAgACADQQFqNgIIIAFFDQEgAUECdCEFQQEhAANAAkAgAEEBcQ0AIAYoAgAiAEEBEJ8fIAAoAgQgACgCCCIDakEsOgAAIAAgA0EBajYCCAsgAiACQQhqIAQoAgAQ0AsgAigCACEHIAYoAgAiAyACKAIEIgAQnx8gAygCCCEBAkAgAEUNACAARQ0AIAMoAgQgAWogByAA/AoAAAsgBEEEaiEEIAMgASAAajYCCEEAIQAgBUF8aiIFDQALIAYoAgAiAEEBEJ8fIAAoAgQgACgCCCIDakHdADoAACAAIANBAWo2AggMAgtBqPOaAUEoQazcmgEQuSEACyAGKAIAIgBBARCfHyAAKAIEIAAoAggiA2pB3QA6AAAgACADQQFqNgIIC0EAIQALIAJBMGokACAAC+QEAgd/A34jAEEwayIDJAACQAJAAkACQAJAAkACQCAAKALkCkEDRg0AAkAgAigCAA0AIAAoAogLIgQoArACIAQoArQCRw0BCyABKALYBEGAgICAeEYNASADQRRqIABB5ApqIAFB2ARqIAJBBEEAEOIIIAMoAhQiAkECRw0GIAMgAygCGDYCDEHw/ZoBQSsgA0EMakHc2IQBQYT+hAEQ3RQACwJAIAAoAsgKIgRBAkYNACACKAIMIQUCQCACLQAYQQFHDQAgBUGAAUsNAQsgACgC4AooAtACIgZFDQJBACACKAIUIgcgAigCECIIayIJIAkgB0sbQX8gACgCzApBA3RBgICAASAEQQFxGyIEQQV2IARBGHFBAEdqIgRBBXQgBEH///8/SxsgBm4iBCAEQQBHa0sNACABKALUBUGAgICAeEYNAyACKQIAIQogAigCCCECIANBAToALCADIAc2AiggAyAINgIkIAMgBTYCICADIAI2AhwgAyAKNwIUIANBDGogAEHICmogAUHUBWogA0EUakEEQQAQpAcgAygCDCICQQJGDQQMBgsgASgC6ARBgICAgHhGDQQgAikCACEKIAIpAgghCyACKQIQIQwgA0EBOgAsIAMgDDcCJCADIAs3AhwgAyAKNwIUIAMgAEGwCmogAUHoBGogA0EUakEEQQAQ7QggAygCACECDAULQfT9hAEQxCMAC0GQ6YQBENYjAAtB0OuEARDEIwALIAMg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UWpB/wFxQQ1JDQAgBEFzakH/AXFBCUsNAQsgASgCtAEhBCABKAKwASEFIAJBjIGAgHg2AgggASAFIAQgAkEIahDuHSADKAIEIQUgAygCACEGAkBBwAAQigEiBEUNACAEIAU2AgggBCAGNgIEIARBMTYCACADQQhqEOYDIANBIEEIENwUDAMLQQhBwAAQoiQAC0EBIQUgAyEEDAILIAEpAwghByABQQo2AgggAiABKQMQNwMQIAIgBzcDCAJAAkAgB6ciBEEKRg0AIARBCUYNASACQQhqEMALC0Go85oBQShB+IebARC5IQALIAIoAgwhBAJAAkAgASgCiAEiBUELRw0AIAJBCGogARDEAQwBCyABQQs2AogBIAEgBTYCCCABIAEpAowBNwIMIAEgASgClAE2AhQgAiABKQKYATcDCCACIAEoAqABNgIQCyABIAIoAhA2ArgBIAEgASkDsAE3A6gBIAEgAikDCDcCsAEgA0EIahDmAyADQSBBCBDcFEEBIQUMAQsCQCAEKAIAQR5GDQBBACEDA0AgAkEIaiABIAQgAxDMASACKAIIIQQCQCACLQAMIgVBAkcNAEEBIQUMAwsgAi0ADSEDIAVBAXENAAsLQQAhBQsgACAENgIEIAAgBTYCACACQSBqJAALtwQBBH9BBCECAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRFDQNBCCECCyAAIAEgAmooAgAQ5AwPCwJAIAEoAgQiAy0AbEECRw0AIANBwABqIQEDQCABKAIYIgEtACxBAkYNAAsLAkAgA0GEAWooAgAiAUUNACABQdgAbCECIANBgAFqKAIAIQEDQCABIAAQ5AQgAUHYAGohASACQah/aiICDQALCwJAIANBmAFqKAIAIgFFDQAgA0GUAWooAgAiBCABQShsaiEFA0ACQAJAAkACQAJAIAQoAgAOBQQAAQIDBAsgBCgCBEEBRw0DIAAgBCgCCBDkDAwDCyAAIAQoAgQQ5AwMAgsgBEEEaiAAEIYLDAELIARBDGooAgAiAUUNACABQShsIQIgBEEIaigCACEBA0AgASAAEIgGIAFBKGohASACQVhqIgINAAsLIARBKGoiBCAFRw0ACwsgAy0APCIBQQZGDQEgAUECRw0BIANBEGohAQNAIAEoAhgiAS0ALEECRg0ADAILCyABKAIMIgJFDQAg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DQALCyALQcAAaiEDIApBAWohCCACIAsQjwMgBiAKQQZ0aiIBIA42AjggASAQNgI0IAEgDzYCMCABIAw2AiwgASANNgIoIAEgAikDIDcDICABIAIpAxg3AxggASACKQMQNwMQIAEgAikDCDcDCCABIAIpAwA3AwAgCUF/aiIJDQALCyAAIAQ2AgggACAGNgIEIAAgBTYCACACQcAAaiQADwsgBSACKAIIEP4gAAsgDyACKAIIEP4gAAtBCEHAABCiJAALugQBA38CQAJAAkAgASgCAA4DAAECAAsgAC0AJSECIAAtACQhAwJAIAEoAghBA0cNACAAQQM6ACQgACABKAIMIgQQ5QEgBCAAEFUgACACOgAlIABBAzoAJCAAIAQQuAEgACACOgAlIABBAjoAJCAEKAIAQRlHDQAgACAEEM4BCyAAIAI6ACUgACADOgAkIAEoAiggABCuBQ8LIAAtACQhBCAAQQI6ACQgAC0AJiEDIABBADoAJiAALQAlIQICQCABKAIwIgFFDQAgACABEOUBIAEgABBVIAAgAjoAJSAAQQI6ACQgACABELgBCyAAIAI6ACUgACAEOgAkIAAgAzoAJg8LAkACQAJAAkACQAJAIAEoAgQiASgCAA4HBQABAgMFBAULIAFBDGooAgAiAkUNBCACQShsIQIgAUEIaigCACEBA0ACQCABKAIAQQdGDQAgASAAEK4FCyABQShqIQEgAkFYaiICDQAMBQsLIAEoAgQgABCuBQ8LIAFBDGooAgAiAkUNAiACQThsIQIgAUEIaigCACEBA0AgACABEIIHIAFBOGohASACQUhqIgINAAwDCwsgACABQQRqEPIODwsgAC0AJSECIAEoAgQhAQJAIAAtACQiBA0AAkAgASgCACIDQXRqQQcgA0ELSxtBe2oiA0EfSw0AQQEgA3RBrqKAgHhxDQEgAw0AIAEtABFFDQELIABBAzoAJAsgACABEOUBIAEgABBVIAAgAjoAJSAAIAQ6ACQgACABELgBCwvABAEGfwJAAkACQAJAIAEoAgAOAwABAwALIAEoAgwiAkUNASACQShsIQMgASgCCCECA0ACQCACKAIAQQdGDQAgAiAAEM0EIAAgAhD+CAsgAkEoaiECIANBWGoiAw0ADAILCyABKAIMIgJFDQAgAkE4bCEEIAEoAgghBUEAIQMDQAJAAkAC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ASkCCDcCBCACIAEpAhA3AgwgAiABKQIYNwIUIAEpAyghBiABKAIkIQUgASgCICEEQQEhAwwLCyACIAEpAgg3AgQgAiABKQIQNwIMIAIgASkCGDcCFCABKQMoIQYgASgCJCEFIAEoAiAhBEECIQMMCgsgAiABKQIYNwIUIAIgASkCEDcCDCACIAEpAgg3AgRBACEDQQAhBAwICyACIAEoAgw2AgggAiABKQIENwMAQQMhAwwGCyACIAEpAgw3AwggAiABKQIENwMAQQghAwwFCyACIAEoAgw2AgggAiABKQIENwMADAQLIAIgASkCDDcDCCACIAEpAgQ3AwBBBSEDDAMLIAIgASkCDDcDCCACIAEpAgQ3AwBBCSEDDAILIAIgASkCDDcDCCACIAEpAgQ3AwBBBiEDDAELIAIgASkCDDcDCCACIAEpAgQ3AwBBBCEDCwsLIAAgAzYCACAAIAIpAwA3AgQgACACKQMINwIMIAAgAikDEDcCFCAAIAIoAhg2AhwgACAGNwMoIAAgBTYCJCAAIAQ2AiAgAUHAAEEIENwUCyACQSBqJAALvQMCBH8FfiMAQSBrIgMkACAAQf8PNgIIIABCADcDAEEAIQQCQAJAIAFCqn1TDQAgAlANACABQrQCVQ0BIANBEGogAaciBUEEdCIEQYDRggFqKQMAQgAgAiACeSIHhiIIQgAQ6hEgAykDECEJAkAgAykDGCICQv8Dg0L/A1INACADIARBoKaCAWpB6CpqKQMAQgAgCEIAEOoRIAMpAwgiCCAJfCIJIAhUrSACfCECCwJAIAFCG3xC0wBUDQBBfyEEIAlCf1ENAQsgAiACQj+IIgpCCXwiC4ghCAJAAkAgBUHqpA1sQRB1IAenayAKp2pBP2oiBUGCeEgNAEGACEH/ByAIQvz/////////AIMgCCAIIAuGIAJRGyAIIAhCA4NCAVEbIAggCUICVBsgCCABQgR8QhxUGyIBQgGDIAF8IgFC/////////x9WIgYbIAVqIgRB/g9LDQNCACABQgGIQv/////////3/wCDIAYbIQEMAQtBACEEIAVBw3dJDQEgCEGCeCAFa62IIgFCAYMgAXwiAUL/////////D1YhBCABQgGIIQELIAAgATcDAAsgACAENgIICyADQSBqJAALuAMBBn8jAEEgayICJAACQAJAAkACQAJAAkAgASgCCCIDRQ0AIAEoAgQiASADQTBsIgNqIQQDQCABKAIAQRFHDQIgAUEIaigCAEF/akEBSw0DIAEgABDeAiABQTBqIQEgA0FQaiIDDQALC0EEIQNBACEFDAMLIAFBMGohAwwBCyABQTBqIQMLIAJBFGpBBEEEQQQQhQ9BASEFIAIoAhghBiACKAIUQQFGDQEgAigCHCIHIAE2AgAgAkEBNgIQIAIgBzYCDCACIAY2AggCQCADIARGDQBBASEFA0AgAyEBAkADQCABKAIAQRFHDQEgAUEIaigCAEF/akEBSw0BIAEgABDeAiABQTBqIgMhASADIARHDQAMAwsLIAFBMGohAwJAIAUgAigCCEcNACACQQhqIAVBAUEEQQQQ2hogAigCDCEHCyAHIAVBAnRqIAE2AgAgAiAFQQFqIgU2AhAgAyAERw0ACwsgBUECdCEEIAIoAgwhAyACKAIIIQVBACEBA0AgAyABaigCACAAEN4CIAQgAUEEaiIBRw0ACwsgBSADQQRBBBDVEyACQSBqJAAPCyAGIAIoAhwQ/iAAC4YEAgN/A34jAEHwCmsiAyQAAkACQAJAIAEtAEUNAEIAIQZCAiEHDAELIANCADcD6AUgA0IANwPgBSADQYKEiBA2ALkGIANBADoAuAYgA0ECNgKwBiADQQI2AqgGIANBADYCoAYgA0EDOgCcBiADQQI6AL0GIANBAjoAjAUgAyADQeAFaiADQYAFahDCGCADQQA6AFkgA0GABWogA0HAAPwKAAAgA0KBgICAoAE3A9AFIANCgYCAgDA3A8gFIAMpA1ghBiADIAEoAgxBgICAASABKAIIGzYCxAUgAS0ASSEBIANBATYCwAUgA0EBIAEgAUECRhutQhCGIAZC//+DgICAQIOEQoCAgAiENwPYBSADQeAAaiIEEPILIANCADcDCCADQgA3AwAgA0GChIgQNgJYIANBAjYCUCADQQI2AkggA0EANgJAIANBAzoAPCADQYIEOwFcIAMgA0GABWoQxAYhASACIAIoAgAiBUEBajYCACAFQX9MDQEgA0HgBWogASACEKwCIAFBMGoQmxsgBBDvCUICIQcgA0HwBWohAQJAIAMpA+AFIghCAoUgAykD6AUiBoRCAFINAEIAIQYgAygC8AVBKUsNASABEMMYDAELIAMgAUGABfwKAAAgCCEHCyAAIAc3AwAgACAGNwMIIABBEGogA0GABfwKAAAgA0HwCmokAA8LAAvcAwEGfyMAQcAAayIHJAACQAJAAkAgASgCAA0AIAcgASgCBDYCDCAHQQA2AgggByABKAIUIgg2AhwgByABKAIMIgk2AhQgByABKAIIIgo2AhAgByABLQAYOgAgIAEoAhBBAWohASAIQQFqIQsCQAJAAkADQAJAAkAgBCAJSQ0AIAQgCUcNAQwHCyAKIARqLAAAQb9/Sg0GCyABRQ0BIAcgATYCJCAHIAg2AiggCCAJSw0CIAEgC0sNAiAHIAE2AhggB0EwaiAFIAYgB0EIahBSIAcoAjQhAgJAIAcoAjAiDEECRw0AIAAgAjYCBEECIQEMBAsgAUEBaiEBIAcoAjgiAyEEIAwNAAtBACEBDAILQdjXhAEQxCMACyAHIAk2AiwgB0EHNgI8IAdB+AA2AjQgByAHQSxqNgI4IAcgB0EkajYCMEHgh4ABIAdBMGpBmOSaARDrGwALIAAgATYCAAwCCwJAAkACQCAEIAEoAgwiCUkNACAEIAlGDQEMAgsgASgCCCAEaiwAAEG/f0wNAQsgACADNgIIIAAgAjYCBCAAQQE2AgAMAgsgACADNgIIIAAgAjYCBCAAQQA2AgAMAQsgACADNgIIIAAgAjYCBCAAQQE2AgALIAdBwABqJAAL5QMBBH8jAEEwayICJAAgASgCDCEDIAEoAgghBAJAAkACQAJAAkACQAJAIAEoAgBBAUcNACADQQFHDQUgBC0AACIBIAQtAAFHDQVBARCKASIDRQ0BIABBATYCCCAAIAM2AgQgAEEBNgIAIAMgAToAAAwGCyADQQFHDQMgBCgCACIBIAQoAgRHDQMgAkEANgIMIAFBgAFJDQEgAUE/cUGAf3IhAyABQQZ2IQQCQCABQYAQTw0AIAIgAzoADSACIARBwAFyOgAMQQIhAQwDCyABQQx2IQUgBEE/cUGAf3IhBAJAIAFB//8DSw0AIAIgAzoADiACIAQ6AA0gAiAFQeABcjoADEEDIQEMAwsgAiADOgAPIAIgBDoADiACIAVBP3FBgH9yOgANIAIgAUESdkFwcjoADEEEIQEMAgtBAUEBEKIkAAsgAiABOgAMQQEhAQsgAkEANgIYIAJCgICAgBA3AhAgAkHUxZcBNgIgIAJCoICAgAY3AiQgAiACQRBqNgIcAkAgAkEcaiACQQxqIAEQnQcNACAAIAIoAhg2AgggACACKQIQNwIADAMLQbmVmwFBNyACQS9qQezFlwFB8JWbARDdFAALIABBgICAgHg2AgAMAQsgAEGAgICAeDYCAAsgAkEwaiQAC8kDAgd/A34gAiADEKYbIgtCGYhCgYKEiJCgwIABfiEMIAEoAgQiBCALp3EhBSABKAIAIQZBACEHAkACQAJAA0ACQCAGIAVqKQAAIg0gDIUiC0J/hSALQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIgtQDQADQCACIAMgBiALeqdBA3YgBWogBHEiCEEFdGsiCUFgaiIKKQMAIAlBaGooAgAQ/BINAyALQn98IAuDIgtQRQ0ACwsgDSANQgGGg0KAgYKEiJCgwIB/g1BFDQIgBSAHQQhqIgdqIARxIQUMAAsLQYABIQUCQCAGIAhqIgMpAAAiAiACQgGGg0KAgYKEiJCgwIB/g3qnQQN2IAYgCEF4aiAEcWoiBikAACICIAJCAYaDQoCBgoSIkKDAgH+DeadBA3ZqQQdLDQAgASABKAIIQQFqNgIIQf8BIQULIAMgBToAACAGQQhqIAU6AAAgASABKAIMQX9qNgIMIAopAwAiAkIAUg0BCyAAQgA3AwAPCyAAIAlBeGooAgA2AgggACAJQXBqKQMANwMAAkAgAkIDg0IAUg0AIAKnIgEgASgCACIGQX9qNgIAIAZBAUcNACABIAEoAhAQ8B4LC/IDAQZ/IwBBMGsiAiQAIAEgASgCeCIDQYAgcjYCeCABEOgRIAJBCGogARCEBiACKAIIIQQgASADNgJ4IAIoAgwhBQJAIANBgCBxDQAgAS0AyAFB/gFxQRJHDQAgARC8DkH/AXFBpAFGDQACQAJAAkACQCABKAKYASIGQQtGDQAgASgCxAEgASgCqAFHDQQgASgCwAEhAyABQQs2ApgBIAIgBjYCECACIAEoArQBNgIsIAIgASkCrAE3AiQgAiABKQKkATcCHCACIAEpApwBNwIUAkACQCABLQDIAUFuag4CAQADC0E2IQYCQAJAAkACQAJAIAItACgiB0Ftag4FCQcHBwEACyAHQUxqDgMCBgEDC0E0IQYMBwtBNyEGDAYLQSUhBgwFCyAHQSVGDQMMAgsCQCACLQAoIgZBEkcNAEE1IQYMBAsCQCAGQTNGDQAgBkEXRw0CQTMhBgwEC0EkIQYMAwtBlIqbARDEIwALIAFBmAFqIgEQsyIgASACKQMoNwMYIAEgAikDIDcDECABIAIpAxg3AwggASACKQMQNwMADAILQSYhBgsgASAGOgDIASABIAMgAigCJCIGIAMgBksbNgLEASABIAMgBiADIAZJGzYCwAEgAkEQahC1IgsgACAENgIAIAAgBTYCBCACQTBqJAALvQMBBn8jAEEgayIFJAACQCACRQ0AIAEgAkECdGpBfGoiBkUNACAGKAIADQAgAkECdCEGIAFBfGohByACIQgDQCAIIQkCQCAGDQBBACECDAILIAlBf2ohCCAHIAZqIQogBkF8aiEGIAooAgBFDQALAkAgCSACSw0AIAkhAgwBC0EAIAkgAkGg54MBEJAKAAsCQCAERQ0AIAMgBEECdGpBfGoiBkUNACAGKAIADQAgBEECdCEGIANBfGohByAEIQgDQCAIIQkCQCAGDQBBACEEDAILIAlBf2ohCCAHIAZqIQogBkF8aiEGIAooAgBFDQALAkAgCSAESw0AIAkhBAwBC0EAIAkgBEGw54MBEJAKAAsCQAJAAkACQCABIAIgAyAEEMQcQf8BcQ4CAQIACyAFQRRqIAMgBBDcEyAFKAIYIAUoAhwgASACENQJIABBBGogBUEUahD0GyAAQQA6AAAMAgsgAEEBOgAAIABBACkCiJGbATcCBCAAQQAoApCRmwE2AgwMAQsgBUEIaiABIAIQ3BMgBSgCDCAFKAIQIAMgBBDUCSAAQQRqIAVBCGoQ9BsgAEECOgAACyAFQSBqJAAL2gMBCH8jAEHAAGsiBiQAAkACQAJAIAEoAgANACAGIAEoAgQ2AgwgBkEANgIIIAYgASgCFCIHNgIcIAYgASgCDCIINgIUIAYgASgCCCIJNgIQIAYgAS0AGDoAICABKAIQQQFqIQEgB0EBaiEKIAUoAgwhCyAFKAIIIQwgBSgCBCENIAUoAgAhBQJAAkADQAJAAkAgBCAISQ0AIAQgCEcNAQwGCyAJIARqLAAAQb9/Sg0FCyABRQ0BIAYgATYCJCAGIAc2AiggByAISw0CIAEgCksNAiAGIAE2AhggBkEwaiAFIA0gBkEIaiAMIAsQYCABQQFqIQEgBigCNCECIAYoAjgiAyEEIAYoAjANAAsgAEEANgIADAQLQdjXhAEQxCMACyAGIAg2AiwgBkEHNgI8IAZB+AA2AjQgBiAGQSxqNgI4IAYgBkEkajYCMEHgh4ABIAZBMGpBmOSaARDrGwALAkACQAJAIAQgASgCDCIISQ0AIAQgCEYNAQwCCyABKAIIIARqLAAAQb9/TA0BCyAAIAM2AgggACACNgIEIABBATYCAAwCCyAAIAM2AgggACACNgIEIABBADYCAAwBCyAAIAM2AgggACACNgIEIABBATYCAAsgBkHAAGokAAvUAwEGfyMAQSBrIgQkAAJAAkACQAJAAkAgAS0ArA1BAUYNAAJAAkACQCABKQMAQgKFIAEpAwiEUA0AIAIoAsgEQQJGDQQgAkHYAWohBQJAAkACQCABKAKABSIGLQDiAg0AIARBEGogASAFIAMQUiAEKAIQIgVBAkcNAQwICyAGLQDjAiEHIARBEGogASAFIAMQUiAEKAIQIgZBAkYNByAEKAIYIQggBCgCFCEJIAZBAUcNBCAHQQFxRQ0EIARBBGogAyAJIAggCCABIAUQgwggBCgCBCIGQQJHDQEgBCgCCCEFDAgLQQEhBiAFQQFGDQJBACEGDAMLIAQoAgwhCCAEKAIIIQkMAgsgBEEQaiABIAIgAxDLBQJAAkAgBCgCEA0AQQAhAQwBCyAAIAQpAhhCIIk3AgRBASEBCyAAIAE2AgAMBgsgBCgCGCEIIAQoAhQhCQsgACAINgIIIAAgCTYCBCAAIAY2AgAMBAtBqPOaAUEoQYCMhQEQuSEAC0G8gYUBEMQjAAsgBCgCFCEFCyAFEPAVGiAEQRBqIAEgAiADEMsFAkACQCAEKAIQDQBBACEBDAELIAAgBCkCGEIgiTcCBEEBIQELIAAgATYCAAsgBEEgaiQAC+cDAQR/IwBBMGsiBCQAIAEtALgBIQUCQAJAIAEoAogBIgZBC0cNACAEQRhqIAEQxAEMAQsgAUELNgKIASAEIAEpApgBNwMYIAQgASgCoAE2AiAgAUGMAWohBwJAIAEoAghBCkYNACABQQhqEMALCyABIAY2AgggASAHKQIANwIMIAEgBygCCDYCFAsgASAEKAIgNgK4ASABIAEpA7ABNwOoASABIAQpAxg3ArABAkACQAJAAkAgBUH/AXFBigFGDQACQCACQQFHDQAgAygCECEFIAMoAgwhBiAEQYOAgIB4NgIYIAEgBiAFIARBGGoQ7h0LIAEgASgCeCIFQcAAcjYCeCAEQRBqIAEQuAMgBCgCECEGIAEgBTYCeCAEKAIUIQUgBkEBcQ0BIAAgBTYCDCAAIAM2AgggACACNgIEIABBAzYCAAwDCyABIAEoAngiBkHAAHI2AngCQAJAIAEtALgBQT5HDQAgAS0AgQFBIHFFDQAgARD8BCIFRQ0AQQAhBwwBCyAEQQhqIAEQgQEgBCgCDCEFIAQoAgghBwsgASAGNgJ4IAdBAXFFDQELIABBBTYCACAAIAU2AgQgAiADEJETDAELIAAgBTYCDCAAIAM2AgggACACNgIEIABBBDYCAAsgBEEwaiQAC7UDAQt/IwBBEGsiAiQAAkAgACgCCCIDRQ0AAkACQCAAKAIEIgQoAgBFDQAgAyEFDAELIAJBCGogBEEIahCTFAJAIAIoAgxBBEYNACADIQUMAQsCQCACKAIIKAAAQfTQpZsHRg0AIAMhBQwBCyACQQBBASADEJYbIAIoAgQhBiAAIAIoAgAiBTYCCCADIAZrIQcCQAJAAkAgBkEGdCIIIAVBBnQiCUYNACAEIAhqIQogBCAJaiILIQggBiEJA0AgCEE0aiIMKAIAIAhBOGooAgAQ7B0gCEEwaigCACAMKAIAEP0jIAgQ4AsgCEHAAGohCCAFIAlBf2oiCUcNAAsgAyAGRg0CIAYgBUYNASAHQQZ0IghFDQEgCyAKIAj8CgAADAELIAMgBkYNAQsgACAHIAVqIgU2AggLIAVFDQELIAQgBUEGdGohBQNAAkAgBEE4aigCACIIRQ0AIAhBDGwhACAEQTRqKAIAIQgDQCABIAgoAgAQhgEgCEEMaiEIIABBdGoiAA0ACwsgBCABEKMFAkAgASgCAEUNACABIAQQ/QgLIARBwABqIgQgBUcNAAsLIAJBEGokAAu1AwELfyMAQRBrIgIkAAJAIAEoAggiA0UNAAJAAkAgASgCBCIEKAIARQ0AIAMhBQwBCyACQQhqIARBCGoQkxQCQCACKAIMQQRGDQAgAyEFDAELAkAgAigCCCgAAEH00KWbB0YNACADIQUMAQsgAkEAQQEgAxCWGyACKAIEIQYgASACKAIAIgU2AgggAyAGayEHAkACQAJAIAZBBnQiCCAFQQZ0IglGDQAgBCAIaiEKIAQgCWoiCyEIIAYhCQNAIAhBNGoiDCgCACAIQThqKAIAEOwdIAhBMGooAgAgDCgCABD9IyAIEOALIAhBwABqIQggBSAJQX9qIglHDQALIAMgBkYNAiAGIAVGDQEgB0EGdCIIRQ0BIAsgCiAI/AoAAAwBCyADIAZGDQELIAEgByAFaiIFNgIICyAFRQ0BCyAEIAVBBnRqIQUDQAJAIARBOGooAgAiCEUNACAIQQxsIQEgBEE0aigCACEIA0AgACAIKAIAEIYBIAhBDGohCCABQXRqIgENAAsLIAQgABCjBQJAIAAoAgBFDQAgACAEEP0ICyAEQcAAaiIEIAVHDQALCyACQRBqJAAL/gMBBX8jAEHQAGsiBCQAIAQgAjYCFCAEQQhqIAIQowQgBCgCCCEFAkACQAJAAkAgAS0AyAFBxQBGDQAgBEEYaiABQQEQ/QUgBCgCHCEGIAQoAhgiB0GAgICAeEYNASAEIAQpAjA3A0ggBCAEKQIoNwNAIAQgBCkCIDcDOAwCCyAEQRhqIAEgASgCwAFBARC5IiABIAQoAiA2AsgBIAEgBCkCGDcCwAEgBEEYaiABQQEQsgwgBCgCHCEGIAQoAhgiB0GAgICAeEYNACAEIAQpAjA3A0ggBCAEKQIoNwNAIAQgBCkCIDcDOAwBCyAAQQA2AgAgACAGNgIEIAMQoSMgBEEUahC6IgwBC0EEQSAQ6iAiCCAGNgIEIAggBzYCACAIIAQpAzg3AgggCCAEKQNANwIQIAggBCkDSDcCGCABKAK8ASEHAkAgAigCAEEwRw0AIARB6YCAgHg2AhggASAFIAcgBEEYahD1HQtBCEHAABDqICIGQQA2AgggBkIxNwMAQQRBIBDqICIBQgA3AhggAUIINwIQIAFCADcCCCABQoCAgIDAADcCACAAIAM2AhQgAEEANgIQIAAgBzYCDCAAIAU2AgggACAINgIEIAAgAjYCACAEQgA3AiAgBEIANwIoIAQgBjYCGCAEIAE2AhwgBEEYahCpIAsgBEHQAGokAAuOBAECfyMAQSBrIgIkAAJAAkACQAJAAkACQCAALQAADgQAAQIDAAsgAiAAKAIENgIEIAEoAgBBuLuYAUECIAEoAgQoAgwRDAAhACACQQA6AA0gAiAAOgAMIAIgATYCCCACQQhqQbq7mAFBBCACQQRqQe0AEJwKIQEgAkEpOgATIAFBu6SaAUEEIAJBE2pB7gAQnAohAEEUEIoBIgFFDQQgAUEAKACEupgBNgAQIAFBACkA/LmYATcACCABQQApAPS5mAE3AAAgAkEUNgIcIAIgATYCGCACQRQ2AhQgAEGVzJgBQQcgAkEUakHvABCcChDYEyEBIAIoAhQiAEUNAyACKAIYIABBARDcFAwDCyACIAAtAAE6AAggAiABKAIAQb67mAFBBCABKAIEKAIMEQwAOgAcIAIgATYCGCACQQA6AB0gAkEANgIUIAJBFGogAkEIakHuABCeDBDcECEBDAILIAAoAgQhACABKAIAQf6PmwFBBSABKAIEKAIMEQwAIQMgAkEAOgAZIAIgAzoAGCACIAE2AhQgAkEUakG7pJoBQQQgAEEIakHuABCcCkGVzJgBQQcgAEHwABCcChDYEyEBDAELIAIgACgCBCIANgIUIAFBwruYAUEGQbukmgFBBCAAQQhqQe4AQcmQmwFBBSACQRRqQfEAEJgOIQELIAJBIGokACABDwtBAUEUEP4gAAuzAwEDfyMAQSBrIgMkAAJAAkAgASACTQ0AAkACQAJAAkAgACACaiIELAAAIgVBf0wNACAFQf8BcSECDAELQQAhACAFQUBJDQQgASACayEBAkACQAJAAkAgBUFgTw0AQQIhAgwBCyAFQXBPDQFBAyECCyACIAFNDQEMBgsgBUF3Sw0FQQQhAiABQQRJDQULIANBDGogBCACENcFIAMoAgwNBCADKAIURQ0CAkAgAygCECIALAAAIgJBf0oNACACQWBJDQAgAkFwSQ0AIAAtAAFBP3FBDHQgAC0AAkE/cUEGdHIgAC0AA0E/cXIgAkH/AXFBEnRBgIDwAHFyQYCAxABGDQMLAkACQAJAAkAgBUFgTw0AQQIhAgwBCyAFQXBPDQFBAyECCyACIAFNDQEMBQsgBUF3Sw0EQQQhAiABQQRJDQQLIANBDGogBCACENcFIAMoAgwNAyADIAMoAhAiAiADKAIUajYCHCADIAI2AhggA0EYahDPDSICQYCAxABGDQELIAIQ2w9B/wFxQQFzIQAMAwtBkJOFARDEIwALQZCThQEQxCMAC0EBIQALIANBIGokACAAC9YDAgt/BX4jAEHwAGsiAiQAIAEoAgQhAyACQTBqIAEoAggiBEEIQTgQhQ8gAigCNCEFAkACQCACKAIwQQFGDQAgAigCOCEGAkAgBUUNACAEQThsIQcgBiEBIAUhCANAIAdFDQEgAygCLCEJIAMoAighCiACQQhqIAMQjwMCQAJAIAMoAjAiCw0AQQAhDAwBC0HAABCKASIMRQ0EIAJBMGogCxBOIAwgAikDaDcDOCAMIAIpA2A3AzAgDCACKQNYNwMoIAwgAikDUDcDICAMIAIpA0g3AxggDCACKQNANwMQIAwgAikDODcDCCAMIAIpAzA3AwALIAMtADQhCyACIAIpAygiDTcDUCACIAIpAyAiDjcDSCACIAIpAxgiDzcDQCACIAIpAxAiEDcDOCACIAIpAwgiETcDMCABIA03AyAgASAONwMYIAEgDzcDECABIBA3AwggASARNwMAIAFBNGogCzoAACABQTBqIAw2AgAgAUEsaiAJNgIAIAFBKGogCjYCACABQThqIQEgB0FIaiEHIANBOGohAyAIQX9qIggNAAsLIAAgBDYCCCAAIAY2AgQgACAFNgIAIAJB8ABqJAAPCyAFIAIoAjgQ/iAAC0EIQcAAEKIkAAvRAwEEfwJAAkACQAJAAkACQAJAAkAgACgCAA4HBwABAgMHBAcLIAAoAgwiAkUNBiACQShsIQIgACgCCCEAA0ACQCAAKAIAQQdGDQAgACABEK4FCyAAQShqIQAgAkFYaiICDQAMBwsLIAAoAgQgARCuBQ8LIAAoAgwiAkUNBCACQThsIQIgACgCCCEAA0AgASAAEIIHIABBOGohACACQUhqIgINAAwFCwsgAS0AJiECIAFBADoAJiAAKAIEIAEQrgUgAS0AJSEDIAAoAgghACABLQAkIgQNAiAAKAIAIgVBdGpBByAFQQtLG0F7aiIFQR9LDQFBASAFdEGuooCAeHENAiAFDQEgAC0AEQ0BDAILIAEtACUhAiAAKAIEIQACQCABLQAkIgMNAAJAIAAoAgAiBEF0akEHIARBC0sbQXtqIgRBH0sNAEEBIAR0Qa6igIB4cQ0BIAQNACAALQARRQ0BCyABQQM6ACQLIAEgABDlASAAIAEQVSABIAI6ACUgASADOgAkIAEgABC4AQwCCyABQQM6ACQLIAEgABDlASAAIAEQVSABIAM6ACUgASAEOgAkIAEgABC4ASABIAI6ACYgACgCAEEZRw0AIAEgABDOAQ8LC8oDAQR/IwBBEGsiAiQAAkACQCAAKAIAIgNBBUcNACABLQAkIQQgAUECOgAkIAEtACUhAyABIAAoAgQiABDlASAAIAEQVSABIAM6ACUgAUECOgAkIAEgABC4ASABIAM6ACUgASAEOgAkDAELAkACQAJAAkACQCADDgUFAAECBQULIAAoAgRBAUcNBCABLQAlIQMgACgCCCEAIAEtACQiBA0DIAAoAgAiBUF0akEHIAVBC0sbQXtqIgVBH0sNAkEBIAV0Qa6igIB4cQ0DIAUNAiAALQARDQIMAwsgACgCBCIDQfwAaiEEAkAgAy0AbEECRw0AIANBwABqIQADQCAAKAIYIgAtACxBAkYNAAsLIAEgBBDOCSADQZQBaigCACEAIANBmAFqKAIAIQQgAiABNgIMAkAgBEUNACAEQShsIQEDQCACQQxqIAAQhQcgAEEoaiEAIAFBWGoiAQ0ACwsgAy0APCIBQQZGDQMgAUECRw0DIANBEGohAQNAIAEoAhgiAS0ALEECRg0ADAQLCyABIABBBGoQ1QYMAgsgAUEDOgAkCyABIAAQ5QEgACABEFUgASADOgAlIAEgBDoAJCABIAAQuAELIAJBEGokAAvxAwECfwJAAkACQAJAAkACQAJAIAEoAgBBf2oOCQEDAwMDAwMDAAMLAkAgASgCCCIAQRFHDQBBACECAkACQAJAAkACQAJAIAEoAhAiAA4IBAABCAwMAgMECyABQTRqIQIMCgsgASgCFEEYaiECDAkLIAEoAhRBLGohAgwICyABKAIUIgItAFBFDQFBAA8LIAFBNGohAgwGCyACQdEAaiECDAULIABBAUcPC0EBIQIgASgCCCEDAkAgAC0AAEEBcUUNACADQQJGDQULQQAhAgJAAkACQAJAAkACQCADDggEAAEGCgoCAwQLIAFBLGohAAwHCyABKAIMQRhqIQAMBgsgASgCDEEsaiEADAULIAEoAgwiAC0AUEUNAUEADwsgAUEsaiEADAMLIABB0QBqIQAMAgtBASECDAMLIAEQ9g0PCwJAIAAtAABFDQBBAA8LQQEhAgJAAkACQCADDggEAAQEAQEEAgQLIAEoAigoAhhBgICAgHhHDwtBAA8LQQAhAiABKAIMIgEtAEVBA0YNASABQSBqEMkNDwsCQCACLQAARQ0AQQAPC0EBIQICQAJAAkAgAA4IAwADAwEBAwIDCyABKAIwKAIYQYCAgIB4Rw8LQQAPC0EAIQIgASgCFCIBLQBFQQNGDQAgAUEgahDJDQ8LIAIL1gMBCH8jAEEwayIDJAACQAJAIAFB45uFAUEPIAIoAgwiBBEMAA0AAkACQAJAIAAoAsACIgVFDQAgBUEUbCEGIAAoArwCIQcgACgCpAIhCCAAKAKgAiEJQQAhCgNAIAUgCkYNAiADIAc2AgggA0HeAEE+QSAgCCAKRhsgCSAKRhs2AgwgAyAKNgIsIANBngE2AiQgA0E9NgIcIANBAzYCFCADIANBCGo2AiAgAyADQSxqNgIYIAMgA0EMajYCECABIAJBipyFASADQRBqEM0GDQQgB0EUaiEHIApBAWohCiAGQWxqIgYNAAsLIAAoAswCIgZBAU0NAUEBIQogAUGi8poBQQEgBBEMAA0DIAAoAsgCIQpBACEHA0AgAyAHNgIoIAMgCigCADYCLCADQT02AhwgA0E9NgIUIAMgA0EsajYCGCADIANBKGo2AhAgASACQfSbhQEgA0EQahDNBg0DIApBBGohCiAGIAdBAWoiB0YNAgwACwtBpOmEARDEIwALIAFBovKaAUEBIAQRDAANACADQZ8BNgIUIAMgADYCEEEBIQogASACQZC0gQEgA0EQahDNBg0BIAFB8puFAUECIAQRDAAhCgwBC0EBIQoLIANBMGokACAKC4YEAQF/IwBBMGsiAyQAAkACQAJAAkACQAJAAkAgAkF9ag4GAQQCBAQDAAsgAkEORw0DIAEpAABCxMqNy9atmLbfAIUgAUEGaikAAELsvrmq183YsvIAhYRQRQ0DIANBIGpBrPKJAUGs9okBEOkMIAAgA0EgahDZGAwFCyABLwAAQcHcAXMgAUECai0AAEH5AHNyQf//A3ENAiADQSBqQdTylgFB3PKWARDpDCAAIANBIGoQ2RgMBAsgASgAAEHBpo3KBHMgAUEEai0AAEHJAHNyRQ0CDAELIAEpAABCwebNy/bM27LkAFINACADQSBqQb31hQFBChCVCCADLQAkIQECQCADKAIgIgJBgICAgHhHDQAgAEGAgICAeDYCACAAIAE6AAQMAwsgAyADKAAsNgAcIAMgAykAJTcAFSADIAE6ABQgAyACNgIQIANBEGoQ3gUgACADKQIYNwIIIAAgAykCEDcCAAwCCyADQQhqQYTulgFBJSABIAIQmw4CQCADKAIIIgFFDQAgA0EQaiABIAEgAygCDEEDdGoQ6QwgA0EgaiADQRBqENkYIAMoAiBBgICAgHhGDQAgACADKQIoNwIIIAAgAykCIDcCAAwCCyAAQYCAgIB4NgIAIABBAToABAwBCyADQSBqQdzylgFB5PKWARDpDCAAIANBIGoQ2RgLIANBMGokAAu+AwEJfwJAAkAgACgCGCICIAAoAgAiA0YNACACIANJIQQMAQsgACgCJCAAKAIMSSEECwJAAkAgACgCSCICIAAoAjAiA0YNACACIANJIQUMAQsgACgCVCAAKAI8SSEFCyAAQTBByAAgBRtqIQMgACAEQQFzQRhsaiECAkACQCAAQcgAQTAgBRtqIgUoAgAiBiAAIARBGGxqIgcoAgAiAEYNACAGIABJIQAMAQsgBSgCDCAHKAIMSSEACwJAAkAgAygCACIEIAIoAgAiBkYNACAEIAZJIQQMAQsgAygCDCACKAIMSSEECwJAAkAgAyACIAUgABsgBBsiBigCACIIIAcgBSACIAQbIAAbIgkoAgAiCkYNACAIIApJIQgMAQsgBigCDCAJKAIMSSEICyABIAUgByAAGyIAKQIQNwIQIAEgACkCCDcCCCABIAApAgA3AgAgASAGIAkgCBsiACkCEDcCKCABIAApAgg3AiAgASAAKQIANwIYIAEgCSAGIAgbIgApAhA3AkAgASAAKQIINwI4IAEgACkCADcCMCABIAIgAyAEGyIAKQIANwJIIAEgACkCCDcCUCABIAApAhA3AlgL5QMCBn8CfiMAQRBrIgMkAAJAAkACQAJAIAEoArABIgRBAWoiBSABKAJsIgZJDQAgASgCtAEiB0F+aiIIIAEoAnBLDQAgASgCYCAFIAZraiAIIAVrEI0ZIQkgASkDCCEKIAFBCjYCCCADIAEpAxA3AwggAyAKNwMAAkACQCAKpyIGQQpGDQAgBkECSQ0BIAMQwAsLQajzmgFBKEHYiJsBELkhAAsCQCAGQQFGDQAgAykDCCEKDAMLIAMoAgQhBiACDQEgAEECOgAYIAAgBjYCACAJQgODQgBSDQMgCaciASABKAIAIgBBf2o2AgAgAEEBRw0DIAEgASgCEBDwHgwDC0H0jpsBQdYAQcyPmwEQuSEACyAGQQhqEOYDIAZBIEEIENwUQgAhCgsgAUGwAWohBgJAAkAgASgCiAEiAkELRw0AIAMgARDEASABKAK0ASEHIAEoArABIQQMAQsgAUELNgKIASABIAI2AgggASABKQKMATcCDCABIAEoApQBNgIUIAMgASkCmAE3AwAgAyABKAKgATYCCAsgASAHNgKsASABIAQ2AqgBIAYgAykDADcCACAGIAMoAgg2AgggAEEAOgAYIAAgCjcDECAAIAg2AgwgACAFNgIIIAAgCTcDAAsgA0EQaiQAC6QDAgl/BH4jAEEgaxogAUEBdiABaiECA0ACQAJAIAJBf2oiAiABSQ0AIAIgAWshAwwBCyAAIAJBHGxqIgQpAgghCyAEKQIQIQwgBCgCGCEDIAApAgAhDSAAIAQpAgA3AgAgACgCGCEFIAAgAzYCGCAAKQIQIQ4gACAMNwIQIAApAgghDCAAIAs3AgggBCAFNgIYIAQgDjcCECAEIAw3AgggBCANNwIAQQAhAwsCQCADQQF0IgVBAXIiBCABIAIgASACSRsiBk8NAANAAkACQCAFQQJqIgUgBkkNACAEIQcMAQsgBCAAIARBHGxqIggoAgQgACAFQRxsaiIFKAIESSAIKAIAIgggBSgCACIFSSAIIAVGG2ohBwsgACADQRxsaiIJKAIEIAAgB0EcbGoiCigCBEkgCSgCACIEIAooAgAiA0kgBCADRhtBAUcNAUEAIQQCQANAIARBHEYNASAJIARqIgMoAgAhBSADIAogBGoiCCgCADYCACAIIAU2AgAgBEEEaiEEDAALCyAHIQMgB0EBdCIFQQFyIgQgBkkNAAsLIAINAAsL0QMBCH8jAEEwayICJAACQAJAAkACQCABKAIAQYCAgIB4Rg0AAkAgASgCCCIDRQ0AIANBDGwiA0F0aiIEQQxuIQUgASgCBCIGIQcCQANAIANFDQEgA0F0aiEDIAcoAgghCCAHQQxqIQcgCCAFaiIFIAhPDQALQeDZmgFBNUGY2poBEOwbAAsgAiAFQQFBARCDGCACQQA2AhwgAiACKQMANwIUIAJBFGogBigCBCIDIAMgBigCCGoQ+SIgBkEUaiEDIAIoAhggAigCHCIHaiEGIAUgB2shCANAIARFDQMgA0F8aigCACEJIAMoAgAhByACQSBqIAYgCEEBEIscIAIoAiwhCCACKAIoIQYgAigCICACKAIkQaLymgFBARC9HiACQSBqIAYgCCAHEIscIAIoAiwhCCACKAIoIQYgAigCICACKAIkIAkgBxC9HiAEQXRqIQQgA0EMaiEDDAALCyACQQA2AhAgAkKAgICAEDcDCAwCCyAAQYCAgIB4NgIADAILIAIgAikCFDcDCCACIAUgCGs2AhALIAIgAS8BHDsBLCACIAEpAhQ3AiQgAiACQQhqNgIgIAAgAkEgahDUEyACKAIIIAIoAgwQsiMLIAJBMGokAAuzAwEOfyMAQRBrIgIkAAJAAkACQCABLQAlDQAgASgCBCEDAkACQCABKAIQIgQgASgCCCIFSw0AIAFBFGoiBiABLQAYIgdqQX9qIQggASgCDCEJIAdBBUkhCgJAA0AgBCAJSQ0CIAMgCWohCyAILQAAIQwCQAJAIAQgCWsiDUEHSw0AQQAhDiAMQf8BcSEPQQAhDANAAkAgDSAMRw0AIA0hDAwDCwJAIAsgDGotAAAgD0cNAEEBIQ4MAwsgDEEBaiEMDAALCyACQQhqIAwgCyANEJsKIAIoAgwhDCACKAIIIQ4LIA5BAUcNASABIAkgDGpBAWoiCTYCDCAJIAdJDQAgCSAHayEMIAkgBUsNACAKRQ0GIAMgDGogBiAHELoYDQALIAEoAhwhDSABIAk2AhwgDCANayEMDAILIAEgBDYCDAsgAUEBOgAlAkACQCABLQAkQQFHDQAgASgCICEMIAEoAhwhDQwBCyABKAIgIgwgASgCHCINRg0CCyAMIA1rIQwLIAAgAyANaiAMEKMUDAELIABBgICAgHg2AgALIAJBEGokAA8LQQAgB0EEQYSWmwEQkAoAC8wDAQd/IwBBwABrIgckAAJAAkACQCABKAIADQAgByABKAIENgIMIAdBADYCCCAHIAEoAhAiCDYCGCAHIAEoAgwiCTYCFCAHIAEoAggiCjYCECAHIAEtABg6ACAgASgCFCIBQX9qIAlNIQsCQANAAkACQCAEIAlJDQAgBCAJRw0BDAULIAogBGosAABBv39KDQQLQQAhDAJAIAFFDQAgByABQX9qIgQ2AiggByAINgIkIAggAUsNAiALRQ0CIAcgBDYCHCAHQTBqIAUgBiAHQQhqEHggBygCNCECAkAgBygCMCINQQJHDQAgACACNgIEQQIhDAwBCyAEIQEgBygCOCIDIQQgDQ0BCwsgACAMNgIADAMLIAcgCTYCLCAHQQc2AjwgB0H4ADYCNCAHIAdBLGo2AjggByAHQSRqNgIwQeCHgAEgB0EwakGY5JoBEOsbAAsCQAJAAkAgBCABKAIMIghJDQAgBCAIRg0BDAILIAEoAgggBGosAABBv39MDQELIAAgAzYCCCAAIAI2AgQgAEEBNgIADAILIAAgAzYCCCAAIAI2AgQgAEEANgIADAELIAAgAzYCCCAAIAI2AgQgAEEBNgIACyAHQcAAaiQAC98DAQN/AkACQCAAKAIAIgENACAAKAIQIgBFDQEgAEGv7poBQQEQnQcPCwJAAkACQAJAAkAgACgCCCICIAAoAgRJDQAgACgCECIDRQ0BIANB2MiXAUEQEJ0HRQ0BQQEPC0EBIQMgACACQQFqNgIIAkACQAJAAkAgASACai0AAEGyf2oOBQIDAAABAAsgACgCECIBRQ0DIAFB2MiXAUEQEJ0HRQ0DDAYLIABBABC2Ag0FAkAgACgCECIBRQ0AIAFBxcyXAUEDEJ0HDQYLIABBABC2AkUNBgwFCyAAKAIQIgBFDQUgAEHLzJcBQQUQnQdFDQUMBAtBASEDIAAgACgCDEEBaiIBNgIMIAFB9ANLDQEgABCcCA0DAkADQCAAKAIAIgFFDQECQCAAKAIIIgIgACgCBE8NACABIAJqLQAAQcUARw0AIAAgAkEBajYCCCAAIAAoAgxBf2o2AgwMBwsCQCAAKAIQIgFFDQAgAUHIzJcBQQMQnQcNBgsgABCcCEUNAAwFCwsgACgCECIBRQ0AIAFB2MiXAUEQEJ0HDQMLQQAhAyAAQQA6AAQMAQsCQCAAKAIQIgFFDQAgAUHoyJcBQRkQnQcNAgsgAEEBOgAEQQAhAwsgACADNgIACyADDwtBAAv1BAEGfyMAQRBrIgEkACABQQhBCEHAABCMDiABKAIIIQIgASgCBCEDAkACQCABKAIAIgQNAAwBCyABKAIMIQUgA0EJaiIGRQ0AIARB/wEgBvwLAAsgASAFNgIMIAEgAjYCCCABIAM2AgQgASAENgIAIAFC0cTJq5bsGhCVBxogAULBxoWb1wwQlQcaIAFC0caFo7eMGhCVBxogAULRxrGLtu4cEJUHGiABQtHGvfO2jh0QlQcaIAEQwRsQlQcaIAEQwhsQlQcaIAFC8ciVs5asnbb0ABCVBxogAULhyJXj1ozdMhCVBxogAUKhyL0DEJUHGiABQsHKsZvXDBCVBxogAULByrmr1w0QlQcaIAFC4crhg/fNnDoQlQcaIAFC8crho9fMm7LzABCVBxogAULRzIXjtq4ZEJUHGiABQvHMpfOWjJu2+QAQlQcaIAFCscy9kwcQlQcaIAEQwxsQlQcaIAFCodKZAxCVBxogAULh0rWD982cOhCVBxogAUKh0rkDEJUHGiABEMQbEJUHGiABQrHclbsHEJUHGiABQsHc1ePGDRCVBxogAULx4IWbtq3Ys+UAEJUHGiABQuHklaPXzpw3EJUHGiABQtHm1YPXzBwQlQcaIAFC4ebdy8bumDQQlQcaIAFCweihy7YOEJUHGiABQtHooZP37R0QlQcaIAFCwejJq9cMEJUHGiABQrHoycsHEJUHGiABQuHo5YPX7JszEJUHGiABQrHshZMHEJUHGiABQsHsvcvGDBCVBxogAULR7qHLxq0ZEJUHGiABQsHupaOHDRCVBxogACABKQIINwIIIAAgASkCADcCACABQRBqJAAL7wMBBX8jAEHQAGsiBCQAAkACQCABLQC4AUUNACABKAK0ASEFIAEoArABIQYgBEGMgICAeDYCKCAGIAUgBEEoahDGGyEFQQEhBiABLQC4AUGiAUcNASABIAEQhg4QkQkMAQsgASABKAJ4IgVB//97cTYCeCAEQShqIAEQhwIgASAFNgJ4IAQoAiwhBwJAIAQoAigiBkGAgICAeEYNACAEIAQoAjAiBTYCDCAEIAc2AgggBCAGNgIEIAEoAqwBIQgCQCAFQX1qQX1LDQAgBEHrgICAeDYCKCACIAggBEEoahDGGyEFAkAgAS0AuAFBogFHDQAgASABEIYOEJEJCyAEQQRqEKIbIAYgBxD2I0EBIQYMAgsgBCAEKAIMNgIYIAQgBCkCBDcDECAEQgA3AkAgBEEDOgA8QQAhBiAEQQA2AjggBEIANwJIIARCADcCMCAEQoCAgIDAADcCKCAEIAMpAgA3AhwgBCADKAIINgIkAkBBwAAQigEiBUUNACAFQRc2AgAgBSAEKQMQNwIEIAUgBCkDGDcCDCAFIAQpAyA3AhQgBUIANwIkIAUgCDYCICAFIAI2AhwgBEEoahCiG0EAQQQQ9iMMAgtBCEHAABCiJAALQQEhBiAHIQULIAAgBTYCBCAAIAY2AgAgBEHQAGokAAvVAwEGfyMAQeAAayIEJAAgASABKAJ4IgVBgIAIcjYCeCAEQQA6AEcgBCACNgJAIAQgAykCADcDSCAEIAMoAgg2AlAgBCAEQcAAajYCWCAEIARBxwBqNgJUIARBCGogASAEQcgAahCaASABIAU2AnggBCgCCCEGAkACQAJAIAQtABwiB0EDRw0AQQEhAgwBCyAEIAQpAhQ3AzggBCAEKQIMNwMwIAQgBC8AHTsBLCAEIAQtAB86AC4CQCAEKAIgIggoAhQiA0UNACADQdgAbCECIAgoAhAhAwNAAkACQAJAAkBBACADKAIAIgVBfGoiCSAJIAVLG0F/ag4DAAMBAwsgA0E1ai0AAA0BDAILIANBxQBqLQAAQQFHDQELIANBLGooAgAhBSADQShqKAIAIQkgBEGhgYCAeDYCCCABIAkgBSAEQQhqEO4dCyADQdgAaiEDIAJBqH9qIgINAAsLQcAAEIoBIgNFDQEgAyAGNgIIIANBHzYCACADIAQpAzA3AgwgAyAEKQM4NwIUIAMgBzoAHCADIAQvASw7AB0gAyAELQAuOgAfIAMgCDYCIEEAIQIgAyEGCyAAIAY2AgQgACACNgIAIARB4ABqJAAPC0EIQcAAEKIkAAu0AwEFfyMAQRBrIgIkAAJAIAAoAggiA0UNACAAKAIEIgQgA0EobGohBQNAQQQhAAJAAkACQAJAAkAgBCgCAA4FBAIDAAEECwJAIAQoAgQiBi0AbEECRw0AIAZBwABqIQADQCAAKAIYIgAtACxBAkYNAAsLAkAgBkGEAWooAgAiAEUNACAAQdgAbCEDIAZBgAFqKAIAIQADQAJAAkAgACgCAEEFRw0AIAEgAEEEaigCABDkDAwBCyABIAAQiAkLIABB2ABqIQAgA0Gof2oiAw0ACwsgBkGUAWooAgAhACAGQZgBaigCACEDIAIgATYCDAJAIANFDQAgA0EobCEDA0AgAkEMaiAAEOYHIABBKGohACADQVhqIgMNAAsLIAYtADwiAEEGRg0DIABBAkcNAyAGQRBqIQADQCAAKAIYIgAtACxBAkYNAAwECwsgBEEMaigCACIARQ0CIABBKGwhAyAEQQhqKAIAIQADQCAAIAEQiAYgAEEoaiEAIANBWGoiAw0ADAMLC0EIIQAgBCgCBEUNAQsgASAEIABqKAIAEOQMCyAEQShqIgQgBUcNAAsLIAJBEGokAAu0AwEFfyMAQRBrIgIkAAJAIAAoAggiA0UNACAAKAIEIgQgA0EobGohBQNAQQQhAAJAAkACQAJAAkAgBCgCAA4FBAIDAAEECwJAIAQoAgQiBi0AbEECRw0AIAZBwABqIQADQCAAKAIYIgAtACxBAkYNAAsLAkAgBkGEAWooAgAiAEUNACAAQdgAbCEDIAZBgAFqKAIAIQADQAJAAkAgACgCAEEFRw0AIAEgAEEEaigCABDIAQwBCyABIAAQiQkLIABB2ABqIQAgA0Gof2oiAw0ACwsgBkGUAWooAgAhACAGQZgBaigCACEDIAIgATYCDAJAIANFDQAgA0EobCEDA0AgAkEMaiAAEOcHIABBKGohACADQVhqIgMNAAsLIAYtADwiAEEGRg0DIABBAkcNAyAGQRBqIQADQCAAKAIYIgAtACxBAkYNAAwECwsgBEEMaigCACIARQ0CIABBKGwhAyAEQQhqKAIAIQADQCAAIAEQiQYgAEEoaiEAIANBWGoiAw0ADAMLC0EIIQAgBCgCBEUNAQsgASAEIABqKAIAEMgBCyAEQShqIgQgBUcNAAsLIAJBEGokAAu9AwIGfwF+IwBBwABrIgIkAEEMIQMCQCAAKAIEIgQgAC0ACyIFQcAAakH/AXEiBkEMIAZBDEkbIAVB/gFGGyIHIAFqIgYgB0kNAAJAIAVB/gFHDQACQCAAKAIIIgdB////d0YNACAHQf///wdxIQMMAQsgACgCAEF8aigAACEDCwJAIAYgA0kNAAJAAkAgBkENSQ0AIAVB/gFGDQEgAkEYaiAAEJUbIAJBJGogAigCGCACKAIcIAEQmREgABDXICAAIAIoAiw2AgggACACKQIkNwIADAILIAJBCGogABCVGyACQgA3AzAgAkEANgA3IAIgAigCDCIFQcABcjoAOwJAIAVFDQAgAkEwaiACKAIIIAX8CgAACyAAENcgIAAgAigCODYCCCAAIAIpAzA3AgAMAQsgAEF/IAQgAWoiBSAFIARJGyIFQf////8HIAStQgN+IginQQF2IAhCIIinGyIGIAUgBksbELsGRQ0AIAJBEGogABCVGyACQSRqIAIoAhAgAigCFCABEJkRIAAQ1yAgACACKAIsNgIIIAAgAikCJDcCAAsgAkHAAGokAA8LQYzWmAFBLEG41pgBEOwbAAvWAwIDfwF+AkACQAJAAkACQAJAAkAgACgCAA4GAQIDBAYFAAsgACgCBCIBEJwBIAFBwABBCBDcFA8LAkAgACkDCCIEQgODQgBSDQAgBKciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDwHgsgACgCICIBRQ0DIAEoAgAiAhDfAiACQeAAQQgQ3BQgAUEMQQQQ3BQPCyAAKAIIIQMCQCAAKAIMIgJFDQAgAyEBA0ACQCABKAIAQQdGDQAgARCjCAsgAUEoaiEBIAJBf2oiAg0ACwsgACgCBCADQQhBKBDVEyAAKAIYIgFFDQIgASgCACICEN8CIAJB4ABBCBDcFCABQQxBBBDcFA8LIAAoAgQiARCjCCABQShBCBDcFCAAKAIYIgFFDQEgASgCACICEN8CIAJB4ABBCBDcFCABQQxBBBDcFA8LIAAoAgghAwJAIAAoAgwiAkUNACADIQEDQCABENcRIAFBOGohASACQX9qIgINAAsLIAAoAgQgA0EIQTgQ1RMgACgCGCIBRQ0AIAEoAgAiAhDfAiACQeAAQQgQ3BQgAUEMQQQQ3BQLDwsgACgCBCIBEKMIIAFBKEEIENwUIAAoAggiARCcASABQcAAQQgQ3BQLqQMBBn9BACEBAkAgACgCXCICRQ0AAkACQCAAKAJYIgMsAAAiBEF/TA0AIARB/wFxIQQMAQsgAy0AAUE/cSEFIARBH3EhBgJAIARBX0sNACAGQQZ0IAVyIQQMAQsgBUEGdCADLQACQT9xciEFAkAgBEFwTw0AIAUgBkEMdHIhBAwBCyAFQQZ0IAMtAANBP3FyIAZBEnRBgIDwAHFyIQQLAkACQAJAAkACQCAEQa7AAEoNAAJAIARBnwFKDQAgBEF1akECSQ0DIARBhQFGDQMMAgsgBEGgAUYNAiAEQYAtRg0CDAELAkAgBEH/3wBKDQAgBEGvwABGDQIgBEHfwABHDQEMAgsgBEGA4ABGDQEgBEH//QNGDQELIARBgEBqQQxJDQEgBEH+//8AcUGowABHDQMgAEEBOgAcIAAgAkF9ajYCXCAAIANBA2o2AlggACAAKAJoQQNqNgJoQQEPCwJAIARBgAFPDQBBASEEDAILIARBgBBPDQBBAiEEDAELQQMhBAsgACACIARrNgJcIAAgAyAEajYCWCAAIAAoAmggBGo2AmhBASEBCyABC9ADAQV/AkAgASgCCCICRQ0AIAJBOGwhAyABKAIEIQRBACECA0ACQAJAAkACQCAEIAJqIgEoAgAOAwABAgALAkAgAUEIaigCAEEDRw0AIAFBDGooAgAiBSAAEFwgBSgCAEEaRw0AIAAgBUEIahCUCyIGRQ0AIAUQiAIgBSAGKQM4NwM4IAUgBikDMDcDMCAFIAYpAyg3AyggBSAGKQMgNwMgIAUgBikDGDcDGCAFIAYpAxA3AxAgBSAGKQMINwMIIAUgBikDADcDACAGQcAAQQgQ3BQLIAFBKGooAgAiASAAEM0EIAAgARD+CAwCCwJAIAFBKGooAgAiBUUNACAFKAIAIAAQtwELIAFBMGooAgAiAUUNASABIAAQXCABKAIAQRpHDQEgACABQQhqEJQLIgVFDQEgARCIAiABIAUpAzg3AzggASAFKQMwNwMwIAEgBSkDKDcDKCABIAUpAyA3AyAgASAFKQMYNwMYIAEgBSkDEDcDECABIAUpAwg3AwggASAFKQMANwMAIAVBwABBCBDcFAwBCyABQQRqKAIAIgUgABDNBCAAIAUQ/gggAUEYaigCACIBRQ0AIAEoAgAgABC3AQsgAyACQThqIgJHDQALCwveAwEFfyMAQdAAayIDJAAgA0IANwJAIAMgASADQcAAahCyDSADKAIEIQQCQAJAIAMoAgAiBUEqRg0AIABBCGogA0EIakE4/AoAACAAIAQ2AgQgACAFNgIADAELAkACQCACKAIIIgZFDQAgAiACLwEQQQFqIgU7ARAgBUH//wNxIAVGDQEgA0IANwIIIANCgICAgMAANwIAIANBADsBECADQcAAaiADIAIoAgwQyQogAigCBCIFIAYQqh0gAigCACAFQQRBFBDXEyACIAMoAkg2AgggAiADKQJANwIADAELIANCADcCCCADQoCAgIDAADcCACADQQA7ARAgA0HAAGogAyACKAIMEMkKIAIoAgQiBUEAEKodIAIoAgAgBUEEQRQQ1xMgAiADKAJINgIIIAIgAykCQDcCAAsgAigCHCEGIAJBADYCHCACKAIYIQcCQCAGRQ0AIAchBQNAIAUoAgAgBUEEaigCAEEEQQgQ1xMgBUEQaiEFIAZBf2oiBg0ACwsCQCACKAIUDQAgAkEUahCnGiACKAIYIQcLIAdBADoADCAHQQA2AgggB0KAgICAwAA3AgAgACAENgIMIAAgAjYCCCAAIAE2AgQgAEEqNgIAIAJBATYCHAsgA0HQAGokAAvVAwEFfyMAQeAAayIGJAAgASABKAJ4IgdBgIAIcjYCeCAGQQA6AEcgBiADNgJAIAYgBCkCADcDSCAGIAQoAgg2AlAgBiAGQcAAajYCWCAGIAZBxwBqNgJUIAZBCGogASAGQcgAahCaASABIAc2AnggBigCCCEIAkACQCAGLQAcIglBA0cNACAAQQM2AgAgACAINgIEDAELIAYgBikCFDcDOCAGIAYpAgw3AzAgBiAGLwAdOwEsIAYgBi0AHzoALiAGKAIgIQoCQAJAIAUNACAKKAIUIgRFDQEgBEHYAGwhAyAKKAIQIQQDQAJAAkACQAJAQQAgBCgCACIHQXxqIgUgBSAHSxtBf2oOAwADAQMLIARBNWotAAANAQwCCyAEQcUAai0AAEEBRw0BCyAEQSxqKAIAIQcgBEEoaigCACEFIAZBoYGAgHg2AgggASAFIAcgBkEIahDuHQsgBEHYAGohBCADQah/aiIDDQAMAgsLIApBAToAPAsgACAINgIIIABBADYCACAAIAYpAzA3AgwgACAGKQM4NwIUIAAgCToAHCAAIAYvASw7AB0gACAGLQAuOgAfIAAgAjYCKCAAIAo2AiAgACABKAKsATYCLAsgBkHgAGokAAutAwELfyAAQThB1AAgACgCWCAAKAI8SSAAKAJUIgIgACgCOCIDSSACIANGGyIDG2oiBCAAIAAoAiAgACgCBEkgACgCHCICIAAoAgAiBUkgAiAFRhsiBUEBc0EcbGoiAiAAQdQAQTggAxtqIgMgAygCBCAAIAVBHGxqIgAoAgRJIAMoAgAiBSAAKAIAIgZJIAUgBkYbIgcbIAQoAgQgAigCBEkgBCgCACIFIAIoAgAiBkkgBSAGRhsiCBsiBSgCBCEJIAAgAyACIAgbIAcbIgYoAgQhCiAFKAIAIQsgBigCACEMIAEgAyAAIAcbIgAoAhg2AhggASAAKQIQNwIQIAEgACkCCDcCCCABIAApAgA3AgAgASAFIAYgCSAKSSALIAxJIAsgDEYbIgMbIgAoAhg2AjQgASAAKQIQNwIsIAEgACkCCDcCJCABIAApAgA3AhwgASAGIAUgAxsiACgCGDYCUCABIAApAhA3AkggASAAKQIINwJAIAEgACkCADcCOCABIAIgBCAIGyIAKQIANwJUIAEgACkCCDcCXCABIAApAhA3AmQgASAAKAIYNgJsC9MDAQF/IwBBEGsiAyQAAkACQAJAAkACQCACQXpqDgMCAAEDCyABLQAAQcMARw0CIAEtAAFB7ABHDQIgAS0AAkHhAEcNAiABLQADQfMARw0CIAEtAARB/wFxQfMARw0CIAEtAAVB6QBHDQIgAS0ABkHjAEcNAiAAQQA7AQAMAwsCQAJAIAEtAABBsn9qDgMBAwADCyABLQABQfIARw0CIAEtAAJB5QBHDQIgAS0AA0HzAEcNAiABLQAEQeUARw0CIAEtAAVB8gBHDQIgAS0ABkH2AEcNAiABLQAHQeUARw0CIABBgAI7AQAMAwsgAS0AAUHvAEcNASABLQACQeQARw0BIAEtAANB5QBHDQEgAS0ABEHOAEcNASABLQAFQeUARw0BIAEtAAZB+ABHDQEgAS0AB0H0AEcNASAAQYAEOwEADAILIAEtAABBxQBHDQAgAS0AAUHzAEcNACABLQACQc4ARw0AIAEtAANB5QBHDQAgAS0ABEH4AEcNACABLQAFQfQARw0AIABBgAY7AQAMAQsgA0EEaiABIAIQ2QYgAygCCCIBIAMoAgxBxL2BAUEEEMwVIQIgAEEBOgAAIAAgAjYCBCADKAIEIAEQ6yELIANBEGokAAvPAwIDfwF+IwBBMGsiAiQAQQAhAwJAIAEtAIEBQSBxRQ0AQQAhAyABLQC4AUHyAGpB/wFxQQNLDQACQCABKAKIAUELRw0AIAFBiAFqIQMgASkDCCEFIAFBCjYCCCACIAEpAxA3AwggAiAFNwMAIAJBIGogARDEASABKQMIIQUgAUEKNgIIIAIgASkDEDcDGCACIAU3AxAgAUEIaiEEAkACQCABKAKIAUEOcUEKRw0AIAMgAikDKDcDGCADIAIpAyA3AxAgAyACKQMYNwMIIAMgAikDEDcDAAwBCyADEMALIAMgAikDEDcDACADIAIpAxg3AwggAyACKQMgNwMQIAMgAikDKDcDGCAEKAIAQQpGDQAgBBDACwsgBCACKQMINwMIIAQgAikDADcDACADKAIAQQtHDQBBACEDDAELAkACQCABLQCgASIEQbV/aiIDQR9LDQBBASADdEGBgIKQeHENAQsgBEG0f2pB/wFxQdUASQ0AQQAhAyAEQX5qDgMAAQABCyACQRBqIAFBqP+aAUEEQQAQ5wICQCACLQAQRQ0AIAIoAhQiAUEIahDmAyABQSBBCBDcFAtBASEDCyAAQQA6AAAgACADOgABIAJBMGokAAuyAwIGfwF+AkACQCABRQ0AIAAgAUHYAGxqIQMgAkEsaiEEA0ACQAJAIAAoAgAiAUEFRw0AIAItACghBSACQQA6ACggAi0AeSEGIAJBADoAeQJAIAAoAgQiASgCAEEaRw0AIAFBGGooAgAhBwJAIAEpAwgiCUIDg0IAUg0AIAmnIgggCCgCACIIQQFqNgIAIAhBf0wNBgsgBCAJIAcQrgsLIAEgAhBvIAIgBToAKCACIAY6AHkMAQsgAUEERg0AAkACQAJAIAEOBAMAAQIDCyAAKAIEQQFHDQIgAi0AKCEFIAJBADoAKCACLQB5IQYgAkEAOgB5AkAgACgCCCIBKAIAQRpHDQAgAUEYaigCACEHAkAgASkDCCIJQgODQgBSDQAgCaciCCAIKAIAIghBAWo2AgAgCEF/TA0HCyAEIAkgBxCuCwsgASACEG8gAiAFOgAoIAIgBjoAeQwCCyACIAAoAgQQuwoMAQsgAEEMaigCACIBRQ0AIAFBKGwhBSAAQQhqKAIAIQEDQCABIAIQ4AcgAUEoaiEBIAVBWGoiBQ0ACwsgAEHYAGoiACADRw0ACwsPCwALpwMBAX8CQAJAAkACQAJAAkACQAJAAkAgAC0ACA0AIAFBCUYNAiABQRtHDQEgAEEBOgAIDAcLIAFB7QBGDQMMBgsgAUH/AEkNASABQZ8BTQ0FIAFBDXYtAIDpmwFBBnQgAUEHdkE/cXItAMCZnAEiAkG6AU8NAyACQQV0IAFBAnZBH3FyLQCA65sBIAFBAXRBBnF2QQNxIgJBA0cNBiABQf+DfGoiAkEOSw0EQQEgAnRBgcABcQ0FDAQLAkAgACgCACICRQ0AIAIgACgCBCACcGshAgwGC0GswoEBEL0jAAsgAUEfSyECDAQLQQAhAiAAQQA6AAgMAwsgAkG6AUG4x5gBEP4WAAsCQCABQZmlempBAkkNACABQdwLRg0AAkAgAUHYL0YNACABQZA0Rg0BQQEhAiABQYOYBEYNA0EBQQFBAUEBQQFBAiABQZqceGpBGkkbIAFBz6V/akE/SRsgAUGAUWpBMEkbIAFB3nNqQeEESRsgAUH+//8AcUH8yQJGGyECDAMLQQMhAgwCC0EBIQIMAQtBACECCyAAIAAoAgQgAmo2AgQgAgusAwEHfyMAQRBrIgEkAEEAIQIgACgCCEEAIAAoAgAiAxshBCADQQBHIQUgACgCBCEGIAMhAAJAAkADQAJAIAQNACAFQQFxRQ0DIAINAgNAAkAgBg0AIAMhAkEAIQMMBAsgBkF/aiEGIAMoApgDIQMMAAsLAkACQCAFQQFxRQ0AIAINAQJAA0AgBkUNASAGQX9qIQYgAygCmAMhAwwACwtBACEGQQAhACADIQIMAQtBhN+aARDEIwALIARBf2ohBAJAAkACQANAIAYgAi8BkgNJDQEgAUEEaiACIAAQzRwgASgCBCICRQ0CIAEoAgwhBiABKAIIIQAMAAsLAkAgAA0AIAZBAWohACACIQcMAgsgAiAGQQJ0akGcA2ohAwNAIAMoAgAiB0GYA2ohAyAAQX9qIgANAAtBACEADAELQZzXmgEQxCMACyACIAZBDGxqIgMoAowCIANBkAJqKAIAEOkjIAIgBkEYbGoQ+RtBASEFQQAhAyAAIQZBACEAIAchAgwACwsDQCABQQRqIAIgAxDNHCABKAIEIgJFDQEgASgCCCEDDAALCyABQRBqJAALswMBAn8CQAJAAkAgACgCACICQQRGDQACQAJAAkAgAg4EAwABAgMLIAAoAgRBAUcNAiABLQAEQQFHDQICQAJAIAAoAggiAigCACIAQXRqQQcgAEELSxtBcmoOAwYAAQULIAIoAghBBUYNBQwECyACKAIMRQ0DIAFBADoABA8LAkAgACgCBCIDLQBsQQJHDQAgA0HAAGohAANAIAAoAhgiAC0ALEECRg0ACwsCQCADQYQBaigCACIARQ0AIABB2ABsIQIgA0GAAWooAgAhAANAAkACQCAAKAIAQQVHDQAgAUEAOgAEDAELIAAgARCuCAsgAEHYAGohACACQah/aiICDQALCwJAIANBmAFqKAIAIgBFDQAgAEEobCECIANBlAFqKAIAIQADQCAAIAEQvQUgAEEoaiEAIAJBWGoiAg0ACwsgAy0APCIAQQZGDQEgAEECRw0BIANBEGohAANAIAAoAhgiAC0ALEECRg0ADAILCyAAKAIMIgJFDQAgAkEobCECIAAoAgghAANAIAAgARC9BSAAQShqIQAgAkFYaiICDQALCw8LIAIgARD1AQ8LIAFBADoABAu0AwEIfyMAQTBrIgMkAAJAAkACQAJAIAEoAgAiBC0AFEF/akH/AXFBAkkNACADQQhqIAItABhBAnQoAqTfnAEtAAAQ2x4gA0EUaiADKAIMIgUgAygCCCIGa0EBdiIHQQFBAhCvESADKAIYIQggAygCFA0BQQAhCSADQQA2AiwgAyADKAIcIgo2AiggAyAINgIkAkAgBiAFRg0AQQAhCQNAIApBAWogBi0AACIIIAZBAWotAAAiBSAIIAVLGzoAACAKIAggBSAIIAVJGzoAACAKQQJqIQogBkECaiEGIAcgCUEBaiIJRw0ACwsgAyAJNgIsIANBFGogA0EkahDYGCACLQAZDQIMAwtB2eqJAUEpQYTriQEQuSEACyAIIAMoAhwQ/iAACyADQRRqEPsFCwJAAkACQCAELQAXRQ0AIAMoAhwiBkUNACADKAIYIAZBAXRqIgZBfmpFDQAgBkF/aiwAAEEASA0BCyAAIAMpAhw3AgwgACADKQIUNwIEIABBgICAgHg2AgAMAQsgACABKAIEIAEoAgggAkEBEKwQIAMoAhQgAygCGEEBQQIQ3RMLIANBMGokAAvjAwIFfwF+IwBBMGsiAyQAIAEoArABIQQCQAJAAkAgAS0AuAEiBUECRw0AIAFBsAFqIQUCQAJAIAEoAogBIgZBC0cNACADQRBqIAEQxAEMAQsgAUELNgKIASADIAEpApgBNwMQIAMgASgCoAE2AhggAUGMAWohBwJAIAEoAghBCkYNACABQQhqEMALCyABIAY2AgggASAHKQIANwIMIAEgBygCCDYCFAsgASkDsAEhCCAFIAMpAxA3AgAgBSADKAIYNgIIIAEgCDcDqAEgASABKAJ4IgVB/////31xNgJ4IANBEGogASACQQMQpQYgASAFNgJ4IAMoAhQhBSADKAIQIgJBgICAgHhHDQEgAEGAgICAeDYCACAAIAU2AgQMAgsgASgCtAEhAiADQQRqIAUQyCUgA0GPAq1CIIZB/vSaAa2ENwMoIANBEGpBzZWAASADQShqEM4IIAMgAykCBDcCHCADIAMoAgw2AiQgBCACIANBEGoQxhshBQJAIAEtALgBQaIBRw0AIAEgARCGDhCRCQsgAEGAgICAeDYCACAAIAU2AgQMAQsgAygCGCEGIABBADYCFCAAIAQ2AgwgACAGNgIIIAAgBTYCBCAAIAI2AgAgACABKAKsATYCEAsgA0EwaiQAC9oDAQJ/IwBBMGsiAiQAAkACQAJAIAEQzBINACABEJ8ORQ0BCyACQQhqIAEQpA0gACACKAIIIAIoAgwQhxwgAiABEKQNIAAgAigCACACKAIEEM0PDAELAkACQAJAAkACQAJAAkACQCABKAIADggAAQIDBAUGBwALIAFBIGogABCEAgwHCyABQSBqIAAQpQwMBgsgAUEEaiAAEK0lDAULIAFBBGogABCwJQwECyABQQRqIAAQ7QkMAwsgACABKAIEIgEoAgAiAyABQQRqKAIAIgEQhxwgACADIAEQzQ8MAgtBACgC7JSdASIARQ0BIAJBFGogACABKAIEIgFBGGooAgAgAUEcaigCAEHx95oBQTMQ3xIgAkEkakGK95oBQREQvBQgAkEANgIgIAIoAhgiARDeICABIAIpAig3AgggASACKQIgNwIAIAJBFGoQ8QIgAkEUahCeDgwBC0EAKALslJ0BIgBFDQAgAkEUaiAAIAEoAgQiAUHIAGooAgAgAUHMAGooAgBBpPiaAUHEABDfEiACQSRqQYr3mgFBERC8FCACQQA2AiAgAigCGCIBEN4gIAEgAikCKDcCCCABIAIpAiA3AgAgAkEUahDxAiACQRRqEJ4OCyACQTBqJAAL4wMCBX8BfiMAQTBrIgIkACABKAKwASEDAkACQAJAIAEtALgBIgRBAkcNACABQbABaiEEAkACQCABKAKIASIFQQtHDQAgAkEQaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDECACIAEoAqABNgIYIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahDACwsgASAFNgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEpA7ABIQcgBCACKQMQNwIAIAQgAigCGDYCCCABIAc3A6gBIAEgASgCeCIEQf////95cUGAgICABHI2AnggAkEQaiABQQBBAxCmBiABIAQ2AnggAigCFCEEIAIoAhAiBUGAgICAeEcNASAAQYCAgIB4NgIAIAAgBDYCBAwCCyABKAK0ASEFIAJBBGogBBDIJSACQY8CrUIghkH+9JoBrYQ3AyggAkEQakHNlYABIAJBKGoQzgggAiACKQIENwIcIAIgAigCDDYCJCADIAUgAkEQahDGGyEEAkAgAS0AuAFBogFHDQAgASABEIYOEJEJCyAAQYCAgIB4NgIAIAAgBDYCBAwBCyACKAIYIQYgACADNgIMIAAgBjYCCCAAIAQ2AgQgACAFNgIAIAAgASgCrAE2AhALIAJBMGokAAujAwEFfyMAQSBrIgIkAEF/IABBA2wiAEF/amd2QQFqQQEgAEEBSxsiA0EGdCEAQQAhBAJAAkACQCADQf///x9LDQAgAEHA////B0sNAEHAACEFQQAhBgJAIABFDQBBwAAhBCACQQhqQcAAIAAQ5x8gAyEGIAIoAggiBUUNAQsgAiAFNgIYIAIgBjYCFEEMIQRBACEAAkADQCACIAA2AhwgAyAARg0BAkAgACACKAIURw0AIAJBFGoQnwsgAigCGCEFCyAFIARqIgYgAEEBaiIANgIAIAZBfGpBADYCACAGQXRqQgA3AwAgBEHAAGohBAwACwsgAigCFCIAIANNDQIgAEEGdCEAIAIoAhghBAJAIAMNAEHAACEGIARBwAAgABDpIQwCCyAEIABBwAAgA0EGdCIFELwEIgYNAUHAACAFEP4gAAsgBCAAEP4gAAsgAiAGNgIYCyACKAIYIQQgAkEEQRAQ5x8CQCACKAIAIgBFDQAgACABNgIMIAAgAzYCBCAAIAQ2AgAgAEEfIANnazYCCCACQSBqJAAgAA8LQQRBEBCiJAAL6AMCBH8BfiMAQdAAayICJAACQAJAAkACQAJAAkACQAJAIAEoAgAOBwQBAAIAAwYACyAAQQw2AgAgACABKQMgNwMoIAAgASkDGDcDICAAIAEpAxA3AxggACABKQMINwMQIAAgASkDADcDCAwGCyACIAEpAgw3AwggAiABKQIUNwMQIAIgASgCHDYCGCABKAIIIQMgASgCBCEBQQshBEEAIQUMAwsgAiABKQIMNwMIIAIgASkCFDcDECACIAEoAhw2AhggASgCCCEDIAEoAgQhAUELIQRBASEFDAILIABBCjYCACAAIAEpAgQ3AgQgARCjCAwDCyACIAEpAhA3AwggAiABKQIYNwMQIAIgASkCIDcDGCABKAIMIQMgASgCCCEBQQAhBAsgACADNgIMIAAgATYCCCAAIAU2AgQgACAENgIAIAAgAikDCDcCECAAIAIpAxA3AhggACACKQMYNwIgDAELIAJBIGogASgCBBD/ByACKAIkIQECQCACKAIgIgNBC0YNACAAIAIpAzA3AxAgACACKQM4NwMYIAAgAikDQDcDICACKQMoIQYgACACKQNINwMoIAAgBjcDCCAAIAE2AgQgACADNgIADAELIAAgATYCDCAAQQY2Aggg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A0EAOgAMIANBADYCCCACDQNBASEHDAQLIAAgBSgCBCAFKAIIIAFBDGooAgARDABFDQQMBgsgAkUNAyABQQxqKAIAIQQLIABBnIWCASACIAQRDAANBAwCCyACQfb/F2ogAkGc/x9qcSACQZj4N2ogAkHwsR9qcXNBEXZBAWohBwsgByEEA0AgBEF/aiIEIANBCGpqIAIgAkH//wNxQQpuIghBCmxrQTByOgAAIAghAiAEDQALIAAgA0EIaiAHIAFBDGooAgARDAANAgsgBUEMaiIFIAZHDQALQQAhAgwBC0EBIQILIANBEGokACACC6gDAQN/IwBBEGsiAiQAIAAoAgAhAwJAAkACQAJAAkAgASgCAA4FBAABAgMECyABKAIEQQFHDQMgAy0AAA0DIAEoAgggAxCXAQwDCyADLQAADQIgASgCBCADEJcBDAILAkAgASgCBCIELQBsQQJHDQAgBEHAAGohAANAIAAoAhgiAC0ALEECRg0ACwsCQCAEQYQBaigCACIARQ0AIABB2ABsIQEgBEGAAWooAgAhAANAAkACQAJAIAAoAgBBfGoOAgIAAQsgAy0AAA0BIABBBGooAgAgAxCXAQwBCyAAIAMQuwkLIABB2ABqIQAgAUGof2oiAQ0ACwsCQCAEQZgBaigCACIARQ0AIABBKGwhASAEQZQBaigCACEAA0AgACADEK0HIABBKGohACABQVhqIgENAAsLIAQtADwiAEEGRg0BIABBAkcNASAEQRBqIQADQCAAKAIYIgAtACxBAkYNAAwCCwsgASgCCCEAIAEoAgwhASACIAM2AgwgAUUNACABQShsIQMDQCACQQxqIAAQwgggAEEoaiEAIANBWGoiAw0ACwsgAkEQaiQAC5ADAQl/IwBBEGsiAiQAAkACQAJAIAEoAgQiAyABQXRqKAIAIAEoAggiBCABQXhqKAIAIgUgBCAFSRsQuhgiBiAEIAVrIAYbIgUNAEEAIQcgAS0ADCABQXxqLQAASQ0BDAILIAVBf0oNASABLQAMIQcLIAEtAA8hBSABLwANIQggASABQXBqIgYpAgg3AgggASgCACEJIAEgBikCADcCACACIAg7AQwgAiAFOgAOAkAgBiAARg0AIAFBYGohASAHQf8BcSEKAkADQAJAAkAgAyABQQRqKAIAIAQgAUEIaigCACIFIAQgBUkbELoY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BEF0aiIEDQALCxDaIgJAIANBFGooAgAiAUUNACABQdgAbCEEIANBEGooAgAhAQNAIAEgABDnAyABQdgAaiEBIARBqH9qIgQNAAsLIAMoAjAiAUUNASABIAAQvgEMAQsgAiACKQMYNwM4IAIgAikDEDcDMCACIAIpAwg3AyggAiACKQMANwMgAkAgAS0AFEECRg0AIAEpAwAiBUIDg0IAUg0AIAWnIgAgACgCACIEQX9qNgIAIARBAUcNACAAIAAoAhAQ8B4LIAEoAhgQog0gASACKQM4NwMYIAEgAikDMDcDECABIAIpAyg3AwggASACKQMgNwMACyACQcAAaiQAC/kCAgN/AX4jAEEgayIDJAAgASgCCCEEIANBEGogAiABKAIEIgVBABC1AgJAAkAgAy0AEEEERg0AIAMpAxAiBkL/AYNCBFENACAAIAY3AgAMAQsCQAJAAkAgBUUNACADQRBqIAIgBRDxHSADLQAQQQRGDQAgAykDECIGQv8Bg0IEUg0BCyADQQA2AhAgA0EIaiACIANBEGpBruSaAUEBEOwNIAMtAAhBBEYNASADKQMIIgZC/wGDQgRRDQEgACAGNwIADAILIAAgBjcCAAwBCyADQRBqIAEgAhCNJAJAIAMtABBBBEYNACADKQMQIgZC/wGDQgRRDQAgACAGNwIADAELIANBEGogAhC6FAJAIAMtABBBBEYNACADKQMQIgZC/wGDQgRRDQAgACAGNwIADAELAkACQCAERQ0AIANBEGogAiAEEPEdIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIABBBDoAAAwBCyAAIAY3AgALIANBIGokAAufAwEFfyMAQeAAayICJAAgASgCwAEhAyACQThqIAFBABDAASACKAI8IQQCQAJAIAIoAjgiBUEHRw0AIABBBzYCACAAIAQ2AgQMAQsgAiACKQNYNwMwIAIgAikDUDcDKCACIAIpA0g3AyAgAiACKQNANwMYIAIgBDYCFCACIAU2AhACQCABLQDIAUEXRg0AIAAgAkEQakEo/AoAAAwBCyABEOgRIAJBCGogAUHAABC0GCACKAIMIQQCQCACKAIIQQFxDQACQCABKAJ4QYCBgAFxQYCBgAFHDQAgBBCXEkUNACACIAQQowQgAigCBCEFIAIoAgAhBiACQdGAgIB4NgI4IAEgBiAFIAJBOGoQ9R0LAkAgAS0AeUHAAHFFDQAgASgCvAEhBSACQaqBgIB4NgI4IAEgAyAFIAJBOGoQ9R0LIAEoArwBIQFBCEEoEOogIgUgAkEQakEo/AoAACAAIAE2AhAgACADNgIMIAAgBDYCCCAAIAU2AgQgAEEENgIADAELIABBBzYCACAAIAQ2AgQgAkEQahDJFQsgAkHgAGokAAv1AgEFfwJAAkACQAJAIAAoAgANAAJAIAAoAgwiAQ0AQQAhAkEAIQMMAwtBASECQQEhBAJAIAAoAggoAgAiA0GAAUkNAEECIQQgA0GAEEkNAEEDQQQgA0GAgARJGyEEC0EAIQMgAUUNASAAKAIIIAFBA3RqIgBBeGpFDQFBASECAkACQCAAQXxqKAIAIgBBgAFPDQBBASEBDAELQQIhASAAQYAQSQ0AQQNBBCAAQYCABEkbIQELQQEhAwwCCyAAKAIMIgRBAEchA0EBIQECQCAERQ0AIAAoAgggBEEBdGoiAEF+akUNACAAQX9qLAAAQX9KIQVBASEBQQEhBCADIQIMAwtBASEEIAMhAgwBCwtBASEFCwJAQTQQigEiAA0AQQRBNBCiJAALIABCADcCFCAAQQE2AhAgACABNgIMIAAgAzYCCCAAIAQ2AgQgACACNgIAIABCADcCHCAAQgA3AiQgAEEANgIsIABBADsAMSAAIAU6ADAgAAvQAwMCfwJ+BXwCQAJAAkACQCAAvSIDQoCAgICAgIAIUw0AIANC//////////f/AFYNA0GBeCEBAkAgA0IgiCIEQoCAwP8DUQ0AIASnIQIMAgtBgIDA/wMhAiADpw0BRAAAAAAAAAAADwsCQCAARAAAAAAAAAAAYg0ARAAAAAAAAPC/IAAgAKKjDwsgA0IAUw0BIABEAAAAAAAAUEOivSIDQiCIpyECQct3IQELIAJB4r4laiICQf//P3FBnsGa/wNqrUIghiADQv////8Pg4S/RAAAAAAAAPC/oCIAIAAgAEQAAAAAAADgP6KiIgWhvUKAgICAcIO/IgZEAAAgZUcV9z+iIgcgAkEUdiABarciCKAiCSAHIAggCaGgIAAgBqEgBaEgACAARAAAAAAAAABAoKMiACAFIAAgAKIiByAHoiIAIAAgAESfxnjQCZrDP6JEr3iOHcVxzD+gokQE+peZmZnZP6CiIAcgACAAIABERFI+3xLxwj+iRN4Dy5ZkRsc/oKJEWZMilCRJ0j+gokSTVVVVVVXlP6CioKCioCIARAAAIGVHFfc/oiAAIAagRACi7y78Bec9oqCgoA8LIAAgAKFEAAAAAAAAAACjIQALIAALiAMBCn8jAEEwayICJAAgASgCxAMhAyABKALIAyEEIAEoApAGIQVBACEGIAJBEGogAUG0A2oiByABKAKMBiIIQQAgAhD5ESACKAIUIQkgAigCECEKAkACQAJAAkADQCACQQhqIAcgBSAGIAsQ+REgAigCCCELAkACQCAKQQFHDQAgC0EBcQ0BDAYLIAtBAUYNBSACQRhqIAcgCCAFENMIAkACQCACKAIYIglBA0YNACAAIAIoAiw2AhQgACACKQIkNwIMIAAgAikCHDcCBAwBCyAFIAEoArwDIglPDQMgASgCuAMgBUEUbGpBADYCDEEDIQkLIAAgCTYCACACQTBqJAAPCyAJIARPDQIgAigCDCILIARPDQMgAyALQQlsaiADIAlBCWxqKAABNgABQQEhBiACIAcgCEEBIAkQ+REgAigCBCEJIAIoAgAhCgwACwsgBSAJQbjVgQEQ/hYACyAJIARByNWBARD+FgALIAsgBEHY1YEBEP4WAAtBqPOaAUEoQejVgQEQuSEAC80CAQl/IAFBAXYhAyACIAFBAXRBfmoiBGohBSAAIARqIQYgACABQX5xaiIEQX5qIQcDQAJAAkAgBC0AACIIIAAtAAAiCUYNACAIIAlJIQgMAQsgBC0AASAALQABSSEICyACIAQgACAIGy8AADsAACAIQQF0IQkgCEEBc0EBdCEKAkACQCAGLQAAIgggBy0AACILRg0AIAggC0khCAwBCyAGLQABIActAAFJIQgLIAJBAmohAiAEIAlqIQQgACAKaiEAIAUgByAGIAgbLwAAOwAAIAVBfmohBSAHIAhBAXQiCGshByAIIAZqQX5qIQYgA0F/aiIDDQALIAdBAmohBwJAIAFBAXFFDQAgAiAAIAQgACAHSSIIGy8AADsAACAEIAAgB09BAXRqIQQgACAIQQF0aiEACwJAIAAgB0cNACAEIAZBAmpHDQAPCxC4IwAL/gICCn8BfiMAQYABayICJAACQAJAAkACQCABKAIADQAgASgCGCEDIAEoAhQhBCABKAIQIQUCQCABKQMIIgxCA4NCAFINACAMpyIGIAYo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BDYCACAGQQRqIANB7AJqQcAA/AoAACAGQcQAaiADQbwCakEw/AoAACAGQfQAaiACQST8CgAAIAEgBUEBajYCLCABIAEoAiBBAWo2AiAgAEEEaiADQawDakEk/AoAACAAQSI2AgALIANB0ANqJAAPCyADQQxqQaTTiQFBuNOJARDMHAALQajTiQEQhR4AC/UCAQV/AkAgACgCCCICRQ0AIAAoAgQiAyACQThsaiEEA0ACQAJAAkACQAJAAkAgAygCAA4HBQABAgMFBAULIANBDGooAgAiAEUNBCAAQShsIQIgA0EIaigCACEAA0ACQCAAKAIAQQdGDQAgACABEM4KCyAAQShqIQAgAkFYaiICDQAMBQsLIAMoAgQgARDOCgwDCyADQQxqKAIAIgBFDQIgAEE4bCEFIANBCGooAgAhBkEAIQADQAJAAkACQAJAIAYgAGoiAigCAA4DAAECAAsCQCACQQhqKAIAQQNHDQAgAkEMaigCACABELoBCyACQShqKAIAIAEQzgoMAgsgAkEwaigCACICRQ0BIAIgARC6AQwBCyACQQRqKAIAIAEQzgoLIAUgAEE4aiIARw0ADAMLCyADKAIEIAEQzgogAygCCCABELoBDAELIAMoAgQgARC6AQsCQCADKAIwIgBFDQAgACABELoBCyADQThqIgMgBEcNAAsLC/UCAQV/AkAgACgCCCICRQ0AIAAoAgQiAyACQThsaiEEA0ACQAJAAkACQAJAAkAgAygCAA4HBQABAgMFBAULIANBDGooAgAiAEUNBCAAQShsIQIgA0EIaigCACEAA0ACQCAAKAIAQQdGDQAgACABEM4KCyAAQShqIQAgAkFYaiICDQAMBQsLIAMoAgQgARDOCgwDCyADQQxqKAIAIgBFDQIgAEE4bCEFIANBCGooAgAhBkEAIQADQAJAAkACQAJAIAYgAGoiAigCAA4DAAECAAsCQCACQQhqKAIAQQNHDQAgAkEMaigCACABELoBCyACQShqKAIAIAEQzgoMAgsgAkEwaigCACICRQ0BIAIgARC6AQwBCyACQQRqKAIAIAEQzgoLIAUgAEE4aiIARw0ADAMLCyADKAIEIAEQzgogAygCCCABELoBDAELIAMoAgQgARC6AQsCQCADKAIwIgBFDQAgACABELoBCyADQThqIgMgBEcNAAsLC4sDAQR/IwBB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QQxqQbUGEMMMIQELIAJBEGokACABC+0CAQJ/AkACQAJAAkAgACgCAA4EAwABAgMLIAAoAgRBAUcNAiABLQAADQIgACgCCCABEJcBDwsCQCAAKAIEIgItAGxBAkcNACACQcAAaiEAA0AgACgCGCIALQAsQQJGDQALCwJAIAJBhAFqKAIAIgBFDQAgAEHYAGwhAyACQYABaigCACEAA0ACQAJAAkAgACgCAEF8ag4CAgABCyABLQAADQEgAEEEaigCACABEJcBDAELIAAgARDoBAsgAEHYAGohACADQah/aiIDDQALCwJAIAJBmAFqKAIAIgBFDQAgAEEobCEDIAJBlAFqKAIAIQADQCAAIAEQyAcgAEEoaiEAIANBWGoiAw0ACwsgAi0APCIAQQZGDQEgAEECRw0BIAJBEGohAANAIAAoAhgiAC0ALEECRg0ADAILCyAAKAIMIgNFDQAgA0EobCEDIAAoAgghAANAIAAgARCtByAAQShqIQAgA0FYaiIDDQALCwvlAgEEfyABQcAAaiAAEJoTAkAgASgChAEiAkUNACABKAKAASIDIAJB2ABsaiEEA0ACQAJAIAMoAgAiAkEFRw0AIAMoAgQgABC9AQwBCyACQQRGDQACQAJAAkAgAg4EAwABAgMLIAMoAgRBAUcNAiADKAIIIAAQvQEMAgsgACADKAIEELwJDAELIANBDGooAgAiAkUNACACQShsIQUgA0EIaigCACECA0AgAiAAEOMHIAJBKGohAiAFQVhqIgUNAAsLIANB2ABqIgMgBEcNAAsLAkAgASgCeCIDRQ0AIANBCGooAgAiAkUNACACQQJ0IQIgA0EEaigCACEDA0AgAygCACAAEJoCIANBBGohAyACQXxqIgINAAsLAkAgASgCmAEiA0UNACADQShsIQIgASgClAEhAwNAIAMgABDjByADQShqIQMgAkFYaiICDQALCwJAIAEtADxBBkYNACABQRBqIAAQmhMLC9QCAQ9/IwBBEGsiAiQAQQAhAwJAIAEoAhAiBCABKAIIIgVLDQAgAUEUaiIGIAEtABgiB2pBf2ohCCABKAIEIQkgASgCDCEKIAdBBUkhCwJAAkADQCAEIApJDQMgCSAKaiEMIAgtAAAhDQJAAkAgBCAKayIOQQdLDQBBACEPIA1B/wFxIRBBACENA0ACQCAOIA1HDQAgDiEN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4oMBNwIADAELIAMgASgCCDYCKCADIAEpAgA3AyAgA0EgaiAGIAIQxiEgACAFIANBIGoQiBgMAQsgASgCACAEENsjCyADQTBqJAALwwIBB38jAEEQayICJABBACEDAkACQAJAAkAgACgCAA4CAQADCyACQQhqIABBCGoQkhQgAigCDCIERQ0CIAIoAggiBSAEaiEGIAUhAAJAA0AgAEEBaiEHAkACQCAALAAAIghBf0wNACAHIQAMAQsCQCAIQWBJDQACQCAIQW1HDQAgByAGRg0EIABBAmogBkYNBCAALQABQZ8BSw0HIABBA2ohAAwCCyAHIABBAmogByAGRhsiACAAIAZHaiEAIAhBcEkNASAAIAAgBkdqIQAMAQsgByAAQQJqIAcgBkYbIQALIAAgBkcNAAsLIAVFDQIgBEEDRg0BDAILIAIgAEEIahCTFCACKAIEQQNHDQEgAigCACEFCyAFLwAAIAEvAABzIAVBAmotAAAgAUECai0AAHNyQf//A3FFIQMLIAJBEGokACADC/0CAQN/IwBBwABrIgMkACADIAE2AhggAyACKQIANwIcIAMgAigCCDYCJCADQRxqIQICQAJAIAEtAMgBQd8ARw0AIAEoAsABIQQCQAJAIAEQvA5B/wFxDQAgA0EIaiABELcKIAMoAgwhBSADKAIIQQFxRQ0BIABBEzYCACAAIAU2AgQMAwsgAS0AyAFB3wBHDQEgARC8DkH/AXFBCEcNASADQRBqIAEQtwogAygCFCEFAkAgAygCEEEBcUUNACAAQRM2AgAgACAFNgIEDAMLIAEQqxwaIAAgBDYCCCAAIAU2AgQgAEESNgIAIAAgASgCvAE2AgwMAgsgARCrHBogACAENgIIIAAgBTYCBCAAQRI2AgAgACABKAK8ATYCDAwBCyABKALEASEEIAEoAsABIQUgA0HHgICAeDYCKCAFIAQgA0EoahDGGyEEAkAgAS0AyAFBogFHDQAgASABEKAjEIwUCyAAQRM2AgAgACAENgIECyACEKIhIANBwABqJAAL6QIBBn8jAEEQayIBJAACQAJAAkACQCAAKAIAIgJFDQBBACEDA0ACQCAAKAIIIgQgACgCBCIFTw0AIAIgBGotAABBxQBHDQAgACAEQQFqNgIIDAILAkACQAJAAkACQCADRQ0AIAAoAhAiBkUNACAGQeemmAFB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IgVC/wGDQgRSDQELIANBADYCDCADQRhqIAIgA0EMakGi75oBQQEQ7A0gAy0AGEEERg0BIAMpAxgiBUL/AYNCBFENASAAIAU3AgAMAgsgACAFNwIADAELIANBGGogASACEI0kAkAgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFENACAAIAU3AgAMAQsgA0EYaiACIANBDGpBo++aAUEBEOwNAkAgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFENACAAIAU3AgAMAQsCQAJAIAEoAggiAUUNACADQRhqIAIgARDxHSADLQAYQQRGDQAgAykDGCIFQv8Bg0IEUg0BCyAAQQQ6AAAMAQsgACAFNwIACyADQSBqJAAL0gIBCn8jAEEgayICJAAgAkEEaiABKAIEIAEoAghBEBDtASACKAIMIQMCQAJAIAEtAAxFDQAgAigCCCEEDAELAkAgAyACKAIERw0AIAJBBGoQ2RMLIAIoAggiBCADakEtOgAAIAIgA0EBaiIDNgIMCyACQRBqIAQgA0EBdiIBIAFBmOqaARCQHCACKAIUIQUgAigCECEGIAJBEGogBCADaiABayABIAFBqOqaARCQHCACKAIUIQcgAigCECEIQQAhAyABQX9qIgkhAQJAAkADQCABQX9GDQEgBSADRg0CAkAgCSAHTw0AIAYgA2oiBC0AACEKIAQgCCABaiILLQAAOgAAIAsgCjoAACABQX9qIQEgA0EBaiEDDAELCyABIAdByOqaARD+FgALIAAgAigCDDYCCCAAIAIpAgQ3AgAgAkEgaiQADwsgBSAFQbjqmgEQ/hYAC9cCAQR/IAAoAgAiACgCICABEIYgIABBOGogARCwGyAAKAIsQThsIQIgACgCKCEDQQAhAAJAA0AgAiAARg0BAkACQAJAAkACQAJAAkACQEEEIAMgAGoiBCgCACIFQXxqIAVBBEkbDgcAAQIDBAUGAAsgBEEEaiABEPQcIARBGGooAgAgARCEICAEQRxqKAIAIAEQhiAMBgsgBEEEaiABEPQcIARBGGooAgAgARCEICAEQRxqKAIAIAEQhiAMBQsgBEEQaiABEKslIARBDGooAgAgARCEIAwECyAEQQRqIAEQqyUgBEEQaigCACABEIQgDAMLIARBMGogARCrJSAEIAEQjhsMAgsgBEEQaiABEKslIARBBGogARD0HCAEQRxqKAIAIAEQhCAgBEEgaigCACABEIYgDAELIAEgBEEUaigCACAEQRhqKAIAEIccCyAAQThqIQAMAAsLC9sCAQd/IwBBIGsiAiQAIAAoAgAiAEEAOgAcAkAgACgCCEH/////B08NACAAQQhqIQMgACgCGCEEAkADQCAERQ0BIAJBCGogA0GQp5wBELseIAIoAgwhBQJAIAIoAggiACgCDCIGRQ0AIAAgBkF/ajYCDCAAIAAoAggiBkEBaiIHQQAgACgCACIIIAcgCEkbazYCCCAAKAIEIAZBAnRqKAIAIQAgBSAFKAIAQQFqNgIAIAIgAEEIakGgp5wBELseIAIoAgQhBgJAIAIoAgAiBSgCAEUNACAAQQA6ABwgAkEANgIYIAIgBUEIaiIHNgIUIAIgBzYCECAFKAIAIAJBEGogBSgCBCgCDBEIAA0AIAUQ0xggBUEANgIACyAGIAYoAgBBAWo2AgAgABDRICAEQX9qIQQMAQsLIAUgBSgCAEEBajYCAAsgARDOIiACQSBqJAAPC0GAp5wBEIYeAAv6AgEDfyAAKAI4IQECQCAAKAI8IgJFDQAgASEDA0AgAxDFHiADQRBqIQMgAkF/aiICDQALCyAAKAI0IAFBBEEQENcTIAAoAkAgACgCREEEQQQQ1xMgACgCUCIDIAAoAlQQpRogACgCTCADQQRBDBDXEyAAKAJoIgMgACgCbBCqHSAAKAJkIANBBEEUENcTIAAoAnwhAQJAIAAoAoABIgJFDQAgASEDA0AgAygCACADQQRqKAIAQQRBCBDXEyADQRBqIQMgAkF/aiICDQALCyAAKAJ4IAFBBEEQENcTIAAoAowBIgMgACgCkAEQqx0gACgCiAEgA0EEQQwQ1xMgACgCmAEiAyAAKAKcARCrHSAAKAKUASADQQRBDBDXEyAAKAK8ASAAKALAAUEEQQgQ1xMgACgCzAEgACgC0AFBAUECENcTIAAoAqABIAAoAqQBQQRBCBDXEyAAKAKsASAAKAKwAUEEQRAQ1xMgACgC3AEgACgC4AFBBEEQENcTC9ECAQR/IwBBIGsiAiQAAkACQCAALQAAIgNBIEcNACABKAIAQeyxlwFBAyABKAIEKAIMEQwAIQAMAQtBACEAIAJBADsBCCACQgA3AwAgAkEMaiADEOERQQAgAi0AESIDIAItABAiBGsiBSAFIANLGyEFIAJBDGogBGohBAJAAkACQANAIAUgAEYNASAAQQpGDQIgAiAAaiAEIABqLQAAIgNBYGogAyAAQQFLGyADIANBn39qQf8BcUEGSRs6AAAgAEEBaiEADAALCyACQQxqIAIgABDXBSACKAIMQQFGDQEgAiACKQIQNwIYIAJBATYCECACIAJBGGo2AgwgASgCACABKAIEQc2VgAEgAkEMahDNBiEADAILQQpBCkHMlYUBEP4WAAsgAiACKQIQNwMYQfD9mgFBKyACQRhqQbzZhAFBvJWFARDdFAALIAJBIGokACAAC9ACAgR/AX4jAEEQayICJAACQAJAIAEoAtACIgNBf0wNACAAQQA2AhgCQAJAIAMgACgCCCIESw0AIAAgAzYCCAwBCyAAIAMgBGsQkRALAkACQCADIAAoAhQiBEsNACAAIAM2AhQMAQsgAEEMaiADIARrEJEQC0EAIQMCQCABKALEAiIEKAIQIgVFDQAgBCgCDCAFQQN0aiIEQXhqRQ0AIARBfGooAgAhAwsgACADNgIoIAAgASgC3AJBAXQiBCADIAQgA0sbIgQ2AiwgATUC0AIgA61+IgZCIIinDQEgBqciASAEaiIDIAFJDQECQAJAIAMgACgCJCIBSw0AIAAgAzYCJAwBCyAAQRxqIAMgAWsQkhALIAJBEGokAA8LIAJBPTYCDCACQaDphAE2AghB84uAASACQQhqQbCEhQEQ6xsAC0GsgoUBQSJB0IKFARDsGwALvQICAn8CfgJAIAFFDQADQAJAAkACQAJAIAApAwAiBKdBfmpBACAEQgJWGw4CAQIACyAAQRBqKQMAIgRCA4NCAFINAiAEpyICIAIoAgAiA0F/ajYCACADQQFHDQIgAiACKAIQEPAeDAILAkAgAEEgaikDACIFQgODQgBSDQAgBaciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDwHgsgBEICUQ0BIABBCGohAgJAIARCAFINACACKQMAIgRCA4NCAFINAiAEpyICIAIoAgAiA0F/ajYCACADQQFHDQIgAiACKAIQEPAeDAILIAIQsBIMAQsgAEEQaikDACIEQgODQgBSDQAgBKciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDwHgsgAEHIAGohACABQX9qIgENAAsLC8oCAgF/An4CQAJAAkACQAJAAkAgACgCAA4GAQUFAgMEAAsgACkDECECAkAgACkDCCIDQgODQgBSDQAgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDwHgsgAkIDg0IAUg0EIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNBCAAIAAoAhAQ8B4PCyAAQQhqELESDAMLIAApAxgiAlANAiACQgODQgBSDQIgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0CIAAgACgCEBDwHg8LIAApAxAgACgCGBDSFg8LIAApAxAhAgJAIAApAwgiA0IDg0IAUg0AIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQ8B4LIAJCA4NCAFINACACpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEPAeDwsLwAICAn8BfgJAAkACQAJAIAAtACwiAkF9akEBIAJBAksbQf8BcQ4DAAECAAsgAS0AkAENASAAKAIQIgNFDQECQCAAKQMAIgRCA4NCAFINACAEpyIAIAAoAgAiAEEBajYCACAAQX9MDQMLIAFBgAFqIAQgAxCiBxoPCyAAQRhqIQMCQCACQQJGDQAgAS0AkAENASAAKAIoIgBFDQECQCADKQMAIgRCA4NCAFINACAEpyIDIAMoAgAiA0EBajYCACADQX9MDQMLIAFBgAFqIAQgABCiBxoPCwNAIAMoAgAiAEEYaiEDIAAtACxBAkYNAAsgAS0AkAENACAAQShqKAIAIgBFDQACQCADKQMAIgRCA4NCAFINACAEpyIDIAMoAgAiA0EBajYCACADQX9MDQILIAFBgAFqIAQgABCiBxoLDwsAC9ICAQl/AkACQAJAAkACQCACIAEoAggiBE8NACABKAIEIAJBFGxqIgQoAgQNASAEKAIADQIgAUEMaiEFIAEoAhQiBkEJbCEHIAJBFGwhCEEAIQlBACEKA0ACQCAGIgQgBSgCAEcNACAFEJoaCyABIARBAWoiBjYCFCABKAIQIgsgB2oiDCAKOgAAIAxBBWpBADYAACAMQQFqIAM2AAACQAJAIAlFDQAgCSAESw0GIAsgCUEJbGogBDYABQwBCyACIAEoAggiCU8NBiABKAIEIAhqIAQ2AgALIAdBCWohByAEIQkgCkH/AXFBAWoiCkH/AXEgCkYNAAsgAEEDNgIADwsgAiAEQezagQEQ/hYACyAEQQRqQfzagQFBN0GY24EBELUcAAsgBEGo24EBQcEAQcjbgQEQtRwACyAJIAZB2NuBARD+FgALIAIgCUHo24EBEP4WAAvwAgECfyMAQSBrIgIkAAJAAkAgACgCAEGAgICAeEcNACACIAAoAgQ2AgggAiABKAIAQYTPhAFBDiABKAIEKAIMEQwAOgAcIAIgATYCGCACQQA6AB0gAkEANgIUIAJBFGogAkEIakHdABCeDBDcECEBDAELIAIgADYCBCACQQA2AhwgAkKAgICAEDcCFCACQRRqQf4AQc8AEOIRIAIgAigCHDYCECACIAIpAhQ3AwgCQCABKAIAIgBB/M6EAUEIIAEoAgQiASgCDCIDEQwADQAgAkECNgIYIAIgAkEIajYCFCAAIAFBnLaBASACQRRqEM0jDQAgAkH3ADYCGCACIAJBBGo2AhQgACABQZy2gQEgAkEUahDNIw0AIAJBAjYCGCACIAJBCGo2AhQgACABQZy2gQEgAkEUahDNIw0AIABBp+2aAUEBIAMRDAANACACQQhqEN4jQQAhAQwBCyACQQhqEN4jQQEhAQsgAkEgaiQAIAELygIBA38jAEEQayIFJAACQAJAAkAgAg0AQQAhASAFQQA2AgwgBUKAgICAEDcCBEEBIQZBACEHDAELIAIQigEiBkUNAQJAIAJFDQAgBiABIAL8CgAACyAFIAI2AgwgBSAGNgIIIAUgAjYCBCAGIAJqQX9qLQAAQS9HIQcgAiEBCwJAAkACQAJAAkAgBEUNACADLQAAQS9GDQELAkAgB0UNACAFQQRqIAJBARD4ECAFKAIIIgYgBSgCDCICakEvOgAAIAUgAkEBaiICNgIMIAUoAgQhAQsgBCABIAJrSw0BIAQNAgwDC0EAIQIgBUEANgIMIAQgAU0NAQsgBUEEaiACIAQQ+BAgBSgCCCEGIAUoAgwhAgsgBEUNACAGIAJqIAMgBPwKAAALIAAgBSkCBDcCACAAIAIgBGo2AgggBUEQaiQADwtBASACEP4gAAvIAgICfwJ+AkACQAJAAkACQAJAIAAoAgAOBgEFBQIDBAALAkAgACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDwHgsgACkDECIDQgODQgBSDQQgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0EIAAgACgCEBDwHg8LIABBCGoQsBIMAwsgACkDGCIDUA0CIANCA4NCAFINAiADpyIAIAAoAgAiAUF/ajYCACABQQFHDQIgACAAKAIQEPAeDwsgACkDECAAKAIYENAWDwsgACkDECEDAkAgACkDCCIEQgODQgBSDQAgBKciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDwHgsgA0IDg0IAUg0AIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQ8B4PCwu4AgIEfwF+AkACQCAAKQMIIgZCA4NCAFINACAGpyICIAIoAgAiAkEBajYCACACQX9MDQELIAFBDGogBhCVBxoCQCAAKAIgIgJFDQAgAkEIaigCACIDRQ0AIANBMGwhAyACQQRqKAIAIQIDQCACIAEQ6BMgAkEwaiECIANBUGoiAw0ACwsCQCAAKAJAIgJFDQAgACgCPCIEIAJBBHRqIQUDQCAEKAIAIAEQvQECQCAEKAIMIgJFDQAgAkEIaigCACIDRQ0AIANBAnQhAyACQQRqKAIAIQIDQCACKAIAIAEQmgIgAkEEaiECIANBfGoiAw0ACwsgBEEQaiIEIAVHDQALCwJAIAAoAiwiAkUNACACQThsIQMgACgCKCECA0AgAiABEPMCIAJBOGohAiADQUhqIgMNAAsLDwsAC+MCAQd/IwBBIGsiByQAAkAgASgCSCIIRQ0AQQAhCQJAAkAgASgCECIKDQAMAQsgASgCDCAKQQJ0akF8aiIKRQ0AIAooAgAhC0EBIQkLIAEoAkAhDCABKAI8IQ0gCCgCCCEKAkACQCACRQ0AIAcgAiADELwUIAgoAgghAgwBCyAHQYCAgIB4NgIAIAohAgsgAUEIaiEDIAcgBigCCDYCHCAHIAYpAgA3AhQCQCACIAgoAgBHDQAgCBDSGgsgCCgCBCACQcQAbGoiAUEANgIIIAEgCzYCBCABIAk2AgAgASAHKQIMNwIMIAEgBykCFDcCFCABIAcoAhw2AhwgAUEANgIoIAFCgICAgMAANwIgIAEgBykCADcCLCABIAcoAgg2AjQgASAEOgBCIAFBADoAQSABIAU6AEAgASAMNgI8IAEgDTYCOCAIIAJBAWo2AgggAyAKEMUdCyAAQQQ6AAAgB0EgaiQAC+oCAQV/IwBBIGsiAyQAAkACQCACLQAMIgRBAUcNACAAIAEpAgg3AgggACABKQIANwIAIAIoAgAgAigCBBDbIwwBCwJAAkACQAJAAkACQCABLQAMIgUOAwEAAgELIAAgAikCCDcCCCAAIAIpAgA3AgAgASgCBCEGDAQLIARFDQEMAgsgBEUNAQsgA0EQaiABIAIQjhIgACAFIANBEGoQiBgMAgsCQAJAAkAgASgCBCIGIAEoAgggAigCBCIHIAIoAggQxBxB/wFxDgIBAgALIAMgAigCCDYCGCADIAIpAgA3AxAgA0EEaiADQRBqIAEQwR4gACAEIANBBGoQiBgMAwsgAEEAKQKA44MBNwIIIABBACkC+OKDATcCACACKAIAIAcQ2yMMAQsgAyABKAIINgIYIAMgASkCADcDECADQQRqIANBEGogAhDBHiAAIAUgA0EEahCIGAwBCyABKAIAIAYQ2yMLIANBIGokAAvYAgEDfyMAQRBrIgEkAAJAIAAoAgQiAigCIEEBRw0AIAIoAigiAyADKAIAIgNBf2o2AgAgA0EBRw0AIAIoAiggAkEsaigCABC5GwsgAkEANgIgIAAQwwQCQCAAKAIAKAKABSgC0AIiAEF/TA0AIAJBADYCSAJAAkAgACACKAI4IgNLDQAgAiAANgI4DAELIAJBMGogACADaxCREAsCQAJAIAAgAigCRCIDSw0AIAIgADYCRAwBCyACQTxqIAAgA2sQkRALIAJBADYCZAJAAkAgACACKAJUIgNLDQAgAiAANgJUDAELIAJBzABqIAAgA2sQkRALAkACQCAAIAIoAmAiA0sNACACIAA2AmAMAQsgAkHYAGogACADaxCREAsgAkEANgKwASACQQA2AmwgAUEQaiQADwsgAUE9NgIMIAFBoOmEATYCCEHzi4ABIAFBCGpBsISFARDrGwALggMBBH8Df0EAIQFBKCECQQEhAwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiBEF0akEHIARBC0sbDiYMEBAMAAEJAhIMCQMMBAwFEAkGDAwMDBAMDBAQEBAJCQkJCRAIDAwLIAAtABBBA0sPCyAALQARDQlBDCECDBALQQQhAkEAIQNBACEBAkACQCAEDgwNAA0PAREREQ0RDwsNC0EoIQIMEAsgAEEEahCdIA8LIAAtABhBBUcNAyAAQRBqIQAMDQsgACgCDEUNBiAAKAIIIQAMDAsgACgCCEF/akEESQ8LIAAtAChFDQMLQQEhAwwECyAAQQRqEJ0gDwtBBCECDAgLIAAoAgxBAUYNAgtBACEDCyADDwsgAEEIaiEAAkADQAJAIAAoAgAiACgCAA4HAwQEBAADAgMLIABBBGohAAwACwsgAEEEaiEADAMLQQEPC0EAIQELIAEPCyAAKAIAIQAMAQsgACACaigCACEADAALC+0CAgV/AX4jAEEgayICJAAgAUGwAWohAyABKAKwASEEAkACQCABKAKIASIFQQtHDQAgAkEIaiABEMQBDAELIAFBCzYCiAEgAiABKQKYATcDCCACIAEoAqABNgIQIAFBjAFqIQYCQCABKAIIQQpGDQAgAUEIahDACwsgASAFNgIIIAEgBikCADcCDCABIAYoAgg2AhQLIAEgASgCtAEiBTYCrAEgASABKAKwATYCqAEgAyACKQMINwIAIAMgAigCEDYCCAJAAkAgBSABKAKwAUcNACACQQhqIAEQtggCQCACKQMIIgdQRQ0AIAIoAhAhASAAQgA3AwAgACABNgIIDAILIAAgBDYCCCAAIAc3AwAgACABKAKsATYCDAwBCyACQd2AgIB4NgIIIAQgBSACQQhqEMYbIQMCQCABLQC4AUGiAUcNACABEMsUIQUgARC1ECABIAUQkQkLIABCADcDACAAIAM2AggLIAJBIGokAAu5AgEJfyAAIABBJGooAgAiAiAAQQxqKAIAIgNJQRhsaiIEIABByABBMCAAQdQAaigCACAAQTxqKAIASSIFG2oiBiAAIAIgA09BGGxqIgIgAEEwQcgAIAUbaiIAQQxqKAIAIAJBDGooAgBJIgMbIAZBDGooAgAgBEEMaigCAEkiBRsiB0EMaigCACEIIAAgAiAGIAUbIAMbIglBDGooAgAhCiABIAYgBCAFGyIGKQIQNwIQIAEgBikCCDcCCCABIAYpAgA3AgAgASAJIAcgCiAISSIEGyIGKQIQNwIoIAEgBikCCDcCICABIAYpAgA3AhggASAHIAkgBBsiBikCEDcCQCABIAYpAgg3AjggASAGKQIANwIwIAEgAiAAIAMbIgApAgA3AkggASAAKQIINwJQIAEgACkCEDcCWAu3AgIEfwN+IwBBIGsiAiQAQRQhAwJAIAApAwAiBiAGQj+HIgeFIAd9IghC6AdUDQBBFCEDA0AgAkEMaiADaiIAQXxqIAgiByAHQpDOAIAiCEKQzgB+faciBEH//wNxQeQAbiIFQQF0LwC4q5gBOwAAIABBfmogBCAFQeQAbGtB//8DcUEBdC8AuKuYATsAACADQXxqIQMgB0L/rOIEVg0ACwsCQCAIQglYDQAgAkEMaiADQX5qIgNqIAinIgAgAEH//wNxQeQAbiIAQeQAbGtB//8DcUEBdC8AuKuYATsAACAArSEICwJAAkAgBlANACAIUA0BCyACQQxqIANBf2oiA2ogCKdBAXQtALmrmAE6AAALIAEgBkJ/VUEBQQAgAkEMaiADakEUIANrEM8GIQMgAkEgaiQAIAMLgwMBAX8jAEGQAWsiAiQAIAJBsKGFATYCiAEgAkGsqYUBNgKAASACQayphQE2AnggAkGsqYUBNgJwIAJBzKmFATYCaCACQcyphQE2AmAgAkGsqYUBNgJYIAJBrKmFATYCUCACQZSZhQE2AkggAkHMqYUBNgJAIAJBzKmFATYCOCACQdCuhQE2AjAgAkGIoYUBNgIoIAJBrKmFATYCICACQayphQE2AhggAkGcpYUBNgIQIAIgADYCRCACIABBwQBqNgJ8IAIgAEHAAGo2AnQgAiAAQT9qNgJsIAIgAEEgajYCZCACIABBGGo2AlwgAiAAQT5qNgJUIAIgAEE9ajYCTCACIABBEGo2AjwgAiAAQQhqNgI0IAIgAEHCAGo2AiwgAiAAQShqNgIkIAIgAEE8ajYCHCACIABBO2o2AhQgAiAAQTpqNgIMIAIgAEE4ajYCjAEgAiACQYwBajYChAEgAUGYoYUBQQZB4K+FAUEQIAJBDGpBEBDDCyEAIAJBkAFqJAAgAAvTAgIDfwF+AkACQCAAKQMwQgBSDQAgACkDOCIEQgODQgBSDQEgBKciASABKAIAIgJBf2o2AgAgAkEBRw0BIAEgASgCEBDwHgwBCyAAQTBqEPUSCwJAIAAoAgAiAUEERg0AAkACQAJAAkAgAQ4EAQIDAAELIAAoAgghAwJAIAAoAgwiAkUNACADIQEDQCABEPMMIAFBKGohASACQX9qIgINAAsLIAAoAgQgA0EIQSgQ1RMPCyAAQQhqELASDwsgACgCBEUNASAAKAIIIgEQnAEgAUHAAEEIENwUDwsgACgCBCIAQcAAahCYDSAAQZQBaigCACEBAkAgACgCmAEiAkUNAANAIAEQ8wwgAUEoaiEBIAJBf2oiAg0ACyAAQZQBaigCACEBCyAAKAKQASABQQhBKBDVEwJAIAAtADxBBkYNACAAQRBqEPoTCyAAQaABQQgQ3BQLC6wCAQd/IwBBEGsiAyQAQQAhBAJAAkACQAJAIAAoAgAOAgABAwsgA0EIaiAAQQhqEJMUIAMoAgwgAkcNAiADKAIIIQUMAQsgAyAAQQhqEJIUIAMoAgAhBQJAIAMoAgQiBkUNACAFIAZqIQcgBSEAA0AgAEEBaiEIAkACQCAALAAAIglBf0wNACAIIQAMAQsCQCAJQWBJDQACQCAJQW1HDQAgCCAHRg0EIABBAmogB0YNBCAALQABQZ8BSw0GIABBA2ohAAwCCyAIIABBAmogCCAHRhsiACAAIAdHaiEAIAlBcEkNASAAIAAgB0dqIQAMAQsgCCAAQQJqIAggB0YbIQALIAAgB0cNAAsLIAVFDQEgBiACRw0BCyAFIAEgAhC6GEUhBAsgA0EQaiQAIAQLxAICA38BfiMAQRBrIgMkACABKAIsIQQgA0EIaiACIAEoAigiBUEAELUCAkACQCADLQAIQQRGDQAgAykDCCIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAAkACQCAFRQ0AIANBCGogAiAFEPEdIAMtAAhBBEYNACADKQMIIgZC/wGDQgRSDQELIANBCGogAiAFIAQgASgCNCABKAI4EMoGIAMtAAhBBEYNASADKQMIIgZC/wGDQgRRDQEgACAGNwIADAILIAAgBjcCAAwBCyADQQhqIAEgAhC7BwJAIAMtAAhBBEYNACADKQMIIgZC/wGDQgRRDQAgACAGNwIADAELAkACQCAERQ0AIANBCGogAiAEEPEdIAMtAAhBBEYNACADKQMIIgZC/wGDQgRSDQELIABBBDoAAAwBCyAAIAY3AgALIANBEGokAAu3AgEHfyMAQRBrIgIkAEEKIQMCQCAAKAIAIgQgBEEfdSIAcyAAayIFQegHSQ0AQQohAwNAIAJBBmogA2oiBkF8aiAFIgAgAEGQzgBuIgVBkM4AbGsiB0H//wNxQeQAbiIIQQF0LwC4q5gBOwAAIAZBfmogByAIQeQAbGtB//8DcUEBdC8AuKuYATsAACADQXxqIQMgAEH/rOIESw0ACwsCQAJAIAVBCUsNACAFIQAMAQsgAkEGaiADQX5qIgNqIAUgBUH//wNxQeQAbiIAQeQAbGtB//8DcUEBdC8AuKuYATsAAAsCQAJAIARFDQAgAEUNAQsgAkEGaiADQX9qIgNqIABBAXQtALmrmAE6AAALIAEgBEF/c0EfdkEBQQAgAkEGaiADakEKIANrEM8GIQMgAkEQaiQAIAMLtwIBCH8jAEEQayIBJAAgACgCBCECAkAgACgCCCIDRQ0AIAIgA0ECdGpBfGoiBEUNACAEKAIADQAgA0ECdCEEIAJBfGohBSADQf////8DcSEGAkADQCAGIQcCQCAEDQBBACEHDAILIAdBf2ohBiAFIARqIQggBEF8aiEEIAgoAgBFDQALIAcgA0sNAQsgACAHNgIIIAchAwsCQCADIAAoAgAiBEECdk8NAAJAAkAgBA0AQQAhBCABQQxqIQcMAQsgAUEENgIMIARBAnQhBCABQQhqIQcLIAcgBDYCACABKAIMIgRFDQAgASgCCCEHAkACQCADDQAgAiAEIAcQ6SFBBCEHDAELIAIgByAEIANBAnQiBhC8BCIHDQAgBCAGEP4gAAsgACADNgIAIAAgBzYCBAsgAUEQaiQAC7YCAQZ/IwBBIGsiAyQAAkACQCACRQ0AIAEoAgghBCABKAIEIQUCQCACQYCABEkNACAEQQJ0IQYgBUF8aiEHQQAhBANAIAZFDQMgA0EIaiAEIAcgBmoiBSgCACACEOYaIAMoAgwhBCAFIAMoAgg2AgAgBkF8aiEGDAALCyAEQQJ0IQYgBUF8aiEIQQAhBANAIAZFDQIgCCAGaiIFIAUoAgAiBUEQdiIHIAcgBEEQdHIgAm4iBCACbGtBEHQgBUH//wNxciIFIAJuIgcgBEEQdHI2AgAgBSAHIAJsayEEIAZBfGohBgwACwtBqOmDAUEzQcTqgwEQ6xsACyADIAEoAgg2AhggAyABKQIANwMQIANBEGoQhgogACAENgIMIAAgAygCGDYCCCAAIAMpAxA3AgAgA0EgaiQAC/YCAQJ/IwBBIGsiAiQAAkACQAJAAkACQAJAAkACQCAAKAIAIgAtAAAOBAMAAQIDCyACIAAoAgQ2AhwgAkEHNgIQIAIgAkEcajYCDCABKAIAIAEoAgRBi4SAASACQQxqEM0GIQEMBgsgAiAAKAIENgIcIAJBBzYCECACIAJBHGo2AgwgASgCACABKAIEQa6lgQEgAkEMahDNBiEBDAULIAAoAgQOAwECAwELIAAtAAEhAyACIAAoAgQ2AhwgAiADOgALIAJBBzYCGCACQYYBNgIQIAIgAkEcajYCFCACIAJBC2o2AgwgASgCACABKAIEQaqEgAEgAkEMahDNBiEBDAMLIAEoAgBBz6yFAUEwIAEoAgQoAgwRDAAhAQwCCyABKAIAQf+shQFBLiABKAIEKAIMEQwAIQEMAQsgAiAAKAIINgIcIAJBBzYCECACIAJBHGo2AgwgASgCACABKAIEQcengQEgAkEMahDNBiEBCyACQSBqJAAgAQu/AgEEf0EfIQICQCABQYCAgAhPDQAgAUEmIAFBCHZnIgJrdkEBcSACQQF0ckE+cyECCyAAQgA3AhAgACACNgIcIAJBAnRBgJGdAWohAwJAQQAoApyUnQFBASACdCIEcQ0AIAMgADYCACAAIAM2AhggACAANgIMIAAgADYCCEEAQQAoApyUnQEgBHI2ApyUnQEPCwJAAkACQCADKAIAIgQoAgRBeHEgAUcNACAEIQIMAQsgAUEAQRkgAkEBdmsgAkEfRht0IQMDQCAEIANBHXZBBHFqIgUoAhAiAkUNAiADQQF0IQMgAiEEIAIoAgRBeHEgAUcNAAsLIAIoAggiAyAANgIMIAIgADYCCCAAQQA2AhggACACNgIMIAAgAzYCCA8LIAVBEGogADYCACAAIAQ2AhggACAANgIMIAAgADYCCAvdAgEHfyMAQSBrIgIkACABIAEoAmgiA0EBajYCaCABIAEoAlwiBEF/aiIFNgJcIAEgASgCWCIGQQFqIgc2AlhBDiEIAkACQCAFRQ0AAkACQCAHLQAAQVNqDhEBAgICAgICAgICAgICAgICAAILIAEgA0ECajYCaCABIARBfmo2AlwgASAGQQJqNgJYQSAhCAwBCyABIANBAmo2AmggASAEQX5qIgU2AlwgASAGQQJqIgc2AlhBHiEIIAEtABxFDQAgBUUNACAHLQAAQT5HDQAgASADQQNqNgJoIAEgBEF9ajYCXCABIAZBA2o2AlggAkGmgICAeDYCCCABIAMgAkEIahCyESABQQAQ0AIgARC8GiABQQA6AIUBAkAgASgCXA0AIABBgMYCOwEADAILIAAgASABKAJYLQAAQQJ0KALAuJkBEQcADAELIABBADoAACAAIAg6AAELIAJBIGokAAvVAgIHfwF+IwBBEGsiAiQAIAEpAgAhCSABQQA2AgAgAiABKQIINwMIIAIgCTcDACAAIAEQowUCQCABKAIARQ0AIAEgABD9CCABKAIAIgNFDQAgASgCBCIERQ0AAkAgASgCDCIFRQ0AIANBCGohBiADKQMAQn+FQoCBgoSIkKDAgH+DIQkgAyEHA0ACQCAJQgBSDQADQCAGIghBCGohBiAHQYB+aiEHIAgpAwBCgIGChIiQoMCAf4MiCUKAgYKEiJCgwIB/UQ0ACyAJQoCBgoSIkKDAgH+FIQkLIAcgCXqnQQJ0QeADcWtBYGoQtRIgCUJ/fCAJgyEJIAVBf2oiBQ0ACwsgBCAEQQV0QSdqQWBxIgdqQQlqIgZFDQAgAyAHayAGQQgQ3BQLIAEgAikDCDcCCCABIAIpAwA3AgACQCAAKAIwIgdFDQAgASAHEIYBCyACQRBqJAALugICCH8FfiMAQTBrIQNBASEEAkAgASAAKAIIIgVNDQAgASAFayEGIAVBMGwhBSACKAIEIQEgAigCDCEHA0BBACEEIAEgB0YNASACIAFBMGoiCDYCBCABKAIAIglBE0YNASABQQRqKQIAIQsgAUEMaikCACEMIAFBFGopAgAhDSABQRxqKQIAIQ4gAUEkaikCACEPIAFBLGooAgAhCiAAKAIEIAVqIgEgCTYCACABQSxqIAo2AgAgAUEkaiAPNwIAIAFBHGogDjcCACABQRRqIA03AgAgAUEMaiAMNwIAIAFBBGogCzcCAEEBIQQgACAAKAIIQQFqNgIIIAMgCjYCKCADIA83AyAgAyAONwMYIAMgDTcDECADIAw3AwggAyALNwMAIAVBMGohBSAIIQEgBkF/aiIGDQALCyAEC9MCAQZ/AkAgACgCCCIBRQ0AIAAoAgQhAkEAIQMDQAJAAkACQAJAAkAgAiADQShsaiIEKAIADgQBAgMAAQsgBEEEahCdESAEKAIEIARBCGooAgBBCEE4ENUTIAQoAhgiAEUNAyAAKAIAIgUQ3wIgBUHgAEEIENwUIABBDEEEENwUDAMLIARBCGoQ7RQMAgsgBEEIaiIGKAIAIQACQCAEKAIMIgVFDQADQAJAIAAoAgBBB0YNACAAEKMICyAAQShqIQAgBUF/aiIFDQALIAYoAgAhAAsgBCgCBCAAQQhBKBDVEyAEKAIYIgBFDQEgACgCACIFEN8CIAVB4ABBCBDcFCAAQQxBBBDcFAwBCyAEKAIEIgAQowggAEEoQQgQ3BQgBCgCGCIARQ0AIAAoAgAiBRDfAiAFQeAAQQgQ3BQgAEEMQQQQ3BQLIANBAWoiAyABRw0ACwsL7AIBBn8jAEHAAGsiAiQAIAEoArABIQMCQAJAAkAgAS0AuAEiBEEYRg0AQQAhBUEEIQZBACEHDAELIAIgAUEBEN0BIAIoAgQhBgJAIAIoAgAiBUGAgICAeEYNACACKAIIIQcgAS0AuAEhBAwBCyAAQRM2AgAgACAGNgIEDAELAkACQCAEQf8BcUGof2oOCAEAAAAAAAABAAsgASABKAJ4IgRB///7/35xQYCAgIABcjYCeCACIAc2AjwgAiAGNgI4IAIgBTYCNCACIAEgA0EAIAJBNGoQQiABIAQ2AngCQCACKAIAQRNHDQAgACACKAIENgIEIABBEzYCAAwCCyAAIAIpAyg3AyggACACKQMgNwMgIAAgAikDGDcDGCAAIAIpAxA3AxAgACACKQMINwMIIAAgAikDADcDAAwBCyACIAc2AgwgAiAGNgIIIAIgBTYCBCACIAE2AgAgACABIAJBBGoQ4wMLIAJBwABqJAAL8AIBAX8CQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOCgABAgMEBQYHCAkKCyAAQQhqEKkVDwsgACgCKCIBEIgCIAFBwABBCBDcFCAAQQhqEIIRDwsgAEEIahD0Fg8LIAAoAgQiABCIAiAAQcAAQQgQ3BQPCwJAAkAgACgCBCIAKAIAQQNGDQAgABC8DwwBCyAAQQRqEOMYCyAAQShBCBDcFA8LIAAoAgQiARCIAiABQcAAQQgQ3BQgACgCCCIAEKoEIABB4ABBCBDcFA8LIAAoAgQiARCIAiABQcAAQQgQ3BQgACgCCCIAEKoEIABB4ABBCBDcFA8LIAAoAgQiABCIAiAAQcAAQQgQ3BQPCyAAKAIEIgEQiAIgAUHAAEEIENwUIAAoAggiABCqBCAAQeAAQQgQ3BQPCyAAKAIEIgEQiAIgAUHAAEEIENwUIAAoAggiABD+GyAAKAIAIABBBGooAgAQ9CMgAEEUQQQQ3BQLC6kCAgF/AX4jAEEgayIEJAACQAJAAkAgACACSw0AIAEgAksNAUEHrUIghiEFIAAgAU0NAiAEIAA2AgggBCABNgIMIAQgBSAEQQxqrYQ3AxggBCAFIARBCGqthDcDEEHbhIABIARBEGogAxDrGwALIAQgADYCCCAEIAI2AgwgBEEHrUIghiIFIARBDGqthDcDGCAEIAUgBEEIaq2ENwMQQYKJgAEgBEEQaiADEOsbAAsgBCABNgIIIAQgAjYCDCAEQQetQiCGIgUgBEEMaq2ENwMYIAQgBSAEQQhqrYQ3AxBBu4mAASAEQRBqIAMQ6xsACyAEIAE2AgggBCACNgIMIAQgBSAEQQxqrYQ3AxggBCAFIARBCGqthDcDEEG7iYABIARBEGogAxDrGwALswIBBH8jAEEQayIFJAAgAiAEayIGIAQgBiAESxshB0EBIQgCQAJAIARBAXQgAk8NAAJAAkAgAiAESQ0AIAMgBksNASADIARJDQIgBUEIaiADIARrIAEgBGogA0GM4YMBENEdIAUoAgwgBEcNAiAFKAIIIQICQANAAkAgBEEDSw0AQQEhCAJAIARBAU0NACACLwAAIAEvAABHDQYgBEF+aiEEIAFBAmohASACQQJqIQILIAQNAkEAIQgMBgsgAigAACABKAAARw0EIARBfGohBCABQQRqIQEgAkEEaiECDAALCyAHIAMgAi0AACABLQAARyIIGyEDDAMLQdT9mgFBE0Hc4IMBEOsbAAtBACADIAZB7OCDARCQCgALIAchAwsgACADNgIEIAAgCDYCACAFQRBqJAALxgIBAn8jAEEgayIGJAACQAJAAkACQAJAIAEoAhwiBw0AIAUgA0sNAiAGIAEgAiAFIAQQtQkMAQsgBSAESQ0CIAUgA0sNAgJAIAUgBGsgASgCKEkNACAGQRBqIAcgASgCICIBKAIIQX9qQXhxakEIaiACIARqIAIgBWogASgCEBEOAAJAIAYoAhANACAGQQA2AgAMAgsgBigCGCACayIFIAYoAhwgAmsiAUsNBCAGIAYoAhQ2AgwgBiABNgIIIAYgBTYCBCAGQQE2AgAMAQsgBiABIAIgAyAEIAUQ7R4LQQAhBQJAIAYoAgBBAUcNACAAIAYoAgw2AgwgACAGKQIENwIEQQEhBQsgACAFNgIAIAZBIGokAA8LQQAgBSADQYzShAEQkAoACyAEIAUgA0H80YQBEJAKAAtB/NaEAUElQaDXhAEQ6xsAC9ICAQR/IwBBIGsiAiQAAkACQAJAAkACQCAAKAIADQAgACgCECIADQEMAwsgAkEIaiAAEIMMAkAgAigCCCIDDQAgAi0ADCEBAkAgACgCECIERQ0AQQEhAyAEQejIlwFB2MiXASABQQFxIgUbQRlBECAFGxCdBw0FCyAAIAE6AARBACEDIABBADYCAAwECyACQQhqIAMgAigCDCIEEL8IAkACQCACKQMIQgFSDQAgAiACKQMQNwMYIAAoAhAiAEUNBCACQRhqIAAQqwoNAQwDCyAAKAIQIgBFDQMgAEGwzJcBQQIQnQcNACAAIAMgBBCdB0UNAgtBASEDDAMLIABBr+6aAUEBEJ0HIQMMAgsgAC0ACkGAAXENACACIAEQthoCQCACKAIAIgNFDQAgACADIAIoAgQQnQchAwwCC0G0zJcBEMQjAAtBACEDCyACQSBqJAAgAwvhAgEBfyMAQSBrIgIkAAJAAkACQAJAAkACQCAALQAADgQAAQIDAAsgAiAAKAIENgIAQRQQigEiAEUNBCAAQQAoAIS6mAE2ABAgAEEAKQD8uZgBNwAIIABBACkA9LmYATcAACACQRQ2AgwgAiAANgIIIAJBFDYCBCACQfcBrUIghiACrYQ3AxggAkH4Aa1CIIYgAkEEaq2ENwMQIAEoAgAgASgCBEHOsYEBIAJBEGoQzQYhACACKAIEIgFFDQMgAigCCCABQQEQ3BQMAwsgAiAALQABQQJ0IgAoApjknAE2AgggAiAAKALA5ZwBNgIEIAJBEa1CIIYgAkEEaq2ENwMQIAEoAgAgASgCBEHNlYABIAJBEGoQzQYhAAwCCyABIAAoAgQiACgCACAAKAIEEJ0HIQAMAQsgACgCBCIAKAIAIAEgACgCBCgCEBEIACEACyACQSBqJAAgAA8LQQFBFBD+IAAL1wICB38BfiMAQSBrIgEkAEHcACECQQAhA0EAIQRBASEFAkADQAJAAkAgA0EBcUUNACAEQQJGDQMgBEH+qIEBaiEGDAELIAQNAkH/qIEBIQZBASEEC0EBIQMgBUEBdCEFIARBAWohBCACQQF0IAYtAABqIQIMAAsLQf6ogQFBAhD/HCEIIAFBGGpB/qiBAUECQQAQ3AsgASgCHCEDIAEoAhghBCABQRBqQf6ogQFBAkEBENwLIAFBCGpB/qiBAUECIAMgASgCFCAEIAEoAhAiBksiBxsgBCAGIAcbIgQQkQogASgCCCEDIABBAjYCQCABKAIMIQYgAEH+qIEBNgI8IABBADYCOCAAQTA2AjAgACAFNgIsIAAgAjYCKCAAQYACOwEgIABBgYCA4AU2AhwgAEEvNgIYIAAgBDYCECAAIAg3AwggACAGNgIEIAAgAzYCACABQSBqJAAL5wICBX8CfiMAQRBrIgIkAAJAIAEoArABIgMgASgCbCIESQ0AIAEoArQBIgUgASgCcEsNACABKAJgIAMgBGtqIAUgA2sQjRkhByABKQMIIQggAUEKNgIIIAIgASkDEDcDCCACIAg3AwACQAJAIAinIgRBCkYNACAEQQRGDQEgAhDACwtBqPOaAUEoQbiImwEQuSEACyABQbABaiEEIAIpAwghCAJAAkAgASgCiAEiBkELRw0AIAIgARDEASABKAK0ASEFIAEoArABIQYMAQsgAUELNgKIASABIAY2AgggASABKQKMATcCDCABIAEoApQBNgIUIAIgASkCmAE3AwAgAiABKAKgATYCCCADIQYLIAEgBTYCrAEgASAGNgKoASAEIAIpAwA3AgAgBCACKAIINgIIIAAgBTYCDCAAIAM2AgggACAHNwMQIAAgCDcDACACQRBqJAAPC0H0jpsBQdYAQcyPmwEQuSEAC94CAQJ/IwBBEGsiAiQAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiACgCACIDQX5qQQEgA0EBSxsOCAABAgMEBQYHAAsgAiAAQQhqNgIMIAFB0MmZAUEEIAJBDGpB+wIQwwwhAAwHCyACIAA2AgwgAUHUyZkBQQggAkEMakHSBBDDDCEADAYLIAIgAEEIajYCDCABQaemmgFBAyACQQxqQdMEEMMMIQAMBQsgAiAAQQhqNgIMIAFB3MmZAUEHIAJBDGpB+wIQwwwhAAwECyACIABBBGo2AgwgAUGmqpoBQQUgAkEMakHUBBDDDCEADAMLIAIgAEEIajYCDCABQaqmmgFBAyACQQxqQdUEEMMMIQAMAgsgAiAAQQRqNgIMIAFBpqOaAUEGIAJBDGpB1gQQwwwhAAwBCyACIABBBGo2AgwgAUH+j5sBQQUgAkEMakHXBBDDDCEACyACQRBqJAAgAAuvAgEGfyMAQRBrIgIkAAJAAkACQCABLQAsIgNBA0cNACACQQhqIAEQkxQgAigCDEUNAAJAAkAgAigCCCIELAAAIgVBf0wNACAFQf8BcSEFDAELIAQtAAFBP3EhBiAFQR9xIQcCQCAFQV9LDQAgB0EGdCAGciEFDAELIAZBBnQgBC0AAkE/cXIhBgJAIAVBcE8NACAGIAdBDHRyIQUMAQsgBkEGdCAELQADQT9xciAHQRJ0QYCA8ABxciEFCyAFQZ9/akEaSQ0BCwJAAkAgA0F9akEBIANBAksbQf8BcQ4DAQADAQsgAUEYaiEBIANBAkcNAANAIAEoAgAiA0EYaiEBIAMtACxBAkYNAAsLIAAgARCzEgwBCyABIAEoAhAgACgCLBDDBjYCEAsgAkEQaiQAC80CAQV/IwBB0ABrIgMkACABIAEoAngiBCACQX9zcTYCeEEAIQUgA0EAOgADIAMgASgCwAE2AgRBBCECQQAhBgJAAkAgAS0AyAEiB0EYRw0AIANBCGogAUEBENgDIAMoAgwhAgJAIAMoAggiBUGAgICAeEcNACAAQRM2AgAgACACNgIEDAILIAMoAhAhBiABLQDIASEHCwJAIAdB/wFxIgdB2ABGDQAgB0HfAEYNACADIAY2AkQgAyACNgJAIAMgBTYCPCADIANBA2o2AkwgAyADQQRqNgJIIANBCGogASADQTxqEPcdAkAgAygCCEETRw0AIAAgAygCDDYCBCAAQRM2AgAMAgsgACADQQhqQTD8CgAADAELIAMgBjYCFCADIAI2AhAgAyAFNgIMIAMgATYCCCAAIAEgA0EMahDGCQsgASAENgJ4IANB0ABqJAALpQICBn8EfiMAQSBrIgIkACABQQF2IAFqIQMCQANAIANFDQECQAJAIANBf2oiAyABSQ0AIAMgAWshBAwBCyAAIANBGGxqIgUpAhAhCCAFKQIIIQkgACkCACEKIAAgBSkCADcCACAAKQIIIQsgACAJNwIIIAApAhAhCSAAIAg3AhAgBSAKNwIAIAUgCzcCCCAFIAk3AhBBACEECyABIAMgASADSRshBgNAIARBAXQiB0EBciIFIAZPDQECQCAHQQJqIgcgBk8NACAFIAAgBUEYbGpBDGooAgAgACAHQRhsakEMaigCAElqIQULIAAgBEEYbGoiBEEMaigCACAAIAVBGGxqIgdBDGooAgBPDQEgBCAHQQYQshsgBSEEDAALCwsgAkEgaiQAC6sCAQV/AkACQAJAAkAgAkEDakF8cSIEIAJGDQAgBCACayEEQQAhBSABQf8BcSEGQQEhBwNAIAIgBWotAAAgBkYNBCAEIAVBAWoiBUcNAAsgBCADQXhqIghLDQIMAQsgA0F4aiEIQQAhBAsgAUH/AXFBgYKECGwhBQNAQYCChAggAiAEaiIGKAIAIAVzIgdrIAdyQYCChAggBkEEaigCACAFcyIGayAGcnFBgIGChHhxQYCBgoR4Rw0BIARBCGoiBCAITQ0ACwsCQCADIARGDQAgAyAEayEHIAIgBGohAkEAIQUgAUH/AXEhBgJAA0AgAiAFai0AACAGRg0BIAcgBUEBaiIFRg0CDAALCyAFIARqIQVBASEHDAELQQAhBwsgACAFNgIEIAAgBzYCAAviAgEEfyMAQSBrIgUkAEEBIQYCQCAALQAEDQAgAC0ABSEHAkAgACgCACIILQAKQYABcQ0AQQEhBiAIKAIAQeemmAFBqMyXASAHQQFxIgcbQQJBAyAHGyAIKAIEKAIMEQwADQEgCCgCACABIAIgCCgCBCgCDBEMAA0BIAgoAgBB6MqXAUECIAgoAgQoAgwRDAANASADIAggBBEIACEGDAELQQEhBgJAIAdBAXENACAIKAIAQa+CggFBAyAIKAIEKAIMEQwADQELQQEhBiAFQQE6AA8gBUHEhIIBNgIUIAUgCCkCADcCACAFIAgpAgg3AhggBSAFQQ9qNgIIIAUgBTYCECAFIAEgAhCkBg0AIAVB6MqXAUECEKQGDQACQCADIAVBEGogBBEIAEUNAEEBIQYMAQsgBSgCEEGygoIBQQIgBSgCFCgCDBEMACEGCyAAQQE6AAUgACAGOgAEIAVBIGokACAAC7ECAQR/IwBBEGsiASQAIAEgACgCACgCUCICNgIEIAAoAgghAyAAKAIEIQACQAJAIAJFDQACQCACIANJDQAgAiADRg0BDAILIAAgAmosAABBv39MDQELAkAgAiADRg0AAkACQCAAIAJqIgAsAAAiAkF/TA0AIAJB/wFxIQIMAQsgAC0AAUE/cSEEIAJBH3EhAwJAIAJBX0sNACADQQZ0IARyIQIMAQsgBEEGdCAALQACQT9xciEEAkAgAkFwTw0AIAQgA0EMdHIhAgwBCyAEQQZ0IAAtAANBP3FyIANBEnRBgIDwAHFyIgJBgIDEAEYNAQsgAUEQaiQAIAIPCyABQQc2AgwgASABQQRqNgIIQfCDgAEgAUEIakGIsYUBEOsbAAsgACADIAIgA0Gk1YkBENAiAAurAgEEf0GAgMQAIQECQAJAIAAoAgAoAlAiAiAAKAIIIgNGDQAgACgCBCEEAkACQCAAEJ0KIgBBgAFPDQBBASEADAELAkAgAEGAEE8NAEECIQAMAQtBA0EEIABBgIAESRshAAsCQCAAIAJqIgBFDQACQCAAIANJDQAgACADRg0BDAMLIAQgAGosAABBv39MDQILIAAgA0YNAAJAIAQgAGoiAywAACIAQX9MDQAgAEH/AXEPCyADLQABQT9xIQEgAEEfcSECAkAgAEFfSw0AIAJBBnQgAXIPCyABQQZ0IAMtAAJBP3FyIQECQCAAQXBPDQAgASACQQx0cg8LIAFBBnQgAy0AA0E/cXIgAkESdEGAgPAAcXIhAQsgAQ8LIAQgAyAAIANBhNWJARDQIgAL6wIBA38jAEEQayIBJAACQAJAAkACQCAALQC4AUF6ag4CAQACCwJAAkAgACgCiAEiAkELRw0AIAEgABDEAQwBCyAAQQs2AogBIAEgACkCmAE3AwAgASAAKAKgATYCCCAAQYwBaiEDAkAgACgCCEEKRg0AIABBCGoQwAsLIAAgAjYCCCAAIAMpAgA3AgwgACADKAIINgIUCyAAIAEoAgg2ArgBIAAgACkDsAE3A6gBIAAgASkDADcCsAFBACEADAILAkACQCAAKAKIASICQQtHDQAgASAAEMQBDAELIABBCzYCiAEgASAAKQKYATcDACABIAAoAqABNgIIIABBjAFqIQMCQCAAKAIIQQpGDQAgAEEIahDACwsgACACNgIIIAAgAykCADcCDCAAIAMoAgg2AhQLIAAgASgCCDYCuAEgACAAKQOwATcDqAEgACABKQMANwKwAUEAIQAMAQsgABCHCSEACyABQRBqJAAgAAu8AgIBfwF+IwBBIGsiAyQAIANBGGogAiABKAIIQQAQtQICQAJAIAMtABhBBEYNACADKQMYIgRC/wGDQgRRDQAgACAENwIADAELIANBADYCDCADQRhqIAIgA0EMakG77JoBQQEQ7A0CQCADLQAYQQRGDQAgAykDGCIEQv8Bg0IEUQ0AIAAgBDcCAAwBCyADQRhqIAFBBGogAhBUAkAgAy0AGEEERg0AIAMpAxgiBEL/AYNCBFENACAAIAQ3AgAMAQsgA0EYaiACIANBDGpBveyaAUEBEOwNAkAgAy0AGEEERg0AIAMpAxgiBEL/AYNCBFENACAAIAQ3AgAMAQsgA0EYaiABIAIQjSQCQCADLQAYQQRGDQAgAykDGCIEQv8Bg0IEUQ0AIAAgBDcCAAwBCyAAQQQ6AAALIANBIGokAAvOAgEHfyMAQSBrIgIkACABKALAASEDAkAgAS0AyAFBFkcNACABEOgRCyACQQhqIAEQlwJBASEEIAIoAgwhBQJAIAIoAghBAXENAEEAIQQgAS0AyAFBFkcNAEEEQQQQ6iAiBiAFNgIAIAIgBjYCGCACQQE2AhRBBCEHQQEhCANAIAIgCDYCHAJAAkAgAS0AyAFBFkcNACABEOgRIAIgARCXAiACKAIEIQUgAigCAEEBcUUNASACQRRqENwiQQEhBAwDCyABKAK8ASEBQQhB4AAQ6iAiBUKKgICAEDcDACAFIAE2AhggBSADNgIUIAUgAikCFDcCCCAFIAIoAhw2AhAMAgsCQCAIIAIoAhRHDQAgAkEUahC7GiACKAIYIQYLIAYgB2ogBTYCACAHQQRqIQcgCEEBaiEIDAALCyAAIAU2AgQgACAENgIAIAJBIGokAAvMAgEDfyMAQTBrIgMkAAJAIAEgACgCeEEIcUEDdhDeDw0AIANBEGogARCjBCADKAIUIQQgAygCECEFIANBq4GAgHg2AhggACAFIAQgA0EYahD1HQsCQCAAKAKAAUGA0ABxQYDAAEcNAAJAIAEoAgAiBEEaRw0AIAFBCGoQmyBFDQAgAyABEKMEIAMoAgQhBCADKAIAIQUgA0GHgYCAeDYCGCAAIAUgBCADQRhqEK4bDAELIAEgACgCeEEIcUEDdhDeDw0AIAEhBQJAAkADQAJAIARBdGpBByAEQQtLGyIEQRdGDQACQCAEQXVqDgUDBAQEBQALIARBBkcNAwwECyAFKAIEIgUoAgAhBAwACwsgAkUNAQsgA0EIaiABEKMEIAMoAgwhBCADKAIIIQUgA0GrgYCAeDYCGCAAIAUgBCADQRhqEPUdCyADQTBqJAAL5AIBAX8jAEHgAGsiBSQAIAUgASACIAMgBEEAQQEQ1wYgBSgCACEEAkACQCAFLQAUIgNBA0cNACAAQQg2AgAgACAENgIEDAELIAUgBSkCDDcDOCAFIAUpAgQ3AzAgBSAFLwAVOwEsIAUgBS0AFzoALiAFIAUoAhgiAjYCRCAFQcKAgIB4NgJIAkAgA0ECRw0AIAUgBSkDWDcDGCAFIAUpA1A3AxAgBSAFKQNINwMIIAVBxABqENYNIAVBCDYCACABKALAASABKALEASAFQQhqEMYbIQQCQCABLQDIAUGiAUcNACABIAEQoCMQjBQLIABBCDYCACAAIAQ2AgQMAQsgBUHIAGoQ5gMgBSAENgIIIAUgAzoAHCAFQQA6ACQgBSACNgIgIAVBATYCACAFIAUpAzA3AgwgBSAFKQM4NwIUIAUgBS8BLDsAHSAFIAUtAC46AB8gACAFQSj8CgAACyAFQeAAaiQAC9oCAgN/AX4jAEEwayICJAACQAJAAkACQCABLQDIASIDQbV/aiIEQR9LDQBBASAEdEGBgIKQeHENAQsCQCADQcAARw0AIAIgARDKFUIBIQUMAgsgA0G0f2pB/wFxQdUASQ0AIAJBGGpBBHIgAxDZJSACQRQ2AiwgAkHUh5sBNgIoIAJBsICAgHg2AhggASgCwAEgASgCxAEgAkEYahDGGyEEAkAgAS0AyAFBogFHDQAgARDWFCEDIAEQ6BEgASADEIwUCyAAQgI3AwAgACAENgIIDAILIAJBGGogARDuDCACKAIgIQECQCACKQMYIgVQRQ0AIABCAjcDACAAIAE2AggMAgsgAkEANgIQIAIgAigCJDYCDCACIAE2AgggAkEAOgAUIAIgBTcDAEIAIQULIAAgBTcDACAAIAIpAwA3AwggACACKQMINwMQIAAgAikDEDcDGAsgAkEwaiQAC7ACAQN/IwBBIGsiBCQAAkACQCACIAEoAgwiBUkNACACIAEoAhAgBWpLDQBBf0EBIAMbIQYgAiAFayECIAEoAgQhBSABKAIIIQMDQCACIANJIQECQAJAIAJBf2ogA08NACACIANPDQAgBSACaiwAAEFASA0BQQEhAQsgAyACIAMgAkkbIQYCQCABRQ0AIAZFDQAgBSAGaiwAAEG/f0wNBAtBACEBIARBADoAFCAEQQA2AhAgBCAANgIMIAQgBTYCGCAEIAUgBmo2AhwCQANAIARBGGoQzg0iBUGAgMQARg0BIARBDGogBRCsCCABaiEBDAALCyAEQSBqJAAgASACIANLag8LIAIgBmohAgwACwtB1MOBAUEuQYTEgQEQuSEACyAFIANBACAGQZTEgQEQ0CIAC7ICAQR/IwBBEGsiByQAIAdBCGogASACIAMQ1h4CQCAFIAZJDQBBACEIAkAgBygCDCIJIAUgBmtLDQAgBygCCCEKIAQgBmohBQJAAkAgCUEESQ0AIAUgCUF8aiIEaiEBAkAgBEUNACAKIQIDQCAFKAAAIAIoAABHDQQgAkEEaiECIAVBBGoiBSABSQ0ACwsgASgAACAKIARqKAAARg0BDAILAkACQAJAIAkOBAMAAQIDCyAFLQAAIAotAABGDQIMAwsgBS8AACAKLwAARg0BDAILIAUvAAAgBUECai0AAEEQdHIgCi8AACAKQQJqLQAAQRB0ckcNAQsgACADNgIMIAAgBjYCBCAAIAkgBmo2AghBASEICyAAIAg2AgAgB0EQaiQADwsgBiAFIAVBoMyBARCQCgALvgIBBX8gACgCoA0oAlQhAUEAIQJBACEDAkAgAC0ArApBAkYNACAAKAKgCiAAKAKkCiIEKAIIQX9qQXhxakEIaiAEKAIYEQQAIQMLAkAgACgCqA0iBEUNACAEKALQAkEUbCAEKALcAkECdGogBCgCxAIiAigCEEEDdGogAigCHEEFdGogAigCKEEMbGogAigCLGogBCgCwAJqQYgDaiECC0EAIQUCQCAAKALkCkEDRg0AIAAoAoQLQQJ0IAAoAvgKQQN0aiEFCwJAIAAtAKwNQQFHDQBBqPOaAUEoQfCLhQEQuSEACyABQTRsIANqIAAoAqQNIgAoAtACQRRsaiAAKALcAkECdGogACgCxAIiBCgCEEEDdGogBCgCHEEFdGogBCgCKEEMbGogBCgCLGogACgCwAJqIAJqIAVqQbwDagvGAgEBfwJAAkACQAJAAkACQCAADgMAAQIACyABLQAYDQIMAwsgAi0AJQ0DIAEoAgghACABKAIEIQEgAi0AJCEDIAJBADoAJAJAIABFDQAgAEE4bCEAA0ACQAJAIAEoAgANACACIAFBCGoQrg4MAQsgASACEJILCyABQThqIQEgAEFIaiIADQALCyACIAM6ACQPCwJAIAEoAgANACACIAFBCGoQrg4PCyABIAIQkgsMAgsgAigCIC0ANEUNAQsgAS0AGSEAAkAgAi0AJUEBRw0AIABB/wFxDQELIAItACQhAyACQQBBAiAAQf8BcRs6ACQCQCABKAIIIgBFDQAgAEE4bCEAIAEoAgQhAQNAAkACQCABKAIADQAgAiABQQhqEK4ODAELIAEgAhCSCwsgAUE4aiEBIABBSGoiAA0ACwsgAiADOgAkDwsLygIBA38CQAJAAkACQANAAkAgACgCACICQQJGDQACQAJAAkAgAg4HAQIABQcGCAELAAsgAEEANgIYDwsgACgCDCICRQ0DIAJBKGwhAiAAKAIIIQADQAJAIAAoAgBBB0YNACAAIAEQqQoLIABBKGohACACQVhqIgINAAwECwsgACgCBCEADAALCyAAKAIMIgJFDQAgAkE4bCEDIAAoAgghBEEAIQADQAJAAkACQAJAIAQgAGoiAigCAA4DAAECAAsCQCACQQhqKAIAQQNHDQAgAkEMaigCACABEKUBCyACQShqKAIAIAEQ3wsMAgsgAkEgakEANgIAIAJBMGooAgAiAkUNASACIAEQpQEMAQsgAkEEaigCACABEN8LCyADIABBOGoiAEcNAAsLDwsgACgCBCABEKkKIAAoAgggARClAQ8LIAAoAgQgARClAQviAgEEfyMAQYABayICJAACQAJAAkAgAS0AFEECRg0AIABBGjYCACAAIAEpAxA3AxggACABKQMINwMQIAAgASkDADcDCAwBCyACIAEoAgAiAykDGDcDACACIAMpAyA3AwggAiADKQMoNwMQIAIgAykDADcDGCACIAMpAwg3AyAgAygCFCEEIAMoAhAhBSACQShqIAIQqgpBwAAQigEiAUUNASABIAIpA2A3AzggASACKQNYNwMwIAEgAikDUDcDKCABIAIpA0g3AyAgASACKQNANwMYIAEgAikDODcDECABIAIpAzA3AwggASACKQMoNwMAIABBADYCCCAAIAE2AiggACAENgIkIAAgBTYCICAAQRQ2AgAgAiACKQMYNwJwIAIgAikDIDcCeCAAIAIpAmw3AgwgACACKQJ0NwIUIAAgAigCfDYCHCADQTBBCBDcFAsgAkGAAWokAA8LQQhBwAAQoiQAC68CAgR/A34jAEEgayICJABBFCEDIAApAwAiBiEHAkAgBkLoB1QNAEEUIQMgBiEHA0AgAkEMaiADaiIAQXxqIAciCCAIQpDOAIAiB0KQzgB+faciBEH//wNxQeQAbiIFQQF0LwC4q5gBOwAAIABBfmogBCAFQeQAbGtB//8DcUEBdC8AuKuYATsAACADQXxqIQMg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EyAAEKMICwvRAgEDfyMAQTBrIgIkACACIAE6AAMCQAJAIAAtALgBIgMgAUH/AXFGDQAgACgCtAEhASAAKAKwASEEIAJBBGogAxDIJSACQY8CrUIghiACQQNqrYQ3AyggAkEQakHNlYABIAJBKGoQshAgAiACKQIENwIcIAIgAigCDDYCJCAEIAEgAkEQahDGGyEBIAAtALgBQaIBRw0BIAAQyxQhAyAAELUQIAAgAxCRCQwBCwJAAkAgACgCiAEiAUELRw0AIAJBEGogABDEAQwBCyAAQQs2AogBIAIgACkCmAE3AxAgAiAAKAKgATYCGCAAQYwBaiEDAkAgACgCCEEKRg0AIABBCGoQwAsLIAAgATYCCCAAIAMpAgA3AgwgACADKAIINgIUCyAAIAIoAhg2ArgBIAAgACkDsAE3A6gBIAAgAikDEDcCsAFBACEBCyACQTBqJAAgAQveAgIEfwF+IwBBEGsiASQAAkACQAJAIAAtALgBQcsARw0AIAApAwghBSAAQQo2AgggASAAKQMQNwMIIAEgBTcDAAJAAkAgBaciAkEKRg0AIAJBAkYNASABEMALC0Go85oBQShB6IebARC5IQALIAEpAwghBQwBCyAAKAKwASICIAAoAmwiA0kNASAAKAK0ASIEIAAoAnBLDQEgACgCYCACIANraiAEIAJrEI0ZIQULAkACQCAAKAKIASICQQtHDQAgASAAEMQBDAELIABBCzYCiAEgASAAKQKYATcDACABIAAoAqABNgIIIABBjAFqIQMCQCAAKAIIQQpGDQAgAEEIahDACwsgACACNgIIIAAgAykCADcCDCAAIAMoAgg2AhQLIAAgASgCCDYCuAEgACAAKQOwATcDqAEgACABKQMANwKwASABQRBqJAAgBQ8LQfSOmwFB1gBBzI+bARC5IQALygIBA38CQAJAAkACQAJAAkAgACgCAA4HBQABAgMFBAULIAAoAgwiAkUNBCACQShsIQIgACgCCCEAA0ACQCAAKAIAQQdGDQAgACABEOgJCyAAQShqIQAgAkFYaiICDQAMBQsLIAAoAgQgARDoCQ8LIAAoAgwiAkUNAiACQThsIQMgACgCCCEEQQAhAANAAkACQAJAAkAgBCAAaiICKAIADgMAAQIACwJAIAJBCGooAgBBA0cNACABLQAAQQFxDQAgAkEMaigCACAB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AxDIJSACQRQ2AiwgAkHUh5sBNgIoIAJBsICAgHg2AhggASgCsAEgASgCtAEgAkEYahDGGyEDAkAgAS0AuAFBogFHDQAgARDLFCEEIAEQtRAgASAEEJEJCyAAQgI3AwAgACADNgIIDAILIAJBGGogARC2CCACKAIgIQECQCACKQMYIgVQDQAgAkEANgIQIAIgAigCJDYCDCACIAE2AgggAkEAOgAUIAIgBTcDAEIAIQUMAQsgAEICNwMAIAAgATYCCAwBCyAAIAU3AwAgACACKQMANwMIIAAgAikDCDcDECAAIAIpAxA3AxgLIAJBMGokAAuVAgICfwJ+AkACQAJAAkAgACkDACIDp0F+akEAIANCAlYbDgIBAgALIAApAxAiA0IDg0IAUg0CIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNAiAAIAAoAhAQ8B4PCwJAIAApAyAiBEIDg0IAUg0AIASnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQ8B4LIANCAlENASAAQQhqIQACQCADQgBSDQAgACkDACIDQgODQgBSDQIgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0CIAAgACgCEBDwHg8LIAAQsBIPCyAAKQMQIgNCA4NCAFINACADpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEPAeCwuqAgECfwJAAkACQAJAIAAoAgAOBAMAAQIDCyAAKAIEQQFHDQIgACgCCCABELoBDwsgASAAKAIEIgJBwABqELwKAkAgAkGEAWooAgAiAEUNACAAQdgAbCEDIAJBgAFqKAIAIQADQAJAAkACQCAAKAIAQXxqDgICAAELIABBBGooAgAgARC6AQwBCyAAIAEQ3wULIABB2ABqIQAgA0Gof2oiAw0ACwsCQCACQZgBaigCACIARQ0AIABBKGwhAyACQZQBaigCACEAA0AgACABENAIIABBKGohACADQVhqIgMNAAsLIAItADxBBkYNASABIAJBEGoQvAoPCyAAKAIMIgNFDQAgA0EobCEDIAAoAgghAANAIAAgARDACCAAQShqIQAgA0FYaiIDDQALCwuaAgEFfyMAQSBrIQICQCABKAIEIgMgAUFoaigCAEkgASgCACIEIAFBZGooAgAiBUkgBCAFRhtBAUcNACACIAEoAhg2AhggAiABKQIQNwMQ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FCABQRBqIQMgBSECCyADIAI2AgAgASgCFCABKAIQEP4gAAsgACAGNgIAIAAgBDYCBCABQSBqJAALrQICA38BfiMAQTBrIgEkAAJAAkAgACgCiAFBC0YNACAALQCgASEADAELIABBiAFqIQIgACkDCCEEIABBCjYCCCABIAApAxA3AwggASAENwMAIAFBIGogABDEASAAKQMIIQQgAEEKNgIIIAEgACkDEDcDGCABIAQ3AxAgAEEIaiEDAkACQCAAKAKIAUEOcUEKRw0AIAIgASkDKDcDGCACIAEpAyA3AxAgAiABKQMYNwMIIAIgASkDEDcDAAwBCyACEMALIAIgASkDEDcDACACIAEpAxg3AwggAiABKQMgNwMQIAIgASkDKDcDGCADKAIAQQpGDQAgAxDACwsgAyABKQMINwMIIAMgASkDADcDAEGkfyAALQCgASAAKAKIAUELRhshAAsgAUEwaiQAIAALpwICA38BfiMAQTBrIgEkAEEAIQICQCAAKAKIAUELRw0AIABBiAFqIQIgACkDCCEEIABBCjYCCCABIAApAxA3AwggASAENwMAIAFBIGogABDEASAAKQMIIQQgAEEKNgIIIAEgACkDEDcDGCABIAQ3AxAgAEEIaiEDAkACQCAAKAKIAUEOcUEKRw0AIAIgASkDKDcDGCACIAEpAyA3AxAgAiABKQMYNwMIIAIgASkDEDcDAAwBCyACEMALIAIgASkDEDcDACACIAEpAxg3AwggAiABKQMgNwMQIAIgASkDKDcDGCADKAIAQQpGDQAgAxDACwsgAyABKQMINwMIIAMgASkDADcDACACKAIAQQtGIQILIAAtAKEBIQAgAUEwaiQAIAIgAHJBAXELowICCH8CfiAAKAIAIQIgASgCACEDAkAgACgCBEEJaiIERQ0AIAIgAyAE/AoAAAsCQAJAIAEoAgwiBUUNACADQQhqIQYgAykDAEJ/hUKAgYKEiJCgwIB/gyEKIAUhByADIQQDQAJAIApCAFINAANAIAYiCEEIaiEGIARBQGohBCAIKQMAQoCBgoSIkKDAgH+DIgpCgIGChIiQoMCAf1ENAAsgCkKAgYKEiJCgwIB/hSEKCwJAIAQgCnqnQfgAcWsiCEF4aikDACILQgODQgBSDQAgC6ciCSAJKAIAIglBAWo2AgAgCUF/TA0DCyAKQn98IAqD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BEEBajYCCAJAAkAgASgCAEGAgICAeEcNACADKAIAKAIAIgBBBBCfHyAAKAIEIAAoAggiA2pB7uqx4wY2AAAgACADQQRqNgIIDAELIAMgARCsDSIADQELQQAhAAsgAkEQaiQAIAAPC0Go85oBQShBrNyaARC5IQALowIBAn8jAEEwayICJAACQAJAAkACQANAAkAgACgCAA4HAgMABAAFBQILIAAoAgQhAAwACwsgAkEIaiAAQQhqEJMUIAEoAgAgAigCCCACKAIMELAeDAILIAAoAgwhAyACIAAoAggiADYCKCACQQA2AiAgAkEANgIYIAIgACADQShsajYCLANAIAJBGGoQlxgiAEUNAiAAIAEQsAsMAAsLIAAoAgxBOGwhAyAAKAIIIQADQCADRQ0BAkACQAJAAkAgACgCAA4DAAECAAsgAEEoaigCACABELALDAILIAJBEGogAEEQahCTFCABKAIAIAIoAhAgAigCFBCwHgwBCyAAQQRqKAIAIAEQsAsLIABBOGohACADQUhqIQMMAAsLIAJBMGokAAu3AgIDfwF+IwBBIGsiAiQAAkACQAJAAkACQCABLQDIASIDQbd/ag4DAAEAAQsgAS0AhQFBAXFFDQEgASgCxAEhAyABKALAASEEIAJBo4CAgHg2AgggBCADIAJBCGoQxhshAwJAIAEtAMgBQaIBRw0AIAEQ1hQhBCABEOgRIAEgBBCMFAsgACADNgIADAILIAJBCGpBBHIgAxDZJSACQQ42AhwgAkGEhZsBNgIYIAJBsICAgHg2AgggASgCwAEgASgCxAEgAkEIahDGGyEDAkAgAS0AyAFBogFHDQAgARDWFCEEIAEQ6BEgASAEEIwUCyAAIAM2AgAMAQsgARDZFCEFIAEQ6BFBACEDIABBADYCECAAIAU3AwAgACABKQO4ATcDCAwBC0ECIQMLIAAgAzoAFCACQSBqJAALigICAn8CfiMAQSBrIgIkAAJAAkACQCABDgIAAgELIABBADYCCAwBCwJAAkAgAWlBAUYNACAAKAIIQQJ0IQMgAa0hBCAAKAIEIQFCACEFA0AgA0UNAiABIAE1AgAgBH4gBXwiBT4CACADQXxqIQMgAUEEaiEBIAVCIIghBQwACwsgAiAAKQIAIgU3AwggAiAAKAIINgIQAkACQCACKAIMIAJBCGogBadBgICAgHhG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ACIERw0AIAEtAAEiBSABQX9qLQAASQ0BDAILIAIgBE8NASABLQABIQULIAEgAy8AADsAAAJAIAMgAEYNACABQXxqIQEgBUH/AXEhBgJAA0ACQAJAIAIgAS0AACIERw0AIAYgAUEBai0AAEkNAQwECyACIARPDQILIANBfmohAyABQQJqIAEvAAA7AAAgASAARyEEIAFBfmoiByEBIAQNAAsgB0ECaiEDDAELIAFBAmohAwsgAyAFQQh0IAJyOwAADwsL3wEBBX8CQCABKAIEIgIgASgCACIDa0EDdiIEIAAoAgAgACgCCCIFa00NACAAIAUgBEEEQQgQ9RogACgCCCEFCyABKAIQIQYCQCADIAJGDQAgACgCBCAFQQN0aiEEA0AgBCADKQIANwIAIARBCGohBCAFQQFqIQUgA0EIaiIDIAJHDQALCyABKAIMIQQgASgCCCEDIAAgBTYCCAJAIAZFDQACQCAEIAMoAggiBUYNACAGQQN0IgJFDQAgAygCBCIBIAVBA3RqIAEgBEEDdGogAvwKAAALIAMgBSAGajYCCAsL/gEBA38jAEEwayICJAAgARCdCiEDIAJBDGogARCQDiABEKQJGgJAAkACQAJAAkACQAJAAkAgA0HjAEoNACADQa1/ag4FAwcHBwQBC0EAIQECQCADQY1/ag4FAgcHBwUAC0EAIQQgA0HkAEYNBQwGCyADQcQARw0FQQEhAUEAIQQMBAtBASEEDAMLQQEhBEEBIQEMAgtBASEBC0ECIQQLIAAgAikCHDcCECAAIAIpAhQ3AgggACACKQIMNwIAIAAgAToAGSAAIAQ6ABggAkEwaiQADwsgAiADNgIkIAJBAzYCLCACIAJBJGo2AihByrKBASACQShqQeTciQEQ6xsAC+8BAQN/AkACQAJAIAEoAgAOAwABAgALIAEoAgwiAkUNASACQShsIQIgASgCCCEBA0ACQCABKAIAQQdGDQAgASAAEM0KCyABQShqIQEgAkFYaiICDQAMAgsLIAEoAgwiAkUNACACQThsIQMgASgCCCEEQQAhAQNAAkACQAJAAkAgBCABaiICKAIADgMAAQIACwJAIAJBCGooAgBBA0cNACAAIAJBDGooAgAQ5AwLIAJBKGooAgAgABDNCgwCCyACQTBqKAIAIgJFDQEgACACEOQMDAELIAJBBGooAgAgABDNCgsgAyABQThqIgFHDQALCwuCAgICfwF+IwBBwABrIgIkAAJAAkACQAJAAkACQCABKAIADgQAAQIDAAsCQCABKQMIIgRCA4NCAFINACAEpyIBIAEoAgAiAUEBajYCACABQX9MDQULIABBADYCACAAIAQ3AwgMAwsgACABKQMINwMIIAAgASkDADcDAAwCCyABKAIEIQMQjiEhASACIAMQTiABIAIpAzg3AzggASACKQMwNwMwIAEgAikDKDcDKCABIAIpAyA3AyAgASACKQMYNwMYIAEgAikDEDcDECABIAIpAwg3AwggASACKQMANwMAIABBAjYCACAAIAE2AgQMAQsgAEEDNgIACyACQcAAaiQADwsAC+8BAQN/AkACQAJAIAEoAgAOAwABAgALIAEoAgwiAkUNASACQShsIQIgASgCCCEBA0ACQCABKAIAQQdGDQAgASAAEM8KCyABQShqIQEgAkFYaiICDQAMAgsLIAEoAgwiAkUNACACQThsIQMgASgCCCEEQQAhAQNAAkACQAJAAkAgBCABaiICKAIADgMAAQIACwJAIAJBCGooAgBBA0cNACAAIAJBDGooAgAQyAELIAJBKGooAgAgABDPCgwCCyACQTBqKAIAIgJFDQEgACACEMgBDAELIAJBBGooAgAgABDPCgsgAyABQThqIgFHDQALCwv5AQEFfyMAQTBrIgEkAEEAIQICQAJAAkACQCAALQDIASIDQX1qDgQCAQEAAQsgABDoEQwBCyADQaMBRg0AIAAtAMkBQQFxDQAgACgCxAEhBCAAKALAASEFIAFBDGogAxDZJSABQRhqQQFBAUEBEIUPIAEoAhwhAiABKAIYQQFGDQEgASgCICIDQTs6AAAgAUEBNgIgIAEgAzYCHCABIAI2AhggASABKQIMNwIkIAEgASgCFDYCLCAFIAQgAUEYahDGGyECIAAtAMgBQaIBRw0AIAAQ1hQhAyAAEOgRIAAgAxCMFAsgAUEwaiQAIAIPCyACIAEoAiAQ/iAAC+sBAQR/IwBBkAFrIgIkAAJAAkAgAS0AyAFBPkcNACABLQCBAUEgcUUNACABKAJ4IQMgAkEYaiABENAFIAEgA0EBcjYCeCACQRBqIAEQqAIgAiACKAIUIgQ2AowBIAIgAigCECIFNgKIAQJAAkAgBUEBcQ0AIAQNASABIAJBGGoQvRQM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ECAAKAIYENAWDAQLIAApAwgiA0IDg0IAUg0DIAOnIgEgASgCACICQX9qNgIAIAJBAUcNAyABIAEoAhAQ8B4MAwsgAEEIahCwEgwCCyAAKQMYIgNQDQEgA0IDg0IAUg0BIAOnIgEgASgCACICQX9qNgIAIAJBAUcNASABIAEoAhAQ8B4MAQsgACgCBCIBEJwBIAFBwABBCBDcFAsgACgCICIAEKMIIABBKEEIENwUC+MBAgN/AX4jAEEQayIBJAAgACkDCCEEIABBCjYCCCABIAApAxA3AwggASAENwMAAkACQCAEpyICQQpGDQAgAkEJRg0BIAEQwAsLQajzmgFBKEH4h5sBELkhAAsgASgCBCECAkACQCAAKAKIASIDQQtHDQAgASAAEMQBDAELIABBCzYCiAEgACADNgIIIAAgACkCjAE3AgwgACAAKAKUATYCFCABIAApApgBNwMAIAEgACgCoAE2AggLIAAgASgCCDYCuAEgACAAKQOwATcDqAEgACABKQMANwKwASABQRBqJAAgAgvjAQEBfyMAQdAAayICJAAgACgCACEAIAJB5MWZATYCSCACQcTHmQE2AkAgAiAAQRxqNgI8IAJBxMWZATYCOCACIABBJWo2AjQgAkHExZkBNgIwIAIgAEEkajYCLCACQfTJmQE2AiggAiAAQQxqNgIkIAJB5MmZATYCICACIAA2AhwgAkH8q5oBNgIYIAIgAEEYajYCFCACQayjmgE2AhAgAiAAQRBqNgIMIAIgAEEgajYCTCACIAJBzABqNgJEIAFBwLyaAUEJQYC8mgFBCCACQQxqQQgQwwshACACQdAAaiQAIAAL4wEBAX8jAEHQAGsiAiQAIAAoAgAhACACQeClmgE2AkggAkHwtJoBNgJAIAIgAEEcajYCPCACQYikmgE2AjggAiAAQSVqNgI0IAJBiKSaATYCMCACIABBJGo2AiwgAkHwu5oBNgIoIAIgAEEMajYCJCACQeC7mgE2AiAgAiAANgIcIAJB/KuaATYCGCACIABBGGo2AhQgAkGso5oBNgIQIAIgAEEQajYCDCACIABBIGo2AkwgAiACQcwAajYCRCABQcC8mgFBCUGAvJoBQQggAkEMakEIEMMLIQAgAkHQAGokACAAC9MBAQR/IwBBMGsiAiQAAkACQCABLQDIASIDQegARw0AIAEQ6BEg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PUcNACABIAZBA2o2AmggASACQX1qNgJcIAEgBEEDajYCWEEtIQcLIABBADoAACAAIAc6AAELvwEBAX8jAEEQayIHJAAgACgCACABIAIgACgCBCgCDBEMACECIAdBADoADSAHIAI6AAwgByAANgIIIAdBCGogAyAEIAUgBhCcCiEGIActAA0iAiAHLQAMIgFyIQACQCACQQFHDQAgAUEBcQ0AAkAgBigCACIALQAKQYABcQ0AIAAoAgBBq8yXAUECIAAoAgQoAgwRDAAhAAwBCyAAKAIAQbDrmgFBASAAKAIEKAIMEQwAIQALIAdBEGokACAAQQFxC60BAQN/IwBBIGsiBCQAAkACQCABKAIIQQFHDQAgASgCACEFIAEoAgQhBiABEKokIAQgBjYCDCAEIAIgBWsiASADajYCCCAEIAU2AgQgBEEgIAZBCnZnayIDQQcgA0EHSRtBAnRBAXI2AhAgBEEEaiABELANIAAgBCkCDDcCCCAAIAQpAgQ3AgAMAQsgBEEUaiACIAMQ0hUgARCRFCAAIARBFGoQ8RsLIARBIGokAAu5AQEEfyMAQSBrIgIkACABQRAgAUEQSxshAwJAAkAgAUH+//8HSw0AIAIgA0F/c0EfdiADQeTpgQEQzx02AhggAkEBNgIUIAJBADYCHCACQQhqIAJBFGpB9OmBARDiGiACKAIIIgEgAigCDGpBf2pBACABa3EiBCABENQgIgUNASABIAQQoiQACyADENIPIQULIAAgBTYCBCAAIANB////ByADQf///wdJG0GAgIBwcjYCACACQSBqJAALswEBAX8jAEHQAGsiBCQAAkAgASgCIA0AIAFBfzYCICAEIAOtQv8Bg0IohiACrUL/AYNCIIaENwJEIARBATYCQCAEIAFBJGogBEHAAGoQsg0gASABKAIgQQFqNgIgIABBCGohAyAEKAIEIQECQAJAIAQoAgAiAkEqRg0AIAMgBEEIakE4/AoAAAwBCyADIAE2AgALIAAgAjYCACAAIAE2AgQgBEHQAGokAA8LQZzyhAEQhR4AC8MBAQJ/IwBBIGsiAiQAIAJBADoAECACQuSAgICgHzcCCCACQoqAgICgATcCACACQRRqIAIgARCgAQJAIAIoAhRBgICAgHhGDQAgAigCHCIBRQ0AIAFBBHQhAyACKAIYQQxqIQEDQCABQQA6AAAgAUEQaiEBIANBcGoiAw0ACwsgAkEUakEBEIECAkACQCACKAIUQYCAgIB4Rg0AIAAgAigCGCACKAIcENMPDAELIABBAjoADAsgAkEUahCYHyACQSBqJAAL1AEBAX8jAEHAAGsiAiQAIAAoAgAhACACQayYhQE2AjggAkGYpIUBNgIwIAIgAEHgBGo2AiwgAkGIpIUBNgIoIAIgAEHgAmo2AiQgAkH4o4UBNgIgIAIgAEHgAGo2AhwgAkGcmIUBNgIYIAIgAEGEBWo2AhQgAkHoo4UBNgIQIAIgAEGABWo2AgwgAkHYo4UBNgIIIAIgADYCBCACIABBiAVqNgI8IAIgAkE8ajYCNCABQZilhQFBA0HgpIUBQQcgAkEEakEHEMMLIQAgAkHAAGokACAAC7cBAQN/IwBBEGsiBCQAAkAgAigCECIFIAIoAhQiBksNAAJAAkAgAigCAA0AIARBBGogAEEEaiACKAIIIAIoAgwgBSAGENwGIAQoAgRBAUcNAiAEKAIIIAQoAgxNDQFB/NaEAUElQZDXhAEQ6xsACyAFIAIoAgxPDQEgAC0ABCACKAIIIAVqLQAAIgJGDQAgAC0ABUH/AXEgAkYNACAALQAGQf8BcSACRw0BCyADENgVCyAEQRBqJAALugECAX8BfgJAAkACQAJAAkACQCAAKAIADgQBAgMEAAsgACkDECAAKAIYENAWDwsgACkDCCICQgODQgBSDQMgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0DIAAgACgCEBDwHg8LIABBCGoQsBIPCyAAKQMYIgJQDQEgAkIDg0IAUg0BIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNASAAIAAoAhAQ8B4PCyAAKAIEIgAQnAEgAEHAAEEIENwUCwu6AQIBfwF+AkACQAJAAkACQAJAIAAoAgAOBAECAwQACyAAKQMQIAAoAhgQ0hYPCyAAKQMIIgJCA4NCAFINAyACpyIAIAAoAgAiAUF/ajYCACABQQFHDQMgACAAKAIQEPAeDwsgAEEIahCxEg8LIAApAxgiAlANASACQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDwHg8LIAAoAgQiABCNAiAAQcAAQQgQ3BQLC84BAQF/IwBBwABrIgIkACAAKAIAIQAgAkHI4JkBNgI4IAJBuOCZATYCMCACIABBIGo2AiwgAkHExZkBNgIoIAIgAEEqajYCJCACQcTFmQE2AiAgAiAAQSlqNgIcIAJBxMWZATYCGCACIABBKGo2AhQgAkH0xZkBNgIQIAIgAEEIajYCDCACQayjmgE2AgggAiAANgIEIAIgAEEkajYCPCACIAJBPGo2AjQgAUGEypoBQQtBzMmaAUEHIAJBBGpBBxDDCyEAIAJBwABqJAAgAAvOAQEBfyMAQcAAayICJAAgACgCACEAIAJBpMaZATYCOCACQZTGmQE2AjAgAiAAQRhqNgIsIAJBhMaZATYCKCACIAA2AiQgAkHExZkBNgIgIAIgAEEhajYCHCACQcTFmQE2AhggAiAAQSBqNgIUIAJBxMaZATYCECACIABBDGo2AgwgAkGso5oBNgIIIAIgAEEQajYCBCACIABBHGo2AjwgAiACQTxqNgI0IAFBn66aAUERQZy2mgFBByACQQRqQQcQwwshACACQcAAaiQAIAAL0gEBAX8jAEHAAGsiAiQAIAAoAgAhACACQaikmgE2AjggAkHUxZkBNgIwIAIgAEHRAGo2AiwgAkGEx5kBNgIoIAIgAEEgajYCJCACQfTGmQE2AiAgAiAAQcAAajYCHCACQeTGmQE2AhggAiAANgIUIAJB/KuaATYCECACIABBzABqNgIMIAJBrKOaATYCCCACIABBOGo2AgQgAiAAQdAAajYCPCACIAJBPGo2AjQgAUH4rJoBQQtBwKyaAUEHIAJBBGpBBxDDCyEAIAJBwABqJAAgAAvOAQEBfyMAQcAAayICJAAgACgCACEAIAJBmL+aATYCOCACQYi/mgE2AjAgAiAAQSBqNgIsIAJBiKSaATYCKCACIABBKmo2AiQgAkGIpJoBNgIgIAIgAEEpajYCHCACQYikmgE2AhggAiAAQShqNgIUIAJBjKaaATYCECACIABBCGo2AgwgAkGso5oBNgIIIAIgADYCBCACIABBJGo2AjwgAiACQTxqNgI0IAFBhMqaAUELQczJmgFBByACQQRqQQcQwwshACACQcAAaiQAIAALzgEBAX8jAEHAAGsiAiQAIAAoAgAhACACQdimmgE2AjggAkHIppoBNgIwIAIgAEEYajYCLCACQbimmgE2AiggAiAANgIkIAJBiKSaATYCICACIABBIWo2AhwgAkGIpJoBNgIYIAIg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rKOaATYCCCACIAA2AgQgAiAAQSBqNgIsIAIgAEEqajYCJCACIABBKWo2AhwgAiAAQShqNgIUIAIgAEEIajYCDCACIABBJGo2AjwgAiACQTxqNgI0IAFBhMqaAUELQczJmgFBByACQQRqQQcQwwshACACQcAAaiQAIAALxwEBAX8jAEHAAGsiAiQAIAJBmL+aATYCOCACQYi/mgE2AjAgAkGIpJoBNgIoIAJBiKSaATYCICACQYikmgE2AhggAkGMppoBNgIQIAJBrKOaATYCCCACIAA2AgQgAiAAQSBqNgIsIAIgAEEqajYCJCACIABBKWo2AhwgAiAAQShqNgIUIAIgAEEIajYCDCACIABBJGo2AjwgAiACQTxqNgI0IAFBhMqaAUELQczJmgFBByACQQRqQQcQwwshACACQcAAaiQAIAALswEBBH8gAC0AJiECIABBADoAJiABKAIAIAAQrgUgAC0AJSEDIAEoAgQhAQJAIAAtACQiBA0AAkAgASgCACIFQXRqQQcgBUELSxtBe2oiBUEfSw0AQQEgBXRBrqKAgHhxDQEgBQ0AIAEtABFFDQELIABBAzoAJAsgACABEOUBIAEgABBVIAAgAzoAJSAAIAQ6ACQgACABELgBIAAgAjoAJgJAIAEoAgBBGUcNACAAIAEQzgELC7wBAQN/IAAoAgAiAkHAAGoQtCEgAkGQAWohAyACKAKEAUHYAGwhBCACKAKAASEAAkADQCAERQ0BAkACQAJAAkACQCAAKAIADgYEAQIDBAAECyAAQQRqIAEQqyUMAwsgAEEEaiABEPYgDAILIABBBGogARDzDgwBCyAAQQRqIAEQ5xILIABB2ABqIQAgBEGof2ohBAwACwsgAigCeCABEK4cIAMgARDnEgJAIAItADxBBkYNACACQRBqELQhCwuqAQEBfyMAQRBrIgYkAAJAAkACQCADIAJqIgIgA08NAEEAIQMMAQsgBkEEaiABKAIAIgMgASgCBCACIANBAXQiAyACIANLGyIDQQQgA0EESxsiAyAEIAUQgAwCQCAGKAIEQQFHDQAgBigCDCECIAYoAgghAwwCCyAGKAIIIQIgASADNgIAIAEgAjYCBEGBgICAeCEDCwsgACACNgIEIAAgAzYCACAGQRBqJAALmwEBBn9BACEDAkAgAEUNAANAIABBBGohBCAALwEyIgVB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IIinDQAgBqciA0GAgICAeCACa0sNACADDQEgACACNgIIQQAhAiAAQQA2AgQMAwsgAEEANgIEDAELIARBCGogAiADEIcgAkAgBCgCCCIFRQ0AIAAgBTYCCCAAIAE2AgRBACECDAILIAAgAzYCCCAAIAI2AgQLQQEhAgsgACACNgIAIARBEGokAAupAQICfwF+IwBBEGsiBCQAAkACQAJAAkAgA60gAa1+IgZCIIinDQAgBqciA0GAgICAeCACa0sNACADDQEgACACNgIIQQAhAiAAQQA2AgQMAwsgAEEANgIEDAELIARBCGogAiADEIggAkAgBCgCCCIFRQ0AIAAgBTYCCCAAIAE2AgRBACECDAILIAAgAzYCCCAAIAI2AgQLQQEhAgsgACACNgIAIARBEGokAAusAQICfwF+IwBBEGsiAiQAIAAoAgAhAAJAAkAgASgCCCIDQYCAgBBxDQACQCADQYCAgCBxDQAgACABEKsKIQAMAgsgACkDACEEQREhAANAIAIgAGpBfmogBKdBD3EtAOCLgwE6AAAgAEF/aiEAIARCBIgiBEIAUg0ACyABQQFBsMyXAUECIAIgAGpBf2pBESAAaxDPBiEADAELIAAgARDqEiEACyACQRBqJAAgAAu+AQEDfyMAQRBrIgMkAAJAAkACQCACQen///8HTw0AIAJBF2pB+P///wdxIgRB8f///wdPDQEgBEEPakH4////B3EiBRCKASIERQ0CIAQgAjYCECAEIAA3AwggBEEBNgIAAkAgAkUNACAEQRhqIAEgAvwKAAALIANBEGokACAEDwtB8P2aAUErIANBD2pB0N2DAUHg3YMBEN0UAAtB8P2aAUErIANBD2pB0N2DAUGA3YMBEN0UAAtBCCAFEKIkAAupAQEDfyMAQYAgayICJAACQAJAAkAgAUGgwh4gAUGgwh5JGyIDIAEgAUEBdmsiBCADIARLGyIDQYECSQ0AIAIgA0EAQQRBEBDCDyACKAIEIQMgAigCAEEBRg0CIAAgASACKAIIIgQgAyABQcEASRCeAiAEQQAQqR0gAyAEEOAjDAELIAAgASACQYACIAFBwQBJEJ4CCyACQYAgaiQADwsgAyACKAIIEP4gAAu0AQIDfwF+IAAoAgghAQJAAkAgACgCFCICRQ0AIAAgAkF/aiICNgIUIAAoAhAgAkEMbGoiAigC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C0EAIQILIAAgAzYCBCAAIAI2AgALwwEBAX8jAEEQayICJAACQAJAIAApAwBC////////////AINCgICAgICAgPj/AFMNACACQfUBNgIMIAIgADYCCCABKAIAIAEoAgRBzZWAASACQQhqEM0jIQAMAQsgAkEAOgAEIAIgATYCACACQfUBNgIMIAIgADYCCAJAIAJBzZWAASACQQhqEOgjDQACQCACLQAEDQAgASgCAEHpppgBQQIgASgCBCgCDBEMAA0BC0EAIQAMAQtBASEACyACQRBqJAAgAAuuAQEEfyAAKAIEIQECQCAAKAIIIgJFDQAgAUEEaiEDA0ACQAJAAkACQAJAAkAgA0F8aigCAA4EAQIDBAALIAMQyA8MBAsgA0EEahD0EgwDCyADKAIARQ0CIANBBGooAgAiBBCcASAEQcAAQQgQ3BQMAgsgAygCACIEEJwBIARBwABBCBDcFAwBCyADEOcJCyADQShqIQMgAkF/aiICDQALCyAAKAIAIAFBCEEoENUTC5MBAgV/AX4CQCACRQ0AIAJBA3QhAiAApyIDQRhqIQQgA0EDcSEFA0ACQCABKQMAIgggAFINAEEBDwsCQCAIpyIGQQNxIgdBAUYNACAHIAVHDQAgBikDCCADKQMIUg0AIAYoAhAiByADKAIQRw0AIAZBGGogBCAHELoYDQBBAQ8LIAFBCGohASACQXhqIgINAAsLQQALrAEBA38jAEEgayIEJAAgBCABQQAgBCADQQBBABCRA0EDIQMgBCgCACEFAkACQCAELQAUIgZBA0cNACAAIAU2AgQMAQsgACAEKQIMNwIUIAAgBCkCBDcCDCAAIAQvABU7AB0gACAELQAXOgAfIAQoAhghAyAAIAI2AiggACADNgIgIAAgBjoAHCAAIAU2AgggACABKAKsATYCLEEBIQMLIAAgAzYCACAEQSBqJAALmwEBAn8CQCABLQAlQQJGDQADQCABKAIgIgEtACVBAkcNAAsLIAEgABClBQJAIAEoAggiAkUNACACQThsIQIgASgCBCEBA0ACQCABKAIAQQlHDQAgAUEIaigCAEERRw0AIAFBEGooAgBBB0cNACABQRRqKAIAIgMtAEVBA0YNACAAIANBIGoQyw8LIAFBOGohASACQUhqIgINAAsLC6wBAQF/IwBBIGsiBiQAIAYgASADIAQgBUEA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ACIFIAJBfGooAgAiBk8NACAEIQECQANAIAAgAWpBBGogBjYCAAJAIAENACAAIQEMAgsgBSABQXxqIgEgAGoiBygCACIGSQ0ACyAHQQRqIQELIAEgBTYCAAsgBEEEaiEEIAJBBGoiAiADRw0ACwuVAQEBfyMAQSBrIgIkAAJAAkAgAC0ABEEBRw0AIAIgAC0ABToADyACQQetQiCGIACthDcDGCACQdMArUIghiACQQ9qrYQ3AxAgASgCACABKAIEQYKCgAEgAkEQahDNBiEADAELIAJBB61CIIYgAK2ENwMQIAEoAgAgASgCBEGzgoABIAJBEGoQzQYhAAsgAkEgaiQAIAALmwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCEDIAEoAgBBou+aAUEBIAEoAgQoAgwRDAAhBCACQQA6AAkgAiAEOgAIIAIgATYCBAJAIANFDQAgA0EDdCEBA0AgAiAANgIMIAJBBGogAkEMakGDARCPDBogAEEIaiEAIAFBeGoiAQ0ACwsgAkEEahCDHiEAIAJBEGokACAAC64BAQN/IwBBIGsiAiQAIAJCABCQDQJAAkAgAigCAEGEgICAeEcNACACKAIEIQNBEBCKASIERQ0BIAQgATsBDCAEIAM2AgggBEKBgICAEDcCACAEQQ5qIAFBEHY6AAAgACAENgIAIABB3NuEATYCBCACQSBqJAAPCyACIAIpAwg3AxggAiACKQMANwMQQfD9mgFBKyACQRBqQYzZhAFB7NmEARDdFAALQQRBEBCiJAALnwEBAn8gABCnCiEBIAAoAsASIAAoAsQSIgIoAghBf2pBeHFqQQhqIAIoAhgRBAAhAgJAIAAtANQSQQFHDQBBqPOaAUEoQayNhQEQuSEACyABIAJqIAAoAtASIgAoAtACQRRsaiAAKALcAkECdGogACgCxAIiAigCEEEDdGogAigCHEEFdGogAigCKEEMbGogAigCLGogACgCwAJqQYgDagubAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIQMgASgCAEGi75oBQQEgASgCBCgCDBEMACEEIAJBADoACSACIAQ6AAggAiABNgIEAkAgA0UNACADQRxsIQEDQCACIAA2AgwgAkEEaiACQQxqQfYAEI8MGiAAQRxqIQAgAUFkaiIBDQALCyACQQRqEIMe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KQMAIgRCA4NCAFINASAEpyICIAIoAgAiA0F/ajYCACADQQFHDQEgAiACKAIQEPAeDAELIAIQsBILAkAgAEEoaigCACICRQ0AIAIQnAEgAkHAAEEIENwUCyAAQTBqIQAgAUF/aiIBDQALCwujAQIBfwF+IwBBEGsiAiQAAkACQAJAAkAgACgCACIAKQMAIgOnQX5qQQIgA0IBVhsOAwABAgALIAIgAEEIajYCBCABQdmpmgFBCSACQQRqQZYGEMMMIQAMAgsgAiAAQQhqNgIIIAFB0qmaAUEHIAJBCGpBlwYQwwwhAAwBCyACIAA2AgwgAUHNqZoBQQUgAkEMakGYBhDDDCEACyACQRBqJAAgAAujAQIBfwF+IwBBEGsiAiQAAkACQAJAAkAgACgCACIAKQMAIgOnQX5qQQAgA0ICVhsOAwABAgALIAIgADYCBCABQc2pmgFBBSACQQRqQZwGEMMMIQAMAgsgAiAAQQhqNgIIIAFB0qmaAUEHIAJBCGpBnQYQwwwhAAwBCyACIABBCGo2AgwgAUHZqZoBQQkgAkEMakGeBhDDDCEACyACQRBqJAAgAAvTAQECf0EAIQJBACEDAkAgAL1C////////////AINC//////////f/AFUNACAAnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/AMhAwsCQCABvUL///////////8Ag0L/////////9/8AVQ0AIAGdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8A0EfcSECCyADIAJ0twvTAQECf0EAIQJBACEDAkAgAL1C////////////AINC//////////f/AFUNACAAnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/AMhAwsCQCABvUL///////////8Ag0L/////////9/8AVQ0AIAGdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8A0EfcSECCyADIAJ1twvTAQECf0EAIQJBACEDAkAgAL1C////////////AINC////////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oCAAIABEAAAAAAAAAABjG/wDIAJyIQILIAK3C8wBAQF/QQAhAgJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQILAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/AMgAnMhAgsgArcLmgEBAn8gASAAEOwMAkAgACgCRCICRQ0AIAJB2ABsIQMgACgCQCECA0ACQAJAAkAgAigCAEF8ag4CAgABCyABIAJBBGooAgAQhgEMAQsgASACEM8HCyACQdgAaiECIANBqH9qIgMNAAsLAkAgACgCOCICRQ0AIAIQ/hsgAigCACACQQRqKAIAEPQjIAJBFEEEENwUCyAAQQA2AjgLlAEBA38gAEEcahCDGSAAKAIMIAAoAhAQmx4gACgCCCEBIAAoAgQiAiEDAkADQCABRQ0BIAMpAwAQnCEgAUF/aiEBIANBGGohAwwACwsgACgCACACEPMjIAAoAjQhASAAKAIwIgIhAwJAA0AgAUUNASABQX9qIQEgAxCVESADQTxqIQMMAAsLIAAoAiwgAkEEQTwQ1RMLlgECBH8CfiAAQQxqKAIAIQMgAigCCCIAQQxqKAIAIQQgASgCACACKAIMIgVBGGxqIgEpAhAhByABKQIIIQggAigCACIGIAEpAgA3AgAgBiAINwIIIAYgBzcCECABIAApAgA3AgAgASAAKQIINwIIIAEgACkCEDcCECACIAUgBCADSWo2AgwgAiAANgIAIAIgAEEYajYCCAuWAQIEfwJ+IABBDGooAgAhAyACKAIIIgBBDGooAgAhBCABKAIAIAIoAgwiBUEYbGoiASkCECEHIAEpAgghCCACKAIAIgYgASkCADcCACAGIAg3AgggBiAHNwIQIAEgACkCADcCACABIAApAgg3AgggASAAKQIQNwIQIAIgBSADIARPajYCDCACIAA2AgAgAiAAQRhqNgIIC7IBAAJAAkACQAJAAkACQAJAIAJBemoOAwIAAQMLIAFBp72BAUEHELoYDQJBACEBIABBADoAAQwF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A0EBIAMbNgIAAkAgA0UNACACEPYTCwJAQQAoAsSQnQEgAEYNACACENgeDAELCyACDwsgAiADQYTOhAEQ/hYAC4QBAQN/IwBBEGsiAyQAIANBBGogAkEBQQIQrxEgAygCCCEEAkAgAygCBEEBRg0AIAMoAgwhBSAAQQA2AgggACAFNgIEIAAgBDYCAAJAIAJFDQACQCACQQF0IgRFDQAgBSABIAT8CgAACyAAIAI2AggLIANBEGokAA8LIAQgAygCDBD+IAALhAEBA38jAEEQayIDJAAgA0EEaiACQQRBCBCvESADKAIIIQQCQCADKAIEQQFGDQAgAygCDCEFIABBADYCCCAAIAU2AgQgACAENgIAAkAgAkUNAAJAIAJBA3QiBEUNACAFIAEgBPwKAAALIAAgAjYCCAsgA0EQaiQADwsgBCADKAIMEP4gAAuJAQEDfyMAQSBrIgIkACACIAAoAhQiAzYCCCACIAE2AgQgACgCDCEEAkACQCABIANBAWpLDQAgAyAETQ0BCyACIAQ2AgwgAkEHNgIcIAJB+AA2AhQgAiACQQxqNgIYIAIgAkEEajYCEEHgh4ABIAJBEGpBmOSaARDrGwALIAAgATYCECACQSBqJAALnwEBAn8gASgCpA0oAsQCIgIgAigCACIDQQFqNgIAAkAgA0F/Sg0AAAsgACACEIwYIABB6ARqIAEoArAKEKQQIAEoAsgKIQIgAEHYBGogASgC5AogASgCiAsQ7xIgAEHYAWogARClECAAQgA3A+gFIABCgICAgMAANwPgBSAAQgQ3A9gFIABBgICAgHhBACACQQJGGzYC1AUgAEECNgLIAQufAQECfyABKAKkDSgCxAIiAiACKAIAIgNBAWo2AgACQCADQX9KDQAACyAAIAIQjBggAEHoBGogASgCsAoQpBAgASgCyAohAiAAQdgEaiABKALkCiABKAKICxDvEiAAQdgBaiABEKUQIABCADcD6AUgAEKAgICAwAA3A+AFIABCBDcD2AUgAEGAgICAeEEAIAJBAkYbNgLUBSAAQQI2AsgBC58BAQJ/IAEoAqQNKALEAiICIAIoAgAiA0EBajYCAAJAIANBf0oNAAALIAAgAhCMGCAAQegEaiABKAKwChCkECABKALICiECIABB2ARqIAEoAuQKIAEoAogLEO8SIABB2AFqIAEQpRAgAEIA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IAAgAyACQQFBARD1GiAAKAIIIQMMAQsgAkUNAQsDQCADIQQCQCADIAAoAgBHDQAgACADQQFBAUEBEPUaIAAoAgghBAsgACADQQFqIgM2AgggACgCBCAEaiABOgAAIAJBf2oiAg0ACwsLdgEBfwJAIAEgA0YNAEEADwsCQCABDQBBAQ8LIAFBf2ohAQJAA0AgAC0AACACLQAARiAAQQFqLQAAQf8BcSACQQFqLQAAQf8BcUZxIgRBAUcNASABQQBHIQMgAEECaiEAIAJBAmohAiABQX9qIQEgAw0ACwsgBAuXAQICfwF8IwBBMGsiAiQAAkACQCABKwMAIgREAAAAAAAAAABhDQACQAJAIAS9Qv///////////wCDQv/////////3/wBVDQAgBCACQRdqEKACIAJBF2prIQEgAkEXaiEDDAELIAJBCGogBBDyGyACKAIMIQEgAigCCCEDCyAAIAMgARDuFAwBCyAAIAEQ4xMLIAJBMGokAAuIAQEDfwJAIAEtADRBAUcNACABLQA5IQIgAS0AOiEDAkAgACgCCCIERQ0AIARBAnQhBCAAKAIEIQADQAJAIAEtADRBAUcNACABQYECOwA5IAAoAgAgARCSAiABQQE6ADogASACOgA5CyAAQQRqIQAgBEF8aiIEDQALCyABIAM6ADogASACOgA5CwuRAQEDfwJAAkBBACgC6JSdASICRQ0AIAEoAhAiAyACEIUZIgJBDGooAgAiBEkNASADIARB8OKZARD+FgALQZDlmgFByABB2OWaARDIJAALIAJBCGooAgAgA0EDdGooAgAhAyACQQA6AAACQCADIAAoAixHDQAgAUEANgIQCyAAQQE6ADogACABELMSIABBADoAOguKAQAgAEEAOgAYIABBfzYCFCAAIAY2AhAgACAFNgIMIAAgBDYCCCAAIAM2AgQgACACNgIAAkAgASgCFCIGIAEoAgxHDQAgAUEMahDRGgsgASAGQQFqNgIUIAEoAhAgBkEcbGoiASAAKQIANwIAIAEgACkCCDcCCCABIAApAhA3AhAgASAAKAIYNgIYC5cBAQJ/IwBBIGsiASQAAkACQCAAKAKYASICQQtHDQAgASAAEMQgDAELIABBCzYCmAEgASACNgIQIAEgACkCqAE3AwAgASAAKAKwATYCCCABIAApApwBNwIUIAEgACgCpAE2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An8jAEEQayICJAAgAC8BACEDQQUhAANAIAJBDGogAGpBfmogA0EPcUHgi4MBai0AADoAACAAQX9qIQAgA0EEdkH/H3EiAw0ACyABQQFBsMyXAUECIAJBDGogAGpBf2pBBSAAaxDPBiEAIAJBEGokACAAC3QBAn8jAEEQayICJAAgAC8BACEDQQUhAANAIAJBDGogAGpBfmogA0EPcUHQo5wBai0AADoAACAAQX9qIQAgA0EEdkH/H3EiAw0ACyABQQFBsMyXAUECIAJBDGogAGpBf2pBBSAAaxDPBiEAIAJBEGokACAAC3sBAn8gASACp3EhA0EIIQQCQANAIAAgA2opAABCgIGChIiQoMCAf4MiAkIAUg0BIAMgBGogAXEhAyAEQQhqIQQMAAsLAkAgACACeqdBA3YgA2ogAXEiA2osAABBAEgNACAAKQMAQoCBgoSIkKDAgH+DeqdBA3YhAwsgAwuGAQEEfyMAQRBrIgMkAAJAAkAgASgCACIEIAIoAgAiBU8NACADIAIoAgg2AgggAyACKQIANwMAIAAgAyABKAIEIgYgASgCCBCxDQwBCyADIAEoAgg2AgggAyABKQIANwMAIAAgAyACKAIEIgYgAigCCBCxDSAFIQQLIAQgBhDbIyADQRBqJAALdAECf0EAIQICQCABKAIQIgNFDQBBACECIAEoAgwgA0EDdGoiAUF4akUNACABQXxqKAIAIQILAkACQEEAIAIgA0EBdGsiASABIAJLGyICIAAoAggiAUsNACAAIAI2AggMAQsgACACIAFrEJIQCyAAIAI2AgwLggEBAn8jAEEgayIDJAAgA0EUakHCzoUBQQYQ1QxBASEEAkACQAJAIAMtABRBAUcNACAAIAMtABU6AAEMAQsgAygCGCIERQ0BIANBCGogBCADKAIcIAEgAhDgDCAAIAMpAwg3AgRBACEECyAAIAQ6AAAgA0EgaiQADwtB7O6JARDEIwALegECfyABIAKncSEDQQghBAN/AkAgACADaikAAEKAgYKEiJCgwIB/gyICUA0AAkAgACACeqdBA3YgA2ogAXEiA2osAABBAEgNACAAKQMAQoCBgoSIkKDAgH+DeqdBA3YhAwsgAw8LIAMgBGogAXEhAyAEQQhqIQQMAAsLegECfyABIAKncSEDQQghBAN/AkAgACADaikAAEKAgYKEiJCg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IAY3AgAMAQsgAEEEOgAACyADQRBqJAALdAIFfwF+IAAoAgQhAQJAIAAoAggiAkUNACABIQMDQAJAIAMpAwAiBkIDg0IAUg0AIAanIgQgBCgCACIFQX9qNgIAIAVBAUcNACAEIAQoAhAQ8B4LIANBCGohAyACQX9qIgINAAsLIAAoAgAgAUEIQQgQ1RMLeAIDfwF+IAAoAhAhASAAKAIIIQIgACkDACEEA38CQCAEUA0AIAAgBEJ/fCAEgzcDACABIAR6p0H4AHFrDwsgACABQUBqIgE2AhAgACACQQhqIgM2AgggACACKQMAQn+FQoCBgoSIkKDAgH+DIgQ3AwAgAyECDAALC3YBAX8gACgCCEE4bCECIAAoAgQhAANAAkACQCACRQ0AAkACQAJAIAAoAgAOAwABAgALIABBCGogARDyICAAQShqIAEQqCUMAwsgASAAQTBqEMEiDAILIABBBGogARCoJQwBCw8LIABBOGohACACQUhqIQIMAAsLegEBfyABKAIIQShsIQIgASgCBCEBAkADQCACRQ0BAkACQAJAAkACQCABKAIADgUEAAECAwQLIAFBBGogABDzIAwDCyABQQRqIAAQlQUMAgsgAUEEaiAAEKcPDAELIAAgAUEEahDlEgsgAUEoaiEBIAJBWGohAgwACwsLZQEDf0EAIQMCQCABRQ0AA0ACQCABQQFLDQAgACADQQxsaigCACIBIAJGDQIgAyABIAJJaiEDDAILIAMgAUEBdiIEIANqIgUgACAFQQxsaigCACACSxshAyABIARrIQEMAAsLIAMLegEBfyAAKAIIQShsIQIgACgCBCEAAkADQCACRQ0BAkACQAJAAkACQCAAKAIADgUEAAECAwQLIABBBGogARD2IAwDCyAAQQRqIAEQqyUMAgsgAEEEaiABEPMODAELIABBBGogARDnEgsgAEEoaiEAIAJBWGohAgwACwsLfgECfyMAQSBrIgIkAAJAQQAoAuyUnQEiA0UNACACQQRqIAMgACABQaj2mgFB4gAQ3xIgAkEUakGK95oBQREQvBQgAkEANgIQIAIoAggiARDeICABIAIpAhg3AgggASACKQIQNwIAIAJBBGoQ8QIgAkEEahCeDgsgAkEgaiQAC3kBAX8jAEEQayICJAAgAiAAKAIAIgBBJGo2AgwgAUGA4IEBQQhBu6SaAUEE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JAACQAJAIAMgAUkNAEEAIQUgAyABRw0BIAIgACADELoYRSEFDAELIARBEGogACABIAIgAxCYAyAEQQRqIARBEGoQ2AggBCgCBCEFCyAEQdAAaiQAIAULbwECfyMAQRBrIgIkAEEBIQMCQCABKAIAQSIgASgCBCgCEBEIAA0AIAIgATYCBCACQfkGNgIMIAIgADYCCCACQQRqQc2VgAEgAkEIahCXJA0AIAEoAgBBIiABKAIEKAIQEQgAIQMLIAJBEGokACADC3EDAX8BfgF8IwBBEGsiASQAIAApAwghAiAAQQo2AgggASAAKQMQNwMIIAEgAjcDAAJAAkAgAqciAEEKRg0AIABBB0YNAQsgARC1IkGo85oBQShBqIibARC5IQALIAErAwghAyABELUiIAFBEGokACADC3EBBH8jAEEgayIDJAAgAigCBCEEIAIoAgAhBUEEQQQQ6iAiBiACNgIAIAMgATYCHCADIAA2AhggAyAGNgIMIANBITYCFCADQYD1mgE2AhAgA0G5gYCAeDYCCCAFIAQgA0EIahDGGyECIANBIGokACACC2sBBH8gACgCBCEBAkAgACgCCCICRQ0AIAEhAwNAAkACQCADKAIAQQdHDQAgA0EQaigCACIEEI0CIARBwABBCBDcFAwBCyADENQLCyADQShqIQMgAkF/aiICDQALCyAAKAIAIAFBCEEoENUTC2IBAn8gACgCCEE4bCECIAAoAgQhAANAAkACQCACRQ0AAkAgACgCACIDQQFGDQAgA0EJRw0CIAEgAEEIahDvIAwCCyABIABBCGoQ5AcMAQsPCyAAQThqIQAgAkFIaiECDAALC2YBA38jAEEQayIDJAAgA0EIaiACQQFBARCBGCADKAIIIQQgAygCDCEFIABBADYCCCAAIAU2AgQgACAENgIAAkAgAkUNAAJAIAJFDQAgBSABIAL8CgAACyAAIAI2AggLIANBEGokAAtxAQF/IwBBEGsiASQAAkACQAJAQQAoAvCUnQFB/////wdxRQ0AEMAlRQ0BCyAAKAIELQBMQQdHDQELIAFBEGokAA8LIAFBBGogACgCAEEAQbPImAFBIRCsDyABQQRqEPECQdTImAFBDkHkyJgBELkhAAtnAQF/IABBDGoiASgCACAAQRBqKAIAEKUdIAAoAgggASgCAEEEQQwQ1xMgACgCFCAA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IAFJGzYCACAAIAMgASADIAFLGzYCBCACQRBqJAALWQECfyMAQRBrIgIkACABQRBBCCABKAIAQQJJG2ooAgAhAyACQQhqIAEoAiAQyg0gACADIAIoAgwiASADIAFJGzYCACAAIAMgASADIAFLGzYCBCACQRBqJAALdQACQAJAAkACQAJAIAJBemoOAwACAQILIAFB5L2BAUEGELoYDQFBACECIABBADoAAQwDCyABKQAAQvDklZvXzJy75QBRDQELIAAgASACQfS9gQFBAhDMFTYCBEEBIQIMAQsgAEEBOgABQQAhAgsgACACOgAAC18BA38jAEEQayICJAAgAkEEaiABQQFBAUEBEMIPIAIoAgghAwJAIAIoAgRBAUcNACADIAIoAgwQ/iAACyACKAIMIQQgACABNgIIIAAgBDYCBCAAIAM2AgAgAkEQaiQAC18BAn8jAEEQayICJAAgAkEEaiABQQBBBEEEEMIPIAIoAgghAQJAIAIoAgRBAUcNACABIAIoAgwQ/iAACyACKAIMIQMgAEEANgIIIAAgAzYCBCAAIAE2AgAgAkEQaiQAC2UBAX8jAEEQayICJAACQAJAIAAoAgAiAC0AAEEBRw0AIAIgAEEBajYCDCABQYCWmwFBBCACQQxqQSsQwwwhAQwBCyABKAIAQa6OmwFBBCABKAIEKAIMEQwAIQELIAJBEGokACABC2EBAn8gACgCCCECAkACQCABQYABTw0AQQEhAwwBCwJAIAFBgBBPDQBBAiEDDAELQQNBBCABQYCABEkbIQMLIAAgAxDaHyABIAAoAgQgACgCCGoQ7A4gACADIAJqNgIIQQALZQEBfyMAQRBrIgIkAAJAAkAgACgCACIALQAAQQFHDQAgAiAAQQFqNgIMIAFBgJabAUEEIAJBDGpBKxDDDCEBDAELIAEoAgBBro6bAUEEIAEoAgQoAgwRDAAhAQsgAkEQaiQAIAELXwEDfyMAQRBrIgIkACACQQRqIAFBAUEEQQQQww8gAigCCCEDAkAgAigCBEEBRw0AIAMgAigCDBD+IAALIAIoAgwhBCAAIAE2AgggACAENgIEIAAgAzYCACACQRBqJAALYgEDfyAAKAIEIQECQCAAKAIIIgJFDQAgASEDA0AgAygCACADQQRqKAIAQQRBGBDdEyADQQxqIQMgAkF/aiICDQALCyAAKAIA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gJabAUEEIAJBDGpB0gYQwwwhAQwBCyABKAIAQa6OmwFBBCABKAIEKAIMEQwAIQELIAJBEGokACABC2MBAX8jAEEQayICJAACQAJAIAAoAgAiACgCAEECRg0AIAIgADYCDCABQYCWmwFBBCACQQxqQagFEMMMIQEMAQsgASgCAEGujpsBQQQgASgCBCgCDBEMACEBCyACQRBqJAAgAQtVAQJ/IwBBEGsiAiQAIAAoAgQhAyAAKAIIIQAgAiABNgIMAkAgAEUNACAAQShsIQADQCACQQxqIAMQwgggA0EoaiEDIABBWGoiAA0ACwsgAkEQaiQAC1UBAn8jAEEQayICJAAgACgCBCEDIAAoAgghACACIAE2AgwCQCAARQ0AIABBKGwhAANAIAJBDGogAxC4BSADQShqIQMgAEFYaiIADQALCyACQRBqJAALWwEDfwJAIAAoAggiAkUNACACQTBsIQIgACgCBCEAIAEtACUhAyABLQAkIQQDQCABQQM6ACQgACABEH4gASADOgAlIAEgBDoAJCAAQTBqIQAgAkFQaiICDQALCwtcAgF/AX4CQCAALQAUQQJHDQAgACgCACIAEPsQIABBMEEIENwUDwsCQCAAKQMAIgJCA4NCAFINACACpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEPAeCwtVAQJ/IwBBEGsiAiQAIAAoAgQhAyAAKAIIIQAgAiABNgIMAkAgAEUNACAAQShsIQADQCACQQxqIAMQvQggA0EoaiEDIABBWGoiAA0ACwsgAkEQaiQAC1UBAn8jAEEQayICJAAgACgCBCEDIAAoAgghACACIAE2AgwCQCAARQ0AIABBKGwhAANAIAJBDGogAxDgCSADQShqIQMgAEFYaiIADQALCyACQRBqJAALVQECfyMAQRBrIgIkACAAKAIEIQMgACgCCCEAIAIgATYCDAJAIABFDQAgAEEobCEAA0AgAkEMaiADEOgGIANBKGohAyAAQVhqIgANAAsLIAJBEGokAAtcAgF/AX4jAEEQayIDJAAgA0EIaiACIAEoAgggASABLQAUENQHAkACQCADLQAIQQRGDQAgAykDCCIEQv8Bg0IEUQ0AIAAgBDcCAAwBCyAAQQQ6AAALIANBEGokAAtgAQN/AkAgAC0ADCICIAEtAAwiA0YNACACIANKIAIgA0hr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akH/AXFB1ABLDQELIAEgABDrDkEBcyECCyACC0wBAn8gACgCCEEGdCECIAAoAgQhAwJAA0AgAkUNASADIAEQxSIgAkFAaiECIANBwABqIQMMAAsLIAEgAEEMahDuHCABIABBGGoQ3iELTQEDfyAAKAIEIQECQCAAKAIIIgJFDQAgASEDA0AgAygCACADQQRqKAIAELQjIANBDGohAyACQX9qIgINAAsLIAAoAgAgAUEEQQwQ1hMLTQEDfyAAKAIIIQEgACgCBCICIQMCQANAIAFFDQEgAygCACADQQRqKAIAELIjIAFBf2ohASADQRRqIQMMAAsLIAAoAgAgAkEEQRQQ1RMLUwEDfwJAIAAoAgAiAUUNAAJAIAAoAgQiAigCACIDRQ0AIAEgAxEDAAsCQCACKAIEIgNFDQAgASADIAIoAggQ3BQLIAAoAgwgACgCCCgCDBEDAAsLSQECfyMAQRBrIgMkACABQYABIAIQJyECIANBCGoQ8R4gAygCDCEBIAAgAygCCCIENgIAIAAgASACIARBAXEbNgIEIANBEGokAAtOAQF/AkACQAJAIAINAEEBIQMMAQsgAhCKASIDRQ0BIAJFDQAgAyABIAL8CgAACyAAIAI2AgggACADNgIEIAAgAjYCAA8LQQEgAhD+IAALSwAgAEEkaiEAAkADQCABRQ0BIABBXGoQiSEgAEFoahDDHwJAIAAoAgBBgICAgHhGDQAgABDDHwsgAUF/aiEBIABBwABqIQAMAAsLC0cAAkACQCABQQlJDQAgASAAELkIIQEMAQsgABCKASEBCwJAIAFFDQAgAUF8ai0AAEEDcUUNACAARQ0AIAFBACAA/AsACyABC1ECAX8BfiMAQRBrIgIkACABKQIAIQMgAiABKAIIIgFFOgAMIAIgATYCCCACIAM3AgAgAhDUBSAAIAIpAgg3AgggACACKQIANwIAIAJBEGokAAtRAgF/AX4jAEEQayICJAAgASkCACEDIAIgASgCCCIBRToADCACIAE2AgggAiADNwIAIAIQ4gUgACACKQIINwIIIAAgAikCADcCACACQRBqJAALUgECfyAAKAIAIAAoAgRBBEEEENcTIAAoAgwgACgCEBDiIwJAIAAoAhwiAUUNACABIAEoAgAiAkF/ajYCACACQQFHDQAgACgCHCAAKAIgEPARCwtIAAJAIAFFDQADQCAAKAIAIABBBGooAgBBBEEEENcTIABBDGooAgAgAEEQaigCAEEEQQgQ1xMgAEE4aiEAIAFBf2oiAQ0ACwsLTgEBfwJAAkAgAUUNAEEAIQICQCAALQAAQQJxRQ0AIAFBDE0NAiAAKAAJIQILIAIPC0EAQQBBpP+EARD+FgALQQlBDSABQdT/hAEQkAoAC0sBA38gACgCDCIBIAAoAgQiAmtBHG4hAwJAIAEgAkYNAANAIAIQzCEgAkEcaiECIANBf2oiAw0ACwsgACgCCCAAKAIAQQRBHBDdEwtOAQF/AkAgAUUNAANAAkACQCAAKAIAQQVGDQAgABCCCgwBCyAAQQRqKAIAIgIQnAEgAkHAAEEIENwUCyAAQdgAaiEAIAFBf2oiAQ0ACwsLVQEBfyAAKAIMIgEQjQIgAUHAAEEIENwUIAAQohsgACgCACAAKAIEEPYjAkAgACgCHCIARQ0AIAAQ/hsgACgCACAAQQRqKAIAEPQjIABBFEEEENwUCwtOAAJAIABBAkYNAAJAIAANACABQQRqIgAoAgAgAUEIaigCABD8GiABKAIAIAAoAgAQ+CMgAUEcQQQQ3BQPCyABEI0CIAFBwABBCBDcFAsLTAECfyMAQRBrIgEkAEEBIQICQCAAKAIADQAgAUEIaiAAQQhqEJMUIAEoAgxBBEcNACABKAIIKAAAQfTQpZsHRyECCyABQRBqJAAgAgtVAQF/IAAoAgwiARDnASABQcAAQQgQ3BQgABCiGyAAKAIAIAAoAgQQ9iMCQCAAKAIcIgBFDQAgABD+GyAAKAIAIABBBGooAgAQ9CMgAEEUQQQQ3BQLC1UBAX8gACgCDCIBEIgCIAFBwABBCBDcFCAAEKIbIAAoAgAgACgCBBD2IwJAIAAoAhwiAEUNACAAEP4bIAAoAgAgAEEEaigCABD0IyAAQRRBBBDcFAsLVQEBfyAAKAIMIgEQ3AEgAUHAAEEIENwUIAAQohsgACgCACAAKAIEEPYjAkAgACgCHCIARQ0AIAAQ/hsgACgCACAAQQRqKAIAEPQjIABBFEEEENwUCwtNAQN/IAAoAgQhAQJAIAAoAggiAkUNACABIQMDQCADKAIAIANBBGooAgAQnSIgA0EMaiEDIAJBf2oiAg0ACwsgACgCACABQQRBDBDhEwtQAQF/IwBBEGsiAiQAIAJBCGogASABKAIAKAIEEQcAIAIgAigCCCACKAIMKAIYEQcAIAIoAgQhASAAIAIoAgA2AgAgACABNgIEIAJBEGokAAtQAQF/IwBBEGsiAiQAIAJBCGogASABKAIAKAIEEQcAIAIgAigCCCACKAIMKAIYEQcAIAIoAgQhASAAIAIoAgA2AgAgACABNgIEIAJBEGokAAtMAQF/AkACQCABQYABTw0AQQEhAwwBCwJAIAFBgBBPDQBBAiEDDAELQQNBBCABQYCABEkbIQMLIAEgAhDsDiAAIAM2AgQgACACNgIAC08BAn8gACgCBCECIAAoAgAhAwJAIAAoAggiAC0AAEUNACADQZT/mgFBBCACKAIMEQwARQ0AQQEPCyAAIAFBCkY6AAAgAyABIAIoAhARCAALRgECfyMAQRBrIgMkACABIAIQHyECIANBCGoQ8R4gAygCDCEBIAAgAygCCCIENgIAIAAgASACIARBAXEbNgIEIANBEGokAAtJAQF/IAAgASgCACICIAEoAgQiASgCCEF/akF4cWpBCGogASgCFBEHACACIAIoAgAiAEF/ajYCAAJAIABBAUcNACACIAEQ8hELC08BAX8gACgCsAEhAiAAQQA2ArABAkAgAkEBcQ0AQbTphAFBH0HU6YQBEOwbAAsgACAAKAJwIAAoArQBIgIgAWsgASACayACIAFLG2o2AnALUgEBfyMAQRBrIgEkAAJAQQIgAHQiAEGAgIDAAEkNACABIACtNwMIQfD9mgFBKyABQQhqQZzZhAFByPqEARDdFAALIAFBEGokACAAQYCAgIACcgteAQF/IAEoAgAiASABKAIAIgJBAWo2AgACQCACQX9KDQAACyAAIAEQjBggAEGAgICAeDYC1AUgAEGAgICAeDYC6AQgAEGAgICAeDYC2AQgAEECNgLIBCAAQQI2AsgBC18BAX8gASgCgAIiASABKAIAIgJBAWo2AgACQCACQX9KDQAACyAAIAEQjBggAEGAgICAeDYC1AUgAEGAgICAeDYC6AQgAEGAgICAeDYC2AQgAEECNgLIBCAAQQI2AsgBC18BAX8gASgCkAMiASABKAIAIgJBAWo2AgACQCACQX9KDQAACyAAIAEQjBggAEGAgICAeDYC1AUgAEGAgICAeDYC6AQgAEGAgICAeDYC2AQgAEECNgLIBCAAQQI2AsgBC14BAX8gASgC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CEHNlYABIANBCGogAhDrGwALRAEBfyAAKAIAIQACQCABKAIIIgJBgICAEHENAAJAIAJBgICAIHENACAAIAEQ0Q8PCyAALQAAIAEQvhIPCyAAIAEQiRILPQEBfyMAQRBrIgckACAHQQhqIAEtAAAgAyAEENUIIAcoAgwhASAAIAcoAgg2AgAgACABNgIEIAdBEGokAAs/AQJ/AkACQCABKAIAIgIgASgCBCIDRw0ADAELIAEgAkEBajYCACACLQAAIQELIAAgAToAASAAIAIgA0c6AAALQQEBfyABIAEoAggiBEEBajYCCAJAIARBAEgNACAAIAE2AgwgACADNgIIIAAgAjYCBCAAQbzngQE2AgAPCxD2JQALOAEBfyAAIAEoAgAiAjYCCCAAIAEpAgQ3AgAgAEEgIAJBCnZnayIBQQcgAUEHSRtBAnRBAXI2AgwLRgICfwF+IABBCEEJIAG9IgRCf1UiAhtBAyAEQv////////8Hg1AiAxs2AgQgAEHqz5oBQcDcgwEgAhtB58+aASADGzYCAAtCAAJAIAEoAgBBgICAgHhGDQAgACABKAIINgIIIAAgASkCADcCAA8LIAAgASgCBCIBQQRqKAIAIAFBCGooAgAQ3BMLQQEBfyMAQRBrIgIkACACIAEoAgg2AgggAiABKQIANwMAIAIQhgogACACKAIINgIIIAAgAikDADcCACACQRBqJAALPwEBfyMAQRBrIgIkACACIAEpAgA3AwAgAiABKAIINgIIIAEtAAwhASACQQIQsgsgACABIAIQiBggAkEQaiQACzsAAkAgAiAAIANB/wFxai0AQGoiAyAAKAIIIgJJDQAgAyACQdyVhQEQ/hYACyAAKAIEIANBAnRqKAIACz0AAkACQCABQQRNDQAgAUEITA0BIAAoAAUPC0EFIAEgAUGEgIUBEJAKAAtBAEEEIAFBe2pBoIWFARCQCgALRAEBfwJAQRgQigEiAg0AQQRBGBCiJAALIAIgASkCEDcCECACIAEpAgg3AgggAiABKQIANwIAIAAgAjYCBCAAQQA2AgALRwACQAJAAkACQCAALQAADgUBAQECAwALIABBBGoQrQgLDwsgACgCBCAAKAIIEOkjDwsgAEEEahDmHSAAKAIEIAAoAggQ6iMLRQECfyABKAIEIQIgASgCACEDAkBBCBCKASIBDQBBBEEIEKIkAAsgASACNgIEIAEgAzYCACAAQdy6mAE2AgQgACABNgIAC0cBAX8CQCAAKAI4IgFBgICAgHhGDQAgACgCICAAKAIkQQRBBBDVEyAAKAIsIAAoAjBBBEEIENUTIAEgACgCPEEEQQwQ1RMLC0ACAX8BfkGgiJ0BELolGgJAQQApA6CInQEiAUIDg0IAUg0AIAGnIgAgACgCACIAQQFqNgIAIABBf0oNAAALIAELRwEBfwJAQRwQigEiAQ0AQQRBHBCiJAALIAFCADcCCCABQoCAgICAATcCACABQgA3AhAgAUEAOwEYIAAgATYCBCAAQQI2AgALPwECfwJAIAAoAggiAUUNACAAKAIEIQADQCAAKAIAIgIQ3wIgAkHgAEEIENwUIABBBGohACABQX9qIgENAAsLCzkBAn8CQCAAUA0AIABCA4NCAFINACAApyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEPAeCwtAAgF/AX5BuIqdARC6JRoCQEEAKQO4ip0BIgFCA4NCAFINACABpyIAIAAoAgAiAEEBajYCACAAQX9KDQAACyABCzwBAX8CQCAAKAIIIgJFDQAgAkECdCECIAAoAgQhAANAIAAoAgAgARC3ASAAQQRqIQAgAkF8aiICDQALCws8AQF/AkAgASgCCCICRQ0AIAJBAnQhAiABKAIEIQEDQCABKAIAIAAQtwEgAUEEaiEBIAJBfGoiAg0ACwsLQwEBfwJAAkACQCAAKAIADgQBAgACAQsgACgCDA8LIAAoAiAiAUUNACAAKAIQIgAgASgCCCIBIAAgAUsbDwsgACgCFAtFAQF/AkACQAJAIAAoAgAiACgCAA4CAAECCyAAKAIIIgFFDQEgACgCBEEBIAEQ6SEMAQsgAEEEahCyGAsgAEEUQQQQ3BQLPQECfwJAA0AgASIDIAA2AgwgAygCECIERQ0BIARBBGohASAEKAIAQQhGDQALCyADQRBqEOsiIAMgAjYCEAs6AQF/IAAoAghBBHQhAiAAKAIEIQACQANAIAJFDQEgAEEMaiABEJUFIAJBcGohAiAAQRBqIQAMAAsLCz4BAX8CQCAAKAIIIgMgACgCAEcNACAAELcaCyAAIANBAWo2AgggACgCBCADQQN0aiIAIAI2AgQgACABNgIACzoBAX8gACgCCEEEdCECIAAoAgQhAAJAA0AgAkUNASAAQQxqIAEQqyUgAkFwaiECIABBEGohAAwACwsLPAEBfyAALQAUIQEgAEEBOgAUAkACQCABDQAgAEF4aiIAIAAoAgBBAWoiATYCACABRQ0BIAAQ3CULDwsACzsBAX8gACACEI8fIAAoAgghAwJAIAJFDQAgAkUNACAAKAIEIANqIAEgAvwKAAALIAAgAyACajYCCEEACz4AAkAgAiADTw0AQdT9mgFBE0HQ2ZoBEOsbAAsgACADNgIEIAAgATYCACAAIAIgA2s2AgwgACABIANqNgIICz8BAX8jAEEQayICJAAgAiAAKAIAKAIANgIMIAFB4uCBAUEOQbeylwFBAyACQQxqQSsQxg4hACACQRBqJAAgAAs6AQF/IwBBEGsiAiQAIAJBADYCDCACIAEgAkEMahDoGCAAIAIoAgAgAigCBBDlBSEBIAJBEGokACABC0EBAX8gACgCACEAAkAgASgCCCICQYCAgBBxDQACQCACQYCAgCBxDQAgACABEMEKDwsgACABEM0SDwsgACABEM4SCzsAAkAgAiADTw0AQdT9mgFBEyAEEOsbAAsgACADNgIEIAAgATYCACAAIAIgA2s2AgwgACABIANqNgIICzsAAkAgAiADTw0AQdT9mgFBEyAEEOsbAAsgACADNgIEIAAgATYCACAAIAIgA2s2AgwgACABIANqNgIICzsBAX8gACACEJUfIAAoAgghAwJAIAJFDQAgAkUNACAAKAIEIANqIAEgAvwKAAALIAAgAyACajYCCEEACzkBAX8jAEEQayICJAAgAiAAQQFqNgIMIAFByqCFAUEHIABBMiACQQxqQSsQ6gghACACQRBqJAAgAAtNAQF/IAAoAvACIAAoAvQCEMgjAkAgACgCsAIiAUGAgICAeEYNACABIAAoArQCEMgjCwJAIAAoAsQCQYCAgIB4Rg0AIABBxAJqEPMeCws+AQF/AkAgASAAKAKwAnQgACgCtAJqIgEgACgCFCICSQ0AIAEgAkHY+YQBEP4WAAsgACgCECABQQN0aikDAAs8AQF/AkAgACgCAEECRg0AIABBCGoQmxsgACgCGCIBIAEoAgAiAUF/ajYCACABQQFHDQAgACgCGBCIHQsLOwACQAJAIAFFDQAgAUEETA0BIAAoAAEPC0EBQQBBAEH0/4QBEJAKAAtBAEEEIAFBf2pBoIWFARCQCgALOwACQAJAIAFFDQAgAUEETA0BIAAoAAEPC0EBQQBBAEGI+YQBEJAKAAtBAEEEIAFBf2pBoIWFARCQCgALQQEBfyAAKAIAIQACQCABKAIIIgJBgICAEHENAAJAIAJBgICAIHENACAAIAEQwQoPCyAAIAEQzRIPCyAAIAEQzhILOwEBfyAAIAIQjx8gACgCCCEDAkAgAkUNACACRQ0AIAAoAgQgA2ogASAC/AoAAAsgACADIAJqNgIIQQALPQEBfyMAQRBrIgIkACACQQc2AgwgAiAANgIIIAEoAgAgASgCBEH+gYABIAJBCGoQzSMhASACQRBqJAAgAQs4AEGftoEBIABBCXZB8JmbAWogAEH/xwxLGy0AAEEFdCAAQQN2QT9xai0AwKubASAAQQdxdkEBcQs3AQF/QQEhBAJAIABB/v97Sw0AIAEgAHJFDQAgAkUNACACIAFBf2ogAygCFBEIAEEBcyEECyAECzkBAn8jAEEQayIBJAAgAUEIaiAAEOIMIAEoAgghACABKAIMIQIgAUEQaiQAIAJBgIDEACAAQQFxGwtFAAJAAkACQAJAA0ACQCAAKAIAQX9qDgYFAAUCBAMECyAAKAIEIQAMAAsLIAAoAggQjw8PCyAAKAIEEI8PDwtBAQ8LQQALOwEBfyAAIAIQjx8gACgCCCEDAkAgAkUNACACRQ0AIAAoAgQgA2ogASAC/AoAAAsgACADIAJqNgIIQQALOwIBfwF+AkAgACkDACICQgODQgBSDQAgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDwHgsLNgECfyABQQZ0IQECQANAIAEiAkUNASACQUBqIQEgACgCACEDIABBwABqIQAgA0UNAAsLIAJFCzUBAn8gAUEobCEBAkADQCABIgJFDQEgAkFYaiEBIAAoAgAhAyAAQShqIQAgA0UNAAsLIAJFCzsCAX8BfgJAIAApAwAiAkIDg0IAUg0AIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQ8B4LCzsBAX8gACACEI8fIAAoAgghAwJAIAJFDQAgAkUNACAAKAIEIANqIAEgAvwKAAALIAAgAyACajYCCEEACzgBAn8jAEEQayIBJABBACECAkAgACgCAEECRg0AIAFBCGogABCfEyABKAIMIQILIAFBEGokACACCzgBAn8jAEEQayIBJABBACECAkAgACgCAEEHRg0AIAFBCGogABDKDSABKAIMIQILIAFBEGokACACCzoBAX8jAEEQayICJAAgAkEANgIMIAIgASACQQxqEOgYIAAgAigCACACKAIEEIcDIQEgAkEQaiQAIAELPAEBfyMAQRBrIgIkACACQQhqIAAgACgCACgCBBEHACACKAIIIAEgAigCDCgCEBEIACEAIAJBEGokACAACz0AAkACQAJAAkAgACgCAA4EAQIDAAELIABBBGoQrCMPCyAAQQhqEOYiDwsgAEEEahCrIw8LIABBBGoQrSMLOwEBfyMAQRBrIgMkACADIAE2AgAgAyACKQIANwIEIAMgAigCCDYCDCAAIAEgA0EEahDGCSADQRBqJAALQgECf0EBIQECQAJAAkAgAC0AyAEiAkF9ag4EAgEBAAELIAAQ6BFBASEBDAELIAJBowFGIAAtAMkBciEBCyABQQFxCzsBA38gACgCACEBIAAoAgQhAgJAA0AgASIDIAJGDQEgACADQcAAaiIBNgIAIAMQ4RhFDQALCyADIAJHCzoAAkAgACgCACIAKAIAQQNHDQAgAEEQaiABEKslIABBBGogARCIHCAAKAIgIAEQrhwPCyAAIAEQsx8LNQEBfwJAIABFDQAgASAAQQxqKAIAIgIgAEEQaigCACIAIAIgAEkbIAIgACACIABLGxCHHAsLOQEBfyAAIAIQjx8gACgCCCEDAkAgAkUNACACRQ0AIAAoAgQgA2ogASAC/AoAAAsgACADIAJqNgIICzkCAX8BfiMAQRBrIgIkACACQQhqIAFBCEEQEIEYIAIpAwghAyAAQQA2AgggACADNwIAIAJBEGokAAs5AgF/AX4jAEEQayICJAAgAkEIaiABQQhBIBCBGCACKQMIIQMgAEEANgIIIAAgAzcCACACQRBqJAALPAEBfyMAQRBrIgQkACAEIAE2AgwgBCAANgIIQQAgBEEIakHsrpgBIARBDGpB7K6YASACQcEAIAMQ2wsAC0EAAkACQCABIAIQhhlFDQAgACEBDAELIAAgASkCEDcCECAAIAEpAgg3AgggACABKQIANwIACyABQYGAgIB4NgIACzsBAX8jAEEQayIEJAAgBCACNgIMIAQgATYCCCAAIARBCGpBwKOcASAEQQxqQcCjnAFBACAEIAMQ2wsACz4BAX8jAEEQayIEJAAgBCAANgIMIARBpMuYATYCCEEAIARBCGpBuMeBASAEQQxqQbjHgQEgASACIAMQ2wsAC0EBAX8jAEEQayIBJAAgASAANgIMIAFBpMuYATYCCEEAIAFBCGpByMeBASABQQxqQcjHgQFBACABQfjPgQEQ2wsACzsBAX8jAEEQayIGJAAgBiACNgIMIAYgATYCCCAAIAZBCGpBwIGCASAGQQxqQcCBggEgAyAEIAUQ2wsACzwBAX8jAEEQayICJAAgAiAAKAIANgIMIAFB4uCBAUEOQbeylwFBAyACQQxqQSsQxg4hACACQRBqJAAgAAtAAQF/AkAgASgCCCICQYCAgBBxDQACQCACQYCAgCBxDQAgACABEMEKDwsgACgCACABEKETDwsgACgCACABEKITCz0BAX8jAEEQayICJAAgAiAAKAIANgIMIAFB2qGFAUEPQemhhQFBCSACQQxqQdAAEMYOIQAgAkEQaiQAIAALQAEBfwJAIAEoAggiAkGAgIAQcQ0AAkAgAkGAgIAgcQ0AIAAgARCFCg8LIAAoAgAgARCjEw8LIAAoAgAgARCkEwswAAJAIABBv39qQf8BcUEaSQ0AIABB3wBxIAAgAEGff2pB/wFxQRpJGw8LIABBIHILOQEBfyAAIAIQ2h8gACgCCCEDAkAgAkUNACACRQ0AIAAoAgQgA2ogASAC/AoAAAsgACADIAJqNgIIC0EBAX8jAEEQayIBJAAgASAANgIMIAFBuOKGATYCCEEAIAFBCGpBsIGCASABQQxqQbCBggFBACABQdDXiQEQ2wsACzkAAkAgAkGAgMQARg0AIAAgAiABKAIQEQgARQ0AQQEPCwJAIAMNAEEADwsgACADIAQgASgCDBEMAAs+AQF/IwBBEGsiAiQAIAIgATYCDCACIAA2AghBACACQQhqQdCBggEgAkEMakHQgYIBQQAgAkHMg4IBENsLAAtAAQF/AkAgASgCCCICQYCAgBBxDQACQCACQYCAgCBxDQAgACABEMEKDwsgACgCACABEKETDwsgACgCACABEKITC0UBAX8jAEEQayIBJAAgAUGky5gBNgIMIAEgADYCCEEAIAFBCGpBnOKDASABQQxqQZzigwFB0OeDAUHLAEH454MBENsLAAs5AgF/AX4jAEEQayICJAAgAkEIaiABQQRB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AkEMakG2ARDDDCEAIAJBEGokACAACzMBAX8jAEEQayICJAAgAiAANgIMIAFBra2FAUEJIAJBDGpBuwEQwwwhACACQRBqJAAgAAsyAQF/IwBBEGsiAiQAIAIgADYCDCABQZCylwFBECACQQxqQSYQwwwhACACQRBqJAAgAAsyAQF/IAAoAgghASAAKAIEIQACQANAIAFFDQEgAUF/aiEBIAAQ+RsgAEEYaiEADAALCwsxAQF/IwBBEGsiAiQAIAJBCGogABCTFCABIAIoAgggAigCDBCdByEAIAJBEGokACAACy0AAkAgAyABSQ0AIAAgAyABazYCBCAAIAIgAWo2AgAPCyABIAMgAyAEEJAKAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQazImAFBByACQQxqQckAEMMMIQAgAkEQaiQAIAALMwEBfwJAIAFFDQADQCAAKAIAIgIQnAEgAkHAAEEIENwUIABBBGohACABQX9qIgENAAsLCy8AAkAgAUUNAANAAkAgACgCAEEHRg0AIAAQowgLIABBKGohACABQX9qIgENAAsLCzMBAX8CQCABRQ0AA0AgACgCACICEJwBIAJBwABBCBDcFCAAQQxqIQAgAUF/aiIBDQALCwsyAQF/IABBCGoQ5gsCQCAAQX9GDQAgACAAKAIEQX9qIgE2AgQgAQ0AIABBGEEEENwUCwsyAAJAAkAgAC0AeEEBcQ0AIAAtAIEBQQhxRQ0BCyADEOYDDwsgACABIAIgAxDGGxCRCQs0AAJAIAEtAAANACAAKAIgIAEQlwEgACgCAEECRw0AIAEtAABBAXENACAAKAIEIAEQlwELCzgAAkAgA0UNAAJAIAFFDQAgACABIAMgAigCNBELAA8LIABBgICAgHg2AgAPCyAAQYCAgIB4NgIACzUAAkAgASgCREUNAAJAIAEtAEwNACABIAIQsQYMAQsgASACNgIEIAFBATYCAAsgAEEEOgAACzABAX8gACABQRRBDCABKAIAQQJJIgIbaigCADYCBCAAIAFBEEEIIAIbaigCADYCAAsuAQF/IwBBEGsiAyQAIANBCGogAiAAIAEQhBEgAygCCCEBIANBEGokACABQQFGCy4BAX8jAEEQayIDJAAgA0EIaiACIAAgARCEESADKAIIIQEgA0EQaiQAIAFBAUYLMgACQAJAIAAtAHhBAXEN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Cx8AAkAgAUUNACAAIAFuIAFqQQF2DwtBhIyEARDWIwALLQAgASgCACAAKAIALQAAQQJ0IgAoAujgnAEgACgCzOCcASABKAIEKAIMEQwACy0AIAEoAgAgACgCAC0AAEECdCIAKAKw2pwBIAAoAqTanAEgASgCBCgCDBEMAAstACABKAIAIAAoAgAtAABBAnQiACgCqN6cASAAKAKc3pwBIAEoAgQoAgwRDAALLQAgASgCACAAKAIALQAAQQJ0IgAoAoTknAEgACgC8OOcASABKAIEKAIMEQwACyAAAkAgASAAayIBQRBJDQAgACABEMwGDwsgACABEPocCyoBAX8gACgCACAAKAIEEL8jIAAoAhAiASAAKAIUEIEeIAAoAgwgARDAIwseAAJAIAIgAUkNACACIAEgAxD+FgALIAAgAkEDdGoLKQAgASAAQYABc0H/AXFBAnQiACgCsPWcASAAKAKw7ZwBIAIoAgwRDAALLQAgASgCACAAKAIALQAAQQJ0IgAoArz9nAEgACgCsP2cASABKAIEKAIMEQwACy0AIAEoAgAgACgCAC0AAEECdCIAKALU/ZwBIAAoAsj9nAEgASgCBCgCDBEMAAstACABKAIAIAAoAgAtAABBAnQiACgC+P2cASAAKALs/ZwBIAEoAgQoAgwRDAALLQAgASgCACAAKAIALQAAQQJ0IgAoArj+nAEgACgChP6cASABKAIEKAIMEQwACy0AIAEoAgAgACgCAC0AAEECdCIAKALI/5wBIAAoArz/nAEgASgCBCgCDBEMAAstACABKAIAIAAoAgAtAABBAnQiACgC4P+cASAAKALU/5wBIAEoAgQoAgwRDAALLQAgASgCACAAKAIALQAAQQJ0IgAoAoSAnQEgACgC+P+cASABKAIEKAIMEQwACy0AIAEoAgAgACgCAC0AAEECdCIAKALEgJ0BIAAoApCAnQEgASgCBCgCDBEMAAseAAJAIAIgAUkNACACIAEgAxD+FgALIAAgAkEFdGoLHgACQCACIAFJDQAgAiABIAMQ/hYACyAAIAJBAnRqCx4AAkAgAiABSQ0AIAIgASADEP4WAAsgACACQQZ0agsnACAAKQMIIAApAxgQoCUgAEEgahC3IiAAKAI4EKEjIAAoAjwQpCMLJwEBfyABIAEoAngiA0H//3txNgJ4IAAgASACQQAQjQggASADNgJ4Cx4AAkAgAiABSQ0AIAIgASADEP4WAAsgACACQQxsagslAQF/IAEoAgAhAiABQQA2AgAgASgCBCEBIAIQ+yAgACABEJsCCyABAX9BACEEAkAgASADRw0AIAAgAiABELoYRSEECyAECyUBAX8gASgCACECIAFBADYCACABKAIEIQEgAhD7ICAAIAEQwRQLJQAgACABKAIINgIEIABBACABKAIEIAEoAgBBgICAgHhGGzYCAAsfACAAIAIQrw0gAEEQaiACQRBqEK8NIAJBCCABEL0KCyoAIAEoAgAgAC0AAEECdCIAKAKAqJwBIAAoAvSnnAEgASgCBCgCDBEMAAsiAQF/AkAgASAAKAIAIAAoAggiAmtNDQAgACACIAEQ4AoLCyABAX9BACEEAkAgASADSQ0AIAIgACADELoYRSEECyAECyAAAkAgACgCACIAQQFxDQAgABCRFA8LIAAgASACEIgZCyQAAkAgAA0AQZSmnAFBMhCfJAALIAAgAiADIAQgASgCEBEOAAskAAJAIAANAEGUppwBQTIQnyQACyAAIAIgAyAEIAEoAhARDwALJAACQCAADQBBlKacAUEyEJ8kAAsgACACIAMgBCABKAIQEQ8ACyQAAkAgAA0AQZSmnAFBMhCfJAALIAAgAiADIAQgASgCEBEOAAskAAJAIAANAEGUppwBQTIQnyQACyAAIAIgAyAEIAEoAhAROQALJAACQCAADQBBlKacAUEyEJ8kAAsgACACIAMgBCABKAIQETUACyQAAkAgAA0AQZSmnAFBMhCfJAALIAAgAiADIAQgASgCEBEOAAskAAJAIAANAEGUppwBQTIQnyQACyAAIAIgAyAEIAEoAhARLwALIQACQCACRQ0AIAIgARDUICEBCyAAIAI2AgQgACABNgIACyIBAX8gACAAKAIAIgFBf2o2AgACQCABQQFHDQAgABCSDwsLIQACQCACRQ0AIAIgARDUICEBCyAAIAI2AgQgACABNgIACx4AIAAoAiRBACAAKAIcGyAAKAIUIAAoAghqQQJ0agshACAAIAIQ0AYgAEHAAGogAkHAAGoQ0AYgAkEIIAEQ7wcLJAAgACgCACAAKAIEQQRBBBDXEyAAKAIMIAAoAhBBBEEEENcTCyoAIAEoAgAgAC0AAEECdCIAKALk25wBIAAoAszbnAEgASgCBCgC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AUUNACAAKAIEIAFBARDcFAsLHQACQCAALQALQf4BRw0AIAAoAgAgACgCCBDPDAsLHAEBfwJAIAEgABDUICICDQAgACABEKIkAAsgAgshAQF/AkAgACgCACIBQYSAgIB4SA0AIAEgACgCBBDIIwsLHgAgACgCACIAKAIAIAAoAgQgASgCACABKAIEEMYECx4BAX8QhiEiAUIANwIMIAEgADcCBCABQQE2AgAgAQseAQF/EIYhIgBCADcCBCAAQQo2AgAgAEIANwIMIAALHAAgACgCACIAKAIAIAEgAEEEaigCACgCDBEIAAscAAJAIAAoAgBBAkYNACAAKAIEIAAoAggQsiMLCyEAQbSOmwFBso6bASAALQAAG0ECIAEoAgAgASgCBBDGBAshAQF/AkAgACgCACIBQYCAgIB4Rg0AIAEgACgCBBCyIwsLHQACQCAALQALQf4BRw0AIAAoAgAgACgCCBDPDAsLGwAgASACIAMQxhshAyAAQQI6AAAgACADNgIECxsAIAEgAiADEMYbIQMgAEEBOgAAIAAgAzYCBAscAQF/AkAgASAAENQgIgINACAAIAEQoiQACyACCxkAAkAgASAAKAIITQ0AIAAgASACEMICGgsLGQACQCABIAAoAghNDQAgACABIAIQvgIaCwsbACAAIAEQowUCQCABKAIARQ0AIAEgABD9CAsLIQEBfwJAIAAoAgAiAUGAgICAeEYNACABIAAoAgQQsiMLCx0AAkAgAC0AC0H+AUcNACAAKAIAIAAoAggQzwwLCxwBAX8CQCABIAAQ1CAiAg0AIAAgARCiJAALIAILGgACQCAALQA0QQRHDQAgABDGHQ8LIAAQ0R8LGgAgACkDCBCcISAAQSBqEN4iIABBJGoQ3iILGwAgACkDACAAQRBqKQMAEKAlIABBGEEIENwUCxwAIABBDGogACgCBCAAKAIIIAAoAgAoAhARCwALGQACQCABKAIAQRFHDQAgACABQQhqEOQHCwsbACAAKAIAIAAoAgQgARDCIiAAQShqIAEQpyULGQACQCAAKAIAQQFHDQAgAEEEaiABEJUFCwsZAAJAIAAoAgBBA0cNACAAQQRqIAEQlQULCxkAAkAgACgCAEEBRw0AIABBBGogARCVBQsLGQACQCAAKAIAQQNHDQAgAEEEaiABEKslCwsZAAJAIAAoAgBBAUcN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IABBACkChJebATcCCCAAQQApAvyWmwE3AgALHAAgAEEAKQL45JoBNwIIIABBACkC8OSaATcCAAscACAAQQApAqSXmwE3AgggAEEAKQKcl5sBNwIACxIAIABBBGoQ9yAgAEEkahCxGAsWACAAQcjnmgE2AgQgACABQRxqNgIACxYAIABBgOyaATYCBCAAIAFBCGo2AgALHAAgAEEAKQKUl5sBNwIIIABBACkCjJebATcCAAscACAAQQApAojlmgE3AgggAEEAKQKA5ZoBNwIACxwAIABBACkC1JebATcCCCAAQQApAsyXmwE3AgALHAAgAEEAKQLkl5sBNwIIIABBACkC3JebATcCAAscACAAQQApAsSXmwE3AgggAEEAKQK8l5sBNwIACxwAIABBACkCtJebATcCCCAAQQApAqyXmwE3AgALFAACQCAAKAIAQQtGDQAgABC1IgsLEgAgAEEIahC1IiAAQThqELMiCxQAAkAgACgCAEEKRg0AIAAQkxYLCxUAIAAoAgAiABDyByAAQQxBBBDcFAsUAAJAIAAtABRBA0YNACAAEMYdCwsUAAJAIAAoAgBBB0YNACAAEMkVCwsUACAAIAEgAiADELQFIAEgABClDwsWACAAKAIAIgAQhAcgAEHAAEEIENwUCxYAIAAoAgAiABC0HiAAQcAAQQQQ3BQLFAACQCAALQAIQQVJDQAgABC6IgsLGAACQCAAKAIAQYCAgIB4Rg0AIAAQ5SILCxgAAkAgACgCAEGAgICAeEYNACAAEKkhCwsVACAAKAIAIgAQyRUgAEEoQQgQ3BQLGAACQCAAKAIAQYCAgIB4Rg0AIAAQoiELCxQAAkAgASgCAEUNACABIAAQlQULCxMAAkAgAEEDRw0AIAEgAhC+AQsLFAACQCAAKAIARQ0AIAAgARCqJQsLEwAgASAAEO8cIABBDGogARDDIgsTACABIABBMGoQ7hwgACABEP4XCxMAIAAgARCoJSAAQQRqIAEQlQULFAACQCABKAIARQ0AIAEgABCOBQsLFwAgACABIAAgASACEOYSQbCMmwEQ0x8LFAACQCABKAIARQ0AIAEgABCrJQsLFwAgACABIAAgASACEOkRQcCMmwEQ0x8LEwAgAEEwaiABEPIcIAAgARDSEwsTAEEAIACtQiCGQgGENwPIlZ0BCxMAAkAgAUUNACAAIAEg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wCYgd2hpY2ggb2NjdXJzIGJlZm9yZSBsYXN0IGNvZGVwb2ludCBVK8AAF2JhZCByZWZlcmVuY2UgdG8gbmFtZSAjwAAZYmFkIHJlZmVyZW5jZSB0byBzb3VyY2UgI8AAASPAABppbnZhbGlkIHV0Zi04IHNlcXVlbmNlIG9mIMASIGJ5dGVzIGZyb20gaW5kZXggwAAqaW5jb21wbGV0ZSB1dGYtOCBieXRlIHNlcXVlbmNlIGZyb20gaW5kZXggwABKaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgbGl0ZXJhbCBvciBjb25jYXQsIGdvdCDAAEBpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBsaXRlcmFsLCBnb3QgwAAYZXhwZWN0ZWQgY2hhciBhdCBvZmZzZXQgwAAcZ2F2ZSB1cCBzZWFyY2hpbmcgYXQgb2Zmc2V0IMAAIXF1aXQgc2VhcmNoIGFmdGVyIG9ic2VydmluZyBieXRlIMALIGF0IG9mZnNldCDAABZzbGljZSBpbmRleCBzdGFydHMgYXQgwA0gYnV0IGVuZHMgYXQgwAAVYnl0ZSByYW5nZSBzdGFydHMgYXQgwA0gYnV0IGVuZHMgYXQgwADABCBhdCDAACBpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzIMASIGJ1dCB0aGUgaW5kZXggaXMgwAAqaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogwBcgaXMgYWxyZWFkeSByZW5hbWVkIHRvIMAWLCBidXQgaXQncyByZW5hbWVkIGFzIMAATWludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IHBhcnNlX2xpdCBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgwAADb3IgwAAVVW5leHBlY3RlZCBjaGFyYWN0ZXIgwAARY2FsbGVkIGV4cGVjdCBvbiDAAMAJIGF0IGxpbmUgwAggY29sdW1uIMAADWludmFsaWQgc3BhbiDAGCBmb3IgaGF5c3RhY2sgb2YgbGVuZ3RoIMAAEXN0YXJ0IGJ5dGUgaW5kZXggwCcgaXMgb3V0IG9mIGJvdW5kcyBmb3Igc3RyaW5nIG9mIGxlbmd0aCDAAA9lbmQgYnl0ZSBpbmRleCDAJyBpcyBvdXQgb2YgYm91bmRzIGZvciBzdHJpbmcgb2YgbGVuZ3RoIMAAEnJhbmdlIHN0YXJ0IGluZGV4IMAiIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIMAAEHJhbmdlIGVuZCBpbmRleCDAIiBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCDAAMAVIGV4Y2VlZHMgY2FwYWNpdHkgb2YgwBAgd2hlbiBpbnNlcnRpbmcgwAAHc3RyaW5nIMAAKEJhZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlLCBleHBlY3RlZCDAABF1bmtub3duIHZhcmlhbnQgYMAMYCwgZXhwZWN0ZWQgwAAPaW52YWxpZCBsZW5ndGggwAssIGV4cGVjdGVkIMAAD2ludmFsaWQgdmFsdWU6IMALLCBleHBlY3RlZCDAAA5pbnZhbGlkIHR5cGU6IMALLCBleHBlY3RlZCDAABJVbmV4cGVjdGVkIHRva2VuIGDADGAuIEV4cGVjdGVkIMAAInNwYXJzZSBzZXQgY2FwYWNpdHkgY2Fubm90IGV4Y2NlZCDAAAFbwAJdIMAADGNhcHR1cmUocGlkPcAILCBncm91cD3ABywgc2xvdD3ABSkgPT4gwADAAS3ABCA9PiDAABBtYXAuc3RhcnRfcG9zID0gwBY7IHRvdGFsX2V4dHJhX2J5dGVzID0gwAk7IGJwb3MgPSDAAB1pbnZhbGlkIHJhbmdlIG1hcHBpbmcgaW5kZXg6IMAAU2ludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGB0b2tlbl92YWx1ZWAgc2hvdWxkIGJlIGEgd29yZCwgYnV0IGdvdDogwAAvdHJpZWQgdG8gdW53cmFwIGJ5dGUgY2xhc3MgZnJvbSBIaXJGcmFtZSwgZ290OiDAADJ0cmllZCB0byB1bndyYXAgVW5pY29kZSBjbGFzcyBmcm9tIEhpckZyYW1lLCBnb3Q6IMAAKXRyaWVkIHRvIHVud3JhcCBleHByIGZyb20gSGlyRnJhbWUsIGdvdDogwAAqdHJpZWQgdG8gdW53cmFwIGdyb3VwIGZyb20gSGlyRnJhbWUsIGdvdDogwAAvdHJpZWQgdG8gdW53cmFwIHJlcGV0aXRpb24gZnJvbSBIaXJGcmFtZSwgZ290OiDAAC10cmllZCB0byB1bndyYXAgYWx0IHBpcGUgZnJvbSBIaXJGcmFtZSwgZ290OiDAABBhc3NlcnRpb24gYGxlZnQgwBcgcmlnaHRgIGZhaWxlZAogIGxlZnQ6IMAJCiByaWdodDogwAAQYXNzZXJ0aW9uIGBsZWZ0IMAQIHJpZ2h0YCBmYWlsZWQ6IMAJCiAgbGVmdDogwAkKIHJpZ2h0OiDAAD9pbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBpbnZhbGlkIHN5bnRheDogUGF0OiDAAAZyYW5nZSDAECBvdXQgb2YgYm91bmRzOiDAAAdlcnJvcjogwAAaaW52YWxpZCBiYXNlNjQgY2hhcmFjdGVyOiDAACZjYW5ub3QgZmxhdHRlbiB0aGUgaW5kZXhlZCBzb3VyY2VtYXA6IMAACmJhZCBqc29uOiDAAEhjYW5ub3QgYWNjZXNzIGEgVGhyZWFkIExvY2FsIFN0b3JhZ2UgdmFsdWUgZHVyaW5nIG9yIGFmdGVyIGRlc3RydWN0aW9uOiDAAFFpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBmb3VuZCBpbXBvc3NpYmxlIGVycm9yIGluIG1ldGEgZW5naW5lOiDAAAZpbmRleCDADyBvdXQgb2YgcmFuZ2U6IMAAKmludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IMAALVVuZXhwZWN0ZWQgZXNjYXBlIHNlcXVlbmNlIGluIHJlc2VydmVkIHdvcmQ6IMAAEWludmFsaWQgJ3RvJyBpZDogwAATaW52YWxpZCAnZnJvbScgaWQ6IMAAKW5vdCB5ZXQgaW1wbGVtZW50ZWQ6IGpzb24gc3ViZGlhZ25vc3RpYzogwADAAjogwADAwMABIMAAAiAgwAEgwAADXHV7wAF9AAlFeHBlY3RlZCDABiBkaWdpdAABJ8BNJyBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlciBvZiBhIGZ1bmN0aW9uLCBtZXRob2Qgb3IgY2xhc3MAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvZW1wdHkucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9hbGxvYy9zcmMvY29sbGVjdGlvbnMvYnRyZWUvbWFwL2VudHJ5LnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9tZXRhL3N0cmF0ZWd5LnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3ByZWZpbHRlci90ZWRkeS5ycwAvcnVzdC9kZXBzL3J1c3RjLWRlbWFuZ2xlLTAuMS4yNy9zcmMvbGVnYWN5LnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL21lbWNoci0yLjcuNi9zcmMvYXJjaC9hbGwvdHdvd2F5LnJzAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL3BhcnNlci9qc3gucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL2h5YnJpZC9yZWdleC5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL2luZGV4LnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvYWxsb2Mvc3JjL2JvcnJvdy5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL251bS9pbXAvZmx0MmRlYy9zdHJhdGVneS9ncmlzdS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93eXotMC41LjEvc3JjL2NvbXUucnMAY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvcGFyc2VyL2lucHV0LnJzAGNyYXRlcy9zd2NfY29tbW9uL3NyYy9pbnB1dC5ycwBjcmF0ZXMvc3djX2VjbWFfYXN0L3NyYy9saXN0LnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvY29yZS9zcmMvc2xpY2Uvc29ydC9zaGFyZWQvc21hbGxzb3J0LnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvY29yZS9zcmMvc2xpY2Uvc29ydC91bnN0YWJsZS9xdWlja3NvcnQucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9zb3J0L3N0YWJsZS9xdWlja3NvcnQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9jb252ZXJ0LnJzAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL3BhcnNlci90eXBlc2NyaXB0LnJzAGNyYXRlcy9zd2NfZWNtYV90cmFuc2Zvcm1zX3R5cGVzY3JpcHQvc3JjL3R5cGVzY3JpcHQucnMAY3JhdGVzL3N3Y19lY21hX2NvZGVnZW4vc3JjL3R5cGVzY3JpcHQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcGFya2luZ19sb3RfY29yZS0wLjkuMTAvc3JjL3BhcmtpbmdfbG90LnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9zdGQvc3JjL3RocmVhZC9jdXJyZW50LnJzAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL3BhcnNlci9pZGVudC5ycwBjcmF0ZXMvc3djX2VjbWFfcGFyc2VyL3NyYy9wYXJzZXIvc3RtdC5ycwBjcmF0ZXMvc3djX2VjbWFfY29kZWdlbi9zcmMvc3RtdC5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2FsbG9jL3NyYy9mbXQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYW55aG93LTEuMC4xMDAvc3JjL2ZtdC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi91dWlkLTEuMTYuMC9zcmMvZm10LnJzAGNyYXRlcy9zd2NfZWNtYV9jb2RlZ2VuL3NyYy9saXQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9zaGlmdC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWdpbnQvc2hpZnQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvcHJlZmlsdGVyL2J5dGVzZXQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvc3BhcnNlX3NldC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9hbHBoYWJldC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvYWxwaGFiZXQucnMAY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvcGFyc2VyL29iamVjdC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbWV0YS9zdG9wYXQucnMAY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvcGFyc2VyL3BhdC5ycwBjcmF0ZXMvc3djX2VjbWFfYXN0L3NyYy9wYXQucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9jb3JlL3NyYy9udW0vaW1wL2RpeV9mbG9hdC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL25mYS9ub25jb250aWd1b3VzLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2Foby1jb3Jhc2ljay0xLjEuMy9zcmMvbmZhL2NvbnRpZ3VvdXMucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWludGVnZXItMC4xLjQ2L3NyYy9yb290cy5ycwBjcmF0ZXMvc3djX2NvbW1vbi9zcmMvY29tbWVudHMucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvY29tcGFjdF9zdHItMC43LjEvc3JjL3RyYWl0cy5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvZGZhL29uZXBhc3MucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL21ldGEvd3JhcHBlcnMucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9jb3JlL3NyYy9mbXQvYnVpbGRlcnMucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtMS4xMC42L3NyYy9idWlsZGVycy5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zbWFydHN0cmluZy0xLjAuMS9zcmMvb3BzLnJzAGNyYXRlcy9zd2NfY29tbW9uL3NyYy9zeW50YXhfcG9zLnJzAGNyYXRlcy9zd2NfZWNtYV9jb2RlZ2VuL3NyYy9tb2R1bGVfZGVjbHMucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvcHJpbWl0aXZlcy5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvcHJpbWl0aXZlcy5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9ieXRlcy0xLjExLjEvc3JjL2J5dGVzLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL2NhcHR1cmVzLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3VuaWNvZGUtd2lkdGgtMC4yLjIvc3JjL3RhYmxlcy5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL2NoYXIvbWV0aG9kcy5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L3N0ZC9zcmMvc3lzL3N5bmMvbXV0ZXgvbm9fdGhyZWFkcy5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L3N0ZC9zcmMvc3lzL3RocmVhZF9sb2NhbC9ub190aHJlYWRzLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvc3RkL3NyYy9zeXMvc3luYy9yd2xvY2svbm9fdGhyZWFkcy5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L3N0ZC9zcmMvc3lzL3N5bmMvb25jZS9ub190aHJlYWRzLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2J5dGVzLXN0ci0wLjIuNS9zcmMvYnl0ZV9zdHIucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9hbGxvYy9zcmMvc3RyLnJzAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL3BhcnNlci9leHByLnJzAGNyYXRlcy9zd2NfZWNtYV91dGlscy9zcmMvY29uc3RydWN0b3IucnMAY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvZXJyb3IucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtc3ludGF4LTAuOC40L3NyYy9lcnJvci5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9hbnlob3ctMS4wLjEwMC9zcmMvZXJyb3IucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL21ldGEvZXJyb3IucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvcHJlZmlsdGVyL21lbWNoci5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL21lbWNoci5ycwBjcmF0ZXMvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlL3NyYy9maXhlci5ycwBiaW5kaW5ncy9iaW5kaW5nX3R5cGVzY3JpcHRfd2FzbS9zcmMvZXJyb3JfcmVwb3J0ZXIucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy91dGlsL3ByZWZpbHRlci5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9pdGVyLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvY29yZS9zcmMvc2xpY2UvaXRlci5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZV9qc29uLTEuMC4xNDAvc3JjL3Nlci5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvcmVtYXBwZXIucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL2RmYS9yZW1hcHBlci5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbWV0YS9yZXZlcnNlX2lubmVyLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9uZmEvdGhvbXBzb24vY29tcGlsZXIucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbWVtY2hyLTIuNy42L3NyYy9tZW1tZW0vc2VhcmNoZXIucnMAY3JhdGVzL3N3Y19zb3VyY2VtYXAvc3JjL2VuY29kZXIucnMAY3JhdGVzL3N3Y19jb21tb24vc3JjL2Vycm9ycy9kaWFnbm9zdGljX2J1aWxkZXIucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL25mYS90aG9tcHNvbi9idWlsZGVyLnJzAGNyYXRlcy9zd2Nfc291cmNlbWFwL3NyYy9idWlsZGVyLnJzAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL2xleGVyL251bWJlci5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL251bS9pbXAvZGVjMmZsdC9kZWNpbWFsX3NlcS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3BhY2tlZC9yYWJpbmthcnAucnMAY3JhdGVzL3N3Y19jb21tb24vc3JjL3NvdXJjZV9tYXAucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL25mYS90aG9tcHNvbi9tYXAucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvY29tcGFjdF9zdHItMC43LjEvc3JjL3JlcHIvaGVhcC5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL3N0ci9wYXR0ZXJuLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2Foby1jb3Jhc2ljay0xLjEuMy9zcmMvcGFja2VkL3BhdHRlcm4ucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLTAuMi4xMDAvc3JjL2NhY2hlL2ludGVybi5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL2F1dG9tYXRvbi5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L2FkZGl0aW9uLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvY29yZS9zcmMvb3BzL2Z1bmN0aW9uLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvc3VidHJhY3Rpb24ucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9tdWx0aXBsaWNhdGlvbi5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L2RpdmlzaW9uLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvY29yZS9zcmMvbnVtL2ltcC9mbHQyZGVjL3N0cmF0ZWd5L2RyYWdvbi5ycwBjcmF0ZXMvc3djX2VjbWFfcGFyc2VyL3NyYy9wYXJzZXIvY2xhc3NfYW5kX2ZuLnJzAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL2xleGVyL3Rva2VuLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9uZmEvdGhvbXBzb24vcGlrZXZtLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvY29yZS9zcmMvbnVtL2ltcC9iaWdudW0ucnMAY3JhdGVzL3N3Y19lY21hX3RyYW5zZm9ybXNfdHlwZXNjcmlwdC9zcmMvdHNfZW51bS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9wYXJraW5nX2xvdF9jb3JlLTAuOS4xMC9zcmMvdGhyZWFkX3Bhcmtlci93YXNtLnJzAGNyYXRlcy9zd2NfZWNtYV90cmFuc2Zvcm1zX3R5cGVzY3JpcHQvc3JjL3RyYW5zZm9ybS5ycwBjcmF0ZXMvaHN0ci9zcmMvd3RmOF9hdG9tLnJzAGNyYXRlcy9zd2NfZWNtYV9wYXJzZXIvc3JjL3BhcnNlci9tb2R1bGVfaXRlbS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9wcmVmaWx0ZXIvbWVtbWVtLnJzAGNyYXRlcy9zd2NfZWNtYV9jb2RlZ2VuL3NyYy90ZXh0X3dyaXRlci9iYXNpY19pbXBsLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3Bvb2wucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtc3ludGF4LTAuOC40L3NyYy9oaXIvaW50ZXJ2YWwucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtc3ludGF4LTAuOC40L3NyYy9oaXIvbGl0ZXJhbC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbWV0YS9saXRlcmFsLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvc3RkL3NyYy90aHJlYWQvbG9jYWwucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvbG9vay5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L3N0ZC9zcmMvc3luYy9sYXp5X2xvY2sucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9haG9jb3Jhc2ljay5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbmZhL3Rob21wc29uL2JhY2t0cmFjay5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9iaXR2ZWMtMS4wLjEvc3JjL3NsaWNlL2FwaS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3BhY2tlZC9hcGkucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9zdGQvc3JjL3BhdGgucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvc2VhcmNoLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2Foby1jb3Jhc2ljay0xLjEuMy9zcmMvdXRpbC9zZWFyY2gucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL2h5YnJpZC9zZWFyY2gucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy91dGlsL2RlYnVnLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvZGVidWcucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi1mdXR1cmVzLTAuNC41MC9zcmMvcXVldWUucnMAY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvbGV4ZXIvc3RhdGUucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvZGV0ZXJtaW5pemUvc3RhdGUucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtc3ludGF4LTAuOC40L3NyYy9oaXIvdHJhbnNsYXRlLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL25hdmlnYXRlLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvYXN0L3BhcnNlLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvY29yZS9zcmMvbnVtL2ltcC9kZWMyZmx0L3BhcnNlLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2luZGV4bWFwLTIuMTIuMC9zcmMvbWFwL2NvcmUucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvd2lyZS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9lc2NhcGUucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc21hcnRzdHJpbmctMS4wLjEvc3JjL2lubGluZS5ycwBjcmF0ZXMvc3djX2NvbW1vbi9zcmMvc3ludGF4X3Bvcy9oeWdpZW5lLnJzAGNyYXRlcy9zd2NfY29tbW9uL3NyYy9zeW50YXhfcG9zL2FuYWx5emVfc291cmNlX2ZpbGUucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9jb3JlL3NyYy91bmljb2RlL3ByaW50YWJsZS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbmZhL3Rob21wc29uL2xpdGVyYWxfdHJpZS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbmZhL3Rob21wc29uL3JhbmdlX3RyaWUucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9hbGxvYy9zcmMvY29sbGVjdGlvbnMvYnRyZWUvbm9kZS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1zeW50YXgtMC44LjQvc3JjL3VuaWNvZGUucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9zdGQvc3JjL3N5bmMvb25jZS5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2FsbG9jL3NyYy9zbGljZS5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9iaXR2ZWMtMS4wLjEvc3JjL3NsaWNlLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvc3RkL3NyYy9iYWNrdHJhY2UucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvb25jZV9jZWxsLTEuMjEuMy9zcmMvaW1wX3N0ZC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9oYXNoYnJvd24tMC4xNC41L3NyYy9yYXcvbW9kLnJzAC9ydXN0L2RlcHMvaGFzaGJyb3duLTAuMTYuMS9zcmMvcmF3L21vZC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9oYXNoYnJvd24tMC4xNi4wL3NyYy9yYXcvbW9kLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvYXN0L21vZC5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL2ZtdC9tb2QucnMAY3JhdGVzL3N3Y19jb21tb24vc3JjL2Vycm9ycy9tb2QucnMAY3JhdGVzL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS9zcmMvaGVscGVycy9tb2QucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9jb3JlL3NyYy9ic3RyL21vZC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9jb21wYWN0X3N0ci0wLjcuMS9zcmMvcmVwci9tb2QucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtc3ludGF4LTAuOC40L3NyYy9oaXIvbW9kLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL21lbWNoci0yLjcuNi9zcmMvYXJjaC9hbGwvcGFja2VkcGFpci9tb2QucnMAY3JhdGVzL3N3Y19lY21hX3BhcnNlci9zcmMvbGV4ZXIvbW9kLnJzAGNyYXRlcy9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2Uvc3JjL3Jlc29sdmVyL21vZC5ycwBjcmF0ZXMvc3djX2VjbWFfcGFyc2VyL3NyYy9wYXJzZXIvbW9kLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL21lbWNoci0yLjcuNi9zcmMvYXJjaC9hbGwvbW9kLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL2RldGVybWluaXplL21vZC5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L3N0ZC9zcmMvLi4vLi4vYmFja3RyYWNlL3NyYy9zeW1ib2xpemUvbW9kLnJzAGNyYXRlcy9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2Uvc3JjL3JlbmFtZS9tb2QucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc2VyZGVfY29yZS0xLjAuMjI4L3NyYy9kZS9tb2QucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9tb2QucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy9tb2QucnMAL3J1c3RjL2Y1ZWNhNGZjZmE5MDhkMWUwMzhhZmQxOWM2ZTc0NmYwNzU4NTkxMzAvbGlicmFyeS9hbGxvYy9zcmMvdmVjL21vZC5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2NvcmUvc3JjL251bS9pbXAvZmx0MmRlYy9tb2QucnMAY3JhdGVzL2hzdHIvc3JjL3d0ZjgvbW9kLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvc3RkL3NyYy90aHJlYWQvaWQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc21hcnRzdHJpbmctMS4wLjEvc3JjL2JveGVkLnJzAC9ydXN0Yy9mNWVjYTRmY2ZhOTA4ZDFlMDM4YWZkMTljNmU3NDZmMDc1ODU5MTMwL2xpYnJhcnkvYWxsb2Mvc3JjL3ZlYy9zcGVjX2Zyb21faXRlcl9uZXN0ZWQucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL21ldGEvbGltaXRlZC5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tZnV0dXJlcy0wLjQuNTAvc3JjL3Rhc2svc2luZ2xldGhyZWFkLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3RyaW9tcGhlLTAuMS4xNC9zcmMvYXJjLnJzAC9ydXN0L2RlcHMvZGxtYWxsb2MtMC4yLjExL3NyYy9kbG1hbGxvYy5ycwAvcnVzdGMvZjVlY2E0ZmNmYTkwOGQxZTAzOGFmZDE5YzZlNzQ2ZjA3NTg1OTEzMC9saWJyYXJ5L2FsbG9jL3NyYy9zeW5jLnJzAGNyYXRlcy9zd2NfZWNtYV90cmFuc2Zvcm1zX3R5cGVzY3JpcHQvc3JjL3NlbWFudGljLnJzAGNyYXRlcy9oc3RyL3NyYy9keW5hbWljLnJzAGNyYXRlcy9zd2NfZWNtYV91dGlscy9zcmMvbGliLnJzAGNyYXRlcy9oc3RyL3NyYy9saWIucnMAY3JhdGVzL3N3Y190c19mYXN0X3N0cmlwL3NyYy9saWIucnMAY3JhdGVzL3N3Y19lY21hX2NvZGVnZW4vc3JjL2xpYi5ycwBiaW5kaW5ncy9iaW5kaW5nX3R5cGVzY3JpcHRfd2FzbS9zcmMvbGliLnJzAC9ydXN0L2RlcHMvcnVzdGMtZGVtYW5nbGUtMC4xLjI3L3NyYy9saWIucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc2VyZGUtd2FzbS1iaW5kZ2VuLTAuNi41L3NyYy9saWIucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvb25jZV9jZWxsLTEuMjEuMy9zcmMvbGliLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3BoZl9zaGFyZWQtMC4xMS4zL3NyYy9saWIucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvY29tcGFjdF9zdHItMC43LjEvc3JjL2xpYi5ycwAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9ydXN0Yy1oYXNoLTIuMS4xL3NyYy9saWIucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc2NvcGVkLXRscy0xLjAuMS9zcmMvbGliLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi1mdXR1cmVzLTAuNC41MC9zcmMvbGliLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9uZmEvdGhvbXBzb24vbmZhLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9oeWJyaWQvZGZhLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2Foby1jb3Jhc2ljay0xLjEuMy9zcmMvZGZhLnJzAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3V0ZjgucnMAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtc3ludGF4LTAuOC40L3NyYy91dGY4LnJzAC9ydXN0L2RlcHMvcnVzdGMtZGVtYW5nbGUtMC4xLjI3L3NyYy92MC5ycwAddW5leHBlY3RlZCByZWdleCBmaW5kIGVycm9yOiDANQp0byBoYW5kbGUgZmluZCBlcnJvcnMsIHVzZSAndHJ5JyBvciAnc2VhcmNoJyBtZXRob2RzAAEnwFInIG1vZGlmaWVyIGNhbiBvbmx5IGFwcGVhciBvbiBhIHR5cGUgcGFyYW1ldGVyIG9mIGEgY2xhc3MsIGludGVyZmFjZSBvciB0eXBlIGFsaWFzAAEnwCwnIG1vZGlmaWVyIGNhbm5vdCBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlcgABJ8AzJyBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCB3aXRoIGEgcHJpdmF0ZSBpZGVudGlmaWVyAAEnwDUnIG1vZGlmaWVyIGNhbm5vdCBhcHBlYXIgb24gYSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbgATaGF5c3RhY2sgb2YgbGVuZ3RoIMAMIGlzIHRvbyBsb25nAAFgwCZgIGNhbm5vdCBiZSB1c2VkIHdpdGhvdXQgYGZyb21gIGNsYXVzZQABYMAwYCBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGluIHN0cmljdCBtb2RlADlpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBzdHI6OmZyb21fdXRmOCjABCkgPSDAIiB3YXMgZXhwZWN0ZWQgdG8gaGF2ZSAxIGNoYXIsIGJ1dCDAESBjaGFycyB3ZXJlIGZvdW5kAAZMYWJlbCDAFCBpcyBhbHJlYWR5IGRlY2xhcmVkACphbmNob3JlZCBzZWFyY2hlcyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuICjAHikgYXJlIG5vdCBzdXBwb3J0ZWQgb3IgZW5hYmxlZAAQZmxvYXRpbmcgcG9pbnQgYMABYAABYMAGYCBvciBgwAFgAAtjaGFyYWN0ZXIgYMABYAAJaW50ZWdlciBgwAFgAAlib29sZWFuIGDAAWAAEWR1cGxpY2F0ZSBmaWVsZCBgwAFgAAFgwAFgAFwAwAUgPT4gWwBSQSBzdHJpbmcgbGl0ZXJhbCBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpbXBvcnRlZCBiaW5kaW5nLgotIERpZCB5b3UgbWVhbiBgaW1wb3J0IHsgIsAMIiBhcyBmb28gfWA/AB9VbmV4cGVjdGVkIHRva2VuLiBEaWQgeW91IG1lYW4gwAE/AAE8wAggbWFjcm9zPgAsRXhwZWN0ZWQgY29ycmVzcG9uZGluZyBKU1ggY2xvc2luZyB0YWcgZm9yIDzAAT4AATzAAT4AASbAATsAwAk6IGJwb3MgPSDADTsgbGluZWJwb3MgPSDAATsADUJpdFNwYW5FcnJvcjzAAz46OgAEZ290IMAaIHNlZ21lbnRzLCBleHBlY3RlZCA0IG9yIDUAASfAICcgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgd2l0aCAnwAsnIG1vZGlmaWVyLgABJ8AZJyBtb2RpZmllciBtdXN0IHByZWNlZGUgJ8ALJyBtb2RpZmllci4AASfAGCcgbW9kaWZpZXIgYWxyZWFkeSBzZWVuLgAkRHVwbGljYXRlZCByZWd1bGFyIGV4cHJlc3Npb24gZmxhZyAnwAInLgARc3RhcnQgYnl0ZSBpbmRleCDAJiBpcyBub3QgYSBjaGFyIGJvdW5kYXJ5OyBpdCBpcyBpbnNpZGUgwAggKGJ5dGVzIMALIG9mIHN0cmluZykAD2VuZCBieXRlIGluZGV4IMAmIGlzIG5vdCBhIGNoYXIgYm91bmRhcnk7IGl0IGlzIGluc2lkZSDACCAoYnl0ZXMgwAsgb2Ygc3RyaW5nKQBAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogaW52YWxpZCBwYXR0ZXJuOiBFeHByKMABKQAGdW5pb24owAEpAAhKc1ZhbHVlKMABKQAHc3BhcnNlKMABKQAGTUFUQ0gowAEpADpleGNlZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5lc3RlZCBwYXJlbnRoZXNlcy9icmFja2V0cyAowAEpADFleGNlZWRlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2FwdHVyaW5nIGdyb3VwcyAowAEpACZjb3B5X2Zyb21fc2xpY2U6IHNvdXJjZSBzbGljZSBsZW5ndGggKMArKSBkb2VzIG5vdCBtYXRjaCBkZXN0aW5hdGlvbiBzbGljZSBsZW5ndGggKMABKQACICjAASkAFWBhdGAgc3BsaXQgaW5kZXggKGlzIMAXKSBzaG91bGQgYmUgPD0gbGVuIChpcyDAASkAFGluc2VydGlvbiBpbmRleCAoaXMg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NDA7MDAwNDg7MjsxNTM7MDUwOzIwNDQ4OzI7MTM5OzAwMDswMDA0ODsyOzIzMzsxNTA7MTIyNDg7MjsxNDM7MTg4OzE0MzQ4OzI7MDcyOzA2MTsxMzk0ODsyOzA0NzswNzk7MDc5NDg7MjswMDA7MjA2OzIwOTQ4OzI7MTQ4OzAwMDsyMTE0ODsyOzI1NTswMjA7MTQ3NDg7MjswMDA7MTkxOzI1NTQ4OzI7MTA1OzEwNTsxMDU0ODsyOzAzMDsxNDQ7MjU1NDg7MjsxNzg7MDM0OzAzNDQ4OzI7MjU1OzI1MDsyNDA0ODsyOzAzNDsxMzk7MDM0NDg7MjsyNTU7MDAwOzI1NTQ4OzI7MjIwOzIyMDsyMjA0ODsyOzI0ODsyNDg7MjU1NDg7MjsyNTU7MjE1OzAwMDQ4OzI7MjE4OzE2NTswMzI0ODsyOzEyODsxMjg7MTI4NDg7MjswMDA7MTI4OzAwMDQ4OzI7MTczOzI1NTswNDc0ODsyOzI0MDsyNTU7MjQwNDg7MjsyNTU7MTA1OzE4MDQ4OzI7MjA1OzA5MjswOTI0ODsyOzA3NTswMDA7MTMwNDg7MjsyNTU7MjU1OzI0MDQ4OzI7MjQwOzIzMDsxNDA0ODsyOzIzMDsyMzA7MjUwNDg7MjsyNTU7MjQwOzI0NTQ4OzI7MTI0OzI1MjswMDA0ODsyOzI1NTsyNTA7MjA1NDg7MjsxNzM7MjE2OzIzMDQ4OzI7MjQwOzEyODsxMjg0ODsyOzIyNDsyNTU7MjU1NDg7MjsyNTA7MjUwOzIxMDQ4OzI7MjExOzIxMTsyMTE0ODsyOzE0NDsyMzg7MTQ0NDg7MjsyNTU7MTgyOzE5MzQ4OzI7MjU1OzE2MDsxMjI0ODsyOzAzMjsxNzg7MTcwNDg7MjsxMzU7MjA2OzI1MDQ4OzI7MTE5OzEzNjsxNTM0ODsyOzE3NjsxOTY7MjIyNDg7MjsyNTU7MjU1OzIyNDQ4OzI7MDAwOzI1NTswMDA0ODsyOzA1MDsyMDU7MDUwNDg7MjsyNTA7MjQwOzIzMDQ4OzI7MTI4OzAwMDswMDA0ODsyOzEwMjsyMDU7MTcwNDg7MjswMDA7MDAwOzIwNTQ4OzI7MTg2OzA4NTsyMTE0ODsyOzE0NzsxMTI7MjE5NDg7MjswNjA7MTc5OzExMzQ4OzI7MTIzOzEwNDsyMzg0ODsyOzAwMDsyNTA7MTU0NDg7MjswNzI7MjA5OzIwNDQ4OzI7MTk5OzAyMTsxMzM0ODsyOzAyNTswMjU7MTEyNDg7MjsyNDU7MjU1OzI1MDQ4OzI7MjU1OzIyODsyMjU0ODsyOzI1NTsyMjg7MTgxNDg7MjsyNTU7MjIyOzE3MzQ4OzI7MDAwOzAwMDsxMjg0ODsyOzI1MzsyNDU7MjMwNDg7MjsxMjg7MTI4OzAwMDQ4OzI7MTA3OzE0MjswMzU0ODsyOzI1NTsxNjU7MDAwNDg7MjsyNTU7MDY5OzAwMDQ4OzI7MjE4OzExMjsyMTQ0ODsyOzIzODsyMzI7MTcwNDg7MjsxNTI7MjUxOzE1MjQ4OzI7MTc1OzIzODsyMzg0ODsyOzIxOTsxMTI7MTQ3NDg7MjsyNTU7MjM5OzIxMzQ4OzI7MjU1OzIxODsxODU0ODsyOzIwNTsxMzM7MDYzNDg7MjsyNTU7MTkyOzIwMzQ4OzI7MjIxOzE2MDsyMjE0ODsyOzE3NjsyMjQ7MjMwNDg7MjsxMjg7MDAwOzEyODQ4OzI7MTAyOzA1MTsxNTM0ODsyOzI1NTswMDA7MDAwNDg7MjsxODg7MTQzOzE0MzQ4OzI7MDY1OzEwNTsyMjU0ODsyOzEzOTswNjk7MDE5NDg7MjsyNTA7MTI4OzExNDQ4OzI7MjQ0OzE2NDswOTY0ODsyOzA0NjsxMzk7MDg3NDg7MjsyNTU7MjQ1OzIzODQ4OzI7MTYwOzA4MjswNDU0ODsyOzE5MjsxOTI7MTkyNDg7MjsxMzU7MjA2OzIzNTQ4OzI7MTA2OzA5MDsyMDU0ODsyOzExMjsxMjg7MTQ0NDg7MjsyNTU7MjUwOzI1MDQ4OzI7MDAwOzI1NTsxMjc0ODsyOzA3MDsxMzA7MTgwNDg7MjsyMTA7MTgwOzE0MDQ4OzI7MDAwOzEyODsxMjg0ODsyOzIxNjsxOTE7MjE2NDg7MjsyNTU7MDk5OzA3MTQ4OzI7MDY0OzIyNDsyMDg0ODsyOzIzODsxMzA7MjM4NDg7MjsyNDU7MjIyOzE3OTQ4OzI7MjU1OzI1NTsyNTU0ODsyOzI0NTsyNDU7MjQ1NDg7MjsyNTU7MjU1OzAwMDQ4OzI7MTU0OzIwNTswNTAzODsyOzI0MDsyNDg7MjU1Mzg7MjsyNTA7MjM1OzIxNTM4OzI7MDAwOzI1NTsyNTUzODsyOzEyNzsyNTU7MjEyMzg7MjsyNDA7MjU1OzI1NTM4OzI7MjQ1OzI0NTsyMjAzODsyOzI1NTsyMjg7MTk2Mzg7MjswMDA7MDAwOzAwMDM4OzI7MjU1OzIzNTsyMDUzODsyOzAwMDswMDA7MjU1Mzg7MjsxMzg7MDQzOzIyNjM4OzI7MTY1OzA0MjswNDIzODsyOzIyMjsxODQ7MTM1Mzg7MjswOTU7MTU4OzE2MDM4OzI7MTI3OzI1NTswMDAzODsyOzIxMDsxMDU7MDMwMzg7MjsyNTU7MTI3OzA4MDM4OzI7MTAwOzE0OTsyMzczODsyOzI1NTsyNDg7MjIwMzg7MjsyMjA7MDIwOzA2MDM4OzI7MDAwOzAwMDsxMzkzODsyOzAwMDsxMzk7MTM5Mzg7MjsxODQ7MTM0OzAxMTM4OzI7MTY5OzE2OTsxNjkzODsyOzAwMDsxMDA7MDAwMzg7MjsxODk7MTgzOzEwNzM4OzI7MTM5OzAwMDsxMzkzODsyOzA4NTsxMDc7MDQ3Mzg7MjsyNTU7MTQwOzAwMDM4OzI7MTUzOzA1MDsyMDQzODsyOzEzOTswMDA7MDAwMzg7MjsyMzM7MTUwOzEyMjM4OzI7MTQzOzE4ODsxNDMzODsyOzA3MjswNjE7MTM5Mzg7MjswNDc7MDc5OzA3OTM4OzI7MDAwOzIwNjsyMDkzODsyOzE0ODswMDA7MjExMzg7MjsyNTU7MDIwOzE0NzM4OzI7MDAwOzE5MTsyNTUzODsyOzEwNTsxMDU7MTA1Mzg7MjswMzA7MTQ0OzI1NTM4OzI7MTc4OzAzNDswMzQzODsyOzI1NTsyNTA7MjQwMzg7MjswMzQ7MTM5OzAzNDM4OzI7MjU1OzAwMDsyNTUzODsyOzIyMDsyMjA7MjIwMzg7MjsyNDg7MjQ4OzI1NTM4OzI7MjU1OzIxNTswMDAzODsyOzIxODsxNjU7MDMyMzg7MjsxMjg7MTI4OzEyODM4OzI7MDAwOzEyODswMDAzODsyOzE3MzsyNTU7MDQ3Mzg7MjsyNDA7MjU1OzI0MDM4OzI7MjU1OzEwNTsxODAzODsyOzIwNTswOTI7MDkyMzg7MjswNzU7MDAwOzEzMDM4OzI7MjU1OzI1NTsyNDAzODsyOzI0MDsyMzA7MTQwMzg7MjsyMzA7MjMwOzI1MDM4OzI7MjU1OzI0MDsyNDUzODsyOzEyNDsyNTI7MDAwMzg7MjsyNTU7MjUwOzIwNTM4OzI7MTczOzIxNjsyMzAzODsyOzI0MDsxMjg7MTI4Mzg7MjsyMjQ7MjU1OzI1NTM4OzI7MjUwOzI1MDsyMTAzODsyOzIxMTsyMTE7MjExMzg7MjsxNDQ7MjM4OzE0NDM4OzI7MjU1OzE4MjsxOTMzODsyOzI1NTsxNjA7MTIyMzg7MjswMzI7MTc4OzE3MDM4OzI7MTM1OzIwNjsyNTAzODsyOzExOTsxMzY7MTUzMzg7MjsxNzY7MTk2OzIyMjM4OzI7MjU1OzI1NTsyMjQzODsyOzAwMDsyNTU7MDAwMzg7MjswNTA7MjA1OzA1MDM4OzI7MjUwOzI0MDsyMzAzODsyOzEyODswMDA7MDAwMzg7MjsxMDI7MjA1OzE3MDM4OzI7MDAwOzAwMDsyMDUzODsyOzE4NjswODU7MjExMzg7MjsxNDc7MTEyOzIxOTM4OzI7MDYwOzE3OTsxMTMzODsyOzEyMzsxMDQ7MjM4Mzg7MjswMDA7MjUwOzE1NDM4OzI7MDcyOzIwOTsyMDQzODsyOzE5OTswMjE7MTMzMzg7MjswMjU7MDI1OzExMjM4OzI7MjQ1OzI1NTsyNTAzODsyOzI1NTsyMjg7MjI1Mzg7MjsyNTU7MjI4OzE4MTM4OzI7MjU1OzIyMjsxNzMzODsyOzAwMDswMDA7MTI4Mzg7MjsyNTM7MjQ1OzIzMDM4OzI7MTI4OzEyODswMDAzODsyOzEwNzsxNDI7MDM1Mzg7MjsyNTU7MTY1OzAwMDM4OzI7MjU1OzA2OTswMDAzODsyOzIxODsxMTI7MjE0Mzg7MjsyMzg7MjMyOzE3MDM4OzI7MTUyOzI1MTsxNTIzODsyOzE3NTsyMzg7MjM4Mzg7MjsyMTk7MTEyOzE0NzM4OzI7MjU1OzIzOTsyMTMzODsyOzI1NTsyMTg7MTg1Mzg7MjsyMDU7MTMzOzA2MzM4OzI7MjU1OzE5MjsyMDMzODsyOzIyMTsxNjA7MjIxMzg7MjsxNzY7MjI0OzIzMDM4OzI7MTI4OzAwMDsxMjgzODsyOzEwMjswNTE7MTUzMzg7MjsyNTU7MDAwOzAwMDM4OzI7MTg4OzE0MzsxNDMzODsyOzA2NTsxMDU7MjI1Mzg7MjsxMzk7MDY5OzAxOTM4OzI7MjUwOzEyODsxMTQzODsyOzI0NDsxNjQ7MDk2Mzg7MjswNDY7MTM5OzA4NzM4OzI7MjU1OzI0NTsyMzgzODsyOzE2MDswODI7MDQ1Mzg7MjsxOTI7MTkyOzE5MjM4OzI7MTM1OzIwNjsyMzUzODsyOzEwNjswOTA7MjA1Mzg7MjsxMTI7MTI4OzE0NDM4OzI7MjU1OzI1MDsyNTAzODsyOzAwMDsyNTU7MTI3Mzg7MjswNzA7MTMwOzE4MDM4OzI7MjEwOzE4MDsxNDAzODsyOzAwMDsxMjg7MTI4Mzg7MjsyMTY7MTkxOzIxNjM4OzI7MjU1OzA5OTswNzEzODsyOzA2NDsyMjQ7MjA4Mzg7MjsyMzg7MTMwOzIzODM4OzI7MjQ1OzIyMjsxNzkzODsyOzI1NTsyNTU7MjU1Mzg7MjsyNDU7MjQ1OzI0NTM4OzI7MjU1OzI1NTswMDAzODsyOzE1NDsyMDU7MDUwNDg7NTswNDg7NTsxNDg7NTsyNDg7NTszNDg7NTs0NDg7NTs1NDg7NTs2NDg7NTs3NDg7NTs4NDg7NTs5NDg7NTsxMDQ4OzU7MTE0ODs1OzEyNDg7NTsxMzQ4OzU7MTQ0ODs1OzE1NDg7NTsxNjQ4OzU7MTc0ODs1OzE4NDg7NTsxOTQ4OzU7MjA0ODs1OzIxNDg7NTsyMjQ4OzU7MjM0ODs1OzI0NDg7NTsyNTQ4OzU7MjY0ODs1OzI3NDg7NTsyODQ4OzU7Mjk0ODs1OzMwNDg7NTszMTQ4OzU7MzI0ODs1OzMzNDg7NTszNDQ4OzU7MzU0ODs1OzM2NDg7NTszNzQ4OzU7Mzg0ODs1OzM5NDg7NTs0MDQ4OzU7NDE0ODs1OzQyNDg7NTs0MzQ4OzU7NDQ0ODs1OzQ1NDg7NTs0NjQ4OzU7NDc0ODs1OzQ4NDg7NTs0OTQ4OzU7NTA0ODs1OzUxNDg7NTs1MjQ4OzU7NTM0ODs1OzU0NDg7NTs1NTQ4OzU7NTY0ODs1OzU3NDg7NTs1ODQ4OzU7NTk0ODs1OzYwNDg7NTs2MTQ4OzU7NjI0ODs1OzYzNDg7NTs2NDQ4OzU7NjU0ODs1OzY2NDg7NTs2NzQ4OzU7Njg0ODs1OzY5NDg7NTs3MDQ4OzU7NzE0ODs1OzcyNDg7NTs3MzQ4OzU7NzQ0ODs1Ozc1NDg7NTs3NjQ4OzU7Nzc0ODs1Ozc4NDg7NTs3OTQ4OzU7ODA0ODs1OzgxNDg7NTs4MjQ4OzU7ODM0ODs1Ozg0NDg7NTs4NTQ4OzU7ODY0ODs1Ozg3NDg7NTs4ODQ4OzU7ODk0ODs1OzkwNDg7NTs5MTQ4OzU7OTI0ODs1OzkzNDg7NTs5NDQ4OzU7OTU0ODs1Ozk2NDg7NTs5NzQ4OzU7OTg0ODs1Ozk5NDg7NTsxMDA0ODs1OzEwMTQ4OzU7MTAyNDg7NTsxMDM0ODs1OzEwNDQ4OzU7MTA1NDg7NTsxMDY0ODs1OzEwNzQ4OzU7MTA4NDg7NTsxMDk0ODs1OzExMDQ4OzU7MTExNDg7NTsxMTI0ODs1OzExMzQ4OzU7MTE0NDg7NTsxMTU0ODs1OzExNjQ4OzU7MTE3NDg7NTsxMTg0ODs1OzExOTQ4OzU7MTIwNDg7NTsxMjE0ODs1OzEyMjQ4OzU7MTIzNDg7NTsxMjQ0ODs1OzEyNTQ4OzU7MTI2NDg7NTsxMjc0ODs1OzEyODQ4OzU7MTI5NDg7NTsxMzA0ODs1OzEzMTQ4OzU7MTMyNDg7NTsxMzM0ODs1OzEzNDQ4OzU7MTM1NDg7NTsxMzY0ODs1OzEzNzQ4OzU7MTM4NDg7NTsxMzk0ODs1OzE0MDQ4OzU7MTQxNDg7NTsxNDI0ODs1OzE0MzQ4OzU7MTQ0NDg7NTsxNDU0ODs1OzE0NjQ4OzU7MTQ3NDg7NTsxNDg0ODs1OzE0OTQ4OzU7MTUwNDg7NTsxNTE0ODs1OzE1MjQ4OzU7MTUzNDg7NTsxNTQ0ODs1OzE1NTQ4OzU7MTU2NDg7NTsxNTc0ODs1OzE1ODQ4OzU7MTU5NDg7NTsxNjA0ODs1OzE2MTQ4OzU7MTYyNDg7NTsxNjM0ODs1OzE2NDQ4OzU7MTY1NDg7NTsxNjY0ODs1OzE2NzQ4OzU7MTY4NDg7NTsxNjk0ODs1OzE3MDQ4OzU7MTcxNDg7NTsxNzI0ODs1OzE3MzQ4OzU7MTc0NDg7NTsxNzU0ODs1OzE3NjQ4OzU7MTc3NDg7NTsxNzg0ODs1OzE3OTQ4OzU7MTgwNDg7NTsxODE0ODs1OzE4MjQ4OzU7MTgzNDg7NTsxODQ0ODs1OzE4NTQ4OzU7MTg2NDg7NTsxODc0ODs1OzE4ODQ4OzU7MTg5NDg7NTsxOTA0ODs1OzE5MTQ4OzU7MTkyNDg7NTsxOTM0ODs1OzE5NDQ4OzU7MTk1NDg7NTsxOTY0ODs1OzE5NzQ4OzU7MTk4NDg7NTsxOTk0ODs1OzIwMDQ4OzU7MjAxNDg7NTsyMDI0ODs1OzIwMzQ4OzU7MjA0NDg7NTsyMDU0ODs1OzIwNjQ4OzU7MjA3NDg7NTsyMDg0ODs1OzIwOTQ4OzU7MjEwNDg7NTsyMTE0ODs1OzIxMjQ4OzU7MjEzNDg7NTsyMTQ0ODs1OzIxNTQ4OzU7MjE2NDg7NTsyMTc0ODs1OzIxODQ4OzU7MjE5NDg7NTsyMjA0ODs1OzIyMTQ4OzU7MjIyNDg7NTsyMjM0ODs1OzIyNDQ4OzU7MjI1NDg7NTsyMjY0ODs1OzIyNzQ4OzU7MjI4NDg7NTsyMjk0ODs1OzIzMDQ4OzU7MjMxNDg7NTsyMzI0ODs1OzIzMzQ4OzU7MjM0NDg7NTsyMzU0ODs1OzIzNjQ4OzU7MjM3NDg7NTsyMzg0ODs1OzIzOTQ4OzU7MjQwNDg7NTsyNDE0ODs1OzI0MjQ4OzU7MjQzNDg7NTsyNDQ0ODs1OzI0NTQ4OzU7MjQ2NDg7NTsyNDc0ODs1OzI0ODQ4OzU7MjQ5NDg7NTsyNTA0ODs1OzI1MTQ4OzU7MjUyNDg7NTsyNTM0ODs1OzI1NDQ4OzU7MjU1Mzg7NTswMzg7NTsxMzg7NTsyMzg7NTszMzg7NTs0Mzg7NTs1Mzg7NTs2Mzg7NTs3Mzg7NTs4Mzg7NTs5Mzg7NTsxMDM4OzU7MTEzODs1OzEyMzg7NTsxMzM4OzU7MTQzODs1OzE1Mzg7NTsxNjM4OzU7MTczODs1OzE4Mzg7NTsxOTM4OzU7MjAzODs1OzIxMzg7NTsyMjM4OzU7MjMzODs1OzI0Mzg7NTsyNTM4OzU7MjYzODs1OzI3Mzg7NTsyODM4OzU7MjkzODs1OzMwMzg7NTszMTM4OzU7MzIzODs1OzMzMzg7NTszNDM4OzU7MzUzODs1OzM2Mzg7NTszNzM4OzU7MzgzODs1OzM5Mzg7NTs0MDM4OzU7NDEzODs1OzQyMzg7NTs0MzM4OzU7NDQzODs1OzQ1Mzg7NTs0NjM4OzU7NDczODs1OzQ4Mzg7NTs0OTM4OzU7NTAzODs1OzUxMzg7NTs1MjM4OzU7NTMzODs1OzU0Mzg7NTs1NTM4OzU7NTYzODs1OzU3Mzg7NTs1ODM4OzU7NTkzODs1OzYwMzg7NTs2MTM4OzU7NjIzODs1OzYzMzg7NTs2NDM4OzU7NjUzODs1OzY2Mzg7NTs2NzM4OzU7NjgzODs1OzY5Mzg7NTs3MDM4OzU7NzEzODs1OzcyMzg7NTs3MzM4OzU7NzQzODs1Ozc1Mzg7NTs3NjM4OzU7NzczODs1Ozc4Mzg7NTs3OTM4OzU7ODAzODs1OzgxMzg7NTs4MjM4OzU7ODMzODs1Ozg0Mzg7NTs4NTM4OzU7ODYzODs1Ozg3Mzg7NTs4ODM4OzU7ODkzODs1OzkwMzg7NTs5MTM4OzU7OTIzODs1OzkzMzg7NTs5NDM4OzU7OTUzODs1Ozk2Mzg7NTs5NzM4OzU7OTgzODs1Ozk5Mzg7NTsxMDAzODs1OzEwMTM4OzU7MTAyMzg7NTsxMDMzODs1OzEwNDM4OzU7MTA1Mzg7NTsxMDYzODs1OzEwNzM4OzU7MTA4Mzg7NTsxMDkzODs1OzExMDM4OzU7MTExMzg7NTsxMTIzODs1OzExMzM4OzU7MTE0Mzg7NTsxMTUzODs1OzExNjM4OzU7MTE3Mzg7NTsxMTgzODs1OzExOTM4OzU7MTIwMzg7NTsxMjEzODs1OzEyMjM4OzU7MTIzMzg7NTsxMjQzODs1OzEyNTM4OzU7MTI2Mzg7NTsxMjczODs1OzEyODM4OzU7MTI5Mzg7NTsxMzAzODs1OzEzMTM4OzU7MTMyMzg7NTsxMzMzODs1OzEzNDM4OzU7MTM1Mzg7NTsxMzYzODs1OzEzNzM4OzU7MTM4Mzg7NTsxMzkzODs1OzE0MDM4OzU7MTQxMzg7NTsxNDIzODs1OzE0MzM4OzU7MTQ0Mzg7NTsxNDUzODs1OzE0NjM4OzU7MTQ3Mzg7NTsxNDgzODs1OzE0OTM4OzU7MTUwMzg7NTsxNTEzODs1OzE1MjM4OzU7MTUzMzg7NTsxNTQzODs1OzE1NTM4OzU7MTU2Mzg7NTsxNTczODs1OzE1ODM4OzU7MTU5Mzg7NTsxNjAzODs1OzE2MTM4OzU7MTYyMzg7NTsxNjMzODs1OzE2NDM4OzU7MTY1Mzg7NTsxNjYzODs1OzE2NzM4OzU7MTY4Mzg7NTsxNjkzODs1OzE3MDM4OzU7MTcxMzg7NTsx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UGF0dGVybklERXJyb3JTdGF0ZUlEc2hvdWxkIGZpbmQgYSBtYXRjaAAACQwgAG4AAABYAwAAEgAAAEJ5dGVDbGFzc2VzKEJ5dGVDbGFzc2VzKHtzaW5nbGV0b25zfSlQcmVmaWx0ZXJwcmVpc19mYXN0bWF4X25lZWRsZV9sZW4AAMk9IAB6AAAAxwEAACoAAABkZW5zZShGQUlMAADZIiAAdgAAAKIAAAA+AAAA0jsgAGoAAAB4AwAADAAAAIcWIABuAAAANgIAADQAAABUb29NYW55UGF0dGVybnNvbmVwYXNzOjpERkEoCiAgKiBEIMMgAABpBgAATGF6eVN0YXRlSURUcnlGcm9tSW50RXJyb3JNZW1jaHJpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBzdWZmaXggbWF0Y2ggcGx1cyByZXZlcnNlIG1hdGNoIGltcGxpZXMgdGhlcmUgbXVzdCBiZSBhIG1hdGNoAAAJDCAAbgAAAIAFAAAZAAAACQwgAG4AAABFBQAAGQAAAGZvcndhcmRyZXZlcnNlTWVtY2hyMk5vbldvcmRCeXRlV29yZEJ5dGVUZXh0TGluZUxGTGluZUNSQ3VzdG9tTGluZVRlcm1pbmF0b3LEBAAAEAAAAAQAAAC1AAAAQ29uZmlndmlzaXRlZF9jYXBhY2l0eQAAAAAAAAQAAAAEAAAAUQAAAE1lbWNocjNSZXZlcnNlSHlicmlkRW5naW5lU21hbGxJbmRleEVycm9yYXR0ZW1wdGVkUmV2ZXJzZURGQVJldmVyc2VERkFFbmdpbmViaXRzU3RhbmRhcmRMZWZ0bW9zdExvbmdlc3RQYXR0ZXJuU2V0SW5zZXJ0RXJyb3JjYXBhY2l0eU5vWWVzUGF0dGVybkVPSWFoby1jb3Jhc2ljayBERkEgc2hvdWxkIG5ldmVyIGZhaWwAAAB4DCAAdQAAAHEAAAASAAAA2SIgAHYAAAAnAAAALQAAAAkxIAB2AAAAKwAAACcAAAAJMSAAdgAAADsAAAAYAAAAnhUgAHcAAAAjAAAAEQAAAFByZWdyb3VwX2luZm8AAADFBAAAYAAAABAAAADGBAAAxwQAAAQAAAAEAAAAiQAAAAAAAAAAAQAAAQAAAMgEAAAAAAAAAAEAAAEAAACfAAAAAAAAACAAAAAQAAAAyQQAAGNvbmZpZ25mYXN0cmlkZTJzdGFydF9tYXBjbGFzc2VzcXVpdHNldGNhY2hlX2NhcGFjaXR5AAAAKFIhAAYAAAAuUiEAAwAAADFSIQAHAAAAOFIhAAkAAABBUiEABwAAAEhSIQAHAAAAT1IhAA4AAABERkEAAAAAAAEAAAABAAAAuQAAAG1hdGNoX2tpbmROL0EAAADKBAAABAAAAAQAAADLBAAAzAQAABAAAAAEAAAAzQQAAM4EAAAEAAAABAAAAM8EAADQBAAAGAAAAAQAAADRBAAA0gQAABwAAAAEAAAA0wQAANQEAAA8AQAABAAAANUEAADWBAAAIAUAABAAAADXBAAAAAAAAAQAAAAEAAAA2AQAAGluZm9uZmFyZXZwaWtldm1iYWNrdHJhY2tvbmVwYXNzaHlicmlkZGZhAAAAPFMhAAQAAAACTyEAAwAAAC5SIQADAAAAQFMhAAYAAABGUyEABgAAAExTIQAJAAAAVVMhAAcAAABcUyEABgAAAGJTIQADAAAAQ29yZW0iIABrAAAA7QAAABEAAABSZXZlcnNlQW5jaG9yZWRjb3JlSW1wbGljaXRSZXZlcnNlU3VmZml4Qm91bmRlZEJhY2t0cmFja2VyUmV2ZXJzZUlubmVycHJlaW5uZXJMYXp5U3RhdGVJREVycm9yQ2FjaGVFcnJvckludmFsaWRJbnB1dEFuY2hvcmVkSW52YWxpZElucHV0VW5hbmNob3JlZFVuc3VwcG9ydGVkU3RyZWFtVW5zdXBwb3J0ZWRPdmVybGFwcGluZ1Vuc3VwcG9ydGVkRW1wdHlTUGlrZVZNUGlrZVZNRW5naW5lR3JvdXBJbmZvAAAAAAAAAAEAAAABAAAA2QQAAAAAAAAwAAAAEAAAANoEAAAAAAAACAAAAAQAAADbBAAAAAAAAAQAAAAEAAAA3AQAAHN0YXJ0c19mb3JfZWFjaF9wYXR0ZXJuYnl0ZV9jbGFzc2VzdW5pY29kZV93b3JkX2JvdW5kYXJ5c3BlY2lhbGl6ZV9zdGFydF9zdGF0ZXNza2lwX2NhY2hlX2NhcGFjaXR5X2NoZWNrbWluaW11bV9jYWNoZV9jbGVhcl9jb3VudG1pbmltdW1fYnl0ZXNfcGVyX3N0YXRlrFIhAAoAAAACTyEAAwAAAOxUIQAXAAAAA1UhAAwAAAAPVSEAFQAAAEhSIQAHAAAAJFUhABcAAABPUiEADgAAADtVIQAZAAAAVFUhABkAAABtVSEAFwAAAFNlYXJjaGVycmFiaW5rYXJwc2VhcmNoX2tpbmRHcm91cEluZm9Jbm5lcnNsb3RfcmFuZ2VzbmFtZV90b19pbmRleGluZGV4X3RvX25hbWVtZW1vcnlfZXh0cmFCb3VuZGVkQmFja3RyYWNrZXJFbmdpbmV1bmFuY2hvcmVkIHNlYXJjaGVzIGFyZSBub3Qgc3VwcG9ydGVkIG9yIGVuYWJsZWRhbmNob3JlZCBzZWFyY2hlcyBhcmUgbm90IHN1cHBvcnRlZCBvciBlbmFibGVkUmVnZXhJbmZvR3JvdXBJbmZvRXJyb3JSZWdleEluZm9JcHJvcHNfdW5pb25PbmVQYXNzT25lUGFzc0VuZ2luZWVyclRvb01hbnlHcm91cHNwYXR0ZXJubWluaW11bU1pc3NpbmdHcm91cHNGaXJzdE11c3RCZVVubmFtZWREdXBsaWNhdGVTbWFsbEluZGV4SHlicmlkSHlicmlkRW5naW5lAAAAAAABAAAAAQAAAN0EAAB1dGY4X2VtcHR5YXV0b3ByZXdoaWNoX2NhcHR1cmVzbmZhX3NpemVfbGltaXRvbmVwYXNzX3NpemVfbGltaXRoeWJyaWRfY2FjaGVfY2FwYWNpdHlkZmFfc2l6ZV9saW1pdGRmYV9zdGF0ZV9saW1pdGxpbmVfdGVybWluYXRvcqxSIQAKAAAAYFchAAoAAABqVyEABwAAAAJPIQADAAAAcVchAA4AAAB/VyEADgAAAI1XIQASAAAAn1chABUAAABcUyEABgAAAGJTIQADAAAAtFchAA4AAADCVyEADwAAAFVTIQAHAAAATFMhAAkAAAADVSEADAAAANFXIQAPAAAAREZBRW5naW5lUmV2ZXJzZUh5YnJpZAAAAAAAAAQAAAAEAAAA3gQAAKo6IABoAAAA5wEAACAAAADcQyAAZgAAAL8EAAAuAAAA3EMgAGYAAADABAAAKgAAABk/IABmAAAARQIAABIAAABhZ2VBZ2VhaGV4QVNDSUlfSGV4X0RpZ2l0QWxwaGFiZXRpY2FscGhhYmV0aWNhc2NpaWhleGRpZ2l0YmNCaWRpX0NsYXNzYmlkaWNCaWRpX0NvbnRyb2xiaWRpY2xhc3NiaWRpY29udHJvbGJpZGltQmlkaV9NaXJyb3JlZGJpZGltaXJyb3JlZGJpZGltaXJyb3JpbmdnbHlwaEJpZGlfTWlycm9yaW5nX0dseXBoYmlkaXBhaXJlZGJyYWNrZXRCaWRpX1BhaXJlZF9CcmFja2V0YmlkaXBhaXJlZGJyYWNrZXR0eXBlQmlkaV9QYWlyZWRfQnJhY2tldF9UeXBlYmxrYm1nYnBiYnB0Y2Fub25pY2FsY29tYmluaW5nY2xhc3NDYW5vbmljYWxfQ29tYmluaW5nX0NsYXNzY2FzZWRDYXNlZGNhc2Vmb2xkaW5nQ2FzZV9Gb2xkaW5nY2FzZWlnbm9yYWJsZUNhc2VfSWdub3JhYmxlY2NjY2VDb21wb3NpdGlvbl9FeGNsdXNpb25jZmNoYW5nZXN3aGVuY2FzZWZvbGRlZENoYW5nZXNfV2hlbl9DYXNlZm9sZGVkY2hhbmdlc3doZW5jYXNlbWFwcGVkQ2hhbmdlc19XaGVuX0Nhc2VtYXBwZWRjaGFuZ2Vzd2hlbmxvd2VyY2FzZWRDaGFuZ2VzX1doZW5fTG93ZXJjYXNlZGNoYW5nZXN3aGVubmZrY2Nhc2Vmb2xkZWRDaGFuZ2VzX1doZW5fTkZLQ19DYXNlZm9sZGVkY2hhbmdlc3doZW50aXRsZWNhc2VkQ2hhbmdlc19XaGVuX1RpdGxlY2FzZWRjaGFuZ2Vzd2hlbnVwcGVyY2FzZWRDaGFuZ2VzX1doZW5fVXBwZXJjYXNlZGNpY2prYWNjb3VudGluZ251bWVyaWNrQWNjb3VudGluZ051bWVyaWNjamtjb21wYXRpYmlsaXR5dmFyaWFudGtDb21wYXRpYmlsaXR5VmFyaWFudGNqa2lpY29yZWtJSUNvcmVjamtpcmdnc291cmNla0lSR19HU291cmNlY2praXJnaHNvdXJjZWtJUkdfSFNvdXJjZWNqa2lyZ2pzb3VyY2VrSVJHX0pTb3VyY2VjamtpcmdrcHNvdXJjZWtJUkdfS1BTb3VyY2Vjamtpcmdrc291cmNla0lSR19LU291cmNlY2praXJnbXNvdXJjZWtJUkdfTVNvdXJjZWNqa2lyZ3Nzb3VyY2VrSVJHX1NTb3VyY2Vjamtpcmd0c291cmNla0lSR19UU291cmNlY2praXJndWtzb3VyY2VrSVJHX1VLU291cmNlY2praXJndXNvdXJjZWtJUkdfVVNvdXJjZWNqa2lyZ3Zzb3VyY2VrSVJHX1ZTb3VyY2VjamtvdGhlcm51bWVyaWNrT3RoZXJOdW1lcmljY2prcHJpbWFyeW51bWVyaWNrUHJpbWFyeU51bWVyaWNjamtyc3VuaWNvZGVrUlNVbmljb2RlY29tcGV4RnVsbF9Db21wb3NpdGlvbl9FeGNsdXNpb25jb21wb3NpdGlvbmV4Y2x1c2lvbmN3Y2Zjd2NtY3drY2Zjd2xjd3Rjd3VkYXNoRGFzaGRlY29tcG9zaXRpb25tYXBwaW5nRGVjb21wb3NpdGlvbl9NYXBwaW5nZGVjb21wb3NpdGlvbnR5cGVEZWNvbXBvc2l0aW9uX1R5cGVkZWZhdWx0aWdub3JhYmxlY29kZXBvaW50RGVmYXVsdF9JZ25vcmFibGVfQ29kZV9Qb2ludGRlcERlcHJlY2F0ZWRkZXByZWNhdGVkZGlkaWFEaWFjcml0aWNkaWFjcml0aWNkbWR0ZWFFYXN0X0FzaWFuX1dpZHRoZWFzdGFzaWFud2lkdGhlYmFzZUVtb2ppX01vZGlmaWVyX0Jhc2VlY29tcEVtb2ppX0NvbXBvbmVudGVtb2RFbW9qaV9Nb2RpZmllcmVtb2ppRW1vamllbW9qaWNvbXBvbmVudGVtb2ppbW9kaWZpZXJlbW9qaW1vZGlmaWVyYmFzZWVtb2ppcHJlc2VudGF0aW9uRW1vamlfUHJlc2VudGF0aW9uZXByZXNlcXVpZGVvRXF1aXZhbGVudF9VbmlmaWVkX0lkZW9ncmFwaGVxdWl2YWxlbnR1bmlmaWVkaWRlb2dyYXBoZXhwYW5kc29ubmZjRXhwYW5kc19Pbl9ORkNleHBhbmRzb25uZmRFeHBhbmRzX09uX05GRGV4cGFuZHNvbm5ma2NFeHBhbmRzX09uX05GS0NleHBhbmRzb25uZmtkRXhwYW5kc19Pbl9ORktEZXh0RXh0ZW5kZXJleHRlbmRlZHBpY3RvZ3JhcGhpY0V4dGVuZGVkX1BpY3RvZ3JhcGhpY2V4dGVuZGVyZXh0cGljdGZjbmZrY0ZDX05GS0NfQ2xvc3VyZWZjbmZrY2Nsb3N1cmVmdWxsY29tcG9zaXRpb25leGNsdXNpb25nY0dlbmVyYWxfQ2F0ZWdvcnlnY2JHcmFwaGVtZV9DbHVzdGVyX0JyZWFrZ2VuZXJhbGNhdGVnb3J5Z3JhcGhlbWViYXNlR3JhcGhlbWVfQmFzZWdyYXBoZW1lY2x1c3RlcmJyZWFrZ3JhcGhlbWVleHRlbmRHcmFwaGVtZV9FeHRlbmRncmFwaGVtZWxpbmtHcmFwaGVtZV9MaW5rZ3JiYXNlZ3JleHRncmxpbmtoYW5ndWxzeWxsYWJsZXR5cGVIYW5ndWxfU3lsbGFibGVfVHlwZWhleEhleF9EaWdpdGhleGRpZ2l0aHN0aHlwaGVuSHlwaGVuaWRjSURfQ29udGludWVpZGNvbnRpbnVlaWRlb0lkZW9ncmFwaGljaWRlb2dyYXBoaWNpZHNJRF9TdGFydGlkc2JJRFNfQmluYXJ5X09wZXJhdG9yaWRzYmluYXJ5b3BlcmF0b3JpZHN0SURTX1RyaW5hcnlfT3BlcmF0b3JpZHN0YXJ0aWRzdHJpbmFyeW9wZXJhdG9yaW5kaWNwb3NpdGlvbmFsY2F0ZWdvcnlJbmRpY19Qb3NpdGlvbmFsX0NhdGVnb3J5aW5kaWNzeWxsYWJpY2NhdGVnb3J5SW5kaWNfU3lsbGFiaWNfQ2F0ZWdvcnlpbnBjaW5zY2lzY0lTT19Db21tZW50amFtb3Nob3J0bmFtZUphbW9fU2hvcnRfTmFtZWpnSm9pbmluZ19Hcm91cGpvaW5jSm9pbl9Db250cm9sam9pbmNvbnRyb2xqb2luaW5nZ3JvdXBqb2luaW5ndHlwZUpvaW5pbmdfVHlwZWpzbmp0a2FjY291bnRpbmdudW1lcmlja2NvbXBhdGliaWxpdHl2YXJpYW50a2lpY29yZWtpcmdnc291cmNla2lyZ2hzb3VyY2VraXJnanNvdXJjZWtpcmdrcHNvdXJjZWtpcmdrc291cmNla2lyZ21zb3VyY2VraXJnc3NvdXJjZWtpcmd0c291cmNla2lyZ3Vrc291cmNla2lyZ3Vzb3VyY2VraXJndnNvdXJjZWtvdGhlcm51bWVyaWNrcHJpbWFyeW51bWVyaWNrcnN1bmljb2RlbGJMaW5lX0JyZWFrbGNMb3dlcmNhc2VfTWFwcGluZ2xpbmVicmVha2xvZUxvZ2ljYWxfT3JkZXJfRXhjZXB0aW9ubG9naWNhbG9yZGVyZXhjZXB0aW9ubG93ZXJMb3dlcmNhc2Vsb3dlcmNhc2Vsb3dlcmNhc2VtYXBwaW5nbWF0aE1hdGhuYU5hbWVuYTFVbmljb2RlXzFfTmFtZW5hbWVhbGlhc05hbWVfQWxpYXNuY2hhck5vbmNoYXJhY3Rlcl9Db2RlX1BvaW50bmZjcWNORkNfUXVpY2tfQ2hlY2tuZmNxdWlja2NoZWNrbmZkcWNORkRfUXVpY2tfQ2hlY2tuZmRxdWlja2NoZWNrbmZrY2Nhc2Vmb2xkTkZLQ19DYXNlZm9sZG5ma2NjZm5ma2NxY05GS0NfUXVpY2tfQ2hlY2tuZmtjcXVpY2tjaGVja25ma2RxY05GS0RfUXVpY2tfQ2hlY2tuZmtkcXVpY2tjaGVja25vbmNoYXJhY3RlcmNvZGVwb2ludG50TnVtZXJpY19UeXBlbnVtZXJpY3R5cGVudW1lcmljdmFsdWVOdW1lcmljX1ZhbHVlbnZvYWxwaGFPdGhlcl9BbHBoYWJldGljb2NvbW1lbnRvZGlPdGhlcl9EZWZhdWx0X0lnbm9yYWJsZV9Db2RlX1BvaW50b2dyZXh0T3RoZXJfR3JhcGhlbWVfRXh0ZW5kb2lkY090aGVyX0lEX0NvbnRpbnVlb2lkc090aGVyX0lEX1N0YXJ0b2xvd2VyT3RoZXJfTG93ZXJjYXNlb21hdGhPdGhlcl9NYXRob3RoZXJhbHBoYWJldGljb3RoZXJkZWZhdWx0aWdub3JhYmxlY29kZXBvaW50b3RoZXJncmFwaGVtZWV4dGVuZG90aGVyaWRjb250aW51ZW90aGVyaWRzdGFydG90aGVybG93ZXJjYXNlb3RoZXJtYXRob3RoZXJ1cHBlcmNhc2VPdGhlcl9VcHBlcmNhc2VvdXBwZXJwYXRzeW5QYXR0ZXJuX1N5bnRheHBhdHRlcm5zeW50YXhwYXR0ZXJud2hpdGVzcGFjZVBhdHRlcm5fV2hpdGVfU3BhY2VwYXR3c3BjbVByZXBlbmRlZF9Db25jYXRlbmF0aW9uX01hcmtwcmVwZW5kZWRjb25jYXRlbmF0aW9ubWFya3FtYXJrUXVvdGF0aW9uX01hcmtxdW90YXRpb25tYXJrcmFkaWNhbFJhZGljYWxyZWdpb25hbGluZGljYXRvclJlZ2lvbmFsX0luZGljYXRvcnJpc2JTZW50ZW5jZV9CcmVha3NjU2NyaXB0c2NmU2ltcGxlX0Nhc2VfRm9sZGluZ3NjcmlwdGV4dGVuc2lvbnNTY3JpcHRfRXh0ZW5zaW9uc3NjeHNkU29mdF9Eb3R0ZWRzZW50ZW5jZWJyZWFrc2VudGVuY2V0ZXJtaW5hbFNlbnRlbmNlX1Rlcm1pbmFsc2Zjc2ltcGxlY2FzZWZvbGRpbmdzaW1wbGVsb3dlcmNhc2VtYXBwaW5nU2ltcGxlX0xvd2VyY2FzZV9NYXBwaW5nc2ltcGxldGl0bGVjYXNlbWFwcGluZ1NpbXBsZV9UaXRsZWNhc2VfTWFwcGluZ3NpbXBsZXVwcGVyY2FzZW1hcHBpbmdTaW1wbGVfVXBwZXJjYXNlX01hcHBpbmdzbGNzb2Z0ZG90dGVkc3BhY2VXaGl0ZV9TcGFjZXN0Y3N0ZXJtc3VjdGNUaXRsZWNhc2VfTWFwcGluZ3Rlcm1UZXJtaW5hbF9QdW5jdHVhdGlvbnRlcm1pbmFscHVuY3R1YXRpb250aXRsZWNhc2VtYXBwaW5ndWNVcHBlcmNhc2VfTWFwcGluZ3VpZGVvVW5pZmllZF9JZGVvZ3JhcGh1bmljb2RlMW5hbWV1bmljb2RlcmFkaWNhbHN0cm9rZXVuaWZpZWRpZGVvZ3JhcGh1cHBlclVwcGVyY2FzZXVwcGVyY2FzZXVwcGVyY2FzZW1hcHBpbmd1cnN2YXJpYXRpb25zZWxlY3RvclZhcmlhdGlvbl9TZWxlY3RvcnZlcnRpY2Fsb3JpZW50YXRpb25WZXJ0aWNhbF9PcmllbnRhdGlvbnZvdnN3YldvcmRfQnJlYWt3aGl0ZXNwYWNld29yZGJyZWFrd3NwYWNleGlkY1hJRF9Db250aW51ZXhpZGNvbnRpbnVleGlkc1hJRF9TdGFydHhpZHN0YXJ0eG9uZmN4b25mZHhvbmZrY3hvbmZrZAAAAMhYIQADAAAAy1ghAAMAAADOWCEABAAAANJYIQAPAAAAElsmAAUAAADhWCEACgAAAOtYIQAKAAAA4VghAAoAAAD1WCEADQAAANJYIQAPAAAAAlkhAAIAAAAEWSEACgAAAA5ZIQAFAAAAE1khAAwAAAAfWSEACQAAAARZIQAKAAAAKFkhAAsAAAATWSEADAAAADNZIQAFAAAAOFkhAA0AAABFWSEADAAAADhZIQANAAAAUVkhABIAAABjWSEAFAAAAHdZIQARAAAAiFkhABMAAACbWSEAFQAAALBZIQAYAAAAyFkhAAMAAAC+oSYABQAAAN+bJgAFAAAAvqEmAAUAAADLWSEAAwAAAGNZIQAUAAAAzlkhAAMAAACIWSEAEwAAANFZIQADAAAAsFkhABgAAADUWSEAFwAAAOtZIQAZAAAABFohAAUAAAAJWiEABQAAAA5aIQALAAAAGVohAAwAAAAlWiEADQAAADJaIQAOAAAAQFohAAMAAADrWSEAGQAAAENaIQACAAAARVohABUAAABaWiEAAgAAABlaIQAMAAAAXFohABUAAABxWiEAFwAAAIhaIQAVAAAAnVohABcAAAC0WiEAFQAAAMlaIQAXAAAA4FohABkAAAD5WiEAHAAAABVbIQAVAAAAKlshABcAAABBWyEAFQAAAFZbIQAXAAAAbVshAAIAAAAyWiEADgAAAG9bIQAUAAAAg1shABIAAACVWyEAFwAAAKxbIQAVAAAAwVshAAkAAADKWyEABwAAANFbIQANAAAA3lshAAwAAADqWyEADQAAAPdbIQAMAAAAA1whAA0AAAAQXCEADAAAABxcIQAOAAAAKlwhAA0AAAA3XCEADQAAAERcIQAMAAAAUFwhAA0AAABdXCEADAAAAGlcIQANAAAAdlwhAAwAAACCXCEADQAAAI9cIQAMAAAAm1whAA4AAACpXCEADQAAALZcIQANAAAAw1whAAwAAADPXCEADQAAANxcIQAMAAAA6FwhAA8AAAD3XCEADQAAAARdIQARAAAAFV0hAA8AAAAkXSEADAAAADBdIQAKAAAAOl0hAAYAAABAXSEAGgAAAFpdIQAUAAAARVohABUAAABuXSEABAAAAHFaIQAXAAAAcl0hAAQAAACdWiEAFwAAAHZdIQAFAAAA+VohABwAAAB7XSEAAwAAAMlaIQAXAAAAfl0hAAMAAAAqWyEAFwAAAIFdIQADAAAAVlshABcAAACEXSEABAAAAIhdIQAEAAAAjF0hABQAAACgXSEAFQAAALVdIQARAAAAxl0hABIAAADYXSEAGQAAAPFdIQAcAAAADV4hAAMAAAAQXiEACgAAABpeIQAKAAAAEF4hAAoAAAAkXiEAAgAAAPFdIQAcAAAAJl4hAAMAAAApXiEACQAAADJeIQAJAAAAKV4hAAkAAAA7XiEAAgAAAKBdIQAVAAAAPV4hAAIAAADGXSEAEgAAAD9eIQACAAAAQV4hABAAAABRXiEADgAAAEFeIQAQAAAAX14hAAUAAABkXiEAEwAAAHdeIQAFAAAAfF4hAA8AAACLXiEABAAAAI9eIQAOAAAAnV4hAAUAAACiXiEABQAAAKdeIQAOAAAAfF4hAA8AAAC1XiEADQAAAI9eIQAOAAAAwl4hABEAAABkXiEAEwAAANNeIQARAAAA5F4hABIAAAD2XiEABQAAAOReIQASAAAA+14hAAcAAAACXyEAHAAAAB5fIQAaAAAAAl8hABwAAAA4XyEADAAAAERfIQAOAAAAUl8hAAwAAABeXyEADgAAAGxfIQANAAAAeV8hAA8AAACIXyEADQAAAJVfIQAPAAAApF8hAAMAAACnXyEACAAAAK9fIQAUAAAAw18hABUAAADYXyEACAAAAKdfIQAIAAAA4F8hAAcAAADDXyEAFQAAAOdfIQAGAAAA7V8hAA8AAAD8XyEADQAAAO1fIQAPAAAACWAhABgAAABAXSEAGgAAACFgIQACAAAAI2AhABAAAAAzYCEAAwAAADZgIQAWAAAATGAhAA8AAAAjYCEAEAAAAFtgIQAMAAAAZ2AhAA0AAAB0YCEAFAAAADZgIQAWAAAAiGAhAA4AAACWYCEADwAAAKVgIQAMAAAAsWAhAA0AAAC+YCEABgAAAGdgIQANAAAAxGAhAAUAAACWYCEADwAAAMlgIQAGAAAAsWAhAA0AAADPYCEAEgAAAOFgIQAUAAAA9WAhAAMAAAD4YCEACQAAAAFhIQAIAAAA+GAhAAkAAAAJYSEAAwAAAOFgIQAUAAAADGEhAAYAAAASYSEABgAAABhhIQADAAAAG2EhAAsAAAAmYSEACgAAABthIQALAAAAMGEhAAQAAAA0YSEACwAAAD9hIQALAAAANGEhAAsAAABKYSEAAwAAAE1hIQAIAAAAVWEhAAQAAABZYSEAEwAAAGxhIQARAAAAWWEhABMAAAB9YSEABAAAAIFhIQAUAAAAlWEhAAcAAABNYSEACAAAAJxhIQASAAAAgWEhABQAAACuYSEAFwAAAMVhIQAZAAAA3mEhABUAAADzYSEAFwAAAApiIQAEAAAAxWEhABkAAAAOYiEABAAAAPNhIQAXAAAAEmIhAAMAAAAVYiEACwAAACBiIQANAAAALWIhAA8AAAA8YiEAAgAAAD5iIQANAAAAS2IhAAUAAABQYiEADAAAAFxiIQALAAAAUGIhAAwAAABnYiEADAAAAD5iIQANAAAAc2IhAAsAAAB+YiEADAAAAIpiIQADAAAALWIhAA8AAACNYiEAAgAAAH5iIQAMAAAAj2IhABIAAACDWyEAEgAAAKFiIQAVAAAArFshABUAAAC2YiEABwAAAMpbIQAHAAAAvWIhAAsAAADeWyEADAAAAMhiIQALAAAA91shAAwAAADTYiEACwAAABBcIQAMAAAA3mIhAAwAAAAqXCEADQAAAOpiIQALAAAARFwhAAwAAAD1YiEACwAAAF1cIQAMAAAAAGMhAAsAAAB2XCEADAAAAAtjIQALAAAAj1whAAwAAAAWYyEADAAAAKlcIQANAAAAImMhAAsAAADDXCEADAAAAC1jIQALAAAA3FwhAAwAAAA4YyEADQAAAPdcIQANAAAARWMhAA8AAAAVXSEADwAAAFRjIQAKAAAAMF0hAAoAAABeYyEAAgAAAGBjIQAKAAAAamMhAAIAAABsYyEAEQAAAH1jIQAJAAAAYGMhAAoAAACGYyEAAwAAAIljIQAXAAAAoGMhABUAAACJYyEAFwAAALVjIQAFAAAAumMhAAkAAADDYyEACQAAALpjIQAJAAAAzGMhABAAAABsYyEAEQAAANxjIQAEAAAA4GMhAAQAAADkYyEAAgAAAOZjIQAEAAAA6mMhAAMAAADtYyEADgAAAJaUJgAEAAAA5mMhAAQAAAD7YyEACQAAAARkIQAKAAAADmQhAAUAAAATZCEAFwAAACpkIQAFAAAAL2QhAA8AAAA+ZCEADQAAAC9kIQAPAAAAS2QhAAUAAABQZCEADwAAAF9kIQANAAAAUGQhAA8AAABsZCEADAAAAHhkIQANAAAAhWQhAAYAAAB4ZCEADQAAAItkIQAGAAAAkWQhABAAAAChZCEADgAAAJFkIQAQAAAAr2QhAAYAAAC1ZCEAEAAAAMVkIQAOAAAAtWQhABAAAADTZCEAFQAAABNkIQAXAAAA6GQhAAIAAADqZCEADAAAAPZkIQALAAAA6mQhAAwAAAABZSEADAAAAA1lIQANAAAAGmUhAAIAAAANZSEADQAAABxlIQAGAAAAImUhABAAAAAyZSEACAAAABViIQALAAAAOmUhAAMAAAA9ZSEAIgAAAF9lIQAGAAAAZWUhABUAAAB6ZSEABAAAAH5lIQARAAAAj2UhAAQAAACTZSEADgAAAKFlIQAGAAAAp2UhAA8AAAC2ZSEABQAAALtlIQAKAAAAxWUhAA8AAAAiZSEAEAAAANRlIQAeAAAAPWUhACIAAADyZSEAEwAAAGVlIQAVAAAABWYhAA8AAAB+ZSEAEQAAABRmIQAMAAAAk2UhAA4AAAAgZiEADgAAAKdlIQAPAAAALmYhAAkAAAC7ZSEACgAAADdmIQAOAAAARWYhAA8AAABUZiEABgAAAEVmIQAPAAAAWmYhAAYAAABgZiEADgAAAG5mIQANAAAAYGYhAA4AAAB7ZiEAEQAAAIxmIQATAAAAn2YhAAUAAACMZiEAEwAAAKRmIQADAAAAp2YhABwAAADDZiEAGgAAAKdmIQAcAAAA3WYhAAUAAADiZiEADgAAAPBmIQANAAAA4mYhAA4AAAD9ZiEABwAAAARnIQAHAAAAC2chABEAAAAcZyEAEgAAAC5nIQACAAAAHGchABIAAAAwZyEAAgAAADJnIQAOAAAAQGchAAIAAABCZyEABgAAAEhnIQADAAAAS2chABMAAAB+tiYABgAAAEJnIQAGAAAAXmchABAAAABuZyEAEQAAAH9nIQADAAAAbmchABEAAACCZyEAAgAAAIRnIQALAAAAj2chAA0AAAAyZyEADgAAAJxnIQAQAAAArGchABEAAAC9ZyEAAwAAAEtnIQATAAAAwGchABEAAABLZyEAEwAAANFnIQAWAAAA52chABgAAAD/ZyEAFgAAABVoIQAYAAAALWghABYAAABDaCEAGAAAAFtoIQADAAAA52chABgAAABeaCEACgAAAIRnIQALAAAAaGghAAUAAABtaCEACwAAAHhoIQADAAAAFWghABgAAAB7aCEABQAAAKxnIQARAAAAgGghAAMAAABDaCEAGAAAAINoIQACAAAAhWghABEAAACWaCEABAAAAJpoIQAUAAAArmghABMAAACaaCEAFAAAAMFoIQAQAAAAhWghABEAAADRaCEAAgAAANNoIQARAAAA5GghAAUAAADpaCEAEQAAAPpoIQAMAAAA7WMhAA4AAAAGaSEAFAAAADBdIQAKAAAAGmkhABAAAADpaCEAEQAAACppIQAFAAAAL2khAAkAAAA4aSEACQAAAC9pIQAJAAAAQWkhABAAAADTaCEAEQAAAFFpIQADAAAAMF0hAAoAAABUaSEAEQAAAGVpIQASAAAAd2khABMAAACKaSEAFAAAAJ5pIQACAAAAimkhABQAAACgaSEAAgAAAGVpIQASAAAAomkhAAIAAACkaSEACgAAAK5pIQAKAAAAbWghAAsAAAC4aSEACQAAAKRpIQAKAAAAwWkhAAYAAABtaCEACwAAAMdpIQAEAAAAy2khAAwAAADXaSEACwAAAMtpIQAMAAAA4mkhAAQAAADmaSEACQAAAO9pIQAIAAAA5mkhAAkAAAD3aSEABQAAAERfIQAOAAAA/GkhAAUAAABeXyEADgAAAAFqIQAGAAAAeV8hAA8AAAAHaiEABgAAAJVfIQAPAAAAGT8gAGYAAAAvAgAAFgAAADEuMVYxXzExMC4wVjEwXzAxMS4wVjExXzAxMi4wVjEyXzAxMi4xVjEyXzExMy4wVjEzXzAxNC4wVjE0XzAxNS4wVjE1XzAyLjBWMl8wMi4xVjJfMTMuMFYzXzAzLjFWM18xMy4yVjNfMjQuMFY0XzA0LjFWNF8xNS4wVjVfMDUuMVY1XzE1LjJWNV8yNi4wVjZfMDYuMVY2XzE2LjJWNl8yNi4zVjZfMzcuMFY3XzA4LjBWOF8wOS4wVjlfMFVuYXNzaWduZWR1bmFzc2lnbmVkdjEwMHYxMXYxMTB2MTIwdjEyMXYxMzB2MTQwdjE1MHYyMHYyMXYzMHYzMXYzMnY0MHY0MXY1MHY1MXY1MnY2MHY2MXY2MnY2M3Y3MHY4MHY5MAAAeiEAAwAAAAN6IQAEAAAAB3ohAAQAAAALeiEABQAAABB6IQAEAAAAFHohAAUAAAAZeiEABAAAAB16IQAFAAAAInohAAQAAAAmeiEABQAAACt6IQAEAAAAL3ohAAUAAAA0eiEABAAAADh6IQAFAAAAPXohAAQAAABBeiEABQAAAEZ6IQADAAAASXohAAQAAABNeiEAAwAAAFB6IQAEAAAAVHohAAMAAABXeiEABAAAAFt6IQADAAAAXnohAAQAAABieiEAAwAAAGV6IQAEAAAAaXohAAMAAABseiEABAAAAHB6IQADAAAAc3ohAAQAAAB3eiEAAwAAAHp6IQAEAAAAfnohAAMAAACBeiEABAAAAIV6IQADAAAAiHohAAQAAACMeiEAAwAAAI96IQAEAAAAk3ohAAMAAACWeiEABAAAAJp6IQADAAAAnXohAAQAAACheiEAAwAAAKR6IQAEAAAAqHohAAMAAACreiEABAAAAK96IQADAAAAsnohAAQAAAC2eiEAAwAAALl6IQAEAAAA5GMhAAIAAAC9eiEACgAAAMd6IQAKAAAAvXohAAoAAADReiEABAAAAAt6IQAFAAAA1XohAAMAAAADeiEABAAAANh6IQAEAAAAFHohAAUAAADceiEABAAAAB16IQAFAAAA4HohAAQAAAAmeiEABQAAAOR6IQAEAAAAL3ohAAUAAADoeiEABAAAADh6IQAFAAAA7HohAAQAAABBeiEABQAAAPB6IQADAAAASXohAAQAAADzeiEAAwAAAFB6IQAEAAAA9nohAAMAAABXeiEABAAAAPl6IQADAAAAXnohAAQAAAD8eiEAAwAAAGV6IQAEAAAA/3ohAAMAAABseiEABAAAAAJ7IQADAAAAc3ohAAQAAAAFeyEAAwAAAHp6IQAEAAAACHshAAMAAACBeiEABAAAAAt7IQADAAAAiHohAAQAAAAOeyEAAwAAAI96IQAEAAAAEXshAAMAAACWeiEABAAAABR7IQADAAAAnXohAAQAAAAXeyEAAwAAAKR6IQAEAAAAGnshAAMAAACreiEABAAAAB17IQADAAAAsnohAAQAAAAgeyEAAwAAALl6IQAEAAAAY2FzZWRsZXR0ZXJDYXNlZF9MZXR0ZXJjY0NvbnRyb2xGb3JtYXRjbG9zZXB1bmN0dWF0aW9uQ2xvc2VfUHVuY3R1YXRpb25jbmNudHJsY29Qcml2YXRlX1VzZWNvbWJpbmluZ21hcmtjb25uZWN0b3JwdW5jdHVhdGlvbkNvbm5lY3Rvcl9QdW5jdHVhdGlvbmNvbnRyb2xjc1N1cnJvZ2F0ZWN1cnJlbmN5c3ltYm9sQ3VycmVuY3lfU3ltYm9sZGFzaHB1bmN0dWF0aW9uRGFzaF9QdW5jdHVhdGlvbmRlY2ltYWxudW1iZXJEZWNpbWFsX051bWJlcmRpZ2l0ZW5jbG9zaW5nbWFya0VuY2xvc2luZ19NYXJrZmluYWxwdW5jdHVhdGlvbkZpbmFsX1B1bmN0dWF0aW9uZm9ybWF0aW5pdGlhbHB1bmN0dWF0aW9uSW5pdGlhbF9QdW5jdHVhdGlvbkxldHRlcmxldHRlcmxldHRlcm51bWJlckxldHRlcl9OdW1iZXJsaW5lc2VwYXJhdG9yTGluZV9TZXBhcmF0b3JsbExvd2VyY2FzZV9MZXR0ZXJsbU1vZGlmaWVyX0xldHRlcmxvT3RoZXJfTGV0dGVybG93ZXJjYXNlbGV0dGVyVGl0bGVjYXNlX0xldHRlcmx1VXBwZXJjYXNlX0xldHRlcm1tYXJrbWF0aHN5bWJvbE1hdGhfU3ltYm9sbWNTcGFjaW5nX01hcmttZW1uTm9uc3BhY2luZ19NYXJrbW9kaWZpZXJsZXR0ZXJtb2RpZmllcnN5bWJvbE1vZGlmaWVyX1N5bWJvbG5kbmxub090aGVyX051bWJlcm5vbnNwYWNpbmdtYXJrb3BlbnB1bmN0dWF0aW9uT3Blbl9QdW5jdHVhdGlvbm90aGVyb3RoZXJsZXR0ZXJvdGhlcm51bWJlcm90aGVycHVuY3R1YXRpb25PdGhlcl9QdW5jdHVhdGlvbm90aGVyc3ltYm9sT3RoZXJfU3ltYm9sUHVuY3R1YXRpb25wYXJhZ3JhcGhzZXBhcmF0b3JQYXJhZ3JhcGhfU2VwYXJhdG9ycGNwZHBlcGZwb3ByaXZhdGV1c2Vwc3B1bmN0cHVuY3R1YXRpb25zc2VwYXJhdG9yU2VwYXJhdG9yc2tzbXNvc3BhY2VzZXBhcmF0b3JTcGFjZV9TZXBhcmF0b3JzcGFjaW5nbWFya3N1cnJvZ2F0ZXRpdGxlY2FzZWxldHRlcnVwcGVyY2FzZWxldHRlcnp6bHpwenMAAAAMwSYAAQAAAOYfJgAFAAAAZH4hAAsAAABvfiEADAAAAHt+IQACAAAAfX4hAAcAAABaWiEAAgAAAIR+IQAGAAAAin4hABAAAACafiEAEQAAAKt+IQACAAAAvXohAAoAAACtfiEABQAAAH1+IQAHAAAAsn4hAAIAAAC0fiEACwAAAL9+IQANAAAA0yYmAAQAAADMfiEAFAAAAOB+IQAVAAAA9X4hAAcAAAB9fiEABwAAAPx+IQACAAAA/n4hAAkAAAAHfyEADgAAABV/IQAPAAAAJH8hAA8AAAAzfyEAEAAAAEN/IQANAAAAUH8hAA4AAABefyEABQAAAFB/IQAOAAAAY38hAA0AAABwfyEADgAAAH5/IQAQAAAAjn8hABEAAACffyEABgAAAIR+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YWtiYXRrYmVuZ0JlbmdhbGliZW5nYWxpYmhhaWtzdWtpQmhhaWtzdWtpYmhrc2JvcG9Cb3BvbW9mb2JvcG9tb2ZvYnJhaEJyYWhtaWJyYWhtaWJyYWlCcmFpbGxlYnJhaWxsZWJ1Z2lCdWdpbmVzZWJ1Z2luZXNlYnVoZEJ1aGlkYnVoaWRjYWttQ2hha21hY2FuYWRpYW5hYm9yaWdpbmFsQ2FuYWRpYW5fQWJvcmlnaW5hbGNhbnNjYXJpQ2FyaWFuY2FyaWFuY2F1Y2FzaWFuYWxiYW5pYW5jaGFrbWFjaGFtQ2hhbWNoZXJDaGVyb2tlZWNoZXJva2VlY2hvcmFzbWlhbkNob3Jhc21pYW5jaHJzY29tbW9uQ29tbW9uY29wdENvcHRpY2NvcHRpY2NwbW5DeXByb19NaW5vYW5jcHJ0Q3lwcmlvdGN1bmVpZm9ybUN1bmVpZm9ybWN5cHJpb3RjeXByb21pbm9hbmN5cmlsbGljQ3lyaWxsaWNjeXJsZGVzZXJldERlc2VyZXRkZXZhRGV2YW5hZ2FyaWRldmFuYWdhcmlkaWFrRGl2ZXNfQWt1cnVkaXZlc2FrdXJ1ZG9nckRvZ3JhZG9ncmFkc3J0ZHVwbER1cGxveWFuZHVwbG95YW5lZ3lwRWd5cHRpYW5fSGllcm9nbHlwaHNlZ3lwdGlhbmhpZXJvZ2x5cGhzZWxiYUVsYmFzYW5lbGJhc2FuZWx5bUVseW1haWNlbHltYWljZXRoaUV0aGlvcGljZXRoaW9waWNnZW9yR2VvcmdpYW5nZW9yZ2lhbmdsYWdHbGFnb2xpdGljZ2xhZ29saXRpY2dvbmdHdW5qYWxhX0dvbmRpZ29ubU1hc2FyYW1fR29uZGlnb3RoR290aGljZ290aGljZ3JhbkdyYW50aGFncmFudGhhZ3JlZWtHcmVla2dyZWtndWphcmF0aUd1amFyYXRpZ3Vqcmd1bmphbGFnb25kaWd1cm11a2hpR3VybXVraGlndXJ1aGFuSGFuaGFuZ0hhbmd1bGhhbmd1bGhhbmloYW5pZmlyb2hpbmd5YUhhbmlmaV9Sb2hpbmd5YWhhbm9IYW51bm9vaGFudW5vb2hhdHJIYXRyYW5oYXRyYW5oZWJySGVicmV3aGVicmV3aGlyYUhpcmFnYW5haGlyYWdhbmFobHV3aG1uZ1BhaGF3aF9IbW9uZ2htbnBOeWlha2VuZ19QdWFjaHVlX0htb25naHJrdEthdGFrYW5hX09yX0hpcmFnYW5haHVuZ09sZF9IdW5nYXJpYW5pbXBlcmlhbGFyYW1haWNpbmhlcml0ZWRJbmhlcml0ZWRpbnNjcmlwdGlvbmFscGFobGF2aUluc2NyaXB0aW9uYWxfUGFobGF2aWluc2NyaXB0aW9uYWxwYXJ0aGlhbkluc2NyaXB0aW9uYWxfUGFydGhpYW5pdGFsT2xkX0l0YWxpY2phdmFKYXZhbmVzZWphdmFuZXNla2FpdGhpS2FpdGhpa2FsaUtheWFoX0xpa2FuYUthdGFrYW5ha2FubmFkYUthbm5hZGFrYXRha2FuYWthdGFrYW5hb3JoaXJhZ2FuYWthd2lLYXdpa2F5YWhsaWtoYXJLaGFyb3NodGhpa2hhcm9zaHRoaWtoaXRhbnNtYWxsc2NyaXB0S2hpdGFuX1NtYWxsX1NjcmlwdGtobWVyS2htZXJraG1ya2hvaktob2praWtob2praWtodWRhd2FkaUtodWRhd2FkaWtpdHNrbmRha3RoaWxhbmFUYWlfVGhhbWxhb0xhb2xhb29sYXRpbkxhdGlubGF0bmxlcGNMZXBjaGFsZXBjaGFsaW1iTGltYnVsaW1idWxpbmFMaW5lYXJfQWxpbmJMaW5lYXJfQmxpbmVhcmFsaW5lYXJibGlzdUxpc3VseWNpTHljaWFubHljaWFubHlkaUx5ZGlhbmx5ZGlhbm1haGFqYW5pTWFoYWphbmltYWhqbWFrYU1ha2FzYXJtYWthc2FybWFsYXlhbGFtTWFsYXlhbGFtbWFuZE1hbmRhaWNtYW5kYWljbWFuaU1hbmljaGFlYW5tYW5pY2hhZWFubWFyY01hcmNoZW5tYXJjaGVubWFzYXJhbWdvbmRpbWVkZWZhaWRyaW5NZWRlZmFpZHJpbm1lZGZtZWV0ZWltYXlla01lZXRlaV9NYXlla21lbmRNZW5kZV9LaWtha3VpbWVuZGVraWtha3VpbWVyY01lcm9pdGljX0N1cnNpdmVtZXJvTWVyb2l0aWNfSGllcm9nbHlwaHNtZXJvaXRpY2N1cnNpdmVtZXJvaXRpY2hpZXJvZ2x5cGhzbWlhb01pYW9tbHltbW9kaU1vZGltb25nTW9uZ29saWFubW9uZ29saWFubXJvTXJvbXJvb210ZWltdWx0TXVsdGFuaW11bHRhbmlteWFubWFyTXlhbm1hcm15bXJuYWJhdGFlYW5OYWJhdGFlYW5uYWdtTmFnX011bmRhcmluYWdtdW5kYXJpbmFuZE5hbmRpbmFnYXJpbmFuZGluYWdhcmluYXJiT2xkX05vcnRoX0FyYWJpYW5uYmF0bmV3YU5ld2FuZXd0YWlsdWVOZXdfVGFpX0x1ZW5rb05rb25rb29uc2h1TnVzaHVudXNodW55aWFrZW5ncHVhY2h1ZWhtb25nb2dhbU9naGFtb2doYW1vbGNoaWtpT2xfQ2hpa2lvbGNrb2xkaHVuZ2FyaWFub2xkaXRhbGljb2xkbm9ydGhhcmFiaWFub2xkcGVybWljT2xkX1Blcm1pY29sZHBlcnNpYW5PbGRfUGVyc2lhbm9sZHNvZ2RpYW5PbGRfU29nZGlhbm9sZHNvdXRoYXJhYmlhbk9sZF9Tb3V0aF9BcmFiaWFub2xkdHVya2ljT2xkX1R1cmtpY29sZHV5Z2h1ck9sZF9VeWdodXJvcml5YU9yaXlhb3JraG9yeWFvc2FnZU9zYWdlb3NnZW9zbWFPc21hbnlhb3NtYW55YW91Z3JwYWhhd2hobW9uZ3BhbG1QYWxteXJlbmVwYWxteXJlbmVwYXVjUGF1X0Npbl9IYXVwYXVjaW5oYXVwZXJtcGhhZ1BoYWdzX1BhcGhhZ3NwYXBobGlwaGxwUHNhbHRlcl9QYWhsYXZpcGhueFBob2VuaWNpYW5waG9lbmljaWFucGxyZHBydGlwc2FsdGVycGFobGF2aXFhYWNxYWFpcmVqYW5nUmVqYW5ncmpuZ3JvaGdydW5pY1J1bmljcnVucnNhbWFyaXRhblNhbWFyaXRhbnNhbXJzYXJic2F1clNhdXJhc2h0cmFzYXVyYXNodHJhc2dud1NpZ25Xcml0aW5nc2hhcmFkYVNoYXJhZGFzaGF2aWFuU2hhdmlhbnNoYXdzaHJkc2lkZFNpZGRoYW1zaWRkaGFtc2lnbndyaXRpbmdzaW5kc2luaFNpbmhhbGFzaW5oYWxhc29nZFNvZ2RpYW5zb2dkaWFuc29nb3NvcmFTb3JhX1NvbXBlbmdzb3Jhc29tcGVuZ3NveW9Tb3lvbWJvc295b21ib3N1bmRTdW5kYW5lc2VzdW5kYW5lc2VzeWxvU3lsb3RpX05hZ3Jpc3lsb3RpbmFncmlzeXJjU3lyaWFjc3lyaWFjdGFnYWxvZ1RhZ2Fsb2d0YWdiVGFnYmFud2F0YWdiYW53YXRhaWxlVGFpX0xldGFpdGhhbXRhaXZpZXRUYWlfVmlldHRha3JUYWtyaXRha3JpdGFsZXRhbHV0YW1pbFRhbWlsdGFtbHRhbmdUYW5ndXR0YW5nc2FUYW5nc2F0YW5ndXR0YXZ0dGVsdVRlbHVndXRlbHVndXRmbmdUaWZpbmFnaHRnbGd0aGFhVGhhYW5hdGhhYW5hdGhhaVRoYWl0aWJldGFuVGliZXRhbnRpYnR0aWZpbmFnaHRpcmhUaXJodXRhdGlyaHV0YXRuc2F0b3RvVG90b3VnYXJVZ2FyaXRpY3VnYXJpdGljdmFpVmFpdmFpaXZpdGhWaXRoa3VxaXZpdGhrdXFpd2FuY2hvV2FuY2hvd2FyYVdhcmFuZ19DaXRpd2FyYW5nY2l0aXdjaG94cGVveHN1eHllemlZZXppZGl5ZXppZGl5aVlpeWlpaXphbmFiYXphcnNxdWFyZVphbmFiYXphcl9TcXVhcmV6YW5iemluaHp5eXl6enp6AAAAgIkhAAUAAACFiSEABQAAAIqJIQAEAAAAhYkhAAUAAACOiSEABAAAAJKJIQASAAAApIkhAAQAAACoiSEABAAAAKyJIQAUAAAAwIkhABUAAADViSEABAAAANmJIQAGAAAA34khAAYAAADZiSEABgAAAOWJIQAIAAAA7YkhAAgAAAD1iSEABAAAAPmJIQAQAAAACYohAAQAAADtiSEACAAAAA2KIQAHAAAAFIohAAcAAAAbiiEABAAAABSKIQAHAAAAH4ohAAQAAAAjiiEACAAAACuKIQAIAAAAI4ohAAgAAAAziiEABAAAADeKIQAFAAAAPIohAAUAAAA3iiEABQAAAEGKIQAEAAAARYohAAkAAABOiiEACAAAAEWKIQAJAAAAVoohAAUAAABbiiEABQAAAGCKIQAEAAAAW4ohAAUAAABkiiEABAAAAGiKIQAHAAAAb4ohAAcAAABoiiEABwAAAHaKIQAJAAAAf4ohAAkAAACIiiEABAAAAH+KIQAJAAAAjIohAAQAAACQiiEACAAAAJiKIQAIAAAAkIohAAgAAACgiiEABAAAAKSKIQAGAAAAqoohAAYAAACkiiEABgAAALCKIQAEAAAAtIohAAcAAAC7iiEABwAAALSKIQAHAAAAwoohAAQAAADGiiEACAAAAM6KIQAIAAAAxoohAAgAAADWiiEABAAAANqKIQAFAAAA34ohAAUAAADaiiEABQAAAOSKIQAEAAAA6IohAAYAAADuiiEAEgAAAACLIQATAAAAE4shAAQAAAAAiyEAEwAAABeLIQAEAAAAG4shAAYAAAAhiyEABgAAABuLIQAGAAAAJ4shABEAAACSiSEAEgAAADiLIQAGAAAA6IohAAYAAAA+iyEABAAAAEKLIQAEAAAARoshAAQAAABKiyEACAAAAFKLIQAIAAAASoshAAgAAABaiyEACgAAAGSLIQAKAAAAboshAAQAAABkiyEACgAAAHKLIQAGAAAAeIshAAYAAAB+iyEABAAAAIKLIQAGAAAAiIshAAYAAACCiyEABgAAAI6LIQAEAAAAkoshAAwAAACeiyEABAAAAKKLIQAHAAAAqYshAAkAAACyiyEACQAAALuLIQAHAAAAooshAAcAAADCiyEACwAAAJKLIQAMAAAAzYshAAgAAADViyEACAAAAN2LIQAEAAAA1YshAAgAAADhiyEABwAAAOiLIQAHAAAA74shAAQAAADziyEACgAAAP2LIQAKAAAA84shAAoAAAAHjCEABAAAAAuMIQALAAAAFowhAAoAAAALjCEACwAAACCMIQAEAAAAJIwhAAUAAAApjCEABQAAACSMIQAFAAAALowhAAQAAADoiyEABwAAADKMIQAEAAAANowhAAgAAAA+jCEACAAAADaMIQAIAAAARowhAAQAAABKjCEAFAAAAF6MIQATAAAASowhABQAAABxjCEABAAAAHWMIQAHAAAAfIwhAAcAAAB1jCEABwAAAIOMIQAEAAAAh4whAAcAAACOjCEABwAAAIeMIQAHAAAAlYwhAAQAAACZjCEACAAAAKGMIQAIAAAAmYwhAAgAAACpjCEABAAAAK2MIQAIAAAAtYwhAAgAAACtjCEACAAAAL2MIQAEAAAAwYwhAAoAAADLjCEACgAAAMGMIQAKAAAA1YwhAAQAAADZjCEADQAAAOaMIQAEAAAA6owhAA0AAAD3jCEABAAAAPuMIQAGAAAAAY0hAAYAAAD7jCEABgAAAAeNIQAEAAAAC40hAAcA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AAB8BQAAfQUAAH4FAAB/BQAAgAUAAIEFAACCBQAAgwUAAIQFAACFBQAAhgUAADEFAAAyBQAAMwUAADQFAAA1BQAANgUAADcFAAA4BQAAOQUAADoFAAA7BQAAPAUAAD0FAAA+BQAAPwUAAEAFAABBBQAAQgUAAEMFAABEBQAARQUAAEYFAABHBQAASAUAAEkFAABKBQAASwUAAEwFAABNBQAATgUAAE8FAABQBQAAUQUAAFIFAABTBQAAVAUAAFUFAABWBQAAAC0AAAEtAAACLQAAAy0AAAQtAAAFLQAABi0AAActAAAILQAACS0AAAotAAALLQAADC0AAA0tAAAOLQAADy0AABAtAAARLQAAEi0AABMtAAAULQAAFS0AABYtAAAXLQAAGC0AABktAAAaLQAAGy0AABwtAAAdLQAAHi0AAB8tAAAgLQAAIS0AACItAAAjLQAAJC0AACUtAAAnLQAALS0AAJAcAACRHAAAkhwAAJMcAACUHAAAlRwAAJYcAACXHAAAmBwAAJkcAACaHAAAmxwAAJwcAACdHAAAnhwAAJ8cAACgHAAAoRwAAKIcAACjHAAApBwAAKUcAACmHAAApxwAAKgcAACpHAAAqhwAAKscAACsHAAArRwAAK4cAACvHAAAsBwAALEcAACyHAAAsxwAALQcAAC1HAAAthwAALccAAC4HAAAuRwAALocAAC9HAAAvhwAAL8cAABwqwAAcasAAHKrAABzqwAAdKsAAHWrAAB2qwAAd6sAAHirAAB5qwAAeqsAAHurAAB8qwAAfasAAH6rAAB/qwAAgKsAAIGrAACCqwAAg6sAAISrAACFqwAAhqsAAIerAACIqwAAiasAAIqrAACLqwAAjKsAAI2rAACOqwAAj6sAAJCrAACRqwAAkqsAAJOrAACUqwAAlasAAJarAACXqwAAmKsAAJmrAACaqwAAm6sAAJyrAACdqwAAnqsAAJ+rAACgqwAAoasAAKKrAACjqwAApKsAAKWrAACmqwAAp6sAAKirAACpqwAAqqsAAKurAACsqwAArasAAK6rAACvqwAAsKsAALGrAACyqwAAs6sAALSrAAC1qwAAtqsAALerAAC4qwAAuasAALqrAAC7qwAAvKsAAL2rAAC+qwAAv6sAAPgTAAD5EwAA+hMAAPsTAAD8EwAA/RMAAPATAADxEwAA8hMAAPMT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AACaHwAAmx8AAJwfAACdHwAAnh8AAJ8fAACQHwAAkR8AAJIfAACTHwAAlB8AAJUfAACWHwAAlx8AAKgfAACpHwAAqh8AAKsfAACsHwAArR8AAK4fAACvHwAAoB8AAKEfAACiHwAAox8AAKQfAAClHwAAph8AAKcfAAC4HwAAuR8AALwfAACwHwAAsR8AAHAfAABxHwAAsx8AAEUDAACZAwAAuQMAAMwfAAByHwAAcx8AAHQfAAB1HwAAwx8AANgfAADZHwAA0B8AANEfAAB2HwAAdx8AAOgfAADpHwAA7B8AAOAfAADhHwAAeh8AAHsfAADlHwAA/B8AAHgfAAB5HwAAfB8AAH0fAADzHwAAqQMAAMkDAABLAAAAawAAAMUAAADlAAAATiEAADIhAABwIQAAcSEAAHIhAABzIQAAdCEAAHUhAAB2IQAAdyEAAHghAAB5IQAAeiEAAHshAAB8IQAAfSEAAH4hAAB/IQAAYCEAAGEhAABiIQAAYyEAAGQhAABlIQAAZiEAAGchAABoIQAAaSEAAGohAABrIQAAbCEAAG0hAABuIQAAbyEAAIQhAACDIQAA0CQAANEkAADSJAAA0yQAANQkAADVJAAA1iQAANckAADYJAAA2SQAANokAADbJAAA3CQAAN0kAADeJAAA3yQAAOAkAADhJAAA4iQAAOMkAADkJAAA5SQAAOYkAADnJAAA6CQAAOkkAAC2JAAAtyQAALgkAAC5JAAAuiQAALskAAC8JAAAvSQAAL4kAAC/JAAAwCQAAMEkAADCJAAAwyQAAMQkAADFJAAAxiQAAMckAADIJAAAySQAAMokAADLJAAAzCQAAM0kAADOJAAAzyQAADAsAAAxLAAAMiwAADMsAAA0LAAANSwAADYsAAA3LAAAOCwAADksAAA6LAAAOywAADwsAAA9LAAAPiwAAD8sAABALAAAQSwAAEIsAABDLAAARCwAAEUsAABGLAAARywAAEgsAABJLAAASiwAAEssAABMLAAATSwAAE4sAABPLAAAUCwAAFEsAABSLAAAUywAAFQsAABVLAAAViwAAFcsAABYLAAAWSwAAFosAABbLAAAXCwAAF0sAABeLAAAXywAAAAsAAABLAAAAiwAAAMsAAAELAAABSwAAAYsAAAHLAAACCwAAAksAAAKLAAACywAAAwsAAANLAAADiwAAA8sAAAQLAAAESwAABIsAAATLAAAFCwAABUsAAAWLAAAFywAABgsAAAZLAAAGiwAABssAAAcLAAAHSwAAB4sAAAfLAAAICwAACEsAAAiLAAAIywAACQsAAAlLAAAJiwAACcsAAAoLAAAKSwAACosAAArLAAALCwAAC0sAAAuLAAALywAAGEsAABgLAAAawIAAH0dAAB9AgAAOgIAAD4CAABoLAAAZywAAGosAABpLAAAbCwAAGssAABRAgAAcQIAAFACAABSAgAAcywAAHIsAAB2LAAAdSwAAD8CAABAAgAAgSwAAIAsAACDLAAAgiwAAIUsAACELAAAhywAAIYsAACJLAAAiCwAAIssAACKLAAAjSwAAIwsAACPLAAAjiwAAJEsAACQLAAAkywAAJIsAACVLAAAlCwAAJcsAACWLAAAmSwAAJgsAACbLAAAmiwAAJ0sAACcLAAAnywAAJ4sAAChLAAAoCwAAKMsAACiLAAApSwAAKQsAACnLAAApiwAAKksAACoLAAAqywAAKosAACtLAAArCwAAK8sAACuLAAAsSwAALAsAACzLAAAsiwAALUsAAC0LAAAtywAALYsAAC5LAAAuCwAALssAAC6LAAAvSwAALwsAAC/LAAAviwAAMEsAADALAAAwywAAMIsAADFLAAAxCwAAMcsAADGLAAAySwAAMgsAADLLAAAyiwAAM0sAADMLAAAzywAAM4sAADRLAAA0CwAANMsAADSLAAA1SwAANQsAADXLAAA1iwAANksAADYLAAA2ywAANosAADdLAAA3CwAAN8sAADeLAAA4SwAAOAsAADjLAAA4iwAAOwsAADrLAAA7iwAAO0sAADzLAAA8iwAAKAQAAChEAAAohAAAKMQAACkEAAApRAAAKYQAACnEAAAqBAAAKkQAACqEAAAqxAAAKwQAACtEAAArhAAAK8QAACwEAAAsRAAALIQAACzEAAAtBAAALUQAAC2EAAAtxAAALgQAAC5EAAAuhAAALsQAAC8EAAAvRAAAL4QAAC/EAAAwBAAAMEQAADCEAAAwxAAAMQQAADFEAAAxxAAAM0QAABBpgAAQKYAAEOmAABCpgAARaYAAESmAABHpgAARqYAAEmmAABIpgAAiBwAAEumAACIHAAASqYAAE2mAABMpgAAT6YAAE6mAABRpgAAUKYAAFOmAABSpgAAVaYAAFSmAABXpgAAVqYAAFmmAABYpgAAW6YAAFqmAABdpgAAXKYAAF+mAABepgAAYaYAAGCmAABjpgAAYqYAAGWmAABkpgAAZ6YAAGamAABppgAAaKYAAGumAABqpgAAbaYAAGymAACBpgAAgKYAAIOmAACCpgAAhaYAAISmAACHpgAAhqYAAImmAACIpgAAi6YAAIqmAACNpgAAjKYAAI+mAACOpgAAkaYAAJCmAACTpgAAkqYAAJWmAACUpgAAl6YAAJamAACZpgAAmKYAAJumAACapgAAI6cAACKnAAAlpwAAJKcAACenAAAmpwAAKacAACinAAArpwAAKqcAAC2nAAAspwAAL6cAAC6nAAAzpwAAMqcAADWnAAA0pwAAN6cAADanAAA5pwAAOKcAADunAAA6pwAAPacAADynAAA/pwAAPqcAAEGnAABApwAAQ6cAAEKnAABFpwAARKcAAEenAABGpwAASacAAEinAABLpwAASqcAAE2nAABMpwAAT6cAAE6nAABRpwAAUKcAAFOnAABSpwAAVacAAFSnAABXpwAAVqcAAFmnAABYpwAAW6cAAFqnAABdpwAAXKcAAF+nAABepwAAYacAAGCnAABjpwAAYqcAAGWnAABkpwAAZ6cAAGanAABppwAAaKcAAGunAABqpwAAbacAAGynAABvpwAAbqcAAHqnAAB5pwAAfKcAAHunAAB5HQAAf6cAAH6nAACBpwAAgKcAAIOnAACCpwAAhacAAISnAACHpwAAhqcAAIynAACLpwAAZQIAAJGnAACQpwAAk6cAAJKnAADEpwAAl6cAAJanAACZpwAAmKcAAJunAACapwAAnacAAJynAACfpwAAnqcAAKGnAACgpwAAo6cAAKKnAAClpwAApKcAAKenAACmpwAAqacAAKinAABmAgAAXAIAAGECAABsAgAAagIAAJ4CAACHAgAAnQIAAFOrAAC1pwAAtKcAALenAAC2pwAAuacAALinAAC7pwAAuqcAAL2nAAC8pwAAv6cAAL6nAADBpwAAwKcAAMOnAADCpwAAlKcAAIICAACOHQAAyKcAAMenAADKpwAAyacAANGnAADQpwAA16cAANanAADZpwAA2KcAAPanAAD1pwAAs6cAAKATAAChEwAAohMAAKMTAACkEwAApRMAAKYTAACnEwAAqBMAAKkTAACqEwAAqxMAAKwT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AAB+AQAADLchAAEAAAB/AQAAELchAAIAAACAAQAAGLchAAEAAACBAQAAHLchAAEAAACCAQAAILchAAEAAACDAQAAJLchAAEAAACEAQAAKLchAAEAAACFAQAALLchAAEAAACGAQAAMLchAAEAAACHAQAANLchAAEAAACIAQAAOLchAAEAAACJAQAAPLchAAEAAACKAQAAQLchAAEAAACLAQAARLchAAEAAACMAQAASLchAAEAAACOAQAATLchAAEAAACPAQAAULchAAEAAACQAQAAVLchAAEAAACRAQAAWLchAAEAAACSAQAAXLchAAEAAACTAQAAYLchAAEAAACUAQAAZLchAAEAAACVAQAAaLchAAEAAACWAQAAbLchAAEAAACXAQAAcLchAAEAAACYAQAAdLchAAEAAACZAQAAeLchAAEAAACaAQAAfLchAAEAAACcAQAAgLchAAEAAACdAQAAhLchAAEAAACeAQAAiLchAAEAAACfAQAAjLchAAEAAACgAQAAkLchAAEAAAChAQAAlLchAAEAAACiAQAAmLchAAEAAACjAQAAnLchAAEAAACkAQAAoLchAAEAAAClAQAApLchAAEAAACmAQAAqLchAAEAAACnAQAArLchAAEAAACoAQAAsLchAAEAAACpAQAAtLchAAEAAACsAQAAuLchAAEAAACtAQAAvLchAAEAAACuAQAAwLchAAEAAACvAQAAxLchAAEAAACwAQAAyLchAAEAAACxAQAAzLchAAEAAACyAQAA0LchAAEAAACzAQAA1LchAAEAAAC0AQAA2LchAAEAAAC1AQAA3LchAAEAAAC2AQAA4LchAAEAAAC3AQAA5LchAAEAAAC4AQAA6LchAAEAAAC5AQAA7LchAAEAAAC8AQAA8LchAAEAAAC9AQAA9LchAAEAAAC/AQAA+LchAAEAAADEAQAA/LchAAIAAADFAQAABLghAAIAAADGAQAADLghAAIAAADHAQAAFLghAAIAAADIAQAAHLghAAIAAADJAQAAJLghAAIAAADKAQAALLghAAIAAADLAQAANLghAAIAAADMAQAAPLghAAIAAADNAQAARLghAAEAAADOAQAASLghAAEAAADPAQAATLghAAEAAADQAQAAULghAAEAAADRAQAAVLghAAEAAADSAQAAWLghAAEAAADTAQAAXLghAAEAAADUAQAAYLghAAEAAADVAQAAZLghAAEAAADWAQAAaLghAAEAAADXAQAAbLghAAEAAADYAQAAcLghAAEAAADZAQAAdLghAAEAAADaAQAAeLghAAEAAADbAQAAfLghAAEAAADcAQAAgLghAAEAAADdAQAAhLghAAEAAADeAQAAiLghAAEAAADfAQAAjLghAAEAAADgAQAAkLghAAEAAADhAQAAlLghAAEAAADiAQAAmLghAAEAAADjAQAAnLghAAEAAADkAQAAoLghAAEAAADlAQAApLghAAEAAADmAQAAqLghAAEAAADnAQAArLghAAEAAADoAQAAsLghAAEAAADpAQAAtLghAAEAAADqAQAAuLghAAEAAADrAQAAvLghAAEAAADsAQAAwLghAAEAAADtAQAAxLghAAEAAADuAQAAyLghAAEAAADvAQAAzLghAAEAAADxAQAA0LghAAIAAADyAQAA2LghAAIAAADzAQAA4LghAAIAAAD0AQAA6LghAAEAAAD1AQAA7LghAAEAAAD2AQAA8LghAAEAAAD3AQAA9LghAAEAAAD4AQAA+LghAAEAAAD5AQAA/LghAAEAAAD6AQAAALkhAAEAAAD7AQAABLkhAAEAAAD8AQAACLkhAAEAAAD9AQAADLkhAAEAAAD+AQAAELkhAAEAAAD/AQAAFLkhAAEAAAAAAgAAGLkhAAEAAAABAgAAHLkhAAEAAAACAgAAILkhAAEAAAADAgAAJLkhAAEAAAAEAgAAKLkhAAEAAAAFAgAALLkhAAEAAAAGAgAAMLkhAAEAAAAHAgAANLkhAAEAAAAIAgAAOLkhAAEAAAAJAgAAPLkhAAEAAAAKAgAAQLkhAAEAAAALAgAARLkhAAEAAAAMAgAASLkhAAEAAAANAgAATLkhAAEAAAAOAgAAULkhAAEAAAAPAgAAVLkhAAEAAAAQAgAAWLkhAAEAAAARAgAAXLkhAAEAAAASAgAAYLkhAAEAAAATAgAAZLkhAAEAAAAUAgAAaLkhAAEAAAAVAgAAbLkhAAEAAAAWAgAAcLkhAAEAAAAXAgAAdLkhAAEAAAAYAgAAeLkhAAEAAAAZAgAAfLkhAAEAAAAaAgAAgLkhAAEAAAAbAgAAhLkhAAEAAAAcAgAAiLkhAAEAAAAdAgAAjLkhAAEAAAAeAgAAkLkhAAEAAAAfAgAAlLkhAAEAAAAgAgAAmLkhAAEAAAAiAgAAnLkhAAEAAAAjAgAAoLkhAAEAAAAkAgAApLkhAAEAAAAlAgAAqLkhAAEAAAAmAgAArLkhAAEAAAAnAgAAsLkhAAEAAAAoAgAAtLkhAAEAAAApAgAAuLkhAAEAAAAqAgAAvLkhAAEAAAArAgAAwLkhAAEAAAAsAgAAxLkhAAEAAAAtAgAAyLkhAAEAAAAuAgAAzLkhAAEAAAAvAgAA0LkhAAEAAAAwAgAA1LkhAAEAAAAxAgAA2LkhAAEAAAAyAgAA3LkhAAEAAAAzAgAA4LkhAAEAAAA6AgAA5LkhAAEAAAA7AgAA6LkhAAEAAAA8AgAA7LkhAAEAAAA9AgAA8LkhAAEAAAA+AgAA9LkhAAEAAAA/AgAA+LkhAAEAAABAAgAA/LkhAAEAAABBAgAAALohAAEAAABCAgAABLohAAEAAABDAgAACLohAAEAAABEAgAADLohAAEAAABFAgAAELohAAEAAABGAgAAFLohAAEAAABHAgAAGLohAAEAAABIAgAAHLohAAEAAABJAgAAILohAAEAAABKAgAAJLohAAEAAABLAgAAKLohAAEAAABMAgAALLohAAEAAABNAgAAMLohAAEAAABOAgAANLohAAEAAABPAgAAOLohAAEAAABQAgAAPLohAAEAAABRAgAAQLohAAEAAABSAgAARLohAAEAAABTAgAASLohAAEAAABUAgAATLohAAEAAABWAgAAULohAAEAAABXAgAAVLohAAEAAABZAgAAWLohAAEAAABbAgAAXLohAAEAAABcAgAAYLohAAEAAABgAgAAZLohAAEAAABhAgAAaLohAAEAAABjAgAAbLohAAEAAABlAgAAcLohAAEAAABmAgAAdLohAAEAAABoAgAAeLohAAEAAABpAgAAfLohAAEAAABqAgAAgLohAAEAAABrAgAAhLohAAEAAABsAgAAiLohAAEAAABvAgAAjLohAAEAAABxAgAAkLohAAEAAAByAgAAlLohAAEAAAB1AgAAmLohAAEAAAB9AgAAnLohAAEAAACAAgAAoLohAAEAAACCAgAApLohAAEAAACDAgAAqLohAAEAAACHAgAArLohAAEAAACIAgAAsLohAAEAAACJAgAAtLohAAEAAACKAgAAuLohAAEAAACLAgAAvLohAAEAAACMAgAAwLohAAEAAACSAgAAxLohAAEAAACdAgAAyLohAAEAAACeAgAAzLohAAEAAABFAwAA0LohAAMAAABwAwAA3LohAAEAAABxAwAA4LohAAEAAAByAwAA5LohAAEAAABzAwAA6LohAAEAAAB2AwAA7LohAAEAAAB3AwAA8LohAAEAAAB7AwAA9LohAAEAAAB8AwAA+LohAAEAAAB9AwAA/LohAAEAAAB/AwAAALshAAEAAACGAwAABLshAAEAAACIAwAACLshAAEAAACJAwAADLshAAEAAACKAwAAELshAAEAAACMAwAAFLshAAEAAACOAwAAGLshAAEAAACPAwAAHLshAAEAAACRAwAAILshAAEAAACSAwAAJLshAAIAAACTAwAALLshAAEAAACUAwAAMLshAAEAAACVAwAANLshAAIAAACWAwAAPLshAAEAAACXAwAAQLshAAEAAACYAwAARLshAAMAAACZAwAAULshAAMAAACaAwAAXLshAAIAAACbAwAAZLshAAEAAACcAwAAaLshAAIAAACdAwAAcLshAAEAAACeAwAAdLshAAEAAACfAwAAeLshAAEAAACgAwAAfLshAAIAAAChAwAAhLshAAIAAACjAwAAjLshAAIAAACkAwAAlLshAAEAAAClAwAAmLshAAEAAACmAwAAnLshAAIAAACnAwAApLshAAEAAACoAwAAqLshAAEAAACpAwAArLshAAIAAACqAwAAtLshAAEAAACrAwAAuLshAAEAAACsAwAAvLshAAEAAACtAwAAwLshAAEAAACuAwAAxLshAAEAAACvAwAAyLshAAEAAACxAwAAzLshAAEAAACyAwAA0LshAAIAAACzAwAA2LshAAEAAAC0AwAA3LshAAEAAAC1AwAA4LshAAIAAAC2AwAA6LshAAEAAAC3AwAA7LshAAEAAAC4AwAA8LshAAMAAAC5AwAA/LshAAMAAAC6AwAACLwhAAIAAAC7AwAAELwhAAEAAAC8AwAAFLwhAAIAAAC9AwAAHLwhAAEAAAC+AwAAILwhAAEAAAC/AwAAJLwhAAEAAADAAwAAKLwhAAIAAADBAwAAMLwhAAIAAADCAwAAOLwhAAIAAADDAwAAQLwhAAIAAADEAwAASLwhAAEAAADFAwAATLwhAAEAAADGAwAAULwhAAIAAADHAwAAWLwhAAEAAADIAwAAXLwhAAEA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AAARHgAAhMchAAEAAAASHgAAiMchAAEAAAATHgAAjMchAAEAAAAUHgAAkMchAAEAAAAVHgAAlMchAAEAAAAWHgAAmMchAAEAAAAXHgAAnMchAAEAAAAYHgAAoMchAAEAAAAZHgAApMchAAEAAAAaHgAAqMchAAEAAAAbHgAArMchAAEAAAAcHgAAsMchAAEAAAAdHgAAtMchAAEAAAAeHgAAuMchAAEAAAAfHgAAvMchAAEAAAAgHgAAwMchAAEAAAAhHgAAxMchAAEAAAAiHgAAyMchAAEAAAAjHgAAzMchAAEAAAAkHgAA0MchAAEAAAAlHgAA1MchAAEAAAAmHgAA2MchAAEAAAAnHgAA3MchAAEAAAAoHgAA4MchAAEAAAApHgAA5MchAAEAAAAqHgAA6MchAAEAAAArHgAA7MchAAEAAAAsHgAA8MchAAEAAAAtHgAA9MchAAEAAAAuHgAA+MchAAEAAAAvHgAA/MchAAEAAAAwHgAAAMghAAEAAAAxHgAABMghAAEAAAAyHgAACMghAAEAAAAzHgAADMghAAEAAAA0HgAAEMghAAEAAAA1HgAAFMghAAEAAAA2HgAAGMghAAEAAAA3HgAAHMghAAEAAAA4HgAAIMghAAEAAAA5HgAAJMghAAEAAAA6HgAAKMghAAEAAAA7HgAALMghAAEAAAA8HgAAMMghAAEAAAA9HgAANMghAAEAAAA+HgAAOMghAAEAAAA/HgAAPMghAAEAAABAHgAAQMghAAEAAABBHgAARMghAAEAAABCHgAASMghAAEAAABDHgAATMghAAEAAABEHgAAUMghAAEAAABFHgAAVMghAAEAAABGHgAAWMghAAEAAABHHgAAXMghAAEAAABIHgAAYMghAAEAAABJHgAAZMghAAEAAABKHgAAaMghAAEAAABLHgAAbMghAAEAAABMHgAAcMghAAEAAABNHgAAdMghAAEAAABOHgAAeMghAAEAAABPHgAAfMghAAEAAABQHgAAgMghAAEAAABRHgAAhMghAAEAAABSHgAAiMghAAEAAABTHgAAjMghAAEAAABUHgAAkMghAAEAAABVHgAAlMghAAEAAABWHgAAmMghAAEAAABXHgAAnMghAAEAAABYHgAAoMghAAEAAABZHgAApMghAAEAAABaHgAAqMghAAEAAABbHgAArMghAAEAAABcHgAAsMghAAEAAABdHgAAtMghAAEAAABeHgAAuMghAAEAAABfHgAAvMghAAEAAABgHgAAwMghAAIAAABhHgAAyMghAAIAAABiHgAA0MghAAEAAABjHgAA1MghAAEAAABkHgAA2MghAAEAAABlHgAA3MghAAEAAABmHgAA4MghAAEAAABnHgAA5MghAAEAAABoHgAA6MghAAEAAABpHgAA7MghAAEAAABqHgAA8MghAAEAAABrHgAA9MghAAEAAABsHgAA+MghAAEAAABtHgAA/MghAAEAAABuHgAAAMkhAAEAAABvHgAABMkhAAEAAABwHgAACMkhAAEAAABxHgAADMkhAAEAAAByHgAAEMkhAAEAAABzHgAAFMkhAAEAAAB0HgAAGMkhAAEAAAB1HgAAHMkhAAEAAAB2HgAAIMkhAAEAAAB3HgAAJMkhAAEAAAB4HgAAKMkhAAEAAAB5HgAALMkhAAEAAAB6HgAAMMkhAAEAAAB7HgAANMkhAAEAAAB8HgAAOMkhAAEAAAB9HgAAPMkhAAEAAAB+HgAAQMkhAAEAAAB/HgAARMkhAAEAAACAHgAASMkhAAEAAACBHgAATMkhAAEAAACCHgAAUMkhAAEAAACDHgAAVMkhAAEAAACEHgAAWMkhAAEAAACFHgAAXMkhAAEAAACGHgAAYMkhAAEAAACHHgAAZMkhAAEAAACIHgAAaMkhAAEAAACJHgAAbMkhAAEAAACKHgAAcMkhAAEAAACLHgAAdMkhAAEAAACMHgAAeMkhAAEAAACNHgAAfMkhAAEAAACOHgAAgMkhAAEAAACPHgAAhMkhAAEAAACQHgAAiMkhAAEAAACRHgAAjMkhAAEAAACSHgAAkMkhAAEAAACTHgAAlMkhAAEAAACUHgAAmMkhAAEAAACVHgAAnMkhAAEAAACbHgAAoMkhAAIAAACeHgAAqMkhAAEAAACgHgAArMkhAAEAAAChHgAAsMkhAAEAAACiHgAAtMkhAAEAAACjHgAAuMkhAAEAAACkHgAAvMkhAAEAAAClHgAAwMkhAAEAAACmHgAAxMkhAAEAAACnHgAAyMkhAAEAAACoHgAAzMkhAAEAAACpHgAA0MkhAAEAAACqHgAA1MkhAAEAAACrHgAA2MkhAAEAAACsHgAA3MkhAAEAAACtHgAA4MkhAAEAAACuHgAA5MkhAAEAAACvHgAA6MkhAAEAAACwHgAA7MkhAAEAAACxHgAA8MkhAAEAAACyHgAA9MkhAAEAAACzHgAA+MkhAAEAAAC0HgAA/MkhAAEAAAC1HgAAAMohAAEAAAC2HgAABMohAAEAAAC3HgAACMohAAEAAAC4HgAADMohAAEAAAC5HgAAEMohAAEAAAC6HgAAFMohAAEAAAC7HgAAGMohAAEAAAC8HgAAHMohAAEAAAC9HgAAIMohAAEAAAC+HgAAJMohAAEAAAC/HgAAKMohAAEAAADAHgAALMohAAEAAADBHgAAMMohAAEAAADCHgAANMohAAEAAADDHgAAOMohAAEAAADEHgAAPMohAAEAAADFHgAAQMohAAEAAADGHgAARMohAAEAAADHHgAASMohAAEAAADIHgAATMohAAEAAADJHgAAUMohAAEAAADKHgAAVMohAAEAAADLHgAAWMohAAEAAADMHgAAXMohAAEAAADNHgAAYMohAAEAAADOHgAAZMohAAEAAADPHgAAaMohAAEAAADQHgAAbMohAAEAAADRHgAAcMohAAEAAADSHgAAdMohAAEAAADTHgAAeMohAAEAAADUHgAAfMohAAEAAADVHgAAgMohAAEAAADWHgAAhMohAAEAAADXHgAAiMohAAEAAADYHgAAjMohAAEAAADZHgAAkMohAAEAAADaHgAAlMohAAEAAADbHgAAmMohAAEAAADcHgAAnMohAAEAAADdHgAAoMohAAEAAADeHgAApMohAAEAAADfHgAAqMohAAEAAADgHgAArMohAAEAAADhHgAAsMohAAEAAADiHgAAtMohAAEAAADjHgAAuMohAAEAAADkHgAAvMohAAEAAADlHgAAwMohAAEAAADmHgAAxMohAAEAAADnHgAAyMohAAEAAADoHgAAzMohAAEAAADpHgAA0MohAAEAAADqHgAA1MohAAEAAADrHgAA2MohAAEAAADsHgAA3MohAAEAAADtHgAA4MohAAEAAADuHgAA5MohAAEAAADvHgAA6MohAAEAAADwHgAA7MohAAEAAADxHgAA8MohAAEAAADyHgAA9MohAAEAAADzHgAA+MohAAEAAAD0HgAA/MohAAEAAAD1HgAAAMshAAEAAAD2HgAABMshAAEAAAD3HgAACMshAAEAAAD4HgAADMshAAEAAAD5HgAAEMshAAEA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AACspwAA6NYhAAEAAACtpwAA7NYhAAEAAACupwAA8NYhAAEAAACwpwAA9NYhAAEAAACxpwAA+NYhAAEAAACypwAA/NYhAAEAAACzpwAAANchAAEAAAC0pwAABNchAAEAAAC1pwAACNchAAEAAAC2pwAADNchAAEAAAC3pwAAENchAAEAAAC4pwAAFNchAAEAAAC5pwAAGNchAAEAAAC6pwAAHNchAAEAAAC7pwAAINchAAEAAAC8pwAAJNchAAEAAAC9pwAAKNchAAEAAAC+pwAALNchAAEAAAC/pwAAMNchAAEAAADApwAANNchAAEAAADBpwAAONchAAEAAADCpwAAPNchAAEAAADDpwAAQNchAAEAAADEpwAARNchAAEAAADFpwAASNchAAEAAADGpwAATNchAAEAAADHpwAAUNchAAEAAADIpwAAVNchAAEAAADJpwAAWNchAAEAAADKpwAAXNchAAEAAADQpwAAYNchAAEAAADRpwAAZNchAAEAAADWpwAAaNchAAEAAADXpwAAbNchAAEAAADYpwAAcNchAAEAAADZpwAAdNchAAEAAAD1pwAAeNchAAEAAAD2pwAAfNchAAEAAABTqwAAgNchAAEAAABwqwAAhNchAAEAAABxqwAAiNchAAEAAAByqwAAjNchAAEAAABzqwAAkNchAAEAAAB0qwAAlNchAAEAAAB1qwAAmNchAAEAAAB2qwAAnNchAAEAAAB3qwAAoNchAAEAAAB4qwAApNchAAEAAAB5qwAAqNchAAEAAAB6qwAArNchAAEAAAB7qwAAsNchAAEAAAB8qwAAtNchAAEAAAB9qwAAuNchAAEAAAB+qwAAvNchAAEAAAB/qwAAwNchAAEAAACAqwAAxNchAAEAAACBqwAAyNchAAEAAACCqwAAzNchAAEAAACDqwAA0NchAAEAAACEqwAA1NchAAEAAACFqwAA2NchAAEAAACGqwAA3NchAAEAAACHqwAA4NchAAEAAACIqwAA5NchAAEAAACJqwAA6NchAAEAAACKqwAA7NchAAEAAACLqwAA8NchAAEAAACMqwAA9NchAAEAAACNqwAA+NchAAEAAACOqwAA/NchAAEAAACPqwAAANghAAEAAACQqwAABNghAAEAAACRqwAACNghAAEAAACSqwAADNghAAEAAACTqwAAENghAAEAAACUqwAAFNghAAEAAACVqwAAGNghAAEAAACWqwAAHNghAAEAAACXqwAAINghAAEAAACYqwAAJNghAAEAAACZqwAAKNghAAEAAACaqwAALNghAAEAAACbqwAAMNghAAEAAACcqwAANNghAAEAAACdqwAAONghAAEAAACeqwAAPNghAAEAAACfqwAAQNghAAEAAACgqwAARNghAAEAAAChqwAASNghAAEAAACiqwAATNghAAEAAACjqwAAUNghAAEAAACkqwAAVNghAAEAAAClqwAAWNghAAEAAACmqwAAXNghAAEAAACnqwAAYNghAAEAAACoqwAAZNghAAEAAACpqwAAaNghAAEAAACqqwAAbNghAAEAAACrqwAAcNghAAEAAACsqwAAdNghAAEAAACtqwAAeNghAAEAAACuqwAAfNghAAEAAACvqwAAgNghAAEAAACwqwAAhNghAAEAAACxqwAAiNghAAEAAACyqwAAjNghAAEAAACzqwAAkNghAAEAAAC0qwAAlNghAAEAAAC1qwAAmNghAAEAAAC2qwAAnNghAAEAAAC3qwAAoNghAAEAAAC4qwAApNghAAEAAAC5qwAAqNghAAEAAAC6qwAArNghAAEAAAC7qwAAsNghAAEAAAC8qwAAtNghAAEAAAC9qwAAuNghAAEAAAC+qwAAvNghAAEAAAC/qwAAwNghAAEAAAAh/wAAxNghAAEAAAAi/wAAyNghAAEAAAAj/wAAzNghAAEAAAAk/wAA0NghAAEAAAAl/wAA1NghAAEAAAAm/wAA2NghAAEAAAAn/wAA3NghAAEAAAAo/wAA4NghAAEAAAAp/wAA5NghAAEAAAAq/wAA6NghAAEAAAAr/wAA7NghAAEAAAAs/wAA8NghAAEAAAAt/wAA9NghAAEAAAAu/wAA+NghAAEAAAAv/wAA/NghAAEAAAAw/wAAANkhAAEAAAAx/wAABNkhAAEAAAAy/wAACNkhAAEAAAAz/wAADNkhAAEAAAA0/wAAENkhAAEAAAA1/wAAFNkhAAEAAAA2/wAAGNkhAAEAAAA3/wAAHNkhAAEAAAA4/wAAINkhAAEAAAA5/wAAJNkhAAEAAAA6/wAAKNkhAAEAAABB/wAALNkhAAEAAABC/wAAMNkhAAEAAABD/wAANNkhAAEAAABE/wAAONkhAAEAAABF/wAAPNkhAAEAAABG/wAAQNkhAAEAAABH/wAARNkhAAEAAABI/wAASNkhAAEAAABJ/wAATNkhAAEAAABK/wAAUNkhAAEAAABL/wAAVNkhAAEAAABM/wAAWNkhAAEAAABN/wAAXNkhAAEAAABO/wAAYNkhAAEAAABP/wAAZNkhAAEAAABQ/wAAaNkhAAEAAABR/wAAbNkhAAEAAABS/wAAcNkhAAEAAABT/wAAdNkhAAEAAABU/wAAeNkhAAEAAABV/wAAfNkhAAEAAABW/wAAgNkhAAEAAABX/wAAhNkhAAEAAABY/wAAiNkhAAEAAABZ/wAAjNkhAAEAAABa/wAAkNkhAAEAAAAABAEAlNkhAAEAAAABBAEAmNkhAAEAAAACBAEAnNkhAAEAAAADBAEAoNkhAAEAAAAEBAEApNkhAAEAAAAFBAEAqNkhAAEAAAAGBAEArNkhAAEAAAAHBAEAsNkhAAEAAAAIBAEAtNkhAAEAAAAJBAEAuNkhAAEAAAAKBAEAvNkhAAEAAAALBAEAwNkhAAEAAAAMBAEAxNkhAAEAAAANBAEAyNkhAAEAAAAOBAEAzNkhAAEAAAAPBAEA0NkhAAEAAAAQBAEA1NkhAAEAAAARBAEA2NkhAAEAAAASBAEA3NkhAAEAAAATBAEA4NkhAAEAAAAUBAEA5NkhAAEAAAAVBAEA6NkhAAEAAAAWBAEA7NkhAAEAAAAXBAEA8NkhAAEAAAAYBAEA9NkhAAEAAAAZBAEA+NkhAAEAAAAaBAEA/NkhAAEAAAAbBAEAANohAAEAAAAcBAEABNohAAEAAAAdBAEACNohAAEAAAAeBAEADNohAAEAAAAfBAEAENohAAEAAAAgBAEAFNohAAEAAAAhBAEAGNohAAEAAAAiBAEAHNohAAEAAAAjBAEAINohAAEAAAAkBAEAJNohAAEAAAAlBAEAKNohAAEAAAAmBAEALNohAAEAAAAnBAEAMNohAAEAAAAoBAEANNohAAEAAAApBAEAONohAAEAAAAqBAEAPNohAAEAAAArBAEAQNohAAEAAAAsBAEARNohAAEAAAAtBAEASNohAAEAAAAuBAEATNohAAEAAAAvBAEAUNohAAEAAAAwBAEAVNohAAEAAAAxBAEAWNohAAEAAAAyBAEAXNohAAEAAAAzBAEAYNohAAEAAAA0BAEAZNohAAEAAAA1BAEAaNohAAEAAAA2BAEAbNohAAEAAAA3BAEAcNohAAEAAAA4BAEAdNohAAEAAAA5BAEAeNohAAEAAAA6BAEAfNohAAEAAAA7BAEAgNohAAEAAAA8BAEAhNohAAEAAAA9BAEAiNohAAEAAAA+BAEAjNohAAEAAAA/BAEAkNohAAEAAABABAEAlNohAAEAAABBBAEAmNohAAEAAABCBAEAnNohAAEAAABDBAEAoNohAAEAAABEBAEApNohAAEAAABFBAEAqNohAAEAAABGBAEArNohAAEAAABHBAEAsNohAAEAAABIBAEAtNohAAEAAABJBAEAuNohAAEAAABKBAEAvNohAAEAAABLBAEAwNohAAEAAABMBAEAxNohAAEAAABNBAEAyNohAAEAAABOBAEAzNohAAEAAABPBAEA0NohAAEAAACwBAEA1NohAAEAAACxBAEA2NohAAEAAACyBAEA3NohAAEAAACzBAEA4NohAAEAAAC0BAEA5NohAAEAAAC1BAEA6NohAAEAAAC2BAEA7NohAAEAAAC3BAEA8NohAAEAAAC4BAEA9NohAAEAAAC5BAEA+NohAAEAAAC6BAEA/NohAAEAAAC7BAEAANshAAEAAAC8BAEABNshAAEAAAC9BAEACNshAAEAAAC+BAEADNshAAEAAAC/BAEAENshAAEAAADABAEAFNshAAEAAADBBAEAGNshAAEAAADCBAEAHNshAAEAAADDBAEAINshAAEAAADEBAEAJNshAAEAAADFBAEAKNshAAEAAADGBAEALNshAAEAAADHBAEAMNshAAEAAADIBAEANNshAAEAAADJBAEAONshAAEAAADKBAEAPNshAAEAAADLBAEAQNshAAEAAADMBAEARNshAAEAAADNBAEASNshAAEAAADOBAEATNshAAEAAADPBAEAUNshAAEAAADQBAEAVNshAAEAAADRBAEAWNshAAEAAADSBAEAXNshAAEAAADTBAEAYNshAAEAAADYBAEAZNshAAEAAADZBAEAaNshAAEAAADaBAEAbNshAAEAAADbBAEAcNshAAEAAADcBAEAdNshAAEAAADdBAEAeNshAAEAAADeBAEAfNshAAEAAADfBAEAgNshAAEAAADgBAEAhNshAAEAAADhBAEAiNshAAEAAADiBAEAjNshAAEAAADjBAEAkNshAAEAAADkBAEAlNshAAEA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Y3RlZCBleHByIG9yIGFsdCwgZ290IGNvbmNhdCBtYXJrZXIAAADdOSAAbAAAABQDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBhbHQgYnJhbmNoIG1hcmtlcgAAAN05IABsAAAAFwMAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IFVuaWNvZGUgY2xhc3PdOSAAbAAAAOkCAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBieXRlIGNsYXNzAAAA3TkgAGwAAADsAgAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgY29uY2F0LCBnb3QgcmVwZXRpdGlvbgAAAN05IABsAAAA7wIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IGdyb3Vw3TkgAGwAAADyAgAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgY29uY2F0LCBnb3QgYWx0IG1hcmtlcgAAAN05IABsAAAA9QIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IGFsdCBicmFuY2ggbWFya2Vy3TkgAGwAAAD4AgAAEQAAAAxhc3NlcnRpb24gZmFpbGVkOiAhc2VsZi5mbGFncygpLnVuaWNvZGUoKQAA3TkgAGwAAABZBAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuZmxhZ3MoKS51bmljb2RlKCndOSAAbAAAAEMEAAAJAAAA3TkgAGwAAADbAgAAHAAAAN05IABsAAAAuAIAABwAAADdOSAAbAAAANECAAAsAAAA3TkgAGwAAADDAgAALAAAAKo6IABoAAAAAAkAADAAAACnISAAZAAAAN0AAAAiAAAApyEgAGQAAAD4AAAAPwAAAKchIABkAAAAuwAAABkAAADPUCAAYwAAALQBAAAtAAAAz1AgAGMAAAC1AQAAKwAAAM9QIABjAAAAuAEAAAkAAACNMiAAagAAAN4IAAAoAAAAjTIgAGoAAADyCAAAFQAAAI0yIABqAAAA4ggAAB4AAACNMiAAagAAAOUIAAA0AAAAjTIgAGoAAADrCAAAIAAAAI0yIABqAAAA6wgAAC0AAACNMiAAagAAAM4IAAAVAAAA3EMgAGYAAAA6BgAANgAAAB5CIABmAAAA8wQAACMAAADcQyAAZgAAAPkLAAAtAAAA3EMgAGYAAAD3CwAAEgAAANxDIABmAAAA6AsAABkAAAAcOCAAZAAAAGgAAAArAAAAGT8gAGYAAAD9AQAAQAAAAEFTQ0lJQXNzaWduZWRBbnkZPyAAZgAAAAYCAAAuAAAAGT8gAGYAAAB3AwAAHAAAABk/IABmAAAAqgMAAAkAAAAZPyAAZgAAAKsDAAAJAAAAGT8gAGYAAACuAwAADwAAABk/IABmAAAAoAMAAA0AAAAZPyAAZgAAAJ0DAAANAAAAHQ4gAE8AAAD8AwAAMwAAADc0MzIxMC8uLWfyQkPlLCsqKSgnJiUkIyIhOCAfHh0c/5SklYigm63d3oZ66MrX4NDczLu3s7Gossjiw5q4rn54v53Cqr2ioZbBjomrsLmnunCvwLycjI97hYCTipJy35f52O7s/ePa5veHtPHp9vTni/Xz++vJxPDWmLbNtX8b1NPS1eTFqZ+DrGlQYmBhUc+RdHOQgpl5a4RtbnxvUmx2jXGBd32ldVxqU0hjXUFPpu2jx77h0cvG2dvO6vie7/////////////////////////////////////////////////////////////////////////////////////8wOUFaYXpBWmF6AH8JCSAgAB9/fzA5IX5heiB+IS86QFtge34JCQoKCwsMDA0NICBBWjA5QVpfX2F6MDlBRmFmMAAAADkAAABgBgAAaQYAAPAGAAD5BgAAwAcAAMkHAABmCQAAbwkAAOYJAADvCQAAZgoAAG8KAADmCgAA7woAAGYL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AADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAgB8AAK8fAACyHwAAtB8AALcfAAC8HwAAwh8AAMQfAADHHwAAzB8AANgfAADbHwAA6B8AAOwfAADyHwAA9B8AAPcfAAD8HwAAJiEAACYhAAAqIQAAKyEAADIhAAAyIQAAYCEAAG8hAACDIQAAgyEAALYkAADPJAAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKnAABEpwAARKcAAEanAABGpwAASKcAAEinAABKpwAASqcAAEynAABMpwAATqcAAE6nAABQpwAAUKcAAFKnAABSpwAAVKcAAFSnAABWpwAAVqcAAFinAABYpwAAWqcAAFqnAABcpwAAXKcAAF6nAABepwAAYKcAAGCnAABipwAAYqcAAGSnAABkpwAAZqcAAGanAABopwAAaKcAAGqnAABqpwAAbKcAAGynAABupwAAbqcAAHmnAAB5pwAAe6cAAHunAAB9pwAAfqcAAICnAACApwAAgqcAAIKnAACEpwAAhKcAAIanAACGpwAAi6cAAIunAACNpwAAjacAAJCnAACQpwAAkqcAAJKnAACWpwAAlqcAAJinAACYpwAAmqcAAJqnAACcpwAAnKcAAJ6nAACepwAAoKcAAKCnAACipwAAoqcAAKSnAACkpwAApqcAAKanAACopwAAqKcAAKqnAACupwAAsKcAALSnAAC2pwAAtqcAALinAAC4pwAAuqcAALqnAAC8pwAAvKcAAL6nAAC+pwAAwKcAAMCnAADCpwAAwqcAAMSnAADHpwAAyacAAMmnAADQpwAA0KcAANanAADWpwAA2KcAANinAAD1pwAA9acAAHCrAAC/qwAAAPsAAAb7AAAT+wAAF/sAACH/AAA6/wAAAAQBACcEAQCwBAEA0wQBAHAFAQB6BQEAfAUBAIoFAQCMBQEAkgUBAJQFAQCVBQEAgAwBALIMAQCgGAEAvxgBAEBuAQBfbgEAAOkBACHpAQBBAAAAWgAAAGEAAAB6AAAAtQAAALUA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AABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAiB8AAI8fAACYHwAAnx8AAKgfAACvHwAAuB8AALwfAADIHwAAzB8AANgfAADbHwAA6B8AAOwfAAD4HwAA/B8AACYhAAAmIQAAKiEAACshAAAyIQAAMiEAAGAhAABvIQAAgyEAAIMhAAC2JAAAzyQAAAAsAAAvLAAAYCwAAGAsAABiLAAAZCwAAGcsAABnLAAAaSwAAGksAABrLAAAaywAAG0sAABwLAAAciwAAHIsAAB1LAAAdSwAAH4sAACALAAAgiwAAIIsAACELAAAhCwAAIYsAACGLAAAiCwAAIgsAACKLAAAiiwAAIwsAACMLAAAjiwAAI4sAACQLAAAkCwAAJIsAACSLAAAlCwAAJQsAACWLAAAliwAAJgsAACYLAAAmiwAAJosAACcLAAAnCwAAJ4sAACeLAAAoCwAAKAsAACiLAAAoiwAAKQsAACkLAAApiwAAKYsAACoLAAAqCwAAKosAACqLAAArCwAAKwsAACuLAAAriwAALAsAACwLAAAsiwAALIsAAC0LAAAtCwAALYsAAC2LAAAuCwAALgsAAC6LAAAuiwAALwsAAC8LAAAviwAAL4sAADALAAAwCwAAMIsAADCLAAAxCwAAMQsAADGLAAAxiwAAMgsAADILAAAyiwAAMosAADMLAAAzCwAAM4sAADOLAAA0CwAANAsAADSLAAA0iwAANQsAADULAAA1iwAANYsAADYLAAA2CwAANosAADaLAAA3CwAANwsAADeLAAA3iwAAOAsAADgLAAA4iwAAOIsAADrLAAA6ywAAO0sAADtLAAA8iwAAPIsAABApgAAQKYAAEKmAABCpgAARKYAAESmAABGpgAARqYAAEimAABIpgAASqYAAEqmAABMpgAATKYAAE6mAABOpgAAUKYAAFCmAABSpgAAUqYAAFSmAABUpgAAVqYAAFamAABYpgAAWKYAAFqmAABapgAAXKYAAFymAABepgAAXqYAAGCmAABgpgAAYqYAAGKmAABkpgAAZKYAAGamAABmpgAAaKYAAGimAABqpgAAaqYAAGymAABspgAAgKYAAICmAACCpgAAgqYAAISmAACEpgAAhqYAAIamAACIpgAAiKYAAIqmAACKpgAAjKYAAIymAACOpgAAjqYAAJCmAACQpgAAkqYAAJKmAACUpgAAlKYAAJamAACWpgAAmKYAAJimAACapgAAmqYAACKnAAAipwAAJKcAACSnAAAmpwAAJqcAACinAAAopwAAKqcAACqnAAAspwAALKcAAC6nAAAupwAAMqcAADKnAAA0pwAANKcAADanAAA2pwAAOKcAADinAAA6pwAAOqcAADynAAA8pwAAPqcAAD6nAABApwAAQKcAAEKnAABCpwAARKcAAESnAABGpwAARqcAAEinAABIpwAASqcAAEqnAABMpwAATKcAAE6nAABOpwAAUKcAAFCn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AADNHgAAzR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAhx8AAJAfAACXHwAAoB8AAKcfAACwHwAAtB8AALYfAAC3HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAE4hAABOIQAAcCEAAH8hAACEIQAAhCEAANAkAADpJAAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcywAAHMsAAB2LAAAdiwAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOMsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAm6YAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAvpwAAM6cAADOnAAA1pwAANacAADenAAA3pwAAOacAADmnAAA7pwAAO6cAAD2nAAA9pwAAP6cAAD+nAABBpwAAQacAAEOnAABDpwAARacAAEWnAABHpwAAR6cAAEmnAABJpwAAS6cAAEunAABNpwAATacAAE+nAABPpwAAUacAAFGnAABTpwAAU6cAAFWnAABVpwAAV6cAAFenAABZpwAAWacAAFunAABbpwAAXacAAF2nAABfpwAAX6cAAGGnAABhpwAAY6cAAGOnAABlpwAAZacAAGenAABnpwAAaacAAGmnAABrpwAAa6cAAG2nAABtpwAAb6cAAG+nAAB6pwAAeqcAAHynAAB8pwAAf6cAAH+nAACBpwAAgacAAIOnAACDpwAAhacAAIWnAACHpwAAh6cAAIynAACMpwAAkacAAJGnAACTpwAAlKcAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAtacAALWnAAC3pwAAt6cAALmnAAC5pwAAu6cAALunAAC9pwAAvacAAL+nAAC/pwAAwacAAMGnAADDpwAAw6cAAMinAADIpwAAyqcAAMqnAADRpwAA0acAANenAADXpwAA2acAANmnAAD2pwAA9qcAAFOrAABTqwAAcKsAAL+r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AABBHgAAQx4AAEMeAABFHgAARR4AAEceAABHHgAASR4AAEkeAABLHgAASx4AAE0eAABNHgAATx4AAE8eAABRHgAAUR4AAFMeAABTHgAAVR4AAFUeAABXHgAAVx4AAFkeAABZHgAAWx4AAFseAABdHgAAXR4AAF8eAABfHgAAYR4AAGEeAABjHgAAYx4AAGUeAABlHgAAZx4AAGceAABpHgAAaR4AAGseAABrHgAAbR4AAG0eAABvHgAAbx4AAHEeAABxHgAAcx4AAHMeAAB1HgAAdR4AAHceAAB3HgAAeR4AAHkeAAB7HgAAex4AAH0eAAB9HgAAfx4AAH8eAACBHgAAgR4AAIMeAACDHgAAhR4AAIUeAACHHgAAhx4AAIkeAACJHgAAix4AAIseAACNHgAAjR4AAI8eAACPHgAAkR4AAJEeAACTHgAAkx4AAJUeAACbHgAAoR4AAKEeAACjHgAAox4AAKUeAAClHgAApx4AAKceAACpHgAAqR4AAKseAACrHgAArR4AAK0eAACvHgAArx4AALEeAACxHgAAsx4AALMeAAC1HgAAtR4AALceAAC3HgAAuR4AALkeAAC7HgAAux4AAL0eAAC9HgAAvx4AAL8eAADBHgAAwR4AAMMeAADDHgAAxR4AAMUeAADHHgAAxx4AAMkeAADJHgAAyx4AAMseAADNHgAAzR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAtB8AALYfAAC3HwAAvB8AALwfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMcfAADMHwAAzB8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAAD8HwAA/B8AAE4hAABOIQAAcCEAAH8hAACEIQAAhCEAANAkAADpJAAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcywAAHMsAAB2LAAAdiwAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOMsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAm6YAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAvpwAAM6cAADOnAAA1pwAANacAADen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AACqJQAAqyUAALYlAAC2JQAAwCUAAMAlAAD7JQAA/iUAAAAmAAAEJgAADiYAAA4mAAARJgAAESYAABQmAAAVJgAAGCYAABgmAAAdJgAAHSYAACAmAAAgJgAAIiYAACMmAAAmJgAAJiYAAComAAAqJgAALiYAAC8mAAA4JgAAOiYAAEAmAABAJgAAQiYAAEImAABIJgAAUyYAAF8mAABgJgAAYyYAAGMmAABlJgAAZiYAAGgmAABoJgAAeyYAAHsmAAB+JgAAfyYAAJImAACXJgAAmSYAAJkmAACbJgAAnCYAAKAmAAChJgAApyYAAKcmAACqJgAAqyYAALAmAACxJgAAvSYAAL4mAADEJgAAxSYAAMgmAADIJgAAziYAAM8mAADRJgAA0SYAANMmAADUJgAA6SYAAOomAADwJgAA9SYAAPcmAAD6JgAA/SYAAP0mAAACJwAAAicAAAUnAAAFJwAACCcAAA0nAAAPJwAADycAABInAAASJwAAFCcAABQnAAAWJwAAFicAAB0nAAAdJwAAIScAACEnAAAoJwAAKCcAADMnAAA0JwAARCcAAEQnAABHJwAARycAAEwnAABMJwAATicAAE4nAABTJwAAVScAAFcnAABXJwAAYycAAGQnAACVJwAAlycAAKEnAAChJwAAsCcAALAnAAC/JwAAvycAADQpAAA1KQAABSsAAAcrAAAbKwAAHCsAAFArAABQKwAAVSsAAFUrAAAwMAAAMDAAAD0wAAA9MAAAlzIAAJcyAACZMgAAmTIAAATwAQAE8AEAz/ABAM/wAQBw8QEAcfEBAH7xAQB/8QEAjvEBAI7xAQCR8QEAmvEBAObxAQD/8QEAAfIBAALyAQAa8gEAGvIBAC/yAQAv8gEAMvIBADryAQBQ8gEAUfIBAADzAQAh8wEAJPMBAJPzAQCW8wEAl/MBAJnzAQCb8wEAnvMBAPDzAQDz8wEA9fMBAPfzAQD99AEA//QBAD31AQBJ9QEATvUBAFD1AQBn9QEAb/UBAHD1AQBz9QEAevUBAIf1AQCH9QEAivUBAI31AQCQ9QEAkPUBAJX1AQCW9QEApPUBAKX1AQCo9QEAqPUBALH1AQCy9QEAvPUBALz1AQDC9QEAxPUBANH1AQDT9QEA3PUBAN71AQDh9QEA4fUBAOP1AQDj9QEA6PUBAOj1AQDv9QEA7/UBAPP1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AACIAwAAigMAAIwDAACMAwAAjgMAAKEDAACjAwAA9QMAAPcDAACBBAAAigQAAC8FAAAxBQAAVgUAAFkFAABZBQAAYAUAAIgFAADQBQAA6gUAAO8FAADyBQAAIAYAAEoGAABuBgAAbwYAAHEGAADTBgAA1QYAANUGAADlBgAA5gYAAO4GAADvBgAA+gYAAPwGAAD/BgAA/wYAABAHAAAQBwAAEgcAAC8HAABNBwAApQcAALEHAACxBwAAygcAAOoHAAD0BwAA9QcAAPoHAAD6BwAAAAgAABUIAAAaCAAAGggAACQIAAAkCAAAKAgAACgIAABACAAAWAgAAGAIAABqCAAAcAgAAIcIAACJCAAAjggAAKAIAADJCAAABAkAADkJAAA9CQAAPQkAAFAJAABQCQAAWAkAAGEJAABxCQAAgAkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAAL0JAAC9CQAAzgkAAM4JAADcCQAA3QkAAN8JAADhCQAA8AkAAPEJAAD8CQAA/AkAAAUKAAAKCgAADwoAABAKAAATCgAAKAoAACoKAAAwCgAAMgoAADMKAAA1CgAANgoAADgKAAA5CgAAWQoAAFwKAABeCgAAXgoAAHIKAAB0CgAAhQoAAI0KAACPCgAAkQoAAJMKAACoCgAAqgoAALAKAACyCgAAswoAALUKAAC5CgAAvQoAAL0KAADQCgAA0AoAAOAKAADhCgAA+QoAAPkKAAAFCwAADAsAAA8LAAAQCwAAEwsAACgLAAAqCwAAMAsAADILAAAzCwAANQsAADkLAAA9CwAAPQsAAFwLAABdCwAAXwsAAGELAABxCwAAcQsAAIMLAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAA0AsAANALAAAFDAAADAwAAA4MAAAQDAAAEgwAACgMAAAqDAAAOQwAAD0MAAA9DAAAWAwAAFoMAABdDAAAXQwAAGAMAABhDAAAgAwAAIAMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvQwAAL0MAADdDAAA3gwAAOAMAADhDAAA8QwAAPIMAAAEDQAADA0AAA4N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AAB9HgAAfx4AAH8eAACBHgAAgR4AAIMeAACDHgAAhR4AAIUeAACHHgAAhx4AAIkeAACJHgAAix4AAIseAACNHgAAjR4AAI8eAACPHgAAkR4AAJEeAACTHgAAkx4AAJUeAACdHgAAnx4AAJ8eAAChHgAAoR4AAKMeAACjHgAApR4AAKUeAACnHgAApx4AAKkeAACpHgAAqx4AAKseAACtHgAArR4AAK8eAACvHgAAsR4AALEeAACzHgAAsx4AALUeAAC1HgAAtx4AALceAAC5HgAAuR4AALseAAC7HgAAvR4AAL0eAAC/HgAAvx4AAMEeAADBHgAAwx4AAMMeAADFHgAAxR4AAMceAADHHgAAyR4AAMkeAADLHgAAyx4AAM0eAADNHgAAzx4AAM8eAADRHgAA0R4AANMeAADTHgAA1R4AANUeAADXHgAA1x4AANkeAADZHgAA2x4AANseAADdHgAA3R4AAN8eAADfHgAA4R4AAOEeAADjHgAA4x4AAOUeAADlHgAA5x4AAOceAADpHgAA6R4AAOseAADrHgAA7R4AAO0eAADvHgAA7x4AAPEeAADxHgAA8x4AAPMeAAD1HgAA9R4AAPceAAD3HgAA+R4AAPkeAAD7HgAA+x4AAP0eAAD9HgAA/x4AAAcfAAAQHwAAFR8AACAfAAAnHwAAMB8AADcfAABAHwAARR8AAFAfAABXHwAAYB8AAGcfAABwHwAAfR8AAIAfAACHHwAAkB8AAJcfAACgHwAApx8AALAfAAC0HwAAth8AALcfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMcfAADQHwAA0x8AANYfAADXHwAA4B8AAOcfAADyHwAA9B8AAPYfAAD3HwAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAACiEAAAohAAAOIQAADyEAABMhAAATIQAALyEAAC8hAAA0IQAANCEAADkhAAA5IQAAPCEAAD0hAABGIQAASSEAAE4hAABOIQAAcCEAAH8hAACEIQAAhCEAANAkAADpJAAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcSwAAHEsAABzLAAAdCwAAHYsAAB9LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA5CwAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACdpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAADGnAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABTpwAAVacAAFWnAABXpwAAV6cAAFmn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AACEHgAAhh4AAIYeAACIHgAAiB4AAIoeAACKHgAAjB4AAIweAACOHgAAjh4AAJAeAACQHgAAkh4AAJIeAACUHgAAlB4AAJ4eAACeHgAAoB4AAKAeAACiHgAAoh4AAKQeAACkHgAAph4AAKYeAACoHgAAqB4AAKoeAACqHgAArB4AAKweAACuHgAArh4AALAeAACwHgAAsh4AALIeAAC0HgAAtB4AALYeAAC2HgAAuB4AALgeAAC6HgAAuh4AALweAAC8HgAAvh4AAL4eAADAHgAAwB4AAMIeAADCHgAAxB4AAMQeAADGHgAAxh4AAMgeAADIHgAAyh4AAMoeAADMHgAAzB4AAM4eAADOHgAA0B4AANAeAADSHgAA0h4AANQeAADUHgAA1h4AANYeAADYHgAA2B4AANoeAADaHgAA3B4AANweAADeHgAA3h4AAOAeAADgHgAA4h4AAOIeAADkHgAA5B4AAOYeAADmHgAA6B4AAOgeAADqHgAA6h4AAOweAADsHgAA7h4AAO4eAADwHgAA8B4AAPIeAADyHgAA9B4AAPQeAAD2HgAA9h4AAPgeAAD4HgAA+h4AAPoeAAD8HgAA/B4AAP4eAAD+HgAACB8AAA8fAAAYHwAAHR8AACgfAAAvHwAAOB8AAD8fAABIHwAATR8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAABfHwAAaB8AAG8fAAC4HwAAux8AAMgfAADLHwAA2B8AANsfAADoHwAA7B8AAPgfAAD7HwAAAiEAAAIhAAAHIQAAByEAAAshAAANIQAAECEAABIhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAAC0hAAAwIQAAMyEAAD4hAAA/IQAARSEAAEUhAABgIQAAbyEAAIMhAACDIQAAtiQAAM8kAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6n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AACpHgAAqR4AAKseAACrHgAArR4AAK0eAACvHgAArx4AALEeAACxHgAAsx4AALMeAAC1HgAAtR4AALceAAC3HgAAuR4AALkeAAC7HgAAux4AAL0eAAC9HgAAvx4AAL8eAADBHgAAwR4AAMMeAADDHgAAxR4AAMUeAADHHgAAxx4AAMkeAADJHgAAyx4AAMseAADNHgAAzR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAhx8AAJAfAACXHwAAoB8AAKcfAACwHwAAtB8AALYfAAC3HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAAAohAAAKIQAADiEAAA8hAAATIQAAEyEAAC8hAAAvIQAANCEAADQhAAA5IQAAOSEAADwhAAA9IQAARiEAAEkhAABOIQAATiEAAHAhAAB/IQAAhCEAAIQhAADQJAAA6SQAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHEsAABxLAAAcywAAHQsAAB2LAAAfSwAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOQsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAnaYAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAxpwAAM6cAADOnAAA1pwAANacAADenAAA3pwAAOacAADmnAAA7pwAAO6cAAD2nAAA9pwAAP6cAAD+nAABBpwAAQacAAEOnAABDpwAARacAAEWnAABHpwAAR6cAAEmnAABJpwAAS6cAAEunAABNpwAATacAAE+nAABPpwAAUacAAFGnAABTpwAAU6cAAFWnAABVpwAAV6cAAFenAABZpwAAWacAAFunAABbpwAAXacAAF2nAABfpwAAX6cAAGGnAABhpwAAY6cAAGOnAABlpwAAZacAAGenAABnpwAAaacAAGmnAABrpwAAa6cAAG2nAABtpwAAb6cAAHinAAB6pwAAeqcAAHynAAB8pwAAf6cAAH+nAACBpwAAgacAAIOnAACDpwAAhacAAIWn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AABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAiB8AAI8fAACYHwAAnx8AAKgfAACvHwAAuB8AALwfAADIHwAAzB8AANgfAADbHwAA6B8AAOwfAAD4HwAA/B8AAAIhAAACIQAAByEAAAchAAALIQAADSEAABAhAAASIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAAMCEAADMhAAA+IQAAPyEAAEUhAABFIQAAYCEAAG8hAACDIQAAgyEAALYkAADPJAAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKn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AABcCwAAXQsAAF8LAABhCwAAcQsAAHELAACDCwAAgwsAAIULAACKCwAAjgsAAJALAACSCwAAlQsAAJkLAACaCwAAnAsAAJwLAACeCwAAnwsAAKMLAACkCwAAqAsAAKoLAACuCwAAuQsAANALAADQCwAABQwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA9DAAAPQwAAFgMAABaDAAAXQwAAF0MAABgDAAAYQwAAIAMAACADAAAhQwAAIwMAACODAAAkAwAAJIMAACoDAAAqgwAALMMAAC1DAAAuQwAAL0MAAC9DAAA3QwAAN4MAADgDAAA4QwAAPEMAADyDAAABA0AAAwNAAAODQAAEA0AABINAAA6DQAAPQ0AAD0NAABODQAATg0AAFQNAABWDQAAXw0AAGENAAB6DQAAfw0AAIUNAACWDQAAmg0AALENAACzDQAAuw0AAL0NAAC9DQAAwA0AAMYNAAAADwAAAA8AAEAPAABHDwAASQ8AAGwPAACIDwAAjA8AAKAQAADFEAAAxxAAAMcQAADNEAAAzRAAANAQAAD6EAAA/BAAAEgSAABKEgAATRIAAFASAABWEgAAWBIAAFgSAABaEgAAXRIAAGASAACIEgAAihIAAI0SAACQEgAAsBIAALISAAC1EgAAuBIAAL4SAADAEgAAwBIAAMISAADFEgAAyBIAANYSAADYEgAAEBMAABITAAAVEwAAGBMAAFoTAACAEwAAjxMAAKATAAD1EwAA+BMAAP0TAAABFAAAbBYAAG8WAAB/FgAAgRYAAJoWAACgFgAA6hYAAO4WAAD4FgAAABcAABEXAAAfFwAAMRcAAEAXAABRFwAAYBcAAGwXAABuFwAAcBcAACAYAAB4GAAAgBgAAIQYAACHGAAAqBgAAKoYAACqGAAAsBgAAPUYAAAAGQAAHhkAAAAaAAAWGgAABRsAADMbAABFGwAATBsAAIMbAACgGwAArhsAAK8bAAC6GwAA5RsAAAAcAAAjHAAATRwAAE8cAABaHAAAfRwAAIAcAACIHAAAkBwAALocAAC9HAAAvxwAAOkcAADsHAAA7hwAAPMcAAD1HAAA9hwAAPocAAD6HAAAAB0AAL8dAAAAHgAAFR8AABgfAAAdHwAAIB8AAEUfAABIHwAATR8AAFAfAABXHwAAWR8AAFkfAABbHwAAWx8AAF0f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AQB70QEAgtEBAIXRAQCL0QEAqtEBAK3RAQBC0gEARNIBAADaAQA22gEAO9oBAGzaAQB12gEAddoBAITaAQCE2gEAm9oBAJ/aAQCh2gEAr9oBAADgAQAG4AEACOABABjgAQAb4AEAIeABACPgAQAk4AEAJuABACrgAQCP4AEAj+ABADDhAQA24QEAruIBAK7iAQDs4gEA7+IBAOzkAQDv5AEA0OgBANboAQBE6QEASukBAPvzAQD/8wEAIAAOAH8ADgAAAQ4A7wEOAAARAABfEQAAYKkAAHypAAAArAAAAKwAABysAAAcrAAAOKwAADisAABUrAAAVKwAAHCsAABwrAAAjKwAAIysAACorAAAqKwAAMSsAADErAAA4KwAAOCsAAD8rAAA/KwAABitAAAYrQAANK0AADStAABQrQAAUK0AAGytAABsrQAAiK0AAIitAACkrQAApK0AAMCtAADArQAA3K0AANytAAD4rQAA+K0AABSuAAAUrgAAMK4AADCuAABMrgAATK4AAGiuAABorgAAhK4AAISuAACgrgAAoK4AALyuAAC8rgAA2K4AANiuAAD0rgAA9K4AABCvAAAQrwAALK8AACyvAABIrwAASK8AAGSvAABkrwAAgK8AAICvAACcrwAAnK8AALivAAC4rwAA1K8AANSvAADwrwAA8K8AAAywAAAMsAAAKLAAACiwAABEsAAARLAAAGCwAABgsAAAfLAAAHywAACYsAAAmLAAALSwAAC0sAAA0LAAANCwAADssAAA7LAAAAixAAAIsQAAJLEAACSxAABAsQAAQLEAAFyxAABcsQAAeLEAAHixAACUsQAAlLEAALCxAACwsQAAzLEAAMyxAADosQAA6LEAAASyAAAEsgAAILIAACCyAAA8sgAAPLIAAFiyAABYsgAAdLIAAHSyAACQsgAAkLIAAKyyAACssgAAyLIAAMiyAADksgAA5LIAAACzAAAAswAAHLMAAByzAAA4swAAOLMAAFSzAABUswAAcLMAAHCzAACMswAAjLMAAKizAACoswAAxLMAAMSzAADgswAA4LMAAPyzAAD8swAAGLQAABi0AAA0tAAANLQAAFC0AABQtAAAbLQAAGy0AACItAAAiLQAAKS0AACktAAAwLQAAMC0AADctAAA3LQAAPi0AAD4tAAAFLUAABS1AAAwtQAAMLUAAEy1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AAChrgAAu64AAL2uAADXrgAA2a4AAPOuAAD1rgAAD68AABGvAAArrwAALa8AAEevAABJrwAAY68AAGWvAAB/rwAAga8AAJuvAACdrwAAt68AALmvAADTrwAA1a8AAO+vAADxrwAAC7AAAA2wAAAnsAAAKbAAAEOwAABFsAAAX7AAAGGwAAB7sAAAfbAAAJewAACZsAAAs7AAALWwAADPsAAA0bAAAOuwAADtsAAAB7EAAAmxAAAjsQAAJbEAAD+xAABBsQAAW7EAAF2xAAB3sQAAebEAAJOxAACVsQAAr7EAALGxAADLsQAAzbEAAOexAADpsQAAA7IAAAWyAAAfsgAAIbIAADuyAAA9sgAAV7IAAFmyAABzsgAAdbIAAI+yAACRsgAAq7IAAK2yAADHsgAAybIAAOOyAADlsgAA/7IAAAGzAAAbswAAHbMAADezAAA5swAAU7MAAFWzAABvswAAcbMAAIuzAACNswAAp7MAAKmzAADDswAAxbMAAN+zAADhswAA+7MAAP2zAAAXtAAAGbQAADO0AAA1tAAAT7QAAFG0AABrtAAAbbQAAIe0AACJtAAAo7QAAKW0AAC/tAAAwbQAANu0AADdtAAA97QAAPm0AAATtQAAFbUAAC+1AAAxtQAAS7UAAE21AABntQAAabUAAIO1AACFtQAAn7UAAKG1AAC7tQAAvbUAANe1AADZtQAA87UAAPW1AAAPtgAAEbYAACu2AAAttgAAR7YAAEm2AABjtgAAZbYAAH+2AACBtgAAm7YAAJ22AAC3tgAAubYAANO2AADVtgAA77YAAPG2AAALtwAADbcAACe3AAAptwAAQ7cAAEW3AABftwAAYbcAAHu3AAB9twAAl7cAAJm3AACztwAAtbcAAM+3AADRtwAA67cAAO23AAAHuAAACbgAACO4AAAluAAAP7gAAEG4AABbuAAAXbgAAHe4AAB5uAAAk7gAAJW4AACvuAAAsbgAAMu4AADNuAAA57gAAOm4AAADuQAABbkAAB+5AAAhuQAAO7kAAD25AABXuQAAWbkAAHO5AAB1uQAAj7kAAJG5AACruQAArbkAAMe5AADJuQAA47kAAOW5AAD/uQAAAboAABu6AAAdugAAN7oAADm6AABTugAAVboAAG+6AABxugAAi7oAAI26AACnugAAqboAAMO6AADFugAA37oAAOG6AAD7ugAA/boAABe7AAAZuwAAM7sAADW7AABPuwAAUbsAAGu7AABtuwAAh7sAAIm7AACjuwAApbsAAL+7AADBuwAA27sAAN27AAD3uwAA+bsAABO8AAAVvAAAL7wAADG8AABLvAAATbwAAGe8AABpvAAAg7wAAIW8AACfvAAAobwAALu8AAC9vAAA17wAANm8AADzvAAA9bwAAA+9AAARvQAAK70AAC29AABHvQAASb0AAGO9AABlvQAAf70AAIG9AACbvQAAnb0AALe9AAC5vQAA070AANW9AADvvQAA8b0AAAu+AAANvgAAJ74AACm+AABDvgAARb4AAF++AABhvgAAe74AAH2+AACXvgAAmb4AALO+AAC1vgAAz74AANG+AADrvgAA7b4AAAe/AAAJvwAAI78AACW/AAA/vwAAQb8AAFu/AABdvwAAd78AAHm/AACTvwAAlb8AAK+/AACxvwAAy78AAM2/AADnvwAA6b8AAAPAAAAFwAAAH8AAACHAAAA7wAAAPcAAAFfAAABZwAAAc8AAAHXAAACPwAAAkcAAAKvAAACtwAAAx8AAAMnAAADjwAAA5cAAAP/AAAABwQAAG8EAAB3BAAA3wQAAOcEAAFPBAABVwQAAb8EAAHHBAACLwQAAjcEAAKfBAACpwQAAw8EAAMXBAADfwQAA4cEAAPvBAAD9wQAAF8IAABnCAAAzwgAANcIAAE/CAABRwgAAa8IAAG3CAACHwgAAicIAAKPCAAClwgAAv8IAAMHCAADbwgAA3cIAAPfCAAD5wgAAE8MAABXDAAAvwwAAMcMAAEvDAABNwwAAZ8MAAGnDAACDwwAAhcMAAJ/DAAChwwAAu8MAAL3DAADXwwAA2cMAAPPDAAD1wwAAD8QAABHEAAArxAAALcQAAEfEAABJxAAAY8QAAGXEAAB/xAAAgcQAAJvEAACdxAAAt8QAALnEAADTxAAA1cQAAO/EAADxxAAAC8UAAA3FAAAnxQAAKcUAAEPFAABFxQAAX8UAAGHFAAB7xQAAfcUAAJfFAACZxQAAs8UAALXFAADPxQAA0cUAAOvFAADtxQAAB8YAAAnGAAAjxgAAJcYAAD/GAABBxgAAW8YAAF3GAAB3xgAAecYAAJPGAACVxgAAr8YAALHGAADLxgAAzcYAAOfGAADpxgAAA8cAAAXHAAAfxwAAIccAADvHAAA9xwAAV8cAAFnHAABzxwAAdccAAI/HAACRxwAAq8cAAK3HAADHxwAAyccAAOPHAADlxwAA/8cAAAHIAAAbyAAAHcgAADfIAAA5yAAAU8gAAFXIAABvyAAAccgAAIvIAACNyAAAp8gAAKnIAADDyAAAxcgAAN/IAADhyAAA+8gAAP3IAAAXyQAAGckAADPJAAA1yQAAT8kAAFHJAABryQAAbckAAIfJAACJyQAAo8kAAKXJAAC/yQAAwckAANvJAADdyQAA98kAAPnJAAATygAAFcoAAC/KAAAxygAAS8oAAE3KAABnygAAacoAAIPKAACFygAAn8oAAKHKAAC7ygAAvcoAANfKAADZygAA88oAAPXKAAAPywAAEcsAACvLAAAtywAAR8sAAEnLAABjywAAZcsAAH/LAACBywAAm8sAAJ3LAAC3ywAAucsAANPLAADVywAA78sAAPHLAAALzAAADcwAACfMAAApzAAAQ8wAAEXMAABfzAAAYcwAAHvMAAB9zAAAl8wAAJnMAACzzAAAtcwAAM/MAADRzAAA68wAAO3MAAAHzQAACc0AACPNAAAlzQAAP80AAEHNAABbzQAAXc0AAHfNAAB5zQAAk80AAJXNAACvzQAAsc0AAMvNAADNzQAA580AAOnNAAADzgAABc4AAB/OAAAhzgAAO84AAD3OAABXzgAAWc4AAHPOAAB1zgAAj84AAJHOAACrzgAArc4AAMfOAADJzgAA484AAOXOAAD/zgAAAc8AABvPAAAdzwAAN88AADnPAABTzwAAVc8AAG/PAABxzwAAi88AAI3PAACnzwAAqc8AAMPPAADFzwAA388AAOHPAAD7zwAA/c8AABfQAAAZ0AAAM9AAADXQAABP0AAAUdAAAGvQAABt0AAAh9AAAInQAACj0AAApdAAAL/QAADB0AAA29AAAN3QAAD30AAA+dAAABPRAAAV0QAAL9EAADHRAABL0QAATdEAAGfRAABp0QAAg9EAAIXRAACf0QAAodEAALvRAAC90QAA19EAANnRAADz0QAA9dEAAA/SAAAR0gAAK9IAAC3SAABH0gAASdIAAGPSAABl0gAAf9IAAIHSAACb0gAAndIAALfSAAC50gAA09IAANXSAADv0gAA8dIAAAvTAAAN0wAAJ9MAACnTAABD0wAARdMAAF/TAABh0wAAe9MAAH3T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AAAZHgAAGR4AABseAAAbHgAAHR4AAB0eAAAfHgAAHx4AACEeAAAhHgAAIx4AACMeAAAlHgAAJR4AACceAAAnHgAAKR4AACkeAAArHgAAKx4AAC0eAAAtHgAALx4AAC8eAAAxHgAAMR4AADMeAAAzHgAANR4AADUeAAA3HgAANx4AADkeAAA5HgAAOx4AADseAAA9HgAAPR4AAD8eAAA/HgAAQR4AAEEeAABDHgAAQx4AAEUeAABFHgAARx4AAEceAABJHgAASR4AAEseAABLHgAATR4AAE0eAABPHgAATx4AAFEeAABRHgAAUx4AAFMeAABVHgAAVR4AAFceAABXHgAAWR4AAFkeAABbHgAAWx4AAF0eAABdHgAAXx4AAF8eAABhHgAAYR4AAGMeAABjHgAAZR4AAGUeAABnHgAAZx4AAGkeAABpHgAAax4AAGseAABtHgAAbR4AAG8eAABvHgAAcR4AAHEeAABzHgAAcx4AAHUeAAB1HgAAdx4AAHceAAB5HgAAeR4AAHseAAB7HgAAfR4AAH0eAAB/HgAAfx4AAIEeAACBHgAAgx4AAIMeAACFHgAAhR4AAIceAACHHgAAiR4AAIkeAACLHgAAix4AAI0eAACNHgAAjx4AAI8eAACRHgAAkR4AAJMeAACTHgAAlR4AAJ0eAACfHgAAnx4AAKEeAAChHgAAox4AAKMeAAClHgAApR4AAKceAACnHgAAqR4AAKkeAACrHgAAqx4AAK0eAACtHgAArx4AAK8eAACxHgAAsR4AALMeAACzHgAAtR4AALUeAAC3HgAAtx4AALkeAAC5HgAAux4AALseAAC9HgAAvR4AAL8eAAC/HgAAwR4AAMEeAADDHgAAwx4AAMUeAADFHgAAxx4AAMceAADJHgAAyR4AAMseAADLHgAAzR4AAM0eAADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AAIcfAACQHwAAlx8AAKAfAACnHwAAsB8AALQfAAC2HwAAtx8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAAAKIQAACiEAAA4hAAAPIQAAEyEAABMhAAAvIQAALyEAADQhAAA0IQAAOSEAADkhAAA8IQAAPSEAAEYhAABJIQAATiEAAE4hAACEIQAAhCEAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHEsAABxLAAAcywAAHQsAAB2LAAAeywAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOQsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAm6YAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAxpwAAM6cAADOnAAA1pwAANacAADenAAA3pwAAOacAADmnAAA7pwAAO6cAAD2nAAA9pwAAP6cAAD+nAABBpwAAQacAAEOnAABDpwAARacAAEWnAABHpwAAR6cAAEmnAABJpwAAS6cAAEunAABNpwAATacAAE+nAABPpwAAUacAAFGnAABTpwAAU6cAAFWnAABVpwAAV6cAAFenAABZpwAAWacAAFunAABbpwAAXacAAF2nAABfpwAAX6cAAGGnAABhpwAAY6cAAGOnAABlpwAAZacAAGenAABnpwAAaacAAGmnAABrpwAAa6cAAG2nAABtpwAAb6cAAG+nAABxpwAAeKcAAHqnAAB6pwAAfKcAAHynAAB/pwAAf6cAAIGnAACBpwAAg6cAAIOnAACFpwAAhacAAIenAACHpwAAjKcAAIynAACOpwAAjqcAAJGnAACRpwAAk6cAAJWnAACXpwAAl6cAAJmnAACZpwAAm6cAAJunAACdpwAAnacAAJ+nAACfpwAAoacAAKGnAACjpwAAo6cAAKWnAAClpwAAp6cAAKenAACppwAAqacAAK+nAACvpwAAtacAALWnAAC3pwAAt6cAALmnAAC5pwAAu6cAALunAAC9pwAAvacAAL+nAAC/pwAAwacAAMGnAADDpwAAw6cAAMinAADIpwAAyqcAAMqnAADRpwAA0acAANOnAADTpwAA1acAANWnAADXpwAA16cAANmnAADZpwAA9qcAAPanAAD6pwAA+qcAADCrAABaqwAAYKsAAGirAABwqwAAv6sAAAD7AAAG+wAAE/sAABf7AABB/wAAWv8AACgEAQBPBAEA2AQBAPsEAQCXBQEAoQUBAKMFAQCxBQEAswUBALkFAQC7BQEAvAUBAMAMAQDyDAEAwBgBAN8YAQBgbgEAf24BABrUAQAz1AEATtQBAFTUAQBW1AEAZ9QBAILUAQCb1AEAttQBALnUAQC71AEAu9QBAL3UAQDD1AEAxdQBAM/UAQDq1AEAA9UBAB7VAQA31QEAUtUBAGvVAQCG1QEAn9UBALrVAQDT1QEA7tUBAAfWAQAi1gEAO9YBAFbWAQBv1gEAitYBAKXWAQDC1gEA2tYBANzWAQDh1gEA/NYBABTXAQAW1wEAG9cBADbXAQBO1wEAUNcBAFXXAQBw1wEAiNcBAIrXAQCP1wEAqtcBAMLXAQDE1wEAydcBAMvXAQDL1wEAAN8BAAnfAQAL3wEAHt8BACXfAQAq3wEAIukBAEPpAQAAAwAAbwMAAIMEAACJBAAAkQUAAL0FAAC/BQAAvwUAAMEFAADCBQAAxAUAAMUFAADHBQAAxwUAABAGAAAaBgAASwYAAF8GAABwBgAAcAYAANYGAADcBgAA3wYAAOQGAADnBgAA6AYAAOoGAADtBgAAEQcAABEHAAAwBwAASgcAAKYHAACwBwAA6wcAAPMHAAD9BwAA/QcAABYIAAAZCAAAGwgAACMIAAAlCAAAJwgAACkIAAAtCAAAWQgAAFsIAACYCAAAnwgAAMoIAADhCAAA4wgAAAMJAAA6CQAAPAkAAD4JAABPCQAAUQkAAFcJAABiCQAAYwkAAIEJAACDCQAAvAkAALwJAAC+CQAAxAkAAMcJAADICQAAywkAAM0JAADXCQAA1wkAAOIJAADjCQAA/gkAAP4JAAABCgAAAwoAADwKAAA8CgAAPgoAAEIKAABHCgAASAoAAEsKAABNCgAAUQoAAFEKAABwCgAAcQoAAHUKAAB1CgAAgQoAAIMKAAC8CgAAvAoAAL4KAADFCgAAxwoAAMkKAADLCgAAzQoAAOIKAADjCgAA+goAAP8KAAABCwAAAwsAADwLAAA8CwAAPgsAAEQLAABHCwAASAsAAEsLAABNCwAAVQsAAFcLAABiCwAAYwsAAIILAACCCwAAvgsAAMILAADGCwAAyAsAAMoLAADNCwAA1wsAANcLAAAADAAABAwAADwMAAA8DAAAPgwAAEQMAABGDAAASAwAAEoMAABNDAAAVQwAAFYMAABiDAAAYwwAAIEMAACDDAAAvAwAALwMAAC+DAAAxAwAAMYMAADIDAAAygwAAM0MAADVDAAA1gwAAOIMAADjDAAA8wwAAPMMAAAADQAAAw0AADsNAAA8DQAAPg0AAEQNAABGDQAASA0AAEoNAABNDQAAVw0AAFcNAABiDQAAYw0AAIENAACDDQAAyg0AAMoNAADPDQAA1A0AANYNAADWDQAA2A0AAN8NAADyDQAA8w0AADEOAAAxDgAANA4AADoOAABHDgAATg4AALEOAACxDgAAtA4AALwOAADIDgAAzg4AABgPAAAZDwAANQ8AADUPAAA3DwAANw8AADkPAAA5DwAAPg8AAD8PAABxDwAAhA8AAIYPAACHDwAAjQ8AAJcPAACZDwAAvA8AAMYPAADGDwAAKxAAAD4QAABWEAAAWRAAAF4QAABgEAAAYhAAAGQQAABnEAAAbRAAAHEQAAB0EAAAghAAAI0QAACPEAAAjxAAAJoQAACdEAAAXRMAAF8TAAASFwAAFRcAADIXAAA0FwAAUhcAAFMXAAByFwAAcxcAALQXAADTFwAA3RcAAN0XAAALGAAADRgAAA8YAAAPGAAAhRgAAIYYAACpGAAAqRgAACAZAAArGQAAMBkAADsZAAAXGgAAGxoAAFUaAABeGgAAYBoAAHwaAAB/GgAAfxoAALAaAADOGgAAABsAAAQbAAA0GwAARBsAAGsbAABzGwAAgBsAAIIbAAChGwAArRsAAOYbAADzGwAAJBwAADccAADQHAAA0hwAANQcAADoHAAA7RwAAO0cAAD0HAAA9BwAAPccAAD5HAAAwB0AAP8dAADQIAAA8CAAAO8sAADxLAAAfy0AAH8tAADgLQAA/y0AACowAAAvMAAAmTAAAJowAABvpgAAcqYAAHSmAAB9pgAAnqYAAJ+mAADwpgAA8aYAAAKoAAACqAAABqgAAAaoAAALqAAAC6gAACOoAAAnqAAALKgAACyoAACAqAAAgagAALSoAADFqAAA4KgAAPGoAAD/qAAA/6gAACapAAAtqQAAR6kAAFOpAACAqQAAg6kAALOpAADAqQAA5akAAOWpAAApqgAANqoAAEOqAABDqgAATKoAAE2qAAB7qgAAfaoAALCqAACwqgAAsqoAALSqAAC3qgAAuKoAAL6qAAC/qgAAwaoAAMGqAADrqgAA76oAAPWqAAD2qgAA46sAAOqrAADsqwAA7asAAB77AAAe+wAAAP4AAA/+AAAg/gAAL/4AAP0BAQD9AQEA4AIBAOACAQB2AwEAegMBAAEKAQADCgEABQoBAAYKAQAMCgEADwoBADgKAQA6CgEAPwoBAD8KAQDlCgEA5goBACQNAQAnDQEAqw4BAKwOAQD9DgEA/w4BAEYPAQBQDwEAgg8BAIUPAQAAEAEAAhABADgQAQBGEAEAcBABAHAQAQBzEAEAdBABAH8QAQCCEAEAsBABALoQAQDCEAEAwhABAAARAQACEQEAJxEBADQRAQBFEQEARhEBAHMRAQBzEQEAgBEBAIIRAQCzEQEAwBEBAMkRAQDMEQEAzhEBAM8RAQAsEgEANxIBAD4SAQA+EgEAQRIBAEESAQDfEgEA6hIBAAATAQADEwEAOxMBADwTAQA+EwEARBMBAEcTAQBIEwEASxMBAE0TAQBXEwEAVxMBAGITAQBjEwEAZhMBAGwTAQBwEwEAdBMBADUUAQBGFAEAXhQBAF4UAQCwFAEAwxQBAK8VAQC1FQEAuBUBAMAVAQDcFQEA3RUBADAWAQBAFgEAqxYBALcWAQAdFwEAKxcBACwYAQA6GAEAMBkBADUZAQA3GQEAOBkBADsZAQA+GQEAQBkBAEAZAQBCGQEAQxkBANEZAQDXGQEA2hkBAOAZAQDkGQEA5BkBAAEaAQAKGgEAMxoBADkaAQA7GgEAPhoBAEcaAQBHGgEAURoBAFsaAQCKGgEAmRoBAC8cAQA2HAEAOBwBAD8cAQCSHAEApxwBAKkcAQC2HAEAMR0BADYdAQA6HQEAOh0BADwdAQA9HQEAPx0BAEUdAQBHHQEARx0BAIodAQCOHQEAkB0BAJEdAQCTHQEAlx0BAPMeAQD2HgEAAB8BAAEfAQADHwEAAx8BADQfAQA6HwEAPh8BAEIfAQBANAEAQDQBAEc0AQBVNAEA8GoBAPRqAQAwawEANmsBAE9vAQBPbwEAUW8BAIdvAQCPbwEAkm8BAORvAQDkbwEA8G8BAPFvAQCdvAEAnrwBAADPAQAtzwEAMM8BAEbPAQBl0QEAadEBAG3RAQBy0QEAe9EBAILRAQCF0QEAi9EBAKrRAQCt0QEAQtIBAETSAQAA2gEANtoBADvaAQBs2gEAddoBAHXaAQCE2gEAhNoBAJvaAQCf2gEAodoBAK/aAQAA4AEABuABAAjgAQAY4AEAG+ABACHgAQAj4AEAJOABACbgAQAq4AEAj+ABAI/gAQAw4QEANuEBAK7iAQCu4gEA7OIBAO/iAQDs5AEA7+QBANDoAQDW6AEAROkBAErpAQAAAQ4A7wEOACsAAAArAAAAPAAAAD4AAAB8AAAAfAAAAH4AAAB+AAAArAAAAKwAAACxAAAAsQAAANcAAADXAAAA9wAAAPcAAAD2AwAA9gMAAAYGAAAIBgAARCAAAEQgAABSIAAAUiAAAHogAAB8IAAAiiAAAIwgAAAYIQAAGCEAAEAhAABEIQAASyEAAEshAACQIQAAlCEAAJohAACbIQAAoCEAAKAhAACjIQAAoyEAAKYhAACmIQAAriEAAK4hAADOIQAAzyEAANIhAADSIQAA1CEAANQhAAD0IQAA/yIAACAjAAAhIwAAfCMAAHwjAACbIwAAsyMAANwjAADhIwAAtyUAALclAADBJQAAwSUAAPglAAD/JQAAbyYAAG8mAADAJwAAxCcAAMcnAADlJwAA8CcAAP8nAAAAKQAAgikAAJkpAADXKQAA3CkAAPspAAD+KQAA/yoAADArAABEKwAARysAAEwrAAAp+wAAKfsAAGL+AABi/gAAZP4AAGb+AAAL/wAAC/8AABz/AAAe/wAAXP8AAFz/AABe/wAAXv8AAOL/AADi/wAA6f8AAOz/AADB1gEAwdYBANvWAQDb1gEA+9YBAPvWAQAV1wEAFdcBADXXAQA11wEAT9cBAE/XAQBv1wEAb9cBAInXAQCJ1wEAqdcBAKnXAQDD1wEAw9cBAPDuAQDx7gEAsAIAAMECAADGAgAA0QIAAOACAADkAgAA7AIAAOwCAADuAgAA7gIAAHQDAAB0AwAAegMAAHoDAABZBQAAWQUAAEAGAABABgAA5QYAAOYGAAD0BwAA9QcAAPoHAAD6BwAAGggAABoIAAAkCAAAJAgAACgIAAAoCAAAyQgAAMkIAABxCQAAcQkAAEYOAABGDgAAxg4AAMYOAAD8EAAA/BAAANcXAADXFwAAQxgAAEMYAACnGgAApxoAAHgcAAB9HAAALB0AAGodAAB4HQAAeB0AAJsdAAC/HQAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAAfCwAAH0sAABvLQAAby0AAC8uAAAvLgAABTAAAAUwAAAxMAAANTAAADswAAA7MAAAnTAAAJ4wAAD8MAAA/jAAABWgAAAVoAAA+KQAAP2kAAAMpgAADKYAAH+mAAB/pgAAnKYAAJ2mAAAXpwAAH6cAAHCnAABwpwAAiKcAAIinAADypwAA9KcAAPinAAD5pwAAz6kAAM+pAADmqQAA5qkAAHCqAABwqgAA3aoAAN2qAADzqgAA9KoAAFyrAABfqwAAaasAAGmrAABw/wAAcP8AAJ7/AACf/wAAgAcBAIUHAQCHBwEAsAcBALIHAQC6BwEAQGsBAENrAQCTbwEAn28BAOBvAQDhbwEA428BAONvAQDwrwEA868BAPWvAQD7rwEA/a8BAP6vAQAw4AEAbeABADfhAQA94QEA6+QBAOvkAQBL6QEAS+kBAF4AAABeAAAAYAAAAGAAAACoAAAAqAAAAK8AAACvAAAAtAAAALQAAAC4AAAAuAAAAMICAADFAgAA0gIAAN8CAADlAgAA6wIAAO0CAADtAgAA7wIAAP8CAAB1AwAAdQMAAIQDAACFAwAAiAgAAIgIAAC9HwAAvR8AAL8fAADBHwAAzR8AAM8fAADdHwAA3x8AAO0fAADvHwAA/R8AAP4fAACbMAAAnDAAAACnAAAWpwAAIKcAACGnAACJpwAAiqcAAFurAABbqwAAaqsAAGurAACy+wAAwvsAAD7/AAA+/wAAQP8AAED/AADj/wAA4/8AAPvzAQD/8wEAAAMAAG8DAACDBAAAhwQAAJEFAAC9BQAAvwUAAL8FAADBBQAAwgUAAMQFAADFBQAAxwUAAMcFAAAQBgAAGgYAAEsGAABfBgAAcAYAAHAGAADWBgAA3AYAAN8GAADkBgAA5wYAAOgGAADqBgAA7QYAABEHAAARBwAAMAcAAEoHAACmBwAAsAcAAOsHAADzBwAA/QcAAP0HAAAWCAAAGQgAABsIAAAjCAAAJQgAACcIAAApCAAALQgAAFkIAABbCAAAmAgAAJ8IAADKCAAA4QgAAOMIAAACCQAAOgkAADoJAAA8CQAAPAkAAEEJAABICQAATQkAAE0JAABRCQAAVwkAAGIJAABjCQAAgQkAAIEJAAC8CQAAvAkAAMEJAADECQAAzQkAAM0JAADiCQAA4wkAAP4JAAD+CQAAAQoAAAIKAAA8CgAAPAoAAEEKAABCCgAARwoAAEgKAABLCgAATQoAAFEKAABRCgAAcAoAAHEKAAB1CgAAdQoAAIEKAACCCgAAvAoAALwKAADBCgAAxQoAAMcKAADICgAAzQoAAM0KAADiCgAA4woAAPoKAAD/CgAAAQsAAAELAAA8CwAAPAsAAD8LAAA/CwAAQQsAAEQLAABNCwAATQsAAFULAABWCwAAYgsAAGMLAACCCwAAggsAAMALAADACwAAzQsAAM0LAAAADAAAAAwAAAQMAAAEDAAAPAwAADwMAAA+DAAAQAwAAEYMAABIDAAASgwAAE0MAABVDAAAVgwAAGIMAABjDAAAgQwAAIEMAAC8DAAAvAwAAL8MAAC/DAAAxgwAAMYMAADMDAAAzQwAAOIMAADjDAAAAA0AAAENAAA7DQAAPA0AAEENAABEDQAATQ0AAE0NAABiDQAAYw0AAIENAACBDQAAyg0AAMoNAADSDQAA1A0AANYNAADWDQAAMQ4AADEOAAA0DgAAOg4AAEcOAABODgAAsQ4AALEOAAC0DgAAvA4AAMgOAADODgAAGA8AABkPAAA1DwAANQ8AADcPAAA3DwAAOQ8AADkPAABxDwAAfg8AAIAPAACEDwAAhg8AAIcPAACNDwAAlw8AAJkPAAC8DwAAxg8AAMYPAAAtEAAAMBAAADIQAAA3EAAAORAAADoQAAA9EAAAPhAAAFgQAABZEAAAXhAAAGAQAABxEAAAdBAAAIIQAACCEAAAhRAAAIYQAACNEAAAjRAAAJ0QAACdEAAAXRMAAF8TAAASFwAAFBcAADIXAAAzFwAAUhcAAFMXAAByFwAAcxcAALQXAAC1FwAAtxcAAL0XAADGFwAAxhcAAMkXAADTFwAA3RcAAN0XAAALGAAADRgAAA8YAAAPGAAAhRgAAIYYAACpGAAAqRgAACAZAAAiGQAAJxkAACgZAAAyGQAAMhkAADkZAAA7GQAAFxoAABgaAAAbGgAAGxoAAFYaAABWGgAAWBoAAF4aAABgGgAAYBoAAGIaAABiGgAAZRoAAGwaAABzGgAAfBoAAH8aAAB/GgAAsBoAAL0aAAC/GgAAzhoAAAAbAAADGwAANBsAADQbAAA2GwAAOhsAADwbAAA8GwAAQhsAAEIbAABrGwAAcxsAAIAbAACBGwAAohsAAKUbAACoGwAAqRsAAKsbAACtGwAA5hsAAOYbAADoGwAA6RsAAO0bAADtGwAA7xsAAPEbAAAsHAAAMxwAADYcAAA3HAAA0BwAANIcAADUHAAA4BwAAOIcAADoHAAA7RwAAO0cAAD0HAAA9BwAAPgcAAD5HAAAwB0AAP8dAADQIAAA3CAAAOEgAADhIAAA5SAAAPAgAADvLAAA8SwAAH8tAAB/LQAA4C0AAP8tAAAqMAAALTAAAJkwAACaMAAAb6YAAG+mAAB0pgAAfaYAAJ6mAACfpgAA8KYAAPGmAAACqAAAAqgAAAaoAAAGqAAAC6gAAAuoAAAlqAAAJqgAACyoAAAsqAAAxKgAAMWoAADgqAAA8agAAP+oAAD/qAAAJqkAAC2pAABHqQAAUakAAICpAACCqQAAs6kAALOpAAC2qQAAuakAALypAAC9qQAA5akAAOWpAAApqgAALqoAADGqAAAyqgAANaoAADaqAABDqgAAQ6oAAEyqAABMqgAAfKoAAHyqAACwqgAAsKoAALKqAAC0qgAAt6oAALiqAAC+qgAAv6oAAMGqAADBqgAA7KoAAO2qAAD2qgAA9qoAAOWrAADlqwAA6KsAAOirAADtqwAA7asAAB77AAAe+wAAAP4AAA/+AAAg/gAAL/4AAP0BAQD9AQEA4AIBAOACAQB2AwEAegMBAAEKAQADCgEABQoBAAYKAQAMCgEADwoBADgKAQA6CgEAPwoBAD8KAQDlCgEA5goBACQNAQAnDQEAqw4BAKwOAQD9DgEA/w4BAEYPAQBQDwEAgg8BAIUPAQABEAEAARABADgQAQBGEAEAcBABAHAQAQBzEAEAdBABAH8QAQCBEAEAsxABALYQAQC5EAEAuhABAMIQAQDCEAEAABEBAAIRAQAnEQEAKxEBAC0RAQA0EQEAcxEBAHMRAQCAEQEAgREBALYRAQC+EQEAyREBAMwRAQDPEQEAzxEBAC8SAQAxEgEANBIBADQSAQA2EgEANxIBAD4SAQA+EgEAQRIBAEESAQDfEgEA3xIBAOMSAQDqEgEAABMBAAETAQA7EwEAPBMBAEATAQBAEwEAZhMBAGwTAQBwEwEAdBMBADgUAQA/FAEAQhQBAEQUAQBGFAEARhQBAF4UAQBeFAEAsxQBALgUAQC6FAEAuhQBAL8UAQDAFAEAwhQBAMMUAQCyFQEAtRUBALwVAQC9FQEAvxUBAMAVAQDcFQEA3RUBADMWAQA6FgEAPRYBAD0WAQA/FgEAQBYBAKsWAQCrFgEArRYBAK0WAQCwFgEAtRYBALcWAQC3FgEAHRcBAB8XAQAiFwEAJRcBACcXAQArFwEALxgBADcYAQA5GAEAOhgBADsZAQA8GQEAPhkBAD4ZAQBDGQEAQxkBANQZAQDXGQEA2hkBANsZAQDgGQEA4BkBAAEaAQAKGgEAMxoBADgaAQA7GgEAPhoBAEcaAQBHGgEAURoBAFYaAQBZGgEAWxoBAIoaAQCWGgEAmBoBAJkaAQAwHAEANhwBADgcAQA9HAEAPxwBAD8cAQCSHAEApxwBAKocAQCwHAEAshwBALMcAQC1HAEAthwBADEdAQA2HQEAOh0BADodAQA8HQEAPR0BAD8dAQBFHQEARx0BAEcdAQCQHQEAkR0BAJUdAQCVHQEAlx0BAJcdAQDzHgEA9B4BAAAfAQABHwEANh8BADofAQBAHwEAQB8BAEIfAQBCHwEAQDQBAEA0AQBHNAEAVTQBAPBqAQD0agEAMGsBADZrAQBPbwEAT28BAI9vAQCSbwEA5G8BAORvAQCdvAEAnrwBAADPAQAtzwEAMM8BAEbPAQBn0QEAadEBAHvRAQCC0QEAhdEBAIvRAQCq0QEArdEBAELSAQBE0gEAANoBADbaAQA72gEAbNoBAHXaAQB12gEAhNoBAITaAQCb2gEAn9oBAKHaAQCv2gEAAOABAAbgAQAI4AEAGOABABvgAQAh4AEAI+ABACTgAQAm4AEAKuABAI/gAQCP4AEAMOEBADbhAQCu4gEAruIBAOziAQDv4gEA7OQBAO/kAQDQ6AEA1ugBAETpAQBK6QEAAAEOAO8BDgAwAAAAOQAAALIAAACzAAAAuQAAALkAAAC8AAAAvgAAAGAGAABpBgAA8AYAAPkGAADABwAAyQcAAGYJAABvCQAA5gkAAO8JAAD0CQAA+QkAAGYKAABvCgAA5goAAO8KAABmCwAAbwsAAHILAAB3CwAA5gsAAPILAABmDAAAbwwAAHgMAAB+DAAA5gwAAO8MAABYDQAAXg0AAGYNAAB4DQAA5g0AAO8NAABQDgAAWQ4AANAOAADZDgAAIA8AADMPAABAEAAASRAAAJAQAACZEAAAaRMAAHwTAADuFgAA8BYAAOAXAADpFwAA8BcAAPkXAAAQGAAAGRgAAEYZAABPGQAA0BkAANoZAACAGgAAiRoAAJAaAACZGgAAUBsAAFkbAACwGwAAuRsAAEAcAABJHAAAUBwAAFkcAABwIAAAcCAAAHQgAAB5IAAAgCAAAIkgAABQIQAAgiEAAIUhAACJIQAAYCQAAJskAADqJAAA/yQAAHYnAACTJwAA/SwAAP0sAAAHMAAABzAAACEwAAApMAAAODAAADowAACSMQAAlTEAACAyAAApMgAASDIAAE8yAABRMgAAXzIAAIAyAACJMgAAsTIAAL8yAAAgpgAAKaYAAOamAADvpgAAMKgAADWoAADQqAAA2agAAACpAAAJqQAA0KkAANmpAADwqQAA+akAAFCqAABZqgAA8KsAAPmrAAAQ/wAAGf8AAAcBAQAzAQEAQAEBAHgBAQCKAQEAiwEBAOECAQD7AgEAIAMBACMDAQBBAwEAQQMBAEoDAQBKAwEA0QMBANUDAQCgBAEAqQQBAFgIAQBfCAEAeQgBAH8IAQCnCAEArwgBAPsIAQD/CAEAFgkBABsJAQC8CQEAvQkBAMAJAQDPCQEA0gkBAP8JAQBACgEASAoBAH0KAQB+CgEAnQoBAJ8KAQDrCgEA7woBAFgLAQBfCwEAeAsBAH8LAQCpCwEArwsBAPoMAQD/DAEAMA0BADkNAQBgDgEAfg4BAB0PAQAmDwEAUQ8BAFQPAQDFDwEAyw8BAFIQAQBvEAEA8BABAPkQAQA2EQEAPxEBANARAQDZEQEA4REBAPQRAQDwEgEA+RIBAFAUAQBZFAEA0BQBANkUAQBQFgEAWRYBAMAWAQDJFgEAMBcBADsXAQDgGAEA8hgBAFAZAQBZGQEAUBwBAGwcAQBQHQEAWR0BAKAdAQCpHQEAUB8BAFkfAQDAHwEA1B8BAAAkAQBuJAEAYGoBAGlqAQDAagEAyWoBAFBrAQBZawEAW2sBAGFrAQCAbgEAlm4BAMDSAQDT0gEA4NIBAPPSAQBg0wEAeNMBAM7XAQD/1wEAQOEBAEnhAQDw4gEA+eIBAPDkAQD55AEAx+gBAM/oAQBQ6QEAWekBAHHsAQCr7AEArewBAK/sAQCx7AEAtOwBAAHtAQAt7QEAL+0BAD3tAQAA8QEADPEBAPD7AQD5+wEAKAAAACgAAABbAAAAWwAAAHsAAAB7AAAAOg8AADoPAAA8DwAAPA8AAJsWAACbFgAAGiAAABogAAAeIAAAHiAAAEUgAABFIAAAfSAAAH0gAACNIAAAjSAAAAgjAAAIIwAACiMAAAojAAApIwAAKSMAAGgnAABoJwAAaicAAGonAABsJwAAbCcAAG4nAABuJwAAcCcAAHAnAAByJwAAcicAAHQnAAB0JwAAxScAAMUnAADmJwAA5icAAOgnAADoJwAA6icAAOonAADsJwAA7CcAAO4nAADuJwAAgykAAIMpAACFKQAAhSkAAIcpAACHKQAAiSkAAIkpAACLKQAAiykAAI0pAACNKQAAjykAAI8pAACRKQAAkSkAAJMpAACTKQAAlSkAAJUpAACXKQAAlykAANgpAADYKQAA2ikAANopAAD8KQAA/CkAACIuAAAiLgAAJC4AACQuAAAmLgAAJi4AACguAAAoLgAAQi4AAEIuAABVLgAAVS4AAFcuAABXLgAAWS4AAFkuAABbLgAAWy4AAAgwAAAIMAAACjAAAAowAAAMMAAADDAAAA4wAAAOMAAAEDAAABAwAAAUMAAAFDAAABYwAAAWMAAAGDAAABgwAAAaMAAAGjAAAB0wAAAdMAAAP/0AAD/9AAAX/gAAF/4AADX+AAA1/gAAN/4AADf+AAA5/gAAOf4AADv+AAA7/gAAPf4AAD3+AAA//gAAP/4AAEH+AABB/gAAQ/4AAEP+AABH/gAAR/4AAFn+AABZ/gAAW/4AAFv+AABd/gAAXf4AAAj/AAAI/wAAO/8AADv/AABb/wAAW/8AAF//AABf/wAAYv8AAGL/AAAAAAAAHwAAAH8AAACfAAAArQAAAK0AAAB4AwAAeQMAAIADAACDAwAAiwMAAIsDAACNAwAAjQMAAKIDAACiAwAAMAUAADAFAABXBQAAWAUAAIsFAACMBQAAkAUAAJAFAADIBQAAzwUAAOsFAADuBQAA9QUAAAUGAAAcBgAAHAYAAN0GAADdBgAADgcAAA8HAABLBwAATAcAALIHAAC/BwAA+wcAAPwHAAAuCAAALwgAAD8IAAA/CAAAXAgAAF0IAABfCAAAXwgAAGsIAABvCAAAjwgAAJcIAADiCAAA4ggAAIQJAACECQAAjQkAAI4JAACRCQAAkgkAAKkJAACpCQAAsQkAALEJAACzCQAAtQkAALoJAAC7CQAAxQkAAMYJAADJCQAAygkAAM8JAADWCQAA2AkAANsJAADeCQAA3gkAAOQJAADlCQAA/wkAAAAKAAAECgAABAoAAAsKAAAOCgAAEQoAABIKAAApCgAAKQoAADEKAAAxCgAANAoAADQKAAA3CgAANwoAADoKAAA7CgAAPQoAAD0KAABDCgAARgoAAEkKAABKCgAATgoAAFAKAABSCgAAWAoAAF0KAABdCgAAXwoAAGUKAAB3CgAAgAoAAIQKAACECgAAjgoAAI4KAACSCgAAkgoAAKkKAACpCgAAsQoAALEKAAC0CgAAtAoAALoKAAC7CgAAxgoAAMYKAADKCgAAygoAAM4KAADPCgAA0QoAAN8KAADkCgAA5QoAAPIKAAD4CgAAAAsAAAALAAAECwAABAsAAA0LAAAOCwAAEQsAABILAAApCwAAKQsAADELAAAxCwAANAsAADQLAAA6CwAAOwsAAEULAABGCwAASQsAAEoLAABOCwAAVAsAAFgLAABbCwAAXgsAAF4LAABkCwAAZQsAAHgLAACBCwAAhAsAAIQLAACLCwAAjQsAAJELAACRCwAAlgsAAJgLAACbCwAAmwsAAJ0LAACdCwAAoAsAAKILAAClCwAApwsAAKsLAACtCwAAugsAAL0LAADDCwAAxQsAAMkLAADJCwAAzgsAAM8LAADRCwAA1gsAANgLAADlCwAA+wsAAP8LAAANDAAADQwAABEMAAARDAAAKQwAACkMAAA6DAAAOwwAAEUMAABFDAAASQwAAEkMAABODAAAVAwAAFcMAABXDAAAWwwAAFwMAABeDAAAXwwAAGQMAABlDAAAcAwAAHYMAACNDAAAjQwAAJEMAACRDAAAqQwAAKkMAAC0DAAAtAwAALoMAAC7DAAAxQwAAMUMAADJDAAAyQwAAM4MAADUDAAA1wwAANwMAADfDAAA3wwAAOQMAADlDAAA8AwAAPAMAAD0DAAA/wwAAA0NAAANDQAAEQ0AABENAABFDQAARQ0AAEkNAABJDQAAUA0AAFMNAABkDQAAZQ0AAIANAACADQAAhA0AAIQNAACXDQAAmQ0AALINAACyDQAAvA0AALwNAAC+DQAAvw0AAMcNAADJDQAAyw0AAM4NAADVDQAA1Q0AANcNAADXDQAA4A0AAOUNAADwDQAA8Q0AAPUNAAAADgAAOw4AAD4OAABcDgAAgA4AAIMOAACDDgAAhQ4AAIUOAACLDgAAiw4AAKQOAACkDgAApg4AAKYOAAC+DgAAvw4AAMUOAADFDgAAxw4AAMcOAADPDgAAzw4AANoOAADbDgAA4A4AAP8OAABIDwAASA8AAG0PAABwDwAAmA8AAJgPAAC9DwAAvQ8AAM0PAADNDwAA2w8AAP8PAADGEAAAxhAAAMgQAADMEAAAzhAAAM8QAABJEgAASRIAAE4SAABPEgAAVxIAAFcSAABZEgAAWRIAAF4SAABfEgAAiRIAAIkSAACOEgAAjxIAALESAACxEgAAthIAALcSAAC/EgAAvxIAAMESAADBEgAAxhIAAMcSAADXEgAA1xIAABETAAAREwAAFhMAABcTAABbEwAAXBMAAH0TAAB/EwAAmhMAAJ8TAAD2EwAA9xMAAP4TAAD/EwAAnRYAAJ8WAAD5FgAA/xYAABYXAAAeFwAANxcAAD8XAABUFwAAXxcAAG0XAABtFwAAcRcAAHEXAAB0FwAAfxcAAN4XAADfFwAA6hcAAO8XAAD6FwAA/xcAAA4YAAAOGAAAGhgAAB8YAAB5GAAAfxgAAKsYAACvGAAA9hgAAP8YAAAfGQAAHxkAACwZAAAvGQAAPBkAAD8ZAABBGQAAQxkAAG4ZAABvGQAAdRkAAH8ZAACsGQAArxkAAMoZAADPGQAA2xkAAN0ZAAAcGgAAHRoAAF8aAABfGgAAfRoAAH4aAACKGgAAjxoAAJoaAACfGgAArhoAAK8aAADPGgAA/xoAAE0bAABPGwAAfxsAAH8bAAD0GwAA+xsAADgcAAA6HAAAShwAAEwcAACJHAAAjxwAALscAAC8HAAAyBwAAM8cAAD7HAAA/xwAABYfAAAXHwAAHh8AAB8fAABGHwAARx8AAE4fAABPHwAAWB8AAFgfAABaHwAAWh8AAFwfAABcHwAAXh8AAF4fAAB+HwAAfx8AALUfAAC1HwAAxR8AAMUfAADUHwAA1R8AANwfAADcHwAA8B8AAPEfAAD1HwAA9R8AAP8fAAD/HwAACyAAAA8gAAAqIAAALiAAAGAgAABvIAAAciAAAHMgAACPIAAAjyAAAJ0gAACfIAAAwSAAAM8gAADxIAAA/yAAAIwhAACPIQAAJyQAAD8kAABLJAAAXyQAAHQrAAB1KwAAlisAAJYrAAD0LAAA+CwAACYtAAAmLQAAKC0AACwtAAAuLQAALy0AAGgtAABuLQAAcS0AAH4tAACXLQAAny0AAKctAACnLQAAry0AAK8tAAC3LQAAty0AAL8tAAC/LQAAxy0AAMctAADPLQAAzy0AANctAADXLQAA3y0AAN8tAABeLgAAfy4AAJouAACaLgAA9C4AAP8uAADWLwAA7y8AAPwvAAD/LwAAQDAAAEAwAACXMAAAmDAAAAAxAAAEMQAAMDEAADAxAACPMQAAjzEAAOQxAADvMQAAHzIAAB8yAACNpAAAj6QAAMekAADPpAAALKYAAD+mAAD4pgAA/6YAAMunAADPpwAA0qcAANKnAADUpwAA1KcAANqnAADxpwAALagAAC+oAAA6qAAAP6gAAHioAAB/qAAAxqgAAM2oAADaqAAA36gAAFSpAABeqQAAfakAAH+pAADOqQAAzqkAANqpAADdqQAA/6kAAP+pAAA3qgAAP6oAAE6qAABPqgAAWqoAAFuqAADDqgAA2qoAAPeqAAAAqwAAB6sAAAirAAAPqwAAEKsAABerAAAfqwAAJ6sAACerAAAvqwAAL6sAAGyrAABvqwAA7qsAAO+rAAD6qwAA/6sAAKTXAACv1wAAx9cAAMrXAAD81wAA//gAAG76AABv+gAA2voAAP/6AAAH+wAAEvsAABj7AAAc+wAAN/sAADf7AAA9+wAAPfsAAD/7AAA/+wAAQvsAAEL7AABF+wAARfsAAMP7AADS+wAAkP0AAJH9AADI/QAAzv0AAND9AADv/QAAGv4AAB/+AABT/gAAU/4AAGf+AABn/gAAbP4AAG/+AAB1/gAAdf4AAP3+AAAA/wAAv/8AAMH/AADI/wAAyf8AAND/AADR/wAA2P8AANn/AADd/wAA3/8AAOf/AADn/wAA7/8AAPv/AAD+/wAA//8AAAwAAQAMAAEAJwABACcAAQA7AAEAOwABAD4AAQA+AAEATgABAE8AAQBeAAEAfwABAPsAAQD/AAEAAwEBAAYBAQA0AQEANgEBAI8BAQCPAQEAnQEBAJ8BAQChAQEAzwEBAP4BAQB/AgEAnQIBAJ8CAQDRAgEA3wIBAPwCAQD/AgEAJAMBACwDAQBLAwEATwMBAHsDAQB/AwEAngMBAJ4DAQDEAwEAxwMBANYDAQD/AwEAngQBAJ8EAQCqBAEArwQBANQEAQDXBAEA/AQBAP8EAQAoBQEALwUBAGQFAQBuBQEAewUBAHsFAQCLBQEAiwUBAJMFAQCTBQEAlgUBAJYFAQCiBQEAogUBALIFAQCyBQEAugUBALoFAQC9BQEA/wUBADcHAQA/BwEAVgcBAF8HAQBoBwEAfwcBAIYHAQCGBwEAsQcBALEHAQC7BwEA/wcBAAYIAQAHCAEACQgBAAkIAQA2CAEANggBADkIAQA7CAEAPQgBAD4IAQBWCAEAVggBAJ8IAQCmCAEAsAgBAN8IAQDzCAEA8wgBAPYIAQD6CAEAHAkBAB4JAQA6CQEAPgkBAEAJAQB/CQEAuAkBALsJAQDQCQEA0QkBAAQKAQAECgEABwoBAAsKAQAUCgEAFAoBABgKAQAYCgEANgoBADcKAQA7CgEAPgoBAEkKAQBPCgEAWQoBAF8KAQCgCgEAvwoBAOcKAQDqCgEA9woBAP8KAQA2CwEAOAsBAFYLAQBXCwEAcwsBAHcLAQCSCwEAmAsBAJ0LAQCoCwEAsAsBAP8LAQBJDAEAfwwBALMMAQC/DAEA8wwBAPkMAQAoDQEALw0BADoNAQBfDgEAfw4BAH8OAQCqDgEAqg4BAK4OAQCvDgEAsg4BAPwOAQAoDwEALw8BAFoPAQBvDwEAig8BAK8PAQDMDwEA3w8BAPcPAQD/DwEAThABAFEQAQB2EAEAfhABAL0QAQC9EAEAwxABAM8QAQDpEAEA7xABAPoQAQD/EAEANREBADURAQBIEQEATxEBAHcRAQB/EQEA4BEBAOARAQD1EQEA/xEBABISAQASEgEAQhIBAH8SAQCHEgEAhxIBAIkSAQCJEgEAjhIBAI4SAQCeEgEAnhIBAKoSAQCvEgEA6xIBAO8SAQD6EgEA/xIBAAQTAQAEEwEADRMBAA4TAQAREwEAEhMBACkTAQApEwEAMRMBADETAQA0EwEANBMBADoTAQA6EwEARRMBAEYTAQBJEwEAShMBAE4TAQBPEwEAURMBAFYTAQBYEwEAXBMBAGQTAQBlEwEAbRMBAG8TAQB1EwEA/xMBAFwUAQBcFAEAYhQBAH8UAQDIFAEAzxQBANoUAQB/FQEAthUBALcVAQDeFQEA/xUBAEUWAQBPFgEAWhYBAF8WAQBtFgEAfxYBALoWAQC/FgEAyhYBAP8WAQAbFwEAHBcBACwXAQAvFwEARxcBAP8XAQA8GAEAnxgBAPMYAQD+GAEABxkBAAgZAQAKGQEACxkBABQZAQAUGQEAFxkBABcZAQA2GQEANhkBADkZAQA6GQEARxkBAE8ZAQBaGQEAnxkBAKgZAQCpGQEA2BkBANkZAQDlGQEA/xkBAEgaAQBPGgEAoxoBAK8aAQD5GgEA/xoBAAobAQD/GwEACRwBAAkcAQA3HAEANxwBAEYcAQBPHAEAbRwBAG8cAQCQHAEAkRwBAKgcAQCoHAEAtxwBAP8cAQAHHQEABx0BAAodAQAKHQEANx0BADkdAQA7HQEAOx0BAD4dAQA+HQEASB0BAE8dAQBaHQEAXx0BAGYdAQBmHQEAaR0BAGkdAQCPHQEAjx0BAJIdAQCSHQEAmR0BAJ8dAQCqHQEA3x4BAPkeAQD/HgEAER8BABEfAQA7HwEAPR8BAFofAQCvHwEAsR8BAL8fAQDyHwEA/h8BAJojAQD/IwEAbyQBAG8kAQB1JAEAfyQBAEQlAQCPLwEA8y8BAP8vAQAwNAEAPzQBAFY0AQD/QwEAR0YBAP9nAQA5agEAP2oBAF9qAQBfagEAamoBAG1qAQC/agEAv2oBAMpqAQDPagEA7moBAO9qAQD2agEA/2oBAEZrAQBPawEAWmsBAFprAQBiawEAYmsBAHhrAQB8awEAkGsBAD9uAQCbbgEA/24BAEtvAQBObwEAiG8BAI5vAQCgbwEA328BAOVvAQDvbwEA8m8BAP9vAQD4hwEA/4cBANaMAQD/jAEACY0BAO+vAQD0rwEA9K8BAPyvAQD8rwEA/68BAP+vAQAjsQEAMbEBADOxAQBPsQEAU7EBAFSxAQBWsQEAY7EBAGixAQBvsQEA/LIBAP+7AQBrvAEAb7wBAH28AQB/vAEAibwBAI+8AQCavAEAm7wBAKC8AQD/zgEALs8BAC/PAQBHzwEAT88BAMTPAQD/zwEA9tABAP/QAQAn0QEAKNEBAHPRAQB60QEA69EBAP/RAQBG0gEAv9IBANTSAQDf0gEA9NIBAP/SAQBX0wEAX9MBAHnTAQD/0wEAVdQBAFXUAQCd1AEAndQBAKDUAQCh1AEAo9QBAKTUAQCn1AEAqNQBAK3UAQCt1AEAutQBALrUAQC81AEAvNQBAMTUAQDE1AEABtUBAAbVAQAL1QEADNUBABXVAQAV1QEAHdUBAB3VAQA61QEAOtUBAD/VAQA/1QEARdUBAEXVAQBH1QEASdUBAFHVAQBR1QEAptYBAKfWAQDM1wEAzdcBAIzaAQCa2gEAoNoBAKDaAQCw2gEA/94BAB/fAQAk3wEAK98BAP/fAQAH4AEAB+ABABngAQAa4AEAIuABACLgAQAl4AEAJeABACvgAQAv4AEAbuABAI7gAQCQ4AEA/+ABAC3hAQAv4QEAPuEBAD/hAQBK4QEATeEBAFDhAQCP4gEAr+IBAL/iAQD64gEA/uIBAADjAQDP5AEA+uQBAN/nAQDn5wEA5+cBAOznAQDs5wEA7+cBAO/nAQD/5wEA/+cBAMXoAQDG6AEA1+gBAP/oAQBM6QEAT+kBAFrpAQBd6QEAYOkBAHDsAQC17AEAAO0BAD7tAQD/7QEABO4BAATuAQAg7gEAIO4BACPuAQAj7gEAJe4BACbuAQAo7gEAKO4BADPuAQAz7gEAOO4BADjuAQA67gEAOu4BADzuAQBB7gEAQ+4BAEbuAQBI7gEASO4BAEruAQBK7gEATO4BAEzuAQBQ7gEAUO4BAFPuAQBT7gEAVe4BAFbuAQBY7gEAWO4BAFruAQBa7gEAXO4BAFzuAQBe7gEAXu4BAGDuAQBg7gEAY+4BAGPuAQBl7gEAZu4BAGvuAQBr7gEAc+4BAHPuAQB47gEAeO4BAH3uAQB97gEAf+4BAH/uAQCK7gEAiu4BAJzuAQCg7gEApO4BAKTuAQCq7gEAqu4BALzuAQDv7gEA8u4BAP/vAQAs8AEAL/ABAJTwAQCf8AEAr/ABALDwAQDA8AEAwPABANDwAQDQ8AEA9vABAP/wAQCu8QEA5fEBAAPyAQAP8gEAPPIBAD/yAQBJ8gEAT/IBAFLyAQBf8gEAZvIBAP/yAQDY9gEA2/YBAO32AQDv9gEA/fYBAP/2AQB39wEAevcBANr3AQDf9wEA7PcBAO/3AQDx9wEA//cBAAz4AQAP+AEASPgBAE/4AQBa+AEAX/gBAIj4AQCP+AEArvgBAK/4AQCy+AEA//gBAFT6AQBf+gEAbvoBAG/6AQB9+gEAf/oBAIn6AQCP+gEAvvoBAL76AQDG+gEAzfoBANz6AQDf+gEA6foBAO/6AQD5+gEA//oBAJP7AQCT+wEAy/sBAO/7AQD6+wEA//8BAOCmAgD/pgIAOrcCAD+3AgAeuAIAH7gCAKLOAgCvzgIA4esCAP/3AgAe+gIA//8CAEsTAwBPEwMAsCMDAP8ADgDwAQ4A//8QAKoAAACqAAAAugAAALoAAAC7AQAAuwEAAMABAADDAQAAlAIAAJQCAADQBQAA6gUAAO8FAADyBQAAIAYAAD8GAABBBgAASgYAAG4GAABvBgAAcQYAANMGAADVBgAA1QYAAO4GAADvBgAA+gYAAPwGAAD/BgAA/wYAABAHAAAQBwAAEgcAAC8HAABNBwAApQcAALEHAACxBwAAygcAAOoHAAAACAAAFQgAAEAIAABYCAAAYAgAAGoIAABwCAAAhwgAAIkIAACOCAAAoAgAAMgIAAAECQAAOQkAAD0JAAA9CQAAUAkAAFAJAABYCQAAYQkAAHIJAACACQAAhQkAAIwJAACPCQAAkAkAAJMJAACoCQAAqgkAALAJAACyCQAAsgkAALYJAAC5CQAAvQkAAL0JAADOCQAAzgkAANwJAADdCQAA3wkAAOEJAADwCQAA8QkAAPwJAAD8CQAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAABZCgAAXAoAAF4KAABeCgAAcgoAAHQKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC9CgAAvQoAANAKAADQCgAA4AoAAOEKAAD5CgAA+QoAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAAA9CwAAXAsAAF0LAABfCwAAYQsAAHELAABxCwAAgwsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAADQCwAA0AsAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPQwAAD0MAABYDAAAWgwAAF0MAABdDAAAYAwAAGEMAACADAAAgAwAAIUMAACMDAAAjgwAAJAMAACSDAAAqAwAAKoMAACzDAAAtQwAALkMAAC9DAAAvQwAAN0MAADeDAAA4AwAAOEMAADxDAAA8gwAAAQNAAAMDQAADg0AABANAAASDQAAOg0AAD0NAAA9DQAATg0AAE4NAABUDQAAVg0AAF8NAABhDQAAeg0AAH8NAACFDQAAlg0AAJoNAACxDQAAsw0AALsNAAC9DQAAvQ0AAMANAADGDQAAAQ4AADAOAAAyDgAAMw4AAEAOAABFDgAAgQ4AAIIOAACEDgAAhA4AAIYOAACKDgAAjA4AAKMOAAClDgAApQ4AAKcOAACwDgAAsg4AALMOAAC9DgAAvQ4AAMAOAADEDgAA3A4AAN8OAAAADwAAAA8AAEAPAABHDwAASQ8AAGwPAACIDwAAjA8AAAAQAAAqEAAAPxAAAD8QAABQEAAAVRAAAFoQAABdEAAAYRAAAGEQAABlEAAAZhAAAG4QAABwEAAAdRAAAIEQAACOEAAAjhAAAAARAABIEgAAShIAAE0SAABQEgAAVhIAAFgSAABYEgAAWhIAAF0SAABgEgAAiBIAAIoSAACNEgAAkBIAALASAACyEgAAtRIAALgSAAC+EgAAwBIAAMASAADCEgAAxRIAAMgSAADWEgAA2BIAABATAAASEwAAFRMAABgTAABaEwAAgBMAAI8TAAABFAAAbBYAAG8WAAB/FgAAgRYAAJoWAACgFgAA6hYAAPEWAAD4FgAAABcAABEXAAAfFwAAMRcAAEAXAABRFwAAYBcAAGwXAABuFwAAcBcAAIAXAACzFwAA3BcAANwXAAAgGAAAQhgAAEQYAAB4GAAAgBgAAIQYAACHGAAAqBgAAKoYAACqGAAAsBgAAPUYAAAAGQAAHhkAAFAZAABtGQAAcBkAAHQZAACAGQAAqxkAALAZAADJGQAAABoAABYaAAAgGgAAVBoAAAUbAAAzGwAARRsAAEwbAACDGwAAoBsAAK4bAACvGwAAuhsAAOUbAAAAHAAAIxwAAE0cAABPHAAAWhwAAHccAADpHAAA7BwAAO4cAADzHAAA9RwAAPYcAAD6HAAA+hwAADUhAAA4IQAAMC0AAGctAACALQAAli0AAKAtAACmLQAAqC0AAK4tAACwLQAAti0AALgtAAC+LQAAwC0AAMYtAADILQAAzi0AANAtAADWLQAA2C0AAN4tAAAGMAAABjAAADwwAAA8MAAAQTAAAJYwAACfMAAAnzAAAKEwAAD6MAAA/zAAAP8wAAAFMQAALzEAADExAACOMQAAoDEAAL8xAADwMQAA/zEAAAA0AAC/TQAAAE4AABSgAAAWoAAAjKQAANCkAAD3pAAAAKUAAAumAAAQpgAAH6YAACqmAAArpgAAbqYAAG6mAACgpgAA5aYAAI+nAACPpwAA96cAAPenAAD7pwAAAagAAAOoAAAFqAAAB6gAAAqoAAAMqAAAIqgAAECoAABzqAAAgqgAALOoAADyqAAA96gAAPuoAAD7qAAA/agAAP6oAAAKqQAAJakAADCpAABGqQAAYKkAAHypAACEqQAAsqkAAOCpAADkqQAA56kAAO+pAAD6qQAA/qkAAACqAAAoqgAAQKoAAEKqAABEqgAAS6oAAGCqAABvqgAAcaoAAHaqAAB6qgAAeqoAAH6qAACvqgAAsaoAALGqAAC1qgAAtqoAALmqAAC9qgAAwKoAAMCqAADCqgAAwqoAANuqAADcqgAA4KoAAOqqAADyqgAA8qoAAAGrAAAGqwAACasAAA6rAAARqwAAFqsAACCrAAAmqwAAKKsAAC6rAADAqwAA4qsAAACsAACj1wAAsNcAAMbXAADL1wAA+9cAAAD5AABt+gAAcPoAANn6AAAd+wAAHfsAAB/7AAAo+wAAKvsAADb7AAA4+wAAPPsAAD77AAA++wAAQPsAAEH7AABD+wAARPsAAEb7AACx+wAA0/sAAD39AABQ/QAAj/0AAJL9AADH/QAA8P0AAPv9AABw/gAAdP4AAHb+AAD8/gAAZv8AAG//AABx/wAAnf8AAKD/AAC+/wAAwv8AAMf/AADK/wAAz/8AANL/AADX/wAA2v8AANz/AAAAAAEACwABAA0AAQAmAAEAKAABADoAAQA8AAEAPQABAD8AAQBNAAEAUAABAF0AAQCAAAEA+gABAIACAQCcAgEAoAIBANACAQAAAwEAHwMBAC0DAQBAAwEAQgMBAEkDAQBQAwEAdQMBAIADAQCdAwEAoAMBAMMDAQDIAwEAzwMBAFAEAQCdBAEAAAUBACcFAQAwBQEAYwUBAAAGAQA2BwEAQAcBAFUHAQBgBwEAZwcBAAAIAQAFCAEACAgBAAgIAQAKCAEANQgBADcIAQA4CAEAPAgBADwIAQA/CAEAVQgBAGAIAQB2CAEAgAgBAJ4IAQDgCAEA8ggBAPQIAQD1CAEAAAkBABUJAQAgCQEAOQkBAIAJAQC3CQEAvgkBAL8JAQAACgEAAAoBABAKAQATCgEAFQoBABcKAQAZCgEANQoBAGAKAQB8CgEAgAoBAJwKAQDACgEAxwoBAMkKAQDkCgEAAAsBADULAQBACwEAVQsBAGALAQByCwEAgAsBAJELAQAADAEASAwBAAANAQAjDQEAgA4BAKkOAQCwDgEAsQ4BAAAPAQAcDwEAJw8BACcPAQAwDwEARQ8BAHAPAQCBDwEAsA8BAMQPAQDgDwEA9g8BAAMQAQA3EAEAcRABAHIQAQB1EAEAdRABAIMQAQCvEAEA0BABAOgQAQADEQEAJhEBAEQRAQBEEQEARxEBAEcRAQBQEQEAchEBAHYRAQB2EQEAgxEBALIRAQDBEQEAxBEBANoRAQDaEQEA3BEBANwRAQAAEgEAERIBABMSAQArEgEAPxIBAEASAQCAEgEAhhIBAIgSAQCIEgEAihIBAI0SAQCPEgEAnRIBAJ8SAQCoEgEAsBIBAN4SAQAFEwEADBMBAA8TAQAQEwEAExMBACgTAQAqEwEAMBMBADITAQAzEwEANRMBADkTAQA9EwEAPRMBAFATAQBQEwEAXRMBAGETAQAAFAEANBQBAEcUAQBKFAEAXxQBAGEUAQCAFAEArxQBAMQUAQDFFAEAxxQBAMcUAQCAFQEArhUBANgVAQDbFQEAABYBAC8WAQBEFgEARBYBAIAWAQCqFgEAuBYBALgWAQAAFwEAGhcBAEAXAQBGFwEAABgBACsYAQD/GAEABhkBAAkZAQAJGQEADBkBABMZAQAVGQEAFhkBABgZAQAvGQEAPxkBAD8ZAQBBGQEAQRkBAKAZAQCnGQEAqhkBANAZAQDhGQEA4RkBAOMZAQDjGQEAABoBAAAaAQALGgEAMhoBADoaAQA6GgEAUBoBAFAaAQBcGgEAiRoBAJ0aAQCdGgEAsBoBAPgaAQAAHAEACBwBAAocAQAuHAEAQBwBAEAcAQByHAEAjxwBAAAdAQAGHQEACB0BAAkdAQALHQEAMB0BAEYdAQBGHQEAYB0BAGUdAQBnHQEAaB0BAGodAQCJHQEAmB0BAJgdAQDgHgEA8h4BAAIfAQACHwEABB8BABAfAQASHwEAMx8BALAfAQCwHwEAACABAJkjAQCAJAEAQyUBAJAvAQDwLwEAADABAC80AQBBNAEARjQBAABEAQBGRgEAAGgBADhqAQBAagEAXmoBAHBqAQC+agEA0GoBAO1qAQAAawEAL2sBAGNrAQB3awEAfWsBAI9rAQAAbwEASm8BAFBvAQBQbwEAAHABAPeHAQAAiAEA1YwBAACNAQAIjQEAALABACKxAQAysQEAMrEBAFCxAQBSsQEAVbEBAFWxAQBksQEAZ7EBAHCxAQD7sgEAALwBAGq8AQBwvAEAfLwBAIC8AQCIvAEAkLwBAJm8AQAK3wEACt8BAADhAQAs4QEATuEBAE7hAQCQ4gEAreIBAMDiAQDr4gEA0OQBAOrkAQDg5wEA5ucBAOjnAQDr5wEA7ecBAO7nAQDw5wEA/ucBAADoAQDE6AEAAO4BAAPuAQAF7gEAH+4BACHuAQAi7gEAJO4BACTuAQAn7gEAJ+4BACnuAQAy7gEANO4BADfuAQA57gEAOe4BADvuAQA77gEAQu4BAELuAQBH7gEAR+4BAEnuAQBJ7gEAS+4BAEvuAQBN7gEAT+4BAFHuAQBS7gEAVO4BAFTuAQBX7gEAV+4BAFnuAQBZ7gEAW+4BAFvuAQBd7gEAXe4BAF/uAQBf7gEAYe4BAGLuAQBk7gEAZO4BAGfuAQBq7gEAbO4BAHLuAQB07gEAd+4BAHnuAQB87gEAfu4BAH7uAQCA7gEAie4BAIvuAQCb7gEAoe4BAKPuAQCl7gEAqe4BAKvuAQC77gEAAAACAN+mAgAApwIAObcCAEC3AgAduAIAILgCAKHOAgCwzgIA4OsCAAD4AgAd+gIAAAADAEoTAwBQEwMAryMDALIAAACzAAAAuQAAALkAAAC8AAAAvgAAAPQJAAD5CQAAcgsAAHcLAADwCwAA8gsAAHgMAAB+DAAAWA0AAF4NAABwDQAAeA0AACoPAAAzDwAAaRMAAHwTAADwFwAA+RcAANoZAADaGQAAcCAAAHAgAAB0IAAAeSAAAIAgAACJIAAAUCEAAF8hAACJIQAAiSEAAGAkAACbJAAA6iQAAP8kAAB2JwAAkycAAP0sAAD9LAAAkjEAAJUxAAAgMgAAKTIAAEgyAABPMgAAUTIAAF8yAACAMgAAiTIAALEyAAC/MgAAMKgAADWoAAAHAQEAMwEBAHUBAQB4AQEAigEBAIsBAQDhAgEA+wIBACADAQAjAwEAWAgBAF8IAQB5CAEAfwgBAKcIAQCvCAEA+wgBAP8IAQAWCQEAGwkBALwJAQC9CQEAwAkBAM8JAQDSCQEA/wkBAEAKAQBICgEAfQoBAH4KAQCdCgEAnwoBAOsKAQDvCgEAWAsBAF8LAQB4CwEAfwsBAKkLAQCvCwEA+gwBAP8MAQBgDgEAfg4BAB0PAQAmDwEAUQ8BAFQPAQDFDwEAyw8BAFIQAQBlEAEA4REBAPQRAQA6FwEAOxcBAOoYAQDyGAEAWhwBAGwcAQDAHwEA1B8BAFtrAQBhawEAgG4BAJZuAQDA0gEA09IBAODSAQDz0gEAYNMBAHjTAQDH6AEAz+gBAHHsAQCr7AEArewBAK/sAQCx7AEAtOwBAAHtAQAt7QEAL+0BAD3tAQAA8QEADPEBACEAAAAjAAAAJQAAACcAAAAqAAAAKgAAACwAAAAsAAAALgAAAC8AAAA6AAAAOwAAAD8AAABAAAAAXAAAAFwAAAChAAAAoQAAAKcAAACnAAAAtgAAALcAAAC/AAAAvwAAAH4DAAB+AwAAhwMAAIcDAABaBQAAXwUAAIkFAACJBQAAwAUAAMAFAADDBQAAwwUAAMYFAADGBQAA8wUAAPQFAAAJBgAACgYAAAwGAAANBgAAGwYAABsGAAAdBgAAHwYAAGoGAABtBgAA1AYAANQGAAAABwAADQcAAPcHAAD5BwAAMAgAAD4IAABeCAAAXggAAGQJAABlCQAAcAkAAHAJAAD9CQAA/QkAAHYKAAB2CgAA8AoAAPAKAAB3DAAAdwwAAIQMAACEDAAA9A0AAPQNAABPDgAATw4AAFoOAABbDgAABA8AABIPAAAUDwAAFA8AAIUPAACFDwAA0A8AANQPAADZDwAA2g8AAEoQAABPEAAA+xAAAPsQAABgEwAAaBMAAG4WAABuFgAA6xYAAO0WAAA1FwAANhcAANQXAADWFwAA2BcAANoXAAAAGAAABRgAAAcYAAAKGAAARBkAAEUZAAAeGgAAHxoAAKAaAACmGgAAqBoAAK0aAABaGwAAYBsAAH0bAAB+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+EAEAwRABAEARAQBDEQEAdBEBAHURAQDFEQEAyBEBAM0RAQDNEQEA2xEBANsRAQDdEQEA3xEBADgSAQA9EgEAqRIBAKkSAQBLFAEATxQBAFoUAQBbFAEAXRQBAF0UAQDGFAEAxhQBAMEVAQDXFQEAQRYBAEMWAQBgFgEAbBYBALkWAQC5FgEAPBcBAD4XAQA7GAEAOxgBAEQZAQBGGQEA4hkBAOIZAQA/GgEARhoBAJoaAQCcGgEAnhoBAKIaAQAAGwEACRsBAEEcAQBFHAEAcBwBAHEcAQD3HgEA+B4BAEMfAQBPHwEA/x8BAP8fAQBwJAEAdCQBAPEvAQDyLwEAbmoBAG9qAQD1agEA9WoBADdrAQA7awEARGsBAERrAQCXbgEAmm4BAOJvAQDibwEAn7wBAJ+8AQCH2gEAi9oBAF7pAQBf6QEApgAAAKYAAACpAAAAqQAAAK4AAACuAAAAsAAAALAAAACCBAAAggQAAI0FAACOBQAADgYAAA8GAADeBgAA3gYAAOkGAADpBgAA/QYAAP4GAAD2BwAA9gcAAPoJAAD6CQAAcAsAAHALAADzCwAA+AsAAPoLAAD6CwAAfwwAAH8MAABPDQAATw0AAHkNAAB5DQAAAQ8AAAMPAAATDwAAEw8AABUPAAAXDwAAGg8AAB8PAAA0DwAANA8AADYPAAA2DwAAOA8AADgPAAC+DwAAxQ8AAMcPAADMDwAAzg8AAM8PAADVDwAA2A8AAJ4QAACfEAAAkBMAAJkTAABtFgAAbRYAAEAZAABAGQAA3hkAAP8ZAABhGwAAahsAAHQbAAB8GwAAACEAAAEhAAADIQAABiEAAAghAAAJIQAAFCEAABQhAAAWIQAAFyEAAB4hAAAjIQAAJSEAACUhAAAnIQAAJyEAACkhAAApIQAALiEAAC4hAAA6IQAAOyEAAEohAABKIQAATCEAAE0hAABPIQAATyEAAIohAACLIQAAlSEAAJkhAACcIQAAnyEAAKEhAACiIQAApCEAAKUhAACnIQAArSEAAK8hAADNIQAA0CEAANEhAADTIQAA0yEAANUhAADzIQAAACMAAAcjAAAMIwAAHyMAACIjAAAoIwAAKyMAAHsjAAB9IwAAmiMAALQjAADbIwAA4iMAACYkAABAJAAASiQAAJwkAADpJAAAACUAALYlAAC4JQAAwCUAAMIlAAD3JQAAACYAAG4mAABwJgAAZycAAJQnAAC/JwAAACgAAP8oAAAAKwAALysAAEUrAABGKwAATSsAAHMrAAB2KwAAlSsAAJcrAAD/KwAA5SwAAOosAABQLgAAUS4AAIAuAACZLgAAmy4AAPMuAAAALwAA1S8AAPAvAAD7LwAABDAAAAQwAAASMAAAEzAAACAwAAAgMAAANjAAADcwAAA+MAAAPzAAAJAxAACRMQAAljEAAJ8xAADAMQAA4zEAAAAyAAAeMgAAKjIAAEcyAABQMgAAUDIAAGAyAAB/MgAAijIAALAyAADAMgAA/zMAAMBNAAD/TQAAkKQAAMakAAAoqAAAK6gAADaoAAA3qAAAOagAADmoAAB3qgAAeaoAAED9AABP/QAAz/0AAM/9AAD9/QAA//0AAOT/AADk/wAA6P8AAOj/AADt/wAA7v8AAPz/AAD9/wAANwEBAD8BAQB5AQEAiQEBAIwBAQCOAQEAkAEBAJwBAQCgAQEAoAEBANABAQD8AQEAdwgBAHgIAQDICgEAyAoBAD8XAQA/FwEA1R8BANwfAQDhHwEA8R8BADxrAQA/awEARWsBAEVrAQCcvAEAnLwBAFDPAQDDzwEAANABAPXQAQAA0QEAJtEBACnRAQBk0QEAatEBAGzRAQCD0QEAhNEBAIzRAQCp0QEArtEBAOrRAQAA0gEAQdIBAEXSAQBF0gEAANMBAFbTAQAA2AEA/9kBADfaAQA62gEAbdoBAHTaAQB22gEAg9oBAIXaAQCG2gEAT+EBAE/hAQCs7AEArOwBAC7tAQAu7QEAAPABACvwAQAw8AEAk/ABAKDwAQCu8AEAsfABAL/wAQDB8AEAz/ABANHwAQD18AEADfEBAK3xAQDm8QEAAvIBABDyAQA78gEAQPIBAEjyAQBQ8gEAUfIBAGDyAQBl8gEAAPMBAPrzAQAA9AEA1/YBANz2AQDs9gEA8PYBAPz2AQAA9wEAdvcBAHv3AQDZ9wEA4PcBAOv3AQDw9wEA8PcBAAD4AQAL+AEAEPgBAEf4AQBQ+AEAWfgBAGD4AQCH+AEAkPgBAK34AQCw+AEAsfgBAAD5AQBT+gEAYPoBAG36AQBw+gEAfPoBAID6AQCI+gEAkPoBAL36AQC/+gEAxfoBAM76AQDb+gEA4PoBAOj6AQDw+gEA+PoBAAD7AQCS+wEAlPsBAMr7AQApIAAAKSAAAADgAAD/+AAAAAAPAP3/DwAAABAA/f8QACEAAAAjAAAAJQAAACoAAAAsAAAALwAAADoAAAA7AAAAPwAAAEAAAABbAAAAXQAAAF8AAABfAAAAewAAAHsAAAB9AAAAfQAAAKEAAAChAAAApwAAAKcAAACrAAAAqwAAALYAAAC3AAAAuwAAALsAAAC/AAAAvwAAAH4DAAB+AwAAhwMAAIcDAABaBQAAXwUAAIkFAACKBQAAvgUAAL4FAADABQAAwAUAAMMFAADDBQAAxgUAAMYFAADzBQAA9AUAAAkGAAAKBgAADAYAAA0GAAAbBgAAGwYAAB0GAAAfBgAAagYAAG0GAADUBgAA1AYAAAAHAAANBwAA9wcAAPkHAAAwCAAAPggAAF4IAABeCAAAZAkAAGUJAABwCQAAcAkAAP0JAAD9CQAAdgoAAHYKAADwCgAA8AoAAHcMAAB3DAAAhAwAAIQMAAD0DQAA9A0AAE8OAABPDgAAWg4AAFsOAAAEDwAAEg8AABQPAAAUDwAAOg8AAD0PAACFDwAAhQ8AANAPAADUDwAA2Q8AANoPAABKEAAATxAAAPsQAAD7EAAAYBMAAGgTAAAAFAAAABQAAG4WAABuFgAAmxYAAJwWAADrFgAA7RYAADUXAAA2FwAA1BcAANYXAADYFwAA2hcAAAAYAAAKGAAARBkAAEUZAAAeGgAAHxoAAKAaAACmGgAAqBoAAK0aAABaGwAAYBsAAH0bAAB+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/CgEA8AoBAPYKAQA5CwEAPwsBAJkLAQCcCwEArQ4BAK0OAQBVDwEAWQ8BAIYPAQCJDwEARxABAE0QAQC7EAEAvBABAL4QAQDBEAEAQBEBAEMRAQB0EQEAdREBAMURAQDIEQEAzREBAM0RAQDbEQEA2xEBAN0RAQDfEQEAOBIBAD0SAQCpEgEAqRIBAEsUAQBPFAEAWhQBAFsUAQBdFAEAXRQBAMYUAQDGFAEAwRUBANcVAQBBFgEAQxYBAGAWAQBsFgEAuRYBALkWAQA8FwEAPhcBADsYAQA7GAEARBkBAEYZAQDiGQEA4hkBAD8aAQBGGgEAmhoBAJwaAQCeGgEAohoBAAAbAQAJGwEAQRwBAEUcAQBwHAEAcRwBAPceAQD4HgEAQx8BAE8fAQD/HwEA/x8BAHAkAQB0JAEA8S8BAPIvAQBuagEAb2oBAPVqAQD1agEAN2sBADtrAQBEawEARGsBAJduAQCabgEA4m8BAOJvAQCfvAEAn7wBAIfaAQCL2gEAXukBAF/pAQAgAAAAIAAAAKAAAACgAAAAgBYAAIAWAAAAIAAACiAAACggAAApIAAALyAAAC8gAABfIAAAXyAAAAAwAAAAMAAAIAAAACAAAACgAAAAoAAAAIAWAACAFgAAACAAAAogAAAvIAAALyAAAF8gAABfIAAAADAAAAAwAAADCQAAAwkAADsJAAA7CQAAPgkAAEAJAABJCQAATAkAAE4JAABPCQAAggkAAIMJAAC+CQAAwAkAAMcJAADICQAAywkAAMwJAADXCQAA1wkAAAMKAAADCgAAPgoAAEAKAACDCgAAgwoAAL4KAADACgAAyQoAAMkKAADLCgAAzAoAAAILAAADCwAAPgsAAD4LAABACwAAQAsAAEcLAABICwAASwsAAEwLAABXCwAAVwsAAL4LAAC/CwAAwQsAAMILAADGCwAAyAsAAMoLAADMCwAA1wsAANcLAAABDAAAAwwAAEEMAABEDAAAggwAAIMMAAC+DAAAvgwAAMAMAADEDAAAxwwAAMgMAADKDAAAywwAANUMAADWDAAA8wwAAPMMAAACDQAAAw0AAD4NAABADQAARg0AAEgNAABKDQAATA0AAFcNAABXDQAAgg0AAIMNAADPDQAA0Q0AANgNAADfDQAA8g0AAPMNAAA+DwAAPw8AAH8PAAB/DwAAKxAAACwQAAAxEAAAMRAAADgQAAA4EAAAOxAAADwQAABWEAAAVxAAAGIQAABkEAAAZxAAAG0QAACDEAAAhBAAAIcQAACMEAAAjxAAAI8QAACaEAAAnBAAABUXAAAVFwAANBcAADQXAAC2FwAAthcAAL4XAADFFwAAxxcAAMgXAAAjGQAAJhkAACkZAAArGQAAMBkAADEZAAAzGQAAOBkAABkaAAAaGgAAVRoAAFUaAABXGgAAVxoAAGEaAABhGgAAYxoAAGQaAABtGgAAchoAAAQbAAAEGwAANRsAADUbAAA7GwAAOxsAAD0bAABBGwAAQxsAAEQbAACCGwAAghsAAKEbAAChGwAAphsAAKcbAACqGwAAqhsAAOcbAADnGwAA6hsAAOwbAADuGwAA7hsAAPIbAADzGwAAJBwAACscAAA0HAAANRwAAOEcAADhHAAA9xwAAPccAAAuMAAALzAAACOoAAAkqAAAJ6gAACeoAACAqAAAgagAALSoAADDqAAAUqkAAFOpAACDqQAAg6kAALSpAAC1qQAAuqkAALupAAC+qQAAwKkAAC+qAAAwqgAAM6oAADSqAABNqgAATaoAAHuqAAB7qgAAfaoAAH2qAADrqgAA66oAAO6qAADvqgAA9aoAAPWqAADjqwAA5KsAAOarAADnqwAA6asAAOqrAADsqwAA7KsAAAAQAQAAEAEAAhABAAIQAQCCEAEAghABALAQAQCyEAEAtxABALgQAQAsEQEALBEBAEURAQBGEQEAghEBAIIRAQCzEQEAtREBAL8RAQDAEQEAzhEBAM4RAQAsEgEALhIBADISAQAzEgEANRIBADUSAQDgEgEA4hIBAAITAQADEwEAPhMBAD8TAQBBEwEARBMBAEcTAQBIEwEASxMBAE0TAQBXEwEAVxMBAGITAQBjEwEANRQBADcUAQBAFAEAQRQBAEUUAQBFFAEAsBQBALIUAQC5FAEAuRQBALsUAQC+FAEAwRQBAMEUAQCvFQEAsRUBALgVAQC7FQEAvhUBAL4VAQAwFgEAMhYBADsWAQA8FgEAPhYBAD4WAQCsFgEArBYBAK4WAQCvFgEAthYBALYWAQAgFwEAIRcBACYXAQAmFwEALBgBAC4YAQA4GAEAOBgBADAZAQA1GQEANxkBADgZAQA9GQEAPRkBAEAZAQBAGQEAQhkBAEIZAQDRGQEA0xkBANwZAQDfGQEA5BkBAOQZAQA5GgEAORoBAFcaAQBYGgEAlxoBAJcaAQAvHAEALxwBAD4cAQA+HAEAqRwBAKkcAQCxHAEAsRwBALQcAQC0HAEAih0BAI4dAQCTHQEAlB0BAJYdAQCWHQEA9R4BAPYeAQADHwEAAx8BADQfAQA1HwEAPh8BAD8fAQBBHwEAQR8BAFFvAQCHbwEA8G8BAPFvAQBl0QEAZtEBAG3RAQBy0QEAJAAAACQAAAArAAAAKwAAADwAAAA+AAAAXgAAAF4AAABgAAAAYAAAAHwAAAB8AAAAfgAAAH4AAACiAAAApgAAAKgAAACpAAAArAAAAKwAAACuAAAAsQAAALQAAAC0AAAAuAAAALgAAADXAAAA1wAAAPcAAAD3AAAAwgIAAMUCAADSAgAA3wIAAOUCAADrAgAA7QIAAO0CAADvAgAA/wIAAHUDAAB1AwAAhAMAAIUDAAD2AwAA9gMAAIIEAACCBAAAjQUAAI8FAAAGBgAACAYAAAsGAAALBgAADgYAAA8GAADeBgAA3gYAAOkGAADpBgAA/QYAAP4GAAD2BwAA9gcAAP4HAAD/BwAAiAgAAIgIAADyCQAA8wkAAPoJAAD7CQAA8QoAAPEKAABwCwAAcAsAAPMLAAD6CwAAfwwAAH8MAABPDQAATw0AAHkNAAB5DQAAPw4AAD8OAAABDwAAAw8AABMPAAATDwAAFQ8AABcPAAAaDwAAHw8AADQPAAA0DwAANg8AADYPAAA4DwAAOA8AAL4PAADFDwAAxw8AAMwPAADODwAAzw8AANUPAADYDwAAnhAAAJ8QAACQEwAAmRMAAG0WAABtFgAA2xcAANsXAABAGQAAQBkAAN4ZAAD/GQAAYRsAAGobAAB0GwAAfBsAAL0fAAC9HwAAvx8AAMEfAADNHwAAzx8AAN0fAADfHwAA7R8AAO8fAAD9HwAA/h8AAEQgAABEIAAAUiAAAFIgAAB6IAAAfCAAAIogAACMIAAAoCAAAMAgAAAAIQAAASEAAAMhAAAGIQAACCEAAAkhAAAUIQAAFCEAABYhAAAYIQAAHiEAACMhAAAlIQAAJSEAACchAAAnIQAAKSEAACkhAAAuIQAALiEAADohAAA7IQAAQCEAAEQhAABKIQAATSEAAE8hAABPIQAAiiEAAIshAACQIQAAByMAAAwjAAAoIwAAKyMAACYkAABAJAAASiQAAJwkAADpJAAAACUAAGcnAACUJwAAxCcAAMcnAADlJwAA8CcAAIIpAACZKQAA1ykAANwpAAD7KQAA/ikAAHMrAAB2KwAAlSsAAJcrAAD/KwAA5SwAAOosAABQLgAAUS4AAIAuAACZLgAAmy4AAPMuAAAALwAA1S8AAPAvAAD7LwAABDAAAAQwAAASMAAAEzAAACAwAAAgMAAANjAAADcwAAA+MAAAPzAAAJswAACcMAAAkDEAAJExAACWMQAAnzEAAMAxAADjMQAAADIAAB4yAAAqMgAARzIAAFAyAABQMgAAYDIAAH8yAACKMgAAsDIAAMAyAAD/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/AAA3AQEAPwEBAHkBAQCJAQEAjAEBAI4BAQCQAQEAnAEBAKABAQCgAQEA0AEBAPwBAQB3CAEAeAgBAMgKAQDICgEAPxcBAD8XAQDVHwEA8R8BADxrAQA/awEARWsBAEVrAQCcvAEAnLwBAFDPAQDDzwEAANABAPXQAQAA0QEAJtEBACnRAQBk0QEAatEBAGzRAQCD0QEAhNEBAIzRAQCp0QEArtEBAOrRAQAA0gEAQdIBAEXSAQBF0gEAANMBAFbTAQDB1gEAwdYBANvWAQDb1gEA+9YBAPvWAQAV1wEAFdcBADXXAQA11wEAT9cBAE/XAQBv1wEAb9cBAInXAQCJ1wEAqdcBAKnXAQDD1wEAw9cBAADYAQD/2QEAN9oBADraAQBt2gEAdNoBAHbaAQCD2gEAhdoBAIbaAQBP4QEAT+EBAP/iAQD/4gEArOwBAKzsAQCw7AEAsOwBAC7tAQAu7QEA8O4BAPHuAQAA8AEAK/ABADDwAQCT8AEAoPABAK7wAQCx8AEAv/ABAMHwAQDP8AEA0fABAPXwAQAN8QEArfEBAObxAQAC8gEAEPIBADvyAQBA8gEASPIBAFDyAQBR8gEAYPIBAGXyAQAA8wEA1/YBANz2AQDs9gEA8PYBAPz2AQAA9wEAdvcBAHv3AQDZ9wEA4PcBAOv3AQDw9wEA8PcBAAD4AQAL+AEAEPgBAEf4AQBQ+AEAWfgBAGD4AQCH+AEAkPgBAK34AQCw+AEAsfgBAAD5AQBT+gEAYPoBAG36AQBw+gEAfPoBAID6AQCI+gEAkPoBAL36AQC/+gEAxfoBAM76AQDb+gEA4PoBAOj6AQDw+gEA+PoBAAD7AQCS+wEAlPsBAMr7AQDFAQAAxQEAAMgBAADIAQAAywEAAMsBAADyAQAA8gEAAIgfAACPHwAAmB8AAJ8fAACoHwAArx8AALwfAAC8HwAAzB8AAMwfAAD8HwAA/B8AAHgDAAB5AwAAgAMAAIMDAACLAwAAiwMAAI0DAACNAwAAogMAAKIDAAAwBQAAMAUAAFcFAABYBQAAiwUAAIwFAACQBQAAkAUAAMgFAADPBQAA6wUAAO4FAAD1BQAA/wUAAA4HAAAOBwAASwcAAEwHAACyBwAAvwcAAPsHAAD8BwAALggAAC8IAAA/CAAAPwgAAFwIAABdCAAAXwgAAF8IAABrCAAAbwgAAI8IAACPCAAAkggAAJcIAACECQAAhAkAAI0JAACOCQAAkQkAAJIJAACpCQAAqQkAALEJAACxCQAAswkAALUJAAC6CQAAuwkAAMUJAADGCQAAyQkAAMoJAADPCQAA1gkAANgJAADbCQAA3gkAAN4JAADkCQAA5QkAAP8JAAAACgAABAoAAAQKAAALCgAADgoAABEKAAASCgAAKQoAACkKAAAxCgAAMQoAADQKAAA0CgAANwoAADcKAAA6CgAAOwoAAD0KAAA9CgAAQwoAAEYKAABJCgAASgoAAE4KAABQCgAAUgoAAFgKAABdCgAAXQoAAF8KAABlCgAAdwoAAIAKAACECgAAhAoAAI4KAACOCgAAkgoAAJIKAACpCgAAqQoAALEKAACxCgAAtAoAALQKAAC6CgAAuwoAAMYKAADGCgAAygoAAMoKAADOCgAAzwoAANEKAADfCgAA5AoAAOUKAADyCgAA+AoAAAALAAAACwAABAsAAAQLAAANCwAADgsAABELAAASCwAAKQsAACkLAAAxCwAAMQsAADQLAAA0CwAAOgsAADsLAABFCwAARgsAAEkLAABKCwAATgsAAFQLAABYCwAAWwsAAF4LAABeCwAAZAsAAGULAAB4CwAAgQsAAIQLAACECwAAiwsAAI0LAACRCwAAkQsAAJYLAACYCwAAmwsAAJsLAACdCwAAnQsAAKALAACiCwAApQsAAKcLAACrCwAArQsAALoLAAC9CwAAwwsAAMULAADJCwAAyQsAAM4LAADPCwAA0QsAANYLAADYCwAA5QsAAPsLAAD/CwAADQwAAA0MAAARDAAAEQwAACkMAAApDAAAOgwAADsMAABFDAAARQwAAEkMAABJDAAATgwAAFQMAABXDAAAVwwAAFsMAABcDAAAXgwAAF8MAABkDAAAZQwAAHAMAAB2DAAAjQwAAI0MAACRDAAAkQwAAKkMAACpDAAAtAwAALQMAAC6DAAAuwwAAMUMAADFDAAAyQwAAMkMAADODAAA1AwAANcMAADcDAAA3wwAAN8MAADkDAAA5QwAAPAMAADwDAAA9AwAAP8MAAANDQAADQ0AABENAAARDQAARQ0AAEUNAABJDQAASQ0AAFANAABTDQAAZA0AAGUNAACADQAAgA0AAIQNAACEDQAAlw0AAJkNAACyDQAAsg0AALwNAAC8DQAAvg0AAL8NAADHDQAAyQ0AAMsNAADODQAA1Q0AANUNAADXDQAA1w0AAOANAADlDQAA8A0AAPENAAD1DQAAAA4AADsOAAA+DgAAXA4AAIAOAACDDgAAgw4AAIUOAACFDgAAiw4AAIsOAACkDgAApA4AAKYOAACmDgAAvg4AAL8OAADFDgAAxQ4AAMcOAADHDgAAzw4AAM8OAADaDgAA2w4AAOAOAAD/DgAASA8AAEgPAABtDwAAcA8AAJgPAACYDwAAvQ8AAL0PAADNDwAAzQ8AANsPAAD/DwAAxhAAAMYQAADIEAAAzBAAAM4QAADPEAAASRIAAEkSAABOEgAATxIAAFcSAABXEgAAWRIAAFkSAABeEgAAXxIAAIkSAACJEgAAjhIAAI8SAACxEgAAsRIAALYSAAC3EgAAvxIAAL8SAADBEgAAwRIAAMYSAADHEgAA1xIAANcSAAAREwAAERMAABYTAAAXEwAAWxMAAFwTAAB9EwAAfxMAAJoTAACfEwAA9hMAAPcTAAD+EwAA/xMAAJ0WAACfFgAA+RYAAP8WAAAWFwAAHhcAADcXAAA/FwAAVBcAAF8XAABtFwAAbRcAAHEXAABxFwAAdBcAAH8XAADeFwAA3xcAAOoXAADvFwAA+hcAAP8XAAAaGAAAHxgAAHkYAAB/GAAAqxgAAK8YAAD2GAAA/xgAAB8ZAAAfGQAALBkAAC8ZAAA8GQAAPxkAAEEZAABDGQAAbhkAAG8ZAAB1GQAAfxkAAKwZAACvGQAAyhkAAM8ZAADbGQAA3RkAABwaAAAdGgAAXxoAAF8aAAB9GgAAfhoAAIoaAACPGgAAmhoAAJ8aAACuGgAArxoAAM8aAAD/GgAATRsAAE8bAAB/GwAAfxsAAPQbAAD7GwAAOBwAADocAABKHAAATBwAAIkcAACPHAAAuxwAALwcAADIHAAAzxwAAPscAAD/HAAAFh8AABcfAAAeHwAAHx8AAEYfAABHHwAATh8AAE8fAABYHwAAWB8AAFofAABaHwAAXB8AAFwfAABeHwAAXh8AAH4fAAB/HwAAtR8AALUfAADFHwAAxR8AANQfAADVHwAA3B8AANwfAADwHwAA8R8AAPUfAAD1HwAA/x8AAP8fAABlIAAAZSAAAHIgAABzIAAAjyAAAI8gAACdIAAAnyAAAMEgAADPIAAA8SAAAP8gAACMIQAAjyEAACckAAA/JAAASyQAAF8kAAB0KwAAdSsAAJYrAACWKwAA9CwAAPgsAAAmLQAAJi0AACgtAAAsLQAALi0AAC8tAABoLQAAbi0AAHEtAAB+LQAAly0AAJ8tAACnLQAApy0AAK8tAACvLQAAty0AALctAAC/LQAAvy0AAMctAADHLQAAzy0AAM8tAADXLQAA1y0AAN8tAADfLQAAXi4AAH8uAACaLgAAmi4AAPQuAAD/LgAA1i8AAO8vAAD8LwAA/y8AAEAwAABAMAAAlzAAAJgwAAAAMQAABDEAADAxAAAwMQAAjzEAAI8xAADkMQAA7zEAAB8yAAAfMgAAjaQAAI+kAADHpAAAz6QAACymAAA/pgAA+KYAAP+mAADLpwAAz6cAANKnAADSpwAA1KcAANSnAADapwAA8acAAC2oAAAvqAAAOqgAAD+oAAB4qAAAf6gAAMaoAADNqAAA2qgAAN+oAABUqQAAXqkAAH2pAAB/qQAAzqkAAM6pAADaqQAA3akAAP+pAAD/qQAAN6oAAD+qAABOqgAAT6oAAFqqAABbqgAAw6oAANqqAAD3qgAAAKsAAAerAAAIqwAAD6sAABCrAAAXqwAAH6sAACerAAAnqwAAL6sAAC+rAABsqwAAb6sAAO6rAADvqwAA+qsAAP+rAACk1wAAr9cAAMfXAADK1wAA/NcAAP/XAABu+gAAb/oAANr6AAD/+gAAB/sAABL7AAAY+wAAHPsAADf7AAA3+wAAPfsAAD37AAA/+wAAP/sAAEL7AABC+wAARfsAAEX7AADD+wAA0vsAAJD9AACR/QAAyP0AAM79AADQ/QAA7/0AABr+AAAf/gAAU/4AAFP+AABn/gAAZ/4AAGz+AABv/gAAdf4AAHX+AAD9/gAA/v4AAAD/AAAA/wAAv/8AAMH/AADI/wAAyf8AAND/AADR/wAA2P8AANn/AADd/wAA3/8AAOf/AADn/wAA7/8AAPj/AAD+/wAA//8AAAwAAQAMAAEAJwABACcAAQA7AAEAOwABAD4AAQA+AAEATgABAE8AAQBeAAEAfwABAPsAAQD/AAEAAwEBAAYBAQA0AQEANgEBAI8BAQCPAQEAnQEBAJ8BAQChAQEAzwEBAP4BAQB/AgEAnQIBAJ8CAQDRAgEA3wIBAPwCAQD/AgEAJAMBACwDAQBLAwEATwMBAHsDAQB/AwEAngMBAJ4DAQDEAwEAxwMBANYDAQD/AwEAngQBAJ8EAQCqBAEArwQBANQEAQDXBAEA/AQBAP8EAQAoBQEALwUBAGQFAQBuBQEAewUBAHsFAQCLBQEAiwUBAJMFAQCTBQEAlgUBAJYFAQCiBQEAogUBALIFAQCyBQEAugUBALoFAQC9BQEA/wUBADcHAQA/BwEAVgcBAF8HAQBoBwEAfwcBAIYHAQCGBwEAsQcBALEHAQC7BwEA/wcBAAYIAQAHCAEACQgBAAkIAQA2CAEANggBADkIAQA7CAEAPQgBAD4IAQBWCAEAVggBAJ8IAQCmCAEAsAgBAN8IAQDzCAEA8wgBAPYIAQD6CAEAHAkBAB4JAQA6CQEAPgkBAEAJAQB/CQEAuAkBALsJAQDQCQEA0QkBAAQKAQAECgEABwoBAAsKAQAUCgEAFAoBABgKAQAYCgEANgoBADcKAQA7CgEAPgoBAEkKAQBPCgEAWQoBAF8KAQCgCgEAvwoBAOcKAQDqCgEA9woBAP8KAQA2CwEAOAsBAFYLAQBXCwEAcwsBAHcLAQCSCwEAmAsBAJ0LAQCoCwEAsAsBAP8LAQBJDAEAfwwBALMMAQC/DAEA8wwBAPkMAQAoDQEALw0BADoNAQBfDgEAfw4BAH8OAQCqDgEAqg4BAK4OAQCvDgEAsg4BAPwOAQAoDwEALw8BAFoPAQBvDwEAig8BAK8PAQDMDwEA3w8BAPcPAQD/DwEAThABAFEQAQB2EAEAfhABAMMQAQDMEAEAzhABAM8QAQDpEAEA7xABAPoQAQD/EAEANREBADURAQBIEQEATxEBAHcRAQB/EQEA4BEBAOARAQD1EQEA/xEBABISAQASEgEAQhIBAH8SAQCHEgEAhxIBAIkSAQCJEgEAjhIBAI4SAQCeEgEAnhIBAKoSAQCvEgEA6xIBAO8SAQD6EgEA/xIBAAQTAQAEEwEADRMBAA4TAQAREwEAEhMBACkTAQApEwEAMRMBADETAQA0EwEANBMBADoTAQA6EwEARRMBAEYTAQBJEwEAShMBAE4TAQBPEwEAURMBAFYTAQBYEwEAXBMBAGQTAQBlEwEAbRMBAG8TAQB1EwEA/xMBAFwUAQBcFAEAYhQBAH8UAQDIFAEAzxQBANoUAQB/FQEAthUBALcVAQDeFQEA/xUBAEUWAQBPFgEAWhYBAF8WAQBtFgEAfxYBALoWAQC/FgEAyhYBAP8WAQAbFwEAHBcBACwXAQAvFwEARxcBAP8XAQA8GAEAnxgBAPMYAQD+GAEABxkBAAgZAQAKGQEACxkBABQZAQAUGQEAFxkBABcZAQA2GQEANhkBADkZAQA6GQEARxkBAE8ZAQBaGQEAnxkBAKgZAQCpGQEA2BkBANkZAQDlGQEA/xkBAEgaAQBPGgEAoxoBAK8aAQD5GgEA/xoBAAobAQD/GwEACRwBAAkcAQA3HAEANxwBAEYcAQBPHAEAbRwBAG8cAQCQHAEAkRwBAKgcAQCoHAEAtxwBAP8cAQAHHQEABx0BAAodAQAKHQEANx0BADkdAQA7HQEAOx0BAD4dAQA+HQEASB0BAE8dAQBaHQEAXx0BAGYdAQBmHQEAaR0BAGkdAQCPHQEAjx0BAJIdAQCSHQEAmR0BAJ8dAQCqHQEA3x4BAPkeAQD/HgEAER8BABEfAQA7HwEAPR8BAFofAQCvHwEAsR8BAL8fAQDyHwEA/h8BAJojAQD/IwEAbyQBAG8kAQB1JAEAfyQBAEQlAQCPLwEA8y8BAP8vAQBWNAEA/0MBAEdGAQD/ZwEAOWoBAD9qAQBfagEAX2oBAGpqAQBtagEAv2oBAL9qAQDKagEAz2oBAO5qAQDvagEA9moBAP9qAQBGawEAT2sBAFprAQBaawEAYmsBAGJrAQB4awEAfGsBAJBrAQA/bgEAm24BAP9uAQBLbwEATm8BAIhvAQCObwEAoG8BAN9vAQDlbwEA728BAPJvAQD/bwEA+IcBAP+HAQDWjAEA/4wBAAmNAQDvrwEA9K8BAPSvAQD8rwEA/K8BAP+vAQD/rwEAI7EBADGxAQAzsQEAT7EBAFOxAQBUsQEAVrEBAGOxAQBosQEAb7EBAPyyAQD/uwEAa7wBAG+8AQB9vAEAf7wBAIm8AQCPvAEAmrwBAJu8AQCkvAEA/84BAC7PAQAvzwEAR88BAE/PAQDEzwEA/88BAPbQAQD/0AEAJ9EBACjRAQDr0QEA/9EBAEbSAQC/0gEA1NIBAN/SAQD00gEA/9IBAFfTAQBf0wEAedMBAP/TAQBV1AEAVdQBAJ3UAQCd1AEAoNQBAKHUAQCj1AEApNQBAKfUAQCo1AEArdQBAK3UAQC61AEAutQBALzUAQC81AEAxNQBAMTUAQAG1QEABtUBAAvVAQAM1QEAFdUBABXVAQAd1QEAHdUBADrVAQA61QEAP9UBAD/VAQBF1QEARdUBAEfVAQBJ1QEAUdUBAFHVAQCm1gEAp9YBAMzXAQDN1wEAjNoBAJraAQCg2gEAoNoBALDaAQD/3gEAH98BACTfAQAr3wEA/98BAAfgAQAH4AEAGeABABrgAQAi4AEAIuABACXgAQAl4AEAK+ABAC/gAQBu4AEAjuABAJDgAQD/4AEALeEBAC/hAQA+4QEAP+EBAErhAQBN4QEAUOEBAI/iAQCv4gEAv+IBAPriAQD+4gEAAOMBAM/kAQD65AEA3+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/gBALL4AQD/+AEAVPoBAF/6AQBu+gEAb/oBAH36AQB/+gEAifoBAI/6AQC++gEAvvoBAMb6AQDN+gEA3PoBAN/6AQDp+gEA7/oBAPn6AQD/+gEAk/sBAJP7AQDL+wEA7/sBAPr7AQD//wEA4KYCAP+mAgA6twIAP7cCAB64AgAfuAIAos4CAK/OAgDh6wIA//cCAB76AgD//wIASxMDAE8TAwCwIwMAAAAOAAIADgAfAA4AgAAOAP8ADgDwAQ4A//8OAP7/DwD//w8A/v8QAP//EABBAAAAWgAAAMAAAADWAAAA2AAAAN4AAAAAAQAAAAEAAAIBAAACAQAABAEAAAQBAAAGAQAABgEAAAgBAAAIAQAACgEAAAoBAAAMAQAADAEAAA4BAAAOAQAAEAEAABABAAASAQAAEgEAABQBAAAUAQAAFgEAABYBAAAYAQAAGAEAABoBAAAaAQAAHAEAABwBAAAeAQAAHgEAACABAAAgAQAAIgEAACIBAAAkAQAAJAEAACYBAAAmAQAAKAEAACgBAAAqAQAAKgEAACwBAAAsAQAALgEAAC4BAAAwAQAAMAEAADIBAAAyAQAANAEAADQBAAA2AQAANgEAADkBAAA5AQAAOwEAADsBAAA9AQAAPQEAAD8BAAA/AQAAQQEAAEEBAABDAQAAQwEAAEUBAABFAQAARwEAAEcBAABKAQAASgEAAEwBAABMAQAATgEAAE4BAABQAQAAUAEAAFIBAABSAQAAVAEAAFQBAABWAQAAVgEAAFgBAABYAQAAWgEAAFoBAABcAQAAXAEAAF4BAABeAQAAYAEAAGABAABiAQAAYgEAAGQBAABkAQAAZgEAAGYBAABoAQAAaAEAAGoBAABqAQAAbAEAAGwBAABuAQAAbgEAAHABAABwAQAAcgEAAHIBAAB0AQAAdAEAAHYBAAB2AQAAeAEAAHkBAAB7AQAAewEAAH0BAAB9AQAAgQEAAIIBAACEAQAAhAEAAIYBAACHAQAAiQEAAIsBAACOAQAAkQEAAJMBAACUAQAAlgEAAJgBAACcAQAAnQEAAJ8BAACgAQAAogEAAKIBAACkAQAApAEAAKYBAACnAQAAqQEAAKkBAACsAQAArAEAAK4BAACvAQAAsQEAALMBAAC1AQAAtQEAALcBAAC4AQAAvAEAALwBAADEAQAAxAEAAMcBAADHAQAAygEAAMoBAADNAQAAzQEAAM8BAADPAQAA0QEAANEBAADTAQAA0wEAANUBAADVAQAA1wEAANcBAADZAQAA2QEAANsBAADbAQAA3gEAAN4BAADgAQAA4AEAAOIBAADiAQAA5AEAAOQBAADmAQAA5gEAAOgBAADoAQAA6gEAAOoBAADsAQAA7AEAAO4BAADuAQAA8QEAAPEBAAD0AQAA9AEAAPYBAAD4AQAA+gEAAPoBAAD8AQAA/AEAAP4BAAD+AQAAAAIAAAACAAACAgAAAgIAAAQCAAAEAgAABgIAAAYCAAAIAgAACAIAAAoCAAAKAgAADAIAAAwCAAAOAgAADgIAABACAAAQAgAAEgIAABICAAAUAgAAFAIAABYCAAAWAgAAGAIAABgCAAAaAgAAGgIAABwCAAAcAgAAHgIAAB4CAAAgAgAAIAIAACICAAAiAgAAJAIAACQCAAAmAgAAJgIAACgCAAAoAgAAKgIAACoCAAAsAgAALAIAAC4CAAAuAgAAMAIAADACAAAyAgAAMgIAADoCAAA7AgAAPQIAAD4CAABBAgAAQQIAAEMCAABGAgAASAIAAEgCAABKAgAASgIAAEwCAABMAgAATgIAAE4CAABwAwAAcAMAAHIDAAByAwAAdgMAAHYDAAB/AwAAfwMAAIYDAACGAwAAiAMAAIoDAACMAwAAjAMAAI4DAACPAwAAkQMAAKEDAACjAwAAqwMAAM8DAADPAwAA0gMAANQDAADYAwAA2AMAANoDAADaAwAA3AMAANwDAADeAwAA3gMAAOADAADgAwAA4gMAAOIDAADkAwAA5AMAAOYDAADmAwAA6AMAAOgDAADqAwAA6gMAAOwDAADsAwAA7gMAAO4DAAD0AwAA9AMAAPcDAAD3AwAA+QMAAPoDAAD9AwAALwQAAGAEAABgBAAAYgQAAGIEAABkBAAAZAQAAGYEAABmBAAAaAQAAGgEAABqBAAAagQAAGwEAABsBAAAbgQAAG4EAABwBAAAcAQAAHIEAAByBAAAdAQAAHQEAAB2BAAAdgQAAHgEAAB4BAAAegQAAHoEAAB8BAAAfAQAAH4EAAB+BAAAgAQAAIAEAACKBAAAigQAAIwEAACMBAAAjgQAAI4EAACQBAAAkAQAAJIEAACSBAAAlAQAAJQEAACWBAAAlgQAAJgEAACYBAAAmgQAAJoEAACcBAAAnAQAAJ4EAACeBAAAoAQAAKAEAACiBAAAogQAAKQEAACkBAAApgQAAKYEAACoBAAAqAQAAKoEAACqBAAArAQAAKwEAACuBAAArgQAALAEAACwBAAAsgQAALIEAAC0BAAAtAQAALYEAAC2BAAAuAQAALgEAAC6BAAAugQAALwEAAC8BAAAvgQAAL4EAADABAAAwQQAAMMEAADDBAAAxQQAAMUEAADHBAAAxwQAAMkEAADJBAAAywQAAMsEAADNBAAAzQQAANAEAADQBAAA0gQAANIEAADUBAAA1AQAANYEAADWBAAA2AQAANgEAADaBAAA2gQAANwEAADcBAAA3gQAAN4EAADgBAAA4AQAAOIEAADiBAAA5AQAAOQEAADmBAAA5gQAAOgEAADoBAAA6gQAAOoEAADsBAAA7AQAAO4EAADuBAAA8AQAAPAEAADyBAAA8gQAAPQEAAD0BAAA9gQAAPYEAAD4BAAA+AQAAPoEAAD6BAAA/AQAAPwEAAD+BAAA/gQAAAAFAAAABQAAAgUAAAIFAAAEBQAABAUAAAYFAAAGBQAACAUAAAgFAAAKBQAACgUAAAwFAAAMBQAADgUAAA4FAAAQBQAAEAUAABIFAAASBQAAFAUAABQFAAAWBQAAFgUAABgFAAAYBQAAGgUAABoFAAAcBQAAHAUAAB4FAAAeBQAAIAUAACAFAAAiBQAAIgUAACQFAAAkBQAAJgUAACYFAAAoBQAAKAUAACoFAAAqBQAALAUAACwFAAAuBQAALgUAADEFAABWBQAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAAoBMAAPUTAACQHAAAuhwAAL0cAAC/HAAAAB4AAAAeAAACHgAAAh4AAAQeAAAEHgAABh4AAAYeAAAIHgAACB4AAAoeAAAKHgAADB4AAAweAAAOHgAADh4AABAeAAAQHgAAEh4AABIeAAAUHgAAFB4AABYeAAAWHgAAGB4AABgeAAAaHgAAGh4AABweAAAcHgAAHh4AAB4eAAAgHgAAIB4AACIeAAAiHgAAJB4AACQeAAAmHgAAJh4AACgeAAAoHgAAKh4AACoeAAAsHgAALB4AAC4eAAAuHgAAMB4AADAeAAAyHgAAMh4AADQeAAA0HgAANh4AADYeAAA4HgAAOB4AADoeAAA6HgAAPB4AADweAAA+HgAAPh4AAEAeAABAHgAAQh4AAEIeAABEHgAARB4AAEYeAABGHgAASB4AAEgeAABKHgAASh4AAEweAABMHgAATh4AAE4eAABQHgAAUB4AAFIeAABSHgAAVB4AAFQeAABWHgAAVh4AAFgeAABYHgAAWh4AAFoeAABcHgAAXB4AAF4eAABeHgAAYB4AAGAeAABiHgAAYh4AAGQeAABkHgAAZh4AAGYeAABoHgAAaB4AAGoeAABqHgAAbB4AAGweAABuHgAAbh4AAHAeAABwHgAAch4AAHIeAAB0HgAAdB4AAHYeAAB2HgAAeB4AAHgeAAB6HgAAeh4AAHweAAB8HgAAfh4AAH4eAACAHgAAgB4AAIIeAACCHgAAhB4AAIQeAACGHgAAhh4AAIgeAACIHgAAih4AAIoeAACMHgAAjB4AAI4eAACOHgAAkB4AAJAeAACSHgAAkh4AAJQeAACUHgAAnh4AAJ4eAACgHgAAoB4AAKIeAACiHgAApB4AAKQeAACmHgAAph4AAKgeAACoHgAAqh4AAKoeAACsHgAArB4AAK4eAACuHgAAsB4AALAeAACyHgAAsh4AALQeAAC0HgAAth4AALYeAAC4HgAAuB4AALoeAAC6HgAAvB4AALweAAC+HgAAvh4AAMAeAADAHgAAwh4AAMIeAADEHgAAxB4AAMYeAADGHgAAyB4AAMgeAADKHgAAyh4AAMweAADMHgAAzh4AAM4eAADQHgAA0B4AANIeAADSHgAA1B4AANQeAADWHgAA1h4AANgeAADYHgAA2h4AANoeAADcHgAA3B4AAN4eAADeHgAA4B4AAOAeAADiHgAA4h4AAOQeAADkHgAA5h4AAOYeAADoHgAA6B4AAOoeAADqHgAA7B4AAOweAADuHgAA7h4AAPAeAADwHgAA8h4AAPIeAAD0HgAA9B4AAPYeAAD2HgAA+B4AAPgeAAD6HgAA+h4AAPweAAD8HgAA/h4AAP4eAAAIHwAADx8AABgfAAAdHwAAKB8AAC8fAAA4HwAAPx8AAEgfAABNHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAF8fAABoHwAAbx8AALgfAAC7HwAAyB8AAMsfAADYHwAA2x8AAOgfAADsHwAA+B8AAPsfAAACIQAAAiEAAAchAAAHIQAACyEAAA0hAAAQIQAAEiEAABUhAAAVIQAAGSEAAB0hAAAkIQAAJCEAACYhAAAmIQAAKCEAACghAAAqIQAALSEAADAhAAAzIQAAPiEAAD8hAABFIQAARSEAAIMhAACDIQAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKnAABEpwAARKcAAEanAABGpwAASKcAAEinAABKpwAASqcAAEynAABMpwAATqcAAE6nAABQpwAAUKcAAFKnAABSpwAAVKcAAFSnAABWpwAAVqcAAFinAABYpwAAWqcAAFqnAABcpwAAXKcAAF6nAABepwAAYKcAAGCnAABipwAAYqcAAGSnAABkpwAAZqcAAGanAABopwAAaKcAAGqnAABqpwAAbKcAAGynAABupwAAbqcAAHmnAAB5pwAAe6cAAHunAAB9pwAAfqcAAICnAACApwAAgqcAAIKnAACEpwAAhKcAAIanAACGpwAAi6cAAIunAACNpwAAjacAAJCnAACQpwAAkqcAAJKnAACWpwAAlqcAAJinAACYpwAAmqcAAJqnAACcpwAAnKcAAJ6nAACepwAAoKcAAKCnAACipwAAoqcAAKSnAACkpwAApqcAAKanAACopwAAqKcAAKqnAACupwAAsKcAALSnAAC2pwAAtqcAALinAAC4pwAAuqcAALqnAAC8pwAAvKcAAL6nAAC+pwAAwKcAAMCnAADCpwAAwqcAAMSnAADHpwAAyacAAMmnAADQpwAA0KcAANanAADWpwAA2KcAANinAAD1pwAA9acAACH/AAA6/wAAAAQBACcEAQCwBAEA0wQBAHAFAQB6BQEAfAUBAIoFAQCMBQEAkgUBAJQFAQCVBQEAgAwBALIMAQCgGAEAvxgBAEBuAQBfbgEAANQBABnUAQA01AEATdQBAGjUAQCB1AEAnNQBAJzUAQCe1AEAn9QBAKLUAQCi1AEApdQBAKbUAQCp1AEArNQBAK7UAQC11AEA0NQBAOnUAQAE1QEABdUBAAfVAQAK1QEADdUBABTVAQAW1QEAHNUBADjVAQA51QEAO9UBAD7VAQBA1QEARNUBAEbVAQBG1QEAStUBAFDVAQBs1QEAhdUBAKDVAQC51QEA1NUBAO3VAQAI1gEAIdYBADzWAQBV1gEAcNYBAInWAQCo1gEAwNYBAOLWAQD61gEAHNcBADTXAQBW1wEAbtcBAJDXAQCo1wEAytcBAMrXAQAA6QEAIekBAG9+IQAMAAAAFPEkAI8AAACafiEAEQAAAIz1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YWwgaXMgbm90IGEgVW5pY29kZSBzY2FsYXIgdmFsdWVpbnZhbGlkIGhleGFkZWNpbWFsIGRpZ2l0aW5jb21wbGV0ZSBlc2NhcGUgc2VxdWVuY2UsIHJlYWNoZWQgZW5kIG9mIHBhdHRlcm4gcHJlbWF0dXJlbHl1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlZGFuZ2xpbmcgZmxhZyBuZWdhdGlvbiBvcGVyYXRvcmR1cGxpY2F0ZSBmbGFnZmxhZyBuZWdhdGlvbiBvcGVyYXRvciByZXBlYXRlZGV4cGVjdGVkIGZsYWcgYnV0IGdvdCBlbmQgb2YgcmVnZXh1bnJlY29nbml6ZWQgZmxhZ2R1cGxpY2F0ZSBjYXB0dXJlIGdyb3VwIG5hbWVlbXB0eSBjYXB0dXJlIGdyb3VwIG5hbWVpbnZhbGlkIGNhcHR1cmUgZ3JvdXAgY2hhcmFjdGVydW5jbG9zZWQgY2FwdHVyZSBncm91cCBuYW1ldW5jbG9zZWQgZ3JvdXB1bm9wZW5lZCBncm91cGludmFsaWQgcmVwZXRpdGlvbiBjb3VudCByYW5nZSwgdGhlIHN0YXJ0IG11c3QgYmUgPD0gdGhlIGVuZHJlcGV0aXRpb24gcXVhbnRpZmllciBleHBlY3RzIGEgdmFsaWQgZGVjaW1hbHVuY2xvc2VkIGNvdW50ZWQgcmVwZXRpdGlvbnJlcGV0aXRpb24gb3BlcmF0b3IgbWlzc2luZyBleHByZXNzaW9uc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IGFzc2VydGlvbiBpcyBlaXRoZXIgdW5jbG9zZWQgb3IgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXJ1bnJlY29nbml6ZWQgc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IGFzc2VydGlvbiwgdmFsaWQgY2hvaWNlcyBhcmU6IHN0YXJ0LCBlbmQsIHN0YXJ0LWhhbGYgb3IgZW5kLWhhbGZmb3VuZCBlaXRoZXIgdGhlIGJlZ2lubmluZyBvZiBhIHNwZWNpYWwgd29yZCBib3VuZGFyeSBvciBhIGJvdW5kZWQgcmVwZXRpdGlvbiBvbiBhIFxiIHdpdGggYW4gb3BlbmluZyBicmFjZSwgYnV0IG5vIGNsb3NpbmcgYnJhY2VpbnZhbGlkIFVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzYmFja3JlZmVyZW5jZXMgYXJlIG5vdCBzdXBwb3J0ZWRsb29rLWFyb3VuZCwgaW5jbHVkaW5nIGxvb2stYWhlYWQgYW5kIGxvb2stYmVoaW5kLCBpcyBub3Qgc3VwcG9ydGVkVW5pY29kZSBub3QgYWxsb3dlZCBoZXJlcGF0dGVybiBjYW4gbWF0Y2ggaW52YWxpZCBVVEYtOGludmFsaWQgbGluZSB0ZXJtaW5hdG9yLCBtdXN0IGJlIEFTQ0lJVW5pY29kZSBwcm9wZXJ0eSBub3QgZm91bmRVbmljb2RlIHByb3BlcnR5IHZhbHVlIG5vdCBmb3VuZFVuaWNvZGUtYXdhcmUgUGVybCBjbGFzcyBub3QgZm91bmQgKG1ha2Ugc3VyZSB0aGUgdW5pY29kZS1wZXJsIGZlYXR1cmUgaXMgZW5hYmxlZClVbmljb2RlLWF3YXJlIGNhc2UgaW5zZW5zaXRpdml0eSBtYXRjaGluZyBpcyBub3QgYXZhaWxhYmxlIChtYWtlIHN1cmUgdGhlIHVuaWNvZGUtY2FzZSBmZWF0dXJlIGlzIGVuYWJsZWQpU3RhcnRFbmRTdGFydExGRW5kTEZTdGFydENSTEZFbmRDUkxGV29yZEFzY2lpV29yZEFzY2lpTmVnYXRlV29yZFVuaWNvZGVXb3JkVW5pY29kZU5lZ2F0ZVdvcmRTdGFydEFzY2lpV29yZEVuZEFzY2lpV29yZFN0YXJ0VW5pY29kZVdvcmRFbmRVbmljb2RlV29yZFN0YXJ0SGFsZkFzY2lpV29yZEVuZEhhbGZBc2NpaVdvcmRTdGFydEhhbGZVbmljb2RlV29yZEVuZEhhbGZVbmljb2RlQ2FwdHVyZWluZGV4ITIgAGsAAAAWAgAAHQAAACEyIABrAAAAEwIAAB0AAADdOSAAbAAAAKwBAAAuAAAA3TkgAGwAAACjAQAALgAAAN05IABsAAAAtwEAACcAAADdOSAAbAAAALgBAAAcAAAA3TkgAGwAAAC8AQAAJwAAAN05IABsAAAAvQEAACwAAADdOSAAbAAAAM4BAAAgAAAA3TkgAGwAAAD+AQAALgAAAN05IABsAAAA+gEAAC4AAADdOSAAbAAAAAoCAAAuAAAA3TkgAGwAAAAGAgAALgAAAN05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II+yINh2BRQ7EnwuD4KFBZt+6s1Z8TtTKx3KvqUBnjevy+7XR/Qv3FUXoZiENEv5WAm/rGzDjBarEjAuMGFueSB2YWx1ZWJ5dGUgYXJyYXl1bml0IHZhbHVlT3B0aW9uIHZhbHVlbmV3dHlwZSBzdHJ1Y3RzZXF1ZW5jZXVuaXQgdmFyaWFudG5ld3R5cGUgdmFyaWFudHR1cGxlIHZhcmlhbnRzdHJ1Y3QgdmFyaWFudHVuaXRhIGJvb2xlYW5hIHN0cmluZwAAAKxGIABlAAAAJAkAABIAAABvbmUgb2YgLCAuMAAAAAAACAAAAAQAAADvBAAA8AQAAPEEAABFT0Ygd2hpbGUgcGFyc2luZyBhIGxpc3RFT0Ygd2hpbGUgcGFyc2luZyBhbiBvYmplY3RFT0Ygd2hpbGUgcGFyc2luZyBhIHN0cmluZ0VPRiB3aGlsZSBwYXJzaW5nIGEgdmFsdWVleHBlY3RlZCBgOmBleHBlY3RlZCBgLGAgb3IgYF1gZXhwZWN0ZWQgYCxgIG9yIGB9YGV4cGVjdGVkIGlkZW50ZXhwZWN0ZWQgdmFsdWVleHBlY3RlZCBgImBpbnZhbGlkIGVzY2FwZWludmFsaWQgbnVtYmVybnVtYmVyIG91dCBvZiByYW5nZWludmFsaWQgdW5pY29kZSBjb2RlIHBvaW50Y29udHJvbCBjaGFyYWN0ZXIgKFx1MDAwMC1cdTAwMUYpIGZvdW5kIHdoaWxlIHBhcnNpbmcgYSBzdHJpbmdrZXkgbXVzdCBiZSBhIHN0cmluZ2ludmFsaWQgdmFsdWU6IGV4cGVjdGVkIGtleSB0byBiZSBhIG51bWJlciBpbiBxdW90ZXNmbG9hdCBrZXkgbXVzdCBiZSBmaW5pdGUgKGdvdCBOYU4gb3IgKy8taW5mKWxvbmUgbGVhZGluZyBzdXJyb2dhdGUgaW4gaGV4IGVzY2FwZXRyYWlsaW5nIGNvbW1hdHJhaWxpbmcgY2hhcmFjdGVyc3VuZXhwZWN0ZWQgZW5kIG9mIGhleCBlc2NhcGVyZWN1cnNpb24gbGltaXQgZXhjZWVkZWQwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OfIEAAAMAAAABAAAAPMEAAD0BAAA9QQAAAAAAAAAAAAAAQAAALQDAAAAAAAAAAAAAAEAAACtAwAAZ0wgAGgAAAA1AAAADgAAAAAAAAAAAAAAAQAAAOMDAAC/SCAAYwAAAEEAAAAOAAAAv0ggAGMAAAB2AAAAJAAAAL9IIABjAAAAdgAAADIAAACqPCAAZAAAACsAAAArAAAATGF5b3V0RXJyb3IAgD8gAEwAAADiAAAAFAAAAG9uZS10aW1lIGluaXRpYWxpemF0aW9uIG1heSBub3QgYmUgcGVyZm9ybWVkIHJlY3Vyc2l2ZWx5AAAAAAQAAAAEAAAA9gQAAAAAAAAIAAAABAAAAPcEAAD4BAAA+QQAAPoEAADSAwAADAAAAAQAAAD7BAAA/AQAAP0EAAAAAAAACAAAAAQAAAD+BAAA/wQAAAAFAAABBQAAAgUAABAAAAAEAAAAAwUAAAQFAAAFBQAA+gQAAG1dy9YsUOtjeEGmV3Ebi7ls4Eb7mA0aGDLL7ZZQkezLYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPj0gc2l6ZSArIG1pbl9vdmVyaGVhZAAAykogACoAAACxBAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplIDw9IHNpemUgKyBtYXhfb3ZlcmhlYWQAAMpKIAAqAAAAtwQAAA0AAAByd2xvY2sgb3ZlcmZsb3dlZCByZWFkIGxvY2tzyB8gAF0AAAAVAAAALAAAAGVudGl0eSBub3QgZm91bmRwZXJtaXNzaW9uIGRlbmllZGNvbm5lY3Rpb24gcmVmdXNlZGNvbm5lY3Rpb24gcmVzZXRob3N0IHVucmVhY2hhYmxlbmV0d29yayB1bnJlYWNoYWJsZWNvbm5lY3Rpb24gYWJvcnRlZG5vdCBjb25uZWN0ZWRhZGRyZXNzIGluIHVzZWFkZHJlc3Mgbm90IGF2YWlsYWJsZW5ldHdvcmsgZG93bmJyb2tlbiBwaXBlZW50aXR5IGFscmVhZHkgZXhpc3Rzb3BlcmF0aW9uIHdvdWxkIGJsb2Nrbm90IGEgZGlyZWN0b3J5aXMgYSBkaXJlY3RvcnlkaXJlY3Rvcnkgbm90IGVtcHR5cmVhZC1vbmx5IGZpbGVzeXN0ZW0gb3Igc3RvcmFnZSBtZWRpdW1maWxlc3lzdGVtIGxvb3Agb3IgaW5kaXJlY3Rpb24gbGltaXQgKGUuZy4gc3ltbGluayBsb29wKXN0YWxlIG5ldHdvcmsgZmlsZSBoYW5kbGVpbnZhbGlkIGlucHV0IHBhcmFtZXRlcmludmFsaWQgZGF0YXRpbWVkIG91dHdyaXRlIHplcm9ubyBzdG9yYWdlIHNwYWNlc2VlayBvbiB1bnNlZWthYmxlIGZpbGVxdW90YSBleGNlZWRlZGZpbGUgdG9vIGxhcmdlcmVzb3VyY2UgYnVzeWV4ZWN1dGFibGUgZmlsZSBidXN5ZGVhZGxvY2tjcm9zcy1kZXZpY2UgbGluayBvciByZW5hbWV0b28gbWFueSBsaW5rc2ludmFsaWQgZmlsZW5hbWVhcmd1bWVudCBsaXN0IHRvbyBsb25nb3BlcmF0aW9uIGludGVycnVwdGVkdW5zdXBwb3J0ZWR1bmV4cGVjdGVkIGVuZCBvZiBmaWxlb3V0IG9mIG1lbW9yeWluIHByb2dyZXNzb3RoZXIgZXJyb3J1bmNhdGVnb3JpemVkIGVycm9yAAAAIzYgAEcAAAA3AwAAJwAAACM2IABHAAAAHgMAACYAAAAjNiAARwAAABwDAAAsAAAAIzYgAEcAAAArAwAAJwAAAAEAAAAAAAAA0yAAAGgBAAAgICAgICAgICAgICAgYXQgwyAAAGgEAAI6IADTIAAAaAEAAyAtIAAgICAgICA8dW5rbm93bj7BIACAYADvv70AFUYgAGQAAABnAQAAMAAAAExhenlMb2NrIGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQAACE0IABRAAAAngEAAAUAAAB1c2Ugb2Ygc3RkOjp0aHJlYWQ6OmN1cnJlbnQoKSBpcyBub3QgcG9zc2libGUgYWZ0ZXIgdGhlIHRocmVhZCdzIGxvY2FsIGRhdGEgaGFzIGJlZW4gZGVzdHJveWVkAADXEiAAUQAAADsBAAAJAAAAb3BlcmF0aW9uIHN1Y2Nlc3NmdWxmYWlsZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIHRocmVhZCBJRDogYml0c3BhY2UgZXhoYXVzdGVkAHJIIABMAAAAJgAAAA0AAABXb3VsZEJsb2NrAAAAAAAACAAAAAQAAAAGBQAAdW5zdXBwb3J0ZWQgYmFja3RyYWNlZGlzYWJsZWQgYmFja3RyYWNlAHdAIABMAAAAigEAAB0AAAAHBQAAEAAAAAQAAAAIBQAACQUAAE9zY29kZUtpbmRDdXN0b21BY2Nlc3NFcnJvcgDSAwAADAAAAAQAAAAKBQAATm90Rm91bmRQZXJtaXNzaW9uRGVuaWVkQ29ubmVjdGlvblJlZnVzZWRDb25uZWN0aW9uUmVzZXRIb3N0VW5yZWFjaGFibGVOZXR3b3JrVW5yZWFjaGFibGVDb25uZWN0aW9uQWJvcnRlZE5vdENvbm5lY3RlZEFkZHJJblVzZUFkZHJOb3RBdmFpbGFibGVOZXR3b3JrRG93bkJyb2tlblBpcGVBbHJlYWR5RXhpc3RzTm90QURpcmVjdG9yeUlzQURpcmVjdG9yeURpcmVjdG9yeU5vdEVtcHR5UmVhZE9ubHlGaWxlc3lzdGVtRmlsZXN5c3RlbUxvb3BTdGFsZU5ldHdvcmtGaWxlSGFuZGxlSW52YWxpZElucHV0SW52YWxpZERhdGFUaW1lZE91dFdyaXRlWmVyb1N0b3JhZ2VGdWxsTm90U2Vla2FibGVRdW90YUV4Y2VlZGVkRmlsZVRvb0xhcmdlUmVzb3VyY2VCdXN5RXhlY3V0YWJsZUZpbGVCdXN5RGVhZGxvY2tDcm9zc2VzRGV2aWNlc1Rvb01hbnlMaW5rc0ludmFsaWRGaWxlbmFtZUFyZ3VtZW50TGlzdFRvb0xvbmdJbnRlcnJ1cHRlZFVuc3VwcG9ydGVkVW5leHBlY3RlZEVvZk91dE9mTWVtb3J5SW5Qcm9ncmVzc090aGVyVW5jYXRlZ29yaXplZHJ3bG9jayBoYXMgbm90IGJlZW4gbG9ja2VkIGZvciByZWFkaW5nAADIHyAAXQAAAD4AAAAJAAAAIzYgAEcAAAC1AwAALwAAACM2IABHAAAArQMAAC8AAAAjNiAARwAAAKEDAAArAAAAIzYgAEcAAAC5AwAAMQAAAAAAAAAMAAAABAAAAAsFAAAMBQAAAAAAAAwAAAAEAAAADQUAAA4FAADeGSAAIQAAAGUCAAAuAAAAY2FwYWNpdHkgb3ZlcmZsb3cAAAAAAAAABAAAAAQAAABUAgAAAAAAAAQAAAAEAAAADwUAAG9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm3cICYAKAAAACQAAAACAAAABCEmAA89IAArAAAA5wAAAB0AAADRQiAAIwAAAHIDAAAfAAAAqykgACMAAAC9BQAAEAAAACNfX0BfX19f3hkgACEAAAAxAgAALQAAAPVNIABgAAAAIwEAABwAAAD1TSAAYAAAACQBAAAoAAAA9U0gAGAAAAAlAQAAKAAAAPVNIABgAAAACAEAACsAAAD1TSAAYAAAAAgBAABCAAAA9U0gAGAAAAAFAQAAKwAAAPVNIABgAAAABQEAAEIAAABhc3NlcnRpb24gZmFpbGVkOiBzdGFydCA8PSBlbmQAAKIPIAAeAAAAHQAAAAkAAAAAAAAAAAAAAAEAAAD9AwAAzT8gAEoAAAALAgAAMgAAAKspIAAjAAAAKgEAADQAAACrKSAAIwAAACkEAAAQAAAAqykgACMAAADuAwAANQAAAKspIAAjAAAA9QMAADYAAACrKSAAIwAAAEoBAAAxAAAAqykgACMAAABLAQAAEQAAAKspIAAjAAAAYQEAABkAAACrKSAAIwAAAIYBAABGAAAAqykgACMAAAD8AwAACQAAAAAAAAAAAAAAAQAAABAFAAARBQAAEgUAAA89IAArAAAAgwEAAA0AAABlbmNvdW50ZXJlZCBlcnJvciB3aXRoIGAtWiB0cmVhdF9lcnJfYXNfYnVnANFCIAAjAAAAfwIAAA0AAABjYW5ub3QgcmVjdXJzaXZlbHkgYWNxdWlyZSBtdXRleAwfIABcAAAAEwAAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBsaW5lX2luZGV4IDwgYW5hbHlzaXMubGluZXMubGVuKCkgYXMgaXNpemVWHCAAIwAAAG8EAAAJAAAAqykgACMAAADXBAAAMAAAAKspIAAjAAAAwgQAADAAAAAUBQAAFQUAAFQeIABmAAAAvgAAABkAAABhc3NlcnRpb24gZmFpbGVkOiBzb3VyY2VfZmlsZV9lbmQgPj0gbGFzdF9saW5lX3N0YXJ0Oz0gADcAAAAqAAAACQAAADs9IAA3AAAAagAAABgAAAA7PSAANwAAAGoAAAAtAAAAQnl0ZVBvc0Vycm9yIGNvbnN0cnVjdGVkIGJ1dCBub3QgZW1pdHRlZGV4cGxpY2l0IHBhbmljAADjJyAAMgAAAF4BAAANAAAAPHF1b3RlIGV4cGFuc2lvbj48YW5vbj48bWFjcm8gZXhwYW5zaW9uPjxwcm9jLW1hY3JvIHNvdXJjZSBjb2RlPk1lc3NhZ2VubyBlcnJvcnMgZW5jb3VudGVyZWQgZXZlbiB0aG91Z2ggYGRlbGF5X3NwYW5fYnVnYCBpc3N1ZWTRQiAAIwAAALIBAAARAAAA3hkgACEAAACnAQAAFgAAAN4ZIAAhAAAAywEAABYAAADeGSAAIQAAALMBAAAnAAAA3hkgACEAAADPAQAAFwAAAN4ZIAAhAAAA8wEAABcAAADeGSAAIQAAANsBAAAoAAAA3hkgACEAAAC/AQAAMgAAAN4ZIAAhAAAAxwEAABYAAADeGSAAIQAAAOcBAAAzAAAA3hkgACEAAADvAQAAFwAAAAAAAADeGSAAIQAAAPkBAAAsAAAAY2Fubm90IGFkZCBwdXJlIGNvbW1lbnQgdG8gemVybyBwb3NpdGlvbt4ZIAAhAAAA9wEAAAkAAADeGSAAIQAAAKwBAAAOAAAA3hkgACEAAADUAQAADgAAAGxldmVsbWVzc2FnZbADAAAMAAAABAAAABcFAAAYBQAAswMAAAAAAAAAAAAAAQAAALQDAABQcmltYXJ5U3BhbkxhYmVsQnVnRmF0YWxQaGFzZUZhdGFsV2FybmluZ05vdGVIZWxwQ2FuY2VsbGVkRmFpbHVyZU5vdGVNdWx0aVNwYW5wcmltYXJ5X3NwYW5zc3Bhbl9sYWJlbHNTdWJEaWFnbm9zdGljcmVuZGVyX3NwYW5UcnlGcm9tU2xpY2VFcnJvck1hcmtNYWluSGVhZGVyTXNnSGVhZGVyTXNnTGluZUFuZENvbHVtbkxpbmVOdW1iZXJRdW90YXRpb25VbmRlcmxpbmVQcmltYXJ5VW5kZXJsaW5lU2Vjb25kYXJ5TGFiZWxQcmltYXJ5TGFiZWxTZWNvbmRhcnlPbGRTY2hvb2xOb3RlVGV4dE5vU3R5bGVMZXZlbEhpZ2hsaWdodAAAAAAADAAAAAQAAAAZBQAAGgUAADFNIABhAAAAOwAAAAUAAADBDyAAHwAAAM8A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ZW50aWZpZXJzVXNpbmcgZGVjbGFyYXRpb24gcmVxdWlyZXMgaW5pdGlhbGl6ZXJwcml2YXRlIG5hbWVzIGFyZSBub3QgYWxsb3dlZCBpbiBpbnRlcmZhY2VJbnZhbGlkIGBzdXBlcigpYEludmFsaWQgYWNjZXNzIHRvIHN1cGVySW5kZXggc3VwZXIgd2l0aCBwcml2YXRlIG5hbWUgaXMgbm90IGFsbG93ZWQnbmV3LnRhcmdldCcgaXMgb25seSBhbGxvd2VkIGluIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIGZ1bmN0aW9uIGV4cHJlc3Npb24sIG9yIGNsYXNzLkltcG9ydCBpcyBub3QgYWxsb3dlZCBoZXJlQW4gYXJyb3cgZnVuY3Rpb24gaXMgbm90IGFsbG93ZWQgaGVyZWBleHBvcnRgIGlzIG5vdCBhbGxvd2VkIGhlcmVBIGdldHRlciBvciBhIHNldHRlciBjYW5ub3QgYmUgcmVhZG9ubHlBIGdldHRlciBvciBhIHNldHRlciBjYW5ub3QgYmUgb3B0aW9uYWxBIGBnZXRgIGFjY2Vzc29yIGNhbm5vdCBoYXZlIHBhcmFtZXRlcnNBIGBzZXRgIGFjY2Vzc29yIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbWV0ZXJ0b3AgbGV2ZWwgYXdhaXQgaXMgb25seSBhbGxvd2VkIGluIG1vZHVsZUxlZ2FjeSBkZWNpbWFsIGVzY2FwZSBpcyBub3QgcGVybWl0dGVkIGluIHN0cmljdCBtb2RlTGVnYWN5IG9jdGFsIGVzY2FwZSBpcyBub3QgcGVybWl0dGVkIGluIHN0cmljdCBtb2RlSW52YWxpZCBjaGFyYWN0ZXIgaW4gaWRlbnRpZmllcmEgYmluYXJ5YW4gb2N0YWxhIGRlY2ltYWxhIGhleGFkZWNpbWFsAIMhIAAjAAAAQgEAABoAAABTZXR0ZXIgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyUmVzdCBwYXR0ZXJuIGlzIG5vdCBhbGxvd2VkIGluIHNldHRlclVudGVybWluYXRlZCBibG9jayBjb21tZW50VW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudEV4cGVjdGVkIHVuaWNvZGUgZXNjYXBlVW50ZXJtaW5hdGVkIHJlZ2V4cCBsaXRlcmFsVW50ZXJtaW5hdGVkIHRlbXBsYXRlSWRlbnRpZmllciBjYW5ub3QgZm9sbG93IG51bWJlckludmFsaWQgc3RyaW5nIGVzY2FwZUludmFsaWQgdW5pY29kZSBlc2NhcGVFeHBlY3RlZCArLCAtIG9yIGRlY2ltYWwgZGlnaXQgYWZ0ZXIgZUxlZ2FjeSBjb21tZW50cyBjYW5ub3QgYmUgdXNlZCBpbiBtb2R1bGUgY29kZWBhd2FpdGAgY2Fubm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBpbiBhbiBhc3luYyBjb250ZXh0J2V2YWwnIGFuZCAnYXJndW1lbnRzJyBjYW5ub3QgYmUgdXNlZCBhcyBhIGJpbmRpbmcgaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZSdhcmd1bWVudHMnIGlzIG9ubHkgYWxsb3dlZCBpbiBmdW5jdGlvbnMgYW5kIGNsYXNzIG1ldGhvZHNJbGxlZ2FsICd1c2Ugc3RyaWN0JyBkaXJlY3RpdmUgaW4gZnVuY3Rpb24gd2l0aCBub24tc2ltcGxlIHBhcmFtZXRlciBsaXN0LicqKicgY2Fubm90IGJlIGFwcGxpZWQgdG8gdW5hcnkvYXdhaXQgZXhwcmVzc2lvbi5VbmV4cGVjdGVkIHRva2VuICcjJ0xpbmVCcmVhayBjYW5ub3QgZm9sbG93ICd0aHJvdydVbmV4cGVjdGVkIGxpbmUgYnJlYWsgYmV0d2VlbiBhcnJvdyBoZWFkIGFuZCBhcnJvdyAsICBvciBjYW5ub3QgaW1wb3J0IGFzIHJlc2VydmVkIHdvcmRhc3NpZ25tZW50IHByb3BlcnR5IGlzIGludmFsaWQgc3ludGF4RXhwZWN0ZWQgJzsnLCAnfScgb3IgPGVvZj5hd2FpdCogaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBhc3luYyBmdW5jdGlvbnMgcHJvcG9zYWwuIFVzZSBQcm9taXNlLmFsbCgpIGluc3RlYWQuQ2Fubm90IHVzZSBhIHJlc2VydmVkIHdvcmQgYXMgYSBzaG9ydGhhbmQgcHJvcGVydHlOdWxsaXNoIGNvYWxlc2Npbmcgb3BlcmF0b3IoPz8pIHJlcXVpcmVzIHBhcmVucyB3aGVuIG1peGluZyB3aXRoIGxvZ2ljYWwgb3BlcmF0b3JzQSBzd2l0Y2ggYmxvY2sgY2Fubm90IGhhdmUgbXVsdGlwbGUgZGVmYXVsdHNUcmFpbGluZyBjb21tYSBpc24ndCBwZXJtaXR0ZWQgYWZ0ZXIgYSByZXN0IGVsZW1lbnRSZXN0IGVsZW1lbnQgbXVzdCBiZSBmaW5hbCBlbGVtZW50UGFyZW50aGVzaXplZCBleHByZXNzaW9uIGNhbm5vdCBjb250YWluIHNwcmVhZCBvcGVyYXRvclBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiBjYW5ub3QgYmUgZW1wdHlOb3QgYSBwYXR0ZXJuTm90IGFuIGV4cHJlc3Npb25DYW5ub3QgYXNzaWduIHRvIHRoaXNJbnZhbGlkIGFzc2lnbm1lbnQgdGFyZ2V0RXhwZWN0ZWQgaWRlbnRFeHBlY3RlZCAnOycgb3IgbGluZSBicmVha0FuIGFzeW5jIGZ1bmN0aW9uIGNhbm5vdCBiZSBnZW5lcmF0b3InaW1wb3J0JywgYW5kICdleHBvcnQnIGFyZSBub3QgcGVybWl0dGVkIGhlcmUnaW1wb3J0JywgYW5kICdleHBvcnQnIGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgbW9kdWxlIGNvZGUnaW1wb3J0Lm1ldGEnIGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgbW9kdWxlIGNvZGUuRGVzdHJ1Y3R1cmluZyBiaW5kaW5ncyByZXF1aXJlIGluaXRpYWxpemVyc1dpdGggc3RhdGVtZW50IGFyZSBub3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZVJldHVybiBzdGF0ZW1lbnQgaXMgbm90IGFsbG93ZWQgaGVyZUV4cGVjdGVkIG9uZSB2YXJpYWJsZSBiaW5kaW5nVW5leHBlY3RlZCBpbml0aWFsaXplciBpbiBmb3IgaW4vb2YgbG9vcEdlbmVyYXRvciBvciBhc3luYyBmdW5jdGlvbiBjYW5ub3QgYmUgbGFiZWxsZWRGdW5jdGlvbiBjYW5ub3QgYmUgbGFiZWxsZWQgaW4gc3RyaWN0IG1vZGUneWllbGQnIGNhbm5vdCBiZSB1c2VkIGFzIGEgcGFyYW1ldGVyIHdpdGhpbiBnZW5lcmF0b3JgYXdhaXRgIGV4cHJlc3Npb25zIGNhbm5vdCBiZSB1c2VkIGluIGEgcGFyYW1ldGVyIGluaXRpYWxpemVyLmZvciBhd2FpdCBzeW50YXggaXMgdmFsaWQgb25seSBmb3IgZm9yLW9mIHN0YXRlbWVudGF3YWl0IGlzbid0IGFsbG93ZWQgaW4gbm9uLWFzeW5jIGZ1bmN0aW9uVW50ZXJtaW5hdGVkIEpTWCBjb250ZW50c0pTWCBhdHRyaWJ1dGVzIG11c3Qgb25seSBiZSBhc3NpZ25lZCBhIG5vbi1lbXB0eSBleHByZXNzaW9uSlNYIHZhbHVlIHNob3VsZCBiZSBlaXRoZXIgYW4gZXhwcmVzc2lvbiBvciBhIHF1b3RlZCBKU1ggdGV4dEV4cGVjdGVkIGNvcnJlc3BvbmRpbmcgSlNYIGNsb3NpbmcgdGFnIGZvciA8PkxlYWRpbmcgZGVjb3JhdG9ycyBtdXN0IGJlIGF0dGFjaGVkIHRvIGEgY2xhc3MgZGVjbGFyYXRpb25Vc2luZyB0aGUgZXhwb3J0IGtleXdvcmQgYmV0d2VlbiBhIGRlY29yYXRvciBhbmQgYSBjbGFzcyBpcyBub3QgYWxsb3dlZC4gUGxlYXNlIHVzZSBgZXhwb3J0IEBkZWMgY2xhc3NgIGluc3RlYWQuQSByZXF1aXJlZCBlbGVtZW50IGNhbm5vdCBmb2xsb3cgYW4gb3B0aW9uYWwgZWxlbWVudC5UeXBlc2NyaXB0IHBhcmFtZXRlciBwcm9wZXJ0eSBtdXN0IGJlIGFuIGlkZW50aWZpZXIgb3IgYXNzaWdubWVudCBwYXR0ZXJuVW5leHBlY3RlZCBzcGFjZSBiZXR3ZWVuICMgYW5kIGlkZW50aWZpZXJDb25zdHJ1Y3RvciBjYW4ndCBiZSBhbiBhc3luYyBmdW5jdGlvbkNsYXNzZXMgbWF5IG5vdCBoYXZlIGEgbm9uLXN0YXRpYyBmaWVsZCBuYW1lZCAnY29uc3RydWN0b3InQ2xhc3NlcyBjYW4ndCBoYXZlIGEgcHJpdmF0ZSBmaWVsZCBuYW1lZCAnI2NvbnN0cnVjdG9yJy5DbGFzcyBjb25zdHJ1Y3RvciBjYW4ndCBiZSBhbiBhY2Nlc3Nvci5BIG1ldGhvZCBjYW5ub3QgYmUgcmVhZG9ubHlBIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBnZW5lcmF0b3JBIGNsYXNzIGNhbiBvbmx5IGhhdmUgb25lIGNvbnN0cnVjdG9yQSBiaW5kaW5nIHBhdHRlcm4gcGFyYW1ldGVyIGNhbm5vdCBiZSBvcHRpb25hbCBpbiBhbiBpbXBsZW1lbnRhdGlvbiBzaWduYXR1cmUuU3VwZXIgY2FsbCBjYW5ub3QgYmUgb3B0aW9uYWxDb25zdHJ1Y3RvciBpbi9hZnRlciBhbiBvcHRpb25hbCBjaGFpbmluZyBpcyBub3QgYWxsb3dlZC5UYWdnZWQgdGVtcGxhdGUgbGl0ZXJhbCBpcyBub3QgYWxsb3dlZCBpbiBvcHRpb25hbCBjaGFpbi5UcmFpbGluZyBjb21tYSBpcyBkaXNhbGxvd2VkIGluc2lkZSBpbXBvcnQoLi4uKSBhcmd1bWVudHNgaW1wb3J0KClgIHJlcXVpcmVzIGV4YWN0bHkgb25lIG9yIHR3byBhcmd1bWVudHNleHBvcnQgZGVmYXVsdCBzdGF0ZW1lbnRzIHJlcXVpcmVkIGZyb20gJy4uLic7YC4uLmAgbXVzdCBiZSBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyIGluIGRlY2xhcmF0aW9uIGNvbnRleHRzQSBudW1lcmljIHNlcGFyYXRvciBpcyBvbmx5IGFsbG93ZWQgYmV0d2VlbiB0d28gZGlnaXRzQSBzdHJpbmcgbGl0ZXJhbCBjYW5ub3QgYmUgdXNlZCBhcyBhbiBleHBvcnRlZCBiaW5kaW5nIHdpdGhvdXQgYGZyb21gLidjb25zdCcgZGVjbGFyYXRpb25zIG11c3QgYmUgaW5pdGlhbGl6ZWRVbmtub3duIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFncy5FeHBlY3RlZCBhbiBpZGVudGlmaWVyRXhwZWN0ZWQgYSBzZW1pY29sb25UcmFpbGluZyBjb21tYSBpcyBub3QgYWxsb3dlZEEgcmVzdCBwYXJhbWV0ZXIgbXVzdCBiZSBsYXN0IGluIGEgcGFyYW1ldGVyIGxpc3RQYXJhbWV0ZXIgY2Fubm90IGhhdmUgcXVlc3Rpb24gbWFyayBhbmQgaW5pdGlhbGl6ZXJgZGVjbGFyZWAgbW9kaWZpZXIgY2Fubm90IGFwcGVhciBvbiBjbGFzcyBlbGVtZW50cyBvZiB0aGlzIGtpbmRgZGVjbGFyZWAgbW9kaWZpZXIgbm90IGFsbG93ZWQgZm9yIGNvZGUgYWxyZWFkeSBpbiBhbiBhbWJpZW50IGNvbnRleHRgYXN5bmNgIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIGhlcmVBIHJlc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBvcHRpb25hbEEgcmVzdCBwYXJhbWV0ZXIgY2Fubm90IGhhdmUgYW4gaW5pdGlhbGl6ZXJqc2MudGFyZ2V0IHNob3VsZCBiZSBlczUgb3IgdXBwZXIgdG8gdXNlIGdldHRlciAvIHNldHRlckxlZ2FjeSBvY3RhbCBsaXRlcmFscyBhcmUgbm90IGF2YWlsYWJsZSB3aGVuIHRhcmdldGluZyBFQ01BU2NyaXB0IDUgYW5kIGhpZ2hlclR5cGUgcGFyYW1ldGVycyBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb25BbiBpbmRleCBzaWduYXR1cmUgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlclR5cGUgcGFyYW1ldGVyIGxpc3QgY2Fubm90IGJlIGVtcHR5SW52YWxpZCB1c2Ugb2YgJ2FyZ3VtZW50cycgaW4gc3RyaWN0IG1vZGUnZGVsZXRlJyBjYW5ub3QgYmUgY2FsbGVkIG9uIGFuIGlkZW50aWZpZXIgaW4gc3RyaWN0IG1vZGVBICdicmVhaycgc3RhdGVtZW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aGluIGFuIGVuY2xvc2luZyBpdGVyYXRpb24gb3Igc3dpdGNoIHN0YXRlbWVudFRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhIGBmb3IuLi5vZmAgc3RhdGVtZW50IG1heSBub3QgYmUgYGFzeW5jYEp1bXAgdGFyZ2V0IGNhbm5vdCBjcm9zcyBmdW5jdGlvbiBib3VuZGFyeUV4cHJlc3Npb24gZXhwZWN0ZWR0eXBlIGV4cGVjdGVkRHVwbGljYXRlIGxhYmVsQSAnY29udGludWUnIHN0YXRlbWVudCBjYW4gb25seSBqdW1wIHRvIGEgbGFiZWwgb2YgYW4gZW5jbG9zaW5nIGl0ZXJhdGlvbiBzdGF0ZW1lbnRBICdicmVhaycgc3RhdGVtZW50IGNhbiBvbmx5IGp1bXAgdG8gYSBsYWJlbCBvZiBhbiBlbmNsb3Npbmcgc3RhdGVtZW50VmFyaWFibGUgZGVjbGFyYXRpb24gbGlzdCBjYW5ub3QgYmUgZW1wdHlsaXRlcmFsIGluIGFuIGltcG9ydCB0eXBlIHNob3VsZCBiZSBzdHJpbmcgbGl0ZXJhbEFuIG9iamVjdCBtZW1iZXIgY2Fubm90IGJlIGRlY2xhcmVkIG9wdGlvbmFsQ29tcHV0ZWQgcHJvcGVydHkgbmFtZXMgYXJlIG5vdCBhbGxvd2VkIGluIGVudW1zQSBjb21tYSBleHByZXNzaW9uIGlzIG5vdCBhbGxvd2VkIGluIGEgY29tcHV0ZWQgcHJvcGVydHkgbmFtZWBleHRlbmRzYCBjbGF1c2UgYWxyZWFkeSBzZWVuLidleHRlbmRzJyBjbGF1c2UgbXVzdCBwcmVjZWRlICdpbXBsZW1lbnRzJyBjbGF1c2UuQ2xhc3NlcyBjYW4gb25seSBleHRlbmQgYSBzaW5nbGUgY2xhc3NgaW1wbGVtZW50c2AgY2xhdXNlIGFscmVhZHkgc2VlbkFuIGltcGxlbWVudGF0aW9uIGNhbm5vdCBiZSBkZWNsYXJlZCBpbiBhbWJpZW50IGNvbnRleHRzTW9kaWZpZXJzIGNhbm5vdCBhcHBlYXIgaGVyZU1lcmdlIGNvbmZsaWN0IG1hcmtlciBlbmNvdW50ZXJlZC5UeXBlIGFubm90YXRpb24gY2Fubm90IGFwcGVhciBvbiBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uQ2F0Y2ggY2xhdXNlIHZhcmlhYmxlIGNhbm5vdCBoYXZlIGEgdHlwZSBhbm5vdGF0aW9uYGFic3RyYWN0YCBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSBjbGFzcyBvciBtZXRob2QgZGVjbGFyYXRpb25BYnN0cmFjdCBtZXRob2RzIGNhbiBvbmx5IGFwcGVhciB3aXRoaW4gYW4gYWJzdHJhY3QgY2xhc3MuQWJzdHJhY3QgbWV0aG9kIGNhbm5vdCBoYXZlIGFuIGltcGxlbWVudGF0aW9uLkFic3RyYWN0IHByb3BlcnR5IGNhbm5vdCBoYXZlIGFuIGluaXRpYWxpemVyLlRoZSAndHlwZScgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgb24gYSBuYW1lZCBpbXBvcnQgd2hlbiAnaW1wb3J0IHR5cGUnIGlzIHVzZWQgb24gaXRzIGltcG9ydCBzdGF0ZW1lbnQuVGhlICd0eXBlJyBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCBvbiBhIG5hbWVkIGV4cG9ydCB3aGVuICdleHBvcnQgdHlwZScgaXMgdXNlZCBvbiBpdHMgZXhwb3J0IHN0YXRlbWVudC5BIHBhcmFtZXRlciBwcm9wZXJ0eSBpcyBvbmx5IGFsbG93ZWQgaW4gYSBjb25zdHJ1Y3RvciBpbXBsZW1lbnRhdGlvbkEgcGFyYW1ldGVyIGluaXRpYWxpemVyIGlzIG9ubHkgYWxsb3dlZCBpbiBhIGZ1bmN0aW9uIG9yIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBtdXN0IGJlIGEgdmFyaWFibGUgb3IgYSBwcm9wZXJ0eSBhY2Nlc3MuVGhlICd3aXRoJyBzdGF0ZW1lbnQgaXMgbm90IHN1cHBvcnRlZC4gQWxsIHN5bWJvbHMgaW4gYSAnd2l0aCcgYmxvY2sgd2lsbCBoYXZlIHR5cGUgJ2FueScuSW52YWxpZCBjbGFzcyBuYW1laW50ZXJmYWNlIG5hbWUgaXMgaW52YWxpZEFuIGVudW0gbWVtYmVyIGNhbm5vdCBoYXZlIGEgbnVtZXJpYyBuYW1lVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGEgJ2Zvci4uLm9mJyBzdGF0ZW1lbnQgY2Fubm90IHVzZSBhIHR5cGUgYW5ub3RhdGlvblRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhICdmb3IuLi5pbicgc3RhdGVtZW50IGNhbm5vdCBiZSBhIGRlc3RydWN0dXJpbmcgcGF0dGVybkFuIGludGVyZmFjZSBjYW4gb25seSBleHRlbmQgYW4gaWRlbnRpZmllci9xdWFsaWZpZWQtbmFtZSB3aXRoIG9wdGlvbmFsIHR5cGUgYXJndW1lbnRzLlRoZSBvcGVyYW5kIG9mIGEgZGVsZXRlIG9wZXJhdG9yIG11c3QgYmUgYSBwcm9wZXJ0eSByZWZlcmVuY2UuVGhpcyBtZW1iZXIgY2Fubm90IGhhdmUgYW4gJ292ZXJyaWRlJyBtb2RpZmllciBiZWNhdXNlIGl0cyBjb250YWluaW5nIGNsYXNzIGRvZXMgbm90IGV4dGVuZCBhbm90aGVyIGNsYXNzLkRlY29yYXRvcnMgbWF5IG5vdCBhcHBlYXIgYWZ0ZXIgYGV4cG9ydGAgb3IgYGV4cG9ydCBkZWZhdWx0YCBpZiB0aGV5IGFsc28gYXBwZWFyIGJlZm9yZSBgZXhwb3J0YC5BbiBhY2Nlc3NpYmlsaXR5IG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggYSBwcml2YXRlIGlkZW50aWZpZXIuVHlwZSBhbm5vdGF0aW9ucyBtdXN0IGNvbWUgYmVmb3JlIGRlZmF1bHQgYXNzaWdubWVudHNUaGlzIHN5bnRheCBpcyByZXNlcnZlZCBpbiBmaWxlcyB3aXRoIHRoZSAubXRzIG9yIC5jdHMgZXh0ZW5zaW9uLiBVc2UgYW4gYGFzYCBleHByZXNzaW9uIGluc3RlYWQuVGhpcyBzeW50YXggaXMgcmVzZXJ2ZWQgaW4gZmlsZXMgd2l0aCB0aGUgLm10cyBvciAuY3RzIGV4dGVuc2lvbi4gQWRkIGEgdHJhaWxpbmcgY29tbWEsIGFzIGluIGA8VCw+KCkgPT4gLi4uYC5UeXBlIGFyZ3VtZW50IGxpc3QgY2Fubm90IGJlIGVtcHR5LlRoaXMgaXMgdGhlIGV4cHJlc3Npb24gcGFydCBvZiBhbiBleHByZXNzaW9uIHN0YXRlbWVudHByZXZpb3VzIGRlZmF1bHQgY2FzZSBpcyBkZWNsYXJlZCBhdCBoZXJlAAAAtEQgACcAAABOAgAAHgAAALREIAAnAAAA9wgAACAAAAC0RCAAJwAAADwJAAAmAAAAtEQgACcAAAB9BQAAJQAAALREIAAnAAAAfgUAADUAAAAyIGhleCBjaGFyYWN0ZXJztEQgACcAAADvBgAAOQAAALREIAAnAAAA/wIAACYAAAC0RCAAJwAAAGgDAAAqAAAANCBoZXggY2hhcmFjdGVyczEtNiBoZXggY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgMCB0byAxMEZGRkYuMS02IGhleCBjaGFyYWN0ZXJzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAC0RCAAJwAAADwFAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAACXHXDIAAAaQQAAGB7Jz4nfWBgJmd0O2Bgeyd9J31gYCZyYnJhY2U7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQAAAAAAAAAAAAABAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALseIABQAAAAGggAAAkAAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAvBQAAMAUAAC8FAAAvBQAAMAUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC8FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAADEFAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAAC4FAAAuBQAALgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAMgUAADIFAAAyBQAAbHRhbHBoYW51cGl6d2psZXN1YgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMFAAAzBQAAMwUAADMFAAAzBQAAMwUAADMFAAAzBQAAMwUAADMFAAAzBQAAMwUAADMFAAAzBQAAMwUAADMFAAAzBQAAMwUAADMFAAAzBQAAMwUAADMFAAAzBQAAMwUAADMFAAAzBQAAMwUAADMFAAAzBQAAMwUAADMFAAAzBQAAMwUAADQFAAA1BQAANgUAADcFAAA4BQAAOQUAADUFAAA6BQAAOwUAADwFAAA9BQAAPgUAAD8FAABABQAAQQUAAEIFAABDBQAAQwUAAEMFAABDBQAAQwUAAEMFAABDBQAAQwUAAEMFAABEBQAARQUAAEYFAABHBQAASAUAAEkFAABKBQAANwUAADcFAAA3BQAANwUAADcFAAA3BQAANwUAADcFAAA3BQAANwUAADcFAAA3BQAANwUAADcFAAA3BQAANwUAADcFAAA3BQAANwUAADcFAAA3BQAANwUAADcFAAA3BQAANwUAADcFAABLBQAANwUAAEwFAABNBQAANwUAAE4FAABPBQAAUAUAAFEFAABSBQAAUwUAAFQFAABVBQAANwUAAFYFAAA3BQAAVwUAAFgFAABZBQAAWgUAAFsFAABcBQAANwUAAF0FAABeBQAAXwUAAGAFAABhBQAAYgUAADcFAABjBQAANwUAAGQFAABlBQAAZgUAAGcFAAAzBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAABoBQAAaAUAAGgFAAAAAAAAAQAAAAEAAABpBQAAsCggACoAAABGAAAAIwAAALAoIAAqAAAAXAAAABoAAACwKCAAKgAAAFoAAAAaAAAAsCggACoAAAA6AAAAJAAAALAoIAAqAAAAUgAAACMAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBVc2luZyBpcyBub3QgYSB2YWxpZCBkZWNsYXJhdGlvbiBmb3IgYGRlY2xhcmVgIGtleXdvcmRwESAALwAAAD8AAAAcAAAAZmFpbGVkIHRvIHBhcnNlIG51bWJlciBhcyBjaGFyAAC0RCAAJwAAAF8FAAAOAAAAZmFpbGVkIHRvIHBhcnNlIHN0cmluZyBhcyBudW1iZXK0RCAAJwAAAF0FAAAvAAAAEmVuY29kZV91dGY4OiBuZWVkIMATIGJ5dGVzIHRvIGVuY29kZSBVK8MgAABpBAAVIGJ1dCBidWZmZXIgaGFzIGp1c3QgwAAAOzkgACkAAAA7AQAADQAAADxzdHJpbmcgbGl0ZXJhbD48bnVtYmVyIGxpdGVyYWw+PGJpZ2ludCBsaXRlcmFsPjxyZWdleHAgbGl0ZXJhbD48dGVtcGxhdGUgbGl0ZXJhbD48dGVtcGxhdGUgaGVhZCBgLi4uJHsgPjx0ZW1wbGF0ZSBtaWRkbGUgLi4uJHsgPjx0ZW1wbGF0ZSB0YWlsIGAgPjxqc3ggbmFtZT48anN4IHRleHQ+PGlkZW50aWZpZXI+PGVycm9yPnN0cnVjdCBUc1N5bnRheAAAAG8FAAAQAAAACAAAAHAFAABxBQAABAAAAAQAAAByBQAAAAAAAAEAAAABAAAAcwUAAAAAAAABAAAAAQAAAFQBAAAAAAAAAQAAAAEAAAB0BQAAAAAAAAQAAAAEAAAAogEAAHUFAAAYAAAACAAAALQBAAB2BQAADAAAAAQAAAAMAgAAdwUAAAQAAAAEAAAAtQEAAAAAAAAEAAAABAAAAA0CAAB4BQAABAAAAAQAAABvAQAAeQUAAAQAAAAEAAAAJgEAAHoFAAAEAAAABAAAAPwBAAB7BQAAIAAAAAgAAACzAQAAfAUAAAwAAAAEAAAAfQUAAH4FAAAYAAAABAAAAH8FAACABQAAIAAAAAgAAACBBQAAggUAAAwAAAAEAAAALwIAAIMFAAAMAAAABAAAAIQFAACFBQAABAAAAAQAAADmAQAAanN4IHRhZyBzdGFydGpzeCB0YWcgZW5kc3RyaW5nIGxpdGVyYWxudW1lcmljIGxpdGVyYWxiaWdpbnQgbGl0ZXJhbHJlZ2V4cCBsaXRlcmFsdGVtcGxhdGUgdG9rZW5ubyBzdWJzdGl0dXRpb24gdGVtcGxhdGUgbGl0ZXJhbHRlbXBsYXRlIGhlYWR0ZW1wbGF0ZSBtaWRkbGV0ZW1wbGF0ZSB0YWlsanN4IG5hbWVqc3ggdGV4dGluc3RhbmNlT2Z0eXBlT2Y8bGV4aW5nIGVycm9yPjxlb2Y+UGFyc2VGbG9hdEVycm9yAACGBQAABAAAAAQAAABsAQAAV29yZFRlbXBsYXRlSnN4VGV4dACHBQAADAAAAAQAAACIBQAAiQUAAAQAAAAEAAAAigUAAIsFAAAMAAAABAAAAIwFAAAAAAAABAAAAAQAAACNBQAARW9mRGVjbE5vdEFsbG93ZWRVc2luZ0RlY2xOb3RBbGxvd2VkVXNpbmdEZWNsTm90QWxsb3dlZEZvckZvckluTG9vcFVzaW5nRGVjbE5vdEVuYWJsZWRJbnZhbGlkTmFtZUluVXNpbmdEZWNsSW5pdFJlcXVpcmVkRm9yVXNpbmdEZWNsUHJpdmF0ZU5hbWVJbkludGVyZmFjZUludmFsaWRTdXBlckNhbGxJbnZhbGlkU3VwZXJJbnZhbGlkU3VwZXJQcml2YXRlTmFtZUludmFsaWROZXdUYXJnZXRJbnZhbGlkSW1wb3J0QXJyb3dOb3RBbGxvd2VkRXhwb3J0Tm90QWxsb3dlZEdldHRlclNldHRlckNhbm5vdEJlUmVhZG9ubHlHZXR0ZXJTZXR0ZXJDYW5ub3RCZU9wdGlvbmFsR2V0dGVyUGFyYW1TZXR0ZXJQYXJhbVRvcExldmVsQXdhaXRJblNjcmlwdExlZ2FjeURlY2ltYWxMZWdhY3lPY3RhbEludmFsaWRJZGVudENoYXJFeHBlY3RlZERpZ2l0cmFkaXhTZXR0ZXJQYXJhbVJlcXVpcmVkUmVzdFBhdEluU2V0dGVyVW50ZXJtaW5hdGVkQmxvY2tDb21tZW50VW50ZXJtaW5hdGVkU3RyTGl0RXhwZWN0ZWRVbmljb2RlRXNjYXBlRXNjYXBlSW5SZXNlcnZlZFdvcmR3b3JkVW50ZXJtaW5hdGVkUmVnRXhwVW50ZXJtaW5hdGVkVHBsSWRlbnRBZnRlck51bVVuZXhwZWN0ZWRDaGFySW52YWxpZFN0ckVzY2FwZUludmFsaWRVbmljb2RlRXNjYXBlQmFkQ2hhcmFjdGVyRXNjYXBlU2VxdWVuY2VleHBlY3RlZE51bUxpdFRlcm1pbmF0ZWRXaXRoRXhwTGVnYWN5Q29tbWVudEluTW9kdWxlSW52YWxpZElkZW50SW5TdHJpY3RJbnZhbGlkSWRlbnRJbkFzeW5jRXZhbEFuZEFyZ3VtZW50c0luU3RyaWN0QXJndW1lbnRzSW5DbGFzc0ZpZWxkSWxsZWdhbExhbmd1YWdlTW9kZURpcmVjdGl2ZVVuYXJ5SW5FeHBsZWZ0X3NwYW5IYXNoTGluZUJyZWFrSW5UaHJvd0xpbmVCcmVha0JlZm9yZUFycm93VW5leHBlY3RlZGdvdFVuZXhwZWN0ZWRUb2tlbldpdGhTdWdnZXN0aW9uc2NhbmRpZGF0ZV9saXN0UmVzZXJ2ZWRXb3JkSW5JbXBvcnRBc3NpZ25Qcm9wZXJ0eUV4cGVjdGVkRXhwZWN0ZWRTZW1pRm9yRXhwclN0bXRBd2FpdFN0YXJSZXNlcnZlZFdvcmRJbk9ialNob3J0aGFuZE9yUGF0TnVsbGlzaENvYWxlc2NpbmdXaXRoTG9naWNhbE9wTXVsdGlwbGVEZWZhdWx0cHJldmlvdXNDb21tYUFmdGVyUmVzdEVsZW1lbnROb25MYXN0UmVzdFBhcmFtU3ByZWFkSW5QYXJlbkV4cHJFbXB0eVBhcmVuRXhwckludmFsaWRQYXRJbnZhbGlkRXhwck5vdFNpbXBsZUFzc2lnbkludmFsaWRBc3NpZ25UYXJnZXRFeHBlY3RlZElkZW50RXhwZWN0ZWRTZW1pRHVwbGljYXRlTGFiZWxBc3luY0dlbmVyYXRvck5vblRvcExldmVsSW1wb3J0RXhwb3J0SW1wb3J0RXhwb3J0SW5TY3JpcHRJbXBvcnRNZXRhSW5TY3JpcHRQYXRWYXJXaXRob3V0SW5pdFdpdGhJblN0cmljdFJldHVybk5vdEFsbG93ZWRUb29NYW55VmFySW5Gb3JJbkhlYWRWYXJJbml0aWFsaXplckluRm9ySW5IZWFkTGFiZWxsZWRHZW5lcmF0b3JPckFzeW5jTGFiZWxsZWRGdW5jdGlvbkluU3RyaWN0WWllbGRQYXJhbUluR2VuQXdhaXRQYXJhbUluQXN5bmNBd2FpdEZvclN0bXRBd2FpdEluRnVuY3Rpb25VbnRlcm1pbmF0ZWRKU1hDb250ZW50c0VtcHR5SlNYQXR0ckludmFsaWRKU1hWYWx1ZUpTWEV4cGVjdGVkQ2xvc2luZ1RhZ0Zvckx0R3RKU1hFeHBlY3RlZENsb3NpbmdUYWdJbnZhbGlkTGVhZGluZ0RlY29yYXRvckRlY29yYXRvck9uRXhwb3J0VHNSZXF1aXJlZEFmdGVyT3B0aW9uYWxUc0ludmFsaWRQYXJhbVByb3BQYXRTcGFjZUJldHdlZW5IYXNoQW5kSWRlbnRBc3luY0NvbnN0cnVjdG9yUHJvcGVydHlOYW1lZENvbnN0cnVjdG9yUHJpdmF0ZUNvbnN0cnVjdG9yUHJpdmF0ZU5hbWVNb2RpZmllckNvbnN0cnVjdG9yQWNjZXNzb3JSZWFkT25seU1ldGhvZEdlbmVyYXRvckNvbnN0cnVjdG9yRHVwbGljYXRlQ29uc3RydWN0b3JUc0JpbmRpbmdQYXRDYW5ub3RCZU9wdGlvbmFsU3VwZXJDYWxsT3B0aW9uYWxPcHRDaGFpbkNhbm5vdEZvbGxvd0NvbnN0cnVjdG9yQ2FsbFRhZ2dlZFRwbEluT3B0Q2hhaW5UcmFpbGluZ0NvbW1hSW5zaWRlSW1wb3J0SW1wb3J0UmVxdWlyZXNPbmVPclR3b0FyZ3NFeHBvcnREZWZhdWx0V2l0aE91dEZyb21FeHBvcnRFeHBlY3RGcm9tRG90c1dpdGhvdXRJZGVudGlmaWVyTnVtZXJpY1NlcGFyYXRvcklzQWxsb3dlZE9ubHlCZXR3ZWVuVHdvRGlnaXRzSW1wb3J0QmluZGluZ0lzU3RyaW5nRXhwb3J0QmluZGluZ0lzU3RyaW5nQ29uc3REZWNsYXJhdGlvbnNSZXF1aXJlSW5pdGlhbGl6YXRpb25EdXBsaWNhdGVkUmVnRXhwRmxhZ3NVbmtub3duUmVnRXhwRmxhZ3NUUzEwMDNUUzEwMDVUUzEwMDlUUzEwMTRUUzEwMTVUUzEwMjlUUzEwMzBUUzEwMzFUUzEwMzhUUzEwNDJUUzEwNDdUUzEwNDhUUzEwNTZUUzEwODVUUzEwODlUUzEwOTJUUzEwOTZUUzEwOThUUzExMDBUUzExMDJUUzExMDVUUzExMDZUUzExMDdUUzExMDlUUzExMTBUUzExMTRUUzExMTVUUzExMTZUUzExMjNUUzExNDFUUzExNjJUUzExNjRUUzExNzFUUzExNzJUUzExNzNUUzExNzRUUzExNzVUUzExODNUUzExODRUUzExODVUUzEwOTNUUzExOTZUUzEyNDJUUzEyNDNUUzEyNDRUUzEyNDVUUzEyNjdUUzEyNzNUUzEyNzRUUzEyNzdUUzIyMDZUUzIyMDdUUzIzNjlUUzIzNzFUUzI0MDZUUzI0MTBUUzI0MTRUUzI0MjdUUzI0NTJUUzI0ODNUUzI0OTFUUzI0OTlUUzI3MDNUUzQxMTJUUzgwMzhUUzE4MDEwVFNUeXBlQW5ub3RhdGlvbkFmdGVyQXNzaWduVHNOb25OdWxsQXNzZXJ0aW9uTm90QWxsb3dlZFdpdGhMYWJlbGlubmVybm90ZVJlc2VydmVkVHlwZUFzc2VydGlvblJlc2VydmVkQXJyb3dUeXBlUGFyYW1FbXB0eVR5cGVBcmd1bWVudExpc3QAAAAAAQAAAAEAAACOBQAAjwUAADAAAAAIAAAAkAUAAJEFAAAEAAAABAAAAJIFAAAAAAAABAAAAAQAAACTBQAAAAAAAAQAAAAEAAAATAIAAJQFAAAMAAAABAAAAJUFAAAAAAAABAAAAAQAAACWBQAAlwUAACAAAAAIAAAAAwIAAAAAAAAEAAAABAAAAJgFAAAAAAAABAAAAAQAAACZBQAAmgUAAAwAAAAEAAAAmwUAAJwFAAAEAAAABAAAAJ0FAABQYXJzZUludEVycm9yT2tFcnJhc3NlcnRpb24gZmFpbGVkOiBpbmRpY2VzLmNhcGFjaXR5KCkgLSBpbmRpY2VzLmxlbigpID49IGVudHJpZXMubGVuKCkAbTsgAGQAAABUAAAABQAAAG07IABkAAAAOwAAACMAAABtOyAAZAAAAFYAAABEAAAAbTsgAGQAAAAzAAAADwAAAA89IAArAAAA0QEAADYAAAD1QiAAMgAAAPsAAAABAAAAX2FwcGx5X2RlY29yYXRlZF9kZXNjcmlwdG9yQHN3Yy9oZWxwZXJzL18vX2FwcGx5X2RlY29yYXRlZF9kZXNjcmlwdG9yX2FycmF5X2xpa2VfdG9fYXJyYXlAc3djL2hlbHBlcnMvXy9fYXJyYXlfbGlrZV90b19hcnJheV9hcnJheV93aXRoX2hvbGVzQHN3Yy9oZWxwZXJzL18vX2FycmF5X3dpdGhfaG9sZXNfYXJyYXlfd2l0aG91dF9ob2xlc0Bzd2MvaGVscGVycy9fL19hcnJheV93aXRob3V0X2hvbGVzX2Fzc2VydF90aGlzX2luaXRpYWxpemVkQHN3Yy9oZWxwZXJzL18vX2Fzc2VydF90aGlzX2luaXRpYWxpemVkX2FzeW5jX2dlbmVyYXRvckBzd2MvaGVscGVycy9fL19hc3luY19nZW5lcmF0b3JfYXN5bmNfZ2VuZXJhdG9yX2RlbGVnYXRlQHN3Yy9oZWxwZXJzL18vX2FzeW5jX2dlbmVyYXRvcl9kZWxlZ2F0ZV9hc3luY19pdGVyYXRvckBzd2MvaGVscGVycy9fL19hc3luY19pdGVyYXRvcl9hc3luY190b19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fYXN5bmNfdG9fZ2VuZXJhdG9yX2F3YWl0X2FzeW5jX2dlbmVyYXRvckBzd2MvaGVscGVycy9fL19hd2FpdF9hc3luY19nZW5lcmF0b3JfYXdhaXRfdmFsdWVAc3djL2hlbHBlcnMvXy9fYXdhaXRfdmFsdWVfY2FsbF9zdXBlckBzd2MvaGVscGVycy9fL19jYWxsX3N1cGVyX2NoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbkBzd2MvaGVscGVycy9fL19jaGVja19wcml2YXRlX3JlZGVjbGFyYXRpb25fY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9kZXN0cnVjdHVyZUBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX2Rlc3RydWN0dXJlX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZ2V0X2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3Jfc2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3Jfc2V0X2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlX2NsYXNzX2NhbGxfY2hlY2tAc3djL2hlbHBlcnMvXy9fY2xhc3NfY2FsbF9jaGVja19jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19maWVsZF9kZXNjcmlwdG9yQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2ZpZWxkX2Rlc2NyaXB0b3JfY2xhc3NfZXh0cmFjdF9maWVsZF9kZXNjcmlwdG9yQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvcl9jbGFzc19uYW1lX3Rkel9lcnJvckBzd2MvaGVscGVycy9fL19jbGFzc19uYW1lX3Rkel9lcnJvcl9jbGFzc19wcml2YXRlX2ZpZWxkX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX2dldF9jbGFzc19wcml2YXRlX2ZpZWxkX2luaXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9pbml0X2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2VfYmFzZUBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2Jhc2VfY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9rZXlAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9rZXlfY2xhc3NfcHJpdmF0ZV9maWVsZF9zZXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9zZXRfY2xhc3NfcHJpdmF0ZV9maWVsZF91cGRhdGVAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF91cGRhdGVfY2xhc3NfcHJpdmF0ZV9tZXRob2RfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfbWV0aG9kX2dldF9jbGFzc19wcml2YXRlX21ldGhvZF9pbml0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfbWV0aG9kX2luaXRfY2xhc3NfcHJpdmF0ZV9tZXRob2Rfc2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfbWV0aG9kX3NldF9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX2dldF9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX3NldEBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX3NldF9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF91cGRhdGVAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfdXBkYXRlX2NvbnN0cnVjdEBzd2MvaGVscGVycy9fL19jb25zdHJ1Y3RfY3JlYXRlX2NsYXNzQHN3Yy9oZWxwZXJzL18vX2NyZWF0ZV9jbGFzc19kZWNvcmF0ZUBzd2MvaGVscGVycy9fL19kZWNvcmF0ZV9kZWZhdWx0c0Bzd2MvaGVscGVycy9fL19kZWZhdWx0c19kZWZpbmVfZW51bWVyYWJsZV9wcm9wZXJ0aWVzQHN3Yy9oZWxwZXJzL18vX2RlZmluZV9lbnVtZXJhYmxlX3Byb3BlcnRpZXNfZGVmaW5lX3Byb3BlcnR5QHN3Yy9oZWxwZXJzL18vX2RlZmluZV9wcm9wZXJ0eV9leHBvcnRfc3RhckBzd2MvaGVscGVycy9fL19leHBvcnRfc3Rhcl9leHRlbmRzQHN3Yy9oZWxwZXJzL18vX2V4dGVuZHNfZ2V0QHN3Yy9oZWxwZXJzL18vX2dldF9nZXRfcHJvdG90eXBlX29mQHN3Yy9oZWxwZXJzL18vX2dldF9wcm90b3R5cGVfb2ZfaW5oZXJpdHNAc3djL2hlbHBlcnMvXy9faW5oZXJpdHNfaW5oZXJpdHNfbG9vc2VAc3djL2hlbHBlcnMvXy9faW5oZXJpdHNfbG9vc2VfaW5pdGlhbGl6ZXJfZGVmaW5lX3Byb3BlcnR5QHN3Yy9oZWxwZXJzL18vX2luaXRpYWxpemVyX2RlZmluZV9wcm9wZXJ0eV9pbml0aWFsaXplcl93YXJuaW5nX2hlbHBlckBzd2MvaGVscGVycy9fL19pbml0aWFsaXplcl93YXJuaW5nX2hlbHBlcl9pbnN0YW5jZW9mQHN3Yy9oZWxwZXJzL18vX2luc3RhbmNlb2ZfaW50ZXJvcF9yZXF1aXJlX2RlZmF1bHRAc3djL2hlbHBlcnMvXy9faW50ZXJvcF9yZXF1aXJlX2RlZmF1bHRfaW50ZXJvcF9yZXF1aXJlX3dpbGRjYXJkQHN3Yy9oZWxwZXJzL18vX2ludGVyb3BfcmVxdWlyZV93aWxkY2FyZF9pc19uYXRpdmVfZnVuY3Rpb25Ac3djL2hlbHBlcnMvXy9faXNfbmF0aXZlX2Z1bmN0aW9uX2l0ZXJhYmxlX3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX2l0ZXJhYmxlX3RvX2FycmF5X2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0QHN3Yy9oZWxwZXJzL18vX2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2xvb3NlQHN3Yy9oZWxwZXJzL18vX2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2xvb3NlX2pzeEBzd2MvaGVscGVycy9fL19qc3hfbmV3X2Fycm93X2NoZWNrQHN3Yy9oZWxwZXJzL18vX25ld19hcnJvd19jaGVja19ub25faXRlcmFibGVfcmVzdEBzd2MvaGVscGVycy9fL19ub25faXRlcmFibGVfcmVzdF9ub25faXRlcmFibGVfc3ByZWFkQHN3Yy9oZWxwZXJzL18vX25vbl9pdGVyYWJsZV9zcHJlYWRfb2JqZWN0X2Rlc3RydWN0dXJpbmdfZW1wdHlAc3djL2hlbHBlcnMvXy9fb2JqZWN0X2Rlc3RydWN0dXJpbmdfZW1wdHlfb2JqZWN0X3NwcmVhZEBzd2MvaGVscGVycy9fL19vYmplY3Rfc3ByZWFkX29iamVjdF9zcHJlYWRfcHJvcHNAc3djL2hlbHBlcnMvXy9fb2JqZWN0X3NwcmVhZF9wcm9wc19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzQHN3Yy9oZWxwZXJzL18vX29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc19sb29zZUBzd2MvaGVscGVycy9fL19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3NlX292ZXJsb2FkX3lpZWxkQHN3Yy9oZWxwZXJzL18vX292ZXJsb2FkX3lpZWxkX3Bvc3NpYmxlX2NvbnN0cnVjdG9yX3JldHVybkBzd2MvaGVscGVycy9fL19wb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm5fcmVhZF9vbmx5X2Vycm9yQHN3Yy9oZWxwZXJzL18vX3JlYWRfb25seV9lcnJvcl9zZXRAc3djL2hlbHBlcnMvXy9fc2V0X3NldF9wcm90b3R5cGVfb2ZAc3djL2hlbHBlcnMvXy9fc2V0X3Byb3RvdHlwZV9vZl9za2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0QHN3Yy9oZWxwZXJzL18vX3NraXBfZmlyc3RfZ2VuZXJhdG9yX25leHRfc2xpY2VkX3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX3NsaWNlZF90b19hcnJheV9zbGljZWRfdG9fYXJyYXlfbG9vc2VAc3djL2hlbHBlcnMvXy9fc2xpY2VkX3RvX2FycmF5X2xvb3NlX3N1cGVyX3Byb3BfYmFzZUBzd2MvaGVscGVycy9fL19zdXBlcl9wcm9wX2Jhc2VfdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxAc3djL2hlbHBlcnMvXy9fdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfbG9vc2VAc3djL2hlbHBlcnMvXy9fdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfbG9vc2VfdGhyb3dAc3djL2hlbHBlcnMvXy9fdGhyb3dfdG9fYXJyYXlAc3djL2hlbHBlcnMvXy9fdG9fYXJyYXlfdG9fY29uc3VtYWJsZV9hcnJheUBzd2MvaGVscGVycy9fL190b19jb25zdW1hYmxlX2FycmF5X3RvX3ByaW1pdGl2ZUBzd2MvaGVscGVycy9fL190b19wcmltaXRpdmVfdG9fcHJvcGVydHlfa2V5QHN3Yy9oZWxwZXJzL18vX3RvX3Byb3BlcnR5X2tleV91cGRhdGVAc3djL2hlbHBlcnMvXy9fdXBkYXRlX3R5cGVfb2ZAc3djL2hlbHBlcnMvXy9fdHlwZV9vZl91bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheUBzd2MvaGVscGVycy9fL191bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheV93cmFwX2FzeW5jX2dlbmVyYXRvckBzd2MvaGVscGVycy9fL193cmFwX2FzeW5jX2dlbmVyYXRvcl93cmFwX25hdGl2ZV9zdXBlckBzd2MvaGVscGVycy9fL193cmFwX25hdGl2ZV9zdXBlcl93cmFwX3JlZ19leHBAc3djL2hlbHBlcnMvXy9fd3JhcF9yZWdfZXhwX3dyaXRlX29ubHlfZXJyb3JAc3djL2hlbHBlcnMvXy9fd3JpdGVfb25seV9lcnJvcl9jbGFzc19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfZGVzdHJ1Y3R1cmVfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfZGVzdHJ1Y3R1cmVAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfZGVzdHJ1Y3R1cmVfY2xhc3Nfc3RhdGljX3ByaXZhdGVfbWV0aG9kX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9tZXRob2RfZ2V0X2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2Vzc0Bzd2MvaGVscGVycy9fL19jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19hY2Nlc3NfaXNfbmF0aXZlX3JlZmxlY3RfY29uc3RydWN0QHN3Yy9oZWxwZXJzL18vX2lzX25hdGl2ZV9yZWZsZWN0X2NvbnN0cnVjdF9jcmVhdGVfc3VwZXJAc3djL2hlbHBlcnMvXy9fY3JlYXRlX3N1cGVyX2NyZWF0ZV9mb3Jfb2ZfaXRlcmF0b3JfaGVscGVyX2xvb3NlQHN3Yy9oZWxwZXJzL18vX2NyZWF0ZV9mb3Jfb2ZfaXRlcmF0b3JfaGVscGVyX2xvb3NlX3RzX2RlY29yYXRlQHN3Yy9oZWxwZXJzL18vX3RzX2RlY29yYXRlX3RzX2dlbmVyYXRvckBzd2MvaGVscGVycy9fL190c19nZW5lcmF0b3JfdHNfbWV0YWRhdGFAc3djL2hlbHBlcnMvXy9fdHNfbWV0YWRhdGFfdHNfcGFyYW1Ac3djL2hlbHBlcnMvXy9fdHNfcGFyYW1fdHNfdmFsdWVzQHN3Yy9oZWxwZXJzL18vX3RzX3ZhbHVlc190c19hZGRfZGlzcG9zYWJsZV9yZXNvdXJjZUBzd2MvaGVscGVycy9fL190c19hZGRfZGlzcG9zYWJsZV9yZXNvdXJjZV90c19kaXNwb3NlX3Jlc291cmNlc0Bzd2MvaGVscGVycy9fL190c19kaXNwb3NlX3Jlc291cmNlc190c19yZXdyaXRlX3JlbGF0aXZlX2ltcG9ydF9leHRlbnNpb25Ac3djL2hlbHBlcnMvXy9fdHNfcmV3cml0ZV9yZWxhdGl2ZV9pbXBvcnRfZXh0ZW5zaW9uX2FwcGx5X2RlY3NfMjIwM19yQHN3Yy9oZWxwZXJzL18vX2FwcGx5X2RlY3NfMjIwM19yX2FwcGx5X2RlY3NfMjMxMUBzd2MvaGVscGVycy9fL19hcHBseV9kZWNzXzIzMTFfaWRlbnRpdHlAc3djL2hlbHBlcnMvXy9faWRlbnRpdHlfZGlzcG9zZUBzd2MvaGVscGVycy9fL19kaXNwb3NlX3VzaW5nQHN3Yy9oZWxwZXJzL18vX3VzaW5nX3VzaW5nX2N0eEBzd2MvaGVscGVycy9fL191c2luZ19jdHhhcHBseV9kZWNvcmF0ZWRfZGVzY3JpcHRvcmFycmF5X2xpa2VfdG9fYXJyYXlhcnJheV93aXRoX2hvbGVzYXJyYXlfd2l0aG91dF9ob2xlc2Fzc2VydF90aGlzX2luaXRpYWxpemVkYXN5bmNfZ2VuZXJhdG9yYXN5bmNfZ2VuZXJhdG9yX2RlbGVnYXRlYXN5bmNfaXRlcmF0b3Jhc3luY190b19nZW5lcmF0b3Jhd2FpdF9hc3luY19nZW5lcmF0b3Jhd2FpdF92YWx1ZWNhbGxfc3VwZXJjaGVja19wcml2YXRlX3JlZGVjbGFyYXRpb25jbGFzc19hcHBseV9kZXNjcmlwdG9yX2Rlc3RydWN0dXJlY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9nZXRjbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldGNsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlY2xhc3NfY2FsbF9jaGVja2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2ZpZWxkX2Rlc2NyaXB0b3JjbGFzc19leHRyYWN0X2ZpZWxkX2Rlc2NyaXB0b3JjbGFzc19uYW1lX3Rkel9lcnJvcmNsYXNzX3ByaXZhdGVfZmllbGRfZ2V0Y2xhc3NfcHJpdmF0ZV9maWVsZF9pbml0Y2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9iYXNlY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9rZXljbGFzc19wcml2YXRlX2ZpZWxkX3NldGNsYXNzX3ByaXZhdGVfZmllbGRfdXBkYXRlY2xhc3NfcHJpdmF0ZV9tZXRob2RfZ2V0Y2xhc3NfcHJpdmF0ZV9tZXRob2RfaW5pdGNsYXNzX3ByaXZhdGVfbWV0aG9kX3NldGNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3NwZWNfZ2V0Y2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19zZXRjbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF91cGRhdGVjb25zdHJ1Y3RjcmVhdGVfY2xhc3NkZWNvcmF0ZWRlZmF1bHRzZGVmaW5lX2VudW1lcmFibGVfcHJvcGVydGllc2RlZmluZV9wcm9wZXJ0eWV4cG9ydF9zdGFyZ2V0X3Byb3RvdHlwZV9vZmluaGVyaXRzaW5oZXJpdHNfbG9vc2Vpbml0aWFsaXplcl9kZWZpbmVfcHJvcGVydHlpbml0aWFsaXplcl93YXJuaW5nX2hlbHBlcmludGVyb3BfcmVxdWlyZV9kZWZhdWx0aW50ZXJvcF9yZXF1aXJlX3dpbGRjYXJkaXNfbmF0aXZlX2Z1bmN0aW9uaXRlcmFibGVfdG9fYXJyYXlpdGVyYWJsZV90b19hcnJheV9saW1pdGl0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2xvb3NlanN4bmV3X2Fycm93X2NoZWNrbm9uX2l0ZXJhYmxlX3Jlc3Rub25faXRlcmFibGVfc3ByZWFkb2JqZWN0X2Rlc3RydWN0dXJpbmdfZW1wdHlvYmplY3Rfc3ByZWFkb2JqZWN0X3NwcmVhZF9wcm9wc29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3Nlb3ZlcmxvYWRfeWllbGRwb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm5yZWFkX29ubHlfZXJyb3JzZXRfcHJvdG90eXBlX29mc2tpcF9maXJzdF9nZW5lcmF0b3JfbmV4dHNsaWNlZF90b19hcnJheXNsaWNlZF90b19hcnJheV9sb29zZXN1cGVyX3Byb3BfYmFzZXRhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfbG9vc2V0b19hcnJheXRvX2NvbnN1bWFibGVfYXJyYXl0b19wcmltaXRpdmV0b19wcm9wZXJ0eV9rZXl1cGRhdGV0eXBlX29mdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXl3cmFwX2FzeW5jX2dlbmVyYXRvcndyYXBfbmF0aXZlX3N1cGVyd3JhcF9yZWdfZXhwd3JpdGVfb25seV9lcnJvcmNsYXNzX3ByaXZhdGVfZmllbGRfZGVzdHJ1Y3R1cmVjbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZWNsYXNzX3N0YXRpY19wcml2YXRlX21ldGhvZF9nZXRjbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19hY2Nlc3Npc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3RjcmVhdGVfc3VwZXJjcmVhdGVfZm9yX29mX2l0ZXJhdG9yX2hlbHBlcl9sb29zZXRzX2RlY29yYXRldHNfZ2VuZXJhdG9ydHNfbWV0YWRhdGF0c19wYXJhbXRzX3ZhbHVlc3RzX2FkZF9kaXNwb3NhYmxlX3Jlc291cmNldHNfZGlzcG9zZV9yZXNvdXJjZXN0c19yZXdyaXRlX3JlbGF0aXZlX2ltcG9ydF9leHRlbnNpb25hcHBseV9kZWNzXzIyMDNfcmFwcGx5X2RlY3NfMjMxMWlkZW50aXR5ZGlzcG9zZXVzaW5nX2N0eGFyZ3VtZW50cwBtOyAAZAAAAKICAAAsAAAAbTsgAGQAAAB6AgAAIgAAAG07IABkAAAAWAEAADgAAABtOyAAZAAAAMgBAAA0AAAAJRggAB4AAAANAAAAFAAAAJ4FAABNYXJrZXIgcHJvdmlkZWQgdG8gcmVzb2x2ZXIgc2hvdWxkIG5vdCBiZSB0aGUgcm9vdCBtYXJrANxEIAAzAAAAhwAAAAUAAABpbmRleCBub3QgZm91bmQAbTsgAGQAAABLAAAACgAAAE51bWJlckZ1bmN0aW9uQmlnSW50AAAAAAgAAAAEAAAA/AAAAFRzUXVhbGlmaWVkTmFtZXNwYW5sZWZ0cmlnaHRvBQAAEAAAAAgAAABwBQAAnwUAAAQAAAAEAAAAoAUAAAAAAAABAAAAAQAAAKEFAAAAAAAAAQAAAAEAAABUAQAAAAAAAAEAAAABAAAAogUAAAAAAAAEAAAABAAAAGIBAABrZXlraW5kaXNfc3RhdGljYWNjZXNzaWJpbGl0eWlzX2Fic3RyYWN0aXNfb3B0aW9uYWxpc19vdmVycmlkZQAAy5EmAAQAAAA4kiYAAwAAABW3JgAIAAAAO5ImAAQAAAA/kiYACQAAAEiSJgANAAAAVZImAAsAAABgkiYACwAAAGuSJgALAAAAUHJpdmF0ZU1ldGhvZEpTWFNwcmVhZENoaWxkZXhwcgAAAAAABAAAAAQAAABtAgAAUmVzdFBhdGRvdDNfdG9rZW5hcmd0eXBlX2FubnUFAAAYAAAACAAAALQBAABGbkRlY2xpZGVudFN0ck51bUNvbXB1dGVkAAAAdgUAAAwAAAAEAAAAKAMAAKMFAAAEAAAABAAAANcCAAAAAAAABAAAAAQAAAApAwAAVHNDYWxsU2lnbmF0dXJlRGVjbHBhcmFtc3R5cGVfcGFyYW1zVHNJbnRlcmZhY2VEZWNsVGhpc1VuYXJ5VXBkYXRlQmluTWVtYmVyU3VwZXJQcm9wQ29uZENhbGxOZXdTZXFMaXRUcGxUYWdnZWRUcGxBcnJvd1lpZWxkTWV0YVByb3BBd2FpdFBhcmVuSlNYTWVtYmVySlNYTmFtZXNwYWNlZE5hbWVKU1hFbXB0eUpTWEVsZW1lbnRKU1hGcmFnbWVudFRzVHlwZUFzc2VydGlvblRzQ29uc3RBc3NlcnRpb25Uc05vbk51bGxUc0FzVHNJbnN0YW50aWF0aW9uVHNTYXRpc2ZpZXNQcml2YXRlTmFtZU9wdENoYWluSlNYQ2xvc2luZ0VsZW1lbnRuYW1lU3RhdGljQmxvY2tib2R5VHNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsRGVidWdnZXJTdG10TmFtZWREZWZhdWx0TmFtZXNwYWNlSlNYQXR0cnZhbHVlAACkBQAABAAAAAQAAACfAgAAVmFyRGVjbGFyYXRvcmluaXRkZWZpbml0ZVByaXZhdGVQdWJsaWNSZWdleGV4cGZsYWdzAKUFAAAEAAAABAAAAJICAABjb21wdXRlZG9wdGlvbmFsy5EmAAQAAAC4tyYACAAAADiSJgADAAAARJUmAAgAAABMlSYACAAAAASTJgAIAAAAVHNQcm9wZXJ0eVNpZ25hdHVyZVdpdGhTdG10b2JqVXNpbmdEZWNsaXNfYXdhaXRkZWNsc0ltcG9ydERlZmF1bHRTcGVjaWZpZXJsb2NhbAB6BQAABAAAAAQAAAD8AQAARXhwb3J0QWxsc3JjdHlwZV9vbmx5AAAAAAAAAAQAAAAEAAAAWwEAAKYFAAAgAAAACAAAANYCAAB8BQAADAAAAAQAAACnBQAAfgUAABgAAAAEAAAAqAUAAGN0eHTLkSYABAAAADyWJgAEAAAAOJImAAMAAAB7kyYABgAAAKWUJgAEAAAASJImAA0AAABgkiYACwAAAENvbnN0cnVjdG9ySlNYTWVtYmVyRXhwcnJhd0tleVZhbHVlQ2xhc3NEZWNsTmFtZWRFeHBvcnRzcGVjaWZpZXJzQ29tcHV0ZWRQcm9wTmFtZURlY29yYXRvckpTWE9wZW5pbmdFbGVtZW50YXR0cnNzZWxmX2Nsb3Npbmd0eXBlX2FyZ3NUc0dldHRlclNpZ25hdHVyZVRzU2V0dGVyU2lnbmF0dXJlVHNNZXRob2RTaWduYXR1cmVUc0luZGV4U2lnbmF0dXJlRXhwclN0bXRLZXlWYWx1ZVBhdFByb3BWYXJEZWNsRXhwb3J0RGVmYXVsdERlY2xkZWNsTWV0aG9kR2V0dGVyU2V0dGVyU3ByZWFkRWxlbWVudEJvb2xBc3NpZ25QYXRQcm9wRW1wdHlTdG10UmV0dXJuU3RtdAAAqQUAACAAAAAIAAAAqgUAAIIFAAAMAAAABAAAADsDAABkZWNvcmF0b3JzAADLkSYABAAAADiSJgADAAAA6ZQmAAUAAAAEkyYACAAAAD+SJgAJAAAA2JcmAAoAAABIkiYADQAAAFWSJgALAAAAa5ImAAsAAAARlSYACAAAAEF1dG9BY2Nlc3NvckltcG9ydFN0YXJBc1NwZWNpZmllclRoaXNFeHByRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVySlNYVGV4dEpTWEV4cHJDb250YWluZXJJZlN0bXR0ZXN0Y29uc2FsdEFycmF5TGl0ZWxlbXNFeHBvcnREZWZhdWx0U3BlY2lmaWVyZXhwb3J0ZWRvcGVuaW5nY2hpbGRyZW5jbG9zaW5nU3dpdGNoU3RtdGRpc2NyaW1pbmFudGNhc2VzVHNLZXl3b3JkVHlwZVRzVGhpc1R5cGVUc0ZuT3JDb25zdHJ1Y3RvclR5cGVUc1R5cGVSZWZUc1R5cGVRdWVyeVRzVHlwZUxpdFRzQXJyYXlUeXBlVHNUdXBsZVR5cGVUc09wdGlvbmFsVHlwZVRzUmVzdFR5cGVUc1VuaW9uT3JJbnRlcnNlY3Rpb25UeXBlVHNDb25kaXRpb25hbFR5cGVUc0luZmVyVHlwZVRzUGFyZW50aGVzaXplZFR5cGVUc1R5cGVPcGVyYXRvclRzSW5kZXhlZEFjY2Vzc1R5cGVUc01hcHBlZFR5cGVUc0xpdFR5cGVUc1R5cGVQcmVkaWNhdGVUc0ltcG9ydFR5cGVFeHBvcnROYW1lZFNwZWNpZmllcm9yaWdpc190eXBlX29ubHlPYmplY3RMaXRwcm9wc0pTWE9wZW5pbmdGcmFnbWVudAAAANxEIAAzAAAA7wYAADIAAACDBQAADAAAAAQAAACrBQAAhQUAAAQAAAAEAAAAAQMAAGlzX2dlbmVyYXRvcmlzX2FzeW5jcmV0dXJuX3R5cGUAe5MmAAYAAADYlyYACgAAAMuRJgAEAAAAPJYmAAQAAACllCYABAAAAICaJgAMAAAAjJomAAgAAACBkyYACwAAAJSaJgALAAAAcGFyYW1MYWJlbGVkU3RtdGxhYmVsSW1wb3J0TmFtZWRTcGVjaWZpZXJpbXBvcnRlZAAAAMuRJgAEAAAAOJImAAMAAABElSYACAAAAEyVJgAIAAAAe5MmAAYAAAAEkyYACAAAAIGTJgALAAAAQnJlYWtTdG10Q29udGludWVTdG10VGhyb3dTdG10VHNGblR5cGVUc0NvbnN0cnVjdG9yVHlwZUpTWENsb3NpbmdGcmFnbWVudFVuYXJ5RXhwcm9wRm9yU3RtdFVwZGF0ZUV4cHJwcmVmaXhGb3JJblN0bXRCaW5FeHByRm9yT2ZTdG10VHJ5U3RtdGJsb2NraGFuZGxlcmZpbmFsaXplclNwcmVhZFByb3BUc0FueUtleXdvcmRUc1Vua25vd25LZXl3b3JkVHNOdW1iZXJLZXl3b3JkVHNPYmplY3RLZXl3b3JkVHNCb29sZWFuS2V5d29yZFRzQmlnSW50S2V5d29yZFRzU3RyaW5nS2V5d29yZFRzU3ltYm9sS2V5d29yZFRzVm9pZEtleXdvcmRUc1VuZGVmaW5lZEtleXdvcmRUc051bGxLZXl3b3JkVHNOZXZlcktleXdvcmRUc0ludHJpbnNpY0tleXdvcmRXaGlsZVN0bXREb1doaWxlU3RtdEZuRXhwclN3aXRjaENhc2VleHByX25hbWVNZW1iZXJFeHBycHJvcFRzRW50aXR5TmFtZUltcG9ydFRzSW1wb3J0Q2FsbE9wdGlvbnN0eXBlX25hbWVDYXRjaENsYXVzZXBhcmFtX25hbWVDbGFzc0V4cHJQYXRBc3NpZ25FeHByU3VwZXJQcm9wRXhwcgAAhgUAAAQAAAAEAAAAnAIAAHF1YWxpZmllcmF0dHJpYnV0ZXNUc1R1cGxlRWxlbWVudHR5TmV3RXhwcmNhbGxlZWFyZ3NTZXFFeHByZXhwcnNtZW1iZXJzZWxlbV90eXBlQ29uZEV4cHJlbGVtX3R5cGVzQ2FsbEV4cHIAAIcFAAAMAAAABAAAAKwFAACtBQAABAAAAAQAAACuBQAAy5EmAAQAAAA8liYABAAAAHuTJgAGAAAApZQmAAQAAACMmiYACAAAAICaJgAMAAAAgZMmAAsAAACUmiYACwAAAEFycm93RXhwclRzVW5pb25UeXBlVHNJbnRlcnNlY3Rpb25UeXBlY2hlY2tfdHlwZWV4dGVuZHNfdHlwZXRydWVfdHlwZWZhbHNlX3R5cGV0eXBlX3BhcmFtQXdhaXRFeHBycXVhc2lzVHNUeXBlQW5uAAAAiwUAAAwAAAAEAAAArwUAAAAAAAAEAAAABAAAALAFAABzdXBlcl9jbGFzc3N1cGVyX3R5cGVfcGFyYW1zy5EmAAQAAAA8liYABAAAANiXJgAKAAAApZQmAAQAAADUniYACwAAAFWSJgALAAAAgZMmAAsAAADfniYAEQAAAHi/JgAKAAAAWWllbGRFeHByZGVsZWdhdGV0eXBlc01ldGFQcm9wRXhwcnRhZ3RwbFN1cGVyAAAAAAAAAAEAAAABAAAAsQUAALIFAAAwAAAACAAAALMFAAC0BQAABAAAAAQAAAC1BQAAAAAAAAQAAAAEAAAAtgUAAG5hbWVfdHlwZQAAAMuRJgAEAAAAuLcmAAgAAACPniYACgAAAKifJgAJAAAATJUmAAgAAAAEkyYACAAAAGxpdAAAAAAABAAAAAQAAABWAwAAcGhhc2VUcGxFbGVtZW50dGFpbGNvb2tlZG9ial90eXBlaW5kZXhfdHlwZVBhcmVuRXhwclRydWVQbHVzTWludXNFeHByT3JTcHJlYWRzcHJlYWRUc0V4cHJXaXRoVHlwZUFyZ3NUc1R5cGVBbGlhc0RlY2xpZFRzRW51bURlY2xpc19jb25zdFRzVHBsTGl0VHlwZUJsb2NrU3RtdAAAAJQFAAAMAAAABAAAALcFAAAAAAAABAAAAAQAAAC4BQAAy5EmAAQAAABsoCYAAgAAAAm3JgAHAAAAgZMmAAsAAAAotyYABwAAAKWUJgAEAAAAU2ltcGxlVHNJbnRlcmZhY2VCb2R5VHNFbnVtTWVtYmVyT3B0Q2FsbFRzTW9kdWxlQmxvY2tUc05hbWVzcGFjZURlY2xTaG9ydGhhbmRPcHRDaGFpbkV4cHJiYXNlAAAAlwUAACAAAAAIAAAAAwIAAAAAAAAEAAAABAAAALkFAADLkSYABAAAAAm3JgAHAAAAU7kmAAYAAABEuSYACQAAAGygJgACAAAApZQmAAQAAABUc01vZHVsZURlY2xKU1hFbXB0eUV4cHJNb2R1bGVEZWNsU3RtdEJsb2NrRW1wdHlEZWJ1Z2dlcldpdGhSZXR1cm5MYWJlbGVkQnJlYWtDb250aW51ZUlmU3dpdGNoVGhyb3dUcnlXaGlsZURvV2hpbGVGb3JGb3JJbkZvck9mRGVjbEdldHRlclByb3BBcnJheVBhdAAAAAAAAAAEAAAABAAAALoFAADLkSYABAAAANiXJgAKAAAASJImAA0AAABrkiYACwAAALi3JgAIAAAA6JomAAUAAABUc1BhcmFtUHJvcEV4cG9ydERlY2wAAADLkSYABAAAADyWJgAEAAAAOJImAAMAAADplCYABQAAAASTJgAIAAAAP5ImAAkAAADYlyYACgAAAEiSJgANAAAAYJImAAsAAABrkiYACwAAALi3JgAIAAAAEZUmAAgAAABQcml2YXRlUHJvcHN5bU9iamVjdFBhdFNldHRlclByb3B0aGlzX3BhcmFtAJoFAAAMAAAABAAAAJsFAACcBQAABAAAAAQAAAC7BQAAy5EmAAQAAACvliYACgAAAO2VJgADAAAA8JUmAAkAAADCtiYABAAAAPifJgAFAAAASW1wb3J0RGVjbENsYXNzTWV0aG9kQXNzaWduUGF0SWRlbnROYW1lRXZhbHVhdGlvblNvdXJjZURlZmVyTWV0aG9kUHJvcAAAoSMgACwAAADXAAAAQAAAAFRzRXhwb3J0QXNzaWdubWVudFRzTmFtZXNwYWNlRXhwb3J0RGVjbFRzQXNFeHByVHNJbXBvcnRFcXVhbHNEZWNsaXNfZXhwb3J0bW9kdWxlX3JlZlRzRXh0ZXJuYWxNb2R1bGVSZWZzdG10c1RzTm9uTnVsbEV4cHJUc1NhdGlzZmllc0V4cHJQcm90ZWN0ZWRQYXJhbXBhdEV4cG9ydE5hbWVkRXhwb3J0RGVmYXVsdEV4cHJUc0ltcG9ydEVxdWFsc1RzTmFtZXNwYWNlRXhwb3J0VHNUeXBlUGFyYW1EZWNsS2V5VmFsdWVQcm9wQ2xhc3NQcm9waXNfaW5pc19vdXRjb25zdHJhaW50AAAAy5EmAAQAAACWlCYABAAAALSkJgAFAAAAuaQmAAYAAAB4oCYACAAAAL+kJgAKAAAANLYmAAcAAABUc1R5cGVQYXJhbW5zQXNzaWduUHJvcFRzVHlwZVBhcmFtSW5zdGFudGlhdGlvbgDLkSYABAAAADiSJgADAAAA6ZQmAAUAAAAEkyYACAAAAD+SJgAJAAAA2JcmAAoAAABIkiYADQAAAFWSJgALAAAAYJImAAsAAABrkiYACwAAALi3JgAIAAAACbcmAAcAAAARlSYACAAAAEJpbmRpbmdJZGVudIQwIAA2AAAAaAQAAEUAAAC8BQAAKAAAAAgAAAAtAwAAhDAgADYAAABbBQAAQAAAAEVTTS1zdHlsZSBtb2R1bGUgZGVjbGFyYXRpb25zIGFyZSBub3QgcGVybWl0dGVkIGluIGEgbmFtZXNwYWNlLkltcG9ydCBkZWNsYXJhdGlvbnMgaW4gYSBuYW1lc3BhY2UgY2Fubm90IHJlZmVyZW5jZSBhIG1vZHVsZS5JbXBvcnQgYXNzaWdubWVudCBjYW5ub3QgYmUgdXNlZCB3aGVuIHRhcmdldGluZyBFQ01BU2NyaXB0IG1vZHVsZXMuIENvbnNpZGVyIHVzaW5nIGBpbXBvcnQgKiBhcyBucyBmcm9tICJtb2QiYCwgYGltcG9ydCB7YX0gZnJvbSAibW9kImAsIGBpbXBvcnQgZCBmcm9tICJtb2QiYCwgb3IgYW5vdGhlciBtb2R1bGUgZm9ybWF0IGluc3RlYWQuRXhwb3J0IGFzc2lnbm1lbnQgY2Fubm90IGJlIHVzZWQgd2hlbiB0YXJnZXRpbmcgRUNNQVNjcmlwdCBtb2R1bGVzLiBDb25zaWRlciB1c2luZyBgZXhwb3J0IGRlZmF1bHRgIG9yIGFub3RoZXIgbW9kdWxlIGZvcm1hdCBpbnN0ZWFkLgAAvQUAAAQAAAAEAAAAkgIAAJBLIAAgAAAACwoAADwAAABfY3JlYXRlUmVxdWlyZWV4cG9ydHNjcmVhdGVSZXF1aXJlX19yZXF1aXJlTmFOSW5maW5pdHlpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBkZXN0cnVjdHVyaW5nIHBhdHRlcm4gaW5zaWRlIFRzUGFyYW1ldGVyUHJvcGVydHmEMCAANgAAAAoBAAAhAAAA2C8gADQAAADhAAAAGgAAANgvIAA0AAAAtwAAABIAAACEMCAANgAAAO8EAAANAAAAhDAgADYAAACABQAAHQAAAIQwIAA2AAAA8gUAAFEAAACEMCAANgAAAP8FAABWAAAAhDAgADYAAAD0BgAAGgAAAIQwIAA2AAAA8gYAABoAAABub3QgaW1wbGVtZW50ZWQAkEsgACAAAAD9CQAAPgAAAJBLIAAgAAAA6gkAACYAAABfYXdhaXQAAKARIAA3AAAARgAAACwAAACEMCAANgAAAPUBAAAsAAAAbmFtZXNwYWNlIGJsb2NrIHN0YWNrIHNob3VsZCBjb250YWluIGN1cnJlbnQgYmxvY2sAAD9LIAA1AAAAAwIAAA4AAAAqBQAADAAAAAQAAAArBQAALAUAALMDAAAAAAAAAAAAAAEAAAAtBQAAT25seSBhbWJpZW50IG1vZHVsZXMgY2FuIHVzZSBxdW90ZWQgbmFtZXMuAACEMCAANgAAAMgHAAAOAAAAQ2xhc3NGblZhclVzaW5nVHNJbnRlcmZhY2VUc1R5cGVBbGlhc1RzRW51bVRzTW9kdWxlAAAAAAAMAAAABAAAAMIFAADDBQAAY29uc3RydWN0b3Igc2hvdWxkIGhhdmUgYSBib2R5AABaISAAKAAAAA4AAAAgAAAAKgUAAAwAAAAEAAAAKwUAACwFAACzAwAAAAAAAAAAAAABAAAALQUAAFN5bWJvbAAAqykgACMAAACAAgAAFAAAAKspIAAjAAAAqAIAADwAAACrKSAAIwAAAJcCAAA+AAAAAAAAAAAAAAABAAAAtAMAAKkqIABPAAAACQIAADcAAADFBQAALAAAAAQAAADGBQAAxwUAAMgFAADJBQAAygUAAMsFAACXAwAAsAMAAAwAAAAEAAAAFwUAAMwFAACzAwAAGEAgAF4AAAAxBgAAAwAAABwPIABaAAAAJwEAAAIAAAC9PiAAWwAAAPAAAABNAAAAYXNzZXJ0aW9uIGZhaWxlZDogZWRnZS5oZWlnaHQgPT0gc2VsZi5ub2RlLmhlaWdodCAtIDEAAAC9PiAAWwAAAAMEAAAJAAAAvT4gAFsAAAATBQAAJAAAAEo6IABfAAAAWAIAADAAAAAtJSAAYgAAAEwIAAAzAAAAdXV1dXV1dXVidG51ZnJ1dXV1dXV1dXV1dXV1dXV1dXUAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0lIABiAAAAPwgAAEAAAAB1OAAA5yAgAEgAAACxAAAAFgAAAGF0dGVtcHQgdG8gam9pbiBpbnRvIGNvbGxlY3Rpb24gd2l0aCBsZW4gPiB1c2l6ZTo6TUFYAAAA5yAgAEgAAACaAAAACgAAAGFzc2VydGlvbiBmYWlsZWQ6IHNyYy5sZW4oKSA9PSBkc3QubGVuKCm9PiAAWwAAAFQHAAAFAAAAQRAgAGEAAAA4AAAAGwAAAGxpbmVjb2x1bW5vZmZzZXR1cmxtYXB2ZXJzaW9uZmlsZXNvdXJjZXNzb3VyY2VSb290c291cmNlc0NvbnRlbnRzZWN0aW9uc25hbWVzc2NvcGVzcmFuZ2VNYXBwaW5nc21hcHBpbmdzaWdub3JlTGlzdHhfZmFjZWJvb2tfb2Zmc2V0c3hfbWV0cm9fbW9kdWxlX3BhdGhzeF9mYWNlYm9va19zb3VyY2VzZGVidWdfaWRkZWJ1Z0lkAAAALSUgAGIAAAB/AgAAKgAAACJcIlxcXGJcZlxuXHJcdACoCyAAYAAAAKABAAAuAAAASjogAF8AAAAWAgAALwAAAFY1IABiAAAAjgoAAAEAAAAYQCAAXgAAAPcAAAAfAAAAGEAgAF4AAABPAQAAIwAAAM0FAAAUAAAABAAAAM4FAAAAAAAACAAAAAQAAADPBQAAQ2Fubm90IHNldCBzb3VyY2VzIGZvciB0b21ic3RvbmUgc291cmNlIGlkAACMKCAAIwAAAIMAAAAJAAAAjCggACMAAACHAAAAHQAAAEo6IABfAAAAoQAAACQAAAC9PiAAWwAAANAEAAAjAAAALSUgAGIAAAANBgAAEgAAAGh0dHA6aHR0cHM6YXNzZXJ0aW9uIGZhaWxlZDogZWRnZS5oZWlnaHQgPT0gc2VsZi5oZWlnaHQgLSAxAL0+IABbAAAAtgIAAAkAAABKOiAAXwAAAMYAAAAnAAAAQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL2ludmFsaWQgdXRmOL8nIAAjAAAAZgAAACEAAABpbnZhbGlkIGJ5dGW/JyAAIwAAACMAAAASAAAATnVsbFB0ckVycm9ySW5jbHVkZWRFeGNsdWRlZFVuYm91bmRlZAAAAC0lIABiAAAACgIAACoAAABNaXNhbGlnbkVycm9yAAAAAQAAAC4ubGVmdG92ZXIgY3VyL3NoaWZ0IGluIHZscSBkZWNvZGV2bHEgZGVjb2RlIGRpZCBub3QgcHJvZHVjZSBhbnkgdmFsdWVzdmxxIGRlY29kZSBjYXVzZWQgYW4gb3ZlcmZs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c2V+EyAAIwAAABEBAAAdAAAAfhMgACMAAAAUAQAAQQAAAHRocm93Y29uc3RydWN0b3JwdWJsaWNwcm90ZWN0ZWRwcml2YXRlIy50aGlza2V5b2Z1bmlxdWVpbm91dDtzdXBlcjwvdHJ5ZmluYWxseXdoaWxlcmVxdWlyZTw+ZG8BPy48Lz5mb3I8aW52YWxpZD5vZmJyZWFrY29udGludWVpZmVsc2VpbmZlcm5ldy50YXJnZXRpbXBvcnQubWV0YWludGVyZmFjZWFueXVua25vd25udW1iZXJvYmplY3Rib29sZWFuYmlnaW50c3RyaW5nc3ltYm9sdm9pZHVuZGVmaW5lZG5ldmVyaW50cmluc2ljYADYESAAKQAAABUCAAAiAAAAJHsAANgRIAApAAAAGAIAACEAAAArLQAA7EsgACIAAABwCAAAIgAAAOxLIAAiAAAAcwgAACEAAAANCgoA7EsgACIAAACjCAAAMgAAAOxLIAAiAAAAnAgAADAAAABuYW1lc3BhY2Vtb2R1bGVnbG9iYWx5aWVsZCggb3IgYGMXIAArAAAAygEAAEAAAAA8IChqc3ggdGFnIHN0YXJ0KVRyaWVkIHRvIHBhcnNlIGFuIGFyZ3VtZW50IG9mIHlpZWxkaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZWMXIAArAAAA8wEAACIAAAD3BQAACAAAAAQAAAD4BQAA+QUAAPoFAAD7BQAA/AUAAP0FAAD+BQAA/wUAAAAGAAABBgAAAgYAAAMGAAAEBgAABQYAAFVuc3VwcG9ydGVkIHN5bnRheGZhaWxlZCB0byB3cml0ZSBzb3VyY2UgbWFwc291cmNlIG1hcCB3YXMgbm90IHV0ZjgJWZMAAHARIAAvAAAAgQ8AADcAAAAbUAIDQW4gZXhwcmVzc2lvbiBzaG91bGQgZm9sbG93ICcuLi4ndWZhaWxUcmllZCB0byBwYXJzZSB0aGUgY29uZGl0aW9uIGZvciBhbiBpZiBzdGF0ZW1lbnRpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBNb2R1bGUgaXMgaGFuZGxlZCBhYm92ZQAQRSAAKAAAAEgBAAAyAAAAVHlwZSBhc3NlcnRpb25zIHRoYXQgd291bGQgY2hhbmdlIGJpbmFyeSBleHByZXNzaW9uIGdyb3VwaW5nIGFyZSBub3Qgc3VwcG9ydGVkIGluIHN0cmlwLW9ubHkgbW9kZS5VbnN1cHBvcnRlZFN5bnRheADQTCAAYAAAAB8FAAAZAAAAYG1vZHVsZWAga2V5d29yZCBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYG5hbWVzcGFjZWAgaW5zdGVhZC5pbnN0YW5jZW9mVHlwZVNjcmlwdCBlbnVtIGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3RyaXAtb25seSBtb2RlVHlwZVNjcmlwdCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBzdHJpcC1vbmx5IG1vZGVUaGUgYW5nbGUtYnJhY2tldCBzeW50YXggZm9yIHR5cGUgYXNzZXJ0aW9ucywgYDxUPmV4cHJgLCBpcyBub3Qgc3VwcG9ydGVkIGluIHR5cGUgc3RyaXAgbW9kZS4gSW5zdGVhZCwgdXNlIHRoZSAnYXMnIHN5bnRheDogYGV4cHIgYXMgVGAuVHlwZVNjcmlwdCBwYXJhbWV0ZXIgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBpbiBzdHJpcC1vbmx5IG1vZGVUeXBlU2NyaXB0IGV4cG9ydCBhc3NpZ25tZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3RyaXAtb25seSBtb2RlVHlwZVNjcmlwdCBpbXBvcnQgZXF1YWxzIGRlY2xhcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3RyaXAtb25seSBtb2RlAAAAgDEgADUAAACaAQAAIwAAAFN5bnRheCBlcnJvckludmFsaWRTeW50YXgAAADISyAAIwAAAJgBAAAVAAAAyEsgACMAAABrAQAAJQAAAMhLIAAjAAAAegEAACUAAADISyAAIwAAAH4BAAAlAAAAyEsgACMAAAB/AQAAJQAAAMhLIAAjAAAAgwEAACUAAADISyAAIwAAAIQBAAAlAAAAyEsgACMAAACFAQAAJQAAAMhLIAAjAAAAiwEAACUAAADISyAAIwAAAI0BAAAlAAAAyEsgACMAAACOAQAAJQAAAMhLIAAjAAAAjwEAACUAAADISyAAIwAAAAcCAAAwAAAAZ2VuZXJhdGVkIGNvZGUgd2Fz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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQLDxMXGx8jJy0xNDg8QAJFAAAAAABJAE0ABQUFBQUFBQUFBQUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVRVFhcBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQAAAAAAAAAAAAAAAAAAAAABYChkaGxwK3R2en6ChoqOkpaangUyogAAAACkBQWmBQUFBQUFQwWsAAAAAAAAAAAAAAAArQAAAAWxtbkFBQUFBQUFBQUFBVIFBb0AAAAAAAAAAAAAAAAAAAAAv6fBAAAAAMQAAAAAAAAAAAAAANDSAAAAyNnd4cvlAADpAAAAAAAAAAAFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBesFBQUFBQUFqu4FBQUFBQUFBQUF8QUFBQUFBQUFBQUFBQXsBfQAAAAABa4AAAUFBQUFBQUFBe8FBQUFBQUF8gAAAAAAAAgNERUZHSElKi8xNjo+QgJHAAAAAABLAE8ABQUFBQUFBQUFBQUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVRVlpeBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQAAAAAAAAAAAAAAAAAAAAABYihmam5yK3R4fICEiIyQlJicoAUyogAAAACkBQWpBQUFBQUFQwWsAAAAAAAAAAAAAAAArwAAAAWzt7sFBQUFBQUFBQUFBVIFBb0AAAAAAAAAAAAAAAAAAAAAv6fBAAAAAMcAAAAAAAAAysLFzdDUANYAyNvf48vnAADpAAAAAADOAAAFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBesFBQUFBQUFqu4FBQUFBQUFBQUF8QUFBQUFBQUFBQUFBQXsBfQAAAAABa4AAAUFBQUFBQUFBe8FBQUFBQUF8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////Pz//////Pz//qv///z/////////fX9wfzw//H9wfAAAAAAAAAAAAAAAAAAAAAAAAAAAABCAE//9/////f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEoAT//3////9///////////////////////////////////////////////////////////////////////8PAP//f/j//////w/////////////////////////////////D/wMAH1AAAAAAAAAAAAAAAAAAAAAA37xA1///+////////////7//////////////////////////////////w/8DAB9QAAD//////////////////9+8wNf///v///////////+///////////////////////8D/P///////////////////////////v///38C//////8BAAAAAAAAAAD///+HBwD/////////////////////+/z///////////////////////////7///9/Av//////Af7/////v7YA////hwcAAAAAAP//////BwAAAMD+//////////////8vAGDAAJwAAP3///8AAADg/////////////z8AAgAA/P///wcwBAAA/wf////////////D////////////////75///f+fAAD/////////5////////////////wMA////////PyT//z8EEAEAAP///wH/B////34AAP//////AwAAAAAAAPD///////8jAAAB/wMA/v/hn/n///3FIwBAALADAAMQ//////8/AAD///8P/wf///9+gP////////////v////////////////////P//7/75/5///9xfOfeYCwz/8DUOCH+f///W0DAAAAXgAAHADgv/v///3tIwAAAQADAAAC4J/5///97SMAAACwAwACAOjHPdYYx/8DAAABAAAAAADuh/n///1t04c5Al7A/z8A7r/7///97fO/OwEAz/8A/u6f+f///e3znzngsM//AgDsxz3WGMf/w8c9gQDA/wAA4N/9///9/yMAAAAnAwAAAOHf/f///e8jAAAAYAMABgDw3/3/////JwBAcIADAAD84P9//P//+y9/AAAAAAAAAP/f/f///f/z3z1gJ8//AADv3/3///3v8989YGDP/w4A/9/9///////fffCAz/8A/O7/f/z///svf4Rf/8D/DAD+//////8NAH8AAAAAAAAA1vf//6//DSBfAADwAAAAAAEAAAAAAAAA//7///8fAAAAHwAAAAAAAAAAAAAAAAAA/v///////wf/f/8DAAAAANb3//+v//8/X3//8wAAAAABAAAD/wOgwv/+////H/7/3////v///x9AAAAAAAAAAP//////BwCAAAA/PGLA4f8DQAAA/////78g///////3////////////////////////////////////////////////////PwAA///////////8////////AAAAAAD/D////////////wP///////////8//////78g///////3//////////////////////////////////////////////////9/AP//PwD/AAAAv////////QcAAAAAAAAAAP///////////z1/Pf//////Pf////89fz3/f/////////89//////////8HAAAAAP//AAD/////////////Pz////////////89fz3//////z3/////PX89/3//////////Pf//////////5wD+AwD//wAA/////////////z8//v////////////////////////////////////////////////////////////////////////////////////////////////////////////8DAAAAAAAAAAAAAAAA/////////////////5////7//wf////////////H/wH//wOA//8DAP//AwD/3wEA////////DwAAAIAQAAAAAP////////////////+f///+//8H////////////x/8B//8/gP//HwD//w8A/98NAP////////////+PMP8DAAAAAAAA//////////////8B//////8F//////////8/AP///38AAAAAAAD///8/HwD//////w////8DAAAAAAAAALj/A///////////////Af//////B///////////PwD///9//w//D8D/////Px8A//////8P////A/8HAAAAAP//fwD///////8fAAAAAAAAAAAAgAAAAAAAAAAAAAAA4P//////DwDgHwAAAAAAAPj///8BwAD8/////z8AAAD///8P/////////3////+f/wP/A4AA/7//fwAAAAAAAP///////////x//AwD4DwD//////////////////w8A/////w8AAAAA4AD8////P/8H///////nAAAAAADebwT///////////////////////////////8AAAAAAAAAAP////////8A/+P//////z//B///////5wAA9/////8H////////////////////////////////////////////////////////////////////////////////////BwAAAAAAAAAAAAAAAAAAAoAAAP8fAAAAAAAAAAAAAAAAhPwvP1D9//PgQwAA//////8BAAAAAAAAAAAAAAAAAAAAMAAAAAAAgAEAEAAAAAKAAAD/HwAAAAAAAP8f4v8BAIT8Lz9Q/f/z4EMAAP//////AQAAAAAAAAAAAAAAAAAA/////////////////////////////////////x94DAD/////vyD/////////gAAA//9/AH9/f39/f39/AAAAAP////////////////////////////////////8f+A8A/////78g/////////4AAgP//fwB/f39/f39/f//////gAAAA/gM+H/7///////////9/+P7/////////////9+D///////7/////////////fwAA/////wAAAAAAAP//4AAAAP7/Ph/+////////////f/7+///////////////g///////+/////////////38AAP////8AAAAAAAD/////////////////////////HwAAAAAAAAAA//////8/////////////////////////////////////////////////////////////////////////////////////AP8f//8ADAAA//////9/AID///8//////////////wAAAACA//z////////////////5/////////z/rHwAA/P//H////w8AAP////////C///////////////////8DAAAAgP/8////////////////+f////////8/6x8AAPz/u/f//wcAAAD///////8PAPz//////w8AAAAAAAAA/GgA/P//PwD//38AAAD///8f8P//////BwAAgAAA3/8AfP//////EAAA////////DwD//////////z8A/wP////o//////8//////w8A////H///////////AYD/A////3///////wEAAPcPAAD//3/E////////Yj4FAAA4/wccAH5+fgB/f///////9/8D//////////////////8HAAAA////////fwD/P/8D//9//P//////////BwAAOP//fAB+fn4Af3////////f/A////////////////////zf/A/////////////////8//////////////////wMAAAAAfwD4oP/9f1/b/////////////////wMAAAD4////////////////////////P/////////////////8DAAAAAH8A+OD//X9f2/////////////////8DAAAA+P//////AAAAAAAAAAAAAAAAAADf/////////////////////x8AAAAA/v//B/7//wfA/////////////3/8/PwcAAAAAP//AAD//xgAAOAAAAAA3/////////////////////8fAAD/A/7//4f+//8H4P////////////9//Pz8HAAAAAD/7///f///t/8//z8AAAAA////////////////////BwAAAAAAAAAA////////HwAAAAAAAAAAAAAAAAAAAAAA/+///3///7f/P/8/AAAAAP///////////////////wcAAAAAAAAAAP///////x8AAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAD///8f////////AQAAAAAA/////wDg////B/////8/AP///z//////D/8+AAAAAAAAAAAAAAAAAAAAAAAAAAAA////H////////wEAAQAAAP////8A4P///wf//////wf///8//////w//PgAAAAAA/////////////////////////z8AAP////8P/////w///////wD///////8PAP/3//e3//v/+xv///////8PAP////////////////////////8//wP/////D/////8P//////8A////////DwD/9//3t//7//sb////////DwA//f////+/kf//PwD//38A////fwAAAAAAAAAA//83AP//PwD///8DAAAAAAAAAAD/////////wAAAAAAAAAAAAQDv/v//PwAAAAAA////H////x8AAAAA//7//x8AAAD///////8/AP//PwD//wcA//8DAAAAAAAAAAAAAAAAAG/w7/7//z+HAAAAAP///x////8fAAAAAP/+//9/AAAA////////PwD//z8A//8HAP//AwAAAAAAAAAAAAAAAAD///////////8BAAAAAAAA////////BwD///////8HAP////8PAAAAAPz//z+A//8/AAAAAAAAAAAAAAAAAAAA////////////AQAAAAAAAP///////wcA////////BwD//////wD/A/////8/vv//PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wMDABwAAAAAAAAA////H4AA//8/AAAAAAD//wMAAAAAAP//HwAAAP//fwAAAAAAAAAAAAAAAAAAAAAA//////8bAwAcAAAAAAAA8P///x+AAP////8BAAAA//8/AAAAAAD//x8AAAD//38A+P///////wAAAAAAAAAmAPj//////wAAAAD///8BAAD4////fwAAAJAA/////0cA+P//////BwAeAAAUAAAAAP//////////fwAAAMD/P4D/////////BwQA////Af8D////////3//wAP////9PAP//////////H97/FwAAAAD///v//w8AgAEAAAAAAAAAf73/v/8B//////9/AAAAAOCf+f///e0jAAAB4AMAAAD/S/////+/AAAACgAAAAAA///7/////8ADAAAAAAAAAH+9/7//Af////////8H/wPvn/n///3t+585geDPHx8A/0v/////v/+l9w8ABgAAAP///////x8AgAcAgAMAAAD///////8AALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////fwAAAAAADwAAAAD///////////8H/8MDAAAA//////////+/AP8DAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8//wEAAD8AAAAA////////AAAQAAAAAAAAAP//////BwABAAAAAAAAAAD///8HAAAAAH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////EQD/AwAAAAD/////////Af8D//8PAAAA////5/8P/wN/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////w8AAAAAAAAAAAAAAAAAAP//////////AAAAgH/yb////wCAAgAAAAAAAAAAAAAA//z/////AQAKAAAA/////////wcAAAAAAAAAAAAAAAD///////////8DAIB/8m////+/+Q8A/wMAAAAAAAAAAP/8///////8GwAAAAH4/////wcEAAAB8P//////AwAgAAD///////////8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wEAAAD/////////f4AA////////////IwAA////////////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8BAP8D//3///9/AAABAAAAAAD8////AAAAAAAAAAAAAAAAAAB/+/////8BAEAAAAC//f///wMAAQAAAAAAAAAAAAAAAP/9/////3//AQD/AwAA/P////z///5/AAAAAAAAAAAAf/v/////f7T/AP8Dv/3///9/+wH/AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8HAPT//f///w8AAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//fwD///3/////xwcA/wcAAAAAAAAAAAAAAQAAAAAAAAAAAP////////////////9/AAD///////////////////////////////8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////wEA////////AAB+AAAA//////////////////////////////////////////////////////////////////////////8HAAQAAAAnAPAA////////////////////////////////AAD//z8A//////////////////////////////////////////////////////////////////////////////8D//////////////////////////////////////////9/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////8B////fwAA////////////fwAA////PwAA////////AAAPAAAA+P//4P//AAAAAAAAAAAAAAAAAAD/////////Af///3//A////////////3//A////z8fAP///////38ADwD/A/j//+D//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////HwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////x//AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////AAAAAAAAAAAAAAAAAAAAAP///////////wcBAAAAAAAAAPj/AAAAAAAAAAALAAAAAAAAAAAAAAD//////////wAAAAAAAAAAAAAAAAAAAAD///////////+H/////////4D//wAAAAAAAAAAGwADAP//////////////////////////////////PwAAAACA/wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO9v/////////////////////////////////////////w8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////P///fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////wf/H/8B/wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODjB/jnDwAAADwAAAAAAAAAAAAA/////////////////wf/H/8B/2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///3/gBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/b/9/AAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8D/////////////9///////////99k3v/r7/////////+/59/f////e1/8/f//////////////////////////////////////////////////////P/////3///f////3///f////3///f////3/////9/////f//9w8AAAAAAAD//////////////////////////z/////9///3////9///3////9///3////9//////f////3///fP////////////////f/j//////x8gABAAAPj+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////wAAAAAAAAAA/////////z8AAAAAAAAAAAAAAAAAAAAAAAD//////x+APwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////nbB/////////8/AAAAgAAAAAAAAAAAAAAAAAAA//////8f/z//QwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8/AAD//////w8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////fwAA/////////wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8/AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8H////////////////////////////////HwAAAAAAAAD//////////w8IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////x8AfwAAAAAA////////////D/8DAAAAAAAAAAAAAAAAAAAAAAAAAADv////lv73CoTqlqqW9/de//v/D+77/w8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////////////////////wAAAAD///////////////////////////////////////////////////////////////////////////////8BAP//////P////////////////////////////////////////////////////////////////////////////////////////////wf///////////////////////////////////////////////////////8DAP////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAA//////////////8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgICAwQFBgcICQoLDA0CAgICAgICDgICAgICAgIOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCAgICAgICAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVVRUAUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQEAAAAAAAAAAAAAEEEQVVVVVVVXVVVVVVVVVVVVUVVVAABAVPXdVVVVVVVVVVUVAAAAAABVVVVV/F1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQUAFAAUBFBVVVVVVVVVFVFVVVVVVVVVAAAAAAAAQFVVVVVVVVVVVdVXVVVVVVVVVVVVVVUFAABUVVVVVVVVVVVVVVVVVRUAAFVVUVVVVVVVBRAAAAEBUFVVVVVVVVVVVVUBVVVVVVX/////f1VVVVAVAABVVVVVVVVVVVVVBQAAAAAAAAAAAAAAAABAVVVVVVVVVVVVVVVVVUVUAQBUUQEAVVUFVVVVVVVVVVFVVVVVVVVVVVVVVVVVVUQBVFVRVRVVVQVVVVVVVVVFQVVVVVVVVVVVVVVVVVVVVEEVFFBRVVVVVVVVVVBRVVVBVVVVVVVVVVVVVVVVVVVUARBUUVVVVVUFVVVVVVUFAFFVVVVVVVVVVVVVVVVVVQQBVFVRVQFVVQVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVRVRVVVFVFVVVVVVVVVVVVVVUVFVVVVVVVVVVVVVVVVUEVAUEUFVBVVUFVVVVVVVVVVFVVVVVVVVVVVVVVVVVVRREBQRQVUFVVQVVVVVVVVVVUFVVVVVVVVVVVVVVVVUVRAFUVUFVFVVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVFFQVEVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVEAQFVVFQBAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUQAAVFVVAEBVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVEVFVVVVVVVVVVVVVVVVVAQAAQAAEVQEAAAEAAAAAAAAAAFRVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBBABBQVVVVVVVVVAFVFVVVQFUVVVFQVVRVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQFVVVVVVVVVVVVVVVUFUFVVVVVVVQVUVVVVVVVVBVVVVVVVVVUFVVVVf//99//911931tXXVRAAUFVFAQAAVVdRVVVVVVVVVVVVVRUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAFVRVRVUBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVxUUVVVVVVVVVVVVVVVVVVVFAEBEAQBUFQAAFFVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAUAAAAFVVVVVVAFVVVVVVVVVVVVVVVQAAUAVUVVVVVVVVVVUVAABVVVVQVVVVVVVVVQVQAFBVVVVVVVVVVVVVVVVVRVARAFVVVVVVVVVVVVVVVVVVAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAABABUUVVUUFVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAAAAAAAAAAAAAFVVFQBVVVVVVVUFQFVVVVVVVVVVVVVVVQAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAFRVVVVVVVVVVVX1VVVVaVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/VfXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX1VVVVVVV9VVVVVVVWqqlVVVVX///9VVVVVVVVVVVVV1VVVparVVVVVXVX1VVVVVX1VX1V1VVdVVVVVdVX1XXVdVV31VVVVVVVVVVdVVVVVVVVVVXfV31VVVVVVVVVVVVVVVVVVVf1VVVVVVVVXVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVXVVVVVVVVVVVVVVVVV11VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVBVVVVVVVVVVVVVVVVVVVX9////////////////X1XVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAqqqqqqqqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVWqqqqqqqqqqqqqqqqqqgoAqqqqaqmqqqqqqqqqqqqqqqqqqqqqqqqqqmqBqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlWpqqqqqqqqqqqqqqmqqqqqqqqqqqqqqqqoqqqqqqqqqqqqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVlaqqqqqqqqqqqqqqaqqqqqqqqqqqqqpVVaqqqqqqqqqqqqqqqqqqqlaqqqqqqqqqqqqqqqqqalVVVVVVVVVVVVVVVVVfVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFUAAAFBVVVVVVVVVBVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVVVUVFFVVVVVVVVUFVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVAAAAAFBVRRVVVVVVVVVVVVUFAFBVVVVVVRUAABBVVVWqqqqqqqqqVkBVVVVVVVVVVVVVVRUFUFBUVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVQFAQUFVVRVVVVRVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVUEFFQFUVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVFFVVVVVqqqqqqqqqqqqVVVVAAAAAABAFQAAAAAAAAAAAAAAAFVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQwAAPCqqlpVAAAAAKqqqqqqqqqqaqqqqqpqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRWpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpWVVVVVVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVVapqVVUAAFRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBUBVAUFVAFVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVUBUFVVVVVVVVVVVVVVVVVVFVRVVVVVVVVVVVVVVVVVVVVVVVUFAFVVVVVVVVVVVVVVVVVVVVVVBQAAVFVVVVVVVVVVVVVVBVBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVQAAAEBVVVVVVVVVVVVVFFRVFVBVVVVVVVVVVVVVVRVAQVVFVVVVVVVVVVVVVVVVVVVVQFVVVVVVVVVVFQABAFRVVVVVVVVVVVVVVVVVVRVVVVVQVVVVVVVVVVVVVVVVBQBABFUBFFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVAAVUVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVFQBAVVVVVVVQVVVVVVVVVVVVVVVVVRVEVFVVUVUVVVVVBQBUAFRVVVVVVVVVVVVVVVVVVVVVFABEEVAFQFVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAVEVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVUUAEQRBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQVQVRBUVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVFQBAEVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVEAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVURBRAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVAABBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVRUAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAFVVRVVVVVVVVVAQBAVVVVVVVVVVVVFQAUQFUVVVUBQAFVVVVVVVVVVVVVAAAAAEBQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQREVVVVVVVVVVVVVVVVVVVVVVVVAEAAEFVVVVVVVVVVVVVVVVVVVVVVVVVVBQAAAAAABQAEQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQFARRAAAFVVVVVVVVVVVVVVVVVVVVVVVVARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVRVVUBVVVVVVVVVVVVVVVUFQFVAVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVAAAAUFVVVVVVVVVVVVVVVVVVVVVVBQAAUAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVFVVVVVVVVVVVVVVVVVVAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV1VdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVFUBVVVVVVVVVVVVVVVVVVVVVVVVVqlRVVaBqVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqpaVVVVVVVVVVVVlaqqqqqqqqpqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqmpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqmqaaqqqqqqqqqqalVVVWVVVVVVVVVVallVVVWqVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVVVVVVVVVQQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAUAAAAAAAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQFQAQAAAABAAQBVVVVVVVVVBVBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqalVVqqqqqqpqVVUAAAAAAAAAAAAAAAAAQBUAAAAAAAAAAAAAAABUVVFVVVVUVVVVVRUAAQAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVAEAAAAAAFAAQBEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVFVQVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBAVVVVVVVVVVVVVVVVVVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVVVVVVVVVVVVVVVVVVVVV1/f9/VVVVVVVVVVVVVVVVVVVVVVVV9f///////25VVVWqqrqqqqqq6vq/v1WqqlZVX1VVVapaVVVVVVVV//////////9XVVX9/9////////////////////////f//////1VVVf////////////9/1f9VVVX/////V1f//////////////////////3/3/////////////////////////////////////////////////////////////9f///////////////////9fVVXVf////////1VVVVV1VVVVVVVVfVVVVVdVVVVVVVVVVVVVVVVVVVVVVVVVVdX///////////////////////////9VVVVVVVVVVVVVVVX//////////////////////19VV3/9V/9VVdVXVf//V1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf///1VXVVVVVVVV//////////////9////f/////////////////////////////////////////////////////////////1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///9X//9/9f////////////////9/V/3////X//9/1f//V1WqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqWlVVVVVVVVVVWZZVYaqlWapVVVVVVZVVVVVVVVVVlVVVAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAFVVVVVVlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQCWalpaaqoFQKZZlWVVVVVVVVVVVQAAAABVVlVVqVZVVVVVVVVVVVVWVVVVVVVVVVUAAAAAAAAAAFRVVVWVWVlVVWVVVWlVVVVVVVVVVVVVVaqqqmqqqqpVqqpaVVVVWVWqqqpVVVVVZVVVWlVVVVWlZVZVVVWVVVVVVVVVppaalllZZamWqqpmVapVWllVWlZlVVVVaqqlpVpVVVWlqlpVVVlZVVVZVVVVVVWVVVVVVVVVVVVVVVVVVVVVVVVVVVVlVfVVVVVpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVaqqqqqqqqqqqlZVVaqqqqqlWlVVmqpaVaWlVVpapZalWlVVVaVaVZVVVVV9VWlZpVWvVWZVVVVVqqpVVWZV////VVVVmppqmlVVVdVVVaWq1VVVpV1V9VVVVVW9Va+quqqrqqqaVbqq+q66rlVd9VVVVVVVVVVXVVVVVVlVVVV31d9VVVVVVVVVpaqqqqqqqqr9VVVVVVVVV1VV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVV1VVVVVVVVVVVVVVVVetWlVVVVVVVVVVVaqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqMwAAwKqqWlUAAAAAqqqqqqqqqqpqqqqqqmqqVVVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVWqalVVAABUWaqqqlaqqqqqqqqqWqqqqqqqqqqqqqqqqqqqWlWqqqqqqqqquv7/v6qqqqpWVVVVVVVVVVVVVVVVVfX///////8AAQICAgIDAgIEAgUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0CAh4CAgICAgICHyAhIiMCJCUmJygpAioCAgICKywCAgICLS4CAgIvMDEyMwICAgICAjQCAjU2NwI4OTo7PD0+Pzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlAAgJBQgICQ0RFRkdIAkk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlKAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICOTk5OUsCAgICAkxNTk8CAgJQAlFSAgICAgICAgICAgICAlNUAgJVAlYCAldYWVpbXF1eX2BhYmMCZGVmZwJoAmlqa2xtAm5vcHECcnMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCAgICAgICAgICAgICAgICAgJ2dwICAngCAgJ5ejk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OXt8fQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ+OTl/OTmAAgICAgICAgICAgICAgICAgICAoECAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICg4SFAoYCAgICAgICAgICAgICh4gCAgICAgICAgICiYp3AgKLAgICjAKNAo4CAgKPkAICAgICAgICAgICAgKRkgKTlAKVlpeYmZqbnAKdAgKen6ChAgICAgICAgICAjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OaIdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKMCAgICpKUCBAIFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdAgIeAgICAgICAh8gISIjAiQlJicoKQIqAgICAqanqKmqq6wurTmur7CxsrMCAgICAgK0AgI1NjcCODk6Ozw9PrU5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlLAgICAgK2TU63iYp3AgKLAgICjAKNAo4CAgKPkAICAgICAgICAgICAgKRkri5lAKVlpeYmZqbnAKdAgKen6ChAgICAgICAgICAgAAAAAEAAAABAAAACsAAAAwMTIzNDU2Nzg5YWJjZGVmShQgAFsAAAC7AAAADQAAAEoUIABbAAAAswAAABUAAABKFCAAWwAAALYAAAANAAAAShQgAFsAAAC3AAAADQAAALADAAAMAAAABAAAABsGAAAYBQAAswMAAGYzIABPAAAArAEAABkAAABBdHRlbXB0ZWQgdG8gaW5pdGlhbGl6ZSB0aHJlYWQtbG9jYWwgd2hpbGUgaXQgaXMgYmVpbmcgZHJvcHBlZAAAaR8gAF4AAABrAAAADQAAAP//////////mBInAAAAAAAAAAAAAAAAAGcrIABtAAAAGgAAACsAAABUcmllZCB0byBzaHJpbmsgdG8gYSBsYXJnZXIgY2FwYWNpdHlgRyAAUAAAAC4DAAAJAAAAcmVlbnRyYW50IGluaXQAANBMIABgAAAAegIAAA0AAABjbG9zdXJlIGludm9rZWQgcmVjdXJzaXZlbHkgb3IgYWZ0ZXIgYmVpbmcgZHJvcHBlZExhenkgaW5zdGFuY2UgaGFzIHByZXZpb3VzbHkgYmVlbiBwb2lzb25lZNBMIABgAAAACAMAABkAAADNOCAAbQAAACUAAAAuAAAAzTggAG0AAAAoAAAAKQAAAPBJIAB5AAAAZwAAACUAAADwSSAAeQAAACIAAAAVAAAAzTggAG0AAAA+AAAAGgAAAB0GAAAeBgAAHwYAACAGAAAiBgAABAAAAAQAAAAjBgAAJAYAAAgAAAANAAAADwAAABBRIQBxTCEAGFEhAAAAAIAAAAAAAAAAAAYAAAAGAAAACAAAAAcAAACQxiAAfKomAJbGIACexiAASMYgAFbGIABkxiAAesYgAA4AAAAOAAAAFgAAABYAAABeBiEAYAYhAGIGIQBkBiEAZgYhAGgGIQBqBiEAbAYhAG4GIQBwBiEAcgYhAHQGIQB2BiEAeAYhAHoGIQB8BiEAfgYhAMAWIQDQFiEA4BYhAPAWIQDwFiEAABchABAXIQAgFyEAMBchAEAXIQBQFyEAYBchAHAXIQCAFyEAkBchAKAXIQCwFyEAwBchANAXIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMA8hAEAPIQBQDyEAYA8hAHAPIQCADyEAkA8hAKAPIQCwDyEAwA8hANAPIQDgDyEA8A8hAAAQIQAQECEAIBAhADAQIQBAECEAUBAhAGAQIQBwECEAgBAhAJAQIQCgECEAoBAhALAQIQDAECEA0BAhAOAQIQDwECEAABEhABARIQAgESEAMBEhAEARIQBQESEAUBEhAGARIQBwESEAgBEhAJARIQCgESEAoBEhALARIQDAESEA0BEhAOARIQDwESEAABIhABASIQAgEiEAMBIhAEASIQBAEiEAUBIhAGASIQBwEiEAgBIhAJASIQCgEiEAsBIhAMASIQDQEiEA4BIhAPASIQAAEyEAEBMhACATIQAwEyEAQBMhAFATIQBQEyEAYBMhAHATIQCAEyEAkBMhAKATIQCwEyEAsBMhAMATIQDQEyEA4BMhAPATIQAAFCEA8BEhABAUIQAgFCEAMBQhAEAUIQBQFCEAYBQhAHAUIQCAFCEAkBQhAKAUIQCwFCEAwBQhANAUIQDgFCEA8BQhAAAVIQAQFSEAIBUhADAVIQBAFSEAUBUhAGAVIQBwFSEAgBUhAJAVIQCgFSEAsBUhAMAVIQDQFSEA4BUhAPAVIQAAFiEAEBYhACAWIQAwFiEAQBYhAFAWIQBgFiEAcBYhAIAWIQCQFiEAoBYhALAWIQAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgA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IQBgDiEAcA4hAIAOIQCQDiEAoA4hALAOIQDADiEA0A4hAOAOIQDwDiEAAA8hABAPIQAgDyEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAGIQCQBiEAoAYhALAGIQDABiEA0AYhAOAGIQDwBiEAAAchABAHIQAgByEAMAchAEAHIQBQByEAYAchAHAHIQCAByEAkAchAKAHIQCwByEAwAchANAHIQDgByEA8AchAPAHIQAACCEAEAghACAIIQAwCCEAQAghAFAIIQBgCCEAcAghAIAIIQCQCCEAoAghAKAIIQCwCCEAwAghANAIIQDgCCEA8AghAPAIIQAACSEAEAkhACAJIQAwCSEAQAkhAFAJIQBgCSEAcAkhAIAJIQCQCSEAkAkhAKAJIQCwCSEAwAkhANAJIQDgCSEA8AkhAAAKIQAQCiEAIAohADAKIQBACiEAUAohAGAKIQBwCiEAgAohAJAKIQCgCiEAoAohALAKIQDACiEA0AohAOAKIQDwCiEAAAshAAALIQAQCyEAIAshADALIQBACyEAUAshAEAJIQBgCyEAcAshAIALIQCQCyEAoAshALALIQDACyEA0AshAOALIQDwCyEAAAwhABAMIQAgDCEAMAwhAEAMIQBQDCEAYAwhAHAMIQCADCEAkAwhAKAMIQCwDCEAwAwhANAMIQDgDCEA8AwhAAANIQAQDSEAIA0hADANIQBADSEAUA0hAGANIQBwDSEAgA0hAJANIQCgDSEAsA0hAMANIQDQDSEA4A0hAPANIQAADiEACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcA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AAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAApbYmAAjHJgAKxyYADMcmAA7HJgAQxyYAEscmABXHJgAYxyYAHMcmAB7HJgAgxyYAIscmACXHJgAoxyYAK8cmAAYAAAAKAAAACQAAAAkAAAACAAAABQAAAAkAAAAFAAAABgAAAAYAAAACAAAAAwAAAAgAAAAHAAAABwAAAAkAAAAGAAAACAAAAAcAAAADAAAABgAAAAYAAAAGAAAABAAAAAkAAAAGAAAABwAAAAUAAAAIAAAABQAAAAkAAAAEAAAABgAAAAIAAAAOAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAgAAAAMAAAACAAAAAgAAAAIAAAACAAAAAQAAAAIAAAACAAAAAwAAAAMAAAAEAAAAAgAAAAIAAAACAAAAAwAAAAMAAAADAAAAAwAAAAIAAAACAAAAAgAAAAMAAAADAAAAAgAAAAIAAAACAAAAAgAAAAMAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAANAAAACwAAAA4AAAAPAAAADgAAAA4AAAAOAAAAIAAAAA0AAAAPAAAADQAAAAgA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AAAAAAAAAAAAAAAcBQAAAAAAAAAAAAAAAAAAAAAAAB0FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABqBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABrBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABrBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABsBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABqBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABtBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABtBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABtBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABuBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABtBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABuBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABtBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABqBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABuBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABtBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABtBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/BQAAAAAAAAAAAAAAAAAAAAAAAAAAAADABQAAAAAAAAAAAAAAAAAAAAAAAAAAAADBBQAAAAAAAAAAAAAAAAAAAAAAAMQFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPYFAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAACEGAAAASgRuYW1lAUMCPB5fX3diaW5kZ2VuX2Nsb3N1cmVfd3JhcHBlcjU0NjWaJB9fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyADwJcHJvZHVjZXJzAQxwcm9jZXNzZWQtYnkCBndhbHJ1cwYwLjIzLjMMd2FzbS1iaW5kZ2VuBzAuMi4xMDA=", "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 ab830bfb8b56..7fa9644440d5 100644 --- a/deps/amaro/dist/package.json +++ b/deps/amaro/dist/package.json @@ -4,7 +4,7 @@ "강동윤 " ], "description": "wasm module for swc", - "version": "1.15.40", + "version": "1.15.43", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/deps/amaro/package.json b/deps/amaro/package.json index a0e7cb595fe3..4bf579a0f0cc 100644 --- a/deps/amaro/package.json +++ b/deps/amaro/package.json @@ -1,6 +1,6 @@ { "name": "amaro", - "version": "1.1.10", + "version": "1.1.11", "description": "Node.js TypeScript wrapper", "license": "MIT", "type": "commonjs", diff --git a/deps/cares/CMakeLists.txt b/deps/cares/CMakeLists.txt index a2a9c19329e0..a9ae8fb952b7 100644 --- a/deps/cares/CMakeLists.txt +++ b/deps/cares/CMakeLists.txt @@ -12,7 +12,7 @@ INCLUDE (CheckCSourceCompiles) INCLUDE (CheckStructHasMember) INCLUDE (CheckLibraryExists) -PROJECT (c-ares LANGUAGES C VERSION "1.34.6" ) +PROJECT (c-ares LANGUAGES C VERSION "1.34.8" ) # Set this version before release SET (CARES_VERSION "${PROJECT_VERSION}") @@ -30,7 +30,7 @@ INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are w # For example, a version of 4:0:2 would generate output such as: # libname.so -> libname.so.2 # libname.so.2 -> libname.so.2.2.0 -SET (CARES_LIB_VERSIONINFO "21:5:19") +SET (CARES_LIB_VERSIONINFO "21:7:19") OPTION (CARES_STATIC "Build as a static library" OFF) @@ -43,6 +43,7 @@ OPTION (CARES_BUILD_TOOLS "Build tools" OPTION (CARES_SYMBOL_HIDING "Hide private symbols in shared libraries" OFF) OPTION (CARES_THREADS "Build with thread-safety support" ON) OPTION (CARES_COVERAGE "Build for code coverage" OFF) +OPTION (CARES_WERROR "Treat compiler warnings on the c-ares library as errors" OFF) SET (CARES_RANDOM_FILE "/dev/urandom" CACHE STRING "Suitable File / Device Path for entropy, such as /dev/urandom") # Tests require static to be enabled on Windows to be able to access otherwise hidden symbols @@ -54,6 +55,30 @@ ENDIF () INCLUDE (EnableWarnings) +# Optionally treat warnings as errors for the c-ares library itself. This is +# applied per-target (see cares_set_werror() usage) rather than globally so it +# does not affect the test/fuzz harnesses (which carry their own warnings) or +# CMake's own compiler feature checks. Enabled in CI only on toolchains known +# to be free of spurious warnings at our high warning levels. +FUNCTION (cares_set_werror target) + IF (NOT CARES_WERROR) + RETURN () + ENDIF () + IF (MSVC) + TARGET_COMPILE_OPTIONS (${target} PRIVATE /WX) + ELSE () + TARGET_COMPILE_OPTIONS (${target} PRIVATE -Werror) + # Modern libc headers (e.g. glibc ) use the C11 _Generic + # keyword for const-correctness of strchr()/memchr()/etc. Clang flags + # that as a C11 extension under our C90 + -Wpedantic build even though it + # originates in a system header at our call sites. It is not something + # we can fix in our own code, so warn but do not fail on it. + IF (CMAKE_C_COMPILER_ID MATCHES "Clang") + TARGET_COMPILE_OPTIONS (${target} PRIVATE -Wno-error=c11-extensions) + ENDIF () + ENDIF () +ENDFUNCTION () + IF (MSVC) # allow linking against the static runtime library in msvc OPTION (CARES_MSVC_STATIC_RUNTIME "Link against the static runtime library" OFF) diff --git a/deps/cares/README.md b/deps/cares/README.md index 6566c9fe6aa1..7e818df8fa5b 100644 --- a/deps/cares/README.md +++ b/deps/cares/README.md @@ -1,7 +1,7 @@ # [![c-ares logo](https://c-ares.org/art/c-ares-logo.svg)](https://c-ares.org/) -[![Build Status](https://api.cirrus-ci.com/github/c-ares/c-ares.svg?branch=main)](https://cirrus-ci.com/github/c-ares/c-ares) -[![Windows Build Status](https://ci.appveyor.com/api/projects/status/aevgc5914tm72pvs/branch/main?svg=true)](https://ci.appveyor.com/project/c-ares/c-ares/branch/main) +[![Build Status](https://github.com/c-ares/c-ares/actions/workflows/ubuntu-latest.yml/badge.svg?branch=main)](https://github.com/c-ares/c-ares/actions/workflows/ubuntu-latest.yml) +[![Windows Build Status](https://github.com/c-ares/c-ares/actions/workflows/windows.yml/badge.svg?branch=main)](https://github.com/c-ares/c-ares/actions/workflows/windows.yml) [![Coverage Status](https://coveralls.io/repos/github/c-ares/c-ares/badge.svg?branch=main)](https://coveralls.io/github/c-ares/c-ares?branch=main) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/291/badge)](https://bestpractices.coreinfrastructure.org/projects/291) [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/c-ares.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:c-ares) diff --git a/deps/cares/RELEASE-NOTES.md b/deps/cares/RELEASE-NOTES.md index ded75001b54f..93cc10fc74bd 100644 --- a/deps/cares/RELEASE-NOTES.md +++ b/deps/cares/RELEASE-NOTES.md @@ -1,3 +1,113 @@ +## c-ares version 1.34.8 - July 7 2026 + +This is a bugfix release. + +Bugfixes: +* Revert "Mark parameters in callbacks as const" which shipped in 1.34.7. + Changing the parameter types of the `ares_callback`, `ares_host_callback`, + and `ares_nameinfo_callback` function pointer typedefs was an unintended + API break: existing applications with the historical non-const callback + signatures no longer compiled, particularly in C++ where function pointer + types must match exactly. The read-only nature of the callback parameters + is now documented instead. + [PR #1244](https://github.com/c-ares/c-ares/pull/1244) + +Thanks go to these friendly people for their efforts and contributions for this +release: + +* Brad House (@bradh352) + + +## c-ares version 1.34.7 - July 6 2026 + +This is a security release. + +Security: +* CVE-2026-33630. Use-after-free / double-free in c-ares' query-completion + handling, remotely triggerable via ares_getaddrinfo() over TCP. Please see + https://github.com/c-ares/c-ares/security/advisories/GHSA-6wfj-rwm7-3542 +* CPU-exhaustion denial of service via unbounded DNS name compression pointer + chains. Please see + https://github.com/c-ares/c-ares/security/advisories/GHSA-pjmc-gx33-gc76 +* Memory-amplification denial of service via unvalidated DNS header record + counts. Please see + https://github.com/c-ares/c-ares/security/advisories/GHSA-jv8r-gqr9-68wj + +Changes: +* `ares_getaddrinfo()`: handle a NULL node per POSIX and implement + `ARES_AI_PASSIVE`. [PR #1186](https://github.com/c-ares/c-ares/pull/1186) +* Mark parameters in callbacks as const. + [PR #1060](https://github.com/c-ares/c-ares/pull/1060) +* Correct `ARES_CLASS_HESOID` misspelling to `ARES_CLASS_HESIOD`. + [PR #1092](https://github.com/c-ares/c-ares/pull/1092) + +Bugfixes: +* Fix sticky server recovery when all servers have failures. [PR #1192](https://github.com/c-ares/c-ares/pull/1192) +* Fix UDP socket exhaustion regression: retire connections per-connection, not via server failure count. [PR #1197](https://github.com/c-ares/c-ares/pull/1197) +* Guard DNS record binary length overflow. [PR #1168](https://github.com/c-ares/c-ares/pull/1168) +* Prevent integer overflow in allocation size calculations. [PR #1147](https://github.com/c-ares/c-ares/pull/1147) +* Prevent overflow in ares_array allocation size calculations. [PR #1117](https://github.com/c-ares/c-ares/pull/1117) +* Prevent integer overflow in buffer size calculation. [PR #1116](https://github.com/c-ares/c-ares/pull/1116) +* Add overflow checks to ares_buf_ensure_space(). [PR #1094](https://github.com/c-ares/c-ares/pull/1094) +* Skip name compression offsets beyond the 14-bit pointer limit. [PR #1159](https://github.com/c-ares/c-ares/pull/1159) +* ares_dns_parse: reject name compression in RDATA where not permitted (RFC 3597). [PR #1190](https://github.com/c-ares/c-ares/pull/1190) +* ares_dns_parse: reject responses with more than one OPT record (RFC 6891). [PR #1189](https://github.com/c-ares/c-ares/pull/1189) +* Discard oversized UDP datagrams instead of truncating the length frame. [PR #1161](https://github.com/c-ares/c-ares/pull/1161) +* Route numeric config parsing through range-checked ares_str_parse_uint. [PR #1158](https://github.com/c-ares/c-ares/pull/1158) +* Replace atoi-based port parsing with validated helper. [PR #1097](https://github.com/c-ares/c-ares/pull/1097) +* Defer TCP connection error handling until DNS responses are parsed. [PR #1138](https://github.com/c-ares/c-ares/pull/1138) +* Prevent undefined-behavior left shift in ares_calc_query_timeout(). [PR #1151](https://github.com/c-ares/c-ares/pull/1151) +* Use unsigned type for ares_round_up_pow2_u64 to avoid undefined behavior. [PR #1107](https://github.com/c-ares/c-ares/pull/1107) +* Fix undefined behavior in ares_buf_replace() pointer arithmetic. [PR #1099](https://github.com/c-ares/c-ares/pull/1099) +* ares_array: reset offset when array becomes empty. [PR #1165](https://github.com/c-ares/c-ares/pull/1165) +* ares_iface_ips: add ARES_IFACE_IP_NONE zero enum value. [PR #1187](https://github.com/c-ares/c-ares/pull/1187) +* ares_sysconfig_files: recognize AIX netsvc.conf bind4/local4 tokens. [PR #1188](https://github.com/c-ares/c-ares/pull/1188) +* Use safe string construction in Windows sysconfig join path. [PR #1143](https://github.com/c-ares/c-ares/pull/1143) +* Fix zero-length RAW_RR losing type metadata during parsing. [PR #1129](https://github.com/c-ares/c-ares/pull/1129) +* Fix RAW_RR type tostr/fromstr roundtrip mismatch. [PR #1123](https://github.com/c-ares/c-ares/pull/1123) +* Fix NULL dereference for ifa netmask. [PR #1120](https://github.com/c-ares/c-ares/pull/1120) +* adig: fix negated option prefix parsing. [PR #1135](https://github.com/c-ares/c-ares/pull/1135) +* Use UnregisterWaitEx to prevent use-after-free on Win32. [PR #1111](https://github.com/c-ares/c-ares/pull/1111) +* Add NULL check after ares_malloc_zero in Windows UTF8 conversion. [PR #1121](https://github.com/c-ares/c-ares/pull/1121) +* Fix NULL dereference after ares_malloc_zero in Win32 IOCP event add. [PR #1132](https://github.com/c-ares/c-ares/pull/1132) +* Fix microsecond overflow in ares_queue_wait_empty timeout. [PR #1122](https://github.com/c-ares/c-ares/pull/1122) +* Fix NULL dereference in ares_buf_replace() on NULL buf. [PR #1124](https://github.com/c-ares/c-ares/pull/1124) +* Initialize *read_bytes in ares_socket_recvfrom(). [PR #1125](https://github.com/c-ares/c-ares/pull/1125) +* Fix memory leak of binbuf in ares_buf_parse_dns_binstr_int. [PR #1126](https://github.com/c-ares/c-ares/pull/1126) +* Fix memory leak of qcache entry on key allocation failure. [PR #1127](https://github.com/c-ares/c-ares/pull/1127) +* Fix memory leak of buf in ares_dns_multistring_combined() on OOM. [PR #1110](https://github.com/c-ares/c-ares/pull/1110) +* Fix memory leaks on error paths in two functions. [PR #1109](https://github.com/c-ares/c-ares/pull/1109) +* Fix memory leak of buckets in ares_htable_dict_keys() error path. [PR #1108](https://github.com/c-ares/c-ares/pull/1108) +* Fix memory leak of bucket->key in ares_htable_dict_insert error path. [PR #1105](https://github.com/c-ares/c-ares/pull/1105) +* Fix additional memory leaks. [PR #1091](https://github.com/c-ares/c-ares/pull/1091) [PR #1078](https://github.com/c-ares/c-ares/pull/1078) +* Prevent corrupt addrinfo nodes on sockaddr allocation failure. [PR #1112](https://github.com/c-ares/c-ares/pull/1112) +* Fix two logic bugs in DNS cookie handling. [PR #1103](https://github.com/c-ares/c-ares/pull/1103) +* Fix linked list INSERT_BEFORE corruption and array insertdata_first ordering. [PR #1101](https://github.com/c-ares/c-ares/pull/1101) +* Fix HASH_IDX macro missing parentheses. [PR #1128](https://github.com/c-ares/c-ares/pull/1128) +* Fix malloc(0) in ares_htable_all_buckets on empty table. [PR #1131](https://github.com/c-ares/c-ares/pull/1131) +* Fix wrong sizeof in QNX confstr() call truncating domain names. [PR #1130](https://github.com/c-ares/c-ares/pull/1130) +* Clear probe pending flag after timeout. [PR #1059](https://github.com/c-ares/c-ares/pull/1059) +* Fix incorrect check for empty wide string. [PR #1064](https://github.com/c-ares/c-ares/pull/1064) +* Handle strdup failure. [PR #1077](https://github.com/c-ares/c-ares/pull/1077) +* doc: reference ares_free_string(), not ares_free(). [PR #1084](https://github.com/c-ares/c-ares/pull/1084) + +Thanks go to these friendly people for their efforts and contributions for this +release: + +* (@Alb3e3) +* Brad House (@bradh352) +* (@dankmeme01) +* David Hotham (@dimbleby) +* Tom Flynn (@Flynnzaa) +* (@jmestwa-coder) +* (@kodareef5) +* Kaixuan Li (@MarkLee131) +* (@lifenjoiner) +* (@metsw24-max) +* Song Li (@SongTonyLi) +* (@uwezkhan) + + ## c-ares version 1.34.6 - December 8 2025 This is a security release. diff --git a/deps/cares/aminclude_static.am b/deps/cares/aminclude_static.am index 07239563e6a6..9a00ba789172 100644 --- a/deps/cares/aminclude_static.am +++ b/deps/cares/aminclude_static.am @@ -1,6 +1,6 @@ # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Mon Dec 8 16:21:41 UTC 2025 +# from AX_AM_MACROS_STATIC on Tue Jul 7 16:14:13 UTC 2026 # Code coverage diff --git a/deps/cares/configure b/deps/cares/configure index f91e2c956862..c2318a1c3bf0 100755 --- a/deps/cares/configure +++ b/deps/cares/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for c-ares 1.34.6. +# Generated by GNU Autoconf 2.71 for c-ares 1.34.8. # # Report bugs to . # @@ -621,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='c-ares' PACKAGE_TARNAME='c-ares' -PACKAGE_VERSION='1.34.6' -PACKAGE_STRING='c-ares 1.34.6' +PACKAGE_VERSION='1.34.8' +PACKAGE_STRING='c-ares 1.34.8' PACKAGE_BUGREPORT='c-ares mailing list: http://lists.haxx.se/listinfo/c-ares' PACKAGE_URL='' @@ -1430,7 +1430,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures c-ares 1.34.6 to adapt to many kinds of systems. +\`configure' configures c-ares 1.34.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1501,7 +1501,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of c-ares 1.34.6:";; + short | recursive ) echo "Configuration of c-ares 1.34.8:";; esac cat <<\_ACEOF @@ -1647,7 +1647,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -c-ares configure 1.34.6 +c-ares configure 1.34.8 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -2271,7 +2271,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by c-ares $as_me 1.34.6, which was +It was created by c-ares $as_me 1.34.8, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3245,7 +3245,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -CARES_VERSION_INFO="21:5:19" +CARES_VERSION_INFO="21:7:19" @@ -6818,7 +6818,7 @@ fi # Define the identity of the package. PACKAGE='c-ares' - VERSION='1.34.6' + VERSION='1.34.8' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -28238,7 +28238,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by c-ares $as_me 1.34.6, which was +This file was extended by c-ares $as_me 1.34.8, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -28306,7 +28306,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -c-ares config.status 1.34.6 +c-ares config.status 1.34.8 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff --git a/deps/cares/configure.ac b/deps/cares/configure.ac index 744a99be56ab..637dfb153b1f 100644 --- a/deps/cares/configure.ac +++ b/deps/cares/configure.ac @@ -2,10 +2,10 @@ dnl Copyright (C) The c-ares project and its contributors dnl SPDX-License-Identifier: MIT AC_PREREQ([2.69]) -AC_INIT([c-ares], [1.34.6], +AC_INIT([c-ares], [1.34.8], [c-ares mailing list: http://lists.haxx.se/listinfo/c-ares]) -CARES_VERSION_INFO="21:5:19" +CARES_VERSION_INFO="21:7:19" dnl This flag accepts an argument of the form current[:revision[:age]]. So, dnl passing -version-info 3:12:1 sets current to 3, revision to 12, and age to dnl 1. diff --git a/deps/cares/docs/ares_dns_record.3 b/deps/cares/docs/ares_dns_record.3 index 47ca95b057a2..723f9ab4b98c 100644 --- a/deps/cares/docs/ares_dns_record.3 +++ b/deps/cares/docs/ares_dns_record.3 @@ -140,7 +140,7 @@ DNS Classes for requests and responses: .B ARES_CLASS_CHAOS - CHAOS .br -.B ARES_CLASS_HESOID +.B ARES_CLASS_HESIOD - Hesoid [Dyer 87] .br .B ARES_CLASS_NONE diff --git a/deps/cares/docs/ares_getaddrinfo.3 b/deps/cares/docs/ares_getaddrinfo.3 index 5544ce20224e..661381e0926e 100644 --- a/deps/cares/docs/ares_getaddrinfo.3 +++ b/deps/cares/docs/ares_getaddrinfo.3 @@ -27,6 +27,19 @@ The and .I service parameters give the hostname and service as NULL-terminated C strings. +Either +.I name +or +.I service +may be NULL, but not both. If +.I name +is NULL, the returned addresses are synthesized from +.IR service : +the wildcard address (0.0.0.0 or ::) is returned when +.B ARES_AI_PASSIVE +is set in +.IR ai_flags , +otherwise the loopback address (127.0.0.1 or ::1) is returned. The .I hints parameter is an @@ -63,6 +76,16 @@ If this option is set .I service field will be treated as a numeric value. .TP 19 +.B ARES_AI_PASSIVE +If this option is set and +.I name +is NULL, the returned addresses will use the wildcard address (0.0.0.0 or ::), +suitable for +.BR bind (2)ing +a socket that will accept connections. If not set and +.I name +is NULL, the loopback address (127.0.0.1 or ::1) is returned instead. +.TP 19 .B ARES_AI_CANONNAME The ares_addrinfo structure will return a canonical names list. .TP 19 diff --git a/deps/cares/docs/ares_gethostbyaddr.3 b/deps/cares/docs/ares_gethostbyaddr.3 index cc4092285c01..f5b5f0864fcf 100644 --- a/deps/cares/docs/ares_gethostbyaddr.3 +++ b/deps/cares/docs/ares_gethostbyaddr.3 @@ -80,7 +80,16 @@ points to a containing the name of the host returned by the query. The callback need not and should not attempt to free the memory pointed to by .IR hostent ; -the ares library will free it when the callback returns. If the query +the ares library will free it when the callback returns. The callback +.B must not +modify the +.B struct hostent +or retain a reference to it after returning; it is owned by c-ares and is only +valid for the duration of the callback. The parameter is intentionally not +declared +.B const +solely to preserve API/ABI compatibility with existing applications. +If the query did not complete successfully, .I hostent will be diff --git a/deps/cares/docs/ares_gethostbyname.3 b/deps/cares/docs/ares_gethostbyname.3 index 06d075ca6c51..40d340343114 100644 --- a/deps/cares/docs/ares_gethostbyname.3 +++ b/deps/cares/docs/ares_gethostbyname.3 @@ -88,7 +88,16 @@ points to a containing the name of the host returned by the query. The callback need not and should not attempt to free the memory pointed to by .IR hostent ; -the ares library will free it when the callback returns. If the query +the ares library will free it when the callback returns. The callback +.B must not +modify the +.B struct hostent +or retain a reference to it after returning; it is owned by c-ares and is only +valid for the duration of the callback. The parameter is intentionally not +declared +.B const +solely to preserve API/ABI compatibility with existing applications. +If the query did not complete successfully, .I hostent will be diff --git a/deps/cares/docs/ares_getnameinfo.3 b/deps/cares/docs/ares_getnameinfo.3 index 66b04f9efc11..800b57b31f3f 100644 --- a/deps/cares/docs/ares_getnameinfo.3 +++ b/deps/cares/docs/ares_getnameinfo.3 @@ -24,7 +24,7 @@ function is defined for protocol-independent address translation. The function is a combination of \fIares_gethostbyaddr(3)\fP and \fIgetservbyport(3)\fP. The function will translate the address either by executing a host query on the name service channel identified by -.IR channel +.IR channel or it will attempt to resolve it locally if possible. The parameters .I sa @@ -68,8 +68,8 @@ A hostname lookup is being requested. A service name lookup is being requested. .PP When the query -is complete or has -failed, the ares library will invoke \fIcallback\fP. Completion or failure of +is complete or has +failed, the ares library will invoke \fIcallback\fP. Completion or failure of the query may happen immediately, or may happen during a later call to \fIares_process(3)\fP, \fIares_destroy(3)\fP or \fIares_cancel(3)\fP. .PP @@ -129,19 +129,31 @@ given request. .PP On successful completion of the query, the callback argument .I node -contains a string representing the hostname (assuming +contains a string representing the hostname (assuming .B ARES_NI_LOOKUPHOST -was specified). Additionally, +was specified). Additionally, .I service contains a string representing the service name (assuming .B ARES_NI_LOOKUPSERVICE was specified). If the query did not complete successfully, or one of the values -was not requested, +was not requested, .I node or .I service -will be +will be .BR NULL . +.PP +The +.I node +and +.I service +strings are owned by the c-ares library and are only valid for the duration of +the callback. The callback +.B must not +modify or free them, and must not retain references to them after returning; +treat them as read-only. The parameters are intentionally not declared +.B const +solely to preserve API/ABI compatibility with existing applications. .SH SEE ALSO .BR ares_process (3), diff --git a/deps/cares/docs/ares_query.3 b/deps/cares/docs/ares_query.3 index 3aa428b00bb8..401d700a44cc 100644 --- a/deps/cares/docs/ares_query.3 +++ b/deps/cares/docs/ares_query.3 @@ -146,6 +146,16 @@ or .I abuf will be non-NULL, otherwise they will be NULL. +The +.I abuf +buffer is owned by the c-ares library and is only valid for the duration of +the callback. The callback +.B must not +modify or free it, and must not retain a reference to it after returning; treat +it as read-only. The parameter is intentionally not declared +.B const +solely to preserve API/ABI compatibility with existing applications. + .SH AVAILABILITY \fBares_query_dnsrec(3)\fP was introduced in c-ares 1.28.0. diff --git a/deps/cares/docs/ares_search.3 b/deps/cares/docs/ares_search.3 index 66791b47e908..12d1dede09e8 100644 --- a/deps/cares/docs/ares_search.3 +++ b/deps/cares/docs/ares_search.3 @@ -152,6 +152,15 @@ will usually be NULL and will usually be 0, but in some cases an unsuccessful query result may be placed in .IR abuf . +The +.I abuf +buffer is owned by the c-ares library and is only valid for the duration of +the callback. The callback +.B must not +modify or free it, and must not retain a reference to it after returning; treat +it as read-only. The parameter is intentionally not declared +.B const +solely to preserve API/ABI compatibility with existing applications. The \fIares_search_dnsrec(3)\fP function behaves identically to \fIares_search(3)\fP, but takes an initialized and filled DNS record object to diff --git a/deps/cares/docs/ares_send.3 b/deps/cares/docs/ares_send.3 index df3e3bbe4136..cf669a001db2 100644 --- a/deps/cares/docs/ares_send.3 +++ b/deps/cares/docs/ares_send.3 @@ -131,6 +131,16 @@ and .IR alen for \fIares_send(3)\fP will be non-NULL. +The +.I abuf +buffer is owned by the c-ares library and is only valid for the duration of +the callback. The callback +.B must not +modify or free it, and must not retain a reference to it after returning; treat +it as read-only. The parameter is intentionally not declared +.B const +solely to preserve API/ABI compatibility with existing applications. + Unless the flag .B ARES_FLAG_NOCHECKRESP was set at channel initialization time, \fIares_send_dnsrec(3)\fP and diff --git a/deps/cares/include/ares.h b/deps/cares/include/ares.h index 7fe3ec78f4e6..1e38463a044a 100644 --- a/deps/cares/include/ares.h +++ b/deps/cares/include/ares.h @@ -434,6 +434,14 @@ struct ares_addr { /* DNS record parser, writer, and helpers */ #include "ares_dns_record.h" +/* IMPORTANT: the pointer parameters below (abuf, hostent, node, service) are + * intentionally NOT const. Marking them const changes the function-pointer + * type and breaks API/ABI compatibility for existing C and (especially) C++ + * applications that declare their callbacks with the historical non-const + * signature. This was tried in PR #1060 and reverted for that reason. These + * buffers are owned by c-ares and MUST be treated as read-only by the callback + * (do not modify or free them); that contract is documented in the man pages, + * not enforced via const, to preserve compatibility. Do not re-add const. */ typedef void (*ares_callback)(void *arg, int status, int timeouts, unsigned char *abuf, int alen); diff --git a/deps/cares/include/ares_dns_record.h b/deps/cares/include/ares_dns_record.h index cec9f47f63d8..1e47a78e143c 100644 --- a/deps/cares/include/ares_dns_record.h +++ b/deps/cares/include/ares_dns_record.h @@ -76,7 +76,8 @@ typedef enum { typedef enum { ARES_CLASS_IN = 1, /*!< Internet */ ARES_CLASS_CHAOS = 3, /*!< CHAOS */ - ARES_CLASS_HESOID = 4, /*!< Hesoid [Dyer 87] */ + ARES_CLASS_HESIOD = 4, /*!< Hesiod [Dyer 87] */ + ARES_CLASS_HESOID = 4, /*!< typo from older c-ares version for Hesiod */ ARES_CLASS_NONE = 254, /*!< RFC 2136 */ ARES_CLASS_ANY = 255 /*!< Any class (requests only) */ } ares_dns_class_t; @@ -1092,7 +1093,7 @@ CARES_EXTERN ares_status_t ares_dns_parse(const unsigned char *buf, * * \param[in] dnsrec Pointer to initialized and filled DNS record object. * \param[out] buf Pointer passed by reference to be filled in with with - * DNS message. Must be ares_free()'d by caller. + * DNS message. Must be ares_free_string()'d by caller. * \param[out] buf_len Length of returned buffer containing DNS message. * \return ARES_SUCCESS on success */ diff --git a/deps/cares/include/ares_version.h b/deps/cares/include/ares_version.h index 006029c12dfe..f836d5f9186d 100644 --- a/deps/cares/include/ares_version.h +++ b/deps/cares/include/ares_version.h @@ -32,8 +32,8 @@ #define ARES_VERSION_MAJOR 1 #define ARES_VERSION_MINOR 34 -#define ARES_VERSION_PATCH 6 -#define ARES_VERSION_STR "1.34.6" +#define ARES_VERSION_PATCH 8 +#define ARES_VERSION_STR "1.34.8" /* NOTE: We cannot make the version string a C preprocessor stringify operation * due to assumptions made by integrators that aren't properly using diff --git a/deps/cares/src/lib/CMakeLists.txt b/deps/cares/src/lib/CMakeLists.txt index bdb2690fb673..a4c1e73f1bd5 100644 --- a/deps/cares/src/lib/CMakeLists.txt +++ b/deps/cares/src/lib/CMakeLists.txt @@ -66,6 +66,8 @@ IF (CARES_SHARED) TARGET_COMPILE_DEFINITIONS (${PROJECT_NAME} PRIVATE HAVE_CONFIG_H=1 CARES_BUILDING_LIBRARY) + cares_set_werror (${PROJECT_NAME}) + TARGET_LINK_LIBRARIES (${PROJECT_NAME} PUBLIC ${CARES_DEPENDENT_LIBS} PRIVATE ${CMAKE_THREAD_LIBS_INIT} @@ -136,6 +138,8 @@ IF (CARES_STATIC) TARGET_COMPILE_DEFINITIONS (${LIBNAME} PRIVATE HAVE_CONFIG_H=1 CARES_BUILDING_LIBRARY) + cares_set_werror (${LIBNAME}) + # Only matters on Windows IF (WIN32 OR CYGWIN) TARGET_COMPILE_DEFINITIONS (${LIBNAME} PUBLIC CARES_STATICLIB) diff --git a/deps/cares/src/lib/Makefile.in b/deps/cares/src/lib/Makefile.in index e92732eaf72c..a9630300c084 100644 --- a/deps/cares/src/lib/Makefile.in +++ b/deps/cares/src/lib/Makefile.in @@ -15,7 +15,7 @@ @SET_MAKE@ # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Mon Dec 8 16:21:41 UTC 2025 +# from AX_AM_MACROS_STATIC on Tue Jul 7 16:14:13 UTC 2026 # Copyright (C) The c-ares project and its contributors # SPDX-License-Identifier: MIT diff --git a/deps/cares/src/lib/ares_addrinfo_localhost.c b/deps/cares/src/lib/ares_addrinfo_localhost.c index 2abb0c48a6f6..b65cf48a2f6a 100644 --- a/deps/cares/src/lib/ares_addrinfo_localhost.c +++ b/deps/cares/src/lib/ares_addrinfo_localhost.c @@ -67,13 +67,8 @@ ares_status_t ares_append_ai_node(int aftype, unsigned short port, struct ares_addrinfo_node **nodes) { struct ares_addrinfo_node *node; - - node = ares_append_addrinfo_node(nodes); - if (!node) { - return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ - } - - memset(node, 0, sizeof(*node)); + struct sockaddr *sa; + socklen_t salen; if (aftype == AF_INET) { struct sockaddr_in *sin = ares_malloc(sizeof(*sin)); @@ -86,14 +81,9 @@ ares_status_t ares_append_ai_node(int aftype, unsigned short port, sin->sin_family = AF_INET; sin->sin_port = htons(port); - node->ai_addr = (struct sockaddr *)sin; - node->ai_family = AF_INET; - node->ai_addrlen = sizeof(*sin); - node->ai_addr = (struct sockaddr *)sin; - node->ai_ttl = (int)ttl; - } - - if (aftype == AF_INET6) { + sa = (struct sockaddr *)sin; + salen = sizeof(*sin); + } else if (aftype == AF_INET6) { struct sockaddr_in6 *sin6 = ares_malloc(sizeof(*sin6)); if (!sin6) { return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ @@ -104,13 +94,23 @@ ares_status_t ares_append_ai_node(int aftype, unsigned short port, sin6->sin6_family = AF_INET6; sin6->sin6_port = htons(port); - node->ai_addr = (struct sockaddr *)sin6; - node->ai_family = AF_INET6; - node->ai_addrlen = sizeof(*sin6); - node->ai_addr = (struct sockaddr *)sin6; - node->ai_ttl = (int)ttl; + sa = (struct sockaddr *)sin6; + salen = sizeof(*sin6); + } else { + return ARES_EFORMERR; + } + + node = ares_append_addrinfo_node(nodes); + if (!node) { + ares_free(sa); /* LCOV_EXCL_LINE: OutOfMemory */ + return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } + node->ai_addr = sa; + node->ai_family = aftype; + node->ai_addrlen = salen; + node->ai_ttl = (int)ttl; + return ARES_SUCCESS; } diff --git a/deps/cares/src/lib/ares_close_sockets.c b/deps/cares/src/lib/ares_close_sockets.c index 347f43e6fcd8..7bb72c31ec1b 100644 --- a/deps/cares/src/lib/ares_close_sockets.c +++ b/deps/cares/src/lib/ares_close_sockets.c @@ -112,11 +112,11 @@ void ares_check_cleanup_conns(const ares_channel_t *channel) do_cleanup = ARES_TRUE; } - /* If the associated server has failures, close it out. Resetting the - * connection (and specifically the source port number) can help resolve - * situations where packets are being dropped. + /* If the connection has been retired for new queries, close it out once + * idle. Resetting the connection (and specifically the source port + * number) can help resolve situations where packets are being dropped. */ - if (conn->server->consec_failures > 0) { + if (conn->flags & ARES_CONN_FLAG_NONEW) { do_cleanup = ARES_TRUE; } diff --git a/deps/cares/src/lib/ares_conn.h b/deps/cares/src/lib/ares_conn.h index 16ecefdd19fa..c332de14b135 100644 --- a/deps/cares/src/lib/ares_conn.h +++ b/deps/cares/src/lib/ares_conn.h @@ -43,7 +43,13 @@ typedef enum { ARES_CONN_FLAG_TFO = 1 << 1, /*! TCP Fast Open has not yet sent its first packet. Gets unset on first * write to a connection */ - ARES_CONN_FLAG_TFO_INITIAL = 1 << 2 + ARES_CONN_FLAG_TFO_INITIAL = 1 << 2, + /*! Connection has been retired: it must not be handed any NEW queries (e.g. + * it experienced a query timeout, suggesting packets are being dropped on + * it). Its in-flight queries continue to drain and it is cleaned up once + * idle. This is a per-connection signal so that a transient failure does + * not evict otherwise-healthy connections to the same server. */ + ARES_CONN_FLAG_NONEW = 1 << 3 } ares_conn_flags_t; typedef enum { diff --git a/deps/cares/src/lib/ares_cookie.c b/deps/cares/src/lib/ares_cookie.c index 509e12050e0c..25960db6022f 100644 --- a/deps/cares/src/lib/ares_cookie.c +++ b/deps/cares/src/lib/ares_cookie.c @@ -217,7 +217,7 @@ static const unsigned char * static ares_bool_t timeval_is_set(const ares_timeval_t *tv) { - if (tv->sec != 0 && tv->usec != 0) { + if (tv->sec != 0 || tv->usec != 0) { return ARES_TRUE; } return ARES_FALSE; @@ -324,7 +324,7 @@ ares_status_t ares_cookie_apply(ares_dns_record_t *dnsrec, ares_conn_t *conn, if (cookie->state == ARES_COOKIE_UNSUPPORTED) { /* If timer hasn't expired, just delete any possible cookie and return */ if (!timeval_expired(&cookie->unsupported_ts, now, - COOKIE_REGRESSION_TIMEOUT_MS)) { + COOKIE_UNSUPPORTED_TIMEOUT_MS)) { ares_dns_rr_del_opt_byid(rr, ARES_RR_OPT_OPTIONS, ARES_OPT_PARAM_COOKIE); return ARES_SUCCESS; } diff --git a/deps/cares/src/lib/ares_getaddrinfo.c b/deps/cares/src/lib/ares_getaddrinfo.c index 6009de36a3d0..6d9e21af4bb9 100644 --- a/deps/cares/src/lib/ares_getaddrinfo.c +++ b/deps/cares/src/lib/ares_getaddrinfo.c @@ -242,6 +242,11 @@ static ares_bool_t fake_addrinfo(const char *name, unsigned short port, ares_status_t status = ARES_SUCCESS; ares_bool_t result = ARES_FALSE; int family = hints->ai_family; + + if (name == NULL) { + return ARES_FALSE; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + if (family == AF_INET || family == AF_INET6 || family == AF_UNSPEC) { /* It only looks like an IP address if it's all numbers and dots. */ size_t numdots = 0; @@ -268,6 +273,7 @@ static ares_bool_t fake_addrinfo(const char *name, unsigned short port, if (result) { status = ares_append_ai_node(AF_INET, port, 0, &addr4, &ai->nodes); if (status != ARES_SUCCESS) { + ares_freeaddrinfo(ai); callback(arg, (int)status, 0, NULL); /* LCOV_EXCL_LINE: OutOfMemory */ return ARES_TRUE; /* LCOV_EXCL_LINE: OutOfMemory */ } @@ -282,6 +288,7 @@ static ares_bool_t fake_addrinfo(const char *name, unsigned short port, if (result) { status = ares_append_ai_node(AF_INET6, port, 0, &addr6, &ai->nodes); if (status != ARES_SUCCESS) { + ares_freeaddrinfo(ai); callback(arg, (int)status, 0, NULL); /* LCOV_EXCL_LINE: OutOfMemory */ return ARES_TRUE; /* LCOV_EXCL_LINE: OutOfMemory */ } @@ -575,21 +582,55 @@ static void host_callback(void *arg, ares_status_t status, size_t timeouts, /* at this point we keep on waiting for the next query to finish */ } -static ares_bool_t numeric_service_to_port(const char *service, - unsigned short *port) +/* Per POSIX getaddrinfo(), when no node/hostname is provided the returned + * addresses are synthesized from the service: the wildcard address when + * ARES_AI_PASSIVE is set (suitable for bind()ing a listening socket), + * otherwise the loopback address (suitable for connect()ing to a peer on the + * local host). */ +static ares_status_t + ares_append_nulladdr(unsigned short port, + const struct ares_addrinfo_hints *hints, + struct ares_addrinfo *ai) { - char *end; - unsigned long val; + int family = hints->ai_family; + ares_bool_t passive = ARES_FALSE; + ares_status_t status; + struct ares_addrinfo_node *node; - errno = 0; - val = strtoul(service, &end, 10); + if (hints->ai_flags & ARES_AI_PASSIVE) { + passive = ARES_TRUE; + } - if (errno == 0 && *end == '\0' && val <= 65535) { - *port = (unsigned short)val; - return ARES_TRUE; + if (family == AF_INET6 || family == AF_UNSPEC) { + struct ares_in6_addr addr6; + memset(&addr6, 0, sizeof(addr6)); /* wildcard "::" */ + if (!passive) { + ares_inet_pton(AF_INET6, "::1", &addr6); + } + status = ares_append_ai_node(AF_INET6, port, 0, &addr6, &ai->nodes); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } } - return ARES_FALSE; + if (family == AF_INET || family == AF_UNSPEC) { + struct in_addr addr4; + memset(&addr4, 0, sizeof(addr4)); /* wildcard "0.0.0.0" */ + if (!passive) { + ares_inet_pton(AF_INET, "127.0.0.1", &addr4); + } + status = ares_append_ai_node(AF_INET, port, 0, &addr4, &ai->nodes); + if (status != ARES_SUCCESS) { + return status; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + for (node = ai->nodes; node != NULL; node = node->ai_next) { + node->ai_socktype = hints->ai_socktype; + node->ai_protocol = hints->ai_protocol; + } + + return ARES_SUCCESS; } static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name, @@ -616,6 +657,13 @@ static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name, return; } + /* POSIX getaddrinfo() requires that at least one of node (name) or service + * be provided. */ + if (name == NULL && service == NULL) { + callback(arg, ARES_ENOTFOUND, 0, NULL); + return; + } + if (ares_is_onion_domain(name)) { callback(arg, ARES_ENOTFOUND, 0, NULL); return; @@ -623,14 +671,14 @@ static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name, if (service) { if (hints->ai_flags & ARES_AI_NUMERICSERV) { - if (!numeric_service_to_port(service, &port)) { + if (!ares_parse_port(service, &port, ARES_TRUE)) { callback(arg, ARES_ESERVICE, 0, NULL); return; } } else { port = lookup_service(service, 0); if (!port) { - if (!numeric_service_to_port(service, &port)) { + if (!ares_parse_port(service, &port, ARES_TRUE)) { callback(arg, ARES_ESERVICE, 0, NULL); return; } @@ -644,6 +692,19 @@ static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name, return; } + /* No node/hostname was provided (service-only lookup): synthesize wildcard + * or loopback addresses from the resolved port instead of issuing a query. */ + if (name == NULL) { + status = ares_append_nulladdr(port, hints, ai); + if (status != ARES_SUCCESS) { + ares_freeaddrinfo(ai); /* LCOV_EXCL_LINE: OutOfMemory */ + callback(arg, (int)status, 0, NULL); /* LCOV_EXCL_LINE: OutOfMemory */ + return; /* LCOV_EXCL_LINE: OutOfMemory */ + } + callback(arg, ARES_SUCCESS, 0, ai); + return; + } + if (fake_addrinfo(name, port, hints, ai, callback, arg)) { return; } diff --git a/deps/cares/src/lib/ares_gethostbyname.c b/deps/cares/src/lib/ares_gethostbyname.c index d451b4685110..640df74cfc36 100644 --- a/deps/cares/src/lib/ares_gethostbyname.c +++ b/deps/cares/src/lib/ares_gethostbyname.c @@ -102,6 +102,10 @@ void ares_gethostbyname(ares_channel_t *channel, const char *name, int family, struct ares_addrinfo_hints hints; struct host_query *ghbn_arg; + if (channel == NULL) { + return; + } + if (!callback) { return; } diff --git a/deps/cares/src/lib/ares_hosts_file.c b/deps/cares/src/lib/ares_hosts_file.c index c0fb80766a7e..0c8aebaf6bad 100644 --- a/deps/cares/src/lib/ares_hosts_file.c +++ b/deps/cares/src/lib/ares_hosts_file.c @@ -674,6 +674,9 @@ static ares_status_t ares_hosts_path(const ares_channel_t *channel, &dwLength); ExpandEnvironmentStringsA(tmp, PATH_HOSTS, MAX_PATH); RegCloseKey(hkeyHosts); + if (strlen(PATH_HOSTS)+strlen(WIN_PATH_HOSTS) >= MAX_PATH) { + return ARES_ENOTFOUND; + } strcat(PATH_HOSTS, WIN_PATH_HOSTS); #elif defined(WATT32) const char *PATH_HOSTS = _w32_GetHostsFile(); diff --git a/deps/cares/src/lib/ares_init.c b/deps/cares/src/lib/ares_init.c index dc094c4df6eb..dc3c1e4f537e 100644 --- a/deps/cares/src/lib/ares_init.c +++ b/deps/cares/src/lib/ares_init.c @@ -102,6 +102,20 @@ static int server_sort_cb(const void *data1, const void *data2) if (s1->consec_failures > s2->consec_failures) { return 1; } + + /* Among servers with the same failure count, prefer the one that failed + * least recently so that a server that went down long ago (and may have + * since recovered) is tried before one that just failed. This also keeps + * retries rotating across servers once the failure counts saturate at + * SERVER_CONSEC_FAILURES_CAP. Healthy servers all have a zeroed retry + * time and fall through to configuration order. */ + if (s1->next_retry_time.sec != s2->next_retry_time.sec) { + return s1->next_retry_time.sec < s2->next_retry_time.sec ? -1 : 1; + } + if (s1->next_retry_time.usec != s2->next_retry_time.usec) { + return s1->next_retry_time.usec < s2->next_retry_time.usec ? -1 : 1; + } + if (s1->idx < s2->idx) { return -1; } diff --git a/deps/cares/src/lib/ares_library_init.c b/deps/cares/src/lib/ares_library_init.c index 2b91692baec6..10c88de00957 100644 --- a/deps/cares/src/lib/ares_library_init.c +++ b/deps/cares/src/lib/ares_library_init.c @@ -105,6 +105,27 @@ void *ares_realloc_zero(void *ptr, size_t orig_size, size_t new_size) return p; } +void *ares_malloc_zero_array(size_t num, size_t size) +{ + size_t total; + if (ares_size_t_mul_overflow(num, size, &total)) { + return NULL; + } + return ares_malloc_zero(total); +} + +void *ares_realloc_zero_array(void *ptr, size_t orig_num, size_t new_num, + size_t size) +{ + size_t orig_total; + size_t new_total; + if (ares_size_t_mul_overflow(orig_num, size, &orig_total) || + ares_size_t_mul_overflow(new_num, size, &new_total)) { + return NULL; + } + return ares_realloc_zero(ptr, orig_total, new_total); +} + int ares_library_init(int flags) { if (ares_initialized) { diff --git a/deps/cares/src/lib/ares_private.h b/deps/cares/src/lib/ares_private.h index d6bd426d39c1..04d4576ed203 100644 --- a/deps/cares/src/lib/ares_private.h +++ b/deps/cares/src/lib/ares_private.h @@ -131,6 +131,13 @@ W32_FUNC const char *_w32_GetHostsFile(void); #define DEFAULT_SERVER_RETRY_CHANCE 10 #define DEFAULT_SERVER_RETRY_DELAY 5000 +/* Upper bound on the consecutive failure count tracked per server. Only the + * relative order of the counts is used for server selection, so magnitude + * beyond "clearly down" carries no additional signal. Capping it bounds how + * long a server that failed for an extended period sorts behind other failed + * servers once it comes back online. */ +#define SERVER_CONSEC_FAILURES_CAP 16 + typedef void (*ares_query_enqueue_cb)(void *data); struct ares_query; @@ -418,6 +425,9 @@ ares_status_t ares_parse_sortlist(struct apattern **sortlist, size_t *nsort, ares_status_t ares_lookup_hostaliases(const ares_channel_t *channel, const char *name, char **alias); +ares_bool_t ares_parse_port(const char *str, unsigned short *port, + ares_bool_t allow_zero); + ares_status_t ares_cat_domain(const char *name, const char *domain, char **s); ares_status_t ares_sortaddrinfo(ares_channel_t *channel, struct ares_addrinfo_node *ai_node); @@ -539,10 +549,15 @@ void ares_gethostbyaddr_nolock(ares_channel_t *channel, const void *addr, * ares_free()'d by the caller. * \param[in] is_hostname if ARES_TRUE, will validate the character set for * a valid hostname or will return error. + * \param[in] allow_compression if ARES_FALSE, a compression pointer + * encountered while parsing the name will be rejected + * with ARES_EBADNAME. Used for RR types (e.g. SRV) + * whose RDATA names must not use name compression. * \return ARES_SUCCESS on success */ ares_status_t ares_dns_name_parse(ares_buf_t *buf, char **name, - ares_bool_t is_hostname); + ares_bool_t is_hostname, + ares_bool_t allow_compression); /*! Write the DNS name to the buffer in the DNS domain-name syntax as a * series of labels. The maximum domain name length is 255 characters with diff --git a/deps/cares/src/lib/ares_process.c b/deps/cares/src/lib/ares_process.c index 9352968419ef..b2316c4b333c 100644 --- a/deps/cares/src/lib/ares_process.c +++ b/deps/cares/src/lib/ares_process.c @@ -45,7 +45,6 @@ #include -static void timeadd(ares_timeval_t *now, size_t millisecs); static ares_status_t process_write(ares_channel_t *channel, ares_socket_t write_fd); static ares_status_t process_read(ares_channel_t *channel, @@ -66,6 +65,11 @@ static void end_query(ares_channel_t *channel, ares_server_t *server, ares_query_t *query, ares_status_t status, ares_dns_record_t *dnsrec, ares_array_t **requeue); +static ares_status_t ares_send_query_int(ares_server_t *requested_server, + ares_query_t *query, + const ares_timeval_t *now, + ares_array_t **requeue); +static void ares_detach_query(ares_query_t *query); static void ares_query_remove_from_conn(ares_query_t *query) { @@ -124,13 +128,22 @@ static void server_increment_failures(ares_server_t *server, return; /* LCOV_EXCL_LINE: DefensiveCoding */ } - server->consec_failures++; - ares_slist_node_reinsert(node); + /* Cap the failure count. Only the relative order matters for server + * selection, and an uncapped count would require an unbounded number of + * failures on other servers before a server that failed during an + * extended outage could be selected again. */ + if (server->consec_failures < SERVER_CONSEC_FAILURES_CAP) { + server->consec_failures++; + } + /* Must update the retry time before reinserting since the sort uses it to + * order servers with the same failure count */ ares_tvnow(&next_retry_time); - timeadd(&next_retry_time, channel->server_retry_delay); + ares_timeval_add(&next_retry_time, channel->server_retry_delay); server->next_retry_time = next_retry_time; + ares_slist_node_reinsert(node); + invoke_server_state_cb(server, ARES_FALSE, used_tcp == ARES_TRUE ? ARES_SERV_STATE_TCP : ARES_SERV_STATE_UDP); @@ -148,12 +161,13 @@ static void server_set_good(ares_server_t *server, ares_bool_t used_tcp) if (server->consec_failures > 0) { server->consec_failures = 0; + /* Must update the retry time before reinserting since the sort uses it + * to order servers with the same failure count */ + server->next_retry_time.sec = 0; + server->next_retry_time.usec = 0; ares_slist_node_reinsert(node); } - server->next_retry_time.sec = 0; - server->next_retry_time.usec = 0; - invoke_server_state_cb(server, ARES_TRUE, used_tcp == ARES_TRUE ? ARES_SERV_STATE_TCP : ARES_SERV_STATE_UDP); @@ -178,18 +192,6 @@ ares_bool_t ares_timedout(const ares_timeval_t *now, : ARES_FALSE; } -/* add the specific number of milliseconds to the time in the first argument */ -static void timeadd(ares_timeval_t *now, size_t millisecs) -{ - now->sec += (ares_int64_t)millisecs / 1000; - now->usec += (unsigned int)((millisecs % 1000) * 1000); - - if (now->usec >= 1000000) { - now->sec += now->usec / 1000000; - now->usec %= 1000000; - } -} - static ares_status_t ares_process_fds_nolock(ares_channel_t *channel, const ares_fd_events_t *events, size_t nevents, unsigned int flags) @@ -445,12 +447,19 @@ void ares_process_pending_write(ares_channel_t *channel) ares_channel_unlock(channel); } -static ares_status_t read_conn_packets(ares_conn_t *conn) +static ares_status_t read_conn_packets(ares_conn_t *conn, + ares_bool_t *conn_error) { ares_bool_t read_again; ares_conn_err_t err; const ares_channel_t *channel = conn->server->channel; + if (conn_error == NULL) { + return ARES_EFORMERR; + } + + *conn_error = ARES_FALSE; + do { size_t count; size_t len = 65535; @@ -498,6 +507,18 @@ static ares_status_t read_conn_packets(ares_conn_t *conn) /* If UDP, overwrite length */ if (!(conn->flags & ARES_CONN_FLAG_TCP)) { + /* The read buffer is grown in powers of two, so a single recvfrom() can + * return more than the 2-byte length prefix is able to represent. A + * datagram that large can't be a valid DNS message, and writing the + * truncated (unsigned short)count would desync the framing of everything + * buffered after it, so discard it. Standard UDP can't actually deliver + * a payload this large (max is 65507 IPv4 / 65527 IPv6); the only vector + * is IPv6 jumbograms (RFC 2675), which DNS never uses. This is purely + * defense-in-depth. */ + if (count > 65535) { + ares_buf_set_length(conn->in_buf, start_len); + break; + } len = ares_buf_len(conn->in_buf); ares_buf_set_length(conn->in_buf, start_len); ares_buf_append_be16(conn->in_buf, (unsigned short)count); @@ -508,8 +529,15 @@ static ares_status_t read_conn_packets(ares_conn_t *conn) } while (read_again); if (err != ARES_CONN_ERR_SUCCESS && err != ARES_CONN_ERR_WOULDBLOCK) { - handle_conn_error(conn, ARES_TRUE, ARES_ECONNREFUSED); - return ARES_ECONNREFUSED; + /* If there is no packet data buffered, preserve the historical + * immediate connection-failure behavior so retries happen promptly. + * Only defer if there is buffered data to parse first. */ + if (ares_buf_len(conn->in_buf) == 0) { + handle_conn_error(conn, ARES_TRUE, ARES_ECONNREFUSED); + return ARES_ECONNREFUSED; + } + + *conn_error = ARES_TRUE; } return ARES_SUCCESS; @@ -573,6 +601,79 @@ static ares_status_t ares_append_endqueue(ares_array_t **requeue, dnsrec); } +/* Drain the deferred requeue/endqueue list iteratively. All flush sites + * (read_answers(), process_timeouts(), and ares_send_query()) funnel through + * here so that: + * 1. Retries are re-dispatched by appending to this same list and looping, + * rather than recursing ares_requeue_query() -> ares_send_query() until + * the stack is exhausted (issue #1043). + * 2. A query is fully detached from all lookup lists before its callback is + * invoked, so a reentrant ares_cancel() from within that callback cannot + * find and free the same query, which would otherwise double-free it + * (CVE-2026-33630 / GHSA-6wfj-rwm7-3542). + * + * On return the list has been fully processed, an empty-queue notification has + * been sent if appropriate, and *requeue has been destroyed and set to NULL. */ +static ares_status_t ares_flush_requeue(ares_channel_t *channel, + const ares_timeval_t *now, + ares_array_t **requeue) +{ + ares_status_t status = ARES_SUCCESS; + + if (requeue == NULL) { + return status; + } + + while (*requeue != NULL && ares_array_len(*requeue) > 0) { + ares_query_t *query; + ares_requeue_t entry; + ares_status_t internal_status; + + internal_status = ares_array_claim_at(&entry, sizeof(entry), *requeue, 0); + if (internal_status != ARES_SUCCESS) { + break; /* LCOV_EXCL_LINE: DefensiveCoding */ + } + + query = ares_htable_szvp_get_direct(channel->queries_by_qid, entry.qid); + + if (entry.type == REQUEUE_REQUEUE) { + /* Query disappeared (e.g. a prior callback in this drain cancelled it) */ + if (query == NULL) { + continue; + } + /* Re-dispatch via the internal entrypoint so any further requeues are + * appended back onto this same list and drained by the loop above, + * rather than recursing. */ + internal_status = ares_send_query_int(entry.server, query, now, requeue); + /* We only care about ARES_ENOMEM */ + if (internal_status == ARES_ENOMEM) { + status = ARES_ENOMEM; + } + } else { /* REQUEUE_ENDQUERY */ + if (query != NULL) { + /* Detach the query from all lookup lists BEFORE invoking the callback. + * Otherwise a reentrant ares_cancel() from within the callback would + * find this query still linked in all_queries/queries_by_qid, free it, + * and the ares_free_query() below would then double-free it. */ + ares_detach_query(query); + query->callback(query->arg, entry.status, query->timeouts, + entry.dnsrec); + ares_free_query(query); + } + ares_dns_record_destroy(entry.dnsrec); + } + } + + /* Don't forget to send notification if queue emptied */ + if (*requeue != NULL) { + ares_queue_notify_empty(channel); + } + ares_array_destroy(*requeue); + *requeue = NULL; + + return status; +} + static ares_status_t read_answers(ares_conn_t *conn, const ares_timeval_t *now) { ares_status_t status; @@ -625,43 +726,11 @@ static ares_status_t read_answers(ares_conn_t *conn, const ares_timeval_t *now) } cleanup: - - /* Flush requeue */ - while (ares_array_len(requeue) > 0) { - ares_query_t *query; - ares_requeue_t entry; - ares_status_t internal_status; - - internal_status = ares_array_claim_at(&entry, sizeof(entry), requeue, 0); - if (internal_status != ARES_SUCCESS) { - break; - } - - query = ares_htable_szvp_get_direct(channel->queries_by_qid, entry.qid); - - if (entry.type == REQUEUE_REQUEUE) { - /* query disappeared */ - if (query == NULL) { - continue; - } - internal_status = ares_send_query(entry.server, query, now); - /* We only care about ARES_ENOMEM */ - if (internal_status == ARES_ENOMEM) { - status = ARES_ENOMEM; - } - } else { /* REQUEUE_ENDQUERY */ - if (query != NULL) { - query->callback(query->arg, entry.status, query->timeouts, entry.dnsrec); - ares_free_query(query); - } - ares_dns_record_destroy(entry.dnsrec); - } - } - /* Don't forget to send notification if queue emptied */ - if (requeue != NULL) { - ares_queue_notify_empty(channel); + /* Flush requeue - re-dispatch retries and invoke deferred callbacks + * iteratively and safely */ + if (ares_flush_requeue(channel, now, &requeue) == ARES_ENOMEM) { + status = ARES_ENOMEM; } - ares_array_destroy(requeue); return status; } @@ -671,24 +740,32 @@ static ares_status_t process_read(ares_channel_t *channel, const ares_timeval_t *now) { ares_conn_t *conn = ares_conn_from_fd(channel, read_fd); + ares_bool_t conn_error; ares_status_t status; if (conn == NULL) { return ARES_SUCCESS; } - /* TODO: There might be a potential issue here where there was a read that - * read some data, then looped and read again and got a disconnect. - * Right now, that would cause a resend instead of processing the data - * we have. This is fairly unlikely to occur due to only looping if - * a full buffer of 65535 bytes was read. */ - status = read_conn_packets(conn); + status = read_conn_packets(conn, &conn_error); if (status != ARES_SUCCESS) { return status; } - return read_answers(conn, now); + status = read_answers(conn, now); + if (status != ARES_SUCCESS) { + return status; + } + + if (conn_error) { + conn = ares_conn_from_fd(channel, read_fd); + if (conn != NULL) { + handle_conn_error(conn, ARES_TRUE, ARES_ECONNREFUSED); + } + } + + return ARES_SUCCESS; } /* If any queries have timed out, note the timeout and move them on. */ @@ -696,7 +773,8 @@ static ares_status_t process_timeouts(ares_channel_t *channel, const ares_timeval_t *now) { ares_slist_node_t *node; - ares_status_t status = ARES_SUCCESS; + ares_status_t status = ARES_SUCCESS; + ares_array_t *requeue = NULL; /* Just keep popping off the first as this list will re-sort as things come * and go. We don't want to try to rely on 'next' as some operation might @@ -714,14 +792,26 @@ static ares_status_t process_timeouts(ares_channel_t *channel, query->timeouts++; conn = query->conn; + /* Retire this connection for NEW queries. A timeout suggests packets are + * being dropped on it, so route new queries to a fresh source port while + * the in-flight queries here drain (it is cleaned up once idle). This is + * per-connection so a transient failure doesn't stop reuse of healthy + * connections to the same server. */ + conn->flags |= ARES_CONN_FLAG_NONEW; server_increment_failures(conn->server, query->using_tcp); - status = ares_requeue_query(query, now, ARES_ETIMEOUT, ARES_TRUE, NULL, - NULL); + status = + ares_requeue_query(query, now, ARES_ETIMEOUT, ARES_TRUE, NULL, &requeue); if (status == ARES_ENOMEM) { goto done; } } done: + /* Flush requeue - re-dispatch retries and invoke deferred callbacks + * iteratively and safely */ + if (ares_flush_requeue(channel, now, &requeue) == ARES_ENOMEM) { + status = ARES_ENOMEM; + } + if (status == ARES_ENOMEM) { return ARES_ENOMEM; } @@ -871,7 +961,7 @@ static ares_status_t process_answer(ares_channel_t *channel, if (issue_might_be_edns(query->query, rdnsrec)) { status = rewrite_without_edns(query); if (status != ARES_SUCCESS) { - end_query(channel, server, query, status, NULL, NULL); + end_query(channel, server, query, status, NULL, requeue); goto cleanup; } @@ -975,6 +1065,11 @@ ares_status_t ares_requeue_query(ares_query_t *query, const ares_timeval_t *now, { ares_channel_t *channel = query->channel; size_t max_tries = ares_slist_len(channel->servers) * channel->tries; + ares_server_t *server = NULL; + + if (query->conn != NULL) { + server = query->conn->server; + } ares_query_remove_from_conn(query); @@ -999,7 +1094,7 @@ ares_status_t ares_requeue_query(ares_query_t *query, const ares_timeval_t *now, query->error_status = ARES_ETIMEOUT; } - end_query(channel, NULL, query, query->error_status, dnsrec, requeue); + end_query(channel, server, query, query->error_status, dnsrec, requeue); return ARES_ETIMEOUT; } @@ -1102,22 +1197,23 @@ static void ares_probe_failed_server(ares_channel_t *channel, } /* Select the first server with failures to retry that has passed the retry - * timeout and doesn't already have a pending probe */ + * timeout and doesn't already have a pending probe. Skip the server the + * triggering query was just sent to since that query is already exercising + * it. */ ares_tvnow(&now); for (node = ares_slist_node_first(channel->servers); node != NULL; node = ares_slist_node_next(node)) { ares_server_t *node_val = ares_slist_node_val(node); - if (node_val != NULL && node_val->consec_failures > 0 && - !node_val->probe_pending && + if (node_val != NULL && node_val != server && + node_val->consec_failures > 0 && !node_val->probe_pending && ares_timedout(&now, &node_val->next_retry_time)) { probe_server = node_val; break; } } - /* Either nothing to probe or the query was enqueud to the same server - * we were going to probe. Do nothing. */ - if (probe_server == NULL || server == probe_server) { + /* Nothing to probe */ + if (probe_server == NULL) { return; } @@ -1148,7 +1244,12 @@ static size_t ares_calc_query_timeout(const ares_query_t *query, * retry from the last retry */ rounds = (query->try_count / num_servers); if (rounds > 0) { - timeplus <<= rounds; + if (rounds >= sizeof(timeplus) * CHAR_BIT || + timeplus > (SIZE_MAX >> rounds)) { + timeplus = SIZE_MAX; + } else { + timeplus <<= rounds; + } } if (channel->maxtimeout && timeplus > channel->maxtimeout) { @@ -1205,9 +1306,13 @@ static ares_conn_t *ares_fetch_connection(const ares_channel_t *channel, return NULL; } - /* If the associated server has failures, don't use it. It should be cleaned - * up later. */ - if (conn->server->consec_failures > 0) { + /* Don't hand new queries to a connection that has been retired (e.g. it saw + * a timeout). It keeps servicing its in-flight queries and is cleaned up + * once idle. Note this is a per-connection check: a server-wide failure + * counter must not be used here or a single transient failure would evict + * every (including healthy) connection to the server and spawn a new socket + * per query. */ + if (conn->flags & ARES_CONN_FLAG_NONEW) { return NULL; } @@ -1262,8 +1367,44 @@ static ares_status_t ares_conn_query_write(ares_conn_t *conn, return ares_conn_flush(conn); } +/* Public entrypoint. Establishes a requeue list and drives + * ares_send_query_int() plus any retries/deferred callbacks it produces + * iteratively, so a chain of retryable failures can never recurse until the + * stack is exhausted (#1043). */ ares_status_t ares_send_query(ares_server_t *requested_server, ares_query_t *query, const ares_timeval_t *now) +{ + ares_channel_t *channel = query->channel; + ares_array_t *requeue = NULL; + unsigned short qid = query->qid; + ares_status_t status; + + status = ares_send_query_int(requested_server, query, now, &requeue); + + /* Drain any retries/deferred callbacks this send produced. + * ares_flush_requeue() always fully processes and destroys the list (even on + * ENOMEM), and sends the empty-queue notification if needed. */ + if (ares_flush_requeue(channel, now, &requeue) == ARES_ENOMEM) { + status = ARES_ENOMEM; + } + + /* A retry may have been deferred (returning ARES_SUCCESS from the append) + * and then terminally failed while draining, in which case the query has + * been freed. Do not dereference 'query' here. If it is no longer tracked + * it ended, so don't report success to the caller (which would, e.g., cause + * ares_send_nolock() to write to a now-freed *qid). */ + if (status == ARES_SUCCESS && + ares_htable_szvp_get_direct(channel->queries_by_qid, qid) == NULL) { + status = ARES_ETIMEOUT; + } + + return status; +} + +static ares_status_t ares_send_query_int(ares_server_t *requested_server, + ares_query_t *query, + const ares_timeval_t *now, + ares_array_t **requeue) { ares_channel_t *channel = query->channel; ares_server_t *server; @@ -1286,14 +1427,16 @@ ares_status_t ares_send_query(ares_server_t *requested_server, } if (server == NULL) { - end_query(channel, server, query, ARES_ENOSERVER /* ? */, NULL, NULL); + end_query(channel, server, query, ARES_ENOSERVER /* ? */, NULL, requeue); return ARES_ENOSERVER; } - /* If a query is directed to a specific query, or the server chosen has - * failures, or the query is being retried, don't probe for downed servers */ - if (requested_server != NULL || server->consec_failures > 0 || - query->try_count != 0) { + /* If a query is directed to a specific server, or the query is being + * retried, don't probe for downed servers. Note that the chosen server + * having failures itself does NOT disable probing: when every server has + * failures (e.g. during an extended outage), probes are the only way a + * recovered server that sorts behind the current best can be noticed. */ + if (requested_server != NULL || query->try_count != 0) { probe_downed_server = ARES_FALSE; } @@ -1310,11 +1453,11 @@ ares_status_t ares_send_query(ares_server_t *requested_server, case ARES_ECONNREFUSED: case ARES_EBADFAMILY: server_increment_failures(server, query->using_tcp); - return ares_requeue_query(query, now, status, ARES_TRUE, NULL, NULL); + return ares_requeue_query(query, now, status, ARES_TRUE, NULL, requeue); /* Anything else is not retryable, likely ENOMEM */ default: - end_query(channel, server, query, status, NULL, NULL); + end_query(channel, server, query, status, NULL, requeue); return status; } } @@ -1328,7 +1471,7 @@ ares_status_t ares_send_query(ares_server_t *requested_server, case ARES_ENOMEM: /* Not retryable */ - end_query(channel, server, query, status, NULL, NULL); + end_query(channel, server, query, status, NULL, requeue); return status; /* These conditions are retryable as they are server-specific @@ -1336,7 +1479,7 @@ ares_status_t ares_send_query(ares_server_t *requested_server, case ARES_ECONNREFUSED: case ARES_EBADFAMILY: handle_conn_error(conn, ARES_TRUE, status); - status = ares_requeue_query(query, now, status, ARES_TRUE, NULL, NULL); + status = ares_requeue_query(query, now, status, ARES_TRUE, NULL, requeue); if (status == ARES_ETIMEOUT) { status = ARES_ECONNREFUSED; } @@ -1344,7 +1487,7 @@ ares_status_t ares_send_query(ares_server_t *requested_server, default: server_increment_failures(server, query->using_tcp); - status = ares_requeue_query(query, now, status, ARES_TRUE, NULL, NULL); + status = ares_requeue_query(query, now, status, ARES_TRUE, NULL, requeue); return status; } @@ -1355,12 +1498,12 @@ ares_status_t ares_send_query(ares_server_t *requested_server, ares_slist_node_destroy(query->node_queries_by_timeout); query->ts = *now; query->timeout = *now; - timeadd(&query->timeout, timeplus); + ares_timeval_add(&query->timeout, timeplus); query->node_queries_by_timeout = ares_slist_insert(channel->queries_by_timeout, query); if (!query->node_queries_by_timeout) { /* LCOV_EXCL_START: OutOfMemory */ - end_query(channel, server, query, ARES_ENOMEM, NULL, NULL); + end_query(channel, server, query, ARES_ENOMEM, NULL, requeue); return ARES_ENOMEM; /* LCOV_EXCL_STOP */ } @@ -1373,7 +1516,7 @@ ares_status_t ares_send_query(ares_server_t *requested_server, if (query->node_queries_to_conn == NULL) { /* LCOV_EXCL_START: OutOfMemory */ - end_query(channel, server, query, ARES_ENOMEM, NULL, NULL); + end_query(channel, server, query, ARES_ENOMEM, NULL, requeue); return ARES_ENOMEM; /* LCOV_EXCL_STOP */ } diff --git a/deps/cares/src/lib/ares_qcache.c b/deps/cares/src/lib/ares_qcache.c index 4050ff54bf16..ad3bc83505af 100644 --- a/deps/cares/src/lib/ares_qcache.c +++ b/deps/cares/src/lib/ares_qcache.c @@ -371,9 +371,11 @@ static ares_status_t ares_qcache_insert_int(ares_qcache_t *qcache, /* LCOV_EXCL_START: OutOfMemory */ fail: - if (entry != NULL && entry->key != NULL) { - ares_htable_strvp_remove(qcache->cache, entry->key); - ares_free(entry->key); + if (entry != NULL) { + if (entry->key != NULL) { + ares_htable_strvp_remove(qcache->cache, entry->key); + ares_free(entry->key); + } ares_free(entry); } return ARES_ENOMEM; diff --git a/deps/cares/src/lib/ares_socket.c b/deps/cares/src/lib/ares_socket.c index 516852a84abf..4ad3034021a0 100644 --- a/deps/cares/src/lib/ares_socket.c +++ b/deps/cares/src/lib/ares_socket.c @@ -188,6 +188,8 @@ ares_conn_err_t ares_socket_recvfrom(ares_channel_t *channel, ares_socket_t s, { ares_ssize_t rv; + *read_bytes = 0; + rv = channel->sock_funcs.arecvfrom(s, data, data_len, flags, from, from_len, channel->sock_func_cb_data); diff --git a/deps/cares/src/lib/ares_sysconfig.c b/deps/cares/src/lib/ares_sysconfig.c index 286db60328f4..9e389c17672a 100644 --- a/deps/cares/src/lib/ares_sysconfig.c +++ b/deps/cares/src/lib/ares_sysconfig.c @@ -218,13 +218,16 @@ static ares_status_t ares_init_sysconfig_android(const ares_channel_t *channel, status = ares_sconfig_append_fromstr(channel, &sysconfig->sconfig, dns_servers[i], ARES_TRUE); if (status != ARES_SUCCESS) { - return status; + break; } } for (i = 0; i < num_servers; i++) { ares_free(dns_servers[i]); } ares_free(dns_servers); + if (status != ARES_SUCCESS) { + return status; + } } domains = ares_get_android_search_domains_list(); @@ -273,7 +276,7 @@ static ares_status_t * 3. if confstr(_CS_DOMAIN, ...) this is the domain name. Use this as * preference over anything else found. */ - ares_buf_t *buf = ares_buf_create(); + ares_buf_t *buf = NULL; unsigned char *data = NULL; size_t data_size = 0; ares_bool_t process_resolvconf = ARES_TRUE; @@ -330,7 +333,7 @@ static ares_status_t char domain[256]; size_t domain_len; - domain_len = confstr(_CS_DOMAIN, domain, sizeof(domain_len)); + domain_len = confstr(_CS_DOMAIN, domain, sizeof(domain)); if (domain_len != 0) { ares_strsplit_free(sysconfig->domains, sysconfig->ndomains); sysconfig->domains = ares_strsplit(domain, ", ", &sysconfig->ndomains); diff --git a/deps/cares/src/lib/ares_sysconfig_files.c b/deps/cares/src/lib/ares_sysconfig_files.c index a6c2a8e62bb3..2caa3b200075 100644 --- a/deps/cares/src/lib/ares_sysconfig_files.c +++ b/deps/cares/src/lib/ares_sysconfig_files.c @@ -27,6 +27,8 @@ #include "ares_private.h" +#include + #ifdef HAVE_SYS_PARAM_H # include #endif @@ -170,8 +172,8 @@ static ares_status_t parse_sort(ares_buf_t *buf, struct apattern *pat) if (ares_str_isnum(maskstr)) { /* Numeric mask */ - int mask = atoi(maskstr); - if (mask < 0 || mask > 128) { + unsigned int mask; + if (!ares_str_parse_uint(maskstr, 128, &mask)) { return ARES_EBADSTR; } if (pat->addr.family == AF_INET && mask > 32) { @@ -340,12 +342,17 @@ static ares_status_t config_lookup(ares_sysconfig_t *sysconfig, ares_buf_t *buf, const char *value = lookups[i]; char ch; + /* AIX /etc/netsvc.conf uses address-family-suffixed tokens such as + * "bind4"/"bind6" and "local4"/"local6" in addition to the bare forms. */ if (ares_strcaseeq(value, "dns") || ares_strcaseeq(value, "bind") || + ares_strcaseeq(value, "bind4") || ares_strcaseeq(value, "bind6") || ares_strcaseeq(value, "resolv") || ares_strcaseeq(value, "resolve")) { ch = 'b'; } else if (ares_strcaseeq(value, "files") || ares_strcaseeq(value, "file") || - ares_strcaseeq(value, "local")) { + ares_strcaseeq(value, "local") || + ares_strcaseeq(value, "local4") || + ares_strcaseeq(value, "local6")) { ch = 'f'; } else { continue; @@ -401,20 +408,25 @@ static ares_status_t process_option(ares_sysconfig_t *sysconfig, key = kv[0]; if (num == 2) { - val = kv[1]; - valint = (unsigned int)strtoul(val, NULL, 10); + val = kv[1]; + if (!ares_str_parse_uint(val, UINT_MAX, &valint)) { + status = ARES_EBADSTR; + goto done; + } } if (ares_streq(key, "ndots")) { sysconfig->ndots = valint; } else if (ares_streq(key, "retrans") || ares_streq(key, "timeout")) { if (valint == 0) { - return ARES_EFORMERR; + status = ARES_EFORMERR; + goto done; } sysconfig->timeout_ms = valint * 1000; } else if (ares_streq(key, "retry") || ares_streq(key, "attempts")) { if (valint == 0) { - return ARES_EFORMERR; + status = ARES_EFORMERR; + goto done; } sysconfig->tries = valint; } else if (ares_streq(key, "rotate")) { diff --git a/deps/cares/src/lib/ares_sysconfig_win.c b/deps/cares/src/lib/ares_sysconfig_win.c index 94a3817de348..e0daf1103e2c 100644 --- a/deps/cares/src/lib/ares_sysconfig_win.c +++ b/deps/cares/src/lib/ares_sysconfig_win.c @@ -114,56 +114,69 @@ static ares_bool_t get_REG_SZ(HKEY hKey, const WCHAR *leafKeyName, char **outptr /* Convert to UTF8 */ len = WideCharToMultiByte(CP_UTF8, 0, val, -1, NULL, 0, NULL, NULL); if (len == 0) { + ares_free(val); return ARES_FALSE; } *outptr = ares_malloc_zero((size_t)len + 1); + if (*outptr == NULL) { + ares_free(val); + return ARES_FALSE; + } if (WideCharToMultiByte(CP_UTF8, 0, val, -1, *outptr, len, NULL, NULL) == 0) { ares_free(*outptr); *outptr = NULL; + ares_free(val); return ARES_FALSE; } + ares_free(val); return ARES_TRUE; } -static void commanjoin(char **dst, const char * const src, const size_t len) +static ares_status_t sysconfig_commajoin(ares_buf_t *buf, const char *src, + ares_bool_t asciionly) { - char *newbuf; - size_t newsize; + ares_status_t status; - /* 1 for terminating 0 and 2 for , and terminating 0 */ - newsize = len + (*dst ? (ares_strlen(*dst) + 2) : 1); - newbuf = ares_realloc(*dst, newsize); - if (!newbuf) { - return; + if (buf == NULL) { + return ARES_ENOMEM; } - if (*dst == NULL) { - *newbuf = '\0'; + + if (src == NULL || *src == '\0') { + return ARES_SUCCESS; } - *dst = newbuf; - if (ares_strlen(*dst) != 0) { - strcat(*dst, ","); + + if (asciionly && !ares_str_isprint(src, ares_strlen(src))) { + return ARES_SUCCESS; } - strncat(*dst, src, len); -} -/* - * commajoin() - * - * RTF code. - */ -static void commajoin(char **dst, const char *src) -{ - commanjoin(dst, src, ares_strlen(src)); + if (ares_buf_len(buf) > 0) { + status = ares_buf_append_byte(buf, ','); + if (status != ARES_SUCCESS) { + return status; + } + } + + return ares_buf_append_str(buf, src); } -static void commajoin_asciionly(char **dst, const char *src) +/* Read a REG_SZ value and comma-append it (ASCII-only) to *buf. + * On allocation failure, destroys *buf and sets it to NULL. */ +static void reg_commajoin(ares_buf_t **buf, HKEY key, const WCHAR *leaf) { - if (!ares_str_isprint(src, ares_strlen(src))) { + char *p = NULL; + + if (*buf == NULL || !get_REG_SZ(key, leaf, &p)) { return; } - commanjoin(dst, src, ares_strlen(src)); + + if (sysconfig_commajoin(*buf, p, ARES_TRUE) != ARES_SUCCESS) { + ares_buf_destroy(*buf); + *buf = NULL; + } + + ares_free(p); } /* A structure to hold the string form of IPv4 and IPv6 addresses so we can @@ -494,8 +507,10 @@ static ares_bool_t get_DNS_Windows(char **outptr) /* Join them all into a single string, removing duplicates. */ { - size_t i; - for (i = 0; i < addressesIndex; ++i) { + size_t i; + ares_buf_t *buf = ares_buf_create(); + + for (i = 0; buf != NULL && i < addressesIndex; ++i) { size_t j; /* Look for this address text appearing previously in the results. */ for (j = 0; j < i; ++j) { @@ -505,10 +520,22 @@ static ares_bool_t get_DNS_Windows(char **outptr) } /* Iff we didn't emit this address already, emit it now. */ if (j == i) { - /* Add that to outptr (if we can). */ - commajoin(outptr, addresses[i].text); + /* Add that to buf (if we can). */ + if (sysconfig_commajoin(buf, addresses[i].text, ARES_FALSE) != + ARES_SUCCESS) { + ares_buf_destroy(buf); + buf = NULL; + break; + } } } + + if (buf != NULL && ares_buf_len(buf) == 0) { + ares_buf_destroy(buf); + buf = NULL; + } + + *outptr = ares_buf_finish_str(buf, NULL); } done: @@ -540,51 +567,46 @@ static ares_bool_t get_DNS_Windows(char **outptr) */ static ares_bool_t get_SuffixList_Windows(char **outptr) { - HKEY hKey; - HKEY hKeyEnum; - char keyName[256]; - DWORD keyNameBuffSize; - DWORD keyIdx = 0; - char *p = NULL; + HKEY hKey; + HKEY hKeyEnum; + char keyName[256]; + DWORD keyNameBuffSize; + DWORD keyIdx = 0; + ares_buf_t *buf = ares_buf_create(); *outptr = NULL; + if (buf == NULL) { + return ARES_FALSE; + } + /* 1. Global DNS Suffix Search List */ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { - get_REG_SZ(hKey, SEARCHLIST_KEY, outptr); - if (get_REG_SZ(hKey, DOMAIN_KEY, &p)) { - commajoin_asciionly(outptr, p); - ares_free(p); - p = NULL; - } + reg_commajoin(&buf, hKey, SEARCHLIST_KEY); + reg_commajoin(&buf, hKey, DOMAIN_KEY); RegCloseKey(hKey); } - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NT_DNSCLIENT, 0, KEY_READ, &hKey) == - ERROR_SUCCESS) { - if (get_REG_SZ(hKey, SEARCHLIST_KEY, &p)) { - commajoin_asciionly(outptr, p); - ares_free(p); - p = NULL; - } + if (buf != NULL && + RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NT_DNSCLIENT, 0, KEY_READ, &hKey) == + ERROR_SUCCESS) { + reg_commajoin(&buf, hKey, SEARCHLIST_KEY); RegCloseKey(hKey); } /* 2. Connection Specific Search List composed of: * a. Primary DNS Suffix */ - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_DNSCLIENT, 0, KEY_READ, &hKey) == - ERROR_SUCCESS) { - if (get_REG_SZ(hKey, PRIMARYDNSSUFFIX_KEY, &p)) { - commajoin_asciionly(outptr, p); - ares_free(p); - p = NULL; - } + if (buf != NULL && + RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_DNSCLIENT, 0, KEY_READ, &hKey) == + ERROR_SUCCESS) { + reg_commajoin(&buf, hKey, PRIMARYDNSSUFFIX_KEY); RegCloseKey(hKey); } /* b. Interface SearchList, Domain, DhcpDomain */ - if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY "\\" INTERFACES_KEY, 0, + if (buf != NULL && + RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY "\\" INTERFACES_KEY, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { for (;;) { keyNameBuffSize = sizeof(keyName); @@ -596,27 +618,26 @@ static ares_bool_t get_SuffixList_Windows(char **outptr) ERROR_SUCCESS) { continue; } - /* p can be comma separated (SearchList) */ - if (get_REG_SZ(hKeyEnum, SEARCHLIST_KEY, &p)) { - commajoin_asciionly(outptr, p); - ares_free(p); - p = NULL; - } - if (get_REG_SZ(hKeyEnum, DOMAIN_KEY, &p)) { - commajoin_asciionly(outptr, p); - ares_free(p); - p = NULL; - } - if (get_REG_SZ(hKeyEnum, DHCPDOMAIN_KEY, &p)) { - commajoin_asciionly(outptr, p); - ares_free(p); - p = NULL; - } + /* SearchList can be comma separated */ + reg_commajoin(&buf, hKeyEnum, SEARCHLIST_KEY); + reg_commajoin(&buf, hKeyEnum, DOMAIN_KEY); + reg_commajoin(&buf, hKeyEnum, DHCPDOMAIN_KEY); RegCloseKey(hKeyEnum); + + if (buf == NULL) { + break; + } } RegCloseKey(hKey); } + if (ares_buf_len(buf) == 0) { + ares_buf_destroy(buf); + buf = NULL; + } + + *outptr = ares_buf_finish_str(buf, NULL); + return *outptr != NULL ? ARES_TRUE : ARES_FALSE; } diff --git a/deps/cares/src/lib/ares_timeout.c b/deps/cares/src/lib/ares_timeout.c index 0d2fdcff21f6..dbd5cf443d68 100644 --- a/deps/cares/src/lib/ares_timeout.c +++ b/deps/cares/src/lib/ares_timeout.c @@ -32,6 +32,17 @@ #endif +void ares_timeval_add(ares_timeval_t *now, size_t millisecs) +{ + now->sec += (ares_int64_t)millisecs / 1000; + now->usec += (unsigned int)((millisecs % 1000) * 1000); + + if (now->usec >= 1000000) { + now->sec += now->usec / 1000000; + now->usec %= 1000000; + } +} + void ares_timeval_remaining(ares_timeval_t *remaining, const ares_timeval_t *now, const ares_timeval_t *tout) diff --git a/deps/cares/src/lib/ares_update_servers.c b/deps/cares/src/lib/ares_update_servers.c index 70a9381499f8..f8d441accf23 100644 --- a/deps/cares/src/lib/ares_update_servers.c +++ b/deps/cares/src/lib/ares_update_servers.c @@ -27,6 +27,8 @@ */ #include "ares_private.h" +#include + #ifdef HAVE_ARPA_INET_H # include #endif @@ -234,7 +236,10 @@ static ares_status_t parse_nameserver_uri(ares_buf_t *buf, sconfig->tcp_port = sconfig->udp_port; port = ares_uri_get_query_key(uri, "tcpport"); if (port != NULL) { - sconfig->tcp_port = (unsigned short)atoi(port); + if (!ares_parse_port(port, &sconfig->tcp_port, ARES_TRUE)) { + status = ARES_EBADSTR; + goto done; + } } done: @@ -352,7 +357,9 @@ static ares_status_t parse_nameserver(ares_buf_t *buf, ares_sconfig_t *sconfig) return status; } - sconfig->udp_port = (unsigned short)atoi(portstr); + if (!ares_parse_port(portstr, &sconfig->udp_port, ARES_TRUE)) { + return ARES_EBADSTR; + } sconfig->tcp_port = sconfig->udp_port; } @@ -398,7 +405,13 @@ static ares_status_t ares_sconfig_linklocal(const ares_channel_t *channel, if (ares_str_isnum(ll_iface)) { char ifname[IF_NAMESIZE] = ""; - ll_scope = (unsigned int)atoi(ll_iface); + + /* The interface identifier is all digits but may not fit in an + * unsigned int; parse with the range-checked helper rather than atoi(), + * whose behavior on overflow is undefined. */ + if (!ares_str_parse_uint(ll_iface, UINT_MAX, &ll_scope)) { + return ARES_ENOTFOUND; + } if (channel->sock_funcs.aif_indextoname == NULL || channel->sock_funcs.aif_indextoname(ll_scope, ifname, sizeof(ifname), channel->sock_func_cb_data) == @@ -967,7 +980,8 @@ ares_status_t ares_in_addr_to_sconfig_llist(const struct in_addr *servers, sizeof(sconfig->addr.addr.addr4)); if (ares_llist_insert_last(s, sconfig) == NULL) { - goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + ares_free(sconfig); /* LCOV_EXCL_LINE: OutOfMemory */ + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ } } diff --git a/deps/cares/src/lib/dsa/ares_array.c b/deps/cares/src/lib/dsa/ares_array.c index c421d5c5f670..e6bce6e41db9 100644 --- a/deps/cares/src/lib/dsa/ares_array.c +++ b/deps/cares/src/lib/dsa/ares_array.c @@ -171,14 +171,19 @@ void *ares_array_finish(ares_array_t *arr, size_t *num_members) ares_status_t ares_array_set_size(ares_array_t *arr, size_t size) { - void *temp; + void *temp; + size_t rounded_size; if (arr == NULL || size == 0 || size < arr->cnt) { return ARES_EFORMERR; } /* Always operate on powers of 2 */ - size = ares_round_up_pow2(size); + rounded_size = ares_round_up_pow2(size); + if (rounded_size < size) { + return ARES_ENOMEM; /* rounding wrapped around */ + } + size = rounded_size; if (size < ARES__ARRAY_MIN) { size = ARES__ARRAY_MIN; @@ -189,8 +194,8 @@ ares_status_t ares_array_set_size(ares_array_t *arr, size_t size) return ARES_SUCCESS; } - temp = ares_realloc_zero(arr->arr, arr->alloc_cnt * arr->member_size, - size * arr->member_size); + temp = + ares_realloc_zero_array(arr->arr, arr->alloc_cnt, size, arr->member_size); if (temp == NULL) { return ARES_ENOMEM; } @@ -295,7 +300,7 @@ ares_status_t ares_array_insertdata_first(ares_array_t *arr, ares_status_t status; void *ptr = NULL; - status = ares_array_insert_last(&ptr, arr); + status = ares_array_insert_first(&ptr, arr); if (status != ARES_SUCCESS) { return status; } @@ -362,6 +367,16 @@ ares_status_t ares_array_claim_at(void *dest, size_t dest_size, } arr->cnt--; + + /* When empty, reset offset so a later insert doesn't compact from an + * out-of-range index (offset can reach alloc_cnt after front claims). + * This also protects ares_array_finish(), which has the same + * move(0, offset) and would otherwise fail on an offset == alloc_cnt + * array. */ + if (arr->cnt == 0) { + arr->offset = 0; + } + return ARES_SUCCESS; } diff --git a/deps/cares/src/lib/dsa/ares_htable.c b/deps/cares/src/lib/dsa/ares_htable.c index f76b67cae9a6..d6ac7a065a6b 100644 --- a/deps/cares/src/lib/dsa/ares_htable.c +++ b/deps/cares/src/lib/dsa/ares_htable.c @@ -150,6 +150,10 @@ const void **ares_htable_all_buckets(const ares_htable_t *htable, size_t *num) *num = 0; + if (htable->num_keys == 0) { + return NULL; + } + out = ares_malloc_zero(sizeof(*out) * htable->num_keys); if (out == NULL) { return NULL; /* LCOV_EXCL_LINE */ @@ -172,7 +176,7 @@ const void **ares_htable_all_buckets(const ares_htable_t *htable, size_t *num) * We are doing "hash & (size - 1)" since we are guaranteeing a power of * 2 for size. This is equivalent to "hash % size", but should be more * efficient */ -#define HASH_IDX(h, key) h->hash(key, h->seed) & (h->size - 1) +#define HASH_IDX(h, key) ((h)->hash((key), (h)->seed) & ((h)->size - 1)) static ares_llist_node_t *ares_htable_find(const ares_htable_t *htable, unsigned int idx, const void *key) diff --git a/deps/cares/src/lib/dsa/ares_htable_dict.c b/deps/cares/src/lib/dsa/ares_htable_dict.c index 93d7a20137c8..cda7a49c79d0 100644 --- a/deps/cares/src/lib/dsa/ares_htable_dict.c +++ b/deps/cares/src/lib/dsa/ares_htable_dict.c @@ -132,6 +132,7 @@ ares_bool_t ares_htable_dict_insert(ares_htable_dict_t *htable, const char *key, fail: if (bucket) { + ares_free(bucket->key); ares_free(bucket->val); ares_free(bucket); } @@ -223,6 +224,7 @@ char **ares_htable_dict_keys(const ares_htable_dict_t *htable, size_t *num) fail: *num = 0; + ares_free(buckets); ares_free_array(out, cnt, ares_free); return NULL; } diff --git a/deps/cares/src/lib/dsa/ares_llist.c b/deps/cares/src/lib/dsa/ares_llist.c index 6bd7de269a43..ce1a31149401 100644 --- a/deps/cares/src/lib/dsa/ares_llist.c +++ b/deps/cares/src/lib/dsa/ares_llist.c @@ -103,7 +103,10 @@ static void ares_llist_attach_at(ares_llist_t *list, case ARES__LLIST_INSERT_BEFORE: node->next = at; node->prev = at->prev; - at->prev = node; + if (at->prev) { + at->prev->next = node; + } + at->prev = node; break; } if (list->tail == NULL) { diff --git a/deps/cares/src/lib/event/ares_event_configchg.c b/deps/cares/src/lib/event/ares_event_configchg.c index add729574e46..d73c4862058c 100644 --- a/deps/cares/src/lib/event/ares_event_configchg.c +++ b/deps/cares/src/lib/event/ares_event_configchg.c @@ -207,12 +207,14 @@ void ares_event_configchg_destroy(ares_event_configchg_t *configchg) # ifdef HAVE_REGISTERWAITFORSINGLEOBJECT if (configchg->regip4_wait != NULL) { - UnregisterWait(configchg->regip4_wait); + /* Use INVALID_HANDLE_VALUE to wait for any running callback to complete + * before returning, preventing use-after-free of configchg */ + UnregisterWaitEx(configchg->regip4_wait, INVALID_HANDLE_VALUE); configchg->regip4_wait = NULL; } if (configchg->regip6_wait != NULL) { - UnregisterWait(configchg->regip6_wait); + UnregisterWaitEx(configchg->regip6_wait, INVALID_HANDLE_VALUE); configchg->regip6_wait = NULL; } diff --git a/deps/cares/src/lib/event/ares_event_wake_pipe.c b/deps/cares/src/lib/event/ares_event_wake_pipe.c index cd1534bbbd58..2ea72c294152 100644 --- a/deps/cares/src/lib/event/ares_event_wake_pipe.c +++ b/deps/cares/src/lib/event/ares_event_wake_pipe.c @@ -117,7 +117,13 @@ static void ares_pipeevent_signal(const ares_event_t *e) } p = e->data; - (void)write(p->filedes[1], "1", 1); + /* Best-effort wakeup. A failed or short write is harmless: it can only + * happen when the pipe buffer is already full, which means a wakeup is + * already pending. The result is consumed to satisfy warn_unused_result + * (a plain (void) cast does not silence it under _FORTIFY_SOURCE). */ + if (write(p->filedes[1], "1", 1) < 0) { + return; + } } static void ares_pipeevent_cb(ares_event_thread_t *e, ares_socket_t fd, diff --git a/deps/cares/src/lib/event/ares_event_win32.c b/deps/cares/src/lib/event/ares_event_win32.c index d7d1d6573508..d558b6930a66 100644 --- a/deps/cares/src/lib/event/ares_event_win32.c +++ b/deps/cares/src/lib/event/ares_event_win32.c @@ -707,6 +707,9 @@ static ares_bool_t ares_evsys_win32_event_add(ares_event_t *event) ares_bool_t rc = ARES_FALSE; ed = ares_malloc_zero(sizeof(*ed)); + if (ed == NULL) { + return ARES_FALSE; /* LCOV_EXCL_LINE: OutOfMemory */ + } ed->event = event; ed->socket = event->fd; ed->base_socket = ARES_SOCKET_BAD; diff --git a/deps/cares/src/lib/include/ares_mem.h b/deps/cares/src/lib/include/ares_mem.h index 371cd4266dc7..d980923e5817 100644 --- a/deps/cares/src/lib/include/ares_mem.h +++ b/deps/cares/src/lib/include/ares_mem.h @@ -34,5 +34,8 @@ CARES_EXTERN void ares_free(void *ptr); CARES_EXTERN void *ares_malloc_zero(size_t size); CARES_EXTERN void *ares_realloc_zero(void *ptr, size_t orig_size, size_t new_size); +CARES_EXTERN void *ares_malloc_zero_array(size_t num, size_t size); +CARES_EXTERN void *ares_realloc_zero_array(void *ptr, size_t orig_num, + size_t new_num, size_t size); #endif diff --git a/deps/cares/src/lib/include/ares_str.h b/deps/cares/src/lib/include/ares_str.h index 4ee339510bf0..c7fdf4fc4c80 100644 --- a/deps/cares/src/lib/include/ares_str.h +++ b/deps/cares/src/lib/include/ares_str.h @@ -60,6 +60,23 @@ CARES_EXTERN size_t ares_strcpy(char *dest, const char *src, size_t dest_size); CARES_EXTERN ares_bool_t ares_str_isnum(const char *str); CARES_EXTERN ares_bool_t ares_str_isalnum(const char *str); +/*! Parse a base-10 unsigned integer from a NULL-terminated string. Unlike + * atoi(), this rejects overflow, leading or trailing garbage (a sign, + * whitespace, or non-digit characters), and any value that does not fit + * within the caller-provided maximum. + * + * \param[in] str String to parse. May be NULL or empty, in which case + * ARES_FALSE is returned. + * \param[in] max Largest value considered valid. Values above UINT_MAX + * are capped to UINT_MAX since out is an unsigned int. + * \param[out] out On success, receives the parsed value. Untouched on + * failure. + * \return ARES_TRUE if a valid in-range integer was parsed, ARES_FALSE + * otherwise. + */ +CARES_EXTERN ares_bool_t ares_str_parse_uint(const char *str, unsigned long max, + unsigned int *out); + CARES_EXTERN void ares_str_ltrim(char *str); CARES_EXTERN void ares_str_rtrim(char *str); CARES_EXTERN void ares_str_trim(char *str); diff --git a/deps/cares/src/lib/legacy/ares_expand_name.c b/deps/cares/src/lib/legacy/ares_expand_name.c index 72668f4cb60a..ee1d70076be8 100644 --- a/deps/cares/src/lib/legacy/ares_expand_name.c +++ b/deps/cares/src/lib/legacy/ares_expand_name.c @@ -69,7 +69,7 @@ ares_status_t ares_expand_name_validated(const unsigned char *encoded, } start_len = ares_buf_len(buf); - status = ares_dns_name_parse(buf, s, is_hostname); + status = ares_dns_name_parse(buf, s, is_hostname, ARES_TRUE); if (status != ARES_SUCCESS) { goto done; } diff --git a/deps/cares/src/lib/legacy/ares_parse_ns_reply.c b/deps/cares/src/lib/legacy/ares_parse_ns_reply.c index fc9ab9219d39..7013ce28b901 100644 --- a/deps/cares/src/lib/legacy/ares_parse_ns_reply.c +++ b/deps/cares/src/lib/legacy/ares_parse_ns_reply.c @@ -97,12 +97,12 @@ int ares_parse_ns_reply(const unsigned char *abuf, int alen_int, } /* Preallocate the maximum number + 1 */ - hostent->h_aliases = ares_malloc((ancount + 1) * sizeof(*hostent->h_aliases)); + hostent->h_aliases = + ares_malloc_zero_array(ancount + 1, sizeof(*hostent->h_aliases)); if (hostent->h_aliases == NULL) { status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ goto done; /* LCOV_EXCL_LINE: OutOfMemory */ } - memset(hostent->h_aliases, 0, (ancount + 1) * sizeof(*hostent->h_aliases)); for (i = 0; i < ancount; i++) { const ares_dns_rr_t *rr = diff --git a/deps/cares/src/lib/legacy/ares_parse_ptr_reply.c b/deps/cares/src/lib/legacy/ares_parse_ptr_reply.c index 0e52f9db09bb..a275f3802ffc 100644 --- a/deps/cares/src/lib/legacy/ares_parse_ptr_reply.c +++ b/deps/cares/src/lib/legacy/ares_parse_ptr_reply.c @@ -88,12 +88,12 @@ ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec, hostent->h_length = (HOSTENT_LENGTH_TYPE)addrlen; /* Preallocate the maximum number + 1 */ - hostent->h_aliases = ares_malloc((ancount + 1) * sizeof(*hostent->h_aliases)); + hostent->h_aliases = + ares_malloc_zero_array(ancount + 1, sizeof(*hostent->h_aliases)); if (hostent->h_aliases == NULL) { status = ARES_ENOMEM; goto done; } - memset(hostent->h_aliases, 0, (ancount + 1) * sizeof(*hostent->h_aliases)); /* Cycle through answers */ diff --git a/deps/cares/src/lib/record/ares_dns_mapping.c b/deps/cares/src/lib/record/ares_dns_mapping.c index 5a3ec28abf13..38dedd438c6d 100644 --- a/deps/cares/src/lib/record/ares_dns_mapping.c +++ b/deps/cares/src/lib/record/ares_dns_mapping.c @@ -147,7 +147,7 @@ ares_bool_t ares_dns_class_isvalid(ares_dns_class_t qclass, switch (qclass) { case ARES_CLASS_IN: case ARES_CLASS_CHAOS: - case ARES_CLASS_HESOID: + case ARES_CLASS_HESIOD: case ARES_CLASS_NONE: return ARES_TRUE; case ARES_CLASS_ANY: @@ -228,7 +228,7 @@ const char *ares_dns_rec_type_tostr(ares_dns_rec_type_t type) case ARES_REC_TYPE_CAA: return "CAA"; case ARES_REC_TYPE_RAW_RR: - return "RAWRR"; + return "RAW_RR"; } return "UNKNOWN"; } @@ -240,7 +240,7 @@ const char *ares_dns_class_tostr(ares_dns_class_t qclass) return "IN"; case ARES_CLASS_CHAOS: return "CH"; - case ARES_CLASS_HESOID: + case ARES_CLASS_HESIOD: return "HS"; case ARES_CLASS_ANY: return "ANY"; @@ -670,7 +670,7 @@ ares_bool_t ares_dns_class_fromstr(ares_dns_class_t *qclass, const char *str) } list[] = { { "IN", ARES_CLASS_IN }, { "CH", ARES_CLASS_CHAOS }, - { "HS", ARES_CLASS_HESOID }, + { "HS", ARES_CLASS_HESIOD }, { "NONE", ARES_CLASS_NONE }, { "ANY", ARES_CLASS_ANY }, { NULL, 0 } diff --git a/deps/cares/src/lib/record/ares_dns_multistring.c b/deps/cares/src/lib/record/ares_dns_multistring.c index 44fcaccd65bb..a2a7adc4e452 100644 --- a/deps/cares/src/lib/record/ares_dns_multistring.c +++ b/deps/cares/src/lib/record/ares_dns_multistring.c @@ -227,7 +227,9 @@ const unsigned char *ares_dns_multistring_combined(ares_dns_multistring_t *strs, strs->cache_str = (unsigned char *)ares_buf_finish_str(buf, &strs->cache_str_len); - if (strs->cache_str != NULL) { + if (strs->cache_str == NULL) { + ares_buf_destroy(buf); + } else { strs->cache_invalidated = ARES_FALSE; } *len = strs->cache_str_len; diff --git a/deps/cares/src/lib/record/ares_dns_name.c b/deps/cares/src/lib/record/ares_dns_name.c index a9b92e03ca93..ffcaf5e110d5 100644 --- a/deps/cares/src/lib/record/ares_dns_name.c +++ b/deps/cares/src/lib/record/ares_dns_name.c @@ -25,6 +25,18 @@ */ #include "ares_private.h" +/* RFC 1035 3.1 limits a name to 255 octets. We track presentation length + * (label octets plus one separator before each label after the first), which is + * up to ~2 octets looser than the strict wire limit and so never rejects a + * compliant name. Shared by the read and write paths. */ +#define ARES_MAX_NAME_PRESENTATION_LEN 255 + +/* A name of <= 255 octets holds at most 128 labels, so it can never legitimately + * require more than that many compression-pointer jumps. Bounding the number of + * indirections stops a name built purely from pointers (which never adds label + * bytes, so the length cap never fires) from being walked without limit. */ +#define ARES_MAX_INDIRS 128 + typedef struct { char *name; size_t name_len; @@ -48,10 +60,18 @@ static ares_status_t ares_nameoffset_create(ares_llist_t **list, ares_nameoffset_t *off = NULL; if (list == NULL || name == NULL || ares_strlen(name) == 0 || - ares_strlen(name) > 255) { + ares_strlen(name) > ARES_MAX_NAME_PRESENTATION_LEN) { return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */ } + /* Don't record a name as a compression target if it can't be referenced by + * a pointer. DNS name compression offsets are only 14 bits (RFC 1035 + * 4.1.4), so a name positioned beyond 0x3FFF would have its offset + * truncated when written, producing a pointer to the wrong location. */ + if (idx > 0x3FFF) { + return ARES_SUCCESS; + } + if (*list == NULL) { *list = ares_llist_create(ares_nameoffset_free); } @@ -65,7 +85,12 @@ static ares_status_t ares_nameoffset_create(ares_llist_t **list, return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ } - off->name = ares_strdup(name); + off->name = ares_strdup(name); + if (off->name == NULL) { + status = ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */ + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + off->name_len = ares_strlen(off->name); off->idx = idx; @@ -335,7 +360,8 @@ static ares_status_t ares_split_dns_name(ares_array_t *labels, } /* Can't exceed maximum (unescaped) length */ - if (ares_array_len(labels) && total_len + ares_array_len(labels) - 1 > 255) { + if (ares_array_len(labels) && + total_len + ares_array_len(labels) - 1 > ARES_MAX_NAME_PRESENTATION_LEN) { status = ARES_EBADNAME; goto done; } @@ -419,6 +445,9 @@ ares_status_t ares_dns_name_write(ares_buf_t *buf, ares_llist_t **list, /* Output name compression offset jump */ if (off != NULL) { + /* off->idx is guaranteed to fit in 14 bits: ares_nameoffset_create() + * refuses to record offsets beyond 0x3FFF, so the mask below never + * actually truncates. */ unsigned short u16 = (unsigned short)0xC000 | (unsigned short)(off->idx & 0x3FFF); status = ares_buf_append_be16(buf, u16); @@ -531,13 +560,16 @@ static ares_status_t ares_fetch_dnsname_into_buf(ares_buf_t *buf, } ares_status_t ares_dns_name_parse(ares_buf_t *buf, char **name, - ares_bool_t is_hostname) + ares_bool_t is_hostname, + ares_bool_t allow_compression) { size_t save_offset = 0; unsigned char c; ares_status_t status; ares_buf_t *namebuf = NULL; size_t label_start = ares_buf_get_position(buf); + size_t name_len = 0; + size_t indir = 0; if (buf == NULL) { return ARES_EFORMERR; @@ -588,6 +620,13 @@ ares_status_t ares_dns_name_parse(ares_buf_t *buf, char **name, */ size_t offset = (size_t)((c & 0x3F) << 8); + /* Some RR types (e.g. SRV) do not permit name compression within their + * RDATA. Reject a compression pointer when it is not allowed. */ + if (!allow_compression) { + status = ARES_EBADNAME; + goto fail; + } + /* Fetch second byte of the redirect length */ status = ares_buf_fetch_bytes(buf, &c, 1); if (status != ARES_SUCCESS) { @@ -609,6 +648,16 @@ ares_status_t ares_dns_name_parse(ares_buf_t *buf, char **name, goto fail; } + /* Bound the number of indirections. A name made purely of pointers never + * adds label bytes, so the length cap below can't stop it; the + * strictly-decreasing rule alone still allows thousands of jumps per name. + * No legitimate <= 255 octet name needs more than 128 labels/jumps. */ + indir++; + if (indir > ARES_MAX_INDIRS) { + status = ARES_EBADNAME; + goto fail; + } + /* First time we make a jump, save the current position */ if (save_offset == 0) { save_offset = ares_buf_get_position(buf); @@ -632,6 +681,20 @@ ares_status_t ares_dns_name_parse(ares_buf_t *buf, char **name, /* New label */ + /* RFC 1035 3.1 limits a name to 255 octets. Enforce it during + * decompression so labels reached through a chain of pointers can't expand a + * single name without bound. Track the presentation length (label data plus + * the separator that precedes each label after the first), matching + * ares_split_dns_name() on the write side. */ + if (name_len) { + name_len++; + } + name_len += c; + if (name_len > ARES_MAX_NAME_PRESENTATION_LEN) { + status = ARES_EBADNAME; + goto fail; + } + /* Labels are separated by periods */ if (ares_buf_len(namebuf) != 0 && name != NULL) { status = ares_buf_append_byte(namebuf, '.'); diff --git a/deps/cares/src/lib/record/ares_dns_parse.c b/deps/cares/src/lib/record/ares_dns_parse.c index 0c545d7aa18a..9dc28e92d842 100644 --- a/deps/cares/src/lib/record/ares_dns_parse.c +++ b/deps/cares/src/lib/record/ares_dns_parse.c @@ -46,8 +46,14 @@ static ares_status_t ares_dns_parse_and_set_dns_name(ares_buf_t *buf, { ares_status_t status; char *name = NULL; + /* Only RR types defined in RFC1035 may use name compression within their + * RDATA (RFC3597). Reject compression pointers for any other type (e.g. + * SRV per RFC2782) to match the write-side policy and avoid following + * pointers that a non-understanding nameserver could not have rewritten. */ + ares_bool_t allow_compression = + ares_dns_rec_allow_name_comp(ares_dns_rr_get_type(rr)); - status = ares_dns_name_parse(buf, &name, is_hostname); + status = ares_dns_name_parse(buf, &name, is_hostname, allow_compression); if (status != ARES_SUCCESS) { return status; } @@ -514,6 +520,7 @@ static ares_status_t ares_dns_parse_rr_opt(ares_buf_t *buf, ares_dns_rr_t *rr, status = ares_dns_rr_set_opt_own(rr, ARES_RR_OPT_OPTIONS, opt, val, len); if (status != ARES_SUCCESS) { + ares_free(val); return status; } } @@ -607,6 +614,7 @@ static ares_status_t ares_dns_parse_rr_svcb(ares_buf_t *buf, ares_dns_rr_t *rr, status = ares_dns_rr_set_opt_own(rr, ARES_RR_SVCB_PARAMS, opt, val, len); if (status != ARES_SUCCESS) { + ares_free(val); return status; } } @@ -658,6 +666,7 @@ static ares_status_t ares_dns_parse_rr_https(ares_buf_t *buf, ares_dns_rr_t *rr, status = ares_dns_rr_set_opt_own(rr, ARES_RR_HTTPS_PARAMS, opt, val, len); if (status != ARES_SUCCESS) { + ares_free(val); return status; } } @@ -765,6 +774,12 @@ static ares_status_t ares_dns_parse_rr_raw_rr(ares_buf_t *buf, ares_status_t status; unsigned char *bytes = NULL; + /* Can't fail */ + status = ares_dns_rr_set_u16(rr, ARES_RR_RAW_RR_TYPE, raw_type); + if (status != ARES_SUCCESS) { + return status; + } + if (rdlength == 0) { return ARES_SUCCESS; } @@ -774,13 +789,6 @@ static ares_status_t ares_dns_parse_rr_raw_rr(ares_buf_t *buf, return status; } - /* Can't fail */ - status = ares_dns_rr_set_u16(rr, ARES_RR_RAW_RR_TYPE, raw_type); - if (status != ARES_SUCCESS) { - ares_free(bytes); - return status; - } - status = ares_dns_rr_set_bin_own(rr, ARES_RR_RAW_RR_DATA, bytes, rdlength); if (status != ARES_SUCCESS) { ares_free(bytes); @@ -920,30 +928,6 @@ static ares_status_t ares_dns_parse_header(ares_buf_t *buf, unsigned int flags, (*dnsrec)->raw_rcode = rcode; - if (*ancount > 0) { - status = - ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_ANSWER, *ancount); - if (status != ARES_SUCCESS) { - goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ - } - } - - if (*nscount > 0) { - status = - ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_AUTHORITY, *nscount); - if (status != ARES_SUCCESS) { - goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ - } - } - - if (*arcount > 0) { - status = - ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_ADDITIONAL, *arcount); - if (status != ARES_SUCCESS) { - goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ - } - } - return ARES_SUCCESS; fail: @@ -1032,7 +1016,7 @@ static ares_status_t ares_dns_parse_qd(ares_buf_t *buf, */ /* Name */ - status = ares_dns_name_parse(buf, &name, ARES_FALSE); + status = ares_dns_name_parse(buf, &name, ARES_FALSE, ARES_TRUE); if (status != ARES_SUCCESS) { goto done; } @@ -1103,7 +1087,7 @@ static ares_status_t ares_dns_parse_rr(ares_buf_t *buf, unsigned int flags, */ /* Name */ - status = ares_dns_name_parse(buf, &name, ARES_FALSE); + status = ares_dns_name_parse(buf, &name, ARES_FALSE, ARES_TRUE); if (status != ARES_SUCCESS) { goto done; } @@ -1208,6 +1192,8 @@ static ares_status_t ares_dns_parse_buf(ares_buf_t *buf, unsigned int flags, ares_dns_record_t **dnsrec) { ares_status_t status; + size_t total_rr_count; + const size_t min_rr_wire_len = 11; unsigned short qdcount; unsigned short ancount; unsigned short nscount; @@ -1268,6 +1254,35 @@ static ares_status_t ares_dns_parse_buf(ares_buf_t *buf, unsigned int flags, } } + total_rr_count = (size_t)ancount + (size_t)nscount + (size_t)arcount; + if (total_rr_count > ares_buf_len(buf) / min_rr_wire_len) { + status = ARES_EBADRESP; + goto fail; + } + + if (ancount > 0) { + status = ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_ANSWER, ancount); + if (status != ARES_SUCCESS) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + if (nscount > 0) { + status = + ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_AUTHORITY, nscount); + if (status != ARES_SUCCESS) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + + if (arcount > 0) { + status = + ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_ADDITIONAL, arcount); + if (status != ARES_SUCCESS) { + goto fail; /* LCOV_EXCL_LINE: OutOfMemory */ + } + } + /* Parse Answers */ for (i = 0; i < ancount; i++) { status = ares_dns_parse_rr(buf, flags, ARES_SECTION_ANSWER, *dnsrec); @@ -1292,6 +1307,22 @@ static ares_status_t ares_dns_parse_buf(ares_buf_t *buf, unsigned int flags, } } + /* RFC 6891 6.1.1: a message MUST NOT contain more than one OPT RR. Reject + * any response carrying multiple OPT records in the additional section. */ + { + size_t rr_cnt = ares_dns_record_rr_cnt(*dnsrec, ARES_SECTION_ADDITIONAL); + size_t opt_cnt = 0; + size_t j; + for (j = 0; j < rr_cnt; j++) { + const ares_dns_rr_t *rr = + ares_dns_record_rr_get_const(*dnsrec, ARES_SECTION_ADDITIONAL, j); + if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT && ++opt_cnt > 1) { + status = ARES_EBADRESP; + goto fail; + } + } + } + /* Finalize rcode now that if we have OPT it is processed */ if (!ares_dns_rcode_isvalid((*dnsrec)->raw_rcode)) { (*dnsrec)->rcode = ARES_RCODE_SERVFAIL; diff --git a/deps/cares/src/lib/record/ares_dns_record.c b/deps/cares/src/lib/record/ares_dns_record.c index ec0dfbd13c49..2c0dadd084ca 100644 --- a/deps/cares/src/lib/record/ares_dns_record.c +++ b/deps/cares/src/lib/record/ares_dns_record.c @@ -929,7 +929,7 @@ ares_status_t ares_dns_rr_add_abin(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, ares_dns_datatype_t datatype = ares_dns_rr_key_datatype(key); ares_bool_t is_nullterm = (datatype == ARES_DATATYPE_ABINP) ? ARES_TRUE : ARES_FALSE; - size_t alloclen = is_nullterm ? len + 1 : len; + size_t alloclen; unsigned char *temp; ares_dns_multistring_t **strs; @@ -937,6 +937,15 @@ ares_status_t ares_dns_rr_add_abin(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, return ARES_EFORMERR; } + if (val == NULL && len != 0) { + return ARES_EFORMERR; + } + + if (is_nullterm && len == SIZE_MAX) { + return ARES_ENOMEM; + } + alloclen = is_nullterm ? len + 1 : len; + strs = ares_dns_rr_data_ptr(dns_rr, key, NULL); if (strs == NULL) { return ARES_EFORMERR; @@ -954,7 +963,9 @@ ares_status_t ares_dns_rr_add_abin(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, return ARES_ENOMEM; } - memcpy(temp, val, len); + if (len != 0) { + memcpy(temp, val, len); + } /* NULL-term ABINP */ if (is_nullterm) { @@ -1237,14 +1248,32 @@ ares_status_t ares_dns_rr_set_bin(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, (datatype == ARES_DATATYPE_BINP || datatype == ARES_DATATYPE_ABINP) ? ARES_TRUE : ARES_FALSE; - size_t alloclen = is_nullterm ? len + 1 : len; - unsigned char *temp = ares_malloc(alloclen); + size_t alloclen; + unsigned char *temp; + + if (datatype != ARES_DATATYPE_BIN && datatype != ARES_DATATYPE_BINP && + datatype != ARES_DATATYPE_ABINP) { + return ARES_EFORMERR; + } + + if (val == NULL && len != 0) { + return ARES_EFORMERR; + } + + if (is_nullterm && len == SIZE_MAX) { + return ARES_ENOMEM; + } + alloclen = is_nullterm ? len + 1 : len; + + temp = ares_malloc(alloclen); if (temp == NULL) { return ARES_ENOMEM; } - memcpy(temp, val, len); + if (len != 0) { + memcpy(temp, val, len); + } /* NULL-term BINP */ if (is_nullterm) { @@ -1400,12 +1429,23 @@ ares_status_t ares_dns_rr_set_opt(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key, ares_status_t status; if (val != NULL) { - temp = ares_malloc(val_len + 1); + size_t alloclen; + + if (val_len == SIZE_MAX) { + return ARES_ENOMEM; + } + alloclen = val_len + 1; + + temp = ares_malloc(alloclen); if (temp == NULL) { return ARES_ENOMEM; } - memcpy(temp, val, val_len); + if (val_len != 0) { + memcpy(temp, val, val_len); + } temp[val_len] = 0; + } else if (val_len != 0) { + return ARES_EFORMERR; } status = ares_dns_rr_set_opt_own(dns_rr, key, opt, temp, val_len); diff --git a/deps/cares/src/lib/str/ares_buf.c b/deps/cares/src/lib/str/ares_buf.c index 63acc6cf7714..25f0372e4dbd 100644 --- a/deps/cares/src/lib/str/ares_buf.c +++ b/deps/cares/src/lib/str/ares_buf.c @@ -139,6 +139,7 @@ static ares_status_t ares_buf_ensure_space(ares_buf_t *buf, size_t needed_size) { size_t remaining_size; size_t alloc_size; + size_t total_required; unsigned char *ptr; if (buf == NULL) { @@ -151,9 +152,20 @@ static ares_status_t ares_buf_ensure_space(ares_buf_t *buf, size_t needed_size) /* When calling ares_buf_finish_str() we end up adding a null terminator, * so we want to ensure the size is always sufficient for this as we don't - * want an ARES_ENOMEM at that point */ + * want an ARES_ENOMEM at that point. + */ + if (buf->data_len >= SIZE_MAX - 1) { + return ARES_ENOMEM; + } + needed_size++; + if (needed_size > SIZE_MAX - buf->data_len) { + return ARES_ENOMEM; + } + + total_required = buf->data_len + needed_size; + /* No need to do an expensive move operation, we have enough to just append */ remaining_size = buf->alloc_buf_len - buf->data_len; if (remaining_size >= needed_size) { @@ -177,9 +189,11 @@ static ares_status_t ares_buf_ensure_space(ares_buf_t *buf, size_t needed_size) /* Increase allocation by powers of 2 */ do { - alloc_size <<= 1; - remaining_size = alloc_size - buf->data_len; - } while (remaining_size < needed_size); + if (alloc_size > SIZE_MAX >> 1) { + return ARES_ENOMEM; + } + alloc_size <<= 1; + } while (alloc_size < total_required); ptr = ares_realloc(buf->alloc_buf, alloc_size); if (ptr == NULL) { @@ -1111,7 +1125,7 @@ ares_status_t ares_buf_replace(ares_buf_t *buf, const unsigned char *srch, size_t processed_len = 0; ares_status_t status; - if (buf->alloc_buf == NULL || srch == NULL || srch_size == 0 || + if (buf == NULL || buf->alloc_buf == NULL || srch == NULL || srch_size == 0 || (rplc == NULL && rplc_size != 0)) { return ARES_EFORMERR; } @@ -1131,7 +1145,7 @@ ares_status_t ares_buf_replace(ares_buf_t *buf, const unsigned char *srch, /* Store the offset this was found because our actual pointer might be * switched out from under us by the call to ensure_space() if the * replacement pattern is larger than the search pattern */ - found_offset = (size_t)(ptr - (size_t)(buf->alloc_buf + buf->offset)); + found_offset = (size_t)(ptr - buf->alloc_buf) - buf->offset; if (rplc_size > srch_size) { status = ares_buf_ensure_space(buf, rplc_size - srch_size); if (status != ARES_SUCCESS) { @@ -1262,17 +1276,15 @@ static ares_status_t } done: - if (status != ARES_SUCCESS) { - ares_buf_destroy(binbuf); + if (status == ARES_SUCCESS && bin != NULL) { + size_t mylen = 0; + /* NOTE: we use ares_buf_finish_str() here as we guarantee NULL + * Termination even though we are technically returning binary data. + */ + *bin = (unsigned char *)ares_buf_finish_str(binbuf, &mylen); + *bin_len = mylen; } else { - if (bin != NULL) { - size_t mylen = 0; - /* NOTE: we use ares_buf_finish_str() here as we guarantee NULL - * Termination even though we are technically returning binary data. - */ - *bin = (unsigned char *)ares_buf_finish_str(binbuf, &mylen); - *bin_len = mylen; - } + ares_buf_destroy(binbuf); } return status; diff --git a/deps/cares/src/lib/str/ares_str.c b/deps/cares/src/lib/str/ares_str.c index 0eda1ab9f157..0819dc578490 100644 --- a/deps/cares/src/lib/str/ares_str.c +++ b/deps/cares/src/lib/str/ares_str.c @@ -28,6 +28,9 @@ #include "ares_private.h" #include "ares_str.h" +#include +#include + #ifdef HAVE_STDINT_H # include #endif @@ -125,6 +128,57 @@ ares_bool_t ares_str_isnum(const char *str) return ARES_TRUE; } +ares_bool_t ares_str_parse_uint(const char *str, unsigned long max, + unsigned int *out) +{ + char *end = NULL; + unsigned long val; + + /* Require a leading digit so strtoul()'s tolerance of a sign or leading + * whitespace (e.g. "-1" wrapping to UINT_MAX) can't slip through here. This + * also rejects NULL and empty strings. */ + if (str == NULL || out == NULL || !ares_isdigit(*str)) { + return ARES_FALSE; + } + + /* out is unsigned int, so a max above UINT_MAX would let strtoul's result + * truncate silently on assignment. Cap it. */ + if (max > UINT_MAX) { + max = UINT_MAX; + } + + errno = 0; + val = strtoul(str, &end, 10); + if (errno == ERANGE || *end != '\0' || val > max) { + return ARES_FALSE; + } + + *out = (unsigned int)val; + return ARES_TRUE; +} + +ares_bool_t ares_parse_port(const char *str, unsigned short *port, + ares_bool_t allow_zero) +{ + unsigned int val; + + if (port == NULL) { + return ARES_FALSE; + } + + if (!ares_str_parse_uint(str, 65535UL, &val)) { + return ARES_FALSE; + } + + if (!allow_zero && val == 0) { + return ARES_FALSE; + } + + *port = (unsigned short)val; + + return ARES_TRUE; +} + ares_bool_t ares_str_isalnum(const char *str) { size_t i; diff --git a/deps/cares/src/lib/util/ares_iface_ips.c b/deps/cares/src/lib/util/ares_iface_ips.c index c5f507f87e14..66d1fba84d4b 100644 --- a/deps/cares/src/lib/util/ares_iface_ips.c +++ b/deps/cares/src/lib/util/ares_iface_ips.c @@ -25,6 +25,8 @@ */ #include "ares_private.h" +#include + #ifdef USE_WINSOCK # include # include @@ -256,12 +258,12 @@ ares_iface_ip_flags_t ares_iface_ips_get_flags(const ares_iface_ips_t *ips, const ares_iface_ip_t *ip; if (ips == NULL) { - return 0; + return ARES_IFACE_IP_NONE; } ip = ares_array_at_const(ips->ips, idx); if (ip == NULL) { - return 0; + return ARES_IFACE_IP_NONE; } return ip->flags; @@ -329,6 +331,8 @@ static char *wcharp_to_charp(const wchar_t *in) static ares_bool_t name_match(const char *name, const char *adapter_name, unsigned int ll_scope) { + unsigned int scope; + if (name == NULL || *name == 0) { return ARES_TRUE; } @@ -337,7 +341,7 @@ static ares_bool_t name_match(const char *name, const char *adapter_name, return ARES_TRUE; } - if (ares_str_isnum(name) && (unsigned int)atoi(name) == ll_scope) { + if (ares_str_parse_uint(name, UINT_MAX, &scope) && scope == ll_scope) { return ARES_TRUE; } @@ -376,7 +380,7 @@ static ares_status_t ares_iface_ips_enumerate(ares_iface_ips_t *ips, for (address = addresses; address != NULL; address = address->Next) { IP_ADAPTER_UNICAST_ADDRESS *ipaddr = NULL; - ares_iface_ip_flags_t addrflag = 0; + ares_iface_ip_flags_t addrflag = ARES_IFACE_IP_NONE; char ifname[64] = ""; # if defined(HAVE_CONVERTINTERFACEINDEXTOLUID) && \ @@ -477,7 +481,7 @@ static ares_status_t ares_iface_ips_enumerate(ares_iface_ips_t *ips, } for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { - ares_iface_ip_flags_t addrflag = 0; + ares_iface_ip_flags_t addrflag = ARES_IFACE_IP_NONE; struct ares_addr addr; unsigned char netmask = 0; unsigned int ll_scope = 0; @@ -500,20 +504,28 @@ static ares_status_t ares_iface_ips_enumerate(ares_iface_ips_t *ips, addr.family = AF_INET; memcpy(&addr.addr.addr4, &sockaddr_in->sin_addr, sizeof(addr.addr.addr4)); /* netmask */ - sockaddr_in = (struct sockaddr_in *)((void *)ifa->ifa_netmask); - netmask = count_addr_bits((const void *)&sockaddr_in->sin_addr, 4); + if (ifa->ifa_netmask != NULL) { + sockaddr_in = (struct sockaddr_in *)((void *)ifa->ifa_netmask); + netmask = count_addr_bits((const void *)&sockaddr_in->sin_addr, 4); + } else { + netmask = 32; + } } else if (ifa->ifa_addr->sa_family == AF_INET6) { const struct sockaddr_in6 *sockaddr_in6 = (const struct sockaddr_in6 *)((void *)ifa->ifa_addr); addr.family = AF_INET6; memcpy(&addr.addr.addr6, &sockaddr_in6->sin6_addr, sizeof(addr.addr.addr6)); - /* netmask */ - sockaddr_in6 = (struct sockaddr_in6 *)((void *)ifa->ifa_netmask); - netmask = count_addr_bits((const void *)&sockaddr_in6->sin6_addr, 16); # ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID ll_scope = sockaddr_in6->sin6_scope_id; # endif + /* netmask */ + if (ifa->ifa_netmask != NULL) { + sockaddr_in6 = (struct sockaddr_in6 *)((void *)ifa->ifa_netmask); + netmask = count_addr_bits((const void *)&sockaddr_in6->sin6_addr, 16); + } else { + netmask = 128; + } } else { /* unknown */ continue; diff --git a/deps/cares/src/lib/util/ares_iface_ips.h b/deps/cares/src/lib/util/ares_iface_ips.h index f22e09046a06..ec2353448fb0 100644 --- a/deps/cares/src/lib/util/ares_iface_ips.h +++ b/deps/cares/src/lib/util/ares_iface_ips.h @@ -28,6 +28,7 @@ /*! Flags for interface ip addresses. */ typedef enum { + ARES_IFACE_IP_NONE = 0, /*!< No flags set / unspecified */ ARES_IFACE_IP_V4 = 1 << 0, /*!< IPv4 address. During enumeration if * this flag is set ARES_IFACE_IP_V6 * is not, will only enumerate v4 diff --git a/deps/cares/src/lib/util/ares_math.c b/deps/cares/src/lib/util/ares_math.c index 1106bf6bf151..3513146c3ddc 100644 --- a/deps/cares/src/lib/util/ares_math.c +++ b/deps/cares/src/lib/util/ares_math.c @@ -42,7 +42,7 @@ static unsigned int ares_round_up_pow2_u32(unsigned int n) return n; } -static ares_int64_t ares_round_up_pow2_u64(ares_int64_t n) +static ares_uint64_t ares_round_up_pow2_u64(ares_uint64_t n) { /* NOTE: if already a power of 2, will return itself, not the next */ n--; @@ -73,7 +73,7 @@ ares_bool_t ares_is_64bit(void) size_t ares_round_up_pow2(size_t n) { if (ares_is_64bit()) { - return (size_t)ares_round_up_pow2_u64((ares_int64_t)n); + return (size_t)ares_round_up_pow2_u64((ares_uint64_t)n); } return (size_t)ares_round_up_pow2_u32((unsigned int)n); @@ -156,3 +156,12 @@ unsigned char ares_count_bits_u8(unsigned char x) static const unsigned char lookup[256] = { B6(0), B6(1), B6(1), B6(2) }; return lookup[x]; } + +ares_bool_t ares_size_t_mul_overflow(size_t a, size_t b, size_t *res) +{ + if (a > 0 && b > SIZE_MAX / a) { + return ARES_TRUE; + } + *res = a * b; + return ARES_FALSE; +} diff --git a/deps/cares/src/lib/util/ares_math.h b/deps/cares/src/lib/util/ares_math.h index 3b60b00bdbb6..76e1e4883709 100644 --- a/deps/cares/src/lib/util/ares_math.h +++ b/deps/cares/src/lib/util/ares_math.h @@ -50,4 +50,9 @@ size_t ares_count_digits(size_t n); size_t ares_count_hexdigits(size_t n); unsigned char ares_count_bits_u8(unsigned char x); +/*! Multiply two size_t values, checking for overflow. On success writes the + * product to *res and returns ARES_FALSE. On overflow returns ARES_TRUE and + * leaves *res untouched. */ +ares_bool_t ares_size_t_mul_overflow(size_t a, size_t b, size_t *res); + #endif diff --git a/deps/cares/src/lib/util/ares_threads.c b/deps/cares/src/lib/util/ares_threads.c index ab0b51afb705..b27b7ebd7000 100644 --- a/deps/cares/src/lib/util/ares_threads.c +++ b/deps/cares/src/lib/util/ares_threads.c @@ -563,8 +563,7 @@ ares_status_t ares_queue_wait_empty(ares_channel_t *channel, int timeout_ms) if (timeout_ms >= 0) { ares_tvnow(&tout); - tout.sec += (ares_int64_t)(timeout_ms / 1000); - tout.usec += (unsigned int)(timeout_ms % 1000) * 1000; + ares_timeval_add(&tout, (size_t)timeout_ms); } ares_thread_mutex_lock(channel->lock); diff --git a/deps/cares/src/lib/util/ares_time.h b/deps/cares/src/lib/util/ares_time.h index c6eaf9736637..ecb721de1887 100644 --- a/deps/cares/src/lib/util/ares_time.h +++ b/deps/cares/src/lib/util/ares_time.h @@ -39,6 +39,7 @@ ares_bool_t ares_timedout(const ares_timeval_t *now, const ares_timeval_t *check); void ares_tvnow(ares_timeval_t *now); +void ares_timeval_add(ares_timeval_t *now, size_t millisecs); void ares_timeval_remaining(ares_timeval_t *remaining, const ares_timeval_t *now, const ares_timeval_t *tout); diff --git a/deps/cares/src/lib/util/ares_uri.c b/deps/cares/src/lib/util/ares_uri.c index 04bad0074a79..97f3f3f542a7 100644 --- a/deps/cares/src/lib/util/ares_uri.c +++ b/deps/cares/src/lib/util/ares_uri.c @@ -1174,6 +1174,7 @@ static ares_status_t ares_uri_parse_hostport(ares_uri_t *uri, ares_buf_t *buf) unsigned char b; char host[256]; char port[6]; + unsigned short parsed_port; size_t len; ares_status_t status; @@ -1242,11 +1243,11 @@ static ares_status_t ares_uri_parse_hostport(ares_uri_t *uri, ares_buf_t *buf) } port[len] = 0; - if (!ares_str_isnum(port)) { + if (!ares_parse_port(port, &parsed_port, ARES_TRUE)) { return ARES_EBADSTR; } - status = ares_uri_set_port(uri, (unsigned short)atoi(port)); + status = ares_uri_set_port(uri, parsed_port); if (status != ARES_SUCCESS) { return status; } diff --git a/deps/cares/src/tools/adig.c b/deps/cares/src/tools/adig.c index fce210a80535..29f359a39287 100644 --- a/deps/cares/src/tools/adig.c +++ b/deps/cares/src/tools/adig.c @@ -1162,12 +1162,12 @@ static ares_bool_t read_cmdline(int argc, const char * const *argv, /* skip prefix */ if (dig_options[opt].prefix != 0) { nameptr++; - } - - /* Negated option if it has a 'no' prefix */ - if (ares_streq_max(nameptr, "no", 2)) { - is_true = ARES_FALSE; - nameptr += 2; + /* Negated option if it has a 'no' prefix */ + if (dig_options[opt].prefix == '+' && + ares_streq_max(nameptr, "no", 2)) { + is_true = ARES_FALSE; + nameptr += 2; + } } if (dig_options[opt].separator != 0) { diff --git a/deps/cares/src/tools/ahost.c b/deps/cares/src/tools/ahost.c index 7d1d4a86dc7a..67b5677cad6e 100644 --- a/deps/cares/src/tools/ahost.c +++ b/deps/cares/src/tools/ahost.c @@ -44,6 +44,13 @@ #include "ares_str.h" +#define RV_OK 0 /* Success */ +#define RV_SYSERR 1 /* Internal system failure */ +#define RV_MISUSE 2 /* Misuse (command line) */ +#define RV_FAIL 3 /* Resolution failure */ +static int final_rv = RV_OK; + + static void callback(void *arg, int status, int timeouts, struct hostent *host); static void ai_callback(void *arg, int status, int timeouts, struct ares_addrinfo *result); diff --git a/deps/googletest/include/gtest/gtest-assertion-result.h b/deps/googletest/include/gtest/gtest-assertion-result.h index 7a5e223fa211..a72ac939102e 100644 --- a/deps/googletest/include/gtest/gtest-assertion-result.h +++ b/deps/googletest/include/gtest/gtest-assertion-result.h @@ -158,13 +158,18 @@ class GTEST_API_ [[nodiscard]] AssertionResult { // The second parameter prevents this overload from being considered if // the argument is implicitly convertible to AssertionResult. In that case // we want AssertionResult's copy constructor to be used. - template - explicit AssertionResult( - const T& success, - std::enable_if_t>* - /*enabler*/ - = nullptr) - : success_(success) {} + template && + !std::is_trivially_constructible_v, + int> = 0> + explicit AssertionResult(T&& success) : success_(std::forward(success)) {} + + // Similar to the mutable overload, but for cases where mutability is + // unnecessary or problematic (e.g., bitfields). + template , + int> = 0> + explicit AssertionResult(const T& success) : success_(success) {} #if defined(_MSC_VER) && (_MSC_VER < 1910 || _MSC_VER >= 1920) GTEST_DISABLE_MSC_WARNINGS_POP_() @@ -226,6 +231,24 @@ class GTEST_API_ [[nodiscard]] AssertionResult { std::unique_ptr< ::std::string> message_; }; +namespace internal { + +// A pair containing the result that an assertion is evaluating, and the +// expected result (true, false). +// +// Contains a conversion operator that indicates whether the two match. +struct AssertionResultExpectation { + testing::AssertionResult assertion_result; + bool expected_result; + + explicit operator bool() const { + bool converted(assertion_result); + return converted == expected_result; + } +}; + +} // namespace internal + // Makes a successful assertion result. GTEST_API_ AssertionResult AssertionSuccess(); diff --git a/deps/googletest/include/gtest/gtest-printers.h b/deps/googletest/include/gtest/gtest-printers.h index a13815733eff..fc0913ff0094 100644 --- a/deps/googletest/include/gtest/gtest-printers.h +++ b/deps/googletest/include/gtest/gtest-printers.h @@ -945,13 +945,13 @@ template class [[nodiscard]] UniversalPrinter> { public: static void Print(const std::optional& value, ::std::ostream* os) { - *os << '('; if (!value) { - *os << "nullopt"; + UniversalPrint(std::nullopt, os); } else { + *os << '('; UniversalPrint(*value, os); + *os << ')'; } - *os << ')'; } }; @@ -961,27 +961,38 @@ class [[nodiscard]] UniversalPrinter { static void Print(std::nullopt_t, ::std::ostream* os) { *os << "(nullopt)"; } }; +struct UniversalPrinterVisitor { + template + void operator()(const T& arg) const { + *os << "'" << GetTypeName() << "(index = " << index << ")' with value "; + UniversalPrint(arg, os); + } + ::std::ostream* os; + std::size_t index; +}; + // Printer for std::variant template class [[nodiscard]] UniversalPrinter> { public: static void Print(const std::variant& value, ::std::ostream* os) { - *os << '('; - std::visit(Visitor{os, value.index()}, value); - *os << ')'; + if (value.valueless_by_exception()) { + *os << "(valueless)"; + } else { + *os << '('; + std::visit(UniversalPrinterVisitor{os, value.index()}, value); + *os << ')'; + } } +}; - private: - struct Visitor { - template - void operator()(const U& u) const { - *os << "'" << GetTypeName() << "(index = " << index - << ")' with value "; - UniversalPrint(u, os); - } - ::std::ostream* os; - std::size_t index; - }; +// Printer for std::monostate +template <> +class [[nodiscard]] UniversalPrinter { + public: + static void Print(std::monostate, ::std::ostream* os) { + *os << "(monostate)"; + } }; // UniversalPrintArray(begin, len, os) prints an array of 'len' diff --git a/deps/googletest/include/gtest/gtest.h b/deps/googletest/include/gtest/gtest.h index a7193379b9ff..089b10e9f7a9 100644 --- a/deps/googletest/include/gtest/gtest.h +++ b/deps/googletest/include/gtest/gtest.h @@ -1818,14 +1818,13 @@ class [[nodiscard]] TestWithParam : public Test, #define GTEST_EXPECT_TRUE(condition) \ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ GTEST_NONFATAL_FAILURE_) -#define GTEST_EXPECT_FALSE(condition) \ - GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ +#define GTEST_EXPECT_FALSE(condition) \ + GTEST_TEST_BOOLEAN_(condition, #condition, true, false, \ GTEST_NONFATAL_FAILURE_) #define GTEST_ASSERT_TRUE(condition) \ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, GTEST_FATAL_FAILURE_) -#define GTEST_ASSERT_FALSE(condition) \ - GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ - GTEST_FATAL_FAILURE_) +#define GTEST_ASSERT_FALSE(condition) \ + GTEST_TEST_BOOLEAN_(condition, #condition, true, false, GTEST_FATAL_FAILURE_) // Define these macros to 1 to omit the definition of the corresponding // EXPECT or ASSERT, which clashes with some users' own code. diff --git a/deps/googletest/include/gtest/internal/gtest-internal.h b/deps/googletest/include/gtest/internal/gtest-internal.h index 8f66d1b35641..2b048c5dc098 100644 --- a/deps/googletest/include/gtest/internal/gtest-internal.h +++ b/deps/googletest/include/gtest/internal/gtest-internal.h @@ -1453,12 +1453,12 @@ class [[nodiscard]] NeverThrown { // representation of expression as it was passed into the EXPECT_TRUE. #define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ - if (const ::testing::AssertionResult gtest_ar_ = \ - ::testing::AssertionResult(expression)) \ + if (::testing::internal::AssertionResultExpectation gtest_are_ = { \ + ::testing::AssertionResult(expression), expected}) \ ; \ else \ fail(::testing::internal::GetBoolAssertionFailureMessage( \ - gtest_ar_, text, #actual, #expected)) + gtest_are_.assertion_result, text, #actual, #expected)) #define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ diff --git a/deps/googletest/include/gtest/internal/gtest-port.h b/deps/googletest/include/gtest/internal/gtest-port.h index b607e0adee74..31654b09c1dc 100644 --- a/deps/googletest/include/gtest/internal/gtest-port.h +++ b/deps/googletest/include/gtest/internal/gtest-port.h @@ -363,18 +363,24 @@ #define GTEST_DISABLE_MSC_WARNINGS_POP_() #endif -// Clang on Windows does not understand MSVC's pragma warning. -// We need clang-specific way to disable function deprecation warning. -#ifdef __clang__ -#define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \ +// Pragmas to disable function deprecation warnings. +#if defined(__clang__) +#define GTEST_DISABLE_DEPRECATED_PUSH_() \ _Pragma("clang diagnostic push") \ _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \ _Pragma("clang diagnostic ignored \"-Wdeprecated-implementations\"") -#define GTEST_DISABLE_MSC_DEPRECATED_POP_() _Pragma("clang diagnostic pop") +#define GTEST_DISABLE_DEPRECATED_POP_() _Pragma("clang diagnostic pop") +#elif defined(__GNUC__) +#define GTEST_DISABLE_DEPRECATED_PUSH_() \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#define GTEST_DISABLE_DEPRECATED_POP_() _Pragma("GCC diagnostic pop") +#elif defined(_MSC_VER) +#define GTEST_DISABLE_DEPRECATED_PUSH_() GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996) +#define GTEST_DISABLE_DEPRECATED_POP_() GTEST_DISABLE_MSC_WARNINGS_POP_() #else -#define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \ - GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996) -#define GTEST_DISABLE_MSC_DEPRECATED_POP_() GTEST_DISABLE_MSC_WARNINGS_POP_() +#define GTEST_DISABLE_DEPRECATED_PUSH_() +#define GTEST_DISABLE_DEPRECATED_POP_() #endif // Brings in definitions for functions used in the testing::internal::posix @@ -593,7 +599,8 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; defined(GTEST_OS_DRAGONFLY) || defined(GTEST_OS_GNU_KFREEBSD) || \ defined(GTEST_OS_OPENBSD) || defined(GTEST_OS_HAIKU) || \ defined(GTEST_OS_GNU_HURD) || defined(GTEST_OS_SOLARIS) || \ - defined(GTEST_OS_AIX) || defined(GTEST_OS_ZOS)) + defined(GTEST_OS_AIX) || defined(GTEST_OS_ZOS) || \ + (defined(GTEST_OS_EMSCRIPTEN) && defined(__EMSCRIPTEN_PTHREADS__))) #define GTEST_HAS_PTHREAD 1 #else #define GTEST_HAS_PTHREAD 0 @@ -2118,7 +2125,7 @@ inline int IsATTY(int fd) { // Functions deprecated by MSVC 8.0. -GTEST_DISABLE_MSC_DEPRECATED_PUSH_() +GTEST_DISABLE_DEPRECATED_PUSH_() // ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and // StrError() aren't needed on Windows CE at this time and thus not @@ -2180,7 +2187,7 @@ inline const char* GetEnv(const char* name) { #endif } -GTEST_DISABLE_MSC_DEPRECATED_POP_() +GTEST_DISABLE_DEPRECATED_POP_() #ifdef GTEST_OS_WINDOWS_MOBILE // Windows CE has no C library. The abort() function is used in @@ -2301,22 +2308,29 @@ using TimeInMillis = int64_t; // Represents time in milliseconds. // Macros for defining flags. #define GTEST_DEFINE_bool_(name, default_val, doc) \ + GTEST_DECLARE_bool_(name); \ namespace testing { \ GTEST_API_ bool GTEST_FLAG(name) = (default_val); \ } \ static_assert(true, "no-op to require trailing semicolon") #define GTEST_DEFINE_int32_(name, default_val, doc) \ + GTEST_DECLARE_int32_(name); \ namespace testing { \ GTEST_API_ std::int32_t GTEST_FLAG(name) = (default_val); \ } \ static_assert(true, "no-op to require trailing semicolon") #define GTEST_DEFINE_string_(name, default_val, doc) \ + GTEST_DECLARE_string_(name); \ namespace testing { \ GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val); \ } \ static_assert(true, "no-op to require trailing semicolon") // Macros for declaring flags. +// +// We also need to declare the flag in the public namespace to avoid triggering +// -Wmissing-variable-declarations warnings, as reported here: +// https://github.com/google/googletest/issues/4897 #define GTEST_DECLARE_bool_(name) \ namespace testing { \ GTEST_API_ extern bool GTEST_FLAG(name); \ @@ -2411,9 +2425,7 @@ using StringView = ::std::string_view; #define GTEST_INTERNAL_HAS_STRING_VIEW 0 #endif -#if (defined(__cpp_lib_three_way_comparison) || \ - (GTEST_INTERNAL_HAS_INCLUDE() && \ - GTEST_INTERNAL_CPLUSPLUS_LANG >= 201907L)) +#if defined(__cpp_lib_three_way_comparison) #define GTEST_INTERNAL_HAS_COMPARE_LIB 1 #else #define GTEST_INTERNAL_HAS_COMPARE_LIB 0 diff --git a/deps/googletest/src/gtest-internal-inl.h b/deps/googletest/src/gtest-internal-inl.h index 2ebfcd39ef56..4bebca1bc656 100644 --- a/deps/googletest/src/gtest-internal-inl.h +++ b/deps/googletest/src/gtest-internal-inl.h @@ -587,7 +587,7 @@ class GTEST_API_ UnitTestImpl { // total_test_suite_count() - 1. If i is not in that range, returns NULL. const TestSuite* GetTestSuite(int i) const { const int index = GetElementOr(test_suite_indices_, i, -1); - return index < 0 ? nullptr : test_suites_[static_cast(i)]; + return index < 0 ? nullptr : test_suites_[static_cast(index)]; } // Legacy API is deprecated but still available @@ -1106,7 +1106,7 @@ class StreamingListener : public EmptyTestEventListener { GTEST_CHECK_(sockfd_ != -1) << "Send() can be called only when there is a connection."; - const auto len = static_cast(message.length()); + const size_t len = message.length(); if (write(sockfd_, message.c_str(), len) != static_cast(len)) { GTEST_LOG_(WARNING) << "stream_result_to: failed to stream to " << host_name_ << ":" << port_num_; diff --git a/deps/googletest/src/gtest-port.cc b/deps/googletest/src/gtest-port.cc index d34a693e4500..433586f3b711 100644 --- a/deps/googletest/src/gtest-port.cc +++ b/deps/googletest/src/gtest-port.cc @@ -1069,7 +1069,7 @@ GTestLog::~GTestLog() { // Disable Microsoft deprecation warnings for POSIX functions called from // this class (creat, dup, dup2, and close) -GTEST_DISABLE_MSC_DEPRECATED_PUSH_() +GTEST_DISABLE_DEPRECATED_PUSH_() namespace { @@ -1095,10 +1095,12 @@ class CapturedStream { 0, // Generate unique file name. temp_file_path); GTEST_CHECK_(success != 0) - << "Unable to create a temporary file in " << temp_dir_path; + << "Failed to create temporary file in " << temp_dir_path + << " with error " << ::GetLastError(); const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE); GTEST_CHECK_(captured_fd != -1) - << "Unable to open temporary file " << temp_file_path; + << "Failed to open temporary file " << temp_file_path << " with error " + << ::GetLastError(); filename_ = temp_file_path; #else // There's no guarantee that a test has write access to the current @@ -1200,7 +1202,7 @@ class CapturedStream { CapturedStream& operator=(const CapturedStream&) = delete; }; -GTEST_DISABLE_MSC_DEPRECATED_POP_() +GTEST_DISABLE_DEPRECATED_POP_() static CapturedStream* g_captured_stderr = nullptr; static CapturedStream* g_captured_stdout = nullptr; diff --git a/deps/googletest/src/gtest.cc b/deps/googletest/src/gtest.cc index ac90786a091b..307ecc6f0b9c 100644 --- a/deps/googletest/src/gtest.cc +++ b/deps/googletest/src/gtest.cc @@ -1209,7 +1209,7 @@ int UnitTestImpl::test_to_run_count() const { // trace but Bar() and CurrentOsStackTraceExceptTop() won't. std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) { return os_stack_trace_getter()->CurrentStackTrace( - static_cast(GTEST_FLAG_GET(stack_trace_depth)), skip_count + 1 + GTEST_FLAG_GET(stack_trace_depth), skip_count + 1 // Skips the user-specified number of frames plus this function // itself. ); // NOLINT @@ -2700,7 +2700,7 @@ Result HandleSehExceptionsInMethodIfSupported(T* object, Result (T::*method)(), } // Runs the given method and catches and reports C++ and/or SEH-style -// exceptions, if they are supported; returns the 0-value for type +// exceptions, if they are supported; returns the default-value for type // Result in case of an SEH exception. template Result HandleExceptionsInMethodIfSupported(T* object, Result (T::*method)(), @@ -2748,7 +2748,7 @@ Result HandleExceptionsInMethodIfSupported(T* object, Result (T::*method)(), TestPartResult::kFatalFailure, FormatCxxExceptionMessage(nullptr, location)); } - return static_cast(0); + return Result(); #else return HandleSehExceptionsInMethodIfSupported(object, method, location); #endif // GTEST_HAS_EXCEPTIONS @@ -4239,8 +4239,7 @@ void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream, for (;;) { const char* const next_segment = strstr(segment, "]]>"); if (next_segment != nullptr) { - stream->write(segment, - static_cast(next_segment - segment)); + stream->write(segment, next_segment - segment); *stream << "]]>]]>"); } else { @@ -5172,9 +5171,12 @@ class ScopedPrematureExitFile { // create the file with a single "0" character in it. I/O // errors are ignored as there's nothing better we can do and we // don't want to fail the test because of this. - FILE* pfile = posix::FOpen(premature_exit_filepath_.c_str(), "w"); - fwrite("0", 1, 1, pfile); - fclose(pfile); + if (FILE* pfile = posix::FOpen(premature_exit_filepath_.c_str(), "w")) { + fwrite("0", 1, 1, pfile); + fclose(pfile); + } else { + premature_exit_filepath_.clear(); + } } } @@ -5192,7 +5194,7 @@ class ScopedPrematureExitFile { } private: - const std::string premature_exit_filepath_; + std::string premature_exit_filepath_; ScopedPrematureExitFile(const ScopedPrematureExitFile&) = delete; ScopedPrematureExitFile& operator=(const ScopedPrematureExitFile&) = delete; @@ -6732,6 +6734,12 @@ static const char kColorEncodedHelpMessage[] = "recreate_environments_when_repeating@D\n" " Sets up and tears down the global test environment on each repeat\n" " of the test.\n" + " @G--" GTEST_FLAG_PREFIX_ + "fail_fast@D\n" + " Stop running tests after the first failure.\n" + " @G--" GTEST_FLAG_PREFIX_ + "fail_if_no_test_linked@D\n" + " Fail if no test is linked into the test program.\n" "\n" "Test Output:\n" " @G--" GTEST_FLAG_PREFIX_ @@ -6744,6 +6752,9 @@ static const char kColorEncodedHelpMessage[] = "print_time=0@D\n" " Don't print the elapsed time of each test.\n" " @G--" GTEST_FLAG_PREFIX_ + "print_utf8=0@D\n" + " Don't print UTF-8 characters as text.\n" + " @G--" GTEST_FLAG_PREFIX_ "output=@Y(@Gjson@Y|@Gxml@Y)[@G:@YDIRECTORY_PATH@G" GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n" " Generate a JSON or XML report in the given directory or with the " @@ -6760,6 +6771,9 @@ static const char kColorEncodedHelpMessage[] = " @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n" " Set the default death test style.\n" + " @G--" GTEST_FLAG_PREFIX_ + "death_test_use_fork@D\n" + " Use fork() instead of clone() to spawn death test child processes.\n" #endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS " @G--" GTEST_FLAG_PREFIX_ "break_on_failure@D\n" @@ -6772,6 +6786,9 @@ static const char kColorEncodedHelpMessage[] = "catch_exceptions=0@D\n" " Do not report exceptions as test failures. Instead, allow them\n" " to crash the program or throw a pop-up (on Windows).\n" + " @G--" GTEST_FLAG_PREFIX_ + "stack_trace_depth=@Y[NUMBER]@D\n" + " Maximum number of stack frames to print when an assertion fails.\n" "\n" "Except for @G--" GTEST_FLAG_PREFIX_ "list_tests@D, you can alternatively set " diff --git a/deps/histogram/include/hdr/hdr_histogram_version.h b/deps/histogram/include/hdr/hdr_histogram_version.h index ad6a118f5a77..922f8fcfcda1 100644 --- a/deps/histogram/include/hdr/hdr_histogram_version.h +++ b/deps/histogram/include/hdr/hdr_histogram_version.h @@ -7,6 +7,6 @@ #ifndef HDR_HISTOGRAM_VERSION_H #define HDR_HISTOGRAM_VERSION_H -#define HDR_HISTOGRAM_VERSION "0.11.9" +#define HDR_HISTOGRAM_VERSION "0.11.10" #endif // HDR_HISTOGRAM_VERSION_H diff --git a/deps/histogram/src/hdr_histogram.c b/deps/histogram/src/hdr_histogram.c index c620045cb174..a34de2c1b213 100644 --- a/deps/histogram/src/hdr_histogram.c +++ b/deps/histogram/src/hdr_histogram.c @@ -23,6 +23,25 @@ #include HDR_MALLOC_INCLUDE +/* Prefetch hint for upcoming write access */ +#if defined(__GNUC__) || defined(__clang__) +# define HDR_PREFETCH_WRITE(addr) __builtin_prefetch((addr), 1, 3) +# define HDR_LIKELY(x) __builtin_expect(!!(x), 1) +# define HDR_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +# define HDR_PREFETCH_WRITE(addr) ((void)(addr)) +# define HDR_LIKELY(x) (x) +# define HDR_UNLIKELY(x) (x) +#endif + +/* Runtime-dispatched AVX2 path: keep the rest of this TU at the project's + baseline ISA so the shipped binary does not silently require AVX2. */ +#if (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)) \ + && (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER) && !defined(_MSC_VER) +# define HDR_HAS_AVX2_DISPATCH 1 +# include +#endif + /* ###### ####### ## ## ## ## ######## ###### */ /* ## ## ## ## ## ## ### ## ## ## ## */ /* ## ## ## ## ## #### ## ## ## */ @@ -67,24 +86,48 @@ static int64_t counts_get_normalised(const struct hdr_histogram* h, int32_t inde static void counts_inc_normalised( struct hdr_histogram* h, int32_t index, int64_t value) { - int32_t normalised_index = normalize_index(h, index); - h->counts[normalised_index] += value; + if (HDR_LIKELY(h->normalizing_index_offset == 0)) + { + HDR_PREFETCH_WRITE(&h->counts[index]); + h->counts[index] += value; + } + else + { + int32_t normalised_index = normalize_index(h, index); + HDR_PREFETCH_WRITE(&h->counts[normalised_index]); + h->counts[normalised_index] += value; + } h->total_count += value; } static void counts_inc_normalised_atomic( struct hdr_histogram* h, int32_t index, int64_t value) { - int32_t normalised_index = normalize_index(h, index); - - hdr_atomic_add_fetch_64(&h->counts[normalised_index], value); + if (HDR_LIKELY(h->normalizing_index_offset == 0)) + { + HDR_PREFETCH_WRITE(&h->counts[index]); + hdr_atomic_add_fetch_64(&h->counts[index], value); + } + else + { + int32_t normalised_index = normalize_index(h, index); + HDR_PREFETCH_WRITE(&h->counts[normalised_index]); + hdr_atomic_add_fetch_64(&h->counts[normalised_index], value); + } hdr_atomic_add_fetch_64(&h->total_count, value); } static void update_min_max(struct hdr_histogram* h, int64_t value) { - h->min_value = (value < h->min_value && value != 0) ? value : h->min_value; - h->max_value = (value > h->max_value) ? value : h->max_value; + if (HDR_UNLIKELY(value > h->max_value)) + { + h->max_value = value; + } + + if (HDR_UNLIKELY(value != 0 && value < h->min_value)) + { + h->min_value = value; + } } static void update_min_max_atomic(struct hdr_histogram* h, int64_t value) @@ -498,7 +541,7 @@ bool hdr_record_values(struct hdr_histogram* h, int64_t value, int64_t count) } counts_index = counts_index_for(h, value); - if (counts_index < 0 || h->counts_len <= counts_index) + if ((uint32_t)counts_index >= (uint32_t)h->counts_len) { return false; } @@ -520,7 +563,7 @@ bool hdr_record_values_atomic(struct hdr_histogram* h, int64_t value, int64_t co counts_index = counts_index_for(h, value); - if (counts_index < 0 || h->counts_len <= counts_index) + if ((uint32_t)counts_index >= (uint32_t)h->counts_len) { return false; } @@ -665,22 +708,65 @@ int64_t hdr_min(const struct hdr_histogram* h) return non_zero_min(h); } -static int64_t get_value_from_idx_up_to_count(const struct hdr_histogram* h, int64_t count_at_percentile) +static int64_t get_value_from_idx_up_to_count_scalar( + const struct hdr_histogram* h, int64_t count_at_percentile) { int64_t count_to_idx = 0; - - count_at_percentile = 0 < count_at_percentile ? count_at_percentile : 1; - for (int32_t idx = 0; idx < h->counts_len; idx++) - { + for (int32_t idx = 0; idx < h->counts_len; idx++) { count_to_idx += h->counts[idx]; if (count_to_idx >= count_at_percentile) - { return hdr_value_at_index(h, idx); - } } + return 0; +} +#ifdef HDR_HAS_AVX2_DISPATCH +__attribute__((target("avx2"))) +static int64_t get_value_from_idx_up_to_count_avx2( + const struct hdr_histogram* h, int64_t count_at_percentile) +{ + int64_t running = 0; + int32_t idx = 0; + const int32_t limit = h->counts_len & ~3; + + for (; idx < limit; idx += 4) { + __m256i v = _mm256_loadu_si256((const __m256i*)&h->counts[idx]); + __m128i lo = _mm256_castsi256_si128(v); + __m128i hi = _mm256_extracti128_si256(v, 1); + __m128i s = _mm_add_epi64(lo, hi); + /* Lanes are non-negative counts whose total fits in int64_t (total_count + invariant), so the chunk sum cannot overflow under valid state. Use + unsigned add to avoid signed-overflow UB if invariants are violated. */ + int64_t chunk = (int64_t)((uint64_t)_mm_extract_epi64(s, 0) + + (uint64_t)_mm_extract_epi64(s, 1)); + + if (__builtin_expect(running + chunk >= count_at_percentile, 0)) { + for (int32_t j = idx; j < idx + 4; j++) { + running += h->counts[j]; + if (running >= count_at_percentile) + return hdr_value_at_index(h, j); + } + } + running += chunk; + } + for (; idx < h->counts_len; idx++) { + running += h->counts[idx]; + if (running >= count_at_percentile) + return hdr_value_at_index(h, idx); + } return 0; } +#endif + +static int64_t get_value_from_idx_up_to_count(const struct hdr_histogram* h, int64_t count_at_percentile) +{ + count_at_percentile = count_at_percentile > 0 ? count_at_percentile : 1; +#ifdef HDR_HAS_AVX2_DISPATCH + if (__builtin_cpu_supports("avx2")) + return get_value_from_idx_up_to_count_avx2(h, count_at_percentile); +#endif + return get_value_from_idx_up_to_count_scalar(h, count_at_percentile); +} int64_t hdr_value_at_percentile(const struct hdr_histogram* h, double percentile) diff --git a/deps/icu-small/source/data/in/icudt78l.dat.bz2 b/deps/icu-small/source/data/in/icudt78l.dat.bz2 index 100dcc6f6776..7ee362b0bb17 100644 Binary files a/deps/icu-small/source/data/in/icudt78l.dat.bz2 and b/deps/icu-small/source/data/in/icudt78l.dat.bz2 differ diff --git a/deps/minimatch/index.js b/deps/minimatch/index.js index c30673985f9b..20d639b3119e 100644 --- a/deps/minimatch/index.js +++ b/deps/minimatch/index.js @@ -1,7 +1,11 @@ "use strict"; var __getOwnPropNames = Object.getOwnPropertyNames; var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; + try { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; + } catch (e) { + throw mod = 0, e; + } }; // node_modules/balanced-match/dist/commonjs/index.js @@ -71,7 +75,7 @@ var require_commonjs2 = __commonJS({ "node_modules/brace-expansion/dist/commonjs/index.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.EXPANSION_MAX = void 0; + exports2.EXPANSION_MAX_LENGTH = exports2.EXPANSION_MAX = void 0; exports2.expand = expand; var balanced_match_1 = require_commonjs(); var escSlash = "\0SLASH" + Math.random() + "\0"; @@ -90,6 +94,7 @@ var require_commonjs2 = __commonJS({ var commaPattern = /\\,/g; var periodPattern = /\\\./g; exports2.EXPANSION_MAX = 1e5; + exports2.EXPANSION_MAX_LENGTH = 4e6; function numeric(str) { return !isNaN(str) ? parseInt(str, 10) : str.charCodeAt(0); } @@ -124,11 +129,11 @@ var require_commonjs2 = __commonJS({ if (!str) { return []; } - const { max = exports2.EXPANSION_MAX } = options; + const { max = exports2.EXPANSION_MAX, maxLength = exports2.EXPANSION_MAX_LENGTH } = options; if (str.slice(0, 2) === "{}") { str = "\\{\\}" + str.slice(2); } - return expand_(escapeBraces(str), max, true).map(unescapeBraces); + return expand_(escapeBraces(str), max, maxLength, true).map(unescapeBraces); } function embrace(str) { return "{" + str + "}"; @@ -142,19 +147,88 @@ var require_commonjs2 = __commonJS({ function gte(i, y) { return i >= y; } - function expand_(str, max, isTop) { - const expansions = []; - const m = (0, balanced_match_1.balanced)("{", "}", str); - if (!m) - return [str]; - const pre = m.pre; - const post = m.post.length ? expand_(m.post, max, false) : [""]; - if (/\$$/.test(m.pre)) { - for (let k = 0; k < post.length && k < max; k++) { - const expansion = pre + "{" + m.body + "}" + post[k]; - expansions.push(expansion); + function combine(acc, pre, values, max, maxLength, dropEmpties) { + const out = []; + let length = 0; + for (let a = 0; a < acc.length; a++) { + for (let v = 0; v < values.length; v++) { + if (out.length >= max) + return out; + const expansion = acc[a] + pre + values[v]; + if (dropEmpties && !expansion) + continue; + if (length + expansion.length > maxLength) + return out; + out.push(expansion); + length += expansion.length; + } + } + return out; + } + function expandSequence(body, isAlphaSequence, max, maxLength) { + const n = body.split(/\.\./); + const N = []; + if (n[0] === void 0 || n[1] === void 0) { + return N; + } + const x = numeric(n[0]); + const y = numeric(n[1]); + const width = Math.max(n[0].length, n[1].length); + let incr = n.length === 3 && n[2] !== void 0 ? Math.max(Math.abs(numeric(n[2])), 1) : 1; + let test = lte; + const reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + const pad = n.some(isPadded); + let length = 0; + for (let i = x; test(i, y) && N.length < max; i += incr) { + let c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === "\\") { + c = ""; + } + } else { + c = String(i); + if (pad) { + const need = width - c.length; + if (need > 0) { + const z = new Array(need + 1).join("0"); + if (i < 0) { + c = "-" + z + c.slice(1); + } else { + c = z + c; + } + } + } + } + if (length + c.length > maxLength) + break; + N.push(c); + length += c.length; + } + return N; + } + function expand_(str, max, maxLength, isTop) { + let acc = [""]; + let dropEmpties = false; + let firstGroup = true; + for (; ; ) { + const m = (0, balanced_match_1.balanced)("{", "}", str); + if (!m) { + return combine(acc, str, [""], max, maxLength, dropEmpties); + } + const pre = m.pre; + if (/\$$/.test(pre)) { + acc = combine(acc, pre + "{" + m.body + "}", [""], max, maxLength, dropEmpties && !m.post.length); + firstGroup = false; + if (!m.post.length) + break; + str = m.post; + continue; } - } else { const isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); const isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); const isSequence = isNumericSequence || isAlphaSequence; @@ -162,75 +236,58 @@ var require_commonjs2 = __commonJS({ if (!isSequence && !isOptions) { if (m.post.match(/,(?!,).*\}/)) { str = m.pre + "{" + m.body + escClose + m.post; - return expand_(str, max, true); + isTop = true; + continue; } - return [str]; + return combine(acc, pre + "{" + m.body + "}" + m.post, [""], max, maxLength, dropEmpties); } - let n; + if (firstGroup) { + dropEmpties = isTop && !isSequence; + firstGroup = false; + } + let values; if (isSequence) { - n = m.body.split(/\.\./); + values = expandSequence(m.body, isAlphaSequence, max, maxLength); } else { - n = parseCommaParts(m.body); + let n = parseCommaParts(m.body); if (n.length === 1 && n[0] !== void 0) { - n = expand_(n[0], max, false).map(embrace); + n = expand_(n[0], max, maxLength, false).map(embrace); if (n.length === 1) { - return post.map((p) => m.pre + n[0] + p); + acc = combine(acc, pre + n[0], [""], max, maxLength, dropEmpties && !m.post.length); + if (!m.post.length) + break; + str = m.post; + continue; } } - } - let N; - if (isSequence && n[0] !== void 0 && n[1] !== void 0) { - const x = numeric(n[0]); - const y = numeric(n[1]); - const width = Math.max(n[0].length, n[1].length); - let incr = n.length === 3 && n[2] !== void 0 ? Math.max(Math.abs(numeric(n[2])), 1) : 1; - let test = lte; - const reverse = y < x; - if (reverse) { - incr *= -1; - test = gte; - } - const pad = n.some(isPadded); - N = []; - for (let i = x; test(i, y); i += incr) { - let c; - if (isAlphaSequence) { - c = String.fromCharCode(i); - if (c === "\\") { - c = ""; - } - } else { - c = String(i); - if (pad) { - const need = width - c.length; - if (need > 0) { - const z = new Array(need + 1).join("0"); - if (i < 0) { - c = "-" + z + c.slice(1); - } else { - c = z + c; - } - } - } + let dropsEmpties = dropEmpties && !m.post.length && !pre; + for (let d = 0; dropsEmpties && d < acc.length; d++) { + if (acc[d]) { + dropsEmpties = false; } - N.push(c); - } - } else { - N = []; - for (let j = 0; j < n.length; j++) { - N.push.apply(N, expand_(n[j], max, false)); } - } - for (let j = 0; j < N.length; j++) { - for (let k = 0; k < post.length && expansions.length < max; k++) { - const expansion = pre + N[j] + post[k]; - if (!isTop || isSequence || expansion) { - expansions.push(expansion); + values = []; + let valuesLength = 0; + outer: for (let j = 0; j < n.length; j++) { + const expanded = expand_(n[j], max, maxLength, false); + for (let k = 0; k < expanded.length; k++) { + const v = expanded[k]; + if (dropsEmpties && !v) + continue; + if (values.length >= max || valuesLength + v.length > maxLength) { + break outer; + } + values.push(v); + valuesLength += v.length; } } } + acc = combine(acc, pre, values, max, maxLength, dropEmpties && !m.post.length); + if (!m.post.length) + break; + str = m.post; } - return expansions; + return acc; } } }); diff --git a/deps/minimatch/package-lock.json b/deps/minimatch/package-lock.json index 78a7acf719f6..e6e1e10f65b1 100644 --- a/deps/minimatch/package-lock.json +++ b/deps/minimatch/package-lock.json @@ -1,26 +1,26 @@ { "name": "minimatch", - "version": "10.2.5", + "version": "10.2.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "minimatch", - "version": "10.2.5", + "version": "10.2.6", "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "devDependencies": { - "@types/node": "^25.5.0", - "esbuild": "^0.28.0", + "@types/node": "^26.1.2", + "esbuild": "^0.28.1", "mkdirp": "^3.0.1", - "oxlint": "^1.57.0", - "oxlint-tsgolint": "^0.18.1", - "prettier": "^3.8.1", - "tap": "^21.6.2", - "tshy": "^4.0.0", - "typedoc": "^0.28.18" + "oxlint": "^1.76.0", + "oxlint-tsgolint": "^7.0.2001", + "prettier": "^3.9.6", + "tap": "^21.7.5", + "tshy": "^4.1.3", + "typedoc": "^0.28.20" }, "engines": { "node": "18 || 20 || >=22" @@ -74,9 +74,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", - "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", "cpu": [ "ppc64" ], @@ -91,9 +91,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", - "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "cpu": [ "arm" ], @@ -108,9 +108,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", - "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], @@ -125,9 +125,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", - "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "cpu": [ "x64" ], @@ -142,9 +142,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", - "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], @@ -159,9 +159,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", - "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], @@ -176,9 +176,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", - "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "cpu": [ "arm64" ], @@ -193,9 +193,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", - "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ "x64" ], @@ -210,9 +210,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", - "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ "arm" ], @@ -227,9 +227,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", - "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], @@ -244,9 +244,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", - "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ "ia32" ], @@ -261,9 +261,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", - "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ "loong64" ], @@ -278,9 +278,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", - "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ "mips64el" ], @@ -295,9 +295,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", - "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ "ppc64" ], @@ -312,9 +312,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", - "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], @@ -329,9 +329,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", - "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "cpu": [ "s390x" ], @@ -346,9 +346,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", - "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "cpu": [ "x64" ], @@ -363,9 +363,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", - "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "cpu": [ "arm64" ], @@ -380,9 +380,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", - "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], @@ -397,9 +397,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", - "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", "cpu": [ "arm64" ], @@ -414,9 +414,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", - "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "cpu": [ "x64" ], @@ -431,9 +431,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", - "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ "arm64" ], @@ -448,9 +448,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", - "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "cpu": [ "x64" ], @@ -465,9 +465,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", - "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "cpu": [ "arm64" ], @@ -482,9 +482,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", - "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "cpu": [ "ia32" ], @@ -499,9 +499,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", - "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "cpu": [ "x64" ], @@ -627,9 +627,9 @@ } }, "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, "license": "MIT", "engines": { @@ -665,9 +665,9 @@ } }, "node_modules/@npmcli/agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", - "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.2.tgz", + "integrity": "sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==", "dev": true, "license": "ISC", "dependencies": { @@ -801,9 +801,9 @@ } }, "node_modules/@oxlint-tsgolint/darwin-arm64": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.18.1.tgz", - "integrity": "sha512-CxSd15ZwHn70UJFTXVvy76bZ9zwI097cVyjvUFmYRJwvkQF3VnrTf2oe1gomUacErksvtqLgn9OKvZhLMYwvog==", + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-7.0.2001.tgz", + "integrity": "sha512-CUJEdbSZ54+Xy9OXqOhWLTKZKV0BBiV7C2i/ygyVmXtkUNXx5YCzN8DpSSshTAKktoL7S+tnQ/ftFG/i7X896w==", "cpu": [ "arm64" ], @@ -815,9 +815,9 @@ ] }, "node_modules/@oxlint-tsgolint/darwin-x64": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.18.1.tgz", - "integrity": "sha512-LE7VW/T/VcKhl3Z1ev5BusrxdlQ3DWweSeOB+qpBeur2h8+vCWq+M7tCO29C7lveBDfx1+rNwj4aiUVlA+Qs+g==", + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-7.0.2001.tgz", + "integrity": "sha512-pXfBb5BqONCcgrXQNUZWXgiYmRSWJzd97S8i41VVOh6ut0tyo+cJ5FKFpczDHxiVNfj/3e7c9B4MtztNdpIVCw==", "cpu": [ "x64" ], @@ -829,9 +829,9 @@ ] }, "node_modules/@oxlint-tsgolint/linux-arm64": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.18.1.tgz", - "integrity": "sha512-2AG8YIXVJJbnM0rcsJmzzWOjZXBu5REwowgUpbHZueF7OYM3wR7Xu8pXEpAojEHAtYYZ3X4rpPoetomkJx7kCw==", + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-7.0.2001.tgz", + "integrity": "sha512-roP7zujb/QDPzDwEKsFFpzNHHy91/Y7oX9vQXk78ekyZtcQj1QXDIMH33gjDdHBfRl4K9pZ36xhRgrP4Zr+R8A==", "cpu": [ "arm64" ], @@ -843,9 +843,9 @@ ] }, "node_modules/@oxlint-tsgolint/linux-x64": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-0.18.1.tgz", - "integrity": "sha512-f8vDYPEdiwpA2JaDEkadTXfuqIgweQ8zcL4SX75EN2kkW2oAynjN7cd8m86uXDgB0JrcyOywbRtwnXdiIzXn2A==", + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-7.0.2001.tgz", + "integrity": "sha512-UDezNqdECVmngu2TPnjaS1YoAmcTaBoI5lV9vk3VahBxoi+I5r9k3iJTT7qZoYWOXTD/7T7bNcwRgrocR6BscQ==", "cpu": [ "x64" ], @@ -857,9 +857,9 @@ ] }, "node_modules/@oxlint-tsgolint/win32-arm64": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.18.1.tgz", - "integrity": "sha512-fBdML05KMDAL9ebWeoHIzkyI86Eq6r9YH5UDRuXJ9vAIo1EnKo0ti7hLUxNdc2dy2FF/T4k98p5wkkXvLyXqfA==", + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-7.0.2001.tgz", + "integrity": "sha512-uJZhqB6pdXLuN+AD1F5082byyQti/NPmJA77GtcFlmT2HzRelqbNls3SaIqxpjdFgvSBF9g0yOKGBkGFg7kX8Q==", "cpu": [ "arm64" ], @@ -871,9 +871,9 @@ ] }, "node_modules/@oxlint-tsgolint/win32-x64": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-0.18.1.tgz", - "integrity": "sha512-cYZMhNrsq9ZZ3OUWHyawqiS+c8HfieYG0zuZP2LbEuWWPfdZM/22iAlo608J+27G1s9RXQhvgX6VekwWbXbD7A==", + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-7.0.2001.tgz", + "integrity": "sha512-FkDRm8hx9OwzGQqyWG1tO5QrTLRApff9DzSgpz9QZau37BR8d1VYKOxMLGf6shPZntJFoTwIIJYT68VndYDCog==", "cpu": [ "x64" ], @@ -885,9 +885,9 @@ ] }, "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.58.0.tgz", - "integrity": "sha512-1T7UN3SsWWxpWyWGn1cT3ASNJOo+pI3eUkmEl7HgtowapcV8kslYpFQcYn431VuxghXakPNlbjRwhqmR37PFOg==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.76.0.tgz", + "integrity": "sha512-ZHIE5Zt9AsPDcY4nOlofXt0YfneEeo+QrKMPcPzLf2Z6Q8VtV2W73d7SFJ920WUwyik783u/doKCs3KXdwG+7w==", "cpu": [ "arm" ], @@ -902,9 +902,9 @@ } }, "node_modules/@oxlint/binding-android-arm64": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.58.0.tgz", - "integrity": "sha512-GryzujxuiRv2YFF7bRy8mKcxlbuAN+euVUtGJt9KKbLT8JBUIosamVhcthLh+VEr6KE6cjeVMAQxKAzJcoN7dg==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.76.0.tgz", + "integrity": "sha512-shm/ngQilHK6bs+ElJWa4oHfNj5vL1Gl/iVEJldTQjpr0/67oSgr0KUpbmcnLig5Fo0v/l6j2567A7TOL89ONA==", "cpu": [ "arm64" ], @@ -919,9 +919,9 @@ } }, "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.58.0.tgz", - "integrity": "sha512-7/bRSJIwl4GxeZL9rPZ11anNTyUO9epZrfEJH/ZMla3+/gbQ6xZixh9nOhsZ0QwsTW7/5J2A/fHbD1udC5DQQA==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.76.0.tgz", + "integrity": "sha512-rvJmrAPKSQ9aWJ6wIS6CK2tJjwzfW0ApQH9qokq6sfDvmHwoyIHxHFMq7z7i7GiV6fdE6s8qvBqWKPTu8RmT6Q==", "cpu": [ "arm64" ], @@ -936,9 +936,9 @@ } }, "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.58.0.tgz", - "integrity": "sha512-EqdtJSiHweS2vfILNrpyJ6HUwpEq2g7+4Zx1FPi4hu3Hu7tC3znF6ufbXO8Ub2LD4mGgznjI7kSdku9NDD1Mkg==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.76.0.tgz", + "integrity": "sha512-U/zYdb7VYKGY6pA9Vd2rYl9O/HlCylcOlb5PGPvVLtg+oLGsk6H3XGKEMHKyqD3nmmtmlmwb/8SwU2vfSAtvMw==", "cpu": [ "x64" ], @@ -953,9 +953,9 @@ } }, "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.58.0.tgz", - "integrity": "sha512-VQt5TH4M42mY20F545G637RKxV/yjwVtKk2vfXuazfReSIiuvWBnv+FVSvIV5fKVTJNjt3GSJibh6JecbhGdBw==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.76.0.tgz", + "integrity": "sha512-WvKG9CAriuo0XNiFzpXjDngUZcRGFNpaK2kLyMUsnJlShxkT96u+BpJQ3KqdQwGOrvI14L6V8bAwXwAYNNY6Jg==", "cpu": [ "x64" ], @@ -970,9 +970,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.58.0.tgz", - "integrity": "sha512-fBYcj4ucwpAtjJT3oeBdFBYKvNyjRSK+cyuvBOTQjh0jvKp4yeA4S/D0IsCHus/VPaNG5L48qQkh+Vjy3HL2/Q==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.76.0.tgz", + "integrity": "sha512-qJ5+RH99TqFRq3UCDxkW0zJJu9c+OAHFY72vGlxZLEpuO+MpKo3POgqb8sYipL9KYm8XY6ofb0HsOuvY6hQNqQ==", "cpu": [ "arm" ], @@ -987,9 +987,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.58.0.tgz", - "integrity": "sha512-0BeuFfwlUHlJ1xpEdSD1YO3vByEFGPg36uLjK1JgFaxFb4W6w17F8ET8sz5cheZ4+x5f2xzdnRrrWv83E3Yd8g==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.76.0.tgz", + "integrity": "sha512-PvPCVptkgVARsucgIqFQQcSmJ6xc6GtnVB5bRBekRahTc9eObMtjHfMjy5M+C2tHt5UCMttWM9RuSk/H9NqYeg==", "cpu": [ "arm" ], @@ -1004,9 +1004,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.58.0.tgz", - "integrity": "sha512-TXlZgnPTlxrQzxG9ZXU7BNwx1Ilrr17P3GwZY0If2EzrinqRH3zXPc3HrRcBJgcsoZNMuNL5YivtkJYgp467UQ==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.76.0.tgz", + "integrity": "sha512-3KeFDx8Bu4HPAXbuHZOr/oHvN+QT+JQhMw/NYPz7Z071xLSsG27Jfh9PIQVEY7hk1I+jr43ExqRIeJ6VKk2yLw==", "cpu": [ "arm64" ], @@ -1024,9 +1024,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.58.0.tgz", - "integrity": "sha512-zSoYRo5dxHLcUx93Stl2hW3hSNjPt99O70eRVWt5A1zwJ+FPjeCCANCD2a9R4JbHsdcl11TIQOjyigcRVOH2mw==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.76.0.tgz", + "integrity": "sha512-oPFkkKTgl0K/EIg9fQ8oA3IGcI05/Mq1en04iFa41mmNPT+6KEiByVazTOZZJiHMBBrbsns1YJ2e1Scqwzesjw==", "cpu": [ "arm64" ], @@ -1044,9 +1044,9 @@ } }, "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.58.0.tgz", - "integrity": "sha512-NQ0U/lqxH2/VxBYeAIvMNUK1y0a1bJ3ZicqkF2c6wfakbEciP9jvIE4yNzCFpZaqeIeRYaV7AVGqEO1yrfVPjA==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.76.0.tgz", + "integrity": "sha512-gN7yZ0eqflA5Fhf1wvHxGUltIV3FsvmB1zhNMDEK9vSHhc7E6qg9CuPeBgPZab66Tjzq6w6kHAtNEvnTHf4cyw==", "cpu": [ "ppc64" ], @@ -1064,9 +1064,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.58.0.tgz", - "integrity": "sha512-X9J+kr3gIC9FT8GuZt0ekzpNUtkBVzMVU4KiKDSlocyQuEgi3gBbXYN8UkQiV77FTusLDPsovjo95YedHr+3yg==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.76.0.tgz", + "integrity": "sha512-S/HqMbn22mQrjtErUxEoS/a55u8kIeXvreIxiJu5G7Le3UecEd6SQZxrDIpuhtgaFnsY/nVra3ytP+pRljDilA==", "cpu": [ "riscv64" ], @@ -1084,9 +1084,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.58.0.tgz", - "integrity": "sha512-CDze3pi1OO3Wvb/QsXjmLEY4XPKGM6kIo82ssNOgmcl1IdndF9VSGAE38YLhADWmOac7fjqhBw82LozuUVxD0Q==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.76.0.tgz", + "integrity": "sha512-ZIga3097VJZolGZk6SrIAUokIGfRkxRlhiHDUznZptGBfwrhD7pNfD1rzEzsCwvk/1DX0A1bLz+liuNh5QKIVQ==", "cpu": [ "riscv64" ], @@ -1104,9 +1104,9 @@ } }, "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.58.0.tgz", - "integrity": "sha512-b/89glbxFaEAcA6Uf1FvCNecBJEgcUTsV1quzrqXM/o4R1M4u+2KCVuyGCayN2UpsRWtGGLb+Ver0tBBpxaPog==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.76.0.tgz", + "integrity": "sha512-ZGiiA7pFzMJSyMWYZTVlPgbTsx+Vl8ihLGMIujPwaslUF7kIPPWAbVmAlTc+9lWDV+DCiB8Ikixu+lSHeOIIWQ==", "cpu": [ "s390x" ], @@ -1124,9 +1124,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.58.0.tgz", - "integrity": "sha512-0/yYpkq9VJFCEcuRlrViGj8pJUFFvNS4EkEREaN7CB1EcLXJIaVSSa5eCihwBGXtOZxhnblWgxks9juRdNQI7w==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.76.0.tgz", + "integrity": "sha512-JLiy5WuvEBFTT6ErIFV35SLzi0R7Iri6MKU6dZbTxfIx8pndbbPs3Mj780nMipBFcPkti+okAPOJ9POKkHFEgg==", "cpu": [ "x64" ], @@ -1144,9 +1144,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.58.0.tgz", - "integrity": "sha512-hr6FNvmcAXiH+JxSvaJ4SJ1HofkdqEElXICW9sm3/Rd5eC3t7kzvmLyRAB3NngKO2wzXRCAm4Z/mGWfrsS4X8w==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.76.0.tgz", + "integrity": "sha512-z7lgKQtbo/I1NIe8G5NHLesxJDv0tRSUWTpXKb9Pm3E9nKFKfO4IOSDtFroKgXtOYb0jQbcdH+0wzTyMXVes+A==", "cpu": [ "x64" ], @@ -1164,9 +1164,9 @@ } }, "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.58.0.tgz", - "integrity": "sha512-R+O368VXgRql1K6Xar+FEo7NEwfo13EibPMoTv3sesYQedRXd6m30Dh/7lZMxnrQVFfeo4EOfYIP4FpcgWQNHg==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.76.0.tgz", + "integrity": "sha512-JOjKymIpb9QcYfEhZsN6h4V9Ivd474W38cNIBRv6bg2TbIvogbMTH0Mg6YWW9TiRDqfcX+/Hyfsbo5vcSE5guQ==", "cpu": [ "arm64" ], @@ -1181,9 +1181,9 @@ } }, "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.58.0.tgz", - "integrity": "sha512-Q0FZiAY/3c4YRj4z3h9K1PgaByrifrfbBoODSeX7gy97UtB7pySPUQfC2B/GbxWU6k7CzQrRy5gME10PltLAFQ==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.76.0.tgz", + "integrity": "sha512-pqDWZiwcmByWUEm1NFUBNiT6aentCcaoMWJv0HbXEmuYermJ4sg8ppVrshubYP2MZ6SHccJJcpr6x469PuDFIw==", "cpu": [ "arm64" ], @@ -1198,9 +1198,9 @@ } }, "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.58.0.tgz", - "integrity": "sha512-Y8FKBABrSPp9H0QkRLHDHOSUgM/309a3IvOVgPcVxYcX70wxJrk608CuTg7w+C6vEd724X5wJoNkBcGYfH7nNQ==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.76.0.tgz", + "integrity": "sha512-Ba0O659kgMv6pwO3z9PdO+K3aMxQRaw9HnG+e6AtOfgwcKFvYilciQYBoUBmxfQvOCKZe1SwjMkuB542NkuDMQ==", "cpu": [ "ia32" ], @@ -1215,9 +1215,9 @@ } }, "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.58.0.tgz", - "integrity": "sha512-bCn5rbiz5My+Bj7M09sDcnqW0QJyINRVxdZ65x1/Y2tGrMwherwK/lpk+HRQCKvXa8pcaQdF5KY5j54VGZLwNg==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.76.0.tgz", + "integrity": "sha512-5qcirPHO8nKfkoowEVWtpAoVTcYDy6g0UT0NGic450Qv8J2NrOqg4uQ8QppRP4MDTC7Xx47lbZnmadTH03CGGA==", "cpu": [ "x64" ], @@ -1231,17 +1231,6 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@shikijs/engine-oniguruma": { "version": "3.23.0", "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", @@ -1305,9 +1294,9 @@ } }, "node_modules/@sigstore/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.2.0.tgz", - "integrity": "sha512-kxHrDQ9YgfrWUSXU0cjsQGv8JykOFZQ9ErNKbFPWzk3Hgpwu8x2hHrQ9IdA8yl+j9RTLTC3sAF3Tdq1IQCP4oA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.2.1.tgz", + "integrity": "sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1315,9 +1304,9 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.0.tgz", - "integrity": "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.1.tgz", + "integrity": "sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1357,14 +1346,14 @@ } }, "node_modules/@sigstore/verify": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.0.tgz", - "integrity": "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.1.tgz", + "integrity": "sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.1.0", + "@sigstore/core": "^3.2.1", "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { @@ -1372,9 +1361,9 @@ } }, "node_modules/@tapjs/after": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-3.3.4.tgz", - "integrity": "sha512-Y8DL0F9Ux6Swe7b5g4qLFgJUEFrVr5fhmVOENw4D/x7rDRyx/3c86Ya1p9iJrpkE2RnvdGq9AxR/rTM137Y7Lg==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-3.3.11.tgz", + "integrity": "sha512-XDH51tKb/ngVM6432O5RB5txRDYKtl4kafv/xi/QZOJeVjDJi+M8ukJnzpBVNs7fGI+k3jqF7pKA/OvIIkDtsg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1384,13 +1373,13 @@ "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/after-each": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-4.3.4.tgz", - "integrity": "sha512-TM1OWz7Ht3aimbT/MLYnoywI9SBGsTus6TQ+94n1yjr1izO3K21PP5Q9UYdqZ2Qq1WiZmGa+CZKUZANUn1ZcvQ==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-4.3.11.tgz", + "integrity": "sha512-j7Hm7/tzO9JnjJ7lqFNpyoKFUqsAYgn5Dw+ecJrPyTb/L+ybSFL6qD/k1eCw+mfVsNizzYc5FDMQ5u0FDDkvmg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1400,19 +1389,19 @@ "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/asserts": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-4.3.4.tgz", - "integrity": "sha512-1kf2q0oQ7LCZKy5l4Oe7/ZVijhJ9YxbS4qmqGtj7cYwOw4Q78KNLwthh14c9EBbI2QHKUDS2LaLM8a1qMLmPiA==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-4.3.11.tgz", + "integrity": "sha512-qhe2TPhqr4MJhoLJxv5AWCaJ8qQ2M5fiSuIlPT0S1fBdl06jwZHgAaqw2AlG0TJou1prXZWqeEkdrOGzEUzxCQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/stack": "4.3.0", + "@tapjs/stack": "4.3.3", "is-actual-promise": "^1.0.1", - "tcompare": "9.3.0", + "tcompare": "9.3.2", "trivial-deferred": "^2.0.0" }, "engines": { @@ -1422,13 +1411,13 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/before": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-4.3.4.tgz", - "integrity": "sha512-53n/8/RktPkbCuZveDTYiplbrzWjFkYAnmYCrFixESsFoUrkfTCPjeCRmojBS14zuRdVe4kLsX6XWYkaUpLdZA==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-4.3.11.tgz", + "integrity": "sha512-fsWbO7X4goZSZo9ahDhS8gJh6W9j5qdTaIVqv+HoqN6QhhzuvZ4hwWi3QLEibpt1ZmW86qWQ9zt5QAcsO+kBSA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1438,13 +1427,13 @@ "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/before-each": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-4.3.4.tgz", - "integrity": "sha512-WkLsDvCjBrxrRkyhEBpfmGObUsf8Eb+tsqlxnGUG67XbPMkwkP/AoUPonc/g1Nv+pwtR+t5j6maNblrubWuG3A==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-4.3.11.tgz", + "integrity": "sha512-T44rC2+ycj1KC/VVMcFnBosTJq4ne8ixEV0T1lJOXZbseXRp8VlGKNCPAjJV6Vb88xxuAwf9ZouXnbzhPg/HCQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1454,35 +1443,35 @@ "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/chdir": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@tapjs/chdir/-/chdir-3.3.4.tgz", - "integrity": "sha512-B37eGrs47xseJ7dm9ikhStX7KNqflvZViT2lMqVACeNvoxSpRgy1pu7cPix4wKvBlZCtNYaOD8iDNm+5nDfvSQ==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@tapjs/chdir/-/chdir-3.3.11.tgz", + "integrity": "sha512-k4bidoiZg90WWTs6KIOt2skdAcQ3DXExmeoj1OAyE89AlcUBCsRAbzdNmsLP5DHgh9pFYs/hnCBdcOPN4Hm75A==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/config": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-5.5.2.tgz", - "integrity": "sha512-GQyKl40fGamoSvT4SsfQfZyaHT8fboNW5OhrA1hhMc34di5j/efiD15VlNVbPGE51BZSs5M3Jw7YukF2/Cg8CA==", + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-5.6.5.tgz", + "integrity": "sha512-gcHH7IVr+rnhs0PpQZT1fPlG0fMRQgnzYjYyKO+Rg7Aq4HChNmFizVu+BE0K/EDlgELGGG2xRtuw9IHSBczQjg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/core": "4.5.2", - "@tapjs/test": "4.4.2", + "@tapjs/core": "4.5.9", + "@tapjs/test": "4.4.9", "chalk": "^5.6.2", "jackspeak": "^4.2.3", "polite-json": "^5.0.0", - "tap-yaml": "4.3.0", + "tap-yaml": "4.4.2", "walk-up-path": "^4.0.0" }, "engines": { @@ -1492,28 +1481,28 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.5.2", - "@tapjs/test": "4.4.2" + "@tapjs/core": "4.5.9", + "@tapjs/test": "4.4.9" } }, "node_modules/@tapjs/core": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-4.5.2.tgz", - "integrity": "sha512-0KKabYyBN4W2CRgnD0rOhDvexbMLMPuT0OElQTz5ezCsx1QGtuUHP9TmRXEGCJAoeL44Us0L2DxPpS4BUW1KEQ==", + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-4.5.9.tgz", + "integrity": "sha512-Zy6Zk+UFD6HvtgWHJyEZPMbKXIVrNTbTmCzld9fvubpZkUWRQGl7fM5I0PscbPXoetLJDkFROOkbEuxIld0LmA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/processinfo": "^3.1.9", - "@tapjs/stack": "4.3.0", - "@tapjs/test": "4.4.2", + "@tapjs/processinfo": "^3.1.12", + "@tapjs/stack": "4.3.3", + "@tapjs/test": "4.4.9", "async-hook-domain": "^4.0.1", "diff": "^8.0.2", "is-actual-promise": "^1.0.1", "minipass": "^7.0.4", "signal-exit": "4.1", - "tap-parser": "18.3.0", - "tap-yaml": "4.3.0", - "tcompare": "9.3.0", + "tap-parser": "18.3.4", + "tap-yaml": "4.4.2", + "tcompare": "9.3.2", "trivial-deferred": "^2.0.0" }, "engines": { @@ -1521,9 +1510,9 @@ } }, "node_modules/@tapjs/error-serdes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tapjs/error-serdes/-/error-serdes-4.3.0.tgz", - "integrity": "sha512-qP266uvPm2G95ClPFpqAN6n4nicLbHrZYbZWl0UO+biOdmvjSSuxeY5f7YFygTl+UuzlyxjlRgHTq8qifnqTcw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tapjs/error-serdes/-/error-serdes-4.3.2.tgz", + "integrity": "sha512-NNJTvozk0rY4Vhf94SECEYSO38/eQvbZvZSrmzrmD2cj5YYx7l+7qQC0fcgYpIzwlA31kciesbhnV8rINiKejg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1537,9 +1526,9 @@ } }, "node_modules/@tapjs/filter": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-4.3.4.tgz", - "integrity": "sha512-Bpbahk/Bv30ZfGoDpZVjGhvg8Cq2yqCZcawd+4qtTTSDY+V7GEpdJGu2/2EvwXP+s4PklPx2kFry8X9m6OtAog==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-4.3.11.tgz", + "integrity": "sha512-K7Pg1d3MsNlqbR3e3Q56D+umGKYE8pJmv6rjPchlyXtPrmEuge21vyUeDaxaY1n4yxUfyN10CY4W/FruQs/EfQ==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -1549,13 +1538,13 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/fixture": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-4.3.4.tgz", - "integrity": "sha512-zRv1vD2H/2abt0S5Yr5ICV/ZaIqXmusBZ6H4Qbih9oE2jvbs6AVDz5Td0adZbWurtHrPLuOFTIz2UsbJfhCCcw==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-4.3.11.tgz", + "integrity": "sha512-FjIep0t0uV59qFIizIu3cZOrEU5saVNurO7XJgJJuGUXUNaezmy8nOiRIrZvwIsXAAtbBbmoZ3V8FwImRydKIg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1569,35 +1558,35 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/intercept": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-4.3.4.tgz", - "integrity": "sha512-7ifEMPmp4yKHQ7PqdPwCetipFLvCegbIyKigEDds/p03ZNFJjgF06D9T4vc/m0sA5SKkPrHVTOU0UzaSrliP7w==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-4.3.11.tgz", + "integrity": "sha512-SXBmTR8R3/PhBfbfS3kZaltro2mYM02EB6TGvt2lrotB6kb2kdY67zEA/k2MmRFDk4Qt9c7CKg8SO2cO1FSIlA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/after": "3.3.4", - "@tapjs/stack": "4.3.0" + "@tapjs/after": "3.3.11", + "@tapjs/stack": "4.3.3" }, "engines": { "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/mock": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-4.4.2.tgz", - "integrity": "sha512-B6SfNWjWCPvjN9CaHe45lEcl2ZFDkQIUoF5jPthwi2mYxHLfyFFEqorZJhguoTs7ToeXvIqquqE/Luk9IeuKBQ==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-4.4.9.tgz", + "integrity": "sha512-Vz3sy5eGQLJMAcRaseHt+1vl9EQcBM7OWqQex1xZu12UbrwavWFYTjj9+trjHbg/XqB6FR1POx8MjftNb+233w==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/after": "3.3.4", - "@tapjs/stack": "4.3.0", + "@tapjs/after": "3.3.11", + "@tapjs/stack": "4.3.3", "resolve-import": "^2.4.0", "walk-up-path": "^4.0.0" }, @@ -1608,19 +1597,19 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/node-serialize": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-4.3.4.tgz", - "integrity": "sha512-SECDvjBS7NVCiCZ6vEtMwtxxSuR61NHBva+PlIQ1mU0asoTYxV9lpRNEAb9UHFKpquEDlk+bLg2iN01a2nfMuw==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-4.3.11.tgz", + "integrity": "sha512-vtL7vy+X1OzE8Z7UhgKeJHL+8QEE6n7f6Bw64ldnq19zx6DmRu66DcZmGQp9tWDTinLns0aucbT3G2AKSceHQg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/error-serdes": "4.3.0", - "@tapjs/stack": "4.3.0", - "tap-parser": "18.3.0" + "@tapjs/error-serdes": "4.3.2", + "@tapjs/stack": "4.3.3", + "tap-parser": "18.3.4" }, "engines": { "node": "20 || >=22" @@ -1629,13 +1618,13 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/processinfo": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@tapjs/processinfo/-/processinfo-3.1.9.tgz", - "integrity": "sha512-yIbYH9ROI5m5F2B5Hpk6t89OkHBrDbL3qncPO9OfPuSvJsvAIDG91I0hxGQNohdaxmqz5L4QiIYc5Y0KmtLzCQ==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@tapjs/processinfo/-/processinfo-3.1.12.tgz", + "integrity": "sha512-ZkYxCTEDL2ZEvvPHyZK1kvqm1t5mjRrwaGKRGFAhKh/qqaSSklk7fasqpX6fE4XLYpGf4J01C/sMztz+DkY0dg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1643,21 +1632,21 @@ "pirates": "^4.0.5", "process-on-spawn": "^1.0.0", "signal-exit": "^4.0.2", - "uuid": "^8.3.2" + "uuid": "^14.0.0" }, "engines": { "node": ">=16.17" } }, "node_modules/@tapjs/reporter": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-4.4.4.tgz", - "integrity": "sha512-svWmpJgMQxe4iiKOVr/Hi5kGHJNBDp2Nr8gD0aQuAQ4fp9gOh2LFQXa2Jv7LBKhMjC7UaiW/X7k1qEVk2nOfvg==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-4.4.11.tgz", + "integrity": "sha512-EuXSFILQKDKdIgJ4IBnKEocGPhPMX9BthKNhh3X9J70+sEF9rv5gy9JdhakA9+rOSTv1BIHQqK3cndBNwFTrAw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/config": "5.5.2", - "@tapjs/stack": "4.3.0", + "@tapjs/config": "5.6.5", + "@tapjs/stack": "4.3.3", "chalk": "^5.6.2", "ink": "^5.2.1", "minipass": "^7.0.4", @@ -1666,9 +1655,9 @@ "prismjs-terminal": "^1.2.3", "react": "^18.2.0", "string-length": "^6.0.0", - "tap-parser": "18.3.0", - "tap-yaml": "4.3.0", - "tcompare": "9.3.0" + "tap-parser": "18.3.4", + "tap-yaml": "4.4.2", + "tcompare": "9.3.2" }, "engines": { "node": "20 || >=22" @@ -1677,26 +1666,26 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/run": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-4.5.2.tgz", - "integrity": "sha512-Oq5YZvoGxEohRWK8P1wHPIAnudEOHPd/bIWawFtRn0ZGvF7bRduZlHpf4eEIrRHKY84G/I3fmC354604cejxiQ==", + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-4.5.9.tgz", + "integrity": "sha512-UGNDyb0NoEx2VSyBNNzAIEPE4qzN61pfnl6AVBffwnFeuPAKPEf9rS7q/LXnW2o8SD020c0bGtFZo57XnPcgoA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/which": "^7.0.4", - "@tapjs/after": "3.3.4", - "@tapjs/before": "4.3.4", - "@tapjs/config": "5.5.2", - "@tapjs/processinfo": "^3.1.9", - "@tapjs/reporter": "4.4.4", - "@tapjs/spawn": "4.3.4", - "@tapjs/stdin": "4.3.4", - "@tapjs/test": "4.4.2", - "c8": "^10.1.3", + "@tapjs/after": "3.3.11", + "@tapjs/before": "4.3.11", + "@tapjs/config": "5.6.5", + "@tapjs/processinfo": "^3.1.12", + "@tapjs/reporter": "4.4.11", + "@tapjs/spawn": "4.3.11", + "@tapjs/stdin": "4.3.11", + "@tapjs/test": "4.4.9", + "c8": "^12.0.0", "chalk": "^5.6.2", "chokidar": "^4.0.2", "foreground-child": "^4.0.0", @@ -1711,9 +1700,9 @@ "rimraf": "^6.0.0", "semver": "^7.7.2", "signal-exit": "^4.1.0", - "tap-parser": "18.3.0", - "tap-yaml": "4.3.0", - "tcompare": "9.3.0", + "tap-parser": "18.3.4", + "tap-yaml": "4.4.2", + "tcompare": "9.3.2", "trivial-deferred": "^2.0.0" }, "bin": { @@ -1726,18 +1715,18 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/snapshot": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-4.3.4.tgz", - "integrity": "sha512-2sJXaGLJUMakkdJd5iDWRucgyHX7f5eP05m4weqWq9dLzX7p1JFOrWXUwns8RCIY7VX9Vx+4jENlxJOywYjyqg==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-4.3.11.tgz", + "integrity": "sha512-2ZhUklyEkIaDHZPFQJ5aibw7eri08CQ8Q/UVKGedXyBHHIGDKX8HK0v4AGl8rru6KQfH3trNmvui9zhJkFhRtw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "is-actual-promise": "^1.0.1", - "tcompare": "9.3.0", + "tcompare": "9.3.2", "trivial-deferred": "^2.0.0" }, "engines": { @@ -1747,26 +1736,26 @@ "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/spawn": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-4.3.4.tgz", - "integrity": "sha512-qQY2SSLkXknpL1kndLS1bCPo9vYKV8Ka93UPIllvDEwaY3oUMghh++EOE4dyUxQPgMFpmoUoj8kSbm2hotevbQ==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-4.3.11.tgz", + "integrity": "sha512-Vqeg/F0gi39DvBDGhwI7lBuGcQ8hNQ614lu8o2aUTbx56lCFRM3su3QDScpaPPitf09gYO5jXuVA3y0Dn0En4Q==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/stack": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tapjs/stack/-/stack-4.3.0.tgz", - "integrity": "sha512-SFASe4YaVBzMr/FXTm/QsSzbzXZOmgDNpmY3EU0JNiDCN4izHMUnoXY+Kh0EY35hx9C4JDvRjgv2MSIM7bBygg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tapjs/stack/-/stack-4.3.3.tgz", + "integrity": "sha512-7T64b+OIyU0WitBzu8ksfwt+EvtSrh6aHYhQD0lImrDqxw2Jdwvd43F6sEFXiAA+sO/d0ERUn+OJW3zYNpygTg==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -1777,42 +1766,42 @@ } }, "node_modules/@tapjs/stdin": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-4.3.4.tgz", - "integrity": "sha512-0kFeaPEGwNWx8R0z9Uq93/CNhAg+9NbTPZW+GXsjuHQSG125g7VZBNBAg2IMeQmVQ9bUWa3+f5TNp/JnLVvJmg==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-4.3.11.tgz", + "integrity": "sha512-tfZ+eJSI+A0iYdhPMmeRrQJDwhVxOrbOczPhqSwDtoxs85E7BpjVAwM7Sid76f3EeIpk4Y6jENKbyyFGM4Q38w==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/test": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-4.4.2.tgz", - "integrity": "sha512-YuUgTffPNGzodjeHOsaF/j0/5B/bAqtfgwqUkqa3mWdwqzlmB2AcIA6lBtLaQfbjG8wgGNwYfs3McgxkGRqxfA==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-4.4.9.tgz", + "integrity": "sha512-vuzpclY8g3JHIjRkI50JiN+TTb56UP/ggbgdLc3vhs5vGprStt6LVE65e07750fLraX5K1SQvcexQqnC3hdBrw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7", - "@tapjs/after": "3.3.4", - "@tapjs/after-each": "4.3.4", - "@tapjs/asserts": "4.3.4", - "@tapjs/before": "4.3.4", - "@tapjs/before-each": "4.3.4", - "@tapjs/chdir": "3.3.4", - "@tapjs/filter": "4.3.4", - "@tapjs/fixture": "4.3.4", - "@tapjs/intercept": "4.3.4", - "@tapjs/mock": "4.4.2", - "@tapjs/node-serialize": "4.3.4", - "@tapjs/snapshot": "4.3.4", - "@tapjs/spawn": "4.3.4", - "@tapjs/stdin": "4.3.4", - "@tapjs/typescript": "3.5.4", - "@tapjs/worker": "4.3.4", + "@tapjs/after": "3.3.11", + "@tapjs/after-each": "4.3.11", + "@tapjs/asserts": "4.3.11", + "@tapjs/before": "4.3.11", + "@tapjs/before-each": "4.3.11", + "@tapjs/chdir": "3.3.11", + "@tapjs/filter": "4.3.11", + "@tapjs/fixture": "4.3.11", + "@tapjs/intercept": "4.3.11", + "@tapjs/mock": "4.4.9", + "@tapjs/node-serialize": "4.3.11", + "@tapjs/snapshot": "4.3.11", + "@tapjs/spawn": "4.3.11", + "@tapjs/stdin": "4.3.11", + "@tapjs/typescript": "3.5.11", + "@tapjs/worker": "4.3.11", "glob": "^13.0.2", "jackspeak": "^4.2.3", "mkdirp": "^3.0.0", @@ -1820,7 +1809,7 @@ "resolve-import": "^2.4.0", "rimraf": "^6.0.0", "sync-content": "^2.0.4", - "tap-parser": "18.3.0", + "tap-parser": "18.3.4", "tshy": "^3.3.2", "typescript": "5.9", "walk-up-path": "^4.0.0" @@ -1832,7 +1821,7 @@ "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/test/node_modules/tshy": { @@ -1878,9 +1867,9 @@ } }, "node_modules/@tapjs/typescript": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-3.5.4.tgz", - "integrity": "sha512-z8O10CpbPYoHA876Dlg40qXtM058akP76HNQy+EdNE+AhFo7kold4YBgyjYRU7WDWNlp2B/MPgsy/OZ4PRXQWw==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-3.5.11.tgz", + "integrity": "sha512-UwFbqItrjIy0vBuH08WSZ7B8sHhEE9JXiApqZqStMzve3MBzJTlT0tx16uUIrVR4TrTtGwafG5ZL7JfbSsctTw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1890,20 +1879,20 @@ "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tapjs/worker": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-4.3.4.tgz", - "integrity": "sha512-AvmfwMgJXB/eOwIti/rOvw1l1eHsxUex3lyrhiC6uK5iOmbHWBOFsGHwEfc7Z4eertPM6FUqnZxkxkTEVGueig==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-4.3.11.tgz", + "integrity": "sha512-ZbGBxmLEyTr/7IMOx+1LBOhXh2hDimqX/xR/dSw8IEaikIMPGn0OvXnKLUU9SpRrup0InZ2BTQTF1iy2xw1RVQ==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" }, "peerDependencies": { - "@tapjs/core": "4.5.2" + "@tapjs/core": "4.5.9" } }, "node_modules/@tsconfig/node14": { @@ -1959,9 +1948,9 @@ } }, "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", "dev": true, "license": "MIT", "dependencies": { @@ -1976,13 +1965,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.5.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.2.tgz", - "integrity": "sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==", + "version": "26.1.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz", + "integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.18.0" + "undici-types": "~8.3.0" } }, "node_modules/@types/unist": { @@ -1993,28 +1982,31 @@ "license": "MIT" }, "node_modules/@typescript/native-preview": { - "version": "7.0.0-dev.20260404.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20260404.1.tgz", - "integrity": "sha512-XiZ31gvwWDnMSriMglmYsua2cIw+RsZ0pdqhIJs8jh+l7rNav3LJ+DQUe2jJYkHE0+xFOwyTUtuYlrFHsBsujw==", + "version": "7.0.0-dev.20260707.2", + "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20260707.2.tgz", + "integrity": "sha512-oUGp+Rep/hqMhPunyinsALUwSlzHINSxitifPiSaeqoKOKD2OlR9NE3TaPqwsl4NlGslsOSUXI1JotWQzpYCPg==", "dev": true, "license": "Apache-2.0", "bin": { - "tsgo": "bin/tsgo.js" + "tsgo": "bin/tsgo" + }, + "engines": { + "node": ">=16.20.0" }, "optionalDependencies": { - "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260404.1", - "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260404.1", - "@typescript/native-preview-linux-arm": "7.0.0-dev.20260404.1", - "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260404.1", - "@typescript/native-preview-linux-x64": "7.0.0-dev.20260404.1", - "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260404.1", - "@typescript/native-preview-win32-x64": "7.0.0-dev.20260404.1" + "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260707.2", + "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260707.2", + "@typescript/native-preview-linux-arm": "7.0.0-dev.20260707.2", + "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260707.2", + "@typescript/native-preview-linux-x64": "7.0.0-dev.20260707.2", + "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260707.2", + "@typescript/native-preview-win32-x64": "7.0.0-dev.20260707.2" } }, "node_modules/@typescript/native-preview-darwin-arm64": { - "version": "7.0.0-dev.20260404.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20260404.1.tgz", - "integrity": "sha512-9pQFaF1SuYAfz81o87rtuuxWtVI3ws7lW1Rpc3TM1S4A1kV9BCePyeW1bA9fc4TUhRCsnFKElPWN36SnwAmMRg==", + "version": "7.0.0-dev.20260707.2", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20260707.2.tgz", + "integrity": "sha512-wny2pgKjGbiZtnOIHVa3tXC1UfDqxNEFzyPGmiqybedG8hipG2Nfp0l5UxbaKCjkLacUpH/W5bP2hBOMVhCOzg==", "cpu": [ "arm64" ], @@ -2023,12 +2015,15 @@ "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": ">=16.20.0" + } }, "node_modules/@typescript/native-preview-darwin-x64": { - "version": "7.0.0-dev.20260404.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20260404.1.tgz", - "integrity": "sha512-vS3+8FbgyyYlSq1wv5IGi5i3FIuoWet2BbQU3kfIhdVWN2d+Kcg75jrDVq6uSjbW4VFZDz2dBKAPi5YLinX2ig==", + "version": "7.0.0-dev.20260707.2", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20260707.2.tgz", + "integrity": "sha512-Afc7M5zOwo+GpfcYwz5Z8HMB2tPVsui7nNIqEuuFB73MPdVqNn/Wmpe4tP4MRri0AtJnJknoHBaTJ/VDAp/Jhw==", "cpu": [ "x64" ], @@ -2037,12 +2032,15 @@ "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": ">=16.20.0" + } }, "node_modules/@typescript/native-preview-linux-arm": { - "version": "7.0.0-dev.20260404.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20260404.1.tgz", - "integrity": "sha512-7w6NQBUibFWRmS6SSwrIMoMoPpiXmeAPxelgDsIcCf08RLvujB0cWp91r+qF7N03QV9NHDiQHwowINdoxWR9gQ==", + "version": "7.0.0-dev.20260707.2", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20260707.2.tgz", + "integrity": "sha512-hJm/UOqZTr9FHmR7uNm8VGX4oKtfWk0Jem0zPeJFNC8ckGUfSBueyiEYMZB+XmRc1aG4x1E46y3CplP4CLHvGQ==", "cpu": [ "arm" ], @@ -2051,12 +2049,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=16.20.0" + } }, "node_modules/@typescript/native-preview-linux-arm64": { - "version": "7.0.0-dev.20260404.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20260404.1.tgz", - "integrity": "sha512-CDjKhvTEsgSMP9/hr0NklVgzDhocGT7fALrgD9xHWbRwiYf+6hXZXIEcyvhJr7xvRdbrLF5zMHrY8/G7/mQLXA==", + "version": "7.0.0-dev.20260707.2", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20260707.2.tgz", + "integrity": "sha512-iITBa2WjjTI5N9t5l7Z4KoOSI+2zBlhbvFzsD/f8qX8QoKjz/Y4DPyBDgezYi8nkqjjksbgSOJ3/ykzhwrB9cg==", "cpu": [ "arm64" ], @@ -2065,12 +2066,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=16.20.0" + } }, "node_modules/@typescript/native-preview-linux-x64": { - "version": "7.0.0-dev.20260404.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20260404.1.tgz", - "integrity": "sha512-AIxWszfp8xzvBRq+iSE+YmlJQRUWP50Qrq1N6PeQeeBR9uXl/1i972vSDkiO0lrSalgypDh4lLtTXK5VBwMOKg==", + "version": "7.0.0-dev.20260707.2", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20260707.2.tgz", + "integrity": "sha512-du0dzi6y97Po5vDNdPJTyyijHCpaS22JLRnKZEJXBDaO9gCIymOv/5QQokFRuOlQm0bWl3i9PF4OVdGP6uAOQA==", "cpu": [ "x64" ], @@ -2079,12 +2083,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=16.20.0" + } }, "node_modules/@typescript/native-preview-win32-arm64": { - "version": "7.0.0-dev.20260404.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20260404.1.tgz", - "integrity": "sha512-AHD1xpkoAquap3Dcg7Mk1Bd1an7nw8ziPETgb1c/W80bVUGQ+Hzrhq8pLuU68LKR8Le2j5EkF/BYHI4VAztaKg==", + "version": "7.0.0-dev.20260707.2", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20260707.2.tgz", + "integrity": "sha512-SsAwfhyHJ1akgBc+99z4+hwdbHsdWaKB8EwCNIMA6JfSLMeUjffrYvxu+vfMyxVtOVOz7RrRXRoiDiu4a2sCtg==", "cpu": [ "arm64" ], @@ -2093,12 +2100,15 @@ "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=16.20.0" + } }, "node_modules/@typescript/native-preview-win32-x64": { - "version": "7.0.0-dev.20260404.1", - "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20260404.1.tgz", - "integrity": "sha512-G8yDp0kZOJbtClPhHe3RXywFVNkkQefAgbQI46bfNPrqfmflQia4fYHeIDVX2XEb0FKTmwaIGnhL1+BYT1f9AQ==", + "version": "7.0.0-dev.20260707.2", + "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20260707.2.tgz", + "integrity": "sha512-DL4u27stv0fo71sVhOzHSwE+YMZsbBijVI+kg5dLDLilSH79WFTJ8RSQ46vJrCMt+Gjlv/JOZP1PuLJDfioYeQ==", "cpu": [ "x64" ], @@ -2107,7 +2117,10 @@ "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=16.20.0" + } }, "node_modules/abbrev": { "version": "4.0.0", @@ -2120,9 +2133,9 @@ } }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "license": "MIT", "bin": { @@ -2244,21 +2257,21 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/c8": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.3.tgz", - "integrity": "sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-12.0.0.tgz", + "integrity": "sha512-4zpJvrd1nKWutnnKC2pXkFmb6iM1l+ffN//o1CzlTNwW7GSOs9a1xrLqkC48nU8oEkjmPZLPiwMsIaOvoF4Pqg==", "dev": true, "license": "ISC", "dependencies": { @@ -2269,16 +2282,16 @@ "istanbul-lib-coverage": "^3.2.0", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.1.6", - "test-exclude": "^7.0.1", + "test-exclude": "^8.0.0", "v8-to-istanbul": "^9.0.0", - "yargs": "^17.7.2", + "yargs": "^18.0.0", "yargs-parser": "^21.1.1" }, "bin": { "c8": "bin/c8.js" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.12.0 || >=23" }, "peerDependencies": { "monocart-coverage-reports": "^2" @@ -2431,107 +2444,18 @@ } }, "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "dev": true, "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=20" } }, "node_modules/code-excerpt": { @@ -2547,26 +2471,6 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2650,13 +2554,6 @@ "node": ">=0.3.1" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, "node_modules/emoji-regex": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", @@ -2701,20 +2598,21 @@ } }, "node_modules/es-toolkit": { - "version": "1.45.1", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.45.1.tgz", - "integrity": "sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==", + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz", + "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==", "dev": true, "license": "MIT", "workspaces": [ "docs", - "benchmarks" + "benchmarks", + "tests/types" ] }, "node_modules/esbuild": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", - "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2725,32 +2623,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.0", - "@esbuild/android-arm": "0.28.0", - "@esbuild/android-arm64": "0.28.0", - "@esbuild/android-x64": "0.28.0", - "@esbuild/darwin-arm64": "0.28.0", - "@esbuild/darwin-x64": "0.28.0", - "@esbuild/freebsd-arm64": "0.28.0", - "@esbuild/freebsd-x64": "0.28.0", - "@esbuild/linux-arm": "0.28.0", - "@esbuild/linux-arm64": "0.28.0", - "@esbuild/linux-ia32": "0.28.0", - "@esbuild/linux-loong64": "0.28.0", - "@esbuild/linux-mips64el": "0.28.0", - "@esbuild/linux-ppc64": "0.28.0", - "@esbuild/linux-riscv64": "0.28.0", - "@esbuild/linux-s390x": "0.28.0", - "@esbuild/linux-x64": "0.28.0", - "@esbuild/netbsd-arm64": "0.28.0", - "@esbuild/netbsd-x64": "0.28.0", - "@esbuild/openbsd-arm64": "0.28.0", - "@esbuild/openbsd-x64": "0.28.0", - "@esbuild/openharmony-arm64": "0.28.0", - "@esbuild/sunos-x64": "0.28.0", - "@esbuild/win32-arm64": "0.28.0", - "@esbuild/win32-ia32": "0.28.0", - "@esbuild/win32-x64": "0.28.0" + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" } }, "node_modules/escalade": { @@ -2893,9 +2791,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, "license": "MIT", "engines": { @@ -2941,9 +2839,9 @@ } }, "node_modules/hosted-git-info": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", - "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", + "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", "dev": true, "license": "ISC", "dependencies": { @@ -2996,9 +2894,9 @@ } }, "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "dev": true, "license": "MIT", "optional": true, @@ -3106,9 +3004,9 @@ "license": "ISC" }, "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz", + "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==", "dev": true, "license": "MIT", "engines": { @@ -3263,10 +3161,20 @@ "license": "MIT" }, "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" @@ -3302,9 +3210,9 @@ } }, "node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -3342,9 +3250,9 @@ "license": "ISC" }, "node_modules/make-fetch-happen": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.5.tgz", - "integrity": "sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg==", + "version": "15.0.6", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.6.tgz", + "integrity": "sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==", "dev": true, "license": "ISC", "dependencies": { @@ -3366,15 +3274,25 @@ } }, "node_modules/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", + "integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", + "entities": "^4.5.0", + "linkify-it": "^5.0.2", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" @@ -3384,9 +3302,9 @@ } }, "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz", + "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==", "dev": true, "license": "MIT" }, @@ -3401,13 +3319,13 @@ } }, "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -3583,21 +3501,21 @@ } }, "node_modules/node-gyp": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.2.0.tgz", - "integrity": "sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz", + "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", "dev": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^15.0.0", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "tar": "^7.5.4", "tinyglobby": "^0.2.12", + "undici": "^6.25.0", "which": "^6.0.0" }, "bin": { @@ -3759,9 +3677,9 @@ } }, "node_modules/oxlint": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.58.0.tgz", - "integrity": "sha512-t4s9leczDMqlvOSjnbCQe7gtoLkWgBGZ7sBdCJ9EOj5IXFSG/X7OAzK4yuH4iW+4cAYe8kLFbC8tuYMwWZm+Cg==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.76.0.tgz", + "integrity": "sha512-6QoFioEU4fNdiUx/2Eo6TRd6NG7H7njnRCz8rhB66cZmMHDTqcm1Rjvl8Wry+ZTQMBAmyb4Mlf62Mk5X+eHSOw==", "dev": true, "license": "MIT", "bin": { @@ -3774,51 +3692,55 @@ "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.58.0", - "@oxlint/binding-android-arm64": "1.58.0", - "@oxlint/binding-darwin-arm64": "1.58.0", - "@oxlint/binding-darwin-x64": "1.58.0", - "@oxlint/binding-freebsd-x64": "1.58.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.58.0", - "@oxlint/binding-linux-arm-musleabihf": "1.58.0", - "@oxlint/binding-linux-arm64-gnu": "1.58.0", - "@oxlint/binding-linux-arm64-musl": "1.58.0", - "@oxlint/binding-linux-ppc64-gnu": "1.58.0", - "@oxlint/binding-linux-riscv64-gnu": "1.58.0", - "@oxlint/binding-linux-riscv64-musl": "1.58.0", - "@oxlint/binding-linux-s390x-gnu": "1.58.0", - "@oxlint/binding-linux-x64-gnu": "1.58.0", - "@oxlint/binding-linux-x64-musl": "1.58.0", - "@oxlint/binding-openharmony-arm64": "1.58.0", - "@oxlint/binding-win32-arm64-msvc": "1.58.0", - "@oxlint/binding-win32-ia32-msvc": "1.58.0", - "@oxlint/binding-win32-x64-msvc": "1.58.0" + "@oxlint/binding-android-arm-eabi": "1.76.0", + "@oxlint/binding-android-arm64": "1.76.0", + "@oxlint/binding-darwin-arm64": "1.76.0", + "@oxlint/binding-darwin-x64": "1.76.0", + "@oxlint/binding-freebsd-x64": "1.76.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.76.0", + "@oxlint/binding-linux-arm-musleabihf": "1.76.0", + "@oxlint/binding-linux-arm64-gnu": "1.76.0", + "@oxlint/binding-linux-arm64-musl": "1.76.0", + "@oxlint/binding-linux-ppc64-gnu": "1.76.0", + "@oxlint/binding-linux-riscv64-gnu": "1.76.0", + "@oxlint/binding-linux-riscv64-musl": "1.76.0", + "@oxlint/binding-linux-s390x-gnu": "1.76.0", + "@oxlint/binding-linux-x64-gnu": "1.76.0", + "@oxlint/binding-linux-x64-musl": "1.76.0", + "@oxlint/binding-openharmony-arm64": "1.76.0", + "@oxlint/binding-win32-arm64-msvc": "1.76.0", + "@oxlint/binding-win32-ia32-msvc": "1.76.0", + "@oxlint/binding-win32-x64-msvc": "1.76.0" }, "peerDependencies": { - "oxlint-tsgolint": ">=0.18.0" + "oxlint-tsgolint": ">=7.0.2001", + "vite-plus": "*" }, "peerDependenciesMeta": { "oxlint-tsgolint": { "optional": true + }, + "vite-plus": { + "optional": true } } }, "node_modules/oxlint-tsgolint": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.18.1.tgz", - "integrity": "sha512-Hgb0wMfuXBYL0ddY+1hAG8IIfC40ADwPnBuUaC6ENAuCtTF4dHwsy7mCYtQ2e7LoGvfoSJRY0+kqQRiembJ/jQ==", + "version": "7.0.2001", + "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-7.0.2001.tgz", + "integrity": "sha512-KjK/XLcXr1DSyonKhsuFqJRiuKqcyG9j3LJ8nkOsrLzGvodBPqzHOKauy10asLMDI0sUpvb+1sxlzff3udZvfg==", "dev": true, "license": "MIT", "bin": { "tsgolint": "bin/tsgolint.js" }, "optionalDependencies": { - "@oxlint-tsgolint/darwin-arm64": "0.18.1", - "@oxlint-tsgolint/darwin-x64": "0.18.1", - "@oxlint-tsgolint/linux-arm64": "0.18.1", - "@oxlint-tsgolint/linux-x64": "0.18.1", - "@oxlint-tsgolint/win32-arm64": "0.18.1", - "@oxlint-tsgolint/win32-x64": "0.18.1" + "@oxlint-tsgolint/darwin-arm64": "7.0.2001", + "@oxlint-tsgolint/darwin-x64": "7.0.2001", + "@oxlint-tsgolint/linux-arm64": "7.0.2001", + "@oxlint-tsgolint/linux-x64": "7.0.2001", + "@oxlint-tsgolint/win32-arm64": "7.0.2001", + "@oxlint-tsgolint/win32-x64": "7.0.2001" } }, "node_modules/p-limit": { @@ -3854,9 +3776,9 @@ } }, "node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.6.tgz", + "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", "dev": true, "license": "MIT", "engines": { @@ -3874,9 +3796,9 @@ "license": "BlueOak-1.0.0" }, "node_modules/pacote": { - "version": "21.5.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.5.0.tgz", - "integrity": "sha512-VtZ0SB8mb5Tzw3dXDfVAIjhyVKUHZkS/ZH9/5mpKenwC9sFOXNI0JI7kEF7IMkwOnsWMFrvAZHzx1T5fmrp9FQ==", + "version": "21.5.1", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.5.1.tgz", + "integrity": "sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg==", "dev": true, "license": "ISC", "dependencies": { @@ -3953,9 +3875,9 @@ } }, "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", "engines": { @@ -3989,9 +3911,9 @@ } }, "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", "dev": true, "license": "MIT", "bin": { @@ -4154,16 +4076,6 @@ "dev": true, "license": "MIT" }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve-import": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/resolve-import/-/resolve-import-2.4.0.tgz", @@ -4244,9 +4156,9 @@ } }, "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -4293,18 +4205,18 @@ } }, "node_modules/sigstore": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.0.tgz", - "integrity": "sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.1.tgz", + "integrity": "sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w==", "dev": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.1.0", + "@sigstore/core": "^3.2.1", "@sigstore/protobuf-specs": "^0.5.0", - "@sigstore/sign": "^4.1.0", - "@sigstore/tuf": "^4.0.1", - "@sigstore/verify": "^3.1.0" + "@sigstore/sign": "^4.1.1", + "@sigstore/tuf": "^4.0.2", + "@sigstore/verify": "^3.1.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -4355,13 +4267,13 @@ } }, "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", + "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", "dev": true, "license": "MIT", "dependencies": { - "ip-address": "^10.0.1", + "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -4469,62 +4381,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-ansi": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", @@ -4541,30 +4397,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4601,31 +4433,31 @@ } }, "node_modules/tap": { - "version": "21.6.2", - "resolved": "https://registry.npmjs.org/tap/-/tap-21.6.2.tgz", - "integrity": "sha512-rEuxX+EVGQ6JOEyRnLQ80fa7v5s8yutpRA11LAjP6t/B6I0/mTWkaW0NfVoX5XDX3z5x9HVEt2dojSrJLcyp9A==", + "version": "21.7.5", + "resolved": "https://registry.npmjs.org/tap/-/tap-21.7.5.tgz", + "integrity": "sha512-vXO4peEW1N1G0x1iCUjrsRbgZ8lW9h7yrQV31KeFPxCeRUZa9vy1hWPSCKce5KJj2AvaCKDwZQjKNYRu+wA04w==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@tapjs/after": "3.3.4", - "@tapjs/after-each": "4.3.4", - "@tapjs/asserts": "4.3.4", - "@tapjs/before": "4.3.4", - "@tapjs/before-each": "4.3.4", - "@tapjs/chdir": "3.3.4", - "@tapjs/core": "4.5.2", - "@tapjs/filter": "4.3.4", - "@tapjs/fixture": "4.3.4", - "@tapjs/intercept": "4.3.4", - "@tapjs/mock": "4.4.2", - "@tapjs/node-serialize": "4.3.4", - "@tapjs/run": "4.5.2", - "@tapjs/snapshot": "4.3.4", - "@tapjs/spawn": "4.3.4", - "@tapjs/stdin": "4.3.4", - "@tapjs/test": "4.4.2", - "@tapjs/typescript": "3.5.4", - "@tapjs/worker": "4.3.4", + "@tapjs/after": "3.3.11", + "@tapjs/after-each": "4.3.11", + "@tapjs/asserts": "4.3.11", + "@tapjs/before": "4.3.11", + "@tapjs/before-each": "4.3.11", + "@tapjs/chdir": "3.3.11", + "@tapjs/core": "4.5.9", + "@tapjs/filter": "4.3.11", + "@tapjs/fixture": "4.3.11", + "@tapjs/intercept": "4.3.11", + "@tapjs/mock": "4.4.9", + "@tapjs/node-serialize": "4.3.11", + "@tapjs/run": "4.5.9", + "@tapjs/snapshot": "4.3.11", + "@tapjs/spawn": "4.3.11", + "@tapjs/stdin": "4.3.11", + "@tapjs/test": "4.4.9", + "@tapjs/typescript": "3.5.11", + "@tapjs/worker": "4.3.11", "resolve-import": "^2.4.0" }, "bin": { @@ -4639,14 +4471,14 @@ } }, "node_modules/tap-parser": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-18.3.0.tgz", - "integrity": "sha512-sa0M18e6RARfO0Lrm1zbQvb+7G4G/ThkFIJFvjeH1DKenl4xwyUgpRUCb5Jq64Xe086p4auiLvRzfpRjGd3Zow==", + "version": "18.3.4", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-18.3.4.tgz", + "integrity": "sha512-CiqzdpWn2CvONcWp7UNMF9/rCPJwCz0es+qykkgJruu1Y/rAS8A5MEQujmjx9NErfst3dGiZJU3lDS2jBsgbPA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "events-to-array": "^2.0.3", - "tap-yaml": "4.3.0" + "tap-yaml": "4.4.2" }, "bin": { "tap-parser": "bin/cmd.cjs" @@ -4656,13 +4488,13 @@ } }, "node_modules/tap-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-4.3.0.tgz", - "integrity": "sha512-48BiwXj3cUa1Lt6BLzfawJGZVihfRCY19gyjaHftQpe8ulEmB9gZW9kChQkdb0+L4YUlGWUJMpWRAJ/9bPSgVA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-4.4.2.tgz", + "integrity": "sha512-03mQI7QhfVZHJqGgFyxNTgUbgsG41ZzpWSb7k1Gangmf9hF71Jpb0Fczs7KtOdUDaHx+KxlPUdM2pQJaijebGA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "yaml": "^2.8.1", + "yaml": "^2.8.3", "yaml-types": "^0.4.0" }, "engines": { @@ -4670,9 +4502,9 @@ } }, "node_modules/tar": { - "version": "7.5.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", - "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -4687,9 +4519,9 @@ } }, "node_modules/tcompare": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-9.3.0.tgz", - "integrity": "sha512-6kFTU2xlXNFU88/DAAIQvjBu5znTGx8QPnFtaKiLin2OtspHXyevSu0iUTZt4UrSfuRC6fIahRCqaQIhXlsTVQ==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-9.3.2.tgz", + "integrity": "sha512-jSZmZPiMTBDZkV0Li/nNeOkCLtOViC/xgWdvzYheSU9RJt6F1EVUKZUJuH+QqN6tjVJrUXAeWpPNy+aLzfAjCQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -4701,202 +4533,29 @@ } }, "node_modules/test-exclude": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz", - "integrity": "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-8.0.0.tgz", + "integrity": "sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==", "dev": true, "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", + "glob": "^13.0.6", "minimatch": "^10.2.2" }, "engines": { - "node": ">=18" - } - }, - "node_modules/test-exclude/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/test-exclude/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/test-exclude/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/test-exclude/node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/glob/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/test-exclude/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/test-exclude/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": "20 || >=22" } }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -4916,9 +4575,9 @@ } }, "node_modules/tshy": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/tshy/-/tshy-4.1.0.tgz", - "integrity": "sha512-0aB7s1VIBSiMlEZIDJPG7NbDiLwqnp7zB7gMFt8ALV9HbtFDEC+Vv/+gjz2G/Eg1/lHxIlgwsPmuHRu542dGVw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tshy/-/tshy-4.1.3.tgz", + "integrity": "sha512-uEaLO1lFhu5X58KZxS5gKCabh+xd72MfXDOHhAIvnoreBAP1F4HNpbK2m0DUmrrzpcgxvXbsdXn1A0OaQxFYqw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -4972,17 +4631,17 @@ } }, "node_modules/typedoc": { - "version": "0.28.18", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.18.tgz", - "integrity": "sha512-NTWTUOFRQ9+SGKKTuWKUioUkjxNwtS3JDRPVKZAXGHZy2wCA8bdv2iJiyeePn0xkmK+TCCqZFT0X7+2+FLjngA==", + "version": "0.28.20", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.20.tgz", + "integrity": "sha512-uSKqkh8Cr48vllnEy+jdaAgOeR6Y+QCBW7usgUsKj7gJEfR7stw9U/fE49LBnj2tPRKPY0c0EBJSWe9Appmplg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@gerrit0/mini-shiki": "^3.23.0", "lunr": "^2.3.9", - "markdown-it": "^14.1.1", - "minimatch": "^10.2.4", - "yaml": "^2.8.2" + "markdown-it": "^14.3.0", + "minimatch": "^10.2.5", + "yaml": "^2.9.0" }, "bin": { "typedoc": "bin/typedoc" @@ -4996,9 +4655,9 @@ } }, "node_modules/typescript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", - "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5016,21 +4675,35 @@ "dev": true, "license": "MIT" }, + "node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", "dev": true, "license": "MIT" }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", + "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist-node/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { @@ -5136,100 +4809,10 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ws": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", - "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", "dev": true, "license": "MIT", "engines": { @@ -5269,9 +4852,9 @@ } }, "node_modules/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true, "license": "ISC", "bin": { @@ -5299,22 +4882,21 @@ } }, "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", + "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^8.2.1", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yargs-parser": { @@ -5327,59 +4909,31 @@ "node": ">=12" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=8" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/yargs/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "license": "ISC", "engines": { - "node": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yocto-queue": { diff --git a/deps/minimatch/package.json b/deps/minimatch/package.json index 92cf6a604773..c676ceb2fea6 100644 --- a/deps/minimatch/package.json +++ b/deps/minimatch/package.json @@ -2,7 +2,7 @@ "author": "Isaac Z. Schlueter (http://blog.izs.me)", "name": "minimatch", "description": "a glob matcher in javascript", - "version": "10.2.5", + "version": "10.2.6", "repository": { "type": "git", "url": "git@github.com:isaacs/minimatch" @@ -46,15 +46,15 @@ "node": "18 || 20 || >=22" }, "devDependencies": { - "@types/node": "^25.5.0", - "esbuild": "^0.28.0", + "@types/node": "^26.1.2", + "esbuild": "^0.28.1", "mkdirp": "^3.0.1", - "oxlint": "^1.57.0", - "oxlint-tsgolint": "^0.18.1", - "prettier": "^3.8.1", - "tap": "^21.6.2", - "tshy": "^4.0.0", - "typedoc": "^0.28.18" + "oxlint": "^1.76.0", + "oxlint-tsgolint": "^7.0.2001", + "prettier": "^3.9.6", + "tap": "^21.7.5", + "tshy": "^4.1.3", + "typedoc": "^0.28.20" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -70,6 +70,6 @@ "type": "module", "module": "./dist/esm/index.js", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" } } diff --git a/deps/ncrypto/engine.cc b/deps/ncrypto/engine.cc index 1845cfcca47a..a8e64e250491 100644 --- a/deps/ncrypto/engine.cc +++ b/deps/ncrypto/engine.cc @@ -1,12 +1,18 @@ #include "ncrypto.h" +#if !defined(OPENSSL_NO_ENGINE) && \ + ((defined(NCRYPTO_ENGINE_COMPAT) && NCRYPTO_ENGINE_COMPAT) || \ + NCRYPTO_USE_LEGACY_OPENSSL) +#include +#endif + namespace ncrypto { // ============================================================================ // Engine #ifndef OPENSSL_NO_ENGINE -EnginePointer::EnginePointer(ENGINE* engine_, bool finish_on_exit_) +EnginePointer::EnginePointer(void* engine_, bool finish_on_exit_) : engine(engine_), finish_on_exit(finish_on_exit_) {} EnginePointer::EnginePointer(EnginePointer&& other) noexcept @@ -24,21 +30,22 @@ EnginePointer& EnginePointer::operator=(EnginePointer&& other) noexcept { return *new (this) EnginePointer(std::move(other)); } -void EnginePointer::reset(ENGINE* engine_, bool finish_on_exit_) { +void EnginePointer::reset(void* engine_, bool finish_on_exit_) { if (engine != nullptr) { + ENGINE* current = static_cast(engine); if (finish_on_exit) { // This also does the equivalent of ENGINE_free. - ENGINE_finish(engine); + ENGINE_finish(current); } else { - ENGINE_free(engine); + ENGINE_free(current); } } engine = engine_; finish_on_exit = finish_on_exit_; } -ENGINE* EnginePointer::release() { - ENGINE* ret = engine; +void* EnginePointer::release() { + void* ret = engine; engine = nullptr; finish_on_exit = false; return ret; @@ -52,8 +59,9 @@ EnginePointer EnginePointer::getEngineByName(const char* name, // Engine not found, try loading dynamically. engine = EnginePointer(ENGINE_by_id("dynamic")); if (engine) { - if (!ENGINE_ctrl_cmd_string(engine.get(), "SO_PATH", name, 0) || - !ENGINE_ctrl_cmd_string(engine.get(), "LOAD", nullptr, 0)) { + ENGINE* current = static_cast(engine.engine); + if (!ENGINE_ctrl_cmd_string(current, "SO_PATH", name, 0) || + !ENGINE_ctrl_cmd_string(current, "LOAD", nullptr, 0)) { engine.reset(); } } @@ -64,19 +72,24 @@ EnginePointer EnginePointer::getEngineByName(const char* name, bool EnginePointer::setAsDefault(uint32_t flags, CryptoErrorList* errors) { if (engine == nullptr) return false; ClearErrorOnReturn clear_error_on_return(errors); - return ENGINE_set_default(engine, flags) != 0; + return ENGINE_set_default(static_cast(engine), flags) != 0; } bool EnginePointer::init(bool finish_on_exit) { if (engine == nullptr) return false; if (finish_on_exit) setFinishOnExit(); - return ENGINE_init(engine) == 1; + return ENGINE_init(static_cast(engine)) == 1; } EVPKeyPointer EnginePointer::loadPrivateKey(const char* key_name) { if (engine == nullptr) return EVPKeyPointer(); - return EVPKeyPointer( - ENGINE_load_private_key(engine, key_name, nullptr, nullptr)); + return EVPKeyPointer(ENGINE_load_private_key( + static_cast(engine), key_name, nullptr, nullptr)); +} + +bool EnginePointer::setClientCertEngine(SSL_CTX* ctx) { + if (engine == nullptr || ctx == nullptr) return false; + return SSL_CTX_set_client_cert_engine(ctx, static_cast(engine)) == 1; } void EnginePointer::initEnginesOnce() { diff --git a/deps/ncrypto/ncrypto.cc b/deps/ncrypto/ncrypto.cc index e2b9e46c1776..9802153f6d16 100644 --- a/deps/ncrypto/ncrypto.cc +++ b/deps/ncrypto/ncrypto.cc @@ -14,6 +14,7 @@ #endif #include #include +#include #include #include #if OPENSSL_VERSION_MAJOR >= 3 @@ -75,9 +76,227 @@ using BignumCtxPointer = DeleteFnPtr; using BignumGenCallbackPointer = DeleteFnPtr; using NetscapeSPKIPointer = DeleteFnPtr; +const EVP_CIPHER* GetCipherCtxCipher(const EVP_CIPHER_CTX* ctx) { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + return EVP_CIPHER_CTX_get0_cipher(ctx); +#else + return EVP_CIPHER_CTX_cipher(ctx); +#endif +} + +const EVP_MD* GetDigestCtxMd(const EVP_MD_CTX* ctx) { +#if NCRYPTO_USE_OPENSSL3_PROVIDER || NCRYPTO_USE_BORINGSSL + return EVP_MD_CTX_get0_md(ctx); +#else + return EVP_MD_CTX_md(ctx); +#endif +} + +#if NCRYPTO_USE_OPENSSL3_PROVIDER +using ASN1StringPointer = DeleteFnPtr; +using OSSLParamBldPointer = DeleteFnPtr; +using RsaPssParamsPointer = DeleteFnPtr; +using X509AlgorPointer = DeleteFnPtr; +using X509PubkeyPointer = DeleteFnPtr; +struct OSSLParamDeleter { + void operator()(OSSL_PARAM* params) const { + if (params == nullptr) return; + for (OSSL_PARAM* param = params; param->key != nullptr; param++) { + if (param->data != nullptr && param->data_type != OSSL_PARAM_UTF8_PTR && + param->data_type != OSSL_PARAM_OCTET_PTR) { + OPENSSL_cleanse(param->data, param->data_size); + } + } + OSSL_PARAM_free(params); + } +}; +using OSSLParamPointer = std::unique_ptr; +struct OpenSSLBufferDeleter { + void operator()(unsigned char* pointer) const { OPENSSL_free(pointer); } +}; +using OpenSSLBufferPointer = + std::unique_ptr; +#endif + static constexpr int kX509NameFlagsRFC2253WithinUtf8JSON = XN_FLAG_RFC2253 & ~ASN1_STRFLGS_ESC_MSB & ~ASN1_STRFLGS_ESC_CTRL; +#if NCRYPTO_USE_OPENSSL3_PROVIDER +template +bool GetPKeyBnParam(const EVP_PKEY* pkey, const char* name, Pointer* out) { + BIGNUM* bn = nullptr; + if (pkey == nullptr) return false; + if (EVP_PKEY_get_bn_param(pkey, name, &bn) == 1) { + out->reset(bn); + return true; + } + + size_t len = 0; + if (EVP_PKEY_get_octet_string_param(pkey, name, nullptr, 0, &len) != 1) { + return false; + } + auto data = DataPointer::Alloc(len); + if (!data || + EVP_PKEY_get_octet_string_param(pkey, + name, + static_cast(data.get()), + data.size(), + &len) != 1) { + return false; + } + bn = BN_bin2bn(static_cast(data.get()), len, nullptr); + if (bn == nullptr) return false; + out->reset(bn); + return true; +} + +template +bool GetOptionalPKeyBnParam(const EVP_PKEY* pkey, + const char* name, + Pointer* out) { + BIGNUM* bn = nullptr; + if (pkey == nullptr) { + out->reset(); + return true; + } + if (EVP_PKEY_get_bn_param(pkey, name, &bn) == 1) { + out->reset(bn); + return true; + } + + size_t len = 0; + if (EVP_PKEY_get_octet_string_param(pkey, name, nullptr, 0, &len) == 1) { + auto data = DataPointer::Alloc(len); + if (!data || + EVP_PKEY_get_octet_string_param(pkey, + name, + static_cast(data.get()), + data.size(), + &len) != 1) { + return false; + } + bn = BN_bin2bn(static_cast(data.get()), len, nullptr); + if (bn == nullptr) return false; + out->reset(bn); + return true; + } + + out->reset(); + return true; +} + +EVPKeyPointer NewPKeyFromData(int id, int selection, OSSL_PARAM* params) { + auto ctx = EVPKeyCtxPointer::NewFromID(id); + if (!ctx || EVP_PKEY_fromdata_init(ctx.get()) != 1) return {}; + + EVP_PKEY* pkey = nullptr; + if (EVP_PKEY_fromdata(ctx.get(), &pkey, selection, params) != 1) { + return {}; + } + return EVPKeyPointer(pkey); +} + +EVPKeyPointer NewDhPKey(const BIGNUM* p, + const BIGNUM* g, + const BIGNUM* pub = nullptr, + const BIGNUM* priv = nullptr) { + if (p == nullptr || g == nullptr) return {}; + + OSSLParamBldPointer bld(OSSL_PARAM_BLD_new()); + if (!bld || + OSSL_PARAM_BLD_push_BN(bld.get(), OSSL_PKEY_PARAM_FFC_P, p) != 1 || + OSSL_PARAM_BLD_push_BN(bld.get(), OSSL_PKEY_PARAM_FFC_G, g) != 1) { + return {}; + } + + int selection = EVP_PKEY_KEY_PARAMETERS; + if (pub != nullptr) { + if (OSSL_PARAM_BLD_push_BN(bld.get(), OSSL_PKEY_PARAM_PUB_KEY, pub) != 1) { + return {}; + } + selection |= EVP_PKEY_PUBLIC_KEY; + } + if (priv != nullptr) { + if (OSSL_PARAM_BLD_push_BN(bld.get(), OSSL_PKEY_PARAM_PRIV_KEY, priv) != + 1) { + return {}; + } + selection |= EVP_PKEY_PRIVATE_KEY; + } + + OSSLParamPointer params(OSSL_PARAM_BLD_to_param(bld.get())); + if (!params) return {}; + return NewPKeyFromData(EVP_PKEY_DH, selection, params.get()); +} + +EVPKeyPointer NewDhPKey(const char* group_name, + const BIGNUM* pub = nullptr, + const BIGNUM* priv = nullptr) { + if (group_name == nullptr) return {}; + + if (pub == nullptr && priv == nullptr) { + EVPKeyCtxPointer ctx(EVP_PKEY_CTX_new_from_name(nullptr, "DH", nullptr)); + OSSL_PARAM params[] = { + OSSL_PARAM_construct_utf8_string( + OSSL_PKEY_PARAM_GROUP_NAME, const_cast(group_name), 0), + OSSL_PARAM_END, + }; + if (!ctx || !ctx.initForParamgen() || + EVP_PKEY_CTX_set_params(ctx.get(), params) != 1) { + return {}; + } + return ctx.paramgen(); + } + + OSSLParamBldPointer bld(OSSL_PARAM_BLD_new()); + if (!bld || OSSL_PARAM_BLD_push_utf8_string( + bld.get(), OSSL_PKEY_PARAM_GROUP_NAME, group_name, 0) != 1) { + return {}; + } + + int selection = EVP_PKEY_KEY_PARAMETERS; + if (pub != nullptr) { + if (OSSL_PARAM_BLD_push_BN(bld.get(), OSSL_PKEY_PARAM_PUB_KEY, pub) != 1) { + return {}; + } + selection |= EVP_PKEY_PUBLIC_KEY; + } + if (priv != nullptr) { + if (OSSL_PARAM_BLD_push_BN(bld.get(), OSSL_PKEY_PARAM_PRIV_KEY, priv) != + 1) { + return {}; + } + selection |= EVP_PKEY_PRIVATE_KEY; + } + + OSSLParamPointer params(OSSL_PARAM_BLD_to_param(bld.get())); + if (!params) return {}; + return NewPKeyFromData(EVP_PKEY_DH, selection, params.get()); +} + +bool GetDhParams(const EVP_PKEY* pkey, + DeleteFnPtr* p, + DeleteFnPtr* g, + DeleteFnPtr* q = nullptr, + DeleteFnPtr* j = nullptr) { + return GetPKeyBnParam(pkey, OSSL_PKEY_PARAM_FFC_P, p) && + GetPKeyBnParam(pkey, OSSL_PKEY_PARAM_FFC_G, g) && + (q == nullptr || + GetOptionalPKeyBnParam(pkey, OSSL_PKEY_PARAM_FFC_Q, q)) && + (j == nullptr || + GetOptionalPKeyBnParam(pkey, OSSL_PKEY_PARAM_FFC_COFACTOR, j)); +} + +bool GetDhKeys(const EVP_PKEY* pkey, + DeleteFnPtr* pub, + DeleteFnPtr* priv) { + return (pub == nullptr || + GetOptionalPKeyBnParam(pkey, OSSL_PKEY_PARAM_PUB_KEY, pub)) && + (priv == nullptr || + GetOptionalPKeyBnParam(pkey, OSSL_PKEY_PARAM_PRIV_KEY, priv)); +} +#endif + #if NCRYPTO_USE_BORINGSSL_EVP_DO_ALL_FALLBACK struct BoringSSLCipher { const EVP_CIPHER* (*get)(); @@ -282,9 +501,12 @@ Buffer DataPointer::release() { } DataPointer DataPointer::resize(size_t len) { - size_t actual_len = std::min(len_, len); + const size_t actual_len = std::min(len_, len); + if (actual_len == len_) return std::move(*this); + auto buf = release(); - if (actual_len == len_) return DataPointer(buf.data, actual_len); + if (actual_len == 0) return DataPointer(buf.data, actual_len); + buf.data = OPENSSL_realloc(buf.data, actual_len); buf.len = actual_len; return DataPointer(buf); @@ -500,7 +722,18 @@ int BignumPointer::isPrime(int nchecks, }, &innerCb); } +#if NCRYPTO_USE_OPENSSL3_PROVIDER + return BN_check_prime(get(), ctx.get(), cb.get()); +#elif NCRYPTO_USE_BORINGSSL + int is_probably_prime = 0; + if (BN_primality_test( + &is_probably_prime, get(), nchecks, ctx.get(), 0, cb.get()) != 1) { + return -1; + } + return is_probably_prime; +#else return BN_is_prime_ex(get(), nchecks, ctx.get(), cb.get()); +#endif } BignumPointer BignumPointer::NewPrime(const PrimeConfig& params, @@ -1389,7 +1622,11 @@ bool X509View::ifRsa(KeyCallback callback) const { OSSL3_CONST EVP_PKEY* pkey = X509_get0_pubkey(cert_); auto id = EVP_PKEY_id(pkey); if (id == EVP_PKEY_RSA || id == EVP_PKEY_RSA2 || id == EVP_PKEY_RSA_PSS) { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + Rsa rsa(pkey); +#else Rsa rsa(EVP_PKEY_get0_RSA(pkey)); +#endif if (!rsa) [[unlikely]] return true; return callback(rsa); @@ -1402,7 +1639,11 @@ bool X509View::ifEc(KeyCallback callback) const { OSSL3_CONST EVP_PKEY* pkey = X509_get0_pubkey(cert_); auto id = EVP_PKEY_id(pkey); if (id == EVP_PKEY_EC) { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + Ec ec(pkey); +#else Ec ec(EVP_PKEY_get0_EC_KEY(pkey)); +#endif if (!ec) [[unlikely]] return true; return callback(ec); @@ -1430,7 +1671,11 @@ X509Pointer X509Pointer::IssuerFrom(const SSL_CTX* ctx, const X509View& cert) { } X509Pointer X509Pointer::PeerFrom(const SSLPointer& ssl) { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + return X509Pointer(SSL_get1_peer_certificate(ssl.get())); +#else return X509Pointer(SSL_get_peer_certificate(ssl.get())); +#endif } // When adding or removing errors below, please also update the list in the API @@ -1560,11 +1805,198 @@ bool EqualNoCase(const std::string_view a, const std::string_view b) { return std::tolower(a) == std::tolower(b); }); } + +#if NCRYPTO_USE_OPENSSL3_PROVIDER +const char* GetOpenSSLDhGroupName(const std::string_view name, + DHPointer::FindGroupOption option) { + if (option != DHPointer::FindGroupOption::NO_SMALL_PRIMES && + EqualNoCase(name, "modp5")) { + return "modp_1536"; + } + if (EqualNoCase(name, "modp14")) return "modp_2048"; + if (EqualNoCase(name, "modp15")) return "modp_3072"; + if (EqualNoCase(name, "modp16")) return "modp_4096"; + if (EqualNoCase(name, "modp17")) return "modp_6144"; + if (EqualNoCase(name, "modp18")) return "modp_8192"; + return nullptr; +} + +int GetDhGroupPrivateBits(const char* group_name) { + if (group_name == nullptr) return 0; + if (strcmp(group_name, "modp_1536") == 0) return 200; + if (strcmp(group_name, "modp_2048") == 0) return 225; + if (strcmp(group_name, "modp_3072") == 0) return 275; + if (strcmp(group_name, "modp_4096") == 0) return 325; + if (strcmp(group_name, "modp_6144") == 0) return 375; + if (strcmp(group_name, "modp_8192") == 0) return 400; + return 0; +} + +bool GenerateDhPrivateKey(BignumPointer* out, + const BIGNUM* p, + const char* group_name) { + if (out == nullptr || p == nullptr) return false; + auto priv = BignumPointer::NewSecure(); + if (!priv) return false; + + const int bits = GetDhGroupPrivateBits(group_name); + if (bits > 0) { + if (BN_priv_rand(priv.get(), bits, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ANY) != + 1) { + return false; + } + } else { + auto range = BignumPointer(BN_dup(p)); + if (!range || BN_sub_word(range.get(), 3) != 1 || + BN_priv_rand_range(priv.get(), range.get()) != 1 || + BN_add_word(priv.get(), 2) != 1) { + return false; + } + } + + *out = std::move(priv); + return true; +} + +// Recompute DH public keys locally when a private key already exists. Provider +// keygen creates a fresh keypair, which is both slower and changes semantics. +bool GenerateDhPublicKey(BignumPointer* out, + const BIGNUM* p, + const BIGNUM* g, + const BIGNUM* priv) { + if (out == nullptr || p == nullptr || g == nullptr || priv == nullptr) { + return false; + } + auto pub = BignumPointer::New(); + BignumCtxPointer ctx(BN_CTX_new()); + if (!pub || !ctx || + BN_mod_exp_mont_consttime(pub.get(), g, priv, p, ctx.get(), nullptr) != + 1) { + return false; + } + + *out = std::move(pub); + return true; +} + +std::optional CheckDhParams(const BIGNUM* p, + const BIGNUM* g, + const BIGNUM* q, + const BIGNUM* j) { + // TODO(panva): In a semver-major, consider tightening OpenSSL 3 validation + // to report generator and q failures as strictly as legacy DH_check(). + if (p == nullptr || g == nullptr) return std::nullopt; + + const int p_bits = BN_num_bits(p); + if (p_bits > OPENSSL_DH_CHECK_MAX_MODULUS_BITS) return std::nullopt; + + int codes = 0; + if (!BN_is_odd(p)) { + codes |= static_cast(DHPointer::CheckResult::P_NOT_PRIME); + } + if (BN_is_negative(g) || BN_is_zero(g) || BN_is_one(g)) { + codes |= static_cast(DHPointer::CheckResult::NOT_SUITABLE_GENERATOR); + } + if (p_bits < 512) { + codes |= static_cast(DHPointer::CheckResult::MODULUS_TOO_SMALL); + } + if (p_bits > OPENSSL_DH_MAX_MODULUS_BITS) { + codes |= static_cast(DHPointer::CheckResult::MODULUS_TOO_LARGE); + } + + BignumCtxPointer ctx(BN_CTX_new()); + if (!ctx) return std::nullopt; + + auto tmp1 = BignumPointer::New(); + auto tmp2 = BignumPointer::New(); + if (!tmp1 || !tmp2) return std::nullopt; + + if (BN_copy(tmp1.get(), p) == nullptr || BN_sub_word(tmp1.get(), 1) != 1) { + return std::nullopt; + } + if (BN_cmp(g, tmp1.get()) >= 0) { + codes |= static_cast(DHPointer::CheckResult::NOT_SUITABLE_GENERATOR); + } + + bool q_good = false; + if (q != nullptr) { + if (BN_ucmp(p, q) > 0) { + q_good = true; + } else { + codes |= static_cast(DHPointer::CheckResult::INVALID_Q); + } + } + + if (q_good) { + if (BN_cmp(g, BN_value_one()) <= 0 || BN_cmp(g, p) >= 0) { + codes |= static_cast(DHPointer::CheckResult::NOT_SUITABLE_GENERATOR); + } else if (BN_mod_exp(tmp1.get(), g, q, p, ctx.get()) != 1) { + return std::nullopt; + } else if (!BN_is_one(tmp1.get())) { + codes |= static_cast(DHPointer::CheckResult::NOT_SUITABLE_GENERATOR); + } + + const int q_is_prime = BN_check_prime(q, ctx.get(), nullptr); + if (q_is_prime < 0) return std::nullopt; + if (q_is_prime == 0) { + codes |= static_cast(DHPointer::CheckResult::Q_NOT_PRIME); + } + + if (BN_div(tmp1.get(), tmp2.get(), p, q, ctx.get()) != 1) { + return std::nullopt; + } + if (!BN_is_one(tmp2.get())) { + codes |= static_cast(DHPointer::CheckResult::INVALID_Q); + } + if (j != nullptr && BN_cmp(j, tmp1.get()) != 0) { + codes |= static_cast(DHPointer::CheckResult::INVALID_J); + } + } + + const int p_is_prime = BN_check_prime(p, ctx.get(), nullptr); + if (p_is_prime < 0) return std::nullopt; + if (p_is_prime == 0) { + codes |= static_cast(DHPointer::CheckResult::P_NOT_PRIME); + } else if (q == nullptr) { + if (BN_rshift1(tmp1.get(), p) != 1) return std::nullopt; + const int q_is_prime = BN_check_prime(tmp1.get(), ctx.get(), nullptr); + if (q_is_prime < 0) return std::nullopt; + if (q_is_prime == 0) { + codes |= static_cast(DHPointer::CheckResult::P_NOT_SAFE_PRIME); + } + } + + return codes; +} +#endif } // namespace +#if NCRYPTO_USE_OPENSSL3_PROVIDER +DHPointer::DHPointer(EVPKeyPointer&& key, const char* group_name) + : dh_(key.release()), group_name_(group_name) {} + +DHPointer::DHPointer(BignumPointer&& p, + BignumPointer&& g, + const char* group_name) + : p_(std::move(p)), g_(std::move(g)), group_name_(group_name) {} +#else DHPointer::DHPointer(DH* dh) : dh_(dh) {} +#endif -DHPointer::DHPointer(DHPointer&& other) noexcept : dh_(other.release()) {} +DHPointer::DHPointer(DHPointer&& other) noexcept +#if NCRYPTO_USE_OPENSSL3_PROVIDER + : dh_(other.dh_.release()), + p_(std::move(other.p_)), + g_(std::move(other.g_)), + pub_key_(std::move(other.pub_key_)), + pvt_key_(std::move(other.pvt_key_)), + group_name_(other.group_name_) { + other.group_name_ = nullptr; +} +#else + : dh_(other.release()) { +} +#endif DHPointer& DHPointer::operator=(DHPointer&& other) noexcept { if (this == &other) return *this; @@ -1576,13 +2008,45 @@ DHPointer::~DHPointer() { reset(); } -void DHPointer::reset(DH* dh) { +void DHPointer::reset( +#if NCRYPTO_USE_OPENSSL3_PROVIDER + EVP_PKEY* dh +#else + DH* dh +#endif +) { dh_.reset(dh); +#if NCRYPTO_USE_OPENSSL3_PROVIDER + p_.reset(); + g_.reset(); + pub_key_.reset(); + pvt_key_.reset(); + group_name_ = nullptr; +#endif } +#if NCRYPTO_USE_OPENSSL3_PROVIDER +EVP_PKEY* DHPointer::release() { + if (!dh_ && p_ && g_) { + auto pkey = + group_name_ != nullptr + ? NewDhPKey(group_name_, pub_key_.get(), pvt_key_.get()) + : NewDhPKey(p_.get(), g_.get(), pub_key_.get(), pvt_key_.get()); + if (!pkey) return nullptr; + dh_.reset(pkey.release()); + } + p_.reset(); + g_.reset(); + pub_key_.reset(); + pvt_key_.reset(); + group_name_ = nullptr; + return dh_.release(); +} +#else DH* DHPointer::release() { return dh_.release(); } +#endif BignumPointer DHPointer::FindGroup(const std::string_view name, FindGroupOption option) { @@ -1608,7 +2072,7 @@ BignumPointer DHPointer::FindGroup(const std::string_view name, BignumPointer DHPointer::GetStandardGenerator() { auto bn = BignumPointer::New(); if (!bn) return {}; - if (!bn.setWord(DH_GENERATOR_2)) return {}; + if (!bn.setWord(2)) return {}; return bn; } @@ -1620,12 +2084,22 @@ DHPointer DHPointer::FromGroup(const std::string_view name, auto generator = GetStandardGenerator(); if (!generator) return {}; // Unable to create the generator. +#if NCRYPTO_USE_OPENSSL3_PROVIDER + const char* group_name = GetOpenSSLDhGroupName(name, option); + return DHPointer(std::move(group), std::move(generator), group_name); +#else return New(std::move(group), std::move(generator)); +#endif } DHPointer DHPointer::New(BignumPointer&& p, BignumPointer&& g) { if (!p || !g) return {}; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + auto pkey = NewDhPKey(p.get(), g.get()); + if (!pkey) return {}; + return DHPointer(std::move(pkey)); +#else DHPointer dh(DH_new()); if (!dh) return {}; @@ -1640,9 +2114,21 @@ DHPointer DHPointer::New(BignumPointer&& p, BignumPointer&& g) { g.release(); return dh; +#endif } DHPointer DHPointer::New(size_t bits, unsigned int generator) { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + auto param_ctx = EVPKeyCtxPointer::NewFromID(EVP_PKEY_DH); + if (!param_ctx.initForParamgen() || + !param_ctx.setDhParameters(bits, generator)) { + return {}; + } + + auto key_params = param_ctx.paramgen(); + if (!key_params) return {}; + return DHPointer(std::move(key_params)); +#else DHPointer dh(DH_new()); if (!dh) return {}; @@ -1651,23 +2137,103 @@ DHPointer DHPointer::New(size_t bits, unsigned int generator) { } return dh; +#endif } DHPointer::CheckResult DHPointer::check() { ClearErrorOnReturn clearErrorOnReturn; - if (!dh_) return DHPointer::CheckResult::NONE; + if (!*this) return DHPointer::CheckResult::NONE; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + // TODO(panva): In a semver-major, consider validating named DH groups + // through the provider instead of preserving the historical verifyError. + if (group_name_ != nullptr) return CheckResult::NONE; + + DeleteFnPtr p; + DeleteFnPtr g; + DeleteFnPtr q; + DeleteFnPtr j; + const BIGNUM* p_bn = p_.get(); + const BIGNUM* g_bn = g_.get(); + const BIGNUM* q_bn = nullptr; + const BIGNUM* j_bn = nullptr; + if ((p_bn == nullptr || g_bn == nullptr) && + !GetDhParams(dh_.get(), &p, &g, &q, &j)) { + return DHPointer::CheckResult::CHECK_FAILED; + } + if (p_bn == nullptr) p_bn = p.get(); + if (g_bn == nullptr) g_bn = g.get(); + q_bn = q.get(); + j_bn = j.get(); + if (p_bn == nullptr || g_bn == nullptr) { + return DHPointer::CheckResult::CHECK_FAILED; + } + + auto codes = CheckDhParams(p_bn, g_bn, q_bn, j_bn); + if (!codes) return DHPointer::CheckResult::CHECK_FAILED; + return static_cast(*codes); +#else int codes = 0; if (DH_check(dh_.get(), &codes) != 1) return DHPointer::CheckResult::CHECK_FAILED; return static_cast(codes); +#endif } DHPointer::CheckPublicKeyResult DHPointer::checkPublicKey( const BignumPointer& pub_key) { ClearErrorOnReturn clearErrorOnReturn; - if (!pub_key || !dh_) { + if (!pub_key || !*this) { + return DHPointer::CheckPublicKeyResult::CHECK_FAILED; + } +#if NCRYPTO_USE_OPENSSL3_PROVIDER + DeleteFnPtr p; + DeleteFnPtr g; + const BIGNUM* p_bn = p_.get(); + const BIGNUM* g_bn = g_.get(); + if ((p_bn == nullptr || g_bn == nullptr) && !GetDhParams(dh_.get(), &p, &g)) { + return DHPointer::CheckPublicKeyResult::CHECK_FAILED; + } + if (p_bn == nullptr) p_bn = p.get(); + if (g_bn == nullptr) g_bn = g.get(); + if (p_bn == nullptr || g_bn == nullptr) { + return DHPointer::CheckPublicKeyResult::CHECK_FAILED; + } + + if (BN_cmp(pub_key.get(), BN_value_one()) <= 0) { + return DHPointer::CheckPublicKeyResult::TOO_SMALL; + } + + DeleteFnPtr p_minus_one(BN_dup(p_bn)); + if (!p_minus_one || BN_sub_word(p_minus_one.get(), 1) != 1) { return DHPointer::CheckPublicKeyResult::CHECK_FAILED; } + + if (BN_cmp(pub_key.get(), p_minus_one.get()) >= 0) { + return DHPointer::CheckPublicKeyResult::TOO_LARGE; + } + + if (p_) { + if (group_name_ == nullptr) return CheckPublicKeyResult::NONE; + + auto peer = NewDhPKey(group_name_, pub_key.get()); + if (!peer) return DHPointer::CheckPublicKeyResult::CHECK_FAILED; + EVPKeyCtxPointer ctx(EVP_PKEY_CTX_new(peer.get(), nullptr)); + if (!ctx) return DHPointer::CheckPublicKeyResult::CHECK_FAILED; + if (EVP_PKEY_public_check(ctx.get()) != 1) { + return DHPointer::CheckPublicKeyResult::INVALID; + } + return CheckPublicKeyResult::NONE; + } + + auto peer = NewDhPKey(p_bn, g_bn, pub_key.get()); + if (!peer) return DHPointer::CheckPublicKeyResult::CHECK_FAILED; + EVPKeyCtxPointer ctx(EVP_PKEY_CTX_new(peer.get(), nullptr)); + if (!ctx) return DHPointer::CheckPublicKeyResult::CHECK_FAILED; + if (EVP_PKEY_public_check(ctx.get()) != 1) { + return DHPointer::CheckPublicKeyResult::INVALID; + } + return CheckPublicKeyResult::NONE; +#else int codes = 0; if (DH_check_pub_key(dh_.get(), pub_key.get(), &codes) != 1) { return DHPointer::CheckPublicKeyResult::CHECK_FAILED; @@ -1684,64 +2250,245 @@ DHPointer::CheckPublicKeyResult DHPointer::checkPublicKey( return DHPointer::CheckPublicKeyResult::INVALID; } return CheckPublicKeyResult::NONE; +#endif } DataPointer DHPointer::getPrime() const { - if (!dh_) return {}; + if (!*this) return {}; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (p_) return p_.encode(); + + DeleteFnPtr p; + DeleteFnPtr g; + if (!GetDhParams(dh_.get(), &p, &g)) return {}; + return BignumPointer::Encode(p.get()); +#else const BIGNUM* p; DH_get0_pqg(dh_.get(), &p, nullptr, nullptr); return BignumPointer::Encode(p); +#endif +} + +size_t DHPointer::getPrimeBits() const { + if (!*this) return 0; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (p_) return BignumPointer::GetBitCount(p_.get()); + + DeleteFnPtr p; + DeleteFnPtr g; + if (!GetDhParams(dh_.get(), &p, &g)) return 0; + return BignumPointer::GetBitCount(p.get()); +#else + const BIGNUM* p; + DH_get0_pqg(dh_.get(), &p, nullptr, nullptr); + return BignumPointer::GetBitCount(p); +#endif } DataPointer DHPointer::getGenerator() const { - if (!dh_) return {}; + if (!*this) return {}; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (g_) return g_.encode(); + + DeleteFnPtr p; + DeleteFnPtr g; + if (!GetDhParams(dh_.get(), &p, &g)) return {}; + return BignumPointer::Encode(g.get()); +#else const BIGNUM* g; DH_get0_pqg(dh_.get(), nullptr, nullptr, &g); return BignumPointer::Encode(g); +#endif } DataPointer DHPointer::getPublicKey() const { + if (!*this) return {}; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (pub_key_) return pub_key_.encode(); if (!dh_) return {}; + + DeleteFnPtr pub_key; + if (!GetDhKeys(dh_.get(), &pub_key, nullptr)) return {}; + return BignumPointer::Encode(pub_key.get()); +#else const BIGNUM* pub_key; DH_get0_key(dh_.get(), &pub_key, nullptr); return BignumPointer::Encode(pub_key); +#endif } DataPointer DHPointer::getPrivateKey() const { + if (!*this) return {}; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (pvt_key_) return pvt_key_.encode(); if (!dh_) return {}; + + DeleteFnPtr pvt_key; + if (!GetDhKeys(dh_.get(), nullptr, &pvt_key)) return {}; + return BignumPointer::Encode(pvt_key.get()); +#else const BIGNUM* pvt_key; DH_get0_key(dh_.get(), nullptr, &pvt_key); return BignumPointer::Encode(pvt_key); +#endif } -DataPointer DHPointer::generateKeys() const { - ClearErrorOnReturn clearErrorOnReturn; - if (!dh_) return {}; - - // Key generation failed - if (!DH_generate_key(dh_.get())) return {}; - - return getPublicKey(); -} +bool DHPointer::hasPrivateKey() const { + if (!*this) return false; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (pvt_key_) return true; + if (!dh_) return false; -size_t DHPointer::size() const { - if (!dh_) return 0; - int ret = DH_size(dh_.get()); - // DH_size can return a -1 on error but we just want to return a 0 - // in that case so we don't wrap around when returning the size_t. - return ret >= 0 ? static_cast(ret) : 0; + DeleteFnPtr pvt_key; + if (!GetDhKeys(dh_.get(), nullptr, &pvt_key)) return false; + return pvt_key != nullptr; +#else + const BIGNUM* pvt_key = nullptr; + DH_get0_key(dh_.get(), nullptr, &pvt_key); + return pvt_key != nullptr; +#endif } -DataPointer DHPointer::computeSecret(const BignumPointer& peer) const { +DataPointer DHPointer::generateKeys() { ClearErrorOnReturn clearErrorOnReturn; - if (!dh_ || !peer) return {}; + if (!*this) return {}; - auto dp = DataPointer::Alloc(size()); - if (!dp) return {}; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (p_ && g_) { + if (!pvt_key_ && !GenerateDhPrivateKey(&pvt_key_, p_.get(), group_name_)) { + return {}; + } - int size = - DH_compute_key(static_cast(dp.get()), peer.get(), dh_.get()); - if (size < 0) return {}; + BignumPointer generated_pub_key; + if (!GenerateDhPublicKey( + &generated_pub_key, p_.get(), g_.get(), pvt_key_.get())) { + return {}; + } + + if (pub_key_ && BN_cmp(pub_key_.get(), generated_pub_key.get()) == 0) { + return getPublicKey(); + } + + pub_key_ = std::move(generated_pub_key); + return getPublicKey(); + } + + DeleteFnPtr p; + DeleteFnPtr g; + DeleteFnPtr pub_key; + DeleteFnPtr pvt_key; + if (!GetDhParams(dh_.get(), &p, &g) || + !GetDhKeys(dh_.get(), &pub_key, &pvt_key)) { + return {}; + } + + if (pvt_key != nullptr) { + BignumPointer generated_pub_key; + if (!GenerateDhPublicKey( + &generated_pub_key, p.get(), g.get(), pvt_key.get())) { + return {}; + } + + if (pub_key != nullptr && + BN_cmp(pub_key.get(), generated_pub_key.get()) == 0) { + return getPublicKey(); + } + + auto replacement = + group_name_ != nullptr + ? NewDhPKey(group_name_, generated_pub_key.get(), pvt_key.get()) + : NewDhPKey( + p.get(), g.get(), generated_pub_key.get(), pvt_key.get()); + if (!replacement) return {}; + dh_.reset(replacement.release()); + return getPublicKey(); + } + + EVPKeyCtxPointer ctx(EVP_PKEY_CTX_new(dh_.get(), nullptr)); + if (!ctx || !ctx.initForKeygen()) return {}; + EVP_PKEY* generated = nullptr; + if (EVP_PKEY_keygen(ctx.get(), &generated) != 1) return {}; + dh_.reset(generated); + return getPublicKey(); +#else + // Key generation failed + if (!DH_generate_key(dh_.get())) return {}; + + return getPublicKey(); +#endif +} + +size_t DHPointer::size() const { + if (!*this) return 0; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (p_) return BignumPointer::GetByteCount(p_.get()); + + const int bits = EVP_PKEY_get_bits(dh_.get()); + return bits > 0 ? (static_cast(bits) + 7) / 8 : 0; +#else + int ret = DH_size(dh_.get()); + // DH_size can return a -1 on error but we just want to return a 0 + // in that case so we don't wrap around when returning the size_t. + return ret >= 0 ? static_cast(ret) : 0; +#endif +} + +DataPointer DHPointer::computeSecret(const BignumPointer& peer) const { + ClearErrorOnReturn clearErrorOnReturn; + if (!*this || !peer) return {}; + +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (p_ && pvt_key_) { + auto secret = BignumPointer::NewSecure(); + BignumCtxPointer ctx(BN_CTX_new()); + if (!secret || !ctx || + BN_mod_exp_mont_consttime(secret.get(), + peer.get(), + pvt_key_.get(), + p_.get(), + ctx.get(), + nullptr) != 1) { + return {}; + } + return secret.encodePadded(size()); + } + + EVPKeyPointer peer_key; + if (group_name_ != nullptr) { + peer_key = NewDhPKey(group_name_, peer.get()); + } else { + DeleteFnPtr p; + DeleteFnPtr g; + if (!GetDhParams(dh_.get(), &p, &g)) return {}; + peer_key = NewDhPKey(p.get(), g.get(), peer.get()); + } + if (!peer_key) return {}; + + EVPKeyCtxPointer ctx(EVP_PKEY_CTX_new(dh_.get(), nullptr)); + size_t out_size = size(); + if (!ctx || EVP_PKEY_derive_init(ctx.get()) != 1 || + EVP_PKEY_CTX_set_dh_pad(ctx.get(), 1) != 1 || + EVP_PKEY_derive_set_peer(ctx.get(), peer_key.get()) != 1 || + EVP_PKEY_derive(ctx.get(), nullptr, &out_size) != 1) { + return {}; + } + + if (out_size == 0) return {}; + + auto dp = DataPointer::Alloc(out_size); + if (!dp) return {}; + if (EVP_PKEY_derive( + ctx.get(), static_cast(dp.get()), &out_size) != 1) { + return {}; + } + return dp.resize(out_size); +#else + auto dp = DataPointer::Alloc(size()); + if (!dp) return {}; + + int size = + DH_compute_key(static_cast(dp.get()), peer.get(), dh_.get()); + if (size < 0) return {}; // The size of the computed key can be smaller than the size of the DH key. // We want to make sure that the key is correctly padded. @@ -1753,10 +2500,34 @@ DataPointer DHPointer::computeSecret(const BignumPointer& peer) const { } return dp; +#endif } bool DHPointer::setPublicKey(BignumPointer&& key) { - if (!dh_) return false; + if (!*this) return false; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (p_ && g_) { + pub_key_ = std::move(key); + return true; + } + + DeleteFnPtr pvt_key; + if (!GetDhKeys(dh_.get(), nullptr, &pvt_key)) { + return false; + } + EVPKeyPointer pkey; + if (group_name_ != nullptr) { + pkey = NewDhPKey(group_name_, key.get(), pvt_key.get()); + } else { + DeleteFnPtr p; + DeleteFnPtr g; + if (!GetDhParams(dh_.get(), &p, &g)) return false; + pkey = NewDhPKey(p.get(), g.get(), key.get(), pvt_key.get()); + } + if (!pkey) return false; + dh_.reset(pkey.release()); + return true; +#else if (DH_set0_key(dh_.get(), key.get(), nullptr) == 1) { // If DH_set0_key returns successfully, then dh_ takes ownership of the // BIGNUM, so we must release it here. Unfortunately coverity does not @@ -1766,10 +2537,34 @@ bool DHPointer::setPublicKey(BignumPointer&& key) { return true; } return false; +#endif } bool DHPointer::setPrivateKey(BignumPointer&& key) { - if (!dh_) return false; + if (!*this) return false; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (p_ && g_) { + pvt_key_ = std::move(key); + return true; + } + + DeleteFnPtr pub_key; + if (!GetDhKeys(dh_.get(), &pub_key, nullptr)) { + return false; + } + EVPKeyPointer pkey; + if (group_name_ != nullptr) { + pkey = NewDhPKey(group_name_, pub_key.get(), key.get()); + } else { + DeleteFnPtr p; + DeleteFnPtr g; + if (!GetDhParams(dh_.get(), &p, &g)) return false; + pkey = NewDhPKey(p.get(), g.get(), pub_key.get(), key.get()); + } + if (!pkey) return false; + dh_.reset(pkey.release()); + return true; +#else if (DH_set0_key(dh_.get(), nullptr, key.get()) == 1) { // If DH_set0_key returns successfully, then dh_ takes ownership of the // BIGNUM, so we must release it here. Unfortunately coverity does not @@ -1779,6 +2574,7 @@ bool DHPointer::setPrivateKey(BignumPointer&& key) { return true; } return false; +#endif } DataPointer DHPointer::stateless(const EVPKeyPointer& ourKey, @@ -1787,8 +2583,12 @@ DataPointer DHPointer::stateless(const EVPKeyPointer& ourKey, if (!ourKey || !theirKey) return {}; auto ctx = EVPKeyCtxPointer::New(ourKey); - if (!ctx || EVP_PKEY_derive_init(ctx.get()) <= 0 || - EVP_PKEY_derive_set_peer(ctx.get(), theirKey.get()) <= 0 || + if (!ctx || EVP_PKEY_derive_init(ctx.get()) <= 0) { + return {}; + } + // TODO(panva): In a semver-major, consider padding OpenSSL 3 DH derivation + // results here to match DiffieHellman::computeSecret(). + if (EVP_PKEY_derive_set_peer(ctx.get(), theirKey.get()) <= 0 || EVP_PKEY_derive(ctx.get(), nullptr, &out_size) <= 0) { return {}; } @@ -1842,8 +2642,6 @@ DataPointer hkdf(const Digest& md, const Buffer& info, const Buffer& salt, size_t length) { - ClearErrorOnReturn clearErrorOnReturn; - if (!checkHkdfLength(md, length) || info.len > INT_MAX || salt.len > INT_MAX) { return {}; @@ -1914,8 +2712,6 @@ DataPointer scrypt(const Buffer& pass, uint64_t p, uint64_t maxmem, size_t length) { - ClearErrorOnReturn clearErrorOnReturn; - if (pass.len > INT_MAX || salt.len > INT_MAX) { return {}; } @@ -1942,8 +2738,6 @@ DataPointer pbkdf2(const Digest& md, const Buffer& salt, uint32_t iterations, size_t length) { - ClearErrorOnReturn clearErrorOnReturn; - if (pass.len > INT_MAX || salt.len > INT_MAX || length > INT_MAX) { return {}; } @@ -1975,8 +2769,6 @@ DataPointer argon2(const Buffer& pass, const Buffer& secret, const Buffer& ad, Argon2Type type) { - ClearErrorOnReturn clearErrorOnReturn; - std::string_view algorithm; switch (type) { case Argon2Type::ARGON2I: @@ -1993,15 +2785,24 @@ DataPointer argon2(const Buffer& pass, return {}; } - // creates a new library context to avoid locking when running concurrently - auto ctx = DeleteFnPtr{OSSL_LIB_CTX_new()}; - if (!ctx) { - return {}; - } + // A new library context is only needed for OSSL_set_max_threads(), which is + // per-context. It inherits no configuration, so availability is checked + // against the default context, otherwise Argon2 works in FIPS mode. + DeleteFnPtr ctx; + if (lanes > 1) { + if (!DeleteFnPtr{ + EVP_KDF_fetch(nullptr, algorithm.data(), nullptr)}) { + return {}; + } - // required if threads > 1 - if (lanes > 1 && OSSL_set_max_threads(ctx.get(), lanes) != 1) { - return {}; + ctx.reset(OSSL_LIB_CTX_new()); + if (!ctx) { + return {}; + } + + if (OSSL_set_max_threads(ctx.get(), lanes) != 1) { + return {}; + } } auto kdf = DeleteFnPtr{ @@ -2202,14 +3003,60 @@ EVPKeyPointer EVPKeyPointer::NewRawSeed( EVPKeyPointer EVPKeyPointer::NewDH(DHPointer&& dh) { if (!dh) return {}; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + return EVPKeyPointer(dh.release()); +#else auto key = New(); if (!key) return {}; if (EVP_PKEY_assign_DH(key.get(), dh.get())) { dh.release(); } return key; +#endif } +#if NCRYPTO_USE_OPENSSL3_PROVIDER +EVPKeyPointer EVPKeyPointer::NewRSA(const Rsa& rsa) { + const auto public_key = rsa.getPublicKey(); + if (public_key.n == nullptr || public_key.e == nullptr) return {}; + + OSSLParamBldPointer bld(OSSL_PARAM_BLD_new()); + if (!bld || + OSSL_PARAM_BLD_push_BN(bld.get(), OSSL_PKEY_PARAM_RSA_N, public_key.n) != + 1 || + OSSL_PARAM_BLD_push_BN(bld.get(), OSSL_PKEY_PARAM_RSA_E, public_key.e) != + 1) { + return {}; + } + + int selection = EVP_PKEY_PUBLIC_KEY; + if (public_key.d != nullptr) { + const auto private_key = rsa.getPrivateKey(); + if (private_key.p == nullptr || private_key.q == nullptr || + private_key.dp == nullptr || private_key.dq == nullptr || + private_key.qi == nullptr || + OSSL_PARAM_BLD_push_BN( + bld.get(), OSSL_PKEY_PARAM_RSA_D, public_key.d) != 1 || + OSSL_PARAM_BLD_push_BN( + bld.get(), OSSL_PKEY_PARAM_RSA_FACTOR1, private_key.p) != 1 || + OSSL_PARAM_BLD_push_BN( + bld.get(), OSSL_PKEY_PARAM_RSA_FACTOR2, private_key.q) != 1 || + OSSL_PARAM_BLD_push_BN( + bld.get(), OSSL_PKEY_PARAM_RSA_EXPONENT1, private_key.dp) != 1 || + OSSL_PARAM_BLD_push_BN( + bld.get(), OSSL_PKEY_PARAM_RSA_EXPONENT2, private_key.dq) != 1 || + OSSL_PARAM_BLD_push_BN( + bld.get(), OSSL_PKEY_PARAM_RSA_COEFFICIENT1, private_key.qi) != 1) { + return {}; + } + selection = EVP_PKEY_KEYPAIR; + } + + OSSLParamPointer params(OSSL_PARAM_BLD_to_param(bld.get())); + if (!params) return {}; + return NewPKeyFromData(EVP_PKEY_RSA, selection, params.get()); +} +#else EVPKeyPointer EVPKeyPointer::NewRSA(RSAPointer&& rsa) { if (!rsa) return {}; auto key = New(); @@ -2219,6 +3066,7 @@ EVPKeyPointer EVPKeyPointer::NewRSA(RSAPointer&& rsa) { } return key; } +#endif // NCRYPTO_USE_OPENSSL3_PROVIDER EVPKeyPointer::EVPKeyPointer(EVP_PKEY* pkey) : pkey_(pkey) {} @@ -2356,18 +3204,83 @@ BIOPointer EVPKeyPointer::derPublicKey() const { bool EVPKeyPointer::assign(const ECKeyPointer& eckey) { if (!pkey_ || !eckey) return {}; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + return set(eckey); +#else return EVP_PKEY_assign_EC_KEY(pkey_.get(), eckey.get()); +#endif } bool EVPKeyPointer::set(const ECKeyPointer& eckey) { if (!pkey_ || !eckey) return false; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + const int nid = EC_GROUP_get_curve_name(eckey.group_.get()); + const char* group_name = OBJ_nid2sn(nid); + if (group_name == nullptr) return false; + + OSSLParamBldPointer bld(OSSL_PARAM_BLD_new()); + if (!bld || OSSL_PARAM_BLD_push_utf8_string( + bld.get(), OSSL_PKEY_PARAM_GROUP_NAME, group_name, 0) != 1) { + return false; + } + + int selection = EVP_PKEY_KEY_PARAMETERS; + OpenSSLBufferPointer encoded_public_key; + ECPointPointer generated_public_key; + const EC_POINT* public_key = eckey.pub_.get(); + if (public_key == nullptr && eckey.priv_ != nullptr) { + generated_public_key = ECPointPointer::New(eckey.group_.get()); + if (!generated_public_key || + !generated_public_key.mul(eckey.group_.get(), eckey.priv_.get())) { + return false; + } + public_key = generated_public_key.get(); + } + + if (public_key != nullptr) { + unsigned char* encoded_public_key_raw = nullptr; + const size_t encoded_public_key_len = + EC_POINT_point2buf(eckey.group_.get(), + public_key, + POINT_CONVERSION_UNCOMPRESSED, + &encoded_public_key_raw, + nullptr); + if (encoded_public_key_len == 0) return false; + encoded_public_key.reset(encoded_public_key_raw); + if (OSSL_PARAM_BLD_push_octet_string(bld.get(), + OSSL_PKEY_PARAM_PUB_KEY, + encoded_public_key.get(), + encoded_public_key_len) != 1) { + return false; + } + selection |= EVP_PKEY_PUBLIC_KEY; + } + + if (eckey.priv_ != nullptr) { + if (OSSL_PARAM_BLD_push_BN( + bld.get(), OSSL_PKEY_PARAM_PRIV_KEY, eckey.priv_.get()) != 1) { + return false; + } + selection |= EVP_PKEY_PRIVATE_KEY; + } + + OSSLParamPointer params(OSSL_PARAM_BLD_to_param(bld.get())); + if (!params) return false; + auto pkey = NewPKeyFromData(EVP_PKEY_EC, selection, params.get()); + if (!pkey) return false; + reset(pkey.release()); + return true; +#else return EVP_PKEY_set1_EC_KEY(pkey_.get(), eckey); +#endif } +#if NCRYPTO_USE_LEGACY_KEY_TYPES EVPKeyPointer::operator const EC_KEY*() const { if (!pkey_) return nullptr; return EVP_PKEY_get0_EC_KEY(pkey_.get()); } +#endif // NCRYPTO_USE_LEGACY_KEY_TYPES namespace { @@ -2422,6 +3335,34 @@ constexpr bool IsASN1Sequence(const unsigned char* data, return true; } +constexpr bool ReadASN1Element(const unsigned char* data, + size_t size, + unsigned char tag, + size_t* header_size, + size_t* content_size, + size_t* total_size) { + if (size < 2 || data[0] != tag) return false; + + size_t offset; + size_t length; + if (data[1] & 0x80) { + size_t n_bytes = data[1] & ~0x80; + if (n_bytes + 2 > size || n_bytes > sizeof(size_t)) return false; + length = 0; + for (size_t i = 0; i < n_bytes; i++) length = (length << 8) | data[i + 2]; + offset = 2 + n_bytes; + } else { + offset = 2; + length = data[1]; + } + + if (offset > size || length > size - offset) return false; + *header_size = offset; + *content_size = length; + *total_size = offset + length; + return true; +} + constexpr bool IsEncryptedPrivateKeyInfo( const Buffer& buffer) { // Both PrivateKeyInfo and EncryptedPrivateKeyInfo start with a SEQUENCE. @@ -2539,6 +3480,104 @@ Buffer GetPassphrase( } return pass; } + +#if NCRYPTO_USE_OPENSSL3_PROVIDER +using OSSLEncoderCtxPointer = + DeleteFnPtr; + +bool WriteEncodedPKey(BIO* bio, + const EVP_PKEY* pkey, + int selection, + EVPKeyPointer::PKFormatType format, + const char* structure, + const EVP_CIPHER* cipher = nullptr, + Buffer passphrase = {}) { + const char* output_type = + format == EVPKeyPointer::PKFormatType::PEM ? "PEM" : "DER"; + OSSLEncoderCtxPointer ctx(OSSL_ENCODER_CTX_new_for_pkey( + pkey, selection, output_type, structure, nullptr)); + if (!ctx || OSSL_ENCODER_CTX_get_num_encoders(ctx.get()) == 0) { + return false; + } + + if (cipher != nullptr) { + if (OSSL_ENCODER_CTX_set_cipher( + ctx.get(), EVP_CIPHER_get0_name(cipher), nullptr) != 1 || + OSSL_ENCODER_CTX_set_passphrase( + ctx.get(), + reinterpret_cast(passphrase.data), + passphrase.len) != 1) { + return false; + } + } + + return OSSL_ENCODER_to_bio(ctx.get(), bio) == 1; +} + +struct DERView { + const unsigned char* data = nullptr; + size_t len = 0; +}; + +int WriteDERView(const void* x, unsigned char** out) { + const auto* der = static_cast(x); + if (der == nullptr || der->data == nullptr || + der->len > static_cast(INT_MAX)) { + return -1; + } + if (out != nullptr) { + memcpy(*out, der->data, der->len); + *out += der->len; + } + return static_cast(der->len); +} + +bool WriteEncryptedTraditionalPEM(BIO* bio, + const EVP_PKEY* pkey, + const EVP_CIPHER* cipher, + Buffer passphrase) { + if (passphrase.len > static_cast(INT_MAX)) return false; + + unsigned char* der = nullptr; + size_t der_len = 0; + OSSLEncoderCtxPointer ctx(OSSL_ENCODER_CTX_new_for_pkey( + pkey, OSSL_KEYMGMT_SELECT_KEYPAIR, "DER", "pkcs1", nullptr)); + if (!ctx) return false; + + const int result = OSSL_ENCODER_to_data(ctx.get(), &der, &der_len); + DataPointer der_storage(der, der_len); + if (result != 1) return false; + + DERView der_view{der_storage.get(), der_len}; + return PEM_ASN1_write_bio( + WriteDERView, + PEM_STRING_RSA, + bio, + &der_view, + cipher, + reinterpret_cast(passphrase.data), + static_cast(passphrase.len), + nullptr, + nullptr) == 1; +} + +bool ECKeyHasMissingOid(const EVPKeyPointer& key) { + if (key.id() != EVP_PKEY_EC) return false; + + const Ec ec(key.get()); + const EC_GROUP* group = ec.getGroup(); + if (group == nullptr || + EC_GROUP_get_asn1_flag(group) != OPENSSL_EC_NAMED_CURVE) { + return false; + } + + const int nid = EC_GROUP_get_curve_name(group); + if (nid == NID_undef) return true; + + const ASN1_OBJECT* asn1 = OBJ_nid2obj(nid); + return asn1 == nullptr || OBJ_length(asn1) == 0; +} +#endif } // namespace EVPKeyPointer::ParseKeyResult EVPKeyPointer::TryParsePrivateKey( @@ -2626,6 +3665,22 @@ Result EVPKeyPointer::writePrivateKey( // PKCS1 is only permitted for RSA keys. if (id() != EVP_PKEY_RSA) return Result(false); +#if NCRYPTO_USE_OPENSSL3_PROVIDER + const EVP_CIPHER* cipher = + config.format == PKFormatType::PEM ? config.cipher : nullptr; + if (cipher != nullptr && passphrase.len == 0) { + err = + !WriteEncryptedTraditionalPEM(bio.get(), get(), cipher, passphrase); + } else { + err = !WriteEncodedPKey(bio.get(), + get(), + OSSL_KEYMGMT_SELECT_ALL, + config.format, + "pkcs1", + cipher, + passphrase); + } +#else #if OPENSSL_VERSION_MAJOR >= 3 const RSA* rsa = EVP_PKEY_get0_RSA(get()); #else @@ -2653,6 +3708,7 @@ Result EVPKeyPointer::writePrivateKey( return Result(false); } } +#endif break; } case PKEncodingType::PKCS8: { @@ -2689,6 +3745,17 @@ Result EVPKeyPointer::writePrivateKey( // SEC1 is only permitted for EC keys if (id() != EVP_PKEY_EC) return Result(false); +#if NCRYPTO_USE_OPENSSL3_PROVIDER + const EVP_CIPHER* cipher = + config.format == PKFormatType::PEM ? config.cipher : nullptr; + err = !WriteEncodedPKey(bio.get(), + get(), + OSSL_KEYMGMT_SELECT_ALL, + config.format, + "type-specific", + cipher, + passphrase); +#else #if OPENSSL_VERSION_MAJOR >= 3 const EC_KEY* ec = EVP_PKEY_get0_EC_KEY(get()); #else @@ -2716,6 +3783,7 @@ Result EVPKeyPointer::writePrivateKey( return Result(false); } } +#endif break; } default: { @@ -2742,6 +3810,18 @@ Result EVPKeyPointer::writePublicKey( if (config.type == ncrypto::EVPKeyPointer::PKEncodingType::PKCS1) { // PKCS#1 is only valid for RSA keys. +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (id() != EVP_PKEY_RSA) return Result(false); + if (!WriteEncodedPKey(bio.get(), + get(), + OSSL_KEYMGMT_SELECT_PUBLIC_KEY, + config.format, + "pkcs1")) { + return Result(false, + mark_pop_error_on_return.peekError()); + } + return bio; +#else #if OPENSSL_VERSION_MAJOR >= 3 const RSA* rsa = EVP_PKEY_get0_RSA(get()); #else @@ -2762,8 +3842,17 @@ Result EVPKeyPointer::writePublicKey( mark_pop_error_on_return.peekError()); } return bio; +#endif } +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (ECKeyHasMissingOid(*this)) { + ERR_raise(ERR_LIB_EC, EC_R_MISSING_OID); + return Result(false, + mark_pop_error_on_return.peekError()); + } +#endif + if (config.format == ncrypto::EVPKeyPointer::PKFormatType::PEM) { // Encode SPKI as PEM. if (PEM_write_bio_PUBKEY(bio.get(), get()) != 1) { @@ -2834,11 +3923,23 @@ std::optional EVPKeyPointer::getBytesOfRS() const { int bits, id = base_id(); if (id == EVP_PKEY_DSA) { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + DeleteFnPtr q; + if (!GetPKeyBnParam(get(), OSSL_PKEY_PARAM_FFC_Q, &q)) return std::nullopt; + bits = BignumPointer::GetBitCount(q.get()); +#else const DSA* dsa_key = EVP_PKEY_get0_DSA(get()); // Both r and s are computed mod q, so their width is limited by that of q. bits = BignumPointer::GetBitCount(DSA_get0_q(dsa_key)); +#endif } else if (id == EVP_PKEY_EC) { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + Ec ec(get()); + if (!ec) return std::nullopt; + bits = EC_GROUP_order_bits(ec.getGroup()); +#else bits = EC_GROUP_order_bits(ECKeyPointer::GetGroup(*this)); +#endif } else { return std::nullopt; } @@ -2850,6 +3951,9 @@ EVPKeyPointer::operator Rsa() const { int type = id(); if (type != EVP_PKEY_RSA && type != EVP_PKEY_RSA_PSS) return {}; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + return Rsa(get()); +#else // TODO(tniessen): Remove the "else" branch once we drop support for OpenSSL // versions older than 1.1.1e via FIPS / dynamic linking. OSSL3_CONST RSA* rsa; @@ -2860,15 +3964,20 @@ EVPKeyPointer::operator Rsa() const { } if (rsa == nullptr) return {}; return Rsa(rsa); +#endif } EVPKeyPointer::operator Dsa() const { int type = id(); if (type != EVP_PKEY_DSA) return {}; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + return Dsa(get()); +#else OSSL3_CONST DSA* dsa = EVP_PKEY_get0_DSA(get()); if (dsa == nullptr) return {}; return Dsa(dsa); +#endif } bool EVPKeyPointer::validateDsaParameters() const { @@ -2879,12 +3988,25 @@ bool EVPKeyPointer::validateDsaParameters() const { #else if (FIPS_mode() && EVP_PKEY_DSA == id()) { #endif +#if NCRYPTO_USE_OPENSSL3_PROVIDER + DeleteFnPtr p; + DeleteFnPtr q; + if (!GetPKeyBnParam(pkey_.get(), OSSL_PKEY_PARAM_FFC_P, &p) || + !GetPKeyBnParam(pkey_.get(), OSSL_PKEY_PARAM_FFC_Q, &q)) { + return false; + } + const BIGNUM* p_value = p.get(); + const BIGNUM* q_value = q.get(); +#else const DSA* dsa = EVP_PKEY_get0_DSA(pkey_.get()); const BIGNUM* p; const BIGNUM* q; DSA_get0_pqg(dsa, &p, &q, nullptr); - int L = BignumPointer::GetBitCount(p); - int N = BignumPointer::GetBitCount(q); + const BIGNUM* p_value = p; + const BIGNUM* q_value = q; +#endif + int L = BignumPointer::GetBitCount(p_value); + int N = BignumPointer::GetBitCount(q_value); return (L == 1024 && N == 160) || (L == 2048 && N == 224) || (L == 2048 && N == 256) || (L == 3072 && N == 256); @@ -2961,7 +4083,13 @@ bool SSLPointer::setSniContext(const SSLCtxPointer& ctx) const { EVP_PKEY* pkey = SSL_CTX_get0_privatekey(ctx.get()); STACK_OF(X509) * chain; int err = SSL_CTX_get0_chain_certs(ctx.get(), &chain); - if (err == 1) err = SSL_use_certificate(get(), x509); + if (err == 1) { + // SSL_use_certificate replaces only the certificate matching the key + // type. Clear all existing certificates so credentials from the default + // context cannot be selected for a different key type. + SSL_certs_clear(get()); + err = SSL_use_certificate(get(), x509); + } if (err == 1) err = SSL_use_PrivateKey(get(), pkey); if (err == 1 && chain != nullptr) err = SSL_set1_chain(get(), chain); return err == 1; @@ -3189,7 +4317,7 @@ const Cipher Cipher::FromNid(int nid) { } const Cipher Cipher::FromCtx(const CipherCtxPointer& ctx) { - return Cipher(EVP_CIPHER_CTX_cipher(ctx.get())); + return Cipher(GetCipherCtxCipher(ctx.get())); } const Cipher Cipher::EMPTY = Cipher(); @@ -3338,7 +4466,7 @@ int Cipher::bytesToKey(const Digest& digest, CipherCtxPointer CipherCtxPointer::New() { auto ret = CipherCtxPointer(EVP_CIPHER_CTX_new()); if (!ret) return {}; - EVP_CIPHER_CTX_init(ret.get()); + EVP_CIPHER_CTX_reset(ret.get()); return ret; } @@ -3602,8 +4730,15 @@ bool ECPointPointer::mul(const EC_GROUP* group, const BIGNUM* priv_key) { // ============================================================================ +#if NCRYPTO_USE_LEGACY_KEY_TYPES ECKeyPointer::ECKeyPointer() : key_(nullptr) {} +ECKeyPointer::ECKeyPointer(const EVPKeyPointer& key) : key_(nullptr) { + if (key.id() != EVP_PKEY_EC) return; + const EC_KEY* ec = key; + if (ec != nullptr) key_.reset(EC_KEY_dup(ec)); +} + ECKeyPointer::ECKeyPointer(EC_KEY* key) : key_(key) {} ECKeyPointer::ECKeyPointer(ECKeyPointer&& other) noexcept @@ -3724,6 +4859,20 @@ bool ECKeyPointer::checkKey() const { return Check(key_.get()); } +DataPointer ECKeyPointer::computeSecret(const ECPointPointer& peer) const { + if (!key_ || !peer) return {}; + const EC_GROUP* group = getGroup(); + const int field_size = EC_GROUP_get_degree(group); + const size_t out_len = (field_size + 7) / 8; + auto out = DataPointer::Alloc(out_len); + if (!out) return {}; + if (ECDH_compute_key( + out.get(), out.size(), peer.get(), key_.get(), nullptr) == 0) { + return {}; + } + return out; +} + ECKeyPointer ECKeyPointer::NewByCurveName(int nid) { return ECKeyPointer(EC_KEY_new_by_curve_name(nid)); } @@ -3734,6 +4883,262 @@ ECKeyPointer ECKeyPointer::New(const EC_GROUP* group) { if (!EC_KEY_set_group(ptr.get(), group)) return {}; return ptr; } +#else +ECKeyPointer::ECKeyPointer() : group_(nullptr), pub_(nullptr), priv_(nullptr) {} + +ECKeyPointer::ECKeyPointer(const EVPKeyPointer& key) : ECKeyPointer() { + if (key.id() != EVP_PKEY_EC) return; + char group_name[80]; + size_t group_name_len = 0; + if (EVP_PKEY_get_utf8_string_param(key.get(), + OSSL_PKEY_PARAM_GROUP_NAME, + group_name, + sizeof(group_name), + &group_name_len) != 1) { + return; + } + + const int nid = Ec::GetCurveIdFromName(group_name); + if (nid == NID_undef) return; + group_.reset(EC_GROUP_new_by_curve_name(nid)); + if (!group_) return; + + GetOptionalPKeyBnParam(key.get(), OSSL_PKEY_PARAM_PRIV_KEY, &priv_); + + size_t public_key_len = 0; + if (EVP_PKEY_get_octet_string_param( + key.get(), OSSL_PKEY_PARAM_PUB_KEY, nullptr, 0, &public_key_len) == + 1) { + auto public_key = DataPointer::Alloc(public_key_len); + if (!public_key || EVP_PKEY_get_octet_string_param( + key.get(), + OSSL_PKEY_PARAM_PUB_KEY, + static_cast(public_key.get()), + public_key.size(), + &public_key_len) != 1) { + reset(); + return; + } + + auto point = ECPointPointer::New(group_.get()); + if (!point || + !point.setFromBuffer( + {static_cast(public_key.get()), public_key_len}, + group_.get())) { + reset(); + return; + } + pub_.reset(point.release()); + } +} + +ECKeyPointer::ECKeyPointer(ECKeyPointer&& other) noexcept + : group_(std::move(other.group_)), + pub_(std::move(other.pub_)), + priv_(std::move(other.priv_)) {} + +ECKeyPointer& ECKeyPointer::operator=(ECKeyPointer&& other) noexcept { + group_ = std::move(other.group_); + pub_ = std::move(other.pub_); + priv_ = std::move(other.priv_); + return *this; +} + +ECKeyPointer::~ECKeyPointer() { + reset(); +} + +void ECKeyPointer::reset() { + group_.reset(); + pub_.reset(); + priv_.reset(); +} + +ECKeyPointer ECKeyPointer::clone() const { + if (!group_) return {}; + ECKeyPointer ret; + ret.group_.reset(EC_GROUP_dup(group_.get())); + if (!ret.group_) return {}; + if (pub_ != nullptr) { + ret.pub_.reset(EC_POINT_dup(pub_.get(), ret.group_.get())); + if (!ret.pub_) return {}; + } + if (priv_ != nullptr) { + ret.priv_.reset(BN_dup(priv_.get())); + if (!ret.priv_) return {}; + } + return ret; +} + +bool ECKeyPointer::generate() { + if (!group_) return false; + const int nid = EC_GROUP_get_curve_name(group_.get()); + auto ctx = EVPKeyCtxPointer::NewFromID(EVP_PKEY_EC); + if (!ctx || !ctx.initForKeygen() || + !ctx.setEcParameters(nid, OPENSSL_EC_NAMED_CURVE)) { + return false; + } + + EVP_PKEY* raw = nullptr; + if (EVP_PKEY_keygen(ctx.get(), &raw) != 1) return false; + EVPKeyPointer pkey(raw); + + DeleteFnPtr priv; + if (!GetPKeyBnParam(pkey.get(), OSSL_PKEY_PARAM_PRIV_KEY, &priv)) { + return false; + } + + size_t public_key_len = 0; + if (EVP_PKEY_get_octet_string_param( + pkey.get(), OSSL_PKEY_PARAM_PUB_KEY, nullptr, 0, &public_key_len) != + 1) { + return false; + } + + auto public_key = DataPointer::Alloc(public_key_len); + if (!public_key || EVP_PKEY_get_octet_string_param( + pkey.get(), + OSSL_PKEY_PARAM_PUB_KEY, + static_cast(public_key.get()), + public_key.size(), + &public_key_len) != 1) { + return false; + } + + auto point = ECPointPointer::New(group_.get()); + if (!point || + !point.setFromBuffer( + {static_cast(public_key.get()), public_key_len}, + group_.get())) { + return false; + } + + priv_ = std::move(priv); + pub_.reset(point.release()); + return true; +} + +bool ECKeyPointer::setPublicKey(const ECPointPointer& pub) { + if (!group_ || !pub) return false; + pub_.reset(EC_POINT_dup(pub.get(), group_.get())); + return pub_ != nullptr; +} + +bool ECKeyPointer::setPublicKeyRaw(const BignumPointer& x, + const BignumPointer& y) { + if (!group_ || !x || !y) return false; + const size_t field_len = (EC_GROUP_get_degree(group_.get()) + 7) / 8; + const size_t uncompressed_len = 1 + 2 * field_len; + auto buf = DataPointer::Alloc(uncompressed_len); + if (!buf) return false; + unsigned char* ptr = static_cast(buf.get()); + ptr[0] = POINT_CONVERSION_UNCOMPRESSED; + x.encodePaddedInto(ptr + 1, field_len); + y.encodePaddedInto(ptr + 1 + field_len, field_len); + + auto point = ECPointPointer::New(group_.get()); + if (!point || !point.setFromBuffer({ptr, uncompressed_len}, group_.get())) { + return false; + } + pub_.reset(point.release()); + return true; +} + +bool ECKeyPointer::setPrivateKey(const BignumPointer& priv) { + if (!group_ || !priv) return false; + priv_.reset(BN_dup(priv.get())); + return priv_ != nullptr; +} + +const BIGNUM* ECKeyPointer::getPrivateKey() const { + return priv_.get(); +} + +const EC_POINT* ECKeyPointer::getPublicKey() const { + return pub_.get(); +} + +const EC_GROUP* ECKeyPointer::getGroup() const { + return group_.get(); +} + +bool ECKeyPointer::checkKey() const { + if (!group_) return false; + + if (priv_ != nullptr) { + auto order = BignumPointer::New(); + if (!order || !EC_GROUP_get_order(group_.get(), order.get(), nullptr)) { + return false; + } + if (BN_is_zero(priv_.get()) || BN_is_negative(priv_.get()) || + BN_cmp(priv_.get(), order.get()) >= 0) { + return false; + } + } + + if (pub_ != nullptr && + EC_POINT_is_on_curve(group_.get(), pub_.get(), nullptr) != 1) { + return false; + } + + if (priv_ != nullptr && pub_ != nullptr) { + auto expected = ECPointPointer::New(group_.get()); + if (!expected || !expected.mul(group_.get(), priv_.get()) || + EC_POINT_cmp(group_.get(), expected.get(), pub_.get(), nullptr) != 0) { + return false; + } + } + + auto pkey = EVPKeyPointer::New(); + if (!pkey || !pkey.set(*this)) return false; + EVPKeyCtxPointer ctx(EVP_PKEY_CTX_new(pkey.get(), nullptr)); + if (!ctx) return false; + if (pub_ != nullptr && EVP_PKEY_public_check(ctx.get()) != 1) return false; + if (priv_ != nullptr && EVP_PKEY_private_check(ctx.get()) != 1) return false; + return true; +} + +DataPointer ECKeyPointer::computeSecret(const ECPointPointer& peer) const { + if (!group_ || !priv_ || !peer) return {}; + auto our_key = EVPKeyPointer::New(); + auto their_key = EVPKeyPointer::New(); + auto their_ec = ECKeyPointer::New(group_.get()); + if (!our_key || !their_key || !our_key.set(*this) || + !their_ec.setPublicKey(peer) || !their_key.set(their_ec)) { + return {}; + } + + EVPKeyCtxPointer ctx(EVP_PKEY_CTX_new(our_key.get(), nullptr)); + size_t out_len = 0; + if (!ctx || EVP_PKEY_derive_init(ctx.get()) != 1 || + EVP_PKEY_derive_set_peer(ctx.get(), their_key.get()) != 1 || + EVP_PKEY_derive(ctx.get(), nullptr, &out_len) != 1) { + return {}; + } + + auto out = DataPointer::Alloc(out_len); + if (!out) return {}; + if (EVP_PKEY_derive( + ctx.get(), static_cast(out.get()), &out_len) != 1) { + return {}; + } + return out.resize(out_len); +} + +ECKeyPointer ECKeyPointer::NewByCurveName(int nid) { + ECKeyPointer ret; + ret.group_.reset(EC_GROUP_new_by_curve_name(nid)); + return ret; +} + +ECKeyPointer ECKeyPointer::New(const EC_GROUP* group) { + ECKeyPointer ret; + if (group != nullptr) { + ret.group_.reset(EC_GROUP_dup(group)); + } + return ret; +} +#endif // NCRYPTO_USE_LEGACY_KEY_TYPES // ============================================================================ @@ -3828,8 +5233,33 @@ bool EVPKeyCtxPointer::setDsaParameters(uint32_t bits, bool EVPKeyCtxPointer::setEcParameters(int curve, int encoding) { if (!ctx_) return false; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + const char* group_name = OBJ_nid2sn(curve); + if (group_name == nullptr) return false; + + const char* encoding_name = nullptr; + switch (encoding) { + case OPENSSL_EC_EXPLICIT_CURVE: + encoding_name = OSSL_PKEY_EC_ENCODING_EXPLICIT; + break; + case OPENSSL_EC_NAMED_CURVE: + encoding_name = OSSL_PKEY_EC_ENCODING_GROUP; + break; + default: + return false; + } + OSSL_PARAM params[] = { + OSSL_PARAM_construct_utf8_string( + OSSL_PKEY_PARAM_GROUP_NAME, const_cast(group_name), 0), + OSSL_PARAM_construct_utf8_string( + OSSL_PKEY_PARAM_EC_ENCODING, const_cast(encoding_name), 0), + OSSL_PARAM_END, + }; + return EVP_PKEY_CTX_set_params(ctx_.get(), params) == 1; +#else return EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx_.get(), curve) == 1 && EVP_PKEY_CTX_set_ec_param_enc(ctx_.get(), encoding) == 1; +#endif } bool EVPKeyCtxPointer::setRsaOaepMd(const Digest& md) { @@ -3868,12 +5298,16 @@ bool EVPKeyCtxPointer::setRsaKeygenBits(int bits) { bool EVPKeyCtxPointer::setRsaKeygenPubExp(BignumPointer&& e) { if (!ctx_) return false; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + return EVP_PKEY_CTX_set1_rsa_keygen_pubexp(ctx_.get(), e.get()) == 1; +#else if (EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx_.get(), e.get()) == 1) { // The ctx_ takes ownership of e on success. e.release(); return true; } return false; +#endif } bool EVPKeyCtxPointer::setRsaPssKeygenMd(const Digest& md) { @@ -3927,7 +5361,7 @@ bool EVPKeyCtxPointer::setRsaOaepLabel(DataPointer&& data) { bool EVPKeyCtxPointer::setSignatureMd(const EVPMDCtxPointer& md) { if (!ctx_) return false; - return EVP_PKEY_CTX_set_signature_md(ctx_.get(), EVP_MD_CTX_md(md.get())) == + return EVP_PKEY_CTX_set_signature_md(ctx_.get(), GetDigestCtxMd(md.get())) == 1; } @@ -4117,26 +5551,276 @@ DataPointer CipherImpl(const EVPKeyPointer& key, } } // namespace -Rsa::Rsa() : rsa_(nullptr) {} +#if NCRYPTO_USE_OPENSSL3_PROVIDER +namespace { +int DigestAlgorithmIdentifierToNid(const unsigned char* data, size_t size) { + size_t sequence_header; + size_t sequence_len; + size_t sequence_total; + if (!ReadASN1Element( + data, size, 0x30, &sequence_header, &sequence_len, &sequence_total)) { + return NID_undef; + } + + size_t oid_header; + size_t oid_len; + size_t oid_total; + const unsigned char* oid = data + sequence_header; + if (!ReadASN1Element( + oid, sequence_len, 0x06, &oid_header, &oid_len, &oid_total)) { + return NID_undef; + } + + const unsigned char* oid_data = oid; + DeleteFnPtr obj( + d2i_ASN1_OBJECT(nullptr, &oid_data, oid_total)); + if (!obj) return NID_undef; + return OBJ_obj2nid(obj.get()); +} + +bool ReadRsaPssParams(const EVP_PKEY* pkey, Rsa::PssParams* params) { + const int der_len = i2d_PUBKEY(pkey, nullptr); + if (der_len <= 0) return false; + + auto der = DataPointer::Alloc(der_len); + if (!der) return false; + + auto serialized = static_cast(der.get()); + if (i2d_PUBKEY(pkey, &serialized) != der_len) return false; + + size_t outer_header; + size_t outer_len; + size_t outer_total; + const auto* data = static_cast(der.get()); + if (!ReadASN1Element( + data, der.size(), 0x30, &outer_header, &outer_len, &outer_total)) { + return false; + } + + size_t alg_header; + size_t alg_len; + size_t alg_total; + const unsigned char* alg = data + outer_header; + if (!ReadASN1Element( + alg, outer_len, 0x30, &alg_header, &alg_len, &alg_total)) { + return false; + } + + size_t oid_header; + size_t oid_len; + size_t oid_total; + const unsigned char* oid = alg + alg_header; + if (!ReadASN1Element(oid, alg_len, 0x06, &oid_header, &oid_len, &oid_total) || + oid_total == alg_len) { + return false; + } + + size_t pss_header; + size_t pss_len; + size_t pss_total; + const unsigned char* pss = oid + oid_total; + if (!ReadASN1Element( + pss, alg_len - oid_total, 0x30, &pss_header, &pss_len, &pss_total)) { + return false; + } + + const unsigned char* cursor = pss + pss_header; + size_t remaining = pss_len; + while (remaining > 0) { + const unsigned char tag = cursor[0]; + size_t item_header; + size_t item_len; + size_t item_total; + if (!ReadASN1Element( + cursor, remaining, tag, &item_header, &item_len, &item_total)) { + return false; + } + + const unsigned char* item = cursor + item_header; + switch (tag) { + case 0xa0: { + const int nid = DigestAlgorithmIdentifierToNid(item, item_len); + if (nid != NID_undef) params->digest = OBJ_nid2ln(nid); + break; + } + case 0xa1: { + size_t mgf_header; + size_t mgf_len; + size_t mgf_total; + if (!ReadASN1Element( + item, item_len, 0x30, &mgf_header, &mgf_len, &mgf_total)) { + return false; + } + const unsigned char* mgf = item + mgf_header; + size_t mgf_oid_header; + size_t mgf_oid_len; + size_t mgf_oid_total; + if (!ReadASN1Element(mgf, + mgf_len, + 0x06, + &mgf_oid_header, + &mgf_oid_len, + &mgf_oid_total) || + mgf_oid_total == mgf_len) { + return false; + } + const int nid = DigestAlgorithmIdentifierToNid(mgf + mgf_oid_total, + mgf_len - mgf_oid_total); + if (nid != NID_undef) params->mgf1_digest = OBJ_nid2ln(nid); + break; + } + case 0xa2: { + size_t int_header; + size_t int_len; + size_t int_total; + if (!ReadASN1Element( + item, item_len, 0x02, &int_header, &int_len, &int_total)) { + return false; + } + // TODO(panva): In a semver-major, reject malformed RSA-PSS parameters + // at key import instead of omitting asymmetricKeyDetails fields. + if (int_len == 0 || int_len > sizeof(uint64_t) || + (item[int_header] & 0x80) != 0) { + return false; + } + uint64_t salt_length = 0; + for (size_t n = 0; n < int_len; n++) { + salt_length = (salt_length << 8) | item[int_header + n]; + } + params->salt_length = static_cast(salt_length); + break; + } + } + + cursor += item_total; + remaining -= item_total; + } + + return true; +} + +bool SetRsaPssHashAlgorithm(X509_ALGOR** out, const Digest& digest) { + if (EVP_MD_is_a(digest.get(), "SHA1")) return true; + + X509AlgorPointer algorithm(X509_ALGOR_new()); + if (!algorithm) return false; + X509_ALGOR_set_md(algorithm.get(), digest.get()); + *out = algorithm.release(); + return true; +} + +bool SetRsaPssMaskGenAlgorithm(X509_ALGOR** out, const Digest& digest) { + if (EVP_MD_is_a(digest.get(), "SHA1")) return true; + + X509AlgorPointer hash_algorithm(X509_ALGOR_new()); + if (!hash_algorithm) return false; + X509_ALGOR_set_md(hash_algorithm.get(), digest.get()); + + ASN1StringPointer hash_algorithm_der(ASN1_item_pack( + hash_algorithm.get(), ASN1_ITEM_rptr(X509_ALGOR), nullptr)); + if (!hash_algorithm_der) return false; + + X509AlgorPointer algorithm(X509_ALGOR_new()); + if (!algorithm || X509_ALGOR_set0(algorithm.get(), + OBJ_nid2obj(NID_mgf1), + V_ASN1_SEQUENCE, + hash_algorithm_der.get()) != 1) { + return false; + } + hash_algorithm_der.release(); + *out = algorithm.release(); + return true; +} + +ASN1StringPointer EncodeRsaPssParams(const Rsa::PssParams& params) { + const Digest digest = Digest::FromName(params.digest.data()); + if (!digest) return {}; + + const Digest mgf1_digest = params.mgf1_digest + ? Digest::FromName(params.mgf1_digest->data()) + : digest; + if (!mgf1_digest) return {}; + + RsaPssParamsPointer pss(RSA_PSS_PARAMS_new()); + if (!pss || !SetRsaPssHashAlgorithm(&pss->hashAlgorithm, digest) || + !SetRsaPssMaskGenAlgorithm(&pss->maskGenAlgorithm, mgf1_digest)) { + return {}; + } + + if (params.salt_length != 20) { + pss->saltLength = ASN1_INTEGER_new(); + if (pss->saltLength == nullptr || + ASN1_INTEGER_set_int64(pss->saltLength, params.salt_length) != 1) { + return {}; + } + } + + return ASN1StringPointer( + ASN1_item_pack(pss.get(), ASN1_ITEM_rptr(RSA_PSS_PARAMS), nullptr)); +} +} // namespace +Rsa::Rsa() : rsa_(false) {} + +Rsa::Rsa(const EVP_PKEY* pkey) : Rsa() { + const int type = EVPKeyPointer::id(pkey); + if (type != EVP_PKEY_RSA && type != EVP_PKEY_RSA_PSS) return; + rsa_pss_ = type == EVP_PKEY_RSA_PSS; + if (!GetPKeyBnParam(pkey, OSSL_PKEY_PARAM_RSA_N, &n_) || + !GetPKeyBnParam(pkey, OSSL_PKEY_PARAM_RSA_E, &e_)) { + return; + } + if (!GetOptionalPKeyBnParam(pkey, OSSL_PKEY_PARAM_RSA_D, &d_) || + !GetOptionalPKeyBnParam(pkey, OSSL_PKEY_PARAM_RSA_FACTOR1, &p_) || + !GetOptionalPKeyBnParam(pkey, OSSL_PKEY_PARAM_RSA_FACTOR2, &q_) || + !GetOptionalPKeyBnParam(pkey, OSSL_PKEY_PARAM_RSA_EXPONENT1, &dp_) || + !GetOptionalPKeyBnParam(pkey, OSSL_PKEY_PARAM_RSA_EXPONENT2, &dq_) || + !GetOptionalPKeyBnParam(pkey, OSSL_PKEY_PARAM_RSA_COEFFICIENT1, &qi_)) { + return; + } + + if (type == EVP_PKEY_RSA_PSS) { + MarkPopErrorOnReturn pop_errors; + PssParams params; + if (ReadRsaPssParams(pkey, ¶ms)) pss_params_ = params; + } + + rsa_ = true; +} +#else +Rsa::Rsa() : rsa_(nullptr) {} Rsa::Rsa(OSSL3_CONST RSA* ptr) : rsa_(ptr) {} +#endif const Rsa::PublicKey Rsa::getPublicKey() const { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (!rsa_) return {}; + return PublicKey{n_.get(), e_.get(), d_.get()}; +#else if (rsa_ == nullptr) return {}; PublicKey key; RSA_get0_key(rsa_, &key.n, &key.e, &key.d); return key; +#endif } const Rsa::PrivateKey Rsa::getPrivateKey() const { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (!rsa_) return {}; + return PrivateKey{p_.get(), q_.get(), dp_.get(), dq_.get(), qi_.get()}; +#else if (rsa_ == nullptr) return {}; PrivateKey key; RSA_get0_factors(rsa_, &key.p, &key.q); RSA_get0_crt_params(rsa_, &key.dp, &key.dq, &key.qi); return key; +#endif } const std::optional Rsa::getPssParams() const { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + return pss_params_; +#else if (rsa_ == nullptr) return std::nullopt; const RSA_PSS_PARAMS* params = RSA_get0_pss_params(rsa_); if (params == nullptr) return std::nullopt; @@ -4169,16 +5853,64 @@ const std::optional Rsa::getPssParams() const { } } return ret; +#endif +} + +BIOPointer Rsa::derPublicKey() const { + auto bio = BIOPointer::NewMem(); + if (!bio) return {}; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + auto pkey = EVPKeyPointer::NewRSA(*this); + if (!pkey) return {}; + if (!rsa_pss_) { + if (i2d_PUBKEY_bio(bio.get(), pkey.get()) != 1) return {}; + return bio; + } + + X509_PUBKEY* raw_pubkey = nullptr; + const int result = X509_PUBKEY_set(&raw_pubkey, pkey.get()); + X509PubkeyPointer pubkey(raw_pubkey); + if (result != 1) return {}; + + int parameter_type = V_ASN1_UNDEF; + ASN1StringPointer parameters; + if (pss_params_) { + parameters = EncodeRsaPssParams(*pss_params_); + if (!parameters) return {}; + parameter_type = V_ASN1_SEQUENCE; + } + + if (X509_PUBKEY_set0_param(pubkey.get(), + OBJ_nid2obj(NID_rsaEncryption), + parameter_type, + parameters.get(), + nullptr, + 0) != 1) { + return {}; + } + parameters.release(); + if (i2d_X509_PUBKEY_bio(bio.get(), pubkey.get()) != 1) return {}; +#else + if (rsa_ == nullptr || i2d_RSA_PUBKEY_bio(bio.get(), rsa_) != 1) return {}; +#endif + return bio; } bool Rsa::setPublicKey(BignumPointer&& n, BignumPointer&& e) { if (!n || !e) return false; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + n_.reset(n.release()); + e_.reset(e.release()); + rsa_ = true; + return true; +#else if (RSA_set0_key(const_cast(rsa_), n.get(), e.get(), nullptr) == 1) { n.release(); e.release(); return true; } return false; +#endif } bool Rsa::setPrivateKey(BignumPointer&& d, @@ -4187,6 +5919,17 @@ bool Rsa::setPrivateKey(BignumPointer&& d, BignumPointer&& dp, BignumPointer&& dq, BignumPointer&& qi) { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (!d || !q || !p || !dp || !dq || !qi) return false; + d_.reset(d.release()); + q_.reset(q.release()); + p_.reset(p.release()); + dp_.reset(dp.release()); + dq_.reset(dq.release()); + qi_.reset(qi.release()); + rsa_ = n_ != nullptr && e_ != nullptr; + return rsa_; +#else if (!RSA_set0_key(const_cast(rsa_), nullptr, nullptr, d.get())) { return false; } @@ -4206,6 +5949,7 @@ bool Rsa::setPrivateKey(BignumPointer&& d, dq.release(); qi.release(); return true; +#endif } DataPointer Rsa::encrypt(const EVPKeyPointer& key, @@ -4328,12 +6072,99 @@ void Cipher::ForEach(Cipher::CipherNameCallback callback) { // ============================================================================ -Ec::Ec() : ec_(nullptr) {} +#if NCRYPTO_USE_OPENSSL3_PROVIDER +Ec::Ec() : ec_(nullptr), pub_(nullptr) {} + +Ec::Ec(const EVP_PKEY* pkey) : Ec() { + if (EVPKeyPointer::id(pkey) != EVP_PKEY_EC) return; + char group_name[80]; + size_t group_name_len = 0; + if (EVP_PKEY_get_utf8_string_param(pkey, + OSSL_PKEY_PARAM_GROUP_NAME, + group_name, + sizeof(group_name), + &group_name_len) != 1) { + return; + } + + const int nid = GetCurveIdFromName(group_name); + if (nid == NID_undef) return; + ec_.reset(EC_GROUP_new_by_curve_name(nid)); + if (!ec_) return; + + size_t public_key_len = 0; + if (EVP_PKEY_get_octet_string_param( + pkey, OSSL_PKEY_PARAM_PUB_KEY, nullptr, 0, &public_key_len) != 1) { + return; + } + + auto public_key = DataPointer::Alloc(public_key_len); + if (!public_key || + EVP_PKEY_get_octet_string_param( + pkey, + OSSL_PKEY_PARAM_PUB_KEY, + static_cast(public_key.get()), + public_key.size(), + &public_key_len) != 1 || + public_key_len == 0) { + ec_.reset(); + return; + } + + const auto* public_key_data = + static_cast(public_key.get()); + switch (public_key_data[0]) { + case POINT_CONVERSION_COMPRESSED: + case POINT_CONVERSION_COMPRESSED + 1: + form_ = POINT_CONVERSION_COMPRESSED; + break; + case POINT_CONVERSION_UNCOMPRESSED: + form_ = POINT_CONVERSION_UNCOMPRESSED; + break; + case POINT_CONVERSION_HYBRID: + case POINT_CONVERSION_HYBRID + 1: + form_ = POINT_CONVERSION_HYBRID; + break; + default: + ec_.reset(); + return; + } + auto point = ECPointPointer::New(ec_.get()); + if (!point || + !point.setFromBuffer({public_key_data, public_key_len}, ec_.get())) { + ec_.reset(); + return; + } + pub_.reset(point.release()); +} +#else +Ec::Ec() : ec_(nullptr) {} Ec::Ec(OSSL3_CONST EC_KEY* key) : ec_(key) {} +#endif const EC_GROUP* Ec::getGroup() const { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + return ec_.get(); +#else return ECKeyPointer::GetGroup(ec_); +#endif +} + +const EC_POINT* Ec::getPublicKey() const { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + return pub_.get(); +#else + return ECKeyPointer::GetPublicKey(ec_); +#endif +} + +point_conversion_form_t Ec::getPointConversionForm() const { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + return form_; +#else + return EC_KEY_get_conv_form(ec_); +#endif } int Ec::getCurve() const { @@ -4437,7 +6268,7 @@ size_t EVPMDCtxPointer::getDigestSize() const { const EVP_MD* EVPMDCtxPointer::getDigest() const { if (!ctx_) return nullptr; - return EVP_MD_CTX_md(ctx_.get()); + return GetDigestCtxMd(ctx_.get()); } bool EVPMDCtxPointer::hasXofFlag() const { @@ -4979,31 +6810,61 @@ std::pair X509Name::Iterator::operator*() const { // ============================================================================ -Dsa::Dsa() : dsa_(nullptr) {} +#if NCRYPTO_USE_OPENSSL3_PROVIDER +Dsa::Dsa() : dsa_(false) {} +Dsa::Dsa(const EVP_PKEY* pkey) : Dsa() { + if (EVPKeyPointer::id(pkey) != EVP_PKEY_DSA) return; + if (!GetPKeyBnParam(pkey, OSSL_PKEY_PARAM_FFC_P, &p_) || + !GetPKeyBnParam(pkey, OSSL_PKEY_PARAM_FFC_Q, &q_)) { + return; + } + dsa_ = true; +} +#else +Dsa::Dsa() : dsa_(nullptr) {} Dsa::Dsa(OSSL3_CONST DSA* dsa) : dsa_(dsa) {} +#endif const BIGNUM* Dsa::getP() const { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (!dsa_) return nullptr; + return p_.get(); +#else if (dsa_ == nullptr) return nullptr; const BIGNUM* p; DSA_get0_pqg(dsa_, &p, nullptr, nullptr); return p; +#endif } const BIGNUM* Dsa::getQ() const { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (!dsa_) return nullptr; + return q_.get(); +#else if (dsa_ == nullptr) return nullptr; const BIGNUM* q; DSA_get0_pqg(dsa_, nullptr, &q, nullptr); return q; +#endif } size_t Dsa::getModulusLength() const { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (!dsa_) return 0; +#else if (dsa_ == nullptr) return 0; +#endif return BignumPointer::GetBitCount(getP()); } size_t Dsa::getDivisorLength() const { +#if NCRYPTO_USE_OPENSSL3_PROVIDER + if (!dsa_) return 0; +#else if (dsa_ == nullptr) return 0; +#endif return BignumPointer::GetBitCount(getQ()); } diff --git a/deps/ncrypto/ncrypto.gyp b/deps/ncrypto/ncrypto.gyp index 1747f3ea0149..804a664fa0a2 100644 --- a/deps/ncrypto/ncrypto.gyp +++ b/deps/ncrypto/ncrypto.gyp @@ -2,10 +2,25 @@ 'variables': { 'ncrypto_bssl_libdecrepit_missing%': 1, 'ncrypto_sources': [ - 'engine.cc', 'ncrypto.cc', 'ncrypto.h', ], + 'ncrypto_engine_sources': [ + 'engine.cc', + 'ncrypto.h', + ], + 'ncrypto_strict_defines': [ + 'OPENSSL_API_COMPAT=30000', + 'OPENSSL_NO_DEPRECATED', + ], + 'ncrypto_legacy_openssl_defines': [ + 'OPENSSL_API_COMPAT=0x10100000L', + ], + 'ncrypto_engine_defines': [ + 'OPENSSL_API_COMPAT=30000', + 'OPENSSL_SUPPRESS_DEPRECATED', + 'NCRYPTO_ENGINE_COMPAT=1', + ], }, 'targets': [ { @@ -20,9 +35,25 @@ 'defines': [ 'NCRYPTO_BSSL_LIBDECREPIT_MISSING=<(ncrypto_bssl_libdecrepit_missing)', ], + 'conditions': [ + ['openssl_is_boringssl=="false" and openssl_version >= 0x3000000f', { + 'defines!': [ '<@(ncrypto_legacy_openssl_defines)' ], + 'defines': [ '<@(ncrypto_strict_defines)' ], + }], + ], }, 'sources': [ '<@(ncrypto_sources)' ], 'conditions': [ + ['openssl_is_boringssl=="false" and openssl_version >= 0x3000000f', { + 'defines!': [ '<@(ncrypto_legacy_openssl_defines)' ], + 'defines': [ '<@(ncrypto_strict_defines)' ], + 'dependencies': [ + 'ncrypto_engine', + ], + }], + ['openssl_is_boringssl=="false" and openssl_version < 0x3000000f', { + 'sources': [ '<@(ncrypto_engine_sources)' ], + }], ['node_shared_openssl=="false"', { 'dependencies': [ '../openssl/openssl.gyp:openssl' @@ -30,5 +61,28 @@ }], ] }, - ] + ], + 'conditions': [ + ['openssl_is_boringssl=="false" and openssl_version >= 0x3000000f', { + 'targets': [ + { + 'target_name': 'ncrypto_engine', + 'type': 'static_library', + 'include_dirs': ['.'], + 'defines': [ + 'NCRYPTO_BSSL_LIBDECREPIT_MISSING=<(ncrypto_bssl_libdecrepit_missing)', + '<@(ncrypto_engine_defines)', + ], + 'sources': [ '<@(ncrypto_engine_sources)' ], + 'conditions': [ + ['node_shared_openssl=="false"', { + 'dependencies': [ + '../openssl/openssl.gyp:openssl' + ] + }], + ] + }, + ], + }], + ], } diff --git a/deps/ncrypto/ncrypto.h b/deps/ncrypto/ncrypto.h index b79962d5a85c..6fb6b384fd4f 100644 --- a/deps/ncrypto/ncrypto.h +++ b/deps/ncrypto/ncrypto.h @@ -19,9 +19,10 @@ #include #include #include -#ifndef OPENSSL_NO_ENGINE +#if defined(NCRYPTO_ENGINE_COMPAT) && NCRYPTO_ENGINE_COMPAT && \ + !defined(OPENSSL_NO_ENGINE) #include -#endif // !OPENSSL_NO_ENGINE +#endif // NCRYPTO_ENGINE_COMPAT && !OPENSSL_NO_ENGINE #ifndef OPENSSL_VERSION_PREREQ #define OPENSSL_VERSION_PREREQ(maj, min) \ @@ -40,6 +41,40 @@ #define NCRYPTO_USE_BORINGSSL_EVP_DO_ALL_FALLBACK 0 #endif +// Backend split: +// - OpenSSL >= 3 uses provider APIs and hides deprecated low-level objects. +// - BoringSSL has its own API-compatible branch. +// - OpenSSL < 3 remains the legacy fallback branch. +#if !defined(OPENSSL_IS_BORINGSSL) && OPENSSL_VERSION_PREREQ(3, 0) +#define NCRYPTO_USE_OPENSSL3_PROVIDER 1 +#else +#define NCRYPTO_USE_OPENSSL3_PROVIDER 0 +#endif + +#ifdef OPENSSL_IS_BORINGSSL +#define NCRYPTO_USE_BORINGSSL 1 +#else +#define NCRYPTO_USE_BORINGSSL 0 +#endif + +#if !NCRYPTO_USE_OPENSSL3_PROVIDER && !NCRYPTO_USE_BORINGSSL +#define NCRYPTO_USE_LEGACY_OPENSSL 1 +#else +#define NCRYPTO_USE_LEGACY_OPENSSL 0 +#endif + +#if NCRYPTO_USE_BORINGSSL || NCRYPTO_USE_LEGACY_OPENSSL +#define NCRYPTO_USE_LEGACY_KEY_TYPES 1 +#else +#define NCRYPTO_USE_LEGACY_KEY_TYPES 0 +#endif + +#if NCRYPTO_USE_OPENSSL3_PROVIDER +#include +#include +#include +#endif + // The FIPS-related functions are only available // when the OpenSSL itself was compiled with FIPS support. #if defined(OPENSSL_FIPS) && !OPENSSL_VERSION_PREREQ(3, 0) @@ -112,7 +147,6 @@ #define EVP_PKEY_ML_KEM_512 NID_ML_KEM_512 #define EVP_PKEY_ML_KEM_768 NID_ML_KEM_768 #define EVP_PKEY_ML_KEM_1024 NID_ML_KEM_1024 -#include #elif OPENSSL_WITH_BORINGSSL_PQC #define EVP_PKEY_ML_KEM_768 NID_ML_KEM_768 #define EVP_PKEY_ML_KEM_1024 NID_ML_KEM_1024 @@ -303,7 +337,9 @@ template using DeleteFnPtr = typename FunctionDeleter::Pointer; using PKCS8Pointer = DeleteFnPtr; +#if NCRYPTO_USE_LEGACY_KEY_TYPES using RSAPointer = DeleteFnPtr; +#endif using SSLSessionPointer = DeleteFnPtr; class BIOPointer; @@ -502,11 +538,23 @@ class Cipher final { class Dsa final { public: Dsa(); +#if NCRYPTO_USE_OPENSSL3_PROVIDER + explicit Dsa(const EVP_PKEY* pkey); +#else Dsa(OSSL3_CONST DSA* dsa); +#endif NCRYPTO_DISALLOW_COPY_AND_MOVE(Dsa) +#if NCRYPTO_USE_OPENSSL3_PROVIDER + inline operator bool() const { + return dsa_; + } +#else inline operator bool() const { return dsa_ != nullptr; } +#endif +#if NCRYPTO_USE_LEGACY_KEY_TYPES inline operator OSSL3_CONST DSA*() const { return dsa_; } +#endif const BIGNUM* getP() const; const BIGNUM* getQ() const; @@ -514,7 +562,13 @@ class Dsa final { size_t getDivisorLength() const; private: +#if NCRYPTO_USE_OPENSSL3_PROVIDER + bool dsa_ = false; + DeleteFnPtr p_; + DeleteFnPtr q_; +#else OSSL3_CONST DSA* dsa_; +#endif }; // ============================================================================ @@ -523,11 +577,23 @@ class Dsa final { class Rsa final { public: Rsa(); +#if NCRYPTO_USE_OPENSSL3_PROVIDER + explicit Rsa(const EVP_PKEY* pkey); +#else Rsa(OSSL3_CONST RSA* rsa); +#endif NCRYPTO_DISALLOW_COPY_AND_MOVE(Rsa) +#if NCRYPTO_USE_OPENSSL3_PROVIDER + inline operator bool() const { + return rsa_; + } +#else inline operator bool() const { return rsa_ != nullptr; } +#endif +#if NCRYPTO_USE_LEGACY_KEY_TYPES inline operator OSSL3_CONST RSA*() const { return rsa_; } +#endif struct PublicKey { const BIGNUM* n; @@ -561,6 +627,8 @@ class Rsa final { using CipherParams = Cipher::CipherParams; + BIOPointer derPublicKey() const; + static DataPointer encrypt(const EVPKeyPointer& key, const CipherParams& params, const Buffer in); @@ -569,20 +637,42 @@ class Rsa final { const Buffer in); private: +#if NCRYPTO_USE_OPENSSL3_PROVIDER + bool rsa_ = false; + bool rsa_pss_ = false; + DeleteFnPtr n_; + DeleteFnPtr e_; + DeleteFnPtr d_; + DeleteFnPtr p_; + DeleteFnPtr q_; + DeleteFnPtr dp_; + DeleteFnPtr dq_; + DeleteFnPtr qi_; + std::optional pss_params_; +#else OSSL3_CONST RSA* rsa_; +#endif }; class Ec final { public: Ec(); +#if NCRYPTO_USE_OPENSSL3_PROVIDER + explicit Ec(const EVP_PKEY* pkey); +#else Ec(OSSL3_CONST EC_KEY* key); +#endif NCRYPTO_DISALLOW_COPY_AND_MOVE(Ec) const EC_GROUP* getGroup() const; + const EC_POINT* getPublicKey() const; + point_conversion_form_t getPointConversionForm() const; int getCurve() const; inline operator bool() const { return ec_ != nullptr; } +#if NCRYPTO_USE_LEGACY_KEY_TYPES inline operator OSSL3_CONST EC_KEY*() const { return ec_; } +#endif static int GetCurveIdFromName(const char* name); @@ -590,7 +680,13 @@ class Ec final { static bool GetCurves(GetCurveCallback callback); private: +#if NCRYPTO_USE_OPENSSL3_PROVIDER + DeleteFnPtr ec_; + DeleteFnPtr pub_; + point_conversion_form_t form_ = POINT_CONVERSION_UNCOMPRESSED; +#else OSSL3_CONST EC_KEY* ec_ = nullptr; +#endif }; // A managed pointer to a buffer of data. When destroyed the underlying @@ -926,7 +1022,11 @@ class EVPKeyPointer final { const Buffer& data); #endif static EVPKeyPointer NewDH(DHPointer&& dh); +#if NCRYPTO_USE_OPENSSL3_PROVIDER + static EVPKeyPointer NewRSA(const Rsa& rsa); +#else static EVPKeyPointer NewRSA(RSAPointer&& rsa); +#endif enum class PKEncodingType { // RSAPublicKey / RSAPrivateKey according to PKCS#1. @@ -998,7 +1098,9 @@ class EVPKeyPointer final { bool assign(const ECKeyPointer& eckey); bool set(const ECKeyPointer& eckey); +#if NCRYPTO_USE_LEGACY_KEY_TYPES operator const EC_KEY*() const; +#endif inline bool operator==(std::nullptr_t) const noexcept { return pkey_ == nullptr; @@ -1070,29 +1172,53 @@ class DHPointer final { static DHPointer New(size_t bits, unsigned int generator); DHPointer() = default; +#if NCRYPTO_USE_OPENSSL3_PROVIDER + explicit DHPointer(EVPKeyPointer&& key, const char* group_name = nullptr); + DHPointer(BignumPointer&& p, BignumPointer&& g, const char* group_name); +#else explicit DHPointer(DH* dh); +#endif DHPointer(DHPointer&& other) noexcept; DHPointer& operator=(DHPointer&& other) noexcept; NCRYPTO_DISALLOW_COPY(DHPointer) ~DHPointer(); +#if NCRYPTO_USE_OPENSSL3_PROVIDER + inline bool operator==(std::nullptr_t) noexcept { + return !operator bool(); + } + inline operator bool() const { + return dh_ != nullptr || (p_ && g_); + } +#else inline bool operator==(std::nullptr_t) noexcept { return dh_ == nullptr; } inline operator bool() const { return dh_ != nullptr; } +#endif +#if NCRYPTO_USE_LEGACY_KEY_TYPES inline DH* get() const { return dh_.get(); } void reset(DH* dh = nullptr); DH* release(); +#else + inline EVP_PKEY* get() const { + return dh_.get(); + } + void reset(EVP_PKEY* dh = nullptr); + EVP_PKEY* release(); +#endif enum class CheckResult { NONE, - P_NOT_PRIME = DH_CHECK_P_NOT_PRIME, - P_NOT_SAFE_PRIME = DH_CHECK_P_NOT_SAFE_PRIME, - UNABLE_TO_CHECK_GENERATOR = DH_UNABLE_TO_CHECK_GENERATOR, - NOT_SUITABLE_GENERATOR = DH_NOT_SUITABLE_GENERATOR, - Q_NOT_PRIME = DH_CHECK_Q_NOT_PRIME, + P_NOT_PRIME = 0x01, + P_NOT_SAFE_PRIME = 0x02, + UNABLE_TO_CHECK_GENERATOR = 0x04, + NOT_SUITABLE_GENERATOR = 0x08, + Q_NOT_PRIME = 0x10, #ifndef OPENSSL_IS_BORINGSSL // Boringssl does not define the DH_CHECK_INVALID_[Q or J]_VALUE - INVALID_Q = DH_CHECK_INVALID_Q_VALUE, - INVALID_J = DH_CHECK_INVALID_J_VALUE, + INVALID_Q = 0x20, + INVALID_J = 0x40, + MODULUS_TOO_SMALL = 0x80, + MODULUS_TOO_LARGE = 0x100, #endif CHECK_FAILED = 512, }; @@ -1114,10 +1240,12 @@ class DHPointer final { CheckPublicKeyResult checkPublicKey(const BignumPointer& pub_key); DataPointer getPrime() const; + size_t getPrimeBits() const; DataPointer getGenerator() const; DataPointer getPublicKey() const; DataPointer getPrivateKey() const; - DataPointer generateKeys() const; + bool hasPrivateKey() const; + DataPointer generateKeys(); DataPointer computeSecret(const BignumPointer& peer) const; bool setPublicKey(BignumPointer&& key); @@ -1129,7 +1257,16 @@ class DHPointer final { const EVPKeyPointer& theirKey); private: +#if NCRYPTO_USE_OPENSSL3_PROVIDER + DeleteFnPtr dh_; + BignumPointer p_; + BignumPointer g_; + BignumPointer pub_key_; + BignumPointer pvt_key_; + const char* group_name_ = nullptr; +#else DeleteFnPtr dh_; +#endif }; struct StackOfX509Deleter { @@ -1438,20 +1575,38 @@ class ECPointPointer final { }; class ECKeyPointer final { + friend class EVPKeyPointer; + public: ECKeyPointer(); + explicit ECKeyPointer(const EVPKeyPointer& key); +#if NCRYPTO_USE_LEGACY_KEY_TYPES explicit ECKeyPointer(EC_KEY* key); +#endif ECKeyPointer(ECKeyPointer&& other) noexcept; ECKeyPointer& operator=(ECKeyPointer&& other) noexcept; NCRYPTO_DISALLOW_COPY(ECKeyPointer) ~ECKeyPointer(); +#if NCRYPTO_USE_OPENSSL3_PROVIDER + inline bool operator==(std::nullptr_t) noexcept { + return group_ == nullptr; + } + inline operator bool() const { + return group_ != nullptr; + } +#else inline bool operator==(std::nullptr_t) noexcept { return key_ == nullptr; } inline operator bool() const { return key_ != nullptr; } +#endif +#if NCRYPTO_USE_LEGACY_KEY_TYPES inline EC_KEY* get() const { return key_.get(); } inline operator EC_KEY*() const { return key_.get(); } void reset(EC_KEY* key = nullptr); EC_KEY* release(); +#else + void reset(); +#endif ECKeyPointer clone() const; bool setPrivateKey(const BignumPointer& priv); @@ -1459,6 +1614,7 @@ class ECKeyPointer final { bool setPublicKeyRaw(const BignumPointer& x, const BignumPointer& y); bool generate(); bool checkKey() const; + DataPointer computeSecret(const ECPointPointer& peer) const; const EC_GROUP* getGroup() const; const BIGNUM* getPrivateKey() const; @@ -1467,14 +1623,22 @@ class ECKeyPointer final { static ECKeyPointer New(const EC_GROUP* group); static ECKeyPointer NewByCurveName(int nid); +#if NCRYPTO_USE_LEGACY_KEY_TYPES static const EC_POINT* GetPublicKey(const EC_KEY* key); static const BIGNUM* GetPrivateKey(const EC_KEY* key); static const EC_GROUP* GetGroup(const EC_KEY* key); static int GetGroupName(const EC_KEY* key); static bool Check(const EC_KEY* key); +#endif private: +#if NCRYPTO_USE_OPENSSL3_PROVIDER + DeleteFnPtr group_; + DeleteFnPtr pub_; + DeleteFnPtr priv_; +#else DeleteFnPtr key_; +#endif }; class EVPMDCtxPointer final { @@ -1641,24 +1805,23 @@ class EnginePointer final { public: EnginePointer() = default; - explicit EnginePointer(ENGINE* engine_, bool finish_on_exit = false); + explicit EnginePointer(void* engine_, bool finish_on_exit = false); EnginePointer(EnginePointer&& other) noexcept; EnginePointer& operator=(EnginePointer&& other) noexcept; NCRYPTO_DISALLOW_COPY(EnginePointer) ~EnginePointer(); inline operator bool() const { return engine != nullptr; } - inline ENGINE* get() { return engine; } inline void setFinishOnExit() { finish_on_exit = true; } - void reset(ENGINE* engine_ = nullptr, bool finish_on_exit_ = false); + void reset(void* engine_ = nullptr, bool finish_on_exit_ = false); bool setAsDefault(uint32_t flags, CryptoErrorList* errors = nullptr); bool init(bool finish_on_exit = false); EVPKeyPointer loadPrivateKey(const char* key_name); + bool setClientCertEngine(SSL_CTX* ctx); - // Release ownership of the ENGINE* pointer. - ENGINE* release(); + void* release(); // Retrieve an OpenSSL Engine instance by name. If the name does not // identify a valid named engine, the returned EnginePointer will be @@ -1670,7 +1833,7 @@ class EnginePointer final { static void initEnginesOnce(); private: - ENGINE* engine = nullptr; + void* engine = nullptr; bool finish_on_exit = false; }; #endif // !OPENSSL_NO_ENGINE diff --git a/deps/ncrypto/unofficial.gni b/deps/ncrypto/unofficial.gni index 7cb27d22b9b8..dad4fbbf16f0 100644 --- a/deps/ncrypto/unofficial.gni +++ b/deps/ncrypto/unofficial.gni @@ -26,7 +26,11 @@ template("ncrypto_gn_build") { source_set(target_name) { forward_variables_from(invoker, "*") public_configs = [ ":ncrypto_config" ] - sources = gypi_values.ncrypto_sources + defines = [ + "NCRYPTO_ENGINE_COMPAT=1", + "OPENSSL_SUPPRESS_DEPRECATED", + ] + sources = gypi_values.ncrypto_sources + gypi_values.ncrypto_engine_sources deps = [ "$node_openssl_path" ] } } diff --git a/deps/nghttp2/lib/Makefile.in b/deps/nghttp2/lib/Makefile.in index bb458a182c9f..128fb2912582 100644 --- a/deps/nghttp2/lib/Makefile.in +++ b/deps/nghttp2/lib/Makefile.in @@ -329,7 +329,7 @@ EXTRA_DEFS = @EXTRA_DEFS@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ -HAVE_CXX20 = @HAVE_CXX20@ +HAVE_CXX23 = @HAVE_CXX23@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ diff --git a/deps/nghttp2/lib/includes/Makefile.in b/deps/nghttp2/lib/includes/Makefile.in index a4687390385c..833a90fb3399 100644 --- a/deps/nghttp2/lib/includes/Makefile.in +++ b/deps/nghttp2/lib/includes/Makefile.in @@ -234,7 +234,7 @@ EXTRA_DEFS = @EXTRA_DEFS@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ -HAVE_CXX20 = @HAVE_CXX20@ +HAVE_CXX23 = @HAVE_CXX23@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ diff --git a/deps/nghttp2/lib/includes/nghttp2/nghttp2.h b/deps/nghttp2/lib/includes/nghttp2/nghttp2.h index 55baba71bdaf..2a494894d2d7 100644 --- a/deps/nghttp2/lib/includes/nghttp2/nghttp2.h +++ b/deps/nghttp2/lib/includes/nghttp2/nghttp2.h @@ -664,12 +664,12 @@ typedef enum { * The ALTSVC frame, which is defined in `RFC 7383 * `_. */ - NGHTTP2_ALTSVC = 0x0a, + NGHTTP2_ALTSVC = 0x0A, /** * The ORIGIN frame, which is defined by `RFC 8336 * `_. */ - NGHTTP2_ORIGIN = 0x0c, + NGHTTP2_ORIGIN = 0x0C, /** * The PRIORITY_UPDATE frame, which is defined by :rfc:`9218`. */ @@ -756,7 +756,7 @@ typedef enum { * * .. warning:: * - * Deprecated. The initial max concurrent streams is 0xffffffffu. + * Deprecated. The initial max concurrent streams is 0xFFFFFFFFU. * * Default maximum number of incoming concurrent streams. Use * `nghttp2_submit_settings()` with @@ -818,19 +818,19 @@ typedef enum { /** * CONNECT_ERROR */ - NGHTTP2_CONNECT_ERROR = 0x0a, + NGHTTP2_CONNECT_ERROR = 0x0A, /** * ENHANCE_YOUR_CALM */ - NGHTTP2_ENHANCE_YOUR_CALM = 0x0b, + NGHTTP2_ENHANCE_YOUR_CALM = 0x0B, /** * INADEQUATE_SECURITY */ - NGHTTP2_INADEQUATE_SECURITY = 0x0c, + NGHTTP2_INADEQUATE_SECURITY = 0x0C, /** * HTTP_1_1_REQUIRED */ - NGHTTP2_HTTP_1_1_REQUIRED = 0x0d + NGHTTP2_HTTP_1_1_REQUIRED = 0x0D } nghttp2_error_code; /** diff --git a/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h b/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h index 83fabdeeb95d..6c1a73206f3b 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.69.0" +#define NGHTTP2_VERSION "1.70.0" /** * @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 0x014500 +#define NGHTTP2_VERSION_NUM 0x014600 #endif /* NGHTTP2VER_H */ diff --git a/deps/nghttp2/lib/nghttp2_buf.c b/deps/nghttp2/lib/nghttp2_buf.c index 15cd674a650f..ddd609817a11 100644 --- a/deps/nghttp2/lib/nghttp2_buf.c +++ b/deps/nghttp2/lib/nghttp2_buf.c @@ -29,13 +29,7 @@ #include "nghttp2_helper.h" #include "nghttp2_debug.h" -void nghttp2_buf_init(nghttp2_buf *buf) { - buf->begin = NULL; - buf->end = NULL; - buf->pos = NULL; - buf->last = NULL; - buf->mark = NULL; -} +void nghttp2_buf_init(nghttp2_buf *buf) { *buf = (nghttp2_buf){0}; } int nghttp2_buf_init2(nghttp2_buf *buf, size_t initial, nghttp2_mem *mem) { nghttp2_buf_init(buf); @@ -212,16 +206,15 @@ int nghttp2_bufs_wrap_init(nghttp2_bufs *bufs, uint8_t *begin, size_t len, nghttp2_buf_wrap_init(&chain->buf, begin, len); - bufs->mem = mem; - bufs->offset = 0; - - bufs->head = chain; - bufs->cur = bufs->head; - - bufs->chunk_length = len; - bufs->chunk_used = 1; - bufs->max_chunk = 1; - bufs->chunk_keep = 1; + *bufs = (nghttp2_bufs){ + .head = chain, + .cur = chain, + .mem = mem, + .chunk_length = len, + .max_chunk = 1, + .chunk_used = 1, + .chunk_keep = 1, + }; return 0; } @@ -251,17 +244,15 @@ int nghttp2_bufs_wrap_init2(nghttp2_bufs *bufs, const nghttp2_vec *vec, dst_chain = &cur_chain->next; } - bufs->mem = mem; - bufs->offset = 0; - - bufs->head = head_chain; - bufs->cur = bufs->head; - - /* We don't use chunk_length since no allocation is expected. */ - bufs->chunk_length = 0; - bufs->chunk_used = veclen; - bufs->max_chunk = veclen; - bufs->chunk_keep = veclen; + *bufs = (nghttp2_bufs){ + .head = head_chain, + .cur = head_chain, + .mem = mem, + /* We don't use chunk_length since no allocation is expected. */ + .max_chunk = veclen, + .chunk_used = veclen, + .chunk_keep = veclen, + }; return 0; } diff --git a/deps/nghttp2/lib/nghttp2_extpri.c b/deps/nghttp2/lib/nghttp2_extpri.c index ba0263e7c8eb..a282a4c9ee88 100644 --- a/deps/nghttp2/lib/nghttp2_extpri.c +++ b/deps/nghttp2/lib/nghttp2_extpri.c @@ -31,8 +31,10 @@ uint8_t nghttp2_extpri_to_uint8(const nghttp2_extpri *extpri) { } void nghttp2_extpri_from_uint8(nghttp2_extpri *extpri, uint8_t u8extpri) { - extpri->urgency = nghttp2_extpri_uint8_urgency(u8extpri); - extpri->inc = nghttp2_extpri_uint8_inc(u8extpri); + *extpri = (nghttp2_extpri){ + .urgency = nghttp2_extpri_uint8_urgency(u8extpri), + .inc = nghttp2_extpri_uint8_inc(u8extpri), + }; } int nghttp2_extpri_parse_priority(nghttp2_extpri *extpri, const uint8_t *value, diff --git a/deps/nghttp2/lib/nghttp2_extpri.h b/deps/nghttp2/lib/nghttp2_extpri.h index 2e0391653b2c..981698c7ae63 100644 --- a/deps/nghttp2/lib/nghttp2_extpri.h +++ b/deps/nghttp2/lib/nghttp2_extpri.h @@ -36,7 +36,7 @@ * NGHTTP2_EXTPRI_INC_MASK is a bit mask to retrieve incremental bit * from a value produced by nghttp2_extpri_to_uint8. */ -#define NGHTTP2_EXTPRI_INC_MASK (1 << 7) +#define NGHTTP2_EXTPRI_INC_MASK 0x80U /* * nghttp2_extpri_to_uint8 encodes |pri| into uint8_t variable. diff --git a/deps/nghttp2/lib/nghttp2_frame.c b/deps/nghttp2/lib/nghttp2_frame.c index 264ae9d38e02..657607aed54d 100644 --- a/deps/nghttp2/lib/nghttp2_frame.c +++ b/deps/nghttp2/lib/nghttp2_frame.c @@ -43,20 +43,22 @@ void nghttp2_frame_pack_frame_hd(uint8_t *buf, const nghttp2_frame_hd *hd) { } void nghttp2_frame_unpack_frame_hd(nghttp2_frame_hd *hd, const uint8_t *buf) { - hd->length = nghttp2_get_uint32(&buf[0]) >> 8; - hd->type = buf[3]; - hd->flags = buf[4]; - hd->stream_id = nghttp2_get_uint32(&buf[5]) & NGHTTP2_STREAM_ID_MASK; - hd->reserved = 0; + *hd = (nghttp2_frame_hd){ + .length = nghttp2_get_uint32(&buf[0]) >> 8, + .stream_id = nghttp2_get_uint32(&buf[5]) & NGHTTP2_STREAM_ID_MASK, + .type = buf[3], + .flags = buf[4], + }; } void nghttp2_frame_hd_init(nghttp2_frame_hd *hd, size_t length, uint8_t type, uint8_t flags, int32_t stream_id) { - hd->length = length; - hd->type = type; - hd->flags = flags; - hd->stream_id = stream_id; - hd->reserved = 0; + *hd = (nghttp2_frame_hd){ + .length = length, + .stream_id = stream_id, + .type = type, + .flags = flags, + }; } void nghttp2_frame_headers_init(nghttp2_headers *frame, uint8_t flags, @@ -199,16 +201,15 @@ void nghttp2_frame_extension_free(nghttp2_extension *frame) { (void)frame; } void nghttp2_frame_altsvc_init(nghttp2_extension *frame, int32_t stream_id, uint8_t *origin, size_t origin_len, uint8_t *field_value, size_t field_value_len) { - nghttp2_ext_altsvc *altsvc; - nghttp2_frame_hd_init(&frame->hd, 2 + origin_len + field_value_len, NGHTTP2_ALTSVC, NGHTTP2_FLAG_NONE, stream_id); - altsvc = frame->payload; - altsvc->origin = origin; - altsvc->origin_len = origin_len; - altsvc->field_value = field_value; - altsvc->field_value_len = field_value_len; + *(nghttp2_ext_altsvc *)frame->payload = (nghttp2_ext_altsvc){ + .origin = origin, + .origin_len = origin_len, + .field_value = field_value, + .field_value_len = field_value_len, + }; } void nghttp2_frame_altsvc_free(nghttp2_extension *frame, nghttp2_mem *mem) { @@ -225,7 +226,6 @@ void nghttp2_frame_altsvc_free(nghttp2_extension *frame, nghttp2_mem *mem) { void nghttp2_frame_origin_init(nghttp2_extension *frame, nghttp2_origin_entry *ov, size_t nov) { - nghttp2_ext_origin *origin; size_t payloadlen = 0; size_t i; @@ -236,9 +236,10 @@ void nghttp2_frame_origin_init(nghttp2_extension *frame, nghttp2_frame_hd_init(&frame->hd, payloadlen, NGHTTP2_ORIGIN, NGHTTP2_FLAG_NONE, 0); - origin = frame->payload; - origin->ov = ov; - origin->nov = nov; + *(nghttp2_ext_origin *)frame->payload = (nghttp2_ext_origin){ + .ov = ov, + .nov = nov, + }; } void nghttp2_frame_origin_free(nghttp2_extension *frame, nghttp2_mem *mem) { @@ -256,15 +257,15 @@ void nghttp2_frame_origin_free(nghttp2_extension *frame, nghttp2_mem *mem) { void nghttp2_frame_priority_update_init(nghttp2_extension *frame, int32_t stream_id, uint8_t *field_value, size_t field_value_len) { - nghttp2_ext_priority_update *priority_update; - nghttp2_frame_hd_init(&frame->hd, 4 + field_value_len, NGHTTP2_PRIORITY_UPDATE, NGHTTP2_FLAG_NONE, 0); - priority_update = frame->payload; - priority_update->stream_id = stream_id; - priority_update->field_value = field_value; - priority_update->field_value_len = field_value_len; + *(nghttp2_ext_priority_update *)frame->payload = + (nghttp2_ext_priority_update){ + .stream_id = stream_id, + .field_value = field_value, + .field_value_len = field_value_len, + }; } void nghttp2_frame_priority_update_free(nghttp2_extension *frame, @@ -517,8 +518,10 @@ void nghttp2_frame_unpack_settings_payload(nghttp2_settings *frame, void nghttp2_frame_unpack_settings_entry(nghttp2_settings_entry *iv, const uint8_t *payload) { - iv->settings_id = nghttp2_get_uint16(&payload[0]); - iv->value = nghttp2_get_uint32(&payload[2]); + *iv = (nghttp2_settings_entry){ + .settings_id = nghttp2_get_uint16(&payload[0]), + .value = nghttp2_get_uint32(&payload[2]), + }; } int nghttp2_frame_unpack_settings_payload2(nghttp2_settings_entry **iv_ptr, @@ -752,10 +755,7 @@ void nghttp2_frame_unpack_altsvc_payload(nghttp2_extension *frame, altsvc = frame->payload; if (payloadlen == 0) { - altsvc->origin = NULL; - altsvc->origin_len = 0; - altsvc->field_value = NULL; - altsvc->field_value_len = 0; + *altsvc = (nghttp2_ext_altsvc){0}; return; } @@ -862,8 +862,7 @@ int nghttp2_frame_unpack_origin_payload(nghttp2_extension *frame, } if (nov == 0) { - origin->ov = NULL; - origin->nov = 0; + *origin = (nghttp2_ext_origin){0}; return 0; } @@ -875,8 +874,10 @@ int nghttp2_frame_unpack_origin_payload(nghttp2_extension *frame, return NGHTTP2_ERR_NOMEM; } - origin->ov = ov; - origin->nov = nov; + *origin = (nghttp2_ext_origin){ + .nov = nov, + .ov = ov, + }; dst = (uint8_t *)ov + nov * sizeof(nghttp2_origin_entry); p = payload; @@ -887,8 +888,10 @@ int nghttp2_frame_unpack_origin_payload(nghttp2_extension *frame, if (originlen == 0) { continue; } - ov->origin = dst; - ov->origin_len = originlen; + *ov = (nghttp2_origin_entry){ + .origin = dst, + .origin_len = originlen, + }; dst = nghttp2_cpymem(dst, p, originlen); *dst++ = '\0'; p += originlen; diff --git a/deps/nghttp2/lib/nghttp2_hd.c b/deps/nghttp2/lib/nghttp2_hd.c index 5ac77dbc0ea5..9590450768a1 100644 --- a/deps/nghttp2/lib/nghttp2_hd.c +++ b/deps/nghttp2/lib/nghttp2_hd.c @@ -35,12 +35,27 @@ /* Make scalar initialization form of nghttp2_hd_entry */ #define MAKE_STATIC_ENT(N, V, T, H) \ { \ - {NULL, NULL, (uint8_t *)(N), nghttp2_strlen_lit((N)), -1}, \ - {NULL, NULL, (uint8_t *)(V), nghttp2_strlen_lit((V)), -1}, \ - {(uint8_t *)(N), (uint8_t *)(V), nghttp2_strlen_lit((N)), \ - nghttp2_strlen_lit((V)), 0}, \ - T, \ - H, \ + .name = \ + { \ + .base = (uint8_t *)(N), \ + .len = nghttp2_strlen_lit((N)), \ + .ref = -1, \ + }, \ + .value = \ + { \ + .base = (uint8_t *)(V), \ + .len = nghttp2_strlen_lit((V)), \ + .ref = -1, \ + }, \ + .cnv = \ + { \ + .name = (uint8_t *)(N), \ + .value = (uint8_t *)(V), \ + .namelen = nghttp2_strlen_lit((N)), \ + .valuelen = nghttp2_strlen_lit((V)), \ + }, \ + .token = T, \ + .hash = H, \ } /* Generated by mkstatictbl.py */ @@ -487,14 +502,17 @@ static int32_t lookup_token(const uint8_t *name, size_t namelen) { } void nghttp2_hd_entry_init(nghttp2_hd_entry *ent, nghttp2_hd_nv *nv) { - ent->nv = *nv; - ent->cnv.name = nv->name->base; - ent->cnv.namelen = nv->name->len; - ent->cnv.value = nv->value->base; - ent->cnv.valuelen = nv->value->len; - ent->cnv.flags = nv->flags; - ent->next = NULL; - ent->hash = 0; + *ent = (nghttp2_hd_entry){ + .nv = *nv, + .cnv = + { + .name = nv->name->base, + .value = nv->value->base, + .namelen = nv->name->len, + .valuelen = nv->value->len, + .flags = nv->flags, + }, + }; nghttp2_rcbuf_incref(ent->nv.name); nghttp2_rcbuf_incref(ent->nv.value); @@ -528,9 +546,7 @@ static uint32_t name_hash(const nghttp2_nv *nv) { return h; } -static void hd_map_init(nghttp2_hd_map *map) { - memset(map, 0, sizeof(nghttp2_hd_map)); -} +static void hd_map_init(nghttp2_hd_map *map) { *map = (nghttp2_hd_map){0}; } static void hd_map_insert(nghttp2_hd_map *map, nghttp2_hd_entry *ent) { nghttp2_hd_entry **bucket; @@ -838,7 +854,7 @@ static size_t encode_length(uint8_t *buf, size_t n, size_t prefix) { n -= k; for (; n >= 128; n >>= 7) { - *buf++ = (uint8_t)((1 << 7) | (n & 0x7f)); + *buf++ = (uint8_t)((1 << 7) | (n & 0x7F)); } *buf++ = (uint8_t)n; @@ -890,7 +906,7 @@ static nghttp2_ssize decode_length(uint32_t *res, size_t *shift_ptr, int *fin, } for (; in != last; ++in, shift += 7) { - uint32_t add = *in & 0x7f; + uint32_t add = *in & 0x7F; if (shift >= 32) { DEBUGF("inflate: shift exponent overflow\n"); @@ -944,7 +960,7 @@ static int emit_table_size(nghttp2_bufs *bufs, size_t table_size) { bufp = sb; - *bufp = 0x20u; + *bufp = 0x20U; encode_length(bufp, table_size, 5); @@ -971,7 +987,7 @@ static int emit_indexed_block(nghttp2_bufs *bufs, size_t idx) { } bufp = sb; - *bufp = 0x80u; + *bufp = 0x80U; encode_length(bufp, idx + 1, 7); rv = nghttp2_bufs_add(bufs, sb, blocklen); @@ -1030,11 +1046,11 @@ static int emit_string(nghttp2_bufs *bufs, const uint8_t *str, size_t len) { static uint8_t pack_first_byte(int indexing_mode) { switch (indexing_mode) { case NGHTTP2_HD_WITH_INDEXING: - return 0x40u; + return 0x40U; case NGHTTP2_HD_WITHOUT_INDEXING: return 0; case NGHTTP2_HD_NEVER_INDEXING: - return 0x10u; + return 0x10U; default: assert(0); } @@ -1318,10 +1334,12 @@ nghttp2_hd_nv nghttp2_hd_table_get(nghttp2_hd_context *context, size_t idx) { ->nv; } else { const nghttp2_hd_static_entry *ent = &static_table[idx]; - nghttp2_hd_nv nv = {(nghttp2_rcbuf *)&ent->name, - (nghttp2_rcbuf *)&ent->value, ent->token, - NGHTTP2_NV_FLAG_NONE}; - return nv; + return (nghttp2_hd_nv){ + .name = (nghttp2_rcbuf *)&ent->name, + .value = (nghttp2_rcbuf *)&ent->value, + .token = ent->token, + .flags = NGHTTP2_NV_FLAG_NONE, + }; } } @@ -1886,13 +1904,13 @@ nghttp2_ssize nghttp2_hd_inflate_hd3(nghttp2_hd_inflater *inflater, } if (*inflate_flags & NGHTTP2_HD_INFLATE_EMIT) { - nv_out->name = hd_nv.name->base; - nv_out->namelen = hd_nv.name->len; - - nv_out->value = hd_nv.value->base; - nv_out->valuelen = hd_nv.value->len; - - nv_out->flags = hd_nv.flags; + *nv_out = (nghttp2_nv){ + .name = hd_nv.name->base, + .value = hd_nv.value->base, + .namelen = hd_nv.name->len, + .valuelen = hd_nv.value->len, + .flags = hd_nv.flags, + }; } return rv; @@ -1922,7 +1940,7 @@ nghttp2_ssize nghttp2_hd_inflate_hd_nv(nghttp2_hd_inflater *inflater, busy = 0; switch (inflater->state) { case NGHTTP2_HD_STATE_EXPECT_TABLE_SIZE: - if ((*in & 0xe0u) != 0x20u) { + if ((*in & 0xE0U) != 0x20U) { DEBUGF("inflatehd: header table size change was expected, but saw " "0x%02x as first byte", *in); @@ -1932,7 +1950,7 @@ nghttp2_ssize nghttp2_hd_inflate_hd_nv(nghttp2_hd_inflater *inflater, /* fall through */ case NGHTTP2_HD_STATE_INFLATE_START: case NGHTTP2_HD_STATE_OPCODE: - if ((*in & 0xe0u) == 0x20u) { + if ((*in & 0xE0U) == 0x20U) { DEBUGF("inflatehd: header table size change\n"); if (inflater->state == NGHTTP2_HD_STATE_OPCODE) { DEBUGF("inflatehd: header table size change must appear at the head " @@ -1942,12 +1960,12 @@ nghttp2_ssize nghttp2_hd_inflate_hd_nv(nghttp2_hd_inflater *inflater, } inflater->opcode = NGHTTP2_HD_OPCODE_INDEXED; inflater->state = NGHTTP2_HD_STATE_READ_TABLE_SIZE; - } else if (*in & 0x80u) { + } else if (*in & 0x80U) { DEBUGF("inflatehd: indexed repr\n"); inflater->opcode = NGHTTP2_HD_OPCODE_INDEXED; inflater->state = NGHTTP2_HD_STATE_READ_INDEX; } else { - if (*in == 0x40u || *in == 0 || *in == 0x10u) { + if (*in == 0x40U || *in == 0 || *in == 0x10U) { DEBUGF("inflatehd: literal header repr - new name\n"); inflater->opcode = NGHTTP2_HD_OPCODE_NEWNAME; inflater->state = NGHTTP2_HD_STATE_NEWNAME_CHECK_NAMELEN; @@ -1957,7 +1975,7 @@ nghttp2_ssize nghttp2_hd_inflate_hd_nv(nghttp2_hd_inflater *inflater, inflater->state = NGHTTP2_HD_STATE_READ_INDEX; } inflater->index_required = (*in & 0x40) != 0; - inflater->no_index = (*in & 0xf0u) == 0x10u; + inflater->no_index = (*in & 0xF0U) == 0x10U; DEBUGF("inflatehd: indexing required=%d, no_index=%d\n", inflater->index_required, inflater->no_index); if (inflater->opcode == NGHTTP2_HD_OPCODE_NEWNAME) { @@ -2317,11 +2335,11 @@ void nghttp2_hd_inflate_del(nghttp2_hd_inflater *inflater) { } int nghttp2_hd_emit_indname_block(nghttp2_bufs *bufs, size_t idx, - nghttp2_nv *nv, int indexing_mode) { + const nghttp2_nv *nv, int indexing_mode) { return emit_indname_block(bufs, idx, nv, indexing_mode); } -int nghttp2_hd_emit_newname_block(nghttp2_bufs *bufs, nghttp2_nv *nv, +int nghttp2_hd_emit_newname_block(nghttp2_bufs *bufs, const nghttp2_nv *nv, int indexing_mode) { return emit_newname_block(bufs, nv, indexing_mode); } diff --git a/deps/nghttp2/lib/nghttp2_hd.h b/deps/nghttp2/lib/nghttp2_hd.h index bdc7fad5c2b5..157471c9b756 100644 --- a/deps/nghttp2/lib/nghttp2_hd.h +++ b/deps/nghttp2/lib/nghttp2_hd.h @@ -364,10 +364,10 @@ nghttp2_ssize nghttp2_hd_inflate_hd_nv(nghttp2_hd_inflater *inflater, /* For unittesting purpose */ int nghttp2_hd_emit_indname_block(nghttp2_bufs *bufs, size_t index, - nghttp2_nv *nv, int indexing_mode); + const nghttp2_nv *nv, int indexing_mode); /* For unittesting purpose */ -int nghttp2_hd_emit_newname_block(nghttp2_bufs *bufs, nghttp2_nv *nv, +int nghttp2_hd_emit_newname_block(nghttp2_bufs *bufs, const nghttp2_nv *nv, int indexing_mode); /* For unittesting purpose */ diff --git a/deps/nghttp2/lib/nghttp2_hd_huffman.c b/deps/nghttp2/lib/nghttp2_hd_huffman.c index 45672655f087..7b72e326083a 100644 --- a/deps/nghttp2/lib/nghttp2_hd_huffman.c +++ b/deps/nghttp2/lib/nghttp2_hd_huffman.c @@ -126,7 +126,7 @@ nghttp2_ssize nghttp2_hd_huff_decode(nghttp2_hd_huff_decode_context *ctx, *buf->last++ = t.sym; } - t = huff_decode_table[t.fstate][c & 0xf]; + t = huff_decode_table[t.fstate][c & 0xF]; if (t.flags & NGHTTP2_HUFF_SYM) { *buf->last++ = t.sym; } diff --git a/deps/nghttp2/lib/nghttp2_hd_huffman.h b/deps/nghttp2/lib/nghttp2_hd_huffman.h index f898c1779c01..165da0f82eb9 100644 --- a/deps/nghttp2/lib/nghttp2_hd_huffman.h +++ b/deps/nghttp2/lib/nghttp2_hd_huffman.h @@ -31,23 +31,21 @@ #include -typedef enum { - /* FSA accepts this state as the end of huffman encoding - sequence. */ - NGHTTP2_HUFF_ACCEPTED = 1, - /* This state emits symbol */ - NGHTTP2_HUFF_SYM = 1 << 1, -} nghttp2_huff_decode_flag; +/* FSA accepts this state as the end of huffman encoding sequence. */ +#define NGHTTP2_HUFF_ACCEPTED 0x01U +/* This state emits symbol */ +#define NGHTTP2_HUFF_SYM 0x02U typedef struct { /* fstate is the current huffman decoding state, which is actually - the node ID of internal huffman tree with - nghttp2_huff_decode_flag OR-ed. We have 257 leaf nodes, but they - are identical to root node other than emitting a symbol, so we - have 256 internal nodes [1..255], inclusive. The node ID 256 is - a special node and it is a terminal state that means decoding - failed. */ + the node ID of internal huffman tree. We have 257 leaf nodes, + but they are identical to root node other than emitting a symbol, + so we have 256 internal nodes [1..255], inclusive. The node ID + 256 is a special node and it is a terminal state that means + decoding failed. */ uint16_t fstate; + /* flags is the bitwise OR of zero or more of NGHTTP2_HUFF_* + values. */ uint8_t flags; /* symbol if NGHTTP2_HUFF_SYM flag set */ uint8_t sym; diff --git a/deps/nghttp2/lib/nghttp2_hd_huffman_data.c b/deps/nghttp2/lib/nghttp2_hd_huffman_data.c index 252cae0c18d9..cfb3a23dd076 100644 --- a/deps/nghttp2/lib/nghttp2_hd_huffman_data.c +++ b/deps/nghttp2/lib/nghttp2_hd_huffman_data.c @@ -27,4954 +27,4954 @@ /* Generated by mkhufftbl.py */ const nghttp2_huff_sym huff_sym_table[] = { - {13, 0xffc00000u}, {23, 0xffffb000u}, {28, 0xfffffe20u}, {28, 0xfffffe30u}, - {28, 0xfffffe40u}, {28, 0xfffffe50u}, {28, 0xfffffe60u}, {28, 0xfffffe70u}, - {28, 0xfffffe80u}, {24, 0xffffea00u}, {30, 0xfffffff0u}, {28, 0xfffffe90u}, - {28, 0xfffffea0u}, {30, 0xfffffff4u}, {28, 0xfffffeb0u}, {28, 0xfffffec0u}, - {28, 0xfffffed0u}, {28, 0xfffffee0u}, {28, 0xfffffef0u}, {28, 0xffffff00u}, - {28, 0xffffff10u}, {28, 0xffffff20u}, {30, 0xfffffff8u}, {28, 0xffffff30u}, - {28, 0xffffff40u}, {28, 0xffffff50u}, {28, 0xffffff60u}, {28, 0xffffff70u}, - {28, 0xffffff80u}, {28, 0xffffff90u}, {28, 0xffffffa0u}, {28, 0xffffffb0u}, - {6, 0x50000000u}, {10, 0xfe000000u}, {10, 0xfe400000u}, {12, 0xffa00000u}, - {13, 0xffc80000u}, {6, 0x54000000u}, {8, 0xf8000000u}, {11, 0xff400000u}, - {10, 0xfe800000u}, {10, 0xfec00000u}, {8, 0xf9000000u}, {11, 0xff600000u}, - {8, 0xfa000000u}, {6, 0x58000000u}, {6, 0x5c000000u}, {6, 0x60000000u}, - {5, 0x0u}, {5, 0x8000000u}, {5, 0x10000000u}, {6, 0x64000000u}, - {6, 0x68000000u}, {6, 0x6c000000u}, {6, 0x70000000u}, {6, 0x74000000u}, - {6, 0x78000000u}, {6, 0x7c000000u}, {7, 0xb8000000u}, {8, 0xfb000000u}, - {15, 0xfff80000u}, {6, 0x80000000u}, {12, 0xffb00000u}, {10, 0xff000000u}, - {13, 0xffd00000u}, {6, 0x84000000u}, {7, 0xba000000u}, {7, 0xbc000000u}, - {7, 0xbe000000u}, {7, 0xc0000000u}, {7, 0xc2000000u}, {7, 0xc4000000u}, - {7, 0xc6000000u}, {7, 0xc8000000u}, {7, 0xca000000u}, {7, 0xcc000000u}, - {7, 0xce000000u}, {7, 0xd0000000u}, {7, 0xd2000000u}, {7, 0xd4000000u}, - {7, 0xd6000000u}, {7, 0xd8000000u}, {7, 0xda000000u}, {7, 0xdc000000u}, - {7, 0xde000000u}, {7, 0xe0000000u}, {7, 0xe2000000u}, {7, 0xe4000000u}, - {8, 0xfc000000u}, {7, 0xe6000000u}, {8, 0xfd000000u}, {13, 0xffd80000u}, - {19, 0xfffe0000u}, {13, 0xffe00000u}, {14, 0xfff00000u}, {6, 0x88000000u}, - {15, 0xfffa0000u}, {5, 0x18000000u}, {6, 0x8c000000u}, {5, 0x20000000u}, - {6, 0x90000000u}, {5, 0x28000000u}, {6, 0x94000000u}, {6, 0x98000000u}, - {6, 0x9c000000u}, {5, 0x30000000u}, {7, 0xe8000000u}, {7, 0xea000000u}, - {6, 0xa0000000u}, {6, 0xa4000000u}, {6, 0xa8000000u}, {5, 0x38000000u}, - {6, 0xac000000u}, {7, 0xec000000u}, {6, 0xb0000000u}, {5, 0x40000000u}, - {5, 0x48000000u}, {6, 0xb4000000u}, {7, 0xee000000u}, {7, 0xf0000000u}, - {7, 0xf2000000u}, {7, 0xf4000000u}, {7, 0xf6000000u}, {15, 0xfffc0000u}, - {11, 0xff800000u}, {14, 0xfff40000u}, {13, 0xffe80000u}, {28, 0xffffffc0u}, - {20, 0xfffe6000u}, {22, 0xffff4800u}, {20, 0xfffe7000u}, {20, 0xfffe8000u}, - {22, 0xffff4c00u}, {22, 0xffff5000u}, {22, 0xffff5400u}, {23, 0xffffb200u}, - {22, 0xffff5800u}, {23, 0xffffb400u}, {23, 0xffffb600u}, {23, 0xffffb800u}, - {23, 0xffffba00u}, {23, 0xffffbc00u}, {24, 0xffffeb00u}, {23, 0xffffbe00u}, - {24, 0xffffec00u}, {24, 0xffffed00u}, {22, 0xffff5c00u}, {23, 0xffffc000u}, - {24, 0xffffee00u}, {23, 0xffffc200u}, {23, 0xffffc400u}, {23, 0xffffc600u}, - {23, 0xffffc800u}, {21, 0xfffee000u}, {22, 0xffff6000u}, {23, 0xffffca00u}, - {22, 0xffff6400u}, {23, 0xffffcc00u}, {23, 0xffffce00u}, {24, 0xffffef00u}, - {22, 0xffff6800u}, {21, 0xfffee800u}, {20, 0xfffe9000u}, {22, 0xffff6c00u}, - {22, 0xffff7000u}, {23, 0xffffd000u}, {23, 0xffffd200u}, {21, 0xfffef000u}, - {23, 0xffffd400u}, {22, 0xffff7400u}, {22, 0xffff7800u}, {24, 0xfffff000u}, - {21, 0xfffef800u}, {22, 0xffff7c00u}, {23, 0xffffd600u}, {23, 0xffffd800u}, - {21, 0xffff0000u}, {21, 0xffff0800u}, {22, 0xffff8000u}, {21, 0xffff1000u}, - {23, 0xffffda00u}, {22, 0xffff8400u}, {23, 0xffffdc00u}, {23, 0xffffde00u}, - {20, 0xfffea000u}, {22, 0xffff8800u}, {22, 0xffff8c00u}, {22, 0xffff9000u}, - {23, 0xffffe000u}, {22, 0xffff9400u}, {22, 0xffff9800u}, {23, 0xffffe200u}, - {26, 0xfffff800u}, {26, 0xfffff840u}, {20, 0xfffeb000u}, {19, 0xfffe2000u}, - {22, 0xffff9c00u}, {23, 0xffffe400u}, {22, 0xffffa000u}, {25, 0xfffff600u}, - {26, 0xfffff880u}, {26, 0xfffff8c0u}, {26, 0xfffff900u}, {27, 0xfffffbc0u}, - {27, 0xfffffbe0u}, {26, 0xfffff940u}, {24, 0xfffff100u}, {25, 0xfffff680u}, - {19, 0xfffe4000u}, {21, 0xffff1800u}, {26, 0xfffff980u}, {27, 0xfffffc00u}, - {27, 0xfffffc20u}, {26, 0xfffff9c0u}, {27, 0xfffffc40u}, {24, 0xfffff200u}, - {21, 0xffff2000u}, {21, 0xffff2800u}, {26, 0xfffffa00u}, {26, 0xfffffa40u}, - {28, 0xffffffd0u}, {27, 0xfffffc60u}, {27, 0xfffffc80u}, {27, 0xfffffca0u}, - {20, 0xfffec000u}, {24, 0xfffff300u}, {20, 0xfffed000u}, {21, 0xffff3000u}, - {22, 0xffffa400u}, {21, 0xffff3800u}, {21, 0xffff4000u}, {23, 0xffffe600u}, - {22, 0xffffa800u}, {22, 0xffffac00u}, {25, 0xfffff700u}, {25, 0xfffff780u}, - {24, 0xfffff400u}, {24, 0xfffff500u}, {26, 0xfffffa80u}, {23, 0xffffe800u}, - {26, 0xfffffac0u}, {27, 0xfffffcc0u}, {26, 0xfffffb00u}, {26, 0xfffffb40u}, - {27, 0xfffffce0u}, {27, 0xfffffd00u}, {27, 0xfffffd20u}, {27, 0xfffffd40u}, - {27, 0xfffffd60u}, {28, 0xffffffe0u}, {27, 0xfffffd80u}, {27, 0xfffffda0u}, - {27, 0xfffffdc0u}, {27, 0xfffffde0u}, {27, 0xfffffe00u}, {26, 0xfffffb80u}, - {30, 0xfffffffcu}}; + {13, 0xFFC00000U}, {23, 0xFFFFB000U}, {28, 0xFFFFFE20U}, {28, 0xFFFFFE30U}, + {28, 0xFFFFFE40U}, {28, 0xFFFFFE50U}, {28, 0xFFFFFE60U}, {28, 0xFFFFFE70U}, + {28, 0xFFFFFE80U}, {24, 0xFFFFEA00U}, {30, 0xFFFFFFF0U}, {28, 0xFFFFFE90U}, + {28, 0xFFFFFEA0U}, {30, 0xFFFFFFF4U}, {28, 0xFFFFFEB0U}, {28, 0xFFFFFEC0U}, + {28, 0xFFFFFED0U}, {28, 0xFFFFFEE0U}, {28, 0xFFFFFEF0U}, {28, 0xFFFFFF00U}, + {28, 0xFFFFFF10U}, {28, 0xFFFFFF20U}, {30, 0xFFFFFFF8U}, {28, 0xFFFFFF30U}, + {28, 0xFFFFFF40U}, {28, 0xFFFFFF50U}, {28, 0xFFFFFF60U}, {28, 0xFFFFFF70U}, + {28, 0xFFFFFF80U}, {28, 0xFFFFFF90U}, {28, 0xFFFFFFA0U}, {28, 0xFFFFFFB0U}, + {6, 0x50000000U}, {10, 0xFE000000U}, {10, 0xFE400000U}, {12, 0xFFA00000U}, + {13, 0xFFC80000U}, {6, 0x54000000U}, {8, 0xF8000000U}, {11, 0xFF400000U}, + {10, 0xFE800000U}, {10, 0xFEC00000U}, {8, 0xF9000000U}, {11, 0xFF600000U}, + {8, 0xFA000000U}, {6, 0x58000000U}, {6, 0x5C000000U}, {6, 0x60000000U}, + {5, 0x0U}, {5, 0x8000000U}, {5, 0x10000000U}, {6, 0x64000000U}, + {6, 0x68000000U}, {6, 0x6C000000U}, {6, 0x70000000U}, {6, 0x74000000U}, + {6, 0x78000000U}, {6, 0x7C000000U}, {7, 0xB8000000U}, {8, 0xFB000000U}, + {15, 0xFFF80000U}, {6, 0x80000000U}, {12, 0xFFB00000U}, {10, 0xFF000000U}, + {13, 0xFFD00000U}, {6, 0x84000000U}, {7, 0xBA000000U}, {7, 0xBC000000U}, + {7, 0xBE000000U}, {7, 0xC0000000U}, {7, 0xC2000000U}, {7, 0xC4000000U}, + {7, 0xC6000000U}, {7, 0xC8000000U}, {7, 0xCA000000U}, {7, 0xCC000000U}, + {7, 0xCE000000U}, {7, 0xD0000000U}, {7, 0xD2000000U}, {7, 0xD4000000U}, + {7, 0xD6000000U}, {7, 0xD8000000U}, {7, 0xDA000000U}, {7, 0xDC000000U}, + {7, 0xDE000000U}, {7, 0xE0000000U}, {7, 0xE2000000U}, {7, 0xE4000000U}, + {8, 0xFC000000U}, {7, 0xE6000000U}, {8, 0xFD000000U}, {13, 0xFFD80000U}, + {19, 0xFFFE0000U}, {13, 0xFFE00000U}, {14, 0xFFF00000U}, {6, 0x88000000U}, + {15, 0xFFFA0000U}, {5, 0x18000000U}, {6, 0x8C000000U}, {5, 0x20000000U}, + {6, 0x90000000U}, {5, 0x28000000U}, {6, 0x94000000U}, {6, 0x98000000U}, + {6, 0x9C000000U}, {5, 0x30000000U}, {7, 0xE8000000U}, {7, 0xEA000000U}, + {6, 0xA0000000U}, {6, 0xA4000000U}, {6, 0xA8000000U}, {5, 0x38000000U}, + {6, 0xAC000000U}, {7, 0xEC000000U}, {6, 0xB0000000U}, {5, 0x40000000U}, + {5, 0x48000000U}, {6, 0xB4000000U}, {7, 0xEE000000U}, {7, 0xF0000000U}, + {7, 0xF2000000U}, {7, 0xF4000000U}, {7, 0xF6000000U}, {15, 0xFFFC0000U}, + {11, 0xFF800000U}, {14, 0xFFF40000U}, {13, 0xFFE80000U}, {28, 0xFFFFFFC0U}, + {20, 0xFFFE6000U}, {22, 0xFFFF4800U}, {20, 0xFFFE7000U}, {20, 0xFFFE8000U}, + {22, 0xFFFF4C00U}, {22, 0xFFFF5000U}, {22, 0xFFFF5400U}, {23, 0xFFFFB200U}, + {22, 0xFFFF5800U}, {23, 0xFFFFB400U}, {23, 0xFFFFB600U}, {23, 0xFFFFB800U}, + {23, 0xFFFFBA00U}, {23, 0xFFFFBC00U}, {24, 0xFFFFEB00U}, {23, 0xFFFFBE00U}, + {24, 0xFFFFEC00U}, {24, 0xFFFFED00U}, {22, 0xFFFF5C00U}, {23, 0xFFFFC000U}, + {24, 0xFFFFEE00U}, {23, 0xFFFFC200U}, {23, 0xFFFFC400U}, {23, 0xFFFFC600U}, + {23, 0xFFFFC800U}, {21, 0xFFFEE000U}, {22, 0xFFFF6000U}, {23, 0xFFFFCA00U}, + {22, 0xFFFF6400U}, {23, 0xFFFFCC00U}, {23, 0xFFFFCE00U}, {24, 0xFFFFEF00U}, + {22, 0xFFFF6800U}, {21, 0xFFFEE800U}, {20, 0xFFFE9000U}, {22, 0xFFFF6C00U}, + {22, 0xFFFF7000U}, {23, 0xFFFFD000U}, {23, 0xFFFFD200U}, {21, 0xFFFEF000U}, + {23, 0xFFFFD400U}, {22, 0xFFFF7400U}, {22, 0xFFFF7800U}, {24, 0xFFFFF000U}, + {21, 0xFFFEF800U}, {22, 0xFFFF7C00U}, {23, 0xFFFFD600U}, {23, 0xFFFFD800U}, + {21, 0xFFFF0000U}, {21, 0xFFFF0800U}, {22, 0xFFFF8000U}, {21, 0xFFFF1000U}, + {23, 0xFFFFDA00U}, {22, 0xFFFF8400U}, {23, 0xFFFFDC00U}, {23, 0xFFFFDE00U}, + {20, 0xFFFEA000U}, {22, 0xFFFF8800U}, {22, 0xFFFF8C00U}, {22, 0xFFFF9000U}, + {23, 0xFFFFE000U}, {22, 0xFFFF9400U}, {22, 0xFFFF9800U}, {23, 0xFFFFE200U}, + {26, 0xFFFFF800U}, {26, 0xFFFFF840U}, {20, 0xFFFEB000U}, {19, 0xFFFE2000U}, + {22, 0xFFFF9C00U}, {23, 0xFFFFE400U}, {22, 0xFFFFA000U}, {25, 0xFFFFF600U}, + {26, 0xFFFFF880U}, {26, 0xFFFFF8C0U}, {26, 0xFFFFF900U}, {27, 0xFFFFFBC0U}, + {27, 0xFFFFFBE0U}, {26, 0xFFFFF940U}, {24, 0xFFFFF100U}, {25, 0xFFFFF680U}, + {19, 0xFFFE4000U}, {21, 0xFFFF1800U}, {26, 0xFFFFF980U}, {27, 0xFFFFFC00U}, + {27, 0xFFFFFC20U}, {26, 0xFFFFF9C0U}, {27, 0xFFFFFC40U}, {24, 0xFFFFF200U}, + {21, 0xFFFF2000U}, {21, 0xFFFF2800U}, {26, 0xFFFFFA00U}, {26, 0xFFFFFA40U}, + {28, 0xFFFFFFD0U}, {27, 0xFFFFFC60U}, {27, 0xFFFFFC80U}, {27, 0xFFFFFCA0U}, + {20, 0xFFFEC000U}, {24, 0xFFFFF300U}, {20, 0xFFFED000U}, {21, 0xFFFF3000U}, + {22, 0xFFFFA400U}, {21, 0xFFFF3800U}, {21, 0xFFFF4000U}, {23, 0xFFFFE600U}, + {22, 0xFFFFA800U}, {22, 0xFFFFAC00U}, {25, 0xFFFFF700U}, {25, 0xFFFFF780U}, + {24, 0xFFFFF400U}, {24, 0xFFFFF500U}, {26, 0xFFFFFA80U}, {23, 0xFFFFE800U}, + {26, 0xFFFFFAC0U}, {27, 0xFFFFFCC0U}, {26, 0xFFFFFB00U}, {26, 0xFFFFFB40U}, + {27, 0xFFFFFCE0U}, {27, 0xFFFFFD00U}, {27, 0xFFFFFD20U}, {27, 0xFFFFFD40U}, + {27, 0xFFFFFD60U}, {28, 0xFFFFFFE0U}, {27, 0xFFFFFD80U}, {27, 0xFFFFFDA0U}, + {27, 0xFFFFFDC0U}, {27, 0xFFFFFDE0U}, {27, 0xFFFFFE00U}, {26, 0xFFFFFB80U}, + {30, 0xFFFFFFFCU}}; const nghttp2_huff_decode huff_decode_table[][16] = { /* 0 */ { - {0x04, 0, 0}, - {0x05, 0, 0}, - {0x07, 0, 0}, - {0x08, 0, 0}, - {0x0b, 0, 0}, - {0x0c, 0, 0}, - {0x10, 0, 0}, - {0x13, 0, 0}, - {0x19, 0, 0}, - {0x1c, 0, 0}, - {0x20, 0, 0}, - {0x23, 0, 0}, - {0x2a, 0, 0}, - {0x31, 0, 0}, - {0x39, 0, 0}, - {0x40, 1, 0}, + {0x04, 0x00, 0x00}, + {0x05, 0x00, 0x00}, + {0x07, 0x00, 0x00}, + {0x08, 0x00, 0x00}, + {0x0B, 0x00, 0x00}, + {0x0C, 0x00, 0x00}, + {0x10, 0x00, 0x00}, + {0x13, 0x00, 0x00}, + {0x19, 0x00, 0x00}, + {0x1C, 0x00, 0x00}, + {0x20, 0x00, 0x00}, + {0x23, 0x00, 0x00}, + {0x2A, 0x00, 0x00}, + {0x31, 0x00, 0x00}, + {0x39, 0x00, 0x00}, + {0x40, 0x01, 0x00}, }, /* 1 */ { - {0x00, 3, 48}, - {0x00, 3, 49}, - {0x00, 3, 50}, - {0x00, 3, 97}, - {0x00, 3, 99}, - {0x00, 3, 101}, - {0x00, 3, 105}, - {0x00, 3, 111}, - {0x00, 3, 115}, - {0x00, 3, 116}, - {0x0d, 0, 0}, - {0x0e, 0, 0}, - {0x11, 0, 0}, - {0x12, 0, 0}, - {0x14, 0, 0}, - {0x15, 0, 0}, + {0x00, 0x03, 0x30}, + {0x00, 0x03, 0x31}, + {0x00, 0x03, 0x32}, + {0x00, 0x03, 0x61}, + {0x00, 0x03, 0x63}, + {0x00, 0x03, 0x65}, + {0x00, 0x03, 0x69}, + {0x00, 0x03, 0x6F}, + {0x00, 0x03, 0x73}, + {0x00, 0x03, 0x74}, + {0x0D, 0x00, 0x00}, + {0x0E, 0x00, 0x00}, + {0x11, 0x00, 0x00}, + {0x12, 0x00, 0x00}, + {0x14, 0x00, 0x00}, + {0x15, 0x00, 0x00}, }, /* 2 */ { - {0x01, 2, 48}, - {0x16, 3, 48}, - {0x01, 2, 49}, - {0x16, 3, 49}, - {0x01, 2, 50}, - {0x16, 3, 50}, - {0x01, 2, 97}, - {0x16, 3, 97}, - {0x01, 2, 99}, - {0x16, 3, 99}, - {0x01, 2, 101}, - {0x16, 3, 101}, - {0x01, 2, 105}, - {0x16, 3, 105}, - {0x01, 2, 111}, - {0x16, 3, 111}, + {0x01, 0x02, 0x30}, + {0x16, 0x03, 0x30}, + {0x01, 0x02, 0x31}, + {0x16, 0x03, 0x31}, + {0x01, 0x02, 0x32}, + {0x16, 0x03, 0x32}, + {0x01, 0x02, 0x61}, + {0x16, 0x03, 0x61}, + {0x01, 0x02, 0x63}, + {0x16, 0x03, 0x63}, + {0x01, 0x02, 0x65}, + {0x16, 0x03, 0x65}, + {0x01, 0x02, 0x69}, + {0x16, 0x03, 0x69}, + {0x01, 0x02, 0x6F}, + {0x16, 0x03, 0x6F}, }, /* 3 */ { - {0x02, 2, 48}, - {0x09, 2, 48}, - {0x17, 2, 48}, - {0x28, 3, 48}, - {0x02, 2, 49}, - {0x09, 2, 49}, - {0x17, 2, 49}, - {0x28, 3, 49}, - {0x02, 2, 50}, - {0x09, 2, 50}, - {0x17, 2, 50}, - {0x28, 3, 50}, - {0x02, 2, 97}, - {0x09, 2, 97}, - {0x17, 2, 97}, - {0x28, 3, 97}, + {0x02, 0x02, 0x30}, + {0x09, 0x02, 0x30}, + {0x17, 0x02, 0x30}, + {0x28, 0x03, 0x30}, + {0x02, 0x02, 0x31}, + {0x09, 0x02, 0x31}, + {0x17, 0x02, 0x31}, + {0x28, 0x03, 0x31}, + {0x02, 0x02, 0x32}, + {0x09, 0x02, 0x32}, + {0x17, 0x02, 0x32}, + {0x28, 0x03, 0x32}, + {0x02, 0x02, 0x61}, + {0x09, 0x02, 0x61}, + {0x17, 0x02, 0x61}, + {0x28, 0x03, 0x61}, }, /* 4 */ { - {0x03, 2, 48}, - {0x06, 2, 48}, - {0x0a, 2, 48}, - {0x0f, 2, 48}, - {0x18, 2, 48}, - {0x1f, 2, 48}, - {0x29, 2, 48}, - {0x38, 3, 48}, - {0x03, 2, 49}, - {0x06, 2, 49}, - {0x0a, 2, 49}, - {0x0f, 2, 49}, - {0x18, 2, 49}, - {0x1f, 2, 49}, - {0x29, 2, 49}, - {0x38, 3, 49}, + {0x03, 0x02, 0x30}, + {0x06, 0x02, 0x30}, + {0x0A, 0x02, 0x30}, + {0x0F, 0x02, 0x30}, + {0x18, 0x02, 0x30}, + {0x1F, 0x02, 0x30}, + {0x29, 0x02, 0x30}, + {0x38, 0x03, 0x30}, + {0x03, 0x02, 0x31}, + {0x06, 0x02, 0x31}, + {0x0A, 0x02, 0x31}, + {0x0F, 0x02, 0x31}, + {0x18, 0x02, 0x31}, + {0x1F, 0x02, 0x31}, + {0x29, 0x02, 0x31}, + {0x38, 0x03, 0x31}, }, /* 5 */ { - {0x03, 2, 50}, - {0x06, 2, 50}, - {0x0a, 2, 50}, - {0x0f, 2, 50}, - {0x18, 2, 50}, - {0x1f, 2, 50}, - {0x29, 2, 50}, - {0x38, 3, 50}, - {0x03, 2, 97}, - {0x06, 2, 97}, - {0x0a, 2, 97}, - {0x0f, 2, 97}, - {0x18, 2, 97}, - {0x1f, 2, 97}, - {0x29, 2, 97}, - {0x38, 3, 97}, + {0x03, 0x02, 0x32}, + {0x06, 0x02, 0x32}, + {0x0A, 0x02, 0x32}, + {0x0F, 0x02, 0x32}, + {0x18, 0x02, 0x32}, + {0x1F, 0x02, 0x32}, + {0x29, 0x02, 0x32}, + {0x38, 0x03, 0x32}, + {0x03, 0x02, 0x61}, + {0x06, 0x02, 0x61}, + {0x0A, 0x02, 0x61}, + {0x0F, 0x02, 0x61}, + {0x18, 0x02, 0x61}, + {0x1F, 0x02, 0x61}, + {0x29, 0x02, 0x61}, + {0x38, 0x03, 0x61}, }, /* 6 */ { - {0x02, 2, 99}, - {0x09, 2, 99}, - {0x17, 2, 99}, - {0x28, 3, 99}, - {0x02, 2, 101}, - {0x09, 2, 101}, - {0x17, 2, 101}, - {0x28, 3, 101}, - {0x02, 2, 105}, - {0x09, 2, 105}, - {0x17, 2, 105}, - {0x28, 3, 105}, - {0x02, 2, 111}, - {0x09, 2, 111}, - {0x17, 2, 111}, - {0x28, 3, 111}, + {0x02, 0x02, 0x63}, + {0x09, 0x02, 0x63}, + {0x17, 0x02, 0x63}, + {0x28, 0x03, 0x63}, + {0x02, 0x02, 0x65}, + {0x09, 0x02, 0x65}, + {0x17, 0x02, 0x65}, + {0x28, 0x03, 0x65}, + {0x02, 0x02, 0x69}, + {0x09, 0x02, 0x69}, + {0x17, 0x02, 0x69}, + {0x28, 0x03, 0x69}, + {0x02, 0x02, 0x6F}, + {0x09, 0x02, 0x6F}, + {0x17, 0x02, 0x6F}, + {0x28, 0x03, 0x6F}, }, /* 7 */ { - {0x03, 2, 99}, - {0x06, 2, 99}, - {0x0a, 2, 99}, - {0x0f, 2, 99}, - {0x18, 2, 99}, - {0x1f, 2, 99}, - {0x29, 2, 99}, - {0x38, 3, 99}, - {0x03, 2, 101}, - {0x06, 2, 101}, - {0x0a, 2, 101}, - {0x0f, 2, 101}, - {0x18, 2, 101}, - {0x1f, 2, 101}, - {0x29, 2, 101}, - {0x38, 3, 101}, + {0x03, 0x02, 0x63}, + {0x06, 0x02, 0x63}, + {0x0A, 0x02, 0x63}, + {0x0F, 0x02, 0x63}, + {0x18, 0x02, 0x63}, + {0x1F, 0x02, 0x63}, + {0x29, 0x02, 0x63}, + {0x38, 0x03, 0x63}, + {0x03, 0x02, 0x65}, + {0x06, 0x02, 0x65}, + {0x0A, 0x02, 0x65}, + {0x0F, 0x02, 0x65}, + {0x18, 0x02, 0x65}, + {0x1F, 0x02, 0x65}, + {0x29, 0x02, 0x65}, + {0x38, 0x03, 0x65}, }, /* 8 */ { - {0x03, 2, 105}, - {0x06, 2, 105}, - {0x0a, 2, 105}, - {0x0f, 2, 105}, - {0x18, 2, 105}, - {0x1f, 2, 105}, - {0x29, 2, 105}, - {0x38, 3, 105}, - {0x03, 2, 111}, - {0x06, 2, 111}, - {0x0a, 2, 111}, - {0x0f, 2, 111}, - {0x18, 2, 111}, - {0x1f, 2, 111}, - {0x29, 2, 111}, - {0x38, 3, 111}, + {0x03, 0x02, 0x69}, + {0x06, 0x02, 0x69}, + {0x0A, 0x02, 0x69}, + {0x0F, 0x02, 0x69}, + {0x18, 0x02, 0x69}, + {0x1F, 0x02, 0x69}, + {0x29, 0x02, 0x69}, + {0x38, 0x03, 0x69}, + {0x03, 0x02, 0x6F}, + {0x06, 0x02, 0x6F}, + {0x0A, 0x02, 0x6F}, + {0x0F, 0x02, 0x6F}, + {0x18, 0x02, 0x6F}, + {0x1F, 0x02, 0x6F}, + {0x29, 0x02, 0x6F}, + {0x38, 0x03, 0x6F}, }, /* 9 */ { - {0x01, 2, 115}, - {0x16, 3, 115}, - {0x01, 2, 116}, - {0x16, 3, 116}, - {0x00, 3, 32}, - {0x00, 3, 37}, - {0x00, 3, 45}, - {0x00, 3, 46}, - {0x00, 3, 47}, - {0x00, 3, 51}, - {0x00, 3, 52}, - {0x00, 3, 53}, - {0x00, 3, 54}, - {0x00, 3, 55}, - {0x00, 3, 56}, - {0x00, 3, 57}, + {0x01, 0x02, 0x73}, + {0x16, 0x03, 0x73}, + {0x01, 0x02, 0x74}, + {0x16, 0x03, 0x74}, + {0x00, 0x03, 0x20}, + {0x00, 0x03, 0x25}, + {0x00, 0x03, 0x2D}, + {0x00, 0x03, 0x2E}, + {0x00, 0x03, 0x2F}, + {0x00, 0x03, 0x33}, + {0x00, 0x03, 0x34}, + {0x00, 0x03, 0x35}, + {0x00, 0x03, 0x36}, + {0x00, 0x03, 0x37}, + {0x00, 0x03, 0x38}, + {0x00, 0x03, 0x39}, }, /* 10 */ { - {0x02, 2, 115}, - {0x09, 2, 115}, - {0x17, 2, 115}, - {0x28, 3, 115}, - {0x02, 2, 116}, - {0x09, 2, 116}, - {0x17, 2, 116}, - {0x28, 3, 116}, - {0x01, 2, 32}, - {0x16, 3, 32}, - {0x01, 2, 37}, - {0x16, 3, 37}, - {0x01, 2, 45}, - {0x16, 3, 45}, - {0x01, 2, 46}, - {0x16, 3, 46}, + {0x02, 0x02, 0x73}, + {0x09, 0x02, 0x73}, + {0x17, 0x02, 0x73}, + {0x28, 0x03, 0x73}, + {0x02, 0x02, 0x74}, + {0x09, 0x02, 0x74}, + {0x17, 0x02, 0x74}, + {0x28, 0x03, 0x74}, + {0x01, 0x02, 0x20}, + {0x16, 0x03, 0x20}, + {0x01, 0x02, 0x25}, + {0x16, 0x03, 0x25}, + {0x01, 0x02, 0x2D}, + {0x16, 0x03, 0x2D}, + {0x01, 0x02, 0x2E}, + {0x16, 0x03, 0x2E}, }, /* 11 */ { - {0x03, 2, 115}, - {0x06, 2, 115}, - {0x0a, 2, 115}, - {0x0f, 2, 115}, - {0x18, 2, 115}, - {0x1f, 2, 115}, - {0x29, 2, 115}, - {0x38, 3, 115}, - {0x03, 2, 116}, - {0x06, 2, 116}, - {0x0a, 2, 116}, - {0x0f, 2, 116}, - {0x18, 2, 116}, - {0x1f, 2, 116}, - {0x29, 2, 116}, - {0x38, 3, 116}, + {0x03, 0x02, 0x73}, + {0x06, 0x02, 0x73}, + {0x0A, 0x02, 0x73}, + {0x0F, 0x02, 0x73}, + {0x18, 0x02, 0x73}, + {0x1F, 0x02, 0x73}, + {0x29, 0x02, 0x73}, + {0x38, 0x03, 0x73}, + {0x03, 0x02, 0x74}, + {0x06, 0x02, 0x74}, + {0x0A, 0x02, 0x74}, + {0x0F, 0x02, 0x74}, + {0x18, 0x02, 0x74}, + {0x1F, 0x02, 0x74}, + {0x29, 0x02, 0x74}, + {0x38, 0x03, 0x74}, }, /* 12 */ { - {0x02, 2, 32}, - {0x09, 2, 32}, - {0x17, 2, 32}, - {0x28, 3, 32}, - {0x02, 2, 37}, - {0x09, 2, 37}, - {0x17, 2, 37}, - {0x28, 3, 37}, - {0x02, 2, 45}, - {0x09, 2, 45}, - {0x17, 2, 45}, - {0x28, 3, 45}, - {0x02, 2, 46}, - {0x09, 2, 46}, - {0x17, 2, 46}, - {0x28, 3, 46}, + {0x02, 0x02, 0x20}, + {0x09, 0x02, 0x20}, + {0x17, 0x02, 0x20}, + {0x28, 0x03, 0x20}, + {0x02, 0x02, 0x25}, + {0x09, 0x02, 0x25}, + {0x17, 0x02, 0x25}, + {0x28, 0x03, 0x25}, + {0x02, 0x02, 0x2D}, + {0x09, 0x02, 0x2D}, + {0x17, 0x02, 0x2D}, + {0x28, 0x03, 0x2D}, + {0x02, 0x02, 0x2E}, + {0x09, 0x02, 0x2E}, + {0x17, 0x02, 0x2E}, + {0x28, 0x03, 0x2E}, }, /* 13 */ { - {0x03, 2, 32}, - {0x06, 2, 32}, - {0x0a, 2, 32}, - {0x0f, 2, 32}, - {0x18, 2, 32}, - {0x1f, 2, 32}, - {0x29, 2, 32}, - {0x38, 3, 32}, - {0x03, 2, 37}, - {0x06, 2, 37}, - {0x0a, 2, 37}, - {0x0f, 2, 37}, - {0x18, 2, 37}, - {0x1f, 2, 37}, - {0x29, 2, 37}, - {0x38, 3, 37}, + {0x03, 0x02, 0x20}, + {0x06, 0x02, 0x20}, + {0x0A, 0x02, 0x20}, + {0x0F, 0x02, 0x20}, + {0x18, 0x02, 0x20}, + {0x1F, 0x02, 0x20}, + {0x29, 0x02, 0x20}, + {0x38, 0x03, 0x20}, + {0x03, 0x02, 0x25}, + {0x06, 0x02, 0x25}, + {0x0A, 0x02, 0x25}, + {0x0F, 0x02, 0x25}, + {0x18, 0x02, 0x25}, + {0x1F, 0x02, 0x25}, + {0x29, 0x02, 0x25}, + {0x38, 0x03, 0x25}, }, /* 14 */ { - {0x03, 2, 45}, - {0x06, 2, 45}, - {0x0a, 2, 45}, - {0x0f, 2, 45}, - {0x18, 2, 45}, - {0x1f, 2, 45}, - {0x29, 2, 45}, - {0x38, 3, 45}, - {0x03, 2, 46}, - {0x06, 2, 46}, - {0x0a, 2, 46}, - {0x0f, 2, 46}, - {0x18, 2, 46}, - {0x1f, 2, 46}, - {0x29, 2, 46}, - {0x38, 3, 46}, + {0x03, 0x02, 0x2D}, + {0x06, 0x02, 0x2D}, + {0x0A, 0x02, 0x2D}, + {0x0F, 0x02, 0x2D}, + {0x18, 0x02, 0x2D}, + {0x1F, 0x02, 0x2D}, + {0x29, 0x02, 0x2D}, + {0x38, 0x03, 0x2D}, + {0x03, 0x02, 0x2E}, + {0x06, 0x02, 0x2E}, + {0x0A, 0x02, 0x2E}, + {0x0F, 0x02, 0x2E}, + {0x18, 0x02, 0x2E}, + {0x1F, 0x02, 0x2E}, + {0x29, 0x02, 0x2E}, + {0x38, 0x03, 0x2E}, }, /* 15 */ { - {0x01, 2, 47}, - {0x16, 3, 47}, - {0x01, 2, 51}, - {0x16, 3, 51}, - {0x01, 2, 52}, - {0x16, 3, 52}, - {0x01, 2, 53}, - {0x16, 3, 53}, - {0x01, 2, 54}, - {0x16, 3, 54}, - {0x01, 2, 55}, - {0x16, 3, 55}, - {0x01, 2, 56}, - {0x16, 3, 56}, - {0x01, 2, 57}, - {0x16, 3, 57}, + {0x01, 0x02, 0x2F}, + {0x16, 0x03, 0x2F}, + {0x01, 0x02, 0x33}, + {0x16, 0x03, 0x33}, + {0x01, 0x02, 0x34}, + {0x16, 0x03, 0x34}, + {0x01, 0x02, 0x35}, + {0x16, 0x03, 0x35}, + {0x01, 0x02, 0x36}, + {0x16, 0x03, 0x36}, + {0x01, 0x02, 0x37}, + {0x16, 0x03, 0x37}, + {0x01, 0x02, 0x38}, + {0x16, 0x03, 0x38}, + {0x01, 0x02, 0x39}, + {0x16, 0x03, 0x39}, }, /* 16 */ { - {0x02, 2, 47}, - {0x09, 2, 47}, - {0x17, 2, 47}, - {0x28, 3, 47}, - {0x02, 2, 51}, - {0x09, 2, 51}, - {0x17, 2, 51}, - {0x28, 3, 51}, - {0x02, 2, 52}, - {0x09, 2, 52}, - {0x17, 2, 52}, - {0x28, 3, 52}, - {0x02, 2, 53}, - {0x09, 2, 53}, - {0x17, 2, 53}, - {0x28, 3, 53}, + {0x02, 0x02, 0x2F}, + {0x09, 0x02, 0x2F}, + {0x17, 0x02, 0x2F}, + {0x28, 0x03, 0x2F}, + {0x02, 0x02, 0x33}, + {0x09, 0x02, 0x33}, + {0x17, 0x02, 0x33}, + {0x28, 0x03, 0x33}, + {0x02, 0x02, 0x34}, + {0x09, 0x02, 0x34}, + {0x17, 0x02, 0x34}, + {0x28, 0x03, 0x34}, + {0x02, 0x02, 0x35}, + {0x09, 0x02, 0x35}, + {0x17, 0x02, 0x35}, + {0x28, 0x03, 0x35}, }, /* 17 */ { - {0x03, 2, 47}, - {0x06, 2, 47}, - {0x0a, 2, 47}, - {0x0f, 2, 47}, - {0x18, 2, 47}, - {0x1f, 2, 47}, - {0x29, 2, 47}, - {0x38, 3, 47}, - {0x03, 2, 51}, - {0x06, 2, 51}, - {0x0a, 2, 51}, - {0x0f, 2, 51}, - {0x18, 2, 51}, - {0x1f, 2, 51}, - {0x29, 2, 51}, - {0x38, 3, 51}, + {0x03, 0x02, 0x2F}, + {0x06, 0x02, 0x2F}, + {0x0A, 0x02, 0x2F}, + {0x0F, 0x02, 0x2F}, + {0x18, 0x02, 0x2F}, + {0x1F, 0x02, 0x2F}, + {0x29, 0x02, 0x2F}, + {0x38, 0x03, 0x2F}, + {0x03, 0x02, 0x33}, + {0x06, 0x02, 0x33}, + {0x0A, 0x02, 0x33}, + {0x0F, 0x02, 0x33}, + {0x18, 0x02, 0x33}, + {0x1F, 0x02, 0x33}, + {0x29, 0x02, 0x33}, + {0x38, 0x03, 0x33}, }, /* 18 */ { - {0x03, 2, 52}, - {0x06, 2, 52}, - {0x0a, 2, 52}, - {0x0f, 2, 52}, - {0x18, 2, 52}, - {0x1f, 2, 52}, - {0x29, 2, 52}, - {0x38, 3, 52}, - {0x03, 2, 53}, - {0x06, 2, 53}, - {0x0a, 2, 53}, - {0x0f, 2, 53}, - {0x18, 2, 53}, - {0x1f, 2, 53}, - {0x29, 2, 53}, - {0x38, 3, 53}, + {0x03, 0x02, 0x34}, + {0x06, 0x02, 0x34}, + {0x0A, 0x02, 0x34}, + {0x0F, 0x02, 0x34}, + {0x18, 0x02, 0x34}, + {0x1F, 0x02, 0x34}, + {0x29, 0x02, 0x34}, + {0x38, 0x03, 0x34}, + {0x03, 0x02, 0x35}, + {0x06, 0x02, 0x35}, + {0x0A, 0x02, 0x35}, + {0x0F, 0x02, 0x35}, + {0x18, 0x02, 0x35}, + {0x1F, 0x02, 0x35}, + {0x29, 0x02, 0x35}, + {0x38, 0x03, 0x35}, }, /* 19 */ { - {0x02, 2, 54}, - {0x09, 2, 54}, - {0x17, 2, 54}, - {0x28, 3, 54}, - {0x02, 2, 55}, - {0x09, 2, 55}, - {0x17, 2, 55}, - {0x28, 3, 55}, - {0x02, 2, 56}, - {0x09, 2, 56}, - {0x17, 2, 56}, - {0x28, 3, 56}, - {0x02, 2, 57}, - {0x09, 2, 57}, - {0x17, 2, 57}, - {0x28, 3, 57}, + {0x02, 0x02, 0x36}, + {0x09, 0x02, 0x36}, + {0x17, 0x02, 0x36}, + {0x28, 0x03, 0x36}, + {0x02, 0x02, 0x37}, + {0x09, 0x02, 0x37}, + {0x17, 0x02, 0x37}, + {0x28, 0x03, 0x37}, + {0x02, 0x02, 0x38}, + {0x09, 0x02, 0x38}, + {0x17, 0x02, 0x38}, + {0x28, 0x03, 0x38}, + {0x02, 0x02, 0x39}, + {0x09, 0x02, 0x39}, + {0x17, 0x02, 0x39}, + {0x28, 0x03, 0x39}, }, /* 20 */ { - {0x03, 2, 54}, - {0x06, 2, 54}, - {0x0a, 2, 54}, - {0x0f, 2, 54}, - {0x18, 2, 54}, - {0x1f, 2, 54}, - {0x29, 2, 54}, - {0x38, 3, 54}, - {0x03, 2, 55}, - {0x06, 2, 55}, - {0x0a, 2, 55}, - {0x0f, 2, 55}, - {0x18, 2, 55}, - {0x1f, 2, 55}, - {0x29, 2, 55}, - {0x38, 3, 55}, + {0x03, 0x02, 0x36}, + {0x06, 0x02, 0x36}, + {0x0A, 0x02, 0x36}, + {0x0F, 0x02, 0x36}, + {0x18, 0x02, 0x36}, + {0x1F, 0x02, 0x36}, + {0x29, 0x02, 0x36}, + {0x38, 0x03, 0x36}, + {0x03, 0x02, 0x37}, + {0x06, 0x02, 0x37}, + {0x0A, 0x02, 0x37}, + {0x0F, 0x02, 0x37}, + {0x18, 0x02, 0x37}, + {0x1F, 0x02, 0x37}, + {0x29, 0x02, 0x37}, + {0x38, 0x03, 0x37}, }, /* 21 */ { - {0x03, 2, 56}, - {0x06, 2, 56}, - {0x0a, 2, 56}, - {0x0f, 2, 56}, - {0x18, 2, 56}, - {0x1f, 2, 56}, - {0x29, 2, 56}, - {0x38, 3, 56}, - {0x03, 2, 57}, - {0x06, 2, 57}, - {0x0a, 2, 57}, - {0x0f, 2, 57}, - {0x18, 2, 57}, - {0x1f, 2, 57}, - {0x29, 2, 57}, - {0x38, 3, 57}, + {0x03, 0x02, 0x38}, + {0x06, 0x02, 0x38}, + {0x0A, 0x02, 0x38}, + {0x0F, 0x02, 0x38}, + {0x18, 0x02, 0x38}, + {0x1F, 0x02, 0x38}, + {0x29, 0x02, 0x38}, + {0x38, 0x03, 0x38}, + {0x03, 0x02, 0x39}, + {0x06, 0x02, 0x39}, + {0x0A, 0x02, 0x39}, + {0x0F, 0x02, 0x39}, + {0x18, 0x02, 0x39}, + {0x1F, 0x02, 0x39}, + {0x29, 0x02, 0x39}, + {0x38, 0x03, 0x39}, }, /* 22 */ { - {0x1a, 0, 0}, - {0x1b, 0, 0}, - {0x1d, 0, 0}, - {0x1e, 0, 0}, - {0x21, 0, 0}, - {0x22, 0, 0}, - {0x24, 0, 0}, - {0x25, 0, 0}, - {0x2b, 0, 0}, - {0x2e, 0, 0}, - {0x32, 0, 0}, - {0x35, 0, 0}, - {0x3a, 0, 0}, - {0x3d, 0, 0}, - {0x41, 0, 0}, - {0x44, 1, 0}, + {0x1A, 0x00, 0x00}, + {0x1B, 0x00, 0x00}, + {0x1D, 0x00, 0x00}, + {0x1E, 0x00, 0x00}, + {0x21, 0x00, 0x00}, + {0x22, 0x00, 0x00}, + {0x24, 0x00, 0x00}, + {0x25, 0x00, 0x00}, + {0x2B, 0x00, 0x00}, + {0x2E, 0x00, 0x00}, + {0x32, 0x00, 0x00}, + {0x35, 0x00, 0x00}, + {0x3A, 0x00, 0x00}, + {0x3D, 0x00, 0x00}, + {0x41, 0x00, 0x00}, + {0x44, 0x01, 0x00}, }, /* 23 */ { - {0x00, 3, 61}, - {0x00, 3, 65}, - {0x00, 3, 95}, - {0x00, 3, 98}, - {0x00, 3, 100}, - {0x00, 3, 102}, - {0x00, 3, 103}, - {0x00, 3, 104}, - {0x00, 3, 108}, - {0x00, 3, 109}, - {0x00, 3, 110}, - {0x00, 3, 112}, - {0x00, 3, 114}, - {0x00, 3, 117}, - {0x26, 0, 0}, - {0x27, 0, 0}, + {0x00, 0x03, 0x3D}, + {0x00, 0x03, 0x41}, + {0x00, 0x03, 0x5F}, + {0x00, 0x03, 0x62}, + {0x00, 0x03, 0x64}, + {0x00, 0x03, 0x66}, + {0x00, 0x03, 0x67}, + {0x00, 0x03, 0x68}, + {0x00, 0x03, 0x6C}, + {0x00, 0x03, 0x6D}, + {0x00, 0x03, 0x6E}, + {0x00, 0x03, 0x70}, + {0x00, 0x03, 0x72}, + {0x00, 0x03, 0x75}, + {0x26, 0x00, 0x00}, + {0x27, 0x00, 0x00}, }, /* 24 */ { - {0x01, 2, 61}, - {0x16, 3, 61}, - {0x01, 2, 65}, - {0x16, 3, 65}, - {0x01, 2, 95}, - {0x16, 3, 95}, - {0x01, 2, 98}, - {0x16, 3, 98}, - {0x01, 2, 100}, - {0x16, 3, 100}, - {0x01, 2, 102}, - {0x16, 3, 102}, - {0x01, 2, 103}, - {0x16, 3, 103}, - {0x01, 2, 104}, - {0x16, 3, 104}, + {0x01, 0x02, 0x3D}, + {0x16, 0x03, 0x3D}, + {0x01, 0x02, 0x41}, + {0x16, 0x03, 0x41}, + {0x01, 0x02, 0x5F}, + {0x16, 0x03, 0x5F}, + {0x01, 0x02, 0x62}, + {0x16, 0x03, 0x62}, + {0x01, 0x02, 0x64}, + {0x16, 0x03, 0x64}, + {0x01, 0x02, 0x66}, + {0x16, 0x03, 0x66}, + {0x01, 0x02, 0x67}, + {0x16, 0x03, 0x67}, + {0x01, 0x02, 0x68}, + {0x16, 0x03, 0x68}, }, /* 25 */ { - {0x02, 2, 61}, - {0x09, 2, 61}, - {0x17, 2, 61}, - {0x28, 3, 61}, - {0x02, 2, 65}, - {0x09, 2, 65}, - {0x17, 2, 65}, - {0x28, 3, 65}, - {0x02, 2, 95}, - {0x09, 2, 95}, - {0x17, 2, 95}, - {0x28, 3, 95}, - {0x02, 2, 98}, - {0x09, 2, 98}, - {0x17, 2, 98}, - {0x28, 3, 98}, + {0x02, 0x02, 0x3D}, + {0x09, 0x02, 0x3D}, + {0x17, 0x02, 0x3D}, + {0x28, 0x03, 0x3D}, + {0x02, 0x02, 0x41}, + {0x09, 0x02, 0x41}, + {0x17, 0x02, 0x41}, + {0x28, 0x03, 0x41}, + {0x02, 0x02, 0x5F}, + {0x09, 0x02, 0x5F}, + {0x17, 0x02, 0x5F}, + {0x28, 0x03, 0x5F}, + {0x02, 0x02, 0x62}, + {0x09, 0x02, 0x62}, + {0x17, 0x02, 0x62}, + {0x28, 0x03, 0x62}, }, /* 26 */ { - {0x03, 2, 61}, - {0x06, 2, 61}, - {0x0a, 2, 61}, - {0x0f, 2, 61}, - {0x18, 2, 61}, - {0x1f, 2, 61}, - {0x29, 2, 61}, - {0x38, 3, 61}, - {0x03, 2, 65}, - {0x06, 2, 65}, - {0x0a, 2, 65}, - {0x0f, 2, 65}, - {0x18, 2, 65}, - {0x1f, 2, 65}, - {0x29, 2, 65}, - {0x38, 3, 65}, + {0x03, 0x02, 0x3D}, + {0x06, 0x02, 0x3D}, + {0x0A, 0x02, 0x3D}, + {0x0F, 0x02, 0x3D}, + {0x18, 0x02, 0x3D}, + {0x1F, 0x02, 0x3D}, + {0x29, 0x02, 0x3D}, + {0x38, 0x03, 0x3D}, + {0x03, 0x02, 0x41}, + {0x06, 0x02, 0x41}, + {0x0A, 0x02, 0x41}, + {0x0F, 0x02, 0x41}, + {0x18, 0x02, 0x41}, + {0x1F, 0x02, 0x41}, + {0x29, 0x02, 0x41}, + {0x38, 0x03, 0x41}, }, /* 27 */ { - {0x03, 2, 95}, - {0x06, 2, 95}, - {0x0a, 2, 95}, - {0x0f, 2, 95}, - {0x18, 2, 95}, - {0x1f, 2, 95}, - {0x29, 2, 95}, - {0x38, 3, 95}, - {0x03, 2, 98}, - {0x06, 2, 98}, - {0x0a, 2, 98}, - {0x0f, 2, 98}, - {0x18, 2, 98}, - {0x1f, 2, 98}, - {0x29, 2, 98}, - {0x38, 3, 98}, + {0x03, 0x02, 0x5F}, + {0x06, 0x02, 0x5F}, + {0x0A, 0x02, 0x5F}, + {0x0F, 0x02, 0x5F}, + {0x18, 0x02, 0x5F}, + {0x1F, 0x02, 0x5F}, + {0x29, 0x02, 0x5F}, + {0x38, 0x03, 0x5F}, + {0x03, 0x02, 0x62}, + {0x06, 0x02, 0x62}, + {0x0A, 0x02, 0x62}, + {0x0F, 0x02, 0x62}, + {0x18, 0x02, 0x62}, + {0x1F, 0x02, 0x62}, + {0x29, 0x02, 0x62}, + {0x38, 0x03, 0x62}, }, /* 28 */ { - {0x02, 2, 100}, - {0x09, 2, 100}, - {0x17, 2, 100}, - {0x28, 3, 100}, - {0x02, 2, 102}, - {0x09, 2, 102}, - {0x17, 2, 102}, - {0x28, 3, 102}, - {0x02, 2, 103}, - {0x09, 2, 103}, - {0x17, 2, 103}, - {0x28, 3, 103}, - {0x02, 2, 104}, - {0x09, 2, 104}, - {0x17, 2, 104}, - {0x28, 3, 104}, + {0x02, 0x02, 0x64}, + {0x09, 0x02, 0x64}, + {0x17, 0x02, 0x64}, + {0x28, 0x03, 0x64}, + {0x02, 0x02, 0x66}, + {0x09, 0x02, 0x66}, + {0x17, 0x02, 0x66}, + {0x28, 0x03, 0x66}, + {0x02, 0x02, 0x67}, + {0x09, 0x02, 0x67}, + {0x17, 0x02, 0x67}, + {0x28, 0x03, 0x67}, + {0x02, 0x02, 0x68}, + {0x09, 0x02, 0x68}, + {0x17, 0x02, 0x68}, + {0x28, 0x03, 0x68}, }, /* 29 */ { - {0x03, 2, 100}, - {0x06, 2, 100}, - {0x0a, 2, 100}, - {0x0f, 2, 100}, - {0x18, 2, 100}, - {0x1f, 2, 100}, - {0x29, 2, 100}, - {0x38, 3, 100}, - {0x03, 2, 102}, - {0x06, 2, 102}, - {0x0a, 2, 102}, - {0x0f, 2, 102}, - {0x18, 2, 102}, - {0x1f, 2, 102}, - {0x29, 2, 102}, - {0x38, 3, 102}, + {0x03, 0x02, 0x64}, + {0x06, 0x02, 0x64}, + {0x0A, 0x02, 0x64}, + {0x0F, 0x02, 0x64}, + {0x18, 0x02, 0x64}, + {0x1F, 0x02, 0x64}, + {0x29, 0x02, 0x64}, + {0x38, 0x03, 0x64}, + {0x03, 0x02, 0x66}, + {0x06, 0x02, 0x66}, + {0x0A, 0x02, 0x66}, + {0x0F, 0x02, 0x66}, + {0x18, 0x02, 0x66}, + {0x1F, 0x02, 0x66}, + {0x29, 0x02, 0x66}, + {0x38, 0x03, 0x66}, }, /* 30 */ { - {0x03, 2, 103}, - {0x06, 2, 103}, - {0x0a, 2, 103}, - {0x0f, 2, 103}, - {0x18, 2, 103}, - {0x1f, 2, 103}, - {0x29, 2, 103}, - {0x38, 3, 103}, - {0x03, 2, 104}, - {0x06, 2, 104}, - {0x0a, 2, 104}, - {0x0f, 2, 104}, - {0x18, 2, 104}, - {0x1f, 2, 104}, - {0x29, 2, 104}, - {0x38, 3, 104}, + {0x03, 0x02, 0x67}, + {0x06, 0x02, 0x67}, + {0x0A, 0x02, 0x67}, + {0x0F, 0x02, 0x67}, + {0x18, 0x02, 0x67}, + {0x1F, 0x02, 0x67}, + {0x29, 0x02, 0x67}, + {0x38, 0x03, 0x67}, + {0x03, 0x02, 0x68}, + {0x06, 0x02, 0x68}, + {0x0A, 0x02, 0x68}, + {0x0F, 0x02, 0x68}, + {0x18, 0x02, 0x68}, + {0x1F, 0x02, 0x68}, + {0x29, 0x02, 0x68}, + {0x38, 0x03, 0x68}, }, /* 31 */ { - {0x01, 2, 108}, - {0x16, 3, 108}, - {0x01, 2, 109}, - {0x16, 3, 109}, - {0x01, 2, 110}, - {0x16, 3, 110}, - {0x01, 2, 112}, - {0x16, 3, 112}, - {0x01, 2, 114}, - {0x16, 3, 114}, - {0x01, 2, 117}, - {0x16, 3, 117}, - {0x00, 3, 58}, - {0x00, 3, 66}, - {0x00, 3, 67}, - {0x00, 3, 68}, + {0x01, 0x02, 0x6C}, + {0x16, 0x03, 0x6C}, + {0x01, 0x02, 0x6D}, + {0x16, 0x03, 0x6D}, + {0x01, 0x02, 0x6E}, + {0x16, 0x03, 0x6E}, + {0x01, 0x02, 0x70}, + {0x16, 0x03, 0x70}, + {0x01, 0x02, 0x72}, + {0x16, 0x03, 0x72}, + {0x01, 0x02, 0x75}, + {0x16, 0x03, 0x75}, + {0x00, 0x03, 0x3A}, + {0x00, 0x03, 0x42}, + {0x00, 0x03, 0x43}, + {0x00, 0x03, 0x44}, }, /* 32 */ { - {0x02, 2, 108}, - {0x09, 2, 108}, - {0x17, 2, 108}, - {0x28, 3, 108}, - {0x02, 2, 109}, - {0x09, 2, 109}, - {0x17, 2, 109}, - {0x28, 3, 109}, - {0x02, 2, 110}, - {0x09, 2, 110}, - {0x17, 2, 110}, - {0x28, 3, 110}, - {0x02, 2, 112}, - {0x09, 2, 112}, - {0x17, 2, 112}, - {0x28, 3, 112}, + {0x02, 0x02, 0x6C}, + {0x09, 0x02, 0x6C}, + {0x17, 0x02, 0x6C}, + {0x28, 0x03, 0x6C}, + {0x02, 0x02, 0x6D}, + {0x09, 0x02, 0x6D}, + {0x17, 0x02, 0x6D}, + {0x28, 0x03, 0x6D}, + {0x02, 0x02, 0x6E}, + {0x09, 0x02, 0x6E}, + {0x17, 0x02, 0x6E}, + {0x28, 0x03, 0x6E}, + {0x02, 0x02, 0x70}, + {0x09, 0x02, 0x70}, + {0x17, 0x02, 0x70}, + {0x28, 0x03, 0x70}, }, /* 33 */ { - {0x03, 2, 108}, - {0x06, 2, 108}, - {0x0a, 2, 108}, - {0x0f, 2, 108}, - {0x18, 2, 108}, - {0x1f, 2, 108}, - {0x29, 2, 108}, - {0x38, 3, 108}, - {0x03, 2, 109}, - {0x06, 2, 109}, - {0x0a, 2, 109}, - {0x0f, 2, 109}, - {0x18, 2, 109}, - {0x1f, 2, 109}, - {0x29, 2, 109}, - {0x38, 3, 109}, + {0x03, 0x02, 0x6C}, + {0x06, 0x02, 0x6C}, + {0x0A, 0x02, 0x6C}, + {0x0F, 0x02, 0x6C}, + {0x18, 0x02, 0x6C}, + {0x1F, 0x02, 0x6C}, + {0x29, 0x02, 0x6C}, + {0x38, 0x03, 0x6C}, + {0x03, 0x02, 0x6D}, + {0x06, 0x02, 0x6D}, + {0x0A, 0x02, 0x6D}, + {0x0F, 0x02, 0x6D}, + {0x18, 0x02, 0x6D}, + {0x1F, 0x02, 0x6D}, + {0x29, 0x02, 0x6D}, + {0x38, 0x03, 0x6D}, }, /* 34 */ { - {0x03, 2, 110}, - {0x06, 2, 110}, - {0x0a, 2, 110}, - {0x0f, 2, 110}, - {0x18, 2, 110}, - {0x1f, 2, 110}, - {0x29, 2, 110}, - {0x38, 3, 110}, - {0x03, 2, 112}, - {0x06, 2, 112}, - {0x0a, 2, 112}, - {0x0f, 2, 112}, - {0x18, 2, 112}, - {0x1f, 2, 112}, - {0x29, 2, 112}, - {0x38, 3, 112}, + {0x03, 0x02, 0x6E}, + {0x06, 0x02, 0x6E}, + {0x0A, 0x02, 0x6E}, + {0x0F, 0x02, 0x6E}, + {0x18, 0x02, 0x6E}, + {0x1F, 0x02, 0x6E}, + {0x29, 0x02, 0x6E}, + {0x38, 0x03, 0x6E}, + {0x03, 0x02, 0x70}, + {0x06, 0x02, 0x70}, + {0x0A, 0x02, 0x70}, + {0x0F, 0x02, 0x70}, + {0x18, 0x02, 0x70}, + {0x1F, 0x02, 0x70}, + {0x29, 0x02, 0x70}, + {0x38, 0x03, 0x70}, }, /* 35 */ { - {0x02, 2, 114}, - {0x09, 2, 114}, - {0x17, 2, 114}, - {0x28, 3, 114}, - {0x02, 2, 117}, - {0x09, 2, 117}, - {0x17, 2, 117}, - {0x28, 3, 117}, - {0x01, 2, 58}, - {0x16, 3, 58}, - {0x01, 2, 66}, - {0x16, 3, 66}, - {0x01, 2, 67}, - {0x16, 3, 67}, - {0x01, 2, 68}, - {0x16, 3, 68}, + {0x02, 0x02, 0x72}, + {0x09, 0x02, 0x72}, + {0x17, 0x02, 0x72}, + {0x28, 0x03, 0x72}, + {0x02, 0x02, 0x75}, + {0x09, 0x02, 0x75}, + {0x17, 0x02, 0x75}, + {0x28, 0x03, 0x75}, + {0x01, 0x02, 0x3A}, + {0x16, 0x03, 0x3A}, + {0x01, 0x02, 0x42}, + {0x16, 0x03, 0x42}, + {0x01, 0x02, 0x43}, + {0x16, 0x03, 0x43}, + {0x01, 0x02, 0x44}, + {0x16, 0x03, 0x44}, }, /* 36 */ { - {0x03, 2, 114}, - {0x06, 2, 114}, - {0x0a, 2, 114}, - {0x0f, 2, 114}, - {0x18, 2, 114}, - {0x1f, 2, 114}, - {0x29, 2, 114}, - {0x38, 3, 114}, - {0x03, 2, 117}, - {0x06, 2, 117}, - {0x0a, 2, 117}, - {0x0f, 2, 117}, - {0x18, 2, 117}, - {0x1f, 2, 117}, - {0x29, 2, 117}, - {0x38, 3, 117}, + {0x03, 0x02, 0x72}, + {0x06, 0x02, 0x72}, + {0x0A, 0x02, 0x72}, + {0x0F, 0x02, 0x72}, + {0x18, 0x02, 0x72}, + {0x1F, 0x02, 0x72}, + {0x29, 0x02, 0x72}, + {0x38, 0x03, 0x72}, + {0x03, 0x02, 0x75}, + {0x06, 0x02, 0x75}, + {0x0A, 0x02, 0x75}, + {0x0F, 0x02, 0x75}, + {0x18, 0x02, 0x75}, + {0x1F, 0x02, 0x75}, + {0x29, 0x02, 0x75}, + {0x38, 0x03, 0x75}, }, /* 37 */ { - {0x02, 2, 58}, - {0x09, 2, 58}, - {0x17, 2, 58}, - {0x28, 3, 58}, - {0x02, 2, 66}, - {0x09, 2, 66}, - {0x17, 2, 66}, - {0x28, 3, 66}, - {0x02, 2, 67}, - {0x09, 2, 67}, - {0x17, 2, 67}, - {0x28, 3, 67}, - {0x02, 2, 68}, - {0x09, 2, 68}, - {0x17, 2, 68}, - {0x28, 3, 68}, + {0x02, 0x02, 0x3A}, + {0x09, 0x02, 0x3A}, + {0x17, 0x02, 0x3A}, + {0x28, 0x03, 0x3A}, + {0x02, 0x02, 0x42}, + {0x09, 0x02, 0x42}, + {0x17, 0x02, 0x42}, + {0x28, 0x03, 0x42}, + {0x02, 0x02, 0x43}, + {0x09, 0x02, 0x43}, + {0x17, 0x02, 0x43}, + {0x28, 0x03, 0x43}, + {0x02, 0x02, 0x44}, + {0x09, 0x02, 0x44}, + {0x17, 0x02, 0x44}, + {0x28, 0x03, 0x44}, }, /* 38 */ { - {0x03, 2, 58}, - {0x06, 2, 58}, - {0x0a, 2, 58}, - {0x0f, 2, 58}, - {0x18, 2, 58}, - {0x1f, 2, 58}, - {0x29, 2, 58}, - {0x38, 3, 58}, - {0x03, 2, 66}, - {0x06, 2, 66}, - {0x0a, 2, 66}, - {0x0f, 2, 66}, - {0x18, 2, 66}, - {0x1f, 2, 66}, - {0x29, 2, 66}, - {0x38, 3, 66}, + {0x03, 0x02, 0x3A}, + {0x06, 0x02, 0x3A}, + {0x0A, 0x02, 0x3A}, + {0x0F, 0x02, 0x3A}, + {0x18, 0x02, 0x3A}, + {0x1F, 0x02, 0x3A}, + {0x29, 0x02, 0x3A}, + {0x38, 0x03, 0x3A}, + {0x03, 0x02, 0x42}, + {0x06, 0x02, 0x42}, + {0x0A, 0x02, 0x42}, + {0x0F, 0x02, 0x42}, + {0x18, 0x02, 0x42}, + {0x1F, 0x02, 0x42}, + {0x29, 0x02, 0x42}, + {0x38, 0x03, 0x42}, }, /* 39 */ { - {0x03, 2, 67}, - {0x06, 2, 67}, - {0x0a, 2, 67}, - {0x0f, 2, 67}, - {0x18, 2, 67}, - {0x1f, 2, 67}, - {0x29, 2, 67}, - {0x38, 3, 67}, - {0x03, 2, 68}, - {0x06, 2, 68}, - {0x0a, 2, 68}, - {0x0f, 2, 68}, - {0x18, 2, 68}, - {0x1f, 2, 68}, - {0x29, 2, 68}, - {0x38, 3, 68}, + {0x03, 0x02, 0x43}, + {0x06, 0x02, 0x43}, + {0x0A, 0x02, 0x43}, + {0x0F, 0x02, 0x43}, + {0x18, 0x02, 0x43}, + {0x1F, 0x02, 0x43}, + {0x29, 0x02, 0x43}, + {0x38, 0x03, 0x43}, + {0x03, 0x02, 0x44}, + {0x06, 0x02, 0x44}, + {0x0A, 0x02, 0x44}, + {0x0F, 0x02, 0x44}, + {0x18, 0x02, 0x44}, + {0x1F, 0x02, 0x44}, + {0x29, 0x02, 0x44}, + {0x38, 0x03, 0x44}, }, /* 40 */ { - {0x2c, 0, 0}, - {0x2d, 0, 0}, - {0x2f, 0, 0}, - {0x30, 0, 0}, - {0x33, 0, 0}, - {0x34, 0, 0}, - {0x36, 0, 0}, - {0x37, 0, 0}, - {0x3b, 0, 0}, - {0x3c, 0, 0}, - {0x3e, 0, 0}, - {0x3f, 0, 0}, - {0x42, 0, 0}, - {0x43, 0, 0}, - {0x45, 0, 0}, - {0x48, 1, 0}, + {0x2C, 0x00, 0x00}, + {0x2D, 0x00, 0x00}, + {0x2F, 0x00, 0x00}, + {0x30, 0x00, 0x00}, + {0x33, 0x00, 0x00}, + {0x34, 0x00, 0x00}, + {0x36, 0x00, 0x00}, + {0x37, 0x00, 0x00}, + {0x3B, 0x00, 0x00}, + {0x3C, 0x00, 0x00}, + {0x3E, 0x00, 0x00}, + {0x3F, 0x00, 0x00}, + {0x42, 0x00, 0x00}, + {0x43, 0x00, 0x00}, + {0x45, 0x00, 0x00}, + {0x48, 0x01, 0x00}, }, /* 41 */ { - {0x00, 3, 69}, - {0x00, 3, 70}, - {0x00, 3, 71}, - {0x00, 3, 72}, - {0x00, 3, 73}, - {0x00, 3, 74}, - {0x00, 3, 75}, - {0x00, 3, 76}, - {0x00, 3, 77}, - {0x00, 3, 78}, - {0x00, 3, 79}, - {0x00, 3, 80}, - {0x00, 3, 81}, - {0x00, 3, 82}, - {0x00, 3, 83}, - {0x00, 3, 84}, + {0x00, 0x03, 0x45}, + {0x00, 0x03, 0x46}, + {0x00, 0x03, 0x47}, + {0x00, 0x03, 0x48}, + {0x00, 0x03, 0x49}, + {0x00, 0x03, 0x4A}, + {0x00, 0x03, 0x4B}, + {0x00, 0x03, 0x4C}, + {0x00, 0x03, 0x4D}, + {0x00, 0x03, 0x4E}, + {0x00, 0x03, 0x4F}, + {0x00, 0x03, 0x50}, + {0x00, 0x03, 0x51}, + {0x00, 0x03, 0x52}, + {0x00, 0x03, 0x53}, + {0x00, 0x03, 0x54}, }, /* 42 */ { - {0x01, 2, 69}, - {0x16, 3, 69}, - {0x01, 2, 70}, - {0x16, 3, 70}, - {0x01, 2, 71}, - {0x16, 3, 71}, - {0x01, 2, 72}, - {0x16, 3, 72}, - {0x01, 2, 73}, - {0x16, 3, 73}, - {0x01, 2, 74}, - {0x16, 3, 74}, - {0x01, 2, 75}, - {0x16, 3, 75}, - {0x01, 2, 76}, - {0x16, 3, 76}, + {0x01, 0x02, 0x45}, + {0x16, 0x03, 0x45}, + {0x01, 0x02, 0x46}, + {0x16, 0x03, 0x46}, + {0x01, 0x02, 0x47}, + {0x16, 0x03, 0x47}, + {0x01, 0x02, 0x48}, + {0x16, 0x03, 0x48}, + {0x01, 0x02, 0x49}, + {0x16, 0x03, 0x49}, + {0x01, 0x02, 0x4A}, + {0x16, 0x03, 0x4A}, + {0x01, 0x02, 0x4B}, + {0x16, 0x03, 0x4B}, + {0x01, 0x02, 0x4C}, + {0x16, 0x03, 0x4C}, }, /* 43 */ { - {0x02, 2, 69}, - {0x09, 2, 69}, - {0x17, 2, 69}, - {0x28, 3, 69}, - {0x02, 2, 70}, - {0x09, 2, 70}, - {0x17, 2, 70}, - {0x28, 3, 70}, - {0x02, 2, 71}, - {0x09, 2, 71}, - {0x17, 2, 71}, - {0x28, 3, 71}, - {0x02, 2, 72}, - {0x09, 2, 72}, - {0x17, 2, 72}, - {0x28, 3, 72}, + {0x02, 0x02, 0x45}, + {0x09, 0x02, 0x45}, + {0x17, 0x02, 0x45}, + {0x28, 0x03, 0x45}, + {0x02, 0x02, 0x46}, + {0x09, 0x02, 0x46}, + {0x17, 0x02, 0x46}, + {0x28, 0x03, 0x46}, + {0x02, 0x02, 0x47}, + {0x09, 0x02, 0x47}, + {0x17, 0x02, 0x47}, + {0x28, 0x03, 0x47}, + {0x02, 0x02, 0x48}, + {0x09, 0x02, 0x48}, + {0x17, 0x02, 0x48}, + {0x28, 0x03, 0x48}, }, /* 44 */ { - {0x03, 2, 69}, - {0x06, 2, 69}, - {0x0a, 2, 69}, - {0x0f, 2, 69}, - {0x18, 2, 69}, - {0x1f, 2, 69}, - {0x29, 2, 69}, - {0x38, 3, 69}, - {0x03, 2, 70}, - {0x06, 2, 70}, - {0x0a, 2, 70}, - {0x0f, 2, 70}, - {0x18, 2, 70}, - {0x1f, 2, 70}, - {0x29, 2, 70}, - {0x38, 3, 70}, + {0x03, 0x02, 0x45}, + {0x06, 0x02, 0x45}, + {0x0A, 0x02, 0x45}, + {0x0F, 0x02, 0x45}, + {0x18, 0x02, 0x45}, + {0x1F, 0x02, 0x45}, + {0x29, 0x02, 0x45}, + {0x38, 0x03, 0x45}, + {0x03, 0x02, 0x46}, + {0x06, 0x02, 0x46}, + {0x0A, 0x02, 0x46}, + {0x0F, 0x02, 0x46}, + {0x18, 0x02, 0x46}, + {0x1F, 0x02, 0x46}, + {0x29, 0x02, 0x46}, + {0x38, 0x03, 0x46}, }, /* 45 */ { - {0x03, 2, 71}, - {0x06, 2, 71}, - {0x0a, 2, 71}, - {0x0f, 2, 71}, - {0x18, 2, 71}, - {0x1f, 2, 71}, - {0x29, 2, 71}, - {0x38, 3, 71}, - {0x03, 2, 72}, - {0x06, 2, 72}, - {0x0a, 2, 72}, - {0x0f, 2, 72}, - {0x18, 2, 72}, - {0x1f, 2, 72}, - {0x29, 2, 72}, - {0x38, 3, 72}, + {0x03, 0x02, 0x47}, + {0x06, 0x02, 0x47}, + {0x0A, 0x02, 0x47}, + {0x0F, 0x02, 0x47}, + {0x18, 0x02, 0x47}, + {0x1F, 0x02, 0x47}, + {0x29, 0x02, 0x47}, + {0x38, 0x03, 0x47}, + {0x03, 0x02, 0x48}, + {0x06, 0x02, 0x48}, + {0x0A, 0x02, 0x48}, + {0x0F, 0x02, 0x48}, + {0x18, 0x02, 0x48}, + {0x1F, 0x02, 0x48}, + {0x29, 0x02, 0x48}, + {0x38, 0x03, 0x48}, }, /* 46 */ { - {0x02, 2, 73}, - {0x09, 2, 73}, - {0x17, 2, 73}, - {0x28, 3, 73}, - {0x02, 2, 74}, - {0x09, 2, 74}, - {0x17, 2, 74}, - {0x28, 3, 74}, - {0x02, 2, 75}, - {0x09, 2, 75}, - {0x17, 2, 75}, - {0x28, 3, 75}, - {0x02, 2, 76}, - {0x09, 2, 76}, - {0x17, 2, 76}, - {0x28, 3, 76}, + {0x02, 0x02, 0x49}, + {0x09, 0x02, 0x49}, + {0x17, 0x02, 0x49}, + {0x28, 0x03, 0x49}, + {0x02, 0x02, 0x4A}, + {0x09, 0x02, 0x4A}, + {0x17, 0x02, 0x4A}, + {0x28, 0x03, 0x4A}, + {0x02, 0x02, 0x4B}, + {0x09, 0x02, 0x4B}, + {0x17, 0x02, 0x4B}, + {0x28, 0x03, 0x4B}, + {0x02, 0x02, 0x4C}, + {0x09, 0x02, 0x4C}, + {0x17, 0x02, 0x4C}, + {0x28, 0x03, 0x4C}, }, /* 47 */ { - {0x03, 2, 73}, - {0x06, 2, 73}, - {0x0a, 2, 73}, - {0x0f, 2, 73}, - {0x18, 2, 73}, - {0x1f, 2, 73}, - {0x29, 2, 73}, - {0x38, 3, 73}, - {0x03, 2, 74}, - {0x06, 2, 74}, - {0x0a, 2, 74}, - {0x0f, 2, 74}, - {0x18, 2, 74}, - {0x1f, 2, 74}, - {0x29, 2, 74}, - {0x38, 3, 74}, + {0x03, 0x02, 0x49}, + {0x06, 0x02, 0x49}, + {0x0A, 0x02, 0x49}, + {0x0F, 0x02, 0x49}, + {0x18, 0x02, 0x49}, + {0x1F, 0x02, 0x49}, + {0x29, 0x02, 0x49}, + {0x38, 0x03, 0x49}, + {0x03, 0x02, 0x4A}, + {0x06, 0x02, 0x4A}, + {0x0A, 0x02, 0x4A}, + {0x0F, 0x02, 0x4A}, + {0x18, 0x02, 0x4A}, + {0x1F, 0x02, 0x4A}, + {0x29, 0x02, 0x4A}, + {0x38, 0x03, 0x4A}, }, /* 48 */ { - {0x03, 2, 75}, - {0x06, 2, 75}, - {0x0a, 2, 75}, - {0x0f, 2, 75}, - {0x18, 2, 75}, - {0x1f, 2, 75}, - {0x29, 2, 75}, - {0x38, 3, 75}, - {0x03, 2, 76}, - {0x06, 2, 76}, - {0x0a, 2, 76}, - {0x0f, 2, 76}, - {0x18, 2, 76}, - {0x1f, 2, 76}, - {0x29, 2, 76}, - {0x38, 3, 76}, + {0x03, 0x02, 0x4B}, + {0x06, 0x02, 0x4B}, + {0x0A, 0x02, 0x4B}, + {0x0F, 0x02, 0x4B}, + {0x18, 0x02, 0x4B}, + {0x1F, 0x02, 0x4B}, + {0x29, 0x02, 0x4B}, + {0x38, 0x03, 0x4B}, + {0x03, 0x02, 0x4C}, + {0x06, 0x02, 0x4C}, + {0x0A, 0x02, 0x4C}, + {0x0F, 0x02, 0x4C}, + {0x18, 0x02, 0x4C}, + {0x1F, 0x02, 0x4C}, + {0x29, 0x02, 0x4C}, + {0x38, 0x03, 0x4C}, }, /* 49 */ { - {0x01, 2, 77}, - {0x16, 3, 77}, - {0x01, 2, 78}, - {0x16, 3, 78}, - {0x01, 2, 79}, - {0x16, 3, 79}, - {0x01, 2, 80}, - {0x16, 3, 80}, - {0x01, 2, 81}, - {0x16, 3, 81}, - {0x01, 2, 82}, - {0x16, 3, 82}, - {0x01, 2, 83}, - {0x16, 3, 83}, - {0x01, 2, 84}, - {0x16, 3, 84}, + {0x01, 0x02, 0x4D}, + {0x16, 0x03, 0x4D}, + {0x01, 0x02, 0x4E}, + {0x16, 0x03, 0x4E}, + {0x01, 0x02, 0x4F}, + {0x16, 0x03, 0x4F}, + {0x01, 0x02, 0x50}, + {0x16, 0x03, 0x50}, + {0x01, 0x02, 0x51}, + {0x16, 0x03, 0x51}, + {0x01, 0x02, 0x52}, + {0x16, 0x03, 0x52}, + {0x01, 0x02, 0x53}, + {0x16, 0x03, 0x53}, + {0x01, 0x02, 0x54}, + {0x16, 0x03, 0x54}, }, /* 50 */ { - {0x02, 2, 77}, - {0x09, 2, 77}, - {0x17, 2, 77}, - {0x28, 3, 77}, - {0x02, 2, 78}, - {0x09, 2, 78}, - {0x17, 2, 78}, - {0x28, 3, 78}, - {0x02, 2, 79}, - {0x09, 2, 79}, - {0x17, 2, 79}, - {0x28, 3, 79}, - {0x02, 2, 80}, - {0x09, 2, 80}, - {0x17, 2, 80}, - {0x28, 3, 80}, + {0x02, 0x02, 0x4D}, + {0x09, 0x02, 0x4D}, + {0x17, 0x02, 0x4D}, + {0x28, 0x03, 0x4D}, + {0x02, 0x02, 0x4E}, + {0x09, 0x02, 0x4E}, + {0x17, 0x02, 0x4E}, + {0x28, 0x03, 0x4E}, + {0x02, 0x02, 0x4F}, + {0x09, 0x02, 0x4F}, + {0x17, 0x02, 0x4F}, + {0x28, 0x03, 0x4F}, + {0x02, 0x02, 0x50}, + {0x09, 0x02, 0x50}, + {0x17, 0x02, 0x50}, + {0x28, 0x03, 0x50}, }, /* 51 */ { - {0x03, 2, 77}, - {0x06, 2, 77}, - {0x0a, 2, 77}, - {0x0f, 2, 77}, - {0x18, 2, 77}, - {0x1f, 2, 77}, - {0x29, 2, 77}, - {0x38, 3, 77}, - {0x03, 2, 78}, - {0x06, 2, 78}, - {0x0a, 2, 78}, - {0x0f, 2, 78}, - {0x18, 2, 78}, - {0x1f, 2, 78}, - {0x29, 2, 78}, - {0x38, 3, 78}, + {0x03, 0x02, 0x4D}, + {0x06, 0x02, 0x4D}, + {0x0A, 0x02, 0x4D}, + {0x0F, 0x02, 0x4D}, + {0x18, 0x02, 0x4D}, + {0x1F, 0x02, 0x4D}, + {0x29, 0x02, 0x4D}, + {0x38, 0x03, 0x4D}, + {0x03, 0x02, 0x4E}, + {0x06, 0x02, 0x4E}, + {0x0A, 0x02, 0x4E}, + {0x0F, 0x02, 0x4E}, + {0x18, 0x02, 0x4E}, + {0x1F, 0x02, 0x4E}, + {0x29, 0x02, 0x4E}, + {0x38, 0x03, 0x4E}, }, /* 52 */ { - {0x03, 2, 79}, - {0x06, 2, 79}, - {0x0a, 2, 79}, - {0x0f, 2, 79}, - {0x18, 2, 79}, - {0x1f, 2, 79}, - {0x29, 2, 79}, - {0x38, 3, 79}, - {0x03, 2, 80}, - {0x06, 2, 80}, - {0x0a, 2, 80}, - {0x0f, 2, 80}, - {0x18, 2, 80}, - {0x1f, 2, 80}, - {0x29, 2, 80}, - {0x38, 3, 80}, + {0x03, 0x02, 0x4F}, + {0x06, 0x02, 0x4F}, + {0x0A, 0x02, 0x4F}, + {0x0F, 0x02, 0x4F}, + {0x18, 0x02, 0x4F}, + {0x1F, 0x02, 0x4F}, + {0x29, 0x02, 0x4F}, + {0x38, 0x03, 0x4F}, + {0x03, 0x02, 0x50}, + {0x06, 0x02, 0x50}, + {0x0A, 0x02, 0x50}, + {0x0F, 0x02, 0x50}, + {0x18, 0x02, 0x50}, + {0x1F, 0x02, 0x50}, + {0x29, 0x02, 0x50}, + {0x38, 0x03, 0x50}, }, /* 53 */ { - {0x02, 2, 81}, - {0x09, 2, 81}, - {0x17, 2, 81}, - {0x28, 3, 81}, - {0x02, 2, 82}, - {0x09, 2, 82}, - {0x17, 2, 82}, - {0x28, 3, 82}, - {0x02, 2, 83}, - {0x09, 2, 83}, - {0x17, 2, 83}, - {0x28, 3, 83}, - {0x02, 2, 84}, - {0x09, 2, 84}, - {0x17, 2, 84}, - {0x28, 3, 84}, + {0x02, 0x02, 0x51}, + {0x09, 0x02, 0x51}, + {0x17, 0x02, 0x51}, + {0x28, 0x03, 0x51}, + {0x02, 0x02, 0x52}, + {0x09, 0x02, 0x52}, + {0x17, 0x02, 0x52}, + {0x28, 0x03, 0x52}, + {0x02, 0x02, 0x53}, + {0x09, 0x02, 0x53}, + {0x17, 0x02, 0x53}, + {0x28, 0x03, 0x53}, + {0x02, 0x02, 0x54}, + {0x09, 0x02, 0x54}, + {0x17, 0x02, 0x54}, + {0x28, 0x03, 0x54}, }, /* 54 */ { - {0x03, 2, 81}, - {0x06, 2, 81}, - {0x0a, 2, 81}, - {0x0f, 2, 81}, - {0x18, 2, 81}, - {0x1f, 2, 81}, - {0x29, 2, 81}, - {0x38, 3, 81}, - {0x03, 2, 82}, - {0x06, 2, 82}, - {0x0a, 2, 82}, - {0x0f, 2, 82}, - {0x18, 2, 82}, - {0x1f, 2, 82}, - {0x29, 2, 82}, - {0x38, 3, 82}, + {0x03, 0x02, 0x51}, + {0x06, 0x02, 0x51}, + {0x0A, 0x02, 0x51}, + {0x0F, 0x02, 0x51}, + {0x18, 0x02, 0x51}, + {0x1F, 0x02, 0x51}, + {0x29, 0x02, 0x51}, + {0x38, 0x03, 0x51}, + {0x03, 0x02, 0x52}, + {0x06, 0x02, 0x52}, + {0x0A, 0x02, 0x52}, + {0x0F, 0x02, 0x52}, + {0x18, 0x02, 0x52}, + {0x1F, 0x02, 0x52}, + {0x29, 0x02, 0x52}, + {0x38, 0x03, 0x52}, }, /* 55 */ { - {0x03, 2, 83}, - {0x06, 2, 83}, - {0x0a, 2, 83}, - {0x0f, 2, 83}, - {0x18, 2, 83}, - {0x1f, 2, 83}, - {0x29, 2, 83}, - {0x38, 3, 83}, - {0x03, 2, 84}, - {0x06, 2, 84}, - {0x0a, 2, 84}, - {0x0f, 2, 84}, - {0x18, 2, 84}, - {0x1f, 2, 84}, - {0x29, 2, 84}, - {0x38, 3, 84}, + {0x03, 0x02, 0x53}, + {0x06, 0x02, 0x53}, + {0x0A, 0x02, 0x53}, + {0x0F, 0x02, 0x53}, + {0x18, 0x02, 0x53}, + {0x1F, 0x02, 0x53}, + {0x29, 0x02, 0x53}, + {0x38, 0x03, 0x53}, + {0x03, 0x02, 0x54}, + {0x06, 0x02, 0x54}, + {0x0A, 0x02, 0x54}, + {0x0F, 0x02, 0x54}, + {0x18, 0x02, 0x54}, + {0x1F, 0x02, 0x54}, + {0x29, 0x02, 0x54}, + {0x38, 0x03, 0x54}, }, /* 56 */ { - {0x00, 3, 85}, - {0x00, 3, 86}, - {0x00, 3, 87}, - {0x00, 3, 89}, - {0x00, 3, 106}, - {0x00, 3, 107}, - {0x00, 3, 113}, - {0x00, 3, 118}, - {0x00, 3, 119}, - {0x00, 3, 120}, - {0x00, 3, 121}, - {0x00, 3, 122}, - {0x46, 0, 0}, - {0x47, 0, 0}, - {0x49, 0, 0}, - {0x4a, 1, 0}, + {0x00, 0x03, 0x55}, + {0x00, 0x03, 0x56}, + {0x00, 0x03, 0x57}, + {0x00, 0x03, 0x59}, + {0x00, 0x03, 0x6A}, + {0x00, 0x03, 0x6B}, + {0x00, 0x03, 0x71}, + {0x00, 0x03, 0x76}, + {0x00, 0x03, 0x77}, + {0x00, 0x03, 0x78}, + {0x00, 0x03, 0x79}, + {0x00, 0x03, 0x7A}, + {0x46, 0x00, 0x00}, + {0x47, 0x00, 0x00}, + {0x49, 0x00, 0x00}, + {0x4A, 0x01, 0x00}, }, /* 57 */ { - {0x01, 2, 85}, - {0x16, 3, 85}, - {0x01, 2, 86}, - {0x16, 3, 86}, - {0x01, 2, 87}, - {0x16, 3, 87}, - {0x01, 2, 89}, - {0x16, 3, 89}, - {0x01, 2, 106}, - {0x16, 3, 106}, - {0x01, 2, 107}, - {0x16, 3, 107}, - {0x01, 2, 113}, - {0x16, 3, 113}, - {0x01, 2, 118}, - {0x16, 3, 118}, + {0x01, 0x02, 0x55}, + {0x16, 0x03, 0x55}, + {0x01, 0x02, 0x56}, + {0x16, 0x03, 0x56}, + {0x01, 0x02, 0x57}, + {0x16, 0x03, 0x57}, + {0x01, 0x02, 0x59}, + {0x16, 0x03, 0x59}, + {0x01, 0x02, 0x6A}, + {0x16, 0x03, 0x6A}, + {0x01, 0x02, 0x6B}, + {0x16, 0x03, 0x6B}, + {0x01, 0x02, 0x71}, + {0x16, 0x03, 0x71}, + {0x01, 0x02, 0x76}, + {0x16, 0x03, 0x76}, }, /* 58 */ { - {0x02, 2, 85}, - {0x09, 2, 85}, - {0x17, 2, 85}, - {0x28, 3, 85}, - {0x02, 2, 86}, - {0x09, 2, 86}, - {0x17, 2, 86}, - {0x28, 3, 86}, - {0x02, 2, 87}, - {0x09, 2, 87}, - {0x17, 2, 87}, - {0x28, 3, 87}, - {0x02, 2, 89}, - {0x09, 2, 89}, - {0x17, 2, 89}, - {0x28, 3, 89}, + {0x02, 0x02, 0x55}, + {0x09, 0x02, 0x55}, + {0x17, 0x02, 0x55}, + {0x28, 0x03, 0x55}, + {0x02, 0x02, 0x56}, + {0x09, 0x02, 0x56}, + {0x17, 0x02, 0x56}, + {0x28, 0x03, 0x56}, + {0x02, 0x02, 0x57}, + {0x09, 0x02, 0x57}, + {0x17, 0x02, 0x57}, + {0x28, 0x03, 0x57}, + {0x02, 0x02, 0x59}, + {0x09, 0x02, 0x59}, + {0x17, 0x02, 0x59}, + {0x28, 0x03, 0x59}, }, /* 59 */ { - {0x03, 2, 85}, - {0x06, 2, 85}, - {0x0a, 2, 85}, - {0x0f, 2, 85}, - {0x18, 2, 85}, - {0x1f, 2, 85}, - {0x29, 2, 85}, - {0x38, 3, 85}, - {0x03, 2, 86}, - {0x06, 2, 86}, - {0x0a, 2, 86}, - {0x0f, 2, 86}, - {0x18, 2, 86}, - {0x1f, 2, 86}, - {0x29, 2, 86}, - {0x38, 3, 86}, + {0x03, 0x02, 0x55}, + {0x06, 0x02, 0x55}, + {0x0A, 0x02, 0x55}, + {0x0F, 0x02, 0x55}, + {0x18, 0x02, 0x55}, + {0x1F, 0x02, 0x55}, + {0x29, 0x02, 0x55}, + {0x38, 0x03, 0x55}, + {0x03, 0x02, 0x56}, + {0x06, 0x02, 0x56}, + {0x0A, 0x02, 0x56}, + {0x0F, 0x02, 0x56}, + {0x18, 0x02, 0x56}, + {0x1F, 0x02, 0x56}, + {0x29, 0x02, 0x56}, + {0x38, 0x03, 0x56}, }, /* 60 */ { - {0x03, 2, 87}, - {0x06, 2, 87}, - {0x0a, 2, 87}, - {0x0f, 2, 87}, - {0x18, 2, 87}, - {0x1f, 2, 87}, - {0x29, 2, 87}, - {0x38, 3, 87}, - {0x03, 2, 89}, - {0x06, 2, 89}, - {0x0a, 2, 89}, - {0x0f, 2, 89}, - {0x18, 2, 89}, - {0x1f, 2, 89}, - {0x29, 2, 89}, - {0x38, 3, 89}, + {0x03, 0x02, 0x57}, + {0x06, 0x02, 0x57}, + {0x0A, 0x02, 0x57}, + {0x0F, 0x02, 0x57}, + {0x18, 0x02, 0x57}, + {0x1F, 0x02, 0x57}, + {0x29, 0x02, 0x57}, + {0x38, 0x03, 0x57}, + {0x03, 0x02, 0x59}, + {0x06, 0x02, 0x59}, + {0x0A, 0x02, 0x59}, + {0x0F, 0x02, 0x59}, + {0x18, 0x02, 0x59}, + {0x1F, 0x02, 0x59}, + {0x29, 0x02, 0x59}, + {0x38, 0x03, 0x59}, }, /* 61 */ { - {0x02, 2, 106}, - {0x09, 2, 106}, - {0x17, 2, 106}, - {0x28, 3, 106}, - {0x02, 2, 107}, - {0x09, 2, 107}, - {0x17, 2, 107}, - {0x28, 3, 107}, - {0x02, 2, 113}, - {0x09, 2, 113}, - {0x17, 2, 113}, - {0x28, 3, 113}, - {0x02, 2, 118}, - {0x09, 2, 118}, - {0x17, 2, 118}, - {0x28, 3, 118}, + {0x02, 0x02, 0x6A}, + {0x09, 0x02, 0x6A}, + {0x17, 0x02, 0x6A}, + {0x28, 0x03, 0x6A}, + {0x02, 0x02, 0x6B}, + {0x09, 0x02, 0x6B}, + {0x17, 0x02, 0x6B}, + {0x28, 0x03, 0x6B}, + {0x02, 0x02, 0x71}, + {0x09, 0x02, 0x71}, + {0x17, 0x02, 0x71}, + {0x28, 0x03, 0x71}, + {0x02, 0x02, 0x76}, + {0x09, 0x02, 0x76}, + {0x17, 0x02, 0x76}, + {0x28, 0x03, 0x76}, }, /* 62 */ { - {0x03, 2, 106}, - {0x06, 2, 106}, - {0x0a, 2, 106}, - {0x0f, 2, 106}, - {0x18, 2, 106}, - {0x1f, 2, 106}, - {0x29, 2, 106}, - {0x38, 3, 106}, - {0x03, 2, 107}, - {0x06, 2, 107}, - {0x0a, 2, 107}, - {0x0f, 2, 107}, - {0x18, 2, 107}, - {0x1f, 2, 107}, - {0x29, 2, 107}, - {0x38, 3, 107}, + {0x03, 0x02, 0x6A}, + {0x06, 0x02, 0x6A}, + {0x0A, 0x02, 0x6A}, + {0x0F, 0x02, 0x6A}, + {0x18, 0x02, 0x6A}, + {0x1F, 0x02, 0x6A}, + {0x29, 0x02, 0x6A}, + {0x38, 0x03, 0x6A}, + {0x03, 0x02, 0x6B}, + {0x06, 0x02, 0x6B}, + {0x0A, 0x02, 0x6B}, + {0x0F, 0x02, 0x6B}, + {0x18, 0x02, 0x6B}, + {0x1F, 0x02, 0x6B}, + {0x29, 0x02, 0x6B}, + {0x38, 0x03, 0x6B}, }, /* 63 */ { - {0x03, 2, 113}, - {0x06, 2, 113}, - {0x0a, 2, 113}, - {0x0f, 2, 113}, - {0x18, 2, 113}, - {0x1f, 2, 113}, - {0x29, 2, 113}, - {0x38, 3, 113}, - {0x03, 2, 118}, - {0x06, 2, 118}, - {0x0a, 2, 118}, - {0x0f, 2, 118}, - {0x18, 2, 118}, - {0x1f, 2, 118}, - {0x29, 2, 118}, - {0x38, 3, 118}, + {0x03, 0x02, 0x71}, + {0x06, 0x02, 0x71}, + {0x0A, 0x02, 0x71}, + {0x0F, 0x02, 0x71}, + {0x18, 0x02, 0x71}, + {0x1F, 0x02, 0x71}, + {0x29, 0x02, 0x71}, + {0x38, 0x03, 0x71}, + {0x03, 0x02, 0x76}, + {0x06, 0x02, 0x76}, + {0x0A, 0x02, 0x76}, + {0x0F, 0x02, 0x76}, + {0x18, 0x02, 0x76}, + {0x1F, 0x02, 0x76}, + {0x29, 0x02, 0x76}, + {0x38, 0x03, 0x76}, }, /* 64 */ { - {0x01, 2, 119}, - {0x16, 3, 119}, - {0x01, 2, 120}, - {0x16, 3, 120}, - {0x01, 2, 121}, - {0x16, 3, 121}, - {0x01, 2, 122}, - {0x16, 3, 122}, - {0x00, 3, 38}, - {0x00, 3, 42}, - {0x00, 3, 44}, - {0x00, 3, 59}, - {0x00, 3, 88}, - {0x00, 3, 90}, - {0x4b, 0, 0}, - {0x4e, 0, 0}, + {0x01, 0x02, 0x77}, + {0x16, 0x03, 0x77}, + {0x01, 0x02, 0x78}, + {0x16, 0x03, 0x78}, + {0x01, 0x02, 0x79}, + {0x16, 0x03, 0x79}, + {0x01, 0x02, 0x7A}, + {0x16, 0x03, 0x7A}, + {0x00, 0x03, 0x26}, + {0x00, 0x03, 0x2A}, + {0x00, 0x03, 0x2C}, + {0x00, 0x03, 0x3B}, + {0x00, 0x03, 0x58}, + {0x00, 0x03, 0x5A}, + {0x4B, 0x00, 0x00}, + {0x4E, 0x00, 0x00}, }, /* 65 */ { - {0x02, 2, 119}, - {0x09, 2, 119}, - {0x17, 2, 119}, - {0x28, 3, 119}, - {0x02, 2, 120}, - {0x09, 2, 120}, - {0x17, 2, 120}, - {0x28, 3, 120}, - {0x02, 2, 121}, - {0x09, 2, 121}, - {0x17, 2, 121}, - {0x28, 3, 121}, - {0x02, 2, 122}, - {0x09, 2, 122}, - {0x17, 2, 122}, - {0x28, 3, 122}, + {0x02, 0x02, 0x77}, + {0x09, 0x02, 0x77}, + {0x17, 0x02, 0x77}, + {0x28, 0x03, 0x77}, + {0x02, 0x02, 0x78}, + {0x09, 0x02, 0x78}, + {0x17, 0x02, 0x78}, + {0x28, 0x03, 0x78}, + {0x02, 0x02, 0x79}, + {0x09, 0x02, 0x79}, + {0x17, 0x02, 0x79}, + {0x28, 0x03, 0x79}, + {0x02, 0x02, 0x7A}, + {0x09, 0x02, 0x7A}, + {0x17, 0x02, 0x7A}, + {0x28, 0x03, 0x7A}, }, /* 66 */ { - {0x03, 2, 119}, - {0x06, 2, 119}, - {0x0a, 2, 119}, - {0x0f, 2, 119}, - {0x18, 2, 119}, - {0x1f, 2, 119}, - {0x29, 2, 119}, - {0x38, 3, 119}, - {0x03, 2, 120}, - {0x06, 2, 120}, - {0x0a, 2, 120}, - {0x0f, 2, 120}, - {0x18, 2, 120}, - {0x1f, 2, 120}, - {0x29, 2, 120}, - {0x38, 3, 120}, + {0x03, 0x02, 0x77}, + {0x06, 0x02, 0x77}, + {0x0A, 0x02, 0x77}, + {0x0F, 0x02, 0x77}, + {0x18, 0x02, 0x77}, + {0x1F, 0x02, 0x77}, + {0x29, 0x02, 0x77}, + {0x38, 0x03, 0x77}, + {0x03, 0x02, 0x78}, + {0x06, 0x02, 0x78}, + {0x0A, 0x02, 0x78}, + {0x0F, 0x02, 0x78}, + {0x18, 0x02, 0x78}, + {0x1F, 0x02, 0x78}, + {0x29, 0x02, 0x78}, + {0x38, 0x03, 0x78}, }, /* 67 */ { - {0x03, 2, 121}, - {0x06, 2, 121}, - {0x0a, 2, 121}, - {0x0f, 2, 121}, - {0x18, 2, 121}, - {0x1f, 2, 121}, - {0x29, 2, 121}, - {0x38, 3, 121}, - {0x03, 2, 122}, - {0x06, 2, 122}, - {0x0a, 2, 122}, - {0x0f, 2, 122}, - {0x18, 2, 122}, - {0x1f, 2, 122}, - {0x29, 2, 122}, - {0x38, 3, 122}, + {0x03, 0x02, 0x79}, + {0x06, 0x02, 0x79}, + {0x0A, 0x02, 0x79}, + {0x0F, 0x02, 0x79}, + {0x18, 0x02, 0x79}, + {0x1F, 0x02, 0x79}, + {0x29, 0x02, 0x79}, + {0x38, 0x03, 0x79}, + {0x03, 0x02, 0x7A}, + {0x06, 0x02, 0x7A}, + {0x0A, 0x02, 0x7A}, + {0x0F, 0x02, 0x7A}, + {0x18, 0x02, 0x7A}, + {0x1F, 0x02, 0x7A}, + {0x29, 0x02, 0x7A}, + {0x38, 0x03, 0x7A}, }, /* 68 */ { - {0x01, 2, 38}, - {0x16, 3, 38}, - {0x01, 2, 42}, - {0x16, 3, 42}, - {0x01, 2, 44}, - {0x16, 3, 44}, - {0x01, 2, 59}, - {0x16, 3, 59}, - {0x01, 2, 88}, - {0x16, 3, 88}, - {0x01, 2, 90}, - {0x16, 3, 90}, - {0x4c, 0, 0}, - {0x4d, 0, 0}, - {0x4f, 0, 0}, - {0x51, 0, 0}, + {0x01, 0x02, 0x26}, + {0x16, 0x03, 0x26}, + {0x01, 0x02, 0x2A}, + {0x16, 0x03, 0x2A}, + {0x01, 0x02, 0x2C}, + {0x16, 0x03, 0x2C}, + {0x01, 0x02, 0x3B}, + {0x16, 0x03, 0x3B}, + {0x01, 0x02, 0x58}, + {0x16, 0x03, 0x58}, + {0x01, 0x02, 0x5A}, + {0x16, 0x03, 0x5A}, + {0x4C, 0x00, 0x00}, + {0x4D, 0x00, 0x00}, + {0x4F, 0x00, 0x00}, + {0x51, 0x00, 0x00}, }, /* 69 */ { - {0x02, 2, 38}, - {0x09, 2, 38}, - {0x17, 2, 38}, - {0x28, 3, 38}, - {0x02, 2, 42}, - {0x09, 2, 42}, - {0x17, 2, 42}, - {0x28, 3, 42}, - {0x02, 2, 44}, - {0x09, 2, 44}, - {0x17, 2, 44}, - {0x28, 3, 44}, - {0x02, 2, 59}, - {0x09, 2, 59}, - {0x17, 2, 59}, - {0x28, 3, 59}, + {0x02, 0x02, 0x26}, + {0x09, 0x02, 0x26}, + {0x17, 0x02, 0x26}, + {0x28, 0x03, 0x26}, + {0x02, 0x02, 0x2A}, + {0x09, 0x02, 0x2A}, + {0x17, 0x02, 0x2A}, + {0x28, 0x03, 0x2A}, + {0x02, 0x02, 0x2C}, + {0x09, 0x02, 0x2C}, + {0x17, 0x02, 0x2C}, + {0x28, 0x03, 0x2C}, + {0x02, 0x02, 0x3B}, + {0x09, 0x02, 0x3B}, + {0x17, 0x02, 0x3B}, + {0x28, 0x03, 0x3B}, }, /* 70 */ { - {0x03, 2, 38}, - {0x06, 2, 38}, - {0x0a, 2, 38}, - {0x0f, 2, 38}, - {0x18, 2, 38}, - {0x1f, 2, 38}, - {0x29, 2, 38}, - {0x38, 3, 38}, - {0x03, 2, 42}, - {0x06, 2, 42}, - {0x0a, 2, 42}, - {0x0f, 2, 42}, - {0x18, 2, 42}, - {0x1f, 2, 42}, - {0x29, 2, 42}, - {0x38, 3, 42}, + {0x03, 0x02, 0x26}, + {0x06, 0x02, 0x26}, + {0x0A, 0x02, 0x26}, + {0x0F, 0x02, 0x26}, + {0x18, 0x02, 0x26}, + {0x1F, 0x02, 0x26}, + {0x29, 0x02, 0x26}, + {0x38, 0x03, 0x26}, + {0x03, 0x02, 0x2A}, + {0x06, 0x02, 0x2A}, + {0x0A, 0x02, 0x2A}, + {0x0F, 0x02, 0x2A}, + {0x18, 0x02, 0x2A}, + {0x1F, 0x02, 0x2A}, + {0x29, 0x02, 0x2A}, + {0x38, 0x03, 0x2A}, }, /* 71 */ { - {0x03, 2, 44}, - {0x06, 2, 44}, - {0x0a, 2, 44}, - {0x0f, 2, 44}, - {0x18, 2, 44}, - {0x1f, 2, 44}, - {0x29, 2, 44}, - {0x38, 3, 44}, - {0x03, 2, 59}, - {0x06, 2, 59}, - {0x0a, 2, 59}, - {0x0f, 2, 59}, - {0x18, 2, 59}, - {0x1f, 2, 59}, - {0x29, 2, 59}, - {0x38, 3, 59}, + {0x03, 0x02, 0x2C}, + {0x06, 0x02, 0x2C}, + {0x0A, 0x02, 0x2C}, + {0x0F, 0x02, 0x2C}, + {0x18, 0x02, 0x2C}, + {0x1F, 0x02, 0x2C}, + {0x29, 0x02, 0x2C}, + {0x38, 0x03, 0x2C}, + {0x03, 0x02, 0x3B}, + {0x06, 0x02, 0x3B}, + {0x0A, 0x02, 0x3B}, + {0x0F, 0x02, 0x3B}, + {0x18, 0x02, 0x3B}, + {0x1F, 0x02, 0x3B}, + {0x29, 0x02, 0x3B}, + {0x38, 0x03, 0x3B}, }, /* 72 */ { - {0x02, 2, 88}, - {0x09, 2, 88}, - {0x17, 2, 88}, - {0x28, 3, 88}, - {0x02, 2, 90}, - {0x09, 2, 90}, - {0x17, 2, 90}, - {0x28, 3, 90}, - {0x00, 3, 33}, - {0x00, 3, 34}, - {0x00, 3, 40}, - {0x00, 3, 41}, - {0x00, 3, 63}, - {0x50, 0, 0}, - {0x52, 0, 0}, - {0x54, 0, 0}, + {0x02, 0x02, 0x58}, + {0x09, 0x02, 0x58}, + {0x17, 0x02, 0x58}, + {0x28, 0x03, 0x58}, + {0x02, 0x02, 0x5A}, + {0x09, 0x02, 0x5A}, + {0x17, 0x02, 0x5A}, + {0x28, 0x03, 0x5A}, + {0x00, 0x03, 0x21}, + {0x00, 0x03, 0x22}, + {0x00, 0x03, 0x28}, + {0x00, 0x03, 0x29}, + {0x00, 0x03, 0x3F}, + {0x50, 0x00, 0x00}, + {0x52, 0x00, 0x00}, + {0x54, 0x00, 0x00}, }, /* 73 */ { - {0x03, 2, 88}, - {0x06, 2, 88}, - {0x0a, 2, 88}, - {0x0f, 2, 88}, - {0x18, 2, 88}, - {0x1f, 2, 88}, - {0x29, 2, 88}, - {0x38, 3, 88}, - {0x03, 2, 90}, - {0x06, 2, 90}, - {0x0a, 2, 90}, - {0x0f, 2, 90}, - {0x18, 2, 90}, - {0x1f, 2, 90}, - {0x29, 2, 90}, - {0x38, 3, 90}, + {0x03, 0x02, 0x58}, + {0x06, 0x02, 0x58}, + {0x0A, 0x02, 0x58}, + {0x0F, 0x02, 0x58}, + {0x18, 0x02, 0x58}, + {0x1F, 0x02, 0x58}, + {0x29, 0x02, 0x58}, + {0x38, 0x03, 0x58}, + {0x03, 0x02, 0x5A}, + {0x06, 0x02, 0x5A}, + {0x0A, 0x02, 0x5A}, + {0x0F, 0x02, 0x5A}, + {0x18, 0x02, 0x5A}, + {0x1F, 0x02, 0x5A}, + {0x29, 0x02, 0x5A}, + {0x38, 0x03, 0x5A}, }, /* 74 */ { - {0x01, 2, 33}, - {0x16, 3, 33}, - {0x01, 2, 34}, - {0x16, 3, 34}, - {0x01, 2, 40}, - {0x16, 3, 40}, - {0x01, 2, 41}, - {0x16, 3, 41}, - {0x01, 2, 63}, - {0x16, 3, 63}, - {0x00, 3, 39}, - {0x00, 3, 43}, - {0x00, 3, 124}, - {0x53, 0, 0}, - {0x55, 0, 0}, - {0x58, 0, 0}, + {0x01, 0x02, 0x21}, + {0x16, 0x03, 0x21}, + {0x01, 0x02, 0x22}, + {0x16, 0x03, 0x22}, + {0x01, 0x02, 0x28}, + {0x16, 0x03, 0x28}, + {0x01, 0x02, 0x29}, + {0x16, 0x03, 0x29}, + {0x01, 0x02, 0x3F}, + {0x16, 0x03, 0x3F}, + {0x00, 0x03, 0x27}, + {0x00, 0x03, 0x2B}, + {0x00, 0x03, 0x7C}, + {0x53, 0x00, 0x00}, + {0x55, 0x00, 0x00}, + {0x58, 0x00, 0x00}, }, /* 75 */ { - {0x02, 2, 33}, - {0x09, 2, 33}, - {0x17, 2, 33}, - {0x28, 3, 33}, - {0x02, 2, 34}, - {0x09, 2, 34}, - {0x17, 2, 34}, - {0x28, 3, 34}, - {0x02, 2, 40}, - {0x09, 2, 40}, - {0x17, 2, 40}, - {0x28, 3, 40}, - {0x02, 2, 41}, - {0x09, 2, 41}, - {0x17, 2, 41}, - {0x28, 3, 41}, + {0x02, 0x02, 0x21}, + {0x09, 0x02, 0x21}, + {0x17, 0x02, 0x21}, + {0x28, 0x03, 0x21}, + {0x02, 0x02, 0x22}, + {0x09, 0x02, 0x22}, + {0x17, 0x02, 0x22}, + {0x28, 0x03, 0x22}, + {0x02, 0x02, 0x28}, + {0x09, 0x02, 0x28}, + {0x17, 0x02, 0x28}, + {0x28, 0x03, 0x28}, + {0x02, 0x02, 0x29}, + {0x09, 0x02, 0x29}, + {0x17, 0x02, 0x29}, + {0x28, 0x03, 0x29}, }, /* 76 */ { - {0x03, 2, 33}, - {0x06, 2, 33}, - {0x0a, 2, 33}, - {0x0f, 2, 33}, - {0x18, 2, 33}, - {0x1f, 2, 33}, - {0x29, 2, 33}, - {0x38, 3, 33}, - {0x03, 2, 34}, - {0x06, 2, 34}, - {0x0a, 2, 34}, - {0x0f, 2, 34}, - {0x18, 2, 34}, - {0x1f, 2, 34}, - {0x29, 2, 34}, - {0x38, 3, 34}, + {0x03, 0x02, 0x21}, + {0x06, 0x02, 0x21}, + {0x0A, 0x02, 0x21}, + {0x0F, 0x02, 0x21}, + {0x18, 0x02, 0x21}, + {0x1F, 0x02, 0x21}, + {0x29, 0x02, 0x21}, + {0x38, 0x03, 0x21}, + {0x03, 0x02, 0x22}, + {0x06, 0x02, 0x22}, + {0x0A, 0x02, 0x22}, + {0x0F, 0x02, 0x22}, + {0x18, 0x02, 0x22}, + {0x1F, 0x02, 0x22}, + {0x29, 0x02, 0x22}, + {0x38, 0x03, 0x22}, }, /* 77 */ { - {0x03, 2, 40}, - {0x06, 2, 40}, - {0x0a, 2, 40}, - {0x0f, 2, 40}, - {0x18, 2, 40}, - {0x1f, 2, 40}, - {0x29, 2, 40}, - {0x38, 3, 40}, - {0x03, 2, 41}, - {0x06, 2, 41}, - {0x0a, 2, 41}, - {0x0f, 2, 41}, - {0x18, 2, 41}, - {0x1f, 2, 41}, - {0x29, 2, 41}, - {0x38, 3, 41}, + {0x03, 0x02, 0x28}, + {0x06, 0x02, 0x28}, + {0x0A, 0x02, 0x28}, + {0x0F, 0x02, 0x28}, + {0x18, 0x02, 0x28}, + {0x1F, 0x02, 0x28}, + {0x29, 0x02, 0x28}, + {0x38, 0x03, 0x28}, + {0x03, 0x02, 0x29}, + {0x06, 0x02, 0x29}, + {0x0A, 0x02, 0x29}, + {0x0F, 0x02, 0x29}, + {0x18, 0x02, 0x29}, + {0x1F, 0x02, 0x29}, + {0x29, 0x02, 0x29}, + {0x38, 0x03, 0x29}, }, /* 78 */ { - {0x02, 2, 63}, - {0x09, 2, 63}, - {0x17, 2, 63}, - {0x28, 3, 63}, - {0x01, 2, 39}, - {0x16, 3, 39}, - {0x01, 2, 43}, - {0x16, 3, 43}, - {0x01, 2, 124}, - {0x16, 3, 124}, - {0x00, 3, 35}, - {0x00, 3, 62}, - {0x56, 0, 0}, - {0x57, 0, 0}, - {0x59, 0, 0}, - {0x5a, 0, 0}, + {0x02, 0x02, 0x3F}, + {0x09, 0x02, 0x3F}, + {0x17, 0x02, 0x3F}, + {0x28, 0x03, 0x3F}, + {0x01, 0x02, 0x27}, + {0x16, 0x03, 0x27}, + {0x01, 0x02, 0x2B}, + {0x16, 0x03, 0x2B}, + {0x01, 0x02, 0x7C}, + {0x16, 0x03, 0x7C}, + {0x00, 0x03, 0x23}, + {0x00, 0x03, 0x3E}, + {0x56, 0x00, 0x00}, + {0x57, 0x00, 0x00}, + {0x59, 0x00, 0x00}, + {0x5A, 0x00, 0x00}, }, /* 79 */ { - {0x03, 2, 63}, - {0x06, 2, 63}, - {0x0a, 2, 63}, - {0x0f, 2, 63}, - {0x18, 2, 63}, - {0x1f, 2, 63}, - {0x29, 2, 63}, - {0x38, 3, 63}, - {0x02, 2, 39}, - {0x09, 2, 39}, - {0x17, 2, 39}, - {0x28, 3, 39}, - {0x02, 2, 43}, - {0x09, 2, 43}, - {0x17, 2, 43}, - {0x28, 3, 43}, + {0x03, 0x02, 0x3F}, + {0x06, 0x02, 0x3F}, + {0x0A, 0x02, 0x3F}, + {0x0F, 0x02, 0x3F}, + {0x18, 0x02, 0x3F}, + {0x1F, 0x02, 0x3F}, + {0x29, 0x02, 0x3F}, + {0x38, 0x03, 0x3F}, + {0x02, 0x02, 0x27}, + {0x09, 0x02, 0x27}, + {0x17, 0x02, 0x27}, + {0x28, 0x03, 0x27}, + {0x02, 0x02, 0x2B}, + {0x09, 0x02, 0x2B}, + {0x17, 0x02, 0x2B}, + {0x28, 0x03, 0x2B}, }, /* 80 */ { - {0x03, 2, 39}, - {0x06, 2, 39}, - {0x0a, 2, 39}, - {0x0f, 2, 39}, - {0x18, 2, 39}, - {0x1f, 2, 39}, - {0x29, 2, 39}, - {0x38, 3, 39}, - {0x03, 2, 43}, - {0x06, 2, 43}, - {0x0a, 2, 43}, - {0x0f, 2, 43}, - {0x18, 2, 43}, - {0x1f, 2, 43}, - {0x29, 2, 43}, - {0x38, 3, 43}, + {0x03, 0x02, 0x27}, + {0x06, 0x02, 0x27}, + {0x0A, 0x02, 0x27}, + {0x0F, 0x02, 0x27}, + {0x18, 0x02, 0x27}, + {0x1F, 0x02, 0x27}, + {0x29, 0x02, 0x27}, + {0x38, 0x03, 0x27}, + {0x03, 0x02, 0x2B}, + {0x06, 0x02, 0x2B}, + {0x0A, 0x02, 0x2B}, + {0x0F, 0x02, 0x2B}, + {0x18, 0x02, 0x2B}, + {0x1F, 0x02, 0x2B}, + {0x29, 0x02, 0x2B}, + {0x38, 0x03, 0x2B}, }, /* 81 */ { - {0x02, 2, 124}, - {0x09, 2, 124}, - {0x17, 2, 124}, - {0x28, 3, 124}, - {0x01, 2, 35}, - {0x16, 3, 35}, - {0x01, 2, 62}, - {0x16, 3, 62}, - {0x00, 3, 0}, - {0x00, 3, 36}, - {0x00, 3, 64}, - {0x00, 3, 91}, - {0x00, 3, 93}, - {0x00, 3, 126}, - {0x5b, 0, 0}, - {0x5c, 0, 0}, + {0x02, 0x02, 0x7C}, + {0x09, 0x02, 0x7C}, + {0x17, 0x02, 0x7C}, + {0x28, 0x03, 0x7C}, + {0x01, 0x02, 0x23}, + {0x16, 0x03, 0x23}, + {0x01, 0x02, 0x3E}, + {0x16, 0x03, 0x3E}, + {0x00, 0x03, 0x00}, + {0x00, 0x03, 0x24}, + {0x00, 0x03, 0x40}, + {0x00, 0x03, 0x5B}, + {0x00, 0x03, 0x5D}, + {0x00, 0x03, 0x7E}, + {0x5B, 0x00, 0x00}, + {0x5C, 0x00, 0x00}, }, /* 82 */ { - {0x03, 2, 124}, - {0x06, 2, 124}, - {0x0a, 2, 124}, - {0x0f, 2, 124}, - {0x18, 2, 124}, - {0x1f, 2, 124}, - {0x29, 2, 124}, - {0x38, 3, 124}, - {0x02, 2, 35}, - {0x09, 2, 35}, - {0x17, 2, 35}, - {0x28, 3, 35}, - {0x02, 2, 62}, - {0x09, 2, 62}, - {0x17, 2, 62}, - {0x28, 3, 62}, + {0x03, 0x02, 0x7C}, + {0x06, 0x02, 0x7C}, + {0x0A, 0x02, 0x7C}, + {0x0F, 0x02, 0x7C}, + {0x18, 0x02, 0x7C}, + {0x1F, 0x02, 0x7C}, + {0x29, 0x02, 0x7C}, + {0x38, 0x03, 0x7C}, + {0x02, 0x02, 0x23}, + {0x09, 0x02, 0x23}, + {0x17, 0x02, 0x23}, + {0x28, 0x03, 0x23}, + {0x02, 0x02, 0x3E}, + {0x09, 0x02, 0x3E}, + {0x17, 0x02, 0x3E}, + {0x28, 0x03, 0x3E}, }, /* 83 */ { - {0x03, 2, 35}, - {0x06, 2, 35}, - {0x0a, 2, 35}, - {0x0f, 2, 35}, - {0x18, 2, 35}, - {0x1f, 2, 35}, - {0x29, 2, 35}, - {0x38, 3, 35}, - {0x03, 2, 62}, - {0x06, 2, 62}, - {0x0a, 2, 62}, - {0x0f, 2, 62}, - {0x18, 2, 62}, - {0x1f, 2, 62}, - {0x29, 2, 62}, - {0x38, 3, 62}, + {0x03, 0x02, 0x23}, + {0x06, 0x02, 0x23}, + {0x0A, 0x02, 0x23}, + {0x0F, 0x02, 0x23}, + {0x18, 0x02, 0x23}, + {0x1F, 0x02, 0x23}, + {0x29, 0x02, 0x23}, + {0x38, 0x03, 0x23}, + {0x03, 0x02, 0x3E}, + {0x06, 0x02, 0x3E}, + {0x0A, 0x02, 0x3E}, + {0x0F, 0x02, 0x3E}, + {0x18, 0x02, 0x3E}, + {0x1F, 0x02, 0x3E}, + {0x29, 0x02, 0x3E}, + {0x38, 0x03, 0x3E}, }, /* 84 */ { - {0x01, 2, 0}, - {0x16, 3, 0}, - {0x01, 2, 36}, - {0x16, 3, 36}, - {0x01, 2, 64}, - {0x16, 3, 64}, - {0x01, 2, 91}, - {0x16, 3, 91}, - {0x01, 2, 93}, - {0x16, 3, 93}, - {0x01, 2, 126}, - {0x16, 3, 126}, - {0x00, 3, 94}, - {0x00, 3, 125}, - {0x5d, 0, 0}, - {0x5e, 0, 0}, + {0x01, 0x02, 0x00}, + {0x16, 0x03, 0x00}, + {0x01, 0x02, 0x24}, + {0x16, 0x03, 0x24}, + {0x01, 0x02, 0x40}, + {0x16, 0x03, 0x40}, + {0x01, 0x02, 0x5B}, + {0x16, 0x03, 0x5B}, + {0x01, 0x02, 0x5D}, + {0x16, 0x03, 0x5D}, + {0x01, 0x02, 0x7E}, + {0x16, 0x03, 0x7E}, + {0x00, 0x03, 0x5E}, + {0x00, 0x03, 0x7D}, + {0x5D, 0x00, 0x00}, + {0x5E, 0x00, 0x00}, }, /* 85 */ { - {0x02, 2, 0}, - {0x09, 2, 0}, - {0x17, 2, 0}, - {0x28, 3, 0}, - {0x02, 2, 36}, - {0x09, 2, 36}, - {0x17, 2, 36}, - {0x28, 3, 36}, - {0x02, 2, 64}, - {0x09, 2, 64}, - {0x17, 2, 64}, - {0x28, 3, 64}, - {0x02, 2, 91}, - {0x09, 2, 91}, - {0x17, 2, 91}, - {0x28, 3, 91}, + {0x02, 0x02, 0x00}, + {0x09, 0x02, 0x00}, + {0x17, 0x02, 0x00}, + {0x28, 0x03, 0x00}, + {0x02, 0x02, 0x24}, + {0x09, 0x02, 0x24}, + {0x17, 0x02, 0x24}, + {0x28, 0x03, 0x24}, + {0x02, 0x02, 0x40}, + {0x09, 0x02, 0x40}, + {0x17, 0x02, 0x40}, + {0x28, 0x03, 0x40}, + {0x02, 0x02, 0x5B}, + {0x09, 0x02, 0x5B}, + {0x17, 0x02, 0x5B}, + {0x28, 0x03, 0x5B}, }, /* 86 */ { - {0x03, 2, 0}, - {0x06, 2, 0}, - {0x0a, 2, 0}, - {0x0f, 2, 0}, - {0x18, 2, 0}, - {0x1f, 2, 0}, - {0x29, 2, 0}, - {0x38, 3, 0}, - {0x03, 2, 36}, - {0x06, 2, 36}, - {0x0a, 2, 36}, - {0x0f, 2, 36}, - {0x18, 2, 36}, - {0x1f, 2, 36}, - {0x29, 2, 36}, - {0x38, 3, 36}, + {0x03, 0x02, 0x00}, + {0x06, 0x02, 0x00}, + {0x0A, 0x02, 0x00}, + {0x0F, 0x02, 0x00}, + {0x18, 0x02, 0x00}, + {0x1F, 0x02, 0x00}, + {0x29, 0x02, 0x00}, + {0x38, 0x03, 0x00}, + {0x03, 0x02, 0x24}, + {0x06, 0x02, 0x24}, + {0x0A, 0x02, 0x24}, + {0x0F, 0x02, 0x24}, + {0x18, 0x02, 0x24}, + {0x1F, 0x02, 0x24}, + {0x29, 0x02, 0x24}, + {0x38, 0x03, 0x24}, }, /* 87 */ { - {0x03, 2, 64}, - {0x06, 2, 64}, - {0x0a, 2, 64}, - {0x0f, 2, 64}, - {0x18, 2, 64}, - {0x1f, 2, 64}, - {0x29, 2, 64}, - {0x38, 3, 64}, - {0x03, 2, 91}, - {0x06, 2, 91}, - {0x0a, 2, 91}, - {0x0f, 2, 91}, - {0x18, 2, 91}, - {0x1f, 2, 91}, - {0x29, 2, 91}, - {0x38, 3, 91}, + {0x03, 0x02, 0x40}, + {0x06, 0x02, 0x40}, + {0x0A, 0x02, 0x40}, + {0x0F, 0x02, 0x40}, + {0x18, 0x02, 0x40}, + {0x1F, 0x02, 0x40}, + {0x29, 0x02, 0x40}, + {0x38, 0x03, 0x40}, + {0x03, 0x02, 0x5B}, + {0x06, 0x02, 0x5B}, + {0x0A, 0x02, 0x5B}, + {0x0F, 0x02, 0x5B}, + {0x18, 0x02, 0x5B}, + {0x1F, 0x02, 0x5B}, + {0x29, 0x02, 0x5B}, + {0x38, 0x03, 0x5B}, }, /* 88 */ { - {0x02, 2, 93}, - {0x09, 2, 93}, - {0x17, 2, 93}, - {0x28, 3, 93}, - {0x02, 2, 126}, - {0x09, 2, 126}, - {0x17, 2, 126}, - {0x28, 3, 126}, - {0x01, 2, 94}, - {0x16, 3, 94}, - {0x01, 2, 125}, - {0x16, 3, 125}, - {0x00, 3, 60}, - {0x00, 3, 96}, - {0x00, 3, 123}, - {0x5f, 0, 0}, + {0x02, 0x02, 0x5D}, + {0x09, 0x02, 0x5D}, + {0x17, 0x02, 0x5D}, + {0x28, 0x03, 0x5D}, + {0x02, 0x02, 0x7E}, + {0x09, 0x02, 0x7E}, + {0x17, 0x02, 0x7E}, + {0x28, 0x03, 0x7E}, + {0x01, 0x02, 0x5E}, + {0x16, 0x03, 0x5E}, + {0x01, 0x02, 0x7D}, + {0x16, 0x03, 0x7D}, + {0x00, 0x03, 0x3C}, + {0x00, 0x03, 0x60}, + {0x00, 0x03, 0x7B}, + {0x5F, 0x00, 0x00}, }, /* 89 */ { - {0x03, 2, 93}, - {0x06, 2, 93}, - {0x0a, 2, 93}, - {0x0f, 2, 93}, - {0x18, 2, 93}, - {0x1f, 2, 93}, - {0x29, 2, 93}, - {0x38, 3, 93}, - {0x03, 2, 126}, - {0x06, 2, 126}, - {0x0a, 2, 126}, - {0x0f, 2, 126}, - {0x18, 2, 126}, - {0x1f, 2, 126}, - {0x29, 2, 126}, - {0x38, 3, 126}, + {0x03, 0x02, 0x5D}, + {0x06, 0x02, 0x5D}, + {0x0A, 0x02, 0x5D}, + {0x0F, 0x02, 0x5D}, + {0x18, 0x02, 0x5D}, + {0x1F, 0x02, 0x5D}, + {0x29, 0x02, 0x5D}, + {0x38, 0x03, 0x5D}, + {0x03, 0x02, 0x7E}, + {0x06, 0x02, 0x7E}, + {0x0A, 0x02, 0x7E}, + {0x0F, 0x02, 0x7E}, + {0x18, 0x02, 0x7E}, + {0x1F, 0x02, 0x7E}, + {0x29, 0x02, 0x7E}, + {0x38, 0x03, 0x7E}, }, /* 90 */ { - {0x02, 2, 94}, - {0x09, 2, 94}, - {0x17, 2, 94}, - {0x28, 3, 94}, - {0x02, 2, 125}, - {0x09, 2, 125}, - {0x17, 2, 125}, - {0x28, 3, 125}, - {0x01, 2, 60}, - {0x16, 3, 60}, - {0x01, 2, 96}, - {0x16, 3, 96}, - {0x01, 2, 123}, - {0x16, 3, 123}, - {0x60, 0, 0}, - {0x6e, 0, 0}, + {0x02, 0x02, 0x5E}, + {0x09, 0x02, 0x5E}, + {0x17, 0x02, 0x5E}, + {0x28, 0x03, 0x5E}, + {0x02, 0x02, 0x7D}, + {0x09, 0x02, 0x7D}, + {0x17, 0x02, 0x7D}, + {0x28, 0x03, 0x7D}, + {0x01, 0x02, 0x3C}, + {0x16, 0x03, 0x3C}, + {0x01, 0x02, 0x60}, + {0x16, 0x03, 0x60}, + {0x01, 0x02, 0x7B}, + {0x16, 0x03, 0x7B}, + {0x60, 0x00, 0x00}, + {0x6E, 0x00, 0x00}, }, /* 91 */ { - {0x03, 2, 94}, - {0x06, 2, 94}, - {0x0a, 2, 94}, - {0x0f, 2, 94}, - {0x18, 2, 94}, - {0x1f, 2, 94}, - {0x29, 2, 94}, - {0x38, 3, 94}, - {0x03, 2, 125}, - {0x06, 2, 125}, - {0x0a, 2, 125}, - {0x0f, 2, 125}, - {0x18, 2, 125}, - {0x1f, 2, 125}, - {0x29, 2, 125}, - {0x38, 3, 125}, + {0x03, 0x02, 0x5E}, + {0x06, 0x02, 0x5E}, + {0x0A, 0x02, 0x5E}, + {0x0F, 0x02, 0x5E}, + {0x18, 0x02, 0x5E}, + {0x1F, 0x02, 0x5E}, + {0x29, 0x02, 0x5E}, + {0x38, 0x03, 0x5E}, + {0x03, 0x02, 0x7D}, + {0x06, 0x02, 0x7D}, + {0x0A, 0x02, 0x7D}, + {0x0F, 0x02, 0x7D}, + {0x18, 0x02, 0x7D}, + {0x1F, 0x02, 0x7D}, + {0x29, 0x02, 0x7D}, + {0x38, 0x03, 0x7D}, }, /* 92 */ { - {0x02, 2, 60}, - {0x09, 2, 60}, - {0x17, 2, 60}, - {0x28, 3, 60}, - {0x02, 2, 96}, - {0x09, 2, 96}, - {0x17, 2, 96}, - {0x28, 3, 96}, - {0x02, 2, 123}, - {0x09, 2, 123}, - {0x17, 2, 123}, - {0x28, 3, 123}, - {0x61, 0, 0}, - {0x65, 0, 0}, - {0x6f, 0, 0}, - {0x85, 0, 0}, + {0x02, 0x02, 0x3C}, + {0x09, 0x02, 0x3C}, + {0x17, 0x02, 0x3C}, + {0x28, 0x03, 0x3C}, + {0x02, 0x02, 0x60}, + {0x09, 0x02, 0x60}, + {0x17, 0x02, 0x60}, + {0x28, 0x03, 0x60}, + {0x02, 0x02, 0x7B}, + {0x09, 0x02, 0x7B}, + {0x17, 0x02, 0x7B}, + {0x28, 0x03, 0x7B}, + {0x61, 0x00, 0x00}, + {0x65, 0x00, 0x00}, + {0x6F, 0x00, 0x00}, + {0x85, 0x00, 0x00}, }, /* 93 */ { - {0x03, 2, 60}, - {0x06, 2, 60}, - {0x0a, 2, 60}, - {0x0f, 2, 60}, - {0x18, 2, 60}, - {0x1f, 2, 60}, - {0x29, 2, 60}, - {0x38, 3, 60}, - {0x03, 2, 96}, - {0x06, 2, 96}, - {0x0a, 2, 96}, - {0x0f, 2, 96}, - {0x18, 2, 96}, - {0x1f, 2, 96}, - {0x29, 2, 96}, - {0x38, 3, 96}, + {0x03, 0x02, 0x3C}, + {0x06, 0x02, 0x3C}, + {0x0A, 0x02, 0x3C}, + {0x0F, 0x02, 0x3C}, + {0x18, 0x02, 0x3C}, + {0x1F, 0x02, 0x3C}, + {0x29, 0x02, 0x3C}, + {0x38, 0x03, 0x3C}, + {0x03, 0x02, 0x60}, + {0x06, 0x02, 0x60}, + {0x0A, 0x02, 0x60}, + {0x0F, 0x02, 0x60}, + {0x18, 0x02, 0x60}, + {0x1F, 0x02, 0x60}, + {0x29, 0x02, 0x60}, + {0x38, 0x03, 0x60}, }, /* 94 */ { - {0x03, 2, 123}, - {0x06, 2, 123}, - {0x0a, 2, 123}, - {0x0f, 2, 123}, - {0x18, 2, 123}, - {0x1f, 2, 123}, - {0x29, 2, 123}, - {0x38, 3, 123}, - {0x62, 0, 0}, - {0x63, 0, 0}, - {0x66, 0, 0}, - {0x69, 0, 0}, - {0x70, 0, 0}, - {0x77, 0, 0}, - {0x86, 0, 0}, - {0x99, 0, 0}, + {0x03, 0x02, 0x7B}, + {0x06, 0x02, 0x7B}, + {0x0A, 0x02, 0x7B}, + {0x0F, 0x02, 0x7B}, + {0x18, 0x02, 0x7B}, + {0x1F, 0x02, 0x7B}, + {0x29, 0x02, 0x7B}, + {0x38, 0x03, 0x7B}, + {0x62, 0x00, 0x00}, + {0x63, 0x00, 0x00}, + {0x66, 0x00, 0x00}, + {0x69, 0x00, 0x00}, + {0x70, 0x00, 0x00}, + {0x77, 0x00, 0x00}, + {0x86, 0x00, 0x00}, + {0x99, 0x00, 0x00}, }, /* 95 */ { - {0x00, 3, 92}, - {0x00, 3, 195}, - {0x00, 3, 208}, - {0x64, 0, 0}, - {0x67, 0, 0}, - {0x68, 0, 0}, - {0x6a, 0, 0}, - {0x6b, 0, 0}, - {0x71, 0, 0}, - {0x74, 0, 0}, - {0x78, 0, 0}, - {0x7e, 0, 0}, - {0x87, 0, 0}, - {0x8e, 0, 0}, - {0x9a, 0, 0}, - {0xa9, 0, 0}, + {0x00, 0x03, 0x5C}, + {0x00, 0x03, 0xC3}, + {0x00, 0x03, 0xD0}, + {0x64, 0x00, 0x00}, + {0x67, 0x00, 0x00}, + {0x68, 0x00, 0x00}, + {0x6A, 0x00, 0x00}, + {0x6B, 0x00, 0x00}, + {0x71, 0x00, 0x00}, + {0x74, 0x00, 0x00}, + {0x78, 0x00, 0x00}, + {0x7E, 0x00, 0x00}, + {0x87, 0x00, 0x00}, + {0x8E, 0x00, 0x00}, + {0x9A, 0x00, 0x00}, + {0xA9, 0x00, 0x00}, }, /* 96 */ { - {0x01, 2, 92}, - {0x16, 3, 92}, - {0x01, 2, 195}, - {0x16, 3, 195}, - {0x01, 2, 208}, - {0x16, 3, 208}, - {0x00, 3, 128}, - {0x00, 3, 130}, - {0x00, 3, 131}, - {0x00, 3, 162}, - {0x00, 3, 184}, - {0x00, 3, 194}, - {0x00, 3, 224}, - {0x00, 3, 226}, - {0x6c, 0, 0}, - {0x6d, 0, 0}, + {0x01, 0x02, 0x5C}, + {0x16, 0x03, 0x5C}, + {0x01, 0x02, 0xC3}, + {0x16, 0x03, 0xC3}, + {0x01, 0x02, 0xD0}, + {0x16, 0x03, 0xD0}, + {0x00, 0x03, 0x80}, + {0x00, 0x03, 0x82}, + {0x00, 0x03, 0x83}, + {0x00, 0x03, 0xA2}, + {0x00, 0x03, 0xB8}, + {0x00, 0x03, 0xC2}, + {0x00, 0x03, 0xE0}, + {0x00, 0x03, 0xE2}, + {0x6C, 0x00, 0x00}, + {0x6D, 0x00, 0x00}, }, /* 97 */ { - {0x02, 2, 92}, - {0x09, 2, 92}, - {0x17, 2, 92}, - {0x28, 3, 92}, - {0x02, 2, 195}, - {0x09, 2, 195}, - {0x17, 2, 195}, - {0x28, 3, 195}, - {0x02, 2, 208}, - {0x09, 2, 208}, - {0x17, 2, 208}, - {0x28, 3, 208}, - {0x01, 2, 128}, - {0x16, 3, 128}, - {0x01, 2, 130}, - {0x16, 3, 130}, + {0x02, 0x02, 0x5C}, + {0x09, 0x02, 0x5C}, + {0x17, 0x02, 0x5C}, + {0x28, 0x03, 0x5C}, + {0x02, 0x02, 0xC3}, + {0x09, 0x02, 0xC3}, + {0x17, 0x02, 0xC3}, + {0x28, 0x03, 0xC3}, + {0x02, 0x02, 0xD0}, + {0x09, 0x02, 0xD0}, + {0x17, 0x02, 0xD0}, + {0x28, 0x03, 0xD0}, + {0x01, 0x02, 0x80}, + {0x16, 0x03, 0x80}, + {0x01, 0x02, 0x82}, + {0x16, 0x03, 0x82}, }, /* 98 */ { - {0x03, 2, 92}, - {0x06, 2, 92}, - {0x0a, 2, 92}, - {0x0f, 2, 92}, - {0x18, 2, 92}, - {0x1f, 2, 92}, - {0x29, 2, 92}, - {0x38, 3, 92}, - {0x03, 2, 195}, - {0x06, 2, 195}, - {0x0a, 2, 195}, - {0x0f, 2, 195}, - {0x18, 2, 195}, - {0x1f, 2, 195}, - {0x29, 2, 195}, - {0x38, 3, 195}, + {0x03, 0x02, 0x5C}, + {0x06, 0x02, 0x5C}, + {0x0A, 0x02, 0x5C}, + {0x0F, 0x02, 0x5C}, + {0x18, 0x02, 0x5C}, + {0x1F, 0x02, 0x5C}, + {0x29, 0x02, 0x5C}, + {0x38, 0x03, 0x5C}, + {0x03, 0x02, 0xC3}, + {0x06, 0x02, 0xC3}, + {0x0A, 0x02, 0xC3}, + {0x0F, 0x02, 0xC3}, + {0x18, 0x02, 0xC3}, + {0x1F, 0x02, 0xC3}, + {0x29, 0x02, 0xC3}, + {0x38, 0x03, 0xC3}, }, /* 99 */ { - {0x03, 2, 208}, - {0x06, 2, 208}, - {0x0a, 2, 208}, - {0x0f, 2, 208}, - {0x18, 2, 208}, - {0x1f, 2, 208}, - {0x29, 2, 208}, - {0x38, 3, 208}, - {0x02, 2, 128}, - {0x09, 2, 128}, - {0x17, 2, 128}, - {0x28, 3, 128}, - {0x02, 2, 130}, - {0x09, 2, 130}, - {0x17, 2, 130}, - {0x28, 3, 130}, + {0x03, 0x02, 0xD0}, + {0x06, 0x02, 0xD0}, + {0x0A, 0x02, 0xD0}, + {0x0F, 0x02, 0xD0}, + {0x18, 0x02, 0xD0}, + {0x1F, 0x02, 0xD0}, + {0x29, 0x02, 0xD0}, + {0x38, 0x03, 0xD0}, + {0x02, 0x02, 0x80}, + {0x09, 0x02, 0x80}, + {0x17, 0x02, 0x80}, + {0x28, 0x03, 0x80}, + {0x02, 0x02, 0x82}, + {0x09, 0x02, 0x82}, + {0x17, 0x02, 0x82}, + {0x28, 0x03, 0x82}, }, /* 100 */ { - {0x03, 2, 128}, - {0x06, 2, 128}, - {0x0a, 2, 128}, - {0x0f, 2, 128}, - {0x18, 2, 128}, - {0x1f, 2, 128}, - {0x29, 2, 128}, - {0x38, 3, 128}, - {0x03, 2, 130}, - {0x06, 2, 130}, - {0x0a, 2, 130}, - {0x0f, 2, 130}, - {0x18, 2, 130}, - {0x1f, 2, 130}, - {0x29, 2, 130}, - {0x38, 3, 130}, + {0x03, 0x02, 0x80}, + {0x06, 0x02, 0x80}, + {0x0A, 0x02, 0x80}, + {0x0F, 0x02, 0x80}, + {0x18, 0x02, 0x80}, + {0x1F, 0x02, 0x80}, + {0x29, 0x02, 0x80}, + {0x38, 0x03, 0x80}, + {0x03, 0x02, 0x82}, + {0x06, 0x02, 0x82}, + {0x0A, 0x02, 0x82}, + {0x0F, 0x02, 0x82}, + {0x18, 0x02, 0x82}, + {0x1F, 0x02, 0x82}, + {0x29, 0x02, 0x82}, + {0x38, 0x03, 0x82}, }, /* 101 */ { - {0x01, 2, 131}, - {0x16, 3, 131}, - {0x01, 2, 162}, - {0x16, 3, 162}, - {0x01, 2, 184}, - {0x16, 3, 184}, - {0x01, 2, 194}, - {0x16, 3, 194}, - {0x01, 2, 224}, - {0x16, 3, 224}, - {0x01, 2, 226}, - {0x16, 3, 226}, - {0x00, 3, 153}, - {0x00, 3, 161}, - {0x00, 3, 167}, - {0x00, 3, 172}, + {0x01, 0x02, 0x83}, + {0x16, 0x03, 0x83}, + {0x01, 0x02, 0xA2}, + {0x16, 0x03, 0xA2}, + {0x01, 0x02, 0xB8}, + {0x16, 0x03, 0xB8}, + {0x01, 0x02, 0xC2}, + {0x16, 0x03, 0xC2}, + {0x01, 0x02, 0xE0}, + {0x16, 0x03, 0xE0}, + {0x01, 0x02, 0xE2}, + {0x16, 0x03, 0xE2}, + {0x00, 0x03, 0x99}, + {0x00, 0x03, 0xA1}, + {0x00, 0x03, 0xA7}, + {0x00, 0x03, 0xAC}, }, /* 102 */ { - {0x02, 2, 131}, - {0x09, 2, 131}, - {0x17, 2, 131}, - {0x28, 3, 131}, - {0x02, 2, 162}, - {0x09, 2, 162}, - {0x17, 2, 162}, - {0x28, 3, 162}, - {0x02, 2, 184}, - {0x09, 2, 184}, - {0x17, 2, 184}, - {0x28, 3, 184}, - {0x02, 2, 194}, - {0x09, 2, 194}, - {0x17, 2, 194}, - {0x28, 3, 194}, + {0x02, 0x02, 0x83}, + {0x09, 0x02, 0x83}, + {0x17, 0x02, 0x83}, + {0x28, 0x03, 0x83}, + {0x02, 0x02, 0xA2}, + {0x09, 0x02, 0xA2}, + {0x17, 0x02, 0xA2}, + {0x28, 0x03, 0xA2}, + {0x02, 0x02, 0xB8}, + {0x09, 0x02, 0xB8}, + {0x17, 0x02, 0xB8}, + {0x28, 0x03, 0xB8}, + {0x02, 0x02, 0xC2}, + {0x09, 0x02, 0xC2}, + {0x17, 0x02, 0xC2}, + {0x28, 0x03, 0xC2}, }, /* 103 */ { - {0x03, 2, 131}, - {0x06, 2, 131}, - {0x0a, 2, 131}, - {0x0f, 2, 131}, - {0x18, 2, 131}, - {0x1f, 2, 131}, - {0x29, 2, 131}, - {0x38, 3, 131}, - {0x03, 2, 162}, - {0x06, 2, 162}, - {0x0a, 2, 162}, - {0x0f, 2, 162}, - {0x18, 2, 162}, - {0x1f, 2, 162}, - {0x29, 2, 162}, - {0x38, 3, 162}, + {0x03, 0x02, 0x83}, + {0x06, 0x02, 0x83}, + {0x0A, 0x02, 0x83}, + {0x0F, 0x02, 0x83}, + {0x18, 0x02, 0x83}, + {0x1F, 0x02, 0x83}, + {0x29, 0x02, 0x83}, + {0x38, 0x03, 0x83}, + {0x03, 0x02, 0xA2}, + {0x06, 0x02, 0xA2}, + {0x0A, 0x02, 0xA2}, + {0x0F, 0x02, 0xA2}, + {0x18, 0x02, 0xA2}, + {0x1F, 0x02, 0xA2}, + {0x29, 0x02, 0xA2}, + {0x38, 0x03, 0xA2}, }, /* 104 */ { - {0x03, 2, 184}, - {0x06, 2, 184}, - {0x0a, 2, 184}, - {0x0f, 2, 184}, - {0x18, 2, 184}, - {0x1f, 2, 184}, - {0x29, 2, 184}, - {0x38, 3, 184}, - {0x03, 2, 194}, - {0x06, 2, 194}, - {0x0a, 2, 194}, - {0x0f, 2, 194}, - {0x18, 2, 194}, - {0x1f, 2, 194}, - {0x29, 2, 194}, - {0x38, 3, 194}, + {0x03, 0x02, 0xB8}, + {0x06, 0x02, 0xB8}, + {0x0A, 0x02, 0xB8}, + {0x0F, 0x02, 0xB8}, + {0x18, 0x02, 0xB8}, + {0x1F, 0x02, 0xB8}, + {0x29, 0x02, 0xB8}, + {0x38, 0x03, 0xB8}, + {0x03, 0x02, 0xC2}, + {0x06, 0x02, 0xC2}, + {0x0A, 0x02, 0xC2}, + {0x0F, 0x02, 0xC2}, + {0x18, 0x02, 0xC2}, + {0x1F, 0x02, 0xC2}, + {0x29, 0x02, 0xC2}, + {0x38, 0x03, 0xC2}, }, /* 105 */ { - {0x02, 2, 224}, - {0x09, 2, 224}, - {0x17, 2, 224}, - {0x28, 3, 224}, - {0x02, 2, 226}, - {0x09, 2, 226}, - {0x17, 2, 226}, - {0x28, 3, 226}, - {0x01, 2, 153}, - {0x16, 3, 153}, - {0x01, 2, 161}, - {0x16, 3, 161}, - {0x01, 2, 167}, - {0x16, 3, 167}, - {0x01, 2, 172}, - {0x16, 3, 172}, + {0x02, 0x02, 0xE0}, + {0x09, 0x02, 0xE0}, + {0x17, 0x02, 0xE0}, + {0x28, 0x03, 0xE0}, + {0x02, 0x02, 0xE2}, + {0x09, 0x02, 0xE2}, + {0x17, 0x02, 0xE2}, + {0x28, 0x03, 0xE2}, + {0x01, 0x02, 0x99}, + {0x16, 0x03, 0x99}, + {0x01, 0x02, 0xA1}, + {0x16, 0x03, 0xA1}, + {0x01, 0x02, 0xA7}, + {0x16, 0x03, 0xA7}, + {0x01, 0x02, 0xAC}, + {0x16, 0x03, 0xAC}, }, /* 106 */ { - {0x03, 2, 224}, - {0x06, 2, 224}, - {0x0a, 2, 224}, - {0x0f, 2, 224}, - {0x18, 2, 224}, - {0x1f, 2, 224}, - {0x29, 2, 224}, - {0x38, 3, 224}, - {0x03, 2, 226}, - {0x06, 2, 226}, - {0x0a, 2, 226}, - {0x0f, 2, 226}, - {0x18, 2, 226}, - {0x1f, 2, 226}, - {0x29, 2, 226}, - {0x38, 3, 226}, + {0x03, 0x02, 0xE0}, + {0x06, 0x02, 0xE0}, + {0x0A, 0x02, 0xE0}, + {0x0F, 0x02, 0xE0}, + {0x18, 0x02, 0xE0}, + {0x1F, 0x02, 0xE0}, + {0x29, 0x02, 0xE0}, + {0x38, 0x03, 0xE0}, + {0x03, 0x02, 0xE2}, + {0x06, 0x02, 0xE2}, + {0x0A, 0x02, 0xE2}, + {0x0F, 0x02, 0xE2}, + {0x18, 0x02, 0xE2}, + {0x1F, 0x02, 0xE2}, + {0x29, 0x02, 0xE2}, + {0x38, 0x03, 0xE2}, }, /* 107 */ { - {0x02, 2, 153}, - {0x09, 2, 153}, - {0x17, 2, 153}, - {0x28, 3, 153}, - {0x02, 2, 161}, - {0x09, 2, 161}, - {0x17, 2, 161}, - {0x28, 3, 161}, - {0x02, 2, 167}, - {0x09, 2, 167}, - {0x17, 2, 167}, - {0x28, 3, 167}, - {0x02, 2, 172}, - {0x09, 2, 172}, - {0x17, 2, 172}, - {0x28, 3, 172}, + {0x02, 0x02, 0x99}, + {0x09, 0x02, 0x99}, + {0x17, 0x02, 0x99}, + {0x28, 0x03, 0x99}, + {0x02, 0x02, 0xA1}, + {0x09, 0x02, 0xA1}, + {0x17, 0x02, 0xA1}, + {0x28, 0x03, 0xA1}, + {0x02, 0x02, 0xA7}, + {0x09, 0x02, 0xA7}, + {0x17, 0x02, 0xA7}, + {0x28, 0x03, 0xA7}, + {0x02, 0x02, 0xAC}, + {0x09, 0x02, 0xAC}, + {0x17, 0x02, 0xAC}, + {0x28, 0x03, 0xAC}, }, /* 108 */ { - {0x03, 2, 153}, - {0x06, 2, 153}, - {0x0a, 2, 153}, - {0x0f, 2, 153}, - {0x18, 2, 153}, - {0x1f, 2, 153}, - {0x29, 2, 153}, - {0x38, 3, 153}, - {0x03, 2, 161}, - {0x06, 2, 161}, - {0x0a, 2, 161}, - {0x0f, 2, 161}, - {0x18, 2, 161}, - {0x1f, 2, 161}, - {0x29, 2, 161}, - {0x38, 3, 161}, + {0x03, 0x02, 0x99}, + {0x06, 0x02, 0x99}, + {0x0A, 0x02, 0x99}, + {0x0F, 0x02, 0x99}, + {0x18, 0x02, 0x99}, + {0x1F, 0x02, 0x99}, + {0x29, 0x02, 0x99}, + {0x38, 0x03, 0x99}, + {0x03, 0x02, 0xA1}, + {0x06, 0x02, 0xA1}, + {0x0A, 0x02, 0xA1}, + {0x0F, 0x02, 0xA1}, + {0x18, 0x02, 0xA1}, + {0x1F, 0x02, 0xA1}, + {0x29, 0x02, 0xA1}, + {0x38, 0x03, 0xA1}, }, /* 109 */ { - {0x03, 2, 167}, - {0x06, 2, 167}, - {0x0a, 2, 167}, - {0x0f, 2, 167}, - {0x18, 2, 167}, - {0x1f, 2, 167}, - {0x29, 2, 167}, - {0x38, 3, 167}, - {0x03, 2, 172}, - {0x06, 2, 172}, - {0x0a, 2, 172}, - {0x0f, 2, 172}, - {0x18, 2, 172}, - {0x1f, 2, 172}, - {0x29, 2, 172}, - {0x38, 3, 172}, + {0x03, 0x02, 0xA7}, + {0x06, 0x02, 0xA7}, + {0x0A, 0x02, 0xA7}, + {0x0F, 0x02, 0xA7}, + {0x18, 0x02, 0xA7}, + {0x1F, 0x02, 0xA7}, + {0x29, 0x02, 0xA7}, + {0x38, 0x03, 0xA7}, + {0x03, 0x02, 0xAC}, + {0x06, 0x02, 0xAC}, + {0x0A, 0x02, 0xAC}, + {0x0F, 0x02, 0xAC}, + {0x18, 0x02, 0xAC}, + {0x1F, 0x02, 0xAC}, + {0x29, 0x02, 0xAC}, + {0x38, 0x03, 0xAC}, }, /* 110 */ { - {0x72, 0, 0}, - {0x73, 0, 0}, - {0x75, 0, 0}, - {0x76, 0, 0}, - {0x79, 0, 0}, - {0x7b, 0, 0}, - {0x7f, 0, 0}, - {0x82, 0, 0}, - {0x88, 0, 0}, - {0x8b, 0, 0}, - {0x8f, 0, 0}, - {0x92, 0, 0}, - {0x9b, 0, 0}, - {0xa2, 0, 0}, - {0xaa, 0, 0}, - {0xb4, 0, 0}, + {0x72, 0x00, 0x00}, + {0x73, 0x00, 0x00}, + {0x75, 0x00, 0x00}, + {0x76, 0x00, 0x00}, + {0x79, 0x00, 0x00}, + {0x7B, 0x00, 0x00}, + {0x7F, 0x00, 0x00}, + {0x82, 0x00, 0x00}, + {0x88, 0x00, 0x00}, + {0x8B, 0x00, 0x00}, + {0x8F, 0x00, 0x00}, + {0x92, 0x00, 0x00}, + {0x9B, 0x00, 0x00}, + {0xA2, 0x00, 0x00}, + {0xAA, 0x00, 0x00}, + {0xB4, 0x00, 0x00}, }, /* 111 */ { - {0x00, 3, 176}, - {0x00, 3, 177}, - {0x00, 3, 179}, - {0x00, 3, 209}, - {0x00, 3, 216}, - {0x00, 3, 217}, - {0x00, 3, 227}, - {0x00, 3, 229}, - {0x00, 3, 230}, - {0x7a, 0, 0}, - {0x7c, 0, 0}, - {0x7d, 0, 0}, - {0x80, 0, 0}, - {0x81, 0, 0}, - {0x83, 0, 0}, - {0x84, 0, 0}, + {0x00, 0x03, 0xB0}, + {0x00, 0x03, 0xB1}, + {0x00, 0x03, 0xB3}, + {0x00, 0x03, 0xD1}, + {0x00, 0x03, 0xD8}, + {0x00, 0x03, 0xD9}, + {0x00, 0x03, 0xE3}, + {0x00, 0x03, 0xE5}, + {0x00, 0x03, 0xE6}, + {0x7A, 0x00, 0x00}, + {0x7C, 0x00, 0x00}, + {0x7D, 0x00, 0x00}, + {0x80, 0x00, 0x00}, + {0x81, 0x00, 0x00}, + {0x83, 0x00, 0x00}, + {0x84, 0x00, 0x00}, }, /* 112 */ { - {0x01, 2, 176}, - {0x16, 3, 176}, - {0x01, 2, 177}, - {0x16, 3, 177}, - {0x01, 2, 179}, - {0x16, 3, 179}, - {0x01, 2, 209}, - {0x16, 3, 209}, - {0x01, 2, 216}, - {0x16, 3, 216}, - {0x01, 2, 217}, - {0x16, 3, 217}, - {0x01, 2, 227}, - {0x16, 3, 227}, - {0x01, 2, 229}, - {0x16, 3, 229}, + {0x01, 0x02, 0xB0}, + {0x16, 0x03, 0xB0}, + {0x01, 0x02, 0xB1}, + {0x16, 0x03, 0xB1}, + {0x01, 0x02, 0xB3}, + {0x16, 0x03, 0xB3}, + {0x01, 0x02, 0xD1}, + {0x16, 0x03, 0xD1}, + {0x01, 0x02, 0xD8}, + {0x16, 0x03, 0xD8}, + {0x01, 0x02, 0xD9}, + {0x16, 0x03, 0xD9}, + {0x01, 0x02, 0xE3}, + {0x16, 0x03, 0xE3}, + {0x01, 0x02, 0xE5}, + {0x16, 0x03, 0xE5}, }, /* 113 */ { - {0x02, 2, 176}, - {0x09, 2, 176}, - {0x17, 2, 176}, - {0x28, 3, 176}, - {0x02, 2, 177}, - {0x09, 2, 177}, - {0x17, 2, 177}, - {0x28, 3, 177}, - {0x02, 2, 179}, - {0x09, 2, 179}, - {0x17, 2, 179}, - {0x28, 3, 179}, - {0x02, 2, 209}, - {0x09, 2, 209}, - {0x17, 2, 209}, - {0x28, 3, 209}, + {0x02, 0x02, 0xB0}, + {0x09, 0x02, 0xB0}, + {0x17, 0x02, 0xB0}, + {0x28, 0x03, 0xB0}, + {0x02, 0x02, 0xB1}, + {0x09, 0x02, 0xB1}, + {0x17, 0x02, 0xB1}, + {0x28, 0x03, 0xB1}, + {0x02, 0x02, 0xB3}, + {0x09, 0x02, 0xB3}, + {0x17, 0x02, 0xB3}, + {0x28, 0x03, 0xB3}, + {0x02, 0x02, 0xD1}, + {0x09, 0x02, 0xD1}, + {0x17, 0x02, 0xD1}, + {0x28, 0x03, 0xD1}, }, /* 114 */ { - {0x03, 2, 176}, - {0x06, 2, 176}, - {0x0a, 2, 176}, - {0x0f, 2, 176}, - {0x18, 2, 176}, - {0x1f, 2, 176}, - {0x29, 2, 176}, - {0x38, 3, 176}, - {0x03, 2, 177}, - {0x06, 2, 177}, - {0x0a, 2, 177}, - {0x0f, 2, 177}, - {0x18, 2, 177}, - {0x1f, 2, 177}, - {0x29, 2, 177}, - {0x38, 3, 177}, + {0x03, 0x02, 0xB0}, + {0x06, 0x02, 0xB0}, + {0x0A, 0x02, 0xB0}, + {0x0F, 0x02, 0xB0}, + {0x18, 0x02, 0xB0}, + {0x1F, 0x02, 0xB0}, + {0x29, 0x02, 0xB0}, + {0x38, 0x03, 0xB0}, + {0x03, 0x02, 0xB1}, + {0x06, 0x02, 0xB1}, + {0x0A, 0x02, 0xB1}, + {0x0F, 0x02, 0xB1}, + {0x18, 0x02, 0xB1}, + {0x1F, 0x02, 0xB1}, + {0x29, 0x02, 0xB1}, + {0x38, 0x03, 0xB1}, }, /* 115 */ { - {0x03, 2, 179}, - {0x06, 2, 179}, - {0x0a, 2, 179}, - {0x0f, 2, 179}, - {0x18, 2, 179}, - {0x1f, 2, 179}, - {0x29, 2, 179}, - {0x38, 3, 179}, - {0x03, 2, 209}, - {0x06, 2, 209}, - {0x0a, 2, 209}, - {0x0f, 2, 209}, - {0x18, 2, 209}, - {0x1f, 2, 209}, - {0x29, 2, 209}, - {0x38, 3, 209}, + {0x03, 0x02, 0xB3}, + {0x06, 0x02, 0xB3}, + {0x0A, 0x02, 0xB3}, + {0x0F, 0x02, 0xB3}, + {0x18, 0x02, 0xB3}, + {0x1F, 0x02, 0xB3}, + {0x29, 0x02, 0xB3}, + {0x38, 0x03, 0xB3}, + {0x03, 0x02, 0xD1}, + {0x06, 0x02, 0xD1}, + {0x0A, 0x02, 0xD1}, + {0x0F, 0x02, 0xD1}, + {0x18, 0x02, 0xD1}, + {0x1F, 0x02, 0xD1}, + {0x29, 0x02, 0xD1}, + {0x38, 0x03, 0xD1}, }, /* 116 */ { - {0x02, 2, 216}, - {0x09, 2, 216}, - {0x17, 2, 216}, - {0x28, 3, 216}, - {0x02, 2, 217}, - {0x09, 2, 217}, - {0x17, 2, 217}, - {0x28, 3, 217}, - {0x02, 2, 227}, - {0x09, 2, 227}, - {0x17, 2, 227}, - {0x28, 3, 227}, - {0x02, 2, 229}, - {0x09, 2, 229}, - {0x17, 2, 229}, - {0x28, 3, 229}, + {0x02, 0x02, 0xD8}, + {0x09, 0x02, 0xD8}, + {0x17, 0x02, 0xD8}, + {0x28, 0x03, 0xD8}, + {0x02, 0x02, 0xD9}, + {0x09, 0x02, 0xD9}, + {0x17, 0x02, 0xD9}, + {0x28, 0x03, 0xD9}, + {0x02, 0x02, 0xE3}, + {0x09, 0x02, 0xE3}, + {0x17, 0x02, 0xE3}, + {0x28, 0x03, 0xE3}, + {0x02, 0x02, 0xE5}, + {0x09, 0x02, 0xE5}, + {0x17, 0x02, 0xE5}, + {0x28, 0x03, 0xE5}, }, /* 117 */ { - {0x03, 2, 216}, - {0x06, 2, 216}, - {0x0a, 2, 216}, - {0x0f, 2, 216}, - {0x18, 2, 216}, - {0x1f, 2, 216}, - {0x29, 2, 216}, - {0x38, 3, 216}, - {0x03, 2, 217}, - {0x06, 2, 217}, - {0x0a, 2, 217}, - {0x0f, 2, 217}, - {0x18, 2, 217}, - {0x1f, 2, 217}, - {0x29, 2, 217}, - {0x38, 3, 217}, + {0x03, 0x02, 0xD8}, + {0x06, 0x02, 0xD8}, + {0x0A, 0x02, 0xD8}, + {0x0F, 0x02, 0xD8}, + {0x18, 0x02, 0xD8}, + {0x1F, 0x02, 0xD8}, + {0x29, 0x02, 0xD8}, + {0x38, 0x03, 0xD8}, + {0x03, 0x02, 0xD9}, + {0x06, 0x02, 0xD9}, + {0x0A, 0x02, 0xD9}, + {0x0F, 0x02, 0xD9}, + {0x18, 0x02, 0xD9}, + {0x1F, 0x02, 0xD9}, + {0x29, 0x02, 0xD9}, + {0x38, 0x03, 0xD9}, }, /* 118 */ { - {0x03, 2, 227}, - {0x06, 2, 227}, - {0x0a, 2, 227}, - {0x0f, 2, 227}, - {0x18, 2, 227}, - {0x1f, 2, 227}, - {0x29, 2, 227}, - {0x38, 3, 227}, - {0x03, 2, 229}, - {0x06, 2, 229}, - {0x0a, 2, 229}, - {0x0f, 2, 229}, - {0x18, 2, 229}, - {0x1f, 2, 229}, - {0x29, 2, 229}, - {0x38, 3, 229}, + {0x03, 0x02, 0xE3}, + {0x06, 0x02, 0xE3}, + {0x0A, 0x02, 0xE3}, + {0x0F, 0x02, 0xE3}, + {0x18, 0x02, 0xE3}, + {0x1F, 0x02, 0xE3}, + {0x29, 0x02, 0xE3}, + {0x38, 0x03, 0xE3}, + {0x03, 0x02, 0xE5}, + {0x06, 0x02, 0xE5}, + {0x0A, 0x02, 0xE5}, + {0x0F, 0x02, 0xE5}, + {0x18, 0x02, 0xE5}, + {0x1F, 0x02, 0xE5}, + {0x29, 0x02, 0xE5}, + {0x38, 0x03, 0xE5}, }, /* 119 */ { - {0x01, 2, 230}, - {0x16, 3, 230}, - {0x00, 3, 129}, - {0x00, 3, 132}, - {0x00, 3, 133}, - {0x00, 3, 134}, - {0x00, 3, 136}, - {0x00, 3, 146}, - {0x00, 3, 154}, - {0x00, 3, 156}, - {0x00, 3, 160}, - {0x00, 3, 163}, - {0x00, 3, 164}, - {0x00, 3, 169}, - {0x00, 3, 170}, - {0x00, 3, 173}, + {0x01, 0x02, 0xE6}, + {0x16, 0x03, 0xE6}, + {0x00, 0x03, 0x81}, + {0x00, 0x03, 0x84}, + {0x00, 0x03, 0x85}, + {0x00, 0x03, 0x86}, + {0x00, 0x03, 0x88}, + {0x00, 0x03, 0x92}, + {0x00, 0x03, 0x9A}, + {0x00, 0x03, 0x9C}, + {0x00, 0x03, 0xA0}, + {0x00, 0x03, 0xA3}, + {0x00, 0x03, 0xA4}, + {0x00, 0x03, 0xA9}, + {0x00, 0x03, 0xAA}, + {0x00, 0x03, 0xAD}, }, /* 120 */ { - {0x02, 2, 230}, - {0x09, 2, 230}, - {0x17, 2, 230}, - {0x28, 3, 230}, - {0x01, 2, 129}, - {0x16, 3, 129}, - {0x01, 2, 132}, - {0x16, 3, 132}, - {0x01, 2, 133}, - {0x16, 3, 133}, - {0x01, 2, 134}, - {0x16, 3, 134}, - {0x01, 2, 136}, - {0x16, 3, 136}, - {0x01, 2, 146}, - {0x16, 3, 146}, + {0x02, 0x02, 0xE6}, + {0x09, 0x02, 0xE6}, + {0x17, 0x02, 0xE6}, + {0x28, 0x03, 0xE6}, + {0x01, 0x02, 0x81}, + {0x16, 0x03, 0x81}, + {0x01, 0x02, 0x84}, + {0x16, 0x03, 0x84}, + {0x01, 0x02, 0x85}, + {0x16, 0x03, 0x85}, + {0x01, 0x02, 0x86}, + {0x16, 0x03, 0x86}, + {0x01, 0x02, 0x88}, + {0x16, 0x03, 0x88}, + {0x01, 0x02, 0x92}, + {0x16, 0x03, 0x92}, }, /* 121 */ { - {0x03, 2, 230}, - {0x06, 2, 230}, - {0x0a, 2, 230}, - {0x0f, 2, 230}, - {0x18, 2, 230}, - {0x1f, 2, 230}, - {0x29, 2, 230}, - {0x38, 3, 230}, - {0x02, 2, 129}, - {0x09, 2, 129}, - {0x17, 2, 129}, - {0x28, 3, 129}, - {0x02, 2, 132}, - {0x09, 2, 132}, - {0x17, 2, 132}, - {0x28, 3, 132}, + {0x03, 0x02, 0xE6}, + {0x06, 0x02, 0xE6}, + {0x0A, 0x02, 0xE6}, + {0x0F, 0x02, 0xE6}, + {0x18, 0x02, 0xE6}, + {0x1F, 0x02, 0xE6}, + {0x29, 0x02, 0xE6}, + {0x38, 0x03, 0xE6}, + {0x02, 0x02, 0x81}, + {0x09, 0x02, 0x81}, + {0x17, 0x02, 0x81}, + {0x28, 0x03, 0x81}, + {0x02, 0x02, 0x84}, + {0x09, 0x02, 0x84}, + {0x17, 0x02, 0x84}, + {0x28, 0x03, 0x84}, }, /* 122 */ { - {0x03, 2, 129}, - {0x06, 2, 129}, - {0x0a, 2, 129}, - {0x0f, 2, 129}, - {0x18, 2, 129}, - {0x1f, 2, 129}, - {0x29, 2, 129}, - {0x38, 3, 129}, - {0x03, 2, 132}, - {0x06, 2, 132}, - {0x0a, 2, 132}, - {0x0f, 2, 132}, - {0x18, 2, 132}, - {0x1f, 2, 132}, - {0x29, 2, 132}, - {0x38, 3, 132}, + {0x03, 0x02, 0x81}, + {0x06, 0x02, 0x81}, + {0x0A, 0x02, 0x81}, + {0x0F, 0x02, 0x81}, + {0x18, 0x02, 0x81}, + {0x1F, 0x02, 0x81}, + {0x29, 0x02, 0x81}, + {0x38, 0x03, 0x81}, + {0x03, 0x02, 0x84}, + {0x06, 0x02, 0x84}, + {0x0A, 0x02, 0x84}, + {0x0F, 0x02, 0x84}, + {0x18, 0x02, 0x84}, + {0x1F, 0x02, 0x84}, + {0x29, 0x02, 0x84}, + {0x38, 0x03, 0x84}, }, /* 123 */ { - {0x02, 2, 133}, - {0x09, 2, 133}, - {0x17, 2, 133}, - {0x28, 3, 133}, - {0x02, 2, 134}, - {0x09, 2, 134}, - {0x17, 2, 134}, - {0x28, 3, 134}, - {0x02, 2, 136}, - {0x09, 2, 136}, - {0x17, 2, 136}, - {0x28, 3, 136}, - {0x02, 2, 146}, - {0x09, 2, 146}, - {0x17, 2, 146}, - {0x28, 3, 146}, + {0x02, 0x02, 0x85}, + {0x09, 0x02, 0x85}, + {0x17, 0x02, 0x85}, + {0x28, 0x03, 0x85}, + {0x02, 0x02, 0x86}, + {0x09, 0x02, 0x86}, + {0x17, 0x02, 0x86}, + {0x28, 0x03, 0x86}, + {0x02, 0x02, 0x88}, + {0x09, 0x02, 0x88}, + {0x17, 0x02, 0x88}, + {0x28, 0x03, 0x88}, + {0x02, 0x02, 0x92}, + {0x09, 0x02, 0x92}, + {0x17, 0x02, 0x92}, + {0x28, 0x03, 0x92}, }, /* 124 */ { - {0x03, 2, 133}, - {0x06, 2, 133}, - {0x0a, 2, 133}, - {0x0f, 2, 133}, - {0x18, 2, 133}, - {0x1f, 2, 133}, - {0x29, 2, 133}, - {0x38, 3, 133}, - {0x03, 2, 134}, - {0x06, 2, 134}, - {0x0a, 2, 134}, - {0x0f, 2, 134}, - {0x18, 2, 134}, - {0x1f, 2, 134}, - {0x29, 2, 134}, - {0x38, 3, 134}, + {0x03, 0x02, 0x85}, + {0x06, 0x02, 0x85}, + {0x0A, 0x02, 0x85}, + {0x0F, 0x02, 0x85}, + {0x18, 0x02, 0x85}, + {0x1F, 0x02, 0x85}, + {0x29, 0x02, 0x85}, + {0x38, 0x03, 0x85}, + {0x03, 0x02, 0x86}, + {0x06, 0x02, 0x86}, + {0x0A, 0x02, 0x86}, + {0x0F, 0x02, 0x86}, + {0x18, 0x02, 0x86}, + {0x1F, 0x02, 0x86}, + {0x29, 0x02, 0x86}, + {0x38, 0x03, 0x86}, }, /* 125 */ { - {0x03, 2, 136}, - {0x06, 2, 136}, - {0x0a, 2, 136}, - {0x0f, 2, 136}, - {0x18, 2, 136}, - {0x1f, 2, 136}, - {0x29, 2, 136}, - {0x38, 3, 136}, - {0x03, 2, 146}, - {0x06, 2, 146}, - {0x0a, 2, 146}, - {0x0f, 2, 146}, - {0x18, 2, 146}, - {0x1f, 2, 146}, - {0x29, 2, 146}, - {0x38, 3, 146}, + {0x03, 0x02, 0x88}, + {0x06, 0x02, 0x88}, + {0x0A, 0x02, 0x88}, + {0x0F, 0x02, 0x88}, + {0x18, 0x02, 0x88}, + {0x1F, 0x02, 0x88}, + {0x29, 0x02, 0x88}, + {0x38, 0x03, 0x88}, + {0x03, 0x02, 0x92}, + {0x06, 0x02, 0x92}, + {0x0A, 0x02, 0x92}, + {0x0F, 0x02, 0x92}, + {0x18, 0x02, 0x92}, + {0x1F, 0x02, 0x92}, + {0x29, 0x02, 0x92}, + {0x38, 0x03, 0x92}, }, /* 126 */ { - {0x01, 2, 154}, - {0x16, 3, 154}, - {0x01, 2, 156}, - {0x16, 3, 156}, - {0x01, 2, 160}, - {0x16, 3, 160}, - {0x01, 2, 163}, - {0x16, 3, 163}, - {0x01, 2, 164}, - {0x16, 3, 164}, - {0x01, 2, 169}, - {0x16, 3, 169}, - {0x01, 2, 170}, - {0x16, 3, 170}, - {0x01, 2, 173}, - {0x16, 3, 173}, + {0x01, 0x02, 0x9A}, + {0x16, 0x03, 0x9A}, + {0x01, 0x02, 0x9C}, + {0x16, 0x03, 0x9C}, + {0x01, 0x02, 0xA0}, + {0x16, 0x03, 0xA0}, + {0x01, 0x02, 0xA3}, + {0x16, 0x03, 0xA3}, + {0x01, 0x02, 0xA4}, + {0x16, 0x03, 0xA4}, + {0x01, 0x02, 0xA9}, + {0x16, 0x03, 0xA9}, + {0x01, 0x02, 0xAA}, + {0x16, 0x03, 0xAA}, + {0x01, 0x02, 0xAD}, + {0x16, 0x03, 0xAD}, }, /* 127 */ { - {0x02, 2, 154}, - {0x09, 2, 154}, - {0x17, 2, 154}, - {0x28, 3, 154}, - {0x02, 2, 156}, - {0x09, 2, 156}, - {0x17, 2, 156}, - {0x28, 3, 156}, - {0x02, 2, 160}, - {0x09, 2, 160}, - {0x17, 2, 160}, - {0x28, 3, 160}, - {0x02, 2, 163}, - {0x09, 2, 163}, - {0x17, 2, 163}, - {0x28, 3, 163}, + {0x02, 0x02, 0x9A}, + {0x09, 0x02, 0x9A}, + {0x17, 0x02, 0x9A}, + {0x28, 0x03, 0x9A}, + {0x02, 0x02, 0x9C}, + {0x09, 0x02, 0x9C}, + {0x17, 0x02, 0x9C}, + {0x28, 0x03, 0x9C}, + {0x02, 0x02, 0xA0}, + {0x09, 0x02, 0xA0}, + {0x17, 0x02, 0xA0}, + {0x28, 0x03, 0xA0}, + {0x02, 0x02, 0xA3}, + {0x09, 0x02, 0xA3}, + {0x17, 0x02, 0xA3}, + {0x28, 0x03, 0xA3}, }, /* 128 */ { - {0x03, 2, 154}, - {0x06, 2, 154}, - {0x0a, 2, 154}, - {0x0f, 2, 154}, - {0x18, 2, 154}, - {0x1f, 2, 154}, - {0x29, 2, 154}, - {0x38, 3, 154}, - {0x03, 2, 156}, - {0x06, 2, 156}, - {0x0a, 2, 156}, - {0x0f, 2, 156}, - {0x18, 2, 156}, - {0x1f, 2, 156}, - {0x29, 2, 156}, - {0x38, 3, 156}, + {0x03, 0x02, 0x9A}, + {0x06, 0x02, 0x9A}, + {0x0A, 0x02, 0x9A}, + {0x0F, 0x02, 0x9A}, + {0x18, 0x02, 0x9A}, + {0x1F, 0x02, 0x9A}, + {0x29, 0x02, 0x9A}, + {0x38, 0x03, 0x9A}, + {0x03, 0x02, 0x9C}, + {0x06, 0x02, 0x9C}, + {0x0A, 0x02, 0x9C}, + {0x0F, 0x02, 0x9C}, + {0x18, 0x02, 0x9C}, + {0x1F, 0x02, 0x9C}, + {0x29, 0x02, 0x9C}, + {0x38, 0x03, 0x9C}, }, /* 129 */ { - {0x03, 2, 160}, - {0x06, 2, 160}, - {0x0a, 2, 160}, - {0x0f, 2, 160}, - {0x18, 2, 160}, - {0x1f, 2, 160}, - {0x29, 2, 160}, - {0x38, 3, 160}, - {0x03, 2, 163}, - {0x06, 2, 163}, - {0x0a, 2, 163}, - {0x0f, 2, 163}, - {0x18, 2, 163}, - {0x1f, 2, 163}, - {0x29, 2, 163}, - {0x38, 3, 163}, + {0x03, 0x02, 0xA0}, + {0x06, 0x02, 0xA0}, + {0x0A, 0x02, 0xA0}, + {0x0F, 0x02, 0xA0}, + {0x18, 0x02, 0xA0}, + {0x1F, 0x02, 0xA0}, + {0x29, 0x02, 0xA0}, + {0x38, 0x03, 0xA0}, + {0x03, 0x02, 0xA3}, + {0x06, 0x02, 0xA3}, + {0x0A, 0x02, 0xA3}, + {0x0F, 0x02, 0xA3}, + {0x18, 0x02, 0xA3}, + {0x1F, 0x02, 0xA3}, + {0x29, 0x02, 0xA3}, + {0x38, 0x03, 0xA3}, }, /* 130 */ { - {0x02, 2, 164}, - {0x09, 2, 164}, - {0x17, 2, 164}, - {0x28, 3, 164}, - {0x02, 2, 169}, - {0x09, 2, 169}, - {0x17, 2, 169}, - {0x28, 3, 169}, - {0x02, 2, 170}, - {0x09, 2, 170}, - {0x17, 2, 170}, - {0x28, 3, 170}, - {0x02, 2, 173}, - {0x09, 2, 173}, - {0x17, 2, 173}, - {0x28, 3, 173}, + {0x02, 0x02, 0xA4}, + {0x09, 0x02, 0xA4}, + {0x17, 0x02, 0xA4}, + {0x28, 0x03, 0xA4}, + {0x02, 0x02, 0xA9}, + {0x09, 0x02, 0xA9}, + {0x17, 0x02, 0xA9}, + {0x28, 0x03, 0xA9}, + {0x02, 0x02, 0xAA}, + {0x09, 0x02, 0xAA}, + {0x17, 0x02, 0xAA}, + {0x28, 0x03, 0xAA}, + {0x02, 0x02, 0xAD}, + {0x09, 0x02, 0xAD}, + {0x17, 0x02, 0xAD}, + {0x28, 0x03, 0xAD}, }, /* 131 */ { - {0x03, 2, 164}, - {0x06, 2, 164}, - {0x0a, 2, 164}, - {0x0f, 2, 164}, - {0x18, 2, 164}, - {0x1f, 2, 164}, - {0x29, 2, 164}, - {0x38, 3, 164}, - {0x03, 2, 169}, - {0x06, 2, 169}, - {0x0a, 2, 169}, - {0x0f, 2, 169}, - {0x18, 2, 169}, - {0x1f, 2, 169}, - {0x29, 2, 169}, - {0x38, 3, 169}, + {0x03, 0x02, 0xA4}, + {0x06, 0x02, 0xA4}, + {0x0A, 0x02, 0xA4}, + {0x0F, 0x02, 0xA4}, + {0x18, 0x02, 0xA4}, + {0x1F, 0x02, 0xA4}, + {0x29, 0x02, 0xA4}, + {0x38, 0x03, 0xA4}, + {0x03, 0x02, 0xA9}, + {0x06, 0x02, 0xA9}, + {0x0A, 0x02, 0xA9}, + {0x0F, 0x02, 0xA9}, + {0x18, 0x02, 0xA9}, + {0x1F, 0x02, 0xA9}, + {0x29, 0x02, 0xA9}, + {0x38, 0x03, 0xA9}, }, /* 132 */ { - {0x03, 2, 170}, - {0x06, 2, 170}, - {0x0a, 2, 170}, - {0x0f, 2, 170}, - {0x18, 2, 170}, - {0x1f, 2, 170}, - {0x29, 2, 170}, - {0x38, 3, 170}, - {0x03, 2, 173}, - {0x06, 2, 173}, - {0x0a, 2, 173}, - {0x0f, 2, 173}, - {0x18, 2, 173}, - {0x1f, 2, 173}, - {0x29, 2, 173}, - {0x38, 3, 173}, + {0x03, 0x02, 0xAA}, + {0x06, 0x02, 0xAA}, + {0x0A, 0x02, 0xAA}, + {0x0F, 0x02, 0xAA}, + {0x18, 0x02, 0xAA}, + {0x1F, 0x02, 0xAA}, + {0x29, 0x02, 0xAA}, + {0x38, 0x03, 0xAA}, + {0x03, 0x02, 0xAD}, + {0x06, 0x02, 0xAD}, + {0x0A, 0x02, 0xAD}, + {0x0F, 0x02, 0xAD}, + {0x18, 0x02, 0xAD}, + {0x1F, 0x02, 0xAD}, + {0x29, 0x02, 0xAD}, + {0x38, 0x03, 0xAD}, }, /* 133 */ { - {0x89, 0, 0}, - {0x8a, 0, 0}, - {0x8c, 0, 0}, - {0x8d, 0, 0}, - {0x90, 0, 0}, - {0x91, 0, 0}, - {0x93, 0, 0}, - {0x96, 0, 0}, - {0x9c, 0, 0}, - {0x9f, 0, 0}, - {0xa3, 0, 0}, - {0xa6, 0, 0}, - {0xab, 0, 0}, - {0xae, 0, 0}, - {0xb5, 0, 0}, - {0xbe, 0, 0}, + {0x89, 0x00, 0x00}, + {0x8A, 0x00, 0x00}, + {0x8C, 0x00, 0x00}, + {0x8D, 0x00, 0x00}, + {0x90, 0x00, 0x00}, + {0x91, 0x00, 0x00}, + {0x93, 0x00, 0x00}, + {0x96, 0x00, 0x00}, + {0x9C, 0x00, 0x00}, + {0x9F, 0x00, 0x00}, + {0xA3, 0x00, 0x00}, + {0xA6, 0x00, 0x00}, + {0xAB, 0x00, 0x00}, + {0xAE, 0x00, 0x00}, + {0xB5, 0x00, 0x00}, + {0xBE, 0x00, 0x00}, }, /* 134 */ { - {0x00, 3, 178}, - {0x00, 3, 181}, - {0x00, 3, 185}, - {0x00, 3, 186}, - {0x00, 3, 187}, - {0x00, 3, 189}, - {0x00, 3, 190}, - {0x00, 3, 196}, - {0x00, 3, 198}, - {0x00, 3, 228}, - {0x00, 3, 232}, - {0x00, 3, 233}, - {0x94, 0, 0}, - {0x95, 0, 0}, - {0x97, 0, 0}, - {0x98, 0, 0}, + {0x00, 0x03, 0xB2}, + {0x00, 0x03, 0xB5}, + {0x00, 0x03, 0xB9}, + {0x00, 0x03, 0xBA}, + {0x00, 0x03, 0xBB}, + {0x00, 0x03, 0xBD}, + {0x00, 0x03, 0xBE}, + {0x00, 0x03, 0xC4}, + {0x00, 0x03, 0xC6}, + {0x00, 0x03, 0xE4}, + {0x00, 0x03, 0xE8}, + {0x00, 0x03, 0xE9}, + {0x94, 0x00, 0x00}, + {0x95, 0x00, 0x00}, + {0x97, 0x00, 0x00}, + {0x98, 0x00, 0x00}, }, /* 135 */ { - {0x01, 2, 178}, - {0x16, 3, 178}, - {0x01, 2, 181}, - {0x16, 3, 181}, - {0x01, 2, 185}, - {0x16, 3, 185}, - {0x01, 2, 186}, - {0x16, 3, 186}, - {0x01, 2, 187}, - {0x16, 3, 187}, - {0x01, 2, 189}, - {0x16, 3, 189}, - {0x01, 2, 190}, - {0x16, 3, 190}, - {0x01, 2, 196}, - {0x16, 3, 196}, + {0x01, 0x02, 0xB2}, + {0x16, 0x03, 0xB2}, + {0x01, 0x02, 0xB5}, + {0x16, 0x03, 0xB5}, + {0x01, 0x02, 0xB9}, + {0x16, 0x03, 0xB9}, + {0x01, 0x02, 0xBA}, + {0x16, 0x03, 0xBA}, + {0x01, 0x02, 0xBB}, + {0x16, 0x03, 0xBB}, + {0x01, 0x02, 0xBD}, + {0x16, 0x03, 0xBD}, + {0x01, 0x02, 0xBE}, + {0x16, 0x03, 0xBE}, + {0x01, 0x02, 0xC4}, + {0x16, 0x03, 0xC4}, }, /* 136 */ { - {0x02, 2, 178}, - {0x09, 2, 178}, - {0x17, 2, 178}, - {0x28, 3, 178}, - {0x02, 2, 181}, - {0x09, 2, 181}, - {0x17, 2, 181}, - {0x28, 3, 181}, - {0x02, 2, 185}, - {0x09, 2, 185}, - {0x17, 2, 185}, - {0x28, 3, 185}, - {0x02, 2, 186}, - {0x09, 2, 186}, - {0x17, 2, 186}, - {0x28, 3, 186}, + {0x02, 0x02, 0xB2}, + {0x09, 0x02, 0xB2}, + {0x17, 0x02, 0xB2}, + {0x28, 0x03, 0xB2}, + {0x02, 0x02, 0xB5}, + {0x09, 0x02, 0xB5}, + {0x17, 0x02, 0xB5}, + {0x28, 0x03, 0xB5}, + {0x02, 0x02, 0xB9}, + {0x09, 0x02, 0xB9}, + {0x17, 0x02, 0xB9}, + {0x28, 0x03, 0xB9}, + {0x02, 0x02, 0xBA}, + {0x09, 0x02, 0xBA}, + {0x17, 0x02, 0xBA}, + {0x28, 0x03, 0xBA}, }, /* 137 */ { - {0x03, 2, 178}, - {0x06, 2, 178}, - {0x0a, 2, 178}, - {0x0f, 2, 178}, - {0x18, 2, 178}, - {0x1f, 2, 178}, - {0x29, 2, 178}, - {0x38, 3, 178}, - {0x03, 2, 181}, - {0x06, 2, 181}, - {0x0a, 2, 181}, - {0x0f, 2, 181}, - {0x18, 2, 181}, - {0x1f, 2, 181}, - {0x29, 2, 181}, - {0x38, 3, 181}, + {0x03, 0x02, 0xB2}, + {0x06, 0x02, 0xB2}, + {0x0A, 0x02, 0xB2}, + {0x0F, 0x02, 0xB2}, + {0x18, 0x02, 0xB2}, + {0x1F, 0x02, 0xB2}, + {0x29, 0x02, 0xB2}, + {0x38, 0x03, 0xB2}, + {0x03, 0x02, 0xB5}, + {0x06, 0x02, 0xB5}, + {0x0A, 0x02, 0xB5}, + {0x0F, 0x02, 0xB5}, + {0x18, 0x02, 0xB5}, + {0x1F, 0x02, 0xB5}, + {0x29, 0x02, 0xB5}, + {0x38, 0x03, 0xB5}, }, /* 138 */ { - {0x03, 2, 185}, - {0x06, 2, 185}, - {0x0a, 2, 185}, - {0x0f, 2, 185}, - {0x18, 2, 185}, - {0x1f, 2, 185}, - {0x29, 2, 185}, - {0x38, 3, 185}, - {0x03, 2, 186}, - {0x06, 2, 186}, - {0x0a, 2, 186}, - {0x0f, 2, 186}, - {0x18, 2, 186}, - {0x1f, 2, 186}, - {0x29, 2, 186}, - {0x38, 3, 186}, + {0x03, 0x02, 0xB9}, + {0x06, 0x02, 0xB9}, + {0x0A, 0x02, 0xB9}, + {0x0F, 0x02, 0xB9}, + {0x18, 0x02, 0xB9}, + {0x1F, 0x02, 0xB9}, + {0x29, 0x02, 0xB9}, + {0x38, 0x03, 0xB9}, + {0x03, 0x02, 0xBA}, + {0x06, 0x02, 0xBA}, + {0x0A, 0x02, 0xBA}, + {0x0F, 0x02, 0xBA}, + {0x18, 0x02, 0xBA}, + {0x1F, 0x02, 0xBA}, + {0x29, 0x02, 0xBA}, + {0x38, 0x03, 0xBA}, }, /* 139 */ { - {0x02, 2, 187}, - {0x09, 2, 187}, - {0x17, 2, 187}, - {0x28, 3, 187}, - {0x02, 2, 189}, - {0x09, 2, 189}, - {0x17, 2, 189}, - {0x28, 3, 189}, - {0x02, 2, 190}, - {0x09, 2, 190}, - {0x17, 2, 190}, - {0x28, 3, 190}, - {0x02, 2, 196}, - {0x09, 2, 196}, - {0x17, 2, 196}, - {0x28, 3, 196}, + {0x02, 0x02, 0xBB}, + {0x09, 0x02, 0xBB}, + {0x17, 0x02, 0xBB}, + {0x28, 0x03, 0xBB}, + {0x02, 0x02, 0xBD}, + {0x09, 0x02, 0xBD}, + {0x17, 0x02, 0xBD}, + {0x28, 0x03, 0xBD}, + {0x02, 0x02, 0xBE}, + {0x09, 0x02, 0xBE}, + {0x17, 0x02, 0xBE}, + {0x28, 0x03, 0xBE}, + {0x02, 0x02, 0xC4}, + {0x09, 0x02, 0xC4}, + {0x17, 0x02, 0xC4}, + {0x28, 0x03, 0xC4}, }, /* 140 */ { - {0x03, 2, 187}, - {0x06, 2, 187}, - {0x0a, 2, 187}, - {0x0f, 2, 187}, - {0x18, 2, 187}, - {0x1f, 2, 187}, - {0x29, 2, 187}, - {0x38, 3, 187}, - {0x03, 2, 189}, - {0x06, 2, 189}, - {0x0a, 2, 189}, - {0x0f, 2, 189}, - {0x18, 2, 189}, - {0x1f, 2, 189}, - {0x29, 2, 189}, - {0x38, 3, 189}, + {0x03, 0x02, 0xBB}, + {0x06, 0x02, 0xBB}, + {0x0A, 0x02, 0xBB}, + {0x0F, 0x02, 0xBB}, + {0x18, 0x02, 0xBB}, + {0x1F, 0x02, 0xBB}, + {0x29, 0x02, 0xBB}, + {0x38, 0x03, 0xBB}, + {0x03, 0x02, 0xBD}, + {0x06, 0x02, 0xBD}, + {0x0A, 0x02, 0xBD}, + {0x0F, 0x02, 0xBD}, + {0x18, 0x02, 0xBD}, + {0x1F, 0x02, 0xBD}, + {0x29, 0x02, 0xBD}, + {0x38, 0x03, 0xBD}, }, /* 141 */ { - {0x03, 2, 190}, - {0x06, 2, 190}, - {0x0a, 2, 190}, - {0x0f, 2, 190}, - {0x18, 2, 190}, - {0x1f, 2, 190}, - {0x29, 2, 190}, - {0x38, 3, 190}, - {0x03, 2, 196}, - {0x06, 2, 196}, - {0x0a, 2, 196}, - {0x0f, 2, 196}, - {0x18, 2, 196}, - {0x1f, 2, 196}, - {0x29, 2, 196}, - {0x38, 3, 196}, + {0x03, 0x02, 0xBE}, + {0x06, 0x02, 0xBE}, + {0x0A, 0x02, 0xBE}, + {0x0F, 0x02, 0xBE}, + {0x18, 0x02, 0xBE}, + {0x1F, 0x02, 0xBE}, + {0x29, 0x02, 0xBE}, + {0x38, 0x03, 0xBE}, + {0x03, 0x02, 0xC4}, + {0x06, 0x02, 0xC4}, + {0x0A, 0x02, 0xC4}, + {0x0F, 0x02, 0xC4}, + {0x18, 0x02, 0xC4}, + {0x1F, 0x02, 0xC4}, + {0x29, 0x02, 0xC4}, + {0x38, 0x03, 0xC4}, }, /* 142 */ { - {0x01, 2, 198}, - {0x16, 3, 198}, - {0x01, 2, 228}, - {0x16, 3, 228}, - {0x01, 2, 232}, - {0x16, 3, 232}, - {0x01, 2, 233}, - {0x16, 3, 233}, - {0x00, 3, 1}, - {0x00, 3, 135}, - {0x00, 3, 137}, - {0x00, 3, 138}, - {0x00, 3, 139}, - {0x00, 3, 140}, - {0x00, 3, 141}, - {0x00, 3, 143}, + {0x01, 0x02, 0xC6}, + {0x16, 0x03, 0xC6}, + {0x01, 0x02, 0xE4}, + {0x16, 0x03, 0xE4}, + {0x01, 0x02, 0xE8}, + {0x16, 0x03, 0xE8}, + {0x01, 0x02, 0xE9}, + {0x16, 0x03, 0xE9}, + {0x00, 0x03, 0x01}, + {0x00, 0x03, 0x87}, + {0x00, 0x03, 0x89}, + {0x00, 0x03, 0x8A}, + {0x00, 0x03, 0x8B}, + {0x00, 0x03, 0x8C}, + {0x00, 0x03, 0x8D}, + {0x00, 0x03, 0x8F}, }, /* 143 */ { - {0x02, 2, 198}, - {0x09, 2, 198}, - {0x17, 2, 198}, - {0x28, 3, 198}, - {0x02, 2, 228}, - {0x09, 2, 228}, - {0x17, 2, 228}, - {0x28, 3, 228}, - {0x02, 2, 232}, - {0x09, 2, 232}, - {0x17, 2, 232}, - {0x28, 3, 232}, - {0x02, 2, 233}, - {0x09, 2, 233}, - {0x17, 2, 233}, - {0x28, 3, 233}, + {0x02, 0x02, 0xC6}, + {0x09, 0x02, 0xC6}, + {0x17, 0x02, 0xC6}, + {0x28, 0x03, 0xC6}, + {0x02, 0x02, 0xE4}, + {0x09, 0x02, 0xE4}, + {0x17, 0x02, 0xE4}, + {0x28, 0x03, 0xE4}, + {0x02, 0x02, 0xE8}, + {0x09, 0x02, 0xE8}, + {0x17, 0x02, 0xE8}, + {0x28, 0x03, 0xE8}, + {0x02, 0x02, 0xE9}, + {0x09, 0x02, 0xE9}, + {0x17, 0x02, 0xE9}, + {0x28, 0x03, 0xE9}, }, /* 144 */ { - {0x03, 2, 198}, - {0x06, 2, 198}, - {0x0a, 2, 198}, - {0x0f, 2, 198}, - {0x18, 2, 198}, - {0x1f, 2, 198}, - {0x29, 2, 198}, - {0x38, 3, 198}, - {0x03, 2, 228}, - {0x06, 2, 228}, - {0x0a, 2, 228}, - {0x0f, 2, 228}, - {0x18, 2, 228}, - {0x1f, 2, 228}, - {0x29, 2, 228}, - {0x38, 3, 228}, + {0x03, 0x02, 0xC6}, + {0x06, 0x02, 0xC6}, + {0x0A, 0x02, 0xC6}, + {0x0F, 0x02, 0xC6}, + {0x18, 0x02, 0xC6}, + {0x1F, 0x02, 0xC6}, + {0x29, 0x02, 0xC6}, + {0x38, 0x03, 0xC6}, + {0x03, 0x02, 0xE4}, + {0x06, 0x02, 0xE4}, + {0x0A, 0x02, 0xE4}, + {0x0F, 0x02, 0xE4}, + {0x18, 0x02, 0xE4}, + {0x1F, 0x02, 0xE4}, + {0x29, 0x02, 0xE4}, + {0x38, 0x03, 0xE4}, }, /* 145 */ { - {0x03, 2, 232}, - {0x06, 2, 232}, - {0x0a, 2, 232}, - {0x0f, 2, 232}, - {0x18, 2, 232}, - {0x1f, 2, 232}, - {0x29, 2, 232}, - {0x38, 3, 232}, - {0x03, 2, 233}, - {0x06, 2, 233}, - {0x0a, 2, 233}, - {0x0f, 2, 233}, - {0x18, 2, 233}, - {0x1f, 2, 233}, - {0x29, 2, 233}, - {0x38, 3, 233}, + {0x03, 0x02, 0xE8}, + {0x06, 0x02, 0xE8}, + {0x0A, 0x02, 0xE8}, + {0x0F, 0x02, 0xE8}, + {0x18, 0x02, 0xE8}, + {0x1F, 0x02, 0xE8}, + {0x29, 0x02, 0xE8}, + {0x38, 0x03, 0xE8}, + {0x03, 0x02, 0xE9}, + {0x06, 0x02, 0xE9}, + {0x0A, 0x02, 0xE9}, + {0x0F, 0x02, 0xE9}, + {0x18, 0x02, 0xE9}, + {0x1F, 0x02, 0xE9}, + {0x29, 0x02, 0xE9}, + {0x38, 0x03, 0xE9}, }, /* 146 */ { - {0x01, 2, 1}, - {0x16, 3, 1}, - {0x01, 2, 135}, - {0x16, 3, 135}, - {0x01, 2, 137}, - {0x16, 3, 137}, - {0x01, 2, 138}, - {0x16, 3, 138}, - {0x01, 2, 139}, - {0x16, 3, 139}, - {0x01, 2, 140}, - {0x16, 3, 140}, - {0x01, 2, 141}, - {0x16, 3, 141}, - {0x01, 2, 143}, - {0x16, 3, 143}, + {0x01, 0x02, 0x01}, + {0x16, 0x03, 0x01}, + {0x01, 0x02, 0x87}, + {0x16, 0x03, 0x87}, + {0x01, 0x02, 0x89}, + {0x16, 0x03, 0x89}, + {0x01, 0x02, 0x8A}, + {0x16, 0x03, 0x8A}, + {0x01, 0x02, 0x8B}, + {0x16, 0x03, 0x8B}, + {0x01, 0x02, 0x8C}, + {0x16, 0x03, 0x8C}, + {0x01, 0x02, 0x8D}, + {0x16, 0x03, 0x8D}, + {0x01, 0x02, 0x8F}, + {0x16, 0x03, 0x8F}, }, /* 147 */ { - {0x02, 2, 1}, - {0x09, 2, 1}, - {0x17, 2, 1}, - {0x28, 3, 1}, - {0x02, 2, 135}, - {0x09, 2, 135}, - {0x17, 2, 135}, - {0x28, 3, 135}, - {0x02, 2, 137}, - {0x09, 2, 137}, - {0x17, 2, 137}, - {0x28, 3, 137}, - {0x02, 2, 138}, - {0x09, 2, 138}, - {0x17, 2, 138}, - {0x28, 3, 138}, + {0x02, 0x02, 0x01}, + {0x09, 0x02, 0x01}, + {0x17, 0x02, 0x01}, + {0x28, 0x03, 0x01}, + {0x02, 0x02, 0x87}, + {0x09, 0x02, 0x87}, + {0x17, 0x02, 0x87}, + {0x28, 0x03, 0x87}, + {0x02, 0x02, 0x89}, + {0x09, 0x02, 0x89}, + {0x17, 0x02, 0x89}, + {0x28, 0x03, 0x89}, + {0x02, 0x02, 0x8A}, + {0x09, 0x02, 0x8A}, + {0x17, 0x02, 0x8A}, + {0x28, 0x03, 0x8A}, }, /* 148 */ { - {0x03, 2, 1}, - {0x06, 2, 1}, - {0x0a, 2, 1}, - {0x0f, 2, 1}, - {0x18, 2, 1}, - {0x1f, 2, 1}, - {0x29, 2, 1}, - {0x38, 3, 1}, - {0x03, 2, 135}, - {0x06, 2, 135}, - {0x0a, 2, 135}, - {0x0f, 2, 135}, - {0x18, 2, 135}, - {0x1f, 2, 135}, - {0x29, 2, 135}, - {0x38, 3, 135}, + {0x03, 0x02, 0x01}, + {0x06, 0x02, 0x01}, + {0x0A, 0x02, 0x01}, + {0x0F, 0x02, 0x01}, + {0x18, 0x02, 0x01}, + {0x1F, 0x02, 0x01}, + {0x29, 0x02, 0x01}, + {0x38, 0x03, 0x01}, + {0x03, 0x02, 0x87}, + {0x06, 0x02, 0x87}, + {0x0A, 0x02, 0x87}, + {0x0F, 0x02, 0x87}, + {0x18, 0x02, 0x87}, + {0x1F, 0x02, 0x87}, + {0x29, 0x02, 0x87}, + {0x38, 0x03, 0x87}, }, /* 149 */ { - {0x03, 2, 137}, - {0x06, 2, 137}, - {0x0a, 2, 137}, - {0x0f, 2, 137}, - {0x18, 2, 137}, - {0x1f, 2, 137}, - {0x29, 2, 137}, - {0x38, 3, 137}, - {0x03, 2, 138}, - {0x06, 2, 138}, - {0x0a, 2, 138}, - {0x0f, 2, 138}, - {0x18, 2, 138}, - {0x1f, 2, 138}, - {0x29, 2, 138}, - {0x38, 3, 138}, + {0x03, 0x02, 0x89}, + {0x06, 0x02, 0x89}, + {0x0A, 0x02, 0x89}, + {0x0F, 0x02, 0x89}, + {0x18, 0x02, 0x89}, + {0x1F, 0x02, 0x89}, + {0x29, 0x02, 0x89}, + {0x38, 0x03, 0x89}, + {0x03, 0x02, 0x8A}, + {0x06, 0x02, 0x8A}, + {0x0A, 0x02, 0x8A}, + {0x0F, 0x02, 0x8A}, + {0x18, 0x02, 0x8A}, + {0x1F, 0x02, 0x8A}, + {0x29, 0x02, 0x8A}, + {0x38, 0x03, 0x8A}, }, /* 150 */ { - {0x02, 2, 139}, - {0x09, 2, 139}, - {0x17, 2, 139}, - {0x28, 3, 139}, - {0x02, 2, 140}, - {0x09, 2, 140}, - {0x17, 2, 140}, - {0x28, 3, 140}, - {0x02, 2, 141}, - {0x09, 2, 141}, - {0x17, 2, 141}, - {0x28, 3, 141}, - {0x02, 2, 143}, - {0x09, 2, 143}, - {0x17, 2, 143}, - {0x28, 3, 143}, + {0x02, 0x02, 0x8B}, + {0x09, 0x02, 0x8B}, + {0x17, 0x02, 0x8B}, + {0x28, 0x03, 0x8B}, + {0x02, 0x02, 0x8C}, + {0x09, 0x02, 0x8C}, + {0x17, 0x02, 0x8C}, + {0x28, 0x03, 0x8C}, + {0x02, 0x02, 0x8D}, + {0x09, 0x02, 0x8D}, + {0x17, 0x02, 0x8D}, + {0x28, 0x03, 0x8D}, + {0x02, 0x02, 0x8F}, + {0x09, 0x02, 0x8F}, + {0x17, 0x02, 0x8F}, + {0x28, 0x03, 0x8F}, }, /* 151 */ { - {0x03, 2, 139}, - {0x06, 2, 139}, - {0x0a, 2, 139}, - {0x0f, 2, 139}, - {0x18, 2, 139}, - {0x1f, 2, 139}, - {0x29, 2, 139}, - {0x38, 3, 139}, - {0x03, 2, 140}, - {0x06, 2, 140}, - {0x0a, 2, 140}, - {0x0f, 2, 140}, - {0x18, 2, 140}, - {0x1f, 2, 140}, - {0x29, 2, 140}, - {0x38, 3, 140}, + {0x03, 0x02, 0x8B}, + {0x06, 0x02, 0x8B}, + {0x0A, 0x02, 0x8B}, + {0x0F, 0x02, 0x8B}, + {0x18, 0x02, 0x8B}, + {0x1F, 0x02, 0x8B}, + {0x29, 0x02, 0x8B}, + {0x38, 0x03, 0x8B}, + {0x03, 0x02, 0x8C}, + {0x06, 0x02, 0x8C}, + {0x0A, 0x02, 0x8C}, + {0x0F, 0x02, 0x8C}, + {0x18, 0x02, 0x8C}, + {0x1F, 0x02, 0x8C}, + {0x29, 0x02, 0x8C}, + {0x38, 0x03, 0x8C}, }, /* 152 */ { - {0x03, 2, 141}, - {0x06, 2, 141}, - {0x0a, 2, 141}, - {0x0f, 2, 141}, - {0x18, 2, 141}, - {0x1f, 2, 141}, - {0x29, 2, 141}, - {0x38, 3, 141}, - {0x03, 2, 143}, - {0x06, 2, 143}, - {0x0a, 2, 143}, - {0x0f, 2, 143}, - {0x18, 2, 143}, - {0x1f, 2, 143}, - {0x29, 2, 143}, - {0x38, 3, 143}, + {0x03, 0x02, 0x8D}, + {0x06, 0x02, 0x8D}, + {0x0A, 0x02, 0x8D}, + {0x0F, 0x02, 0x8D}, + {0x18, 0x02, 0x8D}, + {0x1F, 0x02, 0x8D}, + {0x29, 0x02, 0x8D}, + {0x38, 0x03, 0x8D}, + {0x03, 0x02, 0x8F}, + {0x06, 0x02, 0x8F}, + {0x0A, 0x02, 0x8F}, + {0x0F, 0x02, 0x8F}, + {0x18, 0x02, 0x8F}, + {0x1F, 0x02, 0x8F}, + {0x29, 0x02, 0x8F}, + {0x38, 0x03, 0x8F}, }, /* 153 */ { - {0x9d, 0, 0}, - {0x9e, 0, 0}, - {0xa0, 0, 0}, - {0xa1, 0, 0}, - {0xa4, 0, 0}, - {0xa5, 0, 0}, - {0xa7, 0, 0}, - {0xa8, 0, 0}, - {0xac, 0, 0}, - {0xad, 0, 0}, - {0xaf, 0, 0}, - {0xb1, 0, 0}, - {0xb6, 0, 0}, - {0xb9, 0, 0}, - {0xbf, 0, 0}, - {0xcf, 0, 0}, + {0x9D, 0x00, 0x00}, + {0x9E, 0x00, 0x00}, + {0xA0, 0x00, 0x00}, + {0xA1, 0x00, 0x00}, + {0xA4, 0x00, 0x00}, + {0xA5, 0x00, 0x00}, + {0xA7, 0x00, 0x00}, + {0xA8, 0x00, 0x00}, + {0xAC, 0x00, 0x00}, + {0xAD, 0x00, 0x00}, + {0xAF, 0x00, 0x00}, + {0xB1, 0x00, 0x00}, + {0xB6, 0x00, 0x00}, + {0xB9, 0x00, 0x00}, + {0xBF, 0x00, 0x00}, + {0xCF, 0x00, 0x00}, }, /* 154 */ { - {0x00, 3, 147}, - {0x00, 3, 149}, - {0x00, 3, 150}, - {0x00, 3, 151}, - {0x00, 3, 152}, - {0x00, 3, 155}, - {0x00, 3, 157}, - {0x00, 3, 158}, - {0x00, 3, 165}, - {0x00, 3, 166}, - {0x00, 3, 168}, - {0x00, 3, 174}, - {0x00, 3, 175}, - {0x00, 3, 180}, - {0x00, 3, 182}, - {0x00, 3, 183}, + {0x00, 0x03, 0x93}, + {0x00, 0x03, 0x95}, + {0x00, 0x03, 0x96}, + {0x00, 0x03, 0x97}, + {0x00, 0x03, 0x98}, + {0x00, 0x03, 0x9B}, + {0x00, 0x03, 0x9D}, + {0x00, 0x03, 0x9E}, + {0x00, 0x03, 0xA5}, + {0x00, 0x03, 0xA6}, + {0x00, 0x03, 0xA8}, + {0x00, 0x03, 0xAE}, + {0x00, 0x03, 0xAF}, + {0x00, 0x03, 0xB4}, + {0x00, 0x03, 0xB6}, + {0x00, 0x03, 0xB7}, }, /* 155 */ { - {0x01, 2, 147}, - {0x16, 3, 147}, - {0x01, 2, 149}, - {0x16, 3, 149}, - {0x01, 2, 150}, - {0x16, 3, 150}, - {0x01, 2, 151}, - {0x16, 3, 151}, - {0x01, 2, 152}, - {0x16, 3, 152}, - {0x01, 2, 155}, - {0x16, 3, 155}, - {0x01, 2, 157}, - {0x16, 3, 157}, - {0x01, 2, 158}, - {0x16, 3, 158}, + {0x01, 0x02, 0x93}, + {0x16, 0x03, 0x93}, + {0x01, 0x02, 0x95}, + {0x16, 0x03, 0x95}, + {0x01, 0x02, 0x96}, + {0x16, 0x03, 0x96}, + {0x01, 0x02, 0x97}, + {0x16, 0x03, 0x97}, + {0x01, 0x02, 0x98}, + {0x16, 0x03, 0x98}, + {0x01, 0x02, 0x9B}, + {0x16, 0x03, 0x9B}, + {0x01, 0x02, 0x9D}, + {0x16, 0x03, 0x9D}, + {0x01, 0x02, 0x9E}, + {0x16, 0x03, 0x9E}, }, /* 156 */ { - {0x02, 2, 147}, - {0x09, 2, 147}, - {0x17, 2, 147}, - {0x28, 3, 147}, - {0x02, 2, 149}, - {0x09, 2, 149}, - {0x17, 2, 149}, - {0x28, 3, 149}, - {0x02, 2, 150}, - {0x09, 2, 150}, - {0x17, 2, 150}, - {0x28, 3, 150}, - {0x02, 2, 151}, - {0x09, 2, 151}, - {0x17, 2, 151}, - {0x28, 3, 151}, + {0x02, 0x02, 0x93}, + {0x09, 0x02, 0x93}, + {0x17, 0x02, 0x93}, + {0x28, 0x03, 0x93}, + {0x02, 0x02, 0x95}, + {0x09, 0x02, 0x95}, + {0x17, 0x02, 0x95}, + {0x28, 0x03, 0x95}, + {0x02, 0x02, 0x96}, + {0x09, 0x02, 0x96}, + {0x17, 0x02, 0x96}, + {0x28, 0x03, 0x96}, + {0x02, 0x02, 0x97}, + {0x09, 0x02, 0x97}, + {0x17, 0x02, 0x97}, + {0x28, 0x03, 0x97}, }, /* 157 */ { - {0x03, 2, 147}, - {0x06, 2, 147}, - {0x0a, 2, 147}, - {0x0f, 2, 147}, - {0x18, 2, 147}, - {0x1f, 2, 147}, - {0x29, 2, 147}, - {0x38, 3, 147}, - {0x03, 2, 149}, - {0x06, 2, 149}, - {0x0a, 2, 149}, - {0x0f, 2, 149}, - {0x18, 2, 149}, - {0x1f, 2, 149}, - {0x29, 2, 149}, - {0x38, 3, 149}, + {0x03, 0x02, 0x93}, + {0x06, 0x02, 0x93}, + {0x0A, 0x02, 0x93}, + {0x0F, 0x02, 0x93}, + {0x18, 0x02, 0x93}, + {0x1F, 0x02, 0x93}, + {0x29, 0x02, 0x93}, + {0x38, 0x03, 0x93}, + {0x03, 0x02, 0x95}, + {0x06, 0x02, 0x95}, + {0x0A, 0x02, 0x95}, + {0x0F, 0x02, 0x95}, + {0x18, 0x02, 0x95}, + {0x1F, 0x02, 0x95}, + {0x29, 0x02, 0x95}, + {0x38, 0x03, 0x95}, }, /* 158 */ { - {0x03, 2, 150}, - {0x06, 2, 150}, - {0x0a, 2, 150}, - {0x0f, 2, 150}, - {0x18, 2, 150}, - {0x1f, 2, 150}, - {0x29, 2, 150}, - {0x38, 3, 150}, - {0x03, 2, 151}, - {0x06, 2, 151}, - {0x0a, 2, 151}, - {0x0f, 2, 151}, - {0x18, 2, 151}, - {0x1f, 2, 151}, - {0x29, 2, 151}, - {0x38, 3, 151}, + {0x03, 0x02, 0x96}, + {0x06, 0x02, 0x96}, + {0x0A, 0x02, 0x96}, + {0x0F, 0x02, 0x96}, + {0x18, 0x02, 0x96}, + {0x1F, 0x02, 0x96}, + {0x29, 0x02, 0x96}, + {0x38, 0x03, 0x96}, + {0x03, 0x02, 0x97}, + {0x06, 0x02, 0x97}, + {0x0A, 0x02, 0x97}, + {0x0F, 0x02, 0x97}, + {0x18, 0x02, 0x97}, + {0x1F, 0x02, 0x97}, + {0x29, 0x02, 0x97}, + {0x38, 0x03, 0x97}, }, /* 159 */ { - {0x02, 2, 152}, - {0x09, 2, 152}, - {0x17, 2, 152}, - {0x28, 3, 152}, - {0x02, 2, 155}, - {0x09, 2, 155}, - {0x17, 2, 155}, - {0x28, 3, 155}, - {0x02, 2, 157}, - {0x09, 2, 157}, - {0x17, 2, 157}, - {0x28, 3, 157}, - {0x02, 2, 158}, - {0x09, 2, 158}, - {0x17, 2, 158}, - {0x28, 3, 158}, + {0x02, 0x02, 0x98}, + {0x09, 0x02, 0x98}, + {0x17, 0x02, 0x98}, + {0x28, 0x03, 0x98}, + {0x02, 0x02, 0x9B}, + {0x09, 0x02, 0x9B}, + {0x17, 0x02, 0x9B}, + {0x28, 0x03, 0x9B}, + {0x02, 0x02, 0x9D}, + {0x09, 0x02, 0x9D}, + {0x17, 0x02, 0x9D}, + {0x28, 0x03, 0x9D}, + {0x02, 0x02, 0x9E}, + {0x09, 0x02, 0x9E}, + {0x17, 0x02, 0x9E}, + {0x28, 0x03, 0x9E}, }, /* 160 */ { - {0x03, 2, 152}, - {0x06, 2, 152}, - {0x0a, 2, 152}, - {0x0f, 2, 152}, - {0x18, 2, 152}, - {0x1f, 2, 152}, - {0x29, 2, 152}, - {0x38, 3, 152}, - {0x03, 2, 155}, - {0x06, 2, 155}, - {0x0a, 2, 155}, - {0x0f, 2, 155}, - {0x18, 2, 155}, - {0x1f, 2, 155}, - {0x29, 2, 155}, - {0x38, 3, 155}, + {0x03, 0x02, 0x98}, + {0x06, 0x02, 0x98}, + {0x0A, 0x02, 0x98}, + {0x0F, 0x02, 0x98}, + {0x18, 0x02, 0x98}, + {0x1F, 0x02, 0x98}, + {0x29, 0x02, 0x98}, + {0x38, 0x03, 0x98}, + {0x03, 0x02, 0x9B}, + {0x06, 0x02, 0x9B}, + {0x0A, 0x02, 0x9B}, + {0x0F, 0x02, 0x9B}, + {0x18, 0x02, 0x9B}, + {0x1F, 0x02, 0x9B}, + {0x29, 0x02, 0x9B}, + {0x38, 0x03, 0x9B}, }, /* 161 */ { - {0x03, 2, 157}, - {0x06, 2, 157}, - {0x0a, 2, 157}, - {0x0f, 2, 157}, - {0x18, 2, 157}, - {0x1f, 2, 157}, - {0x29, 2, 157}, - {0x38, 3, 157}, - {0x03, 2, 158}, - {0x06, 2, 158}, - {0x0a, 2, 158}, - {0x0f, 2, 158}, - {0x18, 2, 158}, - {0x1f, 2, 158}, - {0x29, 2, 158}, - {0x38, 3, 158}, + {0x03, 0x02, 0x9D}, + {0x06, 0x02, 0x9D}, + {0x0A, 0x02, 0x9D}, + {0x0F, 0x02, 0x9D}, + {0x18, 0x02, 0x9D}, + {0x1F, 0x02, 0x9D}, + {0x29, 0x02, 0x9D}, + {0x38, 0x03, 0x9D}, + {0x03, 0x02, 0x9E}, + {0x06, 0x02, 0x9E}, + {0x0A, 0x02, 0x9E}, + {0x0F, 0x02, 0x9E}, + {0x18, 0x02, 0x9E}, + {0x1F, 0x02, 0x9E}, + {0x29, 0x02, 0x9E}, + {0x38, 0x03, 0x9E}, }, /* 162 */ { - {0x01, 2, 165}, - {0x16, 3, 165}, - {0x01, 2, 166}, - {0x16, 3, 166}, - {0x01, 2, 168}, - {0x16, 3, 168}, - {0x01, 2, 174}, - {0x16, 3, 174}, - {0x01, 2, 175}, - {0x16, 3, 175}, - {0x01, 2, 180}, - {0x16, 3, 180}, - {0x01, 2, 182}, - {0x16, 3, 182}, - {0x01, 2, 183}, - {0x16, 3, 183}, + {0x01, 0x02, 0xA5}, + {0x16, 0x03, 0xA5}, + {0x01, 0x02, 0xA6}, + {0x16, 0x03, 0xA6}, + {0x01, 0x02, 0xA8}, + {0x16, 0x03, 0xA8}, + {0x01, 0x02, 0xAE}, + {0x16, 0x03, 0xAE}, + {0x01, 0x02, 0xAF}, + {0x16, 0x03, 0xAF}, + {0x01, 0x02, 0xB4}, + {0x16, 0x03, 0xB4}, + {0x01, 0x02, 0xB6}, + {0x16, 0x03, 0xB6}, + {0x01, 0x02, 0xB7}, + {0x16, 0x03, 0xB7}, }, /* 163 */ { - {0x02, 2, 165}, - {0x09, 2, 165}, - {0x17, 2, 165}, - {0x28, 3, 165}, - {0x02, 2, 166}, - {0x09, 2, 166}, - {0x17, 2, 166}, - {0x28, 3, 166}, - {0x02, 2, 168}, - {0x09, 2, 168}, - {0x17, 2, 168}, - {0x28, 3, 168}, - {0x02, 2, 174}, - {0x09, 2, 174}, - {0x17, 2, 174}, - {0x28, 3, 174}, + {0x02, 0x02, 0xA5}, + {0x09, 0x02, 0xA5}, + {0x17, 0x02, 0xA5}, + {0x28, 0x03, 0xA5}, + {0x02, 0x02, 0xA6}, + {0x09, 0x02, 0xA6}, + {0x17, 0x02, 0xA6}, + {0x28, 0x03, 0xA6}, + {0x02, 0x02, 0xA8}, + {0x09, 0x02, 0xA8}, + {0x17, 0x02, 0xA8}, + {0x28, 0x03, 0xA8}, + {0x02, 0x02, 0xAE}, + {0x09, 0x02, 0xAE}, + {0x17, 0x02, 0xAE}, + {0x28, 0x03, 0xAE}, }, /* 164 */ { - {0x03, 2, 165}, - {0x06, 2, 165}, - {0x0a, 2, 165}, - {0x0f, 2, 165}, - {0x18, 2, 165}, - {0x1f, 2, 165}, - {0x29, 2, 165}, - {0x38, 3, 165}, - {0x03, 2, 166}, - {0x06, 2, 166}, - {0x0a, 2, 166}, - {0x0f, 2, 166}, - {0x18, 2, 166}, - {0x1f, 2, 166}, - {0x29, 2, 166}, - {0x38, 3, 166}, + {0x03, 0x02, 0xA5}, + {0x06, 0x02, 0xA5}, + {0x0A, 0x02, 0xA5}, + {0x0F, 0x02, 0xA5}, + {0x18, 0x02, 0xA5}, + {0x1F, 0x02, 0xA5}, + {0x29, 0x02, 0xA5}, + {0x38, 0x03, 0xA5}, + {0x03, 0x02, 0xA6}, + {0x06, 0x02, 0xA6}, + {0x0A, 0x02, 0xA6}, + {0x0F, 0x02, 0xA6}, + {0x18, 0x02, 0xA6}, + {0x1F, 0x02, 0xA6}, + {0x29, 0x02, 0xA6}, + {0x38, 0x03, 0xA6}, }, /* 165 */ { - {0x03, 2, 168}, - {0x06, 2, 168}, - {0x0a, 2, 168}, - {0x0f, 2, 168}, - {0x18, 2, 168}, - {0x1f, 2, 168}, - {0x29, 2, 168}, - {0x38, 3, 168}, - {0x03, 2, 174}, - {0x06, 2, 174}, - {0x0a, 2, 174}, - {0x0f, 2, 174}, - {0x18, 2, 174}, - {0x1f, 2, 174}, - {0x29, 2, 174}, - {0x38, 3, 174}, + {0x03, 0x02, 0xA8}, + {0x06, 0x02, 0xA8}, + {0x0A, 0x02, 0xA8}, + {0x0F, 0x02, 0xA8}, + {0x18, 0x02, 0xA8}, + {0x1F, 0x02, 0xA8}, + {0x29, 0x02, 0xA8}, + {0x38, 0x03, 0xA8}, + {0x03, 0x02, 0xAE}, + {0x06, 0x02, 0xAE}, + {0x0A, 0x02, 0xAE}, + {0x0F, 0x02, 0xAE}, + {0x18, 0x02, 0xAE}, + {0x1F, 0x02, 0xAE}, + {0x29, 0x02, 0xAE}, + {0x38, 0x03, 0xAE}, }, /* 166 */ { - {0x02, 2, 175}, - {0x09, 2, 175}, - {0x17, 2, 175}, - {0x28, 3, 175}, - {0x02, 2, 180}, - {0x09, 2, 180}, - {0x17, 2, 180}, - {0x28, 3, 180}, - {0x02, 2, 182}, - {0x09, 2, 182}, - {0x17, 2, 182}, - {0x28, 3, 182}, - {0x02, 2, 183}, - {0x09, 2, 183}, - {0x17, 2, 183}, - {0x28, 3, 183}, + {0x02, 0x02, 0xAF}, + {0x09, 0x02, 0xAF}, + {0x17, 0x02, 0xAF}, + {0x28, 0x03, 0xAF}, + {0x02, 0x02, 0xB4}, + {0x09, 0x02, 0xB4}, + {0x17, 0x02, 0xB4}, + {0x28, 0x03, 0xB4}, + {0x02, 0x02, 0xB6}, + {0x09, 0x02, 0xB6}, + {0x17, 0x02, 0xB6}, + {0x28, 0x03, 0xB6}, + {0x02, 0x02, 0xB7}, + {0x09, 0x02, 0xB7}, + {0x17, 0x02, 0xB7}, + {0x28, 0x03, 0xB7}, }, /* 167 */ { - {0x03, 2, 175}, - {0x06, 2, 175}, - {0x0a, 2, 175}, - {0x0f, 2, 175}, - {0x18, 2, 175}, - {0x1f, 2, 175}, - {0x29, 2, 175}, - {0x38, 3, 175}, - {0x03, 2, 180}, - {0x06, 2, 180}, - {0x0a, 2, 180}, - {0x0f, 2, 180}, - {0x18, 2, 180}, - {0x1f, 2, 180}, - {0x29, 2, 180}, - {0x38, 3, 180}, + {0x03, 0x02, 0xAF}, + {0x06, 0x02, 0xAF}, + {0x0A, 0x02, 0xAF}, + {0x0F, 0x02, 0xAF}, + {0x18, 0x02, 0xAF}, + {0x1F, 0x02, 0xAF}, + {0x29, 0x02, 0xAF}, + {0x38, 0x03, 0xAF}, + {0x03, 0x02, 0xB4}, + {0x06, 0x02, 0xB4}, + {0x0A, 0x02, 0xB4}, + {0x0F, 0x02, 0xB4}, + {0x18, 0x02, 0xB4}, + {0x1F, 0x02, 0xB4}, + {0x29, 0x02, 0xB4}, + {0x38, 0x03, 0xB4}, }, /* 168 */ { - {0x03, 2, 182}, - {0x06, 2, 182}, - {0x0a, 2, 182}, - {0x0f, 2, 182}, - {0x18, 2, 182}, - {0x1f, 2, 182}, - {0x29, 2, 182}, - {0x38, 3, 182}, - {0x03, 2, 183}, - {0x06, 2, 183}, - {0x0a, 2, 183}, - {0x0f, 2, 183}, - {0x18, 2, 183}, - {0x1f, 2, 183}, - {0x29, 2, 183}, - {0x38, 3, 183}, + {0x03, 0x02, 0xB6}, + {0x06, 0x02, 0xB6}, + {0x0A, 0x02, 0xB6}, + {0x0F, 0x02, 0xB6}, + {0x18, 0x02, 0xB6}, + {0x1F, 0x02, 0xB6}, + {0x29, 0x02, 0xB6}, + {0x38, 0x03, 0xB6}, + {0x03, 0x02, 0xB7}, + {0x06, 0x02, 0xB7}, + {0x0A, 0x02, 0xB7}, + {0x0F, 0x02, 0xB7}, + {0x18, 0x02, 0xB7}, + {0x1F, 0x02, 0xB7}, + {0x29, 0x02, 0xB7}, + {0x38, 0x03, 0xB7}, }, /* 169 */ { - {0x00, 3, 188}, - {0x00, 3, 191}, - {0x00, 3, 197}, - {0x00, 3, 231}, - {0x00, 3, 239}, - {0xb0, 0, 0}, - {0xb2, 0, 0}, - {0xb3, 0, 0}, - {0xb7, 0, 0}, - {0xb8, 0, 0}, - {0xba, 0, 0}, - {0xbb, 0, 0}, - {0xc0, 0, 0}, - {0xc7, 0, 0}, - {0xd0, 0, 0}, - {0xdf, 0, 0}, + {0x00, 0x03, 0xBC}, + {0x00, 0x03, 0xBF}, + {0x00, 0x03, 0xC5}, + {0x00, 0x03, 0xE7}, + {0x00, 0x03, 0xEF}, + {0xB0, 0x00, 0x00}, + {0xB2, 0x00, 0x00}, + {0xB3, 0x00, 0x00}, + {0xB7, 0x00, 0x00}, + {0xB8, 0x00, 0x00}, + {0xBA, 0x00, 0x00}, + {0xBB, 0x00, 0x00}, + {0xC0, 0x00, 0x00}, + {0xC7, 0x00, 0x00}, + {0xD0, 0x00, 0x00}, + {0xDF, 0x00, 0x00}, }, /* 170 */ { - {0x01, 2, 188}, - {0x16, 3, 188}, - {0x01, 2, 191}, - {0x16, 3, 191}, - {0x01, 2, 197}, - {0x16, 3, 197}, - {0x01, 2, 231}, - {0x16, 3, 231}, - {0x01, 2, 239}, - {0x16, 3, 239}, - {0x00, 3, 9}, - {0x00, 3, 142}, - {0x00, 3, 144}, - {0x00, 3, 145}, - {0x00, 3, 148}, - {0x00, 3, 159}, + {0x01, 0x02, 0xBC}, + {0x16, 0x03, 0xBC}, + {0x01, 0x02, 0xBF}, + {0x16, 0x03, 0xBF}, + {0x01, 0x02, 0xC5}, + {0x16, 0x03, 0xC5}, + {0x01, 0x02, 0xE7}, + {0x16, 0x03, 0xE7}, + {0x01, 0x02, 0xEF}, + {0x16, 0x03, 0xEF}, + {0x00, 0x03, 0x09}, + {0x00, 0x03, 0x8E}, + {0x00, 0x03, 0x90}, + {0x00, 0x03, 0x91}, + {0x00, 0x03, 0x94}, + {0x00, 0x03, 0x9F}, }, /* 171 */ { - {0x02, 2, 188}, - {0x09, 2, 188}, - {0x17, 2, 188}, - {0x28, 3, 188}, - {0x02, 2, 191}, - {0x09, 2, 191}, - {0x17, 2, 191}, - {0x28, 3, 191}, - {0x02, 2, 197}, - {0x09, 2, 197}, - {0x17, 2, 197}, - {0x28, 3, 197}, - {0x02, 2, 231}, - {0x09, 2, 231}, - {0x17, 2, 231}, - {0x28, 3, 231}, + {0x02, 0x02, 0xBC}, + {0x09, 0x02, 0xBC}, + {0x17, 0x02, 0xBC}, + {0x28, 0x03, 0xBC}, + {0x02, 0x02, 0xBF}, + {0x09, 0x02, 0xBF}, + {0x17, 0x02, 0xBF}, + {0x28, 0x03, 0xBF}, + {0x02, 0x02, 0xC5}, + {0x09, 0x02, 0xC5}, + {0x17, 0x02, 0xC5}, + {0x28, 0x03, 0xC5}, + {0x02, 0x02, 0xE7}, + {0x09, 0x02, 0xE7}, + {0x17, 0x02, 0xE7}, + {0x28, 0x03, 0xE7}, }, /* 172 */ { - {0x03, 2, 188}, - {0x06, 2, 188}, - {0x0a, 2, 188}, - {0x0f, 2, 188}, - {0x18, 2, 188}, - {0x1f, 2, 188}, - {0x29, 2, 188}, - {0x38, 3, 188}, - {0x03, 2, 191}, - {0x06, 2, 191}, - {0x0a, 2, 191}, - {0x0f, 2, 191}, - {0x18, 2, 191}, - {0x1f, 2, 191}, - {0x29, 2, 191}, - {0x38, 3, 191}, + {0x03, 0x02, 0xBC}, + {0x06, 0x02, 0xBC}, + {0x0A, 0x02, 0xBC}, + {0x0F, 0x02, 0xBC}, + {0x18, 0x02, 0xBC}, + {0x1F, 0x02, 0xBC}, + {0x29, 0x02, 0xBC}, + {0x38, 0x03, 0xBC}, + {0x03, 0x02, 0xBF}, + {0x06, 0x02, 0xBF}, + {0x0A, 0x02, 0xBF}, + {0x0F, 0x02, 0xBF}, + {0x18, 0x02, 0xBF}, + {0x1F, 0x02, 0xBF}, + {0x29, 0x02, 0xBF}, + {0x38, 0x03, 0xBF}, }, /* 173 */ { - {0x03, 2, 197}, - {0x06, 2, 197}, - {0x0a, 2, 197}, - {0x0f, 2, 197}, - {0x18, 2, 197}, - {0x1f, 2, 197}, - {0x29, 2, 197}, - {0x38, 3, 197}, - {0x03, 2, 231}, - {0x06, 2, 231}, - {0x0a, 2, 231}, - {0x0f, 2, 231}, - {0x18, 2, 231}, - {0x1f, 2, 231}, - {0x29, 2, 231}, - {0x38, 3, 231}, + {0x03, 0x02, 0xC5}, + {0x06, 0x02, 0xC5}, + {0x0A, 0x02, 0xC5}, + {0x0F, 0x02, 0xC5}, + {0x18, 0x02, 0xC5}, + {0x1F, 0x02, 0xC5}, + {0x29, 0x02, 0xC5}, + {0x38, 0x03, 0xC5}, + {0x03, 0x02, 0xE7}, + {0x06, 0x02, 0xE7}, + {0x0A, 0x02, 0xE7}, + {0x0F, 0x02, 0xE7}, + {0x18, 0x02, 0xE7}, + {0x1F, 0x02, 0xE7}, + {0x29, 0x02, 0xE7}, + {0x38, 0x03, 0xE7}, }, /* 174 */ { - {0x02, 2, 239}, - {0x09, 2, 239}, - {0x17, 2, 239}, - {0x28, 3, 239}, - {0x01, 2, 9}, - {0x16, 3, 9}, - {0x01, 2, 142}, - {0x16, 3, 142}, - {0x01, 2, 144}, - {0x16, 3, 144}, - {0x01, 2, 145}, - {0x16, 3, 145}, - {0x01, 2, 148}, - {0x16, 3, 148}, - {0x01, 2, 159}, - {0x16, 3, 159}, + {0x02, 0x02, 0xEF}, + {0x09, 0x02, 0xEF}, + {0x17, 0x02, 0xEF}, + {0x28, 0x03, 0xEF}, + {0x01, 0x02, 0x09}, + {0x16, 0x03, 0x09}, + {0x01, 0x02, 0x8E}, + {0x16, 0x03, 0x8E}, + {0x01, 0x02, 0x90}, + {0x16, 0x03, 0x90}, + {0x01, 0x02, 0x91}, + {0x16, 0x03, 0x91}, + {0x01, 0x02, 0x94}, + {0x16, 0x03, 0x94}, + {0x01, 0x02, 0x9F}, + {0x16, 0x03, 0x9F}, }, /* 175 */ { - {0x03, 2, 239}, - {0x06, 2, 239}, - {0x0a, 2, 239}, - {0x0f, 2, 239}, - {0x18, 2, 239}, - {0x1f, 2, 239}, - {0x29, 2, 239}, - {0x38, 3, 239}, - {0x02, 2, 9}, - {0x09, 2, 9}, - {0x17, 2, 9}, - {0x28, 3, 9}, - {0x02, 2, 142}, - {0x09, 2, 142}, - {0x17, 2, 142}, - {0x28, 3, 142}, + {0x03, 0x02, 0xEF}, + {0x06, 0x02, 0xEF}, + {0x0A, 0x02, 0xEF}, + {0x0F, 0x02, 0xEF}, + {0x18, 0x02, 0xEF}, + {0x1F, 0x02, 0xEF}, + {0x29, 0x02, 0xEF}, + {0x38, 0x03, 0xEF}, + {0x02, 0x02, 0x09}, + {0x09, 0x02, 0x09}, + {0x17, 0x02, 0x09}, + {0x28, 0x03, 0x09}, + {0x02, 0x02, 0x8E}, + {0x09, 0x02, 0x8E}, + {0x17, 0x02, 0x8E}, + {0x28, 0x03, 0x8E}, }, /* 176 */ { - {0x03, 2, 9}, - {0x06, 2, 9}, - {0x0a, 2, 9}, - {0x0f, 2, 9}, - {0x18, 2, 9}, - {0x1f, 2, 9}, - {0x29, 2, 9}, - {0x38, 3, 9}, - {0x03, 2, 142}, - {0x06, 2, 142}, - {0x0a, 2, 142}, - {0x0f, 2, 142}, - {0x18, 2, 142}, - {0x1f, 2, 142}, - {0x29, 2, 142}, - {0x38, 3, 142}, + {0x03, 0x02, 0x09}, + {0x06, 0x02, 0x09}, + {0x0A, 0x02, 0x09}, + {0x0F, 0x02, 0x09}, + {0x18, 0x02, 0x09}, + {0x1F, 0x02, 0x09}, + {0x29, 0x02, 0x09}, + {0x38, 0x03, 0x09}, + {0x03, 0x02, 0x8E}, + {0x06, 0x02, 0x8E}, + {0x0A, 0x02, 0x8E}, + {0x0F, 0x02, 0x8E}, + {0x18, 0x02, 0x8E}, + {0x1F, 0x02, 0x8E}, + {0x29, 0x02, 0x8E}, + {0x38, 0x03, 0x8E}, }, /* 177 */ { - {0x02, 2, 144}, - {0x09, 2, 144}, - {0x17, 2, 144}, - {0x28, 3, 144}, - {0x02, 2, 145}, - {0x09, 2, 145}, - {0x17, 2, 145}, - {0x28, 3, 145}, - {0x02, 2, 148}, - {0x09, 2, 148}, - {0x17, 2, 148}, - {0x28, 3, 148}, - {0x02, 2, 159}, - {0x09, 2, 159}, - {0x17, 2, 159}, - {0x28, 3, 159}, + {0x02, 0x02, 0x90}, + {0x09, 0x02, 0x90}, + {0x17, 0x02, 0x90}, + {0x28, 0x03, 0x90}, + {0x02, 0x02, 0x91}, + {0x09, 0x02, 0x91}, + {0x17, 0x02, 0x91}, + {0x28, 0x03, 0x91}, + {0x02, 0x02, 0x94}, + {0x09, 0x02, 0x94}, + {0x17, 0x02, 0x94}, + {0x28, 0x03, 0x94}, + {0x02, 0x02, 0x9F}, + {0x09, 0x02, 0x9F}, + {0x17, 0x02, 0x9F}, + {0x28, 0x03, 0x9F}, }, /* 178 */ { - {0x03, 2, 144}, - {0x06, 2, 144}, - {0x0a, 2, 144}, - {0x0f, 2, 144}, - {0x18, 2, 144}, - {0x1f, 2, 144}, - {0x29, 2, 144}, - {0x38, 3, 144}, - {0x03, 2, 145}, - {0x06, 2, 145}, - {0x0a, 2, 145}, - {0x0f, 2, 145}, - {0x18, 2, 145}, - {0x1f, 2, 145}, - {0x29, 2, 145}, - {0x38, 3, 145}, + {0x03, 0x02, 0x90}, + {0x06, 0x02, 0x90}, + {0x0A, 0x02, 0x90}, + {0x0F, 0x02, 0x90}, + {0x18, 0x02, 0x90}, + {0x1F, 0x02, 0x90}, + {0x29, 0x02, 0x90}, + {0x38, 0x03, 0x90}, + {0x03, 0x02, 0x91}, + {0x06, 0x02, 0x91}, + {0x0A, 0x02, 0x91}, + {0x0F, 0x02, 0x91}, + {0x18, 0x02, 0x91}, + {0x1F, 0x02, 0x91}, + {0x29, 0x02, 0x91}, + {0x38, 0x03, 0x91}, }, /* 179 */ { - {0x03, 2, 148}, - {0x06, 2, 148}, - {0x0a, 2, 148}, - {0x0f, 2, 148}, - {0x18, 2, 148}, - {0x1f, 2, 148}, - {0x29, 2, 148}, - {0x38, 3, 148}, - {0x03, 2, 159}, - {0x06, 2, 159}, - {0x0a, 2, 159}, - {0x0f, 2, 159}, - {0x18, 2, 159}, - {0x1f, 2, 159}, - {0x29, 2, 159}, - {0x38, 3, 159}, + {0x03, 0x02, 0x94}, + {0x06, 0x02, 0x94}, + {0x0A, 0x02, 0x94}, + {0x0F, 0x02, 0x94}, + {0x18, 0x02, 0x94}, + {0x1F, 0x02, 0x94}, + {0x29, 0x02, 0x94}, + {0x38, 0x03, 0x94}, + {0x03, 0x02, 0x9F}, + {0x06, 0x02, 0x9F}, + {0x0A, 0x02, 0x9F}, + {0x0F, 0x02, 0x9F}, + {0x18, 0x02, 0x9F}, + {0x1F, 0x02, 0x9F}, + {0x29, 0x02, 0x9F}, + {0x38, 0x03, 0x9F}, }, /* 180 */ { - {0x00, 3, 171}, - {0x00, 3, 206}, - {0x00, 3, 215}, - {0x00, 3, 225}, - {0x00, 3, 236}, - {0x00, 3, 237}, - {0xbc, 0, 0}, - {0xbd, 0, 0}, - {0xc1, 0, 0}, - {0xc4, 0, 0}, - {0xc8, 0, 0}, - {0xcb, 0, 0}, - {0xd1, 0, 0}, - {0xd8, 0, 0}, - {0xe0, 0, 0}, - {0xee, 0, 0}, + {0x00, 0x03, 0xAB}, + {0x00, 0x03, 0xCE}, + {0x00, 0x03, 0xD7}, + {0x00, 0x03, 0xE1}, + {0x00, 0x03, 0xEC}, + {0x00, 0x03, 0xED}, + {0xBC, 0x00, 0x00}, + {0xBD, 0x00, 0x00}, + {0xC1, 0x00, 0x00}, + {0xC4, 0x00, 0x00}, + {0xC8, 0x00, 0x00}, + {0xCB, 0x00, 0x00}, + {0xD1, 0x00, 0x00}, + {0xD8, 0x00, 0x00}, + {0xE0, 0x00, 0x00}, + {0xEE, 0x00, 0x00}, }, /* 181 */ { - {0x01, 2, 171}, - {0x16, 3, 171}, - {0x01, 2, 206}, - {0x16, 3, 206}, - {0x01, 2, 215}, - {0x16, 3, 215}, - {0x01, 2, 225}, - {0x16, 3, 225}, - {0x01, 2, 236}, - {0x16, 3, 236}, - {0x01, 2, 237}, - {0x16, 3, 237}, - {0x00, 3, 199}, - {0x00, 3, 207}, - {0x00, 3, 234}, - {0x00, 3, 235}, + {0x01, 0x02, 0xAB}, + {0x16, 0x03, 0xAB}, + {0x01, 0x02, 0xCE}, + {0x16, 0x03, 0xCE}, + {0x01, 0x02, 0xD7}, + {0x16, 0x03, 0xD7}, + {0x01, 0x02, 0xE1}, + {0x16, 0x03, 0xE1}, + {0x01, 0x02, 0xEC}, + {0x16, 0x03, 0xEC}, + {0x01, 0x02, 0xED}, + {0x16, 0x03, 0xED}, + {0x00, 0x03, 0xC7}, + {0x00, 0x03, 0xCF}, + {0x00, 0x03, 0xEA}, + {0x00, 0x03, 0xEB}, }, /* 182 */ { - {0x02, 2, 171}, - {0x09, 2, 171}, - {0x17, 2, 171}, - {0x28, 3, 171}, - {0x02, 2, 206}, - {0x09, 2, 206}, - {0x17, 2, 206}, - {0x28, 3, 206}, - {0x02, 2, 215}, - {0x09, 2, 215}, - {0x17, 2, 215}, - {0x28, 3, 215}, - {0x02, 2, 225}, - {0x09, 2, 225}, - {0x17, 2, 225}, - {0x28, 3, 225}, + {0x02, 0x02, 0xAB}, + {0x09, 0x02, 0xAB}, + {0x17, 0x02, 0xAB}, + {0x28, 0x03, 0xAB}, + {0x02, 0x02, 0xCE}, + {0x09, 0x02, 0xCE}, + {0x17, 0x02, 0xCE}, + {0x28, 0x03, 0xCE}, + {0x02, 0x02, 0xD7}, + {0x09, 0x02, 0xD7}, + {0x17, 0x02, 0xD7}, + {0x28, 0x03, 0xD7}, + {0x02, 0x02, 0xE1}, + {0x09, 0x02, 0xE1}, + {0x17, 0x02, 0xE1}, + {0x28, 0x03, 0xE1}, }, /* 183 */ { - {0x03, 2, 171}, - {0x06, 2, 171}, - {0x0a, 2, 171}, - {0x0f, 2, 171}, - {0x18, 2, 171}, - {0x1f, 2, 171}, - {0x29, 2, 171}, - {0x38, 3, 171}, - {0x03, 2, 206}, - {0x06, 2, 206}, - {0x0a, 2, 206}, - {0x0f, 2, 206}, - {0x18, 2, 206}, - {0x1f, 2, 206}, - {0x29, 2, 206}, - {0x38, 3, 206}, + {0x03, 0x02, 0xAB}, + {0x06, 0x02, 0xAB}, + {0x0A, 0x02, 0xAB}, + {0x0F, 0x02, 0xAB}, + {0x18, 0x02, 0xAB}, + {0x1F, 0x02, 0xAB}, + {0x29, 0x02, 0xAB}, + {0x38, 0x03, 0xAB}, + {0x03, 0x02, 0xCE}, + {0x06, 0x02, 0xCE}, + {0x0A, 0x02, 0xCE}, + {0x0F, 0x02, 0xCE}, + {0x18, 0x02, 0xCE}, + {0x1F, 0x02, 0xCE}, + {0x29, 0x02, 0xCE}, + {0x38, 0x03, 0xCE}, }, /* 184 */ { - {0x03, 2, 215}, - {0x06, 2, 215}, - {0x0a, 2, 215}, - {0x0f, 2, 215}, - {0x18, 2, 215}, - {0x1f, 2, 215}, - {0x29, 2, 215}, - {0x38, 3, 215}, - {0x03, 2, 225}, - {0x06, 2, 225}, - {0x0a, 2, 225}, - {0x0f, 2, 225}, - {0x18, 2, 225}, - {0x1f, 2, 225}, - {0x29, 2, 225}, - {0x38, 3, 225}, + {0x03, 0x02, 0xD7}, + {0x06, 0x02, 0xD7}, + {0x0A, 0x02, 0xD7}, + {0x0F, 0x02, 0xD7}, + {0x18, 0x02, 0xD7}, + {0x1F, 0x02, 0xD7}, + {0x29, 0x02, 0xD7}, + {0x38, 0x03, 0xD7}, + {0x03, 0x02, 0xE1}, + {0x06, 0x02, 0xE1}, + {0x0A, 0x02, 0xE1}, + {0x0F, 0x02, 0xE1}, + {0x18, 0x02, 0xE1}, + {0x1F, 0x02, 0xE1}, + {0x29, 0x02, 0xE1}, + {0x38, 0x03, 0xE1}, }, /* 185 */ { - {0x02, 2, 236}, - {0x09, 2, 236}, - {0x17, 2, 236}, - {0x28, 3, 236}, - {0x02, 2, 237}, - {0x09, 2, 237}, - {0x17, 2, 237}, - {0x28, 3, 237}, - {0x01, 2, 199}, - {0x16, 3, 199}, - {0x01, 2, 207}, - {0x16, 3, 207}, - {0x01, 2, 234}, - {0x16, 3, 234}, - {0x01, 2, 235}, - {0x16, 3, 235}, + {0x02, 0x02, 0xEC}, + {0x09, 0x02, 0xEC}, + {0x17, 0x02, 0xEC}, + {0x28, 0x03, 0xEC}, + {0x02, 0x02, 0xED}, + {0x09, 0x02, 0xED}, + {0x17, 0x02, 0xED}, + {0x28, 0x03, 0xED}, + {0x01, 0x02, 0xC7}, + {0x16, 0x03, 0xC7}, + {0x01, 0x02, 0xCF}, + {0x16, 0x03, 0xCF}, + {0x01, 0x02, 0xEA}, + {0x16, 0x03, 0xEA}, + {0x01, 0x02, 0xEB}, + {0x16, 0x03, 0xEB}, }, /* 186 */ { - {0x03, 2, 236}, - {0x06, 2, 236}, - {0x0a, 2, 236}, - {0x0f, 2, 236}, - {0x18, 2, 236}, - {0x1f, 2, 236}, - {0x29, 2, 236}, - {0x38, 3, 236}, - {0x03, 2, 237}, - {0x06, 2, 237}, - {0x0a, 2, 237}, - {0x0f, 2, 237}, - {0x18, 2, 237}, - {0x1f, 2, 237}, - {0x29, 2, 237}, - {0x38, 3, 237}, + {0x03, 0x02, 0xEC}, + {0x06, 0x02, 0xEC}, + {0x0A, 0x02, 0xEC}, + {0x0F, 0x02, 0xEC}, + {0x18, 0x02, 0xEC}, + {0x1F, 0x02, 0xEC}, + {0x29, 0x02, 0xEC}, + {0x38, 0x03, 0xEC}, + {0x03, 0x02, 0xED}, + {0x06, 0x02, 0xED}, + {0x0A, 0x02, 0xED}, + {0x0F, 0x02, 0xED}, + {0x18, 0x02, 0xED}, + {0x1F, 0x02, 0xED}, + {0x29, 0x02, 0xED}, + {0x38, 0x03, 0xED}, }, /* 187 */ { - {0x02, 2, 199}, - {0x09, 2, 199}, - {0x17, 2, 199}, - {0x28, 3, 199}, - {0x02, 2, 207}, - {0x09, 2, 207}, - {0x17, 2, 207}, - {0x28, 3, 207}, - {0x02, 2, 234}, - {0x09, 2, 234}, - {0x17, 2, 234}, - {0x28, 3, 234}, - {0x02, 2, 235}, - {0x09, 2, 235}, - {0x17, 2, 235}, - {0x28, 3, 235}, + {0x02, 0x02, 0xC7}, + {0x09, 0x02, 0xC7}, + {0x17, 0x02, 0xC7}, + {0x28, 0x03, 0xC7}, + {0x02, 0x02, 0xCF}, + {0x09, 0x02, 0xCF}, + {0x17, 0x02, 0xCF}, + {0x28, 0x03, 0xCF}, + {0x02, 0x02, 0xEA}, + {0x09, 0x02, 0xEA}, + {0x17, 0x02, 0xEA}, + {0x28, 0x03, 0xEA}, + {0x02, 0x02, 0xEB}, + {0x09, 0x02, 0xEB}, + {0x17, 0x02, 0xEB}, + {0x28, 0x03, 0xEB}, }, /* 188 */ { - {0x03, 2, 199}, - {0x06, 2, 199}, - {0x0a, 2, 199}, - {0x0f, 2, 199}, - {0x18, 2, 199}, - {0x1f, 2, 199}, - {0x29, 2, 199}, - {0x38, 3, 199}, - {0x03, 2, 207}, - {0x06, 2, 207}, - {0x0a, 2, 207}, - {0x0f, 2, 207}, - {0x18, 2, 207}, - {0x1f, 2, 207}, - {0x29, 2, 207}, - {0x38, 3, 207}, + {0x03, 0x02, 0xC7}, + {0x06, 0x02, 0xC7}, + {0x0A, 0x02, 0xC7}, + {0x0F, 0x02, 0xC7}, + {0x18, 0x02, 0xC7}, + {0x1F, 0x02, 0xC7}, + {0x29, 0x02, 0xC7}, + {0x38, 0x03, 0xC7}, + {0x03, 0x02, 0xCF}, + {0x06, 0x02, 0xCF}, + {0x0A, 0x02, 0xCF}, + {0x0F, 0x02, 0xCF}, + {0x18, 0x02, 0xCF}, + {0x1F, 0x02, 0xCF}, + {0x29, 0x02, 0xCF}, + {0x38, 0x03, 0xCF}, }, /* 189 */ { - {0x03, 2, 234}, - {0x06, 2, 234}, - {0x0a, 2, 234}, - {0x0f, 2, 234}, - {0x18, 2, 234}, - {0x1f, 2, 234}, - {0x29, 2, 234}, - {0x38, 3, 234}, - {0x03, 2, 235}, - {0x06, 2, 235}, - {0x0a, 2, 235}, - {0x0f, 2, 235}, - {0x18, 2, 235}, - {0x1f, 2, 235}, - {0x29, 2, 235}, - {0x38, 3, 235}, + {0x03, 0x02, 0xEA}, + {0x06, 0x02, 0xEA}, + {0x0A, 0x02, 0xEA}, + {0x0F, 0x02, 0xEA}, + {0x18, 0x02, 0xEA}, + {0x1F, 0x02, 0xEA}, + {0x29, 0x02, 0xEA}, + {0x38, 0x03, 0xEA}, + {0x03, 0x02, 0xEB}, + {0x06, 0x02, 0xEB}, + {0x0A, 0x02, 0xEB}, + {0x0F, 0x02, 0xEB}, + {0x18, 0x02, 0xEB}, + {0x1F, 0x02, 0xEB}, + {0x29, 0x02, 0xEB}, + {0x38, 0x03, 0xEB}, }, /* 190 */ { - {0xc2, 0, 0}, - {0xc3, 0, 0}, - {0xc5, 0, 0}, - {0xc6, 0, 0}, - {0xc9, 0, 0}, - {0xca, 0, 0}, - {0xcc, 0, 0}, - {0xcd, 0, 0}, - {0xd2, 0, 0}, - {0xd5, 0, 0}, - {0xd9, 0, 0}, - {0xdc, 0, 0}, - {0xe1, 0, 0}, - {0xe7, 0, 0}, - {0xef, 0, 0}, - {0xf6, 0, 0}, + {0xC2, 0x00, 0x00}, + {0xC3, 0x00, 0x00}, + {0xC5, 0x00, 0x00}, + {0xC6, 0x00, 0x00}, + {0xC9, 0x00, 0x00}, + {0xCA, 0x00, 0x00}, + {0xCC, 0x00, 0x00}, + {0xCD, 0x00, 0x00}, + {0xD2, 0x00, 0x00}, + {0xD5, 0x00, 0x00}, + {0xD9, 0x00, 0x00}, + {0xDC, 0x00, 0x00}, + {0xE1, 0x00, 0x00}, + {0xE7, 0x00, 0x00}, + {0xEF, 0x00, 0x00}, + {0xF6, 0x00, 0x00}, }, /* 191 */ { - {0x00, 3, 192}, - {0x00, 3, 193}, - {0x00, 3, 200}, - {0x00, 3, 201}, - {0x00, 3, 202}, - {0x00, 3, 205}, - {0x00, 3, 210}, - {0x00, 3, 213}, - {0x00, 3, 218}, - {0x00, 3, 219}, - {0x00, 3, 238}, - {0x00, 3, 240}, - {0x00, 3, 242}, - {0x00, 3, 243}, - {0x00, 3, 255}, - {0xce, 0, 0}, + {0x00, 0x03, 0xC0}, + {0x00, 0x03, 0xC1}, + {0x00, 0x03, 0xC8}, + {0x00, 0x03, 0xC9}, + {0x00, 0x03, 0xCA}, + {0x00, 0x03, 0xCD}, + {0x00, 0x03, 0xD2}, + {0x00, 0x03, 0xD5}, + {0x00, 0x03, 0xDA}, + {0x00, 0x03, 0xDB}, + {0x00, 0x03, 0xEE}, + {0x00, 0x03, 0xF0}, + {0x00, 0x03, 0xF2}, + {0x00, 0x03, 0xF3}, + {0x00, 0x03, 0xFF}, + {0xCE, 0x00, 0x00}, }, /* 192 */ { - {0x01, 2, 192}, - {0x16, 3, 192}, - {0x01, 2, 193}, - {0x16, 3, 193}, - {0x01, 2, 200}, - {0x16, 3, 200}, - {0x01, 2, 201}, - {0x16, 3, 201}, - {0x01, 2, 202}, - {0x16, 3, 202}, - {0x01, 2, 205}, - {0x16, 3, 205}, - {0x01, 2, 210}, - {0x16, 3, 210}, - {0x01, 2, 213}, - {0x16, 3, 213}, + {0x01, 0x02, 0xC0}, + {0x16, 0x03, 0xC0}, + {0x01, 0x02, 0xC1}, + {0x16, 0x03, 0xC1}, + {0x01, 0x02, 0xC8}, + {0x16, 0x03, 0xC8}, + {0x01, 0x02, 0xC9}, + {0x16, 0x03, 0xC9}, + {0x01, 0x02, 0xCA}, + {0x16, 0x03, 0xCA}, + {0x01, 0x02, 0xCD}, + {0x16, 0x03, 0xCD}, + {0x01, 0x02, 0xD2}, + {0x16, 0x03, 0xD2}, + {0x01, 0x02, 0xD5}, + {0x16, 0x03, 0xD5}, }, /* 193 */ { - {0x02, 2, 192}, - {0x09, 2, 192}, - {0x17, 2, 192}, - {0x28, 3, 192}, - {0x02, 2, 193}, - {0x09, 2, 193}, - {0x17, 2, 193}, - {0x28, 3, 193}, - {0x02, 2, 200}, - {0x09, 2, 200}, - {0x17, 2, 200}, - {0x28, 3, 200}, - {0x02, 2, 201}, - {0x09, 2, 201}, - {0x17, 2, 201}, - {0x28, 3, 201}, + {0x02, 0x02, 0xC0}, + {0x09, 0x02, 0xC0}, + {0x17, 0x02, 0xC0}, + {0x28, 0x03, 0xC0}, + {0x02, 0x02, 0xC1}, + {0x09, 0x02, 0xC1}, + {0x17, 0x02, 0xC1}, + {0x28, 0x03, 0xC1}, + {0x02, 0x02, 0xC8}, + {0x09, 0x02, 0xC8}, + {0x17, 0x02, 0xC8}, + {0x28, 0x03, 0xC8}, + {0x02, 0x02, 0xC9}, + {0x09, 0x02, 0xC9}, + {0x17, 0x02, 0xC9}, + {0x28, 0x03, 0xC9}, }, /* 194 */ { - {0x03, 2, 192}, - {0x06, 2, 192}, - {0x0a, 2, 192}, - {0x0f, 2, 192}, - {0x18, 2, 192}, - {0x1f, 2, 192}, - {0x29, 2, 192}, - {0x38, 3, 192}, - {0x03, 2, 193}, - {0x06, 2, 193}, - {0x0a, 2, 193}, - {0x0f, 2, 193}, - {0x18, 2, 193}, - {0x1f, 2, 193}, - {0x29, 2, 193}, - {0x38, 3, 193}, + {0x03, 0x02, 0xC0}, + {0x06, 0x02, 0xC0}, + {0x0A, 0x02, 0xC0}, + {0x0F, 0x02, 0xC0}, + {0x18, 0x02, 0xC0}, + {0x1F, 0x02, 0xC0}, + {0x29, 0x02, 0xC0}, + {0x38, 0x03, 0xC0}, + {0x03, 0x02, 0xC1}, + {0x06, 0x02, 0xC1}, + {0x0A, 0x02, 0xC1}, + {0x0F, 0x02, 0xC1}, + {0x18, 0x02, 0xC1}, + {0x1F, 0x02, 0xC1}, + {0x29, 0x02, 0xC1}, + {0x38, 0x03, 0xC1}, }, /* 195 */ { - {0x03, 2, 200}, - {0x06, 2, 200}, - {0x0a, 2, 200}, - {0x0f, 2, 200}, - {0x18, 2, 200}, - {0x1f, 2, 200}, - {0x29, 2, 200}, - {0x38, 3, 200}, - {0x03, 2, 201}, - {0x06, 2, 201}, - {0x0a, 2, 201}, - {0x0f, 2, 201}, - {0x18, 2, 201}, - {0x1f, 2, 201}, - {0x29, 2, 201}, - {0x38, 3, 201}, + {0x03, 0x02, 0xC8}, + {0x06, 0x02, 0xC8}, + {0x0A, 0x02, 0xC8}, + {0x0F, 0x02, 0xC8}, + {0x18, 0x02, 0xC8}, + {0x1F, 0x02, 0xC8}, + {0x29, 0x02, 0xC8}, + {0x38, 0x03, 0xC8}, + {0x03, 0x02, 0xC9}, + {0x06, 0x02, 0xC9}, + {0x0A, 0x02, 0xC9}, + {0x0F, 0x02, 0xC9}, + {0x18, 0x02, 0xC9}, + {0x1F, 0x02, 0xC9}, + {0x29, 0x02, 0xC9}, + {0x38, 0x03, 0xC9}, }, /* 196 */ { - {0x02, 2, 202}, - {0x09, 2, 202}, - {0x17, 2, 202}, - {0x28, 3, 202}, - {0x02, 2, 205}, - {0x09, 2, 205}, - {0x17, 2, 205}, - {0x28, 3, 205}, - {0x02, 2, 210}, - {0x09, 2, 210}, - {0x17, 2, 210}, - {0x28, 3, 210}, - {0x02, 2, 213}, - {0x09, 2, 213}, - {0x17, 2, 213}, - {0x28, 3, 213}, + {0x02, 0x02, 0xCA}, + {0x09, 0x02, 0xCA}, + {0x17, 0x02, 0xCA}, + {0x28, 0x03, 0xCA}, + {0x02, 0x02, 0xCD}, + {0x09, 0x02, 0xCD}, + {0x17, 0x02, 0xCD}, + {0x28, 0x03, 0xCD}, + {0x02, 0x02, 0xD2}, + {0x09, 0x02, 0xD2}, + {0x17, 0x02, 0xD2}, + {0x28, 0x03, 0xD2}, + {0x02, 0x02, 0xD5}, + {0x09, 0x02, 0xD5}, + {0x17, 0x02, 0xD5}, + {0x28, 0x03, 0xD5}, }, /* 197 */ { - {0x03, 2, 202}, - {0x06, 2, 202}, - {0x0a, 2, 202}, - {0x0f, 2, 202}, - {0x18, 2, 202}, - {0x1f, 2, 202}, - {0x29, 2, 202}, - {0x38, 3, 202}, - {0x03, 2, 205}, - {0x06, 2, 205}, - {0x0a, 2, 205}, - {0x0f, 2, 205}, - {0x18, 2, 205}, - {0x1f, 2, 205}, - {0x29, 2, 205}, - {0x38, 3, 205}, + {0x03, 0x02, 0xCA}, + {0x06, 0x02, 0xCA}, + {0x0A, 0x02, 0xCA}, + {0x0F, 0x02, 0xCA}, + {0x18, 0x02, 0xCA}, + {0x1F, 0x02, 0xCA}, + {0x29, 0x02, 0xCA}, + {0x38, 0x03, 0xCA}, + {0x03, 0x02, 0xCD}, + {0x06, 0x02, 0xCD}, + {0x0A, 0x02, 0xCD}, + {0x0F, 0x02, 0xCD}, + {0x18, 0x02, 0xCD}, + {0x1F, 0x02, 0xCD}, + {0x29, 0x02, 0xCD}, + {0x38, 0x03, 0xCD}, }, /* 198 */ { - {0x03, 2, 210}, - {0x06, 2, 210}, - {0x0a, 2, 210}, - {0x0f, 2, 210}, - {0x18, 2, 210}, - {0x1f, 2, 210}, - {0x29, 2, 210}, - {0x38, 3, 210}, - {0x03, 2, 213}, - {0x06, 2, 213}, - {0x0a, 2, 213}, - {0x0f, 2, 213}, - {0x18, 2, 213}, - {0x1f, 2, 213}, - {0x29, 2, 213}, - {0x38, 3, 213}, + {0x03, 0x02, 0xD2}, + {0x06, 0x02, 0xD2}, + {0x0A, 0x02, 0xD2}, + {0x0F, 0x02, 0xD2}, + {0x18, 0x02, 0xD2}, + {0x1F, 0x02, 0xD2}, + {0x29, 0x02, 0xD2}, + {0x38, 0x03, 0xD2}, + {0x03, 0x02, 0xD5}, + {0x06, 0x02, 0xD5}, + {0x0A, 0x02, 0xD5}, + {0x0F, 0x02, 0xD5}, + {0x18, 0x02, 0xD5}, + {0x1F, 0x02, 0xD5}, + {0x29, 0x02, 0xD5}, + {0x38, 0x03, 0xD5}, }, /* 199 */ { - {0x01, 2, 218}, - {0x16, 3, 218}, - {0x01, 2, 219}, - {0x16, 3, 219}, - {0x01, 2, 238}, - {0x16, 3, 238}, - {0x01, 2, 240}, - {0x16, 3, 240}, - {0x01, 2, 242}, - {0x16, 3, 242}, - {0x01, 2, 243}, - {0x16, 3, 243}, - {0x01, 2, 255}, - {0x16, 3, 255}, - {0x00, 3, 203}, - {0x00, 3, 204}, + {0x01, 0x02, 0xDA}, + {0x16, 0x03, 0xDA}, + {0x01, 0x02, 0xDB}, + {0x16, 0x03, 0xDB}, + {0x01, 0x02, 0xEE}, + {0x16, 0x03, 0xEE}, + {0x01, 0x02, 0xF0}, + {0x16, 0x03, 0xF0}, + {0x01, 0x02, 0xF2}, + {0x16, 0x03, 0xF2}, + {0x01, 0x02, 0xF3}, + {0x16, 0x03, 0xF3}, + {0x01, 0x02, 0xFF}, + {0x16, 0x03, 0xFF}, + {0x00, 0x03, 0xCB}, + {0x00, 0x03, 0xCC}, }, /* 200 */ { - {0x02, 2, 218}, - {0x09, 2, 218}, - {0x17, 2, 218}, - {0x28, 3, 218}, - {0x02, 2, 219}, - {0x09, 2, 219}, - {0x17, 2, 219}, - {0x28, 3, 219}, - {0x02, 2, 238}, - {0x09, 2, 238}, - {0x17, 2, 238}, - {0x28, 3, 238}, - {0x02, 2, 240}, - {0x09, 2, 240}, - {0x17, 2, 240}, - {0x28, 3, 240}, + {0x02, 0x02, 0xDA}, + {0x09, 0x02, 0xDA}, + {0x17, 0x02, 0xDA}, + {0x28, 0x03, 0xDA}, + {0x02, 0x02, 0xDB}, + {0x09, 0x02, 0xDB}, + {0x17, 0x02, 0xDB}, + {0x28, 0x03, 0xDB}, + {0x02, 0x02, 0xEE}, + {0x09, 0x02, 0xEE}, + {0x17, 0x02, 0xEE}, + {0x28, 0x03, 0xEE}, + {0x02, 0x02, 0xF0}, + {0x09, 0x02, 0xF0}, + {0x17, 0x02, 0xF0}, + {0x28, 0x03, 0xF0}, }, /* 201 */ { - {0x03, 2, 218}, - {0x06, 2, 218}, - {0x0a, 2, 218}, - {0x0f, 2, 218}, - {0x18, 2, 218}, - {0x1f, 2, 218}, - {0x29, 2, 218}, - {0x38, 3, 218}, - {0x03, 2, 219}, - {0x06, 2, 219}, - {0x0a, 2, 219}, - {0x0f, 2, 219}, - {0x18, 2, 219}, - {0x1f, 2, 219}, - {0x29, 2, 219}, - {0x38, 3, 219}, + {0x03, 0x02, 0xDA}, + {0x06, 0x02, 0xDA}, + {0x0A, 0x02, 0xDA}, + {0x0F, 0x02, 0xDA}, + {0x18, 0x02, 0xDA}, + {0x1F, 0x02, 0xDA}, + {0x29, 0x02, 0xDA}, + {0x38, 0x03, 0xDA}, + {0x03, 0x02, 0xDB}, + {0x06, 0x02, 0xDB}, + {0x0A, 0x02, 0xDB}, + {0x0F, 0x02, 0xDB}, + {0x18, 0x02, 0xDB}, + {0x1F, 0x02, 0xDB}, + {0x29, 0x02, 0xDB}, + {0x38, 0x03, 0xDB}, }, /* 202 */ { - {0x03, 2, 238}, - {0x06, 2, 238}, - {0x0a, 2, 238}, - {0x0f, 2, 238}, - {0x18, 2, 238}, - {0x1f, 2, 238}, - {0x29, 2, 238}, - {0x38, 3, 238}, - {0x03, 2, 240}, - {0x06, 2, 240}, - {0x0a, 2, 240}, - {0x0f, 2, 240}, - {0x18, 2, 240}, - {0x1f, 2, 240}, - {0x29, 2, 240}, - {0x38, 3, 240}, + {0x03, 0x02, 0xEE}, + {0x06, 0x02, 0xEE}, + {0x0A, 0x02, 0xEE}, + {0x0F, 0x02, 0xEE}, + {0x18, 0x02, 0xEE}, + {0x1F, 0x02, 0xEE}, + {0x29, 0x02, 0xEE}, + {0x38, 0x03, 0xEE}, + {0x03, 0x02, 0xF0}, + {0x06, 0x02, 0xF0}, + {0x0A, 0x02, 0xF0}, + {0x0F, 0x02, 0xF0}, + {0x18, 0x02, 0xF0}, + {0x1F, 0x02, 0xF0}, + {0x29, 0x02, 0xF0}, + {0x38, 0x03, 0xF0}, }, /* 203 */ { - {0x02, 2, 242}, - {0x09, 2, 242}, - {0x17, 2, 242}, - {0x28, 3, 242}, - {0x02, 2, 243}, - {0x09, 2, 243}, - {0x17, 2, 243}, - {0x28, 3, 243}, - {0x02, 2, 255}, - {0x09, 2, 255}, - {0x17, 2, 255}, - {0x28, 3, 255}, - {0x01, 2, 203}, - {0x16, 3, 203}, - {0x01, 2, 204}, - {0x16, 3, 204}, + {0x02, 0x02, 0xF2}, + {0x09, 0x02, 0xF2}, + {0x17, 0x02, 0xF2}, + {0x28, 0x03, 0xF2}, + {0x02, 0x02, 0xF3}, + {0x09, 0x02, 0xF3}, + {0x17, 0x02, 0xF3}, + {0x28, 0x03, 0xF3}, + {0x02, 0x02, 0xFF}, + {0x09, 0x02, 0xFF}, + {0x17, 0x02, 0xFF}, + {0x28, 0x03, 0xFF}, + {0x01, 0x02, 0xCB}, + {0x16, 0x03, 0xCB}, + {0x01, 0x02, 0xCC}, + {0x16, 0x03, 0xCC}, }, /* 204 */ { - {0x03, 2, 242}, - {0x06, 2, 242}, - {0x0a, 2, 242}, - {0x0f, 2, 242}, - {0x18, 2, 242}, - {0x1f, 2, 242}, - {0x29, 2, 242}, - {0x38, 3, 242}, - {0x03, 2, 243}, - {0x06, 2, 243}, - {0x0a, 2, 243}, - {0x0f, 2, 243}, - {0x18, 2, 243}, - {0x1f, 2, 243}, - {0x29, 2, 243}, - {0x38, 3, 243}, + {0x03, 0x02, 0xF2}, + {0x06, 0x02, 0xF2}, + {0x0A, 0x02, 0xF2}, + {0x0F, 0x02, 0xF2}, + {0x18, 0x02, 0xF2}, + {0x1F, 0x02, 0xF2}, + {0x29, 0x02, 0xF2}, + {0x38, 0x03, 0xF2}, + {0x03, 0x02, 0xF3}, + {0x06, 0x02, 0xF3}, + {0x0A, 0x02, 0xF3}, + {0x0F, 0x02, 0xF3}, + {0x18, 0x02, 0xF3}, + {0x1F, 0x02, 0xF3}, + {0x29, 0x02, 0xF3}, + {0x38, 0x03, 0xF3}, }, /* 205 */ { - {0x03, 2, 255}, - {0x06, 2, 255}, - {0x0a, 2, 255}, - {0x0f, 2, 255}, - {0x18, 2, 255}, - {0x1f, 2, 255}, - {0x29, 2, 255}, - {0x38, 3, 255}, - {0x02, 2, 203}, - {0x09, 2, 203}, - {0x17, 2, 203}, - {0x28, 3, 203}, - {0x02, 2, 204}, - {0x09, 2, 204}, - {0x17, 2, 204}, - {0x28, 3, 204}, + {0x03, 0x02, 0xFF}, + {0x06, 0x02, 0xFF}, + {0x0A, 0x02, 0xFF}, + {0x0F, 0x02, 0xFF}, + {0x18, 0x02, 0xFF}, + {0x1F, 0x02, 0xFF}, + {0x29, 0x02, 0xFF}, + {0x38, 0x03, 0xFF}, + {0x02, 0x02, 0xCB}, + {0x09, 0x02, 0xCB}, + {0x17, 0x02, 0xCB}, + {0x28, 0x03, 0xCB}, + {0x02, 0x02, 0xCC}, + {0x09, 0x02, 0xCC}, + {0x17, 0x02, 0xCC}, + {0x28, 0x03, 0xCC}, }, /* 206 */ { - {0x03, 2, 203}, - {0x06, 2, 203}, - {0x0a, 2, 203}, - {0x0f, 2, 203}, - {0x18, 2, 203}, - {0x1f, 2, 203}, - {0x29, 2, 203}, - {0x38, 3, 203}, - {0x03, 2, 204}, - {0x06, 2, 204}, - {0x0a, 2, 204}, - {0x0f, 2, 204}, - {0x18, 2, 204}, - {0x1f, 2, 204}, - {0x29, 2, 204}, - {0x38, 3, 204}, + {0x03, 0x02, 0xCB}, + {0x06, 0x02, 0xCB}, + {0x0A, 0x02, 0xCB}, + {0x0F, 0x02, 0xCB}, + {0x18, 0x02, 0xCB}, + {0x1F, 0x02, 0xCB}, + {0x29, 0x02, 0xCB}, + {0x38, 0x03, 0xCB}, + {0x03, 0x02, 0xCC}, + {0x06, 0x02, 0xCC}, + {0x0A, 0x02, 0xCC}, + {0x0F, 0x02, 0xCC}, + {0x18, 0x02, 0xCC}, + {0x1F, 0x02, 0xCC}, + {0x29, 0x02, 0xCC}, + {0x38, 0x03, 0xCC}, }, /* 207 */ { - {0xd3, 0, 0}, - {0xd4, 0, 0}, - {0xd6, 0, 0}, - {0xd7, 0, 0}, - {0xda, 0, 0}, - {0xdb, 0, 0}, - {0xdd, 0, 0}, - {0xde, 0, 0}, - {0xe2, 0, 0}, - {0xe4, 0, 0}, - {0xe8, 0, 0}, - {0xeb, 0, 0}, - {0xf0, 0, 0}, - {0xf3, 0, 0}, - {0xf7, 0, 0}, - {0xfa, 0, 0}, + {0xD3, 0x00, 0x00}, + {0xD4, 0x00, 0x00}, + {0xD6, 0x00, 0x00}, + {0xD7, 0x00, 0x00}, + {0xDA, 0x00, 0x00}, + {0xDB, 0x00, 0x00}, + {0xDD, 0x00, 0x00}, + {0xDE, 0x00, 0x00}, + {0xE2, 0x00, 0x00}, + {0xE4, 0x00, 0x00}, + {0xE8, 0x00, 0x00}, + {0xEB, 0x00, 0x00}, + {0xF0, 0x00, 0x00}, + {0xF3, 0x00, 0x00}, + {0xF7, 0x00, 0x00}, + {0xFA, 0x00, 0x00}, }, /* 208 */ { - {0x00, 3, 211}, - {0x00, 3, 212}, - {0x00, 3, 214}, - {0x00, 3, 221}, - {0x00, 3, 222}, - {0x00, 3, 223}, - {0x00, 3, 241}, - {0x00, 3, 244}, - {0x00, 3, 245}, - {0x00, 3, 246}, - {0x00, 3, 247}, - {0x00, 3, 248}, - {0x00, 3, 250}, - {0x00, 3, 251}, - {0x00, 3, 252}, - {0x00, 3, 253}, + {0x00, 0x03, 0xD3}, + {0x00, 0x03, 0xD4}, + {0x00, 0x03, 0xD6}, + {0x00, 0x03, 0xDD}, + {0x00, 0x03, 0xDE}, + {0x00, 0x03, 0xDF}, + {0x00, 0x03, 0xF1}, + {0x00, 0x03, 0xF4}, + {0x00, 0x03, 0xF5}, + {0x00, 0x03, 0xF6}, + {0x00, 0x03, 0xF7}, + {0x00, 0x03, 0xF8}, + {0x00, 0x03, 0xFA}, + {0x00, 0x03, 0xFB}, + {0x00, 0x03, 0xFC}, + {0x00, 0x03, 0xFD}, }, /* 209 */ { - {0x01, 2, 211}, - {0x16, 3, 211}, - {0x01, 2, 212}, - {0x16, 3, 212}, - {0x01, 2, 214}, - {0x16, 3, 214}, - {0x01, 2, 221}, - {0x16, 3, 221}, - {0x01, 2, 222}, - {0x16, 3, 222}, - {0x01, 2, 223}, - {0x16, 3, 223}, - {0x01, 2, 241}, - {0x16, 3, 241}, - {0x01, 2, 244}, - {0x16, 3, 244}, + {0x01, 0x02, 0xD3}, + {0x16, 0x03, 0xD3}, + {0x01, 0x02, 0xD4}, + {0x16, 0x03, 0xD4}, + {0x01, 0x02, 0xD6}, + {0x16, 0x03, 0xD6}, + {0x01, 0x02, 0xDD}, + {0x16, 0x03, 0xDD}, + {0x01, 0x02, 0xDE}, + {0x16, 0x03, 0xDE}, + {0x01, 0x02, 0xDF}, + {0x16, 0x03, 0xDF}, + {0x01, 0x02, 0xF1}, + {0x16, 0x03, 0xF1}, + {0x01, 0x02, 0xF4}, + {0x16, 0x03, 0xF4}, }, /* 210 */ { - {0x02, 2, 211}, - {0x09, 2, 211}, - {0x17, 2, 211}, - {0x28, 3, 211}, - {0x02, 2, 212}, - {0x09, 2, 212}, - {0x17, 2, 212}, - {0x28, 3, 212}, - {0x02, 2, 214}, - {0x09, 2, 214}, - {0x17, 2, 214}, - {0x28, 3, 214}, - {0x02, 2, 221}, - {0x09, 2, 221}, - {0x17, 2, 221}, - {0x28, 3, 221}, + {0x02, 0x02, 0xD3}, + {0x09, 0x02, 0xD3}, + {0x17, 0x02, 0xD3}, + {0x28, 0x03, 0xD3}, + {0x02, 0x02, 0xD4}, + {0x09, 0x02, 0xD4}, + {0x17, 0x02, 0xD4}, + {0x28, 0x03, 0xD4}, + {0x02, 0x02, 0xD6}, + {0x09, 0x02, 0xD6}, + {0x17, 0x02, 0xD6}, + {0x28, 0x03, 0xD6}, + {0x02, 0x02, 0xDD}, + {0x09, 0x02, 0xDD}, + {0x17, 0x02, 0xDD}, + {0x28, 0x03, 0xDD}, }, /* 211 */ { - {0x03, 2, 211}, - {0x06, 2, 211}, - {0x0a, 2, 211}, - {0x0f, 2, 211}, - {0x18, 2, 211}, - {0x1f, 2, 211}, - {0x29, 2, 211}, - {0x38, 3, 211}, - {0x03, 2, 212}, - {0x06, 2, 212}, - {0x0a, 2, 212}, - {0x0f, 2, 212}, - {0x18, 2, 212}, - {0x1f, 2, 212}, - {0x29, 2, 212}, - {0x38, 3, 212}, + {0x03, 0x02, 0xD3}, + {0x06, 0x02, 0xD3}, + {0x0A, 0x02, 0xD3}, + {0x0F, 0x02, 0xD3}, + {0x18, 0x02, 0xD3}, + {0x1F, 0x02, 0xD3}, + {0x29, 0x02, 0xD3}, + {0x38, 0x03, 0xD3}, + {0x03, 0x02, 0xD4}, + {0x06, 0x02, 0xD4}, + {0x0A, 0x02, 0xD4}, + {0x0F, 0x02, 0xD4}, + {0x18, 0x02, 0xD4}, + {0x1F, 0x02, 0xD4}, + {0x29, 0x02, 0xD4}, + {0x38, 0x03, 0xD4}, }, /* 212 */ { - {0x03, 2, 214}, - {0x06, 2, 214}, - {0x0a, 2, 214}, - {0x0f, 2, 214}, - {0x18, 2, 214}, - {0x1f, 2, 214}, - {0x29, 2, 214}, - {0x38, 3, 214}, - {0x03, 2, 221}, - {0x06, 2, 221}, - {0x0a, 2, 221}, - {0x0f, 2, 221}, - {0x18, 2, 221}, - {0x1f, 2, 221}, - {0x29, 2, 221}, - {0x38, 3, 221}, + {0x03, 0x02, 0xD6}, + {0x06, 0x02, 0xD6}, + {0x0A, 0x02, 0xD6}, + {0x0F, 0x02, 0xD6}, + {0x18, 0x02, 0xD6}, + {0x1F, 0x02, 0xD6}, + {0x29, 0x02, 0xD6}, + {0x38, 0x03, 0xD6}, + {0x03, 0x02, 0xDD}, + {0x06, 0x02, 0xDD}, + {0x0A, 0x02, 0xDD}, + {0x0F, 0x02, 0xDD}, + {0x18, 0x02, 0xDD}, + {0x1F, 0x02, 0xDD}, + {0x29, 0x02, 0xDD}, + {0x38, 0x03, 0xDD}, }, /* 213 */ { - {0x02, 2, 222}, - {0x09, 2, 222}, - {0x17, 2, 222}, - {0x28, 3, 222}, - {0x02, 2, 223}, - {0x09, 2, 223}, - {0x17, 2, 223}, - {0x28, 3, 223}, - {0x02, 2, 241}, - {0x09, 2, 241}, - {0x17, 2, 241}, - {0x28, 3, 241}, - {0x02, 2, 244}, - {0x09, 2, 244}, - {0x17, 2, 244}, - {0x28, 3, 244}, + {0x02, 0x02, 0xDE}, + {0x09, 0x02, 0xDE}, + {0x17, 0x02, 0xDE}, + {0x28, 0x03, 0xDE}, + {0x02, 0x02, 0xDF}, + {0x09, 0x02, 0xDF}, + {0x17, 0x02, 0xDF}, + {0x28, 0x03, 0xDF}, + {0x02, 0x02, 0xF1}, + {0x09, 0x02, 0xF1}, + {0x17, 0x02, 0xF1}, + {0x28, 0x03, 0xF1}, + {0x02, 0x02, 0xF4}, + {0x09, 0x02, 0xF4}, + {0x17, 0x02, 0xF4}, + {0x28, 0x03, 0xF4}, }, /* 214 */ { - {0x03, 2, 222}, - {0x06, 2, 222}, - {0x0a, 2, 222}, - {0x0f, 2, 222}, - {0x18, 2, 222}, - {0x1f, 2, 222}, - {0x29, 2, 222}, - {0x38, 3, 222}, - {0x03, 2, 223}, - {0x06, 2, 223}, - {0x0a, 2, 223}, - {0x0f, 2, 223}, - {0x18, 2, 223}, - {0x1f, 2, 223}, - {0x29, 2, 223}, - {0x38, 3, 223}, + {0x03, 0x02, 0xDE}, + {0x06, 0x02, 0xDE}, + {0x0A, 0x02, 0xDE}, + {0x0F, 0x02, 0xDE}, + {0x18, 0x02, 0xDE}, + {0x1F, 0x02, 0xDE}, + {0x29, 0x02, 0xDE}, + {0x38, 0x03, 0xDE}, + {0x03, 0x02, 0xDF}, + {0x06, 0x02, 0xDF}, + {0x0A, 0x02, 0xDF}, + {0x0F, 0x02, 0xDF}, + {0x18, 0x02, 0xDF}, + {0x1F, 0x02, 0xDF}, + {0x29, 0x02, 0xDF}, + {0x38, 0x03, 0xDF}, }, /* 215 */ { - {0x03, 2, 241}, - {0x06, 2, 241}, - {0x0a, 2, 241}, - {0x0f, 2, 241}, - {0x18, 2, 241}, - {0x1f, 2, 241}, - {0x29, 2, 241}, - {0x38, 3, 241}, - {0x03, 2, 244}, - {0x06, 2, 244}, - {0x0a, 2, 244}, - {0x0f, 2, 244}, - {0x18, 2, 244}, - {0x1f, 2, 244}, - {0x29, 2, 244}, - {0x38, 3, 244}, + {0x03, 0x02, 0xF1}, + {0x06, 0x02, 0xF1}, + {0x0A, 0x02, 0xF1}, + {0x0F, 0x02, 0xF1}, + {0x18, 0x02, 0xF1}, + {0x1F, 0x02, 0xF1}, + {0x29, 0x02, 0xF1}, + {0x38, 0x03, 0xF1}, + {0x03, 0x02, 0xF4}, + {0x06, 0x02, 0xF4}, + {0x0A, 0x02, 0xF4}, + {0x0F, 0x02, 0xF4}, + {0x18, 0x02, 0xF4}, + {0x1F, 0x02, 0xF4}, + {0x29, 0x02, 0xF4}, + {0x38, 0x03, 0xF4}, }, /* 216 */ { - {0x01, 2, 245}, - {0x16, 3, 245}, - {0x01, 2, 246}, - {0x16, 3, 246}, - {0x01, 2, 247}, - {0x16, 3, 247}, - {0x01, 2, 248}, - {0x16, 3, 248}, - {0x01, 2, 250}, - {0x16, 3, 250}, - {0x01, 2, 251}, - {0x16, 3, 251}, - {0x01, 2, 252}, - {0x16, 3, 252}, - {0x01, 2, 253}, - {0x16, 3, 253}, + {0x01, 0x02, 0xF5}, + {0x16, 0x03, 0xF5}, + {0x01, 0x02, 0xF6}, + {0x16, 0x03, 0xF6}, + {0x01, 0x02, 0xF7}, + {0x16, 0x03, 0xF7}, + {0x01, 0x02, 0xF8}, + {0x16, 0x03, 0xF8}, + {0x01, 0x02, 0xFA}, + {0x16, 0x03, 0xFA}, + {0x01, 0x02, 0xFB}, + {0x16, 0x03, 0xFB}, + {0x01, 0x02, 0xFC}, + {0x16, 0x03, 0xFC}, + {0x01, 0x02, 0xFD}, + {0x16, 0x03, 0xFD}, }, /* 217 */ { - {0x02, 2, 245}, - {0x09, 2, 245}, - {0x17, 2, 245}, - {0x28, 3, 245}, - {0x02, 2, 246}, - {0x09, 2, 246}, - {0x17, 2, 246}, - {0x28, 3, 246}, - {0x02, 2, 247}, - {0x09, 2, 247}, - {0x17, 2, 247}, - {0x28, 3, 247}, - {0x02, 2, 248}, - {0x09, 2, 248}, - {0x17, 2, 248}, - {0x28, 3, 248}, + {0x02, 0x02, 0xF5}, + {0x09, 0x02, 0xF5}, + {0x17, 0x02, 0xF5}, + {0x28, 0x03, 0xF5}, + {0x02, 0x02, 0xF6}, + {0x09, 0x02, 0xF6}, + {0x17, 0x02, 0xF6}, + {0x28, 0x03, 0xF6}, + {0x02, 0x02, 0xF7}, + {0x09, 0x02, 0xF7}, + {0x17, 0x02, 0xF7}, + {0x28, 0x03, 0xF7}, + {0x02, 0x02, 0xF8}, + {0x09, 0x02, 0xF8}, + {0x17, 0x02, 0xF8}, + {0x28, 0x03, 0xF8}, }, /* 218 */ { - {0x03, 2, 245}, - {0x06, 2, 245}, - {0x0a, 2, 245}, - {0x0f, 2, 245}, - {0x18, 2, 245}, - {0x1f, 2, 245}, - {0x29, 2, 245}, - {0x38, 3, 245}, - {0x03, 2, 246}, - {0x06, 2, 246}, - {0x0a, 2, 246}, - {0x0f, 2, 246}, - {0x18, 2, 246}, - {0x1f, 2, 246}, - {0x29, 2, 246}, - {0x38, 3, 246}, + {0x03, 0x02, 0xF5}, + {0x06, 0x02, 0xF5}, + {0x0A, 0x02, 0xF5}, + {0x0F, 0x02, 0xF5}, + {0x18, 0x02, 0xF5}, + {0x1F, 0x02, 0xF5}, + {0x29, 0x02, 0xF5}, + {0x38, 0x03, 0xF5}, + {0x03, 0x02, 0xF6}, + {0x06, 0x02, 0xF6}, + {0x0A, 0x02, 0xF6}, + {0x0F, 0x02, 0xF6}, + {0x18, 0x02, 0xF6}, + {0x1F, 0x02, 0xF6}, + {0x29, 0x02, 0xF6}, + {0x38, 0x03, 0xF6}, }, /* 219 */ { - {0x03, 2, 247}, - {0x06, 2, 247}, - {0x0a, 2, 247}, - {0x0f, 2, 247}, - {0x18, 2, 247}, - {0x1f, 2, 247}, - {0x29, 2, 247}, - {0x38, 3, 247}, - {0x03, 2, 248}, - {0x06, 2, 248}, - {0x0a, 2, 248}, - {0x0f, 2, 248}, - {0x18, 2, 248}, - {0x1f, 2, 248}, - {0x29, 2, 248}, - {0x38, 3, 248}, + {0x03, 0x02, 0xF7}, + {0x06, 0x02, 0xF7}, + {0x0A, 0x02, 0xF7}, + {0x0F, 0x02, 0xF7}, + {0x18, 0x02, 0xF7}, + {0x1F, 0x02, 0xF7}, + {0x29, 0x02, 0xF7}, + {0x38, 0x03, 0xF7}, + {0x03, 0x02, 0xF8}, + {0x06, 0x02, 0xF8}, + {0x0A, 0x02, 0xF8}, + {0x0F, 0x02, 0xF8}, + {0x18, 0x02, 0xF8}, + {0x1F, 0x02, 0xF8}, + {0x29, 0x02, 0xF8}, + {0x38, 0x03, 0xF8}, }, /* 220 */ { - {0x02, 2, 250}, - {0x09, 2, 250}, - {0x17, 2, 250}, - {0x28, 3, 250}, - {0x02, 2, 251}, - {0x09, 2, 251}, - {0x17, 2, 251}, - {0x28, 3, 251}, - {0x02, 2, 252}, - {0x09, 2, 252}, - {0x17, 2, 252}, - {0x28, 3, 252}, - {0x02, 2, 253}, - {0x09, 2, 253}, - {0x17, 2, 253}, - {0x28, 3, 253}, + {0x02, 0x02, 0xFA}, + {0x09, 0x02, 0xFA}, + {0x17, 0x02, 0xFA}, + {0x28, 0x03, 0xFA}, + {0x02, 0x02, 0xFB}, + {0x09, 0x02, 0xFB}, + {0x17, 0x02, 0xFB}, + {0x28, 0x03, 0xFB}, + {0x02, 0x02, 0xFC}, + {0x09, 0x02, 0xFC}, + {0x17, 0x02, 0xFC}, + {0x28, 0x03, 0xFC}, + {0x02, 0x02, 0xFD}, + {0x09, 0x02, 0xFD}, + {0x17, 0x02, 0xFD}, + {0x28, 0x03, 0xFD}, }, /* 221 */ { - {0x03, 2, 250}, - {0x06, 2, 250}, - {0x0a, 2, 250}, - {0x0f, 2, 250}, - {0x18, 2, 250}, - {0x1f, 2, 250}, - {0x29, 2, 250}, - {0x38, 3, 250}, - {0x03, 2, 251}, - {0x06, 2, 251}, - {0x0a, 2, 251}, - {0x0f, 2, 251}, - {0x18, 2, 251}, - {0x1f, 2, 251}, - {0x29, 2, 251}, - {0x38, 3, 251}, + {0x03, 0x02, 0xFA}, + {0x06, 0x02, 0xFA}, + {0x0A, 0x02, 0xFA}, + {0x0F, 0x02, 0xFA}, + {0x18, 0x02, 0xFA}, + {0x1F, 0x02, 0xFA}, + {0x29, 0x02, 0xFA}, + {0x38, 0x03, 0xFA}, + {0x03, 0x02, 0xFB}, + {0x06, 0x02, 0xFB}, + {0x0A, 0x02, 0xFB}, + {0x0F, 0x02, 0xFB}, + {0x18, 0x02, 0xFB}, + {0x1F, 0x02, 0xFB}, + {0x29, 0x02, 0xFB}, + {0x38, 0x03, 0xFB}, }, /* 222 */ { - {0x03, 2, 252}, - {0x06, 2, 252}, - {0x0a, 2, 252}, - {0x0f, 2, 252}, - {0x18, 2, 252}, - {0x1f, 2, 252}, - {0x29, 2, 252}, - {0x38, 3, 252}, - {0x03, 2, 253}, - {0x06, 2, 253}, - {0x0a, 2, 253}, - {0x0f, 2, 253}, - {0x18, 2, 253}, - {0x1f, 2, 253}, - {0x29, 2, 253}, - {0x38, 3, 253}, + {0x03, 0x02, 0xFC}, + {0x06, 0x02, 0xFC}, + {0x0A, 0x02, 0xFC}, + {0x0F, 0x02, 0xFC}, + {0x18, 0x02, 0xFC}, + {0x1F, 0x02, 0xFC}, + {0x29, 0x02, 0xFC}, + {0x38, 0x03, 0xFC}, + {0x03, 0x02, 0xFD}, + {0x06, 0x02, 0xFD}, + {0x0A, 0x02, 0xFD}, + {0x0F, 0x02, 0xFD}, + {0x18, 0x02, 0xFD}, + {0x1F, 0x02, 0xFD}, + {0x29, 0x02, 0xFD}, + {0x38, 0x03, 0xFD}, }, /* 223 */ { - {0x00, 3, 254}, - {0xe3, 0, 0}, - {0xe5, 0, 0}, - {0xe6, 0, 0}, - {0xe9, 0, 0}, - {0xea, 0, 0}, - {0xec, 0, 0}, - {0xed, 0, 0}, - {0xf1, 0, 0}, - {0xf2, 0, 0}, - {0xf4, 0, 0}, - {0xf5, 0, 0}, - {0xf8, 0, 0}, - {0xf9, 0, 0}, - {0xfb, 0, 0}, - {0xfc, 0, 0}, + {0x00, 0x03, 0xFE}, + {0xE3, 0x00, 0x00}, + {0xE5, 0x00, 0x00}, + {0xE6, 0x00, 0x00}, + {0xE9, 0x00, 0x00}, + {0xEA, 0x00, 0x00}, + {0xEC, 0x00, 0x00}, + {0xED, 0x00, 0x00}, + {0xF1, 0x00, 0x00}, + {0xF2, 0x00, 0x00}, + {0xF4, 0x00, 0x00}, + {0xF5, 0x00, 0x00}, + {0xF8, 0x00, 0x00}, + {0xF9, 0x00, 0x00}, + {0xFB, 0x00, 0x00}, + {0xFC, 0x00, 0x00}, }, /* 224 */ { - {0x01, 2, 254}, - {0x16, 3, 254}, - {0x00, 3, 2}, - {0x00, 3, 3}, - {0x00, 3, 4}, - {0x00, 3, 5}, - {0x00, 3, 6}, - {0x00, 3, 7}, - {0x00, 3, 8}, - {0x00, 3, 11}, - {0x00, 3, 12}, - {0x00, 3, 14}, - {0x00, 3, 15}, - {0x00, 3, 16}, - {0x00, 3, 17}, - {0x00, 3, 18}, + {0x01, 0x02, 0xFE}, + {0x16, 0x03, 0xFE}, + {0x00, 0x03, 0x02}, + {0x00, 0x03, 0x03}, + {0x00, 0x03, 0x04}, + {0x00, 0x03, 0x05}, + {0x00, 0x03, 0x06}, + {0x00, 0x03, 0x07}, + {0x00, 0x03, 0x08}, + {0x00, 0x03, 0x0B}, + {0x00, 0x03, 0x0C}, + {0x00, 0x03, 0x0E}, + {0x00, 0x03, 0x0F}, + {0x00, 0x03, 0x10}, + {0x00, 0x03, 0x11}, + {0x00, 0x03, 0x12}, }, /* 225 */ { - {0x02, 2, 254}, - {0x09, 2, 254}, - {0x17, 2, 254}, - {0x28, 3, 254}, - {0x01, 2, 2}, - {0x16, 3, 2}, - {0x01, 2, 3}, - {0x16, 3, 3}, - {0x01, 2, 4}, - {0x16, 3, 4}, - {0x01, 2, 5}, - {0x16, 3, 5}, - {0x01, 2, 6}, - {0x16, 3, 6}, - {0x01, 2, 7}, - {0x16, 3, 7}, + {0x02, 0x02, 0xFE}, + {0x09, 0x02, 0xFE}, + {0x17, 0x02, 0xFE}, + {0x28, 0x03, 0xFE}, + {0x01, 0x02, 0x02}, + {0x16, 0x03, 0x02}, + {0x01, 0x02, 0x03}, + {0x16, 0x03, 0x03}, + {0x01, 0x02, 0x04}, + {0x16, 0x03, 0x04}, + {0x01, 0x02, 0x05}, + {0x16, 0x03, 0x05}, + {0x01, 0x02, 0x06}, + {0x16, 0x03, 0x06}, + {0x01, 0x02, 0x07}, + {0x16, 0x03, 0x07}, }, /* 226 */ { - {0x03, 2, 254}, - {0x06, 2, 254}, - {0x0a, 2, 254}, - {0x0f, 2, 254}, - {0x18, 2, 254}, - {0x1f, 2, 254}, - {0x29, 2, 254}, - {0x38, 3, 254}, - {0x02, 2, 2}, - {0x09, 2, 2}, - {0x17, 2, 2}, - {0x28, 3, 2}, - {0x02, 2, 3}, - {0x09, 2, 3}, - {0x17, 2, 3}, - {0x28, 3, 3}, + {0x03, 0x02, 0xFE}, + {0x06, 0x02, 0xFE}, + {0x0A, 0x02, 0xFE}, + {0x0F, 0x02, 0xFE}, + {0x18, 0x02, 0xFE}, + {0x1F, 0x02, 0xFE}, + {0x29, 0x02, 0xFE}, + {0x38, 0x03, 0xFE}, + {0x02, 0x02, 0x02}, + {0x09, 0x02, 0x02}, + {0x17, 0x02, 0x02}, + {0x28, 0x03, 0x02}, + {0x02, 0x02, 0x03}, + {0x09, 0x02, 0x03}, + {0x17, 0x02, 0x03}, + {0x28, 0x03, 0x03}, }, /* 227 */ { - {0x03, 2, 2}, - {0x06, 2, 2}, - {0x0a, 2, 2}, - {0x0f, 2, 2}, - {0x18, 2, 2}, - {0x1f, 2, 2}, - {0x29, 2, 2}, - {0x38, 3, 2}, - {0x03, 2, 3}, - {0x06, 2, 3}, - {0x0a, 2, 3}, - {0x0f, 2, 3}, - {0x18, 2, 3}, - {0x1f, 2, 3}, - {0x29, 2, 3}, - {0x38, 3, 3}, + {0x03, 0x02, 0x02}, + {0x06, 0x02, 0x02}, + {0x0A, 0x02, 0x02}, + {0x0F, 0x02, 0x02}, + {0x18, 0x02, 0x02}, + {0x1F, 0x02, 0x02}, + {0x29, 0x02, 0x02}, + {0x38, 0x03, 0x02}, + {0x03, 0x02, 0x03}, + {0x06, 0x02, 0x03}, + {0x0A, 0x02, 0x03}, + {0x0F, 0x02, 0x03}, + {0x18, 0x02, 0x03}, + {0x1F, 0x02, 0x03}, + {0x29, 0x02, 0x03}, + {0x38, 0x03, 0x03}, }, /* 228 */ { - {0x02, 2, 4}, - {0x09, 2, 4}, - {0x17, 2, 4}, - {0x28, 3, 4}, - {0x02, 2, 5}, - {0x09, 2, 5}, - {0x17, 2, 5}, - {0x28, 3, 5}, - {0x02, 2, 6}, - {0x09, 2, 6}, - {0x17, 2, 6}, - {0x28, 3, 6}, - {0x02, 2, 7}, - {0x09, 2, 7}, - {0x17, 2, 7}, - {0x28, 3, 7}, + {0x02, 0x02, 0x04}, + {0x09, 0x02, 0x04}, + {0x17, 0x02, 0x04}, + {0x28, 0x03, 0x04}, + {0x02, 0x02, 0x05}, + {0x09, 0x02, 0x05}, + {0x17, 0x02, 0x05}, + {0x28, 0x03, 0x05}, + {0x02, 0x02, 0x06}, + {0x09, 0x02, 0x06}, + {0x17, 0x02, 0x06}, + {0x28, 0x03, 0x06}, + {0x02, 0x02, 0x07}, + {0x09, 0x02, 0x07}, + {0x17, 0x02, 0x07}, + {0x28, 0x03, 0x07}, }, /* 229 */ { - {0x03, 2, 4}, - {0x06, 2, 4}, - {0x0a, 2, 4}, - {0x0f, 2, 4}, - {0x18, 2, 4}, - {0x1f, 2, 4}, - {0x29, 2, 4}, - {0x38, 3, 4}, - {0x03, 2, 5}, - {0x06, 2, 5}, - {0x0a, 2, 5}, - {0x0f, 2, 5}, - {0x18, 2, 5}, - {0x1f, 2, 5}, - {0x29, 2, 5}, - {0x38, 3, 5}, + {0x03, 0x02, 0x04}, + {0x06, 0x02, 0x04}, + {0x0A, 0x02, 0x04}, + {0x0F, 0x02, 0x04}, + {0x18, 0x02, 0x04}, + {0x1F, 0x02, 0x04}, + {0x29, 0x02, 0x04}, + {0x38, 0x03, 0x04}, + {0x03, 0x02, 0x05}, + {0x06, 0x02, 0x05}, + {0x0A, 0x02, 0x05}, + {0x0F, 0x02, 0x05}, + {0x18, 0x02, 0x05}, + {0x1F, 0x02, 0x05}, + {0x29, 0x02, 0x05}, + {0x38, 0x03, 0x05}, }, /* 230 */ { - {0x03, 2, 6}, - {0x06, 2, 6}, - {0x0a, 2, 6}, - {0x0f, 2, 6}, - {0x18, 2, 6}, - {0x1f, 2, 6}, - {0x29, 2, 6}, - {0x38, 3, 6}, - {0x03, 2, 7}, - {0x06, 2, 7}, - {0x0a, 2, 7}, - {0x0f, 2, 7}, - {0x18, 2, 7}, - {0x1f, 2, 7}, - {0x29, 2, 7}, - {0x38, 3, 7}, + {0x03, 0x02, 0x06}, + {0x06, 0x02, 0x06}, + {0x0A, 0x02, 0x06}, + {0x0F, 0x02, 0x06}, + {0x18, 0x02, 0x06}, + {0x1F, 0x02, 0x06}, + {0x29, 0x02, 0x06}, + {0x38, 0x03, 0x06}, + {0x03, 0x02, 0x07}, + {0x06, 0x02, 0x07}, + {0x0A, 0x02, 0x07}, + {0x0F, 0x02, 0x07}, + {0x18, 0x02, 0x07}, + {0x1F, 0x02, 0x07}, + {0x29, 0x02, 0x07}, + {0x38, 0x03, 0x07}, }, /* 231 */ { - {0x01, 2, 8}, - {0x16, 3, 8}, - {0x01, 2, 11}, - {0x16, 3, 11}, - {0x01, 2, 12}, - {0x16, 3, 12}, - {0x01, 2, 14}, - {0x16, 3, 14}, - {0x01, 2, 15}, - {0x16, 3, 15}, - {0x01, 2, 16}, - {0x16, 3, 16}, - {0x01, 2, 17}, - {0x16, 3, 17}, - {0x01, 2, 18}, - {0x16, 3, 18}, + {0x01, 0x02, 0x08}, + {0x16, 0x03, 0x08}, + {0x01, 0x02, 0x0B}, + {0x16, 0x03, 0x0B}, + {0x01, 0x02, 0x0C}, + {0x16, 0x03, 0x0C}, + {0x01, 0x02, 0x0E}, + {0x16, 0x03, 0x0E}, + {0x01, 0x02, 0x0F}, + {0x16, 0x03, 0x0F}, + {0x01, 0x02, 0x10}, + {0x16, 0x03, 0x10}, + {0x01, 0x02, 0x11}, + {0x16, 0x03, 0x11}, + {0x01, 0x02, 0x12}, + {0x16, 0x03, 0x12}, }, /* 232 */ { - {0x02, 2, 8}, - {0x09, 2, 8}, - {0x17, 2, 8}, - {0x28, 3, 8}, - {0x02, 2, 11}, - {0x09, 2, 11}, - {0x17, 2, 11}, - {0x28, 3, 11}, - {0x02, 2, 12}, - {0x09, 2, 12}, - {0x17, 2, 12}, - {0x28, 3, 12}, - {0x02, 2, 14}, - {0x09, 2, 14}, - {0x17, 2, 14}, - {0x28, 3, 14}, + {0x02, 0x02, 0x08}, + {0x09, 0x02, 0x08}, + {0x17, 0x02, 0x08}, + {0x28, 0x03, 0x08}, + {0x02, 0x02, 0x0B}, + {0x09, 0x02, 0x0B}, + {0x17, 0x02, 0x0B}, + {0x28, 0x03, 0x0B}, + {0x02, 0x02, 0x0C}, + {0x09, 0x02, 0x0C}, + {0x17, 0x02, 0x0C}, + {0x28, 0x03, 0x0C}, + {0x02, 0x02, 0x0E}, + {0x09, 0x02, 0x0E}, + {0x17, 0x02, 0x0E}, + {0x28, 0x03, 0x0E}, }, /* 233 */ { - {0x03, 2, 8}, - {0x06, 2, 8}, - {0x0a, 2, 8}, - {0x0f, 2, 8}, - {0x18, 2, 8}, - {0x1f, 2, 8}, - {0x29, 2, 8}, - {0x38, 3, 8}, - {0x03, 2, 11}, - {0x06, 2, 11}, - {0x0a, 2, 11}, - {0x0f, 2, 11}, - {0x18, 2, 11}, - {0x1f, 2, 11}, - {0x29, 2, 11}, - {0x38, 3, 11}, + {0x03, 0x02, 0x08}, + {0x06, 0x02, 0x08}, + {0x0A, 0x02, 0x08}, + {0x0F, 0x02, 0x08}, + {0x18, 0x02, 0x08}, + {0x1F, 0x02, 0x08}, + {0x29, 0x02, 0x08}, + {0x38, 0x03, 0x08}, + {0x03, 0x02, 0x0B}, + {0x06, 0x02, 0x0B}, + {0x0A, 0x02, 0x0B}, + {0x0F, 0x02, 0x0B}, + {0x18, 0x02, 0x0B}, + {0x1F, 0x02, 0x0B}, + {0x29, 0x02, 0x0B}, + {0x38, 0x03, 0x0B}, }, /* 234 */ { - {0x03, 2, 12}, - {0x06, 2, 12}, - {0x0a, 2, 12}, - {0x0f, 2, 12}, - {0x18, 2, 12}, - {0x1f, 2, 12}, - {0x29, 2, 12}, - {0x38, 3, 12}, - {0x03, 2, 14}, - {0x06, 2, 14}, - {0x0a, 2, 14}, - {0x0f, 2, 14}, - {0x18, 2, 14}, - {0x1f, 2, 14}, - {0x29, 2, 14}, - {0x38, 3, 14}, + {0x03, 0x02, 0x0C}, + {0x06, 0x02, 0x0C}, + {0x0A, 0x02, 0x0C}, + {0x0F, 0x02, 0x0C}, + {0x18, 0x02, 0x0C}, + {0x1F, 0x02, 0x0C}, + {0x29, 0x02, 0x0C}, + {0x38, 0x03, 0x0C}, + {0x03, 0x02, 0x0E}, + {0x06, 0x02, 0x0E}, + {0x0A, 0x02, 0x0E}, + {0x0F, 0x02, 0x0E}, + {0x18, 0x02, 0x0E}, + {0x1F, 0x02, 0x0E}, + {0x29, 0x02, 0x0E}, + {0x38, 0x03, 0x0E}, }, /* 235 */ { - {0x02, 2, 15}, - {0x09, 2, 15}, - {0x17, 2, 15}, - {0x28, 3, 15}, - {0x02, 2, 16}, - {0x09, 2, 16}, - {0x17, 2, 16}, - {0x28, 3, 16}, - {0x02, 2, 17}, - {0x09, 2, 17}, - {0x17, 2, 17}, - {0x28, 3, 17}, - {0x02, 2, 18}, - {0x09, 2, 18}, - {0x17, 2, 18}, - {0x28, 3, 18}, + {0x02, 0x02, 0x0F}, + {0x09, 0x02, 0x0F}, + {0x17, 0x02, 0x0F}, + {0x28, 0x03, 0x0F}, + {0x02, 0x02, 0x10}, + {0x09, 0x02, 0x10}, + {0x17, 0x02, 0x10}, + {0x28, 0x03, 0x10}, + {0x02, 0x02, 0x11}, + {0x09, 0x02, 0x11}, + {0x17, 0x02, 0x11}, + {0x28, 0x03, 0x11}, + {0x02, 0x02, 0x12}, + {0x09, 0x02, 0x12}, + {0x17, 0x02, 0x12}, + {0x28, 0x03, 0x12}, }, /* 236 */ { - {0x03, 2, 15}, - {0x06, 2, 15}, - {0x0a, 2, 15}, - {0x0f, 2, 15}, - {0x18, 2, 15}, - {0x1f, 2, 15}, - {0x29, 2, 15}, - {0x38, 3, 15}, - {0x03, 2, 16}, - {0x06, 2, 16}, - {0x0a, 2, 16}, - {0x0f, 2, 16}, - {0x18, 2, 16}, - {0x1f, 2, 16}, - {0x29, 2, 16}, - {0x38, 3, 16}, + {0x03, 0x02, 0x0F}, + {0x06, 0x02, 0x0F}, + {0x0A, 0x02, 0x0F}, + {0x0F, 0x02, 0x0F}, + {0x18, 0x02, 0x0F}, + {0x1F, 0x02, 0x0F}, + {0x29, 0x02, 0x0F}, + {0x38, 0x03, 0x0F}, + {0x03, 0x02, 0x10}, + {0x06, 0x02, 0x10}, + {0x0A, 0x02, 0x10}, + {0x0F, 0x02, 0x10}, + {0x18, 0x02, 0x10}, + {0x1F, 0x02, 0x10}, + {0x29, 0x02, 0x10}, + {0x38, 0x03, 0x10}, }, /* 237 */ { - {0x03, 2, 17}, - {0x06, 2, 17}, - {0x0a, 2, 17}, - {0x0f, 2, 17}, - {0x18, 2, 17}, - {0x1f, 2, 17}, - {0x29, 2, 17}, - {0x38, 3, 17}, - {0x03, 2, 18}, - {0x06, 2, 18}, - {0x0a, 2, 18}, - {0x0f, 2, 18}, - {0x18, 2, 18}, - {0x1f, 2, 18}, - {0x29, 2, 18}, - {0x38, 3, 18}, + {0x03, 0x02, 0x11}, + {0x06, 0x02, 0x11}, + {0x0A, 0x02, 0x11}, + {0x0F, 0x02, 0x11}, + {0x18, 0x02, 0x11}, + {0x1F, 0x02, 0x11}, + {0x29, 0x02, 0x11}, + {0x38, 0x03, 0x11}, + {0x03, 0x02, 0x12}, + {0x06, 0x02, 0x12}, + {0x0A, 0x02, 0x12}, + {0x0F, 0x02, 0x12}, + {0x18, 0x02, 0x12}, + {0x1F, 0x02, 0x12}, + {0x29, 0x02, 0x12}, + {0x38, 0x03, 0x12}, }, /* 238 */ { - {0x00, 3, 19}, - {0x00, 3, 20}, - {0x00, 3, 21}, - {0x00, 3, 23}, - {0x00, 3, 24}, - {0x00, 3, 25}, - {0x00, 3, 26}, - {0x00, 3, 27}, - {0x00, 3, 28}, - {0x00, 3, 29}, - {0x00, 3, 30}, - {0x00, 3, 31}, - {0x00, 3, 127}, - {0x00, 3, 220}, - {0x00, 3, 249}, - {0xfd, 0, 0}, + {0x00, 0x03, 0x13}, + {0x00, 0x03, 0x14}, + {0x00, 0x03, 0x15}, + {0x00, 0x03, 0x17}, + {0x00, 0x03, 0x18}, + {0x00, 0x03, 0x19}, + {0x00, 0x03, 0x1A}, + {0x00, 0x03, 0x1B}, + {0x00, 0x03, 0x1C}, + {0x00, 0x03, 0x1D}, + {0x00, 0x03, 0x1E}, + {0x00, 0x03, 0x1F}, + {0x00, 0x03, 0x7F}, + {0x00, 0x03, 0xDC}, + {0x00, 0x03, 0xF9}, + {0xFD, 0x00, 0x00}, }, /* 239 */ { - {0x01, 2, 19}, - {0x16, 3, 19}, - {0x01, 2, 20}, - {0x16, 3, 20}, - {0x01, 2, 21}, - {0x16, 3, 21}, - {0x01, 2, 23}, - {0x16, 3, 23}, - {0x01, 2, 24}, - {0x16, 3, 24}, - {0x01, 2, 25}, - {0x16, 3, 25}, - {0x01, 2, 26}, - {0x16, 3, 26}, - {0x01, 2, 27}, - {0x16, 3, 27}, + {0x01, 0x02, 0x13}, + {0x16, 0x03, 0x13}, + {0x01, 0x02, 0x14}, + {0x16, 0x03, 0x14}, + {0x01, 0x02, 0x15}, + {0x16, 0x03, 0x15}, + {0x01, 0x02, 0x17}, + {0x16, 0x03, 0x17}, + {0x01, 0x02, 0x18}, + {0x16, 0x03, 0x18}, + {0x01, 0x02, 0x19}, + {0x16, 0x03, 0x19}, + {0x01, 0x02, 0x1A}, + {0x16, 0x03, 0x1A}, + {0x01, 0x02, 0x1B}, + {0x16, 0x03, 0x1B}, }, /* 240 */ { - {0x02, 2, 19}, - {0x09, 2, 19}, - {0x17, 2, 19}, - {0x28, 3, 19}, - {0x02, 2, 20}, - {0x09, 2, 20}, - {0x17, 2, 20}, - {0x28, 3, 20}, - {0x02, 2, 21}, - {0x09, 2, 21}, - {0x17, 2, 21}, - {0x28, 3, 21}, - {0x02, 2, 23}, - {0x09, 2, 23}, - {0x17, 2, 23}, - {0x28, 3, 23}, + {0x02, 0x02, 0x13}, + {0x09, 0x02, 0x13}, + {0x17, 0x02, 0x13}, + {0x28, 0x03, 0x13}, + {0x02, 0x02, 0x14}, + {0x09, 0x02, 0x14}, + {0x17, 0x02, 0x14}, + {0x28, 0x03, 0x14}, + {0x02, 0x02, 0x15}, + {0x09, 0x02, 0x15}, + {0x17, 0x02, 0x15}, + {0x28, 0x03, 0x15}, + {0x02, 0x02, 0x17}, + {0x09, 0x02, 0x17}, + {0x17, 0x02, 0x17}, + {0x28, 0x03, 0x17}, }, /* 241 */ { - {0x03, 2, 19}, - {0x06, 2, 19}, - {0x0a, 2, 19}, - {0x0f, 2, 19}, - {0x18, 2, 19}, - {0x1f, 2, 19}, - {0x29, 2, 19}, - {0x38, 3, 19}, - {0x03, 2, 20}, - {0x06, 2, 20}, - {0x0a, 2, 20}, - {0x0f, 2, 20}, - {0x18, 2, 20}, - {0x1f, 2, 20}, - {0x29, 2, 20}, - {0x38, 3, 20}, + {0x03, 0x02, 0x13}, + {0x06, 0x02, 0x13}, + {0x0A, 0x02, 0x13}, + {0x0F, 0x02, 0x13}, + {0x18, 0x02, 0x13}, + {0x1F, 0x02, 0x13}, + {0x29, 0x02, 0x13}, + {0x38, 0x03, 0x13}, + {0x03, 0x02, 0x14}, + {0x06, 0x02, 0x14}, + {0x0A, 0x02, 0x14}, + {0x0F, 0x02, 0x14}, + {0x18, 0x02, 0x14}, + {0x1F, 0x02, 0x14}, + {0x29, 0x02, 0x14}, + {0x38, 0x03, 0x14}, }, /* 242 */ { - {0x03, 2, 21}, - {0x06, 2, 21}, - {0x0a, 2, 21}, - {0x0f, 2, 21}, - {0x18, 2, 21}, - {0x1f, 2, 21}, - {0x29, 2, 21}, - {0x38, 3, 21}, - {0x03, 2, 23}, - {0x06, 2, 23}, - {0x0a, 2, 23}, - {0x0f, 2, 23}, - {0x18, 2, 23}, - {0x1f, 2, 23}, - {0x29, 2, 23}, - {0x38, 3, 23}, + {0x03, 0x02, 0x15}, + {0x06, 0x02, 0x15}, + {0x0A, 0x02, 0x15}, + {0x0F, 0x02, 0x15}, + {0x18, 0x02, 0x15}, + {0x1F, 0x02, 0x15}, + {0x29, 0x02, 0x15}, + {0x38, 0x03, 0x15}, + {0x03, 0x02, 0x17}, + {0x06, 0x02, 0x17}, + {0x0A, 0x02, 0x17}, + {0x0F, 0x02, 0x17}, + {0x18, 0x02, 0x17}, + {0x1F, 0x02, 0x17}, + {0x29, 0x02, 0x17}, + {0x38, 0x03, 0x17}, }, /* 243 */ { - {0x02, 2, 24}, - {0x09, 2, 24}, - {0x17, 2, 24}, - {0x28, 3, 24}, - {0x02, 2, 25}, - {0x09, 2, 25}, - {0x17, 2, 25}, - {0x28, 3, 25}, - {0x02, 2, 26}, - {0x09, 2, 26}, - {0x17, 2, 26}, - {0x28, 3, 26}, - {0x02, 2, 27}, - {0x09, 2, 27}, - {0x17, 2, 27}, - {0x28, 3, 27}, + {0x02, 0x02, 0x18}, + {0x09, 0x02, 0x18}, + {0x17, 0x02, 0x18}, + {0x28, 0x03, 0x18}, + {0x02, 0x02, 0x19}, + {0x09, 0x02, 0x19}, + {0x17, 0x02, 0x19}, + {0x28, 0x03, 0x19}, + {0x02, 0x02, 0x1A}, + {0x09, 0x02, 0x1A}, + {0x17, 0x02, 0x1A}, + {0x28, 0x03, 0x1A}, + {0x02, 0x02, 0x1B}, + {0x09, 0x02, 0x1B}, + {0x17, 0x02, 0x1B}, + {0x28, 0x03, 0x1B}, }, /* 244 */ { - {0x03, 2, 24}, - {0x06, 2, 24}, - {0x0a, 2, 24}, - {0x0f, 2, 24}, - {0x18, 2, 24}, - {0x1f, 2, 24}, - {0x29, 2, 24}, - {0x38, 3, 24}, - {0x03, 2, 25}, - {0x06, 2, 25}, - {0x0a, 2, 25}, - {0x0f, 2, 25}, - {0x18, 2, 25}, - {0x1f, 2, 25}, - {0x29, 2, 25}, - {0x38, 3, 25}, + {0x03, 0x02, 0x18}, + {0x06, 0x02, 0x18}, + {0x0A, 0x02, 0x18}, + {0x0F, 0x02, 0x18}, + {0x18, 0x02, 0x18}, + {0x1F, 0x02, 0x18}, + {0x29, 0x02, 0x18}, + {0x38, 0x03, 0x18}, + {0x03, 0x02, 0x19}, + {0x06, 0x02, 0x19}, + {0x0A, 0x02, 0x19}, + {0x0F, 0x02, 0x19}, + {0x18, 0x02, 0x19}, + {0x1F, 0x02, 0x19}, + {0x29, 0x02, 0x19}, + {0x38, 0x03, 0x19}, }, /* 245 */ { - {0x03, 2, 26}, - {0x06, 2, 26}, - {0x0a, 2, 26}, - {0x0f, 2, 26}, - {0x18, 2, 26}, - {0x1f, 2, 26}, - {0x29, 2, 26}, - {0x38, 3, 26}, - {0x03, 2, 27}, - {0x06, 2, 27}, - {0x0a, 2, 27}, - {0x0f, 2, 27}, - {0x18, 2, 27}, - {0x1f, 2, 27}, - {0x29, 2, 27}, - {0x38, 3, 27}, + {0x03, 0x02, 0x1A}, + {0x06, 0x02, 0x1A}, + {0x0A, 0x02, 0x1A}, + {0x0F, 0x02, 0x1A}, + {0x18, 0x02, 0x1A}, + {0x1F, 0x02, 0x1A}, + {0x29, 0x02, 0x1A}, + {0x38, 0x03, 0x1A}, + {0x03, 0x02, 0x1B}, + {0x06, 0x02, 0x1B}, + {0x0A, 0x02, 0x1B}, + {0x0F, 0x02, 0x1B}, + {0x18, 0x02, 0x1B}, + {0x1F, 0x02, 0x1B}, + {0x29, 0x02, 0x1B}, + {0x38, 0x03, 0x1B}, }, /* 246 */ { - {0x01, 2, 28}, - {0x16, 3, 28}, - {0x01, 2, 29}, - {0x16, 3, 29}, - {0x01, 2, 30}, - {0x16, 3, 30}, - {0x01, 2, 31}, - {0x16, 3, 31}, - {0x01, 2, 127}, - {0x16, 3, 127}, - {0x01, 2, 220}, - {0x16, 3, 220}, - {0x01, 2, 249}, - {0x16, 3, 249}, - {0xfe, 0, 0}, - {0xff, 0, 0}, + {0x01, 0x02, 0x1C}, + {0x16, 0x03, 0x1C}, + {0x01, 0x02, 0x1D}, + {0x16, 0x03, 0x1D}, + {0x01, 0x02, 0x1E}, + {0x16, 0x03, 0x1E}, + {0x01, 0x02, 0x1F}, + {0x16, 0x03, 0x1F}, + {0x01, 0x02, 0x7F}, + {0x16, 0x03, 0x7F}, + {0x01, 0x02, 0xDC}, + {0x16, 0x03, 0xDC}, + {0x01, 0x02, 0xF9}, + {0x16, 0x03, 0xF9}, + {0xFE, 0x00, 0x00}, + {0xFF, 0x00, 0x00}, }, /* 247 */ { - {0x02, 2, 28}, - {0x09, 2, 28}, - {0x17, 2, 28}, - {0x28, 3, 28}, - {0x02, 2, 29}, - {0x09, 2, 29}, - {0x17, 2, 29}, - {0x28, 3, 29}, - {0x02, 2, 30}, - {0x09, 2, 30}, - {0x17, 2, 30}, - {0x28, 3, 30}, - {0x02, 2, 31}, - {0x09, 2, 31}, - {0x17, 2, 31}, - {0x28, 3, 31}, + {0x02, 0x02, 0x1C}, + {0x09, 0x02, 0x1C}, + {0x17, 0x02, 0x1C}, + {0x28, 0x03, 0x1C}, + {0x02, 0x02, 0x1D}, + {0x09, 0x02, 0x1D}, + {0x17, 0x02, 0x1D}, + {0x28, 0x03, 0x1D}, + {0x02, 0x02, 0x1E}, + {0x09, 0x02, 0x1E}, + {0x17, 0x02, 0x1E}, + {0x28, 0x03, 0x1E}, + {0x02, 0x02, 0x1F}, + {0x09, 0x02, 0x1F}, + {0x17, 0x02, 0x1F}, + {0x28, 0x03, 0x1F}, }, /* 248 */ { - {0x03, 2, 28}, - {0x06, 2, 28}, - {0x0a, 2, 28}, - {0x0f, 2, 28}, - {0x18, 2, 28}, - {0x1f, 2, 28}, - {0x29, 2, 28}, - {0x38, 3, 28}, - {0x03, 2, 29}, - {0x06, 2, 29}, - {0x0a, 2, 29}, - {0x0f, 2, 29}, - {0x18, 2, 29}, - {0x1f, 2, 29}, - {0x29, 2, 29}, - {0x38, 3, 29}, + {0x03, 0x02, 0x1C}, + {0x06, 0x02, 0x1C}, + {0x0A, 0x02, 0x1C}, + {0x0F, 0x02, 0x1C}, + {0x18, 0x02, 0x1C}, + {0x1F, 0x02, 0x1C}, + {0x29, 0x02, 0x1C}, + {0x38, 0x03, 0x1C}, + {0x03, 0x02, 0x1D}, + {0x06, 0x02, 0x1D}, + {0x0A, 0x02, 0x1D}, + {0x0F, 0x02, 0x1D}, + {0x18, 0x02, 0x1D}, + {0x1F, 0x02, 0x1D}, + {0x29, 0x02, 0x1D}, + {0x38, 0x03, 0x1D}, }, /* 249 */ { - {0x03, 2, 30}, - {0x06, 2, 30}, - {0x0a, 2, 30}, - {0x0f, 2, 30}, - {0x18, 2, 30}, - {0x1f, 2, 30}, - {0x29, 2, 30}, - {0x38, 3, 30}, - {0x03, 2, 31}, - {0x06, 2, 31}, - {0x0a, 2, 31}, - {0x0f, 2, 31}, - {0x18, 2, 31}, - {0x1f, 2, 31}, - {0x29, 2, 31}, - {0x38, 3, 31}, + {0x03, 0x02, 0x1E}, + {0x06, 0x02, 0x1E}, + {0x0A, 0x02, 0x1E}, + {0x0F, 0x02, 0x1E}, + {0x18, 0x02, 0x1E}, + {0x1F, 0x02, 0x1E}, + {0x29, 0x02, 0x1E}, + {0x38, 0x03, 0x1E}, + {0x03, 0x02, 0x1F}, + {0x06, 0x02, 0x1F}, + {0x0A, 0x02, 0x1F}, + {0x0F, 0x02, 0x1F}, + {0x18, 0x02, 0x1F}, + {0x1F, 0x02, 0x1F}, + {0x29, 0x02, 0x1F}, + {0x38, 0x03, 0x1F}, }, /* 250 */ { - {0x02, 2, 127}, - {0x09, 2, 127}, - {0x17, 2, 127}, - {0x28, 3, 127}, - {0x02, 2, 220}, - {0x09, 2, 220}, - {0x17, 2, 220}, - {0x28, 3, 220}, - {0x02, 2, 249}, - {0x09, 2, 249}, - {0x17, 2, 249}, - {0x28, 3, 249}, - {0x00, 3, 10}, - {0x00, 3, 13}, - {0x00, 3, 22}, - {0x100, 0, 0}, + {0x02, 0x02, 0x7F}, + {0x09, 0x02, 0x7F}, + {0x17, 0x02, 0x7F}, + {0x28, 0x03, 0x7F}, + {0x02, 0x02, 0xDC}, + {0x09, 0x02, 0xDC}, + {0x17, 0x02, 0xDC}, + {0x28, 0x03, 0xDC}, + {0x02, 0x02, 0xF9}, + {0x09, 0x02, 0xF9}, + {0x17, 0x02, 0xF9}, + {0x28, 0x03, 0xF9}, + {0x00, 0x03, 0x0A}, + {0x00, 0x03, 0x0D}, + {0x00, 0x03, 0x16}, + {0x100, 0x00, 0x00}, }, /* 251 */ { - {0x03, 2, 127}, - {0x06, 2, 127}, - {0x0a, 2, 127}, - {0x0f, 2, 127}, - {0x18, 2, 127}, - {0x1f, 2, 127}, - {0x29, 2, 127}, - {0x38, 3, 127}, - {0x03, 2, 220}, - {0x06, 2, 220}, - {0x0a, 2, 220}, - {0x0f, 2, 220}, - {0x18, 2, 220}, - {0x1f, 2, 220}, - {0x29, 2, 220}, - {0x38, 3, 220}, + {0x03, 0x02, 0x7F}, + {0x06, 0x02, 0x7F}, + {0x0A, 0x02, 0x7F}, + {0x0F, 0x02, 0x7F}, + {0x18, 0x02, 0x7F}, + {0x1F, 0x02, 0x7F}, + {0x29, 0x02, 0x7F}, + {0x38, 0x03, 0x7F}, + {0x03, 0x02, 0xDC}, + {0x06, 0x02, 0xDC}, + {0x0A, 0x02, 0xDC}, + {0x0F, 0x02, 0xDC}, + {0x18, 0x02, 0xDC}, + {0x1F, 0x02, 0xDC}, + {0x29, 0x02, 0xDC}, + {0x38, 0x03, 0xDC}, }, /* 252 */ { - {0x03, 2, 249}, - {0x06, 2, 249}, - {0x0a, 2, 249}, - {0x0f, 2, 249}, - {0x18, 2, 249}, - {0x1f, 2, 249}, - {0x29, 2, 249}, - {0x38, 3, 249}, - {0x01, 2, 10}, - {0x16, 3, 10}, - {0x01, 2, 13}, - {0x16, 3, 13}, - {0x01, 2, 22}, - {0x16, 3, 22}, - {0x100, 0, 0}, - {0x100, 0, 0}, + {0x03, 0x02, 0xF9}, + {0x06, 0x02, 0xF9}, + {0x0A, 0x02, 0xF9}, + {0x0F, 0x02, 0xF9}, + {0x18, 0x02, 0xF9}, + {0x1F, 0x02, 0xF9}, + {0x29, 0x02, 0xF9}, + {0x38, 0x03, 0xF9}, + {0x01, 0x02, 0x0A}, + {0x16, 0x03, 0x0A}, + {0x01, 0x02, 0x0D}, + {0x16, 0x03, 0x0D}, + {0x01, 0x02, 0x16}, + {0x16, 0x03, 0x16}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, }, /* 253 */ { - {0x02, 2, 10}, - {0x09, 2, 10}, - {0x17, 2, 10}, - {0x28, 3, 10}, - {0x02, 2, 13}, - {0x09, 2, 13}, - {0x17, 2, 13}, - {0x28, 3, 13}, - {0x02, 2, 22}, - {0x09, 2, 22}, - {0x17, 2, 22}, - {0x28, 3, 22}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, + {0x02, 0x02, 0x0A}, + {0x09, 0x02, 0x0A}, + {0x17, 0x02, 0x0A}, + {0x28, 0x03, 0x0A}, + {0x02, 0x02, 0x0D}, + {0x09, 0x02, 0x0D}, + {0x17, 0x02, 0x0D}, + {0x28, 0x03, 0x0D}, + {0x02, 0x02, 0x16}, + {0x09, 0x02, 0x16}, + {0x17, 0x02, 0x16}, + {0x28, 0x03, 0x16}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, }, /* 254 */ { - {0x03, 2, 10}, - {0x06, 2, 10}, - {0x0a, 2, 10}, - {0x0f, 2, 10}, - {0x18, 2, 10}, - {0x1f, 2, 10}, - {0x29, 2, 10}, - {0x38, 3, 10}, - {0x03, 2, 13}, - {0x06, 2, 13}, - {0x0a, 2, 13}, - {0x0f, 2, 13}, - {0x18, 2, 13}, - {0x1f, 2, 13}, - {0x29, 2, 13}, - {0x38, 3, 13}, + {0x03, 0x02, 0x0A}, + {0x06, 0x02, 0x0A}, + {0x0A, 0x02, 0x0A}, + {0x0F, 0x02, 0x0A}, + {0x18, 0x02, 0x0A}, + {0x1F, 0x02, 0x0A}, + {0x29, 0x02, 0x0A}, + {0x38, 0x03, 0x0A}, + {0x03, 0x02, 0x0D}, + {0x06, 0x02, 0x0D}, + {0x0A, 0x02, 0x0D}, + {0x0F, 0x02, 0x0D}, + {0x18, 0x02, 0x0D}, + {0x1F, 0x02, 0x0D}, + {0x29, 0x02, 0x0D}, + {0x38, 0x03, 0x0D}, }, /* 255 */ { - {0x03, 2, 22}, - {0x06, 2, 22}, - {0x0a, 2, 22}, - {0x0f, 2, 22}, - {0x18, 2, 22}, - {0x1f, 2, 22}, - {0x29, 2, 22}, - {0x38, 3, 22}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, + {0x03, 0x02, 0x16}, + {0x06, 0x02, 0x16}, + {0x0A, 0x02, 0x16}, + {0x0F, 0x02, 0x16}, + {0x18, 0x02, 0x16}, + {0x1F, 0x02, 0x16}, + {0x29, 0x02, 0x16}, + {0x38, 0x03, 0x16}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, }, /* 256 */ { - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, }, }; diff --git a/deps/nghttp2/lib/nghttp2_helper.c b/deps/nghttp2/lib/nghttp2_helper.c index f54f37c13e27..70a80bc6faa7 100644 --- a/deps/nghttp2/lib/nghttp2_helper.c +++ b/deps/nghttp2/lib/nghttp2_helper.c @@ -52,77 +52,77 @@ uint32_t nghttp2_get_uint32(const uint8_t *data) { } /* Generated by gendowncasetbl.py */ -static const uint8_t DOWNCASE_TBL[] = { - 0 /* NUL */, 1 /* SOH */, 2 /* STX */, 3 /* ETX */, - 4 /* EOT */, 5 /* ENQ */, 6 /* ACK */, 7 /* BEL */, - 8 /* BS */, 9 /* HT */, 10 /* LF */, 11 /* VT */, - 12 /* FF */, 13 /* CR */, 14 /* SO */, 15 /* SI */, - 16 /* DLE */, 17 /* DC1 */, 18 /* DC2 */, 19 /* DC3 */, - 20 /* DC4 */, 21 /* NAK */, 22 /* SYN */, 23 /* ETB */, - 24 /* CAN */, 25 /* EM */, 26 /* SUB */, 27 /* ESC */, - 28 /* FS */, 29 /* GS */, 30 /* RS */, 31 /* US */, - 32 /* SPC */, 33 /* ! */, 34 /* " */, 35 /* # */, - 36 /* $ */, 37 /* % */, 38 /* & */, 39 /* ' */, - 40 /* ( */, 41 /* ) */, 42 /* * */, 43 /* + */, - 44 /* , */, 45 /* - */, 46 /* . */, 47 /* / */, - 48 /* 0 */, 49 /* 1 */, 50 /* 2 */, 51 /* 3 */, - 52 /* 4 */, 53 /* 5 */, 54 /* 6 */, 55 /* 7 */, - 56 /* 8 */, 57 /* 9 */, 58 /* : */, 59 /* ; */, - 60 /* < */, 61 /* = */, 62 /* > */, 63 /* ? */, - 64 /* @ */, 97 /* A */, 98 /* B */, 99 /* C */, - 100 /* D */, 101 /* E */, 102 /* F */, 103 /* G */, - 104 /* H */, 105 /* I */, 106 /* J */, 107 /* K */, - 108 /* L */, 109 /* M */, 110 /* N */, 111 /* O */, - 112 /* P */, 113 /* Q */, 114 /* R */, 115 /* S */, - 116 /* T */, 117 /* U */, 118 /* V */, 119 /* W */, - 120 /* X */, 121 /* Y */, 122 /* Z */, 91 /* [ */, - 92 /* \ */, 93 /* ] */, 94 /* ^ */, 95 /* _ */, - 96 /* ` */, 97 /* a */, 98 /* b */, 99 /* c */, - 100 /* d */, 101 /* e */, 102 /* f */, 103 /* g */, - 104 /* h */, 105 /* i */, 106 /* j */, 107 /* k */, - 108 /* l */, 109 /* m */, 110 /* n */, 111 /* o */, - 112 /* p */, 113 /* q */, 114 /* r */, 115 /* s */, - 116 /* t */, 117 /* u */, 118 /* v */, 119 /* w */, - 120 /* x */, 121 /* y */, 122 /* z */, 123 /* { */, - 124 /* | */, 125 /* } */, 126 /* ~ */, 127 /* DEL */, - 128 /* 0x80 */, 129 /* 0x81 */, 130 /* 0x82 */, 131 /* 0x83 */, - 132 /* 0x84 */, 133 /* 0x85 */, 134 /* 0x86 */, 135 /* 0x87 */, - 136 /* 0x88 */, 137 /* 0x89 */, 138 /* 0x8a */, 139 /* 0x8b */, - 140 /* 0x8c */, 141 /* 0x8d */, 142 /* 0x8e */, 143 /* 0x8f */, - 144 /* 0x90 */, 145 /* 0x91 */, 146 /* 0x92 */, 147 /* 0x93 */, - 148 /* 0x94 */, 149 /* 0x95 */, 150 /* 0x96 */, 151 /* 0x97 */, - 152 /* 0x98 */, 153 /* 0x99 */, 154 /* 0x9a */, 155 /* 0x9b */, - 156 /* 0x9c */, 157 /* 0x9d */, 158 /* 0x9e */, 159 /* 0x9f */, - 160 /* 0xa0 */, 161 /* 0xa1 */, 162 /* 0xa2 */, 163 /* 0xa3 */, - 164 /* 0xa4 */, 165 /* 0xa5 */, 166 /* 0xa6 */, 167 /* 0xa7 */, - 168 /* 0xa8 */, 169 /* 0xa9 */, 170 /* 0xaa */, 171 /* 0xab */, - 172 /* 0xac */, 173 /* 0xad */, 174 /* 0xae */, 175 /* 0xaf */, - 176 /* 0xb0 */, 177 /* 0xb1 */, 178 /* 0xb2 */, 179 /* 0xb3 */, - 180 /* 0xb4 */, 181 /* 0xb5 */, 182 /* 0xb6 */, 183 /* 0xb7 */, - 184 /* 0xb8 */, 185 /* 0xb9 */, 186 /* 0xba */, 187 /* 0xbb */, - 188 /* 0xbc */, 189 /* 0xbd */, 190 /* 0xbe */, 191 /* 0xbf */, - 192 /* 0xc0 */, 193 /* 0xc1 */, 194 /* 0xc2 */, 195 /* 0xc3 */, - 196 /* 0xc4 */, 197 /* 0xc5 */, 198 /* 0xc6 */, 199 /* 0xc7 */, - 200 /* 0xc8 */, 201 /* 0xc9 */, 202 /* 0xca */, 203 /* 0xcb */, - 204 /* 0xcc */, 205 /* 0xcd */, 206 /* 0xce */, 207 /* 0xcf */, - 208 /* 0xd0 */, 209 /* 0xd1 */, 210 /* 0xd2 */, 211 /* 0xd3 */, - 212 /* 0xd4 */, 213 /* 0xd5 */, 214 /* 0xd6 */, 215 /* 0xd7 */, - 216 /* 0xd8 */, 217 /* 0xd9 */, 218 /* 0xda */, 219 /* 0xdb */, - 220 /* 0xdc */, 221 /* 0xdd */, 222 /* 0xde */, 223 /* 0xdf */, - 224 /* 0xe0 */, 225 /* 0xe1 */, 226 /* 0xe2 */, 227 /* 0xe3 */, - 228 /* 0xe4 */, 229 /* 0xe5 */, 230 /* 0xe6 */, 231 /* 0xe7 */, - 232 /* 0xe8 */, 233 /* 0xe9 */, 234 /* 0xea */, 235 /* 0xeb */, - 236 /* 0xec */, 237 /* 0xed */, 238 /* 0xee */, 239 /* 0xef */, - 240 /* 0xf0 */, 241 /* 0xf1 */, 242 /* 0xf2 */, 243 /* 0xf3 */, - 244 /* 0xf4 */, 245 /* 0xf5 */, 246 /* 0xf6 */, 247 /* 0xf7 */, - 248 /* 0xf8 */, 249 /* 0xf9 */, 250 /* 0xfa */, 251 /* 0xfb */, - 252 /* 0xfc */, 253 /* 0xfd */, 254 /* 0xfe */, 255 /* 0xff */, +const uint8_t nghttp2_downcase_tbl[] = { + 0x00 /* NUL */, 0x01 /* SOH */, 0x02 /* STX */, 0x03 /* ETX */, + 0x04 /* EOT */, 0x05 /* ENQ */, 0x06 /* ACK */, 0x07 /* BEL */, + 0x08 /* BS */, 0x09 /* HT */, 0x0A /* LF */, 0x0B /* VT */, + 0x0C /* FF */, 0x0D /* CR */, 0x0E /* SO */, 0x0F /* SI */, + 0x10 /* DLE */, 0x11 /* DC1 */, 0x12 /* DC2 */, 0x13 /* DC3 */, + 0x14 /* DC4 */, 0x15 /* NAK */, 0x16 /* SYN */, 0x17 /* ETB */, + 0x18 /* CAN */, 0x19 /* EM */, 0x1A /* SUB */, 0x1B /* ESC */, + 0x1C /* FS */, 0x1D /* GS */, 0x1E /* RS */, 0x1F /* US */, + 0x20 /* SPC */, 0x21 /* ! */, 0x22 /* " */, 0x23 /* # */, + 0x24 /* $ */, 0x25 /* % */, 0x26 /* & */, 0x27 /* ' */, + 0x28 /* ( */, 0x29 /* ) */, 0x2A /* * */, 0x2B /* + */, + 0x2C /* , */, 0x2D /* - */, 0x2E /* . */, 0x2F /* / */, + 0x30 /* 0 */, 0x31 /* 1 */, 0x32 /* 2 */, 0x33 /* 3 */, + 0x34 /* 4 */, 0x35 /* 5 */, 0x36 /* 6 */, 0x37 /* 7 */, + 0x38 /* 8 */, 0x39 /* 9 */, 0x3A /* : */, 0x3B /* ; */, + 0x3C /* < */, 0x3D /* = */, 0x3E /* > */, 0x3F /* ? */, + 0x40 /* @ */, 0x61 /* A */, 0x62 /* B */, 0x63 /* C */, + 0x64 /* D */, 0x65 /* E */, 0x66 /* F */, 0x67 /* G */, + 0x68 /* H */, 0x69 /* I */, 0x6A /* J */, 0x6B /* K */, + 0x6C /* L */, 0x6D /* M */, 0x6E /* N */, 0x6F /* O */, + 0x70 /* P */, 0x71 /* Q */, 0x72 /* R */, 0x73 /* S */, + 0x74 /* T */, 0x75 /* U */, 0x76 /* V */, 0x77 /* W */, + 0x78 /* X */, 0x79 /* Y */, 0x7A /* Z */, 0x5B /* [ */, + 0x5C /* \ */, 0x5D /* ] */, 0x5E /* ^ */, 0x5F /* _ */, + 0x60 /* ` */, 0x61 /* a */, 0x62 /* b */, 0x63 /* c */, + 0x64 /* d */, 0x65 /* e */, 0x66 /* f */, 0x67 /* g */, + 0x68 /* h */, 0x69 /* i */, 0x6A /* j */, 0x6B /* k */, + 0x6C /* l */, 0x6D /* m */, 0x6E /* n */, 0x6F /* o */, + 0x70 /* p */, 0x71 /* q */, 0x72 /* r */, 0x73 /* s */, + 0x74 /* t */, 0x75 /* u */, 0x76 /* v */, 0x77 /* w */, + 0x78 /* x */, 0x79 /* y */, 0x7A /* z */, 0x7B /* { */, + 0x7C /* | */, 0x7D /* } */, 0x7E /* ~ */, 0x7F /* DEL */, + 0x80 /* 0x80 */, 0x81 /* 0x81 */, 0x82 /* 0x82 */, 0x83 /* 0x83 */, + 0x84 /* 0x84 */, 0x85 /* 0x85 */, 0x86 /* 0x86 */, 0x87 /* 0x87 */, + 0x88 /* 0x88 */, 0x89 /* 0x89 */, 0x8A /* 0x8A */, 0x8B /* 0x8B */, + 0x8C /* 0x8C */, 0x8D /* 0x8D */, 0x8E /* 0x8E */, 0x8F /* 0x8F */, + 0x90 /* 0x90 */, 0x91 /* 0x91 */, 0x92 /* 0x92 */, 0x93 /* 0x93 */, + 0x94 /* 0x94 */, 0x95 /* 0x95 */, 0x96 /* 0x96 */, 0x97 /* 0x97 */, + 0x98 /* 0x98 */, 0x99 /* 0x99 */, 0x9A /* 0x9A */, 0x9B /* 0x9B */, + 0x9C /* 0x9C */, 0x9D /* 0x9D */, 0x9E /* 0x9E */, 0x9F /* 0x9F */, + 0xA0 /* 0xA0 */, 0xA1 /* 0xA1 */, 0xA2 /* 0xA2 */, 0xA3 /* 0xA3 */, + 0xA4 /* 0xA4 */, 0xA5 /* 0xA5 */, 0xA6 /* 0xA6 */, 0xA7 /* 0xA7 */, + 0xA8 /* 0xA8 */, 0xA9 /* 0xA9 */, 0xAA /* 0xAA */, 0xAB /* 0xAB */, + 0xAC /* 0xAC */, 0xAD /* 0xAD */, 0xAE /* 0xAE */, 0xAF /* 0xAF */, + 0xB0 /* 0xB0 */, 0xB1 /* 0xB1 */, 0xB2 /* 0xB2 */, 0xB3 /* 0xB3 */, + 0xB4 /* 0xB4 */, 0xB5 /* 0xB5 */, 0xB6 /* 0xB6 */, 0xB7 /* 0xB7 */, + 0xB8 /* 0xB8 */, 0xB9 /* 0xB9 */, 0xBA /* 0xBA */, 0xBB /* 0xBB */, + 0xBC /* 0xBC */, 0xBD /* 0xBD */, 0xBE /* 0xBE */, 0xBF /* 0xBF */, + 0xC0 /* 0xC0 */, 0xC1 /* 0xC1 */, 0xC2 /* 0xC2 */, 0xC3 /* 0xC3 */, + 0xC4 /* 0xC4 */, 0xC5 /* 0xC5 */, 0xC6 /* 0xC6 */, 0xC7 /* 0xC7 */, + 0xC8 /* 0xC8 */, 0xC9 /* 0xC9 */, 0xCA /* 0xCA */, 0xCB /* 0xCB */, + 0xCC /* 0xCC */, 0xCD /* 0xCD */, 0xCE /* 0xCE */, 0xCF /* 0xCF */, + 0xD0 /* 0xD0 */, 0xD1 /* 0xD1 */, 0xD2 /* 0xD2 */, 0xD3 /* 0xD3 */, + 0xD4 /* 0xD4 */, 0xD5 /* 0xD5 */, 0xD6 /* 0xD6 */, 0xD7 /* 0xD7 */, + 0xD8 /* 0xD8 */, 0xD9 /* 0xD9 */, 0xDA /* 0xDA */, 0xDB /* 0xDB */, + 0xDC /* 0xDC */, 0xDD /* 0xDD */, 0xDE /* 0xDE */, 0xDF /* 0xDF */, + 0xE0 /* 0xE0 */, 0xE1 /* 0xE1 */, 0xE2 /* 0xE2 */, 0xE3 /* 0xE3 */, + 0xE4 /* 0xE4 */, 0xE5 /* 0xE5 */, 0xE6 /* 0xE6 */, 0xE7 /* 0xE7 */, + 0xE8 /* 0xE8 */, 0xE9 /* 0xE9 */, 0xEA /* 0xEA */, 0xEB /* 0xEB */, + 0xEC /* 0xEC */, 0xED /* 0xED */, 0xEE /* 0xEE */, 0xEF /* 0xEF */, + 0xF0 /* 0xF0 */, 0xF1 /* 0xF1 */, 0xF2 /* 0xF2 */, 0xF3 /* 0xF3 */, + 0xF4 /* 0xF4 */, 0xF5 /* 0xF5 */, 0xF6 /* 0xF6 */, 0xF7 /* 0xF7 */, + 0xF8 /* 0xF8 */, 0xF9 /* 0xF9 */, 0xFA /* 0xFA */, 0xFB /* 0xFB */, + 0xFC /* 0xFC */, 0xFD /* 0xFD */, 0xFE /* 0xFE */, 0xFF /* 0xFF */, }; void nghttp2_downcase(uint8_t *s, size_t len) { size_t i; for (i = 0; i < len; ++i) { - s[i] = DOWNCASE_TBL[s[i]]; + s[i] = nghttp2_downcase_byte(s[i]); } } @@ -343,72 +343,18 @@ const char *nghttp2_strerror(int error_code) { } } -/* Generated by gennmchartbl.py */ -static const int VALID_HD_NAME_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, - 0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, - 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, - 0 /* @ */, 0 /* A */, 0 /* B */, 0 /* C */, - 0 /* D */, 0 /* E */, 0 /* F */, 0 /* G */, - 0 /* H */, 0 /* I */, 0 /* J */, 0 /* K */, - 0 /* L */, 0 /* M */, 0 /* N */, 0 /* O */, - 0 /* P */, 0 /* Q */, 0 /* R */, 0 /* S */, - 0 /* T */, 0 /* U */, 0 /* V */, 0 /* W */, - 0 /* X */, 0 /* Y */, 0 /* Z */, 0 /* [ */, - 0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, - 1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, - 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, - 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, - 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, - 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, - 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, - 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, - 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, - 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, - 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, - 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, - 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, - 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, - 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, - 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, - 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, - 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, - 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, - 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, - 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, - 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, - 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, - 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, - 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, - 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, - 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, - 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, - 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, - 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, - 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, - 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, - 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, - 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ +static const uint8_t VALID_HD_NAME_CHARS[256] = { + ['!'] = 1, ['#'] = 1, ['$'] = 1, ['%'] = 1, ['&'] = 1, ['\''] = 1, ['*'] = 1, + ['+'] = 1, ['-'] = 1, ['.'] = 1, ['0'] = 1, ['1'] = 1, ['2'] = 1, ['3'] = 1, + ['4'] = 1, ['5'] = 1, ['6'] = 1, ['7'] = 1, ['8'] = 1, ['9'] = 1, ['A'] = 2, + ['B'] = 2, ['C'] = 2, ['D'] = 2, ['E'] = 2, ['F'] = 2, ['G'] = 2, ['H'] = 2, + ['I'] = 2, ['J'] = 2, ['K'] = 2, ['L'] = 2, ['M'] = 2, ['N'] = 2, ['O'] = 2, + ['P'] = 2, ['Q'] = 2, ['R'] = 2, ['S'] = 2, ['T'] = 2, ['U'] = 2, ['V'] = 2, + ['W'] = 2, ['X'] = 2, ['Y'] = 2, ['Z'] = 2, ['^'] = 1, ['_'] = 1, ['`'] = 1, + ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1, ['g'] = 1, + ['h'] = 1, ['i'] = 1, ['j'] = 1, ['k'] = 1, ['l'] = 1, ['m'] = 1, ['n'] = 1, + ['o'] = 1, ['p'] = 1, ['q'] = 1, ['r'] = 1, ['s'] = 1, ['t'] = 1, ['u'] = 1, + ['v'] = 1, ['w'] = 1, ['x'] = 1, ['y'] = 1, ['z'] = 1, ['|'] = 1, ['~'] = 1, }; int nghttp2_check_header_name(const uint8_t *name, size_t len) { @@ -424,79 +370,66 @@ int nghttp2_check_header_name(const uint8_t *name, size_t len) { --len; } for (last = name + len; name != last; ++name) { - if (!VALID_HD_NAME_CHARS[*name]) { + if (VALID_HD_NAME_CHARS[*name] != 1) { return 0; } } return 1; } -/* Generated by genvchartbl.py */ -static const int VALID_HD_VALUE_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 1 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 1 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, - 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, - 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, - 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, - 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, - 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */, - 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */, - 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */, - 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, - 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, - 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, - 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */, - 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */, - 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, - 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, - 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, - 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */, - 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */, - 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, - 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, - 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, - 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */, - 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */, - 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, - 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, - 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, - 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */, - 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */, - 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, - 1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, - 1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, - 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */, - 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */, - 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, - 1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, - 1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, - 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */, - 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */ +int nghttp2_check_nonempty_header_name(const uint8_t *name, size_t len) { + const uint8_t *last; + int rv; + + for (last = name + len; name != last; ++name) { + rv = VALID_HD_NAME_CHARS[*name]; + if (rv != 1) { + return rv; + } + } + + return 1; +} + +static const uint8_t VALID_HD_VALUE_CHARS[256] = { + ['\t'] = 1, [' '] = 1, ['!'] = 1, ['"'] = 1, ['#'] = 1, ['$'] = 1, + ['%'] = 1, ['&'] = 1, ['\''] = 1, ['('] = 1, [')'] = 1, ['*'] = 1, + ['+'] = 1, [','] = 1, ['-'] = 1, ['.'] = 1, ['/'] = 1, ['0'] = 1, + ['1'] = 1, ['2'] = 1, ['3'] = 1, ['4'] = 1, ['5'] = 1, ['6'] = 1, + ['7'] = 1, ['8'] = 1, ['9'] = 1, [':'] = 1, [';'] = 1, ['<'] = 1, + ['='] = 1, ['>'] = 1, ['?'] = 1, ['@'] = 1, ['A'] = 1, ['B'] = 1, + ['C'] = 1, ['D'] = 1, ['E'] = 1, ['F'] = 1, ['G'] = 1, ['H'] = 1, + ['I'] = 1, ['J'] = 1, ['K'] = 1, ['L'] = 1, ['M'] = 1, ['N'] = 1, + ['O'] = 1, ['P'] = 1, ['Q'] = 1, ['R'] = 1, ['S'] = 1, ['T'] = 1, + ['U'] = 1, ['V'] = 1, ['W'] = 1, ['X'] = 1, ['Y'] = 1, ['Z'] = 1, + ['['] = 1, ['\\'] = 1, [']'] = 1, ['^'] = 1, ['_'] = 1, ['`'] = 1, + ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1, + ['g'] = 1, ['h'] = 1, ['i'] = 1, ['j'] = 1, ['k'] = 1, ['l'] = 1, + ['m'] = 1, ['n'] = 1, ['o'] = 1, ['p'] = 1, ['q'] = 1, ['r'] = 1, + ['s'] = 1, ['t'] = 1, ['u'] = 1, ['v'] = 1, ['w'] = 1, ['x'] = 1, + ['y'] = 1, ['z'] = 1, ['{'] = 1, ['|'] = 1, ['}'] = 1, ['~'] = 1, + [0x80] = 1, [0x81] = 1, [0x82] = 1, [0x83] = 1, [0x84] = 1, [0x85] = 1, + [0x86] = 1, [0x87] = 1, [0x88] = 1, [0x89] = 1, [0x8A] = 1, [0x8B] = 1, + [0x8C] = 1, [0x8D] = 1, [0x8E] = 1, [0x8F] = 1, [0x90] = 1, [0x91] = 1, + [0x92] = 1, [0x93] = 1, [0x94] = 1, [0x95] = 1, [0x96] = 1, [0x97] = 1, + [0x98] = 1, [0x99] = 1, [0x9A] = 1, [0x9B] = 1, [0x9C] = 1, [0x9D] = 1, + [0x9E] = 1, [0x9F] = 1, [0xA0] = 1, [0xA1] = 1, [0xA2] = 1, [0xA3] = 1, + [0xA4] = 1, [0xA5] = 1, [0xA6] = 1, [0xA7] = 1, [0xA8] = 1, [0xA9] = 1, + [0xAA] = 1, [0xAB] = 1, [0xAC] = 1, [0xAD] = 1, [0xAE] = 1, [0xAF] = 1, + [0xB0] = 1, [0xB1] = 1, [0xB2] = 1, [0xB3] = 1, [0xB4] = 1, [0xB5] = 1, + [0xB6] = 1, [0xB7] = 1, [0xB8] = 1, [0xB9] = 1, [0xBA] = 1, [0xBB] = 1, + [0xBC] = 1, [0xBD] = 1, [0xBE] = 1, [0xBF] = 1, [0xC0] = 1, [0xC1] = 1, + [0xC2] = 1, [0xC3] = 1, [0xC4] = 1, [0xC5] = 1, [0xC6] = 1, [0xC7] = 1, + [0xC8] = 1, [0xC9] = 1, [0xCA] = 1, [0xCB] = 1, [0xCC] = 1, [0xCD] = 1, + [0xCE] = 1, [0xCF] = 1, [0xD0] = 1, [0xD1] = 1, [0xD2] = 1, [0xD3] = 1, + [0xD4] = 1, [0xD5] = 1, [0xD6] = 1, [0xD7] = 1, [0xD8] = 1, [0xD9] = 1, + [0xDA] = 1, [0xDB] = 1, [0xDC] = 1, [0xDD] = 1, [0xDE] = 1, [0xDF] = 1, + [0xE0] = 1, [0xE1] = 1, [0xE2] = 1, [0xE3] = 1, [0xE4] = 1, [0xE5] = 1, + [0xE6] = 1, [0xE7] = 1, [0xE8] = 1, [0xE9] = 1, [0xEA] = 1, [0xEB] = 1, + [0xEC] = 1, [0xED] = 1, [0xEE] = 1, [0xEF] = 1, [0xF0] = 1, [0xF1] = 1, + [0xF2] = 1, [0xF3] = 1, [0xF4] = 1, [0xF5] = 1, [0xF6] = 1, [0xF7] = 1, + [0xF8] = 1, [0xF9] = 1, [0xFA] = 1, [0xFB] = 1, [0xFC] = 1, [0xFD] = 1, + [0xFE] = 1, [0xFF] = 1, }; int nghttp2_check_header_value(const uint8_t *value, size_t len) { @@ -522,72 +455,18 @@ int nghttp2_check_header_value_rfc9113(const uint8_t *value, size_t len) { return nghttp2_check_header_value(value, len); } -/* Generated by genmethodchartbl.py */ -static char VALID_METHOD_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, - 0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, - 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, - 0 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 0 /* [ */, - 0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, - 1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, - 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, - 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, - 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, - 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, - 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, - 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, - 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, - 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, - 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, - 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, - 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, - 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, - 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, - 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, - 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, - 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, - 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, - 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, - 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, - 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, - 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, - 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, - 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, - 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, - 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, - 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, - 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, - 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, - 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, - 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, - 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, - 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ +static const uint8_t VALID_METHOD_CHARS[256] = { + ['!'] = 1, ['#'] = 1, ['$'] = 1, ['%'] = 1, ['&'] = 1, ['\''] = 1, ['*'] = 1, + ['+'] = 1, ['-'] = 1, ['.'] = 1, ['0'] = 1, ['1'] = 1, ['2'] = 1, ['3'] = 1, + ['4'] = 1, ['5'] = 1, ['6'] = 1, ['7'] = 1, ['8'] = 1, ['9'] = 1, ['A'] = 1, + ['B'] = 1, ['C'] = 1, ['D'] = 1, ['E'] = 1, ['F'] = 1, ['G'] = 1, ['H'] = 1, + ['I'] = 1, ['J'] = 1, ['K'] = 1, ['L'] = 1, ['M'] = 1, ['N'] = 1, ['O'] = 1, + ['P'] = 1, ['Q'] = 1, ['R'] = 1, ['S'] = 1, ['T'] = 1, ['U'] = 1, ['V'] = 1, + ['W'] = 1, ['X'] = 1, ['Y'] = 1, ['Z'] = 1, ['^'] = 1, ['_'] = 1, ['`'] = 1, + ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1, ['g'] = 1, + ['h'] = 1, ['i'] = 1, ['j'] = 1, ['k'] = 1, ['l'] = 1, ['m'] = 1, ['n'] = 1, + ['o'] = 1, ['p'] = 1, ['q'] = 1, ['r'] = 1, ['s'] = 1, ['t'] = 1, ['u'] = 1, + ['v'] = 1, ['w'] = 1, ['x'] = 1, ['y'] = 1, ['z'] = 1, ['|'] = 1, ['~'] = 1, }; int nghttp2_check_method(const uint8_t *value, size_t len) { @@ -603,72 +482,44 @@ int nghttp2_check_method(const uint8_t *value, size_t len) { return 1; } -/* Generated by genpathchartbl.py */ -static char VALID_PATH_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, - 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, - 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, - 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, - 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, - 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */, - 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */, - 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */, - 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, - 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, - 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, - 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */, - 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */, - 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, - 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, - 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, - 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */, - 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */, - 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, - 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, - 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, - 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */, - 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */, - 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, - 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, - 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, - 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */, - 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */, - 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, - 1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, - 1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, - 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */, - 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */, - 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, - 1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, - 1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, - 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */, - 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */ +static const uint8_t VALID_PATH_CHARS[256] = { + ['!'] = 1, ['"'] = 1, ['#'] = 1, ['$'] = 1, ['%'] = 1, ['&'] = 1, + ['\''] = 1, ['('] = 1, [')'] = 1, ['*'] = 1, ['+'] = 1, [','] = 1, + ['-'] = 1, ['.'] = 1, ['/'] = 1, ['0'] = 1, ['1'] = 1, ['2'] = 1, + ['3'] = 1, ['4'] = 1, ['5'] = 1, ['6'] = 1, ['7'] = 1, ['8'] = 1, + ['9'] = 1, [':'] = 1, [';'] = 1, ['<'] = 1, ['='] = 1, ['>'] = 1, + ['?'] = 1, ['@'] = 1, ['A'] = 1, ['B'] = 1, ['C'] = 1, ['D'] = 1, + ['E'] = 1, ['F'] = 1, ['G'] = 1, ['H'] = 1, ['I'] = 1, ['J'] = 1, + ['K'] = 1, ['L'] = 1, ['M'] = 1, ['N'] = 1, ['O'] = 1, ['P'] = 1, + ['Q'] = 1, ['R'] = 1, ['S'] = 1, ['T'] = 1, ['U'] = 1, ['V'] = 1, + ['W'] = 1, ['X'] = 1, ['Y'] = 1, ['Z'] = 1, ['['] = 1, ['\\'] = 1, + [']'] = 1, ['^'] = 1, ['_'] = 1, ['`'] = 1, ['a'] = 1, ['b'] = 1, + ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1, ['g'] = 1, ['h'] = 1, + ['i'] = 1, ['j'] = 1, ['k'] = 1, ['l'] = 1, ['m'] = 1, ['n'] = 1, + ['o'] = 1, ['p'] = 1, ['q'] = 1, ['r'] = 1, ['s'] = 1, ['t'] = 1, + ['u'] = 1, ['v'] = 1, ['w'] = 1, ['x'] = 1, ['y'] = 1, ['z'] = 1, + ['{'] = 1, ['|'] = 1, ['}'] = 1, ['~'] = 1, [0x80] = 1, [0x81] = 1, + [0x82] = 1, [0x83] = 1, [0x84] = 1, [0x85] = 1, [0x86] = 1, [0x87] = 1, + [0x88] = 1, [0x89] = 1, [0x8A] = 1, [0x8B] = 1, [0x8C] = 1, [0x8D] = 1, + [0x8E] = 1, [0x8F] = 1, [0x90] = 1, [0x91] = 1, [0x92] = 1, [0x93] = 1, + [0x94] = 1, [0x95] = 1, [0x96] = 1, [0x97] = 1, [0x98] = 1, [0x99] = 1, + [0x9A] = 1, [0x9B] = 1, [0x9C] = 1, [0x9D] = 1, [0x9E] = 1, [0x9F] = 1, + [0xA0] = 1, [0xA1] = 1, [0xA2] = 1, [0xA3] = 1, [0xA4] = 1, [0xA5] = 1, + [0xA6] = 1, [0xA7] = 1, [0xA8] = 1, [0xA9] = 1, [0xAA] = 1, [0xAB] = 1, + [0xAC] = 1, [0xAD] = 1, [0xAE] = 1, [0xAF] = 1, [0xB0] = 1, [0xB1] = 1, + [0xB2] = 1, [0xB3] = 1, [0xB4] = 1, [0xB5] = 1, [0xB6] = 1, [0xB7] = 1, + [0xB8] = 1, [0xB9] = 1, [0xBA] = 1, [0xBB] = 1, [0xBC] = 1, [0xBD] = 1, + [0xBE] = 1, [0xBF] = 1, [0xC0] = 1, [0xC1] = 1, [0xC2] = 1, [0xC3] = 1, + [0xC4] = 1, [0xC5] = 1, [0xC6] = 1, [0xC7] = 1, [0xC8] = 1, [0xC9] = 1, + [0xCA] = 1, [0xCB] = 1, [0xCC] = 1, [0xCD] = 1, [0xCE] = 1, [0xCF] = 1, + [0xD0] = 1, [0xD1] = 1, [0xD2] = 1, [0xD3] = 1, [0xD4] = 1, [0xD5] = 1, + [0xD6] = 1, [0xD7] = 1, [0xD8] = 1, [0xD9] = 1, [0xDA] = 1, [0xDB] = 1, + [0xDC] = 1, [0xDD] = 1, [0xDE] = 1, [0xDF] = 1, [0xE0] = 1, [0xE1] = 1, + [0xE2] = 1, [0xE3] = 1, [0xE4] = 1, [0xE5] = 1, [0xE6] = 1, [0xE7] = 1, + [0xE8] = 1, [0xE9] = 1, [0xEA] = 1, [0xEB] = 1, [0xEC] = 1, [0xED] = 1, + [0xEE] = 1, [0xEF] = 1, [0xF0] = 1, [0xF1] = 1, [0xF2] = 1, [0xF3] = 1, + [0xF4] = 1, [0xF5] = 1, [0xF6] = 1, [0xF7] = 1, [0xF8] = 1, [0xF9] = 1, + [0xFA] = 1, [0xFB] = 1, [0xFC] = 1, [0xFD] = 1, [0xFE] = 1, [0xFF] = 1, }; int nghttp2_check_path(const uint8_t *value, size_t len) { @@ -681,72 +532,19 @@ int nghttp2_check_path(const uint8_t *value, size_t len) { return 1; } -/* Generated by genauthoritychartbl.py */ -static char VALID_AUTHORITY_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, - 1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, - 0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */, - 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, - 0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */, - 0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, - 0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, - 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, - 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, - 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, - 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, - 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, - 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, - 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, - 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, - 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, - 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, - 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, - 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, - 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, - 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, - 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, - 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, - 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, - 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, - 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, - 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, - 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, - 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, - 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, - 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, - 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, - 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, - 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, - 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, - 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, - 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, - 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, - 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ +static const uint8_t VALID_AUTHORITY_CHARS[256] = { + ['!'] = 1, ['$'] = 1, ['%'] = 1, ['&'] = 1, ['\''] = 1, ['('] = 1, [')'] = 1, + ['*'] = 1, ['+'] = 1, [','] = 1, ['-'] = 1, ['.'] = 1, ['0'] = 1, ['1'] = 1, + ['2'] = 1, ['3'] = 1, ['4'] = 1, ['5'] = 1, ['6'] = 1, ['7'] = 1, ['8'] = 1, + ['9'] = 1, [':'] = 1, [';'] = 1, ['='] = 1, ['@'] = 1, ['A'] = 1, ['B'] = 1, + ['C'] = 1, ['D'] = 1, ['E'] = 1, ['F'] = 1, ['G'] = 1, ['H'] = 1, ['I'] = 1, + ['J'] = 1, ['K'] = 1, ['L'] = 1, ['M'] = 1, ['N'] = 1, ['O'] = 1, ['P'] = 1, + ['Q'] = 1, ['R'] = 1, ['S'] = 1, ['T'] = 1, ['U'] = 1, ['V'] = 1, ['W'] = 1, + ['X'] = 1, ['Y'] = 1, ['Z'] = 1, ['['] = 1, [']'] = 1, ['_'] = 1, ['a'] = 1, + ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1, ['g'] = 1, ['h'] = 1, + ['i'] = 1, ['j'] = 1, ['k'] = 1, ['l'] = 1, ['m'] = 1, ['n'] = 1, ['o'] = 1, + ['p'] = 1, ['q'] = 1, ['r'] = 1, ['s'] = 1, ['t'] = 1, ['u'] = 1, ['v'] = 1, + ['w'] = 1, ['x'] = 1, ['y'] = 1, ['z'] = 1, ['~'] = 1, }; int nghttp2_check_authority(const uint8_t *value, size_t len) { diff --git a/deps/nghttp2/lib/nghttp2_helper.h b/deps/nghttp2/lib/nghttp2_helper.h index 5fde72e370f4..1cc80916dbad 100644 --- a/deps/nghttp2/lib/nghttp2_helper.h +++ b/deps/nghttp2/lib/nghttp2_helper.h @@ -100,6 +100,16 @@ uint32_t nghttp2_get_uint32(const uint8_t *data); void nghttp2_downcase(uint8_t *s, size_t len); +extern const uint8_t nghttp2_downcase_tbl[]; + +/* + * nghttp2_downcase_byte returns the lower case version of |c| if 'A' + * <= |c| && |c| <= 'Z'. Otherwise, it returns |c|. + */ +static inline uint8_t nghttp2_downcase_byte(uint8_t c) { + return nghttp2_downcase_tbl[c]; +} + /* * Adjusts |*local_window_size_ptr|, |*recv_window_size_ptr|, * |*recv_reduction_ptr| with |*delta_ptr| which is the @@ -150,4 +160,12 @@ int nghttp2_should_send_window_update(int32_t local_window_size, */ uint8_t *nghttp2_cpymem(uint8_t *dest, const void *src, size_t len); +/* + * nghttp2_check_nonempty_header_name validates regular header name + * pointed by |name| of length |len|. |len| must be greater than + * zero. This function returns 1 if it succeeds, or 2 if the name + * contains a character in [A-Z], otherwise 0. + */ +int nghttp2_check_nonempty_header_name(const uint8_t *name, size_t len); + #endif /* !defined(NGHTTP2_HELPER_H) */ diff --git a/deps/nghttp2/lib/nghttp2_http.c b/deps/nghttp2/lib/nghttp2_http.c index a09005e80787..bcbbde3e7586 100644 --- a/deps/nghttp2/lib/nghttp2_http.c +++ b/deps/nghttp2/lib/nghttp2_http.c @@ -33,16 +33,17 @@ #include "nghttp2_extpri.h" #include "sfparse.h" -static uint8_t downcase(uint8_t c) { - return 'A' <= c && c <= 'Z' ? (uint8_t)(c - 'A' + 'a') : c; -} - +/* + * memieq returns nonzero if the data pointed by |a| of length |n| + * equals to |b| of the same length in case-insensitive manner. The + * data pointed by |a| must not include upper cased letters (A-Z). + */ static int memieq(const void *a, const void *b, size_t n) { size_t i; const uint8_t *aa = a, *bb = b; for (i = 0; i < n; ++i) { - if (downcase(aa[i]) != downcase(bb[i])) { + if (aa[i] != nghttp2_downcase_byte(bb[i])) { return 0; } } @@ -52,27 +53,39 @@ static int memieq(const void *a, const void *b, size_t n) { #define lstrieq(A, B, N) \ (nghttp2_strlen_lit((A)) == (N) && memieq((A), (B), (N))) +static int32_t parse_status_code(const uint8_t *s, size_t len) { + if (len != 3 || '1' > s[0] || s[0] > '9' || '0' > s[1] || s[1] > '9' || + '0' > s[2] || s[2] > '9') { + return -1; + } + + return (s[0] - '0') * 100 + (s[1] - '0') * 10 + (s[2] - '0'); +} + static int64_t parse_uint(const uint8_t *s, size_t len) { - int64_t n = 0; + uint64_t n = 0; + uint32_t c; size_t i; + if (len == 0) { return -1; } + for (i = 0; i < len; ++i) { - if ('0' <= s[i] && s[i] <= '9') { - if (n > INT64_MAX / 10) { - return -1; - } - n *= 10; - if (n > INT64_MAX - (s[i] - '0')) { - return -1; - } - n += s[i] - '0'; - continue; + if ('0' > s[i] || s[i] > '9') { + return -1; } - return -1; + + c = s[i] - '0'; + + if (n > ((uint64_t)INT64_MAX - c) / 10) { + return -1; + } + + n = n * 10 + c; } - return n; + + return (int64_t)n; } static int check_pseudo_header(nghttp2_stream *stream, const nghttp2_hd_nv *nv, @@ -102,25 +115,90 @@ static int check_path(nghttp2_stream *stream) { (stream->http_flags & NGHTTP2_HTTP_FLAG_PATH_ASTERISK))); } -static int http_request_on_header(nghttp2_stream *stream, nghttp2_hd_nv *nv, - int trailer, int connect_protocol) { - nghttp2_extpri extpri; +static int check_scheme(const uint8_t *value, size_t len) { + const uint8_t *last; + if (len == 0) { + return 0; + } - if (nv->name->base[0] == ':') { - if (trailer || - (stream->http_flags & NGHTTP2_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED)) { - return NGHTTP2_ERR_HTTP_HEADER; + if (!(('A' <= *value && *value <= 'Z') || ('a' <= *value && *value <= 'z'))) { + return 0; + } + + last = value + len; + ++value; + + for (; value != last; ++value) { + if (!(('A' <= *value && *value <= 'Z') || + ('a' <= *value && *value <= 'z') || + ('0' <= *value && *value <= '9') || *value == '+' || *value == '-' || + *value == '.')) { + return 0; } } + return 1; +} + +static int lws(const uint8_t *s, size_t n) { + size_t i; + for (i = 0; i < n; ++i) { + if (s[i] != ' ' && s[i] != '\t') { + return 0; + } + } + return 1; +} + +/* Same as the array in nghttp2_helper.c, but '@' is not allowed */ +static const uint8_t VALID_AUTHORITY_CHARS[256] = { + ['!'] = 1, ['$'] = 1, ['%'] = 1, ['&'] = 1, ['\''] = 1, ['('] = 1, [')'] = 1, + ['*'] = 1, ['+'] = 1, [','] = 1, ['-'] = 1, ['.'] = 1, ['0'] = 1, ['1'] = 1, + ['2'] = 1, ['3'] = 1, ['4'] = 1, ['5'] = 1, ['6'] = 1, ['7'] = 1, ['8'] = 1, + ['9'] = 1, [':'] = 1, [';'] = 1, ['='] = 1, ['A'] = 1, ['B'] = 1, ['C'] = 1, + ['D'] = 1, ['E'] = 1, ['F'] = 1, ['G'] = 1, ['H'] = 1, ['I'] = 1, ['J'] = 1, + ['K'] = 1, ['L'] = 1, ['M'] = 1, ['N'] = 1, ['O'] = 1, ['P'] = 1, ['Q'] = 1, + ['R'] = 1, ['S'] = 1, ['T'] = 1, ['U'] = 1, ['V'] = 1, ['W'] = 1, ['X'] = 1, + ['Y'] = 1, ['Z'] = 1, ['['] = 1, [']'] = 1, ['_'] = 1, ['a'] = 1, ['b'] = 1, + ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1, ['g'] = 1, ['h'] = 1, ['i'] = 1, + ['j'] = 1, ['k'] = 1, ['l'] = 1, ['m'] = 1, ['n'] = 1, ['o'] = 1, ['p'] = 1, + ['q'] = 1, ['r'] = 1, ['s'] = 1, ['t'] = 1, ['u'] = 1, ['v'] = 1, ['w'] = 1, + ['x'] = 1, ['y'] = 1, ['z'] = 1, ['~'] = 1, +}; + +static int check_authority(const uint8_t *value, size_t len) { + const uint8_t *last; + for (last = value + len; value != last; ++value) { + if (!VALID_AUTHORITY_CHARS[*value]) { + return 0; + } + } + return 1; +} + +static int check_header_value(const nghttp2_stream *stream, + const nghttp2_rcbuf *value) { + if (stream->flags & + NGHTTP2_STREAM_FLAG_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION) { + return nghttp2_check_header_value(value->base, value->len); + } + + return nghttp2_check_header_value_rfc9113(value->base, value->len); +} + +static int http_request_on_header(nghttp2_stream *stream, nghttp2_hd_nv *nv, + int trailer, int connect_protocol) { + nghttp2_extpri extpri; switch (nv->token) { case NGHTTP2_TOKEN__AUTHORITY: - if (!check_pseudo_header(stream, nv, NGHTTP2_HTTP_FLAG__AUTHORITY)) { + if (!check_authority(nv->value->base, nv->value->len) || + !check_pseudo_header(stream, nv, NGHTTP2_HTTP_FLAG__AUTHORITY)) { return NGHTTP2_ERR_HTTP_HEADER; } break; case NGHTTP2_TOKEN__METHOD: - if (!check_pseudo_header(stream, nv, NGHTTP2_HTTP_FLAG__METHOD)) { + if (!nghttp2_check_method(nv->value->base, nv->value->len) || + !check_pseudo_header(stream, nv, NGHTTP2_HTTP_FLAG__METHOD)) { return NGHTTP2_ERR_HTTP_HEADER; } switch (nv->value->len) { @@ -150,7 +228,8 @@ static int http_request_on_header(nghttp2_stream *stream, nghttp2_hd_nv *nv, } break; case NGHTTP2_TOKEN__PATH: - if (!check_pseudo_header(stream, nv, NGHTTP2_HTTP_FLAG__PATH)) { + if (!nghttp2_check_path(nv->value->base, nv->value->len) || + !check_pseudo_header(stream, nv, NGHTTP2_HTTP_FLAG__PATH)) { return NGHTTP2_ERR_HTTP_HEADER; } if (nv->value->base[0] == '/') { @@ -160,7 +239,8 @@ static int http_request_on_header(nghttp2_stream *stream, nghttp2_hd_nv *nv, } break; case NGHTTP2_TOKEN__SCHEME: - if (!check_pseudo_header(stream, nv, NGHTTP2_HTTP_FLAG__SCHEME)) { + if (!check_scheme(nv->value->base, nv->value->len) || + !check_pseudo_header(stream, nv, NGHTTP2_HTTP_FLAG__SCHEME)) { return NGHTTP2_ERR_HTTP_HEADER; } if ((nv->value->len == 4 && memieq("http", nv->value->base, 4)) || @@ -169,15 +249,28 @@ static int http_request_on_header(nghttp2_stream *stream, nghttp2_hd_nv *nv, } break; case NGHTTP2_TOKEN__PROTOCOL: - if (!connect_protocol) { + if (!connect_protocol || + !check_pseudo_header(stream, nv, NGHTTP2_HTTP_FLAG__PROTOCOL)) { return NGHTTP2_ERR_HTTP_HEADER; } - - if (!check_pseudo_header(stream, nv, NGHTTP2_HTTP_FLAG__PROTOCOL)) { + if (stream->flags & + NGHTTP2_STREAM_FLAG_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION) { + /* Check the value consists of just white spaces, which was done + in check_pseudo_header before + nghttp2_check_header_value_rfc9113 has been introduced. */ + if (lws(nv->value->base, nv->value->len) || + !nghttp2_check_header_value(nv->value->base, nv->value->len)) { + return NGHTTP2_ERR_HTTP_HEADER; + } + } else if (!nghttp2_check_header_value_rfc9113(nv->value->base, + nv->value->len)) { return NGHTTP2_ERR_HTTP_HEADER; } break; case NGHTTP2_TOKEN_HOST: + if (!check_authority(nv->value->base, nv->value->len)) { + return NGHTTP2_ERR_IGN_HTTP_HEADER; + } if (!check_pseudo_header(stream, nv, NGHTTP2_HTTP_FLAG_HOST)) { return NGHTTP2_ERR_HTTP_HEADER; } @@ -205,6 +298,13 @@ static int http_request_on_header(nghttp2_stream *stream, nghttp2_hd_nv *nv, } break; case NGHTTP2_TOKEN_PRIORITY: + if (!check_header_value(stream, nv->value)) { + stream->http_flags &= ~NGHTTP2_HTTP_FLAG_PRIORITY; + stream->http_flags |= NGHTTP2_HTTP_FLAG_BAD_PRIORITY; + + return NGHTTP2_ERR_IGN_HTTP_HEADER; + } + if (!trailer && /* Do not parse the header field in PUSH_PROMISE. */ (stream->stream_id & 1) && @@ -215,7 +315,7 @@ static int http_request_on_header(nghttp2_stream *stream, nghttp2_hd_nv *nv, stream->http_extpri = nghttp2_extpri_to_uint8(&extpri); stream->http_flags |= NGHTTP2_HTTP_FLAG_PRIORITY; } else { - stream->http_flags &= (uint32_t)~NGHTTP2_HTTP_FLAG_PRIORITY; + stream->http_flags &= ~NGHTTP2_HTTP_FLAG_PRIORITY; stream->http_flags |= NGHTTP2_HTTP_FLAG_BAD_PRIORITY; } } @@ -224,33 +324,22 @@ static int http_request_on_header(nghttp2_stream *stream, nghttp2_hd_nv *nv, if (nv->name->base[0] == ':') { return NGHTTP2_ERR_HTTP_HEADER; } - } - if (nv->name->base[0] != ':') { - stream->http_flags |= NGHTTP2_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED; + if (!check_header_value(stream, nv->value)) { + return NGHTTP2_ERR_IGN_HTTP_HEADER; + } } return 0; } -static int http_response_on_header(nghttp2_stream *stream, nghttp2_hd_nv *nv, - int trailer) { - if (nv->name->base[0] == ':') { - if (trailer || - (stream->http_flags & NGHTTP2_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED)) { - return NGHTTP2_ERR_HTTP_HEADER; - } - } - +static int http_response_on_header(nghttp2_stream *stream, nghttp2_hd_nv *nv) { switch (nv->token) { case NGHTTP2_TOKEN__STATUS: { if (!check_pseudo_header(stream, nv, NGHTTP2_HTTP_FLAG__STATUS)) { return NGHTTP2_ERR_HTTP_HEADER; } - if (nv->value->len != 3) { - return NGHTTP2_ERR_HTTP_HEADER; - } - stream->status_code = (int16_t)parse_uint(nv->value->base, nv->value->len); + stream->status_code = parse_status_code(nv->value->base, nv->value->len); if (stream->status_code == -1 || stream->status_code == 101) { return NGHTTP2_ERR_HTTP_HEADER; } @@ -304,132 +393,18 @@ static int http_response_on_header(nghttp2_stream *stream, nghttp2_hd_nv *nv, if (nv->name->base[0] == ':') { return NGHTTP2_ERR_HTTP_HEADER; } - } - - if (nv->name->base[0] != ':') { - stream->http_flags |= NGHTTP2_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED; - } - - return 0; -} - -static int check_scheme(const uint8_t *value, size_t len) { - const uint8_t *last; - if (len == 0) { - return 0; - } - - if (!(('A' <= *value && *value <= 'Z') || ('a' <= *value && *value <= 'z'))) { - return 0; - } - - last = value + len; - ++value; - - for (; value != last; ++value) { - if (!(('A' <= *value && *value <= 'Z') || - ('a' <= *value && *value <= 'z') || - ('0' <= *value && *value <= '9') || *value == '+' || *value == '-' || - *value == '.')) { - return 0; - } - } - return 1; -} -static int lws(const uint8_t *s, size_t n) { - size_t i; - for (i = 0; i < n; ++i) { - if (s[i] != ' ' && s[i] != '\t') { - return 0; + if (!check_header_value(stream, nv->value)) { + return NGHTTP2_ERR_IGN_HTTP_HEADER; } } - return 1; -} -/* Generated by genauthoritychartbl.py, but '@' is not allowed */ -static char VALID_AUTHORITY_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, - 1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, - 0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */, - 0 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, - 0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */, - 0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, - 0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, - 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, - 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, - 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, - 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, - 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, - 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, - 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, - 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, - 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, - 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, - 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, - 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, - 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, - 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, - 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, - 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, - 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, - 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, - 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, - 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, - 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, - 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, - 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, - 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, - 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, - 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, - 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, - 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, - 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, - 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, - 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, - 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ -}; - -static int check_authority(const uint8_t *value, size_t len) { - const uint8_t *last; - for (last = value + len; value != last; ++value) { - if (!VALID_AUTHORITY_CHARS[*value]) { - return 0; - } - } - return 1; + return 0; } int nghttp2_http_on_header(nghttp2_session *session, nghttp2_stream *stream, - nghttp2_frame *frame, nghttp2_hd_nv *nv, + const nghttp2_frame *frame, nghttp2_hd_nv *nv, int trailer) { - int rv; - /* We are strict for pseudo header field. One bad character should lead to fail. OTOH, we should be a bit forgiving for regular headers, since existing public internet has so much illegal @@ -437,86 +412,38 @@ int nghttp2_http_on_header(nghttp2_session *session, nghttp2_stream *stream, this, we may disrupt many web sites and/or libraries. So we become conservative here, and just ignore those illegal regular headers. */ - if (!nghttp2_check_header_name(nv->name->base, nv->name->len)) { - size_t i; - if (nv->name->len > 0 && nv->name->base[0] == ':') { - return NGHTTP2_ERR_HTTP_HEADER; - } - /* header field name must be lower-cased without exception */ - for (i = 0; i < nv->name->len; ++i) { - uint8_t c = nv->name->base[i]; - if ('A' <= c && c <= 'Z') { - return NGHTTP2_ERR_HTTP_HEADER; - } - } - /* When ignoring regular headers, we set this flag so that we - still enforce header field ordering rule for pseudo header - fields. */ + if (nv->name->len == 0) { stream->http_flags |= NGHTTP2_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED; return NGHTTP2_ERR_IGN_HTTP_HEADER; } - switch (nv->token) { - case NGHTTP2_TOKEN__METHOD: - rv = nghttp2_check_method(nv->value->base, nv->value->len); - break; - case NGHTTP2_TOKEN__PATH: - rv = nghttp2_check_path(nv->value->base, nv->value->len); - break; - case NGHTTP2_TOKEN__AUTHORITY: - case NGHTTP2_TOKEN_HOST: - if (session->server || frame->hd.type == NGHTTP2_PUSH_PROMISE) { - rv = check_authority(nv->value->base, nv->value->len); - } else if ( - stream->flags & - NGHTTP2_STREAM_FLAG_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION) { - rv = nghttp2_check_header_value(nv->value->base, nv->value->len); - } else { - rv = nghttp2_check_header_value_rfc9113(nv->value->base, nv->value->len); - } - break; - case NGHTTP2_TOKEN__SCHEME: - rv = check_scheme(nv->value->base, nv->value->len); - break; - case NGHTTP2_TOKEN__PROTOCOL: - /* Check the value consists of just white spaces, which was done - in check_pseudo_header before - nghttp2_check_header_value_rfc9113 has been introduced. */ - if ((stream->flags & - NGHTTP2_STREAM_FLAG_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION) && - lws(nv->value->base, nv->value->len)) { - rv = 0; - break; - } - /* fall through */ - default: - if (stream->flags & - NGHTTP2_STREAM_FLAG_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION) { - rv = nghttp2_check_header_value(nv->value->base, nv->value->len); - } else { - rv = nghttp2_check_header_value_rfc9113(nv->value->base, nv->value->len); + if (nv->name->base[0] == ':') { + /* pseudo header must have a valid token. */ + if (nv->token == -1 || trailer || + (stream->http_flags & NGHTTP2_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED)) { + return NGHTTP2_ERR_HTTP_HEADER; } - } + } else { + stream->http_flags |= NGHTTP2_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED; - if (rv == 0) { - assert(nv->name->len > 0); - if (nv->name->base[0] == ':') { + switch (nghttp2_check_nonempty_header_name(nv->name->base, nv->name->len)) { + case 0: + return NGHTTP2_ERR_IGN_HTTP_HEADER; + case 2: + /* header field name must be lower-cased without exception */ return NGHTTP2_ERR_HTTP_HEADER; } - /* When ignoring regular headers, we set this flag so that we - still enforce header field ordering rule for pseudo header - fields. */ - stream->http_flags |= NGHTTP2_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED; - return NGHTTP2_ERR_IGN_HTTP_HEADER; } + assert(nv->name->len > 0); + if (session->server || frame->hd.type == NGHTTP2_PUSH_PROMISE) { return http_request_on_header(stream, nv, trailer, session->server && session->pending_enable_connect_protocol); } - return http_response_on_header(stream, nv, trailer); + return http_response_on_header(stream, nv); } int nghttp2_http_on_request_headers(nghttp2_stream *stream, @@ -571,7 +498,7 @@ int nghttp2_http_on_response_headers(nghttp2_stream *stream) { } stream->http_flags = - stream->http_flags & (uint32_t)~NGHTTP2_HTTP_FLAG_EXPECT_FINAL_RESPONSE; + stream->http_flags & ~NGHTTP2_HTTP_FLAG_EXPECT_FINAL_RESPONSE; if (!expect_response_body(stream)) { stream->content_length = 0; diff --git a/deps/nghttp2/lib/nghttp2_http.h b/deps/nghttp2/lib/nghttp2_http.h index 2925334c0b64..b26d7898b231 100644 --- a/deps/nghttp2/lib/nghttp2_http.h +++ b/deps/nghttp2/lib/nghttp2_http.h @@ -48,7 +48,7 @@ * if it was not received because of compatibility reasons. */ int nghttp2_http_on_header(nghttp2_session *session, nghttp2_stream *stream, - nghttp2_frame *frame, nghttp2_hd_nv *nv, + const nghttp2_frame *frame, nghttp2_hd_nv *nv, int trailer); /* diff --git a/deps/nghttp2/lib/nghttp2_map.c b/deps/nghttp2/lib/nghttp2_map.c index 3b703a029328..b1b1c93c03ad 100644 --- a/deps/nghttp2/lib/nghttp2_map.c +++ b/deps/nghttp2/lib/nghttp2_map.c @@ -77,10 +77,10 @@ int nghttp2_map_each(const nghttp2_map *map, int (*func)(void *data, void *ptr), /* Hasher from https://github.com/rust-lang/rustc-hash/blob/dc5c33f1283de2da64d8d7a06401d91aded03ad4/src/lib.rs to maximize the output's sensitivity to all input bits. */ -#define NGHTTP2_MAP_HASHER 0xf1357aea2e62a9c5ull +#define NGHTTP2_MAP_HASHER 0xF1357AEA2E62A9C5ULL /* 64-bit Fibonacci hashing constant, Golden Ratio constant, to get the high bits with the good distribution. */ -#define NGHTTP2_MAP_FIBO 0x9e3779b97f4a7c15ull +#define NGHTTP2_MAP_FIBO 0x9E3779B97F4A7C15ULL static size_t map_index(const nghttp2_map *map, nghttp2_map_key_type key32) { uint64_t key = (uint64_t)key32; diff --git a/deps/nghttp2/lib/nghttp2_mem.c b/deps/nghttp2/lib/nghttp2_mem.c index 6a449cffd701..ed7c06a6aa1b 100644 --- a/deps/nghttp2/lib/nghttp2_mem.c +++ b/deps/nghttp2/lib/nghttp2_mem.c @@ -48,8 +48,12 @@ static void *default_realloc(void *ptr, size_t size, void *mem_user_data) { return realloc(ptr, size); } -static nghttp2_mem mem_default = {NULL, default_malloc, default_free, - default_calloc, default_realloc}; +static nghttp2_mem mem_default = { + .malloc = default_malloc, + .free = default_free, + .calloc = default_calloc, + .realloc = default_realloc, +}; nghttp2_mem *nghttp2_mem_default(void) { return &mem_default; } diff --git a/deps/nghttp2/lib/nghttp2_net.h b/deps/nghttp2/lib/nghttp2_net.h index 0c57d9479644..ef03253bd9ce 100644 --- a/deps/nghttp2/lib/nghttp2_net.h +++ b/deps/nghttp2/lib/nghttp2_net.h @@ -40,52 +40,14 @@ #include #ifdef WIN32 -/* Windows requires ws2_32 library for ntonl family functions. We - define inline functions for those function so that we don't have - dependency on that lib. */ - -# ifdef _MSC_VER -# define STIN static __inline -# else /* !defined(_MSC_VER) */ -# define STIN static inline -# endif /* !defined(_MSC_VER) */ - -STIN uint32_t htonl(uint32_t hostlong) { - uint32_t res; - unsigned char *p = (unsigned char *)&res; - *p++ = (unsigned char)(hostlong >> 24); - *p++ = (hostlong >> 16) & 0xffu; - *p++ = (hostlong >> 8) & 0xffu; - *p = hostlong & 0xffu; - return res; -} - -STIN uint16_t htons(uint16_t hostshort) { - uint16_t res; - unsigned char *p = (unsigned char *)&res; - *p++ = (unsigned char)(hostshort >> 8); - *p = hostshort & 0xffu; - return res; -} - -STIN uint32_t ntohl(uint32_t netlong) { - uint32_t res; - unsigned char *p = (unsigned char *)&netlong; - res = (uint32_t)(*p++ << 24); - res += (uint32_t)(*p++ << 16); - res += (uint32_t)(*p++ << 8); - res += *p; - return res; -} - -STIN uint16_t ntohs(uint16_t netshort) { - uint16_t res; - unsigned char *p = (unsigned char *)&netshort; - res = (uint16_t)(*p++ << 8); - res += *p; - return res; -} - +/* Windows requires ws2_32 library for ntonl family of functions. + Instead of using them, use _byteswap_* functions. This is fine + because all platforms that can run Windows these days are little + endian. */ +# define htonl(N) _byteswap_ulong(N) +# define htons(N) _byteswap_ushort(N) +# define ntohl(N) _byteswap_ulong(N) +# define ntohs(N) _byteswap_ushort(N) #endif /* defined(WIN32) */ #endif /* !defined(NGHTTP2_NET_H) */ diff --git a/deps/nghttp2/lib/nghttp2_option.h b/deps/nghttp2/lib/nghttp2_option.h index 711185ba2f8e..db739b609edf 100644 --- a/deps/nghttp2/lib/nghttp2_option.h +++ b/deps/nghttp2/lib/nghttp2_option.h @@ -34,46 +34,45 @@ /** * Configuration options */ -typedef enum { - /** - * This option prevents the library from sending WINDOW_UPDATE for a - * connection automatically. If this option is set to nonzero, the - * library won't send WINDOW_UPDATE for DATA until application calls - * nghttp2_session_consume() to indicate the amount of consumed - * DATA. By default, this option is set to zero. - */ - NGHTTP2_OPT_NO_AUTO_WINDOW_UPDATE = 1, - /** - * This option sets the SETTINGS_MAX_CONCURRENT_STREAMS value of - * remote endpoint as if it is received in SETTINGS frame. Without - * specifying this option, before the local endpoint receives - * SETTINGS_MAX_CONCURRENT_STREAMS in SETTINGS frame from remote - * endpoint, SETTINGS_MAX_CONCURRENT_STREAMS is unlimited. This may - * cause problem if local endpoint submits lots of requests - * initially and sending them at once to the remote peer may lead to - * the rejection of some requests. Specifying this option to the - * sensible value, say 100, may avoid this kind of issue. This value - * will be overwritten if the local endpoint receives - * SETTINGS_MAX_CONCURRENT_STREAMS from the remote endpoint. - */ - NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS = 1 << 1, - NGHTTP2_OPT_NO_RECV_CLIENT_MAGIC = 1 << 2, - NGHTTP2_OPT_NO_HTTP_MESSAGING = 1 << 3, - NGHTTP2_OPT_MAX_RESERVED_REMOTE_STREAMS = 1 << 4, - NGHTTP2_OPT_USER_RECV_EXT_TYPES = 1 << 5, - NGHTTP2_OPT_NO_AUTO_PING_ACK = 1 << 6, - NGHTTP2_OPT_BUILTIN_RECV_EXT_TYPES = 1 << 7, - NGHTTP2_OPT_MAX_SEND_HEADER_BLOCK_LENGTH = 1 << 8, - NGHTTP2_OPT_MAX_DEFLATE_DYNAMIC_TABLE_SIZE = 1 << 9, - NGHTTP2_OPT_NO_CLOSED_STREAMS = 1 << 10, - NGHTTP2_OPT_MAX_OUTBOUND_ACK = 1 << 11, - NGHTTP2_OPT_MAX_SETTINGS = 1 << 12, - NGHTTP2_OPT_SERVER_FALLBACK_RFC7540_PRIORITIES = 1 << 13, - 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; + +/** + * This option prevents the library from sending WINDOW_UPDATE for a + * connection automatically. If this option is set to nonzero, the + * library won't send WINDOW_UPDATE for DATA until application calls + * nghttp2_session_consume() to indicate the amount of consumed DATA. + * By default, this option is set to zero. + */ +#define NGHTTP2_OPT_NO_AUTO_WINDOW_UPDATE 0x01U +/** + * This option sets the SETTINGS_MAX_CONCURRENT_STREAMS value of + * remote endpoint as if it is received in SETTINGS frame. Without + * specifying this option, before the local endpoint receives + * SETTINGS_MAX_CONCURRENT_STREAMS in SETTINGS frame from remote + * endpoint, SETTINGS_MAX_CONCURRENT_STREAMS is unlimited. This may + * cause problem if local endpoint submits lots of requests initially + * and sending them at once to the remote peer may lead to the + * rejection of some requests. Specifying this option to the sensible + * value, say 100, may avoid this kind of issue. This value will be + * overwritten if the local endpoint receives + * SETTINGS_MAX_CONCURRENT_STREAMS from the remote endpoint. + */ +#define NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS 0x02U +#define NGHTTP2_OPT_NO_RECV_CLIENT_MAGIC 0x04U +#define NGHTTP2_OPT_NO_HTTP_MESSAGING 0x08U +#define NGHTTP2_OPT_MAX_RESERVED_REMOTE_STREAMS 0x10U +#define NGHTTP2_OPT_USER_RECV_EXT_TYPES 0x20U +#define NGHTTP2_OPT_NO_AUTO_PING_ACK 0x40U +#define NGHTTP2_OPT_BUILTIN_RECV_EXT_TYPES 0x80U +#define NGHTTP2_OPT_MAX_SEND_HEADER_BLOCK_LENGTH 0x0100U +#define NGHTTP2_OPT_MAX_DEFLATE_DYNAMIC_TABLE_SIZE 0x0200U +#define NGHTTP2_OPT_NO_CLOSED_STREAMS 0x0400U +#define NGHTTP2_OPT_MAX_OUTBOUND_ACK 0x0800U +#define NGHTTP2_OPT_MAX_SETTINGS 0x1000U +#define NGHTTP2_OPT_SERVER_FALLBACK_RFC7540_PRIORITIES 0x2000U +#define NGHTTP2_OPT_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION 0x4000U +#define NGHTTP2_OPT_STREAM_RESET_RATE_LIMIT 0x8000U +#define NGHTTP2_OPT_MAX_CONTINUATIONS 0x010000U +#define NGHTTP2_OPT_GLITCH_RATE_LIMIT 0x020000U /** * Struct to store option values for nghttp2_session. @@ -110,8 +109,8 @@ struct nghttp2_option { */ size_t max_continuations; /** - * Bitwise OR of nghttp2_option_flag to determine that which fields - * are specified. + * Bitwise OR of NGHTTP2_OPT_* values to determine which fields are + * specified. */ uint32_t opt_set_mask; /** diff --git a/deps/nghttp2/lib/nghttp2_outbound_item.c b/deps/nghttp2/lib/nghttp2_outbound_item.c index fad1ee0a4690..d1ef716f714f 100644 --- a/deps/nghttp2/lib/nghttp2_outbound_item.c +++ b/deps/nghttp2/lib/nghttp2_outbound_item.c @@ -34,8 +34,10 @@ nghttp2_data_provider_wrap_v1(nghttp2_data_provider_wrap *dpw, return NULL; } - dpw->version = NGHTTP2_DATA_PROVIDER_V1; - dpw->data_prd.v1 = *data_prd; + *dpw = (nghttp2_data_provider_wrap){ + .version = NGHTTP2_DATA_PROVIDER_V1, + .data_prd.v1 = *data_prd, + }; return dpw; } @@ -47,8 +49,10 @@ nghttp2_data_provider_wrap_v2(nghttp2_data_provider_wrap *dpw, return NULL; } - dpw->version = NGHTTP2_DATA_PROVIDER_V2; - dpw->data_prd.v2 = *data_prd; + *dpw = (nghttp2_data_provider_wrap){ + .version = NGHTTP2_DATA_PROVIDER_V2, + .data_prd.v2 = *data_prd, + }; return dpw; } @@ -139,8 +143,7 @@ void nghttp2_outbound_item_free(nghttp2_outbound_item *item, nghttp2_mem *mem) { } void nghttp2_outbound_queue_init(nghttp2_outbound_queue *q) { - q->head = q->tail = NULL; - q->n = 0; + *q = (nghttp2_outbound_queue){0}; } void nghttp2_outbound_queue_push(nghttp2_outbound_queue *q, diff --git a/deps/nghttp2/lib/nghttp2_pq.c b/deps/nghttp2/lib/nghttp2_pq.c index e79ba8365e82..d837de3c1f6a 100644 --- a/deps/nghttp2/lib/nghttp2_pq.c +++ b/deps/nghttp2/lib/nghttp2_pq.c @@ -30,11 +30,10 @@ #include "nghttp2_helper.h" void nghttp2_pq_init(nghttp2_pq *pq, nghttp2_less less, nghttp2_mem *mem) { - pq->mem = mem; - pq->capacity = 0; - pq->q = NULL; - pq->length = 0; - pq->less = less; + *pq = (nghttp2_pq){ + .mem = mem, + .less = less, + }; } void nghttp2_pq_free(nghttp2_pq *pq) { diff --git a/deps/nghttp2/lib/nghttp2_priority_spec.c b/deps/nghttp2/lib/nghttp2_priority_spec.c index c2196e306302..11e02e733f15 100644 --- a/deps/nghttp2/lib/nghttp2_priority_spec.c +++ b/deps/nghttp2/lib/nghttp2_priority_spec.c @@ -27,15 +27,17 @@ void nghttp2_priority_spec_init(nghttp2_priority_spec *pri_spec, int32_t stream_id, int32_t weight, int exclusive) { - pri_spec->stream_id = stream_id; - pri_spec->weight = weight; - pri_spec->exclusive = exclusive != 0; + *pri_spec = (nghttp2_priority_spec){ + .stream_id = stream_id, + .weight = weight, + .exclusive = exclusive != 0, + }; } void nghttp2_priority_spec_default_init(nghttp2_priority_spec *pri_spec) { - pri_spec->stream_id = 0; - pri_spec->weight = NGHTTP2_DEFAULT_WEIGHT; - pri_spec->exclusive = 0; + *pri_spec = (nghttp2_priority_spec){ + .weight = NGHTTP2_DEFAULT_WEIGHT, + }; } int nghttp2_priority_spec_check_default(const nghttp2_priority_spec *pri_spec) { diff --git a/deps/nghttp2/lib/nghttp2_queue.c b/deps/nghttp2/lib/nghttp2_queue.c index 3b6315852459..a76fb9bf2531 100644 --- a/deps/nghttp2/lib/nghttp2_queue.c +++ b/deps/nghttp2/lib/nghttp2_queue.c @@ -27,9 +27,7 @@ #include #include -void nghttp2_queue_init(nghttp2_queue *queue) { - queue->front = queue->back = NULL; -} +void nghttp2_queue_init(nghttp2_queue *queue) { *queue = (nghttp2_queue){0}; } void nghttp2_queue_free(nghttp2_queue *queue) { if (!queue) { @@ -50,8 +48,9 @@ int nghttp2_queue_push(nghttp2_queue *queue, void *data) { if (!new_cell) { return NGHTTP2_ERR_NOMEM; } - new_cell->data = data; - new_cell->next = NULL; + *new_cell = (nghttp2_queue_cell){ + .data = data, + }; if (queue->back) { queue->back->next = new_cell; queue->back = new_cell; diff --git a/deps/nghttp2/lib/nghttp2_ratelim.c b/deps/nghttp2/lib/nghttp2_ratelim.c index 604ac0801a7a..797eaf5b4203 100644 --- a/deps/nghttp2/lib/nghttp2_ratelim.c +++ b/deps/nghttp2/lib/nghttp2_ratelim.c @@ -26,9 +26,11 @@ #include "nghttp2_helper.h" void nghttp2_ratelim_init(nghttp2_ratelim *rl, uint64_t burst, uint64_t rate) { - rl->val = rl->burst = burst; - rl->rate = rate; - rl->tstamp = 0; + *rl = (nghttp2_ratelim){ + .burst = burst, + .rate = rate, + .val = burst, + }; } void nghttp2_ratelim_update(nghttp2_ratelim *rl, uint64_t tstamp) { diff --git a/deps/nghttp2/lib/nghttp2_rcbuf.c b/deps/nghttp2/lib/nghttp2_rcbuf.c index 7e7814d2d3ca..a05493b7887f 100644 --- a/deps/nghttp2/lib/nghttp2_rcbuf.c +++ b/deps/nghttp2/lib/nghttp2_rcbuf.c @@ -41,11 +41,13 @@ int nghttp2_rcbuf_new(nghttp2_rcbuf **rcbuf_ptr, size_t size, *rcbuf_ptr = (void *)p; - (*rcbuf_ptr)->mem_user_data = mem->mem_user_data; - (*rcbuf_ptr)->free = mem->free; - (*rcbuf_ptr)->base = p + sizeof(nghttp2_rcbuf); - (*rcbuf_ptr)->len = size; - (*rcbuf_ptr)->ref = 1; + **rcbuf_ptr = (nghttp2_rcbuf){ + .mem_user_data = mem->mem_user_data, + .free = mem->free, + .base = p + sizeof(nghttp2_rcbuf), + .len = size, + .ref = 1, + }; return 0; } diff --git a/deps/nghttp2/lib/nghttp2_session.c b/deps/nghttp2/lib/nghttp2_session.c index 19e0b767c163..f4c2afc8009f 100644 --- a/deps/nghttp2/lib/nghttp2_session.c +++ b/deps/nghttp2/lib/nghttp2_session.c @@ -392,13 +392,15 @@ static void session_inbound_frame_reset(nghttp2_session *session) { } static void init_settings(nghttp2_settings_storage *settings) { - settings->header_table_size = NGHTTP2_HD_DEFAULT_MAX_BUFFER_SIZE; - settings->enable_push = 1; - settings->max_concurrent_streams = NGHTTP2_DEFAULT_MAX_CONCURRENT_STREAMS; - settings->initial_window_size = NGHTTP2_INITIAL_WINDOW_SIZE; - settings->max_frame_size = NGHTTP2_MAX_FRAME_SIZE_MIN; - settings->max_header_list_size = UINT32_MAX; - settings->no_rfc7540_priorities = UINT32_MAX; + *settings = (nghttp2_settings_storage){ + .header_table_size = NGHTTP2_HD_DEFAULT_MAX_BUFFER_SIZE, + .enable_push = 1, + .max_concurrent_streams = NGHTTP2_DEFAULT_MAX_CONCURRENT_STREAMS, + .initial_window_size = NGHTTP2_INITIAL_WINDOW_SIZE, + .max_frame_size = NGHTTP2_MAX_FRAME_SIZE_MIN, + .max_header_list_size = UINT32_MAX, + .no_rfc7540_priorities = UINT32_MAX, + }; } static void active_outbound_item_reset(nghttp2_active_outbound_item *aob, @@ -1979,9 +1981,9 @@ static int session_prep_frame(nghttp2_session *session, rv = nghttp2_session_predicate_data_send(session, stream); if (rv != 0) { - // If stream was already closed, nghttp2_session_get_stream() - // returns NULL, but item is still attached to the stream. - // Search stream including closed again. + /* If stream was already closed, nghttp2_session_get_stream() + returns NULL, but item is still attached to the stream. + Search stream including closed again. */ stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id); if (stream) { session_detach_stream_item(session, stream); @@ -4176,14 +4178,13 @@ static int update_remote_initial_window_size_func(void *entry, void *ptr) { static int session_update_remote_initial_window_size(nghttp2_session *session, int32_t new_initial_window_size) { - nghttp2_update_window_size_arg arg; - - arg.session = session; - arg.new_window_size = new_initial_window_size; - arg.old_window_size = (int32_t)session->remote_settings.initial_window_size; - - return nghttp2_map_each(&session->streams, - update_remote_initial_window_size_func, &arg); + return nghttp2_map_each( + &session->streams, update_remote_initial_window_size_func, + &(nghttp2_update_window_size_arg){ + .session = session, + .new_window_size = new_initial_window_size, + .old_window_size = (int32_t)session->remote_settings.initial_window_size, + }); } static int update_local_initial_window_size_func(void *entry, void *ptr) { @@ -4236,12 +4237,13 @@ static int session_update_local_initial_window_size(nghttp2_session *session, int32_t new_initial_window_size, int32_t old_initial_window_size) { - nghttp2_update_window_size_arg arg; - arg.session = session; - arg.new_window_size = new_initial_window_size; - arg.old_window_size = old_initial_window_size; return nghttp2_map_each(&session->streams, - update_local_initial_window_size_func, &arg); + update_local_initial_window_size_func, + &(nghttp2_update_window_size_arg){ + .session = session, + .new_window_size = new_initial_window_size, + .old_window_size = old_initial_window_size, + }); } /* @@ -5988,7 +5990,7 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, iframe->frame.ext.payload = &iframe->ext_frame_payload.origin; if (session->server || iframe->frame.hd.stream_id || - (iframe->frame.hd.flags & 0xf0)) { + (iframe->frame.hd.flags & 0xF0)) { /* Receiving too frequent invalid frames is suspicious. */ rv = session_update_glitch_ratelim(session); @@ -6636,10 +6638,6 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, } #endif /* defined(DEBUGBUILD) */ - if (++session->num_continuations > session->max_continuations) { - return NGHTTP2_ERR_TOO_MANY_CONTINUATIONS; - } - readlen = inbound_frame_buf_read(iframe, in, last); in += readlen; @@ -6669,6 +6667,10 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, return (nghttp2_ssize)inlen; } + if (++session->num_continuations > session->max_continuations) { + return NGHTTP2_ERR_TOO_MANY_CONTINUATIONS; + } + /* CONTINUATION won't bear NGHTTP2_PADDED flag */ iframe->frame.hd.flags = diff --git a/deps/nghttp2/lib/nghttp2_session.h b/deps/nghttp2/lib/nghttp2_session.h index cab30687c075..1b04464cda8e 100644 --- a/deps/nghttp2/lib/nghttp2_session.h +++ b/deps/nghttp2/lib/nghttp2_session.h @@ -50,24 +50,20 @@ extern nghttp2_stream nghttp2_stream_root; /* * Option flags. */ -typedef enum { - NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE = 1 << 0, - NGHTTP2_OPTMASK_NO_RECV_CLIENT_MAGIC = 1 << 1, - NGHTTP2_OPTMASK_NO_HTTP_MESSAGING = 1 << 2, - NGHTTP2_OPTMASK_NO_AUTO_PING_ACK = 1 << 3, - NGHTTP2_OPTMASK_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION = 1 << 6, -} nghttp2_optmask; +#define NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE 0x01U +#define NGHTTP2_OPTMASK_NO_RECV_CLIENT_MAGIC 0x02U +#define NGHTTP2_OPTMASK_NO_HTTP_MESSAGING 0x04U +#define NGHTTP2_OPTMASK_NO_AUTO_PING_ACK 0x08U +#define NGHTTP2_OPTMASK_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION 0x40U /* * bitmask for built-in type to enable the default handling for that * type of the frame. */ -typedef enum { - NGHTTP2_TYPEMASK_NONE = 0, - NGHTTP2_TYPEMASK_ALTSVC = 1 << 0, - NGHTTP2_TYPEMASK_ORIGIN = 1 << 1, - NGHTTP2_TYPEMASK_PRIORITY_UPDATE = 1 << 2 -} nghttp2_typemask; +#define NGHTTP2_TYPEMASK_NONE 0x00U +#define NGHTTP2_TYPEMASK_ALTSVC 0x01U +#define NGHTTP2_TYPEMASK_ORIGIN 0x02U +#define NGHTTP2_TYPEMASK_PRIORITY_UPDATE 0x04U typedef enum { NGHTTP2_OB_POP_ITEM, @@ -100,7 +96,7 @@ typedef struct { #define NGHTTP2_DEFAULT_MAX_OBQ_FLOOD_ITEM 1000 /* The default value of maximum number of concurrent streams. */ -#define NGHTTP2_DEFAULT_MAX_CONCURRENT_STREAMS 0xffffffffu +#define NGHTTP2_DEFAULT_MAX_CONCURRENT_STREAMS 0xFFFFFFFFU /* The default values for stream reset rate limiter. */ #define NGHTTP2_DEFAULT_STREAM_RESET_BURST 1000 @@ -178,19 +174,18 @@ typedef struct { uint32_t no_rfc7540_priorities; } nghttp2_settings_storage; -typedef enum { - NGHTTP2_GOAWAY_NONE = 0, - /* Flag means that connection should be terminated after sending GOAWAY. */ - NGHTTP2_GOAWAY_TERM_ON_SEND = 0x1, - /* Flag means GOAWAY to terminate session has been sent */ - NGHTTP2_GOAWAY_TERM_SENT = 0x2, - /* Flag means GOAWAY was sent */ - NGHTTP2_GOAWAY_SENT = 0x4, - /* Flag means GOAWAY was received */ - NGHTTP2_GOAWAY_RECV = 0x8, - /* Flag means GOAWAY has been submitted at least once */ - NGHTTP2_GOAWAY_SUBMITTED = 0x10 -} nghttp2_goaway_flag; +#define NGHTTP2_GOAWAY_NONE 0x00U +/* Flag means that connection should be terminated after sending + GOAWAY. */ +#define NGHTTP2_GOAWAY_TERM_ON_SEND 0x01U +/* Flag means GOAWAY to terminate session has been sent */ +#define NGHTTP2_GOAWAY_TERM_SENT 0x02U +/* Flag means GOAWAY was sent */ +#define NGHTTP2_GOAWAY_SENT 0x04U +/* Flag means GOAWAY was received */ +#define NGHTTP2_GOAWAY_RECV 0x08U +/* Flag means GOAWAY has been submitted at least once */ +#define NGHTTP2_GOAWAY_SUBMITTED 0x10U /* nghttp2_inflight_settings stores the SETTINGS entries which local endpoint has sent to the remote endpoint, and has not received ACK @@ -330,13 +325,15 @@ struct nghttp2_session { nghttp2_settings_storage remote_settings; /* Settings value of the local endpoint. */ nghttp2_settings_storage local_settings; - /* Option flags. This is bitwise-OR of 0 or more of nghttp2_optmask. */ + /* Option flags. This is bitwise-OR of 0 or more of + NGHTTP2_OPTMASK_* values. */ uint32_t opt_flags; /* Unacked local SETTINGS_MAX_CONCURRENT_STREAMS value. We use this to refuse the incoming stream if it exceeds this value. */ uint32_t pending_local_max_concurrent_stream; - /* The bitwise OR of zero or more of nghttp2_typemask to indicate - that the default handling of extension frame is enabled. */ + /* The bitwise OR of zero or more of NGHTTP2_TYPEMASK_* values to + indicate that the default handling of extension frame is + enabled. */ uint32_t builtin_recv_ext_types; /* Unacked local ENABLE_PUSH value. We use this to refuse PUSH_PROMISE before SETTINGS ACK is received. */ @@ -350,7 +347,7 @@ struct nghttp2_session { /* Nonzero if the session is server side. */ uint8_t server; /* Flags indicating GOAWAY is sent and/or received. The flags are - composed by bitwise OR-ing nghttp2_goaway_flag. */ + composed by bitwise OR-ing NGHTTP2_GOAWAY_* values. */ uint8_t goaway_flags; /* This flag is used to reduce excessive queuing of WINDOW_UPDATE to this session. The nonzero does not necessarily mean @@ -510,11 +507,11 @@ int nghttp2_session_add_settings(nghttp2_session *session, uint8_t flags, /* * Creates new stream in |session| with stream ID |stream_id|, * priority |pri_spec| and flags |flags|. The |flags| is bitwise OR - * of nghttp2_stream_flag. Since this function is called when initial - * HEADERS is sent or received, these flags are taken from it. The - * state of stream is set to |initial_state|. The |stream_user_data| - * is a pointer to the arbitrary user supplied data to be associated - * to this stream. + * of NGHTTP2_STREAM_FLAG_* values. Since this function is called + * when initial HEADERS is sent or received, these flags are taken + * from it. The state of stream is set to |initial_state|. The + * |stream_user_data| is a pointer to the arbitrary user supplied data + * to be associated to this stream. * * If |initial_state| is NGHTTP2_STREAM_RESERVED, this function sets * NGHTTP2_STREAM_FLAG_PUSH flag set. diff --git a/deps/nghttp2/lib/nghttp2_stream.c b/deps/nghttp2/lib/nghttp2_stream.c index 0f2d3658775d..5189e092a7f6 100644 --- a/deps/nghttp2/lib/nghttp2_stream.c +++ b/deps/nghttp2/lib/nghttp2_stream.c @@ -36,38 +36,25 @@ void nghttp2_stream_init(nghttp2_stream *stream, int32_t stream_id, int32_t remote_initial_window_size, int32_t local_initial_window_size, void *stream_user_data) { - stream->stream_id = stream_id; - stream->flags = flags; - stream->state = initial_state; - stream->shut_flags = NGHTTP2_SHUT_NONE; - stream->stream_user_data = stream_user_data; - stream->item = NULL; - stream->remote_window_size = remote_initial_window_size; - stream->local_window_size = local_initial_window_size; - stream->recv_window_size = 0; - stream->consumed_size = 0; - stream->recv_reduction = 0; - stream->window_update_queued = 0; - - stream->closed_next = NULL; - - stream->http_flags = NGHTTP2_HTTP_FLAG_NONE; - stream->content_length = -1; - stream->recv_content_length = 0; - stream->status_code = -1; - - stream->queued = 0; - stream->cycle = 0; - stream->pending_penalty = 0; - stream->seq = 0; - stream->last_writelen = 0; - - stream->extpri = stream->http_extpri = NGHTTP2_EXTPRI_DEFAULT_URGENCY; + *stream = (nghttp2_stream){ + .state = initial_state, + .content_length = -1, + .stream_user_data = stream_user_data, + .stream_id = stream_id, + .remote_window_size = remote_initial_window_size, + .local_window_size = local_initial_window_size, + .status_code = -1, + .http_flags = NGHTTP2_HTTP_FLAG_NONE, + .flags = flags, + .shut_flags = NGHTTP2_SHUT_NONE, + .extpri = NGHTTP2_EXTPRI_DEFAULT_URGENCY, + .http_extpri = NGHTTP2_EXTPRI_DEFAULT_URGENCY, + }; } void nghttp2_stream_free(nghttp2_stream *stream) { (void)stream; } -void nghttp2_stream_shutdown(nghttp2_stream *stream, nghttp2_shut_flag flag) { +void nghttp2_stream_shutdown(nghttp2_stream *stream, uint8_t flag) { stream->shut_flags = (uint8_t)(stream->shut_flags | flag); } diff --git a/deps/nghttp2/lib/nghttp2_stream.h b/deps/nghttp2/lib/nghttp2_stream.h index 603209ec645f..f1723f21ca90 100644 --- a/deps/nghttp2/lib/nghttp2_stream.h +++ b/deps/nghttp2/lib/nghttp2_stream.h @@ -66,81 +66,76 @@ typedef enum { NGHTTP2_STREAM_IDLE } nghttp2_stream_state; -typedef enum { - NGHTTP2_SHUT_NONE = 0, - /* Indicates further receptions will be disallowed. */ - NGHTTP2_SHUT_RD = 0x01, - /* Indicates further transmissions will be disallowed. */ - NGHTTP2_SHUT_WR = 0x02, - /* Indicates both further receptions and transmissions will be - disallowed. */ - NGHTTP2_SHUT_RDWR = NGHTTP2_SHUT_RD | NGHTTP2_SHUT_WR -} nghttp2_shut_flag; +#define NGHTTP2_SHUT_NONE 0x00U +/* Indicates further receptions will be disallowed. */ +#define NGHTTP2_SHUT_RD 0x01U +/* Indicates further transmissions will be disallowed. */ +#define NGHTTP2_SHUT_WR 0x02U +/* Indicates both further receptions and transmissions will be + disallowed. */ +#define NGHTTP2_SHUT_RDWR (NGHTTP2_SHUT_RD | NGHTTP2_SHUT_WR) -typedef enum { - NGHTTP2_STREAM_FLAG_NONE = 0, - /* Indicates that this stream is pushed stream and not opened - yet. */ - NGHTTP2_STREAM_FLAG_PUSH = 0x01, - /* Indicates that this stream was closed */ - NGHTTP2_STREAM_FLAG_CLOSED = 0x02, - /* Indicates the item is deferred due to flow control. */ - NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL = 0x04, - /* Indicates the item is deferred by user callback */ - NGHTTP2_STREAM_FLAG_DEFERRED_USER = 0x08, - /* bitwise OR of NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL and - NGHTTP2_STREAM_FLAG_DEFERRED_USER. */ - NGHTTP2_STREAM_FLAG_DEFERRED_ALL = 0x0c, - /* Ignore client RFC 9218 priority signal. */ - NGHTTP2_STREAM_FLAG_IGNORE_CLIENT_PRIORITIES = 0x20, - /* Indicates that RFC 9113 leading and trailing white spaces - validation against a field value is not performed. */ - NGHTTP2_STREAM_FLAG_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION = 0x40, -} nghttp2_stream_flag; +#define NGHTTP2_STREAM_FLAG_NONE 0x00U +/* Indicates that this stream is pushed stream and not opened yet. */ +#define NGHTTP2_STREAM_FLAG_PUSH 0x01U +/* Indicates that this stream was closed */ +#define NGHTTP2_STREAM_FLAG_CLOSED 0x02U +/* Indicates the item is deferred due to flow control. */ +#define NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL 0x04U +/* Indicates the item is deferred by user callback */ +#define NGHTTP2_STREAM_FLAG_DEFERRED_USER 0x08U +/* bitwise OR of NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL and + NGHTTP2_STREAM_FLAG_DEFERRED_USER. */ +#define NGHTTP2_STREAM_FLAG_DEFERRED_ALL \ + (NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL | \ + NGHTTP2_STREAM_FLAG_DEFERRED_USER) +/* Ignore client RFC 9218 priority signal. */ +#define NGHTTP2_STREAM_FLAG_IGNORE_CLIENT_PRIORITIES 0x20U +/* Indicates that RFC 9113 leading and trailing white spaces + validation against a field value is not performed. */ +#define NGHTTP2_STREAM_FLAG_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION 0x40U /* HTTP related flags to enforce HTTP semantics */ -typedef enum { - NGHTTP2_HTTP_FLAG_NONE = 0, - /* header field seen so far */ - NGHTTP2_HTTP_FLAG__AUTHORITY = 1, - NGHTTP2_HTTP_FLAG__PATH = 1 << 1, - NGHTTP2_HTTP_FLAG__METHOD = 1 << 2, - NGHTTP2_HTTP_FLAG__SCHEME = 1 << 3, - /* host is not pseudo header, but we require either host or - :authority */ - NGHTTP2_HTTP_FLAG_HOST = 1 << 4, - NGHTTP2_HTTP_FLAG__STATUS = 1 << 5, - /* required header fields for HTTP request except for CONNECT - method. */ - NGHTTP2_HTTP_FLAG_REQ_HEADERS = NGHTTP2_HTTP_FLAG__METHOD | - NGHTTP2_HTTP_FLAG__PATH | - NGHTTP2_HTTP_FLAG__SCHEME, - NGHTTP2_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED = 1 << 6, - /* HTTP method flags */ - NGHTTP2_HTTP_FLAG_METH_CONNECT = 1 << 7, - NGHTTP2_HTTP_FLAG_METH_HEAD = 1 << 8, - NGHTTP2_HTTP_FLAG_METH_OPTIONS = 1 << 9, - NGHTTP2_HTTP_FLAG_METH_UPGRADE_WORKAROUND = 1 << 10, - NGHTTP2_HTTP_FLAG_METH_ALL = - NGHTTP2_HTTP_FLAG_METH_CONNECT | NGHTTP2_HTTP_FLAG_METH_HEAD | - NGHTTP2_HTTP_FLAG_METH_OPTIONS | NGHTTP2_HTTP_FLAG_METH_UPGRADE_WORKAROUND, - /* :path category */ - /* path starts with "/" */ - NGHTTP2_HTTP_FLAG_PATH_REGULAR = 1 << 11, - /* path "*" */ - NGHTTP2_HTTP_FLAG_PATH_ASTERISK = 1 << 12, - /* scheme */ - /* "http" or "https" scheme */ - NGHTTP2_HTTP_FLAG_SCHEME_HTTP = 1 << 13, - /* set if final response is expected */ - NGHTTP2_HTTP_FLAG_EXPECT_FINAL_RESPONSE = 1 << 14, - NGHTTP2_HTTP_FLAG__PROTOCOL = 1 << 15, - /* set if priority header field is received */ - NGHTTP2_HTTP_FLAG_PRIORITY = 1 << 16, - /* set if an error is encountered while parsing priority header - field */ - NGHTTP2_HTTP_FLAG_BAD_PRIORITY = 1 << 17, -} nghttp2_http_flag; +#define NGHTTP2_HTTP_FLAG_NONE 0x00U +/* header field seen so far */ +#define NGHTTP2_HTTP_FLAG__AUTHORITY 0x01U +#define NGHTTP2_HTTP_FLAG__PATH 0x02U +#define NGHTTP2_HTTP_FLAG__METHOD 0x04U +#define NGHTTP2_HTTP_FLAG__SCHEME 0x08U +/* host is not pseudo header, but we require either host or + :authority */ +#define NGHTTP2_HTTP_FLAG_HOST 0x10U +#define NGHTTP2_HTTP_FLAG__STATUS 0x20U +/* required header fields for HTTP request except for CONNECT + method. */ +#define NGHTTP2_HTTP_FLAG_REQ_HEADERS \ + (NGHTTP2_HTTP_FLAG__METHOD | NGHTTP2_HTTP_FLAG__PATH | \ + NGHTTP2_HTTP_FLAG__SCHEME) +#define NGHTTP2_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED 0x40U +/* HTTP method flags */ +#define NGHTTP2_HTTP_FLAG_METH_CONNECT 0x80U +#define NGHTTP2_HTTP_FLAG_METH_HEAD 0x0100U +#define NGHTTP2_HTTP_FLAG_METH_OPTIONS 0x0200U +#define NGHTTP2_HTTP_FLAG_METH_UPGRADE_WORKAROUND 0x0400U +#define NGHTTP2_HTTP_FLAG_METH_ALL \ + (NGHTTP2_HTTP_FLAG_METH_CONNECT | NGHTTP2_HTTP_FLAG_METH_HEAD | \ + NGHTTP2_HTTP_FLAG_METH_OPTIONS | NGHTTP2_HTTP_FLAG_METH_UPGRADE_WORKAROUND) +/* :path category */ +/* path starts with "/" */ +#define NGHTTP2_HTTP_FLAG_PATH_REGULAR 0x0800U +/* path "*" */ +#define NGHTTP2_HTTP_FLAG_PATH_ASTERISK 0x1000U +/* scheme */ +/* "http" or "https" scheme */ +#define NGHTTP2_HTTP_FLAG_SCHEME_HTTP 0x2000U +/* set if final response is expected */ +#define NGHTTP2_HTTP_FLAG_EXPECT_FINAL_RESPONSE 0x4000U +#define NGHTTP2_HTTP_FLAG__PROTOCOL 0x8000U +/* set if priority header field is received */ +#define NGHTTP2_HTTP_FLAG_PRIORITY 0x010000U +/* set if an error is encountered while parsing priority header + field */ +#define NGHTTP2_HTTP_FLAG_BAD_PRIORITY 0x020000U struct nghttp2_stream { nghttp2_stream_state state; @@ -184,12 +179,13 @@ struct nghttp2_stream { /* This is unpaid penalty (offset) when calculating cycle. */ uint32_t pending_penalty; /* status code from remote server */ - int16_t status_code; - /* Bitwise OR of zero or more nghttp2_http_flag values */ + int32_t status_code; + /* Bitwise OR of zero or more NGHTTP2_HTTP_FLAG_* values */ uint32_t http_flags; - /* This is bitwise-OR of 0 or more of nghttp2_stream_flag. */ + /* This is bitwise-OR of 0 or more of NGHTTP2_STREAM_FLAG_* + values. */ uint8_t flags; - /* Bitwise OR of zero or more nghttp2_shut_flag values */ + /* Bitwise OR of zero or more NGHTTP2_SHUT_* values. */ uint8_t shut_flags; /* Nonzero if this stream has been queued to stream pointed by dep_prev. We maintain the invariant that if a stream is queued, @@ -218,9 +214,9 @@ void nghttp2_stream_free(nghttp2_stream *stream); /* * Disallow either further receptions or transmissions, or both. - * |flag| is bitwise OR of one or more of nghttp2_shut_flag. + * |flag| is bitwise OR of one or more of NGHTTP2_SHUT_* values. */ -void nghttp2_stream_shutdown(nghttp2_stream *stream, nghttp2_shut_flag flag); +void nghttp2_stream_shutdown(nghttp2_stream *stream, uint8_t flag); /* * Defer |stream->item|. We won't call this function in the situation diff --git a/deps/nghttp2/lib/nghttp2_submit.c b/deps/nghttp2/lib/nghttp2_submit.c index d6bcae9deaf5..26ddd1408ff2 100644 --- a/deps/nghttp2/lib/nghttp2_submit.c +++ b/deps/nghttp2/lib/nghttp2_submit.c @@ -748,7 +748,6 @@ int nghttp2_submit_data_shared(nghttp2_session *session, uint8_t flags, int rv; nghttp2_outbound_item *item; nghttp2_frame *frame; - nghttp2_data_aux_data *aux_data; uint8_t nflags = flags & NGHTTP2_FLAG_END_STREAM; nghttp2_mem *mem; @@ -766,10 +765,10 @@ int nghttp2_submit_data_shared(nghttp2_session *session, uint8_t flags, nghttp2_outbound_item_init(item); frame = &item->frame; - aux_data = &item->aux_data.data; - aux_data->dpw = *dpw; - aux_data->eof = 0; - aux_data->flags = nflags; + item->aux_data.data = (nghttp2_data_aux_data){ + .dpw = *dpw, + .flags = nflags, + }; /* flags are sent on transmission */ nghttp2_frame_data_init(&frame->data, NGHTTP2_FLAG_NONE, stream_id); diff --git a/deps/nghttp2/lib/sfparse.c b/deps/nghttp2/lib/sfparse.c index cee089d3944d..c312c04f4a8f 100644 --- a/deps/nghttp2/lib/sfparse.c +++ b/deps/nghttp2/lib/sfparse.c @@ -34,18 +34,18 @@ # include #endif /* __AVX2__ */ -#define SFPARSE_STATE_DICT 0x08u -#define SFPARSE_STATE_LIST 0x10u -#define SFPARSE_STATE_ITEM 0x18u +#define SFPARSE_STATE_DICT 0x08U +#define SFPARSE_STATE_LIST 0x10U +#define SFPARSE_STATE_ITEM 0x18U -#define SFPARSE_STATE_INNER_LIST 0x04u +#define SFPARSE_STATE_INNER_LIST 0x04U -#define SFPARSE_STATE_BEFORE 0x00u -#define SFPARSE_STATE_BEFORE_PARAMS 0x01u -#define SFPARSE_STATE_PARAMS 0x02u -#define SFPARSE_STATE_AFTER 0x03u +#define SFPARSE_STATE_BEFORE 0x00U +#define SFPARSE_STATE_BEFORE_PARAMS 0x01U +#define SFPARSE_STATE_PARAMS 0x02U +#define SFPARSE_STATE_AFTER 0x03U -#define SFPARSE_STATE_OP_MASK 0x03u +#define SFPARSE_STATE_OP_MASK 0x03U #define SFPARSE_SET_STATE_AFTER(NAME) \ (SFPARSE_STATE_##NAME | SFPARSE_STATE_AFTER) @@ -69,314 +69,33 @@ #define SFPARSE_STATE_ITEM_INNER_LIST_BEFORE \ SFPARSE_SET_STATE_INNER_LIST_BEFORE(ITEM) -#define SFPARSE_STATE_INITIAL 0x00u - -#define DIGIT_CASES \ - case '0': \ - case '1': \ - case '2': \ - case '3': \ - case '4': \ - case '5': \ - case '6': \ - case '7': \ - case '8': \ - case '9' - -#define LCALPHA_CASES \ - case 'a': \ - case 'b': \ - case 'c': \ - case 'd': \ - case 'e': \ - case 'f': \ - case 'g': \ - case 'h': \ - case 'i': \ - case 'j': \ - case 'k': \ - case 'l': \ - case 'm': \ - case 'n': \ - case 'o': \ - case 'p': \ - case 'q': \ - case 'r': \ - case 's': \ - case 't': \ - case 'u': \ - case 'v': \ - case 'w': \ - case 'x': \ - case 'y': \ - case 'z' - -#define UCALPHA_CASES \ - case 'A': \ - case 'B': \ - case 'C': \ - case 'D': \ - case 'E': \ - case 'F': \ - case 'G': \ - case 'H': \ - case 'I': \ - case 'J': \ - case 'K': \ - case 'L': \ - case 'M': \ - case 'N': \ - case 'O': \ - case 'P': \ - case 'Q': \ - case 'R': \ - case 'S': \ - case 'T': \ - case 'U': \ - case 'V': \ - case 'W': \ - case 'X': \ - case 'Y': \ - case 'Z' - -#define ALPHA_CASES \ - UCALPHA_CASES: \ - LCALPHA_CASES - -#define TOKEN_CASES \ - case '!': \ - case '#': \ - case '$': \ - case '%': \ - case '&': \ - case '\'': \ - case '*': \ - case '+': \ - case '-': \ - case '.': \ - case '/': \ - DIGIT_CASES: \ - case ':': \ - UCALPHA_CASES: \ - case '^': \ - case '_': \ - case '`': \ - LCALPHA_CASES: \ - case '|': \ - case '~' - -#define LCHEXALPHA_CASES \ - case 'a': \ - case 'b': \ - case 'c': \ - case 'd': \ - case 'e': \ - case 'f' - -#define X00_1F_CASES \ - case 0x00: \ - case 0x01: \ - case 0x02: \ - case 0x03: \ - case 0x04: \ - case 0x05: \ - case 0x06: \ - case 0x07: \ - case 0x08: \ - case 0x09: \ - case 0x0a: \ - case 0x0b: \ - case 0x0c: \ - case 0x0d: \ - case 0x0e: \ - case 0x0f: \ - case 0x10: \ - case 0x11: \ - case 0x12: \ - case 0x13: \ - case 0x14: \ - case 0x15: \ - case 0x16: \ - case 0x17: \ - case 0x18: \ - case 0x19: \ - case 0x1a: \ - case 0x1b: \ - case 0x1c: \ - case 0x1d: \ - case 0x1e: \ - case 0x1f - -#define X20_21_CASES \ - case ' ': \ - case '!' - -#define X23_5B_CASES \ - case '#': \ - case '$': \ - case '%': \ - case '&': \ - case '\'': \ - case '(': \ - case ')': \ - case '*': \ - case '+': \ - case ',': \ - case '-': \ - case '.': \ - case '/': \ - DIGIT_CASES: \ - case ':': \ - case ';': \ - case '<': \ - case '=': \ - case '>': \ - case '?': \ - case '@': \ - UCALPHA_CASES: \ - case '[' - -#define X5D_7E_CASES \ - case ']': \ - case '^': \ - case '_': \ - case '`': \ - LCALPHA_CASES: \ - case '{': \ - case '|': \ - case '}': \ - case '~' - -#define X7F_FF_CASES \ - case 0x7f: \ - case 0x80: \ - case 0x81: \ - case 0x82: \ - case 0x83: \ - case 0x84: \ - case 0x85: \ - case 0x86: \ - case 0x87: \ - case 0x88: \ - case 0x89: \ - case 0x8a: \ - case 0x8b: \ - case 0x8c: \ - case 0x8d: \ - case 0x8e: \ - case 0x8f: \ - case 0x90: \ - case 0x91: \ - case 0x92: \ - case 0x93: \ - case 0x94: \ - case 0x95: \ - case 0x96: \ - case 0x97: \ - case 0x98: \ - case 0x99: \ - case 0x9a: \ - case 0x9b: \ - case 0x9c: \ - case 0x9d: \ - case 0x9e: \ - case 0x9f: \ - case 0xa0: \ - case 0xa1: \ - case 0xa2: \ - case 0xa3: \ - case 0xa4: \ - case 0xa5: \ - case 0xa6: \ - case 0xa7: \ - case 0xa8: \ - case 0xa9: \ - case 0xaa: \ - case 0xab: \ - case 0xac: \ - case 0xad: \ - case 0xae: \ - case 0xaf: \ - case 0xb0: \ - case 0xb1: \ - case 0xb2: \ - case 0xb3: \ - case 0xb4: \ - case 0xb5: \ - case 0xb6: \ - case 0xb7: \ - case 0xb8: \ - case 0xb9: \ - case 0xba: \ - case 0xbb: \ - case 0xbc: \ - case 0xbd: \ - case 0xbe: \ - case 0xbf: \ - case 0xc0: \ - case 0xc1: \ - case 0xc2: \ - case 0xc3: \ - case 0xc4: \ - case 0xc5: \ - case 0xc6: \ - case 0xc7: \ - case 0xc8: \ - case 0xc9: \ - case 0xca: \ - case 0xcb: \ - case 0xcc: \ - case 0xcd: \ - case 0xce: \ - case 0xcf: \ - case 0xd0: \ - case 0xd1: \ - case 0xd2: \ - case 0xd3: \ - case 0xd4: \ - case 0xd5: \ - case 0xd6: \ - case 0xd7: \ - case 0xd8: \ - case 0xd9: \ - case 0xda: \ - case 0xdb: \ - case 0xdc: \ - case 0xdd: \ - case 0xde: \ - case 0xdf: \ - case 0xe0: \ - case 0xe1: \ - case 0xe2: \ - case 0xe3: \ - case 0xe4: \ - case 0xe5: \ - case 0xe6: \ - case 0xe7: \ - case 0xe8: \ - case 0xe9: \ - case 0xea: \ - case 0xeb: \ - case 0xec: \ - case 0xed: \ - case 0xee: \ - case 0xef: \ - case 0xf0: \ - case 0xf1: \ - case 0xf2: \ - case 0xf3: \ - case 0xf4: \ - case 0xf5: \ - case 0xf6: \ - case 0xf7: \ - case 0xf8: \ - case 0xf9: \ - case 0xfa: \ - case 0xfb: \ - case 0xfc: \ - case 0xfd: \ - case 0xfe: \ - case 0xff +#define SFPARSE_STATE_INITIAL 0x00U + +#define LCALPHAS \ + ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1, ['g'] = 1, \ + ['h'] = 1, ['i'] = 1, ['j'] = 1, ['k'] = 1, ['l'] = 1, ['m'] = 1, ['n'] = 1, \ + ['o'] = 1, ['p'] = 1, ['q'] = 1, ['r'] = 1, ['s'] = 1, ['t'] = 1, ['u'] = 1, \ + ['v'] = 1, ['w'] = 1, ['x'] = 1, ['y'] = 1, ['z'] = 1 + +#define ALPHAS(N) \ + ['A'] = (N), ['B'] = (N), ['C'] = (N), ['D'] = (N), ['E'] = (N), \ + ['F'] = (N), ['G'] = (N), ['H'] = (N), ['I'] = (N), ['J'] = (N), \ + ['K'] = (N), ['L'] = (N), ['M'] = (N), ['N'] = (N), ['O'] = (N), \ + ['P'] = (N), ['Q'] = (N), ['R'] = (N), ['S'] = (N), ['T'] = (N), \ + ['U'] = (N), ['V'] = (N), ['W'] = (N), ['X'] = (N), ['Y'] = (N), \ + ['Z'] = (N), ['a'] = (N), ['b'] = (N), ['c'] = (N), ['d'] = (N), \ + ['e'] = (N), ['f'] = (N), ['g'] = (N), ['h'] = (N), ['i'] = (N), \ + ['j'] = (N), ['k'] = (N), ['l'] = (N), ['m'] = (N), ['n'] = (N), \ + ['o'] = (N), ['p'] = (N), ['q'] = (N), ['r'] = (N), ['s'] = (N), \ + ['t'] = (N), ['u'] = (N), ['v'] = (N), ['w'] = (N), ['x'] = (N), \ + ['y'] = (N), ['z'] = (N) + +#define DIGITS(N) \ + ['0'] = (N), ['1'] = (N), ['2'] = (N), ['3'] = (N), ['4'] = (N), \ + ['5'] = (N), ['6'] = (N), ['7'] = (N), ['8'] = (N), ['9'] = (N) + +#define HEXALPHAS(N) \ + ['a'] = (N), ['b'] = (N), ['c'] = (N), ['d'] = (N), ['e'] = (N), ['f'] = (N) static int is_ws(uint8_t c) { switch (c) { @@ -463,17 +182,17 @@ static const uint8_t *find_char_key(const uint8_t *first, const uint8_t *last) { } #endif /* __AVX2__ */ +static const uint8_t key_tbl[256] = { + ['*'] = 1, LCALPHAS, ['_'] = 2, ['-'] = 2, ['.'] = 2, DIGITS(2), +}; + static int parser_key(sfparse_parser *sfp, sfparse_vec *dest) { const uint8_t *base; #ifdef __AVX2__ const uint8_t *last; #endif /* __AVX2__ */ - switch (*sfp->pos) { - case '*': - LCALPHA_CASES: - break; - default: + if (key_tbl[*sfp->pos] != 1) { return SFPARSE_ERR_PARSE; } @@ -481,7 +200,7 @@ static int parser_key(sfparse_parser *sfp, sfparse_vec *dest) { #ifdef __AVX2__ if (sfp->end - sfp->pos >= 32) { - last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1fu); + last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1FU); sfp->pos = find_char_key(sfp->pos, last); if (sfp->pos != last) { @@ -490,19 +209,8 @@ static int parser_key(sfparse_parser *sfp, sfparse_vec *dest) { } #endif /* __AVX2__ */ - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - case '_': - case '-': - case '.': - case '*': - DIGIT_CASES: - LCALPHA_CASES: - continue; - } - - break; - } + for (; !parser_eof(sfp) && key_tbl[*sfp->pos]; ++sfp->pos) + ; #ifdef __AVX2__ fin: @@ -515,6 +223,10 @@ static int parser_key(sfparse_parser *sfp, sfparse_vec *dest) { return 0; } +static const uint8_t number_tbl[256] = { + DIGITS(1), +}; + static int parser_number(sfparse_parser *sfp, sfparse_value *dest) { int sign = 1; int64_t value = 0; @@ -532,20 +244,13 @@ static int parser_number(sfparse_parser *sfp, sfparse_value *dest) { assert(!parser_eof(sfp)); - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - DIGIT_CASES: - if (++len > 15) { - return SFPARSE_ERR_PARSE; - } - - value *= 10; - value += *sfp->pos - '0'; - - continue; + for (; !parser_eof(sfp) && number_tbl[*sfp->pos]; ++sfp->pos) { + if (++len > 15) { + return SFPARSE_ERR_PARSE; } - break; + value *= 10; + value += *sfp->pos - '0'; } if (len == 0) { @@ -572,20 +277,13 @@ static int parser_number(sfparse_parser *sfp, sfparse_value *dest) { ++sfp->pos; - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - DIGIT_CASES: - if (++len > 15) { - return SFPARSE_ERR_PARSE; - } - - value *= 10; - value += *sfp->pos - '0'; - - continue; + for (; !parser_eof(sfp) && number_tbl[*sfp->pos]; ++sfp->pos) { + if (++len > 15) { + return SFPARSE_ERR_PARSE; } - break; + value *= 10; + value += *sfp->pos - '0'; } if (fpos == len || len - fpos > 3) { @@ -651,7 +349,7 @@ static const uint8_t *find_char_string(const uint8_t *first, const uint8_t *last) { const __m256i bs = _mm256_set1_epi8('\\'); const __m256i dq = _mm256_set1_epi8('"'); - const __m256i del = _mm256_set1_epi8(0x7f); + const __m256i del = _mm256_set1_epi8(0x7F); const __m256i sp = _mm256_set1_epi8(' '); __m256i s, x; uint32_t m; @@ -674,6 +372,14 @@ static const uint8_t *find_char_string(const uint8_t *first, } #endif /* __AVX2__ */ +static const uint8_t string_tbl[256] = { + [' '] = 1, ['!'] = 1, ['#'] = 1, ['$'] = 1, ['%'] = 1, ['&'] = 1, ['\''] = 1, + ['('] = 1, [')'] = 1, ['*'] = 1, ['+'] = 1, [','] = 1, ['-'] = 1, ['.'] = 1, + ['/'] = 1, DIGITS(1), [':'] = 1, [';'] = 1, ['<'] = 1, ['='] = 1, ['>'] = 1, + ['?'] = 1, ['@'] = 1, ALPHAS(1), ['['] = 1, [']'] = 1, ['^'] = 1, ['_'] = 1, + ['`'] = 1, ['{'] = 1, ['|'] = 1, ['}'] = 1, ['~'] = 1, ['\\'] = 2, ['"'] = 3, +}; + static int parser_string(sfparse_parser *sfp, sfparse_value *dest) { const uint8_t *base; #ifdef __AVX2__ @@ -688,7 +394,7 @@ static int parser_string(sfparse_parser *sfp, sfparse_value *dest) { #ifdef __AVX2__ for (; sfp->end - sfp->pos >= 32; ++sfp->pos) { - last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1fu); + last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1FU); sfp->pos = find_char_string(sfp->pos, last); if (sfp->pos == last) { @@ -722,12 +428,12 @@ static int parser_string(sfparse_parser *sfp, sfparse_value *dest) { #endif /* __AVX2__ */ for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - X20_21_CASES: - X23_5B_CASES: - X5D_7E_CASES: + switch (string_tbl[*sfp->pos]) { + case 0: + return SFPARSE_ERR_PARSE; + case 1: break; - case '\\': + case 2: ++sfp->pos; if (parser_eof(sfp)) { return SFPARSE_ERR_PARSE; @@ -744,10 +450,8 @@ static int parser_string(sfparse_parser *sfp, sfparse_value *dest) { } break; - case '"': + case 3: goto fin; - default: - return SFPARSE_ERR_PARSE; } } @@ -820,6 +524,12 @@ static const uint8_t *find_char_token(const uint8_t *first, } #endif /* __AVX2__ */ +static const uint8_t token_tbl[256] = { + ['!'] = 1, ['#'] = 1, ['$'] = 1, ['%'] = 1, ['&'] = 1, ['\''] = 1, ['*'] = 1, + ['+'] = 1, ['-'] = 1, ['.'] = 1, ['/'] = 1, DIGITS(1), [':'] = 1, ALPHAS(1), + ['^'] = 1, ['_'] = 1, ['`'] = 1, ['|'] = 1, ['~'] = 1, +}; + static int parser_token(sfparse_parser *sfp, sfparse_value *dest) { const uint8_t *base; #ifdef __AVX2__ @@ -831,7 +541,7 @@ static int parser_token(sfparse_parser *sfp, sfparse_value *dest) { #ifdef __AVX2__ if (sfp->end - sfp->pos >= 32) { - last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1fu); + last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1FU); sfp->pos = find_char_token(sfp->pos, last); if (sfp->pos != last) { @@ -840,14 +550,8 @@ static int parser_token(sfparse_parser *sfp, sfparse_value *dest) { } #endif /* __AVX2__ */ - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - TOKEN_CASES: - continue; - } - - break; - } + for (; !parser_eof(sfp) && token_tbl[*sfp->pos]; ++sfp->pos) + ; #ifdef __AVX2__ fin: @@ -901,6 +605,10 @@ static const uint8_t *find_char_byteseq(const uint8_t *first, } #endif /* __AVX2__ */ +static const uint8_t byteseq_tbl[256] = { + ['+'] = 1, ['/'] = 1, DIGITS(1), ALPHAS(1), ['='] = 2, [':'] = 3, +}; + static int parser_byteseq(sfparse_parser *sfp, sfparse_value *dest) { const uint8_t *base; #ifdef __AVX2__ @@ -914,19 +622,18 @@ static int parser_byteseq(sfparse_parser *sfp, sfparse_value *dest) { #ifdef __AVX2__ if (sfp->end - sfp->pos >= 32) { - last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1fu); + last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1FU); sfp->pos = find_char_byteseq(sfp->pos, last); } #endif /* __AVX2__ */ for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - case '+': - case '/': - DIGIT_CASES: - ALPHA_CASES: + switch (byteseq_tbl[*sfp->pos]) { + case 0: + return SFPARSE_ERR_PARSE; + case 1: continue; - case '=': + case 2: switch ((sfp->pos - base) & 0x3) { case 0: case 1: @@ -954,14 +661,12 @@ static int parser_byteseq(sfparse_parser *sfp, sfparse_value *dest) { } goto fin; - case ':': + case 3: if (((sfp->pos - base) & 0x3) == 1) { return SFPARSE_ERR_PARSE; } goto fin; - default: - return SFPARSE_ERR_PARSE; } } @@ -1016,35 +721,43 @@ static int parser_boolean(sfparse_parser *sfp, sfparse_value *dest) { return 0; } +static const uint8_t pct_tbl[256] = { + DIGITS(1), + HEXALPHAS(2), +}; + static int pctdecode(uint8_t *pc, const uint8_t **ppos) { uint8_t c, b = **ppos; - switch (b) { - DIGIT_CASES: + switch (pct_tbl[b]) { + case 0: + return -1; + case 1: c = (uint8_t)((b - '0') << 4); break; - LCHEXALPHA_CASES: + case 2: c = (uint8_t)((b - 'a' + 10) << 4); break; default: - return -1; + assert(0); + abort(); } b = *++*ppos; - switch (b) { - DIGIT_CASES: + switch (pct_tbl[b]) { + case 0: + return -1; + case 1: c |= (uint8_t)(b - '0'); break; - LCHEXALPHA_CASES: + case 2: c |= (uint8_t)(b - 'a' + 10); break; - default: - return -1; } *pc = c; @@ -1115,6 +828,14 @@ static void utf8_decode(uint32_t *state, uint8_t byte) { /* End of utf8 dfa */ +static const uint8_t dispstring_tbl[256] = { + [' '] = 1, ['!'] = 1, ['#'] = 1, ['$'] = 1, ['&'] = 1, ['\''] = 1, ['('] = 1, + [')'] = 1, ['*'] = 1, ['+'] = 1, [','] = 1, ['-'] = 1, ['.'] = 1, ['/'] = 1, + DIGITS(1), [':'] = 1, [';'] = 1, ['<'] = 1, ['='] = 1, ['>'] = 1, ['?'] = 1, + ['@'] = 1, ALPHAS(1), ['['] = 1, ['\\'] = 1, [']'] = 1, ['^'] = 1, ['_'] = 1, + ['`'] = 1, ['{'] = 1, ['|'] = 1, ['}'] = 1, ['~'] = 1, ['%'] = 2, ['"'] = 3, +}; + static int parser_dispstring(sfparse_parser *sfp, sfparse_value *dest) { const uint8_t *base; uint8_t c; @@ -1131,31 +852,39 @@ static int parser_dispstring(sfparse_parser *sfp, sfparse_value *dest) { base = ++sfp->pos; for (; !parser_eof(sfp);) { - switch (*sfp->pos) { - X00_1F_CASES: - X7F_FF_CASES: + switch (dispstring_tbl[*sfp->pos]) { + case 0: return SFPARSE_ERR_PARSE; - case '%': + case 1: ++sfp->pos; - if (sfp->pos + 2 > sfp->end) { - return SFPARSE_ERR_PARSE; - } + break; + case 2: + for (;;) { + ++sfp->pos; - if (pctdecode(&c, &sfp->pos) != 0) { - return SFPARSE_ERR_PARSE; - } + if (sfp->pos + 2 > sfp->end || pctdecode(&c, &sfp->pos) != 0) { + return SFPARSE_ERR_PARSE; + } - utf8_decode(&utf8state, c); - if (utf8state == UTF8_REJECT) { - return SFPARSE_ERR_PARSE; + utf8_decode(&utf8state, c); + if (utf8state == UTF8_ACCEPT) { + if (sfp->pos != sfp->end && *sfp->pos == '%') { + continue; + } + + break; + } + + if (utf8state == UTF8_REJECT || sfp->pos + 1 > sfp->end || + *sfp->pos != '%') { + return SFPARSE_ERR_PARSE; + } } break; - case '"': - if (utf8state != UTF8_ACCEPT) { - return SFPARSE_ERR_PARSE; - } + case 3: + assert(utf8state == UTF8_ACCEPT); if (dest) { dest->type = SFPARSE_TYPE_DISPSTRING; @@ -1167,38 +896,38 @@ static int parser_dispstring(sfparse_parser *sfp, sfparse_value *dest) { ++sfp->pos; return 0; - default: - if (utf8state != UTF8_ACCEPT) { - return SFPARSE_ERR_PARSE; - } - - ++sfp->pos; } } return SFPARSE_ERR_PARSE; } +static const uint8_t bare_item_tbl[256] = { + ['"'] = 1, ['-'] = 2, DIGITS(2), ['@'] = 3, [':'] = 4, + ['?'] = 5, ['*'] = 6, ALPHAS(6), ['%'] = 7, +}; + static int parser_bare_item(sfparse_parser *sfp, sfparse_value *dest) { - switch (*sfp->pos) { - case '"': + switch (bare_item_tbl[*sfp->pos]) { + case 0: + return SFPARSE_ERR_PARSE; + case 1: return parser_string(sfp, dest); - case '-': - DIGIT_CASES: + case 2: return parser_number(sfp, dest); - case '@': + case 3: return parser_date(sfp, dest); - case ':': + case 4: return parser_byteseq(sfp, dest); - case '?': + case 5: return parser_boolean(sfp, dest); - case '*': - ALPHA_CASES: + case 6: return parser_token(sfp, dest); - case '%': + case 7: return parser_dispstring(sfp, dest); default: - return SFPARSE_ERR_PARSE; + assert(0); + abort(); } } @@ -1700,8 +1429,8 @@ void sfparse_base64decode(sfparse_vec *dest, const sfparse_vec *src) { } *o++ = (uint8_t)(n >> 16); - *o++ = (n >> 8) & 0xffu; - *o++ = n & 0xffu; + *o++ = (n >> 8) & 0xFFU; + *o++ = n & 0xFFU; } switch (left) { @@ -1738,8 +1467,8 @@ void sfparse_base64decode(sfparse_vec *dest, const sfparse_vec *src) { n = (uint32_t)(index_tbl[*p++] << 10); n += (uint32_t)(index_tbl[*p++] << 4); n += (uint32_t)(index_tbl[*p++] >> 2); - *o++ = (n >> 8) & 0xffu; - *o++ = n & 0xffu; + *o++ = (n >> 8) & 0xFFU; + *o++ = n & 0xFFU; break; } diff --git a/deps/nghttp2/lib/sfparse.h b/deps/nghttp2/lib/sfparse.h index 9341221a0994..7f36ce8a08c5 100644 --- a/deps/nghttp2/lib/sfparse.h +++ b/deps/nghttp2/lib/sfparse.h @@ -130,7 +130,7 @@ typedef struct sfparse_vec { * * :macro:`SFPARSE_VALUE_FLAG_NONE` indicates no flag set. */ -#define SFPARSE_VALUE_FLAG_NONE 0x0u +#define SFPARSE_VALUE_FLAG_NONE 0x0U /** * @macro @@ -138,7 +138,7 @@ typedef struct sfparse_vec { * :macro:`SFPARSE_VALUE_FLAG_ESCAPED_STRING` indicates that a string * contains escaped character(s). */ -#define SFPARSE_VALUE_FLAG_ESCAPED_STRING 0x1u +#define SFPARSE_VALUE_FLAG_ESCAPED_STRING 0x1U /** * @struct diff --git a/deps/nghttp2/nghttp2.gyp b/deps/nghttp2/nghttp2.gyp index 2601342f9e6f..b83378d972e8 100644 --- a/deps/nghttp2/nghttp2.gyp +++ b/deps/nghttp2/nghttp2.gyp @@ -67,6 +67,17 @@ 'sources': [ '<@(nghttp2_sources)', ] + }, + { + 'target_name': 'sfparse', + 'type': 'static_library', + 'include_dirs': ['lib'], + 'sources': [ + 'lib/sfparse.c', + ], + 'direct_dependent_settings': { + 'include_dirs': [ 'lib/includes' ] + } } ] } diff --git a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h index c38f5e8dad4b..d3dd9217d4b0 100644 --- a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h +++ b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h @@ -86,8 +86,9 @@ typedef ptrdiff_t nghttp3_ssize; * * :type:`nghttp3_tstamp` is a timestamp with nanosecond resolution. * ``UINT64_MAX`` is an invalid value, and it is often used to - * indicate that no value is set. This type is available since - * v1.12.0. + * indicate that no value is set. + * + * .. version-added:: 1.12.0 */ typedef uint64_t nghttp3_tstamp; @@ -96,8 +97,9 @@ typedef uint64_t nghttp3_tstamp; * * :type:`nghttp3_duration` is a period of time in nanosecond * resolution. ``UINT64_MAX`` is an invalid value, and it is often - * used to indicate that no value is set. This type is available - * since v1.12.0. + * used to indicate that no value is set. + * + * .. version-added:: 1.12.0. */ typedef uint64_t nghttp3_duration; @@ -105,7 +107,9 @@ typedef uint64_t nghttp3_duration; * @macro * * :macro:`NGHTTP3_NANOSECONDS` is a count of tick which corresponds - * to 1 nanosecond. This macro is available since v1.12.0. + * to 1 nanosecond. + * + * .. version-added:: 1.12.0 */ #define NGHTTP3_NANOSECONDS ((nghttp3_duration)1ULL) @@ -113,7 +117,9 @@ typedef uint64_t nghttp3_duration; * @macro * * :macro:`NGHTTP3_MICROSECONDS` is a count of tick which corresponds - * to 1 microsecond. This macro is available since v1.12.0. + * to 1 microsecond. + * + * .. version-added:: 1.12.0 */ #define NGHTTP3_MICROSECONDS ((nghttp3_duration)(1000ULL * NGHTTP3_NANOSECONDS)) @@ -121,7 +127,9 @@ typedef uint64_t nghttp3_duration; * @macro * * :macro:`NGHTTP3_MILLISECONDS` is a count of tick which corresponds - * to 1 millisecond. This macro is available since v1.12.0. + * to 1 millisecond. + * + * .. version-added:: 1.12.0 */ #define NGHTTP3_MILLISECONDS \ ((nghttp3_duration)(1000ULL * NGHTTP3_MICROSECONDS)) @@ -130,7 +138,9 @@ typedef uint64_t nghttp3_duration; * @macro * * :macro:`NGHTTP3_SECONDS` is a count of tick which corresponds to 1 - * second. This macro is available since v1.12.0. + * second. + * + * .. version-added:: 1.12.0 */ #define NGHTTP3_SECONDS ((nghttp3_duration)(1000ULL * NGHTTP3_MILLISECONDS)) @@ -429,42 +439,42 @@ typedef uint64_t nghttp3_duration; * :macro:`NGHTTP3_H3_MISSING_SETTINGS` is HTTP/3 application error * code ``H3_MISSING_SETTINGS``. */ -#define NGHTTP3_H3_MISSING_SETTINGS 0x010a +#define NGHTTP3_H3_MISSING_SETTINGS 0x010A /** * @macro * * :macro:`NGHTTP3_H3_REQUEST_REJECTED` is HTTP/3 application error * code ``H3_REQUEST_REJECTED``. */ -#define NGHTTP3_H3_REQUEST_REJECTED 0x010b +#define NGHTTP3_H3_REQUEST_REJECTED 0x010B /** * @macro * * :macro:`NGHTTP3_H3_REQUEST_CANCELLED` is HTTP/3 application error * code ``H3_REQUEST_CANCELLED``. */ -#define NGHTTP3_H3_REQUEST_CANCELLED 0x010c +#define NGHTTP3_H3_REQUEST_CANCELLED 0x010C /** * @macro * * :macro:`NGHTTP3_H3_REQUEST_INCOMPLETE` is HTTP/3 application error * code ``H3_REQUEST_INCOMPLETE``. */ -#define NGHTTP3_H3_REQUEST_INCOMPLETE 0x010d +#define NGHTTP3_H3_REQUEST_INCOMPLETE 0x010D /** * @macro * * :macro:`NGHTTP3_H3_MESSAGE_ERROR` is HTTP/3 application error code * ``H3_MESSAGE_ERROR``. */ -#define NGHTTP3_H3_MESSAGE_ERROR 0x010e +#define NGHTTP3_H3_MESSAGE_ERROR 0x010E /** * @macro * * :macro:`NGHTTP3_H3_CONNECT_ERROR` is HTTP/3 application error code * ``H3_CONNECT_ERROR``. */ -#define NGHTTP3_H3_CONNECT_ERROR 0x010f +#define NGHTTP3_H3_CONNECT_ERROR 0x010F /** * @macro * @@ -753,7 +763,7 @@ NGHTTP3_EXTERN void nghttp3_buf_reset(nghttp3_buf *buf); * * :macro:`NGHTTP3_NV_FLAG_NONE` indicates no flag set. */ -#define NGHTTP3_NV_FLAG_NONE 0x00u +#define NGHTTP3_NV_FLAG_NONE 0x00U /** * @macro @@ -762,7 +772,7 @@ NGHTTP3_EXTERN void nghttp3_buf_reset(nghttp3_buf *buf); * pair must not be indexed. Other implementation calls this bit as * "sensitive". */ -#define NGHTTP3_NV_FLAG_NEVER_INDEX 0x01u +#define NGHTTP3_NV_FLAG_NEVER_INDEX 0x01U /** * @macro @@ -771,7 +781,7 @@ NGHTTP3_EXTERN void nghttp3_buf_reset(nghttp3_buf *buf); * If this flag is set, the library does not make a copy of field * name. This could improve performance. */ -#define NGHTTP3_NV_FLAG_NO_COPY_NAME 0x02u +#define NGHTTP3_NV_FLAG_NO_COPY_NAME 0x02U /** * @macro @@ -780,7 +790,7 @@ NGHTTP3_EXTERN void nghttp3_buf_reset(nghttp3_buf *buf); * application. If this flag is set, the library does not make a copy * of field value. This could improve performance. */ -#define NGHTTP3_NV_FLAG_NO_COPY_VALUE 0x04u +#define NGHTTP3_NV_FLAG_NO_COPY_VALUE 0x04U /** * @macro @@ -790,7 +800,7 @@ NGHTTP3_EXTERN void nghttp3_buf_reset(nghttp3_buf *buf); * a hint, and QPACK encoder might not encode the field in various * reasons. */ -#define NGHTTP3_NV_FLAG_TRY_INDEX 0x08u +#define NGHTTP3_NV_FLAG_TRY_INDEX 0x08U /** * @struct @@ -1156,8 +1166,9 @@ typedef struct nghttp3_qpack_nv { * * :type:`nghttp3_qpack_indexing_strat` defines the QPACK dynamic * table indexing strategies for fields not defined in - * :type:`nghttp3_qpack_token`. This type is available since v1.13.0. - + * :type:`nghttp3_qpack_token`. + * + * .. version-added:: 1.13.0 */ typedef enum nghttp3_qpack_indexing_strat { /** @@ -1165,14 +1176,16 @@ typedef enum nghttp3_qpack_indexing_strat { * fields not defined in :type:`nghttp3_qpack_token`. This is the * default strategy. You can still use * :macro:`NGHTTP3_NV_FLAG_TRY_INDEX` to index a particular field. - * This enum is available since v1.13.0. + * + * .. version-added:: 1.13.0 */ NGHTTP3_QPACK_INDEXING_STRAT_NONE, /** * :enum:`NGHTTP3_QPACK_INDEXING_STRAT_EAGER` indexes all fields not * defined in :type:`nghttp3_qpack_token`. Please note that QPACK - * encoder might not index the field in various reasons. This enum - * is available since v1.13.0. + * encoder might not index the field in various reasons. + * + * .. version-added:: 1.13.0 */ NGHTTP3_QPACK_INDEXING_STRAT_EAGER } nghttp3_qpack_indexing_strat; @@ -1233,7 +1246,7 @@ NGHTTP3_EXTERN int nghttp3_qpack_encoder_new(nghttp3_qpack_encoder **pencoder, * :macro:`NGHTTP3_ERR_NOMEM` * Out of memory. * - * This function is available since v1.11.0. + * .. version-added:: 1.11.0 */ NGHTTP3_EXTERN int nghttp3_qpack_encoder_new2(nghttp3_qpack_encoder **pencoder, size_t hard_max_dtable_capacity, @@ -1329,9 +1342,9 @@ nghttp3_qpack_encoder_set_max_blocked_streams(nghttp3_qpack_encoder *encoder, * @function * * `nghttp3_qpack_encoder_set_indexing_strat` sets the dynamic table - * indexing strategy |strat| to |encoder|. This function is available - * since v1.13.0. - + * indexing strategy |strat| to |encoder|. + * + * .. version-added:: 1.13.0 */ NGHTTP3_EXTERN void nghttp3_qpack_encoder_set_indexing_strat(nghttp3_qpack_encoder *encoder, @@ -1352,12 +1365,28 @@ nghttp3_qpack_encoder_ack_everything(nghttp3_qpack_encoder *encoder); /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.16.0 + * Use `nghttp3_qpack_encoder_get_num_blocked_streams2` instead. + * * `nghttp3_qpack_encoder_get_num_blocked_streams` returns the number * of streams which are potentially blocked at decoder side. */ NGHTTP3_EXTERN size_t nghttp3_qpack_encoder_get_num_blocked_streams(nghttp3_qpack_encoder *encoder); +/** + * @function + * + * `nghttp3_qpack_encoder_get_num_blocked_streams2` returns the number + * of streams which are potentially blocked at decoder side. + * + * .. version-added:: 1.16.0 + */ +NGHTTP3_EXTERN size_t nghttp3_qpack_encoder_get_num_blocked_streams2( + const nghttp3_qpack_encoder *encoder); + /** * @struct * @@ -1401,12 +1430,26 @@ nghttp3_qpack_stream_context_del(nghttp3_qpack_stream_context *sctx); /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.16.0 + * Use `nghttp3_qpack_stream_context_get_ricnt2` instead. + * * `nghttp3_qpack_stream_context_get_ricnt` returns required insert * count. */ NGHTTP3_EXTERN uint64_t nghttp3_qpack_stream_context_get_ricnt(nghttp3_qpack_stream_context *sctx); +/** + * @function + * + * `nghttp3_qpack_stream_context_get_ricnt2` returns required insert + * count. + */ +NGHTTP3_EXTERN uint64_t nghttp3_qpack_stream_context_get_ricnt2( + const nghttp3_qpack_stream_context *sctx); + /** * @function * @@ -1495,7 +1538,7 @@ nghttp3_qpack_decoder_get_icnt(const nghttp3_qpack_decoder *decoder); * * :macro:`NGHTTP3_QPACK_DECODE_FLAG_NONE` indicates that no flag set. */ -#define NGHTTP3_QPACK_DECODE_FLAG_NONE 0x00u +#define NGHTTP3_QPACK_DECODE_FLAG_NONE 0x00U /** * @macro @@ -1503,7 +1546,7 @@ nghttp3_qpack_decoder_get_icnt(const nghttp3_qpack_decoder *decoder); * :macro:`NGHTTP3_QPACK_DECODE_FLAG_EMIT` indicates that an HTTP * field is successfully decoded. */ -#define NGHTTP3_QPACK_DECODE_FLAG_EMIT 0x01u +#define NGHTTP3_QPACK_DECODE_FLAG_EMIT 0x01U /** * @macro @@ -1511,7 +1554,7 @@ nghttp3_qpack_decoder_get_icnt(const nghttp3_qpack_decoder *decoder); * :macro:`NGHTTP3_QPACK_DECODE_FLAG_FINAL` indicates that an entire * HTTP field section has been decoded. */ -#define NGHTTP3_QPACK_DECODE_FLAG_FINAL 0x02u +#define NGHTTP3_QPACK_DECODE_FLAG_FINAL 0x02U /** * @macro @@ -1519,7 +1562,7 @@ nghttp3_qpack_decoder_get_icnt(const nghttp3_qpack_decoder *decoder); * :macro:`NGHTTP3_QPACK_DECODE_FLAG_BLOCKED` indicates that decoding * has been blocked. */ -#define NGHTTP3_QPACK_DECODE_FLAG_BLOCKED 0x04u +#define NGHTTP3_QPACK_DECODE_FLAG_BLOCKED 0x04U /** * @function @@ -1579,8 +1622,8 @@ NGHTTP3_EXTERN nghttp3_ssize nghttp3_qpack_decoder_read_request( * * The caller must ensure that `nghttp3_buf_left(dbuf) * ` >= - * `nghttp3_qpack_decoder_get_decoder_streamlen(decoder) - * `. + * `nghttp3_qpack_decoder_get_decoder_streamlen2(decoder) + * `. */ NGHTTP3_EXTERN void nghttp3_qpack_decoder_write_decoder(nghttp3_qpack_decoder *decoder, @@ -1589,12 +1632,28 @@ nghttp3_qpack_decoder_write_decoder(nghttp3_qpack_decoder *decoder, /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.16.0 + * Use `nghttp3_qpack_decoder_get_decoder_streamlen2` instead. + * * `nghttp3_qpack_decoder_get_decoder_streamlen` returns the length of * decoder stream that is currently pending. */ NGHTTP3_EXTERN size_t nghttp3_qpack_decoder_get_decoder_streamlen(nghttp3_qpack_decoder *decoder); +/** + * @function + * + * `nghttp3_qpack_decoder_get_decoder_streamlen2` returns the length + * of decoder stream that is currently pending. + * + * .. version-added:: 1.16.0 + */ +NGHTTP3_EXTERN size_t nghttp3_qpack_decoder_get_decoder_streamlen2( + const nghttp3_qpack_decoder *decoder); + /** * @function * @@ -1714,7 +1773,7 @@ NGHTTP3_EXTERN void nghttp3_set_debug_vprintf_callback( * by a server when it initiates graceful shutdown of the connection * via `nghttp3_conn_submit_shutdown_notice`. */ -#define NGHTTP3_SHUTDOWN_NOTICE_STREAM_ID ((1ull << 62) - 4) +#define NGHTTP3_SHUTDOWN_NOTICE_STREAM_ID ((1ULL << 62) - 4) /** * @macro @@ -1724,7 +1783,7 @@ NGHTTP3_EXTERN void nghttp3_set_debug_vprintf_callback( * `nghttp3_conn_submit_shutdown_notice`. Note that libnghttp3 does * not implement HTTP/3 Server Push. */ -#define NGHTTP3_SHUTDOWN_NOTICE_PUSH_ID ((1ull << 62) - 1) +#define NGHTTP3_SHUTDOWN_NOTICE_PUSH_ID ((1ULL << 62) - 1) /** * @struct @@ -1790,7 +1849,8 @@ typedef struct nghttp3_settings { * Datagrams (see :rfc:`9297`). */ uint8_t h3_datagram; - /* The following fields have been added since NGHTTP3_SETTINGS_V2. */ + /* The following fields have been added since + NGHTTP3_SETTINGS_V2. */ /** * :member:`origin_list`, if set, must contain a serialized HTTP/3 * ORIGIN frame (see :rfc:`9412`) payload. The ORIGIN frame payload @@ -1802,10 +1862,13 @@ typedef struct nghttp3_settings { * until the :type:`nghttp3_conn` to which this field was passed is * freed by `nghttp3_conn_del`. The object pointed to by this field * is copied internally, and does not need to be kept alive. Only - * server uses this field. This field is available since v1.11.0. + * server uses this field. + * + * .. version-added:: 1.11.0 */ const nghttp3_vec *origin_list; - /* The following fields have been added since NGHTTP3_SETTINGS_V3. */ + /* The following fields have been added since + NGHTTP3_SETTINGS_V3. */ /** * :member:`glitch_ratelim_burst` is the maximum number of tokens * available to "glitch" rate limiter. "glitch" is a suspicious @@ -1813,21 +1876,27 @@ typedef struct nghttp3_settings { * tokens are consumed. If no tokens are available to consume, the * connection is closed. The rate of token generation is specified * by :member:`glitch_ratelim_rate`. This feature is enabled only - * when `nghttp3_conn_read_stream2` is used. This field has been - * available since v1.12.0. + * when `nghttp3_conn_read_stream2` is used. + * + * .. version-added:: 1.12.0 */ uint64_t glitch_ratelim_burst; /** * :member:`glitch_ratelim_rate` is the number of tokens generated * per second. See :member:`glitch_ratelim_burst` for "glitch" rate - * limiter. This field has been available since v1.12.0. + * limiter. + * + * .. version-added:: 1.12.0 */ uint64_t glitch_ratelim_rate; + /* The following fields have been added since + NGHTTP3_SETTINGS_V4. */ /** * :member:`qpack_indexing_strat` defines the QPACK dynamic table * indexing strategy for those fields that are not defined in - * :type:`nghttp3_qpack_token`. This field has been available since - * v1.13.0. + * :type:`nghttp3_qpack_token`. + * + * .. version-added:: 1.13.0 */ nghttp3_qpack_indexing_strat qpack_indexing_strat; } nghttp3_settings; @@ -1839,7 +1908,9 @@ typedef struct nghttp3_settings { * @struct * * :type:`nghttp3_proto_settings` contains HTTP/3 settings that this - * library can recognize. This field is available since v1.14.0. + * library can recognize. + * + * .. version-added:: 1.14.0 */ typedef struct nghttp3_proto_settings { /** @@ -1890,7 +1961,7 @@ typedef int (*nghttp3_acked_stream_data)(nghttp3_conn *conn, int64_t stream_id, /** * @functypedef * - * :type:`nghttp3_conn_stream_close` is a callback function which is + * :type:`nghttp3_stream_close` is a callback function which is * invoked when a stream identified by |stream_id| is closed. QUIC * application error code |app_error_code| indicates the reason of * this closure. @@ -1899,6 +1970,9 @@ typedef int (*nghttp3_acked_stream_data)(nghttp3_conn *conn, int64_t stream_id, * Returning :macro:`NGHTTP3_ERR_CALLBACK_FAILURE` will return to the * caller immediately. Any values other than 0 is treated as * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE`. + * + * .. seealso:: + * :type:`nghttp3_stream_close2` */ typedef int (*nghttp3_stream_close)(nghttp3_conn *conn, int64_t stream_id, uint64_t app_error_code, @@ -2096,8 +2170,9 @@ typedef int (*nghttp3_shutdown)(nghttp3_conn *conn, int64_t id, * * .. warning:: * - * Deprecated since v1.14.0. Use :type:`nghttp3_recv_settings2` - * instead. New settings will not be notified with this callback. + * .. version-deprecated:: 1.14.0 + * Use :type:`nghttp3_recv_settings2` instead. New settings will + * not be notified with this callback. * * :type:`nghttp3_recv_settings` is a callback function which is * invoked when SETTINGS frame is received. |settings| is a received @@ -2160,17 +2235,88 @@ typedef void (*nghttp3_rand)(uint8_t *dest, size_t destlen); * The implementation of this callback must return 0 if it succeeds. * Returning :macro:`NGHTTP3_ERR_CALLBACK_FAILURE` will return to the * caller immediately. Any values other than 0 is treated as - * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE`. This callback is available - * since v1.14.0. + * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE`. + * + * .. version-added:: 1.14.0 */ typedef int (*nghttp3_recv_settings2)(nghttp3_conn *conn, const nghttp3_proto_settings *settings, void *conn_user_data); +/** + * @macrosection + * + * Stream close flags + */ + +/** + * @macro + * + * :macro:`NGHTTP3_STREAM_CLOSE_FLAG_NONE` indicates no flag set. + * + * .. version-added:: 1.18.0 + */ +#define NGHTTP3_STREAM_CLOSE_FLAG_NONE 0x00U + +/** + * @macro + * + * :macro:`NGHTTP3_STREAM_CLOSE_FLAG_RX_APP_ERROR_CODE_SET` indicates + * that rx_app_error_code parameter is set. + * + * .. version-added:: 1.18.0 + */ +#define NGHTTP3_STREAM_CLOSE_FLAG_RX_APP_ERROR_CODE_SET 0x01U + +/** + * @macro + * + * :macro:`NGHTTP3_STREAM_CLOSE_FLAG_TX_APP_ERROR_CODE_SET` indicates + * that tx_app_error_code parameter is set. + * + * .. version-added:: 1.18.0 + */ +#define NGHTTP3_STREAM_CLOSE_FLAG_TX_APP_ERROR_CODE_SET 0x02U + +/** + * @functypedef + * + * :type:`nghttp3_stream_close2` is a callback function which is + * invoked when a stream identified by |stream_id| is closed. If + * :macro:`NGHTTP3_STREAM_CLOSE_FLAG_RX_APP_ERROR_CODE_SET` is set in + * |flags|, |rx_app_error_code| is the QUIC application error code + * that shut down the receiving side of the stream. If + * :macro:`NGHTTP3_STREAM_CLOSE_FLAG_TX_APP_ERROR_CODE_SET` is set in + * |flags|, |tx_app_error_code| is the QUIC application error code + * that shut down the sending side of the stream. No application code + * means that direction of stream is closed without any error. + * + * This callback should be used with `nghttp3_conn_close_stream2`. If + * `nghttp3_conn_close_stream` is used, the app_error_code is set to + * both |rx_app_error_code| and |tx_app_error_code|, and + * :macro:`NGHTTP3_STREAM_CLOSE_FLAG_RX_APP_ERROR_CODE_SET` and + * :macro:`NGHTTP3_STREAM_CLOSE_FLAG_TX_APP_ERROR_CODE_SET` are set in + * |flags|. + * + * The implementation of this callback must return 0 if it succeeds. + * Returning :macro:`NGHTTP3_ERR_CALLBACK_FAILURE` will return to the + * caller immediately. Any values other than 0 is treated as + * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE`. + * + * .. version-added:: 1.18.0 + */ +typedef int (*nghttp3_stream_close2)(nghttp3_conn *conn, uint32_t flags, + int64_t stream_id, + uint64_t rx_app_error_code, + uint64_t tx_app_error_code, + void *conn_user_data, + void *stream_user_data); + #define NGHTTP3_CALLBACKS_V1 1 #define NGHTTP3_CALLBACKS_V2 2 #define NGHTTP3_CALLBACKS_V3 3 -#define NGHTTP3_CALLBACKS_VERSION NGHTTP3_CALLBACKS_V3 +#define NGHTTP3_CALLBACKS_V4 4 +#define NGHTTP3_CALLBACKS_VERSION NGHTTP3_CALLBACKS_V4 /** * @struct @@ -2187,6 +2333,9 @@ typedef struct nghttp3_callbacks { /** * :member:`stream_close` is a callback function which is invoked * when a particular stream has closed. + * + * .. seealso:: + * :member:`stream_close2` */ nghttp3_stream_close stream_close; /** @@ -2262,24 +2411,27 @@ typedef struct nghttp3_callbacks { /** * .. warning:: * - * Deprecated since v1.14.0. Use :member:`recv_settings2` - * instead. + * .. version-deprecated:: 1.14.0 + * Use :member:`recv_settings2` instead. * * :member:`recv_settings` is a callback function which is invoked * when SETTINGS frame is received. */ nghttp3_recv_settings recv_settings; - /* The following fields have been added since NGHTTP3_CALLBACKS_V2. */ + /* The following fields have been added since + NGHTTP3_CALLBACKS_V2. */ /** * :member:`recv_origin` is a callback function which is invoked - * when a single origin in an ORIGIN frame is received. This field - * is available since v1.11.0. + * when a single origin in an ORIGIN frame is received. + * + * .. version-added:: 1.11.0 */ nghttp3_recv_origin recv_origin; /** * :member:`end_origin` is a callback function which is invoked when - * an ORIGIN frame has been completely processed. This field is - * available since v1.11.0. + * an ORIGIN frame has been completely processed. + * + * .. version-added:: 1.11.0 */ nghttp3_end_origin end_origin; /** @@ -2287,16 +2439,29 @@ typedef struct nghttp3_callbacks { * unpredictable data are needed. Although this field is optional * due to the backward compatibility, it is recommended to specify * this field to harden the runtime behavior against suspicious - * activities of a remote endpoint. This field is available since - * v1.11.0. + * activities of a remote endpoint. + * + * .. version-added:: 1.11.0 */ nghttp3_rand rand; + /* The following fields have been added since + NGHTTP3_CALLBACKS_V3. */ /** * :member:`recv_settings2` is a callback function which is invoked - * when SETTINGS frame is received. This field is available since - * v1.14.0. + * when SETTINGS frame is received. + * + * .. version-added:: 1.14.0 */ nghttp3_recv_settings2 recv_settings2; + /* The following fields have been added since + NGHTTP3_CALLBACKS_V4. */ + /** + * :member:`stream_close2` is a callback function which is invoked + * when a particular stream has closed. + * + * .. version-added:: 1.18.0 + */ + nghttp3_stream_close2 stream_close2; } nghttp3_callbacks; /** @@ -2306,7 +2471,7 @@ typedef struct nghttp3_callbacks { * values. * * - :member:`max_field_section_size - * ` = :expr:`((1ull << 62) - 1)` + * ` = :expr:`((1ULL << 62) - 1)` * - :member:`qpack_max_dtable_capacity * ` = 0 * - :member:`qpack_encoder_max_dtable_capacity @@ -2417,8 +2582,8 @@ NGHTTP3_EXTERN int nghttp3_conn_bind_qpack_streams(nghttp3_conn *conn, * * .. warning:: * - * Deprecated since v1.12.0. Use `nghttp3_conn_read_stream2` - * instead. + * .. version-deprecated:: 1.12.0 + * Use `nghttp3_conn_read_stream2` instead. * * `nghttp3_conn_read_stream` reads data |src| of length |srclen| on * stream identified by |stream_id|. It returns the number of bytes @@ -2476,7 +2641,7 @@ NGHTTP3_EXTERN nghttp3_ssize nghttp3_conn_read_stream(nghttp3_conn *conn, * be closed. Calling nghttp3 API other than `nghttp3_conn_del` * causes undefined behavior. * - * This function is available since v1.12.0. + * .. version-added:: 1.12.0 */ NGHTTP3_EXTERN nghttp3_ssize nghttp3_conn_read_stream2(nghttp3_conn *conn, int64_t stream_id, @@ -2547,6 +2712,25 @@ NGHTTP3_EXTERN nghttp3_ssize nghttp3_conn_writev_stream(nghttp3_conn *conn, NGHTTP3_EXTERN int nghttp3_conn_add_write_offset(nghttp3_conn *conn, int64_t stream_id, size_t n); +/** + * @function + * + * `nghttp3_conn_is_stream_flushed` returns nonzero if all stream data + * for a stream identified by |stream_id| so far have been accepted by + * QUIC stack. This means that the cumulative number of bytes that + * `nghttp3_conn_add_write_offset` notified covers all stream data + * currently held. This does not mean more stream data cannot be + * submitted to this stream via :type:`nghttp3_read_data_callback` and + * all stream data have been acknowledged. + * + * If there is no stream identified by |stream_id|, this function + * returns nonzero. + * + * .. version-added:: 1.17.0 + */ +NGHTTP3_EXTERN int nghttp3_conn_is_stream_flushed(const nghttp3_conn *conn, + int64_t stream_id); + /** * @function * @@ -2624,6 +2808,11 @@ NGHTTP3_EXTERN int nghttp3_conn_unblock_stream(nghttp3_conn *conn, /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.16.0 + * Use `nghttp3_conn_is_stream_writable2` instead. + * * `nghttp3_conn_is_stream_writable` returns nonzero if a stream * identified by |stream_id| is writable. It is not writable if: * @@ -2641,6 +2830,28 @@ NGHTTP3_EXTERN int nghttp3_conn_unblock_stream(nghttp3_conn *conn, NGHTTP3_EXTERN int nghttp3_conn_is_stream_writable(nghttp3_conn *conn, int64_t stream_id); +/** + * @function + * + * `nghttp3_conn_is_stream_writable2` returns nonzero if a stream + * identified by |stream_id| is writable. It is not writable if: + * + * - the stream does not exist; or, + * - the stream is closed (e.g., `nghttp3_conn_close_stream` is + * called); or, + * - the stream is QUIC flow control blocked (e.g., + * `nghttp3_conn_block_stream` is called); or, + * - the stream is input data blocked (e.g., + * :macro:`NGHTTP3_ERR_WOULDBLOCK` is returned from + * :type:`nghttp3_read_data_callback`); or, + * - the stream is half-closed local (e.g., + * `nghttp3_conn_shutdown_stream_write` is called). + * + * .. version-added:: 1.16.0 + */ +NGHTTP3_EXTERN int nghttp3_conn_is_stream_writable2(const nghttp3_conn *conn, + int64_t stream_id); + /** * @function * @@ -2713,11 +2924,47 @@ NGHTTP3_EXTERN int nghttp3_conn_resume_stream(nghttp3_conn *conn, * A critical stream is closed. * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE` * User callback failed + * + * .. seealso:: + * `nghttp3_conn_close_stream2` */ NGHTTP3_EXTERN int nghttp3_conn_close_stream(nghttp3_conn *conn, int64_t stream_id, uint64_t app_error_code); +/** + * @function + * + * `nghttp3_conn_close_stream2` tells the library that a stream + * identified by |stream_id| has been closed. If + * :macro:`NGHTTP3_STREAM_CLOSE_FLAG_RX_APP_ERROR_CODE_SET` is set in + * |flags|, |rx_app_error_code| is the QUIC application error code + * that shut down the receiving side of the stream. Similarly, + * :macro:`NGHTTP3_STREAM_CLOSE_FLAG_TX_APP_ERROR_CODE_SET` is set in + * |flags|, |tx_app_error_code| is the QUIC application error code + * that shut down the sending side of the stream. + * + * For stream close callback, prefer + * :member:`nghttp3_callbacks.stream_close2` to + * :member:`nghttp3_callbacks.stream_close`. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * :macro:`NGHTTP3_ERR_STREAM_NOT_FOUND` + * Stream not found. + * :macro:`NGHTTP3_ERR_H3_CLOSED_CRITICAL_STREAM` + * A critical stream is closed. + * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE` + * User callback failed + * + * .. version-added:: 1.18.0 + */ +NGHTTP3_EXTERN int nghttp3_conn_close_stream2(nghttp3_conn *conn, + uint32_t flags, int64_t stream_id, + uint64_t rx_app_error_code, + uint64_t tx_app_error_code); + /** * @macrosection * @@ -2729,7 +2976,7 @@ NGHTTP3_EXTERN int nghttp3_conn_close_stream(nghttp3_conn *conn, * * :macro:`NGHTTP3_DATA_FLAG_NONE` indicates no flag set. */ -#define NGHTTP3_DATA_FLAG_NONE 0x00u +#define NGHTTP3_DATA_FLAG_NONE 0x00U /** * @macro @@ -2739,7 +2986,7 @@ NGHTTP3_EXTERN int nghttp3_conn_close_stream(nghttp3_conn *conn, * that sending side of stream is closed unless * :macro:`NGHTTP3_DATA_FLAG_NO_END_STREAM` is given at the same time. */ -#define NGHTTP3_DATA_FLAG_EOF 0x01u +#define NGHTTP3_DATA_FLAG_EOF 0x01U /** * @macro @@ -2751,7 +2998,7 @@ NGHTTP3_EXTERN int nghttp3_conn_close_stream(nghttp3_conn *conn, * has been called, regardless of this flag, the submitted trailer * fields are sent. */ -#define NGHTTP3_DATA_FLAG_NO_END_STREAM 0x02u +#define NGHTTP3_DATA_FLAG_NO_END_STREAM 0x02U /** * @function @@ -2964,6 +3211,29 @@ NGHTTP3_EXTERN int nghttp3_conn_set_stream_user_data(nghttp3_conn *conn, /** * @function * + * `nghttp3_conn_get_stream_user_data` returns the user data + * associated to the stream identified by |stream_id|. If no data is + * associated or the stream is not found, this function returns NULL. + * + * The user data can be associated to the stream by the following + * functions: + * + * - `nghttp3_conn_set_stream_user_data` + * - `nghttp3_conn_submit_request` + * + * .. version-added:: 1.16.0 + */ +NGHTTP3_EXTERN void *nghttp3_conn_get_stream_user_data(const nghttp3_conn *conn, + int64_t stream_id); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.16.0 + * Use `nghttp3_conn_get_frame_payload_left2` instead. + * * `nghttp3_conn_get_frame_payload_left` returns the number of bytes * left to read current frame payload for a stream denoted by * |stream_id|. If no such stream is found, or |stream_id| identifies @@ -2973,6 +3243,20 @@ NGHTTP3_EXTERN int nghttp3_conn_set_stream_user_data(nghttp3_conn *conn, NGHTTP3_EXTERN uint64_t nghttp3_conn_get_frame_payload_left(nghttp3_conn *conn, int64_t stream_id); +/** + * @function + * + * `nghttp3_conn_get_frame_payload_left2` returns the number of bytes + * left to read current frame payload for a stream denoted by + * |stream_id|. If no such stream is found, or |stream_id| identifies + * neither client bidirectional stream nor remote control stream, it + * returns 0. + * + * .. version-added:: 1.16.0 + */ +NGHTTP3_EXTERN uint64_t nghttp3_conn_get_frame_payload_left2( + const nghttp3_conn *conn, int64_t stream_id); + /** * @macrosection * @@ -3034,6 +3318,11 @@ typedef struct NGHTTP3_ALIGN(8) nghttp3_pri { /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.16.0 + * Use `nghttp3_conn_get_stream_priority2` instead. + * * `nghttp3_conn_get_stream_priority` stores stream priority of a * stream denoted by |stream_id| into |*dest|. |stream_id| must * identify client initiated bidirectional stream. Only server can @@ -3053,6 +3342,32 @@ typedef struct NGHTTP3_ALIGN(8) nghttp3_pri { NGHTTP3_EXTERN int nghttp3_conn_get_stream_priority_versioned( nghttp3_conn *conn, int pri_version, nghttp3_pri *dest, int64_t stream_id); +/** + * @function + * + * `nghttp3_conn_get_stream_priority2` stores stream priority of a + * stream denoted by |stream_id| into |*dest|. |stream_id| must + * identify client initiated bidirectional stream. Only server can + * use this function. + * + * This function must not be called if |conn| is initialized as + * client. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * :macro:`NGHTTP3_ERR_INVALID_ARGUMENT` + * |stream_id| is not a client initiated bidirectional stream ID. + * :macro:`NGHTTP3_ERR_STREAM_NOT_FOUND` + * Stream not found. + * + * .. version-added:: 1.16.0 + */ +NGHTTP3_EXTERN int +nghttp3_conn_get_stream_priority2_versioned(const nghttp3_conn *conn, + int pri_version, nghttp3_pri *dest, + int64_t stream_id); + /** * @function * @@ -3139,12 +3454,28 @@ NGHTTP3_EXTERN int nghttp3_check_header_value(const uint8_t *value, size_t len); /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.16.0 + * Use `nghttp3_conn_is_drained2` instead. + * * `nghttp3_conn_is_drained` returns nonzero if * `nghttp3_conn_shutdown` has been called, and there is no active * remote streams. This function is for server use only. */ NGHTTP3_EXTERN int nghttp3_conn_is_drained(nghttp3_conn *conn); +/** + * @function + * + * `nghttp3_conn_is_drained2` returns nonzero if + * `nghttp3_conn_shutdown` has been called, and there is no active + * remote streams. This function is for server use only. + * + * .. version-added:: 1.16.0 + */ +NGHTTP3_EXTERN int nghttp3_conn_is_drained2(const nghttp3_conn *conn); + /** * @function * @@ -3229,6 +3560,75 @@ NGHTTP3_EXTERN const nghttp3_info *nghttp3_version(int least_version); */ NGHTTP3_EXTERN int nghttp3_err_is_fatal(int liberr); +/** + * @function + * + * `nghttp3_get_uvarint` reads variable-length unsigned integer from + * the buffer pointed by |p|, and stores it in the object pointed by + * |dest| in host byte order. It returns |p| plus the number of bytes + * read from |p|. This function assumes that |p| points to the buffer + * that contains a valid variable-length unsigned integer. Use + * `nghttp3_get_uvarintlen` to get the number of bytes to successfully + * decode an integer. + * + * .. version-added:: 1.17.0 + */ +NGHTTP3_EXTERN const uint8_t *nghttp3_get_uvarint(uint64_t *dest, + const uint8_t *p); + +/** + * @function + * + * `nghttp3_get_uvarintlen` returns the required number of bytes to + * read variable-length unsigned integer starting at |p|. |p| must + * not be NULL. This function only reads the single byte from the + * buffer pointed by |p|, and determines the number of bytes to read. + * + * .. version-added:: 1.17.0 + */ +NGHTTP3_EXTERN size_t nghttp3_get_uvarintlen(const uint8_t *p); + +/** + * @function + * + * `nghttp3_get_varint` reads variable-length unsigned integer from + * the buffer pointed by |p|, and stores it in the object pointed by + * |dest| in host byte order. It returns |p| plus the number of bytes + * read from |p|. This function assumes that |p| points to the buffer + * that contains a valid variable-length unsigned integer. Use + * `nghttp3_get_uvarintlen` to get the number of bytes to successfully + * decode an integer. + * + * .. version-added:: 1.17.0 + */ +NGHTTP3_EXTERN const uint8_t *nghttp3_get_varint(int64_t *dest, + const uint8_t *p); + +/** + * @function + * + * `nghttp3_put_uvarint` writes |n| to the buffer pointed by |p| using + * variable-length unsigned integer encoding. It returns the one + * beyond of the last written position. This function assumes that + * the buffer pointed by |p| has sufficient capacity to encode |n|. + * To know the required capacity, use `nghttp3_put_uvarintlen`. |n| + * must be less than or equal to (1 << 62) - 1. + * + * .. version-added:: 1.17.0 + */ +NGHTTP3_EXTERN uint8_t *nghttp3_put_uvarint(uint8_t *p, uint64_t n); + +/** + * @function + * + * `nghttp3_put_uvarintlen` returns the required number of bytes to + * encode |n| in variable-length unsigned integer encoding. |n| must + * be less than or equal to (1 << 62) - 1. + * + * .. version-added:: 1.17.0 + */ +NGHTTP3_EXTERN size_t nghttp3_put_uvarintlen(uint64_t n); + /* * Versioned function wrappers */ @@ -3279,6 +3679,15 @@ NGHTTP3_EXTERN int nghttp3_err_is_fatal(int liberr); nghttp3_conn_get_stream_priority_versioned((CONN), NGHTTP3_PRI_VERSION, \ (DEST), (STREAM_ID)) +/* + * `nghttp3_conn_get_stream_priority2` is a wrapper around + * `nghttp3_conn_get_stream_priority2_versioned` to set the correct + * struct version. + */ +#define nghttp3_conn_get_stream_priority2(CONN, DEST, STREAM_ID) \ + nghttp3_conn_get_stream_priority2_versioned((CONN), NGHTTP3_PRI_VERSION, \ + (DEST), (STREAM_ID)) + /* * `nghttp3_pri_parse_priority` is a wrapper around * `nghttp3_pri_parse_priority_versioned` to set the correct struct diff --git a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h index 0710f8efbd33..adb41c1c7b2d 100644 --- a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h +++ b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h @@ -31,7 +31,7 @@ * * Version number of the nghttp3 library release. */ -#define NGHTTP3_VERSION "1.14.0" +#define NGHTTP3_VERSION "1.18.0" /** * @macro @@ -41,6 +41,6 @@ * number, 8 bits for minor and 8 bits for patch. Version 1.2.3 * becomes 0x010203. */ -#define NGHTTP3_VERSION_NUM 0x010e00 +#define NGHTTP3_VERSION_NUM 0x011200 #endif /* !defined(NGHTTP3_VERSION_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.c b/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.c index 25c0fef2f7b1..436310633349 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.c @@ -31,7 +31,7 @@ void nghttp3_balloc_init(nghttp3_balloc *balloc, size_t blklen, const nghttp3_mem *mem) { - assert((blklen & 0xfu) == 0); + assert((blklen & 0xFU) == 0); balloc->mem = mem; balloc->blklen = blklen; @@ -67,7 +67,7 @@ int nghttp3_balloc_get(nghttp3_balloc *balloc, void **pbuf, size_t n) { if (nghttp3_buf_left(&balloc->buf) < n) { p = nghttp3_mem_malloc(balloc->mem, - sizeof(nghttp3_memblock_hd) + 0x8u + balloc->blklen); + sizeof(nghttp3_memblock_hd) + 0x8U + balloc->blklen); if (p == NULL) { return NGHTTP3_ERR_NOMEM; } @@ -77,15 +77,15 @@ int nghttp3_balloc_get(nghttp3_balloc *balloc, void **pbuf, size_t n) { balloc->head = hd; nghttp3_buf_wrap_init( &balloc->buf, - (uint8_t *)(((uintptr_t)p + sizeof(nghttp3_memblock_hd) + 0xfu) & - ~(uintptr_t)0xfu), + (uint8_t *)(((uintptr_t)p + sizeof(nghttp3_memblock_hd) + 0xFU) & + ~(uintptr_t)0xFU), balloc->blklen); } - assert(((uintptr_t)balloc->buf.last & 0xfu) == 0); + assert(((uintptr_t)balloc->buf.last & 0xFU) == 0); *pbuf = balloc->buf.last; - balloc->buf.last += (n + 0xfu) & ~(uintptr_t)0xfu; + balloc->buf.last += (n + 0xFU) & ~(size_t)0xFU; return 0; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_callbacks.c b/deps/ngtcp2/nghttp3/lib/nghttp3_callbacks.c index 4e5111c4ca94..441c707af90f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_callbacks.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_callbacks.c @@ -45,7 +45,7 @@ nghttp3_callbacks_convert_to_latest(nghttp3_callbacks *dest, return src; } - memset(dest, 0, sizeof(*dest)); + *dest = (nghttp3_callbacks){0}; callbacks_copy(dest, src, callbacks_version); @@ -66,6 +66,9 @@ size_t nghttp3_callbackslen_version(int callbacks_version) { switch (callbacks_version) { case NGHTTP3_CALLBACKS_VERSION: return sizeof(callbacks); + case NGHTTP3_CALLBACKS_V3: + return offsetof(nghttp3_callbacks, recv_settings2) + + sizeof(callbacks.recv_settings2); case NGHTTP3_CALLBACKS_V2: return offsetof(nghttp3_callbacks, rand) + sizeof(callbacks.rand); case NGHTTP3_CALLBACKS_V1: diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c index ccf04984981d..04b50ac3b632 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c @@ -43,7 +43,7 @@ nghttp3_objalloc_def(chunk, nghttp3_chunk, oplent) * conn_remote_stream_uni returns nonzero if |stream_id| is remote * unidirectional stream ID. */ -static int conn_remote_stream_uni(nghttp3_conn *conn, int64_t stream_id) { +static int conn_remote_stream_uni(const nghttp3_conn *conn, int64_t stream_id) { if (conn->server) { return (stream_id & 0x03) == 0x02; } @@ -495,7 +495,7 @@ nghttp3_ssize nghttp3_conn_read_stream2(nghttp3_conn *conn, int64_t stream_id, } conn->rx.max_stream_id_bidi = - nghttp3_max_int64(conn->rx.max_stream_id_bidi, stream_id); + nghttp3_max(conn->rx.max_stream_id_bidi, stream_id); rv = nghttp3_conn_create_stream(conn, &stream, stream_id); if (rv != 0) { return rv; @@ -572,7 +572,7 @@ static nghttp3_ssize conn_read_type(nghttp3_conn *conn, nghttp3_stream *stream, nghttp3_stream_read_state *rstate = &stream->rstate; nghttp3_varint_read_state *rvint = &rstate->rvint; nghttp3_ssize nread; - int64_t stream_type; + uint64_t stream_type; assert(srclen); @@ -623,7 +623,9 @@ static nghttp3_ssize conn_read_type(nghttp3_conn *conn, nghttp3_stream *stream, return nread; } -static int conn_delete_stream(nghttp3_conn *conn, nghttp3_stream *stream); +static int conn_delete_stream(nghttp3_conn *conn, nghttp3_stream *stream, + uint32_t flags, uint64_t rx_app_error_code, + uint64_t tx_app_error_code); nghttp3_ssize nghttp3_conn_read_uni(nghttp3_conn *conn, nghttp3_stream *stream, const uint8_t *src, size_t srclen, int fin, @@ -649,10 +651,8 @@ nghttp3_ssize nghttp3_conn_read_uni(nghttp3_conn *conn, nghttp3_stream *stream, return NGHTTP3_ERR_H3_EXCESSIVE_LOAD; } - rv = conn_delete_stream(conn, stream); - assert(0 == rv); - - return 0; + return conn_delete_stream(conn, stream, NGHTTP3_STREAM_CLOSE_FLAG_NONE, 0, + 0); } nread = conn_read_type(conn, stream, src, srclen, fin); if (nread < 0) { @@ -724,8 +724,8 @@ static void conn_reset_rx_originlen(nghttp3_conn *conn) { conn->rx.originlen = 0; } -static int frame_fin(nghttp3_stream_read_state *rstate, size_t len) { - return (int64_t)len >= rstate->left; +static int frame_fin(const nghttp3_stream_read_state *rstate, size_t len) { + return len >= rstate->left; } nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, @@ -909,7 +909,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, } /* Read Identifier */ - len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); assert(len > 0); nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { @@ -918,12 +918,12 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, p += nread; nconsumed += (size_t)nread; - rstate->left -= nread; + rstate->left -= (uint64_t)nread; if (rvint->left) { rstate->state = NGHTTP3_CTRL_STREAM_STATE_SETTINGS_ID; return (nghttp3_ssize)nconsumed; } - rstate->fr.settings.iv[0].id = (uint64_t)rvint->acc; + rstate->fr.settings.iv[0].id = rvint->acc; nghttp3_varint_read_state_reset(rvint); /* Read Value */ @@ -944,12 +944,12 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, p += nread; nconsumed += (size_t)nread; - rstate->left -= nread; + rstate->left -= (uint64_t)nread; if (rvint->left) { rstate->state = NGHTTP3_CTRL_STREAM_STATE_SETTINGS_VALUE; return (nghttp3_ssize)nconsumed; } - rstate->fr.settings.iv[0].value = (uint64_t)rvint->acc; + rstate->fr.settings.iv[0].value = rvint->acc; nghttp3_varint_read_state_reset(rvint); rv = @@ -960,7 +960,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, } break; case NGHTTP3_CTRL_STREAM_STATE_SETTINGS_ID: - len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); assert(len > 0); nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { @@ -969,11 +969,11 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, p += nread; nconsumed += (size_t)nread; - rstate->left -= nread; + rstate->left -= (uint64_t)nread; if (rvint->left) { return (nghttp3_ssize)nconsumed; } - rstate->fr.settings.iv[0].id = (uint64_t)rvint->acc; + rstate->fr.settings.iv[0].id = rvint->acc; nghttp3_varint_read_state_reset(rvint); if (rstate->left == 0) { @@ -987,7 +987,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, } /* Fall through */ case NGHTTP3_CTRL_STREAM_STATE_SETTINGS_VALUE: - len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); assert(len > 0); nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { @@ -996,11 +996,11 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, p += nread; nconsumed += (size_t)nread; - rstate->left -= nread; + rstate->left -= (uint64_t)nread; if (rvint->left) { return (nghttp3_ssize)nconsumed; } - rstate->fr.settings.iv[0].value = (uint64_t)rvint->acc; + rstate->fr.settings.iv[0].value = rvint->acc; nghttp3_varint_read_state_reset(rvint); rv = nghttp3_conn_on_settings_entry_received(conn, &rstate->fr.settings); @@ -1021,7 +1021,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, nghttp3_stream_read_state_reset(rstate); break; case NGHTTP3_CTRL_STREAM_STATE_GOAWAY: - len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); assert(len > 0); nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { @@ -1030,26 +1030,26 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, p += nread; nconsumed += (size_t)nread; - rstate->left -= nread; + rstate->left -= (uint64_t)nread; if (rvint->left) { return (nghttp3_ssize)nconsumed; } - if (!conn->server && !nghttp3_client_stream_bidi(rvint->acc)) { + if (!conn->server && !nghttp3_client_stream_bidi((int64_t)rvint->acc)) { return NGHTTP3_ERR_H3_ID_ERROR; } - if (conn->rx.goaway_id < rvint->acc) { + if (conn->rx.goaway_id < (int64_t)rvint->acc) { return NGHTTP3_ERR_H3_ID_ERROR; } /* Receiving same GOAWAY ID is suspicious. */ - if (conn->rx.goaway_id == rvint->acc && + if (conn->rx.goaway_id == (int64_t)rvint->acc && conn_glitch_ratelim_drain(conn, 1, ts) != 0) { return NGHTTP3_ERR_H3_EXCESSIVE_LOAD; } conn->flags |= NGHTTP3_CONN_FLAG_GOAWAY_RECVED; - conn->rx.goaway_id = rvint->acc; + conn->rx.goaway_id = (int64_t)rvint->acc; nghttp3_varint_read_state_reset(rvint); if (conn->callbacks.shutdown) { @@ -1064,7 +1064,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, break; case NGHTTP3_CTRL_STREAM_STATE_MAX_PUSH_ID: /* server side only */ - len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); assert(len > 0); nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { @@ -1073,29 +1073,29 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, p += nread; nconsumed += (size_t)nread; - rstate->left -= nread; + rstate->left -= (uint64_t)nread; if (rvint->left) { return (nghttp3_ssize)nconsumed; } - if (conn->local.uni.max_pushes > (uint64_t)rvint->acc + 1) { + if (conn->local.uni.max_pushes > rvint->acc + 1) { return NGHTTP3_ERR_H3_FRAME_ERROR; } /* Receiving same MAX_PUSH_ID is suspicious. */ - if (conn->local.uni.max_pushes == (uint64_t)rvint->acc + 1 && + if (conn->local.uni.max_pushes == rvint->acc + 1 && conn_glitch_ratelim_drain(conn, 1, ts) != 0) { return NGHTTP3_ERR_H3_EXCESSIVE_LOAD; } - conn->local.uni.max_pushes = (uint64_t)rvint->acc + 1; + conn->local.uni.max_pushes = rvint->acc + 1; nghttp3_varint_read_state_reset(rvint); nghttp3_stream_read_state_reset(rstate); break; case NGHTTP3_CTRL_STREAM_STATE_PRIORITY_UPDATE_PRI_ELEM_ID: /* server side only */ - len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); assert(len > 0); nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { @@ -1104,12 +1104,12 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, p += nread; nconsumed += (size_t)nread; - rstate->left -= nread; + rstate->left -= (uint64_t)nread; if (rvint->left) { return (nghttp3_ssize)nconsumed; } - rstate->fr.priority_update.pri_elem_id = rvint->acc; + rstate->fr.priority_update.pri_elem_id = (int64_t)rvint->acc; nghttp3_varint_read_state_reset(rvint); if (rstate->left == 0) { @@ -1138,9 +1138,9 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, case NGHTTP3_CTRL_STREAM_STATE_PRIORITY_UPDATE: /* We need to buffer Priority Field Value because it might be fragmented. */ - len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); assert(len > 0); - if (conn->rx.pri_fieldbuflen == 0 && rstate->left == (int64_t)len) { + if (conn->rx.pri_fieldbuflen == 0 && rstate->left == len) { /* Everything is in the input buffer. Apply same length limit we impose when buffering the field. */ if (len > sizeof(conn->rx.pri_fieldbuf)) { @@ -1160,7 +1160,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, memcpy(conn->rx.pri_fieldbuf + conn->rx.pri_fieldbuflen, p, len); conn->rx.pri_fieldbuflen += len; - if (rstate->left == (int64_t)len) { + if (rstate->left == len) { pri_field_value = conn->rx.pri_fieldbuf; pri_field_valuelen = conn->rx.pri_fieldbuflen; } @@ -1168,7 +1168,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, p += len; nconsumed += len; - rstate->left -= (int64_t)len; + rstate->left -= len; if (rstate->left) { return (nghttp3_ssize)nconsumed; @@ -1193,7 +1193,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, break; case NGHTTP3_CTRL_STREAM_STATE_ORIGIN_ORIGIN_LEN: /* client side only */ - len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); assert(len > 0); @@ -1203,12 +1203,12 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, for (; conn->rx.originlen_offset < sizeof(conn->rx.originlen) && (size_t)nread < len; ++conn->rx.originlen_offset, ++nread) { - conn->rx.originlen <<= 8; + conn->rx.originlen *= 256; conn->rx.originlen += *p++; } nconsumed += (size_t)nread; - rstate->left -= nread; + rstate->left -= (uint64_t)nread; len -= (size_t)nread; if (conn->rx.originlen_offset < sizeof(conn->rx.originlen)) { @@ -1240,7 +1240,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, /* No need to update p because we will return very soon. */ nconsumed += len; - rstate->left -= (int64_t)len; + rstate->left -= len; conn->rx.originbuflen = len; @@ -1281,8 +1281,8 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, break; case NGHTTP3_CTRL_STREAM_STATE_ORIGIN_ASCII_ORIGIN: /* client side only */ - len = nghttp3_min_size(conn->rx.originlen - conn->rx.originbuflen, - (size_t)(end - p)); + len = nghttp3_min(conn->rx.originlen - conn->rx.originbuflen, + (size_t)(end - p)); assert(len > 0); @@ -1291,7 +1291,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, conn->rx.originbuflen += len; p += len; nconsumed += len; - rstate->left -= (int64_t)len; + rstate->left -= len; if (conn->rx.originbuflen < conn->rx.originlen) { return (nghttp3_ssize)nconsumed; @@ -1319,10 +1319,10 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, break; case NGHTTP3_CTRL_STREAM_STATE_IGN_FRAME: - len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); p += len; nconsumed += len; - rstate->left -= (int64_t)len; + rstate->left -= len; if (rstate->left) { return (nghttp3_ssize)nconsumed; @@ -1338,9 +1338,11 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, return (nghttp3_ssize)nconsumed; } -static int conn_delete_stream(nghttp3_conn *conn, nghttp3_stream *stream) { - int bidi = nghttp3_client_stream_bidi(stream->node.id); +static int conn_delete_stream(nghttp3_conn *conn, nghttp3_stream *stream, + uint32_t flags, uint64_t rx_app_error_code, + uint64_t tx_app_error_code) { int rv; + uint64_t app_error_code; rv = conn_call_deferred_consume(conn, stream, nghttp3_stream_get_buffered_datalen(stream)); @@ -1348,23 +1350,38 @@ static int conn_delete_stream(nghttp3_conn *conn, nghttp3_stream *stream) { return rv; } - if (bidi) { - if (stream->qpack_blocked_pe.index != NGHTTP3_PQ_BAD_INDEX) { - nghttp3_conn_qpack_blocked_streams_remove(conn, stream); + if (stream->qpack_blocked_pe.index != NGHTTP3_PQ_BAD_INDEX) { + nghttp3_conn_qpack_blocked_streams_remove(conn, stream); - rv = nghttp3_qpack_decoder_cancel_stream(&conn->qdec, stream->node.id); - if (rv != 0) { - return rv; - } + rv = nghttp3_qpack_decoder_cancel_stream(&conn->qdec, stream->node.id); + if (rv != 0) { + return rv; } + } - if (conn->callbacks.stream_close) { - rv = - conn->callbacks.stream_close(conn, stream->node.id, stream->error_code, - conn->user_data, stream->user_data); - if (rv != 0) { - return NGHTTP3_ERR_CALLBACK_FAILURE; - } + if (conn->callbacks.stream_close2) { + rv = conn->callbacks.stream_close2(conn, flags, stream->node.id, + rx_app_error_code, tx_app_error_code, + conn->user_data, stream->user_data); + if (rv != 0) { + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + } else if (conn->callbacks.stream_close) { + app_error_code = NGHTTP3_H3_NO_ERROR; + + if (flags & NGHTTP3_STREAM_CLOSE_FLAG_RX_APP_ERROR_CODE_SET) { + app_error_code = rx_app_error_code; + } + + if (app_error_code == NGHTTP3_H3_NO_ERROR && + (flags & NGHTTP3_STREAM_CLOSE_FLAG_TX_APP_ERROR_CODE_SET)) { + app_error_code = tx_app_error_code; + } + + rv = conn->callbacks.stream_close(conn, stream->node.id, app_error_code, + conn->user_data, stream->user_data); + if (rv != 0) { + return NGHTTP3_ERR_CALLBACK_FAILURE; } } @@ -1445,7 +1462,7 @@ nghttp3_ssize nghttp3_conn_read_qpack_encoder(nghttp3_conn *conn, for (; !nghttp3_pq_empty(&conn->qpack_blocked_streams);) { stream = nghttp3_struct_of(nghttp3_pq_top(&conn->qpack_blocked_streams), nghttp3_stream, qpack_blocked_pe); - if (nghttp3_qpack_stream_context_get_ricnt(&stream->qpack_sctx) > + if (nghttp3_qpack_stream_context_get_ricnt2(&stream->qpack_sctx) > nghttp3_qpack_decoder_get_icnt(&conn->qdec)) { break; } @@ -1647,13 +1664,13 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, } break; case NGHTTP3_REQ_STREAM_STATE_DATA: - len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); rv = nghttp3_conn_on_data(conn, stream, p, len); if (rv != 0) { return rv; } p += len; - rstate->left -= (int64_t)len; + rstate->left -= len; if (rstate->left) { goto almost_done; @@ -1666,16 +1683,16 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, nghttp3_stream_read_state_reset(rstate); break; case NGHTTP3_REQ_STREAM_STATE_HEADERS: - len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); - nread = nghttp3_conn_on_headers(conn, stream, p, len, - (int64_t)len == rstate->left); + len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); + nread = + nghttp3_conn_on_headers(conn, stream, p, len, len == rstate->left); if (nread < 0) { return nread; } p += nread; nconsumed += (size_t)nread; - rstate->left -= nread; + rstate->left -= (uint64_t)nread; if (stream->flags & NGHTTP3_STREAM_FLAG_QPACK_DECODE_BLOCKED) { if (p != end && nghttp3_stream_get_buffered_datalen(stream) == 0) { @@ -1748,10 +1765,10 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, break; case NGHTTP3_REQ_STREAM_STATE_IGN_FRAME: - len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min(rstate->left, (uint64_t)(end - p)); p += len; nconsumed += len; - rstate->left -= (int64_t)len; + rstate->left -= len; if (rstate->left) { goto almost_done; @@ -1975,7 +1992,7 @@ int nghttp3_conn_on_settings_entry_received(nghttp3_conn *conn, dest->qpack_blocked_streams = (size_t)ent->value; nghttp3_qpack_encoder_set_max_blocked_streams( - &conn->qenc, (size_t)nghttp3_min_uint64(100, ent->value)); + &conn->qenc, (size_t)nghttp3_min(100, ent->value)); break; case NGHTTP3_SETTINGS_ID_ENABLE_CONNECT_PROTOCOL: if (conn->server) { @@ -2054,7 +2071,7 @@ conn_on_priority_update_stream(nghttp3_conn *conn, } conn->rx.max_stream_id_bidi = - nghttp3_max_int64(conn->rx.max_stream_id_bidi, stream_id); + nghttp3_max(conn->rx.max_stream_id_bidi, stream_id); rv = nghttp3_conn_create_stream(conn, &stream, stream_id); if (rv != 0) { return rv; @@ -2106,11 +2123,11 @@ int nghttp3_conn_create_stream(nghttp3_conn *conn, nghttp3_stream **pstream, int64_t stream_id) { nghttp3_stream *stream; int rv; + static const nghttp3_stream_callbacks callbacks = { + .acked_data = conn_stream_acked_data, + }; - rv = nghttp3_stream_new(&stream, stream_id, - &(nghttp3_stream_callbacks){ - .acked_data = conn_stream_acked_data, - }, + rv = nghttp3_stream_new(&stream, stream_id, &callbacks, &conn->out_chunk_objalloc, &conn->stream_objalloc, conn->mem); if (rv != 0) { @@ -2135,14 +2152,14 @@ int nghttp3_conn_create_stream(nghttp3_conn *conn, nghttp3_stream **pstream, return 0; } -nghttp3_stream *nghttp3_conn_find_stream(nghttp3_conn *conn, +nghttp3_stream *nghttp3_conn_find_stream(const nghttp3_conn *conn, int64_t stream_id) { return nghttp3_map_find(&conn->streams, (nghttp3_map_key_type)stream_id); } int nghttp3_conn_bind_control_stream(nghttp3_conn *conn, int64_t stream_id) { nghttp3_stream *stream; - nghttp3_frame_entry frent; + nghttp3_frame *fr; int rv; assert(stream_id >= 0); @@ -2168,26 +2185,28 @@ int nghttp3_conn_bind_control_stream(nghttp3_conn *conn, int64_t stream_id) { return rv; } - frent.fr.settings.type = NGHTTP3_FRAME_SETTINGS; - frent.aux.settings.local_settings = &conn->local.settings; - - rv = nghttp3_stream_frq_add(stream, &frent); + rv = nghttp3_stream_frq_emplace(stream, &fr); if (rv != 0) { return rv; } + fr->settings = (nghttp3_frame_settings){ + .type = NGHTTP3_FRAME_SETTINGS, + .local_settings = &conn->local.settings, + }; + if (conn->local.settings.origin_list) { assert(conn->server); - frent.fr.origin = (nghttp3_frame_origin){ - .type = NGHTTP3_FRAME_ORIGIN, - .origin_list = *conn->local.settings.origin_list, - }; - - rv = nghttp3_stream_frq_add(stream, &frent); + rv = nghttp3_stream_frq_emplace(stream, &fr); if (rv != 0) { return rv; } + + fr->origin = (nghttp3_frame_origin){ + .type = NGHTTP3_FRAME_ORIGIN, + .origin_list = *conn->local.settings.origin_list, + }; } return 0; @@ -2414,35 +2433,35 @@ static int conn_submit_headers_data(nghttp3_conn *conn, nghttp3_stream *stream, const nghttp3_data_reader *dr) { int rv; nghttp3_nv *nnva; - nghttp3_frame_entry frent; + nghttp3_frame *fr; rv = nghttp3_nva_copy(&nnva, nva, nvlen, conn->mem); if (rv != 0) { return rv; } - frent.fr.headers = (nghttp3_frame_headers){ - .type = NGHTTP3_FRAME_HEADERS, - .nva = nnva, - .nvlen = nvlen, - }; - - rv = nghttp3_stream_frq_add(stream, &frent); + rv = nghttp3_stream_frq_emplace(stream, &fr); if (rv != 0) { nghttp3_nva_del(nnva, conn->mem); return rv; } - if (dr) { - frent.fr.data = (nghttp3_frame_data){ - .type = NGHTTP3_FRAME_DATA, - }; - frent.aux.data.dr = *dr; + fr->headers = (nghttp3_frame_headers){ + .type = NGHTTP3_FRAME_HEADERS, + .nva = nnva, + .nvlen = nvlen, + }; - rv = nghttp3_stream_frq_add(stream, &frent); + if (dr) { + rv = nghttp3_stream_frq_emplace(stream, &fr); if (rv != 0) { return rv; } + + fr->data = (nghttp3_frame_data){ + .type = NGHTTP3_FRAME_DATA, + .dr = *dr, + }; } if (nghttp3_stream_require_schedule(stream)) { @@ -2493,7 +2512,6 @@ int nghttp3_conn_submit_request(nghttp3_conn *conn, int64_t stream_id, assert(!conn->server); assert(conn->tx.qenc); - assert(stream_id >= 0); assert(stream_id <= (int64_t)NGHTTP3_MAX_VARINT); assert(nghttp3_client_stream_bidi(stream_id)); @@ -2515,6 +2533,7 @@ int nghttp3_conn_submit_request(nghttp3_conn *conn, int64_t stream_id, } stream->rx.hstate = NGHTTP3_HTTP_STATE_RESP_INITIAL; stream->user_data = stream_user_data; + stream->node.pri.inc = 1; nghttp3_http_record_request_method(stream, nva, nvlen); @@ -2585,51 +2604,51 @@ int nghttp3_conn_submit_trailers(nghttp3_conn *conn, int64_t stream_id, } int nghttp3_conn_submit_shutdown_notice(nghttp3_conn *conn) { - nghttp3_frame_entry frent; + nghttp3_frame *fr; int rv; assert(conn->tx.ctrl); - frent.fr.goaway = (nghttp3_frame_goaway){ + rv = nghttp3_stream_frq_emplace(conn->tx.ctrl, &fr); + if (rv != 0) { + return rv; + } + + fr->goaway = (nghttp3_frame_goaway){ .type = NGHTTP3_FRAME_GOAWAY, .id = conn->server ? NGHTTP3_SHUTDOWN_NOTICE_STREAM_ID : NGHTTP3_SHUTDOWN_NOTICE_PUSH_ID, }; - assert(frent.fr.goaway.id <= conn->tx.goaway_id); + assert(fr->goaway.id <= conn->tx.goaway_id); - rv = nghttp3_stream_frq_add(conn->tx.ctrl, &frent); - if (rv != 0) { - return rv; - } - - conn->tx.goaway_id = frent.fr.goaway.id; + conn->tx.goaway_id = fr->goaway.id; conn->flags |= NGHTTP3_CONN_FLAG_GOAWAY_QUEUED; return 0; } int nghttp3_conn_shutdown(nghttp3_conn *conn) { - nghttp3_frame_entry frent; + nghttp3_frame *fr; int rv; assert(conn->tx.ctrl); - frent.fr.goaway = (nghttp3_frame_goaway){ - .type = NGHTTP3_FRAME_GOAWAY, - .id = conn->server ? nghttp3_min_int64((1ll << 62) - 4, - conn->rx.max_stream_id_bidi + 4) - : 0, - }; - - assert(frent.fr.goaway.id <= conn->tx.goaway_id); - - rv = nghttp3_stream_frq_add(conn->tx.ctrl, &frent); + rv = nghttp3_stream_frq_emplace(conn->tx.ctrl, &fr); if (rv != 0) { return rv; } - conn->tx.goaway_id = frent.fr.goaway.id; + fr->goaway = (nghttp3_frame_goaway){ + .type = NGHTTP3_FRAME_GOAWAY, + .id = conn->server + ? nghttp3_min((1LL << 62) - 4, conn->rx.max_stream_id_bidi + 4) + : 0, + }; + + assert(fr->goaway.id <= conn->tx.goaway_id); + + conn->tx.goaway_id = fr->goaway.id; conn->flags |= NGHTTP3_CONN_FLAG_GOAWAY_QUEUED | NGHTTP3_CONN_FLAG_SHUTDOWN_COMMENCED; @@ -2695,7 +2714,12 @@ int nghttp3_conn_unblock_stream(nghttp3_conn *conn, int64_t stream_id) { } int nghttp3_conn_is_stream_writable(nghttp3_conn *conn, int64_t stream_id) { - nghttp3_stream *stream = nghttp3_conn_find_stream(conn, stream_id); + return nghttp3_conn_is_stream_writable2(conn, stream_id); +} + +int nghttp3_conn_is_stream_writable2(const nghttp3_conn *conn, + int64_t stream_id) { + const nghttp3_stream *stream = nghttp3_conn_find_stream(conn, stream_id); if (stream == NULL) { return 0; @@ -2725,6 +2749,16 @@ int nghttp3_conn_resume_stream(nghttp3_conn *conn, int64_t stream_id) { int nghttp3_conn_close_stream(nghttp3_conn *conn, int64_t stream_id, uint64_t app_error_code) { + return nghttp3_conn_close_stream2( + conn, + NGHTTP3_STREAM_CLOSE_FLAG_RX_APP_ERROR_CODE_SET | + NGHTTP3_STREAM_CLOSE_FLAG_TX_APP_ERROR_CODE_SET, + stream_id, app_error_code, app_error_code); +} + +int nghttp3_conn_close_stream2(nghttp3_conn *conn, uint32_t flags, + int64_t stream_id, uint64_t rx_app_error_code, + uint64_t tx_app_error_code) { nghttp3_stream *stream = nghttp3_conn_find_stream(conn, stream_id); if (stream == NULL) { @@ -2736,11 +2770,10 @@ int nghttp3_conn_close_stream(nghttp3_conn *conn, int64_t stream_id, return NGHTTP3_ERR_H3_CLOSED_CRITICAL_STREAM; } - stream->error_code = app_error_code; - nghttp3_conn_unschedule_stream(conn, stream); - return conn_delete_stream(conn, stream); + return conn_delete_stream(conn, stream, flags, rx_app_error_code, + tx_app_error_code); } int nghttp3_conn_shutdown_stream_read(nghttp3_conn *conn, int64_t stream_id) { @@ -2813,9 +2846,29 @@ int nghttp3_conn_set_stream_user_data(nghttp3_conn *conn, int64_t stream_id, return 0; } +void *nghttp3_conn_get_stream_user_data(const nghttp3_conn *conn, + int64_t stream_id) { + nghttp3_stream *stream; + + assert(stream_id >= 0); + assert(stream_id <= (int64_t)NGHTTP3_MAX_VARINT); + + stream = nghttp3_conn_find_stream(conn, stream_id); + if (stream == NULL) { + return NULL; + } + + return stream->user_data; +} + uint64_t nghttp3_conn_get_frame_payload_left(nghttp3_conn *conn, int64_t stream_id) { - nghttp3_stream *stream; + return nghttp3_conn_get_frame_payload_left2(conn, stream_id); +} + +uint64_t nghttp3_conn_get_frame_payload_left2(const nghttp3_conn *conn, + int64_t stream_id) { + const nghttp3_stream *stream; int uni = 0; assert(stream_id >= 0); @@ -2837,14 +2890,22 @@ uint64_t nghttp3_conn_get_frame_payload_left(nghttp3_conn *conn, return 0; } - return (uint64_t)stream->rstate.left; + return stream->rstate.left; } int nghttp3_conn_get_stream_priority_versioned(nghttp3_conn *conn, int pri_version, nghttp3_pri *dest, int64_t stream_id) { - nghttp3_stream *stream; + return nghttp3_conn_get_stream_priority2_versioned(conn, pri_version, dest, + stream_id); +} + +int nghttp3_conn_get_stream_priority2_versioned(const nghttp3_conn *conn, + int pri_version, + nghttp3_pri *dest, + int64_t stream_id) { + const nghttp3_stream *stream; (void)pri_version; assert(conn->server); @@ -2870,7 +2931,8 @@ int nghttp3_conn_set_client_stream_priority(nghttp3_conn *conn, const uint8_t *data, size_t datalen) { nghttp3_stream *stream; - nghttp3_frame_entry frent; + nghttp3_frame *fr; + int rv; uint8_t *buf = NULL; assert(!conn->server); @@ -2895,14 +2957,20 @@ int nghttp3_conn_set_client_stream_priority(nghttp3_conn *conn, memcpy(buf, data, datalen); } - frent.fr.priority_update = (nghttp3_frame_priority_update){ + rv = nghttp3_stream_frq_emplace(conn->tx.ctrl, &fr); + if (rv != 0) { + nghttp3_mem_free(conn->mem, buf); + return rv; + } + + fr->priority_update = (nghttp3_frame_priority_update){ .type = NGHTTP3_FRAME_PRIORITY_UPDATE, .pri_elem_id = stream_id, .data = buf, .datalen = datalen, }; - return nghttp3_stream_frq_add(conn->tx.ctrl, &frent); + return 0; } int nghttp3_conn_set_server_stream_priority_versioned(nghttp3_conn *conn, @@ -2933,6 +3001,10 @@ int nghttp3_conn_set_server_stream_priority_versioned(nghttp3_conn *conn, } int nghttp3_conn_is_drained(nghttp3_conn *conn) { + return nghttp3_conn_is_drained2(conn); +} + +int nghttp3_conn_is_drained2(const nghttp3_conn *conn) { assert(conn->server); return (conn->flags & NGHTTP3_CONN_FLAG_SHUTDOWN_COMMENCED) && @@ -2940,3 +3012,25 @@ int nghttp3_conn_is_drained(nghttp3_conn *conn) { nghttp3_stream_outq_write_done(conn->tx.ctrl) && nghttp3_ringbuf_len(&conn->tx.ctrl->frq) == 0; } + +int nghttp3_conn_is_stream_flushed(const nghttp3_conn *conn, + int64_t stream_id) { + nghttp3_stream *stream = nghttp3_conn_find_stream(conn, stream_id); + const nghttp3_frame *fr; + + if (!stream) { + return 1; + } + + if (!nghttp3_stream_outq_write_done(stream)) { + return 0; + } + + if (nghttp3_ringbuf_len(&stream->frq) == 0) { + return 1; + } + + fr = nghttp3_ringbuf_get(&stream->frq, 0); + + return fr->hd.type == NGHTTP3_FRAME_DATA; +} diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h index 4f7f68f777a9..6841b1c343a3 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h @@ -48,28 +48,28 @@ #define NGHTTP3_QPACK_ENCODER_MAX_BLOCK_STREAMS 100 /* NGHTTP3_CONN_FLAG_NONE indicates that no flag is set. */ -#define NGHTTP3_CONN_FLAG_NONE 0x0000u +#define NGHTTP3_CONN_FLAG_NONE 0x0000U /* NGHTTP3_CONN_FLAG_SETTINGS_RECVED is set when SETTINGS frame has been received. */ -#define NGHTTP3_CONN_FLAG_SETTINGS_RECVED 0x0001u +#define NGHTTP3_CONN_FLAG_SETTINGS_RECVED 0x0001U /* NGHTTP3_CONN_FLAG_CONTROL_OPENED is set when a control stream has opened. */ -#define NGHTTP3_CONN_FLAG_CONTROL_OPENED 0x0002u +#define NGHTTP3_CONN_FLAG_CONTROL_OPENED 0x0002U /* NGHTTP3_CONN_FLAG_QPACK_ENCODER_OPENED is set when a QPACK encoder stream has opened. */ -#define NGHTTP3_CONN_FLAG_QPACK_ENCODER_OPENED 0x0004u +#define NGHTTP3_CONN_FLAG_QPACK_ENCODER_OPENED 0x0004U /* NGHTTP3_CONN_FLAG_QPACK_DECODER_OPENED is set when a QPACK decoder stream has opened. */ -#define NGHTTP3_CONN_FLAG_QPACK_DECODER_OPENED 0x0008u +#define NGHTTP3_CONN_FLAG_QPACK_DECODER_OPENED 0x0008U /* NGHTTP3_CONN_FLAG_SHUTDOWN_COMMENCED is set when graceful shutdown has started. */ -#define NGHTTP3_CONN_FLAG_SHUTDOWN_COMMENCED 0x0010u +#define NGHTTP3_CONN_FLAG_SHUTDOWN_COMMENCED 0x0010U /* NGHTTP3_CONN_FLAG_GOAWAY_RECVED indicates that GOAWAY frame has received. */ -#define NGHTTP3_CONN_FLAG_GOAWAY_RECVED 0x0020u +#define NGHTTP3_CONN_FLAG_GOAWAY_RECVED 0x0020U /* NGHTTP3_CONN_FLAG_GOAWAY_QUEUED indicates that GOAWAY frame has been submitted for transmission. */ -#define NGHTTP3_CONN_FLAG_GOAWAY_QUEUED 0x0040u +#define NGHTTP3_CONN_FLAG_GOAWAY_QUEUED 0x0040U typedef struct nghttp3_chunk { nghttp3_opl_entry oplent; @@ -175,7 +175,8 @@ struct nghttp3_conn { } tx; }; -nghttp3_stream *nghttp3_conn_find_stream(nghttp3_conn *conn, int64_t stream_id); +nghttp3_stream *nghttp3_conn_find_stream(const nghttp3_conn *conn, + int64_t stream_id); int nghttp3_conn_create_stream(nghttp3_conn *conn, nghttp3_stream **pstream, int64_t stream_id); diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c index 3e14ffcd394b..031ac78d815f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c @@ -31,7 +31,7 @@ #include "nghttp3_str.h" #include "nghttp3_unreachable.h" -const uint8_t *nghttp3_get_varint(int64_t *dest, const uint8_t *p) { +const uint8_t *nghttp3_get_uvarint(uint64_t *dest, const uint8_t *p) { uint16_t n16; uint32_t n32; uint64_t n64; @@ -43,22 +43,22 @@ const uint8_t *nghttp3_get_varint(int64_t *dest, const uint8_t *p) { case 1: memcpy(&n16, p, 2); n16 = ntohs(n16); - n16 &= 0x3fff; + n16 &= 0x3FFFU; *dest = n16; return p + 2; case 2: memcpy(&n32, p, 4); n32 = ntohl(n32); - n32 &= 0x3fffffff; + n32 &= 0x3FFFFFFFU; *dest = n32; return p + 4; case 3: memcpy(&n64, p, 8); n64 = nghttp3_ntohl64(n64); - n64 &= 0x3fffffffffffffff; - *dest = (int64_t)n64; + n64 &= 0x3FFFFFFFFFFFFFFFU; + *dest = n64; return p + 8; default: @@ -66,8 +66,17 @@ const uint8_t *nghttp3_get_varint(int64_t *dest, const uint8_t *p) { } } -size_t nghttp3_get_varintlen(const uint8_t *p) { - return (size_t)(1u << (*p >> 6)); +size_t nghttp3_get_uvarintlen(const uint8_t *p) { + return (size_t)(1U << (*p >> 6)); +} + +const uint8_t *nghttp3_get_varint(int64_t *dest, const uint8_t *p) { + uint64_t n; + + p = nghttp3_get_uvarint(&n, p); + *dest = (int64_t)n; + + return p; } uint8_t *nghttp3_put_uint64be(uint8_t *p, uint64_t n) { @@ -85,7 +94,7 @@ uint8_t *nghttp3_put_uint16be(uint8_t *p, uint16_t n) { return nghttp3_cpymem(p, (const uint8_t *)&n, sizeof(n)); } -uint8_t *nghttp3_put_varint(uint8_t *p, int64_t n) { +uint8_t *nghttp3_put_uvarint(uint8_t *p, uint64_t n) { uint8_t *rv; if (n < 64) { *p++ = (uint8_t)n; @@ -93,21 +102,21 @@ uint8_t *nghttp3_put_varint(uint8_t *p, int64_t n) { } if (n < 16384) { rv = nghttp3_put_uint16be(p, (uint16_t)n); - *p |= 0x40; + *p |= 0x40U; return rv; } if (n < 1073741824) { rv = nghttp3_put_uint32be(p, (uint32_t)n); - *p |= 0x80; + *p |= 0x80U; return rv; } - assert(n < 4611686018427387904LL); - rv = nghttp3_put_uint64be(p, (uint64_t)n); - *p |= 0xc0; + assert(n < 4611686018427387904ULL); + rv = nghttp3_put_uint64be(p, n); + *p |= 0xC0U; return rv; } -size_t nghttp3_put_varintlen(int64_t n) { +size_t nghttp3_put_uvarintlen(uint64_t n) { if (n < 64) { return 1; } @@ -117,7 +126,7 @@ size_t nghttp3_put_varintlen(int64_t n) { if (n < 1073741824) { return 4; } - assert(n < 4611686018427387904LL); + assert(n < 4611686018427387904ULL); return 8; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h index 8895fe8d3415..bd1c518fa663 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h @@ -56,7 +56,7 @@ #include -#define NGHTTP3_VARINT_MAX ((1ull << 62) - 1) +#define NGHTTP3_VARINT_MAX ((1ULL << 62) - 1) #if HAVE_DECL_BE64TOH # define nghttp3_ntohl64(N) be64toh(N) @@ -67,11 +67,11 @@ # define nghttp3_htonl64(N) (N) # else /* !defined(WORDS_BIGENDIAN) */ # if HAVE_DECL_BSWAP_64 -# define nghttp3_bswap64 bswap_64 +# define nghttp3_bswap64(N) bswap_64(N) # elif defined(WIN32) -# define nghttp3_bswap64 _byteswap_uint64 +# define nghttp3_bswap64(N) _byteswap_uint64(N) # elif defined(__APPLE__) -# define nghttp3_bswap64 OSSwapInt64 +# define nghttp3_bswap64(N) OSSwapInt64(N) # else /* !(HAVE_DECL_BSWAP_64 || defined(WIN32) || defined(__APPLE__)) */ # define nghttp3_bswap64(N) \ ((uint64_t)(ntohl((uint32_t)(N))) << 32 | ntohl((uint32_t)((N) >> 32))) @@ -82,67 +82,16 @@ #endif /* !HAVE_DECL_BE64TOH */ #ifdef WIN32 -/* Windows requires ws2_32 library for ntonl family of functions. We - define inline functions for those functions so that we don't have - dependency on that lib. */ - -# ifdef _MSC_VER -# define STIN static __inline -# else /* !defined(_MSC_VER) */ -# define STIN static inline -# endif /* !defined(_MSC_VER) */ - -STIN uint32_t htonl(uint32_t hostlong) { - uint32_t res; - unsigned char *p = (unsigned char *)&res; - *p++ = (unsigned char)(hostlong >> 24); - *p++ = (hostlong >> 16) & 0xffu; - *p++ = (hostlong >> 8) & 0xffu; - *p = hostlong & 0xffu; - return res; -} - -STIN uint16_t htons(uint16_t hostshort) { - uint16_t res; - unsigned char *p = (unsigned char *)&res; - *p++ = (unsigned char)(hostshort >> 8); - *p = hostshort & 0xffu; - return res; -} - -STIN uint32_t ntohl(uint32_t netlong) { - uint32_t res; - unsigned char *p = (unsigned char *)&netlong; - res = (uint32_t)(*p++ << 24); - res += (uint32_t)(*p++ << 16); - res += (uint32_t)(*p++ << 8); - res += *p; - return res; -} - -STIN uint16_t ntohs(uint16_t netshort) { - uint16_t res; - unsigned char *p = (unsigned char *)&netshort; - res = (uint16_t)(*p++ << 8); - res += *p; - return res; -} - +/* Windows requires ws2_32 library for ntonl family of functions. + Instead of using them, use _byteswap_* functions. This is fine + because all platforms that can run Windows these days are little + endian. */ +# define htonl(N) _byteswap_ulong(N) +# define htons(N) _byteswap_ushort(N) +# define ntohl(N) _byteswap_ulong(N) +# define ntohs(N) _byteswap_ushort(N) #endif /* defined(WIN32) */ -/* - * nghttp3_get_varint reads variable-length unsigned integer from |p|, - * and stores it in the buffer pointed by |dest| in host byte order. - * It returns |p| plus the number of bytes read from |p|. - */ -const uint8_t *nghttp3_get_varint(int64_t *dest, const uint8_t *p); - -/* - * nghttp3_get_varintlen returns the required number of bytes to read - * variable-length integer starting at |p|. - */ -size_t nghttp3_get_varintlen(const uint8_t *p); - /* * nghttp3_put_uint64be writes |n| in host byte order in |p| in * network byte order. It returns the one beyond of the last written @@ -164,27 +113,9 @@ uint8_t *nghttp3_put_uint32be(uint8_t *p, uint32_t n); */ uint8_t *nghttp3_put_uint16be(uint8_t *p, uint16_t n); -/* - * nghttp3_put_varint writes |n| in |p| using variable-length integer - * encoding. It returns the one beyond of the last written position. - */ -uint8_t *nghttp3_put_varint(uint8_t *p, int64_t n); - -/* - * nghttp3_put_varintlen returns the required number of bytes to - * encode |n|. - */ -size_t nghttp3_put_varintlen(int64_t n); - /* * nghttp3_ord_stream_id returns the ordinal number of |stream_id|. */ uint64_t nghttp3_ord_stream_id(int64_t stream_id); -/* - * NGHTTP3_PRI_INC_MASK is a bit mask to retrieve incremental bit from - * a value produced by nghttp3_pri_to_uint8. - */ -#define NGHTTP3_PRI_INC_MASK (1 << 7) - #endif /* !defined(NGHTTP3_CONV_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c index da88b54f96de..2efba7472c25 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c @@ -31,69 +31,70 @@ #include "nghttp3_conv.h" #include "nghttp3_str.h" -uint8_t *nghttp3_frame_write_hd(uint8_t *p, int64_t type, int64_t payloadlen) { - p = nghttp3_put_varint(p, type); - p = nghttp3_put_varint(p, payloadlen); +uint8_t *nghttp3_frame_write_hd(uint8_t *p, uint64_t type, + uint64_t payloadlen) { + p = nghttp3_put_uvarint(p, type); + p = nghttp3_put_uvarint(p, payloadlen); return p; } -size_t nghttp3_frame_write_hd_len(int64_t type, int64_t payloadlen) { - return nghttp3_put_varintlen(type) + nghttp3_put_varintlen(payloadlen); +size_t nghttp3_frame_write_hd_len(uint64_t type, uint64_t payloadlen) { + return nghttp3_put_uvarintlen(type) + nghttp3_put_uvarintlen(payloadlen); } uint8_t *nghttp3_frame_write_settings(uint8_t *p, const nghttp3_frame_settings *fr, - int64_t payloadlen) { + uint64_t payloadlen) { size_t i; p = nghttp3_frame_write_hd(p, fr->type, payloadlen); for (i = 0; i < fr->niv; ++i) { - p = nghttp3_put_varint(p, (int64_t)fr->iv[i].id); - p = nghttp3_put_varint(p, (int64_t)fr->iv[i].value); + p = nghttp3_put_uvarint(p, fr->iv[i].id); + p = nghttp3_put_uvarint(p, fr->iv[i].value); } return p; } -size_t nghttp3_frame_write_settings_len(int64_t *ppayloadlen, +size_t nghttp3_frame_write_settings_len(uint64_t *ppayloadlen, const nghttp3_frame_settings *fr) { size_t payloadlen = 0; size_t i; for (i = 0; i < fr->niv; ++i) { - payloadlen += nghttp3_put_varintlen((int64_t)fr->iv[i].id) + - nghttp3_put_varintlen((int64_t)fr->iv[i].value); + payloadlen += nghttp3_put_uvarintlen(fr->iv[i].id) + + nghttp3_put_uvarintlen(fr->iv[i].value); } - *ppayloadlen = (int64_t)payloadlen; + *ppayloadlen = payloadlen; - return nghttp3_put_varintlen(NGHTTP3_FRAME_SETTINGS) + - nghttp3_put_varintlen((int64_t)payloadlen) + payloadlen; + return nghttp3_put_uvarintlen(NGHTTP3_FRAME_SETTINGS) + + nghttp3_put_uvarintlen(payloadlen) + payloadlen; } uint8_t *nghttp3_frame_write_goaway(uint8_t *p, const nghttp3_frame_goaway *fr, - int64_t payloadlen) { + uint64_t payloadlen) { p = nghttp3_frame_write_hd(p, fr->type, payloadlen); - p = nghttp3_put_varint(p, fr->id); + p = nghttp3_put_uvarint(p, (uint64_t)fr->id); return p; } -size_t nghttp3_frame_write_goaway_len(int64_t *ppayloadlen, +size_t nghttp3_frame_write_goaway_len(uint64_t *ppayloadlen, const nghttp3_frame_goaway *fr) { - size_t payloadlen = nghttp3_put_varintlen(fr->id); + size_t payloadlen = nghttp3_put_uvarintlen((uint64_t)fr->id); - *ppayloadlen = (int64_t)payloadlen; + *ppayloadlen = payloadlen; - return nghttp3_put_varintlen(NGHTTP3_FRAME_GOAWAY) + - nghttp3_put_varintlen((int64_t)payloadlen) + payloadlen; + return nghttp3_put_uvarintlen(NGHTTP3_FRAME_GOAWAY) + + nghttp3_put_uvarintlen(payloadlen) + payloadlen; } uint8_t *nghttp3_frame_write_priority_update( - uint8_t *p, const nghttp3_frame_priority_update *fr, int64_t payloadlen) { + uint8_t *p, const nghttp3_frame_priority_update *fr, uint64_t payloadlen) { p = nghttp3_frame_write_hd(p, fr->type, payloadlen); - p = nghttp3_put_varint(p, fr->pri_elem_id); + p = nghttp3_put_uvarint(p, (uint64_t)fr->pri_elem_id); if (fr->datalen) { p = nghttp3_cpymem(p, fr->data, fr->datalen); } @@ -102,17 +103,18 @@ uint8_t *nghttp3_frame_write_priority_update( } size_t nghttp3_frame_write_priority_update_len( - int64_t *ppayloadlen, const nghttp3_frame_priority_update *fr) { - size_t payloadlen = nghttp3_put_varintlen(fr->pri_elem_id) + fr->datalen; + uint64_t *ppayloadlen, const nghttp3_frame_priority_update *fr) { + size_t payloadlen = + nghttp3_put_uvarintlen((uint64_t)fr->pri_elem_id) + fr->datalen; - *ppayloadlen = (int64_t)payloadlen; + *ppayloadlen = payloadlen; - return nghttp3_put_varintlen(fr->type) + - nghttp3_put_varintlen((int64_t)payloadlen) + payloadlen; + return nghttp3_put_uvarintlen(fr->type) + nghttp3_put_uvarintlen(payloadlen) + + payloadlen; } uint8_t *nghttp3_frame_write_origin(uint8_t *p, const nghttp3_frame_origin *fr, - int64_t payloadlen) { + uint64_t payloadlen) { p = nghttp3_frame_write_hd(p, fr->type, payloadlen); if (fr->origin_list.len) { p = nghttp3_cpymem(p, fr->origin_list.base, fr->origin_list.len); @@ -121,14 +123,14 @@ uint8_t *nghttp3_frame_write_origin(uint8_t *p, const nghttp3_frame_origin *fr, return p; } -size_t nghttp3_frame_write_origin_len(int64_t *ppayloadlen, +size_t nghttp3_frame_write_origin_len(uint64_t *ppayloadlen, const nghttp3_frame_origin *fr) { size_t payloadlen = fr->origin_list.len; - *ppayloadlen = (int64_t)payloadlen; + *ppayloadlen = payloadlen; - return nghttp3_put_varintlen(fr->type) + - nghttp3_put_varintlen((int64_t)payloadlen) + payloadlen; + return nghttp3_put_uvarintlen(fr->type) + nghttp3_put_uvarintlen(payloadlen) + + payloadlen; } int nghttp3_nva_copy(nghttp3_nv **pnva, const nghttp3_nv *nva, size_t nvlen, diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h index 2f35ff1d2b5f..7806cadbcf5f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h @@ -34,50 +34,53 @@ #include "nghttp3_buf.h" -#define NGHTTP3_FRAME_DATA 0x00 -#define NGHTTP3_FRAME_HEADERS 0x01 -#define NGHTTP3_FRAME_CANCEL_PUSH 0x03 -#define NGHTTP3_FRAME_SETTINGS 0x04 -#define NGHTTP3_FRAME_PUSH_PROMISE 0x05 -#define NGHTTP3_FRAME_GOAWAY 0x07 -#define NGHTTP3_FRAME_MAX_PUSH_ID 0x0d +#define NGHTTP3_FRAME_DATA 0x00U +#define NGHTTP3_FRAME_HEADERS 0x01U +#define NGHTTP3_FRAME_CANCEL_PUSH 0x03U +#define NGHTTP3_FRAME_SETTINGS 0x04U +#define NGHTTP3_FRAME_PUSH_PROMISE 0x05U +#define NGHTTP3_FRAME_GOAWAY 0x07U +#define NGHTTP3_FRAME_MAX_PUSH_ID 0x0DU /* PRIORITY_UPDATE: https://datatracker.ietf.org/doc/html/rfc9218 */ -#define NGHTTP3_FRAME_PRIORITY_UPDATE 0x0f0700 -#define NGHTTP3_FRAME_PRIORITY_UPDATE_PUSH_ID 0x0f0701 +#define NGHTTP3_FRAME_PRIORITY_UPDATE 0x0F0700U +#define NGHTTP3_FRAME_PRIORITY_UPDATE_PUSH_ID 0x0F0701U /* ORIGIN: https://datatracker.ietf.org/doc/html/rfc9412 */ -#define NGHTTP3_FRAME_ORIGIN 0x0c +#define NGHTTP3_FRAME_ORIGIN 0x0CU /* Frame types that are reserved for HTTP/2, and must not be used in HTTP/3. */ -#define NGHTTP3_H2_FRAME_PRIORITY 0x02 -#define NGHTTP3_H2_FRAME_PING 0x06 -#define NGHTTP3_H2_FRAME_WINDOW_UPDATE 0x08 -#define NGHTTP3_H2_FRAME_CONTINUATION 0x9 +#define NGHTTP3_H2_FRAME_PRIORITY 0x02U +#define NGHTTP3_H2_FRAME_PING 0x06U +#define NGHTTP3_H2_FRAME_WINDOW_UPDATE 0x08U +#define NGHTTP3_H2_FRAME_CONTINUATION 0x9U typedef struct nghttp3_frame_hd { - int64_t type; + uint64_t type; } nghttp3_frame_hd; typedef struct nghttp3_frame_data { - int64_t type; + uint64_t type; + /* dr is set when sending DATA frame. It is not used on + reception. */ + nghttp3_data_reader dr; } nghttp3_frame_data; typedef struct nghttp3_frame_headers { - int64_t type; + uint64_t type; nghttp3_nv *nva; size_t nvlen; } nghttp3_frame_headers; -#define NGHTTP3_SETTINGS_ID_MAX_FIELD_SECTION_SIZE 0x06 -#define NGHTTP3_SETTINGS_ID_QPACK_MAX_TABLE_CAPACITY 0x01 -#define NGHTTP3_SETTINGS_ID_QPACK_BLOCKED_STREAMS 0x07 -#define NGHTTP3_SETTINGS_ID_ENABLE_CONNECT_PROTOCOL 0x08 -#define NGHTTP3_SETTINGS_ID_H3_DATAGRAM 0x33 +#define NGHTTP3_SETTINGS_ID_MAX_FIELD_SECTION_SIZE 0x06U +#define NGHTTP3_SETTINGS_ID_QPACK_MAX_TABLE_CAPACITY 0x01U +#define NGHTTP3_SETTINGS_ID_QPACK_BLOCKED_STREAMS 0x07U +#define NGHTTP3_SETTINGS_ID_ENABLE_CONNECT_PROTOCOL 0x08U +#define NGHTTP3_SETTINGS_ID_H3_DATAGRAM 0x33U -#define NGHTTP3_H2_SETTINGS_ID_ENABLE_PUSH 0x2 -#define NGHTTP3_H2_SETTINGS_ID_MAX_CONCURRENT_STREAMS 0x3 -#define NGHTTP3_H2_SETTINGS_ID_INITIAL_WINDOW_SIZE 0x4 -#define NGHTTP3_H2_SETTINGS_ID_MAX_FRAME_SIZE 0x5 +#define NGHTTP3_H2_SETTINGS_ID_ENABLE_PUSH 0x2U +#define NGHTTP3_H2_SETTINGS_ID_MAX_CONCURRENT_STREAMS 0x3U +#define NGHTTP3_H2_SETTINGS_ID_INITIAL_WINDOW_SIZE 0x4U +#define NGHTTP3_H2_SETTINGS_ID_MAX_FRAME_SIZE 0x5U typedef struct nghttp3_settings_entry { uint64_t id; @@ -85,18 +88,21 @@ typedef struct nghttp3_settings_entry { } nghttp3_settings_entry; typedef struct nghttp3_frame_settings { - int64_t type; + uint64_t type; size_t niv; nghttp3_settings_entry *iv; + /* local_settings is set when sending SETTINGS frame. It is not + used on reception. */ + const nghttp3_settings *local_settings; } nghttp3_frame_settings; typedef struct nghttp3_frame_goaway { - int64_t type; + uint64_t type; int64_t id; } nghttp3_frame_goaway; typedef struct nghttp3_frame_priority_update { - int64_t type; + uint64_t type; /* pri_elem_id is stream ID if type == NGHTTP3_FRAME_PRIORITY_UPDATE. It is push ID if type == NGHTTP3_FRAME_PRIORITY_UPDATE_PUSH_ID. It is undefined @@ -120,7 +126,7 @@ typedef struct nghttp3_frame_priority_update { } nghttp3_frame_priority_update; typedef struct nghttp3_frame_origin { - int64_t type; + uint64_t type; /* These fields are only used by server to send ORIGIN frame. Client never use them. */ nghttp3_vec origin_list; @@ -143,14 +149,14 @@ typedef union nghttp3_frame { * * This function returns |dest| plus the number of bytes written. */ -uint8_t *nghttp3_frame_write_hd(uint8_t *dest, int64_t type, - int64_t payloadlen); +uint8_t *nghttp3_frame_write_hd(uint8_t *dest, uint64_t type, + uint64_t payloadlen); /* * nghttp3_frame_write_hd_len returns the number of bytes required to * write a frame header consisting of |type| and |payloadlen|. */ -size_t nghttp3_frame_write_hd_len(int64_t type, int64_t payloadlen); +size_t nghttp3_frame_write_hd_len(uint64_t type, uint64_t payloadlen); /* * nghttp3_frame_write_settings writes SETTINGS frame |fr| to |dest|. @@ -161,14 +167,14 @@ size_t nghttp3_frame_write_hd_len(int64_t type, int64_t payloadlen); */ uint8_t *nghttp3_frame_write_settings(uint8_t *dest, const nghttp3_frame_settings *fr, - int64_t payloadlen); + uint64_t payloadlen); /* * nghttp3_frame_write_settings_len returns the number of bytes * required to write |fr|. This function stores the frame payload * length in |*ppayloadlen|. */ -size_t nghttp3_frame_write_settings_len(int64_t *pppayloadlen, +size_t nghttp3_frame_write_settings_len(uint64_t *pppayloadlen, const nghttp3_frame_settings *fr); /* @@ -180,14 +186,14 @@ size_t nghttp3_frame_write_settings_len(int64_t *pppayloadlen, */ uint8_t *nghttp3_frame_write_goaway(uint8_t *dest, const nghttp3_frame_goaway *fr, - int64_t payloadlen); + uint64_t payloadlen); /* * nghttp3_frame_write_goaway_len returns the number of bytes required * to write |fr|. This function stores the frame payload length in * |*ppayloadlen|. */ -size_t nghttp3_frame_write_goaway_len(int64_t *ppayloadlen, +size_t nghttp3_frame_write_goaway_len(uint64_t *ppayloadlen, const nghttp3_frame_goaway *fr); /* @@ -198,7 +204,7 @@ size_t nghttp3_frame_write_goaway_len(int64_t *ppayloadlen, * This function returns |dest| plus the number of bytes written; */ uint8_t *nghttp3_frame_write_priority_update( - uint8_t *dest, const nghttp3_frame_priority_update *fr, int64_t payloadlen); + uint8_t *dest, const nghttp3_frame_priority_update *fr, uint64_t payloadlen); /* * nghttp3_frame_write_priority_update_len returns the number of bytes @@ -206,7 +212,7 @@ uint8_t *nghttp3_frame_write_priority_update( * length in |*ppayloadlen|. */ size_t nghttp3_frame_write_priority_update_len( - int64_t *ppayloadlen, const nghttp3_frame_priority_update *fr); + uint64_t *ppayloadlen, const nghttp3_frame_priority_update *fr); /* * nghttp3_frame_write_origin writes ORIGIN frame |fr| to |dest|. @@ -217,14 +223,14 @@ size_t nghttp3_frame_write_priority_update_len( */ uint8_t *nghttp3_frame_write_origin(uint8_t *dest, const nghttp3_frame_origin *fr, - int64_t payloadlen); + uint64_t payloadlen); /* * nghttp3_frame_write_origin_len returns the number of bytes required * to write |fr|. This function stores the frame payload length in * |*ppayloadlen|. */ -size_t nghttp3_frame_write_origin_len(int64_t *ppayloadlen, +size_t nghttp3_frame_write_origin_len(uint64_t *ppayloadlen, const nghttp3_frame_origin *fr); /* diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.c b/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.c index 68a4f8f747d6..bd557d08c34d 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.c @@ -36,11 +36,11 @@ void nghttp3_gaptr_init(nghttp3_gaptr *gaptr, const nghttp3_mem *mem) { } static int gaptr_gap_init(nghttp3_gaptr *gaptr) { - return nghttp3_ksl_insert(&gaptr->gap, NULL, - &(nghttp3_range){ - .end = UINT64_MAX, - }, - NULL); + static const nghttp3_range end = { + .end = UINT64_MAX, + }; + + return nghttp3_ksl_insert(&gaptr->gap, NULL, &end, NULL); } void nghttp3_gaptr_free(nghttp3_gaptr *gaptr) { diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_http.c b/deps/ngtcp2/nghttp3/lib/nghttp3_http.c index a7524740ef76..4194a404b33f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_http.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_http.c @@ -36,12 +36,9 @@ #include "nghttp3_macro.h" #include "nghttp3_conv.h" #include "nghttp3_unreachable.h" +#include "nghttp3_str.h" #include "sfparse/sfparse.h" -static uint8_t downcase(uint8_t c) { - return 'A' <= c && c <= 'Z' ? (uint8_t)(c - 'A' + 'a') : c; -} - /* * memieq returns 1 if the data pointed by |a| of length |n| equals to * |b| of the same length in case-insensitive manner. The data @@ -52,36 +49,49 @@ static int memieq(const void *a, const void *b, size_t n) { const uint8_t *aa = a, *bb = b; for (i = 0; i < n; ++i) { - if (aa[i] != downcase(bb[i])) { + if (aa[i] != nghttp3_downcase_byte(bb[i])) { return 0; } } return 1; } -#define lstrieq(A, B, N) ((sizeof((A)) - 1) == (N) && memieq((A), (B), (N))) +#define lstrieq(A, B, N) \ + (nghttp3_strlen_lit((A)) == (N) && memieq((A), (B), (N))) + +static int32_t parse_status_code(const uint8_t *s, size_t len) { + if (len != 3 || '1' > s[0] || s[0] > '9' || '0' > s[1] || s[1] > '9' || + '0' > s[2] || s[2] > '9') { + return -1; + } + + return (s[0] - '0') * 100 + (s[1] - '0') * 10 + (s[2] - '0'); +} static int64_t parse_uint(const uint8_t *s, size_t len) { - int64_t n = 0; + uint64_t n = 0; + uint32_t c; size_t i; + if (len == 0) { return -1; } + for (i = 0; i < len; ++i) { - if ('0' <= s[i] && s[i] <= '9') { - if (n > (int64_t)NGHTTP3_MAX_VARINT / 10) { - return -1; - } - n *= 10; - if (n > (int64_t)NGHTTP3_MAX_VARINT - (s[i] - '0')) { - return -1; - } - n += s[i] - '0'; - continue; + if ('0' > s[i] || s[i] > '9') { + return -1; } - return -1; + + c = s[i] - '0'; + + if (n > (NGHTTP3_MAX_VARINT - c) / 10) { + return -1; + } + + n = n * 10 + c; } - return n; + + return (int64_t)n; } static int check_pseudo_header(nghttp3_http_state *http, @@ -93,7 +103,7 @@ static int check_pseudo_header(nghttp3_http_state *http, return 1; } -static int expect_response_body(nghttp3_http_state *http) { +static int expect_response_body(const nghttp3_http_state *http) { return (http->flags & NGHTTP3_HTTP_FLAG_METH_HEAD) == 0 && http->status_code / 100 != 1 && http->status_code != 304 && http->status_code != 204; @@ -104,7 +114,7 @@ static int expect_response_body(nghttp3_http_state *http) { :path header field value must start with "/". This function must be called after ":method" header field was received. This function returns nonzero if path is valid.*/ -static int check_path_flags(nghttp3_http_state *http) { +static int check_path_flags(const nghttp3_http_state *http) { return (http->flags & NGHTTP3_HTTP_FLAG_SCHEME_HTTP) == 0 || ((http->flags & NGHTTP3_HTTP_FLAG_PATH_REGULAR) || ((http->flags & NGHTTP3_HTTP_FLAG_METH_OPTIONS) && @@ -274,26 +284,26 @@ static const int8_t VALID_PATH_CHARS[256] = { ['u'] = 1, ['v'] = 1, ['w'] = 1, ['x'] = 1, ['y'] = 1, ['z'] = 1, ['{'] = 1, ['|'] = 1, ['}'] = 1, ['~'] = 1, [0x80] = 1, [0x81] = 1, [0x82] = 1, [0x83] = 1, [0x84] = 1, [0x85] = 1, [0x86] = 1, [0x87] = 1, - [0x88] = 1, [0x89] = 1, [0x8a] = 1, [0x8b] = 1, [0x8c] = 1, [0x8d] = 1, - [0x8e] = 1, [0x8f] = 1, [0x90] = 1, [0x91] = 1, [0x92] = 1, [0x93] = 1, + [0x88] = 1, [0x89] = 1, [0x8A] = 1, [0x8B] = 1, [0x8C] = 1, [0x8D] = 1, + [0x8E] = 1, [0x8F] = 1, [0x90] = 1, [0x91] = 1, [0x92] = 1, [0x93] = 1, [0x94] = 1, [0x95] = 1, [0x96] = 1, [0x97] = 1, [0x98] = 1, [0x99] = 1, - [0x9a] = 1, [0x9b] = 1, [0x9c] = 1, [0x9d] = 1, [0x9e] = 1, [0x9f] = 1, - [0xa0] = 1, [0xa1] = 1, [0xa2] = 1, [0xa3] = 1, [0xa4] = 1, [0xa5] = 1, - [0xa6] = 1, [0xa7] = 1, [0xa8] = 1, [0xa9] = 1, [0xaa] = 1, [0xab] = 1, - [0xac] = 1, [0xad] = 1, [0xae] = 1, [0xaf] = 1, [0xb0] = 1, [0xb1] = 1, - [0xb2] = 1, [0xb3] = 1, [0xb4] = 1, [0xb5] = 1, [0xb6] = 1, [0xb7] = 1, - [0xb8] = 1, [0xb9] = 1, [0xba] = 1, [0xbb] = 1, [0xbc] = 1, [0xbd] = 1, - [0xbe] = 1, [0xbf] = 1, [0xc0] = 1, [0xc1] = 1, [0xc2] = 1, [0xc3] = 1, - [0xc4] = 1, [0xc5] = 1, [0xc6] = 1, [0xc7] = 1, [0xc8] = 1, [0xc9] = 1, - [0xca] = 1, [0xcb] = 1, [0xcc] = 1, [0xcd] = 1, [0xce] = 1, [0xcf] = 1, - [0xd0] = 1, [0xd1] = 1, [0xd2] = 1, [0xd3] = 1, [0xd4] = 1, [0xd5] = 1, - [0xd6] = 1, [0xd7] = 1, [0xd8] = 1, [0xd9] = 1, [0xda] = 1, [0xdb] = 1, - [0xdc] = 1, [0xdd] = 1, [0xde] = 1, [0xdf] = 1, [0xe0] = 1, [0xe1] = 1, - [0xe2] = 1, [0xe3] = 1, [0xe4] = 1, [0xe5] = 1, [0xe6] = 1, [0xe7] = 1, - [0xe8] = 1, [0xe9] = 1, [0xea] = 1, [0xeb] = 1, [0xec] = 1, [0xed] = 1, - [0xee] = 1, [0xef] = 1, [0xf0] = 1, [0xf1] = 1, [0xf2] = 1, [0xf3] = 1, - [0xf4] = 1, [0xf5] = 1, [0xf6] = 1, [0xf7] = 1, [0xf8] = 1, [0xf9] = 1, - [0xfa] = 1, [0xfb] = 1, [0xfc] = 1, [0xfd] = 1, [0xfe] = 1, [0xff] = 1, + [0x9A] = 1, [0x9B] = 1, [0x9C] = 1, [0x9D] = 1, [0x9E] = 1, [0x9F] = 1, + [0xA0] = 1, [0xA1] = 1, [0xA2] = 1, [0xA3] = 1, [0xA4] = 1, [0xA5] = 1, + [0xA6] = 1, [0xA7] = 1, [0xA8] = 1, [0xA9] = 1, [0xAA] = 1, [0xAB] = 1, + [0xAC] = 1, [0xAD] = 1, [0xAE] = 1, [0xAF] = 1, [0xB0] = 1, [0xB1] = 1, + [0xB2] = 1, [0xB3] = 1, [0xB4] = 1, [0xB5] = 1, [0xB6] = 1, [0xB7] = 1, + [0xB8] = 1, [0xB9] = 1, [0xBA] = 1, [0xBB] = 1, [0xBC] = 1, [0xBD] = 1, + [0xBE] = 1, [0xBF] = 1, [0xC0] = 1, [0xC1] = 1, [0xC2] = 1, [0xC3] = 1, + [0xC4] = 1, [0xC5] = 1, [0xC6] = 1, [0xC7] = 1, [0xC8] = 1, [0xC9] = 1, + [0xCA] = 1, [0xCB] = 1, [0xCC] = 1, [0xCD] = 1, [0xCE] = 1, [0xCF] = 1, + [0xD0] = 1, [0xD1] = 1, [0xD2] = 1, [0xD3] = 1, [0xD4] = 1, [0xD5] = 1, + [0xD6] = 1, [0xD7] = 1, [0xD8] = 1, [0xD9] = 1, [0xDA] = 1, [0xDB] = 1, + [0xDC] = 1, [0xDD] = 1, [0xDE] = 1, [0xDF] = 1, [0xE0] = 1, [0xE1] = 1, + [0xE2] = 1, [0xE3] = 1, [0xE4] = 1, [0xE5] = 1, [0xE6] = 1, [0xE7] = 1, + [0xE8] = 1, [0xE9] = 1, [0xEA] = 1, [0xEB] = 1, [0xEC] = 1, [0xED] = 1, + [0xEE] = 1, [0xEF] = 1, [0xF0] = 1, [0xF1] = 1, [0xF2] = 1, [0xF3] = 1, + [0xF4] = 1, [0xF5] = 1, [0xF6] = 1, [0xF7] = 1, [0xF8] = 1, [0xF9] = 1, + [0xFA] = 1, [0xFB] = 1, [0xFC] = 1, [0xFD] = 1, [0xFE] = 1, [0xFF] = 1, }; static int check_path(const uint8_t *value, size_t len) { @@ -307,7 +317,7 @@ static int check_path(const uint8_t *value, size_t len) { } static int http_request_on_header(nghttp3_http_state *http, - nghttp3_qpack_nv *nv, int trailers, + const nghttp3_qpack_nv *nv, int trailers, int connect_protocol) { nghttp3_pri pri; @@ -451,15 +461,14 @@ static int http_request_on_header(nghttp3_http_state *http, } static int http_response_on_header(nghttp3_http_state *http, - nghttp3_qpack_nv *nv, int trailers) { + const nghttp3_qpack_nv *nv, int trailers) { switch (nv->token) { case NGHTTP3_QPACK_TOKEN__STATUS: { - if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__STATUS) || - nv->value->len != 3) { + if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__STATUS)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } - http->status_code = (int16_t)parse_uint(nv->value->base, nv->value->len); - if (http->status_code < 100 || http->status_code == 101) { + http->status_code = parse_status_code(nv->value->base, nv->value->len); + if (http->status_code == -1 || http->status_code == 101) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } break; @@ -526,7 +535,7 @@ static int http_response_on_header(nghttp3_http_state *http, static int http_check_nonempty_header_name(const uint8_t *name, size_t len); -int nghttp3_http_on_header(nghttp3_http_state *http, nghttp3_qpack_nv *nv, +int nghttp3_http_on_header(nghttp3_http_state *http, const nghttp3_qpack_nv *nv, int request, int trailers, int connect_protocol) { if (nv->name->len == 0) { http->flags |= NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED; @@ -576,10 +585,13 @@ int nghttp3_http_on_request_headers(nghttp3_http_state *http) { (NGHTTP3_HTTP_FLAG__AUTHORITY | NGHTTP3_HTTP_FLAG_HOST)) == 0) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } - if ((http->flags & NGHTTP3_HTTP_FLAG__PROTOCOL) && - ((http->flags & NGHTTP3_HTTP_FLAG_METH_CONNECT) == 0 || - (http->flags & NGHTTP3_HTTP_FLAG__AUTHORITY) == 0)) { - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; + if (http->flags & NGHTTP3_HTTP_FLAG__PROTOCOL) { + if ((http->flags & NGHTTP3_HTTP_FLAG_METH_CONNECT) == 0 || + (http->flags & NGHTTP3_HTTP_FLAG__AUTHORITY) == 0) { + return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; + } + + http->content_length = -1; } if (!check_path_flags(http)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; @@ -614,7 +626,7 @@ int nghttp3_http_on_response_headers(nghttp3_http_state *http) { return 0; } -int nghttp3_http_on_remote_end_stream(nghttp3_stream *stream) { +int nghttp3_http_on_remote_end_stream(const nghttp3_stream *stream) { if ((stream->rx.http.flags & NGHTTP3_HTTP_FLAG_EXPECT_FINAL_RESPONSE) || (stream->rx.http.content_length != -1 && stream->rx.http.content_length != stream->rx.http.recv_content_length)) { @@ -689,7 +701,7 @@ int nghttp3_check_header_name(const uint8_t *name, size_t len) { --len; } for (last = name + len; name != last; ++name) { - if (!VALID_HD_NAME_CHARS[*name]) { + if (VALID_HD_NAME_CHARS[*name] != 1) { return 0; } } @@ -732,36 +744,36 @@ static const int8_t VALID_HD_VALUE_CHARS[256] = { ['s'] = 1, ['t'] = 1, ['u'] = 1, ['v'] = 1, ['w'] = 1, ['x'] = 1, ['y'] = 1, ['z'] = 1, ['{'] = 1, ['|'] = 1, ['}'] = 1, ['~'] = 1, [0x80] = 1, [0x81] = 1, [0x82] = 1, [0x83] = 1, [0x84] = 1, [0x85] = 1, - [0x86] = 1, [0x87] = 1, [0x88] = 1, [0x89] = 1, [0x8a] = 1, [0x8b] = 1, - [0x8c] = 1, [0x8d] = 1, [0x8e] = 1, [0x8f] = 1, [0x90] = 1, [0x91] = 1, + [0x86] = 1, [0x87] = 1, [0x88] = 1, [0x89] = 1, [0x8A] = 1, [0x8B] = 1, + [0x8C] = 1, [0x8D] = 1, [0x8E] = 1, [0x8F] = 1, [0x90] = 1, [0x91] = 1, [0x92] = 1, [0x93] = 1, [0x94] = 1, [0x95] = 1, [0x96] = 1, [0x97] = 1, - [0x98] = 1, [0x99] = 1, [0x9a] = 1, [0x9b] = 1, [0x9c] = 1, [0x9d] = 1, - [0x9e] = 1, [0x9f] = 1, [0xa0] = 1, [0xa1] = 1, [0xa2] = 1, [0xa3] = 1, - [0xa4] = 1, [0xa5] = 1, [0xa6] = 1, [0xa7] = 1, [0xa8] = 1, [0xa9] = 1, - [0xaa] = 1, [0xab] = 1, [0xac] = 1, [0xad] = 1, [0xae] = 1, [0xaf] = 1, - [0xb0] = 1, [0xb1] = 1, [0xb2] = 1, [0xb3] = 1, [0xb4] = 1, [0xb5] = 1, - [0xb6] = 1, [0xb7] = 1, [0xb8] = 1, [0xb9] = 1, [0xba] = 1, [0xbb] = 1, - [0xbc] = 1, [0xbd] = 1, [0xbe] = 1, [0xbf] = 1, [0xc0] = 1, [0xc1] = 1, - [0xc2] = 1, [0xc3] = 1, [0xc4] = 1, [0xc5] = 1, [0xc6] = 1, [0xc7] = 1, - [0xc8] = 1, [0xc9] = 1, [0xca] = 1, [0xcb] = 1, [0xcc] = 1, [0xcd] = 1, - [0xce] = 1, [0xcf] = 1, [0xd0] = 1, [0xd1] = 1, [0xd2] = 1, [0xd3] = 1, - [0xd4] = 1, [0xd5] = 1, [0xd6] = 1, [0xd7] = 1, [0xd8] = 1, [0xd9] = 1, - [0xda] = 1, [0xdb] = 1, [0xdc] = 1, [0xdd] = 1, [0xde] = 1, [0xdf] = 1, - [0xe0] = 1, [0xe1] = 1, [0xe2] = 1, [0xe3] = 1, [0xe4] = 1, [0xe5] = 1, - [0xe6] = 1, [0xe7] = 1, [0xe8] = 1, [0xe9] = 1, [0xea] = 1, [0xeb] = 1, - [0xec] = 1, [0xed] = 1, [0xee] = 1, [0xef] = 1, [0xf0] = 1, [0xf1] = 1, - [0xf2] = 1, [0xf3] = 1, [0xf4] = 1, [0xf5] = 1, [0xf6] = 1, [0xf7] = 1, - [0xf8] = 1, [0xf9] = 1, [0xfa] = 1, [0xfb] = 1, [0xfc] = 1, [0xfd] = 1, - [0xfe] = 1, [0xff] = 1, + [0x98] = 1, [0x99] = 1, [0x9A] = 1, [0x9B] = 1, [0x9C] = 1, [0x9D] = 1, + [0x9E] = 1, [0x9F] = 1, [0xA0] = 1, [0xA1] = 1, [0xA2] = 1, [0xA3] = 1, + [0xA4] = 1, [0xA5] = 1, [0xA6] = 1, [0xA7] = 1, [0xA8] = 1, [0xA9] = 1, + [0xAA] = 1, [0xAB] = 1, [0xAC] = 1, [0xAD] = 1, [0xAE] = 1, [0xAF] = 1, + [0xB0] = 1, [0xB1] = 1, [0xB2] = 1, [0xB3] = 1, [0xB4] = 1, [0xB5] = 1, + [0xB6] = 1, [0xB7] = 1, [0xB8] = 1, [0xB9] = 1, [0xBA] = 1, [0xBB] = 1, + [0xBC] = 1, [0xBD] = 1, [0xBE] = 1, [0xBF] = 1, [0xC0] = 1, [0xC1] = 1, + [0xC2] = 1, [0xC3] = 1, [0xC4] = 1, [0xC5] = 1, [0xC6] = 1, [0xC7] = 1, + [0xC8] = 1, [0xC9] = 1, [0xCA] = 1, [0xCB] = 1, [0xCC] = 1, [0xCD] = 1, + [0xCE] = 1, [0xCF] = 1, [0xD0] = 1, [0xD1] = 1, [0xD2] = 1, [0xD3] = 1, + [0xD4] = 1, [0xD5] = 1, [0xD6] = 1, [0xD7] = 1, [0xD8] = 1, [0xD9] = 1, + [0xDA] = 1, [0xDB] = 1, [0xDC] = 1, [0xDD] = 1, [0xDE] = 1, [0xDF] = 1, + [0xE0] = 1, [0xE1] = 1, [0xE2] = 1, [0xE3] = 1, [0xE4] = 1, [0xE5] = 1, + [0xE6] = 1, [0xE7] = 1, [0xE8] = 1, [0xE9] = 1, [0xEA] = 1, [0xEB] = 1, + [0xEC] = 1, [0xED] = 1, [0xEE] = 1, [0xEF] = 1, [0xF0] = 1, [0xF1] = 1, + [0xF2] = 1, [0xF3] = 1, [0xF4] = 1, [0xF5] = 1, [0xF6] = 1, [0xF7] = 1, + [0xF8] = 1, [0xF9] = 1, [0xFA] = 1, [0xFB] = 1, [0xFC] = 1, [0xFD] = 1, + [0xFE] = 1, [0xFF] = 1, }; #ifdef __AVX2__ static int contains_bad_header_value_char_avx2(const uint8_t *first, const uint8_t *last) { const __m256i ctll = _mm256_set1_epi8(0x00 - 1); - const __m256i ctlr = _mm256_set1_epi8(0x1f + 1); + const __m256i ctlr = _mm256_set1_epi8(0x1F + 1); const __m256i ht = _mm256_set1_epi8('\t'); - const __m256i del = _mm256_set1_epi8(0x7f); + const __m256i del = _mm256_set1_epi8(0x7F); __m256i s, x; uint32_t m; @@ -808,7 +820,7 @@ int nghttp3_check_header_value(const uint8_t *value, size_t len) { #ifdef __AVX2__ if (len >= 32) { - last32 = value + (len & ~0x1fu); + last32 = value + (len & ~(size_t)0x1FU); if (contains_bad_header_value_char_avx2(value, last32)) { return 0; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_http.h b/deps/ngtcp2/nghttp3/lib/nghttp3_http.h index f0bfc69fbade..2bdf3110027c 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_http.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_http.h @@ -39,48 +39,48 @@ typedef struct nghttp3_http_state nghttp3_http_state; /* HTTP related flags to enforce HTTP semantics */ /* NGHTTP3_HTTP_FLAG_NONE indicates that no flag is set. */ -#define NGHTTP3_HTTP_FLAG_NONE 0x00u +#define NGHTTP3_HTTP_FLAG_NONE 0x00U /* header field seen so far */ -#define NGHTTP3_HTTP_FLAG__AUTHORITY 0x01u -#define NGHTTP3_HTTP_FLAG__PATH 0x02u -#define NGHTTP3_HTTP_FLAG__METHOD 0x04u -#define NGHTTP3_HTTP_FLAG__SCHEME 0x08u +#define NGHTTP3_HTTP_FLAG__AUTHORITY 0x01U +#define NGHTTP3_HTTP_FLAG__PATH 0x02U +#define NGHTTP3_HTTP_FLAG__METHOD 0x04U +#define NGHTTP3_HTTP_FLAG__SCHEME 0x08U /* host is not pseudo header, but we require either host or :authority */ -#define NGHTTP3_HTTP_FLAG_HOST 0x10u -#define NGHTTP3_HTTP_FLAG__STATUS 0x20u +#define NGHTTP3_HTTP_FLAG_HOST 0x10U +#define NGHTTP3_HTTP_FLAG__STATUS 0x20U /* required header fields for HTTP request except for CONNECT method. */ #define NGHTTP3_HTTP_FLAG_REQ_HEADERS \ (NGHTTP3_HTTP_FLAG__METHOD | NGHTTP3_HTTP_FLAG__PATH | \ NGHTTP3_HTTP_FLAG__SCHEME) -#define NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED 0x40u +#define NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED 0x40U /* HTTP method flags */ -#define NGHTTP3_HTTP_FLAG_METH_CONNECT 0x80u -#define NGHTTP3_HTTP_FLAG_METH_HEAD 0x0100u -#define NGHTTP3_HTTP_FLAG_METH_OPTIONS 0x0200u +#define NGHTTP3_HTTP_FLAG_METH_CONNECT 0x80U +#define NGHTTP3_HTTP_FLAG_METH_HEAD 0x0100U +#define NGHTTP3_HTTP_FLAG_METH_OPTIONS 0x0200U #define NGHTTP3_HTTP_FLAG_METH_ALL \ (NGHTTP3_HTTP_FLAG_METH_CONNECT | NGHTTP3_HTTP_FLAG_METH_HEAD | \ NGHTTP3_HTTP_FLAG_METH_OPTIONS) /* :path category */ /* path starts with "/" */ -#define NGHTTP3_HTTP_FLAG_PATH_REGULAR 0x0400u +#define NGHTTP3_HTTP_FLAG_PATH_REGULAR 0x0400U /* path "*" */ -#define NGHTTP3_HTTP_FLAG_PATH_ASTERISK 0x0800u +#define NGHTTP3_HTTP_FLAG_PATH_ASTERISK 0x0800U /* scheme */ /* "http" or "https" scheme */ -#define NGHTTP3_HTTP_FLAG_SCHEME_HTTP 0x1000u +#define NGHTTP3_HTTP_FLAG_SCHEME_HTTP 0x1000U /* set if final response is expected */ -#define NGHTTP3_HTTP_FLAG_EXPECT_FINAL_RESPONSE 0x2000u +#define NGHTTP3_HTTP_FLAG_EXPECT_FINAL_RESPONSE 0x2000U /* NGHTTP3_HTTP_FLAG__PROTOCOL is set when :protocol pseudo header field is seen. */ -#define NGHTTP3_HTTP_FLAG__PROTOCOL 0x4000u +#define NGHTTP3_HTTP_FLAG__PROTOCOL 0x4000U /* NGHTTP3_HTTP_FLAG_PRIORITY is set when priority header field is processed. */ -#define NGHTTP3_HTTP_FLAG_PRIORITY 0x8000u +#define NGHTTP3_HTTP_FLAG_PRIORITY 0x8000U /* NGHTTP3_HTTP_FLAG_BAD_PRIORITY is set when an error is encountered while parsing priority header field. */ -#define NGHTTP3_HTTP_FLAG_BAD_PRIORITY 0x010000u +#define NGHTTP3_HTTP_FLAG_BAD_PRIORITY 0x010000U /* * This function is called when HTTP header field |nv| received for @@ -98,7 +98,7 @@ typedef struct nghttp3_http_state nghttp3_http_state; * Invalid HTTP header field was received but it can be treated as * if it was not received because of compatibility reasons. */ -int nghttp3_http_on_header(nghttp3_http_state *http, nghttp3_qpack_nv *nv, +int nghttp3_http_on_header(nghttp3_http_state *http, const nghttp3_qpack_nv *nv, int request, int trailers, int connect_protocol); /* @@ -131,7 +131,7 @@ int nghttp3_http_on_response_headers(nghttp3_http_state *http); * NGHTTP3_ERR_MALFORMED_HTTP_MESSAGING * HTTP messaging is violated. */ -int nghttp3_http_on_remote_end_stream(nghttp3_stream *stream); +int nghttp3_http_on_remote_end_stream(const nghttp3_stream *stream); /* * This function is called when chunk of data is received. This diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.c b/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.c index 669b59efa7e0..4ab9b81fde0c 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.c @@ -32,14 +32,16 @@ #include "nghttp3_macro.h" #include "nghttp3_mem.h" -#include "nghttp3_range.h" static nghttp3_ksl_blk null_blk; nghttp3_objalloc_def(ksl_blk, nghttp3_ksl_blk, oplent) +#define NGHTTP3_KSL_ALIGNED_BLKLEN \ + ((sizeof(nghttp3_ksl_blk) + 0x7U) & ~(size_t)0x7U) + static size_t ksl_blklen(size_t aligned_keylen) { - return sizeof(nghttp3_ksl_blk) + NGHTTP3_KSL_MAX_NBLK * aligned_keylen; + return NGHTTP3_KSL_ALIGNED_BLKLEN + NGHTTP3_KSL_MAX_NBLK * aligned_keylen; } /* @@ -57,13 +59,14 @@ void nghttp3_ksl_init(nghttp3_ksl *ksl, nghttp3_ksl_compar compar, assert(keylen >= sizeof(uint64_t)); - aligned_keylen = (keylen + 0x7u) & ~0x7u; + aligned_keylen = (keylen + 0x7U) & ~(size_t)0x7U; + + assert(aligned_keylen <= UINT16_MAX); - nghttp3_objalloc_init(&ksl->blkalloc, - (ksl_blklen(aligned_keylen) + 0xfu) & ~(uintptr_t)0xfu, - mem); + nghttp3_objalloc_init( + &ksl->blkalloc, (ksl_blklen(aligned_keylen) + 0xFU) & ~(size_t)0xFU, mem); - ksl->head = NULL; + ksl->root = NULL; ksl->front = ksl->back = NULL; ksl->compar = compar; ksl->search = search; @@ -80,7 +83,8 @@ static nghttp3_ksl_blk *ksl_blk_objalloc_new(nghttp3_ksl *ksl) { return NULL; } - blk->keys = (uint8_t *)blk + sizeof(*blk); + blk->keys = (uint8_t *)blk + NGHTTP3_KSL_ALIGNED_BLKLEN; + blk->aligned_keylen = (uint16_t)ksl->aligned_keylen; return blk; } @@ -89,19 +93,19 @@ static void ksl_blk_objalloc_del(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk) { nghttp3_objalloc_ksl_blk_release(&ksl->blkalloc, blk); } -static int ksl_head_init(nghttp3_ksl *ksl) { - nghttp3_ksl_blk *head = ksl_blk_objalloc_new(ksl); +static int ksl_root_init(nghttp3_ksl *ksl) { + nghttp3_ksl_blk *root = ksl_blk_objalloc_new(ksl); - if (!head) { + if (!root) { return NGHTTP3_ERR_NOMEM; } - head->next = head->prev = NULL; - head->n = 0; - head->leaf = 1; + root->next = root->prev = NULL; + root->n = 0; + root->leaf = 1; - ksl->head = head; - ksl->front = ksl->back = head; + ksl->root = root; + ksl->front = ksl->back = root; return 0; } @@ -124,12 +128,12 @@ static void ksl_free_blk(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk) { #endif /* defined(NOMEMPOOL) */ void nghttp3_ksl_free(nghttp3_ksl *ksl) { - if (!ksl || !ksl->head) { + if (!ksl || !ksl->root) { return; } #ifdef NOMEMPOOL - ksl_free_blk(ksl, ksl->head); + ksl_free_blk(ksl, ksl->root); #endif /* defined(NOMEMPOOL) */ nghttp3_objalloc_free(&ksl->blkalloc); @@ -199,22 +203,21 @@ static int ksl_split_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { memmove(blk->nodes + (i + 2), blk->nodes + (i + 1), (blk->n - (i + 1)) * sizeof(nghttp3_ksl_node)); - memmove(blk->keys + (i + 2) * ksl->aligned_keylen, - blk->keys + (i + 1) * ksl->aligned_keylen, - (blk->n - (i + 1)) * ksl->aligned_keylen); + memmove(blk->keys + (i + 1) * ksl->aligned_keylen, + blk->keys + i * ksl->aligned_keylen, + (blk->n - i) * ksl->aligned_keylen); blk->nodes[i + 1].blk = rblk; ++blk->n; - ksl_set_nth_key(ksl, blk, i + 1, nghttp3_ksl_nth_key(ksl, rblk, rblk->n - 1)); - ksl_set_nth_key(ksl, blk, i, nghttp3_ksl_nth_key(ksl, lblk, lblk->n - 1)); + ksl_set_nth_key(ksl, blk, i, nghttp3_ksl_blk_nth_key(lblk, lblk->n - 1)); return 0; } /* - * ksl_split_head splits a head (root) block. It increases the height - * of skip list by 1. + * ksl_split_root splits a root block. It increases the height of + * skip list by 1. * * It returns 0 if it succeeds, or one of the following negative error * codes: @@ -222,34 +225,33 @@ static int ksl_split_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { * NGHTTP3_ERR_NOMEM * Out of memory. */ -static int ksl_split_head(nghttp3_ksl *ksl) { - nghttp3_ksl_blk *rblk = NULL, *lblk, *nhead = NULL; +static int ksl_split_root(nghttp3_ksl *ksl) { + nghttp3_ksl_blk *rblk, *lblk, *nroot; - rblk = ksl_split_blk(ksl, ksl->head); - if (rblk == NULL) { + nroot = ksl_blk_objalloc_new(ksl); + if (nroot == NULL) { return NGHTTP3_ERR_NOMEM; } - lblk = ksl->head; - - nhead = ksl_blk_objalloc_new(ksl); - - if (nhead == NULL) { - ksl_blk_objalloc_del(ksl, rblk); + rblk = ksl_split_blk(ksl, ksl->root); + if (rblk == NULL) { + ksl_blk_objalloc_del(ksl, nroot); return NGHTTP3_ERR_NOMEM; } - nhead->next = nhead->prev = NULL; - nhead->n = 2; - nhead->leaf = 0; + lblk = ksl->root; - ksl_set_nth_key(ksl, nhead, 0, nghttp3_ksl_nth_key(ksl, lblk, lblk->n - 1)); - nhead->nodes[0].blk = lblk; + nroot->next = nroot->prev = NULL; + nroot->n = 2; + nroot->leaf = 0; - ksl_set_nth_key(ksl, nhead, 1, nghttp3_ksl_nth_key(ksl, rblk, rblk->n - 1)); - nhead->nodes[1].blk = rblk; + ksl_set_nth_key(ksl, nroot, 0, nghttp3_ksl_blk_nth_key(lblk, lblk->n - 1)); + nroot->nodes[0].blk = lblk; - ksl->head = nhead; + ksl_set_nth_key(ksl, nroot, 1, nghttp3_ksl_blk_nth_key(rblk, rblk->n - 1)); + nroot->nodes[1].blk = rblk; + + ksl->root = nroot; return 0; } @@ -284,27 +286,27 @@ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, size_t i; int rv; - if (!ksl->head) { - rv = ksl_head_init(ksl); + if (!ksl->root) { + rv = ksl_root_init(ksl); if (rv != 0) { return rv; } } - if (ksl->head->n == NGHTTP3_KSL_MAX_NBLK) { - rv = ksl_split_head(ksl); + if (ksl->root->n == NGHTTP3_KSL_MAX_NBLK) { + rv = ksl_split_root(ksl); if (rv != 0) { return rv; } } - blk = ksl->head; + blk = ksl->root; for (;;) { i = ksl->search(ksl, blk, key); if (blk->leaf) { - if (i < blk->n && !ksl->compar(key, nghttp3_ksl_nth_key(ksl, blk, i))) { + if (i < blk->n && !ksl->compar(key, nghttp3_ksl_blk_nth_key(blk, i))) { if (it) { *it = nghttp3_ksl_end(ksl); } @@ -316,7 +318,7 @@ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, ++ksl->n; if (it) { - nghttp3_ksl_it_init(it, ksl, blk, i); + nghttp3_ksl_it_init(it, blk, i); } return 0; @@ -343,7 +345,7 @@ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, ++ksl->n; if (it) { - nghttp3_ksl_it_init(it, ksl, blk, blk->n - 1); + nghttp3_ksl_it_init(it, blk, blk->n - 1); } return 0; @@ -357,12 +359,8 @@ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, return rv; } - if (ksl->compar(nghttp3_ksl_nth_key(ksl, blk, i), key)) { + if (ksl->compar(nghttp3_ksl_blk_nth_key(blk, i), key)) { node = &blk->nodes[i + 1]; - - if (ksl->compar(nghttp3_ksl_nth_key(ksl, blk, i + 1), key)) { - ksl_set_nth_key(ksl, blk, i + 1, key); - } } } @@ -389,9 +387,9 @@ static void ksl_remove_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { * ksl_merge_node merges 2 nodes which are the nodes at the index of * |i| and |i + 1|. * - * If |blk| is the head (root) block and it contains just 2 nodes - * before merging nodes, the merged block becomes head block, which - * decreases the height of |ksl| by 1. + * If |blk| is the root block and it contains just 2 nodes before + * merging nodes, the merged block becomes root block, which decreases + * the height of |ksl| by 1. * * This function returns the pointer to the merged block. */ @@ -407,7 +405,7 @@ static nghttp3_ksl_blk *ksl_merge_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, lblk = lnode->blk; rblk = blk->nodes[i + 1].blk; - assert(lblk->n + rblk->n < NGHTTP3_KSL_MAX_NBLK); + assert(lblk->n + rblk->n <= NGHTTP3_KSL_MAX_NBLK); memcpy(lblk->nodes + lblk->n, rblk->nodes, rblk->n * sizeof(nghttp3_ksl_node)); @@ -426,12 +424,12 @@ static nghttp3_ksl_blk *ksl_merge_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, ksl_blk_objalloc_del(ksl, rblk); - if (ksl->head == blk && blk->n == 2) { - ksl_blk_objalloc_del(ksl, ksl->head); - ksl->head = lblk; + if (ksl->root == blk && blk->n == 2) { + ksl_blk_objalloc_del(ksl, ksl->root); + ksl->root = lblk; } else { ksl_remove_node(ksl, blk, i + 1); - ksl_set_nth_key(ksl, blk, i, nghttp3_ksl_nth_key(ksl, lblk, lblk->n - 1)); + ksl_set_nth_key(ksl, blk, i, nghttp3_ksl_blk_nth_key(lblk, lblk->n - 1)); } return lblk; @@ -472,7 +470,7 @@ static void ksl_shift_left(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { lblk->n += (uint32_t)n; rblk->n -= (uint32_t)n; - ksl_set_nth_key(ksl, blk, i - 1, nghttp3_ksl_nth_key(ksl, lblk, lblk->n - 1)); + ksl_set_nth_key(ksl, blk, i - 1, nghttp3_ksl_blk_nth_key(lblk, lblk->n - 1)); memmove(rblk->nodes, rblk->nodes + n, rblk->n * sizeof(nghttp3_ksl_node)); @@ -520,7 +518,7 @@ static void ksl_shift_right(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { memcpy(rblk->keys, lblk->keys + lblk->n * ksl->aligned_keylen, n * ksl->aligned_keylen); - ksl_set_nth_key(ksl, blk, i, nghttp3_ksl_nth_key(ksl, lblk, lblk->n - 1)); + ksl_set_nth_key(ksl, blk, i, nghttp3_ksl_blk_nth_key(lblk, lblk->n - 1)); } /* @@ -537,9 +535,9 @@ int nghttp3_ksl_remove_hint(nghttp3_ksl *ksl, nghttp3_ksl_it *it, const nghttp3_ksl_key *key) { nghttp3_ksl_blk *blk = hint->blk; - assert(ksl->head); + assert(ksl->root); - if (blk->n <= NGHTTP3_KSL_MIN_NBLK) { + if (blk != ksl->root && blk->n == NGHTTP3_KSL_MIN_NBLK) { return nghttp3_ksl_remove(ksl, it, key); } @@ -549,9 +547,9 @@ int nghttp3_ksl_remove_hint(nghttp3_ksl *ksl, nghttp3_ksl_it *it, if (it) { if (hint->i == blk->n && blk->next) { - nghttp3_ksl_it_init(it, ksl, blk->next, 0); + nghttp3_ksl_it_init(it, blk->next, 0); } else { - nghttp3_ksl_it_init(it, ksl, blk, hint->i); + nghttp3_ksl_it_init(it, blk, hint->i); } } @@ -560,7 +558,7 @@ int nghttp3_ksl_remove_hint(nghttp3_ksl *ksl, nghttp3_ksl_it *it, int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, const nghttp3_ksl_key *key) { - nghttp3_ksl_blk *blk = ksl->head; + nghttp3_ksl_blk *blk = ksl->root; nghttp3_ksl_node *node; size_t i; @@ -586,7 +584,7 @@ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, } if (blk->leaf) { - if (ksl->compar(key, nghttp3_ksl_nth_key(ksl, blk, i))) { + if (ksl->compar(key, nghttp3_ksl_blk_nth_key(blk, i))) { if (it) { *it = nghttp3_ksl_end(ksl); } @@ -599,9 +597,9 @@ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, if (it) { if (blk->n == i && blk->next) { - nghttp3_ksl_it_init(it, ksl, blk->next, 0); + nghttp3_ksl_it_init(it, blk->next, 0); } else { - nghttp3_ksl_it_init(it, ksl, blk, i); + nghttp3_ksl_it_init(it, blk, i); } } @@ -650,12 +648,12 @@ nghttp3_ksl_it nghttp3_ksl_lower_bound(const nghttp3_ksl *ksl, nghttp3_ksl_it nghttp3_ksl_lower_bound_search(const nghttp3_ksl *ksl, const nghttp3_ksl_key *key, nghttp3_ksl_search search) { - nghttp3_ksl_blk *blk = ksl->head; + nghttp3_ksl_blk *blk = ksl->root; nghttp3_ksl_it it; size_t i; if (!blk) { - nghttp3_ksl_it_init(&it, ksl, &null_blk, 0); + nghttp3_ksl_it_init(&it, &null_blk, 0); return it; } @@ -668,7 +666,7 @@ nghttp3_ksl_it nghttp3_ksl_lower_bound_search(const nghttp3_ksl *ksl, i = 0; } - nghttp3_ksl_it_init(&it, ksl, blk, i); + nghttp3_ksl_it_init(&it, blk, i); return it; } @@ -686,7 +684,7 @@ nghttp3_ksl_it nghttp3_ksl_lower_bound_search(const nghttp3_ksl *ksl, i = blk->n; } - nghttp3_ksl_it_init(&it, ksl, blk, i); + nghttp3_ksl_it_init(&it, blk, i); return it; } @@ -697,19 +695,19 @@ nghttp3_ksl_it nghttp3_ksl_lower_bound_search(const nghttp3_ksl *ksl, void nghttp3_ksl_update_key(nghttp3_ksl *ksl, const nghttp3_ksl_key *old_key, const nghttp3_ksl_key *new_key) { - nghttp3_ksl_blk *blk = ksl->head; + nghttp3_ksl_blk *blk = ksl->root; nghttp3_ksl_node *node; const nghttp3_ksl_key *node_key; size_t i; - assert(ksl->head); + assert(ksl->root); for (;;) { i = ksl->search(ksl, blk, old_key); assert(i < blk->n); node = &blk->nodes[i]; - node_key = nghttp3_ksl_nth_key(ksl, blk, i); + node_key = nghttp3_ksl_blk_nth_key(blk, i); if (blk->leaf) { assert(key_equal(ksl->compar, node_key, old_key)); @@ -730,15 +728,15 @@ void nghttp3_ksl_update_key(nghttp3_ksl *ksl, const nghttp3_ksl_key *old_key, size_t nghttp3_ksl_len(const nghttp3_ksl *ksl) { return ksl->n; } void nghttp3_ksl_clear(nghttp3_ksl *ksl) { - if (!ksl->head) { + if (!ksl->root) { return; } #ifdef NOMEMPOOL - ksl_free_blk(ksl, ksl->head); + ksl_free_blk(ksl, ksl->root); #endif /* defined(NOMEMPOOL) */ - ksl->front = ksl->back = ksl->head = NULL; + ksl->front = ksl->back = ksl->root = NULL; ksl->n = 0; nghttp3_objalloc_clear(&ksl->blkalloc); @@ -753,8 +751,7 @@ static void ksl_print(const nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, if (blk->leaf) { for (i = 0; i < blk->n; ++i) { - fprintf(stderr, " %" PRId64, - *(int64_t *)nghttp3_ksl_nth_key(ksl, blk, i)); + fprintf(stderr, " %" PRId64, *(int64_t *)nghttp3_ksl_blk_nth_key(blk, i)); } fprintf(stderr, "\n"); @@ -768,21 +765,21 @@ static void ksl_print(const nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, } void nghttp3_ksl_print(const nghttp3_ksl *ksl) { - if (!ksl->head) { + if (!ksl->root) { return; } - ksl_print(ksl, ksl->head, 0); + ksl_print(ksl, ksl->root, 0); } #endif /* !defined(WIN32) */ nghttp3_ksl_it nghttp3_ksl_begin(const nghttp3_ksl *ksl) { nghttp3_ksl_it it; - if (ksl->head) { - nghttp3_ksl_it_init(&it, ksl, ksl->front, 0); + if (ksl->root) { + nghttp3_ksl_it_init(&it, ksl->front, 0); } else { - nghttp3_ksl_it_init(&it, ksl, &null_blk, 0); + nghttp3_ksl_it_init(&it, &null_blk, 0); } return it; @@ -791,18 +788,16 @@ nghttp3_ksl_it nghttp3_ksl_begin(const nghttp3_ksl *ksl) { nghttp3_ksl_it nghttp3_ksl_end(const nghttp3_ksl *ksl) { nghttp3_ksl_it it; - if (ksl->head) { - nghttp3_ksl_it_init(&it, ksl, ksl->back, ksl->back->n); + if (ksl->root) { + nghttp3_ksl_it_init(&it, ksl->back, ksl->back->n); } else { - nghttp3_ksl_it_init(&it, ksl, &null_blk, 0); + nghttp3_ksl_it_init(&it, &null_blk, 0); } return it; } -void nghttp3_ksl_it_init(nghttp3_ksl_it *it, const nghttp3_ksl *ksl, - nghttp3_ksl_blk *blk, size_t i) { - it->ksl = ksl; +void nghttp3_ksl_it_init(nghttp3_ksl_it *it, nghttp3_ksl_blk *blk, size_t i) { it->blk = blk; it->i = i; } @@ -822,12 +817,6 @@ int nghttp3_ksl_it_begin(const nghttp3_ksl_it *it) { return it->i == 0 && it->blk->prev == NULL; } -int nghttp3_ksl_range_compar(const nghttp3_ksl_key *lhs, - const nghttp3_ksl_key *rhs) { - const nghttp3_range *a = lhs, *b = rhs; - return a->begin < b->begin; -} - nghttp3_ksl_search_def(range, nghttp3_ksl_range_compar) size_t nghttp3_ksl_range_search(const nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, @@ -835,13 +824,6 @@ size_t nghttp3_ksl_range_search(const nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, return ksl_range_search(ksl, blk, key); } -int nghttp3_ksl_range_exclusive_compar(const nghttp3_ksl_key *lhs, - const nghttp3_ksl_key *rhs) { - const nghttp3_range *a = lhs, *b = rhs; - return a->begin < b->begin && !(nghttp3_max_uint64(a->begin, b->begin) < - nghttp3_min_uint64(a->end, b->end)); -} - nghttp3_ksl_search_def(range_exclusive, nghttp3_ksl_range_exclusive_compar) size_t nghttp3_ksl_range_exclusive_search(const nghttp3_ksl *ksl, @@ -850,11 +832,6 @@ size_t nghttp3_ksl_range_exclusive_search(const nghttp3_ksl *ksl, return ksl_range_exclusive_search(ksl, blk, key); } -int nghttp3_ksl_uint64_less(const nghttp3_ksl_key *lhs, - const nghttp3_ksl_key *rhs) { - return *(uint64_t *)lhs < *(uint64_t *)rhs; -} - nghttp3_ksl_search_def(uint64_less, nghttp3_ksl_uint64_less) size_t nghttp3_ksl_uint64_less_search(const nghttp3_ksl *ksl, @@ -863,11 +840,6 @@ size_t nghttp3_ksl_uint64_less_search(const nghttp3_ksl *ksl, return ksl_uint64_less_search(ksl, blk, key); } -int nghttp3_ksl_int64_greater(const nghttp3_ksl_key *lhs, - const nghttp3_ksl_key *rhs) { - return *(int64_t *)lhs > *(int64_t *)rhs; -} - nghttp3_ksl_search_def(int64_greater, nghttp3_ksl_int64_greater) size_t nghttp3_ksl_int64_greater_search(const nghttp3_ksl *ksl, diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.h b/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.h index 0b5663d29959..852e4d471f23 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.h @@ -35,14 +35,15 @@ #include #include "nghttp3_objalloc.h" +#include "nghttp3_range.h" #define NGHTTP3_KSL_DEGR 16 /* NGHTTP3_KSL_MAX_NBLK is the maximum number of nodes which a single block can contain. */ -#define NGHTTP3_KSL_MAX_NBLK (2 * NGHTTP3_KSL_DEGR - 1) +#define NGHTTP3_KSL_MAX_NBLK (2 * NGHTTP3_KSL_DEGR) /* NGHTTP3_KSL_MIN_NBLK is the minimum number of nodes which a single block other than root must contain. */ -#define NGHTTP3_KSL_MIN_NBLK (NGHTTP3_KSL_DEGR - 1) +#define NGHTTP3_KSL_MIN_NBLK NGHTTP3_KSL_DEGR /* * nghttp3_ksl_key represents key in nghttp3_ksl. @@ -76,16 +77,19 @@ struct nghttp3_ksl_blk { /* prev points to the previous block if leaf field is nonzero. */ nghttp3_ksl_blk *prev; - /* n is the number of nodes this object contains in nodes. */ - uint32_t n; - /* leaf is nonzero if this block contains leaf nodes. */ - uint32_t leaf; nghttp3_ksl_node nodes[NGHTTP3_KSL_MAX_NBLK]; /* keys is a pointer to the buffer to include NGHTTP3_KSL_MAX_NBLK keys. Because the length of key is unknown until nghttp3_ksl_init is called, the actual buffer - will be allocated after this field. */ + will be allocated after this object. */ uint8_t *keys; + /* n is the number of nodes this object contains in nodes. */ + uint32_t n; + /* aligned_keylen is the length of the single key including + alignment. */ + uint16_t aligned_keylen; + /* leaf is nonzero if this block contains leaf nodes. */ + uint8_t leaf; }; nghttp3_opl_entry oplent; @@ -137,7 +141,6 @@ typedef struct nghttp3_ksl_it nghttp3_ksl_it; * nghttp3_ksl_it is a bidirectional iterator to iterate nodes. */ struct nghttp3_ksl_it { - const nghttp3_ksl *ksl; nghttp3_ksl_blk *blk; size_t i; }; @@ -147,8 +150,8 @@ struct nghttp3_ksl_it { */ struct nghttp3_ksl { nghttp3_objalloc blkalloc; - /* head points to the root block. */ - nghttp3_ksl_blk *head; + /* root points to the root block. */ + nghttp3_ksl_blk *root; /* front points to the first leaf block. */ nghttp3_ksl_blk *front; /* back points to the last leaf block. */ @@ -278,12 +281,11 @@ size_t nghttp3_ksl_len(const nghttp3_ksl *ksl); void nghttp3_ksl_clear(nghttp3_ksl *ksl); /* - * nghttp3_ksl_nth_key returns the |n|th key under |blk|. + * nghttp3_ksl_blk_nth_key returns the |n|th key under |blk|. */ static inline const nghttp3_ksl_key * -nghttp3_ksl_nth_key(const nghttp3_ksl *ksl, const nghttp3_ksl_blk *blk, - size_t n) { - return blk->keys + n * ksl->aligned_keylen; +nghttp3_ksl_blk_nth_key(const nghttp3_ksl_blk *blk, size_t n) { + return blk->keys + n * blk->aligned_keylen; } #ifndef WIN32 @@ -298,8 +300,7 @@ void nghttp3_ksl_print(const nghttp3_ksl *ksl); /* * nghttp3_ksl_it_init initializes |it|. */ -void nghttp3_ksl_it_init(nghttp3_ksl_it *it, const nghttp3_ksl *ksl, - nghttp3_ksl_blk *blk, size_t i); +void nghttp3_ksl_it_init(nghttp3_ksl_it *it, nghttp3_ksl_blk *blk, size_t i); /* * nghttp3_ksl_it_get returns the data associated to the node which @@ -351,7 +352,7 @@ int nghttp3_ksl_it_begin(const nghttp3_ksl_it *it); */ static inline const nghttp3_ksl_key * nghttp3_ksl_it_key(const nghttp3_ksl_it *it) { - return nghttp3_ksl_nth_key(it->ksl, it->blk, it->i); + return nghttp3_ksl_blk_nth_key(it->blk, it->i); } /* @@ -360,8 +361,12 @@ nghttp3_ksl_it_key(const nghttp3_ksl_it *it) { * object, and the function returns nonzero if ((const nghttp3_range * *)lhs)->begin < ((const nghttp3_range *)rhs)->begin. */ -int nghttp3_ksl_range_compar(const nghttp3_ksl_key *lhs, - const nghttp3_ksl_key *rhs); +static inline int nghttp3_ksl_range_compar(const nghttp3_ksl_key *lhs, + const nghttp3_ksl_key *rhs) { + const nghttp3_range *a = (const nghttp3_range *)lhs, + *b = (const nghttp3_range *)rhs; + return a->begin < b->begin; +} /* * nghttp3_ksl_range_search is an implementation of nghttp3_ksl_search @@ -377,8 +382,14 @@ size_t nghttp3_ksl_range_search(const nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, * *)lhs)->begin < ((const nghttp3_range *)rhs)->begin, and the 2 * ranges do not intersect. */ -int nghttp3_ksl_range_exclusive_compar(const nghttp3_ksl_key *lhs, - const nghttp3_ksl_key *rhs); +static inline int +nghttp3_ksl_range_exclusive_compar(const nghttp3_ksl_key *lhs, + const nghttp3_ksl_key *rhs) { + const nghttp3_range *a = (const nghttp3_range *)lhs, + *b = (const nghttp3_range *)rhs; + return a->begin < b->begin && + !(nghttp3_max(a->begin, b->begin) < nghttp3_min(a->end, b->end)); +} /* * nghttp3_ksl_range_exclusive_search is an implementation of @@ -393,8 +404,10 @@ size_t nghttp3_ksl_range_exclusive_search(const nghttp3_ksl *ksl, * |lhs| and |rhs| must point to uint64_t objects, and the function * returns nonzero if *(uint64_t *)|lhs| < *(uint64_t *)|rhs|. */ -int nghttp3_ksl_uint64_less(const nghttp3_ksl_key *lhs, - const nghttp3_ksl_key *rhs); +static inline int nghttp3_ksl_uint64_less(const nghttp3_ksl_key *lhs, + const nghttp3_ksl_key *rhs) { + return *(const uint64_t *)lhs < *(const uint64_t *)rhs; +} /* * nghttp3_ksl_uint64_less_search is an implementation of @@ -410,8 +423,10 @@ size_t nghttp3_ksl_uint64_less_search(const nghttp3_ksl *ksl, * and the function returns nonzero if *(int64_t *)|lhs| > *(int64_t * *)|rhs|. */ -int nghttp3_ksl_int64_greater(const nghttp3_ksl_key *lhs, - const nghttp3_ksl_key *rhs); +static inline int nghttp3_ksl_int64_greater(const nghttp3_ksl_key *lhs, + const nghttp3_ksl_key *rhs) { + return *(const int64_t *)lhs > *(const int64_t *)rhs; +} /* * nghttp3_ksl_int64_greater_search is an implementation of diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_macro.h b/deps/ngtcp2/nghttp3/lib/nghttp3_macro.h index ffe0ea709243..2b03dc53dbb7 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_macro.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_macro.h @@ -39,7 +39,15 @@ #define nghttp3_arraylen(A) (sizeof(A) / sizeof(*(A))) -#define lstreq(A, B, N) ((sizeof((A)) - 1) == (N) && memcmp((A), (B), (N)) == 0) +/* + * nghttp3_strlen_lit returns the length of string literal |S|. This + * macro assumes |S| is NULL-terminated string literal. It must not + * be used with pointers. + */ +#define nghttp3_strlen_lit(S) (sizeof(S) - 1) + +#define lstreq(A, B, N) \ + (nghttp3_strlen_lit((A)) == (N) && memcmp((A), (B), (N)) == 0) /* NGHTTP3_MAX_VARINT` is the maximum value which can be encoded in variable-length integer encoding. */ @@ -48,27 +56,81 @@ #define nghttp3_max_def(SUFFIX, T) \ static inline T nghttp3_max_##SUFFIX(T a, T b) { return a < b ? b : a; } -nghttp3_max_def(int8, int8_t) -nghttp3_max_def(int16, int16_t) -nghttp3_max_def(int32, int32_t) -nghttp3_max_def(int64, int64_t) -nghttp3_max_def(uint8, uint8_t) -nghttp3_max_def(uint16, uint16_t) -nghttp3_max_def(uint32, uint32_t) -nghttp3_max_def(uint64, uint64_t) -nghttp3_max_def(size, size_t) +nghttp3_max_def(long_long_int, long long int) +nghttp3_max_def(long_int, long int) +nghttp3_max_def(int, int) +nghttp3_max_def(short_int, short int) +nghttp3_max_def(signed_char, signed char) +nghttp3_max_def(char, char) +nghttp3_max_def(unsigned_long_long_int, unsigned long long int) +nghttp3_max_def(unsigned_long_int, unsigned long int) +nghttp3_max_def(unsigned_int, unsigned int) +nghttp3_max_def(unsigned_short_int, unsigned short int) +nghttp3_max_def(unsigned_char, unsigned char) + +#define nghttp3_max(A, B) \ + _Generic((A), \ + long long int: nghttp3_max_long_long_int, \ + long int: nghttp3_max_long_int, \ + int: _Generic((B), \ + long long int: nghttp3_max_long_long_int, \ + long int: nghttp3_max_long_int, \ + int: nghttp3_max_int, \ + short int: nghttp3_max_short_int, \ + signed char: nghttp3_max_signed_char, \ + char: nghttp3_max_char, \ + unsigned long long int: nghttp3_max_unsigned_long_long_int, \ + unsigned long int: nghttp3_max_unsigned_long_int, \ + unsigned int: nghttp3_max_unsigned_int, \ + unsigned short int: nghttp3_max_unsigned_short_int, \ + unsigned char: nghttp3_max_unsigned_char), \ + short int: nghttp3_max_short_int, \ + signed char: nghttp3_max_signed_char, \ + char: nghttp3_max_char, \ + unsigned long long int: nghttp3_max_unsigned_long_long_int, \ + unsigned long int: nghttp3_max_unsigned_long_int, \ + unsigned int: nghttp3_max_unsigned_int, \ + unsigned short int: nghttp3_max_unsigned_short_int, \ + unsigned char: nghttp3_max_unsigned_char)((A), (B)) #define nghttp3_min_def(SUFFIX, T) \ static inline T nghttp3_min_##SUFFIX(T a, T b) { return a < b ? a : b; } -nghttp3_min_def(int8, int8_t) -nghttp3_min_def(int16, int16_t) -nghttp3_min_def(int32, int32_t) -nghttp3_min_def(int64, int64_t) -nghttp3_min_def(uint8, uint8_t) -nghttp3_min_def(uint16, uint16_t) -nghttp3_min_def(uint32, uint32_t) -nghttp3_min_def(uint64, uint64_t) -nghttp3_min_def(size, size_t) +nghttp3_min_def(long_long_int, long long int) +nghttp3_min_def(long_int, long int) +nghttp3_min_def(int, int) +nghttp3_min_def(short_int, short int) +nghttp3_min_def(signed_char, signed char) +nghttp3_min_def(char, char) +nghttp3_min_def(unsigned_long_long_int, unsigned long long int) +nghttp3_min_def(unsigned_long_int, unsigned long int) +nghttp3_min_def(unsigned_int, unsigned int) +nghttp3_min_def(unsigned_short_int, unsigned short int) +nghttp3_min_def(unsigned_char, unsigned char) + +#define nghttp3_min(A, B) \ + _Generic((A), \ + long long int: nghttp3_min_long_long_int, \ + long int: nghttp3_min_long_int, \ + int: _Generic((B), \ + long long int: nghttp3_min_long_long_int, \ + long int: nghttp3_min_long_int, \ + int: nghttp3_min_int, \ + short int: nghttp3_min_short_int, \ + signed char: nghttp3_min_signed_char, \ + char: nghttp3_min_char, \ + unsigned long long int: nghttp3_min_unsigned_long_long_int, \ + unsigned long int: nghttp3_min_unsigned_long_int, \ + unsigned int: nghttp3_min_unsigned_int, \ + unsigned short int: nghttp3_min_unsigned_short_int, \ + unsigned char: nghttp3_min_unsigned_char), \ + short int: nghttp3_min_short_int, \ + signed char: nghttp3_min_signed_char, \ + char: nghttp3_min_char, \ + unsigned long long int: nghttp3_min_unsigned_long_long_int, \ + unsigned long int: nghttp3_min_unsigned_long_int, \ + unsigned int: nghttp3_min_unsigned_int, \ + unsigned short int: nghttp3_min_unsigned_short_int, \ + unsigned char: nghttp3_min_unsigned_char)((A), (B)) #endif /* !defined(NGHTTP3_MACRO_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_map.c b/deps/ngtcp2/nghttp3/lib/nghttp3_map.c index d5b720b148f8..7858d4cc3eb1 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_map.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_map.c @@ -78,10 +78,10 @@ int nghttp3_map_each(const nghttp3_map *map, int (*func)(void *data, void *ptr), /* Hasher from https://github.com/rust-lang/rustc-hash/blob/dc5c33f1283de2da64d8d7a06401d91aded03ad4/src/lib.rs to maximize the output's sensitivity to all input bits. */ -#define NGHTTP3_MAP_HASHER 0xf1357aea2e62a9c5ull +#define NGHTTP3_MAP_HASHER 0xF1357AEA2E62A9C5ULL /* 64-bit Fibonacci hashing constant, Golden Ratio constant, to get the high bits with the good distribution. */ -#define NGHTTP3_MAP_FIBO 0x9e3779b97f4a7c15ull +#define NGHTTP3_MAP_FIBO 0x9E3779B97F4A7C15ULL static size_t map_index(const nghttp3_map *map, nghttp3_map_key_type key) { key += map->seed; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_objalloc.h b/deps/ngtcp2/nghttp3/lib/nghttp3_objalloc.h index 4f8ffa093751..b3c170466072 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_objalloc.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_objalloc.h @@ -70,7 +70,7 @@ void nghttp3_objalloc_clear(nghttp3_objalloc *objalloc); inline static void nghttp3_objalloc_##NAME##_init( \ nghttp3_objalloc *objalloc, size_t nmemb, const nghttp3_mem *mem) { \ nghttp3_objalloc_init( \ - objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ + objalloc, ((sizeof(TYPE) + 0xFU) & ~(size_t)0xFU) * nmemb, mem); \ } \ \ TYPE *nghttp3_objalloc_##NAME##_get(nghttp3_objalloc *objalloc); \ @@ -124,7 +124,7 @@ void nghttp3_objalloc_clear(nghttp3_objalloc *objalloc); inline static void nghttp3_objalloc_##NAME##_init( \ nghttp3_objalloc *objalloc, size_t nmemb, const nghttp3_mem *mem) { \ nghttp3_objalloc_init( \ - objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ + objalloc, ((sizeof(TYPE) + 0xFU) & ~(size_t)0xFU) * nmemb, mem); \ } \ \ inline static TYPE *nghttp3_objalloc_##NAME##_get( \ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_pq.c b/deps/ngtcp2/nghttp3/lib/nghttp3_pq.c index e35bcac4e43b..c5b657bc6d9f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_pq.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_pq.c @@ -76,7 +76,7 @@ int nghttp3_pq_push(nghttp3_pq *pq, nghttp3_pq_entry *item) { void *nq; size_t ncapacity; - ncapacity = nghttp3_max_size(4, pq->capacity * 2); + ncapacity = nghttp3_max(4, pq->capacity * 2); nq = nghttp3_mem_realloc(pq->mem, pq->q, ncapacity * sizeof(nghttp3_pq_entry *)); diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.c b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.c index ece873a8f2cf..8e950a201d89 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.c @@ -50,122 +50,122 @@ /* Generated by mkstatichdtbl.py */ static nghttp3_qpack_static_entry token_stable[] = { - MAKE_STATIC_ENT(0, NGHTTP3_QPACK_TOKEN__AUTHORITY, 3153725150u), - MAKE_STATIC_ENT(15, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(16, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(17, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(18, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(19, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(20, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(21, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(1, NGHTTP3_QPACK_TOKEN__PATH, 3292848686u), - MAKE_STATIC_ENT(22, NGHTTP3_QPACK_TOKEN__SCHEME, 2510477674u), - MAKE_STATIC_ENT(23, NGHTTP3_QPACK_TOKEN__SCHEME, 2510477674u), - MAKE_STATIC_ENT(24, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(25, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(26, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(27, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(28, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(63, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(64, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(65, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(66, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(67, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(68, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(69, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(70, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(71, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(29, NGHTTP3_QPACK_TOKEN_ACCEPT, 136609321u), - MAKE_STATIC_ENT(30, NGHTTP3_QPACK_TOKEN_ACCEPT, 136609321u), - MAKE_STATIC_ENT(31, NGHTTP3_QPACK_TOKEN_ACCEPT_ENCODING, 3379649177u), - MAKE_STATIC_ENT(72, NGHTTP3_QPACK_TOKEN_ACCEPT_LANGUAGE, 1979086614u), - MAKE_STATIC_ENT(32, NGHTTP3_QPACK_TOKEN_ACCEPT_RANGES, 1713753958u), + MAKE_STATIC_ENT(0, NGHTTP3_QPACK_TOKEN__AUTHORITY, 3153725150U), + MAKE_STATIC_ENT(15, NGHTTP3_QPACK_TOKEN__METHOD, 695666056U), + MAKE_STATIC_ENT(16, NGHTTP3_QPACK_TOKEN__METHOD, 695666056U), + MAKE_STATIC_ENT(17, NGHTTP3_QPACK_TOKEN__METHOD, 695666056U), + MAKE_STATIC_ENT(18, NGHTTP3_QPACK_TOKEN__METHOD, 695666056U), + MAKE_STATIC_ENT(19, NGHTTP3_QPACK_TOKEN__METHOD, 695666056U), + MAKE_STATIC_ENT(20, NGHTTP3_QPACK_TOKEN__METHOD, 695666056U), + MAKE_STATIC_ENT(21, NGHTTP3_QPACK_TOKEN__METHOD, 695666056U), + MAKE_STATIC_ENT(1, NGHTTP3_QPACK_TOKEN__PATH, 3292848686U), + MAKE_STATIC_ENT(22, NGHTTP3_QPACK_TOKEN__SCHEME, 2510477674U), + MAKE_STATIC_ENT(23, NGHTTP3_QPACK_TOKEN__SCHEME, 2510477674U), + MAKE_STATIC_ENT(24, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983U), + MAKE_STATIC_ENT(25, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983U), + MAKE_STATIC_ENT(26, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983U), + MAKE_STATIC_ENT(27, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983U), + MAKE_STATIC_ENT(28, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983U), + MAKE_STATIC_ENT(63, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983U), + MAKE_STATIC_ENT(64, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983U), + MAKE_STATIC_ENT(65, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983U), + MAKE_STATIC_ENT(66, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983U), + MAKE_STATIC_ENT(67, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983U), + MAKE_STATIC_ENT(68, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983U), + MAKE_STATIC_ENT(69, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983U), + MAKE_STATIC_ENT(70, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983U), + MAKE_STATIC_ENT(71, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983U), + MAKE_STATIC_ENT(29, NGHTTP3_QPACK_TOKEN_ACCEPT, 136609321U), + MAKE_STATIC_ENT(30, NGHTTP3_QPACK_TOKEN_ACCEPT, 136609321U), + MAKE_STATIC_ENT(31, NGHTTP3_QPACK_TOKEN_ACCEPT_ENCODING, 3379649177U), + MAKE_STATIC_ENT(72, NGHTTP3_QPACK_TOKEN_ACCEPT_LANGUAGE, 1979086614U), + MAKE_STATIC_ENT(32, NGHTTP3_QPACK_TOKEN_ACCEPT_RANGES, 1713753958U), MAKE_STATIC_ENT(73, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS, - 901040780u), + 901040780U), MAKE_STATIC_ENT(74, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS, - 901040780u), + 901040780U), MAKE_STATIC_ENT(33, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, - 1524311232u), + 1524311232U), MAKE_STATIC_ENT(34, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, - 1524311232u), + 1524311232U), MAKE_STATIC_ENT(75, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, - 1524311232u), + 1524311232U), MAKE_STATIC_ENT(76, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, - 2175229868u), + 2175229868U), MAKE_STATIC_ENT(77, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, - 2175229868u), + 2175229868U), MAKE_STATIC_ENT(78, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, - 2175229868u), + 2175229868U), MAKE_STATIC_ENT(35, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_ORIGIN, - 2710797292u), + 2710797292U), MAKE_STATIC_ENT(79, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_EXPOSE_HEADERS, - 2449824425u), + 2449824425U), MAKE_STATIC_ENT(80, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_HEADERS, - 3599549072u), + 3599549072U), MAKE_STATIC_ENT(81, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD, - 2417078055u), + 2417078055U), MAKE_STATIC_ENT(82, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD, - 2417078055u), - MAKE_STATIC_ENT(2, NGHTTP3_QPACK_TOKEN_AGE, 742476188u), - MAKE_STATIC_ENT(83, NGHTTP3_QPACK_TOKEN_ALT_SVC, 2148877059u), - MAKE_STATIC_ENT(84, NGHTTP3_QPACK_TOKEN_AUTHORIZATION, 2436257726u), - MAKE_STATIC_ENT(36, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(37, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(38, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(39, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(40, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(41, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(3, NGHTTP3_QPACK_TOKEN_CONTENT_DISPOSITION, 3889184348u), - MAKE_STATIC_ENT(42, NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING, 65203592u), - MAKE_STATIC_ENT(43, NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING, 65203592u), - MAKE_STATIC_ENT(4, NGHTTP3_QPACK_TOKEN_CONTENT_LENGTH, 1308181789u), - MAKE_STATIC_ENT(85, NGHTTP3_QPACK_TOKEN_CONTENT_SECURITY_POLICY, 1569039836u), - MAKE_STATIC_ENT(44, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(45, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(46, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(47, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(48, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(49, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(50, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(51, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(52, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(53, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(54, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(5, NGHTTP3_QPACK_TOKEN_COOKIE, 2007449791u), - MAKE_STATIC_ENT(6, NGHTTP3_QPACK_TOKEN_DATE, 3564297305u), - MAKE_STATIC_ENT(86, NGHTTP3_QPACK_TOKEN_EARLY_DATA, 4080895051u), - MAKE_STATIC_ENT(7, NGHTTP3_QPACK_TOKEN_ETAG, 113792960u), - MAKE_STATIC_ENT(87, NGHTTP3_QPACK_TOKEN_EXPECT_CT, 1183214960u), - MAKE_STATIC_ENT(88, NGHTTP3_QPACK_TOKEN_FORWARDED, 1485178027u), - MAKE_STATIC_ENT(8, NGHTTP3_QPACK_TOKEN_IF_MODIFIED_SINCE, 2213050793u), - MAKE_STATIC_ENT(9, NGHTTP3_QPACK_TOKEN_IF_NONE_MATCH, 2536202615u), - MAKE_STATIC_ENT(89, NGHTTP3_QPACK_TOKEN_IF_RANGE, 2340978238u), - MAKE_STATIC_ENT(10, NGHTTP3_QPACK_TOKEN_LAST_MODIFIED, 3226950251u), - MAKE_STATIC_ENT(11, NGHTTP3_QPACK_TOKEN_LINK, 232457833u), - MAKE_STATIC_ENT(12, NGHTTP3_QPACK_TOKEN_LOCATION, 200649126u), - MAKE_STATIC_ENT(90, NGHTTP3_QPACK_TOKEN_ORIGIN, 3649018447u), - MAKE_STATIC_ENT(91, NGHTTP3_QPACK_TOKEN_PURPOSE, 4212263681u), - MAKE_STATIC_ENT(55, NGHTTP3_QPACK_TOKEN_RANGE, 4208725202u), - MAKE_STATIC_ENT(13, NGHTTP3_QPACK_TOKEN_REFERER, 3969579366u), - MAKE_STATIC_ENT(92, NGHTTP3_QPACK_TOKEN_SERVER, 1085029842u), - MAKE_STATIC_ENT(14, NGHTTP3_QPACK_TOKEN_SET_COOKIE, 1848371000u), + 2417078055U), + MAKE_STATIC_ENT(2, NGHTTP3_QPACK_TOKEN_AGE, 742476188U), + MAKE_STATIC_ENT(83, NGHTTP3_QPACK_TOKEN_ALT_SVC, 2148877059U), + MAKE_STATIC_ENT(84, NGHTTP3_QPACK_TOKEN_AUTHORIZATION, 2436257726U), + MAKE_STATIC_ENT(36, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669U), + MAKE_STATIC_ENT(37, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669U), + MAKE_STATIC_ENT(38, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669U), + MAKE_STATIC_ENT(39, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669U), + MAKE_STATIC_ENT(40, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669U), + MAKE_STATIC_ENT(41, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669U), + MAKE_STATIC_ENT(3, NGHTTP3_QPACK_TOKEN_CONTENT_DISPOSITION, 3889184348U), + MAKE_STATIC_ENT(42, NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING, 65203592U), + MAKE_STATIC_ENT(43, NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING, 65203592U), + MAKE_STATIC_ENT(4, NGHTTP3_QPACK_TOKEN_CONTENT_LENGTH, 1308181789U), + MAKE_STATIC_ENT(85, NGHTTP3_QPACK_TOKEN_CONTENT_SECURITY_POLICY, 1569039836U), + MAKE_STATIC_ENT(44, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277U), + MAKE_STATIC_ENT(45, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277U), + MAKE_STATIC_ENT(46, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277U), + MAKE_STATIC_ENT(47, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277U), + MAKE_STATIC_ENT(48, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277U), + MAKE_STATIC_ENT(49, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277U), + MAKE_STATIC_ENT(50, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277U), + MAKE_STATIC_ENT(51, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277U), + MAKE_STATIC_ENT(52, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277U), + MAKE_STATIC_ENT(53, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277U), + MAKE_STATIC_ENT(54, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277U), + MAKE_STATIC_ENT(5, NGHTTP3_QPACK_TOKEN_COOKIE, 2007449791U), + MAKE_STATIC_ENT(6, NGHTTP3_QPACK_TOKEN_DATE, 3564297305U), + MAKE_STATIC_ENT(86, NGHTTP3_QPACK_TOKEN_EARLY_DATA, 4080895051U), + MAKE_STATIC_ENT(7, NGHTTP3_QPACK_TOKEN_ETAG, 113792960U), + MAKE_STATIC_ENT(87, NGHTTP3_QPACK_TOKEN_EXPECT_CT, 1183214960U), + MAKE_STATIC_ENT(88, NGHTTP3_QPACK_TOKEN_FORWARDED, 1485178027U), + MAKE_STATIC_ENT(8, NGHTTP3_QPACK_TOKEN_IF_MODIFIED_SINCE, 2213050793U), + MAKE_STATIC_ENT(9, NGHTTP3_QPACK_TOKEN_IF_NONE_MATCH, 2536202615U), + MAKE_STATIC_ENT(89, NGHTTP3_QPACK_TOKEN_IF_RANGE, 2340978238U), + MAKE_STATIC_ENT(10, NGHTTP3_QPACK_TOKEN_LAST_MODIFIED, 3226950251U), + MAKE_STATIC_ENT(11, NGHTTP3_QPACK_TOKEN_LINK, 232457833U), + MAKE_STATIC_ENT(12, NGHTTP3_QPACK_TOKEN_LOCATION, 200649126U), + MAKE_STATIC_ENT(90, NGHTTP3_QPACK_TOKEN_ORIGIN, 3649018447U), + MAKE_STATIC_ENT(91, NGHTTP3_QPACK_TOKEN_PURPOSE, 4212263681U), + MAKE_STATIC_ENT(55, NGHTTP3_QPACK_TOKEN_RANGE, 4208725202U), + MAKE_STATIC_ENT(13, NGHTTP3_QPACK_TOKEN_REFERER, 3969579366U), + MAKE_STATIC_ENT(92, NGHTTP3_QPACK_TOKEN_SERVER, 1085029842U), + MAKE_STATIC_ENT(14, NGHTTP3_QPACK_TOKEN_SET_COOKIE, 1848371000U), MAKE_STATIC_ENT(56, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, - 4138147361u), + 4138147361U), MAKE_STATIC_ENT(57, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, - 4138147361u), + 4138147361U), MAKE_STATIC_ENT(58, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, - 4138147361u), - MAKE_STATIC_ENT(93, NGHTTP3_QPACK_TOKEN_TIMING_ALLOW_ORIGIN, 2432297564u), + 4138147361U), + MAKE_STATIC_ENT(93, NGHTTP3_QPACK_TOKEN_TIMING_ALLOW_ORIGIN, 2432297564U), MAKE_STATIC_ENT(94, NGHTTP3_QPACK_TOKEN_UPGRADE_INSECURE_REQUESTS, - 2479169413u), - MAKE_STATIC_ENT(95, NGHTTP3_QPACK_TOKEN_USER_AGENT, 606444526u), - MAKE_STATIC_ENT(59, NGHTTP3_QPACK_TOKEN_VARY, 1085005381u), - MAKE_STATIC_ENT(60, NGHTTP3_QPACK_TOKEN_VARY, 1085005381u), - MAKE_STATIC_ENT(61, NGHTTP3_QPACK_TOKEN_X_CONTENT_TYPE_OPTIONS, 3644557769u), - MAKE_STATIC_ENT(96, NGHTTP3_QPACK_TOKEN_X_FORWARDED_FOR, 2914187656u), - MAKE_STATIC_ENT(97, NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS, 3993834824u), - MAKE_STATIC_ENT(98, NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS, 3993834824u), - MAKE_STATIC_ENT(62, NGHTTP3_QPACK_TOKEN_X_XSS_PROTECTION, 2501058888u), + 2479169413U), + MAKE_STATIC_ENT(95, NGHTTP3_QPACK_TOKEN_USER_AGENT, 606444526U), + MAKE_STATIC_ENT(59, NGHTTP3_QPACK_TOKEN_VARY, 1085005381U), + MAKE_STATIC_ENT(60, NGHTTP3_QPACK_TOKEN_VARY, 1085005381U), + MAKE_STATIC_ENT(61, NGHTTP3_QPACK_TOKEN_X_CONTENT_TYPE_OPTIONS, 3644557769U), + MAKE_STATIC_ENT(96, NGHTTP3_QPACK_TOKEN_X_FORWARDED_FOR, 2914187656U), + MAKE_STATIC_ENT(97, NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS, 3993834824U), + MAKE_STATIC_ENT(98, NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS, 3993834824U), + MAKE_STATIC_ENT(62, NGHTTP3_QPACK_TOKEN_X_XSS_PROTECTION, 2501058888U), }; /* Make scalar initialization form of nghttp3_qpack_static_entry */ @@ -174,13 +174,13 @@ static nghttp3_qpack_static_entry token_stable[] = { .name = \ { \ .base = (uint8_t *)(N), \ - .len = sizeof((N)) - 1, \ + .len = nghttp3_strlen_lit((N)), \ .ref = -1, \ }, \ .value = \ { \ .base = (uint8_t *)(V), \ - .len = sizeof((V)) - 1, \ + .len = nghttp3_strlen_lit((V)), \ .ref = -1, \ }, \ .token = T, \ @@ -749,7 +749,7 @@ static int qpack_nv_value_eq(const nghttp3_qpack_nv *a, const nghttp3_nv *b) { } static void qpack_map_init(nghttp3_qpack_map *map) { - memset(map, 0, sizeof(nghttp3_qpack_map)); + *map = (nghttp3_qpack_map){0}; } static void qpack_map_insert(nghttp3_qpack_map *map, nghttp3_qpack_entry *ent) { @@ -940,8 +940,8 @@ void nghttp3_qpack_encoder_free(nghttp3_qpack_encoder *encoder) { void nghttp3_qpack_encoder_set_max_dtable_capacity( nghttp3_qpack_encoder *encoder, size_t max_dtable_capacity) { - max_dtable_capacity = nghttp3_min_size(max_dtable_capacity, - encoder->ctx.hard_max_dtable_capacity); + max_dtable_capacity = + nghttp3_min(max_dtable_capacity, encoder->ctx.hard_max_dtable_capacity); if (encoder->ctx.max_dtable_capacity == max_dtable_capacity) { return; @@ -966,7 +966,8 @@ void nghttp3_qpack_encoder_set_indexing_strat( encoder->indexing_strat = strat; } -uint64_t nghttp3_qpack_encoder_get_min_cnt(nghttp3_qpack_encoder *encoder) { +uint64_t +nghttp3_qpack_encoder_get_min_cnt(const nghttp3_qpack_encoder *encoder) { assert(!nghttp3_pq_empty(&encoder->min_cnts)); return nghttp3_struct_of(nghttp3_pq_top(&encoder->min_cnts), @@ -1111,15 +1112,15 @@ static int reserve_buf(nghttp3_buf *buf, size_t extra_size, return 0; } - n = nghttp3_max_size(n, nghttp3_buf_cap(buf) + extra_size - left); + n = nghttp3_max(n, nghttp3_buf_cap(buf) + extra_size - left); /* Check whether we are requesting too much memory */ - if (n > (1u << 31)) { + if (n > (1U << 31)) { return NGHTTP3_ERR_NOMEM; } #ifndef WIN32 - n = 1u << (32 - __builtin_clz((uint32_t)n - 1)); + n = 1U << (32 - __builtin_clz((uint32_t)n - 1)); #else /* defined(WIN32) */ /* Round up to the next highest power of 2 from Bit Twiddling Hacks */ @@ -1271,23 +1272,23 @@ int nghttp3_qpack_encoder_process_dtable_update(nghttp3_qpack_encoder *encoder, int nghttp3_qpack_encoder_write_set_dtable_cap(nghttp3_qpack_encoder *encoder, nghttp3_buf *ebuf, size_t cap) { DEBUGF("qpack::encode: Set Dynamic Table Capacity capacity=%zu\n", cap); - return qpack_write_number(ebuf, 0x20, cap, 5, encoder->ctx.mem); + return qpack_write_number(ebuf, 0x20U, cap, 5, encoder->ctx.mem); } nghttp3_qpack_stream * -nghttp3_qpack_encoder_find_stream(nghttp3_qpack_encoder *encoder, +nghttp3_qpack_encoder_find_stream(const nghttp3_qpack_encoder *encoder, int64_t stream_id) { return nghttp3_map_find(&encoder->streams, (nghttp3_map_key_type)stream_id); } -int nghttp3_qpack_encoder_stream_is_blocked(nghttp3_qpack_encoder *encoder, - nghttp3_qpack_stream *stream) { +int nghttp3_qpack_encoder_stream_is_blocked( + const nghttp3_qpack_encoder *encoder, const nghttp3_qpack_stream *stream) { return stream && encoder->krcnt < nghttp3_qpack_stream_get_max_cnt(stream); } static uint32_t qpack_hash_name(const nghttp3_nv *nv) { /* 32 bit FNV-1a: http://isthe.com/chongo/tech/comp/fnv/ */ - uint32_t h = 2166136261u; + uint32_t h = 2166136261U; size_t i; for (i = 0; i < nv->namelen; ++i) { @@ -1304,7 +1305,7 @@ static uint32_t qpack_hash_name(const nghttp3_nv *nv) { * name. */ static nghttp3_qpack_indexing_mode -qpack_encoder_decide_indexing_mode(nghttp3_qpack_encoder *encoder, +qpack_encoder_decide_indexing_mode(const nghttp3_qpack_encoder *encoder, const nghttp3_nv *nv, int32_t token) { if (nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) { return NGHTTP3_QPACK_INDEXING_MODE_NEVER; @@ -1391,7 +1392,7 @@ static int qpack_encoder_can_index(nghttp3_qpack_encoder *encoder, size_t need, if (!nghttp3_pq_empty(&encoder->min_cnts)) { gmin_cnt = nghttp3_qpack_encoder_get_min_cnt(encoder); - min_cnt = nghttp3_min_uint64(min_cnt, gmin_cnt); + min_cnt = nghttp3_min(min_cnt, gmin_cnt); } if (min_cnt == UINT64_MAX) { @@ -1445,7 +1446,7 @@ static int qpack_encoder_can_index_duplicate(nghttp3_qpack_encoder *encoder, static int qpack_context_check_draining(nghttp3_qpack_context *ctx, uint64_t absidx) { const size_t safe = ctx->max_dtable_capacity - - nghttp3_min_size(512, ctx->max_dtable_capacity * 1 / 8); + nghttp3_min(512, ctx->max_dtable_capacity * 1 / 8); nghttp3_qpack_entry *ent = nghttp3_qpack_context_dtable_get(ctx, absidx); return ctx->dtable_sum - ent->sum > safe; @@ -1490,16 +1491,16 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, } else { switch (token) { case NGHTTP3_QPACK_TOKEN_HOST: - hash = 2952701295u; + hash = 2952701295U; break; case NGHTTP3_QPACK_TOKEN_TE: - hash = 1011170994u; + hash = 1011170994U; break; case NGHTTP3_QPACK_TOKEN__PROTOCOL: - hash = 1128642621u; + hash = 1128642621U; break; case NGHTTP3_QPACK_TOKEN_PRIORITY: - hash = 2498028297u; + hash = 2498028297U; break; default: hash = qpack_hash_name(nv); @@ -1532,8 +1533,8 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx); dres.index = (nghttp3_ssize)new_ent->absidx; } - *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, (uint64_t)(dres.index + 1)); - *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, (uint64_t)(dres.index + 1)); + *pmax_cnt = nghttp3_max(*pmax_cnt, (uint64_t)(dres.index + 1)); + *pmin_cnt = nghttp3_min(*pmin_cnt, (uint64_t)(dres.index + 1)); return nghttp3_qpack_encoder_write_dynamic_indexed( encoder, rbuf, (size_t)dres.index, base); @@ -1553,8 +1554,8 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, } if (allow_blocking) { new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx); - *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, new_ent->absidx + 1); - *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, new_ent->absidx + 1); + *pmax_cnt = nghttp3_max(*pmax_cnt, new_ent->absidx + 1); + *pmin_cnt = nghttp3_min(*pmin_cnt, new_ent->absidx + 1); return nghttp3_qpack_encoder_write_dynamic_indexed( encoder, rbuf, new_ent->absidx, base); @@ -1569,9 +1570,8 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, if (just_index && qpack_encoder_can_index_nv( encoder, nv, - allow_blocking - ? *pmin_cnt - : nghttp3_min_uint64((uint64_t)dres.index + 1, *pmin_cnt))) { + allow_blocking ? *pmin_cnt + : nghttp3_min((uint64_t)dres.index + 1, *pmin_cnt))) { rv = nghttp3_qpack_encoder_write_dynamic_insert(encoder, ebuf, (size_t)dres.index, nv); if (rv != 0) { @@ -1579,7 +1579,7 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, } if (!allow_blocking) { - *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, (uint64_t)dres.index + 1); + *pmin_cnt = nghttp3_min(*pmin_cnt, (uint64_t)dres.index + 1); } rv = nghttp3_qpack_encoder_dtable_dynamic_add(encoder, (size_t)dres.index, @@ -1590,16 +1590,16 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, if (allow_blocking) { new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx); - *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, new_ent->absidx + 1); - *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, new_ent->absidx + 1); + *pmax_cnt = nghttp3_max(*pmax_cnt, new_ent->absidx + 1); + *pmin_cnt = nghttp3_min(*pmin_cnt, new_ent->absidx + 1); return nghttp3_qpack_encoder_write_dynamic_indexed( encoder, rbuf, new_ent->absidx, base); } } - *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, (uint64_t)(dres.index + 1)); - *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, (uint64_t)(dres.index + 1)); + *pmax_cnt = nghttp3_max(*pmax_cnt, (uint64_t)(dres.index + 1)); + *pmin_cnt = nghttp3_min(*pmin_cnt, (uint64_t)(dres.index + 1)); return nghttp3_qpack_encoder_write_dynamic_indexed_name( encoder, rbuf, (size_t)dres.index, base, nv); @@ -1616,8 +1616,8 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, } if (allow_blocking) { new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx); - *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, new_ent->absidx + 1); - *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, new_ent->absidx + 1); + *pmax_cnt = nghttp3_max(*pmax_cnt, new_ent->absidx + 1); + *pmin_cnt = nghttp3_min(*pmin_cnt, new_ent->absidx + 1); return nghttp3_qpack_encoder_write_dynamic_indexed(encoder, rbuf, new_ent->absidx, base); @@ -1782,8 +1782,7 @@ int nghttp3_qpack_stream_add_ref(nghttp3_qpack_stream *stream, if (nghttp3_ringbuf_full(&stream->refs)) { rv = nghttp3_ringbuf_reserve( - &stream->refs, - nghttp3_max_size(4, nghttp3_ringbuf_len(&stream->refs) * 2)); + &stream->refs, nghttp3_max(4, nghttp3_ringbuf_len(&stream->refs) * 2)); if (rv != 0) { return rv; } @@ -1815,28 +1814,26 @@ void nghttp3_qpack_stream_pop_ref(nghttp3_qpack_stream *stream) { nghttp3_ringbuf_pop_front(&stream->refs); } -int nghttp3_qpack_encoder_write_static_indexed(nghttp3_qpack_encoder *encoder, - nghttp3_buf *rbuf, - uint64_t absidx) { +int nghttp3_qpack_encoder_write_static_indexed( + const nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx) { DEBUGF("qpack::encode: Indexed Field Line (static) absidx=%" PRIu64 "\n", absidx); - return qpack_write_number(rbuf, 0xc0, absidx, 6, encoder->ctx.mem); + return qpack_write_number(rbuf, 0xC0U, absidx, 6, encoder->ctx.mem); } -int nghttp3_qpack_encoder_write_dynamic_indexed(nghttp3_qpack_encoder *encoder, - nghttp3_buf *rbuf, - uint64_t absidx, - uint64_t base) { +int nghttp3_qpack_encoder_write_dynamic_indexed( + const nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, + uint64_t base) { DEBUGF("qpack::encode: Indexed Field Line (dynamic) absidx=%" PRIu64 " base=%" PRIu64 "\n", absidx, base); if (absidx < base) { - return qpack_write_number(rbuf, 0x80, base - absidx - 1, 6, + return qpack_write_number(rbuf, 0x80U, base - absidx - 1, 6, encoder->ctx.mem); } - return qpack_write_number(rbuf, 0x10, absidx - base, 4, encoder->ctx.mem); + return qpack_write_number(rbuf, 0x10U, absidx - base, 4, encoder->ctx.mem); } /* @@ -1851,10 +1848,10 @@ int nghttp3_qpack_encoder_write_dynamic_indexed(nghttp3_qpack_encoder *encoder, * NGHTTP3_ERR_NOMEM * Out of memory. */ -static int qpack_encoder_write_indexed_name(nghttp3_qpack_encoder *encoder, - nghttp3_buf *buf, uint8_t fb, - uint64_t nameidx, size_t prefix, - const nghttp3_nv *nv) { +static int +qpack_encoder_write_indexed_name(const nghttp3_qpack_encoder *encoder, + nghttp3_buf *buf, uint8_t fb, uint64_t nameidx, + size_t prefix, const nghttp3_nv *nv) { int rv; size_t len = nghttp3_qpack_put_varint_len(nameidx, prefix); uint8_t *p; @@ -1880,7 +1877,7 @@ static int qpack_encoder_write_indexed_name(nghttp3_qpack_encoder *encoder, p = nghttp3_qpack_put_varint(p, nameidx, prefix); if (h) { - *p = 0x80; + *p = 0x80U; p = nghttp3_qpack_put_varint(p, hlen, 7); p = nghttp3_qpack_huffman_encode(p, nv->value, nv->valuelen); } else { @@ -1899,10 +1896,11 @@ static int qpack_encoder_write_indexed_name(nghttp3_qpack_encoder *encoder, } int nghttp3_qpack_encoder_write_static_indexed_name( - nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, + const nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, const nghttp3_nv *nv) { uint8_t fb = - (uint8_t)(0x50 | ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x20 : 0)); + (uint8_t)(0x50U | + ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x20U : 0x00U)); DEBUGF("qpack::encode: Literal Field Line With Name Reference (static) " "absidx=%" PRIu64 " never=%d\n", @@ -1911,7 +1909,7 @@ int nghttp3_qpack_encoder_write_static_indexed_name( } int nghttp3_qpack_encoder_write_dynamic_indexed_name( - nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, + const nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, uint64_t base, const nghttp3_nv *nv) { uint8_t fb; @@ -1920,13 +1918,13 @@ int nghttp3_qpack_encoder_write_dynamic_indexed_name( absidx, base, (nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) != 0); if (absidx < base) { - fb = - (uint8_t)(0x40 | ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x20 : 0)); + fb = (uint8_t)(0x40U | + ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x20U : 0x00U)); return qpack_encoder_write_indexed_name(encoder, rbuf, fb, base - absidx - 1, 4, nv); } - fb = (nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x08 : 0; + fb = (nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x08U : 0x0U; return qpack_encoder_write_indexed_name(encoder, rbuf, fb, absidx - base, 3, nv); } @@ -1943,7 +1941,7 @@ int nghttp3_qpack_encoder_write_dynamic_indexed_name( * NGHTTP3_ERR_NOMEM * Out of memory. */ -static int qpack_encoder_write_literal(nghttp3_qpack_encoder *encoder, +static int qpack_encoder_write_literal(const nghttp3_qpack_encoder *encoder, nghttp3_buf *buf, uint8_t fb, size_t prefix, const nghttp3_nv *nv) { int rv; @@ -1990,7 +1988,7 @@ static int qpack_encoder_write_literal(nghttp3_qpack_encoder *encoder, *p = 0; if (vh) { - *p |= 0x80; + *p |= 0x80U; p = nghttp3_qpack_put_varint(p, vhlen, 7); p = nghttp3_qpack_huffman_encode(p, nv->value, nv->valuelen); } else { @@ -2007,40 +2005,38 @@ static int qpack_encoder_write_literal(nghttp3_qpack_encoder *encoder, return 0; } -int nghttp3_qpack_encoder_write_literal(nghttp3_qpack_encoder *encoder, +int nghttp3_qpack_encoder_write_literal(const nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, const nghttp3_nv *nv) { uint8_t fb = - (uint8_t)(0x20 | ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x10 : 0)); + (uint8_t)(0x20U | + ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x10U : 0x0U)); DEBUGF("qpack::encode: Literal Field Line With Literal Name\n"); return qpack_encoder_write_literal(encoder, rbuf, fb, 3, nv); } -int nghttp3_qpack_encoder_write_static_insert(nghttp3_qpack_encoder *encoder, - nghttp3_buf *ebuf, - uint64_t absidx, - const nghttp3_nv *nv) { +int nghttp3_qpack_encoder_write_static_insert( + const nghttp3_qpack_encoder *encoder, nghttp3_buf *ebuf, uint64_t absidx, + const nghttp3_nv *nv) { DEBUGF("qpack::encode: Insert With Name Reference (static) absidx=%" PRIu64 "\n", absidx); - return qpack_encoder_write_indexed_name(encoder, ebuf, 0xc0, absidx, 6, nv); + return qpack_encoder_write_indexed_name(encoder, ebuf, 0xC0U, absidx, 6, nv); } -int nghttp3_qpack_encoder_write_dynamic_insert(nghttp3_qpack_encoder *encoder, - nghttp3_buf *ebuf, - uint64_t absidx, - const nghttp3_nv *nv) { +int nghttp3_qpack_encoder_write_dynamic_insert( + const nghttp3_qpack_encoder *encoder, nghttp3_buf *ebuf, uint64_t absidx, + const nghttp3_nv *nv) { DEBUGF("qpack::encode: Insert With Name Reference (dynamic) absidx=%" PRIu64 "\n", absidx); return qpack_encoder_write_indexed_name( - encoder, ebuf, 0x80, encoder->ctx.next_absidx - absidx - 1, 6, nv); + encoder, ebuf, 0x80U, encoder->ctx.next_absidx - absidx - 1, 6, nv); } -int nghttp3_qpack_encoder_write_duplicate_insert(nghttp3_qpack_encoder *encoder, - nghttp3_buf *ebuf, - uint64_t absidx) { +int nghttp3_qpack_encoder_write_duplicate_insert( + const nghttp3_qpack_encoder *encoder, nghttp3_buf *ebuf, uint64_t absidx) { uint64_t idx = encoder->ctx.next_absidx - absidx - 1; size_t len = nghttp3_qpack_put_varint_len(idx, 5); uint8_t *p; @@ -2065,11 +2061,11 @@ int nghttp3_qpack_encoder_write_duplicate_insert(nghttp3_qpack_encoder *encoder, return 0; } -int nghttp3_qpack_encoder_write_literal_insert(nghttp3_qpack_encoder *encoder, - nghttp3_buf *ebuf, - const nghttp3_nv *nv) { +int nghttp3_qpack_encoder_write_literal_insert( + const nghttp3_qpack_encoder *encoder, nghttp3_buf *ebuf, + const nghttp3_nv *nv) { DEBUGF("qpack::encode: Insert With Literal Name\n"); - return qpack_encoder_write_literal(encoder, ebuf, 0x40, 5, nv); + return qpack_encoder_write_literal(encoder, ebuf, 0x40U, 5, nv); } int nghttp3_qpack_context_dtable_add(nghttp3_qpack_context *ctx, @@ -2112,8 +2108,7 @@ int nghttp3_qpack_context_dtable_add(nghttp3_qpack_context *ctx, if (nghttp3_ringbuf_full(&ctx->dtable)) { rv = nghttp3_ringbuf_reserve( - &ctx->dtable, - nghttp3_max_size(128, nghttp3_ringbuf_len(&ctx->dtable) * 2)); + &ctx->dtable, nghttp3_max(128, nghttp3_ringbuf_len(&ctx->dtable) * 2)); if (rv != 0) { goto fail; } @@ -2418,11 +2413,16 @@ void nghttp3_qpack_encoder_cancel_stream(nghttp3_qpack_encoder *encoder, size_t nghttp3_qpack_encoder_get_num_blocked_streams(nghttp3_qpack_encoder *encoder) { + return nghttp3_qpack_encoder_get_num_blocked_streams2(encoder); +} + +size_t nghttp3_qpack_encoder_get_num_blocked_streams2( + const nghttp3_qpack_encoder *encoder) { return nghttp3_ksl_len(&encoder->blocked_streams); } int nghttp3_qpack_encoder_write_field_section_prefix( - nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, uint64_t ricnt, + const nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, uint64_t ricnt, uint64_t base) { size_t max_ents = encoder->ctx.hard_max_dtable_capacity / NGHTTP3_QPACK_ENTRY_OVERHEAD; @@ -2446,7 +2446,7 @@ int nghttp3_qpack_encoder_write_field_section_prefix( p = nghttp3_qpack_put_varint(p, encricnt, 8); if (sign) { - *p = 0x80; + *p = 0x80U; } else { *p = 0; } @@ -2507,7 +2507,7 @@ static nghttp3_ssize qpack_read_varint(int *fin, } for (; p != end; ++p, shift += 7) { - add = (*p) & 0x7f; + add = (*p) & 0x7FU; if (shift > 62) { return NGHTTP3_ERR_QPACK_FATAL; @@ -2568,15 +2568,15 @@ nghttp3_ssize nghttp3_qpack_encoder_read_decoder(nghttp3_qpack_encoder *encoder, for (; p != end;) { switch (encoder->state) { case NGHTTP3_QPACK_DS_STATE_OPCODE: - switch ((*p) & 0xc0) { - case 0x80: - case 0xc0: + switch ((*p) & 0xC0U) { + case 0x80U: + case 0xC0U: DEBUGF("qpack::encode: OPCODE_SECTION_ACK\n"); encoder->opcode = NGHTTP3_QPACK_DS_OPCODE_SECTION_ACK; encoder->rstate.prefix = 7; break; - case 0x40: + case 0x40U: DEBUGF("qpack::encode: OPCODE_STREAM_CANCEL\n"); encoder->opcode = NGHTTP3_QPACK_DS_OPCODE_STREAM_CANCEL; encoder->rstate.prefix = 6; @@ -2673,7 +2673,7 @@ uint8_t *nghttp3_qpack_put_varint(uint8_t *buf, uint64_t n, size_t prefix) { n -= k; for (; n >= 128; n >>= 7) { - *buf++ = (uint8_t)((1 << 7) | (n & 0x7f)); + *buf++ = (uint8_t)(0x80U | (n & 0x7FU)); } *buf++ = (uint8_t)n; @@ -2766,7 +2766,7 @@ static nghttp3_ssize qpack_read_string(nghttp3_qpack_read_state *rstate, nghttp3_buf *dest, const uint8_t *begin, const uint8_t *end) { size_t len = (size_t)(end - begin); - size_t n = (size_t)nghttp3_min_uint64((uint64_t)len, rstate->left); + size_t n = (size_t)nghttp3_min((uint64_t)len, rstate->left); dest->last = nghttp3_cpymem(dest->last, begin, n); @@ -2783,8 +2783,9 @@ static nghttp3_ssize qpack_read_string(nghttp3_qpack_read_state *rstate, * NGHTTP3_ERR_QPACK_FATAL * rstate->absidx is invalid. */ -static int qpack_decoder_validate_index(nghttp3_qpack_decoder *decoder, - nghttp3_qpack_read_state *rstate) { +static int +qpack_decoder_validate_index(const nghttp3_qpack_decoder *decoder, + const nghttp3_qpack_read_state *rstate) { if (rstate->dynamic) { return rstate->absidx < decoder->ctx.next_absidx && decoder->ctx.next_absidx - rstate->absidx - 1 < @@ -2819,6 +2820,7 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, int busy = 0; const nghttp3_mem *mem = decoder->ctx.mem; nghttp3_ssize nread; + size_t huff_declen; int rfin; if (decoder->ctx.bad) { @@ -2840,20 +2842,20 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, busy = 0; switch (decoder->state) { case NGHTTP3_QPACK_ES_STATE_OPCODE: - switch ((*p) & 0xe0) { - case 0x80: - case 0xa0: - case 0xc0: - case 0xe0: + switch ((*p) & 0xE0U) { + case 0x80U: + case 0xA0U: + case 0xC0U: + case 0xE0U: DEBUGF("qpack::decode: OPCODE_INSERT_INDEXED\n"); decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_INSERT_INDEXED; - decoder->rstate.dynamic = !((*p) & 0x40); + decoder->rstate.dynamic = !((*p) & 0x40U); decoder->rstate.prefix = 6; decoder->state = NGHTTP3_QPACK_ES_STATE_READ_INDEX; break; - case 0x40: - case 0x60: + case 0x40U: + case 0x60U: DEBUGF("qpack::decode: OPCODE_INSERT\n"); decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_INSERT; decoder->rstate.dynamic = 0; @@ -2861,7 +2863,7 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, decoder->state = NGHTTP3_QPACK_ES_STATE_CHECK_NAME_HUFFMAN; break; - case 0x20: + case 0x20U: DEBUGF("qpack::decode: OPCODE_SET_DTABLE_TABLE_CAP\n"); decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_SET_DTABLE_CAP; decoder->rstate.prefix = 5; @@ -2957,10 +2959,16 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, } if (decoder->rstate.huffman_encoded) { + huff_declen = nghttp3_qpack_huffman_estimate_decode_length( + (size_t)decoder->rstate.left); + if (huff_declen > NGHTTP3_QPACK_MAX_NAMELEN) { + rv = NGHTTP3_ERR_QPACK_HEADER_TOO_LARGE; + goto fail; + } + decoder->state = NGHTTP3_QPACK_ES_STATE_READ_NAME_HUFFMAN; nghttp3_qpack_huffman_decode_context_init(&decoder->rstate.huffman_ctx); - rv = nghttp3_rcbuf_new(&decoder->rstate.name, - (size_t)decoder->rstate.left * 2 + 1, mem); + rv = nghttp3_rcbuf_new(&decoder->rstate.name, huff_declen + 1, mem); } else { decoder->state = NGHTTP3_QPACK_ES_STATE_READ_NAME; rv = nghttp3_rcbuf_new(&decoder->rstate.name, @@ -3039,10 +3047,16 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, } if (decoder->rstate.huffman_encoded) { + huff_declen = nghttp3_qpack_huffman_estimate_decode_length( + (size_t)decoder->rstate.left); + if (huff_declen > NGHTTP3_QPACK_MAX_VALUELEN) { + rv = NGHTTP3_ERR_QPACK_HEADER_TOO_LARGE; + goto fail; + } + decoder->state = NGHTTP3_QPACK_ES_STATE_READ_VALUE_HUFFMAN; nghttp3_qpack_huffman_decode_context_init(&decoder->rstate.huffman_ctx); - rv = nghttp3_rcbuf_new(&decoder->rstate.value, - (size_t)decoder->rstate.left * 2 + 1, mem); + rv = nghttp3_rcbuf_new(&decoder->rstate.value, huff_declen + 1, mem); } else { decoder->state = NGHTTP3_QPACK_ES_STATE_READ_VALUE; rv = nghttp3_rcbuf_new(&decoder->rstate.value, @@ -3288,7 +3302,7 @@ int nghttp3_qpack_decoder_dtable_literal_add(nghttp3_qpack_decoder *decoder) { void nghttp3_qpack_decoder_set_max_concurrent_streams( nghttp3_qpack_decoder *decoder, size_t max_concurrent_streams) { decoder->max_concurrent_streams = - nghttp3_max_size(decoder->max_concurrent_streams, max_concurrent_streams); + nghttp3_max(decoder->max_concurrent_streams, max_concurrent_streams); } void nghttp3_qpack_stream_context_init(nghttp3_qpack_stream_context *sctx, @@ -3316,6 +3330,11 @@ void nghttp3_qpack_stream_context_reset(nghttp3_qpack_stream_context *sctx) { uint64_t nghttp3_qpack_stream_context_get_ricnt(nghttp3_qpack_stream_context *sctx) { + return nghttp3_qpack_stream_context_get_ricnt2(sctx); +} + +uint64_t nghttp3_qpack_stream_context_get_ricnt2( + const nghttp3_qpack_stream_context *sctx) { return sctx->ricnt; } @@ -3330,6 +3349,7 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, nghttp3_ssize nread; int rfin; const nghttp3_mem *mem = decoder->ctx.mem; + size_t huff_declen; if (decoder->ctx.bad) { return NGHTTP3_ERR_QPACK_FATAL; @@ -3363,7 +3383,7 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, sctx->state = NGHTTP3_QPACK_RS_STATE_DBASE_SIGN; break; case NGHTTP3_QPACK_RS_STATE_DBASE_SIGN: - if ((*p) & 0x80) { + if ((*p) & 0x80U) { sctx->dbase_sign = 1; } sctx->state = NGHTTP3_QPACK_RS_STATE_DBASE; @@ -3413,45 +3433,45 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, case NGHTTP3_QPACK_RS_STATE_OPCODE: assert(sctx->rstate.left == 0); assert(sctx->rstate.shift == 0); - switch ((*p) & 0xf0) { - case 0x80: - case 0x90: - case 0xa0: - case 0xb0: - case 0xc0: - case 0xd0: - case 0xe0: - case 0xf0: + switch ((*p) & 0xF0U) { + case 0x80U: + case 0x90U: + case 0xA0U: + case 0xB0U: + case 0xC0U: + case 0xD0U: + case 0xE0U: + case 0xF0U: DEBUGF("qpack::decode: OPCODE_INDEXED\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_INDEXED; - sctx->rstate.dynamic = !((*p) & 0x40); + sctx->rstate.dynamic = !((*p) & 0x40U); sctx->rstate.prefix = 6; sctx->state = NGHTTP3_QPACK_RS_STATE_READ_INDEX; break; - case 0x40: - case 0x50: - case 0x60: - case 0x70: + case 0x40U: + case 0x50U: + case 0x60U: + case 0x70U: DEBUGF("qpack::decode: OPCODE_INDEXED_NAME\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_INDEXED_NAME; - sctx->rstate.never = (*p) & 0x20; - sctx->rstate.dynamic = !((*p) & 0x10); + sctx->rstate.never = (*p) & 0x20U; + sctx->rstate.dynamic = !((*p) & 0x10U); sctx->rstate.prefix = 4; sctx->state = NGHTTP3_QPACK_RS_STATE_READ_INDEX; break; - case 0x20: - case 0x30: + case 0x20U: + case 0x30U: DEBUGF("qpack::decode: OPCODE_LITERAL\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_LITERAL; - sctx->rstate.never = (*p) & 0x10; + sctx->rstate.never = (*p) & 0x10U; sctx->rstate.dynamic = 0; sctx->rstate.prefix = 3; sctx->state = NGHTTP3_QPACK_RS_STATE_CHECK_NAME_HUFFMAN; break; - case 0x10: + case 0x10U: DEBUGF("qpack::decode: OPCODE_INDEXED_PB\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_INDEXED_PB; sctx->rstate.dynamic = 1; @@ -3462,7 +3482,7 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, default: DEBUGF("qpack::decode: OPCODE_INDEXED_NAME_PB\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_INDEXED_NAME_PB; - sctx->rstate.never = (*p) & 0x08; + sctx->rstate.never = (*p) & 0x08U; sctx->rstate.dynamic = 1; sctx->rstate.prefix = 3; sctx->state = NGHTTP3_QPACK_RS_STATE_READ_INDEX; @@ -3553,10 +3573,16 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, } if (sctx->rstate.huffman_encoded) { + huff_declen = nghttp3_qpack_huffman_estimate_decode_length( + (size_t)sctx->rstate.left); + if (huff_declen > NGHTTP3_QPACK_MAX_NAMELEN) { + rv = NGHTTP3_ERR_QPACK_HEADER_TOO_LARGE; + goto fail; + } + sctx->state = NGHTTP3_QPACK_RS_STATE_READ_NAME_HUFFMAN; nghttp3_qpack_huffman_decode_context_init(&sctx->rstate.huffman_ctx); - rv = nghttp3_rcbuf_new(&sctx->rstate.name, - (size_t)sctx->rstate.left * 2 + 1, mem); + rv = nghttp3_rcbuf_new(&sctx->rstate.name, huff_declen + 1, mem); } else { sctx->state = NGHTTP3_QPACK_RS_STATE_READ_NAME; rv = nghttp3_rcbuf_new(&sctx->rstate.name, @@ -3633,10 +3659,16 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, } if (sctx->rstate.huffman_encoded) { + huff_declen = nghttp3_qpack_huffman_estimate_decode_length( + (size_t)sctx->rstate.left); + if (huff_declen > NGHTTP3_QPACK_MAX_VALUELEN) { + rv = NGHTTP3_ERR_QPACK_HEADER_TOO_LARGE; + goto fail; + } + sctx->state = NGHTTP3_QPACK_RS_STATE_READ_VALUE_HUFFMAN; nghttp3_qpack_huffman_decode_context_init(&sctx->rstate.huffman_ctx); - rv = nghttp3_rcbuf_new(&sctx->rstate.value, - (size_t)sctx->rstate.left * 2 + 1, mem); + rv = nghttp3_rcbuf_new(&sctx->rstate.value, huff_declen + 1, mem); } else { sctx->state = NGHTTP3_QPACK_RS_STATE_READ_VALUE; rv = nghttp3_rcbuf_new(&sctx->rstate.value, @@ -3766,8 +3798,8 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, return rv; } -static int qpack_decoder_dbuf_overflow(nghttp3_qpack_decoder *decoder) { - size_t limit = nghttp3_max_size(decoder->max_concurrent_streams, 100); +static int qpack_decoder_dbuf_overflow(const nghttp3_qpack_decoder *decoder) { + size_t limit = nghttp3_max(decoder->max_concurrent_streams, 100); /* 10 = nghttp3_qpack_put_varint_len((1ULL << 62) - 1, 2)) */ return nghttp3_buf_len(&decoder->dbuf) > limit * 2 * 10; } @@ -3790,7 +3822,7 @@ int nghttp3_qpack_decoder_write_section_ack( } p = dbuf->last; - *p = 0x80; + *p = 0x80U; dbuf->last = nghttp3_qpack_put_varint(p, (uint64_t)sctx->stream_id, 7); if (decoder->written_icnt < sctx->ricnt) { @@ -3802,6 +3834,11 @@ int nghttp3_qpack_decoder_write_section_ack( size_t nghttp3_qpack_decoder_get_decoder_streamlen(nghttp3_qpack_decoder *decoder) { + return nghttp3_qpack_decoder_get_decoder_streamlen2(decoder); +} + +size_t nghttp3_qpack_decoder_get_decoder_streamlen2( + const nghttp3_qpack_decoder *decoder) { uint64_t n; size_t len = 0; @@ -3863,14 +3900,14 @@ int nghttp3_qpack_decoder_cancel_stream(nghttp3_qpack_decoder *decoder, } p = decoder->dbuf.last; - *p = 0x40; + *p = 0x40U; decoder->dbuf.last = nghttp3_qpack_put_varint(p, (uint64_t)stream_id, 6); return 0; } -int nghttp3_qpack_decoder_reconstruct_ricnt(nghttp3_qpack_decoder *decoder, - uint64_t *dest, uint64_t encricnt) { +int nghttp3_qpack_decoder_reconstruct_ricnt( + const nghttp3_qpack_decoder *decoder, uint64_t *dest, uint64_t encricnt) { uint64_t max_ents, full, max, max_wrapped, ricnt; if (encricnt == 0) { @@ -3906,7 +3943,7 @@ int nghttp3_qpack_decoder_reconstruct_ricnt(nghttp3_qpack_decoder *decoder, return 0; } -int nghttp3_qpack_decoder_rel2abs(nghttp3_qpack_decoder *decoder, +int nghttp3_qpack_decoder_rel2abs(const nghttp3_qpack_decoder *decoder, nghttp3_qpack_read_state *rstate) { DEBUGF("qpack::decode: dynamic=%d relidx=%" PRIu64 " icnt=%" PRIu64 "\n", rstate->dynamic, rstate->left, decoder->ctx.next_absidx); @@ -3925,7 +3962,7 @@ int nghttp3_qpack_decoder_rel2abs(nghttp3_qpack_decoder *decoder, return 0; } -int nghttp3_qpack_decoder_brel2abs(nghttp3_qpack_decoder *decoder, +int nghttp3_qpack_decoder_brel2abs(const nghttp3_qpack_decoder *decoder, nghttp3_qpack_stream_context *sctx) { nghttp3_qpack_read_state *rstate = &sctx->rstate; @@ -3952,7 +3989,7 @@ int nghttp3_qpack_decoder_brel2abs(nghttp3_qpack_decoder *decoder, return 0; } -int nghttp3_qpack_decoder_pbrel2abs(nghttp3_qpack_decoder *decoder, +int nghttp3_qpack_decoder_pbrel2abs(const nghttp3_qpack_decoder *decoder, nghttp3_qpack_stream_context *sctx) { nghttp3_qpack_read_state *rstate = &sctx->rstate; @@ -3974,8 +4011,8 @@ int nghttp3_qpack_decoder_pbrel2abs(nghttp3_qpack_decoder *decoder, } static void -qpack_decoder_emit_static_indexed(nghttp3_qpack_decoder *decoder, - nghttp3_qpack_stream_context *sctx, +qpack_decoder_emit_static_indexed(const nghttp3_qpack_decoder *decoder, + const nghttp3_qpack_stream_context *sctx, nghttp3_qpack_nv *nv) { const nghttp3_qpack_static_header *shd = &stable[sctx->rstate.absidx]; (void)decoder; @@ -3988,7 +4025,7 @@ qpack_decoder_emit_static_indexed(nghttp3_qpack_decoder *decoder, static void qpack_decoder_emit_dynamic_indexed(nghttp3_qpack_decoder *decoder, - nghttp3_qpack_stream_context *sctx, + const nghttp3_qpack_stream_context *sctx, nghttp3_qpack_nv *nv) { nghttp3_qpack_entry *ent = nghttp3_qpack_context_dtable_get(&decoder->ctx, sctx->rstate.absidx); @@ -3999,9 +4036,9 @@ qpack_decoder_emit_dynamic_indexed(nghttp3_qpack_decoder *decoder, nghttp3_rcbuf_incref(nv->value); } -void nghttp3_qpack_decoder_emit_indexed(nghttp3_qpack_decoder *decoder, - nghttp3_qpack_stream_context *sctx, - nghttp3_qpack_nv *nv) { +void nghttp3_qpack_decoder_emit_indexed( + nghttp3_qpack_decoder *decoder, const nghttp3_qpack_stream_context *sctx, + nghttp3_qpack_nv *nv) { DEBUGF("qpack::decode: Indexed (%s) absidx=%" PRIu64 "\n", sctx->rstate.dynamic ? "dynamic" : "static", sctx->rstate.absidx); @@ -4013,7 +4050,7 @@ void nghttp3_qpack_decoder_emit_indexed(nghttp3_qpack_decoder *decoder, } static void -qpack_decoder_emit_static_indexed_name(nghttp3_qpack_decoder *decoder, +qpack_decoder_emit_static_indexed_name(const nghttp3_qpack_decoder *decoder, nghttp3_qpack_stream_context *sctx, nghttp3_qpack_nv *nv) { const nghttp3_qpack_static_header *shd = &stable[sctx->rstate.absidx]; @@ -4073,7 +4110,7 @@ int nghttp3_qpack_decoder_emit_indexed_name(nghttp3_qpack_decoder *decoder, return 0; } -void nghttp3_qpack_decoder_emit_literal(nghttp3_qpack_decoder *decoder, +void nghttp3_qpack_decoder_emit_literal(const nghttp3_qpack_decoder *decoder, nghttp3_qpack_stream_context *sctx, nghttp3_qpack_nv *nv) { (void)decoder; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.h b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.h index 1c13849a8aa5..934cae77c1bf 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.h @@ -40,13 +40,13 @@ #include "nghttp3_ksl.h" #include "nghttp3_qpack_huffman.h" -#define NGHTTP3_QPACK_INT_MAX ((1ull << 62) - 1) +#define NGHTTP3_QPACK_INT_MAX ((1ULL << 62) - 1) -/* NGHTTP3_QPACK_MAX_NAMELEN is the maximum (compressed) length of - header name this library can decode. */ +/* NGHTTP3_QPACK_MAX_NAMELEN is the maximum (estimated uncompressed) + length of header name this library can decode. */ #define NGHTTP3_QPACK_MAX_NAMELEN 256 -/* NGHTTP3_QPACK_MAX_VALUELEN is the maximum (compressed) length of - header value this library can decode. */ +/* NGHTTP3_QPACK_MAX_VALUELEN is the maximum (estimated uncompressed) + length of header value this library can decode. */ #define NGHTTP3_QPACK_MAX_VALUELEN 65536 /* NGHTTP3_QPACK_MAX_ENCODERLEN is the maximum encoder stream length that a decoder accepts without completely processing a single field @@ -223,10 +223,10 @@ typedef enum nghttp3_qpack_decoder_stream_opcode { /* QPACK encoder flags */ /* NGHTTP3_QPACK_ENCODER_FLAG_NONE indicates that no flag is set. */ -#define NGHTTP3_QPACK_ENCODER_FLAG_NONE 0x00u +#define NGHTTP3_QPACK_ENCODER_FLAG_NONE 0x00U /* NGHTTP3_QPACK_ENCODER_FLAG_PENDING_SET_DTABLE_CAP indicates that Set Dynamic Table Capacity is required. */ -#define NGHTTP3_QPACK_ENCODER_FLAG_PENDING_SET_DTABLE_CAP 0x01u +#define NGHTTP3_QPACK_ENCODER_FLAG_PENDING_SET_DTABLE_CAP 0x01U struct nghttp3_qpack_encoder { nghttp3_qpack_context ctx; @@ -350,7 +350,7 @@ nghttp3_qpack_lookup_result nghttp3_qpack_encoder_lookup_dtable( * Out of memory. */ int nghttp3_qpack_encoder_write_field_section_prefix( - nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, uint64_t ricnt, + const nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, uint64_t ricnt, uint64_t base); /* @@ -363,9 +363,8 @@ int nghttp3_qpack_encoder_write_field_section_prefix( * NGHTTP3_ERR_NOMEM * Out of memory. */ -int nghttp3_qpack_encoder_write_static_indexed(nghttp3_qpack_encoder *encoder, - nghttp3_buf *rbuf, - uint64_t absidx); +int nghttp3_qpack_encoder_write_static_indexed( + const nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx); /* * nghttp3_qpack_encoder_write_dynamic_indexed writes Indexed Header @@ -378,9 +377,9 @@ int nghttp3_qpack_encoder_write_static_indexed(nghttp3_qpack_encoder *encoder, * NGHTTP3_ERR_NOMEM * Out of memory. */ -int nghttp3_qpack_encoder_write_dynamic_indexed(nghttp3_qpack_encoder *encoder, - nghttp3_buf *rbuf, - uint64_t absidx, uint64_t base); +int nghttp3_qpack_encoder_write_dynamic_indexed( + const nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, + uint64_t base); /* * nghttp3_qpack_encoder_write_static_indexed writes Literal Header @@ -395,7 +394,7 @@ int nghttp3_qpack_encoder_write_dynamic_indexed(nghttp3_qpack_encoder *encoder, * Out of memory. */ int nghttp3_qpack_encoder_write_static_indexed_name( - nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, + const nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, const nghttp3_nv *nv); /* @@ -411,7 +410,7 @@ int nghttp3_qpack_encoder_write_static_indexed_name( * Out of memory. */ int nghttp3_qpack_encoder_write_dynamic_indexed_name( - nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, + const nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, uint64_t base, const nghttp3_nv *nv); /* @@ -424,7 +423,7 @@ int nghttp3_qpack_encoder_write_dynamic_indexed_name( * NGHTTP3_ERR_NOMEM * Out of memory. */ -int nghttp3_qpack_encoder_write_literal(nghttp3_qpack_encoder *encoder, +int nghttp3_qpack_encoder_write_literal(const nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, const nghttp3_nv *nv); @@ -439,10 +438,9 @@ int nghttp3_qpack_encoder_write_literal(nghttp3_qpack_encoder *encoder, * NGHTTP3_ERR_NOMEM * Out of memory. */ -int nghttp3_qpack_encoder_write_static_insert(nghttp3_qpack_encoder *encoder, - nghttp3_buf *ebuf, - uint64_t absidx, - const nghttp3_nv *nv); +int nghttp3_qpack_encoder_write_static_insert( + const nghttp3_qpack_encoder *encoder, nghttp3_buf *ebuf, uint64_t absidx, + const nghttp3_nv *nv); /* * nghttp3_qpack_encoder_write_dynamic_insert writes Insert With Name @@ -455,10 +453,9 @@ int nghttp3_qpack_encoder_write_static_insert(nghttp3_qpack_encoder *encoder, * NGHTTP3_ERR_NOMEM * Out of memory. */ -int nghttp3_qpack_encoder_write_dynamic_insert(nghttp3_qpack_encoder *encoder, - nghttp3_buf *ebuf, - uint64_t absidx, - const nghttp3_nv *nv); +int nghttp3_qpack_encoder_write_dynamic_insert( + const nghttp3_qpack_encoder *encoder, nghttp3_buf *ebuf, uint64_t absidx, + const nghttp3_nv *nv); /* * nghttp3_qpack_encoder_write_duplicate_insert writes Duplicate to @@ -471,9 +468,8 @@ int nghttp3_qpack_encoder_write_dynamic_insert(nghttp3_qpack_encoder *encoder, * NGHTTP3_ERR_NOMEM * Out of memory. */ -int nghttp3_qpack_encoder_write_duplicate_insert(nghttp3_qpack_encoder *encoder, - nghttp3_buf *ebuf, - uint64_t absidx); +int nghttp3_qpack_encoder_write_duplicate_insert( + const nghttp3_qpack_encoder *encoder, nghttp3_buf *ebuf, uint64_t absidx); /* * nghttp3_qpack_encoder_write_literal_insert writes Insert With @@ -485,12 +481,12 @@ int nghttp3_qpack_encoder_write_duplicate_insert(nghttp3_qpack_encoder *encoder, * NGHTTP3_ERR_NOMEM * Out of memory. */ -int nghttp3_qpack_encoder_write_literal_insert(nghttp3_qpack_encoder *encoder, - nghttp3_buf *ebuf, - const nghttp3_nv *nv); +int nghttp3_qpack_encoder_write_literal_insert( + const nghttp3_qpack_encoder *encoder, nghttp3_buf *ebuf, + const nghttp3_nv *nv); -int nghttp3_qpack_encoder_stream_is_blocked(nghttp3_qpack_encoder *encoder, - nghttp3_qpack_stream *stream); +int nghttp3_qpack_encoder_stream_is_blocked( + const nghttp3_qpack_encoder *encoder, const nghttp3_qpack_stream *stream); /* * nghttp3_qpack_encoder_block_stream blocks |stream|. @@ -523,10 +519,11 @@ void nghttp3_qpack_encoder_unblock(nghttp3_qpack_encoder *encoder, * stream. */ nghttp3_qpack_stream * -nghttp3_qpack_encoder_find_stream(nghttp3_qpack_encoder *encoder, +nghttp3_qpack_encoder_find_stream(const nghttp3_qpack_encoder *encoder, int64_t stream_id); -uint64_t nghttp3_qpack_encoder_get_min_cnt(nghttp3_qpack_encoder *encoder); +uint64_t +nghttp3_qpack_encoder_get_min_cnt(const nghttp3_qpack_encoder *encoder); /* * nghttp3_qpack_encoder_shrink_dtable shrinks dynamic table so that @@ -927,8 +924,8 @@ void nghttp3_qpack_stream_context_free(nghttp3_qpack_stream_context *sctx); * NGHTTP3_ERR_QPACK_DECOMPRESSION_FAILED * Unable to reconstruct Required Insert Count. */ -int nghttp3_qpack_decoder_reconstruct_ricnt(nghttp3_qpack_decoder *decoder, - uint64_t *dest, uint64_t encricnt); +int nghttp3_qpack_decoder_reconstruct_ricnt( + const nghttp3_qpack_decoder *decoder, uint64_t *dest, uint64_t encricnt); /* * nghttp3_qpack_decoder_rel2abs converts relative index rstate->left @@ -941,7 +938,7 @@ int nghttp3_qpack_decoder_reconstruct_ricnt(nghttp3_qpack_decoder *decoder, * NGHTTP3_ERR_QPACK_ENCODER_STREAM * Relative index is invalid. */ -int nghttp3_qpack_decoder_rel2abs(nghttp3_qpack_decoder *decoder, +int nghttp3_qpack_decoder_rel2abs(const nghttp3_qpack_decoder *decoder, nghttp3_qpack_read_state *rstate); /* @@ -955,7 +952,7 @@ int nghttp3_qpack_decoder_rel2abs(nghttp3_qpack_decoder *decoder, * NGHTTP3_ERR_QPACK_DECOMPRESSION_FAILED * Base relative index is invalid. */ -int nghttp3_qpack_decoder_brel2abs(nghttp3_qpack_decoder *decoder, +int nghttp3_qpack_decoder_brel2abs(const nghttp3_qpack_decoder *decoder, nghttp3_qpack_stream_context *sctx); /* @@ -969,18 +966,18 @@ int nghttp3_qpack_decoder_brel2abs(nghttp3_qpack_decoder *decoder, * NGHTTP3_ERR_QPACK_DECOMPRESSION_FAILED * Post-Base relative index is invalid. */ -int nghttp3_qpack_decoder_pbrel2abs(nghttp3_qpack_decoder *decoder, +int nghttp3_qpack_decoder_pbrel2abs(const nghttp3_qpack_decoder *decoder, nghttp3_qpack_stream_context *sctx); -void nghttp3_qpack_decoder_emit_indexed(nghttp3_qpack_decoder *decoder, - nghttp3_qpack_stream_context *sctx, - nghttp3_qpack_nv *nv); +void nghttp3_qpack_decoder_emit_indexed( + nghttp3_qpack_decoder *decoder, const nghttp3_qpack_stream_context *sctx, + nghttp3_qpack_nv *nv); int nghttp3_qpack_decoder_emit_indexed_name(nghttp3_qpack_decoder *decoder, nghttp3_qpack_stream_context *sctx, nghttp3_qpack_nv *nv); -void nghttp3_qpack_decoder_emit_literal(nghttp3_qpack_decoder *decoder, +void nghttp3_qpack_decoder_emit_literal(const nghttp3_qpack_decoder *decoder, nghttp3_qpack_stream_context *sctx, nghttp3_qpack_nv *nv); diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c index 8b9b6a451b60..618e95cc4ee2 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c @@ -80,7 +80,7 @@ uint8_t *nghttp3_qpack_huffman_encode(uint8_t *dest, const uint8_t *src, void nghttp3_qpack_huffman_decode_context_init( nghttp3_qpack_huffman_decode_context *ctx) { *ctx = (nghttp3_qpack_huffman_decode_context){ - .flags = NGHTTP3_QPACK_HUFFMAN_ACCEPTED, + .flags = NGHTTP3_QPACK_HUFFMAN_FLAG_ACCEPTED, }; } @@ -103,12 +103,12 @@ nghttp3_qpack_huffman_decode(nghttp3_qpack_huffman_decode_context *ctx, for (; src != end;) { c = *src++; t = qpack_huffman_decode_table[t.fstate][c >> 4]; - if (t.flags & NGHTTP3_QPACK_HUFFMAN_SYM) { + if (t.flags & NGHTTP3_QPACK_HUFFMAN_FLAG_SYM) { *p++ = t.sym; } - t = qpack_huffman_decode_table[t.fstate][c & 0xf]; - if (t.flags & NGHTTP3_QPACK_HUFFMAN_SYM) { + t = qpack_huffman_decode_table[t.fstate][c & 0xFU]; + if (t.flags & NGHTTP3_QPACK_HUFFMAN_FLAG_SYM) { *p++ = t.sym; } } @@ -116,7 +116,7 @@ nghttp3_qpack_huffman_decode(nghttp3_qpack_huffman_decode_context *ctx, ctx->fstate = t.fstate; ctx->flags = t.flags; - if (fin && !(ctx->flags & NGHTTP3_QPACK_HUFFMAN_ACCEPTED)) { + if (fin && !(ctx->flags & NGHTTP3_QPACK_HUFFMAN_FLAG_ACCEPTED)) { return NGHTTP3_ERR_QPACK_FATAL; } @@ -124,6 +124,6 @@ nghttp3_qpack_huffman_decode(nghttp3_qpack_huffman_decode_context *ctx, } int nghttp3_qpack_huffman_decode_failure_state( - nghttp3_qpack_huffman_decode_context *ctx) { - return ctx->fstate == 0x100; + const nghttp3_qpack_huffman_decode_context *ctx) { + return ctx->fstate == 0x100U; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h index aa2621795211..a7d788dcb964 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h @@ -46,25 +46,24 @@ size_t nghttp3_qpack_huffman_encode_count(const uint8_t *src, size_t len); uint8_t *nghttp3_qpack_huffman_encode(uint8_t *dest, const uint8_t *src, size_t srclen); -typedef enum nghttp3_qpack_huffman_decode_flag { - /* FSA accepts this state as the end of huffman encoding - sequence. */ - NGHTTP3_QPACK_HUFFMAN_ACCEPTED = 1, - /* This state emits symbol */ - NGHTTP3_QPACK_HUFFMAN_SYM = 1 << 1, -} nghttp3_qpack_huffman_decode_flag; +/* NGHTTP3_QPACK_HUFFMAN_FLAG_ACCEPTED indicates that FSA accepts this + state as the end of huffman encoding sequence. */ +#define NGHTTP3_QPACK_HUFFMAN_FLAG_ACCEPTED 0x01U +/* NGHTTP3_QPACK_HUFFMAN_FLAG_SYM indicates that this state emits + symbol */ +#define NGHTTP3_QPACK_HUFFMAN_FLAG_SYM 0x02U typedef struct nghttp3_qpack_huffman_decode_node { /* fstate is the current huffman decoding state, which is actually the node ID of internal huffman tree with - nghttp3_qpack_huffman_decode_flag OR-ed. We have 257 leaf nodes, - but they are identical to root node other than emitting a symbol, - so we have 256 internal nodes [1..256], inclusive. The node ID - 256 is a special node and it is a terminal state that means - decoding failed. */ + NGHTTP3_QPACK_HUFFMAN_FLAG_* flags OR-ed. We have 257 leaf + nodes, but they are identical to root node other than emitting a + symbol, so we have 256 internal nodes [1..256], inclusive. The + node ID 256 is a special node and it is a terminal state that + means decoding failed. */ uint16_t fstate; uint8_t flags; - /* symbol if NGHTTP3_QPACK_HUFFMAN_SYM flag set */ + /* symbol if NGHTTP3_QPACK_HUFFMAN_FLAG_SYM flag set */ uint8_t sym; } nghttp3_qpack_huffman_decode_node; @@ -105,6 +104,14 @@ nghttp3_qpack_huffman_decode(nghttp3_qpack_huffman_decode_context *ctx, * indicates that huffman decoding context is in failure state. */ int nghttp3_qpack_huffman_decode_failure_state( - nghttp3_qpack_huffman_decode_context *ctx); + const nghttp3_qpack_huffman_decode_context *ctx); + +/* + * nghttp3_qpack_huffman_estimate_decode_length returns the estimated + * decoded length of the huffman encoded string of length |len|. + */ +static inline size_t nghttp3_qpack_huffman_estimate_decode_length(size_t len) { + return len * 8 / 5; +} #endif /* !defined(NGHTTP3_QPACK_HUFFMAN_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c index 9eae37eb3ea1..9a6614a15397 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c @@ -28,4954 +28,4955 @@ /* Generated by mkhufftbl.py */ const nghttp3_qpack_huffman_sym huffman_sym_table[] = { - {13, 0xffc00000u}, {23, 0xffffb000u}, {28, 0xfffffe20u}, {28, 0xfffffe30u}, - {28, 0xfffffe40u}, {28, 0xfffffe50u}, {28, 0xfffffe60u}, {28, 0xfffffe70u}, - {28, 0xfffffe80u}, {24, 0xffffea00u}, {30, 0xfffffff0u}, {28, 0xfffffe90u}, - {28, 0xfffffea0u}, {30, 0xfffffff4u}, {28, 0xfffffeb0u}, {28, 0xfffffec0u}, - {28, 0xfffffed0u}, {28, 0xfffffee0u}, {28, 0xfffffef0u}, {28, 0xffffff00u}, - {28, 0xffffff10u}, {28, 0xffffff20u}, {30, 0xfffffff8u}, {28, 0xffffff30u}, - {28, 0xffffff40u}, {28, 0xffffff50u}, {28, 0xffffff60u}, {28, 0xffffff70u}, - {28, 0xffffff80u}, {28, 0xffffff90u}, {28, 0xffffffa0u}, {28, 0xffffffb0u}, - {6, 0x50000000u}, {10, 0xfe000000u}, {10, 0xfe400000u}, {12, 0xffa00000u}, - {13, 0xffc80000u}, {6, 0x54000000u}, {8, 0xf8000000u}, {11, 0xff400000u}, - {10, 0xfe800000u}, {10, 0xfec00000u}, {8, 0xf9000000u}, {11, 0xff600000u}, - {8, 0xfa000000u}, {6, 0x58000000u}, {6, 0x5c000000u}, {6, 0x60000000u}, - {5, 0x0u}, {5, 0x8000000u}, {5, 0x10000000u}, {6, 0x64000000u}, - {6, 0x68000000u}, {6, 0x6c000000u}, {6, 0x70000000u}, {6, 0x74000000u}, - {6, 0x78000000u}, {6, 0x7c000000u}, {7, 0xb8000000u}, {8, 0xfb000000u}, - {15, 0xfff80000u}, {6, 0x80000000u}, {12, 0xffb00000u}, {10, 0xff000000u}, - {13, 0xffd00000u}, {6, 0x84000000u}, {7, 0xba000000u}, {7, 0xbc000000u}, - {7, 0xbe000000u}, {7, 0xc0000000u}, {7, 0xc2000000u}, {7, 0xc4000000u}, - {7, 0xc6000000u}, {7, 0xc8000000u}, {7, 0xca000000u}, {7, 0xcc000000u}, - {7, 0xce000000u}, {7, 0xd0000000u}, {7, 0xd2000000u}, {7, 0xd4000000u}, - {7, 0xd6000000u}, {7, 0xd8000000u}, {7, 0xda000000u}, {7, 0xdc000000u}, - {7, 0xde000000u}, {7, 0xe0000000u}, {7, 0xe2000000u}, {7, 0xe4000000u}, - {8, 0xfc000000u}, {7, 0xe6000000u}, {8, 0xfd000000u}, {13, 0xffd80000u}, - {19, 0xfffe0000u}, {13, 0xffe00000u}, {14, 0xfff00000u}, {6, 0x88000000u}, - {15, 0xfffa0000u}, {5, 0x18000000u}, {6, 0x8c000000u}, {5, 0x20000000u}, - {6, 0x90000000u}, {5, 0x28000000u}, {6, 0x94000000u}, {6, 0x98000000u}, - {6, 0x9c000000u}, {5, 0x30000000u}, {7, 0xe8000000u}, {7, 0xea000000u}, - {6, 0xa0000000u}, {6, 0xa4000000u}, {6, 0xa8000000u}, {5, 0x38000000u}, - {6, 0xac000000u}, {7, 0xec000000u}, {6, 0xb0000000u}, {5, 0x40000000u}, - {5, 0x48000000u}, {6, 0xb4000000u}, {7, 0xee000000u}, {7, 0xf0000000u}, - {7, 0xf2000000u}, {7, 0xf4000000u}, {7, 0xf6000000u}, {15, 0xfffc0000u}, - {11, 0xff800000u}, {14, 0xfff40000u}, {13, 0xffe80000u}, {28, 0xffffffc0u}, - {20, 0xfffe6000u}, {22, 0xffff4800u}, {20, 0xfffe7000u}, {20, 0xfffe8000u}, - {22, 0xffff4c00u}, {22, 0xffff5000u}, {22, 0xffff5400u}, {23, 0xffffb200u}, - {22, 0xffff5800u}, {23, 0xffffb400u}, {23, 0xffffb600u}, {23, 0xffffb800u}, - {23, 0xffffba00u}, {23, 0xffffbc00u}, {24, 0xffffeb00u}, {23, 0xffffbe00u}, - {24, 0xffffec00u}, {24, 0xffffed00u}, {22, 0xffff5c00u}, {23, 0xffffc000u}, - {24, 0xffffee00u}, {23, 0xffffc200u}, {23, 0xffffc400u}, {23, 0xffffc600u}, - {23, 0xffffc800u}, {21, 0xfffee000u}, {22, 0xffff6000u}, {23, 0xffffca00u}, - {22, 0xffff6400u}, {23, 0xffffcc00u}, {23, 0xffffce00u}, {24, 0xffffef00u}, - {22, 0xffff6800u}, {21, 0xfffee800u}, {20, 0xfffe9000u}, {22, 0xffff6c00u}, - {22, 0xffff7000u}, {23, 0xffffd000u}, {23, 0xffffd200u}, {21, 0xfffef000u}, - {23, 0xffffd400u}, {22, 0xffff7400u}, {22, 0xffff7800u}, {24, 0xfffff000u}, - {21, 0xfffef800u}, {22, 0xffff7c00u}, {23, 0xffffd600u}, {23, 0xffffd800u}, - {21, 0xffff0000u}, {21, 0xffff0800u}, {22, 0xffff8000u}, {21, 0xffff1000u}, - {23, 0xffffda00u}, {22, 0xffff8400u}, {23, 0xffffdc00u}, {23, 0xffffde00u}, - {20, 0xfffea000u}, {22, 0xffff8800u}, {22, 0xffff8c00u}, {22, 0xffff9000u}, - {23, 0xffffe000u}, {22, 0xffff9400u}, {22, 0xffff9800u}, {23, 0xffffe200u}, - {26, 0xfffff800u}, {26, 0xfffff840u}, {20, 0xfffeb000u}, {19, 0xfffe2000u}, - {22, 0xffff9c00u}, {23, 0xffffe400u}, {22, 0xffffa000u}, {25, 0xfffff600u}, - {26, 0xfffff880u}, {26, 0xfffff8c0u}, {26, 0xfffff900u}, {27, 0xfffffbc0u}, - {27, 0xfffffbe0u}, {26, 0xfffff940u}, {24, 0xfffff100u}, {25, 0xfffff680u}, - {19, 0xfffe4000u}, {21, 0xffff1800u}, {26, 0xfffff980u}, {27, 0xfffffc00u}, - {27, 0xfffffc20u}, {26, 0xfffff9c0u}, {27, 0xfffffc40u}, {24, 0xfffff200u}, - {21, 0xffff2000u}, {21, 0xffff2800u}, {26, 0xfffffa00u}, {26, 0xfffffa40u}, - {28, 0xffffffd0u}, {27, 0xfffffc60u}, {27, 0xfffffc80u}, {27, 0xfffffca0u}, - {20, 0xfffec000u}, {24, 0xfffff300u}, {20, 0xfffed000u}, {21, 0xffff3000u}, - {22, 0xffffa400u}, {21, 0xffff3800u}, {21, 0xffff4000u}, {23, 0xffffe600u}, - {22, 0xffffa800u}, {22, 0xffffac00u}, {25, 0xfffff700u}, {25, 0xfffff780u}, - {24, 0xfffff400u}, {24, 0xfffff500u}, {26, 0xfffffa80u}, {23, 0xffffe800u}, - {26, 0xfffffac0u}, {27, 0xfffffcc0u}, {26, 0xfffffb00u}, {26, 0xfffffb40u}, - {27, 0xfffffce0u}, {27, 0xfffffd00u}, {27, 0xfffffd20u}, {27, 0xfffffd40u}, - {27, 0xfffffd60u}, {28, 0xffffffe0u}, {27, 0xfffffd80u}, {27, 0xfffffda0u}, - {27, 0xfffffdc0u}, {27, 0xfffffde0u}, {27, 0xfffffe00u}, {26, 0xfffffb80u}, - {30, 0xfffffffcu}}; + {13, 0xFFC00000U}, {23, 0xFFFFB000U}, {28, 0xFFFFFE20U}, {28, 0xFFFFFE30U}, + {28, 0xFFFFFE40U}, {28, 0xFFFFFE50U}, {28, 0xFFFFFE60U}, {28, 0xFFFFFE70U}, + {28, 0xFFFFFE80U}, {24, 0xFFFFEA00U}, {30, 0xFFFFFFF0U}, {28, 0xFFFFFE90U}, + {28, 0xFFFFFEA0U}, {30, 0xFFFFFFF4U}, {28, 0xFFFFFEB0U}, {28, 0xFFFFFEC0U}, + {28, 0xFFFFFED0U}, {28, 0xFFFFFEE0U}, {28, 0xFFFFFEF0U}, {28, 0xFFFFFF00U}, + {28, 0xFFFFFF10U}, {28, 0xFFFFFF20U}, {30, 0xFFFFFFF8U}, {28, 0xFFFFFF30U}, + {28, 0xFFFFFF40U}, {28, 0xFFFFFF50U}, {28, 0xFFFFFF60U}, {28, 0xFFFFFF70U}, + {28, 0xFFFFFF80U}, {28, 0xFFFFFF90U}, {28, 0xFFFFFFA0U}, {28, 0xFFFFFFB0U}, + {6, 0x50000000U}, {10, 0xFE000000U}, {10, 0xFE400000U}, {12, 0xFFA00000U}, + {13, 0xFFC80000U}, {6, 0x54000000U}, {8, 0xF8000000U}, {11, 0xFF400000U}, + {10, 0xFE800000U}, {10, 0xFEC00000U}, {8, 0xF9000000U}, {11, 0xFF600000U}, + {8, 0xFA000000U}, {6, 0x58000000U}, {6, 0x5C000000U}, {6, 0x60000000U}, + {5, 0x0U}, {5, 0x8000000U}, {5, 0x10000000U}, {6, 0x64000000U}, + {6, 0x68000000U}, {6, 0x6C000000U}, {6, 0x70000000U}, {6, 0x74000000U}, + {6, 0x78000000U}, {6, 0x7C000000U}, {7, 0xB8000000U}, {8, 0xFB000000U}, + {15, 0xFFF80000U}, {6, 0x80000000U}, {12, 0xFFB00000U}, {10, 0xFF000000U}, + {13, 0xFFD00000U}, {6, 0x84000000U}, {7, 0xBA000000U}, {7, 0xBC000000U}, + {7, 0xBE000000U}, {7, 0xC0000000U}, {7, 0xC2000000U}, {7, 0xC4000000U}, + {7, 0xC6000000U}, {7, 0xC8000000U}, {7, 0xCA000000U}, {7, 0xCC000000U}, + {7, 0xCE000000U}, {7, 0xD0000000U}, {7, 0xD2000000U}, {7, 0xD4000000U}, + {7, 0xD6000000U}, {7, 0xD8000000U}, {7, 0xDA000000U}, {7, 0xDC000000U}, + {7, 0xDE000000U}, {7, 0xE0000000U}, {7, 0xE2000000U}, {7, 0xE4000000U}, + {8, 0xFC000000U}, {7, 0xE6000000U}, {8, 0xFD000000U}, {13, 0xFFD80000U}, + {19, 0xFFFE0000U}, {13, 0xFFE00000U}, {14, 0xFFF00000U}, {6, 0x88000000U}, + {15, 0xFFFA0000U}, {5, 0x18000000U}, {6, 0x8C000000U}, {5, 0x20000000U}, + {6, 0x90000000U}, {5, 0x28000000U}, {6, 0x94000000U}, {6, 0x98000000U}, + {6, 0x9C000000U}, {5, 0x30000000U}, {7, 0xE8000000U}, {7, 0xEA000000U}, + {6, 0xA0000000U}, {6, 0xA4000000U}, {6, 0xA8000000U}, {5, 0x38000000U}, + {6, 0xAC000000U}, {7, 0xEC000000U}, {6, 0xB0000000U}, {5, 0x40000000U}, + {5, 0x48000000U}, {6, 0xB4000000U}, {7, 0xEE000000U}, {7, 0xF0000000U}, + {7, 0xF2000000U}, {7, 0xF4000000U}, {7, 0xF6000000U}, {15, 0xFFFC0000U}, + {11, 0xFF800000U}, {14, 0xFFF40000U}, {13, 0xFFE80000U}, {28, 0xFFFFFFC0U}, + {20, 0xFFFE6000U}, {22, 0xFFFF4800U}, {20, 0xFFFE7000U}, {20, 0xFFFE8000U}, + {22, 0xFFFF4C00U}, {22, 0xFFFF5000U}, {22, 0xFFFF5400U}, {23, 0xFFFFB200U}, + {22, 0xFFFF5800U}, {23, 0xFFFFB400U}, {23, 0xFFFFB600U}, {23, 0xFFFFB800U}, + {23, 0xFFFFBA00U}, {23, 0xFFFFBC00U}, {24, 0xFFFFEB00U}, {23, 0xFFFFBE00U}, + {24, 0xFFFFEC00U}, {24, 0xFFFFED00U}, {22, 0xFFFF5C00U}, {23, 0xFFFFC000U}, + {24, 0xFFFFEE00U}, {23, 0xFFFFC200U}, {23, 0xFFFFC400U}, {23, 0xFFFFC600U}, + {23, 0xFFFFC800U}, {21, 0xFFFEE000U}, {22, 0xFFFF6000U}, {23, 0xFFFFCA00U}, + {22, 0xFFFF6400U}, {23, 0xFFFFCC00U}, {23, 0xFFFFCE00U}, {24, 0xFFFFEF00U}, + {22, 0xFFFF6800U}, {21, 0xFFFEE800U}, {20, 0xFFFE9000U}, {22, 0xFFFF6C00U}, + {22, 0xFFFF7000U}, {23, 0xFFFFD000U}, {23, 0xFFFFD200U}, {21, 0xFFFEF000U}, + {23, 0xFFFFD400U}, {22, 0xFFFF7400U}, {22, 0xFFFF7800U}, {24, 0xFFFFF000U}, + {21, 0xFFFEF800U}, {22, 0xFFFF7C00U}, {23, 0xFFFFD600U}, {23, 0xFFFFD800U}, + {21, 0xFFFF0000U}, {21, 0xFFFF0800U}, {22, 0xFFFF8000U}, {21, 0xFFFF1000U}, + {23, 0xFFFFDA00U}, {22, 0xFFFF8400U}, {23, 0xFFFFDC00U}, {23, 0xFFFFDE00U}, + {20, 0xFFFEA000U}, {22, 0xFFFF8800U}, {22, 0xFFFF8C00U}, {22, 0xFFFF9000U}, + {23, 0xFFFFE000U}, {22, 0xFFFF9400U}, {22, 0xFFFF9800U}, {23, 0xFFFFE200U}, + {26, 0xFFFFF800U}, {26, 0xFFFFF840U}, {20, 0xFFFEB000U}, {19, 0xFFFE2000U}, + {22, 0xFFFF9C00U}, {23, 0xFFFFE400U}, {22, 0xFFFFA000U}, {25, 0xFFFFF600U}, + {26, 0xFFFFF880U}, {26, 0xFFFFF8C0U}, {26, 0xFFFFF900U}, {27, 0xFFFFFBC0U}, + {27, 0xFFFFFBE0U}, {26, 0xFFFFF940U}, {24, 0xFFFFF100U}, {25, 0xFFFFF680U}, + {19, 0xFFFE4000U}, {21, 0xFFFF1800U}, {26, 0xFFFFF980U}, {27, 0xFFFFFC00U}, + {27, 0xFFFFFC20U}, {26, 0xFFFFF9C0U}, {27, 0xFFFFFC40U}, {24, 0xFFFFF200U}, + {21, 0xFFFF2000U}, {21, 0xFFFF2800U}, {26, 0xFFFFFA00U}, {26, 0xFFFFFA40U}, + {28, 0xFFFFFFD0U}, {27, 0xFFFFFC60U}, {27, 0xFFFFFC80U}, {27, 0xFFFFFCA0U}, + {20, 0xFFFEC000U}, {24, 0xFFFFF300U}, {20, 0xFFFED000U}, {21, 0xFFFF3000U}, + {22, 0xFFFFA400U}, {21, 0xFFFF3800U}, {21, 0xFFFF4000U}, {23, 0xFFFFE600U}, + {22, 0xFFFFA800U}, {22, 0xFFFFAC00U}, {25, 0xFFFFF700U}, {25, 0xFFFFF780U}, + {24, 0xFFFFF400U}, {24, 0xFFFFF500U}, {26, 0xFFFFFA80U}, {23, 0xFFFFE800U}, + {26, 0xFFFFFAC0U}, {27, 0xFFFFFCC0U}, {26, 0xFFFFFB00U}, {26, 0xFFFFFB40U}, + {27, 0xFFFFFCE0U}, {27, 0xFFFFFD00U}, {27, 0xFFFFFD20U}, {27, 0xFFFFFD40U}, + {27, 0xFFFFFD60U}, {28, 0xFFFFFFE0U}, {27, 0xFFFFFD80U}, {27, 0xFFFFFDA0U}, + {27, 0xFFFFFDC0U}, {27, 0xFFFFFDE0U}, {27, 0xFFFFFE00U}, {26, 0xFFFFFB80U}, + {30, 0xFFFFFFFCU}, +}; const nghttp3_qpack_huffman_decode_node qpack_huffman_decode_table[][16] = { /* 0 */ { - {0x04, 0, 0}, - {0x05, 0, 0}, - {0x07, 0, 0}, - {0x08, 0, 0}, - {0x0b, 0, 0}, - {0x0c, 0, 0}, - {0x10, 0, 0}, - {0x13, 0, 0}, - {0x19, 0, 0}, - {0x1c, 0, 0}, - {0x20, 0, 0}, - {0x23, 0, 0}, - {0x2a, 0, 0}, - {0x31, 0, 0}, - {0x39, 0, 0}, - {0x40, 1, 0}, + {0x04, 0x00, 0x00}, + {0x05, 0x00, 0x00}, + {0x07, 0x00, 0x00}, + {0x08, 0x00, 0x00}, + {0x0B, 0x00, 0x00}, + {0x0C, 0x00, 0x00}, + {0x10, 0x00, 0x00}, + {0x13, 0x00, 0x00}, + {0x19, 0x00, 0x00}, + {0x1C, 0x00, 0x00}, + {0x20, 0x00, 0x00}, + {0x23, 0x00, 0x00}, + {0x2A, 0x00, 0x00}, + {0x31, 0x00, 0x00}, + {0x39, 0x00, 0x00}, + {0x40, 0x01, 0x00}, }, /* 1 */ { - {0x00, 3, 48}, - {0x00, 3, 49}, - {0x00, 3, 50}, - {0x00, 3, 97}, - {0x00, 3, 99}, - {0x00, 3, 101}, - {0x00, 3, 105}, - {0x00, 3, 111}, - {0x00, 3, 115}, - {0x00, 3, 116}, - {0x0d, 0, 0}, - {0x0e, 0, 0}, - {0x11, 0, 0}, - {0x12, 0, 0}, - {0x14, 0, 0}, - {0x15, 0, 0}, + {0x00, 0x03, 0x30}, + {0x00, 0x03, 0x31}, + {0x00, 0x03, 0x32}, + {0x00, 0x03, 0x61}, + {0x00, 0x03, 0x63}, + {0x00, 0x03, 0x65}, + {0x00, 0x03, 0x69}, + {0x00, 0x03, 0x6F}, + {0x00, 0x03, 0x73}, + {0x00, 0x03, 0x74}, + {0x0D, 0x00, 0x00}, + {0x0E, 0x00, 0x00}, + {0x11, 0x00, 0x00}, + {0x12, 0x00, 0x00}, + {0x14, 0x00, 0x00}, + {0x15, 0x00, 0x00}, }, /* 2 */ { - {0x01, 2, 48}, - {0x16, 3, 48}, - {0x01, 2, 49}, - {0x16, 3, 49}, - {0x01, 2, 50}, - {0x16, 3, 50}, - {0x01, 2, 97}, - {0x16, 3, 97}, - {0x01, 2, 99}, - {0x16, 3, 99}, - {0x01, 2, 101}, - {0x16, 3, 101}, - {0x01, 2, 105}, - {0x16, 3, 105}, - {0x01, 2, 111}, - {0x16, 3, 111}, + {0x01, 0x02, 0x30}, + {0x16, 0x03, 0x30}, + {0x01, 0x02, 0x31}, + {0x16, 0x03, 0x31}, + {0x01, 0x02, 0x32}, + {0x16, 0x03, 0x32}, + {0x01, 0x02, 0x61}, + {0x16, 0x03, 0x61}, + {0x01, 0x02, 0x63}, + {0x16, 0x03, 0x63}, + {0x01, 0x02, 0x65}, + {0x16, 0x03, 0x65}, + {0x01, 0x02, 0x69}, + {0x16, 0x03, 0x69}, + {0x01, 0x02, 0x6F}, + {0x16, 0x03, 0x6F}, }, /* 3 */ { - {0x02, 2, 48}, - {0x09, 2, 48}, - {0x17, 2, 48}, - {0x28, 3, 48}, - {0x02, 2, 49}, - {0x09, 2, 49}, - {0x17, 2, 49}, - {0x28, 3, 49}, - {0x02, 2, 50}, - {0x09, 2, 50}, - {0x17, 2, 50}, - {0x28, 3, 50}, - {0x02, 2, 97}, - {0x09, 2, 97}, - {0x17, 2, 97}, - {0x28, 3, 97}, + {0x02, 0x02, 0x30}, + {0x09, 0x02, 0x30}, + {0x17, 0x02, 0x30}, + {0x28, 0x03, 0x30}, + {0x02, 0x02, 0x31}, + {0x09, 0x02, 0x31}, + {0x17, 0x02, 0x31}, + {0x28, 0x03, 0x31}, + {0x02, 0x02, 0x32}, + {0x09, 0x02, 0x32}, + {0x17, 0x02, 0x32}, + {0x28, 0x03, 0x32}, + {0x02, 0x02, 0x61}, + {0x09, 0x02, 0x61}, + {0x17, 0x02, 0x61}, + {0x28, 0x03, 0x61}, }, /* 4 */ { - {0x03, 2, 48}, - {0x06, 2, 48}, - {0x0a, 2, 48}, - {0x0f, 2, 48}, - {0x18, 2, 48}, - {0x1f, 2, 48}, - {0x29, 2, 48}, - {0x38, 3, 48}, - {0x03, 2, 49}, - {0x06, 2, 49}, - {0x0a, 2, 49}, - {0x0f, 2, 49}, - {0x18, 2, 49}, - {0x1f, 2, 49}, - {0x29, 2, 49}, - {0x38, 3, 49}, + {0x03, 0x02, 0x30}, + {0x06, 0x02, 0x30}, + {0x0A, 0x02, 0x30}, + {0x0F, 0x02, 0x30}, + {0x18, 0x02, 0x30}, + {0x1F, 0x02, 0x30}, + {0x29, 0x02, 0x30}, + {0x38, 0x03, 0x30}, + {0x03, 0x02, 0x31}, + {0x06, 0x02, 0x31}, + {0x0A, 0x02, 0x31}, + {0x0F, 0x02, 0x31}, + {0x18, 0x02, 0x31}, + {0x1F, 0x02, 0x31}, + {0x29, 0x02, 0x31}, + {0x38, 0x03, 0x31}, }, /* 5 */ { - {0x03, 2, 50}, - {0x06, 2, 50}, - {0x0a, 2, 50}, - {0x0f, 2, 50}, - {0x18, 2, 50}, - {0x1f, 2, 50}, - {0x29, 2, 50}, - {0x38, 3, 50}, - {0x03, 2, 97}, - {0x06, 2, 97}, - {0x0a, 2, 97}, - {0x0f, 2, 97}, - {0x18, 2, 97}, - {0x1f, 2, 97}, - {0x29, 2, 97}, - {0x38, 3, 97}, + {0x03, 0x02, 0x32}, + {0x06, 0x02, 0x32}, + {0x0A, 0x02, 0x32}, + {0x0F, 0x02, 0x32}, + {0x18, 0x02, 0x32}, + {0x1F, 0x02, 0x32}, + {0x29, 0x02, 0x32}, + {0x38, 0x03, 0x32}, + {0x03, 0x02, 0x61}, + {0x06, 0x02, 0x61}, + {0x0A, 0x02, 0x61}, + {0x0F, 0x02, 0x61}, + {0x18, 0x02, 0x61}, + {0x1F, 0x02, 0x61}, + {0x29, 0x02, 0x61}, + {0x38, 0x03, 0x61}, }, /* 6 */ { - {0x02, 2, 99}, - {0x09, 2, 99}, - {0x17, 2, 99}, - {0x28, 3, 99}, - {0x02, 2, 101}, - {0x09, 2, 101}, - {0x17, 2, 101}, - {0x28, 3, 101}, - {0x02, 2, 105}, - {0x09, 2, 105}, - {0x17, 2, 105}, - {0x28, 3, 105}, - {0x02, 2, 111}, - {0x09, 2, 111}, - {0x17, 2, 111}, - {0x28, 3, 111}, + {0x02, 0x02, 0x63}, + {0x09, 0x02, 0x63}, + {0x17, 0x02, 0x63}, + {0x28, 0x03, 0x63}, + {0x02, 0x02, 0x65}, + {0x09, 0x02, 0x65}, + {0x17, 0x02, 0x65}, + {0x28, 0x03, 0x65}, + {0x02, 0x02, 0x69}, + {0x09, 0x02, 0x69}, + {0x17, 0x02, 0x69}, + {0x28, 0x03, 0x69}, + {0x02, 0x02, 0x6F}, + {0x09, 0x02, 0x6F}, + {0x17, 0x02, 0x6F}, + {0x28, 0x03, 0x6F}, }, /* 7 */ { - {0x03, 2, 99}, - {0x06, 2, 99}, - {0x0a, 2, 99}, - {0x0f, 2, 99}, - {0x18, 2, 99}, - {0x1f, 2, 99}, - {0x29, 2, 99}, - {0x38, 3, 99}, - {0x03, 2, 101}, - {0x06, 2, 101}, - {0x0a, 2, 101}, - {0x0f, 2, 101}, - {0x18, 2, 101}, - {0x1f, 2, 101}, - {0x29, 2, 101}, - {0x38, 3, 101}, + {0x03, 0x02, 0x63}, + {0x06, 0x02, 0x63}, + {0x0A, 0x02, 0x63}, + {0x0F, 0x02, 0x63}, + {0x18, 0x02, 0x63}, + {0x1F, 0x02, 0x63}, + {0x29, 0x02, 0x63}, + {0x38, 0x03, 0x63}, + {0x03, 0x02, 0x65}, + {0x06, 0x02, 0x65}, + {0x0A, 0x02, 0x65}, + {0x0F, 0x02, 0x65}, + {0x18, 0x02, 0x65}, + {0x1F, 0x02, 0x65}, + {0x29, 0x02, 0x65}, + {0x38, 0x03, 0x65}, }, /* 8 */ { - {0x03, 2, 105}, - {0x06, 2, 105}, - {0x0a, 2, 105}, - {0x0f, 2, 105}, - {0x18, 2, 105}, - {0x1f, 2, 105}, - {0x29, 2, 105}, - {0x38, 3, 105}, - {0x03, 2, 111}, - {0x06, 2, 111}, - {0x0a, 2, 111}, - {0x0f, 2, 111}, - {0x18, 2, 111}, - {0x1f, 2, 111}, - {0x29, 2, 111}, - {0x38, 3, 111}, + {0x03, 0x02, 0x69}, + {0x06, 0x02, 0x69}, + {0x0A, 0x02, 0x69}, + {0x0F, 0x02, 0x69}, + {0x18, 0x02, 0x69}, + {0x1F, 0x02, 0x69}, + {0x29, 0x02, 0x69}, + {0x38, 0x03, 0x69}, + {0x03, 0x02, 0x6F}, + {0x06, 0x02, 0x6F}, + {0x0A, 0x02, 0x6F}, + {0x0F, 0x02, 0x6F}, + {0x18, 0x02, 0x6F}, + {0x1F, 0x02, 0x6F}, + {0x29, 0x02, 0x6F}, + {0x38, 0x03, 0x6F}, }, /* 9 */ { - {0x01, 2, 115}, - {0x16, 3, 115}, - {0x01, 2, 116}, - {0x16, 3, 116}, - {0x00, 3, 32}, - {0x00, 3, 37}, - {0x00, 3, 45}, - {0x00, 3, 46}, - {0x00, 3, 47}, - {0x00, 3, 51}, - {0x00, 3, 52}, - {0x00, 3, 53}, - {0x00, 3, 54}, - {0x00, 3, 55}, - {0x00, 3, 56}, - {0x00, 3, 57}, + {0x01, 0x02, 0x73}, + {0x16, 0x03, 0x73}, + {0x01, 0x02, 0x74}, + {0x16, 0x03, 0x74}, + {0x00, 0x03, 0x20}, + {0x00, 0x03, 0x25}, + {0x00, 0x03, 0x2D}, + {0x00, 0x03, 0x2E}, + {0x00, 0x03, 0x2F}, + {0x00, 0x03, 0x33}, + {0x00, 0x03, 0x34}, + {0x00, 0x03, 0x35}, + {0x00, 0x03, 0x36}, + {0x00, 0x03, 0x37}, + {0x00, 0x03, 0x38}, + {0x00, 0x03, 0x39}, }, /* 10 */ { - {0x02, 2, 115}, - {0x09, 2, 115}, - {0x17, 2, 115}, - {0x28, 3, 115}, - {0x02, 2, 116}, - {0x09, 2, 116}, - {0x17, 2, 116}, - {0x28, 3, 116}, - {0x01, 2, 32}, - {0x16, 3, 32}, - {0x01, 2, 37}, - {0x16, 3, 37}, - {0x01, 2, 45}, - {0x16, 3, 45}, - {0x01, 2, 46}, - {0x16, 3, 46}, + {0x02, 0x02, 0x73}, + {0x09, 0x02, 0x73}, + {0x17, 0x02, 0x73}, + {0x28, 0x03, 0x73}, + {0x02, 0x02, 0x74}, + {0x09, 0x02, 0x74}, + {0x17, 0x02, 0x74}, + {0x28, 0x03, 0x74}, + {0x01, 0x02, 0x20}, + {0x16, 0x03, 0x20}, + {0x01, 0x02, 0x25}, + {0x16, 0x03, 0x25}, + {0x01, 0x02, 0x2D}, + {0x16, 0x03, 0x2D}, + {0x01, 0x02, 0x2E}, + {0x16, 0x03, 0x2E}, }, /* 11 */ { - {0x03, 2, 115}, - {0x06, 2, 115}, - {0x0a, 2, 115}, - {0x0f, 2, 115}, - {0x18, 2, 115}, - {0x1f, 2, 115}, - {0x29, 2, 115}, - {0x38, 3, 115}, - {0x03, 2, 116}, - {0x06, 2, 116}, - {0x0a, 2, 116}, - {0x0f, 2, 116}, - {0x18, 2, 116}, - {0x1f, 2, 116}, - {0x29, 2, 116}, - {0x38, 3, 116}, + {0x03, 0x02, 0x73}, + {0x06, 0x02, 0x73}, + {0x0A, 0x02, 0x73}, + {0x0F, 0x02, 0x73}, + {0x18, 0x02, 0x73}, + {0x1F, 0x02, 0x73}, + {0x29, 0x02, 0x73}, + {0x38, 0x03, 0x73}, + {0x03, 0x02, 0x74}, + {0x06, 0x02, 0x74}, + {0x0A, 0x02, 0x74}, + {0x0F, 0x02, 0x74}, + {0x18, 0x02, 0x74}, + {0x1F, 0x02, 0x74}, + {0x29, 0x02, 0x74}, + {0x38, 0x03, 0x74}, }, /* 12 */ { - {0x02, 2, 32}, - {0x09, 2, 32}, - {0x17, 2, 32}, - {0x28, 3, 32}, - {0x02, 2, 37}, - {0x09, 2, 37}, - {0x17, 2, 37}, - {0x28, 3, 37}, - {0x02, 2, 45}, - {0x09, 2, 45}, - {0x17, 2, 45}, - {0x28, 3, 45}, - {0x02, 2, 46}, - {0x09, 2, 46}, - {0x17, 2, 46}, - {0x28, 3, 46}, + {0x02, 0x02, 0x20}, + {0x09, 0x02, 0x20}, + {0x17, 0x02, 0x20}, + {0x28, 0x03, 0x20}, + {0x02, 0x02, 0x25}, + {0x09, 0x02, 0x25}, + {0x17, 0x02, 0x25}, + {0x28, 0x03, 0x25}, + {0x02, 0x02, 0x2D}, + {0x09, 0x02, 0x2D}, + {0x17, 0x02, 0x2D}, + {0x28, 0x03, 0x2D}, + {0x02, 0x02, 0x2E}, + {0x09, 0x02, 0x2E}, + {0x17, 0x02, 0x2E}, + {0x28, 0x03, 0x2E}, }, /* 13 */ { - {0x03, 2, 32}, - {0x06, 2, 32}, - {0x0a, 2, 32}, - {0x0f, 2, 32}, - {0x18, 2, 32}, - {0x1f, 2, 32}, - {0x29, 2, 32}, - {0x38, 3, 32}, - {0x03, 2, 37}, - {0x06, 2, 37}, - {0x0a, 2, 37}, - {0x0f, 2, 37}, - {0x18, 2, 37}, - {0x1f, 2, 37}, - {0x29, 2, 37}, - {0x38, 3, 37}, + {0x03, 0x02, 0x20}, + {0x06, 0x02, 0x20}, + {0x0A, 0x02, 0x20}, + {0x0F, 0x02, 0x20}, + {0x18, 0x02, 0x20}, + {0x1F, 0x02, 0x20}, + {0x29, 0x02, 0x20}, + {0x38, 0x03, 0x20}, + {0x03, 0x02, 0x25}, + {0x06, 0x02, 0x25}, + {0x0A, 0x02, 0x25}, + {0x0F, 0x02, 0x25}, + {0x18, 0x02, 0x25}, + {0x1F, 0x02, 0x25}, + {0x29, 0x02, 0x25}, + {0x38, 0x03, 0x25}, }, /* 14 */ { - {0x03, 2, 45}, - {0x06, 2, 45}, - {0x0a, 2, 45}, - {0x0f, 2, 45}, - {0x18, 2, 45}, - {0x1f, 2, 45}, - {0x29, 2, 45}, - {0x38, 3, 45}, - {0x03, 2, 46}, - {0x06, 2, 46}, - {0x0a, 2, 46}, - {0x0f, 2, 46}, - {0x18, 2, 46}, - {0x1f, 2, 46}, - {0x29, 2, 46}, - {0x38, 3, 46}, + {0x03, 0x02, 0x2D}, + {0x06, 0x02, 0x2D}, + {0x0A, 0x02, 0x2D}, + {0x0F, 0x02, 0x2D}, + {0x18, 0x02, 0x2D}, + {0x1F, 0x02, 0x2D}, + {0x29, 0x02, 0x2D}, + {0x38, 0x03, 0x2D}, + {0x03, 0x02, 0x2E}, + {0x06, 0x02, 0x2E}, + {0x0A, 0x02, 0x2E}, + {0x0F, 0x02, 0x2E}, + {0x18, 0x02, 0x2E}, + {0x1F, 0x02, 0x2E}, + {0x29, 0x02, 0x2E}, + {0x38, 0x03, 0x2E}, }, /* 15 */ { - {0x01, 2, 47}, - {0x16, 3, 47}, - {0x01, 2, 51}, - {0x16, 3, 51}, - {0x01, 2, 52}, - {0x16, 3, 52}, - {0x01, 2, 53}, - {0x16, 3, 53}, - {0x01, 2, 54}, - {0x16, 3, 54}, - {0x01, 2, 55}, - {0x16, 3, 55}, - {0x01, 2, 56}, - {0x16, 3, 56}, - {0x01, 2, 57}, - {0x16, 3, 57}, + {0x01, 0x02, 0x2F}, + {0x16, 0x03, 0x2F}, + {0x01, 0x02, 0x33}, + {0x16, 0x03, 0x33}, + {0x01, 0x02, 0x34}, + {0x16, 0x03, 0x34}, + {0x01, 0x02, 0x35}, + {0x16, 0x03, 0x35}, + {0x01, 0x02, 0x36}, + {0x16, 0x03, 0x36}, + {0x01, 0x02, 0x37}, + {0x16, 0x03, 0x37}, + {0x01, 0x02, 0x38}, + {0x16, 0x03, 0x38}, + {0x01, 0x02, 0x39}, + {0x16, 0x03, 0x39}, }, /* 16 */ { - {0x02, 2, 47}, - {0x09, 2, 47}, - {0x17, 2, 47}, - {0x28, 3, 47}, - {0x02, 2, 51}, - {0x09, 2, 51}, - {0x17, 2, 51}, - {0x28, 3, 51}, - {0x02, 2, 52}, - {0x09, 2, 52}, - {0x17, 2, 52}, - {0x28, 3, 52}, - {0x02, 2, 53}, - {0x09, 2, 53}, - {0x17, 2, 53}, - {0x28, 3, 53}, + {0x02, 0x02, 0x2F}, + {0x09, 0x02, 0x2F}, + {0x17, 0x02, 0x2F}, + {0x28, 0x03, 0x2F}, + {0x02, 0x02, 0x33}, + {0x09, 0x02, 0x33}, + {0x17, 0x02, 0x33}, + {0x28, 0x03, 0x33}, + {0x02, 0x02, 0x34}, + {0x09, 0x02, 0x34}, + {0x17, 0x02, 0x34}, + {0x28, 0x03, 0x34}, + {0x02, 0x02, 0x35}, + {0x09, 0x02, 0x35}, + {0x17, 0x02, 0x35}, + {0x28, 0x03, 0x35}, }, /* 17 */ { - {0x03, 2, 47}, - {0x06, 2, 47}, - {0x0a, 2, 47}, - {0x0f, 2, 47}, - {0x18, 2, 47}, - {0x1f, 2, 47}, - {0x29, 2, 47}, - {0x38, 3, 47}, - {0x03, 2, 51}, - {0x06, 2, 51}, - {0x0a, 2, 51}, - {0x0f, 2, 51}, - {0x18, 2, 51}, - {0x1f, 2, 51}, - {0x29, 2, 51}, - {0x38, 3, 51}, + {0x03, 0x02, 0x2F}, + {0x06, 0x02, 0x2F}, + {0x0A, 0x02, 0x2F}, + {0x0F, 0x02, 0x2F}, + {0x18, 0x02, 0x2F}, + {0x1F, 0x02, 0x2F}, + {0x29, 0x02, 0x2F}, + {0x38, 0x03, 0x2F}, + {0x03, 0x02, 0x33}, + {0x06, 0x02, 0x33}, + {0x0A, 0x02, 0x33}, + {0x0F, 0x02, 0x33}, + {0x18, 0x02, 0x33}, + {0x1F, 0x02, 0x33}, + {0x29, 0x02, 0x33}, + {0x38, 0x03, 0x33}, }, /* 18 */ { - {0x03, 2, 52}, - {0x06, 2, 52}, - {0x0a, 2, 52}, - {0x0f, 2, 52}, - {0x18, 2, 52}, - {0x1f, 2, 52}, - {0x29, 2, 52}, - {0x38, 3, 52}, - {0x03, 2, 53}, - {0x06, 2, 53}, - {0x0a, 2, 53}, - {0x0f, 2, 53}, - {0x18, 2, 53}, - {0x1f, 2, 53}, - {0x29, 2, 53}, - {0x38, 3, 53}, + {0x03, 0x02, 0x34}, + {0x06, 0x02, 0x34}, + {0x0A, 0x02, 0x34}, + {0x0F, 0x02, 0x34}, + {0x18, 0x02, 0x34}, + {0x1F, 0x02, 0x34}, + {0x29, 0x02, 0x34}, + {0x38, 0x03, 0x34}, + {0x03, 0x02, 0x35}, + {0x06, 0x02, 0x35}, + {0x0A, 0x02, 0x35}, + {0x0F, 0x02, 0x35}, + {0x18, 0x02, 0x35}, + {0x1F, 0x02, 0x35}, + {0x29, 0x02, 0x35}, + {0x38, 0x03, 0x35}, }, /* 19 */ { - {0x02, 2, 54}, - {0x09, 2, 54}, - {0x17, 2, 54}, - {0x28, 3, 54}, - {0x02, 2, 55}, - {0x09, 2, 55}, - {0x17, 2, 55}, - {0x28, 3, 55}, - {0x02, 2, 56}, - {0x09, 2, 56}, - {0x17, 2, 56}, - {0x28, 3, 56}, - {0x02, 2, 57}, - {0x09, 2, 57}, - {0x17, 2, 57}, - {0x28, 3, 57}, + {0x02, 0x02, 0x36}, + {0x09, 0x02, 0x36}, + {0x17, 0x02, 0x36}, + {0x28, 0x03, 0x36}, + {0x02, 0x02, 0x37}, + {0x09, 0x02, 0x37}, + {0x17, 0x02, 0x37}, + {0x28, 0x03, 0x37}, + {0x02, 0x02, 0x38}, + {0x09, 0x02, 0x38}, + {0x17, 0x02, 0x38}, + {0x28, 0x03, 0x38}, + {0x02, 0x02, 0x39}, + {0x09, 0x02, 0x39}, + {0x17, 0x02, 0x39}, + {0x28, 0x03, 0x39}, }, /* 20 */ { - {0x03, 2, 54}, - {0x06, 2, 54}, - {0x0a, 2, 54}, - {0x0f, 2, 54}, - {0x18, 2, 54}, - {0x1f, 2, 54}, - {0x29, 2, 54}, - {0x38, 3, 54}, - {0x03, 2, 55}, - {0x06, 2, 55}, - {0x0a, 2, 55}, - {0x0f, 2, 55}, - {0x18, 2, 55}, - {0x1f, 2, 55}, - {0x29, 2, 55}, - {0x38, 3, 55}, + {0x03, 0x02, 0x36}, + {0x06, 0x02, 0x36}, + {0x0A, 0x02, 0x36}, + {0x0F, 0x02, 0x36}, + {0x18, 0x02, 0x36}, + {0x1F, 0x02, 0x36}, + {0x29, 0x02, 0x36}, + {0x38, 0x03, 0x36}, + {0x03, 0x02, 0x37}, + {0x06, 0x02, 0x37}, + {0x0A, 0x02, 0x37}, + {0x0F, 0x02, 0x37}, + {0x18, 0x02, 0x37}, + {0x1F, 0x02, 0x37}, + {0x29, 0x02, 0x37}, + {0x38, 0x03, 0x37}, }, /* 21 */ { - {0x03, 2, 56}, - {0x06, 2, 56}, - {0x0a, 2, 56}, - {0x0f, 2, 56}, - {0x18, 2, 56}, - {0x1f, 2, 56}, - {0x29, 2, 56}, - {0x38, 3, 56}, - {0x03, 2, 57}, - {0x06, 2, 57}, - {0x0a, 2, 57}, - {0x0f, 2, 57}, - {0x18, 2, 57}, - {0x1f, 2, 57}, - {0x29, 2, 57}, - {0x38, 3, 57}, + {0x03, 0x02, 0x38}, + {0x06, 0x02, 0x38}, + {0x0A, 0x02, 0x38}, + {0x0F, 0x02, 0x38}, + {0x18, 0x02, 0x38}, + {0x1F, 0x02, 0x38}, + {0x29, 0x02, 0x38}, + {0x38, 0x03, 0x38}, + {0x03, 0x02, 0x39}, + {0x06, 0x02, 0x39}, + {0x0A, 0x02, 0x39}, + {0x0F, 0x02, 0x39}, + {0x18, 0x02, 0x39}, + {0x1F, 0x02, 0x39}, + {0x29, 0x02, 0x39}, + {0x38, 0x03, 0x39}, }, /* 22 */ { - {0x1a, 0, 0}, - {0x1b, 0, 0}, - {0x1d, 0, 0}, - {0x1e, 0, 0}, - {0x21, 0, 0}, - {0x22, 0, 0}, - {0x24, 0, 0}, - {0x25, 0, 0}, - {0x2b, 0, 0}, - {0x2e, 0, 0}, - {0x32, 0, 0}, - {0x35, 0, 0}, - {0x3a, 0, 0}, - {0x3d, 0, 0}, - {0x41, 0, 0}, - {0x44, 1, 0}, + {0x1A, 0x00, 0x00}, + {0x1B, 0x00, 0x00}, + {0x1D, 0x00, 0x00}, + {0x1E, 0x00, 0x00}, + {0x21, 0x00, 0x00}, + {0x22, 0x00, 0x00}, + {0x24, 0x00, 0x00}, + {0x25, 0x00, 0x00}, + {0x2B, 0x00, 0x00}, + {0x2E, 0x00, 0x00}, + {0x32, 0x00, 0x00}, + {0x35, 0x00, 0x00}, + {0x3A, 0x00, 0x00}, + {0x3D, 0x00, 0x00}, + {0x41, 0x00, 0x00}, + {0x44, 0x01, 0x00}, }, /* 23 */ { - {0x00, 3, 61}, - {0x00, 3, 65}, - {0x00, 3, 95}, - {0x00, 3, 98}, - {0x00, 3, 100}, - {0x00, 3, 102}, - {0x00, 3, 103}, - {0x00, 3, 104}, - {0x00, 3, 108}, - {0x00, 3, 109}, - {0x00, 3, 110}, - {0x00, 3, 112}, - {0x00, 3, 114}, - {0x00, 3, 117}, - {0x26, 0, 0}, - {0x27, 0, 0}, + {0x00, 0x03, 0x3D}, + {0x00, 0x03, 0x41}, + {0x00, 0x03, 0x5F}, + {0x00, 0x03, 0x62}, + {0x00, 0x03, 0x64}, + {0x00, 0x03, 0x66}, + {0x00, 0x03, 0x67}, + {0x00, 0x03, 0x68}, + {0x00, 0x03, 0x6C}, + {0x00, 0x03, 0x6D}, + {0x00, 0x03, 0x6E}, + {0x00, 0x03, 0x70}, + {0x00, 0x03, 0x72}, + {0x00, 0x03, 0x75}, + {0x26, 0x00, 0x00}, + {0x27, 0x00, 0x00}, }, /* 24 */ { - {0x01, 2, 61}, - {0x16, 3, 61}, - {0x01, 2, 65}, - {0x16, 3, 65}, - {0x01, 2, 95}, - {0x16, 3, 95}, - {0x01, 2, 98}, - {0x16, 3, 98}, - {0x01, 2, 100}, - {0x16, 3, 100}, - {0x01, 2, 102}, - {0x16, 3, 102}, - {0x01, 2, 103}, - {0x16, 3, 103}, - {0x01, 2, 104}, - {0x16, 3, 104}, + {0x01, 0x02, 0x3D}, + {0x16, 0x03, 0x3D}, + {0x01, 0x02, 0x41}, + {0x16, 0x03, 0x41}, + {0x01, 0x02, 0x5F}, + {0x16, 0x03, 0x5F}, + {0x01, 0x02, 0x62}, + {0x16, 0x03, 0x62}, + {0x01, 0x02, 0x64}, + {0x16, 0x03, 0x64}, + {0x01, 0x02, 0x66}, + {0x16, 0x03, 0x66}, + {0x01, 0x02, 0x67}, + {0x16, 0x03, 0x67}, + {0x01, 0x02, 0x68}, + {0x16, 0x03, 0x68}, }, /* 25 */ { - {0x02, 2, 61}, - {0x09, 2, 61}, - {0x17, 2, 61}, - {0x28, 3, 61}, - {0x02, 2, 65}, - {0x09, 2, 65}, - {0x17, 2, 65}, - {0x28, 3, 65}, - {0x02, 2, 95}, - {0x09, 2, 95}, - {0x17, 2, 95}, - {0x28, 3, 95}, - {0x02, 2, 98}, - {0x09, 2, 98}, - {0x17, 2, 98}, - {0x28, 3, 98}, + {0x02, 0x02, 0x3D}, + {0x09, 0x02, 0x3D}, + {0x17, 0x02, 0x3D}, + {0x28, 0x03, 0x3D}, + {0x02, 0x02, 0x41}, + {0x09, 0x02, 0x41}, + {0x17, 0x02, 0x41}, + {0x28, 0x03, 0x41}, + {0x02, 0x02, 0x5F}, + {0x09, 0x02, 0x5F}, + {0x17, 0x02, 0x5F}, + {0x28, 0x03, 0x5F}, + {0x02, 0x02, 0x62}, + {0x09, 0x02, 0x62}, + {0x17, 0x02, 0x62}, + {0x28, 0x03, 0x62}, }, /* 26 */ { - {0x03, 2, 61}, - {0x06, 2, 61}, - {0x0a, 2, 61}, - {0x0f, 2, 61}, - {0x18, 2, 61}, - {0x1f, 2, 61}, - {0x29, 2, 61}, - {0x38, 3, 61}, - {0x03, 2, 65}, - {0x06, 2, 65}, - {0x0a, 2, 65}, - {0x0f, 2, 65}, - {0x18, 2, 65}, - {0x1f, 2, 65}, - {0x29, 2, 65}, - {0x38, 3, 65}, + {0x03, 0x02, 0x3D}, + {0x06, 0x02, 0x3D}, + {0x0A, 0x02, 0x3D}, + {0x0F, 0x02, 0x3D}, + {0x18, 0x02, 0x3D}, + {0x1F, 0x02, 0x3D}, + {0x29, 0x02, 0x3D}, + {0x38, 0x03, 0x3D}, + {0x03, 0x02, 0x41}, + {0x06, 0x02, 0x41}, + {0x0A, 0x02, 0x41}, + {0x0F, 0x02, 0x41}, + {0x18, 0x02, 0x41}, + {0x1F, 0x02, 0x41}, + {0x29, 0x02, 0x41}, + {0x38, 0x03, 0x41}, }, /* 27 */ { - {0x03, 2, 95}, - {0x06, 2, 95}, - {0x0a, 2, 95}, - {0x0f, 2, 95}, - {0x18, 2, 95}, - {0x1f, 2, 95}, - {0x29, 2, 95}, - {0x38, 3, 95}, - {0x03, 2, 98}, - {0x06, 2, 98}, - {0x0a, 2, 98}, - {0x0f, 2, 98}, - {0x18, 2, 98}, - {0x1f, 2, 98}, - {0x29, 2, 98}, - {0x38, 3, 98}, + {0x03, 0x02, 0x5F}, + {0x06, 0x02, 0x5F}, + {0x0A, 0x02, 0x5F}, + {0x0F, 0x02, 0x5F}, + {0x18, 0x02, 0x5F}, + {0x1F, 0x02, 0x5F}, + {0x29, 0x02, 0x5F}, + {0x38, 0x03, 0x5F}, + {0x03, 0x02, 0x62}, + {0x06, 0x02, 0x62}, + {0x0A, 0x02, 0x62}, + {0x0F, 0x02, 0x62}, + {0x18, 0x02, 0x62}, + {0x1F, 0x02, 0x62}, + {0x29, 0x02, 0x62}, + {0x38, 0x03, 0x62}, }, /* 28 */ { - {0x02, 2, 100}, - {0x09, 2, 100}, - {0x17, 2, 100}, - {0x28, 3, 100}, - {0x02, 2, 102}, - {0x09, 2, 102}, - {0x17, 2, 102}, - {0x28, 3, 102}, - {0x02, 2, 103}, - {0x09, 2, 103}, - {0x17, 2, 103}, - {0x28, 3, 103}, - {0x02, 2, 104}, - {0x09, 2, 104}, - {0x17, 2, 104}, - {0x28, 3, 104}, + {0x02, 0x02, 0x64}, + {0x09, 0x02, 0x64}, + {0x17, 0x02, 0x64}, + {0x28, 0x03, 0x64}, + {0x02, 0x02, 0x66}, + {0x09, 0x02, 0x66}, + {0x17, 0x02, 0x66}, + {0x28, 0x03, 0x66}, + {0x02, 0x02, 0x67}, + {0x09, 0x02, 0x67}, + {0x17, 0x02, 0x67}, + {0x28, 0x03, 0x67}, + {0x02, 0x02, 0x68}, + {0x09, 0x02, 0x68}, + {0x17, 0x02, 0x68}, + {0x28, 0x03, 0x68}, }, /* 29 */ { - {0x03, 2, 100}, - {0x06, 2, 100}, - {0x0a, 2, 100}, - {0x0f, 2, 100}, - {0x18, 2, 100}, - {0x1f, 2, 100}, - {0x29, 2, 100}, - {0x38, 3, 100}, - {0x03, 2, 102}, - {0x06, 2, 102}, - {0x0a, 2, 102}, - {0x0f, 2, 102}, - {0x18, 2, 102}, - {0x1f, 2, 102}, - {0x29, 2, 102}, - {0x38, 3, 102}, + {0x03, 0x02, 0x64}, + {0x06, 0x02, 0x64}, + {0x0A, 0x02, 0x64}, + {0x0F, 0x02, 0x64}, + {0x18, 0x02, 0x64}, + {0x1F, 0x02, 0x64}, + {0x29, 0x02, 0x64}, + {0x38, 0x03, 0x64}, + {0x03, 0x02, 0x66}, + {0x06, 0x02, 0x66}, + {0x0A, 0x02, 0x66}, + {0x0F, 0x02, 0x66}, + {0x18, 0x02, 0x66}, + {0x1F, 0x02, 0x66}, + {0x29, 0x02, 0x66}, + {0x38, 0x03, 0x66}, }, /* 30 */ { - {0x03, 2, 103}, - {0x06, 2, 103}, - {0x0a, 2, 103}, - {0x0f, 2, 103}, - {0x18, 2, 103}, - {0x1f, 2, 103}, - {0x29, 2, 103}, - {0x38, 3, 103}, - {0x03, 2, 104}, - {0x06, 2, 104}, - {0x0a, 2, 104}, - {0x0f, 2, 104}, - {0x18, 2, 104}, - {0x1f, 2, 104}, - {0x29, 2, 104}, - {0x38, 3, 104}, + {0x03, 0x02, 0x67}, + {0x06, 0x02, 0x67}, + {0x0A, 0x02, 0x67}, + {0x0F, 0x02, 0x67}, + {0x18, 0x02, 0x67}, + {0x1F, 0x02, 0x67}, + {0x29, 0x02, 0x67}, + {0x38, 0x03, 0x67}, + {0x03, 0x02, 0x68}, + {0x06, 0x02, 0x68}, + {0x0A, 0x02, 0x68}, + {0x0F, 0x02, 0x68}, + {0x18, 0x02, 0x68}, + {0x1F, 0x02, 0x68}, + {0x29, 0x02, 0x68}, + {0x38, 0x03, 0x68}, }, /* 31 */ { - {0x01, 2, 108}, - {0x16, 3, 108}, - {0x01, 2, 109}, - {0x16, 3, 109}, - {0x01, 2, 110}, - {0x16, 3, 110}, - {0x01, 2, 112}, - {0x16, 3, 112}, - {0x01, 2, 114}, - {0x16, 3, 114}, - {0x01, 2, 117}, - {0x16, 3, 117}, - {0x00, 3, 58}, - {0x00, 3, 66}, - {0x00, 3, 67}, - {0x00, 3, 68}, + {0x01, 0x02, 0x6C}, + {0x16, 0x03, 0x6C}, + {0x01, 0x02, 0x6D}, + {0x16, 0x03, 0x6D}, + {0x01, 0x02, 0x6E}, + {0x16, 0x03, 0x6E}, + {0x01, 0x02, 0x70}, + {0x16, 0x03, 0x70}, + {0x01, 0x02, 0x72}, + {0x16, 0x03, 0x72}, + {0x01, 0x02, 0x75}, + {0x16, 0x03, 0x75}, + {0x00, 0x03, 0x3A}, + {0x00, 0x03, 0x42}, + {0x00, 0x03, 0x43}, + {0x00, 0x03, 0x44}, }, /* 32 */ { - {0x02, 2, 108}, - {0x09, 2, 108}, - {0x17, 2, 108}, - {0x28, 3, 108}, - {0x02, 2, 109}, - {0x09, 2, 109}, - {0x17, 2, 109}, - {0x28, 3, 109}, - {0x02, 2, 110}, - {0x09, 2, 110}, - {0x17, 2, 110}, - {0x28, 3, 110}, - {0x02, 2, 112}, - {0x09, 2, 112}, - {0x17, 2, 112}, - {0x28, 3, 112}, + {0x02, 0x02, 0x6C}, + {0x09, 0x02, 0x6C}, + {0x17, 0x02, 0x6C}, + {0x28, 0x03, 0x6C}, + {0x02, 0x02, 0x6D}, + {0x09, 0x02, 0x6D}, + {0x17, 0x02, 0x6D}, + {0x28, 0x03, 0x6D}, + {0x02, 0x02, 0x6E}, + {0x09, 0x02, 0x6E}, + {0x17, 0x02, 0x6E}, + {0x28, 0x03, 0x6E}, + {0x02, 0x02, 0x70}, + {0x09, 0x02, 0x70}, + {0x17, 0x02, 0x70}, + {0x28, 0x03, 0x70}, }, /* 33 */ { - {0x03, 2, 108}, - {0x06, 2, 108}, - {0x0a, 2, 108}, - {0x0f, 2, 108}, - {0x18, 2, 108}, - {0x1f, 2, 108}, - {0x29, 2, 108}, - {0x38, 3, 108}, - {0x03, 2, 109}, - {0x06, 2, 109}, - {0x0a, 2, 109}, - {0x0f, 2, 109}, - {0x18, 2, 109}, - {0x1f, 2, 109}, - {0x29, 2, 109}, - {0x38, 3, 109}, + {0x03, 0x02, 0x6C}, + {0x06, 0x02, 0x6C}, + {0x0A, 0x02, 0x6C}, + {0x0F, 0x02, 0x6C}, + {0x18, 0x02, 0x6C}, + {0x1F, 0x02, 0x6C}, + {0x29, 0x02, 0x6C}, + {0x38, 0x03, 0x6C}, + {0x03, 0x02, 0x6D}, + {0x06, 0x02, 0x6D}, + {0x0A, 0x02, 0x6D}, + {0x0F, 0x02, 0x6D}, + {0x18, 0x02, 0x6D}, + {0x1F, 0x02, 0x6D}, + {0x29, 0x02, 0x6D}, + {0x38, 0x03, 0x6D}, }, /* 34 */ { - {0x03, 2, 110}, - {0x06, 2, 110}, - {0x0a, 2, 110}, - {0x0f, 2, 110}, - {0x18, 2, 110}, - {0x1f, 2, 110}, - {0x29, 2, 110}, - {0x38, 3, 110}, - {0x03, 2, 112}, - {0x06, 2, 112}, - {0x0a, 2, 112}, - {0x0f, 2, 112}, - {0x18, 2, 112}, - {0x1f, 2, 112}, - {0x29, 2, 112}, - {0x38, 3, 112}, + {0x03, 0x02, 0x6E}, + {0x06, 0x02, 0x6E}, + {0x0A, 0x02, 0x6E}, + {0x0F, 0x02, 0x6E}, + {0x18, 0x02, 0x6E}, + {0x1F, 0x02, 0x6E}, + {0x29, 0x02, 0x6E}, + {0x38, 0x03, 0x6E}, + {0x03, 0x02, 0x70}, + {0x06, 0x02, 0x70}, + {0x0A, 0x02, 0x70}, + {0x0F, 0x02, 0x70}, + {0x18, 0x02, 0x70}, + {0x1F, 0x02, 0x70}, + {0x29, 0x02, 0x70}, + {0x38, 0x03, 0x70}, }, /* 35 */ { - {0x02, 2, 114}, - {0x09, 2, 114}, - {0x17, 2, 114}, - {0x28, 3, 114}, - {0x02, 2, 117}, - {0x09, 2, 117}, - {0x17, 2, 117}, - {0x28, 3, 117}, - {0x01, 2, 58}, - {0x16, 3, 58}, - {0x01, 2, 66}, - {0x16, 3, 66}, - {0x01, 2, 67}, - {0x16, 3, 67}, - {0x01, 2, 68}, - {0x16, 3, 68}, + {0x02, 0x02, 0x72}, + {0x09, 0x02, 0x72}, + {0x17, 0x02, 0x72}, + {0x28, 0x03, 0x72}, + {0x02, 0x02, 0x75}, + {0x09, 0x02, 0x75}, + {0x17, 0x02, 0x75}, + {0x28, 0x03, 0x75}, + {0x01, 0x02, 0x3A}, + {0x16, 0x03, 0x3A}, + {0x01, 0x02, 0x42}, + {0x16, 0x03, 0x42}, + {0x01, 0x02, 0x43}, + {0x16, 0x03, 0x43}, + {0x01, 0x02, 0x44}, + {0x16, 0x03, 0x44}, }, /* 36 */ { - {0x03, 2, 114}, - {0x06, 2, 114}, - {0x0a, 2, 114}, - {0x0f, 2, 114}, - {0x18, 2, 114}, - {0x1f, 2, 114}, - {0x29, 2, 114}, - {0x38, 3, 114}, - {0x03, 2, 117}, - {0x06, 2, 117}, - {0x0a, 2, 117}, - {0x0f, 2, 117}, - {0x18, 2, 117}, - {0x1f, 2, 117}, - {0x29, 2, 117}, - {0x38, 3, 117}, + {0x03, 0x02, 0x72}, + {0x06, 0x02, 0x72}, + {0x0A, 0x02, 0x72}, + {0x0F, 0x02, 0x72}, + {0x18, 0x02, 0x72}, + {0x1F, 0x02, 0x72}, + {0x29, 0x02, 0x72}, + {0x38, 0x03, 0x72}, + {0x03, 0x02, 0x75}, + {0x06, 0x02, 0x75}, + {0x0A, 0x02, 0x75}, + {0x0F, 0x02, 0x75}, + {0x18, 0x02, 0x75}, + {0x1F, 0x02, 0x75}, + {0x29, 0x02, 0x75}, + {0x38, 0x03, 0x75}, }, /* 37 */ { - {0x02, 2, 58}, - {0x09, 2, 58}, - {0x17, 2, 58}, - {0x28, 3, 58}, - {0x02, 2, 66}, - {0x09, 2, 66}, - {0x17, 2, 66}, - {0x28, 3, 66}, - {0x02, 2, 67}, - {0x09, 2, 67}, - {0x17, 2, 67}, - {0x28, 3, 67}, - {0x02, 2, 68}, - {0x09, 2, 68}, - {0x17, 2, 68}, - {0x28, 3, 68}, + {0x02, 0x02, 0x3A}, + {0x09, 0x02, 0x3A}, + {0x17, 0x02, 0x3A}, + {0x28, 0x03, 0x3A}, + {0x02, 0x02, 0x42}, + {0x09, 0x02, 0x42}, + {0x17, 0x02, 0x42}, + {0x28, 0x03, 0x42}, + {0x02, 0x02, 0x43}, + {0x09, 0x02, 0x43}, + {0x17, 0x02, 0x43}, + {0x28, 0x03, 0x43}, + {0x02, 0x02, 0x44}, + {0x09, 0x02, 0x44}, + {0x17, 0x02, 0x44}, + {0x28, 0x03, 0x44}, }, /* 38 */ { - {0x03, 2, 58}, - {0x06, 2, 58}, - {0x0a, 2, 58}, - {0x0f, 2, 58}, - {0x18, 2, 58}, - {0x1f, 2, 58}, - {0x29, 2, 58}, - {0x38, 3, 58}, - {0x03, 2, 66}, - {0x06, 2, 66}, - {0x0a, 2, 66}, - {0x0f, 2, 66}, - {0x18, 2, 66}, - {0x1f, 2, 66}, - {0x29, 2, 66}, - {0x38, 3, 66}, + {0x03, 0x02, 0x3A}, + {0x06, 0x02, 0x3A}, + {0x0A, 0x02, 0x3A}, + {0x0F, 0x02, 0x3A}, + {0x18, 0x02, 0x3A}, + {0x1F, 0x02, 0x3A}, + {0x29, 0x02, 0x3A}, + {0x38, 0x03, 0x3A}, + {0x03, 0x02, 0x42}, + {0x06, 0x02, 0x42}, + {0x0A, 0x02, 0x42}, + {0x0F, 0x02, 0x42}, + {0x18, 0x02, 0x42}, + {0x1F, 0x02, 0x42}, + {0x29, 0x02, 0x42}, + {0x38, 0x03, 0x42}, }, /* 39 */ { - {0x03, 2, 67}, - {0x06, 2, 67}, - {0x0a, 2, 67}, - {0x0f, 2, 67}, - {0x18, 2, 67}, - {0x1f, 2, 67}, - {0x29, 2, 67}, - {0x38, 3, 67}, - {0x03, 2, 68}, - {0x06, 2, 68}, - {0x0a, 2, 68}, - {0x0f, 2, 68}, - {0x18, 2, 68}, - {0x1f, 2, 68}, - {0x29, 2, 68}, - {0x38, 3, 68}, + {0x03, 0x02, 0x43}, + {0x06, 0x02, 0x43}, + {0x0A, 0x02, 0x43}, + {0x0F, 0x02, 0x43}, + {0x18, 0x02, 0x43}, + {0x1F, 0x02, 0x43}, + {0x29, 0x02, 0x43}, + {0x38, 0x03, 0x43}, + {0x03, 0x02, 0x44}, + {0x06, 0x02, 0x44}, + {0x0A, 0x02, 0x44}, + {0x0F, 0x02, 0x44}, + {0x18, 0x02, 0x44}, + {0x1F, 0x02, 0x44}, + {0x29, 0x02, 0x44}, + {0x38, 0x03, 0x44}, }, /* 40 */ { - {0x2c, 0, 0}, - {0x2d, 0, 0}, - {0x2f, 0, 0}, - {0x30, 0, 0}, - {0x33, 0, 0}, - {0x34, 0, 0}, - {0x36, 0, 0}, - {0x37, 0, 0}, - {0x3b, 0, 0}, - {0x3c, 0, 0}, - {0x3e, 0, 0}, - {0x3f, 0, 0}, - {0x42, 0, 0}, - {0x43, 0, 0}, - {0x45, 0, 0}, - {0x48, 1, 0}, + {0x2C, 0x00, 0x00}, + {0x2D, 0x00, 0x00}, + {0x2F, 0x00, 0x00}, + {0x30, 0x00, 0x00}, + {0x33, 0x00, 0x00}, + {0x34, 0x00, 0x00}, + {0x36, 0x00, 0x00}, + {0x37, 0x00, 0x00}, + {0x3B, 0x00, 0x00}, + {0x3C, 0x00, 0x00}, + {0x3E, 0x00, 0x00}, + {0x3F, 0x00, 0x00}, + {0x42, 0x00, 0x00}, + {0x43, 0x00, 0x00}, + {0x45, 0x00, 0x00}, + {0x48, 0x01, 0x00}, }, /* 41 */ { - {0x00, 3, 69}, - {0x00, 3, 70}, - {0x00, 3, 71}, - {0x00, 3, 72}, - {0x00, 3, 73}, - {0x00, 3, 74}, - {0x00, 3, 75}, - {0x00, 3, 76}, - {0x00, 3, 77}, - {0x00, 3, 78}, - {0x00, 3, 79}, - {0x00, 3, 80}, - {0x00, 3, 81}, - {0x00, 3, 82}, - {0x00, 3, 83}, - {0x00, 3, 84}, + {0x00, 0x03, 0x45}, + {0x00, 0x03, 0x46}, + {0x00, 0x03, 0x47}, + {0x00, 0x03, 0x48}, + {0x00, 0x03, 0x49}, + {0x00, 0x03, 0x4A}, + {0x00, 0x03, 0x4B}, + {0x00, 0x03, 0x4C}, + {0x00, 0x03, 0x4D}, + {0x00, 0x03, 0x4E}, + {0x00, 0x03, 0x4F}, + {0x00, 0x03, 0x50}, + {0x00, 0x03, 0x51}, + {0x00, 0x03, 0x52}, + {0x00, 0x03, 0x53}, + {0x00, 0x03, 0x54}, }, /* 42 */ { - {0x01, 2, 69}, - {0x16, 3, 69}, - {0x01, 2, 70}, - {0x16, 3, 70}, - {0x01, 2, 71}, - {0x16, 3, 71}, - {0x01, 2, 72}, - {0x16, 3, 72}, - {0x01, 2, 73}, - {0x16, 3, 73}, - {0x01, 2, 74}, - {0x16, 3, 74}, - {0x01, 2, 75}, - {0x16, 3, 75}, - {0x01, 2, 76}, - {0x16, 3, 76}, + {0x01, 0x02, 0x45}, + {0x16, 0x03, 0x45}, + {0x01, 0x02, 0x46}, + {0x16, 0x03, 0x46}, + {0x01, 0x02, 0x47}, + {0x16, 0x03, 0x47}, + {0x01, 0x02, 0x48}, + {0x16, 0x03, 0x48}, + {0x01, 0x02, 0x49}, + {0x16, 0x03, 0x49}, + {0x01, 0x02, 0x4A}, + {0x16, 0x03, 0x4A}, + {0x01, 0x02, 0x4B}, + {0x16, 0x03, 0x4B}, + {0x01, 0x02, 0x4C}, + {0x16, 0x03, 0x4C}, }, /* 43 */ { - {0x02, 2, 69}, - {0x09, 2, 69}, - {0x17, 2, 69}, - {0x28, 3, 69}, - {0x02, 2, 70}, - {0x09, 2, 70}, - {0x17, 2, 70}, - {0x28, 3, 70}, - {0x02, 2, 71}, - {0x09, 2, 71}, - {0x17, 2, 71}, - {0x28, 3, 71}, - {0x02, 2, 72}, - {0x09, 2, 72}, - {0x17, 2, 72}, - {0x28, 3, 72}, + {0x02, 0x02, 0x45}, + {0x09, 0x02, 0x45}, + {0x17, 0x02, 0x45}, + {0x28, 0x03, 0x45}, + {0x02, 0x02, 0x46}, + {0x09, 0x02, 0x46}, + {0x17, 0x02, 0x46}, + {0x28, 0x03, 0x46}, + {0x02, 0x02, 0x47}, + {0x09, 0x02, 0x47}, + {0x17, 0x02, 0x47}, + {0x28, 0x03, 0x47}, + {0x02, 0x02, 0x48}, + {0x09, 0x02, 0x48}, + {0x17, 0x02, 0x48}, + {0x28, 0x03, 0x48}, }, /* 44 */ { - {0x03, 2, 69}, - {0x06, 2, 69}, - {0x0a, 2, 69}, - {0x0f, 2, 69}, - {0x18, 2, 69}, - {0x1f, 2, 69}, - {0x29, 2, 69}, - {0x38, 3, 69}, - {0x03, 2, 70}, - {0x06, 2, 70}, - {0x0a, 2, 70}, - {0x0f, 2, 70}, - {0x18, 2, 70}, - {0x1f, 2, 70}, - {0x29, 2, 70}, - {0x38, 3, 70}, + {0x03, 0x02, 0x45}, + {0x06, 0x02, 0x45}, + {0x0A, 0x02, 0x45}, + {0x0F, 0x02, 0x45}, + {0x18, 0x02, 0x45}, + {0x1F, 0x02, 0x45}, + {0x29, 0x02, 0x45}, + {0x38, 0x03, 0x45}, + {0x03, 0x02, 0x46}, + {0x06, 0x02, 0x46}, + {0x0A, 0x02, 0x46}, + {0x0F, 0x02, 0x46}, + {0x18, 0x02, 0x46}, + {0x1F, 0x02, 0x46}, + {0x29, 0x02, 0x46}, + {0x38, 0x03, 0x46}, }, /* 45 */ { - {0x03, 2, 71}, - {0x06, 2, 71}, - {0x0a, 2, 71}, - {0x0f, 2, 71}, - {0x18, 2, 71}, - {0x1f, 2, 71}, - {0x29, 2, 71}, - {0x38, 3, 71}, - {0x03, 2, 72}, - {0x06, 2, 72}, - {0x0a, 2, 72}, - {0x0f, 2, 72}, - {0x18, 2, 72}, - {0x1f, 2, 72}, - {0x29, 2, 72}, - {0x38, 3, 72}, + {0x03, 0x02, 0x47}, + {0x06, 0x02, 0x47}, + {0x0A, 0x02, 0x47}, + {0x0F, 0x02, 0x47}, + {0x18, 0x02, 0x47}, + {0x1F, 0x02, 0x47}, + {0x29, 0x02, 0x47}, + {0x38, 0x03, 0x47}, + {0x03, 0x02, 0x48}, + {0x06, 0x02, 0x48}, + {0x0A, 0x02, 0x48}, + {0x0F, 0x02, 0x48}, + {0x18, 0x02, 0x48}, + {0x1F, 0x02, 0x48}, + {0x29, 0x02, 0x48}, + {0x38, 0x03, 0x48}, }, /* 46 */ { - {0x02, 2, 73}, - {0x09, 2, 73}, - {0x17, 2, 73}, - {0x28, 3, 73}, - {0x02, 2, 74}, - {0x09, 2, 74}, - {0x17, 2, 74}, - {0x28, 3, 74}, - {0x02, 2, 75}, - {0x09, 2, 75}, - {0x17, 2, 75}, - {0x28, 3, 75}, - {0x02, 2, 76}, - {0x09, 2, 76}, - {0x17, 2, 76}, - {0x28, 3, 76}, + {0x02, 0x02, 0x49}, + {0x09, 0x02, 0x49}, + {0x17, 0x02, 0x49}, + {0x28, 0x03, 0x49}, + {0x02, 0x02, 0x4A}, + {0x09, 0x02, 0x4A}, + {0x17, 0x02, 0x4A}, + {0x28, 0x03, 0x4A}, + {0x02, 0x02, 0x4B}, + {0x09, 0x02, 0x4B}, + {0x17, 0x02, 0x4B}, + {0x28, 0x03, 0x4B}, + {0x02, 0x02, 0x4C}, + {0x09, 0x02, 0x4C}, + {0x17, 0x02, 0x4C}, + {0x28, 0x03, 0x4C}, }, /* 47 */ { - {0x03, 2, 73}, - {0x06, 2, 73}, - {0x0a, 2, 73}, - {0x0f, 2, 73}, - {0x18, 2, 73}, - {0x1f, 2, 73}, - {0x29, 2, 73}, - {0x38, 3, 73}, - {0x03, 2, 74}, - {0x06, 2, 74}, - {0x0a, 2, 74}, - {0x0f, 2, 74}, - {0x18, 2, 74}, - {0x1f, 2, 74}, - {0x29, 2, 74}, - {0x38, 3, 74}, + {0x03, 0x02, 0x49}, + {0x06, 0x02, 0x49}, + {0x0A, 0x02, 0x49}, + {0x0F, 0x02, 0x49}, + {0x18, 0x02, 0x49}, + {0x1F, 0x02, 0x49}, + {0x29, 0x02, 0x49}, + {0x38, 0x03, 0x49}, + {0x03, 0x02, 0x4A}, + {0x06, 0x02, 0x4A}, + {0x0A, 0x02, 0x4A}, + {0x0F, 0x02, 0x4A}, + {0x18, 0x02, 0x4A}, + {0x1F, 0x02, 0x4A}, + {0x29, 0x02, 0x4A}, + {0x38, 0x03, 0x4A}, }, /* 48 */ { - {0x03, 2, 75}, - {0x06, 2, 75}, - {0x0a, 2, 75}, - {0x0f, 2, 75}, - {0x18, 2, 75}, - {0x1f, 2, 75}, - {0x29, 2, 75}, - {0x38, 3, 75}, - {0x03, 2, 76}, - {0x06, 2, 76}, - {0x0a, 2, 76}, - {0x0f, 2, 76}, - {0x18, 2, 76}, - {0x1f, 2, 76}, - {0x29, 2, 76}, - {0x38, 3, 76}, + {0x03, 0x02, 0x4B}, + {0x06, 0x02, 0x4B}, + {0x0A, 0x02, 0x4B}, + {0x0F, 0x02, 0x4B}, + {0x18, 0x02, 0x4B}, + {0x1F, 0x02, 0x4B}, + {0x29, 0x02, 0x4B}, + {0x38, 0x03, 0x4B}, + {0x03, 0x02, 0x4C}, + {0x06, 0x02, 0x4C}, + {0x0A, 0x02, 0x4C}, + {0x0F, 0x02, 0x4C}, + {0x18, 0x02, 0x4C}, + {0x1F, 0x02, 0x4C}, + {0x29, 0x02, 0x4C}, + {0x38, 0x03, 0x4C}, }, /* 49 */ { - {0x01, 2, 77}, - {0x16, 3, 77}, - {0x01, 2, 78}, - {0x16, 3, 78}, - {0x01, 2, 79}, - {0x16, 3, 79}, - {0x01, 2, 80}, - {0x16, 3, 80}, - {0x01, 2, 81}, - {0x16, 3, 81}, - {0x01, 2, 82}, - {0x16, 3, 82}, - {0x01, 2, 83}, - {0x16, 3, 83}, - {0x01, 2, 84}, - {0x16, 3, 84}, + {0x01, 0x02, 0x4D}, + {0x16, 0x03, 0x4D}, + {0x01, 0x02, 0x4E}, + {0x16, 0x03, 0x4E}, + {0x01, 0x02, 0x4F}, + {0x16, 0x03, 0x4F}, + {0x01, 0x02, 0x50}, + {0x16, 0x03, 0x50}, + {0x01, 0x02, 0x51}, + {0x16, 0x03, 0x51}, + {0x01, 0x02, 0x52}, + {0x16, 0x03, 0x52}, + {0x01, 0x02, 0x53}, + {0x16, 0x03, 0x53}, + {0x01, 0x02, 0x54}, + {0x16, 0x03, 0x54}, }, /* 50 */ { - {0x02, 2, 77}, - {0x09, 2, 77}, - {0x17, 2, 77}, - {0x28, 3, 77}, - {0x02, 2, 78}, - {0x09, 2, 78}, - {0x17, 2, 78}, - {0x28, 3, 78}, - {0x02, 2, 79}, - {0x09, 2, 79}, - {0x17, 2, 79}, - {0x28, 3, 79}, - {0x02, 2, 80}, - {0x09, 2, 80}, - {0x17, 2, 80}, - {0x28, 3, 80}, + {0x02, 0x02, 0x4D}, + {0x09, 0x02, 0x4D}, + {0x17, 0x02, 0x4D}, + {0x28, 0x03, 0x4D}, + {0x02, 0x02, 0x4E}, + {0x09, 0x02, 0x4E}, + {0x17, 0x02, 0x4E}, + {0x28, 0x03, 0x4E}, + {0x02, 0x02, 0x4F}, + {0x09, 0x02, 0x4F}, + {0x17, 0x02, 0x4F}, + {0x28, 0x03, 0x4F}, + {0x02, 0x02, 0x50}, + {0x09, 0x02, 0x50}, + {0x17, 0x02, 0x50}, + {0x28, 0x03, 0x50}, }, /* 51 */ { - {0x03, 2, 77}, - {0x06, 2, 77}, - {0x0a, 2, 77}, - {0x0f, 2, 77}, - {0x18, 2, 77}, - {0x1f, 2, 77}, - {0x29, 2, 77}, - {0x38, 3, 77}, - {0x03, 2, 78}, - {0x06, 2, 78}, - {0x0a, 2, 78}, - {0x0f, 2, 78}, - {0x18, 2, 78}, - {0x1f, 2, 78}, - {0x29, 2, 78}, - {0x38, 3, 78}, + {0x03, 0x02, 0x4D}, + {0x06, 0x02, 0x4D}, + {0x0A, 0x02, 0x4D}, + {0x0F, 0x02, 0x4D}, + {0x18, 0x02, 0x4D}, + {0x1F, 0x02, 0x4D}, + {0x29, 0x02, 0x4D}, + {0x38, 0x03, 0x4D}, + {0x03, 0x02, 0x4E}, + {0x06, 0x02, 0x4E}, + {0x0A, 0x02, 0x4E}, + {0x0F, 0x02, 0x4E}, + {0x18, 0x02, 0x4E}, + {0x1F, 0x02, 0x4E}, + {0x29, 0x02, 0x4E}, + {0x38, 0x03, 0x4E}, }, /* 52 */ { - {0x03, 2, 79}, - {0x06, 2, 79}, - {0x0a, 2, 79}, - {0x0f, 2, 79}, - {0x18, 2, 79}, - {0x1f, 2, 79}, - {0x29, 2, 79}, - {0x38, 3, 79}, - {0x03, 2, 80}, - {0x06, 2, 80}, - {0x0a, 2, 80}, - {0x0f, 2, 80}, - {0x18, 2, 80}, - {0x1f, 2, 80}, - {0x29, 2, 80}, - {0x38, 3, 80}, + {0x03, 0x02, 0x4F}, + {0x06, 0x02, 0x4F}, + {0x0A, 0x02, 0x4F}, + {0x0F, 0x02, 0x4F}, + {0x18, 0x02, 0x4F}, + {0x1F, 0x02, 0x4F}, + {0x29, 0x02, 0x4F}, + {0x38, 0x03, 0x4F}, + {0x03, 0x02, 0x50}, + {0x06, 0x02, 0x50}, + {0x0A, 0x02, 0x50}, + {0x0F, 0x02, 0x50}, + {0x18, 0x02, 0x50}, + {0x1F, 0x02, 0x50}, + {0x29, 0x02, 0x50}, + {0x38, 0x03, 0x50}, }, /* 53 */ { - {0x02, 2, 81}, - {0x09, 2, 81}, - {0x17, 2, 81}, - {0x28, 3, 81}, - {0x02, 2, 82}, - {0x09, 2, 82}, - {0x17, 2, 82}, - {0x28, 3, 82}, - {0x02, 2, 83}, - {0x09, 2, 83}, - {0x17, 2, 83}, - {0x28, 3, 83}, - {0x02, 2, 84}, - {0x09, 2, 84}, - {0x17, 2, 84}, - {0x28, 3, 84}, + {0x02, 0x02, 0x51}, + {0x09, 0x02, 0x51}, + {0x17, 0x02, 0x51}, + {0x28, 0x03, 0x51}, + {0x02, 0x02, 0x52}, + {0x09, 0x02, 0x52}, + {0x17, 0x02, 0x52}, + {0x28, 0x03, 0x52}, + {0x02, 0x02, 0x53}, + {0x09, 0x02, 0x53}, + {0x17, 0x02, 0x53}, + {0x28, 0x03, 0x53}, + {0x02, 0x02, 0x54}, + {0x09, 0x02, 0x54}, + {0x17, 0x02, 0x54}, + {0x28, 0x03, 0x54}, }, /* 54 */ { - {0x03, 2, 81}, - {0x06, 2, 81}, - {0x0a, 2, 81}, - {0x0f, 2, 81}, - {0x18, 2, 81}, - {0x1f, 2, 81}, - {0x29, 2, 81}, - {0x38, 3, 81}, - {0x03, 2, 82}, - {0x06, 2, 82}, - {0x0a, 2, 82}, - {0x0f, 2, 82}, - {0x18, 2, 82}, - {0x1f, 2, 82}, - {0x29, 2, 82}, - {0x38, 3, 82}, + {0x03, 0x02, 0x51}, + {0x06, 0x02, 0x51}, + {0x0A, 0x02, 0x51}, + {0x0F, 0x02, 0x51}, + {0x18, 0x02, 0x51}, + {0x1F, 0x02, 0x51}, + {0x29, 0x02, 0x51}, + {0x38, 0x03, 0x51}, + {0x03, 0x02, 0x52}, + {0x06, 0x02, 0x52}, + {0x0A, 0x02, 0x52}, + {0x0F, 0x02, 0x52}, + {0x18, 0x02, 0x52}, + {0x1F, 0x02, 0x52}, + {0x29, 0x02, 0x52}, + {0x38, 0x03, 0x52}, }, /* 55 */ { - {0x03, 2, 83}, - {0x06, 2, 83}, - {0x0a, 2, 83}, - {0x0f, 2, 83}, - {0x18, 2, 83}, - {0x1f, 2, 83}, - {0x29, 2, 83}, - {0x38, 3, 83}, - {0x03, 2, 84}, - {0x06, 2, 84}, - {0x0a, 2, 84}, - {0x0f, 2, 84}, - {0x18, 2, 84}, - {0x1f, 2, 84}, - {0x29, 2, 84}, - {0x38, 3, 84}, + {0x03, 0x02, 0x53}, + {0x06, 0x02, 0x53}, + {0x0A, 0x02, 0x53}, + {0x0F, 0x02, 0x53}, + {0x18, 0x02, 0x53}, + {0x1F, 0x02, 0x53}, + {0x29, 0x02, 0x53}, + {0x38, 0x03, 0x53}, + {0x03, 0x02, 0x54}, + {0x06, 0x02, 0x54}, + {0x0A, 0x02, 0x54}, + {0x0F, 0x02, 0x54}, + {0x18, 0x02, 0x54}, + {0x1F, 0x02, 0x54}, + {0x29, 0x02, 0x54}, + {0x38, 0x03, 0x54}, }, /* 56 */ { - {0x00, 3, 85}, - {0x00, 3, 86}, - {0x00, 3, 87}, - {0x00, 3, 89}, - {0x00, 3, 106}, - {0x00, 3, 107}, - {0x00, 3, 113}, - {0x00, 3, 118}, - {0x00, 3, 119}, - {0x00, 3, 120}, - {0x00, 3, 121}, - {0x00, 3, 122}, - {0x46, 0, 0}, - {0x47, 0, 0}, - {0x49, 0, 0}, - {0x4a, 1, 0}, + {0x00, 0x03, 0x55}, + {0x00, 0x03, 0x56}, + {0x00, 0x03, 0x57}, + {0x00, 0x03, 0x59}, + {0x00, 0x03, 0x6A}, + {0x00, 0x03, 0x6B}, + {0x00, 0x03, 0x71}, + {0x00, 0x03, 0x76}, + {0x00, 0x03, 0x77}, + {0x00, 0x03, 0x78}, + {0x00, 0x03, 0x79}, + {0x00, 0x03, 0x7A}, + {0x46, 0x00, 0x00}, + {0x47, 0x00, 0x00}, + {0x49, 0x00, 0x00}, + {0x4A, 0x01, 0x00}, }, /* 57 */ { - {0x01, 2, 85}, - {0x16, 3, 85}, - {0x01, 2, 86}, - {0x16, 3, 86}, - {0x01, 2, 87}, - {0x16, 3, 87}, - {0x01, 2, 89}, - {0x16, 3, 89}, - {0x01, 2, 106}, - {0x16, 3, 106}, - {0x01, 2, 107}, - {0x16, 3, 107}, - {0x01, 2, 113}, - {0x16, 3, 113}, - {0x01, 2, 118}, - {0x16, 3, 118}, + {0x01, 0x02, 0x55}, + {0x16, 0x03, 0x55}, + {0x01, 0x02, 0x56}, + {0x16, 0x03, 0x56}, + {0x01, 0x02, 0x57}, + {0x16, 0x03, 0x57}, + {0x01, 0x02, 0x59}, + {0x16, 0x03, 0x59}, + {0x01, 0x02, 0x6A}, + {0x16, 0x03, 0x6A}, + {0x01, 0x02, 0x6B}, + {0x16, 0x03, 0x6B}, + {0x01, 0x02, 0x71}, + {0x16, 0x03, 0x71}, + {0x01, 0x02, 0x76}, + {0x16, 0x03, 0x76}, }, /* 58 */ { - {0x02, 2, 85}, - {0x09, 2, 85}, - {0x17, 2, 85}, - {0x28, 3, 85}, - {0x02, 2, 86}, - {0x09, 2, 86}, - {0x17, 2, 86}, - {0x28, 3, 86}, - {0x02, 2, 87}, - {0x09, 2, 87}, - {0x17, 2, 87}, - {0x28, 3, 87}, - {0x02, 2, 89}, - {0x09, 2, 89}, - {0x17, 2, 89}, - {0x28, 3, 89}, + {0x02, 0x02, 0x55}, + {0x09, 0x02, 0x55}, + {0x17, 0x02, 0x55}, + {0x28, 0x03, 0x55}, + {0x02, 0x02, 0x56}, + {0x09, 0x02, 0x56}, + {0x17, 0x02, 0x56}, + {0x28, 0x03, 0x56}, + {0x02, 0x02, 0x57}, + {0x09, 0x02, 0x57}, + {0x17, 0x02, 0x57}, + {0x28, 0x03, 0x57}, + {0x02, 0x02, 0x59}, + {0x09, 0x02, 0x59}, + {0x17, 0x02, 0x59}, + {0x28, 0x03, 0x59}, }, /* 59 */ { - {0x03, 2, 85}, - {0x06, 2, 85}, - {0x0a, 2, 85}, - {0x0f, 2, 85}, - {0x18, 2, 85}, - {0x1f, 2, 85}, - {0x29, 2, 85}, - {0x38, 3, 85}, - {0x03, 2, 86}, - {0x06, 2, 86}, - {0x0a, 2, 86}, - {0x0f, 2, 86}, - {0x18, 2, 86}, - {0x1f, 2, 86}, - {0x29, 2, 86}, - {0x38, 3, 86}, + {0x03, 0x02, 0x55}, + {0x06, 0x02, 0x55}, + {0x0A, 0x02, 0x55}, + {0x0F, 0x02, 0x55}, + {0x18, 0x02, 0x55}, + {0x1F, 0x02, 0x55}, + {0x29, 0x02, 0x55}, + {0x38, 0x03, 0x55}, + {0x03, 0x02, 0x56}, + {0x06, 0x02, 0x56}, + {0x0A, 0x02, 0x56}, + {0x0F, 0x02, 0x56}, + {0x18, 0x02, 0x56}, + {0x1F, 0x02, 0x56}, + {0x29, 0x02, 0x56}, + {0x38, 0x03, 0x56}, }, /* 60 */ { - {0x03, 2, 87}, - {0x06, 2, 87}, - {0x0a, 2, 87}, - {0x0f, 2, 87}, - {0x18, 2, 87}, - {0x1f, 2, 87}, - {0x29, 2, 87}, - {0x38, 3, 87}, - {0x03, 2, 89}, - {0x06, 2, 89}, - {0x0a, 2, 89}, - {0x0f, 2, 89}, - {0x18, 2, 89}, - {0x1f, 2, 89}, - {0x29, 2, 89}, - {0x38, 3, 89}, + {0x03, 0x02, 0x57}, + {0x06, 0x02, 0x57}, + {0x0A, 0x02, 0x57}, + {0x0F, 0x02, 0x57}, + {0x18, 0x02, 0x57}, + {0x1F, 0x02, 0x57}, + {0x29, 0x02, 0x57}, + {0x38, 0x03, 0x57}, + {0x03, 0x02, 0x59}, + {0x06, 0x02, 0x59}, + {0x0A, 0x02, 0x59}, + {0x0F, 0x02, 0x59}, + {0x18, 0x02, 0x59}, + {0x1F, 0x02, 0x59}, + {0x29, 0x02, 0x59}, + {0x38, 0x03, 0x59}, }, /* 61 */ { - {0x02, 2, 106}, - {0x09, 2, 106}, - {0x17, 2, 106}, - {0x28, 3, 106}, - {0x02, 2, 107}, - {0x09, 2, 107}, - {0x17, 2, 107}, - {0x28, 3, 107}, - {0x02, 2, 113}, - {0x09, 2, 113}, - {0x17, 2, 113}, - {0x28, 3, 113}, - {0x02, 2, 118}, - {0x09, 2, 118}, - {0x17, 2, 118}, - {0x28, 3, 118}, + {0x02, 0x02, 0x6A}, + {0x09, 0x02, 0x6A}, + {0x17, 0x02, 0x6A}, + {0x28, 0x03, 0x6A}, + {0x02, 0x02, 0x6B}, + {0x09, 0x02, 0x6B}, + {0x17, 0x02, 0x6B}, + {0x28, 0x03, 0x6B}, + {0x02, 0x02, 0x71}, + {0x09, 0x02, 0x71}, + {0x17, 0x02, 0x71}, + {0x28, 0x03, 0x71}, + {0x02, 0x02, 0x76}, + {0x09, 0x02, 0x76}, + {0x17, 0x02, 0x76}, + {0x28, 0x03, 0x76}, }, /* 62 */ { - {0x03, 2, 106}, - {0x06, 2, 106}, - {0x0a, 2, 106}, - {0x0f, 2, 106}, - {0x18, 2, 106}, - {0x1f, 2, 106}, - {0x29, 2, 106}, - {0x38, 3, 106}, - {0x03, 2, 107}, - {0x06, 2, 107}, - {0x0a, 2, 107}, - {0x0f, 2, 107}, - {0x18, 2, 107}, - {0x1f, 2, 107}, - {0x29, 2, 107}, - {0x38, 3, 107}, + {0x03, 0x02, 0x6A}, + {0x06, 0x02, 0x6A}, + {0x0A, 0x02, 0x6A}, + {0x0F, 0x02, 0x6A}, + {0x18, 0x02, 0x6A}, + {0x1F, 0x02, 0x6A}, + {0x29, 0x02, 0x6A}, + {0x38, 0x03, 0x6A}, + {0x03, 0x02, 0x6B}, + {0x06, 0x02, 0x6B}, + {0x0A, 0x02, 0x6B}, + {0x0F, 0x02, 0x6B}, + {0x18, 0x02, 0x6B}, + {0x1F, 0x02, 0x6B}, + {0x29, 0x02, 0x6B}, + {0x38, 0x03, 0x6B}, }, /* 63 */ { - {0x03, 2, 113}, - {0x06, 2, 113}, - {0x0a, 2, 113}, - {0x0f, 2, 113}, - {0x18, 2, 113}, - {0x1f, 2, 113}, - {0x29, 2, 113}, - {0x38, 3, 113}, - {0x03, 2, 118}, - {0x06, 2, 118}, - {0x0a, 2, 118}, - {0x0f, 2, 118}, - {0x18, 2, 118}, - {0x1f, 2, 118}, - {0x29, 2, 118}, - {0x38, 3, 118}, + {0x03, 0x02, 0x71}, + {0x06, 0x02, 0x71}, + {0x0A, 0x02, 0x71}, + {0x0F, 0x02, 0x71}, + {0x18, 0x02, 0x71}, + {0x1F, 0x02, 0x71}, + {0x29, 0x02, 0x71}, + {0x38, 0x03, 0x71}, + {0x03, 0x02, 0x76}, + {0x06, 0x02, 0x76}, + {0x0A, 0x02, 0x76}, + {0x0F, 0x02, 0x76}, + {0x18, 0x02, 0x76}, + {0x1F, 0x02, 0x76}, + {0x29, 0x02, 0x76}, + {0x38, 0x03, 0x76}, }, /* 64 */ { - {0x01, 2, 119}, - {0x16, 3, 119}, - {0x01, 2, 120}, - {0x16, 3, 120}, - {0x01, 2, 121}, - {0x16, 3, 121}, - {0x01, 2, 122}, - {0x16, 3, 122}, - {0x00, 3, 38}, - {0x00, 3, 42}, - {0x00, 3, 44}, - {0x00, 3, 59}, - {0x00, 3, 88}, - {0x00, 3, 90}, - {0x4b, 0, 0}, - {0x4e, 0, 0}, + {0x01, 0x02, 0x77}, + {0x16, 0x03, 0x77}, + {0x01, 0x02, 0x78}, + {0x16, 0x03, 0x78}, + {0x01, 0x02, 0x79}, + {0x16, 0x03, 0x79}, + {0x01, 0x02, 0x7A}, + {0x16, 0x03, 0x7A}, + {0x00, 0x03, 0x26}, + {0x00, 0x03, 0x2A}, + {0x00, 0x03, 0x2C}, + {0x00, 0x03, 0x3B}, + {0x00, 0x03, 0x58}, + {0x00, 0x03, 0x5A}, + {0x4B, 0x00, 0x00}, + {0x4E, 0x00, 0x00}, }, /* 65 */ { - {0x02, 2, 119}, - {0x09, 2, 119}, - {0x17, 2, 119}, - {0x28, 3, 119}, - {0x02, 2, 120}, - {0x09, 2, 120}, - {0x17, 2, 120}, - {0x28, 3, 120}, - {0x02, 2, 121}, - {0x09, 2, 121}, - {0x17, 2, 121}, - {0x28, 3, 121}, - {0x02, 2, 122}, - {0x09, 2, 122}, - {0x17, 2, 122}, - {0x28, 3, 122}, + {0x02, 0x02, 0x77}, + {0x09, 0x02, 0x77}, + {0x17, 0x02, 0x77}, + {0x28, 0x03, 0x77}, + {0x02, 0x02, 0x78}, + {0x09, 0x02, 0x78}, + {0x17, 0x02, 0x78}, + {0x28, 0x03, 0x78}, + {0x02, 0x02, 0x79}, + {0x09, 0x02, 0x79}, + {0x17, 0x02, 0x79}, + {0x28, 0x03, 0x79}, + {0x02, 0x02, 0x7A}, + {0x09, 0x02, 0x7A}, + {0x17, 0x02, 0x7A}, + {0x28, 0x03, 0x7A}, }, /* 66 */ { - {0x03, 2, 119}, - {0x06, 2, 119}, - {0x0a, 2, 119}, - {0x0f, 2, 119}, - {0x18, 2, 119}, - {0x1f, 2, 119}, - {0x29, 2, 119}, - {0x38, 3, 119}, - {0x03, 2, 120}, - {0x06, 2, 120}, - {0x0a, 2, 120}, - {0x0f, 2, 120}, - {0x18, 2, 120}, - {0x1f, 2, 120}, - {0x29, 2, 120}, - {0x38, 3, 120}, + {0x03, 0x02, 0x77}, + {0x06, 0x02, 0x77}, + {0x0A, 0x02, 0x77}, + {0x0F, 0x02, 0x77}, + {0x18, 0x02, 0x77}, + {0x1F, 0x02, 0x77}, + {0x29, 0x02, 0x77}, + {0x38, 0x03, 0x77}, + {0x03, 0x02, 0x78}, + {0x06, 0x02, 0x78}, + {0x0A, 0x02, 0x78}, + {0x0F, 0x02, 0x78}, + {0x18, 0x02, 0x78}, + {0x1F, 0x02, 0x78}, + {0x29, 0x02, 0x78}, + {0x38, 0x03, 0x78}, }, /* 67 */ { - {0x03, 2, 121}, - {0x06, 2, 121}, - {0x0a, 2, 121}, - {0x0f, 2, 121}, - {0x18, 2, 121}, - {0x1f, 2, 121}, - {0x29, 2, 121}, - {0x38, 3, 121}, - {0x03, 2, 122}, - {0x06, 2, 122}, - {0x0a, 2, 122}, - {0x0f, 2, 122}, - {0x18, 2, 122}, - {0x1f, 2, 122}, - {0x29, 2, 122}, - {0x38, 3, 122}, + {0x03, 0x02, 0x79}, + {0x06, 0x02, 0x79}, + {0x0A, 0x02, 0x79}, + {0x0F, 0x02, 0x79}, + {0x18, 0x02, 0x79}, + {0x1F, 0x02, 0x79}, + {0x29, 0x02, 0x79}, + {0x38, 0x03, 0x79}, + {0x03, 0x02, 0x7A}, + {0x06, 0x02, 0x7A}, + {0x0A, 0x02, 0x7A}, + {0x0F, 0x02, 0x7A}, + {0x18, 0x02, 0x7A}, + {0x1F, 0x02, 0x7A}, + {0x29, 0x02, 0x7A}, + {0x38, 0x03, 0x7A}, }, /* 68 */ { - {0x01, 2, 38}, - {0x16, 3, 38}, - {0x01, 2, 42}, - {0x16, 3, 42}, - {0x01, 2, 44}, - {0x16, 3, 44}, - {0x01, 2, 59}, - {0x16, 3, 59}, - {0x01, 2, 88}, - {0x16, 3, 88}, - {0x01, 2, 90}, - {0x16, 3, 90}, - {0x4c, 0, 0}, - {0x4d, 0, 0}, - {0x4f, 0, 0}, - {0x51, 0, 0}, + {0x01, 0x02, 0x26}, + {0x16, 0x03, 0x26}, + {0x01, 0x02, 0x2A}, + {0x16, 0x03, 0x2A}, + {0x01, 0x02, 0x2C}, + {0x16, 0x03, 0x2C}, + {0x01, 0x02, 0x3B}, + {0x16, 0x03, 0x3B}, + {0x01, 0x02, 0x58}, + {0x16, 0x03, 0x58}, + {0x01, 0x02, 0x5A}, + {0x16, 0x03, 0x5A}, + {0x4C, 0x00, 0x00}, + {0x4D, 0x00, 0x00}, + {0x4F, 0x00, 0x00}, + {0x51, 0x00, 0x00}, }, /* 69 */ { - {0x02, 2, 38}, - {0x09, 2, 38}, - {0x17, 2, 38}, - {0x28, 3, 38}, - {0x02, 2, 42}, - {0x09, 2, 42}, - {0x17, 2, 42}, - {0x28, 3, 42}, - {0x02, 2, 44}, - {0x09, 2, 44}, - {0x17, 2, 44}, - {0x28, 3, 44}, - {0x02, 2, 59}, - {0x09, 2, 59}, - {0x17, 2, 59}, - {0x28, 3, 59}, + {0x02, 0x02, 0x26}, + {0x09, 0x02, 0x26}, + {0x17, 0x02, 0x26}, + {0x28, 0x03, 0x26}, + {0x02, 0x02, 0x2A}, + {0x09, 0x02, 0x2A}, + {0x17, 0x02, 0x2A}, + {0x28, 0x03, 0x2A}, + {0x02, 0x02, 0x2C}, + {0x09, 0x02, 0x2C}, + {0x17, 0x02, 0x2C}, + {0x28, 0x03, 0x2C}, + {0x02, 0x02, 0x3B}, + {0x09, 0x02, 0x3B}, + {0x17, 0x02, 0x3B}, + {0x28, 0x03, 0x3B}, }, /* 70 */ { - {0x03, 2, 38}, - {0x06, 2, 38}, - {0x0a, 2, 38}, - {0x0f, 2, 38}, - {0x18, 2, 38}, - {0x1f, 2, 38}, - {0x29, 2, 38}, - {0x38, 3, 38}, - {0x03, 2, 42}, - {0x06, 2, 42}, - {0x0a, 2, 42}, - {0x0f, 2, 42}, - {0x18, 2, 42}, - {0x1f, 2, 42}, - {0x29, 2, 42}, - {0x38, 3, 42}, + {0x03, 0x02, 0x26}, + {0x06, 0x02, 0x26}, + {0x0A, 0x02, 0x26}, + {0x0F, 0x02, 0x26}, + {0x18, 0x02, 0x26}, + {0x1F, 0x02, 0x26}, + {0x29, 0x02, 0x26}, + {0x38, 0x03, 0x26}, + {0x03, 0x02, 0x2A}, + {0x06, 0x02, 0x2A}, + {0x0A, 0x02, 0x2A}, + {0x0F, 0x02, 0x2A}, + {0x18, 0x02, 0x2A}, + {0x1F, 0x02, 0x2A}, + {0x29, 0x02, 0x2A}, + {0x38, 0x03, 0x2A}, }, /* 71 */ { - {0x03, 2, 44}, - {0x06, 2, 44}, - {0x0a, 2, 44}, - {0x0f, 2, 44}, - {0x18, 2, 44}, - {0x1f, 2, 44}, - {0x29, 2, 44}, - {0x38, 3, 44}, - {0x03, 2, 59}, - {0x06, 2, 59}, - {0x0a, 2, 59}, - {0x0f, 2, 59}, - {0x18, 2, 59}, - {0x1f, 2, 59}, - {0x29, 2, 59}, - {0x38, 3, 59}, + {0x03, 0x02, 0x2C}, + {0x06, 0x02, 0x2C}, + {0x0A, 0x02, 0x2C}, + {0x0F, 0x02, 0x2C}, + {0x18, 0x02, 0x2C}, + {0x1F, 0x02, 0x2C}, + {0x29, 0x02, 0x2C}, + {0x38, 0x03, 0x2C}, + {0x03, 0x02, 0x3B}, + {0x06, 0x02, 0x3B}, + {0x0A, 0x02, 0x3B}, + {0x0F, 0x02, 0x3B}, + {0x18, 0x02, 0x3B}, + {0x1F, 0x02, 0x3B}, + {0x29, 0x02, 0x3B}, + {0x38, 0x03, 0x3B}, }, /* 72 */ { - {0x02, 2, 88}, - {0x09, 2, 88}, - {0x17, 2, 88}, - {0x28, 3, 88}, - {0x02, 2, 90}, - {0x09, 2, 90}, - {0x17, 2, 90}, - {0x28, 3, 90}, - {0x00, 3, 33}, - {0x00, 3, 34}, - {0x00, 3, 40}, - {0x00, 3, 41}, - {0x00, 3, 63}, - {0x50, 0, 0}, - {0x52, 0, 0}, - {0x54, 0, 0}, + {0x02, 0x02, 0x58}, + {0x09, 0x02, 0x58}, + {0x17, 0x02, 0x58}, + {0x28, 0x03, 0x58}, + {0x02, 0x02, 0x5A}, + {0x09, 0x02, 0x5A}, + {0x17, 0x02, 0x5A}, + {0x28, 0x03, 0x5A}, + {0x00, 0x03, 0x21}, + {0x00, 0x03, 0x22}, + {0x00, 0x03, 0x28}, + {0x00, 0x03, 0x29}, + {0x00, 0x03, 0x3F}, + {0x50, 0x00, 0x00}, + {0x52, 0x00, 0x00}, + {0x54, 0x00, 0x00}, }, /* 73 */ { - {0x03, 2, 88}, - {0x06, 2, 88}, - {0x0a, 2, 88}, - {0x0f, 2, 88}, - {0x18, 2, 88}, - {0x1f, 2, 88}, - {0x29, 2, 88}, - {0x38, 3, 88}, - {0x03, 2, 90}, - {0x06, 2, 90}, - {0x0a, 2, 90}, - {0x0f, 2, 90}, - {0x18, 2, 90}, - {0x1f, 2, 90}, - {0x29, 2, 90}, - {0x38, 3, 90}, + {0x03, 0x02, 0x58}, + {0x06, 0x02, 0x58}, + {0x0A, 0x02, 0x58}, + {0x0F, 0x02, 0x58}, + {0x18, 0x02, 0x58}, + {0x1F, 0x02, 0x58}, + {0x29, 0x02, 0x58}, + {0x38, 0x03, 0x58}, + {0x03, 0x02, 0x5A}, + {0x06, 0x02, 0x5A}, + {0x0A, 0x02, 0x5A}, + {0x0F, 0x02, 0x5A}, + {0x18, 0x02, 0x5A}, + {0x1F, 0x02, 0x5A}, + {0x29, 0x02, 0x5A}, + {0x38, 0x03, 0x5A}, }, /* 74 */ { - {0x01, 2, 33}, - {0x16, 3, 33}, - {0x01, 2, 34}, - {0x16, 3, 34}, - {0x01, 2, 40}, - {0x16, 3, 40}, - {0x01, 2, 41}, - {0x16, 3, 41}, - {0x01, 2, 63}, - {0x16, 3, 63}, - {0x00, 3, 39}, - {0x00, 3, 43}, - {0x00, 3, 124}, - {0x53, 0, 0}, - {0x55, 0, 0}, - {0x58, 0, 0}, + {0x01, 0x02, 0x21}, + {0x16, 0x03, 0x21}, + {0x01, 0x02, 0x22}, + {0x16, 0x03, 0x22}, + {0x01, 0x02, 0x28}, + {0x16, 0x03, 0x28}, + {0x01, 0x02, 0x29}, + {0x16, 0x03, 0x29}, + {0x01, 0x02, 0x3F}, + {0x16, 0x03, 0x3F}, + {0x00, 0x03, 0x27}, + {0x00, 0x03, 0x2B}, + {0x00, 0x03, 0x7C}, + {0x53, 0x00, 0x00}, + {0x55, 0x00, 0x00}, + {0x58, 0x00, 0x00}, }, /* 75 */ { - {0x02, 2, 33}, - {0x09, 2, 33}, - {0x17, 2, 33}, - {0x28, 3, 33}, - {0x02, 2, 34}, - {0x09, 2, 34}, - {0x17, 2, 34}, - {0x28, 3, 34}, - {0x02, 2, 40}, - {0x09, 2, 40}, - {0x17, 2, 40}, - {0x28, 3, 40}, - {0x02, 2, 41}, - {0x09, 2, 41}, - {0x17, 2, 41}, - {0x28, 3, 41}, + {0x02, 0x02, 0x21}, + {0x09, 0x02, 0x21}, + {0x17, 0x02, 0x21}, + {0x28, 0x03, 0x21}, + {0x02, 0x02, 0x22}, + {0x09, 0x02, 0x22}, + {0x17, 0x02, 0x22}, + {0x28, 0x03, 0x22}, + {0x02, 0x02, 0x28}, + {0x09, 0x02, 0x28}, + {0x17, 0x02, 0x28}, + {0x28, 0x03, 0x28}, + {0x02, 0x02, 0x29}, + {0x09, 0x02, 0x29}, + {0x17, 0x02, 0x29}, + {0x28, 0x03, 0x29}, }, /* 76 */ { - {0x03, 2, 33}, - {0x06, 2, 33}, - {0x0a, 2, 33}, - {0x0f, 2, 33}, - {0x18, 2, 33}, - {0x1f, 2, 33}, - {0x29, 2, 33}, - {0x38, 3, 33}, - {0x03, 2, 34}, - {0x06, 2, 34}, - {0x0a, 2, 34}, - {0x0f, 2, 34}, - {0x18, 2, 34}, - {0x1f, 2, 34}, - {0x29, 2, 34}, - {0x38, 3, 34}, + {0x03, 0x02, 0x21}, + {0x06, 0x02, 0x21}, + {0x0A, 0x02, 0x21}, + {0x0F, 0x02, 0x21}, + {0x18, 0x02, 0x21}, + {0x1F, 0x02, 0x21}, + {0x29, 0x02, 0x21}, + {0x38, 0x03, 0x21}, + {0x03, 0x02, 0x22}, + {0x06, 0x02, 0x22}, + {0x0A, 0x02, 0x22}, + {0x0F, 0x02, 0x22}, + {0x18, 0x02, 0x22}, + {0x1F, 0x02, 0x22}, + {0x29, 0x02, 0x22}, + {0x38, 0x03, 0x22}, }, /* 77 */ { - {0x03, 2, 40}, - {0x06, 2, 40}, - {0x0a, 2, 40}, - {0x0f, 2, 40}, - {0x18, 2, 40}, - {0x1f, 2, 40}, - {0x29, 2, 40}, - {0x38, 3, 40}, - {0x03, 2, 41}, - {0x06, 2, 41}, - {0x0a, 2, 41}, - {0x0f, 2, 41}, - {0x18, 2, 41}, - {0x1f, 2, 41}, - {0x29, 2, 41}, - {0x38, 3, 41}, + {0x03, 0x02, 0x28}, + {0x06, 0x02, 0x28}, + {0x0A, 0x02, 0x28}, + {0x0F, 0x02, 0x28}, + {0x18, 0x02, 0x28}, + {0x1F, 0x02, 0x28}, + {0x29, 0x02, 0x28}, + {0x38, 0x03, 0x28}, + {0x03, 0x02, 0x29}, + {0x06, 0x02, 0x29}, + {0x0A, 0x02, 0x29}, + {0x0F, 0x02, 0x29}, + {0x18, 0x02, 0x29}, + {0x1F, 0x02, 0x29}, + {0x29, 0x02, 0x29}, + {0x38, 0x03, 0x29}, }, /* 78 */ { - {0x02, 2, 63}, - {0x09, 2, 63}, - {0x17, 2, 63}, - {0x28, 3, 63}, - {0x01, 2, 39}, - {0x16, 3, 39}, - {0x01, 2, 43}, - {0x16, 3, 43}, - {0x01, 2, 124}, - {0x16, 3, 124}, - {0x00, 3, 35}, - {0x00, 3, 62}, - {0x56, 0, 0}, - {0x57, 0, 0}, - {0x59, 0, 0}, - {0x5a, 0, 0}, + {0x02, 0x02, 0x3F}, + {0x09, 0x02, 0x3F}, + {0x17, 0x02, 0x3F}, + {0x28, 0x03, 0x3F}, + {0x01, 0x02, 0x27}, + {0x16, 0x03, 0x27}, + {0x01, 0x02, 0x2B}, + {0x16, 0x03, 0x2B}, + {0x01, 0x02, 0x7C}, + {0x16, 0x03, 0x7C}, + {0x00, 0x03, 0x23}, + {0x00, 0x03, 0x3E}, + {0x56, 0x00, 0x00}, + {0x57, 0x00, 0x00}, + {0x59, 0x00, 0x00}, + {0x5A, 0x00, 0x00}, }, /* 79 */ { - {0x03, 2, 63}, - {0x06, 2, 63}, - {0x0a, 2, 63}, - {0x0f, 2, 63}, - {0x18, 2, 63}, - {0x1f, 2, 63}, - {0x29, 2, 63}, - {0x38, 3, 63}, - {0x02, 2, 39}, - {0x09, 2, 39}, - {0x17, 2, 39}, - {0x28, 3, 39}, - {0x02, 2, 43}, - {0x09, 2, 43}, - {0x17, 2, 43}, - {0x28, 3, 43}, + {0x03, 0x02, 0x3F}, + {0x06, 0x02, 0x3F}, + {0x0A, 0x02, 0x3F}, + {0x0F, 0x02, 0x3F}, + {0x18, 0x02, 0x3F}, + {0x1F, 0x02, 0x3F}, + {0x29, 0x02, 0x3F}, + {0x38, 0x03, 0x3F}, + {0x02, 0x02, 0x27}, + {0x09, 0x02, 0x27}, + {0x17, 0x02, 0x27}, + {0x28, 0x03, 0x27}, + {0x02, 0x02, 0x2B}, + {0x09, 0x02, 0x2B}, + {0x17, 0x02, 0x2B}, + {0x28, 0x03, 0x2B}, }, /* 80 */ { - {0x03, 2, 39}, - {0x06, 2, 39}, - {0x0a, 2, 39}, - {0x0f, 2, 39}, - {0x18, 2, 39}, - {0x1f, 2, 39}, - {0x29, 2, 39}, - {0x38, 3, 39}, - {0x03, 2, 43}, - {0x06, 2, 43}, - {0x0a, 2, 43}, - {0x0f, 2, 43}, - {0x18, 2, 43}, - {0x1f, 2, 43}, - {0x29, 2, 43}, - {0x38, 3, 43}, + {0x03, 0x02, 0x27}, + {0x06, 0x02, 0x27}, + {0x0A, 0x02, 0x27}, + {0x0F, 0x02, 0x27}, + {0x18, 0x02, 0x27}, + {0x1F, 0x02, 0x27}, + {0x29, 0x02, 0x27}, + {0x38, 0x03, 0x27}, + {0x03, 0x02, 0x2B}, + {0x06, 0x02, 0x2B}, + {0x0A, 0x02, 0x2B}, + {0x0F, 0x02, 0x2B}, + {0x18, 0x02, 0x2B}, + {0x1F, 0x02, 0x2B}, + {0x29, 0x02, 0x2B}, + {0x38, 0x03, 0x2B}, }, /* 81 */ { - {0x02, 2, 124}, - {0x09, 2, 124}, - {0x17, 2, 124}, - {0x28, 3, 124}, - {0x01, 2, 35}, - {0x16, 3, 35}, - {0x01, 2, 62}, - {0x16, 3, 62}, - {0x00, 3, 0}, - {0x00, 3, 36}, - {0x00, 3, 64}, - {0x00, 3, 91}, - {0x00, 3, 93}, - {0x00, 3, 126}, - {0x5b, 0, 0}, - {0x5c, 0, 0}, + {0x02, 0x02, 0x7C}, + {0x09, 0x02, 0x7C}, + {0x17, 0x02, 0x7C}, + {0x28, 0x03, 0x7C}, + {0x01, 0x02, 0x23}, + {0x16, 0x03, 0x23}, + {0x01, 0x02, 0x3E}, + {0x16, 0x03, 0x3E}, + {0x00, 0x03, 0x00}, + {0x00, 0x03, 0x24}, + {0x00, 0x03, 0x40}, + {0x00, 0x03, 0x5B}, + {0x00, 0x03, 0x5D}, + {0x00, 0x03, 0x7E}, + {0x5B, 0x00, 0x00}, + {0x5C, 0x00, 0x00}, }, /* 82 */ { - {0x03, 2, 124}, - {0x06, 2, 124}, - {0x0a, 2, 124}, - {0x0f, 2, 124}, - {0x18, 2, 124}, - {0x1f, 2, 124}, - {0x29, 2, 124}, - {0x38, 3, 124}, - {0x02, 2, 35}, - {0x09, 2, 35}, - {0x17, 2, 35}, - {0x28, 3, 35}, - {0x02, 2, 62}, - {0x09, 2, 62}, - {0x17, 2, 62}, - {0x28, 3, 62}, + {0x03, 0x02, 0x7C}, + {0x06, 0x02, 0x7C}, + {0x0A, 0x02, 0x7C}, + {0x0F, 0x02, 0x7C}, + {0x18, 0x02, 0x7C}, + {0x1F, 0x02, 0x7C}, + {0x29, 0x02, 0x7C}, + {0x38, 0x03, 0x7C}, + {0x02, 0x02, 0x23}, + {0x09, 0x02, 0x23}, + {0x17, 0x02, 0x23}, + {0x28, 0x03, 0x23}, + {0x02, 0x02, 0x3E}, + {0x09, 0x02, 0x3E}, + {0x17, 0x02, 0x3E}, + {0x28, 0x03, 0x3E}, }, /* 83 */ { - {0x03, 2, 35}, - {0x06, 2, 35}, - {0x0a, 2, 35}, - {0x0f, 2, 35}, - {0x18, 2, 35}, - {0x1f, 2, 35}, - {0x29, 2, 35}, - {0x38, 3, 35}, - {0x03, 2, 62}, - {0x06, 2, 62}, - {0x0a, 2, 62}, - {0x0f, 2, 62}, - {0x18, 2, 62}, - {0x1f, 2, 62}, - {0x29, 2, 62}, - {0x38, 3, 62}, + {0x03, 0x02, 0x23}, + {0x06, 0x02, 0x23}, + {0x0A, 0x02, 0x23}, + {0x0F, 0x02, 0x23}, + {0x18, 0x02, 0x23}, + {0x1F, 0x02, 0x23}, + {0x29, 0x02, 0x23}, + {0x38, 0x03, 0x23}, + {0x03, 0x02, 0x3E}, + {0x06, 0x02, 0x3E}, + {0x0A, 0x02, 0x3E}, + {0x0F, 0x02, 0x3E}, + {0x18, 0x02, 0x3E}, + {0x1F, 0x02, 0x3E}, + {0x29, 0x02, 0x3E}, + {0x38, 0x03, 0x3E}, }, /* 84 */ { - {0x01, 2, 0}, - {0x16, 3, 0}, - {0x01, 2, 36}, - {0x16, 3, 36}, - {0x01, 2, 64}, - {0x16, 3, 64}, - {0x01, 2, 91}, - {0x16, 3, 91}, - {0x01, 2, 93}, - {0x16, 3, 93}, - {0x01, 2, 126}, - {0x16, 3, 126}, - {0x00, 3, 94}, - {0x00, 3, 125}, - {0x5d, 0, 0}, - {0x5e, 0, 0}, + {0x01, 0x02, 0x00}, + {0x16, 0x03, 0x00}, + {0x01, 0x02, 0x24}, + {0x16, 0x03, 0x24}, + {0x01, 0x02, 0x40}, + {0x16, 0x03, 0x40}, + {0x01, 0x02, 0x5B}, + {0x16, 0x03, 0x5B}, + {0x01, 0x02, 0x5D}, + {0x16, 0x03, 0x5D}, + {0x01, 0x02, 0x7E}, + {0x16, 0x03, 0x7E}, + {0x00, 0x03, 0x5E}, + {0x00, 0x03, 0x7D}, + {0x5D, 0x00, 0x00}, + {0x5E, 0x00, 0x00}, }, /* 85 */ { - {0x02, 2, 0}, - {0x09, 2, 0}, - {0x17, 2, 0}, - {0x28, 3, 0}, - {0x02, 2, 36}, - {0x09, 2, 36}, - {0x17, 2, 36}, - {0x28, 3, 36}, - {0x02, 2, 64}, - {0x09, 2, 64}, - {0x17, 2, 64}, - {0x28, 3, 64}, - {0x02, 2, 91}, - {0x09, 2, 91}, - {0x17, 2, 91}, - {0x28, 3, 91}, + {0x02, 0x02, 0x00}, + {0x09, 0x02, 0x00}, + {0x17, 0x02, 0x00}, + {0x28, 0x03, 0x00}, + {0x02, 0x02, 0x24}, + {0x09, 0x02, 0x24}, + {0x17, 0x02, 0x24}, + {0x28, 0x03, 0x24}, + {0x02, 0x02, 0x40}, + {0x09, 0x02, 0x40}, + {0x17, 0x02, 0x40}, + {0x28, 0x03, 0x40}, + {0x02, 0x02, 0x5B}, + {0x09, 0x02, 0x5B}, + {0x17, 0x02, 0x5B}, + {0x28, 0x03, 0x5B}, }, /* 86 */ { - {0x03, 2, 0}, - {0x06, 2, 0}, - {0x0a, 2, 0}, - {0x0f, 2, 0}, - {0x18, 2, 0}, - {0x1f, 2, 0}, - {0x29, 2, 0}, - {0x38, 3, 0}, - {0x03, 2, 36}, - {0x06, 2, 36}, - {0x0a, 2, 36}, - {0x0f, 2, 36}, - {0x18, 2, 36}, - {0x1f, 2, 36}, - {0x29, 2, 36}, - {0x38, 3, 36}, + {0x03, 0x02, 0x00}, + {0x06, 0x02, 0x00}, + {0x0A, 0x02, 0x00}, + {0x0F, 0x02, 0x00}, + {0x18, 0x02, 0x00}, + {0x1F, 0x02, 0x00}, + {0x29, 0x02, 0x00}, + {0x38, 0x03, 0x00}, + {0x03, 0x02, 0x24}, + {0x06, 0x02, 0x24}, + {0x0A, 0x02, 0x24}, + {0x0F, 0x02, 0x24}, + {0x18, 0x02, 0x24}, + {0x1F, 0x02, 0x24}, + {0x29, 0x02, 0x24}, + {0x38, 0x03, 0x24}, }, /* 87 */ { - {0x03, 2, 64}, - {0x06, 2, 64}, - {0x0a, 2, 64}, - {0x0f, 2, 64}, - {0x18, 2, 64}, - {0x1f, 2, 64}, - {0x29, 2, 64}, - {0x38, 3, 64}, - {0x03, 2, 91}, - {0x06, 2, 91}, - {0x0a, 2, 91}, - {0x0f, 2, 91}, - {0x18, 2, 91}, - {0x1f, 2, 91}, - {0x29, 2, 91}, - {0x38, 3, 91}, + {0x03, 0x02, 0x40}, + {0x06, 0x02, 0x40}, + {0x0A, 0x02, 0x40}, + {0x0F, 0x02, 0x40}, + {0x18, 0x02, 0x40}, + {0x1F, 0x02, 0x40}, + {0x29, 0x02, 0x40}, + {0x38, 0x03, 0x40}, + {0x03, 0x02, 0x5B}, + {0x06, 0x02, 0x5B}, + {0x0A, 0x02, 0x5B}, + {0x0F, 0x02, 0x5B}, + {0x18, 0x02, 0x5B}, + {0x1F, 0x02, 0x5B}, + {0x29, 0x02, 0x5B}, + {0x38, 0x03, 0x5B}, }, /* 88 */ { - {0x02, 2, 93}, - {0x09, 2, 93}, - {0x17, 2, 93}, - {0x28, 3, 93}, - {0x02, 2, 126}, - {0x09, 2, 126}, - {0x17, 2, 126}, - {0x28, 3, 126}, - {0x01, 2, 94}, - {0x16, 3, 94}, - {0x01, 2, 125}, - {0x16, 3, 125}, - {0x00, 3, 60}, - {0x00, 3, 96}, - {0x00, 3, 123}, - {0x5f, 0, 0}, + {0x02, 0x02, 0x5D}, + {0x09, 0x02, 0x5D}, + {0x17, 0x02, 0x5D}, + {0x28, 0x03, 0x5D}, + {0x02, 0x02, 0x7E}, + {0x09, 0x02, 0x7E}, + {0x17, 0x02, 0x7E}, + {0x28, 0x03, 0x7E}, + {0x01, 0x02, 0x5E}, + {0x16, 0x03, 0x5E}, + {0x01, 0x02, 0x7D}, + {0x16, 0x03, 0x7D}, + {0x00, 0x03, 0x3C}, + {0x00, 0x03, 0x60}, + {0x00, 0x03, 0x7B}, + {0x5F, 0x00, 0x00}, }, /* 89 */ { - {0x03, 2, 93}, - {0x06, 2, 93}, - {0x0a, 2, 93}, - {0x0f, 2, 93}, - {0x18, 2, 93}, - {0x1f, 2, 93}, - {0x29, 2, 93}, - {0x38, 3, 93}, - {0x03, 2, 126}, - {0x06, 2, 126}, - {0x0a, 2, 126}, - {0x0f, 2, 126}, - {0x18, 2, 126}, - {0x1f, 2, 126}, - {0x29, 2, 126}, - {0x38, 3, 126}, + {0x03, 0x02, 0x5D}, + {0x06, 0x02, 0x5D}, + {0x0A, 0x02, 0x5D}, + {0x0F, 0x02, 0x5D}, + {0x18, 0x02, 0x5D}, + {0x1F, 0x02, 0x5D}, + {0x29, 0x02, 0x5D}, + {0x38, 0x03, 0x5D}, + {0x03, 0x02, 0x7E}, + {0x06, 0x02, 0x7E}, + {0x0A, 0x02, 0x7E}, + {0x0F, 0x02, 0x7E}, + {0x18, 0x02, 0x7E}, + {0x1F, 0x02, 0x7E}, + {0x29, 0x02, 0x7E}, + {0x38, 0x03, 0x7E}, }, /* 90 */ { - {0x02, 2, 94}, - {0x09, 2, 94}, - {0x17, 2, 94}, - {0x28, 3, 94}, - {0x02, 2, 125}, - {0x09, 2, 125}, - {0x17, 2, 125}, - {0x28, 3, 125}, - {0x01, 2, 60}, - {0x16, 3, 60}, - {0x01, 2, 96}, - {0x16, 3, 96}, - {0x01, 2, 123}, - {0x16, 3, 123}, - {0x60, 0, 0}, - {0x6e, 0, 0}, + {0x02, 0x02, 0x5E}, + {0x09, 0x02, 0x5E}, + {0x17, 0x02, 0x5E}, + {0x28, 0x03, 0x5E}, + {0x02, 0x02, 0x7D}, + {0x09, 0x02, 0x7D}, + {0x17, 0x02, 0x7D}, + {0x28, 0x03, 0x7D}, + {0x01, 0x02, 0x3C}, + {0x16, 0x03, 0x3C}, + {0x01, 0x02, 0x60}, + {0x16, 0x03, 0x60}, + {0x01, 0x02, 0x7B}, + {0x16, 0x03, 0x7B}, + {0x60, 0x00, 0x00}, + {0x6E, 0x00, 0x00}, }, /* 91 */ { - {0x03, 2, 94}, - {0x06, 2, 94}, - {0x0a, 2, 94}, - {0x0f, 2, 94}, - {0x18, 2, 94}, - {0x1f, 2, 94}, - {0x29, 2, 94}, - {0x38, 3, 94}, - {0x03, 2, 125}, - {0x06, 2, 125}, - {0x0a, 2, 125}, - {0x0f, 2, 125}, - {0x18, 2, 125}, - {0x1f, 2, 125}, - {0x29, 2, 125}, - {0x38, 3, 125}, + {0x03, 0x02, 0x5E}, + {0x06, 0x02, 0x5E}, + {0x0A, 0x02, 0x5E}, + {0x0F, 0x02, 0x5E}, + {0x18, 0x02, 0x5E}, + {0x1F, 0x02, 0x5E}, + {0x29, 0x02, 0x5E}, + {0x38, 0x03, 0x5E}, + {0x03, 0x02, 0x7D}, + {0x06, 0x02, 0x7D}, + {0x0A, 0x02, 0x7D}, + {0x0F, 0x02, 0x7D}, + {0x18, 0x02, 0x7D}, + {0x1F, 0x02, 0x7D}, + {0x29, 0x02, 0x7D}, + {0x38, 0x03, 0x7D}, }, /* 92 */ { - {0x02, 2, 60}, - {0x09, 2, 60}, - {0x17, 2, 60}, - {0x28, 3, 60}, - {0x02, 2, 96}, - {0x09, 2, 96}, - {0x17, 2, 96}, - {0x28, 3, 96}, - {0x02, 2, 123}, - {0x09, 2, 123}, - {0x17, 2, 123}, - {0x28, 3, 123}, - {0x61, 0, 0}, - {0x65, 0, 0}, - {0x6f, 0, 0}, - {0x85, 0, 0}, + {0x02, 0x02, 0x3C}, + {0x09, 0x02, 0x3C}, + {0x17, 0x02, 0x3C}, + {0x28, 0x03, 0x3C}, + {0x02, 0x02, 0x60}, + {0x09, 0x02, 0x60}, + {0x17, 0x02, 0x60}, + {0x28, 0x03, 0x60}, + {0x02, 0x02, 0x7B}, + {0x09, 0x02, 0x7B}, + {0x17, 0x02, 0x7B}, + {0x28, 0x03, 0x7B}, + {0x61, 0x00, 0x00}, + {0x65, 0x00, 0x00}, + {0x6F, 0x00, 0x00}, + {0x85, 0x00, 0x00}, }, /* 93 */ { - {0x03, 2, 60}, - {0x06, 2, 60}, - {0x0a, 2, 60}, - {0x0f, 2, 60}, - {0x18, 2, 60}, - {0x1f, 2, 60}, - {0x29, 2, 60}, - {0x38, 3, 60}, - {0x03, 2, 96}, - {0x06, 2, 96}, - {0x0a, 2, 96}, - {0x0f, 2, 96}, - {0x18, 2, 96}, - {0x1f, 2, 96}, - {0x29, 2, 96}, - {0x38, 3, 96}, + {0x03, 0x02, 0x3C}, + {0x06, 0x02, 0x3C}, + {0x0A, 0x02, 0x3C}, + {0x0F, 0x02, 0x3C}, + {0x18, 0x02, 0x3C}, + {0x1F, 0x02, 0x3C}, + {0x29, 0x02, 0x3C}, + {0x38, 0x03, 0x3C}, + {0x03, 0x02, 0x60}, + {0x06, 0x02, 0x60}, + {0x0A, 0x02, 0x60}, + {0x0F, 0x02, 0x60}, + {0x18, 0x02, 0x60}, + {0x1F, 0x02, 0x60}, + {0x29, 0x02, 0x60}, + {0x38, 0x03, 0x60}, }, /* 94 */ { - {0x03, 2, 123}, - {0x06, 2, 123}, - {0x0a, 2, 123}, - {0x0f, 2, 123}, - {0x18, 2, 123}, - {0x1f, 2, 123}, - {0x29, 2, 123}, - {0x38, 3, 123}, - {0x62, 0, 0}, - {0x63, 0, 0}, - {0x66, 0, 0}, - {0x69, 0, 0}, - {0x70, 0, 0}, - {0x77, 0, 0}, - {0x86, 0, 0}, - {0x99, 0, 0}, + {0x03, 0x02, 0x7B}, + {0x06, 0x02, 0x7B}, + {0x0A, 0x02, 0x7B}, + {0x0F, 0x02, 0x7B}, + {0x18, 0x02, 0x7B}, + {0x1F, 0x02, 0x7B}, + {0x29, 0x02, 0x7B}, + {0x38, 0x03, 0x7B}, + {0x62, 0x00, 0x00}, + {0x63, 0x00, 0x00}, + {0x66, 0x00, 0x00}, + {0x69, 0x00, 0x00}, + {0x70, 0x00, 0x00}, + {0x77, 0x00, 0x00}, + {0x86, 0x00, 0x00}, + {0x99, 0x00, 0x00}, }, /* 95 */ { - {0x00, 3, 92}, - {0x00, 3, 195}, - {0x00, 3, 208}, - {0x64, 0, 0}, - {0x67, 0, 0}, - {0x68, 0, 0}, - {0x6a, 0, 0}, - {0x6b, 0, 0}, - {0x71, 0, 0}, - {0x74, 0, 0}, - {0x78, 0, 0}, - {0x7e, 0, 0}, - {0x87, 0, 0}, - {0x8e, 0, 0}, - {0x9a, 0, 0}, - {0xa9, 0, 0}, + {0x00, 0x03, 0x5C}, + {0x00, 0x03, 0xC3}, + {0x00, 0x03, 0xD0}, + {0x64, 0x00, 0x00}, + {0x67, 0x00, 0x00}, + {0x68, 0x00, 0x00}, + {0x6A, 0x00, 0x00}, + {0x6B, 0x00, 0x00}, + {0x71, 0x00, 0x00}, + {0x74, 0x00, 0x00}, + {0x78, 0x00, 0x00}, + {0x7E, 0x00, 0x00}, + {0x87, 0x00, 0x00}, + {0x8E, 0x00, 0x00}, + {0x9A, 0x00, 0x00}, + {0xA9, 0x00, 0x00}, }, /* 96 */ { - {0x01, 2, 92}, - {0x16, 3, 92}, - {0x01, 2, 195}, - {0x16, 3, 195}, - {0x01, 2, 208}, - {0x16, 3, 208}, - {0x00, 3, 128}, - {0x00, 3, 130}, - {0x00, 3, 131}, - {0x00, 3, 162}, - {0x00, 3, 184}, - {0x00, 3, 194}, - {0x00, 3, 224}, - {0x00, 3, 226}, - {0x6c, 0, 0}, - {0x6d, 0, 0}, + {0x01, 0x02, 0x5C}, + {0x16, 0x03, 0x5C}, + {0x01, 0x02, 0xC3}, + {0x16, 0x03, 0xC3}, + {0x01, 0x02, 0xD0}, + {0x16, 0x03, 0xD0}, + {0x00, 0x03, 0x80}, + {0x00, 0x03, 0x82}, + {0x00, 0x03, 0x83}, + {0x00, 0x03, 0xA2}, + {0x00, 0x03, 0xB8}, + {0x00, 0x03, 0xC2}, + {0x00, 0x03, 0xE0}, + {0x00, 0x03, 0xE2}, + {0x6C, 0x00, 0x00}, + {0x6D, 0x00, 0x00}, }, /* 97 */ { - {0x02, 2, 92}, - {0x09, 2, 92}, - {0x17, 2, 92}, - {0x28, 3, 92}, - {0x02, 2, 195}, - {0x09, 2, 195}, - {0x17, 2, 195}, - {0x28, 3, 195}, - {0x02, 2, 208}, - {0x09, 2, 208}, - {0x17, 2, 208}, - {0x28, 3, 208}, - {0x01, 2, 128}, - {0x16, 3, 128}, - {0x01, 2, 130}, - {0x16, 3, 130}, + {0x02, 0x02, 0x5C}, + {0x09, 0x02, 0x5C}, + {0x17, 0x02, 0x5C}, + {0x28, 0x03, 0x5C}, + {0x02, 0x02, 0xC3}, + {0x09, 0x02, 0xC3}, + {0x17, 0x02, 0xC3}, + {0x28, 0x03, 0xC3}, + {0x02, 0x02, 0xD0}, + {0x09, 0x02, 0xD0}, + {0x17, 0x02, 0xD0}, + {0x28, 0x03, 0xD0}, + {0x01, 0x02, 0x80}, + {0x16, 0x03, 0x80}, + {0x01, 0x02, 0x82}, + {0x16, 0x03, 0x82}, }, /* 98 */ { - {0x03, 2, 92}, - {0x06, 2, 92}, - {0x0a, 2, 92}, - {0x0f, 2, 92}, - {0x18, 2, 92}, - {0x1f, 2, 92}, - {0x29, 2, 92}, - {0x38, 3, 92}, - {0x03, 2, 195}, - {0x06, 2, 195}, - {0x0a, 2, 195}, - {0x0f, 2, 195}, - {0x18, 2, 195}, - {0x1f, 2, 195}, - {0x29, 2, 195}, - {0x38, 3, 195}, + {0x03, 0x02, 0x5C}, + {0x06, 0x02, 0x5C}, + {0x0A, 0x02, 0x5C}, + {0x0F, 0x02, 0x5C}, + {0x18, 0x02, 0x5C}, + {0x1F, 0x02, 0x5C}, + {0x29, 0x02, 0x5C}, + {0x38, 0x03, 0x5C}, + {0x03, 0x02, 0xC3}, + {0x06, 0x02, 0xC3}, + {0x0A, 0x02, 0xC3}, + {0x0F, 0x02, 0xC3}, + {0x18, 0x02, 0xC3}, + {0x1F, 0x02, 0xC3}, + {0x29, 0x02, 0xC3}, + {0x38, 0x03, 0xC3}, }, /* 99 */ { - {0x03, 2, 208}, - {0x06, 2, 208}, - {0x0a, 2, 208}, - {0x0f, 2, 208}, - {0x18, 2, 208}, - {0x1f, 2, 208}, - {0x29, 2, 208}, - {0x38, 3, 208}, - {0x02, 2, 128}, - {0x09, 2, 128}, - {0x17, 2, 128}, - {0x28, 3, 128}, - {0x02, 2, 130}, - {0x09, 2, 130}, - {0x17, 2, 130}, - {0x28, 3, 130}, + {0x03, 0x02, 0xD0}, + {0x06, 0x02, 0xD0}, + {0x0A, 0x02, 0xD0}, + {0x0F, 0x02, 0xD0}, + {0x18, 0x02, 0xD0}, + {0x1F, 0x02, 0xD0}, + {0x29, 0x02, 0xD0}, + {0x38, 0x03, 0xD0}, + {0x02, 0x02, 0x80}, + {0x09, 0x02, 0x80}, + {0x17, 0x02, 0x80}, + {0x28, 0x03, 0x80}, + {0x02, 0x02, 0x82}, + {0x09, 0x02, 0x82}, + {0x17, 0x02, 0x82}, + {0x28, 0x03, 0x82}, }, /* 100 */ { - {0x03, 2, 128}, - {0x06, 2, 128}, - {0x0a, 2, 128}, - {0x0f, 2, 128}, - {0x18, 2, 128}, - {0x1f, 2, 128}, - {0x29, 2, 128}, - {0x38, 3, 128}, - {0x03, 2, 130}, - {0x06, 2, 130}, - {0x0a, 2, 130}, - {0x0f, 2, 130}, - {0x18, 2, 130}, - {0x1f, 2, 130}, - {0x29, 2, 130}, - {0x38, 3, 130}, + {0x03, 0x02, 0x80}, + {0x06, 0x02, 0x80}, + {0x0A, 0x02, 0x80}, + {0x0F, 0x02, 0x80}, + {0x18, 0x02, 0x80}, + {0x1F, 0x02, 0x80}, + {0x29, 0x02, 0x80}, + {0x38, 0x03, 0x80}, + {0x03, 0x02, 0x82}, + {0x06, 0x02, 0x82}, + {0x0A, 0x02, 0x82}, + {0x0F, 0x02, 0x82}, + {0x18, 0x02, 0x82}, + {0x1F, 0x02, 0x82}, + {0x29, 0x02, 0x82}, + {0x38, 0x03, 0x82}, }, /* 101 */ { - {0x01, 2, 131}, - {0x16, 3, 131}, - {0x01, 2, 162}, - {0x16, 3, 162}, - {0x01, 2, 184}, - {0x16, 3, 184}, - {0x01, 2, 194}, - {0x16, 3, 194}, - {0x01, 2, 224}, - {0x16, 3, 224}, - {0x01, 2, 226}, - {0x16, 3, 226}, - {0x00, 3, 153}, - {0x00, 3, 161}, - {0x00, 3, 167}, - {0x00, 3, 172}, + {0x01, 0x02, 0x83}, + {0x16, 0x03, 0x83}, + {0x01, 0x02, 0xA2}, + {0x16, 0x03, 0xA2}, + {0x01, 0x02, 0xB8}, + {0x16, 0x03, 0xB8}, + {0x01, 0x02, 0xC2}, + {0x16, 0x03, 0xC2}, + {0x01, 0x02, 0xE0}, + {0x16, 0x03, 0xE0}, + {0x01, 0x02, 0xE2}, + {0x16, 0x03, 0xE2}, + {0x00, 0x03, 0x99}, + {0x00, 0x03, 0xA1}, + {0x00, 0x03, 0xA7}, + {0x00, 0x03, 0xAC}, }, /* 102 */ { - {0x02, 2, 131}, - {0x09, 2, 131}, - {0x17, 2, 131}, - {0x28, 3, 131}, - {0x02, 2, 162}, - {0x09, 2, 162}, - {0x17, 2, 162}, - {0x28, 3, 162}, - {0x02, 2, 184}, - {0x09, 2, 184}, - {0x17, 2, 184}, - {0x28, 3, 184}, - {0x02, 2, 194}, - {0x09, 2, 194}, - {0x17, 2, 194}, - {0x28, 3, 194}, + {0x02, 0x02, 0x83}, + {0x09, 0x02, 0x83}, + {0x17, 0x02, 0x83}, + {0x28, 0x03, 0x83}, + {0x02, 0x02, 0xA2}, + {0x09, 0x02, 0xA2}, + {0x17, 0x02, 0xA2}, + {0x28, 0x03, 0xA2}, + {0x02, 0x02, 0xB8}, + {0x09, 0x02, 0xB8}, + {0x17, 0x02, 0xB8}, + {0x28, 0x03, 0xB8}, + {0x02, 0x02, 0xC2}, + {0x09, 0x02, 0xC2}, + {0x17, 0x02, 0xC2}, + {0x28, 0x03, 0xC2}, }, /* 103 */ { - {0x03, 2, 131}, - {0x06, 2, 131}, - {0x0a, 2, 131}, - {0x0f, 2, 131}, - {0x18, 2, 131}, - {0x1f, 2, 131}, - {0x29, 2, 131}, - {0x38, 3, 131}, - {0x03, 2, 162}, - {0x06, 2, 162}, - {0x0a, 2, 162}, - {0x0f, 2, 162}, - {0x18, 2, 162}, - {0x1f, 2, 162}, - {0x29, 2, 162}, - {0x38, 3, 162}, + {0x03, 0x02, 0x83}, + {0x06, 0x02, 0x83}, + {0x0A, 0x02, 0x83}, + {0x0F, 0x02, 0x83}, + {0x18, 0x02, 0x83}, + {0x1F, 0x02, 0x83}, + {0x29, 0x02, 0x83}, + {0x38, 0x03, 0x83}, + {0x03, 0x02, 0xA2}, + {0x06, 0x02, 0xA2}, + {0x0A, 0x02, 0xA2}, + {0x0F, 0x02, 0xA2}, + {0x18, 0x02, 0xA2}, + {0x1F, 0x02, 0xA2}, + {0x29, 0x02, 0xA2}, + {0x38, 0x03, 0xA2}, }, /* 104 */ { - {0x03, 2, 184}, - {0x06, 2, 184}, - {0x0a, 2, 184}, - {0x0f, 2, 184}, - {0x18, 2, 184}, - {0x1f, 2, 184}, - {0x29, 2, 184}, - {0x38, 3, 184}, - {0x03, 2, 194}, - {0x06, 2, 194}, - {0x0a, 2, 194}, - {0x0f, 2, 194}, - {0x18, 2, 194}, - {0x1f, 2, 194}, - {0x29, 2, 194}, - {0x38, 3, 194}, + {0x03, 0x02, 0xB8}, + {0x06, 0x02, 0xB8}, + {0x0A, 0x02, 0xB8}, + {0x0F, 0x02, 0xB8}, + {0x18, 0x02, 0xB8}, + {0x1F, 0x02, 0xB8}, + {0x29, 0x02, 0xB8}, + {0x38, 0x03, 0xB8}, + {0x03, 0x02, 0xC2}, + {0x06, 0x02, 0xC2}, + {0x0A, 0x02, 0xC2}, + {0x0F, 0x02, 0xC2}, + {0x18, 0x02, 0xC2}, + {0x1F, 0x02, 0xC2}, + {0x29, 0x02, 0xC2}, + {0x38, 0x03, 0xC2}, }, /* 105 */ { - {0x02, 2, 224}, - {0x09, 2, 224}, - {0x17, 2, 224}, - {0x28, 3, 224}, - {0x02, 2, 226}, - {0x09, 2, 226}, - {0x17, 2, 226}, - {0x28, 3, 226}, - {0x01, 2, 153}, - {0x16, 3, 153}, - {0x01, 2, 161}, - {0x16, 3, 161}, - {0x01, 2, 167}, - {0x16, 3, 167}, - {0x01, 2, 172}, - {0x16, 3, 172}, + {0x02, 0x02, 0xE0}, + {0x09, 0x02, 0xE0}, + {0x17, 0x02, 0xE0}, + {0x28, 0x03, 0xE0}, + {0x02, 0x02, 0xE2}, + {0x09, 0x02, 0xE2}, + {0x17, 0x02, 0xE2}, + {0x28, 0x03, 0xE2}, + {0x01, 0x02, 0x99}, + {0x16, 0x03, 0x99}, + {0x01, 0x02, 0xA1}, + {0x16, 0x03, 0xA1}, + {0x01, 0x02, 0xA7}, + {0x16, 0x03, 0xA7}, + {0x01, 0x02, 0xAC}, + {0x16, 0x03, 0xAC}, }, /* 106 */ { - {0x03, 2, 224}, - {0x06, 2, 224}, - {0x0a, 2, 224}, - {0x0f, 2, 224}, - {0x18, 2, 224}, - {0x1f, 2, 224}, - {0x29, 2, 224}, - {0x38, 3, 224}, - {0x03, 2, 226}, - {0x06, 2, 226}, - {0x0a, 2, 226}, - {0x0f, 2, 226}, - {0x18, 2, 226}, - {0x1f, 2, 226}, - {0x29, 2, 226}, - {0x38, 3, 226}, + {0x03, 0x02, 0xE0}, + {0x06, 0x02, 0xE0}, + {0x0A, 0x02, 0xE0}, + {0x0F, 0x02, 0xE0}, + {0x18, 0x02, 0xE0}, + {0x1F, 0x02, 0xE0}, + {0x29, 0x02, 0xE0}, + {0x38, 0x03, 0xE0}, + {0x03, 0x02, 0xE2}, + {0x06, 0x02, 0xE2}, + {0x0A, 0x02, 0xE2}, + {0x0F, 0x02, 0xE2}, + {0x18, 0x02, 0xE2}, + {0x1F, 0x02, 0xE2}, + {0x29, 0x02, 0xE2}, + {0x38, 0x03, 0xE2}, }, /* 107 */ { - {0x02, 2, 153}, - {0x09, 2, 153}, - {0x17, 2, 153}, - {0x28, 3, 153}, - {0x02, 2, 161}, - {0x09, 2, 161}, - {0x17, 2, 161}, - {0x28, 3, 161}, - {0x02, 2, 167}, - {0x09, 2, 167}, - {0x17, 2, 167}, - {0x28, 3, 167}, - {0x02, 2, 172}, - {0x09, 2, 172}, - {0x17, 2, 172}, - {0x28, 3, 172}, + {0x02, 0x02, 0x99}, + {0x09, 0x02, 0x99}, + {0x17, 0x02, 0x99}, + {0x28, 0x03, 0x99}, + {0x02, 0x02, 0xA1}, + {0x09, 0x02, 0xA1}, + {0x17, 0x02, 0xA1}, + {0x28, 0x03, 0xA1}, + {0x02, 0x02, 0xA7}, + {0x09, 0x02, 0xA7}, + {0x17, 0x02, 0xA7}, + {0x28, 0x03, 0xA7}, + {0x02, 0x02, 0xAC}, + {0x09, 0x02, 0xAC}, + {0x17, 0x02, 0xAC}, + {0x28, 0x03, 0xAC}, }, /* 108 */ { - {0x03, 2, 153}, - {0x06, 2, 153}, - {0x0a, 2, 153}, - {0x0f, 2, 153}, - {0x18, 2, 153}, - {0x1f, 2, 153}, - {0x29, 2, 153}, - {0x38, 3, 153}, - {0x03, 2, 161}, - {0x06, 2, 161}, - {0x0a, 2, 161}, - {0x0f, 2, 161}, - {0x18, 2, 161}, - {0x1f, 2, 161}, - {0x29, 2, 161}, - {0x38, 3, 161}, + {0x03, 0x02, 0x99}, + {0x06, 0x02, 0x99}, + {0x0A, 0x02, 0x99}, + {0x0F, 0x02, 0x99}, + {0x18, 0x02, 0x99}, + {0x1F, 0x02, 0x99}, + {0x29, 0x02, 0x99}, + {0x38, 0x03, 0x99}, + {0x03, 0x02, 0xA1}, + {0x06, 0x02, 0xA1}, + {0x0A, 0x02, 0xA1}, + {0x0F, 0x02, 0xA1}, + {0x18, 0x02, 0xA1}, + {0x1F, 0x02, 0xA1}, + {0x29, 0x02, 0xA1}, + {0x38, 0x03, 0xA1}, }, /* 109 */ { - {0x03, 2, 167}, - {0x06, 2, 167}, - {0x0a, 2, 167}, - {0x0f, 2, 167}, - {0x18, 2, 167}, - {0x1f, 2, 167}, - {0x29, 2, 167}, - {0x38, 3, 167}, - {0x03, 2, 172}, - {0x06, 2, 172}, - {0x0a, 2, 172}, - {0x0f, 2, 172}, - {0x18, 2, 172}, - {0x1f, 2, 172}, - {0x29, 2, 172}, - {0x38, 3, 172}, + {0x03, 0x02, 0xA7}, + {0x06, 0x02, 0xA7}, + {0x0A, 0x02, 0xA7}, + {0x0F, 0x02, 0xA7}, + {0x18, 0x02, 0xA7}, + {0x1F, 0x02, 0xA7}, + {0x29, 0x02, 0xA7}, + {0x38, 0x03, 0xA7}, + {0x03, 0x02, 0xAC}, + {0x06, 0x02, 0xAC}, + {0x0A, 0x02, 0xAC}, + {0x0F, 0x02, 0xAC}, + {0x18, 0x02, 0xAC}, + {0x1F, 0x02, 0xAC}, + {0x29, 0x02, 0xAC}, + {0x38, 0x03, 0xAC}, }, /* 110 */ { - {0x72, 0, 0}, - {0x73, 0, 0}, - {0x75, 0, 0}, - {0x76, 0, 0}, - {0x79, 0, 0}, - {0x7b, 0, 0}, - {0x7f, 0, 0}, - {0x82, 0, 0}, - {0x88, 0, 0}, - {0x8b, 0, 0}, - {0x8f, 0, 0}, - {0x92, 0, 0}, - {0x9b, 0, 0}, - {0xa2, 0, 0}, - {0xaa, 0, 0}, - {0xb4, 0, 0}, + {0x72, 0x00, 0x00}, + {0x73, 0x00, 0x00}, + {0x75, 0x00, 0x00}, + {0x76, 0x00, 0x00}, + {0x79, 0x00, 0x00}, + {0x7B, 0x00, 0x00}, + {0x7F, 0x00, 0x00}, + {0x82, 0x00, 0x00}, + {0x88, 0x00, 0x00}, + {0x8B, 0x00, 0x00}, + {0x8F, 0x00, 0x00}, + {0x92, 0x00, 0x00}, + {0x9B, 0x00, 0x00}, + {0xA2, 0x00, 0x00}, + {0xAA, 0x00, 0x00}, + {0xB4, 0x00, 0x00}, }, /* 111 */ { - {0x00, 3, 176}, - {0x00, 3, 177}, - {0x00, 3, 179}, - {0x00, 3, 209}, - {0x00, 3, 216}, - {0x00, 3, 217}, - {0x00, 3, 227}, - {0x00, 3, 229}, - {0x00, 3, 230}, - {0x7a, 0, 0}, - {0x7c, 0, 0}, - {0x7d, 0, 0}, - {0x80, 0, 0}, - {0x81, 0, 0}, - {0x83, 0, 0}, - {0x84, 0, 0}, + {0x00, 0x03, 0xB0}, + {0x00, 0x03, 0xB1}, + {0x00, 0x03, 0xB3}, + {0x00, 0x03, 0xD1}, + {0x00, 0x03, 0xD8}, + {0x00, 0x03, 0xD9}, + {0x00, 0x03, 0xE3}, + {0x00, 0x03, 0xE5}, + {0x00, 0x03, 0xE6}, + {0x7A, 0x00, 0x00}, + {0x7C, 0x00, 0x00}, + {0x7D, 0x00, 0x00}, + {0x80, 0x00, 0x00}, + {0x81, 0x00, 0x00}, + {0x83, 0x00, 0x00}, + {0x84, 0x00, 0x00}, }, /* 112 */ { - {0x01, 2, 176}, - {0x16, 3, 176}, - {0x01, 2, 177}, - {0x16, 3, 177}, - {0x01, 2, 179}, - {0x16, 3, 179}, - {0x01, 2, 209}, - {0x16, 3, 209}, - {0x01, 2, 216}, - {0x16, 3, 216}, - {0x01, 2, 217}, - {0x16, 3, 217}, - {0x01, 2, 227}, - {0x16, 3, 227}, - {0x01, 2, 229}, - {0x16, 3, 229}, + {0x01, 0x02, 0xB0}, + {0x16, 0x03, 0xB0}, + {0x01, 0x02, 0xB1}, + {0x16, 0x03, 0xB1}, + {0x01, 0x02, 0xB3}, + {0x16, 0x03, 0xB3}, + {0x01, 0x02, 0xD1}, + {0x16, 0x03, 0xD1}, + {0x01, 0x02, 0xD8}, + {0x16, 0x03, 0xD8}, + {0x01, 0x02, 0xD9}, + {0x16, 0x03, 0xD9}, + {0x01, 0x02, 0xE3}, + {0x16, 0x03, 0xE3}, + {0x01, 0x02, 0xE5}, + {0x16, 0x03, 0xE5}, }, /* 113 */ { - {0x02, 2, 176}, - {0x09, 2, 176}, - {0x17, 2, 176}, - {0x28, 3, 176}, - {0x02, 2, 177}, - {0x09, 2, 177}, - {0x17, 2, 177}, - {0x28, 3, 177}, - {0x02, 2, 179}, - {0x09, 2, 179}, - {0x17, 2, 179}, - {0x28, 3, 179}, - {0x02, 2, 209}, - {0x09, 2, 209}, - {0x17, 2, 209}, - {0x28, 3, 209}, + {0x02, 0x02, 0xB0}, + {0x09, 0x02, 0xB0}, + {0x17, 0x02, 0xB0}, + {0x28, 0x03, 0xB0}, + {0x02, 0x02, 0xB1}, + {0x09, 0x02, 0xB1}, + {0x17, 0x02, 0xB1}, + {0x28, 0x03, 0xB1}, + {0x02, 0x02, 0xB3}, + {0x09, 0x02, 0xB3}, + {0x17, 0x02, 0xB3}, + {0x28, 0x03, 0xB3}, + {0x02, 0x02, 0xD1}, + {0x09, 0x02, 0xD1}, + {0x17, 0x02, 0xD1}, + {0x28, 0x03, 0xD1}, }, /* 114 */ { - {0x03, 2, 176}, - {0x06, 2, 176}, - {0x0a, 2, 176}, - {0x0f, 2, 176}, - {0x18, 2, 176}, - {0x1f, 2, 176}, - {0x29, 2, 176}, - {0x38, 3, 176}, - {0x03, 2, 177}, - {0x06, 2, 177}, - {0x0a, 2, 177}, - {0x0f, 2, 177}, - {0x18, 2, 177}, - {0x1f, 2, 177}, - {0x29, 2, 177}, - {0x38, 3, 177}, + {0x03, 0x02, 0xB0}, + {0x06, 0x02, 0xB0}, + {0x0A, 0x02, 0xB0}, + {0x0F, 0x02, 0xB0}, + {0x18, 0x02, 0xB0}, + {0x1F, 0x02, 0xB0}, + {0x29, 0x02, 0xB0}, + {0x38, 0x03, 0xB0}, + {0x03, 0x02, 0xB1}, + {0x06, 0x02, 0xB1}, + {0x0A, 0x02, 0xB1}, + {0x0F, 0x02, 0xB1}, + {0x18, 0x02, 0xB1}, + {0x1F, 0x02, 0xB1}, + {0x29, 0x02, 0xB1}, + {0x38, 0x03, 0xB1}, }, /* 115 */ { - {0x03, 2, 179}, - {0x06, 2, 179}, - {0x0a, 2, 179}, - {0x0f, 2, 179}, - {0x18, 2, 179}, - {0x1f, 2, 179}, - {0x29, 2, 179}, - {0x38, 3, 179}, - {0x03, 2, 209}, - {0x06, 2, 209}, - {0x0a, 2, 209}, - {0x0f, 2, 209}, - {0x18, 2, 209}, - {0x1f, 2, 209}, - {0x29, 2, 209}, - {0x38, 3, 209}, + {0x03, 0x02, 0xB3}, + {0x06, 0x02, 0xB3}, + {0x0A, 0x02, 0xB3}, + {0x0F, 0x02, 0xB3}, + {0x18, 0x02, 0xB3}, + {0x1F, 0x02, 0xB3}, + {0x29, 0x02, 0xB3}, + {0x38, 0x03, 0xB3}, + {0x03, 0x02, 0xD1}, + {0x06, 0x02, 0xD1}, + {0x0A, 0x02, 0xD1}, + {0x0F, 0x02, 0xD1}, + {0x18, 0x02, 0xD1}, + {0x1F, 0x02, 0xD1}, + {0x29, 0x02, 0xD1}, + {0x38, 0x03, 0xD1}, }, /* 116 */ { - {0x02, 2, 216}, - {0x09, 2, 216}, - {0x17, 2, 216}, - {0x28, 3, 216}, - {0x02, 2, 217}, - {0x09, 2, 217}, - {0x17, 2, 217}, - {0x28, 3, 217}, - {0x02, 2, 227}, - {0x09, 2, 227}, - {0x17, 2, 227}, - {0x28, 3, 227}, - {0x02, 2, 229}, - {0x09, 2, 229}, - {0x17, 2, 229}, - {0x28, 3, 229}, + {0x02, 0x02, 0xD8}, + {0x09, 0x02, 0xD8}, + {0x17, 0x02, 0xD8}, + {0x28, 0x03, 0xD8}, + {0x02, 0x02, 0xD9}, + {0x09, 0x02, 0xD9}, + {0x17, 0x02, 0xD9}, + {0x28, 0x03, 0xD9}, + {0x02, 0x02, 0xE3}, + {0x09, 0x02, 0xE3}, + {0x17, 0x02, 0xE3}, + {0x28, 0x03, 0xE3}, + {0x02, 0x02, 0xE5}, + {0x09, 0x02, 0xE5}, + {0x17, 0x02, 0xE5}, + {0x28, 0x03, 0xE5}, }, /* 117 */ { - {0x03, 2, 216}, - {0x06, 2, 216}, - {0x0a, 2, 216}, - {0x0f, 2, 216}, - {0x18, 2, 216}, - {0x1f, 2, 216}, - {0x29, 2, 216}, - {0x38, 3, 216}, - {0x03, 2, 217}, - {0x06, 2, 217}, - {0x0a, 2, 217}, - {0x0f, 2, 217}, - {0x18, 2, 217}, - {0x1f, 2, 217}, - {0x29, 2, 217}, - {0x38, 3, 217}, + {0x03, 0x02, 0xD8}, + {0x06, 0x02, 0xD8}, + {0x0A, 0x02, 0xD8}, + {0x0F, 0x02, 0xD8}, + {0x18, 0x02, 0xD8}, + {0x1F, 0x02, 0xD8}, + {0x29, 0x02, 0xD8}, + {0x38, 0x03, 0xD8}, + {0x03, 0x02, 0xD9}, + {0x06, 0x02, 0xD9}, + {0x0A, 0x02, 0xD9}, + {0x0F, 0x02, 0xD9}, + {0x18, 0x02, 0xD9}, + {0x1F, 0x02, 0xD9}, + {0x29, 0x02, 0xD9}, + {0x38, 0x03, 0xD9}, }, /* 118 */ { - {0x03, 2, 227}, - {0x06, 2, 227}, - {0x0a, 2, 227}, - {0x0f, 2, 227}, - {0x18, 2, 227}, - {0x1f, 2, 227}, - {0x29, 2, 227}, - {0x38, 3, 227}, - {0x03, 2, 229}, - {0x06, 2, 229}, - {0x0a, 2, 229}, - {0x0f, 2, 229}, - {0x18, 2, 229}, - {0x1f, 2, 229}, - {0x29, 2, 229}, - {0x38, 3, 229}, + {0x03, 0x02, 0xE3}, + {0x06, 0x02, 0xE3}, + {0x0A, 0x02, 0xE3}, + {0x0F, 0x02, 0xE3}, + {0x18, 0x02, 0xE3}, + {0x1F, 0x02, 0xE3}, + {0x29, 0x02, 0xE3}, + {0x38, 0x03, 0xE3}, + {0x03, 0x02, 0xE5}, + {0x06, 0x02, 0xE5}, + {0x0A, 0x02, 0xE5}, + {0x0F, 0x02, 0xE5}, + {0x18, 0x02, 0xE5}, + {0x1F, 0x02, 0xE5}, + {0x29, 0x02, 0xE5}, + {0x38, 0x03, 0xE5}, }, /* 119 */ { - {0x01, 2, 230}, - {0x16, 3, 230}, - {0x00, 3, 129}, - {0x00, 3, 132}, - {0x00, 3, 133}, - {0x00, 3, 134}, - {0x00, 3, 136}, - {0x00, 3, 146}, - {0x00, 3, 154}, - {0x00, 3, 156}, - {0x00, 3, 160}, - {0x00, 3, 163}, - {0x00, 3, 164}, - {0x00, 3, 169}, - {0x00, 3, 170}, - {0x00, 3, 173}, + {0x01, 0x02, 0xE6}, + {0x16, 0x03, 0xE6}, + {0x00, 0x03, 0x81}, + {0x00, 0x03, 0x84}, + {0x00, 0x03, 0x85}, + {0x00, 0x03, 0x86}, + {0x00, 0x03, 0x88}, + {0x00, 0x03, 0x92}, + {0x00, 0x03, 0x9A}, + {0x00, 0x03, 0x9C}, + {0x00, 0x03, 0xA0}, + {0x00, 0x03, 0xA3}, + {0x00, 0x03, 0xA4}, + {0x00, 0x03, 0xA9}, + {0x00, 0x03, 0xAA}, + {0x00, 0x03, 0xAD}, }, /* 120 */ { - {0x02, 2, 230}, - {0x09, 2, 230}, - {0x17, 2, 230}, - {0x28, 3, 230}, - {0x01, 2, 129}, - {0x16, 3, 129}, - {0x01, 2, 132}, - {0x16, 3, 132}, - {0x01, 2, 133}, - {0x16, 3, 133}, - {0x01, 2, 134}, - {0x16, 3, 134}, - {0x01, 2, 136}, - {0x16, 3, 136}, - {0x01, 2, 146}, - {0x16, 3, 146}, + {0x02, 0x02, 0xE6}, + {0x09, 0x02, 0xE6}, + {0x17, 0x02, 0xE6}, + {0x28, 0x03, 0xE6}, + {0x01, 0x02, 0x81}, + {0x16, 0x03, 0x81}, + {0x01, 0x02, 0x84}, + {0x16, 0x03, 0x84}, + {0x01, 0x02, 0x85}, + {0x16, 0x03, 0x85}, + {0x01, 0x02, 0x86}, + {0x16, 0x03, 0x86}, + {0x01, 0x02, 0x88}, + {0x16, 0x03, 0x88}, + {0x01, 0x02, 0x92}, + {0x16, 0x03, 0x92}, }, /* 121 */ { - {0x03, 2, 230}, - {0x06, 2, 230}, - {0x0a, 2, 230}, - {0x0f, 2, 230}, - {0x18, 2, 230}, - {0x1f, 2, 230}, - {0x29, 2, 230}, - {0x38, 3, 230}, - {0x02, 2, 129}, - {0x09, 2, 129}, - {0x17, 2, 129}, - {0x28, 3, 129}, - {0x02, 2, 132}, - {0x09, 2, 132}, - {0x17, 2, 132}, - {0x28, 3, 132}, + {0x03, 0x02, 0xE6}, + {0x06, 0x02, 0xE6}, + {0x0A, 0x02, 0xE6}, + {0x0F, 0x02, 0xE6}, + {0x18, 0x02, 0xE6}, + {0x1F, 0x02, 0xE6}, + {0x29, 0x02, 0xE6}, + {0x38, 0x03, 0xE6}, + {0x02, 0x02, 0x81}, + {0x09, 0x02, 0x81}, + {0x17, 0x02, 0x81}, + {0x28, 0x03, 0x81}, + {0x02, 0x02, 0x84}, + {0x09, 0x02, 0x84}, + {0x17, 0x02, 0x84}, + {0x28, 0x03, 0x84}, }, /* 122 */ { - {0x03, 2, 129}, - {0x06, 2, 129}, - {0x0a, 2, 129}, - {0x0f, 2, 129}, - {0x18, 2, 129}, - {0x1f, 2, 129}, - {0x29, 2, 129}, - {0x38, 3, 129}, - {0x03, 2, 132}, - {0x06, 2, 132}, - {0x0a, 2, 132}, - {0x0f, 2, 132}, - {0x18, 2, 132}, - {0x1f, 2, 132}, - {0x29, 2, 132}, - {0x38, 3, 132}, + {0x03, 0x02, 0x81}, + {0x06, 0x02, 0x81}, + {0x0A, 0x02, 0x81}, + {0x0F, 0x02, 0x81}, + {0x18, 0x02, 0x81}, + {0x1F, 0x02, 0x81}, + {0x29, 0x02, 0x81}, + {0x38, 0x03, 0x81}, + {0x03, 0x02, 0x84}, + {0x06, 0x02, 0x84}, + {0x0A, 0x02, 0x84}, + {0x0F, 0x02, 0x84}, + {0x18, 0x02, 0x84}, + {0x1F, 0x02, 0x84}, + {0x29, 0x02, 0x84}, + {0x38, 0x03, 0x84}, }, /* 123 */ { - {0x02, 2, 133}, - {0x09, 2, 133}, - {0x17, 2, 133}, - {0x28, 3, 133}, - {0x02, 2, 134}, - {0x09, 2, 134}, - {0x17, 2, 134}, - {0x28, 3, 134}, - {0x02, 2, 136}, - {0x09, 2, 136}, - {0x17, 2, 136}, - {0x28, 3, 136}, - {0x02, 2, 146}, - {0x09, 2, 146}, - {0x17, 2, 146}, - {0x28, 3, 146}, + {0x02, 0x02, 0x85}, + {0x09, 0x02, 0x85}, + {0x17, 0x02, 0x85}, + {0x28, 0x03, 0x85}, + {0x02, 0x02, 0x86}, + {0x09, 0x02, 0x86}, + {0x17, 0x02, 0x86}, + {0x28, 0x03, 0x86}, + {0x02, 0x02, 0x88}, + {0x09, 0x02, 0x88}, + {0x17, 0x02, 0x88}, + {0x28, 0x03, 0x88}, + {0x02, 0x02, 0x92}, + {0x09, 0x02, 0x92}, + {0x17, 0x02, 0x92}, + {0x28, 0x03, 0x92}, }, /* 124 */ { - {0x03, 2, 133}, - {0x06, 2, 133}, - {0x0a, 2, 133}, - {0x0f, 2, 133}, - {0x18, 2, 133}, - {0x1f, 2, 133}, - {0x29, 2, 133}, - {0x38, 3, 133}, - {0x03, 2, 134}, - {0x06, 2, 134}, - {0x0a, 2, 134}, - {0x0f, 2, 134}, - {0x18, 2, 134}, - {0x1f, 2, 134}, - {0x29, 2, 134}, - {0x38, 3, 134}, + {0x03, 0x02, 0x85}, + {0x06, 0x02, 0x85}, + {0x0A, 0x02, 0x85}, + {0x0F, 0x02, 0x85}, + {0x18, 0x02, 0x85}, + {0x1F, 0x02, 0x85}, + {0x29, 0x02, 0x85}, + {0x38, 0x03, 0x85}, + {0x03, 0x02, 0x86}, + {0x06, 0x02, 0x86}, + {0x0A, 0x02, 0x86}, + {0x0F, 0x02, 0x86}, + {0x18, 0x02, 0x86}, + {0x1F, 0x02, 0x86}, + {0x29, 0x02, 0x86}, + {0x38, 0x03, 0x86}, }, /* 125 */ { - {0x03, 2, 136}, - {0x06, 2, 136}, - {0x0a, 2, 136}, - {0x0f, 2, 136}, - {0x18, 2, 136}, - {0x1f, 2, 136}, - {0x29, 2, 136}, - {0x38, 3, 136}, - {0x03, 2, 146}, - {0x06, 2, 146}, - {0x0a, 2, 146}, - {0x0f, 2, 146}, - {0x18, 2, 146}, - {0x1f, 2, 146}, - {0x29, 2, 146}, - {0x38, 3, 146}, + {0x03, 0x02, 0x88}, + {0x06, 0x02, 0x88}, + {0x0A, 0x02, 0x88}, + {0x0F, 0x02, 0x88}, + {0x18, 0x02, 0x88}, + {0x1F, 0x02, 0x88}, + {0x29, 0x02, 0x88}, + {0x38, 0x03, 0x88}, + {0x03, 0x02, 0x92}, + {0x06, 0x02, 0x92}, + {0x0A, 0x02, 0x92}, + {0x0F, 0x02, 0x92}, + {0x18, 0x02, 0x92}, + {0x1F, 0x02, 0x92}, + {0x29, 0x02, 0x92}, + {0x38, 0x03, 0x92}, }, /* 126 */ { - {0x01, 2, 154}, - {0x16, 3, 154}, - {0x01, 2, 156}, - {0x16, 3, 156}, - {0x01, 2, 160}, - {0x16, 3, 160}, - {0x01, 2, 163}, - {0x16, 3, 163}, - {0x01, 2, 164}, - {0x16, 3, 164}, - {0x01, 2, 169}, - {0x16, 3, 169}, - {0x01, 2, 170}, - {0x16, 3, 170}, - {0x01, 2, 173}, - {0x16, 3, 173}, + {0x01, 0x02, 0x9A}, + {0x16, 0x03, 0x9A}, + {0x01, 0x02, 0x9C}, + {0x16, 0x03, 0x9C}, + {0x01, 0x02, 0xA0}, + {0x16, 0x03, 0xA0}, + {0x01, 0x02, 0xA3}, + {0x16, 0x03, 0xA3}, + {0x01, 0x02, 0xA4}, + {0x16, 0x03, 0xA4}, + {0x01, 0x02, 0xA9}, + {0x16, 0x03, 0xA9}, + {0x01, 0x02, 0xAA}, + {0x16, 0x03, 0xAA}, + {0x01, 0x02, 0xAD}, + {0x16, 0x03, 0xAD}, }, /* 127 */ { - {0x02, 2, 154}, - {0x09, 2, 154}, - {0x17, 2, 154}, - {0x28, 3, 154}, - {0x02, 2, 156}, - {0x09, 2, 156}, - {0x17, 2, 156}, - {0x28, 3, 156}, - {0x02, 2, 160}, - {0x09, 2, 160}, - {0x17, 2, 160}, - {0x28, 3, 160}, - {0x02, 2, 163}, - {0x09, 2, 163}, - {0x17, 2, 163}, - {0x28, 3, 163}, + {0x02, 0x02, 0x9A}, + {0x09, 0x02, 0x9A}, + {0x17, 0x02, 0x9A}, + {0x28, 0x03, 0x9A}, + {0x02, 0x02, 0x9C}, + {0x09, 0x02, 0x9C}, + {0x17, 0x02, 0x9C}, + {0x28, 0x03, 0x9C}, + {0x02, 0x02, 0xA0}, + {0x09, 0x02, 0xA0}, + {0x17, 0x02, 0xA0}, + {0x28, 0x03, 0xA0}, + {0x02, 0x02, 0xA3}, + {0x09, 0x02, 0xA3}, + {0x17, 0x02, 0xA3}, + {0x28, 0x03, 0xA3}, }, /* 128 */ { - {0x03, 2, 154}, - {0x06, 2, 154}, - {0x0a, 2, 154}, - {0x0f, 2, 154}, - {0x18, 2, 154}, - {0x1f, 2, 154}, - {0x29, 2, 154}, - {0x38, 3, 154}, - {0x03, 2, 156}, - {0x06, 2, 156}, - {0x0a, 2, 156}, - {0x0f, 2, 156}, - {0x18, 2, 156}, - {0x1f, 2, 156}, - {0x29, 2, 156}, - {0x38, 3, 156}, + {0x03, 0x02, 0x9A}, + {0x06, 0x02, 0x9A}, + {0x0A, 0x02, 0x9A}, + {0x0F, 0x02, 0x9A}, + {0x18, 0x02, 0x9A}, + {0x1F, 0x02, 0x9A}, + {0x29, 0x02, 0x9A}, + {0x38, 0x03, 0x9A}, + {0x03, 0x02, 0x9C}, + {0x06, 0x02, 0x9C}, + {0x0A, 0x02, 0x9C}, + {0x0F, 0x02, 0x9C}, + {0x18, 0x02, 0x9C}, + {0x1F, 0x02, 0x9C}, + {0x29, 0x02, 0x9C}, + {0x38, 0x03, 0x9C}, }, /* 129 */ { - {0x03, 2, 160}, - {0x06, 2, 160}, - {0x0a, 2, 160}, - {0x0f, 2, 160}, - {0x18, 2, 160}, - {0x1f, 2, 160}, - {0x29, 2, 160}, - {0x38, 3, 160}, - {0x03, 2, 163}, - {0x06, 2, 163}, - {0x0a, 2, 163}, - {0x0f, 2, 163}, - {0x18, 2, 163}, - {0x1f, 2, 163}, - {0x29, 2, 163}, - {0x38, 3, 163}, + {0x03, 0x02, 0xA0}, + {0x06, 0x02, 0xA0}, + {0x0A, 0x02, 0xA0}, + {0x0F, 0x02, 0xA0}, + {0x18, 0x02, 0xA0}, + {0x1F, 0x02, 0xA0}, + {0x29, 0x02, 0xA0}, + {0x38, 0x03, 0xA0}, + {0x03, 0x02, 0xA3}, + {0x06, 0x02, 0xA3}, + {0x0A, 0x02, 0xA3}, + {0x0F, 0x02, 0xA3}, + {0x18, 0x02, 0xA3}, + {0x1F, 0x02, 0xA3}, + {0x29, 0x02, 0xA3}, + {0x38, 0x03, 0xA3}, }, /* 130 */ { - {0x02, 2, 164}, - {0x09, 2, 164}, - {0x17, 2, 164}, - {0x28, 3, 164}, - {0x02, 2, 169}, - {0x09, 2, 169}, - {0x17, 2, 169}, - {0x28, 3, 169}, - {0x02, 2, 170}, - {0x09, 2, 170}, - {0x17, 2, 170}, - {0x28, 3, 170}, - {0x02, 2, 173}, - {0x09, 2, 173}, - {0x17, 2, 173}, - {0x28, 3, 173}, + {0x02, 0x02, 0xA4}, + {0x09, 0x02, 0xA4}, + {0x17, 0x02, 0xA4}, + {0x28, 0x03, 0xA4}, + {0x02, 0x02, 0xA9}, + {0x09, 0x02, 0xA9}, + {0x17, 0x02, 0xA9}, + {0x28, 0x03, 0xA9}, + {0x02, 0x02, 0xAA}, + {0x09, 0x02, 0xAA}, + {0x17, 0x02, 0xAA}, + {0x28, 0x03, 0xAA}, + {0x02, 0x02, 0xAD}, + {0x09, 0x02, 0xAD}, + {0x17, 0x02, 0xAD}, + {0x28, 0x03, 0xAD}, }, /* 131 */ { - {0x03, 2, 164}, - {0x06, 2, 164}, - {0x0a, 2, 164}, - {0x0f, 2, 164}, - {0x18, 2, 164}, - {0x1f, 2, 164}, - {0x29, 2, 164}, - {0x38, 3, 164}, - {0x03, 2, 169}, - {0x06, 2, 169}, - {0x0a, 2, 169}, - {0x0f, 2, 169}, - {0x18, 2, 169}, - {0x1f, 2, 169}, - {0x29, 2, 169}, - {0x38, 3, 169}, + {0x03, 0x02, 0xA4}, + {0x06, 0x02, 0xA4}, + {0x0A, 0x02, 0xA4}, + {0x0F, 0x02, 0xA4}, + {0x18, 0x02, 0xA4}, + {0x1F, 0x02, 0xA4}, + {0x29, 0x02, 0xA4}, + {0x38, 0x03, 0xA4}, + {0x03, 0x02, 0xA9}, + {0x06, 0x02, 0xA9}, + {0x0A, 0x02, 0xA9}, + {0x0F, 0x02, 0xA9}, + {0x18, 0x02, 0xA9}, + {0x1F, 0x02, 0xA9}, + {0x29, 0x02, 0xA9}, + {0x38, 0x03, 0xA9}, }, /* 132 */ { - {0x03, 2, 170}, - {0x06, 2, 170}, - {0x0a, 2, 170}, - {0x0f, 2, 170}, - {0x18, 2, 170}, - {0x1f, 2, 170}, - {0x29, 2, 170}, - {0x38, 3, 170}, - {0x03, 2, 173}, - {0x06, 2, 173}, - {0x0a, 2, 173}, - {0x0f, 2, 173}, - {0x18, 2, 173}, - {0x1f, 2, 173}, - {0x29, 2, 173}, - {0x38, 3, 173}, + {0x03, 0x02, 0xAA}, + {0x06, 0x02, 0xAA}, + {0x0A, 0x02, 0xAA}, + {0x0F, 0x02, 0xAA}, + {0x18, 0x02, 0xAA}, + {0x1F, 0x02, 0xAA}, + {0x29, 0x02, 0xAA}, + {0x38, 0x03, 0xAA}, + {0x03, 0x02, 0xAD}, + {0x06, 0x02, 0xAD}, + {0x0A, 0x02, 0xAD}, + {0x0F, 0x02, 0xAD}, + {0x18, 0x02, 0xAD}, + {0x1F, 0x02, 0xAD}, + {0x29, 0x02, 0xAD}, + {0x38, 0x03, 0xAD}, }, /* 133 */ { - {0x89, 0, 0}, - {0x8a, 0, 0}, - {0x8c, 0, 0}, - {0x8d, 0, 0}, - {0x90, 0, 0}, - {0x91, 0, 0}, - {0x93, 0, 0}, - {0x96, 0, 0}, - {0x9c, 0, 0}, - {0x9f, 0, 0}, - {0xa3, 0, 0}, - {0xa6, 0, 0}, - {0xab, 0, 0}, - {0xae, 0, 0}, - {0xb5, 0, 0}, - {0xbe, 0, 0}, + {0x89, 0x00, 0x00}, + {0x8A, 0x00, 0x00}, + {0x8C, 0x00, 0x00}, + {0x8D, 0x00, 0x00}, + {0x90, 0x00, 0x00}, + {0x91, 0x00, 0x00}, + {0x93, 0x00, 0x00}, + {0x96, 0x00, 0x00}, + {0x9C, 0x00, 0x00}, + {0x9F, 0x00, 0x00}, + {0xA3, 0x00, 0x00}, + {0xA6, 0x00, 0x00}, + {0xAB, 0x00, 0x00}, + {0xAE, 0x00, 0x00}, + {0xB5, 0x00, 0x00}, + {0xBE, 0x00, 0x00}, }, /* 134 */ { - {0x00, 3, 178}, - {0x00, 3, 181}, - {0x00, 3, 185}, - {0x00, 3, 186}, - {0x00, 3, 187}, - {0x00, 3, 189}, - {0x00, 3, 190}, - {0x00, 3, 196}, - {0x00, 3, 198}, - {0x00, 3, 228}, - {0x00, 3, 232}, - {0x00, 3, 233}, - {0x94, 0, 0}, - {0x95, 0, 0}, - {0x97, 0, 0}, - {0x98, 0, 0}, + {0x00, 0x03, 0xB2}, + {0x00, 0x03, 0xB5}, + {0x00, 0x03, 0xB9}, + {0x00, 0x03, 0xBA}, + {0x00, 0x03, 0xBB}, + {0x00, 0x03, 0xBD}, + {0x00, 0x03, 0xBE}, + {0x00, 0x03, 0xC4}, + {0x00, 0x03, 0xC6}, + {0x00, 0x03, 0xE4}, + {0x00, 0x03, 0xE8}, + {0x00, 0x03, 0xE9}, + {0x94, 0x00, 0x00}, + {0x95, 0x00, 0x00}, + {0x97, 0x00, 0x00}, + {0x98, 0x00, 0x00}, }, /* 135 */ { - {0x01, 2, 178}, - {0x16, 3, 178}, - {0x01, 2, 181}, - {0x16, 3, 181}, - {0x01, 2, 185}, - {0x16, 3, 185}, - {0x01, 2, 186}, - {0x16, 3, 186}, - {0x01, 2, 187}, - {0x16, 3, 187}, - {0x01, 2, 189}, - {0x16, 3, 189}, - {0x01, 2, 190}, - {0x16, 3, 190}, - {0x01, 2, 196}, - {0x16, 3, 196}, + {0x01, 0x02, 0xB2}, + {0x16, 0x03, 0xB2}, + {0x01, 0x02, 0xB5}, + {0x16, 0x03, 0xB5}, + {0x01, 0x02, 0xB9}, + {0x16, 0x03, 0xB9}, + {0x01, 0x02, 0xBA}, + {0x16, 0x03, 0xBA}, + {0x01, 0x02, 0xBB}, + {0x16, 0x03, 0xBB}, + {0x01, 0x02, 0xBD}, + {0x16, 0x03, 0xBD}, + {0x01, 0x02, 0xBE}, + {0x16, 0x03, 0xBE}, + {0x01, 0x02, 0xC4}, + {0x16, 0x03, 0xC4}, }, /* 136 */ { - {0x02, 2, 178}, - {0x09, 2, 178}, - {0x17, 2, 178}, - {0x28, 3, 178}, - {0x02, 2, 181}, - {0x09, 2, 181}, - {0x17, 2, 181}, - {0x28, 3, 181}, - {0x02, 2, 185}, - {0x09, 2, 185}, - {0x17, 2, 185}, - {0x28, 3, 185}, - {0x02, 2, 186}, - {0x09, 2, 186}, - {0x17, 2, 186}, - {0x28, 3, 186}, + {0x02, 0x02, 0xB2}, + {0x09, 0x02, 0xB2}, + {0x17, 0x02, 0xB2}, + {0x28, 0x03, 0xB2}, + {0x02, 0x02, 0xB5}, + {0x09, 0x02, 0xB5}, + {0x17, 0x02, 0xB5}, + {0x28, 0x03, 0xB5}, + {0x02, 0x02, 0xB9}, + {0x09, 0x02, 0xB9}, + {0x17, 0x02, 0xB9}, + {0x28, 0x03, 0xB9}, + {0x02, 0x02, 0xBA}, + {0x09, 0x02, 0xBA}, + {0x17, 0x02, 0xBA}, + {0x28, 0x03, 0xBA}, }, /* 137 */ { - {0x03, 2, 178}, - {0x06, 2, 178}, - {0x0a, 2, 178}, - {0x0f, 2, 178}, - {0x18, 2, 178}, - {0x1f, 2, 178}, - {0x29, 2, 178}, - {0x38, 3, 178}, - {0x03, 2, 181}, - {0x06, 2, 181}, - {0x0a, 2, 181}, - {0x0f, 2, 181}, - {0x18, 2, 181}, - {0x1f, 2, 181}, - {0x29, 2, 181}, - {0x38, 3, 181}, + {0x03, 0x02, 0xB2}, + {0x06, 0x02, 0xB2}, + {0x0A, 0x02, 0xB2}, + {0x0F, 0x02, 0xB2}, + {0x18, 0x02, 0xB2}, + {0x1F, 0x02, 0xB2}, + {0x29, 0x02, 0xB2}, + {0x38, 0x03, 0xB2}, + {0x03, 0x02, 0xB5}, + {0x06, 0x02, 0xB5}, + {0x0A, 0x02, 0xB5}, + {0x0F, 0x02, 0xB5}, + {0x18, 0x02, 0xB5}, + {0x1F, 0x02, 0xB5}, + {0x29, 0x02, 0xB5}, + {0x38, 0x03, 0xB5}, }, /* 138 */ { - {0x03, 2, 185}, - {0x06, 2, 185}, - {0x0a, 2, 185}, - {0x0f, 2, 185}, - {0x18, 2, 185}, - {0x1f, 2, 185}, - {0x29, 2, 185}, - {0x38, 3, 185}, - {0x03, 2, 186}, - {0x06, 2, 186}, - {0x0a, 2, 186}, - {0x0f, 2, 186}, - {0x18, 2, 186}, - {0x1f, 2, 186}, - {0x29, 2, 186}, - {0x38, 3, 186}, + {0x03, 0x02, 0xB9}, + {0x06, 0x02, 0xB9}, + {0x0A, 0x02, 0xB9}, + {0x0F, 0x02, 0xB9}, + {0x18, 0x02, 0xB9}, + {0x1F, 0x02, 0xB9}, + {0x29, 0x02, 0xB9}, + {0x38, 0x03, 0xB9}, + {0x03, 0x02, 0xBA}, + {0x06, 0x02, 0xBA}, + {0x0A, 0x02, 0xBA}, + {0x0F, 0x02, 0xBA}, + {0x18, 0x02, 0xBA}, + {0x1F, 0x02, 0xBA}, + {0x29, 0x02, 0xBA}, + {0x38, 0x03, 0xBA}, }, /* 139 */ { - {0x02, 2, 187}, - {0x09, 2, 187}, - {0x17, 2, 187}, - {0x28, 3, 187}, - {0x02, 2, 189}, - {0x09, 2, 189}, - {0x17, 2, 189}, - {0x28, 3, 189}, - {0x02, 2, 190}, - {0x09, 2, 190}, - {0x17, 2, 190}, - {0x28, 3, 190}, - {0x02, 2, 196}, - {0x09, 2, 196}, - {0x17, 2, 196}, - {0x28, 3, 196}, + {0x02, 0x02, 0xBB}, + {0x09, 0x02, 0xBB}, + {0x17, 0x02, 0xBB}, + {0x28, 0x03, 0xBB}, + {0x02, 0x02, 0xBD}, + {0x09, 0x02, 0xBD}, + {0x17, 0x02, 0xBD}, + {0x28, 0x03, 0xBD}, + {0x02, 0x02, 0xBE}, + {0x09, 0x02, 0xBE}, + {0x17, 0x02, 0xBE}, + {0x28, 0x03, 0xBE}, + {0x02, 0x02, 0xC4}, + {0x09, 0x02, 0xC4}, + {0x17, 0x02, 0xC4}, + {0x28, 0x03, 0xC4}, }, /* 140 */ { - {0x03, 2, 187}, - {0x06, 2, 187}, - {0x0a, 2, 187}, - {0x0f, 2, 187}, - {0x18, 2, 187}, - {0x1f, 2, 187}, - {0x29, 2, 187}, - {0x38, 3, 187}, - {0x03, 2, 189}, - {0x06, 2, 189}, - {0x0a, 2, 189}, - {0x0f, 2, 189}, - {0x18, 2, 189}, - {0x1f, 2, 189}, - {0x29, 2, 189}, - {0x38, 3, 189}, + {0x03, 0x02, 0xBB}, + {0x06, 0x02, 0xBB}, + {0x0A, 0x02, 0xBB}, + {0x0F, 0x02, 0xBB}, + {0x18, 0x02, 0xBB}, + {0x1F, 0x02, 0xBB}, + {0x29, 0x02, 0xBB}, + {0x38, 0x03, 0xBB}, + {0x03, 0x02, 0xBD}, + {0x06, 0x02, 0xBD}, + {0x0A, 0x02, 0xBD}, + {0x0F, 0x02, 0xBD}, + {0x18, 0x02, 0xBD}, + {0x1F, 0x02, 0xBD}, + {0x29, 0x02, 0xBD}, + {0x38, 0x03, 0xBD}, }, /* 141 */ { - {0x03, 2, 190}, - {0x06, 2, 190}, - {0x0a, 2, 190}, - {0x0f, 2, 190}, - {0x18, 2, 190}, - {0x1f, 2, 190}, - {0x29, 2, 190}, - {0x38, 3, 190}, - {0x03, 2, 196}, - {0x06, 2, 196}, - {0x0a, 2, 196}, - {0x0f, 2, 196}, - {0x18, 2, 196}, - {0x1f, 2, 196}, - {0x29, 2, 196}, - {0x38, 3, 196}, + {0x03, 0x02, 0xBE}, + {0x06, 0x02, 0xBE}, + {0x0A, 0x02, 0xBE}, + {0x0F, 0x02, 0xBE}, + {0x18, 0x02, 0xBE}, + {0x1F, 0x02, 0xBE}, + {0x29, 0x02, 0xBE}, + {0x38, 0x03, 0xBE}, + {0x03, 0x02, 0xC4}, + {0x06, 0x02, 0xC4}, + {0x0A, 0x02, 0xC4}, + {0x0F, 0x02, 0xC4}, + {0x18, 0x02, 0xC4}, + {0x1F, 0x02, 0xC4}, + {0x29, 0x02, 0xC4}, + {0x38, 0x03, 0xC4}, }, /* 142 */ { - {0x01, 2, 198}, - {0x16, 3, 198}, - {0x01, 2, 228}, - {0x16, 3, 228}, - {0x01, 2, 232}, - {0x16, 3, 232}, - {0x01, 2, 233}, - {0x16, 3, 233}, - {0x00, 3, 1}, - {0x00, 3, 135}, - {0x00, 3, 137}, - {0x00, 3, 138}, - {0x00, 3, 139}, - {0x00, 3, 140}, - {0x00, 3, 141}, - {0x00, 3, 143}, + {0x01, 0x02, 0xC6}, + {0x16, 0x03, 0xC6}, + {0x01, 0x02, 0xE4}, + {0x16, 0x03, 0xE4}, + {0x01, 0x02, 0xE8}, + {0x16, 0x03, 0xE8}, + {0x01, 0x02, 0xE9}, + {0x16, 0x03, 0xE9}, + {0x00, 0x03, 0x01}, + {0x00, 0x03, 0x87}, + {0x00, 0x03, 0x89}, + {0x00, 0x03, 0x8A}, + {0x00, 0x03, 0x8B}, + {0x00, 0x03, 0x8C}, + {0x00, 0x03, 0x8D}, + {0x00, 0x03, 0x8F}, }, /* 143 */ { - {0x02, 2, 198}, - {0x09, 2, 198}, - {0x17, 2, 198}, - {0x28, 3, 198}, - {0x02, 2, 228}, - {0x09, 2, 228}, - {0x17, 2, 228}, - {0x28, 3, 228}, - {0x02, 2, 232}, - {0x09, 2, 232}, - {0x17, 2, 232}, - {0x28, 3, 232}, - {0x02, 2, 233}, - {0x09, 2, 233}, - {0x17, 2, 233}, - {0x28, 3, 233}, + {0x02, 0x02, 0xC6}, + {0x09, 0x02, 0xC6}, + {0x17, 0x02, 0xC6}, + {0x28, 0x03, 0xC6}, + {0x02, 0x02, 0xE4}, + {0x09, 0x02, 0xE4}, + {0x17, 0x02, 0xE4}, + {0x28, 0x03, 0xE4}, + {0x02, 0x02, 0xE8}, + {0x09, 0x02, 0xE8}, + {0x17, 0x02, 0xE8}, + {0x28, 0x03, 0xE8}, + {0x02, 0x02, 0xE9}, + {0x09, 0x02, 0xE9}, + {0x17, 0x02, 0xE9}, + {0x28, 0x03, 0xE9}, }, /* 144 */ { - {0x03, 2, 198}, - {0x06, 2, 198}, - {0x0a, 2, 198}, - {0x0f, 2, 198}, - {0x18, 2, 198}, - {0x1f, 2, 198}, - {0x29, 2, 198}, - {0x38, 3, 198}, - {0x03, 2, 228}, - {0x06, 2, 228}, - {0x0a, 2, 228}, - {0x0f, 2, 228}, - {0x18, 2, 228}, - {0x1f, 2, 228}, - {0x29, 2, 228}, - {0x38, 3, 228}, + {0x03, 0x02, 0xC6}, + {0x06, 0x02, 0xC6}, + {0x0A, 0x02, 0xC6}, + {0x0F, 0x02, 0xC6}, + {0x18, 0x02, 0xC6}, + {0x1F, 0x02, 0xC6}, + {0x29, 0x02, 0xC6}, + {0x38, 0x03, 0xC6}, + {0x03, 0x02, 0xE4}, + {0x06, 0x02, 0xE4}, + {0x0A, 0x02, 0xE4}, + {0x0F, 0x02, 0xE4}, + {0x18, 0x02, 0xE4}, + {0x1F, 0x02, 0xE4}, + {0x29, 0x02, 0xE4}, + {0x38, 0x03, 0xE4}, }, /* 145 */ { - {0x03, 2, 232}, - {0x06, 2, 232}, - {0x0a, 2, 232}, - {0x0f, 2, 232}, - {0x18, 2, 232}, - {0x1f, 2, 232}, - {0x29, 2, 232}, - {0x38, 3, 232}, - {0x03, 2, 233}, - {0x06, 2, 233}, - {0x0a, 2, 233}, - {0x0f, 2, 233}, - {0x18, 2, 233}, - {0x1f, 2, 233}, - {0x29, 2, 233}, - {0x38, 3, 233}, + {0x03, 0x02, 0xE8}, + {0x06, 0x02, 0xE8}, + {0x0A, 0x02, 0xE8}, + {0x0F, 0x02, 0xE8}, + {0x18, 0x02, 0xE8}, + {0x1F, 0x02, 0xE8}, + {0x29, 0x02, 0xE8}, + {0x38, 0x03, 0xE8}, + {0x03, 0x02, 0xE9}, + {0x06, 0x02, 0xE9}, + {0x0A, 0x02, 0xE9}, + {0x0F, 0x02, 0xE9}, + {0x18, 0x02, 0xE9}, + {0x1F, 0x02, 0xE9}, + {0x29, 0x02, 0xE9}, + {0x38, 0x03, 0xE9}, }, /* 146 */ { - {0x01, 2, 1}, - {0x16, 3, 1}, - {0x01, 2, 135}, - {0x16, 3, 135}, - {0x01, 2, 137}, - {0x16, 3, 137}, - {0x01, 2, 138}, - {0x16, 3, 138}, - {0x01, 2, 139}, - {0x16, 3, 139}, - {0x01, 2, 140}, - {0x16, 3, 140}, - {0x01, 2, 141}, - {0x16, 3, 141}, - {0x01, 2, 143}, - {0x16, 3, 143}, + {0x01, 0x02, 0x01}, + {0x16, 0x03, 0x01}, + {0x01, 0x02, 0x87}, + {0x16, 0x03, 0x87}, + {0x01, 0x02, 0x89}, + {0x16, 0x03, 0x89}, + {0x01, 0x02, 0x8A}, + {0x16, 0x03, 0x8A}, + {0x01, 0x02, 0x8B}, + {0x16, 0x03, 0x8B}, + {0x01, 0x02, 0x8C}, + {0x16, 0x03, 0x8C}, + {0x01, 0x02, 0x8D}, + {0x16, 0x03, 0x8D}, + {0x01, 0x02, 0x8F}, + {0x16, 0x03, 0x8F}, }, /* 147 */ { - {0x02, 2, 1}, - {0x09, 2, 1}, - {0x17, 2, 1}, - {0x28, 3, 1}, - {0x02, 2, 135}, - {0x09, 2, 135}, - {0x17, 2, 135}, - {0x28, 3, 135}, - {0x02, 2, 137}, - {0x09, 2, 137}, - {0x17, 2, 137}, - {0x28, 3, 137}, - {0x02, 2, 138}, - {0x09, 2, 138}, - {0x17, 2, 138}, - {0x28, 3, 138}, + {0x02, 0x02, 0x01}, + {0x09, 0x02, 0x01}, + {0x17, 0x02, 0x01}, + {0x28, 0x03, 0x01}, + {0x02, 0x02, 0x87}, + {0x09, 0x02, 0x87}, + {0x17, 0x02, 0x87}, + {0x28, 0x03, 0x87}, + {0x02, 0x02, 0x89}, + {0x09, 0x02, 0x89}, + {0x17, 0x02, 0x89}, + {0x28, 0x03, 0x89}, + {0x02, 0x02, 0x8A}, + {0x09, 0x02, 0x8A}, + {0x17, 0x02, 0x8A}, + {0x28, 0x03, 0x8A}, }, /* 148 */ { - {0x03, 2, 1}, - {0x06, 2, 1}, - {0x0a, 2, 1}, - {0x0f, 2, 1}, - {0x18, 2, 1}, - {0x1f, 2, 1}, - {0x29, 2, 1}, - {0x38, 3, 1}, - {0x03, 2, 135}, - {0x06, 2, 135}, - {0x0a, 2, 135}, - {0x0f, 2, 135}, - {0x18, 2, 135}, - {0x1f, 2, 135}, - {0x29, 2, 135}, - {0x38, 3, 135}, + {0x03, 0x02, 0x01}, + {0x06, 0x02, 0x01}, + {0x0A, 0x02, 0x01}, + {0x0F, 0x02, 0x01}, + {0x18, 0x02, 0x01}, + {0x1F, 0x02, 0x01}, + {0x29, 0x02, 0x01}, + {0x38, 0x03, 0x01}, + {0x03, 0x02, 0x87}, + {0x06, 0x02, 0x87}, + {0x0A, 0x02, 0x87}, + {0x0F, 0x02, 0x87}, + {0x18, 0x02, 0x87}, + {0x1F, 0x02, 0x87}, + {0x29, 0x02, 0x87}, + {0x38, 0x03, 0x87}, }, /* 149 */ { - {0x03, 2, 137}, - {0x06, 2, 137}, - {0x0a, 2, 137}, - {0x0f, 2, 137}, - {0x18, 2, 137}, - {0x1f, 2, 137}, - {0x29, 2, 137}, - {0x38, 3, 137}, - {0x03, 2, 138}, - {0x06, 2, 138}, - {0x0a, 2, 138}, - {0x0f, 2, 138}, - {0x18, 2, 138}, - {0x1f, 2, 138}, - {0x29, 2, 138}, - {0x38, 3, 138}, + {0x03, 0x02, 0x89}, + {0x06, 0x02, 0x89}, + {0x0A, 0x02, 0x89}, + {0x0F, 0x02, 0x89}, + {0x18, 0x02, 0x89}, + {0x1F, 0x02, 0x89}, + {0x29, 0x02, 0x89}, + {0x38, 0x03, 0x89}, + {0x03, 0x02, 0x8A}, + {0x06, 0x02, 0x8A}, + {0x0A, 0x02, 0x8A}, + {0x0F, 0x02, 0x8A}, + {0x18, 0x02, 0x8A}, + {0x1F, 0x02, 0x8A}, + {0x29, 0x02, 0x8A}, + {0x38, 0x03, 0x8A}, }, /* 150 */ { - {0x02, 2, 139}, - {0x09, 2, 139}, - {0x17, 2, 139}, - {0x28, 3, 139}, - {0x02, 2, 140}, - {0x09, 2, 140}, - {0x17, 2, 140}, - {0x28, 3, 140}, - {0x02, 2, 141}, - {0x09, 2, 141}, - {0x17, 2, 141}, - {0x28, 3, 141}, - {0x02, 2, 143}, - {0x09, 2, 143}, - {0x17, 2, 143}, - {0x28, 3, 143}, + {0x02, 0x02, 0x8B}, + {0x09, 0x02, 0x8B}, + {0x17, 0x02, 0x8B}, + {0x28, 0x03, 0x8B}, + {0x02, 0x02, 0x8C}, + {0x09, 0x02, 0x8C}, + {0x17, 0x02, 0x8C}, + {0x28, 0x03, 0x8C}, + {0x02, 0x02, 0x8D}, + {0x09, 0x02, 0x8D}, + {0x17, 0x02, 0x8D}, + {0x28, 0x03, 0x8D}, + {0x02, 0x02, 0x8F}, + {0x09, 0x02, 0x8F}, + {0x17, 0x02, 0x8F}, + {0x28, 0x03, 0x8F}, }, /* 151 */ { - {0x03, 2, 139}, - {0x06, 2, 139}, - {0x0a, 2, 139}, - {0x0f, 2, 139}, - {0x18, 2, 139}, - {0x1f, 2, 139}, - {0x29, 2, 139}, - {0x38, 3, 139}, - {0x03, 2, 140}, - {0x06, 2, 140}, - {0x0a, 2, 140}, - {0x0f, 2, 140}, - {0x18, 2, 140}, - {0x1f, 2, 140}, - {0x29, 2, 140}, - {0x38, 3, 140}, + {0x03, 0x02, 0x8B}, + {0x06, 0x02, 0x8B}, + {0x0A, 0x02, 0x8B}, + {0x0F, 0x02, 0x8B}, + {0x18, 0x02, 0x8B}, + {0x1F, 0x02, 0x8B}, + {0x29, 0x02, 0x8B}, + {0x38, 0x03, 0x8B}, + {0x03, 0x02, 0x8C}, + {0x06, 0x02, 0x8C}, + {0x0A, 0x02, 0x8C}, + {0x0F, 0x02, 0x8C}, + {0x18, 0x02, 0x8C}, + {0x1F, 0x02, 0x8C}, + {0x29, 0x02, 0x8C}, + {0x38, 0x03, 0x8C}, }, /* 152 */ { - {0x03, 2, 141}, - {0x06, 2, 141}, - {0x0a, 2, 141}, - {0x0f, 2, 141}, - {0x18, 2, 141}, - {0x1f, 2, 141}, - {0x29, 2, 141}, - {0x38, 3, 141}, - {0x03, 2, 143}, - {0x06, 2, 143}, - {0x0a, 2, 143}, - {0x0f, 2, 143}, - {0x18, 2, 143}, - {0x1f, 2, 143}, - {0x29, 2, 143}, - {0x38, 3, 143}, + {0x03, 0x02, 0x8D}, + {0x06, 0x02, 0x8D}, + {0x0A, 0x02, 0x8D}, + {0x0F, 0x02, 0x8D}, + {0x18, 0x02, 0x8D}, + {0x1F, 0x02, 0x8D}, + {0x29, 0x02, 0x8D}, + {0x38, 0x03, 0x8D}, + {0x03, 0x02, 0x8F}, + {0x06, 0x02, 0x8F}, + {0x0A, 0x02, 0x8F}, + {0x0F, 0x02, 0x8F}, + {0x18, 0x02, 0x8F}, + {0x1F, 0x02, 0x8F}, + {0x29, 0x02, 0x8F}, + {0x38, 0x03, 0x8F}, }, /* 153 */ { - {0x9d, 0, 0}, - {0x9e, 0, 0}, - {0xa0, 0, 0}, - {0xa1, 0, 0}, - {0xa4, 0, 0}, - {0xa5, 0, 0}, - {0xa7, 0, 0}, - {0xa8, 0, 0}, - {0xac, 0, 0}, - {0xad, 0, 0}, - {0xaf, 0, 0}, - {0xb1, 0, 0}, - {0xb6, 0, 0}, - {0xb9, 0, 0}, - {0xbf, 0, 0}, - {0xcf, 0, 0}, + {0x9D, 0x00, 0x00}, + {0x9E, 0x00, 0x00}, + {0xA0, 0x00, 0x00}, + {0xA1, 0x00, 0x00}, + {0xA4, 0x00, 0x00}, + {0xA5, 0x00, 0x00}, + {0xA7, 0x00, 0x00}, + {0xA8, 0x00, 0x00}, + {0xAC, 0x00, 0x00}, + {0xAD, 0x00, 0x00}, + {0xAF, 0x00, 0x00}, + {0xB1, 0x00, 0x00}, + {0xB6, 0x00, 0x00}, + {0xB9, 0x00, 0x00}, + {0xBF, 0x00, 0x00}, + {0xCF, 0x00, 0x00}, }, /* 154 */ { - {0x00, 3, 147}, - {0x00, 3, 149}, - {0x00, 3, 150}, - {0x00, 3, 151}, - {0x00, 3, 152}, - {0x00, 3, 155}, - {0x00, 3, 157}, - {0x00, 3, 158}, - {0x00, 3, 165}, - {0x00, 3, 166}, - {0x00, 3, 168}, - {0x00, 3, 174}, - {0x00, 3, 175}, - {0x00, 3, 180}, - {0x00, 3, 182}, - {0x00, 3, 183}, + {0x00, 0x03, 0x93}, + {0x00, 0x03, 0x95}, + {0x00, 0x03, 0x96}, + {0x00, 0x03, 0x97}, + {0x00, 0x03, 0x98}, + {0x00, 0x03, 0x9B}, + {0x00, 0x03, 0x9D}, + {0x00, 0x03, 0x9E}, + {0x00, 0x03, 0xA5}, + {0x00, 0x03, 0xA6}, + {0x00, 0x03, 0xA8}, + {0x00, 0x03, 0xAE}, + {0x00, 0x03, 0xAF}, + {0x00, 0x03, 0xB4}, + {0x00, 0x03, 0xB6}, + {0x00, 0x03, 0xB7}, }, /* 155 */ { - {0x01, 2, 147}, - {0x16, 3, 147}, - {0x01, 2, 149}, - {0x16, 3, 149}, - {0x01, 2, 150}, - {0x16, 3, 150}, - {0x01, 2, 151}, - {0x16, 3, 151}, - {0x01, 2, 152}, - {0x16, 3, 152}, - {0x01, 2, 155}, - {0x16, 3, 155}, - {0x01, 2, 157}, - {0x16, 3, 157}, - {0x01, 2, 158}, - {0x16, 3, 158}, + {0x01, 0x02, 0x93}, + {0x16, 0x03, 0x93}, + {0x01, 0x02, 0x95}, + {0x16, 0x03, 0x95}, + {0x01, 0x02, 0x96}, + {0x16, 0x03, 0x96}, + {0x01, 0x02, 0x97}, + {0x16, 0x03, 0x97}, + {0x01, 0x02, 0x98}, + {0x16, 0x03, 0x98}, + {0x01, 0x02, 0x9B}, + {0x16, 0x03, 0x9B}, + {0x01, 0x02, 0x9D}, + {0x16, 0x03, 0x9D}, + {0x01, 0x02, 0x9E}, + {0x16, 0x03, 0x9E}, }, /* 156 */ { - {0x02, 2, 147}, - {0x09, 2, 147}, - {0x17, 2, 147}, - {0x28, 3, 147}, - {0x02, 2, 149}, - {0x09, 2, 149}, - {0x17, 2, 149}, - {0x28, 3, 149}, - {0x02, 2, 150}, - {0x09, 2, 150}, - {0x17, 2, 150}, - {0x28, 3, 150}, - {0x02, 2, 151}, - {0x09, 2, 151}, - {0x17, 2, 151}, - {0x28, 3, 151}, + {0x02, 0x02, 0x93}, + {0x09, 0x02, 0x93}, + {0x17, 0x02, 0x93}, + {0x28, 0x03, 0x93}, + {0x02, 0x02, 0x95}, + {0x09, 0x02, 0x95}, + {0x17, 0x02, 0x95}, + {0x28, 0x03, 0x95}, + {0x02, 0x02, 0x96}, + {0x09, 0x02, 0x96}, + {0x17, 0x02, 0x96}, + {0x28, 0x03, 0x96}, + {0x02, 0x02, 0x97}, + {0x09, 0x02, 0x97}, + {0x17, 0x02, 0x97}, + {0x28, 0x03, 0x97}, }, /* 157 */ { - {0x03, 2, 147}, - {0x06, 2, 147}, - {0x0a, 2, 147}, - {0x0f, 2, 147}, - {0x18, 2, 147}, - {0x1f, 2, 147}, - {0x29, 2, 147}, - {0x38, 3, 147}, - {0x03, 2, 149}, - {0x06, 2, 149}, - {0x0a, 2, 149}, - {0x0f, 2, 149}, - {0x18, 2, 149}, - {0x1f, 2, 149}, - {0x29, 2, 149}, - {0x38, 3, 149}, + {0x03, 0x02, 0x93}, + {0x06, 0x02, 0x93}, + {0x0A, 0x02, 0x93}, + {0x0F, 0x02, 0x93}, + {0x18, 0x02, 0x93}, + {0x1F, 0x02, 0x93}, + {0x29, 0x02, 0x93}, + {0x38, 0x03, 0x93}, + {0x03, 0x02, 0x95}, + {0x06, 0x02, 0x95}, + {0x0A, 0x02, 0x95}, + {0x0F, 0x02, 0x95}, + {0x18, 0x02, 0x95}, + {0x1F, 0x02, 0x95}, + {0x29, 0x02, 0x95}, + {0x38, 0x03, 0x95}, }, /* 158 */ { - {0x03, 2, 150}, - {0x06, 2, 150}, - {0x0a, 2, 150}, - {0x0f, 2, 150}, - {0x18, 2, 150}, - {0x1f, 2, 150}, - {0x29, 2, 150}, - {0x38, 3, 150}, - {0x03, 2, 151}, - {0x06, 2, 151}, - {0x0a, 2, 151}, - {0x0f, 2, 151}, - {0x18, 2, 151}, - {0x1f, 2, 151}, - {0x29, 2, 151}, - {0x38, 3, 151}, + {0x03, 0x02, 0x96}, + {0x06, 0x02, 0x96}, + {0x0A, 0x02, 0x96}, + {0x0F, 0x02, 0x96}, + {0x18, 0x02, 0x96}, + {0x1F, 0x02, 0x96}, + {0x29, 0x02, 0x96}, + {0x38, 0x03, 0x96}, + {0x03, 0x02, 0x97}, + {0x06, 0x02, 0x97}, + {0x0A, 0x02, 0x97}, + {0x0F, 0x02, 0x97}, + {0x18, 0x02, 0x97}, + {0x1F, 0x02, 0x97}, + {0x29, 0x02, 0x97}, + {0x38, 0x03, 0x97}, }, /* 159 */ { - {0x02, 2, 152}, - {0x09, 2, 152}, - {0x17, 2, 152}, - {0x28, 3, 152}, - {0x02, 2, 155}, - {0x09, 2, 155}, - {0x17, 2, 155}, - {0x28, 3, 155}, - {0x02, 2, 157}, - {0x09, 2, 157}, - {0x17, 2, 157}, - {0x28, 3, 157}, - {0x02, 2, 158}, - {0x09, 2, 158}, - {0x17, 2, 158}, - {0x28, 3, 158}, + {0x02, 0x02, 0x98}, + {0x09, 0x02, 0x98}, + {0x17, 0x02, 0x98}, + {0x28, 0x03, 0x98}, + {0x02, 0x02, 0x9B}, + {0x09, 0x02, 0x9B}, + {0x17, 0x02, 0x9B}, + {0x28, 0x03, 0x9B}, + {0x02, 0x02, 0x9D}, + {0x09, 0x02, 0x9D}, + {0x17, 0x02, 0x9D}, + {0x28, 0x03, 0x9D}, + {0x02, 0x02, 0x9E}, + {0x09, 0x02, 0x9E}, + {0x17, 0x02, 0x9E}, + {0x28, 0x03, 0x9E}, }, /* 160 */ { - {0x03, 2, 152}, - {0x06, 2, 152}, - {0x0a, 2, 152}, - {0x0f, 2, 152}, - {0x18, 2, 152}, - {0x1f, 2, 152}, - {0x29, 2, 152}, - {0x38, 3, 152}, - {0x03, 2, 155}, - {0x06, 2, 155}, - {0x0a, 2, 155}, - {0x0f, 2, 155}, - {0x18, 2, 155}, - {0x1f, 2, 155}, - {0x29, 2, 155}, - {0x38, 3, 155}, + {0x03, 0x02, 0x98}, + {0x06, 0x02, 0x98}, + {0x0A, 0x02, 0x98}, + {0x0F, 0x02, 0x98}, + {0x18, 0x02, 0x98}, + {0x1F, 0x02, 0x98}, + {0x29, 0x02, 0x98}, + {0x38, 0x03, 0x98}, + {0x03, 0x02, 0x9B}, + {0x06, 0x02, 0x9B}, + {0x0A, 0x02, 0x9B}, + {0x0F, 0x02, 0x9B}, + {0x18, 0x02, 0x9B}, + {0x1F, 0x02, 0x9B}, + {0x29, 0x02, 0x9B}, + {0x38, 0x03, 0x9B}, }, /* 161 */ { - {0x03, 2, 157}, - {0x06, 2, 157}, - {0x0a, 2, 157}, - {0x0f, 2, 157}, - {0x18, 2, 157}, - {0x1f, 2, 157}, - {0x29, 2, 157}, - {0x38, 3, 157}, - {0x03, 2, 158}, - {0x06, 2, 158}, - {0x0a, 2, 158}, - {0x0f, 2, 158}, - {0x18, 2, 158}, - {0x1f, 2, 158}, - {0x29, 2, 158}, - {0x38, 3, 158}, + {0x03, 0x02, 0x9D}, + {0x06, 0x02, 0x9D}, + {0x0A, 0x02, 0x9D}, + {0x0F, 0x02, 0x9D}, + {0x18, 0x02, 0x9D}, + {0x1F, 0x02, 0x9D}, + {0x29, 0x02, 0x9D}, + {0x38, 0x03, 0x9D}, + {0x03, 0x02, 0x9E}, + {0x06, 0x02, 0x9E}, + {0x0A, 0x02, 0x9E}, + {0x0F, 0x02, 0x9E}, + {0x18, 0x02, 0x9E}, + {0x1F, 0x02, 0x9E}, + {0x29, 0x02, 0x9E}, + {0x38, 0x03, 0x9E}, }, /* 162 */ { - {0x01, 2, 165}, - {0x16, 3, 165}, - {0x01, 2, 166}, - {0x16, 3, 166}, - {0x01, 2, 168}, - {0x16, 3, 168}, - {0x01, 2, 174}, - {0x16, 3, 174}, - {0x01, 2, 175}, - {0x16, 3, 175}, - {0x01, 2, 180}, - {0x16, 3, 180}, - {0x01, 2, 182}, - {0x16, 3, 182}, - {0x01, 2, 183}, - {0x16, 3, 183}, + {0x01, 0x02, 0xA5}, + {0x16, 0x03, 0xA5}, + {0x01, 0x02, 0xA6}, + {0x16, 0x03, 0xA6}, + {0x01, 0x02, 0xA8}, + {0x16, 0x03, 0xA8}, + {0x01, 0x02, 0xAE}, + {0x16, 0x03, 0xAE}, + {0x01, 0x02, 0xAF}, + {0x16, 0x03, 0xAF}, + {0x01, 0x02, 0xB4}, + {0x16, 0x03, 0xB4}, + {0x01, 0x02, 0xB6}, + {0x16, 0x03, 0xB6}, + {0x01, 0x02, 0xB7}, + {0x16, 0x03, 0xB7}, }, /* 163 */ { - {0x02, 2, 165}, - {0x09, 2, 165}, - {0x17, 2, 165}, - {0x28, 3, 165}, - {0x02, 2, 166}, - {0x09, 2, 166}, - {0x17, 2, 166}, - {0x28, 3, 166}, - {0x02, 2, 168}, - {0x09, 2, 168}, - {0x17, 2, 168}, - {0x28, 3, 168}, - {0x02, 2, 174}, - {0x09, 2, 174}, - {0x17, 2, 174}, - {0x28, 3, 174}, + {0x02, 0x02, 0xA5}, + {0x09, 0x02, 0xA5}, + {0x17, 0x02, 0xA5}, + {0x28, 0x03, 0xA5}, + {0x02, 0x02, 0xA6}, + {0x09, 0x02, 0xA6}, + {0x17, 0x02, 0xA6}, + {0x28, 0x03, 0xA6}, + {0x02, 0x02, 0xA8}, + {0x09, 0x02, 0xA8}, + {0x17, 0x02, 0xA8}, + {0x28, 0x03, 0xA8}, + {0x02, 0x02, 0xAE}, + {0x09, 0x02, 0xAE}, + {0x17, 0x02, 0xAE}, + {0x28, 0x03, 0xAE}, }, /* 164 */ { - {0x03, 2, 165}, - {0x06, 2, 165}, - {0x0a, 2, 165}, - {0x0f, 2, 165}, - {0x18, 2, 165}, - {0x1f, 2, 165}, - {0x29, 2, 165}, - {0x38, 3, 165}, - {0x03, 2, 166}, - {0x06, 2, 166}, - {0x0a, 2, 166}, - {0x0f, 2, 166}, - {0x18, 2, 166}, - {0x1f, 2, 166}, - {0x29, 2, 166}, - {0x38, 3, 166}, + {0x03, 0x02, 0xA5}, + {0x06, 0x02, 0xA5}, + {0x0A, 0x02, 0xA5}, + {0x0F, 0x02, 0xA5}, + {0x18, 0x02, 0xA5}, + {0x1F, 0x02, 0xA5}, + {0x29, 0x02, 0xA5}, + {0x38, 0x03, 0xA5}, + {0x03, 0x02, 0xA6}, + {0x06, 0x02, 0xA6}, + {0x0A, 0x02, 0xA6}, + {0x0F, 0x02, 0xA6}, + {0x18, 0x02, 0xA6}, + {0x1F, 0x02, 0xA6}, + {0x29, 0x02, 0xA6}, + {0x38, 0x03, 0xA6}, }, /* 165 */ { - {0x03, 2, 168}, - {0x06, 2, 168}, - {0x0a, 2, 168}, - {0x0f, 2, 168}, - {0x18, 2, 168}, - {0x1f, 2, 168}, - {0x29, 2, 168}, - {0x38, 3, 168}, - {0x03, 2, 174}, - {0x06, 2, 174}, - {0x0a, 2, 174}, - {0x0f, 2, 174}, - {0x18, 2, 174}, - {0x1f, 2, 174}, - {0x29, 2, 174}, - {0x38, 3, 174}, + {0x03, 0x02, 0xA8}, + {0x06, 0x02, 0xA8}, + {0x0A, 0x02, 0xA8}, + {0x0F, 0x02, 0xA8}, + {0x18, 0x02, 0xA8}, + {0x1F, 0x02, 0xA8}, + {0x29, 0x02, 0xA8}, + {0x38, 0x03, 0xA8}, + {0x03, 0x02, 0xAE}, + {0x06, 0x02, 0xAE}, + {0x0A, 0x02, 0xAE}, + {0x0F, 0x02, 0xAE}, + {0x18, 0x02, 0xAE}, + {0x1F, 0x02, 0xAE}, + {0x29, 0x02, 0xAE}, + {0x38, 0x03, 0xAE}, }, /* 166 */ { - {0x02, 2, 175}, - {0x09, 2, 175}, - {0x17, 2, 175}, - {0x28, 3, 175}, - {0x02, 2, 180}, - {0x09, 2, 180}, - {0x17, 2, 180}, - {0x28, 3, 180}, - {0x02, 2, 182}, - {0x09, 2, 182}, - {0x17, 2, 182}, - {0x28, 3, 182}, - {0x02, 2, 183}, - {0x09, 2, 183}, - {0x17, 2, 183}, - {0x28, 3, 183}, + {0x02, 0x02, 0xAF}, + {0x09, 0x02, 0xAF}, + {0x17, 0x02, 0xAF}, + {0x28, 0x03, 0xAF}, + {0x02, 0x02, 0xB4}, + {0x09, 0x02, 0xB4}, + {0x17, 0x02, 0xB4}, + {0x28, 0x03, 0xB4}, + {0x02, 0x02, 0xB6}, + {0x09, 0x02, 0xB6}, + {0x17, 0x02, 0xB6}, + {0x28, 0x03, 0xB6}, + {0x02, 0x02, 0xB7}, + {0x09, 0x02, 0xB7}, + {0x17, 0x02, 0xB7}, + {0x28, 0x03, 0xB7}, }, /* 167 */ { - {0x03, 2, 175}, - {0x06, 2, 175}, - {0x0a, 2, 175}, - {0x0f, 2, 175}, - {0x18, 2, 175}, - {0x1f, 2, 175}, - {0x29, 2, 175}, - {0x38, 3, 175}, - {0x03, 2, 180}, - {0x06, 2, 180}, - {0x0a, 2, 180}, - {0x0f, 2, 180}, - {0x18, 2, 180}, - {0x1f, 2, 180}, - {0x29, 2, 180}, - {0x38, 3, 180}, + {0x03, 0x02, 0xAF}, + {0x06, 0x02, 0xAF}, + {0x0A, 0x02, 0xAF}, + {0x0F, 0x02, 0xAF}, + {0x18, 0x02, 0xAF}, + {0x1F, 0x02, 0xAF}, + {0x29, 0x02, 0xAF}, + {0x38, 0x03, 0xAF}, + {0x03, 0x02, 0xB4}, + {0x06, 0x02, 0xB4}, + {0x0A, 0x02, 0xB4}, + {0x0F, 0x02, 0xB4}, + {0x18, 0x02, 0xB4}, + {0x1F, 0x02, 0xB4}, + {0x29, 0x02, 0xB4}, + {0x38, 0x03, 0xB4}, }, /* 168 */ { - {0x03, 2, 182}, - {0x06, 2, 182}, - {0x0a, 2, 182}, - {0x0f, 2, 182}, - {0x18, 2, 182}, - {0x1f, 2, 182}, - {0x29, 2, 182}, - {0x38, 3, 182}, - {0x03, 2, 183}, - {0x06, 2, 183}, - {0x0a, 2, 183}, - {0x0f, 2, 183}, - {0x18, 2, 183}, - {0x1f, 2, 183}, - {0x29, 2, 183}, - {0x38, 3, 183}, + {0x03, 0x02, 0xB6}, + {0x06, 0x02, 0xB6}, + {0x0A, 0x02, 0xB6}, + {0x0F, 0x02, 0xB6}, + {0x18, 0x02, 0xB6}, + {0x1F, 0x02, 0xB6}, + {0x29, 0x02, 0xB6}, + {0x38, 0x03, 0xB6}, + {0x03, 0x02, 0xB7}, + {0x06, 0x02, 0xB7}, + {0x0A, 0x02, 0xB7}, + {0x0F, 0x02, 0xB7}, + {0x18, 0x02, 0xB7}, + {0x1F, 0x02, 0xB7}, + {0x29, 0x02, 0xB7}, + {0x38, 0x03, 0xB7}, }, /* 169 */ { - {0x00, 3, 188}, - {0x00, 3, 191}, - {0x00, 3, 197}, - {0x00, 3, 231}, - {0x00, 3, 239}, - {0xb0, 0, 0}, - {0xb2, 0, 0}, - {0xb3, 0, 0}, - {0xb7, 0, 0}, - {0xb8, 0, 0}, - {0xba, 0, 0}, - {0xbb, 0, 0}, - {0xc0, 0, 0}, - {0xc7, 0, 0}, - {0xd0, 0, 0}, - {0xdf, 0, 0}, + {0x00, 0x03, 0xBC}, + {0x00, 0x03, 0xBF}, + {0x00, 0x03, 0xC5}, + {0x00, 0x03, 0xE7}, + {0x00, 0x03, 0xEF}, + {0xB0, 0x00, 0x00}, + {0xB2, 0x00, 0x00}, + {0xB3, 0x00, 0x00}, + {0xB7, 0x00, 0x00}, + {0xB8, 0x00, 0x00}, + {0xBA, 0x00, 0x00}, + {0xBB, 0x00, 0x00}, + {0xC0, 0x00, 0x00}, + {0xC7, 0x00, 0x00}, + {0xD0, 0x00, 0x00}, + {0xDF, 0x00, 0x00}, }, /* 170 */ { - {0x01, 2, 188}, - {0x16, 3, 188}, - {0x01, 2, 191}, - {0x16, 3, 191}, - {0x01, 2, 197}, - {0x16, 3, 197}, - {0x01, 2, 231}, - {0x16, 3, 231}, - {0x01, 2, 239}, - {0x16, 3, 239}, - {0x00, 3, 9}, - {0x00, 3, 142}, - {0x00, 3, 144}, - {0x00, 3, 145}, - {0x00, 3, 148}, - {0x00, 3, 159}, + {0x01, 0x02, 0xBC}, + {0x16, 0x03, 0xBC}, + {0x01, 0x02, 0xBF}, + {0x16, 0x03, 0xBF}, + {0x01, 0x02, 0xC5}, + {0x16, 0x03, 0xC5}, + {0x01, 0x02, 0xE7}, + {0x16, 0x03, 0xE7}, + {0x01, 0x02, 0xEF}, + {0x16, 0x03, 0xEF}, + {0x00, 0x03, 0x09}, + {0x00, 0x03, 0x8E}, + {0x00, 0x03, 0x90}, + {0x00, 0x03, 0x91}, + {0x00, 0x03, 0x94}, + {0x00, 0x03, 0x9F}, }, /* 171 */ { - {0x02, 2, 188}, - {0x09, 2, 188}, - {0x17, 2, 188}, - {0x28, 3, 188}, - {0x02, 2, 191}, - {0x09, 2, 191}, - {0x17, 2, 191}, - {0x28, 3, 191}, - {0x02, 2, 197}, - {0x09, 2, 197}, - {0x17, 2, 197}, - {0x28, 3, 197}, - {0x02, 2, 231}, - {0x09, 2, 231}, - {0x17, 2, 231}, - {0x28, 3, 231}, + {0x02, 0x02, 0xBC}, + {0x09, 0x02, 0xBC}, + {0x17, 0x02, 0xBC}, + {0x28, 0x03, 0xBC}, + {0x02, 0x02, 0xBF}, + {0x09, 0x02, 0xBF}, + {0x17, 0x02, 0xBF}, + {0x28, 0x03, 0xBF}, + {0x02, 0x02, 0xC5}, + {0x09, 0x02, 0xC5}, + {0x17, 0x02, 0xC5}, + {0x28, 0x03, 0xC5}, + {0x02, 0x02, 0xE7}, + {0x09, 0x02, 0xE7}, + {0x17, 0x02, 0xE7}, + {0x28, 0x03, 0xE7}, }, /* 172 */ { - {0x03, 2, 188}, - {0x06, 2, 188}, - {0x0a, 2, 188}, - {0x0f, 2, 188}, - {0x18, 2, 188}, - {0x1f, 2, 188}, - {0x29, 2, 188}, - {0x38, 3, 188}, - {0x03, 2, 191}, - {0x06, 2, 191}, - {0x0a, 2, 191}, - {0x0f, 2, 191}, - {0x18, 2, 191}, - {0x1f, 2, 191}, - {0x29, 2, 191}, - {0x38, 3, 191}, + {0x03, 0x02, 0xBC}, + {0x06, 0x02, 0xBC}, + {0x0A, 0x02, 0xBC}, + {0x0F, 0x02, 0xBC}, + {0x18, 0x02, 0xBC}, + {0x1F, 0x02, 0xBC}, + {0x29, 0x02, 0xBC}, + {0x38, 0x03, 0xBC}, + {0x03, 0x02, 0xBF}, + {0x06, 0x02, 0xBF}, + {0x0A, 0x02, 0xBF}, + {0x0F, 0x02, 0xBF}, + {0x18, 0x02, 0xBF}, + {0x1F, 0x02, 0xBF}, + {0x29, 0x02, 0xBF}, + {0x38, 0x03, 0xBF}, }, /* 173 */ { - {0x03, 2, 197}, - {0x06, 2, 197}, - {0x0a, 2, 197}, - {0x0f, 2, 197}, - {0x18, 2, 197}, - {0x1f, 2, 197}, - {0x29, 2, 197}, - {0x38, 3, 197}, - {0x03, 2, 231}, - {0x06, 2, 231}, - {0x0a, 2, 231}, - {0x0f, 2, 231}, - {0x18, 2, 231}, - {0x1f, 2, 231}, - {0x29, 2, 231}, - {0x38, 3, 231}, + {0x03, 0x02, 0xC5}, + {0x06, 0x02, 0xC5}, + {0x0A, 0x02, 0xC5}, + {0x0F, 0x02, 0xC5}, + {0x18, 0x02, 0xC5}, + {0x1F, 0x02, 0xC5}, + {0x29, 0x02, 0xC5}, + {0x38, 0x03, 0xC5}, + {0x03, 0x02, 0xE7}, + {0x06, 0x02, 0xE7}, + {0x0A, 0x02, 0xE7}, + {0x0F, 0x02, 0xE7}, + {0x18, 0x02, 0xE7}, + {0x1F, 0x02, 0xE7}, + {0x29, 0x02, 0xE7}, + {0x38, 0x03, 0xE7}, }, /* 174 */ { - {0x02, 2, 239}, - {0x09, 2, 239}, - {0x17, 2, 239}, - {0x28, 3, 239}, - {0x01, 2, 9}, - {0x16, 3, 9}, - {0x01, 2, 142}, - {0x16, 3, 142}, - {0x01, 2, 144}, - {0x16, 3, 144}, - {0x01, 2, 145}, - {0x16, 3, 145}, - {0x01, 2, 148}, - {0x16, 3, 148}, - {0x01, 2, 159}, - {0x16, 3, 159}, + {0x02, 0x02, 0xEF}, + {0x09, 0x02, 0xEF}, + {0x17, 0x02, 0xEF}, + {0x28, 0x03, 0xEF}, + {0x01, 0x02, 0x09}, + {0x16, 0x03, 0x09}, + {0x01, 0x02, 0x8E}, + {0x16, 0x03, 0x8E}, + {0x01, 0x02, 0x90}, + {0x16, 0x03, 0x90}, + {0x01, 0x02, 0x91}, + {0x16, 0x03, 0x91}, + {0x01, 0x02, 0x94}, + {0x16, 0x03, 0x94}, + {0x01, 0x02, 0x9F}, + {0x16, 0x03, 0x9F}, }, /* 175 */ { - {0x03, 2, 239}, - {0x06, 2, 239}, - {0x0a, 2, 239}, - {0x0f, 2, 239}, - {0x18, 2, 239}, - {0x1f, 2, 239}, - {0x29, 2, 239}, - {0x38, 3, 239}, - {0x02, 2, 9}, - {0x09, 2, 9}, - {0x17, 2, 9}, - {0x28, 3, 9}, - {0x02, 2, 142}, - {0x09, 2, 142}, - {0x17, 2, 142}, - {0x28, 3, 142}, + {0x03, 0x02, 0xEF}, + {0x06, 0x02, 0xEF}, + {0x0A, 0x02, 0xEF}, + {0x0F, 0x02, 0xEF}, + {0x18, 0x02, 0xEF}, + {0x1F, 0x02, 0xEF}, + {0x29, 0x02, 0xEF}, + {0x38, 0x03, 0xEF}, + {0x02, 0x02, 0x09}, + {0x09, 0x02, 0x09}, + {0x17, 0x02, 0x09}, + {0x28, 0x03, 0x09}, + {0x02, 0x02, 0x8E}, + {0x09, 0x02, 0x8E}, + {0x17, 0x02, 0x8E}, + {0x28, 0x03, 0x8E}, }, /* 176 */ { - {0x03, 2, 9}, - {0x06, 2, 9}, - {0x0a, 2, 9}, - {0x0f, 2, 9}, - {0x18, 2, 9}, - {0x1f, 2, 9}, - {0x29, 2, 9}, - {0x38, 3, 9}, - {0x03, 2, 142}, - {0x06, 2, 142}, - {0x0a, 2, 142}, - {0x0f, 2, 142}, - {0x18, 2, 142}, - {0x1f, 2, 142}, - {0x29, 2, 142}, - {0x38, 3, 142}, + {0x03, 0x02, 0x09}, + {0x06, 0x02, 0x09}, + {0x0A, 0x02, 0x09}, + {0x0F, 0x02, 0x09}, + {0x18, 0x02, 0x09}, + {0x1F, 0x02, 0x09}, + {0x29, 0x02, 0x09}, + {0x38, 0x03, 0x09}, + {0x03, 0x02, 0x8E}, + {0x06, 0x02, 0x8E}, + {0x0A, 0x02, 0x8E}, + {0x0F, 0x02, 0x8E}, + {0x18, 0x02, 0x8E}, + {0x1F, 0x02, 0x8E}, + {0x29, 0x02, 0x8E}, + {0x38, 0x03, 0x8E}, }, /* 177 */ { - {0x02, 2, 144}, - {0x09, 2, 144}, - {0x17, 2, 144}, - {0x28, 3, 144}, - {0x02, 2, 145}, - {0x09, 2, 145}, - {0x17, 2, 145}, - {0x28, 3, 145}, - {0x02, 2, 148}, - {0x09, 2, 148}, - {0x17, 2, 148}, - {0x28, 3, 148}, - {0x02, 2, 159}, - {0x09, 2, 159}, - {0x17, 2, 159}, - {0x28, 3, 159}, + {0x02, 0x02, 0x90}, + {0x09, 0x02, 0x90}, + {0x17, 0x02, 0x90}, + {0x28, 0x03, 0x90}, + {0x02, 0x02, 0x91}, + {0x09, 0x02, 0x91}, + {0x17, 0x02, 0x91}, + {0x28, 0x03, 0x91}, + {0x02, 0x02, 0x94}, + {0x09, 0x02, 0x94}, + {0x17, 0x02, 0x94}, + {0x28, 0x03, 0x94}, + {0x02, 0x02, 0x9F}, + {0x09, 0x02, 0x9F}, + {0x17, 0x02, 0x9F}, + {0x28, 0x03, 0x9F}, }, /* 178 */ { - {0x03, 2, 144}, - {0x06, 2, 144}, - {0x0a, 2, 144}, - {0x0f, 2, 144}, - {0x18, 2, 144}, - {0x1f, 2, 144}, - {0x29, 2, 144}, - {0x38, 3, 144}, - {0x03, 2, 145}, - {0x06, 2, 145}, - {0x0a, 2, 145}, - {0x0f, 2, 145}, - {0x18, 2, 145}, - {0x1f, 2, 145}, - {0x29, 2, 145}, - {0x38, 3, 145}, + {0x03, 0x02, 0x90}, + {0x06, 0x02, 0x90}, + {0x0A, 0x02, 0x90}, + {0x0F, 0x02, 0x90}, + {0x18, 0x02, 0x90}, + {0x1F, 0x02, 0x90}, + {0x29, 0x02, 0x90}, + {0x38, 0x03, 0x90}, + {0x03, 0x02, 0x91}, + {0x06, 0x02, 0x91}, + {0x0A, 0x02, 0x91}, + {0x0F, 0x02, 0x91}, + {0x18, 0x02, 0x91}, + {0x1F, 0x02, 0x91}, + {0x29, 0x02, 0x91}, + {0x38, 0x03, 0x91}, }, /* 179 */ { - {0x03, 2, 148}, - {0x06, 2, 148}, - {0x0a, 2, 148}, - {0x0f, 2, 148}, - {0x18, 2, 148}, - {0x1f, 2, 148}, - {0x29, 2, 148}, - {0x38, 3, 148}, - {0x03, 2, 159}, - {0x06, 2, 159}, - {0x0a, 2, 159}, - {0x0f, 2, 159}, - {0x18, 2, 159}, - {0x1f, 2, 159}, - {0x29, 2, 159}, - {0x38, 3, 159}, + {0x03, 0x02, 0x94}, + {0x06, 0x02, 0x94}, + {0x0A, 0x02, 0x94}, + {0x0F, 0x02, 0x94}, + {0x18, 0x02, 0x94}, + {0x1F, 0x02, 0x94}, + {0x29, 0x02, 0x94}, + {0x38, 0x03, 0x94}, + {0x03, 0x02, 0x9F}, + {0x06, 0x02, 0x9F}, + {0x0A, 0x02, 0x9F}, + {0x0F, 0x02, 0x9F}, + {0x18, 0x02, 0x9F}, + {0x1F, 0x02, 0x9F}, + {0x29, 0x02, 0x9F}, + {0x38, 0x03, 0x9F}, }, /* 180 */ { - {0x00, 3, 171}, - {0x00, 3, 206}, - {0x00, 3, 215}, - {0x00, 3, 225}, - {0x00, 3, 236}, - {0x00, 3, 237}, - {0xbc, 0, 0}, - {0xbd, 0, 0}, - {0xc1, 0, 0}, - {0xc4, 0, 0}, - {0xc8, 0, 0}, - {0xcb, 0, 0}, - {0xd1, 0, 0}, - {0xd8, 0, 0}, - {0xe0, 0, 0}, - {0xee, 0, 0}, + {0x00, 0x03, 0xAB}, + {0x00, 0x03, 0xCE}, + {0x00, 0x03, 0xD7}, + {0x00, 0x03, 0xE1}, + {0x00, 0x03, 0xEC}, + {0x00, 0x03, 0xED}, + {0xBC, 0x00, 0x00}, + {0xBD, 0x00, 0x00}, + {0xC1, 0x00, 0x00}, + {0xC4, 0x00, 0x00}, + {0xC8, 0x00, 0x00}, + {0xCB, 0x00, 0x00}, + {0xD1, 0x00, 0x00}, + {0xD8, 0x00, 0x00}, + {0xE0, 0x00, 0x00}, + {0xEE, 0x00, 0x00}, }, /* 181 */ { - {0x01, 2, 171}, - {0x16, 3, 171}, - {0x01, 2, 206}, - {0x16, 3, 206}, - {0x01, 2, 215}, - {0x16, 3, 215}, - {0x01, 2, 225}, - {0x16, 3, 225}, - {0x01, 2, 236}, - {0x16, 3, 236}, - {0x01, 2, 237}, - {0x16, 3, 237}, - {0x00, 3, 199}, - {0x00, 3, 207}, - {0x00, 3, 234}, - {0x00, 3, 235}, + {0x01, 0x02, 0xAB}, + {0x16, 0x03, 0xAB}, + {0x01, 0x02, 0xCE}, + {0x16, 0x03, 0xCE}, + {0x01, 0x02, 0xD7}, + {0x16, 0x03, 0xD7}, + {0x01, 0x02, 0xE1}, + {0x16, 0x03, 0xE1}, + {0x01, 0x02, 0xEC}, + {0x16, 0x03, 0xEC}, + {0x01, 0x02, 0xED}, + {0x16, 0x03, 0xED}, + {0x00, 0x03, 0xC7}, + {0x00, 0x03, 0xCF}, + {0x00, 0x03, 0xEA}, + {0x00, 0x03, 0xEB}, }, /* 182 */ { - {0x02, 2, 171}, - {0x09, 2, 171}, - {0x17, 2, 171}, - {0x28, 3, 171}, - {0x02, 2, 206}, - {0x09, 2, 206}, - {0x17, 2, 206}, - {0x28, 3, 206}, - {0x02, 2, 215}, - {0x09, 2, 215}, - {0x17, 2, 215}, - {0x28, 3, 215}, - {0x02, 2, 225}, - {0x09, 2, 225}, - {0x17, 2, 225}, - {0x28, 3, 225}, + {0x02, 0x02, 0xAB}, + {0x09, 0x02, 0xAB}, + {0x17, 0x02, 0xAB}, + {0x28, 0x03, 0xAB}, + {0x02, 0x02, 0xCE}, + {0x09, 0x02, 0xCE}, + {0x17, 0x02, 0xCE}, + {0x28, 0x03, 0xCE}, + {0x02, 0x02, 0xD7}, + {0x09, 0x02, 0xD7}, + {0x17, 0x02, 0xD7}, + {0x28, 0x03, 0xD7}, + {0x02, 0x02, 0xE1}, + {0x09, 0x02, 0xE1}, + {0x17, 0x02, 0xE1}, + {0x28, 0x03, 0xE1}, }, /* 183 */ { - {0x03, 2, 171}, - {0x06, 2, 171}, - {0x0a, 2, 171}, - {0x0f, 2, 171}, - {0x18, 2, 171}, - {0x1f, 2, 171}, - {0x29, 2, 171}, - {0x38, 3, 171}, - {0x03, 2, 206}, - {0x06, 2, 206}, - {0x0a, 2, 206}, - {0x0f, 2, 206}, - {0x18, 2, 206}, - {0x1f, 2, 206}, - {0x29, 2, 206}, - {0x38, 3, 206}, + {0x03, 0x02, 0xAB}, + {0x06, 0x02, 0xAB}, + {0x0A, 0x02, 0xAB}, + {0x0F, 0x02, 0xAB}, + {0x18, 0x02, 0xAB}, + {0x1F, 0x02, 0xAB}, + {0x29, 0x02, 0xAB}, + {0x38, 0x03, 0xAB}, + {0x03, 0x02, 0xCE}, + {0x06, 0x02, 0xCE}, + {0x0A, 0x02, 0xCE}, + {0x0F, 0x02, 0xCE}, + {0x18, 0x02, 0xCE}, + {0x1F, 0x02, 0xCE}, + {0x29, 0x02, 0xCE}, + {0x38, 0x03, 0xCE}, }, /* 184 */ { - {0x03, 2, 215}, - {0x06, 2, 215}, - {0x0a, 2, 215}, - {0x0f, 2, 215}, - {0x18, 2, 215}, - {0x1f, 2, 215}, - {0x29, 2, 215}, - {0x38, 3, 215}, - {0x03, 2, 225}, - {0x06, 2, 225}, - {0x0a, 2, 225}, - {0x0f, 2, 225}, - {0x18, 2, 225}, - {0x1f, 2, 225}, - {0x29, 2, 225}, - {0x38, 3, 225}, + {0x03, 0x02, 0xD7}, + {0x06, 0x02, 0xD7}, + {0x0A, 0x02, 0xD7}, + {0x0F, 0x02, 0xD7}, + {0x18, 0x02, 0xD7}, + {0x1F, 0x02, 0xD7}, + {0x29, 0x02, 0xD7}, + {0x38, 0x03, 0xD7}, + {0x03, 0x02, 0xE1}, + {0x06, 0x02, 0xE1}, + {0x0A, 0x02, 0xE1}, + {0x0F, 0x02, 0xE1}, + {0x18, 0x02, 0xE1}, + {0x1F, 0x02, 0xE1}, + {0x29, 0x02, 0xE1}, + {0x38, 0x03, 0xE1}, }, /* 185 */ { - {0x02, 2, 236}, - {0x09, 2, 236}, - {0x17, 2, 236}, - {0x28, 3, 236}, - {0x02, 2, 237}, - {0x09, 2, 237}, - {0x17, 2, 237}, - {0x28, 3, 237}, - {0x01, 2, 199}, - {0x16, 3, 199}, - {0x01, 2, 207}, - {0x16, 3, 207}, - {0x01, 2, 234}, - {0x16, 3, 234}, - {0x01, 2, 235}, - {0x16, 3, 235}, + {0x02, 0x02, 0xEC}, + {0x09, 0x02, 0xEC}, + {0x17, 0x02, 0xEC}, + {0x28, 0x03, 0xEC}, + {0x02, 0x02, 0xED}, + {0x09, 0x02, 0xED}, + {0x17, 0x02, 0xED}, + {0x28, 0x03, 0xED}, + {0x01, 0x02, 0xC7}, + {0x16, 0x03, 0xC7}, + {0x01, 0x02, 0xCF}, + {0x16, 0x03, 0xCF}, + {0x01, 0x02, 0xEA}, + {0x16, 0x03, 0xEA}, + {0x01, 0x02, 0xEB}, + {0x16, 0x03, 0xEB}, }, /* 186 */ { - {0x03, 2, 236}, - {0x06, 2, 236}, - {0x0a, 2, 236}, - {0x0f, 2, 236}, - {0x18, 2, 236}, - {0x1f, 2, 236}, - {0x29, 2, 236}, - {0x38, 3, 236}, - {0x03, 2, 237}, - {0x06, 2, 237}, - {0x0a, 2, 237}, - {0x0f, 2, 237}, - {0x18, 2, 237}, - {0x1f, 2, 237}, - {0x29, 2, 237}, - {0x38, 3, 237}, + {0x03, 0x02, 0xEC}, + {0x06, 0x02, 0xEC}, + {0x0A, 0x02, 0xEC}, + {0x0F, 0x02, 0xEC}, + {0x18, 0x02, 0xEC}, + {0x1F, 0x02, 0xEC}, + {0x29, 0x02, 0xEC}, + {0x38, 0x03, 0xEC}, + {0x03, 0x02, 0xED}, + {0x06, 0x02, 0xED}, + {0x0A, 0x02, 0xED}, + {0x0F, 0x02, 0xED}, + {0x18, 0x02, 0xED}, + {0x1F, 0x02, 0xED}, + {0x29, 0x02, 0xED}, + {0x38, 0x03, 0xED}, }, /* 187 */ { - {0x02, 2, 199}, - {0x09, 2, 199}, - {0x17, 2, 199}, - {0x28, 3, 199}, - {0x02, 2, 207}, - {0x09, 2, 207}, - {0x17, 2, 207}, - {0x28, 3, 207}, - {0x02, 2, 234}, - {0x09, 2, 234}, - {0x17, 2, 234}, - {0x28, 3, 234}, - {0x02, 2, 235}, - {0x09, 2, 235}, - {0x17, 2, 235}, - {0x28, 3, 235}, + {0x02, 0x02, 0xC7}, + {0x09, 0x02, 0xC7}, + {0x17, 0x02, 0xC7}, + {0x28, 0x03, 0xC7}, + {0x02, 0x02, 0xCF}, + {0x09, 0x02, 0xCF}, + {0x17, 0x02, 0xCF}, + {0x28, 0x03, 0xCF}, + {0x02, 0x02, 0xEA}, + {0x09, 0x02, 0xEA}, + {0x17, 0x02, 0xEA}, + {0x28, 0x03, 0xEA}, + {0x02, 0x02, 0xEB}, + {0x09, 0x02, 0xEB}, + {0x17, 0x02, 0xEB}, + {0x28, 0x03, 0xEB}, }, /* 188 */ { - {0x03, 2, 199}, - {0x06, 2, 199}, - {0x0a, 2, 199}, - {0x0f, 2, 199}, - {0x18, 2, 199}, - {0x1f, 2, 199}, - {0x29, 2, 199}, - {0x38, 3, 199}, - {0x03, 2, 207}, - {0x06, 2, 207}, - {0x0a, 2, 207}, - {0x0f, 2, 207}, - {0x18, 2, 207}, - {0x1f, 2, 207}, - {0x29, 2, 207}, - {0x38, 3, 207}, + {0x03, 0x02, 0xC7}, + {0x06, 0x02, 0xC7}, + {0x0A, 0x02, 0xC7}, + {0x0F, 0x02, 0xC7}, + {0x18, 0x02, 0xC7}, + {0x1F, 0x02, 0xC7}, + {0x29, 0x02, 0xC7}, + {0x38, 0x03, 0xC7}, + {0x03, 0x02, 0xCF}, + {0x06, 0x02, 0xCF}, + {0x0A, 0x02, 0xCF}, + {0x0F, 0x02, 0xCF}, + {0x18, 0x02, 0xCF}, + {0x1F, 0x02, 0xCF}, + {0x29, 0x02, 0xCF}, + {0x38, 0x03, 0xCF}, }, /* 189 */ { - {0x03, 2, 234}, - {0x06, 2, 234}, - {0x0a, 2, 234}, - {0x0f, 2, 234}, - {0x18, 2, 234}, - {0x1f, 2, 234}, - {0x29, 2, 234}, - {0x38, 3, 234}, - {0x03, 2, 235}, - {0x06, 2, 235}, - {0x0a, 2, 235}, - {0x0f, 2, 235}, - {0x18, 2, 235}, - {0x1f, 2, 235}, - {0x29, 2, 235}, - {0x38, 3, 235}, + {0x03, 0x02, 0xEA}, + {0x06, 0x02, 0xEA}, + {0x0A, 0x02, 0xEA}, + {0x0F, 0x02, 0xEA}, + {0x18, 0x02, 0xEA}, + {0x1F, 0x02, 0xEA}, + {0x29, 0x02, 0xEA}, + {0x38, 0x03, 0xEA}, + {0x03, 0x02, 0xEB}, + {0x06, 0x02, 0xEB}, + {0x0A, 0x02, 0xEB}, + {0x0F, 0x02, 0xEB}, + {0x18, 0x02, 0xEB}, + {0x1F, 0x02, 0xEB}, + {0x29, 0x02, 0xEB}, + {0x38, 0x03, 0xEB}, }, /* 190 */ { - {0xc2, 0, 0}, - {0xc3, 0, 0}, - {0xc5, 0, 0}, - {0xc6, 0, 0}, - {0xc9, 0, 0}, - {0xca, 0, 0}, - {0xcc, 0, 0}, - {0xcd, 0, 0}, - {0xd2, 0, 0}, - {0xd5, 0, 0}, - {0xd9, 0, 0}, - {0xdc, 0, 0}, - {0xe1, 0, 0}, - {0xe7, 0, 0}, - {0xef, 0, 0}, - {0xf6, 0, 0}, + {0xC2, 0x00, 0x00}, + {0xC3, 0x00, 0x00}, + {0xC5, 0x00, 0x00}, + {0xC6, 0x00, 0x00}, + {0xC9, 0x00, 0x00}, + {0xCA, 0x00, 0x00}, + {0xCC, 0x00, 0x00}, + {0xCD, 0x00, 0x00}, + {0xD2, 0x00, 0x00}, + {0xD5, 0x00, 0x00}, + {0xD9, 0x00, 0x00}, + {0xDC, 0x00, 0x00}, + {0xE1, 0x00, 0x00}, + {0xE7, 0x00, 0x00}, + {0xEF, 0x00, 0x00}, + {0xF6, 0x00, 0x00}, }, /* 191 */ { - {0x00, 3, 192}, - {0x00, 3, 193}, - {0x00, 3, 200}, - {0x00, 3, 201}, - {0x00, 3, 202}, - {0x00, 3, 205}, - {0x00, 3, 210}, - {0x00, 3, 213}, - {0x00, 3, 218}, - {0x00, 3, 219}, - {0x00, 3, 238}, - {0x00, 3, 240}, - {0x00, 3, 242}, - {0x00, 3, 243}, - {0x00, 3, 255}, - {0xce, 0, 0}, + {0x00, 0x03, 0xC0}, + {0x00, 0x03, 0xC1}, + {0x00, 0x03, 0xC8}, + {0x00, 0x03, 0xC9}, + {0x00, 0x03, 0xCA}, + {0x00, 0x03, 0xCD}, + {0x00, 0x03, 0xD2}, + {0x00, 0x03, 0xD5}, + {0x00, 0x03, 0xDA}, + {0x00, 0x03, 0xDB}, + {0x00, 0x03, 0xEE}, + {0x00, 0x03, 0xF0}, + {0x00, 0x03, 0xF2}, + {0x00, 0x03, 0xF3}, + {0x00, 0x03, 0xFF}, + {0xCE, 0x00, 0x00}, }, /* 192 */ { - {0x01, 2, 192}, - {0x16, 3, 192}, - {0x01, 2, 193}, - {0x16, 3, 193}, - {0x01, 2, 200}, - {0x16, 3, 200}, - {0x01, 2, 201}, - {0x16, 3, 201}, - {0x01, 2, 202}, - {0x16, 3, 202}, - {0x01, 2, 205}, - {0x16, 3, 205}, - {0x01, 2, 210}, - {0x16, 3, 210}, - {0x01, 2, 213}, - {0x16, 3, 213}, + {0x01, 0x02, 0xC0}, + {0x16, 0x03, 0xC0}, + {0x01, 0x02, 0xC1}, + {0x16, 0x03, 0xC1}, + {0x01, 0x02, 0xC8}, + {0x16, 0x03, 0xC8}, + {0x01, 0x02, 0xC9}, + {0x16, 0x03, 0xC9}, + {0x01, 0x02, 0xCA}, + {0x16, 0x03, 0xCA}, + {0x01, 0x02, 0xCD}, + {0x16, 0x03, 0xCD}, + {0x01, 0x02, 0xD2}, + {0x16, 0x03, 0xD2}, + {0x01, 0x02, 0xD5}, + {0x16, 0x03, 0xD5}, }, /* 193 */ { - {0x02, 2, 192}, - {0x09, 2, 192}, - {0x17, 2, 192}, - {0x28, 3, 192}, - {0x02, 2, 193}, - {0x09, 2, 193}, - {0x17, 2, 193}, - {0x28, 3, 193}, - {0x02, 2, 200}, - {0x09, 2, 200}, - {0x17, 2, 200}, - {0x28, 3, 200}, - {0x02, 2, 201}, - {0x09, 2, 201}, - {0x17, 2, 201}, - {0x28, 3, 201}, + {0x02, 0x02, 0xC0}, + {0x09, 0x02, 0xC0}, + {0x17, 0x02, 0xC0}, + {0x28, 0x03, 0xC0}, + {0x02, 0x02, 0xC1}, + {0x09, 0x02, 0xC1}, + {0x17, 0x02, 0xC1}, + {0x28, 0x03, 0xC1}, + {0x02, 0x02, 0xC8}, + {0x09, 0x02, 0xC8}, + {0x17, 0x02, 0xC8}, + {0x28, 0x03, 0xC8}, + {0x02, 0x02, 0xC9}, + {0x09, 0x02, 0xC9}, + {0x17, 0x02, 0xC9}, + {0x28, 0x03, 0xC9}, }, /* 194 */ { - {0x03, 2, 192}, - {0x06, 2, 192}, - {0x0a, 2, 192}, - {0x0f, 2, 192}, - {0x18, 2, 192}, - {0x1f, 2, 192}, - {0x29, 2, 192}, - {0x38, 3, 192}, - {0x03, 2, 193}, - {0x06, 2, 193}, - {0x0a, 2, 193}, - {0x0f, 2, 193}, - {0x18, 2, 193}, - {0x1f, 2, 193}, - {0x29, 2, 193}, - {0x38, 3, 193}, + {0x03, 0x02, 0xC0}, + {0x06, 0x02, 0xC0}, + {0x0A, 0x02, 0xC0}, + {0x0F, 0x02, 0xC0}, + {0x18, 0x02, 0xC0}, + {0x1F, 0x02, 0xC0}, + {0x29, 0x02, 0xC0}, + {0x38, 0x03, 0xC0}, + {0x03, 0x02, 0xC1}, + {0x06, 0x02, 0xC1}, + {0x0A, 0x02, 0xC1}, + {0x0F, 0x02, 0xC1}, + {0x18, 0x02, 0xC1}, + {0x1F, 0x02, 0xC1}, + {0x29, 0x02, 0xC1}, + {0x38, 0x03, 0xC1}, }, /* 195 */ { - {0x03, 2, 200}, - {0x06, 2, 200}, - {0x0a, 2, 200}, - {0x0f, 2, 200}, - {0x18, 2, 200}, - {0x1f, 2, 200}, - {0x29, 2, 200}, - {0x38, 3, 200}, - {0x03, 2, 201}, - {0x06, 2, 201}, - {0x0a, 2, 201}, - {0x0f, 2, 201}, - {0x18, 2, 201}, - {0x1f, 2, 201}, - {0x29, 2, 201}, - {0x38, 3, 201}, + {0x03, 0x02, 0xC8}, + {0x06, 0x02, 0xC8}, + {0x0A, 0x02, 0xC8}, + {0x0F, 0x02, 0xC8}, + {0x18, 0x02, 0xC8}, + {0x1F, 0x02, 0xC8}, + {0x29, 0x02, 0xC8}, + {0x38, 0x03, 0xC8}, + {0x03, 0x02, 0xC9}, + {0x06, 0x02, 0xC9}, + {0x0A, 0x02, 0xC9}, + {0x0F, 0x02, 0xC9}, + {0x18, 0x02, 0xC9}, + {0x1F, 0x02, 0xC9}, + {0x29, 0x02, 0xC9}, + {0x38, 0x03, 0xC9}, }, /* 196 */ { - {0x02, 2, 202}, - {0x09, 2, 202}, - {0x17, 2, 202}, - {0x28, 3, 202}, - {0x02, 2, 205}, - {0x09, 2, 205}, - {0x17, 2, 205}, - {0x28, 3, 205}, - {0x02, 2, 210}, - {0x09, 2, 210}, - {0x17, 2, 210}, - {0x28, 3, 210}, - {0x02, 2, 213}, - {0x09, 2, 213}, - {0x17, 2, 213}, - {0x28, 3, 213}, + {0x02, 0x02, 0xCA}, + {0x09, 0x02, 0xCA}, + {0x17, 0x02, 0xCA}, + {0x28, 0x03, 0xCA}, + {0x02, 0x02, 0xCD}, + {0x09, 0x02, 0xCD}, + {0x17, 0x02, 0xCD}, + {0x28, 0x03, 0xCD}, + {0x02, 0x02, 0xD2}, + {0x09, 0x02, 0xD2}, + {0x17, 0x02, 0xD2}, + {0x28, 0x03, 0xD2}, + {0x02, 0x02, 0xD5}, + {0x09, 0x02, 0xD5}, + {0x17, 0x02, 0xD5}, + {0x28, 0x03, 0xD5}, }, /* 197 */ { - {0x03, 2, 202}, - {0x06, 2, 202}, - {0x0a, 2, 202}, - {0x0f, 2, 202}, - {0x18, 2, 202}, - {0x1f, 2, 202}, - {0x29, 2, 202}, - {0x38, 3, 202}, - {0x03, 2, 205}, - {0x06, 2, 205}, - {0x0a, 2, 205}, - {0x0f, 2, 205}, - {0x18, 2, 205}, - {0x1f, 2, 205}, - {0x29, 2, 205}, - {0x38, 3, 205}, + {0x03, 0x02, 0xCA}, + {0x06, 0x02, 0xCA}, + {0x0A, 0x02, 0xCA}, + {0x0F, 0x02, 0xCA}, + {0x18, 0x02, 0xCA}, + {0x1F, 0x02, 0xCA}, + {0x29, 0x02, 0xCA}, + {0x38, 0x03, 0xCA}, + {0x03, 0x02, 0xCD}, + {0x06, 0x02, 0xCD}, + {0x0A, 0x02, 0xCD}, + {0x0F, 0x02, 0xCD}, + {0x18, 0x02, 0xCD}, + {0x1F, 0x02, 0xCD}, + {0x29, 0x02, 0xCD}, + {0x38, 0x03, 0xCD}, }, /* 198 */ { - {0x03, 2, 210}, - {0x06, 2, 210}, - {0x0a, 2, 210}, - {0x0f, 2, 210}, - {0x18, 2, 210}, - {0x1f, 2, 210}, - {0x29, 2, 210}, - {0x38, 3, 210}, - {0x03, 2, 213}, - {0x06, 2, 213}, - {0x0a, 2, 213}, - {0x0f, 2, 213}, - {0x18, 2, 213}, - {0x1f, 2, 213}, - {0x29, 2, 213}, - {0x38, 3, 213}, + {0x03, 0x02, 0xD2}, + {0x06, 0x02, 0xD2}, + {0x0A, 0x02, 0xD2}, + {0x0F, 0x02, 0xD2}, + {0x18, 0x02, 0xD2}, + {0x1F, 0x02, 0xD2}, + {0x29, 0x02, 0xD2}, + {0x38, 0x03, 0xD2}, + {0x03, 0x02, 0xD5}, + {0x06, 0x02, 0xD5}, + {0x0A, 0x02, 0xD5}, + {0x0F, 0x02, 0xD5}, + {0x18, 0x02, 0xD5}, + {0x1F, 0x02, 0xD5}, + {0x29, 0x02, 0xD5}, + {0x38, 0x03, 0xD5}, }, /* 199 */ { - {0x01, 2, 218}, - {0x16, 3, 218}, - {0x01, 2, 219}, - {0x16, 3, 219}, - {0x01, 2, 238}, - {0x16, 3, 238}, - {0x01, 2, 240}, - {0x16, 3, 240}, - {0x01, 2, 242}, - {0x16, 3, 242}, - {0x01, 2, 243}, - {0x16, 3, 243}, - {0x01, 2, 255}, - {0x16, 3, 255}, - {0x00, 3, 203}, - {0x00, 3, 204}, + {0x01, 0x02, 0xDA}, + {0x16, 0x03, 0xDA}, + {0x01, 0x02, 0xDB}, + {0x16, 0x03, 0xDB}, + {0x01, 0x02, 0xEE}, + {0x16, 0x03, 0xEE}, + {0x01, 0x02, 0xF0}, + {0x16, 0x03, 0xF0}, + {0x01, 0x02, 0xF2}, + {0x16, 0x03, 0xF2}, + {0x01, 0x02, 0xF3}, + {0x16, 0x03, 0xF3}, + {0x01, 0x02, 0xFF}, + {0x16, 0x03, 0xFF}, + {0x00, 0x03, 0xCB}, + {0x00, 0x03, 0xCC}, }, /* 200 */ { - {0x02, 2, 218}, - {0x09, 2, 218}, - {0x17, 2, 218}, - {0x28, 3, 218}, - {0x02, 2, 219}, - {0x09, 2, 219}, - {0x17, 2, 219}, - {0x28, 3, 219}, - {0x02, 2, 238}, - {0x09, 2, 238}, - {0x17, 2, 238}, - {0x28, 3, 238}, - {0x02, 2, 240}, - {0x09, 2, 240}, - {0x17, 2, 240}, - {0x28, 3, 240}, + {0x02, 0x02, 0xDA}, + {0x09, 0x02, 0xDA}, + {0x17, 0x02, 0xDA}, + {0x28, 0x03, 0xDA}, + {0x02, 0x02, 0xDB}, + {0x09, 0x02, 0xDB}, + {0x17, 0x02, 0xDB}, + {0x28, 0x03, 0xDB}, + {0x02, 0x02, 0xEE}, + {0x09, 0x02, 0xEE}, + {0x17, 0x02, 0xEE}, + {0x28, 0x03, 0xEE}, + {0x02, 0x02, 0xF0}, + {0x09, 0x02, 0xF0}, + {0x17, 0x02, 0xF0}, + {0x28, 0x03, 0xF0}, }, /* 201 */ { - {0x03, 2, 218}, - {0x06, 2, 218}, - {0x0a, 2, 218}, - {0x0f, 2, 218}, - {0x18, 2, 218}, - {0x1f, 2, 218}, - {0x29, 2, 218}, - {0x38, 3, 218}, - {0x03, 2, 219}, - {0x06, 2, 219}, - {0x0a, 2, 219}, - {0x0f, 2, 219}, - {0x18, 2, 219}, - {0x1f, 2, 219}, - {0x29, 2, 219}, - {0x38, 3, 219}, + {0x03, 0x02, 0xDA}, + {0x06, 0x02, 0xDA}, + {0x0A, 0x02, 0xDA}, + {0x0F, 0x02, 0xDA}, + {0x18, 0x02, 0xDA}, + {0x1F, 0x02, 0xDA}, + {0x29, 0x02, 0xDA}, + {0x38, 0x03, 0xDA}, + {0x03, 0x02, 0xDB}, + {0x06, 0x02, 0xDB}, + {0x0A, 0x02, 0xDB}, + {0x0F, 0x02, 0xDB}, + {0x18, 0x02, 0xDB}, + {0x1F, 0x02, 0xDB}, + {0x29, 0x02, 0xDB}, + {0x38, 0x03, 0xDB}, }, /* 202 */ { - {0x03, 2, 238}, - {0x06, 2, 238}, - {0x0a, 2, 238}, - {0x0f, 2, 238}, - {0x18, 2, 238}, - {0x1f, 2, 238}, - {0x29, 2, 238}, - {0x38, 3, 238}, - {0x03, 2, 240}, - {0x06, 2, 240}, - {0x0a, 2, 240}, - {0x0f, 2, 240}, - {0x18, 2, 240}, - {0x1f, 2, 240}, - {0x29, 2, 240}, - {0x38, 3, 240}, + {0x03, 0x02, 0xEE}, + {0x06, 0x02, 0xEE}, + {0x0A, 0x02, 0xEE}, + {0x0F, 0x02, 0xEE}, + {0x18, 0x02, 0xEE}, + {0x1F, 0x02, 0xEE}, + {0x29, 0x02, 0xEE}, + {0x38, 0x03, 0xEE}, + {0x03, 0x02, 0xF0}, + {0x06, 0x02, 0xF0}, + {0x0A, 0x02, 0xF0}, + {0x0F, 0x02, 0xF0}, + {0x18, 0x02, 0xF0}, + {0x1F, 0x02, 0xF0}, + {0x29, 0x02, 0xF0}, + {0x38, 0x03, 0xF0}, }, /* 203 */ { - {0x02, 2, 242}, - {0x09, 2, 242}, - {0x17, 2, 242}, - {0x28, 3, 242}, - {0x02, 2, 243}, - {0x09, 2, 243}, - {0x17, 2, 243}, - {0x28, 3, 243}, - {0x02, 2, 255}, - {0x09, 2, 255}, - {0x17, 2, 255}, - {0x28, 3, 255}, - {0x01, 2, 203}, - {0x16, 3, 203}, - {0x01, 2, 204}, - {0x16, 3, 204}, + {0x02, 0x02, 0xF2}, + {0x09, 0x02, 0xF2}, + {0x17, 0x02, 0xF2}, + {0x28, 0x03, 0xF2}, + {0x02, 0x02, 0xF3}, + {0x09, 0x02, 0xF3}, + {0x17, 0x02, 0xF3}, + {0x28, 0x03, 0xF3}, + {0x02, 0x02, 0xFF}, + {0x09, 0x02, 0xFF}, + {0x17, 0x02, 0xFF}, + {0x28, 0x03, 0xFF}, + {0x01, 0x02, 0xCB}, + {0x16, 0x03, 0xCB}, + {0x01, 0x02, 0xCC}, + {0x16, 0x03, 0xCC}, }, /* 204 */ { - {0x03, 2, 242}, - {0x06, 2, 242}, - {0x0a, 2, 242}, - {0x0f, 2, 242}, - {0x18, 2, 242}, - {0x1f, 2, 242}, - {0x29, 2, 242}, - {0x38, 3, 242}, - {0x03, 2, 243}, - {0x06, 2, 243}, - {0x0a, 2, 243}, - {0x0f, 2, 243}, - {0x18, 2, 243}, - {0x1f, 2, 243}, - {0x29, 2, 243}, - {0x38, 3, 243}, + {0x03, 0x02, 0xF2}, + {0x06, 0x02, 0xF2}, + {0x0A, 0x02, 0xF2}, + {0x0F, 0x02, 0xF2}, + {0x18, 0x02, 0xF2}, + {0x1F, 0x02, 0xF2}, + {0x29, 0x02, 0xF2}, + {0x38, 0x03, 0xF2}, + {0x03, 0x02, 0xF3}, + {0x06, 0x02, 0xF3}, + {0x0A, 0x02, 0xF3}, + {0x0F, 0x02, 0xF3}, + {0x18, 0x02, 0xF3}, + {0x1F, 0x02, 0xF3}, + {0x29, 0x02, 0xF3}, + {0x38, 0x03, 0xF3}, }, /* 205 */ { - {0x03, 2, 255}, - {0x06, 2, 255}, - {0x0a, 2, 255}, - {0x0f, 2, 255}, - {0x18, 2, 255}, - {0x1f, 2, 255}, - {0x29, 2, 255}, - {0x38, 3, 255}, - {0x02, 2, 203}, - {0x09, 2, 203}, - {0x17, 2, 203}, - {0x28, 3, 203}, - {0x02, 2, 204}, - {0x09, 2, 204}, - {0x17, 2, 204}, - {0x28, 3, 204}, + {0x03, 0x02, 0xFF}, + {0x06, 0x02, 0xFF}, + {0x0A, 0x02, 0xFF}, + {0x0F, 0x02, 0xFF}, + {0x18, 0x02, 0xFF}, + {0x1F, 0x02, 0xFF}, + {0x29, 0x02, 0xFF}, + {0x38, 0x03, 0xFF}, + {0x02, 0x02, 0xCB}, + {0x09, 0x02, 0xCB}, + {0x17, 0x02, 0xCB}, + {0x28, 0x03, 0xCB}, + {0x02, 0x02, 0xCC}, + {0x09, 0x02, 0xCC}, + {0x17, 0x02, 0xCC}, + {0x28, 0x03, 0xCC}, }, /* 206 */ { - {0x03, 2, 203}, - {0x06, 2, 203}, - {0x0a, 2, 203}, - {0x0f, 2, 203}, - {0x18, 2, 203}, - {0x1f, 2, 203}, - {0x29, 2, 203}, - {0x38, 3, 203}, - {0x03, 2, 204}, - {0x06, 2, 204}, - {0x0a, 2, 204}, - {0x0f, 2, 204}, - {0x18, 2, 204}, - {0x1f, 2, 204}, - {0x29, 2, 204}, - {0x38, 3, 204}, + {0x03, 0x02, 0xCB}, + {0x06, 0x02, 0xCB}, + {0x0A, 0x02, 0xCB}, + {0x0F, 0x02, 0xCB}, + {0x18, 0x02, 0xCB}, + {0x1F, 0x02, 0xCB}, + {0x29, 0x02, 0xCB}, + {0x38, 0x03, 0xCB}, + {0x03, 0x02, 0xCC}, + {0x06, 0x02, 0xCC}, + {0x0A, 0x02, 0xCC}, + {0x0F, 0x02, 0xCC}, + {0x18, 0x02, 0xCC}, + {0x1F, 0x02, 0xCC}, + {0x29, 0x02, 0xCC}, + {0x38, 0x03, 0xCC}, }, /* 207 */ { - {0xd3, 0, 0}, - {0xd4, 0, 0}, - {0xd6, 0, 0}, - {0xd7, 0, 0}, - {0xda, 0, 0}, - {0xdb, 0, 0}, - {0xdd, 0, 0}, - {0xde, 0, 0}, - {0xe2, 0, 0}, - {0xe4, 0, 0}, - {0xe8, 0, 0}, - {0xeb, 0, 0}, - {0xf0, 0, 0}, - {0xf3, 0, 0}, - {0xf7, 0, 0}, - {0xfa, 0, 0}, + {0xD3, 0x00, 0x00}, + {0xD4, 0x00, 0x00}, + {0xD6, 0x00, 0x00}, + {0xD7, 0x00, 0x00}, + {0xDA, 0x00, 0x00}, + {0xDB, 0x00, 0x00}, + {0xDD, 0x00, 0x00}, + {0xDE, 0x00, 0x00}, + {0xE2, 0x00, 0x00}, + {0xE4, 0x00, 0x00}, + {0xE8, 0x00, 0x00}, + {0xEB, 0x00, 0x00}, + {0xF0, 0x00, 0x00}, + {0xF3, 0x00, 0x00}, + {0xF7, 0x00, 0x00}, + {0xFA, 0x00, 0x00}, }, /* 208 */ { - {0x00, 3, 211}, - {0x00, 3, 212}, - {0x00, 3, 214}, - {0x00, 3, 221}, - {0x00, 3, 222}, - {0x00, 3, 223}, - {0x00, 3, 241}, - {0x00, 3, 244}, - {0x00, 3, 245}, - {0x00, 3, 246}, - {0x00, 3, 247}, - {0x00, 3, 248}, - {0x00, 3, 250}, - {0x00, 3, 251}, - {0x00, 3, 252}, - {0x00, 3, 253}, + {0x00, 0x03, 0xD3}, + {0x00, 0x03, 0xD4}, + {0x00, 0x03, 0xD6}, + {0x00, 0x03, 0xDD}, + {0x00, 0x03, 0xDE}, + {0x00, 0x03, 0xDF}, + {0x00, 0x03, 0xF1}, + {0x00, 0x03, 0xF4}, + {0x00, 0x03, 0xF5}, + {0x00, 0x03, 0xF6}, + {0x00, 0x03, 0xF7}, + {0x00, 0x03, 0xF8}, + {0x00, 0x03, 0xFA}, + {0x00, 0x03, 0xFB}, + {0x00, 0x03, 0xFC}, + {0x00, 0x03, 0xFD}, }, /* 209 */ { - {0x01, 2, 211}, - {0x16, 3, 211}, - {0x01, 2, 212}, - {0x16, 3, 212}, - {0x01, 2, 214}, - {0x16, 3, 214}, - {0x01, 2, 221}, - {0x16, 3, 221}, - {0x01, 2, 222}, - {0x16, 3, 222}, - {0x01, 2, 223}, - {0x16, 3, 223}, - {0x01, 2, 241}, - {0x16, 3, 241}, - {0x01, 2, 244}, - {0x16, 3, 244}, + {0x01, 0x02, 0xD3}, + {0x16, 0x03, 0xD3}, + {0x01, 0x02, 0xD4}, + {0x16, 0x03, 0xD4}, + {0x01, 0x02, 0xD6}, + {0x16, 0x03, 0xD6}, + {0x01, 0x02, 0xDD}, + {0x16, 0x03, 0xDD}, + {0x01, 0x02, 0xDE}, + {0x16, 0x03, 0xDE}, + {0x01, 0x02, 0xDF}, + {0x16, 0x03, 0xDF}, + {0x01, 0x02, 0xF1}, + {0x16, 0x03, 0xF1}, + {0x01, 0x02, 0xF4}, + {0x16, 0x03, 0xF4}, }, /* 210 */ { - {0x02, 2, 211}, - {0x09, 2, 211}, - {0x17, 2, 211}, - {0x28, 3, 211}, - {0x02, 2, 212}, - {0x09, 2, 212}, - {0x17, 2, 212}, - {0x28, 3, 212}, - {0x02, 2, 214}, - {0x09, 2, 214}, - {0x17, 2, 214}, - {0x28, 3, 214}, - {0x02, 2, 221}, - {0x09, 2, 221}, - {0x17, 2, 221}, - {0x28, 3, 221}, + {0x02, 0x02, 0xD3}, + {0x09, 0x02, 0xD3}, + {0x17, 0x02, 0xD3}, + {0x28, 0x03, 0xD3}, + {0x02, 0x02, 0xD4}, + {0x09, 0x02, 0xD4}, + {0x17, 0x02, 0xD4}, + {0x28, 0x03, 0xD4}, + {0x02, 0x02, 0xD6}, + {0x09, 0x02, 0xD6}, + {0x17, 0x02, 0xD6}, + {0x28, 0x03, 0xD6}, + {0x02, 0x02, 0xDD}, + {0x09, 0x02, 0xDD}, + {0x17, 0x02, 0xDD}, + {0x28, 0x03, 0xDD}, }, /* 211 */ { - {0x03, 2, 211}, - {0x06, 2, 211}, - {0x0a, 2, 211}, - {0x0f, 2, 211}, - {0x18, 2, 211}, - {0x1f, 2, 211}, - {0x29, 2, 211}, - {0x38, 3, 211}, - {0x03, 2, 212}, - {0x06, 2, 212}, - {0x0a, 2, 212}, - {0x0f, 2, 212}, - {0x18, 2, 212}, - {0x1f, 2, 212}, - {0x29, 2, 212}, - {0x38, 3, 212}, + {0x03, 0x02, 0xD3}, + {0x06, 0x02, 0xD3}, + {0x0A, 0x02, 0xD3}, + {0x0F, 0x02, 0xD3}, + {0x18, 0x02, 0xD3}, + {0x1F, 0x02, 0xD3}, + {0x29, 0x02, 0xD3}, + {0x38, 0x03, 0xD3}, + {0x03, 0x02, 0xD4}, + {0x06, 0x02, 0xD4}, + {0x0A, 0x02, 0xD4}, + {0x0F, 0x02, 0xD4}, + {0x18, 0x02, 0xD4}, + {0x1F, 0x02, 0xD4}, + {0x29, 0x02, 0xD4}, + {0x38, 0x03, 0xD4}, }, /* 212 */ { - {0x03, 2, 214}, - {0x06, 2, 214}, - {0x0a, 2, 214}, - {0x0f, 2, 214}, - {0x18, 2, 214}, - {0x1f, 2, 214}, - {0x29, 2, 214}, - {0x38, 3, 214}, - {0x03, 2, 221}, - {0x06, 2, 221}, - {0x0a, 2, 221}, - {0x0f, 2, 221}, - {0x18, 2, 221}, - {0x1f, 2, 221}, - {0x29, 2, 221}, - {0x38, 3, 221}, + {0x03, 0x02, 0xD6}, + {0x06, 0x02, 0xD6}, + {0x0A, 0x02, 0xD6}, + {0x0F, 0x02, 0xD6}, + {0x18, 0x02, 0xD6}, + {0x1F, 0x02, 0xD6}, + {0x29, 0x02, 0xD6}, + {0x38, 0x03, 0xD6}, + {0x03, 0x02, 0xDD}, + {0x06, 0x02, 0xDD}, + {0x0A, 0x02, 0xDD}, + {0x0F, 0x02, 0xDD}, + {0x18, 0x02, 0xDD}, + {0x1F, 0x02, 0xDD}, + {0x29, 0x02, 0xDD}, + {0x38, 0x03, 0xDD}, }, /* 213 */ { - {0x02, 2, 222}, - {0x09, 2, 222}, - {0x17, 2, 222}, - {0x28, 3, 222}, - {0x02, 2, 223}, - {0x09, 2, 223}, - {0x17, 2, 223}, - {0x28, 3, 223}, - {0x02, 2, 241}, - {0x09, 2, 241}, - {0x17, 2, 241}, - {0x28, 3, 241}, - {0x02, 2, 244}, - {0x09, 2, 244}, - {0x17, 2, 244}, - {0x28, 3, 244}, + {0x02, 0x02, 0xDE}, + {0x09, 0x02, 0xDE}, + {0x17, 0x02, 0xDE}, + {0x28, 0x03, 0xDE}, + {0x02, 0x02, 0xDF}, + {0x09, 0x02, 0xDF}, + {0x17, 0x02, 0xDF}, + {0x28, 0x03, 0xDF}, + {0x02, 0x02, 0xF1}, + {0x09, 0x02, 0xF1}, + {0x17, 0x02, 0xF1}, + {0x28, 0x03, 0xF1}, + {0x02, 0x02, 0xF4}, + {0x09, 0x02, 0xF4}, + {0x17, 0x02, 0xF4}, + {0x28, 0x03, 0xF4}, }, /* 214 */ { - {0x03, 2, 222}, - {0x06, 2, 222}, - {0x0a, 2, 222}, - {0x0f, 2, 222}, - {0x18, 2, 222}, - {0x1f, 2, 222}, - {0x29, 2, 222}, - {0x38, 3, 222}, - {0x03, 2, 223}, - {0x06, 2, 223}, - {0x0a, 2, 223}, - {0x0f, 2, 223}, - {0x18, 2, 223}, - {0x1f, 2, 223}, - {0x29, 2, 223}, - {0x38, 3, 223}, + {0x03, 0x02, 0xDE}, + {0x06, 0x02, 0xDE}, + {0x0A, 0x02, 0xDE}, + {0x0F, 0x02, 0xDE}, + {0x18, 0x02, 0xDE}, + {0x1F, 0x02, 0xDE}, + {0x29, 0x02, 0xDE}, + {0x38, 0x03, 0xDE}, + {0x03, 0x02, 0xDF}, + {0x06, 0x02, 0xDF}, + {0x0A, 0x02, 0xDF}, + {0x0F, 0x02, 0xDF}, + {0x18, 0x02, 0xDF}, + {0x1F, 0x02, 0xDF}, + {0x29, 0x02, 0xDF}, + {0x38, 0x03, 0xDF}, }, /* 215 */ { - {0x03, 2, 241}, - {0x06, 2, 241}, - {0x0a, 2, 241}, - {0x0f, 2, 241}, - {0x18, 2, 241}, - {0x1f, 2, 241}, - {0x29, 2, 241}, - {0x38, 3, 241}, - {0x03, 2, 244}, - {0x06, 2, 244}, - {0x0a, 2, 244}, - {0x0f, 2, 244}, - {0x18, 2, 244}, - {0x1f, 2, 244}, - {0x29, 2, 244}, - {0x38, 3, 244}, + {0x03, 0x02, 0xF1}, + {0x06, 0x02, 0xF1}, + {0x0A, 0x02, 0xF1}, + {0x0F, 0x02, 0xF1}, + {0x18, 0x02, 0xF1}, + {0x1F, 0x02, 0xF1}, + {0x29, 0x02, 0xF1}, + {0x38, 0x03, 0xF1}, + {0x03, 0x02, 0xF4}, + {0x06, 0x02, 0xF4}, + {0x0A, 0x02, 0xF4}, + {0x0F, 0x02, 0xF4}, + {0x18, 0x02, 0xF4}, + {0x1F, 0x02, 0xF4}, + {0x29, 0x02, 0xF4}, + {0x38, 0x03, 0xF4}, }, /* 216 */ { - {0x01, 2, 245}, - {0x16, 3, 245}, - {0x01, 2, 246}, - {0x16, 3, 246}, - {0x01, 2, 247}, - {0x16, 3, 247}, - {0x01, 2, 248}, - {0x16, 3, 248}, - {0x01, 2, 250}, - {0x16, 3, 250}, - {0x01, 2, 251}, - {0x16, 3, 251}, - {0x01, 2, 252}, - {0x16, 3, 252}, - {0x01, 2, 253}, - {0x16, 3, 253}, + {0x01, 0x02, 0xF5}, + {0x16, 0x03, 0xF5}, + {0x01, 0x02, 0xF6}, + {0x16, 0x03, 0xF6}, + {0x01, 0x02, 0xF7}, + {0x16, 0x03, 0xF7}, + {0x01, 0x02, 0xF8}, + {0x16, 0x03, 0xF8}, + {0x01, 0x02, 0xFA}, + {0x16, 0x03, 0xFA}, + {0x01, 0x02, 0xFB}, + {0x16, 0x03, 0xFB}, + {0x01, 0x02, 0xFC}, + {0x16, 0x03, 0xFC}, + {0x01, 0x02, 0xFD}, + {0x16, 0x03, 0xFD}, }, /* 217 */ { - {0x02, 2, 245}, - {0x09, 2, 245}, - {0x17, 2, 245}, - {0x28, 3, 245}, - {0x02, 2, 246}, - {0x09, 2, 246}, - {0x17, 2, 246}, - {0x28, 3, 246}, - {0x02, 2, 247}, - {0x09, 2, 247}, - {0x17, 2, 247}, - {0x28, 3, 247}, - {0x02, 2, 248}, - {0x09, 2, 248}, - {0x17, 2, 248}, - {0x28, 3, 248}, + {0x02, 0x02, 0xF5}, + {0x09, 0x02, 0xF5}, + {0x17, 0x02, 0xF5}, + {0x28, 0x03, 0xF5}, + {0x02, 0x02, 0xF6}, + {0x09, 0x02, 0xF6}, + {0x17, 0x02, 0xF6}, + {0x28, 0x03, 0xF6}, + {0x02, 0x02, 0xF7}, + {0x09, 0x02, 0xF7}, + {0x17, 0x02, 0xF7}, + {0x28, 0x03, 0xF7}, + {0x02, 0x02, 0xF8}, + {0x09, 0x02, 0xF8}, + {0x17, 0x02, 0xF8}, + {0x28, 0x03, 0xF8}, }, /* 218 */ { - {0x03, 2, 245}, - {0x06, 2, 245}, - {0x0a, 2, 245}, - {0x0f, 2, 245}, - {0x18, 2, 245}, - {0x1f, 2, 245}, - {0x29, 2, 245}, - {0x38, 3, 245}, - {0x03, 2, 246}, - {0x06, 2, 246}, - {0x0a, 2, 246}, - {0x0f, 2, 246}, - {0x18, 2, 246}, - {0x1f, 2, 246}, - {0x29, 2, 246}, - {0x38, 3, 246}, + {0x03, 0x02, 0xF5}, + {0x06, 0x02, 0xF5}, + {0x0A, 0x02, 0xF5}, + {0x0F, 0x02, 0xF5}, + {0x18, 0x02, 0xF5}, + {0x1F, 0x02, 0xF5}, + {0x29, 0x02, 0xF5}, + {0x38, 0x03, 0xF5}, + {0x03, 0x02, 0xF6}, + {0x06, 0x02, 0xF6}, + {0x0A, 0x02, 0xF6}, + {0x0F, 0x02, 0xF6}, + {0x18, 0x02, 0xF6}, + {0x1F, 0x02, 0xF6}, + {0x29, 0x02, 0xF6}, + {0x38, 0x03, 0xF6}, }, /* 219 */ { - {0x03, 2, 247}, - {0x06, 2, 247}, - {0x0a, 2, 247}, - {0x0f, 2, 247}, - {0x18, 2, 247}, - {0x1f, 2, 247}, - {0x29, 2, 247}, - {0x38, 3, 247}, - {0x03, 2, 248}, - {0x06, 2, 248}, - {0x0a, 2, 248}, - {0x0f, 2, 248}, - {0x18, 2, 248}, - {0x1f, 2, 248}, - {0x29, 2, 248}, - {0x38, 3, 248}, + {0x03, 0x02, 0xF7}, + {0x06, 0x02, 0xF7}, + {0x0A, 0x02, 0xF7}, + {0x0F, 0x02, 0xF7}, + {0x18, 0x02, 0xF7}, + {0x1F, 0x02, 0xF7}, + {0x29, 0x02, 0xF7}, + {0x38, 0x03, 0xF7}, + {0x03, 0x02, 0xF8}, + {0x06, 0x02, 0xF8}, + {0x0A, 0x02, 0xF8}, + {0x0F, 0x02, 0xF8}, + {0x18, 0x02, 0xF8}, + {0x1F, 0x02, 0xF8}, + {0x29, 0x02, 0xF8}, + {0x38, 0x03, 0xF8}, }, /* 220 */ { - {0x02, 2, 250}, - {0x09, 2, 250}, - {0x17, 2, 250}, - {0x28, 3, 250}, - {0x02, 2, 251}, - {0x09, 2, 251}, - {0x17, 2, 251}, - {0x28, 3, 251}, - {0x02, 2, 252}, - {0x09, 2, 252}, - {0x17, 2, 252}, - {0x28, 3, 252}, - {0x02, 2, 253}, - {0x09, 2, 253}, - {0x17, 2, 253}, - {0x28, 3, 253}, + {0x02, 0x02, 0xFA}, + {0x09, 0x02, 0xFA}, + {0x17, 0x02, 0xFA}, + {0x28, 0x03, 0xFA}, + {0x02, 0x02, 0xFB}, + {0x09, 0x02, 0xFB}, + {0x17, 0x02, 0xFB}, + {0x28, 0x03, 0xFB}, + {0x02, 0x02, 0xFC}, + {0x09, 0x02, 0xFC}, + {0x17, 0x02, 0xFC}, + {0x28, 0x03, 0xFC}, + {0x02, 0x02, 0xFD}, + {0x09, 0x02, 0xFD}, + {0x17, 0x02, 0xFD}, + {0x28, 0x03, 0xFD}, }, /* 221 */ { - {0x03, 2, 250}, - {0x06, 2, 250}, - {0x0a, 2, 250}, - {0x0f, 2, 250}, - {0x18, 2, 250}, - {0x1f, 2, 250}, - {0x29, 2, 250}, - {0x38, 3, 250}, - {0x03, 2, 251}, - {0x06, 2, 251}, - {0x0a, 2, 251}, - {0x0f, 2, 251}, - {0x18, 2, 251}, - {0x1f, 2, 251}, - {0x29, 2, 251}, - {0x38, 3, 251}, + {0x03, 0x02, 0xFA}, + {0x06, 0x02, 0xFA}, + {0x0A, 0x02, 0xFA}, + {0x0F, 0x02, 0xFA}, + {0x18, 0x02, 0xFA}, + {0x1F, 0x02, 0xFA}, + {0x29, 0x02, 0xFA}, + {0x38, 0x03, 0xFA}, + {0x03, 0x02, 0xFB}, + {0x06, 0x02, 0xFB}, + {0x0A, 0x02, 0xFB}, + {0x0F, 0x02, 0xFB}, + {0x18, 0x02, 0xFB}, + {0x1F, 0x02, 0xFB}, + {0x29, 0x02, 0xFB}, + {0x38, 0x03, 0xFB}, }, /* 222 */ { - {0x03, 2, 252}, - {0x06, 2, 252}, - {0x0a, 2, 252}, - {0x0f, 2, 252}, - {0x18, 2, 252}, - {0x1f, 2, 252}, - {0x29, 2, 252}, - {0x38, 3, 252}, - {0x03, 2, 253}, - {0x06, 2, 253}, - {0x0a, 2, 253}, - {0x0f, 2, 253}, - {0x18, 2, 253}, - {0x1f, 2, 253}, - {0x29, 2, 253}, - {0x38, 3, 253}, + {0x03, 0x02, 0xFC}, + {0x06, 0x02, 0xFC}, + {0x0A, 0x02, 0xFC}, + {0x0F, 0x02, 0xFC}, + {0x18, 0x02, 0xFC}, + {0x1F, 0x02, 0xFC}, + {0x29, 0x02, 0xFC}, + {0x38, 0x03, 0xFC}, + {0x03, 0x02, 0xFD}, + {0x06, 0x02, 0xFD}, + {0x0A, 0x02, 0xFD}, + {0x0F, 0x02, 0xFD}, + {0x18, 0x02, 0xFD}, + {0x1F, 0x02, 0xFD}, + {0x29, 0x02, 0xFD}, + {0x38, 0x03, 0xFD}, }, /* 223 */ { - {0x00, 3, 254}, - {0xe3, 0, 0}, - {0xe5, 0, 0}, - {0xe6, 0, 0}, - {0xe9, 0, 0}, - {0xea, 0, 0}, - {0xec, 0, 0}, - {0xed, 0, 0}, - {0xf1, 0, 0}, - {0xf2, 0, 0}, - {0xf4, 0, 0}, - {0xf5, 0, 0}, - {0xf8, 0, 0}, - {0xf9, 0, 0}, - {0xfb, 0, 0}, - {0xfc, 0, 0}, + {0x00, 0x03, 0xFE}, + {0xE3, 0x00, 0x00}, + {0xE5, 0x00, 0x00}, + {0xE6, 0x00, 0x00}, + {0xE9, 0x00, 0x00}, + {0xEA, 0x00, 0x00}, + {0xEC, 0x00, 0x00}, + {0xED, 0x00, 0x00}, + {0xF1, 0x00, 0x00}, + {0xF2, 0x00, 0x00}, + {0xF4, 0x00, 0x00}, + {0xF5, 0x00, 0x00}, + {0xF8, 0x00, 0x00}, + {0xF9, 0x00, 0x00}, + {0xFB, 0x00, 0x00}, + {0xFC, 0x00, 0x00}, }, /* 224 */ { - {0x01, 2, 254}, - {0x16, 3, 254}, - {0x00, 3, 2}, - {0x00, 3, 3}, - {0x00, 3, 4}, - {0x00, 3, 5}, - {0x00, 3, 6}, - {0x00, 3, 7}, - {0x00, 3, 8}, - {0x00, 3, 11}, - {0x00, 3, 12}, - {0x00, 3, 14}, - {0x00, 3, 15}, - {0x00, 3, 16}, - {0x00, 3, 17}, - {0x00, 3, 18}, + {0x01, 0x02, 0xFE}, + {0x16, 0x03, 0xFE}, + {0x00, 0x03, 0x02}, + {0x00, 0x03, 0x03}, + {0x00, 0x03, 0x04}, + {0x00, 0x03, 0x05}, + {0x00, 0x03, 0x06}, + {0x00, 0x03, 0x07}, + {0x00, 0x03, 0x08}, + {0x00, 0x03, 0x0B}, + {0x00, 0x03, 0x0C}, + {0x00, 0x03, 0x0E}, + {0x00, 0x03, 0x0F}, + {0x00, 0x03, 0x10}, + {0x00, 0x03, 0x11}, + {0x00, 0x03, 0x12}, }, /* 225 */ { - {0x02, 2, 254}, - {0x09, 2, 254}, - {0x17, 2, 254}, - {0x28, 3, 254}, - {0x01, 2, 2}, - {0x16, 3, 2}, - {0x01, 2, 3}, - {0x16, 3, 3}, - {0x01, 2, 4}, - {0x16, 3, 4}, - {0x01, 2, 5}, - {0x16, 3, 5}, - {0x01, 2, 6}, - {0x16, 3, 6}, - {0x01, 2, 7}, - {0x16, 3, 7}, + {0x02, 0x02, 0xFE}, + {0x09, 0x02, 0xFE}, + {0x17, 0x02, 0xFE}, + {0x28, 0x03, 0xFE}, + {0x01, 0x02, 0x02}, + {0x16, 0x03, 0x02}, + {0x01, 0x02, 0x03}, + {0x16, 0x03, 0x03}, + {0x01, 0x02, 0x04}, + {0x16, 0x03, 0x04}, + {0x01, 0x02, 0x05}, + {0x16, 0x03, 0x05}, + {0x01, 0x02, 0x06}, + {0x16, 0x03, 0x06}, + {0x01, 0x02, 0x07}, + {0x16, 0x03, 0x07}, }, /* 226 */ { - {0x03, 2, 254}, - {0x06, 2, 254}, - {0x0a, 2, 254}, - {0x0f, 2, 254}, - {0x18, 2, 254}, - {0x1f, 2, 254}, - {0x29, 2, 254}, - {0x38, 3, 254}, - {0x02, 2, 2}, - {0x09, 2, 2}, - {0x17, 2, 2}, - {0x28, 3, 2}, - {0x02, 2, 3}, - {0x09, 2, 3}, - {0x17, 2, 3}, - {0x28, 3, 3}, + {0x03, 0x02, 0xFE}, + {0x06, 0x02, 0xFE}, + {0x0A, 0x02, 0xFE}, + {0x0F, 0x02, 0xFE}, + {0x18, 0x02, 0xFE}, + {0x1F, 0x02, 0xFE}, + {0x29, 0x02, 0xFE}, + {0x38, 0x03, 0xFE}, + {0x02, 0x02, 0x02}, + {0x09, 0x02, 0x02}, + {0x17, 0x02, 0x02}, + {0x28, 0x03, 0x02}, + {0x02, 0x02, 0x03}, + {0x09, 0x02, 0x03}, + {0x17, 0x02, 0x03}, + {0x28, 0x03, 0x03}, }, /* 227 */ { - {0x03, 2, 2}, - {0x06, 2, 2}, - {0x0a, 2, 2}, - {0x0f, 2, 2}, - {0x18, 2, 2}, - {0x1f, 2, 2}, - {0x29, 2, 2}, - {0x38, 3, 2}, - {0x03, 2, 3}, - {0x06, 2, 3}, - {0x0a, 2, 3}, - {0x0f, 2, 3}, - {0x18, 2, 3}, - {0x1f, 2, 3}, - {0x29, 2, 3}, - {0x38, 3, 3}, + {0x03, 0x02, 0x02}, + {0x06, 0x02, 0x02}, + {0x0A, 0x02, 0x02}, + {0x0F, 0x02, 0x02}, + {0x18, 0x02, 0x02}, + {0x1F, 0x02, 0x02}, + {0x29, 0x02, 0x02}, + {0x38, 0x03, 0x02}, + {0x03, 0x02, 0x03}, + {0x06, 0x02, 0x03}, + {0x0A, 0x02, 0x03}, + {0x0F, 0x02, 0x03}, + {0x18, 0x02, 0x03}, + {0x1F, 0x02, 0x03}, + {0x29, 0x02, 0x03}, + {0x38, 0x03, 0x03}, }, /* 228 */ { - {0x02, 2, 4}, - {0x09, 2, 4}, - {0x17, 2, 4}, - {0x28, 3, 4}, - {0x02, 2, 5}, - {0x09, 2, 5}, - {0x17, 2, 5}, - {0x28, 3, 5}, - {0x02, 2, 6}, - {0x09, 2, 6}, - {0x17, 2, 6}, - {0x28, 3, 6}, - {0x02, 2, 7}, - {0x09, 2, 7}, - {0x17, 2, 7}, - {0x28, 3, 7}, + {0x02, 0x02, 0x04}, + {0x09, 0x02, 0x04}, + {0x17, 0x02, 0x04}, + {0x28, 0x03, 0x04}, + {0x02, 0x02, 0x05}, + {0x09, 0x02, 0x05}, + {0x17, 0x02, 0x05}, + {0x28, 0x03, 0x05}, + {0x02, 0x02, 0x06}, + {0x09, 0x02, 0x06}, + {0x17, 0x02, 0x06}, + {0x28, 0x03, 0x06}, + {0x02, 0x02, 0x07}, + {0x09, 0x02, 0x07}, + {0x17, 0x02, 0x07}, + {0x28, 0x03, 0x07}, }, /* 229 */ { - {0x03, 2, 4}, - {0x06, 2, 4}, - {0x0a, 2, 4}, - {0x0f, 2, 4}, - {0x18, 2, 4}, - {0x1f, 2, 4}, - {0x29, 2, 4}, - {0x38, 3, 4}, - {0x03, 2, 5}, - {0x06, 2, 5}, - {0x0a, 2, 5}, - {0x0f, 2, 5}, - {0x18, 2, 5}, - {0x1f, 2, 5}, - {0x29, 2, 5}, - {0x38, 3, 5}, + {0x03, 0x02, 0x04}, + {0x06, 0x02, 0x04}, + {0x0A, 0x02, 0x04}, + {0x0F, 0x02, 0x04}, + {0x18, 0x02, 0x04}, + {0x1F, 0x02, 0x04}, + {0x29, 0x02, 0x04}, + {0x38, 0x03, 0x04}, + {0x03, 0x02, 0x05}, + {0x06, 0x02, 0x05}, + {0x0A, 0x02, 0x05}, + {0x0F, 0x02, 0x05}, + {0x18, 0x02, 0x05}, + {0x1F, 0x02, 0x05}, + {0x29, 0x02, 0x05}, + {0x38, 0x03, 0x05}, }, /* 230 */ { - {0x03, 2, 6}, - {0x06, 2, 6}, - {0x0a, 2, 6}, - {0x0f, 2, 6}, - {0x18, 2, 6}, - {0x1f, 2, 6}, - {0x29, 2, 6}, - {0x38, 3, 6}, - {0x03, 2, 7}, - {0x06, 2, 7}, - {0x0a, 2, 7}, - {0x0f, 2, 7}, - {0x18, 2, 7}, - {0x1f, 2, 7}, - {0x29, 2, 7}, - {0x38, 3, 7}, + {0x03, 0x02, 0x06}, + {0x06, 0x02, 0x06}, + {0x0A, 0x02, 0x06}, + {0x0F, 0x02, 0x06}, + {0x18, 0x02, 0x06}, + {0x1F, 0x02, 0x06}, + {0x29, 0x02, 0x06}, + {0x38, 0x03, 0x06}, + {0x03, 0x02, 0x07}, + {0x06, 0x02, 0x07}, + {0x0A, 0x02, 0x07}, + {0x0F, 0x02, 0x07}, + {0x18, 0x02, 0x07}, + {0x1F, 0x02, 0x07}, + {0x29, 0x02, 0x07}, + {0x38, 0x03, 0x07}, }, /* 231 */ { - {0x01, 2, 8}, - {0x16, 3, 8}, - {0x01, 2, 11}, - {0x16, 3, 11}, - {0x01, 2, 12}, - {0x16, 3, 12}, - {0x01, 2, 14}, - {0x16, 3, 14}, - {0x01, 2, 15}, - {0x16, 3, 15}, - {0x01, 2, 16}, - {0x16, 3, 16}, - {0x01, 2, 17}, - {0x16, 3, 17}, - {0x01, 2, 18}, - {0x16, 3, 18}, + {0x01, 0x02, 0x08}, + {0x16, 0x03, 0x08}, + {0x01, 0x02, 0x0B}, + {0x16, 0x03, 0x0B}, + {0x01, 0x02, 0x0C}, + {0x16, 0x03, 0x0C}, + {0x01, 0x02, 0x0E}, + {0x16, 0x03, 0x0E}, + {0x01, 0x02, 0x0F}, + {0x16, 0x03, 0x0F}, + {0x01, 0x02, 0x10}, + {0x16, 0x03, 0x10}, + {0x01, 0x02, 0x11}, + {0x16, 0x03, 0x11}, + {0x01, 0x02, 0x12}, + {0x16, 0x03, 0x12}, }, /* 232 */ { - {0x02, 2, 8}, - {0x09, 2, 8}, - {0x17, 2, 8}, - {0x28, 3, 8}, - {0x02, 2, 11}, - {0x09, 2, 11}, - {0x17, 2, 11}, - {0x28, 3, 11}, - {0x02, 2, 12}, - {0x09, 2, 12}, - {0x17, 2, 12}, - {0x28, 3, 12}, - {0x02, 2, 14}, - {0x09, 2, 14}, - {0x17, 2, 14}, - {0x28, 3, 14}, + {0x02, 0x02, 0x08}, + {0x09, 0x02, 0x08}, + {0x17, 0x02, 0x08}, + {0x28, 0x03, 0x08}, + {0x02, 0x02, 0x0B}, + {0x09, 0x02, 0x0B}, + {0x17, 0x02, 0x0B}, + {0x28, 0x03, 0x0B}, + {0x02, 0x02, 0x0C}, + {0x09, 0x02, 0x0C}, + {0x17, 0x02, 0x0C}, + {0x28, 0x03, 0x0C}, + {0x02, 0x02, 0x0E}, + {0x09, 0x02, 0x0E}, + {0x17, 0x02, 0x0E}, + {0x28, 0x03, 0x0E}, }, /* 233 */ { - {0x03, 2, 8}, - {0x06, 2, 8}, - {0x0a, 2, 8}, - {0x0f, 2, 8}, - {0x18, 2, 8}, - {0x1f, 2, 8}, - {0x29, 2, 8}, - {0x38, 3, 8}, - {0x03, 2, 11}, - {0x06, 2, 11}, - {0x0a, 2, 11}, - {0x0f, 2, 11}, - {0x18, 2, 11}, - {0x1f, 2, 11}, - {0x29, 2, 11}, - {0x38, 3, 11}, + {0x03, 0x02, 0x08}, + {0x06, 0x02, 0x08}, + {0x0A, 0x02, 0x08}, + {0x0F, 0x02, 0x08}, + {0x18, 0x02, 0x08}, + {0x1F, 0x02, 0x08}, + {0x29, 0x02, 0x08}, + {0x38, 0x03, 0x08}, + {0x03, 0x02, 0x0B}, + {0x06, 0x02, 0x0B}, + {0x0A, 0x02, 0x0B}, + {0x0F, 0x02, 0x0B}, + {0x18, 0x02, 0x0B}, + {0x1F, 0x02, 0x0B}, + {0x29, 0x02, 0x0B}, + {0x38, 0x03, 0x0B}, }, /* 234 */ { - {0x03, 2, 12}, - {0x06, 2, 12}, - {0x0a, 2, 12}, - {0x0f, 2, 12}, - {0x18, 2, 12}, - {0x1f, 2, 12}, - {0x29, 2, 12}, - {0x38, 3, 12}, - {0x03, 2, 14}, - {0x06, 2, 14}, - {0x0a, 2, 14}, - {0x0f, 2, 14}, - {0x18, 2, 14}, - {0x1f, 2, 14}, - {0x29, 2, 14}, - {0x38, 3, 14}, + {0x03, 0x02, 0x0C}, + {0x06, 0x02, 0x0C}, + {0x0A, 0x02, 0x0C}, + {0x0F, 0x02, 0x0C}, + {0x18, 0x02, 0x0C}, + {0x1F, 0x02, 0x0C}, + {0x29, 0x02, 0x0C}, + {0x38, 0x03, 0x0C}, + {0x03, 0x02, 0x0E}, + {0x06, 0x02, 0x0E}, + {0x0A, 0x02, 0x0E}, + {0x0F, 0x02, 0x0E}, + {0x18, 0x02, 0x0E}, + {0x1F, 0x02, 0x0E}, + {0x29, 0x02, 0x0E}, + {0x38, 0x03, 0x0E}, }, /* 235 */ { - {0x02, 2, 15}, - {0x09, 2, 15}, - {0x17, 2, 15}, - {0x28, 3, 15}, - {0x02, 2, 16}, - {0x09, 2, 16}, - {0x17, 2, 16}, - {0x28, 3, 16}, - {0x02, 2, 17}, - {0x09, 2, 17}, - {0x17, 2, 17}, - {0x28, 3, 17}, - {0x02, 2, 18}, - {0x09, 2, 18}, - {0x17, 2, 18}, - {0x28, 3, 18}, + {0x02, 0x02, 0x0F}, + {0x09, 0x02, 0x0F}, + {0x17, 0x02, 0x0F}, + {0x28, 0x03, 0x0F}, + {0x02, 0x02, 0x10}, + {0x09, 0x02, 0x10}, + {0x17, 0x02, 0x10}, + {0x28, 0x03, 0x10}, + {0x02, 0x02, 0x11}, + {0x09, 0x02, 0x11}, + {0x17, 0x02, 0x11}, + {0x28, 0x03, 0x11}, + {0x02, 0x02, 0x12}, + {0x09, 0x02, 0x12}, + {0x17, 0x02, 0x12}, + {0x28, 0x03, 0x12}, }, /* 236 */ { - {0x03, 2, 15}, - {0x06, 2, 15}, - {0x0a, 2, 15}, - {0x0f, 2, 15}, - {0x18, 2, 15}, - {0x1f, 2, 15}, - {0x29, 2, 15}, - {0x38, 3, 15}, - {0x03, 2, 16}, - {0x06, 2, 16}, - {0x0a, 2, 16}, - {0x0f, 2, 16}, - {0x18, 2, 16}, - {0x1f, 2, 16}, - {0x29, 2, 16}, - {0x38, 3, 16}, + {0x03, 0x02, 0x0F}, + {0x06, 0x02, 0x0F}, + {0x0A, 0x02, 0x0F}, + {0x0F, 0x02, 0x0F}, + {0x18, 0x02, 0x0F}, + {0x1F, 0x02, 0x0F}, + {0x29, 0x02, 0x0F}, + {0x38, 0x03, 0x0F}, + {0x03, 0x02, 0x10}, + {0x06, 0x02, 0x10}, + {0x0A, 0x02, 0x10}, + {0x0F, 0x02, 0x10}, + {0x18, 0x02, 0x10}, + {0x1F, 0x02, 0x10}, + {0x29, 0x02, 0x10}, + {0x38, 0x03, 0x10}, }, /* 237 */ { - {0x03, 2, 17}, - {0x06, 2, 17}, - {0x0a, 2, 17}, - {0x0f, 2, 17}, - {0x18, 2, 17}, - {0x1f, 2, 17}, - {0x29, 2, 17}, - {0x38, 3, 17}, - {0x03, 2, 18}, - {0x06, 2, 18}, - {0x0a, 2, 18}, - {0x0f, 2, 18}, - {0x18, 2, 18}, - {0x1f, 2, 18}, - {0x29, 2, 18}, - {0x38, 3, 18}, + {0x03, 0x02, 0x11}, + {0x06, 0x02, 0x11}, + {0x0A, 0x02, 0x11}, + {0x0F, 0x02, 0x11}, + {0x18, 0x02, 0x11}, + {0x1F, 0x02, 0x11}, + {0x29, 0x02, 0x11}, + {0x38, 0x03, 0x11}, + {0x03, 0x02, 0x12}, + {0x06, 0x02, 0x12}, + {0x0A, 0x02, 0x12}, + {0x0F, 0x02, 0x12}, + {0x18, 0x02, 0x12}, + {0x1F, 0x02, 0x12}, + {0x29, 0x02, 0x12}, + {0x38, 0x03, 0x12}, }, /* 238 */ { - {0x00, 3, 19}, - {0x00, 3, 20}, - {0x00, 3, 21}, - {0x00, 3, 23}, - {0x00, 3, 24}, - {0x00, 3, 25}, - {0x00, 3, 26}, - {0x00, 3, 27}, - {0x00, 3, 28}, - {0x00, 3, 29}, - {0x00, 3, 30}, - {0x00, 3, 31}, - {0x00, 3, 127}, - {0x00, 3, 220}, - {0x00, 3, 249}, - {0xfd, 0, 0}, + {0x00, 0x03, 0x13}, + {0x00, 0x03, 0x14}, + {0x00, 0x03, 0x15}, + {0x00, 0x03, 0x17}, + {0x00, 0x03, 0x18}, + {0x00, 0x03, 0x19}, + {0x00, 0x03, 0x1A}, + {0x00, 0x03, 0x1B}, + {0x00, 0x03, 0x1C}, + {0x00, 0x03, 0x1D}, + {0x00, 0x03, 0x1E}, + {0x00, 0x03, 0x1F}, + {0x00, 0x03, 0x7F}, + {0x00, 0x03, 0xDC}, + {0x00, 0x03, 0xF9}, + {0xFD, 0x00, 0x00}, }, /* 239 */ { - {0x01, 2, 19}, - {0x16, 3, 19}, - {0x01, 2, 20}, - {0x16, 3, 20}, - {0x01, 2, 21}, - {0x16, 3, 21}, - {0x01, 2, 23}, - {0x16, 3, 23}, - {0x01, 2, 24}, - {0x16, 3, 24}, - {0x01, 2, 25}, - {0x16, 3, 25}, - {0x01, 2, 26}, - {0x16, 3, 26}, - {0x01, 2, 27}, - {0x16, 3, 27}, + {0x01, 0x02, 0x13}, + {0x16, 0x03, 0x13}, + {0x01, 0x02, 0x14}, + {0x16, 0x03, 0x14}, + {0x01, 0x02, 0x15}, + {0x16, 0x03, 0x15}, + {0x01, 0x02, 0x17}, + {0x16, 0x03, 0x17}, + {0x01, 0x02, 0x18}, + {0x16, 0x03, 0x18}, + {0x01, 0x02, 0x19}, + {0x16, 0x03, 0x19}, + {0x01, 0x02, 0x1A}, + {0x16, 0x03, 0x1A}, + {0x01, 0x02, 0x1B}, + {0x16, 0x03, 0x1B}, }, /* 240 */ { - {0x02, 2, 19}, - {0x09, 2, 19}, - {0x17, 2, 19}, - {0x28, 3, 19}, - {0x02, 2, 20}, - {0x09, 2, 20}, - {0x17, 2, 20}, - {0x28, 3, 20}, - {0x02, 2, 21}, - {0x09, 2, 21}, - {0x17, 2, 21}, - {0x28, 3, 21}, - {0x02, 2, 23}, - {0x09, 2, 23}, - {0x17, 2, 23}, - {0x28, 3, 23}, + {0x02, 0x02, 0x13}, + {0x09, 0x02, 0x13}, + {0x17, 0x02, 0x13}, + {0x28, 0x03, 0x13}, + {0x02, 0x02, 0x14}, + {0x09, 0x02, 0x14}, + {0x17, 0x02, 0x14}, + {0x28, 0x03, 0x14}, + {0x02, 0x02, 0x15}, + {0x09, 0x02, 0x15}, + {0x17, 0x02, 0x15}, + {0x28, 0x03, 0x15}, + {0x02, 0x02, 0x17}, + {0x09, 0x02, 0x17}, + {0x17, 0x02, 0x17}, + {0x28, 0x03, 0x17}, }, /* 241 */ { - {0x03, 2, 19}, - {0x06, 2, 19}, - {0x0a, 2, 19}, - {0x0f, 2, 19}, - {0x18, 2, 19}, - {0x1f, 2, 19}, - {0x29, 2, 19}, - {0x38, 3, 19}, - {0x03, 2, 20}, - {0x06, 2, 20}, - {0x0a, 2, 20}, - {0x0f, 2, 20}, - {0x18, 2, 20}, - {0x1f, 2, 20}, - {0x29, 2, 20}, - {0x38, 3, 20}, + {0x03, 0x02, 0x13}, + {0x06, 0x02, 0x13}, + {0x0A, 0x02, 0x13}, + {0x0F, 0x02, 0x13}, + {0x18, 0x02, 0x13}, + {0x1F, 0x02, 0x13}, + {0x29, 0x02, 0x13}, + {0x38, 0x03, 0x13}, + {0x03, 0x02, 0x14}, + {0x06, 0x02, 0x14}, + {0x0A, 0x02, 0x14}, + {0x0F, 0x02, 0x14}, + {0x18, 0x02, 0x14}, + {0x1F, 0x02, 0x14}, + {0x29, 0x02, 0x14}, + {0x38, 0x03, 0x14}, }, /* 242 */ { - {0x03, 2, 21}, - {0x06, 2, 21}, - {0x0a, 2, 21}, - {0x0f, 2, 21}, - {0x18, 2, 21}, - {0x1f, 2, 21}, - {0x29, 2, 21}, - {0x38, 3, 21}, - {0x03, 2, 23}, - {0x06, 2, 23}, - {0x0a, 2, 23}, - {0x0f, 2, 23}, - {0x18, 2, 23}, - {0x1f, 2, 23}, - {0x29, 2, 23}, - {0x38, 3, 23}, + {0x03, 0x02, 0x15}, + {0x06, 0x02, 0x15}, + {0x0A, 0x02, 0x15}, + {0x0F, 0x02, 0x15}, + {0x18, 0x02, 0x15}, + {0x1F, 0x02, 0x15}, + {0x29, 0x02, 0x15}, + {0x38, 0x03, 0x15}, + {0x03, 0x02, 0x17}, + {0x06, 0x02, 0x17}, + {0x0A, 0x02, 0x17}, + {0x0F, 0x02, 0x17}, + {0x18, 0x02, 0x17}, + {0x1F, 0x02, 0x17}, + {0x29, 0x02, 0x17}, + {0x38, 0x03, 0x17}, }, /* 243 */ { - {0x02, 2, 24}, - {0x09, 2, 24}, - {0x17, 2, 24}, - {0x28, 3, 24}, - {0x02, 2, 25}, - {0x09, 2, 25}, - {0x17, 2, 25}, - {0x28, 3, 25}, - {0x02, 2, 26}, - {0x09, 2, 26}, - {0x17, 2, 26}, - {0x28, 3, 26}, - {0x02, 2, 27}, - {0x09, 2, 27}, - {0x17, 2, 27}, - {0x28, 3, 27}, + {0x02, 0x02, 0x18}, + {0x09, 0x02, 0x18}, + {0x17, 0x02, 0x18}, + {0x28, 0x03, 0x18}, + {0x02, 0x02, 0x19}, + {0x09, 0x02, 0x19}, + {0x17, 0x02, 0x19}, + {0x28, 0x03, 0x19}, + {0x02, 0x02, 0x1A}, + {0x09, 0x02, 0x1A}, + {0x17, 0x02, 0x1A}, + {0x28, 0x03, 0x1A}, + {0x02, 0x02, 0x1B}, + {0x09, 0x02, 0x1B}, + {0x17, 0x02, 0x1B}, + {0x28, 0x03, 0x1B}, }, /* 244 */ { - {0x03, 2, 24}, - {0x06, 2, 24}, - {0x0a, 2, 24}, - {0x0f, 2, 24}, - {0x18, 2, 24}, - {0x1f, 2, 24}, - {0x29, 2, 24}, - {0x38, 3, 24}, - {0x03, 2, 25}, - {0x06, 2, 25}, - {0x0a, 2, 25}, - {0x0f, 2, 25}, - {0x18, 2, 25}, - {0x1f, 2, 25}, - {0x29, 2, 25}, - {0x38, 3, 25}, + {0x03, 0x02, 0x18}, + {0x06, 0x02, 0x18}, + {0x0A, 0x02, 0x18}, + {0x0F, 0x02, 0x18}, + {0x18, 0x02, 0x18}, + {0x1F, 0x02, 0x18}, + {0x29, 0x02, 0x18}, + {0x38, 0x03, 0x18}, + {0x03, 0x02, 0x19}, + {0x06, 0x02, 0x19}, + {0x0A, 0x02, 0x19}, + {0x0F, 0x02, 0x19}, + {0x18, 0x02, 0x19}, + {0x1F, 0x02, 0x19}, + {0x29, 0x02, 0x19}, + {0x38, 0x03, 0x19}, }, /* 245 */ { - {0x03, 2, 26}, - {0x06, 2, 26}, - {0x0a, 2, 26}, - {0x0f, 2, 26}, - {0x18, 2, 26}, - {0x1f, 2, 26}, - {0x29, 2, 26}, - {0x38, 3, 26}, - {0x03, 2, 27}, - {0x06, 2, 27}, - {0x0a, 2, 27}, - {0x0f, 2, 27}, - {0x18, 2, 27}, - {0x1f, 2, 27}, - {0x29, 2, 27}, - {0x38, 3, 27}, + {0x03, 0x02, 0x1A}, + {0x06, 0x02, 0x1A}, + {0x0A, 0x02, 0x1A}, + {0x0F, 0x02, 0x1A}, + {0x18, 0x02, 0x1A}, + {0x1F, 0x02, 0x1A}, + {0x29, 0x02, 0x1A}, + {0x38, 0x03, 0x1A}, + {0x03, 0x02, 0x1B}, + {0x06, 0x02, 0x1B}, + {0x0A, 0x02, 0x1B}, + {0x0F, 0x02, 0x1B}, + {0x18, 0x02, 0x1B}, + {0x1F, 0x02, 0x1B}, + {0x29, 0x02, 0x1B}, + {0x38, 0x03, 0x1B}, }, /* 246 */ { - {0x01, 2, 28}, - {0x16, 3, 28}, - {0x01, 2, 29}, - {0x16, 3, 29}, - {0x01, 2, 30}, - {0x16, 3, 30}, - {0x01, 2, 31}, - {0x16, 3, 31}, - {0x01, 2, 127}, - {0x16, 3, 127}, - {0x01, 2, 220}, - {0x16, 3, 220}, - {0x01, 2, 249}, - {0x16, 3, 249}, - {0xfe, 0, 0}, - {0xff, 0, 0}, + {0x01, 0x02, 0x1C}, + {0x16, 0x03, 0x1C}, + {0x01, 0x02, 0x1D}, + {0x16, 0x03, 0x1D}, + {0x01, 0x02, 0x1E}, + {0x16, 0x03, 0x1E}, + {0x01, 0x02, 0x1F}, + {0x16, 0x03, 0x1F}, + {0x01, 0x02, 0x7F}, + {0x16, 0x03, 0x7F}, + {0x01, 0x02, 0xDC}, + {0x16, 0x03, 0xDC}, + {0x01, 0x02, 0xF9}, + {0x16, 0x03, 0xF9}, + {0xFE, 0x00, 0x00}, + {0xFF, 0x00, 0x00}, }, /* 247 */ { - {0x02, 2, 28}, - {0x09, 2, 28}, - {0x17, 2, 28}, - {0x28, 3, 28}, - {0x02, 2, 29}, - {0x09, 2, 29}, - {0x17, 2, 29}, - {0x28, 3, 29}, - {0x02, 2, 30}, - {0x09, 2, 30}, - {0x17, 2, 30}, - {0x28, 3, 30}, - {0x02, 2, 31}, - {0x09, 2, 31}, - {0x17, 2, 31}, - {0x28, 3, 31}, + {0x02, 0x02, 0x1C}, + {0x09, 0x02, 0x1C}, + {0x17, 0x02, 0x1C}, + {0x28, 0x03, 0x1C}, + {0x02, 0x02, 0x1D}, + {0x09, 0x02, 0x1D}, + {0x17, 0x02, 0x1D}, + {0x28, 0x03, 0x1D}, + {0x02, 0x02, 0x1E}, + {0x09, 0x02, 0x1E}, + {0x17, 0x02, 0x1E}, + {0x28, 0x03, 0x1E}, + {0x02, 0x02, 0x1F}, + {0x09, 0x02, 0x1F}, + {0x17, 0x02, 0x1F}, + {0x28, 0x03, 0x1F}, }, /* 248 */ { - {0x03, 2, 28}, - {0x06, 2, 28}, - {0x0a, 2, 28}, - {0x0f, 2, 28}, - {0x18, 2, 28}, - {0x1f, 2, 28}, - {0x29, 2, 28}, - {0x38, 3, 28}, - {0x03, 2, 29}, - {0x06, 2, 29}, - {0x0a, 2, 29}, - {0x0f, 2, 29}, - {0x18, 2, 29}, - {0x1f, 2, 29}, - {0x29, 2, 29}, - {0x38, 3, 29}, + {0x03, 0x02, 0x1C}, + {0x06, 0x02, 0x1C}, + {0x0A, 0x02, 0x1C}, + {0x0F, 0x02, 0x1C}, + {0x18, 0x02, 0x1C}, + {0x1F, 0x02, 0x1C}, + {0x29, 0x02, 0x1C}, + {0x38, 0x03, 0x1C}, + {0x03, 0x02, 0x1D}, + {0x06, 0x02, 0x1D}, + {0x0A, 0x02, 0x1D}, + {0x0F, 0x02, 0x1D}, + {0x18, 0x02, 0x1D}, + {0x1F, 0x02, 0x1D}, + {0x29, 0x02, 0x1D}, + {0x38, 0x03, 0x1D}, }, /* 249 */ { - {0x03, 2, 30}, - {0x06, 2, 30}, - {0x0a, 2, 30}, - {0x0f, 2, 30}, - {0x18, 2, 30}, - {0x1f, 2, 30}, - {0x29, 2, 30}, - {0x38, 3, 30}, - {0x03, 2, 31}, - {0x06, 2, 31}, - {0x0a, 2, 31}, - {0x0f, 2, 31}, - {0x18, 2, 31}, - {0x1f, 2, 31}, - {0x29, 2, 31}, - {0x38, 3, 31}, + {0x03, 0x02, 0x1E}, + {0x06, 0x02, 0x1E}, + {0x0A, 0x02, 0x1E}, + {0x0F, 0x02, 0x1E}, + {0x18, 0x02, 0x1E}, + {0x1F, 0x02, 0x1E}, + {0x29, 0x02, 0x1E}, + {0x38, 0x03, 0x1E}, + {0x03, 0x02, 0x1F}, + {0x06, 0x02, 0x1F}, + {0x0A, 0x02, 0x1F}, + {0x0F, 0x02, 0x1F}, + {0x18, 0x02, 0x1F}, + {0x1F, 0x02, 0x1F}, + {0x29, 0x02, 0x1F}, + {0x38, 0x03, 0x1F}, }, /* 250 */ { - {0x02, 2, 127}, - {0x09, 2, 127}, - {0x17, 2, 127}, - {0x28, 3, 127}, - {0x02, 2, 220}, - {0x09, 2, 220}, - {0x17, 2, 220}, - {0x28, 3, 220}, - {0x02, 2, 249}, - {0x09, 2, 249}, - {0x17, 2, 249}, - {0x28, 3, 249}, - {0x00, 3, 10}, - {0x00, 3, 13}, - {0x00, 3, 22}, - {0x100, 0, 0}, + {0x02, 0x02, 0x7F}, + {0x09, 0x02, 0x7F}, + {0x17, 0x02, 0x7F}, + {0x28, 0x03, 0x7F}, + {0x02, 0x02, 0xDC}, + {0x09, 0x02, 0xDC}, + {0x17, 0x02, 0xDC}, + {0x28, 0x03, 0xDC}, + {0x02, 0x02, 0xF9}, + {0x09, 0x02, 0xF9}, + {0x17, 0x02, 0xF9}, + {0x28, 0x03, 0xF9}, + {0x00, 0x03, 0x0A}, + {0x00, 0x03, 0x0D}, + {0x00, 0x03, 0x16}, + {0x100, 0x00, 0x00}, }, /* 251 */ { - {0x03, 2, 127}, - {0x06, 2, 127}, - {0x0a, 2, 127}, - {0x0f, 2, 127}, - {0x18, 2, 127}, - {0x1f, 2, 127}, - {0x29, 2, 127}, - {0x38, 3, 127}, - {0x03, 2, 220}, - {0x06, 2, 220}, - {0x0a, 2, 220}, - {0x0f, 2, 220}, - {0x18, 2, 220}, - {0x1f, 2, 220}, - {0x29, 2, 220}, - {0x38, 3, 220}, + {0x03, 0x02, 0x7F}, + {0x06, 0x02, 0x7F}, + {0x0A, 0x02, 0x7F}, + {0x0F, 0x02, 0x7F}, + {0x18, 0x02, 0x7F}, + {0x1F, 0x02, 0x7F}, + {0x29, 0x02, 0x7F}, + {0x38, 0x03, 0x7F}, + {0x03, 0x02, 0xDC}, + {0x06, 0x02, 0xDC}, + {0x0A, 0x02, 0xDC}, + {0x0F, 0x02, 0xDC}, + {0x18, 0x02, 0xDC}, + {0x1F, 0x02, 0xDC}, + {0x29, 0x02, 0xDC}, + {0x38, 0x03, 0xDC}, }, /* 252 */ { - {0x03, 2, 249}, - {0x06, 2, 249}, - {0x0a, 2, 249}, - {0x0f, 2, 249}, - {0x18, 2, 249}, - {0x1f, 2, 249}, - {0x29, 2, 249}, - {0x38, 3, 249}, - {0x01, 2, 10}, - {0x16, 3, 10}, - {0x01, 2, 13}, - {0x16, 3, 13}, - {0x01, 2, 22}, - {0x16, 3, 22}, - {0x100, 0, 0}, - {0x100, 0, 0}, + {0x03, 0x02, 0xF9}, + {0x06, 0x02, 0xF9}, + {0x0A, 0x02, 0xF9}, + {0x0F, 0x02, 0xF9}, + {0x18, 0x02, 0xF9}, + {0x1F, 0x02, 0xF9}, + {0x29, 0x02, 0xF9}, + {0x38, 0x03, 0xF9}, + {0x01, 0x02, 0x0A}, + {0x16, 0x03, 0x0A}, + {0x01, 0x02, 0x0D}, + {0x16, 0x03, 0x0D}, + {0x01, 0x02, 0x16}, + {0x16, 0x03, 0x16}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, }, /* 253 */ { - {0x02, 2, 10}, - {0x09, 2, 10}, - {0x17, 2, 10}, - {0x28, 3, 10}, - {0x02, 2, 13}, - {0x09, 2, 13}, - {0x17, 2, 13}, - {0x28, 3, 13}, - {0x02, 2, 22}, - {0x09, 2, 22}, - {0x17, 2, 22}, - {0x28, 3, 22}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, + {0x02, 0x02, 0x0A}, + {0x09, 0x02, 0x0A}, + {0x17, 0x02, 0x0A}, + {0x28, 0x03, 0x0A}, + {0x02, 0x02, 0x0D}, + {0x09, 0x02, 0x0D}, + {0x17, 0x02, 0x0D}, + {0x28, 0x03, 0x0D}, + {0x02, 0x02, 0x16}, + {0x09, 0x02, 0x16}, + {0x17, 0x02, 0x16}, + {0x28, 0x03, 0x16}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, }, /* 254 */ { - {0x03, 2, 10}, - {0x06, 2, 10}, - {0x0a, 2, 10}, - {0x0f, 2, 10}, - {0x18, 2, 10}, - {0x1f, 2, 10}, - {0x29, 2, 10}, - {0x38, 3, 10}, - {0x03, 2, 13}, - {0x06, 2, 13}, - {0x0a, 2, 13}, - {0x0f, 2, 13}, - {0x18, 2, 13}, - {0x1f, 2, 13}, - {0x29, 2, 13}, - {0x38, 3, 13}, + {0x03, 0x02, 0x0A}, + {0x06, 0x02, 0x0A}, + {0x0A, 0x02, 0x0A}, + {0x0F, 0x02, 0x0A}, + {0x18, 0x02, 0x0A}, + {0x1F, 0x02, 0x0A}, + {0x29, 0x02, 0x0A}, + {0x38, 0x03, 0x0A}, + {0x03, 0x02, 0x0D}, + {0x06, 0x02, 0x0D}, + {0x0A, 0x02, 0x0D}, + {0x0F, 0x02, 0x0D}, + {0x18, 0x02, 0x0D}, + {0x1F, 0x02, 0x0D}, + {0x29, 0x02, 0x0D}, + {0x38, 0x03, 0x0D}, }, /* 255 */ { - {0x03, 2, 22}, - {0x06, 2, 22}, - {0x0a, 2, 22}, - {0x0f, 2, 22}, - {0x18, 2, 22}, - {0x1f, 2, 22}, - {0x29, 2, 22}, - {0x38, 3, 22}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, + {0x03, 0x02, 0x16}, + {0x06, 0x02, 0x16}, + {0x0A, 0x02, 0x16}, + {0x0F, 0x02, 0x16}, + {0x18, 0x02, 0x16}, + {0x1F, 0x02, 0x16}, + {0x29, 0x02, 0x16}, + {0x38, 0x03, 0x16}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, }, /* 256 */ { - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, - {0x100, 0, 0}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, + {0x100, 0x00, 0x00}, }, }; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_range.c b/deps/ngtcp2/nghttp3/lib/nghttp3_range.c index f3039d81c4e5..d54d9c3d7385 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_range.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_range.c @@ -36,8 +36,8 @@ void nghttp3_range_init(nghttp3_range *r, uint64_t begin, uint64_t end) { nghttp3_range nghttp3_range_intersect(const nghttp3_range *a, const nghttp3_range *b) { nghttp3_range r; - uint64_t begin = nghttp3_max_uint64(a->begin, b->begin); - uint64_t end = nghttp3_min_uint64(a->end, b->end); + uint64_t begin = nghttp3_max(a->begin, b->begin); + uint64_t end = nghttp3_min(a->end, b->end); if (begin < end) { nghttp3_range_init(&r, begin, end); diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c b/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c index dac89ef12e51..f43714d2c20d 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c @@ -70,7 +70,7 @@ void nghttp3_ringbuf_free(nghttp3_ringbuf *rb) { void *nghttp3_ringbuf_push_front(nghttp3_ringbuf *rb) { rb->first = (rb->first - 1) & (rb->nmemb - 1); - rb->len = nghttp3_min_size(rb->nmemb, rb->len + 1); + rb->len = nghttp3_min(rb->nmemb, rb->len + 1); return (void *)&rb->buf[rb->first * rb->size]; } @@ -108,7 +108,9 @@ void *nghttp3_ringbuf_get(nghttp3_ringbuf *rb, size_t offset) { return &rb->buf[offset * rb->size]; } -int nghttp3_ringbuf_full(nghttp3_ringbuf *rb) { return rb->len == rb->nmemb; } +int nghttp3_ringbuf_full(const nghttp3_ringbuf *rb) { + return rb->len == rb->nmemb; +} int nghttp3_ringbuf_reserve(nghttp3_ringbuf *rb, size_t nmemb) { uint8_t *buf; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.h b/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.h index 691c40b93d61..aae22aa8603f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.h @@ -108,7 +108,7 @@ static inline size_t nghttp3_ringbuf_len(const nghttp3_ringbuf *rb) { } /* nghttp3_ringbuf_full returns nonzero if |rb| is full. */ -int nghttp3_ringbuf_full(nghttp3_ringbuf *rb); +int nghttp3_ringbuf_full(const nghttp3_ringbuf *rb); int nghttp3_ringbuf_reserve(nghttp3_ringbuf *rb, size_t nmemb); diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_str.c b/deps/ngtcp2/nghttp3/lib/nghttp3_str.c index fc131404d137..7564125cfdb3 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_str.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_str.c @@ -35,76 +35,76 @@ uint8_t *nghttp3_cpymem(uint8_t *dest, const uint8_t *src, size_t n) { } /* Generated by gendowncasetbl.py */ -static const uint8_t DOWNCASE_TBL[] = { - 0 /* NUL */, 1 /* SOH */, 2 /* STX */, 3 /* ETX */, - 4 /* EOT */, 5 /* ENQ */, 6 /* ACK */, 7 /* BEL */, - 8 /* BS */, 9 /* HT */, 10 /* LF */, 11 /* VT */, - 12 /* FF */, 13 /* CR */, 14 /* SO */, 15 /* SI */, - 16 /* DLE */, 17 /* DC1 */, 18 /* DC2 */, 19 /* DC3 */, - 20 /* DC4 */, 21 /* NAK */, 22 /* SYN */, 23 /* ETB */, - 24 /* CAN */, 25 /* EM */, 26 /* SUB */, 27 /* ESC */, - 28 /* FS */, 29 /* GS */, 30 /* RS */, 31 /* US */, - 32 /* SPC */, 33 /* ! */, 34 /* " */, 35 /* # */, - 36 /* $ */, 37 /* % */, 38 /* & */, 39 /* ' */, - 40 /* ( */, 41 /* ) */, 42 /* * */, 43 /* + */, - 44 /* , */, 45 /* - */, 46 /* . */, 47 /* / */, - 48 /* 0 */, 49 /* 1 */, 50 /* 2 */, 51 /* 3 */, - 52 /* 4 */, 53 /* 5 */, 54 /* 6 */, 55 /* 7 */, - 56 /* 8 */, 57 /* 9 */, 58 /* : */, 59 /* ; */, - 60 /* < */, 61 /* = */, 62 /* > */, 63 /* ? */, - 64 /* @ */, 97 /* A */, 98 /* B */, 99 /* C */, - 100 /* D */, 101 /* E */, 102 /* F */, 103 /* G */, - 104 /* H */, 105 /* I */, 106 /* J */, 107 /* K */, - 108 /* L */, 109 /* M */, 110 /* N */, 111 /* O */, - 112 /* P */, 113 /* Q */, 114 /* R */, 115 /* S */, - 116 /* T */, 117 /* U */, 118 /* V */, 119 /* W */, - 120 /* X */, 121 /* Y */, 122 /* Z */, 91 /* [ */, - 92 /* \ */, 93 /* ] */, 94 /* ^ */, 95 /* _ */, - 96 /* ` */, 97 /* a */, 98 /* b */, 99 /* c */, - 100 /* d */, 101 /* e */, 102 /* f */, 103 /* g */, - 104 /* h */, 105 /* i */, 106 /* j */, 107 /* k */, - 108 /* l */, 109 /* m */, 110 /* n */, 111 /* o */, - 112 /* p */, 113 /* q */, 114 /* r */, 115 /* s */, - 116 /* t */, 117 /* u */, 118 /* v */, 119 /* w */, - 120 /* x */, 121 /* y */, 122 /* z */, 123 /* { */, - 124 /* | */, 125 /* } */, 126 /* ~ */, 127 /* DEL */, - 128 /* 0x80 */, 129 /* 0x81 */, 130 /* 0x82 */, 131 /* 0x83 */, - 132 /* 0x84 */, 133 /* 0x85 */, 134 /* 0x86 */, 135 /* 0x87 */, - 136 /* 0x88 */, 137 /* 0x89 */, 138 /* 0x8a */, 139 /* 0x8b */, - 140 /* 0x8c */, 141 /* 0x8d */, 142 /* 0x8e */, 143 /* 0x8f */, - 144 /* 0x90 */, 145 /* 0x91 */, 146 /* 0x92 */, 147 /* 0x93 */, - 148 /* 0x94 */, 149 /* 0x95 */, 150 /* 0x96 */, 151 /* 0x97 */, - 152 /* 0x98 */, 153 /* 0x99 */, 154 /* 0x9a */, 155 /* 0x9b */, - 156 /* 0x9c */, 157 /* 0x9d */, 158 /* 0x9e */, 159 /* 0x9f */, - 160 /* 0xa0 */, 161 /* 0xa1 */, 162 /* 0xa2 */, 163 /* 0xa3 */, - 164 /* 0xa4 */, 165 /* 0xa5 */, 166 /* 0xa6 */, 167 /* 0xa7 */, - 168 /* 0xa8 */, 169 /* 0xa9 */, 170 /* 0xaa */, 171 /* 0xab */, - 172 /* 0xac */, 173 /* 0xad */, 174 /* 0xae */, 175 /* 0xaf */, - 176 /* 0xb0 */, 177 /* 0xb1 */, 178 /* 0xb2 */, 179 /* 0xb3 */, - 180 /* 0xb4 */, 181 /* 0xb5 */, 182 /* 0xb6 */, 183 /* 0xb7 */, - 184 /* 0xb8 */, 185 /* 0xb9 */, 186 /* 0xba */, 187 /* 0xbb */, - 188 /* 0xbc */, 189 /* 0xbd */, 190 /* 0xbe */, 191 /* 0xbf */, - 192 /* 0xc0 */, 193 /* 0xc1 */, 194 /* 0xc2 */, 195 /* 0xc3 */, - 196 /* 0xc4 */, 197 /* 0xc5 */, 198 /* 0xc6 */, 199 /* 0xc7 */, - 200 /* 0xc8 */, 201 /* 0xc9 */, 202 /* 0xca */, 203 /* 0xcb */, - 204 /* 0xcc */, 205 /* 0xcd */, 206 /* 0xce */, 207 /* 0xcf */, - 208 /* 0xd0 */, 209 /* 0xd1 */, 210 /* 0xd2 */, 211 /* 0xd3 */, - 212 /* 0xd4 */, 213 /* 0xd5 */, 214 /* 0xd6 */, 215 /* 0xd7 */, - 216 /* 0xd8 */, 217 /* 0xd9 */, 218 /* 0xda */, 219 /* 0xdb */, - 220 /* 0xdc */, 221 /* 0xdd */, 222 /* 0xde */, 223 /* 0xdf */, - 224 /* 0xe0 */, 225 /* 0xe1 */, 226 /* 0xe2 */, 227 /* 0xe3 */, - 228 /* 0xe4 */, 229 /* 0xe5 */, 230 /* 0xe6 */, 231 /* 0xe7 */, - 232 /* 0xe8 */, 233 /* 0xe9 */, 234 /* 0xea */, 235 /* 0xeb */, - 236 /* 0xec */, 237 /* 0xed */, 238 /* 0xee */, 239 /* 0xef */, - 240 /* 0xf0 */, 241 /* 0xf1 */, 242 /* 0xf2 */, 243 /* 0xf3 */, - 244 /* 0xf4 */, 245 /* 0xf5 */, 246 /* 0xf6 */, 247 /* 0xf7 */, - 248 /* 0xf8 */, 249 /* 0xf9 */, 250 /* 0xfa */, 251 /* 0xfb */, - 252 /* 0xfc */, 253 /* 0xfd */, 254 /* 0xfe */, 255 /* 0xff */, +const uint8_t nghttp3_downcase_tbl[] = { + 0x00 /* NUL */, 0x01 /* SOH */, 0x02 /* STX */, 0x03 /* ETX */, + 0x04 /* EOT */, 0x05 /* ENQ */, 0x06 /* ACK */, 0x07 /* BEL */, + 0x08 /* BS */, 0x09 /* HT */, 0x0A /* LF */, 0x0B /* VT */, + 0x0C /* FF */, 0x0D /* CR */, 0x0E /* SO */, 0x0F /* SI */, + 0x10 /* DLE */, 0x11 /* DC1 */, 0x12 /* DC2 */, 0x13 /* DC3 */, + 0x14 /* DC4 */, 0x15 /* NAK */, 0x16 /* SYN */, 0x17 /* ETB */, + 0x18 /* CAN */, 0x19 /* EM */, 0x1A /* SUB */, 0x1B /* ESC */, + 0x1C /* FS */, 0x1D /* GS */, 0x1E /* RS */, 0x1F /* US */, + 0x20 /* SPC */, 0x21 /* ! */, 0x22 /* " */, 0x23 /* # */, + 0x24 /* $ */, 0x25 /* % */, 0x26 /* & */, 0x27 /* ' */, + 0x28 /* ( */, 0x29 /* ) */, 0x2A /* * */, 0x2B /* + */, + 0x2C /* , */, 0x2D /* - */, 0x2E /* . */, 0x2F /* / */, + 0x30 /* 0 */, 0x31 /* 1 */, 0x32 /* 2 */, 0x33 /* 3 */, + 0x34 /* 4 */, 0x35 /* 5 */, 0x36 /* 6 */, 0x37 /* 7 */, + 0x38 /* 8 */, 0x39 /* 9 */, 0x3A /* : */, 0x3B /* ; */, + 0x3C /* < */, 0x3D /* = */, 0x3E /* > */, 0x3F /* ? */, + 0x40 /* @ */, 0x61 /* A */, 0x62 /* B */, 0x63 /* C */, + 0x64 /* D */, 0x65 /* E */, 0x66 /* F */, 0x67 /* G */, + 0x68 /* H */, 0x69 /* I */, 0x6A /* J */, 0x6B /* K */, + 0x6C /* L */, 0x6D /* M */, 0x6E /* N */, 0x6F /* O */, + 0x70 /* P */, 0x71 /* Q */, 0x72 /* R */, 0x73 /* S */, + 0x74 /* T */, 0x75 /* U */, 0x76 /* V */, 0x77 /* W */, + 0x78 /* X */, 0x79 /* Y */, 0x7A /* Z */, 0x5B /* [ */, + 0x5C /* \ */, 0x5D /* ] */, 0x5E /* ^ */, 0x5F /* _ */, + 0x60 /* ` */, 0x61 /* a */, 0x62 /* b */, 0x63 /* c */, + 0x64 /* d */, 0x65 /* e */, 0x66 /* f */, 0x67 /* g */, + 0x68 /* h */, 0x69 /* i */, 0x6A /* j */, 0x6B /* k */, + 0x6C /* l */, 0x6D /* m */, 0x6E /* n */, 0x6F /* o */, + 0x70 /* p */, 0x71 /* q */, 0x72 /* r */, 0x73 /* s */, + 0x74 /* t */, 0x75 /* u */, 0x76 /* v */, 0x77 /* w */, + 0x78 /* x */, 0x79 /* y */, 0x7A /* z */, 0x7B /* { */, + 0x7C /* | */, 0x7D /* } */, 0x7E /* ~ */, 0x7F /* DEL */, + 0x80 /* 0x80 */, 0x81 /* 0x81 */, 0x82 /* 0x82 */, 0x83 /* 0x83 */, + 0x84 /* 0x84 */, 0x85 /* 0x85 */, 0x86 /* 0x86 */, 0x87 /* 0x87 */, + 0x88 /* 0x88 */, 0x89 /* 0x89 */, 0x8A /* 0x8A */, 0x8B /* 0x8B */, + 0x8C /* 0x8C */, 0x8D /* 0x8D */, 0x8E /* 0x8E */, 0x8F /* 0x8F */, + 0x90 /* 0x90 */, 0x91 /* 0x91 */, 0x92 /* 0x92 */, 0x93 /* 0x93 */, + 0x94 /* 0x94 */, 0x95 /* 0x95 */, 0x96 /* 0x96 */, 0x97 /* 0x97 */, + 0x98 /* 0x98 */, 0x99 /* 0x99 */, 0x9A /* 0x9A */, 0x9B /* 0x9B */, + 0x9C /* 0x9C */, 0x9D /* 0x9D */, 0x9E /* 0x9E */, 0x9F /* 0x9F */, + 0xA0 /* 0xA0 */, 0xA1 /* 0xA1 */, 0xA2 /* 0xA2 */, 0xA3 /* 0xA3 */, + 0xA4 /* 0xA4 */, 0xA5 /* 0xA5 */, 0xA6 /* 0xA6 */, 0xA7 /* 0xA7 */, + 0xA8 /* 0xA8 */, 0xA9 /* 0xA9 */, 0xAA /* 0xAA */, 0xAB /* 0xAB */, + 0xAC /* 0xAC */, 0xAD /* 0xAD */, 0xAE /* 0xAE */, 0xAF /* 0xAF */, + 0xB0 /* 0xB0 */, 0xB1 /* 0xB1 */, 0xB2 /* 0xB2 */, 0xB3 /* 0xB3 */, + 0xB4 /* 0xB4 */, 0xB5 /* 0xB5 */, 0xB6 /* 0xB6 */, 0xB7 /* 0xB7 */, + 0xB8 /* 0xB8 */, 0xB9 /* 0xB9 */, 0xBA /* 0xBA */, 0xBB /* 0xBB */, + 0xBC /* 0xBC */, 0xBD /* 0xBD */, 0xBE /* 0xBE */, 0xBF /* 0xBF */, + 0xC0 /* 0xC0 */, 0xC1 /* 0xC1 */, 0xC2 /* 0xC2 */, 0xC3 /* 0xC3 */, + 0xC4 /* 0xC4 */, 0xC5 /* 0xC5 */, 0xC6 /* 0xC6 */, 0xC7 /* 0xC7 */, + 0xC8 /* 0xC8 */, 0xC9 /* 0xC9 */, 0xCA /* 0xCA */, 0xCB /* 0xCB */, + 0xCC /* 0xCC */, 0xCD /* 0xCD */, 0xCE /* 0xCE */, 0xCF /* 0xCF */, + 0xD0 /* 0xD0 */, 0xD1 /* 0xD1 */, 0xD2 /* 0xD2 */, 0xD3 /* 0xD3 */, + 0xD4 /* 0xD4 */, 0xD5 /* 0xD5 */, 0xD6 /* 0xD6 */, 0xD7 /* 0xD7 */, + 0xD8 /* 0xD8 */, 0xD9 /* 0xD9 */, 0xDA /* 0xDA */, 0xDB /* 0xDB */, + 0xDC /* 0xDC */, 0xDD /* 0xDD */, 0xDE /* 0xDE */, 0xDF /* 0xDF */, + 0xE0 /* 0xE0 */, 0xE1 /* 0xE1 */, 0xE2 /* 0xE2 */, 0xE3 /* 0xE3 */, + 0xE4 /* 0xE4 */, 0xE5 /* 0xE5 */, 0xE6 /* 0xE6 */, 0xE7 /* 0xE7 */, + 0xE8 /* 0xE8 */, 0xE9 /* 0xE9 */, 0xEA /* 0xEA */, 0xEB /* 0xEB */, + 0xEC /* 0xEC */, 0xED /* 0xED */, 0xEE /* 0xEE */, 0xEF /* 0xEF */, + 0xF0 /* 0xF0 */, 0xF1 /* 0xF1 */, 0xF2 /* 0xF2 */, 0xF3 /* 0xF3 */, + 0xF4 /* 0xF4 */, 0xF5 /* 0xF5 */, 0xF6 /* 0xF6 */, 0xF7 /* 0xF7 */, + 0xF8 /* 0xF8 */, 0xF9 /* 0xF9 */, 0xFA /* 0xFA */, 0xFB /* 0xFB */, + 0xFC /* 0xFC */, 0xFD /* 0xFD */, 0xFE /* 0xFE */, 0xFF /* 0xFF */, }; void nghttp3_downcase(uint8_t *s, size_t len) { size_t i; for (i = 0; i < len; ++i) { - s[i] = DOWNCASE_TBL[s[i]]; + s[i] = nghttp3_downcase_byte(s[i]); } } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_str.h b/deps/ngtcp2/nghttp3/lib/nghttp3_str.h index 280749a3a9a3..ee0562f26a3b 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_str.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_str.h @@ -37,4 +37,14 @@ uint8_t *nghttp3_cpymem(uint8_t *dest, const uint8_t *src, size_t n); void nghttp3_downcase(uint8_t *s, size_t len); +extern const uint8_t nghttp3_downcase_tbl[]; + +/* + * nghttp3_downcase_byte returns the lower case version of |c| if 'A' + * <= |c| && |c| <= 'Z'. Otherwise, it returns |c|. + */ +static inline uint8_t nghttp3_downcase_byte(uint8_t c) { + return nghttp3_downcase_tbl[c]; +} + #endif /* !defined(NGHTTP3_STR_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c index 9af7d009adf3..09298006f4f6 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c @@ -68,12 +68,11 @@ int nghttp3_stream_new(nghttp3_stream **pstream, int64_t stream_id, .http.content_length = -1, .http.pri.urgency = NGHTTP3_DEFAULT_URGENCY, }, - .error_code = NGHTTP3_H3_NO_ERROR, }; nghttp3_tnode_init(&stream->node, stream_id); - nghttp3_ringbuf_init(&stream->frq, 0, sizeof(nghttp3_frame_entry), mem); + nghttp3_ringbuf_init(&stream->frq, 0, sizeof(nghttp3_frame), mem); nghttp3_ringbuf_init(&stream->chunks, 0, sizeof(nghttp3_buf), mem); nghttp3_ringbuf_init(&stream->outq, 0, sizeof(nghttp3_typed_buf), mem); nghttp3_ringbuf_init(&stream->inq, 0, sizeof(nghttp3_buf), mem); @@ -136,17 +135,17 @@ static void delete_out_chunks(nghttp3_ringbuf *chunks, } static void delete_frq(nghttp3_ringbuf *frq, const nghttp3_mem *mem) { - nghttp3_frame_entry *frent; + nghttp3_frame *fr; size_t i, len = nghttp3_ringbuf_len(frq); for (i = 0; i < len; ++i) { - frent = nghttp3_ringbuf_get(frq, i); - switch (frent->fr.hd.type) { + fr = nghttp3_ringbuf_get(frq, i); + switch (fr->hd.type) { case NGHTTP3_FRAME_HEADERS: - nghttp3_frame_headers_free(&frent->fr.headers, mem); + nghttp3_frame_headers_free(&fr->headers, mem); break; case NGHTTP3_FRAME_PRIORITY_UPDATE: - nghttp3_frame_priority_update_free(&frent->fr.priority_update, mem); + nghttp3_frame_priority_update_free(&fr->priority_update, mem); break; default: break; @@ -172,11 +171,11 @@ void nghttp3_stream_del(nghttp3_stream *stream) { } void nghttp3_varint_read_state_reset(nghttp3_varint_read_state *rvint) { - memset(rvint, 0, sizeof(*rvint)); + *rvint = (nghttp3_varint_read_state){0}; } void nghttp3_stream_read_state_reset(nghttp3_stream_read_state *rstate) { - memset(rstate, 0, sizeof(*rstate)); + *rstate = (nghttp3_stream_read_state){0}; } nghttp3_ssize nghttp3_read_varint(nghttp3_varint_read_state *rvint, @@ -190,10 +189,10 @@ nghttp3_ssize nghttp3_read_varint(nghttp3_varint_read_state *rvint, if (rvint->left == 0) { assert(rvint->acc == 0); - vlen = nghttp3_get_varintlen(begin); - len = nghttp3_min_size(vlen, (size_t)(end - begin)); + vlen = nghttp3_get_uvarintlen(begin); + len = nghttp3_min(vlen, (size_t)(end - begin)); if (vlen <= len) { - nghttp3_get_varint(&rvint->acc, begin); + nghttp3_get_uvarint(&rvint->acc, begin); return (nghttp3_ssize)vlen; } @@ -203,19 +202,19 @@ nghttp3_ssize nghttp3_read_varint(nghttp3_varint_read_state *rvint, p = (uint8_t *)&rvint->acc + (sizeof(rvint->acc) - vlen); memcpy(p, begin, len); - *p &= 0x3f; + *p &= 0x3FU; rvint->left = vlen - len; return (nghttp3_ssize)len; } - len = nghttp3_min_size(rvint->left, (size_t)(end - begin)); + len = nghttp3_min(rvint->left, (size_t)(end - begin)); p = (uint8_t *)&rvint->acc + (sizeof(rvint->acc) - rvint->left); memcpy(p, begin, len); rvint->left -= len; if (rvint->left == 0) { - rvint->acc = (int64_t)nghttp3_ntohl64((uint64_t)rvint->acc); + rvint->acc = nghttp3_ntohl64(rvint->acc); } else if (fin) { return NGHTTP3_ERR_INVALID_ARGUMENT; } @@ -223,53 +222,49 @@ nghttp3_ssize nghttp3_read_varint(nghttp3_varint_read_state *rvint, return (nghttp3_ssize)len; } -int nghttp3_stream_frq_add(nghttp3_stream *stream, - const nghttp3_frame_entry *frent) { +int nghttp3_stream_frq_emplace(nghttp3_stream *stream, nghttp3_frame **pfr) { nghttp3_ringbuf *frq = &stream->frq; - nghttp3_frame_entry *dest; int rv; if (nghttp3_ringbuf_full(frq)) { - size_t nlen = - nghttp3_max_size(NGHTTP3_MIN_RBLEN, nghttp3_ringbuf_len(frq) * 2); + size_t nlen = nghttp3_max(NGHTTP3_MIN_RBLEN, nghttp3_ringbuf_len(frq) * 2); rv = nghttp3_ringbuf_reserve(frq, nlen); if (rv != 0) { return rv; } } - dest = nghttp3_ringbuf_push_back(frq); - *dest = *frent; + *pfr = nghttp3_ringbuf_push_back(frq); return 0; } int nghttp3_stream_fill_outq(nghttp3_stream *stream) { nghttp3_ringbuf *frq = &stream->frq; - nghttp3_frame_entry *frent; + nghttp3_frame *fr; int data_eof; int rv; for (; nghttp3_ringbuf_len(frq) && stream->unsent_bytes < NGHTTP3_MIN_UNSENT_BYTES;) { - frent = nghttp3_ringbuf_get(frq, 0); + fr = nghttp3_ringbuf_get(frq, 0); - switch (frent->fr.hd.type) { + switch (fr->hd.type) { case NGHTTP3_FRAME_SETTINGS: - rv = nghttp3_stream_write_settings(stream, frent); + rv = nghttp3_stream_write_settings(stream, &fr->settings); if (rv != 0) { return rv; } break; case NGHTTP3_FRAME_HEADERS: - rv = nghttp3_stream_write_headers(stream, frent); + rv = nghttp3_stream_write_headers(stream, &fr->headers); if (rv != 0) { return rv; } - nghttp3_frame_headers_free(&frent->fr.headers, stream->mem); + nghttp3_frame_headers_free(&fr->headers, stream->mem); break; case NGHTTP3_FRAME_DATA: - rv = nghttp3_stream_write_data(stream, &data_eof, frent); + rv = nghttp3_stream_write_data(stream, &data_eof, &fr->data); if (rv != 0) { return rv; } @@ -281,21 +276,20 @@ int nghttp3_stream_fill_outq(nghttp3_stream *stream) { } break; case NGHTTP3_FRAME_GOAWAY: - rv = nghttp3_stream_write_goaway(stream, frent); + rv = nghttp3_stream_write_goaway(stream, &fr->goaway); if (rv != 0) { return rv; } break; case NGHTTP3_FRAME_PRIORITY_UPDATE: - rv = nghttp3_stream_write_priority_update(stream, frent); + rv = nghttp3_stream_write_priority_update(stream, &fr->priority_update); if (rv != 0) { return rv; } - nghttp3_frame_priority_update_free(&frent->fr.priority_update, - stream->mem); + nghttp3_frame_priority_update_free(&fr->priority_update, stream->mem); break; case NGHTTP3_FRAME_ORIGIN: - rv = nghttp3_stream_write_origin(stream, frent); + rv = nghttp3_stream_write_origin(stream, &fr->origin); if (rv != 0) { return rv; } @@ -313,7 +307,7 @@ int nghttp3_stream_fill_outq(nghttp3_stream *stream) { } int nghttp3_stream_write_stream_type(nghttp3_stream *stream) { - size_t len = nghttp3_put_varintlen((int64_t)stream->type); + size_t len = nghttp3_put_uvarintlen(stream->type); nghttp3_buf *chunk; nghttp3_typed_buf tbuf; int rv; @@ -326,14 +320,14 @@ int nghttp3_stream_write_stream_type(nghttp3_stream *stream) { chunk = nghttp3_stream_get_chunk(stream); nghttp3_typed_buf_shared_init(&tbuf, chunk); - chunk->last = nghttp3_put_varint(chunk->last, (int64_t)stream->type); + chunk->last = nghttp3_put_uvarint(chunk->last, stream->type); tbuf.buf.last = chunk->last; return nghttp3_stream_outq_add(stream, &tbuf); } int nghttp3_stream_write_settings(nghttp3_stream *stream, - nghttp3_frame_entry *frent) { + const nghttp3_frame_settings *infr) { size_t len; int rv; nghttp3_buf *chunk; @@ -344,8 +338,8 @@ int nghttp3_stream_write_settings(nghttp3_stream *stream, .niv = 3, .iv = ents, }; - nghttp3_settings *local_settings = frent->aux.settings.local_settings; - int64_t payloadlen; + const nghttp3_settings *local_settings = infr->local_settings; + uint64_t payloadlen; ents[0] = (nghttp3_settings_entry){ .id = NGHTTP3_SETTINGS_ID_MAX_FIELD_SECTION_SIZE, @@ -396,13 +390,12 @@ int nghttp3_stream_write_settings(nghttp3_stream *stream, } int nghttp3_stream_write_goaway(nghttp3_stream *stream, - nghttp3_frame_entry *frent) { - nghttp3_frame_goaway *fr = &frent->fr.goaway; + const nghttp3_frame_goaway *fr) { size_t len; int rv; nghttp3_buf *chunk; nghttp3_typed_buf tbuf; - int64_t payloadlen; + uint64_t payloadlen; len = nghttp3_frame_write_goaway_len(&payloadlen, fr); @@ -421,14 +414,13 @@ int nghttp3_stream_write_goaway(nghttp3_stream *stream, return nghttp3_stream_outq_add(stream, &tbuf); } -int nghttp3_stream_write_priority_update(nghttp3_stream *stream, - nghttp3_frame_entry *frent) { - nghttp3_frame_priority_update *fr = &frent->fr.priority_update; +int nghttp3_stream_write_priority_update( + nghttp3_stream *stream, const nghttp3_frame_priority_update *fr) { size_t len; int rv; nghttp3_buf *chunk; nghttp3_typed_buf tbuf; - int64_t payloadlen; + uint64_t payloadlen; len = nghttp3_frame_write_priority_update_len(&payloadlen, fr); @@ -449,15 +441,14 @@ int nghttp3_stream_write_priority_update(nghttp3_stream *stream, } int nghttp3_stream_write_origin(nghttp3_stream *stream, - nghttp3_frame_entry *frent) { - nghttp3_frame_origin *fr = &frent->fr.origin; + const nghttp3_frame_origin *fr) { nghttp3_buf *chunk; nghttp3_buf buf; nghttp3_typed_buf tbuf; int rv; rv = nghttp3_stream_ensure_chunk( - stream, nghttp3_frame_write_hd_len(fr->type, (int64_t)fr->origin_list.len)); + stream, nghttp3_frame_write_hd_len(fr->type, fr->origin_list.len)); if (rv != 0) { return rv; } @@ -466,7 +457,7 @@ int nghttp3_stream_write_origin(nghttp3_stream *stream, nghttp3_typed_buf_shared_init(&tbuf, chunk); chunk->last = - nghttp3_frame_write_hd(chunk->last, fr->type, (int64_t)fr->origin_list.len); + nghttp3_frame_write_hd(chunk->last, fr->type, fr->origin_list.len); tbuf.buf.last = chunk->last; @@ -488,8 +479,7 @@ int nghttp3_stream_write_origin(nghttp3_stream *stream, } int nghttp3_stream_write_headers(nghttp3_stream *stream, - nghttp3_frame_entry *frent) { - nghttp3_frame_headers *fr = &frent->fr.headers; + const nghttp3_frame_headers *fr) { nghttp3_conn *conn = stream->conn; assert(conn); @@ -503,8 +493,8 @@ int nghttp3_stream_write_header_block(nghttp3_stream *stream, nghttp3_qpack_encoder *qenc, nghttp3_stream *qenc_stream, nghttp3_buf *rbuf, nghttp3_buf *ebuf, - int64_t frame_type, const nghttp3_nv *nva, - size_t nvlen) { + uint64_t frame_type, + const nghttp3_nv *nva, size_t nvlen) { nghttp3_buf pbuf; int rv; size_t len; @@ -512,7 +502,7 @@ int nghttp3_stream_write_header_block(nghttp3_stream *stream, nghttp3_typed_buf tbuf; uint8_t raw_pbuf[16]; size_t pbuflen, rbuflen, ebuflen; - int64_t payloadlen; + uint64_t payloadlen; nghttp3_buf_wrap_init(&pbuf, raw_pbuf, sizeof(raw_pbuf)); @@ -526,7 +516,7 @@ int nghttp3_stream_write_header_block(nghttp3_stream *stream, rbuflen = nghttp3_buf_len(rbuf); ebuflen = nghttp3_buf_len(ebuf); - payloadlen = (int64_t)(pbuflen + rbuflen); + payloadlen = pbuflen + rbuflen; len = nghttp3_frame_write_hd_len(frame_type, payloadlen) + pbuflen; @@ -610,15 +600,15 @@ int nghttp3_stream_write_header_block(nghttp3_stream *stream, } int nghttp3_stream_write_data(nghttp3_stream *stream, int *peof, - nghttp3_frame_entry *frent) { + const nghttp3_frame_data *fr) { int rv; size_t len; nghttp3_typed_buf tbuf; nghttp3_buf buf; nghttp3_buf *chunk; - nghttp3_read_data_callback read_data = frent->aux.data.dr.read_data; + nghttp3_read_data_callback read_data = fr->dr.read_data; nghttp3_conn *conn = stream->conn; - int64_t datalen; + uint64_t datalen; uint32_t flags = 0; nghttp3_vec vec[8]; nghttp3_vec *v; @@ -641,8 +631,8 @@ int nghttp3_stream_write_data(nghttp3_stream *stream, int *peof, return NGHTTP3_ERR_CALLBACK_FAILURE; } - datalen = nghttp3_vec_len_varint(vec, (size_t)sveccnt); - if (datalen == -1) { + rv = nghttp3_vec_len_uvarint(&datalen, vec, (size_t)sveccnt); + if (rv == -1) { return NGHTTP3_ERR_STREAM_DATA_OVERFLOW; } @@ -726,7 +716,7 @@ int nghttp3_stream_write_qpack_decoder_stream(nghttp3_stream *stream) { assert(qdec); - len = nghttp3_qpack_decoder_get_decoder_streamlen(qdec); + len = nghttp3_qpack_decoder_get_decoder_streamlen2(qdec); if (len == 0) { return 0; } @@ -780,7 +770,7 @@ int nghttp3_stream_outq_add(nghttp3_stream *stream, } if (nghttp3_ringbuf_full(outq)) { - size_t nlen = nghttp3_max_size(NGHTTP3_MIN_RBLEN, len * 2); + size_t nlen = nghttp3_max(NGHTTP3_MIN_RBLEN, len * 2); rv = nghttp3_ringbuf_reserve(outq, nlen); if (rv != 0) { return rv; @@ -822,7 +812,7 @@ int nghttp3_stream_ensure_chunk(nghttp3_stream *stream, size_t need) { } if (nghttp3_ringbuf_full(chunks)) { - size_t nlen = nghttp3_max_size(NGHTTP3_MIN_RBLEN, len * 2); + size_t nlen = nghttp3_max(NGHTTP3_MIN_RBLEN, len * 2); rv = nghttp3_ringbuf_reserve(chunks, nlen); if (rv != 0) { return rv; @@ -844,13 +834,13 @@ nghttp3_buf *nghttp3_stream_get_chunk(nghttp3_stream *stream) { return nghttp3_ringbuf_get(chunks, len - 1); } -int nghttp3_stream_is_blocked(nghttp3_stream *stream) { +int nghttp3_stream_is_blocked(const nghttp3_stream *stream) { return (stream->flags & NGHTTP3_STREAM_FLAG_FC_BLOCKED) || (stream->flags & NGHTTP3_STREAM_FLAG_SHUT_WR) || (stream->flags & NGHTTP3_STREAM_FLAG_READ_DATA_BLOCKED); } -int nghttp3_stream_require_schedule(nghttp3_stream *stream) { +int nghttp3_stream_require_schedule(const nghttp3_stream *stream) { return (!nghttp3_stream_outq_write_done(stream) && !(stream->flags & NGHTTP3_STREAM_FLAG_FC_BLOCKED) && !(stream->flags & NGHTTP3_STREAM_FLAG_SHUT_WR)) || @@ -918,8 +908,8 @@ void nghttp3_stream_add_outq_offset(nghttp3_stream *stream, size_t n) { stream->outq_idx = i; } -int nghttp3_stream_outq_write_done(nghttp3_stream *stream) { - nghttp3_ringbuf *outq = &stream->outq; +int nghttp3_stream_outq_write_done(const nghttp3_stream *stream) { + const nghttp3_ringbuf *outq = &stream->outq; size_t len = nghttp3_ringbuf_len(outq); return len == 0 || stream->outq_idx >= len; @@ -975,8 +965,8 @@ int nghttp3_stream_update_ack_offset(nghttp3_stream *stream, uint64_t offset) { /* For NGHTTP3_BUF_TYPE_ALIEN, we never add 0 length buffer. */ if (tbuf->type == NGHTTP3_BUF_TYPE_ALIEN && stream->ack_offset < offset && stream->callbacks.acked_data) { - nack = nghttp3_min_uint64(offset, stream->ack_base + buflen) - - stream->ack_offset; + nack = + nghttp3_min(offset, stream->ack_base + buflen) - stream->ack_offset; rv = stream->callbacks.acked_data(stream, stream->node.id, nack, stream->user_data); @@ -1017,7 +1007,7 @@ int nghttp3_stream_buffer_data(nghttp3_stream *stream, const uint8_t *data, if (len) { buf = nghttp3_ringbuf_get(inq, len - 1); bufleft = nghttp3_buf_left(buf); - nwrite = nghttp3_min_size(datalen, bufleft); + nwrite = nghttp3_min(datalen, bufleft); buf->last = nghttp3_cpymem(buf->last, data, nwrite); data += nwrite; datalen -= nwrite; @@ -1026,7 +1016,7 @@ int nghttp3_stream_buffer_data(nghttp3_stream *stream, const uint8_t *data, for (; datalen;) { if (nghttp3_ringbuf_full(inq)) { size_t nlen = - nghttp3_max_size(NGHTTP3_MIN_RBLEN, nghttp3_ringbuf_len(inq) * 2); + nghttp3_max(NGHTTP3_MIN_RBLEN, nghttp3_ringbuf_len(inq) * 2); rv = nghttp3_ringbuf_reserve(inq, nlen); if (rv != 0) { return rv; @@ -1041,7 +1031,7 @@ int nghttp3_stream_buffer_data(nghttp3_stream *stream, const uint8_t *data, buf = nghttp3_ringbuf_push_back(inq); nghttp3_buf_wrap_init(buf, rawbuf, 16384); bufleft = nghttp3_buf_left(buf); - nwrite = nghttp3_min_size(datalen, bufleft); + nwrite = nghttp3_min(datalen, bufleft); buf->last = nghttp3_cpymem(buf->last, data, nwrite); data += nwrite; datalen -= nwrite; @@ -1235,7 +1225,7 @@ int nghttp3_stream_transit_rx_http_state(nghttp3_stream *stream, } } -int nghttp3_stream_empty_headers_allowed(nghttp3_stream *stream) { +int nghttp3_stream_empty_headers_allowed(const nghttp3_stream *stream) { switch (stream->rx.hstate) { case NGHTTP3_HTTP_STATE_REQ_TRAILERS_BEGIN: case NGHTTP3_HTTP_STATE_RESP_TRAILERS_BEGIN: diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h index 45c4c2576702..d313b1c192b9 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h @@ -52,10 +52,10 @@ /* nghttp3_stream_type is unidirectional stream type. */ typedef uint64_t nghttp3_stream_type; -#define NGHTTP3_STREAM_TYPE_CONTROL 0x00 -#define NGHTTP3_STREAM_TYPE_PUSH 0x01 -#define NGHTTP3_STREAM_TYPE_QPACK_ENCODER 0x02 -#define NGHTTP3_STREAM_TYPE_QPACK_DECODER 0x03 +#define NGHTTP3_STREAM_TYPE_CONTROL 0x00U +#define NGHTTP3_STREAM_TYPE_PUSH 0x01U +#define NGHTTP3_STREAM_TYPE_QPACK_ENCODER 0x02U +#define NGHTTP3_STREAM_TYPE_QPACK_DECODER 0x03U #define NGHTTP3_STREAM_TYPE_UNKNOWN UINT64_MAX typedef enum nghttp3_ctrl_stream_state { @@ -83,7 +83,7 @@ typedef enum nghttp3_req_stream_state { } nghttp3_req_stream_state; typedef struct nghttp3_varint_read_state { - int64_t acc; + uint64_t acc; size_t left; } nghttp3_varint_read_state; @@ -91,43 +91,43 @@ typedef struct nghttp3_stream_read_state { nghttp3_varint_read_state rvint; nghttp3_settings_entry iv; nghttp3_frame fr; - int64_t left; + uint64_t left; int state; } nghttp3_stream_read_state; /* NGHTTP3_STREAM_FLAG_NONE indicates that no flag is set. */ -#define NGHTTP3_STREAM_FLAG_NONE 0x0000u +#define NGHTTP3_STREAM_FLAG_NONE 0x0000U /* NGHTTP3_STREAM_FLAG_TYPE_IDENTIFIED is set when a unidirectional stream type is identified. */ -#define NGHTTP3_STREAM_FLAG_TYPE_IDENTIFIED 0x0001u +#define NGHTTP3_STREAM_FLAG_TYPE_IDENTIFIED 0x0001U /* NGHTTP3_STREAM_FLAG_FC_BLOCKED indicates that stream is blocked by QUIC flow control. */ -#define NGHTTP3_STREAM_FLAG_FC_BLOCKED 0x0002u +#define NGHTTP3_STREAM_FLAG_FC_BLOCKED 0x0002U /* NGHTTP3_STREAM_FLAG_READ_DATA_BLOCKED indicates that application is temporarily unable to provide data. */ -#define NGHTTP3_STREAM_FLAG_READ_DATA_BLOCKED 0x0004u +#define NGHTTP3_STREAM_FLAG_READ_DATA_BLOCKED 0x0004U /* NGHTTP3_STREAM_FLAG_WRITE_END_STREAM indicates that application finished to feed outgoing data. */ -#define NGHTTP3_STREAM_FLAG_WRITE_END_STREAM 0x0008u +#define NGHTTP3_STREAM_FLAG_WRITE_END_STREAM 0x0008U /* NGHTTP3_STREAM_FLAG_QPACK_DECODE_BLOCKED indicates that stream is blocked due to QPACK decoding. */ -#define NGHTTP3_STREAM_FLAG_QPACK_DECODE_BLOCKED 0x0010u +#define NGHTTP3_STREAM_FLAG_QPACK_DECODE_BLOCKED 0x0010U /* NGHTTP3_STREAM_FLAG_READ_EOF indicates that remote endpoint sent fin. */ -#define NGHTTP3_STREAM_FLAG_READ_EOF 0x0020u +#define NGHTTP3_STREAM_FLAG_READ_EOF 0x0020U /* NGHTTP3_STREAM_FLAG_SHUT_WR indicates that any further write operation to a stream is prohibited. */ -#define NGHTTP3_STREAM_FLAG_SHUT_WR 0x0100u +#define NGHTTP3_STREAM_FLAG_SHUT_WR 0x0100U /* NGHTTP3_STREAM_FLAG_SHUT_RD indicates that a read-side stream is closed abruptly and any incoming and pending stream data is just discarded for a stream. */ -#define NGHTTP3_STREAM_FLAG_SHUT_RD 0x0200u +#define NGHTTP3_STREAM_FLAG_SHUT_RD 0x0200U /* NGHTTP3_STREAM_FLAG_SERVER_PRIORITY_SET indicates that server overrides stream priority. */ -#define NGHTTP3_STREAM_FLAG_SERVER_PRIORITY_SET 0x0400u +#define NGHTTP3_STREAM_FLAG_SERVER_PRIORITY_SET 0x0400U /* NGHTTP3_STREAM_FLAG_PRIORITY_UPDATE_RECVED indicates that server received PRIORITY_UPDATE frame for this stream. */ -#define NGHTTP3_STREAM_FLAG_PRIORITY_UPDATE_RECVED 0x0800u +#define NGHTTP3_STREAM_FLAG_PRIORITY_UPDATE_RECVED 0x0800U typedef enum nghttp3_stream_http_state { NGHTTP3_HTTP_STATE_NONE, @@ -225,8 +225,6 @@ struct nghttp3_stream { uint64_t unscheduled_nwrite; nghttp3_stream_type type; nghttp3_stream_read_state rstate; - /* error_code indicates the reason of closure of this stream. */ - uint64_t error_code; struct { uint64_t offset; @@ -246,18 +244,6 @@ struct nghttp3_stream { nghttp3_objalloc_decl(stream, nghttp3_stream, oplent) -typedef struct nghttp3_frame_entry { - nghttp3_frame fr; - union { - struct { - nghttp3_settings *local_settings; - } settings; - struct { - nghttp3_data_reader dr; - } data; - } aux; -} nghttp3_frame_entry; - int nghttp3_stream_new(nghttp3_stream **pstream, int64_t stream_id, const nghttp3_stream_callbacks *callbacks, nghttp3_objalloc *out_chunk_objalloc, @@ -274,8 +260,18 @@ nghttp3_ssize nghttp3_read_varint(nghttp3_varint_read_state *rvint, const uint8_t *begin, const uint8_t *end, int fin); -int nghttp3_stream_frq_add(nghttp3_stream *stream, - const nghttp3_frame_entry *frent); +/* + * nghttp3_stream_frq_emplace adds new space for nghttp3_frame to + * stream->frq, and assigns the pointer to the space to |*pfr| if it + * succeeds. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * NGHTTP3_ERR_NOMEM + * Out of memory. + */ +int nghttp3_stream_frq_emplace(nghttp3_stream *stream, nghttp3_frame **pfr); int nghttp3_stream_fill_outq(nghttp3_stream *stream); @@ -290,35 +286,35 @@ int nghttp3_stream_outq_add(nghttp3_stream *stream, const nghttp3_typed_buf *tbuf); int nghttp3_stream_write_headers(nghttp3_stream *stream, - nghttp3_frame_entry *frent); + const nghttp3_frame_headers *fr); int nghttp3_stream_write_header_block(nghttp3_stream *stream, nghttp3_qpack_encoder *qenc, nghttp3_stream *qenc_stream, nghttp3_buf *rbuf, nghttp3_buf *ebuf, - int64_t frame_type, const nghttp3_nv *nva, - size_t nvlen); + uint64_t frame_type, + const nghttp3_nv *nva, size_t nvlen); int nghttp3_stream_write_data(nghttp3_stream *stream, int *peof, - nghttp3_frame_entry *frent); + const nghttp3_frame_data *fr); int nghttp3_stream_write_settings(nghttp3_stream *stream, - nghttp3_frame_entry *frent); + const nghttp3_frame_settings *fr); int nghttp3_stream_write_goaway(nghttp3_stream *stream, - nghttp3_frame_entry *frent); + const nghttp3_frame_goaway *fr); -int nghttp3_stream_write_priority_update(nghttp3_stream *stream, - nghttp3_frame_entry *frent); +int nghttp3_stream_write_priority_update( + nghttp3_stream *stream, const nghttp3_frame_priority_update *fr); int nghttp3_stream_write_origin(nghttp3_stream *stream, - nghttp3_frame_entry *frent); + const nghttp3_frame_origin *fr); int nghttp3_stream_ensure_chunk(nghttp3_stream *stream, size_t need); nghttp3_buf *nghttp3_stream_get_chunk(nghttp3_stream *stream); -int nghttp3_stream_is_blocked(nghttp3_stream *stream); +int nghttp3_stream_is_blocked(const nghttp3_stream *stream); void nghttp3_stream_add_outq_offset(nghttp3_stream *stream, size_t n); @@ -326,7 +322,7 @@ void nghttp3_stream_add_outq_offset(nghttp3_stream *stream, size_t n); * nghttp3_stream_outq_write_done returns nonzero if all contents in * outq have been written. */ -int nghttp3_stream_outq_write_done(nghttp3_stream *stream); +int nghttp3_stream_outq_write_done(const nghttp3_stream *stream); /* * nghttp2_stream_update_ack_offset updates the last acknowledged @@ -346,7 +342,7 @@ int nghttp3_stream_is_active(nghttp3_stream *stream); * be scheduled. In other words, |stream| or its descendants have * something to send. */ -int nghttp3_stream_require_schedule(nghttp3_stream *stream); +int nghttp3_stream_require_schedule(const nghttp3_stream *stream); int nghttp3_stream_buffer_data(nghttp3_stream *stream, const uint8_t *src, size_t srclen); @@ -360,7 +356,7 @@ void nghttp3_stream_delete_qpack_stream_context(nghttp3_stream *stream); int nghttp3_stream_transit_rx_http_state(nghttp3_stream *stream, nghttp3_stream_http_event event); -int nghttp3_stream_empty_headers_allowed(nghttp3_stream *stream); +int nghttp3_stream_empty_headers_allowed(const nghttp3_stream *stream); /* * nghttp3_stream_uni returns nonzero if stream identified by diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c index 4a969df19463..f8f4be9477c4 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c @@ -56,7 +56,7 @@ void nghttp3_tnode_unschedule(nghttp3_tnode *tnode, nghttp3_pq *pq) { tnode_unschedule(tnode, pq); } -static uint64_t pq_get_first_cycle(nghttp3_pq *pq) { +static uint64_t pq_get_first_cycle(const nghttp3_pq *pq) { nghttp3_tnode *top; if (nghttp3_pq_empty(pq)) { @@ -74,7 +74,7 @@ int nghttp3_tnode_schedule(nghttp3_tnode *tnode, nghttp3_pq *pq, if (tnode->pe.index == NGHTTP3_PQ_BAD_INDEX) { tnode->cycle = pq_get_first_cycle(pq) + - ((nwrite == 0 || !tnode->pri.inc) ? 0 : nghttp3_max_uint64(1, penalty)); + ((nwrite == 0 || !tnode->pri.inc) ? 0 : nghttp3_max(1, penalty)); } else if (nwrite > 0) { if (!tnode->pri.inc || nghttp3_pq_size(pq) == 1) { return 0; @@ -82,7 +82,7 @@ int nghttp3_tnode_schedule(nghttp3_tnode *tnode, nghttp3_pq *pq, nghttp3_pq_remove(pq, &tnode->pe); tnode->pe.index = NGHTTP3_PQ_BAD_INDEX; - tnode->cycle += nghttp3_max_uint64(1, penalty); + tnode->cycle += nghttp3_max(1, penalty); } else { return 0; } @@ -90,6 +90,6 @@ int nghttp3_tnode_schedule(nghttp3_tnode *tnode, nghttp3_pq *pq, return nghttp3_pq_push(pq, &tnode->pe); } -int nghttp3_tnode_is_scheduled(nghttp3_tnode *tnode) { +int nghttp3_tnode_is_scheduled(const nghttp3_tnode *tnode) { return tnode->pe.index != NGHTTP3_PQ_BAD_INDEX; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h index 297067d7ca03..954f6fff040d 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h @@ -33,13 +33,12 @@ #include "nghttp3_pq.h" -#define NGHTTP3_TNODE_MAX_CYCLE_GAP (1llu << 24) +#define NGHTTP3_TNODE_MAX_CYCLE_GAP (1ULL << 24) typedef struct nghttp3_tnode { nghttp3_pq_entry pe; int64_t id; uint64_t cycle; - /* pri is a stream priority produced by nghttp3_pri_to_uint8. */ nghttp3_pri pri; } nghttp3_tnode; @@ -60,6 +59,6 @@ int nghttp3_tnode_schedule(nghttp3_tnode *tnode, nghttp3_pq *pq, /* * nghttp3_tnode_is_scheduled returns nonzero if |tnode| is scheduled. */ -int nghttp3_tnode_is_scheduled(nghttp3_tnode *tnode); +int nghttp3_tnode_is_scheduled(const nghttp3_tnode *tnode); #endif /* !defined(NGHTTP3_TNODE_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_vec.c b/deps/ngtcp2/nghttp3/lib/nghttp3_vec.c index ab58ff5832be..7302e88111bd 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_vec.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_vec.c @@ -37,7 +37,7 @@ uint64_t nghttp3_vec_len(const nghttp3_vec *vec, size_t n) { return res; } -int64_t nghttp3_vec_len_varint(const nghttp3_vec *vec, size_t n) { +int nghttp3_vec_len_uvarint(uint64_t *dest, const nghttp3_vec *vec, size_t n) { uint64_t res = 0; size_t len; size_t i; @@ -51,5 +51,7 @@ int64_t nghttp3_vec_len_varint(const nghttp3_vec *vec, size_t n) { res += len; } - return (int64_t)res; + *dest = res; + + return 0; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_vec.h b/deps/ngtcp2/nghttp3/lib/nghttp3_vec.h index f36eabc10526..ad63f4fedfb2 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_vec.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_vec.h @@ -33,9 +33,11 @@ #include /* - * nghttp3_vec_len_varint is similar to nghttp3_vec_len, but it - * returns -1 if the sum of the length exceeds NGHTTP3_MAX_VARINT. + * nghttp3_vec_len_uvarint is similar to nghttp3_vec_len, but it + * stores the return value from nghttp3_vec_len(|vec|, |n|) into + * |dest| if it does not exceed NGHTTP3_MAX_VARINT, and returns 0. + * Otherwise returns -1. */ -int64_t nghttp3_vec_len_varint(const nghttp3_vec *vec, size_t n); +int nghttp3_vec_len_uvarint(uint64_t *dest, const nghttp3_vec *vec, size_t n); #endif /* !defined(NGHTTP3_VEC_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.c b/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.c index cbcf813e23a0..c312c04f4a8f 100644 --- a/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.c +++ b/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.c @@ -34,18 +34,18 @@ # include #endif /* __AVX2__ */ -#define SFPARSE_STATE_DICT 0x08u -#define SFPARSE_STATE_LIST 0x10u -#define SFPARSE_STATE_ITEM 0x18u +#define SFPARSE_STATE_DICT 0x08U +#define SFPARSE_STATE_LIST 0x10U +#define SFPARSE_STATE_ITEM 0x18U -#define SFPARSE_STATE_INNER_LIST 0x04u +#define SFPARSE_STATE_INNER_LIST 0x04U -#define SFPARSE_STATE_BEFORE 0x00u -#define SFPARSE_STATE_BEFORE_PARAMS 0x01u -#define SFPARSE_STATE_PARAMS 0x02u -#define SFPARSE_STATE_AFTER 0x03u +#define SFPARSE_STATE_BEFORE 0x00U +#define SFPARSE_STATE_BEFORE_PARAMS 0x01U +#define SFPARSE_STATE_PARAMS 0x02U +#define SFPARSE_STATE_AFTER 0x03U -#define SFPARSE_STATE_OP_MASK 0x03u +#define SFPARSE_STATE_OP_MASK 0x03U #define SFPARSE_SET_STATE_AFTER(NAME) \ (SFPARSE_STATE_##NAME | SFPARSE_STATE_AFTER) @@ -69,7 +69,7 @@ #define SFPARSE_STATE_ITEM_INNER_LIST_BEFORE \ SFPARSE_SET_STATE_INNER_LIST_BEFORE(ITEM) -#define SFPARSE_STATE_INITIAL 0x00u +#define SFPARSE_STATE_INITIAL 0x00U #define LCALPHAS \ ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1, ['g'] = 1, \ @@ -200,7 +200,7 @@ static int parser_key(sfparse_parser *sfp, sfparse_vec *dest) { #ifdef __AVX2__ if (sfp->end - sfp->pos >= 32) { - last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1fu); + last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1FU); sfp->pos = find_char_key(sfp->pos, last); if (sfp->pos != last) { @@ -349,7 +349,7 @@ static const uint8_t *find_char_string(const uint8_t *first, const uint8_t *last) { const __m256i bs = _mm256_set1_epi8('\\'); const __m256i dq = _mm256_set1_epi8('"'); - const __m256i del = _mm256_set1_epi8(0x7f); + const __m256i del = _mm256_set1_epi8(0x7F); const __m256i sp = _mm256_set1_epi8(' '); __m256i s, x; uint32_t m; @@ -394,7 +394,7 @@ static int parser_string(sfparse_parser *sfp, sfparse_value *dest) { #ifdef __AVX2__ for (; sfp->end - sfp->pos >= 32; ++sfp->pos) { - last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1fu); + last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1FU); sfp->pos = find_char_string(sfp->pos, last); if (sfp->pos == last) { @@ -541,7 +541,7 @@ static int parser_token(sfparse_parser *sfp, sfparse_value *dest) { #ifdef __AVX2__ if (sfp->end - sfp->pos >= 32) { - last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1fu); + last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1FU); sfp->pos = find_char_token(sfp->pos, last); if (sfp->pos != last) { @@ -622,7 +622,7 @@ static int parser_byteseq(sfparse_parser *sfp, sfparse_value *dest) { #ifdef __AVX2__ if (sfp->end - sfp->pos >= 32) { - last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1fu); + last = sfp->pos + ((sfp->end - sfp->pos) & ~0x1FU); sfp->pos = find_char_byteseq(sfp->pos, last); } #endif /* __AVX2__ */ @@ -1429,8 +1429,8 @@ void sfparse_base64decode(sfparse_vec *dest, const sfparse_vec *src) { } *o++ = (uint8_t)(n >> 16); - *o++ = (n >> 8) & 0xffu; - *o++ = n & 0xffu; + *o++ = (n >> 8) & 0xFFU; + *o++ = n & 0xFFU; } switch (left) { @@ -1467,8 +1467,8 @@ void sfparse_base64decode(sfparse_vec *dest, const sfparse_vec *src) { n = (uint32_t)(index_tbl[*p++] << 10); n += (uint32_t)(index_tbl[*p++] << 4); n += (uint32_t)(index_tbl[*p++] >> 2); - *o++ = (n >> 8) & 0xffu; - *o++ = n & 0xffu; + *o++ = (n >> 8) & 0xFFU; + *o++ = n & 0xFFU; break; } diff --git a/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.h b/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.h index 9341221a0994..7f36ce8a08c5 100644 --- a/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.h +++ b/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.h @@ -130,7 +130,7 @@ typedef struct sfparse_vec { * * :macro:`SFPARSE_VALUE_FLAG_NONE` indicates no flag set. */ -#define SFPARSE_VALUE_FLAG_NONE 0x0u +#define SFPARSE_VALUE_FLAG_NONE 0x0U /** * @macro @@ -138,7 +138,7 @@ typedef struct sfparse_vec { * :macro:`SFPARSE_VALUE_FLAG_ESCAPED_STRING` indicates that a string * contains escaped character(s). */ -#define SFPARSE_VALUE_FLAG_ESCAPED_STRING 0x1u +#define SFPARSE_VALUE_FLAG_ESCAPED_STRING 0x1U /** * @struct diff --git a/deps/ngtcp2/ngtcp2.gyp b/deps/ngtcp2/ngtcp2.gyp index be177717efa2..7ae627924851 100644 --- a/deps/ngtcp2/ngtcp2.gyp +++ b/deps/ngtcp2/ngtcp2.gyp @@ -13,6 +13,7 @@ 'ngtcp2/lib/ngtcp2_cc.c', 'ngtcp2/lib/ngtcp2_cid.c', 'ngtcp2/lib/ngtcp2_conn.c', + 'ngtcp2/lib/ngtcp2_conn_info.c', 'ngtcp2/lib/ngtcp2_conv.c', 'ngtcp2/lib/ngtcp2_crypto.c', 'ngtcp2/lib/ngtcp2_dcidtr.c', @@ -48,7 +49,7 @@ 'ngtcp2/lib/ngtcp2_unreachable.c', 'ngtcp2/lib/ngtcp2_vec.c', 'ngtcp2/lib/ngtcp2_version.c', - 'ngtcp2/lib/ngtcp2_window_filter.c', + 'ngtcp2/lib/ngtcp2_wf.c', 'ngtcp2/crypto/shared.c' ], 'ngtcp2_sources_ossl': [ @@ -89,6 +90,36 @@ 'nghttp3/lib/nghttp3_unreachable.c', 'nghttp3/lib/nghttp3_vec.c', 'nghttp3/lib/nghttp3_version.c', + ], + 'ngtcp2_test_server_sources': [ + 'ngtcp2/examples/tls_server_session_ossl.cc', + 'ngtcp2/examples/tls_server_context_ossl.cc', + 'ngtcp2/examples/tls_session_base_ossl.cc', + 'ngtcp2/examples/util_openssl.cc', + 'ngtcp2/examples/http.cc', + 'ngtcp2/examples/server_base.cc', + 'ngtcp2/examples/shared.cc', + 'ngtcp2/examples/server.cc', + 'ngtcp2/examples/util.cc', + 'ngtcp2/examples/debug.cc', + 'ngtcp2/examples/siphash.cc', + 'ngtcp2/third-party/urlparse/urlparse.c', + 'ngtcp2/third-party/libev/ev.c', + ], + 'ngtcp2_test_client_sources': [ + 'ngtcp2/examples/tls_client_session_ossl.cc', + 'ngtcp2/examples/tls_client_context_ossl.cc', + 'ngtcp2/examples/tls_session_base_ossl.cc', + 'ngtcp2/examples/util_openssl.cc', + 'ngtcp2/examples/http.cc', + 'ngtcp2/examples/client_base.cc', + 'ngtcp2/examples/shared.cc', + 'ngtcp2/examples/client.cc', + 'ngtcp2/examples/util.cc', + 'ngtcp2/examples/debug.cc', + 'ngtcp2/examples/siphash.cc', + 'ngtcp2/third-party/urlparse/urlparse.c', + 'ngtcp2/third-party/libev/ev.c', ] }, 'targets': [ @@ -133,19 +164,6 @@ 'HAVE_NETINET_IN_H', ], }], - # TODO: Support OpenSSL 3.5 shared library builds. - # The complexity here is that we need to use the ngtcp2 ossl - # adapter, which does not include any conditional checks to - # see if the version of OpenSSL used has the necessary QUIC - # APIs, so we need to ensure that we conditionally enable use - # of the adapter only when we know that the OpenSSL version we - # are compiling against has the necessary APIs. We can do that - # by checkig the OpenSSL version number but, currently, the - # code that does so checks only the VERSION.dat file that is - # bundled with the openssl dependency. We'll need to update - # that to support the shared library case, where the version - # of the shared library needs to be determined. - # # TODO: Support Boringssl here also. ngtcp2 provides an adapter # for Boringssl. If we can detect that boringssl is being used # here then we can use that adapter and also set the @@ -189,6 +207,7 @@ 'defines': [ 'BUILDING_NGHTTP3', 'NGHTTP3_STATICLIB', + 'DEBUGBUILD', ], 'dependencies': [ 'ngtcp2' @@ -227,6 +246,128 @@ 'sources': [ '<@(nghttp3_sources)' ] + }, + { + 'target_name': 'ngtcp2_test_server', + # Disabled: ngtcp2 examples now require C++23 (, , + # std::println, std::expected) which is not yet supported on all + # Node.js platforms. Re-enable when C++23 is available. + 'type': 'none', + 'cflags': [ '-Wno-everything' ], + 'include_dirs': [ + '', + 'ngtcp2/examples/', + 'ngtcp2/lib/includes/', + 'ngtcp2/crypto/includes/', + 'ngtcp2/third-party/urlparse/', + 'ngtcp2/third-party/libev/', + '../../nghttp2/lib', + ], + 'dependencies': [ + 'ngtcp2', + 'nghttp3', + '../openssl/openssl.gyp:openssl', + '../nghttp2/nghttp2.gyp:sfparse', + ], + 'defines': [ + 'HAVE_CONFIG_H', + 'WITH_EXAMPLE_OSSL', + 'EV_STANDALONE=1', + 'HAVE_UNISTD_H', + 'HAVE_ARPA_INET_H', + 'HAVE_NETINET_IN_H', + 'HAVE_NETINET_IP_H', + ], + 'conditions': [ + ['OS=="aix" or OS=="win" or OS=="os400"', { + # AIX does not support some of the networking features used in + # the test server. Windows also lacks the Unix-specific headers + # and system calls required by the ngtcp2 examples. + 'type': 'none', # Disable as executable on AIX and Windows + }], + ['OS=="mac"', { + 'defines': [ + '__APPLE_USE_RFC_3542', + ] + }], + ['OS=="solaris"', { + 'defines': [ + 'IPTOS_ECN_MASK=0x03', + ], + 'link_settings': { + 'libraries': [ '-lsocket', '-lnsl' ], + }, + }], + [ 'OS=="linux" or OS=="openharmony"', { + 'link_settings': { + 'libraries': [ '-ldl', '-lrt' ], + }, + }], + ], + 'sources': [ + '<@(ngtcp2_test_server_sources)' + ] + }, + { + 'target_name': 'ngtcp2_test_client', + # Disabled: ngtcp2 examples now require C++23 (, , + # std::println, std::expected) which is not yet supported on all + # Node.js platforms. Re-enable when C++23 is available. + 'type': 'none', + 'cflags': [ '-Wno-everything' ], + 'include_dirs': [ + '', + 'ngtcp2/examples/', + 'ngtcp2/lib/includes/', + 'ngtcp2/crypto/includes/', + 'ngtcp2/third-party/urlparse/', + 'ngtcp2/third-party/libev/', + '../../nghttp2/lib', + ], + 'dependencies': [ + 'ngtcp2', + 'nghttp3', + '../openssl/openssl.gyp:openssl', + '../nghttp2/nghttp2.gyp:sfparse', + ], + 'defines': [ + 'HAVE_CONFIG_H', + 'WITH_EXAMPLE_OSSL', + 'EV_STANDALONE=1', + 'HAVE_UNISTD_H', + 'HAVE_ARPA_INET_H', + 'HAVE_NETINET_IN_H', + 'HAVE_NETINET_IP_H', + ], + 'conditions': [ + ['OS=="aix" or OS=="win" or OS=="os400"', { + # AIX does not support some of the networking features used in + # the test client. Windows also lacks the Unix-specific headers + # and system calls required by the ngtcp2 examples. + 'type': 'none', # Disable as executable on AIX and Windows + }], + ['OS=="mac"', { + 'defines': [ + '__APPLE_USE_RFC_3542', + ] + }], + ['OS=="solaris"', { + 'defines': [ + 'IPTOS_ECN_MASK=0x03', + ], + 'link_settings': { + 'libraries': [ '-lsocket', '-lnsl' ], + }, + }], + [ 'OS=="linux" or OS=="openharmony"', { + 'link_settings': { + 'libraries': [ '-ldl', '-lrt' ], + }, + }], + ], + 'sources': [ + '<@(ngtcp2_test_client_sources)' + ] } ] } diff --git a/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c b/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c index 283063f738e2..bcb7cbd3647c 100644 --- a/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c +++ b/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c @@ -39,6 +39,7 @@ #include #include +#include "ngtcp2_macro.h" #include "shared.h" typedef enum ngtcp2_crypto_boringssl_cipher_type { @@ -277,33 +278,44 @@ int ngtcp2_crypto_cipher_ctx_encrypt_init(ngtcp2_crypto_cipher_ctx *cipher_ctx, const uint8_t *key) { ngtcp2_crypto_boringssl_cipher *hp_cipher = cipher->native_handle; ngtcp2_crypto_boringssl_cipher_ctx *ctx; - int rv; - (void)rv; + int rv = 0; ctx = malloc(sizeof(*ctx)); if (ctx == NULL) { return -1; } - ctx->type = hp_cipher->type; - cipher_ctx->native_handle = ctx; - switch (hp_cipher->type) { case NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_AES_128: - rv = AES_set_encrypt_key(key, 128, &ctx->aes_key); - assert(0 == rv); - return 0; + if (AES_set_encrypt_key(key, 128, &ctx->aes_key) != 0) { + rv = -1; + } + + break; case NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_AES_256: - rv = AES_set_encrypt_key(key, 256, &ctx->aes_key); - assert(0 == rv); - return 0; + if (AES_set_encrypt_key(key, 256, &ctx->aes_key) != 0) { + rv = -1; + } + + break; case NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_CHACHA20: memcpy(ctx->key, key, sizeof(ctx->key)); - return 0; + break; default: assert(0); abort(); }; + + if (rv != 0) { + free(ctx); + + return rv; + } + + ctx->type = hp_cipher->type; + cipher_ctx->native_handle = ctx; + + return 0; } void ngtcp2_crypto_cipher_ctx_free(ngtcp2_crypto_cipher_ctx *cipher_ctx) { @@ -401,7 +413,7 @@ int ngtcp2_crypto_decrypt(uint8_t *dest, const ngtcp2_crypto_aead *aead, int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, const ngtcp2_crypto_cipher_ctx *hp_ctx, const uint8_t *sample) { - static const uint8_t PLAINTEXT[] = "\x00\x00\x00\x00\x00"; + static const uint8_t PLAINTEXT[16] = {0}; ngtcp2_crypto_boringssl_cipher_ctx *ctx = hp_ctx->native_handle; uint32_t counter; @@ -419,7 +431,7 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, #else /* !defined(WORDS_BIGENDIAN) */ memcpy(&counter, sample, sizeof(counter)); #endif /* !defined(WORDS_BIGENDIAN) */ - CRYPTO_chacha_20(dest, PLAINTEXT, sizeof(PLAINTEXT) - 1, ctx->key, + CRYPTO_chacha_20(dest, PLAINTEXT, sizeof(PLAINTEXT), ctx->key, sample + sizeof(counter), counter); return 0; default: @@ -431,18 +443,19 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, int ngtcp2_crypto_read_write_crypto_data( ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, const uint8_t *data, size_t datalen) { - SSL *ssl = ngtcp2_conn_get_tls_native_handle(conn); + SSL *ssl = ngtcp2_conn_get_tls_native_handle2(conn); int rv; int err; - if (SSL_provide_quic_data( + if (datalen && + SSL_provide_quic_data( ssl, ngtcp2_crypto_boringssl_from_ngtcp2_encryption_level(encryption_level), data, datalen) != 1) { return -1; } - if (!ngtcp2_conn_get_handshake_completed(conn)) { + if (!ngtcp2_conn_get_handshake_completed2(conn)) { retry: rv = SSL_do_handshake(ssl); if (rv <= 0) { @@ -454,7 +467,7 @@ int ngtcp2_crypto_read_write_crypto_data( case SSL_ERROR_SSL: return -1; case SSL_ERROR_EARLY_DATA_REJECTED: - assert(!ngtcp2_conn_is_server(conn)); + assert(!ngtcp2_conn_is_server2(conn)); SSL_reset_early_data_reject(ssl); @@ -464,6 +477,16 @@ int ngtcp2_crypto_read_write_crypto_data( } goto retry; + case SSL_ERROR_WANT_X509_LOOKUP: + case SSL_ERROR_WANT_PRIVATE_KEY_OPERATION: + case SSL_ERROR_WANT_CERTIFICATE_VERIFY: + /* It might be better to return this error, but ngtcp2 does + not need to know whether handshake has been interrupted or + not. We expect that necessary plumbing should be done by + application when handshake is interrupted (e.g., via + SSL_PRIVATE_KEY_METHOD). If it does not work, we will + reconsider this. */ + return 0; default: return -1; } @@ -567,6 +590,19 @@ int ngtcp2_crypto_get_path_challenge_data_cb(ngtcp2_conn *conn, uint8_t *data, return 0; } +int ngtcp2_crypto_get_path_challenge_data2_cb(ngtcp2_conn *conn, + ngtcp2_path_challenge_data *data, + void *user_data) { + (void)conn; + (void)user_data; + + if (RAND_bytes(data->data, NGTCP2_PATH_CHALLENGE_DATALEN) != 1) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} + int ngtcp2_crypto_random(uint8_t *data, size_t datalen) { if (RAND_bytes(data, datalen) != 1) { return -1; diff --git a/deps/ngtcp2/ngtcp2/crypto/cryptotest.c b/deps/ngtcp2/ngtcp2/crypto/cryptotest.c new file mode 100644 index 000000000000..0752c9357d5f --- /dev/null +++ b/deps/ngtcp2/ngtcp2/crypto/cryptotest.c @@ -0,0 +1,46 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifdef HAVE_CONFIG_H +# include +#endif /* defined(HAVE_CONFIG_H) */ + +#include "munit.h" + +/* include test cases' include files here */ +#include "shared_test.h" + +int main(int argc, char *argv[]) { + const MunitSuite suites[] = { + shared_suite, + {0}, + }; + const MunitSuite suite = { + .prefix = "", + .suites = suites, + .iterations = 1, + }; + + return munit_suite_main(&suite, NULL, argc, argv); +} diff --git a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h index 003ec6b4c3f2..9ff353ef46b1 100644 --- a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h +++ b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h @@ -338,16 +338,16 @@ ngtcp2_crypto_hp_mask_cb(uint8_t *dest, const ngtcp2_crypto_cipher *hp, * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to * set negotiated AEAD and message digest algorithm. After the * successful call of this function, application can use - * `ngtcp2_conn_get_crypto_ctx` (or `ngtcp2_conn_get_0rtt_crypto_ctx` - * if |level| == + * `ngtcp2_conn_get_crypto_ctx2` (or + * `ngtcp2_conn_get_0rtt_crypto_ctx2` if |level| == * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to * get :type:`ngtcp2_crypto_ctx`. * * If |conn| is initialized as client, and |level| is * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_1RTT`, this * function retrieves a remote QUIC transport parameters extension - * from an object obtained by `ngtcp2_conn_get_tls_native_handle`, and - * sets it to |conn| by calling + * from an object obtained by `ngtcp2_conn_get_tls_native_handle2`, + * and sets it to |conn| by calling * `ngtcp2_conn_decode_and_set_remote_transport_params`. * * This function returns 0 if it succeeds, or -1. @@ -385,16 +385,16 @@ NGTCP2_EXTERN int ngtcp2_crypto_derive_and_install_rx_key( * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to * set negotiated AEAD and message digest algorithm. After the * successful call of this function, application can use - * `ngtcp2_conn_get_crypto_ctx` (or `ngtcp2_conn_get_0rtt_crypto_ctx` - * if |level| == + * `ngtcp2_conn_get_crypto_ctx2` (or + * `ngtcp2_conn_get_0rtt_crypto_ctx2` if |level| == * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_0RTT`) to * get :type:`ngtcp2_crypto_ctx`. * * If |conn| is initialized as server, and |level| is * :enum:`ngtcp2_encryption_level.NGTCP2_ENCRYPTION_LEVEL_1RTT`, this * function retrieves a remote QUIC transport parameters extension - * from an object obtained by `ngtcp2_conn_get_tls_native_handle`, and - * sets it to |conn| by calling + * from an object obtained by `ngtcp2_conn_get_tls_native_handle2`, + * and sets it to |conn| by calling * `ngtcp2_conn_decode_and_set_remote_transport_params`. * * This function returns 0 if it succeeds, or -1. @@ -524,11 +524,14 @@ NGTCP2_EXTERN int ngtcp2_crypto_recv_client_initial_cb(ngtcp2_conn *conn, * completes. It is allowed to call this function with |datalen| == * 0. In this case, no additional read operation is done. * + * This function is implemented per TLS backend. See + * :ref:`tls-integration` for more details. + * * This function returns 0 if it succeeds, or a negative error code. * The generic error code is -1 if a specific error code is not * suitable. The error codes less than -10000 are specific to - * underlying TLS implementation. For quictls, the error codes are - * defined in *ngtcp2_crypto_quictls.h*. + * underlying TLS implementation. Refer to the implementation + * specific header files for error codes. */ NGTCP2_EXTERN int ngtcp2_crypto_read_write_crypto_data(ngtcp2_conn *conn, @@ -542,11 +545,22 @@ ngtcp2_crypto_read_write_crypto_data(ngtcp2_conn *conn, * `ngtcp2_crypto_read_write_crypto_data`. It can be directly passed * to :member:`ngtcp2_callbacks.recv_crypto_data` field. * + * For quictls and OpenSSL, the following error codes are treated as + * success: + * + * - -10001 (e.g., :macro:`NGTCP2_CRYPTO_QUICTLS_ERR_TLS_WANT_X509_LOOKUP`) + * - -10002 (e.g., :macro:`NGTCP2_CRYPTO_QUICTLS_ERR_TLS_WANT_CLIENT_HELLO_CB`) + * + * To continue the interrupted handshake, call + * `ngtcp2_conn_continue_handshake`. + * + * See :ref:`tls-integration` for more details. + * * If this function is used, the TLS implementation specific error * codes described in `ngtcp2_crypto_read_write_crypto_data` are - * treated as if it returns -1. Do not use this function if an - * application wishes to use the TLS implementation specific error - * codes. + * treated as if it returns -1 except for those that are listed above. + * Do not use this function if an application wishes to use the TLS + * implementation specific error codes. */ NGTCP2_EXTERN int ngtcp2_crypto_recv_crypto_data_cb( ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, uint64_t offset, @@ -583,7 +597,7 @@ NGTCP2_EXTERN int ngtcp2_crypto_generate_stateless_reset_token( * :macro:`NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY` is the magic byte for * Retry token generated by `ngtcp2_crypto_generate_retry_token`. */ -#define NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY 0xb6 +#define NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY 0xB6 /** * @macro @@ -591,7 +605,7 @@ NGTCP2_EXTERN int ngtcp2_crypto_generate_stateless_reset_token( * :macro:`NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2` is the magic byte for * Retry token generated by `ngtcp2_crypto_generate_retry_token2`. */ -#define NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2 0xb7 +#define NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2 0xB7 /** * @macro @@ -627,7 +641,10 @@ NGTCP2_EXTERN int ngtcp2_crypto_generate_stateless_reset_token( * @macro * * :macro:`NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN` is the maximum length - * of a token generated by `ngtcp2_crypto_generate_regular_token`. + * of a token generated by `ngtcp2_crypto_generate_regular_token`. + * `ngtcp2_crypto_generate_regular_token2` generates a token of length + * at most :macro:`NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN` bytes + the + * length of the provided opaque data. */ #define NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN \ (/* magic = */ 1 + sizeof(ngtcp2_tstamp) + /* aead tag = */ 16 + \ @@ -787,6 +804,77 @@ NGTCP2_EXTERN int ngtcp2_crypto_verify_regular_token( size_t secretlen, const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, ngtcp2_duration timeout, ngtcp2_tstamp ts); +/** + * @function + * + * `ngtcp2_crypto_generate_regular_token2` generates a token in the + * buffer pointed by |token| that is sent with NEW_TOKEN frame. The + * buffer pointed by |token| must have at least + * :macro:`NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN` + |datalen| bytes long. + * The successfully generated token starts with + * :macro:`NGTCP2_CRYPTO_TOKEN_MAGIC_REGULAR`. |secret| of length + * |secretlen| is a keying material to generate keys to encrypt the + * token. |remote_addr| of length |remote_addrlen| is an address of + * client. |ts| is the timestamp when the token is generated. |data| + * of length |datalen| is an opaque data embedded in the token. + * |datalen| must be less than or equal to 256. + * + * Calling this function with |datalen| = 0 is equivalent to calling + * `ngtcp2_crypto_generate_regular_token`. + * + * To get the opaque data after successful verification, use + * `ngtcp2_crypto_verify_regular_token2`. + * `ngtcp2_crypto_verify_regular_token` can verify the token with + * |datalen| > 0, but it discards the opaque data. + * + * This function returns the length of generated token if it succeeds, + * or -1. + */ +NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_regular_token2( + uint8_t *token, const uint8_t *secret, size_t secretlen, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const void *data, size_t datalen, ngtcp2_tstamp ts); + +/** + * @function + * + * `ngtcp2_crypto_verify_regular_token2` verifies a regular token + * stored in the buffer pointed by |token| of length |tokenlen|. + * |secret| of length |secretlen| is a keying material to generate + * keys to decrypt the token. |remote_addr| of length + * |remote_addrlen| is an address of client. |timeout| is the period + * during which the token is valid. |ts| is the current timestamp. + * |data| is the pointer to the buffer of length at least + * |max_datalen| bytes. If the token is verified successfully, the + * opaque data embedded in the token is copied to the buffer pointed + * by |data|. + * + * If |tokenlen| is less than + * :macro:`NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN`, this function returns + * :macro:`NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN`. + * + * If the length of opaque data is larger than |max_datalen|, the + * verification still succeeds, but nothing is written to the buffer + * pointed by |data|, and this function returns 0. In other words, + * the opaque data is discarded. + * + * This function returns the number of the opaque data written to the + * buffer pointed by |data| if it succeeds, or one of the following + * negative error codes: + * + * :macro:`NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN` + * A token is badly formatted; or verifying the integrity + * protection failed. + * :macro:`NGTCP2_CRYPTO_ERR_VERIFY_TOKEN` + * A token validity has expired. + * :macro:`NGTCP2_CRYPTO_ERR_INTERNAL` + * Internal error occurred. + */ +NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_verify_regular_token2( + void *data, size_t max_datalen, const uint8_t *token, size_t tokenlen, + const uint8_t *secret, size_t secretlen, const ngtcp2_sockaddr *remote_addr, + ngtcp2_socklen remote_addrlen, ngtcp2_duration timeout, ngtcp2_tstamp ts); + /** * @function * @@ -898,6 +986,11 @@ NGTCP2_EXTERN void ngtcp2_crypto_delete_crypto_cipher_ctx_cb( /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.22.0 + * Use `ngtcp2_crypto_get_path_challenge_data2_cb` instead. + * * `ngtcp2_crypto_get_path_challenge_data_cb` writes unpredictable * sequence of :macro:`NGTCP2_PATH_CHALLENGE_DATALEN` bytes to |data| * which is sent with PATH_CHALLENGE frame. @@ -909,6 +1002,21 @@ NGTCP2_EXTERN int ngtcp2_crypto_get_path_challenge_data_cb(ngtcp2_conn *conn, uint8_t *data, void *user_data); +/** + * @function + * + * `ngtcp2_crypto_get_path_challenge_data2_cb` writes unpredictable + * sequence of :macro:`NGTCP2_PATH_CHALLENGE_DATALEN` bytes to |data| + * which is sent with PATH_CHALLENGE frame. + * + * This function can be directly passed to + * :member:`ngtcp2_callbacks.get_path_challenge_data2` field. + * + * .. version-added:: 1.22.0 + */ +NGTCP2_EXTERN int ngtcp2_crypto_get_path_challenge_data2_cb( + ngtcp2_conn *conn, ngtcp2_path_challenge_data *data, void *user_data); + /** * @function * diff --git a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_ossl.h b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_ossl.h index 417ec017c60c..06e8d42bda01 100644 --- a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_ossl.h +++ b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_ossl.h @@ -145,6 +145,18 @@ NGTCP2_EXTERN SSL *ngtcp2_crypto_ossl_ctx_get_ssl(ngtcp2_crypto_ossl_ctx *ctx); */ NGTCP2_EXTERN int ngtcp2_crypto_ossl_init(void); +/** + * @function + * + * `ngtcp2_crypto_ossl_free` frees the resources allocated by + * `ngtcp2_crypto_ossl_init`. It is safe to call this function even + * if `ngtcp2_crypto_ossl_init` fails or is not called at all. This + * function might be useful to make some leak detection tools happy. + * + * .. version-added:: 1.24.0 + */ +NGTCP2_EXTERN void ngtcp2_crypto_ossl_free(void); + /** * @function * diff --git a/deps/ngtcp2/ngtcp2/crypto/ossl/ossl.c b/deps/ngtcp2/ngtcp2/crypto/ossl/ossl.c index 061d6acd21d9..067129077545 100644 --- a/deps/ngtcp2/ngtcp2/crypto/ossl/ossl.c +++ b/deps/ngtcp2/ngtcp2/crypto/ossl/ossl.c @@ -41,72 +41,96 @@ #include "ngtcp2_macro.h" #include "shared.h" -static int crypto_initialized; +#if defined(OPENSSL_NO_CHACHA) || defined(OPENSSL_NO_POLY1305) +# define NGTCP2_NO_CHACHA_POLY1305 +#endif /* defined(OPENSSL_NO_CHACHA) || \ + defined(OPENSSL_NO_POLY1305) */ + static EVP_CIPHER *crypto_aes_128_gcm; static EVP_CIPHER *crypto_aes_256_gcm; -static EVP_CIPHER *crypto_chacha20_poly1305; static EVP_CIPHER *crypto_aes_128_ccm; -static EVP_CIPHER *crypto_aes_128_ctr; -static EVP_CIPHER *crypto_aes_256_ctr; +static EVP_CIPHER *crypto_aes_128_ecb; +static EVP_CIPHER *crypto_aes_256_ecb; +#ifndef NGTCP2_NO_CHACHA_POLY1305 +static EVP_CIPHER *crypto_chacha20_poly1305; static EVP_CIPHER *crypto_chacha20; +#endif /* !defined(NGTCP2_NO_CHACHA_POLY1305) */ static EVP_MD *crypto_sha256; static EVP_MD *crypto_sha384; static EVP_KDF *crypto_hkdf; int ngtcp2_crypto_ossl_init(void) { + /* We do not care whether the pre-fetch succeeds or not. If it + fails, it returns NULL, which is still the default value, and our + code should still work with it. */ crypto_aes_128_gcm = EVP_CIPHER_fetch(NULL, "AES-128-GCM", NULL); - if (crypto_aes_128_gcm == NULL) { - return -1; - } - crypto_aes_256_gcm = EVP_CIPHER_fetch(NULL, "AES-256-GCM", NULL); - if (crypto_aes_256_gcm == NULL) { - return -1; - } - + crypto_aes_128_ccm = EVP_CIPHER_fetch(NULL, "AES-128-CCM", NULL); + crypto_aes_128_ecb = EVP_CIPHER_fetch(NULL, "AES-128-ECB", NULL); + crypto_aes_256_ecb = EVP_CIPHER_fetch(NULL, "AES-256-ECB", NULL); +#ifndef NGTCP2_NO_CHACHA_POLY1305 crypto_chacha20_poly1305 = EVP_CIPHER_fetch(NULL, "ChaCha20-Poly1305", NULL); - if (crypto_chacha20_poly1305 == NULL) { - return -1; + crypto_chacha20 = EVP_CIPHER_fetch(NULL, "ChaCha20", NULL); +#endif /* !defined(NGTCP2_NO_CHACHA_POLY1305) */ + crypto_sha256 = EVP_MD_fetch(NULL, "sha256", NULL); + crypto_sha384 = EVP_MD_fetch(NULL, "sha384", NULL); + crypto_hkdf = EVP_KDF_fetch(NULL, "hkdf", NULL); + + return 0; +} + +void ngtcp2_crypto_ossl_free(void) { + if (crypto_hkdf) { + EVP_KDF_free(crypto_hkdf); + crypto_hkdf = NULL; } - crypto_aes_128_ccm = EVP_CIPHER_fetch(NULL, "AES-128-CCM", NULL); - if (crypto_aes_128_ccm == NULL) { - return -1; + if (crypto_sha384) { + EVP_MD_free(crypto_sha384); + crypto_sha384 = NULL; } - crypto_aes_128_ctr = EVP_CIPHER_fetch(NULL, "AES-128-CTR", NULL); - if (crypto_aes_128_ctr == NULL) { - return -1; + if (crypto_sha256) { + EVP_MD_free(crypto_sha256); + crypto_sha256 = NULL; } - crypto_aes_256_ctr = EVP_CIPHER_fetch(NULL, "AES-256-CTR", NULL); - if (crypto_aes_256_ctr == NULL) { - return -1; +#ifndef NGTCP2_NO_CHACHA_POLY1305 + if (crypto_chacha20) { + EVP_CIPHER_free(crypto_chacha20); + crypto_chacha20 = NULL; } - crypto_chacha20 = EVP_CIPHER_fetch(NULL, "ChaCha20", NULL); - if (crypto_chacha20 == NULL) { - return -1; + if (crypto_chacha20_poly1305) { + EVP_CIPHER_free(crypto_chacha20_poly1305); + crypto_chacha20_poly1305 = NULL; } +#endif /* !defined(NGTCP2_NO_CHACHA_POLY1305) */ - crypto_sha256 = EVP_MD_fetch(NULL, "sha256", NULL); - if (crypto_sha256 == NULL) { - return -1; + if (crypto_aes_256_ecb) { + EVP_CIPHER_free(crypto_aes_256_ecb); + crypto_aes_256_ecb = NULL; } - crypto_sha384 = EVP_MD_fetch(NULL, "sha384", NULL); - if (crypto_sha384 == NULL) { - return -1; + if (crypto_aes_128_ecb) { + EVP_CIPHER_free(crypto_aes_128_ecb); + crypto_aes_128_ecb = NULL; } - crypto_hkdf = EVP_KDF_fetch(NULL, "hkdf", NULL); - if (crypto_hkdf == NULL) { - return -1; + if (crypto_aes_128_ccm) { + EVP_CIPHER_free(crypto_aes_128_ccm); + crypto_aes_128_ccm = NULL; } - crypto_initialized = 1; + if (crypto_aes_256_gcm) { + EVP_CIPHER_free(crypto_aes_256_gcm); + crypto_aes_256_gcm = NULL; + } - return 0; + if (crypto_aes_128_gcm) { + EVP_CIPHER_free(crypto_aes_128_gcm); + crypto_aes_128_gcm = NULL; + } } static const EVP_CIPHER *crypto_aead_aes_128_gcm(void) { @@ -125,6 +149,7 @@ static const EVP_CIPHER *crypto_aead_aes_256_gcm(void) { return EVP_aes_256_gcm(); } +#ifndef NGTCP2_NO_CHACHA_POLY1305 static const EVP_CIPHER *crypto_aead_chacha20_poly1305(void) { if (crypto_chacha20_poly1305) { return crypto_chacha20_poly1305; @@ -132,6 +157,7 @@ static const EVP_CIPHER *crypto_aead_chacha20_poly1305(void) { return EVP_chacha20_poly1305(); } +#endif /* !defined(NGTCP2_NO_CHACHA_POLY1305) */ static const EVP_CIPHER *crypto_aead_aes_128_ccm(void) { if (crypto_aes_128_ccm) { @@ -141,22 +167,23 @@ static const EVP_CIPHER *crypto_aead_aes_128_ccm(void) { return EVP_aes_128_ccm(); } -static const EVP_CIPHER *crypto_cipher_aes_128_ctr(void) { - if (crypto_aes_128_ctr) { - return crypto_aes_128_ctr; +static const EVP_CIPHER *crypto_cipher_aes_128_ecb(void) { + if (crypto_aes_128_ecb) { + return crypto_aes_128_ecb; } - return EVP_aes_128_ctr(); + return EVP_aes_128_ecb(); } -static const EVP_CIPHER *crypto_cipher_aes_256_ctr(void) { - if (crypto_aes_256_ctr) { - return crypto_aes_256_ctr; +static const EVP_CIPHER *crypto_cipher_aes_256_ecb(void) { + if (crypto_aes_256_ecb) { + return crypto_aes_256_ecb; } - return EVP_aes_256_ctr(); + return EVP_aes_256_ecb(); } +#ifndef NGTCP2_NO_CHACHA_POLY1305 static const EVP_CIPHER *crypto_cipher_chacha20(void) { if (crypto_chacha20) { return crypto_chacha20; @@ -164,6 +191,7 @@ static const EVP_CIPHER *crypto_cipher_chacha20(void) { return EVP_chacha20(); } +#endif /* !defined(NGTCP2_NO_CHACHA_POLY1305) */ static const EVP_MD *crypto_md_sha256(void) { if (crypto_sha256) { @@ -189,13 +217,21 @@ static EVP_KDF *crypto_kdf_hkdf(void) { return EVP_KDF_fetch(NULL, "hkdf", NULL); } +static void crypto_kdf_hkdf_free(EVP_KDF *kdf) { + if (kdf && crypto_hkdf != kdf) { + EVP_KDF_free(kdf); + } +} + static size_t crypto_aead_max_overhead(const EVP_CIPHER *aead) { switch (EVP_CIPHER_nid(aead)) { case NID_aes_128_gcm: case NID_aes_256_gcm: return EVP_GCM_TLS_TAG_LEN; +#ifndef NGTCP2_NO_CHACHA_POLY1305 case NID_chacha20_poly1305: return EVP_CHACHAPOLY_TLS_TAG_LEN; +#endif /* !defined(NGTCP2_NO_CHACHA_POLY1305) */ case NID_aes_128_ccm: return EVP_CCM_TLS_TAG_LEN; default: @@ -216,7 +252,7 @@ ngtcp2_crypto_md *ngtcp2_crypto_md_sha256(ngtcp2_crypto_md *md) { ngtcp2_crypto_ctx *ngtcp2_crypto_ctx_initial(ngtcp2_crypto_ctx *ctx) { ngtcp2_crypto_aead_init(&ctx->aead, (void *)crypto_aead_aes_128_gcm()); ctx->md.native_handle = (void *)crypto_md_sha256(); - ctx->hp.native_handle = (void *)crypto_cipher_aes_128_ctr(); + ctx->hp.native_handle = (void *)crypto_cipher_aes_128_ecb(); ctx->max_encryption = 0; ctx->max_decryption_failure = 0; return ctx; @@ -239,8 +275,10 @@ static const EVP_CIPHER *crypto_cipher_id_get_aead(uint32_t cipher_id) { return crypto_aead_aes_128_gcm(); case TLS1_3_CK_AES_256_GCM_SHA384: return crypto_aead_aes_256_gcm(); +#ifndef NGTCP2_NO_CHACHA_POLY1305 case TLS1_3_CK_CHACHA20_POLY1305_SHA256: return crypto_aead_chacha20_poly1305(); +#endif /* !defined(NGTCP2_NO_CHACHA_POLY1305) */ case TLS1_3_CK_AES_128_CCM_SHA256: return crypto_aead_aes_128_ccm(); default: @@ -253,8 +291,10 @@ static uint64_t crypto_cipher_id_get_aead_max_encryption(uint32_t cipher_id) { case TLS1_3_CK_AES_128_GCM_SHA256: case TLS1_3_CK_AES_256_GCM_SHA384: return NGTCP2_CRYPTO_MAX_ENCRYPTION_AES_GCM; +#ifndef NGTCP2_NO_CHACHA_POLY1305 case TLS1_3_CK_CHACHA20_POLY1305_SHA256: return NGTCP2_CRYPTO_MAX_ENCRYPTION_CHACHA20_POLY1305; +#endif /* !defined(NGTCP2_NO_CHACHA_POLY1305) */ case TLS1_3_CK_AES_128_CCM_SHA256: return NGTCP2_CRYPTO_MAX_ENCRYPTION_AES_CCM; default: @@ -268,8 +308,10 @@ crypto_cipher_id_get_aead_max_decryption_failure(uint32_t cipher_id) { case TLS1_3_CK_AES_128_GCM_SHA256: case TLS1_3_CK_AES_256_GCM_SHA384: return NGTCP2_CRYPTO_MAX_DECRYPTION_FAILURE_AES_GCM; +#ifndef NGTCP2_NO_CHACHA_POLY1305 case TLS1_3_CK_CHACHA20_POLY1305_SHA256: return NGTCP2_CRYPTO_MAX_DECRYPTION_FAILURE_CHACHA20_POLY1305; +#endif /* !defined(NGTCP2_NO_CHACHA_POLY1305) */ case TLS1_3_CK_AES_128_CCM_SHA256: return NGTCP2_CRYPTO_MAX_DECRYPTION_FAILURE_AES_CCM; default: @@ -281,11 +323,13 @@ static const EVP_CIPHER *crypto_cipher_id_get_hp(uint32_t cipher_id) { switch (cipher_id) { case TLS1_3_CK_AES_128_GCM_SHA256: case TLS1_3_CK_AES_128_CCM_SHA256: - return crypto_cipher_aes_128_ctr(); + return crypto_cipher_aes_128_ecb(); case TLS1_3_CK_AES_256_GCM_SHA384: - return crypto_cipher_aes_256_ctr(); + return crypto_cipher_aes_256_ecb(); +#ifndef NGTCP2_NO_CHACHA_POLY1305 case TLS1_3_CK_CHACHA20_POLY1305_SHA256: return crypto_cipher_chacha20(); +#endif /* !defined(NGTCP2_NO_CHACHA_POLY1305) */ default: return NULL; } @@ -294,7 +338,9 @@ static const EVP_CIPHER *crypto_cipher_id_get_hp(uint32_t cipher_id) { static const EVP_MD *crypto_cipher_id_get_md(uint32_t cipher_id) { switch (cipher_id) { case TLS1_3_CK_AES_128_GCM_SHA256: +#ifndef NGTCP2_NO_CHACHA_POLY1305 case TLS1_3_CK_CHACHA20_POLY1305_SHA256: +#endif /* !defined(NGTCP2_NO_CHACHA_POLY1305) */ case TLS1_3_CK_AES_128_CCM_SHA256: return crypto_md_sha256(); case TLS1_3_CK_AES_256_GCM_SHA384: @@ -308,7 +354,9 @@ static int supported_cipher_id(uint32_t cipher_id) { switch (cipher_id) { case TLS1_3_CK_AES_128_GCM_SHA256: case TLS1_3_CK_AES_256_GCM_SHA384: +#ifndef NGTCP2_NO_CHACHA_POLY1305 case TLS1_3_CK_CHACHA20_POLY1305_SHA256: +#endif /* !defined(NGTCP2_NO_CHACHA_POLY1305) */ case TLS1_3_CK_AES_128_CCM_SHA256: return 1; default: @@ -446,7 +494,7 @@ static int crypto_ossl_ctx_write_crypto_data(ngtcp2_crypto_ossl_ctx *ossl_ctx, left = crypto_buf_left(ossl_ctx->crypto_write); } - n = ngtcp2_min_size((size_t)(end - data), left); + n = ngtcp2_min((size_t)(end - data), left); crypto_buf_write(ossl_ctx->crypto_write, data, n); data += n; } @@ -682,8 +730,8 @@ int ngtcp2_crypto_hkdf_extract(uint8_t *dest, const ngtcp2_crypto_md *md, const uint8_t *secret, size_t secretlen, const uint8_t *salt, size_t saltlen) { const EVP_MD *prf = md->native_handle; - EVP_KDF *kdf = crypto_kdf_hkdf(); - EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); + EVP_KDF *kdf; + EVP_KDF_CTX *kctx; int mode = EVP_KDF_HKDF_MODE_EXTRACT_ONLY; OSSL_PARAM params[] = { OSSL_PARAM_construct_int(OSSL_KDF_PARAM_MODE, &mode), @@ -697,8 +745,15 @@ int ngtcp2_crypto_hkdf_extract(uint8_t *dest, const ngtcp2_crypto_md *md, }; int rv = 0; - if (!crypto_initialized) { - EVP_KDF_free(kdf); + kdf = crypto_kdf_hkdf(); + if (!kdf) { + return -1; + } + + kctx = EVP_KDF_CTX_new(kdf); + if (!kctx) { + rv = -1; + goto fail_kdf_ctx_new; } if (EVP_KDF_derive(kctx, dest, (size_t)EVP_MD_size(prf), params) <= 0) { @@ -706,6 +761,8 @@ int ngtcp2_crypto_hkdf_extract(uint8_t *dest, const ngtcp2_crypto_md *md, } EVP_KDF_CTX_free(kctx); +fail_kdf_ctx_new: + crypto_kdf_hkdf_free(kdf); return rv; } @@ -715,8 +772,8 @@ int ngtcp2_crypto_hkdf_expand(uint8_t *dest, size_t destlen, size_t secretlen, const uint8_t *info, size_t infolen) { const EVP_MD *prf = md->native_handle; - EVP_KDF *kdf = crypto_kdf_hkdf(); - EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); + EVP_KDF *kdf; + EVP_KDF_CTX *kctx; int mode = EVP_KDF_HKDF_MODE_EXPAND_ONLY; OSSL_PARAM params[] = { OSSL_PARAM_construct_int(OSSL_KDF_PARAM_MODE, &mode), @@ -730,8 +787,15 @@ int ngtcp2_crypto_hkdf_expand(uint8_t *dest, size_t destlen, }; int rv = 0; - if (!crypto_initialized) { - EVP_KDF_free(kdf); + kdf = crypto_kdf_hkdf(); + if (!kdf) { + return -1; + } + + kctx = EVP_KDF_CTX_new(kdf); + if (!kctx) { + rv = -1; + goto fail_kdf_ctx_new; } if (EVP_KDF_derive(kctx, dest, destlen, params) <= 0) { @@ -739,6 +803,8 @@ int ngtcp2_crypto_hkdf_expand(uint8_t *dest, size_t destlen, } EVP_KDF_CTX_free(kctx); +fail_kdf_ctx_new: + crypto_kdf_hkdf_free(kdf); return rv; } @@ -748,8 +814,8 @@ int ngtcp2_crypto_hkdf(uint8_t *dest, size_t destlen, size_t secretlen, const uint8_t *salt, size_t saltlen, const uint8_t *info, size_t infolen) { const EVP_MD *prf = md->native_handle; - EVP_KDF *kdf = crypto_kdf_hkdf(); - EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); + EVP_KDF *kdf; + EVP_KDF_CTX *kctx; OSSL_PARAM params[] = { OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, (char *)EVP_MD_get0_name(prf), 0), @@ -763,8 +829,15 @@ int ngtcp2_crypto_hkdf(uint8_t *dest, size_t destlen, }; int rv = 0; - if (!crypto_initialized) { - EVP_KDF_free(kdf); + kdf = crypto_kdf_hkdf(); + if (!kdf) { + return -1; + } + + kctx = EVP_KDF_CTX_new(kdf); + if (!kctx) { + rv = -1; + goto fail_kdf_ctx_new; } if (EVP_KDF_derive(kctx, dest, destlen, params) <= 0) { @@ -772,6 +845,8 @@ int ngtcp2_crypto_hkdf(uint8_t *dest, size_t destlen, } EVP_KDF_CTX_free(kctx); +fail_kdf_ctx_new: + crypto_kdf_hkdf_free(kdf); return rv; } @@ -850,16 +925,31 @@ int ngtcp2_crypto_decrypt(uint8_t *dest, const ngtcp2_crypto_aead *aead, int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, const ngtcp2_crypto_cipher_ctx *hp_ctx, const uint8_t *sample) { - static const uint8_t PLAINTEXT[] = "\x00\x00\x00\x00\x00"; + static const uint8_t PLAINTEXT[16] = {0}; EVP_CIPHER_CTX *actx = hp_ctx->native_handle; int len; (void)hp; - if (!EVP_EncryptInit_ex(actx, NULL, NULL, NULL, sample) || - !EVP_EncryptUpdate(actx, dest, &len, PLAINTEXT, sizeof(PLAINTEXT) - 1) || - !EVP_EncryptFinal_ex(actx, dest + sizeof(PLAINTEXT) - 1, &len)) { - return -1; + switch (EVP_CIPHER_CTX_nid(actx)) { + case NID_aes_128_ecb: + case NID_aes_256_ecb: + if (!EVP_EncryptUpdate(actx, dest, &len, sample, NGTCP2_HP_SAMPLELEN)) { + return -1; + } + + break; + case NID_chacha20: + if (!EVP_EncryptInit_ex(actx, NULL, NULL, NULL, sample) || + !EVP_EncryptUpdate(actx, dest, &len, PLAINTEXT, sizeof(PLAINTEXT)) || + !EVP_EncryptFinal_ex(actx, dest + sizeof(PLAINTEXT), &len)) { + return -1; + } + + break; + default: + assert(0); + abort(); } return 0; @@ -868,7 +958,7 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, int ngtcp2_crypto_read_write_crypto_data( ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, const uint8_t *data, size_t datalen) { - ngtcp2_crypto_ossl_ctx *ossl_ctx = ngtcp2_conn_get_tls_native_handle(conn); + ngtcp2_crypto_ossl_ctx *ossl_ctx = ngtcp2_conn_get_tls_native_handle2(conn); SSL *ssl = ossl_ctx->ssl; int rv; int err; @@ -878,7 +968,7 @@ int ngtcp2_crypto_read_write_crypto_data( return -1; } - if (!ngtcp2_conn_get_handshake_completed(conn)) { + if (!ngtcp2_conn_get_handshake_completed2(conn)) { rv = SSL_do_handshake(ssl); if (rv <= 0) { err = SSL_get_error(ssl, rv); @@ -994,6 +1084,19 @@ int ngtcp2_crypto_get_path_challenge_data_cb(ngtcp2_conn *conn, uint8_t *data, return 0; } +int ngtcp2_crypto_get_path_challenge_data2_cb(ngtcp2_conn *conn, + ngtcp2_path_challenge_data *data, + void *user_data) { + (void)conn; + (void)user_data; + + if (RAND_bytes(data->data, NGTCP2_PATH_CHALLENGE_DATALEN) != 1) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} + int ngtcp2_crypto_random(uint8_t *data, size_t datalen) { if (RAND_bytes(data, (int)datalen) != 1) { return -1; @@ -1017,7 +1120,7 @@ static int ossl_yield_secret(SSL *ssl, uint32_t ossl_level, int direction, } conn = conn_ref->get_conn(conn_ref); - ossl_ctx = ngtcp2_conn_get_tls_native_handle(conn); + ossl_ctx = ngtcp2_conn_get_tls_native_handle2(conn); if (direction) { if (ngtcp2_crypto_derive_and_install_tx_key(conn, NULL, NULL, NULL, level, @@ -1051,7 +1154,7 @@ static int ossl_crypto_send(SSL *ssl, const unsigned char *buf, size_t buflen, } conn = conn_ref->get_conn(conn_ref); - ossl_ctx = ngtcp2_conn_get_tls_native_handle(conn); + ossl_ctx = ngtcp2_conn_get_tls_native_handle2(conn); rv = ngtcp2_conn_submit_crypto_data(conn, ossl_ctx->tx_level, buf, buflen); if (rv != 0) { @@ -1078,7 +1181,7 @@ static int ossl_crypto_recv_rcd(SSL *ssl, const unsigned char **buf, } conn = conn_ref->get_conn(conn_ref); - ossl_ctx = ngtcp2_conn_get_tls_native_handle(conn); + ossl_ctx = ngtcp2_conn_get_tls_native_handle2(conn); crypto_ossl_ctx_read_crypto_data(ossl_ctx, buf, bytes_read); @@ -1100,7 +1203,7 @@ static int ossl_crypto_release_rcd(SSL *ssl, size_t released, void *arg) { } conn = conn_ref->get_conn(conn_ref); - ossl_ctx = ngtcp2_conn_get_tls_native_handle(conn); + ossl_ctx = ngtcp2_conn_get_tls_native_handle2(conn); crypto_ossl_ctx_release_crypto_data(ossl_ctx, released); diff --git a/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c b/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c index 98ebf9e876c0..af934bf10463 100644 --- a/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c +++ b/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c @@ -35,6 +35,7 @@ #include #include +#include "ngtcp2_macro.h" #include "shared.h" ngtcp2_crypto_aead *ngtcp2_crypto_aead_aes_128_gcm(ngtcp2_crypto_aead *aead) { @@ -49,7 +50,7 @@ ngtcp2_crypto_md *ngtcp2_crypto_md_sha256(ngtcp2_crypto_md *md) { ngtcp2_crypto_ctx *ngtcp2_crypto_ctx_initial(ngtcp2_crypto_ctx *ctx) { ngtcp2_crypto_aead_init(&ctx->aead, (void *)&ptls_openssl_aes128gcm); ctx->md.native_handle = (void *)&ptls_openssl_sha256; - ctx->hp.native_handle = (void *)&ptls_openssl_aes128ctr; + ctx->hp.native_handle = (void *)&ptls_openssl_aes128ecb; ctx->max_encryption = 0; ctx->max_decryption_failure = 0; return ctx; @@ -103,11 +104,11 @@ crypto_cipher_suite_get_aead_max_decryption_failure(ptls_cipher_suite_t *cs) { static const ptls_cipher_algorithm_t * crypto_cipher_suite_get_hp(ptls_cipher_suite_t *cs) { if (cs->aead == &ptls_openssl_aes128gcm) { - return &ptls_openssl_aes128ctr; + return &ptls_openssl_aes128ecb; } if (cs->aead == &ptls_openssl_aes256gcm) { - return &ptls_openssl_aes256ctr; + return &ptls_openssl_aes256ecb; } #ifdef PTLS_OPENSSL_HAVE_CHACHA20_POLY1305 @@ -237,6 +238,11 @@ int ngtcp2_crypto_cipher_ctx_encrypt_init(ngtcp2_crypto_cipher_ctx *cipher_ctx, return -1; } + if (cipher->native_handle == &ptls_openssl_aes128ecb || + cipher->native_handle == &ptls_openssl_aes256ecb) { + ptls_cipher_init(actx, NULL); + } + cipher_ctx->native_handle = actx; return 0; @@ -351,13 +357,20 @@ int ngtcp2_crypto_decrypt(uint8_t *dest, const ngtcp2_crypto_aead *aead, int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, const ngtcp2_crypto_cipher_ctx *hp_ctx, const uint8_t *sample) { + static const uint8_t PLAINTEXT[16] = {0}; ptls_cipher_context_t *actx = hp_ctx->native_handle; - static const uint8_t PLAINTEXT[] = "\x00\x00\x00\x00\x00"; (void)hp; + if (hp->native_handle == &ptls_openssl_aes128ecb || + hp->native_handle == &ptls_openssl_aes256ecb) { + ptls_cipher_encrypt(actx, dest, sample, NGTCP2_HP_SAMPLELEN); + + return 0; + } + ptls_cipher_init(actx, sample); - ptls_cipher_encrypt(actx, dest, PLAINTEXT, sizeof(PLAINTEXT) - 1); + ptls_cipher_encrypt(actx, dest, PLAINTEXT, sizeof(PLAINTEXT)); return 0; } @@ -365,7 +378,7 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, int ngtcp2_crypto_read_write_crypto_data( ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, const uint8_t *data, size_t datalen) { - ngtcp2_crypto_picotls_ctx *cptls = ngtcp2_conn_get_tls_native_handle(conn); + ngtcp2_crypto_picotls_ctx *cptls = ngtcp2_conn_get_tls_native_handle2(conn); ptls_buffer_t sendbuf; size_t epoch_offsets[5] = {0}; size_t epoch = @@ -376,7 +389,7 @@ int ngtcp2_crypto_read_write_crypto_data( ptls_buffer_init(&sendbuf, (void *)"", 0); - assert(epoch == ptls_get_read_epoch(cptls->ptls)); + assert(datalen == 0 || epoch == ptls_get_read_epoch(cptls->ptls)); rv = ptls_handle_message(cptls->ptls, &sendbuf, epoch_offsets, epoch, data, datalen, &cptls->handshake_properties); @@ -389,7 +402,7 @@ int ngtcp2_crypto_read_write_crypto_data( goto fin; } - if (!ngtcp2_conn_is_server(conn) && + if (!ngtcp2_conn_is_server2(conn) && cptls->handshake_properties.client.early_data_acceptance == PTLS_EARLY_DATA_REJECTED) { rv = ngtcp2_conn_tls_early_data_rejected(conn); @@ -492,6 +505,17 @@ int ngtcp2_crypto_get_path_challenge_data_cb(ngtcp2_conn *conn, uint8_t *data, return 0; } +int ngtcp2_crypto_get_path_challenge_data2_cb(ngtcp2_conn *conn, + ngtcp2_path_challenge_data *data, + void *user_data) { + (void)conn; + (void)user_data; + + ptls_openssl_random_bytes(data->data, NGTCP2_PATH_CHALLENGE_DATALEN); + + return 0; +} + int ngtcp2_crypto_random(uint8_t *data, size_t datalen) { ptls_openssl_random_bytes(data, datalen); @@ -499,8 +523,7 @@ int ngtcp2_crypto_random(uint8_t *data, size_t datalen) { } void ngtcp2_crypto_picotls_ctx_init(ngtcp2_crypto_picotls_ctx *cptls) { - cptls->ptls = NULL; - memset(&cptls->handshake_properties, 0, sizeof(cptls->handshake_properties)); + *cptls = (ngtcp2_crypto_picotls_ctx){0}; } static int set_additional_extensions(ptls_handshake_properties_t *hsprops, @@ -517,7 +540,7 @@ static int set_additional_extensions(ptls_handshake_properties_t *hsprops, return -1; } - nwrite = ngtcp2_conn_encode_local_transport_params(conn, buf, buflen); + nwrite = ngtcp2_conn_encode_local_transport_params2(conn, buf, buflen); if (nwrite < 0) { goto fail; } @@ -597,7 +620,7 @@ static int update_traffic_key_server_cb(ptls_update_traffic_key_t *self, * wait for the key to get the correct local transport * parameters from ngtcp2_conn. */ - cptls = ngtcp2_conn_get_tls_native_handle(conn); + cptls = ngtcp2_conn_get_tls_native_handle2(conn); if (set_additional_extensions(&cptls->handshake_properties, conn) != 0) { return -1; diff --git a/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c b/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c index 592e5a865353..5768c7c2e606 100644 --- a/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c +++ b/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c @@ -40,73 +40,35 @@ # include #endif /* OPENSSL_VERSION_NUMBER >= 0x30000000L */ +#include "ngtcp2_macro.h" #include "shared.h" #if OPENSSL_VERSION_NUMBER >= 0x30000000L -static int crypto_initialized; static EVP_CIPHER *crypto_aes_128_gcm; static EVP_CIPHER *crypto_aes_256_gcm; static EVP_CIPHER *crypto_chacha20_poly1305; static EVP_CIPHER *crypto_aes_128_ccm; -static EVP_CIPHER *crypto_aes_128_ctr; -static EVP_CIPHER *crypto_aes_256_ctr; +static EVP_CIPHER *crypto_aes_128_ecb; +static EVP_CIPHER *crypto_aes_256_ecb; static EVP_CIPHER *crypto_chacha20; static EVP_MD *crypto_sha256; static EVP_MD *crypto_sha384; static EVP_KDF *crypto_hkdf; int ngtcp2_crypto_quictls_init(void) { + /* We do not care whether the pre-fetch succeeds or not. If it + fails, it returns NULL, which is still the default value, and our + code should still work with it. */ crypto_aes_128_gcm = EVP_CIPHER_fetch(NULL, "AES-128-GCM", NULL); - if (crypto_aes_128_gcm == NULL) { - return -1; - } - crypto_aes_256_gcm = EVP_CIPHER_fetch(NULL, "AES-256-GCM", NULL); - if (crypto_aes_256_gcm == NULL) { - return -1; - } - crypto_chacha20_poly1305 = EVP_CIPHER_fetch(NULL, "ChaCha20-Poly1305", NULL); - if (crypto_chacha20_poly1305 == NULL) { - return -1; - } - crypto_aes_128_ccm = EVP_CIPHER_fetch(NULL, "AES-128-CCM", NULL); - if (crypto_aes_128_ccm == NULL) { - return -1; - } - - crypto_aes_128_ctr = EVP_CIPHER_fetch(NULL, "AES-128-CTR", NULL); - if (crypto_aes_128_ctr == NULL) { - return -1; - } - - crypto_aes_256_ctr = EVP_CIPHER_fetch(NULL, "AES-256-CTR", NULL); - if (crypto_aes_256_ctr == NULL) { - return -1; - } - + crypto_aes_128_ecb = EVP_CIPHER_fetch(NULL, "AES-128-ECB", NULL); + crypto_aes_256_ecb = EVP_CIPHER_fetch(NULL, "AES-256-ECB", NULL); crypto_chacha20 = EVP_CIPHER_fetch(NULL, "ChaCha20", NULL); - if (crypto_chacha20 == NULL) { - return -1; - } - crypto_sha256 = EVP_MD_fetch(NULL, "sha256", NULL); - if (crypto_sha256 == NULL) { - return -1; - } - crypto_sha384 = EVP_MD_fetch(NULL, "sha384", NULL); - if (crypto_sha384 == NULL) { - return -1; - } - crypto_hkdf = EVP_KDF_fetch(NULL, "hkdf", NULL); - if (crypto_hkdf == NULL) { - return -1; - } - - crypto_initialized = 1; return 0; } @@ -143,20 +105,20 @@ static const EVP_CIPHER *crypto_aead_aes_128_ccm(void) { return EVP_aes_128_ccm(); } -static const EVP_CIPHER *crypto_cipher_aes_128_ctr(void) { - if (crypto_aes_128_ctr) { - return crypto_aes_128_ctr; +static const EVP_CIPHER *crypto_cipher_aes_128_ecb(void) { + if (crypto_aes_128_ecb) { + return crypto_aes_128_ecb; } - return EVP_aes_128_ctr(); + return EVP_aes_128_ecb(); } -static const EVP_CIPHER *crypto_cipher_aes_256_ctr(void) { - if (crypto_aes_256_ctr) { - return crypto_aes_256_ctr; +static const EVP_CIPHER *crypto_cipher_aes_256_ecb(void) { + if (crypto_aes_256_ecb) { + return crypto_aes_256_ecb; } - return EVP_aes_256_ctr(); + return EVP_aes_256_ecb(); } static const EVP_CIPHER *crypto_cipher_chacha20(void) { @@ -190,13 +152,19 @@ static EVP_KDF *crypto_kdf_hkdf(void) { return EVP_KDF_fetch(NULL, "hkdf", NULL); } + +static void crypto_kdf_hkdf_free(EVP_KDF *kdf) { + if (kdf && crypto_hkdf != kdf) { + EVP_KDF_free(kdf); + } +} #else /* !(OPENSSL_VERSION_NUMBER >= 0x30000000L) */ # define crypto_aead_aes_128_gcm EVP_aes_128_gcm # define crypto_aead_aes_256_gcm EVP_aes_256_gcm # define crypto_aead_chacha20_poly1305 EVP_chacha20_poly1305 # define crypto_aead_aes_128_ccm EVP_aes_128_ccm -# define crypto_cipher_aes_128_ctr EVP_aes_128_ctr -# define crypto_cipher_aes_256_ctr EVP_aes_256_ctr +# define crypto_cipher_aes_128_ecb EVP_aes_128_ecb +# define crypto_cipher_aes_256_ecb EVP_aes_256_ecb # define crypto_cipher_chacha20 EVP_chacha20 # define crypto_md_sha256 EVP_sha256 # define crypto_md_sha384 EVP_sha384 @@ -231,7 +199,7 @@ ngtcp2_crypto_md *ngtcp2_crypto_md_sha256(ngtcp2_crypto_md *md) { ngtcp2_crypto_ctx *ngtcp2_crypto_ctx_initial(ngtcp2_crypto_ctx *ctx) { ngtcp2_crypto_aead_init(&ctx->aead, (void *)crypto_aead_aes_128_gcm()); ctx->md.native_handle = (void *)crypto_md_sha256(); - ctx->hp.native_handle = (void *)crypto_cipher_aes_128_ctr(); + ctx->hp.native_handle = (void *)crypto_cipher_aes_128_ecb(); ctx->max_encryption = 0; ctx->max_decryption_failure = 0; return ctx; @@ -296,9 +264,9 @@ static const EVP_CIPHER *crypto_cipher_id_get_hp(uint32_t cipher_id) { switch (cipher_id) { case TLS1_3_CK_AES_128_GCM_SHA256: case TLS1_3_CK_AES_128_CCM_SHA256: - return crypto_cipher_aes_128_ctr(); + return crypto_cipher_aes_128_ecb(); case TLS1_3_CK_AES_256_GCM_SHA384: - return crypto_cipher_aes_256_ctr(); + return crypto_cipher_aes_256_ecb(); case TLS1_3_CK_CHACHA20_POLY1305_SHA256: return crypto_cipher_chacha20(); default: @@ -523,8 +491,8 @@ int ngtcp2_crypto_hkdf_extract(uint8_t *dest, const ngtcp2_crypto_md *md, const uint8_t *salt, size_t saltlen) { #if OPENSSL_VERSION_NUMBER >= 0x30000000L const EVP_MD *prf = md->native_handle; - EVP_KDF *kdf = crypto_kdf_hkdf(); - EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); + EVP_KDF *kdf; + EVP_KDF_CTX *kctx; int mode = EVP_KDF_HKDF_MODE_EXTRACT_ONLY; OSSL_PARAM params[] = { OSSL_PARAM_construct_int(OSSL_KDF_PARAM_MODE, &mode), @@ -538,8 +506,15 @@ int ngtcp2_crypto_hkdf_extract(uint8_t *dest, const ngtcp2_crypto_md *md, }; int rv = 0; - if (!crypto_initialized) { - EVP_KDF_free(kdf); + kdf = crypto_kdf_hkdf(); + if (!kdf) { + return -1; + } + + kctx = EVP_KDF_CTX_new(kdf); + if (!kctx) { + rv = -1; + goto fail_kdf_ctx_new; } if (EVP_KDF_derive(kctx, dest, (size_t)EVP_MD_size(prf), params) <= 0) { @@ -547,6 +522,8 @@ int ngtcp2_crypto_hkdf_extract(uint8_t *dest, const ngtcp2_crypto_md *md, } EVP_KDF_CTX_free(kctx); +fail_kdf_ctx_new: + crypto_kdf_hkdf_free(kdf); return rv; #else /* !(OPENSSL_VERSION_NUMBER >= 0x30000000L) */ @@ -580,8 +557,8 @@ int ngtcp2_crypto_hkdf_expand(uint8_t *dest, size_t destlen, size_t infolen) { #if OPENSSL_VERSION_NUMBER >= 0x30000000L const EVP_MD *prf = md->native_handle; - EVP_KDF *kdf = crypto_kdf_hkdf(); - EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); + EVP_KDF *kdf; + EVP_KDF_CTX *kctx; int mode = EVP_KDF_HKDF_MODE_EXPAND_ONLY; OSSL_PARAM params[] = { OSSL_PARAM_construct_int(OSSL_KDF_PARAM_MODE, &mode), @@ -595,8 +572,15 @@ int ngtcp2_crypto_hkdf_expand(uint8_t *dest, size_t destlen, }; int rv = 0; - if (!crypto_initialized) { - EVP_KDF_free(kdf); + kdf = crypto_kdf_hkdf(); + if (!kdf) { + return -1; + } + + kctx = EVP_KDF_CTX_new(kdf); + if (!kctx) { + rv = -1; + goto fail_kdf_ctx_new; } if (EVP_KDF_derive(kctx, dest, destlen, params) <= 0) { @@ -604,6 +588,8 @@ int ngtcp2_crypto_hkdf_expand(uint8_t *dest, size_t destlen, } EVP_KDF_CTX_free(kctx); +fail_kdf_ctx_new: + crypto_kdf_hkdf_free(kdf); return rv; #else /* !(OPENSSL_VERSION_NUMBER >= 0x30000000L) */ @@ -636,8 +622,8 @@ int ngtcp2_crypto_hkdf(uint8_t *dest, size_t destlen, const uint8_t *info, size_t infolen) { #if OPENSSL_VERSION_NUMBER >= 0x30000000L const EVP_MD *prf = md->native_handle; - EVP_KDF *kdf = crypto_kdf_hkdf(); - EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); + EVP_KDF *kdf; + EVP_KDF_CTX *kctx; OSSL_PARAM params[] = { OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, (char *)EVP_MD_get0_name(prf), 0), @@ -651,8 +637,15 @@ int ngtcp2_crypto_hkdf(uint8_t *dest, size_t destlen, }; int rv = 0; - if (!crypto_initialized) { - EVP_KDF_free(kdf); + kdf = crypto_kdf_hkdf(); + if (!kdf) { + return -1; + } + + kctx = EVP_KDF_CTX_new(kdf); + if (!kctx) { + rv = -1; + goto fail_kdf_ctx_new; } if (EVP_KDF_derive(kctx, dest, destlen, params) <= 0) { @@ -660,6 +653,8 @@ int ngtcp2_crypto_hkdf(uint8_t *dest, size_t destlen, } EVP_KDF_CTX_free(kctx); +fail_kdf_ctx_new: + crypto_kdf_hkdf_free(kdf); return rv; #else /* !(OPENSSL_VERSION_NUMBER >= 0x30000000L) */ @@ -778,16 +773,31 @@ int ngtcp2_crypto_decrypt(uint8_t *dest, const ngtcp2_crypto_aead *aead, int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, const ngtcp2_crypto_cipher_ctx *hp_ctx, const uint8_t *sample) { - static const uint8_t PLAINTEXT[] = "\x00\x00\x00\x00\x00"; + static const uint8_t PLAINTEXT[16] = {0}; EVP_CIPHER_CTX *actx = hp_ctx->native_handle; int len; (void)hp; - if (!EVP_EncryptInit_ex(actx, NULL, NULL, NULL, sample) || - !EVP_EncryptUpdate(actx, dest, &len, PLAINTEXT, sizeof(PLAINTEXT) - 1) || - !EVP_EncryptFinal_ex(actx, dest + sizeof(PLAINTEXT) - 1, &len)) { - return -1; + switch (EVP_CIPHER_CTX_nid(actx)) { + case NID_aes_128_ecb: + case NID_aes_256_ecb: + if (!EVP_EncryptUpdate(actx, dest, &len, sample, NGTCP2_HP_SAMPLELEN)) { + return -1; + } + + break; + case NID_chacha20: + if (!EVP_EncryptInit_ex(actx, NULL, NULL, NULL, sample) || + !EVP_EncryptUpdate(actx, dest, &len, PLAINTEXT, sizeof(PLAINTEXT)) || + !EVP_EncryptFinal_ex(actx, dest + sizeof(PLAINTEXT), &len)) { + return -1; + } + + break; + default: + assert(0); + abort(); } return 0; @@ -796,18 +806,19 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, int ngtcp2_crypto_read_write_crypto_data( ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, const uint8_t *data, size_t datalen) { - SSL *ssl = ngtcp2_conn_get_tls_native_handle(conn); + SSL *ssl = ngtcp2_conn_get_tls_native_handle2(conn); int rv; int err; - if (SSL_provide_quic_data( + if (datalen && + SSL_provide_quic_data( ssl, ngtcp2_crypto_quictls_from_ngtcp2_encryption_level(encryption_level), data, datalen) != 1) { return -1; } - if (!ngtcp2_conn_get_handshake_completed(conn)) { + if (!ngtcp2_conn_get_handshake_completed2(conn)) { rv = SSL_do_handshake(ssl); if (rv <= 0) { err = SSL_get_error(ssl, rv); @@ -920,6 +931,19 @@ int ngtcp2_crypto_get_path_challenge_data_cb(ngtcp2_conn *conn, uint8_t *data, return 0; } +int ngtcp2_crypto_get_path_challenge_data2_cb(ngtcp2_conn *conn, + ngtcp2_path_challenge_data *data, + void *user_data) { + (void)conn; + (void)user_data; + + if (RAND_bytes(data->data, NGTCP2_PATH_CHALLENGE_DATALEN) != 1) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} + int ngtcp2_crypto_random(uint8_t *data, size_t datalen) { if (RAND_bytes(data, (int)datalen) != 1) { return -1; diff --git a/deps/ngtcp2/ngtcp2/crypto/shared.c b/deps/ngtcp2/ngtcp2/crypto/shared.c index 98cd4de7e809..925461e23978 100644 --- a/deps/ngtcp2/ngtcp2/crypto/shared.c +++ b/deps/ngtcp2/ngtcp2/crypto/shared.c @@ -37,6 +37,22 @@ #include "ngtcp2_macro.h" #include "ngtcp2_net.h" +/* + * NGTCP2_INITIAL_SALT_V1 is a salt value which is used to derive + * initial secret. It is used for QUIC v1. + */ +static const uint8_t NGTCP2_INITIAL_SALT_V1[] = { + 0x38, 0x76, 0x2C, 0xF7, 0xF5, 0x59, 0x34, 0xB3, 0x4D, 0x17, + 0x9A, 0xE6, 0xA4, 0xC8, 0x0C, 0xAD, 0xCC, 0xBB, 0x7F, 0x0A}; + +/* + * NGTCP2_INITIAL_SALT_V2 is a salt value which is used to derive + * initial secret. It is used for QUIC v2. + */ +static const uint8_t NGTCP2_INITIAL_SALT_V2[] = { + 0x0D, 0xED, 0xE3, 0xDE, 0xF7, 0x00, 0xA6, 0xDB, 0x81, 0x93, + 0x81, 0xBE, 0x6E, 0x26, 0x9D, 0xCB, 0xF9, 0xBD, 0x2E, 0xD9}; + ngtcp2_crypto_md *ngtcp2_crypto_md_init(ngtcp2_crypto_md *md, void *md_native_handle) { md->native_handle = md_native_handle; @@ -53,9 +69,9 @@ int ngtcp2_crypto_hkdf_expand_label(uint8_t *dest, size_t destlen, *p++ = (uint8_t)(destlen / 256); *p++ = (uint8_t)(destlen % 256); - *p++ = (uint8_t)(sizeof(LABEL) - 1 + labellen); - memcpy(p, LABEL, sizeof(LABEL) - 1); - p += sizeof(LABEL) - 1; + *p++ = (uint8_t)(ngtcp2_strlen_lit(LABEL) + labellen); + memcpy(p, LABEL, ngtcp2_strlen_lit(LABEL)); + p += ngtcp2_strlen_lit(LABEL); memcpy(p, label, labellen); p += labellen; *p++ = 0; @@ -87,12 +103,12 @@ int ngtcp2_crypto_derive_initial_secrets(uint8_t *rx_secret, uint8_t *tx_secret, switch (version) { case NGTCP2_PROTO_VER_V1: default: - salt = (const uint8_t *)NGTCP2_INITIAL_SALT_V1; - saltlen = sizeof(NGTCP2_INITIAL_SALT_V1) - 1; + salt = NGTCP2_INITIAL_SALT_V1; + saltlen = sizeof(NGTCP2_INITIAL_SALT_V1); break; case NGTCP2_PROTO_VER_V2: - salt = (const uint8_t *)NGTCP2_INITIAL_SALT_V2; - saltlen = sizeof(NGTCP2_INITIAL_SALT_V2) - 1; + salt = NGTCP2_INITIAL_SALT_V2; + saltlen = sizeof(NGTCP2_INITIAL_SALT_V2); break; } @@ -111,10 +127,12 @@ int ngtcp2_crypto_derive_initial_secrets(uint8_t *rx_secret, uint8_t *tx_secret, if (ngtcp2_crypto_hkdf_expand_label( client_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, &ctx.md, initial_secret, - NGTCP2_CRYPTO_INITIAL_SECRETLEN, CLABEL, sizeof(CLABEL) - 1) != 0 || + NGTCP2_CRYPTO_INITIAL_SECRETLEN, CLABEL, + ngtcp2_strlen_lit(CLABEL)) != 0 || ngtcp2_crypto_hkdf_expand_label( server_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, &ctx.md, initial_secret, - NGTCP2_CRYPTO_INITIAL_SECRETLEN, SLABEL, sizeof(SLABEL) - 1) != 0) { + NGTCP2_CRYPTO_INITIAL_SECRETLEN, SLABEL, + ngtcp2_strlen_lit(SLABEL)) != 0) { return -1; } @@ -123,7 +141,7 @@ int ngtcp2_crypto_derive_initial_secrets(uint8_t *rx_secret, uint8_t *tx_secret, size_t ngtcp2_crypto_packet_protection_ivlen(const ngtcp2_crypto_aead *aead) { size_t noncelen = ngtcp2_crypto_aead_noncelen(aead); - return ngtcp2_max_size(8, noncelen); + return ngtcp2_max(8, noncelen); } int ngtcp2_crypto_derive_packet_protection_key( @@ -148,38 +166,47 @@ int ngtcp2_crypto_derive_packet_protection_key( switch (version) { case NGTCP2_PROTO_VER_V2: key_label = KEY_LABEL_V2; - key_labellen = sizeof(KEY_LABEL_V2) - 1; + key_labellen = ngtcp2_strlen_lit(KEY_LABEL_V2); iv_label = IV_LABEL_V2; - iv_labellen = sizeof(IV_LABEL_V2) - 1; + iv_labellen = ngtcp2_strlen_lit(IV_LABEL_V2); hp_key_label = HP_KEY_LABEL_V2; - hp_key_labellen = sizeof(HP_KEY_LABEL_V2) - 1; + hp_key_labellen = ngtcp2_strlen_lit(HP_KEY_LABEL_V2); break; default: key_label = KEY_LABEL_V1; - key_labellen = sizeof(KEY_LABEL_V1) - 1; + key_labellen = ngtcp2_strlen_lit(KEY_LABEL_V1); iv_label = IV_LABEL_V1; - iv_labellen = sizeof(IV_LABEL_V1) - 1; + iv_labellen = ngtcp2_strlen_lit(IV_LABEL_V1); hp_key_label = HP_KEY_LABEL_V1; - hp_key_labellen = sizeof(HP_KEY_LABEL_V1) - 1; + hp_key_labellen = ngtcp2_strlen_lit(HP_KEY_LABEL_V1); } if (ngtcp2_crypto_hkdf_expand_label(key, keylen, md, secret, secretlen, key_label, key_labellen) != 0) { - return -1; + goto cleanup; } if (ngtcp2_crypto_hkdf_expand_label(iv, ivlen, md, secret, secretlen, iv_label, iv_labellen) != 0) { - return -1; + goto cleanup; } if (hp_key != NULL && ngtcp2_crypto_hkdf_expand_label(hp_key, keylen, md, secret, secretlen, hp_key_label, hp_key_labellen) != 0) { - return -1; + goto cleanup; } return 0; + +cleanup: + ngtcp2_secure_clear(key, keylen); + + if (hp_key) { + ngtcp2_secure_clear(hp_key, keylen); + } + + return -1; } int ngtcp2_crypto_update_traffic_secret(uint8_t *dest, uint32_t version, @@ -194,11 +221,11 @@ int ngtcp2_crypto_update_traffic_secret(uint8_t *dest, uint32_t version, switch (version) { case NGTCP2_PROTO_VER_V2: label = LABEL_V2; - labellen = sizeof(LABEL_V2) - 1; + labellen = ngtcp2_strlen_lit(LABEL_V2); break; default: label = LABEL; - labellen = sizeof(LABEL) - 1; + labellen = ngtcp2_strlen_lit(LABEL); } if (ngtcp2_crypto_hkdf_expand_label(dest, secretlen, md, secret, secretlen, @@ -220,14 +247,15 @@ int ngtcp2_crypto_derive_and_install_rx_key(ngtcp2_conn *conn, uint8_t *key, const ngtcp2_crypto_cipher *hp; ngtcp2_crypto_aead_ctx aead_ctx = {0}; ngtcp2_crypto_cipher_ctx hp_ctx = {0}; - void *tls = ngtcp2_conn_get_tls_native_handle(conn); + void *tls = ngtcp2_conn_get_tls_native_handle2(conn); uint8_t keybuf[64], ivbuf[64], hp_keybuf[64]; + size_t keylen; size_t ivlen; int rv; ngtcp2_crypto_ctx cctx; uint32_t version; - if (level == NGTCP2_ENCRYPTION_LEVEL_0RTT && !ngtcp2_conn_is_server(conn)) { + if (level == NGTCP2_ENCRYPTION_LEVEL_0RTT && !ngtcp2_conn_is_server2(conn)) { return 0; } @@ -248,12 +276,12 @@ int ngtcp2_crypto_derive_and_install_rx_key(ngtcp2_conn *conn, uint8_t *key, } ngtcp2_conn_set_0rtt_crypto_ctx(conn, &cctx); - ctx = ngtcp2_conn_get_0rtt_crypto_ctx(conn); - version = ngtcp2_conn_get_client_chosen_version(conn); + ctx = ngtcp2_conn_get_0rtt_crypto_ctx2(conn); + version = ngtcp2_conn_get_client_chosen_version2(conn); break; case NGTCP2_ENCRYPTION_LEVEL_HANDSHAKE: - if (ngtcp2_conn_is_server(conn) && - !ngtcp2_conn_get_negotiated_version(conn)) { + if (ngtcp2_conn_is_server2(conn) && + !ngtcp2_conn_get_negotiated_version2(conn)) { rv = ngtcp2_crypto_set_remote_transport_params(conn, tls); if (rv != 0) { return -1; @@ -261,8 +289,8 @@ int ngtcp2_crypto_derive_and_install_rx_key(ngtcp2_conn *conn, uint8_t *key, } /* fall through */ case NGTCP2_ENCRYPTION_LEVEL_1RTT: - ctx = ngtcp2_conn_get_crypto_ctx(conn); - version = ngtcp2_conn_get_negotiated_version(conn); + ctx = ngtcp2_conn_get_crypto_ctx2(conn); + version = ngtcp2_conn_get_negotiated_version2(conn); if (!ctx->aead.native_handle) { if (ngtcp2_crypto_ctx_tls(&cctx, tls) == NULL) { @@ -270,7 +298,7 @@ int ngtcp2_crypto_derive_and_install_rx_key(ngtcp2_conn *conn, uint8_t *key, } ngtcp2_conn_set_crypto_ctx(conn, &cctx); - ctx = ngtcp2_conn_get_crypto_ctx(conn); + ctx = ngtcp2_conn_get_crypto_ctx2(conn); } break; default: @@ -280,6 +308,7 @@ int ngtcp2_crypto_derive_and_install_rx_key(ngtcp2_conn *conn, uint8_t *key, aead = &ctx->aead; md = &ctx->md; hp = &ctx->hp; + keylen = ngtcp2_crypto_aead_keylen(aead); ivlen = ngtcp2_crypto_packet_protection_ivlen(aead); if (ngtcp2_crypto_derive_packet_protection_key(key, iv, hp_key, version, aead, @@ -310,7 +339,7 @@ int ngtcp2_crypto_derive_and_install_rx_key(ngtcp2_conn *conn, uint8_t *key, } break; case NGTCP2_ENCRYPTION_LEVEL_1RTT: - if (!ngtcp2_conn_is_server(conn)) { + if (!ngtcp2_conn_is_server2(conn)) { rv = ngtcp2_crypto_set_remote_transport_params(conn, tls); if (rv != 0) { goto fail; @@ -328,12 +357,21 @@ int ngtcp2_crypto_derive_and_install_rx_key(ngtcp2_conn *conn, uint8_t *key, goto fail; } + /* Clear keys in the stack buffers. */ + ngtcp2_secure_clear(keybuf, keylen); + ngtcp2_secure_clear(hp_keybuf, keylen); + return 0; fail: ngtcp2_crypto_cipher_ctx_free(&hp_ctx); ngtcp2_crypto_aead_ctx_free(&aead_ctx); + /* Clear keys from the given buffers as well as the stack buffers if + used. */ + ngtcp2_secure_clear(key, keylen); + ngtcp2_secure_clear(hp_key, keylen); + return -1; } @@ -347,7 +385,7 @@ static int crypto_set_local_transport_params(ngtcp2_conn *conn, void *tls) { ngtcp2_ssize nwrite; uint8_t buf[256]; - nwrite = ngtcp2_conn_encode_local_transport_params(conn, buf, sizeof(buf)); + nwrite = ngtcp2_conn_encode_local_transport_params2(conn, buf, sizeof(buf)); if (nwrite < 0) { return -1; } @@ -370,14 +408,15 @@ int ngtcp2_crypto_derive_and_install_tx_key(ngtcp2_conn *conn, uint8_t *key, const ngtcp2_crypto_cipher *hp; ngtcp2_crypto_aead_ctx aead_ctx = {0}; ngtcp2_crypto_cipher_ctx hp_ctx = {0}; - void *tls = ngtcp2_conn_get_tls_native_handle(conn); + void *tls = ngtcp2_conn_get_tls_native_handle2(conn); uint8_t keybuf[64], ivbuf[64], hp_keybuf[64]; + size_t keylen; size_t ivlen; int rv; ngtcp2_crypto_ctx cctx; uint32_t version; - if (level == NGTCP2_ENCRYPTION_LEVEL_0RTT && ngtcp2_conn_is_server(conn)) { + if (level == NGTCP2_ENCRYPTION_LEVEL_0RTT && ngtcp2_conn_is_server2(conn)) { return 0; } @@ -398,12 +437,12 @@ int ngtcp2_crypto_derive_and_install_tx_key(ngtcp2_conn *conn, uint8_t *key, } ngtcp2_conn_set_0rtt_crypto_ctx(conn, &cctx); - ctx = ngtcp2_conn_get_0rtt_crypto_ctx(conn); - version = ngtcp2_conn_get_client_chosen_version(conn); + ctx = ngtcp2_conn_get_0rtt_crypto_ctx2(conn); + version = ngtcp2_conn_get_client_chosen_version2(conn); break; case NGTCP2_ENCRYPTION_LEVEL_HANDSHAKE: - if (ngtcp2_conn_is_server(conn) && - !ngtcp2_conn_get_negotiated_version(conn)) { + if (ngtcp2_conn_is_server2(conn) && + !ngtcp2_conn_get_negotiated_version2(conn)) { rv = ngtcp2_crypto_set_remote_transport_params(conn, tls); if (rv != 0) { return -1; @@ -411,8 +450,8 @@ int ngtcp2_crypto_derive_and_install_tx_key(ngtcp2_conn *conn, uint8_t *key, } /* fall through */ case NGTCP2_ENCRYPTION_LEVEL_1RTT: - ctx = ngtcp2_conn_get_crypto_ctx(conn); - version = ngtcp2_conn_get_negotiated_version(conn); + ctx = ngtcp2_conn_get_crypto_ctx2(conn); + version = ngtcp2_conn_get_negotiated_version2(conn); if (!ctx->aead.native_handle) { if (ngtcp2_crypto_ctx_tls(&cctx, tls) == NULL) { @@ -420,7 +459,7 @@ int ngtcp2_crypto_derive_and_install_tx_key(ngtcp2_conn *conn, uint8_t *key, } ngtcp2_conn_set_crypto_ctx(conn, &cctx); - ctx = ngtcp2_conn_get_crypto_ctx(conn); + ctx = ngtcp2_conn_get_crypto_ctx2(conn); } break; default: @@ -430,6 +469,7 @@ int ngtcp2_crypto_derive_and_install_tx_key(ngtcp2_conn *conn, uint8_t *key, aead = &ctx->aead; md = &ctx->md; hp = &ctx->hp; + keylen = ngtcp2_crypto_aead_keylen(aead); ivlen = ngtcp2_crypto_packet_protection_ivlen(aead); if (ngtcp2_crypto_derive_packet_protection_key(key, iv, hp_key, version, aead, @@ -459,9 +499,11 @@ int ngtcp2_crypto_derive_and_install_tx_key(ngtcp2_conn *conn, uint8_t *key, goto fail; } - if (ngtcp2_conn_is_server(conn) && + if (ngtcp2_conn_is_server2(conn) && crypto_set_local_transport_params(conn, tls) != 0) { - goto fail; + /* Just return -1 because aead_ctx and hp_ctx are now owned by + conn. */ + goto fail_cleanup; } break; @@ -477,12 +519,22 @@ int ngtcp2_crypto_derive_and_install_tx_key(ngtcp2_conn *conn, uint8_t *key, goto fail; } + /* Clear keys in the stack buffers. */ + ngtcp2_secure_clear(keybuf, keylen); + ngtcp2_secure_clear(hp_keybuf, keylen); + return 0; fail: ngtcp2_crypto_cipher_ctx_free(&hp_ctx); ngtcp2_crypto_aead_ctx_free(&aead_ctx); +fail_cleanup: + /* Clear keys from the given buffers as well as the stack buffers if + used. */ + ngtcp2_secure_clear(key, keylen); + ngtcp2_secure_clear(hp_key, keylen); + return -1; } @@ -508,7 +560,7 @@ int ngtcp2_crypto_derive_and_install_initial_key( ngtcp2_crypto_cipher_ctx tx_hp_ctx = {0}; ngtcp2_crypto_aead_ctx retry_aead_ctx = {0}; int rv; - int server = ngtcp2_conn_is_server(conn); + int server = ngtcp2_conn_is_server2(conn); const uint8_t *retry_key; size_t retry_noncelen; @@ -583,18 +635,18 @@ int ngtcp2_crypto_derive_and_install_initial_key( goto fail; } - if (!server && !ngtcp2_conn_after_retry(conn)) { + if (!server && !ngtcp2_conn_after_retry2(conn)) { ngtcp2_crypto_aead_retry(&retry_aead); switch (version) { case NGTCP2_PROTO_VER_V1: default: retry_key = (const uint8_t *)NGTCP2_RETRY_KEY_V1; - retry_noncelen = sizeof(NGTCP2_RETRY_NONCE_V1) - 1; + retry_noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V1); break; case NGTCP2_PROTO_VER_V2: retry_key = (const uint8_t *)NGTCP2_RETRY_KEY_V2; - retry_noncelen = sizeof(NGTCP2_RETRY_NONCE_V2) - 1; + retry_noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V2); break; } @@ -641,13 +693,13 @@ int ngtcp2_crypto_derive_and_install_vneg_initial_key( uint8_t tx_keybuf[NGTCP2_CRYPTO_INITIAL_KEYLEN]; uint8_t tx_ivbuf[NGTCP2_CRYPTO_INITIAL_IVLEN]; uint8_t tx_hp_keybuf[NGTCP2_CRYPTO_INITIAL_KEYLEN]; - const ngtcp2_crypto_ctx *ctx = ngtcp2_conn_get_initial_crypto_ctx(conn); + const ngtcp2_crypto_ctx *ctx = ngtcp2_conn_get_initial_crypto_ctx2(conn); ngtcp2_crypto_aead_ctx rx_aead_ctx = {0}; ngtcp2_crypto_cipher_ctx rx_hp_ctx = {0}; ngtcp2_crypto_aead_ctx tx_aead_ctx = {0}; ngtcp2_crypto_cipher_ctx tx_hp_ctx = {0}; int rv; - int server = ngtcp2_conn_is_server(conn); + int server = ngtcp2_conn_is_server2(conn); if (!rx_secret) { rx_secret = rx_secretbuf; @@ -740,45 +792,54 @@ int ngtcp2_crypto_update_key( ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_key, uint8_t *tx_iv, const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, size_t secretlen) { - const ngtcp2_crypto_ctx *ctx = ngtcp2_conn_get_crypto_ctx(conn); + const ngtcp2_crypto_ctx *ctx = ngtcp2_conn_get_crypto_ctx2(conn); const ngtcp2_crypto_aead *aead = &ctx->aead; const ngtcp2_crypto_md *md = &ctx->md; + size_t keylen = ngtcp2_crypto_aead_keylen(aead); size_t ivlen = ngtcp2_crypto_packet_protection_ivlen(aead); - uint32_t version = ngtcp2_conn_get_negotiated_version(conn); + uint32_t version = ngtcp2_conn_get_negotiated_version2(conn); if (ngtcp2_crypto_update_traffic_secret(rx_secret, version, md, current_rx_secret, secretlen) != 0) { - return -1; + goto cleanup; } if (ngtcp2_crypto_derive_packet_protection_key( rx_key, rx_iv, NULL, version, aead, md, rx_secret, secretlen) != 0) { - return -1; + goto cleanup; } if (ngtcp2_crypto_update_traffic_secret(tx_secret, version, md, current_tx_secret, secretlen) != 0) { - return -1; + goto cleanup; } if (ngtcp2_crypto_derive_packet_protection_key( tx_key, tx_iv, NULL, version, aead, md, tx_secret, secretlen) != 0) { - return -1; + goto cleanup; } if (ngtcp2_crypto_aead_ctx_decrypt_init(rx_aead_ctx, aead, rx_key, ivlen) != 0) { - return -1; + goto cleanup; } if (ngtcp2_crypto_aead_ctx_encrypt_init(tx_aead_ctx, aead, tx_key, ivlen) != 0) { ngtcp2_crypto_aead_ctx_free(rx_aead_ctx); rx_aead_ctx->native_handle = NULL; - return -1; + goto cleanup; } return 0; + +cleanup: + ngtcp2_secure_clear(rx_secret, secretlen); + ngtcp2_secure_clear(tx_secret, secretlen); + ngtcp2_secure_clear(rx_key, keylen); + ngtcp2_secure_clear(tx_key, keylen); + + return -1; } int ngtcp2_crypto_encrypt_cb(uint8_t *dest, const ngtcp2_crypto_aead *aead, @@ -822,12 +883,18 @@ int ngtcp2_crypto_update_key_cb( size_t secretlen, void *user_data) { uint8_t rx_key[64]; uint8_t tx_key[64]; + int rv; (void)conn; (void)user_data; - if (ngtcp2_crypto_update_key( - conn, rx_secret, tx_secret, rx_aead_ctx, rx_key, rx_iv, tx_aead_ctx, - tx_key, tx_iv, current_rx_secret, current_tx_secret, secretlen) != 0) { + rv = ngtcp2_crypto_update_key( + conn, rx_secret, tx_secret, rx_aead_ctx, rx_key, rx_iv, tx_aead_ctx, tx_key, + tx_iv, current_rx_secret, current_tx_secret, secretlen); + + ngtcp2_secure_clear(rx_key, sizeof(rx_key)); + ngtcp2_secure_clear(tx_key, sizeof(tx_key)); + + if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } return 0; @@ -843,7 +910,7 @@ int ngtcp2_crypto_generate_stateless_reset_token(uint8_t *token, if (ngtcp2_crypto_hkdf(token, NGTCP2_STATELESS_RESET_TOKENLEN, ngtcp2_crypto_md_sha256(&md), secret, secretlen, cid->data, cid->datalen, info, - sizeof(info) - 1) != 0) { + ngtcp2_strlen_lit(info)) != 0) { return -1; } @@ -863,8 +930,8 @@ static int crypto_derive_token_key(uint8_t *key, size_t keylen, uint8_t *iv, uint8_t *p; assert(ngtcp2_crypto_md_hashlen(md) == sizeof(intsecret)); - assert(info_prefixlen + sizeof(key_info_suffix) - 1 <= sizeof(info)); - assert(info_prefixlen + sizeof(iv_info_suffix) - 1 <= sizeof(info)); + assert(info_prefixlen + ngtcp2_strlen_lit(key_info_suffix) <= sizeof(info)); + assert(info_prefixlen + ngtcp2_strlen_lit(iv_info_suffix) <= sizeof(info)); if (ngtcp2_crypto_hkdf_extract(intsecret, md, secret, secretlen, salt, saltlen) != 0) { @@ -874,8 +941,8 @@ static int crypto_derive_token_key(uint8_t *key, size_t keylen, uint8_t *iv, memcpy(info, info_prefix, info_prefixlen); p = info + info_prefixlen; - memcpy(p, key_info_suffix, sizeof(key_info_suffix) - 1); - p += sizeof(key_info_suffix) - 1; + memcpy(p, key_info_suffix, ngtcp2_strlen_lit(key_info_suffix)); + p += ngtcp2_strlen_lit(key_info_suffix); if (ngtcp2_crypto_hkdf_expand(key, keylen, md, intsecret, sizeof(intsecret), info, (size_t)(p - info)) != 0) { @@ -884,8 +951,8 @@ static int crypto_derive_token_key(uint8_t *key, size_t keylen, uint8_t *iv, p = info + info_prefixlen; - memcpy(p, iv_info_suffix, sizeof(iv_info_suffix) - 1); - p += sizeof(iv_info_suffix) - 1; + memcpy(p, iv_info_suffix, ngtcp2_strlen_lit(iv_info_suffix)); + p += ngtcp2_strlen_lit(iv_info_suffix); if (ngtcp2_crypto_hkdf_expand(iv, ivlen, md, intsecret, sizeof(intsecret), info, (size_t)(p - info)) != 0) { @@ -918,8 +985,8 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token( uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version, const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts) { - uint8_t - plaintext[/* cid len = */ 1 + NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp)]; + uint8_t plaintext[/* cid len = */ 1 + NGTCP2_MAX_CIDLEN + + sizeof(ngtcp2_tstamp)] = {0}; uint8_t rand_data[NGTCP2_CRYPTO_TOKEN_RAND_DATALEN]; uint8_t key[16]; uint8_t iv[12]; @@ -938,8 +1005,6 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token( assert((size_t)remote_addrlen <= sizeof(ngtcp2_sockaddr_union)); - memset(plaintext, 0, sizeof(plaintext)); - *p++ = (uint8_t)odcid->datalen; memcpy(p, odcid->data, odcid->datalen); p += NGTCP2_MAX_CIDLEN; @@ -961,10 +1026,10 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token( assert(sizeof(key) == keylen); assert(sizeof(iv) == ivlen); - if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, - rand_data, sizeof(rand_data), - retry_token_info_prefix, - sizeof(retry_token_info_prefix) - 1) != 0) { + if (crypto_derive_token_key( + key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, + sizeof(rand_data), retry_token_info_prefix, + ngtcp2_strlen_lit(retry_token_info_prefix)) != 0) { return -1; } @@ -994,6 +1059,11 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token( return p - token; } +static int crypto_token_expired(ngtcp2_tstamp gen_ts, ngtcp2_duration timeout, + ngtcp2_tstamp ts) { + return ts >= timeout && gen_ts <= ts - timeout; +} + int ngtcp2_crypto_verify_retry_token( ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen, const uint8_t *secret, size_t secretlen, uint32_t version, @@ -1038,10 +1108,10 @@ int ngtcp2_crypto_verify_retry_token( assert(sizeof(key) == keylen); assert(sizeof(iv) == ivlen); - if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, - rand_data, NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, - retry_token_info_prefix, - sizeof(retry_token_info_prefix) - 1) != 0) { + if (crypto_derive_token_key( + key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, + NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, retry_token_info_prefix, + ngtcp2_strlen_lit(retry_token_info_prefix)) != 0) { return -1; } @@ -1071,7 +1141,7 @@ int ngtcp2_crypto_verify_retry_token( sizeof(gen_ts)); gen_ts = ngtcp2_ntohl64(gen_ts); - if (gen_ts + timeout <= ts) { + if (crypto_token_expired(gen_ts, timeout, ts)) { return -1; } @@ -1100,7 +1170,7 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token2( const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts) { uint8_t plaintext[sizeof(ngtcp2_sockaddr_union) + /* cid len = */ 1 + - NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp)]; + NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp)] = {0}; uint8_t rand_data[NGTCP2_CRYPTO_TOKEN_RAND_DATALEN]; uint8_t key[16]; uint8_t iv[12]; @@ -1117,8 +1187,6 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token2( assert((size_t)remote_addrlen <= sizeof(ngtcp2_sockaddr_union)); - memset(plaintext, 0, sizeof(plaintext)); - memcpy(p, remote_addr, (size_t)remote_addrlen); p += sizeof(ngtcp2_sockaddr_union); *p++ = (uint8_t)odcid->datalen; @@ -1141,10 +1209,10 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token2( assert(sizeof(key) == keylen); assert(sizeof(iv) == ivlen); - if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, - rand_data, sizeof(rand_data), - retry_token_info_prefix2, - sizeof(retry_token_info_prefix2) - 1) != 0) { + if (crypto_derive_token_key( + key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, + sizeof(rand_data), retry_token_info_prefix2, + ngtcp2_strlen_lit(retry_token_info_prefix2)) != 0) { return -1; } @@ -1219,10 +1287,10 @@ int ngtcp2_crypto_verify_retry_token2( assert(sizeof(key) == keylen); assert(sizeof(iv) == ivlen); - if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, - rand_data, NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, - retry_token_info_prefix2, - sizeof(retry_token_info_prefix2) - 1) != 0) { + if (crypto_derive_token_key( + key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, + NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, retry_token_info_prefix2, + ngtcp2_strlen_lit(retry_token_info_prefix2)) != 0) { return NGTCP2_CRYPTO_ERR_INTERNAL; } @@ -1271,7 +1339,7 @@ int ngtcp2_crypto_verify_retry_token2( memcpy(&gen_ts, p + NGTCP2_MAX_CIDLEN, sizeof(gen_ts)); gen_ts = ngtcp2_ntohl64(gen_ts); - if (gen_ts + timeout <= ts) { + if (crypto_token_expired(gen_ts, timeout, ts)) { return NGTCP2_CRYPTO_ERR_VERIFY_TOKEN; } @@ -1305,13 +1373,22 @@ static size_t crypto_generate_regular_token_aad(uint8_t *dest, return addrlen; } +/* NGTCP2_CRYPTO_MAX_REGULAR_TOKEN_DATALEN is the maximum length of + opaque data embedded in a regular token. */ +#define NGTCP2_CRYPTO_MAX_REGULAR_TOKEN_DATALEN 256 + +/* NGTCP2_CRYPTO_MAX_REGULAR_TOKEN_PLAINTEXTLEN is the maximum length + of plaintext included in a regular token. */ +#define NGTCP2_CRYPTO_MAX_REGULAR_TOKEN_PLAINTEXTLEN \ + (sizeof(ngtcp2_tstamp) + NGTCP2_CRYPTO_MAX_REGULAR_TOKEN_DATALEN) + static const uint8_t regular_token_info_prefix[] = "regular_token"; -ngtcp2_ssize ngtcp2_crypto_generate_regular_token( +static ngtcp2_ssize crypto_generate_regular_token( uint8_t *token, const uint8_t *secret, size_t secretlen, const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, - ngtcp2_tstamp ts) { - uint8_t plaintext[sizeof(ngtcp2_tstamp)]; + const void *data, size_t datalen, ngtcp2_tstamp ts) { + uint8_t plaintext[NGTCP2_CRYPTO_MAX_REGULAR_TOKEN_PLAINTEXTLEN]; uint8_t rand_data[NGTCP2_CRYPTO_TOKEN_RAND_DATALEN]; uint8_t key[16]; uint8_t iv[12]; @@ -1328,9 +1405,18 @@ ngtcp2_ssize ngtcp2_crypto_generate_regular_token( int rv; (void)remote_addrlen; + if (datalen > NGTCP2_CRYPTO_MAX_REGULAR_TOKEN_DATALEN) { + return -1; + } + memcpy(p, &ts_be, sizeof(ts_be)); p += sizeof(ts_be); + if (datalen) { + memcpy(p, data, datalen); + p += datalen; + } + plaintextlen = (size_t)(p - plaintext); if (ngtcp2_crypto_random(rand_data, sizeof(rand_data)) != 0) { @@ -1346,10 +1432,10 @@ ngtcp2_ssize ngtcp2_crypto_generate_regular_token( assert(sizeof(key) == keylen); assert(sizeof(iv) == ivlen); - if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, - rand_data, sizeof(rand_data), - regular_token_info_prefix, - sizeof(regular_token_info_prefix) - 1) != 0) { + if (crypto_derive_token_key( + key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, + sizeof(rand_data), regular_token_info_prefix, + ngtcp2_strlen_lit(regular_token_info_prefix)) != 0) { return -1; } @@ -1378,13 +1464,11 @@ ngtcp2_ssize ngtcp2_crypto_generate_regular_token( return p - token; } -int ngtcp2_crypto_verify_regular_token(const uint8_t *token, size_t tokenlen, - const uint8_t *secret, size_t secretlen, - const ngtcp2_sockaddr *remote_addr, - ngtcp2_socklen remote_addrlen, - ngtcp2_duration timeout, - ngtcp2_tstamp ts) { - uint8_t plaintext[sizeof(ngtcp2_tstamp)]; +static ngtcp2_ssize crypto_verify_regular_token( + void *data, size_t max_datalen, const uint8_t *token, size_t tokenlen, + const uint8_t *secret, size_t secretlen, const ngtcp2_sockaddr *remote_addr, + ngtcp2_socklen remote_addrlen, ngtcp2_duration timeout, ngtcp2_tstamp ts) { + uint8_t plaintext[NGTCP2_CRYPTO_MAX_REGULAR_TOKEN_PLAINTEXTLEN]; uint8_t key[16]; uint8_t iv[12]; size_t keylen; @@ -1397,13 +1481,14 @@ int ngtcp2_crypto_verify_regular_token(const uint8_t *token, size_t tokenlen, const uint8_t *rand_data; const uint8_t *ciphertext; size_t ciphertextlen; + size_t datalen; int rv; ngtcp2_tstamp gen_ts; (void)remote_addrlen; - if (tokenlen != NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN || + if (tokenlen < NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN || token[0] != NGTCP2_CRYPTO_TOKEN_MAGIC_REGULAR) { - return -1; + return NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN; } rand_data = token + tokenlen - NGTCP2_CRYPTO_TOKEN_RAND_DATALEN; @@ -1413,23 +1498,27 @@ int ngtcp2_crypto_verify_regular_token(const uint8_t *token, size_t tokenlen, ngtcp2_crypto_aead_aes_128_gcm(&aead); ngtcp2_crypto_md_sha256(&md); + if (ciphertextlen > sizeof(plaintext) + aead.max_overhead) { + return NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN; + } + keylen = ngtcp2_crypto_aead_keylen(&aead); ivlen = ngtcp2_crypto_aead_noncelen(&aead); assert(sizeof(key) == keylen); assert(sizeof(iv) == ivlen); - if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, - rand_data, NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, - regular_token_info_prefix, - sizeof(regular_token_info_prefix) - 1) != 0) { - return -1; + if (crypto_derive_token_key( + key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, + NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, regular_token_info_prefix, + ngtcp2_strlen_lit(regular_token_info_prefix)) != 0) { + return NGTCP2_CRYPTO_ERR_INTERNAL; } aadlen = crypto_generate_regular_token_aad(aad, remote_addr); if (ngtcp2_crypto_aead_ctx_decrypt_init(&aead_ctx, &aead, key, ivlen) != 0) { - return -1; + return NGTCP2_CRYPTO_ERR_INTERNAL; } rv = ngtcp2_crypto_decrypt(plaintext, &aead, &aead_ctx, ciphertext, @@ -1438,19 +1527,74 @@ int ngtcp2_crypto_verify_regular_token(const uint8_t *token, size_t tokenlen, ngtcp2_crypto_aead_ctx_free(&aead_ctx); if (rv != 0) { - return -1; + return NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN; } memcpy(&gen_ts, plaintext, sizeof(gen_ts)); gen_ts = ngtcp2_ntohl64(gen_ts); - if (gen_ts + timeout <= ts) { + if (crypto_token_expired(gen_ts, timeout, ts)) { + return NGTCP2_CRYPTO_ERR_VERIFY_TOKEN; + } + + if (max_datalen == 0) { + return 0; + } + + datalen = ciphertextlen - aead.max_overhead - sizeof(gen_ts); + if (datalen > max_datalen) { + return 0; + } + + memcpy(data, plaintext + sizeof(gen_ts), datalen); + + return (ngtcp2_ssize)datalen; +} + +ngtcp2_ssize ngtcp2_crypto_generate_regular_token( + uint8_t *token, const uint8_t *secret, size_t secretlen, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + ngtcp2_tstamp ts) { + return crypto_generate_regular_token(token, secret, secretlen, remote_addr, + remote_addrlen, NULL, 0, ts); +} + +int ngtcp2_crypto_verify_regular_token(const uint8_t *token, size_t tokenlen, + const uint8_t *secret, size_t secretlen, + const ngtcp2_sockaddr *remote_addr, + ngtcp2_socklen remote_addrlen, + ngtcp2_duration timeout, + ngtcp2_tstamp ts) { + ngtcp2_ssize datalen = + crypto_verify_regular_token(NULL, 0, token, tokenlen, secret, secretlen, + remote_addr, remote_addrlen, timeout, ts); + + if (datalen < 0) { return -1; } + assert(0 == datalen); + return 0; } +ngtcp2_ssize ngtcp2_crypto_generate_regular_token2( + uint8_t *token, const uint8_t *secret, size_t secretlen, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const void *data, size_t datalen, ngtcp2_tstamp ts) { + return crypto_generate_regular_token(token, secret, secretlen, remote_addr, + remote_addrlen, data, datalen, ts); +} + +ngtcp2_ssize ngtcp2_crypto_verify_regular_token2( + void *data, size_t max_datalen, const uint8_t *token, size_t tokenlen, + const uint8_t *secret, size_t secretlen, const ngtcp2_sockaddr *remote_addr, + ngtcp2_socklen remote_addrlen, ngtcp2_duration timeout, ngtcp2_tstamp ts) { + return crypto_verify_regular_token(data, max_datalen, token, tokenlen, secret, + secretlen, remote_addr, remote_addrlen, + timeout, ts); +} + ngtcp2_ssize ngtcp2_crypto_write_connection_close( uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, @@ -1523,11 +1667,11 @@ ngtcp2_ssize ngtcp2_crypto_write_retry(uint8_t *dest, size_t destlen, case NGTCP2_PROTO_VER_V1: default: key = (const uint8_t *)NGTCP2_RETRY_KEY_V1; - noncelen = sizeof(NGTCP2_RETRY_NONCE_V1) - 1; + noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V1); break; case NGTCP2_PROTO_VER_V2: key = (const uint8_t *)NGTCP2_RETRY_KEY_V2; - noncelen = sizeof(NGTCP2_RETRY_NONCE_V2) - 1; + noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V2); break; } @@ -1549,13 +1693,13 @@ ngtcp2_ssize ngtcp2_crypto_write_retry(uint8_t *dest, size_t destlen, } int ngtcp2_crypto_client_initial_cb(ngtcp2_conn *conn, void *user_data) { - const ngtcp2_cid *dcid = ngtcp2_conn_get_dcid(conn); - void *tls = ngtcp2_conn_get_tls_native_handle(conn); + const ngtcp2_cid *dcid = ngtcp2_conn_get_dcid2(conn); + void *tls = ngtcp2_conn_get_tls_native_handle2(conn); (void)user_data; if (ngtcp2_crypto_derive_and_install_initial_key( conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - ngtcp2_conn_get_client_chosen_version(conn), dcid) != 0) { + ngtcp2_conn_get_client_chosen_version2(conn), dcid) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -1577,7 +1721,7 @@ int ngtcp2_crypto_recv_retry_cb(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd, if (ngtcp2_crypto_derive_and_install_initial_key( conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - ngtcp2_conn_get_client_chosen_version(conn), &hd->scid) != 0) { + ngtcp2_conn_get_client_chosen_version2(conn), &hd->scid) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -1591,7 +1735,7 @@ int ngtcp2_crypto_recv_client_initial_cb(ngtcp2_conn *conn, if (ngtcp2_crypto_derive_and_install_initial_key( conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - ngtcp2_conn_get_client_chosen_version(conn), dcid) != 0) { + ngtcp2_conn_get_client_chosen_version2(conn), dcid) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -1637,9 +1781,22 @@ int ngtcp2_crypto_recv_crypto_data_cb(ngtcp2_conn *conn, (void)offset; (void)user_data; - if (ngtcp2_crypto_read_write_crypto_data(conn, encryption_level, data, - datalen) != 0) { - rv = ngtcp2_conn_get_tls_error(conn); + rv = + ngtcp2_crypto_read_write_crypto_data(conn, encryption_level, data, datalen); + if (rv != 0) { + switch (rv) { + case /* NGTCP2_CRYPTO_QUICTLS_ERR_TLS_WANT_CLIENT_HELLO_CB */ -10001: + case /* NGTCP2_CRYPTO_QUICTLS_ERR_TLS_WANT_X509_LOOKUP */ -10002: + /* These errors are not unrecoverable error, and they just + indicate that handshake has been interrupted. ngtcp2 does + not mind whether handshake is interrupted or not. Just + return 0 in this case. There are OSSL version and they have + the same enum value, therefore we cannot enumerate them + here. */ + return 0; + } + + rv = ngtcp2_conn_get_tls_error2(conn); if (rv) { return rv; } diff --git a/deps/ngtcp2/ngtcp2/crypto/shared.h b/deps/ngtcp2/ngtcp2/crypto/shared.h index 34158d3d02db..e853c8140fea 100644 --- a/deps/ngtcp2/ngtcp2/crypto/shared.h +++ b/deps/ngtcp2/ngtcp2/crypto/shared.h @@ -31,26 +31,6 @@ #include -/** - * @macro - * - * :macro:`NGTCP2_INITIAL_SALT_V1` is a salt value which is used to - * derive initial secret. It is used for QUIC v1. - */ -#define NGTCP2_INITIAL_SALT_V1 \ - "\x38\x76\x2c\xf7\xf5\x59\x34\xb3\x4d\x17\x9a\xe6\xa4\xc8\x0c\xad\xcc\xbb" \ - "\x7f\x0a" - -/** - * @macro - * - * :macro:`NGTCP2_INITIAL_SALT_V2` is a salt value which is used to - * derive initial secret. It is used for QUIC v2. - */ -#define NGTCP2_INITIAL_SALT_V2 \ - "\x0d\xed\xe3\xde\xf7\x00\xa6\xdb\x81\x93\x81\xbe\x6e\x26\x9d\xcb\xf9\xbd" \ - "\x2e\xd9" - /* Maximum key usage (encryption) limits */ #define NGTCP2_CRYPTO_MAX_ENCRYPTION_AES_GCM (1ULL << 23) #define NGTCP2_CRYPTO_MAX_ENCRYPTION_CHACHA20_POLY1305 (1ULL << 62) @@ -281,7 +261,7 @@ int ngtcp2_crypto_set_remote_transport_params(ngtcp2_conn *conn, void *tls); * This function calls `ngtcp2_conn_set_initial_crypto_ctx` to set * initial AEAD and message digest algorithm. After the successful * call of this function, application can use - * `ngtcp2_conn_get_initial_crypto_ctx` to get the object. + * `ngtcp2_conn_get_initial_crypto_ctx2` to get the object. * * This function returns 0 if it succeeds, or -1. */ diff --git a/deps/ngtcp2/ngtcp2/crypto/shared_test.c b/deps/ngtcp2/ngtcp2/crypto/shared_test.c new file mode 100644 index 000000000000..68e78b0cad0c --- /dev/null +++ b/deps/ngtcp2/ngtcp2/crypto/shared_test.c @@ -0,0 +1,218 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "shared_test.h" + +#include + +#include "shared.h" +#include "ngtcp2_macro.h" + +static const MunitTest tests[] = { + munit_void_test(test_ngtcp2_crypto_verify_retry_token), + munit_void_test(test_ngtcp2_crypto_verify_regular_token), + munit_test_end(), +}; + +const MunitSuite shared_suite = { + .prefix = "/shared", + .tests = tests, +}; + +void test_ngtcp2_crypto_verify_retry_token(void) { + const uint8_t secret[] = "retry-token-secret"; + const ngtcp2_sockaddr_in6 in6addr = { + .sin6_family = NGTCP2_AF_INET6, + .sin6_port = 39918, + }; + const ngtcp2_sockaddr_in inaddr = { + .sin_family = NGTCP2_AF_INET, + .sin_port = 39918, + }; + const ngtcp2_cid retry_scid = { + .datalen = NGTCP2_MAX_CIDLEN, + .data = {0xBA, 0xAD, 0xF0, 0x0D}, + }; + const ngtcp2_cid odcid = { + .datalen = NGTCP2_MAX_CIDLEN, + .data = {0xBA, 0xAD, 0xCA, 0xCE}, + }; + const ngtcp2_cid dcid = { + .datalen = NGTCP2_MAX_CIDLEN, + .data = {0xDE, 0xAD, 0xF1, 0x5b}, + }; + ngtcp2_cid decoded_odcid; + ngtcp2_tstamp t = 3600 * NGTCP2_SECONDS; + uint8_t token[NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN2]; + ngtcp2_ssize tokenlen; + int rv; + + tokenlen = ngtcp2_crypto_generate_retry_token2( + token, secret, ngtcp2_strlen_lit(secret), NGTCP2_PROTO_VER_V1, + (const ngtcp2_sockaddr *)&in6addr, sizeof(in6addr), &retry_scid, &odcid, t); + + assert_ptrdiff(NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN2, ==, tokenlen); + + /* Successful validation */ + rv = ngtcp2_crypto_verify_retry_token2( + &decoded_odcid, token, (size_t)tokenlen, secret, ngtcp2_strlen_lit(secret), + NGTCP2_PROTO_VER_V1, (const ngtcp2_sockaddr *)&in6addr, sizeof(in6addr), + &retry_scid, 10 * NGTCP2_SECONDS, t); + + assert_int(0, ==, rv); + assert_true(ngtcp2_cid_eq(&odcid, &decoded_odcid)); + + /* Timeout */ + rv = ngtcp2_crypto_verify_retry_token2( + &decoded_odcid, token, (size_t)tokenlen, secret, ngtcp2_strlen_lit(secret), + NGTCP2_PROTO_VER_V1, (const ngtcp2_sockaddr *)&in6addr, sizeof(in6addr), + &retry_scid, 10 * NGTCP2_SECONDS, t + 10 * NGTCP2_SECONDS); + + assert_int(NGTCP2_CRYPTO_ERR_VERIFY_TOKEN, ==, rv); + + /* Bad DCID */ + rv = ngtcp2_crypto_verify_retry_token2( + &decoded_odcid, token, (size_t)tokenlen, secret, ngtcp2_strlen_lit(secret), + NGTCP2_PROTO_VER_V1, (const ngtcp2_sockaddr *)&in6addr, sizeof(in6addr), + &dcid, 10 * NGTCP2_SECONDS, t); + + assert_int(NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN, ==, rv); + + /* Bad address */ + rv = ngtcp2_crypto_verify_retry_token2( + &decoded_odcid, token, (size_t)tokenlen, secret, ngtcp2_strlen_lit(secret), + NGTCP2_PROTO_VER_V1, (const ngtcp2_sockaddr *)&inaddr, sizeof(inaddr), + &retry_scid, 10 * NGTCP2_SECONDS, t); + + assert_int(NGTCP2_CRYPTO_ERR_VERIFY_TOKEN, ==, rv); + + /* Truncated token */ + rv = ngtcp2_crypto_verify_retry_token2( + &decoded_odcid, token, (size_t)tokenlen - 1, secret, + ngtcp2_strlen_lit(secret), NGTCP2_PROTO_VER_V1, + (const ngtcp2_sockaddr *)&in6addr, sizeof(in6addr), &retry_scid, + 10 * NGTCP2_SECONDS, t); + + assert_int(NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN, ==, rv); + + /* Bad magic */ + token[0] = 0; + + rv = ngtcp2_crypto_verify_retry_token2( + &decoded_odcid, token, (size_t)tokenlen, secret, ngtcp2_strlen_lit(secret), + NGTCP2_PROTO_VER_V1, (const ngtcp2_sockaddr *)&in6addr, sizeof(in6addr), + &retry_scid, 10 * NGTCP2_SECONDS, t); + + assert_int(NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN, ==, rv); +} + +void test_ngtcp2_crypto_verify_regular_token(void) { + const uint8_t secret[] = "regular-token-secret"; + const ngtcp2_sockaddr_in6 in6addr = { + .sin6_family = NGTCP2_AF_INET6, + .sin6_port = 39918, + }; + const ngtcp2_sockaddr_in inaddr = { + .sin_family = NGTCP2_AF_INET, + .sin_port = 39918, + }; + const uint8_t token_data[] = "I am the token data"; + const ngtcp2_tstamp timeout = 10 * NGTCP2_SECONDS; + ngtcp2_tstamp t = 3600 * NGTCP2_SECONDS; + uint8_t token[NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN + 256]; + ngtcp2_ssize tokenlen; + ngtcp2_ssize token_datalen; + uint8_t decoded_token_data[256]; + + tokenlen = ngtcp2_crypto_generate_regular_token2( + token, secret, ngtcp2_strlen_lit(secret), (const ngtcp2_sockaddr *)&in6addr, + sizeof(in6addr), token_data, ngtcp2_strlen_lit(token_data), t); + + assert_ptrdiff(NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN + + ngtcp2_strlen_lit(token_data), + ==, tokenlen); + + /* Successful validation */ + token_datalen = ngtcp2_crypto_verify_regular_token2( + decoded_token_data, sizeof(decoded_token_data), token, (size_t)tokenlen, + secret, ngtcp2_strlen_lit(secret), (const ngtcp2_sockaddr *)&in6addr, + sizeof(in6addr), timeout, t); + + assert_ptrdiff(ngtcp2_strlen_lit(token_data), ==, token_datalen); + assert_memory_equal(ngtcp2_strlen_lit(token_data), token_data, + decoded_token_data); + + /* Timeout */ + token_datalen = ngtcp2_crypto_verify_regular_token2( + decoded_token_data, sizeof(decoded_token_data), token, (size_t)tokenlen, + secret, ngtcp2_strlen_lit(secret), (const ngtcp2_sockaddr *)&in6addr, + sizeof(in6addr), timeout, t + timeout); + + assert_ptrdiff(NGTCP2_CRYPTO_ERR_VERIFY_TOKEN, ==, token_datalen); + + /* Bad address */ + token_datalen = ngtcp2_crypto_verify_regular_token2( + decoded_token_data, sizeof(decoded_token_data), token, (size_t)tokenlen, + secret, ngtcp2_strlen_lit(secret), (const ngtcp2_sockaddr *)&inaddr, + sizeof(inaddr), timeout, t); + + assert_ptrdiff(NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN, ==, token_datalen); + + /* Insufficient data buffer */ + memset(decoded_token_data, 0, sizeof(decoded_token_data)); + + token_datalen = ngtcp2_crypto_verify_regular_token2( + decoded_token_data, ngtcp2_strlen_lit(token_data) - 1, token, + (size_t)tokenlen, secret, ngtcp2_strlen_lit(secret), + (const ngtcp2_sockaddr *)&in6addr, sizeof(in6addr), timeout, t); + + assert_ptrdiff(0, ==, token_datalen); + + /* NULL buffer */ + memset(decoded_token_data, 0, sizeof(decoded_token_data)); + + token_datalen = ngtcp2_crypto_verify_regular_token2( + NULL, 0, token, (size_t)tokenlen, secret, ngtcp2_strlen_lit(secret), + (const ngtcp2_sockaddr *)&in6addr, sizeof(in6addr), timeout, t); + + assert_ptrdiff(0, ==, token_datalen); + + /* Truncated token */ + token_datalen = ngtcp2_crypto_verify_regular_token2( + decoded_token_data, sizeof(decoded_token_data), token, (size_t)tokenlen - 1, + secret, ngtcp2_strlen_lit(secret), (const ngtcp2_sockaddr *)&in6addr, + sizeof(in6addr), timeout, t); + + assert_ptrdiff(NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN, ==, token_datalen); + + /* Bad magic */ + token[0] = 0; + + token_datalen = ngtcp2_crypto_verify_regular_token2( + decoded_token_data, sizeof(decoded_token_data), token, (size_t)tokenlen, + secret, ngtcp2_strlen_lit(secret), (const ngtcp2_sockaddr *)&in6addr, + sizeof(in6addr), timeout, t); + + assert_ptrdiff(NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN, ==, token_datalen); +} diff --git a/deps/ngtcp2/ngtcp2/crypto/shared_test.h b/deps/ngtcp2/ngtcp2/crypto/shared_test.h new file mode 100644 index 000000000000..fe3d023cd9ef --- /dev/null +++ b/deps/ngtcp2/ngtcp2/crypto/shared_test.h @@ -0,0 +1,41 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef NGTCP2_SHARED_TEST_H +#define NGTCP2_SHARED_TEST_H + +#ifdef HAVE_CONFIG_H +# include +#endif /* defined(HAVE_CONFIG_H) */ + +#define MUNIT_ENABLE_ASSERT_ALIASES + +#include "munit.h" + +extern const MunitSuite shared_suite; + +munit_void_test_decl(test_ngtcp2_crypto_verify_retry_token) +munit_void_test_decl(test_ngtcp2_crypto_verify_regular_token) + +#endif /* !defined(NGTCP2_SHARED_TEST_H) */ diff --git a/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c b/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c index bc9d9d84a862..16161597360c 100644 --- a/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c +++ b/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c @@ -34,6 +34,7 @@ #include #include +#include "ngtcp2_macro.h" #include "shared.h" #define PRINTF_DEBUG 0 @@ -55,7 +56,7 @@ ngtcp2_crypto_md *ngtcp2_crypto_md_sha256(ngtcp2_crypto_md *md) { ngtcp2_crypto_ctx *ngtcp2_crypto_ctx_initial(ngtcp2_crypto_ctx *ctx) { ngtcp2_crypto_aead_init(&ctx->aead, (void *)wolfSSL_EVP_aes_128_gcm()); ctx->md.native_handle = (void *)wolfSSL_EVP_sha256(); - ctx->hp.native_handle = (void *)wolfSSL_EVP_aes_128_ctr(); + ctx->hp.native_handle = (void *)wolfSSL_EVP_aes_128_ecb(); ctx->max_encryption = 0; ctx->max_decryption_failure = 0; return ctx; @@ -106,6 +107,21 @@ static int supported_aead(const WOLFSSL_EVP_CIPHER *aead) { wolfSSL_quic_aead_is_chacha20(aead) || wolfSSL_quic_aead_is_ccm(aead); } +static const WOLFSSL_EVP_CIPHER * +crypto_aead_get_hp(const WOLFSSL_EVP_CIPHER *aead) { + switch (wolfSSL_EVP_CIPHER_nid(aead)) { + case NID_aes_128_gcm: + case NID_aes_128_ccm: + return wolfSSL_EVP_aes_128_ecb(); + case NID_aes_256_gcm: + return wolfSSL_EVP_aes_256_ecb(); + case NID_chacha20_poly1305: + return wolfSSL_EVP_chacha20(); + default: + return NULL; + } +} + ngtcp2_crypto_ctx *ngtcp2_crypto_ctx_tls(ngtcp2_crypto_ctx *ctx, void *tls_native_handle) { WOLFSSL *ssl = tls_native_handle; @@ -121,7 +137,7 @@ ngtcp2_crypto_ctx *ngtcp2_crypto_ctx_tls(ngtcp2_crypto_ctx *ctx, ngtcp2_crypto_aead_init(&ctx->aead, (void *)aead); ctx->md.native_handle = (void *)wolfSSL_quic_get_md(ssl); - ctx->hp.native_handle = (void *)wolfSSL_quic_get_hp(ssl); + ctx->hp.native_handle = (void *)crypto_aead_get_hp(aead); ctx->max_encryption = crypto_aead_get_aead_max_encryption(aead); ctx->max_decryption_failure = crypto_aead_get_aead_max_decryption_failure(aead); @@ -288,20 +304,33 @@ int ngtcp2_crypto_decrypt(uint8_t *dest, const ngtcp2_crypto_aead *aead, int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, const ngtcp2_crypto_cipher_ctx *hp_ctx, const uint8_t *sample) { - static const uint8_t PLAINTEXT[] = "\x00\x00\x00\x00\x00"; + static const uint8_t PLAINTEXT[16] = {0}; WOLFSSL_EVP_CIPHER_CTX *actx = hp_ctx->native_handle; int len; (void)hp; - if (wolfSSL_EVP_EncryptInit_ex(actx, NULL, NULL, NULL, sample) != - WOLFSSL_SUCCESS || - wolfSSL_EVP_CipherUpdate(actx, dest, &len, PLAINTEXT, - sizeof(PLAINTEXT) - 1) != WOLFSSL_SUCCESS || - wolfSSL_EVP_EncryptFinal_ex(actx, dest + sizeof(PLAINTEXT) - 1, &len) != - WOLFSSL_SUCCESS) { - DEBUG_MSG("WOLFSSL: hp_mask FAILED\n"); - return -1; + switch (wolfSSL_EVP_CIPHER_CTX_nid(actx)) { + case NID_aes_128_ecb: + case NID_aes_256_ecb: + if (!wolfSSL_EVP_CipherUpdate(actx, dest, &len, sample, + NGTCP2_HP_SAMPLELEN)) { + return -1; + } + + break; + case NID_chacha20: + if (wolfSSL_EVP_EncryptInit_ex(actx, NULL, NULL, NULL, sample) != + WOLFSSL_SUCCESS || + wolfSSL_EVP_CipherUpdate(actx, dest, &len, PLAINTEXT, + sizeof(PLAINTEXT)) != WOLFSSL_SUCCESS || + wolfSSL_EVP_EncryptFinal_ex(actx, dest + sizeof(PLAINTEXT), &len) != + WOLFSSL_SUCCESS) { + DEBUG_MSG("WOLFSSL: hp_mask FAILED\n"); + return -1; + } + + break; } return 0; @@ -310,7 +339,7 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, int ngtcp2_crypto_read_write_crypto_data( ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, const uint8_t *data, size_t datalen) { - WOLFSSL *ssl = ngtcp2_conn_get_tls_native_handle(conn); + WOLFSSL *ssl = ngtcp2_conn_get_tls_native_handle2(conn); WOLFSSL_ENCRYPTION_LEVEL level = ngtcp2_crypto_wolfssl_from_ngtcp2_encryption_level(encryption_level); int rv; @@ -326,7 +355,7 @@ int ngtcp2_crypto_read_write_crypto_data( } } - if (!ngtcp2_conn_get_handshake_completed(conn)) { + if (!ngtcp2_conn_get_handshake_completed2(conn)) { rv = wolfSSL_quic_do_handshake(ssl); if (rv <= 0) { err = wolfSSL_get_error(ssl, rv); @@ -442,6 +471,19 @@ int ngtcp2_crypto_get_path_challenge_data_cb(ngtcp2_conn *conn, uint8_t *data, return 0; } +int ngtcp2_crypto_get_path_challenge_data2_cb(ngtcp2_conn *conn, + ngtcp2_path_challenge_data *data, + void *user_data) { + (void)conn; + (void)user_data; + + DEBUG_MSG("WOLFSSL: get path challenge data\n"); + if (wolfSSL_RAND_bytes(data->data, NGTCP2_PATH_CHALLENGE_DATALEN) != 1) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + return 0; +} + int ngtcp2_crypto_random(uint8_t *data, size_t datalen) { DEBUG_MSG("WOLFSSL: get random\n"); if (wolfSSL_RAND_bytes(data, (int)datalen) != 1) { diff --git a/deps/ngtcp2/ngtcp2/examples/client.cc b/deps/ngtcp2/ngtcp2/examples/client.cc new file mode 100644 index 000000000000..0950ebf3a4f0 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/client.cc @@ -0,0 +1,2915 @@ +/* + * ngtcp2 + * + * Copyright (c) 2017 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "client.h" +#include "network.h" +#include "debug.h" +#include "util.h" +#include "shared.h" + +using namespace ngtcp2; +using namespace std::literals; + +namespace { +auto randgen = util::make_mt19937(); +} // namespace + +constexpr auto max_preferred_versionslen = 4UZ; + +Config config; + +Stream::Stream(const Request &req, int64_t stream_id) + : req{req}, stream_id{stream_id} {} + +Stream::~Stream() { + if (fd != -1) { + close(fd); + } +} + +std::expected Stream::open_file(std::string_view path) { + assert(fd == -1); + + std::string_view filename; + + auto it = std::ranges::find(std::rbegin(path), std::rend(path), '/').base(); + if (it == std::ranges::end(path)) { + filename = "index.html"sv; + } else { + filename = std::string_view{it, std::ranges::end(path)}; + if (filename == ".."sv || filename == "."sv) { + std::println(stderr, "Invalid file name: {}", filename); + return std::unexpected{Error::INVALID_ARGUMENT}; + } + } + + auto fpath = config.download; + fpath /= filename; + + fd = open(fpath.c_str(), O_WRONLY | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + if (fd == -1) { + std::println(stderr, "open: Could not open file {}: {}", fpath.native(), + strerror(errno)); + return std::unexpected{Error::IO}; + } + + return {}; +} + +namespace { +void writecb(struct ev_loop *loop, ev_io *w, int revents) { + auto c = static_cast(w->data); + + (void)c->on_write(); +} +} // namespace + +namespace { +void readcb(struct ev_loop *loop, ev_io *w, int revents) { + auto ep = static_cast(w->data); + auto c = ep->client; + + if (!c->on_read(*ep)) { + return; + } + + (void)c->on_write(); +} +} // namespace + +namespace { +void timeoutcb(struct ev_loop *loop, ev_timer *w, int revents) { + auto c = static_cast(w->data); + + if (auto rv = c->handle_expiry(); !rv) { + return; + } + + (void)c->on_write(); +} +} // namespace + +namespace { +void change_local_addrcb(struct ev_loop *loop, ev_timer *w, int revents) { + auto c = static_cast(w->data); + + (void)c->change_local_addr(); +} +} // namespace + +namespace { +void key_updatecb(struct ev_loop *loop, ev_timer *w, int revents) { + auto c = static_cast(w->data); + + if (!c->initiate_key_update()) { + c->disconnect(); + } +} +} // namespace + +namespace { +void delay_streamcb(struct ev_loop *loop, ev_timer *w, int revents) { + auto c = static_cast(w->data); + + ev_timer_stop(loop, w); + c->on_extend_max_streams(); + (void)c->on_write(); +} +} // namespace + +namespace { +void siginthandler(struct ev_loop *loop, ev_signal *w, int revents) { + ev_break(loop, EVBREAK_ALL); +} +} // namespace + +Client::Client(struct ev_loop *loop, uint32_t client_chosen_version, + uint32_t original_version) + : loop_{loop}, + client_chosen_version_{client_chosen_version}, + original_version_{original_version}, + no_gso_{ +#ifdef UDP_SEGMENT + config.no_gso +#else // !defined(UDP_SEGMENT) + true +#endif // !defined(UDP_SEGMENT) + } { + ev_io_init(&wev_, writecb, 0, EV_WRITE); + wev_.data = this; + ev_timer_init(&timer_, timeoutcb, 0., 0.); + timer_.data = this; + ev_timer_init(&change_local_addr_timer_, change_local_addrcb, + static_cast(config.change_local_addr) / NGTCP2_SECONDS, + 0.); + change_local_addr_timer_.data = this; + ev_timer_init(&key_update_timer_, key_updatecb, + static_cast(config.key_update) / NGTCP2_SECONDS, 0.); + key_update_timer_.data = this; + ev_timer_init(&delay_stream_timer_, delay_streamcb, + static_cast(config.delay_stream) / NGTCP2_SECONDS, 0.); + delay_stream_timer_.data = this; + ev_signal_init(&sigintev_, siginthandler, SIGINT); +} + +Client::~Client() { disconnect(); } + +void Client::disconnect() { + tx_.send_blocked = false; + + (void)handle_error(); + + config.tx_loss_prob = 0; + + ev_timer_stop(loop_, &delay_stream_timer_); + ev_timer_stop(loop_, &key_update_timer_); + ev_timer_stop(loop_, &change_local_addr_timer_); + ev_timer_stop(loop_, &timer_); + + ev_io_stop(loop_, &wev_); + + for (auto &ep : endpoints_) { + ev_io_stop(loop_, &ep.rev); + close(ep.fd); + } + + endpoints_.clear(); + + ev_signal_stop(loop_, &sigintev_); +} + +namespace { +int recv_crypto_data(ngtcp2_conn *conn, + ngtcp2_encryption_level encryption_level, uint64_t offset, + const uint8_t *data, size_t datalen, void *user_data) { + if (!config.quiet && !config.no_quic_dump) { + debug::print_crypto_data(encryption_level, {data, datalen}); + } + + return ngtcp2_crypto_recv_crypto_data_cb(conn, encryption_level, offset, data, + datalen, user_data); +} +} // namespace + +namespace { +int recv_stream_data(ngtcp2_conn *conn, uint32_t flags, int64_t stream_id, + uint64_t offset, const uint8_t *data, size_t datalen, + void *user_data, void *stream_user_data) { + if (!config.quiet && !config.no_quic_dump) { + debug::print_stream_data(stream_id, {data, datalen}); + } + + auto c = static_cast(user_data); + + if (!c->recv_stream_data(flags, stream_id, {data, datalen})) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} +} // namespace + +namespace { +int acked_stream_data_offset(ngtcp2_conn *conn, int64_t stream_id, + uint64_t offset, uint64_t datalen, void *user_data, + void *stream_user_data) { + auto c = static_cast(user_data); + if (!c->acked_stream_data_offset(stream_id, datalen)) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + return 0; +} +} // namespace + +namespace { +int handshake_completed(ngtcp2_conn *conn, void *user_data) { + auto c = static_cast(user_data); + + if (!config.quiet) { + debug::handshake_completed(conn, user_data); + } + + if (!c->handshake_completed()) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} +} // namespace + +std::expected Client::handshake_completed() { + if (early_data_ && !tls_session_.get_early_data_accepted()) { + if (!config.quiet) { + std::println(stderr, "Early data was rejected by server"); + } + + // Some TLS backends only report early data rejection after + // handshake completion (e.g., OpenSSL). For TLS backends which + // report it early (e.g., BoringSSL and PicoTLS), the following + // functions are noop. + if (auto rv = ngtcp2_conn_tls_early_data_rejected(conn_); rv != 0) { + std::println(stderr, "ngtcp2_conn_tls_early_data_rejected: {}", + ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + + if (auto rv = proto_codec_->setup_codec(); !rv) { + return rv; + } + } + + if (!config.quiet) { + std::println(stderr, "Negotiated cipher suite is {}", + tls_session_.get_cipher_name()); + if (auto group = tls_session_.get_negotiated_group(); !group.empty()) { + std::println(stderr, "Negotiated group is {}", group); + } + std::println(stderr, "Negotiated ALPN is {}", + tls_session_.get_selected_alpn()); + + if (!config.ech_config_list.empty() && tls_session_.get_ech_accepted()) { + std::println(stderr, "ECH was accepted"); + } + } + + if (!config.tp_file.empty()) { + std::array data; + auto datalen = ngtcp2_conn_encode_0rtt_transport_params2(conn_, data.data(), + data.size()); + if (datalen < 0) { + std::println(stderr, "Could not encode 0-RTT transport parameters: {}", + ngtcp2_strerror(static_cast(datalen))); + } else if (!util::write_transport_params( + config.tp_file, {data.data(), static_cast(datalen)})) { + std::println(stderr, "Could not write transport parameters to {}", + config.tp_file.native()); + } + } + + return {}; +} + +namespace { +int handshake_confirmed(ngtcp2_conn *conn, void *user_data) { + auto c = static_cast(user_data); + + if (!config.quiet) { + debug::handshake_confirmed(conn, user_data); + } + + c->handshake_confirmed(); + + return 0; +} +} // namespace + +bool Client::should_exit() const { + return handshake_confirmed_ && + (!config.wait_for_ticket || ticket_received_) && + ((config.exit_on_first_stream_close && + (config.nstreams == 0 || nstreams_closed_)) || + (config.exit_on_all_streams_close && + config.nstreams == nstreams_done_ && + nstreams_closed_ == nstreams_done_)); +} + +void Client::handshake_confirmed() { + handshake_confirmed_ = true; + + if (config.change_local_addr) { + start_change_local_addr_timer(); + } + if (config.key_update) { + start_key_update_timer(); + } + if (config.delay_stream) { + start_delay_stream_timer(); + } +} + +namespace { +int recv_version_negotiation(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd, + const uint32_t *sv, size_t nsv, void *user_data) { + auto c = static_cast(user_data); + + c->recv_version_negotiation(sv, nsv); + + return 0; +} +} // namespace + +void Client::recv_version_negotiation(const uint32_t *sv, size_t nsv) { + offered_versions_.resize(nsv); + std::ranges::copy_n(sv, as_signed(nsv), + std::ranges::begin(offered_versions_)); +} + +namespace { +int stream_close(ngtcp2_conn *conn, uint32_t flags, int64_t stream_id, + uint64_t rx_app_error_code, uint64_t tx_app_error_code, + void *user_data, void *stream_user_data) { + auto c = static_cast(user_data); + + if (!c->on_stream_close( + stream_id, + (flags & NGTCP2_STREAM_CLOSE2_FLAG_RX_APP_ERROR_CODE_SET) + ? std::make_optional(rx_app_error_code) + : std::nullopt, + (flags & NGTCP2_STREAM_CLOSE2_FLAG_TX_APP_ERROR_CODE_SET) + ? std::make_optional(tx_app_error_code) + : std::nullopt)) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} +} // namespace + +namespace { +int stream_reset(ngtcp2_conn *conn, int64_t stream_id, uint64_t final_size, + uint64_t app_error_code, void *user_data, + void *stream_user_data) { + auto c = static_cast(user_data); + + if (!c->on_stream_reset(stream_id)) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} +} // namespace + +namespace { +int stream_stop_sending(ngtcp2_conn *conn, int64_t stream_id, + uint64_t app_error_code, void *user_data, + void *stream_user_data) { + auto c = static_cast(user_data); + + if (!c->on_stream_stop_sending(stream_id)) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} +} // namespace + +namespace { +int extend_max_local_streams_bidi(ngtcp2_conn *conn, uint64_t max_streams, + void *user_data) { + auto c = static_cast(user_data); + + c->on_extend_max_streams(); + + return 0; +} +} // namespace + +namespace { +void rand_bytes(uint8_t *dest, size_t destlen) { + if (!util::generate_secure_random({dest, destlen})) { + assert(0); + abort(); + } +} +} // namespace + +namespace { +void rand(uint8_t *dest, size_t destlen, const ngtcp2_rand_ctx *rand_ctx) { + rand_bytes(dest, destlen); +} +} // namespace + +namespace { +int get_new_connection_id(ngtcp2_conn *conn, ngtcp2_cid *cid, + ngtcp2_stateless_reset_token *token, size_t cidlen, + void *user_data) { + if (!util::generate_secure_random({cid->data, cidlen})) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + cid->datalen = cidlen; + if (ngtcp2_crypto_generate_stateless_reset_token( + token->data, config.static_secret.data(), config.static_secret.size(), + cid) != 0) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} +} // namespace + +namespace { +int do_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, + const ngtcp2_crypto_cipher_ctx *hp_ctx, const uint8_t *sample) { + if (ngtcp2_crypto_hp_mask(dest, hp, hp_ctx, sample) != 0) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + if (!config.quiet && config.show_secret) { + debug::print_hp_mask({dest, NGTCP2_HP_MASKLEN}, + {sample, NGTCP2_HP_SAMPLELEN}); + } + + return 0; +} +} // namespace + +namespace { +int update_key(ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, + const uint8_t *current_rx_secret, + const uint8_t *current_tx_secret, size_t secretlen, + void *user_data) { + auto c = static_cast(user_data); + + if (auto rv = + c->update_key(rx_secret, tx_secret, rx_aead_ctx, rx_iv, tx_aead_ctx, + tx_iv, current_rx_secret, current_tx_secret, secretlen); + !rv) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} +} // namespace + +namespace { +int path_validation(ngtcp2_conn *conn, uint32_t flags, const ngtcp2_path *path, + const ngtcp2_path *old_path, + ngtcp2_path_validation_result res, void *user_data) { + if (!config.quiet) { + debug::path_validation(path, res); + } + + if (flags & NGTCP2_PATH_VALIDATION_FLAG_PREFERRED_ADDR) { + auto c = static_cast(user_data); + + c->set_remote_addr(path->remote); + } + + return 0; +} +} // namespace + +void Client::set_remote_addr(const ngtcp2_addr &remote_addr) { + remote_addr_.set(remote_addr.addr); +} + +namespace { +int select_preferred_address(ngtcp2_conn *conn, ngtcp2_path *dest, + const ngtcp2_preferred_addr *paddr, + void *user_data) { + auto c = static_cast(user_data); + Address remote_addr; + + if (config.no_preferred_addr) { + return 0; + } + + if (auto rv = c->select_preferred_address(remote_addr, paddr); !rv) { + return 0; + } + + auto ep = c->endpoint_for(remote_addr); + if (!ep) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + ngtcp2_addr_copy_byte(&dest->local, (*ep)->addr.as_sockaddr(), + (*ep)->addr.size()); + ngtcp2_addr_copy_byte(&dest->remote, remote_addr.as_sockaddr(), + remote_addr.size()); + dest->user_data = *ep; + + return 0; +} +} // namespace + +namespace { +int extend_max_stream_data(ngtcp2_conn *conn, int64_t stream_id, + uint64_t max_data, void *user_data, + void *stream_user_data) { + auto c = static_cast(user_data); + if (!c->extend_max_stream_data(stream_id, max_data)) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + return 0; +} +} // namespace + +std::expected Client::extend_max_stream_data(int64_t stream_id, + uint64_t max_data) { + return proto_codec_->extend_max_stream_data(stream_id, max_data); +} + +namespace { +int recv_new_token(ngtcp2_conn *conn, const uint8_t *token, size_t tokenlen, + void *user_data) { + if (config.token_file.empty()) { + return 0; + } + + (void)util::write_token(config.token_file, {token, tokenlen}); + + return 0; +} +} // namespace + +namespace { +int recv_rx_key(ngtcp2_conn *conn, ngtcp2_encryption_level level, + void *user_data) { + if (level != NGTCP2_ENCRYPTION_LEVEL_1RTT) { + return 0; + } + + auto c = static_cast(user_data); + if (!c->setup_codec()) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} +} // namespace + +namespace { +int early_data_rejected(ngtcp2_conn *conn, void *user_data) { + auto c = static_cast(user_data); + + c->early_data_rejected(); + + return 0; +} +} // namespace + +void Client::early_data_rejected() { + proto_codec_->early_data_rejected(); + + nstreams_done_ = 0; + streams_.clear(); +} + +std::expected Client::init(int fd, const Address &local_addr, + const Address &remote_addr, + const char *addr, const char *port, + TLSClientContext &tls_ctx) { + endpoints_.reserve(4); + + endpoints_.emplace_back(); + auto &ep = endpoints_.back(); + ep.addr = local_addr; + ep.client = this; + ep.fd = fd; + ev_io_init(&ep.rev, readcb, fd, EV_READ); + ep.rev.data = &ep; + + remote_addr_ = remote_addr; + addr_ = addr; + port_ = port; + + static constexpr auto callbacks = ngtcp2_callbacks{ + .client_initial = ngtcp2_crypto_client_initial_cb, + .recv_crypto_data = ::recv_crypto_data, + .handshake_completed = ::handshake_completed, + .recv_version_negotiation = ::recv_version_negotiation, + .encrypt = ngtcp2_crypto_encrypt_cb, + .decrypt = ngtcp2_crypto_decrypt_cb, + .hp_mask = do_hp_mask, + .recv_stream_data = ::recv_stream_data, + .acked_stream_data_offset = ::acked_stream_data_offset, + .recv_retry = ngtcp2_crypto_recv_retry_cb, + .extend_max_local_streams_bidi = extend_max_local_streams_bidi, + .rand = rand, + .update_key = ::update_key, + .path_validation = path_validation, + .select_preferred_addr = ::select_preferred_address, + .stream_reset = stream_reset, + .extend_max_stream_data = ::extend_max_stream_data, + .handshake_confirmed = ::handshake_confirmed, + .recv_new_token = ::recv_new_token, + .delete_crypto_aead_ctx = ngtcp2_crypto_delete_crypto_aead_ctx_cb, + .delete_crypto_cipher_ctx = ngtcp2_crypto_delete_crypto_cipher_ctx_cb, + .stream_stop_sending = stream_stop_sending, + .version_negotiation = ngtcp2_crypto_version_negotiation_cb, + .recv_rx_key = ::recv_rx_key, + .tls_early_data_rejected = ::early_data_rejected, + .get_new_connection_id2 = get_new_connection_id, + .get_path_challenge_data2 = ngtcp2_crypto_get_path_challenge_data2_cb, + .stream_close2 = stream_close, + }; + + ngtcp2_cid scid, dcid; + if (config.scid_present) { + scid = config.scid; + } else { + scid.datalen = 17; + if (auto rv = util::generate_secure_random({scid.data, scid.datalen}); + !rv) { + std::println(stderr, "Could not generate source connection ID"); + return rv; + } + } + if (config.dcid.datalen == 0) { + dcid.datalen = 18; + if (auto rv = util::generate_secure_random({dcid.data, dcid.datalen}); + !rv) { + std::println(stderr, "Could not generate destination connection ID"); + return rv; + } + } else { + dcid = config.dcid; + } + + ngtcp2_settings settings; + ngtcp2_settings_default(&settings); + settings.log_write = config.quiet ? nullptr : debug::log_write; + if (!config.qlog_file.empty() || !config.qlog_dir.empty()) { + std::filesystem::path path; + if (!config.qlog_file.empty()) { + path = config.qlog_file; + } else { + path = config.qlog_dir; + path /= util::format_hex(scid.data, as_signed(scid.datalen)); + path += ".sqlog"; + } + qlog_ = fopen(path.c_str(), "w"); + if (qlog_ == nullptr) { + std::println(stderr, "Could not open qlog file {}: {}", path.native(), + strerror(errno)); + return std::unexpected{Error::IO}; + } + settings.qlog_write = qlog_write_cb; + } + + settings.cc_algo = config.cc_algo; + settings.initial_ts = util::timestamp(); + settings.initial_rtt = config.initial_rtt; + settings.max_window = config.max_window; + settings.max_stream_window = config.max_stream_window; + if (config.max_udp_payload_size) { + settings.max_tx_udp_payload_size = config.max_udp_payload_size; + settings.no_tx_udp_payload_size_shaping = 1; + } + settings.handshake_timeout = config.handshake_timeout; + settings.no_pmtud = config.no_pmtud; + settings.ack_thresh = config.ack_thresh; + if (config.initial_pkt_num == UINT32_MAX) { + auto dis = std::uniform_int_distribution(0, INT32_MAX); + settings.initial_pkt_num = dis(randgen); + } else { + settings.initial_pkt_num = config.initial_pkt_num; + } + + std::vector token; + + if (!config.token_file.empty()) { + std::println(stderr, "Reading token file {}", config.token_file.native()); + + auto t = util::read_token(config.token_file); + if (t) { + token = std::move(*t); + settings.token = token.data(); + settings.tokenlen = token.size(); + } + } + + if (!config.available_versions.empty()) { + settings.available_versions = config.available_versions.data(); + settings.available_versionslen = config.available_versions.size(); + } + + if (!config.preferred_versions.empty()) { + settings.preferred_versions = config.preferred_versions.data(); + settings.preferred_versionslen = config.preferred_versions.size(); + } + + settings.original_version = original_version_; + + if (!config.pmtud_probes.empty()) { + settings.pmtud_probes = config.pmtud_probes.data(); + settings.pmtud_probeslen = config.pmtud_probes.size(); + + if (!config.max_udp_payload_size) { + settings.max_tx_udp_payload_size = + *std::ranges::max_element(config.pmtud_probes); + } + } + + ngtcp2_transport_params params; + ngtcp2_transport_params_default(¶ms); + params.initial_max_stream_data_bidi_local = config.max_stream_data_bidi_local; + params.initial_max_stream_data_bidi_remote = + config.max_stream_data_bidi_remote; + params.initial_max_stream_data_uni = config.max_stream_data_uni; + params.initial_max_data = config.max_data; + params.initial_max_streams_bidi = config.max_streams_bidi; + params.initial_max_streams_uni = config.max_streams_uni; + params.max_idle_timeout = config.timeout; + params.active_connection_id_limit = 7; + params.grease_quic_bit = 1; + + auto path = ngtcp2_path{ + .local = as_ngtcp2_addr(ep.addr), + .remote = as_ngtcp2_addr(remote_addr), + .user_data = &ep, + }; + auto rv = + ngtcp2_conn_client_new(&conn_, &dcid, &scid, &path, client_chosen_version_, + &callbacks, &settings, ¶ms, nullptr, this); + + if (rv != 0) { + std::println(stderr, "ngtcp2_conn_client_new: {}", ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + + proto_codec_ = std::make_unique(this, last_error_); + + if (auto rv = tls_session_.init(early_data_, tls_ctx, addr_, this, + client_chosen_version_, ProtoCodec::protocol); + !rv) { + return rv; + } + + ngtcp2_conn_set_tls_native_handle(conn_, tls_session_.get_native_handle()); + + if (early_data_ && !config.tp_file.empty()) { + auto params = util::read_transport_params(config.tp_file); + if (!params) { + early_data_ = false; + } else { + auto rv = ngtcp2_conn_decode_and_set_0rtt_transport_params( + conn_, params->data(), params->size()); + if (rv != 0) { + std::println(stderr, + "ngtcp2_conn_decode_and_set_0rtt_transport_params: {}", + ngtcp2_strerror(rv)); + early_data_ = false; + } else if (auto rv = make_stream_early(); !rv) { + return rv; + } + } + } + + ev_io_start(loop_, &ep.rev); + + ev_signal_start(loop_, &sigintev_); + + return {}; +} + +std::expected +Client::feed_data(const Endpoint &ep, const sockaddr *sa, socklen_t salen, + const ngtcp2_pkt_info *pi, std::span data) { + auto path = ngtcp2_path{ + .local = as_ngtcp2_addr(ep.addr), + .remote{ + .addr = const_cast(sa), + .addrlen = salen, + }, + .user_data = const_cast(&ep), + }; + if (auto rv = ngtcp2_conn_read_pkt(conn_, &path, pi, data.data(), data.size(), + util::timestamp()); + rv != 0) { + std::println(stderr, "ngtcp2_conn_read_pkt: {}", ngtcp2_strerror(rv)); + if (!last_error_.error_code) { + if (rv == NGTCP2_ERR_CRYPTO) { + auto alert = ngtcp2_conn_get_tls_alert2(conn_); + ngtcp2_ccerr_set_tls_alert(&last_error_, alert, nullptr, 0); + + if (alert == TLS_ALERT_ECH_REQUIRED && + !config.ech_config_list_file.empty() && + !tls_session_.write_ech_config_list(config.ech_config_list_file)) { + std::println(stderr, "Could not write ECH retry configs in {}", + config.ech_config_list_file.native()); + } + } else { + ngtcp2_ccerr_set_liberr(&last_error_, rv, nullptr, 0); + } + } + disconnect(); + return std::unexpected{Error::QUIC}; + } + return {}; +} + +std::expected Client::on_read(const Endpoint &ep) { + std::array buf; + sockaddr_storage ss; + size_t pktcnt = 0; + ngtcp2_pkt_info pi; + + iovec msg_iov{ + .iov_base = buf.data(), + .iov_len = buf.size(), + }; + + uint8_t msg_ctrl[CMSG_SPACE(sizeof(int)) + CMSG_SPACE(sizeof(int))]; + + msghdr msg{ + .msg_name = &ss, + .msg_iov = &msg_iov, + .msg_iovlen = 1, + .msg_control = msg_ctrl, + }; + + auto start = util::timestamp(); + + for (; pktcnt < MAX_RECV_PKTS;) { + if (util::recv_pkt_time_threshold_exceeded( + config.cc_algo == NGTCP2_CC_ALGO_BBR, start, pktcnt)) { + break; + } + + msg.msg_namelen = sizeof(ss); + msg.msg_controllen = sizeof(msg_ctrl); + + auto nread = recvmsg(ep.fd, &msg, 0); + + if (nread == -1) { + if (errno != EAGAIN && errno != EWOULDBLOCK) { + std::println(stderr, "recvmsg: {}", strerror(errno)); + } + break; + } + + // Packets less than 21 bytes never be a valid QUIC packet. + if (nread < 21) { + ++pktcnt; + + continue; + } + + pi.ecn = msghdr_get_ecn(&msg, ss.ss_family); + auto gso_size = msghdr_get_udp_gro(&msg); + if (gso_size == 0) { + gso_size = static_cast(nread); + } + + auto data = std::span{buf.data(), static_cast(nread)}; + + for (;;) { + auto datalen = std::min(data.size(), gso_size); + + ++pktcnt; + + if (!config.quiet) { + std::println(stderr, + "Received packet: local={} remote={} ecn={:#x} {} bytes", + util::straddr(ep.addr), + util::straddr(reinterpret_cast(&ss), + msg.msg_namelen), + pi.ecn, datalen); + } + + // Packets less than 21 bytes never be a valid QUIC packet. + if (datalen < 21) { + break; + } + + if (debug::packet_lost(config.rx_loss_prob)) { + if (!config.quiet) { + std::println(stderr, "** Simulated incoming packet loss **"); + } + } else if (auto rv = + feed_data(ep, reinterpret_cast(&ss), + msg.msg_namelen, &pi, {data.data(), datalen}); + !rv) { + return rv; + } + + data = data.subspan(datalen); + + if (data.empty()) { + break; + } + } + } + + if (should_exit()) { + ngtcp2_ccerr_set_application_error(&last_error_, ProtoCodec::no_error, + nullptr, 0); + disconnect(); + return std::unexpected{Error::INTERNAL}; + } + + update_timer(); + + return {}; +} + +std::expected Client::handle_expiry() { + auto now = util::timestamp(); + if (auto rv = ngtcp2_conn_handle_expiry(conn_, now); rv != 0) { + std::println(stderr, "ngtcp2_conn_handle_expiry: {}", ngtcp2_strerror(rv)); + ngtcp2_ccerr_set_liberr(&last_error_, rv, nullptr, 0); + disconnect(); + return std::unexpected{Error::QUIC}; + } + + return {}; +} + +std::expected Client::on_write() { + if (tx_.send_blocked) { + send_blocked_packet(); + + if (tx_.send_blocked) { + return {}; + } + } + + ev_io_stop(loop_, &wev_); + + if (auto rv = write_streams(); !rv) { + return rv; + } + + if (should_exit()) { + ngtcp2_ccerr_set_application_error(&last_error_, ProtoCodec::no_error, + nullptr, 0); + disconnect(); + return std::unexpected{Error::INTERNAL}; + } + + update_timer(); + return {}; +} + +namespace { +ngtcp2_ssize write_pkt(ngtcp2_conn *conn, ngtcp2_path *path, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, + ngtcp2_tstamp ts, void *user_data) { + auto c = static_cast(user_data); + + return c->write_pkt(path, pi, dest, destlen, ts); +} +} // namespace + +ngtcp2_ssize Client::write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, + uint8_t *dest, size_t destlen, + ngtcp2_tstamp ts) { + return proto_codec_->write_pkt(path, pi, dest, destlen, ts); +} + +std::expected Client::write_streams() { + ngtcp2_path_storage ps; + ngtcp2_pkt_info pi; + size_t gso_size; + auto ts = util::timestamp(); + auto txbuf = std::span{txbuf_}; + auto buflen = util::clamp_buffer_size(conn_, txbuf.size(), config.gso_burst); + + ngtcp2_path_storage_zero(&ps); + + auto nwrite = ngtcp2_conn_write_aggregate_pkt2( + conn_, &ps.path, &pi, txbuf.data(), buflen, &gso_size, ::write_pkt, + config.gso_burst, ts); + if (nwrite < 0) { + disconnect(); + return std::unexpected{Error::QUIC}; + } + + ngtcp2_conn_update_pkt_tx_time(conn_, ts); + + if (nwrite == 0) { + return {}; + } + + (void)send_packet_or_blocked( + ps.path, pi.ecn, txbuf.first(static_cast(nwrite)), gso_size); + + return {}; +} + +std::expected +Client::send_packet_or_blocked(const ngtcp2_path &path, unsigned int ecn, + std::span data, size_t gso_size) { + auto &ep = *static_cast(path.user_data); + + auto rest = send_packet(ep, path.remote, ecn, data, gso_size); + if (!rest.empty()) { + on_send_blocked(path, ecn, rest, gso_size); + + return std::unexpected{Error::SEND_BLOCKED}; + } + + return {}; +} + +void Client::update_timer() { + auto expiry = ngtcp2_conn_get_expiry2(conn_); + auto now = util::timestamp(); + + if (expiry <= now) { + if (!config.quiet) { + auto t = static_cast(now - expiry) / NGTCP2_SECONDS; + std::println(stderr, "Timer has already expired: {:.9f}s", t); + } + + ev_feed_event(loop_, &timer_, EV_TIMER); + + return; + } + + auto t = static_cast(expiry - now) / NGTCP2_SECONDS; + if (!config.quiet) { + std::println(stderr, "Set timer={:.9f}s", t); + } + timer_.repeat = t; + ev_timer_again(loop_, &timer_); +} + +#ifdef HAVE_LINUX_RTNETLINK_H +namespace { +std::expected bind_addr(Address &local_addr, int fd, + const InAddr &ia, int family) { + addrinfo hints{ + .ai_flags = AI_PASSIVE, + .ai_family = family, + .ai_socktype = SOCK_DGRAM, + }; + addrinfo *res, *rp; + char *node; + std::array nodebuf; + + if (in_addr_empty(ia)) { + node = nullptr; + } else { + if (inet_ntop(family, in_addr_get_ptr(ia), nodebuf.data(), + nodebuf.size()) == nullptr) { + std::println(stderr, "inet_ntop: {}", strerror(errno)); + return std::unexpected{Error::LIBC}; + } + + node = nodebuf.data(); + } + + if (auto rv = getaddrinfo(node, "0", &hints, &res); rv != 0) { + std::println(stderr, "getaddrinfo: {}", gai_strerror(rv)); + return std::unexpected{Error::LIBC}; + } + + auto res_d = defer([res] { freeaddrinfo(res); }); + + for (rp = res; rp; rp = rp->ai_next) { + if (bind(fd, rp->ai_addr, rp->ai_addrlen) != -1) { + break; + } + } + + if (!rp) { + std::println(stderr, "Could not bind"); + return std::unexpected{Error::SYSCALL}; + } + + sockaddr_storage ss; + socklen_t len = sizeof(ss); + if (getsockname(fd, reinterpret_cast(&ss), &len) == -1) { + std::println(stderr, "getsockname: {}", strerror(errno)); + return std::unexpected{Error::SYSCALL}; + } + + local_addr.set(reinterpret_cast(&ss)); + + return {}; +} +} // namespace +#endif // defined(HAVE_LINUX_RTNETLINK_H) + +#ifndef HAVE_LINUX_RTNETLINK_H +namespace { +std::expected connect_sock(Address &local_addr, int fd, + const Address &remote_addr) { + if (connect(fd, remote_addr.as_sockaddr(), remote_addr.size()) != 0) { + std::println(stderr, "connect: {}", strerror(errno)); + return std::unexpected{Error::SYSCALL}; + } + + sockaddr_storage ss; + socklen_t len = sizeof(ss); + if (getsockname(fd, reinterpret_cast(&ss), &len) == -1) { + std::println(stderr, "getsockname: {}", strerror(errno)); + return std::unexpected{Error::SYSCALL}; + } + + local_addr.set(reinterpret_cast(&ss)); + + return {}; +} +} // namespace +#endif // !defined(HAVE_LINUX_RTNETLINK_H) + +namespace { +std::expected udp_sock(int family) { + auto maybe_fd = util::create_nonblock_socket(family, SOCK_DGRAM, IPPROTO_UDP); + if (!maybe_fd) { + return maybe_fd; + } + + auto fd = *maybe_fd; + + fd_set_recv_ecn(fd, family); + fd_set_ip_mtu_discover(fd, family); + fd_set_ip_dontfrag(fd, family); + fd_set_udp_gro(fd); + + return fd; +} +} // namespace + +namespace { +std::expected create_sock(Address &remote_addr, const char *addr, + const char *port) { + addrinfo hints{ + .ai_family = AF_UNSPEC, + .ai_socktype = SOCK_DGRAM, + }; + addrinfo *res, *rp; + + if (auto rv = getaddrinfo(addr, port, &hints, &res); rv != 0) { + std::println(stderr, "getaddrinfo: {}", gai_strerror(rv)); + return std::unexpected{Error::LIBC}; + } + + auto res_d = defer([res] { freeaddrinfo(res); }); + + int fd = -1; + + for (rp = res; rp; rp = rp->ai_next) { + auto maybe_fd = udp_sock(rp->ai_family); + if (!maybe_fd) { + continue; + } + + fd = *maybe_fd; + + break; + } + + if (!rp) { + std::println(stderr, "Could not create socket"); + return std::unexpected{Error::SYSCALL}; + } + + remote_addr.set(rp->ai_addr); + + return fd; +} +} // namespace + +std::expected +Client::endpoint_for(const Address &remote_addr) { +#ifdef HAVE_LINUX_RTNETLINK_H + auto maybe_ia = get_local_addr(remote_addr); + if (!maybe_ia) { + std::println( + stderr, "Could not get local address for a selected preferred address"); + return std::unexpected{maybe_ia.error()}; + } + + const auto &ia = *maybe_ia; + + auto current_path = ngtcp2_conn_get_path2(conn_); + auto current_ep = static_cast(current_path->user_data); + if (addreq(current_ep->addr, ia)) { + return current_ep; + } +#endif // defined(HAVE_LINUX_RTNETLINK_H) + + auto family = remote_addr.family(); + + auto maybe_fd = udp_sock(family); + if (!maybe_fd) { + return std::unexpected{maybe_fd.error()}; + } + + auto fd = *maybe_fd; + + Address local_addr; + +#ifdef HAVE_LINUX_RTNETLINK_H + if (auto rv = bind_addr(local_addr, fd, ia, family); !rv) { + close(fd); + return std::unexpected{rv.error()}; + } +#else // !defined(HAVE_LINUX_RTNETLINK_H) + if (auto rv = connect_sock(local_addr, fd, remote_addr); !rv) { + close(fd); + return std::unexpected{rv.error()}; + } +#endif // !defined(HAVE_LINUX_RTNETLINK_H) + + endpoints_.emplace_back(); + auto &ep = endpoints_.back(); + ep.addr = local_addr; + ep.client = this; + ep.fd = fd; + ev_io_init(&ep.rev, readcb, fd, EV_READ); + ep.rev.data = &ep; + + ev_io_start(loop_, &ep.rev); + + return &ep; +} + +void Client::start_change_local_addr_timer() { + ev_timer_start(loop_, &change_local_addr_timer_); +} + +std::expected Client::change_local_addr() { + Address local_addr; + + if (!config.quiet) { + std::println(stderr, "Changing local address"); + } + + auto family = remote_addr_.family(); + + auto maybe_nfd = udp_sock(family); + if (!maybe_nfd) { + return std::unexpected{maybe_nfd.error()}; + } + + auto nfd = *maybe_nfd; + +#ifdef HAVE_LINUX_RTNETLINK_H + auto maybe_ia = get_local_addr(remote_addr_); + if (!maybe_ia) { + std::println(stderr, "Could not get local address"); + close(nfd); + return std::unexpected{maybe_ia.error()}; + } + + if (auto rv = bind_addr(local_addr, nfd, *maybe_ia, family); !rv) { + close(nfd); + return rv; + } +#else // !defined(HAVE_LINUX_RTNETLINK_H) + if (auto rv = connect_sock(local_addr, nfd, remote_addr_); !rv) { + close(nfd); + return rv; + } +#endif // !defined(HAVE_LINUX_RTNETLINK_H) + + if (!config.quiet) { + std::println(stderr, "Local address is now {}", util::straddr(local_addr)); + } + + endpoints_.emplace_back(); + auto &ep = endpoints_.back(); + ep.addr = local_addr; + ep.client = this; + ep.fd = nfd; + ev_io_init(&ep.rev, readcb, nfd, EV_READ); + ep.rev.data = &ep; + + auto addr = as_ngtcp2_addr(local_addr); + + if (config.nat_rebinding) { + ngtcp2_conn_set_local_addr(conn_, &addr); + ngtcp2_conn_set_path_user_data(conn_, &ep); + } else { + auto path = ngtcp2_path{ + .local = addr, + .remote = as_ngtcp2_addr(remote_addr_), + .user_data = &ep, + }; + if (auto rv = ngtcp2_conn_initiate_immediate_migration(conn_, &path, + util::timestamp()); + rv != 0) { + std::println(stderr, "ngtcp2_conn_initiate_immediate_migration: {}", + ngtcp2_strerror(rv)); + } + } + + ev_io_start(loop_, &ep.rev); + + return {}; +} + +void Client::start_key_update_timer() { + ev_timer_start(loop_, &key_update_timer_); +} + +std::expected +Client::update_key(uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, + const uint8_t *current_rx_secret, + const uint8_t *current_tx_secret, size_t secretlen) { + if (!config.quiet) { + std::println(stderr, "Updating traffic key"); + } + + auto crypto_ctx = ngtcp2_conn_get_crypto_ctx2(conn_); + auto aead = &crypto_ctx->aead; + auto keylen = ngtcp2_crypto_aead_keylen(aead); + auto ivlen = ngtcp2_crypto_packet_protection_ivlen(aead); + + ++nkey_update_; + + std::array rx_key, tx_key; + + if (ngtcp2_crypto_update_key(conn_, rx_secret, tx_secret, rx_aead_ctx, + rx_key.data(), rx_iv, tx_aead_ctx, tx_key.data(), + tx_iv, current_rx_secret, current_tx_secret, + secretlen) != 0) { + return std::unexpected{Error::QUIC}; + } + + if (!config.quiet && config.show_secret) { + std::println(stderr, "application_traffic rx secret {}", nkey_update_); + debug::print_secrets({rx_secret, secretlen}, {rx_key.data(), keylen}, + {rx_iv, ivlen}); + std::println(stderr, "application_traffic tx secret {}", nkey_update_); + debug::print_secrets({tx_secret, secretlen}, {tx_key.data(), keylen}, + {tx_iv, ivlen}); + } + + return {}; +} + +std::expected Client::initiate_key_update() { + if (!config.quiet) { + std::println(stderr, "Initiate key update"); + } + + if (auto rv = ngtcp2_conn_initiate_key_update(conn_, util::timestamp()); + rv != 0) { + std::println(stderr, "ngtcp2_conn_initiate_key_update: {}", + ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + + return {}; +} + +void Client::start_delay_stream_timer() { + ev_timer_start(loop_, &delay_stream_timer_); +} + +std::expected Client::send_packet(const Endpoint &ep, + const ngtcp2_addr &remote_addr, + unsigned int ecn, + std::span data) { + auto rest = send_packet(ep, remote_addr, ecn, data, data.size()); + if (!rest.empty()) { + return std::unexpected{Error::SEND_BLOCKED}; + } + + return {}; +} + +std::span Client::send_packet(const Endpoint &ep, + const ngtcp2_addr &remote_addr, + unsigned int ecn, + std::span data, + size_t gso_size) { + assert(gso_size); + + if (debug::packet_lost(config.tx_loss_prob)) { + if (!config.quiet) { + std::println(stderr, "** Simulated outgoing packet loss **"); + } + return {}; + } + + if (no_gso_ && data.size() > gso_size) { + for (; !data.empty();) { + auto len = std::min(gso_size, data.size()); + + auto rest = send_packet(ep, remote_addr, ecn, data.first(len), len); + if (!rest.empty()) { + assert(rest.size() == len); + + return data; + } + + data = data.subspan(len); + } + + return {}; + } + + iovec msg_iov{ + .iov_base = const_cast(data.data()), + .iov_len = data.size(), + }; + + uint8_t msg_ctrl[CMSG_SPACE(sizeof(int)) + CMSG_SPACE(sizeof(uint16_t))]{}; + + msghdr msg{ +#ifdef HAVE_LINUX_RTNETLINK_H + .msg_name = const_cast(remote_addr.addr), + .msg_namelen = remote_addr.addrlen, +#endif // defined(HAVE_LINUX_RTNETLINK_H) + .msg_iov = &msg_iov, + .msg_iovlen = 1, + .msg_control = msg_ctrl, + .msg_controllen = sizeof(msg_ctrl), + }; + + size_t controllen = 0; + + auto cm = CMSG_FIRSTHDR(&msg); + controllen += CMSG_SPACE(sizeof(int)); + cm->cmsg_len = CMSG_LEN(sizeof(int)); + memcpy(CMSG_DATA(cm), &ecn, sizeof(ecn)); + + switch (remote_addr.addr->sa_family) { + case AF_INET: + cm->cmsg_level = IPPROTO_IP; + cm->cmsg_type = IP_TOS; + + break; + case AF_INET6: + cm->cmsg_level = IPPROTO_IPV6; + cm->cmsg_type = IPV6_TCLASS; + + break; + default: + assert(0); + } + +#ifdef UDP_SEGMENT + if (data.size() > gso_size) { + controllen += CMSG_SPACE(sizeof(uint16_t)); + cm = CMSG_NXTHDR(&msg, cm); + cm->cmsg_level = SOL_UDP; + cm->cmsg_type = UDP_SEGMENT; + cm->cmsg_len = CMSG_LEN(sizeof(uint16_t)); + auto n = static_cast(gso_size); + memcpy(CMSG_DATA(cm), &n, sizeof(n)); + } +#endif // defined(UDP_SEGMENT) + + msg.msg_controllen = +#ifndef __APPLE__ + controllen +#else // defined(__APPLE__) + static_cast(controllen) +#endif // defined(__APPLE__) + ; + + ssize_t nwrite = 0; + + do { + nwrite = sendmsg(ep.fd, &msg, 0); + } while (nwrite == -1 && errno == EINTR); + + if (nwrite == -1) { + switch (errno) { + case EAGAIN: +#if EAGAIN != EWOULDBLOCK + case EWOULDBLOCK: +#endif // EAGAIN != EWOULDBLOCK + return data; +#ifdef UDP_SEGMENT + case EIO: + if (data.size() > gso_size) { + // GSO failure; send each packet in a separate sendmsg call. + std::println(stderr, "sendmsg: disabling GSO due to {}", + strerror(errno)); + + no_gso_ = true; + + return send_packet(ep, remote_addr, ecn, data, gso_size); + } + break; +#endif // defined(UDP_SEGMENT) + } + + std::println(stderr, "sendmsg: {}", strerror(errno)); + + // TODO We have packet which is expected to fail to send (e.g., + // path validation to old path). + return {}; + } + + assert(static_cast(nwrite) == data.size()); + + if (!config.quiet) { + std::println(stderr, "Sent packet: local={} remote={} ecn={:#x} {} bytes", + util::straddr(ep.addr), + util::straddr(remote_addr.addr, remote_addr.addrlen), ecn, + nwrite); + } + + return {}; +} + +void Client::on_send_blocked(const ngtcp2_path &path, unsigned int ecn, + std::span data, size_t gso_size) { + assert(!tx_.send_blocked); + assert(gso_size); + + tx_.send_blocked = true; + + auto &p = tx_.blocked; + + p.remote_addr.set(path.remote.addr); + + auto &ep = *static_cast(path.user_data); + + p.endpoint = &ep; + p.ecn = ecn; + p.data = data; + p.gso_size = gso_size; + + start_wev_endpoint(ep); +} + +void Client::start_wev_endpoint(const Endpoint &ep) { + // We do not close ep.fd, so we can expect that each Endpoint has + // unique fd. + if (ep.fd != wev_.fd) { + if (ev_is_active(&wev_)) { + ev_io_stop(loop_, &wev_); + } + + ev_io_set(&wev_, ep.fd, EV_WRITE); + } + + ev_io_start(loop_, &wev_); +} + +void Client::send_blocked_packet() { + assert(tx_.send_blocked); + + auto &p = tx_.blocked; + + auto rest = send_packet(*p.endpoint, as_ngtcp2_addr(p.remote_addr), p.ecn, + p.data, p.gso_size); + if (!rest.empty()) { + p.data = rest; + + start_wev_endpoint(*p.endpoint); + + return; + } + + tx_.send_blocked = false; +} + +std::expected Client::handle_error() { + if (!conn_ || ngtcp2_conn_in_closing_period2(conn_) || + ngtcp2_conn_in_draining_period2(conn_)) { + return {}; + } + + std::array buf; + + ngtcp2_path_storage ps; + + ngtcp2_path_storage_zero(&ps); + + ngtcp2_pkt_info pi; + + auto nwrite = ngtcp2_conn_write_connection_close( + conn_, &ps.path, &pi, buf.data(), buf.size(), &last_error_, + util::timestamp()); + if (nwrite < 0) { + std::println(stderr, "ngtcp2_conn_write_connection_close: {}", + ngtcp2_strerror(static_cast(nwrite))); + return std::unexpected{Error::QUIC}; + } + + if (nwrite == 0) { + return {}; + } + + return send_packet(*static_cast(ps.path.user_data), + ps.path.remote, pi.ecn, + {buf.data(), static_cast(nwrite)}); +} + +std::expected +Client::on_stream_close(int64_t stream_id, + std::optional rx_app_error_code, + std::optional tx_app_error_code) { + if (!config.quiet) { + std::println(stderr, "QUIC stream {:#x} closed", stream_id); + } + + if (auto rv = proto_codec_->on_stream_close(stream_id, rx_app_error_code, + tx_app_error_code); + !rv) { + return rv; + } + + if (!ngtcp2_conn_is_local_stream2(conn_, stream_id)) { + // TODO We might later add bidi stream extension here. + if (!ngtcp2_is_bidi_stream(stream_id)) { + ngtcp2_conn_extend_max_streams_uni(conn_, 1); + } + } + + auto it = streams_.find(stream_id); + if (it != std::ranges::end(streams_)) { + ++nstreams_closed_; + + streams_.erase(it); + } + + return {}; +} + +std::expected Client::on_stream_reset(int64_t stream_id) { + return proto_codec_->on_stream_reset(stream_id); +} + +std::expected Client::on_stream_stop_sending(int64_t stream_id) { + return proto_codec_->on_stream_stop_sending(stream_id); +} + +std::expected Client::make_stream_early() { + if (auto rv = setup_codec(); !rv) { + return rv; + } + + on_extend_max_streams(); + + return {}; +} + +void Client::on_extend_max_streams() { + int64_t stream_id; + + if ((config.delay_stream && !handshake_confirmed_) || + ev_is_active(&delay_stream_timer_)) { + return; + } + + for (; nstreams_done_ < config.nstreams; ++nstreams_done_) { + if (auto rv = ngtcp2_conn_open_bidi_stream(conn_, &stream_id, nullptr); + rv != 0) { + assert(NGTCP2_ERR_STREAM_ID_BLOCKED == rv); + break; + } + + auto stream = std::make_unique( + config.requests[nstreams_done_ % config.requests.size()], stream_id); + + if (!proto_codec_->submit_request(stream.get())) { + break; + } + + if (!config.download.empty()) { + (void)stream->open_file(stream->req.path); + } + + if (auto [_, rv] = streams_.try_emplace(stream_id, std::move(stream)); + !rv) { + assert(0); + } + } +} + +std::expected +Client::recv_stream_data(uint32_t flags, int64_t stream_id, + std::span data) { + return proto_codec_->recv_stream_data(flags, stream_id, data); +} + +std::expected Client::acked_stream_data_offset(int64_t stream_id, + uint64_t datalen) { + return proto_codec_->acked_stream_data_offset(stream_id, datalen); +} + +std::expected +Client::select_preferred_address(Address &selected_addr, + const ngtcp2_preferred_addr *paddr) { + auto path = ngtcp2_conn_get_path2(conn_); + + switch (path->local.addr->sa_family) { + case AF_INET: + if (!paddr->ipv4_present) { + return std::unexpected{Error::INTERNAL}; + } + selected_addr.skaddr.emplace(paddr->ipv4); + break; + case AF_INET6: + if (!paddr->ipv6_present) { + return std::unexpected{Error::INTERNAL}; + } + selected_addr.skaddr.emplace(paddr->ipv6); + break; + default: + return std::unexpected{Error::INTERNAL}; + } + + if (!config.quiet) { + char host[NI_MAXHOST], service[NI_MAXSERV]; + if (auto rv = getnameinfo(selected_addr.as_sockaddr(), selected_addr.size(), + host, sizeof(host), service, sizeof(service), + NI_NUMERICHOST | NI_NUMERICSERV); + rv != 0) { + std::println(stderr, "getnameinfo: {}", gai_strerror(rv)); + return std::unexpected{Error::LIBC}; + } + + std::println(stderr, "selected server preferred_address is [{}]:{}", host, + service); + } + + return {}; +} + +std::expected Client::setup_codec() { + return proto_codec_->setup_codec(); +} + +const std::vector &Client::get_offered_versions() const { + return offered_versions_; +} + +bool Client::get_early_data() const { return early_data_; } + +Stream *Client::find_stream(int64_t stream_id) const { + auto it = streams_.find(stream_id); + if (it == std::ranges::end(streams_)) { + return nullptr; + } + + return (*it).second.get(); +} + +namespace { +std::expected run(Client &c, const char *addr, const char *port, + TLSClientContext &tls_ctx) { + Address remote_addr, local_addr; + + auto maybe_fd = create_sock(remote_addr, addr, port); + if (!maybe_fd) { + return std::unexpected{maybe_fd.error()}; + } + + auto fd = *maybe_fd; + +#ifdef HAVE_LINUX_RTNETLINK_H + auto maybe_ia = get_local_addr(remote_addr); + if (!maybe_ia) { + std::println(stderr, "Could not get local address"); + close(fd); + return std::unexpected{maybe_ia.error()}; + } + + if (auto rv = bind_addr(local_addr, fd, *maybe_ia, remote_addr.family()); + !rv) { + close(fd); + return rv; + } +#else // !defined(HAVE_LINUX_RTNETLINK_H) + if (auto rv = connect_sock(local_addr, fd, remote_addr); !rv) { + close(fd); + return rv; + } +#endif // !defined(HAVE_LINUX_RTNETLINK_H) + + if (auto rv = c.init(fd, local_addr, remote_addr, addr, port, tls_ctx); !rv) { + return rv; + } + + // TODO Do we need this ? + if (auto rv = c.on_write(); !rv) { + return rv; + } + + ev_run(EV_DEFAULT, 0); + + return {}; +} +} // namespace + +namespace { +std::expected parse_uri(std::string_view uri) { + urlparse_url u; + + if (urlparse_parse_url(uri.data(), uri.size(), /* is_connect = */ 0, &u) != + 0) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + if (!(u.field_set & (1 << URLPARSE_SCHEMA)) || + !(u.field_set & (1 << URLPARSE_HOST))) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + Request req; + + req.scheme = util::get_string(uri, u, URLPARSE_SCHEMA); + + auto host = std::string(util::get_string(uri, u, URLPARSE_HOST)); + if (util::numeric_host(host.c_str(), AF_INET6)) { + req.authority = '['; + req.authority += host; + req.authority += ']'; + } else { + req.authority = std::move(host); + } + + if (u.field_set & (1 << URLPARSE_PORT)) { + req.authority += ':'; + req.authority += util::get_string(uri, u, URLPARSE_PORT); + } + + if (u.field_set & (1 << URLPARSE_PATH)) { + req.path = util::get_string(uri, u, URLPARSE_PATH); + } else { + req.path = "/"; + } + + if (u.field_set & (1 << URLPARSE_QUERY)) { + req.path += '?'; + req.path += util::get_string(uri, u, URLPARSE_QUERY); + } + + return req; +} +} // namespace + +namespace { +std::expected parse_requests(char **argv, size_t argvlen) { + for (size_t i = 0; i < argvlen; ++i) { + auto uri = std::string_view{argv[i]}; + auto maybe_req = parse_uri(uri); + if (!maybe_req) { + std::println(stderr, "Could not parse URI: {}", uri); + return std::unexpected{maybe_req.error()}; + } + config.requests.emplace_back(std::move(*maybe_req)); + } + return {}; +} +} // namespace + +std::ofstream keylog_file; + +namespace { +const char *prog = "client"; +} // namespace + +namespace { +void print_usage(FILE *out) { + std::println(out, "Usage: {} [OPTIONS] [...]", prog); +} +} // namespace + +namespace { +void print_help() { + print_usage(stdout); + + Config config; + + std::cout << R"( + Remote server host (DNS name or IP address). In case of + DNS name, it will be sent in TLS SNI extension. + Remote server port + Remote URI +Options: + -t, --tx-loss=

+ The probability of losing outgoing packets.

must be + [0.0, 1.0], inclusive. 0.0 means no packet loss. 1.0 + means 100% packet loss. + -r, --rx-loss=

+ The probability of losing incoming packets.

must be + [0.0, 1.0], inclusive. 0.0 means no packet loss. 1.0 + means 100% packet loss. + -d, --data= + Read data from , and send them as STREAM data. + -n, --nstreams= + The number of requests. s are used in the order of + appearance in the command-line. If the number of + list is less than , list is wrapped. It + defaults to 0 which means the number of specified. + -v, --version= + Specify QUIC version to use in hex string. If the given + version is not supported by libngtcp2, client will use + QUIC v1 long packet types. Instead of specifying hex + string, there are special aliases available: "v1" + indicates QUIC v1, and "v2" indicates QUIC v2. + Default: )" + << std::hex << "0x" << config.version << std::dec << R"( + --preferred-versions=[[,]...] + Specify QUIC versions in hex string in the order of + preference. Client chooses one of those versions if + client received Version Negotiation packet from server. + These versions must be supported by libngtcp2. Instead + of specifying hex string, there are special aliases + available: "v1" indicates QUIC v1, and "v2" indicates + QUIC v2. + --available-versions=[[,]...] + Specify QUIC versions in hex string that are sent in + available_versions field of version_information + transport parameter. This list can include a version + which is not supported by libngtcp2. Instead of + specifying hex string, there are special aliases + available: "v1" indicates QUIC v1, and "v2" indicates + QUIC v2. + -q, --quiet Suppress debug output. + -s, --show-secret + Print out secrets unless --quiet is used. + --timeout= + Specify idle timeout. + Default: )" + << util::format_duration(config.timeout) << R"( + --ciphers= + Specify the cipher suite list to enable. + Default: )" + << config.ciphers << R"( + --groups= + Specify the supported groups. + Default: )" + << config.groups << R"( + --session-file= + Read/write TLS session from/to . To resume a + session, the previous session must be supplied with this + option. + --tp-file= + Read/write QUIC transport parameters from/to . To + send 0-RTT data, the transport parameters received from + the previous session must be supplied with this option. + --dcid= + Specify initial DCID. is hex string. After + decoded as binary, it should be at least 8 bytes and at + most 20 bytes long. + --scid= + Specify source connection ID. is hex string. If + an empty string is given, zero length connection ID is + assumed. + --change-local-addr= + Client changes local address when elapse + after handshake completes. + --nat-rebinding + When used with --change-local-addr, simulate NAT + rebinding. In other words, client changes local + address, but it does not start path validation. + --key-update= + Client initiates key update when elapse after + handshake completes. + -m, --http-method= + Specify HTTP method. Default: )" + << config.http_method << R"( + --delay-stream= + Delay sending STREAM data in 1-RTT for after + handshake completes. + --no-preferred-addr + Do not try to use preferred address offered by server. + --key= + The path to client private key PEM file. + --cert= + The path to client certificate PEM file. + --download= + The path to the directory to save a downloaded content. + It is undefined if 2 concurrent requests write to the + same file. If a request path does not contain a path + component usable as a file name, it defaults to + "index.html". + --no-quic-dump + Disables printing QUIC STREAM and CRYPTO frame data out. + --no-http-dump + Disables printing HTTP response body out. + --qlog-file= + The path to write qlog. This option and --qlog-dir are + mutually exclusive. + --qlog-dir= + Path to the directory where qlog file is stored. The + file name of each qlog is the Source Connection ID of + client. This option and --qlog-file are mutually + exclusive. + --max-data= + The initial connection-level flow control window. + Default: )" + << util::format_uint_iec(config.max_data) << R"( + --max-stream-data-bidi-local= + The initial stream-level flow control window for a + bidirectional stream that the local endpoint initiates. + Default: )" + << util::format_uint_iec(config.max_stream_data_bidi_local) << R"( + --max-stream-data-bidi-remote= + The initial stream-level flow control window for a + bidirectional stream that the remote endpoint initiates. + Default: )" + << util::format_uint_iec(config.max_stream_data_bidi_remote) << R"( + --max-stream-data-uni= + The initial stream-level flow control window for a + unidirectional stream. + Default: )" + << util::format_uint_iec(config.max_stream_data_uni) << R"( + --max-streams-bidi= + The number of the concurrent bidirectional streams that + the remote endpoint initiates. + Default: )" + << config.max_streams_bidi << R"( + --max-streams-uni= + The number of the concurrent unidirectional streams that + the remote endpoint initiates. + Default: )" + << config.max_streams_uni << R"( + --exit-on-first-stream-close + Exit when a first client initiated HTTP stream is + closed. + --exit-on-all-streams-close + Exit when all client initiated HTTP streams are closed. + --wait-for-ticket + Wait for a ticket to be received before exiting on + --exit-on-first-stream-close or + --exit-on-all-streams-close. --session-file must be + specified. + --disable-early-data + Disable early data. + --cc=(cubic|reno|bbr) + The name of congestion controller algorithm. + Default: )" + << util::strccalgo(config.cc_algo) << R"( + --token-file= + Read/write token from/to . Token is obtained from + NEW_TOKEN frame from server. + --sni= + Send in TLS SNI, overriding the DNS name + specified in . + --initial-rtt= + Set an initial RTT. + Default: )" + << util::format_duration(config.initial_rtt) << R"( + --max-window= + Maximum connection-level flow control window size. The + window auto-tuning is enabled if nonzero value is given, + and window size is scaled up to this value. + Default: )" + << util::format_uint_iec(config.max_window) << R"( + --max-stream-window= + Maximum stream-level flow control window size. The + window auto-tuning is enabled if nonzero value is given, + and window size is scaled up to this value. + Default: )" + << util::format_uint_iec(config.max_stream_window) << R"( + --max-udp-payload-size= + Override maximum UDP payload size that client transmits. + With this option, client assumes that a path supports + byte of UDP datagram payload, without performing + Path MTU Discovery. + --handshake-timeout= + Set the QUIC handshake timeout. It defaults to no + timeout. + --no-pmtud Disables Path MTU Discovery. + --ack-thresh= + The minimum number of the received ACK eliciting packets + that triggers immediate acknowledgement. + Default: )" + << config.ack_thresh << R"( + --initial-pkt-num= + The initial packet number that is used for each packet + number space. It must be in range [0, (1 << 31) - 1], + inclusive. By default, the initial packet number is + chosen randomly. + --pmtud-probes=[[,]...] + Specify UDP datagram payload sizes to probe in Path MTU + Discovery. must be strictly larger than 1200. + --ech-config-list-file= + Read/write ECHConfigList from/to . ECH is only + attempted if an underlying TLS stack supports it. If + the handshake fails with ech_required alert, ECH retry + configs, if provided by server, will be written to + . + --no-gso Disables GSO. + --show-stat Print the connection statistics when the connection is + closed. + --gso-burst= + The maximum number of packets to aggregate for GSO. If + GSO is disabled, this is the maximum number of packets + to send per an event loop in a single connection. It + defaults to 0, which means it is not limited by the + configuration. + -h, --help Display this help and exit. + +--- + + The argument is an integer and an optional unit (e.g., 10K is + 10 * 1024). Units are K, M and G (powers of 1024). + + The argument is an integer and an optional unit (e.g., 1s + is 1 second and 500ms is 500 milliseconds). Units are h, m, s, ms, + us, or ns (hours, minutes, seconds, milliseconds, microseconds, and + nanoseconds respectively). If a unit is omitted, a second is used + as unit. + + The argument is an hex string which must start with "0x" + (e.g., 0x00000001).)" + << std::endl; +} +} // namespace + +int main(int argc, char **argv) { + char *data_path = nullptr; + const char *private_key_file = nullptr; + const char *cert_file = nullptr; + + if (argc) { + prog = basename(argv[0]); + } + + for (;;) { + static int flag = 0; + static constexpr option long_opts[] = { + {"help", no_argument, nullptr, 'h'}, + {"tx-loss", required_argument, nullptr, 't'}, + {"rx-loss", required_argument, nullptr, 'r'}, + {"data", required_argument, nullptr, 'd'}, + {"http-method", required_argument, nullptr, 'm'}, + {"nstreams", required_argument, nullptr, 'n'}, + {"version", required_argument, nullptr, 'v'}, + {"quiet", no_argument, nullptr, 'q'}, + {"show-secret", no_argument, nullptr, 's'}, + {"ciphers", required_argument, &flag, 1}, + {"groups", required_argument, &flag, 2}, + {"timeout", required_argument, &flag, 3}, + {"session-file", required_argument, &flag, 4}, + {"tp-file", required_argument, &flag, 5}, + {"dcid", required_argument, &flag, 6}, + {"change-local-addr", required_argument, &flag, 7}, + {"key-update", required_argument, &flag, 8}, + {"nat-rebinding", no_argument, &flag, 9}, + {"delay-stream", required_argument, &flag, 10}, + {"no-preferred-addr", no_argument, &flag, 11}, + {"key", required_argument, &flag, 12}, + {"cert", required_argument, &flag, 13}, + {"download", required_argument, &flag, 14}, + {"no-quic-dump", no_argument, &flag, 15}, + {"no-http-dump", no_argument, &flag, 16}, + {"qlog-file", required_argument, &flag, 17}, + {"max-data", required_argument, &flag, 18}, + {"max-stream-data-bidi-local", required_argument, &flag, 19}, + {"max-stream-data-bidi-remote", required_argument, &flag, 20}, + {"max-stream-data-uni", required_argument, &flag, 21}, + {"max-streams-bidi", required_argument, &flag, 22}, + {"max-streams-uni", required_argument, &flag, 23}, + {"exit-on-first-stream-close", no_argument, &flag, 24}, + {"disable-early-data", no_argument, &flag, 25}, + {"qlog-dir", required_argument, &flag, 26}, + {"cc", required_argument, &flag, 27}, + {"exit-on-all-streams-close", no_argument, &flag, 28}, + {"token-file", required_argument, &flag, 29}, + {"sni", required_argument, &flag, 30}, + {"initial-rtt", required_argument, &flag, 31}, + {"max-window", required_argument, &flag, 32}, + {"max-stream-window", required_argument, &flag, 33}, + {"scid", required_argument, &flag, 34}, + {"max-udp-payload-size", required_argument, &flag, 35}, + {"handshake-timeout", required_argument, &flag, 36}, + {"available-versions", required_argument, &flag, 37}, + {"no-pmtud", no_argument, &flag, 38}, + {"preferred-versions", required_argument, &flag, 39}, + {"ack-thresh", required_argument, &flag, 40}, + {"wait-for-ticket", no_argument, &flag, 41}, + {"initial-pkt-num", required_argument, &flag, 42}, + {"pmtud-probes", required_argument, &flag, 43}, + {"ech-config-list-file", required_argument, &flag, 44}, + {"no-gso", no_argument, &flag, 45}, + {"show-stat", no_argument, &flag, 46}, + {"gso-burst", required_argument, &flag, 47}, + {}, + }; + + auto optidx = 0; + auto c = getopt_long(argc, argv, "d:him:n:qr:st:v:", long_opts, &optidx); + if (c == -1) { + break; + } + switch (c) { + case 'd': + // --data + data_path = optarg; + break; + case 'h': + // --help + print_help(); + exit(EXIT_SUCCESS); + case 'm': + // --http-method + config.http_method = optarg; + break; + case 'n': + // --streams + if (auto n = util::parse_uint(optarg); !n) { + std::println(stderr, "streams: invalid argument"); + exit(EXIT_FAILURE); + } else if (*n > NGTCP2_MAX_VARINT) { + std::println(stderr, "streams: must not exceed {}", NGTCP2_MAX_VARINT); + exit(EXIT_FAILURE); + } else { + config.nstreams = *n; + } + break; + case 'q': + // --quiet + config.quiet = true; + break; + case 'r': + // --rx-loss + config.rx_loss_prob = strtod(optarg, nullptr); + break; + case 's': + // --show-secret + config.show_secret = true; + break; + case 't': + // --tx-loss + config.tx_loss_prob = strtod(optarg, nullptr); + break; + case 'v': { + // --version + if (optarg == "v1"sv) { + config.version = NGTCP2_PROTO_VER_V1; + break; + } + if (optarg == "v2"sv) { + config.version = NGTCP2_PROTO_VER_V2; + break; + } + auto rv = util::parse_version(optarg); + if (!rv) { + std::println(stderr, "version: invalid version {}", optarg); + exit(EXIT_FAILURE); + } + config.version = *rv; + break; + } + case '?': + print_usage(stderr); + exit(EXIT_FAILURE); + case 0: + switch (flag) { + case 1: + // --ciphers + if (util::crypto_default_ciphers()[0] == '\0') { + std::println(stderr, "ciphers: not supported"); + exit(EXIT_FAILURE); + } + config.ciphers = optarg; + break; + case 2: + // --groups + config.groups = optarg; + break; + case 3: + // --timeout + if (auto t = util::parse_duration(optarg); !t) { + std::println(stderr, "timeout: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.timeout = *t; + } + break; + case 4: + // --session-file + config.session_file = optarg; + break; + case 5: + // --tp-file + config.tp_file = optarg; + break; + case 6: { + // --dcid + auto hexcid = std::string_view{optarg}; + if (hexcid.size() < NGTCP2_MIN_INITIAL_DCIDLEN * 2 || + hexcid.size() > NGTCP2_MAX_CIDLEN * 2) { + std::println(stderr, "dcid: wrong length"); + exit(EXIT_FAILURE); + } + + if (!util::is_hex_string(hexcid)) { + std::println(stderr, "dcid: not hex string"); + exit(EXIT_FAILURE); + } + + auto dcid = util::decode_hex(hexcid); + ngtcp2_cid_init(&config.dcid, + reinterpret_cast(dcid.c_str()), + dcid.size()); + break; + } + case 7: + // --change-local-addr + if (auto t = util::parse_duration(optarg); !t) { + std::println(stderr, "change-local-addr: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.change_local_addr = *t; + } + break; + case 8: + // --key-update + if (auto t = util::parse_duration(optarg); !t) { + std::println(stderr, "key-update: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.key_update = *t; + } + break; + case 9: + // --nat-rebinding + config.nat_rebinding = true; + break; + case 10: + // --delay-stream + if (auto t = util::parse_duration(optarg); !t) { + std::println(stderr, "delay-stream: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.delay_stream = *t; + } + break; + case 11: + // --no-preferred-addr + config.no_preferred_addr = true; + break; + case 12: + // --key + private_key_file = optarg; + break; + case 13: + // --cert + cert_file = optarg; + break; + case 14: + // --download + config.download = optarg; + break; + case 15: + // --no-quic-dump + config.no_quic_dump = true; + break; + case 16: + // --no-http-dump + config.no_http_dump = true; + break; + case 17: + // --qlog-file + config.qlog_file = optarg; + break; + case 18: + // --max-data + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-data: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_data = *n; + } + break; + case 19: + // --max-stream-data-bidi-local + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-stream-data-bidi-local: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_stream_data_bidi_local = *n; + } + break; + case 20: + // --max-stream-data-bidi-remote + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-stream-data-bidi-remote: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_stream_data_bidi_remote = *n; + } + break; + case 21: + // --max-stream-data-uni + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-stream-data-uni: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_stream_data_uni = *n; + } + break; + case 22: + // --max-streams-bidi + if (auto n = util::parse_uint(optarg); !n) { + std::println(stderr, "max-streams-bidi: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_streams_bidi = *n; + } + break; + case 23: + // --max-streams-uni + if (auto n = util::parse_uint(optarg); !n) { + std::println(stderr, "max-streams-uni: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_streams_uni = *n; + } + break; + case 24: + // --exit-on-first-stream-close + config.exit_on_first_stream_close = true; + break; + case 25: + // --disable-early-data + config.disable_early_data = true; + break; + case 26: + // --qlog-dir + config.qlog_dir = optarg; + break; + case 27: { + // --cc + auto cc = std::string_view{optarg}; + if (cc == "cubic"sv) { + config.cc_algo = NGTCP2_CC_ALGO_CUBIC; + break; + } + if (cc == "reno"sv) { + config.cc_algo = NGTCP2_CC_ALGO_RENO; + break; + } + if (cc == "bbr"sv) { + config.cc_algo = NGTCP2_CC_ALGO_BBR; + break; + } + std::println(stderr, "cc: specify cubic, reno, or bbr"); + exit(EXIT_FAILURE); + } + case 28: + // --exit-on-all-streams-close + config.exit_on_all_streams_close = true; + break; + case 29: + // --token-file + config.token_file = optarg; + break; + case 30: + // --sni + config.sni = optarg; + break; + case 31: + // --initial-rtt + if (auto t = util::parse_duration(optarg); !t) { + std::println(stderr, "initial-rtt: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.initial_rtt = *t; + } + break; + case 32: + // --max-window + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-window: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_window = *n; + } + break; + case 33: + // --max-stream-window + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-stream-window: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_stream_window = *n; + } + break; + case 34: { + // --scid + auto hexcid = std::string_view{optarg}; + if (hexcid.size() > NGTCP2_MAX_CIDLEN * 2) { + std::println(stderr, "scid: wrong length"); + exit(EXIT_FAILURE); + } + + if (!util::is_hex_string(hexcid)) { + std::println(stderr, "scid: not hex string"); + exit(EXIT_FAILURE); + } + + auto scid = util::decode_hex(hexcid); + ngtcp2_cid_init(&config.scid, + reinterpret_cast(scid.c_str()), + scid.size()); + config.scid_present = true; + break; + } + case 35: + // --max-udp-payload-size + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-udp-payload-size: invalid argument"); + exit(EXIT_FAILURE); + } else if (*n > NGTCP2_MAX_TX_UDP_PAYLOAD_SIZE) { + std::println(stderr, "max-udp-payload-size: must not exceed {}", + NGTCP2_MAX_TX_UDP_PAYLOAD_SIZE); + exit(EXIT_FAILURE); + } else if (*n == 0) { + std::println(stderr, "max-udp-payload-size: must not be 0"); + } else { + config.max_udp_payload_size = *n; + } + break; + case 36: + // --handshake-timeout + if (auto t = util::parse_duration(optarg); !t) { + std::println(stderr, "handshake-timeout: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.handshake_timeout = *t; + } + break; + case 37: + // --available-versions + if (strlen(optarg) == 0) { + config.available_versions.resize(0); + + break; + } + + config.available_versions = + util::split_str(optarg) | std::ranges::views::transform([](auto &&k) { + if (k == "v1"sv) { + return NGTCP2_PROTO_VER_V1; + } + + if (k == "v2"sv) { + return NGTCP2_PROTO_VER_V2; + } + + auto rv = util::parse_version(k); + if (!rv) { + std::println(stderr, "available-versions: invalid version {}", k); + exit(EXIT_FAILURE); + } + + return *rv; + }) | + std::ranges::to(); + + break; + case 38: + // --no-pmtud + config.no_pmtud = true; + break; + case 39: + // --preferred-versions + if (strlen(optarg) == 0) { + config.preferred_versions.resize(0); + + break; + } + + config.preferred_versions = + util::split_str(optarg) | std::ranges::views::transform([](auto &&k) { + if (k == "v1"sv) { + return NGTCP2_PROTO_VER_V1; + } + + if (k == "v2"sv) { + return NGTCP2_PROTO_VER_V2; + } + + auto rv = util::parse_version(k); + if (!rv) { + std::println(stderr, "preferred-versions: invalid version {}", k); + exit(EXIT_FAILURE); + } + + if (!ngtcp2_is_supported_version(*rv)) { + std::println(stderr, "preferred-versions: unsupported version {}", + k); + exit(EXIT_FAILURE); + } + + return *rv; + }) | + std::ranges::to(); + + if (config.preferred_versions.size() > max_preferred_versionslen) { + std::println(stderr, "preferred-versions: too many versions > {}", + max_preferred_versionslen); + exit(EXIT_FAILURE); + } + + break; + case 40: + // --ack-thresh + if (auto n = util::parse_uint(optarg); !n) { + std::println(stderr, "ack-thresh: invalid argument"); + exit(EXIT_FAILURE); + } else if (*n > 100) { + std::println(stderr, "ack-thresh: must not exceed 100"); + exit(EXIT_FAILURE); + } else { + config.ack_thresh = *n; + } + break; + case 41: + // --wait-for-ticket + config.wait_for_ticket = true; + break; + case 42: + // --initial-pkt-num + if (auto n = util::parse_uint(optarg); !n) { + std::println(stderr, "initial-pkt-num: invalid argument"); + exit(EXIT_FAILURE); + } else if (*n > INT32_MAX) { + std::println(stderr, + "initial-pkt-num: must not exceed (1 << 31) - 1"); + exit(EXIT_FAILURE); + } else { + config.initial_pkt_num = static_cast(*n); + } + break; + case 43: + // --pmtud-probes + if (strlen(optarg) == 0) { + config.pmtud_probes.resize(0); + + break; + } + + config.pmtud_probes = + util::split_str(optarg) | std::ranges::views::transform([](auto &&s) { + auto n = util::parse_uint_iec(s); + if (!n) { + std::println(stderr, "pmtud-probes: invalid argument"); + exit(EXIT_FAILURE); + } + + if (*n <= NGTCP2_MAX_UDP_PAYLOAD_SIZE || + *n > NGTCP2_MAX_TX_UDP_PAYLOAD_SIZE) { + std::println( + stderr, "pmtud-probes: must be in range [{}, {}], inclusive.", + NGTCP2_MAX_UDP_PAYLOAD_SIZE + 1, + NGTCP2_MAX_TX_UDP_PAYLOAD_SIZE); + exit(EXIT_FAILURE); + } + + return static_cast(*n); + }) | + std::ranges::to(); + + break; + case 44: + // --ech-config-list-file + config.ech_config_list_file = optarg; + break; + case 45: + // --no-gso + config.no_gso = true; + break; + case 46: + // --show-stat + config.show_stat = true; + break; + case 47: { + // --gso-burst + auto n = util::parse_uint(optarg); + if (!n) { + std::println(stderr, "gso-burst: invalid argument"); + exit(EXIT_FAILURE); + } + + if (*n > 64) { + std::println(stderr, + "gso-burst: must be in range [0, 64], inclusive."); + exit(EXIT_FAILURE); + } + + config.gso_burst = static_cast(*n); + + break; + } + } + break; + default: + break; + } + } + + if (argc - optind < 2) { + std::println(stderr, "Too few arguments"); + print_usage(stderr); + exit(EXIT_FAILURE); + } + + if (!config.qlog_file.empty() && !config.qlog_dir.empty()) { + std::println(stderr, "qlog-file and qlog-dir are mutually exclusive"); + exit(EXIT_FAILURE); + } + + if (config.exit_on_first_stream_close && config.exit_on_all_streams_close) { + std::println(stderr, "exit-on-first-stream-close and " + "exit-on-all-streams-close are mutually exclusive"); + exit(EXIT_FAILURE); + } + + if (config.wait_for_ticket && config.session_file.empty()) { + std::println(stderr, "wait-for-ticket: session-file must be specified"); + exit(EXIT_FAILURE); + } + + if (data_path) { + auto fd = open(data_path, O_RDONLY); + if (fd == -1) { + std::println(stderr, "data: Could not open file {}: {}", data_path, + strerror(errno)); + exit(EXIT_FAILURE); + } + struct stat st; + if (fstat(fd, &st) != 0) { + std::println(stderr, "data: Could not stat file {}: {}", data_path, + strerror(errno)); + exit(EXIT_FAILURE); + } + config.fd = fd; + config.datalen = static_cast(st.st_size); + if (config.datalen) { + auto addr = mmap(nullptr, config.datalen, PROT_READ, MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) { + std::println(stderr, "data: Could not mmap file {}: {}", data_path, + strerror(errno)); + exit(EXIT_FAILURE); + } + config.data = static_cast(addr); + } + } + + if (!config.ech_config_list_file.empty()) { + auto ech_config = util::read_file(config.ech_config_list_file); + if (!ech_config) { + std::println(stderr, + "ech-config-list-file: Could not read ECHConfigList"); + } else { + config.ech_config_list = std::move(*ech_config); + } + } + + auto addr = argv[optind++]; + auto port = argv[optind++]; + + if (!parse_requests(&argv[optind], static_cast(argc - optind))) { + exit(EXIT_FAILURE); + } + + if (!ngtcp2_is_reserved_version(config.version)) { + if (!config.preferred_versions.empty() && + std::ranges::find(config.preferred_versions, config.version) == + std::ranges::end(config.preferred_versions)) { + std::println(stderr, "preferred-version: must include version {:#x}", + config.version); + exit(EXIT_FAILURE); + } + + if (!config.available_versions.empty() && + std::ranges::find(config.available_versions, config.version) == + std::ranges::end(config.available_versions)) { + std::println(stderr, "available-versions: must include version {:#x}", + config.version); + exit(EXIT_FAILURE); + } + } + + if (config.nstreams == 0) { + config.nstreams = config.requests.size(); + } + + TLSClientContext tls_ctx; + if (!tls_ctx.init(private_key_file, cert_file)) { + exit(EXIT_FAILURE); + } + + auto ev_loop_d = defer([] { ev_loop_destroy(EV_DEFAULT); }); + + auto keylog_filename = getenv("SSLKEYLOGFILE"); + if (keylog_filename) { + keylog_file.open(keylog_filename, std::ios_base::app); + if (keylog_file) { + tls_ctx.enable_keylog(); + } + } + + if (!util::generate_secure_random(config.static_secret)) { + std::println(stderr, "Unable to generate static secret"); + exit(EXIT_FAILURE); + } + + auto client_chosen_version = config.version; + + for (;;) { + Client c(EV_DEFAULT, client_chosen_version, config.version); + + if (!run(c, addr, port, tls_ctx)) { + exit(EXIT_FAILURE); + } + + if (config.preferred_versions.empty()) { + break; + } + + auto &offered_versions = c.get_offered_versions(); + if (offered_versions.empty()) { + break; + } + + client_chosen_version = ngtcp2_select_version( + config.preferred_versions.data(), config.preferred_versions.size(), + offered_versions.data(), offered_versions.size()); + + if (client_chosen_version == 0) { + std::println(stderr, "Unable to select a version"); + exit(EXIT_FAILURE); + } + + if (!config.quiet) { + std::println(stderr, "Client selected version {:#x}", + client_chosen_version); + } + } + + return EXIT_SUCCESS; +} diff --git a/deps/ngtcp2/ngtcp2/examples/client.h b/deps/ngtcp2/ngtcp2/examples/client.h new file mode 100644 index 000000000000..c66d2e720c83 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/client.h @@ -0,0 +1,218 @@ +/* + * ngtcp2 + * + * Copyright (c) 2017 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef CLIENT_H +#define CLIENT_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include "client_base.h" +#include "tls_client_context.h" +#include "tls_client_session.h" +#include "network.h" +#include "shared.h" +#include "template.h" + +#ifdef WITH_EXAMPLE_HTTP3_PROTO_CODEC +# include "http3_client_proto_codec.h" +#endif // WITH_EXAMPLE_HTTP3_PROTO_CODEC + +#ifdef WITH_EXAMPLE_HQ_PROTO_CODEC +# include "hq_client_proto_codec.h" +#endif // WITH_EXAMPLE_HQ_PROTO_CODEC + +using namespace ngtcp2; + +struct Stream { + Stream(const Request &req, int64_t stream_id); + ~Stream(); + + std::expected open_file(std::string_view path); + + Request req; + int64_t stream_id; + int fd{-1}; +#ifdef WITH_EXAMPLE_HQ_PROTO_CODEC + std::string rawreqbuf; + std::span reqbuf; +#endif // WITH_EXAMPLE_HQ_PROTO_CODEC +}; + +class Client; + +struct Endpoint { + Address addr; + ev_io rev; + Client *client{}; + int fd{}; +}; + +class Client : public ClientBase { +public: + Client(struct ev_loop *loop, uint32_t client_chosen_version, + uint32_t original_version); + ~Client(); + + std::expected init(int fd, const Address &local_addr, + const Address &remote_addr, const char *addr, + const char *port, TLSClientContext &tls_ctx); + void disconnect(); + + std::expected on_read(const Endpoint &ep); + std::expected on_write(); + std::expected write_streams(); + std::expected feed_data(const Endpoint &ep, const sockaddr *sa, + socklen_t salen, + const ngtcp2_pkt_info *pi, + std::span data); + std::expected handle_expiry(); + void update_timer(); + std::expected handshake_completed(); + void handshake_confirmed(); + void recv_version_negotiation(const uint32_t *sv, size_t nsv); + + std::expected send_packet(const Endpoint &ep, + const ngtcp2_addr &remote_addr, + unsigned int ecn, + std::span data); + std::span + send_packet(const Endpoint &ep, const ngtcp2_addr &remote_addr, + unsigned int ecn, std::span data, size_t gso_size); + std::expected + send_packet_or_blocked(const ngtcp2_path &path, unsigned int ecn, + std::span data, size_t gso_size); + std::expected + on_stream_close(int64_t stream_id, std::optional rx_app_error_code, + std::optional tx_app_error_code); + void on_extend_max_streams(); + std::expected handle_error(); + std::expected make_stream_early(); + std::expected change_local_addr(); + void start_change_local_addr_timer(); + std::expected + update_key(uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, + const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, + size_t secretlen); + std::expected initiate_key_update(); + void start_key_update_timer(); + void start_delay_stream_timer(); + + std::expected + select_preferred_address(Address &selected_addr, + const ngtcp2_preferred_addr *paddr); + + std::expected endpoint_for(const Address &remote_addr); + + void set_remote_addr(const ngtcp2_addr &remote_addr); + + std::expected setup_codec(); + std::expected recv_stream_data(uint32_t flags, int64_t stream_id, + std::span data); + std::expected acked_stream_data_offset(int64_t stream_id, + uint64_t datalen); + std::expected on_stream_reset(int64_t stream_id); + std::expected on_stream_stop_sending(int64_t stream_id); + std::expected extend_max_stream_data(int64_t stream_id, + uint64_t max_data); + + void on_send_blocked(const ngtcp2_path &path, unsigned int ecn, + std::span data, size_t gso_size); + void start_wev_endpoint(const Endpoint &ep); + void send_blocked_packet(); + ngtcp2_ssize write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, + size_t destlen, ngtcp2_tstamp ts); + + const std::vector &get_offered_versions() const; + + bool get_early_data() const; + void early_data_rejected(); + + bool should_exit() const; + + Stream *find_stream(int64_t stream_id) const; + +private: + std::vector endpoints_; + Address remote_addr_; + ev_io wev_; + ev_timer timer_; + ev_timer change_local_addr_timer_; + ev_timer key_update_timer_; + ev_timer delay_stream_timer_; + ev_signal sigintev_; + struct ev_loop *loop_; + std::unordered_map> streams_; + std::vector offered_versions_; + std::unique_ptr proto_codec_; + // addr_ is the server host address. + const char *addr_{}; + // port_ is the server port. + const char *port_{}; + // nstreams_done_ is the number of streams opened. + size_t nstreams_done_{}; + // nstreams_closed_ is the number of streams get closed. + size_t nstreams_closed_{}; + // nkey_update_ is the number of key update occurred. + size_t nkey_update_{}; + uint32_t client_chosen_version_; + uint32_t original_version_; + // early_data_ is true if client attempts to do 0RTT data transfer. + bool early_data_{}; + // handshake_confirmed_ gets true after handshake has been + // confirmed. + bool handshake_confirmed_{}; + bool no_gso_; + + struct { + bool send_blocked; + // blocked field is effective only when send_blocked is true. + struct { + const Endpoint *endpoint; + Address remote_addr; + unsigned int ecn; + std::span data; + size_t gso_size; + } blocked; + } tx_{}; + std::array txbuf_; +}; + +#endif // !defined(CLIENT_H) diff --git a/deps/ngtcp2/ngtcp2/examples/client_base.cc b/deps/ngtcp2/ngtcp2/examples/client_base.cc new file mode 100644 index 000000000000..0f3eb2c9553f --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/client_base.cc @@ -0,0 +1,78 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "client_base.h" + +#include +#include +#include + +#include "debug.h" +#include "template.h" +#include "util.h" + +using namespace ngtcp2; +using namespace std::literals; + +extern Config config; + +static ngtcp2_conn *get_conn(ngtcp2_crypto_conn_ref *conn_ref) { + auto c = static_cast(conn_ref->user_data); + return c->conn(); +} + +ClientBase::ClientBase() : conn_ref_{get_conn, this} { + ngtcp2_ccerr_default(&last_error_); +} + +ClientBase::~ClientBase() { + if (conn_) { + if (config.show_stat) { + debug::print_conn_info(conn_); + } + + ngtcp2_conn_del(conn_); + } + + if (qlog_) { + fclose(qlog_); + } +} + +ngtcp2_conn *ClientBase::conn() const { return conn_; } + +void qlog_write_cb(void *user_data, uint32_t flags, const void *data, + size_t datalen) { + auto c = static_cast(user_data); + c->write_qlog(data, datalen); +} + +void ClientBase::write_qlog(const void *data, size_t datalen) { + assert(qlog_); + fwrite(data, 1, datalen, qlog_); +} + +ngtcp2_crypto_conn_ref *ClientBase::conn_ref() { return &conn_ref_; } + +void ClientBase::ticket_received() { ticket_received_ = true; } diff --git a/deps/ngtcp2/ngtcp2/examples/client_base.h b/deps/ngtcp2/ngtcp2/examples/client_base.h new file mode 100644 index 000000000000..88e296cd2b24 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/client_base.h @@ -0,0 +1,236 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef CLIENT_BASE_H +#define CLIENT_BASE_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include +#include +#include +#include +#include + +#include + +#include "tls_client_session.h" +#include "network.h" +#include "shared.h" +#include "util.h" + +using namespace ngtcp2; + +struct Request { + std::string_view scheme; + std::string authority; + std::string path; +}; + +struct Config { + ngtcp2_cid dcid{}; + ngtcp2_cid scid{}; + bool scid_present{}; + // tx_loss_prob is probability of losing outgoing packet. + double tx_loss_prob{}; + // rx_loss_prob is probability of losing incoming packet. + double rx_loss_prob{}; + // fd is a file descriptor to read input for streams. + int fd{-1}; + // ciphers is the list of enabled ciphers. + const char *ciphers{util::crypto_default_ciphers()}; + // groups is the list of supported groups. + const char *groups{util::crypto_default_groups()}; + // nstreams is the number of streams to open. + size_t nstreams{}; + // data is the pointer to memory region which maps file denoted by + // fd. + uint8_t *data{}; + // datalen is the length of file denoted by fd. + size_t datalen{}; + // version is a QUIC version to use. + uint32_t version{NGTCP2_PROTO_VER_V1}; + // quiet suppresses the output normally shown except for the error + // messages. + bool quiet{}; + // timeout is an idle timeout for QUIC connection. + ngtcp2_duration timeout{30 * NGTCP2_SECONDS}; + // session_file is a path to a file to write, and read TLS session. + std::filesystem::path session_file; + // tp_file is a path to a file to write, and read QUIC transport + // parameters. + std::filesystem::path tp_file; + // show_secret is true if transport secrets should be printed out. + bool show_secret{}; + // change_local_addr is the duration after which client changes + // local address. + ngtcp2_duration change_local_addr{}; + // key_update is the duration after which client initiates key + // update. + ngtcp2_duration key_update{}; + // delay_stream is the duration after which client sends the first + // 1-RTT stream. + ngtcp2_duration delay_stream{}; + // nat_rebinding is true if simulated NAT rebinding is enabled. + bool nat_rebinding{}; + // no_preferred_addr is true if client do not follow preferred + // address offered by server. + bool no_preferred_addr{}; + std::string_view http_method{"GET"sv}; + // download is a path to a directory where a downloaded file is + // saved. If it is empty, no file is saved. + std::filesystem::path download; + // requests contains URIs to request. + std::vector requests; + // no_quic_dump is true if hexdump of QUIC STREAM and CRYPTO data + // should be disabled. + bool no_quic_dump{}; + // no_http_dump is true if hexdump of HTTP response body should be + // disabled. + bool no_http_dump{}; + // qlog_file is the path to write qlog. + std::filesystem::path qlog_file; + // qlog_dir is the path to directory where qlog is stored. qlog_dir + // and qlog_file are mutually exclusive. + std::filesystem::path qlog_dir; + // max_data is the initial connection-level flow control window. + uint64_t max_data{24_m}; + // max_stream_data_bidi_local is the initial stream-level flow + // control window for a bidirectional stream that the local endpoint + // initiates. + uint64_t max_stream_data_bidi_local{16_m}; + // max_stream_data_bidi_remote is the initial stream-level flow + // control window for a bidirectional stream that the remote + // endpoint initiates. + uint64_t max_stream_data_bidi_remote{}; + // max_stream_data_uni is the initial stream-level flow control + // window for a unidirectional stream. + uint64_t max_stream_data_uni{16_m}; + // max_streams_bidi is the number of the concurrent bidirectional + // streams. + uint64_t max_streams_bidi{}; + // max_streams_uni is the number of the concurrent unidirectional + // streams. + uint64_t max_streams_uni{100}; + // max_window is the maximum connection-level flow control window + // size if auto-tuning is enabled. + uint64_t max_window{}; + // max_stream_window is the maximum stream-level flow control window + // size if auto-tuning is enabled. + uint64_t max_stream_window{}; + // exit_on_first_stream_close is the flag that if it is true, client + // exits when a first HTTP stream gets closed. It is not + // necessarily the same time when the underlying QUIC stream closes + // due to the QPACK synchronization. + bool exit_on_first_stream_close{}; + // exit_on_all_streams_close is the flag that if it is true, client + // exits when all HTTP streams get closed. + bool exit_on_all_streams_close{}; + // disable_early_data disables early data. + bool disable_early_data{}; + // static_secret is used to derive keying materials for Stateless + // Retry token. + std::array static_secret; + // cc_algo is the congestion controller algorithm. + ngtcp2_cc_algo cc_algo{NGTCP2_CC_ALGO_CUBIC}; + // token_file is a path to file to read or write token from + // NEW_TOKEN frame. + std::filesystem::path token_file; + // sni is the value sent in TLS SNI, overriding DNS name of the + // remote host. + std::string_view sni; + // initial_rtt is an initial RTT. + ngtcp2_duration initial_rtt{NGTCP2_DEFAULT_INITIAL_RTT}; + // max_udp_payload_size is the maximum UDP payload size that client + // transmits. + size_t max_udp_payload_size{}; + // handshake_timeout is the period of time before giving up QUIC + // connection establishment. + ngtcp2_duration handshake_timeout{UINT64_MAX}; + // preferred_versions includes QUIC versions in the order of + // preference. Client uses this field to select a version from the + // version set offered in Version Negotiation packet. + std::vector preferred_versions; + // available_versions includes QUIC versions that are sent in + // available_versions field of version_information + // transport_parameter. + std::vector available_versions; + // no_pmtud disables Path MTU Discovery. + bool no_pmtud{}; + // ack_thresh is the minimum number of the received ACK eliciting + // packets that triggers immediate acknowledgement. + size_t ack_thresh{2}; + // wait_for_ticket, if true, waits for a ticket to be received + // before exiting on exit_on_first_stream_close or + // exit_on_all_streams_close. + bool wait_for_ticket{}; + // initial_pkt_num is the initial packet number for each packet + // number space. If it is set to UINT32_MAX, it is chosen randomly. + uint32_t initial_pkt_num{UINT32_MAX}; + // pmtud_probes is the array of UDP datagram payload size to probes. + std::vector pmtud_probes; + // ech_config_list contains ECHConfigList. + std::vector ech_config_list; + // ech_config_list_file is a path to a file to read and write + // ECHConfigList. + std::filesystem::path ech_config_list_file; + // no_gso disables GSO. + bool no_gso{}; + // show_stat, if true, displays the connection statistics when the + // connection is closed. + bool show_stat{}; + // gso_burst is the number of packets to aggregate in GSO. 0 means + // it is not limited by the configuration. + size_t gso_burst{}; +}; + +class ClientBase { +public: + ClientBase(); + ~ClientBase(); + + ngtcp2_conn *conn() const; + + void write_qlog(const void *data, size_t datalen); + + ngtcp2_crypto_conn_ref *conn_ref(); + + void ticket_received(); + +protected: + ngtcp2_crypto_conn_ref conn_ref_; + TLSClientSession tls_session_; + FILE *qlog_{}; + ngtcp2_conn *conn_{}; + ngtcp2_ccerr last_error_; + bool ticket_received_{}; +}; + +void qlog_write_cb(void *user_data, uint32_t flags, const void *data, + size_t datalen); + +#endif // !defined(CLIENT_BASE_H) diff --git a/deps/ngtcp2/ngtcp2/examples/debug.cc b/deps/ngtcp2/ngtcp2/examples/debug.cc new file mode 100644 index 000000000000..24acd4829e1f --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/debug.cc @@ -0,0 +1,338 @@ +/* + * ngtcp2 + * + * Copyright (c) 2017 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "debug.h" + +#include + +#include +#include +#include + +#include "util.h" + +using namespace std::literals; + +namespace ngtcp2 { + +namespace debug { + +namespace { +auto randgen = util::make_mt19937(); +} // namespace + +namespace { +auto *outfile = stderr; +} // namespace + +int handshake_completed(ngtcp2_conn *conn, void *user_data) { + std::println(outfile, "QUIC handshake has completed"); + return 0; +} + +int handshake_confirmed(ngtcp2_conn *conn, void *user_data) { + std::println(outfile, "QUIC handshake has been confirmed"); + return 0; +} + +bool packet_lost(double prob) { + auto p = std::uniform_real_distribution<>(0, 1)(randgen); + return p < prob; +} + +void print_crypto_data(ngtcp2_encryption_level encryption_level, + std::span data) { + const char *encryption_level_str; + switch (encryption_level) { + case NGTCP2_ENCRYPTION_LEVEL_INITIAL: + encryption_level_str = "Initial"; + break; + case NGTCP2_ENCRYPTION_LEVEL_HANDSHAKE: + encryption_level_str = "Handshake"; + break; + case NGTCP2_ENCRYPTION_LEVEL_1RTT: + encryption_level_str = "1-RTT"; + break; + default: + assert(0); + abort(); + } + std::println(outfile, "Ordered CRYPTO data in {} crypto level", + encryption_level_str); + (void)util::hexdump(outfile, data); +} + +void print_stream_data(int64_t stream_id, std::span data) { + std::println(outfile, "Ordered STREAM data stream_id={:#x}", stream_id); + (void)util::hexdump(outfile, data); +} + +void print_initial_secret(std::span data) { + std::println(outfile, "initial_secret={}", util::format_hex(data)); +} + +void print_client_in_secret(std::span data) { + std::println(outfile, "client_in_secret={}", util::format_hex(data)); +} + +void print_server_in_secret(std::span data) { + std::println(outfile, "server_in_secret={}", util::format_hex(data)); +} + +void print_handshake_secret(std::span data) { + std::println(outfile, "handshake_secret={}", util::format_hex(data)); +} + +void print_client_hs_secret(std::span data) { + std::println(outfile, "client_hs_secret={}", util::format_hex(data)); +} + +void print_server_hs_secret(std::span data) { + std::println(outfile, "server_hs_secret={}", util::format_hex(data)); +} + +void print_client_0rtt_secret(std::span data) { + std::println(outfile, "client_0rtt_secret={}", util::format_hex(data)); +} + +void print_client_1rtt_secret(std::span data) { + std::println(outfile, "client_1rtt_secret={}", util::format_hex(data)); +} + +void print_server_1rtt_secret(std::span data) { + std::println(outfile, "server_1rtt_secret={}", util::format_hex(data)); +} + +void print_client_pp_key(std::span data) { + std::println(outfile, "+ client_pp_key={}", util::format_hex(data)); +} + +void print_server_pp_key(std::span data) { + std::println(outfile, "+ server_pp_key={}", util::format_hex(data)); +} + +void print_client_pp_iv(std::span data) { + std::println(outfile, "+ client_pp_iv={}", util::format_hex(data)); +} + +void print_server_pp_iv(std::span data) { + std::println(outfile, "+ server_pp_iv={}", util::format_hex(data)); +} + +void print_client_pp_hp(std::span data) { + std::println(outfile, "+ client_pp_hp={}", util::format_hex(data)); +} + +void print_server_pp_hp(std::span data) { + std::println(outfile, "+ server_pp_hp={}", util::format_hex(data)); +} + +void print_secrets(std::span secret, + std::span key, std::span iv, + std::span hp) { + std::println(stderr, R"(+ secret={} ++ key={} ++ iv={} ++ hp={})", + util::format_hex(secret), util::format_hex(key), + util::format_hex(iv), util::format_hex(hp)); +} + +void print_secrets(std::span secret, + std::span key, std::span iv) { + std::println(stderr, R"(+ secret={} ++ key={} ++ iv={})", + util::format_hex(secret), util::format_hex(key), + util::format_hex(iv)); +} + +void print_hp_mask(std::span mask, + std::span sample) { + std::println(outfile, "mask={} sample={}", util::format_hex(mask), + util::format_hex(sample)); +} + +void log_write(void *user_data, char *msg, size_t len) { + msg[len++] = '\n'; + + while (write(fileno(stderr), msg, len) == -1 && errno == EINTR) + ; +} + +void path_validation(const ngtcp2_path *path, + ngtcp2_path_validation_result res) { + auto local_addr = util::straddr( + reinterpret_cast(path->local.addr), path->local.addrlen); + auto remote_addr = util::straddr( + reinterpret_cast(path->remote.addr), path->remote.addrlen); + + std::println( + stderr, "Path validation against path {{local:{}, remote:{}}} {}", + local_addr, remote_addr, + res == NGTCP2_PATH_VALIDATION_RESULT_SUCCESS ? "succeeded" : "failed"); +} + +void print_http_begin_request_headers(int64_t stream_id) { + std::println(outfile, "http: stream {:#x} request headers started", + stream_id); +} + +void print_http_begin_response_headers(int64_t stream_id) { + std::println(outfile, "http: stream {:#x} response headers started", + stream_id); +} + +namespace { +void print_header(std::span name, std::span value, + uint8_t flags) { + std::println(outfile, "[{}: {}]{}", as_string_view(name), + as_string_view(value), + (flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? "(sensitive)" : ""); +} +} // namespace + +namespace { +void print_header(const nghttp3_rcbuf *name, const nghttp3_rcbuf *value, + uint8_t flags) { + auto namebuf = nghttp3_rcbuf_get_buf(name); + auto valuebuf = nghttp3_rcbuf_get_buf(value); + print_header({namebuf.base, namebuf.len}, {valuebuf.base, valuebuf.len}, + flags); +} +} // namespace + +namespace { +void print_header(const nghttp3_nv &nv) { + print_header({nv.name, nv.namelen}, {nv.value, nv.valuelen}, nv.flags); +} +} // namespace + +void print_http_header(int64_t stream_id, const nghttp3_rcbuf *name, + const nghttp3_rcbuf *value, uint8_t flags) { + std::print(outfile, "http: stream {:#x} ", stream_id); + print_header(name, value, flags); +} + +void print_http_end_headers(int64_t stream_id) { + std::println(outfile, "http: stream {:#x} headers ended", stream_id); +} + +void print_http_data(int64_t stream_id, std::span data) { + std::println(outfile, "http: stream {:#x} body {} bytes", stream_id, + data.size()); + (void)util::hexdump(outfile, data); +} + +void print_http_begin_trailers(int64_t stream_id) { + std::println(outfile, "http: stream {:#x} trailers started", stream_id); +} + +void print_http_end_trailers(int64_t stream_id) { + std::println(outfile, "http: stream {:#x} trailers ended", stream_id); +} + +void print_http_request_headers(int64_t stream_id, const nghttp3_nv *nva, + size_t nvlen) { + std::println(outfile, "http: stream {:#x} submit request headers", stream_id); + for (size_t i = 0; i < nvlen; ++i) { + auto &nv = nva[i]; + print_header(nv); + } +} + +void print_http_response_headers(int64_t stream_id, const nghttp3_nv *nva, + size_t nvlen) { + std::println(outfile, "http: stream {:#x} submit response headers", + stream_id); + for (size_t i = 0; i < nvlen; ++i) { + auto &nv = nva[i]; + print_header(nv); + } +} + +void print_http_settings(const nghttp3_proto_settings *settings) { + std::println(outfile, R"(http: remote settings +http: SETTINGS_MAX_FIELD_SECTION_SIZE={} +http: SETTINGS_QPACK_MAX_TABLE_CAPACITY={} +http: SETTINGS_QPACK_BLOCKED_STREAMS={} +http: SETTINGS_ENABLE_CONNECT_PROTOCOL={} +http: SETTINGS_H3_DATAGRAM={})", + settings->max_field_section_size, + settings->qpack_max_dtable_capacity, + settings->qpack_blocked_streams, + settings->enable_connect_protocol, settings->h3_datagram); +} + +void print_http_origin(const uint8_t *origin, size_t originlen) { + std::println(outfile, "http: origin [{}]", + as_string_view(std::span{origin, originlen})); +} + +void print_http_end_origin() { std::println(outfile, "http: origin ended"); } + +std::string_view secret_title(ngtcp2_encryption_level level) { + switch (level) { + case NGTCP2_ENCRYPTION_LEVEL_0RTT: + return "early_traffic"sv; + case NGTCP2_ENCRYPTION_LEVEL_HANDSHAKE: + return "handshake_traffic"sv; + case NGTCP2_ENCRYPTION_LEVEL_1RTT: + return "application_traffic"sv; + default: + assert(0); + abort(); + } +} + +void print_conn_info(ngtcp2_conn *conn) { + ngtcp2_conn_info cinfo; + + ngtcp2_conn_get_conn_info2(conn, &cinfo); + + std::println( + R"(# Connection Statistics (see ngtcp2_conn_info for details) +min_rtt={} +smoothed_rtt={} +rttvar={} +cwnd={} +ssthresh={} +pkt_sent={} +bytes_sent={} +pkt_recv={} +bytes_recv={} +pkt_lost={} +bytes_lost={} +ping_recv={} +pkt_discarded={})", + util::format_durationf(cinfo.min_rtt), + util::format_durationf(cinfo.smoothed_rtt), + util::format_durationf(cinfo.rttvar), cinfo.cwnd, cinfo.ssthresh, + cinfo.pkt_sent, cinfo.bytes_sent, cinfo.pkt_recv, cinfo.bytes_recv, + cinfo.pkt_lost, cinfo.bytes_lost, cinfo.ping_recv, cinfo.pkt_discarded); +} + +} // namespace debug + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/examples/debug.h b/deps/ngtcp2/ngtcp2/examples/debug.h new file mode 100644 index 000000000000..f880833f8369 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/debug.h @@ -0,0 +1,133 @@ +/* + * ngtcp2 + * + * Copyright (c) 2017 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef DEBUG_H +#define DEBUG_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#ifndef __STDC_FORMAT_MACROS +// For travis and PRIu64 +# define __STDC_FORMAT_MACROS +#endif // !defined(__STDC_FORMAT_MACROS) + +#include +#include +#include + +#include +#include + +namespace ngtcp2 { + +namespace debug { + +int handshake_completed(ngtcp2_conn *conn, void *user_data); + +int handshake_confirmed(ngtcp2_conn *conn, void *user_data); + +bool packet_lost(double prob); + +void print_crypto_data(ngtcp2_encryption_level encryption_level, + std::span data); + +void print_stream_data(int64_t stream_id, std::span data); + +void print_initial_secret(std::span data); + +void print_client_in_secret(std::span data); +void print_server_in_secret(std::span data); + +void print_handshake_secret(std::span data); + +void print_client_hs_secret(std::span data); +void print_server_hs_secret(std::span data); + +void print_client_0rtt_secret(std::span data); + +void print_client_1rtt_secret(std::span data); +void print_server_1rtt_secret(std::span data); + +void print_client_pp_key(std::span data); +void print_server_pp_key(std::span data); + +void print_client_pp_iv(std::span data); +void print_server_pp_iv(std::span data); + +void print_client_pp_hp(std::span data); +void print_server_pp_hp(std::span data); + +void print_secrets(std::span secret, + std::span key, std::span iv, + std::span hp); + +void print_secrets(std::span secret, + std::span key, std::span iv); + +void print_hp_mask(std::span mask, + std::span sample); + +void log_write(void *user_data, char *msg, size_t len); + +void path_validation(const ngtcp2_path *path, + ngtcp2_path_validation_result res); + +void print_http_begin_request_headers(int64_t stream_id); + +void print_http_begin_response_headers(int64_t stream_id); + +void print_http_header(int64_t stream_id, const nghttp3_rcbuf *name, + const nghttp3_rcbuf *value, uint8_t flags); + +void print_http_end_headers(int64_t stream_id); + +void print_http_data(int64_t stream_id, std::span data); + +void print_http_begin_trailers(int64_t stream_id); + +void print_http_end_trailers(int64_t stream_id); + +void print_http_request_headers(int64_t stream_id, const nghttp3_nv *nva, + size_t nvlen); + +void print_http_response_headers(int64_t stream_id, const nghttp3_nv *nva, + size_t nvlen); + +void print_http_settings(const nghttp3_proto_settings *settings); + +void print_http_origin(const uint8_t *origin, size_t originlen); + +void print_http_end_origin(); + +std::string_view secret_title(ngtcp2_encryption_level level); + +void print_conn_info(ngtcp2_conn *conn); + +} // namespace debug + +} // namespace ngtcp2 + +#endif // !defined(DEBUG_H) diff --git a/deps/ngtcp2/ngtcp2/examples/examplestest.cc b/deps/ngtcp2/ngtcp2/examples/examplestest.cc new file mode 100644 index 000000000000..9e0fbed9d6b2 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/examplestest.cc @@ -0,0 +1,55 @@ +/* + * ngtcp2 + * + * Copyright (c) 2018 ngtcp2 contributors + * Copyright (c) 2013 nghttp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include "munit.h" + +// include test cases' include files here +#include "util_test.h" +#include "siphash_test.h" +#ifdef WITH_EXAMPLE_WOLFSSL +# include "sim_test.h" +#endif // defined(WITH_EXAMPLE_WOLFSSL) + +int main(int argc, char *argv[]) { + const MunitSuite suites[] = { + ngtcp2::util_suite, + ngtcp2::siphash_suite, +#ifdef WITH_EXAMPLE_WOLFSSL + ngtcp2::sim_suite, +#endif // defined(WITH_EXAMPLE_WOLFSSL) + {}, + }; + const MunitSuite suite = { + .prefix = "", + .suites = suites, + .iterations = 1, + }; + + return munit_suite_main(&suite, nullptr, argc, argv); +} diff --git a/deps/ngtcp2/ngtcp2/examples/gtlssimpleclient.c b/deps/ngtcp2/ngtcp2/examples/gtlssimpleclient.c new file mode 100644 index 000000000000..955132c3aa84 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/gtlssimpleclient.c @@ -0,0 +1,698 @@ +/* + * ngtcp2 + * + * Copyright (c) 2021-2022 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifdef HAVE_CONFIG_H +# include +#endif /* defined(HAVE_CONFIG_H) */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include + +#define REMOTE_HOST "127.0.0.1" +#define REMOTE_PORT "4433" +#define ALPN "hq-interop" +#define MESSAGE "GET /\r\n" + +/* + * Example 1: Handshake with www.google.com + * + * #define REMOTE_HOST "www.google.com" + * #define REMOTE_PORT "443" + * #define ALPN "h3" + * + * and undefine MESSAGE macro. + */ + +static uint64_t timestamp(void) { + struct timespec tp; + + if (clock_gettime(CLOCK_MONOTONIC, &tp) != 0) { + fprintf(stderr, "clock_gettime: %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + + return (uint64_t)tp.tv_sec * NGTCP2_SECONDS + (uint64_t)tp.tv_nsec; +} + +static int create_sock(struct sockaddr *addr, socklen_t *paddrlen, + const char *host, const char *port) { + struct addrinfo hints = {0}; + struct addrinfo *res, *rp; + int rv; + int fd = -1; + + hints.ai_flags = AF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + + rv = getaddrinfo(host, port, &hints, &res); + if (rv != 0) { + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); + return -1; + } + + for (rp = res; rp; rp = rp->ai_next) { + fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + if (fd == -1) { + continue; + } + + break; + } + + if (fd == -1) { + goto end; + } + + *paddrlen = rp->ai_addrlen; + memcpy(addr, rp->ai_addr, rp->ai_addrlen); + +end: + freeaddrinfo(res); + + return fd; +} + +static int connect_sock(struct sockaddr *local_addr, socklen_t *plocal_addrlen, + int fd, const struct sockaddr *remote_addr, + size_t remote_addrlen) { + socklen_t len; + + if (connect(fd, remote_addr, (socklen_t)remote_addrlen) != 0) { + fprintf(stderr, "connect: %s\n", strerror(errno)); + return -1; + } + + len = *plocal_addrlen; + + if (getsockname(fd, local_addr, &len) == -1) { + fprintf(stderr, "getsockname: %s\n", strerror(errno)); + return -1; + } + + *plocal_addrlen = len; + + return 0; +} + +struct client { + ngtcp2_crypto_conn_ref conn_ref; + int fd; + struct sockaddr_storage local_addr; + socklen_t local_addrlen; + gnutls_certificate_credentials_t cred; + gnutls_session_t session; + ngtcp2_conn *conn; + + struct { + int64_t stream_id; + const uint8_t *data; + size_t datalen; + size_t nwrite; + } stream; + + ngtcp2_ccerr last_error; + + ev_io rev; + ev_timer timer; +}; + +static int hook_func(gnutls_session_t session, unsigned int htype, + unsigned when, unsigned int incoming, + const gnutls_datum_t *msg) { + (void)session; + (void)htype; + (void)when; + (void)incoming; + (void)msg; + /* we could save session data here */ + + return 0; +} + +static int numeric_host_family(const char *hostname, int family) { + uint8_t dst[sizeof(struct in6_addr)]; + return inet_pton(family, hostname, dst) == 1; +} + +static int numeric_host(const char *hostname) { + return numeric_host_family(hostname, AF_INET) || + numeric_host_family(hostname, AF_INET6); +} + +static const char priority[] = + "NORMAL:-VERS-ALL:+VERS-TLS1.3:-CIPHER-ALL:+AES-128-GCM:+AES-256-GCM:" + "+CHACHA20-POLY1305:+AES-128-CCM:-GROUP-ALL:+GROUP-SECP256R1:+GROUP-X25519:" + "+GROUP-SECP384R1:" + "+GROUP-SECP521R1:%DISABLE_TLS13_COMPAT_MODE"; + +static const gnutls_datum_t alpn = {(uint8_t *)ALPN, sizeof(ALPN) - 1}; + +static int client_gnutls_init(struct client *c) { + int rv = gnutls_certificate_allocate_credentials(&c->cred); + + if (rv == 0) + rv = gnutls_certificate_set_x509_system_trust(c->cred); + if (rv < 0) { + fprintf(stderr, "cred init failed: %d: %s\n", rv, gnutls_strerror(rv)); + return -1; + } + + rv = gnutls_init(&c->session, GNUTLS_CLIENT | GNUTLS_ENABLE_EARLY_DATA | + GNUTLS_NO_END_OF_EARLY_DATA); + if (rv != 0) { + fprintf(stderr, "gnutls_init: %s\n", gnutls_strerror(rv)); + return -1; + } + + if (ngtcp2_crypto_gnutls_configure_client_session(c->session) != 0) { + fprintf(stderr, "ngtcp2_crypto_gnutls_configure_client_session failed\n"); + return -1; + } + + rv = gnutls_priority_set_direct(c->session, priority, NULL); + if (rv != 0) { + fprintf(stderr, "gnutls_priority_set_direct: %s\n", gnutls_strerror(rv)); + return -1; + } + + gnutls_handshake_set_hook_function(c->session, GNUTLS_HANDSHAKE_ANY, + GNUTLS_HOOK_POST, hook_func); + + gnutls_session_set_ptr(c->session, &c->conn_ref); + + rv = gnutls_credentials_set(c->session, GNUTLS_CRD_CERTIFICATE, c->cred); + + if (rv != 0) { + fprintf(stderr, "gnutls_credentials_set: %s\n", gnutls_strerror(rv)); + return -1; + } + + gnutls_alpn_set_protocols(c->session, &alpn, 1, GNUTLS_ALPN_MANDATORY); + + if (!numeric_host(REMOTE_HOST)) { + gnutls_server_name_set(c->session, GNUTLS_NAME_DNS, REMOTE_HOST, + strlen(REMOTE_HOST)); + } else { + gnutls_server_name_set(c->session, GNUTLS_NAME_DNS, "localhost", + strlen("localhost")); + } + + return 0; +} + +static void rand_cb(uint8_t *dest, size_t destlen, + const ngtcp2_rand_ctx *rand_ctx) { + (void)rand_ctx; + + (void)gnutls_rnd(GNUTLS_RND_RANDOM, dest, destlen); +} + +static int get_new_connection_id_cb(ngtcp2_conn *conn, ngtcp2_cid *cid, + ngtcp2_stateless_reset_token *token, + size_t cidlen, void *user_data) { + (void)conn; + (void)user_data; + + if (gnutls_rnd(GNUTLS_RND_RANDOM, cid->data, cidlen) != 0) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + cid->datalen = cidlen; + + if (gnutls_rnd(GNUTLS_RND_RANDOM, token->data, sizeof(token->data)) != 0) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} + +static int extend_max_local_streams_bidi(ngtcp2_conn *conn, + uint64_t max_streams, + void *user_data) { +#ifdef MESSAGE + struct client *c = user_data; + int rv; + int64_t stream_id; + (void)max_streams; + + if (c->stream.stream_id != -1) { + return 0; + } + + rv = ngtcp2_conn_open_bidi_stream(conn, &stream_id, NULL); + if (rv != 0) { + return 0; + } + + c->stream.stream_id = stream_id; + c->stream.data = (const uint8_t *)MESSAGE; + c->stream.datalen = sizeof(MESSAGE) - 1; + + return 0; +#else /* !defined(MESSAGE) */ + (void)conn; + (void)max_streams; + (void)user_data; + + return 0; +#endif /* !defined(MESSAGE) */ +} + +static void log_printf(void *user_data, const char *fmt, ...) { + va_list ap; + (void)user_data; + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + + fprintf(stderr, "\n"); +} + +static int client_quic_init(struct client *c, + const struct sockaddr *remote_addr, + socklen_t remote_addrlen, + const struct sockaddr *local_addr, + socklen_t local_addrlen) { + ngtcp2_path path = { + .local = + { + .addr = (struct sockaddr *)local_addr, + .addrlen = local_addrlen, + }, + .remote = + { + .addr = (struct sockaddr *)remote_addr, + .addrlen = remote_addrlen, + }, + }; + ngtcp2_callbacks callbacks = { + .client_initial = ngtcp2_crypto_client_initial_cb, + .recv_crypto_data = ngtcp2_crypto_recv_crypto_data_cb, + .encrypt = ngtcp2_crypto_encrypt_cb, + .decrypt = ngtcp2_crypto_decrypt_cb, + .hp_mask = ngtcp2_crypto_hp_mask_cb, + .recv_retry = ngtcp2_crypto_recv_retry_cb, + .extend_max_local_streams_bidi = extend_max_local_streams_bidi, + .rand = rand_cb, + .update_key = ngtcp2_crypto_update_key_cb, + .delete_crypto_aead_ctx = ngtcp2_crypto_delete_crypto_aead_ctx_cb, + .delete_crypto_cipher_ctx = ngtcp2_crypto_delete_crypto_cipher_ctx_cb, + .version_negotiation = ngtcp2_crypto_version_negotiation_cb, + .get_new_connection_id2 = get_new_connection_id_cb, + .get_path_challenge_data2 = ngtcp2_crypto_get_path_challenge_data2_cb, + }; + ngtcp2_cid dcid, scid; + ngtcp2_settings settings; + ngtcp2_transport_params params; + int rv; + + dcid.datalen = NGTCP2_MIN_INITIAL_DCIDLEN; + if (gnutls_rnd(GNUTLS_RND_RANDOM, dcid.data, dcid.datalen) != 0) { + fprintf(stderr, "gnutls_rnd failed\n"); + return -1; + } + + scid.datalen = 8; + if (gnutls_rnd(GNUTLS_RND_RANDOM, scid.data, scid.datalen) != 0) { + fprintf(stderr, "gnutls_rnd failed\n"); + return -1; + } + + ngtcp2_settings_default(&settings); + + settings.initial_ts = timestamp(); + settings.log_printf = log_printf; + + ngtcp2_transport_params_default(¶ms); + + params.initial_max_streams_uni = 3; + params.initial_max_stream_data_bidi_local = 128 * 1024; + params.initial_max_data = 1024 * 1024; + + rv = + ngtcp2_conn_client_new(&c->conn, &dcid, &scid, &path, NGTCP2_PROTO_VER_V1, + &callbacks, &settings, ¶ms, NULL, c); + if (rv != 0) { + fprintf(stderr, "ngtcp2_conn_client_new: %s\n", ngtcp2_strerror(rv)); + return -1; + } + + ngtcp2_conn_set_tls_native_handle(c->conn, c->session); + + return 0; +} + +static int client_read(struct client *c) { + uint8_t buf[65536]; + struct sockaddr_storage addr; + struct iovec iov = { + .iov_base = buf, + .iov_len = sizeof(buf), + }; + struct msghdr msg = {0}; + ssize_t nread; + ngtcp2_path path; + ngtcp2_pkt_info pi = {0}; + int rv; + + msg.msg_name = &addr; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + for (;;) { + msg.msg_namelen = sizeof(addr); + + nread = recvmsg(c->fd, &msg, MSG_DONTWAIT); + + if (nread == -1) { + if (errno != EAGAIN && errno != EWOULDBLOCK) { + fprintf(stderr, "recvmsg: %s\n", strerror(errno)); + } + + break; + } + + path.local.addrlen = c->local_addrlen; + path.local.addr = (struct sockaddr *)&c->local_addr; + path.remote.addrlen = msg.msg_namelen; + path.remote.addr = msg.msg_name; + + rv = ngtcp2_conn_read_pkt(c->conn, &path, &pi, buf, (size_t)nread, + timestamp()); + if (rv != 0) { + fprintf(stderr, "ngtcp2_conn_read_pkt: %s\n", ngtcp2_strerror(rv)); + if (!c->last_error.error_code) { + if (rv == NGTCP2_ERR_CRYPTO) { + ngtcp2_ccerr_set_tls_alert( + &c->last_error, ngtcp2_conn_get_tls_alert2(c->conn), NULL, 0); + } else { + ngtcp2_ccerr_set_liberr(&c->last_error, rv, NULL, 0); + } + } + return -1; + } + } + + return 0; +} + +static int client_send_packet(struct client *c, const uint8_t *data, + size_t datalen) { + struct iovec iov = { + .iov_base = (uint8_t *)data, + .iov_len = datalen, + }; + struct msghdr msg = {0}; + ssize_t nwrite; + + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + do { + nwrite = sendmsg(c->fd, &msg, 0); + } while (nwrite == -1 && errno == EINTR); + + if (nwrite == -1) { + fprintf(stderr, "sendmsg: %s\n", strerror(errno)); + + return -1; + } + + return 0; +} + +static size_t client_get_message(struct client *c, int64_t *pstream_id, + int *pfin, ngtcp2_vec *datav, + size_t datavcnt) { + if (datavcnt == 0) { + return 0; + } + + if (c->stream.stream_id != -1 && c->stream.nwrite < c->stream.datalen) { + *pstream_id = c->stream.stream_id; + *pfin = 1; + datav->base = (uint8_t *)c->stream.data + c->stream.nwrite; + datav->len = c->stream.datalen - c->stream.nwrite; + return 1; + } + + *pstream_id = -1; + *pfin = 0; + datav->base = NULL; + datav->len = 0; + + return 0; +} + +static int client_write_streams(struct client *c) { + ngtcp2_tstamp ts = timestamp(); + ngtcp2_pkt_info pi; + ngtcp2_ssize nwrite; + uint8_t buf[1452]; + ngtcp2_path_storage ps; + ngtcp2_vec datav; + size_t datavcnt; + int64_t stream_id; + ngtcp2_ssize wdatalen; + uint32_t flags; + int fin; + + ngtcp2_path_storage_zero(&ps); + + for (;;) { + datavcnt = client_get_message(c, &stream_id, &fin, &datav, 1); + + flags = NGTCP2_WRITE_STREAM_FLAG_MORE; + if (fin) { + flags |= NGTCP2_WRITE_STREAM_FLAG_FIN; + } + + nwrite = ngtcp2_conn_writev_stream(c->conn, &ps.path, &pi, buf, sizeof(buf), + &wdatalen, flags, stream_id, &datav, + datavcnt, ts); + if (nwrite < 0) { + switch (nwrite) { + case NGTCP2_ERR_WRITE_MORE: + c->stream.nwrite += (size_t)wdatalen; + continue; + default: + fprintf(stderr, "ngtcp2_conn_writev_stream: %s\n", + ngtcp2_strerror((int)nwrite)); + ngtcp2_ccerr_set_liberr(&c->last_error, (int)nwrite, NULL, 0); + return -1; + } + } + + if (nwrite == 0) { + return 0; + } + + if (wdatalen > 0) { + c->stream.nwrite += (size_t)wdatalen; + } + + if (client_send_packet(c, buf, (size_t)nwrite) != 0) { + break; + } + } + + return 0; +} + +static int client_write(struct client *c) { + ngtcp2_tstamp expiry, now; + ev_tstamp t; + + if (client_write_streams(c) != 0) { + return -1; + } + + expiry = ngtcp2_conn_get_expiry2(c->conn); + now = timestamp(); + + t = expiry < now ? 1e-9 : (ev_tstamp)(expiry - now) / NGTCP2_SECONDS; + + c->timer.repeat = t; + ev_timer_again(EV_DEFAULT, &c->timer); + + return 0; +} + +static int client_handle_expiry(struct client *c) { + int rv = ngtcp2_conn_handle_expiry(c->conn, timestamp()); + if (rv != 0) { + fprintf(stderr, "ngtcp2_conn_handle_expiry: %s\n", ngtcp2_strerror(rv)); + return -1; + } + + return 0; +} + +static void client_close(struct client *c) { + ngtcp2_ssize nwrite; + ngtcp2_pkt_info pi; + ngtcp2_path_storage ps; + uint8_t buf[1280]; + + if (ngtcp2_conn_in_closing_period2(c->conn) || + ngtcp2_conn_in_draining_period2(c->conn)) { + goto fin; + } + + ngtcp2_path_storage_zero(&ps); + + nwrite = ngtcp2_conn_write_connection_close( + c->conn, &ps.path, &pi, buf, sizeof(buf), &c->last_error, timestamp()); + if (nwrite < 0) { + fprintf(stderr, "ngtcp2_conn_write_connection_close: %s\n", + ngtcp2_strerror((int)nwrite)); + goto fin; + } + + client_send_packet(c, buf, (size_t)nwrite); + +fin: + ev_break(EV_DEFAULT, EVBREAK_ALL); +} + +static void read_cb(struct ev_loop *loop, ev_io *w, int revents) { + struct client *c = w->data; + (void)loop; + (void)revents; + + if (client_read(c) != 0) { + client_close(c); + return; + } + + if (client_write(c) != 0) { + client_close(c); + } +} + +static void timer_cb(struct ev_loop *loop, ev_timer *w, int revents) { + struct client *c = w->data; + (void)loop; + (void)revents; + + if (client_handle_expiry(c) != 0) { + client_close(c); + return; + } + + if (client_write(c) != 0) { + client_close(c); + } +} + +static ngtcp2_conn *get_conn(ngtcp2_crypto_conn_ref *conn_ref) { + struct client *c = conn_ref->user_data; + return c->conn; +} + +static int client_init(struct client *c) { + struct sockaddr_storage remote_addr, local_addr; + socklen_t remote_addrlen, local_addrlen = sizeof(local_addr); + + *c = (struct client){0}; + + ngtcp2_ccerr_default(&c->last_error); + + c->fd = create_sock((struct sockaddr *)&remote_addr, &remote_addrlen, + REMOTE_HOST, REMOTE_PORT); + if (c->fd == -1) { + return -1; + } + + if (connect_sock((struct sockaddr *)&local_addr, &local_addrlen, c->fd, + (struct sockaddr *)&remote_addr, remote_addrlen) != 0) { + return -1; + } + + memcpy(&c->local_addr, &local_addr, sizeof(c->local_addr)); + c->local_addrlen = local_addrlen; + + if (client_gnutls_init(c) != 0) { + return -1; + } + + if (client_quic_init(c, (struct sockaddr *)&remote_addr, remote_addrlen, + (struct sockaddr *)&local_addr, local_addrlen) != 0) { + return -1; + } + + c->stream.stream_id = -1; + + c->conn_ref.get_conn = get_conn; + c->conn_ref.user_data = c; + + ev_io_init(&c->rev, read_cb, c->fd, EV_READ); + c->rev.data = c; + ev_io_start(EV_DEFAULT, &c->rev); + + ev_timer_init(&c->timer, timer_cb, 0., 0.); + c->timer.data = c; + + return 0; +} + +static void client_free(struct client *c) { + ngtcp2_conn_del(c->conn); + gnutls_deinit(c->session); + gnutls_certificate_free_credentials(c->cred); +} + +int main(void) { + struct client c; + + if (client_init(&c) != 0) { + exit(EXIT_FAILURE); + } + + if (client_write(&c) != 0) { + exit(EXIT_FAILURE); + } + + ev_run(EV_DEFAULT, 0); + + client_free(&c); + + return 0; +} diff --git a/deps/ngtcp2/ngtcp2/examples/hq_client_proto_codec.cc b/deps/ngtcp2/ngtcp2/examples/hq_client_proto_codec.cc new file mode 100644 index 000000000000..ed072c8058f7 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/hq_client_proto_codec.cc @@ -0,0 +1,196 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "hq_client_proto_codec.h" + +#include + +#include "client.h" +#include "debug.h" + +extern Config config; + +namespace ngtcp2 { + +bool StreamIDLess::operator()(const Stream *lhs, const Stream *rhs) const { + return lhs->stream_id < rhs->stream_id; +} + +ProtoCodec::ProtoCodec(Client *c, ngtcp2_ccerr &last_error) + : client_{c}, conn_{client_->conn()}, last_error_{last_error} {} + +std::expected +ProtoCodec::recv_stream_data(uint32_t flags, int64_t stream_id, + std::span data) { + auto stream = client_->find_stream(stream_id); + if (!stream) { + return {}; + } + + ngtcp2_conn_extend_max_stream_offset(conn_, stream_id, data.size()); + ngtcp2_conn_extend_max_offset(conn_, data.size()); + + if (stream->fd == -1) { + return {}; + } + + ssize_t nwrite; + + for (; !data.empty();) { + do { + nwrite = write(stream->fd, data.data(), data.size()); + } while (nwrite == -1 && errno == EINTR); + + if (nwrite < 0) { + std::println(stderr, "Could not write data to file: {}", strerror(errno)); + + return {}; + } + + data = data.subspan(static_cast(nwrite)); + } + + return {}; +} + +std::expected +ProtoCodec::on_stream_close(int64_t stream_id, + std::optional rx_app_error_code, + std::optional tx_app_error_code) { + if (!ngtcp2_is_bidi_stream(stream_id)) { + return {}; + } + + if (!config.quiet) { + std::println(stderr, + "HTTP stream {:#x} closed with error codes (RX:{}, TX:{})", + stream_id, util::format_app_error_code(rx_app_error_code), + util::format_app_error_code(tx_app_error_code)); + } + + return {}; +} + +std::expected +ProtoCodec::extend_max_stream_data(int64_t stream_id, uint64_t max_data) { + auto stream = client_->find_stream(stream_id); + if (!stream) { + return {}; + } + + if (!stream->reqbuf.empty()) { + sendq_.emplace(stream); + } + + return {}; +} + +ngtcp2_ssize ProtoCodec::write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, + uint8_t *dest, size_t destlen, + ngtcp2_tstamp ts) { + ngtcp2_vec vec; + + for (;;) { + int64_t stream_id = -1; + size_t vcnt = 0; + uint32_t flags = NGTCP2_WRITE_STREAM_FLAG_MORE; + Stream *stream = nullptr; + + if (!sendq_.empty() && ngtcp2_conn_get_max_data_left2(conn_)) { + stream = *std::ranges::begin(sendq_); + + stream_id = stream->stream_id; + vec.base = const_cast(stream->reqbuf.data()); + vec.len = stream->reqbuf.size(); + vcnt = 1; + flags |= NGTCP2_WRITE_STREAM_FLAG_FIN; + } + + ngtcp2_ssize ndatalen; + + auto nwrite = + ngtcp2_conn_writev_stream(conn_, path, pi, dest, destlen, &ndatalen, + flags, stream_id, &vec, vcnt, ts); + if (nwrite < 0) { + switch (nwrite) { + case NGTCP2_ERR_STREAM_DATA_BLOCKED: + case NGTCP2_ERR_STREAM_SHUT_WR: + assert(ndatalen == -1); + sendq_.erase(std::ranges::begin(sendq_)); + continue; + case NGTCP2_ERR_WRITE_MORE: + assert(ndatalen >= 0); + stream->reqbuf = stream->reqbuf.subspan(as_unsigned(ndatalen)); + if (stream->reqbuf.empty()) { + sendq_.erase(std::ranges::begin(sendq_)); + } + continue; + } + + assert(ndatalen == -1); + + std::println(stderr, "ngtcp2_conn_writev_stream: {}", + ngtcp2_strerror(static_cast(nwrite))); + ngtcp2_ccerr_set_liberr(&last_error_, static_cast(nwrite), nullptr, + 0); + + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + if (ndatalen >= 0) { + stream->reqbuf = stream->reqbuf.subspan(as_unsigned(ndatalen)); + if (stream->reqbuf.empty()) { + sendq_.erase(std::ranges::begin(sendq_)); + } + } + + return nwrite; + } +} + +std::expected ProtoCodec::submit_request(Stream *stream) { + const auto &req = stream->req; + + stream->rawreqbuf = config.http_method; + stream->rawreqbuf += ' '; + stream->rawreqbuf += req.path; + stream->rawreqbuf += "\r\n"; + + stream->reqbuf = as_uint8_span(std::span{stream->rawreqbuf}); + + if (!config.quiet) { + auto nva = std::to_array({ + util::make_nv_nn(":method", config.http_method), + util::make_nv_nn(":path", req.path), + }); + debug::print_http_request_headers(stream->stream_id, nva.data(), + nva.size()); + } + + sendq_.emplace(stream); + + return {}; +} + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/examples/hq_client_proto_codec.h b/deps/ngtcp2/ngtcp2/examples/hq_client_proto_codec.h new file mode 100644 index 000000000000..9e8e30b49af4 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/hq_client_proto_codec.h @@ -0,0 +1,97 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef HQ_CLIENT_PROTO_CODEC_H +#define HQ_CLIENT_PROTO_CODEC_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include +#include +#include + +#include + +#include "shared.h" +#include "client_base.h" + +struct Stream; +class Client; + +namespace ngtcp2 { + +struct StreamIDLess { + bool operator()(const Stream *lhs, const Stream *rhs) const; +}; + +class ProtoCodec { +public: + ProtoCodec(Client *handler, ngtcp2_ccerr &last_error); + + std::expected recv_stream_data(uint32_t flags, int64_t stream_id, + std::span data); + + std::expected acked_stream_data_offset(int64_t stream_id, + uint64_t datalen) { + return {}; + } + + std::expected extend_max_stream_data(int64_t stream_id, + uint64_t max_data); + + void early_data_rejected() {} + + std::expected + on_stream_close(int64_t stream_id, std::optional rx_app_error_code, + std::optional tx_app_error_code); + + std::expected on_stream_reset(int64_t stream_id) { return {}; } + + std::expected on_stream_stop_sending(int64_t stream_id) { + return {}; + } + + std::expected submit_request(Stream *stream); + + ngtcp2_ssize write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, + size_t destlen, ngtcp2_tstamp ts); + + std::expected setup_codec() { return {}; } + + static constexpr auto protocol = AppProtocol::HQ; + static constexpr auto no_error = 0; + +private: + Client *client_; + ngtcp2_conn *conn_; + ngtcp2_ccerr &last_error_; + std::set sendq_; +}; + +} // namespace ngtcp2 + +#endif // !defined(HQ_CLIENT_PROTO_CODEC_H) diff --git a/deps/ngtcp2/ngtcp2/examples/hq_server_proto_codec.cc b/deps/ngtcp2/ngtcp2/examples/hq_server_proto_codec.cc new file mode 100644 index 000000000000..8ef3d5fe314c --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/hq_server_proto_codec.cc @@ -0,0 +1,263 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "hq_server_proto_codec.h" + +#include "server.h" +#include "debug.h" + +extern Config config; + +namespace ngtcp2 { + +bool StreamIDLess::operator()(const Stream *lhs, const Stream *rhs) const { + return lhs->stream_id < rhs->stream_id; +} + +ProtoCodec::ProtoCodec(Handler *h, ngtcp2_ccerr &last_error) + : handler_{h}, conn_{handler_->conn()}, last_error_{last_error} {} + +namespace { +int on_msg_begin(http_parser *htp) { + auto s = static_cast(htp->data); + if (s->eos) { + return -1; + } + return 0; +} +} // namespace + +namespace { +int on_url_cb(http_parser *htp, const char *data, size_t datalen) { + auto s = static_cast(htp->data); + s->uri.append(data, datalen); + return 0; +} +} // namespace + +namespace { +int on_msg_complete(http_parser *htp) { + auto s = static_cast(htp->data); + s->eos = true; + (void)s->start_response(); + return 0; +} +} // namespace + +constexpr auto htp_settings = http_parser_settings{ + .on_message_begin = on_msg_begin, + .on_url = on_url_cb, + .on_message_complete = on_msg_complete, +}; + +std::expected +ProtoCodec::recv_stream_data(uint32_t flags, int64_t stream_id, + std::span data) { + if (!config.quiet && !config.no_quic_dump) { + debug::print_stream_data(stream_id, data); + } + + auto stream = handler_->find_stream(stream_id); + if (!stream) { + return {}; + } + + if (!stream->eos) { + auto nread = http_parser_execute( + &stream->htp, &htp_settings, reinterpret_cast(data.data()), + data.size()); + if (nread != data.size()) { + if (auto rv = ngtcp2_conn_shutdown_stream(conn_, 0, stream_id, + /* app error code */ 1); + rv != 0) { + std::println(stderr, "ngtcp2_conn_shutdown_stream: {}", + ngtcp2_strerror(rv)); + ngtcp2_ccerr_set_liberr(&last_error_, NGTCP2_ERR_INTERNAL, nullptr, 0); + return std::unexpected{Error::QUIC}; + } + } + } + + ngtcp2_conn_extend_max_stream_offset(conn_, stream_id, data.size()); + ngtcp2_conn_extend_max_offset(conn_, data.size()); + + return {}; +} + +std::expected +ProtoCodec::extend_max_stream_data(int64_t stream_id, uint64_t max_data) { + auto stream = handler_->find_stream(stream_id); + if (!stream) { + return {}; + } + + if (!stream->resp_data.empty()) { + sendq_.emplace(stream); + } + + return {}; +} + +ngtcp2_ssize ProtoCodec::write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, + uint8_t *dest, size_t destlen, + ngtcp2_tstamp ts) { + ngtcp2_vec vec; + + for (;;) { + int64_t stream_id = -1; + size_t vcnt = 0; + uint32_t flags = + NGTCP2_WRITE_STREAM_FLAG_MORE | NGTCP2_WRITE_STREAM_FLAG_PADDING; + Stream *stream = nullptr; + + if (!sendq_.empty() && ngtcp2_conn_get_max_data_left2(conn_)) { + stream = *std::ranges::begin(sendq_); + + stream_id = stream->stream_id; + vec.base = const_cast(stream->resp_data.data()); + vec.len = stream->resp_data.size(); + vcnt = 1; + flags |= NGTCP2_WRITE_STREAM_FLAG_FIN; + } + + ngtcp2_ssize ndatalen; + + auto nwrite = + ngtcp2_conn_writev_stream(conn_, path, pi, dest, destlen, &ndatalen, + flags, stream_id, &vec, vcnt, ts); + if (nwrite < 0) { + switch (nwrite) { + case NGTCP2_ERR_STREAM_DATA_BLOCKED: + case NGTCP2_ERR_STREAM_SHUT_WR: + assert(ndatalen == -1); + sendq_.erase(std::ranges::begin(sendq_)); + continue; + case NGTCP2_ERR_WRITE_MORE: + assert(ndatalen >= 0); + stream->resp_data = stream->resp_data.subspan(as_unsigned(ndatalen)); + if (stream->resp_data.empty()) { + sendq_.erase(std::ranges::begin(sendq_)); + } + continue; + } + + assert(ndatalen == -1); + + std::println(stderr, "ngtcp2_conn_writev_stream: {}", + ngtcp2_strerror(static_cast(nwrite))); + ngtcp2_ccerr_set_liberr(&last_error_, static_cast(nwrite), nullptr, + 0); + + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + if (ndatalen >= 0) { + stream->resp_data = stream->resp_data.subspan(as_unsigned(ndatalen)); + if (stream->resp_data.empty()) { + sendq_.erase(std::ranges::begin(sendq_)); + } + } + + return nwrite; + } +} + +std::expected +ProtoCodec::on_stream_close(int64_t stream_id, + std::optional rx_app_error_code, + std::optional tx_app_error_code) { + auto stream = handler_->find_stream(stream_id); + if (!stream) { + return {}; + } + + sendq_.erase(stream); + + if (!config.quiet) { + std::println(stderr, + "HTTP stream {:#x} closed with error codes (RX:{}, TX:{})", + stream_id, util::format_app_error_code(rx_app_error_code), + util::format_app_error_code(tx_app_error_code)); + } + + return {}; +} + +void ProtoCodec::send_status_response(Stream *stream, + unsigned int status_code) { + stream->status_resp_body = make_status_body(status_code); + stream->resp_data = as_uint8_span(std::span{stream->status_resp_body}); + + sendq_.emplace(stream); + + handler_->shutdown_read(stream->stream_id, 0); +} + +std::expected ProtoCodec::start_response(Stream *stream) { + if (stream->uri.empty()) { + send_status_response(stream, 400); + return {}; + } + + auto maybe_req = stream->request_path(); + if (!maybe_req) { + send_status_response(stream, 400); + return {}; + } + + const auto &req = *maybe_req; + + auto path = config.htdocs; + path /= std::filesystem::path{req.path}.relative_path(); + + auto maybe_fe = stream->open_file(path); + if (!maybe_fe) { + send_status_response(stream, 404); + return {}; + } + + const auto &fe = *maybe_fe; + + if (fe.flags & FILE_ENTRY_TYPE_DIR) { + send_status_response(stream, 404); + return {}; + } + + stream->map_file(fe); + + if (!config.quiet) { + auto nva = std::to_array({ + util::make_nv_nn(":status", "200"), + }); + + debug::print_http_response_headers(stream->stream_id, nva.data(), + nva.size()); + } + + sendq_.emplace(stream); + + return {}; +} + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/examples/hq_server_proto_codec.h b/deps/ngtcp2/ngtcp2/examples/hq_server_proto_codec.h new file mode 100644 index 000000000000..a358d24cec68 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/hq_server_proto_codec.h @@ -0,0 +1,99 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef HQ_SERVER_PROTO_CODEC_H +#define HQ_SERVER_PROTO_CODEC_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include +#include +#include + +#include +#include + +#include "shared.h" +#include "server_base.h" + +struct Stream; +class Handler; + +namespace ngtcp2 { + +struct StreamIDLess { + bool operator()(const Stream *lhs, const Stream *rhs) const; +}; + +class ProtoCodec { +public: + ProtoCodec(Handler *handler, ngtcp2_ccerr &last_error); + + std::expected acked_stream_data_offset(int64_t stream_id, + uint64_t datalen) { + return {}; + } + + std::expected on_stream_reset(int64_t stream_id) { return {}; } + + std::expected on_stream_stop_sending(int64_t stream_id) { + return {}; + } + + void extend_max_remote_streams_bidi(uint64_t max_streams) {} + + std::expected extend_max_stream_data(int64_t stream_id, + uint64_t max_data); + + std::expected on_app_tx_ready() { return {}; } + + ngtcp2_ssize write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, + size_t destlen, ngtcp2_tstamp ts); + + std::expected recv_stream_data(uint32_t flags, int64_t stream_id, + std::span data); + + std::expected + on_stream_close(int64_t stream_id, std::optional rx_app_error_code, + std::optional tx_app_error_code); + + std::expected start_response(Stream *stream); + + static constexpr auto protocol = AppProtocol::HQ; + +private: + void send_status_response(Stream *stream, unsigned int status_code); + + Handler *handler_; + ngtcp2_conn *conn_; + ngtcp2_ccerr &last_error_; + std::set sendq_; +}; + +} // namespace ngtcp2 + +#endif // !defined(HQ_SERVER_PROTO_CODEC_H) diff --git a/deps/ngtcp2/ngtcp2/examples/http.cc b/deps/ngtcp2/ngtcp2/examples/http.cc new file mode 100644 index 000000000000..9467a184dfe9 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/http.cc @@ -0,0 +1,140 @@ +/* + * ngtcp2 + * + * Copyright (c) 2017 ngtcp2 contributors + * Copyright (c) 2012 nghttp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "http.h" + +using namespace std::literals; + +namespace ngtcp2 { + +namespace http { + +std::string_view get_reason_phrase(unsigned int status_code) { + switch (status_code) { + case 100: + return "Continue"sv; + case 101: + return "Switching Protocols"sv; + case 200: + return "OK"sv; + case 201: + return "Created"sv; + case 202: + return "Accepted"sv; + case 203: + return "Non-Authoritative Information"sv; + case 204: + return "No Content"sv; + case 205: + return "Reset Content"sv; + case 206: + return "Partial Content"sv; + case 300: + return "Multiple Choices"sv; + case 301: + return "Moved Permanently"sv; + case 302: + return "Found"sv; + case 303: + return "See Other"sv; + case 304: + return "Not Modified"sv; + case 305: + return "Use Proxy"sv; + // case 306: return "(Unused)"sv; + case 307: + return "Temporary Redirect"sv; + case 308: + return "Permanent Redirect"sv; + case 400: + return "Bad Request"sv; + case 401: + return "Unauthorized"sv; + case 402: + return "Payment Required"sv; + case 403: + return "Forbidden"sv; + case 404: + return "Not Found"sv; + case 405: + return "Method Not Allowed"sv; + case 406: + return "Not Acceptable"sv; + case 407: + return "Proxy Authentication Required"sv; + case 408: + return "Request Timeout"sv; + case 409: + return "Conflict"sv; + case 410: + return "Gone"sv; + case 411: + return "Length Required"sv; + case 412: + return "Precondition Failed"sv; + case 413: + return "Payload Too Large"sv; + case 414: + return "URI Too Long"sv; + case 415: + return "Unsupported Media Type"sv; + case 416: + return "Requested Range Not Satisfiable"sv; + case 417: + return "Expectation Failed"sv; + case 421: + return "Misdirected Request"sv; + case 426: + return "Upgrade Required"sv; + case 428: + return "Precondition Required"sv; + case 429: + return "Too Many Requests"sv; + case 431: + return "Request Header Fields Too Large"sv; + case 451: + return "Unavailable For Legal Reasons"sv; + case 500: + return "Internal Server Error"sv; + case 501: + return "Not Implemented"sv; + case 502: + return "Bad Gateway"sv; + case 503: + return "Service Unavailable"sv; + case 504: + return "Gateway Timeout"sv; + case 505: + return "HTTP Version Not Supported"sv; + case 511: + return "Network Authentication Required"sv; + default: + return ""sv; + } +} + +} // namespace http + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/examples/http.h b/deps/ngtcp2/ngtcp2/examples/http.h new file mode 100644 index 000000000000..789ba8678db9 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/http.h @@ -0,0 +1,44 @@ +/* + * ngtcp2 + * + * Copyright (c) 2017 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef HTTP_H +#define HTTP_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +namespace ngtcp2 { + +namespace http { + +std::string_view get_reason_phrase(unsigned int status_code); + +} // namespace http + +} // namespace ngtcp2 + +#endif // !defined(HTTP_H) diff --git a/deps/ngtcp2/ngtcp2/examples/http3_client_proto_codec.cc b/deps/ngtcp2/ngtcp2/examples/http3_client_proto_codec.cc new file mode 100644 index 000000000000..8a2674796e87 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/http3_client_proto_codec.cc @@ -0,0 +1,620 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "http3_client_proto_codec.h" + +#include + +#include "client.h" +#include "debug.h" + +extern Config config; + +namespace ngtcp2 { + +ProtoCodec::ProtoCodec(Client *c, ngtcp2_ccerr &last_error) + : client_{c}, conn_{client_->conn()}, last_error_{last_error} {} + +ProtoCodec::~ProtoCodec() { + if (httpconn_) { + nghttp3_conn_del(httpconn_); + } +} + +std::expected +ProtoCodec::recv_stream_data(uint32_t flags, int64_t stream_id, + std::span data) { + auto nconsumed = nghttp3_conn_read_stream2( + httpconn_, stream_id, data.data(), data.size(), + flags & NGTCP2_STREAM_DATA_FLAG_FIN, ngtcp2_conn_get_timestamp(conn_)); + if (nconsumed < 0) { + std::println(stderr, "nghttp3_conn_read_stream2: {}", + nghttp3_strerror(static_cast(nconsumed))); + ngtcp2_ccerr_set_application_error( + &last_error_, + nghttp3_err_infer_quic_app_error_code(static_cast(nconsumed)), + nullptr, 0); + return std::unexpected{Error::HTTP3}; + } + + ngtcp2_conn_extend_max_stream_offset(conn_, stream_id, + static_cast(nconsumed)); + ngtcp2_conn_extend_max_offset(conn_, static_cast(nconsumed)); + + return {}; +} + +std::expected +ProtoCodec::acked_stream_data_offset(int64_t stream_id, uint64_t datalen) { + if (auto rv = nghttp3_conn_add_ack_offset(httpconn_, stream_id, datalen); + rv != 0) { + std::println(stderr, "nghttp3_conn_add_ack_offset: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + return {}; +} + +std::expected +ProtoCodec::extend_max_stream_data(int64_t stream_id, uint64_t max_data) { + if (auto rv = nghttp3_conn_unblock_stream(httpconn_, stream_id); rv != 0) { + std::println(stderr, "nghttp3_conn_unblock_stream: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + return {}; +} + +void ProtoCodec::early_data_rejected() { + nghttp3_conn_del(httpconn_); + httpconn_ = nullptr; +} + +void ProtoCodec::http_stream_close(int64_t stream_id, + std::optional rx_app_error_code, + std::optional tx_app_error_code) { + if (!ngtcp2_is_bidi_stream(stream_id)) { + return; + } + + if (!config.quiet) { + std::println(stderr, + "HTTP stream {:#x} closed with error codes (RX:{}, TX:{})", + stream_id, util::format_app_error_code(rx_app_error_code), + util::format_app_error_code(tx_app_error_code)); + } +} + +std::expected +ProtoCodec::on_stream_close(int64_t stream_id, + std::optional rx_app_error_code, + std::optional tx_app_error_code) { + if (!httpconn_) { + return {}; + } + + uint32_t flags = NGHTTP3_STREAM_CLOSE_FLAG_NONE; + + if (rx_app_error_code.has_value()) { + flags |= NGHTTP3_STREAM_CLOSE_FLAG_RX_APP_ERROR_CODE_SET; + } + + if (tx_app_error_code.has_value()) { + flags |= NGHTTP3_STREAM_CLOSE_FLAG_TX_APP_ERROR_CODE_SET; + } + + if (auto rv = nghttp3_conn_close_stream2(httpconn_, flags, stream_id, + rx_app_error_code.value_or(0), + tx_app_error_code.value_or(0)); + rv != 0) { + if (rv != NGHTTP3_ERR_STREAM_NOT_FOUND) { + std::println(stderr, "nghttp3_conn_close_stream2: {}", + nghttp3_strerror(rv)); + ngtcp2_ccerr_set_application_error( + &last_error_, nghttp3_err_infer_quic_app_error_code(rv), nullptr, 0); + return std::unexpected{Error::HTTP3}; + } + + return {}; + } + + http_stream_close(stream_id, rx_app_error_code, tx_app_error_code); + + return {}; +} + +std::expected ProtoCodec::on_stream_reset(int64_t stream_id) { + if (!httpconn_) { + return {}; + } + + if (auto rv = nghttp3_conn_shutdown_stream_read(httpconn_, stream_id); + rv != 0) { + std::println(stderr, "nghttp3_conn_shutdown_stream_read: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + return {}; +} + +std::expected +ProtoCodec::on_stream_stop_sending(int64_t stream_id) { + if (!httpconn_) { + return {}; + } + + if (auto rv = nghttp3_conn_shutdown_stream_read(httpconn_, stream_id); + rv != 0) { + std::println(stderr, "nghttp3_conn_shutdown_stream_read: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + return {}; +} + +namespace { +nghttp3_ssize read_data(nghttp3_conn *conn, int64_t stream_id, nghttp3_vec *vec, + size_t veccnt, uint32_t *pflags, void *user_data, + void *stream_user_data) { + vec[0].base = config.data; + vec[0].len = config.datalen; + *pflags |= NGHTTP3_DATA_FLAG_EOF; + + return 1; +} +} // namespace + +std::expected ProtoCodec::submit_request(const Stream *stream) { + std::string content_length_str; + + const auto &req = stream->req; + + std::array nva{ + util::make_nv_nn(":method", config.http_method), + util::make_nv_nn(":scheme", req.scheme), + util::make_nv_nn(":authority", req.authority), + util::make_nv_nn(":path", req.path), + util::make_nv_nn("user-agent", "nghttp3/ngtcp2 client"), + }; + size_t nvlen = 5; + if (config.fd != -1) { + content_length_str = util::format_uint(config.datalen); + nva[nvlen++] = util::make_nv_nc("content-length", content_length_str); + } + + if (!config.quiet) { + debug::print_http_request_headers(stream->stream_id, nva.data(), nvlen); + } + + nghttp3_data_reader dr{ + .read_data = read_data, + }; + + if (auto rv = nghttp3_conn_submit_request( + httpconn_, stream->stream_id, nva.data(), nvlen, + config.fd == -1 ? nullptr : &dr, nullptr); + rv != 0) { + std::println(stderr, "nghttp3_conn_submit_request: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + return {}; +} + +ngtcp2_ssize ProtoCodec::write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, + uint8_t *dest, size_t destlen, + ngtcp2_tstamp ts) { + std::array vec; + + for (;;) { + int64_t stream_id = -1; + int fin = 0; + nghttp3_ssize sveccnt = 0; + + if (httpconn_ && ngtcp2_conn_get_max_data_left2(conn_)) { + sveccnt = nghttp3_conn_writev_stream(httpconn_, &stream_id, &fin, + vec.data(), vec.size()); + if (sveccnt < 0) { + std::println(stderr, "nghttp3_conn_writev_stream: {}", + nghttp3_strerror(static_cast(sveccnt))); + ngtcp2_ccerr_set_application_error( + &last_error_, + nghttp3_err_infer_quic_app_error_code(static_cast(sveccnt)), + nullptr, 0); + return NGTCP2_ERR_CALLBACK_FAILURE; + } + } + + ngtcp2_ssize ndatalen; + auto v = vec.data(); + auto vcnt = static_cast(sveccnt); + + uint32_t flags = NGTCP2_WRITE_STREAM_FLAG_MORE; + if (fin) { + flags |= NGTCP2_WRITE_STREAM_FLAG_FIN; + } + + auto nwrite = ngtcp2_conn_writev_stream( + conn_, path, pi, dest, destlen, &ndatalen, flags, stream_id, + reinterpret_cast(v), vcnt, ts); + if (nwrite < 0) { + switch (nwrite) { + case NGTCP2_ERR_STREAM_DATA_BLOCKED: + assert(ndatalen == -1); + nghttp3_conn_block_stream(httpconn_, stream_id); + continue; + case NGTCP2_ERR_STREAM_SHUT_WR: + assert(ndatalen == -1); + nghttp3_conn_shutdown_stream_write(httpconn_, stream_id); + continue; + case NGTCP2_ERR_WRITE_MORE: + assert(ndatalen >= 0); + if (auto rv = nghttp3_conn_add_write_offset(httpconn_, stream_id, + as_unsigned(ndatalen)); + rv != 0) { + std::println(stderr, "nghttp3_conn_add_write_offset: {}", + nghttp3_strerror(rv)); + ngtcp2_ccerr_set_application_error( + &last_error_, nghttp3_err_infer_quic_app_error_code(rv), nullptr, + 0); + return NGTCP2_ERR_CALLBACK_FAILURE; + } + continue; + } + + assert(ndatalen == -1); + + std::println(stderr, "ngtcp2_conn_writev_stream: {}", + ngtcp2_strerror(static_cast(nwrite))); + ngtcp2_ccerr_set_liberr(&last_error_, static_cast(nwrite), nullptr, + 0); + + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + if (ndatalen >= 0) { + if (auto rv = nghttp3_conn_add_write_offset(httpconn_, stream_id, + as_unsigned(ndatalen)); + rv != 0) { + std::println(stderr, "nghttp3_conn_add_write_offset: {}", + nghttp3_strerror(rv)); + ngtcp2_ccerr_set_application_error( + &last_error_, nghttp3_err_infer_quic_app_error_code(rv), nullptr, 0); + + return NGTCP2_ERR_CALLBACK_FAILURE; + } + } + + return nwrite; + } +} + +namespace { +int http_recv_data(nghttp3_conn *conn, int64_t stream_id, const uint8_t *data, + size_t datalen, void *user_data, void *stream_user_data) { + if (!config.quiet && !config.no_http_dump) { + debug::print_http_data(stream_id, {data, datalen}); + } + auto pc = static_cast(user_data); + pc->http_consume(stream_id, datalen); + pc->http_write_data(stream_id, {data, datalen}); + return 0; +} +} // namespace + +namespace { +int http_deferred_consume(nghttp3_conn *conn, int64_t stream_id, + size_t nconsumed, void *user_data, + void *stream_user_data) { + auto pc = static_cast(user_data); + pc->http_consume(stream_id, nconsumed); + return 0; +} +} // namespace + +void ProtoCodec::http_consume(int64_t stream_id, size_t nconsumed) { + ngtcp2_conn_extend_max_stream_offset(conn_, stream_id, nconsumed); + ngtcp2_conn_extend_max_offset(conn_, nconsumed); +} + +void ProtoCodec::http_write_data(int64_t stream_id, + std::span data) { + auto stream = client_->find_stream(stream_id); + if (!stream) { + return; + } + + if (stream->fd == -1) { + return; + } + + ssize_t nwrite; + + for (; !data.empty();) { + do { + nwrite = write(stream->fd, data.data(), data.size()); + } while (nwrite == -1 && errno == EINTR); + + if (nwrite < 0) { + std::println(stderr, "Could not write data to file: {}", strerror(errno)); + + return; + } + + data = data.subspan(static_cast(nwrite)); + } +} + +namespace { +int http_begin_headers(nghttp3_conn *conn, int64_t stream_id, void *user_data, + void *stream_user_data) { + if (!config.quiet) { + debug::print_http_begin_response_headers(stream_id); + } + return 0; +} +} // namespace + +namespace { +int http_recv_header(nghttp3_conn *conn, int64_t stream_id, int32_t token, + nghttp3_rcbuf *name, nghttp3_rcbuf *value, uint8_t flags, + void *user_data, void *stream_user_data) { + if (!config.quiet) { + debug::print_http_header(stream_id, name, value, flags); + } + return 0; +} +} // namespace + +namespace { +int http_end_headers(nghttp3_conn *conn, int64_t stream_id, int fin, + void *user_data, void *stream_user_data) { + if (!config.quiet) { + debug::print_http_end_headers(stream_id); + } + return 0; +} +} // namespace + +namespace { +int http_begin_trailers(nghttp3_conn *conn, int64_t stream_id, void *user_data, + void *stream_user_data) { + if (!config.quiet) { + debug::print_http_begin_trailers(stream_id); + } + return 0; +} +} // namespace + +namespace { +int http_recv_trailer(nghttp3_conn *conn, int64_t stream_id, int32_t token, + nghttp3_rcbuf *name, nghttp3_rcbuf *value, uint8_t flags, + void *user_data, void *stream_user_data) { + if (!config.quiet) { + debug::print_http_header(stream_id, name, value, flags); + } + return 0; +} +} // namespace + +namespace { +int http_end_trailers(nghttp3_conn *conn, int64_t stream_id, int fin, + void *user_data, void *stream_user_data) { + if (!config.quiet) { + debug::print_http_end_trailers(stream_id); + } + return 0; +} +} // namespace + +namespace { +int http_stop_sending(nghttp3_conn *conn, int64_t stream_id, + uint64_t app_error_code, void *user_data, + void *stream_user_data) { + auto pc = static_cast(user_data); + if (!pc->stop_sending(stream_id, app_error_code)) { + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + return 0; +} +} // namespace + +std::expected ProtoCodec::stop_sending(int64_t stream_id, + uint64_t app_error_code) { + if (auto rv = + ngtcp2_conn_shutdown_stream_read(conn_, 0, stream_id, app_error_code); + rv != 0) { + std::println(stderr, "ngtcp2_conn_shutdown_stream_read: {}", + ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + return {}; +} + +namespace { +int http_reset_stream(nghttp3_conn *conn, int64_t stream_id, + uint64_t app_error_code, void *user_data, + void *stream_user_data) { + auto pc = static_cast(user_data); + if (!pc->reset_stream(stream_id, app_error_code)) { + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + return 0; +} +} // namespace + +std::expected ProtoCodec::reset_stream(int64_t stream_id, + uint64_t app_error_code) { + if (auto rv = + ngtcp2_conn_shutdown_stream_write(conn_, 0, stream_id, app_error_code); + rv != 0) { + std::println(stderr, "ngtcp2_conn_shutdown_stream_write: {}", + ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + return {}; +} + +namespace { +void rand_bytes(uint8_t *dest, size_t destlen) { + if (!util::generate_secure_random({dest, destlen})) { + assert(0); + abort(); + } +} +} // namespace + +namespace { +int http_recv_settings(nghttp3_conn *conn, + const nghttp3_proto_settings *settings, + void *conn_user_data) { + if (!config.quiet) { + debug::print_http_settings(settings); + } + + return 0; +} +} // namespace + +namespace { +int http_recv_origin(nghttp3_conn *conn, const uint8_t *origin, + size_t originlen, void *conn_user_data) { + if (!config.quiet) { + debug::print_http_origin(origin, originlen); + } + + return 0; +} +} // namespace + +namespace { +int http_end_origin(nghttp3_conn *conn, void *conn_user_data) { + if (!config.quiet) { + debug::print_http_end_origin(); + } + + return 0; +} +} // namespace + +std::expected ProtoCodec::setup_codec() { + if (httpconn_) { + return {}; + } + + if (ngtcp2_conn_get_streams_uni_left2(conn_) < 3) { + std::println(stderr, + "peer does not allow at least 3 unidirectional streams."); + return std::unexpected{Error::QUIC}; + } + + static constexpr auto callbacks = nghttp3_callbacks{ + .recv_data = ::http_recv_data, + .deferred_consume = ::http_deferred_consume, + .begin_headers = ::http_begin_headers, + .recv_header = ::http_recv_header, + .end_headers = ::http_end_headers, + .begin_trailers = ::http_begin_trailers, + .recv_trailer = ::http_recv_trailer, + .end_trailers = ::http_end_trailers, + .stop_sending = ::http_stop_sending, + .reset_stream = ::http_reset_stream, + .recv_origin = ::http_recv_origin, + .end_origin = ::http_end_origin, + .rand = rand_bytes, + .recv_settings2 = ::http_recv_settings, + }; + nghttp3_settings settings; + nghttp3_settings_default(&settings); + settings.qpack_max_dtable_capacity = 4_k; + settings.qpack_blocked_streams = 100; + + auto mem = nghttp3_mem_default(); + + if (auto rv = + nghttp3_conn_client_new(&httpconn_, &callbacks, &settings, mem, this); + rv != 0) { + std::println(stderr, "nghttp3_conn_client_new: {}", nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + int64_t ctrl_stream_id; + + if (auto rv = ngtcp2_conn_open_uni_stream(conn_, &ctrl_stream_id, nullptr); + rv != 0) { + std::println(stderr, "ngtcp2_conn_open_uni_stream: {}", + ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + + if (auto rv = nghttp3_conn_bind_control_stream(httpconn_, ctrl_stream_id); + rv != 0) { + std::println(stderr, "nghttp3_conn_bind_control_stream: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + if (!config.quiet) { + std::println(stderr, "http: control stream={:#x}", ctrl_stream_id); + } + + int64_t qpack_enc_stream_id, qpack_dec_stream_id; + + if (auto rv = + ngtcp2_conn_open_uni_stream(conn_, &qpack_enc_stream_id, nullptr); + rv != 0) { + std::println(stderr, "ngtcp2_conn_open_uni_stream: {}", + ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + + if (auto rv = + ngtcp2_conn_open_uni_stream(conn_, &qpack_dec_stream_id, nullptr); + rv != 0) { + std::println(stderr, "ngtcp2_conn_open_uni_stream: {}", + ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + + if (auto rv = nghttp3_conn_bind_qpack_streams(httpconn_, qpack_enc_stream_id, + qpack_dec_stream_id); + rv != 0) { + std::println(stderr, "nghttp3_conn_bind_qpack_streams: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + if (!config.quiet) { + std::println(stderr, "http: QPACK streams encoder={:#x} decoder={:#x}", + qpack_enc_stream_id, qpack_dec_stream_id); + } + + return {}; +} + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/examples/http3_client_proto_codec.h b/deps/ngtcp2/ngtcp2/examples/http3_client_proto_codec.h new file mode 100644 index 000000000000..ca7b3af288ae --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/http3_client_proto_codec.h @@ -0,0 +1,106 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef HTTP3_CLIENT_PROTO_CODEC_H +#define HTTP3_CLIENT_PROTO_CODEC_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include +#include + +#include +#include + +#include "shared.h" +#include "client_base.h" + +struct Stream; +class Client; + +namespace ngtcp2 { + +class ProtoCodec { +public: + ProtoCodec(Client *handler, ngtcp2_ccerr &last_error); + ~ProtoCodec(); + + std::expected recv_stream_data(uint32_t flags, int64_t stream_id, + std::span data); + + std::expected acked_stream_data_offset(int64_t stream_id, + uint64_t datalen); + + std::expected extend_max_stream_data(int64_t stream_id, + uint64_t max_data); + + void early_data_rejected(); + + std::expected + on_stream_close(int64_t stream_id, std::optional rx_app_error_code, + std::optional tx_app_error_code); + + std::expected on_stream_reset(int64_t stream_id); + + std::expected on_stream_stop_sending(int64_t stream_id); + + std::expected submit_request(const Stream *stream); + + ngtcp2_ssize write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, + size_t destlen, ngtcp2_tstamp ts); + + std::expected setup_codec(); + + // The following functions are made public so that they can be + // called from nghttp3 callback functions. + std::expected stop_sending(int64_t stream_id, + uint64_t app_error_code); + + std::expected reset_stream(int64_t stream_id, + uint64_t app_error_code); + + void http_consume(int64_t stream_id, size_t nconsumed); + + void http_write_data(int64_t stream_id, std::span data); + + static constexpr auto protocol = AppProtocol::H3; + static constexpr auto no_error = NGHTTP3_H3_NO_ERROR; + +private: + void http_stream_close(int64_t stream_id, + std::optional rx_app_error_code, + std::optional tx_app_error_code); + + Client *client_; + ngtcp2_conn *conn_; + ngtcp2_ccerr &last_error_; + nghttp3_conn *httpconn_{}; +}; + +} // namespace ngtcp2 + +#endif // !defined(HTTP3_CLIENT_PROTO_CODEC_H) diff --git a/deps/ngtcp2/ngtcp2/examples/http3_server_proto_codec.cc b/deps/ngtcp2/ngtcp2/examples/http3_server_proto_codec.cc new file mode 100644 index 000000000000..b3932116d4e0 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/http3_server_proto_codec.cc @@ -0,0 +1,858 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "http3_server_proto_codec.h" + +#include "server.h" +#include "debug.h" + +extern Config config; + +namespace ngtcp2 { + +ProtoCodec::ProtoCodec(Handler *h, ngtcp2_ccerr &last_error) + : handler_{h}, conn_{handler_->conn()}, last_error_{last_error} {} + +ProtoCodec::~ProtoCodec() { + if (httpconn_) { + nghttp3_conn_del(httpconn_); + } +} + +std::expected +ProtoCodec::acked_stream_data_offset(int64_t stream_id, uint64_t datalen) { + if (!httpconn_) { + return {}; + } + + if (auto rv = nghttp3_conn_add_ack_offset(httpconn_, stream_id, datalen); + rv != 0) { + std::println(stderr, "nghttp3_conn_add_ack_offset: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + return {}; +} + +std::expected ProtoCodec::on_stream_reset(int64_t stream_id) { + if (!httpconn_) { + return {}; + } + + if (auto rv = nghttp3_conn_shutdown_stream_read(httpconn_, stream_id); + rv != 0) { + std::println(stderr, "nghttp3_conn_shutdown_stream_read: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + return {}; +} + +std::expected +ProtoCodec::on_stream_stop_sending(int64_t stream_id) { + if (!httpconn_) { + return {}; + } + + if (auto rv = nghttp3_conn_shutdown_stream_read(httpconn_, stream_id); + rv != 0) { + std::println(stderr, "nghttp3_conn_shutdown_stream_read: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + return {}; +} + +void ProtoCodec::extend_max_remote_streams_bidi(uint64_t max_streams) { + if (!httpconn_) { + return; + } + + nghttp3_conn_set_max_client_streams_bidi(httpconn_, max_streams); +} + +std::expected +ProtoCodec::extend_max_stream_data(int64_t stream_id, uint64_t max_data) { + if (auto rv = nghttp3_conn_unblock_stream(httpconn_, stream_id); rv != 0) { + std::println(stderr, "nghttp3_conn_unblock_stream: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + return {}; +} + +std::expected ProtoCodec::on_app_tx_ready() { + return setup_httpconn(); +} + +ngtcp2_ssize ProtoCodec::write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, + uint8_t *dest, size_t destlen, + ngtcp2_tstamp ts) { + std::array vec; + + for (;;) { + int64_t stream_id = -1; + int fin = 0; + nghttp3_ssize sveccnt = 0; + + if (httpconn_ && ngtcp2_conn_get_max_data_left2(conn_)) { + sveccnt = nghttp3_conn_writev_stream(httpconn_, &stream_id, &fin, + vec.data(), vec.size()); + if (sveccnt < 0) { + std::println(stderr, "nghttp3_conn_writev_stream: {}", + nghttp3_strerror(static_cast(sveccnt))); + ngtcp2_ccerr_set_application_error( + &last_error_, + nghttp3_err_infer_quic_app_error_code(static_cast(sveccnt)), + nullptr, 0); + return NGTCP2_ERR_CALLBACK_FAILURE; + } + } + + ngtcp2_ssize ndatalen; + auto v = vec.data(); + auto vcnt = static_cast(sveccnt); + + uint32_t flags = + NGTCP2_WRITE_STREAM_FLAG_MORE | NGTCP2_WRITE_STREAM_FLAG_PADDING; + if (fin) { + flags |= NGTCP2_WRITE_STREAM_FLAG_FIN; + } + + auto nwrite = ngtcp2_conn_writev_stream( + conn_, path, pi, dest, destlen, &ndatalen, flags, stream_id, + reinterpret_cast(v), vcnt, ts); + if (nwrite < 0) { + switch (nwrite) { + case NGTCP2_ERR_STREAM_DATA_BLOCKED: + assert(ndatalen == -1); + nghttp3_conn_block_stream(httpconn_, stream_id); + continue; + case NGTCP2_ERR_STREAM_SHUT_WR: + assert(ndatalen == -1); + nghttp3_conn_shutdown_stream_write(httpconn_, stream_id); + continue; + case NGTCP2_ERR_WRITE_MORE: + assert(ndatalen >= 0); + if (auto rv = nghttp3_conn_add_write_offset(httpconn_, stream_id, + as_unsigned(ndatalen)); + rv != 0) { + std::println(stderr, "nghttp3_conn_add_write_offset: {}", + nghttp3_strerror(rv)); + ngtcp2_ccerr_set_application_error( + &last_error_, nghttp3_err_infer_quic_app_error_code(rv), nullptr, + 0); + return NGTCP2_ERR_CALLBACK_FAILURE; + } + continue; + } + + assert(ndatalen == -1); + + std::println(stderr, "ngtcp2_conn_writev_stream: {}", + ngtcp2_strerror(static_cast(nwrite))); + ngtcp2_ccerr_set_liberr(&last_error_, static_cast(nwrite), nullptr, + 0); + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + if (ndatalen >= 0) { + if (auto rv = nghttp3_conn_add_write_offset(httpconn_, stream_id, + as_unsigned(ndatalen)); + rv != 0) { + std::println(stderr, "nghttp3_conn_add_write_offset: {}", + nghttp3_strerror(rv)); + ngtcp2_ccerr_set_application_error( + &last_error_, nghttp3_err_infer_quic_app_error_code(rv), nullptr, 0); + return NGTCP2_ERR_CALLBACK_FAILURE; + } + } + + return nwrite; + } +} + +std::expected +ProtoCodec::recv_stream_data(uint32_t flags, int64_t stream_id, + std::span data) { + if (!config.quiet && !config.no_quic_dump) { + debug::print_stream_data(stream_id, data); + } + + if (!httpconn_) { + return {}; + } + + auto nconsumed = nghttp3_conn_read_stream2( + httpconn_, stream_id, data.data(), data.size(), + flags & NGTCP2_STREAM_DATA_FLAG_FIN, ngtcp2_conn_get_timestamp(conn_)); + if (nconsumed < 0) { + std::println(stderr, "nghttp3_conn_read_stream2: {}", + nghttp3_strerror(static_cast(nconsumed))); + ngtcp2_ccerr_set_application_error( + &last_error_, + nghttp3_err_infer_quic_app_error_code(static_cast(nconsumed)), + nullptr, 0); + return std::unexpected{Error::HTTP3}; + } + + ngtcp2_conn_extend_max_stream_offset(conn_, stream_id, + static_cast(nconsumed)); + ngtcp2_conn_extend_max_offset(conn_, static_cast(nconsumed)); + + return {}; +} + +std::expected +ProtoCodec::on_stream_close(int64_t stream_id, + std::optional rx_app_error_code, + std::optional tx_app_error_code) { + if (!httpconn_) { + return {}; + } + + uint32_t flags = NGHTTP3_STREAM_CLOSE_FLAG_NONE; + + if (rx_app_error_code.has_value()) { + flags |= NGHTTP3_STREAM_CLOSE_FLAG_RX_APP_ERROR_CODE_SET; + } + + if (tx_app_error_code.has_value()) { + flags |= NGHTTP3_STREAM_CLOSE_FLAG_TX_APP_ERROR_CODE_SET; + } + + if (auto rv = nghttp3_conn_close_stream2(httpconn_, flags, stream_id, + rx_app_error_code.value_or(0), + tx_app_error_code.value_or(0)); + rv != 0) { + if (rv != NGHTTP3_ERR_STREAM_NOT_FOUND) { + std::println(stderr, "nghttp3_conn_close_stream2: {}", + nghttp3_strerror(rv)); + ngtcp2_ccerr_set_application_error( + &last_error_, nghttp3_err_infer_quic_app_error_code(rv), nullptr, 0); + return std::unexpected{Error::HTTP3}; + } + + return {}; + } + + http_stream_close(stream_id, rx_app_error_code, tx_app_error_code); + + return {}; +} + +namespace { +int http_acked_stream_data(nghttp3_conn *conn, int64_t stream_id, + uint64_t datalen, void *user_data, + void *stream_user_data) { + auto pc = static_cast(user_data); + auto stream = static_cast(stream_user_data); + pc->http_acked_stream_data(stream, datalen); + return 0; +} +} // namespace + +void ProtoCodec::http_acked_stream_data(Stream *stream, uint64_t datalen) { + stream->http_acked_stream_data(datalen); +} + +namespace { +int http_recv_data(nghttp3_conn *conn, int64_t stream_id, const uint8_t *data, + size_t datalen, void *user_data, void *stream_user_data) { + if (!config.quiet && !config.no_http_dump) { + debug::print_http_data(stream_id, {data, datalen}); + } + auto pc = static_cast(user_data); + pc->http_consume(stream_id, datalen); + return 0; +} +} // namespace + +namespace { +int http_deferred_consume(nghttp3_conn *conn, int64_t stream_id, + size_t nconsumed, void *user_data, + void *stream_user_data) { + auto pc = static_cast(user_data); + pc->http_consume(stream_id, nconsumed); + return 0; +} +} // namespace + +void ProtoCodec::http_consume(int64_t stream_id, size_t nconsumed) { + ngtcp2_conn_extend_max_stream_offset(conn_, stream_id, nconsumed); + ngtcp2_conn_extend_max_offset(conn_, nconsumed); +} + +namespace { +int http_begin_request_headers(nghttp3_conn *conn, int64_t stream_id, + void *user_data, void *stream_user_data) { + if (!config.quiet) { + debug::print_http_begin_request_headers(stream_id); + } + + auto pc = static_cast(user_data); + pc->http_begin_request_headers(stream_id); + return 0; +} +} // namespace + +void ProtoCodec::http_begin_request_headers(int64_t stream_id) { + auto stream = handler_->find_stream(stream_id); + if (!stream) { + return; + } + + nghttp3_conn_set_stream_user_data(httpconn_, stream_id, stream); +} + +namespace { +int http_recv_request_header(nghttp3_conn *conn, int64_t stream_id, + int32_t token, nghttp3_rcbuf *name, + nghttp3_rcbuf *value, uint8_t flags, + void *user_data, void *stream_user_data) { + if (!config.quiet) { + debug::print_http_header(stream_id, name, value, flags); + } + + auto pc = static_cast(user_data); + auto stream = static_cast(stream_user_data); + pc->http_recv_request_header(stream, token, name, value); + return 0; +} +} // namespace + +void ProtoCodec::http_recv_request_header(Stream *stream, int32_t token, + nghttp3_rcbuf *name, + nghttp3_rcbuf *value) { + auto v = nghttp3_rcbuf_get_buf(value); + + switch (token) { + case NGHTTP3_QPACK_TOKEN__PATH: + stream->uri = std::string{v.base, v.base + v.len}; + break; + case NGHTTP3_QPACK_TOKEN__METHOD: + stream->method = std::string{v.base, v.base + v.len}; + break; + case NGHTTP3_QPACK_TOKEN__AUTHORITY: + stream->authority = std::string{v.base, v.base + v.len}; + break; + } +} + +namespace { +int http_end_request_headers(nghttp3_conn *conn, int64_t stream_id, int fin, + void *user_data, void *stream_user_data) { + if (!config.quiet) { + debug::print_http_end_headers(stream_id); + } + + auto pc = static_cast(user_data); + auto stream = static_cast(stream_user_data); + if (!pc->http_end_request_headers(stream)) { + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + return 0; +} +} // namespace + +std::expected +ProtoCodec::http_end_request_headers(Stream *stream) { + if (config.early_response) { + if (auto rv = start_response(stream); !rv) { + return rv; + } + + handler_->shutdown_read(stream->stream_id, NGHTTP3_H3_NO_ERROR); + } + return {}; +} + +namespace { +int http_stop_sending(nghttp3_conn *conn, int64_t stream_id, + uint64_t app_error_code, void *user_data, + void *stream_user_data) { + auto pc = static_cast(user_data); + if (!pc->http_stop_sending(stream_id, app_error_code)) { + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + return 0; +} +} // namespace + +std::expected +ProtoCodec::http_stop_sending(int64_t stream_id, uint64_t app_error_code) { + if (auto rv = + ngtcp2_conn_shutdown_stream_read(conn_, 0, stream_id, app_error_code); + rv != 0) { + std::println(stderr, "ngtcp2_conn_shutdown_stream_read: {}", + ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + return {}; +} + +namespace { +int http_end_stream(nghttp3_conn *conn, int64_t stream_id, void *user_data, + void *stream_user_data) { + auto pc = static_cast(user_data); + auto stream = static_cast(stream_user_data); + if (!pc->http_end_stream(stream)) { + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + return 0; +} +} // namespace + +std::expected ProtoCodec::http_end_stream(Stream *stream) { + if (!config.early_response) { + return start_response(stream); + } + return {}; +} + +namespace { +int http_reset_stream(nghttp3_conn *conn, int64_t stream_id, + uint64_t app_error_code, void *user_data, + void *stream_user_data) { + auto pc = static_cast(user_data); + if (!pc->http_reset_stream(stream_id, app_error_code)) { + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + return 0; +} +} // namespace + +std::expected +ProtoCodec::http_reset_stream(int64_t stream_id, uint64_t app_error_code) { + if (auto rv = + ngtcp2_conn_shutdown_stream_write(conn_, 0, stream_id, app_error_code); + rv != 0) { + std::println(stderr, "ngtcp2_conn_shutdown_stream_write: {}", + ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + return {}; +} + +namespace { +void rand_bytes(uint8_t *dest, size_t destlen) { + if (!util::generate_secure_random({dest, destlen})) { + assert(0); + abort(); + } +} +} // namespace + +namespace { +int http_recv_settings(nghttp3_conn *conn, + const nghttp3_proto_settings *settings, + void *conn_user_data) { + if (!config.quiet) { + debug::print_http_settings(settings); + } + + return 0; +} +} // namespace + +namespace { +nghttp3_ssize read_data(nghttp3_conn *conn, int64_t stream_id, nghttp3_vec *vec, + size_t veccnt, uint32_t *pflags, void *user_data, + void *stream_user_data) { + auto stream = static_cast(stream_user_data); + + vec[0].base = const_cast(stream->resp_data.data()); + vec[0].len = stream->resp_data.size(); + *pflags |= NGHTTP3_DATA_FLAG_EOF; + if (config.send_trailers) { + *pflags |= NGHTTP3_DATA_FLAG_NO_END_STREAM; + } + + return 1; +} +} // namespace + +auto dyn_buf = std::make_unique>(); + +namespace { +nghttp3_ssize dyn_read_data(nghttp3_conn *conn, int64_t stream_id, + nghttp3_vec *vec, size_t veccnt, uint32_t *pflags, + void *user_data, void *stream_user_data) { + auto stream = static_cast(stream_user_data); + + auto len = + std::min(dyn_buf->size(), static_cast(stream->dyndataleft)); + + vec[0].base = dyn_buf->data(); + vec[0].len = len; + + stream->dynbuflen += len; + stream->dyndataleft -= len; + + if (stream->dyndataleft == 0) { + *pflags |= NGHTTP3_DATA_FLAG_EOF; + if (config.send_trailers) { + *pflags |= NGHTTP3_DATA_FLAG_NO_END_STREAM; + auto stream_id_str = util::format_uint(as_unsigned(stream_id)); + auto trailers = std::to_array({ + util::make_nv_nc("x-ngtcp2-stream-id"sv, stream_id_str), + }); + + if (auto rv = nghttp3_conn_submit_trailers( + conn, stream_id, trailers.data(), trailers.size()); + rv != 0) { + std::println(stderr, "nghttp3_conn_submit_trailers: {}", + nghttp3_strerror(rv)); + return NGHTTP3_ERR_CALLBACK_FAILURE; + } + } + } + + return 1; +} +} // namespace + +std::expected ProtoCodec::start_response(Stream *stream) { + // TODO This should be handled by nghttp3 + if (stream->uri.empty() || stream->method.empty()) { + return send_status_response(stream, 400); + } + + auto maybe_req = stream->request_path(); + if (!maybe_req) { + return send_status_response(stream, 400); + } + + const auto &req = *maybe_req; + + uint64_t content_length; + nghttp3_data_reader dr{}; + auto content_type = "text/plain"sv; + + auto maybe_dyn_len = stream->find_dyn_length(req.path); + if (!maybe_dyn_len) { + auto path = config.htdocs; + path /= std::filesystem::path{req.path}.relative_path(); + + auto maybe_fe = stream->open_file(path); + if (!maybe_fe) { + return send_status_response(stream, 404); + } + + const auto &fe = *maybe_fe; + + if (fe.flags & FILE_ENTRY_TYPE_DIR) { + return send_redirect_response(stream, 308, req.path + '/'); + } + + content_length = fe.len; + + if (stream->method != "HEAD") { + stream->map_file(fe); + } + + dr.read_data = read_data; + + auto ext = path.extension(); + if (!ext.empty() && ext != ".") { + auto it = config.mime_types.find(ext.native()); + if (it != std::ranges::end(config.mime_types)) { + content_type = (*it).second; + } + } + } else { + content_length = *maybe_dyn_len; + stream->dynresp = true; + dr.read_data = dyn_read_data; + + if (stream->method != "HEAD") { + stream->dyndataleft = content_length; + } + + content_type = "application/octet-stream"sv; + } + + auto content_length_str = util::format_uint(content_length); + + std::array nva{ + util::make_nv_nn(":status"sv, "200"sv), + util::make_nv_nn("server"sv, NGTCP2_SERVER), + util::make_nv_nn("content-type"sv, content_type), + util::make_nv_nc("content-length"sv, content_length_str), + }; + + size_t nvlen = 4; + + std::string prival; + + if (req.pri.urgency != -1 || req.pri.inc != -1) { + nghttp3_pri pri; + + if (auto rv = + nghttp3_conn_get_stream_priority2(httpconn_, &pri, stream->stream_id); + rv != 0) { + std::println(stderr, "nghttp3_conn_get_stream_priority2: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + if (req.pri.urgency != -1) { + pri.urgency = as_unsigned(req.pri.urgency); + } + if (req.pri.inc != -1) { + pri.inc = static_cast(req.pri.inc); + } + + if (auto rv = nghttp3_conn_set_server_stream_priority( + httpconn_, stream->stream_id, &pri); + rv != 0) { + std::println(stderr, "nghttp3_conn_set_server_stream_priority: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + prival = "u="; + prival += static_cast(pri.urgency + '0'); + prival += ",i"; + if (!pri.inc) { + prival += "=?0"; + } + + nva[nvlen++] = util::make_nv_nc("priority"sv, prival); + } + + if (!config.quiet) { + debug::print_http_response_headers(stream->stream_id, nva.data(), nvlen); + } + + if (auto rv = nghttp3_conn_submit_response(httpconn_, stream->stream_id, + nva.data(), nvlen, &dr); + rv != 0) { + std::println(stderr, "nghttp3_conn_submit_response: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + if (config.send_trailers && !maybe_dyn_len) { + auto stream_id_str = util::format_uint(as_unsigned(stream->stream_id)); + auto trailers = std::to_array({ + util::make_nv_nc("x-ngtcp2-stream-id"sv, stream_id_str), + }); + + if (auto rv = nghttp3_conn_submit_trailers( + httpconn_, stream->stream_id, trailers.data(), trailers.size()); + rv != 0) { + std::println(stderr, "nghttp3_conn_submit_trailers: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + } + + return {}; +} + +std::expected +ProtoCodec::send_status_response(Stream *stream, unsigned int status_code, + std::vector extra_headers) { + stream->status_resp_body = make_status_body(status_code); + + auto status_code_str = util::format_uint(status_code); + auto content_length_str = util::format_uint(stream->status_resp_body.size()); + + std::vector nva(4 + extra_headers.size()); + nva[0] = util::make_nv_nc(":status"sv, status_code_str); + nva[1] = util::make_nv_nn("server"sv, NGTCP2_SERVER); + nva[2] = util::make_nv_nn("content-type"sv, "text/html; charset=utf-8"); + nva[3] = util::make_nv_nc("content-length"sv, content_length_str); + for (size_t i = 0; i < extra_headers.size(); ++i) { + auto &hdr = extra_headers[i]; + auto &nv = nva[4 + i]; + nv = util::make_nv_cc(hdr.name, hdr.value); + } + + stream->resp_data = as_uint8_span(std::span{stream->status_resp_body}); + + nghttp3_data_reader dr{ + .read_data = read_data, + }; + + if (auto rv = nghttp3_conn_submit_response(httpconn_, stream->stream_id, + nva.data(), nva.size(), &dr); + rv != 0) { + std::println(stderr, "nghttp3_conn_submit_response: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + if (config.send_trailers) { + auto stream_id_str = util::format_uint(as_unsigned(stream->stream_id)); + auto trailers = std::to_array({ + util::make_nv_nc("x-ngtcp2-stream-id"sv, stream_id_str), + }); + + if (auto rv = nghttp3_conn_submit_trailers( + httpconn_, stream->stream_id, trailers.data(), trailers.size()); + rv != 0) { + std::println(stderr, "nghttp3_conn_submit_trailers: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + } + + handler_->shutdown_read(stream->stream_id, NGHTTP3_H3_NO_ERROR); + + return {}; +} + +std::expected +ProtoCodec::send_redirect_response(Stream *stream, unsigned int status_code, + std::string_view path) { + return send_status_response(stream, status_code, {{"location", path}}); +} + +std::expected ProtoCodec::setup_httpconn() { + if (httpconn_) { + return {}; + } + + if (ngtcp2_conn_get_streams_uni_left2(conn_) < 3) { + std::println(stderr, + "peer does not allow at least 3 unidirectional streams."); + return std::unexpected{Error::QUIC}; + } + + static constexpr auto callbacks = nghttp3_callbacks{ + .acked_stream_data = ::http_acked_stream_data, + .recv_data = ::http_recv_data, + .deferred_consume = ::http_deferred_consume, + .begin_headers = ::http_begin_request_headers, + .recv_header = ::http_recv_request_header, + .end_headers = ::http_end_request_headers, + .stop_sending = ::http_stop_sending, + .end_stream = ::http_end_stream, + .reset_stream = ::http_reset_stream, + .rand = rand_bytes, + .recv_settings2 = ::http_recv_settings, + }; + nghttp3_settings settings; + nghttp3_settings_default(&settings); + settings.qpack_max_dtable_capacity = 4096; + settings.qpack_blocked_streams = 100; + + nghttp3_vec origin_list; + + if (config.origin_list) { + origin_list.base = config.origin_list->data(); + origin_list.len = config.origin_list->size(); + + settings.origin_list = &origin_list; + } + + auto mem = nghttp3_mem_default(); + + if (auto rv = + nghttp3_conn_server_new(&httpconn_, &callbacks, &settings, mem, this); + rv != 0) { + std::println(stderr, "nghttp3_conn_server_new: {}", nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + auto params = ngtcp2_conn_get_local_transport_params2(conn_); + + nghttp3_conn_set_max_client_streams_bidi(httpconn_, + params->initial_max_streams_bidi); + + int64_t ctrl_stream_id; + + if (auto rv = ngtcp2_conn_open_uni_stream(conn_, &ctrl_stream_id, nullptr); + rv != 0) { + std::println(stderr, "ngtcp2_conn_open_uni_stream: {}", + ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + + if (auto rv = nghttp3_conn_bind_control_stream(httpconn_, ctrl_stream_id); + rv != 0) { + std::println(stderr, "nghttp3_conn_bind_control_stream: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + if (!config.quiet) { + std::println(stderr, "http: control stream={:#x}", ctrl_stream_id); + } + + int64_t qpack_enc_stream_id, qpack_dec_stream_id; + + if (auto rv = + ngtcp2_conn_open_uni_stream(conn_, &qpack_enc_stream_id, nullptr); + rv != 0) { + std::println(stderr, "ngtcp2_conn_open_uni_stream: {}", + ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + + if (auto rv = + ngtcp2_conn_open_uni_stream(conn_, &qpack_dec_stream_id, nullptr); + rv != 0) { + std::println(stderr, "ngtcp2_conn_open_uni_stream: {}", + ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + + if (auto rv = nghttp3_conn_bind_qpack_streams(httpconn_, qpack_enc_stream_id, + qpack_dec_stream_id); + rv != 0) { + std::println(stderr, "nghttp3_conn_bind_qpack_streams: {}", + nghttp3_strerror(rv)); + return std::unexpected{Error::HTTP3}; + } + + if (!config.quiet) { + std::println(stderr, "http: QPACK streams encoder={:#x} decoder={:#x}", + qpack_enc_stream_id, qpack_dec_stream_id); + } + + return {}; +} + +void ProtoCodec::http_stream_close(int64_t stream_id, + std::optional rx_app_error_code, + std::optional tx_app_error_code) { + if (!ngtcp2_is_bidi_stream(stream_id)) { + return; + } + + if (!config.quiet) { + std::println(stderr, + "HTTP stream {:#x} closed with error codes (RX:{}, TX:{})", + stream_id, util::format_app_error_code(rx_app_error_code), + util::format_app_error_code(tx_app_error_code)); + } +} + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/examples/http3_server_proto_codec.h b/deps/ngtcp2/ngtcp2/examples/http3_server_proto_codec.h new file mode 100644 index 000000000000..10a61d601593 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/http3_server_proto_codec.h @@ -0,0 +1,124 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef HTTP3_SERVER_PROTO_CODEC_H +#define HTTP3_SERVER_PROTO_CODEC_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include +#include + +#include +#include + +#include "shared.h" +#include "server_base.h" + +struct Stream; +class Handler; + +namespace ngtcp2 { + +class ProtoCodec { +public: + ProtoCodec(Handler *handler, ngtcp2_ccerr &last_error); + ~ProtoCodec(); + + std::expected acked_stream_data_offset(int64_t stream_id, + uint64_t datalen); + + std::expected on_stream_reset(int64_t stream_id); + + std::expected on_stream_stop_sending(int64_t stream_id); + + void extend_max_remote_streams_bidi(uint64_t max_streams); + + std::expected extend_max_stream_data(int64_t stream_id, + uint64_t max_data); + + std::expected on_app_tx_ready(); + + ngtcp2_ssize write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, + size_t destlen, ngtcp2_tstamp ts); + + std::expected recv_stream_data(uint32_t flags, int64_t stream_id, + std::span data); + + std::expected + on_stream_close(int64_t stream_id, std::optional rx_app_error_code, + std::optional tx_app_error_code); + + std::expected start_response(Stream *stream); + + // The following functions are made public so that they can be + // called from nghttp3 callback functions. + void http_acked_stream_data(Stream *stream, uint64_t datalen); + + void http_consume(int64_t stream_id, size_t nconsumed); + + void http_begin_request_headers(int64_t stream_id); + + void http_recv_request_header(Stream *stream, int32_t token, + nghttp3_rcbuf *name, nghttp3_rcbuf *value); + + std::expected http_end_request_headers(Stream *stream); + + std::expected http_stop_sending(int64_t stream_id, + uint64_t app_error_code); + + std::expected http_end_stream(Stream *stream); + + std::expected http_reset_stream(int64_t stream_id, + uint64_t app_error_code); + + static constexpr auto protocol = AppProtocol::H3; + +private: + std::expected + send_status_response(Stream *stream, unsigned int status_code, + std::vector extra_headers = {}); + + std::expected send_redirect_response(Stream *stream, + unsigned int status_code, + std::string_view path); + + std::expected setup_httpconn(); + + void http_stream_close(int64_t stream_id, + std::optional rx_app_error_code, + std::optional tx_app_error_code); + + Handler *handler_; + ngtcp2_conn *conn_; + ngtcp2_ccerr &last_error_; + nghttp3_conn *httpconn_{}; +}; + +} // namespace ngtcp2 + +#endif // !defined(HTTP3_SERVER_PROTO_CODEC_H) diff --git a/deps/ngtcp2/ngtcp2/examples/network.h b/deps/ngtcp2/ngtcp2/examples/network.h new file mode 100644 index 000000000000..5698312845f3 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/network.h @@ -0,0 +1,92 @@ +/* + * ngtcp2 + * + * Copyright (c) 2017 ngtcp2 contributors + * Copyright (c) 2016 nghttp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef NETWORK_H +#define NETWORK_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#ifdef HAVE_SYS_SOCKET_H +# include +#endif // defined(HAVE_SYS_SOCKET_H) +#include +#ifdef HAVE_NETINET_IN_H +# include +#endif // defined(HAVE_NETINET_IN_H) +#ifdef HAVE_ARPA_INET_H +# include +#endif // defined(HAVE_ARPA_INET_H) + +#include +#include + +#include + +namespace ngtcp2 { + +enum network_error { + NETWORK_ERR_OK = 0, + NETWORK_ERR_SEND_BLOCKED = -11, + NETWORK_ERR_CLOSE_WAIT = -12, + NETWORK_ERR_RETRY = -13, + NETWORK_ERR_DROP_CONN = -14, +}; + +using InAddr = std::variant; + +using Sockaddr = std::variant; + +struct Address { + // as_sockaddr returns the pointer to the stored address casted to + // const sockaddr *. + [[nodiscard]] const sockaddr *as_sockaddr() const; + [[nodiscard]] sockaddr *as_sockaddr(); + // family returns the address family. + [[nodiscard]] int family() const; + // port returns the port. + [[nodiscard]] uint16_t port() const; + // port sets |port| to this address. + void port(uint16_t port); + // set stores |sa| to this address. The address family is + // determined by |sa|->sa_family, and |sa| must point to the memory + // that contains valid object which is either sockaddr_in or + // sockaddr_in6. + void set(const sockaddr *sa); + // size returns the size of the stored address. + [[nodiscard]] socklen_t size() const; + // empty returns true if this address does not contain any + // meaningful address. + [[nodiscard]] bool empty() const; + + Sockaddr skaddr; + uint32_t ifindex{}; +}; + +} // namespace ngtcp2 + +#endif // !defined(NETWORK_H) diff --git a/deps/ngtcp2/ngtcp2/examples/server.cc b/deps/ngtcp2/ngtcp2/examples/server.cc new file mode 100644 index 000000000000..79896b539a83 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/server.cc @@ -0,0 +1,3247 @@ +/* + * ngtcp2 + * + * Copyright (c) 2017 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "server.h" +#include "network.h" +#include "debug.h" +#include "util.h" +#include "shared.h" +#include "http.h" +#include "template.h" + +using namespace ngtcp2; +using namespace std::literals; + +constexpr auto NGTCP2_SV_SCIDLEN = 18UZ; + +constexpr auto max_preferred_versionslen = 4UZ; + +namespace { +auto randgen = util::make_mt19937(); +} // namespace + +Config config; + +Stream::Stream(int64_t stream_id, Handler *handler) + : stream_id{stream_id}, handler{handler} { +#ifdef WITH_EXAMPLE_HQ_PROTO_CODEC + htp.data = this; + http_parser_init(&htp, HTTP_REQUEST); +#endif // WITH_EXAMPLE_HQ_PROTO_CODEC +} + +std::string make_status_body(unsigned int status_code) { + auto status_string = util::format_uint(status_code); + auto reason_phrase = http::get_reason_phrase(status_code); + + std::string body; + body = ""; + body += status_string; + body += ' '; + body += reason_phrase; + body += "

"; + body += status_string; + body += ' '; + body += reason_phrase; + body += "


"; + body += NGTCP2_SERVER; + body += " at port "; + body += util::format_uint(config.port); + body += "
"; + body += ""; + return body; +} + +std::expected Stream::start_response() { + return handler->start_response(this); +} + +std::expected Stream::request_path() { + urlparse_url u; + Request req{ + .pri{ + .urgency = -1, + .inc = -1, + }, + }; + auto is_connect = method == "CONNECT"; + + if (auto rv = urlparse_parse_url(uri.data(), uri.size(), is_connect, &u); + rv != 0) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + if (u.field_set & (1 << URLPARSE_PATH)) { + req.path = util::get_string(uri, u, URLPARSE_PATH); + if (req.path.find('%') != std::string::npos) { + req.path = util::percent_decode(req.path); + } + + assert(!req.path.empty()); + + if (req.path[0] != '/') { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + if (req.path.back() == '/') { + req.path += "index.html"; + } + + auto maybe_norm_path = util::normalize_path(req.path); + if (!maybe_norm_path) { + return std::unexpected{maybe_norm_path.error()}; + } + + req.path = std::move(*maybe_norm_path); + } else { + req.path = "/index.html"; + } + + if (u.field_set & (1 << URLPARSE_QUERY)) { + static constexpr auto urgency_prefix = "u="sv; + static constexpr auto inc_prefix = "i="sv; + auto q = util::get_string(uri, u, URLPARSE_QUERY); + for (auto p = std::ranges::begin(q); p != std::ranges::end(q);) { + if (util::istarts_with(std::string_view{p, std::ranges::end(q)}, + urgency_prefix)) { + auto urgency_start = p + urgency_prefix.size(); + auto urgency_end = + std::ranges::find(urgency_start, std::ranges::end(q), '&'); + if (urgency_start + 1 == urgency_end && '0' <= *urgency_start && + *urgency_start <= '7') { + req.pri.urgency = *urgency_start - '0'; + } + if (urgency_end == std::ranges::end(q)) { + break; + } + p = urgency_end + 1; + continue; + } + if (util::istarts_with(std::string_view{p, std::ranges::end(q)}, + inc_prefix)) { + auto inc_start = p + inc_prefix.size(); + auto inc_end = std::ranges::find(inc_start, std::ranges::end(q), '&'); + if (inc_start + 1 == inc_end && + (*inc_start == '0' || *inc_start == '1')) { + req.pri.inc = *inc_start - '0'; + } + if (inc_end == std::ranges::end(q)) { + break; + } + p = inc_end + 1; + continue; + } + + p = std::ranges::find(p, std::ranges::end(q), '&'); + if (p == std::ranges::end(q)) { + break; + } + ++p; + } + } + return req; +} + +namespace { +std::unordered_map file_cache; +} // namespace + +std::expected +Stream::open_file(const std::filesystem::path &path) { + auto it = file_cache.find(path.native()); + if (it != std::ranges::end(file_cache)) { + return (*it).second; + } + + auto fd = open(path.c_str(), O_RDONLY); + if (fd == -1) { + return std::unexpected{Error::SYSCALL}; + } + + struct stat st{}; + if (fstat(fd, &st) != 0) { + close(fd); + return std::unexpected{Error::SYSCALL}; + } + + FileEntry fe; + if (st.st_mode & S_IFDIR) { + fe.flags |= FILE_ENTRY_TYPE_DIR; + fe.fd = -1; + close(fd); + } else { + fe.fd = fd; + fe.len = static_cast(st.st_size); + if (fe.len) { + fe.map = mmap(nullptr, fe.len, PROT_READ, MAP_SHARED, fd, 0); + if (fe.map == MAP_FAILED) { + std::println(stderr, "mmap: {}", strerror(errno)); + close(fd); + return std::unexpected{Error::SYSCALL}; + } + } + } + + file_cache.emplace(path.native(), fe); + + return fe; +} + +void Stream::map_file(const FileEntry &fe) { + resp_data = {static_cast(fe.map), fe.len}; +} + +std::expected Stream::find_dyn_length(std::string_view path) { + assert(path[0] == '/'); + + if (path.size() == 1) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + uint64_t n = 0; + + for (auto it = std::ranges::begin(path) + 1; it != std::ranges::end(path); + ++it) { + if (*it < '0' || '9' < *it) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + auto d = static_cast(*it - '0'); + if (n > (((1ULL << 62) - 1) - d) / 10) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + n = n * 10 + d; + if (n > config.max_dyn_length) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + } + + return n; +} + +void Stream::http_acked_stream_data(uint64_t datalen) { + if (!dynresp) { + return; + } + + assert(dynbuflen >= datalen); + + dynbuflen -= datalen; +} + +namespace { +void writecb(struct ev_loop *loop, ev_io *w, int revents) { + auto h = static_cast(w->data); + auto s = h->server(); + + if (auto rv = h->on_write(); !rv && rv.error() != Error::CLOSE_WAIT) { + s->remove(h); + } +} +} // namespace + +namespace { +void close_waitcb(struct ev_loop *loop, ev_timer *w, int revents) { + auto h = static_cast(w->data); + auto s = h->server(); + auto conn = h->conn(); + + if (ngtcp2_conn_in_closing_period2(conn)) { + if (!config.quiet) { + std::println(stderr, "Closing Period is over"); + } + + s->remove(h); + return; + } + if (ngtcp2_conn_in_draining_period2(conn)) { + if (!config.quiet) { + std::println(stderr, "Draining Period is over"); + } + + s->remove(h); + return; + } + + assert(0); +} +} // namespace + +namespace { +void timeoutcb(struct ev_loop *loop, ev_timer *w, int revents) { + auto h = static_cast(w->data); + auto s = h->server(); + + if (!config.quiet) { + std::println(stderr, "Timer expired"); + } + + if (auto rv = h->handle_expiry(); !rv) { + if (rv.error() == Error::CLOSE_WAIT) { + ev_timer_stop(loop, w); + } else { + s->remove(h); + } + + return; + } + + h->signal_write(); +} +} // namespace + +Handler::Handler(struct ev_loop *loop, Server *server) + : loop_{loop}, + server_{server}, + no_gso_{ +#ifdef UDP_SEGMENT + config.no_gso +#else // !defined(UDP_SEGMENT) + true +#endif // !defined(UDP_SEGMENT) + } { + ev_io_init(&wev_, writecb, 0, EV_WRITE); + wev_.data = this; + ev_timer_init(&timer_, timeoutcb, 0., 0.); + timer_.data = this; +} + +Handler::~Handler() { + if (!config.quiet) { + std::println(stderr, "{} Closing QUIC connection", scid_); + } + + ev_timer_stop(loop_, &timer_); + ev_io_stop(loop_, &wev_); + + if (qlog_) { + fclose(qlog_); + } +} + +namespace { +int handshake_completed(ngtcp2_conn *conn, void *user_data) { + auto h = static_cast(user_data); + + if (!config.quiet) { + debug::handshake_completed(conn, user_data); + } + + if (!h->handshake_completed()) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} +} // namespace + +std::expected Handler::handshake_completed() { + if (!config.quiet) { + std::println(stderr, "Negotiated cipher suite is {}", + tls_session_.get_cipher_name()); + if (auto group = tls_session_.get_negotiated_group(); !group.empty()) { + std::println(stderr, "Negotiated group is {}", group); + } + std::println(stderr, "Negotiated ALPN is {}", + tls_session_.get_selected_alpn()); + } + + if (!tls_session_.send_session_ticket()) { + std::println(stderr, "Unable to send session ticket"); + } + + std::array token; + + auto path = ngtcp2_conn_get_path2(conn_); + auto t = util::system_clock_now(); + + auto tokenlen = ngtcp2_crypto_generate_regular_token( + token.data(), config.static_secret.data(), config.static_secret.size(), + path->remote.addr, path->remote.addrlen, t); + if (tokenlen < 0) { + std::println(stderr, "Unable to generate token"); + + return std::unexpected{Error::QUIC}; + } + + if (auto rv = ngtcp2_conn_submit_new_token(conn_, token.data(), + as_unsigned(tokenlen)); + rv != 0) { + std::println(stderr, "ngtcp2_conn_submit_new_token: {}", + ngtcp2_strerror(rv)); + + return std::unexpected{Error::QUIC}; + } + + return {}; +} + +namespace { +int do_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, + const ngtcp2_crypto_cipher_ctx *hp_ctx, const uint8_t *sample) { + if (ngtcp2_crypto_hp_mask(dest, hp, hp_ctx, sample) != 0) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + if (!config.quiet && config.show_secret) { + debug::print_hp_mask({dest, NGTCP2_HP_MASKLEN}, + {sample, NGTCP2_HP_SAMPLELEN}); + } + + return 0; +} +} // namespace + +namespace { +int recv_crypto_data(ngtcp2_conn *conn, + ngtcp2_encryption_level encryption_level, uint64_t offset, + const uint8_t *data, size_t datalen, void *user_data) { + if (!config.quiet && !config.no_quic_dump) { + debug::print_crypto_data(encryption_level, {data, datalen}); + } + + return ngtcp2_crypto_recv_crypto_data_cb(conn, encryption_level, offset, data, + datalen, user_data); +} +} // namespace + +namespace { +int recv_stream_data(ngtcp2_conn *conn, uint32_t flags, int64_t stream_id, + uint64_t offset, const uint8_t *data, size_t datalen, + void *user_data, void *stream_user_data) { + auto h = static_cast(user_data); + + if (!h->recv_stream_data(flags, stream_id, {data, datalen})) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} +} // namespace + +namespace { +int acked_stream_data_offset(ngtcp2_conn *conn, int64_t stream_id, + uint64_t offset, uint64_t datalen, void *user_data, + void *stream_user_data) { + auto h = static_cast(user_data); + if (!h->acked_stream_data_offset(stream_id, datalen)) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + return 0; +} +} // namespace + +std::expected Handler::acked_stream_data_offset(int64_t stream_id, + uint64_t datalen) { + return proto_codec_->acked_stream_data_offset(stream_id, datalen); +} + +namespace { +int stream_open(ngtcp2_conn *conn, int64_t stream_id, void *user_data) { + auto h = static_cast(user_data); + h->on_stream_open(stream_id); + return 0; +} +} // namespace + +void Handler::on_stream_open(int64_t stream_id) { + if (!ngtcp2_is_bidi_stream(stream_id)) { + return; + } + + assert(!streams_.contains(stream_id)); + + streams_.emplace(stream_id, std::make_unique(stream_id, this)); +} + +Stream *Handler::find_stream(int64_t stream_id) const { + auto it = streams_.find(stream_id); + if (it == std::ranges::end(streams_)) { + return nullptr; + } + + return (*it).second.get(); +} + +namespace { +int stream_close(ngtcp2_conn *conn, uint32_t flags, int64_t stream_id, + uint64_t rx_app_error_code, uint64_t tx_app_error_code, + void *user_data, void *stream_user_data) { + auto h = static_cast(user_data); + if (!h->on_stream_close( + stream_id, + (flags & NGTCP2_STREAM_CLOSE2_FLAG_RX_APP_ERROR_CODE_SET) + ? std::make_optional(rx_app_error_code) + : std::nullopt, + (flags & NGTCP2_STREAM_CLOSE2_FLAG_TX_APP_ERROR_CODE_SET) + ? std::make_optional(tx_app_error_code) + : std::nullopt)) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + return 0; +} +} // namespace + +namespace { +int stream_reset(ngtcp2_conn *conn, int64_t stream_id, uint64_t final_size, + uint64_t app_error_code, void *user_data, + void *stream_user_data) { + auto h = static_cast(user_data); + if (!h->on_stream_reset(stream_id)) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + return 0; +} +} // namespace + +std::expected Handler::on_stream_reset(int64_t stream_id) { + return proto_codec_->on_stream_reset(stream_id); +} + +namespace { +int stream_stop_sending(ngtcp2_conn *conn, int64_t stream_id, + uint64_t app_error_code, void *user_data, + void *stream_user_data) { + auto h = static_cast(user_data); + if (!h->on_stream_stop_sending(stream_id)) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + return 0; +} +} // namespace + +std::expected Handler::on_stream_stop_sending(int64_t stream_id) { + return proto_codec_->on_stream_stop_sending(stream_id); +} + +namespace { +void rand(uint8_t *dest, size_t destlen, const ngtcp2_rand_ctx *rand_ctx) { + if (!util::generate_secure_random({dest, destlen})) { + assert(0); + abort(); + } +} +} // namespace + +namespace { +int get_new_connection_id(ngtcp2_conn *conn, ngtcp2_cid *cid, + ngtcp2_stateless_reset_token *token, size_t cidlen, + void *user_data) { + if (!util::generate_secure_random({cid->data, cidlen})) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + cid->datalen = cidlen; + if (ngtcp2_crypto_generate_stateless_reset_token( + token->data, config.static_secret.data(), config.static_secret.size(), + cid) != 0) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + auto h = static_cast(user_data); + h->server()->associate_cid(cid, h); + + return 0; +} +} // namespace + +namespace { +int remove_connection_id(ngtcp2_conn *conn, const ngtcp2_cid *cid, + void *user_data) { + auto h = static_cast(user_data); + h->server()->dissociate_cid(cid); + return 0; +} +} // namespace + +namespace { +int update_key(ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, + const uint8_t *current_rx_secret, + const uint8_t *current_tx_secret, size_t secretlen, + void *user_data) { + auto h = static_cast(user_data); + if (!h->update_key(rx_secret, tx_secret, rx_aead_ctx, rx_iv, tx_aead_ctx, + tx_iv, current_rx_secret, current_tx_secret, secretlen)) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + return 0; +} +} // namespace + +namespace { +int path_validation(ngtcp2_conn *conn, uint32_t flags, const ngtcp2_path *path, + const ngtcp2_path *old_path, + ngtcp2_path_validation_result res, void *user_data) { + if (!config.quiet) { + debug::path_validation(path, res); + } + + if (res != NGTCP2_PATH_VALIDATION_RESULT_SUCCESS || + !(flags & NGTCP2_PATH_VALIDATION_FLAG_NEW_TOKEN)) { + return 0; + } + + std::array token; + auto t = util::system_clock_now(); + + auto tokenlen = ngtcp2_crypto_generate_regular_token( + token.data(), config.static_secret.data(), config.static_secret.size(), + path->remote.addr, path->remote.addrlen, t); + if (tokenlen < 0) { + std::println(stderr, "Unable to generate token"); + + return 0; + } + + if (auto rv = + ngtcp2_conn_submit_new_token(conn, token.data(), as_unsigned(tokenlen)); + rv != 0) { + std::println(stderr, "ngtcp2_conn_submit_new_token: {}", + ngtcp2_strerror(rv)); + + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} +} // namespace + +namespace { +int extend_max_remote_streams_bidi(ngtcp2_conn *conn, uint64_t max_streams, + void *user_data) { + auto h = static_cast(user_data); + h->extend_max_remote_streams_bidi(max_streams); + return 0; +} +} // namespace + +void Handler::extend_max_remote_streams_bidi(uint64_t max_streams) { + proto_codec_->extend_max_remote_streams_bidi(max_streams); +} + +namespace { +int extend_max_stream_data(ngtcp2_conn *conn, int64_t stream_id, + uint64_t max_data, void *user_data, + void *stream_user_data) { + auto h = static_cast(user_data); + if (!h->extend_max_stream_data(stream_id, max_data)) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + return 0; +} +} // namespace + +std::expected Handler::extend_max_stream_data(int64_t stream_id, + uint64_t max_data) { + return proto_codec_->extend_max_stream_data(stream_id, max_data); +} + +namespace { +int recv_tx_key(ngtcp2_conn *conn, ngtcp2_encryption_level level, + void *user_data) { + if (level != NGTCP2_ENCRYPTION_LEVEL_1RTT) { + return 0; + } + + auto h = static_cast(user_data); + if (!h->on_app_tx_ready()) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} +} // namespace + +std::expected Handler::on_app_tx_ready() { + return proto_codec_->on_app_tx_ready(); +} + +std::expected Handler::start_response(Stream *stream) { + return proto_codec_->start_response(stream); +} + +namespace { +void write_qlog(void *user_data, uint32_t flags, const void *data, + size_t datalen) { + auto h = static_cast(user_data); + h->write_qlog(data, datalen); +} +} // namespace + +void Handler::write_qlog(const void *data, size_t datalen) { + assert(qlog_); + fwrite(data, 1, datalen, qlog_); +} + +std::expected +Handler::init(const Endpoint &ep, const Address &local_addr, + const Address &remote_addr, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, const ngtcp2_cid *ocid, + std::span token, ngtcp2_token_type token_type, + uint32_t version, TLSServerContext &tls_ctx) { + static constexpr auto callbacks = ngtcp2_callbacks{ + .recv_client_initial = ngtcp2_crypto_recv_client_initial_cb, + .recv_crypto_data = ::recv_crypto_data, + .handshake_completed = ::handshake_completed, + .encrypt = ngtcp2_crypto_encrypt_cb, + .decrypt = ngtcp2_crypto_decrypt_cb, + .hp_mask = do_hp_mask, + .recv_stream_data = ::recv_stream_data, + .acked_stream_data_offset = ::acked_stream_data_offset, + .stream_open = stream_open, + .rand = rand, + .remove_connection_id = remove_connection_id, + .update_key = ::update_key, + .path_validation = path_validation, + .stream_reset = ::stream_reset, + .extend_max_remote_streams_bidi = ::extend_max_remote_streams_bidi, + .extend_max_stream_data = ::extend_max_stream_data, + .delete_crypto_aead_ctx = ngtcp2_crypto_delete_crypto_aead_ctx_cb, + .delete_crypto_cipher_ctx = ngtcp2_crypto_delete_crypto_cipher_ctx_cb, + .stream_stop_sending = stream_stop_sending, + .version_negotiation = ngtcp2_crypto_version_negotiation_cb, + .recv_tx_key = ::recv_tx_key, + .get_new_connection_id2 = get_new_connection_id, + .get_path_challenge_data2 = ngtcp2_crypto_get_path_challenge_data2_cb, + .stream_close2 = stream_close, + }; + + scid_.datalen = NGTCP2_SV_SCIDLEN; + if (auto rv = util::generate_secure_random({scid_.data, scid_.datalen}); + !rv) { + std::println(stderr, "Could not generate connection ID"); + return rv; + } + + ngtcp2_settings settings; + ngtcp2_settings_default(&settings); + settings.log_write = config.quiet ? nullptr : debug::log_write; + settings.initial_ts = util::timestamp(); + settings.token = token.data(); + settings.tokenlen = token.size(); + settings.token_type = token_type; + settings.cc_algo = config.cc_algo; + settings.initial_rtt = config.initial_rtt; + settings.max_window = config.max_window; + settings.max_stream_window = config.max_stream_window; + settings.handshake_timeout = config.handshake_timeout; + settings.no_pmtud = config.no_pmtud; + settings.ack_thresh = config.ack_thresh; + if (config.max_udp_payload_size) { + settings.max_tx_udp_payload_size = config.max_udp_payload_size; + settings.no_tx_udp_payload_size_shaping = 1; + } + if (!config.qlog_dir.empty()) { + auto path = config.qlog_dir; + path /= util::format_hex(scid_.data, as_signed(scid_.datalen)); + path += ".sqlog"; + qlog_ = fopen(path.c_str(), "w"); + if (qlog_ == nullptr) { + std::println(stderr, "Could not open qlog file {}: {}", path.native(), + strerror(errno)); + return std::unexpected{Error::IO}; + } + settings.qlog_write = ::write_qlog; + } + if (!config.preferred_versions.empty()) { + settings.preferred_versions = config.preferred_versions.data(); + settings.preferred_versionslen = config.preferred_versions.size(); + } + if (!config.available_versions.empty()) { + settings.available_versions = config.available_versions.data(); + settings.available_versionslen = config.available_versions.size(); + } + if (config.initial_pkt_num == UINT32_MAX) { + auto dis = std::uniform_int_distribution(0, INT32_MAX); + settings.initial_pkt_num = dis(randgen); + } else { + settings.initial_pkt_num = config.initial_pkt_num; + } + + if (!config.pmtud_probes.empty()) { + settings.pmtud_probes = config.pmtud_probes.data(); + settings.pmtud_probeslen = config.pmtud_probes.size(); + + if (!config.max_udp_payload_size) { + settings.max_tx_udp_payload_size = + *std::ranges::max_element(config.pmtud_probes); + } + } + + ngtcp2_transport_params params; + ngtcp2_transport_params_default(¶ms); + params.initial_max_stream_data_bidi_local = config.max_stream_data_bidi_local; + params.initial_max_stream_data_bidi_remote = + config.max_stream_data_bidi_remote; + params.initial_max_stream_data_uni = config.max_stream_data_uni; + params.initial_max_data = config.max_data; + params.initial_max_streams_bidi = config.max_streams_bidi; + params.initial_max_streams_uni = config.max_streams_uni; + params.max_idle_timeout = config.timeout; + params.stateless_reset_token_present = 1; + params.active_connection_id_limit = 7; + params.grease_quic_bit = 1; + + if (ocid) { + params.original_dcid = *ocid; + params.retry_scid = *scid; + params.retry_scid_present = 1; + } else { + params.original_dcid = *scid; + } + + params.original_dcid_present = 1; + + if (ngtcp2_crypto_generate_stateless_reset_token( + params.stateless_reset_token, config.static_secret.data(), + config.static_secret.size(), &scid_) != 0) { + return std::unexpected{Error::QUIC}; + } + + if (!config.preferred_ipv4_addr.empty() || + !config.preferred_ipv6_addr.empty()) { + params.preferred_addr_present = 1; + + if (!config.preferred_ipv4_addr.empty()) { + params.preferred_addr.ipv4 = + std::get(config.preferred_ipv4_addr.skaddr); + params.preferred_addr.ipv4_present = 1; + } + + if (!config.preferred_ipv6_addr.empty()) { + params.preferred_addr.ipv6 = + std::get(config.preferred_ipv6_addr.skaddr); + params.preferred_addr.ipv6_present = 1; + } + + if (auto rv = util::generate_secure_random( + params.preferred_addr.stateless_reset_token); + !rv) { + std::println( + stderr, "Could not generate preferred address stateless reset token"); + return rv; + } + + params.preferred_addr.cid.datalen = NGTCP2_SV_SCIDLEN; + if (auto rv = util::generate_secure_random( + {params.preferred_addr.cid.data, params.preferred_addr.cid.datalen}); + !rv) { + std::println(stderr, + "Could not generate preferred address connection ID"); + return rv; + } + } + + auto path = ngtcp2_path{ + .local = as_ngtcp2_addr(local_addr), + .remote = as_ngtcp2_addr(remote_addr), + .user_data = const_cast(&ep), + }; + if (auto rv = + ngtcp2_conn_server_new(&conn_, dcid, &scid_, &path, version, &callbacks, + &settings, ¶ms, nullptr, this); + rv != 0) { + std::println(stderr, "ngtcp2_conn_server_new: {}", ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + + proto_codec_ = std::make_unique(this, last_error_); + + if (auto rv = tls_session_.init(tls_ctx, this); !rv) { + return rv; + } + + tls_session_.enable_keylog(); + + ngtcp2_conn_set_tls_native_handle(conn_, tls_session_.get_native_handle()); + + ev_io_set(&wev_, ep.fd, EV_WRITE); + + return {}; +} + +std::expected Handler::feed_data(const Endpoint &ep, + const Address &local_addr, + const Address &remote_addr, + const ngtcp2_pkt_info *pi, + std::span data) { + auto path = ngtcp2_path{ + .local = as_ngtcp2_addr(local_addr), + .remote = as_ngtcp2_addr(remote_addr), + .user_data = const_cast(&ep), + }; + + if (auto rv = ngtcp2_conn_read_pkt(conn_, &path, pi, data.data(), data.size(), + util::timestamp()); + rv != 0) { + std::println(stderr, "ngtcp2_conn_read_pkt: {}", ngtcp2_strerror(rv)); + switch (rv) { + case NGTCP2_ERR_DRAINING: + start_draining_period(); + return std::unexpected{Error::CLOSE_WAIT}; + case NGTCP2_ERR_RETRY: + return std::unexpected{Error::RETRY_CONN}; + case NGTCP2_ERR_DROP_CONN: + return std::unexpected{Error::DROP_CONN}; + case NGTCP2_ERR_CRYPTO: + if (!last_error_.error_code) { + ngtcp2_ccerr_set_tls_alert( + &last_error_, ngtcp2_conn_get_tls_alert2(conn_), nullptr, 0); + } + break; + default: + if (!last_error_.error_code) { + ngtcp2_ccerr_set_liberr(&last_error_, rv, nullptr, 0); + } + } + return handle_error(); + } + + return {}; +} + +std::expected Handler::on_read(const Endpoint &ep, + const Address &local_addr, + const Address &remote_addr, + const ngtcp2_pkt_info *pi, + std::span data) { + if (auto rv = feed_data(ep, local_addr, remote_addr, pi, data); !rv) { + return rv; + } + + update_timer(); + + return {}; +} + +std::expected Handler::handle_expiry() { + auto now = util::timestamp(); + if (auto rv = ngtcp2_conn_handle_expiry(conn_, now); rv != 0) { + std::println(stderr, "ngtcp2_conn_handle_expiry: {}", ngtcp2_strerror(rv)); + ngtcp2_ccerr_set_liberr(&last_error_, rv, nullptr, 0); + return handle_error(); + } + + return {}; +} + +std::expected Handler::on_write() { + if (ngtcp2_conn_in_closing_period2(conn_) || + ngtcp2_conn_in_draining_period2(conn_)) { + return {}; + } + + if (tx_.send_blocked) { + send_blocked_packet(); + + if (tx_.send_blocked) { + return {}; + } + } + + ev_io_stop(loop_, &wev_); + + if (auto rv = write_streams(); !rv) { + return rv; + } + + update_timer(); + + return {}; +} + +namespace { +ngtcp2_ssize write_pkt(ngtcp2_conn *conn, ngtcp2_path *path, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, + ngtcp2_tstamp ts, void *user_data) { + auto h = static_cast(user_data); + + return h->write_pkt(path, pi, dest, destlen, ts); +} +} // namespace + +ngtcp2_ssize Handler::write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, + uint8_t *dest, size_t destlen, + ngtcp2_tstamp ts) { + return proto_codec_->write_pkt(path, pi, dest, destlen, ts); +} + +std::expected Handler::write_streams() { + ngtcp2_path_storage ps; + ngtcp2_pkt_info pi; + size_t gso_size; + auto ts = util::timestamp(); + auto txbuf = std::span{txbuf_}; + auto buflen = util::clamp_buffer_size(conn_, txbuf.size(), config.gso_burst); + + ngtcp2_path_storage_zero(&ps); + + auto nwrite = ngtcp2_conn_write_aggregate_pkt2( + conn_, &ps.path, &pi, txbuf.data(), buflen, &gso_size, ::write_pkt, + config.gso_burst, ts); + if (nwrite < 0) { + return handle_error(); + } + + ngtcp2_conn_update_pkt_tx_time(conn_, ts); + + if (nwrite == 0) { + return {}; + } + + (void)send_packet(ps.path, pi.ecn, txbuf.first(static_cast(nwrite)), + gso_size); + + return {}; +} + +std::expected Handler::send_packet(const ngtcp2_path &path, + unsigned int ecn, + std::span data, + size_t gso_size) { + auto &ep = *static_cast(path.user_data); + auto rest = server_->send_packet(ep, no_gso_, path.local, path.remote, ecn, + data, gso_size); + if (!rest.empty()) { + on_send_blocked(path, ecn, rest, gso_size); + + start_wev_endpoint(ep); + + return std::unexpected{Error::SEND_BLOCKED}; + } + + return {}; +} + +void Handler::on_send_blocked(const ngtcp2_path &path, unsigned int ecn, + std::span data, size_t gso_size) { + assert(!tx_.send_blocked); + assert(gso_size); + + tx_.send_blocked = true; + + auto &p = tx_.blocked; + + p.local_addr.set(path.local.addr); + p.remote_addr.set(path.remote.addr); + + p.endpoint = static_cast(path.user_data); + p.ecn = ecn; + p.data = data; + p.gso_size = gso_size; +} + +void Handler::start_wev_endpoint(const Endpoint &ep) { + // We do not close ep.fd, so we can expect that each Endpoint has + // unique fd. + if (ep.fd != wev_.fd) { + if (ev_is_active(&wev_)) { + ev_io_stop(loop_, &wev_); + } + + ev_io_set(&wev_, ep.fd, EV_WRITE); + } + + ev_io_start(loop_, &wev_); +} + +void Handler::send_blocked_packet() { + assert(tx_.send_blocked); + + auto &p = tx_.blocked; + + auto rest = server_->send_packet( + *p.endpoint, no_gso_, as_ngtcp2_addr(p.local_addr), + as_ngtcp2_addr(p.remote_addr), p.ecn, p.data, p.gso_size); + if (!rest.empty()) { + p.data = rest; + + start_wev_endpoint(*p.endpoint); + + return; + } + + tx_.send_blocked = false; +} + +void Handler::signal_write() { ev_io_start(loop_, &wev_); } + +void Handler::start_draining_period() { + ev_io_stop(loop_, &wev_); + + ev_set_cb(&timer_, close_waitcb); + timer_.repeat = + static_cast(ngtcp2_conn_get_pto2(conn_)) / NGTCP2_SECONDS * 3; + ev_timer_again(loop_, &timer_); + + if (!config.quiet) { + std::println(stderr, "Draining period has started ({:.9f} seconds)", + timer_.repeat); + } +} + +std::expected Handler::start_closing_period() { + if (!conn_ || ngtcp2_conn_in_closing_period2(conn_) || + ngtcp2_conn_in_draining_period2(conn_)) { + return {}; + } + + ev_io_stop(loop_, &wev_); + + ev_set_cb(&timer_, close_waitcb); + timer_.repeat = + static_cast(ngtcp2_conn_get_pto2(conn_)) / NGTCP2_SECONDS * 3; + ev_timer_again(loop_, &timer_); + + if (!config.quiet) { + std::println(stderr, "Closing period has started ({:.9f} seconds)", + timer_.repeat); + } + + conn_closebuf_ = std::make_unique(NGTCP2_MAX_UDP_PAYLOAD_SIZE); + + ngtcp2_path_storage ps; + + ngtcp2_path_storage_zero(&ps); + + ngtcp2_pkt_info pi; + auto n = ngtcp2_conn_write_connection_close( + conn_, &ps.path, &pi, conn_closebuf_->wpos(), conn_closebuf_->left(), + &last_error_, util::timestamp()); + if (n < 0) { + std::println(stderr, "ngtcp2_conn_write_connection_close: {}", + ngtcp2_strerror(static_cast(n))); + return std::unexpected{Error::QUIC}; + } + + if (n == 0) { + return {}; + } + + conn_closebuf_->push(as_unsigned(n)); + + return {}; +} + +std::expected Handler::handle_error() { + if (last_error_.type == NGTCP2_CCERR_TYPE_IDLE_CLOSE) { + return std::unexpected{Error::INTERNAL}; + } + + if (auto rv = start_closing_period(); !rv) { + return rv; + } + + if (ngtcp2_conn_in_draining_period2(conn_)) { + return std::unexpected{Error::CLOSE_WAIT}; + } + + if (auto rv = send_conn_close(); !rv) { + return rv; + } + + return std::unexpected{Error::CLOSE_WAIT}; +} + +std::expected Handler::send_conn_close() { + if (!config.quiet) { + std::println(stderr, "Closing Period: TX CONNECTION_CLOSE"); + } + + assert(conn_closebuf_ && conn_closebuf_->size()); + assert(conn_); + assert(!ngtcp2_conn_in_draining_period2(conn_)); + + auto path = ngtcp2_conn_get_path2(conn_); + + return server_->send_packet(*static_cast(path->user_data), + path->local, path->remote, + /* ecn = */ 0, conn_closebuf_->data()); +} + +std::expected +Handler::send_conn_close(const Endpoint &ep, const Address &local_addr, + const Address &remote_addr, const ngtcp2_pkt_info *pi, + std::span data) { + assert(conn_closebuf_ && conn_closebuf_->size()); + + close_wait_.bytes_recv += data.size(); + ++close_wait_.num_pkts_recv; + + if (close_wait_.num_pkts_recv < close_wait_.next_pkts_recv || + close_wait_.bytes_recv * 3 < + close_wait_.bytes_sent + conn_closebuf_->size()) { + return {}; + } + + if (auto rv = server_->send_packet(ep, as_ngtcp2_addr(local_addr), + as_ngtcp2_addr(remote_addr), + /* ecn = */ 0, conn_closebuf_->data()); + !rv) { + return rv; + } + + close_wait_.bytes_sent += conn_closebuf_->size(); + close_wait_.next_pkts_recv *= 2; + + return {}; +} + +void Handler::update_timer() { + auto expiry = ngtcp2_conn_get_expiry2(conn_); + auto now = util::timestamp(); + + if (expiry <= now) { + if (!config.quiet) { + auto t = static_cast(now - expiry) / NGTCP2_SECONDS; + std::println(stderr, "Timer has already expired: {:.9f}s", t); + } + + ev_feed_event(loop_, &timer_, EV_TIMER); + + return; + } + + auto t = static_cast(expiry - now) / NGTCP2_SECONDS; + if (!config.quiet) { + std::println(stderr, "Set timer={:.9f}s", t); + } + timer_.repeat = t; + ev_timer_again(loop_, &timer_); +} + +std::expected +Handler::recv_stream_data(uint32_t flags, int64_t stream_id, + std::span data) { + if (!config.quiet && !config.no_quic_dump) { + debug::print_stream_data(stream_id, data); + } + + return proto_codec_->recv_stream_data(flags, stream_id, data); +} + +std::expected +Handler::update_key(uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, + const uint8_t *current_rx_secret, + const uint8_t *current_tx_secret, size_t secretlen) { + auto crypto_ctx = ngtcp2_conn_get_crypto_ctx2(conn_); + auto aead = &crypto_ctx->aead; + auto keylen = ngtcp2_crypto_aead_keylen(aead); + auto ivlen = ngtcp2_crypto_packet_protection_ivlen(aead); + + ++nkey_update_; + + std::array rx_key, tx_key; + + if (ngtcp2_crypto_update_key(conn_, rx_secret, tx_secret, rx_aead_ctx, + rx_key.data(), rx_iv, tx_aead_ctx, tx_key.data(), + tx_iv, current_rx_secret, current_tx_secret, + secretlen) != 0) { + return std::unexpected{Error::QUIC}; + } + + if (!config.quiet && config.show_secret) { + std::println(stderr, "application_traffic rx secret {}", nkey_update_); + debug::print_secrets({rx_secret, secretlen}, {rx_key.data(), keylen}, + {rx_iv, ivlen}); + std::println(stderr, "application_traffic tx secret {}", nkey_update_); + debug::print_secrets({tx_secret, secretlen}, {tx_key.data(), keylen}, + {tx_iv, ivlen}); + } + + return {}; +} + +Server *Handler::server() const { return server_; } + +std::expected +Handler::on_stream_close(int64_t stream_id, + std::optional rx_app_error_code, + std::optional tx_app_error_code) { + if (!config.quiet) { + std::println(stderr, "QUIC stream {:#x} closed", stream_id); + } + + if (auto rv = proto_codec_->on_stream_close(stream_id, rx_app_error_code, + tx_app_error_code); + !rv) { + return rv; + } + + if (!ngtcp2_conn_is_local_stream2(conn_, stream_id)) { + if (ngtcp2_is_bidi_stream(stream_id)) { + ngtcp2_conn_extend_max_streams_bidi(conn_, 1); + } + + // TODO We might later add uni stream extension here. + } + + auto it = streams_.find(stream_id); + if (it != std::ranges::end(streams_)) { + streams_.erase(it); + } + + return {}; +} + +void Handler::shutdown_read(int64_t stream_id, uint64_t app_error_code) { + ngtcp2_conn_shutdown_stream_read(conn_, 0, stream_id, app_error_code); +} + +namespace { +void sreadcb(struct ev_loop *loop, ev_io *w, int revents) { + auto ep = static_cast(w->data); + + ep->server->on_read(*ep); +} +} // namespace + +namespace { +void siginthandler(struct ev_loop *loop, ev_signal *watcher, int revents) { + ev_break(loop, EVBREAK_ALL); +} +} // namespace + +Server::Server(struct ev_loop *loop, TLSServerContext &tls_ctx) + : loop_{loop}, tls_ctx_{tls_ctx} { + ev_signal_init(&sigintev_, siginthandler, SIGINT); + + ev_timer_init( + &stateless_reset_regen_timer_, + [](struct ev_loop *loop, ev_timer *w, int revents) { + auto server = static_cast(w->data); + + server->on_stateless_reset_regen(); + }, + 0., 1.); + stateless_reset_regen_timer_.data = this; +} + +Server::~Server() { + disconnect(); + close(); +} + +void Server::disconnect() { + config.tx_loss_prob = 0; + + for (auto &ep : endpoints_) { + ev_io_stop(loop_, &ep.rev); + } + + ev_timer_stop(loop_, &stateless_reset_regen_timer_); + ev_signal_stop(loop_, &sigintev_); + + while (!handlers_.empty()) { + auto it = std::ranges::begin(handlers_); + auto &h = (*it).second; + + (void)h->handle_error(); + + remove(h); + } +} + +void Server::close() { + for (auto &ep : endpoints_) { + ::close(ep.fd); + } + + endpoints_.clear(); +} + +namespace { +std::expected create_sock(Address &local_addr, const char *addr, + const char *port, int family) { + addrinfo hints{ + .ai_flags = AI_PASSIVE, + .ai_family = family, + .ai_socktype = SOCK_DGRAM, + }; + addrinfo *res, *rp; + int val = 1; + + if (strcmp(addr, "*") == 0) { + addr = nullptr; + } + + if (auto rv = getaddrinfo(addr, port, &hints, &res); rv != 0) { + std::println(stderr, "getaddrinfo: {}", gai_strerror(rv)); + return std::unexpected{Error::LIBC}; + } + + auto res_d = defer([res] { freeaddrinfo(res); }); + + int fd = -1; + + for (rp = res; rp; rp = rp->ai_next) { + auto maybe_fd = util::create_nonblock_socket(rp->ai_family, rp->ai_socktype, + rp->ai_protocol); + if (!maybe_fd) { + continue; + } + + fd = *maybe_fd; + + if (rp->ai_family == AF_INET6) { + if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &val, + static_cast(sizeof(val))) == -1) { + close(fd); + continue; + } + + if (setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &val, + static_cast(sizeof(val))) == -1) { + close(fd); + continue; + } + } else if (setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &val, + static_cast(sizeof(val))) == -1) { + close(fd); + continue; + } + + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, + static_cast(sizeof(val))) == -1) { + close(fd); + continue; + } + + fd_set_recv_ecn(fd, rp->ai_family); + fd_set_ip_mtu_discover(fd, rp->ai_family); + fd_set_ip_dontfrag(fd, family); + fd_set_udp_gro(fd); + + if (bind(fd, rp->ai_addr, rp->ai_addrlen) != -1) { + break; + } + + close(fd); + } + + if (!rp) { + std::println(stderr, "Could not bind"); + return std::unexpected{Error::SYSCALL}; + } + + sockaddr_storage ss; + socklen_t len = sizeof(ss); + if (getsockname(fd, reinterpret_cast(&ss), &len) == -1) { + std::println(stderr, "getsockname: {}", strerror(errno)); + close(fd); + return std::unexpected{Error::SYSCALL}; + } + + local_addr.set(reinterpret_cast(&ss)); + + return fd; +} + +} // namespace + +namespace { +std::expected add_endpoint(std::vector &endpoints, + const char *addr, const char *port, + int af) { + Address dest; + auto maybe_fd = create_sock(dest, addr, port, af); + if (!maybe_fd) { + return std::unexpected{maybe_fd.error()}; + } + + endpoints.emplace_back(); + auto &ep = endpoints.back(); + ep.addr = dest; + ep.fd = *maybe_fd; + ev_io_init(&ep.rev, sreadcb, 0, EV_READ); + ev_set_priority(&ep.rev, EV_MAXPRI); + + return {}; +} +} // namespace + +namespace { +std::expected add_endpoint(std::vector &endpoints, + const Address &addr) { + auto family = addr.family(); + + auto maybe_fd = util::create_nonblock_socket(family, SOCK_DGRAM, 0); + if (!maybe_fd) { + std::println(stderr, "socket: {}", strerror(errno)); + return std::unexpected{maybe_fd.error()}; + } + + auto fd = *maybe_fd; + + int val = 1; + if (family == AF_INET6) { + if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &val, + static_cast(sizeof(val))) == -1) { + std::println(stderr, "setsockopt: {}", strerror(errno)); + close(fd); + return std::unexpected{Error::SYSCALL}; + } + + if (setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &val, + static_cast(sizeof(val))) == -1) { + std::println(stderr, "setsockopt: {}", strerror(errno)); + close(fd); + return std::unexpected{Error::SYSCALL}; + } + } else if (setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &val, + static_cast(sizeof(val))) == -1) { + std::println(stderr, "setsockopt: {}", strerror(errno)); + close(fd); + return std::unexpected{Error::SYSCALL}; + } + + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, + static_cast(sizeof(val))) == -1) { + close(fd); + return std::unexpected{Error::SYSCALL}; + } + + fd_set_recv_ecn(fd, family); + fd_set_ip_mtu_discover(fd, family); + fd_set_ip_dontfrag(fd, family); + fd_set_udp_gro(fd); + + if (bind(fd, addr.as_sockaddr(), addr.size()) == -1) { + std::println(stderr, "bind: {}", strerror(errno)); + close(fd); + return std::unexpected{Error::SYSCALL}; + } + + endpoints.emplace_back(Endpoint{}); + auto &ep = endpoints.back(); + ep.addr = addr; + ep.fd = fd; + ev_io_init(&ep.rev, sreadcb, 0, EV_READ); + ev_set_priority(&ep.rev, EV_MAXPRI); + + return {}; +} +} // namespace + +std::expected Server::init(const char *addr, const char *port) { + endpoints_.reserve(4); + + auto ready = false; + auto error = Error::INTERNAL; + + if (!util::numeric_host(addr, AF_INET6)) { + if (auto rv = add_endpoint(endpoints_, addr, port, AF_INET); !rv) { + error = rv.error(); + } else { + ready = true; + } + } + if (!util::numeric_host(addr, AF_INET)) { + if (auto rv = add_endpoint(endpoints_, addr, port, AF_INET6); !rv) { + error = rv.error(); + } else { + ready = true; + } + } + if (!ready) { + return std::unexpected{error}; + } + + if (!config.preferred_ipv4_addr.empty()) { + if (auto rv = add_endpoint(endpoints_, config.preferred_ipv4_addr); !rv) { + return rv; + } + } + + if (!config.preferred_ipv6_addr.empty()) { + if (auto rv = add_endpoint(endpoints_, config.preferred_ipv6_addr); !rv) { + return rv; + } + } + + for (auto &ep : endpoints_) { + ep.server = this; + ep.rev.data = &ep; + + ev_io_set(&ep.rev, ep.fd, EV_READ); + + ev_io_start(loop_, &ep.rev); + } + + ev_signal_start(loop_, &sigintev_); + + return {}; +} + +void Server::on_read(const Endpoint &ep) { + sockaddr_storage ss; + std::array buf; + size_t pktcnt = 0; + ngtcp2_pkt_info pi; + + iovec msg_iov{ + .iov_base = buf.data(), + .iov_len = buf.size(), + }; + + uint8_t msg_ctrl[CMSG_SPACE(sizeof(int)) + CMSG_SPACE(sizeof(in6_pktinfo)) + + CMSG_SPACE(sizeof(int))]; + + msghdr msg{ + .msg_name = &ss, + .msg_iov = &msg_iov, + .msg_iovlen = 1, + .msg_control = msg_ctrl, + }; + + auto start = util::timestamp(); + + for (; pktcnt < MAX_RECV_PKTS;) { + if (util::recv_pkt_time_threshold_exceeded( + config.cc_algo == NGTCP2_CC_ALGO_BBR, start, pktcnt)) { + return; + } + + msg.msg_namelen = sizeof(ss); + msg.msg_controllen = sizeof(msg_ctrl); + + auto nread = recvmsg(ep.fd, &msg, 0); + if (nread == -1) { + if (!(errno == EAGAIN || errno == ENOTCONN)) { + std::println(stderr, "recvmsg: {}", strerror(errno)); + } + return; + } + + // Packets less than 21 bytes never be a valid QUIC packet. + if (nread < 21) { + ++pktcnt; + + continue; + } + + Address remote_addr; + remote_addr.set(reinterpret_cast(&ss)); + + if (util::prohibited_port(remote_addr.port())) { + ++pktcnt; + + continue; + } + + pi.ecn = msghdr_get_ecn(&msg, ss.ss_family); + auto local_addr = msghdr_get_local_addr(&msg, ss.ss_family); + if (!local_addr) { + ++pktcnt; + std::println(stderr, "Unable to obtain local address"); + continue; + } + + auto gso_size = msghdr_get_udp_gro(&msg); + if (gso_size == 0) { + gso_size = static_cast(nread); + } + + local_addr->port(ep.addr.port()); + + auto data = std::span{buf.data(), static_cast(nread)}; + + for (; !data.empty();) { + auto datalen = std::min(data.size(), gso_size); + + ++pktcnt; + + if (!config.quiet) { + std::array ifname; + std::println( + stderr, + "Received packet: local={} remote={} if={} ecn={:#x} {} bytes", + util::straddr(*local_addr), util::straddr(remote_addr), + if_indextoname(local_addr->ifindex, ifname.data()), pi.ecn, datalen); + } + + // Packets less than 21 bytes never be a valid QUIC packet. + if (datalen < 21) { + break; + } + + if (debug::packet_lost(config.rx_loss_prob)) { + if (!config.quiet) { + std::println(stderr, "** Simulated incoming packet loss **"); + } + } else { + read_pkt(ep, *local_addr, remote_addr, &pi, {data.data(), datalen}); + } + + data = data.subspan(datalen); + } + } +} + +void Server::read_pkt(const Endpoint &ep, const Address &local_addr, + const Address &remote_addr, const ngtcp2_pkt_info *pi, + std::span data) { + ngtcp2_version_cid vc; + + switch (auto rv = ngtcp2_pkt_decode_version_cid(&vc, data.data(), data.size(), + NGTCP2_SV_SCIDLEN); + rv) { + case 0: + break; + case NGTCP2_ERR_VERSION_NEGOTIATION: + (void)send_version_negotiation(vc.version, {vc.scid, vc.scidlen}, + {vc.dcid, vc.dcidlen}, ep, local_addr, + remote_addr); + return; + default: + std::println(stderr, + "Could not decode version and CID from QUIC packet header: {}", + ngtcp2_strerror(rv)); + return; + } + + auto dcid_key = util::make_cid_key({vc.dcid, vc.dcidlen}); + + auto handler_it = handlers_.find(dcid_key); + if (handler_it == std::ranges::end(handlers_)) { + ngtcp2_pkt_hd hd; + + if (auto rv = ngtcp2_accept(&hd, data.data(), data.size()); rv != 0) { + if (!config.quiet) { + std::println(stderr, "Unexpected packet received: length={}", + data.size()); + } + + if (!(data[0] & 0x80) && data.size() >= NGTCP2_SV_SCIDLEN + 21) { + (void)send_stateless_reset(data.size(), {vc.dcid, vc.dcidlen}, ep, + local_addr, remote_addr); + } + + return; + } + + ngtcp2_cid ocid; + ngtcp2_cid *pocid = nullptr; + ngtcp2_token_type token_type = NGTCP2_TOKEN_TYPE_UNKNOWN; + + assert(hd.type == NGTCP2_PKT_INITIAL); + + if (config.validate_addr || hd.tokenlen) { + std::println(stderr, "Perform stateless address validation"); + if (hd.tokenlen == 0) { + (void)send_retry(&hd, ep, local_addr, remote_addr, data.size() * 3); + return; + } + + if (hd.token[0] != NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2 && + hd.dcid.datalen < NGTCP2_MIN_INITIAL_DCIDLEN) { + (void)send_stateless_connection_close(&hd, ep, local_addr, remote_addr); + return; + } + + switch (hd.token[0]) { + case NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2: + if (auto rv = verify_retry_token(&ocid, &hd, remote_addr); !rv) { + if (rv.error() != Error::UNREADABLE_TOKEN || config.validate_addr) { + (void)send_stateless_connection_close(&hd, ep, local_addr, + remote_addr); + + return; + } + + hd.token = nullptr; + hd.tokenlen = 0; + } else { + pocid = &ocid; + token_type = NGTCP2_TOKEN_TYPE_RETRY; + } + + break; + case NGTCP2_CRYPTO_TOKEN_MAGIC_REGULAR: + if (!verify_token(&hd, remote_addr)) { + if (config.validate_addr) { + (void)send_retry(&hd, ep, local_addr, remote_addr, data.size() * 3); + return; + } + + hd.token = nullptr; + hd.tokenlen = 0; + } else { + token_type = NGTCP2_TOKEN_TYPE_NEW_TOKEN; + } + break; + default: + if (!config.quiet) { + std::println(stderr, "Ignore unrecognized token"); + } + if (config.validate_addr) { + (void)send_retry(&hd, ep, local_addr, remote_addr, data.size() * 3); + return; + } + + hd.token = nullptr; + hd.tokenlen = 0; + break; + } + } + + auto h = std::make_unique(loop_, this); + if (!h->init(ep, local_addr, remote_addr, &hd.scid, &hd.dcid, pocid, + {hd.token, hd.tokenlen}, token_type, hd.version, tls_ctx_)) { + return; + } + + if (auto rv = h->on_read(ep, local_addr, remote_addr, pi, data); !rv) { + if (rv.error() == Error::RETRY_CONN) { + (void)send_retry(&hd, ep, local_addr, remote_addr, data.size() * 3); + } + + return; + } + + if (!h->on_write()) { + return; + } + + std::array scids; + auto conn = h->conn(); + + auto num_scid = ngtcp2_conn_get_scid2(conn, nullptr); + + assert(num_scid <= scids.size()); + + ngtcp2_conn_get_scid2(conn, scids.data()); + + for (size_t i = 0; i < num_scid; ++i) { + associate_cid(&scids[i], h.get()); + } + + handlers_.emplace(dcid_key, h.release()); + + return; + } + + auto h = (*handler_it).second; + auto conn = h->conn(); + if (ngtcp2_conn_in_closing_period2(conn)) { + if (!h->send_conn_close(ep, local_addr, remote_addr, pi, data)) { + remove(h); + } + return; + } + if (ngtcp2_conn_in_draining_period2(conn)) { + return; + } + + if (auto rv = h->on_read(ep, local_addr, remote_addr, pi, data); !rv) { + if (rv.error() != Error::CLOSE_WAIT) { + remove(h); + } + return; + } + + h->signal_write(); +} + +namespace { +uint32_t generate_reserved_version(const Address &addr, uint32_t version) { + uint32_t h = 0x811C9DC5U; + const uint8_t *p = reinterpret_cast(addr.as_sockaddr()); + const uint8_t *ep = p + addr.size(); + for (; p != ep; ++p) { + h ^= *p; + h *= 0x01000193U; + } + version = htonl(version); + p = (const uint8_t *)&version; + ep = p + sizeof(version); + for (; p != ep; ++p) { + h ^= *p; + h *= 0x01000193U; + } + h &= 0xF0F0F0F0U; + h |= 0x0A0A0A0AU; + return h; +} +} // namespace + +std::expected Server::send_version_negotiation( + uint32_t version, std::span dcid, + std::span scid, const Endpoint &ep, const Address &local_addr, + const Address &remote_addr) { + Buffer buf{NGTCP2_MAX_UDP_PAYLOAD_SIZE}; + std::array sv; + + auto p = std::ranges::begin(sv); + + *p++ = generate_reserved_version(remote_addr, version); + + if (config.preferred_versions.empty()) { + *p++ = NGTCP2_PROTO_VER_V1; + } else { + for (auto v : config.preferred_versions) { + *p++ = v; + } + } + + auto nwrite = ngtcp2_pkt_write_version_negotiation( + buf.wpos(), buf.left(), std::uniform_int_distribution()(randgen), + dcid.data(), dcid.size(), scid.data(), scid.size(), sv.data(), + as_unsigned(p - std::ranges::begin(sv))); + if (nwrite < 0) { + std::println(stderr, "ngtcp2_pkt_write_version_negotiation: {}", + ngtcp2_strerror(static_cast(nwrite))); + return std::unexpected{Error::QUIC}; + } + + buf.push(as_unsigned(nwrite)); + + return send_packet(ep, as_ngtcp2_addr(local_addr), + as_ngtcp2_addr(remote_addr), + /* ecn = */ 0, buf.data()); +} + +std::expected Server::send_retry(const ngtcp2_pkt_hd *chd, + const Endpoint &ep, + const Address &local_addr, + const Address &remote_addr, + size_t max_pktlen) { + std::array host; + std::array port; + + if (auto rv = getnameinfo(remote_addr.as_sockaddr(), remote_addr.size(), + host.data(), host.size(), port.data(), port.size(), + NI_NUMERICHOST | NI_NUMERICSERV); + rv != 0) { + std::println(stderr, "getnameinfo: {}", gai_strerror(rv)); + return std::unexpected{Error::LIBC}; + } + + if (!config.quiet) { + std::println(stderr, "Sending Retry packet to [{}]:{}", host.data(), + port.data()); + } + + ngtcp2_cid scid; + + scid.datalen = NGTCP2_SV_SCIDLEN; + if (auto rv = util::generate_secure_random({scid.data, scid.datalen}); !rv) { + return rv; + } + + std::array tokenbuf; + + auto t = util::system_clock_now(); + + auto tokenlen = ngtcp2_crypto_generate_retry_token2( + tokenbuf.data(), config.static_secret.data(), config.static_secret.size(), + chd->version, remote_addr.as_sockaddr(), remote_addr.size(), &scid, + &chd->dcid, t); + if (tokenlen < 0) { + return std::unexpected{Error::QUIC}; + } + + auto token = std::span{tokenbuf}.first(as_unsigned(tokenlen)); + + if (!config.quiet) { + std::println(stderr, "Generated address validation token:"); + (void)util::hexdump(stderr, token); + } + + Buffer buf{ + std::min(static_cast(NGTCP2_MAX_UDP_PAYLOAD_SIZE), max_pktlen)}; + + auto nwrite = + ngtcp2_crypto_write_retry(buf.wpos(), buf.left(), chd->version, &chd->scid, + &scid, &chd->dcid, token.data(), token.size()); + if (nwrite < 0) { + std::println(stderr, "ngtcp2_crypto_write_retry failed"); + return std::unexpected{Error::QUIC}; + } + + buf.push(as_unsigned(nwrite)); + + return send_packet(ep, as_ngtcp2_addr(local_addr), + as_ngtcp2_addr(remote_addr), + /* ecn = */ 0, buf.data()); +} + +std::expected Server::send_stateless_connection_close( + const ngtcp2_pkt_hd *chd, const Endpoint &ep, const Address &local_addr, + const Address &remote_addr) { + Buffer buf{NGTCP2_MAX_UDP_PAYLOAD_SIZE}; + + auto nwrite = ngtcp2_crypto_write_connection_close( + buf.wpos(), buf.left(), chd->version, &chd->scid, &chd->dcid, + NGTCP2_INVALID_TOKEN, nullptr, 0); + if (nwrite < 0) { + std::println(stderr, "ngtcp2_crypto_write_connection_close failed"); + return std::unexpected{Error::QUIC}; + } + + buf.push(as_unsigned(nwrite)); + + return send_packet(ep, as_ngtcp2_addr(local_addr), + as_ngtcp2_addr(remote_addr), + /* ecn = */ 0, buf.data()); +} + +std::expected +Server::send_stateless_reset(size_t pktlen, std::span dcid, + const Endpoint &ep, const Address &local_addr, + const Address &remote_addr) { + if (stateless_reset_bucket_ == 0) { + return {}; + } + + --stateless_reset_bucket_; + + if (!ev_is_active(&stateless_reset_regen_timer_)) { + ev_timer_again(loop_, &stateless_reset_regen_timer_); + } + + ngtcp2_cid cid; + + ngtcp2_cid_init(&cid, dcid.data(), dcid.size()); + + ngtcp2_stateless_reset_token token; + + if (ngtcp2_crypto_generate_stateless_reset_token( + token.data, config.static_secret.data(), config.static_secret.size(), + &cid) != 0) { + return std::unexpected{Error::QUIC}; + } + + // SCID + minimum expansion - NGTCP2_STATELESS_RESET_TOKENLEN + constexpr size_t max_rand_byteslen = + NGTCP2_MAX_CIDLEN + 22 - NGTCP2_STATELESS_RESET_TOKENLEN; + + size_t rand_byteslen; + + if (pktlen <= 43) { + // As per + // https://datatracker.ietf.org/doc/html/rfc9000#section-10.3 + rand_byteslen = pktlen - NGTCP2_STATELESS_RESET_TOKENLEN - 1; + } else { + rand_byteslen = max_rand_byteslen; + } + + std::array rand_bytes; + + if (auto rv = + util::generate_secure_random({rand_bytes.data(), rand_byteslen}); + !rv) { + return rv; + } + + Buffer buf{NGTCP2_MAX_UDP_PAYLOAD_SIZE}; + + auto nwrite = ngtcp2_pkt_write_stateless_reset2( + buf.wpos(), buf.left(), &token, rand_bytes.data(), rand_byteslen); + if (nwrite < 0) { + std::println(stderr, "ngtcp2_pkt_write_stateless_reset2: {}", + ngtcp2_strerror(static_cast(nwrite))); + + return std::unexpected{Error::QUIC}; + } + + buf.push(as_unsigned(nwrite)); + + return send_packet(ep, as_ngtcp2_addr(local_addr), + as_ngtcp2_addr(remote_addr), + /* ecn = */ 0, buf.data()); +} + +std::expected +Server::verify_retry_token(ngtcp2_cid *ocid, const ngtcp2_pkt_hd *hd, + const Address &remote_addr) { + int rv; + + if (!config.quiet) { + std::array host; + std::array port; + + if (auto rv = getnameinfo(remote_addr.as_sockaddr(), remote_addr.size(), + host.data(), host.size(), port.data(), + port.size(), NI_NUMERICHOST | NI_NUMERICSERV); + rv != 0) { + std::println(stderr, "getnameinfo: {}", gai_strerror(rv)); + return std::unexpected{Error::LIBC}; + } + + std::println(stderr, "Verifying Retry token from [{}]:{}", host.data(), + port.data()); + (void)util::hexdump(stderr, {hd->token, hd->tokenlen}); + } + + auto t = util::system_clock_now(); + + rv = ngtcp2_crypto_verify_retry_token2( + ocid, hd->token, hd->tokenlen, config.static_secret.data(), + config.static_secret.size(), hd->version, remote_addr.as_sockaddr(), + remote_addr.size(), &hd->dcid, 10 * NGTCP2_SECONDS, t); + switch (rv) { + case 0: + break; + case NGTCP2_CRYPTO_ERR_VERIFY_TOKEN: + std::println(stderr, "Could not verify Retry token"); + + return std::unexpected{Error::QUIC}; + default: + std::println(stderr, + "Could not read Retry token. Continue without the token"); + + return std::unexpected{Error::UNREADABLE_TOKEN}; + } + + if (!config.quiet) { + std::println(stderr, "Token was successfully validated"); + } + + return {}; +} + +std::expected Server::verify_token(const ngtcp2_pkt_hd *hd, + const Address &remote_addr) { + std::array host; + std::array port; + + if (auto rv = getnameinfo(remote_addr.as_sockaddr(), remote_addr.size(), + host.data(), host.size(), port.data(), port.size(), + NI_NUMERICHOST | NI_NUMERICSERV); + rv != 0) { + std::println(stderr, "getnameinfo: {}", gai_strerror(rv)); + return std::unexpected{Error::LIBC}; + } + + if (!config.quiet) { + std::println(stderr, "Verifying token from [{}]:{}", host.data(), + port.data()); + (void)util::hexdump(stderr, {hd->token, hd->tokenlen}); + } + + auto t = util::system_clock_now(); + + if (ngtcp2_crypto_verify_regular_token( + hd->token, hd->tokenlen, config.static_secret.data(), + config.static_secret.size(), remote_addr.as_sockaddr(), + remote_addr.size(), 3600 * NGTCP2_SECONDS, t) != 0) { + std::println(stderr, "Could not verify token"); + + return std::unexpected{Error::QUIC}; + } + + if (!config.quiet) { + std::println(stderr, "Token was successfully validated"); + } + + return {}; +} + +std::expected Server::send_packet(const Endpoint &ep, + const ngtcp2_addr &local_addr, + const ngtcp2_addr &remote_addr, + unsigned int ecn, + std::span data) { + auto no_gso = false; + auto rest = + send_packet(ep, no_gso, local_addr, remote_addr, ecn, data, data.size()); + if (!rest.empty()) { + return std::unexpected{Error::SEND_BLOCKED}; + } + + return {}; +} + +std::span Server::send_packet(const Endpoint &ep, bool &no_gso, + const ngtcp2_addr &local_addr, + const ngtcp2_addr &remote_addr, + unsigned int ecn, + std::span data, + size_t gso_size) { + assert(gso_size); + + if (debug::packet_lost(config.tx_loss_prob)) { + if (!config.quiet) { + std::println(stderr, "** Simulated outgoing packet loss **"); + } + return {}; + } + + if (no_gso && data.size() > gso_size) { + for (; !data.empty();) { + auto len = std::min(gso_size, data.size()); + + auto rest = send_packet(ep, no_gso, local_addr, remote_addr, ecn, + data.first(len), len); + if (!rest.empty()) { + assert(rest.size() == len); + + return data; + } + + data = data.subspan(len); + } + + return {}; + } + + iovec msg_iov{ + .iov_base = const_cast(data.data()), + .iov_len = data.size(), + }; + + uint8_t msg_ctrl[CMSG_SPACE(sizeof(int)) + CMSG_SPACE(sizeof(uint16_t)) + + CMSG_SPACE(sizeof(in6_pktinfo))]{}; + + msghdr msg{ + .msg_name = const_cast(remote_addr.addr), + .msg_namelen = remote_addr.addrlen, + .msg_iov = &msg_iov, + .msg_iovlen = 1, + .msg_control = msg_ctrl, + .msg_controllen = sizeof(msg_ctrl), + }; + + size_t controllen = 0; + + auto cm = CMSG_FIRSTHDR(&msg); + + switch (local_addr.addr->sa_family) { + case AF_INET: { + controllen += CMSG_SPACE(sizeof(in_pktinfo)); + cm->cmsg_level = IPPROTO_IP; + cm->cmsg_type = IP_PKTINFO; + cm->cmsg_len = CMSG_LEN(sizeof(in_pktinfo)); + auto addrin = reinterpret_cast(local_addr.addr); + in_pktinfo pktinfo{ + .ipi_spec_dst = addrin->sin_addr, + }; + memcpy(CMSG_DATA(cm), &pktinfo, sizeof(pktinfo)); + + break; + } + case AF_INET6: { + controllen += CMSG_SPACE(sizeof(in6_pktinfo)); + cm->cmsg_level = IPPROTO_IPV6; + cm->cmsg_type = IPV6_PKTINFO; + cm->cmsg_len = CMSG_LEN(sizeof(in6_pktinfo)); + auto addrin = reinterpret_cast(local_addr.addr); + in6_pktinfo pktinfo{ + .ipi6_addr = addrin->sin6_addr, + }; + memcpy(CMSG_DATA(cm), &pktinfo, sizeof(pktinfo)); + + break; + } + default: + assert(0); + } + +#ifdef UDP_SEGMENT + if (data.size() > gso_size) { + controllen += CMSG_SPACE(sizeof(uint16_t)); + cm = CMSG_NXTHDR(&msg, cm); + cm->cmsg_level = SOL_UDP; + cm->cmsg_type = UDP_SEGMENT; + cm->cmsg_len = CMSG_LEN(sizeof(uint16_t)); + auto n = static_cast(gso_size); + memcpy(CMSG_DATA(cm), &n, sizeof(n)); + } +#endif // defined(UDP_SEGMENT) + + controllen += CMSG_SPACE(sizeof(int)); + cm = CMSG_NXTHDR(&msg, cm); + cm->cmsg_len = CMSG_LEN(sizeof(int)); + memcpy(CMSG_DATA(cm), &ecn, sizeof(ecn)); + + switch (local_addr.addr->sa_family) { + case AF_INET: + cm->cmsg_level = IPPROTO_IP; + cm->cmsg_type = IP_TOS; + + break; + case AF_INET6: + cm->cmsg_level = IPPROTO_IPV6; + cm->cmsg_type = IPV6_TCLASS; + + break; + default: + assert(0); + } + + msg.msg_controllen = +#ifndef __APPLE__ + controllen +#else // defined(__APPLE__) + static_cast(controllen) +#endif // defined(__APPLE__) + ; + + ssize_t nwrite = 0; + + do { + nwrite = sendmsg(ep.fd, &msg, 0); + } while (nwrite == -1 && errno == EINTR); + + if (nwrite == -1) { + switch (errno) { + case EAGAIN: +#if EAGAIN != EWOULDBLOCK + case EWOULDBLOCK: +#endif // EAGAIN != EWOULDBLOCK + return data; +#ifdef UDP_SEGMENT + case EIO: + if (data.size() > gso_size) { + // GSO failure; send each packet in a separate sendmsg call. + std::println(stderr, "sendmsg: disabling GSO due to {}", + strerror(errno)); + + no_gso = true; + + return send_packet(ep, no_gso, local_addr, remote_addr, ecn, data, + gso_size); + } + break; +#endif // defined(UDP_SEGMENT) + } + + std::println(stderr, "sendmsg: {}", strerror(errno)); + // TODO We have packet which is expected to fail to send (e.g., + // path validation to old path). + return {}; + } + + if (!config.quiet) { + std::println(stderr, "Sent packet: local={} remote={} ecn={:#x} {} bytes", + util::straddr(local_addr.addr, local_addr.addrlen), + util::straddr(remote_addr.addr, remote_addr.addrlen), ecn, + nwrite); + } + + return {}; +} + +void Server::associate_cid(const ngtcp2_cid *cid, Handler *h) { + handlers_.emplace(*cid, h); +} + +void Server::dissociate_cid(const ngtcp2_cid *cid) { handlers_.erase(*cid); } + +void Server::remove(const Handler *h) { + auto conn = h->conn(); + + dissociate_cid(ngtcp2_conn_get_client_initial_dcid2(conn)); + + std::vector cids(ngtcp2_conn_get_scid2(conn, nullptr)); + ngtcp2_conn_get_scid2(conn, cids.data()); + + for (auto &cid : cids) { + dissociate_cid(&cid); + } + + delete h; +} + +void Server::on_stateless_reset_regen() { + assert(stateless_reset_bucket_ < NGTCP2_STATELESS_RESET_BURST); + + if (++stateless_reset_bucket_ == NGTCP2_STATELESS_RESET_BURST) { + ev_timer_stop(loop_, &stateless_reset_regen_timer_); + } +} + +namespace { +std::expected parse_host_port(int af, + std::string_view host_port) { + if (host_port.empty()) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + auto first = std::ranges::begin(host_port); + auto last = std::ranges::end(host_port); + + std::string_view hostv; + + if (*first == '[') { + ++first; + + auto it = std::ranges::find(first, last, ']'); + if (it == last) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + hostv = std::string_view{first, it}; + first = it + 1; + + if (first == last || *first != ':') { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + } else { + auto it = std::ranges::find(first, last, ':'); + if (it == last) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + hostv = std::string_view{first, it}; + first = it; + } + + if (++first == last) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + std::array host; + *std::ranges::copy(hostv, std::ranges::begin(host)).out = '\0'; + + addrinfo hints{ + .ai_family = af, + .ai_socktype = SOCK_DGRAM, + }; + addrinfo *res; + auto svc = first; + + if (auto rv = getaddrinfo(host.data(), svc, &hints, &res); rv != 0) { + std::println(stderr, "getaddrinfo: [{}]:{}: {}", host.data(), svc, + gai_strerror(rv)); + return std::unexpected{Error::LIBC}; + } + + Address dest; + dest.set(res->ai_addr); + + freeaddrinfo(res); + + return dest; +} +} // namespace + +namespace { +const char *prog = "server"; +} // namespace + +namespace { +void print_usage(FILE *out) { + std::println( + out, + "Usage: {} [OPTIONS] ", + prog); +} +} // namespace + +namespace { +void print_help() { + print_usage(stdout); + + Config config; + + std::cout << R"( + Address to listen to. '*' binds to any address. + Port + + Path to private key file + + Path to certificate file +Options: + -t, --tx-loss=

+ The probability of losing outgoing packets.

must be + [0.0, 1.0], inclusive. 0.0 means no packet loss. 1.0 + means 100% packet loss. + -r, --rx-loss=

+ The probability of losing incoming packets.

must be + [0.0, 1.0], inclusive. 0.0 means no packet loss. 1.0 + means 100% packet loss. + --ciphers= + Specify the cipher suite list to enable. + Default: )" + << config.ciphers << R"( + --groups= + Specify the supported groups. + Default: )" + << config.groups << R"( + -d, --htdocs= + Specify document root. If this option is not specified, + the document root is the current working directory. + -q, --quiet Suppress debug output. + -s, --show-secret + Print out secrets unless --quiet is used. + --timeout= + Specify idle timeout. + Default: )" + << util::format_duration(config.timeout) << R"( + -V, --validate-addr + Perform address validation. + --preferred-ipv4-addr=: + Specify preferred IPv4 address and port. + --preferred-ipv6-addr=: + Specify preferred IPv6 address and port. A numeric IPv6 + address must be enclosed by '[' and ']' (e.g., + [::1]:8443) + --mime-types-file= + Path to file that contains MIME media types and the + extensions. + Default: )" + << config.mime_types_file.native() << R"( + --early-response + Start sending response when it receives HTTP header + fields without waiting for request body. If HTTP + response data is written before receiving request body, + STOP_SENDING is sent. + --verify-client + Request a client certificate. At the moment, we just + request a certificate and no verification is done. + --qlog-dir= + Path to the directory where qlog file is stored. The + file name of each qlog is the Source Connection ID of + server. + --no-quic-dump + Disables printing QUIC STREAM and CRYPTO frame data out. + --no-http-dump + Disables printing HTTP response body out. + --max-data= + The initial connection-level flow control window. + Default: )" + << util::format_uint_iec(config.max_data) << R"( + --max-stream-data-bidi-local= + The initial stream-level flow control window for a + bidirectional stream that the local endpoint initiates. + Default: )" + << util::format_uint_iec(config.max_stream_data_bidi_local) << R"( + --max-stream-data-bidi-remote= + The initial stream-level flow control window for a + bidirectional stream that the remote endpoint initiates. + Default: )" + << util::format_uint_iec(config.max_stream_data_bidi_remote) << R"( + --max-stream-data-uni= + The initial stream-level flow control window for a + unidirectional stream. + Default: )" + << util::format_uint_iec(config.max_stream_data_uni) << R"( + --max-streams-bidi= + The number of the concurrent bidirectional streams that + the remote endpoint initiates. + Default: )" + << config.max_streams_bidi << R"( + --max-streams-uni= + The number of the concurrent unidirectional streams that + the remote endpoint initiates. + Default: )" + << config.max_streams_uni << R"( + --max-dyn-length= + The maximum length of a dynamically generated content. + Default: )" + << util::format_uint_iec(config.max_dyn_length) << R"( + --cc=(cubic|reno|bbr) + The name of congestion controller algorithm. + Default: )" + << util::strccalgo(config.cc_algo) << R"( + --initial-rtt= + Set an initial RTT. + Default: )" + << util::format_duration(config.initial_rtt) << R"( + --max-udp-payload-size= + Override maximum UDP payload size that server transmits. + With this option, server assumes that a path supports + byte of UDP datagram payload, without performing + Path MTU Discovery. + --send-trailers + Send trailer fields. + --max-window= + Maximum connection-level flow control window size. The + window auto-tuning is enabled if nonzero value is given, + and window size is scaled up to this value. + Default: )" + << util::format_uint_iec(config.max_window) << R"( + --max-stream-window= + Maximum stream-level flow control window size. The + window auto-tuning is enabled if nonzero value is given, + and window size is scaled up to this value. + Default: )" + << util::format_uint_iec(config.max_stream_window) << R"( + --handshake-timeout= + Set the QUIC handshake timeout. It defaults to no + timeout. + --preferred-versions=[[,]...] + Specify QUIC versions in hex string in the order of + preference. Server negotiates one of those versions if + client initially selects a less preferred version. + These versions must be supported by libngtcp2. Instead + of specifying hex string, there are special aliases + available: "v1" indicates QUIC v1, and "v2" indicates + QUIC v2. + --available-versions=[[,]...] + Specify QUIC versions in hex string that are sent in + available_versions field of version_information + transport parameter. This list can include a version + which is not supported by libngtcp2. Instead of + specifying hex string, there are special aliases + available: "v1" indicates QUIC v1, and "v2" indicates + QUIC v2. + --no-pmtud Disables Path MTU Discovery. + --ack-thresh= + The minimum number of the received ACK eliciting packets + that triggers immediate acknowledgement. + Default: )" + << config.ack_thresh << R"( + --initial-pkt-num= + The initial packet number that is used for each packet + number space. It must be in range [0, (1 << 31) - 1], + inclusive. By default, the initial packet number is + chosen randomly. + --pmtud-probes=[[,]...] + Specify UDP datagram payload sizes to probe in Path MTU + Discovery. must be strictly larger than 1200. + --ech-config-file= + Read private key and ECHConfig from . The file + denoted by must contain private key and + ECHConfigList as described in RFC 9934. ECH + configuration is only applied if an underlying TLS stack + supports it. + --origin= + Specify the origin to send in ORIGIN frame. Repeat to + add multiple origins. + --no-gso Disables GSO. + --show-stat Print the connection statistics when the connection is + closed. + --gso-burst= + The maximum number of packets to aggregate for GSO. If + GSO is disabled, this is the maximum number of packets + to send per an event loop in a single connection. It + defaults to 0, which means it is not limited by the + configuration. + -h, --help Display this help and exit. + +--- + + The argument is an integer and an optional unit (e.g., 10K is + 10 * 1024). Units are K, M and G (powers of 1024). + + The argument is an integer and an optional unit (e.g., 1s + is 1 second and 500ms is 500 milliseconds). Units are h, m, s, ms, + us, or ns (hours, minutes, seconds, milliseconds, microseconds, and + nanoseconds respectively). If a unit is omitted, a second is used + as unit. + + The argument is an hex string which must start with "0x" + (e.g., 0x00000001).)" + << std::endl; +} +} // namespace + +std::ofstream keylog_file; + +int main(int argc, char **argv) { + if (argc) { + prog = basename(argv[0]); + } + + std::filesystem::path ech_config_file; + + for (;;) { + static int flag = 0; + static constexpr option long_opts[] = { + {"help", no_argument, nullptr, 'h'}, + {"tx-loss", required_argument, nullptr, 't'}, + {"rx-loss", required_argument, nullptr, 'r'}, + {"htdocs", required_argument, nullptr, 'd'}, + {"quiet", no_argument, nullptr, 'q'}, + {"show-secret", no_argument, nullptr, 's'}, + {"validate-addr", no_argument, nullptr, 'V'}, + {"ciphers", required_argument, &flag, 1}, + {"groups", required_argument, &flag, 2}, + {"timeout", required_argument, &flag, 3}, + {"preferred-ipv4-addr", required_argument, &flag, 4}, + {"preferred-ipv6-addr", required_argument, &flag, 5}, + {"mime-types-file", required_argument, &flag, 6}, + {"early-response", no_argument, &flag, 7}, + {"verify-client", no_argument, &flag, 8}, + {"qlog-dir", required_argument, &flag, 9}, + {"no-quic-dump", no_argument, &flag, 10}, + {"no-http-dump", no_argument, &flag, 11}, + {"max-data", required_argument, &flag, 12}, + {"max-stream-data-bidi-local", required_argument, &flag, 13}, + {"max-stream-data-bidi-remote", required_argument, &flag, 14}, + {"max-stream-data-uni", required_argument, &flag, 15}, + {"max-streams-bidi", required_argument, &flag, 16}, + {"max-streams-uni", required_argument, &flag, 17}, + {"max-dyn-length", required_argument, &flag, 18}, + {"cc", required_argument, &flag, 19}, + {"initial-rtt", required_argument, &flag, 20}, + {"max-udp-payload-size", required_argument, &flag, 21}, + {"send-trailers", no_argument, &flag, 22}, + {"max-window", required_argument, &flag, 23}, + {"max-stream-window", required_argument, &flag, 24}, + {"handshake-timeout", required_argument, &flag, 26}, + {"preferred-versions", required_argument, &flag, 27}, + {"available-versions", required_argument, &flag, 28}, + {"no-pmtud", no_argument, &flag, 29}, + {"ack-thresh", required_argument, &flag, 30}, + {"initial-pkt-num", required_argument, &flag, 31}, + {"pmtud-probes", required_argument, &flag, 32}, + {"ech-config-file", required_argument, &flag, 33}, + {"origin", required_argument, &flag, 34}, + {"no-gso", no_argument, &flag, 35}, + {"show-stat", no_argument, &flag, 36}, + {"gso-burst", required_argument, &flag, 37}, + {}, + }; + + auto optidx = 0; + auto c = getopt_long(argc, argv, "d:hqr:st:V", long_opts, &optidx); + if (c == -1) { + break; + } + switch (c) { + case 'd': { + // --htdocs + auto path = realpath(optarg, nullptr); + if (path == nullptr) { + std::println(stderr, "path: invalid path {}", optarg); + exit(EXIT_FAILURE); + } + config.htdocs = path; + free(path); + break; + } + case 'h': + // --help + print_help(); + exit(EXIT_SUCCESS); + case 'q': + // --quiet + config.quiet = true; + break; + case 'r': + // --rx-loss + config.rx_loss_prob = strtod(optarg, nullptr); + break; + case 's': + // --show-secret + config.show_secret = true; + break; + case 't': + // --tx-loss + config.tx_loss_prob = strtod(optarg, nullptr); + break; + case 'V': + // --validate-addr + config.validate_addr = true; + break; + case '?': + print_usage(stderr); + exit(EXIT_FAILURE); + case 0: + switch (flag) { + case 1: + // --ciphers + if (util::crypto_default_ciphers()[0] == '\0') { + std::println(stderr, "ciphers: not supported"); + exit(EXIT_FAILURE); + } + config.ciphers = optarg; + break; + case 2: + // --groups + config.groups = optarg; + break; + case 3: + // --timeout + if (auto t = util::parse_duration(optarg); !t) { + std::println(stderr, "timeout: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.timeout = *t; + } + break; + case 4: { + // --preferred-ipv4-addr + auto maybe_addr = parse_host_port(AF_INET, optarg); + if (!maybe_addr) { + std::println(stderr, "preferred-ipv4-addr: could not use {}", optarg); + exit(EXIT_FAILURE); + } + + config.preferred_ipv4_addr = *maybe_addr; + + break; + } + case 5: { + // --preferred-ipv6-addr + auto maybe_addr = parse_host_port(AF_INET6, optarg); + if (!maybe_addr) { + std::println(stderr, "preferred-ipv6-addr: could not use {}", optarg); + exit(EXIT_FAILURE); + } + + config.preferred_ipv6_addr = *maybe_addr; + + break; + } + case 6: + // --mime-types-file + config.mime_types_file = optarg; + break; + case 7: + // --early-response + config.early_response = true; + break; + case 8: + // --verify-client + config.verify_client = true; + break; + case 9: + // --qlog-dir + config.qlog_dir = optarg; + break; + case 10: + // --no-quic-dump + config.no_quic_dump = true; + break; + case 11: + // --no-http-dump + config.no_http_dump = true; + break; + case 12: + // --max-data + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-data: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_data = *n; + } + break; + case 13: + // --max-stream-data-bidi-local + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-stream-data-bidi-local: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_stream_data_bidi_local = *n; + } + break; + case 14: + // --max-stream-data-bidi-remote + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-stream-data-bidi-remote: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_stream_data_bidi_remote = *n; + } + break; + case 15: + // --max-stream-data-uni + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-stream-data-uni: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_stream_data_uni = *n; + } + break; + case 16: + // --max-streams-bidi + if (auto n = util::parse_uint(optarg); !n) { + std::println(stderr, "max-streams-bidi: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_streams_bidi = *n; + } + break; + case 17: + // --max-streams-uni + if (auto n = util::parse_uint(optarg); !n) { + std::println(stderr, "max-streams-uni: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_streams_uni = *n; + } + break; + case 18: + // --max-dyn-length + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-dyn-length: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_dyn_length = *n; + } + break; + case 19: { + // --cc + auto cc = std::string_view{optarg}; + if (cc == "cubic"sv) { + config.cc_algo = NGTCP2_CC_ALGO_CUBIC; + break; + } + if (cc == "reno"sv) { + config.cc_algo = NGTCP2_CC_ALGO_RENO; + break; + } + if (cc == "bbr"sv) { + config.cc_algo = NGTCP2_CC_ALGO_BBR; + break; + } + std::println(stderr, "cc: specify cubic, reno, or bbr"); + exit(EXIT_FAILURE); + } + case 20: + // --initial-rtt + if (auto t = util::parse_duration(optarg); !t) { + std::println(stderr, "initial-rtt: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.initial_rtt = *t; + } + break; + case 21: + // --max-udp-payload-size + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-udp-payload-size: invalid argument"); + exit(EXIT_FAILURE); + } else if (*n > NGTCP2_MAX_TX_UDP_PAYLOAD_SIZE) { + std::println(stderr, "max-udp-payload-size: must not exceed {}", + NGTCP2_MAX_TX_UDP_PAYLOAD_SIZE); + exit(EXIT_FAILURE); + } else { + config.max_udp_payload_size = *n; + } + break; + case 22: + // --send-trailers + config.send_trailers = true; + break; + case 23: + // --max-window + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-window: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_window = *n; + } + break; + case 24: + // --max-stream-window + if (auto n = util::parse_uint_iec(optarg); !n) { + std::println(stderr, "max-stream-window: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.max_stream_window = *n; + } + break; + case 26: + // --handshake-timeout + if (auto t = util::parse_duration(optarg); !t) { + std::println(stderr, "handshake-timeout: invalid argument"); + exit(EXIT_FAILURE); + } else { + config.handshake_timeout = *t; + } + break; + case 27: + // --preferred-versions + if (strlen(optarg) == 0) { + config.preferred_versions.resize(0); + + break; + } + + config.preferred_versions = + util::split_str(optarg) | std::ranges::views::transform([](auto &&k) { + if (k == "v1"sv) { + return NGTCP2_PROTO_VER_V1; + } + + if (k == "v2"sv) { + return NGTCP2_PROTO_VER_V2; + } + + auto rv = util::parse_version(k); + if (!rv) { + std::println(stderr, "preferred-versions: invalid version {}", k); + exit(EXIT_FAILURE); + } + + if (!ngtcp2_is_supported_version(*rv)) { + std::println(stderr, "preferred-versions: unsupported version {}", + k); + exit(EXIT_FAILURE); + } + + return *rv; + }) | + std::ranges::to(); + + if (config.preferred_versions.size() > max_preferred_versionslen) { + std::println(stderr, "preferred-versions: too many versions > {}", + max_preferred_versionslen); + exit(EXIT_FAILURE); + } + + break; + case 28: + // --available-versions + if (strlen(optarg) == 0) { + config.available_versions.resize(0); + + break; + } + + config.available_versions = + util::split_str(optarg) | std::ranges::views::transform([](auto &&k) { + if (k == "v1"sv) { + return NGTCP2_PROTO_VER_V1; + } + + if (k == "v2"sv) { + return NGTCP2_PROTO_VER_V2; + } + + auto rv = util::parse_version(k); + if (!rv) { + std::println(stderr, "available-versions: invalid version {}", k); + exit(EXIT_FAILURE); + } + + return *rv; + }) | + std::ranges::to(); + + break; + case 29: + // --no-pmtud + config.no_pmtud = true; + break; + case 30: + // --ack-thresh + if (auto n = util::parse_uint(optarg); !n) { + std::println(stderr, "ack-thresh: invalid argument"); + exit(EXIT_FAILURE); + } else if (*n > 100) { + std::println(stderr, "ack-thresh: must not exceed 100"); + exit(EXIT_FAILURE); + } else { + config.ack_thresh = *n; + } + break; + case 31: + // --initial-pkt-num + if (auto n = util::parse_uint(optarg); !n) { + std::println(stderr, "initial-pkt-num: invalid argument"); + exit(EXIT_FAILURE); + } else if (*n > INT32_MAX) { + std::println(stderr, + "initial-pkt-num: must not exceed (1 << 31) - 1"); + exit(EXIT_FAILURE); + } else { + config.initial_pkt_num = static_cast(*n); + } + break; + case 32: + // --pmtud-probes + if (strlen(optarg) == 0) { + config.pmtud_probes.resize(0); + + break; + } + + config.pmtud_probes = + util::split_str(optarg) | std::ranges::views::transform([](auto &&s) { + auto n = util::parse_uint_iec(s); + if (!n) { + std::println(stderr, "pmtud-probes: invalid argument"); + exit(EXIT_FAILURE); + } + + if (*n <= NGTCP2_MAX_UDP_PAYLOAD_SIZE || + *n > NGTCP2_MAX_TX_UDP_PAYLOAD_SIZE) { + std::println( + stderr, "pmtud-probes: must be in range [{}, {}], inclusive.", + NGTCP2_MAX_UDP_PAYLOAD_SIZE + 1, + NGTCP2_MAX_TX_UDP_PAYLOAD_SIZE); + exit(EXIT_FAILURE); + } + + return static_cast(*n); + }) | + std::ranges::to(); + + break; + case 33: + // --ech-config-file + ech_config_file = optarg; + break; + case 34: { + // --origin + auto origin = std::string_view{optarg}; + + if (auto max = std::numeric_limits::max(); + max < origin.size()) { + std::println(stderr, "origin: must be less than or equal to {}", max); + exit(EXIT_FAILURE); + } + + if (!config.origin_list) { + config.origin_list = std::vector(); + } + + config.origin_list->push_back(static_cast(origin.size() >> 8)); + config.origin_list->push_back(origin.size() & 0xFF); + std::ranges::copy(origin, std::back_inserter(*config.origin_list)); + + break; + } + case 35: + // --no-gso + config.no_gso = true; + break; + case 36: + // --show-stat + config.show_stat = true; + break; + case 37: { + // --gso-burst + auto n = util::parse_uint(optarg); + if (!n) { + std::println(stderr, "gso-burst: invalid argument"); + exit(EXIT_FAILURE); + } + + if (*n > 64) { + std::println(stderr, + "gso-burst: must be in range [0, 64], inclusive."); + exit(EXIT_FAILURE); + } + + config.gso_burst = static_cast(*n); + + break; + } + } + break; + default: + break; + } + } + + if (argc - optind < 4) { + std::println(stderr, "Too few arguments"); + print_usage(stderr); + exit(EXIT_FAILURE); + } + + auto addr = argv[optind++]; + auto port = argv[optind++]; + auto private_key_file = argv[optind++]; + auto cert_file = argv[optind++]; + + if (auto n = util::parse_uint(port); !n) { + std::println(stderr, "port: invalid port number"); + exit(EXIT_FAILURE); + } else if (*n > 65535) { + std::println(stderr, "port: must not exceed 65535"); + exit(EXIT_FAILURE); + } else { + config.port = static_cast(*n); + } + + if (auto mt = util::read_mime_types(config.mime_types_file); !mt) { + std::println(stderr, + "mime-types-file: Could not read MIME media types file {}", + config.mime_types_file.native()); + } else { + config.mime_types = std::move(*mt); + } + + if (!ech_config_file.empty()) { + auto ech_config = util::read_ech_server_config(ech_config_file); + if (!ech_config) { + std::println(stderr, + "ech-config-file: Could not read private key and ECHConfig"); + exit(EXIT_FAILURE); + } + + config.ech_config = std::move(*ech_config); + } + + TLSServerContext tls_ctx; + + if (!tls_ctx.init(private_key_file, cert_file, ProtoCodec::protocol)) { + exit(EXIT_FAILURE); + } + + std::println(stderr, "Using document root {}", config.htdocs.native()); + + auto ev_loop_d = defer([] { ev_loop_destroy(EV_DEFAULT); }); + + auto keylog_filename = getenv("SSLKEYLOGFILE"); + if (keylog_filename) { + keylog_file.open(keylog_filename, std::ios_base::app); + if (keylog_file) { + tls_ctx.enable_keylog(); + } + } + + if (!util::generate_secure_random(config.static_secret)) { + std::println(stderr, "Unable to generate static secret"); + exit(EXIT_FAILURE); + } + + Server s(EV_DEFAULT, tls_ctx); + if (!s.init(addr, port)) { + exit(EXIT_FAILURE); + } + + ev_run(EV_DEFAULT, 0); + + s.disconnect(); + s.close(); + + return EXIT_SUCCESS; +} diff --git a/deps/ngtcp2/ngtcp2/examples/server.h b/deps/ngtcp2/ngtcp2/examples/server.h new file mode 100644 index 000000000000..8a71a12a2e7f --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/server.h @@ -0,0 +1,319 @@ +/* + * ngtcp2 + * + * Copyright (c) 2017 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef SERVER_H +#define SERVER_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include "server_base.h" +#include "tls_server_context.h" +#include "network.h" +#include "shared.h" +#include "util.h" + +#ifdef WITH_EXAMPLE_HTTP3_PROTO_CODEC +# include "http3_server_proto_codec.h" +#endif // WITH_EXAMPLE_HTTP3_PROTO_CODEC + +#ifdef WITH_EXAMPLE_HQ_PROTO_CODEC +# include + +# include "hq_server_proto_codec.h" +#endif // WITH_EXAMPLE_HQ_PROTO_CODEC + +using namespace ngtcp2; + +class Handler; + +enum FileEntryFlag { + FILE_ENTRY_TYPE_DIR = 0x1, +}; + +struct FileEntry { + uint64_t len{}; + void *map{}; + int fd{}; + uint8_t flags{}; +}; + +std::string make_status_body(unsigned int status_code); + +struct Request { + std::string path; + struct { + int32_t urgency; + int inc; + } pri{}; +}; + +struct Stream { + Stream(int64_t stream_id, Handler *handler); + + std::expected start_response(); + std::expected open_file(const std::filesystem::path &path); + void map_file(const FileEntry &fe); + std::expected + send_status_response(ProtoCodec *pc, unsigned int status_code, + const std::vector &extra_headers = {}); + std::expected send_redirect_response(ProtoCodec *pc, + unsigned int status_code, + std::string_view path); + std::expected find_dyn_length(std::string_view path); + void http_acked_stream_data(uint64_t datalen); + std::expected request_path(); + + int64_t stream_id; + Handler *handler; + // uri is request uri/path. + std::string uri; + std::string method; + std::string authority; + std::string status_resp_body; + // resp_data is a pointer to the response data. It might be the + // memory which maps file denoted by fd, or status_resp_body. + std::span resp_data; + // dynresp is true if dynamic data response is enabled. + bool dynresp{}; + // dyndataleft is the number of dynamic data left to send. + uint64_t dyndataleft{}; + // dynbuflen is the number of bytes in-flight. + uint64_t dynbuflen{}; +#ifdef WITH_EXAMPLE_HQ_PROTO_CODEC + http_parser htp; + // eos gets true when one HTTP request message is seen. + bool eos{}; +#endif // WITH_EXAMPLE_HQ_PROTO_CODEC +}; + +class Server; + +// Endpoint is a local endpoint. +struct Endpoint { + Address addr; + ev_io rev; + Server *server{}; + int fd{}; +}; + +class Handler : public HandlerBase { +public: + Handler(struct ev_loop *loop, Server *server); + ~Handler(); + + std::expected + init(const Endpoint &ep, const Address &local_addr, + const Address &remote_addr, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, const ngtcp2_cid *ocid, + std::span token, ngtcp2_token_type token_type, + uint32_t version, TLSServerContext &tls_ctx); + + std::expected on_read(const Endpoint &ep, + const Address &local_addr, + const Address &remote_addr, + const ngtcp2_pkt_info *pi, + std::span data); + std::expected on_write(); + std::expected write_streams(); + std::expected feed_data(const Endpoint &ep, + const Address &local_addr, + const Address &remote_addr, + const ngtcp2_pkt_info *pi, + std::span data); + void update_timer(); + std::expected handle_expiry(); + void signal_write(); + std::expected handshake_completed(); + + Server *server() const; + std::expected recv_stream_data(uint32_t flags, int64_t stream_id, + std::span data); + std::expected acked_stream_data_offset(int64_t stream_id, + uint64_t datalen); + uint32_t version() const; + void on_stream_open(int64_t stream_id); + std::expected + on_stream_close(int64_t stream_id, std::optional rx_app_error_code, + std::optional tx_app_error_code); + void start_draining_period(); + std::expected start_closing_period(); + std::expected handle_error(); + std::expected send_conn_close(); + std::expected send_conn_close(const Endpoint &ep, + const Address &local_addr, + const Address &remote_addr, + const ngtcp2_pkt_info *pi, + std::span data); + + std::expected + update_key(uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, + const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, + size_t secretlen); + + void extend_max_remote_streams_bidi(uint64_t max_streams); + Stream *find_stream(int64_t stream_id) const; + std::expected on_stream_reset(int64_t stream_id); + std::expected on_stream_stop_sending(int64_t stream_id); + std::expected extend_max_stream_data(int64_t stream_id, + uint64_t max_data); + void shutdown_read(int64_t stream_id, uint64_t app_error_code); + + void write_qlog(const void *data, size_t datalen); + + void on_send_blocked(const ngtcp2_path &path, unsigned int ecn, + std::span data, size_t gso_size); + void start_wev_endpoint(const Endpoint &ep); + std::expected send_packet(const ngtcp2_path &path, + unsigned int ecn, + std::span data, + size_t gso_size); + void send_blocked_packet(); + + ngtcp2_ssize write_pkt(ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, + size_t destlen, ngtcp2_tstamp ts); + + std::expected on_app_tx_ready(); + + std::expected start_response(Stream *stream); + +private: + struct ev_loop *loop_; + Server *server_; + ev_io wev_; + ev_timer timer_; + FILE *qlog_{}; + ngtcp2_cid scid_{}; + std::unique_ptr proto_codec_; + std::unordered_map> streams_; + // conn_closebuf_ contains a packet which contains CONNECTION_CLOSE. + // This packet is repeatedly sent as a response to the incoming + // packet in draining period. + std::unique_ptr conn_closebuf_; + // nkey_update_ is the number of key update occurred. + size_t nkey_update_{}; + bool no_gso_; + struct { + size_t bytes_recv; + size_t bytes_sent; + size_t num_pkts_recv; + size_t next_pkts_recv = 1; + } close_wait_{}; + + struct { + bool send_blocked; + // blocked field is effective only when send_blocked is true. + struct { + const Endpoint *endpoint; + Address local_addr; + Address remote_addr; + unsigned int ecn; + std::span data; + size_t gso_size; + } blocked; + } tx_{}; + std::array txbuf_; +}; + +class Server { +public: + Server(struct ev_loop *loop, TLSServerContext &tls_ctx); + ~Server(); + + std::expected init(const char *addr, const char *port); + void disconnect(); + void close(); + + void on_read(const Endpoint &ep); + void read_pkt(const Endpoint &ep, const Address &local_addr, + const Address &remote_addr, const ngtcp2_pkt_info *pi, + std::span data); + std::expected + send_version_negotiation(uint32_t version, std::span dcid, + std::span scid, const Endpoint &ep, + const Address &local_addr, + const Address &remote_addr); + std::expected send_retry(const ngtcp2_pkt_hd *chd, + const Endpoint &ep, + const Address &local_addr, + const Address &remote_addr, + size_t max_pktlen); + std::expected + send_stateless_connection_close(const ngtcp2_pkt_hd *chd, const Endpoint &ep, + const Address &local_addr, + const Address &remote_addr); + std::expected send_stateless_reset(size_t pktlen, + std::span dcid, + const Endpoint &ep, + const Address &local_addr, + const Address &remote_addr); + std::expected verify_retry_token(ngtcp2_cid *ocid, + const ngtcp2_pkt_hd *hd, + const Address &remote_addr); + std::expected verify_token(const ngtcp2_pkt_hd *hd, + const Address &remote_addr); + std::expected send_packet(const Endpoint &ep, + const ngtcp2_addr &local_addr, + const ngtcp2_addr &remote_addr, + unsigned int ecn, + std::span data); + std::span + send_packet(const Endpoint &ep, bool &no_gso, const ngtcp2_addr &local_addr, + const ngtcp2_addr &remote_addr, unsigned int ecn, + std::span data, size_t gso_size); + void remove(const Handler *h); + + void associate_cid(const ngtcp2_cid *cid, Handler *h); + void dissociate_cid(const ngtcp2_cid *cid); + + void on_stateless_reset_regen(); + +private: + std::unordered_map handlers_; + struct ev_loop *loop_; + std::vector endpoints_; + TLSServerContext &tls_ctx_; + ev_signal sigintev_; + ev_timer stateless_reset_regen_timer_; + size_t stateless_reset_bucket_{NGTCP2_STATELESS_RESET_BURST}; +}; + +#endif // !defined(SERVER_H) diff --git a/deps/ngtcp2/ngtcp2/examples/server_base.cc b/deps/ngtcp2/ngtcp2/examples/server_base.cc new file mode 100644 index 000000000000..0e439299cfe5 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/server_base.cc @@ -0,0 +1,61 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "server_base.h" + +#include +#include + +#include "debug.h" + +using namespace ngtcp2; + +extern Config config; + +Buffer::Buffer(const uint8_t *data, size_t datalen) + : buf{data, data + datalen}, begin{buf.data()}, tail{begin + datalen} {} +Buffer::Buffer(size_t datalen) : buf(datalen), begin{buf.data()}, tail{begin} {} + +static ngtcp2_conn *get_conn(ngtcp2_crypto_conn_ref *conn_ref) { + auto h = static_cast(conn_ref->user_data); + return h->conn(); +} + +HandlerBase::HandlerBase() : conn_ref_{get_conn, this} { + ngtcp2_ccerr_default(&last_error_); +} + +HandlerBase::~HandlerBase() { + if (conn_) { + if (config.show_stat) { + debug::print_conn_info(conn_); + } + + ngtcp2_conn_del(conn_); + } +} + +ngtcp2_conn *HandlerBase::conn() const { return conn_; } + +ngtcp2_crypto_conn_ref *HandlerBase::conn_ref() { return &conn_ref_; } diff --git a/deps/ngtcp2/ngtcp2/examples/server_base.h b/deps/ngtcp2/ngtcp2/examples/server_base.h new file mode 100644 index 000000000000..9438d11f8bd8 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/server_base.h @@ -0,0 +1,225 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef SERVER_BASE_H +#define SERVER_BASE_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "tls_server_session.h" +#include "network.h" +#include "shared.h" +#include "template.h" +#include "util.h" + +using namespace ngtcp2; + +struct Config { + Address preferred_ipv4_addr; + Address preferred_ipv6_addr; + // tx_loss_prob is probability of losing outgoing packet. + double tx_loss_prob{}; + // rx_loss_prob is probability of losing incoming packet. + double rx_loss_prob{}; + // ciphers is the list of enabled ciphers. + const char *ciphers{util::crypto_default_ciphers()}; + // groups is the list of supported groups. + const char *groups{util::crypto_default_groups()}; + // htdocs is a root directory to serve documents. + std::filesystem::path htdocs{util::realpath(".")}; + // mime_types_file is a path to "MIME media types and the + // extensions" file. Ubuntu mime-support package includes it in + // /etc/mime/types. + std::filesystem::path mime_types_file{"/etc/mime.types"sv}; + // mime_types maps file extension to MIME media type. + std::unordered_map mime_types; + // port is the port number which server listens on for incoming + // connections. + uint16_t port{}; + // quiet suppresses the output normally shown except for the error + // messages. + bool quiet{}; + // timeout is an idle timeout for QUIC connection. + ngtcp2_duration timeout{30 * NGTCP2_SECONDS}; + // show_secret is true if transport secrets should be printed out. + bool show_secret{}; + // validate_addr is true if server requires address validation. + bool validate_addr{}; + // early_response is true if server starts sending response when it + // receives HTTP header fields without waiting for request body. If + // HTTP response data is written before receiving request body, + // STOP_SENDING is sent. + bool early_response{}; + // verify_client is true if server verifies client with X.509 + // certificate based authentication. + bool verify_client{}; + // qlog_dir is the path to directory where qlog is stored. + std::filesystem::path qlog_dir; + // no_quic_dump is true if hexdump of QUIC STREAM and CRYPTO data + // should be disabled. + bool no_quic_dump{}; + // no_http_dump is true if hexdump of HTTP response body should be + // disabled. + bool no_http_dump{}; + // max_data is the initial connection-level flow control window. + uint64_t max_data{1_m}; + // max_stream_data_bidi_local is the initial stream-level flow + // control window for a bidirectional stream that the local endpoint + // initiates. + uint64_t max_stream_data_bidi_local{}; + // max_stream_data_bidi_remote is the initial stream-level flow + // control window for a bidirectional stream that the remote + // endpoint initiates. + uint64_t max_stream_data_bidi_remote{256_k}; + // max_stream_data_uni is the initial stream-level flow control + // window for a unidirectional stream. + uint64_t max_stream_data_uni{256_k}; + // max_streams_bidi is the number of the concurrent bidirectional + // streams. + uint64_t max_streams_bidi{100}; + // max_streams_uni is the number of the concurrent unidirectional + // streams. + uint64_t max_streams_uni{3}; + // max_window is the maximum connection-level flow control window + // size if auto-tuning is enabled. + uint64_t max_window{6_m}; + // max_stream_window is the maximum stream-level flow control window + // size if auto-tuning is enabled. + uint64_t max_stream_window{6_m}; + // max_dyn_length is the maximum length of dynamically generated + // response. + uint64_t max_dyn_length{20_m}; + // static_secret is used to derive keying materials for Retry and + // Stateless Retry token. + std::array static_secret; + // cc_algo is the congestion controller algorithm. + ngtcp2_cc_algo cc_algo{NGTCP2_CC_ALGO_CUBIC}; + // initial_rtt is an initial RTT. + ngtcp2_duration initial_rtt{NGTCP2_DEFAULT_INITIAL_RTT}; + // max_udp_payload_size is the maximum UDP payload size that server + // transmits. + size_t max_udp_payload_size{}; + // send_trailers controls whether server sends trailer fields or + // not. + bool send_trailers{}; + // handshake_timeout is the period of time before giving up QUIC + // connection establishment. + ngtcp2_duration handshake_timeout{UINT64_MAX}; + // preferred_versions includes QUIC versions in the order of + // preference. Server negotiates one of those versions if a client + // initially selects a less preferred version. + std::vector preferred_versions; + // available_versions includes QUIC versions that are sent in + // available_versions field of version_information + // transport_parameter. + std::vector available_versions; + // no_pmtud disables Path MTU Discovery. + bool no_pmtud{}; + // ack_thresh is the minimum number of the received ACK eliciting + // packets that triggers immediate acknowledgement. + size_t ack_thresh{2}; + // initial_pkt_num is the initial packet number for each packet + // number space. If it is set to UINT32_MAX, it is chosen randomly. + uint32_t initial_pkt_num{UINT32_MAX}; + // pmtud_probes is the array of UDP datagram payload size to probes. + std::vector pmtud_probes; + // ech_config contains server-side ECH configuration. + util::ECHServerConfig ech_config{}; + // origin_list contains a payload of ORIGIN frame. + std::optional> origin_list; + // no_gso disables GSO. + bool no_gso{}; + // show_stat, if true, displays the connection statistics when the + // connection is closed. + bool show_stat{}; + // gso_burst is the number of packets to aggregate in GSO. 0 means + // it is not limited by the configuration. + size_t gso_burst{}; +}; + +struct HTTPHeader { + HTTPHeader(std::string_view name, std::string_view value) + : name{name}, value{value} {} + + std::string_view name; + std::string_view value; +}; + +inline constexpr auto NGTCP2_STATELESS_RESET_BURST = 100UZ; + +struct Buffer { + Buffer(const uint8_t *data, size_t datalen); + explicit Buffer(size_t datalen); + + size_t size() const { return as_unsigned(tail - begin); } + size_t left() const { return as_unsigned(buf.data() + buf.size() - tail); } + uint8_t *const wpos() { return tail; } + std::span data() const { return {begin, size()}; } + void push(size_t len) { tail += len; } + void reset() { tail = begin; } + + std::vector buf; + // begin points to the beginning of the buffer. This might point to + // buf.data() if a buffer space is allocated by this object. It is + // also allowed to point to the external shared buffer. + uint8_t *begin; + // tail points to the position of the buffer where write should + // occur. + uint8_t *tail; +}; + +inline constexpr auto NGTCP2_SERVER = "ngtcp2 server"sv; + +class HandlerBase { +public: + HandlerBase(); + ~HandlerBase(); + + ngtcp2_conn *conn() const; + + TLSServerSession *get_session() { return &tls_session_; } + + ngtcp2_crypto_conn_ref *conn_ref(); + +protected: + ngtcp2_crypto_conn_ref conn_ref_; + TLSServerSession tls_session_; + ngtcp2_conn *conn_{}; + ngtcp2_ccerr last_error_; +}; + +#endif // !defined(SERVER_BASE_H) diff --git a/deps/ngtcp2/ngtcp2/examples/shared.cc b/deps/ngtcp2/ngtcp2/examples/shared.cc new file mode 100644 index 000000000000..ef78394f04af --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/shared.cc @@ -0,0 +1,645 @@ +/* + * ngtcp2 + * + * Copyright (c) 2019 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "shared.h" + +#include + +#include +#include + +#include +#ifdef HAVE_NETINET_IN_H +# include +#endif // defined(HAVE_NETINET_IN_H) +#ifdef HAVE_NETINET_UDP_H +# include +#endif // defined(HAVE_NETINET_UDP_H) +#ifdef HAVE_NETINET_IP_H +# include +#endif // defined(HAVE_NETINET_IP_H) +#ifdef HAVE_ASM_TYPES_H +# include +#endif // defined(HAVE_ASM_TYPES_H) +#ifdef HAVE_LINUX_NETLINK_H +# include +#endif // defined(HAVE_LINUX_NETLINK_H) +#ifdef HAVE_LINUX_RTNETLINK_H +# include +#endif // defined(HAVE_LINUX_RTNETLINK_H) + +#include "template.h" + +namespace ngtcp2 { + +uint8_t msghdr_get_ecn(msghdr *msg, int family) { + switch (family) { + case AF_INET: + for (auto cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) { + if (cmsg->cmsg_level == IPPROTO_IP && +#ifdef __APPLE__ + cmsg->cmsg_type == IP_RECVTOS +#else // !defined(__APPLE__) + cmsg->cmsg_type == IP_TOS +#endif // !defined(__APPLE__) + && cmsg->cmsg_len) { + return *reinterpret_cast(CMSG_DATA(cmsg)) & IPTOS_ECN_MASK; + } + } + break; + case AF_INET6: + for (auto cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) { + if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_TCLASS && + cmsg->cmsg_len) { + unsigned int tos; + + memcpy(&tos, CMSG_DATA(cmsg), sizeof(int)); + + return tos & IPTOS_ECN_MASK; + } + } + break; + } + + return 0; +} + +void fd_set_recv_ecn(int fd, int family) { + unsigned int tos = 1; + switch (family) { + case AF_INET: + if (setsockopt(fd, IPPROTO_IP, IP_RECVTOS, &tos, + static_cast(sizeof(tos))) == -1) { + std::println(stderr, "setsockopt: {}", strerror(errno)); + } + break; + case AF_INET6: + if (setsockopt(fd, IPPROTO_IPV6, IPV6_RECVTCLASS, &tos, + static_cast(sizeof(tos))) == -1) { + std::println(stderr, "setsockopt: {}", strerror(errno)); + } + break; + } +} + +void fd_set_ip_mtu_discover(int fd, int family) { +#if defined(IP_MTU_DISCOVER) && defined(IPV6_MTU_DISCOVER) + int val; + + switch (family) { + case AF_INET: + val = IP_PMTUDISC_PROBE; + if (setsockopt(fd, IPPROTO_IP, IP_MTU_DISCOVER, &val, + static_cast(sizeof(val))) == -1) { + std::println(stderr, "setsockopt: IP_MTU_DISCOVER: {}", strerror(errno)); + } + break; + case AF_INET6: + val = IPV6_PMTUDISC_PROBE; + if (setsockopt(fd, IPPROTO_IPV6, IPV6_MTU_DISCOVER, &val, + static_cast(sizeof(val))) == -1) { + std::println(stderr, "setsockopt: IPV6_MTU_DISCOVER: {}", + strerror(errno)); + } + break; + } +#endif // defined(IP_MTU_DISCOVER) && defined(IPV6_MTU_DISCOVER) +} + +void fd_set_ip_dontfrag(int fd, int family) { +#if defined(IP_DONTFRAG) && defined(IPV6_DONTFRAG) + int val = 1; + + switch (family) { + case AF_INET: + if (setsockopt(fd, IPPROTO_IP, IP_DONTFRAG, &val, + static_cast(sizeof(val))) == -1) { + std::println(stderr, "setsockopt: IP_DONTFRAG: {}", strerror(errno)); + } + break; + case AF_INET6: + if (setsockopt(fd, IPPROTO_IPV6, IPV6_DONTFRAG, &val, + static_cast(sizeof(val))) == -1) { + std::println(stderr, "setsockopt: IPV6_DONTFRAG: {}", strerror(errno)); + } + break; + } +#endif // defined(IP_DONTFRAG) && defined(IPV6_DONTFRAG) +} + +void fd_set_udp_gro(int fd) { +#ifdef UDP_GRO + int val = 1; + + if (setsockopt(fd, IPPROTO_UDP, UDP_GRO, &val, + static_cast(sizeof(val))) == -1) { + std::println(stderr, "setsockopt: UDP_GRO: {}", strerror(errno)); + } +#endif // defined(UDP_GRO) +} + +std::expected msghdr_get_local_addr(msghdr *msg, int family) { + switch (family) { + case AF_INET: + for (auto cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) { + if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) { + in_pktinfo pktinfo; + memcpy(&pktinfo, CMSG_DATA(cmsg), sizeof(pktinfo)); + Address res{ + .ifindex = static_cast(pktinfo.ipi_ifindex), + }; + auto &sa = res.skaddr.emplace(); + sa.sin_family = AF_INET; + sa.sin_addr = pktinfo.ipi_addr; + return res; + } + } + return std::unexpected{Error::NOT_FOUND}; + case AF_INET6: + for (auto cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) { + if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) { + in6_pktinfo pktinfo; + memcpy(&pktinfo, CMSG_DATA(cmsg), sizeof(pktinfo)); + Address res{ + .ifindex = static_cast(pktinfo.ipi6_ifindex), + }; + auto &sa = res.skaddr.emplace(); + sa.sin6_family = AF_INET6; + sa.sin6_addr = pktinfo.ipi6_addr; + return res; + } + } + return std::unexpected{Error::NOT_FOUND}; + } + return std::unexpected{Error::INVALID_ARGUMENT}; +} + +size_t msghdr_get_udp_gro(msghdr *msg) { + int gso_size = 0; + +#ifdef UDP_GRO + for (auto cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) { + if (cmsg->cmsg_level == SOL_UDP && cmsg->cmsg_type == UDP_GRO) { + memcpy(&gso_size, CMSG_DATA(cmsg), sizeof(gso_size)); + + break; + } + } +#endif // defined(UDP_GRO) + + return static_cast(gso_size); +} + +#ifdef HAVE_LINUX_RTNETLINK_H + +struct nlmsg { + nlmsghdr hdr; + rtmsg msg; + rtattr dst; + uint8_t dst_addr[sizeof(sockaddr_storage)]; +}; + +namespace { +std::expected send_netlink_msg(int fd, const Address &remote_addr, + uint32_t seq) { + nlmsg nlmsg{ + .hdr{ + .nlmsg_type = RTM_GETROUTE, + .nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK, + .nlmsg_seq = seq, + }, + .msg{ + .rtm_family = static_cast(remote_addr.family()), + .rtm_protocol = RTPROT_KERNEL, + }, + .dst{ + .rta_type = RTA_DST, + }, + }; + + std::visit( + [&nlmsg](auto &&arg) { + using T = std::decay_t; + + if constexpr (std::is_same_v) { + nlmsg.dst.rta_len = RTA_LENGTH(sizeof(arg.sin_addr)); + memcpy(RTA_DATA(&nlmsg.dst), &arg.sin_addr, sizeof(arg.sin_addr)); + return; + } + + if constexpr (std::is_same_v) { + nlmsg.dst.rta_len = RTA_LENGTH(sizeof(arg.sin6_addr)); + memcpy(RTA_DATA(&nlmsg.dst), &arg.sin6_addr, sizeof(arg.sin6_addr)); + return; + } + + assert(0); + abort(); + }, + remote_addr.skaddr); + + nlmsg.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(nlmsg.msg) + nlmsg.dst.rta_len); + + sockaddr_nl sa{ + .nl_family = AF_NETLINK, + }; + + iovec iov{ + .iov_base = &nlmsg, + .iov_len = nlmsg.hdr.nlmsg_len, + }; + msghdr msg{ + .msg_name = &sa, + .msg_namelen = sizeof(sa), + .msg_iov = &iov, + .msg_iovlen = 1, + }; + + ssize_t nwrite; + + do { + nwrite = sendmsg(fd, &msg, 0); + } while (nwrite == -1 && errno == EINTR); + + if (nwrite == -1) { + std::println(stderr, "sendmsg: Could not write netlink message: {}", + strerror(errno)); + return std::unexpected{Error::SYSCALL}; + } + + return {}; +} +} // namespace + +namespace { +std::expected recv_netlink_msg(int fd, uint32_t seq) { + std::array buf; + iovec iov = { + .iov_base = buf.data(), + .iov_len = buf.size(), + }; + sockaddr_nl sa{}; + msghdr msg{ + .msg_name = &sa, + .msg_namelen = sizeof(sa), + .msg_iov = &iov, + .msg_iovlen = 1, + }; + ssize_t nread; + InAddr ia; + + do { + nread = recvmsg(fd, &msg, 0); + } while (nread == -1 && errno == EINTR); + + if (nread == -1) { + std::println(stderr, "recvmsg: Could not receive netlink message: {}", + strerror(errno)); + return std::unexpected{Error::SYSCALL}; + } + + for (auto hdr = reinterpret_cast(buf.data()); + NLMSG_OK(hdr, nread); hdr = NLMSG_NEXT(hdr, nread)) { + if (seq != hdr->nlmsg_seq) { + std::println(stderr, + "netlink: unexpected sequence number {} while expecting {}", + hdr->nlmsg_seq, seq); + return std::unexpected{Error::INTERNAL}; + } + + if (hdr->nlmsg_flags & NLM_F_MULTI) { + std::println(stderr, "netlink: unexpected NLM_F_MULTI flag set"); + return std::unexpected{Error::INTERNAL}; + } + + switch (hdr->nlmsg_type) { + case NLMSG_DONE: + std::println(stderr, "netlink: unexpected NLMSG_DONE"); + return std::unexpected{Error::INTERNAL}; + case NLMSG_NOOP: + continue; + case NLMSG_ERROR: + std::println(stderr, "netlink: {}", + strerror(-static_cast(NLMSG_DATA(hdr))->error)); + return std::unexpected{Error::INTERNAL}; + } + + auto attrlen = hdr->nlmsg_len - NLMSG_SPACE(sizeof(rtmsg)); + + for (auto rta = reinterpret_cast( + static_cast(NLMSG_DATA(hdr)) + sizeof(rtmsg)); + RTA_OK(rta, attrlen); rta = RTA_NEXT(rta, attrlen)) { + if (rta->rta_type != RTA_PREFSRC) { + continue; + } + + switch (static_cast(NLMSG_DATA(hdr))->rtm_family) { + case AF_INET: { + constexpr auto in_addrlen = sizeof(in_addr); + if (RTA_LENGTH(in_addrlen) != rta->rta_len) { + return std::unexpected{Error::INTERNAL}; + } + + in_addr addr; + memcpy(&addr, RTA_DATA(rta), in_addrlen); + + ia.emplace(addr); + + break; + } + case AF_INET6: { + constexpr auto in_addrlen = sizeof(in6_addr); + if (RTA_LENGTH(in_addrlen) != rta->rta_len) { + return std::unexpected{Error::INTERNAL}; + } + + in6_addr addr; + memcpy(&addr, RTA_DATA(rta), in_addrlen); + + ia.emplace(addr); + + break; + } + default: + assert(0); + abort(); + } + + break; + } + } + + if (in_addr_empty(ia)) { + return std::unexpected{Error::NOT_FOUND}; + } + + // Read ACK + sa = {}; + msg = {}; + + msg.msg_name = &sa; + msg.msg_namelen = sizeof(sa); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + int error = -1; + + do { + nread = recvmsg(fd, &msg, 0); + } while (nread == -1 && errno == EINTR); + + if (nread == -1) { + std::println(stderr, "recvmsg: Could not receive netlink message: {}", + strerror(errno)); + return std::unexpected{Error::SYSCALL}; + } + + error = -1; + + for (auto hdr = reinterpret_cast(buf.data()); + NLMSG_OK(hdr, nread); hdr = NLMSG_NEXT(hdr, nread)) { + if (seq != hdr->nlmsg_seq) { + std::println(stderr, + "netlink: unexpected sequence number {} while expecting {}", + hdr->nlmsg_seq, seq); + return std::unexpected{Error::INTERNAL}; + } + + if (hdr->nlmsg_flags & NLM_F_MULTI) { + std::println(stderr, "netlink: unexpected NLM_F_MULTI flag set"); + return std::unexpected{Error::INTERNAL}; + } + + switch (hdr->nlmsg_type) { + case NLMSG_DONE: + std::println(stderr, "netlink: unexpected NLMSG_DONE"); + return std::unexpected{Error::INTERNAL}; + case NLMSG_NOOP: + continue; + case NLMSG_ERROR: + error = -static_cast(NLMSG_DATA(hdr))->error; + if (error == 0) { + break; + } + + std::println(stderr, "netlink: {}", strerror(error)); + + return std::unexpected{Error::INTERNAL}; + } + } + + if (error != 0) { + return std::unexpected{Error::INTERNAL}; + } + + return ia; +} +} // namespace + +std::expected get_local_addr(const Address &remote_addr) { + sockaddr_nl sa{ + .nl_family = AF_NETLINK, + }; + + auto fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); + if (fd == -1) { + std::println(stderr, "socket: Could not create netlink socket: {}", + strerror(errno)); + return std::unexpected{Error::SYSCALL}; + } + + auto fd_d = defer([fd] { close(fd); }); + + if (bind(fd, reinterpret_cast(&sa), sizeof(sa)) == -1) { + std::println(stderr, "bind: Could not bind netlink socket: {}", + strerror(errno)); + return std::unexpected{Error::SYSCALL}; + } + + uint32_t seq = 1; + + if (auto rv = send_netlink_msg(fd, remote_addr, seq); !rv) { + return std::unexpected{rv.error()}; + } + + return recv_netlink_msg(fd, seq); +} + +#endif // defined(HAVE_LINUX_NETLINK_H) + +bool addreq(const Address &addr, const InAddr &ia) { + return std::visit( + [&ia](auto &&arg) -> bool { + using T = std::decay_t; + + if constexpr (std::is_same_v) { + auto rhs = std::get_if(&ia); + + return rhs && memcmp(&arg.sin_addr, rhs, sizeof(*rhs)) == 0; + } + + if constexpr (std::is_same_v) { + auto rhs = std::get_if(&ia); + + return rhs && memcmp(&arg.sin6_addr, rhs, sizeof(*rhs)) == 0; + } + + assert(0); + abort(); + }, + addr.skaddr); +} + +const void *in_addr_get_ptr(const InAddr &ia) { + return std::visit( + [](auto &&arg) { + if constexpr (std::is_same_v, + std::monostate>) { + assert(0); + abort(); + } + + return reinterpret_cast(&arg); + }, + ia); +} + +bool in_addr_empty(const InAddr &ia) { + return std::holds_alternative(ia); +} + +const sockaddr *as_sockaddr(const Sockaddr &skaddr) { + return std::visit( + [](auto &&arg) { + if constexpr (std::is_same_v, + std::monostate>) { + assert(0); + abort(); + } + + return reinterpret_cast(&arg); + }, + skaddr); +} + +sockaddr *as_sockaddr(Sockaddr &skaddr) { + return std::visit( + [](auto &&arg) { + if constexpr (std::is_same_v, + std::monostate>) { + assert(0); + abort(); + } + + return reinterpret_cast(&arg); + }, + skaddr); +} + +int sockaddr_family(const Sockaddr &skaddr) { + return as_sockaddr(skaddr)->sa_family; +} + +uint16_t sockaddr_port(const Sockaddr &skaddr) { + return std::visit( + [](auto &&arg) -> uint16_t { + using T = std::decay_t; + + if constexpr (std::is_same_v) { + return ntohs(arg.sin_port); + } + + if constexpr (std::is_same_v) { + return ntohs(arg.sin6_port); + } + + assert(0); + abort(); + }, + skaddr); +} + +void sockaddr_port(Sockaddr &skaddr, uint16_t port) { + std::visit( + [port](auto &&arg) { + using T = std::decay_t; + + if constexpr (std::is_same_v) { + arg.sin_port = htons(port); + return; + } + + if constexpr (std::is_same_v) { + arg.sin6_port = htons(port); + return; + } + + assert(0); + abort(); + }, + skaddr); +} + +void sockaddr_set(Sockaddr &skaddr, const sockaddr *sa) { + switch (sa->sa_family) { + case AF_INET: + skaddr.emplace(*reinterpret_cast(sa)); + return; + case AF_INET6: + skaddr.emplace(*reinterpret_cast(sa)); + return; + default: + assert(0); + abort(); + } +} + +socklen_t sockaddr_size(const Sockaddr &skaddr) { + return std::visit( + [](auto &&arg) { return static_cast(sizeof(arg)); }, skaddr); +} + +bool sockaddr_empty(const Sockaddr &skaddr) { + return std::holds_alternative(skaddr); +} + +const sockaddr *Address::as_sockaddr() const { + return ngtcp2::as_sockaddr(skaddr); +} + +sockaddr *Address::as_sockaddr() { return ngtcp2::as_sockaddr(skaddr); } + +int Address::family() const { return sockaddr_family(skaddr); } + +uint16_t Address::port() const { return sockaddr_port(skaddr); } + +void Address::port(uint16_t port) { sockaddr_port(skaddr, port); } + +void Address::set(const sockaddr *sa) { sockaddr_set(skaddr, sa); } + +socklen_t Address::size() const { return sockaddr_size(skaddr); } + +bool Address::empty() const { return sockaddr_empty(skaddr); } + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/examples/shared.h b/deps/ngtcp2/ngtcp2/examples/shared.h new file mode 100644 index 000000000000..b9e0e1f0b012 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/shared.h @@ -0,0 +1,252 @@ +/* + * ngtcp2 + * + * Copyright (c) 2017 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef SHARED_H +#define SHARED_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include +#include +#include +#include + +#include + +#include "network.h" + +using namespace std::literals; + +namespace ngtcp2 { + +enum class Error { + // the generic errors that are not covered by more specific error + // codes. + INTERNAL, + // function arguments are invalid + INVALID_ARGUMENT, + // integer overflow error + INTEGER_OVERFLOW, + // file I/O error + IO, + // function is not implemented yet + NOT_IMPLEMENTED, + // the operation is not supported + UNSUPPORTED, + // entity is not found (e.g., file not found) + NOT_FOUND, + // crypto related error (e.g., error from TLS stack) + CRYPTO, + // system call error + SYSCALL, + // C library error (e.g., error from getaddrinfo) + LIBC, + // HTTP3 library error (e.g., error from nghttp3 API) + HTTP3, + // QUIC library error (e.g., error from ngtcp2 API) + QUIC, + // sending packet is blocked by kernel + SEND_BLOCKED, + // QUIC connection is in close-wait. + CLOSE_WAIT, + // QUIC connection should be retried. + RETRY_CONN, + // QUIC connection should be dropped. + DROP_CONN, + // Retry token is unreadable, and should be ignored. + UNREADABLE_TOKEN, +}; + +enum class AppProtocol { + H3, + HQ, +}; + +template +consteval std::span span_from_lit(const uint8_t (&s)[N]) { + return {s, N - 1}; +} + +inline constexpr uint8_t RAW_HQ_ALPN[] = "\xAhq-interop"; +inline constexpr auto HQ_ALPN = span_from_lit(RAW_HQ_ALPN); +inline constexpr auto HQ_ALPN_V1 = span_from_lit(RAW_HQ_ALPN); + +inline constexpr uint8_t RAW_H3_ALPN[] = "\x2h3"; +inline constexpr auto H3_ALPN = span_from_lit(RAW_H3_ALPN); +inline constexpr auto H3_ALPN_V1 = span_from_lit(RAW_H3_ALPN); + +inline constexpr uint32_t TLS_ALERT_ECH_REQUIRED = 121; + +inline constexpr auto MAX_RECV_PKTS = 64UZ; + +// msghdr_get_ecn gets ECN bits from |msg|. |family| is the address +// family from which packet is received. +uint8_t msghdr_get_ecn(msghdr *msg, int family); + +// fd_set_recv_ecn sets socket option to |fd| so that it can receive +// ECN bits. +void fd_set_recv_ecn(int fd, int family); + +// fd_set_ip_mtu_discover sets IP(V6)_MTU_DISCOVER socket option to +// |fd|. +void fd_set_ip_mtu_discover(int fd, int family); + +// fd_set_ip_dontfrag sets IP(V6)_DONTFRAG socket option to |fd|. +void fd_set_ip_dontfrag(int fd, int family); + +// fd_set_udp_gro sets UDP_GRO socket option to |fd|. +void fd_set_udp_gro(int fd); + +std::expected msghdr_get_local_addr(msghdr *msg, int family); + +// msghdr_get_udp_gro returns UDP_GRO value from |msg|. If UDP_GRO is +// not found, or UDP_GRO is not supported, this function returns 0. +size_t msghdr_get_udp_gro(msghdr *msg); + +// get_local_addr returns the preferred local address (interface +// address) for a given destination address |remote_addr|. +std::expected get_local_addr(const Address &remote_addr); + +// addreq returns true if |addr| and |ia| contain the same address. +bool addreq(const Address &addr, const InAddr &ia); + +// in_addr_get_ptr returns the pointer to the stored address in |ia|. +// It is undefined if |ia| contains std::monostate. +const void *in_addr_get_ptr(const InAddr &ia); + +// in_addr_empty returns true if |ia| if it does not contain any +// meaningful address. +bool in_addr_empty(const InAddr &ia); + +// as_sockaddr returns the pointer to the stored address casted to +// const sockaddr *. +[[nodiscard]] const sockaddr *as_sockaddr(const Sockaddr &skaddr); +[[nodiscard]] sockaddr *as_sockaddr(Sockaddr &skaddr); + +// sockaddr_family returns the address family. +[[nodiscard]] int sockaddr_family(const Sockaddr &skaddr); + +// sockaddr_port returns the port. +[[nodiscard]] uint16_t sockaddr_port(const Sockaddr &skaddr); + +// sockaddr_port sets |port| to |skaddr|. +void sockaddr_port(Sockaddr &skaddr, uint16_t port); + +// sockaddr_set stores |sa| to |skaddr|. The address family is +// determined by |sa|->sa_family, and |sa| must point to the memory +// that contains valid object which is either sockaddr_in or +// sockaddr_in6. +void sockaddr_set(Sockaddr &skaddr, const sockaddr *sa); + +// sockaddr_size returns the size of the stored address. +[[nodiscard]] socklen_t sockaddr_size(const Sockaddr &skaddr); + +// sockaddr_empty returns true if |skaddr| does not contain any +// meaningful address. +[[nodiscard]] bool sockaddr_empty(const Sockaddr &skaddr); + +[[nodiscard]] inline ngtcp2_addr as_ngtcp2_addr(const Address &addr) { + return { + .addr = const_cast(addr.as_sockaddr()), + .addrlen = addr.size(), + }; +} + +[[nodiscard]] inline ngtcp2_addr as_ngtcp2_addr(Address &addr) { + return { + .addr = addr.as_sockaddr(), + .addrlen = addr.size(), + }; +} + +} // namespace ngtcp2 + +template <> +struct std::formatter : public std::formatter { + template + auto format(ngtcp2::Error e, FormatContext &ctx) const { + auto s = "unknown"sv; + + switch (e) { + case ngtcp2::Error::INTERNAL: + s = "internal"sv; + break; + case ngtcp2::Error::INVALID_ARGUMENT: + s = "invalid argument"sv; + break; + case ngtcp2::Error::INTEGER_OVERFLOW: + s = "integer overflow"sv; + break; + case ngtcp2::Error::IO: + s = "I/O"sv; + break; + case ngtcp2::Error::NOT_IMPLEMENTED: + s = "not implemented"sv; + break; + case ngtcp2::Error::UNSUPPORTED: + s = "unsupported"sv; + break; + case ngtcp2::Error::NOT_FOUND: + s = "not found"sv; + break; + case ngtcp2::Error::CRYPTO: + s = "crypto"sv; + break; + case ngtcp2::Error::SYSCALL: + s = "syscall"sv; + break; + case ngtcp2::Error::LIBC: + s = "libc"sv; + break; + case ngtcp2::Error::HTTP3: + s = "HTTP3"sv; + break; + case ngtcp2::Error::QUIC: + s = "QUIC"sv; + break; + case ngtcp2::Error::SEND_BLOCKED: + s = "send blocked"sv; + break; + case ngtcp2::Error::CLOSE_WAIT: + s = "close wait"sv; + break; + case ngtcp2::Error::RETRY_CONN: + s = "retry connection"sv; + break; + case ngtcp2::Error::DROP_CONN: + s = "drop connection"sv; + break; + case ngtcp2::Error::UNREADABLE_TOKEN: + s = "unreadable token"sv; + break; + } + + return std::formatter::format(s, ctx); + } +}; + +#endif // !defined(SHARED_H) diff --git a/deps/ngtcp2/ngtcp2/examples/sim.cc b/deps/ngtcp2/ngtcp2/examples/sim.cc new file mode 100644 index 000000000000..2f371092bdcd --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/sim.cc @@ -0,0 +1,1095 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "sim.h" + +#include +#include +#include + +#include +#include +#include + +#include "ngtcp2/ngtcp2_crypto_wolfssl.h" + +#include "util.h" +#include "debug.h" + +using namespace std::literals; + +namespace ngtcp2 { + +constexpr auto ALPN_LIST = "ngtcp2-sim"sv; +constexpr auto CIDLEN = 10UZ; +constexpr uint8_t SERVER_SECRET[] = "server_secret"; +constexpr std::array static_secret{0xCA, 0xCE, 0xCA, 0xFE}; + +namespace { +std::expected generate_secure_random(std::span data) { + if (wolfSSL_RAND_bytes(data.data(), static_cast(data.size())) != 1) { + return std::unexpected{Error::CRYPTO}; + } + + return {}; +} + +void rand_bytes(uint8_t *dest, size_t destlen, + const ngtcp2_rand_ctx *rand_ctx) { + auto rv = generate_secure_random({dest, destlen}); + (void)rv; + assert(rv); +} + +int get_new_connection_id(ngtcp2_conn *conn, ngtcp2_cid *cid, + ngtcp2_stateless_reset_token *token, size_t cidlen, + void *user_data) { + if (!generate_secure_random({cid->data, cidlen})) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + cid->datalen = cidlen; + if (ngtcp2_crypto_generate_stateless_reset_token( + token->data, SERVER_SECRET, sizeof(SERVER_SECRET) - 1, cid) != 0) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} +} // namespace + +uint64_t LinkConfig::compute_expected_goodput(Timestamp::duration rtt) const { + // Assume 80% usage ratio. + uint64_t g = rate * 8 / 10; + + if (loss < 1e-9) { + return g; + } + + constexpr double margin = 0.9; + + return std::min(g, + static_cast(MAX_UDP_PAYLOAD_SIZE * NGTCP2_SECONDS / + static_cast(rtt.count()) / + sqrt(loss) * 8 * margin)); +} + +namespace { +int recv_stream_data(ngtcp2_conn *conn, uint32_t flags, int64_t stream_id, + uint64_t offset, const uint8_t *data, size_t datalen, + void *user_data, void *stream_user_data) { + ngtcp2_conn_extend_max_stream_offset(conn, stream_id, datalen); + ngtcp2_conn_extend_max_offset(conn, datalen); + + return 0; +} +} // namespace + +ngtcp2_callbacks default_client_callbacks() { + return ngtcp2_callbacks{ + .client_initial = ngtcp2_crypto_client_initial_cb, + .recv_crypto_data = ngtcp2_crypto_recv_crypto_data_cb, + .encrypt = ngtcp2_crypto_encrypt_cb, + .decrypt = ngtcp2_crypto_decrypt_cb, + .hp_mask = ngtcp2_crypto_hp_mask_cb, + .recv_stream_data = recv_stream_data, + .recv_retry = ngtcp2_crypto_recv_retry_cb, + .rand = rand_bytes, + .update_key = ngtcp2_crypto_update_key_cb, + .delete_crypto_aead_ctx = ngtcp2_crypto_delete_crypto_aead_ctx_cb, + .delete_crypto_cipher_ctx = ngtcp2_crypto_delete_crypto_cipher_ctx_cb, + .version_negotiation = ngtcp2_crypto_version_negotiation_cb, + .get_new_connection_id2 = get_new_connection_id, + .get_path_challenge_data2 = ngtcp2_crypto_get_path_challenge_data2_cb, + }; +} + +ngtcp2_callbacks default_server_callbacks() { + return ngtcp2_callbacks{ + .recv_client_initial = ngtcp2_crypto_recv_client_initial_cb, + .recv_crypto_data = ngtcp2_crypto_recv_crypto_data_cb, + .encrypt = ngtcp2_crypto_encrypt_cb, + .decrypt = ngtcp2_crypto_decrypt_cb, + .hp_mask = ngtcp2_crypto_hp_mask_cb, + .recv_stream_data = recv_stream_data, + .rand = rand_bytes, + .update_key = ngtcp2_crypto_update_key_cb, + .delete_crypto_aead_ctx = ngtcp2_crypto_delete_crypto_aead_ctx_cb, + .delete_crypto_cipher_ctx = ngtcp2_crypto_delete_crypto_cipher_ctx_cb, + .version_negotiation = ngtcp2_crypto_version_negotiation_cb, + .get_new_connection_id2 = get_new_connection_id, + .get_path_challenge_data2 = ngtcp2_crypto_get_path_challenge_data2_cb, + }; +} + +ngtcp2_settings default_client_settings() { + ngtcp2_settings settings; + ngtcp2_settings_default(&settings); + + settings.log_write = debug::log_write; + + return settings; +} + +ngtcp2_settings default_server_settings() { + ngtcp2_settings settings; + ngtcp2_settings_default(&settings); + + settings.log_write = debug::log_write; + + return settings; +} + +ngtcp2_transport_params default_client_transport_params() { + ngtcp2_transport_params params; + ngtcp2_transport_params_default(¶ms); + + return params; +} + +ngtcp2_transport_params default_server_transport_params() { + ngtcp2_transport_params params; + ngtcp2_transport_params_default(¶ms); + + return params; +} + +Sockaddr getaddrinfo(const char *host, const char *svc) { + auto hints = addrinfo{ + .ai_flags = AI_NUMERICHOST | AI_NUMERICSERV, + .ai_family = AF_UNSPEC, + }; + addrinfo *rp; + + auto rv = getaddrinfo(host, svc, &hints, &rp); + (void)rv; + assert(0 == rv); + + Sockaddr skaddr; + sockaddr_set(skaddr, rp->ai_addr); + + freeaddrinfo(rp); + + return skaddr; +} + +ngtcp2_addr default_client_addr() { + static auto skaddr = getaddrinfo("10.0.1.1", "12345"); + + return ngtcp2_addr{ + .addr = as_sockaddr(skaddr), + .addrlen = sockaddr_size(skaddr), + }; +} + +ngtcp2_addr default_server_addr() { + static auto skaddr = getaddrinfo("10.0.2.1", "443"); + + return ngtcp2_addr{ + .addr = as_sockaddr(skaddr), + .addrlen = sockaddr_size(skaddr), + }; +} + +EndpointConfig default_client_endpoint_config() { + return EndpointConfig{ + .callbacks = default_client_callbacks(), + .settings = default_client_settings(), + .params = default_client_transport_params(), + .local_addr = default_client_addr(), + }; +} + +EndpointConfig default_server_endpoint_config() { + return EndpointConfig{ + .server = true, + .callbacks = default_server_callbacks(), + .settings = default_server_settings(), + .params = default_server_transport_params(), + .local_addr = default_server_addr(), + }; +} + +namespace { +ngtcp2_conn *get_conn(ngtcp2_crypto_conn_ref *conn_ref) { + auto ep = static_cast(conn_ref->user_data); + return ep->get_conn(); +} +} // namespace + +Endpoint::Endpoint() + : conn_ref_{ngtcp2::get_conn, this}, channel_{config_.link} {} + +Endpoint::Endpoint(const EndpointConfig &config) + : config_{config}, + conn_ref_{ngtcp2::get_conn, this}, + channel_{config_.link} {} + +Endpoint::Endpoint(Endpoint &&other) noexcept + : config_{std::exchange(other.config_, {})}, + ssl_ctx_{std::exchange(other.ssl_ctx_, nullptr)}, + ssl_{std::exchange(other.ssl_, nullptr)}, + conn_{std::exchange(other.conn_, nullptr)}, + conn_ref_{ngtcp2::get_conn, this}, + channel_{std::exchange(other.channel_, {})}, + initialized_{std::exchange(other.initialized_, false)} { + if (ssl_) { + wolfSSL_set_app_data(ssl_, &conn_ref_); + } +} + +Endpoint::~Endpoint() { reset(); } + +void Endpoint::reset() { + ngtcp2_conn_del(conn_); + conn_ = nullptr; + + if (ssl_) { + wolfSSL_free(ssl_); + ssl_ = nullptr; + } + + if (ssl_ctx_) { + wolfSSL_CTX_free(ssl_ctx_); + ssl_ctx_ = nullptr; + } + + initialized_ = false; +} + +Endpoint &Endpoint::operator=(Endpoint &&other) noexcept { + reset(); + + config_ = std::exchange(other.config_, {}); + ssl_ctx_ = std::exchange(other.ssl_ctx_, nullptr); + ssl_ = std::exchange(other.ssl_, nullptr); + conn_ = std::exchange(other.conn_, nullptr); + conn_ref_ = {ngtcp2::get_conn, this}; + channel_ = std::exchange(other.channel_, {}); + initialized_ = std::exchange(other.initialized_, false); + + if (ssl_) { + wolfSSL_set_app_data(ssl_, &conn_ref_); + } + + return *this; +} + +constexpr auto tls_key = R"(-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgwEvkGGgXAcRaG7Z8 +gA7C6+W2RsW9gcjV9e5ybr0ikaahRANCAASCo35bDi+Q/q/CzHI1e5QaBrbqbFhW +G20QbVAeMK8l0oC8OGD3PSpZK1HXwALwzhMuwhxDos3ANb5naa5y17fQ +-----END PRIVATE KEY----- +)"sv; + +constexpr auto tls_crt = R"(-----BEGIN CERTIFICATE----- +MIICBzCCAa2gAwIBAgIUd2l6Pce3S0QH3dQC0Q/CjHbmggowCgYIKoZIzj0EAwIw +WTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu +dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTI1 +MTExNDExNTcwMFoXDTI1MTIxNDExNTcwMFowWTELMAkGA1UEBhMCQVUxEzARBgNV +BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 +ZDESMBAGA1UEAwwJbG9jYWxob3N0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE +gqN+Ww4vkP6vwsxyNXuUGga26mxYVhttEG1QHjCvJdKAvDhg9z0qWStR18AC8M4T +LsIcQ6LNwDW+Z2mucte30KNTMFEwHQYDVR0OBBYEFFVgXLoLwzpf6+twP5z8Ujr2 +5mxnMB8GA1UdIwQYMBaAFFVgXLoLwzpf6+twP5z8Ujr25mxnMA8GA1UdEwEB/wQF +MAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAO4tnDNRAcooz62vf2m7vTyDqFCjcaIv +SJ9Gq0lvEXEcAiBwWBNUASBqLaje3hmtgwxcF7EIqqiGo5j8f9Ufgu6SRg== +-----END CERTIFICATE----- +)"sv; + +std::expected +Endpoint::setup_server(std::span original_dcid, + std::span client_scid, uint32_t version, + const ngtcp2_addr *remote_addr, + std::optional token_params) { + ngtcp2_cid scid{ + .datalen = CIDLEN, + }; + + if (auto rv = generate_secure_random({scid.data, scid.datalen}); !rv) { + return rv; + } + + ngtcp2_cid dcid; + ngtcp2_cid_init(&dcid, client_scid.data(), client_scid.size()); + + auto params = config_.params; + auto settings = config_.settings; + + if (token_params) { + params.original_dcid = *token_params->original_dcid; + params.retry_scid = *token_params->retry_scid; + params.retry_scid_present = 1; + + settings.token = token_params->token.data(); + settings.tokenlen = token_params->token.size(); + settings.token_type = NGTCP2_TOKEN_TYPE_RETRY; + } else { + ngtcp2_cid_init(¶ms.original_dcid, original_dcid.data(), + original_dcid.size()); + } + + params.original_dcid_present = 1; + + if (ngtcp2_crypto_generate_stateless_reset_token( + params.stateless_reset_token, SERVER_SECRET, sizeof(SERVER_SECRET) - 1, + &scid) != 0) { + return std::unexpected{Error::QUIC}; + } + + auto path = ngtcp2_path{ + .local = config_.local_addr, + .remote = *remote_addr, + }; + + if (ngtcp2_conn_server_new(&conn_, &dcid, &scid, &path, version, + &config_.callbacks, &settings, ¶ms, nullptr, + config_.user_data) != 0) { + return std::unexpected{Error::QUIC}; + } + + ssl_ctx_ = wolfSSL_CTX_new(wolfTLSv1_3_server_method()); + if (!ssl_ctx_) { + return std::unexpected{Error::CRYPTO}; + } + + if (ngtcp2_crypto_wolfssl_configure_server_context(ssl_ctx_) != 0) { + return std::unexpected{Error::CRYPTO}; + } + + if (wolfSSL_CTX_use_certificate_buffer( + ssl_ctx_, reinterpret_cast(tls_crt.data()), + static_cast(tls_crt.size()), SSL_FILETYPE_PEM) != SSL_SUCCESS) { + return std::unexpected{Error::CRYPTO}; + } + + if (wolfSSL_CTX_use_PrivateKey_buffer( + ssl_ctx_, reinterpret_cast(tls_key.data()), + static_cast(tls_key.size()), SSL_FILETYPE_PEM) != SSL_SUCCESS) { + return std::unexpected{Error::CRYPTO}; + } + + ssl_ = wolfSSL_new(ssl_ctx_); + if (!ssl_) { + return std::unexpected{Error::CRYPTO}; + } + + if (wolfSSL_UseALPN(ssl_, const_cast(ALPN_LIST.data()), + ALPN_LIST.size(), + WOLFSSL_ALPN_FAILED_ON_MISMATCH) != WOLFSSL_SUCCESS) { + return std::unexpected{Error::CRYPTO}; + } + + wolfSSL_set_app_data(ssl_, &conn_ref_); + wolfSSL_set_accept_state(ssl_); + wolfSSL_set_quic_transport_version(ssl_, 0x39); + + ngtcp2_conn_set_tls_native_handle(conn_, ssl_); + + initialized_ = true; + + return {}; +} + +std::expected +Endpoint::setup_client(const ngtcp2_addr *remote_addr) { + ngtcp2_cid dcid{ + .datalen = CIDLEN, + }; + ngtcp2_cid scid{ + .datalen = CIDLEN, + }; + + if (auto rv = generate_secure_random({dcid.data, dcid.datalen}); !rv) { + return rv; + } + + if (auto rv = generate_secure_random({scid.data, scid.datalen}); !rv) { + return rv; + } + + auto path = ngtcp2_path{ + .local = config_.local_addr, + .remote = *remote_addr, + }; + + if (ngtcp2_conn_client_new( + &conn_, &dcid, &scid, &path, NGTCP2_PROTO_VER_V1, &config_.callbacks, + &config_.settings, &config_.params, nullptr, config_.user_data) != 0) { + return std::unexpected{Error::QUIC}; + } + + ssl_ctx_ = wolfSSL_CTX_new(wolfTLSv1_3_client_method()); + if (!ssl_ctx_) { + return std::unexpected{Error::CRYPTO}; + } + + if (ngtcp2_crypto_wolfssl_configure_client_context(ssl_ctx_) != 0) { + return std::unexpected{Error::CRYPTO}; + } + + ssl_ = wolfSSL_new(ssl_ctx_); + if (!ssl_) { + return std::unexpected{Error::CRYPTO}; + } + + if (wolfSSL_UseALPN(ssl_, const_cast(ALPN_LIST.data()), + ALPN_LIST.size(), + WOLFSSL_ALPN_FAILED_ON_MISMATCH) != WOLFSSL_SUCCESS) { + return std::unexpected{Error::CRYPTO}; + } + + wolfSSL_set_app_data(ssl_, &conn_ref_); + wolfSSL_set_connect_state(ssl_); + wolfSSL_set_quic_transport_version(ssl_, 0x39); + + ngtcp2_conn_set_tls_native_handle(conn_, ssl_); + + initialized_ = true; + + return {}; +} + +std::expected Endpoint::on_read(const NetworkPath &path, + std::span pkt, + const Context &ctx) { + auto ts = to_ngtcp2_tstamp(ctx.ts); + auto cpath = to_ngtcp2_path(path); + + auto rv = + ngtcp2_conn_read_pkt(conn_, &cpath, nullptr, pkt.data(), pkt.size(), ts); + if (rv != 0) { + if (rv == NGTCP2_ERR_RETRY) { + assert(ngtcp2_conn_is_server(conn_)); + + reset(); + + ngtcp2_version_cid vcid; + + auto rv = + ngtcp2_pkt_decode_version_cid(&vcid, pkt.data(), pkt.size(), CIDLEN); + if (rv != 0) { + return std::unexpected{Error::QUIC}; + } + + return send_retry(path, vcid); + } + + std::println(stderr, "ngtcp2_conn_read_pkt: {}", ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + + ctx.endpoint->get_channel().schedule_timeout(ctx.ts); + + return {}; +} + +std::expected +Endpoint::send_retry(const NetworkPath &path, const ngtcp2_version_cid &vcid) { + ngtcp2_cid dcid, odcid; + + assert(vcid.scidlen <= NGTCP2_MAX_CIDLEN); + assert(vcid.dcidlen <= NGTCP2_MAX_CIDLEN); + + ngtcp2_cid_init(&dcid, vcid.scid, vcid.scidlen); + ngtcp2_cid_init(&odcid, vcid.dcid, vcid.dcidlen); + + ngtcp2_cid scid; + + scid.datalen = CIDLEN; + + if (auto rv = generate_secure_random({scid.data, scid.datalen}); !rv) { + return rv; + } + + std::array token; + + auto cpath = to_ngtcp2_path(path); + + auto tokenlen = ngtcp2_crypto_generate_retry_token2( + token.data(), static_secret.data(), static_secret.size(), vcid.version, + cpath.remote.addr, cpath.remote.addrlen, &scid, &odcid, + to_ngtcp2_tstamp(channel_.get_timestamp())); + if (tokenlen < 0) { + return std::unexpected{Error::QUIC}; + } + + std::array buf; + + auto nwrite = ngtcp2_crypto_write_retry(buf.data(), buf.size(), vcid.version, + &dcid, &scid, &odcid, token.data(), + as_unsigned(tokenlen)); + if (nwrite < 0) { + return std::unexpected{Error::QUIC}; + } + + if (nwrite) { + channel_.send_pkt(path, {buf.data(), as_unsigned(nwrite)}); + } + + return {}; +} + +std::expected Endpoint::on_write(const Context &ctx) { + if (auto rv = config_.on_write(conn_, ctx); !rv) { + return rv; + } + + auto next_expiry_ts = ngtcp2_conn_get_expiry2(conn_); + if (next_expiry_ts == UINT64_MAX) { + return {}; + } + + if (to_ngtcp2_tstamp(Timestamp::max()) < next_expiry_ts) { + return std::unexpected{Error::INTERNAL}; + } + + ctx.endpoint->get_channel().schedule_timeout(to_timestamp(next_expiry_ts)); + + return {}; +} + +std::expected Endpoint::on_timeout(const Context &ctx) { + auto rv = ngtcp2_conn_handle_expiry(conn_, to_ngtcp2_tstamp(ctx.ts)); + if (rv != 0) { + std::println(stderr, "ngtcp2_conn_handle_expiry: {}", ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + + return on_write(ctx); +} + +NetworkPath to_network_path(const ngtcp2_path *path) { + NetworkPath res; + + res.local.set(path->local.addr); + res.remote.set(path->remote.addr); + + return res; +} + +ngtcp2_path to_ngtcp2_path(const NetworkPath &path) { + return { + .local = as_ngtcp2_addr(path.local), + .remote = as_ngtcp2_addr(path.remote), + }; +} + +NetworkPath NetworkPath::invert() const { + auto path = *this; + + std::swap(path.local, path.remote); + + return path; +} + +Channel::Channel(const LinkConfig &config) + : link_config_{config}, gen_{link_config_.seed} {} + +Channel::Channel(Channel &&other) noexcept + : link_config_{std::exchange(other.link_config_, {})}, + gen_{std::exchange(other.gen_, {})}, + tx_queue_{std::exchange(other.tx_queue_, {})}, + tx_queue_size_{std::exchange(other.tx_queue_size_, 0)}, + link_free_ts_{std::exchange(other.link_free_ts_, {})}, + queue_{std::exchange(other.queue_, {})}, + timeout_{std::exchange(other.timeout_, {})}, + ts_{std::exchange(other.ts_, {})} {} + +Channel &Channel::operator=(Channel &&other) noexcept { + link_config_ = std::exchange(other.link_config_, {}); + gen_ = std::exchange(other.gen_, {}); + tx_queue_ = std::exchange(other.tx_queue_, {}); + tx_queue_size_ = std::exchange(other.tx_queue_size_, 0); + link_free_ts_ = std::exchange(other.link_free_ts_, {}); + queue_ = std::exchange(other.queue_, {}); + timeout_ = std::exchange(other.timeout_, {}); + ts_ = std::exchange(other.ts_, {}); + + return *this; +} + +void Channel::send_pkt(const NetworkPath &path, std::span pkt) { + auto rate = link_config_.rate / 8; + + if (rate == 0) { + queue_.emplace(Event{ + .ts = ts_ + link_config_.delay, + .type = EVENT_TYPE_PKT, + .path = path, + .pkt = std::vector(std::ranges::begin(pkt), std::ranges::end(pkt)), + }); + + return; + } + + if (link_config_.limit && tx_queue_size_ + pkt.size() > link_config_.limit) { + return; + } + + auto departure_ts = std::max(ts_, link_free_ts_) + + Timestamp::duration{pkt.size() * NGTCP2_SECONDS / rate}; + + if (!decide_pkt_lost()) { + queue_.emplace(Event{ + .ts = departure_ts + link_config_.delay, + .type = EVENT_TYPE_PKT, + .path = path, + .pkt = std::vector(std::ranges::begin(pkt), std::ranges::end(pkt)), + }); + } + + tx_queue_.emplace_back(TxPacket{ + .departure_ts = departure_ts, + .size = pkt.size(), + }); + + tx_queue_size_ += pkt.size(); + link_free_ts_ = departure_ts; +} + +bool Channel::decide_pkt_lost() { + return std::uniform_real_distribution<>(0, 1.0)(gen_) < link_config_.loss; +} + +void Channel::pop_tx_queue() { + size_t n = 0; + + auto it = std::ranges::find_if(tx_queue_, [&n, this](const auto &pkt) { + if (pkt.departure_ts > ts_) { + return true; + } + + n += pkt.size; + + return false; + }); + + assert(tx_queue_size_ >= n); + + tx_queue_size_ -= n; + tx_queue_.erase(std::ranges::begin(tx_queue_), it); +} + +void Channel::schedule_timeout(Timestamp ts) { + timeout_ = std::min(timeout_, ts); +} + +Timestamp Channel::get_next_timestamp() const { + if (queue_.empty()) { + return timeout_; + } + + auto &top = queue_.top(); + + return std::min(timeout_, top.ts); +} + +Event Channel::get_next_event() { + if (!queue_.empty() && queue_.top().ts <= timeout_) { + auto &top = const_cast(queue_.top()); + + auto ev = Event{ + .ts = top.ts, + .type = top.type, + .path = top.path, + .pkt = std::move(top.pkt), + }; + + queue_.pop(); + + return ev; + } + + return Event{ + .ts = std::exchange(timeout_, Timestamp::max()), + .type = EVENT_TYPE_TIMEOUT, + }; +} + +void Channel::run_eventcb(Timestamp ts) { + if (link_config_.eventcb) { + link_config_.eventcb(ts, link_config_); + } +} + +Simulator::Simulator(Endpoint client, Endpoint server) + : client_{std::move(client)}, server_{std::move(server)} {} + +Simulator::Simulator(Simulator &&other) noexcept + : client_{std::exchange(client_, {})}, + server_{std::exchange(server_, {})}, + max_events_{std::exchange(other.max_events_, 0)} {} + +Simulator &Simulator::operator=(Simulator &&other) noexcept { + client_ = std::exchange(other.client_, {}); + server_ = std::exchange(other.server_, {}); + max_events_ = std::exchange(other.max_events_, 0); + + return *this; +} + +std::optional> Simulator::get_next_event() { + auto &client_chan = client_.get_channel(); + auto &server_chan = server_.get_channel(); + + auto client_next_ts = client_chan.get_next_timestamp(); + auto server_next_ts = server_chan.get_next_timestamp(); + + if (client_next_ts == Timestamp::max() && + server_next_ts == Timestamp::max()) { + return {}; + } + + if (client_next_ts <= server_next_ts) { + auto ev = client_chan.get_next_event(); + return {{std::move(ev), client_}}; + } + + auto ev = server_chan.get_next_event(); + + return {{std::move(ev), server_}}; +} + +std::expected Simulator::run() { + if (client_.get_initialized()) { + return std::unexpected{Error::INTERNAL}; + } + + if (auto rv = client_.setup_client(&server_.get_endpoint_config().local_addr); + !rv) { + return rv; + } + + auto ts = Timestamp{}; + auto &client_chan = client_.get_channel(); + auto &server_chan = server_.get_channel(); + + client_chan.schedule_timeout(ts); + + size_t k = 0; + + for (; k < max_events_; ++k) { + auto maybe_event = get_next_event(); + if (!maybe_event) { + break; + } + + auto &[event, ep] = *maybe_event; + + assert(ts <= event.ts); + + ts = event.ts; + + client_chan.set_timestamp(ts); + server_chan.set_timestamp(ts); + + client_chan.pop_tx_queue(); + server_chan.pop_tx_queue(); + + client_chan.run_eventcb(ts); + server_chan.run_eventcb(ts); + + switch (event.type) { + case EVENT_TYPE_TIMEOUT: { + auto ctx = Context{ + .sim = this, + .ts = ts, + .endpoint = &ep, + }; + + if (auto rv = ep.on_timeout(ctx); !rv) { + return rv; + } + + break; + } + case EVENT_TYPE_PKT: + if (auto rv = deliver_pkt(ep, event.path.invert(), event.pkt, ts); !rv) { + return rv; + } + + break; + } + } + + if (k == max_events_) { + return std::unexpected{Error::INTERNAL}; + } + + return {}; +} + +Endpoint &Simulator::get_opposite_endpoint(const Endpoint &ep) { + return &ep == &client_ ? server_ : client_; +} + +std::expected Simulator::deliver_pkt(Endpoint &remote_ep, + const NetworkPath &path, + std::span pkt, + Timestamp ts) { + auto &local_ep = get_opposite_endpoint(remote_ep); + + if (!local_ep.get_initialized() && local_ep.get_endpoint_config().server) { + ngtcp2_version_cid vcid; + + auto rv = + ngtcp2_pkt_decode_version_cid(&vcid, pkt.data(), pkt.size(), CIDLEN); + if (rv != 0) { + return std::unexpected{Error::QUIC}; + } + + ngtcp2_pkt_hd hd; + + if (ngtcp2_accept(&hd, pkt.data(), pkt.size()) != 0) { + return {}; + } + + ngtcp2_cid odcid; + std::optional token_params; + + if (hd.tokenlen) { + auto cpath = to_ngtcp2_path(path); + auto delay = local_ep.get_endpoint_config().link.delay; + auto timeout = delay * 2 * 2; + + auto rv = ngtcp2_crypto_verify_retry_token2( + &odcid, hd.token, hd.tokenlen, static_secret.data(), + static_secret.size(), vcid.version, cpath.remote.addr, + cpath.remote.addrlen, &hd.dcid, to_ngtcp2_duration(timeout), + to_ngtcp2_tstamp(ts)); + if (rv != 0) { + return std::unexpected{Error::QUIC}; + } + + token_params = TokenParams{ + .original_dcid = &odcid, + .retry_scid = &hd.dcid, + .token = {hd.token, hd.tokenlen}, + }; + } + + if (auto rv = local_ep.setup_server( + {vcid.dcid, vcid.dcidlen}, {vcid.scid, vcid.scidlen}, vcid.version, + &remote_ep.get_endpoint_config().local_addr, token_params); + !rv) { + return rv; + } + } + + auto ctx = Context{ + .sim = this, + .ts = ts, + .endpoint = &local_ep, + }; + + return local_ep.on_read(path, pkt, ctx); +} + +void HandshakeApp::configure(EndpointConfig &config) { + auto handshake_confirmed = [](ngtcp2_conn *conn, void *user_data) { + auto app = static_cast(user_data); + + app->handshake_confirmed(); + + return 0; + }; + + if (config.server) { + config.callbacks.handshake_completed = handshake_confirmed; + } else { + config.callbacks.handshake_confirmed = handshake_confirmed; + } + + config.on_write = [](ngtcp2_conn *conn, + const Context &ctx) -> std::expected { + std::array buf; + + auto ts = to_ngtcp2_tstamp(ctx.ts); + + ngtcp2_path_storage ps; + ngtcp2_path_storage_zero(&ps); + + auto nwrite = ngtcp2_conn_write_pkt(conn, &ps.path, nullptr, buf.data(), + buf.size(), ts); + if (nwrite < 0) { + std::println(stderr, "ngtcp2_conn_write_pkt: {}", + ngtcp2_strerror(static_cast(nwrite))); + return std::unexpected{Error::QUIC}; + } + + if (nwrite == 0) { + return {}; + } + + ngtcp2_conn_update_pkt_tx_time(conn, ts); + + ctx.endpoint->get_channel().send_pkt( + to_network_path(&ps.path), {buf.data(), static_cast(nwrite)}); + + return {}; + }; + + config.user_data = this; +} + +UniStreamApp::UniStreamApp(uint64_t max_bytes) : max_bytes_{max_bytes} {} + +namespace { +std::array nulldata; +} // namespace + +void UniStreamApp::configure(EndpointConfig &config) { + config.callbacks.stream_close = [](ngtcp2_conn *conn, uint32_t flags, + int64_t stream_id, uint64_t app_error_code, + void *user_data, void *stream_user_data) { + auto app = static_cast(user_data); + + app->stream_close(conn, stream_id); + + return 0; + }; + + config.callbacks.extend_max_local_streams_uni = + [](ngtcp2_conn *conn, uint64_t max_streams, void *user_data) { + auto app = static_cast(user_data); + + if (!app->extend_max_local_streams_uni(conn)) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; + }; + + config.on_write = [this](ngtcp2_conn *conn, const Context &ctx) { + return on_write(conn, ctx); + }; + + config.user_data = this; +} + +uint64_t UniStreamApp::compute_goodput() const { + auto d = get_transmit_duration(); + if (d == Timestamp::duration::zero()) { + return 0; + } + + return static_cast(static_cast(bytes_sent_) * + NGTCP2_SECONDS / static_cast(d.count()) * + 8); +} + +void UniStreamApp::stream_close(ngtcp2_conn *conn, int64_t stream_id) { + if (stream_id_ != stream_id) { + return; + } + + if (is_all_bytes_sent()) { + end_ts_ = to_timestamp(ngtcp2_conn_get_timestamp(conn)); + } +} + +std::expected +UniStreamApp::extend_max_local_streams_uni(ngtcp2_conn *conn) { + if (stream_id_ != -1) { + return {}; + } + + int64_t stream_id; + + auto rv = ngtcp2_conn_open_uni_stream(conn, &stream_id, nullptr); + if (rv != 0) { + std::println(stderr, "ngtcp2_conn_open_uni_stream: {}", + ngtcp2_strerror(rv)); + return std::unexpected{Error::QUIC}; + } + + stream_id_ = stream_id; + start_ts_ = to_timestamp(ngtcp2_conn_get_timestamp(conn)); + + return {}; +} + +std::expected UniStreamApp::on_write(ngtcp2_conn *conn, + const Context &ctx) { + std::array buf; + + int64_t stream_id; + ngtcp2_vec vec; + size_t veccnt; + uint32_t flags = NGTCP2_WRITE_STREAM_FLAG_NONE; + + if (stream_id_ != -1 && max_bytes_ > bytes_sent_) { + stream_id = stream_id_; + vec.base = nulldata.data(); + vec.len = static_cast( + std::min(static_cast(buf.size()), max_bytes_ - bytes_sent_)); + veccnt = 1; + + if (bytes_sent_ + vec.len == max_bytes_) { + flags |= NGTCP2_WRITE_STREAM_FLAG_FIN; + } + } else { + stream_id = -1; + veccnt = 0; + } + + auto ts = to_ngtcp2_tstamp(ctx.ts); + + ngtcp2_path_storage ps; + ngtcp2_path_storage_zero(&ps); + + ngtcp2_ssize ndatalen; + + auto nwrite = + ngtcp2_conn_writev_stream(conn, &ps.path, nullptr, buf.data(), buf.size(), + &ndatalen, flags, stream_id, &vec, veccnt, ts); + if (nwrite < 0) { + if (nwrite == NGTCP2_ERR_STREAM_DATA_BLOCKED) { + return {}; + } + + std::println(stderr, "ngtcp2_conn_writev_stream: {}", + ngtcp2_strerror(static_cast(nwrite))); + + return std::unexpected{Error::QUIC}; + } + + if (nwrite == 0) { + return {}; + } + + if (ndatalen > 0) { + bytes_sent_ += static_cast(ndatalen); + } + + ngtcp2_conn_update_pkt_tx_time(conn, ts); + + ctx.endpoint->get_channel().send_pkt( + to_network_path(&ps.path), {buf.data(), static_cast(nwrite)}); + + return {}; +} + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/examples/sim.h b/deps/ngtcp2/ngtcp2/examples/sim.h new file mode 100644 index 000000000000..98e72791b6f1 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/sim.h @@ -0,0 +1,325 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef SIM_H +#define SIM_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include "network.h" +#include "shared.h" + +namespace ngtcp2 { +inline constexpr auto MAX_UDP_PAYLOAD_SIZE = 1500UZ; + +using Timestamp = + std::chrono::time_point; + +[[nodiscard]] constexpr ngtcp2_tstamp to_ngtcp2_tstamp(Timestamp ts) { + return static_cast(ts.time_since_epoch().count()); +} + +[[nodiscard]] constexpr ngtcp2_duration +to_ngtcp2_duration(Timestamp::duration d) { + return static_cast(d.count()); +} + +[[nodiscard]] constexpr Timestamp to_timestamp(ngtcp2_tstamp ts) { + return Timestamp{Timestamp::duration{ts}}; +} + +class Simulator; +class Endpoint; + +struct Context { + Simulator *sim; + Timestamp ts; + Endpoint *endpoint; +}; + +[[nodiscard]] constexpr unsigned long long +operator""_kbps(unsigned long long k) noexcept { + return k * 1'000; +} + +[[nodiscard]] constexpr unsigned long long +operator""_mbps(unsigned long long m) noexcept { + return m * 1'000'000; +} + +[[nodiscard]] constexpr unsigned long long +operator""_gbps(unsigned long long g) noexcept { + return g * 1'000'000'000; +} + +struct LinkConfig { + // compute_expected_goodput computes the expected goodput with the + // given |rtt| in bits per second. + uint64_t compute_expected_goodput(Timestamp::duration rtt) const; + + // delay is the one-way link delay. + Timestamp::duration delay; + // rate is the bandwidth of this link measured in bits per second + // (e.g., 10_mbps). + uint64_t rate{}; + // limit is the maximum queue length of the outgoing packet measured + // in bytes. + uint64_t limit{}; + // loss is the probability of losing a packet. + double loss{}; + // seed is a seed value for the random number generator. + std::mt19937::result_type seed{}; + // eventcb is an optional callback that is invoked before processing + // each event. In this callback, LinkConfig can be dynamically + // adjusted to simulate dynamic network conditions. + std::function eventcb; +}; + +struct EndpointConfig { + bool server{}; + ngtcp2_callbacks callbacks{}; + ngtcp2_settings settings{}; + ngtcp2_transport_params params{}; + ngtcp2_addr local_addr{}; + void *user_data{}; + LinkConfig link; + + std::function(ngtcp2_conn *, const Context &)> + on_write; +}; + +ngtcp2_callbacks default_client_callbacks(); + +ngtcp2_callbacks default_server_callbacks(); + +ngtcp2_settings default_client_settings(); + +ngtcp2_settings default_server_settings(); + +ngtcp2_transport_params default_client_transport_params(); + +ngtcp2_transport_params default_server_transport_params(); + +ngtcp2_addr default_client_addr(); + +ngtcp2_addr default_server_addr(); + +EndpointConfig default_client_endpoint_config(); + +EndpointConfig default_server_endpoint_config(); + +struct NetworkPath { + NetworkPath invert() const; + + Address local{}; + Address remote{}; +}; + +NetworkPath to_network_path(const ngtcp2_path *path); + +ngtcp2_path to_ngtcp2_path(const NetworkPath &path); + +enum EventType { + EVENT_TYPE_TIMEOUT, + EVENT_TYPE_PKT, +}; + +struct Event { + Timestamp ts; + EventType type; + + NetworkPath path; + std::vector pkt; +}; + +constexpr bool operator>(const Event &lhs, const Event &rhs) { + return lhs.ts > rhs.ts; +} + +struct TxPacket { + Timestamp departure_ts; + size_t size; +}; + +class Channel { +public: + Channel() = default; + Channel(const LinkConfig &config); + Channel(const Channel &) = delete; + Channel(Channel &&) noexcept; + + Channel &operator=(const Channel &) = delete; + Channel &operator=(Channel &&) noexcept; + + void send_pkt(const NetworkPath &path, std::span pkt); + void schedule_timeout(Timestamp ts); + void set_timestamp(Timestamp ts) { ts_ = ts; } + Timestamp get_timestamp() const { return ts_; } + Timestamp get_next_timestamp() const; + Event get_next_event(); + void pop_tx_queue(); + void run_eventcb(Timestamp ts); + +private: + bool decide_pkt_lost(); + + LinkConfig link_config_; + std::mt19937 gen_; + std::deque tx_queue_; + size_t tx_queue_size_{}; + Timestamp link_free_ts_; + using EventQueue = + std::priority_queue, std::greater>; + EventQueue queue_; + Timestamp timeout_{Timestamp::max()}; + Timestamp ts_{}; +}; + +struct TokenParams { + const ngtcp2_cid *original_dcid; + const ngtcp2_cid *retry_scid; + std::span token; +}; + +class Endpoint { +public: + Endpoint(); + explicit Endpoint(const EndpointConfig &config); + Endpoint(Endpoint &&endpoint) noexcept; + Endpoint(const Endpoint &) = delete; + ~Endpoint(); + + Endpoint &operator=(const Endpoint &) = delete; + Endpoint &operator=(Endpoint &&) noexcept; + + std::expected setup_client(const ngtcp2_addr *remote_addr); + std::expected + setup_server(std::span original_dcid, + std::span client_scid, uint32_t version, + const ngtcp2_addr *remote_addr, + std::optional token_params); + ngtcp2_conn *get_conn() const { return conn_; } + bool get_initialized() const { return initialized_; } + const EndpointConfig &get_endpoint_config() const { return config_; } + std::expected on_read(const NetworkPath &path, + std::span pkt, + const Context &ctx); + std::expected on_write(const Context &ctx); + std::expected on_timeout(const Context &ctx); + Channel &get_channel() { return channel_; } + +private: + void reset(); + std::expected send_retry(const NetworkPath &path, + const ngtcp2_version_cid &vcid); + + EndpointConfig config_; + WOLFSSL_CTX *ssl_ctx_{}; + WOLFSSL *ssl_{}; + ngtcp2_conn *conn_{}; + ngtcp2_crypto_conn_ref conn_ref_{}; + Channel channel_; + bool initialized_{}; +}; + +class Simulator { +public: + Simulator(Endpoint client, Endpoint server); + Simulator(const Simulator &) = delete; + Simulator(Simulator &&) noexcept; + + Simulator &operator=(const Simulator &) = delete; + Simulator &operator=(Simulator &&) noexcept; + + std::expected run(); + void set_max_events(size_t n) { max_events_ = n; } + +private: + Endpoint &get_opposite_endpoint(const Endpoint &ep); + std::optional> get_next_event(); + std::expected deliver_pkt(Endpoint &remote_ep, + const NetworkPath &path, + std::span pkt, + Timestamp ts); + + Endpoint client_; + Endpoint server_; + size_t max_events_{1'000'000}; +}; + +class HandshakeApp { +public: + void configure(EndpointConfig &config); + + bool get_handshake_confirmed() const { return handshake_confirmed_; } + +private: + void handshake_confirmed() { handshake_confirmed_ = true; } + + bool handshake_confirmed_{}; +}; + +class UniStreamApp { +public: + UniStreamApp(uint64_t max_bytes); + + void configure(EndpointConfig &config); + uint64_t get_bytes_sent() const { return bytes_sent_; } + Timestamp::duration get_transmit_duration() const { + return end_ts_ - start_ts_; + } + bool is_all_bytes_sent() const { return bytes_sent_ == max_bytes_; } + // compute_goodput computes goodput in bits per second. + uint64_t compute_goodput() const; + +private: + void stream_close(ngtcp2_conn *conn, int64_t stream_id); + std::expected extend_max_local_streams_uni(ngtcp2_conn *conn); + std::expected on_write(ngtcp2_conn *conn, const Context &ctx); + + int64_t stream_id_{-1}; + uint64_t max_bytes_{}; + uint64_t bytes_sent_{}; + Timestamp start_ts_{Timestamp::max()}; + Timestamp end_ts_{Timestamp::max()}; +}; + +} // namespace ngtcp2 + +#endif // !defined(SIM_H) diff --git a/deps/ngtcp2/ngtcp2/examples/sim_test.cc b/deps/ngtcp2/ngtcp2/examples/sim_test.cc new file mode 100644 index 000000000000..b7e6d69e36d6 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/sim_test.cc @@ -0,0 +1,138 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "sim_test.h" + +#include "sim.h" +#include "util.h" + +using namespace std::literals; + +namespace ngtcp2 { + +namespace { +const MunitTest tests[]{ + munit_void_test(test_sim_handshake), + munit_void_test(test_sim_unistream), + munit_test_end(), +}; +} // namespace + +const MunitSuite sim_suite{ + .prefix = "/sim", + .tests = tests, +}; + +void test_sim_handshake(void) { + struct Test { + const char *name; + Timestamp::duration delay; + }; + + auto tests = std::to_array({ + { + .name = "short delay", + .delay = 15ms, + }, + { + .name = "long delay", + .delay = 1h, + }, + }); + + for (auto &t : tests) { + munit_logf(MUNIT_LOG_INFO, "testcase: %s", t.name); + + auto link = LinkConfig{ + .delay = t.delay, + }; + + HandshakeApp clapp; + auto cl = default_client_endpoint_config(); + clapp.configure(cl); + cl.link = link; + + HandshakeApp svapp; + auto sv = default_server_endpoint_config(); + svapp.configure(sv); + sv.link = link; + + auto rv = Simulator{Endpoint(cl), Endpoint(sv)}.run(); + + assert_true(rv.has_value()); + assert_true(clapp.get_handshake_confirmed()); + assert_true(svapp.get_handshake_confirmed()); + } +} + +void test_sim_unistream(void) { + struct Test { + const char *name; + double loss; + }; + + auto tests = std::to_array({ + { + .name = "no loss", + }, + { + .name = "1% loss", + .loss = 0.01, + }, + }); + + for (auto &t : tests) { + munit_logf(MUNIT_LOG_INFO, "testcase: %s", t.name); + + auto link = LinkConfig{ + .delay = 15ms, + .rate = 10_mbps, + .limit = MAX_UDP_PAYLOAD_SIZE * 25, + .loss = t.loss, + .seed = munit_rand_uint32(), + }; + + HandshakeApp clapp; + auto cl = default_client_endpoint_config(); + clapp.configure(cl); + cl.params.initial_max_streams_uni = 1; + cl.params.initial_max_stream_data_uni = 6_m; + cl.params.initial_max_data = 6_m; + cl.link = link; + + UniStreamApp svapp(10_m); + auto sv = default_server_endpoint_config(); + svapp.configure(sv); + sv.link = link; + + auto rv = Simulator{Endpoint(cl), Endpoint(sv)}.run(); + + assert_true(rv.has_value()); + assert_true(svapp.is_all_bytes_sent()); + assert_uint64(link.compute_expected_goodput(link.delay * 2), <=, + svapp.compute_goodput()); + } +} + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/examples/sim_test.h b/deps/ngtcp2/ngtcp2/examples/sim_test.h new file mode 100644 index 000000000000..ea94520caaa1 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/sim_test.h @@ -0,0 +1,45 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef SIM_TEST_H +#define SIM_TEST_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif // defined(HAVE_CONFIG_H) + +#define MUNIT_ENABLE_ASSERT_ALIASES + +#include "munitxx.h" + +namespace ngtcp2 { + +extern const MunitSuite sim_suite; + +munit_void_test_decl(test_sim_handshake) +munit_void_test_decl(test_sim_unistream) + +} // namespace ngtcp2 + +#endif // !defined(SIM_TEST_H) diff --git a/deps/ngtcp2/ngtcp2/examples/simpleclient.c b/deps/ngtcp2/ngtcp2/examples/simpleclient.c new file mode 100644 index 000000000000..65ab3560552b --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/simpleclient.c @@ -0,0 +1,662 @@ +/* + * ngtcp2 + * + * Copyright (c) 2021 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifdef HAVE_CONFIG_H +# include +#endif /* defined(HAVE_CONFIG_H) */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include + +#define REMOTE_HOST "127.0.0.1" +#define REMOTE_PORT "4433" +#define ALPN "\xAhq-interop" +#define MESSAGE "GET /\r\n" + +/* + * Example 1: Handshake with www.google.com + * + * #define REMOTE_HOST "www.google.com" + * #define REMOTE_PORT "443" + * #define ALPN "\x2h3" + * + * and undefine MESSAGE macro. + */ + +static uint64_t timestamp(void) { + struct timespec tp; + + if (clock_gettime(CLOCK_MONOTONIC, &tp) != 0) { + fprintf(stderr, "clock_gettime: %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + + return (uint64_t)tp.tv_sec * NGTCP2_SECONDS + (uint64_t)tp.tv_nsec; +} + +static int create_sock(struct sockaddr *addr, socklen_t *paddrlen, + const char *host, const char *port) { + struct addrinfo hints = {0}; + struct addrinfo *res, *rp; + int rv; + int fd = -1; + + hints.ai_flags = AF_UNSPEC; + hints.ai_socktype = SOCK_DGRAM; + + rv = getaddrinfo(host, port, &hints, &res); + if (rv != 0) { + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); + return -1; + } + + for (rp = res; rp; rp = rp->ai_next) { + fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + if (fd == -1) { + continue; + } + + break; + } + + if (fd == -1) { + goto end; + } + + *paddrlen = rp->ai_addrlen; + memcpy(addr, rp->ai_addr, rp->ai_addrlen); + +end: + freeaddrinfo(res); + + return fd; +} + +static int connect_sock(struct sockaddr *local_addr, socklen_t *plocal_addrlen, + int fd, const struct sockaddr *remote_addr, + size_t remote_addrlen) { + socklen_t len; + + if (connect(fd, remote_addr, (socklen_t)remote_addrlen) != 0) { + fprintf(stderr, "connect: %s\n", strerror(errno)); + return -1; + } + + len = *plocal_addrlen; + + if (getsockname(fd, local_addr, &len) == -1) { + fprintf(stderr, "getsockname: %s\n", strerror(errno)); + return -1; + } + + *plocal_addrlen = len; + + return 0; +} + +struct client { + ngtcp2_crypto_conn_ref conn_ref; + int fd; + struct sockaddr_storage local_addr; + socklen_t local_addrlen; + SSL_CTX *ssl_ctx; + SSL *ssl; + ngtcp2_conn *conn; + + struct { + int64_t stream_id; + const uint8_t *data; + size_t datalen; + size_t nwrite; + } stream; + + ngtcp2_ccerr last_error; + + ev_io rev; + ev_timer timer; +}; + +static int numeric_host_family(const char *hostname, int family) { + uint8_t dst[sizeof(struct in6_addr)]; + return inet_pton(family, hostname, dst) == 1; +} + +static int numeric_host(const char *hostname) { + return numeric_host_family(hostname, AF_INET) || + numeric_host_family(hostname, AF_INET6); +} + +static int client_ssl_init(struct client *c) { + c->ssl_ctx = SSL_CTX_new(TLS_client_method()); + if (!c->ssl_ctx) { + fprintf(stderr, "SSL_CTX_new: %s\n", + ERR_error_string(ERR_get_error(), NULL)); + return -1; + } + + if (ngtcp2_crypto_quictls_configure_client_context(c->ssl_ctx) != 0) { + fprintf(stderr, "ngtcp2_crypto_quictls_configure_client_context failed\n"); + return -1; + } + + c->ssl = SSL_new(c->ssl_ctx); + if (!c->ssl) { + fprintf(stderr, "SSL_new: %s\n", ERR_error_string(ERR_get_error(), NULL)); + return -1; + } + + SSL_set_app_data(c->ssl, &c->conn_ref); + SSL_set_connect_state(c->ssl); + SSL_set_alpn_protos(c->ssl, (const unsigned char *)ALPN, sizeof(ALPN) - 1); + if (!numeric_host(REMOTE_HOST)) { + SSL_set_tlsext_host_name(c->ssl, REMOTE_HOST); + } + + return 0; +} + +static void rand_cb(uint8_t *dest, size_t destlen, + const ngtcp2_rand_ctx *rand_ctx) { + int rv; + (void)rand_ctx; + + rv = RAND_bytes(dest, (int)destlen); + if (rv != 1) { + assert(0); + abort(); + } +} + +static int get_new_connection_id_cb(ngtcp2_conn *conn, ngtcp2_cid *cid, + ngtcp2_stateless_reset_token *token, + size_t cidlen, void *user_data) { + (void)conn; + (void)user_data; + + if (RAND_bytes(cid->data, (int)cidlen) != 1) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + cid->datalen = cidlen; + + if (RAND_bytes(token->data, sizeof(token->data)) != 1) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} + +static int extend_max_local_streams_bidi(ngtcp2_conn *conn, + uint64_t max_streams, + void *user_data) { +#ifdef MESSAGE + struct client *c = user_data; + int rv; + int64_t stream_id; + (void)max_streams; + + if (c->stream.stream_id != -1) { + return 0; + } + + rv = ngtcp2_conn_open_bidi_stream(conn, &stream_id, NULL); + if (rv != 0) { + return 0; + } + + c->stream.stream_id = stream_id; + c->stream.data = (const uint8_t *)MESSAGE; + c->stream.datalen = sizeof(MESSAGE) - 1; + + return 0; +#else /* !defined(MESSAGE) */ + (void)conn; + (void)max_streams; + (void)user_data; + + return 0; +#endif /* !defined(MESSAGE) */ +} + +static void log_printf(void *user_data, const char *fmt, ...) { + va_list ap; + (void)user_data; + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + + fprintf(stderr, "\n"); +} + +static int client_quic_init(struct client *c, + const struct sockaddr *remote_addr, + socklen_t remote_addrlen, + const struct sockaddr *local_addr, + socklen_t local_addrlen) { + ngtcp2_path path = { + .local = + { + .addr = (struct sockaddr *)local_addr, + .addrlen = local_addrlen, + }, + .remote = + { + .addr = (struct sockaddr *)remote_addr, + .addrlen = remote_addrlen, + }, + }; + ngtcp2_callbacks callbacks = { + .client_initial = ngtcp2_crypto_client_initial_cb, + .recv_crypto_data = ngtcp2_crypto_recv_crypto_data_cb, + .encrypt = ngtcp2_crypto_encrypt_cb, + .decrypt = ngtcp2_crypto_decrypt_cb, + .hp_mask = ngtcp2_crypto_hp_mask_cb, + .recv_retry = ngtcp2_crypto_recv_retry_cb, + .extend_max_local_streams_bidi = extend_max_local_streams_bidi, + .rand = rand_cb, + .update_key = ngtcp2_crypto_update_key_cb, + .delete_crypto_aead_ctx = ngtcp2_crypto_delete_crypto_aead_ctx_cb, + .delete_crypto_cipher_ctx = ngtcp2_crypto_delete_crypto_cipher_ctx_cb, + .version_negotiation = ngtcp2_crypto_version_negotiation_cb, + .get_new_connection_id2 = get_new_connection_id_cb, + .get_path_challenge_data2 = ngtcp2_crypto_get_path_challenge_data2_cb, + }; + ngtcp2_cid dcid, scid; + ngtcp2_settings settings; + ngtcp2_transport_params params; + int rv; + + dcid.datalen = NGTCP2_MIN_INITIAL_DCIDLEN; + if (RAND_bytes(dcid.data, (int)dcid.datalen) != 1) { + fprintf(stderr, "RAND_bytes failed\n"); + return -1; + } + + scid.datalen = 8; + if (RAND_bytes(scid.data, (int)scid.datalen) != 1) { + fprintf(stderr, "RAND_bytes failed\n"); + return -1; + } + + ngtcp2_settings_default(&settings); + + settings.initial_ts = timestamp(); + settings.log_printf = log_printf; + + ngtcp2_transport_params_default(¶ms); + + params.initial_max_streams_uni = 3; + params.initial_max_stream_data_bidi_local = 128 * 1024; + params.initial_max_data = 1024 * 1024; + + rv = + ngtcp2_conn_client_new(&c->conn, &dcid, &scid, &path, NGTCP2_PROTO_VER_V1, + &callbacks, &settings, ¶ms, NULL, c); + if (rv != 0) { + fprintf(stderr, "ngtcp2_conn_client_new: %s\n", ngtcp2_strerror(rv)); + return -1; + } + + ngtcp2_conn_set_tls_native_handle(c->conn, c->ssl); + + return 0; +} + +static int client_read(struct client *c) { + uint8_t buf[65536]; + struct sockaddr_storage addr; + struct iovec iov = { + .iov_base = buf, + .iov_len = sizeof(buf), + }; + struct msghdr msg = {0}; + ssize_t nread; + ngtcp2_path path; + ngtcp2_pkt_info pi = {0}; + int rv; + + msg.msg_name = &addr; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + for (;;) { + msg.msg_namelen = sizeof(addr); + + nread = recvmsg(c->fd, &msg, MSG_DONTWAIT); + + if (nread == -1) { + if (errno != EAGAIN && errno != EWOULDBLOCK) { + fprintf(stderr, "recvmsg: %s\n", strerror(errno)); + } + + break; + } + + path.local.addrlen = c->local_addrlen; + path.local.addr = (struct sockaddr *)&c->local_addr; + path.remote.addrlen = msg.msg_namelen; + path.remote.addr = msg.msg_name; + + rv = ngtcp2_conn_read_pkt(c->conn, &path, &pi, buf, (size_t)nread, + timestamp()); + if (rv != 0) { + fprintf(stderr, "ngtcp2_conn_read_pkt: %s\n", ngtcp2_strerror(rv)); + if (!c->last_error.error_code) { + if (rv == NGTCP2_ERR_CRYPTO) { + ngtcp2_ccerr_set_tls_alert( + &c->last_error, ngtcp2_conn_get_tls_alert2(c->conn), NULL, 0); + } else { + ngtcp2_ccerr_set_liberr(&c->last_error, rv, NULL, 0); + } + } + return -1; + } + } + + return 0; +} + +static int client_send_packet(struct client *c, const uint8_t *data, + size_t datalen) { + struct iovec iov = { + .iov_base = (uint8_t *)data, + .iov_len = datalen, + }; + struct msghdr msg = {0}; + ssize_t nwrite; + + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + do { + nwrite = sendmsg(c->fd, &msg, 0); + } while (nwrite == -1 && errno == EINTR); + + if (nwrite == -1) { + fprintf(stderr, "sendmsg: %s\n", strerror(errno)); + + return -1; + } + + return 0; +} + +static size_t client_get_message(struct client *c, int64_t *pstream_id, + int *pfin, ngtcp2_vec *datav, + size_t datavcnt) { + if (datavcnt == 0) { + return 0; + } + + if (c->stream.stream_id != -1 && c->stream.nwrite < c->stream.datalen) { + *pstream_id = c->stream.stream_id; + *pfin = 1; + datav->base = (uint8_t *)c->stream.data + c->stream.nwrite; + datav->len = c->stream.datalen - c->stream.nwrite; + return 1; + } + + *pstream_id = -1; + *pfin = 0; + datav->base = NULL; + datav->len = 0; + + return 0; +} + +static int client_write_streams(struct client *c) { + ngtcp2_tstamp ts = timestamp(); + ngtcp2_pkt_info pi; + ngtcp2_ssize nwrite; + uint8_t buf[1452]; + ngtcp2_path_storage ps; + ngtcp2_vec datav; + size_t datavcnt; + int64_t stream_id; + ngtcp2_ssize wdatalen; + uint32_t flags; + int fin; + + ngtcp2_path_storage_zero(&ps); + + for (;;) { + datavcnt = client_get_message(c, &stream_id, &fin, &datav, 1); + + flags = NGTCP2_WRITE_STREAM_FLAG_MORE; + if (fin) { + flags |= NGTCP2_WRITE_STREAM_FLAG_FIN; + } + + nwrite = ngtcp2_conn_writev_stream(c->conn, &ps.path, &pi, buf, sizeof(buf), + &wdatalen, flags, stream_id, &datav, + datavcnt, ts); + if (nwrite < 0) { + switch (nwrite) { + case NGTCP2_ERR_WRITE_MORE: + c->stream.nwrite += (size_t)wdatalen; + continue; + default: + fprintf(stderr, "ngtcp2_conn_writev_stream: %s\n", + ngtcp2_strerror((int)nwrite)); + ngtcp2_ccerr_set_liberr(&c->last_error, (int)nwrite, NULL, 0); + return -1; + } + } + + if (nwrite == 0) { + return 0; + } + + if (wdatalen > 0) { + c->stream.nwrite += (size_t)wdatalen; + } + + if (client_send_packet(c, buf, (size_t)nwrite) != 0) { + break; + } + } + + return 0; +} + +static int client_write(struct client *c) { + ngtcp2_tstamp expiry, now; + ev_tstamp t; + + if (client_write_streams(c) != 0) { + return -1; + } + + expiry = ngtcp2_conn_get_expiry2(c->conn); + now = timestamp(); + + t = expiry < now ? 1e-9 : (ev_tstamp)(expiry - now) / NGTCP2_SECONDS; + + c->timer.repeat = t; + ev_timer_again(EV_DEFAULT, &c->timer); + + return 0; +} + +static int client_handle_expiry(struct client *c) { + int rv = ngtcp2_conn_handle_expiry(c->conn, timestamp()); + if (rv != 0) { + fprintf(stderr, "ngtcp2_conn_handle_expiry: %s\n", ngtcp2_strerror(rv)); + return -1; + } + + return 0; +} + +static void client_close(struct client *c) { + ngtcp2_ssize nwrite; + ngtcp2_pkt_info pi; + ngtcp2_path_storage ps; + uint8_t buf[1280]; + + if (ngtcp2_conn_in_closing_period2(c->conn) || + ngtcp2_conn_in_draining_period2(c->conn)) { + goto fin; + } + + ngtcp2_path_storage_zero(&ps); + + nwrite = ngtcp2_conn_write_connection_close( + c->conn, &ps.path, &pi, buf, sizeof(buf), &c->last_error, timestamp()); + if (nwrite < 0) { + fprintf(stderr, "ngtcp2_conn_write_connection_close: %s\n", + ngtcp2_strerror((int)nwrite)); + goto fin; + } + + client_send_packet(c, buf, (size_t)nwrite); + +fin: + ev_break(EV_DEFAULT, EVBREAK_ALL); +} + +static void read_cb(struct ev_loop *loop, ev_io *w, int revents) { + struct client *c = w->data; + (void)loop; + (void)revents; + + if (client_read(c) != 0) { + client_close(c); + return; + } + + if (client_write(c) != 0) { + client_close(c); + } +} + +static void timer_cb(struct ev_loop *loop, ev_timer *w, int revents) { + struct client *c = w->data; + (void)loop; + (void)revents; + + if (client_handle_expiry(c) != 0) { + client_close(c); + return; + } + + if (client_write(c) != 0) { + client_close(c); + } +} + +static ngtcp2_conn *get_conn(ngtcp2_crypto_conn_ref *conn_ref) { + struct client *c = conn_ref->user_data; + return c->conn; +} + +static int client_init(struct client *c) { + struct sockaddr_storage remote_addr, local_addr; + socklen_t remote_addrlen, local_addrlen = sizeof(local_addr); + + *c = (struct client){0}; + + ngtcp2_ccerr_default(&c->last_error); + + c->fd = create_sock((struct sockaddr *)&remote_addr, &remote_addrlen, + REMOTE_HOST, REMOTE_PORT); + if (c->fd == -1) { + return -1; + } + + if (connect_sock((struct sockaddr *)&local_addr, &local_addrlen, c->fd, + (struct sockaddr *)&remote_addr, remote_addrlen) != 0) { + return -1; + } + + memcpy(&c->local_addr, &local_addr, sizeof(c->local_addr)); + c->local_addrlen = local_addrlen; + + if (client_ssl_init(c) != 0) { + return -1; + } + + if (client_quic_init(c, (struct sockaddr *)&remote_addr, remote_addrlen, + (struct sockaddr *)&local_addr, local_addrlen) != 0) { + return -1; + } + + c->stream.stream_id = -1; + + c->conn_ref.get_conn = get_conn; + c->conn_ref.user_data = c; + + ev_io_init(&c->rev, read_cb, c->fd, EV_READ); + c->rev.data = c; + ev_io_start(EV_DEFAULT, &c->rev); + + ev_timer_init(&c->timer, timer_cb, 0., 0.); + c->timer.data = c; + + return 0; +} + +static void client_free(struct client *c) { + ngtcp2_conn_del(c->conn); + SSL_free(c->ssl); + SSL_CTX_free(c->ssl_ctx); +} + +int main(void) { + struct client c; + + srandom((unsigned int)timestamp()); + + if (client_init(&c) != 0) { + exit(EXIT_FAILURE); + } + + if (client_write(&c) != 0) { + exit(EXIT_FAILURE); + } + + ev_run(EV_DEFAULT, 0); + + client_free(&c); + + return 0; +} diff --git a/deps/ngtcp2/ngtcp2/examples/siphash.cc b/deps/ngtcp2/ngtcp2/examples/siphash.cc new file mode 100644 index 000000000000..58cad9d1b775 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/siphash.cc @@ -0,0 +1,115 @@ +/* Copyright 2019 The BoringSSL Authors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +/* + * ngtcp2 + * + * Copyright (c) 2025 nghttp2 contributors + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include +#include + +#include "siphash.h" + +namespace { +auto CRYPTO_load_u64_le(std::span in) { + uint64_t v; + + memcpy(&v, in.data(), sizeof(v)); + + if constexpr (std::endian::native == std::endian::big) { + return byteswap(v); + } + + return v; +} +} // namespace + +namespace { +constexpr void siphash_round(uint64_t v[4]) { + v[0] += v[1]; + v[2] += v[3]; + v[1] = std::rotl(v[1], 13); + v[3] = std::rotl(v[3], 16); + v[1] ^= v[0]; + v[3] ^= v[2]; + v[0] = std::rotl(v[0], 32); + v[2] += v[1]; + v[0] += v[3]; + v[1] = std::rotl(v[1], 17); + v[3] = std::rotl(v[3], 21); + v[1] ^= v[2]; + v[3] ^= v[0]; + v[2] = std::rotl(v[2], 32); +} +} // namespace + +uint64_t siphash24(std::span key, + std::span input) { + const auto orig_input_len = input.size(); + uint64_t v[]{ + key[0] ^ UINT64_C(0x736F6D6570736575), + key[1] ^ UINT64_C(0x646F72616E646F6D), + key[0] ^ UINT64_C(0x6C7967656E657261), + key[1] ^ UINT64_C(0x7465646279746573), + }; + + while (input.size() >= sizeof(uint64_t)) { + auto m = CRYPTO_load_u64_le(input.first()); + v[3] ^= m; + siphash_round(v); + siphash_round(v); + v[0] ^= m; + + input = input.subspan(sizeof(uint64_t)); + } + + std::array last_block{}; + std::ranges::copy(input, std::ranges::begin(last_block)); + last_block.back() = orig_input_len & 0xFF; + + auto last_block_word = CRYPTO_load_u64_le(last_block); + v[3] ^= last_block_word; + siphash_round(v); + siphash_round(v); + v[0] ^= last_block_word; + + v[2] ^= 0xFF; + siphash_round(v); + siphash_round(v); + siphash_round(v); + siphash_round(v); + + return v[0] ^ v[1] ^ v[2] ^ v[3]; +} diff --git a/deps/ngtcp2/ngtcp2/examples/siphash.h b/deps/ngtcp2/ngtcp2/examples/siphash.h new file mode 100644 index 000000000000..8f82c53c79fc --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/siphash.h @@ -0,0 +1,63 @@ +/* Copyright 2019 The BoringSSL Authors + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +/* + * ngtcp2 + * + * Copyright (c) 2025 nghttp2 contributors + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef SIPHASH_H +#define SIPHASH_H + +#include +#include +#include +#include +#include + +// SipHash is a fast, secure PRF that is often used for hash tables. + +// siphash24 implements SipHash-2-4. See +// https://131002.net/siphash/siphash.pdf +uint64_t siphash24(std::span key, + std::span input); + +// Define here to be usable in tests. +template T byteswap(T v) { + auto c = std::bit_cast>(v); + std::ranges::reverse(c); + return std::bit_cast(c); +} + +#endif // !defined(SIPHASH_H) diff --git a/deps/ngtcp2/ngtcp2/examples/siphash_test.cc b/deps/ngtcp2/ngtcp2/examples/siphash_test.cc new file mode 100644 index 000000000000..54f300444efa --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/siphash_test.cc @@ -0,0 +1,98 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 nghttp2 contributors + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "siphash_test.h" + +#include +#include +#include + +#include "siphash.h" +#include "siphash_vector.h" + +namespace ngtcp2 { + +namespace { +const MunitTest tests[]{ + munit_void_test(test_siphash), + munit_void_test(test_siphash_vector), + munit_test_end(), +}; +} // namespace + +const MunitSuite siphash_suite{ + .prefix = "/siphash", + .tests = tests, +}; + +void test_siphash(void) { + std::array key_bytes; + std::iota(std::ranges::begin(key_bytes), std::ranges::end(key_bytes), 0); + + std::array key; + memcpy(key.data(), key_bytes.data(), key_bytes.size()); + + if constexpr (std::endian::native == std::endian::big) { + key[0] = byteswap(key[0]); + key[1] = byteswap(key[1]); + } + + std::array input; + std::iota(std::ranges::begin(input), std::ranges::end(input), 0); + + assert_uint64(0xA129CA6149BE45E5ULL, ==, siphash24(key, input)); +} + +void test_siphash_vector(void) { + std::array key_bytes; + std::iota(std::ranges::begin(key_bytes), std::ranges::end(key_bytes), 0); + + std::array key; + memcpy(key.data(), key_bytes.data(), key_bytes.size()); + + if constexpr (std::endian::native == std::endian::big) { + key[0] = byteswap(key[0]); + key[1] = byteswap(key[1]); + } + + std::array in; + + for (size_t i = 0; i < 64; ++i) { + in[i] = static_cast(i); + auto h = siphash24(key, std::span{in}.first(i)); + + uint64_t expect; + + memcpy(&expect, &vectors_sip64[i], sizeof(expect)); + + if constexpr (std::endian::native == std::endian::big) { + expect = byteswap(expect); + } + + assert_uint64(expect, ==, h); + } +} + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/examples/siphash_test.h b/deps/ngtcp2/ngtcp2/examples/siphash_test.h new file mode 100644 index 000000000000..c356d2e6b004 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/siphash_test.h @@ -0,0 +1,46 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 nghttp2 contributors + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef SIPHASH_TEST_H +#define SIPHASH_TEST_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#define MUNIT_ENABLE_ASSERT_ALIASES + +#include "munit.h" + +namespace ngtcp2 { + +extern const MunitSuite siphash_suite; + +munit_void_test_decl(test_siphash) +munit_void_test_decl(test_siphash_vector) + +} // namespace ngtcp2 + +#endif // !defined(SIPHASH_TEST_H) diff --git a/deps/ngtcp2/ngtcp2/examples/siphash_vector.h b/deps/ngtcp2/ngtcp2/examples/siphash_vector.h new file mode 100644 index 000000000000..5f4c294cf365 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/siphash_vector.h @@ -0,0 +1,645 @@ +// https://github.com/veorq/SipHash/blob/f26d35e964c6290ffe23d9043475ad3129f409e0/vectors.h +#include + +const uint8_t vectors_sip64[64][8] = { + { + 0x31, + 0x0E, + 0x0E, + 0xDD, + 0x47, + 0xDB, + 0x6F, + 0x72, + }, + { + 0xFD, + 0x67, + 0xDC, + 0x93, + 0xC5, + 0x39, + 0xF8, + 0x74, + }, + { + 0x5A, + 0x4F, + 0xA9, + 0xD9, + 0x09, + 0x80, + 0x6C, + 0x0D, + }, + { + 0x2D, + 0x7E, + 0xFB, + 0xD7, + 0x96, + 0x66, + 0x67, + 0x85, + }, + { + 0xB7, + 0x87, + 0x71, + 0x27, + 0xE0, + 0x94, + 0x27, + 0xCF, + }, + { + 0x8D, + 0xA6, + 0x99, + 0xCD, + 0x64, + 0x55, + 0x76, + 0x18, + }, + { + 0xCE, + 0xE3, + 0xFE, + 0x58, + 0x6E, + 0x46, + 0xC9, + 0xCB, + }, + { + 0x37, + 0xD1, + 0x01, + 0x8B, + 0xF5, + 0x00, + 0x02, + 0xAB, + }, + { + 0x62, + 0x24, + 0x93, + 0x9A, + 0x79, + 0xF5, + 0xF5, + 0x93, + }, + { + 0xB0, + 0xE4, + 0xA9, + 0x0B, + 0xDF, + 0x82, + 0x00, + 0x9E, + }, + { + 0xF3, + 0xB9, + 0xDD, + 0x94, + 0xC5, + 0xBB, + 0x5D, + 0x7A, + }, + { + 0xA7, + 0xAD, + 0x6B, + 0x22, + 0x46, + 0x2F, + 0xB3, + 0xF4, + }, + { + 0xFB, + 0xE5, + 0x0E, + 0x86, + 0xBC, + 0x8F, + 0x1E, + 0x75, + }, + { + 0x90, + 0x3D, + 0x84, + 0xC0, + 0x27, + 0x56, + 0xEA, + 0x14, + }, + { + 0xEE, + 0xF2, + 0x7A, + 0x8E, + 0x90, + 0xCA, + 0x23, + 0xF7, + }, + { + 0xE5, + 0x45, + 0xBE, + 0x49, + 0x61, + 0xCA, + 0x29, + 0xA1, + }, + { + 0xDB, + 0x9B, + 0xC2, + 0x57, + 0x7F, + 0xCC, + 0x2A, + 0x3F, + }, + { + 0x94, + 0x47, + 0xBE, + 0x2C, + 0xF5, + 0xE9, + 0x9A, + 0x69, + }, + { + 0x9C, + 0xD3, + 0x8D, + 0x96, + 0xF0, + 0xB3, + 0xC1, + 0x4B, + }, + { + 0xBD, + 0x61, + 0x79, + 0xA7, + 0x1D, + 0xC9, + 0x6D, + 0xBB, + }, + { + 0x98, + 0xEE, + 0xA2, + 0x1A, + 0xF2, + 0x5C, + 0xD6, + 0xBE, + }, + { + 0xC7, + 0x67, + 0x3B, + 0x2E, + 0xB0, + 0xCB, + 0xF2, + 0xD0, + }, + { + 0x88, + 0x3E, + 0xA3, + 0xE3, + 0x95, + 0x67, + 0x53, + 0x93, + }, + { + 0xC8, + 0xCE, + 0x5C, + 0xCD, + 0x8C, + 0x03, + 0x0C, + 0xA8, + }, + { + 0x94, + 0xAF, + 0x49, + 0xF6, + 0xC6, + 0x50, + 0xAD, + 0xB8, + }, + { + 0xEA, + 0xB8, + 0x85, + 0x8A, + 0xDE, + 0x92, + 0xE1, + 0xBC, + }, + { + 0xF3, + 0x15, + 0xBB, + 0x5B, + 0xB8, + 0x35, + 0xD8, + 0x17, + }, + { + 0xAD, + 0xCF, + 0x6B, + 0x07, + 0x63, + 0x61, + 0x2E, + 0x2F, + }, + { + 0xA5, + 0xC9, + 0x1D, + 0xA7, + 0xAC, + 0xAA, + 0x4D, + 0xDE, + }, + { + 0x71, + 0x65, + 0x95, + 0x87, + 0x66, + 0x50, + 0xA2, + 0xA6, + }, + { + 0x28, + 0xEF, + 0x49, + 0x5C, + 0x53, + 0xA3, + 0x87, + 0xAD, + }, + { + 0x42, + 0xC3, + 0x41, + 0xD8, + 0xFA, + 0x92, + 0xD8, + 0x32, + }, + { + 0xCE, + 0x7C, + 0xF2, + 0x72, + 0x2F, + 0x51, + 0x27, + 0x71, + }, + { + 0xE3, + 0x78, + 0x59, + 0xF9, + 0x46, + 0x23, + 0xF3, + 0xA7, + }, + { + 0x38, + 0x12, + 0x05, + 0xBB, + 0x1A, + 0xB0, + 0xE0, + 0x12, + }, + { + 0xAE, + 0x97, + 0xA1, + 0x0F, + 0xD4, + 0x34, + 0xE0, + 0x15, + }, + { + 0xB4, + 0xA3, + 0x15, + 0x08, + 0xBE, + 0xFF, + 0x4D, + 0x31, + }, + { + 0x81, + 0x39, + 0x62, + 0x29, + 0xF0, + 0x90, + 0x79, + 0x02, + }, + { + 0x4D, + 0x0C, + 0xF4, + 0x9E, + 0xE5, + 0xD4, + 0xDC, + 0xCA, + }, + { + 0x5C, + 0x73, + 0x33, + 0x6A, + 0x76, + 0xD8, + 0xBF, + 0x9A, + }, + { + 0xD0, + 0xA7, + 0x04, + 0x53, + 0x6B, + 0xA9, + 0x3E, + 0x0E, + }, + { + 0x92, + 0x59, + 0x58, + 0xFC, + 0xD6, + 0x42, + 0x0C, + 0xAD, + }, + { + 0xA9, + 0x15, + 0xC2, + 0x9B, + 0xC8, + 0x06, + 0x73, + 0x18, + }, + { + 0x95, + 0x2B, + 0x79, + 0xF3, + 0xBC, + 0x0A, + 0xA6, + 0xD4, + }, + { + 0xF2, + 0x1D, + 0xF2, + 0xE4, + 0x1D, + 0x45, + 0x35, + 0xF9, + }, + { + 0x87, + 0x57, + 0x75, + 0x19, + 0x04, + 0x8F, + 0x53, + 0xA9, + }, + { + 0x10, + 0xA5, + 0x6C, + 0xF5, + 0xDF, + 0xCD, + 0x9A, + 0xDB, + }, + { + 0xEB, + 0x75, + 0x09, + 0x5C, + 0xCD, + 0x98, + 0x6C, + 0xD0, + }, + { + 0x51, + 0xA9, + 0xCB, + 0x9E, + 0xCB, + 0xA3, + 0x12, + 0xE6, + }, + { + 0x96, + 0xAF, + 0xAD, + 0xFC, + 0x2C, + 0xE6, + 0x66, + 0xC7, + }, + { + 0x72, + 0xFE, + 0x52, + 0x97, + 0x5A, + 0x43, + 0x64, + 0xEE, + }, + { + 0x5A, + 0x16, + 0x45, + 0xB2, + 0x76, + 0xD5, + 0x92, + 0xA1, + }, + { + 0xB2, + 0x74, + 0xCB, + 0x8E, + 0xBF, + 0x87, + 0x87, + 0x0A, + }, + { + 0x6F, + 0x9B, + 0xB4, + 0x20, + 0x3D, + 0xE7, + 0xB3, + 0x81, + }, + { + 0xEA, + 0xEC, + 0xB2, + 0xA3, + 0x0B, + 0x22, + 0xA8, + 0x7F, + }, + { + 0x99, + 0x24, + 0xA4, + 0x3C, + 0xC1, + 0x31, + 0x57, + 0x24, + }, + { + 0xBD, + 0x83, + 0x8D, + 0x3A, + 0xAF, + 0xBF, + 0x8D, + 0xB7, + }, + { + 0x0B, + 0x1A, + 0x2A, + 0x32, + 0x65, + 0xD5, + 0x1A, + 0xEA, + }, + { + 0x13, + 0x50, + 0x79, + 0xA3, + 0x23, + 0x1C, + 0xE6, + 0x60, + }, + { + 0x93, + 0x2B, + 0x28, + 0x46, + 0xE4, + 0xD7, + 0x06, + 0x66, + }, + { + 0xE1, + 0x91, + 0x5F, + 0x5C, + 0xB1, + 0xEC, + 0xA4, + 0x6C, + }, + { + 0xF3, + 0x25, + 0x96, + 0x5C, + 0xA1, + 0x6D, + 0x62, + 0x9F, + }, + { + 0x57, + 0x5F, + 0xF2, + 0x8E, + 0x60, + 0x38, + 0x1B, + 0xE5, + }, + { + 0x72, + 0x45, + 0x06, + 0xEB, + 0x4C, + 0x32, + 0x8A, + 0x95, + }, +}; diff --git a/deps/ngtcp2/ngtcp2/examples/template.h b/deps/ngtcp2/ngtcp2/examples/template.h new file mode 100644 index 000000000000..43ebe0b31e40 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/template.h @@ -0,0 +1,111 @@ +/* + * ngtcp2 + * + * Copyright (c) 2017 ngtcp2 contributors + * Copyright (c) 2015 ngttp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TEMPLATE_H +#define TEMPLATE_H + +#include +#include +#include +#include + +template +[[nodiscard]] constexpr auto as_unsigned(T n) noexcept { + return static_cast>(n); +} + +template +[[nodiscard]] constexpr auto as_signed(T n) noexcept { + return static_cast>(n); +} + +template +[[nodiscard]] auto as_uint8_span(std::span s) noexcept { + return std::span{ + reinterpret_cast(s.data()), s.size_bytes()}; +} + +template struct Defer { + explicit Defer(F &&f) noexcept(std::is_nothrow_constructible_v) + : f(std::forward(f)) {} + ~Defer() { f(); } + + Defer(Defer &&o) = delete; + Defer(const Defer &) = delete; + Defer &operator=(const Defer &) = delete; + Defer &operator=(Defer &&) = delete; + + F f; +}; + +template [[nodiscard]] Defer> defer(F &&f) { + return Defer>(std::forward(f)); +} + +template constexpr size_t array_size(T (&)[N]) { + return N; +} + +template constexpr size_t str_size(T (&)[N]) { + return N - 1; +} + +// User-defined literals for K, M, and G (powers of 1024) + +constexpr unsigned long long operator""_k(unsigned long long k) { + return k * 1024; +} + +constexpr unsigned long long operator""_m(unsigned long long m) { + return m * 1024 * 1024; +} + +constexpr unsigned long long operator""_g(unsigned long long g) { + return g * 1024 * 1024 * 1024; +} + +template +[[nodiscard]] std::span +as_writable_uint8_span(std::span s) noexcept { + return std::span{ + reinterpret_cast(s.data()), s.size_bytes()}; +} + +template +requires(std::ranges::contiguous_range && std::ranges::sized_range && + std::ranges::borrowed_range && + !std::is_array_v> && + sizeof(std::ranges::range_value_t) == + sizeof(std::string_view::value_type)) +[[nodiscard]] std::string_view as_string_view(R &&r) { + return std::string_view{ + reinterpret_cast(std::ranges::data(r)), + std::ranges::size(r)}; +} + +#endif // !defined(TEMPLATE_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tests/README.rst b/deps/ngtcp2/ngtcp2/examples/tests/README.rst new file mode 100644 index 000000000000..1c5915231180 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tests/README.rst @@ -0,0 +1,60 @@ +Examples Tests +============== + +This is a ``pytest`` suite intended to verify interoperability between +the different example clients and servers built. + +You run it by executing ``pytest`` on top level project dir or in +the examples/tests directory. + +.. code-block:: text + + examples/test> pytest + ngtcp2-examples: [0.9.0-DEV, crypto_libs=['quictls', 'wolfssl']] + ... + +Requirements +------------ + +You need a Python3 (3.8 is probably sufficient), ``pytest`` and the +Python ``cryptography`` module installed. + +Usage +----- + +If you run ``pytest`` without arguments, it will print the test suite +and a ``.`` for every test case passed. Add ``-v`` and all test cases +will be listed in the full name. Adding several ``v`` will increase the +logging level on failure output. + +The name of test cases include the crypto libs of the server and client +used. For example: + +.. code-block:: text + + test_01_handshake.py::TestHandshake::test_01_01_get[quictls-quictls] PASSED [ 16%] + test_01_handshake.py::TestHandshake::test_01_01_get[quictls-wolfssl] PASSED + +Here, ``test_01_01`` is run first with the quictls server and client and then +with the quictls server and wolfSSL client. By default, the test suite runs +all combinations of servers and clients that have been configured in the project. + +To track down problems, you can restrict the test cases that are run by +matching patterns: + +.. code-block:: text + + # only tests with wolfSSL example server + > pytest -v -k 'wolfssl-' + # only tests with wolfSSL example client + > pytest -v -k 'test and -wolfssl' + # tests with a specific combination + > pytest -v -k 'quictls-wolfssl' + + +Analysing +--------- + +To make analysis of a broken test case easier, you best run only that +test case. Use ``pytest -vv`` (or more) to get more verbose logging. +Inspect server and client log files in ``examples/tests/gen``. diff --git a/deps/ngtcp2/ngtcp2/examples/tests/__init__.py b/deps/ngtcp2/ngtcp2/examples/tests/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/deps/ngtcp2/ngtcp2/examples/tests/conftest.py b/deps/ngtcp2/ngtcp2/examples/tests/conftest.py new file mode 100644 index 000000000000..a566ff028fa5 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tests/conftest.py @@ -0,0 +1,28 @@ +import logging +import pytest + +from .ngtcp2test import Env + + +@pytest.mark.usefixtures("env") +def pytest_report_header(config): + env = Env() + return [ + f"ngtcp2-examples: [{env.version}, crypto_libs={env.crypto_libs}]", + f"example clients: {env.clients}", + f"example servers: {env.servers}", + ] + + +@pytest.fixture(scope="package") +def env(pytestconfig) -> Env: + console = logging.StreamHandler() + console.setFormatter(logging.Formatter('%(levelname)s: %(message)s')) + logging.getLogger('').addHandler(console) + env = Env(pytestconfig=pytestconfig) + level = logging.DEBUG if env.verbose > 0 else logging.INFO + console.setLevel(level) + logging.getLogger('').setLevel(level=level) + env.setup() + + return env diff --git a/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/__init__.py b/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/__init__.py new file mode 100644 index 000000000000..65c61d852983 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/__init__.py @@ -0,0 +1,6 @@ +from .env import Env, CryptoLib +from .log import LogFile +from .client import ExampleClient, ClientRun +from .server import ExampleServer, ServerRun +from .certs import Ngtcp2TestCA, Credentials +from .tls import HandShake, HSRecord diff --git a/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/certs.py b/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/certs.py new file mode 100644 index 000000000000..3ab6260ec358 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/certs.py @@ -0,0 +1,476 @@ +import os +import re +from datetime import timedelta, datetime +from typing import List, Any, Optional + +from cryptography import x509 +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.asymmetric import ec, rsa +from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurvePrivateKey +from cryptography.hazmat.primitives.asymmetric.rsa import RSAPrivateKey +from cryptography.hazmat.primitives.serialization import Encoding, PrivateFormat, NoEncryption, load_pem_private_key +from cryptography.x509 import ExtendedKeyUsageOID, NameOID + + +EC_SUPPORTED = {} +EC_SUPPORTED.update([(curve.name.upper(), curve) for curve in [ + ec.SECP192R1, + ec.SECP224R1, + ec.SECP256R1, + ec.SECP384R1, +]]) + + +def _private_key(key_type): + if isinstance(key_type, str): + key_type = key_type.upper() + m = re.match(r'^(RSA)?(\d+)$', key_type) + if m: + key_type = int(m.group(2)) + + if isinstance(key_type, int): + return rsa.generate_private_key( + public_exponent=65537, + key_size=key_type, + backend=default_backend() + ) + if not isinstance(key_type, ec.EllipticCurve) and key_type in EC_SUPPORTED: + key_type = EC_SUPPORTED[key_type] + return ec.generate_private_key( + curve=key_type, + backend=default_backend() + ) + + +class CertificateSpec: + + def __init__(self, name: str = None, domains: List[str] = None, + email: str = None, + key_type: str = None, single_file: bool = False, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + client: bool = False, + sub_specs: List['CertificateSpec'] = None): + self._name = name + self.domains = domains + self.client = client + self.email = email + self.key_type = key_type + self.single_file = single_file + self.valid_from = valid_from + self.valid_to = valid_to + self.sub_specs = sub_specs + + @property + def name(self) -> Optional[str]: + if self._name: + return self._name + elif self.domains: + return self.domains[0] + return None + + @property + def type(self) -> Optional[str]: + if self.domains and len(self.domains): + return "server" + elif self.client: + return "client" + elif self.name: + return "ca" + return None + + +class Credentials: + + def __init__(self, name: str, cert: Any, pkey: Any, issuer: 'Credentials' = None): + self._name = name + self._cert = cert + self._pkey = pkey + self._issuer = issuer + self._cert_file = None + self._pkey_file = None + self._store = None + + @property + def name(self) -> str: + return self._name + + @property + def subject(self) -> x509.Name: + return self._cert.subject + + @property + def key_type(self): + if isinstance(self._pkey, RSAPrivateKey): + return f"rsa{self._pkey.key_size}" + elif isinstance(self._pkey, EllipticCurvePrivateKey): + return f"{self._pkey.curve.name}" + else: + raise Exception(f"unknown key type: {self._pkey}") + + @property + def private_key(self) -> Any: + return self._pkey + + @property + def certificate(self) -> Any: + return self._cert + + @property + def cert_pem(self) -> bytes: + return self._cert.public_bytes(Encoding.PEM) + + @property + def pkey_pem(self) -> bytes: + return self._pkey.private_bytes( + Encoding.PEM, + PrivateFormat.TraditionalOpenSSL if self.key_type.startswith('rsa') else PrivateFormat.PKCS8, + NoEncryption()) + + @property + def issuer(self) -> Optional['Credentials']: + return self._issuer + + def set_store(self, store: 'CertStore'): + self._store = store + + def set_files(self, cert_file: str, pkey_file: str = None): + self._cert_file = cert_file + self._pkey_file = pkey_file + + @property + def cert_file(self) -> str: + return self._cert_file + + @property + def pkey_file(self) -> Optional[str]: + return self._pkey_file + + def get_first(self, name) -> Optional['Credentials']: + creds = self._store.get_credentials_for_name(name) if self._store else [] + return creds[0] if len(creds) else None + + def get_credentials_for_name(self, name) -> List['Credentials']: + return self._store.get_credentials_for_name(name) if self._store else [] + + def issue_certs(self, specs: List[CertificateSpec], + chain: List['Credentials'] = None) -> List['Credentials']: + return [self.issue_cert(spec=spec, chain=chain) for spec in specs] + + def issue_cert(self, spec: CertificateSpec, chain: List['Credentials'] = None) -> 'Credentials': + key_type = spec.key_type if spec.key_type else self.key_type + creds = None + if self._store: + creds = self._store.load_credentials( + name=spec.name, key_type=key_type, single_file=spec.single_file, issuer=self) + if creds is None: + creds = Ngtcp2TestCA.create_credentials(spec=spec, issuer=self, key_type=key_type, + valid_from=spec.valid_from, valid_to=spec.valid_to) + if self._store: + self._store.save(creds, single_file=spec.single_file) + if spec.type == "ca": + self._store.save_chain(creds, "ca", with_root=True) + + if spec.sub_specs: + if self._store: + sub_store = CertStore(fpath=os.path.join(self._store.path, creds.name)) + creds.set_store(sub_store) + subchain = chain.copy() if chain else [] + subchain.append(self) + creds.issue_certs(spec.sub_specs, chain=subchain) + return creds + + +class CertStore: + + def __init__(self, fpath: str): + self._store_dir = fpath + if not os.path.exists(self._store_dir): + os.makedirs(self._store_dir) + self._creds_by_name = {} + + @property + def path(self) -> str: + return self._store_dir + + def save(self, creds: Credentials, name: str = None, + chain: List[Credentials] = None, + single_file: bool = False) -> None: + name = name if name is not None else creds.name + cert_file = self.get_cert_file(name=name, key_type=creds.key_type) + pkey_file = self.get_pkey_file(name=name, key_type=creds.key_type) + if single_file: + pkey_file = None + with open(cert_file, "wb") as fd: + fd.write(creds.cert_pem) + if chain: + for c in chain: + fd.write(c.cert_pem) + if pkey_file is None: + fd.write(creds.pkey_pem) + if pkey_file is not None: + with open(pkey_file, "wb") as fd: + fd.write(creds.pkey_pem) + creds.set_files(cert_file, pkey_file) + self._add_credentials(name, creds) + + def save_chain(self, creds: Credentials, infix: str, with_root=False): + name = creds.name + chain = [creds] + while creds.issuer is not None: + creds = creds.issuer + chain.append(creds) + if not with_root and len(chain) > 1: + chain = chain[:-1] + chain_file = os.path.join(self._store_dir, f'{name}-{infix}.pem') + with open(chain_file, "wb") as fd: + for c in chain: + fd.write(c.cert_pem) + + def _add_credentials(self, name: str, creds: Credentials): + if name not in self._creds_by_name: + self._creds_by_name[name] = [] + self._creds_by_name[name].append(creds) + + def get_credentials_for_name(self, name) -> List[Credentials]: + return self._creds_by_name[name] if name in self._creds_by_name else [] + + def get_cert_file(self, name: str, key_type=None) -> str: + key_infix = ".{0}".format(key_type) if key_type is not None else "" + return os.path.join(self._store_dir, f'{name}{key_infix}.cert.pem') + + def get_pkey_file(self, name: str, key_type=None) -> str: + key_infix = ".{0}".format(key_type) if key_type is not None else "" + return os.path.join(self._store_dir, f'{name}{key_infix}.pkey.pem') + + def load_pem_cert(self, fpath: str) -> x509.Certificate: + with open(fpath) as fd: + return x509.load_pem_x509_certificate("".join(fd.readlines()).encode()) + + def load_pem_pkey(self, fpath: str): + with open(fpath) as fd: + return load_pem_private_key("".join(fd.readlines()).encode(), password=None) + + def load_credentials(self, name: str, key_type=None, single_file: bool = False, issuer: Credentials = None): + cert_file = self.get_cert_file(name=name, key_type=key_type) + pkey_file = cert_file if single_file else self.get_pkey_file(name=name, key_type=key_type) + if os.path.isfile(cert_file) and os.path.isfile(pkey_file): + cert = self.load_pem_cert(cert_file) + pkey = self.load_pem_pkey(pkey_file) + creds = Credentials(name=name, cert=cert, pkey=pkey, issuer=issuer) + creds.set_store(self) + creds.set_files(cert_file, pkey_file) + self._add_credentials(name, creds) + return creds + return None + + +class Ngtcp2TestCA: + + @classmethod + def create_root(cls, name: str, store_dir: str, key_type: str = "rsa2048") -> Credentials: + store = CertStore(fpath=store_dir) + creds = store.load_credentials(name="ca", key_type=key_type, issuer=None) + if creds is None: + creds = Ngtcp2TestCA._make_ca_credentials(name=name, key_type=key_type) + store.save(creds, name="ca") + creds.set_store(store) + return creds + + @staticmethod + def create_credentials(spec: CertificateSpec, issuer: Credentials, key_type: Any, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + ) -> Credentials: + """Create a certificate signed by this CA for the given domains. + :returns: the certificate and private key PEM file paths + """ + if spec.domains and len(spec.domains): + creds = Ngtcp2TestCA._make_server_credentials(name=spec.name, domains=spec.domains, + issuer=issuer, valid_from=valid_from, + valid_to=valid_to, key_type=key_type) + elif spec.client: + creds = Ngtcp2TestCA._make_client_credentials(name=spec.name, issuer=issuer, + email=spec.email, valid_from=valid_from, + valid_to=valid_to, key_type=key_type) + elif spec.name: + creds = Ngtcp2TestCA._make_ca_credentials(name=spec.name, issuer=issuer, + valid_from=valid_from, valid_to=valid_to, + key_type=key_type) + else: + raise Exception(f"unrecognized certificate specification: {spec}") + return creds + + @staticmethod + def _make_x509_name(org_name: str = None, common_name: str = None, parent: x509.Name = None) -> x509.Name: + name_pieces = [] + if org_name: + oid = NameOID.ORGANIZATIONAL_UNIT_NAME if parent else NameOID.ORGANIZATION_NAME + name_pieces.append(x509.NameAttribute(oid, org_name)) + elif common_name: + name_pieces.append(x509.NameAttribute(NameOID.COMMON_NAME, common_name)) + if parent: + name_pieces.extend([rdn for rdn in parent]) + return x509.Name(name_pieces) + + @staticmethod + def _make_csr( + subject: x509.Name, + pkey: Any, + issuer_subject: Optional[Credentials], + valid_from_delta: timedelta = None, + valid_until_delta: timedelta = None + ): + pubkey = pkey.public_key() + issuer_subject = issuer_subject if issuer_subject is not None else subject + + valid_from = datetime.now() + if valid_until_delta is not None: + valid_from += valid_from_delta + valid_until = datetime.now() + if valid_until_delta is not None: + valid_until += valid_until_delta + + return ( + x509.CertificateBuilder() + .subject_name(subject) + .issuer_name(issuer_subject) + .public_key(pubkey) + .not_valid_before(valid_from) + .not_valid_after(valid_until) + .serial_number(x509.random_serial_number()) + .add_extension( + x509.SubjectKeyIdentifier.from_public_key(pubkey), + critical=False, + ) + ) + + @staticmethod + def _add_ca_usages(csr: Any) -> Any: + return csr.add_extension( + x509.BasicConstraints(ca=True, path_length=9), + critical=True, + ).add_extension( + x509.KeyUsage( + digital_signature=True, + content_commitment=False, + key_encipherment=False, + data_encipherment=False, + key_agreement=False, + key_cert_sign=True, + crl_sign=True, + encipher_only=False, + decipher_only=False), + critical=True + ).add_extension( + x509.ExtendedKeyUsage([ + ExtendedKeyUsageOID.CLIENT_AUTH, + ExtendedKeyUsageOID.SERVER_AUTH, + ExtendedKeyUsageOID.CODE_SIGNING, + ]), + critical=True + ) + + @staticmethod + def _add_leaf_usages(csr: Any, domains: List[str], issuer: Credentials) -> Any: + return csr.add_extension( + x509.BasicConstraints(ca=False, path_length=None), + critical=True, + ).add_extension( + x509.AuthorityKeyIdentifier.from_issuer_subject_key_identifier( + issuer.certificate.extensions.get_extension_for_class( + x509.SubjectKeyIdentifier).value), + critical=False + ).add_extension( + x509.SubjectAlternativeName([x509.DNSName(domain) for domain in domains]), + critical=True, + ).add_extension( + x509.ExtendedKeyUsage([ + ExtendedKeyUsageOID.SERVER_AUTH, + ]), + critical=True + ) + + @staticmethod + def _add_client_usages(csr: Any, issuer: Credentials, rfc82name: str = None) -> Any: + cert = csr.add_extension( + x509.BasicConstraints(ca=False, path_length=None), + critical=True, + ).add_extension( + x509.AuthorityKeyIdentifier.from_issuer_subject_key_identifier( + issuer.certificate.extensions.get_extension_for_class( + x509.SubjectKeyIdentifier).value), + critical=False + ) + if rfc82name: + cert.add_extension( + x509.SubjectAlternativeName([x509.RFC822Name(rfc82name)]), + critical=True, + ) + cert.add_extension( + x509.ExtendedKeyUsage([ + ExtendedKeyUsageOID.CLIENT_AUTH, + ]), + critical=True + ) + return cert + + @staticmethod + def _make_ca_credentials(name, key_type: Any, + issuer: Credentials = None, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + ) -> Credentials: + pkey = _private_key(key_type=key_type) + if issuer is not None: + issuer_subject = issuer.certificate.subject + issuer_key = issuer.private_key + else: + issuer_subject = None + issuer_key = pkey + subject = Ngtcp2TestCA._make_x509_name(org_name=name, parent=issuer.subject if issuer else None) + csr = Ngtcp2TestCA._make_csr(subject=subject, + issuer_subject=issuer_subject, pkey=pkey, + valid_from_delta=valid_from, valid_until_delta=valid_to) + csr = Ngtcp2TestCA._add_ca_usages(csr) + cert = csr.sign(private_key=issuer_key, + algorithm=hashes.SHA256(), + backend=default_backend()) + return Credentials(name=name, cert=cert, pkey=pkey, issuer=issuer) + + @staticmethod + def _make_server_credentials(name: str, domains: List[str], issuer: Credentials, + key_type: Any, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + ) -> Credentials: + name = name + pkey = _private_key(key_type=key_type) + subject = Ngtcp2TestCA._make_x509_name(common_name=name, parent=issuer.subject) + csr = Ngtcp2TestCA._make_csr(subject=subject, + issuer_subject=issuer.certificate.subject, pkey=pkey, + valid_from_delta=valid_from, valid_until_delta=valid_to) + csr = Ngtcp2TestCA._add_leaf_usages(csr, domains=domains, issuer=issuer) + cert = csr.sign(private_key=issuer.private_key, + algorithm=hashes.SHA256(), + backend=default_backend()) + return Credentials(name=name, cert=cert, pkey=pkey, issuer=issuer) + + @staticmethod + def _make_client_credentials(name: str, + issuer: Credentials, email: Optional[str], + key_type: Any, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + ) -> Credentials: + pkey = _private_key(key_type=key_type) + subject = Ngtcp2TestCA._make_x509_name(common_name=name, parent=issuer.subject) + csr = Ngtcp2TestCA._make_csr(subject=subject, + issuer_subject=issuer.certificate.subject, pkey=pkey, + valid_from_delta=valid_from, valid_until_delta=valid_to) + csr = Ngtcp2TestCA._add_client_usages(csr, issuer=issuer, rfc82name=email) + cert = csr.sign(private_key=issuer.private_key, + algorithm=hashes.SHA256(), + backend=default_backend()) + return Credentials(name=name, cert=cert, pkey=pkey, issuer=issuer) diff --git a/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/client.py b/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/client.py new file mode 100644 index 000000000000..c22f661a7828 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/client.py @@ -0,0 +1,187 @@ +import logging +import os +import re +import subprocess +from typing import List + +import pytest + +from .server import ExampleServer, ServerRun +from .certs import Credentials +from .tls import HandShake, HSRecord +from .env import Env, CryptoLib +from .log import LogFile, HexDumpScanner + + +log = logging.getLogger(__name__) + + +class ClientRun: + + def __init__(self, env: Env, returncode, logfile: LogFile, srun: ServerRun): + self.env = env + self.returncode = returncode + self.logfile = logfile + self.log_lines = logfile.get_recent() + self._data_recs = None + self._hs_recs = None + self._srun = srun + if self.env.verbose > 1: + log.debug(f'read {len(self.log_lines)} lines from {logfile.path}') + + @property + def handshake(self) -> List[HSRecord]: + if self._data_recs is None: + crypto_line = re.compile(r'Ordered CRYPTO data in \S+ crypto level') + scanner = HexDumpScanner(source=self.log_lines, + leading_regex=crypto_line) + self._data_recs = [data for data in scanner] + if self.env.verbose > 1: + log.debug(f'detected {len(self._data_recs)} crypto hexdumps ' + f'in {self.logfile.path}') + if self._hs_recs is None: + self._hs_recs = [hrec for hrec in HandShake(source=self._data_recs, + verbose=self.env.verbose)] + if self.env.verbose > 1: + log.debug(f'detected {len(self._hs_recs)} crypto ' + f'records in {self.logfile.path}') + return self._hs_recs + + @property + def hs_stripe(self) -> str: + return ":".join([hrec.name for hrec in self.handshake]) + + @property + def early_data_rejected(self) -> bool: + for l in self.log_lines: + if re.match(r'^Early data was rejected by server.*', l): + return True + return False + + @property + def server(self) -> ServerRun: + return self._srun + + def norm_exp(self, c_hs, s_hs, allow_hello_retry=True): + if allow_hello_retry and self.hs_stripe.startswith('HelloRetryRequest:'): + c_hs = "HelloRetryRequest:" + c_hs + s_hs = "ClientHello:" + s_hs + return c_hs, s_hs + + def _assert_hs(self, c_hs, s_hs): + if re.match('^'+c_hs, self.hs_stripe) is None: + # what happened? + if self.hs_stripe == '': + # server send nothing + if self.server.hs_stripe == '': + # client send nothing + pytest.fail(f'client did not send a ClientHello"') + else: + # client send sth, but server did not respond + pytest.fail(f'server did not respond to ClientHello: ' + f'{self.server.handshake[0].to_text()}"') + else: + pytest.fail(f'Expected "{c_hs}", got "{self.hs_stripe}"') + assert re.match('^'+s_hs+'$', self.server.hs_stripe) is not None, \ + f'Expected "{s_hs}", got "{self.server.hs_stripe}"\n' + + def assert_non_resume_handshake(self, allow_hello_retry=True): + # for client/server where KEY_SHARE do not match, the hello is retried + c_hs, s_hs = self.norm_exp( + "ServerHello:EncryptedExtensions:(Compressed)?Certificate:CertificateVerify:Finished", + "ClientHello:Finished", allow_hello_retry=allow_hello_retry) + self._assert_hs(c_hs, s_hs) + + def assert_resume_handshake(self): + # for client/server where KEY_SHARE do not match, the hello is retried + c_hs, s_hs = self.norm_exp("ServerHello:EncryptedExtensions:Finished", + "ClientHello:Finished") + self._assert_hs(c_hs, s_hs) + + def assert_verify_null_handshake(self): + c_hs, s_hs = self.norm_exp( + "ServerHello:EncryptedExtensions:CertificateRequest:(Compressed)?Certificate:CertificateVerify:Finished", + "ClientHello:Certificate:Finished") + self._assert_hs(c_hs, s_hs) + + def assert_verify_cert_handshake(self): + c_hs, s_hs = self.norm_exp( + "ServerHello:EncryptedExtensions:CertificateRequest:(Compressed)?Certificate:CertificateVerify:Finished", + "ClientHello:Certificate:CertificateVerify:Finished") + self._assert_hs(c_hs, s_hs) + + +class ExampleClient: + + def __init__(self, env: Env, crypto_lib: str): + self.env = env + self._crypto_lib = crypto_lib + self._path = env.client_path(self._crypto_lib) + self._log_path = f'{self.env.gen_dir}/{self._crypto_lib}-client.log' + self._qlog_path = f'{self.env.gen_dir}/{self._crypto_lib}-client.qlog' + self._session_path = f'{self.env.gen_dir}/{self._crypto_lib}-client.session' + self._tp_path = f'{self.env.gen_dir}/{self._crypto_lib}-client.tp' + self._data_path = f'{self.env.gen_dir}/{self._crypto_lib}-client.data' + + @property + def path(self): + return self._path + + @property + def crypto_lib(self): + return self._crypto_lib + + @property + def uses_cipher_config(self): + return CryptoLib.uses_cipher_config(self.crypto_lib) + + def supports_cipher(self, cipher): + return CryptoLib.supports_cipher(self.crypto_lib, cipher) + + def exists(self): + return os.path.isfile(self.path) + + def clear_session(self): + if os.path.isfile(self._session_path): + os.remove(self._session_path) + if os.path.isfile(self._tp_path): + os.remove(self._tp_path) + + def http_get(self, server: ExampleServer, url: str, extra_args: List[str] = None, + use_session=False, data=None, + credentials: Credentials = None, + ciphers: str = None): + args = [ + self.path, '--exit-on-all-streams-close', + f'--qlog-file={self._qlog_path}' + ] + if use_session: + args.append(f'--session-file={self._session_path}') + args.append(f'--tp-file={self._tp_path}') + if data is not None: + with open(self._data_path, 'w') as fd: + fd.write(data) + args.append(f'--data={self._data_path}') + if ciphers is not None: + ciphers = CryptoLib.adjust_ciphers(self.crypto_lib, ciphers) + args.append(f'--ciphers={ciphers}') + if credentials is not None: + args.append(f'--key={credentials.pkey_file}') + args.append(f'--cert={credentials.cert_file}') + if extra_args is not None: + args.extend(extra_args) + args.extend([ + 'localhost', str(self.env.examples_port), + url + ]) + if os.path.isfile(self._qlog_path): + os.remove(self._qlog_path) + with open(self._log_path, 'w') as log_file: + logfile = LogFile(path=self._log_path) + server.log.advance() + process = subprocess.Popen(args=args, text=True, + stdout=log_file, stderr=log_file) + process.wait() + return ClientRun(env=self.env, returncode=process.returncode, + logfile=logfile, srun=server.get_run()) + diff --git a/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/env.py b/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/env.py new file mode 100644 index 000000000000..9699d552cc5b --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/env.py @@ -0,0 +1,191 @@ +import logging +import os +from configparser import ConfigParser, ExtendedInterpolation +from typing import Dict, Optional + +from .certs import CertificateSpec, Ngtcp2TestCA, Credentials + +log = logging.getLogger(__name__) + + +class CryptoLib: + + IGNORES_CIPHER_CONFIG = [ + 'picotls', 'boringssl' + ] + UNSUPPORTED_CIPHERS = { + 'wolfssl': [ + 'TLS_AES_128_CCM_SHA256', # no plans to + ], + 'picotls': [ + 'TLS_AES_128_CCM_SHA256', # no plans to + ], + 'boringssl': [ + 'TLS_AES_128_CCM_SHA256', # no plans to + ] + } + GNUTLS_CIPHERS = { + 'TLS_AES_128_GCM_SHA256': 'AES-128-GCM', + 'TLS_AES_256_GCM_SHA384': 'AES-256-GCM', + 'TLS_CHACHA20_POLY1305_SHA256': 'CHACHA20-POLY1305', + 'TLS_AES_128_CCM_SHA256': 'AES-128-CCM', + } + + @classmethod + def uses_cipher_config(cls, crypto_lib): + return crypto_lib not in cls.IGNORES_CIPHER_CONFIG + + @classmethod + def supports_cipher(cls, crypto_lib, cipher): + return crypto_lib not in cls.UNSUPPORTED_CIPHERS or \ + cipher not in cls.UNSUPPORTED_CIPHERS[crypto_lib] + + @classmethod + def adjust_ciphers(cls, crypto_lib, ciphers: str) -> str: + if crypto_lib == 'gnutls': + gciphers = "NORMAL:-VERS-ALL:+VERS-TLS1.3:-CIPHER-ALL" + for cipher in ciphers.split(':'): + gciphers += f':+{cls.GNUTLS_CIPHERS[cipher]}' + return gciphers + return ciphers + + +def init_config_from(conf_path): + if os.path.isfile(conf_path): + config = ConfigParser(interpolation=ExtendedInterpolation()) + config.read(conf_path) + return config + return None + + +TESTS_PATH = os.path.dirname(os.path.dirname(__file__)) +EXAMPLES_PATH = os.path.dirname(TESTS_PATH) +DEF_CONFIG = init_config_from(os.path.join(TESTS_PATH, 'config.ini')) + + +class Env: + + @classmethod + def get_crypto_libs(cls, configurable_ciphers=None): + names = [name for name in DEF_CONFIG['examples'] + if DEF_CONFIG['examples'][name] == 'yes'] + if configurable_ciphers is not None: + names = [n for n in names if CryptoLib.uses_cipher_config(n)] + return names + + def __init__(self, examples_dir=None, tests_dir=None, config=None, + pytestconfig=None): + self._verbose = pytestconfig.option.verbose if pytestconfig is not None else 0 + self._examples_dir = examples_dir if examples_dir is not None else EXAMPLES_PATH + self._tests_dir = examples_dir if tests_dir is not None else TESTS_PATH + self._gen_dir = os.path.join(self._tests_dir, 'gen') + self.config = config if config is not None else DEF_CONFIG + self._version = self.config['ngtcp2']['version'] + self._crypto_libs = [name for name in self.config['examples'] + if self.config['examples'][name] == 'yes'] + self._clients = [self.config['clients'][lib] for lib in self._crypto_libs + if lib in self.config['clients']] + self._servers = [self.config['servers'][lib] for lib in self._crypto_libs + if lib in self.config['servers']] + self._examples_pem = { + 'key': 'xxx', + 'cert': 'xxx', + } + self._htdocs_dir = os.path.join(self._gen_dir, 'htdocs') + self._tld = 'tests.ngtcp2.nghttp2.org' + self._example_domain = f"one.{self._tld}" + self._ca = None + self._cert_specs = [ + CertificateSpec(domains=[self._example_domain], key_type='rsa2048'), + CertificateSpec(name="clientsX", sub_specs=[ + CertificateSpec(name="user1", client=True), + ]), + ] + + def issue_certs(self): + if self._ca is None: + self._ca = Ngtcp2TestCA.create_root(name=self._tld, + store_dir=os.path.join(self.gen_dir, 'ca'), + key_type="rsa2048") + self._ca.issue_certs(self._cert_specs) + + def setup(self): + os.makedirs(self._gen_dir, exist_ok=True) + os.makedirs(self._htdocs_dir, exist_ok=True) + self.issue_certs() + + def get_server_credentials(self) -> Optional[Credentials]: + creds = self.ca.get_credentials_for_name(self._example_domain) + if len(creds) > 0: + return creds[0] + return None + + @property + def verbose(self) -> int: + return self._verbose + + @property + def version(self) -> str: + return self._version + + @property + def gen_dir(self) -> str: + return self._gen_dir + + @property + def ca(self): + return self._ca + + @property + def htdocs_dir(self) -> str: + return self._htdocs_dir + + @property + def example_domain(self) -> str: + return self._example_domain + + @property + def examples_dir(self) -> str: + return self._examples_dir + + @property + def examples_port(self) -> int: + return int(self.config['examples']['port']) + + @property + def examples_pem(self) -> Dict[str, str]: + return self._examples_pem + + @property + def crypto_libs(self): + return self._crypto_libs + + @property + def clients(self): + return self._clients + + @property + def servers(self): + return self._servers + + def client_name(self, crypto_lib): + if crypto_lib in self.config['clients']: + return self.config['clients'][crypto_lib] + return None + + def client_path(self, crypto_lib): + cname = self.client_name(crypto_lib) + if cname is not None: + return os.path.join(self.examples_dir, cname) + return None + + def server_name(self, crypto_lib): + if crypto_lib in self.config['servers']: + return self.config['servers'][crypto_lib] + return None + + def server_path(self, crypto_lib): + sname = self.server_name(crypto_lib) + if sname is not None: + return os.path.join(self.examples_dir, sname) + return None diff --git a/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/log.py b/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/log.py new file mode 100644 index 000000000000..9e8f39945ddb --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/log.py @@ -0,0 +1,101 @@ +import binascii +import os +import re +import sys +import time +from datetime import timedelta, datetime +from io import SEEK_END +from typing import List + + +class LogFile: + + def __init__(self, path: str): + self._path = path + self._start_pos = 0 + self._last_pos = self._start_pos + + @property + def path(self) -> str: + return self._path + + def reset(self): + self._start_pos = 0 + self._last_pos = self._start_pos + + def advance(self) -> None: + if os.path.isfile(self._path): + with open(self._path) as fd: + self._start_pos = fd.seek(0, SEEK_END) + + def get_recent(self, advance=True) -> List[str]: + lines = [] + if os.path.isfile(self._path): + with open(self._path) as fd: + fd.seek(self._last_pos, os.SEEK_SET) + for line in fd: + lines.append(line) + if advance: + self._last_pos = fd.tell() + return lines + + def scan_recent(self, pattern: re, timeout=10) -> bool: + if not os.path.isfile(self.path): + return False + with open(self.path) as fd: + end = datetime.now() + timedelta(seconds=timeout) + while True: + fd.seek(self._last_pos, os.SEEK_SET) + for line in fd: + if pattern.match(line): + return True + if datetime.now() > end: + raise TimeoutError(f"pattern not found in error log after {timeout} seconds") + time.sleep(.1) + return False + + +class HexDumpScanner: + + def __init__(self, source, leading_regex=None): + self._source = source + self._leading_regex = leading_regex + + def __iter__(self): + data = b'' + offset = 0 if self._leading_regex is None else -1 + idx = 0 + for l in self._source: + if offset == -1: + pass + elif offset == 0: + # possible start of a hex dump + m = re.match(r'^\s*0+(\s+-)?((\s+[0-9a-f]{2}){1,16})(\s+.*)$', + l, re.IGNORECASE) + if m: + data = binascii.unhexlify(re.sub(r'\s+', '', m.group(2))) + offset = 16 + idx = 1 + continue + else: + # possible continuation of a hexdump + m = re.match(r'^\s*([0-9a-f]+)(\s+-)?((\s+[0-9a-f]{2}){1,16})' + r'(\s+.*)$', l, re.IGNORECASE) + if m: + loffset = int(m.group(1), 16) + if loffset == offset or loffset == idx: + data += binascii.unhexlify(re.sub(r'\s+', '', + m.group(3))) + offset += 16 + idx += 1 + continue + else: + sys.stderr.write(f'wrong offset {loffset}, expected {offset} or {idx}\n') + # not a hexdump line, produce any collected data + if len(data) > 0: + yield data + data = b'' + offset = 0 if self._leading_regex is None \ + or self._leading_regex.match(l) else -1 + if len(data) > 0: + yield data diff --git a/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/server.py b/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/server.py new file mode 100644 index 000000000000..9f4e9a03f8ee --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/server.py @@ -0,0 +1,137 @@ +import logging +import os +import re +import subprocess +import time +from datetime import datetime, timedelta +from threading import Thread + +from .tls import HandShake +from .env import Env, CryptoLib +from .log import LogFile, HexDumpScanner + + +log = logging.getLogger(__name__) + + +class ServerRun: + + def __init__(self, env: Env, logfile: LogFile): + self.env = env + self._logfile = logfile + self.log_lines = self._logfile.get_recent() + self._data_recs = None + self._hs_recs = None + if self.env.verbose > 1: + log.debug(f'read {len(self.log_lines)} lines from {logfile.path}') + + @property + def handshake(self): + if self._data_recs is None: + self._data_recs = [data for data in HexDumpScanner(source=self.log_lines)] + if self.env.verbose > 1: + log.debug(f'detected {len(self._data_recs)} hexdumps ' + f'in {self._logfile.path}') + if self._hs_recs is None: + self._hs_recs = [hrec for hrec in HandShake(source=self._data_recs, + verbose=self.env.verbose)] + if self.env.verbose > 1: + log.debug(f'detected {len(self._hs_recs)} crypto records ' + f'in {self._logfile.path}') + return self._hs_recs + + @property + def hs_stripe(self): + return ":".join([hrec.name for hrec in self.handshake]) + + +def monitor_proc(env: Env, proc): + _env = env + proc.wait() + + +class ExampleServer: + + def __init__(self, env: Env, crypto_lib: str, verify_client=False): + self.env = env + self._crypto_lib = crypto_lib + self._path = env.server_path(self._crypto_lib) + self._logpath = f'{self.env.gen_dir}/{self._crypto_lib}-server.log' + self._log = LogFile(path=self._logpath) + self._logfile = None + self._process = None + self._verify_client = verify_client + + @property + def path(self): + return self._path + + @property + def crypto_lib(self): + return self._crypto_lib + + @property + def uses_cipher_config(self): + return CryptoLib.uses_cipher_config(self.crypto_lib) + + def supports_cipher(self, cipher): + return CryptoLib.supports_cipher(self.crypto_lib, cipher) + + @property + def log(self): + return self._log + + def exists(self): + return os.path.isfile(self.path) + + def start(self): + if self._process is not None: + return False + creds = self.env.get_server_credentials() + assert creds + args = [ + self.path, + f'--htdocs={self.env.htdocs_dir}', + ] + if self._verify_client: + args.append('--verify-client') + args.extend([ + '*', str(self.env.examples_port), + creds.pkey_file, creds.cert_file + ]) + self._logfile = open(self._logpath, 'w') + self._process = subprocess.Popen(args=args, text=True, + stdout=self._logfile, stderr=self._logfile) + t = Thread(target=monitor_proc, daemon=True, args=(self.env, self._process)) + t.start() + timeout = 5 + end = datetime.now() + timedelta(seconds=timeout) + while True: + if self._process.poll(): + return False + try: + if self.log.scan_recent(pattern=re.compile(r'^Using document root'), timeout=0.5): + break + except TimeoutError: + pass + if datetime.now() > end: + raise TimeoutError(f"pattern not found in error log after {timeout} seconds") + self.log.advance() + return True + + def stop(self): + if self._process: + self._process.terminate() + self._process = None + if self._logfile: + self._logfile.close() + self._logfile = None + return True + + def restart(self): + self.stop() + self._log.reset() + return self.start() + + def get_run(self) -> ServerRun: + return ServerRun(env=self.env, logfile=self.log) diff --git a/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/tls.py b/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/tls.py new file mode 100644 index 000000000000..414b94d38e5f --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tests/ngtcp2test/tls.py @@ -0,0 +1,983 @@ +import binascii +import logging +import sys +from collections.abc import Iterator +from typing import Dict, Any, Iterable + + +log = logging.getLogger(__name__) + + +class ParseError(Exception): + pass + +def _get_int(d, n): + if len(d) < n: + raise ParseError(f'get_int: {n} bytes needed, but data is {d}') + if n == 1: + dlen = d[0] + else: + dlen = int.from_bytes(d[0:n], byteorder='big') + return d[n:], dlen + + +def _get_field(d, dlen): + if dlen > 0: + if len(d) < dlen: + raise ParseError(f'field len={dlen}, but data len={len(d)}') + field = d[0:dlen] + return d[dlen:], field + return d, b'' + + +def _get_len_field(d, n): + d, dlen = _get_int(d, n) + return _get_field(d, dlen) + + +# d are bytes that start with a quic variable length integer +def _get_qint(d): + i = d[0] & 0xc0 + if i == 0: + return d[1:], int(d[0]) + elif i == 0x40: + ndata = bytearray(d[0:2]) + d = d[2:] + ndata[0] = ndata[0] & ~0xc0 + return d, int.from_bytes(ndata, byteorder='big') + elif i == 0x80: + ndata = bytearray(d[0:4]) + d = d[4:] + ndata[0] = ndata[0] & ~0xc0 + return d, int.from_bytes(ndata, byteorder='big') + else: + ndata = bytearray(d[0:8]) + d = d[8:] + ndata[0] = ndata[0] & ~0xc0 + return d, int.from_bytes(ndata, byteorder='big') + + +class TlsSupportedGroups: + NAME_BY_ID = { + 0: 'Reserved', + 1: 'sect163k1', + 2: 'sect163r1', + 3: 'sect163r2', + 4: 'sect193r1', + 5: 'sect193r2', + 6: 'sect233k1', + 7: 'sect233r1', + 8: 'sect239k1', + 9: 'sect283k1', + 10: 'sect283r1', + 11: 'sect409k1', + 12: 'sect409r1', + 13: 'sect571k1', + 14: 'sect571r1', + 15: 'secp160k1', + 16: 'secp160r1', + 17: 'secp160r2', + 18: 'secp192k1', + 19: 'secp192r1', + 20: 'secp224k1', + 21: 'secp224r1', + 22: 'secp256k1', + 23: 'secp256r1', + 24: 'secp384r1', + 25: 'secp521r1', + 26: 'brainpoolP256r1', + 27: 'brainpoolP384r1', + 28: 'brainpoolP512r1', + 29: 'x25519', + 30: 'x448', + 31: 'brainpoolP256r1tls13', + 32: 'brainpoolP384r1tls13', + 33: 'brainpoolP512r1tls13', + 34: 'GC256A', + 35: 'GC256B', + 36: 'GC256C', + 37: 'GC256D', + 38: 'GC512A', + 39: 'GC512B', + 40: 'GC512C', + 41: 'curveSM2', + } + + @classmethod + def name(cls, gid): + if gid in cls.NAME_BY_ID: + return f'{cls.NAME_BY_ID[gid]}(0x{gid:0x})' + return f'0x{gid:0x}' + + +class TlsSignatureScheme: + NAME_BY_ID = { + 0x0201: 'rsa_pkcs1_sha1', + 0x0202: 'Reserved', + 0x0203: 'ecdsa_sha1', + 0x0401: 'rsa_pkcs1_sha256', + 0x0403: 'ecdsa_secp256r1_sha256', + 0x0420: 'rsa_pkcs1_sha256_legacy', + 0x0501: 'rsa_pkcs1_sha384', + 0x0503: 'ecdsa_secp384r1_sha384', + 0x0520: 'rsa_pkcs1_sha384_legacy', + 0x0601: 'rsa_pkcs1_sha512', + 0x0603: 'ecdsa_secp521r1_sha512', + 0x0620: 'rsa_pkcs1_sha512_legacy', + 0x0704: 'eccsi_sha256', + 0x0705: 'iso_ibs1', + 0x0706: 'iso_ibs2', + 0x0707: 'iso_chinese_ibs', + 0x0708: 'sm2sig_sm3', + 0x0709: 'gostr34102012_256a', + 0x070A: 'gostr34102012_256b', + 0x070B: 'gostr34102012_256c', + 0x070C: 'gostr34102012_256d', + 0x070D: 'gostr34102012_512a', + 0x070E: 'gostr34102012_512b', + 0x070F: 'gostr34102012_512c', + 0x0804: 'rsa_pss_rsae_sha256', + 0x0805: 'rsa_pss_rsae_sha384', + 0x0806: 'rsa_pss_rsae_sha512', + 0x0807: 'ed25519', + 0x0808: 'ed448', + 0x0809: 'rsa_pss_pss_sha256', + 0x080A: 'rsa_pss_pss_sha384', + 0x080B: 'rsa_pss_pss_sha512', + 0x081A: 'ecdsa_brainpoolP256r1tls13_sha256', + 0x081B: 'ecdsa_brainpoolP384r1tls13_sha384', + 0x081C: 'ecdsa_brainpoolP512r1tls13_sha512', + } + + @classmethod + def name(cls, gid): + if gid in cls.NAME_BY_ID: + return f'{cls.NAME_BY_ID[gid]}(0x{gid:0x})' + return f'0x{gid:0x}' + + +class TlsCipherSuites: + NAME_BY_ID = { + 0x1301: 'TLS_AES_128_GCM_SHA256', + 0x1302: 'TLS_AES_256_GCM_SHA384', + 0x1303: 'TLS_CHACHA20_POLY1305_SHA256', + 0x1304: 'TLS_AES_128_CCM_SHA256', + 0x1305: 'TLS_AES_128_CCM_8_SHA256', + 0x00ff: 'TLS_EMPTY_RENEGOTIATION_INFO_SCSV', + } + + @classmethod + def name(cls, cid): + if cid in cls.NAME_BY_ID: + return f'{cls.NAME_BY_ID[cid]}(0x{cid:0x})' + return f'Cipher(0x{cid:0x})' + + +class PskKeyExchangeMode: + NAME_BY_ID = { + 0x00: 'psk_ke', + 0x01: 'psk_dhe_ke', + } + + @classmethod + def name(cls, gid): + if gid in cls.NAME_BY_ID: + return f'{cls.NAME_BY_ID[gid]}(0x{gid:0x})' + return f'0x{gid:0x}' + + +class QuicTransportParam: + NAME_BY_ID = { + 0x00: 'original_destination_connection_id', + 0x01: 'max_idle_timeout', + 0x02: 'stateless_reset_token', + 0x03: 'max_udp_payload_size', + 0x04: 'initial_max_data', + 0x05: 'initial_max_stream_data_bidi_local', + 0x06: 'initial_max_stream_data_bidi_remote', + 0x07: 'initial_max_stream_data_uni', + 0x08: 'initial_max_streams_bidi', + 0x09: 'initial_max_streams_uni', + 0x0a: 'ack_delay_exponent', + 0x0b: 'max_ack_delay', + 0x0c: 'disable_active_migration', + 0x0d: 'preferred_address', + 0x0e: 'active_connection_id_limit', + 0x0f: 'initial_source_connection_id', + 0x10: 'retry_source_connection_id', + } + TYPE_BY_ID = { + 0x00: bytes, + 0x01: int, + 0x02: bytes, + 0x03: int, + 0x04: int, + 0x05: int, + 0x06: int, + 0x07: int, + 0x08: int, + 0x09: int, + 0x0a: int, + 0x0b: int, + 0x0c: int, + 0x0d: bytes, + 0x0e: int, + 0x0f: bytes, + 0x10: bytes, + } + + @classmethod + def name(cls, cid): + if cid in cls.NAME_BY_ID: + return f'{cls.NAME_BY_ID[cid]}(0x{cid:0x})' + return f'QuicTP(0x{cid:0x})' + + @classmethod + def is_qint(cls, cid): + if cid in cls.TYPE_BY_ID: + return cls.TYPE_BY_ID[cid] == int + return False + + +class Extension: + + def __init__(self, eid, name, edata, hsid): + self._eid = eid + self._name = name + self._edata = edata + self._hsid = hsid + + @property + def data(self): + return self._edata + + @property + def hsid(self): + return self._hsid + + def to_json(self): + jdata = { + 'id': self._eid, + 'name': self._name, + } + if len(self.data) > 0: + jdata['data'] = binascii.hexlify(self.data).decode() + return jdata + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + s = f'{ind}{self._name}(0x{self._eid:0x})' + if len(self._edata): + s += f'\n{ind} data({len(self._edata)}): ' \ + f'{binascii.hexlify(self._edata).decode()}' + return s + + +class ExtSupportedGroups(Extension): + + def __init__(self, eid, name, edata, hsid): + super().__init__(eid=eid, name=name, edata=edata, hsid=hsid) + d = edata + self._groups = [] + while len(d) > 0: + d, gid = _get_int(d, 2) + self._groups.append(gid) + + def to_json(self): + jdata = { + 'id': self._eid, + 'name': self._name, + } + if len(self._groups): + jdata['groups'] = [TlsSupportedGroups.name(gid) + for gid in self._groups] + return jdata + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + gnames = [TlsSupportedGroups.name(gid) for gid in self._groups] + s = f'{ind}{self._name}(0x{self._eid:0x}): {", ".join(gnames)}' + return s + + +class ExtKeyShare(Extension): + + def __init__(self, eid, name, edata, hsid): + super().__init__(eid=eid, name=name, edata=edata, hsid=hsid) + d = self.data + self._keys = [] + self._group = None + self._pubkey = None + if self.hsid == 2: # ServerHello + # single key share (group, pubkey) + d, self._group = _get_int(d, 2) + d, self._pubkey = _get_len_field(d, 2) + elif self.hsid == 6: # HelloRetryRequest + assert len(d) == 2 + d, self._group = _get_int(d, 2) + else: + # list if key shares (group, pubkey) + d, shares = _get_len_field(d, 2) + while len(shares) > 0: + shares, group = _get_int(shares, 2) + shares, pubkey = _get_len_field(shares, 2) + self._keys.append({ + 'group': TlsSupportedGroups.name(group), + 'pubkey': binascii.hexlify(pubkey).decode() + }) + + def to_json(self): + jdata = super().to_json() + if self._group is not None: + jdata['group'] = TlsSupportedGroups.name(self._group) + if self._pubkey is not None: + jdata['pubkey'] = binascii.hexlify(self._pubkey).decode() + if len(self._keys) > 0: + jdata['keys'] = self._keys + return jdata + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + s = f'{ind}{self._name}(0x{self._eid:0x})' + if self._group is not None: + s += f'\n{ind} group: {TlsSupportedGroups.name(self._group)}' + if self._pubkey is not None: + s += f'\n{ind} pubkey: {binascii.hexlify(self._pubkey).decode()}' + if len(self._keys) > 0: + for idx, key in enumerate(self._keys): + s += f'\n{ind} {idx}: {key["group"]}, {key["pubkey"]}' + return s + + +class ExtSNI(Extension): + + def __init__(self, eid, name, edata, hsid): + super().__init__(eid=eid, name=name, edata=edata, hsid=hsid) + d = self.data + self._indicators = [] + while len(d) > 0: + d, entry = _get_len_field(d, 2) + entry, stype = _get_int(entry, 1) + entry, sname = _get_len_field(entry, 2) + self._indicators.append({ + 'type': stype, + 'name': sname.decode() + }) + + def to_json(self): + jdata = super().to_json() + for i in self._indicators: + if i['type'] == 0: + jdata['host_name'] = i['name'] + else: + jdata[f'0x{i["type"]}'] = i['name'] + return jdata + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + s = f'{ind}{self._name}(0x{self._eid:0x})' + if len(self._indicators) == 1 and self._indicators[0]['type'] == 0: + s += f': {self._indicators[0]["name"]}' + else: + for i in self._indicators: + ikey = 'host_name' if i["type"] == 0 else f'type(0x{i["type"]:0x}' + s += f'\n{ind} {ikey}: {i["name"]}' + return s + + +class ExtALPN(Extension): + + def __init__(self, eid, name, edata, hsid): + super().__init__(eid=eid, name=name, edata=edata, hsid=hsid) + d = self.data + d, list_len = _get_int(d, 2) + self._protocols = [] + while len(d) > 0: + d, proto = _get_len_field(d, 1) + self._protocols.append(proto.decode()) + + def to_json(self): + jdata = super().to_json() + if len(self._protocols) == 1: + jdata['alpn'] = self._protocols[0] + else: + jdata['alpn'] = self._protocols + return jdata + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + return f'{ind}{self._name}(0x{self._eid:0x}): {", ".join(self._protocols)}' + + +class ExtEarlyData(Extension): + + def __init__(self, eid, name, edata, hsid): + super().__init__(eid=eid, name=name, edata=edata, hsid=hsid) + self._max_size = None + d = self.data + if hsid == 4: # SessionTicket + assert len(d) == 4, f'expected 4, len is {len(d)} data={d}' + d, self._max_size = _get_int(d, 4) + else: + assert len(d) == 0 + + def to_json(self): + jdata = super().to_json() + if self._max_size is not None: + jdata['max_size'] = self._max_size + return jdata + + +class ExtSignatureAlgorithms(Extension): + + def __init__(self, eid, name, edata, hsid): + super().__init__(eid=eid, name=name, edata=edata, hsid=hsid) + d = self.data + d, list_len = _get_int(d, 2) + self._algos = [] + while len(d) > 0: + d, algo = _get_int(d, 2) + self._algos.append(TlsSignatureScheme.name(algo)) + + def to_json(self): + jdata = super().to_json() + if len(self._algos) > 0: + jdata['algorithms'] = self._algos + return jdata + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + return f'{ind}{self._name}(0x{self._eid:0x}): {", ".join(self._algos)}' + + +class ExtPSKExchangeModes(Extension): + + def __init__(self, eid, name, edata, hsid): + super().__init__(eid=eid, name=name, edata=edata, hsid=hsid) + d = self.data + d, list_len = _get_int(d, 1) + self._modes = [] + while len(d) > 0: + d, mode = _get_int(d, 1) + self._modes.append(PskKeyExchangeMode.name(mode)) + + def to_json(self): + jdata = super().to_json() + jdata['modes'] = self._modes + return jdata + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + return f'{ind}{self._name}(0x{self._eid:0x}): {", ".join(self._modes)}' + + +class ExtPreSharedKey(Extension): + + def __init__(self, eid, name, edata, hsid): + super().__init__(eid=eid, name=name, edata=edata, hsid=hsid) + self._kid = None + self._identities = None + self._binders = None + d = self.data + if hsid == 1: # client hello + d, idata = _get_len_field(d, 2) + self._identities = [] + while len(idata): + idata, identity = _get_len_field(idata, 2) + idata, obfs_age = _get_int(idata, 4) + self._identities.append({ + 'id': binascii.hexlify(identity).decode(), + 'age': obfs_age, + }) + d, binders = _get_len_field(d, 2) + self._binders = [] + while len(binders) > 0: + binders, hmac = _get_len_field(binders, 1) + self._binders.append(binascii.hexlify(hmac).decode()) + assert len(d) == 0 + else: + d, self._kid = _get_int(d, 2) + + def to_json(self): + jdata = super().to_json() + if self.hsid == 1: + jdata['identities'] = self._identities + jdata['binders'] = self._binders + else: + jdata['identity'] = self._kid + return jdata + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + s = f'{ind}{self._name}(0x{self._hsid:0x})' + if self.hsid == 1: + for idx, i in enumerate(self._identities): + s += f'\n{ind} {idx}: {i["id"]} ({i["age"]})' + s += f'\n{ind} binders: {self._binders}' + else: + s += f'\n{ind} identity: {self._kid}' + return s + + +class ExtSupportedVersions(Extension): + + def __init__(self, eid, name, edata, hsid): + super().__init__(eid=eid, name=name, edata=edata, hsid=hsid) + d = self.data + self._versions = [] + if hsid == 1: # client hello + d, list_len = _get_int(d, 1) + while len(d) > 0: + d, version = _get_int(d, 2) + self._versions.append(f'0x{version:0x}') + else: + d, version = _get_int(d, 2) + self._versions.append(f'0x{version:0x}') + + def to_json(self): + jdata = super().to_json() + if len(self._versions) == 1: + jdata['version'] = self._versions[0] + else: + jdata['versions'] = self._versions + return jdata + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + return f'{ind}{self._name}(0x{self._eid:0x}): {", ".join(self._versions)}' + + +class ExtQuicTP(Extension): + + def __init__(self, eid, name, edata, hsid): + super().__init__(eid=eid, name=name, edata=edata, hsid=hsid) + d = self.data + self._params = [] + while len(d) > 0: + d, ptype = _get_qint(d) + d, plen = _get_qint(d) + d, pvalue = _get_field(d, plen) + if QuicTransportParam.is_qint(ptype): + _, pvalue = _get_qint(pvalue) + else: + pvalue = binascii.hexlify(pvalue).decode() + self._params.append({ + 'key': QuicTransportParam.name(ptype), + 'value': pvalue, + }) + + def to_json(self): + jdata = super().to_json() + jdata['params'] = self._params + return jdata + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + s = f'{ind}{self._name}(0x{self._eid:0x})' + for p in self._params: + s += f'\n{ind} {p["key"]}: {p["value"]}' + return s + + +class TlsExtensions: + + EXT_TYPES = [ + (0x00, 'SNI', ExtSNI), + (0x01, 'MAX_FRAGMENT_LENGTH', Extension), + (0x03, 'TRUSTED_CA_KEYS', Extension), + (0x04, 'TRUNCATED_HMAC', Extension), + (0x05, 'OSCP_STATUS_REQUEST', Extension), + (0x0a, 'SUPPORTED_GROUPS', ExtSupportedGroups), + (0x0b, 'EC_POINT_FORMATS', Extension), + (0x0d, 'SIGNATURE_ALGORITHMS', ExtSignatureAlgorithms), + (0x0e, 'USE_SRTP', Extension), + (0x10, 'ALPN', ExtALPN), + (0x11, 'STATUS_REQUEST_V2', Extension), + (0x16, 'ENCRYPT_THEN_MAC', Extension), + (0x17, 'EXTENDED_MASTER_SECRET', Extension), + (0x23, 'SESSION_TICKET', Extension), + (0x29, 'PRE_SHARED_KEY', ExtPreSharedKey), + (0x2a, 'EARLY_DATA', ExtEarlyData), + (0x2b, 'SUPPORTED_VERSIONS', ExtSupportedVersions), + (0x2c, 'COOKIE', Extension), + (0x2d, 'PSK_KEY_EXCHANGE_MODES', ExtPSKExchangeModes), + (0x31, 'POST_HANDSHAKE_AUTH', Extension), + (0x32, 'SIGNATURE_ALGORITHMS_CERT', Extension), + (0x33, 'KEY_SHARE', ExtKeyShare), + (0x39, 'QUIC_TP_PARAMS', ExtQuicTP), + (0xff01, 'RENEGOTIATION_INFO', Extension), + ] + NAME_BY_ID = {} + CLASS_BY_ID = {} + + @classmethod + def init(cls): + for (eid, name, ecls) in cls.EXT_TYPES: + cls.NAME_BY_ID[eid] = name + cls.CLASS_BY_ID[eid] = ecls + + @classmethod + def from_data(cls, hsid, data): + exts = [] + d = data + while len(d): + d, eid = _get_int(d, 2) + d, elen = _get_int(d, 2) + d, edata = _get_field(d, elen) + if eid in cls.NAME_BY_ID: + ename = cls.NAME_BY_ID[eid] + ecls = cls.CLASS_BY_ID[eid] + exts.append(ecls(eid=eid, name=ename, edata=edata, hsid=hsid)) + else: + exts.append(Extension(eid=eid, name=f'(0x{eid:0x})', + edata=edata, hsid=hsid)) + return exts + + +TlsExtensions.init() + + +class HSRecord: + + def __init__(self, hsid: int, name: str, data): + self._hsid = hsid + self._name = name + self._data = data + + @property + def hsid(self): + return self._hsid + + @property + def name(self): + return self._name + + @name.setter + def name(self, value): + self._name = value + + @property + def data(self): + return self._data + + def __repr__(self): + return f'{self.name}[{binascii.hexlify(self._data).decode()}]' + + def to_json(self) -> Dict[str, Any]: + return { + 'name': self.name, + 'data': binascii.hexlify(self._data).decode(), + } + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + return f'{ind}{self._name}\n'\ + f'{ind} id: 0x{self._hsid:0x}\n'\ + f'{ind} data({len(self._data)}): '\ + f'{binascii.hexlify(self._data).decode()}' + + +class ClientHello(HSRecord): + + def __init__(self, hsid: int, name: str, data): + super().__init__(hsid=hsid, name=name, data=data) + d = data + d, self._version = _get_int(d, 2) + d, self._random = _get_field(d, 32) + d, self._session_id = _get_len_field(d, 1) + self._ciphers = [] + d, ciphers = _get_len_field(d, 2) + while len(ciphers): + ciphers, cipher = _get_int(ciphers, 2) + self._ciphers.append(TlsCipherSuites.name(cipher)) + d, comps = _get_len_field(d, 1) + self._compressions = [int(c) for c in comps] + d, edata = _get_len_field(d, 2) + self._extensions = TlsExtensions.from_data(hsid, edata) + + def to_json(self): + jdata = super().to_json() + jdata['version'] = f'0x{self._version:0x}' + jdata['random'] = f'{binascii.hexlify(self._random).decode()}' + jdata['session_id'] = binascii.hexlify(self._session_id).decode() + jdata['ciphers'] = self._ciphers + jdata['compressions'] = self._compressions + jdata['extensions'] = [ext.to_json() for ext in self._extensions] + return jdata + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + return super().to_text(indent=indent) + '\n'\ + f'{ind} version: 0x{self._version:0x}\n'\ + f'{ind} random: {binascii.hexlify(self._random).decode()}\n' \ + f'{ind} session_id: {binascii.hexlify(self._session_id).decode()}\n' \ + f'{ind} ciphers: {", ".join(self._ciphers)}\n'\ + f'{ind} compressions: {self._compressions}\n'\ + f'{ind} extensions: \n' + '\n'.join( + [ext.to_text(indent=indent+4) for ext in self._extensions]) + + +class ServerHello(HSRecord): + + HELLO_RETRY_RANDOM = binascii.unhexlify( + 'CF21AD74E59A6111BE1D8C021E65B891C2A211167ABB8C5E079E09E2C8A8339C' + ) + + def __init__(self, hsid: int, name: str, data): + super().__init__(hsid=hsid, name=name, data=data) + d = data + d, self._version = _get_int(d, 2) + d, self._random = _get_field(d, 32) + if self._random == self.HELLO_RETRY_RANDOM: + self.name = 'HelloRetryRequest' + hsid = 6 + d, self._session_id = _get_len_field(d, 1) + d, cipher = _get_int(d, 2) + self._cipher = TlsCipherSuites.name(cipher) + d, self._compression = _get_int(d, 1) + d, edata = _get_len_field(d, 2) + self._extensions = TlsExtensions.from_data(hsid, edata) + + def to_json(self): + jdata = super().to_json() + jdata['version'] = f'0x{self._version:0x}' + jdata['random'] = f'{binascii.hexlify(self._random).decode()}' + jdata['session_id'] = binascii.hexlify(self._session_id).decode() + jdata['cipher'] = self._cipher + jdata['compression'] = int(self._compression) + jdata['extensions'] = [ext.to_json() for ext in self._extensions] + return jdata + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + return super().to_text(indent=indent) + '\n'\ + f'{ind} version: 0x{self._version:0x}\n'\ + f'{ind} random: {binascii.hexlify(self._random).decode()}\n' \ + f'{ind} session_id: {binascii.hexlify(self._session_id).decode()}\n' \ + f'{ind} cipher: {self._cipher}\n'\ + f'{ind} compression: {int(self._compression)}\n'\ + f'{ind} extensions: \n' + '\n'.join( + [ext.to_text(indent=indent+4) for ext in self._extensions]) + + +class EncryptedExtensions(HSRecord): + + def __init__(self, hsid: int, name: str, data): + super().__init__(hsid=hsid, name=name, data=data) + d = data + d, edata = _get_len_field(d, 2) + self._extensions = TlsExtensions.from_data(hsid, edata) + + def to_json(self): + jdata = super().to_json() + jdata['extensions'] = [ext.to_json() for ext in self._extensions] + return jdata + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + return super().to_text(indent=indent) + '\n'\ + f'{ind} extensions: \n' + '\n'.join( + [ext.to_text(indent=indent+4) for ext in self._extensions]) + + +class CertificateRequest(HSRecord): + + def __init__(self, hsid: int, name: str, data): + super().__init__(hsid=hsid, name=name, data=data) + d = data + d, self._context = _get_int(d, 1) + d, edata = _get_len_field(d, 2) + self._extensions = TlsExtensions.from_data(hsid, edata) + + def to_json(self): + jdata = super().to_json() + jdata['context'] = self._context + jdata['extensions'] = [ext.to_json() for ext in self._extensions] + return jdata + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + return super().to_text(indent=indent) + '\n'\ + f'{ind} context: {self._context}\n'\ + f'{ind} extensions: \n' + '\n'.join( + [ext.to_text(indent=indent+4) for ext in self._extensions]) + + +class Certificate(HSRecord): + + def __init__(self, hsid: int, name: str, data): + super().__init__(hsid=hsid, name=name, data=data) + d = data + d, self._context = _get_int(d, 1) + d, clist = _get_len_field(d, 3) + self._cert_entries = [] + while len(clist) > 0: + clist, cert_data = _get_len_field(clist, 3) + clist, cert_exts = _get_len_field(clist, 2) + exts = TlsExtensions.from_data(hsid, cert_exts) + self._cert_entries.append({ + 'cert': binascii.hexlify(cert_data).decode(), + 'extensions': exts, + }) + + def to_json(self): + jdata = super().to_json() + jdata['context'] = self._context + jdata['certificate_list'] = [{ + 'cert': e['cert'], + 'extensions': [x.to_json() for x in e['extensions']], + } for e in self._cert_entries] + return jdata + + def _enxtry_text(self, e, indent: int = 0): + ind = ' ' * (indent + 2) + return f'{ind} cert: {e["cert"]}\n'\ + f'{ind} extensions: \n' + '\n'.join( + [x.to_text(indent=indent + 4) for x in e['extensions']]) + + def to_text(self, indent: int = 0): + ind = ' ' * (indent + 2) + return super().to_text(indent=indent) + '\n'\ + f'{ind} context: {self._context}\n'\ + f'{ind} certificate_list: \n' + '\n'.join( + [self._enxtry_text(e, indent+4) for e in self._cert_entries]) + + +class SessionTicket(HSRecord): + + def __init__(self, hsid: int, name: str, data): + super().__init__(hsid=hsid, name=name, data=data) + d = data + d, self._lifetime = _get_int(d, 4) + d, self._age = _get_int(d, 4) + d, self._nonce = _get_len_field(d, 1) + d, self._ticket = _get_len_field(d, 2) + d, edata = _get_len_field(d, 2) + self._extensions = TlsExtensions.from_data(hsid, edata) + + def to_json(self): + jdata = super().to_json() + jdata['lifetime'] = self._lifetime + jdata['age'] = self._age + jdata['nonce'] = binascii.hexlify(self._nonce).decode() + jdata['ticket'] = binascii.hexlify(self._ticket).decode() + jdata['extensions'] = [ext.to_json() for ext in self._extensions] + return jdata + + +class HSIterator(Iterator): + + def __init__(self, recs): + self._recs = recs + self._index = 0 + + def __iter__(self): + return self + + def __next__(self): + try: + result = self._recs[self._index] + except IndexError: + raise StopIteration + self._index += 1 + return result + + +class HandShake: + REC_TYPES = [ + (1, 'ClientHello', ClientHello), + (2, 'ServerHello', ServerHello), + (3, 'HelloVerifyRequest', HSRecord), + (4, 'SessionTicket', SessionTicket), + (5, 'EndOfEarlyData', HSRecord), + (6, 'HelloRetryRequest', ServerHello), + (8, 'EncryptedExtensions', EncryptedExtensions), + (11, 'Certificate', Certificate), + (12, 'ServerKeyExchange ', HSRecord), + (13, 'CertificateRequest', CertificateRequest), + (14, 'ServerHelloDone', HSRecord), + (15, 'CertificateVerify', HSRecord), + (16, 'ClientKeyExchange', HSRecord), + (20, 'Finished', HSRecord), + (22, 'CertificateStatus', HSRecord), + (24, 'KeyUpdate', HSRecord), + (25, 'CompressedCertificate', HSRecord), + ] + RT_NAME_BY_ID = {} + RT_CLS_BY_ID = {} + + @classmethod + def _parse_rec(cls, data): + d, hsid = _get_int(data, 1) + if hsid not in cls.RT_CLS_BY_ID: + raise ParseError(f'unknown type {hsid}') + d, rec_len = _get_int(d, 3) + if rec_len > len(d): + # incomplete, need more data + return data, None + d, rec_data = _get_field(d, rec_len) + if hsid in cls.RT_CLS_BY_ID: + name = cls.RT_NAME_BY_ID[hsid] + rcls = cls.RT_CLS_BY_ID[hsid] + else: + name = f'CryptoRecord(0x{hsid:0x})' + rcls = HSRecord + return d, rcls(hsid=hsid, name=name, data=rec_data) + + @classmethod + def _parse(cls, source, strict=False, verbose: int = 0): + d = b'' + hsid = 0 + hsrecs = [] + if verbose > 0: + log.debug(f'scanning for handshake records') + blocks = [d for d in source] + while len(blocks) > 0: + try: + total_data = b''.join(blocks) + remain, r = cls._parse_rec(total_data) + if r is None: + # if we could not recognize a record, skip the first + # data block and try again + blocks = blocks[1:] + continue + hsrecs.append(r) + cons_len = len(total_data) - len(remain) + while cons_len > 0 and len(blocks) > 0: + if cons_len >= len(blocks[0]): + cons_len -= len(blocks[0]) + blocks = blocks[1:] + else: + blocks[0] = blocks[0][cons_len:] + cons_len = 0 + if verbose > 2: + log.debug(f'added record: {r.to_text()}') + except ParseError as err: + # if we could not recognize a record, skip the first + # data block and try again + blocks = blocks[1:] + if len(blocks) > 0 and strict: + raise Exception(f'possibly incomplete handshake record ' + f'id={hsid}, from raw={blocks}\n') + return hsrecs + + + + @classmethod + def init(cls): + for (hsid, name, rcls) in cls.REC_TYPES: + cls.RT_NAME_BY_ID[hsid] = name + cls.RT_CLS_BY_ID[hsid] = rcls + + def __init__(self, source: Iterable[bytes], strict: bool = False, + verbose: int = 0): + self._source = source + self._strict = strict + self._verbose = verbose + + def __iter__(self): + return HSIterator(recs=self._parse(self._source, strict=self._strict, + verbose=self._verbose)) + + +HandShake.init() diff --git a/deps/ngtcp2/ngtcp2/examples/tests/test_01_handshake.py b/deps/ngtcp2/ngtcp2/examples/tests/test_01_handshake.py new file mode 100644 index 000000000000..f1a01d1fec39 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tests/test_01_handshake.py @@ -0,0 +1,30 @@ +import pytest + +from .ngtcp2test import ExampleClient +from .ngtcp2test import ExampleServer +from .ngtcp2test import Env + + +@pytest.mark.skipif(condition=len(Env.get_crypto_libs()) == 0, + reason="no crypto lib examples configured") +class TestHandshake: + + @pytest.fixture(scope='class', params=Env.get_crypto_libs()) + def server(self, env, request) -> ExampleServer: + s = ExampleServer(env=env, crypto_lib=request.param) + assert s.exists(), f'server not found: {s.path}' + assert s.start() + yield s + s.stop() + + @pytest.fixture(scope='function', params=Env.get_crypto_libs()) + def client(self, env, request) -> ExampleClient: + client = ExampleClient(env=env, crypto_lib=request.param) + assert client.exists() + yield client + + def test_01_01_get(self, env: Env, server, client): + # run simple GET, no sessions, needs to give full handshake + cr = client.http_get(server, url=f'https://{env.example_domain}/') + assert cr.returncode == 0 + cr.assert_non_resume_handshake() diff --git a/deps/ngtcp2/ngtcp2/examples/tests/test_02_resume.py b/deps/ngtcp2/ngtcp2/examples/tests/test_02_resume.py new file mode 100644 index 000000000000..3de1344e4b2d --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tests/test_02_resume.py @@ -0,0 +1,46 @@ +import pytest + +from .ngtcp2test import ExampleClient +from .ngtcp2test import ExampleServer +from .ngtcp2test import Env + + +@pytest.mark.skipif(condition=len(Env.get_crypto_libs()) == 0, + reason="no crypto lib examples configured") +class TestResume: + + @pytest.fixture(scope='class', params=Env.get_crypto_libs()) + def server(self, env, request) -> ExampleServer: + s = ExampleServer(env=env, crypto_lib=request.param) + assert s.exists(), f'server not found: {s.path}' + assert s.start() + yield s + s.stop() + + @pytest.fixture(scope='function', params=Env.get_crypto_libs()) + def client(self, env, request) -> ExampleClient: + client = ExampleClient(env=env, crypto_lib=request.param) + assert client.exists() + yield client + + def test_02_01(self, env: Env, server, client): + # run GET with sessions but no early data, cleared first, then reused + client.clear_session() + cr = client.http_get(server, url=f'https://{env.example_domain}/', + use_session=True, + extra_args=['--disable-early-data']) + assert cr.returncode == 0 + cr.assert_non_resume_handshake() + # Now do this again and we expect a resumption, meaning no certificate + cr = client.http_get(server, url=f'https://{env.example_domain}/', + use_session=True, + extra_args=['--disable-early-data']) + assert cr.returncode == 0 + cr.assert_resume_handshake() + # restart the server, do it again + server.restart() + cr = client.http_get(server, url=f'https://{env.example_domain}/', + use_session=True, + extra_args=['--disable-early-data']) + assert cr.returncode == 0 + cr.assert_non_resume_handshake() diff --git a/deps/ngtcp2/ngtcp2/examples/tests/test_03_earlydata.py b/deps/ngtcp2/ngtcp2/examples/tests/test_03_earlydata.py new file mode 100644 index 000000000000..a0170c31b128 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tests/test_03_earlydata.py @@ -0,0 +1,56 @@ +import pytest + +from .ngtcp2test import ExampleClient +from .ngtcp2test import ExampleServer +from .ngtcp2test import Env + + +@pytest.mark.skipif(condition=len(Env.get_crypto_libs()) == 0, + reason="no crypto lib examples configured") +class TestEarlyData: + + @pytest.fixture(scope='class', params=Env.get_crypto_libs()) + def server(self, env, request) -> ExampleServer: + s = ExampleServer(env=env, crypto_lib=request.param) + assert s.exists(), f'server not found: {s.path}' + assert s.start() + yield s + s.stop() + + @pytest.fixture(scope='function', params=Env.get_crypto_libs()) + def client(self, env, request) -> ExampleClient: + client = ExampleClient(env=env, crypto_lib=request.param) + assert client.exists() + yield client + + def test_03_01(self, env: Env, server, client): + # run GET with sessions, cleared first, without a session, early + # data will not even be attempted + client.clear_session() + edata = 'This is the early data. It is not much.' + cr = client.http_get(server, url=f'https://{env.example_domain}/', + use_session=True, data=edata) + assert cr.returncode == 0 + cr.assert_non_resume_handshake() + # resume session, early data is sent and accepted + cr = client.http_get(server, url=f'https://{env.example_domain}/', + use_session=True, data=edata) + assert cr.returncode == 0 + cr.assert_resume_handshake() + assert not cr.early_data_rejected + # restart the server, resume, early data is attempted but will not work + server.restart() + cr = client.http_get(server, url=f'https://{env.example_domain}/', + use_session=True, data=edata) + assert cr.returncode == 0 + assert cr.early_data_rejected + cr.assert_non_resume_handshake() + # restart again, sent data, but not as early data + server.restart() + cr = client.http_get(server, url=f'https://{env.example_domain}/', + use_session=True, data=edata, + extra_args=['--disable-early-data']) + assert cr.returncode == 0 + # we see no rejection, since it was not used + assert not cr.early_data_rejected + cr.assert_non_resume_handshake() diff --git a/deps/ngtcp2/ngtcp2/examples/tests/test_04_clientcert.py b/deps/ngtcp2/ngtcp2/examples/tests/test_04_clientcert.py new file mode 100644 index 000000000000..bde1b187fda9 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tests/test_04_clientcert.py @@ -0,0 +1,57 @@ +import pytest + +from .ngtcp2test import ExampleClient +from .ngtcp2test import ExampleServer +from .ngtcp2test import Env + + +@pytest.mark.skipif(condition=len(Env.get_crypto_libs()) == 0, + reason="no crypto lib examples configured") +class TestClientCert: + + @pytest.fixture(scope='class', params=Env.get_crypto_libs()) + def server(self, env, request) -> ExampleServer: + s = ExampleServer(env=env, crypto_lib=request.param, + verify_client=True) + assert s.exists(), f'server not found: {s.path}' + assert s.start() + yield s + s.stop() + + @pytest.fixture(scope='function', params=Env.get_crypto_libs()) + def client(self, env, request) -> ExampleClient: + client = ExampleClient(env=env, crypto_lib=request.param) + assert client.exists() + yield client + + def test_04_01(self, env: Env, server, client): + # run GET with a server requesting a cert, client has none to offer + cr = client.http_get(server, url=f'https://{env.example_domain}/') + assert cr.returncode == 0 + cr.assert_verify_null_handshake() + creqs = [r for r in cr.handshake if r.hsid == 13] # CertificateRequest + assert len(creqs) == 1 + creq = creqs[0].to_json() + certs = [r for r in cr.server.handshake if r.hsid == 11] # Certificate + assert len(certs) == 1 + crec = certs[0].to_json() + assert len(crec['certificate_list']) == 0 + assert creq['context'] == crec['context'] + # TODO: check that GET had no answer + + def test_04_02(self, env: Env, server, client): + # run GET with a server requesting a cert, client has cert to offer + credentials = env.ca.get_first("clientsX") + cr = client.http_get(server, url=f'https://{env.example_domain}/', + credentials=credentials) + assert cr.returncode == 0 + cr.assert_verify_cert_handshake() + creqs = [r for r in cr.handshake if r.hsid == 13] # CertificateRequest + assert len(creqs) == 1 + creq = creqs[0].to_json() + certs = [r for r in cr.server.handshake if r.hsid == 11] # Certificate + assert len(certs) == 1 + crec = certs[0].to_json() + assert len(crec['certificate_list']) == 1 + assert creq['context'] == crec['context'] + # TODO: check that GET indeed gave a response diff --git a/deps/ngtcp2/ngtcp2/examples/tests/test_05_ciphers.py b/deps/ngtcp2/ngtcp2/examples/tests/test_05_ciphers.py new file mode 100644 index 000000000000..27f326e99dd2 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tests/test_05_ciphers.py @@ -0,0 +1,46 @@ +import sys + +import pytest + +from .ngtcp2test import ExampleClient +from .ngtcp2test import ExampleServer +from .ngtcp2test import Env + + +@pytest.mark.skipif(condition=len(Env.get_crypto_libs()) == 0, + reason="no crypto lib examples configured") +class TestCiphers: + + @pytest.fixture(scope='class', params=Env.get_crypto_libs()) + def server(self, env, request) -> ExampleServer: + s = ExampleServer(env=env, crypto_lib=request.param) + assert s.exists(), f'server not found: {s.path}' + assert s.start() + yield s + s.stop() + + @pytest.fixture(scope='function', + params=Env.get_crypto_libs(configurable_ciphers=True)) + def client(self, env, request) -> ExampleClient: + client = ExampleClient(env=env, crypto_lib=request.param) + assert client.exists() + yield client + + @pytest.mark.parametrize('cipher', [ + 'TLS_AES_128_GCM_SHA256', + 'TLS_AES_256_GCM_SHA384', + 'TLS_CHACHA20_POLY1305_SHA256', + 'TLS_AES_128_CCM_SHA256', + ]) + def test_05_01_get(self, env: Env, server, client, cipher): + if not client.uses_cipher_config: + pytest.skip(f'client {client.crypto_lib} ignores cipher config\n') + # run simple GET, no sessions, needs to give full handshake + if not client.supports_cipher(cipher): + pytest.skip(f'client {client.crypto_lib} does not support {cipher}\n') + if not server.supports_cipher(cipher): + pytest.skip(f'server {server.crypto_lib} does not support {cipher}\n') + cr = client.http_get(server, url=f'https://{env.example_domain}/', + ciphers=cipher) + assert cr.returncode == 0 + cr.assert_non_resume_handshake() diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_context.h b/deps/ngtcp2/ngtcp2/examples/tls_client_context.h new file mode 100644 index 000000000000..065d37bc3360 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_context.h @@ -0,0 +1,56 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_CLIENT_CONTEXT_H +#define TLS_CLIENT_CONTEXT_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#ifdef WITH_EXAMPLE_QUICTLS +# include "tls_client_context_quictls.h" +#endif // defined(WITH_EXAMPLE_QUICTLS) + +#ifdef WITH_EXAMPLE_GNUTLS +# include "tls_client_context_gnutls.h" +#endif // defined(WITH_EXAMPLE_GNUTLS) + +#ifdef WITH_EXAMPLE_BORINGSSL +# include "tls_client_context_boringssl.h" +#endif // defined(WITH_EXAMPLE_BORINGSSL) + +#ifdef WITH_EXAMPLE_PICOTLS +# include "tls_client_context_picotls.h" +#endif // defined(WITH_EXAMPLE_PICOTLS) + +#ifdef WITH_EXAMPLE_WOLFSSL +# include "tls_client_context_wolfssl.h" +#endif // defined(WITH_EXAMPLE_WOLFSSL) + +#ifdef WITH_EXAMPLE_OSSL +# include "tls_client_context_ossl.h" +#endif // defined(WITH_EXAMPLE_OSSL) + +#endif // !defined(TLS_CLIENT_CONTEXT_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_context_boringssl.cc b/deps/ngtcp2/ngtcp2/examples/tls_client_context_boringssl.cc new file mode 100644 index 000000000000..b6f28a5d3c1b --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_context_boringssl.cc @@ -0,0 +1,139 @@ +/* + * ngtcp2 + * + * Copyright (c) 2021 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_client_context_boringssl.h" + +#include +#include + +#include + +#include + +#include "client_base.h" +#include "template.h" +#include "tls_shared_boringssl.h" + +extern Config config; + +TLSClientContext::~TLSClientContext() { + if (ssl_ctx_) { + SSL_CTX_free(ssl_ctx_); + } +} + +SSL_CTX *TLSClientContext::get_native_handle() const { return ssl_ctx_; } + +namespace { +int new_session_cb(SSL *ssl, SSL_SESSION *session) { + auto conn_ref = static_cast(SSL_get_app_data(ssl)); + auto c = static_cast(conn_ref->user_data); + + c->ticket_received(); + + auto f = BIO_new_file(config.session_file.c_str(), "w"); + if (f == nullptr) { + std::println(stderr, "Could not write TLS session in {}", + config.session_file.native()); + return 0; + } + + if (!PEM_write_bio_SSL_SESSION(f, session)) { + std::println(stderr, "Unable to write TLS session to file"); + } + + BIO_free(f); + + return 0; +} +} // namespace + +std::expected TLSClientContext::init(const char *private_key_file, + const char *cert_file) { + ssl_ctx_ = SSL_CTX_new(TLS_client_method()); + if (!ssl_ctx_) { + std::println(stderr, "SSL_CTX_new: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (ngtcp2_crypto_boringssl_configure_client_context(ssl_ctx_) != 0) { + std::println(stderr, + "ngtcp2_crypto_boringssl_configure_client_context failed"); + return std::unexpected{Error::CRYPTO}; + } + + SSL_CTX_set_default_verify_paths(ssl_ctx_); + + if (SSL_CTX_set1_groups_list(ssl_ctx_, config.groups) != 1) { + std::println(stderr, "SSL_CTX_set1_groups_list failed"); + return std::unexpected{Error::CRYPTO}; + } + + if (private_key_file && cert_file) { + if (SSL_CTX_use_PrivateKey_file(ssl_ctx_, private_key_file, + SSL_FILETYPE_PEM) != 1) { + std::println(stderr, "SSL_CTX_use_PrivateKey_file: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (SSL_CTX_use_certificate_chain_file(ssl_ctx_, cert_file) != 1) { + std::println(stderr, "SSL_CTX_use_certificate_chain_file: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + } + + if (!config.session_file.empty()) { + SSL_CTX_set_session_cache_mode(ssl_ctx_, SSL_SESS_CACHE_CLIENT | + SSL_SESS_CACHE_NO_INTERNAL); + SSL_CTX_sess_set_new_cb(ssl_ctx_, new_session_cb); + } + +#ifdef HAVE_LIBBROTLI + if (!SSL_CTX_add_cert_compression_alg( + ssl_ctx_, ngtcp2::tls::CERTIFICATE_COMPRESSION_ALGO_BROTLI, + ngtcp2::tls::cert_compress, ngtcp2::tls::cert_decompress)) { + std::println(stderr, "SSL_CTX_add_cert_compression_alg failed"); + return std::unexpected{Error::CRYPTO}; + } +#endif // defined(HAVE_LIBBROTLI) + + return {}; +} + +extern std::ofstream keylog_file; + +namespace { +void keylog_callback(const SSL *ssl, const char *line) { + keylog_file.write(line, static_cast(strlen(line))); + keylog_file.put('\n'); + keylog_file.flush(); +} +} // namespace + +void TLSClientContext::enable_keylog() { + SSL_CTX_set_keylog_callback(ssl_ctx_, keylog_callback); +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_context_boringssl.h b/deps/ngtcp2/ngtcp2/examples/tls_client_context_boringssl.h new file mode 100644 index 000000000000..3f3fab08380c --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_context_boringssl.h @@ -0,0 +1,54 @@ +/* + * ngtcp2 + * + * Copyright (c) 2021 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_CLIENT_CONTEXT_BORINGSSL_H +#define TLS_CLIENT_CONTEXT_BORINGSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +#include "shared.h" + +using namespace ngtcp2; + +class TLSClientContext { +public: + TLSClientContext() = default; + ~TLSClientContext(); + + std::expected init(const char *private_key_file, + const char *cert_file); + + SSL_CTX *get_native_handle() const; + + void enable_keylog(); + +private: + SSL_CTX *ssl_ctx_{}; +}; + +#endif // !defined(TLS_CLIENT_CONTEXT_BORINGSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_context_ossl.cc b/deps/ngtcp2/ngtcp2/examples/tls_client_context_ossl.cc new file mode 100644 index 000000000000..31dc95e158be --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_context_ossl.cc @@ -0,0 +1,139 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_client_context_ossl.h" + +#include +#include +#include +#include + +#include + +#include + +#include "client_base.h" +#include "template.h" + +extern Config config; + +TLSClientContext::TLSClientContext() { ngtcp2_crypto_ossl_init(); } + +TLSClientContext::~TLSClientContext() { + if (ssl_ctx_) { + SSL_CTX_free(ssl_ctx_); + } + + ngtcp2_crypto_ossl_free(); +} + +SSL_CTX *TLSClientContext::get_native_handle() const { return ssl_ctx_; } + +namespace { +int new_session_cb(SSL *ssl, SSL_SESSION *session) { + auto conn_ref = static_cast(SSL_get_app_data(ssl)); + auto c = static_cast(conn_ref->user_data); + + c->ticket_received(); + + if (SSL_SESSION_get_max_early_data(session) != + std::numeric_limits::max()) { + std::println(stderr, "max_early_data_size is not 0xffffffff"); + } + auto f = BIO_new_file(config.session_file.c_str(), "w"); + if (f == nullptr) { + std::println(stderr, "Could not write TLS session in {}", + config.session_file.native()); + return 0; + } + + if (!PEM_write_bio_SSL_SESSION(f, session)) { + std::println(stderr, "Unable to write TLS session to file"); + } + + BIO_free(f); + + return 0; +} +} // namespace + +std::expected TLSClientContext::init(const char *private_key_file, + const char *cert_file) { + ssl_ctx_ = SSL_CTX_new(TLS_client_method()); + if (!ssl_ctx_) { + std::println(stderr, "SSL_CTX_new: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + SSL_CTX_set_default_verify_paths(ssl_ctx_); + + if (SSL_CTX_set_ciphersuites(ssl_ctx_, config.ciphers) != 1) { + std::println(stderr, "SSL_CTX_set_ciphersuites: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (SSL_CTX_set1_groups_list(ssl_ctx_, config.groups) != 1) { + std::println(stderr, "SSL_CTX_set1_groups_list failed"); + return std::unexpected{Error::CRYPTO}; + } + + if (private_key_file && cert_file) { + if (SSL_CTX_use_PrivateKey_file(ssl_ctx_, private_key_file, + SSL_FILETYPE_PEM) != 1) { + std::println(stderr, "SSL_CTX_use_PrivateKey_file: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (SSL_CTX_use_certificate_chain_file(ssl_ctx_, cert_file) != 1) { + std::println(stderr, "SSL_CTX_use_certificate_chain_file: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + } + + if (!config.session_file.empty()) { + SSL_CTX_set_session_cache_mode(ssl_ctx_, SSL_SESS_CACHE_CLIENT | + SSL_SESS_CACHE_NO_INTERNAL); + SSL_CTX_sess_set_new_cb(ssl_ctx_, new_session_cb); + } + + return {}; +} + +extern std::ofstream keylog_file; + +namespace { +void keylog_callback(const SSL *ssl, const char *line) { + keylog_file.write(line, static_cast(strlen(line))); + keylog_file.put('\n'); + keylog_file.flush(); +} +} // namespace + +void TLSClientContext::enable_keylog() { + SSL_CTX_set_keylog_callback(ssl_ctx_, keylog_callback); +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_context_ossl.h b/deps/ngtcp2/ngtcp2/examples/tls_client_context_ossl.h new file mode 100644 index 000000000000..4036a6fef9aa --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_context_ossl.h @@ -0,0 +1,54 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_CLIENT_CONTEXT_OSSL_H +#define TLS_CLIENT_CONTEXT_OSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +#include "shared.h" + +using namespace ngtcp2; + +class TLSClientContext { +public: + TLSClientContext(); + ~TLSClientContext(); + + std::expected init(const char *private_key_file, + const char *cert_file); + + SSL_CTX *get_native_handle() const; + + void enable_keylog(); + +private: + SSL_CTX *ssl_ctx_{}; +}; + +#endif // !defined(TLS_CLIENT_CONTEXT_OSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_context_picotls.cc b/deps/ngtcp2/ngtcp2/examples/tls_client_context_picotls.cc new file mode 100644 index 000000000000..d5ee705be0a7 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_context_picotls.cc @@ -0,0 +1,170 @@ +/* + * ngtcp2 + * + * Copyright (c) 2022 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_client_context_picotls.h" + +#include + +#include +#include + +#include "client_base.h" +#include "tls_shared_picotls.h" +#include "template.h" + +extern Config config; + +namespace { +int save_ticket_cb(ptls_save_ticket_t *self, ptls_t *ptls, ptls_iovec_t input) { + auto conn_ref = + static_cast(*ptls_get_data_ptr(ptls)); + auto c = static_cast(conn_ref->user_data); + + c->ticket_received(); + + auto f = BIO_new_file(config.session_file.c_str(), "w"); + if (f == nullptr) { + std::println(stderr, "Could not write TLS session in {}", + config.session_file.native()); + return 0; + } + + if (!PEM_write_bio(f, "PICOTLS SESSION PARAMETERS", "", input.base, + static_cast(input.len))) { + std::println(stderr, "Unable to write TLS session to file"); + } + + BIO_free(f); + + return 0; +} + +ptls_save_ticket_t save_ticket = {save_ticket_cb}; +} // namespace + +namespace { +ptls_key_exchange_algorithm_t *key_exchanges[] = { +#if PTLS_OPENSSL_HAVE_X25519 + &ptls_openssl_x25519, +#endif // PTLS_OPENSSL_X25519 + &ptls_openssl_secp256r1, + &ptls_openssl_secp384r1, + &ptls_openssl_secp521r1, +#if PTLS_OPENSSL_HAVE_X25519MLKEM768 + &ptls_openssl_x25519mlkem768, +#endif // PTLS_OPENSSL_HAVE_X25519MLKEM768 + nullptr, +}; +} // namespace + +namespace { +ptls_cipher_suite_t *cipher_suites[] = { + &ptls_openssl_aes128gcmsha256, + &ptls_openssl_aes256gcmsha384, +#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305 + &ptls_openssl_chacha20poly1305sha256, +#endif // PTLS_OPENSSL_CHACHA20POLY1305SHA256 + nullptr, +}; +} // namespace + +TLSClientContext::TLSClientContext() + : ctx_{ + .random_bytes = ptls_openssl_random_bytes, + .get_time = &ptls_get_time, + .key_exchanges = key_exchanges, + .cipher_suites = cipher_suites, + .require_dhe_on_psk = 1, + } {} + +TLSClientContext::~TLSClientContext() { + if (sign_cert_.key) { + ptls_openssl_dispose_sign_certificate(&sign_cert_); + } + + for (size_t i = 0; i < ctx_.certificates.count; ++i) { + free(ctx_.certificates.list[i].base); + } + free(ctx_.certificates.list); +} + +ptls_context_t *TLSClientContext::get_native_handle() { return &ctx_; } + +std::expected TLSClientContext::init(const char *private_key_file, + const char *cert_file) { + if (ngtcp2_crypto_picotls_configure_client_context(&ctx_) != 0) { + std::println(stderr, + "ngtcp2_crypto_picotls_configure_client_context failed"); + return std::unexpected{Error::CRYPTO}; + } + + if (!config.session_file.empty()) { + ctx_.save_ticket = &save_ticket; + } + + if (private_key_file && cert_file) { + if (ptls_load_certificates(&ctx_, cert_file) != 0) { + std::println(stderr, "ptls_load_certificates failed"); + return std::unexpected{Error::CRYPTO}; + } + + if (auto rv = load_private_key(private_key_file); !rv) { + return rv; + } + } + + return {}; +} + +std::expected +TLSClientContext::load_private_key(const char *private_key_file) { + auto fp = fopen(private_key_file, "rb"); + if (fp == nullptr) { + std::println(stderr, "Could not open private key file {}: {}", + private_key_file, strerror(errno)); + return std::unexpected{Error::IO}; + } + + auto fp_d = defer([fp] { fclose(fp); }); + + auto pkey = PEM_read_PrivateKey(fp, nullptr, nullptr, nullptr); + if (pkey == nullptr) { + std::println(stderr, "Could not read private key file {}", + private_key_file); + return std::unexpected{Error::IO}; + } + + auto pkey_d = defer([pkey] { EVP_PKEY_free(pkey); }); + + if (ptls_openssl_init_sign_certificate(&sign_cert_, pkey) != 0) { + std::println(stderr, "ptls_openssl_init_sign_certificate failed"); + return std::unexpected{Error::CRYPTO}; + } + + ctx_.sign_certificate = &sign_cert_.super; + + return {}; +} + +void TLSClientContext::enable_keylog() { ctx_.log_event = &log_event; } diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_context_picotls.h b/deps/ngtcp2/ngtcp2/examples/tls_client_context_picotls.h new file mode 100644 index 000000000000..7f111fd58e0d --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_context_picotls.h @@ -0,0 +1,58 @@ +/* + * ngtcp2 + * + * Copyright (c) 2022 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_CLIENT_CONTEXT_PICOTLS_H +#define TLS_CLIENT_CONTEXT_PICOTLS_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include + +#include "shared.h" + +using namespace ngtcp2; + +class TLSClientContext { +public: + TLSClientContext(); + ~TLSClientContext(); + + std::expected init(const char *private_key_file, + const char *cert_file); + + ptls_context_t *get_native_handle(); + + void enable_keylog(); + +private: + std::expected load_private_key(const char *private_key_file); + + ptls_context_t ctx_; + ptls_openssl_sign_certificate_t sign_cert_{}; +}; + +#endif // !defined(TLS_CLIENT_CONTEXT_PICOTLS_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_context_quictls.cc b/deps/ngtcp2/ngtcp2/examples/tls_client_context_quictls.cc new file mode 100644 index 000000000000..b88717708f3a --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_context_quictls.cc @@ -0,0 +1,152 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_client_context_quictls.h" + +#include +#include +#include +#include + +#include + +#include + +#include "client_base.h" +#include "template.h" + +namespace { +auto _ = [] { + if (ngtcp2_crypto_quictls_init() != 0) { + assert(0); + abort(); + } + + return 0; +}(); +} // namespace + +extern Config config; + +TLSClientContext::~TLSClientContext() { + if (ssl_ctx_) { + SSL_CTX_free(ssl_ctx_); + } +} + +SSL_CTX *TLSClientContext::get_native_handle() const { return ssl_ctx_; } + +namespace { +int new_session_cb(SSL *ssl, SSL_SESSION *session) { + auto conn_ref = static_cast(SSL_get_app_data(ssl)); + auto c = static_cast(conn_ref->user_data); + + c->ticket_received(); + + if (SSL_SESSION_get_max_early_data(session) != + std::numeric_limits::max()) { + std::println(stderr, "max_early_data_size is not 0xffffffff"); + } + auto f = BIO_new_file(config.session_file.c_str(), "w"); + if (f == nullptr) { + std::println(stderr, "Could not write TLS session in {}", + config.session_file.native()); + return 0; + } + + if (!PEM_write_bio_SSL_SESSION(f, session)) { + std::println(stderr, "Unable to write TLS session to file"); + } + + BIO_free(f); + + return 0; +} +} // namespace + +std::expected TLSClientContext::init(const char *private_key_file, + const char *cert_file) { + ssl_ctx_ = SSL_CTX_new(TLS_client_method()); + if (!ssl_ctx_) { + std::println(stderr, "SSL_CTX_new: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (ngtcp2_crypto_quictls_configure_client_context(ssl_ctx_) != 0) { + std::println(stderr, + "ngtcp2_crypto_quictls_configure_client_context failed"); + return std::unexpected{Error::CRYPTO}; + } + + SSL_CTX_set_default_verify_paths(ssl_ctx_); + + if (SSL_CTX_set_ciphersuites(ssl_ctx_, config.ciphers) != 1) { + std::println(stderr, "SSL_CTX_set_ciphersuites: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (SSL_CTX_set1_groups_list(ssl_ctx_, config.groups) != 1) { + std::println(stderr, "SSL_CTX_set1_groups_list failed"); + return std::unexpected{Error::CRYPTO}; + } + + if (private_key_file && cert_file) { + if (SSL_CTX_use_PrivateKey_file(ssl_ctx_, private_key_file, + SSL_FILETYPE_PEM) != 1) { + std::println(stderr, "SSL_CTX_use_PrivateKey_file: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (SSL_CTX_use_certificate_chain_file(ssl_ctx_, cert_file) != 1) { + std::println(stderr, "SSL_CTX_use_certificate_chain_file: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + } + + if (!config.session_file.empty()) { + SSL_CTX_set_session_cache_mode(ssl_ctx_, SSL_SESS_CACHE_CLIENT | + SSL_SESS_CACHE_NO_INTERNAL); + SSL_CTX_sess_set_new_cb(ssl_ctx_, new_session_cb); + } + + return {}; +} + +extern std::ofstream keylog_file; + +namespace { +void keylog_callback(const SSL *ssl, const char *line) { + keylog_file.write(line, static_cast(strlen(line))); + keylog_file.put('\n'); + keylog_file.flush(); +} +} // namespace + +void TLSClientContext::enable_keylog() { + SSL_CTX_set_keylog_callback(ssl_ctx_, keylog_callback); +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_context_quictls.h b/deps/ngtcp2/ngtcp2/examples/tls_client_context_quictls.h new file mode 100644 index 000000000000..97cb478f75ac --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_context_quictls.h @@ -0,0 +1,54 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_CLIENT_CONTEXT_QUICTLS_H +#define TLS_CLIENT_CONTEXT_QUICTLS_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +#include "shared.h" + +using namespace ngtcp2; + +class TLSClientContext { +public: + TLSClientContext() = default; + ~TLSClientContext(); + + std::expected init(const char *private_key_file, + const char *cert_file); + + SSL_CTX *get_native_handle() const; + + void enable_keylog(); + +private: + SSL_CTX *ssl_ctx_{}; +}; + +#endif // !defined(TLS_CLIENT_CONTEXT_QUICTLS_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_context_wolfssl.cc b/deps/ngtcp2/ngtcp2/examples/tls_client_context_wolfssl.cc new file mode 100644 index 000000000000..8eef8a259dee --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_context_wolfssl.cc @@ -0,0 +1,173 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_client_context_wolfssl.h" + +#include +#include +#include + +#include + +#include +#include + +#include "client_base.h" +#include "template.h" + +extern Config config; + +TLSClientContext::~TLSClientContext() { + if (ssl_ctx_) { + wolfSSL_CTX_free(ssl_ctx_); + } +} + +WOLFSSL_CTX *TLSClientContext::get_native_handle() const { return ssl_ctx_; } + +namespace { +int new_session_cb(WOLFSSL *ssl, WOLFSSL_SESSION *session) { + auto conn_ref = + static_cast(wolfSSL_get_app_data(ssl)); + auto c = static_cast(conn_ref->user_data); + + c->ticket_received(); + +#ifdef HAVE_SESSION_TICKET + if (wolfSSL_SESSION_get_max_early_data(session) != + std::numeric_limits::max()) { + std::println(stderr, "max_early_data_size is not 0xffffffff"); + } + + unsigned char sbuffer[16 * 1024], *data; + auto sz = wolfSSL_i2d_SSL_SESSION(session, nullptr); + if (sz <= 0) { + std::println(stderr, "Could not export TLS session in {}", + config.session_file.native()); + return 0; + } + if (static_cast(sz) > sizeof(sbuffer)) { + std::println(stderr, "Exported TLS session too large"); + return 0; + } + data = sbuffer; + sz = wolfSSL_i2d_SSL_SESSION(session, &data); + + auto f = wolfSSL_BIO_new_file(config.session_file.c_str(), "w"); + if (f == nullptr) { + std::println(stderr, "Could not write TLS session in {}", + config.session_file.native()); + return 0; + } + + auto f_d = defer([f] { wolfSSL_BIO_free(f); }); + + if (!wolfSSL_PEM_write_bio(f, "WOLFSSL SESSION PARAMETERS", "", sbuffer, + sz)) { + std::println(stderr, "Unable to write TLS session to file"); + return 0; + } +#else // !defined(HAVE_SESSION_TICKET) + std::println(stderr, "TLS session tickets not enabled in wolfSSL"); +#endif // !defined(HAVE_SESSION_TICKET) + return 0; +} +} // namespace + +std::expected TLSClientContext::init(const char *private_key_file, + const char *cert_file) { + ssl_ctx_ = wolfSSL_CTX_new(wolfTLSv1_3_client_method()); + if (!ssl_ctx_) { + std::println(stderr, "wolfSSL_CTX_new: {}", + wolfSSL_ERR_error_string(wolfSSL_ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (ngtcp2_crypto_wolfssl_configure_client_context(ssl_ctx_) != 0) { + std::println(stderr, + "ngtcp2_crypto_wolfssl_configure_client_context failed"); + return std::unexpected{Error::CRYPTO}; + } + + if (wolfSSL_CTX_set_default_verify_paths(ssl_ctx_) == + WOLFSSL_NOT_IMPLEMENTED) { + /* hmm, not verifying the server cert for now */ + wolfSSL_CTX_set_verify(ssl_ctx_, WOLFSSL_VERIFY_NONE, 0); + } + + if (wolfSSL_CTX_set_cipher_list(ssl_ctx_, config.ciphers) != + WOLFSSL_SUCCESS) { + std::println(stderr, "wolfSSL_CTX_set_cipher_list: {}", + wolfSSL_ERR_error_string(wolfSSL_ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (wolfSSL_CTX_set1_groups_list( + ssl_ctx_, const_cast(config.groups)) != WOLFSSL_SUCCESS) { + std::println(stderr, "wolfSSL_CTX_set1_groups_list({}) failed", + config.groups); + return std::unexpected{Error::CRYPTO}; + } + + if (private_key_file && cert_file) { + if (wolfSSL_CTX_use_PrivateKey_file(ssl_ctx_, private_key_file, + SSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { + std::println(stderr, "wolfSSL_CTX_use_PrivateKey_file: {}", + wolfSSL_ERR_error_string(wolfSSL_ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (wolfSSL_CTX_use_certificate_chain_file(ssl_ctx_, cert_file) != + WOLFSSL_SUCCESS) { + std::println(stderr, "wolfSSL_CTX_use_certificate_chain_file: {}", + wolfSSL_ERR_error_string(wolfSSL_ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + } + + if (!config.session_file.empty()) { + wolfSSL_CTX_UseSessionTicket(ssl_ctx_); + wolfSSL_CTX_sess_set_new_cb(ssl_ctx_, new_session_cb); + } + + return {}; +} + +extern std::ofstream keylog_file; + +#ifdef HAVE_SECRET_CALLBACK +namespace { +void keylog_callback(const WOLFSSL *ssl, const char *line) { + keylog_file.write(line, static_cast(strlen(line))); + keylog_file.put('\n'); + keylog_file.flush(); +} +} // namespace +#endif // defined(HAVE_SECRET_CALLBACK) + +void TLSClientContext::enable_keylog() { +#ifdef HAVE_SECRET_CALLBACK + wolfSSL_CTX_set_keylog_callback(ssl_ctx_, keylog_callback); +#endif // defined(HAVE_SECRET_CALLBACK) +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_context_wolfssl.h b/deps/ngtcp2/ngtcp2/examples/tls_client_context_wolfssl.h new file mode 100644 index 000000000000..a8a66ed50d0a --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_context_wolfssl.h @@ -0,0 +1,56 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_CLIENT_CONTEXT_WOLFSSL_H +#define TLS_CLIENT_CONTEXT_WOLFSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include +#include + +#include "shared.h" + +using namespace ngtcp2; + +class TLSClientContext { +public: + TLSClientContext() = default; + ~TLSClientContext(); + + std::expected init(const char *private_key_file, + const char *cert_file); + + WOLFSSL_CTX *get_native_handle() const; + + void enable_keylog(); + +private: + WOLFSSL_CTX *ssl_ctx_{}; +}; + +#endif // !defined(TLS_CLIENT_CONTEXT_WOLFSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_session.h b/deps/ngtcp2/ngtcp2/examples/tls_client_session.h new file mode 100644 index 000000000000..39ce2caeeae3 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_session.h @@ -0,0 +1,56 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_CLIENT_SESSION_H +#define TLS_CLIENT_SESSION_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#ifdef WITH_EXAMPLE_QUICTLS +# include "tls_client_session_quictls.h" +#endif // defined(WITH_EXAMPLE_QUICTLS) + +#ifdef WITH_EXAMPLE_GNUTLS +# include "tls_client_session_gnutls.h" +#endif // defined(WITH_EXAMPLE_GNUTLS) + +#ifdef WITH_EXAMPLE_BORINGSSL +# include "tls_client_session_boringssl.h" +#endif // defined(WITH_EXAMPLE_BORINGSSL) + +#ifdef WITH_EXAMPLE_PICOTLS +# include "tls_client_session_picotls.h" +#endif // defined(WITH_EXAMPLE_PICOTLS) + +#ifdef WITH_EXAMPLE_WOLFSSL +# include "tls_client_session_wolfssl.h" +#endif // defined(WITH_EXAMPLE_WOLFSSL) + +#ifdef WITH_EXAMPLE_OSSL +# include "tls_client_session_ossl.h" +#endif // defined(WITH_EXAMPLE_OSSL) + +#endif // !defined(TLS_CLIENT_SESSION_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_session_boringssl.cc b/deps/ngtcp2/ngtcp2/examples/tls_client_session_boringssl.cc new file mode 100644 index 000000000000..75989b66bbf5 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_session_boringssl.cc @@ -0,0 +1,144 @@ +/* + * ngtcp2 + * + * Copyright (c) 2021 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_client_session_boringssl.h" + +#include +#include + +#include "tls_client_context_boringssl.h" +#include "client_base.h" +#include "template.h" +#include "util.h" + +extern Config config; + +std::expected +TLSClientSession::init(bool &early_data_enabled, + const TLSClientContext &tls_ctx, const char *remote_addr, + ClientBase *client, uint32_t quic_version, + AppProtocol app_proto) { + early_data_enabled = false; + + auto ssl_ctx = tls_ctx.get_native_handle(); + + ssl_ = SSL_new(ssl_ctx); + if (!ssl_) { + std::println(stderr, "SSL_new: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + SSL_set_app_data(ssl_, client->conn_ref()); + SSL_set_connect_state(ssl_); + + switch (app_proto) { + case AppProtocol::H3: + SSL_set_alpn_protos(ssl_, H3_ALPN.data(), H3_ALPN.size()); + break; + case AppProtocol::HQ: + SSL_set_alpn_protos(ssl_, HQ_ALPN.data(), HQ_ALPN.size()); + break; + } + + if (!config.sni.empty()) { + SSL_set_tlsext_host_name(ssl_, config.sni.data()); + } else if (util::numeric_host(remote_addr)) { + // If remote host is numeric address, just send "localhost" as SNI + // for now. + SSL_set_tlsext_host_name(ssl_, "localhost"); + } else { + SSL_set_tlsext_host_name(ssl_, remote_addr); + } + + if (!config.session_file.empty()) { + auto f = BIO_new_file(config.session_file.c_str(), "r"); + if (f == nullptr) { + std::println(stderr, "Could not read TLS session file {}", + config.session_file.native()); + } else { + auto session = PEM_read_bio_SSL_SESSION(f, nullptr, 0, nullptr); + BIO_free(f); + if (session == nullptr) { + std::println(stderr, "Could not read TLS session file {}", + config.session_file.native()); + } else { + if (!SSL_set_session(ssl_, session)) { + std::println(stderr, "Could not set session"); + } else if (!config.disable_early_data && + SSL_SESSION_early_data_capable(session)) { + early_data_enabled = true; + SSL_set_early_data_enabled(ssl_, 1); + } + SSL_SESSION_free(session); + } + } + } + + if (!config.ech_config_list.empty() && + SSL_set1_ech_config_list(ssl_, config.ech_config_list.data(), + config.ech_config_list.size()) != 1) { + std::println(stderr, "Could not set ECHConfigList: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + return {}; +} + +bool TLSClientSession::get_early_data_accepted() const { + return SSL_early_data_accepted(ssl_); +} + +bool TLSClientSession::get_ech_accepted() const { + return SSL_ech_accepted(ssl_); +} + +std::expected TLSClientSession::write_ech_config_list( + const std::filesystem::path &path) const { + const uint8_t *retry_configs; + size_t retry_configslen; + + SSL_get0_ech_retry_configs(ssl_, &retry_configs, &retry_configslen); + if (retry_configslen == 0) { + std::println(stderr, "No ECH retry configs found"); + return std::unexpected{Error::CRYPTO}; + } + + auto f = std::ofstream(path); + + if (!f) { + return std::unexpected{Error::IO}; + } + + f.write(reinterpret_cast(retry_configs), + static_cast(retry_configslen)); + f.close(); + + if (!f) { + return std::unexpected{Error::IO}; + } + + return {}; +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_session_boringssl.h b/deps/ngtcp2/ngtcp2/examples/tls_client_session_boringssl.h new file mode 100644 index 000000000000..89000c9ff2ee --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_session_boringssl.h @@ -0,0 +1,57 @@ +/* + * ngtcp2 + * + * Copyright (c) 2021 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_CLIENT_SESSION_BORINGSSL_H +#define TLS_CLIENT_SESSION_BORINGSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +#include "tls_session_base_quictls.h" +#include "shared.h" + +using namespace ngtcp2; + +class TLSClientContext; +class ClientBase; + +class TLSClientSession : public TLSSessionBase { +public: + TLSClientSession() = default; + + std::expected init(bool &early_data_enabled, + const TLSClientContext &tls_ctx, + const char *remote_addr, ClientBase *client, + uint32_t quic_version, AppProtocol app_proto); + + bool get_early_data_accepted() const; + bool get_ech_accepted() const; + std::expected + write_ech_config_list(const std::filesystem::path &path) const; +}; + +#endif // !defined(TLS_CLIENT_SESSION_BORINGSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_session_ossl.cc b/deps/ngtcp2/ngtcp2/examples/tls_client_session_ossl.cc new file mode 100644 index 000000000000..b15a45fc2a8e --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_session_ossl.cc @@ -0,0 +1,116 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_client_session_ossl.h" + +#include + +#include + +#include "tls_client_context_ossl.h" +#include "client_base.h" +#include "template.h" +#include "util.h" + +extern Config config; + +std::expected +TLSClientSession::init(bool &early_data_enabled, + const TLSClientContext &tls_ctx, const char *remote_addr, + ClientBase *client, uint32_t quic_version, + AppProtocol app_proto) { + early_data_enabled = false; + + auto ssl_ctx = tls_ctx.get_native_handle(); + + auto ssl = SSL_new(ssl_ctx); + if (!ssl) { + std::println(stderr, "SSL_new: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + ngtcp2_crypto_ossl_ctx_set_ssl(ossl_ctx_, ssl); + + if (ngtcp2_crypto_ossl_configure_client_session(ssl) != 0) { + std::println(stderr, "ngtcp2_crypto_ossl_configure_client_session failed"); + return std::unexpected{Error::CRYPTO}; + } + + SSL_set_app_data(ssl, client->conn_ref()); + SSL_set_connect_state(ssl); + + switch (app_proto) { + case AppProtocol::H3: + SSL_set_alpn_protos(ssl, H3_ALPN.data(), H3_ALPN.size()); + break; + case AppProtocol::HQ: + SSL_set_alpn_protos(ssl, HQ_ALPN.data(), HQ_ALPN.size()); + break; + } + + if (!config.sni.empty()) { + SSL_set_tlsext_host_name(ssl, config.sni.data()); + } else if (util::numeric_host(remote_addr)) { + // If remote host is numeric address, just send "localhost" as SNI + // for now. + SSL_set_tlsext_host_name(ssl, "localhost"); + } else { + SSL_set_tlsext_host_name(ssl, remote_addr); + } + + if (!config.session_file.empty()) { + auto f = BIO_new_file(config.session_file.c_str(), "r"); + if (f == nullptr) { + std::println(stderr, "Could not read TLS session file {}", + config.session_file.native()); + } else { + auto session = PEM_read_bio_SSL_SESSION(f, nullptr, 0, nullptr); + BIO_free(f); + if (session == nullptr) { + std::println(stderr, "Could not read TLS session file {}", + config.session_file.native()); + } else { + if (!SSL_set_session(ssl, session)) { + std::println(stderr, "Could not set session"); + } else if (!config.disable_early_data && + SSL_SESSION_get_max_early_data(session)) { + early_data_enabled = true; + SSL_set_quic_tls_early_data_enabled(ssl, 1); + } + + SSL_SESSION_free(session); + } + } + } + + return {}; +} + +bool TLSClientSession::get_early_data_accepted() const { + auto ssl = ngtcp2_crypto_ossl_ctx_get_ssl(ossl_ctx_); + + // SSL_get_early_data_status works after handshake completes. + return SSL_get_early_data_status(ssl) == SSL_EARLY_DATA_ACCEPTED; +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_session_ossl.h b/deps/ngtcp2/ngtcp2/examples/tls_client_session_ossl.h new file mode 100644 index 000000000000..4476ba4c7bed --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_session_ossl.h @@ -0,0 +1,59 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_CLIENT_SESSION_OSSL_H +#define TLS_CLIENT_SESSION_OSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +#include "tls_session_base_ossl.h" +#include "shared.h" + +using namespace ngtcp2; + +class TLSClientContext; +class ClientBase; + +class TLSClientSession : public TLSSessionBase { +public: + TLSClientSession() = default; + + std::expected init(bool &early_data_enabled, + const TLSClientContext &tls_ctx, + const char *remote_addr, ClientBase *client, + uint32_t quic_version, AppProtocol app_proto); + + bool get_early_data_accepted() const; + bool get_ech_accepted() const { return false; } + std::expected + write_ech_config_list(const std::filesystem::path &path) const { + return {}; + } +}; + +#endif // !defined(TLS_CLIENT_SESSION_OSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_session_picotls.cc b/deps/ngtcp2/ngtcp2/examples/tls_client_session_picotls.cc new file mode 100644 index 000000000000..d65d2a096f3a --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_session_picotls.cc @@ -0,0 +1,167 @@ +/* + * ngtcp2 + * + * Copyright (c) 2022 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_client_session_picotls.h" + +#include +#include + +#include + +#include +#include + +#include + +#include "tls_client_context_picotls.h" +#include "client_base.h" +#include "template.h" +#include "util.h" + +using namespace std::literals; + +extern Config config; + +TLSClientSession::~TLSClientSession() { + auto &hsprops = cptls_.handshake_properties; + + delete[] hsprops.client.session_ticket.base; +} + +namespace { +auto negotiated_protocols_h3 = std::to_array({ + { + .base = const_cast(&H3_ALPN_V1[1]), + .len = H3_ALPN_V1[0], + }, +}); +} // namespace + +namespace { +auto negotiated_protocols_hq = std::to_array({ + { + .base = const_cast(&HQ_ALPN_V1[1]), + .len = HQ_ALPN_V1[0], + }, +}); +} // namespace + +std::expected +TLSClientSession::init(bool &early_data_enabled, TLSClientContext &tls_ctx, + const char *remote_addr, ClientBase *client, + uint32_t quic_version, AppProtocol app_proto) { + cptls_.ptls = ptls_client_new(tls_ctx.get_native_handle()); + if (!cptls_.ptls) { + std::println(stderr, "ptls_client_new failed"); + return std::unexpected{Error::CRYPTO}; + } + + *ptls_get_data_ptr(cptls_.ptls) = client->conn_ref(); + + auto conn = client->conn(); + auto &hsprops = cptls_.handshake_properties; + + hsprops.additional_extensions = new ptls_raw_extension_t[2]{ + { + .type = UINT16_MAX, + }, + { + .type = UINT16_MAX, + }, + }; + + if (ngtcp2_crypto_picotls_configure_client_session(&cptls_, conn) != 0) { + std::println(stderr, + "ngtcp2_crypto_picotls_configure_client_session failed"); + return std::unexpected{Error::CRYPTO}; + } + + switch (app_proto) { + case AppProtocol::H3: + hsprops.client.negotiated_protocols.list = negotiated_protocols_h3.data(); + hsprops.client.negotiated_protocols.count = negotiated_protocols_h3.size(); + + break; + case AppProtocol::HQ: + hsprops.client.negotiated_protocols.list = negotiated_protocols_hq.data(); + hsprops.client.negotiated_protocols.count = negotiated_protocols_hq.size(); + + break; + } + + if (util::numeric_host(remote_addr)) { + // If remote host is numeric address, just send "localhost" as SNI + // for now. + ptls_set_server_name(cptls_.ptls, "localhost", strlen("localhost")); + } else { + ptls_set_server_name(cptls_.ptls, remote_addr, strlen(remote_addr)); + } + + if (!config.session_file.empty()) { + auto f = BIO_new_file(config.session_file.c_str(), "r"); + if (f == nullptr) { + std::println(stderr, "Could not read TLS session file {}", + config.session_file.native()); + } else { + auto f_d = defer([f] { BIO_free(f); }); + + char *name, *header; + unsigned char *data; + long datalen; + + if (PEM_read_bio(f, &name, &header, &data, &datalen) != 1) { + std::println(stderr, "Could not read TLS session file {}", + config.session_file.native()); + } else { + if ("PICOTLS SESSION PARAMETERS"sv != name) { + std::println(stderr, "TLS session file contains unexpected name: {}", + name); + } else { + hsprops.client.session_ticket.base = + new uint8_t[static_cast(datalen)]; + hsprops.client.session_ticket.len = static_cast(datalen); + std::ranges::copy_n(data, datalen, + hsprops.client.session_ticket.base); + + if (!config.disable_early_data) { + // No easy way to check max_early_data from ticket. We + // need to run ptls_handle_message. + early_data_enabled = true; + } + } + + OPENSSL_free(name); + OPENSSL_free(header); + OPENSSL_free(data); + } + } + } + + return {}; +} + +bool TLSClientSession::get_early_data_accepted() const { + return cptls_.handshake_properties.client.early_data_acceptance == + PTLS_EARLY_DATA_ACCEPTED; +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_session_picotls.h b/deps/ngtcp2/ngtcp2/examples/tls_client_session_picotls.h new file mode 100644 index 000000000000..c5aed12e20f3 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_session_picotls.h @@ -0,0 +1,60 @@ +/* + * ngtcp2 + * + * Copyright (c) 2022 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_CLIENT_SESSION_PICOTLS_H +#define TLS_CLIENT_SESSION_PICOTLS_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +#include "tls_session_base_picotls.h" +#include "shared.h" + +using namespace ngtcp2; + +class TLSClientContext; +class ClientBase; + +class TLSClientSession : public TLSSessionBase { +public: + TLSClientSession() = default; + ~TLSClientSession(); + + std::expected init(bool &early_data_enabled, + TLSClientContext &tls_ctx, + const char *remote_addr, ClientBase *client, + uint32_t quic_version, AppProtocol app_proto); + + bool get_early_data_accepted() const; + bool get_ech_accepted() const { return false; } + std::expected + write_ech_config_list(const std::filesystem::path &path) const { + return {}; + } +}; + +#endif // !defined(TLS_CLIENT_SESSION_PICOTLS_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_session_quictls.cc b/deps/ngtcp2/ngtcp2/examples/tls_client_session_quictls.cc new file mode 100644 index 000000000000..b2060568347b --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_session_quictls.cc @@ -0,0 +1,109 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_client_session_quictls.h" + +#include + +#include + +#include "tls_client_context_quictls.h" +#include "client_base.h" +#include "template.h" +#include "util.h" + +extern Config config; + +std::expected +TLSClientSession::init(bool &early_data_enabled, + const TLSClientContext &tls_ctx, const char *remote_addr, + ClientBase *client, uint32_t quic_version, + AppProtocol app_proto) { + early_data_enabled = false; + + auto ssl_ctx = tls_ctx.get_native_handle(); + + ssl_ = SSL_new(ssl_ctx); + if (!ssl_) { + std::println(stderr, "SSL_new: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + SSL_set_app_data(ssl_, client->conn_ref()); + SSL_set_connect_state(ssl_); + + switch (app_proto) { + case AppProtocol::H3: + SSL_set_alpn_protos(ssl_, H3_ALPN.data(), H3_ALPN.size()); + break; + case AppProtocol::HQ: + SSL_set_alpn_protos(ssl_, HQ_ALPN.data(), HQ_ALPN.size()); + break; + } + + if (!config.sni.empty()) { + SSL_set_tlsext_host_name(ssl_, config.sni.data()); + } else if (util::numeric_host(remote_addr)) { + // If remote host is numeric address, just send "localhost" as SNI + // for now. + SSL_set_tlsext_host_name(ssl_, "localhost"); + } else { + SSL_set_tlsext_host_name(ssl_, remote_addr); + } + + if (!config.session_file.empty()) { + auto f = BIO_new_file(config.session_file.c_str(), "r"); + if (f == nullptr) { + std::println(stderr, "Could not read TLS session file {}", + config.session_file.native()); + } else { + auto session = PEM_read_bio_SSL_SESSION(f, nullptr, 0, nullptr); + BIO_free(f); + if (session == nullptr) { + std::println(stderr, "Could not read TLS session file {}", + config.session_file.native()); + } else { + if (!SSL_set_session(ssl_, session)) { + std::println(stderr, "Could not set session"); + } +#ifndef LIBRESSL_VERSION_NUMBER + else if (!config.disable_early_data && + SSL_SESSION_get_max_early_data(session)) { + early_data_enabled = true; + SSL_set_quic_early_data_enabled(ssl_, 1); + } +#endif // !defined(LIBRESSL_VERSION_NUMBER) + SSL_SESSION_free(session); + } + } + } + + return {}; +} + +bool TLSClientSession::get_early_data_accepted() const { + // SSL_get_early_data_status works after handshake completes. + return SSL_get_early_data_status(ssl_) == SSL_EARLY_DATA_ACCEPTED; +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_session_quictls.h b/deps/ngtcp2/ngtcp2/examples/tls_client_session_quictls.h new file mode 100644 index 000000000000..ad309f61840e --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_session_quictls.h @@ -0,0 +1,59 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_CLIENT_SESSION_QUICTLS_H +#define TLS_CLIENT_SESSION_QUICTLS_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +#include "tls_session_base_quictls.h" +#include "shared.h" + +using namespace ngtcp2; + +class TLSClientContext; +class ClientBase; + +class TLSClientSession : public TLSSessionBase { +public: + TLSClientSession() = default; + + std::expected init(bool &early_data_enabled, + const TLSClientContext &tls_ctx, + const char *remote_addr, ClientBase *client, + uint32_t quic_version, AppProtocol app_proto); + + bool get_early_data_accepted() const; + bool get_ech_accepted() const { return false; } + std::expected + write_ech_config_list(const std::filesystem::path &path) const { + return {}; + } +}; + +#endif // !defined(TLS_CLIENT_SESSION_QUICTLS_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_session_wolfssl.cc b/deps/ngtcp2/ngtcp2/examples/tls_client_session_wolfssl.cc new file mode 100644 index 000000000000..16f5ed79769e --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_session_wolfssl.cc @@ -0,0 +1,147 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_client_session_wolfssl.h" + +#include +#include + +#include "tls_client_context_wolfssl.h" +#include "client_base.h" +#include "template.h" +#include "util.h" + +using namespace std::literals; + +extern Config config; + +std::expected +TLSClientSession::init(bool &early_data_enabled, + const TLSClientContext &tls_ctx, const char *remote_addr, + ClientBase *client, uint32_t quic_version, + AppProtocol app_proto) { + early_data_enabled = false; + + auto ssl_ctx = tls_ctx.get_native_handle(); + + ssl_ = wolfSSL_new(ssl_ctx); + if (!ssl_) { + std::println(stderr, "wolfSSL_new: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + wolfSSL_set_app_data(ssl_, client->conn_ref()); + wolfSSL_set_connect_state(ssl_); + + switch (app_proto) { + case AppProtocol::H3: + wolfSSL_set_alpn_protos(ssl_, H3_ALPN.data(), H3_ALPN.size()); + break; + case AppProtocol::HQ: + wolfSSL_set_alpn_protos(ssl_, HQ_ALPN.data(), HQ_ALPN.size()); + break; + } + + if (!config.sni.empty()) { + wolfSSL_UseSNI(ssl_, WOLFSSL_SNI_HOST_NAME, config.sni.data(), + static_cast(config.sni.length())); + } else if (util::numeric_host(remote_addr)) { + // If remote host is numeric address, just send "localhost" as SNI + // for now. + wolfSSL_UseSNI(ssl_, WOLFSSL_SNI_HOST_NAME, "localhost", + sizeof("localhost") - 1); + } else { + wolfSSL_UseSNI(ssl_, WOLFSSL_SNI_HOST_NAME, remote_addr, + static_cast(strlen(remote_addr))); + } + + // Just use QUIC v1 + wolfSSL_set_quic_transport_version(ssl_, 0x39); + + if (!config.session_file.empty()) { +#ifdef HAVE_SESSION_TICKET + auto f = wolfSSL_BIO_new_file(config.session_file.c_str(), "r"); + if (f == nullptr) { + std::println(stderr, "Could not open TLS session file {}", + config.session_file.native()); + } else { + char *name, *header; + unsigned char *data; + const unsigned char *pdata; + long datalen; + WOLFSSL_SESSION *session; + + if (wolfSSL_PEM_read_bio(f, &name, &header, &data, &datalen) != 1) { + std::println(stderr, "Could not read TLS session file {}", + config.session_file.native()); + } else { + if ("WOLFSSL SESSION PARAMETERS"sv != name) { + std::println(stderr, "TLS session file contains unexpected name: {}", + name); + } else { + pdata = data; + session = wolfSSL_d2i_SSL_SESSION(nullptr, &pdata, datalen); + if (session == nullptr) { + std::println(stderr, "Could not parse TLS session from file {}", + config.session_file.native()); + } else { + auto ret = wolfSSL_set_session(ssl_, session); + if (ret != WOLFSSL_SUCCESS) { + std::println(stderr, "Could not install TLS session from file {}", + config.session_file.native()); + } else { + if (!config.disable_early_data && + wolfSSL_SESSION_get_max_early_data(session)) { + early_data_enabled = true; + wolfSSL_set_quic_early_data_enabled(ssl_, 1); + } + } + wolfSSL_SESSION_free(session); + } + } + + wolfSSL_OPENSSL_free(name); + wolfSSL_OPENSSL_free(header); + wolfSSL_OPENSSL_free(data); + } + wolfSSL_BIO_free(f); + } + wolfSSL_UseSessionTicket(ssl_); +#else // !defined(HAVE_SESSION_TICKET) + std::println(stderr, "TLS session im-/export not enabled in wolfSSL"); +#endif // !defined(HAVE_SESSION_TICKET) + } + + return {}; +} + +bool TLSClientSession::get_early_data_accepted() const { + // wolfSSL_get_early_data_status works after handshake completes. +#ifdef WOLFSSL_EARLY_DATA + return wolfSSL_get_early_data_status(ssl_) == SSL_EARLY_DATA_ACCEPTED; +#else // !defined(WOLFSSL_EARLY_DATA) + return 0; +#endif // !defined(WOLFSSL_EARLY_DATA) +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_client_session_wolfssl.h b/deps/ngtcp2/ngtcp2/examples/tls_client_session_wolfssl.h new file mode 100644 index 000000000000..eb876ebdfcf3 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_client_session_wolfssl.h @@ -0,0 +1,59 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_CLIENT_SESSION_WOLFSSL_H +#define TLS_CLIENT_SESSION_WOLFSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +#include "tls_session_base_wolfssl.h" +#include "shared.h" + +using namespace ngtcp2; + +class TLSClientContext; +class ClientBase; + +class TLSClientSession : public TLSSessionBase { +public: + TLSClientSession() = default; + + std::expected init(bool &early_data_enabled, + const TLSClientContext &tls_ctx, + const char *remote_addr, ClientBase *client, + uint32_t quic_version, AppProtocol app_proto); + + bool get_early_data_accepted() const; + bool get_ech_accepted() const { return false; } + std::expected + write_ech_config_list(const std::filesystem::path &path) const { + return {}; + } +}; + +#endif // !defined(TLS_CLIENT_SESSION_WOLFSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_context.h b/deps/ngtcp2/ngtcp2/examples/tls_server_context.h new file mode 100644 index 000000000000..1aa16918c94b --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_context.h @@ -0,0 +1,56 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SERVER_CONTEXT_H +#define TLS_SERVER_CONTEXT_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#ifdef WITH_EXAMPLE_QUICTLS +# include "tls_server_context_quictls.h" +#endif // defined(WITH_EXAMPLE_QUICTLS) + +#ifdef WITH_EXAMPLE_GNUTLS +# include "tls_server_context_gnutls.h" +#endif // defined(WITH_EXAMPLE_GNUTLS) + +#ifdef WITH_EXAMPLE_BORINGSSL +# include "tls_server_context_boringssl.h" +#endif // defined(WITH_EXAMPLE_BORINGSSL) + +#ifdef WITH_EXAMPLE_PICOTLS +# include "tls_server_context_picotls.h" +#endif // defined(WITH_EXAMPLE_PICOTLS) + +#ifdef WITH_EXAMPLE_WOLFSSL +# include "tls_server_context_wolfssl.h" +#endif // defined(WITH_EXAMPLE_WOLFSSL) + +#ifdef WITH_EXAMPLE_OSSL +# include "tls_server_context_ossl.h" +#endif // defined(WITH_EXAMPLE_OSSL) + +#endif // !defined(TLS_SERVER_CONTEXT_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_context_boringssl.cc b/deps/ngtcp2/ngtcp2/examples/tls_server_context_boringssl.cc new file mode 100644 index 000000000000..64b3bd013ed9 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_context_boringssl.cc @@ -0,0 +1,265 @@ +/* + * ngtcp2 + * + * Copyright (c) 2021 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_server_context_boringssl.h" + +#include +#include +#include + +#include + +#include +#include + +#include "server_base.h" +#include "template.h" +#include "tls_shared_boringssl.h" + +extern Config config; + +TLSServerContext::~TLSServerContext() { + if (ssl_ctx_) { + SSL_CTX_free(ssl_ctx_); + } +} + +SSL_CTX *TLSServerContext::get_native_handle() const { return ssl_ctx_; } + +namespace { +int alpn_select_proto_h3_cb(SSL *ssl, const unsigned char **out, + unsigned char *outlen, const unsigned char *in, + unsigned int inlen, void *arg) { + auto conn_ref = static_cast(SSL_get_app_data(ssl)); + auto h = static_cast(conn_ref->user_data); + // This should be the negotiated version, but we have not set the + // negotiated version when this callback is called. + auto version = ngtcp2_conn_get_client_chosen_version2(h->conn()); + + switch (version) { + case NGTCP2_PROTO_VER_V1: + case NGTCP2_PROTO_VER_V2: + break; + default: + if (!config.quiet) { + std::println(stderr, "Unexpected quic protocol version: {:#x}", version); + } + return SSL_TLSEXT_ERR_ALERT_FATAL; + } + + for (auto s = std::span{in, inlen}; s.size() >= H3_ALPN_V1.size(); + s = s.subspan(s[0] + 1)) { + if (std::ranges::equal(H3_ALPN_V1, s.first(H3_ALPN_V1.size()))) { + *out = &s[1]; + *outlen = s[0]; + return SSL_TLSEXT_ERR_OK; + } + } + + if (!config.quiet) { + std::println(stderr, "Client did not present ALPN {}", + as_string_view(H3_ALPN_V1.subspan(1))); + } + + return SSL_TLSEXT_ERR_ALERT_FATAL; +} +} // namespace + +namespace { +int alpn_select_proto_hq_cb(SSL *ssl, const unsigned char **out, + unsigned char *outlen, const unsigned char *in, + unsigned int inlen, void *arg) { + auto conn_ref = static_cast(SSL_get_app_data(ssl)); + auto h = static_cast(conn_ref->user_data); + // This should be the negotiated version, but we have not set the + // negotiated version when this callback is called. + auto version = ngtcp2_conn_get_client_chosen_version2(h->conn()); + + switch (version) { + case NGTCP2_PROTO_VER_V1: + case NGTCP2_PROTO_VER_V2: + break; + default: + if (!config.quiet) { + std::println(stderr, "Unexpected quic protocol version: {:#x}", version); + } + return SSL_TLSEXT_ERR_ALERT_FATAL; + } + + for (auto s = std::span{in, inlen}; s.size() >= HQ_ALPN_V1.size(); + s = s.subspan(s[0] + 1)) { + if (std::ranges::equal(HQ_ALPN_V1, s.first(HQ_ALPN_V1.size()))) { + *out = &s[1]; + *outlen = s[0]; + return SSL_TLSEXT_ERR_OK; + } + } + + if (!config.quiet) { + std::println(stderr, "Client did not present ALPN {}", + as_string_view(HQ_ALPN_V1.subspan(1))); + } + + return SSL_TLSEXT_ERR_ALERT_FATAL; +} +} // namespace + +namespace { +int verify_cb(int preverify_ok, X509_STORE_CTX *ctx) { + // We don't verify the client certificate. Just request it for the + // testing purpose. + return 1; +} +} // namespace + +std::expected TLSServerContext::init(const char *private_key_file, + const char *cert_file, + AppProtocol app_proto) { + static constexpr unsigned char sid_ctx[] = "ngtcp2 server"; + + ssl_ctx_ = SSL_CTX_new(TLS_server_method()); + if (!ssl_ctx_) { + std::println(stderr, "SSL_CTX_new: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + constexpr auto ssl_opts = (SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS) | + SSL_OP_SINGLE_ECDH_USE | + SSL_OP_CIPHER_SERVER_PREFERENCE; + + SSL_CTX_set_options(ssl_ctx_, ssl_opts); + + if (SSL_CTX_set1_groups_list(ssl_ctx_, config.groups) != 1) { + std::println(stderr, "SSL_CTX_set1_groups_list failed"); + return std::unexpected{Error::CRYPTO}; + } + + SSL_CTX_set_mode(ssl_ctx_, SSL_MODE_RELEASE_BUFFERS); + + if (ngtcp2_crypto_boringssl_configure_server_context(ssl_ctx_) != 0) { + std::println(stderr, + "ngtcp2_crypto_boringssl_configure_server_context failed"); + return std::unexpected{Error::CRYPTO}; + } + + switch (app_proto) { + case AppProtocol::H3: + SSL_CTX_set_alpn_select_cb(ssl_ctx_, alpn_select_proto_h3_cb, nullptr); + break; + case AppProtocol::HQ: + SSL_CTX_set_alpn_select_cb(ssl_ctx_, alpn_select_proto_hq_cb, nullptr); + break; + } + + SSL_CTX_set_default_verify_paths(ssl_ctx_); + + if (SSL_CTX_use_PrivateKey_file(ssl_ctx_, private_key_file, + SSL_FILETYPE_PEM) != 1) { + std::println(stderr, "SSL_CTX_use_PrivateKey_file: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (SSL_CTX_use_certificate_chain_file(ssl_ctx_, cert_file) != 1) { + std::println(stderr, "SSL_CTX_use_certificate_chain_file: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (SSL_CTX_check_private_key(ssl_ctx_) != 1) { + std::println(stderr, "SSL_CTX_check_private_key: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + SSL_CTX_set_session_id_context(ssl_ctx_, sid_ctx, sizeof(sid_ctx) - 1); + + if (config.verify_client) { + SSL_CTX_set_verify(ssl_ctx_, + SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE | + SSL_VERIFY_FAIL_IF_NO_PEER_CERT, + verify_cb); + } + +#ifdef HAVE_LIBBROTLI + if (!SSL_CTX_add_cert_compression_alg( + ssl_ctx_, ngtcp2::tls::CERTIFICATE_COMPRESSION_ALGO_BROTLI, + ngtcp2::tls::cert_compress, ngtcp2::tls::cert_decompress)) { + std::println(stderr, "SSL_CTX_add_cert_compression_alg failed"); + return std::unexpected{Error::CRYPTO}; + } +#endif // defined(HAVE_LIBBROTLI) + + if (!config.ech_config.ech_config_list.empty()) { + const auto &echconf = config.ech_config; + + auto pkey = EVP_HPKE_KEY_new(); + + if (EVP_HPKE_KEY_init(pkey, EVP_hpke_x25519_hkdf_sha256(), + echconf.private_key.bytes.data(), + echconf.private_key.bytes.size()) != 1) { + std::println(stderr, "EVP_HPKE_KEY_init failed: {}", + ERR_error_string(ERR_get_error(), nullptr)); + + return std::unexpected{Error::CRYPTO}; + } + + auto pkey_d = defer([pkey] { EVP_HPKE_KEY_free(pkey); }); + + auto keys = SSL_ECH_KEYS_new(); + auto keys_d = defer([keys] { SSL_ECH_KEYS_free(keys); }); + + for (const auto &ech_config : echconf.ech_config_list) { + if (SSL_ECH_KEYS_add(keys, 1, ech_config.data(), ech_config.size(), + pkey) != 1) { + std::println(stderr, "SSL_ECH_KEYS_add failed: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + } + + if (SSL_CTX_set1_ech_keys(ssl_ctx_, keys) != 1) { + std::println(stderr, "SSL_CTX_set1_ech_keys failed: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + } + + return {}; +} + +extern std::ofstream keylog_file; + +namespace { +void keylog_callback(const SSL *ssl, const char *line) { + keylog_file.write(line, static_cast(strlen(line))); + keylog_file.put('\n'); + keylog_file.flush(); +} +} // namespace + +void TLSServerContext::enable_keylog() { + SSL_CTX_set_keylog_callback(ssl_ctx_, keylog_callback); +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_context_boringssl.h b/deps/ngtcp2/ngtcp2/examples/tls_server_context_boringssl.h new file mode 100644 index 000000000000..c55e24c034fb --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_context_boringssl.h @@ -0,0 +1,54 @@ +/* + * ngtcp2 + * + * Copyright (c) 2021 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SERVER_CONTEXT_BORINGSSL_H +#define TLS_SERVER_CONTEXT_BORINGSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +#include "shared.h" + +using namespace ngtcp2; + +class TLSServerContext { +public: + TLSServerContext() = default; + ~TLSServerContext(); + + std::expected init(const char *private_key_file, + const char *cert_file, AppProtocol app_proto); + + SSL_CTX *get_native_handle() const; + + void enable_keylog(); + +private: + SSL_CTX *ssl_ctx_{}; +}; + +#endif // !defined(TLS_SERVER_CONTEXT_BORINGSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_context_ossl.cc b/deps/ngtcp2/ngtcp2/examples/tls_server_context_ossl.cc new file mode 100644 index 000000000000..bd4fe2971c15 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_context_ossl.cc @@ -0,0 +1,298 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_server_context_ossl.h" + +#include +#include +#include +#include +#include + +#include + +#include + +#include "server_base.h" +#include "template.h" + +extern Config config; + +TLSServerContext::TLSServerContext() { ngtcp2_crypto_ossl_init(); } + +TLSServerContext::~TLSServerContext() { + if (ssl_ctx_) { + SSL_CTX_free(ssl_ctx_); + } + + ngtcp2_crypto_ossl_free(); +} + +SSL_CTX *TLSServerContext::get_native_handle() const { return ssl_ctx_; } + +namespace { +int alpn_select_proto_h3_cb(SSL *ssl, const unsigned char **out, + unsigned char *outlen, const unsigned char *in, + unsigned int inlen, void *arg) { + auto conn_ref = static_cast(SSL_get_app_data(ssl)); + auto h = static_cast(conn_ref->user_data); + // This should be the negotiated version, but we have not set the + // negotiated version when this callback is called. + auto version = ngtcp2_conn_get_client_chosen_version2(h->conn()); + + switch (version) { + case NGTCP2_PROTO_VER_V1: + case NGTCP2_PROTO_VER_V2: + break; + default: + if (!config.quiet) { + std::println(stderr, "Unexpected quic protocol version: {:#x}", version); + } + return SSL_TLSEXT_ERR_ALERT_FATAL; + } + + for (auto s = std::span{in, inlen}; s.size() >= H3_ALPN_V1.size(); + s = s.subspan(s[0] + 1)) { + if (std::ranges::equal(H3_ALPN_V1, s.first(H3_ALPN_V1.size()))) { + *out = &s[1]; + *outlen = s[0]; + return SSL_TLSEXT_ERR_OK; + } + } + + if (!config.quiet) { + std::println(stderr, "Client did not present ALPN {}", + as_string_view(H3_ALPN_V1.subspan(1))); + } + + return SSL_TLSEXT_ERR_ALERT_FATAL; +} +} // namespace + +namespace { +int alpn_select_proto_hq_cb(SSL *ssl, const unsigned char **out, + unsigned char *outlen, const unsigned char *in, + unsigned int inlen, void *arg) { + auto conn_ref = static_cast(SSL_get_app_data(ssl)); + auto h = static_cast(conn_ref->user_data); + // This should be the negotiated version, but we have not set the + // negotiated version when this callback is called. + auto version = ngtcp2_conn_get_client_chosen_version2(h->conn()); + + switch (version) { + case NGTCP2_PROTO_VER_V1: + case NGTCP2_PROTO_VER_V2: + break; + default: + if (!config.quiet) { + std::println(stderr, "Unexpected quic protocol version: {:#x}", version); + } + return SSL_TLSEXT_ERR_ALERT_FATAL; + } + + for (auto s = std::span{in, inlen}; s.size() >= HQ_ALPN_V1.size(); + s = s.subspan(s[0] + 1)) { + if (std::ranges::equal(HQ_ALPN_V1, s.first(HQ_ALPN_V1.size()))) { + *out = &s[1]; + *outlen = s[0]; + return SSL_TLSEXT_ERR_OK; + } + } + + if (!config.quiet) { + std::println(stderr, "Client did not present ALPN {}", + as_string_view(HQ_ALPN_V1.subspan(1))); + } + + return SSL_TLSEXT_ERR_ALERT_FATAL; +} +} // namespace + +namespace { +int verify_cb(int preverify_ok, X509_STORE_CTX *ctx) { + // We don't verify the client certificate. Just request it for the + // testing purpose. + return 1; +} +} // namespace + +namespace { +int gen_ticket_cb(SSL *ssl, void *arg) { + auto conn_ref = static_cast(SSL_get_app_data(ssl)); + auto h = static_cast(conn_ref->user_data); + auto ver = htonl(ngtcp2_conn_get_negotiated_version2(h->conn())); + + if (!SSL_SESSION_set1_ticket_appdata(SSL_get0_session(ssl), &ver, + sizeof(ver))) { + return 0; + } + + return 1; +} +} // namespace + +namespace { +SSL_TICKET_RETURN decrypt_ticket_cb(SSL *ssl, SSL_SESSION *session, + const unsigned char *keyname, + size_t keynamelen, SSL_TICKET_STATUS status, + void *arg) { + switch (status) { + case SSL_TICKET_EMPTY: + case SSL_TICKET_NO_DECRYPT: + return SSL_TICKET_RETURN_IGNORE_RENEW; + } + + uint8_t *pver; + uint32_t ver; + size_t verlen; + + if (!SSL_SESSION_get0_ticket_appdata( + session, reinterpret_cast(&pver), &verlen) || + verlen != sizeof(ver)) { + switch (status) { + case SSL_TICKET_SUCCESS: + return SSL_TICKET_RETURN_IGNORE; + case SSL_TICKET_SUCCESS_RENEW: + default: + return SSL_TICKET_RETURN_IGNORE_RENEW; + } + } + + memcpy(&ver, pver, sizeof(ver)); + + auto conn_ref = static_cast(SSL_get_app_data(ssl)); + auto h = static_cast(conn_ref->user_data); + + if (ngtcp2_conn_get_client_chosen_version2(h->conn()) != ntohl(ver)) { + switch (status) { + case SSL_TICKET_SUCCESS: + return SSL_TICKET_RETURN_IGNORE; + case SSL_TICKET_SUCCESS_RENEW: + default: + return SSL_TICKET_RETURN_IGNORE_RENEW; + } + } + + switch (status) { + case SSL_TICKET_SUCCESS: + return SSL_TICKET_RETURN_USE; + case SSL_TICKET_SUCCESS_RENEW: + default: + return SSL_TICKET_RETURN_USE_RENEW; + } +} +} // namespace + +std::expected TLSServerContext::init(const char *private_key_file, + const char *cert_file, + AppProtocol app_proto) { + static constexpr unsigned char sid_ctx[] = "ngtcp2 server"; + + ssl_ctx_ = SSL_CTX_new(TLS_server_method()); + if (!ssl_ctx_) { + std::println(stderr, "SSL_CTX_new: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + SSL_CTX_set_max_early_data(ssl_ctx_, UINT32_MAX); + + constexpr auto ssl_opts = (SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS) | + SSL_OP_SINGLE_ECDH_USE | + SSL_OP_CIPHER_SERVER_PREFERENCE | + SSL_OP_NO_ANTI_REPLAY; + + SSL_CTX_set_options(ssl_ctx_, ssl_opts); + + if (SSL_CTX_set_ciphersuites(ssl_ctx_, config.ciphers) != 1) { + std::println(stderr, "SSL_CTX_set_ciphersuites: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (SSL_CTX_set1_groups_list(ssl_ctx_, config.groups) != 1) { + std::println(stderr, "SSL_CTX_set1_groups_list failed"); + return std::unexpected{Error::CRYPTO}; + } + + SSL_CTX_set_mode(ssl_ctx_, SSL_MODE_RELEASE_BUFFERS); + + switch (app_proto) { + case AppProtocol::H3: + SSL_CTX_set_alpn_select_cb(ssl_ctx_, alpn_select_proto_h3_cb, nullptr); + break; + case AppProtocol::HQ: + SSL_CTX_set_alpn_select_cb(ssl_ctx_, alpn_select_proto_hq_cb, nullptr); + break; + } + + SSL_CTX_set_default_verify_paths(ssl_ctx_); + + if (SSL_CTX_use_PrivateKey_file(ssl_ctx_, private_key_file, + SSL_FILETYPE_PEM) != 1) { + std::println(stderr, "SSL_CTX_use_PrivateKey_file: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (SSL_CTX_use_certificate_chain_file(ssl_ctx_, cert_file) != 1) { + std::println(stderr, "SSL_CTX_use_certificate_chain_file: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (SSL_CTX_check_private_key(ssl_ctx_) != 1) { + std::println(stderr, "SSL_CTX_check_private_key: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + SSL_CTX_set_session_id_context(ssl_ctx_, sid_ctx, sizeof(sid_ctx) - 1); + + if (config.verify_client) { + SSL_CTX_set_verify(ssl_ctx_, + SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE | + SSL_VERIFY_FAIL_IF_NO_PEER_CERT, + verify_cb); + } + + SSL_CTX_set_session_ticket_cb(ssl_ctx_, gen_ticket_cb, decrypt_ticket_cb, + nullptr); + + return {}; +} + +extern std::ofstream keylog_file; + +namespace { +void keylog_callback(const SSL *ssl, const char *line) { + keylog_file.write(line, static_cast(strlen(line))); + keylog_file.put('\n'); + keylog_file.flush(); +} +} // namespace + +void TLSServerContext::enable_keylog() { + SSL_CTX_set_keylog_callback(ssl_ctx_, keylog_callback); +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_context_ossl.h b/deps/ngtcp2/ngtcp2/examples/tls_server_context_ossl.h new file mode 100644 index 000000000000..cc1aa38301d6 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_context_ossl.h @@ -0,0 +1,54 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SERVER_CONTEXT_OSSL_H +#define TLS_SERVER_CONTEXT_OSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +#include "shared.h" + +using namespace ngtcp2; + +class TLSServerContext { +public: + TLSServerContext(); + ~TLSServerContext(); + + std::expected init(const char *private_key_file, + const char *cert_file, AppProtocol app_proto); + + SSL_CTX *get_native_handle() const; + + void enable_keylog(); + +private: + SSL_CTX *ssl_ctx_{}; +}; + +#endif // !defined(TLS_SERVER_CONTEXT_OSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_context_picotls.cc b/deps/ngtcp2/ngtcp2/examples/tls_server_context_picotls.cc new file mode 100644 index 000000000000..597669df7caf --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_context_picotls.cc @@ -0,0 +1,376 @@ +/* + * ngtcp2 + * + * Copyright (c) 2022 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_server_context_picotls.h" + +#include +#include + +#include + +#include +#if OPENSSL_VERSION_NUMBER >= 0x30000000L +# include +#endif // OPENSSL_VERSION_NUMBER >= 0x30000000L + +#include "server_base.h" +#include "tls_shared_picotls.h" +#include "template.h" + +extern Config config; + +namespace { +int on_client_hello_h3_cb(ptls_on_client_hello_t *self, ptls_t *ptls, + ptls_on_client_hello_parameters_t *params) { + auto &negprotos = params->negotiated_protocols; + + for (size_t i = 0; i < negprotos.count; ++i) { + auto &proto = negprotos.list[i]; + if (std::ranges::equal(H3_ALPN_V1.subspan(1), + std::span{proto.base, proto.len})) { + if (ptls_set_negotiated_protocol( + ptls, reinterpret_cast(proto.base), proto.len) != 0) { + return -1; + } + + return 0; + } + } + + return PTLS_ALERT_NO_APPLICATION_PROTOCOL; +} + +ptls_on_client_hello_t on_client_hello_h3 = {on_client_hello_h3_cb}; +} // namespace + +namespace { +int on_client_hello_hq_cb(ptls_on_client_hello_t *self, ptls_t *ptls, + ptls_on_client_hello_parameters_t *params) { + auto &negprotos = params->negotiated_protocols; + + for (size_t i = 0; i < negprotos.count; ++i) { + auto &proto = negprotos.list[i]; + if (std::ranges::equal(HQ_ALPN_V1.subspan(1), + std::span{proto.base, proto.len})) { + if (ptls_set_negotiated_protocol( + ptls, reinterpret_cast(proto.base), proto.len) != 0) { + return -1; + } + + return 0; + } + } + + return PTLS_ALERT_NO_APPLICATION_PROTOCOL; +} + +ptls_on_client_hello_t on_client_hello_hq = {on_client_hello_hq_cb}; +} // namespace + +namespace { +std::span get_ticket_key_name() { + static std::array key_name; + ptls_openssl_random_bytes(key_name.data(), key_name.size()); + return key_name; +} + +std::span get_ticket_key() { + static std::array key; + ptls_openssl_random_bytes(key.data(), key.size()); + return key; +} + +std::span get_ticket_hmac_key() { + static std::array hmac_key; + ptls_openssl_random_bytes(hmac_key.data(), hmac_key.size()); + return hmac_key; +} +} // namespace + +namespace { +int ticket_key_cb(unsigned char *key_name, unsigned char *iv, + EVP_CIPHER_CTX *ctx, +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + EVP_MAC_CTX *hctx, +#else // OPENSSL_VERSION_NUMBER < 0x30000000L + HMAC_CTX *hctx, +#endif // OPENSSL_VERSION_NUMBER < 0x30000000L + int enc) { + static const auto static_key_name = get_ticket_key_name(); + static const auto static_key = get_ticket_key(); + static const auto static_hmac_key = get_ticket_hmac_key(); +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + static const auto ticket_hmac = EVP_MD_fetch(nullptr, "sha256", nullptr); + static const auto aes_256_cbc = + EVP_CIPHER_fetch(nullptr, "AES-256-CBC", nullptr); +#else // OPENSSL_VERSION_NUMBER < 0x30000000L + static const auto ticket_hmac = EVP_sha256(); + static const auto aes_256_cbc = EVP_aes_256_cbc(); +#endif // OPENSSL_VERSION_NUMBER < 0x30000000L + + if (enc) { + ptls_openssl_random_bytes(iv, EVP_MAX_IV_LENGTH); + + std::ranges::copy(static_key_name, key_name); + + if (!EVP_EncryptInit_ex(ctx, aes_256_cbc, nullptr, static_key.data(), iv)) { + return 0; + } +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + auto params = std::to_array({ + OSSL_PARAM_construct_octet_string( + OSSL_MAC_PARAM_KEY, const_cast(static_hmac_key.data()), + static_hmac_key.size()), + OSSL_PARAM_construct_utf8_string( + OSSL_MAC_PARAM_DIGEST, + const_cast(EVP_MD_get0_name(ticket_hmac)), 0), + OSSL_PARAM_construct_end(), + }); + if (!EVP_MAC_CTX_set_params(hctx, params.data())) { + /* TODO Which value should we return on error? */ + return 0; + } +#else // OPENSSL_VERSION_NUMBER < 0x30000000L + if (!HMAC_Init_ex(hctx, static_hmac_key.data(), + static_cast(static_hmac_key.size()), ticket_hmac, + nullptr)) { + return 0; + } +#endif // OPENSSL_VERSION_NUMBER < 0x30000000L + + return 1; + } + + if (!std::ranges::equal(std::span{key_name, static_key_name.size()}, + static_key_name)) { + return 0; + } + + if (!EVP_DecryptInit_ex(ctx, aes_256_cbc, nullptr, static_key.data(), iv)) { + return 0; + } +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + auto params = std::to_array({ + OSSL_PARAM_construct_octet_string( + OSSL_MAC_PARAM_KEY, const_cast(static_hmac_key.data()), + static_hmac_key.size()), + OSSL_PARAM_construct_utf8_string( + OSSL_MAC_PARAM_DIGEST, const_cast(EVP_MD_get0_name(ticket_hmac)), + 0), + OSSL_PARAM_construct_end(), + }); + if (!EVP_MAC_CTX_set_params(hctx, params.data())) { + /* TODO Which value should we return on error? */ + return 0; + } +#else // OPENSSL_VERSION_NUMBER < 0x30000000L + if (!HMAC_Init_ex(hctx, static_hmac_key.data(), + static_cast(static_hmac_key.size()), ticket_hmac, + nullptr)) { + return 0; + } +#endif // OPENSSL_VERSION_NUMBER < 0x30000000L + + return 1; +} +} // namespace + +namespace { +int encrypt_ticket_cb(ptls_encrypt_ticket_t *encrypt_ticket, ptls_t *ptls, + int is_encrypt, ptls_buffer_t *dst, ptls_iovec_t src) { + int rv; + auto conn_ref = + static_cast(*ptls_get_data_ptr(ptls)); + auto conn = conn_ref->get_conn(conn_ref); + uint32_t ver; + + if (is_encrypt) { + ver = htonl(ngtcp2_conn_get_negotiated_version2(conn)); + // TODO Replace std::make_unique with + // std::make_unique_for_overwrite when it is available. + auto buf = std::make_unique(src.len + sizeof(ver)); + auto p = std::ranges::copy_n(src.base, as_signed(src.len), buf.get()).out; + p = std::ranges::copy_n(reinterpret_cast(&ver), sizeof(ver), p) + .out; + + src.base = buf.get(); + src.len = as_unsigned(p - buf.get()); + +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + rv = ptls_openssl_encrypt_ticket_evp(dst, src, ticket_key_cb); +#else // OPENSSL_VERSION_NUMBER < 0x30000000L + rv = ptls_openssl_encrypt_ticket(dst, src, ticket_key_cb); +#endif // OPENSSL_VERSION_NUMBER < 0x30000000L + if (rv != 0) { + return -1; + } + + return 0; + } + +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + rv = ptls_openssl_decrypt_ticket_evp(dst, src, ticket_key_cb); +#else // OPENSSL_VERSION_NUMBER < 0x30000000L + rv = ptls_openssl_decrypt_ticket(dst, src, ticket_key_cb); +#endif // OPENSSL_VERSION_NUMBER < 0x30000000L + if (rv != 0) { + return -1; + } + + if (dst->off < sizeof(ver)) { + return -1; + } + + memcpy(&ver, dst->base + dst->off - sizeof(ver), sizeof(ver)); + + if (ngtcp2_conn_get_client_chosen_version2(conn) != ntohl(ver)) { + return -1; + } + + dst->off -= sizeof(ver); + + return 0; +} + +ptls_encrypt_ticket_t encrypt_ticket = {encrypt_ticket_cb}; +} // namespace + +namespace { +ptls_key_exchange_algorithm_t *key_exchanges[] = { +#if PTLS_OPENSSL_HAVE_X25519 + &ptls_openssl_x25519, +#endif // PTLS_OPENSSL_X25519 + &ptls_openssl_secp256r1, + &ptls_openssl_secp384r1, + &ptls_openssl_secp521r1, +#if PTLS_OPENSSL_HAVE_X25519MLKEM768 + &ptls_openssl_x25519mlkem768, +#endif // PTLS_OPENSSL_HAVE_X25519MLKEM768 + nullptr, +}; +} // namespace + +namespace { +ptls_cipher_suite_t *cipher_suites[] = { + &ptls_openssl_aes128gcmsha256, + &ptls_openssl_aes256gcmsha384, +#if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305 + &ptls_openssl_chacha20poly1305sha256, +#endif // PTLS_OPENSSL_CHACHA20POLY1305SHA256 + nullptr, +}; +} // namespace + +TLSServerContext::TLSServerContext() + : ctx_{ + .random_bytes = ptls_openssl_random_bytes, + .get_time = &ptls_get_time, + .key_exchanges = key_exchanges, + .cipher_suites = cipher_suites, + .ticket_lifetime = 86400, + .require_dhe_on_psk = 1, + .server_cipher_preference = 1, + .encrypt_ticket = &encrypt_ticket, + } {} + +TLSServerContext::~TLSServerContext() { + if (sign_cert_.key) { + ptls_openssl_dispose_sign_certificate(&sign_cert_); + } + + for (size_t i = 0; i < ctx_.certificates.count; ++i) { + free(ctx_.certificates.list[i].base); + } + free(ctx_.certificates.list); +} + +ptls_context_t *TLSServerContext::get_native_handle() { return &ctx_; } + +std::expected TLSServerContext::init(const char *private_key_file, + const char *cert_file, + AppProtocol app_proto) { + switch (app_proto) { + case AppProtocol::H3: + ctx_.on_client_hello = &on_client_hello_h3; + + break; + case AppProtocol::HQ: + ctx_.on_client_hello = &on_client_hello_hq; + + break; + } + + if (ngtcp2_crypto_picotls_configure_server_context(&ctx_) != 0) { + std::println(stderr, + "ngtcp2_crypto_picotls_configure_server_context failed"); + return std::unexpected{Error::CRYPTO}; + } + + if (ptls_load_certificates(&ctx_, cert_file) != 0) { + std::println(stderr, "ptls_load_certificates failed"); + return std::unexpected{Error::CRYPTO}; + } + + if (auto rv = load_private_key(private_key_file); !rv) { + return rv; + } + + if (config.verify_client) { + ctx_.require_client_authentication = 1; + } + + return {}; +} + +std::expected +TLSServerContext::load_private_key(const char *private_key_file) { + auto fp = fopen(private_key_file, "rb"); + if (fp == nullptr) { + std::println(stderr, "Could not open private key file {}: {}", + private_key_file, strerror(errno)); + return std::unexpected{Error::IO}; + } + + auto fp_d = defer([fp] { fclose(fp); }); + + auto pkey = PEM_read_PrivateKey(fp, nullptr, nullptr, nullptr); + if (pkey == nullptr) { + std::println(stderr, "Could not read private key file {}", + private_key_file); + return std::unexpected{Error::IO}; + } + + auto pkey_d = defer([pkey] { EVP_PKEY_free(pkey); }); + + if (ptls_openssl_init_sign_certificate(&sign_cert_, pkey) != 0) { + std::println(stderr, "ptls_openssl_init_sign_certificate failed"); + return std::unexpected{Error::CRYPTO}; + } + + ctx_.sign_certificate = &sign_cert_.super; + + return {}; +} + +void TLSServerContext::enable_keylog() { ctx_.log_event = &log_event; } diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_context_picotls.h b/deps/ngtcp2/ngtcp2/examples/tls_server_context_picotls.h new file mode 100644 index 000000000000..862568f96bed --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_context_picotls.h @@ -0,0 +1,58 @@ +/* + * ngtcp2 + * + * Copyright (c) 2022 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SERVER_CONTEXT_PICOTLS_H +#define TLS_SERVER_CONTEXT_PICOTLS_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include + +#include "shared.h" + +using namespace ngtcp2; + +class TLSServerContext { +public: + TLSServerContext(); + ~TLSServerContext(); + + std::expected init(const char *private_key_file, + const char *cert_file, AppProtocol app_proto); + + ptls_context_t *get_native_handle(); + + void enable_keylog(); + +private: + std::expected load_private_key(const char *private_key_file); + + ptls_context_t ctx_; + ptls_openssl_sign_certificate_t sign_cert_{}; +}; + +#endif // !defined(TLS_SERVER_CONTEXT_PICOTLS_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_context_quictls.cc b/deps/ngtcp2/ngtcp2/examples/tls_server_context_quictls.cc new file mode 100644 index 000000000000..9c93fdc9ac9b --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_context_quictls.cc @@ -0,0 +1,318 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_server_context_quictls.h" + +#include +#include +#include +#include +#include + +#include + +#include + +#include "server_base.h" +#include "template.h" + +namespace { +auto _ = [] { + if (ngtcp2_crypto_quictls_init() != 0) { + assert(0); + abort(); + } + + return 0; +}(); +} // namespace + +extern Config config; + +TLSServerContext::~TLSServerContext() { + if (ssl_ctx_) { + SSL_CTX_free(ssl_ctx_); + } +} + +SSL_CTX *TLSServerContext::get_native_handle() const { return ssl_ctx_; } + +namespace { +int alpn_select_proto_h3_cb(SSL *ssl, const unsigned char **out, + unsigned char *outlen, const unsigned char *in, + unsigned int inlen, void *arg) { + auto conn_ref = static_cast(SSL_get_app_data(ssl)); + auto h = static_cast(conn_ref->user_data); + // This should be the negotiated version, but we have not set the + // negotiated version when this callback is called. + auto version = ngtcp2_conn_get_client_chosen_version2(h->conn()); + + switch (version) { + case NGTCP2_PROTO_VER_V1: + case NGTCP2_PROTO_VER_V2: + break; + default: + if (!config.quiet) { + std::println(stderr, "Unexpected quic protocol version: {:#x}", version); + } + return SSL_TLSEXT_ERR_ALERT_FATAL; + } + + for (auto s = std::span{in, inlen}; s.size() >= H3_ALPN_V1.size(); + s = s.subspan(s[0] + 1)) { + if (std::ranges::equal(H3_ALPN_V1, s.first(H3_ALPN_V1.size()))) { + *out = &s[1]; + *outlen = s[0]; + return SSL_TLSEXT_ERR_OK; + } + } + + if (!config.quiet) { + std::println(stderr, "Client did not present ALPN {}", + as_string_view(H3_ALPN_V1.subspan(1))); + } + + return SSL_TLSEXT_ERR_ALERT_FATAL; +} +} // namespace + +namespace { +int alpn_select_proto_hq_cb(SSL *ssl, const unsigned char **out, + unsigned char *outlen, const unsigned char *in, + unsigned int inlen, void *arg) { + auto conn_ref = static_cast(SSL_get_app_data(ssl)); + auto h = static_cast(conn_ref->user_data); + // This should be the negotiated version, but we have not set the + // negotiated version when this callback is called. + auto version = ngtcp2_conn_get_client_chosen_version2(h->conn()); + + switch (version) { + case NGTCP2_PROTO_VER_V1: + case NGTCP2_PROTO_VER_V2: + break; + default: + if (!config.quiet) { + std::println(stderr, "Unexpected quic protocol version: {:#x}", version); + } + return SSL_TLSEXT_ERR_ALERT_FATAL; + } + + for (auto s = std::span{in, inlen}; s.size() >= HQ_ALPN_V1.size(); + s = s.subspan(s[0] + 1)) { + if (std::ranges::equal(HQ_ALPN_V1, s.first(HQ_ALPN_V1.size()))) { + *out = &s[1]; + *outlen = s[0]; + return SSL_TLSEXT_ERR_OK; + } + } + + if (!config.quiet) { + std::println(stderr, "Client did not present ALPN {}", + as_string_view(HQ_ALPN_V1.subspan(1))); + } + + return SSL_TLSEXT_ERR_ALERT_FATAL; +} +} // namespace + +namespace { +int verify_cb(int preverify_ok, X509_STORE_CTX *ctx) { + // We don't verify the client certificate. Just request it for the + // testing purpose. + return 1; +} +} // namespace + +#ifndef LIBRESSL_VERSION_NUMBER +namespace { +int gen_ticket_cb(SSL *ssl, void *arg) { + auto conn_ref = static_cast(SSL_get_app_data(ssl)); + auto h = static_cast(conn_ref->user_data); + auto ver = htonl(ngtcp2_conn_get_negotiated_version2(h->conn())); + + if (!SSL_SESSION_set1_ticket_appdata(SSL_get0_session(ssl), &ver, + sizeof(ver))) { + return 0; + } + + return 1; +} +} // namespace + +namespace { +SSL_TICKET_RETURN decrypt_ticket_cb(SSL *ssl, SSL_SESSION *session, + const unsigned char *keyname, + size_t keynamelen, SSL_TICKET_STATUS status, + void *arg) { + switch (status) { + case SSL_TICKET_EMPTY: + case SSL_TICKET_NO_DECRYPT: + return SSL_TICKET_RETURN_IGNORE_RENEW; + } + + uint8_t *pver; + uint32_t ver; + size_t verlen; + + if (!SSL_SESSION_get0_ticket_appdata( + session, reinterpret_cast(&pver), &verlen) || + verlen != sizeof(ver)) { + switch (status) { + case SSL_TICKET_SUCCESS: + return SSL_TICKET_RETURN_IGNORE; + case SSL_TICKET_SUCCESS_RENEW: + default: + return SSL_TICKET_RETURN_IGNORE_RENEW; + } + } + + memcpy(&ver, pver, sizeof(ver)); + + auto conn_ref = static_cast(SSL_get_app_data(ssl)); + auto h = static_cast(conn_ref->user_data); + + if (ngtcp2_conn_get_client_chosen_version2(h->conn()) != ntohl(ver)) { + switch (status) { + case SSL_TICKET_SUCCESS: + return SSL_TICKET_RETURN_IGNORE; + case SSL_TICKET_SUCCESS_RENEW: + default: + return SSL_TICKET_RETURN_IGNORE_RENEW; + } + } + + switch (status) { + case SSL_TICKET_SUCCESS: + return SSL_TICKET_RETURN_USE; + case SSL_TICKET_SUCCESS_RENEW: + default: + return SSL_TICKET_RETURN_USE_RENEW; + } +} +} // namespace +#endif // !defined(LIBRESSL_VERSION_NUMBER) + +std::expected TLSServerContext::init(const char *private_key_file, + const char *cert_file, + AppProtocol app_proto) { + static constexpr unsigned char sid_ctx[] = "ngtcp2 server"; + + ssl_ctx_ = SSL_CTX_new(TLS_server_method()); + if (!ssl_ctx_) { + std::println(stderr, "SSL_CTX_new: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (ngtcp2_crypto_quictls_configure_server_context(ssl_ctx_) != 0) { + std::println(stderr, + "ngtcp2_crypto_quictls_configure_server_context failed"); + return std::unexpected{Error::CRYPTO}; + } + + SSL_CTX_set_max_early_data(ssl_ctx_, UINT32_MAX); + + constexpr auto ssl_opts = (SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS) | + SSL_OP_SINGLE_ECDH_USE | + SSL_OP_CIPHER_SERVER_PREFERENCE +#ifndef LIBRESSL_VERSION_NUMBER + | SSL_OP_NO_ANTI_REPLAY +#endif // !defined(LIBRESSL_VERSION_NUMBER) + ; + + SSL_CTX_set_options(ssl_ctx_, ssl_opts); + + if (SSL_CTX_set_ciphersuites(ssl_ctx_, config.ciphers) != 1) { + std::println(stderr, "SSL_CTX_set_ciphersuites: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (SSL_CTX_set1_groups_list(ssl_ctx_, config.groups) != 1) { + std::println(stderr, "SSL_CTX_set1_groups_list failed"); + return std::unexpected{Error::CRYPTO}; + } + + SSL_CTX_set_mode(ssl_ctx_, SSL_MODE_RELEASE_BUFFERS); + + switch (app_proto) { + case AppProtocol::H3: + SSL_CTX_set_alpn_select_cb(ssl_ctx_, alpn_select_proto_h3_cb, nullptr); + break; + case AppProtocol::HQ: + SSL_CTX_set_alpn_select_cb(ssl_ctx_, alpn_select_proto_hq_cb, nullptr); + break; + } + + SSL_CTX_set_default_verify_paths(ssl_ctx_); + + if (SSL_CTX_use_PrivateKey_file(ssl_ctx_, private_key_file, + SSL_FILETYPE_PEM) != 1) { + std::println(stderr, "SSL_CTX_use_PrivateKey_file: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (SSL_CTX_use_certificate_chain_file(ssl_ctx_, cert_file) != 1) { + std::println(stderr, "SSL_CTX_use_certificate_chain_file: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (SSL_CTX_check_private_key(ssl_ctx_) != 1) { + std::println(stderr, "SSL_CTX_check_private_key: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + SSL_CTX_set_session_id_context(ssl_ctx_, sid_ctx, sizeof(sid_ctx) - 1); + + if (config.verify_client) { + SSL_CTX_set_verify(ssl_ctx_, + SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE | + SSL_VERIFY_FAIL_IF_NO_PEER_CERT, + verify_cb); + } + +#ifndef LIBRESSL_VERSION_NUMBER + SSL_CTX_set_session_ticket_cb(ssl_ctx_, gen_ticket_cb, decrypt_ticket_cb, + nullptr); +#endif // !defined(LIBRESSL_VERSION_NUMBER) + + return {}; +} + +extern std::ofstream keylog_file; + +namespace { +void keylog_callback(const SSL *ssl, const char *line) { + keylog_file.write(line, static_cast(strlen(line))); + keylog_file.put('\n'); + keylog_file.flush(); +} +} // namespace + +void TLSServerContext::enable_keylog() { + SSL_CTX_set_keylog_callback(ssl_ctx_, keylog_callback); +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_context_quictls.h b/deps/ngtcp2/ngtcp2/examples/tls_server_context_quictls.h new file mode 100644 index 000000000000..ccb485c48ac0 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_context_quictls.h @@ -0,0 +1,54 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SERVER_CONTEXT_QUICTLS_H +#define TLS_SERVER_CONTEXT_QUICTLS_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +#include "shared.h" + +using namespace ngtcp2; + +class TLSServerContext { +public: + TLSServerContext() = default; + ~TLSServerContext(); + + std::expected init(const char *private_key_file, + const char *cert_file, AppProtocol app_proto); + + SSL_CTX *get_native_handle() const; + + void enable_keylog(); + +private: + SSL_CTX *ssl_ctx_{}; +}; + +#endif // !defined(TLS_SERVER_CONTEXT_QUICTLS_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_context_wolfssl.cc b/deps/ngtcp2/ngtcp2/examples/tls_server_context_wolfssl.cc new file mode 100644 index 000000000000..5245b555c8f8 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_context_wolfssl.cc @@ -0,0 +1,242 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_server_context_wolfssl.h" + +#include +#include +#include +#include + +#include + +#include "server_base.h" +#include "template.h" + +extern Config config; + +TLSServerContext::~TLSServerContext() { + if (ssl_ctx_) { + wolfSSL_CTX_free(ssl_ctx_); + } +} + +WOLFSSL_CTX *TLSServerContext::get_native_handle() const { return ssl_ctx_; } + +namespace { +int alpn_select_proto_h3_cb(WOLFSSL *ssl, const unsigned char **out, + unsigned char *outlen, const unsigned char *in, + unsigned int inlen, void *arg) { + auto conn_ref = + static_cast(wolfSSL_get_app_data(ssl)); + auto h = static_cast(conn_ref->user_data); + // This should be the negotiated version, but we have not set the + // negotiated version when this callback is called. + auto version = ngtcp2_conn_get_client_chosen_version2(h->conn()); + + switch (version) { + case NGTCP2_PROTO_VER_V1: + case NGTCP2_PROTO_VER_V2: + break; + default: + if (!config.quiet) { + std::println(stderr, "Unexpected quic protocol version: {:#x}", version); + } + return SSL_TLSEXT_ERR_ALERT_FATAL; + } + + for (auto s = std::span{in, inlen}; s.size() >= H3_ALPN_V1.size(); + s = s.subspan(s[0] + 1)) { + if (std::ranges::equal(H3_ALPN_V1, s.first(H3_ALPN_V1.size()))) { + *out = &s[1]; + *outlen = s[0]; + return SSL_TLSEXT_ERR_OK; + } + } + + if (!config.quiet) { + std::println(stderr, "Client did not present ALPN {}", + as_string_view(H3_ALPN_V1.subspan(1))); + } + + return SSL_TLSEXT_ERR_ALERT_FATAL; +} +} // namespace + +namespace { +int alpn_select_proto_hq_cb(WOLFSSL *ssl, const unsigned char **out, + unsigned char *outlen, const unsigned char *in, + unsigned int inlen, void *arg) { + auto conn_ref = + static_cast(wolfSSL_get_app_data(ssl)); + auto h = static_cast(conn_ref->user_data); + // This should be the negotiated version, but we have not set the + // negotiated version when this callback is called. + auto version = ngtcp2_conn_get_client_chosen_version2(h->conn()); + + switch (version) { + case NGTCP2_PROTO_VER_V1: + case NGTCP2_PROTO_VER_V2: + break; + default: + if (!config.quiet) { + std::println(stderr, "Unexpected quic protocol version: {:#x}", version); + } + return SSL_TLSEXT_ERR_ALERT_FATAL; + } + + for (auto s = std::span{in, inlen}; s.size() >= HQ_ALPN_V1.size(); + s = s.subspan(s[0] + 1)) { + if (std::ranges::equal(HQ_ALPN_V1, s.first(HQ_ALPN_V1.size()))) { + *out = &s[1]; + *outlen = s[0]; + return SSL_TLSEXT_ERR_OK; + } + } + + if (!config.quiet) { + std::println(stderr, "Client did not present ALPN {}", + as_string_view(HQ_ALPN_V1.subspan(1))); + } + + return SSL_TLSEXT_ERR_ALERT_FATAL; +} +} // namespace + +namespace { +int verify_cb(int preverify_ok, X509_STORE_CTX *ctx) { + // We don't verify the client certificate. Just request it for the + // testing purpose. + return 1; +} +} // namespace + +std::expected TLSServerContext::init(const char *private_key_file, + const char *cert_file, + AppProtocol app_proto) { + static constexpr unsigned char sid_ctx[] = "ngtcp2 server"; + +#ifdef DEBUG_WOLFSSL + if (!config.quiet) { + /*wolfSSL_Debugging_ON();*/ + } +#endif // defined(DEBUG_WOLFSSL) + + ssl_ctx_ = wolfSSL_CTX_new(wolfTLSv1_3_server_method()); + if (!ssl_ctx_) { + std::println(stderr, "wolfSSL_CTX_new: {}", + wolfSSL_ERR_error_string(wolfSSL_ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (ngtcp2_crypto_wolfssl_configure_server_context(ssl_ctx_) != 0) { + std::println(stderr, + "ngtcp2_crypto_wolfssl_configure_server_context failed"); + return std::unexpected{Error::CRYPTO}; + } + +#ifdef WOLFSSL_EARLY_DATA + wolfSSL_CTX_set_max_early_data(ssl_ctx_, UINT32_MAX); +#endif // defined(WOLFSSL_EARLY_DATA) + + constexpr auto ssl_opts = + (WOLFSSL_OP_ALL & ~WOLFSSL_OP_DONT_INSERT_EMPTY_FRAGMENTS) | + WOLFSSL_OP_SINGLE_ECDH_USE | WOLFSSL_OP_CIPHER_SERVER_PREFERENCE; + + wolfSSL_CTX_set_options(ssl_ctx_, ssl_opts); + + if (wolfSSL_CTX_set_cipher_list(ssl_ctx_, config.ciphers) != 1) { + std::println(stderr, "wolfSSL_CTX_set_cipher_list: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (wolfSSL_CTX_set1_groups_list(ssl_ctx_, + const_cast(config.groups)) != 1) { + std::println(stderr, "wolfSSL_CTX_set1_groups_list({}) failed", + config.groups); + return std::unexpected{Error::CRYPTO}; + } + + wolfSSL_CTX_set_mode(ssl_ctx_, SSL_MODE_RELEASE_BUFFERS); + + switch (app_proto) { + case AppProtocol::H3: + wolfSSL_CTX_set_alpn_select_cb(ssl_ctx_, alpn_select_proto_h3_cb, nullptr); + break; + case AppProtocol::HQ: + wolfSSL_CTX_set_alpn_select_cb(ssl_ctx_, alpn_select_proto_hq_cb, nullptr); + break; + } + + wolfSSL_CTX_set_default_verify_paths(ssl_ctx_); + + if (wolfSSL_CTX_use_PrivateKey_file(ssl_ctx_, private_key_file, + SSL_FILETYPE_PEM) != 1) { + std::println(stderr, "wolfSSL_CTX_use_PrivateKey_file: {}", + wolfSSL_ERR_error_string(wolfSSL_ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (wolfSSL_CTX_use_certificate_chain_file(ssl_ctx_, cert_file) != 1) { + std::println(stderr, "wolfSSL_CTX_use_certificate_chain_file: {}", + wolfSSL_ERR_error_string(wolfSSL_ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + if (wolfSSL_CTX_check_private_key(ssl_ctx_) != 1) { + std::println(stderr, "wolfSSL_CTX_check_private_key: {}", + wolfSSL_ERR_error_string(wolfSSL_ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + wolfSSL_CTX_set_session_id_context(ssl_ctx_, sid_ctx, sizeof(sid_ctx) - 1); + + if (config.verify_client) { + wolfSSL_CTX_set_verify(ssl_ctx_, + WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_CLIENT_ONCE | + WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT, + verify_cb); + } + + return {}; +} + +extern std::ofstream keylog_file; + +#ifdef HAVE_SECRET_CALLBACK +namespace { +void keylog_callback(const WOLFSSL *ssl, const char *line) { + keylog_file.write(line, static_cast(strlen(line))); + keylog_file.put('\n'); + keylog_file.flush(); +} +} // namespace +#endif // defined(HAVE_SECRET_CALLBACK) + +void TLSServerContext::enable_keylog() { +#ifdef HAVE_SECRET_CALLBACK + wolfSSL_CTX_set_keylog_callback(ssl_ctx_, keylog_callback); +#endif // defined(HAVE_SECRET_CALLBACK) +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_context_wolfssl.h b/deps/ngtcp2/ngtcp2/examples/tls_server_context_wolfssl.h new file mode 100644 index 000000000000..2f235ca4570b --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_context_wolfssl.h @@ -0,0 +1,55 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SERVER_CONTEXT_WOLFSSL_H +#define TLS_SERVER_CONTEXT_WOLFSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include + +#include "shared.h" + +using namespace ngtcp2; + +class TLSServerContext { +public: + TLSServerContext() = default; + ~TLSServerContext(); + + std::expected init(const char *private_key_file, + const char *cert_file, AppProtocol app_proto); + + WOLFSSL_CTX *get_native_handle() const; + + void enable_keylog(); + +private: + WOLFSSL_CTX *ssl_ctx_{}; +}; + +#endif // !defined(TLS_SERVER_CONTEXT_WOLFSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_session.h b/deps/ngtcp2/ngtcp2/examples/tls_server_session.h new file mode 100644 index 000000000000..652f76dbdfca --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_session.h @@ -0,0 +1,56 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SERVER_SESSION_H +#define TLS_SERVER_SESSION_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#ifdef WITH_EXAMPLE_QUICTLS +# include "tls_server_session_quictls.h" +#endif // defined(WITH_EXAMPLE_QUICTLS) + +#ifdef WITH_EXAMPLE_GNUTLS +# include "tls_server_session_gnutls.h" +#endif // defined(WITH_EXAMPLE_GNUTLS) + +#ifdef WITH_EXAMPLE_BORINGSSL +# include "tls_server_session_boringssl.h" +#endif // defined(WITH_EXAMPLE_BORINGSSL) + +#ifdef WITH_EXAMPLE_PICOTLS +# include "tls_server_session_picotls.h" +#endif // defined(WITH_EXAMPLE_PICOTLS) + +#ifdef WITH_EXAMPLE_WOLFSSL +# include "tls_server_session_wolfssl.h" +#endif // defined(WITH_EXAMPLE_WOLFSSL) + +#ifdef WITH_EXAMPLE_OSSL +# include "tls_server_session_ossl.h" +#endif // defined(WITH_EXAMPLE_OSSL) + +#endif // !defined(TLS_SERVER_SESSION_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_session_boringssl.cc b/deps/ngtcp2/ngtcp2/examples/tls_server_session_boringssl.cc new file mode 100644 index 000000000000..c2f28045496c --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_session_boringssl.cc @@ -0,0 +1,78 @@ +/* + * ngtcp2 + * + * Copyright (c) 2021 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_server_session_boringssl.h" + +#include + +#include + +#include "tls_server_context_boringssl.h" +#include "server_base.h" + +extern Config config; + +std::expected +TLSServerSession::init(const TLSServerContext &tls_ctx, HandlerBase *handler) { + auto ssl_ctx = tls_ctx.get_native_handle(); + + ssl_ = SSL_new(ssl_ctx); + if (!ssl_) { + std::println(stderr, "SSL_new: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + SSL_set_app_data(ssl_, handler->conn_ref()); + SSL_set_accept_state(ssl_); + SSL_set_early_data_enabled(ssl_, 1); + + std::array quic_early_data_ctx; + ngtcp2_transport_params params; + ngtcp2_transport_params_default(¶ms); + params.initial_max_streams_bidi = config.max_streams_bidi; + params.initial_max_streams_uni = config.max_streams_uni; + params.initial_max_stream_data_bidi_local = config.max_stream_data_bidi_local; + params.initial_max_stream_data_bidi_remote = + config.max_stream_data_bidi_remote; + params.initial_max_stream_data_uni = config.max_stream_data_uni; + params.initial_max_data = config.max_data; + + auto quic_early_data_ctxlen = ngtcp2_transport_params_encode( + quic_early_data_ctx.data(), quic_early_data_ctx.size(), ¶ms); + if (quic_early_data_ctxlen < 0) { + std::println(stderr, "ngtcp2_transport_params_encode: {}", + ngtcp2_strerror(static_cast(quic_early_data_ctxlen))); + return std::unexpected{Error::CRYPTO}; + } + + if (SSL_set_quic_early_data_context(ssl_, quic_early_data_ctx.data(), + as_unsigned(quic_early_data_ctxlen)) != + 1) { + std::println(stderr, "SSL_set_quic_early_data_context failed"); + return std::unexpected{Error::CRYPTO}; + } + + return {}; +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_session_boringssl.h b/deps/ngtcp2/ngtcp2/examples/tls_server_session_boringssl.h new file mode 100644 index 000000000000..3599e9a6c120 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_session_boringssl.h @@ -0,0 +1,50 @@ +/* + * ngtcp2 + * + * Copyright (c) 2021 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SERVER_SESSION_BORINGSSL_H +#define TLS_SERVER_SESSION_BORINGSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include "tls_session_base_quictls.h" +#include "shared.h" + +using namespace ngtcp2; + +class TLSServerContext; +class HandlerBase; + +class TLSServerSession : public TLSSessionBase { +public: + TLSServerSession() = default; + + std::expected init(const TLSServerContext &tls_ctx, + HandlerBase *handler); + // ticket is sent automatically. + std::expected send_session_ticket() { return {}; } +}; + +#endif // !defined(TLS_SERVER_SESSION_BORINGSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_session_ossl.cc b/deps/ngtcp2/ngtcp2/examples/tls_server_session_ossl.cc new file mode 100644 index 000000000000..c0e3a71d1d31 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_session_ossl.cc @@ -0,0 +1,55 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_server_session_ossl.h" + +#include + +#include "tls_server_context_ossl.h" +#include "server_base.h" + +std::expected +TLSServerSession::init(const TLSServerContext &tls_ctx, HandlerBase *handler) { + auto ssl_ctx = tls_ctx.get_native_handle(); + + auto ssl = SSL_new(ssl_ctx); + if (!ssl) { + std::println(stderr, "SSL_new: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + ngtcp2_crypto_ossl_ctx_set_ssl(ossl_ctx_, ssl); + + if (ngtcp2_crypto_ossl_configure_server_session(ssl) != 0) { + std::println(stderr, "ngtcp2_crypto_ossl_configure_server_session failed"); + return std::unexpected{Error::CRYPTO}; + } + + SSL_set_app_data(ssl, handler->conn_ref()); + SSL_set_accept_state(ssl); + SSL_set_quic_tls_early_data_enabled(ssl, 1); + + return {}; +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_session_ossl.h b/deps/ngtcp2/ngtcp2/examples/tls_server_session_ossl.h new file mode 100644 index 000000000000..6f859e25e8d6 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_session_ossl.h @@ -0,0 +1,50 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SERVER_SESSION_OSSL_H +#define TLS_SERVER_SESSION_OSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include "tls_session_base_ossl.h" +#include "shared.h" + +using namespace ngtcp2; + +class TLSServerContext; +class HandlerBase; + +class TLSServerSession : public TLSSessionBase { +public: + TLSServerSession() = default; + + std::expected init(const TLSServerContext &tls_ctx, + HandlerBase *handler); + // ticket is sent automatically. + std::expected send_session_ticket() { return {}; } +}; + +#endif // !defined(TLS_SERVER_SESSION_OSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_session_picotls.cc b/deps/ngtcp2/ngtcp2/examples/tls_server_session_picotls.cc new file mode 100644 index 000000000000..6f4dbf568aca --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_session_picotls.cc @@ -0,0 +1,66 @@ +/* + * ngtcp2 + * + * Copyright (c) 2022 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_server_session_picotls.h" + +#include + +#include + +#include "tls_server_context_picotls.h" +#include "server_base.h" +#include "util.h" + +using namespace ngtcp2; + +extern Config config; + +std::expected TLSServerSession::init(TLSServerContext &tls_ctx, + HandlerBase *handler) { + cptls_.ptls = ptls_server_new(tls_ctx.get_native_handle()); + if (!cptls_.ptls) { + std::println(stderr, "ptls_server_new failed"); + return std::unexpected{Error::CRYPTO}; + } + + *ptls_get_data_ptr(cptls_.ptls) = handler->conn_ref(); + + cptls_.handshake_properties.additional_extensions = + new ptls_raw_extension_t[2]{ + { + .type = UINT16_MAX, + }, + { + .type = UINT16_MAX, + }, + }; + + if (ngtcp2_crypto_picotls_configure_server_session(&cptls_) != 0) { + std::println(stderr, + "ngtcp2_crypto_picotls_configure_server_session failed"); + return std::unexpected{Error::CRYPTO}; + } + + return {}; +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_session_picotls.h b/deps/ngtcp2/ngtcp2/examples/tls_server_session_picotls.h new file mode 100644 index 000000000000..fb15ee81f4dd --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_session_picotls.h @@ -0,0 +1,50 @@ +/* + * ngtcp2 + * + * Copyright (c) 2022 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SERVER_SESSION_PICOTLS_H +#define TLS_SERVER_SESSION_PICOTLS_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include "tls_session_base_picotls.h" +#include "shared.h" + +using namespace ngtcp2; + +class TLSServerContext; +class HandlerBase; + +class TLSServerSession : public TLSSessionBase { +public: + TLSServerSession() = default; + + std::expected init(TLSServerContext &tls_ctx, + HandlerBase *handler); + // ticket is sent automatically. + std::expected send_session_ticket() { return {}; } +}; + +#endif // !defined(TLS_SERVER_SESSION_PICOTLS_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_session_quictls.cc b/deps/ngtcp2/ngtcp2/examples/tls_server_session_quictls.cc new file mode 100644 index 000000000000..7379f3900404 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_session_quictls.cc @@ -0,0 +1,50 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_server_session_quictls.h" + +#include + +#include "tls_server_context_quictls.h" +#include "server_base.h" + +std::expected +TLSServerSession::init(const TLSServerContext &tls_ctx, HandlerBase *handler) { + auto ssl_ctx = tls_ctx.get_native_handle(); + + ssl_ = SSL_new(ssl_ctx); + if (!ssl_) { + std::println(stderr, "SSL_new: {}", + ERR_error_string(ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + SSL_set_app_data(ssl_, handler->conn_ref()); + SSL_set_accept_state(ssl_); +#ifndef LIBRESSL_VERSION_NUMBER + SSL_set_quic_early_data_enabled(ssl_, 1); +#endif // !defined(LIBRESSL_VERSION_NUMBER) + + return {}; +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_session_quictls.h b/deps/ngtcp2/ngtcp2/examples/tls_server_session_quictls.h new file mode 100644 index 000000000000..a5b493bd6bdf --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_session_quictls.h @@ -0,0 +1,50 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SERVER_SESSION_QUICTLS_H +#define TLS_SERVER_SESSION_QUICTLS_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include "tls_session_base_quictls.h" +#include "shared.h" + +using namespace ngtcp2; + +class TLSServerContext; +class HandlerBase; + +class TLSServerSession : public TLSSessionBase { +public: + TLSServerSession() = default; + + std::expected init(const TLSServerContext &tls_ctx, + HandlerBase *handler); + // ticket is sent automatically. + std::expected send_session_ticket() { return {}; } +}; + +#endif // !defined(TLS_SERVER_SESSION_QUICTLS_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_session_wolfssl.cc b/deps/ngtcp2/ngtcp2/examples/tls_server_session_wolfssl.cc new file mode 100644 index 000000000000..dce9e47aa8fb --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_session_wolfssl.cc @@ -0,0 +1,50 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_server_session_wolfssl.h" + +#include "tls_server_context_wolfssl.h" +#include "server_base.h" + +std::expected +TLSServerSession::init(const TLSServerContext &tls_ctx, HandlerBase *handler) { + auto ssl_ctx = tls_ctx.get_native_handle(); + + ssl_ = wolfSSL_new(ssl_ctx); + if (!ssl_) { + std::println(stderr, "wolfSSL_new: {}", + wolfSSL_ERR_error_string(wolfSSL_ERR_get_error(), nullptr)); + return std::unexpected{Error::CRYPTO}; + } + + wolfSSL_set_app_data(ssl_, handler->conn_ref()); + wolfSSL_set_accept_state(ssl_); +#ifdef WOLFSSL_EARLY_DATA + wolfSSL_set_quic_early_data_enabled(ssl_, 1); +#endif // defined(WOLFSSL_EARLY_DATA) + // Just use QUIC v1 + wolfSSL_set_quic_transport_version(ssl_, 0x39); + + return {}; +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_server_session_wolfssl.h b/deps/ngtcp2/ngtcp2/examples/tls_server_session_wolfssl.h new file mode 100644 index 000000000000..8d5f4bcc45ee --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_server_session_wolfssl.h @@ -0,0 +1,50 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SERVER_SESSION_WOLFSSL_H +#define TLS_SERVER_SESSION_WOLFSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include "tls_session_base_wolfssl.h" +#include "shared.h" + +using namespace ngtcp2; + +class TLSServerContext; +class HandlerBase; + +class TLSServerSession : public TLSSessionBase { +public: + TLSServerSession() = default; + + std::expected init(const TLSServerContext &tls_ctx, + HandlerBase *handler); + // ticket is sent automatically. + std::expected send_session_ticket() { return {}; } +}; + +#endif // !defined(TLS_SERVER_SESSION_WOLFSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_session_base_ossl.cc b/deps/ngtcp2/ngtcp2/examples/tls_session_base_ossl.cc new file mode 100644 index 000000000000..cc9edda47c7d --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_session_base_ossl.cc @@ -0,0 +1,77 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_session_base_ossl.h" + +#include + +#include "util.h" +#include "template.h" + +using namespace ngtcp2; +using namespace std::literals; + +TLSSessionBase::TLSSessionBase() { + ngtcp2_crypto_ossl_ctx_new(&ossl_ctx_, nullptr); +} + +TLSSessionBase::~TLSSessionBase() { + auto ssl = ngtcp2_crypto_ossl_ctx_get_ssl(ossl_ctx_); + + if (ssl) { + SSL_set_app_data(ssl, nullptr); + SSL_free(ssl); + } + + ngtcp2_crypto_ossl_ctx_del(ossl_ctx_); +} + +ngtcp2_crypto_ossl_ctx *TLSSessionBase::get_native_handle() const { + return ossl_ctx_; +} + +std::string TLSSessionBase::get_cipher_name() const { + return SSL_get_cipher_name(ngtcp2_crypto_ossl_ctx_get_ssl(ossl_ctx_)); +} + +std::string_view TLSSessionBase::get_negotiated_group() const { + auto ssl = ngtcp2_crypto_ossl_ctx_get_ssl(ossl_ctx_); + auto name = SSL_get0_group_name(ssl); + + if (!name) { + return ""sv; + } + + return name; +} + +std::string TLSSessionBase::get_selected_alpn() const { + auto ssl = ngtcp2_crypto_ossl_ctx_get_ssl(ossl_ctx_); + const unsigned char *alpn = nullptr; + unsigned int alpnlen; + + SSL_get0_alpn_selected(ssl, &alpn, &alpnlen); + + return std::string{alpn, alpn + alpnlen}; +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_session_base_ossl.h b/deps/ngtcp2/ngtcp2/examples/tls_session_base_ossl.h new file mode 100644 index 000000000000..d4de743c8776 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_session_base_ossl.h @@ -0,0 +1,56 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SESSION_BASE_OSSL_H +#define TLS_SESSION_BASE_OSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include + +#include + +#include + +class TLSSessionBase { +public: + TLSSessionBase(); + ~TLSSessionBase(); + + ngtcp2_crypto_ossl_ctx *get_native_handle() const; + + std::string get_cipher_name() const; + std::string_view get_negotiated_group() const; + std::string get_selected_alpn() const; + // Keylog is enabled per SSL_CTX. + void enable_keylog() {} + +protected: + ngtcp2_crypto_ossl_ctx *ossl_ctx_; +}; + +#endif // !defined(TLS_SESSION_BASE_OSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_session_base_picotls.cc b/deps/ngtcp2/ngtcp2/examples/tls_session_base_picotls.cc new file mode 100644 index 000000000000..b8413b41ed0c --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_session_base_picotls.cc @@ -0,0 +1,56 @@ +/* + * ngtcp2 + * + * Copyright (c) 2022 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_session_base_picotls.h" + +TLSSessionBase::TLSSessionBase() { ngtcp2_crypto_picotls_ctx_init(&cptls_); } + +TLSSessionBase::~TLSSessionBase() { + ngtcp2_crypto_picotls_deconfigure_session(&cptls_); + + delete[] cptls_.handshake_properties.additional_extensions; + + if (cptls_.ptls) { + ptls_free(cptls_.ptls); + } +} + +ngtcp2_crypto_picotls_ctx *TLSSessionBase::get_native_handle() { + return &cptls_; +} + +std::string TLSSessionBase::get_cipher_name() const { + auto cs = ptls_get_cipher(cptls_.ptls); + return cs->aead->name; +} + +std::string TLSSessionBase::get_selected_alpn() const { + auto alpn = ptls_get_negotiated_protocol(cptls_.ptls); + + if (!alpn) { + return {}; + } + + return alpn; +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_session_base_picotls.h b/deps/ngtcp2/ngtcp2/examples/tls_session_base_picotls.h new file mode 100644 index 000000000000..a191b7df3ec3 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_session_base_picotls.h @@ -0,0 +1,60 @@ +/* + * ngtcp2 + * + * Copyright (c) 2022 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SESSION_BASE_PICOTLS_H +#define TLS_SESSION_BASE_PICOTLS_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include + +#include + +#include + +class TLSSessionBase { +public: + TLSSessionBase(); + ~TLSSessionBase(); + + ngtcp2_crypto_picotls_ctx *get_native_handle(); + + std::string get_cipher_name() const; + std::string_view get_negotiated_group() const { + using namespace std::literals; + + return ""sv; + } + std::string get_selected_alpn() const; + // TODO make keylog work with picotls + void enable_keylog() {} + +protected: + ngtcp2_crypto_picotls_ctx cptls_; +}; + +#endif // !defined(TLS_SESSION_BASE_PICOTLS_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_session_base_quictls.cc b/deps/ngtcp2/ngtcp2/examples/tls_session_base_quictls.cc new file mode 100644 index 000000000000..8ef5027af6fd --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_session_base_quictls.cc @@ -0,0 +1,99 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_session_base_quictls.h" + +#include + +#include "util.h" +#include "template.h" + +using namespace ngtcp2; +using namespace std::literals; + +TLSSessionBase::~TLSSessionBase() { + if (ssl_) { + SSL_free(ssl_); + } +} + +SSL *TLSSessionBase::get_native_handle() const { return ssl_; } + +std::string TLSSessionBase::get_cipher_name() const { + return SSL_get_cipher_name(ssl_); +} + +std::string_view TLSSessionBase::get_negotiated_group() const { +#ifdef WITH_EXAMPLE_BORINGSSL + return SSL_get_group_name(SSL_get_group_id(ssl_)); +#elif OPENSSL_VERSION_NUMBER >= 0x30000000L + auto name = + SSL_group_to_name(ssl_, static_cast(SSL_get_negotiated_group(ssl_))); + if (!name) { + return ""sv; + } + + return name; +#elif defined(LIBRESSL_VERSION_NUMBER) + return ""sv; +#else // !(defined(WITH_EXAMPLE_BORINGSSL) || + // OPENSSL_VERSION_NUMBER >= 0x30000000L || + // defined(LIBRESSL_VERSION_NUMBER)) + EVP_PKEY *key; + + if (!SSL_get_tmp_key(ssl_, &key)) { + return ""sv; + } + + auto key_del = defer([key] { EVP_PKEY_free(key); }); + + auto nid = EVP_PKEY_id(key); + if (nid == EVP_PKEY_EC) { + auto ec = EVP_PKEY_get0_EC_KEY(key); + + nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec)); + } + + auto name = EC_curve_nid2nist(nid); + if (!name) { + name = OBJ_nid2sn(nid); + if (!name) { + return ""sv; + } + } + + return name; +#endif // !(defined(WITH_EXAMPLE_BORINGSSL) || + // OPENSSL_VERSION_NUMBER >= 0x30000000L || + // defined(LIBRESSL_VERSION_NUMBER)) +} + +std::string TLSSessionBase::get_selected_alpn() const { + const unsigned char *alpn = nullptr; + unsigned int alpnlen; + + SSL_get0_alpn_selected(ssl_, &alpn, &alpnlen); + + return std::string{alpn, alpn + alpnlen}; +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_session_base_quictls.h b/deps/ngtcp2/ngtcp2/examples/tls_session_base_quictls.h new file mode 100644 index 000000000000..4c022a2422dc --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_session_base_quictls.h @@ -0,0 +1,54 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SESSION_BASE_QUICTLS_H +#define TLS_SESSION_BASE_QUICTLS_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include + +#include + +class TLSSessionBase { +public: + TLSSessionBase() = default; + ~TLSSessionBase(); + + SSL *get_native_handle() const; + + std::string get_cipher_name() const; + std::string_view get_negotiated_group() const; + std::string get_selected_alpn() const; + // Keylog is enabled per SSL_CTX. + void enable_keylog() {} + +protected: + SSL *ssl_{}; +}; + +#endif // !defined(TLS_SESSION_BASE_QUICTLS_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_session_base_wolfssl.cc b/deps/ngtcp2/ngtcp2/examples/tls_session_base_wolfssl.cc new file mode 100644 index 000000000000..ce5c2ebe9edb --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_session_base_wolfssl.cc @@ -0,0 +1,63 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_session_base_wolfssl.h" + +#include + +#include "util.h" + +using namespace ngtcp2; + +TLSSessionBase::~TLSSessionBase() { + if (ssl_) { + wolfSSL_free(ssl_); + } +} + +WOLFSSL *TLSSessionBase::get_native_handle() const { return ssl_; } + +std::string TLSSessionBase::get_cipher_name() const { + return wolfSSL_get_cipher_name(ssl_); +} + +std::string_view TLSSessionBase::get_negotiated_group() const { + using namespace std::literals; + + auto name = wolfSSL_get_curve_name(ssl_); + if (!name) { + return ""sv; + } + + return name; +} + +std::string TLSSessionBase::get_selected_alpn() const { + char *alpn = nullptr; + unsigned short alpnlen; + + wolfSSL_ALPN_GetProtocol(ssl_, &alpn, &alpnlen); + + return std::string{alpn, alpn + alpnlen}; +} diff --git a/deps/ngtcp2/ngtcp2/examples/tls_session_base_wolfssl.h b/deps/ngtcp2/ngtcp2/examples/tls_session_base_wolfssl.h new file mode 100644 index 000000000000..b3942bc8e78d --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_session_base_wolfssl.h @@ -0,0 +1,56 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SESSION_BASE_WOLFSSL_H +#define TLS_SESSION_BASE_WOLFSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include +#include + +#include +#include +#include + +class TLSSessionBase { +public: + TLSSessionBase() = default; + ~TLSSessionBase(); + + WOLFSSL *get_native_handle() const; + + std::string get_cipher_name() const; + std::string_view get_negotiated_group() const; + std::string get_selected_alpn() const; + // Keylog is enabled per SSL_CTX. + void enable_keylog() {} + +protected: + WOLFSSL *ssl_{}; +}; + +#endif // !defined(TLS_SESSION_BASE_WOLFSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_shared_boringssl.cc b/deps/ngtcp2/ngtcp2/examples/tls_shared_boringssl.cc new file mode 100644 index 000000000000..eaf673e5a79c --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_shared_boringssl.cc @@ -0,0 +1,89 @@ +/* + * ngtcp2 + * + * Copyright (c) 2024 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_shared_boringssl.h" + +#ifdef HAVE_LIBBROTLI +# include +# include +#endif // defined(HAVE_LIBBROTLI) + +namespace ngtcp2 { + +namespace tls { + +#ifdef HAVE_LIBBROTLI +int cert_compress(SSL *ssl, CBB *out, const uint8_t *in, size_t in_len) { + uint8_t *dest; + + auto compressed_size = BrotliEncoderMaxCompressedSize(in_len); + if (compressed_size == 0) { + return 0; + } + + if (!CBB_reserve(out, &dest, compressed_size)) { + return 0; + } + + if (BrotliEncoderCompress(BROTLI_MAX_QUALITY, BROTLI_DEFAULT_WINDOW, + BROTLI_MODE_GENERIC, in_len, in, &compressed_size, + dest) != BROTLI_TRUE) { + return 0; + } + + if (!CBB_did_write(out, compressed_size)) { + return 0; + } + + return 1; +} + +int cert_decompress(SSL *ssl, CRYPTO_BUFFER **out, size_t uncompressed_len, + const uint8_t *in, size_t in_len) { + uint8_t *dest; + auto buf = CRYPTO_BUFFER_alloc(&dest, uncompressed_len); + auto len = uncompressed_len; + + if (BrotliDecoderDecompress(in_len, in, &len, dest) != + BROTLI_DECODER_RESULT_SUCCESS) { + CRYPTO_BUFFER_free(buf); + + return 0; + } + + if (uncompressed_len != len) { + CRYPTO_BUFFER_free(buf); + + return 0; + } + + *out = buf; + + return 1; +} +#endif // defined(HAVE_LIBBROTLI) + +} // namespace tls + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/examples/tls_shared_boringssl.h b/deps/ngtcp2/ngtcp2/examples/tls_shared_boringssl.h new file mode 100644 index 000000000000..c08712d17948 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_shared_boringssl.h @@ -0,0 +1,51 @@ +/* + * ngtcp2 + * + * Copyright (c) 2024 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SHARED_BORINGSSL_H +#define TLS_SHARED_BORINGSSL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +namespace ngtcp2 { + +namespace tls { + +inline constexpr uint16_t CERTIFICATE_COMPRESSION_ALGO_BROTLI = 2; + +#ifdef HAVE_LIBBROTLI +int cert_compress(SSL *ssl, CBB *out, const uint8_t *in, size_t in_len); + +int cert_decompress(SSL *ssl, CRYPTO_BUFFER **out, size_t uncompressed_len, + const uint8_t *in, size_t in_len); +#endif // defined(HAVE_LIBBROTLI) + +} // namespace tls + +} // namespace ngtcp2 + +#endif // !defined(TLS_SHARED_BORINGSSL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/tls_shared_picotls.cc b/deps/ngtcp2/ngtcp2/examples/tls_shared_picotls.cc new file mode 100644 index 000000000000..fa379dc85586 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_shared_picotls.cc @@ -0,0 +1,59 @@ +/* + * ngtcp2 + * + * Copyright (c) 2023 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "tls_shared_picotls.h" + +#include +#include +#include + +extern std::ofstream keylog_file; + +namespace { +void log_event_cb(ptls_log_event_t *self, ptls_t *ptls, const char *type, + const char *fmt, ...) { + char buf[128]; + va_list ap; + + va_start(ap, fmt); + auto len = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + + if (len < 0 || static_cast(len) >= sizeof(buf)) { + return; + } + + char randhex[PTLS_HELLO_RANDOM_SIZE * 2 + 1]; + + ptls_hexdump(randhex, ptls_get_client_random(ptls).base, + PTLS_HELLO_RANDOM_SIZE); + + keylog_file << type << ' ' << randhex << ' '; + keylog_file.write(buf, len); + keylog_file << '\n'; + keylog_file.flush(); +} +} // namespace + +ptls_log_event_t log_event = {log_event_cb}; diff --git a/deps/ngtcp2/ngtcp2/examples/tls_shared_picotls.h b/deps/ngtcp2/ngtcp2/examples/tls_shared_picotls.h new file mode 100644 index 000000000000..023d771d0542 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/tls_shared_picotls.h @@ -0,0 +1,36 @@ +/* + * ngtcp2 + * + * Copyright (c) 2023 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef TLS_SHARED_PICOTLS_H +#define TLS_SHARED_PICOTLS_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +extern ptls_log_event_t log_event; + +#endif // !defined(TLS_SHARED_PICOTLS_H) diff --git a/deps/ngtcp2/ngtcp2/examples/util.cc b/deps/ngtcp2/ngtcp2/examples/util.cc new file mode 100644 index 000000000000..8baf6e978427 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/util.cc @@ -0,0 +1,928 @@ +/* + * ngtcp2 + * + * Copyright (c) 2017 ngtcp2 contributors + * Copyright (c) 2012 nghttp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "util.h" + +#ifdef HAVE_ARPA_INET_H +# include +#endif // defined(HAVE_ARPA_INET_H) +#ifdef HAVE_NETINET_IN_H +# include +#endif // defined(HAVE_NETINET_IN_H) +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "template.h" + +using namespace std::literals; + +namespace ngtcp2 { + +namespace util { + +std::expected +read_hpke_private_key_pem(const std::filesystem::path &path); + +std::expected, Error> +read_pem(const std::filesystem::path &path, std::string_view name, + std::string_view type); + +std::expected write_pem(const std::filesystem::path &path, + std::string_view name, + std::string_view type, + std::span data); + +std::string decode_hex(std::string_view s) { + assert(s.size() % 2 == 0); + std::string res(s.size() / 2, '0'); + auto p = std::ranges::begin(res); + for (auto it = std::ranges::begin(s); it != std::ranges::end(s); it += 2) { + *p++ = static_cast((hex_to_uint(*it) << 4) | hex_to_uint(*(it + 1))); + } + return res; +} + +namespace { +// format_fraction2 formats |n| as fraction part of integer. |n| is +// considered as fraction, and its precision is 3 digits. The last +// digit is ignored. The precision of the resulting fraction is 2 +// digits. +std::string format_fraction2(uint32_t n) { + n /= 10; + + if (n < 10) { + return {'.', '0', static_cast('0' + n)}; + } + return {'.', static_cast('0' + n / 10), + static_cast('0' + (n % 10))}; +} +} // namespace + +namespace { +// round2even rounds the last digit of |n| so that the n / 10 becomes +// even. +uint64_t round2even(uint64_t n) { + if (n % 10 == 5) { + if ((n / 10) & 1) { + n += 10; + } + } else { + n += 5; + } + return n; +} +} // namespace + +std::string format_durationf(uint64_t ns) { + static constexpr std::string_view units[] = {"us"sv, "ms"sv, "s"sv}; + if (ns < 1000) { + return format_uint(ns) + "ns"; + } + auto unit = 0; + if (ns < 1000000) { + // do nothing + } else if (ns < 1000000000) { + ns /= 1000; + unit = 1; + } else { + ns /= 1000000; + unit = 2; + } + + ns = round2even(ns); + + if (ns / 1000 >= 1000 && unit < 2) { + ns /= 1000; + ++unit; + } + + auto res = format_uint(ns / 1000); + res += format_fraction2(static_cast(ns % 1000)); + res += units[unit]; + + return res; +} + +std::mt19937 make_mt19937() { + std::random_device rd; + return std::mt19937(rd()); +} + +ngtcp2_tstamp timestamp() { + return static_cast( + std::chrono::duration_cast( + std::chrono::steady_clock::now().time_since_epoch()) + .count()); +} + +ngtcp2_tstamp system_clock_now() { + return static_cast( + std::chrono::floor( + std::chrono::system_clock::now().time_since_epoch()) + .count()); +} + +bool numeric_host(const char *hostname) { + return numeric_host(hostname, AF_INET) || numeric_host(hostname, AF_INET6); +} + +bool numeric_host(const char *hostname, int family) { + int rv; + std::array dst; + + rv = inet_pton(family, hostname, dst.data()); + + return rv == 1; +} + +namespace { +uint8_t *hexdump_addr(uint8_t *dest, size_t addr) { + // Lower 32 bits are displayed. + return format_hex(static_cast(addr), dest); +} +} // namespace + +namespace { +uint8_t *hexdump_ascii(uint8_t *dest, std::span data) { + *dest++ = '|'; + + for (auto c : data) { + if (0x20 <= c && c <= 0x7E) { + *dest++ = c; + } else { + *dest++ = '.'; + } + } + + *dest++ = '|'; + + return dest; +} +} // namespace + +namespace { +uint8_t *hexdump8(uint8_t *dest, std::span data) { + for (auto c : data) { + dest = format_hex(c, dest); + *dest++ = ' '; + } + + for (auto i = data.size(); i < 8; ++i) { + *dest++ = ' '; + *dest++ = ' '; + *dest++ = ' '; + } + + return dest; +} +} // namespace + +namespace { +uint8_t *hexdump16(uint8_t *dest, std::span data) { + if (data.size() > 8) { + dest = hexdump8(dest, {data.data(), 8}); + *dest++ = ' '; + dest = hexdump8(dest, data.subspan(8)); + *dest++ = ' '; + } else { + dest = hexdump8(dest, data); + *dest++ = ' '; + dest = hexdump8(dest, {}); + *dest++ = ' '; + } + + return dest; +} +} // namespace + +namespace { +uint8_t *hexdump_line(uint8_t *dest, std::span data, + size_t addr) { + dest = hexdump_addr(dest, addr); + *dest++ = ' '; + *dest++ = ' '; + + dest = hexdump16(dest, data); + + return hexdump_ascii(dest, data); +} +} // namespace + +namespace { +std::expected hexdump_write(int fd, + std::span data) { + ssize_t nwrite; + + for (; + (nwrite = write(fd, data.data(), data.size())) == -1 && errno == EINTR;) + ; + if (nwrite == -1) { + return std::unexpected{Error::IO}; + } + + return {}; +} +} // namespace + +std::expected hexdump(FILE *out, std::span data) { + if (data.empty()) { + return {}; + } + + // min_space is the additional minimum space that the buffer must + // accept, which is the size of a single full line output + one + // repeat line marker ("*\n"). If the remaining buffer size is less + // than that, flush the buffer and reset. + constexpr auto min_space = 79UZ + 2UZ; + + auto fd = fileno(out); + std::array buf; + auto input = data; + auto last = buf.data(); + auto repeated = false; + std::span s, last_s{}; + + for (; !input.empty(); input = input.subspan(s.size())) { + s = input; + + if (s.size() >= 16) { + s = s.first(16); + + if (std::ranges::equal(last_s, s)) { + if (repeated) { + continue; + } + + repeated = true; + + *last++ = '*'; + *last++ = '\n'; + + continue; + } + + repeated = false; + } + + last = hexdump_line(last, s, as_unsigned(s.data() - data.data())); + *last++ = '\n'; + last_s = s; + + auto len = static_cast(last - buf.data()); + if (len + min_space > buf.size()) { + if (auto rv = hexdump_write(fd, {buf.data(), len}); !rv) { + return rv; + } + + last = buf.data(); + } + } + + last = hexdump_addr(last, data.size()); + *last++ = '\n'; + + auto len = static_cast(last - buf.data()); + if (len) { + return hexdump_write(fd, {buf.data(), len}); + } + + return {}; +} + +ngtcp2_cid make_cid_key(std::span cid) { + assert(cid.size() <= NGTCP2_MAX_CIDLEN); + + ngtcp2_cid res; + + std::ranges::copy(cid, std::ranges::begin(res.data)); + res.datalen = cid.size(); + + return res; +} + +std::string straddr(const sockaddr *sa, socklen_t salen) { + std::array host; + std::array port; + + auto rv = getnameinfo(sa, salen, host.data(), host.size(), port.data(), + port.size(), NI_NUMERICHOST | NI_NUMERICSERV); + if (rv != 0) { + std::println(stderr, "getnameinfo: {}", gai_strerror(rv)); + return ""; + } + std::string res = "["; + res.append(host.data(), strlen(host.data())); + res += "]:"; + res.append(port.data(), strlen(port.data())); + return res; +} + +std::string straddr(const Address &addr) { + return straddr(addr.as_sockaddr(), addr.size()); +} + +bool prohibited_port(uint16_t port) { + switch (port) { + case 1900: + case 5353: + case 11211: + case 20800: + case 27015: + return true; + default: + return port < 1024; + } +} + +std::string_view strccalgo(ngtcp2_cc_algo cc_algo) { + switch (cc_algo) { + case NGTCP2_CC_ALGO_RENO: + return "reno"sv; + case NGTCP2_CC_ALGO_CUBIC: + return "cubic"sv; + case NGTCP2_CC_ALGO_BBR: + return "bbr"sv; + default: + assert(0); + abort(); + } +} + +namespace { +constexpr bool rws(char c) { return c == '\t' || c == ' '; } +} // namespace + +std::expected, Error> +read_mime_types(const std::filesystem::path &filename) { + std::ifstream f(filename); + if (!f) { + return std::unexpected{Error::IO}; + } + + std::unordered_map dest; + + std::string line; + while (std::getline(f, line)) { + if (line.empty() || line[0] == '#') { + continue; + } + + auto p = std::ranges::find_if(line, rws); + if (p == std::ranges::begin(line) || p == std::ranges::end(line)) { + continue; + } + + auto media_type = std::string{std::ranges::begin(line), p}; + for (;;) { + auto ext = std::ranges::find_if_not(p, std::ranges::end(line), rws); + if (ext == std::ranges::end(line)) { + break; + } + + p = std::ranges::find_if(ext, std::ranges::end(line), rws); + auto key = "."s; + key += std::string{ext, p}; + dest.emplace(key, media_type); + } + } + + return dest; +} + +std::string format_duration(ngtcp2_duration n) { + if (n >= 3600 * NGTCP2_SECONDS && (n % (3600 * NGTCP2_SECONDS)) == 0) { + return format_uint(n / (3600 * NGTCP2_SECONDS)) + 'h'; + } + if (n >= 60 * NGTCP2_SECONDS && (n % (60 * NGTCP2_SECONDS)) == 0) { + return format_uint(n / (60 * NGTCP2_SECONDS)) + 'm'; + } + if (n >= NGTCP2_SECONDS && (n % NGTCP2_SECONDS) == 0) { + return format_uint(n / NGTCP2_SECONDS) + 's'; + } + if (n >= NGTCP2_MILLISECONDS && (n % NGTCP2_MILLISECONDS) == 0) { + return format_uint(n / NGTCP2_MILLISECONDS) + "ms"; + } + if (n >= NGTCP2_MICROSECONDS && (n % NGTCP2_MICROSECONDS) == 0) { + return format_uint(n / NGTCP2_MICROSECONDS) + "us"; + } + return format_uint(n) + "ns"; +} + +namespace { +std::expected, Error> +parse_uint_internal(std::string_view s) { + uint64_t res = 0; + + if (s.empty()) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + for (size_t i = 0; i < s.size(); ++i) { + auto c = s[i]; + if (!is_digit(c)) { + if (i == 0) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + return {{res, i}}; + } + + auto d = static_cast(c - '0'); + if (res > (std::numeric_limits::max() - d) / 10) { + return std::unexpected{Error::INTEGER_OVERFLOW}; + } + + res *= 10; + res += d; + } + + return {{res, s.size()}}; +} +} // namespace + +std::expected parse_uint(std::string_view s) { + auto o = parse_uint_internal(s); + if (!o) { + return std::unexpected{o.error()}; + } + auto [res, idx] = *o; + if (idx != s.size()) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + return res; +} + +std::expected parse_uint_iec(std::string_view s) { + auto o = parse_uint_internal(s); + if (!o) { + return std::unexpected{o.error()}; + } + auto [res, idx] = *o; + if (idx == s.size()) { + return res; + } + if (idx + 1 != s.size()) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + uint64_t m; + switch (s[idx]) { + case 'G': + case 'g': + m = 1 << 30; + break; + case 'M': + case 'm': + m = 1 << 20; + break; + case 'K': + case 'k': + m = 1 << 10; + break; + default: + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + if (res > std::numeric_limits::max() / m) { + return std::unexpected{Error::INTEGER_OVERFLOW}; + } + + return res * m; +} + +std::expected parse_duration(std::string_view s) { + auto o = parse_uint_internal(s); + if (!o) { + return std::unexpected{o.error()}; + } + auto [res, idx] = *o; + if (idx == s.size()) { + return res * NGTCP2_SECONDS; + } + + uint64_t m; + if (idx + 1 == s.size()) { + switch (s[idx]) { + case 'H': + case 'h': + m = 3600 * NGTCP2_SECONDS; + break; + case 'M': + case 'm': + m = 60 * NGTCP2_SECONDS; + break; + case 'S': + case 's': + m = NGTCP2_SECONDS; + break; + default: + return std::unexpected{Error::INVALID_ARGUMENT}; + } + } else if (idx + 2 == s.size() && (s[idx + 1] == 's' || s[idx + 1] == 'S')) { + switch (s[idx]) { + case 'M': + case 'm': + m = NGTCP2_MILLISECONDS; + break; + case 'U': + case 'u': + m = NGTCP2_MICROSECONDS; + break; + case 'N': + case 'n': + return res; + default: + return std::unexpected{Error::INVALID_ARGUMENT}; + } + } else { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + if (res > std::numeric_limits::max() / m) { + return std::unexpected{Error::INTEGER_OVERFLOW}; + } + + return res * m; +} + +namespace { +template InputIt eat_file(InputIt first, InputIt last) { + if (first == last) { + *first++ = '/'; + return first; + } + + if (*(last - 1) == '/') { + return last; + } + + auto p = last; + for (; p != first && *(p - 1) != '/'; --p) + ; + if (p == first) { + // this should not happened in normal case, where we expect path + // starts with '/' + *first++ = '/'; + return first; + } + + return p; +} +} // namespace + +namespace { +template InputIt eat_dir(InputIt first, InputIt last) { + auto p = eat_file(first, last); + + --p; + + assert(*p == '/'); + + return eat_file(first, p); +} +} // namespace + +std::expected normalize_path(std::string_view path) { + constexpr auto max_path = 1024UZ; + + if (path.size() > max_path) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + assert(path.size() > 0); + assert(path[0] == '/'); + + std::array res; + auto p = res.data(); + + auto first = std::ranges::begin(path); + auto last = std::ranges::end(path); + + *p++ = '/'; + ++first; + for (; first != last && *first == '/'; ++first) + ; + + for (; first != last;) { + if (*first == '.') { + if (first + 1 == last) { + break; + } + if (*(first + 1) == '/') { + first += 2; + continue; + } + if (*(first + 1) == '.') { + if (first + 2 == last) { + p = eat_dir(res.data(), p); + break; + } + if (*(first + 2) == '/') { + p = eat_dir(res.data(), p); + first += 3; + continue; + } + } + } + if (*(p - 1) != '/') { + p = eat_file(res.data(), p); + } + auto slash = std::ranges::find(first, last, '/'); + if (slash == last) { + p = std::ranges::copy(first, last, p).out; + break; + } + p = std::ranges::copy(first, slash + 1, p).out; + first = slash + 1; + for (; first != last && *first == '/'; ++first) + ; + } + return std::string{res.data(), p}; +} + +std::expected make_socket_nonblocking(int fd) { + int rv; + int flags; + + while ((flags = fcntl(fd, F_GETFL, 0)) == -1 && errno == EINTR) + ; + if (flags == -1) { + return std::unexpected{Error::SYSCALL}; + } + + while ((rv = fcntl(fd, F_SETFL, flags | O_NONBLOCK)) == -1 && errno == EINTR) + ; + + if (rv == -1) { + return std::unexpected{Error::SYSCALL}; + } + + return {}; +} + +std::expected create_nonblock_socket(int domain, int type, + int protocol) { +#ifdef SOCK_NONBLOCK + auto fd = socket(domain, type | SOCK_NONBLOCK, protocol); + if (fd == -1) { + return std::unexpected{Error::SYSCALL}; + } +#else // !defined(SOCK_NONBLOCK) + auto fd = socket(domain, type, protocol); + if (fd == -1) { + return std::unexpected{Error::SYSCALL}; + } + + make_socket_nonblocking(fd); +#endif // !defined(SOCK_NONBLOCK) + + return fd; +} + +std::expected parse_version(std::string_view s) { + if (!util::istarts_with(s, "0x"sv)) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + auto k = s.substr(2); + auto k_last = k.data() + k.size(); + uint32_t v; + auto rv = std::from_chars(k.data(), k_last, v, 16); + if (rv.ptr != k_last || rv.ec != std::errc{}) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + return v; +} + +std::expected, Error> +read_token(const std::filesystem::path &path) { + return read_pem(path, "token"sv, "QUIC TOKEN"sv); +} + +std::expected write_token(const std::filesystem::path &path, + std::span token) { + return write_pem(path, "token"sv, "QUIC TOKEN"sv, token); +} + +std::expected, Error> +read_transport_params(const std::filesystem::path &path) { + return read_pem(path, "transport parameters"sv, + "QUIC TRANSPORT PARAMETERS"sv); +} + +std::expected +write_transport_params(const std::filesystem::path &path, + std::span data) { + return write_pem(path, "transport parameters"sv, + "QUIC TRANSPORT PARAMETERS"sv, data); +} + +std::string percent_decode(std::string_view s) { + std::string result; + + result.resize_and_overwrite(s.size(), [s](auto p, auto len) { + auto head = p; + + for (auto first = std::ranges::begin(s), last = std::ranges::end(s); + first != last; ++first) { + if (*first != '%') { + *p++ = *first; + continue; + } + + if (first + 1 != last && first + 2 != last && + is_hex_digit(*(first + 1)) && is_hex_digit(*(first + 2))) { + *p++ = static_cast((hex_to_uint(*(first + 1)) << 4) + + hex_to_uint(*(first + 2))); + first += 2; + continue; + } + + *p++ = *first; + } + + return p - head; + }); + + return result; +} + +std::expected, Error> +read_file(const std::filesystem::path &path) { + auto fd = open(path.c_str(), O_RDONLY); + if (fd == -1) { + return std::unexpected{Error::IO}; + } + + auto fd_d = defer([fd] { close(fd); }); + + auto size = lseek(fd, 0, SEEK_END); + if (size == static_cast(-1)) { + return std::unexpected{Error::IO}; + } + + auto addr = + mmap(nullptr, static_cast(size), PROT_READ, MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) { + return std::unexpected{Error::IO}; + } + + auto addr_d = + defer([addr, size] { munmap(addr, static_cast(size)); }); + + auto p = static_cast(addr); + + return {{p, p + size}}; +} + +size_t clamp_buffer_size(ngtcp2_conn *conn, size_t buflen, size_t gso_burst) { + return std::min(gso_burst == 0 + ? ngtcp2_conn_get_send_quantum2(conn) + : ngtcp2_conn_get_path_max_tx_udp_payload_size2(conn) * + gso_burst, + buflen); +} + +bool recv_pkt_time_threshold_exceeded(bool time_sensitive, ngtcp2_tstamp start, + size_t pktcnt) { + return time_sensitive && pktcnt && + util::timestamp() - start >= NGTCP2_MILLISECONDS; +} + +std::expected +read_ech_server_config(const std::filesystem::path &path) { + auto pkey = read_hpke_private_key_pem(path); + if (!pkey) { + return std::unexpected{pkey.error()}; + } + + auto maybe_ech_config_list = read_pem(path, "ECH config"sv, "ECHCONFIG"sv); + if (!maybe_ech_config_list) { + return std::unexpected{maybe_ech_config_list.error()}; + } + + auto ech_config_list = std::span{*maybe_ech_config_list}; + if (ech_config_list.size() < 2) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + auto data = ech_config_list.subspan(2); + + if (auto len = + static_cast((ech_config_list[0] << 8) + ech_config_list[1]); + len != data.size()) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + std::vector> ech_configs; + + for (; !data.empty();) { + // version and length, each 2 bytes + if (data.size() < 4) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + auto version = (data[0] << 8) + data[1]; + + auto conflen = static_cast(4 + (data[2] << 8) + data[3]); + if (data.size() < conflen) { + return std::unexpected{Error::INVALID_ARGUMENT}; + } + + if (version == 0xFE0D) { + auto conf = data.first(conflen); + ech_configs.emplace_back(std::ranges::begin(conf), + std::ranges::end(conf)); + } else { + std::println(stderr, "Skipping the unsupported ECH version {:#x}", + version); + } + + data = data.subspan(conflen); + } + + return ECHServerConfig{ + .private_key = std::move(*pkey), + .ech_config_list = std::move(ech_configs), + }; +} + +std::span generate_siphash_key() { + static auto key = [] { + std::array key; + + if (!generate_secure_random(as_writable_uint8_span(std::span{key}))) { + assert(0); + abort(); + } + + return key; + }(); + + ++key[0]; + + return key; +} + +std::filesystem::path realpath(const std::filesystem::path &path) { + std::error_code ec; + + auto abspath = std::filesystem::canonical(path, ec); + if (ec) { + std::println(stderr, "Could not get canonical path for {}: {}", + path.native(), ec.message()); + abort(); + } + + return abspath; +} + +std::string format_app_error_code(std::optional app_error_code) { + return app_error_code + .transform([](auto &&r) { return std::format("{:#x}", r); }) + .value_or("(no error)"); +} + +} // namespace util + +std::ostream &operator<<(std::ostream &os, const ngtcp2_cid &cid) { + return os << "0x" << util::format_hex(cid.data, as_signed(cid.datalen)); +} + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/examples/util.h b/deps/ngtcp2/ngtcp2/examples/util.h new file mode 100644 index 000000000000..40a48a8a4d6f --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/util.h @@ -0,0 +1,644 @@ +/* + * ngtcp2 + * + * Copyright (c) 2017 ngtcp2 contributors + * Copyright (c) 2012 nghttp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef UTIL_H +#define UTIL_H + +#ifdef HAVE_CONFIG_H +# include +#endif // defined(HAVE_CONFIG_H) + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include "network.h" +#include "siphash.h" +#include "template.h" +#include "shared.h" + +namespace ngtcp2 { + +namespace util { + +inline nghttp3_nv make_nv(std::string_view name, std::string_view value, + uint8_t flags) { + return nghttp3_nv{ + reinterpret_cast(const_cast(std::ranges::data(name))), + reinterpret_cast(const_cast(std::ranges::data(value))), + name.size(), + value.size(), + flags, + }; +} + +inline nghttp3_nv make_nv_cc(std::string_view name, std::string_view value) { + return make_nv(name, value, NGHTTP3_NV_FLAG_NONE); +} + +inline nghttp3_nv make_nv_nc(std::string_view name, std::string_view value) { + return make_nv(name, value, NGHTTP3_NV_FLAG_NO_COPY_NAME); +} + +inline nghttp3_nv make_nv_nn(std::string_view name, std::string_view value) { + return make_nv(name, value, + NGHTTP3_NV_FLAG_NO_COPY_NAME | NGHTTP3_NV_FLAG_NO_COPY_VALUE); +} + +inline constexpr char LOWER_XDIGITS[] = "0123456789abcdef"; + +template +requires(std::indirectly_writable) +constexpr O format_hex_uint8(uint8_t b, O result) { +#ifdef __GNUC__ +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wsign-conversion" +#endif // __GNUC__ + *result++ = LOWER_XDIGITS[b >> 4]; + *result++ = LOWER_XDIGITS[b & 0xF]; +#ifdef __GNUC__ +# pragma GCC diagnostic pop +#endif // __GNUC__ + + return result; +} + +// format_hex converts a range [|first|, |last|) in hex format, and +// stores the result in another range, beginning at |result|. It +// returns an output iterator to the element past the last element +// stored. +template +requires(std::indirectly_writable && + sizeof(std::iter_value_t) == sizeof(uint8_t)) +constexpr O format_hex(I first, I last, O result) { + for (; first != last; ++first) { + result = format_hex_uint8(static_cast(*first), result); + } + + return result; +} + +// format_hex converts a range [|first|, |first| + |n|) in hex format, +// and stores the result in another range, beginning at |result|. It +// returns an output iterator to the element past the last element +// stored. +template +requires(std::indirectly_writable && + sizeof(std::iter_value_t) == sizeof(uint8_t)) +constexpr O format_hex(I first, std::iter_difference_t n, O result) { + return format_hex(first, std::ranges::next(first, n), std::move(result)); +} + +// format_hex converts a range [|first|, |first| + |n|) in hex format, +// and returns it. +template +requires(sizeof(std::iter_value_t) == sizeof(uint8_t)) +constexpr std::string format_hex(I first, std::iter_difference_t n) { + if (n <= 0) { + return {}; + } + + std::string res; + + res.resize_and_overwrite(as_unsigned(n * 2), [first = std::move(first), + n](auto p, auto len) mutable { + format_hex(std::move(first), n, p); + + return len; + }); + + return res; +} + +// format_hex converts |R| in hex format, and stores the result in +// another range, beginning at |result|. It returns an output +// iterator to the element past the last element stored. +template +requires(std::indirectly_writable && + !std::is_array_v> && + sizeof(std::ranges::range_value_t) == sizeof(uint8_t)) +constexpr O format_hex(R &&r, O result) { + return format_hex(std::ranges::begin(r), std::ranges::end(r), + std::move(result)); +} + +// format_hex converts |R| in hex format, and returns the result. +template +requires(!std::is_array_v> && + sizeof(std::ranges::range_value_t) == sizeof(uint8_t)) +constexpr std::string format_hex(R &&r) { + std::string res; + + res.resize_and_overwrite(as_unsigned(std::ranges::distance(r) * 2), + [&r](auto p, auto len) { + format_hex(r, p); + + return len; + }); + + return res; +} + +// format_hex converts |n| in hex format, and stores the result in +// another range, beginning at |result|. It returns an output +// iterator to the element past the last element stored. +template +requires(std::indirectly_writable) +constexpr O format_hex(T n, O result) { + if constexpr (sizeof(n) == 1) { + return format_hex_uint8(n, result); + } + + if constexpr (std::endian::native == std::endian::little) { + auto end = reinterpret_cast(&n); + auto p = end + sizeof(n); + + for (; p != end; --p) { + result = format_hex_uint8(*(p - 1), result); + } + } else { + auto p = reinterpret_cast(&n); + auto end = p + sizeof(n); + + for (; p != end; ++p) { + result = format_hex_uint8(*p, result); + } + } + + return result; +} + +// format_hex converts |n| in hex format, and returns it. +template constexpr std::string format_hex(T n) { + std::string res; + + res.resize_and_overwrite(sizeof(n) * 2, [n](auto p, auto len) { + format_hex(n, p); + + return len; + }); + + return res; +} + +std::string decode_hex(std::string_view s); + +// format_durationf formats |ns| in human readable manner. |ns| must +// be nanoseconds resolution. This function uses the largest unit so +// that the integral part is strictly more than zero, and the +// precision is at most 2 digits. For example, 1234 is formatted as +// "1.23us". The largest unit is seconds. +std::string format_durationf(uint64_t ns); + +std::mt19937 make_mt19937(); + +ngtcp2_tstamp timestamp(); + +// system_clock_now returns the current timestamp of system clock. +ngtcp2_tstamp system_clock_now(); + +bool numeric_host(const char *hostname); + +bool numeric_host(const char *hostname, int family); + +// hexdump dumps |data| in the format similar to hexdump(1) with -C +// option. +std::expected hexdump(FILE *out, std::span data); + +template +std::expected hexdump(FILE *out, std::span data) { + return hexdump(out, as_uint8_span(data)); +} + +inline constexpr auto lowcase_tbl = [] { + std::array tbl; + + for (size_t i = 0; i < 256; ++i) { + if ('A' <= i && i <= 'Z') { + tbl[i] = static_cast(i - 'A' + 'a'); + } else { + tbl[i] = static_cast(i); + } + } + + return tbl; +}(); + +constexpr char lowcase(char c) noexcept { + return lowcase_tbl[static_cast(c)]; +} + +struct CaseCmp { + constexpr bool operator()(char lhs, char rhs) const noexcept { + return lowcase(lhs) == lowcase(rhs); + } +}; + +// istarts_with returns true if |s| starts with |prefix|. Comparison +// is performed in case-insensitive manner. +constexpr bool istarts_with(std::string_view s, std::string_view prefix) { + return s.size() >= prefix.size() && + std::ranges::equal(s.substr(0, prefix.size()), prefix, CaseCmp()); +} + +// make_cid_key returns the key for |cid|. +std::string_view make_cid_key(const ngtcp2_cid *cid); +ngtcp2_cid make_cid_key(std::span cid); + +// straddr stringifies |sa| of length |salen| in a format "[IP]:PORT". +std::string straddr(const sockaddr *sa, socklen_t salen); + +// straddr stringifies |addr| in a format "[IP]:PORT". +std::string straddr(const Address &addr); + +// prohibited_port returns true if |port| is prohibited as a client +// port. +bool prohibited_port(uint16_t port); + +// strccalgo stringifies |cc_algo|. +std::string_view strccalgo(ngtcp2_cc_algo cc_algo); + +// read_mime_types reads "MIME media types and the extensions" file +// denoted by |filename| and returns the mapping of extension to MIME +// media type. The key contains the leading "." (e.g., .txt). +std::expected, Error> +read_mime_types(const std::filesystem::path &filename); + +inline constexpr auto count_digit_tbl = [] { + std::array::digits10> tbl; + + uint64_t x = 1; + + for (size_t i = 0; i < tbl.size(); ++i) { + x *= 10; + tbl[i] = x - 1; + } + + return tbl; +}(); + +// count_digit returns the minimum number of digits to represent |x| +// in base 10. +// +// credit: +// https://lemire.me/blog/2025/01/07/counting-the-digits-of-64-bit-integers/ +template constexpr size_t count_digit(T x) { + auto y = static_cast(19 * (std::numeric_limits::digits - 1 - + std::countl_zero(static_cast(x | 1))) >> + 6); + + y += x > count_digit_tbl[y]; + + return y + 1; +} + +inline constexpr auto utos_digits = [] { + std::array a; + + for (size_t i = 0; i < 100; ++i) { + a[i * 2] = '0' + static_cast(i / 10); + a[i * 2 + 1] = '0' + static_cast(i % 10); + } + + return a; +}(); + +struct UIntFormatter { + template + requires(std::indirectly_writable) + constexpr O operator()(T n, O result) { + using result_type = std::iter_value_t; + + if (n < 10) { + *result++ = static_cast('0' + static_cast(n)); + return result; + } + + if (n < 100) { + return std::ranges::copy_n(utos_digits.data() + n * 2, 2, result).out; + } + + std::ranges::advance(result, as_signed(count_digit(n))); + + auto p = result; + + for (; n >= 100; n /= 100) { + std::ranges::advance(p, -2); + std::ranges::copy_n(utos_digits.data() + (n % 100) * 2, 2, p); + } + + if (n < 10) { + *--p = static_cast('0' + static_cast(n)); + return result; + } + + std::ranges::advance(p, -2); + std::ranges::copy_n(utos_digits.data() + n * 2, 2, p); + + return result; + } +}; + +template +requires(std::indirectly_writable) +constexpr O utos(T n, O result) { + return UIntFormatter{}(std::move(n), std::move(result)); +} + +// format_uint converts |n| into string. +template constexpr std::string format_uint(T n) { + using namespace std::literals; + + if (n == 0) { + return "0"s; + } + + std::string res; + + res.resize_and_overwrite(count_digit(n), [n](auto p, auto len) { + utos(n, p); + + return len; + }); + + return res; +} + +// format_uint_iec converts |n| into string with the IEC unit (either +// "G", "M", or "K"). It chooses the largest unit which does not drop +// precision. +template std::string format_uint_iec(T n) { + if (n >= (1 << 30) && (n & ((1 << 30) - 1)) == 0) { + return format_uint(n / (1 << 30)) + 'G'; + } + if (n >= (1 << 20) && (n & ((1 << 20) - 1)) == 0) { + return format_uint(n / (1 << 20)) + 'M'; + } + if (n >= (1 << 10) && (n & ((1 << 10) - 1)) == 0) { + return format_uint(n / (1 << 10)) + 'K'; + } + return format_uint(n); +} + +// format_duration converts |n| into string with the unit in either +// "h" (hours), "m" (minutes), "s" (seconds), "ms" (milliseconds), +// "us" (microseconds) or "ns" (nanoseconds). It chooses the largest +// unit which does not drop precision. |n| is in nanosecond +// resolution. +std::string format_duration(ngtcp2_duration n); + +// parse_uint parses |s| as 64-bit unsigned integer. If it cannot +// parse |s|, the return value does not contain a value. +std::expected parse_uint(std::string_view s); + +// parse_uint_iec parses |s| as 64-bit unsigned integer. It accepts +// IEC unit letter (either "G", "M", or "K") in |s|. If it cannot +// parse |s|, the return value does not contain a value. +std::expected parse_uint_iec(std::string_view s); + +// parse_duration parses |s| as 64-bit unsigned integer. It accepts a +// unit (either "h", "m", "s", "ms", "us", or "ns") in |s|. If no +// unit is present, the unit "s" is assumed. If it cannot parse |s|, +// the return value does not contain a value. +std::expected parse_duration(std::string_view s); + +// generate_secure_random generates a cryptographically secure pseudo +// random data of |data|. +std::expected generate_secure_random(std::span data); + +// normalize_path removes ".." by consuming a previous path component. +// It also removes ".". It assumes that |path| starts with "/". If +// it cannot consume a previous path component, it just removes "..". +std::expected normalize_path(std::string_view path); + +template Pred> +consteval auto pred_tbl_gen256(Pred pred) { + std::array tbl; + + for (size_t i = 0; i < tbl.size(); ++i) { + tbl[i] = pred(i); + } + + return tbl; +} + +consteval auto digit_pred(size_t i) noexcept { return '0' <= i && i <= '9'; } + +inline constexpr auto is_digit_tbl = pred_tbl_gen256(digit_pred); + +constexpr bool is_digit(char c) noexcept { + return is_digit_tbl[static_cast(c)]; +} + +consteval auto hex_digit_pred(size_t i) noexcept { + return digit_pred(i) || ('A' <= i && i <= 'F') || ('a' <= i && i <= 'f'); +} + +inline constexpr auto is_hex_digit_tbl = pred_tbl_gen256(hex_digit_pred); + +constexpr bool is_hex_digit(char c) noexcept { + return is_hex_digit_tbl[static_cast(c)]; +} + +// is_hex_string returns true if the length of |s| is even, and |s| +// does not contain a character other than [0-9A-Fa-f]. It returns +// false otherwise. +template +requires(!std::is_array_v>) +constexpr bool is_hex_string(R &&r) { + return !(std::ranges::size(r) & 1) && std::ranges::all_of(r, is_hex_digit); +} + +inline constexpr auto hex_to_uint_tbl = [] { + std::array tbl; + + std::ranges::fill(tbl, 256); + + for (char i = '0'; i <= '9'; ++i) { + tbl[static_cast(i)] = static_cast(i - '0'); + } + + for (char i = 'A'; i <= 'F'; ++i) { + tbl[static_cast(i)] = static_cast(i - 'A' + 10); + } + + for (char i = 'a'; i <= 'f'; ++i) { + tbl[static_cast(i)] = static_cast(i - 'a' + 10); + } + + return tbl; +}(); + +// hex_to_uint returns integer corresponding to hex notation |c|. If +// is_hex_digit(c) is false, it returns 256. +constexpr uint32_t hex_to_uint(char c) noexcept { + return hex_to_uint_tbl[static_cast(c)]; +} + +std::string percent_decode(std::string_view s); + +std::expected make_socket_nonblocking(int fd); + +std::expected create_nonblock_socket(int domain, int type, + int protocol); + +std::expected, Error> +read_token(const std::filesystem::path &path); +std::expected write_token(const std::filesystem::path &path, + std::span token); + +std::expected, Error> +read_transport_params(const std::filesystem::path &path); +std::expected +write_transport_params(const std::filesystem::path &path, + std::span data); + +const char *crypto_default_ciphers(); + +const char *crypto_default_groups(); + +// split_str parses delimited strings in |s| and returns substrings +// delimited by |delim|. The any white spaces around substring are +// treated as a part of substring. If |s| is an empty string, this +// function returns an empty view. +inline auto split_str(std::string_view s, char delim = ',') { + return s | std::ranges::views::split(delim) | + std::ranges::views::transform( + [](auto &&r) { return std::string_view{r}; }); +} + +// parse_version parses |s| to get 4 byte QUIC version. |s| must be a +// hex string and must start with "0x" (e.g., 0x00000001). +std::expected parse_version(std::string_view s); + +// read_file reads a file denoted by |path| and returns its content. +std::expected, Error> +read_file(const std::filesystem::path &path); + +size_t clamp_buffer_size(ngtcp2_conn *conn, size_t buflen, size_t gso_burst); + +bool recv_pkt_time_threshold_exceeded(bool time_sensitive, ngtcp2_tstamp start, + size_t pktcnt); + +enum HPKEPrivateKeyType : uint16_t { + HPKE_DHKEM_X25519_HKDF_SHA256 = 0x0020, +}; + +// HPKEPrivateKey contains HPKE private key. +struct HPKEPrivateKey { + // type is HPKE private key type. + HPKEPrivateKeyType type; + // bytes contains raw private key. + std::vector bytes; +}; + +// ECHServerConfig is a server-side ECH configuration. +struct ECHServerConfig { + // private_key contains a private key used for decrypting encrypted + // Client Hello. + HPKEPrivateKey private_key; + // ech_config_list contains list of a serialized ECHConfig. + std::vector> ech_config_list; +}; + +// read_ech_server_config reads server-side ECH configuration from a +// file denoted by |path|. +std::expected +read_ech_server_config(const std::filesystem::path &path); + +std::span generate_siphash_key(); + +// get_string returns a URL component specified by |f| of |uri|. This +// function assumes that u.field_set & (1 << f) is nonzero. +constexpr std::string_view +get_string(std::string_view uri, const urlparse_url &u, urlparse_url_fields f) { + assert(u.field_set & (1 << f)); + + auto p = &u.field_data[f]; + return {uri.data() + p->off, p->len}; +} + +// realpath returns the canonicalized absolute path to |path|. +std::filesystem::path realpath(const std::filesystem::path &path); + +// format_app_error_code formats |app_error_code|. +std::string format_app_error_code(std::optional app_error_code); + +} // namespace util + +std::ostream &operator<<(std::ostream &os, const ngtcp2_cid &cid); + +} // namespace ngtcp2 + +namespace std { +template <> struct hash { + hash() { + std::ranges::copy(ngtcp2::util::generate_siphash_key(), + std::ranges::begin(key)); + } + + std::size_t operator()(const ngtcp2_cid &cid) const noexcept { + return static_cast(siphash24(key, {cid.data, cid.datalen})); + } + + std::array key; +}; +} // namespace std + +inline bool operator==(const ngtcp2_cid &lhs, const ngtcp2_cid &rhs) { + return ngtcp2_cid_eq(&lhs, &rhs); +} + +template <> +struct std::formatter : public std::formatter { + template + auto format(const ngtcp2_cid &cid, FormatContext &ctx) const { + std::array buf; + buf[0] = '0'; + buf[1] = 'x'; + + auto end = ngtcp2::util::format_hex(std::span{cid.data, cid.datalen}, + std::ranges::begin(buf) + 2); + + return std::formatter::format( + {std::ranges::begin(buf), end}, ctx); + } +}; + +#endif // !defined(UTIL_H) diff --git a/deps/ngtcp2/ngtcp2/examples/util_openssl.cc b/deps/ngtcp2/ngtcp2/examples/util_openssl.cc new file mode 100644 index 000000000000..f07dd01654e0 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/util_openssl.cc @@ -0,0 +1,178 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "util.h" + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include "template.h" + +namespace ngtcp2 { + +namespace util { + +std::expected generate_secure_random(std::span data) { +#ifdef WITH_EXAMPLE_BORINGSSL + using size_type = size_t; +#else // !defined(WITH_EXAMPLE_BORINGSSL) + using size_type = int; +#endif // !defined(WITH_EXAMPLE_BORINGSSL) + + if (RAND_bytes(data.data(), static_cast(data.size())) != 1) { + return std::unexpected{Error::CRYPTO}; + } + + return {}; +} + +std::expected +read_hpke_private_key_pem(const std::filesystem::path &path) { + auto f = BIO_new_file(path.c_str(), "r"); + if (f == nullptr) { + std::println(stderr, "Could not open file {}", path.native()); + return std::unexpected{Error::IO}; + } + + auto f_d = defer([f] { BIO_free(f); }); + + EVP_PKEY *pkey; + + if (PEM_read_bio_PrivateKey(f, &pkey, nullptr, nullptr) == nullptr) { + return std::unexpected{Error::IO}; + } + + auto pkey_d = defer([pkey] { EVP_PKEY_free(pkey); }); + + HPKEPrivateKey res; + + switch (EVP_PKEY_id(pkey)) { + case EVP_PKEY_X25519: { + res.type = HPKE_DHKEM_X25519_HKDF_SHA256; + + size_t len; + + EVP_PKEY_get_raw_private_key(pkey, nullptr, &len); + + res.bytes.resize(len); + + EVP_PKEY_get_raw_private_key(pkey, &res.bytes[0], &len); + + break; + } + default: + return std::unexpected{Error::UNSUPPORTED}; + } + + return res; +} + +std::expected, Error> +read_pem(const std::filesystem::path &path, std::string_view name, + std::string_view type) { + auto f = BIO_new_file(path.c_str(), "r"); + if (f == nullptr) { + std::println(stderr, "Could not open {} file {}", name, path.native()); + return std::unexpected{Error::IO}; + } + + auto f_d = defer([f] { BIO_free(f); }); + + for (;;) { + char *pem_type, *header; + unsigned char *data; + long datalen; + + if (PEM_read_bio(f, &pem_type, &header, &data, &datalen) != 1) { + std::println(stderr, "Could not read {} file {}", name, path.native()); + return std::unexpected{Error::IO}; + } + + auto pem_d = defer([pem_type, header, data] { + OPENSSL_free(pem_type); + OPENSSL_free(header); + OPENSSL_free(data); + }); + + if (type != pem_type) { + continue; + } + + return {{data, data + datalen}}; + } +} + +std::expected write_pem(const std::filesystem::path &path, + std::string_view name, + std::string_view type, + std::span data) { + auto f = BIO_new_file(path.c_str(), "w"); + if (f == nullptr) { + std::println(stderr, "Could not write {} in {}", name, path.native()); + return std::unexpected{Error::IO}; + } + + PEM_write_bio(f, type.data(), "", data.data(), + static_cast(data.size())); + BIO_free(f); + + return {}; +} + +const char *crypto_default_ciphers() { +#if defined(WITH_EXAMPLE_QUICTLS) || defined(WITH_EXAMPLE_OSSL) + return "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_" + "SHA256" +# ifndef LIBRESSL_VERSION_NUMBER + ":TLS_AES_128_CCM_SHA256" +# endif // !defined(LIBRESSL_VERSION_NUMBER) + ; +#else // !(defined(WITH_EXAMPLE_QUICTLS) && defined(WITH_EXAMPLE_OSSL)) + return ""; +#endif // !(defined(WITH_EXAMPLE_QUICTLS) && defined(WITH_EXAMPLE_OSSL)) +} + +const char *crypto_default_groups() { + return "X25519:P-256:P-384:P-521" +#if defined(WITH_EXAMPLE_BORINGSSL) || defined(WITH_EXAMPLE_OSSL) || \ + defined(LIBRESSL_VERSION_NUMBER) + ":X25519MLKEM768" +#endif // defined(WITH_EXAMPLE_BORINGSSL) || defined(WITH_EXAMPLE_OSSL) || + // defined(LIBRESSL_VERSION_NUMBER) + ; +} + +} // namespace util + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/examples/util_test.cc b/deps/ngtcp2/ngtcp2/examples/util_test.cc new file mode 100644 index 000000000000..14a7bd05d926 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/util_test.cc @@ -0,0 +1,631 @@ +/* + * ngtcp2 + * + * Copyright (c) 2018 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "util_test.h" + +#include +#include +#include +#include +#include + +#include "util.h" + +using namespace std::literals; + +namespace ngtcp2 { + +namespace { +const MunitTest tests[]{ + munit_void_test(test_util_format_durationf), + munit_void_test(test_util_format_uint), + munit_void_test(test_util_format_uint_iec), + munit_void_test(test_util_format_duration), + munit_void_test(test_util_parse_uint), + munit_void_test(test_util_parse_uint_iec), + munit_void_test(test_util_parse_duration), + munit_void_test(test_util_normalize_path), + munit_void_test(test_util_hexdump), + munit_void_test(test_util_format_hex), + munit_void_test(test_util_decode_hex), + munit_void_test(test_util_is_hex_string), + munit_void_test(test_util_split_str), + munit_void_test(test_util_format_app_error_code), + munit_test_end(), +}; +} // namespace + +const MunitSuite util_suite{ + .prefix = "/util", + .tests = tests, +}; + +namespace util { +std::expected +read_hpke_private_key_pem(const std::filesystem::path &path) { + return std::unexpected{Error::NOT_IMPLEMENTED}; +} +} // namespace util + +namespace util { +std::expected, Error> +read_pem(const std::filesystem::path &path, std::string_view name, + std::string_view type) { + return std::unexpected{Error::NOT_IMPLEMENTED}; +} +} // namespace util + +namespace util { +std::expected write_pem(const std::filesystem::path &path, + std::string_view name, + std::string_view type, + std::span data) { + return std::unexpected{Error::NOT_IMPLEMENTED}; +} +} // namespace util + +namespace util { +std::expected generate_secure_random(std::span data) { + return std::unexpected{Error::NOT_IMPLEMENTED}; +} +} // namespace util + +void test_util_format_durationf() { + assert_stdstring_equal("0ns", util::format_durationf(0)); + assert_stdstring_equal("999ns", util::format_durationf(999)); + assert_stdstring_equal("1.00us", util::format_durationf(1000)); + assert_stdstring_equal("1.00us", util::format_durationf(1004)); + assert_stdstring_equal("1.00us", util::format_durationf(1005)); + assert_stdstring_equal("1.02us", util::format_durationf(1015)); + assert_stdstring_equal("2.00us", util::format_durationf(1999)); + assert_stdstring_equal("1.00ms", util::format_durationf(999999)); + assert_stdstring_equal("3.50ms", util::format_durationf(3500111)); + assert_stdstring_equal("9999.99s", util::format_durationf(9999990000000ULL)); +} + +void test_util_format_uint() { + assert_stdstring_equal("0"s, util::format_uint(0U)); + assert_stdstring_equal("18446744073709551615"s, + util::format_uint(18446744073709551615ULL)); +} + +void test_util_format_uint_iec() { + assert_stdstring_equal("0"s, util::format_uint_iec(0U)); + assert_stdstring_equal("1023"s, util::format_uint_iec((1U << 10) - 1)); + assert_stdstring_equal("1K"s, util::format_uint_iec(1U << 10)); + assert_stdstring_equal("1M"s, util::format_uint_iec(1U << 20)); + assert_stdstring_equal("1G"s, util::format_uint_iec(1U << 30)); + assert_stdstring_equal( + "18446744073709551615"s, + util::format_uint_iec(std::numeric_limits::max())); + assert_stdstring_equal("1025K"s, + util::format_uint_iec((1U << 20) + (1U << 10))); +} + +void test_util_format_duration() { + assert_stdstring_equal("0ns", util::format_duration(0)); + assert_stdstring_equal("999ns", util::format_duration(999)); + assert_stdstring_equal("1us", util::format_duration(1000)); + assert_stdstring_equal("1ms", util::format_duration(1000000)); + assert_stdstring_equal("1s", util::format_duration(1000000000)); + assert_stdstring_equal("1m", util::format_duration(60000000000ULL)); + assert_stdstring_equal("1h", util::format_duration(3600000000000ULL)); + assert_stdstring_equal( + "18446744073709551615ns", + util::format_duration(std::numeric_limits::max())); + assert_stdstring_equal("61s", util::format_duration(61000000000ULL)); +} + +void test_util_parse_uint() { + { + auto res = util::parse_uint("0"); + assert_true(res.has_value()); + assert_uint64(0, ==, *res); + } + { + auto res = util::parse_uint("1"); + assert_true(res.has_value()); + assert_uint64(1, ==, *res); + } + { + auto res = util::parse_uint("18446744073709551615"); + assert_true(res.has_value()); + assert_uint64(18446744073709551615ULL, ==, *res); + } + { + auto res = util::parse_uint("18446744073709551616"); + assert_false(res.has_value()); + } + { + auto res = util::parse_uint("a"); + assert_false(res.has_value()); + } + { + auto res = util::parse_uint("1a"); + assert_false(res.has_value()); + } + { + auto res = util::parse_uint(""); + assert_false(res.has_value()); + } +} + +void test_util_parse_uint_iec() { + { + auto res = util::parse_uint_iec("0"); + assert_true(res.has_value()); + assert_uint64(0, ==, *res); + } + { + auto res = util::parse_uint_iec("1023"); + assert_true(res.has_value()); + assert_uint64(1023, ==, *res); + } + { + auto res = util::parse_uint_iec("1K"); + assert_true(res.has_value()); + assert_uint64(1 << 10, ==, *res); + } + { + auto res = util::parse_uint_iec("1M"); + assert_true(res.has_value()); + assert_uint64(1 << 20, ==, *res); + } + { + auto res = util::parse_uint_iec("1G"); + assert_true(res.has_value()); + assert_uint64(1 << 30, ==, *res); + } + { + auto res = util::parse_uint_iec("11G"); + assert_true(res.has_value()); + assert_uint64((1ULL << 30) * 11, ==, *res); + } + { + auto res = util::parse_uint_iec("18446744073709551616"); + assert_false(res.has_value()); + } + { + auto res = util::parse_uint_iec("1x"); + assert_false(res.has_value()); + } + { + auto res = util::parse_uint_iec("1Gx"); + assert_false(res.has_value()); + } + { + auto res = util::parse_uint_iec("G"); + assert_false(res.has_value()); + } + { + auto res = util::parse_uint_iec(""); + assert_false(res.has_value()); + } +} + +void test_util_parse_duration() { + { + auto res = util::parse_duration("0"); + assert_true(res.has_value()); + assert_uint64(0, ==, *res); + } + { + auto res = util::parse_duration("1"); + assert_true(res.has_value()); + assert_uint64(NGTCP2_SECONDS, ==, *res); + } + { + auto res = util::parse_duration("0ns"); + assert_true(res.has_value()); + assert_uint64(0, ==, *res); + } + { + auto res = util::parse_duration("1ns"); + assert_true(res.has_value()); + assert_uint64(1, ==, *res); + } + { + auto res = util::parse_duration("1us"); + assert_true(res.has_value()); + assert_uint64(NGTCP2_MICROSECONDS, ==, *res); + } + { + auto res = util::parse_duration("1ms"); + assert_true(res.has_value()); + assert_uint64(NGTCP2_MILLISECONDS, ==, *res); + } + { + auto res = util::parse_duration("1s"); + assert_true(res.has_value()); + assert_uint64(NGTCP2_SECONDS, ==, *res); + } + { + auto res = util::parse_duration("1m"); + assert_true(res.has_value()); + assert_uint64(60 * NGTCP2_SECONDS, ==, *res); + } + { + auto res = util::parse_duration("1h"); + assert_true(res.has_value()); + assert_uint64(3600 * NGTCP2_SECONDS, ==, *res); + } + { + auto res = util::parse_duration("2h"); + assert_true(res.has_value()); + assert_uint64(2 * 3600 * NGTCP2_SECONDS, ==, *res); + } + { + auto res = util::parse_duration("18446744073709551616"); + assert_false(res.has_value()); + } + { + auto res = util::parse_duration("1x"); + assert_false(res.has_value()); + } + { + auto res = util::parse_duration("1mx"); + assert_false(res.has_value()); + } + { + auto res = util::parse_duration("1mxy"); + assert_false(res.has_value()); + } + { + auto res = util::parse_duration("s"); + assert_false(res.has_value()); + } + { + auto res = util::parse_duration("ms"); + assert_false(res.has_value()); + } + { + auto res = util::parse_duration(""); + assert_false(res.has_value()); + } +} + +void test_util_normalize_path() { + { + auto rv = util::normalize_path("/"); + + assert_true(rv.has_value()); + assert_stdstring_equal("/", rv.value()); + } + + { + auto rv = util::normalize_path("//"); + + assert_true(rv.has_value()); + assert_stdstring_equal("/", rv.value()); + } + + { + auto rv = util::normalize_path("/foo"); + + assert_true(rv.has_value()); + assert_stdstring_equal("/foo", rv.value()); + } + + { + auto rv = util::normalize_path("/foo/bar/"); + + assert_true(rv.has_value()); + assert_stdstring_equal("/foo/bar/", rv.value()); + } + + { + auto rv = util::normalize_path("/foo/abc/../bar/"); + + assert_true(rv.has_value()); + assert_stdstring_equal("/foo/bar/", rv.value()); + } + + { + auto rv = util::normalize_path("/../foo/abc/../bar/"); + + assert_true(rv.has_value()); + assert_stdstring_equal("/foo/bar/", rv.value()); + } + + { + auto rv = util::normalize_path("/./foo/././abc///.././bar/./"); + + assert_true(rv.has_value()); + assert_stdstring_equal("/foo/bar/", rv.value()); + } + + { + auto rv = util::normalize_path("/foo/."); + + assert_true(rv.has_value()); + assert_stdstring_equal("/foo/", rv.value()); + } + + { + auto rv = util::normalize_path("/foo/./bar"); + + assert_true(rv.has_value()); + assert_stdstring_equal("/foo/bar", rv.value()); + } + + { + auto rv = util::normalize_path("/foo/./../bar"); + + assert_true(rv.has_value()); + assert_stdstring_equal("/bar", rv.value()); + } + + { + auto rv = util::normalize_path("/../../bar"); + + assert_true(rv.has_value()); + assert_stdstring_equal("/bar", rv.value()); + } + + { + auto rv = util::normalize_path(std::string(1024, '/')); + + assert_true(rv.has_value()); + assert_stdstring_equal("/", rv.value()); + } + + { + auto rv = util::normalize_path(std::string(1025, '/')); + + assert_false(rv); + } + + { + auto rv = util::normalize_path("/.."); + + assert_true(rv.has_value()); + assert_stdstring_equal("/", rv.value()); + } + + { + auto rv = util::normalize_path("/../../index.html"); + + assert_true(rv.has_value()); + assert_stdstring_equal("/index.html", rv.value()); + } +} + +void test_util_hexdump() { + char buf[4096]; + + struct hexdump_testdata { + const char *title; + std::string_view data; + std::string_view dump; + }; + + auto tests = std::to_array({ + { + .title = "Empty data", + .data = ""sv, + .dump = ""sv, + }, + { + .title = "1 byte", + .data = "0"sv, + .dump = "00000000 30 " + "|0|\n" + "00000001\n"sv, + }, + { + .title = "8 bytes", + .data = "01234567"sv, + .dump = "00000000 30 31 32 33 34 35 36 37 " + "|01234567|\n" + "00000008\n"sv, + }, + { + .title = "9 bytes", + .data = "012345678"sv, + .dump = "00000000 30 31 32 33 34 35 36 37 38 " + "|012345678|\n" + "00000009\n"sv, + }, + { + .title = "15 bytes", + .data = "0123456789abcde"sv, + .dump = "00000000 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 " + "|0123456789abcde|\n" + "0000000f\n"sv, + }, + { + .title = "16 bytes", + .data = "0123456789abcdef"sv, + .dump = "00000000 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 " + "|0123456789abcdef|\n" + "00000010\n"sv, + }, + { + .title = "17 bytes", + .data = "0123456789abcdefg"sv, + .dump = "00000000 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 " + "|0123456789abcdef|\n" + "00000010 67 " + "|g|\n" + "00000011\n"sv, + }, + { + .title = "Non-printables", + .data = "\0\a\b\t\n\v\f\r\x7F"sv, + .dump = "00000000 00 07 08 09 0a 0b 0c 0d 7f " + "|.........|\n" + "00000009\n"sv, + }, + { + .title = "Multiple lines", + .data = "alpha bravo charlie delta echo foxtrot golf"sv, + .dump = "00000000 61 6c 70 68 61 20 62 72 61 76 6f 20 63 68 61 72 " + "|alpha bravo char|\n" + "00000010 6c 69 65 20 64 65 6c 74 61 20 65 63 68 6f 20 66 " + "|lie delta echo f|\n" + "00000020 6f 78 74 72 6f 74 20 67 6f 6c 66 " + "|oxtrot golf|\n" + "0000002b\n"sv, + }, + { + .title = "Repeated lines", + .data = "000000000000000100000000000000010000000000000001000000000000" + "00020000" + "0000000000020000000000000003"sv, + .dump = "00000000 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 " + "|0000000000000001|\n" + "*\n" + "00000030 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 " + "|0000000000000002|\n" + "*\n" + "00000050 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 " + "|0000000000000003|\n" + "00000060\n"sv, + }, + { + .title = "Ends with the repeated line", + .data = "" + "000000000000000100000000000000010000000000000001000000000000" + "00020000000000000002"sv, + .dump = "00000000 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 " + "|0000000000000001|\n" + "*\n" + "00000030 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 " + "|0000000000000002|\n" + "*\n" + "00000050\n"sv, + }, + }); + + for (auto &t : tests) { + munit_log(MUNIT_LOG_INFO, t.title); + + auto f = tmpfile(); + auto rv = util::hexdump(f, std::span{t.data}); + + assert_true(rv.has_value()); + + fseek(f, 0, SEEK_SET); + auto nread = fread(buf, 1, sizeof(buf), f); + buf[nread] = '\0'; + + assert_stdsv_equal(t.dump, buf); + + fclose(f); + } +} + +void test_util_format_hex() { + auto a = std::to_array({0xDE, 0xAD, 0xBE, 0xEF}); + + assert_stdstring_equal("deadbeef"s, util::format_hex(a)); + assert_stdstring_equal("deadbeef"s, util::format_hex(0xDEADBEEF)); + assert_stdstring_equal("beef"s, util::format_hex(a.data() + 2, 2)); + + std::array buf; + + assert_stdsv_equal( + "00"sv, (std::string_view{std::ranges::begin(buf), + util::format_hex(static_cast(0U), + std::ranges::begin(buf))})); + assert_stdsv_equal( + "ec"sv, (std::string_view{std::ranges::begin(buf), + util::format_hex(static_cast(0xECU), + std::ranges::begin(buf))})); + assert_stdsv_equal( + "00000000"sv, + (std::string_view{std::ranges::begin(buf), + util::format_hex(0U, std::ranges::begin(buf))})); + assert_stdsv_equal( + "0000ab01"sv, + (std::string_view{std::ranges::begin(buf), + util::format_hex(0xAB01U, std::ranges::begin(buf))})); + assert_stdsv_equal( + "deadbeefbaadf00d"sv, + (std::string_view{ + std::ranges::begin(buf), + util::format_hex(0xDEADBEEFBAADF00DU, std::ranges::begin(buf))})); + assert_stdsv_equal( + "ffffffffffffffff"sv, + (std::string_view{std::ranges::begin(buf), + util::format_hex(std::numeric_limits::max(), + std::ranges::begin(buf))})); + + std::vector char_vec; + util::format_hex(a, std::back_inserter(char_vec)); + + assert_stdsv_equal("deadbeef"sv, + (std::string_view{std::ranges::begin(char_vec), + std::ranges::end(char_vec)})); + + std::vector uint8_vec; + util::format_hex(a, std::back_inserter(uint8_vec)); + + assert_stdsv_equal( + "deadbeef"sv, + (std::string_view{reinterpret_cast(uint8_vec.data()), + uint8_vec.size()})); +} + +void test_util_decode_hex() { + assert_stdstring_equal("\xDE\xAD\xBE\xEF"s, util::decode_hex("deadbeef"sv)); + assert_stdstring_equal(""s, util::decode_hex(""sv)); +} + +void test_util_is_hex_string() { + assert_true(util::is_hex_string(""sv)); + assert_true(util::is_hex_string("0123456789abcdef"sv)); + assert_true(util::is_hex_string("0123456789ABCDEF"sv)); + assert_false(util::is_hex_string("0123456789ABCDEF9"sv)); + assert_false(util::is_hex_string("aaa"sv)); + assert_true(util::is_hex_string("aa"sv)); + assert_false(util::is_hex_string("a"sv)); + assert_false(util::is_hex_string("zzz"sv)); + assert_false(util::is_hex_string("zz"sv)); + assert_false(util::is_hex_string("z"sv)); +} + +void test_util_split_str() { + assert_true((std::vector{"alpha"sv, "bravo"sv, "charlie"sv} == + (util::split_str("alpha,bravo,charlie"sv) | + std::ranges::to()))); + assert_true((std::vector{"alpha"sv, "bravo"sv, "charlie"sv} == + (util::split_str("alpha bravo charlie"sv, ' ') | + std::ranges::to()))); + assert_true((std::vector{} == + (util::split_str(""sv, ' ') | std::ranges::to()))); + assert_true((std::vector{""sv, ""sv} == + (util::split_str(","sv) | std::ranges::to()))); + assert_true( + (std::vector{""sv, "alpha"sv, ""sv, ""sv, "bravo"sv, "charlie"sv, ""sv, + ""sv} == (util::split_str(" alpha bravo charlie "sv, ' ') | + std::ranges::to()))); +} + +void test_util_format_app_error_code() { + assert_stdstring_equal("(no error)", util::format_app_error_code({})); + assert_stdstring_equal("0xfe01", util::format_app_error_code(0xfe01)); +} + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/examples/util_test.h b/deps/ngtcp2/ngtcp2/examples/util_test.h new file mode 100644 index 000000000000..b672211fdbf8 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/util_test.h @@ -0,0 +1,57 @@ +/* + * ngtcp2 + * + * Copyright (c) 2018 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef UTIL_TEST_H +#define UTIL_TEST_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif // defined(HAVE_CONFIG_H) + +#define MUNIT_ENABLE_ASSERT_ALIASES + +#include "munitxx.h" + +namespace ngtcp2 { + +extern const MunitSuite util_suite; + +munit_void_test_decl(test_util_format_durationf) +munit_void_test_decl(test_util_format_uint) +munit_void_test_decl(test_util_format_uint_iec) +munit_void_test_decl(test_util_format_duration) +munit_void_test_decl(test_util_parse_uint) +munit_void_test_decl(test_util_parse_uint_iec) +munit_void_test_decl(test_util_parse_duration) +munit_void_test_decl(test_util_normalize_path) +munit_void_test_decl(test_util_hexdump) +munit_void_test_decl(test_util_format_hex) +munit_void_test_decl(test_util_decode_hex) +munit_void_test_decl(test_util_is_hex_string) +munit_void_test_decl(test_util_split_str) +munit_void_test_decl(test_util_format_app_error_code) + +} // namespace ngtcp2 + +#endif // !defined(UTIL_TEST_H) diff --git a/deps/ngtcp2/ngtcp2/examples/util_wolfssl.cc b/deps/ngtcp2/ngtcp2/examples/util_wolfssl.cc new file mode 100644 index 000000000000..904067b101ed --- /dev/null +++ b/deps/ngtcp2/ngtcp2/examples/util_wolfssl.cc @@ -0,0 +1,129 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "util.h" + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include "template.h" + +namespace ngtcp2 { + +namespace util { + +std::expected generate_secure_random(std::span data) { + if (wolfSSL_RAND_bytes(data.data(), static_cast(data.size())) != 1) { + return std::unexpected{Error::CRYPTO}; + } + + return {}; +} + +std::expected +read_hpke_private_key_pem(const std::filesystem::path &path) { + return std::unexpected{Error::NOT_IMPLEMENTED}; +} + +std::expected, Error> +read_pem(const std::filesystem::path &path, std::string_view name, + std::string_view type) { + auto f = wolfSSL_BIO_new_file(path.c_str(), "r"); + if (f == nullptr) { + std::println(stderr, "Could not open {} file {}", name, path.native()); + return std::unexpected{Error::IO}; + } + + auto f_d = defer([f] { wolfSSL_BIO_free(f); }); + + char *pem_type, *header; + unsigned char *data; + long datalen; + + if (wolfSSL_PEM_read_bio(f, &pem_type, &header, &data, &datalen) != 1) { + std::println(stderr, "Could not read {} file {}", name, path.native()); + return std::unexpected{Error::IO}; + } + + auto pem_d = defer([pem_type, header, data] { + wolfSSL_OPENSSL_free(pem_type); + wolfSSL_OPENSSL_free(header); + wolfSSL_OPENSSL_free(data); + }); + + if (type != pem_type) { + std::println(stderr, "{} file {} contains unexpected type", name, + path.native()); + return std::unexpected{Error::IO}; + } + + return {{data, data + datalen}}; +} + +std::expected write_pem(const std::filesystem::path &path, + std::string_view name, + std::string_view type, + std::span data) { + auto f = wolfSSL_BIO_new_file(path.c_str(), "w"); + if (f == nullptr) { + std::println(stderr, "Could not write {} to {}", name, path.native()); + return std::unexpected{Error::IO}; + } + + wolfSSL_PEM_write_bio(f, type.data(), "", data.data(), + static_cast(data.size())); + wolfSSL_BIO_free(f); + + return {}; +} + +const char *crypto_default_ciphers() { + return "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_" + "SHA256:TLS_AES_128_CCM_SHA256"; +} + +const char *crypto_default_groups() { + return "X25519:P-256:P-384:P-521" +#ifdef WOLFSSL_HAVE_MLKEM +# if LIBWOLFSSL_VERSION_HEX < 0x05008004 + ":X25519_ML_KEM_768" +# else // LIBWOLFSSL_VERSION_HEX >= 0x05008004 + ":X25519MLKEM768" +# endif // LIBWOLFSSL_VERSION_HEX >= 0x05008004 +#endif // WOLFSSL_HAVE_MLKEM + ; +} + +} // namespace util + +} // namespace ngtcp2 diff --git a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h index d58a6f1240d4..9bc9a7b512e6 100644 --- a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h +++ b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h @@ -262,7 +262,7 @@ typedef struct ngtcp2_mem { * * :macro:`NGTCP2_PROTO_VER_V1` is the QUIC version 1. */ -#define NGTCP2_PROTO_VER_V1 ((uint32_t)0x00000001u) +#define NGTCP2_PROTO_VER_V1 ((uint32_t)0x00000001U) /** * @macro @@ -270,21 +270,29 @@ typedef struct ngtcp2_mem { * :macro:`NGTCP2_PROTO_VER_V2` is the QUIC version 2. See * :rfc:`9369`. */ -#define NGTCP2_PROTO_VER_V2 ((uint32_t)0x6b3343cfu) +#define NGTCP2_PROTO_VER_V2 ((uint32_t)0x6B3343CFU) /** * @macro * + * .. warning:: + * + * .. version-deprecated:: 1.1.0 + * * :macro:`NGTCP2_PROTO_VER_MAX` is the highest QUIC version that this - * library supports. Deprecated since v1.1.0. + * library supports. */ #define NGTCP2_PROTO_VER_MAX NGTCP2_PROTO_VER_V1 /** * @macro * + * .. warning:: + * + * .. version-deprecated:: 1.1.0 + * * :macro:`NGTCP2_PROTO_VER_MIN` is the lowest QUIC version that this - * library supports. Deprecated since v1.1.0. + * library supports. */ #define NGTCP2_PROTO_VER_MIN NGTCP2_PROTO_VER_V1 @@ -294,7 +302,7 @@ typedef struct ngtcp2_mem { * :macro:`NGTCP2_RESERVED_VERSION_MASK` is the bit mask of reserved * version. */ -#define NGTCP2_RESERVED_VERSION_MASK 0x0a0a0a0au +#define NGTCP2_RESERVED_VERSION_MASK 0x0A0A0A0AU /** * @macrosection @@ -306,14 +314,30 @@ typedef struct ngtcp2_mem { * @macro * * :macro:`NGTCP2_MAX_UDP_PAYLOAD_SIZE` is the default maximum UDP - * datagram payload size that the local endpoint transmits. + * datagram payload size that the local endpoint transmits without + * Path MTU Discovery (PMTUD) or the custom settings (see + * :member:`ngtcp2_settings.max_tx_udp_payload_size` and + * :member:`ngtcp2_settings.no_tx_udp_payload_size_shaping`). */ #define NGTCP2_MAX_UDP_PAYLOAD_SIZE 1200 /** * @macro * - * :macro:`NGTCP2_MAX_PMTUD_UDP_PAYLOAD_SIZE` is the maximum UDP + * :macro:`NGTCP2_MAX_TX_UDP_PAYLOAD_SIZE` is the maximum UDP datagram + * payload size that this library can output. + */ +#define NGTCP2_MAX_TX_UDP_PAYLOAD_SIZE 65527 + +/** + * @macro + * + * .. warning:: + * + * .. version-deprecated:: 1.17.0 + * Path MTU Discovery is not capped to this value anymore. + * + * :macro:`NGTCP2_MAX_PMTUD_UDP_PAYLOAD_SIZE` was the maximum UDP * datagram payload size that Path MTU Discovery can discover. */ #define NGTCP2_MAX_PMTUD_UDP_PAYLOAD_SIZE 1452 @@ -363,7 +387,7 @@ typedef struct ngtcp2_mem { * integrity tag of Retry packet. It is used for QUIC v1. */ #define NGTCP2_RETRY_KEY_V1 \ - "\xbe\x0c\x69\x0b\x9f\x66\x57\x5a\x1d\x76\x6b\x54\xe3\x68\xc8\x4e" + "\xBE\x0C\x69\x0B\x9F\x66\x57\x5A\x1D\x76\x6B\x54\xE3\x68\xC8\x4E" /** * @macro @@ -371,7 +395,7 @@ typedef struct ngtcp2_mem { * :macro:`NGTCP2_RETRY_NONCE_V1` is nonce used when generating * integrity tag of Retry packet. It is used for QUIC v1. */ -#define NGTCP2_RETRY_NONCE_V1 "\x46\x15\x99\xd3\x5d\x63\x2b\xf2\x23\x98\x25\xbb" +#define NGTCP2_RETRY_NONCE_V1 "\x46\x15\x99\xD3\x5D\x63\x2B\xF2\x23\x98\x25\xBB" /** * @macro @@ -381,7 +405,7 @@ typedef struct ngtcp2_mem { * :rfc:`9369`. */ #define NGTCP2_RETRY_KEY_V2 \ - "\x8f\xb4\xb0\x1b\x56\xac\x48\xe2\x60\xfb\xcb\xce\xad\x7c\xcc\x92" + "\x8F\xB4\xB0\x1B\x56\xAC\x48\xE2\x60\xFB\xCB\xCE\xAD\x7C\xCC\x92" /** * @macro @@ -390,7 +414,7 @@ typedef struct ngtcp2_mem { * integrity tag of Retry packet. It is used for QUIC v2. See * :rfc:`9369`. */ -#define NGTCP2_RETRY_NONCE_V2 "\xd8\x69\x69\xbc\x2d\x7c\x6d\x99\x90\xef\xb0\x4a" +#define NGTCP2_RETRY_NONCE_V2 "\xD8\x69\x69\xBC\x2D\x7C\x6D\x99\x90\xEF\xB0\x4A" /** * @macro @@ -798,7 +822,7 @@ typedef struct NGTCP2_ALIGN(8) ngtcp2_pkt_info { * * :macro:`NGTCP2_PKT_FLAG_NONE` indicates no flag set. */ -#define NGTCP2_PKT_FLAG_NONE 0x00u +#define NGTCP2_PKT_FLAG_NONE 0x00U /** * @macro @@ -806,7 +830,7 @@ typedef struct NGTCP2_ALIGN(8) ngtcp2_pkt_info { * :macro:`NGTCP2_PKT_FLAG_LONG_FORM` indicates the Long header packet * header. */ -#define NGTCP2_PKT_FLAG_LONG_FORM 0x01u +#define NGTCP2_PKT_FLAG_LONG_FORM 0x01U /** * @macro @@ -814,14 +838,14 @@ typedef struct NGTCP2_ALIGN(8) ngtcp2_pkt_info { * :macro:`NGTCP2_PKT_FLAG_FIXED_BIT_CLEAR` indicates that Fixed Bit * (aka QUIC bit) is not set. */ -#define NGTCP2_PKT_FLAG_FIXED_BIT_CLEAR 0x02u +#define NGTCP2_PKT_FLAG_FIXED_BIT_CLEAR 0x02U /** * @macro * * :macro:`NGTCP2_PKT_FLAG_KEY_PHASE` indicates Key Phase bit set. */ -#define NGTCP2_PKT_FLAG_KEY_PHASE 0x04u +#define NGTCP2_PKT_FLAG_KEY_PHASE 0x04U /** * @enum @@ -873,7 +897,7 @@ typedef enum ngtcp2_pkt_type { * * :macro:`NGTCP2_NO_ERROR` is QUIC transport error code ``NO_ERROR``. */ -#define NGTCP2_NO_ERROR 0x0u +#define NGTCP2_NO_ERROR 0x0U /** * @macro @@ -881,7 +905,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_INTERNAL_ERROR` is QUIC transport error code * ``INTERNAL_ERROR``. */ -#define NGTCP2_INTERNAL_ERROR 0x1u +#define NGTCP2_INTERNAL_ERROR 0x1U /** * @macro @@ -889,7 +913,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_CONNECTION_REFUSED` is QUIC transport error code * ``CONNECTION_REFUSED``. */ -#define NGTCP2_CONNECTION_REFUSED 0x2u +#define NGTCP2_CONNECTION_REFUSED 0x2U /** * @macro @@ -897,7 +921,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_FLOW_CONTROL_ERROR` is QUIC transport error code * ``FLOW_CONTROL_ERROR``. */ -#define NGTCP2_FLOW_CONTROL_ERROR 0x3u +#define NGTCP2_FLOW_CONTROL_ERROR 0x3U /** * @macro @@ -905,7 +929,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_STREAM_LIMIT_ERROR` is QUIC transport error code * ``STREAM_LIMIT_ERROR``. */ -#define NGTCP2_STREAM_LIMIT_ERROR 0x4u +#define NGTCP2_STREAM_LIMIT_ERROR 0x4U /** * @macro @@ -913,7 +937,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_STREAM_STATE_ERROR` is QUIC transport error code * ``STREAM_STATE_ERROR``. */ -#define NGTCP2_STREAM_STATE_ERROR 0x5u +#define NGTCP2_STREAM_STATE_ERROR 0x5U /** * @macro @@ -921,7 +945,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_FINAL_SIZE_ERROR` is QUIC transport error code * ``FINAL_SIZE_ERROR``. */ -#define NGTCP2_FINAL_SIZE_ERROR 0x6u +#define NGTCP2_FINAL_SIZE_ERROR 0x6U /** * @macro @@ -929,7 +953,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_FRAME_ENCODING_ERROR` is QUIC transport error code * ``FRAME_ENCODING_ERROR``. */ -#define NGTCP2_FRAME_ENCODING_ERROR 0x7u +#define NGTCP2_FRAME_ENCODING_ERROR 0x7U /** * @macro @@ -937,7 +961,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_TRANSPORT_PARAMETER_ERROR` is QUIC transport error * code ``TRANSPORT_PARAMETER_ERROR``. */ -#define NGTCP2_TRANSPORT_PARAMETER_ERROR 0x8u +#define NGTCP2_TRANSPORT_PARAMETER_ERROR 0x8U /** * @macro @@ -945,7 +969,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_CONNECTION_ID_LIMIT_ERROR` is QUIC transport error * code ``CONNECTION_ID_LIMIT_ERROR``. */ -#define NGTCP2_CONNECTION_ID_LIMIT_ERROR 0x9u +#define NGTCP2_CONNECTION_ID_LIMIT_ERROR 0x9U /** * @macro @@ -953,7 +977,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_PROTOCOL_VIOLATION` is QUIC transport error code * ``PROTOCOL_VIOLATION``. */ -#define NGTCP2_PROTOCOL_VIOLATION 0xau +#define NGTCP2_PROTOCOL_VIOLATION 0xAU /** * @macro @@ -961,7 +985,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_INVALID_TOKEN` is QUIC transport error code * ``INVALID_TOKEN``. */ -#define NGTCP2_INVALID_TOKEN 0xbu +#define NGTCP2_INVALID_TOKEN 0xBU /** * @macro @@ -969,7 +993,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_APPLICATION_ERROR` is QUIC transport error code * ``APPLICATION_ERROR``. */ -#define NGTCP2_APPLICATION_ERROR 0xcu +#define NGTCP2_APPLICATION_ERROR 0xCU /** * @macro @@ -977,7 +1001,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_CRYPTO_BUFFER_EXCEEDED` is QUIC transport error code * ``CRYPTO_BUFFER_EXCEEDED``. */ -#define NGTCP2_CRYPTO_BUFFER_EXCEEDED 0xdu +#define NGTCP2_CRYPTO_BUFFER_EXCEEDED 0xDU /** * @macro @@ -985,7 +1009,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_KEY_UPDATE_ERROR` is QUIC transport error code * ``KEY_UPDATE_ERROR``. */ -#define NGTCP2_KEY_UPDATE_ERROR 0xeu +#define NGTCP2_KEY_UPDATE_ERROR 0xEU /** * @macro @@ -993,7 +1017,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_AEAD_LIMIT_REACHED` is QUIC transport error code * ``AEAD_LIMIT_REACHED``. */ -#define NGTCP2_AEAD_LIMIT_REACHED 0xfu +#define NGTCP2_AEAD_LIMIT_REACHED 0xFU /** * @macro @@ -1001,7 +1025,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_NO_VIABLE_PATH` is QUIC transport error code * ``NO_VIABLE_PATH``. */ -#define NGTCP2_NO_VIABLE_PATH 0x10u +#define NGTCP2_NO_VIABLE_PATH 0x10U /** * @macro @@ -1009,7 +1033,7 @@ typedef enum ngtcp2_pkt_type { * :macro:`NGTCP2_CRYPTO_ERROR` is QUIC transport error code * ``CRYPTO_ERROR``. */ -#define NGTCP2_CRYPTO_ERROR 0x100u +#define NGTCP2_CRYPTO_ERROR 0x100U /** * @macro @@ -1172,6 +1196,11 @@ typedef struct ngtcp2_pkt_hd { /** * @struct * + * .. warning:: + * + * .. version-deprecated:: 1.22.0 + * Use :type:`ngtcp2_pkt_stateless_reset2` instead. + * * :type:`ngtcp2_pkt_stateless_reset` represents Stateless Reset. */ typedef struct ngtcp2_pkt_stateless_reset { @@ -1190,6 +1219,40 @@ typedef struct ngtcp2_pkt_stateless_reset { size_t randlen; } ngtcp2_pkt_stateless_reset; +/** + * @struct + * + * :type:`ngtcp2_stateless_reset_token` stores stateless reset token. + * + * .. version-added:: 1.22.0 + */ +typedef struct ngtcp2_stateless_reset_token { + uint8_t data[NGTCP2_STATELESS_RESET_TOKENLEN]; +} ngtcp2_stateless_reset_token; + +/** + * @struct + * + * :type:`ngtcp2_pkt_stateless_reset2` represents Stateless Reset. + * + * .. version-added:: 1.22.0 + */ +typedef struct ngtcp2_pkt_stateless_reset2 { + /** + * :member:`token` contains stateless reset token. + */ + ngtcp2_stateless_reset_token token; + /** + * :member:`rand` points a buffer which contains random bytes + * section. + */ + const uint8_t *rand; + /** + * :member:`randlen` is the number of random bytes. + */ + size_t randlen; +} ngtcp2_pkt_stateless_reset2; + /** * @macrosection * @@ -1236,7 +1299,7 @@ typedef struct ngtcp2_pkt_stateless_reset { * :macro:`NGTCP2_TLSEXT_QUIC_TRANSPORT_PARAMETERS_V1` is TLS * extension type of quic_transport_parameters. */ -#define NGTCP2_TLSEXT_QUIC_TRANSPORT_PARAMETERS_V1 0x39u +#define NGTCP2_TLSEXT_QUIC_TRANSPORT_PARAMETERS_V1 0x39U #ifdef NGTCP2_USE_GENERIC_SOCKADDR # ifndef NGTCP2_AF_INET @@ -1267,7 +1330,7 @@ typedef struct ngtcp2_sockaddr_in { } ngtcp2_sockaddr_in; typedef struct ngtcp2_in6_addr { - uint8_t in6_addr[16]; + uint8_t s6_addr[16]; } ngtcp2_in6_addr; typedef struct ngtcp2_sockaddr_in6 { @@ -1299,6 +1362,14 @@ typedef struct sockaddr ngtcp2_sockaddr; * the generic struct sockaddr_in defined in ngtcp2.h. */ typedef struct sockaddr_in ngtcp2_sockaddr_in; +/** + * @typedef + * + * :type:`ngtcp2_in_addr` is typedefed to struct in_addr. If + * :macro:`NGTCP2_USE_GENERIC_SOCKADDR` is defined, it is typedefed to + * the generic struct in_addr defined in ngtcp2.h. + */ +typedef struct in_addr ngtcp2_in_addr; /** * @typedef * @@ -1307,6 +1378,14 @@ typedef struct sockaddr_in ngtcp2_sockaddr_in; * to the generic struct sockaddr_in6 defined in ngtcp2.h. */ typedef struct sockaddr_in6 ngtcp2_sockaddr_in6; +/** + * @typedef + * + * :type:`ngtcp2_in6_addr` is typedefed to struct in6_addr. If + * :macro:`NGTCP2_USE_GENERIC_SOCKADDR` is defined, it is typedefed to + * the generic struct in6_addr defined in ngtcp2.h. + */ +typedef struct in6_addr ngtcp2_in6_addr; /** * @typedef * @@ -1561,7 +1640,8 @@ typedef struct ngtcp2_transport_params { } ngtcp2_transport_params; #define NGTCP2_CONN_INFO_V1 1 -#define NGTCP2_CONN_INFO_VERSION NGTCP2_CONN_INFO_V1 +#define NGTCP2_CONN_INFO_V2 2 +#define NGTCP2_CONN_INFO_VERSION NGTCP2_CONN_INFO_V2 /** * @struct @@ -1600,6 +1680,61 @@ typedef struct ngtcp2_conn_info { * packets which have not been acknowledged. */ uint64_t bytes_in_flight; + /* The following fields have been added since + NGTCP2_CONN_INFO_V2. */ + /** + * :member:`pkt_sent` is the number of QUIC packets sent. + * + * .. version-added:: 1.16.0 + */ + uint64_t pkt_sent; + /** + * :member:`bytes_sent` is the number of bytes (the sum of QUIC + * packet length) sent. + * + * .. version-added:: 1.16.0 + */ + uint64_t bytes_sent; + /** + * :member:`pkt_recv` is the number of QUIC packets received, + * excluding discarded ones. + * + * .. version-added:: 1.16.0 + */ + uint64_t pkt_recv; + /** + * :member:`bytes_recv` is the number of bytes (the sum of QUIC + * packet length) received, excluding discarded ones. + * + * .. version-added:: 1.16.0 + */ + uint64_t bytes_recv; + /** + * :member:`pkt_lost` is the number of QUIC packets that are + * considered lost, excluding PMTUD packets. + * + * .. version-added:: 1.16.0 + */ + uint64_t pkt_lost; + /** + * :member:`bytes_lost` is the number of bytes (the sum of QUIC + * packet length) lost, excluding PMTUD packets. + * + * .. version-added:: 1.16.0 + */ + uint64_t bytes_lost; + /** + * :member:`ping_recv` is the number of PING frames received. + * + * .. version-added:: 1.16.0 + */ + uint64_t ping_recv; + /** + * :member:`pkt_discarded` is the number of QUIC packets discarded. + * + * .. version-added:: 1.16.0 + */ + uint64_t pkt_discarded; } ngtcp2_conn_info; /** @@ -1625,12 +1760,32 @@ typedef enum ngtcp2_cc_algo { /** * @functypedef * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use :type:`ngtcp2_log_write` instead. + * * :type:`ngtcp2_printf` is a callback function for logging. * |user_data| is the same object passed to `ngtcp2_conn_client_new` * or `ngtcp2_conn_server_new`. */ typedef void (*ngtcp2_printf)(void *user_data, const char *format, ...); +/** + * @functypedef + * + * :type:`ngtcp2_log_write` is a callback function for logging. + * |user_data| is the same object passed to `ngtcp2_conn_client_new` + * or `ngtcp2_conn_server_new`. The caller guarantees that the memory + * region [|msg|, |msg| + |len|], inclusive, are writable, and + * |msg|[|len|] == '\0'. If application needs to emit a single line + * with a line terminator, one can do msg[len] = '\n', and write |len| + * + 1 bytes from |msg|. + * + * .. version-added:: 1.23.0 + */ +typedef void (*ngtcp2_log_write)(void *user_data, char *msg, size_t len); + /** * @macrosection * @@ -1642,14 +1797,14 @@ typedef void (*ngtcp2_printf)(void *user_data, const char *format, ...); * * :macro:`NGTCP2_QLOG_WRITE_FLAG_NONE` indicates no flag set. */ -#define NGTCP2_QLOG_WRITE_FLAG_NONE 0x00u +#define NGTCP2_QLOG_WRITE_FLAG_NONE 0x00U /** * @macro * * :macro:`NGTCP2_QLOG_WRITE_FLAG_FIN` indicates that this is the * final call to :type:`ngtcp2_qlog_write` in the current connection. */ -#define NGTCP2_QLOG_WRITE_FLAG_FIN 0x01u +#define NGTCP2_QLOG_WRITE_FLAG_FIN 0x01U /** * @struct @@ -1705,7 +1860,8 @@ typedef enum ngtcp2_token_type { #define NGTCP2_SETTINGS_V1 1 #define NGTCP2_SETTINGS_V2 2 #define NGTCP2_SETTINGS_V3 3 -#define NGTCP2_SETTINGS_VERSION NGTCP2_SETTINGS_V3 +#define NGTCP2_SETTINGS_V4 4 +#define NGTCP2_SETTINGS_VERSION NGTCP2_SETTINGS_V4 /** * @struct @@ -1732,6 +1888,11 @@ typedef struct ngtcp2_settings { */ ngtcp2_duration initial_rtt; /** + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use :member:`log_write` instead. + * * :member:`log_printf` is a function that the library uses to write * logs. ``NULL`` means no logging output. It is nothing to do * with qlog. @@ -1739,7 +1900,9 @@ typedef struct ngtcp2_settings { ngtcp2_printf log_printf; /** * :member:`max_tx_udp_payload_size` is the maximum size of UDP - * datagram payload that the local endpoint transmits. + * datagram payload that the local endpoint transmits. This must be + * larger than or equal to :macro:`NGTCP2_MAX_UDP_PAYLOAD_SIZE`, and + * less then or equal to :macro:`NGTCP2_MAX_TX_UDP_PAYLOAD_SIZE`. */ size_t max_tx_udp_payload_size; /** @@ -1803,8 +1966,8 @@ typedef struct ngtcp2_settings { uint64_t max_stream_window; /** * :member:`ack_thresh` is the minimum number of the received ACK - * eliciting packets that trigger the immediate acknowledgement from - * the local endpoint. + * eliciting packets that triggers the immediate acknowledgement + * from the local endpoint. */ size_t ack_thresh; /** @@ -1904,18 +2067,21 @@ typedef struct ngtcp2_settings { /** * :member:`pmtud_probes` is the array of UDP datagram payload size * to probe during Path MTU Discovery. The discovery is done in the - * order appeared in this array. The size must be strictly larger - * than 1200, otherwise the behavior is undefined. The maximum - * value in this array should be set to - * :member:`max_tx_udp_payload_size`. If this field is not set, the - * predefined PMTUD probes are made. This field has been available - * since v1.4.0. + * order appeared in this array. The payload size must be strictly + * larger than :macro:`NGTCP2_MAX_UDP_PAYLOAD_SIZE`, and less than + * or equal to :macro:`NGTCP2_MAX_TX_UDP_PAYLOAD_SIZE`. Otherwise + * the behavior is undefined. The maximum value in this array + * should be set to :member:`max_tx_udp_payload_size`. If this + * field is not set, the predefined PMTUD probes are made. + * + * .. version-added:: 1.4.0 */ const uint16_t *pmtud_probes; /** * :member:`pmtud_probeslen` is the number of elements that are - * contained in the array pointed by :member:`pmtud_probes`. This - * field has been available since v1.4.0. + * contained in the array pointed by :member:`pmtud_probes`. + * + * .. version-added:: 1.4.0 */ size_t pmtud_probeslen; /* The following fields have been added since NGTCP2_SETTINGS_V3. */ @@ -1925,16 +2091,31 @@ typedef struct ngtcp2_settings { * activity from a remote endpoint. If detected, certain amount of * tokens are consumed. If no tokens are available to consume, the * connection is closed. The rate of token generation is specified - * by :member:`glitch_ratelim_rate`. This field has been available - * since v1.15.0. + * by :member:`glitch_ratelim_rate`. + * + * .. version-added:: 1.15.0 */ uint64_t glitch_ratelim_burst; /** * :member:`glitch_ratelim_rate` is the number of tokens generated * per second. See :member:`glitch_ratelim_burst` for "glitch" rate - * limiter. This field has been available since v1.15.0. + * limiter. + * + * .. version-added:: 1.15.0 */ uint64_t glitch_ratelim_rate; + /* The following fields have been added since NGTCP2_SETTINGS_V4. */ + /** + * :member:`log_write` is the callback function when a single log + * message is emitted. If both :member:`log_write` and + * :member:`log_printf` are specified, the former has precedence. + * If both :member:`log_write` and :member:`log_printf` are + * ``NULL``, logging is disabled. For qlog, see + * :member:`qlog_write`. + * + * .. version-added:: 1.23.0 + */ + ngtcp2_log_write log_write; } ngtcp2_settings; /** @@ -2360,6 +2541,11 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_decode_hd_short(ngtcp2_pkt_hd *dest, /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.22.0 + * Use `ngtcp2_pkt_write_stateless_reset2` instead. + * * `ngtcp2_pkt_write_stateless_reset` writes Stateless Reset packet in * the buffer pointed by |dest| whose length is |destlen|. * |stateless_reset_token| is a pointer to the Stateless Reset Token, @@ -2385,6 +2571,34 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_write_stateless_reset( uint8_t *dest, size_t destlen, const uint8_t *stateless_reset_token, const uint8_t *rand, size_t randlen); +/** + * @function + * + * `ngtcp2_pkt_write_stateless_reset2` writes Stateless Reset packet + * in the buffer pointed by |dest| whose length is |destlen|. |token| + * must store the Stateless Reset Token. |rand| specifies the random + * octets preceding Stateless Reset Token. The length of |rand| is + * specified by |randlen| which must be at least + * :macro:`NGTCP2_MIN_STATELESS_RESET_RANDLEN` bytes long. + * + * If |randlen| is too long to write them all in the buffer, |rand| is + * written to the buffer as much as possible, and is truncated. + * + * This function returns the number of bytes written to the buffer, or + * one of the following negative error codes: + * + * :macro:`NGTCP2_ERR_NOBUF` + * Buffer is too small. + * :macro:`NGTCP2_ERR_INVALID_ARGUMENT` + * |randlen| is strictly less than + * :macro:`NGTCP2_MIN_STATELESS_RESET_RANDLEN`. + * + * .. version-added:: 1.22.0 + */ +NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_write_stateless_reset2( + uint8_t *dest, size_t destlen, const ngtcp2_stateless_reset_token *token, + const uint8_t *rand, size_t randlen); + /** * @function * @@ -2680,7 +2894,7 @@ typedef int (*ngtcp2_hp_mask)(uint8_t *dest, const ngtcp2_crypto_cipher *hp, * * :macro:`NGTCP2_STREAM_DATA_FLAG_NONE` indicates no flag set. */ -#define NGTCP2_STREAM_DATA_FLAG_NONE 0x00u +#define NGTCP2_STREAM_DATA_FLAG_NONE 0x00U /** * @macro @@ -2688,7 +2902,7 @@ typedef int (*ngtcp2_hp_mask)(uint8_t *dest, const ngtcp2_crypto_cipher *hp, * :macro:`NGTCP2_STREAM_DATA_FLAG_FIN` indicates that this chunk of * data is final piece of an incoming stream. */ -#define NGTCP2_STREAM_DATA_FLAG_FIN 0x01u +#define NGTCP2_STREAM_DATA_FLAG_FIN 0x01U /** * @macro @@ -2697,7 +2911,7 @@ typedef int (*ngtcp2_hp_mask)(uint8_t *dest, const ngtcp2_crypto_cipher *hp, * data contains data received in 0-RTT packet, and the handshake has * not completed yet, which means that the data might be replayed. */ -#define NGTCP2_STREAM_DATA_FLAG_0RTT 0x02u +#define NGTCP2_STREAM_DATA_FLAG_0RTT 0x02U /** * @functypedef @@ -2752,7 +2966,7 @@ typedef int (*ngtcp2_stream_open)(ngtcp2_conn *conn, int64_t stream_id, * * :macro:`NGTCP2_STREAM_CLOSE_FLAG_NONE` indicates no flag set. */ -#define NGTCP2_STREAM_CLOSE_FLAG_NONE 0x00u +#define NGTCP2_STREAM_CLOSE_FLAG_NONE 0x00U /** * @macro @@ -2760,7 +2974,7 @@ typedef int (*ngtcp2_stream_open)(ngtcp2_conn *conn, int64_t stream_id, * :macro:`NGTCP2_STREAM_CLOSE_FLAG_APP_ERROR_CODE_SET` indicates that * app_error_code parameter is set. */ -#define NGTCP2_STREAM_CLOSE_FLAG_APP_ERROR_CODE_SET 0x01u +#define NGTCP2_STREAM_CLOSE_FLAG_APP_ERROR_CODE_SET 0x01U /** * @functypedef @@ -2786,6 +3000,9 @@ typedef int (*ngtcp2_stream_open)(ngtcp2_conn *conn, int64_t stream_id, * The implementation of this callback should return 0 if it succeeds. * Returning :macro:`NGTCP2_ERR_CALLBACK_FAILURE` makes the library * call return immediately. + * + * .. seealso:: + * :type:`ngtcp2_stream_close2` */ typedef int (*ngtcp2_stream_close)(ngtcp2_conn *conn, uint32_t flags, int64_t stream_id, uint64_t app_error_code, @@ -2834,6 +3051,11 @@ typedef int (*ngtcp2_acked_stream_data_offset)( /** * @functypedef * + * .. warning:: + * + * .. version-deprecated:: 1.22.0 + * Use :type:`ngtcp2_recv_stateless_reset2` instead. + * * :type:`ngtcp2_recv_stateless_reset` is a callback function which is * called when Stateless Reset packet is received. The stateless * reset details are given in |sr|. @@ -2893,6 +3115,11 @@ typedef void (*ngtcp2_rand)(uint8_t *dest, size_t destlen, /** * @functypedef * + * .. warning:: + * + * .. version-deprecated:: 1.22.0 + * Use :type:`ngtcp2_get_new_connection_id2` instead. + * * :type:`ngtcp2_get_new_connection_id` is a callback function to ask * an application for new connection ID. Application must generate * new unused connection ID with the exact |cidlen| bytes, and store @@ -2969,7 +3196,7 @@ typedef int (*ngtcp2_update_key)( * * :macro:`NGTCP2_PATH_VALIDATION_FLAG_NONE` indicates no flag set. */ -#define NGTCP2_PATH_VALIDATION_FLAG_NONE 0x00u +#define NGTCP2_PATH_VALIDATION_FLAG_NONE 0x00U /** * @macro @@ -2978,7 +3205,7 @@ typedef int (*ngtcp2_update_key)( * validation involving server preferred address. This flag is only * set for client. */ -#define NGTCP2_PATH_VALIDATION_FLAG_PREFERRED_ADDR 0x01u +#define NGTCP2_PATH_VALIDATION_FLAG_PREFERRED_ADDR 0x01U /** * @macro @@ -2987,7 +3214,7 @@ typedef int (*ngtcp2_update_key)( * server should send NEW_TOKEN frame for the new remote address. * This flag is only set for server. */ -#define NGTCP2_PATH_VALIDATION_FLAG_NEW_TOKEN 0x02u +#define NGTCP2_PATH_VALIDATION_FLAG_NEW_TOKEN 0x02U /** * @functypedef @@ -3049,7 +3276,7 @@ typedef int (*ngtcp2_path_validation)(ngtcp2_conn *conn, uint32_t flags, * address, leave :member:`dest->local ` * unmodified, or copy the value of :member:`local * ` field of the current network path obtained - * from `ngtcp2_conn_get_path()`. Both :member:`dest->local.addr + * from `ngtcp2_conn_get_path2()`. Both :member:`dest->local.addr * ` and :member:`dest->remote.addr * ` point to buffers which are at least * sizeof(:type:`ngtcp2_sockaddr_union`) bytes long, respectively. If @@ -3089,6 +3316,11 @@ typedef enum ngtcp2_connection_id_status_type { /** * @functypedef * + * .. warning:: + * + * .. version-deprecated:: 1.22.0 + * Use :type:`ngtcp2_connection_id_status2` instead. + * * :type:`ngtcp2_connection_id_status` is a callback function which is * called when the status of Destination Connection ID changes. * @@ -3157,7 +3389,7 @@ typedef void (*ngtcp2_delete_crypto_cipher_ctx)( * * :macro:`NGTCP2_DATAGRAM_FLAG_NONE` indicates no flag set. */ -#define NGTCP2_DATAGRAM_FLAG_NONE 0x00u +#define NGTCP2_DATAGRAM_FLAG_NONE 0x00U /** * @macro @@ -3166,7 +3398,7 @@ typedef void (*ngtcp2_delete_crypto_cipher_ctx)( * received in 0-RTT packet, and the handshake has not completed yet, * which means that the data might be replayed. */ -#define NGTCP2_DATAGRAM_FLAG_0RTT 0x01u +#define NGTCP2_DATAGRAM_FLAG_0RTT 0x01U /** * @functypedef @@ -3220,6 +3452,11 @@ typedef int (*ngtcp2_lost_datagram)(ngtcp2_conn *conn, uint64_t dgram_id, /** * @functypedef * + * .. warning:: + * + * .. version-deprecated:: 1.22.0 + * Use :type:`ngtcp2_get_path_challenge_data2` instead. + * * :type:`ngtcp2_get_path_challenge_data` is a callback function to * ask an application for new data that is sent in PATH_CHALLENGE * frame. Application must generate new unpredictable, exactly @@ -3251,6 +3488,24 @@ typedef int (*ngtcp2_stream_stop_sending)(ngtcp2_conn *conn, int64_t stream_id, void *user_data, void *stream_user_data); +/** + * @functypedef + * + * :type:`ngtcp2_recv_stop_sending` is invoked when a STOP_SENDING frame + * is received from a remote endpoint for a stream identified by + * |stream_id|. |app_error_code| is the application error code carried + * by the STOP_SENDING frame. This callback is called at most + * once per stream. + * + * The callback function must return 0 if it succeeds. Returning + * :macro:`NGTCP2_ERR_CALLBACK_FAILURE` makes the library call return + * immediately. + */ +typedef int (*ngtcp2_recv_stop_sending)(ngtcp2_conn *conn, int64_t stream_id, + uint64_t app_error_code, + void *user_data, + void *stream_user_data); + /** * @functypedef * @@ -3300,9 +3555,176 @@ typedef int (*ngtcp2_recv_key)(ngtcp2_conn *conn, ngtcp2_encryption_level level, typedef int (*ngtcp2_tls_early_data_rejected)(ngtcp2_conn *conn, void *user_data); +/** + * @functypedef + * + * :type:`ngtcp2_recv_stateless_reset2` is a callback function which + * is called when Stateless Reset packet is received. The stateless + * reset details are given in |sr|. + * + * The implementation of this callback should return 0 if it succeeds. + * Returning :macro:`NGTCP2_ERR_CALLBACK_FAILURE` makes the library + * call return immediately. + * + * .. version-added:: 1.22.0 + */ +typedef int (*ngtcp2_recv_stateless_reset2)( + ngtcp2_conn *conn, const ngtcp2_pkt_stateless_reset2 *sr, void *user_data); + +/** + * @functypedef + * + * :type:`ngtcp2_get_new_connection_id2` is a callback function to ask + * an application for new connection ID. Application must generate + * new unused connection ID with the exact |cidlen| bytes, and store + * it in |cid|. It also has to generate a stateless reset token, and + * store it in |token|. + * + * The callback function must return 0 if it succeeds. Returning + * :macro:`NGTCP2_ERR_CALLBACK_FAILURE` makes the library call return + * immediately. + * + * .. version-added:: 1.22.0 + */ +typedef int (*ngtcp2_get_new_connection_id2)( + ngtcp2_conn *conn, ngtcp2_cid *cid, ngtcp2_stateless_reset_token *token, + size_t cidlen, void *user_data); + +/** + * @functypedef + * + * :type:`ngtcp2_connection_id_status2` is a callback function which + * is called when the status of Destination Connection ID changes. + * + * |token| is the associated stateless reset token, and it is ``NULL`` + * if no token is present. + * + * |type| is the one of the value defined in + * :type:`ngtcp2_connection_id_status_type`. The new value might be + * added in the future release. + * + * The callback function must return 0 if it succeeds. Returning + * :macro:`NGTCP2_ERR_CALLBACK_FAILURE` makes the library call return + * immediately. + * + * .. version-added:: 1.22.0 + */ +typedef int (*ngtcp2_connection_id_status2)( + ngtcp2_conn *conn, ngtcp2_connection_id_status_type type, uint64_t seq, + const ngtcp2_cid *cid, const ngtcp2_stateless_reset_token *token, + void *user_data); + +/** + * @struct + * + * :type:`ngtcp2_path_challenge_data` stores path challenge data. + * + * .. version-added:: 1.22.0 + */ +typedef struct ngtcp2_path_challenge_data { + uint8_t data[NGTCP2_PATH_CHALLENGE_DATALEN]; +} ngtcp2_path_challenge_data; + +/** + * @functypedef + * + * :type:`ngtcp2_get_path_challenge_data2` is a callback function to + * ask an application for new data that is sent in PATH_CHALLENGE + * frame. Application must generate new unpredictable, exactly + * :macro:`NGTCP2_PATH_CHALLENGE_DATALEN` bytes of random data, and + * store them into |data|. + * + * The callback function must return 0 if it succeeds. Returning + * :macro:`NGTCP2_ERR_CALLBACK_FAILURE` makes the library call return + * immediately. + * + * .. version-added:: 1.22.0 + */ +typedef int (*ngtcp2_get_path_challenge_data2)(ngtcp2_conn *conn, + ngtcp2_path_challenge_data *data, + void *user_data); + +/** + * @macrosection + * + * Stream close flags for :type:`ngtcp2_stream_close2` callback. + */ + +/** + * @macro + * + * :macro:`NGTCP2_STREAM_CLOSE2_FLAG_NONE` indicates no flag set. + * + * .. version-added:: 1.25.0 + */ +#define NGTCP2_STREAM_CLOSE2_FLAG_NONE 0x00U + +/** + * @macro + * + * :macro:`NGTCP2_STREAM_CLOSE2_FLAG_RX_APP_ERROR_CODE_SET` indicates + * that rx_app_error_code parameter is set. + * + * .. version-added:: 1.25.0 + */ +#define NGTCP2_STREAM_CLOSE2_FLAG_RX_APP_ERROR_CODE_SET 0x01U + +/** + * @macro + * + * :macro:`NGTCP2_STREAM_CLOSE2_FLAG_TX_APP_ERROR_CODE_SET` indicates + * that tx_app_error_code parameter is set. + * + * .. version-added:: 1.25.0 + */ +#define NGTCP2_STREAM_CLOSE2_FLAG_TX_APP_ERROR_CODE_SET 0x02U + +/** + * @functypedef + * + * :type:`ngtcp2_stream_close2` is invoked when a stream is closed. + * This callback is not called when QUIC connection is closed before + * existing streams are closed. |flags| is the bitwise-OR of zero or + * more of :macro:`NGTCP2_STREAM_CLOSE2_FLAG_* + * `. |rx_app_error_code| indicates + * the error code that shut down the receiving side of the stream if + * :macro:`NGTCP2_STREAM_CLOSE2_FLAG_RX_APP_ERROR_CODE_SET` is set in + * |flags|. |tx_app_error_code| indicates the error code that shut + * down the sending side of the stream if + * :macro:`NGTCP2_STREAM_CLOSE2_FLAG_TX_APP_ERROR_CODE_SET` is set in + * |flags|. + * + * Because QUIC can close the send and receive sides of a stream + * independently, this callback has 2 application error codes for both + * directions. No error code means that its direction of a stream is + * closed cleanly. For example, a client gets STOP_SENDING frame from + * a server, and it sends back RESET_STREAM frame with the error code + * included in STOP_SENDING frame. This error code is reported as + * |tx_app_error_code| and + * :macro:`NGTCP2_STREAM_CLOSE2_FLAG_TX_APP_ERROR_CODE_SET` is set in + * |flags|. Meanwhile, the client receives the response body without + * any error. Then + * :macro:`NGTCP2_STREAM_CLOSE2_FLAG_RX_APP_ERROR_CODE_SET` is not set + * in |flags|. + * + * The implementation of this callback should return 0 if it succeeds. + * Returning :macro:`NGTCP2_ERR_CALLBACK_FAILURE` makes the library + * call return immediately. + * + * .. version-added:: 1.25.0 + */ +typedef int (*ngtcp2_stream_close2)(ngtcp2_conn *conn, uint32_t flags, + int64_t stream_id, + uint64_t rx_app_error_code, + uint64_t tx_app_error_code, void *user_data, + void *stream_user_data); + #define NGTCP2_CALLBACKS_V1 1 #define NGTCP2_CALLBACKS_V2 2 -#define NGTCP2_CALLBACKS_VERSION NGTCP2_CALLBACKS_V2 +#define NGTCP2_CALLBACKS_V3 3 +#define NGTCP2_CALLBACKS_V4 4 +#define NGTCP2_CALLBACKS_V5 5 +#define NGTCP2_CALLBACKS_VERSION NGTCP2_CALLBACKS_V5 /** * @struct @@ -3383,9 +3805,20 @@ typedef struct ngtcp2_callbacks { /** * :member:`stream_close` is a callback function which is invoked * when a stream is closed. This callback function is optional. + * + * .. seealso:: + * :member:`stream_close2` */ ngtcp2_stream_close stream_close; /** + * .. warning:: + * + * .. version-deprecated:: 1.22.0 + * Use :member:`recv_stateless_reset2` instead. If both + * :member:`recv_stateless_reset` and + * :member:`recv_stateless_reset2` are set, the latter has the + * precedence. + * * :member:`recv_stateless_reset` is a callback function which is * invoked when Stateless Reset packet is received. This callback * function is optional. @@ -3418,9 +3851,18 @@ typedef struct ngtcp2_callbacks { */ ngtcp2_rand rand; /** + * .. warning:: + * + * .. version-deprecated:: 1.22.0 + * Use :member:`get_new_connection_id2` instead. If both + * :member:`get_new_connection_id` and + * :member:`get_new_connection_id2` are set, the latter has the + * precedence. + * * :member:`get_new_connection_id` is a callback function which is - * invoked when the library needs new connection ID. This callback - * function must be specified. + * invoked when the library needs new connection ID. Either this + * callback function or :member:`get_new_connection_id2` must be + * specified. */ ngtcp2_get_new_connection_id get_new_connection_id; /** @@ -3477,6 +3919,13 @@ typedef struct ngtcp2_callbacks { */ ngtcp2_extend_max_stream_data extend_max_stream_data; /** + * .. warning:: + * + * .. version-deprecated:: 1.22.0 + * Use :member:`dcid_status2` instead. If both + * :member:`dcid_status` and :member:`dcid_status2` are set, the + * latter has the precedence. + * * :member:`dcid_status` is a callback function which is invoked * when the new Destination Connection ID is activated, or the * activated Destination Connection ID is now deactivated. This @@ -3528,6 +3977,11 @@ typedef struct ngtcp2_callbacks { */ ngtcp2_lost_datagram lost_datagram; /** + * .. warning:: + * + * .. version-deprecated:: 1.22.0 + * Use :member:`get_path_challenge_data2` instead. + * * :member:`get_path_challenge_data` is a callback function which is * invoked when the library needs new data sent along with * PATH_CHALLENGE frame. This callback must be specified. @@ -3567,33 +4021,91 @@ typedef struct ngtcp2_callbacks { * is only used by client. */ ngtcp2_tls_early_data_rejected tls_early_data_rejected; - /* The following fields have been added since NGTCP2_CALLBACKS_V2. */ + /* The following fields have been added since + NGTCP2_CALLBACKS_V2. */ /** * :member:`begin_path_validation` is a callback function which is - * invoked when a path validation has started. This field is - * available since v1.14.0. + * invoked when a path validation has started. + * + * .. version-added:: 1.14.0 */ ngtcp2_begin_path_validation begin_path_validation; -} ngtcp2_callbacks; - -/** - * @function - * - * `ngtcp2_pkt_write_connection_close` writes Initial packet - * containing CONNECTION_CLOSE frame with the given |error_code| and - * the optional |reason| of length |reasonlen| to the buffer pointed - * by |dest| of length |destlen|. All encryption parameters are for - * Initial packet encryption. The packet number is always 0. - * - * The primary use case of this function is for server to send - * CONNECTION_CLOSE frame in Initial packet to close connection - * without committing any state when validating Retry token fails. - * - * This function returns the number of bytes written if it succeeds, - * or one of the following negative error codes: - * - * :macro:`NGTCP2_ERR_NOBUF` - * Buffer is too small. + /* The following fields have been added since + NGTCP2_CALLBACKS_V3. */ + /** + * :member:`recv_stateless_reset2` is a callback function which is + * invoked when Stateless Reset packet is received. This callback + * function is optional. + * + * .. version-added:: 1.22.0 + */ + ngtcp2_recv_stateless_reset2 recv_stateless_reset2; + /** + * :member:`get_new_connection_id2` is a callback function which is + * invoked when the library needs new connection ID. This callback + * function must be specified. + * + * .. version-added:: 1.22.0 + */ + ngtcp2_get_new_connection_id2 get_new_connection_id2; + /** + * :member:`dcid_status2` is a callback function which is invoked + * when the new Destination Connection ID is activated, or the + * activated Destination Connection ID is now deactivated. This + * callback function is optional. + * + * .. version-added:: 1.22.0 + */ + ngtcp2_connection_id_status2 dcid_status2; + /** + * :member:`get_path_challenge_data2` is a callback function which + * is invoked when the library needs new data sent along with + * PATH_CHALLENGE frame. This callback must be specified. + * + * .. version-added:: 1.22.0 + */ + ngtcp2_get_path_challenge_data2 get_path_challenge_data2; + /* The following fields have been added since + NGTCP2_CALLBACKS_V4. */ + /** + * :member:`recv_stop_sending` is a callback function which is invoked + * when a STOP_SENDING frame is received from a remote endpoint. This + * callback function is optional. + * + * .. version-added:: 1.24.0 + */ + ngtcp2_recv_stop_sending recv_stop_sending; + /* The following fields have been added since + NGTCP2_CALLBACKS_V5. */ + /** + * :member:`stream_close2` is a callback function which is invoked + * when a stream is closed. This callback function is optional. If + * both this field and :member:`stream_close` are specified, this + * field takes precedence. + * + * .. version-added:: 1.25.0 + */ + ngtcp2_stream_close2 stream_close2; +} ngtcp2_callbacks; + +/** + * @function + * + * `ngtcp2_pkt_write_connection_close` writes Initial packet + * containing CONNECTION_CLOSE frame with the given |error_code| and + * the optional |reason| of length |reasonlen| to the buffer pointed + * by |dest| of length |destlen|. All encryption parameters are for + * Initial packet encryption. The packet number is always 0. + * + * The primary use case of this function is for server to send + * CONNECTION_CLOSE frame in Initial packet to close connection + * without committing any state when validating Retry token fails. + * + * This function returns the number of bytes written if it succeeds, + * or one of the following negative error codes: + * + * :macro:`NGTCP2_ERR_NOBUF` + * Buffer is too small. * :macro:`NGTCP2_ERR_CALLBACK_FAILURE` * Callback function failed. */ @@ -3765,7 +4277,7 @@ NGTCP2_EXTERN void ngtcp2_conn_del(ngtcp2_conn *conn); * `ngtcp2_conn_write_connection_close` makes a connection enter * this state. * :macro:`NGTCP2_ERR_CRYPTO` - * An error happened in TLS stack. `ngtcp2_conn_get_tls_alert` + * An error happened in TLS stack. `ngtcp2_conn_get_tls_alert2` * returns TLS alert if set. * * If any other negative error is returned, call @@ -3789,6 +4301,21 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_pkt_versioned( ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_tstamp ts); +/** + * @function + * + * `ngtcp2_conn_continue_handshake` resumes handshake interrupted by + * TLS stack routine (e.g., private key operation offloading, + * certificate lookup, etc). + * + * This function returns 0 if it succeeds. In general, this function + * returns the same set of error codes from `ngtcp2_conn_read_pkt`. + * + * .. version-added:: 1.22.0 + */ +NGTCP2_EXTERN int ngtcp2_conn_continue_handshake(ngtcp2_conn *conn, + ngtcp2_tstamp ts); + /** * @function * @@ -3802,11 +4329,24 @@ NGTCP2_EXTERN void ngtcp2_conn_tls_handshake_completed(ngtcp2_conn *conn); /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_handshake_completed2` instead. + * * `ngtcp2_conn_get_handshake_completed` returns nonzero if QUIC * handshake has completed. */ NGTCP2_EXTERN int ngtcp2_conn_get_handshake_completed(ngtcp2_conn *conn); +/** + * @function + * + * `ngtcp2_conn_get_handshake_completed2` returns nonzero if QUIC + * handshake has completed. + */ +NGTCP2_EXTERN int ngtcp2_conn_get_handshake_completed2(const ngtcp2_conn *conn); + /** * @function * @@ -4057,38 +4597,70 @@ NGTCP2_EXTERN int ngtcp2_conn_initiate_key_update(ngtcp2_conn *conn, * can set the error code (e.g., * :macro:`NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM`) using this function. * - * See also `ngtcp2_conn_get_tls_error`. + * See also `ngtcp2_conn_get_tls_error2`. */ NGTCP2_EXTERN void ngtcp2_conn_set_tls_error(ngtcp2_conn *conn, int liberr); /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_tls_error2` instead. + * * `ngtcp2_conn_get_tls_error` returns the value set by * `ngtcp2_conn_set_tls_error`. If no value is set, this function * returns 0. */ NGTCP2_EXTERN int ngtcp2_conn_get_tls_error(ngtcp2_conn *conn); +/** + * @function + * + * `ngtcp2_conn_get_tls_error2` returns the value set by + * `ngtcp2_conn_set_tls_error`. If no value is set, this function + * returns 0. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN int ngtcp2_conn_get_tls_error2(const ngtcp2_conn *conn); + /** * @function * * `ngtcp2_conn_set_tls_alert` sets a TLS alert |alert| generated by a * TLS stack of a local endpoint to |conn|. * - * See also `ngtcp2_conn_get_tls_alert`. + * See also `ngtcp2_conn_get_tls_alert2`. */ NGTCP2_EXTERN void ngtcp2_conn_set_tls_alert(ngtcp2_conn *conn, uint8_t alert); /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_tls_alert2` instead. + * * `ngtcp2_conn_get_tls_alert` returns the value set by * `ngtcp2_conn_set_tls_alert`. If no value is set, this function * returns 0. */ NGTCP2_EXTERN uint8_t ngtcp2_conn_get_tls_alert(ngtcp2_conn *conn); +/** + * @function + * + * `ngtcp2_conn_get_tls_alert2` returns the value set by + * `ngtcp2_conn_set_tls_alert`. If no value is set, this function + * returns 0. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN uint8_t ngtcp2_conn_get_tls_alert2(const ngtcp2_conn *conn); + /** * @function * @@ -4105,19 +4677,48 @@ NGTCP2_EXTERN void ngtcp2_conn_set_keep_alive_timeout(ngtcp2_conn *conn, /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_expiry2` instead. + * * `ngtcp2_conn_get_expiry` returns the next expiry time. It returns * ``UINT64_MAX`` if there is no next expiry. * - * Call `ngtcp2_conn_handle_expiry` and then - * `ngtcp2_conn_writev_stream` (or `ngtcp2_conn_writev_datagram`) when - * the expiry time has passed. + * Call `ngtcp2_conn_handle_expiry` when the expiry time has passed. */ NGTCP2_EXTERN ngtcp2_tstamp ngtcp2_conn_get_expiry(ngtcp2_conn *conn); +/** + * @function + * + * `ngtcp2_conn_get_expiry2` returns the next expiry time. It returns + * ``UINT64_MAX`` if there is no next expiry. + * + * Call `ngtcp2_conn_handle_expiry` when the expiry time has passed. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN ngtcp2_tstamp ngtcp2_conn_get_expiry2(const ngtcp2_conn *conn); + /** * @function * * `ngtcp2_conn_handle_expiry` handles expired timer. + * + * If it returns :macro:`NGTCP2_ERR_IDLE_CLOSE`, it means that an idle + * timer has fired for this particular connection. In this case, drop + * the connection without calling + * `ngtcp2_conn_write_connection_close`. If it returns any of the + * other negative error codes, close the connection by sending the + * terminal packet produced by `ngtcp2_conn_write_connection_close`. + * Otherwise, schedule `ngtcp2_conn_writev_stream` call. An + * application may call any number of additional + * `ngtcp2_conn_read_pkt` and `ngtcp2_conn_handle_expiry` before + * calling `ngtcp2_conn_writev_stream`. After calling + * `ngtcp2_conn_writev_stream`, new expiry is set. The application + * should call `ngtcp2_conn_get_expiry2` to get a new deadline and set + * the timer. */ NGTCP2_EXTERN int ngtcp2_conn_handle_expiry(ngtcp2_conn *conn, ngtcp2_tstamp ts); @@ -4125,10 +4726,24 @@ NGTCP2_EXTERN int ngtcp2_conn_handle_expiry(ngtcp2_conn *conn, /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_pto2` instead. + * * `ngtcp2_conn_get_pto` returns Probe Timeout (PTO). */ NGTCP2_EXTERN ngtcp2_duration ngtcp2_conn_get_pto(ngtcp2_conn *conn); +/** + * @function + * + * `ngtcp2_conn_get_pto2` returns Probe Timeout (PTO). + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN ngtcp2_duration ngtcp2_conn_get_pto2(const ngtcp2_conn *conn); + /** * @function * @@ -4156,6 +4771,11 @@ NGTCP2_EXTERN int ngtcp2_conn_decode_and_set_remote_transport_params( /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_remote_transport_params2` instead. + * * `ngtcp2_conn_get_remote_transport_params` returns a pointer to the * remote QUIC transport parameters. If no remote transport * parameters are set, it returns NULL. @@ -4166,6 +4786,23 @@ ngtcp2_conn_get_remote_transport_params(ngtcp2_conn *conn); /** * @function * + * `ngtcp2_conn_get_remote_transport_params2` returns a pointer to the + * remote QUIC transport parameters. If no remote transport + * parameters are set, it returns NULL. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN const ngtcp2_transport_params * +ngtcp2_conn_get_remote_transport_params2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_encode_0rtt_transport_params2` instead. + * * `ngtcp2_conn_encode_0rtt_transport_params` encodes the QUIC * transport parameters that are used for 0-RTT data in the buffer * pointed by |dest| of length |destlen|. It includes at least the @@ -4203,6 +4840,48 @@ ngtcp2_ssize ngtcp2_conn_encode_0rtt_transport_params(ngtcp2_conn *conn, uint8_t *dest, size_t destlen); +/** + * @function + * + * `ngtcp2_conn_encode_0rtt_transport_params2` encodes the QUIC + * transport parameters that are used for 0-RTT data in the buffer + * pointed by |dest| of length |destlen|. It includes at least the + * following fields: + * + * - :member:`ngtcp2_transport_params.initial_max_streams_bidi` + * - :member:`ngtcp2_transport_params.initial_max_streams_uni` + * - :member:`ngtcp2_transport_params.initial_max_stream_data_bidi_local` + * - :member:`ngtcp2_transport_params.initial_max_stream_data_bidi_remote` + * - :member:`ngtcp2_transport_params.initial_max_stream_data_uni` + * - :member:`ngtcp2_transport_params.initial_max_data` + * - :member:`ngtcp2_transport_params.active_connection_id_limit` + * - :member:`ngtcp2_transport_params.max_datagram_frame_size` + * + * If |conn| is initialized as server, the following additional fields + * are also included: + * + * - :member:`ngtcp2_transport_params.max_idle_timeout` + * - :member:`ngtcp2_transport_params.max_udp_payload_size` + * - :member:`ngtcp2_transport_params.disable_active_migration` + * + * If |conn| is initialized as client, these parameters are + * synthesized from the remote transport parameters received from + * server. Otherwise, they are the local transport parameters that + * are set by the local endpoint. + * + * This function returns the number of bytes written, or one of the + * following negative error codes: + * + * :macro:`NGTCP2_ERR_NOBUF` + * Buffer is too small. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN +ngtcp2_ssize ngtcp2_conn_encode_0rtt_transport_params2(const ngtcp2_conn *conn, + uint8_t *dest, + size_t destlen); + /** * @function * @@ -4262,6 +4941,11 @@ NGTCP2_EXTERN int ngtcp2_conn_set_local_transport_params_versioned( /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_local_transport_params2` instead. + * * `ngtcp2_conn_get_local_transport_params` returns a pointer to the * local QUIC transport parameters. */ @@ -4271,6 +4955,22 @@ ngtcp2_conn_get_local_transport_params(ngtcp2_conn *conn); /** * @function * + * `ngtcp2_conn_get_local_transport_params2` returns a pointer to the + * local QUIC transport parameters. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN const ngtcp2_transport_params * +ngtcp2_conn_get_local_transport_params2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_encode_local_transport_params2` instead. + * * `ngtcp2_conn_encode_local_transport_params` encodes the local QUIC * transport parameters in |dest| of length |destlen|. * @@ -4283,6 +4983,23 @@ ngtcp2_conn_get_local_transport_params(ngtcp2_conn *conn); NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_encode_local_transport_params( ngtcp2_conn *conn, uint8_t *dest, size_t destlen); +/** + * @function + * + * `ngtcp2_conn_encode_local_transport_params2` encodes the local QUIC + * transport parameters in |dest| of length |destlen|. + * + * This function returns the number of bytes written, or one of the + * following negative error codes: + * + * :macro:`NGTCP2_ERR_NOBUF` + * Buffer is too small. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_encode_local_transport_params2( + const ngtcp2_conn *conn, uint8_t *dest, size_t destlen); + /** * @function * @@ -4436,7 +5153,7 @@ NGTCP2_EXTERN int ngtcp2_conn_shutdown_stream_read(ngtcp2_conn *conn, * * :macro:`NGTCP2_WRITE_STREAM_FLAG_NONE` indicates no flag set. */ -#define NGTCP2_WRITE_STREAM_FLAG_NONE 0x00u +#define NGTCP2_WRITE_STREAM_FLAG_NONE 0x00U /** * @macro @@ -4444,7 +5161,7 @@ NGTCP2_EXTERN int ngtcp2_conn_shutdown_stream_read(ngtcp2_conn *conn, * :macro:`NGTCP2_WRITE_STREAM_FLAG_MORE` indicates that more data may * come, and should be coalesced into the same packet if possible. */ -#define NGTCP2_WRITE_STREAM_FLAG_MORE 0x01u +#define NGTCP2_WRITE_STREAM_FLAG_MORE 0x01U /** * @macro @@ -4452,7 +5169,7 @@ NGTCP2_EXTERN int ngtcp2_conn_shutdown_stream_read(ngtcp2_conn *conn, * :macro:`NGTCP2_WRITE_STREAM_FLAG_FIN` indicates that a passed data * is the final part of a stream. */ -#define NGTCP2_WRITE_STREAM_FLAG_FIN 0x02u +#define NGTCP2_WRITE_STREAM_FLAG_FIN 0x02U /** * @macro @@ -4463,7 +5180,7 @@ NGTCP2_EXTERN int ngtcp2_conn_shutdown_stream_read(ngtcp2_conn *conn, * finalizing it. PATH_CHALLENGE, PATH_RESPONSE, CONNECTION_CLOSE * only packets and PMTUD packets are excluded. */ -#define NGTCP2_WRITE_STREAM_FLAG_PADDING 0x04u +#define NGTCP2_WRITE_STREAM_FLAG_PADDING 0x04U /** * @function @@ -4648,7 +5365,7 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( * * :macro:`NGTCP2_WRITE_DATAGRAM_FLAG_NONE` indicates no flag set. */ -#define NGTCP2_WRITE_DATAGRAM_FLAG_NONE 0x00u +#define NGTCP2_WRITE_DATAGRAM_FLAG_NONE 0x00U /** * @macro @@ -4656,7 +5373,7 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( * :macro:`NGTCP2_WRITE_DATAGRAM_FLAG_MORE` indicates that more data * may come, and should be coalesced into the same packet if possible. */ -#define NGTCP2_WRITE_DATAGRAM_FLAG_MORE 0x01u +#define NGTCP2_WRITE_DATAGRAM_FLAG_MORE 0x01U /** * @macro @@ -4667,7 +5384,7 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( * finalizing it. PATH_CHALLENGE, PATH_RESPONSE, CONNECTION_CLOSE * only packets and PMTUD packets are excluded. */ -#define NGTCP2_WRITE_DATAGRAM_FLAG_PADDING 0x02u +#define NGTCP2_WRITE_DATAGRAM_FLAG_PADDING 0x02U /** * @function @@ -4787,6 +5504,11 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_writev_datagram_versioned( /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_in_closing_period2` instead. + * * `ngtcp2_conn_in_closing_period` returns nonzero if |conn| is in the * closing period. */ @@ -4795,11 +5517,36 @@ NGTCP2_EXTERN int ngtcp2_conn_in_closing_period(ngtcp2_conn *conn); /** * @function * + * `ngtcp2_conn_in_closing_period2` returns nonzero if |conn| is in + * the closing period. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN int ngtcp2_conn_in_closing_period2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_in_draining_period2` instead. + * * `ngtcp2_conn_in_draining_period` returns nonzero if |conn| is in * the draining period. */ NGTCP2_EXTERN int ngtcp2_conn_in_draining_period(ngtcp2_conn *conn); +/** + * @function + * + * `ngtcp2_conn_in_draining_period2` returns nonzero if |conn| is in + * the draining period. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN int ngtcp2_conn_in_draining_period2(const ngtcp2_conn *conn); + /** * @function * @@ -4866,6 +5613,11 @@ NGTCP2_EXTERN void ngtcp2_conn_extend_max_streams_uni(ngtcp2_conn *conn, /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_dcid2` instead. + * * `ngtcp2_conn_get_dcid` returns the non-NULL pointer to the current * Destination Connection ID. If no Destination Connection ID is * present, the return value is not ``NULL``, and its :member:`datalen @@ -4876,6 +5628,23 @@ NGTCP2_EXTERN const ngtcp2_cid *ngtcp2_conn_get_dcid(ngtcp2_conn *conn); /** * @function * + * `ngtcp2_conn_get_dcid2` returns the non-NULL pointer to the current + * Destination Connection ID. If no Destination Connection ID is + * present, the return value is not ``NULL``, and its :member:`datalen + * ` field is 0. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN const ngtcp2_cid *ngtcp2_conn_get_dcid2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_client_initial_dcid2` instead. + * * `ngtcp2_conn_get_client_initial_dcid` returns the non-NULL pointer * to the Destination Connection ID that client sent in its Initial * packet. If the Destination Connection ID is not present, the @@ -4888,7 +5657,26 @@ ngtcp2_conn_get_client_initial_dcid(ngtcp2_conn *conn); /** * @function * - * `ngtcp2_conn_get_scid` writes the all Source Connection IDs which a + * `ngtcp2_conn_get_client_initial_dcid2` returns the non-NULL pointer + * to the Destination Connection ID that client sent in its Initial + * packet. If the Destination Connection ID is not present, the + * return value is not ``NULL``, and its :member:`datalen + * ` field is 0. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN const ngtcp2_cid * +ngtcp2_conn_get_client_initial_dcid2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_scid2` instead. + * + * `ngtcp2_conn_get_scid` writes all Source Connection IDs which a * local endpoint has provided to a remote endpoint, and are not * retired in |dest|. If |dest| is NULL, this function does not write * anything, and returns the number of Source Connection IDs that @@ -4899,9 +5687,31 @@ ngtcp2_conn_get_client_initial_dcid(ngtcp2_conn *conn); */ NGTCP2_EXTERN size_t ngtcp2_conn_get_scid(ngtcp2_conn *conn, ngtcp2_cid *dest); +/** + * @function + * + * `ngtcp2_conn_get_scid2` writes all Source Connection IDs which a + * local endpoint has provided to a remote endpoint, and are not + * retired in |dest|. If |dest| is NULL, this function does not write + * anything, and returns the number of Source Connection IDs that + * would otherwise be written to the provided buffer. The buffer + * pointed by |dest| must have sizeof(:type:`ngtcp2_cid`) * n bytes + * available, where n is the return value of `ngtcp2_conn_get_scid2` + * with |dest| == NULL. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN size_t ngtcp2_conn_get_scid2(const ngtcp2_conn *conn, + ngtcp2_cid *dest); + /** * @struct * + * .. warning:: + * + * .. version-deprecated:: 1.22.0 + * Use :type:`ngtcp2_cid_token2` instead. + * * :type:`ngtcp2_cid_token` is the convenient struct to store * Connection ID, its associated path, and stateless reset token. */ @@ -4934,7 +5744,12 @@ typedef struct ngtcp2_cid_token { /** * @function * - * `ngtcp2_conn_get_active_dcid` writes the all active Destination + * .. warning:: + * + * .. version-deprecated:: 1.22.0 + * Use `ngtcp2_conn_get_active_dcid3` instead. + * + * `ngtcp2_conn_get_active_dcid` writes all active Destination * Connection IDs and their tokens to |dest|. Before handshake * completes, this function returns 0. If |dest| is NULL, this * function does not write anything, and returns the number of @@ -4948,29 +5763,138 @@ NGTCP2_EXTERN size_t ngtcp2_conn_get_active_dcid(ngtcp2_conn *conn, ngtcp2_cid_token *dest); /** - * @function - * - * `ngtcp2_conn_get_client_chosen_version` returns the client chosen - * version. - */ -NGTCP2_EXTERN uint32_t ngtcp2_conn_get_client_chosen_version(ngtcp2_conn *conn); - -/** - * @function + * @struct * - * `ngtcp2_conn_get_negotiated_version` returns the negotiated - * version. + * :type:`ngtcp2_cid_token2` is the convenient struct to store + * Connection ID, its associated path, and stateless reset token. * - * Until the version is negotiated, this function returns 0. + * .. version-added:: 1.22.0 */ -NGTCP2_EXTERN uint32_t ngtcp2_conn_get_negotiated_version(ngtcp2_conn *conn); - -/** - * @function - * - * `ngtcp2_conn_tls_early_data_rejected` tells |conn| that early data - * was rejected by a server during TLS handshake, or client decided - * not to attempt early data for some reason. |conn| discards the +typedef struct ngtcp2_cid_token2 { + /** + * :member:`seq` is the sequence number of this Connection ID. + */ + uint64_t seq; + /** + * :member:`cid` is Connection ID. + */ + ngtcp2_cid cid; + /** + * :member:`ps` is the path which this Connection ID is associated + * with. + */ + ngtcp2_path_storage ps; + /** + * :member:`token` is the stateless reset token for this Connection + * ID. + */ + ngtcp2_stateless_reset_token token; + /** + * :member:`token_present` is nonzero if token contains stateless + * reset token. + */ + uint8_t token_present; +} ngtcp2_cid_token2; + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_active_dcid3` instead. + * + * `ngtcp2_conn_get_active_dcid2` writes all active Destination + * Connection IDs and their tokens to |dest|. Before handshake + * completes, this function returns 0. If |dest| is NULL, this + * function does not write anything, and returns the number of + * Destination Connection IDs that would otherwise be written to the + * provided buffer. The buffer pointed by |dest| must have + * sizeof(:type:`ngtcp2_cid_token2`) * n bytes available, where n is + * the return value of `ngtcp2_conn_get_active_dcid2` with |dest| == + * NULL. + * + * .. version-added:: 1.22.0 + */ +NGTCP2_EXTERN size_t ngtcp2_conn_get_active_dcid2(ngtcp2_conn *conn, + ngtcp2_cid_token2 *dest); + +/** + * @function + * + * `ngtcp2_conn_get_active_dcid3` writes all active Destination + * Connection IDs and their tokens to |dest|. Before handshake + * completes, this function returns 0. If |dest| is NULL, this + * function does not write anything, and returns the number of + * Destination Connection IDs that would otherwise be written to the + * provided buffer. The buffer pointed by |dest| must have + * sizeof(:type:`ngtcp2_cid_token2`) * n bytes available, where n is + * the return value of `ngtcp2_conn_get_active_dcid3` with |dest| == + * NULL. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN size_t ngtcp2_conn_get_active_dcid3(const ngtcp2_conn *conn, + ngtcp2_cid_token2 *dest); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_client_chosen_version2` instead. + * + * `ngtcp2_conn_get_client_chosen_version` returns the client chosen + * version. + */ +NGTCP2_EXTERN uint32_t ngtcp2_conn_get_client_chosen_version(ngtcp2_conn *conn); + +/** + * @function + * + * `ngtcp2_conn_get_client_chosen_version2` returns the client chosen + * version. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN uint32_t +ngtcp2_conn_get_client_chosen_version2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_negotiated_version2` instead. + * + * `ngtcp2_conn_get_negotiated_version` returns the negotiated + * version. + * + * Until the version is negotiated, this function returns 0. + */ +NGTCP2_EXTERN uint32_t ngtcp2_conn_get_negotiated_version(ngtcp2_conn *conn); + +/** + * @function + * + * `ngtcp2_conn_get_negotiated_version2` returns the negotiated + * version. + * + * Until the version is negotiated, this function returns 0. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN uint32_t +ngtcp2_conn_get_negotiated_version2(const ngtcp2_conn *conn); + +/** + * @function + * + * `ngtcp2_conn_tls_early_data_rejected` tells |conn| that early data + * was rejected by a server during TLS handshake, or client decided + * not to attempt early data for some reason. |conn| discards the * following connection states: * * - Any opened streams. @@ -4993,6 +5917,11 @@ NGTCP2_EXTERN int ngtcp2_conn_tls_early_data_rejected(ngtcp2_conn *conn); /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_tls_early_data_rejected2`. + * * `ngtcp2_conn_get_tls_early_data_rejected` returns nonzero if * `ngtcp2_conn_tls_early_data_rejected` has been called. */ @@ -5001,6 +5930,22 @@ NGTCP2_EXTERN int ngtcp2_conn_get_tls_early_data_rejected(ngtcp2_conn *conn); /** * @function * + * `ngtcp2_conn_get_tls_early_data_rejected2` returns nonzero if + * `ngtcp2_conn_tls_early_data_rejected` has been called. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN int +ngtcp2_conn_get_tls_early_data_rejected2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_conn_info2` instead. + * * `ngtcp2_conn_get_conn_info` assigns connection statistics data to * |*cinfo|. */ @@ -5008,6 +5953,17 @@ NGTCP2_EXTERN void ngtcp2_conn_get_conn_info_versioned(ngtcp2_conn *conn, int conn_info_version, ngtcp2_conn_info *cinfo); +/** + * @function + * + * `ngtcp2_conn_get_conn_info2` assigns connection statistics data to + * |*cinfo|. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN void ngtcp2_conn_get_conn_info2_versioned( + const ngtcp2_conn *conn, int conn_info_version, ngtcp2_conn_info *cinfo); + /** * @function * @@ -5065,6 +6021,11 @@ NGTCP2_EXTERN void ngtcp2_conn_set_path_user_data(ngtcp2_conn *conn, /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_path2` instead. + * * `ngtcp2_conn_get_path` returns the current path. */ NGTCP2_EXTERN const ngtcp2_path *ngtcp2_conn_get_path(ngtcp2_conn *conn); @@ -5072,6 +6033,20 @@ NGTCP2_EXTERN const ngtcp2_path *ngtcp2_conn_get_path(ngtcp2_conn *conn); /** * @function * + * `ngtcp2_conn_get_path2` returns the current path. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN const ngtcp2_path *ngtcp2_conn_get_path2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_max_tx_udp_payload_size2` instead. + * * `ngtcp2_conn_get_max_tx_udp_payload_size` returns the maximum UDP * payload size that this local endpoint would send. This is the * value of :member:`ngtcp2_settings.max_tx_udp_payload_size` that is @@ -5082,6 +6057,24 @@ NGTCP2_EXTERN size_t ngtcp2_conn_get_max_tx_udp_payload_size(ngtcp2_conn *conn); /** * @function * + * `ngtcp2_conn_get_max_tx_udp_payload_size2` returns the maximum UDP + * payload size that this local endpoint would send. This is the + * value of :member:`ngtcp2_settings.max_tx_udp_payload_size` that is + * passed to `ngtcp2_conn_client_new` or `ngtcp2_conn_server_new`. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN size_t +ngtcp2_conn_get_max_tx_udp_payload_size2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_path_max_tx_udp_payload_size2` instead. + * * `ngtcp2_conn_get_path_max_tx_udp_payload_size` returns the maximum * UDP payload size for the current path. If * :member:`ngtcp2_settings.no_tx_udp_payload_size_shaping` is set to @@ -5092,6 +6085,21 @@ NGTCP2_EXTERN size_t ngtcp2_conn_get_max_tx_udp_payload_size(ngtcp2_conn *conn); NGTCP2_EXTERN size_t ngtcp2_conn_get_path_max_tx_udp_payload_size(ngtcp2_conn *conn); +/** + * @function + * + * `ngtcp2_conn_get_path_max_tx_udp_payload_size2` returns the maximum + * UDP payload size for the current path. If + * :member:`ngtcp2_settings.no_tx_udp_payload_size_shaping` is set to + * nonzero, this function is equivalent to + * `ngtcp2_conn_get_max_tx_udp_payload_size2`. Otherwise, it returns + * the maximum UDP payload size that is probed for the current path. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN size_t +ngtcp2_conn_get_path_max_tx_udp_payload_size2(const ngtcp2_conn *conn); + /** * @function * @@ -5148,6 +6156,11 @@ NGTCP2_EXTERN int ngtcp2_conn_initiate_migration(ngtcp2_conn *conn, /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_max_data_left2` instead. + * * `ngtcp2_conn_get_max_data_left` returns the number of bytes that * this local endpoint can send in this connection without violating * connection-level flow control. @@ -5157,6 +6170,22 @@ NGTCP2_EXTERN uint64_t ngtcp2_conn_get_max_data_left(ngtcp2_conn *conn); /** * @function * + * `ngtcp2_conn_get_max_data_left2` returns the number of bytes that + * this local endpoint can send in this connection without violating + * connection-level flow control. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN uint64_t ngtcp2_conn_get_max_data_left2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_max_stream_data_left2` instead. + * * `ngtcp2_conn_get_max_stream_data_left` returns the number of bytes * that this local endpoint can send to a stream identified by * |stream_id| without violating stream-level flow control. If no @@ -5168,6 +6197,24 @@ NGTCP2_EXTERN uint64_t ngtcp2_conn_get_max_stream_data_left(ngtcp2_conn *conn, /** * @function * + * `ngtcp2_conn_get_max_stream_data_left2` returns the number of bytes + * that this local endpoint can send to a stream identified by + * |stream_id| without violating stream-level flow control. If no + * such stream is found, this function returns 0. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN uint64_t ngtcp2_conn_get_max_stream_data_left2( + const ngtcp2_conn *conn, int64_t stream_id); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_streams_bidi_left2` instead. + * * `ngtcp2_conn_get_streams_bidi_left` returns the number of * bidirectional streams which the local endpoint can open without * violating stream concurrency limit. @@ -5177,6 +6224,23 @@ NGTCP2_EXTERN uint64_t ngtcp2_conn_get_streams_bidi_left(ngtcp2_conn *conn); /** * @function * + * `ngtcp2_conn_get_streams_bidi_left2` returns the number of + * bidirectional streams which the local endpoint can open without + * violating stream concurrency limit. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN uint64_t +ngtcp2_conn_get_streams_bidi_left2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_streams_uni_left2` instead. + * * `ngtcp2_conn_get_streams_uni_left` returns the number of * unidirectional streams which the local endpoint can open without * violating stream concurrency limit. @@ -5186,12 +6250,40 @@ NGTCP2_EXTERN uint64_t ngtcp2_conn_get_streams_uni_left(ngtcp2_conn *conn); /** * @function * + * `ngtcp2_conn_get_streams_uni_left2` returns the number of + * unidirectional streams which the local endpoint can open without + * violating stream concurrency limit. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN uint64_t +ngtcp2_conn_get_streams_uni_left2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_cwnd_left2` instead. + * * `ngtcp2_conn_get_cwnd_left` returns the cwnd minus the number of * bytes in flight on the current path. If the former is smaller than * the latter, this function returns 0. */ NGTCP2_EXTERN uint64_t ngtcp2_conn_get_cwnd_left(ngtcp2_conn *conn); +/** + * @function + * + * `ngtcp2_conn_get_cwnd_left2` returns the cwnd minus the number of + * bytes in flight on the current path. If the former is smaller than + * the latter, this function returns 0. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN uint64_t ngtcp2_conn_get_cwnd_left2(const ngtcp2_conn *conn); + /** * @function * @@ -5207,12 +6299,28 @@ ngtcp2_conn_set_initial_crypto_ctx(ngtcp2_conn *conn, /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_initial_crypto_ctx2` instead. + * * `ngtcp2_conn_get_initial_crypto_ctx` returns * :type:`ngtcp2_crypto_ctx` object for Initial packet encryption. */ NGTCP2_EXTERN const ngtcp2_crypto_ctx * ngtcp2_conn_get_initial_crypto_ctx(ngtcp2_conn *conn); +/** + * @function + * + * `ngtcp2_conn_get_initial_crypto_ctx2` returns + * :type:`ngtcp2_crypto_ctx` object for Initial packet encryption. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN const ngtcp2_crypto_ctx * +ngtcp2_conn_get_initial_crypto_ctx2(const ngtcp2_conn *conn); + /** * @function * @@ -5227,12 +6335,28 @@ NGTCP2_EXTERN void ngtcp2_conn_set_crypto_ctx(ngtcp2_conn *conn, /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_crypto_ctx2` instead. + * * `ngtcp2_conn_get_crypto_ctx` returns :type:`ngtcp2_crypto_ctx` * object for Handshake/1-RTT packet encryption. */ NGTCP2_EXTERN const ngtcp2_crypto_ctx * ngtcp2_conn_get_crypto_ctx(ngtcp2_conn *conn); +/** + * @function + * + * `ngtcp2_conn_get_crypto_ctx2` returns :type:`ngtcp2_crypto_ctx` + * object for Handshake/1-RTT packet encryption. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN const ngtcp2_crypto_ctx * +ngtcp2_conn_get_crypto_ctx2(const ngtcp2_conn *conn); + /** * @function * @@ -5248,6 +6372,11 @@ ngtcp2_conn_set_0rtt_crypto_ctx(ngtcp2_conn *conn, /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_0rtt_crypto_ctx2` instead. + * * `ngtcp2_conn_get_0rtt_crypto_ctx` returns :type:`ngtcp2_crypto_ctx` * object for 0-RTT packet encryption. */ @@ -5257,11 +6386,37 @@ ngtcp2_conn_get_0rtt_crypto_ctx(ngtcp2_conn *conn); /** * @function * + * `ngtcp2_conn_get_0rtt_crypto_ctx2` returns + * :type:`ngtcp2_crypto_ctx` object for 0-RTT packet encryption. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN const ngtcp2_crypto_ctx * +ngtcp2_conn_get_0rtt_crypto_ctx2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_tls_native_handle2` instead. + * * `ngtcp2_conn_get_tls_native_handle` returns TLS native handle set * by `ngtcp2_conn_set_tls_native_handle`. */ NGTCP2_EXTERN void *ngtcp2_conn_get_tls_native_handle(ngtcp2_conn *conn); +/** + * @function + * + * `ngtcp2_conn_get_tls_native_handle2` returns TLS native handle set + * by `ngtcp2_conn_set_tls_native_handle`. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN void *ngtcp2_conn_get_tls_native_handle2(const ngtcp2_conn *conn); + /** * @function * @@ -5477,7 +6632,7 @@ NGTCP2_EXTERN void ngtcp2_ccerr_set_application_error(ngtcp2_ccerr *ccerr, * @function * * `ngtcp2_conn_write_connection_close` writes a packet which contains - * CONNECTION_CLOSE frame(s) (type 0x1c or 0x1d) in the buffer pointed + * CONNECTION_CLOSE frame(s) (type 0x1C or 0x1D) in the buffer pointed * by |dest| whose capacity is |destlen|. * * For client, |destlen| should be at least @@ -5494,16 +6649,18 @@ NGTCP2_EXTERN void ngtcp2_ccerr_set_application_error(ngtcp2_ccerr *ccerr, * * If :member:`ccerr->type ` == * :enum:`ngtcp2_ccerr_type.NGTCP2_CCERR_TYPE_TRANSPORT`, this - * function sends CONNECTION_CLOSE (type 0x1c) frame. If + * function sends CONNECTION_CLOSE (type 0x1C) frame. If * :member:`ccerr->type ` == * :enum:`ngtcp2_ccerr_type.NGTCP2_CCERR_TYPE_APPLICATION`, it sends - * CONNECTION_CLOSE (type 0x1d) frame. Otherwise, it does not produce + * CONNECTION_CLOSE (type 0x1D) frame. Otherwise, it does not produce * any data, and returns 0. * * |destlen| could be shorten by some factors (e.g., server side * amplification limit). This function returns * :macro:`NGTCP2_ERR_NOBUF` if the resulting buffer is too small even - * if the given buffer has enough space. + * if the given buffer has enough space. This can happen if sending a + * packet would exceed a transmission limit (e.g., for amplification + * attack protection). * * This function must not be called from inside the callback * functions. @@ -5518,7 +6675,8 @@ NGTCP2_EXTERN void ngtcp2_ccerr_set_application_error(ngtcp2_ccerr *ccerr, * :macro:`NGTCP2_ERR_NOMEM` * Out of memory * :macro:`NGTCP2_ERR_NOBUF` - * Buffer is too small + * Buffer is too small or packet would exceed the transmission + * limit (e.g., for amplification attack protection). * :macro:`NGTCP2_ERR_INVALID_STATE` * The current state does not allow sending CONNECTION_CLOSE * frame. @@ -5535,6 +6693,11 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_connection_close_versioned( /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_ccerr2` instead. + * * `ngtcp2_conn_get_ccerr` returns the received connection close * error. If no connection error is received, it returns * :type:`ngtcp2_ccerr` that is initialized by `ngtcp2_ccerr_default`. @@ -5544,6 +6707,23 @@ NGTCP2_EXTERN const ngtcp2_ccerr *ngtcp2_conn_get_ccerr(ngtcp2_conn *conn); /** * @function * + * `ngtcp2_conn_get_ccerr2` returns the received connection close + * error. If no connection error is received, it returns + * :type:`ngtcp2_ccerr` that is initialized by `ngtcp2_ccerr_default`. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN const ngtcp2_ccerr * +ngtcp2_conn_get_ccerr2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_is_local_stream2` instead. + * * `ngtcp2_conn_is_local_stream` returns nonzero if |stream_id| * denotes a locally initiated stream. */ @@ -5553,6 +6733,22 @@ NGTCP2_EXTERN int ngtcp2_conn_is_local_stream(ngtcp2_conn *conn, /** * @function * + * `ngtcp2_conn_is_local_stream2` returns nonzero if |stream_id| + * denotes a locally initiated stream. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN int ngtcp2_conn_is_local_stream2(const ngtcp2_conn *conn, + int64_t stream_id); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_is_server2` instead. + * * `ngtcp2_conn_is_server` returns nonzero if |conn| is initialized as * server. */ @@ -5561,11 +6757,37 @@ NGTCP2_EXTERN int ngtcp2_conn_is_server(ngtcp2_conn *conn); /** * @function * + * `ngtcp2_conn_is_server2` returns nonzero if |conn| is initialized + * as server. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN int ngtcp2_conn_is_server2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_after_retry2` instead. + * * `ngtcp2_conn_after_retry` returns nonzero if |conn| as a client has * received Retry packet from server, and successfully validated it. */ NGTCP2_EXTERN int ngtcp2_conn_after_retry(ngtcp2_conn *conn); +/** + * @function + * + * `ngtcp2_conn_after_retry2` returns nonzero if |conn| as a client + * has received Retry packet from server, and successfully validated + * it. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN int ngtcp2_conn_after_retry2(const ngtcp2_conn *conn); + /** * @function * @@ -5582,6 +6804,51 @@ NGTCP2_EXTERN int ngtcp2_conn_set_stream_user_data(ngtcp2_conn *conn, int64_t stream_id, void *stream_user_data); +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_stream_user_data2` instead. + * + * `ngtcp2_conn_get_stream_user_data` returns stream_user_data + * associated to the stream identified by |stream_id|. If the stream + * is not found, or no stream data is associated to the stream, this + * function returns NULL. + * + * The stream_user_data can be associated to the stream by one of the + * following functions: + * + * - `ngtcp2_conn_open_bidi_stream` + * - `ngtcp2_conn_open_uni_stream` + * - `ngtcp2_conn_set_stream_user_data` + * + * .. version-added:: 1.17.0 + */ +NGTCP2_EXTERN void *ngtcp2_conn_get_stream_user_data(ngtcp2_conn *conn, + int64_t stream_id); + +/** + * @function + * + * `ngtcp2_conn_get_stream_user_data2` returns stream_user_data + * associated to the stream identified by |stream_id|. If the stream + * is not found, or no stream data is associated to the stream, this + * function returns NULL. + * + * The stream_user_data can be associated to the stream by one of the + * following functions: + * + * - `ngtcp2_conn_open_bidi_stream` + * - `ngtcp2_conn_open_uni_stream` + * - `ngtcp2_conn_set_stream_user_data` + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN void *ngtcp2_conn_get_stream_user_data2(const ngtcp2_conn *conn, + int64_t stream_id); + /** * @function * @@ -5598,6 +6865,11 @@ NGTCP2_EXTERN void ngtcp2_conn_update_pkt_tx_time(ngtcp2_conn *conn, /** * @function * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_send_quantum2` instead. + * * `ngtcp2_conn_get_send_quantum` returns the maximum number of bytes * that can be sent in one go without packet spacing. */ @@ -5606,6 +6878,21 @@ NGTCP2_EXTERN size_t ngtcp2_conn_get_send_quantum(ngtcp2_conn *conn); /** * @function * + * `ngtcp2_conn_get_send_quantum2` returns the maximum number of bytes + * that can be sent in one go without packet spacing. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN size_t ngtcp2_conn_get_send_quantum2(const ngtcp2_conn *conn); + +/** + * @function + * + * .. warning:: + * + * .. version-deprecated:: 1.23.0 + * Use `ngtcp2_conn_get_stream_loss_count2` instead. + * * `ngtcp2_conn_get_stream_loss_count` returns the number of packets * that contain STREAM frame for a stream identified by |stream_id| * and are declared to be lost. The number may include the spurious @@ -5615,6 +6902,20 @@ NGTCP2_EXTERN size_t ngtcp2_conn_get_send_quantum(ngtcp2_conn *conn); NGTCP2_EXTERN size_t ngtcp2_conn_get_stream_loss_count(ngtcp2_conn *conn, int64_t stream_id); +/** + * @function + * + * `ngtcp2_conn_get_stream_loss_count2` returns the number of packets + * that contain STREAM frame for a stream identified by |stream_id| + * and are declared to be lost. The number may include the spurious + * losses. If no stream identified by |stream_id| is found, this + * function returns 0. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN size_t ngtcp2_conn_get_stream_loss_count2(const ngtcp2_conn *conn, + int64_t stream_id); + /** * @functypedef * @@ -5643,7 +6944,7 @@ NGTCP2_EXTERN size_t ngtcp2_conn_get_stream_loss_count(ngtcp2_conn *conn, * :macro:`NGTCP2_WRITE_DATAGRAM_FLAG_PADDING` if * `ngtcp2_conn_writev_datagram` is used) is recommended. * - * This callback function has been available since v1.15.0. + * .. version-added:: 1.15.0 */ typedef ngtcp2_ssize (*ngtcp2_write_pkt)(ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, @@ -5658,34 +6959,77 @@ typedef ngtcp2_ssize (*ngtcp2_write_pkt)(ngtcp2_conn *conn, ngtcp2_path *path, * sent at once in GSO. This function returns the number of bytes * written to the buffer pointed by |buf| of length |buflen|. * |buflen| must be at least - * `ngtcp2_conn_get_path_max_tx_udp_payload_size(conn) - * ` bytes long. It is + * `ngtcp2_conn_get_path_max_tx_udp_payload_size2(conn) + * ` bytes long. It is * recommended to pass the buffer at least - * `ngtcp2_conn_get_max_tx_udp_payload_size(conn) - * ` bytes in order to send a - * PMTUD packet. This function only writes multiple packets if the - * first packet is `ngtcp2_conn_get_path_max_tx_udp_payload_size(conn) - * ` bytes long. The + * `ngtcp2_conn_get_max_tx_udp_payload_size2(conn) + * ` bytes in order to send + * a PMTUD packet. This function only writes multiple packets if the + * first packet is + * `ngtcp2_conn_get_path_max_tx_udp_payload_size2(conn) + * ` bytes long. The * application can adjust the length of the buffer to limit the number - * of packets to aggregate. If this function returns positive - * integer, all packets share the same :type:`ngtcp2_path` and - * :type:`ngtcp2_pkt_info` values, and they are assigned to the - * objects pointed by |path| and |pi| respectively. The length of all - * packets other than the last packet is assigned to |*pgsolen|. The - * length of last packet is equal to or less than |*pgsolen|. - * |write_pkt| must write a single packet. After all packets are - * written, this function calls `ngtcp2_conn_update_pkt_tx_time`. + * of packets to aggregate (or use `ngtcp2_conn_write_aggregate_pkt2` + * to control the number of packets to write directly). If this + * function returns positive integer, all packets share the same + * :type:`ngtcp2_path` and :type:`ngtcp2_pkt_info` values, and they + * are assigned to the objects pointed by |path| and |pi| + * respectively. The length of all packets other than the last packet + * is assigned to |*pgsolen|. The length of last packet is equal to + * or less than |*pgsolen|. |write_pkt| must write a single packet. + * After all packets are written, this function calls + * `ngtcp2_conn_update_pkt_tx_time`. + * + * This function is equivalent to call + * `ngtcp2_conn_write_aggregate_pkt2` with |buflen| = min(|buflen|, + * `ngtcp2_conn_get_send_quantum2(conn) + * `) and |num_pkts| = 0 followed by + * `ngtcp2_conn_update_pkt_tx_time(conn) + * `. * * This function returns the number of bytes written to the buffer, or * a negative error code returned by |write_pkt|. * - * This function has been available since v1.15.0. + * .. version-added:: 1.15.0 */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_aggregate_pkt_versioned( ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, ngtcp2_pkt_info *pi, uint8_t *buf, size_t buflen, size_t *pgsolen, ngtcp2_write_pkt write_pkt, ngtcp2_tstamp ts); +/** + * @function + * + * `ngtcp2_conn_write_aggregate_pkt2` behaves like + * `ngtcp2_conn_write_aggregate_pkt`, but it accepts |num_pkts| to + * specify the maximum number of packets to write. If |num_pkts| is + * 0, this function writes packets as much as possible. The actual + * number of packets to write is determined by the connection state + * (e.g., the congestion controller, data available to send) and the + * length of packet produced. It also does not clamp |buflen|, and + * does not call `ngtcp2_conn_update_pkt_tx_time`. + * + * This function offers more flexibility and optimization chances to + * an application. It can experiment different GSO buffer size + * strategy and number of GSO writes per event loop. + * + * .. version-added:: 1.17.0 + */ +NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_aggregate_pkt2_versioned( + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *buf, size_t buflen, size_t *pgsolen, + ngtcp2_write_pkt write_pkt, size_t num_pkts, ngtcp2_tstamp ts); + +/** + * @function + * + * `ngtcp2_conn_get_timestamp` returns the latest timestamp that is + * known to |conn|. + * + * .. version-added:: 1.16.0 + */ +NGTCP2_EXTERN ngtcp2_tstamp ngtcp2_conn_get_timestamp(const ngtcp2_conn *conn); + /** * @function * @@ -5778,9 +7122,9 @@ NGTCP2_EXTERN void ngtcp2_path_storage_zero(ngtcp2_path_storage *ps); * * :member:`handshake_timeout ` = * ``UINT64_MAX`` * * :member:`glitch_ratelim_burst - * ` = 1000 + * ` = 10000 * * :member:`glitch_ratelim_rate - * ` = 33 + * ` = 330 */ NGTCP2_EXTERN void ngtcp2_settings_default_versioned(int settings_version, ngtcp2_settings *settings); @@ -5928,6 +7272,25 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, const uint32_t *offered_versions, size_t offered_versionslen); +/** + * @function + * + * `ngtcp2_secure_clear` writes |len| bytes of zeros into the buffer + * pointed by |data|. It does that by avoiding compiler + * optimizations. If the following functions are available, one of + * them is used: + * + * - ``SecureZeroMemory`` + * - ``explicit_bzero`` + * - ``memset_s`` + * + * Otherwise, it uses volatile function pointer to ``memset`` to fill + * zeros. + * + * .. version-added:: 1.23.0 + */ +NGTCP2_EXTERN void ngtcp2_secure_clear(void *data, size_t len); + /* * Versioned function wrappers */ @@ -6072,6 +7435,15 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_get_conn_info(CONN, CINFO) \ ngtcp2_conn_get_conn_info_versioned((CONN), NGTCP2_CONN_INFO_VERSION, (CINFO)) +/* + * `ngtcp2_conn_get_conn_info2` is a wrapper around + * `ngtcp2_conn_get_conn_info2_versioned` to set the correct struct + * version. + */ +#define ngtcp2_conn_get_conn_info2(CONN, CINFO) \ + ngtcp2_conn_get_conn_info2_versioned((CONN), NGTCP2_CONN_INFO_VERSION, \ + (CINFO)) + /* * `ngtcp2_conn_write_aggregate_pkt` is a wrapper around * `ngtcp2_conn_write_aggregate_pkt_versioned` to set the correct @@ -6083,6 +7455,17 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (BUF), (BUFLEN), (PGSOLEN), \ (WRITE_PKT), (TS)) +/* + * `ngtcp2_conn_write_aggregate_pkt2` is a wrapper around + * `ngtcp2_conn_write_aggregate_pkt2_versioned` to set the correct + * struct version. + */ +#define ngtcp2_conn_write_aggregate_pkt2(CONN, PATH, PI, BUF, BUFLEN, PGSOLEN, \ + WRITE_PKT, NUM_PKTS, TS) \ + ngtcp2_conn_write_aggregate_pkt2_versioned( \ + (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (BUF), (BUFLEN), (PGSOLEN), \ + (WRITE_PKT), (NUM_PKTS), (TS)) + /* * `ngtcp2_settings_default` is a wrapper around * `ngtcp2_settings_default_versioned` to set the correct struct diff --git a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h index e70a095ceb13..64e8d705fa17 100644 --- a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h +++ b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h @@ -36,7 +36,7 @@ * * Version number of the ngtcp2 library release. */ -#define NGTCP2_VERSION "1.15.1" +#define NGTCP2_VERSION "1.25.0" /** * @macro @@ -46,6 +46,6 @@ * number, 8 bits for minor and 8 bits for patch. Version 1.2.3 * becomes 0x010203. */ -#define NGTCP2_VERSION_NUM 0x010f01 +#define NGTCP2_VERSION_NUM 0x011900 #endif /* !defined(NGTCP2_VERSION_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.c index 59bc621ef46b..9aa976b6747e 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.c @@ -30,42 +30,22 @@ #include "ngtcp2_macro.h" #include "ngtcp2_tstamp.h" -ngtcp2_objalloc_def(acktr_entry, ngtcp2_acktr_entry, oplent) +static int pkt_range_greater(const ngtcp2_ksl_key *lhs, + const ngtcp2_ksl_key *rhs) { + const ngtcp2_pkt_range *a = lhs; + const ngtcp2_pkt_range *b = rhs; -static void acktr_entry_init(ngtcp2_acktr_entry *ent, int64_t pkt_num, - ngtcp2_tstamp tstamp) { - ent->pkt_num = pkt_num; - ent->len = 1; - ent->tstamp = tstamp; + return a->pkt_num > b->pkt_num; } -int ngtcp2_acktr_entry_objalloc_new(ngtcp2_acktr_entry **ent, int64_t pkt_num, - ngtcp2_tstamp tstamp, - ngtcp2_objalloc *objalloc) { - *ent = ngtcp2_objalloc_acktr_entry_get(objalloc); - if (*ent == NULL) { - return NGTCP2_ERR_NOMEM; - } - - acktr_entry_init(*ent, pkt_num, tstamp); - - return 0; -} - -void ngtcp2_acktr_entry_objalloc_del(ngtcp2_acktr_entry *ent, - ngtcp2_objalloc *objalloc) { - ngtcp2_objalloc_acktr_entry_release(objalloc, ent); -} +ngtcp2_ksl_search_def(pkt_range_greater, pkt_range_greater) void ngtcp2_acktr_init(ngtcp2_acktr *acktr, ngtcp2_log *log, const ngtcp2_mem *mem) { - ngtcp2_objalloc_acktr_entry_init(&acktr->objalloc, NGTCP2_ACKTR_MAX_ENT + 1, - mem); - ngtcp2_static_ringbuf_acks_init(&acktr->acks); - ngtcp2_ksl_init(&acktr->ents, ngtcp2_ksl_int64_greater, - ngtcp2_ksl_int64_greater_search, sizeof(int64_t), mem); + ngtcp2_ksl_init(&acktr->ents, pkt_range_greater, ksl_pkt_range_greater_search, + sizeof(ngtcp2_pkt_range), mem); acktr->log = log; acktr->flags = NGTCP2_ACKTR_FLAG_NONE; @@ -77,38 +57,30 @@ void ngtcp2_acktr_init(ngtcp2_acktr *acktr, ngtcp2_log *log, } void ngtcp2_acktr_free(ngtcp2_acktr *acktr) { -#ifdef NOMEMPOOL - ngtcp2_ksl_it it; -#endif /* defined(NOMEMPOOL) */ - if (acktr == NULL) { return; } -#ifdef NOMEMPOOL - for (it = ngtcp2_ksl_begin(&acktr->ents); !ngtcp2_ksl_it_end(&it); - ngtcp2_ksl_it_next(&it)) { - ngtcp2_acktr_entry_objalloc_del(ngtcp2_ksl_it_get(&it), &acktr->objalloc); - } -#endif /* defined(NOMEMPOOL) */ - ngtcp2_ksl_free(&acktr->ents); - - ngtcp2_objalloc_free(&acktr->objalloc); } int ngtcp2_acktr_add(ngtcp2_acktr *acktr, int64_t pkt_num, int active_ack, ngtcp2_tstamp ts) { ngtcp2_ksl_it it, prev_it; - ngtcp2_acktr_entry *ent, *prev_ent, *delent; + ngtcp2_pkt_range *ent, *prev_ent; + ngtcp2_pkt_range key = { + .pkt_num = pkt_num, + .len = 1, + }; + ngtcp2_pkt_range old_key; int rv; int added = 0; if (ngtcp2_ksl_len(&acktr->ents)) { - it = ngtcp2_ksl_lower_bound(&acktr->ents, &pkt_num); + it = ngtcp2_ksl_lower_bound(&acktr->ents, &key); if (ngtcp2_ksl_it_end(&it)) { ngtcp2_ksl_it_prev(&it); - ent = ngtcp2_ksl_it_get(&it); + ent = (ngtcp2_pkt_range *)ngtcp2_ksl_it_key(&it); assert(ent->pkt_num >= pkt_num + (int64_t)ent->len); @@ -117,36 +89,37 @@ int ngtcp2_acktr_add(ngtcp2_acktr *acktr, int64_t pkt_num, int active_ack, added = 1; } } else { - ent = ngtcp2_ksl_it_get(&it); + ent = (ngtcp2_pkt_range *)ngtcp2_ksl_it_key(&it); assert(ent->pkt_num != pkt_num); if (ngtcp2_ksl_it_begin(&it)) { if (ent->pkt_num + 1 == pkt_num) { - ngtcp2_ksl_update_key(&acktr->ents, &ent->pkt_num, &pkt_num); - ent->pkt_num = pkt_num; - ent->tstamp = ts; - ++ent->len; + old_key = *ent; + key.len = ent->len + 1; + + ngtcp2_ksl_update_key(&acktr->ents, &old_key, &key); added = 1; } } else { prev_it = it; ngtcp2_ksl_it_prev(&prev_it); - prev_ent = ngtcp2_ksl_it_get(&prev_it); + prev_ent = (ngtcp2_pkt_range *)ngtcp2_ksl_it_key(&prev_it); assert(prev_ent->pkt_num >= pkt_num + (int64_t)prev_ent->len); if (ent->pkt_num + 1 == pkt_num) { if (prev_ent->pkt_num == pkt_num + (int64_t)prev_ent->len) { prev_ent->len += ent->len + 1; - ngtcp2_ksl_remove_hint(&acktr->ents, NULL, &it, &ent->pkt_num); - ngtcp2_acktr_entry_objalloc_del(ent, &acktr->objalloc); + old_key = *ent; + + ngtcp2_ksl_remove_hint(&acktr->ents, NULL, &it, &old_key); added = 1; } else { - ngtcp2_ksl_update_key(&acktr->ents, &ent->pkt_num, &pkt_num); - ent->pkt_num = pkt_num; - ent->tstamp = ts; - ++ent->len; + old_key = *ent; + key.len = ent->len + 1; + + ngtcp2_ksl_update_key(&acktr->ents, &old_key, &key); added = 1; } } else if (prev_ent->pkt_num == pkt_num + (int64_t)prev_ent->len) { @@ -158,13 +131,8 @@ int ngtcp2_acktr_add(ngtcp2_acktr *acktr, int64_t pkt_num, int active_ack, } if (!added) { - rv = ngtcp2_acktr_entry_objalloc_new(&ent, pkt_num, ts, &acktr->objalloc); - if (rv != 0) { - return rv; - } - rv = ngtcp2_ksl_insert(&acktr->ents, NULL, &ent->pkt_num, ent); + rv = ngtcp2_ksl_insert(&acktr->ents, NULL, &key, NULL); if (rv != 0) { - ngtcp2_acktr_entry_objalloc_del(ent, &acktr->objalloc); return rv; } } @@ -179,9 +147,8 @@ int ngtcp2_acktr_add(ngtcp2_acktr *acktr, int64_t pkt_num, int active_ack, if (ngtcp2_ksl_len(&acktr->ents) > NGTCP2_ACKTR_MAX_ENT) { it = ngtcp2_ksl_end(&acktr->ents); ngtcp2_ksl_it_prev(&it); - delent = ngtcp2_ksl_it_get(&it); - ngtcp2_ksl_remove_hint(&acktr->ents, NULL, &it, &delent->pkt_num); - ngtcp2_acktr_entry_objalloc_del(delent, &acktr->objalloc); + old_key = *(const ngtcp2_pkt_range *)ngtcp2_ksl_it_key(&it); + ngtcp2_ksl_remove_hint(&acktr->ents, NULL, &it, &old_key); } if (acktr->max_pkt_num < pkt_num) { @@ -192,16 +159,19 @@ int ngtcp2_acktr_add(ngtcp2_acktr *acktr, int64_t pkt_num, int active_ack, return 0; } -void ngtcp2_acktr_forget(ngtcp2_acktr *acktr, ngtcp2_acktr_entry *ent) { +void ngtcp2_acktr_forget(ngtcp2_acktr *acktr, int64_t pkt_num) { ngtcp2_ksl_it it; + ngtcp2_pkt_range key = { + .pkt_num = pkt_num, + }; - it = ngtcp2_ksl_lower_bound(&acktr->ents, &ent->pkt_num); - assert(*(int64_t *)ngtcp2_ksl_it_key(&it) == (int64_t)ent->pkt_num); + it = ngtcp2_ksl_lower_bound(&acktr->ents, &key); + assert(pkt_num == + ((const ngtcp2_pkt_range *)ngtcp2_ksl_it_key(&it))->pkt_num); for (; !ngtcp2_ksl_it_end(&it);) { - ent = ngtcp2_ksl_it_get(&it); - ngtcp2_ksl_remove_hint(&acktr->ents, &it, &it, &ent->pkt_num); - ngtcp2_acktr_entry_objalloc_del(ent, &acktr->objalloc); + key = *(const ngtcp2_pkt_range *)ngtcp2_ksl_it_key(&it); + ngtcp2_ksl_remove_hint(&acktr->ents, &it, &it, &key); } } @@ -219,45 +189,41 @@ ngtcp2_acktr_ack_entry *ngtcp2_acktr_add_ack(ngtcp2_acktr *acktr, int64_t largest_ack) { ngtcp2_acktr_ack_entry *ent = ngtcp2_ringbuf_push_front(&acktr->acks.rb); - ent->largest_ack = largest_ack; - ent->pkt_num = pkt_num; + *ent = (ngtcp2_acktr_ack_entry){ + .largest_ack = largest_ack, + .pkt_num = pkt_num, + }; return ent; } -/* - * acktr_remove removes |ent| from |acktr|. |it| must point to the - * node whose key identifies |ent|. The iterator which points to the - * entry next to |ent| is assigned to |it|. - */ -static void acktr_remove(ngtcp2_acktr *acktr, ngtcp2_ksl_it *it, - ngtcp2_acktr_entry *ent) { - ngtcp2_ksl_remove_hint(&acktr->ents, it, it, &ent->pkt_num); - ngtcp2_acktr_entry_objalloc_del(ent, &acktr->objalloc); -} - static void acktr_on_ack(ngtcp2_acktr *acktr, ngtcp2_ringbuf *rb, size_t ack_ent_offset) { ngtcp2_acktr_ack_entry *ack_ent; - ngtcp2_acktr_entry *ent; + ngtcp2_pkt_range *ent; ngtcp2_ksl_it it; + ngtcp2_pkt_range key; assert(ngtcp2_ringbuf_len(rb)); ack_ent = ngtcp2_ringbuf_get(rb, ack_ent_offset); + key = (ngtcp2_pkt_range){ + .pkt_num = ack_ent->largest_ack, + }; + /* Assume that ngtcp2_pkt_validate_ack(fr) returns 0 */ - it = ngtcp2_ksl_lower_bound(&acktr->ents, &ack_ent->largest_ack); + it = ngtcp2_ksl_lower_bound(&acktr->ents, &key); for (; !ngtcp2_ksl_it_end(&it);) { - ent = ngtcp2_ksl_it_get(&it); - acktr_remove(acktr, &it, ent); + key = *(const ngtcp2_pkt_range *)ngtcp2_ksl_it_key(&it); + ngtcp2_ksl_remove_hint(&acktr->ents, &it, &it, &key); } if (ngtcp2_ksl_len(&acktr->ents)) { assert(ngtcp2_ksl_it_end(&it)); ngtcp2_ksl_it_prev(&it); - ent = ngtcp2_ksl_it_get(&it); + ent = (ngtcp2_pkt_range *)ngtcp2_ksl_it_key(&it); assert(ent->pkt_num > ack_ent->largest_ack); @@ -333,17 +299,14 @@ void ngtcp2_acktr_immediate_ack(ngtcp2_acktr *acktr) { acktr->flags |= NGTCP2_ACKTR_FLAG_IMMEDIATE_ACK; } -ngtcp2_frame *ngtcp2_acktr_create_ack_frame(ngtcp2_acktr *acktr, - ngtcp2_frame *fr, uint8_t type, - ngtcp2_tstamp ts, - ngtcp2_duration ack_delay, - uint64_t ack_delay_exponent) { +int ngtcp2_acktr_create_ack_frame(ngtcp2_acktr *acktr, ngtcp2_ack *ack, + uint8_t type, ngtcp2_tstamp ts, + ngtcp2_duration ack_delay, + uint64_t ack_delay_exponent) { int64_t last_pkt_num; ngtcp2_ack_range *range; ngtcp2_ksl_it it; - ngtcp2_acktr_entry *rpkt; - ngtcp2_ack *ack = &fr->ack; - ngtcp2_tstamp largest_ack_ts; + const ngtcp2_pkt_range *rpkt; size_t num_acks; if (acktr->flags & NGTCP2_ACKTR_FLAG_IMMEDIATE_ACK) { @@ -351,13 +314,13 @@ ngtcp2_frame *ngtcp2_acktr_create_ack_frame(ngtcp2_acktr *acktr, } if (!ngtcp2_acktr_require_active_ack(acktr, ack_delay, ts)) { - return NULL; + return -1; } it = ngtcp2_acktr_get(acktr); if (ngtcp2_ksl_it_end(&it)) { ngtcp2_acktr_commit_ack(acktr); - return NULL; + return -1; } num_acks = ngtcp2_ksl_len(&acktr->ents); @@ -372,11 +335,10 @@ ngtcp2_frame *ngtcp2_acktr_create_ack_frame(ngtcp2_acktr *acktr, } ack->rangecnt = 0; - rpkt = ngtcp2_ksl_it_get(&it); + rpkt = ngtcp2_ksl_it_key(&it); if (rpkt->pkt_num == acktr->max_pkt_num) { last_pkt_num = rpkt->pkt_num - (int64_t)(rpkt->len - 1); - largest_ack_ts = rpkt->tstamp; ack->largest_ack = rpkt->pkt_num; ack->first_ack_range = rpkt->len - 1; @@ -384,7 +346,6 @@ ngtcp2_frame *ngtcp2_acktr_create_ack_frame(ngtcp2_acktr *acktr, --num_acks; } else if (rpkt->pkt_num + 1 == acktr->max_pkt_num) { last_pkt_num = rpkt->pkt_num - (int64_t)(rpkt->len - 1); - largest_ack_ts = acktr->max_pkt_ts; ack->largest_ack = acktr->max_pkt_num; ack->first_ack_range = rpkt->len; @@ -394,13 +355,12 @@ ngtcp2_frame *ngtcp2_acktr_create_ack_frame(ngtcp2_acktr *acktr, assert(rpkt->pkt_num < acktr->max_pkt_num); last_pkt_num = acktr->max_pkt_num; - largest_ack_ts = acktr->max_pkt_ts; ack->largest_ack = acktr->max_pkt_num; ack->first_ack_range = 0; } if (type == NGTCP2_PKT_1RTT) { - ack->ack_delay_unscaled = ts - largest_ack_ts; + ack->ack_delay_unscaled = ts - acktr->max_pkt_ts; ack->ack_delay = ack->ack_delay_unscaled / NGTCP2_MICROSECONDS / (1ULL << ack_delay_exponent); } else { @@ -408,10 +368,10 @@ ngtcp2_frame *ngtcp2_acktr_create_ack_frame(ngtcp2_acktr *acktr, ack->ack_delay = 0; } - num_acks = ngtcp2_min_size(num_acks, NGTCP2_MAX_ACK_RANGES); + num_acks = ngtcp2_min(num_acks, NGTCP2_MAX_ACK_RANGES); for (; ack->rangecnt < num_acks; ngtcp2_ksl_it_next(&it)) { - rpkt = ngtcp2_ksl_it_get(&it); + rpkt = ngtcp2_ksl_it_key(&it); range = &ack->ranges[ack->rangecnt++]; range->gap = (uint64_t)(last_pkt_num - rpkt->pkt_num - 2); @@ -420,7 +380,7 @@ ngtcp2_frame *ngtcp2_acktr_create_ack_frame(ngtcp2_acktr *acktr, last_pkt_num = rpkt->pkt_num - (int64_t)(rpkt->len - 1); } - return fr; + return 0; } void ngtcp2_acktr_increase_ecn_counts(ngtcp2_acktr *acktr, diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h index cf75a774db3e..6c0e7ccf0d12 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h @@ -35,59 +35,17 @@ #include "ngtcp2_ringbuf.h" #include "ngtcp2_ksl.h" #include "ngtcp2_pkt.h" -#include "ngtcp2_objalloc.h" -/* NGTCP2_ACKTR_MAX_ENT is the maximum number of ngtcp2_acktr_entry +/* NGTCP2_ACKTR_MAX_ENT is the maximum number of ngtcp2_pkt_range which ngtcp2_acktr stores. */ #define NGTCP2_ACKTR_MAX_ENT (NGTCP2_MAX_ACK_RANGES + 1) typedef struct ngtcp2_log ngtcp2_log; -/* - * ngtcp2_acktr_entry is a range of packets which need to be acked. - */ -typedef struct ngtcp2_acktr_entry { - union { - struct { - /* pkt_num is the largest packet number to acknowledge in this - range. */ - int64_t pkt_num; - /* len is the consecutive packets started from pkt_num which - includes pkt_num itself counting in decreasing order. So pkt_num - = 987 and len = 2, this entry includes packet 987 and 986. */ - size_t len; - /* tstamp is the timestamp when a packet denoted by pkt_num is - received. */ - ngtcp2_tstamp tstamp; - }; - - ngtcp2_opl_entry oplent; - }; -} ngtcp2_acktr_entry; - -ngtcp2_objalloc_decl(acktr_entry, ngtcp2_acktr_entry, oplent) - -/* - * ngtcp2_acktr_entry_objalloc_new allocates memory for ent, and - * initializes it with the given parameters. The pointer to the - * allocated object is stored to |*ent|. - * - * This function returns 0 if it succeeds, or one of the following - * negative error codes: - * - * NGTCP2_ERR_NOMEM - * Out of memory. - */ -int ngtcp2_acktr_entry_objalloc_new(ngtcp2_acktr_entry **ent, int64_t pkt_num, - ngtcp2_tstamp tstamp, - ngtcp2_objalloc *objalloc); - -/* - * ngtcp2_acktr_entry_objalloc_del deallocates memory allocated for - * |ent|. - */ -void ngtcp2_acktr_entry_objalloc_del(ngtcp2_acktr_entry *ent, - ngtcp2_objalloc *objalloc); +typedef struct ngtcp2_pkt_range { + int64_t pkt_num; + size_t len; +} ngtcp2_pkt_range; typedef struct ngtcp2_acktr_ack_entry { /* largest_ack is the largest packet number in outgoing ACK frame */ @@ -97,16 +55,16 @@ typedef struct ngtcp2_acktr_ack_entry { } ngtcp2_acktr_ack_entry; /* NGTCP2_ACKTR_FLAG_NONE indicates that no flag set. */ -#define NGTCP2_ACKTR_FLAG_NONE 0x00u +#define NGTCP2_ACKTR_FLAG_NONE 0x00U /* NGTCP2_ACKTR_FLAG_IMMEDIATE_ACK indicates that immediate acknowledgement is required. */ -#define NGTCP2_ACKTR_FLAG_IMMEDIATE_ACK 0x01u +#define NGTCP2_ACKTR_FLAG_IMMEDIATE_ACK 0x01U /* NGTCP2_ACKTR_FLAG_ACTIVE_ACK indicates that there are pending protected packet to be acknowledged. */ -#define NGTCP2_ACKTR_FLAG_ACTIVE_ACK 0x02u +#define NGTCP2_ACKTR_FLAG_ACTIVE_ACK 0x02U /* NGTCP2_ACKTR_FLAG_CANCEL_TIMER is set when ACK delay timer is expired and canceled. */ -#define NGTCP2_ACKTR_FLAG_CANCEL_TIMER 0x0100u +#define NGTCP2_ACKTR_FLAG_CANCEL_TIMER 0x0100U ngtcp2_static_ringbuf_def(acks, 32, sizeof(ngtcp2_acktr_ack_entry)) @@ -114,16 +72,13 @@ ngtcp2_static_ringbuf_def(acks, 32, sizeof(ngtcp2_acktr_ack_entry)) * ngtcp2_acktr tracks received packets which we have to send ack. */ typedef struct ngtcp2_acktr { - ngtcp2_objalloc objalloc; ngtcp2_static_ringbuf_acks acks; - /* ents includes ngtcp2_acktr_entry sorted by decreasing order of - packet number. */ + /* ents includes ngtcp2_pkt_range as key sorted by decreasing order + of packet number. */ ngtcp2_ksl ents; ngtcp2_log *log; - /* flags is bitwise OR of zero, or more of NGTCP2_ACKTR_FLAG_*. */ - uint16_t flags; - /* first_unacked_ts is timestamp when ngtcp2_acktr_entry is added - first time after the last outgoing ACK frame. */ + /* first_unacked_ts is timestamp when a packet to acknowledge is + added first time after the last outgoing ACK frame. */ ngtcp2_tstamp first_unacked_ts; /* rx_npkt is the number of ACK eliciting packets received without sending ACK. */ @@ -148,6 +103,9 @@ typedef struct ngtcp2_acktr { uint64_t ce; } ack; } ecn; + + /* flags is bitwise OR of zero, or more of NGTCP2_ACKTR_FLAG_*. */ + uint16_t flags; } ngtcp2_acktr; /* @@ -157,8 +115,7 @@ void ngtcp2_acktr_init(ngtcp2_acktr *acktr, ngtcp2_log *log, const ngtcp2_mem *mem); /* - * ngtcp2_acktr_free frees resources allocated for |acktr|. It frees - * any ngtcp2_acktr_entry added to |acktr|. + * ngtcp2_acktr_free frees resources allocated for |acktr|. */ void ngtcp2_acktr_free(ngtcp2_acktr *acktr); @@ -179,10 +136,10 @@ int ngtcp2_acktr_add(ngtcp2_acktr *acktr, int64_t pkt_num, int active_ack, /* * ngtcp2_acktr_forget removes all entries which have the packet - * number that is equal to or less than ent->pkt_num. This function - * assumes that |acktr| includes |ent|. + * number that is equal to or less than |pkt_num|. This function + * assumes that |acktr| includes the entry whose key is |pkt_num|. */ -void ngtcp2_acktr_forget(ngtcp2_acktr *acktr, ngtcp2_acktr_entry *ent); +void ngtcp2_acktr_forget(ngtcp2_acktr *acktr, int64_t pkt_num); /* * ngtcp2_acktr_get returns the iterator to pointer to the entry which @@ -210,7 +167,7 @@ ngtcp2_acktr_add_ack(ngtcp2_acktr *acktr, int64_t pkt_num, int64_t largest_ack); * ngtcp2_acktr_recv_ack processes the incoming ACK frame |fr|. * |pkt_num| is a packet number which includes |fr|. If we receive * ACK which acknowledges the ACKs added by ngtcp2_acktr_add_ack, - * ngtcp2_acktr_entry which the outgoing ACK acknowledges is removed. + * ngtcp2_pkt_range which the outgoing ACK acknowledges is removed. */ void ngtcp2_acktr_recv_ack(ngtcp2_acktr *acktr, const ngtcp2_ack *fr); @@ -235,19 +192,18 @@ void ngtcp2_acktr_immediate_ack(ngtcp2_acktr *acktr); /* * ngtcp2_acktr_create_ack_frame creates ACK frame in the object - * pointed by |fr|, and returns |fr| if there are any received packets - * to acknowledge. If there are no packets to acknowledge, this - * function returns NULL. fr->ack.ranges must be able to contain at + * pointed by |ack|, and returns 0 if it successfully creates ACK + * frame in |ack|. If there are no packets to acknowledge, this + * function returns -1. |ack|->ranges must be able to contain at * least NGTCP2_MAX_ACK_RANGES elements. * * Call ngtcp2_acktr_commit_ack after a created ACK frame is * successfully serialized into a packet. */ -ngtcp2_frame *ngtcp2_acktr_create_ack_frame(ngtcp2_acktr *acktr, - ngtcp2_frame *fr, uint8_t type, - ngtcp2_tstamp ts, - ngtcp2_duration ack_delay, - uint64_t ack_delay_exponent); +int ngtcp2_acktr_create_ack_frame(ngtcp2_acktr *acktr, ngtcp2_ack *ack, + uint8_t type, ngtcp2_tstamp ts, + ngtcp2_duration ack_delay, + uint64_t ack_delay_exponent); /* * ngtcp2_acktr_increase_ecn_counts increases ECN counts from |pi|. diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.c index 1fb273d494e8..58694e3836e4 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.c @@ -31,8 +31,11 @@ ngtcp2_addr *ngtcp2_addr_init(ngtcp2_addr *dest, const ngtcp2_sockaddr *addr, ngtcp2_socklen addrlen) { - dest->addrlen = addrlen; - dest->addr = (ngtcp2_sockaddr *)addr; + *dest = (ngtcp2_addr){ + .addr = (ngtcp2_sockaddr *)addr, + .addrlen = addrlen, + }; + return dest; } @@ -58,14 +61,12 @@ int ngtcp2_sockaddr_eq(const ngtcp2_sockaddr *a, const ngtcp2_sockaddr *b) { switch (a->sa_family) { case NGTCP2_AF_INET: { - const ngtcp2_sockaddr_in *ai = (const ngtcp2_sockaddr_in *)(void *)a, - *bi = (const ngtcp2_sockaddr_in *)(void *)b; + const ngtcp2_sockaddr_in *ai = (void *)a, *bi = (void *)b; return ai->sin_port == bi->sin_port && memcmp(&ai->sin_addr, &bi->sin_addr, sizeof(ai->sin_addr)) == 0; } case NGTCP2_AF_INET6: { - const ngtcp2_sockaddr_in6 *ai = (const ngtcp2_sockaddr_in6 *)(void *)a, - *bi = (const ngtcp2_sockaddr_in6 *)(void *)b; + const ngtcp2_sockaddr_in6 *ai = (void *)a, *bi = (void *)b; return ai->sin6_port == bi->sin6_port && memcmp(&ai->sin6_addr, &bi->sin6_addr, sizeof(ai->sin6_addr)) == 0; } @@ -89,8 +90,7 @@ uint32_t ngtcp2_addr_cmp(const ngtcp2_addr *aa, const ngtcp2_addr *bb) { switch (a->sa_family) { case NGTCP2_AF_INET: { - const ngtcp2_sockaddr_in *ai = (const ngtcp2_sockaddr_in *)(void *)a, - *bi = (const ngtcp2_sockaddr_in *)(void *)b; + const ngtcp2_sockaddr_in *ai = (void *)a, *bi = (void *)b; if (memcmp(&ai->sin_addr, &bi->sin_addr, sizeof(ai->sin_addr))) { flags |= NGTCP2_ADDR_CMP_FLAG_ADDR; } @@ -100,8 +100,7 @@ uint32_t ngtcp2_addr_cmp(const ngtcp2_addr *aa, const ngtcp2_addr *bb) { return flags; } case NGTCP2_AF_INET6: { - const ngtcp2_sockaddr_in6 *ai = (const ngtcp2_sockaddr_in6 *)(void *)a, - *bi = (const ngtcp2_sockaddr_in6 *)(void *)b; + const ngtcp2_sockaddr_in6 *ai = (void *)a, *bi = (void *)b; if (memcmp(&ai->sin6_addr, &bi->sin6_addr, sizeof(ai->sin6_addr))) { flags |= NGTCP2_ADDR_CMP_FLAG_ADDR; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.h index c2224f85cd9c..6314b1afc812 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.h @@ -46,14 +46,14 @@ void ngtcp2_addr_copy(ngtcp2_addr *dest, const ngtcp2_addr *src); int ngtcp2_addr_eq(const ngtcp2_addr *a, const ngtcp2_addr *b); /* NGTCP2_ADDR_CMP_FLAG_NONE indicates that no flag set. */ -#define NGTCP2_ADDR_CMP_FLAG_NONE 0x0u +#define NGTCP2_ADDR_CMP_FLAG_NONE 0x0U /* NGTCP2_ADDR_CMP_FLAG_ADDR indicates IP addresses do not match. */ -#define NGTCP2_ADDR_CMP_FLAG_ADDR 0x1u +#define NGTCP2_ADDR_CMP_FLAG_ADDR 0x1U /* NGTCP2_ADDR_CMP_FLAG_PORT indicates ports do not match. */ -#define NGTCP2_ADDR_CMP_FLAG_PORT 0x2u +#define NGTCP2_ADDR_CMP_FLAG_PORT 0x2U /* NGTCP2_ADDR_CMP_FLAG_FAMILY indicates address families do not match. */ -#define NGTCP2_ADDR_CMP_FLAG_FAMILY 0x4u +#define NGTCP2_ADDR_CMP_FLAG_FAMILY 0x4U /* * ngtcp2_addr_cmp compares address and port between |a| and |b|, and diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.c index 4a6797689fcc..ea72eb831432 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.c @@ -30,7 +30,7 @@ void ngtcp2_balloc_init(ngtcp2_balloc *balloc, size_t blklen, const ngtcp2_mem *mem) { - assert((blklen & 0xfu) == 0); + assert((blklen & 0xFU) == 0); balloc->mem = mem; balloc->blklen = blklen; @@ -66,25 +66,25 @@ int ngtcp2_balloc_get(ngtcp2_balloc *balloc, void **pbuf, size_t n) { if (ngtcp2_buf_left(&balloc->buf) < n) { p = ngtcp2_mem_malloc(balloc->mem, - sizeof(ngtcp2_memblock_hd) + 0x8u + balloc->blklen); + sizeof(ngtcp2_memblock_hd) + 0x8U + balloc->blklen); if (p == NULL) { return NGTCP2_ERR_NOMEM; } - hd = (ngtcp2_memblock_hd *)(void *)p; + hd = (void *)p; hd->next = balloc->head; balloc->head = hd; ngtcp2_buf_init( &balloc->buf, - (uint8_t *)(((uintptr_t)p + sizeof(ngtcp2_memblock_hd) + 0xfu) & - ~(uintptr_t)0xfu), + (uint8_t *)(((uintptr_t)p + sizeof(ngtcp2_memblock_hd) + 0xFU) & + ~(uintptr_t)0xFU), balloc->blklen); } - assert(((uintptr_t)balloc->buf.last & 0xfu) == 0); + assert(((uintptr_t)balloc->buf.last & 0xFU) == 0); *pbuf = balloc->buf.last; - balloc->buf.last += (n + 0xfu) & ~(uintptr_t)0xfu; + balloc->buf.last += (n + 0xFU) & ~(size_t)0xFU; return 0; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.c index 44be1e189b88..99512f347dc3 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.c @@ -62,6 +62,10 @@ #define NGTCP2_BBR_PACING_MARGIN_PERCENT 1 +#define NGTCP2_BBR_MAX_DRAIN_ROUNDS 3 + +#define NGTCP2_BBR_MAX_BDP (10 * (1ULL << 30)) + static void bbr_on_init(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, ngtcp2_tstamp initial_ts); @@ -76,13 +80,15 @@ static void bbr_init_round_counting(ngtcp2_cc_bbr *bbr); static void bbr_reset_full_bw(ngtcp2_cc_bbr *bbr); -static void bbr_init_pacing_rate(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); +static void bbr_init_pacing_rate(const ngtcp2_cc_bbr *bbr, + ngtcp2_conn_stat *cstat); -static void bbr_set_pacing_rate_with_gain(ngtcp2_cc_bbr *bbr, +static void bbr_set_pacing_rate_with_gain(const ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, uint64_t pacing_gain_h); -static void bbr_set_pacing_rate(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); +static void bbr_set_pacing_rate(const ngtcp2_cc_bbr *bbr, + ngtcp2_conn_stat *cstat); static void bbr_enter_startup(ngtcp2_cc_bbr *bbr); @@ -100,47 +106,47 @@ static void bbr_update_control_parameters(ngtcp2_cc_bbr *cc, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack); -static void bbr_update_on_loss(ngtcp2_cc_bbr *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_pkt *pkt, ngtcp2_tstamp ts); - static void bbr_update_latest_delivery_signals(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat); + const ngtcp2_conn_stat *cstat); static void bbr_advance_latest_delivery_signals(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat); + const ngtcp2_conn_stat *cstat); static void bbr_update_congestion_signals(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, + const ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack); -static void bbr_adapt_lower_bounds_from_congestion(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat); +static void +bbr_adapt_lower_bounds_from_congestion(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat); -static void bbr_init_lower_bounds(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); +static void bbr_init_lower_bounds(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat); static void bbr_loss_lower_bounds(ngtcp2_cc_bbr *bbr); static void bbr_bound_bw_for_model(ngtcp2_cc_bbr *bbr); -static void bbr_update_max_bw(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, +static void bbr_update_max_bw(ngtcp2_cc_bbr *bbr, const ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack); static void bbr_update_round(ngtcp2_cc_bbr *bbr, const ngtcp2_cc_ack *ack); static void bbr_start_round(ngtcp2_cc_bbr *bbr); -static int bbr_is_in_probe_bw_state(ngtcp2_cc_bbr *bbr); +static int bbr_is_in_probe_bw_state(const ngtcp2_cc_bbr *bbr); -static int bbr_is_probing_bw(ngtcp2_cc_bbr *bbr); +static int bbr_is_probing_bw(const ngtcp2_cc_bbr *bbr); static void bbr_update_ack_aggregation(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, + const ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); static void bbr_enter_drain(ngtcp2_cc_bbr *bbr); -static void bbr_check_drain_done(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, +static void bbr_check_drain_done(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); static void bbr_enter_probe_bw(ngtcp2_cc_bbr *bbr, ngtcp2_tstamp ts); @@ -151,59 +157,71 @@ static void bbr_start_probe_bw_cruise(ngtcp2_cc_bbr *bbr); static void bbr_start_probe_bw_refill(ngtcp2_cc_bbr *bbr); -static void bbr_start_probe_bw_up(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); +static void bbr_start_probe_bw_up(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat); static void bbr_update_probe_bw_cycle_phase(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, + const ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); -static int bbr_is_time_to_cruise(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); +static int bbr_is_time_to_cruise(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat); -static int bbr_is_time_to_go_down(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); +static int bbr_is_time_to_go_down(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat); -static int bbr_has_elapsed_in_phase(ngtcp2_cc_bbr *bbr, +static int bbr_has_elapsed_in_phase(const ngtcp2_cc_bbr *bbr, ngtcp2_duration interval, ngtcp2_tstamp ts); -static uint64_t bbr_inflight_with_headroom(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat); +static uint64_t bbr_inflight_with_headroom(const ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat); static void bbr_raise_inflight_longterm_slope(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat); + const ngtcp2_conn_stat *cstat); static void bbr_probe_inflight_longterm_upward(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, + const ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack); -static void bbr_adapt_longterm_model(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack); +static int bbr_adapt_longterm_model(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat, + const ngtcp2_cc_ack *ack); -static int bbr_is_time_to_probe_bw(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, +static int bbr_is_time_to_probe_bw(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); static void bbr_pick_probe_wait(ngtcp2_cc_bbr *bbr); -static int bbr_is_reno_coexistence_probe_time(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat); +static int bbr_is_reno_coexistence_probe_time(const ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat); -static uint64_t bbr_target_inflight(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat); +static uint64_t bbr_target_inflight(const ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat); -static int bbr_is_inflight_too_high(ngtcp2_cc_bbr *bbr); +static int bbr_is_inflight_too_high(const ngtcp2_cc_bbr *bbr, + const ngtcp2_rs *rs); static void bbr_handle_inflight_too_high(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts); + const ngtcp2_conn_stat *cstat, + const ngtcp2_rs *rs, ngtcp2_tstamp ts); + +static void bbr_note_loss(ngtcp2_cc_bbr *bbr, const ngtcp2_conn_stat *cstat); -static void bbr_note_loss(ngtcp2_cc_bbr *bbr); +static void bbr_save_state_upon_loss(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat); -static void bbr_handle_lost_packet(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, +static void bbr_handle_spurious_loss_detection(ngtcp2_cc_bbr *bbr, + ngtcp2_conn_stat *cstat); + +static void bbr_handle_lost_packet(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat, const ngtcp2_cc_pkt *pkt, ngtcp2_tstamp ts); -static uint64_t -bbr_inflight_longterm_from_lost_packet(ngtcp2_cc_bbr *bbr, - const ngtcp2_cc_pkt *pkt); +static uint64_t bbr_inflight_at_loss(const ngtcp2_cc_bbr *bbr, + const ngtcp2_cc_pkt *pkt, + const ngtcp2_rs *rs); static void bbr_update_min_rtt(ngtcp2_cc_bbr *bbr, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); @@ -220,7 +238,7 @@ static void bbr_check_probe_rtt_done(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); static void bbr_mark_connection_app_limited(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat); + const ngtcp2_conn_stat *cstat); static void bbr_exit_probe_rtt(ngtcp2_cc_bbr *bbr, ngtcp2_tstamp ts); @@ -231,27 +249,28 @@ static void bbr_handle_restart_from_idle(ngtcp2_cc_bbr *bbr, static uint64_t bbr_bdp_multiple(ngtcp2_cc_bbr *bbr, uint64_t gain_h); static uint64_t bbr_quantization_budget(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, + const ngtcp2_conn_stat *cstat, uint64_t inflight); -static uint64_t bbr_inflight(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, +static uint64_t bbr_inflight(ngtcp2_cc_bbr *bbr, const ngtcp2_conn_stat *cstat, uint64_t gain_h); static void bbr_update_max_inflight(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat); + const ngtcp2_conn_stat *cstat); static void bbr_update_offload_budget(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat); + const ngtcp2_conn_stat *cstat); static uint64_t min_pipe_cwnd(size_t max_udp_payload_size); static void bbr_advance_max_bw_filter(ngtcp2_cc_bbr *bbr); -static void bbr_save_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); +static void bbr_save_cwnd(ngtcp2_cc_bbr *bbr, const ngtcp2_conn_stat *cstat); -static void bbr_restore_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); +static void bbr_restore_cwnd(const ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); -static uint64_t bbr_probe_rtt_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); +static uint64_t bbr_probe_rtt_cwnd(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat); static void bbr_bound_cwnd_for_probe_rtt(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); @@ -259,10 +278,11 @@ static void bbr_bound_cwnd_for_probe_rtt(ngtcp2_cc_bbr *bbr, static void bbr_set_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack); -static void bbr_bound_cwnd_for_model(ngtcp2_cc_bbr *bbr, +static void bbr_bound_cwnd_for_model(const ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); -static void bbr_set_send_quantum(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); +static void bbr_set_send_quantum(const ngtcp2_cc_bbr *bbr, + ngtcp2_conn_stat *cstat); static int in_congestion_recovery(const ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_time); @@ -272,9 +292,8 @@ static void bbr_handle_recovery(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, static void bbr_on_init(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, ngtcp2_tstamp initial_ts) { - ngtcp2_window_filter_init(&bbr->max_bw_filter, NGTCP2_BBR_MAX_BW_FILTERLEN); - ngtcp2_window_filter_init(&bbr->extra_acked_filter, - NGTCP2_BBR_EXTRA_ACKED_FILTERLEN); + ngtcp2_wf_init(&bbr->max_bw_filter, NGTCP2_BBR_MAX_BW_FILTERLEN); + ngtcp2_wf_init(&bbr->extra_acked_filter, NGTCP2_BBR_EXTRA_ACKED_FILTERLEN); bbr->min_rtt = cstat->first_rtt_sample_ts == UINT64_MAX ? UINT64_MAX : cstat->smoothed_rtt; @@ -301,7 +320,7 @@ static void bbr_on_init(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, bbr->loss_round_start = 0; bbr->loss_round_delivered = UINT64_MAX; - bbr->rounds_since_bw_probe = 0; + bbr->rounds_since_probe_up = 0; bbr->max_bw = 0; bbr->bw = 0; @@ -315,13 +334,15 @@ static void bbr_on_init(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, bbr->offload_budget = 0; - bbr->probe_up_cnt = UINT64_MAX; + bbr->probe_up_acked_per_inc = UINT64_MAX; bbr->cycle_stamp = UINT64_MAX; - bbr->ack_phase = 0; + bbr->ack_phase = NGTCP2_BBR_ACK_PHASE_ACKS_INIT; bbr->bw_probe_wait = 0; - bbr->bw_probe_samples = 0; + bbr->is_bw_probe_sample = 0; bbr->bw_probe_up_rounds = 0; - bbr->bw_probe_up_acks = 0; + bbr->bw_probe_up_acked = 0; + bbr->prev_probe_too_high = 0; + bbr->prev_probe_precautionary = 0; bbr->inflight_longterm = UINT64_MAX; @@ -334,13 +355,17 @@ static void bbr_on_init(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, bbr->max_inflight = 0; - bbr->congestion_recovery_start_ts = UINT64_MAX; - bbr->bdp = 0; + bbr->drain_start_round = 0; + + bbr->undo_state = NGTCP2_BBR_STATE_NONE; + bbr->undo_bw_shortterm = 0; + bbr->undo_inflight_shortterm = 0; + bbr->undo_inflight_longterm = 0; } static void bbr_reset_congestion_signals(ngtcp2_cc_bbr *bbr) { - bbr->loss_in_round = 0; + bbr->is_loss_in_round = 0; bbr->bw_latest = 0; bbr->inflight_latest = 0; } @@ -363,7 +388,7 @@ static void bbr_reset_full_bw(ngtcp2_cc_bbr *bbr) { } static void bbr_check_full_bw_reached(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat) { + const ngtcp2_conn_stat *cstat) { if (bbr->full_bw_now || !bbr->round_start || bbr->rst->rs.is_app_limited) { return; } @@ -384,32 +409,34 @@ static void bbr_check_full_bw_reached(ngtcp2_cc_bbr *bbr, bbr->full_bw_reached = 1; - ngtcp2_log_info(bbr->cc.log, NGTCP2_LOG_EVENT_CCA, - "bbr reached full bandwidth, full_bw=%" PRIu64, bbr->full_bw); + ngtcp2_log_infof(bbr->cc.log, NGTCP2_LOG_EVENT_CCA, + "bbr reached full bandwidth, full_bw=", bbr->full_bw); } static void bbr_check_startup_high_loss(ngtcp2_cc_bbr *bbr) { if (bbr->full_bw_reached || bbr->loss_events_in_round <= 6 || (bbr->in_loss_recovery && bbr->round_count <= bbr->round_count_at_recovery) || - !bbr_is_inflight_too_high(bbr)) { + !bbr_is_inflight_too_high(bbr, &bbr->rst->rs)) { return; } bbr->full_bw_reached = 1; - bbr->inflight_longterm = ngtcp2_max_uint64( - bbr_bdp_multiple(bbr, bbr->cwnd_gain_h), bbr->inflight_latest); + bbr->inflight_longterm = + ngtcp2_max(bbr_bdp_multiple(bbr, bbr->cwnd_gain_h), bbr->inflight_latest); } -static void bbr_init_pacing_rate(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { +static void bbr_init_pacing_rate(const ngtcp2_cc_bbr *bbr, + ngtcp2_conn_stat *cstat) { cstat->pacing_interval_m = - ((cstat->first_rtt_sample_ts == UINT64_MAX ? NGTCP2_MILLISECONDS - : cstat->smoothed_rtt) - << 10) * - 100 / NGTCP2_BBR_STARTUP_PACING_GAIN_H / bbr->initial_cwnd; + ngtcp2_max(((cstat->first_rtt_sample_ts == UINT64_MAX ? NGTCP2_MILLISECONDS + : cstat->smoothed_rtt) + << 10) * + 100 / NGTCP2_BBR_STARTUP_PACING_GAIN_H / bbr->initial_cwnd, + 1); } -static void bbr_set_pacing_rate_with_gain(ngtcp2_cc_bbr *bbr, +static void bbr_set_pacing_rate_with_gain(const ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, uint64_t pacing_gain_h) { uint64_t interval_m; @@ -420,14 +447,15 @@ static void bbr_set_pacing_rate_with_gain(ngtcp2_cc_bbr *bbr, interval_m = (NGTCP2_SECONDS << 10) * 100 * 100 / pacing_gain_h / bbr->bw / (100 - NGTCP2_BBR_PACING_MARGIN_PERCENT); - interval_m = ngtcp2_max_uint64(interval_m, 1); + interval_m = ngtcp2_max(interval_m, 1); if (bbr->full_bw_reached || interval_m < cstat->pacing_interval_m) { cstat->pacing_interval_m = interval_m; } } -static void bbr_set_pacing_rate(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { +static void bbr_set_pacing_rate(const ngtcp2_cc_bbr *bbr, + ngtcp2_conn_stat *cstat) { bbr_set_pacing_rate_with_gain(bbr, cstat, bbr->pacing_gain_h); } @@ -483,17 +511,12 @@ static void bbr_update_control_parameters(ngtcp2_cc_bbr *bbr, bbr_set_cwnd(bbr, cstat, ack); } -static void bbr_update_on_loss(ngtcp2_cc_bbr *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_pkt *pkt, ngtcp2_tstamp ts) { - bbr_handle_lost_packet(cc, cstat, pkt, ts); -} - static void bbr_update_latest_delivery_signals(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat) { + const ngtcp2_conn_stat *cstat) { bbr->loss_round_start = 0; - bbr->bw_latest = ngtcp2_max_uint64(bbr->bw_latest, cstat->delivery_rate_sec); + bbr->bw_latest = ngtcp2_max(bbr->bw_latest, cstat->delivery_rate_sec); bbr->inflight_latest = - ngtcp2_max_uint64(bbr->inflight_latest, bbr->rst->rs.delivered); + ngtcp2_max(bbr->inflight_latest, bbr->rst->rs.delivered); if (bbr->rst->rs.prior_delivered >= bbr->loss_round_delivered) { bbr->loss_round_delivered = bbr->rst->delivered; @@ -502,7 +525,7 @@ static void bbr_update_latest_delivery_signals(ngtcp2_cc_bbr *bbr, } static void bbr_advance_latest_delivery_signals(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat) { + const ngtcp2_conn_stat *cstat) { if (bbr->loss_round_start) { bbr->bw_latest = cstat->delivery_rate_sec; bbr->inflight_latest = bbr->rst->rs.delivered; @@ -510,7 +533,7 @@ static void bbr_advance_latest_delivery_signals(ngtcp2_cc_bbr *bbr, } static void bbr_update_congestion_signals(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, + const ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack) { bbr_update_max_bw(bbr, cstat, ack); @@ -525,22 +548,24 @@ static void bbr_update_congestion_signals(ngtcp2_cc_bbr *bbr, bbr_adapt_lower_bounds_from_congestion(bbr, cstat); - bbr->loss_in_round = 0; + bbr->is_loss_in_round = 0; } -static void bbr_adapt_lower_bounds_from_congestion(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat) { +static void +bbr_adapt_lower_bounds_from_congestion(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat) { if (bbr_is_probing_bw(bbr)) { return; } - if (bbr->loss_in_round) { + if (bbr->is_loss_in_round) { bbr_init_lower_bounds(bbr, cstat); bbr_loss_lower_bounds(bbr); } } -static void bbr_init_lower_bounds(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { +static void bbr_init_lower_bounds(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat) { if (bbr->bw_shortterm == UINT64_MAX) { bbr->bw_shortterm = bbr->max_bw; } @@ -551,27 +576,28 @@ static void bbr_init_lower_bounds(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { } static void bbr_loss_lower_bounds(ngtcp2_cc_bbr *bbr) { - bbr->bw_shortterm = ngtcp2_max_uint64( - bbr->bw_latest, - bbr->bw_shortterm * NGTCP2_BBR_BETA_NUMER / NGTCP2_BBR_BETA_DENOM); - bbr->inflight_shortterm = ngtcp2_max_uint64( + bbr->bw_shortterm = + ngtcp2_max(bbr->bw_latest, bbr->bw_shortterm * NGTCP2_BBR_BETA_NUMER / + NGTCP2_BBR_BETA_DENOM); + bbr->inflight_shortterm = ngtcp2_max( bbr->inflight_latest, bbr->inflight_shortterm * NGTCP2_BBR_BETA_NUMER / NGTCP2_BBR_BETA_DENOM); } static void bbr_bound_bw_for_model(ngtcp2_cc_bbr *bbr) { - bbr->bw = ngtcp2_min_uint64(bbr->max_bw, bbr->bw_shortterm); + bbr->bw = ngtcp2_min(bbr->max_bw, bbr->bw_shortterm); } -static void bbr_update_max_bw(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, +static void bbr_update_max_bw(ngtcp2_cc_bbr *bbr, const ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack) { bbr_update_round(bbr, ack); - if (cstat->delivery_rate_sec >= bbr->max_bw || !bbr->rst->rs.is_app_limited) { - ngtcp2_window_filter_update(&bbr->max_bw_filter, cstat->delivery_rate_sec, - bbr->cycle_count); + if (cstat->delivery_rate_sec && (cstat->delivery_rate_sec >= bbr->max_bw || + !bbr->rst->rs.is_app_limited)) { + ngtcp2_wf_update(&bbr->max_bw_filter, cstat->delivery_rate_sec, + bbr->cycle_count); - bbr->max_bw = ngtcp2_window_filter_get_best(&bbr->max_bw_filter); + bbr->max_bw = ngtcp2_wf_get_best(&bbr->max_bw_filter); } } @@ -580,7 +606,7 @@ static void bbr_update_round(ngtcp2_cc_bbr *bbr, const ngtcp2_cc_ack *ack) { bbr_start_round(bbr); ++bbr->round_count; - ++bbr->rounds_since_bw_probe; + ++bbr->rounds_since_probe_up; bbr->round_start = 1; bbr->bytes_lost_in_round = 0; @@ -598,7 +624,7 @@ static void bbr_start_round(ngtcp2_cc_bbr *bbr) { bbr->next_round_delivered = bbr->rst->delivered; } -static int bbr_is_in_probe_bw_state(ngtcp2_cc_bbr *bbr) { +static int bbr_is_in_probe_bw_state(const ngtcp2_cc_bbr *bbr) { switch (bbr->state) { case NGTCP2_BBR_STATE_PROBE_BW_DOWN: case NGTCP2_BBR_STATE_PROBE_BW_CRUISE: @@ -610,7 +636,7 @@ static int bbr_is_in_probe_bw_state(ngtcp2_cc_bbr *bbr) { } } -static int bbr_is_probing_bw(ngtcp2_cc_bbr *bbr) { +static int bbr_is_probing_bw(const ngtcp2_cc_bbr *bbr) { switch (bbr->state) { case NGTCP2_BBR_STATE_STARTUP: case NGTCP2_BBR_STATE_PROBE_BW_REFILL: @@ -622,7 +648,7 @@ static int bbr_is_probing_bw(ngtcp2_cc_bbr *bbr) { } static void bbr_update_ack_aggregation(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, + const ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts) { ngtcp2_duration interval = ts - bbr->extra_acked_interval_start; @@ -641,19 +667,18 @@ static void bbr_update_ack_aggregation(ngtcp2_cc_bbr *bbr, extra = 0; } else { extra = bbr->extra_acked_delivered - expected_delivered; - extra = ngtcp2_min_uint64(extra, cstat->cwnd); + extra = ngtcp2_min(extra, cstat->cwnd); } if (bbr->full_bw_reached) { - bbr->extra_acked_filter.window_length = NGTCP2_BBR_EXTRA_ACKED_FILTERLEN; + bbr->extra_acked_filter.win = NGTCP2_BBR_EXTRA_ACKED_FILTERLEN; } else { - bbr->extra_acked_filter.window_length = 1; + bbr->extra_acked_filter.win = 1; } - ngtcp2_window_filter_update(&bbr->extra_acked_filter, extra, - bbr->round_count); + ngtcp2_wf_update(&bbr->extra_acked_filter, extra, bbr->round_count); - bbr->extra_acked = ngtcp2_window_filter_get_best(&bbr->extra_acked_filter); + bbr->extra_acked = ngtcp2_wf_get_best(&bbr->extra_acked_filter); } static void bbr_enter_drain(ngtcp2_cc_bbr *bbr) { @@ -662,12 +687,16 @@ static void bbr_enter_drain(ngtcp2_cc_bbr *bbr) { bbr->state = NGTCP2_BBR_STATE_DRAIN; bbr->pacing_gain_h = NGTCP2_BBR_DRAIN_PACING_GAIN_H; bbr->cwnd_gain_h = NGTCP2_BBR_DEFAULT_CWND_GAIN_H; + bbr->drain_start_round = bbr->round_count; } -static void bbr_check_drain_done(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, +static void bbr_check_drain_done(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts) { if (bbr->state == NGTCP2_BBR_STATE_DRAIN && - cstat->bytes_in_flight <= bbr_inflight(bbr, cstat, 100)) { + (cstat->bytes_in_flight <= bbr_inflight(bbr, cstat, 100) || + bbr->round_count > + bbr->drain_start_round + NGTCP2_BBR_MAX_DRAIN_ROUNDS)) { bbr_enter_probe_bw(bbr, ts); } } @@ -681,7 +710,7 @@ static void bbr_start_probe_bw_down(ngtcp2_cc_bbr *bbr, ngtcp2_tstamp ts) { bbr_reset_congestion_signals(bbr); - bbr->probe_up_cnt = UINT64_MAX; + bbr->probe_up_acked_per_inc = UINT64_MAX; bbr_pick_probe_wait(bbr); @@ -711,7 +740,8 @@ static void bbr_start_probe_bw_refill(ngtcp2_cc_bbr *bbr) { bbr_reset_shortterm_model(bbr); bbr->bw_probe_up_rounds = 0; - bbr->bw_probe_up_acks = 0; + bbr->bw_probe_up_acked = 0; + bbr->prev_probe_precautionary = 0; bbr->ack_phase = NGTCP2_BBR_ACK_PHASE_ACKS_REFILLING; bbr_start_round(bbr); @@ -721,7 +751,8 @@ static void bbr_start_probe_bw_refill(ngtcp2_cc_bbr *bbr) { bbr->cwnd_gain_h = NGTCP2_BBR_DEFAULT_CWND_GAIN_H; } -static void bbr_start_probe_bw_up(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { +static void bbr_start_probe_bw_up(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat) { ngtcp2_log_info(bbr->cc.log, NGTCP2_LOG_EVENT_CCA, "bbr start ProbeBW_UP"); bbr->ack_phase = NGTCP2_BBR_ACK_PHASE_ACKS_PROBE_STARTING; @@ -738,14 +769,16 @@ static void bbr_start_probe_bw_up(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { } static void bbr_update_probe_bw_cycle_phase(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, + const ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts) { if (!bbr->full_bw_reached) { return; } - bbr_adapt_longterm_model(bbr, cstat, ack); + if (bbr_adapt_longterm_model(bbr, cstat, ack)) { + return; + } if (!bbr_is_in_probe_bw_state(bbr)) { return; @@ -770,13 +803,14 @@ static void bbr_update_probe_bw_cycle_phase(ngtcp2_cc_bbr *bbr, break; case NGTCP2_BBR_STATE_PROBE_BW_REFILL: if (bbr->round_start) { - bbr->bw_probe_samples = 1; + bbr->is_bw_probe_sample = 1; bbr_start_probe_bw_up(bbr, cstat); } break; case NGTCP2_BBR_STATE_PROBE_BW_UP: if (bbr_is_time_to_go_down(bbr, cstat)) { + bbr->prev_probe_too_high = 0; bbr_start_probe_bw_down(bbr, ts); } @@ -786,14 +820,23 @@ static void bbr_update_probe_bw_cycle_phase(ngtcp2_cc_bbr *bbr, } } -static int bbr_is_time_to_cruise(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { - uint64_t inflight = ngtcp2_min_uint64(bbr_inflight_with_headroom(bbr, cstat), - bbr_inflight(bbr, cstat, 100)); +static int bbr_is_time_to_cruise(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat) { + uint64_t inflight = ngtcp2_min(bbr_inflight_with_headroom(bbr, cstat), + bbr_inflight(bbr, cstat, 100)); return cstat->bytes_in_flight <= inflight; } -static int bbr_is_time_to_go_down(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { +static int bbr_is_time_to_go_down(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat) { + if (bbr->prev_probe_too_high && + cstat->bytes_in_flight >= bbr->inflight_longterm) { + bbr->prev_probe_precautionary = 1; + + return 1; + } + if (bbr->rst->is_cwnd_limited && cstat->cwnd >= bbr->inflight_longterm) { bbr_reset_full_bw(bbr); bbr->full_bw = cstat->delivery_rate_sec; @@ -804,44 +847,43 @@ static int bbr_is_time_to_go_down(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { return bbr->full_bw_now; } -static int bbr_has_elapsed_in_phase(ngtcp2_cc_bbr *bbr, +static int bbr_has_elapsed_in_phase(const ngtcp2_cc_bbr *bbr, ngtcp2_duration interval, ngtcp2_tstamp ts) { return ts > bbr->cycle_stamp + interval; } -static uint64_t bbr_inflight_with_headroom(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat) { +static uint64_t bbr_inflight_with_headroom(const ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat) { uint64_t headroom; uint64_t mpcwnd; if (bbr->inflight_longterm == UINT64_MAX) { return UINT64_MAX; } - headroom = - ngtcp2_max_uint64(cstat->max_tx_udp_payload_size, - bbr->inflight_longterm * NGTCP2_BBR_HEADROOM_NUMER / - NGTCP2_BBR_HEADROOM_DENOM); + headroom = ngtcp2_max((uint64_t)cstat->max_tx_udp_payload_size, + bbr->inflight_longterm * NGTCP2_BBR_HEADROOM_NUMER / + NGTCP2_BBR_HEADROOM_DENOM); mpcwnd = min_pipe_cwnd(cstat->max_tx_udp_payload_size); if (bbr->inflight_longterm > headroom) { - return ngtcp2_max_uint64(bbr->inflight_longterm - headroom, mpcwnd); + return ngtcp2_max(bbr->inflight_longterm - headroom, mpcwnd); } return mpcwnd; } static void bbr_raise_inflight_longterm_slope(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat) { - uint64_t growth_this_round = cstat->max_tx_udp_payload_size - << bbr->bw_probe_up_rounds; + const ngtcp2_conn_stat *cstat) { + uint64_t growth_this_round = 1ULL << bbr->bw_probe_up_rounds; - bbr->bw_probe_up_rounds = ngtcp2_min_size(bbr->bw_probe_up_rounds + 1, 30); - bbr->probe_up_cnt = ngtcp2_max_uint64(cstat->cwnd / growth_this_round, 1); + bbr->bw_probe_up_rounds = ngtcp2_min(bbr->bw_probe_up_rounds + 1, 30); + bbr->probe_up_acked_per_inc = + ngtcp2_max(cstat->cwnd / growth_this_round, cstat->max_tx_udp_payload_size); } static void bbr_probe_inflight_longterm_upward(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, + const ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack) { uint64_t delta; @@ -849,14 +891,12 @@ static void bbr_probe_inflight_longterm_upward(ngtcp2_cc_bbr *bbr, return; } - bbr->bw_probe_up_acks += ack->bytes_delivered; + bbr->bw_probe_up_acked += ack->bytes_delivered; - if (bbr->probe_up_cnt != UINT64_MAX && - bbr->bw_probe_up_acks >= - bbr->probe_up_cnt * cstat->max_tx_udp_payload_size) { - delta = bbr->bw_probe_up_acks / bbr->probe_up_cnt; - bbr->bw_probe_up_acks -= delta * bbr->probe_up_cnt; - bbr->inflight_longterm += delta; + if (bbr->bw_probe_up_acked >= bbr->probe_up_acked_per_inc) { + delta = bbr->bw_probe_up_acked / bbr->probe_up_acked_per_inc; + bbr->bw_probe_up_acked -= delta * bbr->probe_up_acked_per_inc; + bbr->inflight_longterm += delta * cstat->max_tx_udp_payload_size; } if (bbr->round_start) { @@ -864,9 +904,9 @@ static void bbr_probe_inflight_longterm_upward(ngtcp2_cc_bbr *bbr, } } -static void bbr_adapt_longterm_model(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack) { +static int bbr_adapt_longterm_model(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat, + const ngtcp2_cc_ack *ack) { if (bbr->ack_phase == NGTCP2_BBR_ACK_PHASE_ACKS_PROBE_STARTING && bbr->round_start) { bbr->ack_phase = NGTCP2_BBR_ACK_PHASE_ACKS_PROBE_FEEDBACK; @@ -874,14 +914,24 @@ static void bbr_adapt_longterm_model(ngtcp2_cc_bbr *bbr, if (bbr->ack_phase == NGTCP2_BBR_ACK_PHASE_ACKS_PROBE_STOPPING && bbr->round_start) { + bbr->is_bw_probe_sample = 0; + bbr->ack_phase = NGTCP2_BBR_ACK_PHASE_ACKS_INIT; + if (bbr_is_in_probe_bw_state(bbr) && !bbr->rst->rs.is_app_limited) { bbr_advance_max_bw_filter(bbr); } + + if (bbr_is_in_probe_bw_state(bbr) && bbr->prev_probe_precautionary && + !bbr->prev_probe_too_high) { + bbr_start_probe_bw_refill(bbr); + + return 1; + } } - if (!bbr_is_inflight_too_high(bbr)) { + if (!bbr_is_inflight_too_high(bbr, &bbr->rst->rs)) { if (bbr->inflight_longterm == UINT64_MAX) { - return; + return 0; } if (bbr->rst->rs.tx_in_flight > bbr->inflight_longterm) { @@ -892,9 +942,12 @@ static void bbr_adapt_longterm_model(ngtcp2_cc_bbr *bbr, bbr_probe_inflight_longterm_upward(bbr, cstat, ack); } } + + return 0; } -static int bbr_is_time_to_probe_bw(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, +static int bbr_is_time_to_probe_bw(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts) { if (bbr_has_elapsed_in_phase(bbr, bbr->bw_probe_wait, ts) || bbr_is_reno_coexistence_probe_time(bbr, cstat)) { @@ -907,39 +960,40 @@ static int bbr_is_time_to_probe_bw(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, } static void bbr_pick_probe_wait(ngtcp2_cc_bbr *bbr) { - bbr->rounds_since_bw_probe = ngtcp2_pcg32_rand_n(bbr->pcg, 2); + bbr->rounds_since_probe_up = ngtcp2_pcg32_rand_n(bbr->pcg, 2); bbr->bw_probe_wait = 2 * NGTCP2_SECONDS + ngtcp2_pcg32_rand_n(bbr->pcg, NGTCP2_SECONDS + 1); } -static int bbr_is_reno_coexistence_probe_time(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat) { +static int bbr_is_reno_coexistence_probe_time(const ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat) { uint64_t reno_rounds = bbr_target_inflight(bbr, cstat) / cstat->max_tx_udp_payload_size; - return bbr->rounds_since_bw_probe >= ngtcp2_min_uint64(reno_rounds, 63); + return bbr->rounds_since_probe_up >= ngtcp2_min(reno_rounds, 63); } -static uint64_t bbr_target_inflight(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat) { - return ngtcp2_min_uint64(bbr->bdp, cstat->cwnd); +static uint64_t bbr_target_inflight(const ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat) { + return ngtcp2_min(bbr->bdp, cstat->cwnd); } -static int bbr_is_inflight_too_high(ngtcp2_cc_bbr *bbr) { - const ngtcp2_rs *rs = &bbr->rst->rs; +static int bbr_is_inflight_too_high(const ngtcp2_cc_bbr *bbr, + const ngtcp2_rs *rs) { + (void)bbr; return rs->lost * NGTCP2_BBR_LOSS_THRESH_DENOM > rs->tx_in_flight * NGTCP2_BBR_LOSS_THRESH_NUMER; } static void bbr_handle_inflight_too_high(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, + const ngtcp2_conn_stat *cstat, + const ngtcp2_rs *rs, ngtcp2_tstamp ts) { - const ngtcp2_rs *rs = &bbr->rst->rs; - - bbr->bw_probe_samples = 0; + bbr->prev_probe_too_high = 1; + bbr->is_bw_probe_sample = 0; if (!rs->is_app_limited) { - bbr->inflight_longterm = ngtcp2_max_uint64( + bbr->inflight_longterm = ngtcp2_max( rs->tx_in_flight, bbr_target_inflight(bbr, cstat) * NGTCP2_BBR_BETA_NUMER / NGTCP2_BBR_BETA_DENOM); } @@ -949,40 +1003,81 @@ static void bbr_handle_inflight_too_high(ngtcp2_cc_bbr *bbr, } } -static void bbr_note_loss(ngtcp2_cc_bbr *bbr) { - if (!bbr->loss_in_round) { +static void bbr_note_loss(ngtcp2_cc_bbr *bbr, const ngtcp2_conn_stat *cstat) { + if (!bbr->is_loss_in_round) { bbr->loss_round_delivered = bbr->rst->delivered; + bbr_save_state_upon_loss(bbr, cstat); } - bbr->loss_in_round = 1; + bbr->is_loss_in_round = 1; } -static void bbr_handle_lost_packet(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, +static void bbr_save_state_upon_loss(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat) { + bbr_save_cwnd(bbr, cstat); + bbr->undo_state = bbr->state; + bbr->undo_bw_shortterm = bbr->bw_shortterm; + bbr->undo_inflight_shortterm = bbr->inflight_shortterm; + bbr->undo_inflight_longterm = bbr->inflight_longterm; +} + +static void bbr_handle_spurious_loss_detection(ngtcp2_cc_bbr *bbr, + ngtcp2_conn_stat *cstat) { + bbr_restore_cwnd(bbr, cstat); + + bbr->is_loss_in_round = 0; + + bbr_reset_full_bw(bbr); + + bbr->bw_shortterm = ngtcp2_max(bbr->bw_shortterm, bbr->undo_bw_shortterm); + bbr->inflight_shortterm = + ngtcp2_max(bbr->inflight_shortterm, bbr->undo_inflight_shortterm); + bbr->inflight_longterm = + ngtcp2_max(bbr->inflight_longterm, bbr->undo_inflight_longterm); + + if (bbr->undo_state == NGTCP2_BBR_STATE_STARTUP && + bbr->state != NGTCP2_BBR_STATE_STARTUP) { + bbr->full_bw_reached = 0; + + if (bbr->state != NGTCP2_BBR_STATE_PROBE_RTT) { + bbr_enter_startup(bbr); + } + } else if (bbr->undo_state == NGTCP2_BBR_STATE_PROBE_BW_UP && + bbr->state != NGTCP2_BBR_STATE_PROBE_BW_UP) { + if (bbr->state != NGTCP2_BBR_STATE_PROBE_RTT) { + bbr_start_probe_bw_refill(bbr); + } + } + + bbr->undo_state = NGTCP2_BBR_STATE_NONE; +} + +static void bbr_handle_lost_packet(ngtcp2_cc_bbr *bbr, + const ngtcp2_conn_stat *cstat, const ngtcp2_cc_pkt *pkt, ngtcp2_tstamp ts) { - ngtcp2_rs *rs = &bbr->rst->rs; + ngtcp2_rs rs = {0}; - bbr_note_loss(bbr); + bbr_note_loss(bbr, cstat); - if (!bbr->bw_probe_samples) { + if (!bbr->is_bw_probe_sample) { return; } - rs->tx_in_flight = pkt->tx_in_flight; + rs.tx_in_flight = pkt->tx_in_flight; assert(bbr->rst->lost >= pkt->lost); - rs->lost = bbr->rst->lost - pkt->lost; - rs->is_app_limited = pkt->is_app_limited; + rs.lost = bbr->rst->lost - pkt->lost; + rs.is_app_limited = pkt->is_app_limited; - if (bbr_is_inflight_too_high(bbr)) { - rs->tx_in_flight = bbr_inflight_longterm_from_lost_packet(bbr, pkt); + if (bbr_is_inflight_too_high(bbr, &rs)) { + rs.tx_in_flight = bbr_inflight_at_loss(bbr, pkt, &rs); - bbr_handle_inflight_too_high(bbr, cstat, ts); + bbr_handle_inflight_too_high(bbr, cstat, &rs, ts); } } -static uint64_t -bbr_inflight_longterm_from_lost_packet(ngtcp2_cc_bbr *bbr, - const ngtcp2_cc_pkt *pkt) { - ngtcp2_rs *rs = &bbr->rst->rs; +static uint64_t bbr_inflight_at_loss(const ngtcp2_cc_bbr *bbr, + const ngtcp2_cc_pkt *pkt, + const ngtcp2_rs *rs) { uint64_t inflight_prev, lost_prev, lost_prefix; (void)bbr; @@ -1025,8 +1120,8 @@ static void bbr_update_min_rtt(ngtcp2_cc_bbr *bbr, const ngtcp2_cc_ack *ack, bbr->min_rtt = bbr->probe_rtt_min_delay; bbr->min_rtt_stamp = bbr->probe_rtt_min_stamp; - ngtcp2_log_info(bbr->cc.log, NGTCP2_LOG_EVENT_CCA, - "bbr update min_rtt=%" PRIu64, bbr->min_rtt); + ngtcp2_log_infof(bbr->cc.log, NGTCP2_LOG_EVENT_CCA, + "bbr update min_rtt=", bbr->min_rtt); } } @@ -1097,14 +1192,9 @@ static void bbr_check_probe_rtt_done(ngtcp2_cc_bbr *bbr, } static void bbr_mark_connection_app_limited(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat) { - uint64_t app_limited = bbr->rst->delivered + cstat->bytes_in_flight; - - if (app_limited) { - bbr->rst->app_limited = app_limited; - } else { - bbr->rst->app_limited = cstat->max_tx_udp_payload_size; - } + const ngtcp2_conn_stat *cstat) { + bbr->rst->app_limited = + ngtcp2_max(bbr->rst->delivered + cstat->bytes_in_flight, 1); } static void bbr_exit_probe_rtt(ngtcp2_cc_bbr *bbr, ngtcp2_tstamp ts) { @@ -1140,7 +1230,12 @@ static uint64_t bbr_bdp_multiple(ngtcp2_cc_bbr *bbr, uint64_t gain_h) { return bbr->initial_cwnd; } - bbr->bdp = ngtcp2_max_uint64(bbr->bw * bbr->min_rtt / NGTCP2_SECONDS, 1); + if (bbr->min_rtt && + bbr->bw > NGTCP2_BBR_MAX_BDP * NGTCP2_SECONDS / bbr->min_rtt) { + bbr->bdp = NGTCP2_BBR_MAX_BDP; + } else { + bbr->bdp = ngtcp2_max(bbr->bw * bbr->min_rtt / NGTCP2_SECONDS, 1); + } return (uint64_t)(bbr->bdp * gain_h / 100); } @@ -1150,13 +1245,13 @@ static uint64_t min_pipe_cwnd(size_t max_udp_payload_size) { } static uint64_t bbr_quantization_budget(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, + const ngtcp2_conn_stat *cstat, uint64_t inflight) { bbr_update_offload_budget(bbr, cstat); - inflight = ngtcp2_max_uint64(inflight, bbr->offload_budget); + inflight = ngtcp2_max(inflight, bbr->offload_budget); inflight = - ngtcp2_max_uint64(inflight, min_pipe_cwnd(cstat->max_tx_udp_payload_size)); + ngtcp2_max(inflight, min_pipe_cwnd(cstat->max_tx_udp_payload_size)); if (bbr->state == NGTCP2_BBR_STATE_PROBE_BW_UP) { inflight += 2 * cstat->max_tx_udp_payload_size; @@ -1165,7 +1260,7 @@ static uint64_t bbr_quantization_budget(ngtcp2_cc_bbr *bbr, return inflight; } -static uint64_t bbr_inflight(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, +static uint64_t bbr_inflight(ngtcp2_cc_bbr *bbr, const ngtcp2_conn_stat *cstat, uint64_t gain_h) { uint64_t inflight = bbr_bdp_multiple(bbr, gain_h); @@ -1173,7 +1268,7 @@ static uint64_t bbr_inflight(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, } static void bbr_update_max_inflight(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat) { + const ngtcp2_conn_stat *cstat) { uint64_t inflight; inflight = bbr_bdp_multiple(bbr, bbr->cwnd_gain_h) + bbr->extra_acked; @@ -1181,7 +1276,7 @@ static void bbr_update_max_inflight(ngtcp2_cc_bbr *bbr, } static void bbr_update_offload_budget(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat) { + const ngtcp2_conn_stat *cstat) { bbr->offload_budget = 3 * cstat->send_quantum; } @@ -1189,33 +1284,33 @@ static void bbr_advance_max_bw_filter(ngtcp2_cc_bbr *bbr) { ++bbr->cycle_count; } -static void bbr_save_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { +static void bbr_save_cwnd(ngtcp2_cc_bbr *bbr, const ngtcp2_conn_stat *cstat) { if (!bbr->in_loss_recovery && bbr->state != NGTCP2_BBR_STATE_PROBE_RTT) { bbr->prior_cwnd = cstat->cwnd; return; } - bbr->prior_cwnd = ngtcp2_max_uint64(bbr->prior_cwnd, cstat->cwnd); + bbr->prior_cwnd = ngtcp2_max(bbr->prior_cwnd, cstat->cwnd); } -static void bbr_restore_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { - cstat->cwnd = ngtcp2_max_uint64(cstat->cwnd, bbr->prior_cwnd); +static void bbr_restore_cwnd(const ngtcp2_cc_bbr *bbr, + ngtcp2_conn_stat *cstat) { + cstat->cwnd = ngtcp2_max(cstat->cwnd, bbr->prior_cwnd); } static uint64_t bbr_probe_rtt_cwnd(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat) { + const ngtcp2_conn_stat *cstat) { uint64_t probe_rtt_cwnd = bbr_bdp_multiple(bbr, NGTCP2_BBR_PROBE_RTT_CWND_GAIN_H); uint64_t mpcwnd = min_pipe_cwnd(cstat->max_tx_udp_payload_size); - return ngtcp2_max_uint64(probe_rtt_cwnd, mpcwnd); + return ngtcp2_max(probe_rtt_cwnd, mpcwnd); } static void bbr_bound_cwnd_for_probe_rtt(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { if (bbr->state == NGTCP2_BBR_STATE_PROBE_RTT) { - cstat->cwnd = - ngtcp2_min_uint64(cstat->cwnd, bbr_probe_rtt_cwnd(bbr, cstat)); + cstat->cwnd = ngtcp2_min(cstat->cwnd, bbr_probe_rtt_cwnd(bbr, cstat)); } } @@ -1227,20 +1322,20 @@ static void bbr_set_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, if (bbr->full_bw_reached) { cstat->cwnd += ack->bytes_delivered; - cstat->cwnd = ngtcp2_min_uint64(cstat->cwnd, bbr->max_inflight); + cstat->cwnd = ngtcp2_min(cstat->cwnd, bbr->max_inflight); } else if (cstat->cwnd < bbr->max_inflight || bbr->rst->delivered < bbr->initial_cwnd) { cstat->cwnd += ack->bytes_delivered; } mpcwnd = min_pipe_cwnd(cstat->max_tx_udp_payload_size); - cstat->cwnd = ngtcp2_max_uint64(cstat->cwnd, mpcwnd); + cstat->cwnd = ngtcp2_max(cstat->cwnd, mpcwnd); bbr_bound_cwnd_for_probe_rtt(bbr, cstat); bbr_bound_cwnd_for_model(bbr, cstat); } -static void bbr_bound_cwnd_for_model(ngtcp2_cc_bbr *bbr, +static void bbr_bound_cwnd_for_model(const ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { uint64_t cap = UINT64_MAX; uint64_t mpcwnd = min_pipe_cwnd(cstat->max_tx_udp_payload_size); @@ -1253,22 +1348,22 @@ static void bbr_bound_cwnd_for_model(ngtcp2_cc_bbr *bbr, cap = bbr_inflight_with_headroom(bbr, cstat); } - cap = ngtcp2_min_uint64(cap, bbr->inflight_shortterm); - cap = ngtcp2_max_uint64(cap, mpcwnd); + cap = ngtcp2_min(cap, bbr->inflight_shortterm); + cap = ngtcp2_max(cap, mpcwnd); - cstat->cwnd = ngtcp2_min_uint64(cstat->cwnd, cap); + cstat->cwnd = ngtcp2_min(cstat->cwnd, cap); } -static void bbr_set_send_quantum(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { +static void bbr_set_send_quantum(const ngtcp2_cc_bbr *bbr, + ngtcp2_conn_stat *cstat) { size_t send_quantum = 64 * 1024; (void)bbr; - send_quantum = - ngtcp2_min_size(send_quantum, (size_t)((NGTCP2_MILLISECONDS << 10) / - cstat->pacing_interval_m)); + send_quantum = ngtcp2_min(send_quantum, (size_t)((NGTCP2_MILLISECONDS << 10) / + cstat->pacing_interval_m)); cstat->send_quantum = - ngtcp2_max_size(send_quantum, 2 * cstat->max_tx_udp_payload_size); + ngtcp2_max(send_quantum, 2 * cstat->max_tx_udp_payload_size); } static int in_congestion_recovery(const ngtcp2_conn_stat *cstat, @@ -1279,28 +1374,15 @@ static int in_congestion_recovery(const ngtcp2_conn_stat *cstat, static void bbr_handle_recovery(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack) { - if (bbr->in_loss_recovery) { - if (ack->largest_pkt_sent_ts != UINT64_MAX && - !in_congestion_recovery(cstat, ack->largest_pkt_sent_ts)) { - bbr->in_loss_recovery = 0; - bbr->round_count_at_recovery = UINT64_MAX; - bbr_restore_cwnd(bbr, cstat); - } - + if (!bbr->in_loss_recovery) { return; } - if (bbr->congestion_recovery_start_ts != UINT64_MAX) { - bbr->in_loss_recovery = 1; - bbr->round_count_at_recovery = - bbr->round_start ? bbr->round_count : bbr->round_count + 1; - bbr_save_cwnd(bbr, cstat); - cstat->cwnd = - cstat->bytes_in_flight + - ngtcp2_max_uint64(ack->bytes_delivered, cstat->max_tx_udp_payload_size); - - cstat->congestion_recovery_start_ts = bbr->congestion_recovery_start_ts; - bbr->congestion_recovery_start_ts = UINT64_MAX; + if (ack->largest_pkt_sent_ts != UINT64_MAX && + !in_congestion_recovery(cstat, ack->largest_pkt_sent_ts)) { + bbr->in_loss_recovery = 0; + bbr->round_count_at_recovery = UINT64_MAX; + bbr_restore_cwnd(bbr, cstat); } } @@ -1308,22 +1390,25 @@ static void bbr_cc_on_pkt_lost(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, const ngtcp2_cc_pkt *pkt, ngtcp2_tstamp ts) { ngtcp2_cc_bbr *bbr = ngtcp2_struct_of(cc, ngtcp2_cc_bbr, cc); - bbr_update_on_loss(bbr, cstat, pkt, ts); + bbr_handle_lost_packet(bbr, cstat, pkt, ts); } static void bbr_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp sent_ts, uint64_t bytes_lost, + ngtcp2_tstamp sent_ts, + const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts) { ngtcp2_cc_bbr *bbr = ngtcp2_struct_of(cc, ngtcp2_cc_bbr, cc); - (void)bytes_lost; + (void)ack; - if (bbr->in_loss_recovery || - bbr->congestion_recovery_start_ts != UINT64_MAX || - in_congestion_recovery(cstat, sent_ts)) { + if (bbr->in_loss_recovery || in_congestion_recovery(cstat, sent_ts)) { return; } - bbr->congestion_recovery_start_ts = ts; + bbr->in_loss_recovery = 1; + bbr->round_count_at_recovery = + bbr->round_start ? bbr->round_count : bbr->round_count + 1; + + cstat->congestion_recovery_start_ts = ts; } static void bbr_cc_on_spurious_congestion(ngtcp2_cc *cc, @@ -1332,14 +1417,12 @@ static void bbr_cc_on_spurious_congestion(ngtcp2_cc *cc, ngtcp2_cc_bbr *bbr = ngtcp2_struct_of(cc, ngtcp2_cc_bbr, cc); (void)ts; - bbr->congestion_recovery_start_ts = UINT64_MAX; cstat->congestion_recovery_start_ts = UINT64_MAX; - if (bbr->in_loss_recovery) { - bbr->in_loss_recovery = 0; - bbr->round_count_at_recovery = UINT64_MAX; - bbr_restore_cwnd(bbr, cstat); - } + bbr->in_loss_recovery = 0; + bbr->round_count_at_recovery = UINT64_MAX; + + bbr_handle_spurious_loss_detection(bbr, cstat); } static void bbr_cc_on_persistent_congestion(ngtcp2_cc *cc, @@ -1349,14 +1432,12 @@ static void bbr_cc_on_persistent_congestion(ngtcp2_cc *cc, (void)ts; cstat->congestion_recovery_start_ts = UINT64_MAX; - bbr->congestion_recovery_start_ts = UINT64_MAX; bbr->in_loss_recovery = 0; bbr->round_count_at_recovery = UINT64_MAX; - bbr_save_cwnd(bbr, cstat); cstat->cwnd = cstat->bytes_in_flight + cstat->max_tx_udp_payload_size; - cstat->cwnd = ngtcp2_max_uint64( - cstat->cwnd, min_pipe_cwnd(cstat->max_tx_udp_payload_size)); + cstat->cwnd = + ngtcp2_max(cstat->cwnd, min_pipe_cwnd(cstat->max_tx_udp_payload_size)); } static void bbr_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, @@ -1364,6 +1445,11 @@ static void bbr_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_cc_bbr *bbr = ngtcp2_struct_of(cc, ngtcp2_cc_bbr, cc); bbr_handle_recovery(bbr, cstat, ack); + + if (ack->bytes_delivered == 0) { + return; + } + bbr_update_on_ack(bbr, cstat, ack, ts); } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h index 0499924f5826..09dacf81bd55 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h @@ -32,12 +32,13 @@ #include #include "ngtcp2_cc.h" -#include "ngtcp2_window_filter.h" +#include "ngtcp2_wf.h" typedef struct ngtcp2_rst ngtcp2_rst; typedef struct ngtcp2_pcg32 ngtcp2_pcg32; typedef enum ngtcp2_bbr_state { + NGTCP2_BBR_STATE_NONE, NGTCP2_BBR_STATE_STARTUP, NGTCP2_BBR_STATE_DRAIN, NGTCP2_BBR_STATE_PROBE_BW_DOWN, @@ -48,6 +49,7 @@ typedef enum ngtcp2_bbr_state { } ngtcp2_bbr_state; typedef enum ngtcp2_bbr_ack_phase { + NGTCP2_BBR_ACK_PHASE_ACKS_INIT, NGTCP2_BBR_ACK_PHASE_ACKS_PROBE_STARTING, NGTCP2_BBR_ACK_PHASE_ACKS_PROBE_STOPPING, NGTCP2_BBR_ACK_PHASE_ACKS_PROBE_FEEDBACK, @@ -67,21 +69,21 @@ typedef struct ngtcp2_cc_bbr { /* max_bw_filter for tracking the maximum recent delivery rate samples for estimating max_bw. */ - ngtcp2_window_filter max_bw_filter; + ngtcp2_wf max_bw_filter; - ngtcp2_window_filter extra_acked_filter; + ngtcp2_wf extra_acked_filter; ngtcp2_duration min_rtt; ngtcp2_tstamp min_rtt_stamp; ngtcp2_tstamp probe_rtt_done_stamp; int probe_rtt_round_done; - uint64_t prior_cwnd; int idle_restart; + uint64_t prior_cwnd; ngtcp2_tstamp extra_acked_interval_start; uint64_t extra_acked_delivered; /* Congestion signals */ - int loss_in_round; + int is_loss_in_round; uint64_t bw_latest; uint64_t inflight_latest; @@ -91,8 +93,8 @@ typedef struct ngtcp2_cc_bbr { /* Round counting */ uint64_t next_round_delivered; - int round_start; uint64_t round_count; + int round_start; /* Full pipe */ uint64_t full_bw; @@ -106,9 +108,14 @@ typedef struct ngtcp2_cc_bbr { ngtcp2_bbr_state state; uint64_t cwnd_gain_h; - int loss_round_start; + /* Backup for spurious losses */ + ngtcp2_bbr_state undo_state; + uint64_t undo_bw_shortterm; + uint64_t undo_inflight_shortterm; + uint64_t undo_inflight_longterm; + uint64_t loss_round_delivered; - uint64_t rounds_since_bw_probe; + uint64_t rounds_since_probe_up; uint64_t max_bw; uint64_t bw; uint64_t cycle_count; @@ -116,22 +123,25 @@ typedef struct ngtcp2_cc_bbr { uint64_t bytes_lost_in_round; size_t loss_events_in_round; uint64_t offload_budget; - uint64_t probe_up_cnt; + uint64_t probe_up_acked_per_inc; ngtcp2_tstamp cycle_stamp; ngtcp2_bbr_ack_phase ack_phase; ngtcp2_duration bw_probe_wait; - int bw_probe_samples; size_t bw_probe_up_rounds; - uint64_t bw_probe_up_acks; + uint64_t bw_probe_up_acked; uint64_t inflight_longterm; - int probe_rtt_expired; ngtcp2_duration probe_rtt_min_delay; ngtcp2_tstamp probe_rtt_min_stamp; - int in_loss_recovery; uint64_t round_count_at_recovery; uint64_t max_inflight; - ngtcp2_tstamp congestion_recovery_start_ts; uint64_t bdp; + uint64_t drain_start_round; + int loss_round_start; + int is_bw_probe_sample; + int probe_rtt_expired; + int in_loss_recovery; + int prev_probe_too_high; + int prev_probe_precautionary; } ngtcp2_cc_bbr; void ngtcp2_cc_bbr_init(ngtcp2_cc_bbr *bbr, ngtcp2_log *log, diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_buf.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_buf.c index bf4273f816a8..083a766281b2 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_buf.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_buf.c @@ -26,8 +26,12 @@ #include "ngtcp2_mem.h" void ngtcp2_buf_init(ngtcp2_buf *buf, uint8_t *begin, size_t len) { - buf->begin = buf->pos = buf->last = begin; - buf->end = begin + len; + *buf = (ngtcp2_buf){ + .begin = begin, + .end = begin + len, + .pos = begin, + .last = begin, + }; } void ngtcp2_buf_reset(ngtcp2_buf *buf) { buf->pos = buf->last = buf->begin; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_callbacks.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_callbacks.c index 7e77186772b7..08c9876346f3 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_callbacks.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_callbacks.c @@ -42,7 +42,7 @@ const ngtcp2_callbacks *ngtcp2_callbacks_convert_to_latest( return src; } - memset(dest, 0, sizeof(*dest)); + *dest = (ngtcp2_callbacks){0}; callbacks_copy(dest, src, callbacks_version); @@ -63,6 +63,15 @@ size_t ngtcp2_callbackslen_version(int callbacks_version) { switch (callbacks_version) { case NGTCP2_CALLBACKS_VERSION: return sizeof(callbacks); + case NGTCP2_CALLBACKS_V4: + return offsetof(ngtcp2_callbacks, recv_stop_sending) + + sizeof(callbacks.recv_stop_sending); + case NGTCP2_CALLBACKS_V3: + return offsetof(ngtcp2_callbacks, get_path_challenge_data2) + + sizeof(callbacks.get_path_challenge_data2); + case NGTCP2_CALLBACKS_V2: + return offsetof(ngtcp2_callbacks, begin_path_validation) + + sizeof(callbacks.begin_path_validation); case NGTCP2_CALLBACKS_V1: return offsetof(ngtcp2_callbacks, tls_early_data_rejected) + sizeof(callbacks.tls_early_data_rejected); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.c index c16953802afd..2d3c65dbf385 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.c @@ -36,9 +36,41 @@ #include "ngtcp2_unreachable.h" uint64_t ngtcp2_cc_compute_initcwnd(size_t max_udp_payload_size) { - uint64_t n = 2 * max_udp_payload_size; - n = ngtcp2_max_uint64(n, 14720); - return ngtcp2_min_uint64(10 * max_udp_payload_size, n); + size_t n = ngtcp2_max(2 * max_udp_payload_size, 14720); + return ngtcp2_min(10 * max_udp_payload_size, n); +} + +/* 1.25 is the under-utilization avoidance factor described in + https://datatracker.ietf.org/doc/html/rfc9002#section-7.7 */ +#define NGTCP2_CC_PACING_GAIN_H 125 + +static void init_pacing_rate(ngtcp2_conn_stat *cstat) { + assert(cstat->cwnd); + + cstat->pacing_interval_m = ngtcp2_max((NGTCP2_MILLISECONDS << 10) * 100 / + NGTCP2_CC_PACING_GAIN_H / cstat->cwnd, + 1); + cstat->send_quantum = 10 * cstat->max_tx_udp_payload_size; +} + +static void set_pacing_rate(ngtcp2_conn_stat *cstat) { + size_t send_quantum = 64 * 1024; + + assert(cstat->cwnd); + + cstat->pacing_interval_m = + ((cstat->first_rtt_sample_ts == UINT64_MAX ? NGTCP2_MILLISECONDS + : cstat->smoothed_rtt) + << 10) * + 100 / NGTCP2_CC_PACING_GAIN_H / cstat->cwnd; + + cstat->pacing_interval_m = ngtcp2_max(cstat->pacing_interval_m, 1); + + send_quantum = ngtcp2_min(send_quantum, (size_t)((NGTCP2_MILLISECONDS << 10) / + cstat->pacing_interval_m)); + + cstat->send_quantum = + ngtcp2_max(send_quantum, 10 * cstat->max_tx_udp_payload_size); } ngtcp2_cc_pkt *ngtcp2_cc_pkt_init(ngtcp2_cc_pkt *pkt, int64_t pkt_num, @@ -56,9 +88,14 @@ ngtcp2_cc_pkt *ngtcp2_cc_pkt_init(ngtcp2_cc_pkt *pkt, int64_t pkt_num, return pkt; } -static void reno_cc_reset(ngtcp2_cc_reno *reno) { reno->pending_add = 0; } +static void reno_cc_reset(ngtcp2_cc_reno *reno, ngtcp2_conn_stat *cstat) { + reno->pending_add = 0; -void ngtcp2_cc_reno_init(ngtcp2_cc_reno *reno, ngtcp2_log *log) { + init_pacing_rate(cstat); +} + +void ngtcp2_cc_reno_init(ngtcp2_cc_reno *reno, ngtcp2_log *log, + ngtcp2_conn_stat *cstat) { *reno = (ngtcp2_cc_reno){ .cc = { @@ -70,7 +107,7 @@ void ngtcp2_cc_reno_init(ngtcp2_cc_reno *reno, ngtcp2_log *log) { }, }; - reno_cc_reset(reno); + reno_cc_reset(reno, cstat); } static int in_congestion_recovery(const ngtcp2_conn_stat *cstat, @@ -92,9 +129,11 @@ void ngtcp2_cc_reno_cc_on_pkt_acked(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, if (cstat->cwnd < cstat->ssthresh) { cstat->cwnd += pkt->pktlen; - ngtcp2_log_info(reno->cc.log, NGTCP2_LOG_EVENT_CCA, - "pkn=%" PRId64 " acked, slow start cwnd=%" PRIu64, - pkt->pkt_num, cstat->cwnd); + + set_pacing_rate(cstat); + + ngtcp2_log_infof(reno->cc.log, NGTCP2_LOG_EVENT_CCA, "pkn=", pkt->pkt_num, + " acked, slow start cwnd=", cstat->cwnd); return; } @@ -102,14 +141,17 @@ void ngtcp2_cc_reno_cc_on_pkt_acked(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, reno->pending_add = m % cstat->cwnd; cstat->cwnd += m / cstat->cwnd; + + set_pacing_rate(cstat); } void ngtcp2_cc_reno_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, - uint64_t bytes_lost, ngtcp2_tstamp ts) { + const ngtcp2_cc_ack *ack, + ngtcp2_tstamp ts) { ngtcp2_cc_reno *reno = ngtcp2_struct_of(cc, ngtcp2_cc_reno, cc); uint64_t min_cwnd; - (void)bytes_lost; + (void)ack; if (in_congestion_recovery(cstat, sent_ts)) { return; @@ -118,14 +160,15 @@ void ngtcp2_cc_reno_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, cstat->congestion_recovery_start_ts = ts; cstat->cwnd >>= NGTCP2_LOSS_REDUCTION_FACTOR_BITS; min_cwnd = 2 * cstat->max_tx_udp_payload_size; - cstat->cwnd = ngtcp2_max_uint64(cstat->cwnd, min_cwnd); + cstat->cwnd = ngtcp2_max(cstat->cwnd, min_cwnd); cstat->ssthresh = cstat->cwnd; reno->pending_add = 0; - ngtcp2_log_info(reno->cc.log, NGTCP2_LOG_EVENT_CCA, - "reduce cwnd because of packet loss cwnd=%" PRIu64, - cstat->cwnd); + set_pacing_rate(cstat); + + ngtcp2_log_infof(reno->cc.log, NGTCP2_LOG_EVENT_CCA, + "reduce cwnd because of packet loss cwnd=", cstat->cwnd); } void ngtcp2_cc_reno_cc_on_persistent_congestion(ngtcp2_cc *cc, @@ -136,15 +179,16 @@ void ngtcp2_cc_reno_cc_on_persistent_congestion(ngtcp2_cc *cc, cstat->cwnd = 2 * cstat->max_tx_udp_payload_size; cstat->congestion_recovery_start_ts = UINT64_MAX; + + set_pacing_rate(cstat); } void ngtcp2_cc_reno_cc_reset(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts) { ngtcp2_cc_reno *reno = ngtcp2_struct_of(cc, ngtcp2_cc_reno, cc); - (void)cstat; (void)ts; - reno_cc_reset(reno); + reno_cc_reset(reno, cstat); } static void cubic_vars_reset(ngtcp2_cubic_vars *v) { @@ -156,11 +200,11 @@ static void cubic_vars_reset(ngtcp2_cubic_vars *v) { v->app_limited_start_ts = UINT64_MAX; v->app_limited_duration = 0; - v->pending_bytes_delivered = 0; - v->pending_est_bytes_delivered = 0; + v->pending_bytes_acked = 0; + v->pending_est_bytes_acked = 0; } -static void cubic_cc_reset(ngtcp2_cc_cubic *cubic) { +static void cubic_cc_reset(ngtcp2_cc_cubic *cubic, ngtcp2_conn_stat *cstat) { cubic_vars_reset(&cubic->current); cubic_vars_reset(&cubic->undo.v); cubic->undo.cwnd = 0; @@ -174,10 +218,12 @@ static void cubic_cc_reset(ngtcp2_cc_cubic *cubic) { cubic->hs.css_round = 0; cubic->next_round_delivered = 0; + + init_pacing_rate(cstat); } void ngtcp2_cc_cubic_init(ngtcp2_cc_cubic *cubic, ngtcp2_log *log, - ngtcp2_rst *rst) { + ngtcp2_conn_stat *cstat, ngtcp2_rst *rst) { *cubic = (ngtcp2_cc_cubic){ .cc = { @@ -191,7 +237,7 @@ void ngtcp2_cc_cubic_init(ngtcp2_cc_cubic *cubic, ngtcp2_log *log, .rst = rst, }; - cubic_cc_reset(cubic); + cubic_cc_reset(cubic, cstat); } uint64_t ngtcp2_cbrt(uint64_t n) { @@ -211,7 +257,6 @@ uint64_t ngtcp2_cbrt(uint64_t n) { y <<= 1; b = 3 * y * (y + 1) + 1; if (n >= b) { - n -= b; y++; } @@ -242,7 +287,7 @@ static uint64_t cubic_cc_compute_w_cubic(ngtcp2_cc_cubic *cubic, time_delta_m = tx_m - cubic->current.k_m; } - time_delta_m = ngtcp2_min_uint64(time_delta_m, 3600 << 10); + time_delta_m = ngtcp2_min(time_delta_m, 3600 << 10); delta = ((((time_delta_m * time_delta_m) >> 10) * time_delta_m) >> 10) * cstat->max_tx_udp_payload_size * 4 / 10; @@ -266,24 +311,26 @@ void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); uint64_t w_cubic, w_cubic_next; uint64_t target, m; + uint64_t bytes_acked; ngtcp2_duration rtt_thresh; int round_start; int is_app_limited = cubic->rst->rs.is_app_limited && !cubic->rst->is_cwnd_limited; - if (in_congestion_recovery(cstat, ack->largest_pkt_sent_ts)) { + if (ack->bytes_delivered == 0 || + in_congestion_recovery(cstat, ack->largest_pkt_sent_ts)) { return; } - if (cstat->cwnd < cstat->ssthresh) { - /* slow-start */ - round_start = ack->pkt_delivered >= cubic->next_round_delivered; - if (round_start) { - cubic->next_round_delivered = cubic->rst->delivered; + round_start = ack->pkt_delivered >= cubic->next_round_delivered; + if (round_start) { + cubic->next_round_delivered = cubic->rst->delivered; - cubic->rst->is_cwnd_limited = 0; - } + cubic->rst->is_cwnd_limited = 0; + } + if (cstat->cwnd < cstat->ssthresh) { + /* slow-start */ if (!is_app_limited) { if (cubic->hs.css_round) { cstat->cwnd += ack->bytes_delivered / NGTCP2_HS_CSS_GROWTH_DIVISOR; @@ -291,9 +338,11 @@ void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, cstat->cwnd += ack->bytes_delivered; } - ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, - "%" PRIu64 " bytes acked, slow start cwnd=%" PRIu64, - ack->bytes_delivered, cstat->cwnd); + set_pacing_rate(cstat); + + ngtcp2_log_infof(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, + ack->bytes_delivered, + " bytes acked, slow start cwnd=", cstat->cwnd); } if (round_start) { @@ -307,7 +356,7 @@ void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, } cubic->hs.current_round_min_rtt = - ngtcp2_min_uint64(cubic->hs.current_round_min_rtt, ack->rtt); + ngtcp2_min(cubic->hs.current_round_min_rtt, ack->rtt); ++cubic->hs.rtt_sample_count; if (cubic->hs.css_round) { @@ -334,11 +383,10 @@ void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, if (cubic->hs.rtt_sample_count >= NGTCP2_HS_N_RTT_SAMPLE && cubic->hs.current_round_min_rtt != UINT64_MAX && cubic->hs.last_round_min_rtt != UINT64_MAX) { - rtt_thresh = - ngtcp2_max_uint64(NGTCP2_HS_MIN_RTT_THRESH, - ngtcp2_min_uint64(cubic->hs.last_round_min_rtt / - NGTCP2_HS_MIN_RTT_DIVISOR, - NGTCP2_HS_MAX_RTT_THRESH)); + rtt_thresh = ngtcp2_max( + NGTCP2_HS_MIN_RTT_THRESH, + ngtcp2_min(cubic->hs.last_round_min_rtt / NGTCP2_HS_MIN_RTT_DIVISOR, + NGTCP2_HS_MAX_RTT_THRESH)); if (cubic->hs.current_round_min_rtt >= cubic->hs.last_round_min_rtt + rtt_thresh) { @@ -379,35 +427,45 @@ void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, target = w_cubic_next; } - m = ack->bytes_delivered * cstat->max_tx_udp_payload_size + - cubic->current.pending_est_bytes_delivered; - cubic->current.pending_est_bytes_delivered = m % cstat->cwnd; + bytes_acked = ack->bytes_delivered * cstat->max_tx_udp_payload_size; + m = (bytes_acked + cubic->current.pending_est_bytes_acked) / cstat->cwnd; + + cubic->current.pending_est_bytes_acked += bytes_acked; + cubic->current.pending_est_bytes_acked -= m * cstat->cwnd; + + assert(cubic->current.pending_est_bytes_acked < cstat->cwnd); if (cubic->current.w_est < cubic->current.cwnd_prior) { - cubic->current.w_est += m * 9 / 17 / cstat->cwnd; + cubic->current.w_est += m * 9 / 17; } else { - cubic->current.w_est += m / cstat->cwnd; + cubic->current.w_est += m; } if (cubic->current.w_est > w_cubic) { cstat->cwnd = cubic->current.w_est; } else { - m = (target - cstat->cwnd) * cstat->max_tx_udp_payload_size + - cubic->current.pending_bytes_delivered; - cubic->current.pending_bytes_delivered = m % cstat->cwnd; - cstat->cwnd += m / cstat->cwnd; + bytes_acked = (target - cstat->cwnd) * cstat->max_tx_udp_payload_size; + m = (bytes_acked + cubic->current.pending_bytes_acked) / cstat->cwnd; + + cubic->current.pending_bytes_acked += bytes_acked; + cubic->current.pending_bytes_acked -= m * cstat->cwnd; + + assert(cubic->current.pending_bytes_acked < cstat->cwnd); + + cstat->cwnd += m; } - ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, - "%" PRIu64 " bytes acked, cubic-ca cwnd=%" PRIu64 - " k_m=%" PRIu64 " target=%" PRIu64 " w_est=%" PRIu64, - ack->bytes_delivered, cstat->cwnd, cubic->current.k_m, target, - cubic->current.w_est); + set_pacing_rate(cstat); + + ngtcp2_log_infof(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, ack->bytes_delivered, + " bytes acked, cubic-ca cwnd=", cstat->cwnd, + " k_m=", cubic->current.k_m, " target=", target, + " w_est=", cubic->current.w_est); } void ngtcp2_cc_cubic_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, - uint64_t bytes_lost, + const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts) { ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); uint64_t flight_size; @@ -428,8 +486,8 @@ void ngtcp2_cc_cubic_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, cubic->current.epoch_start = ts; cubic->current.app_limited_start_ts = UINT64_MAX; cubic->current.app_limited_duration = 0; - cubic->current.pending_bytes_delivered = 0; - cubic->current.pending_est_bytes_delivered = 0; + cubic->current.pending_bytes_acked = 0; + cubic->current.pending_est_bytes_acked = 0; if (cstat->cwnd < cubic->current.w_max) { cubic->current.w_max = cstat->cwnd * 17 / 20; @@ -438,19 +496,18 @@ void ngtcp2_cc_cubic_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, } cubic->current.w_max = - ngtcp2_max_uint64(cubic->current.w_max, 2 * cstat->max_tx_udp_payload_size); + ngtcp2_max(cubic->current.w_max, 2 * cstat->max_tx_udp_payload_size); cstat->ssthresh = cstat->cwnd * 7 / 10; if (cubic->rst->rs.delivered * 2 < cstat->cwnd) { - flight_size = cstat->bytes_in_flight + bytes_lost; - cstat->ssthresh = ngtcp2_min_uint64( - cstat->ssthresh, - ngtcp2_max_uint64(cubic->rst->rs.delivered, flight_size)); + flight_size = cstat->bytes_in_flight + ack->bytes_lost; + cstat->ssthresh = ngtcp2_min( + cstat->ssthresh, ngtcp2_max(cubic->rst->rs.delivered, flight_size)); } cstat->ssthresh = - ngtcp2_max_uint64(cstat->ssthresh, 2 * cstat->max_tx_udp_payload_size); + ngtcp2_max(cstat->ssthresh, 2 * cstat->max_tx_udp_payload_size); cubic->current.cwnd_prior = cstat->cwnd; cstat->cwnd = cstat->ssthresh; @@ -464,9 +521,10 @@ void ngtcp2_cc_cubic_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, cubic->current.k_m = ngtcp2_cbrt((cwnd_delta << 30) * 10 / 4 / cstat->max_tx_udp_payload_size); - ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, - "reduce cwnd because of packet loss cwnd=%" PRIu64, - cstat->cwnd); + set_pacing_rate(cstat); + + ngtcp2_log_infof(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, + "reduce cwnd because of packet loss cwnd=", cstat->cwnd); } void ngtcp2_cc_cubic_cc_on_spurious_congestion(ngtcp2_cc *cc, @@ -482,10 +540,12 @@ void ngtcp2_cc_cubic_cc_on_spurious_congestion(ngtcp2_cc *cc, cstat->cwnd = cubic->undo.cwnd; cstat->ssthresh = cubic->undo.ssthresh; - ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, - "spurious congestion is detected and congestion state is " - "restored cwnd=%" PRIu64, - cstat->cwnd); + set_pacing_rate(cstat); + + ngtcp2_log_infof(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, + "spurious congestion is detected and congestion state is " + "restored cwnd=", + cstat->cwnd); } cubic_vars_reset(&cubic->undo.v); @@ -499,17 +559,18 @@ void ngtcp2_cc_cubic_cc_on_persistent_congestion(ngtcp2_cc *cc, ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); (void)ts; - cubic_cc_reset(cubic); + cubic_cc_reset(cubic, cstat); cstat->cwnd = 2 * cstat->max_tx_udp_payload_size; cstat->congestion_recovery_start_ts = UINT64_MAX; + + set_pacing_rate(cstat); } void ngtcp2_cc_cubic_cc_reset(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts) { ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); - (void)cstat; (void)ts; - cubic_cc_reset(cubic); + cubic_cc_reset(cubic, cstat); } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.h index e4e19e1aa6b9..a19e90b1d0db 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.h @@ -88,11 +88,6 @@ typedef struct ngtcp2_cc_pkt { * acknowledged and lost bytes. */ typedef struct ngtcp2_cc_ack { - /** - * :member:`prior_bytes_in_flight` is the in-flight bytes before - * processing this ACK. - */ - uint64_t prior_bytes_in_flight; /** * :member:`bytes_delivered` is the number of bytes acknowledged. */ @@ -143,13 +138,16 @@ typedef void (*ngtcp2_cc_on_pkt_lost)(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, * @functypedef * * :type:`ngtcp2_cc_congestion_event` is a callback function which is - * called when congestion event happens (e.g., when packet is lost). - * |bytes_lost| is the number of bytes lost in this congestion event. + * called when congestion event happens (e.g., when packet is lost or + * due to ECN). |ack| contains information after ACK processing. + * This callback may be called from non-ACK processing context. In + * that case, the information only taken from |ack| processing has + * default values, like 0 or UINT64_MAX; */ typedef void (*ngtcp2_cc_congestion_event)(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, - uint64_t bytes_lost, + const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); /** @@ -186,20 +184,12 @@ typedef void (*ngtcp2_cc_on_ack_recv)(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, * @functypedef * * :type:`ngtcp2_cc_on_pkt_sent` is a callback function which is - * called when an ack-eliciting packet is sent. + * called when an ack-eliciting packet is sent. The lost, + * tx_in_flight, and is_app_limited fields in |pkt| are set to 0. */ typedef void (*ngtcp2_cc_on_pkt_sent)(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, const ngtcp2_cc_pkt *pkt); -/** - * @functypedef - * - * :type:`ngtcp2_cc_new_rtt_sample` is a callback function which is - * called when new RTT sample is obtained. - */ -typedef void (*ngtcp2_cc_new_rtt_sample)(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts); - /** * @functypedef * @@ -209,28 +199,6 @@ typedef void (*ngtcp2_cc_new_rtt_sample)(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, typedef void (*ngtcp2_cc_reset)(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); -/** - * @enum - * - * :type:`ngtcp2_cc_event_type` defines congestion control events. - */ -typedef enum ngtcp2_cc_event_type { - /** - * :enum:`NGTCP2_CC_EVENT_TX_START` occurs when ack-eliciting packet - * is sent and no other ack-eliciting packet is present. - */ - NGTCP2_CC_EVENT_TYPE_TX_START -} ngtcp2_cc_event_type; - -/** - * @functypedef - * - * :type:`ngtcp2_cc_event` is a callback function which is called when - * a specific event happens. - */ -typedef void (*ngtcp2_cc_event)(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - ngtcp2_cc_event_type event, ngtcp2_tstamp ts); - /** * @struct * @@ -254,7 +222,7 @@ typedef struct ngtcp2_cc { ngtcp2_cc_on_pkt_lost on_pkt_lost; /** * :member:`congestion_event` is a callback function which is called - * when congestion event happens (.e.g, packet is lost). + * when congestion event happens (e.g., packet is lost). */ ngtcp2_cc_congestion_event congestion_event; /** @@ -277,21 +245,11 @@ typedef struct ngtcp2_cc { * ack-eliciting packet is sent. */ ngtcp2_cc_on_pkt_sent on_pkt_sent; - /** - * :member:`new_rtt_sample` is a callback function which is called - * when new RTT sample is obtained. - */ - ngtcp2_cc_new_rtt_sample new_rtt_sample; /** * :member:`reset` is a callback function which is called when * congestion control state must be reset. */ ngtcp2_cc_reset reset; - /** - * :member:`event` is a callback function which is called when a - * specific event happens. - */ - ngtcp2_cc_event event; } ngtcp2_cc; /* @@ -310,14 +268,16 @@ typedef struct ngtcp2_cc_reno { uint64_t pending_add; } ngtcp2_cc_reno; -void ngtcp2_cc_reno_init(ngtcp2_cc_reno *reno, ngtcp2_log *log); +void ngtcp2_cc_reno_init(ngtcp2_cc_reno *reno, ngtcp2_log *log, + ngtcp2_conn_stat *cstat); void ngtcp2_cc_reno_cc_on_pkt_acked(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, const ngtcp2_cc_pkt *pkt, ngtcp2_tstamp ts); void ngtcp2_cc_reno_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, - uint64_t bytes_lost, ngtcp2_tstamp ts); + const ngtcp2_cc_ack *ack, + ngtcp2_tstamp ts); void ngtcp2_cc_reno_cc_on_persistent_congestion(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, @@ -340,8 +300,8 @@ typedef struct ngtcp2_cubic_vars { /* app_limited_duration is the cumulative duration where a connection is under app limited when ACK is received. */ ngtcp2_duration app_limited_duration; - uint64_t pending_bytes_delivered; - uint64_t pending_est_bytes_delivered; + uint64_t pending_bytes_acked; + uint64_t pending_est_bytes_acked; } ngtcp2_cubic_vars; /* ngtcp2_cc_cubic is CUBIC congestion controller. */ @@ -371,14 +331,15 @@ typedef struct ngtcp2_cc_cubic { } ngtcp2_cc_cubic; void ngtcp2_cc_cubic_init(ngtcp2_cc_cubic *cc, ngtcp2_log *log, - ngtcp2_rst *rst); + ngtcp2_conn_stat *cstat, ngtcp2_rst *rst); void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); void ngtcp2_cc_cubic_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, - uint64_t bytes_lost, ngtcp2_tstamp ts); + const ngtcp2_cc_ack *ack, + ngtcp2_tstamp ts); void ngtcp2_cc_cubic_cc_on_spurious_congestion(ngtcp2_cc *ccx, ngtcp2_conn_stat *cstat, diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.c index acbee78aaf43..4eba2aaca5d3 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.c @@ -29,8 +29,9 @@ #include "ngtcp2_path.h" #include "ngtcp2_str.h" +#include "ngtcp2_pkt.h" -void ngtcp2_cid_zero(ngtcp2_cid *cid) { memset(cid, 0, sizeof(*cid)); } +void ngtcp2_cid_zero(ngtcp2_cid *cid) { *cid = (ngtcp2_cid){0}; } void ngtcp2_cid_init(ngtcp2_cid *cid, const uint8_t *data, size_t datalen) { assert(datalen <= NGTCP2_MAX_CIDLEN); @@ -58,11 +59,13 @@ int ngtcp2_cid_less(const ngtcp2_cid *lhs, const ngtcp2_cid *rhs) { int ngtcp2_cid_empty(const ngtcp2_cid *cid) { return cid->datalen == 0; } void ngtcp2_scid_init(ngtcp2_scid *scid, uint64_t seq, const ngtcp2_cid *cid) { - scid->pe.index = NGTCP2_PQ_BAD_INDEX; - scid->seq = seq; - scid->cid = *cid; - scid->retired_ts = UINT64_MAX; - scid->flags = NGTCP2_SCID_FLAG_NONE; + *scid = (ngtcp2_scid){ + .pe.index = NGTCP2_PQ_BAD_INDEX, + .seq = seq, + .cid = *cid, + .retired_ts = UINT64_MAX, + .flags = NGTCP2_SCID_FLAG_NONE, + }; } void ngtcp2_scid_copy(ngtcp2_scid *dest, const ngtcp2_scid *src) { @@ -72,12 +75,12 @@ void ngtcp2_scid_copy(ngtcp2_scid *dest, const ngtcp2_scid *src) { } void ngtcp2_dcid_init(ngtcp2_dcid *dcid, uint64_t seq, const ngtcp2_cid *cid, - const uint8_t *token) { + const ngtcp2_stateless_reset_token *token) { dcid->seq = seq; dcid->cid = *cid; if (token) { - memcpy(dcid->token, token, NGTCP2_STATELESS_RESET_TOKENLEN); + dcid->token = *token; dcid->flags = NGTCP2_DCID_FLAG_TOKEN_PRESENT; } else { dcid->flags = NGTCP2_DCID_FLAG_NONE; @@ -91,11 +94,12 @@ void ngtcp2_dcid_init(ngtcp2_dcid *dcid, uint64_t seq, const ngtcp2_cid *cid, dcid->max_udp_payload_size = NGTCP2_MAX_UDP_PAYLOAD_SIZE; } -void ngtcp2_dcid_set_token(ngtcp2_dcid *dcid, const uint8_t *token) { +void ngtcp2_dcid_set_token(ngtcp2_dcid *dcid, + const ngtcp2_stateless_reset_token *token) { assert(token); dcid->flags |= NGTCP2_DCID_FLAG_TOKEN_PRESENT; - memcpy(dcid->token, token, NGTCP2_STATELESS_RESET_TOKENLEN); + dcid->token = *token; } void ngtcp2_dcid_set_path(ngtcp2_dcid *dcid, const ngtcp2_path *path) { @@ -104,7 +108,7 @@ void ngtcp2_dcid_set_path(ngtcp2_dcid *dcid, const ngtcp2_path *path) { void ngtcp2_dcid_copy(ngtcp2_dcid *dest, const ngtcp2_dcid *src) { ngtcp2_dcid_init(dest, src->seq, &src->cid, - (src->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) ? src->token + (src->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) ? &src->token : NULL); ngtcp2_path_copy(&dest->ps.path, &src->ps.path); dest->retired_ts = src->retired_ts; @@ -121,18 +125,19 @@ void ngtcp2_dcid_copy_cid_token(ngtcp2_dcid *dest, const ngtcp2_dcid *src) { if (src->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) { dest->flags |= NGTCP2_DCID_FLAG_TOKEN_PRESENT; - memcpy(dest->token, src->token, NGTCP2_STATELESS_RESET_TOKENLEN); + dest->token = src->token; } else if (dest->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) { dest->flags &= (uint8_t)~NGTCP2_DCID_FLAG_TOKEN_PRESENT; } } int ngtcp2_dcid_verify_uniqueness(const ngtcp2_dcid *dcid, uint64_t seq, - const ngtcp2_cid *cid, const uint8_t *token) { + const ngtcp2_cid *cid, + const ngtcp2_stateless_reset_token *token) { if (dcid->seq == seq) { return ngtcp2_cid_eq(&dcid->cid, cid) && (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) && - memcmp(dcid->token, token, NGTCP2_STATELESS_RESET_TOKENLEN) == 0 + ngtcp2_stateless_reset_token_eq(&dcid->token, token) ? 0 : NGTCP2_ERR_PROTO; } @@ -140,12 +145,12 @@ int ngtcp2_dcid_verify_uniqueness(const ngtcp2_dcid *dcid, uint64_t seq, return !ngtcp2_cid_eq(&dcid->cid, cid) ? 0 : NGTCP2_ERR_PROTO; } -int ngtcp2_dcid_verify_stateless_reset_token(const ngtcp2_dcid *dcid, - const ngtcp2_path *path, - const uint8_t *token) { +int ngtcp2_dcid_verify_stateless_reset_token( + const ngtcp2_dcid *dcid, const ngtcp2_path *path, + const ngtcp2_stateless_reset_token *token) { return ngtcp2_path_eq(&dcid->ps.path, path) && (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) && - ngtcp2_cmemeq(dcid->token, token, NGTCP2_STATELESS_RESET_TOKENLEN) + ngtcp2_cmemeq(dcid->token.data, token->data, sizeof(token->data)) ? 0 : NGTCP2_ERR_INVALID_ARGUMENT; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.h index 9321cfb64e6d..f4956b0bac0e 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.h @@ -35,13 +35,13 @@ #include "ngtcp2_path.h" /* NGTCP2_SCID_FLAG_NONE indicates that no flag is set. */ -#define NGTCP2_SCID_FLAG_NONE 0x00u +#define NGTCP2_SCID_FLAG_NONE 0x00U /* NGTCP2_SCID_FLAG_USED indicates that a local endpoint observed that a remote endpoint uses this particular Connection ID. */ -#define NGTCP2_SCID_FLAG_USED 0x01u +#define NGTCP2_SCID_FLAG_USED 0x01U /* NGTCP2_SCID_FLAG_RETIRED indicates that this particular Connection ID is retired. */ -#define NGTCP2_SCID_FLAG_RETIRED 0x02u +#define NGTCP2_SCID_FLAG_RETIRED 0x02U typedef struct ngtcp2_scid { ngtcp2_pq_entry pe; @@ -57,13 +57,13 @@ typedef struct ngtcp2_scid { } ngtcp2_scid; /* NGTCP2_DCID_FLAG_NONE indicates that no flag is set. */ -#define NGTCP2_DCID_FLAG_NONE 0x00u +#define NGTCP2_DCID_FLAG_NONE 0x00U /* NGTCP2_DCID_FLAG_PATH_VALIDATED indicates that an associated path has been validated. */ -#define NGTCP2_DCID_FLAG_PATH_VALIDATED 0x01u +#define NGTCP2_DCID_FLAG_PATH_VALIDATED 0x01U /* NGTCP2_DCID_FLAG_TOKEN_PRESENT indicates that a stateless reset token is set in token field. */ -#define NGTCP2_DCID_FLAG_TOKEN_PRESENT 0x02u +#define NGTCP2_DCID_FLAG_TOKEN_PRESENT 0x02U typedef struct ngtcp2_dcid { /* seq is the sequence number associated to the Connection ID. */ @@ -93,7 +93,7 @@ typedef struct ngtcp2_dcid { /* token is a stateless reset token received along with this Connection ID. The stateless reset token is tied to the connection, not to the particular Connection ID. */ - uint8_t token[NGTCP2_STATELESS_RESET_TOKENLEN]; + ngtcp2_stateless_reset_token token; } ngtcp2_dcid; /* ngtcp2_cid_zero makes |cid| zero-length. */ @@ -123,17 +123,18 @@ void ngtcp2_scid_copy(ngtcp2_scid *dest, const ngtcp2_scid *src); /* * ngtcp2_dcid_init initializes |dcid| with the given parameters. If - * |token| is NULL, the function fills dcid->token with 0. |token| - * must be NGTCP2_STATELESS_RESET_TOKENLEN bytes long. + * |token| is not NULL, the function sets + * NGTCP2_DCID_FLAG_TOKEN_PRESENT flag. */ void ngtcp2_dcid_init(ngtcp2_dcid *dcid, uint64_t seq, const ngtcp2_cid *cid, - const uint8_t *token); + const ngtcp2_stateless_reset_token *token); /* * ngtcp2_dcid_set_token sets |token| to |dcid|. |token| must not be - * NULL, and must be NGTCP2_STATELESS_RESET_TOKENLEN bytes long. + * NULL. */ -void ngtcp2_dcid_set_token(ngtcp2_dcid *dcid, const uint8_t *token); +void ngtcp2_dcid_set_token(ngtcp2_dcid *dcid, + const ngtcp2_stateless_reset_token *token); /* * ngtcp2_dcid_set_path sets |path| to |dcid|. It sets @@ -160,7 +161,8 @@ void ngtcp2_dcid_copy_cid_token(ngtcp2_dcid *dest, const ngtcp2_dcid *src); * |token|) tuple against |dcid|. */ int ngtcp2_dcid_verify_uniqueness(const ngtcp2_dcid *dcid, uint64_t seq, - const ngtcp2_cid *cid, const uint8_t *token); + const ngtcp2_cid *cid, + const ngtcp2_stateless_reset_token *token); /* * ngtcp2_dcid_verify_stateless_reset_token verifies stateless reset @@ -172,9 +174,9 @@ int ngtcp2_dcid_verify_uniqueness(const ngtcp2_dcid *dcid, uint64_t seq, * NGTCP2_ERR_INVALID_ARGUMENT * Tokens do not match; or |dcid| does not contain a token. */ -int ngtcp2_dcid_verify_stateless_reset_token(const ngtcp2_dcid *dcid, - const ngtcp2_path *path, - const uint8_t *token); +int ngtcp2_dcid_verify_stateless_reset_token( + const ngtcp2_dcid *dcid, const ngtcp2_path *path, + const ngtcp2_stateless_reset_token *token); /* TODO It might be performance win if we store congestion state in this entry, and restore it when migrate back to this path. */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c index d97ba6a71b25..12cca44b07e5 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c @@ -42,6 +42,7 @@ #include "ngtcp2_callbacks.h" #include "ngtcp2_tstamp.h" #include "ngtcp2_frame_chain.h" +#include "ngtcp2_conn_info.h" /* NGTCP2_FLOW_WINDOW_RTT_FACTOR is the factor of RTT when flow control window auto-tuning is triggered. */ @@ -57,13 +58,23 @@ are not processed. */ #define NGTCP2_MAX_ACK_PER_PKT 1 +/* NGTCP2_MAX_INITIAL_CRYPTO_OFFSET is the maximum offset of CRYPTO + data at Initial encryption level. */ +#define NGTCP2_MAX_INITIAL_CRYPTO_OFFSET (64 * 1024) +/* NGTCP2_MAX_HANDSHAKE_CRYPTO_OFFSET is the maximum offset of CRYPTO + data at Handshake encryption level. */ +#define NGTCP2_MAX_HANDSHAKE_CRYPTO_OFFSET (64 * 1024) +/* NGTCP2_MAX_1RTT_CRYPTO_OFFSET is the maximum offset of CRYPTO data + at 1RTT encryption level. */ +#define NGTCP2_MAX_1RTT_CRYPTO_OFFSET (256 * 1024) + ngtcp2_objalloc_def(strm, ngtcp2_strm, oplent) /* * conn_local_stream returns nonzero if |stream_id| indicates that it * is the stream initiated by local endpoint. */ -static int conn_local_stream(ngtcp2_conn *conn, int64_t stream_id) { +static int conn_local_stream(const ngtcp2_conn *conn, int64_t stream_id) { return (uint8_t)(stream_id & 1) == conn->server; } @@ -85,7 +96,7 @@ static void conn_update_timestamp(ngtcp2_conn *conn, ngtcp2_tstamp ts) { * conn_is_tls_handshake_completed returns nonzero if TLS handshake * has completed and 1 RTT keys are available. */ -static int conn_is_tls_handshake_completed(ngtcp2_conn *conn) { +static int conn_is_tls_handshake_completed(const ngtcp2_conn *conn) { return (conn->flags & NGTCP2_CONN_FLAG_TLS_HANDSHAKE_COMPLETED) && conn->pktns.crypto.rx.ckm && conn->pktns.crypto.tx.ckm; } @@ -181,12 +192,43 @@ static int conn_call_stream_open(ngtcp2_conn *conn, ngtcp2_strm *strm) { static int conn_call_stream_close(ngtcp2_conn *conn, ngtcp2_strm *strm) { int rv; - uint32_t flags = NGTCP2_STREAM_CLOSE_FLAG_NONE; + uint32_t flags; + uint64_t rx_app_error_code; + + if (conn->callbacks.stream_close2) { + flags = NGTCP2_STREAM_CLOSE2_FLAG_NONE; + + if (strm->flags & NGTCP2_STRM_FLAG_TX_STOP_SENDING_APP_ERROR_CODE_SET) { + flags |= NGTCP2_STREAM_CLOSE2_FLAG_RX_APP_ERROR_CODE_SET; + rx_app_error_code = strm->tx.stop_sending_app_error_code; + } else if (strm->flags & NGTCP2_STRM_FLAG_RX_APP_ERROR_CODE_SET) { + flags |= NGTCP2_STREAM_CLOSE2_FLAG_RX_APP_ERROR_CODE_SET; + rx_app_error_code = strm->rx.app_error_code; + } else { + rx_app_error_code = 0; + } + + if (strm->flags & NGTCP2_STRM_FLAG_TX_RESET_STREAM_APP_ERROR_CODE_SET) { + flags |= NGTCP2_STREAM_CLOSE2_FLAG_TX_APP_ERROR_CODE_SET; + } + + rv = conn->callbacks.stream_close2(conn, flags, strm->stream_id, + rx_app_error_code, + strm->tx.reset_stream_app_error_code, + conn->user_data, strm->stream_user_data); + if (rv != 0) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; + } if (!conn->callbacks.stream_close) { return 0; } + flags = NGTCP2_STREAM_CLOSE_FLAG_NONE; + if (strm->flags & NGTCP2_STRM_FLAG_APP_ERROR_CODE_SET) { flags |= NGTCP2_STREAM_CLOSE_FLAG_APP_ERROR_CODE_SET; } @@ -219,6 +261,24 @@ static int conn_call_stream_reset(ngtcp2_conn *conn, int64_t stream_id, return 0; } +static int conn_call_recv_stop_sending(ngtcp2_conn *conn, int64_t stream_id, + uint64_t app_error_code, + void *stream_user_data) { + int rv; + + if (!conn->callbacks.recv_stop_sending) { + return 0; + } + + rv = conn->callbacks.recv_stop_sending(conn, stream_id, app_error_code, + conn->user_data, stream_user_data); + if (rv != 0) { + return NGTCP2_ERR_CALLBACK_FAILURE; + } + + return 0; +} + static int conn_call_extend_max_local_streams_bidi(ngtcp2_conn *conn, uint64_t max_streams) { int rv; @@ -254,13 +314,20 @@ static int conn_call_extend_max_local_streams_uni(ngtcp2_conn *conn, } static int conn_call_get_new_connection_id(ngtcp2_conn *conn, ngtcp2_cid *cid, - uint8_t *token, size_t cidlen) { + ngtcp2_stateless_reset_token *token, + size_t cidlen) { int rv; - assert(conn->callbacks.get_new_connection_id); + if (conn->callbacks.get_new_connection_id2) { + rv = conn->callbacks.get_new_connection_id2(conn, cid, token, cidlen, + conn->user_data); + } else { + assert(conn->callbacks.get_new_connection_id); + + rv = conn->callbacks.get_new_connection_id(conn, cid, token->data, cidlen, + conn->user_data); + } - rv = conn->callbacks.get_new_connection_id(conn, cid, token, cidlen, - conn->user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -423,14 +490,20 @@ static int conn_call_dcid_status(ngtcp2_conn *conn, const ngtcp2_dcid *dcid) { int rv; - if (!conn->callbacks.dcid_status) { + if (conn->callbacks.dcid_status2) { + rv = conn->callbacks.dcid_status2( + conn, type, dcid->seq, &dcid->cid, + (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) ? &dcid->token : NULL, + conn->user_data); + } else if (conn->callbacks.dcid_status) { + rv = conn->callbacks.dcid_status( + conn, type, dcid->seq, &dcid->cid, + (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) ? dcid->token.data : NULL, + conn->user_data); + } else { return 0; } - rv = conn->callbacks.dcid_status( - conn, type, dcid->seq, &dcid->cid, - (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) ? dcid->token : NULL, - conn->user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -503,12 +576,19 @@ static int conn_call_client_initial(ngtcp2_conn *conn) { return 0; } -static int conn_call_get_path_challenge_data(ngtcp2_conn *conn, uint8_t *data) { +static int conn_call_get_path_challenge_data(ngtcp2_conn *conn, + ngtcp2_path_challenge_data *data) { int rv; - assert(conn->callbacks.get_path_challenge_data); + if (conn->callbacks.get_path_challenge_data2) { + rv = conn->callbacks.get_path_challenge_data2(conn, data, conn->user_data); + } else { + assert(conn->callbacks.get_path_challenge_data); + + rv = conn->callbacks.get_path_challenge_data(conn, data->data, + conn->user_data); + } - rv = conn->callbacks.get_path_challenge_data(conn, data, conn->user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -549,14 +629,24 @@ static int conn_call_recv_retry(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd) { static int conn_call_recv_stateless_reset(ngtcp2_conn *conn, - const ngtcp2_pkt_stateless_reset *sr) { + const ngtcp2_pkt_stateless_reset2 *sr) { int rv; + ngtcp2_pkt_stateless_reset legacy_sr; - if (!conn->callbacks.recv_stateless_reset) { + if (conn->callbacks.recv_stateless_reset2) { + rv = conn->callbacks.recv_stateless_reset2(conn, sr, conn->user_data); + } else if (conn->callbacks.recv_stateless_reset) { + memcpy(legacy_sr.stateless_reset_token, sr->token.data, + sizeof(legacy_sr.stateless_reset_token)); + legacy_sr.rand = sr->rand; + legacy_sr.randlen = sr->randlen; + + rv = + conn->callbacks.recv_stateless_reset(conn, &legacy_sr, conn->user_data); + } else { return 0; } - rv = conn->callbacks.recv_stateless_reset(conn, sr, conn->user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -696,8 +786,10 @@ static int conn_call_recv_tx_key(ngtcp2_conn *conn, return 0; } -// pktns_init initializes |pktns|. It assumes that the object pointed -// by |pktns| is zero-cleared. +/* + * pktns_init initializes |pktns|. It assumes that the object pointed + * by |pktns| is zero-cleared. + */ static void pktns_init(ngtcp2_pktns *pktns, ngtcp2_pktns_id pktns_id, ngtcp2_rst *rst, ngtcp2_cc *cc, int64_t initial_pkt_num, ngtcp2_log *log, ngtcp2_qlog *qlog, @@ -821,7 +913,7 @@ static void conn_reset_conn_stat_cc(ngtcp2_conn *conn, cstat->pto_count = 0; cstat->loss_detection_timer = UINT64_MAX; cstat->max_tx_udp_payload_size = - ngtcp2_conn_get_path_max_tx_udp_payload_size(conn); + ngtcp2_conn_get_path_max_tx_udp_payload_size2(conn); cstat->cwnd = ngtcp2_cc_compute_initcwnd(cstat->max_tx_udp_payload_size); cstat->ssthresh = UINT64_MAX; cstat->congestion_recovery_start_ts = UINT64_MAX; @@ -837,8 +929,8 @@ static void conn_reset_conn_stat_cc(ngtcp2_conn *conn, */ static void reset_conn_stat_recovery(ngtcp2_conn_stat *cstat) { /* Initializes them with UINT64_MAX. */ - memset(cstat->loss_time, 0xff, sizeof(cstat->loss_time)); - memset(cstat->last_tx_pkt_ts, 0xff, sizeof(cstat->last_tx_pkt_ts)); + memset(cstat->loss_time, 0xFF, sizeof(cstat->loss_time)); + memset(cstat->last_tx_pkt_ts, 0xFF, sizeof(cstat->last_tx_pkt_ts)); } /* @@ -865,15 +957,15 @@ static void delete_scid(ngtcp2_ksl *scids, const ngtcp2_mem *mem) { static ngtcp2_duration compute_pto(ngtcp2_duration smoothed_rtt, ngtcp2_duration rttvar, ngtcp2_duration max_ack_delay) { - ngtcp2_duration var = ngtcp2_max_uint64(4 * rttvar, NGTCP2_GRANULARITY); + ngtcp2_duration var = ngtcp2_max(4 * rttvar, NGTCP2_GRANULARITY); return smoothed_rtt + var + max_ack_delay; } /* * conn_compute_initial_pto computes PTO using the initial RTT. */ -static ngtcp2_duration conn_compute_initial_pto(ngtcp2_conn *conn, - ngtcp2_pktns *pktns) { +static ngtcp2_duration conn_compute_initial_pto(const ngtcp2_conn *conn, + const ngtcp2_pktns *pktns) { ngtcp2_duration initial_rtt = conn->local.settings.initial_rtt; ngtcp2_duration max_ack_delay; @@ -886,12 +978,9 @@ static ngtcp2_duration conn_compute_initial_pto(ngtcp2_conn *conn, return compute_pto(initial_rtt, initial_rtt / 2, max_ack_delay); } -/* - * conn_compute_pto computes the current PTO. - */ -static ngtcp2_duration conn_compute_pto(ngtcp2_conn *conn, - ngtcp2_pktns *pktns) { - ngtcp2_conn_stat *cstat = &conn->cstat; +ngtcp2_duration ngtcp2_conn_compute_pto(const ngtcp2_conn *conn, + const ngtcp2_pktns *pktns) { + const ngtcp2_conn_stat *cstat = &conn->cstat; ngtcp2_duration max_ack_delay; if (pktns->id == NGTCP2_PKTNS_ID_APPLICATION && @@ -903,28 +992,23 @@ static ngtcp2_duration conn_compute_pto(ngtcp2_conn *conn, return compute_pto(cstat->smoothed_rtt, cstat->rttvar, max_ack_delay); } -ngtcp2_duration ngtcp2_conn_compute_pto(ngtcp2_conn *conn, - ngtcp2_pktns *pktns) { - return conn_compute_pto(conn, pktns); -} - /* * conn_compute_pv_timeout_pto returns path validation timeout using * the given |pto|. */ -static ngtcp2_duration conn_compute_pv_timeout_pto(ngtcp2_conn *conn, +static ngtcp2_duration conn_compute_pv_timeout_pto(const ngtcp2_conn *conn, ngtcp2_duration pto) { ngtcp2_duration initial_pto = conn_compute_initial_pto(conn, &conn->pktns); - return 3 * ngtcp2_max_uint64(pto, initial_pto); + return 3 * ngtcp2_max(pto, initial_pto); } /* * conn_compute_pv_timeout returns path validation timeout. */ -static ngtcp2_duration conn_compute_pv_timeout(ngtcp2_conn *conn) { - return conn_compute_pv_timeout_pto(conn, - conn_compute_pto(conn, &conn->pktns)); +static ngtcp2_duration conn_compute_pv_timeout(const ngtcp2_conn *conn) { + return conn_compute_pv_timeout_pto( + conn, ngtcp2_conn_compute_pto(conn, &conn->pktns)); } static void conn_handle_tx_ecn(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, @@ -959,7 +1043,7 @@ static void conn_handle_tx_ecn(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, conn->tx.ecn.validation_start_ts = ts; } else if (ts - conn->tx.ecn.validation_start_ts >= - 3 * conn_compute_pto(conn, pktns)) { + 3 * ngtcp2_conn_compute_pto(conn, pktns)) { conn->tx.ecn.state = NGTCP2_ECN_STATE_UNKNOWN; break; } @@ -1069,13 +1153,13 @@ static void conn_update_skip_pkt(ngtcp2_conn *conn, ngtcp2_pktns *pktns) { conn->callbacks.rand(&r, 1, &conn->local.settings.rand_ctx); - if (1ll << pktns->tx.skip_pkt.exponent > + if (1LL << pktns->tx.skip_pkt.exponent > (NGTCP2_MAX_PKT_NUM - min_gap) / ((int64_t)r + 1)) { pktns->tx.skip_pkt.next_pkt_num = INT64_MAX; return; } - gap = ((int64_t)r + 1) * (1ll << pktns->tx.skip_pkt.exponent++) + min_gap; + gap = ((int64_t)r + 1) * (1LL << pktns->tx.skip_pkt.exponent++) + min_gap; if (pktns->tx.last_pkt_num > NGTCP2_MAX_PKT_NUM - gap) { pktns->tx.skip_pkt.next_pkt_num = INT64_MAX; @@ -1084,8 +1168,8 @@ static void conn_update_skip_pkt(ngtcp2_conn *conn, ngtcp2_pktns *pktns) { pktns->tx.skip_pkt.next_pkt_num = pktns->tx.last_pkt_num + gap; - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "next skip pkn=%" PRId64, - pktns->tx.skip_pkt.next_pkt_num); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_CON, + "next skip pkn=", pktns->tx.skip_pkt.next_pkt_num); } static int conn_handle_skip_pkt(ngtcp2_conn *conn, ngtcp2_pktns *pktns, @@ -1126,11 +1210,11 @@ static int conn_handle_skip_pkt(ngtcp2_conn *conn, ngtcp2_pktns *pktns, } static size_t buflen_align(size_t buflen) { - return (buflen + 0x7) & (size_t)~0x7; + return (buflen + 0x7U) & ~(size_t)0x7U; } static void *buf_align(void *buf) { - return (void *)((uintptr_t)((uint8_t *)buf + 0x7) & (uintptr_t)~0x7); + return (void *)((uintptr_t)((uint8_t *)buf + 0x7U) & ~(uintptr_t)0x7U); } static void *buf_advance(void *buf, size_t n) { return (uint8_t *)buf + n; } @@ -1145,7 +1229,7 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_mem *mem, void *user_data, int server) { int rv; ngtcp2_scid *scident; - void *buf, *tokenbuf; + void *buf, *tokenbuf, *logbuf; size_t buflen; uint8_t fixed_bit_byte; size_t i; @@ -1165,8 +1249,8 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, assert(settings->max_window <= NGTCP2_MAX_VARINT); assert(settings->max_stream_window <= NGTCP2_MAX_VARINT); - assert(settings->max_tx_udp_payload_size); - assert(settings->max_tx_udp_payload_size <= NGTCP2_HARD_MAX_UDP_PAYLOAD_SIZE); + assert(settings->max_tx_udp_payload_size >= NGTCP2_MAX_UDP_PAYLOAD_SIZE); + assert(settings->max_tx_udp_payload_size <= NGTCP2_MAX_TX_UDP_PAYLOAD_SIZE); assert(settings->initial_pkt_num <= INT32_MAX); assert(settings->initial_rtt); assert(params->active_connection_id_limit >= @@ -1193,15 +1277,17 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, assert(callbacks->hp_mask); assert(server || callbacks->recv_retry); assert(callbacks->rand); - assert(callbacks->get_new_connection_id); + assert(callbacks->get_new_connection_id2 || callbacks->get_new_connection_id); assert(callbacks->update_key); assert(callbacks->delete_crypto_aead_ctx); assert(callbacks->delete_crypto_cipher_ctx); - assert(callbacks->get_path_challenge_data); + assert(callbacks->get_path_challenge_data2 || + callbacks->get_path_challenge_data); assert(!server || !ngtcp2_is_reserved_version(client_chosen_version)); for (i = 0; i < settings->pmtud_probeslen; ++i) { assert(settings->pmtud_probes[i] > NGTCP2_MAX_UDP_PAYLOAD_SIZE); + assert(settings->pmtud_probes[i] <= NGTCP2_MAX_TX_UDP_PAYLOAD_SIZE); } if (mem == NULL) { @@ -1240,6 +1326,11 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, buflen += sizeof(client_chosen_version); } + if (settings->log_write || settings->log_printf) { + buflen = buflen_align(buflen); + buflen += NGTCP2_LOG_BUFLEN; + } + buf = ngtcp2_mem_calloc(mem, 1, buflen); if (buf == NULL) { return NGTCP2_ERR_NOMEM; @@ -1277,8 +1368,18 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, ngtcp2_static_ringbuf_path_challenge_init(&(*pconn)->rx.path_challenge); - ngtcp2_log_init(&(*pconn)->log, scid, settings->log_printf, - settings->initial_ts, user_data); + if (settings->log_write || settings->log_printf) { + buf = buf_align(buf); + logbuf = (char *)buf; + buf = buf_advance(buf, NGTCP2_LOG_BUFLEN); + } else { + logbuf = NULL; + } + + ngtcp2_log_init(&(*pconn)->log, scid, settings->log_write, + settings->log_printf, logbuf, settings->initial_ts, + user_data); + ngtcp2_qlog_init(&(*pconn)->qlog, settings->qlog_write, settings->initial_ts, user_data); if ((*pconn)->qlog.write) { @@ -1334,11 +1435,12 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, switch (settings->cc_algo) { case NGTCP2_CC_ALGO_RENO: - ngtcp2_cc_reno_init(&(*pconn)->reno, &(*pconn)->log); + ngtcp2_cc_reno_init(&(*pconn)->reno, &(*pconn)->log, &(*pconn)->cstat); break; case NGTCP2_CC_ALGO_CUBIC: - ngtcp2_cc_cubic_init(&(*pconn)->cubic, &(*pconn)->log, &(*pconn)->rst); + ngtcp2_cc_cubic_init(&(*pconn)->cubic, &(*pconn)->log, &(*pconn)->cstat, + &(*pconn)->rst); break; case NGTCP2_CC_ALGO_BBR: @@ -1522,6 +1624,8 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, fail_token: ngtcp2_mem_free(mem, *pconn); + *pconn = NULL; + return rv; } @@ -1549,6 +1653,8 @@ int ngtcp2_conn_client_new_versioned( rv = ngtcp2_conn_commit_local_transport_params(*pconn); if (rv != 0) { ngtcp2_conn_del(*pconn); + *pconn = NULL; + return rv; } @@ -1588,9 +1694,10 @@ int ngtcp2_conn_server_new_versioned( * the given stream. Both connection and stream level flow control * credits are considered. */ -static uint64_t conn_fc_credits(ngtcp2_conn *conn, ngtcp2_strm *strm) { - return ngtcp2_min_uint64(strm->tx.max_offset - strm->tx.offset, - conn->tx.max_offset - conn->tx.offset); +static uint64_t conn_fc_credits(const ngtcp2_conn *conn, + const ngtcp2_strm *strm) { + return ngtcp2_min(strm->tx.max_offset - strm->tx.offset, + conn->tx.max_offset - conn->tx.offset); } /* @@ -1598,10 +1705,11 @@ static uint64_t conn_fc_credits(ngtcp2_conn *conn, ngtcp2_strm *strm) { * sent to the given stream. |len| might be shorted because of * available flow control credits. */ -static uint64_t conn_enforce_flow_control(ngtcp2_conn *conn, ngtcp2_strm *strm, +static uint64_t conn_enforce_flow_control(const ngtcp2_conn *conn, + const ngtcp2_strm *strm, uint64_t len) { uint64_t fc_credits = conn_fc_credits(conn, strm); - return ngtcp2_min_uint64(len, fc_credits); + return ngtcp2_min(len, fc_credits); } static int delete_strms_each(void *data, void *ptr) { @@ -1740,10 +1848,10 @@ void ngtcp2_conn_del(ngtcp2_conn *conn) { * conn_compute_ack_delay computes ACK delay for outgoing protected * ACK. */ -static ngtcp2_duration conn_compute_ack_delay(ngtcp2_conn *conn) { - return ngtcp2_min_uint64( +static ngtcp2_duration conn_compute_ack_delay(const ngtcp2_conn *conn) { + return ngtcp2_min( conn->local.transport_params.max_ack_delay, - ngtcp2_max_uint64(conn->cstat.smoothed_rtt / 8, NGTCP2_NANOSECONDS)); + ngtcp2_max(conn->cstat.smoothed_rtt / 8, NGTCP2_NANOSECONDS)); } /* @@ -1806,8 +1914,18 @@ static int conn_ppe_write_frame(ngtcp2_conn *conn, ngtcp2_ppe *ppe, static int conn_on_pkt_sent(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_rtb_entry *ent) { ngtcp2_rtb *rtb = &pktns->rtb; + ngtcp2_cc_pkt cc_pkt; int rv; + if ((ent->flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) && + conn->cc.on_pkt_sent) { + conn->cc.on_pkt_sent( + &conn->cc, &conn->cstat, + ngtcp2_cc_pkt_init(&cc_pkt, ent->hd.pkt_num, ent->pktlen, pktns->id, + ent->ts, /* lost = */ 0, + /* tx_in_flight = */ 0, /* is_app_limited = */ 0)); + } + /* This function implements OnPacketSent, but it handles only non-ACK-only packet. */ rv = ngtcp2_rtb_add(rtb, ent, &conn->cstat); @@ -1830,9 +1948,9 @@ static int conn_on_pkt_sent(ngtcp2_conn *conn, ngtcp2_pktns *pktns, * number. It returns the number of bytes to encode the packet * number. */ -static size_t pktns_select_pkt_numlen(ngtcp2_pktns *pktns) { +static size_t pktns_select_pkt_numlen(const ngtcp2_pktns *pktns) { int64_t pkt_num = pktns->tx.last_pkt_num + 1; - ngtcp2_rtb *rtb = &pktns->rtb; + const ngtcp2_rtb *rtb = &pktns->rtb; int64_t n = pkt_num - rtb->largest_acked_tx_pkt_num; if (NGTCP2_MAX_PKT_NUM / 2 < n) { @@ -1841,13 +1959,13 @@ static size_t pktns_select_pkt_numlen(ngtcp2_pktns *pktns) { n = n * 2 - 1; - if (n > 0xffffff) { + if (n > 0xFFFFFF) { return 4; } - if (n > 0xffff) { + if (n > 0xFFFF) { return 3; } - if (n > 0xff) { + if (n > 0xFF) { return 2; } return 1; @@ -1857,14 +1975,14 @@ static size_t pktns_select_pkt_numlen(ngtcp2_pktns *pktns) { * conn_cwnd_is_zero returns nonzero if the number of bytes the local * endpoint can sent at this time is zero. */ -static int conn_cwnd_is_zero(ngtcp2_conn *conn) { +static int conn_cwnd_is_zero(const ngtcp2_conn *conn) { uint64_t bytes_in_flight = conn->cstat.bytes_in_flight; uint64_t cwnd = conn->cstat.cwnd; if (bytes_in_flight >= cwnd) { - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_LDC, - "cwnd limited bytes_in_flight=%lu cwnd=%lu", - bytes_in_flight, cwnd); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_LDC, + "cwnd limited bytes_in_flight=", bytes_in_flight, + " cwnd=", cwnd); } return bytes_in_flight >= cwnd; @@ -1898,7 +2016,7 @@ static uint64_t conn_retry_early_payloadlen(ngtcp2_conn *conn) { /* Take the min because in conn_should_pad_pkt we take max in order to deal with unbreakable DATAGRAM. */ - return ngtcp2_min_uint64(len, NGTCP2_MIN_COALESCED_PAYLOADLEN); + return ngtcp2_min(len, NGTCP2_MIN_COALESCED_PAYLOADLEN); } return 0; @@ -1955,15 +2073,25 @@ static int conn_verify_dcid(ngtcp2_conn *conn, int *pnew_cid_used, return 0; } +static int conn_can_send_next_pkt(const ngtcp2_conn *conn, size_t left, + uint64_t min_payloadlen) { + /* TODO the next packet type should be taken into account */ + return left >= + /* TODO Assuming that pkt_num is encoded in 1 byte. */ + NGTCP2_MIN_LONG_HEADERLEN + conn->dcid.current.cid.datalen + + conn->oscid.datalen + NGTCP2_PKT_LENGTHLEN - 1 + min_payloadlen + + NGTCP2_MAX_AEAD_OVERHEAD; +} + /* * conn_should_pad_pkt returns nonzero if the packet should be padded. * |type| is the type of packet. |left| is the space left in packet * buffer. |write_datalen| is the number of bytes which will be sent * in the next, coalesced 0-RTT packet. */ -static int conn_should_pad_pkt(ngtcp2_conn *conn, uint8_t type, size_t left, - uint64_t write_datalen, int ack_eliciting, - int require_padding) { +static int conn_should_pad_pkt(const ngtcp2_conn *conn, uint8_t type, + size_t left, uint64_t write_datalen, + int ack_eliciting, int require_padding) { uint64_t min_payloadlen; if (type == NGTCP2_PKT_INITIAL) { @@ -1996,31 +2124,35 @@ static int conn_should_pad_pkt(ngtcp2_conn *conn, uint8_t type, size_t left, PADDING in that packet. Take maximum in case that write_datalen includes DATAGRAM which cannot be split. */ min_payloadlen = - ngtcp2_max_uint64(write_datalen, NGTCP2_MIN_COALESCED_PAYLOADLEN); + ngtcp2_max(write_datalen, NGTCP2_MIN_COALESCED_PAYLOADLEN); } else { return 1; } } - } else { - assert(type == NGTCP2_PKT_HANDSHAKE); - if (!require_padding) { - return 0; - } + return !conn_can_send_next_pkt(conn, left, min_payloadlen); + } - if (!conn->pktns.crypto.tx.ckm) { - return 1; - } + assert(type == NGTCP2_PKT_HANDSHAKE); - min_payloadlen = NGTCP2_MIN_COALESCED_PAYLOADLEN; + if (!require_padding) { + /* If we have 1RTT key, pad this Handshake packet so that the next + 1RTT packet can be squeezed into the same GSO buffer. */ + return conn->pktns.crypto.tx.ckm && + !conn_can_send_next_pkt(conn, left, NGTCP2_MIN_COALESCED_PAYLOADLEN); } - /* TODO the next packet type should be taken into account */ - return left < - /* TODO Assuming that pkt_num is encoded in 1 byte. */ - NGTCP2_MIN_LONG_HEADERLEN + conn->dcid.current.cid.datalen + - conn->oscid.datalen + NGTCP2_PKT_LENGTHLEN - 1 + min_payloadlen + - NGTCP2_MAX_AEAD_OVERHEAD; + if (!conn->pktns.crypto.tx.ckm) { + return 1; + } + + /* We might send Handshake packet even if exceeding CWND. In that + case, we do not write non-probe 1RTT packet. */ + if (conn_cwnd_is_zero(conn) && conn->pktns.rtb.probe_pkt_left == 0) { + return 1; + } + + return !conn_can_send_next_pkt(conn, left, NGTCP2_MIN_COALESCED_PAYLOADLEN); } static void conn_restart_timer_on_write(ngtcp2_conn *conn, ngtcp2_tstamp ts) { @@ -2036,7 +2168,7 @@ static void conn_restart_timer_on_read(ngtcp2_conn *conn, ngtcp2_tstamp ts) { /* * conn_keep_alive_enabled returns nonzero if keep-alive is enabled. */ -static int conn_keep_alive_enabled(ngtcp2_conn *conn) { +static int conn_keep_alive_enabled(const ngtcp2_conn *conn) { return conn->keep_alive.last_ts != UINT64_MAX && conn->keep_alive.timeout != UINT64_MAX; } @@ -2045,7 +2177,7 @@ static int conn_keep_alive_enabled(ngtcp2_conn *conn) { * conn_keep_alive_expired returns nonzero if keep-alive timer has * expired. */ -static int conn_keep_alive_expired(ngtcp2_conn *conn, ngtcp2_tstamp ts) { +static int conn_keep_alive_expired(const ngtcp2_conn *conn, ngtcp2_tstamp ts) { return ngtcp2_tstamp_elapsed(conn->keep_alive.last_ts, conn->keep_alive.timeout, ts); } @@ -2053,7 +2185,7 @@ static int conn_keep_alive_expired(ngtcp2_conn *conn, ngtcp2_tstamp ts) { /* * conn_keep_alive_expiry returns the expiry time of keep-alive timer. */ -static ngtcp2_tstamp conn_keep_alive_expiry(ngtcp2_conn *conn) { +static ngtcp2_tstamp conn_keep_alive_expiry(const ngtcp2_conn *conn) { if ((conn->flags & NGTCP2_CONN_FLAG_KEEP_ALIVE_CANCELLED) || !(conn->flags & NGTCP2_CONN_FLAG_HANDSHAKE_COMPLETED) || !conn_keep_alive_enabled(conn) || @@ -2127,7 +2259,7 @@ static int conn_pacing_pkt_tx_allowed(ngtcp2_conn *conn, ngtcp2_tstamp ts) { return 1; } -static uint8_t conn_pkt_flags(ngtcp2_conn *conn) { +static uint8_t conn_pkt_flags(const ngtcp2_conn *conn) { if (conn->remote.transport_params && conn->remote.transport_params->grease_quic_bit && (conn->flags & NGTCP2_CONN_FLAG_CLEAR_FIXED_BIT)) { @@ -2137,11 +2269,11 @@ static uint8_t conn_pkt_flags(ngtcp2_conn *conn) { return NGTCP2_PKT_FLAG_NONE; } -static uint8_t conn_pkt_flags_long(ngtcp2_conn *conn) { +static uint8_t conn_pkt_flags_long(const ngtcp2_conn *conn) { return NGTCP2_PKT_FLAG_LONG_FORM | conn_pkt_flags(conn); } -static uint8_t conn_pkt_flags_short(ngtcp2_conn *conn) { +static uint8_t conn_pkt_flags_short(const ngtcp2_conn *conn) { return (uint8_t)(conn_pkt_flags(conn) | ((conn->pktns.crypto.tx.ckm->flags & NGTCP2_CRYPTO_KM_FLAG_KEY_PHASE_ONE) ? NGTCP2_PKT_FLAG_KEY_PHASE @@ -2149,18 +2281,14 @@ static uint8_t conn_pkt_flags_short(ngtcp2_conn *conn) { } /* - * conn_cut_crypto_frame splits (*pfrc)->fr.stream by removing - * |removed_data| from (*pfrc)->fr.stream.data[0]. - * (*pfrc)->fr.stream.data[0] must contain |removed_data|, and - * (*pfrc)->fr.stream.datacnt >= 1. New ngtcp2_frame_chain object - * that contains |removed_data| is created, and pushed to - * |crypto_strm| via ngtcp2_strm_streamfrq_push. Because - * (*pfrc)->fr.stream.datacnt cannot be changed, if it is not 1, new - * ngtcp2_frame_chain object is created to contain the data before - * |removed_data|. Then *pfrc is deleted, and the newly created - * object is assigned to *pfrc instead. If there are data following - * the removed part of data, new ngtcp2_frame_chain object is created - * for it, and (*pfrc)->next points to the object. + * conn_cut_crypto_frame splits frc->fr.stream by removing + * |removed_data| from frc->fr.stream.data[0]. frc->fr.stream.data[0] + * must contain |removed_data|, and frc->fr.stream.datacnt >= 1. New + * ngtcp2_frame_chain object that contains |removed_data| is created, + * and pushed to |crypto_strm| via ngtcp2_strm_streamfrq_push. If + * there are data following the removed part of data, new + * ngtcp2_frame_chain object is created for it, and frc->next points + * to the object. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -2168,13 +2296,13 @@ static uint8_t conn_pkt_flags_short(ngtcp2_conn *conn) { * NGTCP2_ERR_NOMEM * Out of memory */ -static int conn_cut_crypto_frame(ngtcp2_conn *conn, ngtcp2_frame_chain **pfrc, +static int conn_cut_crypto_frame(ngtcp2_conn *conn, ngtcp2_frame_chain *frc, ngtcp2_strm *crypto_strm, const ngtcp2_vec *removed_data) { - ngtcp2_vec *data = (*pfrc)->fr.stream.data; - size_t datacnt = (*pfrc)->fr.stream.datacnt; + ngtcp2_vec *data = frc->fr.stream.data; + size_t datacnt = frc->fr.stream.datacnt; size_t ndatacnt; - ngtcp2_frame_chain *left_frc, *right_frc = NULL, *removed_frc; + ngtcp2_frame_chain *right_frc = NULL, *removed_frc; size_t offset; int rv; @@ -2192,7 +2320,10 @@ static int conn_cut_crypto_frame(ngtcp2_conn *conn, ngtcp2_frame_chain **pfrc, /* ngtcp2_frame_chain for the removed data */ removed_frc->fr.stream.type = NGTCP2_FRAME_CRYPTO; - removed_frc->fr.stream.offset = (*pfrc)->fr.stream.offset + offset; + removed_frc->fr.stream.flags = 0; + removed_frc->fr.stream.fin = 0; + removed_frc->fr.stream.stream_id = 0; + removed_frc->fr.stream.offset = frc->fr.stream.offset + offset; removed_frc->fr.stream.datacnt = 1; removed_frc->fr.stream.data[0] = (ngtcp2_vec){ .base = data->base + offset, @@ -2221,6 +2352,9 @@ static int conn_cut_crypto_frame(ngtcp2_conn *conn, ngtcp2_frame_chain **pfrc, } right_frc->fr.stream.type = NGTCP2_FRAME_CRYPTO; + right_frc->fr.stream.flags = 0; + right_frc->fr.stream.fin = 0; + right_frc->fr.stream.stream_id = 0; right_frc->fr.stream.offset = removed_frc->fr.stream.offset + removed_frc->fr.stream.data->len; right_frc->fr.stream.datacnt = 0; @@ -2231,32 +2365,9 @@ static int conn_cut_crypto_frame(ngtcp2_conn *conn, ngtcp2_frame_chain **pfrc, assert(1 == datacnt); } - /* We cannot change (*pfrc)->fr.stream.datacnt. If it changes, - create new ngtcp2_frame_chain. */ - if ((*pfrc)->fr.stream.datacnt == 1) { - (*pfrc)->fr.stream.data[0].len = offset; - (*pfrc)->next = right_frc; - return 0; - } - - rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &left_frc, 1, &conn->frc_objalloc, conn->mem); - if (rv != 0) { - ngtcp2_frame_chain_objalloc_del(right_frc, &conn->frc_objalloc, conn->mem); - return rv; - } - - left_frc->fr.stream.type = NGTCP2_FRAME_CRYPTO; - left_frc->fr.stream.offset = (*pfrc)->fr.stream.offset; - left_frc->fr.stream.datacnt = 1; - left_frc->fr.stream.data[0] = (ngtcp2_vec){ - .base = data[0].base, - .len = offset, - }; - left_frc->next = right_frc; - - ngtcp2_frame_chain_objalloc_del(*pfrc, &conn->frc_objalloc, conn->mem); - *pfrc = left_frc; + frc->fr.stream.datacnt = 1; + frc->fr.stream.data[0].len = offset; + frc->next = right_frc; return 0; } @@ -2340,7 +2451,7 @@ conn_crumble_initial_crypto(ngtcp2_conn *conn, ngtcp2_frame_chain **pfrc, datacnt = ngtcp2_pkt_remove_vec_partial( &removed_data, data, datacnt, offsets, &conn->pcg, &server_name); - rv = conn_cut_crypto_frame(conn, pfrc, crypto_strm, &removed_data); + rv = conn_cut_crypto_frame(conn, *pfrc, crypto_strm, &removed_data); if (rv != 0) { ngtcp2_frame_chain_objalloc_del(*pfrc, &conn->frc_objalloc, conn->mem); return rv; @@ -2372,7 +2483,16 @@ conn_crumble_initial_crypto(ngtcp2_conn *conn, ngtcp2_frame_chain **pfrc, return (ngtcp2_ssize)datacnt; } -static size_t conn_min_pktlen(ngtcp2_conn *conn); +static size_t conn_dgram_padding(const ngtcp2_conn *conn, ngtcp2_ppe *ppe) { + if (conn->local.settings.no_tx_udp_payload_size_shaping) { + return ngtcp2_ppe_dgram_padding_size( + ppe, conn->local.settings.max_tx_udp_payload_size); + } + + return ngtcp2_ppe_dgram_padding(ppe); +} + +static size_t conn_min_pktlen(const ngtcp2_conn *conn); /* * conn_write_handshake_pkt writes handshake packet in the buffer @@ -2402,8 +2522,8 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, ngtcp2_pkt_hd hd; ngtcp2_frame_chain *frq = NULL, **pfrc = &frq; ngtcp2_frame_chain *nfrc; - ngtcp2_max_frame mfr; - ngtcp2_frame *ackfr = NULL, lfr; + ngtcp2_ack_range ack_ranges[NGTCP2_MAX_ACK_RANGES]; + ngtcp2_frame lfr; ngtcp2_ssize spktlen; ngtcp2_crypto_cc cc; ngtcp2_rtb_entry *rtbent; @@ -2474,20 +2594,16 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, return 0; } - if (!ngtcp2_ppe_ensure_hp_sample(&ppe)) { - return 0; - } - - ackfr = ngtcp2_acktr_create_ack_frame(&pktns->acktr, &mfr.fr, type, ts, - /* ack_delay = */ 0, - NGTCP2_DEFAULT_ACK_DELAY_EXPONENT); - if (ackfr) { - rv = conn_ppe_write_frame_hd_log(conn, &ppe, &hd_logged, &hd, ackfr); + lfr.ack.ranges = ack_ranges; + if (ngtcp2_acktr_create_ack_frame(&pktns->acktr, &lfr.ack, type, ts, + /* ack_delay = */ 0, + NGTCP2_DEFAULT_ACK_DELAY_EXPONENT) == 0) { + rv = conn_ppe_write_frame_hd_log(conn, &ppe, &hd_logged, &hd, &lfr); if (rv != 0) { assert(NGTCP2_ERR_NOBUF == rv); } else { ngtcp2_acktr_commit_ack(&pktns->acktr); - ngtcp2_acktr_add_ack(&pktns->acktr, hd.pkt_num, ackfr->ack.largest_ack); + ngtcp2_acktr_add_ack(&pktns->acktr, hd.pkt_num, lfr.ack.largest_ack); pkt_empty = 0; } } @@ -2545,7 +2661,7 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, .type = NGTCP2_FRAME_CRYPTO, .offset = offsets[i], .datacnt = 1, - .data[0] = data[i], + .data = &data[i], }; } @@ -2554,6 +2670,8 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, ngtcp2_unreachable(); } } + + conn->frame_counts.crypto += (size_t)datacnt; } else { left = ngtcp2_pkt_crypto_max_datalen(crypto_offset, left, left); if (left == (size_t)-1) { @@ -2577,6 +2695,8 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, if (rv != 0) { ngtcp2_unreachable(); } + + ++conn->frame_counts.crypto; } *pfrc = nfrc; @@ -2595,7 +2715,9 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, if (!(rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) && pktns->rtb.num_retransmittable && pktns->rtb.probe_pkt_left) { - num_reclaimed = ngtcp2_rtb_reclaim_on_pto(&pktns->rtb, conn, pktns, 1); + num_reclaimed = ngtcp2_rtb_reclaim_on_pto( + &pktns->rtb, conn, pktns, + !conn->server && type == NGTCP2_PKT_INITIAL ? 2 : 1); if (num_reclaimed < 0) { ngtcp2_frame_chain_list_objalloc_del(frq, &conn->frc_objalloc, conn->mem); @@ -2622,7 +2744,7 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, if (!(rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) && pktns->rtb.probe_pkt_left) { - lfr.type = NGTCP2_FRAME_PING; + lfr.ping.type = NGTCP2_FRAME_PING; rv = conn_ppe_write_frame_hd_log(conn, &ppe, &hd_logged, &hd, &lfr); if (rv != 0) { @@ -2638,7 +2760,7 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, if (!(rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING)) { if (ngtcp2_tstamp_elapsed(pktns->tx.non_ack_pkt_start_ts, conn->cstat.smoothed_rtt, ts)) { - lfr.type = NGTCP2_FRAME_PING; + lfr.ping.type = NGTCP2_FRAME_PING; rv = conn_ppe_write_frame_hd_log(conn, &ppe, &hd_logged, &hd, &lfr); if (rv != 0) { @@ -2667,12 +2789,12 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, conn, type, ngtcp2_ppe_left(&ppe), write_datalen, (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) != 0, require_padding)) { - lfr.type = NGTCP2_FRAME_PADDING; - lfr.padding.len = ngtcp2_ppe_dgram_padding(&ppe); + lfr.padding.type = NGTCP2_FRAME_PADDING; + lfr.padding.len = conn_dgram_padding(conn, &ppe); } else if (pkt_empty) { return 0; } else { - lfr.type = NGTCP2_FRAME_PADDING; + lfr.padding.type = NGTCP2_FRAME_PADDING; lfr.padding.len = ngtcp2_ppe_padding_size(&ppe, conn_min_pktlen(conn)); min_padded = 1; } @@ -2735,6 +2857,9 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, conn->tx.pacing.pktlen += (size_t)spktlen; + ++conn->cstat.pkt_sent; + conn->cstat.bytes_sent += (uint64_t)spktlen; + ngtcp2_qlog_metrics_updated(&conn->qlog, &conn->cstat); ++pktns->tx.last_pkt_num; @@ -2758,12 +2883,12 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, static ngtcp2_ssize conn_write_ack_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, uint8_t type, ngtcp2_tstamp ts) { - ngtcp2_frame *ackfr; ngtcp2_pktns *pktns; ngtcp2_duration ack_delay; uint64_t ack_delay_exponent; ngtcp2_ssize spktlen; - ngtcp2_max_frame mfr; + ngtcp2_ack_range ack_ranges[NGTCP2_MAX_ACK_RANGES]; + ngtcp2_frame fr; assert(!(conn->flags & NGTCP2_CONN_FLAG_PPE_PENDING)); @@ -2792,15 +2917,15 @@ static ngtcp2_ssize conn_write_ack_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, return 0; } - ackfr = ngtcp2_acktr_create_ack_frame(&pktns->acktr, &mfr.fr, type, ts, - ack_delay, ack_delay_exponent); - if (!ackfr) { + fr.ack.ranges = ack_ranges; + if (ngtcp2_acktr_create_ack_frame(&pktns->acktr, &fr.ack, type, ts, ack_delay, + ack_delay_exponent) != 0) { return 0; } spktlen = ngtcp2_conn_write_single_frame_pkt( conn, pi, dest, destlen, type, NGTCP2_WRITE_PKT_FLAG_NONE, - &conn->dcid.current.cid, ackfr, NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); + &conn->dcid.current.cid, &fr, NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); if (spktlen <= 0) { return spktlen; @@ -2873,7 +2998,7 @@ static void conn_discard_early_key(ngtcp2_conn *conn) { conn_call_delete_crypto_aead_ctx(conn, &conn->early.ckm->aead_ctx); conn_call_delete_crypto_cipher_ctx(conn, &conn->early.hp_ctx); - memset(&conn->early.hp_ctx, 0, sizeof(conn->early.hp_ctx)); + conn->early.hp_ctx = (ngtcp2_crypto_cipher_ctx){0}; ngtcp2_crypto_km_del(conn->early.ckm, conn->mem); conn->early.ckm = NULL; @@ -2960,7 +3085,7 @@ static ngtcp2_ssize conn_write_client_initial(ngtcp2_conn *conn, * dcid_tx_left returns the maximum number of bytes that server is * allowed to send to an unvalidated path associated to |dcid|. */ -static uint64_t dcid_tx_left(ngtcp2_dcid *dcid) { +static uint64_t dcid_tx_left(const ngtcp2_dcid *dcid) { if (dcid->flags & NGTCP2_DCID_FLAG_PATH_VALIDATED) { return SIZE_MAX; } @@ -2976,7 +3101,8 @@ static uint64_t dcid_tx_left(ngtcp2_dcid *dcid) { * conn_server_tx_left returns the maximum number of bytes that server * is allowed to send to an unvalidated path. */ -static uint64_t conn_server_tx_left(ngtcp2_conn *conn, ngtcp2_dcid *dcid) { +static uint64_t conn_server_tx_left(const ngtcp2_conn *conn, + const ngtcp2_dcid *dcid) { assert(conn->server); /* If pv->dcid has the current path, use conn->dcid.current. This @@ -3063,21 +3189,16 @@ static ngtcp2_ssize conn_write_handshake_pkts(ngtcp2_conn *conn, dest += nwrite; destlen -= (size_t)nwrite; - /* If initial packet size is at least - NGTCP2_MAX_UDP_PAYLOAD_SIZE, no extra padding is needed in a - subsequent packet. */ - if (nwrite < NGTCP2_MAX_UDP_PAYLOAD_SIZE) { - if (conn->server) { - it = ngtcp2_rtb_head(&conn->in_pktns->rtb); - if (!ngtcp2_ksl_it_end(&it)) { - rtbent = ngtcp2_ksl_it_get(&it); - if (rtbent->flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) { - wflags |= NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING; - } + if (conn->server) { + it = ngtcp2_rtb_head(&conn->in_pktns->rtb); + if (!ngtcp2_ksl_it_end(&it)) { + rtbent = ngtcp2_ksl_it_get(&it); + if (rtbent->flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) { + wflags |= NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING; } - } else { - wflags |= NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING; } + } else { + wflags |= NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING; } } } @@ -3127,8 +3248,8 @@ static uint64_t conn_initial_stream_rx_offset(ngtcp2_conn *conn, * conn_should_send_max_stream_data returns nonzero if MAX_STREAM_DATA * frame should be send for |strm|. */ -static int conn_should_send_max_stream_data(ngtcp2_conn *conn, - ngtcp2_strm *strm) { +static int conn_should_send_max_stream_data(const ngtcp2_conn *conn, + const ngtcp2_strm *strm) { uint64_t inc = strm->rx.unsent_max_offset - strm->rx.max_offset; (void)conn; @@ -3139,7 +3260,7 @@ static int conn_should_send_max_stream_data(ngtcp2_conn *conn, * conn_should_send_max_data returns nonzero if MAX_DATA frame should * be sent. */ -static int conn_should_send_max_data(ngtcp2_conn *conn) { +static int conn_should_send_max_data(const ngtcp2_conn *conn) { uint64_t inc = conn->rx.unsent_max_offset - conn->rx.max_offset; return conn->rx.window < 4 * inc; @@ -3150,8 +3271,8 @@ static int conn_should_send_max_data(ngtcp2_conn *conn) { * additional connection ID the local endpoint has to provide to the * remote endpoint. */ -static size_t conn_required_num_new_connection_id(ngtcp2_conn *conn) { - uint64_t n; +static size_t conn_required_num_new_connection_id(const ngtcp2_conn *conn) { + size_t n; size_t len = ngtcp2_ksl_len(&conn->scid.set); size_t lim; @@ -3172,12 +3293,13 @@ static size_t conn_required_num_new_connection_id(ngtcp2_conn *conn) { /* len includes retired CID. We don't provide extra CID if doing so exceeds NGTCP2_MAX_SCID_POOL_SIZE. */ - n = conn->remote.transport_params->active_connection_id_limit + - conn->scid.num_retired; + n = (size_t)ngtcp2_min( + NGTCP2_MAX_SCID_POOL_SIZE, + conn->remote.transport_params->active_connection_id_limit + + conn->scid.num_retired) - + len; - n = ngtcp2_min_uint64(NGTCP2_MAX_SCID_POOL_SIZE, n) - len; - - return (size_t)ngtcp2_min_uint64(lim, n); + return ngtcp2_min(lim, n); } /* @@ -3195,58 +3317,59 @@ static size_t conn_required_num_new_connection_id(ngtcp2_conn *conn) { static int conn_enqueue_new_connection_id(ngtcp2_conn *conn) { size_t i, need = conn_required_num_new_connection_id(conn); size_t cidlen = conn->oscid.datalen; - ngtcp2_cid cid; - uint64_t seq; int rv; - uint8_t token[NGTCP2_STATELESS_RESET_TOKENLEN]; ngtcp2_frame_chain *nfrc; ngtcp2_pktns *pktns = &conn->pktns; ngtcp2_scid *scid; ngtcp2_ksl_it it; for (i = 0; i < need; ++i) { - rv = conn_call_get_new_connection_id(conn, &cid, token, cidlen); + rv = ngtcp2_frame_chain_objalloc_new(&nfrc, &conn->frc_objalloc); if (rv != 0) { return rv; } - if (cid.datalen != cidlen) { - return NGTCP2_ERR_CALLBACK_FAILURE; + nfrc->fr.new_connection_id.type = NGTCP2_FRAME_NEW_CONNECTION_ID; + nfrc->fr.new_connection_id.seq = ++conn->scid.last_seq; + nfrc->fr.new_connection_id.retire_prior_to = 0; + + rv = conn_call_get_new_connection_id(conn, &nfrc->fr.new_connection_id.cid, + &nfrc->fr.new_connection_id.token, + cidlen); + if (rv != 0) { + goto fail; + } + + if (nfrc->fr.new_connection_id.cid.datalen != cidlen) { + rv = NGTCP2_ERR_CALLBACK_FAILURE; + goto fail; } /* Assert uniqueness */ - it = ngtcp2_ksl_lower_bound(&conn->scid.set, &cid); + it = + ngtcp2_ksl_lower_bound(&conn->scid.set, &nfrc->fr.new_connection_id.cid); if (!ngtcp2_ksl_it_end(&it) && - ngtcp2_cid_eq(ngtcp2_ksl_it_key(&it), &cid)) { - return NGTCP2_ERR_CALLBACK_FAILURE; + ngtcp2_cid_eq(ngtcp2_ksl_it_key(&it), + &nfrc->fr.new_connection_id.cid)) { + rv = NGTCP2_ERR_CALLBACK_FAILURE; + goto fail; } - seq = ++conn->scid.last_seq; - scid = ngtcp2_mem_malloc(conn->mem, sizeof(*scid)); if (scid == NULL) { - return NGTCP2_ERR_NOMEM; + rv = NGTCP2_ERR_NOMEM; + goto fail; } - ngtcp2_scid_init(scid, seq, &cid); + ngtcp2_scid_init(scid, nfrc->fr.new_connection_id.seq, + &nfrc->fr.new_connection_id.cid); rv = ngtcp2_ksl_insert(&conn->scid.set, NULL, &scid->cid, scid); if (rv != 0) { ngtcp2_mem_free(conn->mem, scid); - return rv; - } - - rv = ngtcp2_frame_chain_objalloc_new(&nfrc, &conn->frc_objalloc); - if (rv != 0) { - return rv; + goto fail; } - nfrc->fr.type = NGTCP2_FRAME_NEW_CONNECTION_ID; - nfrc->fr.new_connection_id.seq = seq; - nfrc->fr.new_connection_id.retire_prior_to = 0; - nfrc->fr.new_connection_id.cid = cid; - memcpy(nfrc->fr.new_connection_id.stateless_reset_token, token, - sizeof(token)); nfrc->next = pktns->tx.frq; pktns->tx.frq = nfrc; @@ -3256,6 +3379,11 @@ static int conn_enqueue_new_connection_id(ngtcp2_conn *conn) { } return 0; + +fail: + ngtcp2_frame_chain_objalloc_del(nfrc, &conn->frc_objalloc, conn->mem); + + return rv; } static int dcidtr_on_deactivate(const ngtcp2_dcid *dcid, void *user_data) { @@ -3319,7 +3447,7 @@ static int conn_remove_retired_connection_id(ngtcp2_conn *conn, * sends. It may underestimate the length because this does not take * into account header protection sample. */ -static size_t conn_min_pktlen(ngtcp2_conn *conn) { +static size_t conn_min_pktlen(const ngtcp2_conn *conn) { return conn->oscid.datalen + NGTCP2_MIN_PKT_EXPANDLEN; } @@ -3346,13 +3474,11 @@ static void conn_handle_unconfirmed_key_update_from_remote(ngtcp2_conn *conn, ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CRY, "key update confirmed"); } -static uint64_t conn_tx_strmq_first_cycle(ngtcp2_conn *conn); - /* * strm_should_send_stream_data_blocked returns nonzero if * STREAM_DATA_BLOCKED frame should be sent to |strm|. */ -static int strm_should_send_stream_data_blocked(ngtcp2_strm *strm) { +static int strm_should_send_stream_data_blocked(const ngtcp2_strm *strm) { return strm->tx.offset == strm->tx.max_offset && strm->tx.last_blocked_offset != strm->tx.max_offset; } @@ -3361,7 +3487,7 @@ static int strm_should_send_stream_data_blocked(ngtcp2_strm *strm) { * conn_should_send_data_blocked returns nonzero if DATA_BLOCKED frame * should be sent. */ -static int conn_should_send_data_blocked(ngtcp2_conn *conn) { +static int conn_should_send_data_blocked(const ngtcp2_conn *conn) { return conn->tx.offset == conn->tx.max_offset && conn->tx.last_blocked_offset != conn->tx.max_offset; } @@ -3415,8 +3541,8 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, ngtcp2_crypto_cc *cc = &conn->pkt.cc; ngtcp2_ppe *ppe = &conn->pkt.ppe; ngtcp2_pkt_hd *hd = &conn->pkt.hd; - ngtcp2_max_frame mfr; - ngtcp2_frame *ackfr = NULL, lfr; + ngtcp2_ack_range ack_ranges[NGTCP2_MAX_ACK_RANGES]; + ngtcp2_frame lfr; ngtcp2_ssize nwrite; ngtcp2_frame_chain **pfrc, *nfrc, *frc; ngtcp2_rtb_entry *ent; @@ -3442,11 +3568,9 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, size_t min_pktlen = conn_min_pktlen(conn); int min_padded = 0; int padded = 0; - ngtcp2_cc_pkt cc_pkt; uint64_t crypto_offset; uint64_t stream_offset; ngtcp2_ssize num_reclaimed; - int fin; uint64_t target_max_data; ngtcp2_conn_stat *cstat = &conn->cstat; uint64_t delta; @@ -3559,8 +3683,10 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, conn->tx.last_max_data_ts = ts; - nfrc->fr.type = NGTCP2_FRAME_MAX_DATA; - nfrc->fr.max_data.max_data = conn->rx.unsent_max_offset + delta; + nfrc->fr.max_data = (ngtcp2_max_data){ + .type = NGTCP2_FRAME_MAX_DATA, + .max_data = conn->rx.unsent_max_offset + delta, + }; nfrc->next = pktns->tx.frq; pktns->tx.frq = nfrc; @@ -3585,19 +3711,16 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, return 0; } - if (!ngtcp2_ppe_ensure_hp_sample(ppe)) { - return 0; - } - if (ngtcp2_ringbuf_len(&conn->rx.path_challenge.rb)) { pcent = ngtcp2_ringbuf_get(&conn->rx.path_challenge.rb, 0); /* PATH_RESPONSE is bound to the path that the corresponding PATH_CHALLENGE is received. */ if (ngtcp2_path_eq(&conn->dcid.current.ps.path, &pcent->ps.path)) { - lfr.type = NGTCP2_FRAME_PATH_RESPONSE; - memcpy(lfr.path_response.data, pcent->data, - sizeof(lfr.path_response.data)); + lfr.path_response = (ngtcp2_path_response){ + .type = NGTCP2_FRAME_PATH_RESPONSE, + .data = pcent->data, + }; rv = conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &lfr); if (rv != 0) { @@ -3616,7 +3739,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, An endpoint that receives a PATH_CHALLENGE on an active path SHOULD send a non-probing packet in response. */ - lfr.type = NGTCP2_FRAME_PING; + lfr.ping.type = NGTCP2_FRAME_PING; rv = conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &lfr); if (rv != 0) { assert(NGTCP2_ERR_NOBUF == rv); @@ -3625,20 +3748,19 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } } - ackfr = ngtcp2_acktr_create_ack_frame( - &pktns->acktr, &mfr.fr, type, ts, conn_compute_ack_delay(conn), - conn->local.transport_params.ack_delay_exponent); - if (ackfr) { - rv = conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, ackfr); + lfr.ack.ranges = ack_ranges; + if (ngtcp2_acktr_create_ack_frame( + &pktns->acktr, &lfr.ack, type, ts, conn_compute_ack_delay(conn), + conn->local.transport_params.ack_delay_exponent) == 0) { + rv = conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &lfr); if (rv != 0) { assert(NGTCP2_ERR_NOBUF == rv); } else { ngtcp2_acktr_commit_ack(&pktns->acktr); - ngtcp2_acktr_add_ack(&pktns->acktr, hd->pkt_num, - ackfr->ack.largest_ack); + ngtcp2_acktr_add_ack(&pktns->acktr, hd->pkt_num, lfr.ack.largest_ack); assert(NGTCP2_PKT_1RTT == type); - conn_handle_unconfirmed_key_update_from_remote( - conn, ackfr->ack.largest_ack, ts); + conn_handle_unconfirmed_key_update_from_remote(conn, + lfr.ack.largest_ack, ts); pkt_empty = 0; } } @@ -3653,7 +3775,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, continue; } - switch ((*pfrc)->fr.type) { + switch ((*pfrc)->fr.hd.type) { case NGTCP2_FRAME_RESET_STREAM: strm = ngtcp2_conn_find_stream(conn, (*pfrc)->fr.reset_stream.stream_id); @@ -3790,6 +3912,8 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, rtb_entry_flags |= NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING | NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING | NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE; + + ++conn->frame_counts.crypto; } } @@ -3803,11 +3927,12 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, return rv; } - nfrc->fr.type = NGTCP2_FRAME_RESET_STREAM; - nfrc->fr.reset_stream.stream_id = strm->stream_id; - nfrc->fr.reset_stream.app_error_code = - strm->tx.reset_stream_app_error_code; - nfrc->fr.reset_stream.final_size = strm->tx.offset; + nfrc->fr.reset_stream = (ngtcp2_reset_stream){ + .type = NGTCP2_FRAME_RESET_STREAM, + .stream_id = strm->stream_id, + .app_error_code = strm->tx.reset_stream_app_error_code, + .final_size = strm->tx.offset, + }; *pfrc = nfrc; strm->flags &= ~NGTCP2_STRM_FLAG_SEND_RESET_STREAM; @@ -3846,10 +3971,11 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, return rv; } - nfrc->fr.type = NGTCP2_FRAME_STOP_SENDING; - nfrc->fr.stop_sending.stream_id = strm->stream_id; - nfrc->fr.stop_sending.app_error_code = - strm->tx.stop_sending_app_error_code; + nfrc->fr.stop_sending = (ngtcp2_stop_sending){ + .type = NGTCP2_FRAME_STOP_SENDING, + .stream_id = strm->stream_id, + .app_error_code = strm->tx.stop_sending_app_error_code, + }; *pfrc = nfrc; strm->flags &= ~NGTCP2_STRM_FLAG_SEND_STOP_SENDING; @@ -3877,9 +4003,11 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, return rv; } - nfrc->fr.type = NGTCP2_FRAME_STREAM_DATA_BLOCKED; - nfrc->fr.stream_data_blocked.stream_id = strm->stream_id; - nfrc->fr.stream_data_blocked.offset = strm->tx.max_offset; + nfrc->fr.stream_data_blocked = (ngtcp2_stream_data_blocked){ + .type = NGTCP2_FRAME_STREAM_DATA_BLOCKED, + .stream_id = strm->stream_id, + .offset = strm->tx.max_offset, + }; *pfrc = nfrc; strm->tx.last_blocked_offset = strm->tx.max_offset; @@ -3931,10 +4059,11 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, strm->tx.last_max_stream_data_ts = ts; - nfrc->fr.type = NGTCP2_FRAME_MAX_STREAM_DATA; - nfrc->fr.max_stream_data.stream_id = strm->stream_id; - nfrc->fr.max_stream_data.max_stream_data = - strm->rx.unsent_max_offset + delta; + nfrc->fr.max_stream_data = (ngtcp2_max_stream_data){ + .type = NGTCP2_FRAME_MAX_STREAM_DATA, + .stream_id = strm->stream_id, + .max_stream_data = strm->rx.unsent_max_offset + delta, + }; *pfrc = nfrc; strm->rx.max_offset = strm->rx.unsent_max_offset = @@ -3999,6 +4128,8 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING | NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE; + ++conn->frame_counts.stream; + if (ngtcp2_strm_streamfrq_empty(strm)) { ngtcp2_conn_tx_strmq_pop(conn); continue; @@ -4030,8 +4161,10 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, assert(ngtcp2_err_is_fatal(rv)); return rv; } - nfrc->fr.type = NGTCP2_FRAME_MAX_STREAMS_BIDI; - nfrc->fr.max_streams.max_streams = conn->remote.bidi.unsent_max_streams; + nfrc->fr.max_streams = (ngtcp2_max_streams){ + .type = NGTCP2_FRAME_MAX_STREAMS_BIDI, + .max_streams = conn->remote.bidi.unsent_max_streams, + }; *pfrc = nfrc; conn->remote.bidi.max_streams = conn->remote.bidi.unsent_max_streams; @@ -4062,8 +4195,10 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, assert(ngtcp2_err_is_fatal(rv)); return rv; } - nfrc->fr.type = NGTCP2_FRAME_MAX_STREAMS_UNI; - nfrc->fr.max_streams.max_streams = conn->remote.uni.unsent_max_streams; + nfrc->fr.max_streams = (ngtcp2_max_streams){ + .type = NGTCP2_FRAME_MAX_STREAMS_UNI, + .max_streams = conn->remote.uni.unsent_max_streams, + }; *pfrc = nfrc; conn->remote.uni.max_streams = conn->remote.uni.unsent_max_streams; @@ -4136,14 +4271,14 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, nfrc->fr.stream.type = NGTCP2_FRAME_STREAM; nfrc->fr.stream.flags = 0; + nfrc->fr.stream.fin = 0; nfrc->fr.stream.stream_id = vmsg->stream.strm->stream_id; nfrc->fr.stream.offset = vmsg->stream.strm->tx.offset; nfrc->fr.stream.datacnt = datacnt; ngtcp2_vec_copy(nfrc->fr.stream.data, data, datacnt); - fin = (vmsg->stream.flags & NGTCP2_WRITE_STREAM_FLAG_FIN) && - ndatalen == datalen; - nfrc->fr.stream.fin = (uint8_t)fin; + nfrc->fr.stream.fin = (vmsg->stream.flags & NGTCP2_WRITE_STREAM_FLAG_FIN) && + ndatalen == datalen; rv = conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); if (rv != 0) { @@ -4158,11 +4293,13 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING | NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE; + ++conn->frame_counts.stream; + vmsg->stream.strm->tx.offset += ndatalen; conn->tx.offset += ndatalen; vmsg->stream.strm->flags |= NGTCP2_STRM_FLAG_ANY_SENT; - if (fin) { + if (nfrc->fr.stream.fin) { ngtcp2_strm_shutdown(vmsg->stream.strm, NGTCP2_STRM_FLAG_SHUT_WR); } @@ -4185,8 +4322,10 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, return rv; } - nfrc->fr.type = NGTCP2_FRAME_DATA_BLOCKED; - nfrc->fr.data_blocked.offset = conn->tx.offset; + nfrc->fr.data_blocked = (ngtcp2_data_blocked){ + .type = NGTCP2_FRAME_DATA_BLOCKED, + .offset = conn->tx.offset, + }; rv = conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); if (rv != 0) { @@ -4217,9 +4356,11 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, return rv; } - nfrc->fr.type = NGTCP2_FRAME_STREAM_DATA_BLOCKED; - nfrc->fr.stream_data_blocked.stream_id = strm->stream_id; - nfrc->fr.stream_data_blocked.offset = strm->tx.max_offset; + nfrc->fr.stream_data_blocked = (ngtcp2_stream_data_blocked){ + .type = NGTCP2_FRAME_STREAM_DATA_BLOCKED, + .stream_id = strm->stream_id, + .offset = strm->tx.max_offset, + }; rv = conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); if (rv != 0) { @@ -4229,7 +4370,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, ngtcp2_frame_chain_objalloc_del(nfrc, &conn->frc_objalloc, conn->mem); if (!ngtcp2_strm_is_tx_queued(strm)) { - strm->cycle = conn_tx_strmq_first_cycle(conn); + strm->cycle = ngtcp2_conn_tx_strmq_first_cycle(conn); rv = ngtcp2_conn_tx_strmq_push(conn, strm); if (rv != 0) { return rv; @@ -4299,7 +4440,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (pkt_empty) { if (*pfrc == NULL && rv == 0 && stream_blocked && (write_more || !require_padding) && - ngtcp2_conn_get_max_data_left(conn)) { + ngtcp2_conn_get_max_data_left2(conn)) { if (write_more) { conn->pkt.pfrc = pfrc; conn->pkt.pkt_empty = pkt_empty; @@ -4340,7 +4481,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, break; } - if (*pfrc == NULL && ngtcp2_conn_get_max_data_left(conn) && + if (*pfrc == NULL && ngtcp2_conn_get_max_data_left2(conn) && stream_blocked) { return NGTCP2_ERR_STREAM_DATA_BLOCKED; } @@ -4362,7 +4503,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (ngtcp2_tstamp_elapsed(pktns->tx.non_ack_pkt_start_ts, cstat->smoothed_rtt, ts) || keep_alive_expired || conn->pktns.rtb.probe_pkt_left) { - lfr.type = NGTCP2_FRAME_PING; + lfr.ping.type = NGTCP2_FRAME_PING; rv = conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &lfr); if (rv != 0) { @@ -4377,7 +4518,6 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, rtb_entry_flags |= NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING; } pktns->tx.non_ack_pkt_start_ts = UINT64_MAX; - pkt_empty = 0; } } else if (pktns->tx.non_ack_pkt_start_ts == UINT64_MAX) { pktns->tx.non_ack_pkt_start_ts = ts; @@ -4392,7 +4532,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING)) { lfr.padding.len = ngtcp2_ppe_padding_size(ppe, destlen); } else if (require_padding) { - lfr.padding.len = ngtcp2_ppe_dgram_padding(ppe); + lfr.padding.len = conn_dgram_padding(conn, ppe); } else { lfr.padding.len = ngtcp2_ppe_padding_size(ppe, min_pktlen); min_padded = 1; @@ -4403,7 +4543,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING)) { padded = 1; } - lfr.type = NGTCP2_FRAME_PADDING; + lfr.padding.type = NGTCP2_FRAME_PADDING; ngtcp2_log_tx_fr(&conn->log, hd, &lfr); ngtcp2_qlog_write_frame(&conn->qlog, &lfr); } @@ -4439,12 +4579,6 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, *pfrc = NULL; } - if ((rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) && - pktns->rtb.num_ack_eliciting == 0 && conn->cc.event) { - conn->cc.event(&conn->cc, &conn->cstat, NGTCP2_CC_EVENT_TYPE_TX_START, - ts); - } - rv = conn_on_pkt_sent(conn, pktns, ent); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); @@ -4453,18 +4587,9 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, return rv; } - if (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) { - if (conn->cc.on_pkt_sent) { - conn->cc.on_pkt_sent( - &conn->cc, &conn->cstat, - ngtcp2_cc_pkt_init(&cc_pkt, hd->pkt_num, (size_t)nwrite, - NGTCP2_PKTNS_ID_APPLICATION, ts, ent->rst.lost, - ent->rst.tx_in_flight, ent->rst.is_app_limited)); - } - - if (conn->flags & NGTCP2_CONN_FLAG_RESTART_IDLE_TIMER_ON_WRITE) { - conn_restart_timer_on_write(conn, ts); - } + if ((rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) && + (conn->flags & NGTCP2_CONN_FLAG_RESTART_IDLE_TIMER_ON_WRITE)) { + conn_restart_timer_on_write(conn, ts); } } else if (pi && conn->tx.ecn.state == NGTCP2_ECN_STATE_CAPABLE) { conn_handle_tx_ecn(conn, pi, NULL, pktns, hd, ts); @@ -4476,8 +4601,8 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING)) { --pktns->rtb.probe_pkt_left; - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "probe pkt size=%td", - nwrite); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_CON, + "probe pkt size=", nwrite); } conn_update_keep_alive_last_ts(conn, ts); @@ -4486,6 +4611,9 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, conn->tx.pacing.pktlen += (size_t)nwrite; + ++conn->cstat.pkt_sent; + conn->cstat.bytes_sent += (uint64_t)nwrite; + ngtcp2_qlog_metrics_updated(&conn->qlog, &conn->cstat); ++pktns->tx.last_pkt_num; @@ -4571,10 +4699,6 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( return 0; } - if (!ngtcp2_ppe_ensure_hp_sample(&ppe)) { - return 0; - } - ngtcp2_log_tx_pkt_hd(&conn->log, &hd); ngtcp2_qlog_pkt_sent_start(&conn->qlog); @@ -4584,17 +4708,17 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( return 0; } - lfr.type = NGTCP2_FRAME_PADDING; + lfr.padding.type = NGTCP2_FRAME_PADDING; if (flags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING_FULL) { lfr.padding.len = ngtcp2_ppe_dgram_padding_size(&ppe, destlen); } else if (flags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING) { - lfr.padding.len = ngtcp2_ppe_dgram_padding(&ppe); + lfr.padding.len = conn_dgram_padding(conn, &ppe); } else { - switch (fr->type) { + switch (fr->hd.type) { case NGTCP2_FRAME_PATH_CHALLENGE: case NGTCP2_FRAME_PATH_RESPONSE: if (!conn->server || destlen >= NGTCP2_MAX_UDP_PAYLOAD_SIZE) { - lfr.padding.len = ngtcp2_ppe_dgram_padding(&ppe); + lfr.padding.len = conn_dgram_padding(conn, &ppe); } else { lfr.padding.len = 0; } @@ -4621,7 +4745,7 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( ngtcp2_qlog_pkt_sent_end(&conn->qlog, &hd, (size_t)nwrite); /* Do this when we are sure that there is no error. */ - switch (fr->type) { + switch (fr->hd.type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: ngtcp2_acktr_commit_ack(&pktns->acktr); @@ -4636,6 +4760,13 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( padded = 0; } + break; + case NGTCP2_FRAME_CONNECTION_CLOSE: + case NGTCP2_FRAME_CONNECTION_CLOSE_APP: + /* Clear padded so that we never store the terminal packet in + ngtcp2_rtb. */ + padded = 0; + break; } @@ -4669,8 +4800,8 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( ngtcp2_path_eq(&conn->dcid.current.ps.path, path)) { --pktns->rtb.probe_pkt_left; - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "probe pkt size=%td", - nwrite); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_CON, + "probe pkt size=", nwrite); } } } else if (pi && conn->tx.ecn.state == NGTCP2_ECN_STATE_CAPABLE) { @@ -4682,7 +4813,7 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( } if (!padded) { - switch (fr->type) { + switch (fr->hd.type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: break; @@ -4693,6 +4824,9 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( conn->tx.pacing.pktlen += (size_t)nwrite; } + ++conn->cstat.pkt_sent; + conn->cstat.bytes_sent += (uint64_t)nwrite; + ngtcp2_qlog_metrics_updated(&conn->qlog, &conn->cstat); ++pktns->tx.last_pkt_num; @@ -4728,9 +4862,9 @@ static void conn_process_early_rtb(ngtcp2_conn *conn) { * handshake packets the local endpoint has to send, including new * packets and lost ones. */ -static int conn_handshake_remnants_left(ngtcp2_conn *conn) { - ngtcp2_pktns *in_pktns = conn->in_pktns; - ngtcp2_pktns *hs_pktns = conn->hs_pktns; +static int conn_handshake_remnants_left(const ngtcp2_conn *conn) { + const ngtcp2_pktns *in_pktns = conn->in_pktns; + const ngtcp2_pktns *hs_pktns = conn->hs_pktns; return !conn_is_tls_handshake_completed(conn) || (in_pktns && (in_pktns->rtb.num_pto_eliciting || @@ -4759,8 +4893,10 @@ static int conn_enqueue_retire_connection_id(ngtcp2_conn *conn, uint64_t seq) { return rv; } - nfrc->fr.type = NGTCP2_FRAME_RETIRE_CONNECTION_ID; - nfrc->fr.retire_connection_id.seq = seq; + nfrc->fr.retire_connection_id = (ngtcp2_retire_connection_id){ + .type = NGTCP2_FRAME_RETIRE_CONNECTION_ID, + .seq = seq, + }; nfrc->next = pktns->tx.frq; pktns->tx.frq = nfrc; @@ -4846,9 +4982,9 @@ static int conn_start_pmtud(ngtcp2_conn *conn) { assert(conn->remote.transport_params->max_udp_payload_size >= NGTCP2_MAX_UDP_PAYLOAD_SIZE); - hard_max_udp_payload_size = (size_t)ngtcp2_min_uint64( - conn->remote.transport_params->max_udp_payload_size, - (uint64_t)conn->local.settings.max_tx_udp_payload_size); + hard_max_udp_payload_size = + (size_t)ngtcp2_min(conn->remote.transport_params->max_udp_payload_size, + (uint64_t)conn->local.settings.max_tx_udp_payload_size); rv = ngtcp2_pmtud_new(&conn->pmtud, conn->dcid.current.max_udp_payload_size, @@ -4899,10 +5035,10 @@ static ngtcp2_ssize conn_write_pmtud_probe(ngtcp2_conn *conn, return 0; } - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, - "sending PMTUD probe packet len=%zu", probelen); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_CON, + "sending PMTUD probe packet len=", probelen); - lfr.type = NGTCP2_FRAME_PING; + lfr.ping.type = NGTCP2_FRAME_PING; nwrite = ngtcp2_conn_write_single_frame_pkt( conn, pi, dest, probelen, NGTCP2_PKT_1RTT, @@ -4916,8 +5052,8 @@ static ngtcp2_ssize conn_write_pmtud_probe(ngtcp2_conn *conn, assert(nwrite); - ngtcp2_pmtud_probe_sent(conn->pmtud, conn_compute_pto(conn, &conn->pktns), - ts); + ngtcp2_pmtud_probe_sent(conn->pmtud, + ngtcp2_conn_compute_pto(conn, &conn->pktns), ts); return nwrite; } @@ -4995,26 +5131,27 @@ static int conn_abort_pv(ngtcp2_conn *conn, ngtcp2_tstamp ts) { return conn_stop_pv(conn, ts); } -static size_t conn_shape_udp_payload(ngtcp2_conn *conn, const ngtcp2_dcid *dcid, +static size_t conn_shape_udp_payload(const ngtcp2_conn *conn, + const ngtcp2_dcid *dcid, size_t payloadlen) { if (conn->remote.transport_params && conn->remote.transport_params->max_udp_payload_size) { assert(conn->remote.transport_params->max_udp_payload_size >= NGTCP2_MAX_UDP_PAYLOAD_SIZE); - payloadlen = (size_t)ngtcp2_min_uint64( - (uint64_t)payloadlen, - conn->remote.transport_params->max_udp_payload_size); + payloadlen = + (size_t)ngtcp2_min((uint64_t)payloadlen, + conn->remote.transport_params->max_udp_payload_size); } payloadlen = - ngtcp2_min_size(payloadlen, conn->local.settings.max_tx_udp_payload_size); + ngtcp2_min(payloadlen, conn->local.settings.max_tx_udp_payload_size); if (conn->local.settings.no_tx_udp_payload_size_shaping) { return payloadlen; } - return ngtcp2_min_size(payloadlen, dcid->max_udp_payload_size); + return ngtcp2_min(payloadlen, dcid->max_udp_payload_size); } static void conn_reset_congestion_state(ngtcp2_conn *conn, ngtcp2_tstamp ts); @@ -5100,24 +5237,24 @@ static ngtcp2_ssize conn_write_path_challenge(ngtcp2_conn *conn, return 0; } - rv = conn_call_get_path_challenge_data(conn, lfr.path_challenge.data); + rv = conn_call_get_path_challenge_data(conn, &lfr.path_challenge.data); if (rv != 0) { return rv; } - lfr.type = NGTCP2_FRAME_PATH_CHALLENGE; + lfr.path_challenge.type = NGTCP2_FRAME_PATH_CHALLENGE; initial_pto = conn_compute_initial_pto(conn, &conn->pktns); - timeout = conn_compute_pto(conn, &conn->pktns); - timeout = ngtcp2_max_uint64(timeout, initial_pto); + timeout = ngtcp2_conn_compute_pto(conn, &conn->pktns); + timeout = ngtcp2_max(timeout, initial_pto); expiry = ts + timeout * (1ULL << pv->round); - destlen = ngtcp2_min_size(destlen, NGTCP2_MAX_UDP_PAYLOAD_SIZE); + destlen = ngtcp2_min(destlen, NGTCP2_MAX_UDP_PAYLOAD_SIZE); if (conn->server) { if (!(pv->dcid.flags & NGTCP2_DCID_FLAG_PATH_VALIDATED)) { tx_left = conn_server_tx_left(conn, &pv->dcid); - destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, tx_left); + destlen = (size_t)ngtcp2_min((uint64_t)destlen, tx_left); if (destlen == 0) { return 0; } @@ -5132,7 +5269,7 @@ static ngtcp2_ssize conn_write_path_challenge(ngtcp2_conn *conn, flags = NGTCP2_PV_ENTRY_FLAG_NONE; } - ngtcp2_pv_add_entry(pv, lfr.path_challenge.data, expiry, flags, ts); + ngtcp2_pv_add_entry(pv, &lfr.path_challenge.data, expiry, flags, ts); nwrite = ngtcp2_conn_write_single_frame_pkt( conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, @@ -5228,18 +5365,20 @@ static ngtcp2_ssize conn_write_path_response(ngtcp2_conn *conn, } } - destlen = ngtcp2_min_size(destlen, NGTCP2_MAX_UDP_PAYLOAD_SIZE); + destlen = ngtcp2_min(destlen, NGTCP2_MAX_UDP_PAYLOAD_SIZE); if (conn->server && !(dcid->flags & NGTCP2_DCID_FLAG_PATH_VALIDATED)) { tx_left = conn_server_tx_left(conn, dcid); - destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, tx_left); + destlen = (size_t)ngtcp2_min((uint64_t)destlen, tx_left); if (destlen == 0) { return 0; } } - lfr.type = NGTCP2_FRAME_PATH_RESPONSE; - memcpy(lfr.path_response.data, pcent->data, sizeof(lfr.path_response.data)); + lfr.path_response = (ngtcp2_path_response){ + .type = NGTCP2_FRAME_PATH_RESPONSE, + .data = pcent->data, + }; nwrite = ngtcp2_conn_write_single_frame_pkt( conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, @@ -5348,18 +5487,7 @@ static int conn_on_version_negotiation(ngtcp2_conn *conn, return rv; } -static uint64_t conn_tx_strmq_first_cycle(ngtcp2_conn *conn) { - ngtcp2_strm *strm; - - if (ngtcp2_pq_empty(&conn->tx.strmq)) { - return 0; - } - - strm = ngtcp2_struct_of(ngtcp2_pq_top(&conn->tx.strmq), ngtcp2_strm, pe); - return strm->cycle; -} - -uint64_t ngtcp2_conn_tx_strmq_first_cycle(ngtcp2_conn *conn) { +uint64_t ngtcp2_conn_tx_strmq_first_cycle(const ngtcp2_conn *conn) { ngtcp2_strm *strm; if (ngtcp2_pq_empty(&conn->tx.strmq)) { @@ -5396,11 +5524,10 @@ static int conn_on_retry(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd, ngtcp2_pktns *in_pktns = conn->in_pktns; ngtcp2_rtb *rtb = &conn->pktns.rtb; ngtcp2_rtb *in_rtb; - uint8_t cidbuf[sizeof(retry.odcid.data) * 2 + 1]; uint8_t *token; - if (!in_pktns || conn->flags & NGTCP2_CONN_FLAG_RECV_RETRY) { - return 0; + if (!in_pktns || (conn->flags & NGTCP2_CONN_FLAG_RECV_RETRY)) { + return NGTCP2_ERR_DISCARD_PKT; } in_rtb = &in_pktns->rtb; @@ -5421,9 +5548,7 @@ static int conn_on_retry(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd, return rv; } - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT, "odcid=0x%s", - (const char *)ngtcp2_encode_hex(cidbuf, retry.odcid.data, - retry.odcid.datalen)); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_PKT, "odcid=0x", &retry.odcid); if (retry.tokenlen == 0) { return NGTCP2_ERR_PROTO; @@ -5517,21 +5642,17 @@ static int conn_recv_ack(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_ack *fr, num_acked = ngtcp2_rtb_recv_ack(&pktns->rtb, fr, &conn->cstat, conn, pktns, pkt_ts, ts); - if (num_acked < 0) { + if (num_acked <= 0) { return (int)num_acked; } - if (num_acked == 0) { - return 0; - } - pktns->rtb.probe_pkt_left = 0; if (cstat->pto_count && (conn->server || (conn->flags & NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED))) { /* Reset PTO count but no less than 2 to avoid frequent probe packet transmission. */ - cstat->pto_count = ngtcp2_min_size(cstat->pto_count, 2); + cstat->pto_count = ngtcp2_min(cstat->pto_count, 2); } ngtcp2_conn_set_loss_detection_timer(conn, ts); @@ -5675,7 +5796,7 @@ static int conn_recv_max_stream_data(ngtcp2_conn *conn, * conn_recv_max_data processes received MAX_DATA frame |fr|. */ static void conn_recv_max_data(ngtcp2_conn *conn, const ngtcp2_max_data *fr) { - conn->tx.max_offset = ngtcp2_max_uint64(conn->tx.max_offset, fr->max_data); + conn->tx.max_offset = ngtcp2_max(conn->tx.max_offset, fr->max_data); } /* @@ -5860,9 +5981,9 @@ decrypt_hp(ngtcp2_pkt_hd *hd, uint8_t *dest, const ngtcp2_crypto_cipher *hp, } if (hd->flags & NGTCP2_PKT_FLAG_LONG_FORM) { - dest[0] = (uint8_t)(dest[0] ^ (mask[0] & 0x0f)); + dest[0] = (uint8_t)(dest[0] ^ (mask[0] & 0x0FU)); } else { - dest[0] = (uint8_t)(dest[0] ^ (mask[0] & 0x1f)); + dest[0] = (uint8_t)(dest[0] ^ (mask[0] & 0x1FU)); if (dest[0] & NGTCP2_SHORT_KEY_PHASE_BIT) { hd->flags |= NGTCP2_PKT_FLAG_KEY_PHASE; } @@ -5907,7 +6028,7 @@ conn_emit_pending_crypto_data(ngtcp2_conn *conn, } for (;;) { - datalen = ngtcp2_rob_data_at(strm->rx.rob, &data, rx_offset); + datalen = (size_t)ngtcp2_rob_data_at(strm->rx.rob, &data, rx_offset); if (datalen == 0) { assert(rx_offset == ngtcp2_strm_rx_offset(strm)); return 0; @@ -5956,7 +6077,7 @@ static int conn_recv_connection_close(ngtcp2_conn *conn, } } - ccerr->reasonlen = ngtcp2_min_size(fr->reasonlen, NGTCP2_CCERR_MAX_REASONLEN); + ccerr->reasonlen = ngtcp2_min(fr->reasonlen, NGTCP2_CCERR_MAX_REASONLEN); ngtcp2_cpymem((uint8_t *)ccerr->reason, fr->reason, ccerr->reasonlen); return 0; @@ -5977,7 +6098,7 @@ static void conn_recv_path_challenge(ngtcp2_conn *conn, const ngtcp2_path *path, } ent = ngtcp2_ringbuf_push_front(&conn->rx.path_challenge.rb); - ngtcp2_path_challenge_entry_init(ent, path, fr->data); + ngtcp2_path_challenge_entry_init(ent, path, &fr->data); } /* @@ -6047,7 +6168,7 @@ static int conn_recv_path_response(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd, return 0; } - rv = ngtcp2_pv_validate(pv, &ent_flags, fr->data); + rv = ngtcp2_pv_validate(pv, &ent_flags, &fr->data); if (rv != 0) { assert(!ngtcp2_err_is_fatal(rv)); @@ -6150,7 +6271,8 @@ static int conn_recv_path_response(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd, * pktns_pkt_num_is_duplicate returns nonzero if |pkt_num| is * duplicated packet number. */ -static int pktns_pkt_num_is_duplicate(ngtcp2_pktns *pktns, int64_t pkt_num) { +static int pktns_pkt_num_is_duplicate(const ngtcp2_pktns *pktns, + int64_t pkt_num) { return ngtcp2_gaptr_is_pushed(&pktns->rx.pngap, (uint64_t)pkt_num, 1); } @@ -6266,7 +6388,8 @@ static int vneg_available_versions_includes(const uint8_t *available_versions, * NGTCP2_ERR_INVALID_ARGUMENT * Clearing fixed bit is not permitted. */ -static int conn_verify_fixed_bit(ngtcp2_conn *conn, ngtcp2_pkt_hd *hd) { +static int conn_verify_fixed_bit(const ngtcp2_conn *conn, + const ngtcp2_pkt_hd *hd) { if (!(hd->flags & NGTCP2_PKT_FLAG_FIXED_BIT_CLEAR)) { return 0; } @@ -6351,8 +6474,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_tstamp ts) { ngtcp2_ssize nread; ngtcp2_pkt_hd hd; - ngtcp2_max_frame mfr; - ngtcp2_frame *fr = &mfr.fr; + ngtcp2_frame_decoder frd; + ngtcp2_frame fr; int rv; int require_ack = 0; size_t hdpktlen; @@ -6383,8 +6506,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, return 0; } - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, - "buffering 1RTT packet len=%zu", pktlen); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_CON, + "buffering 1RTT packet len=", pktlen); rv = conn_buffer_pkt(conn, &conn->pktns, path, pi, pkt, pktlen, dgramlen, ts); @@ -6531,8 +6654,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, } /* Buffer re-ordered 0-RTT packet. */ - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, - "buffering 0-RTT packet len=%zu", pktlen); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_CON, + "buffering 0-RTT packet len=", pktlen); rv = conn_buffer_pkt(conn, conn->in_pktns, path, pi, pkt, pktlen, dgramlen, ts); @@ -6554,11 +6677,11 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, if (conn->server) { if (dgramlen < NGTCP2_MAX_UDP_PAYLOAD_SIZE) { - ngtcp2_log_info( + ngtcp2_log_infof( &conn->log, NGTCP2_LOG_EVENT_PKT, "Initial packet was ignored because it is included in UDP datagram " - "less than %zu bytes: %zu bytes", - NGTCP2_MAX_UDP_PAYLOAD_SIZE, dgramlen); + "less than " stringify(NGTCP2_MAX_UDP_PAYLOAD_SIZE) " bytes: ", + dgramlen, " bytes"); return NGTCP2_ERR_DISCARD_PKT; } if (conn->local.settings.tokenlen) { @@ -6637,8 +6760,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, "Handshake packet at this point is unexpected and discarded"); return (ngtcp2_ssize)pktlen; } - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, - "buffering Handshake packet len=%zu", pktlen); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_CON, + "buffering Handshake packet len=", pktlen); rv = conn_buffer_pkt(conn, conn->hs_pktns, path, pi, pkt, pktlen, dgramlen, ts); @@ -6692,8 +6815,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, hd.pkt_num = ngtcp2_pkt_adjust_pkt_num(pktns->acktr.max_pkt_num, hd.pkt_num, hd.pkt_numlen); if (hd.pkt_num > NGTCP2_MAX_PKT_NUM) { - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT, - "pkn=%" PRId64 " is greater than maximum pkn", hd.pkt_num); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_PKT, "pkn=", hd.pkt_num, + " is greater than maximum pkn"); return NGTCP2_ERR_DISCARD_PKT; } @@ -6740,9 +6863,9 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, !conn->negotiated_version) { conn->negotiated_version = hd.version; - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, - "the negotiated version is 0x%08x", - conn->negotiated_version); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_CON, + "the negotiated version is 0x", + hexw(conn->negotiated_version, 8)); } payload = conn->crypto.decrypt_buf.base; @@ -6798,7 +6921,7 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_qlog_pkt_received_start(&conn->qlog); for (; payloadlen;) { - nread = ngtcp2_pkt_decode_frame(fr, payload, payloadlen); + nread = ngtcp2_frame_decoder_decode(&frd, &fr, payload, payloadlen); if (nread < 0) { return nread; } @@ -6806,14 +6929,14 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, payload += nread; payloadlen -= (size_t)nread; - switch (fr->type) { + switch (fr.hd.type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: - fr->ack.ack_delay = 0; - fr->ack.ack_delay_unscaled = 0; + fr.ack.ack_delay = 0; + fr.ack.ack_delay_unscaled = 0; rv = - ngtcp2_pkt_validate_ack(&fr->ack, conn->local.settings.initial_pkt_num); + ngtcp2_pkt_validate_ack(&fr.ack, conn->local.settings.initial_pkt_num); if (rv != 0) { return rv; } @@ -6821,9 +6944,9 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, break; } - ngtcp2_log_rx_fr(&conn->log, &hd, fr); + ngtcp2_log_rx_fr(&conn->log, &hd, &fr); - switch (fr->type) { + switch (fr.hd.type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: if (num_ack_processed >= NGTCP2_MAX_ACK_PER_PKT) { @@ -6832,7 +6955,7 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, if (!conn->server && hd.type == NGTCP2_PKT_HANDSHAKE) { conn->flags |= NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED; } - rv = conn_recv_ack(conn, pktns, &fr->ack, pkt_ts, ts); + rv = conn_recv_ack(conn, pktns, &fr.ack, pkt_ts, ts); if (rv != 0) { return rv; } @@ -6842,34 +6965,35 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, break; case NGTCP2_FRAME_CRYPTO: if (!conn->server && !conn->negotiated_version && - ngtcp2_vec_len(fr->stream.data, fr->stream.datacnt)) { + ngtcp2_vec_len(fr.stream.data, fr.stream.datacnt)) { conn->negotiated_version = hd.version; - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, - "the negotiated version is 0x%08x", - conn->negotiated_version); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_CON, + "the negotiated version is 0x", + hexw(conn->negotiated_version, 8)); } - rv = conn_recv_crypto(conn, encryption_level, crypto, &fr->stream, ts); + rv = conn_recv_crypto(conn, encryption_level, crypto, &fr.stream, ts); if (rv != 0) { return rv; } require_ack = 1; break; case NGTCP2_FRAME_CONNECTION_CLOSE: - rv = conn_recv_connection_close(conn, &fr->connection_close); + rv = conn_recv_connection_close(conn, &fr.connection_close); if (rv != 0) { return rv; } break; case NGTCP2_FRAME_PING: + ++conn->cstat.ping_recv; require_ack = 1; break; default: return NGTCP2_ERR_PROTO; } - ngtcp2_qlog_write_frame(&conn->qlog, fr); + ngtcp2_qlog_write_frame(&conn->qlog, &fr); } if (hd.type == NGTCP2_PKT_HANDSHAKE) { @@ -6929,6 +7053,10 @@ static ngtcp2_ssize conn_recv_handshake_cpkt(ngtcp2_conn *conn, const uint8_t *origpkt = pkt; uint32_t version; + if (pktlen == 0) { + return 0; + } + if (ngtcp2_path_eq(&conn->dcid.current.ps.path, path)) { conn->dcid.current.bytes_recv += dgramlen; } @@ -6956,6 +7084,8 @@ static ngtcp2_ssize conn_recv_handshake_cpkt(ngtcp2_conn *conn, return nread; } + ++conn->cstat.pkt_discarded; + /* If server discards first Initial, then drop connection state. This is because SCID in packet might be corrupted and the current connection state might wrongly discard @@ -6973,11 +7103,15 @@ static ngtcp2_ssize conn_recv_handshake_cpkt(ngtcp2_conn *conn, unrecoverable, therefore drop connection. */ return nread; } + + ++conn->cstat.pkt_discarded; + return (ngtcp2_ssize)dgramlen; } } if (nread == NGTCP2_ERR_DISCARD_PKT) { + ++conn->cstat.pkt_discarded; return (ngtcp2_ssize)dgramlen; } @@ -6993,8 +7127,11 @@ static ngtcp2_ssize conn_recv_handshake_cpkt(ngtcp2_conn *conn, pkt += nread; pktlen -= (size_t)nread; - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT, - "read packet %td left %zu", nread, pktlen); + ++conn->cstat.pkt_recv; + conn->cstat.bytes_recv += (uint64_t)nread; + + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_PKT, "read packet ", nread, + " left ", pktlen); } return (ngtcp2_ssize)dgramlen; @@ -7006,6 +7143,7 @@ int ngtcp2_conn_init_stream(ngtcp2_conn *conn, ngtcp2_strm *strm, uint64_t max_rx_offset; uint64_t max_tx_offset; int local_stream = conn_local_stream(conn, stream_id); + int bidi = bidi_stream(stream_id); assert(conn->remote.transport_params); @@ -7033,6 +7171,15 @@ int ngtcp2_conn_init_stream(ngtcp2_conn *conn, ngtcp2_strm *strm, max_tx_offset, stream_user_data, &conn->frc_objalloc, conn->mem); + if (!bidi) { + if (local_stream) { + ngtcp2_strm_shutdown(strm, NGTCP2_STRM_FLAG_SHUT_RD); + } else { + ngtcp2_strm_shutdown(strm, NGTCP2_STRM_FLAG_SHUT_WR); + strm->flags |= NGTCP2_STRM_FLAG_FIN_ACKED; + } + } + rv = ngtcp2_map_insert(&conn->strms, (ngtcp2_map_key_type)strm->stream_id, strm); if (rv != 0) { @@ -7065,7 +7212,7 @@ int ngtcp2_conn_init_stream(ngtcp2_conn *conn, ngtcp2_strm *strm, */ static int conn_emit_pending_stream_data(ngtcp2_conn *conn, ngtcp2_strm *strm, uint64_t rx_offset) { - size_t datalen; + uint64_t datalen; const uint8_t *data; int rv; uint64_t offset; @@ -7078,9 +7225,13 @@ static int conn_emit_pending_stream_data(ngtcp2_conn *conn, ngtcp2_strm *strm, for (;;) { /* Stop calling callback if application has called - ngtcp2_conn_shutdown_stream_read() inside the callback. - Because it doubly counts connection window. */ + ngtcp2_conn_shutdown_stream_read() inside the callback. */ if (strm->flags & NGTCP2_STRM_FLAG_STOP_SENDING) { + datalen = ngtcp2_strm_discard_ordered_data(strm, rx_offset); + if (datalen) { + ngtcp2_conn_extend_max_offset(conn, datalen); + } + return 0; } @@ -7102,17 +7253,12 @@ static int conn_emit_pending_stream_data(ngtcp2_conn *conn, ngtcp2_strm *strm, sdflags |= NGTCP2_STREAM_DATA_FLAG_0RTT; } - rv = conn_call_recv_stream_data(conn, strm, sdflags, offset, data, datalen); + rv = conn_call_recv_stream_data(conn, strm, sdflags, offset, data, + (size_t)datalen); if (rv != 0) { return rv; } - /* ngtcp2_conn_shutdown_stream_read from a callback will free - strm->rx.rob. */ - if (!strm->rx.rob) { - return 0; - } - ngtcp2_rob_pop(strm->rx.rob, rx_offset - datalen, datalen); } } @@ -7150,6 +7296,7 @@ static int conn_recv_crypto(ngtcp2_conn *conn, uint64_t rx_offset; int rv; ngtcp2_ssize nwrite; + size_t max_offset; if (fr->datacnt == 0) { if (encryption_level != NGTCP2_ENCRYPTION_LEVEL_INITIAL && @@ -7166,6 +7313,27 @@ static int conn_recv_crypto(ngtcp2_conn *conn, return NGTCP2_ERR_FRAME_ENCODING; } + /* Apply the absolute upper bound against CRYPTO data offset because + some TLS stacks do not care much about the number of bytes they + store. */ + switch (encryption_level) { + case NGTCP2_ENCRYPTION_LEVEL_INITIAL: + max_offset = NGTCP2_MAX_INITIAL_CRYPTO_OFFSET; + break; + case NGTCP2_ENCRYPTION_LEVEL_HANDSHAKE: + max_offset = NGTCP2_MAX_HANDSHAKE_CRYPTO_OFFSET; + break; + case NGTCP2_ENCRYPTION_LEVEL_1RTT: + max_offset = NGTCP2_MAX_1RTT_CRYPTO_OFFSET; + break; + default: + ngtcp2_unreachable(); + } + + if (fr_end_offset > max_offset) { + return NGTCP2_ERR_CRYPTO_BUFFER_EXCEEDED; + } + rx_offset = ngtcp2_strm_rx_offset(crypto); if (fr_end_offset <= rx_offset) { @@ -7195,8 +7363,7 @@ static int conn_recv_crypto(ngtcp2_conn *conn, return 0; } - crypto->rx.last_offset = - ngtcp2_max_uint64(crypto->rx.last_offset, fr_end_offset); + crypto->rx.last_offset = ngtcp2_max(crypto->rx.last_offset, fr_end_offset); /* TODO Before dispatching incoming data to TLS stack, make sure that previous data in previous encryption level has been @@ -7249,7 +7416,7 @@ static int conn_recv_crypto(ngtcp2_conn *conn, * conn_max_data_violated returns nonzero if receiving |datalen| * violates connection flow control on local endpoint. */ -static int conn_max_data_violated(ngtcp2_conn *conn, uint64_t datalen) { +static int conn_max_data_violated(const ngtcp2_conn *conn, uint64_t datalen) { return conn->rx.max_offset - conn->rx.offset < datalen; } @@ -7359,11 +7526,6 @@ static int conn_recv_stream(ngtcp2_conn *conn, const ngtcp2_stream *fr, new_strm = 1; - if (!bidi) { - ngtcp2_strm_shutdown(strm, NGTCP2_STRM_FLAG_SHUT_WR); - strm->flags |= NGTCP2_STRM_FLAG_FIN_ACKED; - } - rv = conn_call_stream_open(conn, strm); if (rv != 0) { return rv; @@ -7376,6 +7538,19 @@ static int conn_recv_stream(ngtcp2_conn *conn, const ngtcp2_stream *fr, return NGTCP2_ERR_FLOW_CONTROL; } + if (fr->fin) { + if (strm->flags & NGTCP2_STRM_FLAG_SHUT_RD) { + if (strm->rx.last_offset != fr_end_offset) { + return NGTCP2_ERR_FINAL_SIZE; + } + } else if (strm->rx.last_offset > fr_end_offset) { + return NGTCP2_ERR_FINAL_SIZE; + } + } else if ((strm->flags & NGTCP2_STRM_FLAG_SHUT_RD) && + strm->rx.last_offset < fr_end_offset) { + return NGTCP2_ERR_FINAL_SIZE; + } + if (strm->rx.last_offset < fr_end_offset) { uint64_t len = fr_end_offset - strm->rx.last_offset; @@ -7384,20 +7559,12 @@ static int conn_recv_stream(ngtcp2_conn *conn, const ngtcp2_stream *fr, } conn->rx.offset += len; - - if (strm->flags & NGTCP2_STRM_FLAG_STOP_SENDING) { - ngtcp2_conn_extend_max_offset(conn, len); - } - } + } rx_offset = ngtcp2_strm_rx_offset(strm); if (fr->fin) { if (strm->flags & NGTCP2_STRM_FLAG_SHUT_RD) { - if (strm->rx.last_offset != fr_end_offset) { - return NGTCP2_ERR_FINAL_SIZE; - } - if (strm->flags & NGTCP2_STRM_FLAG_RESET_STREAM_RECVED) { if (ngtcp2_ratelim_drain(&conn->glitch_rlim, 1, ts) != 0) { return NGTCP2_ERR_INTERNAL; @@ -7413,21 +7580,13 @@ static int conn_recv_stream(ngtcp2_conn *conn, const ngtcp2_stream *fr, return 0; } - } else if (strm->rx.last_offset > fr_end_offset) { - return NGTCP2_ERR_FINAL_SIZE; } else { strm->rx.last_offset = fr_end_offset; ngtcp2_strm_shutdown(strm, NGTCP2_STRM_FLAG_SHUT_RD); } } else { - if ((strm->flags & NGTCP2_STRM_FLAG_SHUT_RD) && - strm->rx.last_offset < fr_end_offset) { - return NGTCP2_ERR_FINAL_SIZE; - } - - strm->rx.last_offset = - ngtcp2_max_uint64(strm->rx.last_offset, fr_end_offset); + strm->rx.last_offset = ngtcp2_max(strm->rx.last_offset, fr_end_offset); if (fr_end_offset <= rx_offset) { if (!new_strm && ngtcp2_ratelim_drain(&conn->glitch_rlim, 1, ts) != 0) { @@ -7464,31 +7623,32 @@ static int conn_recv_stream(ngtcp2_conn *conn, const ngtcp2_stream *fr, } if (strm->flags & NGTCP2_STRM_FLAG_STOP_SENDING) { - return ngtcp2_conn_close_stream_if_shut_rdwr(conn, strm); - } - - fin = (strm->flags & NGTCP2_STRM_FLAG_SHUT_RD) && - rx_offset == strm->rx.last_offset; + datalen += ngtcp2_strm_discard_ordered_data(strm, rx_offset); + ngtcp2_conn_extend_max_offset(conn, datalen); + } else { + fin = (strm->flags & NGTCP2_STRM_FLAG_SHUT_RD) && + rx_offset == strm->rx.last_offset; - assert(fin || datalen); + assert(fin || datalen); - if (fin) { - sdflags |= NGTCP2_STREAM_DATA_FLAG_FIN; - } - if (!conn_is_tls_handshake_completed(conn)) { - sdflags |= NGTCP2_STREAM_DATA_FLAG_0RTT; - } - rv = conn_call_recv_stream_data(conn, strm, sdflags, offset, data, - (size_t)datalen); - if (rv != 0) { - return rv; - } + if (fin) { + sdflags |= NGTCP2_STREAM_DATA_FLAG_FIN; + } + if (!conn_is_tls_handshake_completed(conn)) { + sdflags |= NGTCP2_STREAM_DATA_FLAG_0RTT; + } + rv = conn_call_recv_stream_data(conn, strm, sdflags, offset, data, + (size_t)datalen); + if (rv != 0) { + return rv; + } - rv = conn_emit_pending_stream_data(conn, strm, rx_offset); - if (rv != 0) { - return rv; + rv = conn_emit_pending_stream_data(conn, strm, rx_offset); + if (rv != 0) { + return rv; + } } - } else if (fr->datacnt && !(strm->flags & NGTCP2_STRM_FLAG_STOP_SENDING)) { + } else if (fr->datacnt) { nwrite = ngtcp2_strm_recv_reordering(strm, fr->data[0].base, fr->data[0].len, fr->offset); if (nwrite < 0) { @@ -7514,14 +7674,15 @@ static int conn_recv_stream(ngtcp2_conn *conn, const ngtcp2_stream *fr, */ static int conn_reset_stream(ngtcp2_conn *conn, ngtcp2_strm *strm, uint64_t app_error_code) { - strm->flags |= NGTCP2_STRM_FLAG_SEND_RESET_STREAM; + strm->flags |= NGTCP2_STRM_FLAG_SEND_RESET_STREAM | + NGTCP2_STRM_FLAG_TX_RESET_STREAM_APP_ERROR_CODE_SET; strm->tx.reset_stream_app_error_code = app_error_code; if (ngtcp2_strm_is_tx_queued(strm)) { return 0; } - strm->cycle = conn_tx_strmq_first_cycle(conn); + strm->cycle = ngtcp2_conn_tx_strmq_first_cycle(conn); return ngtcp2_conn_tx_strmq_push(conn, strm); } @@ -7538,14 +7699,15 @@ static int conn_reset_stream(ngtcp2_conn *conn, ngtcp2_strm *strm, */ static int conn_stop_sending(ngtcp2_conn *conn, ngtcp2_strm *strm, uint64_t app_error_code) { - strm->flags |= NGTCP2_STRM_FLAG_SEND_STOP_SENDING; + strm->flags |= NGTCP2_STRM_FLAG_SEND_STOP_SENDING | + NGTCP2_STRM_FLAG_TX_STOP_SENDING_APP_ERROR_CODE_SET; strm->tx.stop_sending_app_error_code = app_error_code; if (ngtcp2_strm_is_tx_queued(strm)) { return 0; } - strm->cycle = conn_tx_strmq_first_cycle(conn); + strm->cycle = ngtcp2_conn_tx_strmq_first_cycle(conn); return ngtcp2_conn_tx_strmq_push(conn, strm); } @@ -7711,19 +7873,18 @@ static int conn_recv_reset_stream(ngtcp2_conn *conn, return rv; } + conn->rx.offset += datalen; + /* Extend connection flow control window for the amount of data which are not passed to application. */ - if (!(strm->flags & NGTCP2_STRM_FLAG_STOP_SENDING)) { - ngtcp2_conn_extend_max_offset(conn, strm->rx.last_offset - - ngtcp2_strm_rx_offset(strm)); - } - - conn->rx.offset += datalen; - ngtcp2_conn_extend_max_offset(conn, datalen); + ngtcp2_conn_extend_max_offset(conn, + fr->final_size - ngtcp2_strm_rx_offset(strm)); strm->rx.last_offset = fr->final_size; - strm->flags |= - NGTCP2_STRM_FLAG_SHUT_RD | NGTCP2_STRM_FLAG_RESET_STREAM_RECVED; + strm->flags |= NGTCP2_STRM_FLAG_SHUT_RD | + NGTCP2_STRM_FLAG_RESET_STREAM_RECVED | + NGTCP2_STRM_FLAG_RX_APP_ERROR_CODE_SET; + strm->rx.app_error_code = fr->app_error_code; ngtcp2_strm_set_app_error_code(strm, fr->app_error_code); @@ -7829,6 +7990,12 @@ static int conn_recv_stop_sending(ngtcp2_conn *conn, ngtcp2_strm_set_app_error_code(strm, fr->app_error_code); + rv = conn_call_recv_stop_sending(conn, fr->stream_id, fr->app_error_code, + strm->stream_user_data); + if (rv != 0) { + return rv; + } + /* No RESET_STREAM is required if we have sent FIN and all data have been acknowledged. */ if (!ngtcp2_strm_is_all_tx_data_fin_acked(strm) && @@ -7855,9 +8022,8 @@ static int conn_recv_stop_sending(ngtcp2_conn *conn, */ static int check_stateless_reset(const ngtcp2_dcid *dcid, const ngtcp2_path *path, - const ngtcp2_pkt_stateless_reset *sr) { - return ngtcp2_dcid_verify_stateless_reset_token( - dcid, path, sr->stateless_reset_token) == 0; + const ngtcp2_pkt_stateless_reset2 *sr) { + return ngtcp2_dcid_verify_stateless_reset_token(dcid, path, &sr->token) == 0; } /* @@ -7881,7 +8047,7 @@ static int conn_on_stateless_reset(ngtcp2_conn *conn, const ngtcp2_path *path, const uint8_t *payload, size_t payloadlen) { int rv; ngtcp2_pv *pv = conn->pv; - ngtcp2_pkt_stateless_reset sr; + ngtcp2_pkt_stateless_reset2 sr; rv = ngtcp2_pkt_decode_stateless_reset(&sr, payload, payloadlen); if (rv != 0) { @@ -7892,8 +8058,7 @@ static int conn_on_stateless_reset(ngtcp2_conn *conn, const ngtcp2_path *path, (!pv || (!check_stateless_reset(&pv->dcid, path, &sr) && (!(pv->flags & NGTCP2_PV_FLAG_FALLBACK_PRESENT) || !check_stateless_reset(&pv->fallback_dcid, path, &sr))))) { - rv = ngtcp2_dcidtr_verify_stateless_reset(&conn->dcid.dtr, path, - sr.stateless_reset_token); + rv = ngtcp2_dcidtr_verify_stateless_reset(&conn->dcid.dtr, path, &sr.token); if (rv != 0) { return rv; } @@ -7928,7 +8093,7 @@ static int conn_recv_max_streams(ngtcp2_conn *conn, return NGTCP2_ERR_FRAME_ENCODING; } - n = ngtcp2_min_uint64(fr->max_streams, NGTCP2_MAX_STREAMS); + n = ngtcp2_min(fr->max_streams, NGTCP2_MAX_STREAMS); if (fr->type == NGTCP2_FRAME_MAX_STREAMS_BIDI) { if (conn->local.bidi.max_streams < n) { @@ -7973,7 +8138,7 @@ static int conn_recv_new_connection_id(ngtcp2_conn *conn, } rv = ngtcp2_dcid_verify_uniqueness(&conn->dcid.current, fr->seq, &fr->cid, - fr->stateless_reset_token); + &fr->token); if (rv != 0) { return rv; } @@ -7982,8 +8147,8 @@ static int conn_recv_new_connection_id(ngtcp2_conn *conn, } if (pv) { - rv = ngtcp2_dcid_verify_uniqueness(&pv->dcid, fr->seq, &fr->cid, - fr->stateless_reset_token); + rv = + ngtcp2_dcid_verify_uniqueness(&pv->dcid, fr->seq, &fr->cid, &fr->token); if (rv != 0) { return rv; } @@ -7992,8 +8157,8 @@ static int conn_recv_new_connection_id(ngtcp2_conn *conn, } } - rv = ngtcp2_dcidtr_verify_token_uniqueness( - &conn->dcid.dtr, &found, fr->seq, &fr->cid, fr->stateless_reset_token); + rv = ngtcp2_dcidtr_verify_token_uniqueness(&conn->dcid.dtr, &found, fr->seq, + &fr->cid, &fr->token); if (rv != 0) { return rv; } @@ -8071,8 +8236,7 @@ static int conn_recv_new_connection_id(ngtcp2_conn *conn, return 0; } - ngtcp2_dcidtr_push_unused(&conn->dcid.dtr, fr->seq, &fr->cid, - fr->stateless_reset_token); + ngtcp2_dcidtr_push_unused(&conn->dcid.dtr, fr->seq, &fr->cid, &fr->token); return 0; } @@ -8372,11 +8536,6 @@ static int conn_recv_stream_data_blocked(ngtcp2_conn *conn, return rv; } - if (!bidi) { - ngtcp2_strm_shutdown(strm, NGTCP2_STRM_FLAG_SHUT_WR); - strm->flags |= NGTCP2_STRM_FLAG_FIN_ACKED; - } - rv = conn_call_stream_open(conn, strm); if (rv != 0) { return rv; @@ -8402,10 +8561,6 @@ static int conn_recv_stream_data_blocked(ngtcp2_conn *conn, } conn->rx.offset += datalen; - - if (strm->flags & NGTCP2_STRM_FLAG_STOP_SENDING) { - ngtcp2_conn_extend_max_offset(conn, datalen); - } } strm->rx.last_offset = fr->offset; @@ -8560,8 +8715,9 @@ static int conn_recv_datagram(ngtcp2_conn *conn, ngtcp2_datagram *fr) { * conn_key_phase_changed returns nonzero if |hd| indicates that the * key phase has unexpected value. */ -static int conn_key_phase_changed(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd) { - ngtcp2_pktns *pktns = &conn->pktns; +static int conn_key_phase_changed(const ngtcp2_conn *conn, + const ngtcp2_pkt_hd *hd) { + const ngtcp2_pktns *pktns = &conn->pktns; return !(pktns->crypto.rx.ckm->flags & NGTCP2_CRYPTO_KM_FLAG_KEY_PHASE_ONE) ^ !(hd->flags & NGTCP2_PKT_FLAG_KEY_PHASE); @@ -8575,7 +8731,7 @@ static int conn_initiate_key_update(ngtcp2_conn *conn, ngtcp2_tstamp ts); static int conn_prepare_key_update(ngtcp2_conn *conn, ngtcp2_tstamp ts) { int rv; ngtcp2_tstamp confirmed_ts = conn->crypto.key_update.confirmed_ts; - ngtcp2_duration pto = conn_compute_pto(conn, &conn->pktns); + ngtcp2_duration pto = ngtcp2_conn_compute_pto(conn, &conn->pktns); ngtcp2_pktns *pktns = &conn->pktns; ngtcp2_crypto_km *rx_ckm = pktns->crypto.rx.ckm; ngtcp2_crypto_km *tx_ckm = pktns->crypto.tx.ckm; @@ -8682,13 +8838,16 @@ static void conn_rotate_keys(ngtcp2_conn *conn, int64_t pkt_num, /* * conn_path_validation_in_progress returns nonzero if path validation - * against |path| is underway. + * against |path| is underway. Ignore the path validation with + * NGTCP2_PV_FLAG_DONT_CARE flag set, that is performed after the + * successful migration. Client might migrate back to this path. */ -static int conn_path_validation_in_progress(ngtcp2_conn *conn, +static int conn_path_validation_in_progress(const ngtcp2_conn *conn, const ngtcp2_path *path) { - ngtcp2_pv *pv = conn->pv; + const ngtcp2_pv *pv = conn->pv; - return pv && ngtcp2_path_eq(&pv->dcid.ps.path, path); + return pv && ngtcp2_path_eq(&pv->dcid.ps.path, path) && + !(pv->flags & NGTCP2_PV_FLAG_DONT_CARE); } /* @@ -8713,7 +8872,6 @@ static int conn_recv_non_probing_pkt_on_new_path(ngtcp2_conn *conn, ngtcp2_pv *pv = NULL; int rv; ngtcp2_duration pto; - int require_new_cid; int local_addr_eq; int pref_addr_migration; uint32_t remote_addr_cmp; @@ -8771,9 +8929,6 @@ static int conn_recv_non_probing_pkt_on_new_path(ngtcp2_conn *conn, * continue to use the current connection ID with the new remote * address while still sending from the same local address. */ - require_new_cid = conn->dcid.current.cid.datalen && - ((new_cid_used && remote_addr_cmp) || !local_addr_eq); - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "non-probing packet was received from new remote address"); @@ -8781,8 +8936,6 @@ static int conn_recv_non_probing_pkt_on_new_path(ngtcp2_conn *conn, ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "Found DCID which has already been bound to the new path"); - require_new_cid = 0; - if (dcid.cid.datalen) { rv = conn_call_activate_dcid(conn, &dcid); if (rv != 0) { @@ -8790,7 +8943,9 @@ static int conn_recv_non_probing_pkt_on_new_path(ngtcp2_conn *conn, } } } else { - if (require_new_cid) { + if (conn->dcid.current.cid.datalen && + ((new_cid_used && remote_addr_cmp) || !local_addr_eq)) { + /* New DCID is required. */ if (ngtcp2_dcidtr_unused_empty(&conn->dcid.dtr)) { return NGTCP2_ERR_CONN_ID_BLOCKED; } @@ -8817,7 +8972,7 @@ static int conn_recv_non_probing_pkt_on_new_path(ngtcp2_conn *conn, validated_path = ngtcp2_conn_find_path_history(conn, path, ts); if (!validated_path) { - pto = conn_compute_pto(conn, &conn->pktns); + pto = ngtcp2_conn_compute_pto(conn, &conn->pktns); rv = ngtcp2_pv_new(&pv, &dcid, conn_compute_pv_timeout_pto(conn, pto), NGTCP2_PV_FLAG_NONE, &conn->log, conn->mem); @@ -8955,8 +9110,8 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, const uint8_t *payload, size_t payloadlen, ngtcp2_tstamp pkt_ts, ngtcp2_tstamp ts) { ngtcp2_ssize nread; - ngtcp2_max_frame mfr; - ngtcp2_frame *fr = &mfr.fr; + ngtcp2_frame_decoder frd; + ngtcp2_frame fr; int rv; int require_ack = 0; ngtcp2_pktns *pktns; @@ -8974,7 +9129,7 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, ngtcp2_qlog_pkt_received_start(&conn->qlog); for (; payloadlen;) { - nread = ngtcp2_pkt_decode_frame(fr, payload, payloadlen); + nread = ngtcp2_frame_decoder_decode(&frd, &fr, payload, payloadlen); if (nread < 0) { return (int)nread; } @@ -8982,14 +9137,14 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, payload += nread; payloadlen -= (size_t)nread; - switch (fr->type) { + switch (fr.hd.type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: - fr->ack.ack_delay = 0; - fr->ack.ack_delay_unscaled = 0; + fr.ack.ack_delay = 0; + fr.ack.ack_delay_unscaled = 0; rv = - ngtcp2_pkt_validate_ack(&fr->ack, conn->local.settings.initial_pkt_num); + ngtcp2_pkt_validate_ack(&fr.ack, conn->local.settings.initial_pkt_num); if (rv != 0) { return rv; } @@ -8997,9 +9152,9 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, break; } - ngtcp2_log_rx_fr(&conn->log, hd, fr); + ngtcp2_log_rx_fr(&conn->log, hd, &fr); - switch (fr->type) { + switch (fr.hd.type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: if (num_ack_processed >= NGTCP2_MAX_ACK_PER_PKT) { @@ -9008,7 +9163,7 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, if (!conn->server) { conn->flags |= NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED; } - rv = conn_recv_ack(conn, pktns, &fr->ack, pkt_ts, ts); + rv = conn_recv_ack(conn, pktns, &fr.ack, pkt_ts, ts); if (rv != 0) { return rv; } @@ -9017,20 +9172,22 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, case NGTCP2_FRAME_PADDING: break; case NGTCP2_FRAME_CONNECTION_CLOSE: - rv = conn_recv_connection_close(conn, &fr->connection_close); + rv = conn_recv_connection_close(conn, &fr.connection_close); if (rv != 0) { return rv; } break; - case NGTCP2_FRAME_CRYPTO: case NGTCP2_FRAME_PING: + ++conn->cstat.ping_recv; + /* fall through */ + case NGTCP2_FRAME_CRYPTO: require_ack = 1; break; default: return NGTCP2_ERR_PROTO; } - ngtcp2_qlog_write_frame(&conn->qlog, fr); + ngtcp2_qlog_write_frame(&conn->qlog, &fr); } ngtcp2_qlog_pkt_received_end(&conn->qlog, hd, pktlen); @@ -9098,8 +9255,8 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, const uint8_t *payload; size_t payloadlen; ngtcp2_ssize nread, nwrite; - ngtcp2_max_frame mfr; - ngtcp2_frame *fr = &mfr.fr; + ngtcp2_frame_decoder frd; + ngtcp2_frame fr; int require_ack = 0; ngtcp2_crypto_aead *aead; ngtcp2_crypto_cipher *hp; @@ -9193,8 +9350,8 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, break; default: ngtcp2_log_rx_pkt_hd(&conn->log, &hd); - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT, - "packet type 0x%02x was ignored", hd.type); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_PKT, "packet type 0x", + hex(hd.type), " was ignored"); return (ngtcp2_ssize)pktlen; } } else { @@ -9241,8 +9398,8 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, hd.pkt_num = ngtcp2_pkt_adjust_pkt_num(pktns->acktr.max_pkt_num, hd.pkt_num, hd.pkt_numlen); if (hd.pkt_num > NGTCP2_MAX_PKT_NUM) { - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT, - "pkn=%" PRId64 " is greater than maximum pkn", hd.pkt_num); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_PKT, "pkn=", hd.pkt_num, + " is greater than maximum pkn"); return NGTCP2_ERR_DISCARD_PKT; } @@ -9253,12 +9410,10 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, conn->rx.preferred_addr.pkt_num < hd.pkt_num && ngtcp2_sockaddr_eq((const ngtcp2_sockaddr *)&conn->hs_local_addr, path->local.addr)) { - ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_PKT, - "pkt=%" PRId64 + ngtcp2_log_infof( + &conn->log, NGTCP2_LOG_EVENT_PKT, "pkt=", hd.pkt_num, " is discarded because it was received on handshake local " - "address after preferred address migration", - hd.pkt_num); + "address after preferred address migration"); return NGTCP2_ERR_DISCARD_PKT; } @@ -9405,7 +9560,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_qlog_pkt_received_start(&conn->qlog); for (; payloadlen;) { - nread = ngtcp2_pkt_decode_frame(fr, payload, payloadlen); + nread = ngtcp2_frame_decoder_decode(&frd, &fr, payload, payloadlen); if (nread < 0) { return nread; } @@ -9413,7 +9568,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, payload += nread; payloadlen -= (size_t)nread; - switch (fr->type) { + switch (fr.hd.type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: if ((hd.flags & NGTCP2_PKT_FLAG_LONG_FORM) && @@ -9422,10 +9577,10 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, } assert(conn->remote.transport_params); assign_recved_ack_delay_unscaled( - &fr->ack, conn->remote.transport_params->ack_delay_exponent); + &fr.ack, conn->remote.transport_params->ack_delay_exponent); rv = - ngtcp2_pkt_validate_ack(&fr->ack, conn->local.settings.initial_pkt_num); + ngtcp2_pkt_validate_ack(&fr.ack, conn->local.settings.initial_pkt_num); if (rv != 0) { return rv; } @@ -9433,10 +9588,10 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, break; } - ngtcp2_log_rx_fr(&conn->log, &hd, fr); + ngtcp2_log_rx_fr(&conn->log, &hd, &fr); if (hd.type == NGTCP2_PKT_0RTT) { - switch (fr->type) { + switch (fr.hd.type) { case NGTCP2_FRAME_PADDING: case NGTCP2_FRAME_PING: case NGTCP2_FRAME_RESET_STREAM: @@ -9462,7 +9617,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, } } - switch (fr->type) { + switch (fr.hd.type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: case NGTCP2_FRAME_PADDING: @@ -9473,7 +9628,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, require_ack = 1; } - switch (fr->type) { + switch (fr.hd.type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: if (num_ack_processed >= NGTCP2_MAX_ACK_PER_PKT) { @@ -9482,7 +9637,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, if (!conn->server) { conn->flags |= NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED; } - rv = conn_recv_ack(conn, pktns, &fr->ack, pkt_ts, ts); + rv = conn_recv_ack(conn, pktns, &fr.ack, pkt_ts, ts); if (rv != 0) { return rv; } @@ -9490,7 +9645,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, ++num_ack_processed; break; case NGTCP2_FRAME_STREAM: - rv = conn_recv_stream(conn, &fr->stream, ts); + rv = conn_recv_stream(conn, &fr.stream, ts); if (rv != 0) { return rv; } @@ -9498,40 +9653,40 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, break; case NGTCP2_FRAME_CRYPTO: rv = conn_recv_crypto(conn, NGTCP2_ENCRYPTION_LEVEL_1RTT, - &pktns->crypto.strm, &fr->stream, ts); + &pktns->crypto.strm, &fr.stream, ts); if (rv != 0) { return rv; } non_probing_pkt = 1; break; case NGTCP2_FRAME_RESET_STREAM: - rv = conn_recv_reset_stream(conn, &fr->reset_stream, ts); + rv = conn_recv_reset_stream(conn, &fr.reset_stream, ts); if (rv != 0) { return rv; } non_probing_pkt = 1; break; case NGTCP2_FRAME_STOP_SENDING: - rv = conn_recv_stop_sending(conn, &fr->stop_sending, ts); + rv = conn_recv_stop_sending(conn, &fr.stop_sending, ts); if (rv != 0) { return rv; } non_probing_pkt = 1; break; case NGTCP2_FRAME_MAX_STREAM_DATA: - rv = conn_recv_max_stream_data(conn, &fr->max_stream_data, ts); + rv = conn_recv_max_stream_data(conn, &fr.max_stream_data, ts); if (rv != 0) { return rv; } non_probing_pkt = 1; break; case NGTCP2_FRAME_MAX_DATA: - conn_recv_max_data(conn, &fr->max_data); + conn_recv_max_data(conn, &fr.max_data); non_probing_pkt = 1; break; case NGTCP2_FRAME_MAX_STREAMS_BIDI: case NGTCP2_FRAME_MAX_STREAMS_UNI: - rv = conn_recv_max_streams(conn, &fr->max_streams); + rv = conn_recv_max_streams(conn, &fr.max_streams); if (rv != 0) { return rv; } @@ -9539,41 +9694,42 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, break; case NGTCP2_FRAME_CONNECTION_CLOSE: case NGTCP2_FRAME_CONNECTION_CLOSE_APP: - rv = conn_recv_connection_close(conn, &fr->connection_close); + rv = conn_recv_connection_close(conn, &fr.connection_close); if (rv != 0) { return rv; } break; case NGTCP2_FRAME_PING: + ++conn->cstat.ping_recv; non_probing_pkt = 1; break; case NGTCP2_FRAME_PATH_CHALLENGE: - conn_recv_path_challenge(conn, path, &fr->path_challenge); + conn_recv_path_challenge(conn, path, &fr.path_challenge); path_challenge_recved = 1; break; case NGTCP2_FRAME_PATH_RESPONSE: - rv = conn_recv_path_response(conn, &hd, &fr->path_response, ts); + rv = conn_recv_path_response(conn, &hd, &fr.path_response, ts); if (rv != 0) { return rv; } break; case NGTCP2_FRAME_NEW_CONNECTION_ID: - rv = conn_recv_new_connection_id(conn, &fr->new_connection_id); + rv = conn_recv_new_connection_id(conn, &fr.new_connection_id); if (rv != 0) { return rv; } recv_ncid = 1; break; case NGTCP2_FRAME_RETIRE_CONNECTION_ID: - rv = conn_recv_retire_connection_id(conn, &hd, &fr->retire_connection_id, - ts); + rv = + conn_recv_retire_connection_id(conn, &hd, &fr.retire_connection_id, ts); if (rv != 0) { return rv; } non_probing_pkt = 1; break; case NGTCP2_FRAME_NEW_TOKEN: - rv = conn_recv_new_token(conn, &fr->new_token); + rv = conn_recv_new_token(conn, &fr.new_token); if (rv != 0) { return rv; } @@ -9587,28 +9743,28 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, non_probing_pkt = 1; break; case NGTCP2_FRAME_STREAMS_BLOCKED_BIDI: - rv = conn_recv_streams_blocked_bidi(conn, &fr->streams_blocked); + rv = conn_recv_streams_blocked_bidi(conn, &fr.streams_blocked); if (rv != 0) { return rv; } non_probing_pkt = 1; break; case NGTCP2_FRAME_STREAMS_BLOCKED_UNI: - rv = conn_recv_streams_blocked_uni(conn, &fr->streams_blocked); + rv = conn_recv_streams_blocked_uni(conn, &fr.streams_blocked); if (rv != 0) { return rv; } non_probing_pkt = 1; break; case NGTCP2_FRAME_STREAM_DATA_BLOCKED: - rv = conn_recv_stream_data_blocked(conn, &fr->stream_data_blocked); + rv = conn_recv_stream_data_blocked(conn, &fr.stream_data_blocked); if (rv != 0) { return rv; } non_probing_pkt = 1; break; case NGTCP2_FRAME_DATA_BLOCKED: - rv = conn_recv_data_blocked(conn, &fr->data_blocked); + rv = conn_recv_data_blocked(conn, &fr.data_blocked); if (rv != 0) { return rv; } @@ -9620,7 +9776,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, conn->local.transport_params.max_datagram_frame_size) { return NGTCP2_ERR_PROTO; } - rv = conn_recv_datagram(conn, &fr->datagram); + rv = conn_recv_datagram(conn, &fr.datagram); if (rv != 0) { return rv; } @@ -9628,7 +9784,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, break; } - ngtcp2_qlog_write_frame(&conn->qlog, fr); + ngtcp2_qlog_write_frame(&conn->qlog, &fr); } ngtcp2_qlog_pkt_received_end(&conn->qlog, &hd, pktlen); @@ -9743,6 +9899,7 @@ static int conn_process_buffered_protected_pkt(ngtcp2_conn *conn, *ppc = next; if (nread < 0) { if (nread == NGTCP2_ERR_DISCARD_PKT) { + ++conn->cstat.pkt_discarded; continue; } return (int)nread; @@ -9777,6 +9934,7 @@ static int conn_process_buffered_handshake_pkt(ngtcp2_conn *conn, *ppc = next; if (nread < 0) { if (nread == NGTCP2_ERR_DISCARD_PKT) { + ++conn->cstat.pkt_discarded; continue; } return (int)nread; @@ -9922,6 +10080,7 @@ static int conn_recv_cpkt(ngtcp2_conn *conn, const ngtcp2_path *path, } } if (nread == NGTCP2_ERR_DISCARD_PKT) { + ++conn->cstat.pkt_discarded; return 0; } return (int)nread; @@ -9931,8 +10090,11 @@ static int conn_recv_cpkt(ngtcp2_conn *conn, const ngtcp2_path *path, pkt += nread; pktlen -= (size_t)nread; - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT, - "read packet %td left %zu", nread, pktlen); + ++conn->cstat.pkt_recv; + conn->cstat.bytes_recv += (uint64_t)nread; + + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_PKT, "read packet ", nread, + " left ", pktlen); } return 0; @@ -9954,7 +10116,7 @@ static int conn_enqueue_handshake_done(ngtcp2_conn *conn) { return rv; } - nfrc->fr.type = NGTCP2_FRAME_HANDSHAKE_DONE; + nfrc->fr.handshake_done.type = NGTCP2_FRAME_HANDSHAKE_DONE; nfrc->next = pktns->tx.frq; pktns->tx.frq = nfrc; @@ -10104,9 +10266,8 @@ static ngtcp2_ssize conn_read_handshake(ngtcp2_conn *conn, if ((size_t)nread < pktlen) { /* We have 1RTT packet and application rx key, but the handshake has not completed yet. */ - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, - "buffering 1RTT packet len=%zu", - pktlen - (size_t)nread); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_CON, + "buffering 1RTT packet len=", pktlen - (size_t)nread); rv = conn_buffer_pkt(conn, &conn->pktns, path, pi, pkt + nread, pktlen - (size_t)nread, pktlen, ts); @@ -10185,8 +10346,8 @@ int ngtcp2_conn_read_pkt_versioned(ngtcp2_conn *conn, const ngtcp2_path *path, conn_update_timestamp(conn, ts); - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "recv packet len=%zu", - pktlen); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_CON, + "recv packet len=", pktlen); if (pktlen == 0) { return 0; @@ -10198,6 +10359,8 @@ int ngtcp2_conn_read_pkt_versioned(ngtcp2_conn *conn, const ngtcp2_path *path, !ngtcp2_dcidtr_check_path_retired(&conn->dcid.dtr, path)) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "ignore packet from unknown path"); + ++conn->cstat.pkt_discarded; + return 0; } @@ -10271,13 +10434,56 @@ int ngtcp2_conn_read_pkt_versioned(ngtcp2_conn *conn, const ngtcp2_path *path, return conn_recv_cpkt(conn, path, pi, pkt, pktlen, ts); } +int ngtcp2_conn_continue_handshake(ngtcp2_conn *conn, ngtcp2_tstamp ts) { + int rv; + ngtcp2_encryption_level encryption_level; + uint64_t offset; + + conn_update_timestamp(conn, ts); + + switch (conn->state) { + case NGTCP2_CS_CLIENT_INITIAL: + case NGTCP2_CS_CLIENT_WAIT_HANDSHAKE: + case NGTCP2_CS_SERVER_INITIAL: + case NGTCP2_CS_SERVER_WAIT_HANDSHAKE: + /* Most of the handshake interruption happens in Initial + encryption level, but this might not be the case depending on + the TLS stack and its functionality and where interruption + occurs. After all, we do not need to support all kinds of + interruptions. */ + if (conn->in_pktns) { + encryption_level = NGTCP2_ENCRYPTION_LEVEL_INITIAL; + offset = ngtcp2_strm_rx_offset(&conn->in_pktns->crypto.strm); + } else if (conn->hs_pktns) { + encryption_level = NGTCP2_ENCRYPTION_LEVEL_HANDSHAKE; + offset = ngtcp2_strm_rx_offset(&conn->hs_pktns->crypto.strm); + } else { + return 0; + } + + rv = conn_call_recv_crypto_data(conn, encryption_level, offset, NULL, 0); + if (rv != 0) { + return rv; + } + + return (int)conn_read_handshake(conn, /* path = */ NULL, /* pi = */ NULL, + /* pkt = */ NULL, 0, ts); + case NGTCP2_CS_CLOSING: + return NGTCP2_ERR_CLOSING; + case NGTCP2_CS_DRAINING: + return NGTCP2_ERR_DRAINING; + default: + return 0; + } +} + /* * conn_check_pkt_num_exhausted returns nonzero if packet number is * exhausted in at least one of packet number space. */ -static int conn_check_pkt_num_exhausted(ngtcp2_conn *conn) { - ngtcp2_pktns *in_pktns = conn->in_pktns; - ngtcp2_pktns *hs_pktns = conn->hs_pktns; +static int conn_check_pkt_num_exhausted(const ngtcp2_conn *conn) { + const ngtcp2_pktns *in_pktns = conn->in_pktns; + const ngtcp2_pktns *hs_pktns = conn->hs_pktns; return (in_pktns && in_pktns->tx.last_pkt_num == NGTCP2_MAX_PKT_NUM) || (hs_pktns && hs_pktns->tx.last_pkt_num == NGTCP2_MAX_PKT_NUM) || @@ -10301,7 +10507,7 @@ conn_retransmit_retry_early(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, * packets to be sent for Initial or Handshake packet number space * left. */ -static int conn_handshake_probe_left(ngtcp2_conn *conn) { +static int conn_handshake_probe_left(const ngtcp2_conn *conn) { return (conn->in_pktns && conn->in_pktns->rtb.probe_pkt_left) || conn->hs_pktns->rtb.probe_pkt_left; } @@ -10312,7 +10518,8 @@ static int conn_handshake_probe_left(ngtcp2_conn *conn) { * are not reduced. This function is only used by client and should * only be called when early data is accepted by server. */ -static int conn_validate_early_transport_params_limits(ngtcp2_conn *conn) { +static int +conn_validate_early_transport_params_limits(const ngtcp2_conn *conn) { const ngtcp2_transport_params *params = conn->remote.transport_params; assert(!conn->server); @@ -10372,6 +10579,7 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, size_t origlen = destlen; uint64_t pending_early_datalen; ngtcp2_preferred_addr *paddr; + ngtcp2_stateless_reset_token token; switch (conn->state) { case NGTCP2_CS_CLIENT_INITIAL: @@ -10499,8 +10707,8 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, assert(!ngtcp2_dcidtr_unused_full(&conn->dcid.dtr)); paddr = &conn->remote.transport_params->preferred_addr; - ngtcp2_dcidtr_push_unused(&conn->dcid.dtr, 1, &paddr->cid, - paddr->stateless_reset_token); + memcpy(token.data, paddr->stateless_reset_token, sizeof(token.data)); + ngtcp2_dcidtr_push_unused(&conn->dcid.dtr, 1, &paddr->cid, &token); rv = ngtcp2_gaptr_push(&conn->dcid.seqgap, 1, 1); if (rv != 0) { @@ -10508,12 +10716,12 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } } - if (conn->remote.transport_params->stateless_reset_token_present) { - assert(conn->dcid.current.seq == 0); + if (conn->remote.transport_params->stateless_reset_token_present && + conn->dcid.current.seq == 0) { assert(!(conn->dcid.current.flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT)); - ngtcp2_dcid_set_token( - &conn->dcid.current, - conn->remote.transport_params->stateless_reset_token); + memcpy(token.data, conn->remote.transport_params->stateless_reset_token, + sizeof(token.data)); + ngtcp2_dcid_set_token(&conn->dcid.current, &token); } rv = conn_call_activate_dcid(conn, &conn->dcid.current); @@ -10552,8 +10760,6 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } res += nwrite; - dest += nwrite; - destlen -= (size_t)nwrite; } if (res == 0) { @@ -10563,8 +10769,6 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } res += nwrite; - dest += nwrite; - origlen -= (size_t)nwrite; } return res; @@ -10623,8 +10827,8 @@ conn_client_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, datalen = ngtcp2_vec_len(vmsg->stream.data, vmsg->stream.datacnt); send_stream = conn_retry_early_payloadlen(conn) == 0; if (send_stream) { - write_datalen = ngtcp2_min_uint64(datalen + NGTCP2_STREAM_OVERHEAD, - NGTCP2_MIN_COALESCED_PAYLOADLEN); + write_datalen = ngtcp2_min(datalen + NGTCP2_STREAM_OVERHEAD, + NGTCP2_MIN_COALESCED_PAYLOADLEN); if (vmsg->stream.flags & NGTCP2_WRITE_STREAM_FLAG_MORE) { wflags |= NGTCP2_WRITE_PKT_FLAG_MORE; @@ -10716,6 +10920,10 @@ void ngtcp2_conn_tls_handshake_completed(ngtcp2_conn *conn) { } int ngtcp2_conn_get_handshake_completed(ngtcp2_conn *conn) { + return ngtcp2_conn_get_handshake_completed2(conn); +} + +int ngtcp2_conn_get_handshake_completed2(const ngtcp2_conn *conn) { return conn_is_tls_handshake_completed(conn) && (conn->flags & NGTCP2_CONN_FLAG_HANDSHAKE_COMPLETED); } @@ -10800,6 +11008,9 @@ int ngtcp2_conn_install_initial_key( rv = ngtcp2_crypto_km_new(&pktns->crypto.tx.ckm, NULL, 0, NULL, tx_iv, ivlen, conn->mem); if (rv != 0) { + ngtcp2_crypto_km_del(pktns->crypto.rx.ckm, conn->mem); + pktns->crypto.rx.ckm = NULL; + return rv; } @@ -10850,6 +11061,9 @@ int ngtcp2_conn_install_vneg_initial_key( rv = ngtcp2_crypto_km_new(&conn->vneg.tx.ckm, NULL, 0, NULL, tx_iv, ivlen, conn->mem); if (rv != 0) { + ngtcp2_crypto_km_del(conn->vneg.rx.ckm, conn->mem); + conn->vneg.rx.ckm = NULL; + return rv; } @@ -10887,8 +11101,7 @@ int ngtcp2_conn_install_rx_handshake_key( if (rv != 0) { ngtcp2_crypto_km_del(pktns->crypto.rx.ckm, conn->mem); pktns->crypto.rx.ckm = NULL; - - memset(&pktns->crypto.rx.hp_ctx, 0, sizeof(pktns->crypto.rx.hp_ctx)); + pktns->crypto.rx.hp_ctx = (ngtcp2_crypto_cipher_ctx){0}; return rv; } @@ -10918,21 +11131,26 @@ int ngtcp2_conn_install_tx_handshake_key( if (conn->server) { rv = ngtcp2_conn_commit_local_transport_params(conn); if (rv != 0) { - return rv; + goto fail; } } rv = conn_call_recv_tx_key(conn, NGTCP2_ENCRYPTION_LEVEL_HANDSHAKE); if (rv != 0) { - ngtcp2_crypto_km_del(pktns->crypto.tx.ckm, conn->mem); - pktns->crypto.tx.ckm = NULL; - - memset(&pktns->crypto.tx.hp_ctx, 0, sizeof(pktns->crypto.tx.hp_ctx)); - - return rv; + goto fail; } return 0; + +fail: + /* If this function fails, aead_ctx and hp_ctx are still owned by + the caller. Delete the install key to remove the any reference + to them. */ + ngtcp2_crypto_km_del(pktns->crypto.tx.ckm, conn->mem); + pktns->crypto.tx.ckm = NULL; + pktns->crypto.tx.hp_ctx = (ngtcp2_crypto_cipher_ctx){0}; + + return rv; } int ngtcp2_conn_install_0rtt_key(ngtcp2_conn *conn, @@ -10963,8 +11181,7 @@ int ngtcp2_conn_install_0rtt_key(ngtcp2_conn *conn, if (rv != 0) { ngtcp2_crypto_km_del(conn->early.ckm, conn->mem); conn->early.ckm = NULL; - - memset(&conn->early.hp_ctx, 0, sizeof(conn->early.hp_ctx)); + conn->early.hp_ctx = (ngtcp2_crypto_cipher_ctx){0}; return rv; } @@ -11011,8 +11228,7 @@ int ngtcp2_conn_install_rx_key(ngtcp2_conn *conn, const uint8_t *secret, if (rv != 0) { ngtcp2_crypto_km_del(pktns->crypto.rx.ckm, conn->mem); pktns->crypto.rx.ckm = NULL; - - memset(&pktns->crypto.rx.hp_ctx, 0, sizeof(pktns->crypto.rx.hp_ctx)); + pktns->crypto.rx.hp_ctx = (ngtcp2_crypto_cipher_ctx){0}; return rv; } @@ -11057,8 +11273,7 @@ int ngtcp2_conn_install_tx_key(ngtcp2_conn *conn, const uint8_t *secret, if (rv != 0) { ngtcp2_crypto_km_del(pktns->crypto.tx.ckm, conn->mem); pktns->crypto.tx.ckm = NULL; - - memset(&pktns->crypto.tx.hp_ctx, 0, sizeof(pktns->crypto.tx.hp_ctx)); + pktns->crypto.tx.hp_ctx = (ngtcp2_crypto_cipher_ctx){0}; return rv; } @@ -11068,7 +11283,7 @@ int ngtcp2_conn_install_tx_key(ngtcp2_conn *conn, const uint8_t *secret, static int conn_initiate_key_update(ngtcp2_conn *conn, ngtcp2_tstamp ts) { ngtcp2_tstamp confirmed_ts = conn->crypto.key_update.confirmed_ts; - ngtcp2_duration pto = conn_compute_pto(conn, &conn->pktns); + ngtcp2_duration pto = ngtcp2_conn_compute_pto(conn, &conn->pktns); assert(conn->state == NGTCP2_CS_POST_HANDSHAKE); @@ -11091,13 +11306,13 @@ int ngtcp2_conn_initiate_key_update(ngtcp2_conn *conn, ngtcp2_tstamp ts) { return conn_initiate_key_update(conn, ts); } -ngtcp2_tstamp ngtcp2_conn_loss_detection_expiry(ngtcp2_conn *conn) { +ngtcp2_tstamp ngtcp2_conn_loss_detection_expiry(const ngtcp2_conn *conn) { return conn->cstat.loss_detection_timer; } -ngtcp2_tstamp ngtcp2_conn_internal_expiry(ngtcp2_conn *conn) { +ngtcp2_tstamp ngtcp2_conn_internal_expiry(const ngtcp2_conn *conn) { ngtcp2_tstamp res = UINT64_MAX, ts; - ngtcp2_duration pto = conn_compute_pto(conn, &conn->pktns); + ngtcp2_duration pto = ngtcp2_conn_compute_pto(conn, &conn->pktns); ngtcp2_scid *scid; if (conn->pv) { @@ -11105,38 +11320,38 @@ ngtcp2_tstamp ngtcp2_conn_internal_expiry(ngtcp2_conn *conn) { } if (conn->pmtud) { - res = ngtcp2_min_uint64(res, conn->pmtud->expiry); + res = ngtcp2_min(res, conn->pmtud->expiry); } if (!ngtcp2_pq_empty(&conn->scid.used)) { scid = ngtcp2_struct_of(ngtcp2_pq_top(&conn->scid.used), ngtcp2_scid, pe); if (scid->retired_ts != UINT64_MAX) { - res = ngtcp2_min_uint64(res, scid->retired_ts + pto); + res = ngtcp2_min(res, scid->retired_ts + pto); } } ts = ngtcp2_dcidtr_earliest_retired_ts(&conn->dcid.dtr); if (ts != UINT64_MAX) { - res = ngtcp2_min_uint64(res, ts + pto); + res = ngtcp2_min(res, ts + pto); } if (conn->dcid.current.cid.datalen) { ts = ngtcp2_dcidtr_earliest_bound_ts(&conn->dcid.dtr); if (ts != UINT64_MAX) { - res = ngtcp2_min_uint64(res, ts + 3 * pto); + res = ngtcp2_min(res, ts + 3 * pto); } } if (conn->server && conn->early.ckm && conn->early.discard_started_ts != UINT64_MAX) { - res = ngtcp2_min_uint64(res, conn->early.discard_started_ts + 3 * pto); + res = ngtcp2_min(res, conn->early.discard_started_ts + 3 * pto); } return res; } -ngtcp2_tstamp ngtcp2_conn_ack_delay_expiry(ngtcp2_conn *conn) { - ngtcp2_acktr *acktr = &conn->pktns.acktr; +ngtcp2_tstamp ngtcp2_conn_ack_delay_expiry(const ngtcp2_conn *conn) { + const ngtcp2_acktr *acktr = &conn->pktns.acktr; if (!(acktr->flags & NGTCP2_ACKTR_FLAG_CANCEL_TIMER) && acktr->first_unacked_ts != UINT64_MAX) { @@ -11145,7 +11360,7 @@ ngtcp2_tstamp ngtcp2_conn_ack_delay_expiry(ngtcp2_conn *conn) { return UINT64_MAX; } -static ngtcp2_tstamp conn_handshake_expiry(ngtcp2_conn *conn) { +static ngtcp2_tstamp conn_handshake_expiry(const ngtcp2_conn *conn) { if (conn_is_tls_handshake_completed(conn) || conn->local.settings.handshake_timeout == UINT64_MAX || conn->local.settings.initial_ts >= @@ -11158,14 +11373,18 @@ static ngtcp2_tstamp conn_handshake_expiry(ngtcp2_conn *conn) { } ngtcp2_tstamp ngtcp2_conn_get_expiry(ngtcp2_conn *conn) { - ngtcp2_tstamp res = ngtcp2_min_uint64(ngtcp2_conn_loss_detection_expiry(conn), - ngtcp2_conn_ack_delay_expiry(conn)); - res = ngtcp2_min_uint64(res, ngtcp2_conn_internal_expiry(conn)); - res = ngtcp2_min_uint64(res, ngtcp2_conn_lost_pkt_expiry(conn)); - res = ngtcp2_min_uint64(res, conn_keep_alive_expiry(conn)); - res = ngtcp2_min_uint64(res, conn_handshake_expiry(conn)); - res = ngtcp2_min_uint64(res, ngtcp2_conn_get_idle_expiry(conn)); - return ngtcp2_min_uint64(res, conn->tx.pacing.next_ts); + return ngtcp2_conn_get_expiry2(conn); +} + +ngtcp2_tstamp ngtcp2_conn_get_expiry2(const ngtcp2_conn *conn) { + ngtcp2_tstamp res = ngtcp2_min(ngtcp2_conn_loss_detection_expiry(conn), + ngtcp2_conn_ack_delay_expiry(conn)); + res = ngtcp2_min(res, ngtcp2_conn_internal_expiry(conn)); + res = ngtcp2_min(res, ngtcp2_conn_lost_pkt_expiry(conn)); + res = ngtcp2_min(res, conn_keep_alive_expiry(conn)); + res = ngtcp2_min(res, conn_handshake_expiry(conn)); + res = ngtcp2_min(res, ngtcp2_conn_get_idle_expiry(conn)); + return ngtcp2_min(res, conn->tx.pacing.next_ts); } int ngtcp2_conn_handle_expiry(ngtcp2_conn *conn, ngtcp2_tstamp ts) { @@ -11174,7 +11393,7 @@ int ngtcp2_conn_handle_expiry(ngtcp2_conn *conn, ngtcp2_tstamp ts) { conn_update_timestamp(conn, ts); - pto = conn_compute_pto(conn, &conn->pktns); + pto = ngtcp2_conn_compute_pto(conn, &conn->pktns); assert(!(conn->flags & NGTCP2_CONN_FLAG_PPE_PENDING)); @@ -11257,29 +11476,29 @@ void ngtcp2_conn_cancel_expired_ack_delay_timer(ngtcp2_conn *conn, acktr_cancel_expired_ack_delay_timer(&conn->pktns.acktr, ack_delay, ts); } -ngtcp2_tstamp ngtcp2_conn_lost_pkt_expiry(ngtcp2_conn *conn) { +ngtcp2_tstamp ngtcp2_conn_lost_pkt_expiry(const ngtcp2_conn *conn) { ngtcp2_tstamp res = UINT64_MAX, ts; if (conn->in_pktns) { ts = ngtcp2_rtb_lost_pkt_ts(&conn->in_pktns->rtb); if (ts != UINT64_MAX) { - ts += conn_compute_pto(conn, conn->in_pktns) * 3; - res = ngtcp2_min_uint64(res, ts); + ts += ngtcp2_conn_compute_pto(conn, conn->in_pktns) * 3; + res = ngtcp2_min(res, ts); } } if (conn->hs_pktns) { ts = ngtcp2_rtb_lost_pkt_ts(&conn->hs_pktns->rtb); if (ts != UINT64_MAX) { - ts += conn_compute_pto(conn, conn->hs_pktns) * 3; - res = ngtcp2_min_uint64(res, ts); + ts += ngtcp2_conn_compute_pto(conn, conn->hs_pktns) * 3; + res = ngtcp2_min(res, ts); } } ts = ngtcp2_rtb_lost_pkt_ts(&conn->pktns.rtb); if (ts != UINT64_MAX) { - ts += conn_compute_pto(conn, &conn->pktns) * 3; - res = ngtcp2_min_uint64(res, ts); + ts += ngtcp2_conn_compute_pto(conn, &conn->pktns) * 3; + res = ngtcp2_min(res, ts); } return res; @@ -11289,14 +11508,14 @@ void ngtcp2_conn_remove_lost_pkt(ngtcp2_conn *conn, ngtcp2_tstamp ts) { ngtcp2_duration timeout; if (conn->in_pktns) { - timeout = conn_compute_pto(conn, conn->in_pktns) * 3; + timeout = ngtcp2_conn_compute_pto(conn, conn->in_pktns) * 3; ngtcp2_rtb_remove_expired_lost_pkt(&conn->in_pktns->rtb, timeout, ts); } if (conn->hs_pktns) { - timeout = conn_compute_pto(conn, conn->hs_pktns) * 3; + timeout = ngtcp2_conn_compute_pto(conn, conn->hs_pktns) * 3; ngtcp2_rtb_remove_expired_lost_pkt(&conn->hs_pktns->rtb, timeout, ts); } - timeout = conn_compute_pto(conn, &conn->pktns) * 3; + timeout = ngtcp2_conn_compute_pto(conn, &conn->pktns) * 3; ngtcp2_rtb_remove_expired_lost_pkt(&conn->pktns.rtb, timeout, ts); } @@ -11353,7 +11572,7 @@ static uint32_t select_preferred_version(const uint32_t *preferred_versions, * Validation against version negotiation parameters failed. */ static int -conn_client_validate_transport_params(ngtcp2_conn *conn, +conn_client_validate_transport_params(const ngtcp2_conn *conn, const ngtcp2_transport_params *params) { if (!params->original_dcid_present) { return NGTCP2_ERR_REQUIRED_TRANSPORT_PARAM; @@ -11516,9 +11735,9 @@ int ngtcp2_conn_set_remote_transport_params( conn->local.transport_params.version_info.chosen_version = conn->negotiated_version; - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, - "the negotiated version is 0x%08x", - conn->negotiated_version); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_CON, + "the negotiated version is 0x", + hexw(conn->negotiated_version, 8)); } else { rv = conn_client_validate_transport_params(conn, params); if (rv != 0) { @@ -11574,6 +11793,11 @@ int ngtcp2_conn_decode_and_set_remote_transport_params(ngtcp2_conn *conn, const ngtcp2_transport_params * ngtcp2_conn_get_remote_transport_params(ngtcp2_conn *conn) { + return ngtcp2_conn_get_remote_transport_params2(conn); +} + +const ngtcp2_transport_params * +ngtcp2_conn_get_remote_transport_params2(const ngtcp2_conn *conn) { if (conn->remote.pending_transport_params) { return conn->remote.pending_transport_params; } @@ -11584,7 +11808,14 @@ ngtcp2_conn_get_remote_transport_params(ngtcp2_conn *conn) { ngtcp2_ssize ngtcp2_conn_encode_0rtt_transport_params(ngtcp2_conn *conn, uint8_t *dest, size_t destlen) { - ngtcp2_transport_params params, *src; + return ngtcp2_conn_encode_0rtt_transport_params2(conn, dest, destlen); +} + +ngtcp2_ssize ngtcp2_conn_encode_0rtt_transport_params2(const ngtcp2_conn *conn, + uint8_t *dest, + size_t destlen) { + ngtcp2_transport_params params; + const ngtcp2_transport_params *src; if (conn->server) { src = &conn->local.transport_params; @@ -11657,34 +11888,31 @@ int ngtcp2_conn_set_0rtt_remote_transport_params( p->initial_max_data = params->initial_max_data; /* we might hit garbage, then set the sane default. */ p->active_connection_id_limit = - ngtcp2_max_uint64(NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT, - params->active_connection_id_limit); + ngtcp2_max(NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT, + params->active_connection_id_limit); p->max_datagram_frame_size = params->max_datagram_frame_size; /* we might hit garbage, then set the sane default. */ if (params->max_udp_payload_size) { - p->max_udp_payload_size = ngtcp2_max_uint64(NGTCP2_MAX_UDP_PAYLOAD_SIZE, - params->max_udp_payload_size); + p->max_udp_payload_size = + ngtcp2_max(NGTCP2_MAX_UDP_PAYLOAD_SIZE, params->max_udp_payload_size); } /* These parameters are treated specially. If server accepts early data, it must not set values for these parameters that are smaller than these remembered values. */ - conn->early.transport_params.initial_max_streams_bidi = - params->initial_max_streams_bidi; - conn->early.transport_params.initial_max_streams_uni = - params->initial_max_streams_uni; - conn->early.transport_params.initial_max_stream_data_bidi_local = - params->initial_max_stream_data_bidi_local; - conn->early.transport_params.initial_max_stream_data_bidi_remote = - params->initial_max_stream_data_bidi_remote; - conn->early.transport_params.initial_max_stream_data_uni = - params->initial_max_stream_data_uni; - conn->early.transport_params.initial_max_data = params->initial_max_data; - conn->early.transport_params.active_connection_id_limit = - params->active_connection_id_limit; - conn->early.transport_params.max_datagram_frame_size = - params->max_datagram_frame_size; + conn->early.transport_params = (ngtcp2_early_transport_params){ + .initial_max_streams_bidi = params->initial_max_streams_bidi, + .initial_max_streams_uni = params->initial_max_streams_uni, + .initial_max_stream_data_bidi_local = + params->initial_max_stream_data_bidi_local, + .initial_max_stream_data_bidi_remote = + params->initial_max_stream_data_bidi_remote, + .initial_max_stream_data_uni = params->initial_max_stream_data_uni, + .initial_max_data = params->initial_max_data, + .active_connection_id_limit = params->active_connection_id_limit, + .max_datagram_frame_size = params->max_datagram_frame_size, + }; conn_sync_stream_id_limit(conn); @@ -11768,12 +11996,23 @@ int ngtcp2_conn_commit_local_transport_params(ngtcp2_conn *conn) { const ngtcp2_transport_params * ngtcp2_conn_get_local_transport_params(ngtcp2_conn *conn) { + return ngtcp2_conn_get_local_transport_params2(conn); +} + +const ngtcp2_transport_params * +ngtcp2_conn_get_local_transport_params2(const ngtcp2_conn *conn) { return &conn->local.transport_params; } ngtcp2_ssize ngtcp2_conn_encode_local_transport_params(ngtcp2_conn *conn, uint8_t *dest, size_t destlen) { + return ngtcp2_conn_encode_local_transport_params2(conn, dest, destlen); +} + +ngtcp2_ssize ngtcp2_conn_encode_local_transport_params2(const ngtcp2_conn *conn, + uint8_t *dest, + size_t destlen) { return ngtcp2_transport_params_encode(dest, destlen, &conn->local.transport_params); } @@ -11783,7 +12022,7 @@ int ngtcp2_conn_open_bidi_stream(ngtcp2_conn *conn, int64_t *pstream_id, int rv; ngtcp2_strm *strm; - if (ngtcp2_conn_get_streams_bidi_left(conn) == 0) { + if (ngtcp2_conn_get_streams_bidi_left2(conn) == 0) { return NGTCP2_ERR_STREAM_ID_BLOCKED; } @@ -11810,7 +12049,7 @@ int ngtcp2_conn_open_uni_stream(ngtcp2_conn *conn, int64_t *pstream_id, int rv; ngtcp2_strm *strm; - if (ngtcp2_conn_get_streams_uni_left(conn) == 0) { + if (ngtcp2_conn_get_streams_uni_left2(conn) == 0) { return NGTCP2_ERR_STREAM_ID_BLOCKED; } @@ -11825,15 +12064,14 @@ int ngtcp2_conn_open_uni_stream(ngtcp2_conn *conn, int64_t *pstream_id, ngtcp2_objalloc_strm_release(&conn->strm_objalloc, strm); return rv; } - ngtcp2_strm_shutdown(strm, NGTCP2_STRM_FLAG_SHUT_RD); - *pstream_id = conn->local.uni.next_stream_id; conn->local.uni.next_stream_id += 4; return 0; } -ngtcp2_strm *ngtcp2_conn_find_stream(ngtcp2_conn *conn, int64_t stream_id) { +ngtcp2_strm *ngtcp2_conn_find_stream(const ngtcp2_conn *conn, + int64_t stream_id) { return ngtcp2_map_find(&conn->strms, (uint64_t)stream_id); } @@ -11860,6 +12098,12 @@ ngtcp2_ssize ngtcp2_conn_write_stream_versioned( stream_id, v, datacnt, ts); } +static int conn_no_app_data_written(const ngtcp2_conn *conn) { + const ngtcp2_frame_counts *counts = &conn->frame_counts; + + return counts->crypto == 0 && counts->stream == 0; +} + static ngtcp2_ssize conn_write_vmsg_wrapper(ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, ngtcp2_pkt_info *pi, @@ -11874,21 +12118,15 @@ conn_write_vmsg_wrapper(ngtcp2_conn *conn, ngtcp2_path *path, return nwrite; } + assert((size_t)nwrite <= destlen); + if (cstat->bytes_in_flight >= cstat->cwnd) { conn->rst.is_cwnd_limited = 1; - } else if ((cstat->cwnd >= cstat->ssthresh || - cstat->bytes_in_flight * 2 < cstat->cwnd) && - nwrite == 0 && conn_pacing_pkt_tx_allowed(conn, ts) && - (conn->flags & NGTCP2_CONN_FLAG_HANDSHAKE_COMPLETED) && - /* Because NGTCP2_CONN_FLAG_AGGREGATE_PKTS is set after a - packet is produced, if it is set, we are sure that we - are not app-limited. */ - !(conn->flags & NGTCP2_CONN_FLAG_AGGREGATE_PKTS)) { - conn->rst.app_limited = conn->rst.delivered + cstat->bytes_in_flight; - - if (conn->rst.app_limited == 0) { - conn->rst.app_limited = cstat->max_tx_udp_payload_size; - } + } else if (conn_pacing_pkt_tx_allowed(conn, ts) && !vmsg && + conn_no_app_data_written(conn) && + (!path || ngtcp2_path_eq(&conn->dcid.current.ps.path, path))) { + conn->rst.app_limited = + ngtcp2_max(conn->rst.delivered + cstat->bytes_in_flight, 1); } return nwrite; @@ -11932,12 +12170,17 @@ ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( return NGTCP2_ERR_INVALID_ARGUMENT; } - vmsg.type = NGTCP2_VMSG_TYPE_STREAM; - vmsg.stream.strm = strm; - vmsg.stream.flags = flags; - vmsg.stream.data = datav; - vmsg.stream.datacnt = datavcnt; - vmsg.stream.pdatalen = pdatalen; + vmsg = (ngtcp2_vmsg){ + .type = NGTCP2_VMSG_TYPE_STREAM, + .stream = + { + .strm = strm, + .data = datav, + .datacnt = datavcnt, + .pdatalen = pdatalen, + .flags = flags, + }, + }; pvmsg = &vmsg; } @@ -12010,12 +12253,17 @@ ngtcp2_ssize ngtcp2_conn_writev_datagram_versioned( return NGTCP2_ERR_INVALID_ARGUMENT; } - vmsg.type = NGTCP2_VMSG_TYPE_DATAGRAM; - vmsg.datagram.dgram_id = dgram_id; - vmsg.datagram.flags = flags; - vmsg.datagram.data = datav; - vmsg.datagram.datacnt = datavcnt; - vmsg.datagram.paccepted = paccepted; + vmsg = (ngtcp2_vmsg){ + .type = NGTCP2_VMSG_TYPE_DATAGRAM, + .datagram = + { + .data = datav, + .datacnt = datavcnt, + .dgram_id = dgram_id, + .paccepted = paccepted, + .flags = flags, + }, + }; if (flags & NGTCP2_WRITE_DATAGRAM_FLAG_PADDING) { wflags = NGTCP2_WRITE_PKT_FLAG_PADDING_IF_NOT_EMPTY; @@ -12054,8 +12302,12 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, origlen = destlen = conn_shape_udp_payload(conn, &conn->dcid.current, destlen); - if (!ppe_pending && pi) { - pi->ecn = NGTCP2_ECN_NOT_ECT; + if (!ppe_pending) { + if (pi) { + pi->ecn = NGTCP2_ECN_NOT_ECT; + } + + conn->frame_counts = (ngtcp2_frame_counts){0}; } switch (conn->state) { @@ -12071,27 +12323,29 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, conn_client_write_handshake(conn, pi, dest, destlen, wflags, vmsg, ts); /* We might be unable to write a packet because of depletion of congestion window budget, perhaps due to packet loss that - shrinks the window drastically. */ - if (nwrite <= 0) { + shrinks the window drastically. Then continue if we are in + post-handshake. There, we might be able to write packets + exceeding CWND to avoid deadlock. */ + if (nwrite < 0) { return nwrite; } if (conn->state != NGTCP2_CS_POST_HANDSHAKE) { return nwrite; } - assert(nwrite); - assert(dest[0] & NGTCP2_HEADER_FORM_BIT); - assert(conn->negotiated_version); + if (nwrite) { + assert(dest[0] & NGTCP2_HEADER_FORM_BIT); + assert(conn->negotiated_version); - if (nwrite < NGTCP2_MAX_UDP_PAYLOAD_SIZE && - ngtcp2_pkt_get_type_long(conn->negotiated_version, dest[0]) == + if (ngtcp2_pkt_get_type_long(conn->negotiated_version, dest[0]) == NGTCP2_PKT_INITIAL) { - wflags |= NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING; - } + wflags |= NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING; + } - res = nwrite; - dest += nwrite; - destlen -= (size_t)nwrite; + res = nwrite; + dest += nwrite; + destlen -= (size_t)nwrite; + } /* Break here so that we can coalesces 1RTT packet. */ break; case NGTCP2_CS_SERVER_INITIAL: @@ -12105,7 +12359,7 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, return 0; } - origlen = (size_t)ngtcp2_min_uint64((uint64_t)origlen, server_tx_left); + origlen = (size_t)ngtcp2_min((uint64_t)origlen, server_tx_left); } return conn_write_handshake_ack_pkts(conn, pi, dest, origlen, ts); @@ -12125,7 +12379,7 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, return 0; } - destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, server_tx_left); + destlen = (size_t)ngtcp2_min((uint64_t)destlen, server_tx_left); } if (conn->in_pktns) { @@ -12146,7 +12400,7 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, dest += nwrite; destlen -= (size_t)nwrite; - if (res < NGTCP2_MAX_UDP_PAYLOAD_SIZE && conn->in_pktns && nwrite > 0) { + if (conn->in_pktns && nwrite > 0) { it = ngtcp2_rtb_head(&conn->in_pktns->rtb); if (!ngtcp2_ksl_it_end(&it)) { rtbent = ngtcp2_ksl_it_get(&it); @@ -12172,7 +12426,7 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, return 0; } - origlen = (size_t)ngtcp2_min_uint64((uint64_t)origlen, server_tx_left); + origlen = (size_t)ngtcp2_min((uint64_t)origlen, server_tx_left); } return conn_write_ack_pkt(conn, pi, dest, origlen, NGTCP2_PKT_1RTT, ts); @@ -12261,8 +12515,8 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, if (conn->server && !(conn->dcid.current.flags & NGTCP2_DCID_FLAG_PATH_VALIDATED)) { server_tx_left = conn_server_tx_left(conn, &conn->dcid.current); - origlen = (size_t)ngtcp2_min_uint64((uint64_t)origlen, server_tx_left); - destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, server_tx_left); + origlen = (size_t)ngtcp2_min((uint64_t)origlen, server_tx_left); + destlen = (size_t)ngtcp2_min((uint64_t)destlen, server_tx_left); if (server_tx_left == 0 && conn->cstat.loss_detection_timer != UINT64_MAX) { @@ -12293,9 +12547,22 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, return nwrite; } if (nwrite > 0) { + /* This makes 1RTT packet padded. If 1RTT packet is not going + to be sent, packet is already padded. */ + if (ngtcp2_pkt_get_type_long(conn->negotiated_version, dest[0]) == + NGTCP2_PKT_INITIAL) { + wflags |= NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING; + } + res = nwrite; dest += nwrite; destlen -= (size_t)nwrite; + + /* We only exceed CWND to avoid deadlock. Do no write 1RTT + packet if CWND is depleted. */ + if (conn_cwnd_is_zero(conn) && conn->pktns.rtb.probe_pkt_left == 0) { + return res; + } } else if (destlen == 0) { res = conn_write_handshake_ack_pkts(conn, pi, dest, origlen, ts); if (res) { @@ -12306,9 +12573,9 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, } if (conn->pktns.rtb.probe_pkt_left) { - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, - "transmit probe pkt left=%zu", - conn->pktns.rtb.probe_pkt_left); + ngtcp2_log_infof( + &conn->log, NGTCP2_LOG_EVENT_CON, + "transmit probe pkt left=", conn->pktns.rtb.probe_pkt_left); nwrite = conn_write_pkt(conn, pi, dest, destlen, (size_t)res, vmsg, NGTCP2_PKT_1RTT, wflags, ts); @@ -12362,11 +12629,12 @@ conn_write_connection_close(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, ngtcp2_frame fr; uint8_t flags = NGTCP2_WRITE_PKT_FLAG_NONE; - fr.type = NGTCP2_FRAME_CONNECTION_CLOSE; - fr.connection_close.error_code = error_code; - fr.connection_close.frame_type = 0; - fr.connection_close.reasonlen = reasonlen; - fr.connection_close.reason = (uint8_t *)reason; + fr.connection_close = (ngtcp2_connection_close){ + .type = NGTCP2_FRAME_CONNECTION_CLOSE, + .error_code = error_code, + .reasonlen = reasonlen, + .reason = (uint8_t *)reason, + }; if (!(conn->flags & NGTCP2_CONN_FLAG_HANDSHAKE_CONFIRMED) && pkt_type != NGTCP2_PKT_INITIAL) { @@ -12456,7 +12724,7 @@ ngtcp2_ssize ngtcp2_conn_write_connection_close_pkt( if (conn->server) { server_tx_left = conn_server_tx_left(conn, &conn->dcid.current); - destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, server_tx_left); + destlen = (size_t)ngtcp2_min((uint64_t)destlen, server_tx_left); } if (conn->state == NGTCP2_CS_POST_HANDSHAKE || @@ -12518,7 +12786,7 @@ ngtcp2_ssize ngtcp2_conn_write_application_close_pkt( if (conn->server) { server_tx_left = conn_server_tx_left(conn, &conn->dcid.current); - destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, server_tx_left); + destlen = (size_t)ngtcp2_min((uint64_t)destlen, server_tx_left); } if (!(conn->flags & NGTCP2_CONN_FLAG_HANDSHAKE_CONFIRMED)) { @@ -12536,16 +12804,17 @@ ngtcp2_ssize ngtcp2_conn_write_application_close_pkt( if (conn->state != NGTCP2_CS_POST_HANDSHAKE && (!conn->server || !conn->pktns.crypto.tx.ckm)) { - return res; + goto fin; } assert(conn->pktns.crypto.tx.ckm); - fr.type = NGTCP2_FRAME_CONNECTION_CLOSE_APP; - fr.connection_close.error_code = app_error_code; - fr.connection_close.frame_type = 0; - fr.connection_close.reasonlen = reasonlen; - fr.connection_close.reason = (uint8_t *)reason; + fr.connection_close = (ngtcp2_connection_close){ + .type = NGTCP2_FRAME_CONNECTION_CLOSE_APP, + .error_code = app_error_code, + .reasonlen = reasonlen, + .reason = (uint8_t *)reason, + }; nwrite = ngtcp2_conn_write_single_frame_pkt( conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, @@ -12561,6 +12830,7 @@ ngtcp2_ssize ngtcp2_conn_write_application_close_pkt( return NGTCP2_ERR_NOBUF; } +fin: conn->state = NGTCP2_CS_CLOSING; return res; @@ -12569,11 +12839,12 @@ ngtcp2_ssize ngtcp2_conn_write_application_close_pkt( static void ccerr_init(ngtcp2_ccerr *ccerr, ngtcp2_ccerr_type type, uint64_t error_code, const uint8_t *reason, size_t reasonlen) { - ccerr->type = type; - ccerr->error_code = error_code; - ccerr->frame_type = 0; - ccerr->reason = (uint8_t *)reason; - ccerr->reasonlen = reasonlen; + *ccerr = (ngtcp2_ccerr){ + .type = type, + .error_code = error_code, + .reason = (uint8_t *)reason, + .reasonlen = reasonlen, + }; } void ngtcp2_ccerr_default(ngtcp2_ccerr *ccerr) { @@ -12608,7 +12879,7 @@ void ngtcp2_ccerr_set_liberr(ngtcp2_ccerr *ccerr, int liberr, reasonlen); return; - }; + } ngtcp2_ccerr_set_transport_error( ccerr, ngtcp2_err_infer_quic_transport_error_code(liberr), reason, @@ -12652,10 +12923,18 @@ ngtcp2_ssize ngtcp2_conn_write_connection_close_versioned( } int ngtcp2_conn_in_closing_period(ngtcp2_conn *conn) { + return ngtcp2_conn_in_closing_period2(conn); +} + +int ngtcp2_conn_in_closing_period2(const ngtcp2_conn *conn) { return conn->state == NGTCP2_CS_CLOSING; } int ngtcp2_conn_in_draining_period(ngtcp2_conn *conn) { + return ngtcp2_conn_in_draining_period2(conn); +} + +int ngtcp2_conn_in_draining_period2(const ngtcp2_conn *conn) { return conn->state == NGTCP2_CS_DRAINING; } @@ -12748,16 +13027,9 @@ static int conn_shutdown_stream_read(ngtcp2_conn *conn, ngtcp2_strm *strm, return 0; } - /* Extend connection flow control window for the amount of data - which are not passed to application. */ - if (!(strm->flags & NGTCP2_STRM_FLAG_RESET_STREAM_RECVED)) { - ngtcp2_conn_extend_max_offset(conn, strm->rx.last_offset - - ngtcp2_strm_rx_offset(strm)); - } - strm->flags |= NGTCP2_STRM_FLAG_STOP_SENDING; - ngtcp2_strm_discard_reordered_data(strm); + ngtcp2_strm_stop_buffering_reordered_data(strm); return conn_stop_sending(conn, strm, app_error_code); } @@ -12855,7 +13127,7 @@ static int conn_extend_max_stream_offset(ngtcp2_conn *conn, ngtcp2_strm *strm, top = ngtcp2_conn_tx_strmq_top(conn); strm->cycle = top->cycle; } - strm->cycle = conn_tx_strmq_first_cycle(conn); + strm->cycle = ngtcp2_conn_tx_strmq_first_cycle(conn); return ngtcp2_conn_tx_strmq_push(conn, strm); } @@ -12897,18 +13169,35 @@ void ngtcp2_conn_extend_max_streams_uni(ngtcp2_conn *conn, size_t n) { } const ngtcp2_cid *ngtcp2_conn_get_dcid(ngtcp2_conn *conn) { + return ngtcp2_conn_get_dcid2(conn); +} + +const ngtcp2_cid *ngtcp2_conn_get_dcid2(const ngtcp2_conn *conn) { return &conn->dcid.current.cid; } const ngtcp2_cid *ngtcp2_conn_get_client_initial_dcid(ngtcp2_conn *conn) { + return ngtcp2_conn_get_client_initial_dcid2(conn); +} + +const ngtcp2_cid * +ngtcp2_conn_get_client_initial_dcid2(const ngtcp2_conn *conn) { return &conn->rcid; } uint32_t ngtcp2_conn_get_client_chosen_version(ngtcp2_conn *conn) { + return ngtcp2_conn_get_client_chosen_version2(conn); +} + +uint32_t ngtcp2_conn_get_client_chosen_version2(const ngtcp2_conn *conn) { return conn->client_chosen_version; } uint32_t ngtcp2_conn_get_negotiated_version(ngtcp2_conn *conn) { + return ngtcp2_conn_get_negotiated_version2(conn); +} + +uint32_t ngtcp2_conn_get_negotiated_version2(const ngtcp2_conn *conn) { return conn->negotiated_version; } @@ -12986,11 +13275,15 @@ int ngtcp2_conn_tls_early_data_rejected(ngtcp2_conn *conn) { } int ngtcp2_conn_get_tls_early_data_rejected(ngtcp2_conn *conn) { + return ngtcp2_conn_get_tls_early_data_rejected2(conn); +} + +int ngtcp2_conn_get_tls_early_data_rejected2(const ngtcp2_conn *conn) { return (conn->flags & NGTCP2_CONN_FLAG_EARLY_DATA_REJECTED) != 0; } -int ngtcp2_conn_update_rtt(ngtcp2_conn *conn, ngtcp2_duration rtt, - ngtcp2_duration ack_delay, ngtcp2_tstamp ts) { +void ngtcp2_conn_update_rtt(ngtcp2_conn *conn, ngtcp2_duration rtt, + ngtcp2_duration ack_delay, ngtcp2_tstamp ts) { ngtcp2_conn_stat *cstat = &conn->cstat; assert(rtt > 0); @@ -13005,23 +13298,23 @@ int ngtcp2_conn_update_rtt(ngtcp2_conn *conn, ngtcp2_duration rtt, if (conn->flags & NGTCP2_CONN_FLAG_HANDSHAKE_CONFIRMED) { assert(conn->remote.transport_params); - ack_delay = ngtcp2_min_uint64( - ack_delay, conn->remote.transport_params->max_ack_delay); + ack_delay = + ngtcp2_min(ack_delay, conn->remote.transport_params->max_ack_delay); } else if (ack_delay > 0 && rtt >= cstat->min_rtt && rtt < cstat->min_rtt + ack_delay) { /* Ignore RTT sample if adjusting ack_delay causes the sample less than min_rtt before handshake confirmation. */ - ngtcp2_log_info( + ngtcp2_log_infof( &conn->log, NGTCP2_LOG_EVENT_LDC, - "ignore rtt sample because ack_delay is too large latest_rtt=%" PRIu64 - " min_rtt=%" PRIu64 " ack_delay=%" PRIu64, - rtt / NGTCP2_MILLISECONDS, cstat->min_rtt / NGTCP2_MILLISECONDS, - ack_delay / NGTCP2_MILLISECONDS); - return NGTCP2_ERR_INVALID_ARGUMENT; + "ignore rtt sample because ack_delay is too large latest_rtt=", + rtt / NGTCP2_MILLISECONDS, + " min_rtt=", cstat->min_rtt / NGTCP2_MILLISECONDS, + " ack_delay=", ack_delay / NGTCP2_MILLISECONDS); + return; } cstat->latest_rtt = rtt; - cstat->min_rtt = ngtcp2_min_uint64(cstat->min_rtt, rtt); + cstat->min_rtt = ngtcp2_min(cstat->min_rtt, rtt); if (rtt >= cstat->min_rtt + ack_delay) { rtt -= ack_delay; @@ -13034,31 +13327,24 @@ int ngtcp2_conn_update_rtt(ngtcp2_conn *conn, ngtcp2_duration rtt, cstat->smoothed_rtt = (cstat->smoothed_rtt * 7 + rtt) / 8; } - ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_LDC, - "latest_rtt=%" PRIu64 " min_rtt=%" PRIu64 " smoothed_rtt=%" PRIu64 - " rttvar=%" PRIu64 " ack_delay=%" PRIu64, - cstat->latest_rtt / NGTCP2_MILLISECONDS, - cstat->min_rtt / NGTCP2_MILLISECONDS, - cstat->smoothed_rtt / NGTCP2_MILLISECONDS, - cstat->rttvar / NGTCP2_MILLISECONDS, ack_delay / NGTCP2_MILLISECONDS); - - return 0; + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_LDC, + "latest_rtt=", cstat->latest_rtt / NGTCP2_MILLISECONDS, + " min_rtt=", cstat->min_rtt / NGTCP2_MILLISECONDS, + " smoothed_rtt=", cstat->smoothed_rtt / NGTCP2_MILLISECONDS, + " rttvar=", cstat->rttvar / NGTCP2_MILLISECONDS, + " ack_delay=", ack_delay / NGTCP2_MILLISECONDS); } void ngtcp2_conn_get_conn_info_versioned(ngtcp2_conn *conn, int conn_info_version, ngtcp2_conn_info *cinfo) { - const ngtcp2_conn_stat *cstat = &conn->cstat; - (void)conn_info_version; + ngtcp2_conn_get_conn_info2_versioned(conn, conn_info_version, cinfo); +} - cinfo->latest_rtt = cstat->latest_rtt; - cinfo->min_rtt = cstat->min_rtt; - cinfo->smoothed_rtt = cstat->smoothed_rtt; - cinfo->rttvar = cstat->rttvar; - cinfo->cwnd = cstat->cwnd; - cinfo->ssthresh = cstat->ssthresh; - cinfo->bytes_in_flight = cstat->bytes_in_flight; +void ngtcp2_conn_get_conn_info2_versioned(const ngtcp2_conn *conn, + int conn_info_version, + ngtcp2_conn_info *cinfo) { + ngtcp2_conn_info_init_versioned(conn_info_version, cinfo, &conn->cstat); } static void conn_get_loss_time_and_pktns(ngtcp2_conn *conn, @@ -13088,13 +13374,14 @@ static void conn_get_loss_time_and_pktns(ngtcp2_conn *conn, } } -static ngtcp2_tstamp conn_get_earliest_pto_expiry(ngtcp2_conn *conn, +static ngtcp2_tstamp conn_get_earliest_pto_expiry(const ngtcp2_conn *conn, ngtcp2_tstamp ts) { - ngtcp2_pktns *const ns[] = {conn->in_pktns, conn->hs_pktns, &conn->pktns}; + const ngtcp2_pktns *const ns[] = {conn->in_pktns, conn->hs_pktns, + &conn->pktns}; size_t i; ngtcp2_tstamp earliest_ts = UINT64_MAX, t; - ngtcp2_conn_stat *cstat = &conn->cstat; - ngtcp2_tstamp *times = cstat->last_tx_pkt_ts; + const ngtcp2_conn_stat *cstat = &conn->cstat; + const ngtcp2_tstamp *times = cstat->last_tx_pkt_ts; ngtcp2_duration duration = compute_pto(cstat->smoothed_rtt, cstat->rttvar, /* max_ack_delay = */ 0) * (1ULL << cstat->pto_count); @@ -13140,9 +13427,9 @@ void ngtcp2_conn_set_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts) { if (earliest_loss_time != UINT64_MAX) { cstat->loss_detection_timer = earliest_loss_time; - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_LDC, - "loss_detection_timer=%" PRIu64 " nonzero crypto loss time", - cstat->loss_detection_timer); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_LDC, + "loss_detection_timer=", cstat->loss_detection_timer, + " nonzero crypto loss time"); return; } @@ -13166,9 +13453,9 @@ void ngtcp2_conn_set_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts) { timeout = cstat->loss_detection_timer > ts ? cstat->loss_detection_timer - ts : 0; - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_LDC, - "loss_detection_timer=%" PRIu64 " timeout=%" PRIu64, - cstat->loss_detection_timer, timeout / NGTCP2_MILLISECONDS); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_LDC, + "loss_detection_timer=", cstat->loss_detection_timer, + " timeout=", timeout / NGTCP2_MILLISECONDS); } void ngtcp2_conn_cancel_loss_detection_timer(ngtcp2_conn *conn) { @@ -13239,9 +13526,10 @@ int ngtcp2_conn_on_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts) { } ++cstat->pto_count; + cstat->pto_count = ngtcp2_min(cstat->pto_count, 30); - ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_LDC, "pto_count=%zu", - cstat->pto_count); + ngtcp2_log_infof(&conn->log, NGTCP2_LOG_EVENT_LDC, + "pto_count=", cstat->pto_count); ngtcp2_conn_set_loss_detection_timer(conn, ts); @@ -13264,8 +13552,7 @@ static int conn_buffer_crypto_data(ngtcp2_conn *conn, const uint8_t **pdata, } if (!*pbufchain) { - rv = ngtcp2_buf_chain_new(pbufchain, ngtcp2_max_size(1024, datalen), - conn->mem); + rv = ngtcp2_buf_chain_new(pbufchain, ngtcp2_max(1024, datalen), conn->mem); if (rv != 0) { return rv; } @@ -13282,7 +13569,6 @@ int ngtcp2_conn_submit_crypto_data(ngtcp2_conn *conn, const uint8_t *data, const size_t datalen) { ngtcp2_pktns *pktns; ngtcp2_frame_chain *frc; - ngtcp2_stream *fr; int rv; if (datalen == 0) { @@ -13310,21 +13596,22 @@ int ngtcp2_conn_submit_crypto_data(ngtcp2_conn *conn, return rv; } - rv = ngtcp2_frame_chain_objalloc_new(&frc, &conn->frc_objalloc); + rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( + &frc, 1, &conn->frc_objalloc, conn->mem); if (rv != 0) { return rv; } - fr = &frc->fr.stream; - - fr->type = NGTCP2_FRAME_CRYPTO; - fr->flags = 0; - fr->fin = 0; - fr->stream_id = 0; - fr->offset = pktns->crypto.tx.offset; - fr->datacnt = 1; - fr->data[0].len = datalen; - fr->data[0].base = (uint8_t *)data; + frc->fr.stream.type = NGTCP2_FRAME_CRYPTO; + frc->fr.stream.flags = 0; + frc->fr.stream.fin = 0; + frc->fr.stream.stream_id = 0; + frc->fr.stream.offset = pktns->crypto.tx.offset; + frc->fr.stream.datacnt = 1; + frc->fr.stream.data[0] = (ngtcp2_vec){ + .base = (uint8_t *)data, + .len = datalen, + }; rv = ngtcp2_strm_streamfrq_push(&pktns->crypto.strm, frc); if (rv != 0) { @@ -13375,7 +13662,7 @@ int ngtcp2_conn_tx_strmq_push(ngtcp2_conn *conn, ngtcp2_strm *strm) { return ngtcp2_pq_push(&conn->tx.strmq, &strm->pe); } -static int conn_has_uncommitted_preferred_addr_cid(ngtcp2_conn *conn) { +static int conn_has_uncommitted_preferred_addr_cid(const ngtcp2_conn *conn) { return conn->server && !(conn->flags & NGTCP2_CONN_FLAG_LOCAL_TRANSPORT_PARAMS_COMMITTED) && conn->oscid.datalen && @@ -13383,6 +13670,10 @@ static int conn_has_uncommitted_preferred_addr_cid(ngtcp2_conn *conn) { } size_t ngtcp2_conn_get_scid(ngtcp2_conn *conn, ngtcp2_cid *dest) { + return ngtcp2_conn_get_scid2(conn, dest); +} + +size_t ngtcp2_conn_get_scid2(const ngtcp2_conn *conn, ngtcp2_cid *dest) { ngtcp2_cid *origdest = dest; ngtcp2_ksl_it it; ngtcp2_scid *scid; @@ -13405,7 +13696,7 @@ size_t ngtcp2_conn_get_scid(ngtcp2_conn *conn, ngtcp2_cid *dest) { return (size_t)(dest - origdest); } -static size_t conn_get_num_active_dcid(ngtcp2_conn *conn) { +static size_t conn_get_num_active_dcid(const ngtcp2_conn *conn) { size_t n = 1; /* for conn->dcid.current */ ngtcp2_pv *pv = conn->pv; @@ -13429,21 +13720,52 @@ static size_t conn_get_num_active_dcid(ngtcp2_conn *conn) { return n; } -static void copy_dcid_to_cid_token(ngtcp2_cid_token *dest, +size_t ngtcp2_conn_get_active_dcid(ngtcp2_conn *conn, ngtcp2_cid_token *dest) { + ngtcp2_cid_token2 cid_tokens[/* current */ 1 + /* pv */ 2 + + NGTCP2_DCIDTR_MAX_RETIRED_DCID_SIZE]; + size_t n, i; + + if (!dest) { + return ngtcp2_conn_get_active_dcid3(conn, NULL); + } + + n = ngtcp2_conn_get_active_dcid3(conn, cid_tokens); + + for (i = 0; i < n; ++i) { + dest[i].seq = cid_tokens[i].seq; + dest[i].cid = cid_tokens[i].cid; + ngtcp2_path_storage_init2(&dest[i].ps, &cid_tokens[i].ps.path); + dest[i].token_present = cid_tokens[i].token_present; + + if (dest[i].token_present) { + memcpy(dest[i].token, cid_tokens[i].token.data, sizeof(dest[i].token)); + } + } + + return n; +} + +static void copy_dcid_to_cid_token(ngtcp2_cid_token2 *dest, const ngtcp2_dcid *src) { dest->seq = src->seq; dest->cid = src->cid; ngtcp2_path_storage_init2(&dest->ps, &src->ps.path); if ((dest->token_present = (src->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) != 0)) { - memcpy(dest->token, src->token, NGTCP2_STATELESS_RESET_TOKENLEN); + dest->token = src->token; } } -size_t ngtcp2_conn_get_active_dcid(ngtcp2_conn *conn, ngtcp2_cid_token *dest) { - ngtcp2_pv *pv = conn->pv; - ngtcp2_cid_token *orig = dest; - ngtcp2_dcid *dcid; +size_t ngtcp2_conn_get_active_dcid2(ngtcp2_conn *conn, + ngtcp2_cid_token2 *dest) { + return ngtcp2_conn_get_active_dcid3(conn, dest); +} + +size_t ngtcp2_conn_get_active_dcid3(const ngtcp2_conn *conn, + ngtcp2_cid_token2 *dest) { + const ngtcp2_pv *pv = conn->pv; + ngtcp2_cid_token2 *orig = dest; + const ngtcp2_dcid *dcid; size_t len, i; if (!(conn->flags & NGTCP2_CONN_FLAG_HANDSHAKE_COMPLETED)) { @@ -13497,16 +13819,28 @@ void ngtcp2_conn_set_path_user_data(ngtcp2_conn *conn, void *path_user_data) { } const ngtcp2_path *ngtcp2_conn_get_path(ngtcp2_conn *conn) { + return ngtcp2_conn_get_path2(conn); +} + +const ngtcp2_path *ngtcp2_conn_get_path2(const ngtcp2_conn *conn) { return &conn->dcid.current.ps.path; } size_t ngtcp2_conn_get_max_tx_udp_payload_size(ngtcp2_conn *conn) { + return ngtcp2_conn_get_max_tx_udp_payload_size2(conn); +} + +size_t ngtcp2_conn_get_max_tx_udp_payload_size2(const ngtcp2_conn *conn) { return conn->local.settings.max_tx_udp_payload_size; } size_t ngtcp2_conn_get_path_max_tx_udp_payload_size(ngtcp2_conn *conn) { + return ngtcp2_conn_get_path_max_tx_udp_payload_size2(conn); +} + +size_t ngtcp2_conn_get_path_max_tx_udp_payload_size2(const ngtcp2_conn *conn) { if (conn->local.settings.no_tx_udp_payload_size_shaping) { - return ngtcp2_conn_get_max_tx_udp_payload_size(conn); + return ngtcp2_conn_get_max_tx_udp_payload_size2(conn); } return conn->dcid.current.max_udp_payload_size; @@ -13653,12 +13987,21 @@ int ngtcp2_conn_initiate_migration(ngtcp2_conn *conn, const ngtcp2_path *path, } uint64_t ngtcp2_conn_get_max_data_left(ngtcp2_conn *conn) { + return ngtcp2_conn_get_max_data_left2(conn); +} + +uint64_t ngtcp2_conn_get_max_data_left2(const ngtcp2_conn *conn) { return conn->tx.max_offset - conn->tx.offset; } uint64_t ngtcp2_conn_get_max_stream_data_left(ngtcp2_conn *conn, int64_t stream_id) { - ngtcp2_strm *strm = ngtcp2_conn_find_stream(conn, stream_id); + return ngtcp2_conn_get_max_stream_data_left2(conn, stream_id); +} + +uint64_t ngtcp2_conn_get_max_stream_data_left2(const ngtcp2_conn *conn, + int64_t stream_id) { + const ngtcp2_strm *strm = ngtcp2_conn_find_stream(conn, stream_id); if (strm == NULL) { return 0; @@ -13668,6 +14011,10 @@ uint64_t ngtcp2_conn_get_max_stream_data_left(ngtcp2_conn *conn, } uint64_t ngtcp2_conn_get_streams_bidi_left(ngtcp2_conn *conn) { + return ngtcp2_conn_get_streams_bidi_left2(conn); +} + +uint64_t ngtcp2_conn_get_streams_bidi_left2(const ngtcp2_conn *conn) { uint64_t n = ngtcp2_ord_stream_id(conn->local.bidi.next_stream_id); return n > conn->local.bidi.max_streams @@ -13676,6 +14023,10 @@ uint64_t ngtcp2_conn_get_streams_bidi_left(ngtcp2_conn *conn) { } uint64_t ngtcp2_conn_get_streams_uni_left(ngtcp2_conn *conn) { + return ngtcp2_conn_get_streams_uni_left2(conn); +} + +uint64_t ngtcp2_conn_get_streams_uni_left2(const ngtcp2_conn *conn) { uint64_t n = ngtcp2_ord_stream_id(conn->local.uni.next_stream_id); return n > conn->local.uni.max_streams ? 0 @@ -13683,6 +14034,10 @@ uint64_t ngtcp2_conn_get_streams_uni_left(ngtcp2_conn *conn) { } uint64_t ngtcp2_conn_get_cwnd_left(ngtcp2_conn *conn) { + return ngtcp2_conn_get_cwnd_left2(conn); +} + +uint64_t ngtcp2_conn_get_cwnd_left2(const ngtcp2_conn *conn) { uint64_t bytes_in_flight = conn->cstat.bytes_in_flight; uint64_t cwnd = conn->cstat.cwnd; @@ -13693,7 +14048,7 @@ uint64_t ngtcp2_conn_get_cwnd_left(ngtcp2_conn *conn) { return 0; } -ngtcp2_tstamp ngtcp2_conn_get_idle_expiry(ngtcp2_conn *conn) { +ngtcp2_tstamp ngtcp2_conn_get_idle_expiry(const ngtcp2_conn *conn) { ngtcp2_duration trpto; ngtcp2_duration idle_timeout; @@ -13714,11 +14069,11 @@ ngtcp2_tstamp ngtcp2_conn_get_idle_expiry(ngtcp2_conn *conn) { return UINT64_MAX; } - trpto = 3 * conn_compute_pto(conn, conn_is_tls_handshake_completed(conn) - ? &conn->pktns - : conn->hs_pktns); + trpto = 3 * ngtcp2_conn_compute_pto( + conn, conn_is_tls_handshake_completed(conn) ? &conn->pktns + : conn->hs_pktns); - idle_timeout = ngtcp2_max_uint64(idle_timeout, trpto); + idle_timeout = ngtcp2_max(idle_timeout, trpto); if (conn->idle_ts >= UINT64_MAX - idle_timeout) { return UINT64_MAX; @@ -13728,9 +14083,13 @@ ngtcp2_tstamp ngtcp2_conn_get_idle_expiry(ngtcp2_conn *conn) { } ngtcp2_duration ngtcp2_conn_get_pto(ngtcp2_conn *conn) { - return conn_compute_pto(conn, conn_is_tls_handshake_completed(conn) - ? &conn->pktns - : conn->hs_pktns); + return ngtcp2_conn_get_pto2(conn); +} + +ngtcp2_duration ngtcp2_conn_get_pto2(const ngtcp2_conn *conn) { + return ngtcp2_conn_compute_pto(conn, conn_is_tls_handshake_completed(conn) + ? &conn->pktns + : conn->hs_pktns); } void ngtcp2_conn_set_initial_crypto_ctx(ngtcp2_conn *conn, @@ -13740,6 +14099,11 @@ void ngtcp2_conn_set_initial_crypto_ctx(ngtcp2_conn *conn, } const ngtcp2_crypto_ctx *ngtcp2_conn_get_initial_crypto_ctx(ngtcp2_conn *conn) { + return ngtcp2_conn_get_initial_crypto_ctx2(conn); +} + +const ngtcp2_crypto_ctx * +ngtcp2_conn_get_initial_crypto_ctx2(const ngtcp2_conn *conn) { assert(conn->in_pktns); return &conn->in_pktns->crypto.ctx; } @@ -13761,6 +14125,10 @@ void ngtcp2_conn_set_crypto_ctx(ngtcp2_conn *conn, } const ngtcp2_crypto_ctx *ngtcp2_conn_get_crypto_ctx(ngtcp2_conn *conn) { + return ngtcp2_conn_get_crypto_ctx2(conn); +} + +const ngtcp2_crypto_ctx *ngtcp2_conn_get_crypto_ctx2(const ngtcp2_conn *conn) { return &conn->pktns.crypto.ctx; } @@ -13770,10 +14138,19 @@ void ngtcp2_conn_set_0rtt_crypto_ctx(ngtcp2_conn *conn, } const ngtcp2_crypto_ctx *ngtcp2_conn_get_0rtt_crypto_ctx(ngtcp2_conn *conn) { + return ngtcp2_conn_get_0rtt_crypto_ctx2(conn); +} + +const ngtcp2_crypto_ctx * +ngtcp2_conn_get_0rtt_crypto_ctx2(const ngtcp2_conn *conn) { return &conn->early.ctx; } void *ngtcp2_conn_get_tls_native_handle(ngtcp2_conn *conn) { + return ngtcp2_conn_get_tls_native_handle2(conn); +} + +void *ngtcp2_conn_get_tls_native_handle2(const ngtcp2_conn *conn) { return conn->crypto.tls_native_handle; } @@ -13783,6 +14160,10 @@ void ngtcp2_conn_set_tls_native_handle(ngtcp2_conn *conn, } const ngtcp2_ccerr *ngtcp2_conn_get_ccerr(ngtcp2_conn *conn) { + return ngtcp2_conn_get_ccerr2(conn); +} + +const ngtcp2_ccerr *ngtcp2_conn_get_ccerr2(const ngtcp2_conn *conn) { return &conn->rx.ccerr; } @@ -13791,6 +14172,10 @@ void ngtcp2_conn_set_tls_error(ngtcp2_conn *conn, int liberr) { } int ngtcp2_conn_get_tls_error(ngtcp2_conn *conn) { + return ngtcp2_conn_get_tls_error2(conn); +} + +int ngtcp2_conn_get_tls_error2(const ngtcp2_conn *conn) { return conn->crypto.tls_error; } @@ -13799,16 +14184,32 @@ void ngtcp2_conn_set_tls_alert(ngtcp2_conn *conn, uint8_t alert) { } uint8_t ngtcp2_conn_get_tls_alert(ngtcp2_conn *conn) { + return ngtcp2_conn_get_tls_alert2(conn); +} + +uint8_t ngtcp2_conn_get_tls_alert2(const ngtcp2_conn *conn) { return conn->crypto.tls_alert; } int ngtcp2_conn_is_local_stream(ngtcp2_conn *conn, int64_t stream_id) { + return ngtcp2_conn_is_local_stream2(conn, stream_id); +} + +int ngtcp2_conn_is_local_stream2(const ngtcp2_conn *conn, int64_t stream_id) { return conn_local_stream(conn, stream_id); } -int ngtcp2_conn_is_server(ngtcp2_conn *conn) { return conn->server; } +int ngtcp2_conn_is_server(ngtcp2_conn *conn) { + return ngtcp2_conn_is_server2(conn); +} + +int ngtcp2_conn_is_server2(const ngtcp2_conn *conn) { return conn->server; } int ngtcp2_conn_after_retry(ngtcp2_conn *conn) { + return ngtcp2_conn_after_retry2(conn); +} + +int ngtcp2_conn_after_retry2(const ngtcp2_conn *conn) { return (conn->flags & NGTCP2_CONN_FLAG_RECV_RETRY) != 0; } @@ -13825,8 +14226,22 @@ int ngtcp2_conn_set_stream_user_data(ngtcp2_conn *conn, int64_t stream_id, return 0; } +void *ngtcp2_conn_get_stream_user_data(ngtcp2_conn *conn, int64_t stream_id) { + return ngtcp2_conn_get_stream_user_data2(conn, stream_id); +} + +void *ngtcp2_conn_get_stream_user_data2(const ngtcp2_conn *conn, + int64_t stream_id) { + const ngtcp2_strm *strm = ngtcp2_conn_find_stream(conn, stream_id); + + if (strm == NULL) { + return NULL; + } + + return strm->stream_user_data; +} + void ngtcp2_conn_update_pkt_tx_time(ngtcp2_conn *conn, ngtcp2_tstamp ts) { - uint64_t pacing_interval_m; ngtcp2_duration wait, d; conn_update_timestamp(conn, ts); @@ -13835,22 +14250,11 @@ void ngtcp2_conn_update_pkt_tx_time(ngtcp2_conn *conn, ngtcp2_tstamp ts) { return; } - if (conn->cstat.pacing_interval_m) { - pacing_interval_m = conn->cstat.pacing_interval_m; - } else { - /* 1.25 is the under-utilization avoidance factor described in - https://datatracker.ietf.org/doc/html/rfc9002#section-7.7 */ - pacing_interval_m = ((conn->cstat.first_rtt_sample_ts == UINT64_MAX - ? NGTCP2_MILLISECONDS - : conn->cstat.smoothed_rtt) - << 10) * - 100 / 125 / conn->cstat.cwnd; - pacing_interval_m = ngtcp2_max_uint64(pacing_interval_m, 1); - } - - wait = (ngtcp2_duration)((conn->tx.pacing.pktlen * pacing_interval_m) >> 10); + wait = (ngtcp2_duration)((conn->tx.pacing.pktlen * + conn->cstat.pacing_interval_m) >> + 10); - d = ngtcp2_min_uint64(wait / 2, conn->tx.pacing.compensation); + d = ngtcp2_min(wait / 2, conn->tx.pacing.compensation); wait -= d; conn->tx.pacing.compensation -= d; @@ -13859,11 +14263,20 @@ void ngtcp2_conn_update_pkt_tx_time(ngtcp2_conn *conn, ngtcp2_tstamp ts) { } size_t ngtcp2_conn_get_send_quantum(ngtcp2_conn *conn) { + return ngtcp2_conn_get_send_quantum2(conn); +} + +size_t ngtcp2_conn_get_send_quantum2(const ngtcp2_conn *conn) { return conn->cstat.send_quantum; } size_t ngtcp2_conn_get_stream_loss_count(ngtcp2_conn *conn, int64_t stream_id) { - ngtcp2_strm *strm = ngtcp2_conn_find_stream(conn, stream_id); + return ngtcp2_conn_get_stream_loss_count2(conn, stream_id); +} + +size_t ngtcp2_conn_get_stream_loss_count2(const ngtcp2_conn *conn, + int64_t stream_id) { + const ngtcp2_strm *strm = ngtcp2_conn_find_stream(conn, stream_id); if (strm == NULL) { return 0; @@ -13886,9 +14299,28 @@ ngtcp2_ssize ngtcp2_conn_write_aggregate_pkt_versioned( ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, ngtcp2_pkt_info *pi, uint8_t *buf, size_t buflen, size_t *pgsolen, ngtcp2_write_pkt write_pkt, ngtcp2_tstamp ts) { - size_t max_udp_payloadlen = ngtcp2_conn_get_max_tx_udp_payload_size(conn); + ngtcp2_ssize nwrite; + + buflen = ngtcp2_min(buflen, ngtcp2_conn_get_send_quantum2(conn)); + + nwrite = ngtcp2_conn_write_aggregate_pkt2_versioned( + conn, path, pkt_info_version, pi, buf, buflen, pgsolen, write_pkt, 0, ts); + if (nwrite < 0) { + return nwrite; + } + + ngtcp2_conn_update_pkt_tx_time(conn, ts); + + return nwrite; +} + +ngtcp2_ssize ngtcp2_conn_write_aggregate_pkt2_versioned( + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *buf, size_t buflen, size_t *pgsolen, + ngtcp2_write_pkt write_pkt, size_t num_pkts, ngtcp2_tstamp ts) { + size_t max_udp_payloadlen = ngtcp2_conn_get_max_tx_udp_payload_size2(conn); size_t path_max_udp_payloadlen = - ngtcp2_conn_get_path_max_tx_udp_payload_size(conn); + ngtcp2_conn_get_path_max_tx_udp_payload_size2(conn); ngtcp2_ssize nwrite; uint8_t *wbuf = buf; size_t wbuflen; @@ -13900,9 +14332,9 @@ ngtcp2_ssize ngtcp2_conn_write_aggregate_pkt_versioned( assert(buflen >= path_max_udp_payloadlen); - buflen = - ngtcp2_min_size(buflen, ngtcp2_max_size(ngtcp2_conn_get_send_quantum(conn), - path_max_udp_payloadlen)); + if (num_pkts == 0) { + num_pkts = SIZE_MAX; + } for (;;) { ecn_state = conn->tx.ecn.state; @@ -13924,13 +14356,16 @@ ngtcp2_ssize ngtcp2_conn_write_aggregate_pkt_versioned( wbuf += nwrite; buflen -= (size_t)nwrite; + --num_pkts; + if (first_pkt) { assert(!(conn->flags & NGTCP2_CONN_FLAG_AGGREGATE_PKTS)); *pgsolen = (size_t)nwrite; if ((size_t)nwrite != path_max_udp_payloadlen || - buflen < path_max_udp_payloadlen || ecn_state != conn->tx.ecn.state) { + buflen < path_max_udp_payloadlen || ecn_state != conn->tx.ecn.state || + num_pkts == 0) { nwrite = wbuf - buf; break; } @@ -13954,7 +14389,7 @@ ngtcp2_ssize ngtcp2_conn_write_aggregate_pkt_versioned( } if (buflen < path_max_udp_payloadlen || (size_t)nwrite < *pgsolen || - ecn_state != conn->tx.ecn.state) { + ecn_state != conn->tx.ecn.state || num_pkts == 0) { nwrite = wbuf - buf; break; } @@ -13962,15 +14397,17 @@ ngtcp2_ssize ngtcp2_conn_write_aggregate_pkt_versioned( conn->flags &= ~NGTCP2_CONN_FLAG_AGGREGATE_PKTS; - ngtcp2_conn_update_pkt_tx_time(conn, ts); - return nwrite; } +ngtcp2_tstamp ngtcp2_conn_get_timestamp(const ngtcp2_conn *conn) { + return conn->log.last_ts; +} + const ngtcp2_path_history_entry * -ngtcp2_conn_find_path_history(ngtcp2_conn *conn, const ngtcp2_path *path, +ngtcp2_conn_find_path_history(const ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_tstamp ts) { - ngtcp2_ringbuf *rb = &conn->path_history.rb; + const ngtcp2_ringbuf *rb = &conn->path_history.rb; size_t i, len = ngtcp2_ringbuf_len(rb); ngtcp2_path_history_entry *ent; @@ -13990,9 +14427,9 @@ ngtcp2_conn_find_path_history(ngtcp2_conn *conn, const ngtcp2_path *path, void ngtcp2_path_challenge_entry_init(ngtcp2_path_challenge_entry *pcent, const ngtcp2_path *path, - const uint8_t *data) { + const ngtcp2_path_challenge_data *data) { ngtcp2_path_storage_init2(&pcent->ps, path); - memcpy(pcent->data, data, sizeof(pcent->data)); + pcent->data = *data; } /* The functions prefixed with ngtcp2_pkt_ are usually put inside @@ -14037,10 +14474,6 @@ ngtcp2_ssize ngtcp2_pkt_write_connection_close( return rv; } - if (!ngtcp2_ppe_ensure_hp_sample(&ppe)) { - return NGTCP2_ERR_NOBUF; - } - fr.connection_close = (ngtcp2_connection_close){ .type = NGTCP2_FRAME_CONNECTION_CLOSE, .error_code = error_code, diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h index 2d607d379fc3..18af11727e06 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h @@ -77,10 +77,6 @@ typedef enum { unreceived data. */ #define NGTCP2_MAX_REORDERED_CRYPTO_DATA 65536 -/* NGTCP2_MAX_RETRIES is the number of Retry packet which client can - accept. */ -#define NGTCP2_MAX_RETRIES 3 - /* NGTCP2_MAX_SCID_POOL_SIZE is the maximum number of source connection ID the local endpoint provides to the remote endpoint. The chosen value was described in old draft. Now a remote endpoint @@ -98,48 +94,35 @@ typedef enum { #define NGTCP2_CCERR_MAX_REASONLEN 1024 /* NGTCP2_WRITE_PKT_FLAG_NONE indicates that no flag is set. */ -#define NGTCP2_WRITE_PKT_FLAG_NONE 0x00u +#define NGTCP2_WRITE_PKT_FLAG_NONE 0x00U /* NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING indicates that packet other than Initial packet should be padded so that UDP datagram payload is at least NGTCP2_MAX_UDP_PAYLOAD_SIZE bytes. Initial packet might be padded based on QUIC requirement regardless of this flag. */ -#define NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING 0x01u +#define NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING 0x01U /* NGTCP2_WRITE_PKT_FLAG_MORE indicates that more frames might come and it should be encoded into the current packet. */ -#define NGTCP2_WRITE_PKT_FLAG_MORE 0x02u +#define NGTCP2_WRITE_PKT_FLAG_MORE 0x02U /* NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING_FULL is just like NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING, but it requests to add padding to the full UDP datagram payload size. */ -#define NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING_FULL 0x04u +#define NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING_FULL 0x04U /* NGTCP2_WRITE_PKT_FLAG_PADDING_IF_NOT_EMPTY adds padding to the QUIC packet as much as possible if the packet is not empty. */ -#define NGTCP2_WRITE_PKT_FLAG_PADDING_IF_NOT_EMPTY 0x08u - -/* - * ngtcp2_max_frame is defined so that it covers the largest ACK - * frame. - */ -typedef union ngtcp2_max_frame { - ngtcp2_frame fr; - struct { - ngtcp2_ack ack; - /* ack includes 1 ngtcp2_ack_range. */ - ngtcp2_ack_range ranges[NGTCP2_MAX_ACK_RANGES - 1]; - } ackfr; -} ngtcp2_max_frame; +#define NGTCP2_WRITE_PKT_FLAG_PADDING_IF_NOT_EMPTY 0x08U typedef struct ngtcp2_path_challenge_entry { ngtcp2_path_storage ps; - uint8_t data[8]; + ngtcp2_path_challenge_data data; } ngtcp2_path_challenge_entry; void ngtcp2_path_challenge_entry_init(ngtcp2_path_challenge_entry *pcent, const ngtcp2_path *path, - const uint8_t *data); + const ngtcp2_path_challenge_data *data); /* NGTCP2_CONN_FLAG_NONE indicates that no flag is set. */ -#define NGTCP2_CONN_FLAG_NONE 0x00u +#define NGTCP2_CONN_FLAG_NONE 0x00U /* NGTCP2_CONN_FLAG_TLS_HANDSHAKE_COMPLETED is set when TLS stack declares that TLS handshake has completed. The condition of this declaration varies between TLS implementations and this flag does @@ -147,69 +130,69 @@ void ngtcp2_path_challenge_entry_init(ngtcp2_path_challenge_entry *pcent, implementations declare TLS handshake completion as server when they write off Server Finished and before deriving application rx secret. */ -#define NGTCP2_CONN_FLAG_TLS_HANDSHAKE_COMPLETED 0x01u +#define NGTCP2_CONN_FLAG_TLS_HANDSHAKE_COMPLETED 0x01U /* NGTCP2_CONN_FLAG_INITIAL_PKT_PROCESSED is set when the first Initial packet has successfully been processed. */ -#define NGTCP2_CONN_FLAG_INITIAL_PKT_PROCESSED 0x02u +#define NGTCP2_CONN_FLAG_INITIAL_PKT_PROCESSED 0x02U /* NGTCP2_CONN_FLAG_TRANSPORT_PARAM_RECVED is set if transport parameters are received. */ -#define NGTCP2_CONN_FLAG_TRANSPORT_PARAM_RECVED 0x04u +#define NGTCP2_CONN_FLAG_TRANSPORT_PARAM_RECVED 0x04U /* NGTCP2_CONN_FLAG_LOCAL_TRANSPORT_PARAMS_COMMITTED is set when a local transport parameters are applied. */ -#define NGTCP2_CONN_FLAG_LOCAL_TRANSPORT_PARAMS_COMMITTED 0x08u +#define NGTCP2_CONN_FLAG_LOCAL_TRANSPORT_PARAMS_COMMITTED 0x08U /* NGTCP2_CONN_FLAG_RECV_RETRY is set when a client receives Retry packet. */ -#define NGTCP2_CONN_FLAG_RECV_RETRY 0x10u +#define NGTCP2_CONN_FLAG_RECV_RETRY 0x10U /* NGTCP2_CONN_FLAG_EARLY_DATA_REJECTED is set when 0-RTT packet is rejected by a peer. */ -#define NGTCP2_CONN_FLAG_EARLY_DATA_REJECTED 0x20u +#define NGTCP2_CONN_FLAG_EARLY_DATA_REJECTED 0x20U /* NGTCP2_CONN_FLAG_KEEP_ALIVE_CANCELLED is set when the expired keep-alive timer has been cancelled. */ -#define NGTCP2_CONN_FLAG_KEEP_ALIVE_CANCELLED 0x40u +#define NGTCP2_CONN_FLAG_KEEP_ALIVE_CANCELLED 0x40U /* NGTCP2_CONN_FLAG_HANDSHAKE_CONFIRMED is set when an endpoint confirmed completion of handshake. */ -#define NGTCP2_CONN_FLAG_HANDSHAKE_CONFIRMED 0x80u +#define NGTCP2_CONN_FLAG_HANDSHAKE_CONFIRMED 0x80U /* NGTCP2_CONN_FLAG_HANDSHAKE_COMPLETED is set when the library transitions its state to "post handshake". */ -#define NGTCP2_CONN_FLAG_HANDSHAKE_COMPLETED 0x0100u +#define NGTCP2_CONN_FLAG_HANDSHAKE_COMPLETED 0x0100U /* NGTCP2_CONN_FLAG_HANDSHAKE_EARLY_RETRANSMIT is set when the early handshake retransmission has done when server receives overlapping Initial crypto data. */ -#define NGTCP2_CONN_FLAG_HANDSHAKE_EARLY_RETRANSMIT 0x0200u +#define NGTCP2_CONN_FLAG_HANDSHAKE_EARLY_RETRANSMIT 0x0200U /* NGTCP2_CONN_FLAG_CLEAR_FIXED_BIT indicates that the local endpoint sends a QUIC packet without Fixed Bit set if a remote endpoint supports Greasing QUIC Bit extension. */ -#define NGTCP2_CONN_FLAG_CLEAR_FIXED_BIT 0x0400u +#define NGTCP2_CONN_FLAG_CLEAR_FIXED_BIT 0x0400U /* NGTCP2_CONN_FLAG_KEY_UPDATE_NOT_CONFIRMED is set when key update is not confirmed by the local endpoint. That is, it has not received ACK frame which acknowledges packet which is encrypted with new key. */ -#define NGTCP2_CONN_FLAG_KEY_UPDATE_NOT_CONFIRMED 0x0800u +#define NGTCP2_CONN_FLAG_KEY_UPDATE_NOT_CONFIRMED 0x0800U /* NGTCP2_CONN_FLAG_PPE_PENDING is set when NGTCP2_WRITE_STREAM_FLAG_MORE is used and the intermediate state of ngtcp2_ppe is stored in pkt struct of ngtcp2_conn. */ -#define NGTCP2_CONN_FLAG_PPE_PENDING 0x1000u +#define NGTCP2_CONN_FLAG_PPE_PENDING 0x1000U /* NGTCP2_CONN_FLAG_RESTART_IDLE_TIMER_ON_WRITE is set when idle timer should be restarted on next write. */ -#define NGTCP2_CONN_FLAG_RESTART_IDLE_TIMER_ON_WRITE 0x2000u +#define NGTCP2_CONN_FLAG_RESTART_IDLE_TIMER_ON_WRITE 0x2000U /* NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED indicates that server as peer verified client address. This flag is only used by client. */ -#define NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED 0x4000u +#define NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED 0x4000U /* NGTCP2_CONN_FLAG_EARLY_KEY_INSTALLED indicates that an early key is installed. conn->early.ckm cannot be used for this purpose because it might be discarded when a certain condition is met. */ -#define NGTCP2_CONN_FLAG_EARLY_KEY_INSTALLED 0x8000u +#define NGTCP2_CONN_FLAG_EARLY_KEY_INSTALLED 0x8000U /* NGTCP2_CONN_FLAG_KEY_UPDATE_INITIATOR is set when the local endpoint has initiated key update. */ -#define NGTCP2_CONN_FLAG_KEY_UPDATE_INITIATOR 0x10000u +#define NGTCP2_CONN_FLAG_KEY_UPDATE_INITIATOR 0x10000U /* NGTCP2_CONN_FLAG_AGGREGATE_PKTS is set when ngtcp2_conn_writev_stream is called inside the callback invoked by ngtcp2_conn_write_aggregate_pkt. */ -#define NGTCP2_CONN_FLAG_AGGREGATE_PKTS 0x20000u +#define NGTCP2_CONN_FLAG_AGGREGATE_PKTS 0x20000U /* NGTCP2_CONN_FLAG_CRUMBLE_INITIAL_CRYPTO, if set, crumbles an Initial CRYPTO frame into pieces as a countermeasure against Deep Packet Inspection. */ -#define NGTCP2_CONN_FLAG_CRUMBLE_INITIAL_CRYPTO 0x40000u +#define NGTCP2_CONN_FLAG_CRUMBLE_INITIAL_CRYPTO 0x40000U typedef struct ngtcp2_pktns { struct { @@ -325,6 +308,11 @@ typedef struct ngtcp2_early_transport_params { uint64_t max_datagram_frame_size; } ngtcp2_early_transport_params; +typedef struct ngtcp2_frame_counts { + size_t crypto; + size_t stream; +} ngtcp2_frame_counts; + ngtcp2_static_ringbuf_def(path_challenge, 4, sizeof(ngtcp2_path_challenge_entry)) @@ -404,14 +392,14 @@ struct ngtcp2_conn { ngtcp2_tstamp last_max_data_ts; struct { - /* state is the state of ECN validation */ - ngtcp2_ecn_state state; /* validation_start_ts is the timestamp when ECN validation is started. It is UINT64_MAX if it has not started yet. */ ngtcp2_tstamp validation_start_ts; /* dgram_sent is the number of UDP datagram sent during ECN validation period. */ size_t dgram_sent; + /* state is the state of ECN validation */ + ngtcp2_ecn_state state; } ecn; struct { @@ -562,13 +550,13 @@ struct ngtcp2_conn { /* retry_aead_ctx is AEAD cipher context to verify Retry packet integrity. It is used by client only. */ ngtcp2_crypto_aead_ctx retry_aead_ctx; + /* decryption_failure_count is the number of received packets that + fail authentication. */ + uint64_t decryption_failure_count; /* tls_error is TLS related error. */ int tls_error; /* tls_alert is TLS alert generated by the local endpoint. */ uint8_t tls_alert; - /* decryption_failure_count is the number of received packets that - fail authentication. */ - uint64_t decryption_failure_count; } crypto; /* pkt contains the packet intermediate construction data to support @@ -578,13 +566,13 @@ struct ngtcp2_conn { ngtcp2_pkt_hd hd; ngtcp2_ppe ppe; ngtcp2_frame_chain **pfrc; + ngtcp2_ssize hs_spktlen; int pkt_empty; int hd_logged; + int require_padding; /* flags is bitwise OR of zero or more of NGTCP2_RTB_ENTRY_FLAG_*. */ uint16_t rtb_entry_flags; - ngtcp2_ssize hs_spktlen; - int require_padding; } pkt; struct { @@ -640,7 +628,6 @@ struct ngtcp2_conn { ngtcp2_log log; ngtcp2_qlog qlog; ngtcp2_rst rst; - ngtcp2_cc_algo cc_algo; union { ngtcp2_cc cc; ngtcp2_cc_reno reno; @@ -662,11 +649,13 @@ struct ngtcp2_conn { confirmed. For server, it is confirmed when completed. */ ngtcp2_tstamp handshake_confirmed_ts; ngtcp2_pcg32 pcg; + ngtcp2_frame_counts frame_counts; void *user_data; uint32_t client_chosen_version; uint32_t negotiated_version; /* flags is bitwise OR of zero or more of NGTCP2_CONN_FLAG_*. */ uint32_t flags; + ngtcp2_cc_algo cc_algo; int server; }; @@ -678,9 +667,6 @@ typedef enum ngtcp2_vmsg_type { typedef struct ngtcp2_vmsg_stream { /* strm is a stream that data is sent to. */ ngtcp2_strm *strm; - /* flags is bitwise OR of zero or more of - NGTCP2_WRITE_STREAM_FLAG_*. */ - uint32_t flags; /* data is the pointer to ngtcp2_vec array which contains the stream data to send. */ const ngtcp2_vec *data; @@ -689,6 +675,9 @@ typedef struct ngtcp2_vmsg_stream { /* pdatalen is the pointer to the variable which the number of bytes written is assigned to if pdatalen is not NULL. */ ngtcp2_ssize *pdatalen; + /* flags is bitwise OR of zero or more of + NGTCP2_WRITE_STREAM_FLAG_*. */ + uint32_t flags; } ngtcp2_vmsg_stream; typedef struct ngtcp2_vmsg_datagram { @@ -699,12 +688,12 @@ typedef struct ngtcp2_vmsg_datagram { size_t datacnt; /* dgram_id is an opaque identifier chosen by an application. */ uint64_t dgram_id; - /* flags is bitwise OR of zero or more of - NGTCP2_WRITE_DATAGRAM_FLAG_*. */ - uint32_t flags; /* paccepted is the pointer to the variable which, if it is not NULL, is assigned nonzero if data is written to a packet. */ int *paccepted; + /* flags is bitwise OR of zero or more of + NGTCP2_WRITE_DATAGRAM_FLAG_*. */ + uint32_t flags; } ngtcp2_vmsg_datagram; typedef struct ngtcp2_vmsg { @@ -719,7 +708,8 @@ typedef struct ngtcp2_vmsg { * ngtcp2_conn_find_stream returns a stream whose stream ID is * |stream_id|. If no such stream is found, it returns NULL. */ -ngtcp2_strm *ngtcp2_conn_find_stream(ngtcp2_conn *conn, int64_t stream_id); +ngtcp2_strm *ngtcp2_conn_find_stream(const ngtcp2_conn *conn, + int64_t stream_id); /* * conn_init_stream initializes |strm|. Its stream ID is |stream_id|. @@ -772,15 +762,9 @@ int ngtcp2_conn_close_stream_if_shut_rdwr(ngtcp2_conn *conn, ngtcp2_strm *strm); * ack_delay included in ACK frame. |ack_delay| is actually tainted * (sent by peer), so don't assume that |ack_delay| is always smaller * than, or equals to |rtt|. - * - * This function returns 0 if it succeeds, or one of the following - * negative error codes: - * - * NGTCP2_ERR_INVALID_ARGUMENT - * RTT sample is ignored. */ -int ngtcp2_conn_update_rtt(ngtcp2_conn *conn, ngtcp2_duration rtt, - ngtcp2_duration ack_delay, ngtcp2_tstamp ts); +void ngtcp2_conn_update_rtt(ngtcp2_conn *conn, ngtcp2_duration rtt, + ngtcp2_duration ack_delay, ngtcp2_tstamp ts); void ngtcp2_conn_set_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts); @@ -827,7 +811,7 @@ int ngtcp2_conn_tx_strmq_push(ngtcp2_conn *conn, ngtcp2_strm *strm); * ngtcp2_conn_internal_expiry returns the minimum expiry time among * all timers in |conn|. */ -ngtcp2_tstamp ngtcp2_conn_internal_expiry(ngtcp2_conn *conn); +ngtcp2_tstamp ngtcp2_conn_internal_expiry(const ngtcp2_conn *conn); ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, ngtcp2_pkt_info *pi, @@ -876,14 +860,14 @@ int ngtcp2_conn_commit_local_transport_params(ngtcp2_conn *conn); * ngtcp2_conn_lost_pkt_expiry returns the earliest expiry time of * lost packet. */ -ngtcp2_tstamp ngtcp2_conn_lost_pkt_expiry(ngtcp2_conn *conn); +ngtcp2_tstamp ngtcp2_conn_lost_pkt_expiry(const ngtcp2_conn *conn); /* * ngtcp2_conn_remove_lost_pkt removes the expired lost packet. */ void ngtcp2_conn_remove_lost_pkt(ngtcp2_conn *conn, ngtcp2_tstamp ts); -uint64_t ngtcp2_conn_tx_strmq_first_cycle(ngtcp2_conn *conn); +uint64_t ngtcp2_conn_tx_strmq_first_cycle(const ngtcp2_conn *conn); /** * @function @@ -894,7 +878,7 @@ uint64_t ngtcp2_conn_tx_strmq_first_cycle(ngtcp2_conn *conn); * `ngtcp2_conn_write_pkt` (or `ngtcp2_conn_writev_stream`) when it * expires. It returns UINT64_MAX if there is no expiry. */ -ngtcp2_tstamp ngtcp2_conn_ack_delay_expiry(ngtcp2_conn *conn); +ngtcp2_tstamp ngtcp2_conn_ack_delay_expiry(const ngtcp2_conn *conn); /** * @function @@ -915,7 +899,7 @@ void ngtcp2_conn_cancel_expired_ack_delay_timer(ngtcp2_conn *conn, * (or `ngtcp2_conn_writev_stream`) when it expires. It returns * UINT64_MAX if loss detection timer is not armed. */ -ngtcp2_tstamp ngtcp2_conn_loss_detection_expiry(ngtcp2_conn *conn); +ngtcp2_tstamp ngtcp2_conn_loss_detection_expiry(const ngtcp2_conn *conn); /** * @function @@ -924,34 +908,13 @@ ngtcp2_tstamp ngtcp2_conn_loss_detection_expiry(ngtcp2_conn *conn); * should be closed if it continues to be idle. If idle timeout is * disabled, this function returns ``UINT64_MAX``. */ -ngtcp2_tstamp ngtcp2_conn_get_idle_expiry(ngtcp2_conn *conn); - -ngtcp2_duration ngtcp2_conn_compute_pto(ngtcp2_conn *conn, ngtcp2_pktns *pktns); - -/* - * ngtcp2_conn_track_retired_dcid_seq tracks the sequence number |seq| - * of unacknowledged retiring Destination Connection ID. - * - * This function returns 0 if it succeeds, or one of the following - * negative error codes: - * - * NGTCP2_ERR_CONNECTION_ID_LIMIT - * The number of unacknowledged retirement exceeds the limit. - */ -int ngtcp2_conn_track_retired_dcid_seq(ngtcp2_conn *conn, uint64_t seq); - -/* - * ngtcp2_conn_untrack_retired_dcid_seq deletes the sequence number - * |seq| of unacknowledged retiring Destination Connection ID. It is - * fine if such sequence number is not found. - */ -void ngtcp2_conn_untrack_retired_dcid_seq(ngtcp2_conn *conn, uint64_t seq); +ngtcp2_tstamp ngtcp2_conn_get_idle_expiry(const ngtcp2_conn *conn); /* - * ngtcp2_conn_check_retired_dcid_tracked returns nonzero if |seq| has - * already been tracked. + * ngtcp2_conn_compute_pto computes the current PTO. */ -int ngtcp2_conn_check_retired_dcid_tracked(ngtcp2_conn *conn, uint64_t seq); +ngtcp2_duration ngtcp2_conn_compute_pto(const ngtcp2_conn *conn, + const ngtcp2_pktns *pktns); /* * ngtcp2_conn_server_negotiate_version negotiates QUIC version. It @@ -966,7 +929,7 @@ ngtcp2_conn_server_negotiate_version(ngtcp2_conn *conn, * @function * * `ngtcp2_conn_write_connection_close_pkt` writes a packet which - * contains a CONNECTION_CLOSE frame (type 0x1c) in the buffer pointed + * contains a CONNECTION_CLOSE frame (type 0x1C) in the buffer pointed * by |dest| whose capacity is |datalen|. * * If |path| is not ``NULL``, this function stores the network path @@ -1008,7 +971,7 @@ ngtcp2_ssize ngtcp2_conn_write_connection_close_pkt( * @function * * `ngtcp2_conn_write_application_close_pkt` writes a packet which - * contains a CONNECTION_CLOSE frame (type 0x1d) in the buffer pointed + * contains a CONNECTION_CLOSE frame (type 0x1D) in the buffer pointed * by |dest| whose capacity is |datalen|. * * If |path| is not ``NULL``, this function stores the network path @@ -1021,7 +984,7 @@ ngtcp2_ssize ngtcp2_conn_write_connection_close_pkt( * if it succeeds. The metadata includes ECN markings. * * If handshake has not been confirmed yet, CONNECTION_CLOSE (type - * 0x1c) with error code :macro:`NGTCP2_APPLICATION_ERROR` is written + * 0x1C) with error code :macro:`NGTCP2_APPLICATION_ERROR` is written * instead. * * This function must not be called from inside the callback @@ -1130,7 +1093,7 @@ void ngtcp2_conn_add_path_history(ngtcp2_conn *conn, const ngtcp2_dcid *dcid, ngtcp2_tstamp ts); const ngtcp2_path_history_entry * -ngtcp2_conn_find_path_history(ngtcp2_conn *conn, const ngtcp2_path *path, +ngtcp2_conn_find_path_history(const ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_tstamp ts); #endif /* !defined(NGTCP2_CONN_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_info.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_info.c new file mode 100644 index 000000000000..84bb8820f50d --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_info.c @@ -0,0 +1,50 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "ngtcp2_conn_info.h" +#include "ngtcp2_conn_stat.h" + +void ngtcp2_conn_info_init_versioned(int conn_info_version, + ngtcp2_conn_info *cinfo, + const ngtcp2_conn_stat *cstat) { + cinfo->latest_rtt = cstat->latest_rtt; + cinfo->min_rtt = cstat->min_rtt; + cinfo->smoothed_rtt = cstat->smoothed_rtt; + cinfo->rttvar = cstat->rttvar; + cinfo->cwnd = cstat->cwnd; + cinfo->ssthresh = cstat->ssthresh; + cinfo->bytes_in_flight = cstat->bytes_in_flight; + + switch (conn_info_version) { + case NGTCP2_CONN_INFO_V2: + cinfo->pkt_sent = cstat->pkt_sent; + cinfo->bytes_sent = cstat->bytes_sent; + cinfo->pkt_recv = cstat->pkt_recv; + cinfo->bytes_recv = cstat->bytes_recv; + cinfo->pkt_lost = cstat->pkt_lost; + cinfo->bytes_lost = cstat->bytes_lost; + cinfo->ping_recv = cstat->ping_recv; + cinfo->pkt_discarded = cstat->pkt_discarded; + } +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_info.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_info.h new file mode 100644 index 000000000000..161309df3043 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_info.h @@ -0,0 +1,45 @@ +/* + * ngtcp2 + * + * Copyright (c) 2025 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef NGTCP2_CONN_INFO_H +#define NGTCP2_CONN_INFO_H + +#ifdef HAVE_CONFIG_H +# include +#endif /* defined(HAVE_CONFIG_H) */ + +#include + +typedef struct ngtcp2_conn_stat ngtcp2_conn_stat; + +/* + * ngtcp2_conn_info_init_versioned initializes |cinfo| of version + * |conn_info_version| from |cstat|. This function only fills the + * fields of |cinfo| that are available in the specified version. + */ +void ngtcp2_conn_info_init_versioned(int conn_info_version, + ngtcp2_conn_info *cinfo, + const ngtcp2_conn_stat *cstat); + +#endif /* !defined(NGTCP2_CONN_INFO_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_stat.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_stat.h index be041b908608..b5fea4739109 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_stat.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_stat.h @@ -31,6 +31,8 @@ #include +#include "ngtcp2_pktns_id.h" + /** * @struct * @@ -128,6 +130,43 @@ typedef struct ngtcp2_conn_stat { * scheduled and transmitted together. */ size_t send_quantum; + /* + * pkt_sent is the number of QUIC packets sent. + */ + uint64_t pkt_sent; + /* + * bytes_sent is the number of bytes (the sum of QUIC packet length) + * sent. + */ + uint64_t bytes_sent; + /* + * pkt_recv is the number of QUIC packets received, excluding + * discarded ones. + */ + uint64_t pkt_recv; + /* + * bytes_recv is the number of bytes (the sum of QUIC packet length) + * received, excluding discarded ones. + */ + uint64_t bytes_recv; + /* + * pkt_lost is the number of QUIC packets that are considered lost, + * excluding PMTUD packets. + */ + uint64_t pkt_lost; + /* + * bytes_lost is the number of bytes (the sum of QUIC packet length) + * lost, excluding PMTUD packets. + */ + uint64_t bytes_lost; + /* + * ping_recv is the number of PING frames received. + */ + uint64_t ping_recv; + /* + * pkt_discarded is the number of QUIC packets discarded. + */ + uint64_t pkt_discarded; } ngtcp2_conn_stat; #endif /* !defined(NGTCP2_CONN_STAT_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.c index 6528011cc0ed..42651cddbbaa 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.c @@ -62,34 +62,34 @@ const uint8_t *ngtcp2_get_uint16(uint16_t *dest, const uint8_t *p) { return p + sizeof(*dest); } -static const uint8_t *get_uvarint(uint64_t *dest, const uint8_t *p) { - union { - uint8_t n8; - uint16_t n16; - uint32_t n32; - uint64_t n64; - } n; +const uint8_t *ngtcp2_get_uvarint(uint64_t *dest, const uint8_t *p) { + uint16_t n16; + uint32_t n32; + uint64_t n64; switch (*p >> 6) { case 0: *dest = *p++; return p; case 1: - memcpy(&n, p, 2); - n.n8 &= 0x3f; - *dest = ngtcp2_ntohs(n.n16); + memcpy(&n16, p, 2); + n16 = ngtcp2_ntohs(n16); + n16 &= 0x3FFFU; + *dest = n16; return p + 2; case 2: - memcpy(&n, p, 4); - n.n8 &= 0x3f; - *dest = ngtcp2_ntohl(n.n32); + memcpy(&n32, p, 4); + n32 = ngtcp2_ntohl(n32); + n32 &= 0x3FFFFFFFU; + *dest = n32; return p + 4; case 3: - memcpy(&n, p, 8); - n.n8 &= 0x3f; - *dest = ngtcp2_ntohl64(n.n64); + memcpy(&n64, p, 8); + n64 = ngtcp2_ntohl64(n64); + n64 &= 0x3FFFFFFFFFFFFFFFU; + *dest = n64; return p + 8; default: @@ -97,14 +97,6 @@ static const uint8_t *get_uvarint(uint64_t *dest, const uint8_t *p) { } } -const uint8_t *ngtcp2_get_uvarint(uint64_t *dest, const uint8_t *p) { - return get_uvarint(dest, p); -} - -const uint8_t *ngtcp2_get_varint(int64_t *dest, const uint8_t *p) { - return get_uvarint((uint64_t *)dest, p); -} - int64_t ngtcp2_get_pkt_num(const uint8_t *p, size_t pkt_numlen) { uint32_t l; uint16_t s; @@ -158,17 +150,17 @@ uint8_t *ngtcp2_put_uvarint(uint8_t *p, uint64_t n) { } if (n < 16384) { rv = ngtcp2_put_uint16be(p, (uint16_t)n); - *p |= 0x40; + *p |= 0x40U; return rv; } if (n < 1073741824) { rv = ngtcp2_put_uint32be(p, (uint32_t)n); - *p |= 0x80; + *p |= 0x80U; return rv; } assert(n < 4611686018427387904ULL); rv = ngtcp2_put_uint64be(p, n); - *p |= 0xc0; + *p |= 0xC0U; return rv; } @@ -178,7 +170,7 @@ uint8_t *ngtcp2_put_uvarint30(uint8_t *p, uint32_t n) { assert(n < 1073741824); rv = ngtcp2_put_uint32be(p, n); - *p |= 0x80; + *p |= 0x80U; return rv; } @@ -200,7 +192,7 @@ uint8_t *ngtcp2_put_pkt_num(uint8_t *p, int64_t pkt_num, size_t len) { } size_t ngtcp2_get_uvarintlen(const uint8_t *p) { - return (size_t)(1u << (*p >> 6)); + return (size_t)(1U << (*p >> 6)); } size_t ngtcp2_put_uvarintlen(uint64_t n) { diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.h index ad924683b8dc..7e7b9f465c51 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.h @@ -80,7 +80,15 @@ const uint8_t *ngtcp2_get_uvarint(uint64_t *dest, const uint8_t *p); * lost in this cast, because the variable-length integer is 62 * bits. It returns |p| plus the number of bytes read from |p|. */ -const uint8_t *ngtcp2_get_varint(int64_t *dest, const uint8_t *p); +static inline const uint8_t *ngtcp2_get_varint(int64_t *dest, + const uint8_t *p) { + uint64_t n; + + p = ngtcp2_get_uvarint(&n, p); + *dest = (int64_t)n; + + return p; +} /* * ngtcp2_get_pkt_num reads encoded packet number from |p|. The diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.c index 1f74e8c58397..f435870ba47d 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.c @@ -28,6 +28,7 @@ #include #include "ngtcp2_net.h" +#include "ngtcp2_str.h" int ngtcp2_crypto_km_new(ngtcp2_crypto_km **pckm, const uint8_t *secret, size_t secretlen, @@ -65,15 +66,21 @@ int ngtcp2_crypto_km_nocopy_new(ngtcp2_crypto_km **pckm, size_t secretlen, } p = (uint8_t *)(*pckm) + sizeof(ngtcp2_crypto_km); - (*pckm)->secret.base = p; - (*pckm)->secret.len = secretlen; - p += secretlen; - (*pckm)->iv.base = p; - (*pckm)->iv.len = ivlen; - (*pckm)->aead_ctx.native_handle = NULL; - (*pckm)->pkt_num = -1; - (*pckm)->use_count = 0; - (*pckm)->flags = NGTCP2_CRYPTO_KM_FLAG_NONE; + + **pckm = (ngtcp2_crypto_km){ + .secret = + { + .base = p, + .len = secretlen, + }, + .iv = + { + .base = p + secretlen, + .len = ivlen, + }, + .pkt_num = -1, + .flags = NGTCP2_CRYPTO_KM_FLAG_NONE, + }; return 0; } @@ -84,13 +91,7 @@ void ngtcp2_crypto_km_del(ngtcp2_crypto_km *ckm, const ngtcp2_mem *mem) { } if (ckm->secret.len) { -#ifdef WIN32 - SecureZeroMemory(ckm->secret.base, ckm->secret.len); -#elif defined(HAVE_EXPLICIT_BZERO) - explicit_bzero(ckm->secret.base, ckm->secret.len); -#elif defined(HAVE_MEMSET_S) - memset_s(ckm->secret.base, ckm->secret.len, 0, ckm->secret.len); -#endif /* defined(HAVE_MEMSET_S) */ + ngtcp2_secure_clear(ckm->secret.base, ckm->secret.len); } ngtcp2_mem_free(mem, ckm); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.h index ca6d494846f3..c1e786b5fc7b 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.h @@ -42,10 +42,10 @@ #define NGTCP2_MAX_AEAD_OVERHEAD 16 /* NGTCP2_CRYPTO_KM_FLAG_NONE indicates that no flag is set. */ -#define NGTCP2_CRYPTO_KM_FLAG_NONE 0x00u +#define NGTCP2_CRYPTO_KM_FLAG_NONE 0x00U /* NGTCP2_CRYPTO_KM_FLAG_KEY_PHASE_ONE is set if key phase bit is set. */ -#define NGTCP2_CRYPTO_KM_FLAG_KEY_PHASE_ONE 0x01u +#define NGTCP2_CRYPTO_KM_FLAG_KEY_PHASE_ONE 0x01U typedef struct ngtcp2_crypto_km { ngtcp2_vec secret; diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_dcidtr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_dcidtr.c index 170b9f803ccc..0360ba82cbd8 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_dcidtr.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_dcidtr.c @@ -157,9 +157,9 @@ int ngtcp2_dcidtr_bind_dcid(ngtcp2_dcidtr *dtr, ngtcp2_dcid **pdest, return 0; } -int ngtcp2_dcidtr_verify_stateless_reset(const ngtcp2_dcidtr *dtr, - const ngtcp2_path *path, - const uint8_t *token) { +int ngtcp2_dcidtr_verify_stateless_reset( + const ngtcp2_dcidtr *dtr, const ngtcp2_path *path, + const ngtcp2_stateless_reset_token *token) { const ngtcp2_dcid *dcid; const ngtcp2_ringbuf *rb = &dtr->bound.rb; size_t i, len = ngtcp2_ringbuf_len(rb); @@ -176,7 +176,7 @@ int ngtcp2_dcidtr_verify_stateless_reset(const ngtcp2_dcidtr *dtr, static int verify_token_uniqueness(const ngtcp2_ringbuf *rb, int *pfound, uint64_t seq, const ngtcp2_cid *cid, - const uint8_t *token) { + const ngtcp2_stateless_reset_token *token) { const ngtcp2_dcid *dcid; size_t i, len = ngtcp2_ringbuf_len(rb); int rv; @@ -196,9 +196,9 @@ static int verify_token_uniqueness(const ngtcp2_ringbuf *rb, int *pfound, return 0; } -int ngtcp2_dcidtr_verify_token_uniqueness(const ngtcp2_dcidtr *dtr, int *pfound, - uint64_t seq, const ngtcp2_cid *cid, - const uint8_t *token) { +int ngtcp2_dcidtr_verify_token_uniqueness( + const ngtcp2_dcidtr *dtr, int *pfound, uint64_t seq, const ngtcp2_cid *cid, + const ngtcp2_stateless_reset_token *token) { int rv; rv = verify_token_uniqueness(&dtr->bound.rb, pfound, seq, cid, token); @@ -386,7 +386,7 @@ ngtcp2_tstamp ngtcp2_dcidtr_earliest_bound_ts(const ngtcp2_dcidtr *dtr) { assert(dcid->cid.datalen); assert(dcid->bound_ts != UINT64_MAX); - res = ngtcp2_min_uint64(res, dcid->bound_ts); + res = ngtcp2_min(res, dcid->bound_ts); } return res; @@ -406,7 +406,8 @@ ngtcp2_tstamp ngtcp2_dcidtr_earliest_retired_ts(const ngtcp2_dcidtr *dtr) { } void ngtcp2_dcidtr_push_unused(ngtcp2_dcidtr *dtr, uint64_t seq, - const ngtcp2_cid *cid, const uint8_t *token) { + const ngtcp2_cid *cid, + const ngtcp2_stateless_reset_token *token) { ngtcp2_dcid *dcid = ngtcp2_ringbuf_push_back(&dtr->unused.rb); ngtcp2_dcid_init(dcid, seq, cid, token); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_dcidtr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_dcidtr.h index 63043427bc09..945ed12bae14 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_dcidtr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_dcidtr.h @@ -154,9 +154,9 @@ int ngtcp2_dcidtr_bind_dcid(ngtcp2_dcidtr *dtr, ngtcp2_dcid **pdest, * There is no Destination Connection ID that matches the given * |path| and |token|. */ -int ngtcp2_dcidtr_verify_stateless_reset(const ngtcp2_dcidtr *dtr, - const ngtcp2_path *path, - const uint8_t *token); +int ngtcp2_dcidtr_verify_stateless_reset( + const ngtcp2_dcidtr *dtr, const ngtcp2_path *path, + const ngtcp2_stateless_reset_token *token); /* * ngtcp2_dcidtr_verify_token_uniqueness verifies that the uniqueness @@ -180,9 +180,9 @@ int ngtcp2_dcidtr_verify_stateless_reset(const ngtcp2_dcidtr *dtr, * The given combination of values does not satisfy the above * conditions. */ -int ngtcp2_dcidtr_verify_token_uniqueness(const ngtcp2_dcidtr *dtr, int *pfound, - uint64_t seq, const ngtcp2_cid *cid, - const uint8_t *token); +int ngtcp2_dcidtr_verify_token_uniqueness( + const ngtcp2_dcidtr *dtr, int *pfound, uint64_t seq, const ngtcp2_cid *cid, + const ngtcp2_stateless_reset_token *token); /* * ngtcp2_dcidtr_retire_inactive_dcid_prior_to retires inactive @@ -273,7 +273,8 @@ ngtcp2_tstamp ngtcp2_dcidtr_earliest_retired_ts(const ngtcp2_dcidtr *dtr); * buffer space is full, the earliest ngtcp2_dcid is removed. */ void ngtcp2_dcidtr_push_unused(ngtcp2_dcidtr *dtr, uint64_t seq, - const ngtcp2_cid *cid, const uint8_t *token); + const ngtcp2_cid *cid, + const ngtcp2_stateless_reset_token *token); /* * ngtcp2_dcidtr_pop_unused_cid_token removes an unused Destination diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_fmt.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_fmt.c new file mode 100644 index 000000000000..63899f7e0393 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_fmt.c @@ -0,0 +1,112 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "ngtcp2_fmt.h" + +#include + +#include "ngtcp2_str.h" + +char *ngtcp2_fmt_write_int64(char *dest, int64_t n) { + if (n < 0) { + *dest++ = '-'; + return ngtcp2_fmt_write_uint64(dest, 0 - (uint64_t)n); + } + + return ngtcp2_fmt_write_uint64(dest, (uint64_t)n); +} + +char *ngtcp2_fmt_write_uint64(char *dest, uint64_t n) { + return (char *)ngtcp2_encode_uint((uint8_t *)dest, n); +} + +char *ngtcp2_fmt_write_char(char *dest, char c) { + *dest++ = c; + + return dest; +} + +char *ngtcp2_fmt_write_str(char *dest, const char *s) { + return ngtcp2_cpymem(dest, s, strlen(s)); +} + +static char *fill_zero(char *dest, size_t len, size_t width) { + if (len < width) { + return (char *)ngtcp2_setmem((uint8_t *)dest, '0', width - len); + } + + return dest; +} + +char *ngtcp2_fmt_write_uint64w(char *dest, ngtcp2_fmt_uint64w f) { + size_t len = ngtcp2_encode_uintlen(f.n); + + return (char *)ngtcp2_encode_uint((uint8_t *)fill_zero(dest, len, f.width), + f.n); +} + +char *ngtcp2_fmt_write_hex(char *dest, ngtcp2_fmt_hex f) { + return (char *)ngtcp2_encode_uint_hex((uint8_t *)dest, f.n); +} + +char *ngtcp2_fmt_write_hexw(char *dest, ngtcp2_fmt_hexw f) { + size_t len = ngtcp2_encode_uint_hexlen(f.n); + + return (char *)ngtcp2_encode_uint_hex( + (uint8_t *)fill_zero(dest, len, f.width), f.n); +} + +char *ngtcp2_fmt_write_cid(char *dest, const ngtcp2_cid *cid) { + return (char *)ngtcp2_encode_hex((uint8_t *)dest, cid->data, cid->datalen); +} + +char *ngtcp2_fmt_write_stateless_reset_token( + char *dest, const ngtcp2_stateless_reset_token *token) { + return (char *)ngtcp2_encode_hex((uint8_t *)dest, token->data, + sizeof(token->data)); +} + +char * +ngtcp2_fmt_write_path_challenge_data(char *dest, + const ngtcp2_path_challenge_data *data) { + return (char *)ngtcp2_encode_hex((uint8_t *)dest, data->data, + sizeof(data->data)); +} + +char *ngtcp2_fmt_write_bhex(char *dest, ngtcp2_fmt_bhex f) { + return (char *)ngtcp2_encode_hex((uint8_t *)dest, f.data, f.len); +} + +char *ngtcp2_fmt_write_in_addr(char *dest, const ngtcp2_in_addr *addr) { + return (char *)ngtcp2_encode_ipv4((uint8_t *)dest, addr); +} + +char *ngtcp2_fmt_write_in6_addr(char *dest, const ngtcp2_in6_addr *addr) { + return (char *)ngtcp2_encode_ipv6((uint8_t *)dest, addr); +} + +char *ngtcp2_fmt_write_printable_ascii(char *dest, + const ngtcp2_fmt_printable_ascii f) { + return (char *)ngtcp2_encode_printable_ascii((uint8_t *)dest, f.data, f.len); +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_fmt.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_fmt.h new file mode 100644 index 000000000000..9d01ffc80b90 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_fmt.h @@ -0,0 +1,1211 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef NGTCP2_FMT_H +#define NGTCP2_FMT_H + +#ifdef HAVE_CONFIG_H +# include +#endif /* defined(HAVE_CONFIG_H) */ + +#include + +typedef struct ngtcp2_fmt_hex { + uint64_t n; +} ngtcp2_fmt_hex; + +static inline ngtcp2_fmt_hex ngtcp2_fmt_hex_init(uint64_t n) { + return (ngtcp2_fmt_hex){ + .n = n, + }; +} + +static inline ngtcp2_fmt_hex ngtcp2_fmt_hex_signed_init(int64_t n) { + return ngtcp2_fmt_hex_init((uint64_t)n); +} + +static inline ngtcp2_fmt_hex ngtcp2_fmt_hex_long_int_init(long int n) { + return ngtcp2_fmt_hex_init((unsigned long int)n); +} + +static inline ngtcp2_fmt_hex ngtcp2_fmt_hex_int_init(int n) { + return ngtcp2_fmt_hex_init((unsigned int)n); +} + +static inline ngtcp2_fmt_hex ngtcp2_fmt_hex_short_int_init(short int n) { + return ngtcp2_fmt_hex_init((unsigned short int)n); +} + +static inline ngtcp2_fmt_hex ngtcp2_fmt_hex_signed_char_init(signed char n) { + return ngtcp2_fmt_hex_init((unsigned char)n); +} + +static inline ngtcp2_fmt_hex ngtcp2_fmt_hex_char_init(char n) { + return ngtcp2_fmt_hex_init((unsigned char)n); +} + +/* hex formats integral |T| in unsigned hexadecimal notation. It + drops the leading zeros. */ +#define hex(T) \ + _Generic((T), \ + long long int: ngtcp2_fmt_hex_signed_init, \ + long int: ngtcp2_fmt_hex_long_int_init, \ + int: ngtcp2_fmt_hex_int_init, \ + short int: ngtcp2_fmt_hex_short_int_init, \ + signed char: ngtcp2_fmt_hex_signed_char_init, \ + char: ngtcp2_fmt_hex_char_init, \ + unsigned long long int: ngtcp2_fmt_hex_init, \ + unsigned long int: ngtcp2_fmt_hex_init, \ + unsigned int: ngtcp2_fmt_hex_init, \ + unsigned short int: ngtcp2_fmt_hex_init, \ + unsigned char: ngtcp2_fmt_hex_init)((T)) + +typedef struct ngtcp2_fmt_hexw { + uint64_t n; + size_t width; +} ngtcp2_fmt_hexw; + +static inline ngtcp2_fmt_hexw ngtcp2_fmt_hexw_init(uint64_t n, size_t width) { + return (ngtcp2_fmt_hexw){ + .n = n, + .width = width, + }; +} + +static inline ngtcp2_fmt_hexw ngtcp2_fmt_hexw_signed_init(int64_t n, + size_t width) { + return ngtcp2_fmt_hexw_init((uint64_t)n, width); +} + +static inline ngtcp2_fmt_hexw ngtcp2_fmt_hexw_long_int_init(long int n, + size_t width) { + return ngtcp2_fmt_hexw_init((unsigned long int)n, width); +} + +static inline ngtcp2_fmt_hexw ngtcp2_fmt_hexw_int_init(int n, size_t width) { + return ngtcp2_fmt_hexw_init((unsigned int)n, width); +} + +static inline ngtcp2_fmt_hexw ngtcp2_fmt_hexw_short_int_init(short int n, + size_t width) { + return ngtcp2_fmt_hexw_init((unsigned short int)n, width); +} + +static inline ngtcp2_fmt_hexw ngtcp2_fmt_hexw_signed_char_init(signed char n, + size_t width) { + return ngtcp2_fmt_hexw_init((unsigned char)n, width); +} + +static inline ngtcp2_fmt_hexw ngtcp2_fmt_hexw_char_init(char n, size_t width) { + return ngtcp2_fmt_hexw_init((unsigned char)n, width); +} + +/* hex formats integral |T| in unsigned hexadecimal notation. If the + produced value has fewer characters than |WIDTH|, it will be padded + with 0 on the left. */ +#define hexw(T, WIDTH) \ + _Generic((T), \ + long long int: ngtcp2_fmt_hexw_signed_init, \ + long int: ngtcp2_fmt_hexw_long_int_init, \ + int: ngtcp2_fmt_hexw_int_init, \ + short int: ngtcp2_fmt_hexw_short_int_init, \ + signed char: ngtcp2_fmt_hexw_signed_char_init, \ + char: ngtcp2_fmt_hexw_char_init, \ + unsigned long long int: ngtcp2_fmt_hexw_init, \ + unsigned long int: ngtcp2_fmt_hexw_init, \ + unsigned int: ngtcp2_fmt_hexw_init, \ + unsigned short int: ngtcp2_fmt_hexw_init, \ + unsigned char: ngtcp2_fmt_hexw_init)((T), (WIDTH)) + +typedef struct ngtcp2_fmt_uint64w { + uint64_t n; + size_t width; +} ngtcp2_fmt_uint64w; + +/* uintw formats integral |n|. If the produced value has fewer + characters than |width|, it will be padded with 0 on the left. */ +static inline ngtcp2_fmt_uint64w uintw(uint64_t n, size_t width) { + return (ngtcp2_fmt_uint64w){ + .n = n, + .width = width, + }; +} + +typedef struct ngtcp2_fmt_bhex { + const uint8_t *data; + size_t len; +} ngtcp2_fmt_bhex; + +/* bhex formats the binary data [|data|, |data| + |len|) in + hexadecimal notation. */ +static inline ngtcp2_fmt_bhex bhex(const uint8_t *data, size_t len) { + return (ngtcp2_fmt_bhex){ + .data = data, + .len = len, + }; +} + +/* lbhex formats the binary data [|B|, |B| + sizeof(|B|)) in + hexadecimal notation. To make it work, |B| must be an array that + is not decayed to the pointer. */ +#define lbhex(B) bhex((B), sizeof(B)) + +typedef struct ngtcp2_fmt_printable_ascii { + const uint8_t *data; + size_t len; +} ngtcp2_fmt_printable_ascii; + +/* ascii formats the binary data [|data|, |data| + |len|) in such a + way that the printable ASCII characters are copied as is, and the + other characters are converted to '.'. */ +static inline ngtcp2_fmt_printable_ascii ascii(const uint8_t *data, + size_t len) { + return (ngtcp2_fmt_printable_ascii){ + .data = data, + .len = len, + }; +} + +#define ngtcp2_fmt_stringify(M) #M + +/* stringify converts macro |M| to string literal.*/ +#define stringify(M) ngtcp2_fmt_stringify(M) + +char *ngtcp2_fmt_write_int64(char *dest, int64_t n); +char *ngtcp2_fmt_write_uint64(char *dest, uint64_t n); +char *ngtcp2_fmt_write_char(char *dest, char c); +char *ngtcp2_fmt_write_str(char *dest, const char *s); +char *ngtcp2_fmt_write_uint64w(char *dest, ngtcp2_fmt_uint64w f); +char *ngtcp2_fmt_write_hex(char *dest, ngtcp2_fmt_hex f); +char *ngtcp2_fmt_write_hexw(char *dest, ngtcp2_fmt_hexw f); +char *ngtcp2_fmt_write_cid(char *dest, const ngtcp2_cid *cid); +char *ngtcp2_fmt_write_stateless_reset_token( + char *dest, const ngtcp2_stateless_reset_token *token); +char * +ngtcp2_fmt_write_path_challenge_data(char *dest, + const ngtcp2_path_challenge_data *data); +char *ngtcp2_fmt_write_bhex(char *dest, ngtcp2_fmt_bhex f); +char *ngtcp2_fmt_write_in_addr(char *dest, const ngtcp2_in_addr *addr); +char *ngtcp2_fmt_write_in6_addr(char *dest, const ngtcp2_in6_addr *addr); +char *ngtcp2_fmt_write_printable_ascii(char *dest, + const ngtcp2_fmt_printable_ascii f); + +#define NGTCP2_FMT_WRITE_TYPE(DEST, T) \ + _Generic((T), \ + long long int: ngtcp2_fmt_write_int64, \ + long int: ngtcp2_fmt_write_int64, \ + int: ngtcp2_fmt_write_int64, \ + short int: ngtcp2_fmt_write_int64, \ + signed char: ngtcp2_fmt_write_int64, \ + char: ngtcp2_fmt_write_char, \ + unsigned long long int: ngtcp2_fmt_write_uint64, \ + unsigned long int: ngtcp2_fmt_write_uint64, \ + unsigned int: ngtcp2_fmt_write_uint64, \ + unsigned short int: ngtcp2_fmt_write_uint64, \ + unsigned char: ngtcp2_fmt_write_uint64, \ + char *: ngtcp2_fmt_write_str, \ + const char *: ngtcp2_fmt_write_str, \ + ngtcp2_cid *: ngtcp2_fmt_write_cid, \ + const ngtcp2_cid *: ngtcp2_fmt_write_cid, \ + ngtcp2_stateless_reset_token *: ngtcp2_fmt_write_stateless_reset_token, \ + const ngtcp2_stateless_reset_token \ + *: ngtcp2_fmt_write_stateless_reset_token, \ + ngtcp2_path_challenge_data *: ngtcp2_fmt_write_path_challenge_data, \ + const ngtcp2_path_challenge_data *: ngtcp2_fmt_write_path_challenge_data, \ + ngtcp2_in_addr *: ngtcp2_fmt_write_in_addr, \ + const ngtcp2_in_addr *: ngtcp2_fmt_write_in_addr, \ + ngtcp2_in6_addr *: ngtcp2_fmt_write_in6_addr, \ + const ngtcp2_in6_addr *: ngtcp2_fmt_write_in6_addr, \ + ngtcp2_fmt_uint64w: ngtcp2_fmt_write_uint64w, \ + ngtcp2_fmt_hex: ngtcp2_fmt_write_hex, \ + ngtcp2_fmt_hexw: ngtcp2_fmt_write_hexw, \ + ngtcp2_fmt_bhex: ngtcp2_fmt_write_bhex, \ + ngtcp2_fmt_printable_ascii: ngtcp2_fmt_write_printable_ascii)((DEST), (T)) + +/* ngtcp2_fmt_format formats arguments and writes them into the buffer + pointed by |BUF|. It also writes the terminal NUL byte. The + function assumes that the buffer is the large enough. It assigns + the number of bytes written, excluding the terminal NUL, to + |*PNWRITE|. */ + +/* Generated by fmtgen.py */ +#define NGTCP2_FMT_SELECT_WRITE_PACK( \ + _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, \ + _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, \ + _33, _34, _35, _36, _37, _38, _39, _40, PACK, ...) \ + PACK + +#define ngtcp2_fmt_format(BUF, PNWRITE, ...) \ + do { \ + char *fmt_destp = (char *)(BUF); \ + NGTCP2_FMT_SELECT_WRITE_PACK( \ + __VA_ARGS__, NGTCP2_FMT_WRITE_PACK_40, NGTCP2_FMT_WRITE_PACK_39, \ + NGTCP2_FMT_WRITE_PACK_38, NGTCP2_FMT_WRITE_PACK_37, \ + NGTCP2_FMT_WRITE_PACK_36, NGTCP2_FMT_WRITE_PACK_35, \ + NGTCP2_FMT_WRITE_PACK_34, NGTCP2_FMT_WRITE_PACK_33, \ + NGTCP2_FMT_WRITE_PACK_32, NGTCP2_FMT_WRITE_PACK_31, \ + NGTCP2_FMT_WRITE_PACK_30, NGTCP2_FMT_WRITE_PACK_29, \ + NGTCP2_FMT_WRITE_PACK_28, NGTCP2_FMT_WRITE_PACK_27, \ + NGTCP2_FMT_WRITE_PACK_26, NGTCP2_FMT_WRITE_PACK_25, \ + NGTCP2_FMT_WRITE_PACK_24, NGTCP2_FMT_WRITE_PACK_23, \ + NGTCP2_FMT_WRITE_PACK_22, NGTCP2_FMT_WRITE_PACK_21, \ + NGTCP2_FMT_WRITE_PACK_20, NGTCP2_FMT_WRITE_PACK_19, \ + NGTCP2_FMT_WRITE_PACK_18, NGTCP2_FMT_WRITE_PACK_17, \ + NGTCP2_FMT_WRITE_PACK_16, NGTCP2_FMT_WRITE_PACK_15, \ + NGTCP2_FMT_WRITE_PACK_14, NGTCP2_FMT_WRITE_PACK_13, \ + NGTCP2_FMT_WRITE_PACK_12, NGTCP2_FMT_WRITE_PACK_11, \ + NGTCP2_FMT_WRITE_PACK_10, NGTCP2_FMT_WRITE_PACK_9, \ + NGTCP2_FMT_WRITE_PACK_8, NGTCP2_FMT_WRITE_PACK_7, \ + NGTCP2_FMT_WRITE_PACK_6, NGTCP2_FMT_WRITE_PACK_5, \ + NGTCP2_FMT_WRITE_PACK_4, NGTCP2_FMT_WRITE_PACK_3, \ + NGTCP2_FMT_WRITE_PACK_2, \ + NGTCP2_FMT_WRITE_PACK_1)(fmt_destp, __VA_ARGS__); \ + *fmt_destp = '\0'; \ + *(PNWRITE) = (size_t)(fmt_destp - (char *)(BUF)); \ + } while (0) + +#define NGTCP2_FMT_WRITE_PACK_1(DEST, _1) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)) +#define NGTCP2_FMT_WRITE_PACK_2(DEST, _1, _2) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)) +#define NGTCP2_FMT_WRITE_PACK_3(DEST, _1, _2, _3) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)) +#define NGTCP2_FMT_WRITE_PACK_4(DEST, _1, _2, _3, _4) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)) +#define NGTCP2_FMT_WRITE_PACK_5(DEST, _1, _2, _3, _4, _5) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)) +#define NGTCP2_FMT_WRITE_PACK_6(DEST, _1, _2, _3, _4, _5, _6) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)) +#define NGTCP2_FMT_WRITE_PACK_7(DEST, _1, _2, _3, _4, _5, _6, _7) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)) +#define NGTCP2_FMT_WRITE_PACK_8(DEST, _1, _2, _3, _4, _5, _6, _7, _8) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)) +#define NGTCP2_FMT_WRITE_PACK_9(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)) +#define NGTCP2_FMT_WRITE_PACK_10(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)) +#define NGTCP2_FMT_WRITE_PACK_11(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)) +#define NGTCP2_FMT_WRITE_PACK_12(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)) +#define NGTCP2_FMT_WRITE_PACK_13(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)) +#define NGTCP2_FMT_WRITE_PACK_14(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)) +#define NGTCP2_FMT_WRITE_PACK_15(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)) +#define NGTCP2_FMT_WRITE_PACK_16(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)) +#define NGTCP2_FMT_WRITE_PACK_17(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)) +#define NGTCP2_FMT_WRITE_PACK_18(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)) +#define NGTCP2_FMT_WRITE_PACK_19(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, \ + _19) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)) +#define NGTCP2_FMT_WRITE_PACK_20(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, \ + _19, _20) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)) +#define NGTCP2_FMT_WRITE_PACK_21(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, \ + _19, _20, _21) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)) +#define NGTCP2_FMT_WRITE_PACK_22(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, \ + _19, _20, _21, _22) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)) +#define NGTCP2_FMT_WRITE_PACK_23(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, \ + _19, _20, _21, _22, _23) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)) +#define NGTCP2_FMT_WRITE_PACK_24(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, \ + _19, _20, _21, _22, _23, _24) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)) +#define NGTCP2_FMT_WRITE_PACK_25(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, \ + _19, _20, _21, _22, _23, _24, _25) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)) +#define NGTCP2_FMT_WRITE_PACK_26(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, \ + _19, _20, _21, _22, _23, _24, _25, _26) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)) +#define NGTCP2_FMT_WRITE_PACK_27(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, \ + _19, _20, _21, _22, _23, _24, _25, _26, _27) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_27)) +#define NGTCP2_FMT_WRITE_PACK_28( \ + DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ + _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_27)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_28)) +#define NGTCP2_FMT_WRITE_PACK_29( \ + DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ + _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_27)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_28)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_29)) +#define NGTCP2_FMT_WRITE_PACK_30( \ + DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ + _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_27)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_28)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_29)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_30)) +#define NGTCP2_FMT_WRITE_PACK_31( \ + DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ + _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_27)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_28)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_29)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_30)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_31)) +#define NGTCP2_FMT_WRITE_PACK_32(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, \ + _19, _20, _21, _22, _23, _24, _25, _26, _27, \ + _28, _29, _30, _31, _32) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_27)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_28)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_29)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_30)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_31)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_32)) +#define NGTCP2_FMT_WRITE_PACK_33(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, \ + _19, _20, _21, _22, _23, _24, _25, _26, _27, \ + _28, _29, _30, _31, _32, _33) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_27)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_28)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_29)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_30)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_31)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_32)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_33)) +#define NGTCP2_FMT_WRITE_PACK_34(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, \ + _19, _20, _21, _22, _23, _24, _25, _26, _27, \ + _28, _29, _30, _31, _32, _33, _34) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_27)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_28)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_29)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_30)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_31)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_32)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_33)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_34)) +#define NGTCP2_FMT_WRITE_PACK_35(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, \ + _19, _20, _21, _22, _23, _24, _25, _26, _27, \ + _28, _29, _30, _31, _32, _33, _34, _35) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_27)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_28)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_29)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_30)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_31)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_32)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_33)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_34)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_35)) +#define NGTCP2_FMT_WRITE_PACK_36(DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, \ + _10, _11, _12, _13, _14, _15, _16, _17, _18, \ + _19, _20, _21, _22, _23, _24, _25, _26, _27, \ + _28, _29, _30, _31, _32, _33, _34, _35, _36) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_27)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_28)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_29)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_30)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_31)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_32)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_33)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_34)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_35)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_36)) +#define NGTCP2_FMT_WRITE_PACK_37( \ + DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ + _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ + _32, _33, _34, _35, _36, _37) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_27)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_28)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_29)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_30)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_31)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_32)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_33)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_34)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_35)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_36)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_37)) +#define NGTCP2_FMT_WRITE_PACK_38( \ + DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ + _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ + _32, _33, _34, _35, _36, _37, _38) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_27)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_28)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_29)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_30)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_31)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_32)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_33)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_34)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_35)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_36)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_37)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_38)) +#define NGTCP2_FMT_WRITE_PACK_39( \ + DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ + _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ + _32, _33, _34, _35, _36, _37, _38, _39) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_27)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_28)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_29)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_30)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_31)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_32)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_33)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_34)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_35)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_36)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_37)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_38)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_39)) +#define NGTCP2_FMT_WRITE_PACK_40( \ + DEST, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ + _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \ + _32, _33, _34, _35, _36, _37, _38, _39, _40) \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_1)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_2)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_3)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_4)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_5)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_6)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_7)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_8)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_9)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_10)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_11)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_12)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_13)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_14)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_15)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_16)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_17)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_18)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_19)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_20)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_21)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_22)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_23)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_24)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_25)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_26)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_27)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_28)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_29)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_30)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_31)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_32)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_33)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_34)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_35)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_36)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_37)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_38)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_39)); \ + (DEST) = NGTCP2_FMT_WRITE_TYPE((DEST), (_40)) + +#endif /* !defined(NGTCP2_FMT_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c index 0f6b06a788d1..ec0839b7a4d1 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c @@ -36,7 +36,7 @@ int ngtcp2_frame_chain_objalloc_new(ngtcp2_frame_chain **pfrc, return NGTCP2_ERR_NOMEM; } - ngtcp2_frame_chain_init(*pfrc); + ngtcp2_frame_chain_init(*pfrc, NGTCP2_FRAME_CHAIN_FLAG_NONE); return 0; } @@ -48,7 +48,7 @@ int ngtcp2_frame_chain_extralen_new(ngtcp2_frame_chain **pfrc, size_t extralen, return NGTCP2_ERR_NOMEM; } - ngtcp2_frame_chain_init(*pfrc); + ngtcp2_frame_chain_init(*pfrc, NGTCP2_FRAME_CHAIN_FLAG_MALLOC); return 0; } @@ -57,14 +57,26 @@ int ngtcp2_frame_chain_stream_datacnt_objalloc_new(ngtcp2_frame_chain **pfrc, size_t datacnt, ngtcp2_objalloc *objalloc, const ngtcp2_mem *mem) { + int rv; + if (datacnt > NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES) { - return ngtcp2_frame_chain_extralen_new(pfrc, - sizeof(ngtcp2_vec) * (datacnt - 1) - - NGTCP2_FRAME_CHAIN_STREAM_AVAIL, - mem); + rv = ngtcp2_frame_chain_extralen_new( + pfrc, + sizeof(ngtcp2_vec) * (datacnt - NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES), + mem); + } else { + rv = ngtcp2_frame_chain_objalloc_new(pfrc, objalloc); + } + + if (rv != 0) { + return rv; } - return ngtcp2_frame_chain_objalloc_new(pfrc, objalloc); + (*pfrc)->fr.stream.data = + (ngtcp2_vec *)(void *)((uint8_t *)*pfrc + + offsetof(ngtcp2_frame_chain, buf)); + + return 0; } int ngtcp2_frame_chain_new_token_objalloc_new(ngtcp2_frame_chain **pfrc, @@ -87,9 +99,9 @@ int ngtcp2_frame_chain_new_token_objalloc_new(ngtcp2_frame_chain **pfrc, } fr = &(*pfrc)->fr; - fr->type = NGTCP2_FRAME_NEW_TOKEN; + fr->new_token.type = NGTCP2_FRAME_NEW_TOKEN; - p = (uint8_t *)fr + sizeof(ngtcp2_new_token); + p = (uint8_t *)*pfrc + offsetof(ngtcp2_frame_chain, buf); memcpy(p, token, tokenlen); fr->new_token.token = p; @@ -98,21 +110,6 @@ int ngtcp2_frame_chain_new_token_objalloc_new(ngtcp2_frame_chain **pfrc, return 0; } -void ngtcp2_frame_chain_del(ngtcp2_frame_chain *frc, const ngtcp2_mem *mem) { - ngtcp2_frame_chain_binder *binder; - - if (frc == NULL) { - return; - } - - binder = frc->binder; - if (binder && --binder->refcount == 0) { - ngtcp2_mem_free(mem, binder); - } - - ngtcp2_mem_free(mem, frc); -} - void ngtcp2_frame_chain_objalloc_del(ngtcp2_frame_chain *frc, ngtcp2_objalloc *objalloc, const ngtcp2_mem *mem) { @@ -122,39 +119,23 @@ void ngtcp2_frame_chain_objalloc_del(ngtcp2_frame_chain *frc, return; } - switch (frc->fr.type) { - case NGTCP2_FRAME_CRYPTO: - case NGTCP2_FRAME_STREAM: - if (frc->fr.stream.datacnt > NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES) { - ngtcp2_frame_chain_del(frc, mem); - - return; - } - - break; - case NGTCP2_FRAME_NEW_TOKEN: - if (frc->fr.new_token.tokenlen > NGTCP2_FRAME_CHAIN_NEW_TOKEN_THRES) { - ngtcp2_frame_chain_del(frc, mem); - - return; - } - - break; - } - binder = frc->binder; if (binder && --binder->refcount == 0) { ngtcp2_mem_free(mem, binder); } - frc->binder = NULL; + if (frc->flags & NGTCP2_FRAME_CHAIN_FLAG_MALLOC) { + ngtcp2_mem_free(mem, frc); + return; + } ngtcp2_objalloc_frame_chain_release(objalloc, frc); } -void ngtcp2_frame_chain_init(ngtcp2_frame_chain *frc) { +void ngtcp2_frame_chain_init(ngtcp2_frame_chain *frc, uint32_t flags) { frc->next = NULL; frc->binder = NULL; + frc->flags = flags; } void ngtcp2_frame_chain_list_objalloc_del(ngtcp2_frame_chain *frc, diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h index 01f07cfa4d95..4b3c300060a4 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h @@ -36,10 +36,10 @@ /* NGTCP2_FRAME_CHAIN_BINDER_FLAG_NONE indicates that no flag is set. */ -#define NGTCP2_FRAME_CHAIN_BINDER_FLAG_NONE 0x00u +#define NGTCP2_FRAME_CHAIN_BINDER_FLAG_NONE 0x00U /* NGTCP2_FRAME_CHAIN_BINDER_FLAG_ACK indicates that an information which a frame carries has been acknowledged. */ -#define NGTCP2_FRAME_CHAIN_BINDER_FLAG_ACK 0x01u +#define NGTCP2_FRAME_CHAIN_BINDER_FLAG_ACK 0x01U /* * ngtcp2_frame_chain_binder binds 2 or more of ngtcp2_frame_chain to @@ -57,6 +57,25 @@ typedef struct ngtcp2_frame_chain_binder { int ngtcp2_frame_chain_binder_new(ngtcp2_frame_chain_binder **pbinder, const ngtcp2_mem *mem); +/* NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES is the number of datacnt + that changes allocation method. If datacnt is more than this + value, ngtcp2_frame_chain is allocated without ngtcp2_objalloc. + Otherwise, it is allocated using ngtcp2_objalloc. */ +#define NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES 4 + +/* NGTCP2_FRAME_CHAIN_NEW_TOKEN_THRES is the length of a token that + changes allocation method. If the length is more than this value, + ngtcp2_frame_chain is allocated without ngtcp2_objalloc. + Otherwise, it is allocated using ngtcp2_objalloc. */ +#define NGTCP2_FRAME_CHAIN_NEW_TOKEN_THRES \ + (NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES * sizeof(ngtcp2_vec)) + +/* NGTCP2_FRAME_CHAIN_FLAG_NONE indicates no flag is set. */ +#define NGTCP2_FRAME_CHAIN_FLAG_NONE 0x0U +/* NGTCP2_FRAME_CHAIN_FLAG_MALLOC indicates that ngtcp2_frame_chain is + allocated by ngtcp2_mem_malloc. */ +#define NGTCP2_FRAME_CHAIN_FLAG_MALLOC 0x1U + typedef struct ngtcp2_frame_chain ngtcp2_frame_chain; /* @@ -67,7 +86,9 @@ struct ngtcp2_frame_chain { struct { ngtcp2_frame_chain *next; ngtcp2_frame_chain_binder *binder; + uint32_t flags; ngtcp2_frame fr; + uint8_t buf[sizeof(ngtcp2_vec) * NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES]; }; ngtcp2_opl_entry oplent; @@ -104,26 +125,6 @@ int ngtcp2_frame_chain_objalloc_new(ngtcp2_frame_chain **pfrc, int ngtcp2_frame_chain_extralen_new(ngtcp2_frame_chain **pfrc, size_t extralen, const ngtcp2_mem *mem); -/* NGTCP2_FRAME_CHAIN_STREAM_AVAIL is the number of additional bytes - available after ngtcp2_stream when it is embedded in - ngtcp2_frame. */ -#define NGTCP2_FRAME_CHAIN_STREAM_AVAIL \ - (sizeof(ngtcp2_frame) - sizeof(ngtcp2_stream)) - -/* NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES is the number of datacnt - that changes allocation method. If datacnt is more than this - value, ngtcp2_frame_chain is allocated without ngtcp2_objalloc. - Otherwise, it is allocated using ngtcp2_objalloc. */ -#define NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES \ - (NGTCP2_FRAME_CHAIN_STREAM_AVAIL / sizeof(ngtcp2_vec) + 1) - -/* NGTCP2_FRAME_CHAIN_NEW_TOKEN_THRES is the length of a token that - changes allocation method. If the length is more than this value, - ngtcp2_frame_chain is allocated without ngtcp2_objalloc. - Otherwise, it is allocated using ngtcp2_objalloc. */ -#define NGTCP2_FRAME_CHAIN_NEW_TOKEN_THRES \ - (sizeof(ngtcp2_frame) - sizeof(ngtcp2_new_token)) - /* * ngtcp2_frame_chain_stream_datacnt_objalloc_new allocates enough * data to store additional |datacnt| - 1 ngtcp2_vec object after @@ -131,8 +132,6 @@ int ngtcp2_frame_chain_extralen_new(ngtcp2_frame_chain **pfrc, size_t extralen, * words, |datacnt| <= NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES, * ngtcp2_frame_chain_objalloc_new is called internally. Otherwise, * ngtcp2_frame_chain_extralen_new is used and objalloc is not used. - * Therefore, it is important to call ngtcp2_frame_chain_objalloc_del - * without changing datacnt field. */ int ngtcp2_frame_chain_stream_datacnt_objalloc_new(ngtcp2_frame_chain **pfrc, size_t datacnt, @@ -153,24 +152,19 @@ int ngtcp2_frame_chain_new_token_objalloc_new(ngtcp2_frame_chain **pfrc, const ngtcp2_mem *mem); /* - * ngtcp2_frame_chain_del deallocates |frc|. It also deallocates the - * memory pointed by |frc|. - */ -void ngtcp2_frame_chain_del(ngtcp2_frame_chain *frc, const ngtcp2_mem *mem); - -/* - * ngtcp2_frame_chain_objalloc_del adds |frc| to |objalloc| for reuse. - * It might just delete |frc| depending on the frame type and the size - * of |frc|. + * ngtcp2_frame_chain_objalloc_del adds |frc| to |objalloc| for reuse + * if NGTCP2_FRAME_CHAIN_FLAG_MALLOC is not set in |frc|->flags. + * Otherwise, it deletes |frc|. */ void ngtcp2_frame_chain_objalloc_del(ngtcp2_frame_chain *frc, ngtcp2_objalloc *objalloc, const ngtcp2_mem *mem); /* - * ngtcp2_frame_chain_init initializes |frc|. + * ngtcp2_frame_chain_init initializes |frc|. |flags| is bitwise-OR + * of zero or more of NGTCP2_FRAME_CHAIN_FLAG_*. */ -void ngtcp2_frame_chain_init(ngtcp2_frame_chain *frc); +void ngtcp2_frame_chain_init(ngtcp2_frame_chain *frc, uint32_t flags); /* * ngtcp2_frame_chain_list_objalloc_del adds all ngtcp2_frame_chain diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.c index d04b9634c205..a2ec5ffa376a 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.c @@ -35,11 +35,11 @@ void ngtcp2_gaptr_init(ngtcp2_gaptr *gaptr, const ngtcp2_mem *mem) { } static int gaptr_gap_init(ngtcp2_gaptr *gaptr) { - ngtcp2_range range = { + static const ngtcp2_range end = { .end = UINT64_MAX, }; - return ngtcp2_ksl_insert(&gaptr->gap, NULL, &range, NULL); + return ngtcp2_ksl_insert(&gaptr->gap, NULL, &end, NULL); } void ngtcp2_gaptr_free(ngtcp2_gaptr *gaptr) { @@ -116,10 +116,6 @@ uint64_t ngtcp2_gaptr_first_gap_offset(const ngtcp2_gaptr *gaptr) { ngtcp2_range ngtcp2_gaptr_get_first_gap_after(const ngtcp2_gaptr *gaptr, uint64_t offset) { - ngtcp2_range q = { - .begin = offset, - .end = offset + 1, - }; ngtcp2_ksl_it it; if (ngtcp2_ksl_len(&gaptr->gap) == 0) { @@ -129,7 +125,11 @@ ngtcp2_range ngtcp2_gaptr_get_first_gap_after(const ngtcp2_gaptr *gaptr, return r; } - it = ngtcp2_ksl_lower_bound_search(&gaptr->gap, &q, + it = ngtcp2_ksl_lower_bound_search(&gaptr->gap, + &(ngtcp2_range){ + .begin = offset, + .end = offset + 1, + }, ngtcp2_ksl_range_exclusive_search); assert(!ngtcp2_ksl_it_end(&it)); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c index 22c131a1ac67..716e51e9a748 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c @@ -31,71 +31,80 @@ #include "ngtcp2_macro.h" #include "ngtcp2_mem.h" -#include "ngtcp2_range.h" static ngtcp2_ksl_blk null_blk; ngtcp2_objalloc_def(ksl_blk, ngtcp2_ksl_blk, oplent) -static size_t ksl_nodelen(size_t keylen) { - assert(keylen >= sizeof(uint64_t)); - - return (sizeof(ngtcp2_ksl_node) + keylen - sizeof(uint64_t) + 0x7u) & - ~(uintptr_t)0x7u; -} +#define NGTCP2_KSL_ALIGNED_BLKLEN \ + ((sizeof(ngtcp2_ksl_blk) + 0x7U) & ~(size_t)0x7U) -static size_t ksl_blklen(size_t nodelen) { - return sizeof(ngtcp2_ksl_blk) + nodelen * NGTCP2_KSL_MAX_NBLK - - sizeof(uint64_t); +static size_t ksl_blklen(size_t aligned_keylen) { + return NGTCP2_KSL_ALIGNED_BLKLEN + NGTCP2_KSL_MAX_NBLK * aligned_keylen; } /* - * ksl_node_set_key sets |key| to |node|. + * ksl_set_nth_key sets |key| to |n|th node under |blk|. */ -static void ksl_node_set_key(ngtcp2_ksl *ksl, ngtcp2_ksl_node *node, - const void *key) { - memcpy(node->key, key, ksl->keylen); +static void ksl_set_nth_key(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, + size_t n, const ngtcp2_ksl_key *key) { + memcpy(blk->keys + n * ksl->aligned_keylen, key, ksl->keylen); } void ngtcp2_ksl_init(ngtcp2_ksl *ksl, ngtcp2_ksl_compar compar, ngtcp2_ksl_search search, size_t keylen, const ngtcp2_mem *mem) { - size_t nodelen = ksl_nodelen(keylen); + size_t aligned_keylen; + + assert(keylen >= sizeof(uint64_t)); + + aligned_keylen = (keylen + 0x7U) & ~(size_t)0x7U; - ngtcp2_objalloc_init(&ksl->blkalloc, - (ksl_blklen(nodelen) + 0xfu) & ~(uintptr_t)0xfu, mem); + assert(aligned_keylen <= UINT16_MAX); - ksl->head = NULL; + ngtcp2_objalloc_init( + &ksl->blkalloc, (ksl_blklen(aligned_keylen) + 0xFU) & ~(size_t)0xFU, mem); + + ksl->root = NULL; ksl->front = ksl->back = NULL; ksl->compar = compar; ksl->search = search; ksl->n = 0; ksl->keylen = keylen; - ksl->nodelen = nodelen; + ksl->aligned_keylen = aligned_keylen; } static ngtcp2_ksl_blk *ksl_blk_objalloc_new(ngtcp2_ksl *ksl) { - return ngtcp2_objalloc_ksl_blk_len_get(&ksl->blkalloc, - ksl_blklen(ksl->nodelen)); + ngtcp2_ksl_blk *blk = ngtcp2_objalloc_ksl_blk_len_get( + &ksl->blkalloc, ksl_blklen(ksl->aligned_keylen)); + + if (!blk) { + return NULL; + } + + blk->keys = (uint8_t *)blk + NGTCP2_KSL_ALIGNED_BLKLEN; + blk->aligned_keylen = (uint16_t)ksl->aligned_keylen; + + return blk; } static void ksl_blk_objalloc_del(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { ngtcp2_objalloc_ksl_blk_release(&ksl->blkalloc, blk); } -static int ksl_head_init(ngtcp2_ksl *ksl) { - ngtcp2_ksl_blk *head = ksl_blk_objalloc_new(ksl); +static int ksl_root_init(ngtcp2_ksl *ksl) { + ngtcp2_ksl_blk *root = ksl_blk_objalloc_new(ksl); - if (!head) { + if (!root) { return NGTCP2_ERR_NOMEM; } - head->next = head->prev = NULL; - head->n = 0; - head->leaf = 1; + root->next = root->prev = NULL; + root->n = 0; + root->leaf = 1; - ksl->head = head; - ksl->front = ksl->back = head; + ksl->root = root; + ksl->front = ksl->back = root; return 0; } @@ -109,7 +118,7 @@ static void ksl_free_blk(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { if (!blk->leaf) { for (i = 0; i < blk->n; ++i) { - ksl_free_blk(ksl, ngtcp2_ksl_nth_node(ksl, blk, i)->blk); + ksl_free_blk(ksl, blk->nodes[i].blk); } } @@ -118,12 +127,12 @@ static void ksl_free_blk(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { #endif /* defined(NOMEMPOOL) */ void ngtcp2_ksl_free(ngtcp2_ksl *ksl) { - if (!ksl || !ksl->head) { + if (!ksl || !ksl->root) { return; } #ifdef NOMEMPOOL - ksl_free_blk(ksl, ksl->head); + ksl_free_blk(ksl, ksl->root); #endif /* defined(NOMEMPOOL) */ ngtcp2_objalloc_free(&ksl->blkalloc); @@ -160,8 +169,10 @@ static ngtcp2_ksl_blk *ksl_split_blk(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { rblk->n = blk->n / 2; blk->n -= rblk->n; - memcpy(rblk->nodes, blk->nodes + ksl->nodelen * blk->n, - ksl->nodelen * rblk->n); + memcpy(rblk->nodes, blk->nodes + blk->n, rblk->n * sizeof(ngtcp2_ksl_node)); + + memcpy(rblk->keys, blk->keys + blk->n * ksl->aligned_keylen, + rblk->n * ksl->aligned_keylen); assert(blk->n >= NGTCP2_KSL_MIN_NBLK); assert(rblk->n >= NGTCP2_KSL_MIN_NBLK); @@ -181,32 +192,31 @@ static ngtcp2_ksl_blk *ksl_split_blk(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { * Out of memory. */ static int ksl_split_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { - ngtcp2_ksl_node *node; - ngtcp2_ksl_blk *lblk = ngtcp2_ksl_nth_node(ksl, blk, i)->blk, *rblk; + ngtcp2_ksl_blk *lblk = blk->nodes[i].blk, *rblk; rblk = ksl_split_blk(ksl, lblk); if (rblk == NULL) { return NGTCP2_ERR_NOMEM; } - memmove(blk->nodes + (i + 2) * ksl->nodelen, - blk->nodes + (i + 1) * ksl->nodelen, - ksl->nodelen * (blk->n - (i + 1))); + memmove(blk->nodes + (i + 2), blk->nodes + (i + 1), + (blk->n - (i + 1)) * sizeof(ngtcp2_ksl_node)); + + memmove(blk->keys + (i + 1) * ksl->aligned_keylen, + blk->keys + i * ksl->aligned_keylen, + (blk->n - i) * ksl->aligned_keylen); - node = ngtcp2_ksl_nth_node(ksl, blk, i + 1); - node->blk = rblk; + blk->nodes[i + 1].blk = rblk; ++blk->n; - ksl_node_set_key(ksl, node, ngtcp2_ksl_nth_node(ksl, rblk, rblk->n - 1)->key); - node = ngtcp2_ksl_nth_node(ksl, blk, i); - ksl_node_set_key(ksl, node, ngtcp2_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); + ksl_set_nth_key(ksl, blk, i, ngtcp2_ksl_blk_nth_key(lblk, lblk->n - 1)); return 0; } /* - * ksl_split_head splits a head (root) block. It increases the height - * of skip list by 1. + * ksl_split_root splits a root block. It increases the height of + * skip list by 1. * * It returns 0 if it succeeds, or one of the following negative error * codes: @@ -214,37 +224,33 @@ static int ksl_split_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { * NGTCP2_ERR_NOMEM * Out of memory. */ -static int ksl_split_head(ngtcp2_ksl *ksl) { - ngtcp2_ksl_blk *rblk = NULL, *lblk, *nhead = NULL; - ngtcp2_ksl_node *node; +static int ksl_split_root(ngtcp2_ksl *ksl) { + ngtcp2_ksl_blk *rblk, *lblk, *nroot; - rblk = ksl_split_blk(ksl, ksl->head); - if (rblk == NULL) { + nroot = ksl_blk_objalloc_new(ksl); + if (nroot == NULL) { return NGTCP2_ERR_NOMEM; } - lblk = ksl->head; - - nhead = ksl_blk_objalloc_new(ksl); - - if (nhead == NULL) { - ksl_blk_objalloc_del(ksl, rblk); + rblk = ksl_split_blk(ksl, ksl->root); + if (rblk == NULL) { + ksl_blk_objalloc_del(ksl, nroot); return NGTCP2_ERR_NOMEM; } - nhead->next = nhead->prev = NULL; - nhead->n = 2; - nhead->leaf = 0; + lblk = ksl->root; - node = ngtcp2_ksl_nth_node(ksl, nhead, 0); - ksl_node_set_key(ksl, node, ngtcp2_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); - node->blk = lblk; + nroot->next = nroot->prev = NULL; + nroot->n = 2; + nroot->leaf = 0; - node = ngtcp2_ksl_nth_node(ksl, nhead, 1); - ksl_node_set_key(ksl, node, ngtcp2_ksl_nth_node(ksl, rblk, rblk->n - 1)->key); - node->blk = rblk; + ksl_set_nth_key(ksl, nroot, 0, ngtcp2_ksl_blk_nth_key(lblk, lblk->n - 1)); + nroot->nodes[0].blk = lblk; - ksl->head = nhead; + ksl_set_nth_key(ksl, nroot, 1, ngtcp2_ksl_blk_nth_key(rblk, rblk->n - 1)); + nroot->nodes[1].blk = rblk; + + ksl->root = nroot; return 0; } @@ -257,16 +263,17 @@ static int ksl_split_head(ngtcp2_ksl *ksl) { */ static void ksl_insert_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i, const ngtcp2_ksl_key *key, void *data) { - ngtcp2_ksl_node *node; - assert(blk->n < NGTCP2_KSL_MAX_NBLK); - memmove(blk->nodes + (i + 1) * ksl->nodelen, blk->nodes + i * ksl->nodelen, - ksl->nodelen * (blk->n - i)); + memmove(blk->nodes + (i + 1), blk->nodes + i, + (blk->n - i) * sizeof(ngtcp2_ksl_node)); - node = ngtcp2_ksl_nth_node(ksl, blk, i); - ksl_node_set_key(ksl, node, key); - node->data = data; + memmove(blk->keys + (i + 1) * ksl->aligned_keylen, + blk->keys + i * ksl->aligned_keylen, + (blk->n - i) * ksl->aligned_keylen); + + ksl_set_nth_key(ksl, blk, i, key); + blk->nodes[i].data = data; ++blk->n; } @@ -278,28 +285,27 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, size_t i; int rv; - if (!ksl->head) { - rv = ksl_head_init(ksl); + if (!ksl->root) { + rv = ksl_root_init(ksl); if (rv != 0) { return rv; } } - if (ksl->head->n == NGTCP2_KSL_MAX_NBLK) { - rv = ksl_split_head(ksl); + if (ksl->root->n == NGTCP2_KSL_MAX_NBLK) { + rv = ksl_split_root(ksl); if (rv != 0) { return rv; } } - blk = ksl->head; + blk = ksl->root; for (;;) { i = ksl->search(ksl, blk, key); if (blk->leaf) { - if (i < blk->n && - !ksl->compar(key, ngtcp2_ksl_nth_node(ksl, blk, i)->key)) { + if (i < blk->n && !ksl->compar(key, ngtcp2_ksl_blk_nth_key(blk, i))) { if (it) { *it = ngtcp2_ksl_end(ksl); } @@ -311,7 +317,7 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, ++ksl->n; if (it) { - ngtcp2_ksl_it_init(it, ksl, blk, i); + ngtcp2_ksl_it_init(it, blk, i); } return 0; @@ -320,17 +326,17 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, if (i == blk->n) { /* This insertion extends the largest key in this subtree. */ for (; !blk->leaf;) { - node = ngtcp2_ksl_nth_node(ksl, blk, blk->n - 1); + node = &blk->nodes[blk->n - 1]; if (node->blk->n == NGTCP2_KSL_MAX_NBLK) { rv = ksl_split_node(ksl, blk, blk->n - 1); if (rv != 0) { return rv; } - node = ngtcp2_ksl_nth_node(ksl, blk, blk->n - 1); + node = &blk->nodes[blk->n - 1]; } - ksl_node_set_key(ksl, node, key); + ksl_set_nth_key(ksl, blk, blk->n - 1, key); blk = node->blk; } @@ -338,13 +344,13 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, ++ksl->n; if (it) { - ngtcp2_ksl_it_init(it, ksl, blk, blk->n - 1); + ngtcp2_ksl_it_init(it, blk, blk->n - 1); } return 0; } - node = ngtcp2_ksl_nth_node(ksl, blk, i); + node = &blk->nodes[i]; if (node->blk->n == NGTCP2_KSL_MAX_NBLK) { rv = ksl_split_node(ksl, blk, i); @@ -352,12 +358,8 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, return rv; } - if (ksl->compar((ngtcp2_ksl_key *)node->key, key)) { - node = ngtcp2_ksl_nth_node(ksl, blk, i + 1); - - if (ksl->compar((ngtcp2_ksl_key *)node->key, key)) { - ksl_node_set_key(ksl, node, key); - } + if (ksl->compar(ngtcp2_ksl_blk_nth_key(blk, i), key)) { + node = &blk->nodes[i + 1]; } } @@ -370,8 +372,12 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, * |i|. */ static void ksl_remove_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { - memmove(blk->nodes + i * ksl->nodelen, blk->nodes + (i + 1) * ksl->nodelen, - ksl->nodelen * (blk->n - (i + 1))); + memmove(blk->nodes + i, blk->nodes + (i + 1), + (blk->n - (i + 1)) * sizeof(ngtcp2_ksl_node)); + + memmove(blk->keys + i * ksl->aligned_keylen, + blk->keys + (i + 1) * ksl->aligned_keylen, + (blk->n - (i + 1)) * ksl->aligned_keylen); --blk->n; } @@ -380,9 +386,9 @@ static void ksl_remove_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { * ksl_merge_node merges 2 nodes which are the nodes at the index of * |i| and |i + 1|. * - * If |blk| is the head (root) block and it contains just 2 nodes - * before merging nodes, the merged block becomes head block, which - * decreases the height of |ksl| by 1. + * If |blk| is the root block and it contains just 2 nodes before + * merging nodes, the merged block becomes root block, which decreases + * the height of |ksl| by 1. * * This function returns the pointer to the merged block. */ @@ -393,15 +399,17 @@ static ngtcp2_ksl_blk *ksl_merge_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, assert(i + 1 < blk->n); - lnode = ngtcp2_ksl_nth_node(ksl, blk, i); + lnode = &blk->nodes[i]; lblk = lnode->blk; - rblk = ngtcp2_ksl_nth_node(ksl, blk, i + 1)->blk; + rblk = blk->nodes[i + 1].blk; + + assert(lblk->n + rblk->n <= NGTCP2_KSL_MAX_NBLK); - assert(lblk->n + rblk->n < NGTCP2_KSL_MAX_NBLK); + memcpy(lblk->nodes + lblk->n, rblk->nodes, rblk->n * sizeof(ngtcp2_ksl_node)); - memcpy(lblk->nodes + ksl->nodelen * lblk->n, rblk->nodes, - ksl->nodelen * rblk->n); + memcpy(lblk->keys + lblk->n * ksl->aligned_keylen, rblk->keys, + rblk->n * ksl->aligned_keylen); lblk->n += rblk->n; lblk->next = rblk->next; @@ -414,13 +422,12 @@ static ngtcp2_ksl_blk *ksl_merge_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, ksl_blk_objalloc_del(ksl, rblk); - if (ksl->head == blk && blk->n == 2) { - ksl_blk_objalloc_del(ksl, ksl->head); - ksl->head = lblk; + if (ksl->root == blk && blk->n == 2) { + ksl_blk_objalloc_del(ksl, ksl->root); + ksl->root = lblk; } else { ksl_remove_node(ksl, blk, i + 1); - ksl_node_set_key(ksl, lnode, - ngtcp2_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); + ksl_set_nth_key(ksl, blk, i, ngtcp2_ksl_blk_nth_key(lblk, lblk->n - 1)); } return lblk; @@ -438,8 +445,8 @@ static void ksl_shift_left(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { assert(i > 0); - lnode = ngtcp2_ksl_nth_node(ksl, blk, i - 1); - rnode = ngtcp2_ksl_nth_node(ksl, blk, i); + lnode = &blk->nodes[i - 1]; + rnode = &blk->nodes[i]; lblk = lnode->blk; rblk = rnode->blk; @@ -453,15 +460,20 @@ static void ksl_shift_left(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { assert(lblk->n <= NGTCP2_KSL_MAX_NBLK - n); assert(rblk->n >= NGTCP2_KSL_MIN_NBLK + n); - memcpy(lblk->nodes + ksl->nodelen * lblk->n, rblk->nodes, ksl->nodelen * n); + memcpy(lblk->nodes + lblk->n, rblk->nodes, n * sizeof(ngtcp2_ksl_node)); + + memcpy(lblk->keys + lblk->n * ksl->aligned_keylen, rblk->keys, + n * ksl->aligned_keylen); lblk->n += (uint32_t)n; rblk->n -= (uint32_t)n; - ksl_node_set_key(ksl, lnode, - ngtcp2_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); + ksl_set_nth_key(ksl, blk, i - 1, ngtcp2_ksl_blk_nth_key(lblk, lblk->n - 1)); - memmove(rblk->nodes, rblk->nodes + ksl->nodelen * n, ksl->nodelen * rblk->n); + memmove(rblk->nodes, rblk->nodes + n, rblk->n * sizeof(ngtcp2_ksl_node)); + + memmove(rblk->keys, rblk->keys + n * ksl->aligned_keylen, + rblk->n * ksl->aligned_keylen); } /* @@ -476,8 +488,8 @@ static void ksl_shift_right(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { assert(i < blk->n - 1); - lnode = ngtcp2_ksl_nth_node(ksl, blk, i); - rnode = ngtcp2_ksl_nth_node(ksl, blk, i + 1); + lnode = &blk->nodes[i]; + rnode = &blk->nodes[i + 1]; lblk = lnode->blk; rblk = rnode->blk; @@ -491,15 +503,20 @@ static void ksl_shift_right(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { assert(lblk->n >= NGTCP2_KSL_MIN_NBLK + n); assert(rblk->n <= NGTCP2_KSL_MAX_NBLK - n); - memmove(rblk->nodes + ksl->nodelen * n, rblk->nodes, ksl->nodelen * rblk->n); + memmove(rblk->nodes + n, rblk->nodes, rblk->n * sizeof(ngtcp2_ksl_node)); + + memmove(rblk->keys + n * ksl->aligned_keylen, rblk->keys, + rblk->n * ksl->aligned_keylen); rblk->n += (uint32_t)n; lblk->n -= (uint32_t)n; - memcpy(rblk->nodes, lblk->nodes + ksl->nodelen * lblk->n, ksl->nodelen * n); + memcpy(rblk->nodes, lblk->nodes + lblk->n, n * sizeof(ngtcp2_ksl_node)); - ksl_node_set_key(ksl, lnode, - ngtcp2_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); + memcpy(rblk->keys, lblk->keys + lblk->n * ksl->aligned_keylen, + n * ksl->aligned_keylen); + + ksl_set_nth_key(ksl, blk, i, ngtcp2_ksl_blk_nth_key(lblk, lblk->n - 1)); } /* @@ -516,9 +533,9 @@ int ngtcp2_ksl_remove_hint(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, const ngtcp2_ksl_key *key) { ngtcp2_ksl_blk *blk = hint->blk; - assert(ksl->head); + assert(ksl->root); - if (blk->n <= NGTCP2_KSL_MIN_NBLK) { + if (blk != ksl->root && blk->n == NGTCP2_KSL_MIN_NBLK) { return ngtcp2_ksl_remove(ksl, it, key); } @@ -528,9 +545,9 @@ int ngtcp2_ksl_remove_hint(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, if (it) { if (hint->i == blk->n && blk->next) { - ngtcp2_ksl_it_init(it, ksl, blk->next, 0); + ngtcp2_ksl_it_init(it, blk->next, 0); } else { - ngtcp2_ksl_it_init(it, ksl, blk, hint->i); + ngtcp2_ksl_it_init(it, blk, hint->i); } } @@ -539,7 +556,7 @@ int ngtcp2_ksl_remove_hint(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, const ngtcp2_ksl_key *key) { - ngtcp2_ksl_blk *blk = ksl->head; + ngtcp2_ksl_blk *blk = ksl->root; ngtcp2_ksl_node *node; size_t i; @@ -548,8 +565,8 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, } if (!blk->leaf && blk->n == 2 && - ngtcp2_ksl_nth_node(ksl, blk, 0)->blk->n == NGTCP2_KSL_MIN_NBLK && - ngtcp2_ksl_nth_node(ksl, blk, 1)->blk->n == NGTCP2_KSL_MIN_NBLK) { + blk->nodes[0].blk->n == NGTCP2_KSL_MIN_NBLK && + blk->nodes[1].blk->n == NGTCP2_KSL_MIN_NBLK) { blk = ksl_merge_node(ksl, blk, 0); } @@ -565,7 +582,7 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, } if (blk->leaf) { - if (ksl->compar(key, ngtcp2_ksl_nth_node(ksl, blk, i)->key)) { + if (ksl->compar(key, ngtcp2_ksl_blk_nth_key(blk, i))) { if (it) { *it = ngtcp2_ksl_end(ksl); } @@ -578,16 +595,16 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, if (it) { if (blk->n == i && blk->next) { - ngtcp2_ksl_it_init(it, ksl, blk->next, 0); + ngtcp2_ksl_it_init(it, blk->next, 0); } else { - ngtcp2_ksl_it_init(it, ksl, blk, i); + ngtcp2_ksl_it_init(it, blk, i); } } return 0; } - node = ngtcp2_ksl_nth_node(ksl, blk, i); + node = &blk->nodes[i]; if (node->blk->n > NGTCP2_KSL_MIN_NBLK) { blk = node->blk; @@ -596,16 +613,14 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, assert(node->blk->n == NGTCP2_KSL_MIN_NBLK); - if (i + 1 < blk->n && - ngtcp2_ksl_nth_node(ksl, blk, i + 1)->blk->n > NGTCP2_KSL_MIN_NBLK) { + if (i + 1 < blk->n && blk->nodes[i + 1].blk->n > NGTCP2_KSL_MIN_NBLK) { ksl_shift_left(ksl, blk, i + 1); blk = node->blk; continue; } - if (i > 0 && - ngtcp2_ksl_nth_node(ksl, blk, i - 1)->blk->n > NGTCP2_KSL_MIN_NBLK) { + if (i > 0 && blk->nodes[i - 1].blk->n > NGTCP2_KSL_MIN_NBLK) { ksl_shift_right(ksl, blk, i - 1); blk = node->blk; @@ -631,12 +646,12 @@ ngtcp2_ksl_it ngtcp2_ksl_lower_bound(const ngtcp2_ksl *ksl, ngtcp2_ksl_it ngtcp2_ksl_lower_bound_search(const ngtcp2_ksl *ksl, const ngtcp2_ksl_key *key, ngtcp2_ksl_search search) { - ngtcp2_ksl_blk *blk = ksl->head; + ngtcp2_ksl_blk *blk = ksl->root; ngtcp2_ksl_it it; size_t i; if (!blk) { - ngtcp2_ksl_it_init(&it, ksl, &null_blk, 0); + ngtcp2_ksl_it_init(&it, &null_blk, 0); return it; } @@ -649,7 +664,7 @@ ngtcp2_ksl_it ngtcp2_ksl_lower_bound_search(const ngtcp2_ksl *ksl, i = 0; } - ngtcp2_ksl_it_init(&it, ksl, blk, i); + ngtcp2_ksl_it_init(&it, blk, i); return it; } @@ -657,7 +672,7 @@ ngtcp2_ksl_it ngtcp2_ksl_lower_bound_search(const ngtcp2_ksl *ksl, if (i == blk->n) { /* This happens if descendant has smaller key. Fast forward to find last node in this subtree. */ - for (; !blk->leaf; blk = ngtcp2_ksl_nth_node(ksl, blk, blk->n - 1)->blk) + for (; !blk->leaf; blk = blk->nodes[blk->n - 1].blk) ; if (blk->next) { @@ -667,39 +682,41 @@ ngtcp2_ksl_it ngtcp2_ksl_lower_bound_search(const ngtcp2_ksl *ksl, i = blk->n; } - ngtcp2_ksl_it_init(&it, ksl, blk, i); + ngtcp2_ksl_it_init(&it, blk, i); return it; } - blk = ngtcp2_ksl_nth_node(ksl, blk, i)->blk; + blk = blk->nodes[i].blk; } } void ngtcp2_ksl_update_key(ngtcp2_ksl *ksl, const ngtcp2_ksl_key *old_key, const ngtcp2_ksl_key *new_key) { - ngtcp2_ksl_blk *blk = ksl->head; + ngtcp2_ksl_blk *blk = ksl->root; ngtcp2_ksl_node *node; + const ngtcp2_ksl_key *node_key; size_t i; - assert(ksl->head); + assert(ksl->root); for (;;) { i = ksl->search(ksl, blk, old_key); assert(i < blk->n); - node = ngtcp2_ksl_nth_node(ksl, blk, i); + node = &blk->nodes[i]; + node_key = ngtcp2_ksl_blk_nth_key(blk, i); if (blk->leaf) { - assert(key_equal(ksl->compar, (ngtcp2_ksl_key *)node->key, old_key)); - ksl_node_set_key(ksl, node, new_key); + assert(key_equal(ksl->compar, node_key, old_key)); + ksl_set_nth_key(ksl, blk, i, new_key); return; } - if (key_equal(ksl->compar, (ngtcp2_ksl_key *)node->key, old_key) || - ksl->compar((ngtcp2_ksl_key *)node->key, new_key)) { - ksl_node_set_key(ksl, node, new_key); + if (key_equal(ksl->compar, node_key, old_key) || + ksl->compar(node_key, new_key)) { + ksl_set_nth_key(ksl, blk, i, new_key); } blk = node->blk; @@ -709,15 +726,15 @@ void ngtcp2_ksl_update_key(ngtcp2_ksl *ksl, const ngtcp2_ksl_key *old_key, size_t ngtcp2_ksl_len(const ngtcp2_ksl *ksl) { return ksl->n; } void ngtcp2_ksl_clear(ngtcp2_ksl *ksl) { - if (!ksl->head) { + if (!ksl->root) { return; } #ifdef NOMEMPOOL - ksl_free_blk(ksl, ksl->head); + ksl_free_blk(ksl, ksl->root); #endif /* defined(NOMEMPOOL) */ - ksl->front = ksl->back = ksl->head = NULL; + ksl->front = ksl->back = ksl->root = NULL; ksl->n = 0; ngtcp2_objalloc_clear(&ksl->blkalloc); @@ -727,14 +744,12 @@ void ngtcp2_ksl_clear(ngtcp2_ksl *ksl) { static void ksl_print(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t level) { size_t i; - ngtcp2_ksl_node *node; fprintf(stderr, "LV=%zu n=%u\n", level, blk->n); if (blk->leaf) { for (i = 0; i < blk->n; ++i) { - node = ngtcp2_ksl_nth_node(ksl, blk, i); - fprintf(stderr, " %" PRId64, *(int64_t *)(void *)node->key); + fprintf(stderr, " %" PRId64, *(int64_t *)ngtcp2_ksl_blk_nth_key(blk, i)); } fprintf(stderr, "\n"); @@ -743,26 +758,26 @@ static void ksl_print(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, } for (i = 0; i < blk->n; ++i) { - ksl_print(ksl, ngtcp2_ksl_nth_node(ksl, blk, i)->blk, level + 1); + ksl_print(ksl, blk->nodes[i].blk, level + 1); } } void ngtcp2_ksl_print(const ngtcp2_ksl *ksl) { - if (!ksl->head) { + if (!ksl->root) { return; } - ksl_print(ksl, ksl->head, 0); + ksl_print(ksl, ksl->root, 0); } #endif /* !defined(WIN32) */ ngtcp2_ksl_it ngtcp2_ksl_begin(const ngtcp2_ksl *ksl) { ngtcp2_ksl_it it; - if (ksl->head) { - ngtcp2_ksl_it_init(&it, ksl, ksl->front, 0); + if (ksl->root) { + ngtcp2_ksl_it_init(&it, ksl->front, 0); } else { - ngtcp2_ksl_it_init(&it, ksl, &null_blk, 0); + ngtcp2_ksl_it_init(&it, &null_blk, 0); } return it; @@ -771,18 +786,16 @@ ngtcp2_ksl_it ngtcp2_ksl_begin(const ngtcp2_ksl *ksl) { ngtcp2_ksl_it ngtcp2_ksl_end(const ngtcp2_ksl *ksl) { ngtcp2_ksl_it it; - if (ksl->head) { - ngtcp2_ksl_it_init(&it, ksl, ksl->back, ksl->back->n); + if (ksl->root) { + ngtcp2_ksl_it_init(&it, ksl->back, ksl->back->n); } else { - ngtcp2_ksl_it_init(&it, ksl, &null_blk, 0); + ngtcp2_ksl_it_init(&it, &null_blk, 0); } return it; } -void ngtcp2_ksl_it_init(ngtcp2_ksl_it *it, const ngtcp2_ksl *ksl, - ngtcp2_ksl_blk *blk, size_t i) { - it->ksl = ksl; +void ngtcp2_ksl_it_init(ngtcp2_ksl_it *it, ngtcp2_ksl_blk *blk, size_t i) { it->blk = blk; it->i = i; } @@ -802,12 +815,6 @@ int ngtcp2_ksl_it_begin(const ngtcp2_ksl_it *it) { return it->i == 0 && it->blk->prev == NULL; } -int ngtcp2_ksl_range_compar(const ngtcp2_ksl_key *lhs, - const ngtcp2_ksl_key *rhs) { - const ngtcp2_range *a = lhs, *b = rhs; - return a->begin < b->begin; -} - ngtcp2_ksl_search_def(range, ngtcp2_ksl_range_compar) size_t ngtcp2_ksl_range_search(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, @@ -815,13 +822,6 @@ size_t ngtcp2_ksl_range_search(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, return ksl_range_search(ksl, blk, key); } -int ngtcp2_ksl_range_exclusive_compar(const ngtcp2_ksl_key *lhs, - const ngtcp2_ksl_key *rhs) { - const ngtcp2_range *a = lhs, *b = rhs; - return a->begin < b->begin && !(ngtcp2_max_uint64(a->begin, b->begin) < - ngtcp2_min_uint64(a->end, b->end)); -} - ngtcp2_ksl_search_def(range_exclusive, ngtcp2_ksl_range_exclusive_compar) size_t ngtcp2_ksl_range_exclusive_search(const ngtcp2_ksl *ksl, @@ -830,11 +830,6 @@ size_t ngtcp2_ksl_range_exclusive_search(const ngtcp2_ksl *ksl, return ksl_range_exclusive_search(ksl, blk, key); } -int ngtcp2_ksl_uint64_less(const ngtcp2_ksl_key *lhs, - const ngtcp2_ksl_key *rhs) { - return *(uint64_t *)lhs < *(uint64_t *)rhs; -} - ngtcp2_ksl_search_def(uint64_less, ngtcp2_ksl_uint64_less) size_t ngtcp2_ksl_uint64_less_search(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, @@ -842,11 +837,6 @@ size_t ngtcp2_ksl_uint64_less_search(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, return ksl_uint64_less_search(ksl, blk, key); } -int ngtcp2_ksl_int64_greater(const ngtcp2_ksl_key *lhs, - const ngtcp2_ksl_key *rhs) { - return *(int64_t *)lhs > *(int64_t *)rhs; -} - ngtcp2_ksl_search_def(int64_greater, ngtcp2_ksl_int64_greater) size_t ngtcp2_ksl_int64_greater_search(const ngtcp2_ksl *ksl, diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h index d5c3f61d2acc..9ef201a8dbb9 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h @@ -34,14 +34,15 @@ #include #include "ngtcp2_objalloc.h" +#include "ngtcp2_range.h" #define NGTCP2_KSL_DEGR 16 /* NGTCP2_KSL_MAX_NBLK is the maximum number of nodes which a single block can contain. */ -#define NGTCP2_KSL_MAX_NBLK (2 * NGTCP2_KSL_DEGR - 1) +#define NGTCP2_KSL_MAX_NBLK (2 * NGTCP2_KSL_DEGR) /* NGTCP2_KSL_MIN_NBLK is the minimum number of nodes which a single block other than root must contain. */ -#define NGTCP2_KSL_MIN_NBLK (NGTCP2_KSL_DEGR - 1) +#define NGTCP2_KSL_MIN_NBLK NGTCP2_KSL_DEGR /* * ngtcp2_ksl_key represents key in ngtcp2_ksl. @@ -55,22 +56,13 @@ typedef struct ngtcp2_ksl_blk ngtcp2_ksl_blk; /* * ngtcp2_ksl_node is a node which contains either ngtcp2_ksl_blk or * opaque data. If a node is an internal node, it contains - * ngtcp2_ksl_blk. Otherwise, it has data. The key is stored at the - * location starting at key. + * ngtcp2_ksl_blk. Otherwise, it has data. */ struct ngtcp2_ksl_node { union { ngtcp2_ksl_blk *blk; void *data; }; - union { - uint64_t align; - /* key is a buffer to include key associated to this node. - Because the length of key is unknown until ngtcp2_ksl_init is - called, the actual buffer will be allocated after this - field. */ - uint8_t key[1]; - }; }; /* @@ -84,19 +76,19 @@ struct ngtcp2_ksl_blk { /* prev points to the previous block if leaf field is nonzero. */ ngtcp2_ksl_blk *prev; + ngtcp2_ksl_node nodes[NGTCP2_KSL_MAX_NBLK]; + /* keys is a pointer to the buffer to include + NGTCP2_KSL_MAX_NBLK keys. Because the length of key is + unknown until ngtcp2_ksl_init is called, the actual buffer + will be allocated after this object. */ + uint8_t *keys; /* n is the number of nodes this object contains in nodes. */ uint32_t n; + /* aligned_keylen is the length of the single key including + alignment. */ + uint16_t aligned_keylen; /* leaf is nonzero if this block contains leaf nodes. */ - uint32_t leaf; - union { - uint64_t align; - /* nodes is a buffer to contain NGTCP2_KSL_MAX_NBLK - ngtcp2_ksl_node objects. Because ngtcp2_ksl_node object is - allocated along with the additional variable length key - storage, the size of buffer is unknown until ngtcp2_ksl_init is - called. */ - uint8_t nodes[1]; - }; + uint8_t leaf; }; ngtcp2_opl_entry oplent; @@ -131,11 +123,10 @@ typedef size_t (*ngtcp2_ksl_search)(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, static size_t ksl_##NAME##_search( \ const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, const ngtcp2_ksl_key *key) { \ size_t i; \ - ngtcp2_ksl_node *node; \ + uint8_t *node_key; \ \ - for (i = 0, node = (ngtcp2_ksl_node *)(void *)blk->nodes; \ - i < blk->n && COMPAR((ngtcp2_ksl_key *)node->key, key); ++i, \ - node = (ngtcp2_ksl_node *)(void *)((uint8_t *)node + ksl->nodelen)) \ + for (i = 0, node_key = blk->keys; i < blk->n && COMPAR(node_key, key); \ + ++i, node_key += ksl->aligned_keylen) \ ; \ \ return i; \ @@ -147,7 +138,6 @@ typedef struct ngtcp2_ksl_it ngtcp2_ksl_it; * ngtcp2_ksl_it is a bidirectional iterator to iterate nodes. */ struct ngtcp2_ksl_it { - const ngtcp2_ksl *ksl; ngtcp2_ksl_blk *blk; size_t i; }; @@ -157,8 +147,8 @@ struct ngtcp2_ksl_it { */ struct ngtcp2_ksl { ngtcp2_objalloc blkalloc; - /* head points to the root block. */ - ngtcp2_ksl_blk *head; + /* root points to the root block. */ + ngtcp2_ksl_blk *root; /* front points to the first leaf block. */ ngtcp2_ksl_blk *front; /* back points to the last leaf block. */ @@ -169,9 +159,7 @@ struct ngtcp2_ksl { size_t n; /* keylen is the size of key */ size_t keylen; - /* nodelen is the actual size of ngtcp2_ksl_node including key - storage. */ - size_t nodelen; + size_t aligned_keylen; }; /* @@ -290,12 +278,11 @@ size_t ngtcp2_ksl_len(const ngtcp2_ksl *ksl); void ngtcp2_ksl_clear(ngtcp2_ksl *ksl); /* - * ngtcp2_ksl_nth_node returns the |n|th node under |blk|. + * ngtcp2_ksl_blk_nth_key returns the |n|th key under |blk|. */ -static inline ngtcp2_ksl_node *ngtcp2_ksl_nth_node(const ngtcp2_ksl *ksl, - const ngtcp2_ksl_blk *blk, - size_t n) { - return (ngtcp2_ksl_node *)(void *)(blk->nodes + ksl->nodelen * n); +static inline const ngtcp2_ksl_key * +ngtcp2_ksl_blk_nth_key(const ngtcp2_ksl_blk *blk, size_t n) { + return blk->keys + n * blk->aligned_keylen; } #ifndef WIN32 @@ -310,8 +297,7 @@ void ngtcp2_ksl_print(const ngtcp2_ksl *ksl); /* * ngtcp2_ksl_it_init initializes |it|. */ -void ngtcp2_ksl_it_init(ngtcp2_ksl_it *it, const ngtcp2_ksl *ksl, - ngtcp2_ksl_blk *blk, size_t i); +void ngtcp2_ksl_it_init(ngtcp2_ksl_it *it, ngtcp2_ksl_blk *blk, size_t i); /* * ngtcp2_ksl_it_get returns the data associated to the node which @@ -319,7 +305,7 @@ void ngtcp2_ksl_it_init(ngtcp2_ksl_it *it, const ngtcp2_ksl *ksl, * ngtcp2_ksl_it_end(it) returns nonzero. */ static inline void *ngtcp2_ksl_it_get(const ngtcp2_ksl_it *it) { - return ngtcp2_ksl_nth_node(it->ksl, it->blk, it->i)->data; + return it->blk->nodes[it->i].data; } /* @@ -361,8 +347,8 @@ int ngtcp2_ksl_it_begin(const ngtcp2_ksl_it *it); * It is undefined to call this function when ngtcp2_ksl_it_end(it) * returns nonzero. */ -static inline ngtcp2_ksl_key *ngtcp2_ksl_it_key(const ngtcp2_ksl_it *it) { - return (ngtcp2_ksl_key *)ngtcp2_ksl_nth_node(it->ksl, it->blk, it->i)->key; +static inline const ngtcp2_ksl_key *ngtcp2_ksl_it_key(const ngtcp2_ksl_it *it) { + return ngtcp2_ksl_blk_nth_key(it->blk, it->i); } /* @@ -371,8 +357,12 @@ static inline ngtcp2_ksl_key *ngtcp2_ksl_it_key(const ngtcp2_ksl_it *it) { * returns nonzero if ((const ngtcp2_range *)lhs)->begin < ((const * ngtcp2_range *)rhs)->begin. */ -int ngtcp2_ksl_range_compar(const ngtcp2_ksl_key *lhs, - const ngtcp2_ksl_key *rhs); +static inline int ngtcp2_ksl_range_compar(const ngtcp2_ksl_key *lhs, + const ngtcp2_ksl_key *rhs) { + const ngtcp2_range *a = (const ngtcp2_range *)lhs, + *b = (const ngtcp2_range *)rhs; + return a->begin < b->begin; +} /* * ngtcp2_ksl_range_search is an implementation of ngtcp2_ksl_search @@ -388,8 +378,13 @@ size_t ngtcp2_ksl_range_search(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, * *)lhs)->begin < ((const ngtcp2_range *)rhs)->begin, and the 2 * ranges do not intersect. */ -int ngtcp2_ksl_range_exclusive_compar(const ngtcp2_ksl_key *lhs, - const ngtcp2_ksl_key *rhs); +static inline int ngtcp2_ksl_range_exclusive_compar(const ngtcp2_ksl_key *lhs, + const ngtcp2_ksl_key *rhs) { + const ngtcp2_range *a = (const ngtcp2_range *)lhs, + *b = (const ngtcp2_range *)rhs; + return a->begin < b->begin && + !(ngtcp2_max(a->begin, b->begin) < ngtcp2_min(a->end, b->end)); +} /* * ngtcp2_ksl_range_exclusive_search is an implementation of @@ -404,8 +399,10 @@ size_t ngtcp2_ksl_range_exclusive_search(const ngtcp2_ksl *ksl, * |lhs| and |rhs| must point to uint64_t objects, and the function * returns nonzero if *(uint64_t *)|lhs| < *(uint64_t *)|rhs|. */ -int ngtcp2_ksl_uint64_less(const ngtcp2_ksl_key *lhs, - const ngtcp2_ksl_key *rhs); +static inline int ngtcp2_ksl_uint64_less(const ngtcp2_ksl_key *lhs, + const ngtcp2_ksl_key *rhs) { + return *(const uint64_t *)lhs < *(const uint64_t *)rhs; +} /* * ngtcp2_ksl_uint64_less_search is an implementation of @@ -419,8 +416,10 @@ size_t ngtcp2_ksl_uint64_less_search(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, * |lhs| and |rhs| must point to int64_t objects, and the function * returns nonzero if *(int64_t *)|lhs| > *(int64_t *)|rhs|. */ -int ngtcp2_ksl_int64_greater(const ngtcp2_ksl_key *lhs, - const ngtcp2_ksl_key *rhs); +static inline int ngtcp2_ksl_int64_greater(const ngtcp2_ksl_key *lhs, + const ngtcp2_ksl_key *rhs) { + return *(const int64_t *)lhs > *(const int64_t *)rhs; +} /* * ngtcp2_ksl_int64_greater_search is an implementation of diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.c index e006c22e4e7f..51a9d70d13c4 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.c @@ -39,17 +39,19 @@ #include "ngtcp2_net.h" void ngtcp2_log_init(ngtcp2_log *log, const ngtcp2_cid *scid, - ngtcp2_printf log_printf, ngtcp2_tstamp ts, - void *user_data) { + ngtcp2_log_write log_write, ngtcp2_printf log_printf, + char *buf, ngtcp2_tstamp ts, void *user_data) { if (scid) { - ngtcp2_encode_hex(log->scid, scid->data, scid->datalen); + *ngtcp2_encode_hex((uint8_t *)log->scid, scid->data, scid->datalen) = '\0'; } else { log->scid[0] = '\0'; } + log->log_write = log_write; log->log_printf = log_printf; - log->events = 0xff; + log->events = 0xFF; log->ts = log->last_ts = ts; log->user_data = user_data; + log->buf = buf; } /* @@ -90,23 +92,9 @@ void ngtcp2_log_init(ngtcp2_log *log, const ngtcp2_cid *scid, * Frame type in hex string. */ -#define NGTCP2_LOG_BUFLEN 4096 +#define NGTCP2_LOG_TP "remote transport_parameters" -/* TODO Split second and remaining fraction with comma */ -#define NGTCP2_LOG_HD "I%08" PRIu64 " 0x%s %s" -#define NGTCP2_LOG_PKT NGTCP2_LOG_HD " %s %" PRId64 " %s" -#define NGTCP2_LOG_TP NGTCP2_LOG_HD " remote transport_parameters" - -#define NGTCP2_LOG_FRM_HD_FIELDS(DIR) \ - timestamp_cast(log->last_ts - log->ts), (const char *)log->scid, "frm", \ - (DIR), hd->pkt_num, strpkttype(hd) - -#define NGTCP2_LOG_PKT_HD_FIELDS(DIR) \ - timestamp_cast(log->last_ts - log->ts), (const char *)log->scid, "pkt", \ - (DIR), hd->pkt_num, strpkttype(hd) - -#define NGTCP2_LOG_TP_HD_FIELDS \ - timestamp_cast(log->last_ts - log->ts), (const char *)log->scid, "cry" +#define NGTCP2_LOG_PKT(DIR, HD) (DIR), " ", (HD)->pkt_num, " ", strpkttype((HD)) static const char *strerrorcode(uint64_t error_code) { switch (error_code) { @@ -140,10 +128,14 @@ static const char *strerrorcode(uint64_t error_code) { return "CRYPTO_BUFFER_EXCEEDED"; case NGTCP2_KEY_UPDATE_ERROR: return "KEY_UPDATE_ERROR"; + case NGTCP2_AEAD_LIMIT_REACHED: + return "AEAD_LIMIT_REACHED"; + case NGTCP2_NO_VIABLE_PATH: + return "NO_VIABLE_PATH"; case NGTCP2_VERSION_NEGOTIATION_ERROR: return "VERSION_NEGOTIATION_ERROR"; default: - if (0x100u <= error_code && error_code <= 0x1ffu) { + if (0x100U <= error_code && error_code <= 0x1FFU) { return "CRYPTO_ERROR"; } return "(unknown)"; @@ -155,80 +147,41 @@ static const char *strapperrorcode(uint64_t app_error_code) { return "(unknown)"; } -static const char *strpkttype_long(uint8_t type) { - switch (type) { +static const char *strpkttype(const ngtcp2_pkt_hd *hd) { + switch (hd->type) { case NGTCP2_PKT_INITIAL: return "Initial"; - case NGTCP2_PKT_RETRY: - return "Retry"; - case NGTCP2_PKT_HANDSHAKE: - return "Handshake"; case NGTCP2_PKT_0RTT: return "0RTT"; - default: - return "(unknown)"; - } -} - -static const char *strpkttype(const ngtcp2_pkt_hd *hd) { - if (hd->flags & NGTCP2_PKT_FLAG_LONG_FORM) { - return strpkttype_long(hd->type); - } - - switch (hd->type) { + case NGTCP2_PKT_HANDSHAKE: + return "Handshake"; + case NGTCP2_PKT_RETRY: + return "Retry"; + case NGTCP2_PKT_1RTT: + return "1RTT"; case NGTCP2_PKT_VERSION_NEGOTIATION: return "VN"; case NGTCP2_PKT_STATELESS_RESET: return "SR"; - case NGTCP2_PKT_1RTT: - return "1RTT"; default: return "(unknown)"; } } static const char *strpkttype_type_flags(uint8_t type, uint8_t flags) { - ngtcp2_pkt_hd hd = {0}; - - hd.type = type; - hd.flags = flags; - - return strpkttype(&hd); -} - -static const char *strevent(ngtcp2_log_event ev) { - switch (ev) { - case NGTCP2_LOG_EVENT_CON: - return "con"; - case NGTCP2_LOG_EVENT_PKT: - return "pkt"; - case NGTCP2_LOG_EVENT_FRM: - return "frm"; - case NGTCP2_LOG_EVENT_LDC: - return "ldc"; - case NGTCP2_LOG_EVENT_CRY: - return "cry"; - case NGTCP2_LOG_EVENT_PTV: - return "ptv"; - case NGTCP2_LOG_EVENT_CCA: - return "cca"; - case NGTCP2_LOG_EVENT_NONE: - default: - return "non"; - } + return strpkttype(&(ngtcp2_pkt_hd){ + .type = type, + .flags = flags, + }); } -static uint64_t timestamp_cast(uint64_t ns) { return ns / NGTCP2_MILLISECONDS; } - static void log_fr_stream(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_stream *fr, const char *dir) { - log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " STREAM(0x%02" PRIx64 ") id=0x%" PRIx64 - " fin=%d offset=%" PRIu64 " len=%" PRIu64 " uni=%d"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type | fr->flags, fr->stream_id, fr->fin, - fr->offset, ngtcp2_vec_len(fr->data, fr->datacnt), - (fr->stream_id & 0x2) != 0); + ngtcp2_log_infof_raw( + log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), " STREAM(0x", + hex(fr->type | fr->flags), ") id=0x", hex(fr->stream_id), " fin=", fr->fin, + " offset=", fr->offset, " len=", ngtcp2_vec_len(fr->data, fr->datacnt), + " uni=", (fr->stream_id & 0x2) != 0); } static void log_fr_ack(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -236,250 +189,204 @@ static void log_fr_ack(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, int64_t largest_ack, min_ack; size_t i; - log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " ACK(0x%02" PRIx64 ") largest_ack=%" PRId64 - " ack_delay=%" PRIu64 "(%" PRIu64 ") ack_range_count=%zu"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->largest_ack, - fr->ack_delay_unscaled / NGTCP2_MILLISECONDS, fr->ack_delay, fr->rangecnt); + ngtcp2_log_infof_raw( + log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), " ACK(0x", + hex(fr->type), ") largest_ack=", fr->largest_ack, + " ack_delay=", fr->ack_delay_unscaled / NGTCP2_MILLISECONDS, "(", + fr->ack_delay, ") ack_range_count=", fr->rangecnt); largest_ack = fr->largest_ack; min_ack = fr->largest_ack - (int64_t)fr->first_ack_range; - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " ACK(0x%02" PRIx64 ") range=[%" PRId64 - "..%" PRId64 "] len=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, largest_ack, min_ack, - fr->first_ack_range); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " ACK(0x", hex(fr->type), ") range=[", largest_ack, "..", + min_ack, "] len=", fr->first_ack_range); for (i = 0; i < fr->rangecnt; ++i) { const ngtcp2_ack_range *range = &fr->ranges[i]; largest_ack = min_ack - (int64_t)range->gap - 2; min_ack = largest_ack - (int64_t)range->len; - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " ACK(0x%02" PRIx64 ") range=[%" PRId64 - "..%" PRId64 "] gap=%" PRIu64 - " len=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, largest_ack, - min_ack, range->gap, range->len); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " ACK(0x", hex(fr->type), ") range=[", largest_ack, + "..", min_ack, "] gap=", range->gap, + " len=", range->len); } if (fr->type == NGTCP2_FRAME_ACK_ECN) { - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " ACK(0x%02" PRIx64 ") ect0=%" PRIu64 - " ect1=%" PRIu64 " ce=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->ecn.ect0, - fr->ecn.ect1, fr->ecn.ce); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " ACK(0x", hex(fr->type), ") ect0=", fr->ecn.ect0, + " ect1=", fr->ecn.ect1, " ce=", fr->ecn.ce); } } static void log_fr_padding(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_padding *fr, const char *dir) { - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " PADDING(0x%02" PRIx64 ") len=%zu"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->len); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " PADDING(0x", hex(fr->type), ") len=", fr->len); } static void log_fr_reset_stream(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_reset_stream *fr, const char *dir) { - log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " RESET_STREAM(0x%02" PRIx64 ") id=0x%" PRIx64 - " app_error_code=%s(0x%" PRIx64 ") final_size=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->stream_id, - strapperrorcode(fr->app_error_code), fr->app_error_code, fr->final_size); + ngtcp2_log_infof_raw( + log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), " RESET_STREAM(0x", + hex(fr->type), ") id=0x", hex(fr->stream_id), + " app_error_code=", strapperrorcode(fr->app_error_code), "(0x", + hex(fr->app_error_code), ") final_size=", fr->final_size); } static void log_fr_connection_close(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_connection_close *fr, const char *dir) { - char reason[256]; - size_t reasonlen = ngtcp2_min_size(sizeof(reason) - 1, fr->reasonlen); + size_t reasonlen = ngtcp2_min(64, fr->reasonlen); - log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " CONNECTION_CLOSE(0x%02" PRIx64 - ") error_code=%s(0x%" PRIx64 ") " - "frame_type=%" PRIx64 " reason_len=%zu reason=[%s]"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, - fr->type == NGTCP2_FRAME_CONNECTION_CLOSE ? strerrorcode(fr->error_code) - : strapperrorcode(fr->error_code), - fr->error_code, fr->frame_type, fr->reasonlen, - ngtcp2_encode_printable_ascii(reason, fr->reason, reasonlen)); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " CONNECTION_CLOSE(0x", hex(fr->type), ") error_code=", + fr->type == NGTCP2_FRAME_CONNECTION_CLOSE + ? strerrorcode(fr->error_code) + : strapperrorcode(fr->error_code), + "(0x", hex(fr->error_code), ") frame_type=0x", + hex(fr->frame_type), " reason_len=", fr->reasonlen, + " reason=[", ascii(fr->reason, reasonlen), "]"); } static void log_fr_max_data(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_max_data *fr, const char *dir) { - log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " MAX_DATA(0x%02" PRIx64 ") max_data=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_data); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " MAX_DATA(0x", hex(fr->type), + ") max_data=", fr->max_data); } static void log_fr_max_stream_data(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_max_stream_data *fr, const char *dir) { - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " MAX_STREAM_DATA(0x%02" PRIx64 - ") id=0x%" PRIx64 - " max_stream_data=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->stream_id, - fr->max_stream_data); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " MAX_STREAM_DATA(0x", hex(fr->type), ") id=0x", + hex(fr->stream_id), + " max_stream_data=", fr->max_stream_data); } static void log_fr_max_streams(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_max_streams *fr, const char *dir) { - log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " MAX_STREAMS(0x%02" PRIx64 ") max_streams=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_streams); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " MAX_STREAMS(0x", hex(fr->type), + ") max_streams=", fr->max_streams); } static void log_fr_ping(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_ping *fr, const char *dir) { - log->log_printf(log->user_data, (NGTCP2_LOG_PKT " PING(0x%02" PRIx64 ")"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " PING(0x", hex(fr->type), ")"); } static void log_fr_data_blocked(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_data_blocked *fr, const char *dir) { - log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " DATA_BLOCKED(0x%02" PRIx64 ") offset=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->offset); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " DATA_BLOCKED(0x", hex(fr->type), + ") offset=", fr->offset); } static void log_fr_stream_data_blocked(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_stream_data_blocked *fr, const char *dir) { - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " STREAM_DATA_BLOCKED(0x%02" PRIx64 - ") id=0x%" PRIx64 " offset=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->stream_id, - fr->offset); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " STREAM_DATA_BLOCKED(0x", hex(fr->type), ") id=0x", + hex(fr->stream_id), " offset=", fr->offset); } static void log_fr_streams_blocked(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_streams_blocked *fr, const char *dir) { - log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " STREAMS_BLOCKED(0x%02" PRIx64 ") max_streams=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_streams); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " STREAMS_BLOCKED(0x", hex(fr->type), + ") max_streams=", fr->max_streams); } static void log_fr_new_connection_id(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_new_connection_id *fr, const char *dir) { - uint8_t buf[sizeof(fr->stateless_reset_token) * 2 + 1]; - uint8_t cid[sizeof(fr->cid.data) * 2 + 1]; - - log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " NEW_CONNECTION_ID(0x%02" PRIx64 ") seq=%" PRIu64 - " cid=0x%s retire_prior_to=%" PRIu64 - " stateless_reset_token=0x%s"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->seq, - (const char *)ngtcp2_encode_hex(cid, fr->cid.data, fr->cid.datalen), - fr->retire_prior_to, - (const char *)ngtcp2_encode_hex(buf, fr->stateless_reset_token, - sizeof(fr->stateless_reset_token))); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " NEW_CONNECTION_ID(0x", hex(fr->type), + ") seq=", fr->seq, " cid=0x", &fr->cid, + " retire_prior_to=", fr->retire_prior_to, + " stateless_reset_token=0x", &fr->token); } static void log_fr_stop_sending(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_stop_sending *fr, const char *dir) { - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " STOP_SENDING(0x%02" PRIx64 ") id=0x%" PRIx64 - " app_error_code=%s(0x%" PRIx64 ")"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->stream_id, - strapperrorcode(fr->app_error_code), fr->app_error_code); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " STOP_SENDING(0x", hex(fr->type), ") id=0x", + hex(fr->stream_id), + " app_error_code=", strapperrorcode(fr->app_error_code), + "(0x", hex(fr->app_error_code), ")"); } static void log_fr_path_challenge(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_path_challenge *fr, const char *dir) { - uint8_t buf[sizeof(fr->data) * 2 + 1]; - - log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " PATH_CHALLENGE(0x%02" PRIx64 ") data=0x%s"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, - (const char *)ngtcp2_encode_hex(buf, fr->data, sizeof(fr->data))); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " PATH_CHALLENGE(0x", hex(fr->type), ") data=0x", + &fr->data); } static void log_fr_path_response(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_path_response *fr, const char *dir) { - uint8_t buf[sizeof(fr->data) * 2 + 1]; - - log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " PATH_RESPONSE(0x%02" PRIx64 ") data=0x%s"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, - (const char *)ngtcp2_encode_hex(buf, fr->data, sizeof(fr->data))); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " PATH_RESPONSE(0x", hex(fr->type), ") data=0x", + &fr->data); } static void log_fr_crypto(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_stream *fr, const char *dir) { - log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " CRYPTO(0x%02" PRIx64 ") offset=%" PRIu64 " len=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->offset, - ngtcp2_vec_len(fr->data, fr->datacnt)); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " CRYPTO(0x", hex(fr->type), ") offset=", fr->offset, + " len=", ngtcp2_vec_len(fr->data, fr->datacnt)); } +#define NGTCP2_LOG_MAX_TOKENLEN 64 + static void log_fr_new_token(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_new_token *fr, const char *dir) { - /* Show at most first 64 bytes of token. If token is longer than 64 - bytes, log first 64 bytes and then append "*" */ - uint8_t buf[128 + 1 + 1]; - uint8_t *p; - - if (fr->tokenlen > 64) { - p = ngtcp2_encode_hex(buf, fr->token, 64); - p[128] = '*'; - p[129] = '\0'; - } else { - p = ngtcp2_encode_hex(buf, fr->token, fr->tokenlen); - } - log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " NEW_TOKEN(0x%02" PRIx64 ") token=0x%s len=%zu"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, (const char *)p, fr->tokenlen); + /* Show at most first NGTCP2_LOG_MAX_TOKENLEN bytes of token. If + token is longer than that, log first those bytes and then append + "*" */ + size_t tokenlen = ngtcp2_min(fr->tokenlen, NGTCP2_LOG_MAX_TOKENLEN); + + ngtcp2_log_infof_raw( + log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), " NEW_TOKEN(0x", + hex(fr->type), ") token=0x", bhex(fr->token, tokenlen), + fr->tokenlen > NGTCP2_LOG_MAX_TOKENLEN ? "*" : "", " len=", fr->tokenlen); } static void log_fr_retire_connection_id(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_retire_connection_id *fr, const char *dir) { - log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " RETIRE_CONNECTION_ID(0x%02" PRIx64 ") seq=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->seq); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " RETIRE_CONNECTION_ID(0x", hex(fr->type), + ") seq=", fr->seq); } static void log_fr_handshake_done(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_handshake_done *fr, const char *dir) { - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " HANDSHAKE_DONE(0x%02" PRIx64 ")"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " HANDSHAKE_DONE(0x", hex(fr->type), ")"); } static void log_fr_datagram(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_datagram *fr, const char *dir) { - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " DATAGRAM(0x%02" PRIx64 ") len=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, - ngtcp2_vec_len(fr->data, fr->datacnt)); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_FRM, NGTCP2_LOG_PKT(dir, hd), + " DATAGRAM(0x", hex(fr->type), + ") len=", ngtcp2_vec_len(fr->data, fr->datacnt)); } static void log_fr(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_frame *fr, const char *dir) { - switch (fr->type) { + switch (fr->hd.type) { case NGTCP2_FRAME_STREAM: log_fr_stream(log, hd, &fr->stream, dir); break; @@ -555,7 +462,8 @@ static void log_fr(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, void ngtcp2_log_rx_fr(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_frame *fr) { - if (!log->log_printf || !(log->events & NGTCP2_LOG_EVENT_FRM)) { + if ((!log->log_write && !log->log_printf) || + !(log->events & NGTCP2_LOG_EVENT_FRM)) { return; } @@ -564,7 +472,8 @@ void ngtcp2_log_rx_fr(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, void ngtcp2_log_tx_fr(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_frame *fr) { - if (!log->log_printf || !(log->events & NGTCP2_LOG_EVENT_FRM)) { + if ((!log->log_write && !log->log_printf) || + !(log->events & NGTCP2_LOG_EVENT_FRM)) { return; } @@ -575,174 +484,149 @@ void ngtcp2_log_rx_vn(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const uint32_t *sv, size_t nsv) { size_t i; - if (!log->log_printf || !(log->events & NGTCP2_LOG_EVENT_PKT)) { + if ((!log->log_write && !log->log_printf) || + !(log->events & NGTCP2_LOG_EVENT_PKT)) { return; } for (i = 0; i < nsv; ++i) { - log->log_printf(log->user_data, (NGTCP2_LOG_PKT " v=0x%08x"), - NGTCP2_LOG_PKT_HD_FIELDS("rx"), sv[i]); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_PKT, NGTCP2_LOG_PKT("rx", hd), + " v=0x", hexw(sv[i], 8)); } } -void ngtcp2_log_rx_sr(ngtcp2_log *log, const ngtcp2_pkt_stateless_reset *sr) { - uint8_t buf[sizeof(sr->stateless_reset_token) * 2 + 1]; - ngtcp2_pkt_hd shd; - ngtcp2_pkt_hd *hd = &shd; +void ngtcp2_log_rx_sr(ngtcp2_log *log, const ngtcp2_pkt_stateless_reset2 *sr) { + ngtcp2_pkt_hd hd; - if (!log->log_printf || !(log->events & NGTCP2_LOG_EVENT_PKT)) { + if ((!log->log_write && !log->log_printf) || + !(log->events & NGTCP2_LOG_EVENT_PKT)) { return; } - shd = (ngtcp2_pkt_hd){ + hd = (ngtcp2_pkt_hd){ .type = NGTCP2_PKT_STATELESS_RESET, }; - log->log_printf( - log->user_data, (NGTCP2_LOG_PKT " token=0x%s randlen=%zu"), - NGTCP2_LOG_PKT_HD_FIELDS("rx"), - (const char *)ngtcp2_encode_hex(buf, sr->stateless_reset_token, - sizeof(sr->stateless_reset_token)), - sr->randlen); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_PKT, NGTCP2_LOG_PKT("rx", &hd), + " token=0x", &sr->token, " randlen=", sr->randlen); } void ngtcp2_log_remote_tp(ngtcp2_log *log, const ngtcp2_transport_params *params) { - uint8_t token[NGTCP2_STATELESS_RESET_TOKENLEN * 2 + 1]; - uint8_t addr[16 * 2 + 7 + 1]; - uint8_t cid[NGTCP2_MAX_CIDLEN * 2 + 1]; size_t i; const ngtcp2_sockaddr_in *sa_in; const ngtcp2_sockaddr_in6 *sa_in6; const uint8_t *p; uint32_t version; - if (!log->log_printf || !(log->events & NGTCP2_LOG_EVENT_CRY)) { + if ((!log->log_write && !log->log_printf) || + !(log->events & NGTCP2_LOG_EVENT_CRY)) { return; } if (params->stateless_reset_token_present) { - log->log_printf( - log->user_data, (NGTCP2_LOG_TP " stateless_reset_token=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(token, params->stateless_reset_token, - sizeof(params->stateless_reset_token))); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " stateless_reset_token=0x", + lbhex(params->stateless_reset_token)); } if (params->preferred_addr_present) { if (params->preferred_addr.ipv4_present) { sa_in = ¶ms->preferred_addr.ipv4; - log->log_printf(log->user_data, - (NGTCP2_LOG_TP " preferred_address.ipv4_addr=%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_ipv4( - addr, (const uint8_t *)&sa_in->sin_addr)); - log->log_printf(log->user_data, - (NGTCP2_LOG_TP " preferred_address.ipv4_port=%u"), - NGTCP2_LOG_TP_HD_FIELDS, ngtcp2_ntohs(sa_in->sin_port)); + ngtcp2_log_infof_raw( + log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " preferred_address.ipv4_addr=", &sa_in->sin_addr); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " preferred_address.ipv4_port=", + ngtcp2_ntohs(sa_in->sin_port)); } if (params->preferred_addr.ipv6_present) { sa_in6 = ¶ms->preferred_addr.ipv6; - log->log_printf(log->user_data, - (NGTCP2_LOG_TP " preferred_address.ipv6_addr=%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_ipv6( - addr, (const uint8_t *)&sa_in6->sin6_addr)); - log->log_printf(log->user_data, - (NGTCP2_LOG_TP " preferred_address.ipv6_port=%u"), - NGTCP2_LOG_TP_HD_FIELDS, ngtcp2_ntohs(sa_in6->sin6_port)); + ngtcp2_log_infof_raw( + log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " preferred_address.ipv6_addr=", &sa_in6->sin6_addr); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " preferred_address.ipv6_port=", + ngtcp2_ntohs(sa_in6->sin6_port)); } - log->log_printf( - log->user_data, (NGTCP2_LOG_TP " preferred_address.cid=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(cid, params->preferred_addr.cid.data, - params->preferred_addr.cid.datalen)); - log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " preferred_address.stateless_reset_token=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex( - token, params->preferred_addr.stateless_reset_token, - sizeof(params->preferred_addr.stateless_reset_token))); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " preferred_address.cid=0x", + ¶ms->preferred_addr.cid); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP + " preferred_address.stateless_reset_token=0x", + lbhex(params->preferred_addr.stateless_reset_token)); } if (params->original_dcid_present) { - log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " original_destination_connection_id=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(cid, params->original_dcid.data, - params->original_dcid.datalen)); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " original_destination_connection_id=0x", + ¶ms->original_dcid); } if (params->retry_scid_present) { - log->log_printf( - log->user_data, (NGTCP2_LOG_TP " retry_source_connection_id=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(cid, params->retry_scid.data, - params->retry_scid.datalen)); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " retry_source_connection_id=0x", + ¶ms->retry_scid); } if (params->initial_scid_present) { - log->log_printf( - log->user_data, (NGTCP2_LOG_TP " initial_source_connection_id=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(cid, params->initial_scid.data, - params->initial_scid.datalen)); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " initial_source_connection_id=0x", + ¶ms->initial_scid); } - log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " initial_max_stream_data_bidi_local=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_stream_data_bidi_local); - log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " initial_max_stream_data_bidi_remote=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_stream_data_bidi_remote); - log->log_printf(log->user_data, - (NGTCP2_LOG_TP " initial_max_stream_data_uni=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_stream_data_uni); - log->log_printf(log->user_data, (NGTCP2_LOG_TP " initial_max_data=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_data); - log->log_printf(log->user_data, - (NGTCP2_LOG_TP " initial_max_streams_bidi=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_streams_bidi); - log->log_printf(log->user_data, - (NGTCP2_LOG_TP " initial_max_streams_uni=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_streams_uni); - log->log_printf(log->user_data, (NGTCP2_LOG_TP " max_idle_timeout=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, - params->max_idle_timeout / NGTCP2_MILLISECONDS); - log->log_printf(log->user_data, - (NGTCP2_LOG_TP " max_udp_payload_size=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, params->max_udp_payload_size); - log->log_printf(log->user_data, - (NGTCP2_LOG_TP " ack_delay_exponent=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, params->ack_delay_exponent); - log->log_printf(log->user_data, (NGTCP2_LOG_TP " max_ack_delay=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, - params->max_ack_delay / NGTCP2_MILLISECONDS); - log->log_printf(log->user_data, - (NGTCP2_LOG_TP " active_connection_id_limit=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, params->active_connection_id_limit); - log->log_printf(log->user_data, - (NGTCP2_LOG_TP " disable_active_migration=%d"), - NGTCP2_LOG_TP_HD_FIELDS, params->disable_active_migration); - log->log_printf(log->user_data, - (NGTCP2_LOG_TP " max_datagram_frame_size=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, params->max_datagram_frame_size); - log->log_printf(log->user_data, (NGTCP2_LOG_TP " grease_quic_bit=%d"), - NGTCP2_LOG_TP_HD_FIELDS, params->grease_quic_bit); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " initial_max_stream_data_bidi_local=", + params->initial_max_stream_data_bidi_local); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " initial_max_stream_data_bidi_remote=", + params->initial_max_stream_data_bidi_remote); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " initial_max_stream_data_uni=", + params->initial_max_stream_data_uni); + ngtcp2_log_infof_raw( + log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " initial_max_data=", params->initial_max_data); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " initial_max_streams_bidi=", + params->initial_max_streams_bidi); + ngtcp2_log_infof_raw( + log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " initial_max_streams_uni=", params->initial_max_streams_uni); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " max_idle_timeout=", + params->max_idle_timeout / NGTCP2_MILLISECONDS); + ngtcp2_log_infof_raw( + log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " max_udp_payload_size=", params->max_udp_payload_size); + ngtcp2_log_infof_raw( + log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " ack_delay_exponent=", params->ack_delay_exponent); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " max_ack_delay=", + params->max_ack_delay / NGTCP2_MILLISECONDS); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " active_connection_id_limit=", + params->active_connection_id_limit); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " disable_active_migration=", + params->disable_active_migration); + ngtcp2_log_infof_raw( + log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " max_datagram_frame_size=", params->max_datagram_frame_size); + ngtcp2_log_infof_raw( + log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " grease_quic_bit=", params->grease_quic_bit); if (params->version_info_present) { - log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " version_information.chosen_version=0x%08x"), - NGTCP2_LOG_TP_HD_FIELDS, params->version_info.chosen_version); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP " version_information.chosen_version=0x", + hexw(params->version_info.chosen_version, 8)); assert(!(params->version_info.available_versionslen & 0x3)); @@ -751,48 +635,42 @@ void ngtcp2_log_remote_tp(ngtcp2_log *log, i += sizeof(uint32_t)) { p = ngtcp2_get_uint32be(&version, p); - log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " version_information.available_versions[%zu]=0x%08x"), - NGTCP2_LOG_TP_HD_FIELDS, i >> 2, version); + ngtcp2_log_infof_raw(log, NGTCP2_LOG_EVENT_CRY, + NGTCP2_LOG_TP + " version_information.available_versions[", + i >> 2, "]=0x", hexw(version, 8)); } } } void ngtcp2_log_pkt_lost(ngtcp2_log *log, int64_t pkt_num, uint8_t type, uint8_t flags, ngtcp2_tstamp sent_ts) { - if (!log->log_printf || !(log->events & NGTCP2_LOG_EVENT_LDC)) { + if ((!log->log_write && !log->log_printf) || + !(log->events & NGTCP2_LOG_EVENT_LDC)) { return; } - ngtcp2_log_info(log, NGTCP2_LOG_EVENT_LDC, - "pkn=%" PRId64 " lost type=%s sent_ts=%" PRIu64, pkt_num, - strpkttype_type_flags(type, flags), sent_ts); + ngtcp2_log_infof(log, NGTCP2_LOG_EVENT_LDC, "pkn=", pkt_num, + " lost type=", strpkttype_type_flags(type, flags), + " sent_ts=", sent_ts); } static void log_pkt_hd(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const char *dir) { - uint8_t dcid[sizeof(hd->dcid.data) * 2 + 1]; - uint8_t scid[sizeof(hd->scid.data) * 2 + 1]; - - if (!log->log_printf || !(log->events & NGTCP2_LOG_EVENT_PKT)) { + if ((!log->log_write && !log->log_printf) || + !(log->events & NGTCP2_LOG_EVENT_PKT)) { return; } if (hd->type == NGTCP2_PKT_1RTT) { - ngtcp2_log_info( - log, NGTCP2_LOG_EVENT_PKT, "%s pkn=%" PRId64 " dcid=0x%s type=%s k=%d", - dir, hd->pkt_num, - (const char *)ngtcp2_encode_hex(dcid, hd->dcid.data, hd->dcid.datalen), - strpkttype(hd), (hd->flags & NGTCP2_PKT_FLAG_KEY_PHASE) != 0); + ngtcp2_log_infof(log, NGTCP2_LOG_EVENT_PKT, dir, " pkn=", hd->pkt_num, + " dcid=0x", &hd->dcid, " type=", strpkttype(hd), + " k=", (hd->flags & NGTCP2_PKT_FLAG_KEY_PHASE) != 0); } else { - ngtcp2_log_info( - log, NGTCP2_LOG_EVENT_PKT, - "%s pkn=%" PRId64 " dcid=0x%s scid=0x%s version=0x%08x type=%s len=%zu", - dir, hd->pkt_num, - (const char *)ngtcp2_encode_hex(dcid, hd->dcid.data, hd->dcid.datalen), - (const char *)ngtcp2_encode_hex(scid, hd->scid.data, hd->scid.datalen), - hd->version, strpkttype(hd), hd->len); + ngtcp2_log_infof(log, NGTCP2_LOG_EVENT_PKT, dir, " pkn=", hd->pkt_num, + " dcid=0x", &hd->dcid, " scid=0x", &hd->scid, + " version=0x", hexw(hd->version, 8), + " type=", strpkttype(hd), " len=", hd->len); } } @@ -804,31 +682,6 @@ void ngtcp2_log_tx_pkt_hd(ngtcp2_log *log, const ngtcp2_pkt_hd *hd) { log_pkt_hd(log, hd, "tx"); } -void ngtcp2_log_info(ngtcp2_log *log, ngtcp2_log_event ev, const char *fmt, - ...) { - va_list ap; - int n; - char buf[NGTCP2_LOG_BUFLEN]; - - if (!log->log_printf || !(log->events & ev)) { - return; - } - - va_start(ap, fmt); - n = vsnprintf(buf, sizeof(buf), fmt, ap); - va_end(ap); - - if (n < 0 || (size_t)n >= sizeof(buf)) { - return; - } - - log->log_printf(log->user_data, (NGTCP2_LOG_HD " %s"), - timestamp_cast(log->last_ts - log->ts), log->scid, - strevent(ev), buf); -} - -void ngtcp2_log_tx_cancel(ngtcp2_log *log, const ngtcp2_pkt_hd *hd) { - ngtcp2_log_info(log, NGTCP2_LOG_EVENT_PKT, - "cancel tx pkn=%" PRId64 " type=%s", hd->pkt_num, - strpkttype(hd)); +uint64_t ngtcp2_log_timestamp(const ngtcp2_log *log) { + return (log->last_ts - log->ts) / NGTCP2_MILLISECONDS; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.h index 13fb81a72e1d..c014cea1984a 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.h @@ -32,8 +32,12 @@ #include #include "ngtcp2_pkt.h" +#include "ngtcp2_fmt.h" + +#define NGTCP2_LOG_BUFLEN 1024 typedef struct ngtcp2_log { + ngtcp2_log_write log_write; /* log_printf is a sink to write log. NULL means no logging output. */ ngtcp2_printf log_printf; @@ -49,7 +53,8 @@ typedef struct ngtcp2_log { log_pritnf. */ void *user_data; /* scid is SCID encoded as NULL-terminated hex string. */ - uint8_t scid[NGTCP2_MAX_CIDLEN * 2 + 1]; + char scid[NGTCP2_MAX_CIDLEN * 2 + 1]; + char *buf; } ngtcp2_log; /** @@ -96,8 +101,8 @@ typedef enum ngtcp2_log_event { } ngtcp2_log_event; void ngtcp2_log_init(ngtcp2_log *log, const ngtcp2_cid *scid, - ngtcp2_printf log_printf, ngtcp2_tstamp ts, - void *user_data); + ngtcp2_log_write log_write, ngtcp2_printf log_printf, + char *buf, ngtcp2_tstamp ts, void *user_data); void ngtcp2_log_rx_fr(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_frame *fr); @@ -107,7 +112,7 @@ void ngtcp2_log_tx_fr(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, void ngtcp2_log_rx_vn(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const uint32_t *sv, size_t nsv); -void ngtcp2_log_rx_sr(ngtcp2_log *log, const ngtcp2_pkt_stateless_reset *sr); +void ngtcp2_log_rx_sr(ngtcp2_log *log, const ngtcp2_pkt_stateless_reset2 *sr); void ngtcp2_log_remote_tp(ngtcp2_log *log, const ngtcp2_transport_params *params); @@ -119,14 +124,57 @@ void ngtcp2_log_rx_pkt_hd(ngtcp2_log *log, const ngtcp2_pkt_hd *hd); void ngtcp2_log_tx_pkt_hd(ngtcp2_log *log, const ngtcp2_pkt_hd *hd); -void ngtcp2_log_tx_cancel(ngtcp2_log *log, const ngtcp2_pkt_hd *hd); - -/** - * @function - * - * `ngtcp2_log_info` writes info level log. - */ -void ngtcp2_log_info(ngtcp2_log *log, ngtcp2_log_event ev, const char *fmt, - ...); +uint64_t ngtcp2_log_timestamp(const ngtcp2_log *log); + +static inline const char *ngtcp2_log_event_str(ngtcp2_log_event ev) { + switch (ev) { + case NGTCP2_LOG_EVENT_CON: + return "con"; + case NGTCP2_LOG_EVENT_PKT: + return "pkt"; + case NGTCP2_LOG_EVENT_FRM: + return "frm"; + case NGTCP2_LOG_EVENT_LDC: + return "ldc"; + case NGTCP2_LOG_EVENT_CRY: + return "cry"; + case NGTCP2_LOG_EVENT_PTV: + return "ptv"; + case NGTCP2_LOG_EVENT_CCA: + return "cca"; + case NGTCP2_LOG_EVENT_NONE: + default: + return "non"; + } +} + +#define NGTCP2_LOG_HD(LOG, EV) \ + "I", uintw(ngtcp2_log_timestamp(LOG), 8), " 0x", (LOG)->scid, " ", \ + ngtcp2_log_event_str(EV), " " + +#define ngtcp2_log_infof_raw(LOG, EV, ...) \ + do { \ + size_t log_nwrite; \ + \ + ngtcp2_fmt_format((LOG)->buf, &log_nwrite, NGTCP2_LOG_HD((LOG), (EV)), \ + __VA_ARGS__); \ + if ((LOG)->log_write) { \ + (LOG)->log_write((LOG)->user_data, (LOG)->buf, log_nwrite); \ + } else { \ + (LOG)->log_printf((LOG)->user_data, "%s", (LOG)->buf); \ + } \ + } while (0) + +#define ngtcp2_log_infof(LOG, EV, ...) \ + do { \ + if ((!(LOG)->log_write && !(LOG)->log_printf) || \ + !((LOG)->events & (EV))) { \ + break; \ + } \ + \ + ngtcp2_log_infof_raw((LOG), (EV), __VA_ARGS__); \ + } while (0) + +#define ngtcp2_log_info(LOG, EV, ARG) ngtcp2_log_infof((LOG), (EV), (ARG)) #endif /* !defined(NGTCP2_LOG_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h index dfe5e0aed220..ea98c9e12761 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h @@ -52,30 +52,91 @@ */ #define ngtcp2_arraylen(A) (sizeof(A) / sizeof(A[0])) +/* + * ngtcp2_strlen_lit returns the length of string literal |S|. This + * macro assumes |S| is NULL-terminated string literal. It must not + * be used with pointers. + */ +#define ngtcp2_strlen_lit(S) (sizeof(S) - 1) + #define ngtcp2_max_def(SUFFIX, T) \ static inline T ngtcp2_max_##SUFFIX(T a, T b) { return a < b ? b : a; } -ngtcp2_max_def(int8, int8_t) -ngtcp2_max_def(int16, int16_t) -ngtcp2_max_def(int32, int32_t) -ngtcp2_max_def(int64, int64_t) -ngtcp2_max_def(uint8, uint8_t) -ngtcp2_max_def(uint16, uint16_t) -ngtcp2_max_def(uint32, uint32_t) -ngtcp2_max_def(uint64, uint64_t) -ngtcp2_max_def(size, size_t) +ngtcp2_max_def(long_long_int, long long int) +ngtcp2_max_def(long_int, long int) +ngtcp2_max_def(int, int) +ngtcp2_max_def(short_int, short int) +ngtcp2_max_def(signed_char, signed char) +ngtcp2_max_def(char, char) +ngtcp2_max_def(unsigned_long_long_int, unsigned long long int) +ngtcp2_max_def(unsigned_long_int, unsigned long int) +ngtcp2_max_def(unsigned_int, unsigned int) +ngtcp2_max_def(unsigned_short_int, unsigned short int) +ngtcp2_max_def(unsigned_char, unsigned char) + +#define ngtcp2_max(A, B) \ + _Generic((A), \ + long long int: ngtcp2_max_long_long_int, \ + long int: ngtcp2_max_long_int, \ + int: _Generic((B), \ + long long int: ngtcp2_max_long_long_int, \ + long int: ngtcp2_max_long_int, \ + int: ngtcp2_max_int, \ + short int: ngtcp2_max_short_int, \ + signed char: ngtcp2_max_signed_char, \ + char: ngtcp2_max_char, \ + unsigned long long int: ngtcp2_max_unsigned_long_long_int, \ + unsigned long int: ngtcp2_max_unsigned_long_int, \ + unsigned int: ngtcp2_max_unsigned_int, \ + unsigned short int: ngtcp2_max_unsigned_short_int, \ + unsigned char: ngtcp2_max_unsigned_char), \ + short int: ngtcp2_max_short_int, \ + signed char: ngtcp2_max_signed_char, \ + char: ngtcp2_max_char, \ + unsigned long long int: ngtcp2_max_unsigned_long_long_int, \ + unsigned long int: ngtcp2_max_unsigned_long_int, \ + unsigned int: ngtcp2_max_unsigned_int, \ + unsigned short int: ngtcp2_max_unsigned_short_int, \ + unsigned char: ngtcp2_max_unsigned_char)((A), (B)) #define ngtcp2_min_def(SUFFIX, T) \ static inline T ngtcp2_min_##SUFFIX(T a, T b) { return a < b ? a : b; } -ngtcp2_min_def(int8, int8_t) -ngtcp2_min_def(int16, int16_t) -ngtcp2_min_def(int32, int32_t) -ngtcp2_min_def(int64, int64_t) -ngtcp2_min_def(uint8, uint8_t) -ngtcp2_min_def(uint16, uint16_t) -ngtcp2_min_def(uint32, uint32_t) -ngtcp2_min_def(uint64, uint64_t) -ngtcp2_min_def(size, size_t) +ngtcp2_min_def(long_long_int, long long int) +ngtcp2_min_def(long_int, long int) +ngtcp2_min_def(int, int) +ngtcp2_min_def(short_int, short int) +ngtcp2_min_def(signed_char, signed char) +ngtcp2_min_def(char, char) +ngtcp2_min_def(unsigned_long_long_int, unsigned long long int) +ngtcp2_min_def(unsigned_long_int, unsigned long int) +ngtcp2_min_def(unsigned_int, unsigned int) +ngtcp2_min_def(unsigned_short_int, unsigned short int) +ngtcp2_min_def(unsigned_char, unsigned char) + +#define ngtcp2_min(A, B) \ + _Generic((A), \ + long long int: ngtcp2_min_long_long_int, \ + long int: ngtcp2_min_long_int, \ + int: _Generic((B), \ + long long int: ngtcp2_min_long_long_int, \ + long int: ngtcp2_min_long_int, \ + int: ngtcp2_min_int, \ + short int: ngtcp2_min_short_int, \ + signed char: ngtcp2_min_signed_char, \ + char: ngtcp2_min_char, \ + unsigned long long int: ngtcp2_min_unsigned_long_long_int, \ + unsigned long int: ngtcp2_min_unsigned_long_int, \ + unsigned int: ngtcp2_min_unsigned_int, \ + unsigned short int: ngtcp2_min_unsigned_short_int, \ + unsigned char: ngtcp2_min_unsigned_char), \ + short int: ngtcp2_min_short_int, \ + signed char: ngtcp2_min_signed_char, \ + char: ngtcp2_min_char, \ + unsigned long long int: ngtcp2_min_unsigned_long_long_int, \ + unsigned long int: ngtcp2_min_unsigned_long_int, \ + unsigned int: ngtcp2_min_unsigned_int, \ + unsigned short int: ngtcp2_min_unsigned_short_int, \ + unsigned char: ngtcp2_min_unsigned_char)((A), (B)) #endif /* !defined(NGTCP2_MACRO_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.c index 246c779f2908..3ad4b9f1ef05 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.c @@ -34,11 +34,10 @@ #define NGTCP2_INITIAL_HASHBITS 4 void ngtcp2_map_init(ngtcp2_map *map, uint64_t seed, const ngtcp2_mem *mem) { - map->mem = mem; - map->hashbits = 0; - map->table = NULL; - map->seed = seed; - map->size = 0; + *map = (ngtcp2_map){ + .mem = mem, + .seed = seed, + }; } void ngtcp2_map_free(ngtcp2_map *map) { @@ -46,30 +45,27 @@ void ngtcp2_map_free(ngtcp2_map *map) { return; } - ngtcp2_mem_free(map->mem, map->table); + ngtcp2_mem_free(map->mem, map->keys); } int ngtcp2_map_each(const ngtcp2_map *map, int (*func)(void *data, void *ptr), void *ptr) { int rv; size_t i; - ngtcp2_map_bucket *bkt; size_t tablelen; if (map->size == 0) { return 0; } - tablelen = 1u << map->hashbits; + tablelen = (size_t)1 << map->hashbits; for (i = 0; i < tablelen; ++i) { - bkt = &map->table[i]; - - if (bkt->data == NULL) { + if (map->psl[i] == 0) { continue; } - rv = func(bkt->data, ptr); + rv = func(map->data[i], ptr); if (rv != 0) { return rv; } @@ -78,176 +74,228 @@ int ngtcp2_map_each(const ngtcp2_map *map, int (*func)(void *data, void *ptr), return 0; } -static size_t map_hash(const ngtcp2_map *map, ngtcp2_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. */ - key += map->seed; - key *= 0xf1357aea2e62a9c5ull; - return (size_t)((key * 11400714819323198485llu) >> (64 - map->hashbits)); -} - -static void map_bucket_swap(ngtcp2_map_bucket *a, ngtcp2_map_bucket *b) { - ngtcp2_map_bucket c = *a; +/* Hasher from + https://github.com/rust-lang/rustc-hash/blob/dc5c33f1283de2da64d8d7a06401d91aded03ad4/src/lib.rs + to maximize the output's sensitivity to all input bits. */ +#define NGTCP2_MAP_HASHER 0xF1357AEA2E62A9C5ULL +/* 64-bit Fibonacci hashing constant, Golden Ratio constant, to get + the high bits with the good distribution. */ +#define NGTCP2_MAP_FIBO 0x9E3779B97F4A7C15ULL - *a = *b; - *b = c; +static size_t map_index(const ngtcp2_map *map, ngtcp2_map_key_type key) { + key += map->seed; + key *= NGTCP2_MAP_HASHER; + return (size_t)((key * NGTCP2_MAP_FIBO) >> (64 - map->hashbits)); } #ifndef WIN32 void ngtcp2_map_print_distance(const ngtcp2_map *map) { size_t i; size_t idx; - ngtcp2_map_bucket *bkt; size_t tablelen; if (map->size == 0) { return; } - tablelen = 1u << map->hashbits; + tablelen = (size_t)1 << map->hashbits; for (i = 0; i < tablelen; ++i) { - bkt = &map->table[i]; - - if (bkt->data == NULL) { + if (map->psl[i] == 0) { fprintf(stderr, "@%zu \n", i); continue; } - idx = map_hash(map, bkt->key); - fprintf(stderr, "@%zu hash=%zu key=%" PRIu64 " base=%zu distance=%u\n", i, - map_hash(map, bkt->key), bkt->key, idx, bkt->psl); + idx = map_index(map, map->keys[i]); + fprintf(stderr, "@%zu key=%" PRIu64 " base=%zu distance=%u\n", i, + map->keys[i], idx, map->psl[i] - 1); } } #endif /* !defined(WIN32) */ -static int map_insert(ngtcp2_map *map, ngtcp2_map_key_type key, void *data) { - size_t idx = map_hash(map, key); - ngtcp2_map_bucket b = { - .key = key, - .data = data, - }; - ngtcp2_map_bucket *bkt; - size_t mask = (1u << map->hashbits) - 1; +static void map_set_entry(ngtcp2_map *map, size_t idx, ngtcp2_map_key_type key, + void *data, size_t psl) { + map->keys[idx] = key; + map->data[idx] = data; + map->psl[idx] = (uint8_t)psl; +} + +#define NGTCP2_SWAP(TYPE, A, B) \ + do { \ + TYPE t = (TYPE) * (A); \ + \ + *(A) = *(B); \ + *(B) = t; \ + } while (0) + +/* + * map_insert inserts |key| and |data| to |map|, and returns the index + * where the pair is stored if it succeeds. Otherwise, it returns one + * of the following negative error codes: + * + * NGTCP2_ERR_INVALID_ARGUMENT + * The another data associated to |key| is already present. + */ +static ngtcp2_ssize map_insert(ngtcp2_map *map, ngtcp2_map_key_type key, + void *data) { + size_t idx = map_index(map, key); + size_t mask = ((size_t)1 << map->hashbits) - 1; + size_t psl = 1; + size_t kpsl; for (;;) { - bkt = &map->table[idx]; + kpsl = map->psl[idx]; - if (bkt->data == NULL) { - *bkt = b; + if (kpsl == 0) { + map_set_entry(map, idx, key, data, psl); ++map->size; - return 0; + + return (ngtcp2_ssize)idx; } - if (b.psl > bkt->psl) { - map_bucket_swap(bkt, &b); - } else if (bkt->key == key) { - /* TODO This check is just a waste after first swap or if this - function is called from map_resize. That said, there is no - difference with or without this conditional in performance - wise. */ + if (psl > kpsl) { + NGTCP2_SWAP(ngtcp2_map_key_type, &key, &map->keys[idx]); + NGTCP2_SWAP(void *, &data, &map->data[idx]); + NGTCP2_SWAP(uint8_t, &psl, &map->psl[idx]); + } else if (map->keys[idx] == key) { + /* This check ensures that no duplicate keys are inserted. But + it is just a waste after first swap or if this function is + called from map_resize. That said, there is no difference + with or without this conditional in performance wise. */ return NGTCP2_ERR_INVALID_ARGUMENT; } - ++b.psl; + ++psl; idx = (idx + 1) & mask; } } +/* NGTCP2_MAP_MAX_HASHBITS is the maximum number of bits used for hash + table. The theoretical limit of the maximum number of keys that + can be stored is 1 << NGTCP2_MAP_MAX_HASHBITS. */ +#define NGTCP2_MAP_MAX_HASHBITS (sizeof(size_t) * 8 - 1) + static int map_resize(ngtcp2_map *map, size_t new_hashbits) { size_t i; - ngtcp2_map_bucket *bkt; size_t tablelen; - int rv; + ngtcp2_ssize idx; ngtcp2_map new_map = { - .table = ngtcp2_mem_calloc(map->mem, 1u << new_hashbits, - sizeof(ngtcp2_map_bucket)), .mem = map->mem, .seed = map->seed, .hashbits = new_hashbits, }; - (void)rv; + void *buf; + (void)idx; - if (new_map.table == NULL) { + if (new_hashbits > NGTCP2_MAP_MAX_HASHBITS) { return NGTCP2_ERR_NOMEM; } + tablelen = (size_t)1 << new_hashbits; + + buf = ngtcp2_mem_calloc(map->mem, tablelen, + sizeof(ngtcp2_map_key_type) + sizeof(void *) + + sizeof(uint8_t)); + if (buf == NULL) { + return NGTCP2_ERR_NOMEM; + } + + new_map.keys = buf; + new_map.data = + (void *)((uint8_t *)new_map.keys + tablelen * sizeof(ngtcp2_map_key_type)); + new_map.psl = (uint8_t *)new_map.data + tablelen * sizeof(void *); + if (map->size) { - tablelen = 1u << map->hashbits; + tablelen = (size_t)1 << map->hashbits; for (i = 0; i < tablelen; ++i) { - bkt = &map->table[i]; - if (bkt->data == NULL) { + if (map->psl[i] == 0) { continue; } - rv = map_insert(&new_map, bkt->key, bkt->data); + idx = map_insert(&new_map, map->keys[i], map->data[i]); - assert(0 == rv); + /* map_insert must not fail because all keys are unique during + resize. */ + assert(idx >= 0); } } - ngtcp2_mem_free(map->mem, map->table); - map->table = new_map.table; + ngtcp2_mem_free(map->mem, map->keys); + map->keys = new_map.keys; + map->data = new_map.data; + map->psl = new_map.psl; map->hashbits = new_hashbits; return 0; } +/* NGTCP2_MAX_PSL_RESIZE_THRESH is the maximum psl threshold. If + reached, resize the table. */ +#define NGTCP2_MAX_PSL_RESIZE_THRESH 128 + int ngtcp2_map_insert(ngtcp2_map *map, ngtcp2_map_key_type key, void *data) { int rv; + size_t tablelen; + ngtcp2_ssize idx; assert(data); - /* Load factor is 7/8 */ - /* Under the very initial condition, that is map->size == 0 and - 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, NGTCP2_INITIAL_HASHBITS); - if (rv != 0) { - return rv; - } + /* tablelen is incorrect if map->hashbits == 0 which leads to + tablelen = 1, but it is only used to check the load factor, and + it works in this special case. */ + tablelen = (size_t)1 << map->hashbits; + + /* Load factor is 7 / 8. Because tablelen is power of 2, (tablelen + - (tablelen >> 3)) computes tablelen * 7 / 8. */ + if (map->size + 1 >= (tablelen - (tablelen >> 3))) { + rv = map_resize(map, map->hashbits ? map->hashbits + 1 + : NGTCP2_INITIAL_HASHBITS); + if (rv != 0) { + return rv; } + + idx = map_insert(map, key, data); + if (idx < 0) { + return (int)idx; + } + + return 0; } - rv = map_insert(map, key, data); - if (rv != 0) { - return rv; + idx = map_insert(map, key, data); + if (idx < 0) { + return (int)idx; } - return 0; + /* Resize if psl reaches really large value which is almost + improbable, but just in case. */ + if (map->psl[idx] - 1 < NGTCP2_MAX_PSL_RESIZE_THRESH) { + return 0; + } + + return map_resize(map, map->hashbits + 1); } void *ngtcp2_map_find(const ngtcp2_map *map, ngtcp2_map_key_type key) { size_t idx; - ngtcp2_map_bucket *bkt; - size_t psl = 0; + size_t psl = 1; size_t mask; if (map->size == 0) { return NULL; } - idx = map_hash(map, key); - mask = (1u << map->hashbits) - 1; + idx = map_index(map, key); + mask = ((size_t)1 << map->hashbits) - 1; for (;;) { - bkt = &map->table[idx]; - - if (bkt->data == NULL || psl > bkt->psl) { + if (psl > map->psl[idx]) { return NULL; } - if (bkt->key == key) { - return bkt->data; + if (map->keys[idx] == key) { + return map->data[idx]; } ++psl; @@ -257,38 +305,36 @@ void *ngtcp2_map_find(const ngtcp2_map *map, ngtcp2_map_key_type key) { int ngtcp2_map_remove(ngtcp2_map *map, ngtcp2_map_key_type key) { size_t idx; - ngtcp2_map_bucket *b, *bkt; - size_t psl = 0; + size_t dest; + size_t psl = 1, kpsl; size_t mask; if (map->size == 0) { return NGTCP2_ERR_INVALID_ARGUMENT; } - idx = map_hash(map, key); - mask = (1u << map->hashbits) - 1; + idx = map_index(map, key); + mask = ((size_t)1 << map->hashbits) - 1; for (;;) { - bkt = &map->table[idx]; - - if (bkt->data == NULL || psl > bkt->psl) { + if (psl > map->psl[idx]) { return NGTCP2_ERR_INVALID_ARGUMENT; } - if (bkt->key == key) { - b = bkt; + if (map->keys[idx] == key) { + dest = idx; idx = (idx + 1) & mask; for (;;) { - bkt = &map->table[idx]; - if (bkt->data == NULL || bkt->psl == 0) { - b->data = NULL; + kpsl = map->psl[idx]; + if (kpsl <= 1) { + map->psl[dest] = 0; break; } - --bkt->psl; - *b = *bkt; - b = bkt; + map_set_entry(map, dest, map->keys[idx], map->data[idx], kpsl - 1); + + dest = idx; idx = (idx + 1) & mask; } @@ -308,7 +354,7 @@ void ngtcp2_map_clear(ngtcp2_map *map) { return; } - memset(map->table, 0, sizeof(*map->table) * (1u << map->hashbits)); + memset(map->psl, 0, sizeof(*map->psl) * ((size_t)1 << map->hashbits)); map->size = 0; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.h index 0c1a76552aa4..1afe3167e65b 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.h @@ -38,14 +38,13 @@ typedef uint64_t ngtcp2_map_key_type; -typedef struct ngtcp2_map_bucket { - uint32_t psl; - ngtcp2_map_key_type key; - void *data; -} ngtcp2_map_bucket; - typedef struct ngtcp2_map { - ngtcp2_map_bucket *table; + ngtcp2_map_key_type *keys; + void **data; + /* psl is the Probe Sequence Length. 0 has special meaning that the + element is not stored at i-th position if psl[i] == 0. Because + of this, the actual psl value is psl[i] - 1 if psl[i] > 0. */ + uint8_t *psl; const ngtcp2_mem *mem; uint64_t seed; size_t size; diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_net.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_net.h index 103a2fb2d807..5fdeb9853205 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_net.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_net.h @@ -67,11 +67,11 @@ # define ngtcp2_htonl64(N) (N) # else /* !defined(WORDS_BIGENDIAN) */ # if HAVE_DECL_BSWAP_64 -# define ngtcp2_bswap64 bswap_64 +# define ngtcp2_bswap64(N) bswap_64(N) # elif defined(WIN32) -# define ngtcp2_bswap64 _byteswap_uint64 +# define ngtcp2_bswap64(N) _byteswap_uint64(N) # elif defined(__APPLE__) -# define ngtcp2_bswap64 OSSwapInt64 +# define ngtcp2_bswap64(N) OSSwapInt64(N) # else /* !(HAVE_DECL_BSWAP_64 || defined(WIN32) || defined(__APPLE__)) */ # define ngtcp2_bswap64(N) \ ((uint64_t)(ngtcp2_ntohl((uint32_t)(N))) << 32 | \ @@ -83,59 +83,19 @@ #endif /* !HAVE_DECL_BE64TOH */ #ifdef WIN32 -/* Windows requires ws2_32 library for ntonl family functions. We - define inline functions for those function so that we don't have - dependency on that lib. */ - -# ifdef _MSC_VER -# define STIN static __inline -# else /* !defined(_MSC_VER) */ -# define STIN static inline -# endif /* !defined(_MSC_VER) */ - -STIN uint32_t ngtcp2_htonl(uint32_t hostlong) { - uint32_t res; - unsigned char *p = (unsigned char *)&res; - *p++ = (unsigned char)(hostlong >> 24); - *p++ = (hostlong >> 16) & 0xffu; - *p++ = (hostlong >> 8) & 0xffu; - *p = hostlong & 0xffu; - return res; -} - -STIN uint16_t ngtcp2_htons(uint16_t hostshort) { - uint16_t res; - unsigned char *p = (unsigned char *)&res; - *p++ = (unsigned char)(hostshort >> 8); - *p = hostshort & 0xffu; - return res; -} - -STIN uint32_t ngtcp2_ntohl(uint32_t netlong) { - uint32_t res; - unsigned char *p = (unsigned char *)&netlong; - res = (uint32_t)(*p++ << 24); - res += (uint32_t)(*p++ << 16); - res += (uint32_t)(*p++ << 8); - res += *p; - return res; -} - -STIN uint16_t ngtcp2_ntohs(uint16_t netshort) { - uint16_t res; - unsigned char *p = (unsigned char *)&netshort; - res = (uint16_t)(*p++ << 8); - res += *p; - return res; -} - +/* Windows requires ws2_32 library for ntonl family of functions. + Instead of using them, use _byteswap_* functions. This is fine + because all platforms that can run Windows these days are little + endian. */ +# define ngtcp2_htonl(N) _byteswap_ulong(N) +# define ngtcp2_htons(N) _byteswap_ushort(N) +# define ngtcp2_ntohl(N) _byteswap_ulong(N) +# define ngtcp2_ntohs(N) _byteswap_ushort(N) #else /* !defined(WIN32) */ - -# define ngtcp2_htonl htonl -# define ngtcp2_htons htons -# define ngtcp2_ntohl ntohl -# define ngtcp2_ntohs ntohs - +# define ngtcp2_htonl(N) htonl(N) +# define ngtcp2_htons(N) htons(N) +# define ngtcp2_ntohl(N) ntohl(N) +# define ngtcp2_ntohs(N) ntohs(N) #endif /* !defined(WIN32) */ #endif /* !defined(NGTCP2_NET_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_objalloc.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_objalloc.h index cf23de7b2b7f..38eabb323ba7 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_objalloc.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_objalloc.h @@ -69,7 +69,7 @@ void ngtcp2_objalloc_clear(ngtcp2_objalloc *objalloc); inline static void ngtcp2_objalloc_##NAME##_init( \ ngtcp2_objalloc *objalloc, size_t nmemb, const ngtcp2_mem *mem) { \ ngtcp2_objalloc_init( \ - objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ + objalloc, ((sizeof(TYPE) + 0xFU) & ~(size_t)0xFU) * nmemb, mem); \ } \ \ TYPE *ngtcp2_objalloc_##NAME##_get(ngtcp2_objalloc *objalloc); \ @@ -123,7 +123,7 @@ void ngtcp2_objalloc_clear(ngtcp2_objalloc *objalloc); inline static void ngtcp2_objalloc_##NAME##_init( \ ngtcp2_objalloc *objalloc, size_t nmemb, const ngtcp2_mem *mem) { \ ngtcp2_objalloc_init( \ - objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ + objalloc, ((sizeof(TYPE) + 0xFU) & ~(size_t)0xFU) * nmemb, mem); \ } \ \ inline static TYPE *ngtcp2_objalloc_##NAME##_get( \ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.c index 832387300335..c9636a8db9a9 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.c @@ -28,12 +28,6 @@ #include "ngtcp2_addr.h" -void ngtcp2_path_init(ngtcp2_path *path, const ngtcp2_addr *local, - const ngtcp2_addr *remote) { - path->local = *local; - path->remote = *remote; -} - void ngtcp2_path_copy(ngtcp2_path *dest, const ngtcp2_path *src) { ngtcp2_addr_copy(&dest->local, &src->local); ngtcp2_addr_copy(&dest->remote, &src->remote); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.h index a708378db32f..9d4205cee227 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.h @@ -31,14 +31,6 @@ #include -/* - * ngtcp2_path_init initializes |path| with the given addresses. Note - * that the buffer pointed by local->addr and remote->addr are not - * copied. Their pointer values are assigned instead. - */ -void ngtcp2_path_init(ngtcp2_path *path, const ngtcp2_addr *local, - const ngtcp2_addr *remote); - /* * ngtcp2_path_storage_init2 initializes |ps| using |path| as initial * data. diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pcg.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pcg.c index 9d0eb57e0db9..ddaf94a779ab 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pcg.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pcg.c @@ -66,12 +66,12 @@ void ngtcp2_pcg32_init(ngtcp2_pcg32 *pcg, uint64_t seed) { } static uint32_t pcg_rotr_32(uint32_t value, unsigned int rot) { - return (value >> rot) | (value << ((-rot) & 31)); + return (value >> rot) | (value << ((32 - rot) & 31)); } static uint32_t pcg_output_xsh_rr_64_32(uint64_t state) { - return pcg_rotr_32((uint32_t)(((state >> 18u) ^ state) >> 27u), - (unsigned int)(state >> 59u)); + return pcg_rotr_32((uint32_t)(((state >> 18U) ^ state) >> 27U), + (unsigned int)(state >> 59U)); } uint32_t ngtcp2_pcg32_rand(ngtcp2_pcg32 *pcg) { diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c index d63dc932e1bf..d146145843b7 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c @@ -408,8 +408,9 @@ ngtcp2_ssize ngtcp2_pkt_encode_hd_long(uint8_t *out, size_t outlen, p = out; *p = (uint8_t)(NGTCP2_HEADER_FORM_BIT | - (ngtcp2_pkt_versioned_type(hd->version, hd->type) << 4) | - (uint8_t)(hd->pkt_numlen - 1)); + (uint32_t)(ngtcp2_pkt_versioned_type(hd->version, hd->type) + << 4) | + (uint32_t)(hd->pkt_numlen - 1)); if (!(hd->flags & NGTCP2_PKT_FLAG_FIXED_BIT_CLEAR)) { *p |= NGTCP2_FIXED_BIT_MASK; @@ -482,8 +483,10 @@ ngtcp2_ssize ngtcp2_pkt_encode_hd_short(uint8_t *out, size_t outlen, return (ngtcp2_ssize)len; } -ngtcp2_ssize ngtcp2_pkt_decode_frame(ngtcp2_frame *dest, const uint8_t *payload, - size_t payloadlen) { +ngtcp2_ssize ngtcp2_frame_decoder_decode(ngtcp2_frame_decoder *frd, + ngtcp2_frame *dest, + const uint8_t *payload, + size_t payloadlen) { uint8_t type; if (payloadlen == 0) { @@ -532,6 +535,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_frame(ngtcp2_frame *dest, const uint8_t *payload, payloadlen); case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: + dest->ack.ranges = frd->buf.ack_ranges; return ngtcp2_pkt_decode_ack_frame(&dest->ack, payload, payloadlen); case NGTCP2_FRAME_PATH_CHALLENGE: return ngtcp2_pkt_decode_path_challenge_frame(&dest->path_challenge, @@ -540,6 +544,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_frame(ngtcp2_frame *dest, const uint8_t *payload, return ngtcp2_pkt_decode_path_response_frame(&dest->path_response, payload, payloadlen); case NGTCP2_FRAME_CRYPTO: + dest->stream.data = &frd->buf.data; return ngtcp2_pkt_decode_crypto_frame(&dest->stream, payload, payloadlen); case NGTCP2_FRAME_NEW_TOKEN: return ngtcp2_pkt_decode_new_token_frame(&dest->new_token, payload, @@ -552,14 +557,16 @@ ngtcp2_ssize ngtcp2_pkt_decode_frame(ngtcp2_frame *dest, const uint8_t *payload, payload, payloadlen); case NGTCP2_FRAME_DATAGRAM: case NGTCP2_FRAME_DATAGRAM_LEN: + dest->datagram.data = &frd->buf.data; return ngtcp2_pkt_decode_datagram_frame(&dest->datagram, payload, payloadlen); default: if ((type & ~(NGTCP2_FRAME_STREAM - 1)) == NGTCP2_FRAME_STREAM) { + dest->stream.data = &frd->buf.data; return ngtcp2_pkt_decode_stream_frame(&dest->stream, payload, payloadlen); } - /* For frame types > 0xff, use ngtcp2_get_uvarintlen and + /* For frame types > 0xFF, use ngtcp2_get_uvarintlen and ngtcp2_get_uvarint to get a frame type, and then switch over it. Verify that payloadlen >= ngtcp2_get_uvarintlen(payload) before calling ngtcp2_get_uvarint(payload). */ @@ -769,7 +776,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_ack_frame(ngtcp2_ack *dest, } /* TODO We might not decode all ranges. It could be very large. */ - max_rangecnt = ngtcp2_min_size(NGTCP2_MAX_ACK_RANGES, rangecnt); + max_rangecnt = ngtcp2_min(NGTCP2_MAX_ACK_RANGES, rangecnt); p = payload + 1; @@ -918,7 +925,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( return NGTCP2_ERR_FRAME_ENCODING; } - p = ngtcp2_get_uvarint(&vi, p); + ngtcp2_get_uvarint(&vi, p); if (payloadlen - len < vi) { return NGTCP2_ERR_FRAME_ENCODING; } @@ -1053,6 +1060,8 @@ ngtcp2_ssize ngtcp2_pkt_decode_ping_frame(ngtcp2_ping *dest, (void)payload; (void)payloadlen; + assert(payloadlen > 0); + dest->type = NGTCP2_FRAME_PING; return 1; } @@ -1200,8 +1209,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_new_connection_id_frame( ++p; ngtcp2_cid_init(&dest->cid, p, cil); p += cil; - p = ngtcp2_get_bytes(dest->stateless_reset_token, p, - NGTCP2_STATELESS_RESET_TOKENLEN); + p = ngtcp2_get_bytes(dest->token.data, p, sizeof(dest->token.data)); assert((size_t)(p - payload) == len); @@ -1260,7 +1268,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_path_challenge_frame(ngtcp2_path_challenge *dest, p = payload + 1; dest->type = NGTCP2_FRAME_PATH_CHALLENGE; - ngtcp2_cpymem(dest->data, p, sizeof(dest->data)); + ngtcp2_cpymem(dest->data.data, p, sizeof(dest->data.data)); p += sizeof(dest->data); assert((size_t)(p - payload) == len); @@ -1281,7 +1289,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_path_response_frame(ngtcp2_path_response *dest, p = payload + 1; dest->type = NGTCP2_FRAME_PATH_RESPONSE; - ngtcp2_cpymem(dest->data, p, sizeof(dest->data)); + ngtcp2_cpymem(dest->data.data, p, sizeof(dest->data.data)); p += sizeof(dest->data); assert((size_t)(p - payload) == len); @@ -1321,7 +1329,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_crypto_frame(ngtcp2_stream *dest, return NGTCP2_ERR_FRAME_ENCODING; } - p = ngtcp2_get_uvarint(&vi, p); + ngtcp2_get_uvarint(&vi, p); if (payloadlen - len < vi) { return NGTCP2_ERR_FRAME_ENCODING; } @@ -1428,6 +1436,8 @@ ngtcp2_ssize ngtcp2_pkt_decode_handshake_done_frame(ngtcp2_handshake_done *dest, (void)payload; (void)payloadlen; + assert(payloadlen > 0); + dest->type = NGTCP2_FRAME_HANDSHAKE_DONE; return 1; } @@ -1442,9 +1452,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_datagram_frame(ngtcp2_datagram *dest, size_t n; uint64_t vi; - if (payloadlen < len) { - return NGTCP2_ERR_FRAME_ENCODING; - } + assert(payloadlen > 0); type = payload[0]; @@ -1483,16 +1491,13 @@ ngtcp2_ssize ngtcp2_pkt_decode_datagram_frame(ngtcp2_datagram *dest, dest->type = type; - if (datalen == 0) { - dest->datacnt = 0; - dest->data = NULL; - } else { + if (datalen) { + dest->data[0].len = datalen; + dest->data[0].base = (uint8_t *)p; dest->datacnt = 1; - dest->data = dest->rdata; - dest->rdata[0].len = datalen; - - dest->rdata[0].base = (uint8_t *)p; p += datalen; + } else { + dest->datacnt = 0; } assert((size_t)(p - payload) == len); @@ -1502,7 +1507,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_datagram_frame(ngtcp2_datagram *dest, ngtcp2_ssize ngtcp2_pkt_encode_frame(uint8_t *out, size_t outlen, ngtcp2_frame *fr) { - switch (fr->type) { + switch (fr->hd.type) { case NGTCP2_FRAME_STREAM: return ngtcp2_pkt_encode_stream_frame(out, outlen, &fr->stream); case NGTCP2_FRAME_ACK: @@ -1878,7 +1883,7 @@ ngtcp2_pkt_encode_new_connection_id_frame(uint8_t *out, size_t outlen, const ngtcp2_new_connection_id *fr) { size_t len = 1 + ngtcp2_put_uvarintlen(fr->seq) + ngtcp2_put_uvarintlen(fr->retire_prior_to) + 1 + - fr->cid.datalen + NGTCP2_STATELESS_RESET_TOKENLEN; + fr->cid.datalen + sizeof(fr->token.data); uint8_t *p; if (outlen < len) { @@ -1892,8 +1897,7 @@ ngtcp2_pkt_encode_new_connection_id_frame(uint8_t *out, size_t outlen, p = ngtcp2_put_uvarint(p, fr->retire_prior_to); *p++ = (uint8_t)fr->cid.datalen; p = ngtcp2_cpymem(p, fr->cid.data, fr->cid.datalen); - p = ngtcp2_cpymem(p, fr->stateless_reset_token, - NGTCP2_STATELESS_RESET_TOKENLEN); + p = ngtcp2_cpymem(p, fr->token.data, sizeof(fr->token.data)); assert((size_t)(p - out) == len); @@ -1935,7 +1939,7 @@ ngtcp2_pkt_encode_path_challenge_frame(uint8_t *out, size_t outlen, p = out; *p++ = NGTCP2_FRAME_PATH_CHALLENGE; - p = ngtcp2_cpymem(p, fr->data, sizeof(fr->data)); + p = ngtcp2_cpymem(p, fr->data.data, sizeof(fr->data.data)); assert((size_t)(p - out) == len); @@ -1955,7 +1959,7 @@ ngtcp2_pkt_encode_path_response_frame(uint8_t *out, size_t outlen, p = out; *p++ = NGTCP2_FRAME_PATH_RESPONSE; - p = ngtcp2_cpymem(p, fr->data, sizeof(fr->data)); + p = ngtcp2_cpymem(p, fr->data.data, sizeof(fr->data.data)); assert((size_t)(p - out) == len); @@ -2111,7 +2115,7 @@ ngtcp2_ssize ngtcp2_pkt_write_version_negotiation( p = dest; - *p++ = 0xc0 | unused_random; + *p++ = 0xC0U | unused_random; p = ngtcp2_put_uint32be(p, 0); *p++ = (uint8_t)dcidlen; @@ -2148,20 +2152,20 @@ size_t ngtcp2_pkt_decode_version_negotiation(uint32_t *dest, return payloadlen / sizeof(uint32_t); } -int ngtcp2_pkt_decode_stateless_reset(ngtcp2_pkt_stateless_reset *sr, +int ngtcp2_pkt_decode_stateless_reset(ngtcp2_pkt_stateless_reset2 *sr, const uint8_t *payload, size_t payloadlen) { const uint8_t *p = payload; if (payloadlen < - NGTCP2_MIN_STATELESS_RESET_RANDLEN + NGTCP2_STATELESS_RESET_TOKENLEN) { + NGTCP2_MIN_STATELESS_RESET_RANDLEN + sizeof(sr->token.data)) { return NGTCP2_ERR_INVALID_ARGUMENT; } sr->rand = p; - sr->randlen = payloadlen - NGTCP2_STATELESS_RESET_TOKENLEN; + sr->randlen = payloadlen - sizeof(sr->token.data); p += sr->randlen; - memcpy(sr->stateless_reset_token, p, NGTCP2_STATELESS_RESET_TOKENLEN); + memcpy(sr->token.data, p, sizeof(sr->token.data)); return 0; } @@ -2183,22 +2187,22 @@ int ngtcp2_pkt_decode_retry(ngtcp2_pkt_retry *dest, const uint8_t *payload, int64_t ngtcp2_pkt_adjust_pkt_num(int64_t max_pkt_num, int64_t pkt_num, size_t pkt_numlen) { - int64_t expected = max_pkt_num + 1; - int64_t win = (int64_t)1 << (pkt_numlen * 8); - int64_t hwin = win / 2; - int64_t mask = win - 1; - int64_t cand = (expected & ~mask) | pkt_num; + uint64_t expected = (uint64_t)max_pkt_num + 1; + uint64_t win = 1ULL << (pkt_numlen * 8); + uint64_t hwin = win / 2; + uint64_t mask = win - 1; + uint64_t cand = (expected & ~mask) | (uint64_t)pkt_num; - if (cand <= expected - hwin) { - assert(cand <= (int64_t)NGTCP2_MAX_VARINT - win); - return cand + win; + if (cand + hwin <= expected) { + assert(cand <= NGTCP2_MAX_VARINT - win); + return (int64_t)(cand + win); } if (cand > expected + hwin && cand >= win) { - return cand - win; + return (int64_t)(cand - win); } - return cand; + return (int64_t)cand; } int ngtcp2_pkt_validate_ack(const ngtcp2_ack *fr, int64_t min_pkt_num) { @@ -2240,10 +2244,21 @@ ngtcp2_ssize ngtcp2_pkt_write_stateless_reset(uint8_t *dest, size_t destlen, const uint8_t *stateless_reset_token, const uint8_t *rand, size_t randlen) { + ngtcp2_stateless_reset_token token; + + memcpy(token.data, stateless_reset_token, sizeof(token.data)); + + return ngtcp2_pkt_write_stateless_reset2(dest, destlen, &token, rand, + randlen); +} + +ngtcp2_ssize +ngtcp2_pkt_write_stateless_reset2(uint8_t *dest, size_t destlen, + const ngtcp2_stateless_reset_token *token, + const uint8_t *rand, size_t randlen) { uint8_t *p; - if (destlen < - NGTCP2_MIN_STATELESS_RESET_RANDLEN + NGTCP2_STATELESS_RESET_TOKENLEN) { + if (destlen < NGTCP2_MIN_STATELESS_RESET_RANDLEN + sizeof(token->data)) { return NGTCP2_ERR_NOBUF; } @@ -2253,11 +2268,11 @@ ngtcp2_pkt_write_stateless_reset(uint8_t *dest, size_t destlen, p = dest; - randlen = ngtcp2_min_size(destlen - NGTCP2_STATELESS_RESET_TOKENLEN, randlen); + randlen = ngtcp2_min(destlen - sizeof(token->data), randlen); p = ngtcp2_cpymem(p, rand, randlen); - p = ngtcp2_cpymem(p, stateless_reset_token, NGTCP2_STATELESS_RESET_TOKENLEN); - *dest = (uint8_t)((*dest & 0x7fu) | 0x40u); + p = ngtcp2_cpymem(p, token->data, sizeof(token->data)); + *dest = (uint8_t)((*dest & 0x3FU) | 0x40U); return p - dest; } @@ -2301,11 +2316,11 @@ ngtcp2_ssize ngtcp2_pkt_write_retry( case NGTCP2_PROTO_VER_V1: default: nonce = (const uint8_t *)NGTCP2_RETRY_NONCE_V1; - noncelen = sizeof(NGTCP2_RETRY_NONCE_V1) - 1; + noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V1); break; case NGTCP2_PROTO_VER_V2: nonce = (const uint8_t *)NGTCP2_RETRY_NONCE_V2; - noncelen = sizeof(NGTCP2_RETRY_NONCE_V2) - 1; + noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V2); break; } @@ -2351,7 +2366,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_pseudo_retry( return NGTCP2_ERR_NOBUF; } - *p &= 0xf0; + *p &= 0xF0U; *p |= unused; p += nwrite; @@ -2391,11 +2406,11 @@ int ngtcp2_pkt_verify_retry_tag(uint32_t version, const ngtcp2_pkt_retry *retry, case NGTCP2_PROTO_VER_V1: default: nonce = (const uint8_t *)NGTCP2_RETRY_NONCE_V1; - noncelen = sizeof(NGTCP2_RETRY_NONCE_V1) - 1; + noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V1); break; case NGTCP2_PROTO_VER_V2: nonce = (const uint8_t *)NGTCP2_RETRY_NONCE_V2; - noncelen = sizeof(NGTCP2_RETRY_NONCE_V2) - 1; + noncelen = ngtcp2_strlen_lit(NGTCP2_RETRY_NONCE_V2); break; } @@ -2425,22 +2440,22 @@ size_t ngtcp2_pkt_stream_max_datalen(int64_t stream_id, uint64_t offset, left -= n; if (left > 8 + 1073741823 && len > 1073741823) { - len = ngtcp2_min_uint64(len, 4611686018427387903lu); - return (size_t)ngtcp2_min_uint64(len, (uint64_t)(left - 8)); + len = ngtcp2_min(len, 4611686018427387903UL); + return (size_t)ngtcp2_min(len, (uint64_t)(left - 8)); } if (left > 4 + 16383 && len > 16383) { - len = ngtcp2_min_uint64(len, 1073741823); - return (size_t)ngtcp2_min_uint64(len, (uint64_t)(left - 4)); + len = ngtcp2_min(len, 1073741823); + return (size_t)ngtcp2_min(len, (uint64_t)(left - 4)); } if (left > 2 + 63 && len > 63) { - len = ngtcp2_min_uint64(len, 16383); - return (size_t)ngtcp2_min_uint64(len, (uint64_t)(left - 2)); + len = ngtcp2_min(len, 16383); + return (size_t)ngtcp2_min(len, (uint64_t)(left - 2)); } - len = ngtcp2_min_uint64(len, 63); - return (size_t)ngtcp2_min_uint64(len, (uint64_t)(left - 1)); + len = ngtcp2_min(len, 63); + return (size_t)ngtcp2_min(len, (uint64_t)(left - 1)); } size_t ngtcp2_pkt_crypto_max_datalen(uint64_t offset, size_t len, size_t left) { @@ -2456,23 +2471,23 @@ size_t ngtcp2_pkt_crypto_max_datalen(uint64_t offset, size_t len, size_t left) { if (left > 8 + 1073741823 && len > 1073741823) { #if SIZE_MAX == UINT64_MAX - len = ngtcp2_min_size(len, 4611686018427387903lu); + len = ngtcp2_min(len, 4611686018427387903UL); #endif /* SIZE_MAX == UINT64_MAX */ - return ngtcp2_min_size(len, left - 8); + return ngtcp2_min(len, left - 8); } if (left > 4 + 16383 && len > 16383) { - len = ngtcp2_min_size(len, 1073741823); - return ngtcp2_min_size(len, left - 4); + len = ngtcp2_min(len, 1073741823); + return ngtcp2_min(len, left - 4); } if (left > 2 + 63 && len > 63) { - len = ngtcp2_min_size(len, 16383); - return ngtcp2_min_size(len, left - 2); + len = ngtcp2_min(len, 16383); + return ngtcp2_min(len, left - 2); } - len = ngtcp2_min_size(len, 63); - return ngtcp2_min_size(len, left - 1); + len = ngtcp2_min(len, 63); + return ngtcp2_min(len, left - 1); } size_t ngtcp2_pkt_datagram_framelen(size_t len) { @@ -2855,7 +2870,7 @@ size_t ngtcp2_pkt_remove_vec_partial(ngtcp2_vec *removed_data, ngtcp2_vec *data, } len = 1 + ngtcp2_pcg32_rand_n( - pcg, (uint32_t)ngtcp2_min_size(30, removed_data->len - 1)); + pcg, (uint32_t)ngtcp2_min(30, removed_data->len - 1)); assert(len < removed_data->len); ngtcp2_vec_split_at(&data[datacnt], removed_data, len); @@ -2864,3 +2879,8 @@ size_t ngtcp2_pkt_remove_vec_partial(ngtcp2_vec *removed_data, ngtcp2_vec *data, return datacnt + 1; } + +int ngtcp2_stateless_reset_token_eq(const ngtcp2_stateless_reset_token *a, + const ngtcp2_stateless_reset_token *b) { + return memcmp(a->data, b->data, sizeof(a->data)) == 0; +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.h index ed358dc48d5c..b6c818d491a5 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.h @@ -32,20 +32,20 @@ #include /* QUIC header macros */ -#define NGTCP2_HEADER_FORM_BIT 0x80 -#define NGTCP2_FIXED_BIT_MASK 0x40 -#define NGTCP2_PKT_NUMLEN_MASK 0x03 +#define NGTCP2_HEADER_FORM_BIT 0x80U +#define NGTCP2_FIXED_BIT_MASK 0x40U +#define NGTCP2_PKT_NUMLEN_MASK 0x03U /* Long header specific macros */ -#define NGTCP2_LONG_TYPE_MASK 0x30 -#define NGTCP2_LONG_RESERVED_BIT_MASK 0x0c +#define NGTCP2_LONG_TYPE_MASK 0x30U +#define NGTCP2_LONG_RESERVED_BIT_MASK 0x0CU /* Short header specific macros */ -#define NGTCP2_SHORT_RESERVED_BIT_MASK 0x18 -#define NGTCP2_SHORT_KEY_PHASE_BIT 0x04 +#define NGTCP2_SHORT_RESERVED_BIT_MASK 0x18U +#define NGTCP2_SHORT_KEY_PHASE_BIT 0x04U /* NGTCP2_SR_TYPE is a Type field of Stateless Reset. */ -#define NGTCP2_SR_TYPE 0x1f +#define NGTCP2_SR_TYPE 0x1FU /* NGTCP2_MIN_LONG_HEADERLEN is the minimum length of long header. That is (1|1|TT|RR|PP)<1> + VERSION<4> + DCIL<1> + SCIL<1> + @@ -53,9 +53,9 @@ #define NGTCP2_MIN_LONG_HEADERLEN (1 + 4 + 1 + 1 + 1 + 1) /* STREAM frame specific macros */ -#define NGTCP2_STREAM_FIN_BIT 0x01 -#define NGTCP2_STREAM_LEN_BIT 0x02 -#define NGTCP2_STREAM_OFF_BIT 0x04 +#define NGTCP2_STREAM_FIN_BIT 0x01U +#define NGTCP2_STREAM_LEN_BIT 0x02U +#define NGTCP2_STREAM_OFF_BIT 0x04U /* NGTCP2_MIN_QUIC_PKTLEN is the minimum length of a valid QUIC packet. */ @@ -78,23 +78,23 @@ /* NGTCP2_MAX_SERVER_STREAM_ID_BIDI is the maximum bidirectional server stream ID. */ -#define NGTCP2_MAX_SERVER_STREAM_ID_BIDI ((int64_t)0x3ffffffffffffffdll) +#define NGTCP2_MAX_SERVER_STREAM_ID_BIDI ((int64_t)0x3FFFFFFFFFFFFFFDLL) /* NGTCP2_MAX_CLIENT_STREAM_ID_BIDI is the maximum bidirectional client stream ID. */ -#define NGTCP2_MAX_CLIENT_STREAM_ID_BIDI ((int64_t)0x3ffffffffffffffcll) +#define NGTCP2_MAX_CLIENT_STREAM_ID_BIDI ((int64_t)0x3FFFFFFFFFFFFFFCLL) /* NGTCP2_MAX_SERVER_STREAM_ID_UNI is the maximum unidirectional server stream ID. */ -#define NGTCP2_MAX_SERVER_STREAM_ID_UNI ((int64_t)0x3fffffffffffffffll) +#define NGTCP2_MAX_SERVER_STREAM_ID_UNI ((int64_t)0x3FFFFFFFFFFFFFFFLL) /* NGTCP2_MAX_CLIENT_STREAM_ID_UNI is the maximum unidirectional client stream ID. */ -#define NGTCP2_MAX_CLIENT_STREAM_ID_UNI ((int64_t)0x3ffffffffffffffell) +#define NGTCP2_MAX_CLIENT_STREAM_ID_UNI ((int64_t)0x3FFFFFFFFFFFFFFELL) /* NGTCP2_MAX_NUM_ACK_RANGES is the maximum number of Additional ACK ranges which this library can create, or decode. */ #define NGTCP2_MAX_ACK_RANGES 32 /* NGTCP2_MAX_PKT_NUM is the maximum packet number. */ -#define NGTCP2_MAX_PKT_NUM ((int64_t)((1ll << 62) - 1)) +#define NGTCP2_MAX_PKT_NUM ((int64_t)((1LL << 62) - 1)) /* NGTCP2_MIN_PKT_EXPANDLEN is the minimum packet size expansion to hide/trigger Stateless Reset. */ @@ -103,39 +103,35 @@ /* NGTCP2_RETRY_TAGLEN is the length of Retry packet integrity tag. */ #define NGTCP2_RETRY_TAGLEN 16 -/* NGTCP2_HARD_MAX_UDP_PAYLOAD_SIZE is the maximum UDP datagram - payload size that this library can write. */ -#define NGTCP2_HARD_MAX_UDP_PAYLOAD_SIZE ((1 << 24) - 1) - /* NGTCP2_PKT_LENGTHLEN is the number of bytes that is occupied by Length field in Long packet header. */ #define NGTCP2_PKT_LENGTHLEN 4 /* NGTCP2_PKT_TYPE_INITIAL_V1 is Initial long header packet type for QUIC v1. */ -#define NGTCP2_PKT_TYPE_INITIAL_V1 0x0 +#define NGTCP2_PKT_TYPE_INITIAL_V1 0x0U /* NGTCP2_PKT_TYPE_0RTT_V1 is 0RTT long header packet type for QUIC v1. */ -#define NGTCP2_PKT_TYPE_0RTT_V1 0x1 +#define NGTCP2_PKT_TYPE_0RTT_V1 0x1U /* NGTCP2_PKT_TYPE_HANDSHAKE_V1 is Handshake long header packet type for QUIC v1. */ -#define NGTCP2_PKT_TYPE_HANDSHAKE_V1 0x2 +#define NGTCP2_PKT_TYPE_HANDSHAKE_V1 0x2U /* NGTCP2_PKT_TYPE_RETRY_V1 is Retry long header packet type for QUIC v1. */ -#define NGTCP2_PKT_TYPE_RETRY_V1 0x3 +#define NGTCP2_PKT_TYPE_RETRY_V1 0x3U /* NGTCP2_PKT_TYPE_INITIAL_V2 is Initial long header packet type for QUIC v2. */ -#define NGTCP2_PKT_TYPE_INITIAL_V2 0x1 +#define NGTCP2_PKT_TYPE_INITIAL_V2 0x1U /* NGTCP2_PKT_TYPE_0RTT_V2 is 0RTT long header packet type for QUIC v2. */ -#define NGTCP2_PKT_TYPE_0RTT_V2 0x2 +#define NGTCP2_PKT_TYPE_0RTT_V2 0x2U /* NGTCP2_PKT_TYPE_HANDSHAKE_V2 is Handshake long header packet type for QUIC v2. */ -#define NGTCP2_PKT_TYPE_HANDSHAKE_V2 0x3 +#define NGTCP2_PKT_TYPE_HANDSHAKE_V2 0x3U /* NGTCP2_PKT_TYPE_RETRY_V2 is Retry long header packet type for QUIC v2. */ -#define NGTCP2_PKT_TYPE_RETRY_V2 0x0 +#define NGTCP2_PKT_TYPE_RETRY_V2 0x0U /* NGTCP2_MIN_STREAM_DATALEN is the minimum length of STREAM frame to avoid too small frame. It is not always enforced for various @@ -157,32 +153,36 @@ typedef struct ngtcp2_pkt_retry { uint8_t tag[NGTCP2_RETRY_TAGLEN]; } ngtcp2_pkt_retry; -#define NGTCP2_FRAME_PADDING 0x00 -#define NGTCP2_FRAME_PING 0x01 -#define NGTCP2_FRAME_ACK 0x02 -#define NGTCP2_FRAME_ACK_ECN 0x03 -#define NGTCP2_FRAME_RESET_STREAM 0x04 -#define NGTCP2_FRAME_STOP_SENDING 0x05 -#define NGTCP2_FRAME_CRYPTO 0x06 -#define NGTCP2_FRAME_NEW_TOKEN 0x07 -#define NGTCP2_FRAME_STREAM 0x08 -#define NGTCP2_FRAME_MAX_DATA 0x10 -#define NGTCP2_FRAME_MAX_STREAM_DATA 0x11 -#define NGTCP2_FRAME_MAX_STREAMS_BIDI 0x12 -#define NGTCP2_FRAME_MAX_STREAMS_UNI 0x13 -#define NGTCP2_FRAME_DATA_BLOCKED 0x14 -#define NGTCP2_FRAME_STREAM_DATA_BLOCKED 0x15 -#define NGTCP2_FRAME_STREAMS_BLOCKED_BIDI 0x16 -#define NGTCP2_FRAME_STREAMS_BLOCKED_UNI 0x17 -#define NGTCP2_FRAME_NEW_CONNECTION_ID 0x18 -#define NGTCP2_FRAME_RETIRE_CONNECTION_ID 0x19 -#define NGTCP2_FRAME_PATH_CHALLENGE 0x1a -#define NGTCP2_FRAME_PATH_RESPONSE 0x1b -#define NGTCP2_FRAME_CONNECTION_CLOSE 0x1c -#define NGTCP2_FRAME_CONNECTION_CLOSE_APP 0x1d -#define NGTCP2_FRAME_HANDSHAKE_DONE 0x1e -#define NGTCP2_FRAME_DATAGRAM 0x30 -#define NGTCP2_FRAME_DATAGRAM_LEN 0x31 +#define NGTCP2_FRAME_PADDING 0x00U +#define NGTCP2_FRAME_PING 0x01U +#define NGTCP2_FRAME_ACK 0x02U +#define NGTCP2_FRAME_ACK_ECN 0x03U +#define NGTCP2_FRAME_RESET_STREAM 0x04U +#define NGTCP2_FRAME_STOP_SENDING 0x05U +#define NGTCP2_FRAME_CRYPTO 0x06U +#define NGTCP2_FRAME_NEW_TOKEN 0x07U +#define NGTCP2_FRAME_STREAM 0x08U +#define NGTCP2_FRAME_MAX_DATA 0x10U +#define NGTCP2_FRAME_MAX_STREAM_DATA 0x11U +#define NGTCP2_FRAME_MAX_STREAMS_BIDI 0x12U +#define NGTCP2_FRAME_MAX_STREAMS_UNI 0x13U +#define NGTCP2_FRAME_DATA_BLOCKED 0x14U +#define NGTCP2_FRAME_STREAM_DATA_BLOCKED 0x15U +#define NGTCP2_FRAME_STREAMS_BLOCKED_BIDI 0x16U +#define NGTCP2_FRAME_STREAMS_BLOCKED_UNI 0x17U +#define NGTCP2_FRAME_NEW_CONNECTION_ID 0x18U +#define NGTCP2_FRAME_RETIRE_CONNECTION_ID 0x19U +#define NGTCP2_FRAME_PATH_CHALLENGE 0x1AU +#define NGTCP2_FRAME_PATH_RESPONSE 0x1BU +#define NGTCP2_FRAME_CONNECTION_CLOSE 0x1CU +#define NGTCP2_FRAME_CONNECTION_CLOSE_APP 0x1DU +#define NGTCP2_FRAME_HANDSHAKE_DONE 0x1EU +#define NGTCP2_FRAME_DATAGRAM 0x30U +#define NGTCP2_FRAME_DATAGRAM_LEN 0x31U + +typedef struct ngtcp2_frame_hd { + uint64_t type; +} ngtcp2_frame_hd; /* ngtcp2_stream represents STREAM and CRYPTO frames. */ typedef struct ngtcp2_stream { @@ -195,7 +195,7 @@ typedef struct ngtcp2_stream { uint8_t flags; /* CRYPTO frame does not include this field, and must set it to 0. */ - uint8_t fin; + int fin; /* CRYPTO frame does not include this field, and must set it to 0. */ int64_t stream_id; @@ -204,8 +204,9 @@ typedef struct ngtcp2_stream { the length of data is 1 in this definition, the library may allocate extra bytes to hold more elements. */ size_t datacnt; - /* data is the array of ngtcp2_vec which references data. */ - ngtcp2_vec data[1]; + /* data points to ngtcp2_vec array which references data. If + datacnt == 0, this field may be NULL. */ + ngtcp2_vec *data; } ngtcp2_stream; typedef struct ngtcp2_ack_range { @@ -229,7 +230,7 @@ typedef struct ngtcp2_ack { } ecn; uint64_t first_ack_range; size_t rangecnt; - ngtcp2_ack_range ranges[1]; + ngtcp2_ack_range *ranges; } ngtcp2_ack; typedef struct ngtcp2_padding { @@ -299,7 +300,7 @@ typedef struct ngtcp2_new_connection_id { uint64_t seq; uint64_t retire_prior_to; ngtcp2_cid cid; - uint8_t stateless_reset_token[NGTCP2_STATELESS_RESET_TOKENLEN]; + ngtcp2_stateless_reset_token token; } ngtcp2_new_connection_id; typedef struct ngtcp2_stop_sending { @@ -310,12 +311,12 @@ typedef struct ngtcp2_stop_sending { typedef struct ngtcp2_path_challenge { uint64_t type; - uint8_t data[NGTCP2_PATH_CHALLENGE_DATALEN]; + ngtcp2_path_challenge_data data; } ngtcp2_path_challenge; typedef struct ngtcp2_path_response { uint64_t type; - uint8_t data[NGTCP2_PATH_CHALLENGE_DATALEN]; + ngtcp2_path_challenge_data data; } ngtcp2_path_response; typedef struct ngtcp2_new_token { @@ -339,17 +340,13 @@ typedef struct ngtcp2_datagram { uint64_t dgram_id; /* datacnt is the number of elements that data contains. */ size_t datacnt; - /* data is a pointer to ngtcp2_vec array that stores data. */ + /* data is a pointer to ngtcp2_vec array that stores data. If + datacnt == 0, this field may be NULL.*/ ngtcp2_vec *data; - /* rdata is conveniently embedded to ngtcp2_datagram, so that data - field can just point to the address of this field to store a - single vector which is the case when DATAGRAM is received from a - remote endpoint. */ - ngtcp2_vec rdata[1]; } ngtcp2_datagram; typedef union ngtcp2_frame { - uint64_t type; + ngtcp2_frame_hd hd; ngtcp2_stream stream; ngtcp2_ack ack; ngtcp2_padding padding; @@ -370,11 +367,6 @@ typedef union ngtcp2_frame { ngtcp2_retire_connection_id retire_connection_id; ngtcp2_handshake_done handshake_done; ngtcp2_datagram datagram; - /* Extend ngtcp2_frame so that ngtcp2_stream has at least additional - 3 ngtcp2_vec, totaling 4 slots, which can store HEADERS header, - HEADERS payload, DATA header, and DATA payload in the standard - sized ngtcp2_frame_chain. */ - uint8_t pad[sizeof(ngtcp2_stream) + sizeof(ngtcp2_vec) * 3]; } ngtcp2_frame; typedef struct ngtcp2_pkt_chain ngtcp2_pkt_chain; @@ -454,10 +446,22 @@ ngtcp2_ssize ngtcp2_pkt_encode_hd_long(uint8_t *out, size_t outlen, ngtcp2_ssize ngtcp2_pkt_encode_hd_short(uint8_t *out, size_t outlen, const ngtcp2_pkt_hd *hd); +/* + * ngtcp2_frame_decoder is QUIC frame decoder. For frames that + * require the external buffers (e.g., ngtcp2_stream and ngtcp2_ack), + * it provides those buffers on demand. + */ +typedef struct ngtcp2_frame_decoder { + union { + ngtcp2_vec data; + ngtcp2_ack_range ack_ranges[NGTCP2_MAX_ACK_RANGES]; + } buf; +} ngtcp2_frame_decoder; + /** * @function * - * `ngtcp2_pkt_decode_frame` decodes a QUIC frame from the buffer + * `ngtcp2_frame_decoder_decode` decodes a QUIC frame from the buffer * pointed by |payload| whose length is |payloadlen|. * * This function returns the number of bytes read to decode a single @@ -467,8 +471,10 @@ ngtcp2_ssize ngtcp2_pkt_encode_hd_short(uint8_t *out, size_t outlen, * Frame is badly formatted; or frame type is unknown; or * |payloadlen| is 0. */ -ngtcp2_ssize ngtcp2_pkt_decode_frame(ngtcp2_frame *dest, const uint8_t *payload, - size_t payloadlen); +ngtcp2_ssize ngtcp2_frame_decoder_decode(ngtcp2_frame_decoder *frd, + ngtcp2_frame *dest, + const uint8_t *payload, + size_t payloadlen); /** * @function @@ -508,7 +514,7 @@ size_t ngtcp2_pkt_decode_version_negotiation(uint32_t *dest, * NGTCP2_ERR_INVALID_ARGUMENT * Payloadlen is too short. */ -int ngtcp2_pkt_decode_stateless_reset(ngtcp2_pkt_stateless_reset *sr, +int ngtcp2_pkt_decode_stateless_reset(ngtcp2_pkt_stateless_reset2 *sr, const uint8_t *payload, size_t payloadlen); @@ -1317,4 +1323,11 @@ size_t ngtcp2_pkt_remove_vec_partial(ngtcp2_vec *removed_data, ngtcp2_vec *data, size_t datacnt, uint64_t *offsets, ngtcp2_pcg32 *pcg, const ngtcp2_vec *part); +/* + * ngtcp2_stateless_reset_token_eq returns nonzero if |a| and |b| + * share the same token. + */ +int ngtcp2_stateless_reset_token_eq(const ngtcp2_stateless_reset_token *a, + const ngtcp2_stateless_reset_token *b); + #endif /* !defined(NGTCP2_PKT_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.c index ebd113f67462..3827cba9afe9 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.c @@ -134,7 +134,7 @@ static void pmtud_next_probe(ngtcp2_pmtud *pmtud) { void ngtcp2_pmtud_probe_success(ngtcp2_pmtud *pmtud, size_t payloadlen) { pmtud->max_udp_payload_size = - ngtcp2_max_size(pmtud->max_udp_payload_size, payloadlen); + ngtcp2_max(pmtud->max_udp_payload_size, payloadlen); assert(pmtud->mtu_idx < pmtud->probeslen); @@ -156,8 +156,8 @@ void ngtcp2_pmtud_handle_expiry(ngtcp2_pmtud *pmtud, ngtcp2_tstamp ts) { return; } - pmtud->min_fail_udp_payload_size = ngtcp2_min_size( - pmtud->min_fail_udp_payload_size, pmtud->probes[pmtud->mtu_idx]); + pmtud->min_fail_udp_payload_size = + ngtcp2_min(pmtud->min_fail_udp_payload_size, pmtud->probes[pmtud->mtu_idx]); pmtud_next_probe(pmtud); } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.c index 4d193125ae8e..81bc3296de85 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.c @@ -44,6 +44,14 @@ void ngtcp2_ppe_init(ngtcp2_ppe *ppe, uint8_t *out, size_t outlen, ppe->cc = cc; } +/* + * ppe_sample_offset returns the offset to sample for packet number + * encryption. + */ +static size_t ppe_sample_offset(ngtcp2_ppe *ppe) { + return ppe->pkt_num_offset + 4; +} + int ngtcp2_ppe_encode_hd(ngtcp2_ppe *ppe, const ngtcp2_pkt_hd *hd) { ngtcp2_ssize rv; ngtcp2_buf *buf = &ppe->buf; @@ -78,6 +86,10 @@ int ngtcp2_ppe_encode_hd(ngtcp2_ppe *ppe, const ngtcp2_pkt_hd *hd) { buf->last += rv; + if (ngtcp2_buf_cap(buf) < ppe_sample_offset(ppe) + NGTCP2_HP_SAMPLELEN) { + return NGTCP2_ERR_NOBUF; + } + ppe->pkt_numlen = hd->pkt_numlen; ppe->hdlen = (size_t)rv; ppe->pkt_num = hd->pkt_num; @@ -105,14 +117,6 @@ int ngtcp2_ppe_encode_frame(ngtcp2_ppe *ppe, ngtcp2_frame *fr) { return 0; } -/* - * ppe_sample_offset returns the offset to sample for packet number - * encryption. - */ -static size_t ppe_sample_offset(ngtcp2_ppe *ppe) { - return ppe->pkt_num_offset + 4; -} - ngtcp2_ssize ngtcp2_ppe_final(ngtcp2_ppe *ppe, const uint8_t **ppkt) { ngtcp2_buf *buf = &ppe->buf; ngtcp2_crypto_cc *cc = ppe->cc; @@ -154,9 +158,9 @@ ngtcp2_ssize ngtcp2_ppe_final(ngtcp2_ppe *ppe, const uint8_t **ppkt) { p = buf->begin; if (*p & NGTCP2_HEADER_FORM_BIT) { - *p = (uint8_t)(*p ^ (mask[0] & 0x0f)); + *p = (uint8_t)(*p ^ (mask[0] & 0x0FU)); } else { - *p = (uint8_t)(*p ^ (mask[0] & 0x1f)); + *p = (uint8_t)(*p ^ (mask[0] & 0x1FU)); } p = buf->begin + ppe->pkt_num_offset; @@ -187,21 +191,21 @@ size_t ngtcp2_ppe_padding_size(ngtcp2_ppe *ppe, size_t n) { ngtcp2_buf *buf = &ppe->buf; size_t pktlen = ngtcp2_buf_len(buf) + cc->aead.max_overhead; size_t len = 0; - size_t max_samplelen; + size_t min_pktlen; - n = ngtcp2_min_size(n, ngtcp2_buf_cap(buf)); + n = ngtcp2_min(n, ngtcp2_buf_cap(buf)); if (pktlen < n) { len = n - pktlen; } /* Ensure header protection sample */ - max_samplelen = - ngtcp2_buf_len(buf) + cc->aead.max_overhead - ppe_sample_offset(ppe); - - if (max_samplelen < NGTCP2_HP_SAMPLELEN) { - len = ngtcp2_max_size(len, NGTCP2_HP_SAMPLELEN - max_samplelen); + min_pktlen = ppe_sample_offset(ppe) + NGTCP2_HP_SAMPLELEN; + if (pktlen < min_pktlen) { + len = ngtcp2_max(len, min_pktlen - pktlen); } + /* ngtcp2_ppe_encode_hd ensures that the buffer has enough capacity + for the padding required for header protection sample. */ assert(ngtcp2_buf_left(buf) >= len + cc->aead.max_overhead); if (len == 0) { @@ -220,24 +224,34 @@ size_t ngtcp2_ppe_dgram_padding(ngtcp2_ppe *ppe) { size_t ngtcp2_ppe_dgram_padding_size(ngtcp2_ppe *ppe, size_t n) { ngtcp2_crypto_cc *cc = ppe->cc; ngtcp2_buf *buf = &ppe->buf; - size_t dgramlen = - ppe->dgram_offset + ngtcp2_buf_len(buf) + cc->aead.max_overhead; + size_t pktlen = ngtcp2_buf_len(buf) + cc->aead.max_overhead; + size_t dgramlen = ppe->dgram_offset + pktlen; size_t len; + size_t min_pktlen; - n = ngtcp2_min_size(n, ppe->dgram_offset + ngtcp2_buf_cap(buf)); + n = ngtcp2_min(n, ppe->dgram_offset + ngtcp2_buf_cap(buf)); - if (dgramlen >= n) { + if (dgramlen < n) { + len = n - dgramlen; + } else { + len = 0; + } + + /* Ensure header protection sample */ + min_pktlen = ppe_sample_offset(ppe) + NGTCP2_HP_SAMPLELEN; + if (pktlen < min_pktlen) { + len = ngtcp2_max(len, min_pktlen - pktlen); + } + + /* ngtcp2_ppe_encode_hd ensures that the buffer has enough capacity + for the padding required for header protection sample. */ + assert(ngtcp2_buf_left(buf) >= len + cc->aead.max_overhead); + + if (len == 0) { return 0; } - len = n - dgramlen; buf->last = ngtcp2_setmem(buf->last, 0, len); return len; } - -int ngtcp2_ppe_ensure_hp_sample(ngtcp2_ppe *ppe) { - ngtcp2_buf *buf = &ppe->buf; - - return ngtcp2_buf_left(buf) >= (4 - ppe->pkt_numlen) + NGTCP2_HP_SAMPLELEN; -} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.h index 9874b3680054..ba9edc698ad2 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.h @@ -125,7 +125,9 @@ size_t ngtcp2_ppe_dgram_padding(ngtcp2_ppe *ppe); * of a UDP datagram payload is at least |n| bytes long. If it is * unable to add PADDING in that way, this function still adds PADDING * frame as much as possible. This function should be called just - * before calling ngtcp2_ppe_final(). + * before calling ngtcp2_ppe_final(). This function also ensures that + * the packet has enough space for header protection sample by + * possibly adding extra padding more than |n|. * * This function returns the number of bytes added as padding. */ @@ -138,20 +140,11 @@ size_t ngtcp2_ppe_dgram_padding_size(ngtcp2_ppe *ppe, size_t n); * PADDING at least |n| bytes, this function still adds PADDING frames * as much as possible. This function also adds PADDING frames so * that the minimum padding requirement of header protection is met. - * Those padding may be larger than |n| bytes. It is recommended to - * make sure that ngtcp2_ppe_ensure_hp_sample succeeds after writing - * QUIC packet header. This function should be called just before - * calling ngtcp2_ppe_final(). + * Those padding may be larger than |n| bytes. This function should + * be called just before calling ngtcp2_ppe_final(). * * This function returns the number of bytes added as padding. */ size_t ngtcp2_ppe_padding_size(ngtcp2_ppe *ppe, size_t n); -/* - * ngtcp2_ppe_ensure_hp_sample returns nonzero if the buffer has - * enough space for header protection sample. This should be called - * right after packet header is written. - */ -int ngtcp2_ppe_ensure_hp_sample(ngtcp2_ppe *ppe); - #endif /* !defined(NGTCP2_PPE_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.c index 162bed001567..87d261dd750b 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.c @@ -30,11 +30,10 @@ #include "ngtcp2_macro.h" void ngtcp2_pq_init(ngtcp2_pq *pq, ngtcp2_pq_less less, const ngtcp2_mem *mem) { - pq->q = NULL; - pq->mem = mem; - pq->length = 0; - pq->capacity = 0; - pq->less = less; + *pq = (ngtcp2_pq){ + .mem = mem, + .less = less, + }; } void ngtcp2_pq_free(ngtcp2_pq *pq) { @@ -74,7 +73,7 @@ int ngtcp2_pq_push(ngtcp2_pq *pq, ngtcp2_pq_entry *item) { void *nq; size_t ncapacity; - ncapacity = ngtcp2_max_size(4, pq->capacity * 2); + ncapacity = ngtcp2_max(4, pq->capacity * 2); nq = ngtcp2_mem_realloc(pq->mem, pq->q, ncapacity * sizeof(ngtcp2_pq_entry *)); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.c index 471f84c76440..f9abba46daf9 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.c @@ -31,12 +31,16 @@ #include "ngtcp2_log.h" #include "ngtcp2_macro.h" #include "ngtcp2_addr.h" +#include "ngtcp2_str.h" -void ngtcp2_pv_entry_init(ngtcp2_pv_entry *pvent, const uint8_t *data, +void ngtcp2_pv_entry_init(ngtcp2_pv_entry *pvent, + const ngtcp2_path_challenge_data *data, ngtcp2_tstamp expiry, uint8_t flags) { - memcpy(pvent->data, data, sizeof(pvent->data)); - pvent->expiry = expiry; - pvent->flags = flags; + *pvent = (ngtcp2_pv_entry){ + .expiry = expiry, + .flags = flags, + .data = *data, + }; } int ngtcp2_pv_new(ngtcp2_pv **ppv, const ngtcp2_dcid *dcid, @@ -70,7 +74,7 @@ void ngtcp2_pv_del(ngtcp2_pv *pv) { ngtcp2_mem_free(pv->mem, pv); } -void ngtcp2_pv_add_entry(ngtcp2_pv *pv, const uint8_t *data, +void ngtcp2_pv_add_entry(ngtcp2_pv *pv, const ngtcp2_path_challenge_data *data, ngtcp2_tstamp expiry, uint8_t flags, ngtcp2_tstamp ts) { ngtcp2_pv_entry *ent; @@ -88,7 +92,8 @@ void ngtcp2_pv_add_entry(ngtcp2_pv *pv, const uint8_t *data, --pv->probe_pkt_left; } -int ngtcp2_pv_validate(ngtcp2_pv *pv, uint8_t *pflags, const uint8_t *data) { +int ngtcp2_pv_validate(ngtcp2_pv *pv, uint8_t *pflags, + const ngtcp2_path_challenge_data *data) { size_t len = ngtcp2_ringbuf_len(&pv->ents.rb); size_t i; ngtcp2_pv_entry *ent; @@ -99,7 +104,7 @@ int ngtcp2_pv_validate(ngtcp2_pv *pv, uint8_t *pflags, const uint8_t *data) { for (i = 0; i < len; ++i) { ent = ngtcp2_ringbuf_get(&pv->ents.rb, i); - if (memcmp(ent->data, data, sizeof(ent->data)) == 0) { + if (ngtcp2_cmemeq(ent->data.data, data->data, sizeof(ent->data.data))) { *pflags = ent->flags; ngtcp2_log_info(pv->log, NGTCP2_LOG_EVENT_PTV, "path has been validated"); return 0; @@ -123,6 +128,8 @@ void ngtcp2_pv_handle_entry_expiry(ngtcp2_pv *pv, ngtcp2_tstamp ts) { } ++pv->round; + pv->round = ngtcp2_min(pv->round, 10); + pv->probe_pkt_left = NGTCP2_PV_NUM_PROBE_PKT; } @@ -143,7 +150,7 @@ int ngtcp2_pv_validation_timed_out(ngtcp2_pv *pv, ngtcp2_tstamp ts) { ent = ngtcp2_ringbuf_get(&pv->ents.rb, ngtcp2_ringbuf_len(&pv->ents.rb) - 1); t = pv->started_ts + pv->timeout; - t = ngtcp2_max_uint64(t, ent->expiry); + t = ngtcp2_max(t, ent->expiry); return t <= ts; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h index 2d07e41648db..28bdf722b204 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h @@ -46,10 +46,10 @@ typedef struct ngtcp2_log ngtcp2_log; typedef struct ngtcp2_frame_chain ngtcp2_frame_chain; /* NGTCP2_PV_ENTRY_FLAG_NONE indicates that no flag is set. */ -#define NGTCP2_PV_ENTRY_FLAG_NONE 0x00u +#define NGTCP2_PV_ENTRY_FLAG_NONE 0x00U /* NGTCP2_PV_ENTRY_FLAG_UNDERSIZED indicates that UDP datagram which contains PATH_CHALLENGE is undersized (< 1200 bytes) */ -#define NGTCP2_PV_ENTRY_FLAG_UNDERSIZED 0x01u +#define NGTCP2_PV_ENTRY_FLAG_UNDERSIZED 0x01U typedef struct ngtcp2_pv_entry { /* expiry is the timestamp when this PATH_CHALLENGE expires. */ @@ -57,30 +57,31 @@ typedef struct ngtcp2_pv_entry { /* flags is zero or more of NGTCP2_PV_ENTRY_FLAG_*. */ uint8_t flags; /* data is a byte string included in PATH_CHALLENGE. */ - uint8_t data[8]; + ngtcp2_path_challenge_data data; } ngtcp2_pv_entry; -void ngtcp2_pv_entry_init(ngtcp2_pv_entry *pvent, const uint8_t *data, +void ngtcp2_pv_entry_init(ngtcp2_pv_entry *pvent, + const ngtcp2_path_challenge_data *data, ngtcp2_tstamp expiry, uint8_t flags); /* NGTCP2_PV_FLAG_NONE indicates no flag is set. */ -#define NGTCP2_PV_FLAG_NONE 0x00u +#define NGTCP2_PV_FLAG_NONE 0x00U /* NGTCP2_PV_FLAG_DONT_CARE indicates that the outcome of path validation should be ignored entirely. */ -#define NGTCP2_PV_FLAG_DONT_CARE 0x01u +#define NGTCP2_PV_FLAG_DONT_CARE 0x01U /* NGTCP2_PV_FLAG_CANCEL_TIMER indicates that the expiry timer is cancelled. */ -#define NGTCP2_PV_FLAG_CANCEL_TIMER 0x02u +#define NGTCP2_PV_FLAG_CANCEL_TIMER 0x02U /* NGTCP2_PV_FLAG_FALLBACK_PRESENT indicates that a fallback Destination Connection ID and PTO are available in ngtcp2_pv. If path validation fails, then fallback to them. If path validation succeeds, the fallback Destination Connection ID is retired if it is not zero length, and does not equal to the current Destination Connection ID. */ -#define NGTCP2_PV_FLAG_FALLBACK_PRESENT 0x04u +#define NGTCP2_PV_FLAG_FALLBACK_PRESENT 0x04U /* NGTCP2_PV_FLAG_PREFERRED_ADDR indicates that client is migrating to server's preferred address. This flag is only used by client. */ -#define NGTCP2_PV_FLAG_PREFERRED_ADDR 0x10u +#define NGTCP2_PV_FLAG_PREFERRED_ADDR 0x10U typedef struct ngtcp2_pv ngtcp2_pv; @@ -141,7 +142,7 @@ void ngtcp2_pv_del(ngtcp2_pv *pv); * ngtcp2_pv_add_entry adds new entry with |data|. |expiry| is the * expiry time of the entry. */ -void ngtcp2_pv_add_entry(ngtcp2_pv *pv, const uint8_t *data, +void ngtcp2_pv_add_entry(ngtcp2_pv *pv, const ngtcp2_path_challenge_data *data, ngtcp2_tstamp expiry, uint8_t flags, ngtcp2_tstamp ts); /* @@ -164,7 +165,8 @@ int ngtcp2_pv_full(ngtcp2_pv *pv); * NGTCP2_ERR_INVALID_ARGUMENT * |pv| does not have an entry which has |data| and |path| */ -int ngtcp2_pv_validate(ngtcp2_pv *pv, uint8_t *pflags, const uint8_t *data); +int ngtcp2_pv_validate(ngtcp2_pv *pv, uint8_t *pflags, + const ngtcp2_path_challenge_data *data); /* * ngtcp2_pv_handle_entry_expiry checks expiry of existing entries. diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c index c0f920746a4d..9f233b6cd838 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c @@ -40,7 +40,7 @@ void ngtcp2_qlog_init(ngtcp2_qlog *qlog, ngtcp2_qlog_write write, qlog->user_data = user_data; } -#define write_verbatim(DEST, S) ngtcp2_cpymem((DEST), (S), sizeof(S) - 1) +#define write_verbatim(DEST, S) ngtcp2_cpymem((DEST), (S), ngtcp2_strlen_lit(S)) static uint8_t *write_string_impl(uint8_t *p, const uint8_t *data, size_t datalen) { @@ -53,17 +53,11 @@ static uint8_t *write_string_impl(uint8_t *p, const uint8_t *data, } #define write_string(DEST, S) \ - write_string_impl((DEST), (const uint8_t *)(S), sizeof(S) - 1) - -#define NGTCP2_LOWER_XDIGITS "0123456789abcdef" + write_string_impl((DEST), (const uint8_t *)(S), ngtcp2_strlen_lit(S)) static uint8_t *write_hex(uint8_t *p, const uint8_t *data, size_t datalen) { - const uint8_t *b = data, *end = data + datalen; *p++ = '"'; - for (; b != end; ++b) { - *p++ = (uint8_t)NGTCP2_LOWER_XDIGITS[*b >> 4]; - *p++ = (uint8_t)NGTCP2_LOWER_XDIGITS[*b & 0xf]; - } + p = ngtcp2_encode_hex(p, data, datalen); *p++ = '"'; return p; } @@ -72,38 +66,19 @@ static uint8_t *write_cid(uint8_t *p, const ngtcp2_cid *cid) { return write_hex(p, cid->data, cid->datalen); } -static uint8_t *write_number(uint8_t *p, uint64_t n) { - size_t nlen = 0; - uint64_t t; - uint8_t *res; - - if (n == 0) { - *p++ = '0'; - return p; - } - for (t = n; t; t /= 10, ++nlen) - ; - p += nlen; - res = p; - for (; n; n /= 10) { - *--p = (uint8_t)((n % 10) + '0'); - } - return res; -} - static uint8_t *write_tstamp(uint8_t *p, ngtcp2_tstamp ts) { - return write_number(p, ts / NGTCP2_MILLISECONDS); + return ngtcp2_encode_uint(p, ts / NGTCP2_MILLISECONDS); } static uint8_t *write_duration(uint8_t *p, ngtcp2_duration duration) { - return write_number(p, duration / NGTCP2_MILLISECONDS); + return ngtcp2_encode_uint(p, duration / NGTCP2_MILLISECONDS); } static uint8_t *write_bool(uint8_t *p, int b) { if (b) { - return ngtcp2_cpymem(p, "true", sizeof("true") - 1); + return ngtcp2_cpymem(p, "true", ngtcp2_strlen_lit("true")); } - return ngtcp2_cpymem(p, "false", sizeof("false") - 1); + return ngtcp2_cpymem(p, "false", ngtcp2_strlen_lit("false")); } static uint8_t *write_pair_impl(uint8_t *p, const uint8_t *name, size_t namelen, @@ -114,7 +89,8 @@ static uint8_t *write_pair_impl(uint8_t *p, const uint8_t *name, size_t namelen, } #define write_pair(DEST, NAME, VALUE) \ - write_pair_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, (VALUE)) + write_pair_impl((DEST), (const uint8_t *)(NAME), ngtcp2_strlen_lit(NAME), \ + (VALUE)) static uint8_t *write_pair_hex_impl(uint8_t *p, const uint8_t *name, size_t namelen, const uint8_t *value, @@ -125,19 +101,19 @@ static uint8_t *write_pair_hex_impl(uint8_t *p, const uint8_t *name, } #define write_pair_hex(DEST, NAME, VALUE, VALUELEN) \ - write_pair_hex_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, \ - (VALUE), (VALUELEN)) + write_pair_hex_impl((DEST), (const uint8_t *)(NAME), \ + ngtcp2_strlen_lit(NAME), (VALUE), (VALUELEN)) static uint8_t *write_pair_number_impl(uint8_t *p, const uint8_t *name, size_t namelen, uint64_t value) { p = write_string_impl(p, name, namelen); *p++ = ':'; - return write_number(p, value); + return ngtcp2_encode_uint(p, value); } #define write_pair_number(DEST, NAME, VALUE) \ - write_pair_number_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, \ - (VALUE)) + write_pair_number_impl((DEST), (const uint8_t *)(NAME), \ + ngtcp2_strlen_lit(NAME), (VALUE)) static uint8_t *write_pair_duration_impl(uint8_t *p, const uint8_t *name, size_t namelen, @@ -148,8 +124,8 @@ static uint8_t *write_pair_duration_impl(uint8_t *p, const uint8_t *name, } #define write_pair_duration(DEST, NAME, VALUE) \ - write_pair_duration_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, \ - (VALUE)) + write_pair_duration_impl((DEST), (const uint8_t *)(NAME), \ + ngtcp2_strlen_lit(NAME), (VALUE)) static uint8_t *write_pair_tstamp_impl(uint8_t *p, const uint8_t *name, size_t namelen, ngtcp2_tstamp ts) { @@ -159,8 +135,8 @@ static uint8_t *write_pair_tstamp_impl(uint8_t *p, const uint8_t *name, } #define write_pair_tstamp(DEST, NAME, VALUE) \ - write_pair_tstamp_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, \ - (VALUE)) + write_pair_tstamp_impl((DEST), (const uint8_t *)(NAME), \ + ngtcp2_strlen_lit(NAME), (VALUE)) static uint8_t *write_pair_bool_impl(uint8_t *p, const uint8_t *name, size_t namelen, int b) { @@ -170,8 +146,8 @@ static uint8_t *write_pair_bool_impl(uint8_t *p, const uint8_t *name, } #define write_pair_bool(DEST, NAME, VALUE) \ - write_pair_bool_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, \ - (VALUE)) + write_pair_bool_impl((DEST), (const uint8_t *)(NAME), \ + ngtcp2_strlen_lit(NAME), (VALUE)) static uint8_t *write_pair_cid_impl(uint8_t *p, const uint8_t *name, size_t namelen, const ngtcp2_cid *cid) { @@ -181,10 +157,10 @@ static uint8_t *write_pair_cid_impl(uint8_t *p, const uint8_t *name, } #define write_pair_cid(DEST, NAME, VALUE) \ - write_pair_cid_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, \ - (VALUE)) + write_pair_cid_impl((DEST), (const uint8_t *)(NAME), \ + ngtcp2_strlen_lit(NAME), (VALUE)) -#define ngtcp2_make_vec_lit(S) {(uint8_t *)(S), sizeof((S)) - 1} +#define ngtcp2_make_vec_lit(S) {(uint8_t *)(S), ngtcp2_strlen_lit((S))} static uint8_t *write_common_fields(uint8_t *p, const ngtcp2_cid *odcid) { p = write_verbatim( @@ -218,7 +194,7 @@ void ngtcp2_qlog_start(ngtcp2_qlog *qlog, const ngtcp2_cid *odcid, int server) { } p = write_verbatim( - p, "\x1e{\"qlog_format\":\"JSON-SEQ\",\"qlog_version\":\"0.3\","); + p, "\x1E{\"qlog_format\":\"JSON-SEQ\",\"qlog_version\":\"0.3\","); p = write_trace(p, server, odcid); p = write_verbatim(p, "}\n"); @@ -227,49 +203,41 @@ void ngtcp2_qlog_start(ngtcp2_qlog *qlog, const ngtcp2_cid *odcid, int server) { } void ngtcp2_qlog_end(ngtcp2_qlog *qlog) { - uint8_t buf[1] = {0}; - if (!qlog->write) { return; } - qlog->write(qlog->user_data, NGTCP2_QLOG_WRITE_FLAG_FIN, &buf, 0); + qlog->write(qlog->user_data, NGTCP2_QLOG_WRITE_FLAG_FIN, "", 0); } -static ngtcp2_vec vec_pkt_type_initial = ngtcp2_make_vec_lit("initial"); -static ngtcp2_vec vec_pkt_type_handshake = ngtcp2_make_vec_lit("handshake"); -static ngtcp2_vec vec_pkt_type_0rtt = ngtcp2_make_vec_lit("0RTT"); -static ngtcp2_vec vec_pkt_type_1rtt = ngtcp2_make_vec_lit("1RTT"); -static ngtcp2_vec vec_pkt_type_retry = ngtcp2_make_vec_lit("retry"); -static ngtcp2_vec vec_pkt_type_version_negotiation = +static const ngtcp2_vec vec_pkt_type_initial = ngtcp2_make_vec_lit("initial"); +static const ngtcp2_vec vec_pkt_type_handshake = + ngtcp2_make_vec_lit("handshake"); +static const ngtcp2_vec vec_pkt_type_0rtt = ngtcp2_make_vec_lit("0RTT"); +static const ngtcp2_vec vec_pkt_type_1rtt = ngtcp2_make_vec_lit("1RTT"); +static const ngtcp2_vec vec_pkt_type_retry = ngtcp2_make_vec_lit("retry"); +static const ngtcp2_vec vec_pkt_type_version_negotiation = ngtcp2_make_vec_lit("version_negotiation"); -static ngtcp2_vec vec_pkt_type_stateless_reset = +static const ngtcp2_vec vec_pkt_type_stateless_reset = ngtcp2_make_vec_lit("stateless_reset"); -static ngtcp2_vec vec_pkt_type_unknown = ngtcp2_make_vec_lit("unknown"); +static const ngtcp2_vec vec_pkt_type_unknown = ngtcp2_make_vec_lit("unknown"); static const ngtcp2_vec *qlog_pkt_type(const ngtcp2_pkt_hd *hd) { - if (hd->flags & NGTCP2_PKT_FLAG_LONG_FORM) { - switch (hd->type) { - case NGTCP2_PKT_INITIAL: - return &vec_pkt_type_initial; - case NGTCP2_PKT_HANDSHAKE: - return &vec_pkt_type_handshake; - case NGTCP2_PKT_0RTT: - return &vec_pkt_type_0rtt; - case NGTCP2_PKT_RETRY: - return &vec_pkt_type_retry; - default: - return &vec_pkt_type_unknown; - } - } - switch (hd->type) { + case NGTCP2_PKT_INITIAL: + return &vec_pkt_type_initial; + case NGTCP2_PKT_0RTT: + return &vec_pkt_type_0rtt; + case NGTCP2_PKT_HANDSHAKE: + return &vec_pkt_type_handshake; + case NGTCP2_PKT_RETRY: + return &vec_pkt_type_retry; + case NGTCP2_PKT_1RTT: + return &vec_pkt_type_1rtt; case NGTCP2_PKT_VERSION_NEGOTIATION: return &vec_pkt_type_version_negotiation; case NGTCP2_PKT_STATELESS_RESET: return &vec_pkt_type_stateless_reset; - case NGTCP2_PKT_1RTT: - return &vec_pkt_type_1rtt; default: return &vec_pkt_type_unknown; } @@ -340,10 +308,10 @@ static uint8_t *write_ack_frame(uint8_t *p, const ngtcp2_ack *fr) { min_ack = fr->largest_ack - (int64_t)fr->first_ack_range; *p++ = '['; - p = write_number(p, (uint64_t)min_ack); + p = ngtcp2_encode_uint(p, (uint64_t)min_ack); if (largest_ack != min_ack) { *p++ = ','; - p = write_number(p, (uint64_t)largest_ack); + p = ngtcp2_encode_uint(p, (uint64_t)largest_ack); } *p++ = ']'; @@ -353,10 +321,10 @@ static uint8_t *write_ack_frame(uint8_t *p, const ngtcp2_ack *fr) { min_ack = largest_ack - (int64_t)range->len; *p++ = ','; *p++ = '['; - p = write_number(p, (uint64_t)min_ack); + p = ngtcp2_encode_uint(p, (uint64_t)min_ack); if (largest_ack != min_ack) { *p++ = ','; - p = write_number(p, (uint64_t)largest_ack); + p = ngtcp2_encode_uint(p, (uint64_t)largest_ack); } *p++ = ']'; } @@ -579,8 +547,7 @@ write_new_connection_id_frame(uint8_t *p, const ngtcp2_new_connection_id *fr) { *p++ = ','; p = write_pair_cid(p, "connection_id", &fr->cid); p = write_verbatim(p, ",\"stateless_reset_token\":{"); - p = write_pair_hex(p, "data", fr->stateless_reset_token, - sizeof(fr->stateless_reset_token)); + p = write_pair_hex(p, "data", fr->token.data, sizeof(fr->token.data)); *p++ = '}'; *p++ = '}'; @@ -610,7 +577,7 @@ static uint8_t *write_path_challenge_frame(uint8_t *p, #define NGTCP2_QLOG_PATH_CHALLENGE_FRAME_OVERHEAD 57 p = write_verbatim(p, "{\"frame_type\":\"path_challenge\","); - p = write_pair_hex(p, "data", fr->data, sizeof(fr->data)); + p = write_pair_hex(p, "data", fr->data.data, sizeof(fr->data.data)); *p++ = '}'; return p; @@ -624,7 +591,7 @@ static uint8_t *write_path_response_frame(uint8_t *p, #define NGTCP2_QLOG_PATH_RESPONSE_FRAME_OVERHEAD 56 p = write_verbatim(p, "{\"frame_type\":\"path_response\","); - p = write_pair_hex(p, "data", fr->data, sizeof(fr->data)); + p = write_pair_hex(p, "data", fr->data.data, sizeof(fr->data.data)); *p++ = '}'; return p; @@ -694,7 +661,7 @@ static void qlog_pkt_write_start(ngtcp2_qlog *qlog, int sent) { ngtcp2_buf_reset(&qlog->buf); p = qlog->buf.last; - *p++ = '\x1e'; + *p++ = '\x1E'; *p++ = '{'; p = qlog_write_time(qlog, p); p = write_verbatim(p, ",\"name\":"); @@ -738,7 +705,7 @@ static void qlog_pkt_write_end(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, p = write_verbatim(p, "],\"header\":"); p = write_pkt_hd(p, hd); p = write_verbatim(p, ",\"raw\":{\"length\":"); - p = write_number(p, pktlen); + p = ngtcp2_encode_uint(p, pktlen); p = write_verbatim(p, "}}}\n"); qlog->buf.last = p; @@ -754,7 +721,7 @@ void ngtcp2_qlog_write_frame(ngtcp2_qlog *qlog, const ngtcp2_frame *fr) { return; } - switch (fr->type) { + switch (fr->hd.type) { case NGTCP2_FRAME_PADDING: if (ngtcp2_buf_left(&qlog->buf) < NGTCP2_QLOG_PADDING_FRAME_OVERHEAD + 1) { return; @@ -771,7 +738,7 @@ void ngtcp2_qlog_write_frame(ngtcp2_qlog *qlog, const ngtcp2_frame *fr) { case NGTCP2_FRAME_ACK_ECN: if (ngtcp2_buf_left(&qlog->buf) < NGTCP2_QLOG_ACK_FRAME_BASE_OVERHEAD + - (size_t)(fr->type == NGTCP2_FRAME_ACK_ECN + (size_t)(fr->ack.type == NGTCP2_FRAME_ACK_ECN ? NGTCP2_QLOG_ACK_FRAME_ECN_OVERHEAD : 0) + NGTCP2_QLOG_ACK_FRAME_RANGE_OVERHEAD * (1 + fr->ack.rangecnt) + 1) { @@ -935,7 +902,7 @@ void ngtcp2_qlog_pkt_sent_end(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, void ngtcp2_qlog_parameters_set_transport_params( ngtcp2_qlog *qlog, const ngtcp2_transport_params *params, int server, ngtcp2_qlog_side side) { - uint8_t buf[1024]; + uint8_t buf[2048]; uint8_t *p = buf; const ngtcp2_preferred_addr *paddr; const ngtcp2_sockaddr_in *sa_in; @@ -945,7 +912,7 @@ void ngtcp2_qlog_parameters_set_transport_params( return; } - *p++ = '\x1e'; + *p++ = '\x1E'; *p++ = '{'; p = qlog_write_time(qlog, p); p = write_verbatim( @@ -1061,7 +1028,7 @@ void ngtcp2_qlog_metrics_updated(ngtcp2_qlog *qlog, return; } - *p++ = '\x1e'; + *p++ = '\x1E'; *p++ = '{'; p = qlog_write_time(qlog, p); p = write_verbatim(p, ",\"name\":\"recovery:metrics_updated\",\"data\":{"); @@ -1095,23 +1062,22 @@ void ngtcp2_qlog_metrics_updated(ngtcp2_qlog *qlog, void ngtcp2_qlog_pkt_lost(ngtcp2_qlog *qlog, ngtcp2_rtb_entry *ent) { uint8_t buf[256]; uint8_t *p = buf; - ngtcp2_pkt_hd hd = {0}; if (!qlog->write) { return; } - *p++ = '\x1e'; + *p++ = '\x1E'; *p++ = '{'; p = qlog_write_time(qlog, p); p = write_verbatim( p, ",\"name\":\"recovery:packet_lost\",\"data\":{\"header\":"); - hd.type = ent->hd.type; - hd.flags = ent->hd.flags; - hd.pkt_num = ent->hd.pkt_num; - - p = write_pkt_hd(p, &hd); + p = write_pkt_hd(p, &(ngtcp2_pkt_hd){ + .pkt_num = ent->hd.pkt_num, + .type = ent->hd.type, + .flags = ent->hd.flags, + }); p = write_verbatim(p, "}}\n"); qlog->write(qlog->user_data, NGTCP2_QLOG_WRITE_FLAG_NONE, buf, @@ -1129,7 +1095,7 @@ void ngtcp2_qlog_retry_pkt_received(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, ngtcp2_buf_init(&buf, rawbuf, sizeof(rawbuf)); - *buf.last++ = '\x1e'; + *buf.last++ = '\x1E'; *buf.last++ = '{'; buf.last = qlog_write_time(qlog, buf.last); buf.last = write_verbatim( @@ -1151,26 +1117,26 @@ void ngtcp2_qlog_retry_pkt_received(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, } void ngtcp2_qlog_stateless_reset_pkt_received( - ngtcp2_qlog *qlog, const ngtcp2_pkt_stateless_reset *sr) { + ngtcp2_qlog *qlog, const ngtcp2_pkt_stateless_reset2 *sr) { uint8_t buf[256]; uint8_t *p = buf; - ngtcp2_pkt_hd hd = {0}; + static const ngtcp2_pkt_hd hd = { + .type = NGTCP2_PKT_STATELESS_RESET, + }; if (!qlog->write) { return; } - hd.type = NGTCP2_PKT_STATELESS_RESET; - - *p++ = '\x1e'; + *p++ = '\x1E'; *p++ = '{'; p = qlog_write_time(qlog, p); p = write_verbatim( p, ",\"name\":\"transport:packet_received\",\"data\":{\"header\":"); p = write_pkt_hd(p, &hd); *p++ = ','; - p = write_pair_hex(p, "stateless_reset_token", sr->stateless_reset_token, - NGTCP2_STATELESS_RESET_TOKENLEN); + p = write_pair_hex(p, "stateless_reset_token", sr->token.data, + sizeof(sr->token.data)); p = write_verbatim(p, "}}\n"); qlog->write(qlog->user_data, NGTCP2_QLOG_WRITE_FLAG_NONE, buf, @@ -1192,7 +1158,7 @@ void ngtcp2_qlog_version_negotiation_pkt_received(ngtcp2_qlog *qlog, ngtcp2_buf_init(&buf, rawbuf, sizeof(rawbuf)); - *buf.last++ = '\x1e'; + *buf.last++ = '\x1E'; *buf.last++ = '{'; buf.last = qlog_write_time(qlog, buf.last); buf.last = write_verbatim( @@ -1201,8 +1167,8 @@ void ngtcp2_qlog_version_negotiation_pkt_received(ngtcp2_qlog *qlog, buf.last = write_verbatim(buf.last, ",\"supported_versions\":["); if (nsv) { - if (ngtcp2_buf_left(&buf) < - (sizeof("\"xxxxxxxx\",") - 1) * nsv - 1 + sizeof("]}}\n") - 1) { + if (ngtcp2_buf_left(&buf) < ngtcp2_strlen_lit("\"xxxxxxxx\",") * nsv - 1 + + ngtcp2_strlen_lit("]}}\n")) { return; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.h index d2a5f1038c0f..17668a50233f 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.h @@ -147,7 +147,7 @@ void ngtcp2_qlog_retry_pkt_received(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, * event for a received Stateless Reset packet. */ void ngtcp2_qlog_stateless_reset_pkt_received( - ngtcp2_qlog *qlog, const ngtcp2_pkt_stateless_reset *sr); + ngtcp2_qlog *qlog, const ngtcp2_pkt_stateless_reset2 *sr); /* * ngtcp2_qlog_version_negotiation_pkt_received writes packet_received diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.c index e89891532936..8cb43830fb3d 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.c @@ -26,18 +26,22 @@ #include "ngtcp2_macro.h" void ngtcp2_range_init(ngtcp2_range *r, uint64_t begin, uint64_t end) { - r->begin = begin; - r->end = end; + *r = (ngtcp2_range){ + .begin = begin, + .end = end, + }; } ngtcp2_range ngtcp2_range_intersect(const ngtcp2_range *a, const ngtcp2_range *b) { - ngtcp2_range r = {0}; - uint64_t begin = ngtcp2_max_uint64(a->begin, b->begin); - uint64_t end = ngtcp2_min_uint64(a->end, b->end); + ngtcp2_range r; + uint64_t begin = ngtcp2_max(a->begin, b->begin); + uint64_t end = ngtcp2_min(a->end, b->end); if (begin < end) { ngtcp2_range_init(&r, begin, end); + } else { + r = (ngtcp2_range){0}; } return r; @@ -52,10 +56,14 @@ int ngtcp2_range_eq(const ngtcp2_range *a, const ngtcp2_range *b) { void ngtcp2_range_cut(ngtcp2_range *left, ngtcp2_range *right, const ngtcp2_range *a, const ngtcp2_range *b) { /* Assume that b is included in a */ - left->begin = a->begin; - left->end = b->begin; - right->begin = b->end; - right->end = a->end; + *left = (ngtcp2_range){ + .begin = a->begin, + .end = b->begin, + }; + *right = (ngtcp2_range){ + .begin = b->end, + .end = a->end, + }; } int ngtcp2_range_not_after(const ngtcp2_range *a, const ngtcp2_range *b) { diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ratelim.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ratelim.c index efedc3daa760..d13ed9a14aa4 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ratelim.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ratelim.c @@ -41,7 +41,7 @@ void ngtcp2_ratelim_init(ngtcp2_ratelim *rlim, uint64_t burst, uint64_t rate, /* ratelim_update updates rlim->tokens with the current |ts|. */ static void ratelim_update(ngtcp2_ratelim *rlim, ngtcp2_tstamp ts) { - uint64_t d, gain; + uint64_t d, gain, gps; assert(ts >= rlim->ts); @@ -52,16 +52,23 @@ static void ratelim_update(ngtcp2_ratelim *rlim, ngtcp2_tstamp ts) { d = ts - rlim->ts; rlim->ts = ts; - gain = rlim->rate * d + rlim->carry; + if (rlim->rate > (UINT64_MAX - rlim->carry) / d) { + gain = UINT64_MAX; + } else { + gain = rlim->rate * d + rlim->carry; + } - rlim->tokens += gain / NGTCP2_SECONDS; + gps = gain / NGTCP2_SECONDS; - if (rlim->tokens < rlim->burst) { + if (gps < rlim->burst && rlim->tokens < rlim->burst - gps) { + rlim->tokens += gps; rlim->carry = gain % NGTCP2_SECONDS; - } else { - rlim->tokens = rlim->burst; - rlim->carry = 0; + + return; } + + rlim->tokens = rlim->burst; + rlim->carry = 0; } int ngtcp2_ratelim_drain(ngtcp2_ratelim *rlim, uint64_t n, ngtcp2_tstamp ts) { diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ratelim.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ratelim.h index 14485c562d4e..231f5d1b0182 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ratelim.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ratelim.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c index 353afca4d48f..40c25f2a3d1c 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c @@ -32,18 +32,8 @@ #include "ngtcp2_macro.h" #ifndef NDEBUG -static int ispow2(size_t n) { -# if defined(_MSC_VER) && !defined(__clang__) && \ - (defined(_M_ARM) || (defined(_M_ARM64) && _MSC_VER < 1941)) - return n && !(n & (n - 1)); -# elif defined(WIN32) - return 1 == __popcnt((unsigned int)n); -# else /* !((defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM) || \ - (defined(_M_ARM64) && _MSC_VER < 1941))) || defined(WIN32)) */ - return 1 == __builtin_popcount((unsigned int)n); -# endif /* !((defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM) || \ - (defined(_M_ARM64) && _MSC_VER < 1941))) || defined(WIN32)) */ -} +/* Power-of-two test; simple portable bit trick. */ +static int ispow2(size_t n) { return n && !(n & (n - 1)); } #endif /* !defined(NDEBUG) */ int ngtcp2_ringbuf_init(ngtcp2_ringbuf *rb, size_t nmemb, size_t size, diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.c index ef1938ea6326..56b0d81fc13a 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.c @@ -29,56 +29,32 @@ #include "ngtcp2_macro.h" -int ngtcp2_rob_gap_new(ngtcp2_rob_gap **pg, uint64_t begin, uint64_t end, - const ngtcp2_mem *mem) { - *pg = ngtcp2_mem_malloc(mem, sizeof(ngtcp2_rob_gap)); - if (*pg == NULL) { - return NGTCP2_ERR_NOMEM; - } - - (*pg)->range.begin = begin; - (*pg)->range.end = end; - - return 0; -} - -void ngtcp2_rob_gap_del(ngtcp2_rob_gap *g, const ngtcp2_mem *mem) { - ngtcp2_mem_free(mem, g); -} - -int ngtcp2_rob_data_new(ngtcp2_rob_data **pd, uint64_t offset, size_t chunk, - const ngtcp2_mem *mem) { - *pd = ngtcp2_mem_malloc(mem, sizeof(ngtcp2_rob_data) + chunk); +static int rob_data_new(uint8_t **pd, size_t chunk, const ngtcp2_mem *mem) { + *pd = ngtcp2_mem_malloc(mem, chunk); if (*pd == NULL) { return NGTCP2_ERR_NOMEM; } - (*pd)->range.begin = offset; - (*pd)->range.end = offset + chunk; - (*pd)->begin = (uint8_t *)(*pd) + sizeof(ngtcp2_rob_data); - return 0; } -void ngtcp2_rob_data_del(ngtcp2_rob_data *d, const ngtcp2_mem *mem) { +static void rob_data_del(uint8_t *d, const ngtcp2_mem *mem) { ngtcp2_mem_free(mem, d); } int ngtcp2_rob_init(ngtcp2_rob *rob, size_t chunk, const ngtcp2_mem *mem) { int rv; - ngtcp2_rob_gap *g; + static const ngtcp2_range g = { + .end = UINT64_MAX, + }; ngtcp2_ksl_init(&rob->gapksl, ngtcp2_ksl_range_compar, ngtcp2_ksl_range_search, sizeof(ngtcp2_range), mem); - rv = ngtcp2_rob_gap_new(&g, 0, UINT64_MAX, mem); - if (rv != 0) { - goto fail_rob_gap_new; - } - - rv = ngtcp2_ksl_insert(&rob->gapksl, NULL, &g->range, g); + rv = ngtcp2_ksl_insert(&rob->gapksl, NULL, &g, NULL); if (rv != 0) { - goto fail_gapksl_ksl_insert; + ngtcp2_ksl_free(&rob->gapksl); + return rv; } ngtcp2_ksl_init(&rob->dataksl, ngtcp2_ksl_range_compar, @@ -86,14 +62,9 @@ int ngtcp2_rob_init(ngtcp2_rob *rob, size_t chunk, const ngtcp2_mem *mem) { rob->chunk = chunk; rob->mem = mem; + rob->discard_data = 0; return 0; - -fail_gapksl_ksl_insert: - ngtcp2_rob_gap_del(g, mem); -fail_rob_gap_new: - ngtcp2_ksl_free(&rob->gapksl); - return rv; } void ngtcp2_rob_free(ngtcp2_rob *rob) { @@ -105,12 +76,7 @@ void ngtcp2_rob_free(ngtcp2_rob *rob) { for (it = ngtcp2_ksl_begin(&rob->dataksl); !ngtcp2_ksl_it_end(&it); ngtcp2_ksl_it_next(&it)) { - ngtcp2_rob_data_del(ngtcp2_ksl_it_get(&it), rob->mem); - } - - for (it = ngtcp2_ksl_begin(&rob->gapksl); !ngtcp2_ksl_it_end(&it); - ngtcp2_ksl_it_next(&it)) { - ngtcp2_rob_gap_del(ngtcp2_ksl_it_get(&it), rob->mem); + rob_data_del(ngtcp2_ksl_it_get(&it), rob->mem); } ngtcp2_ksl_free(&rob->dataksl); @@ -121,12 +87,18 @@ static int rob_write_data(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, size_t len) { size_t n; int rv; - ngtcp2_rob_data *d; + uint8_t *d; ngtcp2_range range = { .begin = offset, .end = offset + len, }; ngtcp2_ksl_it it; + const ngtcp2_range *r; + uint64_t chunk_offset; + + if (rob->discard_data) { + return 0; + } for (it = ngtcp2_ksl_lower_bound_search(&rob->dataksl, &range, ngtcp2_ksl_range_exclusive_search); @@ -134,26 +106,34 @@ static int rob_write_data(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, if (ngtcp2_ksl_it_end(&it)) { d = NULL; } else { + r = ngtcp2_ksl_it_key(&it); d = ngtcp2_ksl_it_get(&it); } - if (d == NULL || offset < d->range.begin) { - rv = ngtcp2_rob_data_new(&d, (offset / rob->chunk) * rob->chunk, - rob->chunk, rob->mem); + if (d == NULL || offset < r->begin) { + rv = rob_data_new(&d, rob->chunk, rob->mem); if (rv != 0) { return rv; } - rv = ngtcp2_ksl_insert(&rob->dataksl, &it, &d->range, d); + chunk_offset = (offset / rob->chunk) * rob->chunk; + + rv = ngtcp2_ksl_insert(&rob->dataksl, &it, + &(ngtcp2_range){ + .begin = chunk_offset, + .end = chunk_offset + rob->chunk, + }, + d); if (rv != 0) { - ngtcp2_rob_data_del(d, rob->mem); + rob_data_del(d, rob->mem); return rv; } + + r = ngtcp2_ksl_it_key(&it); } - n = (size_t)ngtcp2_min_uint64((uint64_t)len, - d->range.begin + rob->chunk - offset); - memcpy(d->begin + (offset - d->range.begin), data, n); + n = (size_t)ngtcp2_min((uint64_t)len, r->end - offset); + memcpy(d + (offset - r->begin), data, n); offset += n; data += n; len -= n; @@ -165,7 +145,7 @@ static int rob_write_data(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, ngtcp2_ssize ngtcp2_rob_push(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, size_t datalen) { int rv; - ngtcp2_rob_gap *g; + ngtcp2_range g; ngtcp2_range m, l, r; ngtcp2_range q = { .begin = offset, @@ -179,18 +159,16 @@ ngtcp2_ssize ngtcp2_rob_push(ngtcp2_rob *rob, uint64_t offset, ngtcp2_ksl_range_exclusive_search); for (; !ngtcp2_ksl_it_end(&it);) { - g = ngtcp2_ksl_it_get(&it); - - m = ngtcp2_range_intersect(&q, &g->range); + g = *(const ngtcp2_range *)ngtcp2_ksl_it_key(&it); + m = ngtcp2_range_intersect(&q, &g); mlen = (size_t)ngtcp2_range_len(&m); if (mlen == 0) { break; } - if (ngtcp2_range_eq(&g->range, &m)) { - ngtcp2_ksl_remove_hint(&rob->gapksl, &it, &it, &g->range); - ngtcp2_rob_gap_del(g, rob->mem); + if (ngtcp2_range_eq(&g, &m)) { + ngtcp2_ksl_remove_hint(&rob->gapksl, &it, &it, &g); rv = rob_write_data(rob, m.begin, data + (m.begin - offset), mlen); if (rv != 0) { @@ -202,29 +180,19 @@ ngtcp2_ssize ngtcp2_rob_push(ngtcp2_rob *rob, uint64_t offset, continue; } - ngtcp2_range_cut(&l, &r, &g->range, &m); + ngtcp2_range_cut(&l, &r, &g, &m); if (ngtcp2_range_len(&l)) { - ngtcp2_ksl_update_key(&rob->gapksl, &g->range, &l); - g->range = l; + ngtcp2_ksl_update_key(&rob->gapksl, &g, &l); if (ngtcp2_range_len(&r)) { - ngtcp2_rob_gap *ng; - - rv = ngtcp2_rob_gap_new(&ng, r.begin, r.end, rob->mem); + rv = ngtcp2_ksl_insert(&rob->gapksl, &it, &r, NULL); if (rv != 0) { return rv; } - - rv = ngtcp2_ksl_insert(&rob->gapksl, &it, &ng->range, ng); - if (rv != 0) { - ngtcp2_rob_gap_del(ng, rob->mem); - return rv; - } } } else if (ngtcp2_range_len(&r)) { - ngtcp2_ksl_update_key(&rob->gapksl, &g->range, &r); - g->range = r; + ngtcp2_ksl_update_key(&rob->gapksl, &g, &r); } rv = rob_write_data(rob, m.begin, data + (m.begin - offset), mlen); @@ -241,48 +209,56 @@ ngtcp2_ssize ngtcp2_rob_push(ngtcp2_rob *rob, uint64_t offset, } void ngtcp2_rob_remove_prefix(ngtcp2_rob *rob, uint64_t offset) { - ngtcp2_rob_gap *g; - ngtcp2_rob_data *d; + ngtcp2_range g; + ngtcp2_range r; + uint8_t *d; ngtcp2_ksl_it it; it = ngtcp2_ksl_begin(&rob->gapksl); for (; !ngtcp2_ksl_it_end(&it);) { - g = ngtcp2_ksl_it_get(&it); - if (offset <= g->range.begin) { + g = *(const ngtcp2_range *)ngtcp2_ksl_it_key(&it); + if (offset <= g.begin) { break; } - if (offset < g->range.end) { - ngtcp2_range r = {offset, g->range.end}; - - ngtcp2_ksl_update_key(&rob->gapksl, &g->range, &r); - g->range.begin = offset; + if (offset < g.end) { + ngtcp2_ksl_update_key(&rob->gapksl, &g, + &(ngtcp2_range){ + .begin = offset, + .end = g.end, + }); break; } - ngtcp2_ksl_remove_hint(&rob->gapksl, &it, &it, &g->range); - ngtcp2_rob_gap_del(g, rob->mem); + ngtcp2_ksl_remove_hint(&rob->gapksl, &it, &it, &g); + } + + if (rob->discard_data) { + return; } it = ngtcp2_ksl_begin(&rob->dataksl); for (; !ngtcp2_ksl_it_end(&it);) { - d = ngtcp2_ksl_it_get(&it); - if (offset < d->range.begin + rob->chunk) { + r = *(const ngtcp2_range *)ngtcp2_ksl_it_key(&it); + if (offset < r.end) { return; } - ngtcp2_ksl_remove_hint(&rob->dataksl, &it, &it, &d->range); - ngtcp2_rob_data_del(d, rob->mem); + d = ngtcp2_ksl_it_get(&it); + + ngtcp2_ksl_remove_hint(&rob->dataksl, &it, &it, &r); + rob_data_del(d, rob->mem); } } -size_t ngtcp2_rob_data_at(const ngtcp2_rob *rob, const uint8_t **pdest, - uint64_t offset) { - ngtcp2_rob_gap *g; - ngtcp2_rob_data *d; +uint64_t ngtcp2_rob_data_at(const ngtcp2_rob *rob, const uint8_t **pdest, + uint64_t offset) { + const ngtcp2_range *g; + const ngtcp2_range *r; + uint8_t *d; ngtcp2_ksl_it it; it = ngtcp2_ksl_begin(&rob->gapksl); @@ -290,56 +266,80 @@ size_t ngtcp2_rob_data_at(const ngtcp2_rob *rob, const uint8_t **pdest, return 0; } - g = ngtcp2_ksl_it_get(&it); + g = ngtcp2_ksl_it_key(&it); - if (g->range.begin <= offset) { + if (g->begin <= offset) { return 0; } + if (rob->discard_data) { + *pdest = NULL; + + return g->begin - offset; + } + it = ngtcp2_ksl_begin(&rob->dataksl); + r = ngtcp2_ksl_it_key(&it); d = ngtcp2_ksl_it_get(&it); assert(d); - assert(d->range.begin <= offset); - assert(offset < d->range.begin + rob->chunk); + assert(r->begin <= offset); + assert(offset < r->end); - *pdest = d->begin + (offset - d->range.begin); + *pdest = d + (offset - r->begin); - return ( - size_t)(ngtcp2_min_uint64(g->range.begin, d->range.begin + rob->chunk) - - offset); + return ngtcp2_min(g->begin, r->end) - offset; } -void ngtcp2_rob_pop(ngtcp2_rob *rob, uint64_t offset, size_t len) { +void ngtcp2_rob_pop(ngtcp2_rob *rob, uint64_t offset, uint64_t len) { ngtcp2_ksl_it it; - ngtcp2_rob_data *d; + ngtcp2_range r; + uint8_t *d; + + if (rob->discard_data) { + return; + } it = ngtcp2_ksl_begin(&rob->dataksl); + r = *(const ngtcp2_range *)ngtcp2_ksl_it_key(&it); d = ngtcp2_ksl_it_get(&it); assert(d); - if (offset + len < d->range.begin + rob->chunk) { + if (offset + len < r.end) { return; } - ngtcp2_ksl_remove_hint(&rob->dataksl, NULL, &it, &d->range); - ngtcp2_rob_data_del(d, rob->mem); + ngtcp2_ksl_remove_hint(&rob->dataksl, NULL, &it, &r); + rob_data_del(d, rob->mem); } uint64_t ngtcp2_rob_first_gap_offset(const ngtcp2_rob *rob) { ngtcp2_ksl_it it = ngtcp2_ksl_begin(&rob->gapksl); - ngtcp2_rob_gap *g; + const ngtcp2_range *g; if (ngtcp2_ksl_it_end(&it)) { return UINT64_MAX; } - g = ngtcp2_ksl_it_get(&it); + g = ngtcp2_ksl_it_key(&it); - return g->range.begin; + return g->begin; } int ngtcp2_rob_data_buffered(const ngtcp2_rob *rob) { return ngtcp2_ksl_len(&rob->dataksl) != 0; } + +void ngtcp2_rob_discard_data(ngtcp2_rob *rob) { + ngtcp2_ksl_it it; + + rob->discard_data = 1; + + for (it = ngtcp2_ksl_begin(&rob->dataksl); !ngtcp2_ksl_it_end(&it); + ngtcp2_ksl_it_next(&it)) { + rob_data_del(ngtcp2_ksl_it_get(&it), rob->mem); + } + + ngtcp2_ksl_clear(&rob->dataksl); +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.h index 60a1c5b46a0d..6b616ea9b81a 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.h @@ -35,71 +35,6 @@ #include "ngtcp2_range.h" #include "ngtcp2_ksl.h" -/* - * ngtcp2_rob_gap represents the gap, which is the range of stream - * data that is not received yet. - */ -typedef struct ngtcp2_rob_gap { - /* range is the range of this gap. */ - ngtcp2_range range; -} ngtcp2_rob_gap; - -/* - * ngtcp2_rob_gap_new allocates new ngtcp2_rob_gap object, and assigns - * its pointer to |*pg|. The caller should call ngtcp2_rob_gap_del to - * delete it when it is no longer used. The range of the gap is - * [begin, end). |mem| is custom memory allocator to allocate memory. - * - * This function returns 0 if it succeeds, or one of the following - * negative error codes: - * - * NGTCP2_ERR_NOMEM - * Out of memory. - */ -int ngtcp2_rob_gap_new(ngtcp2_rob_gap **pg, uint64_t begin, uint64_t end, - const ngtcp2_mem *mem); - -/* - * ngtcp2_rob_gap_del deallocates |g|. It deallocates the memory - * pointed by |g| it self. |mem| is custom memory allocator to - * deallocate memory. - */ -void ngtcp2_rob_gap_del(ngtcp2_rob_gap *g, const ngtcp2_mem *mem); - -/* - * ngtcp2_rob_data holds the buffered stream data. - */ -typedef struct ngtcp2_rob_data { - /* range is the range of this data. */ - ngtcp2_range range; - /* begin points to the buffer. */ - uint8_t *begin; -} ngtcp2_rob_data; - -/* - * ngtcp2_rob_data_new allocates new ngtcp2_rob_data object, and - * assigns its pointer to |*pd|. The caller should call - * ngtcp2_rob_data_del to delete it when it is no longer used. - * |offset| is the stream offset of the first byte of this data. - * |chunk| is the size of the buffer. |offset| must be multiple of - * |chunk|. |mem| is custom memory allocator to allocate memory. - * - * This function returns 0 if it succeeds, or one of the following - * negative error codes: - * - * NGTCP2_ERR_NOMEM - * Out of memory. - */ -int ngtcp2_rob_data_new(ngtcp2_rob_data **pd, uint64_t offset, size_t chunk, - const ngtcp2_mem *mem); - -/* - * ngtcp2_rob_data_del deallocates |d|. It deallocates the memory - * pointed by |d| itself. |mem| is custom memory allocator to - * deallocate memory. - */ -void ngtcp2_rob_data_del(ngtcp2_rob_data *d, const ngtcp2_mem *mem); - /* * ngtcp2_rob is the reorder buffer which reassembles stream data * received in out of order. @@ -115,6 +50,9 @@ typedef struct ngtcp2_rob { const ngtcp2_mem *mem; /* chunk is the size of each buffer in data field */ size_t chunk; + /* discard_data, if nonzero, stops buffering data. If it is + nonzero, ngtcp2_ksl_empty(&dataksl) always returns nonzero. */ + int discard_data; } ngtcp2_rob; /* @@ -138,6 +76,10 @@ void ngtcp2_rob_free(ngtcp2_rob *rob); * ngtcp2_rob_push adds new data pointed by |data| of length |datalen| * at the stream offset |offset|. * + * If ngtcp2_rob_discard_data is called, this function does not buffer + * data. The return value is the number of bytes that would be + * buffered if ngtcp2_rob_discard_data has not been called. + * * This function returns the number of data newly buffered if it * succeeds, or one of the following negative error codes: * @@ -160,9 +102,11 @@ void ngtcp2_rob_remove_prefix(ngtcp2_rob *rob, uint64_t offset); * valid length of available data. If no data is available, it * returns 0. This function only returns the data before the first * gap. It returns 0 even if data is available after the first gap. + * If ngtcp2_rob_discard_data has been called, NULL is assigned to + * |*pdest| if this function returns nonzero. */ -size_t ngtcp2_rob_data_at(const ngtcp2_rob *rob, const uint8_t **pdest, - uint64_t offset); +uint64_t ngtcp2_rob_data_at(const ngtcp2_rob *rob, const uint8_t **pdest, + uint64_t offset); /* * ngtcp2_rob_pop clears data at stream offset |offset| of length @@ -174,8 +118,10 @@ size_t ngtcp2_rob_data_at(const ngtcp2_rob *rob, const uint8_t **pdest, * * Caller should call this function from offset 0 in non-decreasing * order. + * + * ngtcp2_rob_pop is noop if ngtcp2_rob_discard_data has been called. */ -void ngtcp2_rob_pop(ngtcp2_rob *rob, uint64_t offset, size_t len); +void ngtcp2_rob_pop(ngtcp2_rob *rob, uint64_t offset, uint64_t len); /* * ngtcp2_rob_first_gap_offset returns the offset to the first gap. @@ -188,4 +134,10 @@ uint64_t ngtcp2_rob_first_gap_offset(const ngtcp2_rob *rob); */ int ngtcp2_rob_data_buffered(const ngtcp2_rob *rob); +/* + * ngtcp2_rob_discard_data discards the buffered data, and stops + * buffering data any further. + */ +void ngtcp2_rob_discard_data(ngtcp2_rob *rob); + #endif /* !defined(NGTCP2_ROB_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.c index 6f44c8ac8de6..7792ebe41ba6 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.c @@ -32,20 +32,15 @@ #include "ngtcp2_conn_stat.h" void ngtcp2_rs_init(ngtcp2_rs *rs) { - rs->interval = UINT64_MAX; - rs->delivered = 0; - rs->prior_delivered = 0; - rs->prior_ts = UINT64_MAX; - rs->tx_in_flight = 0; - rs->lost = 0; - rs->send_elapsed = 0; - rs->ack_elapsed = 0; - rs->last_end_seq = -1; - rs->is_app_limited = 0; + *rs = (ngtcp2_rs){ + .interval = UINT64_MAX, + .prior_ts = UINT64_MAX, + .last_acked_pkt_id = -1, + }; } void ngtcp2_rst_init(ngtcp2_rst *rst) { - rst->last_seq = -1; + rst->pkt_id = -1; ngtcp2_rst_reset(rst); } @@ -59,18 +54,29 @@ void ngtcp2_rst_reset(ngtcp2_rst *rst) { rst->lost = 0; } +void ngtcp2_rst_reset_rate_sample(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat) { + ngtcp2_rs *rs = &rst->rs; + + rs->interval = UINT64_MAX; + rs->prior_ts = UINT64_MAX; + + cstat->delivery_rate_sec = 0; +} + void ngtcp2_rst_on_pkt_sent(ngtcp2_rst *rst, ngtcp2_rtb_entry *ent, const ngtcp2_conn_stat *cstat) { - if (cstat->bytes_in_flight == 0) { + /* cstat->bytes_in_flight includes ent->pktlen. If they are the + same, there is no in-flight packets. */ + if (cstat->bytes_in_flight == ent->pktlen) { rst->first_sent_ts = rst->delivered_ts = ent->ts; } ent->rst.first_sent_ts = rst->first_sent_ts; ent->rst.delivered_ts = rst->delivered_ts; ent->rst.delivered = rst->delivered; ent->rst.is_app_limited = rst->app_limited != 0; - ent->rst.tx_in_flight = cstat->bytes_in_flight + ent->pktlen; + ent->rst.tx_in_flight = cstat->bytes_in_flight; ent->rst.lost = rst->lost; - ent->rst.end_seq = ++rst->last_seq; + ent->rst.pkt_id = ++rst->pkt_id; } void ngtcp2_rst_on_ack_recv(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat) { @@ -84,12 +90,11 @@ void ngtcp2_rst_on_ack_recv(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat) { return; } - rs->interval = ngtcp2_max_uint64(rs->send_elapsed, rs->ack_elapsed); + rs->interval = ngtcp2_max(rs->send_elapsed, rs->ack_elapsed); rs->delivered = rst->delivered - rs->prior_delivered; if (rs->interval < cstat->min_rtt) { - rs->interval = UINT64_MAX; return; } @@ -101,7 +106,7 @@ void ngtcp2_rst_on_ack_recv(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat) { } static int is_newest_pkt(const ngtcp2_rtb_entry *ent, const ngtcp2_rs *rs) { - return ent->rst.end_seq > rs->last_end_seq; + return ent->rst.pkt_id > rs->last_acked_pkt_id; } void ngtcp2_rst_update_rate_sample(ngtcp2_rst *rst, const ngtcp2_rtb_entry *ent, @@ -117,7 +122,7 @@ void ngtcp2_rst_update_rate_sample(ngtcp2_rst *rst, const ngtcp2_rtb_entry *ent, rs->is_app_limited = ent->rst.is_app_limited; rs->send_elapsed = ent->ts - ent->rst.first_sent_ts; rs->ack_elapsed = rst->delivered_ts - ent->rst.delivered_ts; - rs->last_end_seq = ent->rst.end_seq; + rs->last_acked_pkt_id = ent->rst.pkt_id; rst->first_sent_ts = ent->ts; } } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.h index 1bb624de79b5..4ae71aa6daa6 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.h @@ -31,8 +31,6 @@ #include -#include "ngtcp2_window_filter.h" - typedef struct ngtcp2_rtb_entry ngtcp2_rtb_entry; typedef struct ngtcp2_conn_stat ngtcp2_conn_stat; @@ -50,7 +48,7 @@ typedef struct ngtcp2_rs { uint64_t lost; ngtcp2_duration send_elapsed; ngtcp2_duration ack_elapsed; - int64_t last_end_seq; + int64_t last_acked_pkt_id; int is_app_limited; } ngtcp2_rs; @@ -67,11 +65,11 @@ typedef struct ngtcp2_rst { ngtcp2_tstamp first_sent_ts; uint64_t app_limited; uint64_t lost; - /* last_seq is the sequence number of packets across all packet - number spaces. If we would adopt single packet number sequence - across all packet number spaces, we can replace this with a - packet number. */ - int64_t last_seq; + /* pkt_id is the identifier of packets across all packet number + spaces. If we would adopt single packet number sequence across + all packet number spaces, we can replace this with a packet + number. */ + int64_t pkt_id; int is_cwnd_limited; } ngtcp2_rst; @@ -79,6 +77,8 @@ void ngtcp2_rst_init(ngtcp2_rst *rst); void ngtcp2_rst_reset(ngtcp2_rst *rst); +void ngtcp2_rst_reset_rate_sample(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat); + void ngtcp2_rst_on_pkt_sent(ngtcp2_rst *rst, ngtcp2_rtb_entry *ent, const ngtcp2_conn_stat *cstat); void ngtcp2_rst_on_ack_recv(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.c index 7df1c197db79..e8d05a3feadc 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.c @@ -128,13 +128,12 @@ void ngtcp2_rtb_free(ngtcp2_rtb *rtb) { static void rtb_on_add(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, ngtcp2_conn_stat *cstat) { - ngtcp2_rst_on_pkt_sent(rtb->rst, ent, cstat); - assert(rtb->cc_pkt_num <= ent->hd.pkt_num); cstat->bytes_in_flight += ent->pktlen; rtb->cc_bytes_in_flight += ent->pktlen; + ngtcp2_rst_on_pkt_sent(rtb->rst, ent, cstat); ngtcp2_rst_update_app_limited(rtb->rst, cstat); if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) { @@ -201,10 +200,10 @@ static size_t rtb_on_remove(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, } /* NGTCP2_RECLAIM_FLAG_NONE indicates that no flag is set. */ -#define NGTCP2_RECLAIM_FLAG_NONE 0x00u +#define NGTCP2_RECLAIM_FLAG_NONE 0x00U /* NGTCP2_RECLAIM_FLAG_ON_LOSS indicates that frames are reclaimed because of the packet loss.*/ -#define NGTCP2_RECLAIM_FLAG_ON_LOSS 0x01u +#define NGTCP2_RECLAIM_FLAG_ON_LOSS 0x01U /* * rtb_reclaim_frame copies and queues frames included in |ent| for @@ -234,7 +233,7 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, continue; } - switch (frc->fr.type) { + switch (frc->fr.hd.type) { case NGTCP2_FRAME_STREAM: strm = ngtcp2_conn_find_stream(conn, fr->stream.stream_id); if (strm == NULL || (strm->flags & NGTCP2_STRM_FLAG_RESET_STREAM)) { @@ -272,7 +271,12 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, return rv; } - nfrc->fr = *fr; + nfrc->fr.stream.type = fr->stream.type; + nfrc->fr.stream.flags = fr->stream.flags; + nfrc->fr.stream.fin = fr->stream.fin; + nfrc->fr.stream.stream_id = fr->stream.stream_id; + nfrc->fr.stream.offset = fr->stream.offset; + nfrc->fr.stream.datacnt = fr->stream.datacnt; ngtcp2_vec_copy(nfrc->fr.stream.data, fr->stream.data, fr->stream.datacnt); @@ -315,7 +319,12 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, return rv; } - nfrc->fr = *fr; + nfrc->fr.stream.type = fr->stream.type; + nfrc->fr.stream.flags = 0; + nfrc->fr.stream.fin = 0; + nfrc->fr.stream.stream_id = 0; + nfrc->fr.stream.offset = fr->stream.offset; + nfrc->fr.stream.datacnt = fr->stream.datacnt; ngtcp2_vec_copy(nfrc->fr.stream.data, fr->stream.data, fr->stream.datacnt); @@ -416,7 +425,7 @@ static int conn_process_lost_datagram(ngtcp2_conn *conn, int rv; for (frc = ent->frc; frc; frc = frc->next) { - switch (frc->fr.type) { + switch (frc->fr.hd.type) { case NGTCP2_FRAME_DATAGRAM: case NGTCP2_FRAME_DATAGRAM_LEN: assert(conn->callbacks.lost_datagram); @@ -454,23 +463,27 @@ static int rtb_on_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, if (ent->flags & (NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE | NGTCP2_RTB_ENTRY_FLAG_SKIP)) { ++rtb->num_lost_ignore_pkts; - } else if (ent->hd.pkt_num >= rtb->cc_pkt_num) { - rtb->rst->lost += ent->pktlen; - - if (rtb->cc->on_pkt_lost) { - cc->on_pkt_lost(cc, cstat, - ngtcp2_cc_pkt_init(&pkt, ent->hd.pkt_num, ent->pktlen, - pktns->id, ent->ts, ent->rst.lost, - ent->rst.tx_in_flight, - ent->rst.is_app_limited), - ts); + } else { + ++cstat->pkt_lost; + cstat->bytes_lost += ent->pktlen; + + if (ent->hd.pkt_num >= rtb->cc_pkt_num) { + rtb->rst->lost += ent->pktlen; + + if (rtb->cc->on_pkt_lost) { + cc->on_pkt_lost(cc, cstat, + ngtcp2_cc_pkt_init(&pkt, ent->hd.pkt_num, ent->pktlen, + pktns->id, ent->ts, ent->rst.lost, + ent->rst.tx_in_flight, + ent->rst.is_app_limited), + ts); + } } } if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_PTO_RECLAIMED) { - ngtcp2_log_info(rtb->log, NGTCP2_LOG_EVENT_LDC, - "pkn=%" PRId64 " has already been reclaimed on PTO", - ent->hd.pkt_num); + ngtcp2_log_infof(rtb->log, NGTCP2_LOG_EVENT_LDC, "pkn=", ent->hd.pkt_num, + " has already been reclaimed on PTO"); assert(!(ent->flags & NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED)); assert(UINT64_MAX == ent->lost_ts); } else { @@ -527,9 +540,10 @@ static void rtb_remove(ngtcp2_rtb *rtb, ngtcp2_ksl_it *it, int rv; (void)rv; + rtb_on_remove(rtb, ent, cstat); + rv = ngtcp2_ksl_remove_hint(&rtb->ents, it, it, &ent->hd.pkt_num); assert(0 == rv); - rtb_on_remove(rtb, ent, cstat); assert(ent->next == NULL); @@ -581,7 +595,7 @@ static int process_acked_pkt(ngtcp2_rtb_entry *ent, ngtcp2_conn *conn, if (conn->dcid.current.max_udp_payload_size < ent->pktlen) { conn->dcid.current.max_udp_payload_size = ent->pktlen; conn->cstat.max_tx_udp_payload_size = - ngtcp2_conn_get_path_max_tx_udp_payload_size(conn); + ngtcp2_conn_get_path_max_tx_udp_payload_size2(conn); } if (ngtcp2_pmtud_finished(conn->pmtud)) { @@ -598,7 +612,7 @@ static int process_acked_pkt(ngtcp2_rtb_entry *ent, ngtcp2_conn *conn, frc->binder->flags |= NGTCP2_FRAME_CHAIN_BINDER_FLAG_ACK; } - switch (frc->fr.type) { + switch (frc->fr.hd.type) { case NGTCP2_FRAME_STREAM: strm = ngtcp2_conn_find_stream(conn, frc->fr.stream.stream_id); if (strm == NULL) { @@ -733,8 +747,7 @@ static void rtb_on_pkt_acked(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, static void conn_verify_ecn(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, const ngtcp2_ack *fr, size_t ecn_acked, - ngtcp2_tstamp largest_pkt_sent_ts, - ngtcp2_tstamp ts) { + const ngtcp2_cc_ack *cc_ack, ngtcp2_tstamp ts) { if (conn->tx.ecn.state == NGTCP2_ECN_STATE_FAILED) { return; } @@ -761,9 +774,9 @@ static void conn_verify_ecn(ngtcp2_conn *conn, ngtcp2_pktns *pktns, } if (fr->type == NGTCP2_FRAME_ACK_ECN) { - if (cc->congestion_event && largest_pkt_sent_ts != UINT64_MAX && + if (cc->congestion_event && cc_ack->largest_pkt_sent_ts != UINT64_MAX && fr->ecn.ce > pktns->acktr.ecn.ack.ce) { - cc->congestion_event(cc, cstat, largest_pkt_sent_ts, 0, ts); + cc->congestion_event(cc, cstat, cc_ack->largest_pkt_sent_ts, cc_ack, ts); } pktns->acktr.ecn.ack.ect0 = fr->ecn.ect0; @@ -772,7 +785,7 @@ static void conn_verify_ecn(ngtcp2_conn *conn, ngtcp2_pktns *pktns, } } -static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, +static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, ngtcp2_cc_ack *cc_ack, ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); @@ -786,19 +799,18 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, int rv; ngtcp2_ksl_it it; size_t num_acked = 0; - ngtcp2_tstamp largest_pkt_sent_ts = UINT64_MAX; int64_t pkt_num; ngtcp2_cc *cc = rtb->cc; ngtcp2_rtb_entry *acked_ent = NULL; int ack_eliciting_pkt_acked = 0; size_t ecn_acked = 0; int verify_ecn = 0; - ngtcp2_cc_ack cc_ack = {0}; + ngtcp2_cc_ack cc_ack = { + .largest_pkt_sent_ts = UINT64_MAX, + .rtt = UINT64_MAX, + }; size_t num_lost_pkts = rtb->num_lost_pkts - rtb->num_lost_ignore_pkts; - cc_ack.prior_bytes_in_flight = cstat->bytes_in_flight; - cc_ack.rtt = UINT64_MAX; - if (conn && (conn->flags & NGTCP2_CONN_FLAG_KEY_UPDATE_NOT_CONFIRMED) && (conn->flags & NGTCP2_CONN_FLAG_KEY_UPDATE_INITIATOR) && largest_ack >= conn->pktns.crypto.tx.ckm->pkt_num) { @@ -814,12 +826,17 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, verify_ecn = 1; } + ngtcp2_rst_reset_rate_sample(rtb->rst, cstat); + /* Assume that ngtcp2_pkt_validate_ack(fr) returns 0 */ it = ngtcp2_ksl_lower_bound(&rtb->ents, &largest_ack); if (ngtcp2_ksl_it_end(&it)) { if (conn && verify_ecn) { - conn_verify_ecn(conn, pktns, rtb->cc, cstat, fr, ecn_acked, - largest_pkt_sent_ts, ts); + conn_verify_ecn(conn, pktns, rtb->cc, cstat, fr, ecn_acked, &cc_ack, ts); + } + + if (cc->on_ack_recv) { + cc->on_ack_recv(cc, cstat, &cc_ack, ts); } return 0; @@ -843,8 +860,8 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, goto fail; } - if (largest_ack == pkt_num) { - largest_pkt_sent_ts = ent->ts; + if (rtb->largest_acked_tx_pkt_num == pkt_num) { + cc_ack.largest_pkt_sent_ts = ent->ts; } if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) { @@ -884,15 +901,11 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, } } - if (largest_pkt_sent_ts != UINT64_MAX && ack_eliciting_pkt_acked) { + if (cc_ack.largest_pkt_sent_ts != UINT64_MAX && ack_eliciting_pkt_acked) { cc_ack.rtt = - ngtcp2_max_uint64(pkt_ts - largest_pkt_sent_ts, NGTCP2_NANOSECONDS); + ngtcp2_max(pkt_ts - cc_ack.largest_pkt_sent_ts, NGTCP2_NANOSECONDS); - rv = ngtcp2_conn_update_rtt(conn, cc_ack.rtt, fr->ack_delay_unscaled, ts); - if (rv == 0 && cc->new_rtt_sample && - rtb->largest_acked_tx_pkt_num >= rtb->cc_pkt_num) { - cc->new_rtt_sample(cc, cstat, ts); - } + ngtcp2_conn_update_rtt(conn, cc_ack.rtt, fr->ack_delay_unscaled, ts); } if (conn) { @@ -922,11 +935,6 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, ngtcp2_rtb_entry_objalloc_del(ent, rtb->rtb_entry_objalloc, rtb->frc_objalloc, rtb->mem); } - - if (verify_ecn) { - conn_verify_ecn(conn, pktns, rtb->cc, cstat, fr, ecn_acked, - largest_pkt_sent_ts, ts); - } } else { /* For unit tests */ for (ent = acked_ent; ent; ent = acked_ent) { @@ -947,15 +955,18 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, ngtcp2_rst_on_ack_recv(rtb->rst, cstat); if (conn) { - rv = rtb_detect_lost_pkt(rtb, &cc_ack.bytes_lost, conn, pktns, cstat, ts); + rv = rtb_detect_lost_pkt(rtb, &cc_ack, conn, pktns, cstat, ts); if (rv != 0) { return rv; } } } - cc_ack.largest_pkt_sent_ts = largest_pkt_sent_ts; - if (num_acked && cc->on_ack_recv) { + if (conn && verify_ecn) { + conn_verify_ecn(conn, pktns, rtb->cc, cstat, fr, ecn_acked, &cc_ack, ts); + } + + if (cc->on_ack_recv) { cc->on_ack_recv(cc, cstat, &cc_ack, ts); } @@ -987,7 +998,7 @@ static int rtb_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_conn_stat *cstat, if (loss_time == UINT64_MAX) { loss_time = ent->ts + loss_delay; } else { - loss_time = ngtcp2_min_uint64(loss_time, ent->ts + loss_delay); + loss_time = ngtcp2_min(loss_time, ent->ts + loss_delay); } cstat->loss_time[pktns->id] = loss_time; @@ -1001,8 +1012,8 @@ static int rtb_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_conn_stat *cstat, static ngtcp2_duration compute_pkt_loss_delay(const ngtcp2_conn_stat *cstat) { /* 9/8 is kTimeThreshold */ ngtcp2_duration loss_delay = - ngtcp2_max_uint64(cstat->latest_rtt, cstat->smoothed_rtt) * 9 / 8; - return ngtcp2_max_uint64(loss_delay, NGTCP2_GRANULARITY); + ngtcp2_max(cstat->latest_rtt, cstat->smoothed_rtt) * 9 / 8; + return ngtcp2_max(loss_delay, NGTCP2_GRANULARITY); } /* @@ -1021,7 +1032,11 @@ static int conn_all_ecn_pkt_lost(ngtcp2_conn *conn) { pktns->tx.ecn.validation_pkt_sent == pktns->tx.ecn.validation_pkt_lost; } -static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, +/* + * This function assigns the number of bytes lost to + * |cc_ack|->bytes_lost if any. + */ +static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, ngtcp2_cc_ack *cc_ack, ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts) { ngtcp2_rtb_entry *ent; @@ -1040,8 +1055,8 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, uint64_t bytes_lost = 0; ngtcp2_duration max_ack_delay; - pkt_thres = ngtcp2_max_uint64(pkt_thres, NGTCP2_PKT_THRESHOLD); - pkt_thres = ngtcp2_min_uint64(pkt_thres, 256); + pkt_thres = ngtcp2_max(pkt_thres, NGTCP2_PKT_THRESHOLD); + pkt_thres = ngtcp2_min(pkt_thres, 256); cstat->loss_time[pktns->id] = UINT64_MAX; loss_delay = compute_pkt_loss_delay(cstat); @@ -1066,12 +1081,11 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, congestion_period = (cstat->smoothed_rtt + - ngtcp2_max_uint64(4 * cstat->rttvar, NGTCP2_GRANULARITY) + - max_ack_delay) * + ngtcp2_max(4 * cstat->rttvar, NGTCP2_GRANULARITY) + max_ack_delay) * NGTCP2_PERSISTENT_CONGESTION_THRESHOLD; - start_ts = ngtcp2_max_uint64(conn->handshake_confirmed_ts, - cstat->first_rtt_sample_ts); + start_ts = + ngtcp2_max(conn->handshake_confirmed_ts, cstat->first_rtt_sample_ts); for (; !ngtcp2_ksl_it_end(&it); ngtcp2_ksl_it_next(&it)) { ent = ngtcp2_ksl_it_get(&it); @@ -1139,8 +1153,10 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, break; } + cc_ack->bytes_lost = bytes_lost; + if (cc->congestion_event) { - cc->congestion_event(cc, cstat, latest_ts, bytes_lost, ts); + cc->congestion_event(cc, cstat, latest_ts, cc_ack, ts); } loss_window = latest_ts - oldest_ts; @@ -1153,10 +1169,9 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, */ if (pktns->id == NGTCP2_PKTNS_ID_APPLICATION && loss_window && loss_window >= congestion_period) { - ngtcp2_log_info(rtb->log, NGTCP2_LOG_EVENT_LDC, - "persistent congestion loss_window=%" PRIu64 - " congestion_period=%" PRIu64, - loss_window, congestion_period); + ngtcp2_log_infof(rtb->log, NGTCP2_LOG_EVENT_LDC, + "persistent congestion loss_window=", loss_window, + " congestion_period=", congestion_period); /* Reset min_rtt, srtt, and rttvar here. Next new RTT sample will be used to recalculate these values. */ @@ -1176,18 +1191,18 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, ngtcp2_rtb_remove_excessive_lost_pkt(rtb, (size_t)pkt_thres); - if (ppkt_lost) { - *ppkt_lost = bytes_lost; - } - return 0; } int ngtcp2_rtb_detect_lost_pkt(ngtcp2_rtb *rtb, ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts) { - return rtb_detect_lost_pkt(rtb, /* ppkt_lost = */ NULL, conn, pktns, cstat, - ts); + return rtb_detect_lost_pkt(rtb, + &(ngtcp2_cc_ack){ + .largest_pkt_sent_ts = UINT64_MAX, + .rtt = UINT64_MAX, + }, + conn, pktns, cstat, ts); } void ngtcp2_rtb_remove_excessive_lost_pkt(ngtcp2_rtb *rtb, size_t n) { @@ -1203,8 +1218,8 @@ void ngtcp2_rtb_remove_excessive_lost_pkt(ngtcp2_rtb *rtb, size_t n) { assert(ent->flags & NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED); - ngtcp2_log_info(rtb->log, NGTCP2_LOG_EVENT_LDC, - "removing stale lost pkn=%" PRId64, ent->hd.pkt_num); + ngtcp2_log_infof(rtb->log, NGTCP2_LOG_EVENT_LDC, + "removing stale lost pkn=", ent->hd.pkt_num); --rtb->num_lost_pkts; @@ -1240,13 +1255,14 @@ void ngtcp2_rtb_remove_expired_lost_pkt(ngtcp2_rtb *rtb, ngtcp2_ksl_it_prev(&it); ent = ngtcp2_ksl_it_get(&it); - if (!(ent->flags & NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED) || - ts - ent->lost_ts < timeout) { + assert(ent->flags & NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED); + + if (ts - ent->lost_ts < timeout) { return; } - ngtcp2_log_info(rtb->log, NGTCP2_LOG_EVENT_LDC, - "removing stale lost pkn=%" PRId64, ent->hd.pkt_num); + ngtcp2_log_infof(rtb->log, NGTCP2_LOG_EVENT_LDC, + "removing stale lost pkn=", ent->hd.pkt_num); --rtb->num_lost_pkts; @@ -1290,7 +1306,7 @@ static int rtb_reclaim_frame_on_retry(ngtcp2_rtb *rtb, ngtcp2_conn *conn, int rv; for (; *pfrc;) { - switch ((*pfrc)->fr.type) { + switch ((*pfrc)->fr.hd.type) { case NGTCP2_FRAME_STREAM: frc = *pfrc; @@ -1398,15 +1414,21 @@ int ngtcp2_rtb_reclaim_on_retry(ngtcp2_rtb *rtb, ngtcp2_conn *conn, assert(!(ent->flags & NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE)); if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_PTO_RECLAIMED) { - ngtcp2_log_info(rtb->log, NGTCP2_LOG_EVENT_LDC, - "pkn=%" PRId64 " has already been reclaimed on PTO", - ent->hd.pkt_num); + ngtcp2_log_infof(rtb->log, NGTCP2_LOG_EVENT_LDC, "pkn=", ent->hd.pkt_num, + " has already been reclaimed on PTO"); + + ngtcp2_rtb_entry_objalloc_del(ent, rtb->rtb_entry_objalloc, + rtb->frc_objalloc, rtb->mem); + continue; } if (!(ent->flags & NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE) && (!(ent->flags & NGTCP2_RTB_ENTRY_FLAG_DATAGRAM) || !conn->callbacks.lost_datagram)) { + ngtcp2_rtb_entry_objalloc_del(ent, rtb->rtb_entry_objalloc, + rtb->frc_objalloc, rtb->mem); + continue; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.h index 14684a458a60..664498be9628 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.h @@ -48,41 +48,41 @@ typedef struct ngtcp2_conn_stat ngtcp2_conn_stat; typedef struct ngtcp2_frame_chain ngtcp2_frame_chain; /* NGTCP2_RTB_ENTRY_FLAG_NONE indicates that no flag is set. */ -#define NGTCP2_RTB_ENTRY_FLAG_NONE 0x00u +#define NGTCP2_RTB_ENTRY_FLAG_NONE 0x00U /* NGTCP2_RTB_ENTRY_FLAG_PROBE indicates that the entry includes a probe packet. */ -#define NGTCP2_RTB_ENTRY_FLAG_PROBE 0x01u +#define NGTCP2_RTB_ENTRY_FLAG_PROBE 0x01U /* NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE indicates that the entry includes a frame which must be retransmitted until it is acknowledged. In most cases, this flag is used along with NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING and NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING. */ -#define NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE 0x02u +#define NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE 0x02U /* NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING indicates that the entry elicits acknowledgement. */ -#define NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING 0x04u +#define NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING 0x04U /* NGTCP2_RTB_ENTRY_FLAG_PTO_RECLAIMED indicates that the packet has been reclaimed on PTO. It is not marked lost yet and still consumes congestion window. */ -#define NGTCP2_RTB_ENTRY_FLAG_PTO_RECLAIMED 0x08u +#define NGTCP2_RTB_ENTRY_FLAG_PTO_RECLAIMED 0x08U /* NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED indicates that the entry has been marked lost and, optionally, scheduled to retransmit. */ -#define NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED 0x10u +#define NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED 0x10U /* NGTCP2_RTB_ENTRY_FLAG_ECN indicates that the entry is included in a UDP datagram with ECN marking. */ -#define NGTCP2_RTB_ENTRY_FLAG_ECN 0x20u +#define NGTCP2_RTB_ENTRY_FLAG_ECN 0x20U /* NGTCP2_RTB_ENTRY_FLAG_DATAGRAM indicates that the entry includes DATAGRAM frame. */ -#define NGTCP2_RTB_ENTRY_FLAG_DATAGRAM 0x40u +#define NGTCP2_RTB_ENTRY_FLAG_DATAGRAM 0x40U /* NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE indicates that the entry includes a PMTUD probe packet. */ -#define NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE 0x80u +#define NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE 0x80U /* NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING indicates that the entry includes a packet which elicits PTO probe packets. */ -#define NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING 0x100u +#define NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING 0x100U /* NGTCP2_RTB_ENTRY_FLAG_SKIP indicates that the entry has the skipped packet number. */ -#define NGTCP2_RTB_ENTRY_FLAG_SKIP 0x200u +#define NGTCP2_RTB_ENTRY_FLAG_SKIP 0x200U typedef struct ngtcp2_rtb_entry ngtcp2_rtb_entry; @@ -115,7 +115,7 @@ struct ngtcp2_rtb_entry { ngtcp2_tstamp first_sent_ts; uint64_t tx_in_flight; uint64_t lost; - int64_t end_seq; + int64_t pkt_id; int is_app_limited; } rst; /* flags is bitwise-OR of zero or more of diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.c index f774504282e6..31c52b4d9571 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.c @@ -37,6 +37,7 @@ void ngtcp2_settings_default_versioned(int settings_version, switch (settings_version) { case NGTCP2_SETTINGS_VERSION: + case NGTCP2_SETTINGS_V3: settings->glitch_ratelim_burst = NGTCP2_DEFAULT_GLITCH_RATELIM_BURST; settings->glitch_ratelim_rate = NGTCP2_DEFAULT_GLITCH_RATELIM_RATE; /* fall through */ @@ -86,6 +87,9 @@ size_t ngtcp2_settingslen_version(int settings_version) { switch (settings_version) { case NGTCP2_SETTINGS_VERSION: return sizeof(settings); + case NGTCP2_SETTINGS_V3: + return offsetof(ngtcp2_settings, glitch_ratelim_rate) + + sizeof(settings.glitch_ratelim_rate); case NGTCP2_SETTINGS_V2: return offsetof(ngtcp2_settings, pmtud_probeslen) + sizeof(settings.pmtud_probeslen); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.h index caa0fb58c58b..b40b6c4a8952 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.h @@ -33,10 +33,10 @@ /* NGTCP2_DEFAULT_GLITCH_RATELIM_BURST is the maximum number of tokens in glitch rate limiter. It is also the initial value. */ -#define NGTCP2_DEFAULT_GLITCH_RATELIM_BURST 1000 +#define NGTCP2_DEFAULT_GLITCH_RATELIM_BURST 10000 /* NGTCP2_DEFAULT_GLITCH_RATELIM_RATE is the rate of tokens generated per second for glitch rate limiter. */ -#define NGTCP2_DEFAULT_GLITCH_RATELIM_RATE 33 +#define NGTCP2_DEFAULT_GLITCH_RATELIM_RATE 330 /* * ngtcp2_settings_convert_to_latest converts |src| of version diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.c index a61636d188fa..dd5ef5a1af6f 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.c @@ -25,8 +25,10 @@ #include "ngtcp2_str.h" #include +#include #include "ngtcp2_macro.h" +#include "ngtcp2_unreachable.h" void *ngtcp2_cpymem(void *dest, const void *src, size_t n) { memcpy(dest, src, n); @@ -38,6 +40,22 @@ uint8_t *ngtcp2_setmem(uint8_t *dest, uint8_t b, size_t n) { return dest + n; } +void ngtcp2_secure_clear(void *data, size_t len) { +#ifdef WIN32 + SecureZeroMemory(data, len); +#elif defined(HAVE_EXPLICIT_BZERO) + explicit_bzero(data, len); +#elif defined(HAVE_MEMSET_S) + memset_s(data, len, 0, len); +#else /* !defined(WIN32) && !defined(HAVE_EXPLICIT_BZERO) && \ + !defined(HAVE_MEMSET_S) */ + static void *(*volatile memset_ptr)(void *, int, size_t) = memset; + + memset_ptr(data, 0, len); +#endif /* !defined(WIN32) && !defined(HAVE_EXPLICIT_BZERO) && \ + !defined(HAVE_MEMSET_S) */ +} + const void *ngtcp2_get_bytes(void *dest, const void *src, size_t n) { memcpy(dest, src, n); return (uint8_t *)src + n; @@ -47,76 +65,101 @@ const void *ngtcp2_get_bytes(void *dest, const void *src, size_t n) { uint8_t *ngtcp2_encode_hex(uint8_t *dest, const uint8_t *data, size_t len) { size_t i; - uint8_t *p = dest; for (i = 0; i < len; ++i) { - *p++ = (uint8_t)LOWER_XDIGITS[data[i] >> 4]; - *p++ = (uint8_t)LOWER_XDIGITS[data[i] & 0xf]; + *dest++ = (uint8_t)LOWER_XDIGITS[data[i] >> 4]; + *dest++ = (uint8_t)LOWER_XDIGITS[data[i] & 0xFU]; } - *p = '\0'; - return dest; } -char *ngtcp2_encode_printable_ascii(char *dest, const uint8_t *data, - size_t len) { +size_t ngtcp2_encode_uint_hexlen(uint64_t n) { size_t i; - char *p = dest; - uint8_t c; + uint8_t d; - for (i = 0; i < len; ++i) { - c = data[i]; - if (0x20 <= c && c <= 0x7e) { - *p++ = (char)c; - } else { - *p++ = '.'; - } + if (n == 0) { + return 1; } - *p = '\0'; + for (i = 0; i < sizeof(n); ++i) { + d = (uint8_t)(n >> (sizeof(n) - 1 - i) * 8); + if (!d) { + continue; + } - return dest; + if (d >> 4) { + return (sizeof(n) - i) * 2; + } + + return (sizeof(n) - i) * 2 - 1; + } + + ngtcp2_unreachable(); } -/* - * write_uint writes |n| to the buffer pointed by |p| in decimal - * representation. It returns |p| plus the number of bytes written. - * The function assumes that the buffer has enough capacity to contain - * a string. - */ -static uint8_t *write_uint(uint8_t *p, uint64_t n) { - size_t nlen = 0; - uint64_t t; - uint8_t *res; +uint8_t *ngtcp2_encode_uint_hex(uint8_t *dest, uint64_t n) { + size_t i; + uint8_t d; if (n == 0) { - *p++ = '0'; - return p; + *dest++ = '0'; + + return dest; } - for (t = n; t; t /= 10, ++nlen) - ; - p += nlen; - res = p; - for (; n; n /= 10) { - *--p = (uint8_t)((n % 10) + '0'); + + for (i = 0; i < sizeof(n); ++i) { + d = (uint8_t)(n >> (sizeof(n) - 1 - i) * 8); + if (d) { + if (d >> 4) { + *dest++ = (uint8_t)LOWER_XDIGITS[d >> 4]; + } + + *dest++ = (uint8_t)LOWER_XDIGITS[d & 0xFU]; + ++i; + + break; + } + } + + for (; i < sizeof(n); ++i) { + d = (uint8_t)(n >> (sizeof(n) - 1 - i) * 8); + + *dest++ = (uint8_t)LOWER_XDIGITS[d >> 4]; + *dest++ = (uint8_t)LOWER_XDIGITS[d & 0xFU]; } - return res; + + return dest; } -uint8_t *ngtcp2_encode_ipv4(uint8_t *dest, const uint8_t *addr) { +uint8_t *ngtcp2_encode_printable_ascii(uint8_t *dest, const uint8_t *data, + size_t len) { size_t i; - uint8_t *p = dest; + uint8_t c; - p = write_uint(p, addr[0]); + for (i = 0; i < len; ++i) { + c = data[i]; + if (0x20 <= c && c <= 0x7E) { + *dest++ = c; + } else { + *dest++ = '.'; + } + } + + return dest; +} + +uint8_t *ngtcp2_encode_ipv4(uint8_t *dest, const ngtcp2_in_addr *addr) { + size_t i; + const uint8_t *in = (const uint8_t *)addr; + + dest = ngtcp2_encode_uint(dest, in[0]); for (i = 1; i < 4; ++i) { - *p++ = '.'; - p = write_uint(p, addr[i]); + *dest++ = '.'; + dest = ngtcp2_encode_uint(dest, in[i]); } - *p = '\0'; - return dest; } @@ -136,7 +179,7 @@ static uint8_t *write_hex_zsup(uint8_t *dest, const uint8_t *data, size_t len) { break; } - d &= 0xf; + d &= 0xFU; if (d) { *p++ = (uint8_t)LOWER_XDIGITS[d]; @@ -153,22 +196,22 @@ static uint8_t *write_hex_zsup(uint8_t *dest, const uint8_t *data, size_t len) { for (; i < len; ++i) { d = data[i]; *p++ = (uint8_t)LOWER_XDIGITS[d >> 4]; - *p++ = (uint8_t)LOWER_XDIGITS[d & 0xf]; + *p++ = (uint8_t)LOWER_XDIGITS[d & 0xFU]; } return p; } -uint8_t *ngtcp2_encode_ipv6(uint8_t *dest, const uint8_t *addr) { +uint8_t *ngtcp2_encode_ipv6(uint8_t *dest, const ngtcp2_in6_addr *addr) { uint16_t blks[8]; size_t i; size_t zlen, zoff; size_t max_zlen = 0, max_zoff = 8; - uint8_t *p = dest; + const uint8_t *in = (const uint8_t *)addr; for (i = 0; i < 16; i += sizeof(uint16_t)) { /* Copy in network byte order. */ - memcpy(&blks[i / sizeof(uint16_t)], addr + i, sizeof(uint16_t)); + memcpy(&blks[i / sizeof(uint16_t)], in + i, sizeof(uint16_t)); } for (i = 0; i < 8;) { @@ -195,29 +238,29 @@ uint8_t *ngtcp2_encode_ipv6(uint8_t *dest, const uint8_t *addr) { } if (max_zoff != 0) { - p = write_hex_zsup(p, (const uint8_t *)blks, sizeof(uint16_t)); + dest = write_hex_zsup(dest, (const uint8_t *)blks, sizeof(uint16_t)); for (i = 1; i < max_zoff; ++i) { - *p++ = ':'; - p = write_hex_zsup(p, (const uint8_t *)(blks + i), sizeof(uint16_t)); + *dest++ = ':'; + dest = + write_hex_zsup(dest, (const uint8_t *)(blks + i), sizeof(uint16_t)); } } if (max_zoff != 8) { - *p++ = ':'; + *dest++ = ':'; if (max_zoff + max_zlen == 8) { - *p++ = ':'; + *dest++ = ':'; } else { for (i = max_zoff + max_zlen; i < 8; ++i) { - *p++ = ':'; - p = write_hex_zsup(p, (const uint8_t *)(blks + i), sizeof(uint16_t)); + *dest++ = ':'; + dest = + write_hex_zsup(dest, (const uint8_t *)(blks + i), sizeof(uint16_t)); } } } - *p = '\0'; - return dest; } @@ -231,3 +274,126 @@ int ngtcp2_cmemeq(const uint8_t *a, const uint8_t *b, size_t n) { return rv == 0; } + +/* countl_zero counts the number of leading zeros in |x|. It is + undefined if |x| is 0. */ +static int countl_zero(uint64_t x) { +#ifdef __GNUC__ + return __builtin_clzll(x); +#else /* !defined(__GNUC__) */ + /* This is the same implementation of Go's LeadingZeros64 in + math/bits package. */ + static const uint8_t len8tab[] = { + 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + }; + int n = 0; + + if (x >= 1ULL << 32) { + x >>= 32; + n += 32; + } + + if (x >= 1 << 16) { + x >>= 16; + n += 16; + } + + if (x >= 1 << 8) { + x >>= 8; + n += 8; + } + + return 64 - (n + len8tab[x]); +#endif /* !defined(__GNUC__) */ +} + +/* + * count_digit returns the minimum number of digits to represent |x| + * in base 10. + * + * credit: + * https://lemire.me/blog/2025/01/07/counting-the-digits-of-64-bit-integers/ + */ +static size_t count_digit(uint64_t x) { + static const uint64_t count_digit_tbl[] = { + 9ULL, + 99ULL, + 999ULL, + 9999ULL, + 99999ULL, + 999999ULL, + 9999999ULL, + 99999999ULL, + 999999999ULL, + 9999999999ULL, + 99999999999ULL, + 999999999999ULL, + 9999999999999ULL, + 99999999999999ULL, + 999999999999999ULL, + 9999999999999999ULL, + 99999999999999999ULL, + 999999999999999999ULL, + 9999999999999999999ULL, + }; + size_t y = (size_t)(19 * (63 - countl_zero(x | 1)) >> 6); + + y += x > count_digit_tbl[y]; + + return y + 1; +} + +size_t ngtcp2_encode_uintlen(uint64_t n) { return count_digit(n); } + +uint8_t *ngtcp2_encode_uint(uint8_t *dest, uint64_t n) { + static const uint8_t uint_digits[] = + "00010203040506070809101112131415161718192021222324252627282930313233343536" + "37383940414243444546474849505152535455565758596061626364656667686970717273" + "7475767778798081828384858687888990919293949596979899"; + uint8_t *p; + const uint8_t *tp; + + if (n < 10) { + *dest++ = (uint8_t)('0' + n); + return dest; + } + + if (n < 100) { + tp = &uint_digits[n * 2]; + *dest++ = *tp++; + *dest++ = *tp; + return dest; + } + + dest += count_digit(n); + p = dest; + + for (; n >= 100; n /= 100) { + p -= 2; + tp = &uint_digits[(n % 100) * 2]; + p[0] = *tp++; + p[1] = *tp; + } + + if (n < 10) { + *--p = (uint8_t)('0' + n); + return dest; + } + + p -= 2; + tp = &uint_digits[n * 2]; + p[0] = *tp++; + p[1] = *tp; + + return dest; +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.h index f970c153e805..abda53e46d52 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.h @@ -46,43 +46,54 @@ uint8_t *ngtcp2_setmem(uint8_t *dest, uint8_t b, size_t n); const void *ngtcp2_get_bytes(void *dest, const void *src, size_t n); /* - * ngtcp2_encode_hex encodes |data| of length |len| in hex string. It - * writes additional NULL bytes at the end of the buffer. The buffer - * pointed by |dest| must have at least |len| * 2 + 1 bytes space. - * This function returns |dest|. + * ngtcp2_encode_hex encodes |data| of length |len| in hex string. + * The buffer pointed by |dest| must have at least |len| * 2 bytes + * space. This function returns |dest| + |len| * 2. */ uint8_t *ngtcp2_encode_hex(uint8_t *dest, const uint8_t *data, size_t len); +/* + * ngtcp2_encode_uint_hexlen returns the number of bytes + * ngtcp2_encode_uint_hex produces when |n| is given. + */ +size_t ngtcp2_encode_uint_hexlen(uint64_t n); + +/* + * ngtcp2_encode_uint_hex encodes |n| in hex string. It omits the + * leading zeros (e.g., 1fb). The buffer pointed by |dest| must have + * at least ngtcp2_encode_uint_hexlen(|n|) bytes. This function + * returns |dest| + the number of bytes written. + */ +uint8_t *ngtcp2_encode_uint_hex(uint8_t *dest, uint64_t n); + /* * ngtcp2_encode_ipv4 encodes binary form IPv4 address stored in * |addr| to human readable text form in the buffer pointed by |dest|. - * The capacity of buffer must have enough length to store a text form - * plus a terminating NULL byte. The resulting text form ends with - * NULL byte. The function returns |dest|. + * The capacity of buffer must have enough length to store a text + * form. The function returns |dest| + the number of bytes written. */ -uint8_t *ngtcp2_encode_ipv4(uint8_t *dest, const uint8_t *addr); +uint8_t *ngtcp2_encode_ipv4(uint8_t *dest, const ngtcp2_in_addr *addr); /* * ngtcp2_encode_ipv6 encodes binary form IPv6 address stored in * |addr| to human readable text form in the buffer pointed by |dest|. - * The capacity of buffer must have enough length to store a text form - * plus a terminating NULL byte. The resulting text form ends with - * NULL byte. The function produces the canonical form of IPv6 text + * The capacity of buffer must have enough length to store a text + * form. The function produces the canonical form of IPv6 text * representation described in * https://tools.ietf.org/html/rfc5952#section-4. The function - * returns |dest|. + * returns |dest| + the number of bytes written. */ -uint8_t *ngtcp2_encode_ipv6(uint8_t *dest, const uint8_t *addr); +uint8_t *ngtcp2_encode_ipv6(uint8_t *dest, const ngtcp2_in6_addr *addr); /* * ngtcp2_encode_printable_ascii encodes |data| of length |len| in * |dest| in the following manner: printable ascii characters are - * copied as is. The other characters are converted to ".". It - * writes additional NULL bytes at the end of the buffer. |dest| must - * have at least |len| + 1 bytes. This function returns |dest|. + * copied as is. The other characters are converted to ".". |dest| + * must have at least |len|. This function returns |dest| + the + * number of bytes written. */ -char *ngtcp2_encode_printable_ascii(char *dest, const uint8_t *data, - size_t len); +uint8_t *ngtcp2_encode_printable_ascii(uint8_t *dest, const uint8_t *data, + size_t len); /* * ngtcp2_cmemeq returns nonzero if the first |n| bytes of the buffers @@ -91,4 +102,18 @@ char *ngtcp2_encode_printable_ascii(char *dest, const uint8_t *data, */ int ngtcp2_cmemeq(const uint8_t *a, const uint8_t *b, size_t n); +/* + * ngtcp2_encode_uintlen returns the number of bytes + * ngtcp2_encode_uint produces when |n| is given. + */ +size_t ngtcp2_encode_uintlen(uint64_t n); + +/* + * ngtcp2_encode_uint encodes |n| as a decimal integer to the buffer + * pointed by |dest|. This function assumes that the buffer contains + * the sufficient capacity to write the number. This function returns + * the pointer to the buffer past the last byte written. + */ +uint8_t *ngtcp2_encode_uint(uint8_t *dest, uint64_t n); + #endif /* !defined(NGTCP2_STR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c index faa417713224..aa01434bf16e 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c @@ -36,30 +36,27 @@ void ngtcp2_strm_init(ngtcp2_strm *strm, int64_t stream_id, uint32_t flags, uint64_t max_rx_offset, uint64_t max_tx_offset, void *stream_user_data, ngtcp2_objalloc *frc_objalloc, const ngtcp2_mem *mem) { - strm->pe.index = NGTCP2_PQ_BAD_INDEX; - strm->cycle = 0; - strm->frc_objalloc = frc_objalloc; - strm->tx.acked_offset = NULL; - strm->tx.cont_acked_offset = 0; - strm->tx.streamfrq = NULL; - strm->tx.offset = 0; - strm->tx.max_offset = max_tx_offset; - strm->tx.last_blocked_offset = UINT64_MAX; - strm->tx.last_max_stream_data_ts = UINT64_MAX; - strm->tx.loss_count = 0; - strm->tx.last_lost_pkt_num = -1; - strm->tx.stop_sending_app_error_code = 0; - strm->tx.reset_stream_app_error_code = 0; - strm->rx.rob = NULL; - strm->rx.cont_offset = 0; - strm->rx.last_offset = 0; - strm->rx.max_offset = strm->rx.unsent_max_offset = strm->rx.window = - max_rx_offset; - strm->mem = mem; - strm->stream_id = stream_id; - strm->stream_user_data = stream_user_data; - strm->flags = flags; - strm->app_error_code = 0; + *strm = (ngtcp2_strm){ + .pe.index = NGTCP2_PQ_BAD_INDEX, + .frc_objalloc = frc_objalloc, + .tx = + { + .max_offset = max_tx_offset, + .last_blocked_offset = UINT64_MAX, + .last_max_stream_data_ts = UINT64_MAX, + .last_lost_pkt_num = -1, + }, + .rx = + { + .max_offset = max_rx_offset, + .unsent_max_offset = max_rx_offset, + .window = max_rx_offset, + }, + .mem = mem, + .stream_id = stream_id, + .stream_user_data = stream_user_data, + .flags = flags, + }; } void ngtcp2_strm_free(ngtcp2_strm *strm) { @@ -120,7 +117,7 @@ uint64_t ngtcp2_strm_rx_offset(const ngtcp2_strm *strm) { /* strm_rob_heavily_fragmented returns nonzero if the number of gaps in |rob| exceeds the limit. */ static int strm_rob_heavily_fragmented(const ngtcp2_rob *rob) { - return ngtcp2_ksl_len(&rob->gapksl) >= 1000; + return ngtcp2_ksl_len(&rob->gapksl) >= 4000; } ngtcp2_ssize ngtcp2_strm_recv_reordering(ngtcp2_strm *strm, const uint8_t *data, @@ -137,6 +134,10 @@ ngtcp2_ssize ngtcp2_strm_recv_reordering(ngtcp2_strm *strm, const uint8_t *data, if (strm->rx.cont_offset) { ngtcp2_rob_remove_prefix(strm->rx.rob, strm->rx.cont_offset); } + + if (strm->flags & NGTCP2_STRM_FLAG_NO_REORDERED_DATA_BUFFERING) { + ngtcp2_rob_discard_data(strm->rx.rob); + } } nwrite = ngtcp2_rob_push(strm->rx.rob, offset, data, datalen); @@ -160,18 +161,6 @@ void ngtcp2_strm_update_rx_offset(ngtcp2_strm *strm, uint64_t offset) { ngtcp2_rob_remove_prefix(strm->rx.rob, offset); } -void ngtcp2_strm_discard_reordered_data(ngtcp2_strm *strm) { - if (strm->rx.rob == NULL) { - return; - } - - strm->rx.cont_offset = ngtcp2_strm_rx_offset(strm); - - ngtcp2_rob_free(strm->rx.rob); - ngtcp2_mem_free(strm->mem, strm->rx.rob); - strm->rx.rob = NULL; -} - void ngtcp2_strm_shutdown(ngtcp2_strm *strm, uint32_t flags) { strm->flags |= flags & NGTCP2_STRM_FLAG_SHUT_RDWR; } @@ -193,8 +182,8 @@ static int strm_streamfrq_init(ngtcp2_strm *strm) { int ngtcp2_strm_streamfrq_push(ngtcp2_strm *strm, ngtcp2_frame_chain *frc) { int rv; - assert(frc->fr.type == NGTCP2_FRAME_STREAM || - frc->fr.type == NGTCP2_FRAME_CRYPTO); + assert(frc->fr.hd.type == NGTCP2_FRAME_STREAM || + frc->fr.hd.type == NGTCP2_FRAME_CRYPTO); assert(frc->next == NULL); if (strm->tx.streamfrq == NULL) { @@ -202,7 +191,7 @@ int ngtcp2_strm_streamfrq_push(ngtcp2_strm *strm, ngtcp2_frame_chain *frc) { if (rv != 0) { return rv; } - } else if (ngtcp2_ksl_len(strm->tx.streamfrq) >= 1000) { + } else if (ngtcp2_ksl_len(strm->tx.streamfrq) >= 8000) { return NGTCP2_ERR_INTERNAL; } @@ -308,8 +297,7 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, fr->offset = offset + base_offset; fr->datacnt = end_idx - idx; - fr->data[0].base += base_offset; - fr->data[0].len -= (size_t)base_offset; + ngtcp2_vec_drop(&fr->data[0], (size_t)base_offset); *pfrc = frc; @@ -335,8 +323,7 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, nfr->stream_id = fr->stream_id; nfr->offset = end_offset + end_base_offset; nfr->datacnt = fr->datacnt - end_idx; - nfr->data[0].base += end_base_offset; - nfr->data[0].len -= (size_t)end_base_offset; + ngtcp2_vec_drop(&nfr->data[0], (size_t)end_base_offset); rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); if (rv != 0) { @@ -364,8 +351,7 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, fr->data[fr->datacnt - 1].len = (size_t)end_base_offset; } - fr->data[0].base += base_offset; - fr->data[0].len -= (size_t)base_offset; + ngtcp2_vec_drop(&fr->data[0], (size_t)base_offset); *pfrc = frc; @@ -378,13 +364,12 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, size_t left) { ngtcp2_stream *fr, *nfr; - ngtcp2_frame_chain *frc, *nfrc, *sfrc; + ngtcp2_frame_chain *frc, *nfrc; int rv; size_t nmerged; uint64_t datalen; - ngtcp2_vec a[NGTCP2_MAX_STREAM_DATACNT]; - ngtcp2_vec b[NGTCP2_MAX_STREAM_DATACNT]; - size_t acnt, bcnt; + ngtcp2_vec data[NGTCP2_MAX_STREAM_DATACNT]; + size_t datacnt; uint64_t unacked_offset; if (strm->tx.streamfrq == NULL || ngtcp2_ksl_len(strm->tx.streamfrq) == 0) { @@ -424,17 +409,15 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, } if (datalen > left) { - ngtcp2_vec_copy(a, fr->data, fr->datacnt); - acnt = fr->datacnt; - - bcnt = 0; - ngtcp2_vec_split(b, &bcnt, a, &acnt, left, NGTCP2_MAX_STREAM_DATACNT); + datacnt = 0; + ngtcp2_vec_split(data, &datacnt, fr->data, &fr->datacnt, left, + NGTCP2_MAX_STREAM_DATACNT); - assert(acnt > 0); - assert(bcnt > 0); + assert(fr->datacnt > 0); + assert(datacnt > 0); rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, bcnt, strm->frc_objalloc, strm->mem); + &nfrc, datacnt, strm->frc_objalloc, strm->mem); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); @@ -447,8 +430,8 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, nfr->fin = fr->fin; nfr->stream_id = fr->stream_id; nfr->offset = fr->offset + left; - nfr->datacnt = bcnt; - ngtcp2_vec_copy(nfr->data, b, bcnt); + nfr->datacnt = datacnt; + ngtcp2_vec_copy(nfr->data, data, datacnt); rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); if (rv != 0) { @@ -459,31 +442,17 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, return rv; } - rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, acnt, strm->frc_objalloc, strm->mem); - if (rv != 0) { - assert(ngtcp2_err_is_fatal(rv)); - ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); - return rv; - } - - nfr = &nfrc->fr.stream; - *nfr = *fr; - nfr->fin = 0; - nfr->datacnt = acnt; - ngtcp2_vec_copy(nfr->data, a, acnt); - - ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + fr->fin = 0; - *pfrc = nfrc; + *pfrc = frc; return 0; } left -= (size_t)datalen; - ngtcp2_vec_copy(a, fr->data, fr->datacnt); - acnt = fr->datacnt; + ngtcp2_vec_copy(data, fr->data, fr->datacnt); + datacnt = fr->datacnt; for (; left && ngtcp2_ksl_len(strm->tx.streamfrq);) { unacked_offset = ngtcp2_strm_streamfrq_unacked_offset(strm); @@ -510,9 +479,7 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, break; } - bcnt = nfr->datacnt; - - nmerged = ngtcp2_vec_merge(a, &acnt, nfr->data, &bcnt, left, + nmerged = ngtcp2_vec_merge(data, &datacnt, nfr->data, &nfr->datacnt, left, NGTCP2_MAX_STREAM_DATACNT); if (nmerged == 0) { rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); @@ -530,54 +497,27 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, datalen += nmerged; left -= nmerged; - if (bcnt == 0) { + if (nfr->datacnt == 0) { fr->fin = nfr->fin; ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); continue; } - if (nfr->datacnt <= NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES || - bcnt > NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES) { - nfr->offset += nmerged; - nfr->datacnt = bcnt; - - rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); - if (rv != 0) { - ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); - ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); - return rv; - } - } else { - rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &sfrc, bcnt, strm->frc_objalloc, strm->mem); - if (rv != 0) { - ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); - ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); - return rv; - } - - sfrc->fr.stream = nfrc->fr.stream; - sfrc->fr.stream.offset += nmerged; - sfrc->fr.stream.datacnt = bcnt; - ngtcp2_vec_copy(sfrc->fr.stream.data, nfrc->fr.stream.data, bcnt); + nfr->offset += nmerged; + rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); + if (rv != 0) { ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); - - rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &sfrc->fr.stream.offset, - sfrc); - if (rv != 0) { - ngtcp2_frame_chain_objalloc_del(sfrc, strm->frc_objalloc, strm->mem); - ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); - return rv; - } + ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + return rv; } break; } - if (acnt == fr->datacnt) { - if (acnt > 0) { - fr->data[acnt - 1] = a[acnt - 1]; + if (datacnt == fr->datacnt) { + if (datacnt > 0) { + fr->data[datacnt - 1] = data[datacnt - 1]; } *pfrc = frc; @@ -585,19 +525,23 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, return 0; } - assert(acnt > fr->datacnt); + assert(datacnt > fr->datacnt); rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, acnt, strm->frc_objalloc, strm->mem); + &nfrc, datacnt, strm->frc_objalloc, strm->mem); if (rv != 0) { ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); return rv; } nfr = &nfrc->fr.stream; - *nfr = *fr; - nfr->datacnt = acnt; - ngtcp2_vec_copy(nfr->data, a, acnt); + nfr->type = fr->type; + nfr->flags = fr->flags; + nfr->fin = fr->fin; + nfr->stream_id = fr->stream_id; + nfr->offset = fr->offset; + nfr->datacnt = datacnt; + ngtcp2_vec_copy(nfr->data, data, datacnt); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); @@ -694,12 +638,11 @@ int ngtcp2_strm_is_all_tx_data_fin_acked(const ngtcp2_strm *strm) { ngtcp2_range ngtcp2_strm_get_unacked_range_after(const ngtcp2_strm *strm, uint64_t offset) { - ngtcp2_range gap; - if (strm->tx.acked_offset == NULL) { - gap.begin = strm->tx.cont_acked_offset; - gap.end = UINT64_MAX; - return gap; + return (ngtcp2_range){ + .begin = strm->tx.cont_acked_offset, + .end = UINT64_MAX, + }; } return ngtcp2_gaptr_get_first_gap_after(strm->tx.acked_offset, offset); @@ -754,7 +697,7 @@ int ngtcp2_strm_ack_data(ngtcp2_strm *strm, uint64_t offset, uint64_t len) { return rv; } - if (ngtcp2_ksl_len(&strm->tx.acked_offset->gap) >= 1000) { + if (ngtcp2_ksl_len(&strm->tx.acked_offset->gap) >= 4000) { return NGTCP2_ERR_INTERNAL; } @@ -794,3 +737,41 @@ int ngtcp2_strm_require_retransmit_stream_data_blocked( return fr->offset == strm->tx.max_offset && !(strm->flags & NGTCP2_STRM_FLAG_SHUT_WR); } + +uint64_t ngtcp2_strm_discard_ordered_data(ngtcp2_strm *strm, + uint64_t rx_offset) { + uint64_t datalen; + const uint8_t *data; + uint64_t orig_rx_offset = rx_offset; + + if (!strm->rx.rob) { + return 0; + } + + for (;;) { + datalen = ngtcp2_rob_data_at(strm->rx.rob, &data, rx_offset); + if (datalen == 0) { + break; + } + + ngtcp2_rob_pop(strm->rx.rob, rx_offset, datalen); + + rx_offset += datalen; + } + + return rx_offset - orig_rx_offset; +} + +void ngtcp2_strm_stop_buffering_reordered_data(ngtcp2_strm *strm) { + if (strm->flags & NGTCP2_STRM_FLAG_NO_REORDERED_DATA_BUFFERING) { + return; + } + + strm->flags |= NGTCP2_STRM_FLAG_NO_REORDERED_DATA_BUFFERING; + + if (!strm->rx.rob) { + return; + } + + ngtcp2_rob_discard_data(strm->rx.rob); +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h index 1a1e8fd3b7d5..0c47873c3db2 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h @@ -41,54 +41,66 @@ typedef struct ngtcp2_frame_chain ngtcp2_frame_chain; /* NGTCP2_STRM_FLAG_NONE indicates that no flag is set. */ -#define NGTCP2_STRM_FLAG_NONE 0x00u +#define NGTCP2_STRM_FLAG_NONE 0x00U /* NGTCP2_STRM_FLAG_SHUT_RD indicates that further reception of stream data is not allowed. */ -#define NGTCP2_STRM_FLAG_SHUT_RD 0x01u +#define NGTCP2_STRM_FLAG_SHUT_RD 0x01U /* NGTCP2_STRM_FLAG_SHUT_WR indicates that further transmission of stream data is not allowed. */ -#define NGTCP2_STRM_FLAG_SHUT_WR 0x02u +#define NGTCP2_STRM_FLAG_SHUT_WR 0x02U #define NGTCP2_STRM_FLAG_SHUT_RDWR \ (NGTCP2_STRM_FLAG_SHUT_RD | NGTCP2_STRM_FLAG_SHUT_WR) /* NGTCP2_STRM_FLAG_RESET_STREAM indicates that RESET_STREAM is sent from the local endpoint. In this case, NGTCP2_STRM_FLAG_SHUT_WR is also set. */ -#define NGTCP2_STRM_FLAG_RESET_STREAM 0x04u +#define NGTCP2_STRM_FLAG_RESET_STREAM 0x04U /* NGTCP2_STRM_FLAG_RESET_STREAM_RECVED indicates that RESET_STREAM is received from the remote endpoint. In this case, NGTCP2_STRM_FLAG_SHUT_RD is also set. */ -#define NGTCP2_STRM_FLAG_RESET_STREAM_RECVED 0x08u +#define NGTCP2_STRM_FLAG_RESET_STREAM_RECVED 0x08U /* NGTCP2_STRM_FLAG_STOP_SENDING indicates that STOP_SENDING is sent from the local endpoint. */ -#define NGTCP2_STRM_FLAG_STOP_SENDING 0x10u +#define NGTCP2_STRM_FLAG_STOP_SENDING 0x10U /* NGTCP2_STRM_FLAG_RESET_STREAM_ACKED indicates that the outgoing RESET_STREAM is acknowledged by peer. */ -#define NGTCP2_STRM_FLAG_RESET_STREAM_ACKED 0x20u +#define NGTCP2_STRM_FLAG_RESET_STREAM_ACKED 0x20U /* NGTCP2_STRM_FLAG_FIN_ACKED indicates that a STREAM with FIN bit set is acknowledged by a remote endpoint. */ -#define NGTCP2_STRM_FLAG_FIN_ACKED 0x40u +#define NGTCP2_STRM_FLAG_FIN_ACKED 0x40U /* NGTCP2_STRM_FLAG_ANY_ACKED indicates that any portion of stream data, including 0 length segment, is acknowledged. */ -#define NGTCP2_STRM_FLAG_ANY_ACKED 0x80u +#define NGTCP2_STRM_FLAG_ANY_ACKED 0x80U /* NGTCP2_STRM_FLAG_APP_ERROR_CODE_SET indicates that app_error_code field is set. This resolves the ambiguity that the initial app_error_code value 0 might be a proper application error code. In this case, without this flag, we are unable to distinguish assigned value from unassigned one. */ -#define NGTCP2_STRM_FLAG_APP_ERROR_CODE_SET 0x100u +#define NGTCP2_STRM_FLAG_APP_ERROR_CODE_SET 0x100U /* NGTCP2_STRM_FLAG_SEND_STOP_SENDING is set when STOP_SENDING frame should be sent. */ -#define NGTCP2_STRM_FLAG_SEND_STOP_SENDING 0x200u +#define NGTCP2_STRM_FLAG_SEND_STOP_SENDING 0x200U /* NGTCP2_STRM_FLAG_SEND_RESET_STREAM is set when RESET_STREAM frame should be sent. */ -#define NGTCP2_STRM_FLAG_SEND_RESET_STREAM 0x400u +#define NGTCP2_STRM_FLAG_SEND_RESET_STREAM 0x400U /* NGTCP2_STRM_FLAG_STOP_SENDING_RECVED indicates that STOP_SENDING is received from the remote endpoint. In this case, NGTCP2_STRM_FLAG_SHUT_WR is also set. */ -#define NGTCP2_STRM_FLAG_STOP_SENDING_RECVED 0x800u +#define NGTCP2_STRM_FLAG_STOP_SENDING_RECVED 0x800U /* NGTCP2_STRM_FLAG_ANY_SENT indicates that any STREAM frame, including empty one, has been sent. */ -#define NGTCP2_STRM_FLAG_ANY_SENT 0x1000u +#define NGTCP2_STRM_FLAG_ANY_SENT 0x1000U +/* NGTCP2_STRM_FLAG_NO_REORDERED_DATA_BUFFERING is set when + ngtcp2_strm_stop_buffering_reordered_data is called. */ +#define NGTCP2_STRM_FLAG_NO_REORDERED_DATA_BUFFERING 0x2000U +/* NGTCP2_STRM_FLAG_RX_APP_ERROR_CODE_SET is set when + ngtcp2_strm.rx.app_error_code is set. */ +#define NGTCP2_STRM_FLAG_RX_APP_ERROR_CODE_SET 0x4000U +/* NGTCP2_STRM_FLAG_TX_RESET_STREAM_APP_ERROR_CODE_SET is set when + ngtcp2_strm.tx.reset_stream_app_error_code is set. */ +#define NGTCP2_STRM_FLAG_TX_RESET_STREAM_APP_ERROR_CODE_SET 0x8000U +/* NGTCP2_STRM_FLAG_TX_STOP_SENDING_APP_ERROR_CODE_SET is set when + ngtcp2_strm.tx.stop_sending_app_error_code is set. */ +#define NGTCP2_STRM_FLAG_TX_STOP_SENDING_APP_ERROR_CODE_SET 0x10000U typedef struct ngtcp2_strm ngtcp2_strm; @@ -138,10 +150,18 @@ struct ngtcp2_strm { multiple STREAM frames in one lost packet. */ int64_t last_lost_pkt_num; /* stop_sending_app_error_code is the application specific - error code that is sent along with STOP_SENDING. */ + error code that is sent along with STOP_SENDING. If this + field is set, + NGTCP2_STRM_FLAG_TX_STOP_SENDING_APP_ERROR_CODE_SET is set. + This field is eventually passed to ngtcp2_stream_close2 + callback as rx_app_error_code parameter. */ uint64_t stop_sending_app_error_code; /* reset_stream_app_error_code is the application specific - error code that is sent along with RESET_STREAM. */ + error code that is sent along with RESET_STREAM. If this + field is set, + NGTCP2_STRM_FLAG_TX_RESET_STREAM_APP_ERROR_CODE_SET is set. + This field is eventually passed to ngtcp2_stream_close2 + callback as tx_app_error_code parameter. */ uint64_t reset_stream_app_error_code; } tx; @@ -166,19 +186,25 @@ struct ngtcp2_strm { uint64_t unsent_max_offset; /* window is the stream-level flow control window size. */ uint64_t window; + /* app_error_code is the application error code that is + received in RESET_STREAM frame. If this field is set, + NGTCP2_STRM_FLAG_RX_APP_ERROR_CODE_SET is set. This field + is eventually passed to ngtcp2_stream_close2 callback as + rx_app_error_code parameter. */ + uint64_t app_error_code; } rx; const ngtcp2_mem *mem; int64_t stream_id; void *stream_user_data; - /* flags is bit-wise OR of zero or more of NGTCP2_STRM_FLAG_*. */ - uint32_t flags; /* app_error_code is an error code the local endpoint sent in RESET_STREAM or STOP_SENDING, or received from a remote endpoint in RESET_STREAM or STOP_SENDING. First application error code is chosen and when set, NGTCP2_STRM_FLAG_APP_ERROR_CODE_SET flag is set in flags field. */ uint64_t app_error_code; + /* flags is bit-wise OR of zero or more of NGTCP2_STRM_FLAG_*. */ + uint32_t flags; }; ngtcp2_opl_entry oplent; @@ -208,6 +234,10 @@ uint64_t ngtcp2_strm_rx_offset(const ngtcp2_strm *strm); /* * ngtcp2_strm_recv_reordering handles reordered data. * + * If ngtcp2_strm_stop_buffering_reordered_data has been called, this + * function only records the range of the reordered data. The actual + * data is not buffered. + * * It returns the number of bytes newly buffered if it succeeds, or * one of the following negative error codes: * @@ -223,12 +253,6 @@ ngtcp2_ssize ngtcp2_strm_recv_reordering(ngtcp2_strm *strm, const uint8_t *data, */ void ngtcp2_strm_update_rx_offset(ngtcp2_strm *strm, uint64_t offset); -/* - * ngtcp2_strm_discard_reordered_data discards all buffered reordered - * data. - */ -void ngtcp2_strm_discard_reordered_data(ngtcp2_strm *strm); - /* * ngtcp2_strm_shutdown shutdowns |strm|. |flags| should be one of * NGTCP2_STRM_FLAG_SHUT_RD, NGTCP2_STRM_FLAG_SHUT_WR, and @@ -358,4 +382,19 @@ int ngtcp2_strm_require_retransmit_max_stream_data( int ngtcp2_strm_require_retransmit_stream_data_blocked( const ngtcp2_strm *strm, const ngtcp2_stream_data_blocked *fr); +/* + * ngtcp2_strm_discard_ordered_data discards the ordered data starting + * at |rx_offset|. It stops when it finds a gap, which means that a + * portion of the data has not been received yet. It returns the size + * of the buffered bytes discarded. + */ +uint64_t ngtcp2_strm_discard_ordered_data(ngtcp2_strm *strm, + uint64_t rx_offset); + +/* + * ngtcp2_strm_stop_buffering_reordered_data discards the buffered + * reordered data, and stops buffering data any further. + */ +void ngtcp2_strm_stop_buffering_reordered_data(ngtcp2_strm *strm); + #endif /* !defined(NGTCP2_STRM_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.c index d652ece4e07a..f28c4f57b159 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.c @@ -150,8 +150,8 @@ ngtcp2_ssize ngtcp2_transport_params_encode_versioned( if (params->stateless_reset_token_present) { len += ngtcp2_put_uvarintlen(NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN) + - ngtcp2_put_uvarintlen(NGTCP2_STATELESS_RESET_TOKENLEN) + - NGTCP2_STATELESS_RESET_TOKENLEN; + ngtcp2_put_uvarintlen(sizeof(params->stateless_reset_token)) + + sizeof(params->stateless_reset_token); } if (params->preferred_addr_present) { @@ -160,7 +160,7 @@ ngtcp2_ssize ngtcp2_transport_params_encode_versioned( preferred_addrlen = 4 /* ipv4Address */ + 2 /* ipv4Port */ + 16 /* ipv6Address */ + 2 /* ipv6Port */ + 1 + params->preferred_addr.cid.datalen /* CID */ + - NGTCP2_STATELESS_RESET_TOKENLEN; + sizeof(params->preferred_addr.stateless_reset_token); len += ngtcp2_put_uvarintlen(NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS) + ngtcp2_put_uvarintlen(preferred_addrlen) + preferred_addrlen; } @@ -586,6 +586,9 @@ int ngtcp2_transport_params_decode_versioned(int transport_params_version, if (decode_varint_param(¶ms->max_idle_timeout, &p, end) != 0) { return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; } + if (params->max_idle_timeout > UINT64_MAX / NGTCP2_MILLISECONDS) { + params->max_idle_timeout = UINT64_MAX; + } params->max_idle_timeout *= NGTCP2_MILLISECONDS; break; case NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE: @@ -626,7 +629,8 @@ int ngtcp2_transport_params_decode_versioned(int transport_params_version, } len = 4 /* ipv4Address */ + 2 /* ipv4Port */ + 16 /* ipv6Address */ + 2 /* ipv6Port */ - + 1 /* cid length */ + NGTCP2_STATELESS_RESET_TOKENLEN; + + 1 /* cid length */ + + sizeof(params->preferred_addr.stateless_reset_token); if (valuelen < len) { return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; } @@ -732,7 +736,7 @@ int ngtcp2_transport_params_decode_versioned(int transport_params_version, if ((size_t)(end - p) < valuelen) { return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; } - if (valuelen < sizeof(uint32_t) || (valuelen & 0x3)) { + if (valuelen < sizeof(uint32_t) || (valuelen & 0x3U)) { return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; } p = ngtcp2_get_uint32be(¶ms->version_info.chosen_version, p); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.h index c077f06a9dd7..0ea85edb0a4d 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.h @@ -35,28 +35,28 @@ parameter ID. */ typedef uint64_t ngtcp2_transport_param_id; -#define NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID 0x00 -#define NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT 0x01 -#define NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN 0x02 -#define NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE 0x03 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA 0x04 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL 0x05 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE 0x06 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI 0x07 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI 0x08 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI 0x09 -#define NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT 0x0a -#define NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY 0x0b -#define NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION 0x0c -#define NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS 0x0d -#define NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT 0x0e -#define NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID 0x0f -#define NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID 0x10 +#define NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID 0x00U +#define NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT 0x01U +#define NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN 0x02U +#define NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE 0x03U +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA 0x04U +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL 0x05U +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE 0x06U +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI 0x07U +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI 0x08U +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI 0x09U +#define NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT 0x0AU +#define NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY 0x0BU +#define NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION 0x0CU +#define NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS 0x0DU +#define NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT 0x0EU +#define NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID 0x0FU +#define NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID 0x10U /* https://datatracker.ietf.org/doc/html/rfc9221 */ -#define NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE 0x20 -#define NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT 0x2ab2 +#define NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE 0x20U +#define NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT 0x2AB2U /* https://datatracker.ietf.org/doc/html/rfc9368 */ -#define NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION 0x11 +#define NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION 0x11U /* NGTCP2_MAX_STREAMS is the maximum number of streams. */ #define NGTCP2_MAX_STREAMS (1LL << 60) diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.c index ada027b9095f..f94c6218d53d 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.c @@ -30,8 +30,11 @@ #include "ngtcp2_str.h" ngtcp2_vec *ngtcp2_vec_init(ngtcp2_vec *vec, const uint8_t *base, size_t len) { - vec->base = (uint8_t *)base; - vec->len = len; + *vec = (ngtcp2_vec){ + .base = (uint8_t *)base, + .len = len, + }; + return vec; } @@ -102,8 +105,7 @@ ngtcp2_ssize ngtcp2_vec_split(ngtcp2_vec *dst, size_t *pdstcnt, ngtcp2_vec *src, memcpy(dst, src + i, sizeof(ngtcp2_vec) * nmove); } - dst[0].len -= left; - dst[0].base += left; + ngtcp2_vec_drop(&dst[0], left); src[i].len = left; if (nmove == 0) { @@ -136,8 +138,7 @@ size_t ngtcp2_vec_merge(ngtcp2_vec *dst, size_t *pdstcnt, ngtcp2_vec *src, a->len = left; a->base = b->base; - b->len -= left; - b->base += left; + ngtcp2_vec_drop(b, left); return left; } @@ -158,13 +159,14 @@ size_t ngtcp2_vec_merge(ngtcp2_vec *dst, size_t *pdstcnt, ngtcp2_vec *src, } else if (*pdstcnt == maxcnt) { break; } else { - dst[*pdstcnt].len = left; - dst[*pdstcnt].base = b->base; + dst[*pdstcnt] = (ngtcp2_vec){ + .base = b->base, + .len = left, + }; ++*pdstcnt; } - b->len -= left; - b->base += left; + ngtcp2_vec_drop(b, left); left = 0; break; @@ -199,8 +201,10 @@ size_t ngtcp2_vec_copy_at_most(ngtcp2_vec *dst, size_t dstcnt, } if (src[i].len > left) { - dst[j].base = src[i].base; - dst[j].len = left; + dst[j] = (ngtcp2_vec){ + .base = src[i].base, + .len = left, + }; return j + 1; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.h index af9b4d644539..fe6a47a029ad 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.h @@ -110,4 +110,14 @@ static inline uint8_t *ngtcp2_vec_end(const ngtcp2_vec *v) { return v->base + v->len; } +/* + * ngtcp2_vec_drop removes the first |n| bytes from |v| by adjusting + * its base and len fields. This function assumes |v|->len > 0 && + * |v|->len >= n. + */ +static inline void ngtcp2_vec_drop(ngtcp2_vec *v, size_t n) { + v->base += n; + v->len -= n; +} + #endif /* !defined(NGTCP2_VEC_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_wf.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_wf.c new file mode 100644 index 000000000000..1adfc9ffd9ac --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_wf.c @@ -0,0 +1,81 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "ngtcp2_wf.h" + +void ngtcp2_wf_init(ngtcp2_wf *wf, uint64_t win) { + *wf = (ngtcp2_wf){ + .win = win, + }; +} + +void ngtcp2_wf_update(ngtcp2_wf *wf, uint64_t value, uint64_t ts) { + ngtcp2_wf_sample s = { + .value = value, + .ts = ts, + }; + + if (wf->samples[0].value <= value || ts - wf->samples[2].ts > wf->win) { + wf->samples[0] = wf->samples[1] = wf->samples[2] = s; + + return; + } + + if (wf->samples[1].value <= value) { + wf->samples[1] = wf->samples[2] = s; + } else if (wf->samples[2].value <= value) { + wf->samples[2] = s; + } + + if (ts - wf->samples[1].ts > wf->win) { + wf->samples[0] = wf->samples[2]; + wf->samples[1] = wf->samples[2] = s; + + return; + } + + if (ts - wf->samples[0].ts > wf->win) { + wf->samples[0] = wf->samples[1]; + wf->samples[1] = wf->samples[2]; + wf->samples[2] = s; + + return; + } + + if (wf->samples[0].value == wf->samples[1].value && + ts - wf->samples[0].ts > wf->win / 4) { + wf->samples[1] = wf->samples[2] = s; + + return; + } + + if (wf->samples[1].value == wf->samples[2].value && + ts - wf->samples[0].ts > wf->win / 2) { + wf->samples[2] = s; + } +} + +uint64_t ngtcp2_wf_get_best(const ngtcp2_wf *wf) { + return wf->samples[0].value; +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_wf.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_wf.h new file mode 100644 index 000000000000..72bdf28c8654 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_wf.h @@ -0,0 +1,55 @@ +/* + * ngtcp2 + * + * Copyright (c) 2026 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef NGTCP2_WF_H +#define NGTCP2_WF_H + +#ifdef HAVE_CONFIG_H +# include +#endif /* defined(HAVE_CONFIG_H) */ + +#include + +/* + * ngtcp2_wf implements Kathleen Nichols's windowed min/max tracking + * algorithm. + */ + +typedef struct ngtcp2_wf_sample { + uint64_t value; + uint64_t ts; +} ngtcp2_wf_sample; + +typedef struct ngtcp2_wf { + uint64_t win; + ngtcp2_wf_sample samples[3]; +} ngtcp2_wf; + +void ngtcp2_wf_init(ngtcp2_wf *wf, uint64_t win); + +void ngtcp2_wf_update(ngtcp2_wf *wf, uint64_t value, uint64_t ts); + +uint64_t ngtcp2_wf_get_best(const ngtcp2_wf *wf); + +#endif /* !defined(NGTCP2_WF_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_window_filter.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_window_filter.c deleted file mode 100644 index 39f3d408a741..000000000000 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_window_filter.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * ngtcp2 - * - * Copyright (c) 2021 ngtcp2 contributors - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * Translated to C from the original C++ code - * https://quiche.googlesource.com/quiche/+/5be974e29f7e71a196e726d6e2272676d33ab77d/quic/core/congestion_control/windowed_filter.h - * with the following license: - * - * // Copyright (c) 2016 The Chromium Authors. All rights reserved. - * // Use of this source code is governed by a BSD-style license that can be - * // found in the LICENSE file. - */ -#include "ngtcp2_window_filter.h" - -#include - -void ngtcp2_window_filter_init(ngtcp2_window_filter *wf, - uint64_t window_length) { - wf->window_length = window_length; - memset(wf->estimates, 0xff, sizeof(wf->estimates)); -} - -void ngtcp2_window_filter_update(ngtcp2_window_filter *wf, uint64_t new_sample, - uint64_t new_time) { - /* Reset all estimates if they have not yet been initialized, if new - sample is a new best, or if the newest recorded estimate is too - old. */ - if (wf->estimates[0].sample == UINT64_MAX || - new_sample > wf->estimates[0].sample || - new_time - wf->estimates[2].time > wf->window_length) { - ngtcp2_window_filter_reset(wf, new_sample, new_time); - return; - } - - if (new_sample > wf->estimates[1].sample) { - wf->estimates[1].sample = new_sample; - wf->estimates[1].time = new_time; - wf->estimates[2] = wf->estimates[1]; - } else if (new_sample > wf->estimates[2].sample) { - wf->estimates[2].sample = new_sample; - wf->estimates[2].time = new_time; - } - - /* Expire and update estimates as necessary. */ - if (new_time - wf->estimates[0].time > wf->window_length) { - /* The best estimate hasn't been updated for an entire window, so - promote second and third best estimates. */ - wf->estimates[0] = wf->estimates[1]; - wf->estimates[1] = wf->estimates[2]; - wf->estimates[2].sample = new_sample; - wf->estimates[2].time = new_time; - - /* Need to iterate one more time. Check if the new best estimate - is outside the window as well, since it may also have been - recorded a long time ago. Don't need to iterate once more - since we cover that case at the beginning of the method. */ - if (new_time - wf->estimates[0].time > wf->window_length) { - wf->estimates[0] = wf->estimates[1]; - wf->estimates[1] = wf->estimates[2]; - } - return; - } - - if (wf->estimates[1].sample == wf->estimates[0].sample && - new_time - wf->estimates[1].time > wf->window_length >> 2) { - /* A quarter of the window has passed without a better sample, so - the second-best estimate is taken from the second quarter of - the window. */ - wf->estimates[2].sample = new_sample; - wf->estimates[2].time = new_time; - wf->estimates[1] = wf->estimates[2]; - return; - } - - if (wf->estimates[2].sample == wf->estimates[1].sample && - new_time - wf->estimates[2].time > wf->window_length >> 1) { - /* We've passed a half of the window without a better estimate, so - take a third-best estimate from the second half of the - window. */ - wf->estimates[2].sample = new_sample; - wf->estimates[2].time = new_time; - } -} - -void ngtcp2_window_filter_reset(ngtcp2_window_filter *wf, uint64_t new_sample, - uint64_t new_time) { - wf->estimates[0].sample = new_sample; - wf->estimates[0].time = new_time; - wf->estimates[1] = wf->estimates[2] = wf->estimates[0]; -} - -uint64_t ngtcp2_window_filter_get_best(ngtcp2_window_filter *wf) { - return wf->estimates[0].sample; -} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_window_filter.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_window_filter.h deleted file mode 100644 index c90a9fdb9078..000000000000 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_window_filter.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * ngtcp2 - * - * Copyright (c) 2021 ngtcp2 contributors - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * Translated to C from the original C++ code - * https://quiche.googlesource.com/quiche/+/5be974e29f7e71a196e726d6e2272676d33ab77d/quic/core/congestion_control/windowed_filter.h - * with the following license: - * - * // Copyright (c) 2016 The Chromium Authors. All rights reserved. - * // Use of this source code is governed by a BSD-style license that can be - * // found in the LICENSE file. - */ -#ifndef NGTCP2_WINDOW_FILTER_H -#define NGTCP2_WINDOW_FILTER_H - -#ifdef HAVE_CONFIG_H -# include -#endif /* defined(HAVE_CONFIG_H) */ - -#include - -typedef struct ngtcp2_window_filter_sample { - uint64_t sample; - uint64_t time; -} ngtcp2_window_filter_sample; - -typedef struct ngtcp2_window_filter { - uint64_t window_length; - ngtcp2_window_filter_sample estimates[3]; -} ngtcp2_window_filter; - -void ngtcp2_window_filter_init(ngtcp2_window_filter *wf, - uint64_t window_length); - -void ngtcp2_window_filter_update(ngtcp2_window_filter *wf, uint64_t new_sample, - uint64_t new_time); - -void ngtcp2_window_filter_reset(ngtcp2_window_filter *wf, uint64_t new_sample, - uint64_t new_time); - -uint64_t ngtcp2_window_filter_get_best(ngtcp2_window_filter *wf); - -#endif /* !defined(NGTCP2_WINDOW_FILTER_H) */ diff --git a/deps/ngtcp2/ngtcp2/third-party/http-parser/.mailmap b/deps/ngtcp2/ngtcp2/third-party/http-parser/.mailmap new file mode 100644 index 000000000000..278d14126372 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/http-parser/.mailmap @@ -0,0 +1,8 @@ +# update AUTHORS with: +# git log --all --reverse --format='%aN <%aE>' | perl -ne 'BEGIN{print "# Authors ordered by first contribution.\n"} print unless $h{$_}; $h{$_} = 1' > AUTHORS +Ryan Dahl +Salman Haq +Simon Zimmermann +Thomas LE ROUX LE ROUX Thomas +Thomas LE ROUX Thomas LE ROUX +Fedor Indutny diff --git a/deps/ngtcp2/ngtcp2/third-party/http-parser/.travis.yml b/deps/ngtcp2/ngtcp2/third-party/http-parser/.travis.yml new file mode 100644 index 000000000000..4b038e6e62d6 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/http-parser/.travis.yml @@ -0,0 +1,13 @@ +language: c + +compiler: + - clang + - gcc + +script: + - "make" + +notifications: + email: false + irc: + - "irc.freenode.net#node-ci" diff --git a/deps/ngtcp2/ngtcp2/third-party/http-parser/AUTHORS b/deps/ngtcp2/ngtcp2/third-party/http-parser/AUTHORS new file mode 100644 index 000000000000..5323b685caef --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/http-parser/AUTHORS @@ -0,0 +1,68 @@ +# Authors ordered by first contribution. +Ryan Dahl +Jeremy Hinegardner +Sergey Shepelev +Joe Damato +tomika +Phoenix Sol +Cliff Frey +Ewen Cheslack-Postava +Santiago Gala +Tim Becker +Jeff Terrace +Ben Noordhuis +Nathan Rajlich +Mark Nottingham +Aman Gupta +Tim Becker +Sean Cunningham +Peter Griess +Salman Haq +Cliff Frey +Jon Kolb +Fouad Mardini +Paul Querna +Felix Geisendörfer +koichik +Andre Caron +Ivo Raisr +James McLaughlin +David Gwynne +Thomas LE ROUX +Randy Rizun +Andre Louis Caron +Simon Zimmermann +Erik Dubbelboer +Martell Malone +Bertrand Paquet +BogDan Vatra +Peter Faiman +Corey Richardson +Tóth Tamás +Cam Swords +Chris Dickinson +Uli Köhler +Charlie Somerville +Patrik Stutz +Fedor Indutny +runner +Alexis Campailla +David Wragg +Vinnie Falco +Alex Butum +Rex Feng +Alex Kocharin +Mark Koopman +Helge Heß +Alexis La Goutte +George Miroshnykov +Maciej Małecki +Marc O'Morain +Jeff Pinner +Timothy J Fontaine +Akagi201 +Romain Giraud +Jay Satiro +Arne Steen +Kjell Schubert +Olivier Mengué diff --git a/deps/ngtcp2/ngtcp2/third-party/http-parser/LICENSE-MIT b/deps/ngtcp2/ngtcp2/third-party/http-parser/LICENSE-MIT new file mode 100644 index 000000000000..58010b388945 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/http-parser/LICENSE-MIT @@ -0,0 +1,23 @@ +http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright +Igor Sysoev. + +Additional changes are licensed under the same terms as NGINX and +copyright Joyent, Inc. and other Node contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/deps/ngtcp2/ngtcp2/third-party/http-parser/README.md b/deps/ngtcp2/ngtcp2/third-party/http-parser/README.md new file mode 100644 index 000000000000..439b30998d43 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/http-parser/README.md @@ -0,0 +1,246 @@ +HTTP Parser +=========== + +[![Build Status](https://api.travis-ci.org/nodejs/http-parser.svg?branch=master)](https://travis-ci.org/nodejs/http-parser) + +This is a parser for HTTP messages written in C. It parses both requests and +responses. The parser is designed to be used in performance HTTP +applications. It does not make any syscalls nor allocations, it does not +buffer data, it can be interrupted at anytime. Depending on your +architecture, it only requires about 40 bytes of data per message +stream (in a web server that is per connection). + +Features: + + * No dependencies + * Handles persistent streams (keep-alive). + * Decodes chunked encoding. + * Upgrade support + * Defends against buffer overflow attacks. + +The parser extracts the following information from HTTP messages: + + * Header fields and values + * Content-Length + * Request method + * Response status code + * Transfer-Encoding + * HTTP version + * Request URL + * Message body + + +Usage +----- + +One `http_parser` object is used per TCP connection. Initialize the struct +using `http_parser_init()` and set the callbacks. That might look something +like this for a request parser: +```c +http_parser_settings settings; +settings.on_url = my_url_callback; +settings.on_header_field = my_header_field_callback; +/* ... */ + +http_parser *parser = malloc(sizeof(http_parser)); +http_parser_init(parser, HTTP_REQUEST); +parser->data = my_socket; +``` + +When data is received on the socket execute the parser and check for errors. + +```c +size_t len = 80*1024, nparsed; +char buf[len]; +ssize_t recved; + +recved = recv(fd, buf, len, 0); + +if (recved < 0) { + /* Handle error. */ +} + +/* Start up / continue the parser. + * Note we pass recved==0 to signal that EOF has been received. + */ +nparsed = http_parser_execute(parser, &settings, buf, recved); + +if (parser->upgrade) { + /* handle new protocol */ +} else if (nparsed != recved) { + /* Handle error. Usually just close the connection. */ +} +``` + +HTTP needs to know where the end of the stream is. For example, sometimes +servers send responses without Content-Length and expect the client to +consume input (for the body) until EOF. To tell http_parser about EOF, give +`0` as the fourth parameter to `http_parser_execute()`. Callbacks and errors +can still be encountered during an EOF, so one must still be prepared +to receive them. + +Scalar valued message information such as `status_code`, `method`, and the +HTTP version are stored in the parser structure. This data is only +temporally stored in `http_parser` and gets reset on each new message. If +this information is needed later, copy it out of the structure during the +`headers_complete` callback. + +The parser decodes the transfer-encoding for both requests and responses +transparently. That is, a chunked encoding is decoded before being sent to +the on_body callback. + + +The Special Problem of Upgrade +------------------------------ + +HTTP supports upgrading the connection to a different protocol. An +increasingly common example of this is the WebSocket protocol which sends +a request like + + GET /demo HTTP/1.1 + Upgrade: WebSocket + Connection: Upgrade + Host: example.com + Origin: http://example.com + WebSocket-Protocol: sample + +followed by non-HTTP data. + +(See [RFC6455](https://tools.ietf.org/html/rfc6455) for more information the +WebSocket protocol.) + +To support this, the parser will treat this as a normal HTTP message without a +body, issuing both on_headers_complete and on_message_complete callbacks. However +http_parser_execute() will stop parsing at the end of the headers and return. + +The user is expected to check if `parser->upgrade` has been set to 1 after +`http_parser_execute()` returns. Non-HTTP data begins at the buffer supplied +offset by the return value of `http_parser_execute()`. + + +Callbacks +--------- + +During the `http_parser_execute()` call, the callbacks set in +`http_parser_settings` will be executed. The parser maintains state and +never looks behind, so buffering the data is not necessary. If you need to +save certain data for later usage, you can do that from the callbacks. + +There are two types of callbacks: + +* notification `typedef int (*http_cb) (http_parser*);` + Callbacks: on_message_begin, on_headers_complete, on_message_complete. +* data `typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);` + Callbacks: (requests only) on_url, + (common) on_header_field, on_header_value, on_body; + +Callbacks must return 0 on success. Returning a non-zero value indicates +error to the parser, making it exit immediately. + +For cases where it is necessary to pass local information to/from a callback, +the `http_parser` object's `data` field can be used. +An example of such a case is when using threads to handle a socket connection, +parse a request, and then give a response over that socket. By instantiation +of a thread-local struct containing relevant data (e.g. accepted socket, +allocated memory for callbacks to write into, etc), a parser's callbacks are +able to communicate data between the scope of the thread and the scope of the +callback in a threadsafe manner. This allows http-parser to be used in +multi-threaded contexts. + +Example: +```c + typedef struct { + socket_t sock; + void* buffer; + int buf_len; + } custom_data_t; + + +int my_url_callback(http_parser* parser, const char *at, size_t length) { + /* access to thread local custom_data_t struct. + Use this access save parsed data for later use into thread local + buffer, or communicate over socket + */ + parser->data; + ... + return 0; +} + +... + +void http_parser_thread(socket_t sock) { + int nparsed = 0; + /* allocate memory for user data */ + custom_data_t *my_data = malloc(sizeof(custom_data_t)); + + /* some information for use by callbacks. + * achieves thread -> callback information flow */ + my_data->sock = sock; + + /* instantiate a thread-local parser */ + http_parser *parser = malloc(sizeof(http_parser)); + http_parser_init(parser, HTTP_REQUEST); /* initialise parser */ + /* this custom data reference is accessible through the reference to the + parser supplied to callback functions */ + parser->data = my_data; + + http_parser_settings settings; /* set up callbacks */ + settings.on_url = my_url_callback; + + /* execute parser */ + nparsed = http_parser_execute(parser, &settings, buf, recved); + + ... + /* parsed information copied from callback. + can now perform action on data copied into thread-local memory from callbacks. + achieves callback -> thread information flow */ + my_data->buffer; + ... +} + +``` + +In case you parse HTTP message in chunks (i.e. `read()` request line +from socket, parse, read half headers, parse, etc) your data callbacks +may be called more than once. Http-parser guarantees that data pointer is only +valid for the lifetime of callback. You can also `read()` into a heap allocated +buffer to avoid copying memory around if this fits your application. + +Reading headers may be a tricky task if you read/parse headers partially. +Basically, you need to remember whether last header callback was field or value +and apply the following logic: + + (on_header_field and on_header_value shortened to on_h_*) + ------------------------ ------------ -------------------------------------------- + | State (prev. callback) | Callback | Description/action | + ------------------------ ------------ -------------------------------------------- + | nothing (first call) | on_h_field | Allocate new buffer and copy callback data | + | | | into it | + ------------------------ ------------ -------------------------------------------- + | value | on_h_field | New header started. | + | | | Copy current name,value buffers to headers | + | | | list and allocate new buffer for new name | + ------------------------ ------------ -------------------------------------------- + | field | on_h_field | Previous name continues. Reallocate name | + | | | buffer and append callback data to it | + ------------------------ ------------ -------------------------------------------- + | field | on_h_value | Value for current header started. Allocate | + | | | new buffer and copy callback data to it | + ------------------------ ------------ -------------------------------------------- + | value | on_h_value | Value continues. Reallocate value buffer | + | | | and append callback data to it | + ------------------------ ------------ -------------------------------------------- + + +Parsing URLs +------------ + +A simplistic zero-copy URL parser is provided as `http_parser_parse_url()`. +Users of this library may wish to use it to parse URLs constructed from +consecutive `on_url` callbacks. + +See examples of reading in headers: + +* [partial example](http://gist.github.com/155877) in C +* [from http-parser tests](https://github.com/joyent/http-parser/blob/37a0ff8/test.c#L403) in C +* [from Node library](https://github.com/joyent/node/blob/842eaf4/src/http.js#L284) in Javascript diff --git a/deps/ngtcp2/ngtcp2/third-party/http-parser/bench.c b/deps/ngtcp2/ngtcp2/third-party/http-parser/bench.c new file mode 100644 index 000000000000..5b452fa1cdb6 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/http-parser/bench.c @@ -0,0 +1,111 @@ +/* Copyright Fedor Indutny. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "http_parser.h" +#include +#include +#include +#include + +static const char data[] = + "POST /joyent/http-parser HTTP/1.1\r\n" + "Host: github.com\r\n" + "DNT: 1\r\n" + "Accept-Encoding: gzip, deflate, sdch\r\n" + "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n" + "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/39.0.2171.65 Safari/537.36\r\n" + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9," + "image/webp,*/*;q=0.8\r\n" + "Referer: https://github.com/joyent/http-parser\r\n" + "Connection: keep-alive\r\n" + "Transfer-Encoding: chunked\r\n" + "Cache-Control: max-age=0\r\n\r\nb\r\nhello world\r\n0\r\n\r\n"; +static const size_t data_len = sizeof(data) - 1; + +static int on_info(http_parser* p) { + return 0; +} + + +static int on_data(http_parser* p, const char *at, size_t length) { + return 0; +} + +static http_parser_settings settings = { + .on_message_begin = on_info, + .on_headers_complete = on_info, + .on_message_complete = on_info, + .on_header_field = on_data, + .on_header_value = on_data, + .on_url = on_data, + .on_status = on_data, + .on_body = on_data +}; + +int bench(int iter_count, int silent) { + struct http_parser parser; + int i; + int err; + struct timeval start; + struct timeval end; + float rps; + + if (!silent) { + err = gettimeofday(&start, NULL); + assert(err == 0); + } + + for (i = 0; i < iter_count; i++) { + size_t parsed; + http_parser_init(&parser, HTTP_REQUEST); + + parsed = http_parser_execute(&parser, &settings, data, data_len); + assert(parsed == data_len); + } + + if (!silent) { + err = gettimeofday(&end, NULL); + assert(err == 0); + + fprintf(stdout, "Benchmark result:\n"); + + rps = (float) (end.tv_sec - start.tv_sec) + + (end.tv_usec - start.tv_usec) * 1e-6f; + fprintf(stdout, "Took %f seconds to run\n", rps); + + rps = (float) iter_count / rps; + fprintf(stdout, "%f req/sec\n", rps); + fflush(stdout); + } + + return 0; +} + +int main(int argc, char** argv) { + if (argc == 2 && strcmp(argv[1], "infinite") == 0) { + for (;;) + bench(5000000, 1); + return 0; + } else { + return bench(5000000, 0); + } +} diff --git a/deps/ngtcp2/ngtcp2/third-party/http-parser/contrib/parsertrace.c b/deps/ngtcp2/ngtcp2/third-party/http-parser/contrib/parsertrace.c new file mode 100644 index 000000000000..e7153680f467 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/http-parser/contrib/parsertrace.c @@ -0,0 +1,160 @@ +/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev + * + * Additional changes are licensed under the same terms as NGINX and + * copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* Dump what the parser finds to stdout as it happen */ + +#include "http_parser.h" +#include +#include +#include + +int on_message_begin(http_parser* _) { + (void)_; + printf("\n***MESSAGE BEGIN***\n\n"); + return 0; +} + +int on_headers_complete(http_parser* _) { + (void)_; + printf("\n***HEADERS COMPLETE***\n\n"); + return 0; +} + +int on_message_complete(http_parser* _) { + (void)_; + printf("\n***MESSAGE COMPLETE***\n\n"); + return 0; +} + +int on_url(http_parser* _, const char* at, size_t length) { + (void)_; + printf("Url: %.*s\n", (int)length, at); + return 0; +} + +int on_header_field(http_parser* _, const char* at, size_t length) { + (void)_; + printf("Header field: %.*s\n", (int)length, at); + return 0; +} + +int on_header_value(http_parser* _, const char* at, size_t length) { + (void)_; + printf("Header value: %.*s\n", (int)length, at); + return 0; +} + +int on_body(http_parser* _, const char* at, size_t length) { + (void)_; + printf("Body: %.*s\n", (int)length, at); + return 0; +} + +void usage(const char* name) { + fprintf(stderr, + "Usage: %s $type $filename\n" + " type: -x, where x is one of {r,b,q}\n" + " parses file as a Response, reQuest, or Both\n", + name); + exit(EXIT_FAILURE); +} + +int main(int argc, char* argv[]) { + enum http_parser_type file_type; + + if (argc != 3) { + usage(argv[0]); + } + + char* type = argv[1]; + if (type[0] != '-') { + usage(argv[0]); + } + + switch (type[1]) { + /* in the case of "-", type[1] will be NUL */ + case 'r': + file_type = HTTP_RESPONSE; + break; + case 'q': + file_type = HTTP_REQUEST; + break; + case 'b': + file_type = HTTP_BOTH; + break; + default: + usage(argv[0]); + } + + char* filename = argv[2]; + FILE* file = fopen(filename, "r"); + if (file == NULL) { + perror("fopen"); + goto fail; + } + + fseek(file, 0, SEEK_END); + long file_length = ftell(file); + if (file_length == -1) { + perror("ftell"); + goto fail; + } + fseek(file, 0, SEEK_SET); + + char* data = malloc(file_length); + if (fread(data, 1, file_length, file) != (size_t)file_length) { + fprintf(stderr, "couldn't read entire file\n"); + free(data); + goto fail; + } + + http_parser_settings settings; + memset(&settings, 0, sizeof(settings)); + settings.on_message_begin = on_message_begin; + settings.on_url = on_url; + settings.on_header_field = on_header_field; + settings.on_header_value = on_header_value; + settings.on_headers_complete = on_headers_complete; + settings.on_body = on_body; + settings.on_message_complete = on_message_complete; + + http_parser parser; + http_parser_init(&parser, file_type); + size_t nparsed = http_parser_execute(&parser, &settings, data, file_length); + free(data); + + if (nparsed != (size_t)file_length) { + fprintf(stderr, + "Error: %s (%s)\n", + http_errno_description(HTTP_PARSER_ERRNO(&parser)), + http_errno_name(HTTP_PARSER_ERRNO(&parser))); + goto fail; + } + + return EXIT_SUCCESS; + +fail: + fclose(file); + return EXIT_FAILURE; +} diff --git a/deps/ngtcp2/ngtcp2/third-party/http-parser/contrib/url_parser.c b/deps/ngtcp2/ngtcp2/third-party/http-parser/contrib/url_parser.c new file mode 100644 index 000000000000..f235bed9e483 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/http-parser/contrib/url_parser.c @@ -0,0 +1,47 @@ +#include "http_parser.h" +#include +#include + +void +dump_url (const char *url, const struct http_parser_url *u) +{ + unsigned int i; + + printf("\tfield_set: 0x%x, port: %u\n", u->field_set, u->port); + for (i = 0; i < UF_MAX; i++) { + if ((u->field_set & (1 << i)) == 0) { + printf("\tfield_data[%u]: unset\n", i); + continue; + } + + printf("\tfield_data[%u]: off: %u, len: %u, part: %.*s\n", + i, + u->field_data[i].off, + u->field_data[i].len, + u->field_data[i].len, + url + u->field_data[i].off); + } +} + +int main(int argc, char ** argv) { + struct http_parser_url u; + int len, connect, result; + + if (argc != 3) { + printf("Syntax : %s connect|get url\n", argv[0]); + return 1; + } + len = strlen(argv[2]); + connect = strcmp("connect", argv[1]) == 0 ? 1 : 0; + printf("Parsing %s, connect %d\n", argv[2], connect); + + http_parser_url_init(&u); + result = http_parser_parse_url(argv[2], len, connect, &u); + if (result != 0) { + printf("Parse error : %d\n", result); + return result; + } + printf("Parse ok, result : \n"); + dump_url(argv[2], &u); + return 0; +} diff --git a/deps/ngtcp2/ngtcp2/third-party/http-parser/http_parser.c b/deps/ngtcp2/ngtcp2/third-party/http-parser/http_parser.c new file mode 100644 index 000000000000..0cc16cb69423 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/http-parser/http_parser.c @@ -0,0 +1,2419 @@ +/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev + * + * Additional changes are licensed under the same terms as NGINX and + * copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "http_parser.h" +#include +#include +#include +#include +#include +#include + +#ifndef ULLONG_MAX +# define ULLONG_MAX ((uint64_t) -1) /* 2^64-1 */ +#endif + +#ifndef MIN +# define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef ARRAY_SIZE +# define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +#endif + +#ifndef BIT_AT +# define BIT_AT(a, i) \ + (!!((unsigned int) (a)[(unsigned int) (i) >> 3] & \ + (1 << ((unsigned int) (i) & 7)))) +#endif + +#ifndef ELEM_AT +# define ELEM_AT(a, i, v) ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v)) +#endif + +#define SET_ERRNO(e) \ +do { \ + parser->http_errno = (e); \ +} while(0) + +#define CURRENT_STATE() p_state +#define UPDATE_STATE(V) p_state = (enum state) (V); +#define RETURN(V) \ +do { \ + parser->state = CURRENT_STATE(); \ + return (V); \ +} while (0); +#define REEXECUTE() \ + goto reexecute; \ + + +#ifdef __GNUC__ +# define LIKELY(X) __builtin_expect(!!(X), 1) +# define UNLIKELY(X) __builtin_expect(!!(X), 0) +#else +# define LIKELY(X) (X) +# define UNLIKELY(X) (X) +#endif + + +/* Run the notify callback FOR, returning ER if it fails */ +#define CALLBACK_NOTIFY_(FOR, ER) \ +do { \ + assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ + \ + if (LIKELY(settings->on_##FOR)) { \ + parser->state = CURRENT_STATE(); \ + if (UNLIKELY(0 != settings->on_##FOR(parser))) { \ + SET_ERRNO(HPE_CB_##FOR); \ + } \ + UPDATE_STATE(parser->state); \ + \ + /* We either errored above or got paused; get out */ \ + if (UNLIKELY(HTTP_PARSER_ERRNO(parser) != HPE_OK)) { \ + return (ER); \ + } \ + } \ +} while (0) + +/* Run the notify callback FOR and consume the current byte */ +#define CALLBACK_NOTIFY(FOR) CALLBACK_NOTIFY_(FOR, p - data + 1) + +/* Run the notify callback FOR and don't consume the current byte */ +#define CALLBACK_NOTIFY_NOADVANCE(FOR) CALLBACK_NOTIFY_(FOR, p - data) + +/* Run data callback FOR with LEN bytes, returning ER if it fails */ +#define CALLBACK_DATA_(FOR, LEN, ER) \ +do { \ + assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ + \ + if (FOR##_mark) { \ + if (LIKELY(settings->on_##FOR)) { \ + parser->state = CURRENT_STATE(); \ + if (UNLIKELY(0 != \ + settings->on_##FOR(parser, FOR##_mark, (LEN)))) { \ + SET_ERRNO(HPE_CB_##FOR); \ + } \ + UPDATE_STATE(parser->state); \ + \ + /* We either errored above or got paused; get out */ \ + if (UNLIKELY(HTTP_PARSER_ERRNO(parser) != HPE_OK)) { \ + return (ER); \ + } \ + } \ + FOR##_mark = NULL; \ + } \ +} while (0) + +/* Run the data callback FOR and consume the current byte */ +#define CALLBACK_DATA(FOR) \ + CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1) + +/* Run the data callback FOR and don't consume the current byte */ +#define CALLBACK_DATA_NOADVANCE(FOR) \ + CALLBACK_DATA_(FOR, p - FOR##_mark, p - data) + +/* Set the mark FOR; non-destructive if mark is already set */ +#define MARK(FOR) \ +do { \ + if (!FOR##_mark) { \ + FOR##_mark = p; \ + } \ +} while (0) + +/* Don't allow the total size of the HTTP headers (including the status + * line) to exceed HTTP_MAX_HEADER_SIZE. This check is here to protect + * embedders against denial-of-service attacks where the attacker feeds + * us a never-ending header that the embedder keeps buffering. + * + * This check is arguably the responsibility of embedders but we're doing + * it on the embedder's behalf because most won't bother and this way we + * make the web a little safer. HTTP_MAX_HEADER_SIZE is still far bigger + * than any reasonable request or response so this should never affect + * day-to-day operation. + */ +#define COUNT_HEADER_SIZE(V) \ +do { \ + parser->nread += (V); \ + if (UNLIKELY(parser->nread > (HTTP_MAX_HEADER_SIZE))) { \ + SET_ERRNO(HPE_HEADER_OVERFLOW); \ + goto error; \ + } \ +} while (0) + + +#define PROXY_CONNECTION "proxy-connection" +#define CONNECTION "connection" +#define CONTENT_LENGTH "content-length" +#define TRANSFER_ENCODING "transfer-encoding" +#define UPGRADE "upgrade" +#define CHUNKED "chunked" +#define KEEP_ALIVE "keep-alive" +#define CLOSE "close" + + +static const char *method_strings[] = + { +#define XX(num, name, string) #string, + HTTP_METHOD_MAP(XX) +#undef XX + }; + + +/* Tokens as defined by rfc 2616. Also lowercases them. + * token = 1* + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + */ +static const char tokens[256] = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + 0, '!', 0, '#', '$', '%', '&', '\'', +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + 0, 0, '*', '+', 0, '-', '.', 0, +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + '0', '1', '2', '3', '4', '5', '6', '7', +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + '8', '9', 0, 0, 0, 0, 0, 0, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + 'x', 'y', 'z', 0, 0, 0, '^', '_', +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + 'x', 'y', 'z', 0, '|', 0, '~', 0 }; + + +static const int8_t unhex[256] = + {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + }; + + +#if HTTP_PARSER_STRICT +# define T(v) 0 +#else +# define T(v) v +#endif + + +static const uint8_t normal_url_char[32] = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + 0 | T(2) | 0 | 0 | T(16) | 0 | 0 | 0, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + 0 | 2 | 4 | 0 | 16 | 32 | 64 | 128, +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, }; + +#undef T + +enum state + { s_dead = 1 /* important that this is > 0 */ + + , s_start_req_or_res + , s_res_or_resp_H + , s_start_res + , s_res_H + , s_res_HT + , s_res_HTT + , s_res_HTTP + , s_res_http_major + , s_res_http_dot + , s_res_http_minor + , s_res_http_end + , s_res_first_status_code + , s_res_status_code + , s_res_status_start + , s_res_status + , s_res_line_almost_done + + , s_start_req + + , s_req_method + , s_req_spaces_before_url + , s_req_schema + , s_req_schema_slash + , s_req_schema_slash_slash + , s_req_server_start + , s_req_server + , s_req_server_with_at + , s_req_path + , s_req_query_string_start + , s_req_query_string + , s_req_fragment_start + , s_req_fragment + , s_req_http_start + , s_req_http_H + , s_req_http_HT + , s_req_http_HTT + , s_req_http_HTTP + , s_req_http_major + , s_req_http_dot + , s_req_http_minor + , s_req_http_end + , s_req_line_almost_done + + , s_header_field_start + , s_header_field + , s_header_value_discard_ws + , s_header_value_discard_ws_almost_done + , s_header_value_discard_lws + , s_header_value_start + , s_header_value + , s_header_value_lws + + , s_header_almost_done + + , s_chunk_size_start + , s_chunk_size + , s_chunk_parameters + , s_chunk_size_almost_done + + , s_headers_almost_done + , s_headers_done + + /* Important: 's_headers_done' must be the last 'header' state. All + * states beyond this must be 'body' states. It is used for overflow + * checking. See the PARSING_HEADER() macro. + */ + + , s_chunk_data + , s_chunk_data_almost_done + , s_chunk_data_done + + , s_body_identity + , s_body_identity_eof + + , s_message_done + }; + + +#define PARSING_HEADER(state) (state <= s_headers_done) + + +enum header_states + { h_general = 0 + , h_C + , h_CO + , h_CON + + , h_matching_connection + , h_matching_proxy_connection + , h_matching_content_length + , h_matching_transfer_encoding + , h_matching_upgrade + + , h_connection + , h_content_length + , h_transfer_encoding + , h_upgrade + + , h_matching_transfer_encoding_chunked + , h_matching_connection_token_start + , h_matching_connection_keep_alive + , h_matching_connection_close + , h_matching_connection_upgrade + , h_matching_connection_token + + , h_transfer_encoding_chunked + , h_connection_keep_alive + , h_connection_close + , h_connection_upgrade + }; + +enum http_host_state + { + s_http_host_dead = 1 + , s_http_userinfo_start + , s_http_userinfo + , s_http_host_start + , s_http_host_v6_start + , s_http_host + , s_http_host_v6 + , s_http_host_v6_end + , s_http_host_v6_zone_start + , s_http_host_v6_zone + , s_http_host_port_start + , s_http_host_port +}; + +/* Macros for character classes; depends on strict-mode */ +#define CR '\r' +#define LF '\n' +#define LOWER(c) (unsigned char)(c | 0x20) +#define IS_ALPHA(c) (LOWER(c) >= 'a' && LOWER(c) <= 'z') +#define IS_NUM(c) ((c) >= '0' && (c) <= '9') +#define IS_ALPHANUM(c) (IS_ALPHA(c) || IS_NUM(c)) +#define IS_HEX(c) (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f')) +#define IS_MARK(c) ((c) == '-' || (c) == '_' || (c) == '.' || \ + (c) == '!' || (c) == '~' || (c) == '*' || (c) == '\'' || (c) == '(' || \ + (c) == ')') +#define IS_USERINFO_CHAR(c) (IS_ALPHANUM(c) || IS_MARK(c) || (c) == '%' || \ + (c) == ';' || (c) == ':' || (c) == '&' || (c) == '=' || (c) == '+' || \ + (c) == '$' || (c) == ',') + +#define STRICT_TOKEN(c) (tokens[(unsigned char)c]) + +#if HTTP_PARSER_STRICT +#define TOKEN(c) (tokens[(unsigned char)c]) +#define IS_URL_CHAR(c) (BIT_AT(normal_url_char, (unsigned char)c)) +#define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-') +#else +#define TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c]) +#define IS_URL_CHAR(c) \ + (BIT_AT(normal_url_char, (unsigned char)c) || ((c) & 0x80)) +#define IS_HOST_CHAR(c) \ + (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_') +#endif + +/** + * Verify that a char is a valid visible (printable) US-ASCII + * character or %x80-FF + **/ +#define IS_HEADER_CHAR(ch) \ + (ch == CR || ch == LF || ch == 9 || ((unsigned char)ch > 31 && ch != 127)) + +#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res) + + +#if HTTP_PARSER_STRICT +# define STRICT_CHECK(cond) \ +do { \ + if (cond) { \ + SET_ERRNO(HPE_STRICT); \ + goto error; \ + } \ +} while (0) +# define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead) +#else +# define STRICT_CHECK(cond) +# define NEW_MESSAGE() start_state +#endif + + +/* Map errno values to strings for human-readable output */ +#define HTTP_STRERROR_GEN(n, s) { "HPE_" #n, s }, +static struct { + const char *name; + const char *description; +} http_strerror_tab[] = { + HTTP_ERRNO_MAP(HTTP_STRERROR_GEN) +}; +#undef HTTP_STRERROR_GEN + +int http_message_needs_eof(const http_parser *parser); + +/* Our URL parser. + * + * This is designed to be shared by http_parser_execute() for URL validation, + * hence it has a state transition + byte-for-byte interface. In addition, it + * is meant to be embedded in http_parser_parse_url(), which does the dirty + * work of turning state transitions URL components for its API. + * + * This function should only be invoked with non-space characters. It is + * assumed that the caller cares about (and can detect) the transition between + * URL and non-URL states by looking for these. + */ +static enum state +parse_url_char(enum state s, const char ch) +{ + if (ch == ' ' || ch == '\r' || ch == '\n') { + return s_dead; + } + +#if HTTP_PARSER_STRICT + if (ch == '\t' || ch == '\f') { + return s_dead; + } +#endif + + switch (s) { + case s_req_spaces_before_url: + /* Proxied requests are followed by scheme of an absolute URI (alpha). + * All methods except CONNECT are followed by '/' or '*'. + */ + + if (ch == '/' || ch == '*') { + return s_req_path; + } + + if (IS_ALPHA(ch)) { + return s_req_schema; + } + + break; + + case s_req_schema: + if (IS_ALPHA(ch)) { + return s; + } + + if (ch == ':') { + return s_req_schema_slash; + } + + break; + + case s_req_schema_slash: + if (ch == '/') { + return s_req_schema_slash_slash; + } + + break; + + case s_req_schema_slash_slash: + if (ch == '/') { + return s_req_server_start; + } + + break; + + case s_req_server_with_at: + if (ch == '@') { + return s_dead; + } + + /* FALLTHROUGH */ + case s_req_server_start: + case s_req_server: + if (ch == '/') { + return s_req_path; + } + + if (ch == '?') { + return s_req_query_string_start; + } + + if (ch == '@') { + return s_req_server_with_at; + } + + if (IS_USERINFO_CHAR(ch) || ch == '[' || ch == ']') { + return s_req_server; + } + + break; + + case s_req_path: + if (IS_URL_CHAR(ch)) { + return s; + } + + switch (ch) { + case '?': + return s_req_query_string_start; + + case '#': + return s_req_fragment_start; + } + + break; + + case s_req_query_string_start: + case s_req_query_string: + if (IS_URL_CHAR(ch)) { + return s_req_query_string; + } + + switch (ch) { + case '?': + /* allow extra '?' in query string */ + return s_req_query_string; + + case '#': + return s_req_fragment_start; + } + + break; + + case s_req_fragment_start: + if (IS_URL_CHAR(ch)) { + return s_req_fragment; + } + + switch (ch) { + case '?': + return s_req_fragment; + + case '#': + return s; + } + + break; + + case s_req_fragment: + if (IS_URL_CHAR(ch)) { + return s; + } + + switch (ch) { + case '?': + case '#': + return s; + } + + break; + + default: + break; + } + + /* We should never fall out of the switch above unless there's an error */ + return s_dead; +} + +size_t http_parser_execute (http_parser *parser, + const http_parser_settings *settings, + const char *data, + size_t len) +{ + char c, ch; + int8_t unhex_val; + const char *p = data; + const char *header_field_mark = 0; + const char *header_value_mark = 0; + const char *url_mark = 0; + const char *body_mark = 0; + const char *status_mark = 0; + enum state p_state = (enum state) parser->state; + const unsigned int lenient = parser->lenient_http_headers; + + /* We're in an error state. Don't bother doing anything. */ + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { + return 0; + } + + if (len == 0) { + switch (CURRENT_STATE()) { + case s_body_identity_eof: + /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if + * we got paused. + */ + CALLBACK_NOTIFY_NOADVANCE(message_complete); + return 0; + + case s_dead: + case s_start_req_or_res: + case s_start_res: + case s_start_req: + return 0; + + default: + SET_ERRNO(HPE_INVALID_EOF_STATE); + return 1; + } + } + + + if (CURRENT_STATE() == s_header_field) + header_field_mark = data; + if (CURRENT_STATE() == s_header_value) + header_value_mark = data; + switch (CURRENT_STATE()) { + case s_req_path: + case s_req_schema: + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_server_start: + case s_req_server: + case s_req_server_with_at: + case s_req_query_string_start: + case s_req_query_string: + case s_req_fragment_start: + case s_req_fragment: + url_mark = data; + break; + case s_res_status: + status_mark = data; + break; + default: + break; + } + + for (p=data; p != data + len; p++) { + ch = *p; + + if (PARSING_HEADER(CURRENT_STATE())) + COUNT_HEADER_SIZE(1); + +reexecute: + switch (CURRENT_STATE()) { + + case s_dead: + /* this state is used after a 'Connection: close' message + * the parser will error out if it reads another message + */ + if (LIKELY(ch == CR || ch == LF)) + break; + + SET_ERRNO(HPE_CLOSED_CONNECTION); + goto error; + + case s_start_req_or_res: + { + if (ch == CR || ch == LF) + break; + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + if (ch == 'H') { + UPDATE_STATE(s_res_or_resp_H); + + CALLBACK_NOTIFY(message_begin); + } else { + parser->type = HTTP_REQUEST; + UPDATE_STATE(s_start_req); + REEXECUTE(); + } + + break; + } + + case s_res_or_resp_H: + if (ch == 'T') { + parser->type = HTTP_RESPONSE; + UPDATE_STATE(s_res_HT); + } else { + if (UNLIKELY(ch != 'E')) { + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + + parser->type = HTTP_REQUEST; + parser->method = HTTP_HEAD; + parser->index = 2; + UPDATE_STATE(s_req_method); + } + break; + + case s_start_res: + { + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + switch (ch) { + case 'H': + UPDATE_STATE(s_res_H); + break; + + case CR: + case LF: + break; + + default: + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + + CALLBACK_NOTIFY(message_begin); + break; + } + + case s_res_H: + STRICT_CHECK(ch != 'T'); + UPDATE_STATE(s_res_HT); + break; + + case s_res_HT: + STRICT_CHECK(ch != 'T'); + UPDATE_STATE(s_res_HTT); + break; + + case s_res_HTT: + STRICT_CHECK(ch != 'P'); + UPDATE_STATE(s_res_HTTP); + break; + + case s_res_HTTP: + STRICT_CHECK(ch != '/'); + UPDATE_STATE(s_res_http_major); + break; + + case s_res_http_major: + if (UNLIKELY(!IS_NUM(ch))) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major = ch - '0'; + UPDATE_STATE(s_res_http_dot); + break; + + case s_res_http_dot: + { + if (UNLIKELY(ch != '.')) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + UPDATE_STATE(s_res_http_minor); + break; + } + + case s_res_http_minor: + if (UNLIKELY(!IS_NUM(ch))) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor = ch - '0'; + UPDATE_STATE(s_res_http_end); + break; + + case s_res_http_end: + { + if (UNLIKELY(ch != ' ')) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + UPDATE_STATE(s_res_first_status_code); + break; + } + + case s_res_first_status_code: + { + if (!IS_NUM(ch)) { + if (ch == ' ') { + break; + } + + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + parser->status_code = ch - '0'; + UPDATE_STATE(s_res_status_code); + break; + } + + case s_res_status_code: + { + if (!IS_NUM(ch)) { + switch (ch) { + case ' ': + UPDATE_STATE(s_res_status_start); + break; + case CR: + case LF: + UPDATE_STATE(s_res_status_start); + REEXECUTE(); + break; + default: + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + break; + } + + parser->status_code *= 10; + parser->status_code += ch - '0'; + + if (UNLIKELY(parser->status_code > 999)) { + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + + break; + } + + case s_res_status_start: + { + MARK(status); + UPDATE_STATE(s_res_status); + parser->index = 0; + + if (ch == CR || ch == LF) + REEXECUTE(); + + break; + } + + case s_res_status: + if (ch == CR) { + UPDATE_STATE(s_res_line_almost_done); + CALLBACK_DATA(status); + break; + } + + if (ch == LF) { + UPDATE_STATE(s_header_field_start); + CALLBACK_DATA(status); + break; + } + + break; + + case s_res_line_almost_done: + STRICT_CHECK(ch != LF); + UPDATE_STATE(s_header_field_start); + break; + + case s_start_req: + { + if (ch == CR || ch == LF) + break; + parser->flags = 0; + parser->content_length = ULLONG_MAX; + + if (UNLIKELY(!IS_ALPHA(ch))) { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + parser->method = (enum http_method) 0; + parser->index = 1; + switch (ch) { + case 'A': parser->method = HTTP_ACL; break; + case 'B': parser->method = HTTP_BIND; break; + case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break; + case 'D': parser->method = HTTP_DELETE; break; + case 'G': parser->method = HTTP_GET; break; + case 'H': parser->method = HTTP_HEAD; break; + case 'L': parser->method = HTTP_LOCK; /* or LINK */ break; + case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH, MKCALENDAR */ break; + case 'N': parser->method = HTTP_NOTIFY; break; + case 'O': parser->method = HTTP_OPTIONS; break; + case 'P': parser->method = HTTP_POST; + /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */ + break; + case 'R': parser->method = HTTP_REPORT; /* or REBIND */ break; + case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break; + case 'T': parser->method = HTTP_TRACE; break; + case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE, UNBIND, UNLINK */ break; + default: + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + UPDATE_STATE(s_req_method); + + CALLBACK_NOTIFY(message_begin); + + break; + } + + case s_req_method: + { + const char *matcher; + if (UNLIKELY(ch == '\0')) { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + matcher = method_strings[parser->method]; + if (ch == ' ' && matcher[parser->index] == '\0') { + UPDATE_STATE(s_req_spaces_before_url); + } else if (ch == matcher[parser->index]) { + ; /* nada */ + } else if ((ch >= 'A' && ch <= 'Z') || ch == '-') { + + switch (parser->method << 16 | parser->index << 8 | ch) { +#define XX(meth, pos, ch, new_meth) \ + case (HTTP_##meth << 16 | pos << 8 | ch): \ + parser->method = HTTP_##new_meth; break; + + XX(POST, 1, 'U', PUT) + XX(POST, 1, 'A', PATCH) + XX(POST, 1, 'R', PROPFIND) + XX(PUT, 2, 'R', PURGE) + XX(CONNECT, 1, 'H', CHECKOUT) + XX(CONNECT, 2, 'P', COPY) + XX(MKCOL, 1, 'O', MOVE) + XX(MKCOL, 1, 'E', MERGE) + XX(MKCOL, 1, '-', MSEARCH) + XX(MKCOL, 2, 'A', MKACTIVITY) + XX(MKCOL, 3, 'A', MKCALENDAR) + XX(SUBSCRIBE, 1, 'E', SEARCH) + XX(REPORT, 2, 'B', REBIND) + XX(PROPFIND, 4, 'P', PROPPATCH) + XX(LOCK, 1, 'I', LINK) + XX(UNLOCK, 2, 'S', UNSUBSCRIBE) + XX(UNLOCK, 2, 'B', UNBIND) + XX(UNLOCK, 3, 'I', UNLINK) +#undef XX + default: + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + } else { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + ++parser->index; + break; + } + + case s_req_spaces_before_url: + { + if (ch == ' ') break; + + MARK(url); + if (parser->method == HTTP_CONNECT) { + UPDATE_STATE(s_req_server_start); + } + + UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch)); + if (UNLIKELY(CURRENT_STATE() == s_dead)) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + + break; + } + + case s_req_schema: + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_server_start: + { + switch (ch) { + /* No whitespace allowed here */ + case ' ': + case CR: + case LF: + SET_ERRNO(HPE_INVALID_URL); + goto error; + default: + UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch)); + if (UNLIKELY(CURRENT_STATE() == s_dead)) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + } + + break; + } + + case s_req_server: + case s_req_server_with_at: + case s_req_path: + case s_req_query_string_start: + case s_req_query_string: + case s_req_fragment_start: + case s_req_fragment: + { + switch (ch) { + case ' ': + UPDATE_STATE(s_req_http_start); + CALLBACK_DATA(url); + break; + case CR: + case LF: + parser->http_major = 0; + parser->http_minor = 9; + CALLBACK_DATA(url); + if (ch == CR) { + UPDATE_STATE(s_req_line_almost_done); + } else { + UPDATE_STATE(s_headers_almost_done); + REEXECUTE(); + } + break; + default: + UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch)); + if (UNLIKELY(CURRENT_STATE() == s_dead)) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + } + break; + } + + case s_req_http_start: + switch (ch) { + case 'H': + UPDATE_STATE(s_req_http_H); + break; + case ' ': + break; + default: + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + break; + + case s_req_http_H: + STRICT_CHECK(ch != 'T'); + UPDATE_STATE(s_req_http_HT); + break; + + case s_req_http_HT: + STRICT_CHECK(ch != 'T'); + UPDATE_STATE(s_req_http_HTT); + break; + + case s_req_http_HTT: + STRICT_CHECK(ch != 'P'); + UPDATE_STATE(s_req_http_HTTP); + break; + + case s_req_http_HTTP: + STRICT_CHECK(ch != '/'); + UPDATE_STATE(s_req_http_major); + break; + + case s_req_http_major: + if (UNLIKELY(!IS_NUM(ch))) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major = ch - '0'; + UPDATE_STATE(s_req_http_dot); + break; + + case s_req_http_dot: + { + if (UNLIKELY(ch != '.')) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + UPDATE_STATE(s_req_http_minor); + break; + } + + case s_req_http_minor: + if (UNLIKELY(!IS_NUM(ch))) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor = ch - '0'; + UPDATE_STATE(s_req_http_end); + break; + + case s_req_http_end: + { + if (ch == CR) { + UPDATE_STATE(s_req_line_almost_done); + break; + } + + if (ch == LF) { + UPDATE_STATE(s_header_field_start); + break; + } + + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + break; + } + + /* end of request line */ + case s_req_line_almost_done: + { + if (UNLIKELY(ch != LF)) { + SET_ERRNO(HPE_LF_EXPECTED); + goto error; + } + + if (parser->http_major == 0) { + UPDATE_STATE(s_headers_almost_done); + REEXECUTE(); + } else { + UPDATE_STATE(s_header_field_start); + } + break; + } + + case s_header_field_start: + { + if (ch == CR) { + UPDATE_STATE(s_headers_almost_done); + break; + } + + if (ch == LF) { + /* they might be just sending \n instead of \r\n so this would be + * the second \n to denote the end of headers*/ + UPDATE_STATE(s_headers_almost_done); + REEXECUTE(); + } + + c = TOKEN(ch); + + if (UNLIKELY(!c)) { + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + + MARK(header_field); + + parser->index = 0; + UPDATE_STATE(s_header_field); + + switch (c) { + case 'c': + parser->header_state = h_C; + break; + + case 'p': + parser->header_state = h_matching_proxy_connection; + break; + + case 't': + parser->header_state = h_matching_transfer_encoding; + break; + + case 'u': + parser->header_state = h_matching_upgrade; + break; + + default: + parser->header_state = h_general; + break; + } + break; + } + + case s_header_field: + { + const char* start = p; + for (; p != data + len; p++) { + ch = *p; + c = TOKEN(ch); + + if (!c) + break; + + switch (parser->header_state) { + case h_general: + break; + + case h_C: + parser->index++; + parser->header_state = (c == 'o' ? h_CO : h_general); + break; + + case h_CO: + parser->index++; + parser->header_state = (c == 'n' ? h_CON : h_general); + break; + + case h_CON: + parser->index++; + switch (c) { + case 'n': + parser->header_state = h_matching_connection; + break; + case 't': + parser->header_state = h_matching_content_length; + break; + default: + parser->header_state = h_general; + break; + } + break; + + /* connection */ + + case h_matching_connection: + parser->index++; + if (parser->index > sizeof(CONNECTION)-1 + || c != CONNECTION[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CONNECTION)-2) { + parser->header_state = h_connection; + } + break; + + /* proxy-connection */ + + case h_matching_proxy_connection: + parser->index++; + if (parser->index > sizeof(PROXY_CONNECTION)-1 + || c != PROXY_CONNECTION[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(PROXY_CONNECTION)-2) { + parser->header_state = h_connection; + } + break; + + /* content-length */ + + case h_matching_content_length: + parser->index++; + if (parser->index > sizeof(CONTENT_LENGTH)-1 + || c != CONTENT_LENGTH[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CONTENT_LENGTH)-2) { + parser->header_state = h_content_length; + } + break; + + /* transfer-encoding */ + + case h_matching_transfer_encoding: + parser->index++; + if (parser->index > sizeof(TRANSFER_ENCODING)-1 + || c != TRANSFER_ENCODING[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) { + parser->header_state = h_transfer_encoding; + } + break; + + /* upgrade */ + + case h_matching_upgrade: + parser->index++; + if (parser->index > sizeof(UPGRADE)-1 + || c != UPGRADE[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(UPGRADE)-2) { + parser->header_state = h_upgrade; + } + break; + + case h_connection: + case h_content_length: + case h_transfer_encoding: + case h_upgrade: + if (ch != ' ') parser->header_state = h_general; + break; + + default: + assert(0 && "Unknown header_state"); + break; + } + } + + COUNT_HEADER_SIZE(p - start); + + if (p == data + len) { + --p; + break; + } + + if (ch == ':') { + UPDATE_STATE(s_header_value_discard_ws); + CALLBACK_DATA(header_field); + break; + } + + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + + case s_header_value_discard_ws: + if (ch == ' ' || ch == '\t') break; + + if (ch == CR) { + UPDATE_STATE(s_header_value_discard_ws_almost_done); + break; + } + + if (ch == LF) { + UPDATE_STATE(s_header_value_discard_lws); + break; + } + + /* FALLTHROUGH */ + + case s_header_value_start: + { + MARK(header_value); + + UPDATE_STATE(s_header_value); + parser->index = 0; + + c = LOWER(ch); + + switch (parser->header_state) { + case h_upgrade: + parser->flags |= F_UPGRADE; + parser->header_state = h_general; + break; + + case h_transfer_encoding: + /* looking for 'Transfer-Encoding: chunked' */ + if ('c' == c) { + parser->header_state = h_matching_transfer_encoding_chunked; + } else { + parser->header_state = h_general; + } + break; + + case h_content_length: + if (UNLIKELY(!IS_NUM(ch))) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + if (parser->flags & F_CONTENTLENGTH) { + SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH); + goto error; + } + + parser->flags |= F_CONTENTLENGTH; + parser->content_length = ch - '0'; + break; + + case h_connection: + /* looking for 'Connection: keep-alive' */ + if (c == 'k') { + parser->header_state = h_matching_connection_keep_alive; + /* looking for 'Connection: close' */ + } else if (c == 'c') { + parser->header_state = h_matching_connection_close; + } else if (c == 'u') { + parser->header_state = h_matching_connection_upgrade; + } else { + parser->header_state = h_matching_connection_token; + } + break; + + /* Multi-value `Connection` header */ + case h_matching_connection_token_start: + break; + + default: + parser->header_state = h_general; + break; + } + break; + } + + case s_header_value: + { + const char* start = p; + enum header_states h_state = (enum header_states) parser->header_state; + for (; p != data + len; p++) { + ch = *p; + if (ch == CR) { + UPDATE_STATE(s_header_almost_done); + parser->header_state = h_state; + CALLBACK_DATA(header_value); + break; + } + + if (ch == LF) { + UPDATE_STATE(s_header_almost_done); + COUNT_HEADER_SIZE(p - start); + parser->header_state = h_state; + CALLBACK_DATA_NOADVANCE(header_value); + REEXECUTE(); + } + + if (!lenient && !IS_HEADER_CHAR(ch)) { + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + + c = LOWER(ch); + + switch (h_state) { + case h_general: + { + const char* p_cr; + const char* p_lf; + size_t limit = data + len - p; + + limit = MIN(limit, HTTP_MAX_HEADER_SIZE); + + p_cr = (const char*) memchr(p, CR, limit); + p_lf = (const char*) memchr(p, LF, limit); + if (p_cr != NULL) { + if (p_lf != NULL && p_cr >= p_lf) + p = p_lf; + else + p = p_cr; + } else if (UNLIKELY(p_lf != NULL)) { + p = p_lf; + } else { + p = data + len; + } + --p; + + break; + } + + case h_connection: + case h_transfer_encoding: + assert(0 && "Shouldn't get here."); + break; + + case h_content_length: + { + uint64_t t; + + if (ch == ' ') break; + + if (UNLIKELY(!IS_NUM(ch))) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + parser->header_state = h_state; + goto error; + } + + t = parser->content_length; + t *= 10; + t += ch - '0'; + + /* Overflow? Test against a conservative limit for simplicity. */ + if (UNLIKELY((ULLONG_MAX - 10) / 10 < parser->content_length)) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + parser->header_state = h_state; + goto error; + } + + parser->content_length = t; + break; + } + + /* Transfer-Encoding: chunked */ + case h_matching_transfer_encoding_chunked: + parser->index++; + if (parser->index > sizeof(CHUNKED)-1 + || c != CHUNKED[parser->index]) { + h_state = h_general; + } else if (parser->index == sizeof(CHUNKED)-2) { + h_state = h_transfer_encoding_chunked; + } + break; + + case h_matching_connection_token_start: + /* looking for 'Connection: keep-alive' */ + if (c == 'k') { + h_state = h_matching_connection_keep_alive; + /* looking for 'Connection: close' */ + } else if (c == 'c') { + h_state = h_matching_connection_close; + } else if (c == 'u') { + h_state = h_matching_connection_upgrade; + } else if (STRICT_TOKEN(c)) { + h_state = h_matching_connection_token; + } else if (c == ' ' || c == '\t') { + /* Skip lws */ + } else { + h_state = h_general; + } + break; + + /* looking for 'Connection: keep-alive' */ + case h_matching_connection_keep_alive: + parser->index++; + if (parser->index > sizeof(KEEP_ALIVE)-1 + || c != KEEP_ALIVE[parser->index]) { + h_state = h_matching_connection_token; + } else if (parser->index == sizeof(KEEP_ALIVE)-2) { + h_state = h_connection_keep_alive; + } + break; + + /* looking for 'Connection: close' */ + case h_matching_connection_close: + parser->index++; + if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) { + h_state = h_matching_connection_token; + } else if (parser->index == sizeof(CLOSE)-2) { + h_state = h_connection_close; + } + break; + + /* looking for 'Connection: upgrade' */ + case h_matching_connection_upgrade: + parser->index++; + if (parser->index > sizeof(UPGRADE) - 1 || + c != UPGRADE[parser->index]) { + h_state = h_matching_connection_token; + } else if (parser->index == sizeof(UPGRADE)-2) { + h_state = h_connection_upgrade; + } + break; + + case h_matching_connection_token: + if (ch == ',') { + h_state = h_matching_connection_token_start; + parser->index = 0; + } + break; + + case h_transfer_encoding_chunked: + if (ch != ' ') h_state = h_general; + break; + + case h_connection_keep_alive: + case h_connection_close: + case h_connection_upgrade: + if (ch == ',') { + if (h_state == h_connection_keep_alive) { + parser->flags |= F_CONNECTION_KEEP_ALIVE; + } else if (h_state == h_connection_close) { + parser->flags |= F_CONNECTION_CLOSE; + } else if (h_state == h_connection_upgrade) { + parser->flags |= F_CONNECTION_UPGRADE; + } + h_state = h_matching_connection_token_start; + parser->index = 0; + } else if (ch != ' ') { + h_state = h_matching_connection_token; + } + break; + + default: + UPDATE_STATE(s_header_value); + h_state = h_general; + break; + } + } + parser->header_state = h_state; + + COUNT_HEADER_SIZE(p - start); + + if (p == data + len) + --p; + break; + } + + case s_header_almost_done: + { + if (UNLIKELY(ch != LF)) { + SET_ERRNO(HPE_LF_EXPECTED); + goto error; + } + + UPDATE_STATE(s_header_value_lws); + break; + } + + case s_header_value_lws: + { + if (ch == ' ' || ch == '\t') { + UPDATE_STATE(s_header_value_start); + REEXECUTE(); + } + + /* finished the header */ + switch (parser->header_state) { + case h_connection_keep_alive: + parser->flags |= F_CONNECTION_KEEP_ALIVE; + break; + case h_connection_close: + parser->flags |= F_CONNECTION_CLOSE; + break; + case h_transfer_encoding_chunked: + parser->flags |= F_CHUNKED; + break; + case h_connection_upgrade: + parser->flags |= F_CONNECTION_UPGRADE; + break; + default: + break; + } + + UPDATE_STATE(s_header_field_start); + REEXECUTE(); + } + + case s_header_value_discard_ws_almost_done: + { + STRICT_CHECK(ch != LF); + UPDATE_STATE(s_header_value_discard_lws); + break; + } + + case s_header_value_discard_lws: + { + if (ch == ' ' || ch == '\t') { + UPDATE_STATE(s_header_value_discard_ws); + break; + } else { + switch (parser->header_state) { + case h_connection_keep_alive: + parser->flags |= F_CONNECTION_KEEP_ALIVE; + break; + case h_connection_close: + parser->flags |= F_CONNECTION_CLOSE; + break; + case h_connection_upgrade: + parser->flags |= F_CONNECTION_UPGRADE; + break; + case h_transfer_encoding_chunked: + parser->flags |= F_CHUNKED; + break; + default: + break; + } + + /* header value was empty */ + MARK(header_value); + UPDATE_STATE(s_header_field_start); + CALLBACK_DATA_NOADVANCE(header_value); + REEXECUTE(); + } + } + + case s_headers_almost_done: + { + STRICT_CHECK(ch != LF); + + if (parser->flags & F_TRAILING) { + /* End of a chunked request */ + UPDATE_STATE(s_message_done); + CALLBACK_NOTIFY_NOADVANCE(chunk_complete); + REEXECUTE(); + } + + /* Cannot use chunked encoding and a content-length header together + per the HTTP specification. */ + if ((parser->flags & F_CHUNKED) && + (parser->flags & F_CONTENTLENGTH)) { + SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH); + goto error; + } + + UPDATE_STATE(s_headers_done); + + /* Set this here so that on_headers_complete() callbacks can see it */ + if ((parser->flags & F_UPGRADE) && + (parser->flags & F_CONNECTION_UPGRADE)) { + /* For responses, "Upgrade: foo" and "Connection: upgrade" are + * mandatory only when it is a 101 Switching Protocols response, + * otherwise it is purely informational, to announce support. + */ + parser->upgrade = + (parser->type == HTTP_REQUEST || parser->status_code == 101); + } else { + parser->upgrade = (parser->method == HTTP_CONNECT); + } + + /* Here we call the headers_complete callback. This is somewhat + * different than other callbacks because if the user returns 1, we + * will interpret that as saying that this message has no body. This + * is needed for the annoying case of recieving a response to a HEAD + * request. + * + * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so + * we have to simulate it by handling a change in errno below. + */ + if (settings->on_headers_complete) { + switch (settings->on_headers_complete(parser)) { + case 0: + break; + + case 2: + parser->upgrade = 1; + + /* FALLTHROUGH */ + case 1: + parser->flags |= F_SKIPBODY; + break; + + default: + SET_ERRNO(HPE_CB_headers_complete); + RETURN(p - data); /* Error */ + } + } + + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { + RETURN(p - data); + } + + REEXECUTE(); + } + + case s_headers_done: + { + int hasBody; + STRICT_CHECK(ch != LF); + + parser->nread = 0; + + hasBody = parser->flags & F_CHUNKED || + (parser->content_length > 0 && parser->content_length != ULLONG_MAX); + if (parser->upgrade && (parser->method == HTTP_CONNECT || + (parser->flags & F_SKIPBODY) || !hasBody)) { + /* Exit, the rest of the message is in a different protocol. */ + UPDATE_STATE(NEW_MESSAGE()); + CALLBACK_NOTIFY(message_complete); + RETURN((p - data) + 1); + } + + if (parser->flags & F_SKIPBODY) { + UPDATE_STATE(NEW_MESSAGE()); + CALLBACK_NOTIFY(message_complete); + } else if (parser->flags & F_CHUNKED) { + /* chunked encoding - ignore Content-Length header */ + UPDATE_STATE(s_chunk_size_start); + } else { + if (parser->content_length == 0) { + /* Content-Length header given but zero: Content-Length: 0\r\n */ + UPDATE_STATE(NEW_MESSAGE()); + CALLBACK_NOTIFY(message_complete); + } else if (parser->content_length != ULLONG_MAX) { + /* Content-Length header given and non-zero */ + UPDATE_STATE(s_body_identity); + } else { + if (!http_message_needs_eof(parser)) { + /* Assume content-length 0 - read the next */ + UPDATE_STATE(NEW_MESSAGE()); + CALLBACK_NOTIFY(message_complete); + } else { + /* Read body until EOF */ + UPDATE_STATE(s_body_identity_eof); + } + } + } + + break; + } + + case s_body_identity: + { + uint64_t to_read = MIN(parser->content_length, + (uint64_t) ((data + len) - p)); + + assert(parser->content_length != 0 + && parser->content_length != ULLONG_MAX); + + /* The difference between advancing content_length and p is because + * the latter will automaticaly advance on the next loop iteration. + * Further, if content_length ends up at 0, we want to see the last + * byte again for our message complete callback. + */ + MARK(body); + parser->content_length -= to_read; + p += to_read - 1; + + if (parser->content_length == 0) { + UPDATE_STATE(s_message_done); + + /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte. + * + * The alternative to doing this is to wait for the next byte to + * trigger the data callback, just as in every other case. The + * problem with this is that this makes it difficult for the test + * harness to distinguish between complete-on-EOF and + * complete-on-length. It's not clear that this distinction is + * important for applications, but let's keep it for now. + */ + CALLBACK_DATA_(body, p - body_mark + 1, p - data); + REEXECUTE(); + } + + break; + } + + /* read until EOF */ + case s_body_identity_eof: + MARK(body); + p = data + len - 1; + + break; + + case s_message_done: + UPDATE_STATE(NEW_MESSAGE()); + CALLBACK_NOTIFY(message_complete); + if (parser->upgrade) { + /* Exit, the rest of the message is in a different protocol. */ + RETURN((p - data) + 1); + } + break; + + case s_chunk_size_start: + { + assert(parser->nread == 1); + assert(parser->flags & F_CHUNKED); + + unhex_val = unhex[(unsigned char)ch]; + if (UNLIKELY(unhex_val == -1)) { + SET_ERRNO(HPE_INVALID_CHUNK_SIZE); + goto error; + } + + parser->content_length = unhex_val; + UPDATE_STATE(s_chunk_size); + break; + } + + case s_chunk_size: + { + uint64_t t; + + assert(parser->flags & F_CHUNKED); + + if (ch == CR) { + UPDATE_STATE(s_chunk_size_almost_done); + break; + } + + unhex_val = unhex[(unsigned char)ch]; + + if (unhex_val == -1) { + if (ch == ';' || ch == ' ') { + UPDATE_STATE(s_chunk_parameters); + break; + } + + SET_ERRNO(HPE_INVALID_CHUNK_SIZE); + goto error; + } + + t = parser->content_length; + t *= 16; + t += unhex_val; + + /* Overflow? Test against a conservative limit for simplicity. */ + if (UNLIKELY((ULLONG_MAX - 16) / 16 < parser->content_length)) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + parser->content_length = t; + break; + } + + case s_chunk_parameters: + { + assert(parser->flags & F_CHUNKED); + /* just ignore this shit. TODO check for overflow */ + if (ch == CR) { + UPDATE_STATE(s_chunk_size_almost_done); + break; + } + break; + } + + case s_chunk_size_almost_done: + { + assert(parser->flags & F_CHUNKED); + STRICT_CHECK(ch != LF); + + parser->nread = 0; + + if (parser->content_length == 0) { + parser->flags |= F_TRAILING; + UPDATE_STATE(s_header_field_start); + } else { + UPDATE_STATE(s_chunk_data); + } + CALLBACK_NOTIFY(chunk_header); + break; + } + + case s_chunk_data: + { + uint64_t to_read = MIN(parser->content_length, + (uint64_t) ((data + len) - p)); + + assert(parser->flags & F_CHUNKED); + assert(parser->content_length != 0 + && parser->content_length != ULLONG_MAX); + + /* See the explanation in s_body_identity for why the content + * length and data pointers are managed this way. + */ + MARK(body); + parser->content_length -= to_read; + p += to_read - 1; + + if (parser->content_length == 0) { + UPDATE_STATE(s_chunk_data_almost_done); + } + + break; + } + + case s_chunk_data_almost_done: + assert(parser->flags & F_CHUNKED); + assert(parser->content_length == 0); + STRICT_CHECK(ch != CR); + UPDATE_STATE(s_chunk_data_done); + CALLBACK_DATA(body); + break; + + case s_chunk_data_done: + assert(parser->flags & F_CHUNKED); + STRICT_CHECK(ch != LF); + parser->nread = 0; + UPDATE_STATE(s_chunk_size_start); + CALLBACK_NOTIFY(chunk_complete); + break; + + default: + assert(0 && "unhandled state"); + SET_ERRNO(HPE_INVALID_INTERNAL_STATE); + goto error; + } + } + + /* Run callbacks for any marks that we have leftover after we ran our of + * bytes. There should be at most one of these set, so it's OK to invoke + * them in series (unset marks will not result in callbacks). + * + * We use the NOADVANCE() variety of callbacks here because 'p' has already + * overflowed 'data' and this allows us to correct for the off-by-one that + * we'd otherwise have (since CALLBACK_DATA() is meant to be run with a 'p' + * value that's in-bounds). + */ + + assert(((header_field_mark ? 1 : 0) + + (header_value_mark ? 1 : 0) + + (url_mark ? 1 : 0) + + (body_mark ? 1 : 0) + + (status_mark ? 1 : 0)) <= 1); + + CALLBACK_DATA_NOADVANCE(header_field); + CALLBACK_DATA_NOADVANCE(header_value); + CALLBACK_DATA_NOADVANCE(url); + CALLBACK_DATA_NOADVANCE(body); + CALLBACK_DATA_NOADVANCE(status); + + RETURN(len); + +error: + if (HTTP_PARSER_ERRNO(parser) == HPE_OK) { + SET_ERRNO(HPE_UNKNOWN); + } + + RETURN(p - data); +} + + +/* Does the parser need to see an EOF to find the end of the message? */ +int +http_message_needs_eof (const http_parser *parser) +{ + if (parser->type == HTTP_REQUEST) { + return 0; + } + + /* See RFC 2616 section 4.4 */ + if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */ + parser->status_code == 204 || /* No Content */ + parser->status_code == 304 || /* Not Modified */ + parser->flags & F_SKIPBODY) { /* response to a HEAD request */ + return 0; + } + + if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) { + return 0; + } + + return 1; +} + + +int +http_should_keep_alive (const http_parser *parser) +{ + if (parser->http_major > 0 && parser->http_minor > 0) { + /* HTTP/1.1 */ + if (parser->flags & F_CONNECTION_CLOSE) { + return 0; + } + } else { + /* HTTP/1.0 or earlier */ + if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) { + return 0; + } + } + + return !http_message_needs_eof(parser); +} + + +const char * +http_method_str (enum http_method m) +{ + return ELEM_AT(method_strings, m, ""); +} + + +void +http_parser_init (http_parser *parser, enum http_parser_type t) +{ + void *data = parser->data; /* preserve application data */ + memset(parser, 0, sizeof(*parser)); + parser->data = data; + parser->type = t; + parser->state = (t == HTTP_REQUEST ? s_start_req : (t == HTTP_RESPONSE ? s_start_res : s_start_req_or_res)); + parser->http_errno = HPE_OK; +} + +void +http_parser_settings_init(http_parser_settings *settings) +{ + memset(settings, 0, sizeof(*settings)); +} + +const char * +http_errno_name(enum http_errno err) { + assert(((size_t) err) < ARRAY_SIZE(http_strerror_tab)); + return http_strerror_tab[err].name; +} + +const char * +http_errno_description(enum http_errno err) { + assert(((size_t) err) < ARRAY_SIZE(http_strerror_tab)); + return http_strerror_tab[err].description; +} + +static enum http_host_state +http_parse_host_char(enum http_host_state s, const char ch) { + switch(s) { + case s_http_userinfo: + case s_http_userinfo_start: + if (ch == '@') { + return s_http_host_start; + } + + if (IS_USERINFO_CHAR(ch)) { + return s_http_userinfo; + } + break; + + case s_http_host_start: + if (ch == '[') { + return s_http_host_v6_start; + } + + if (IS_HOST_CHAR(ch)) { + return s_http_host; + } + + break; + + case s_http_host: + if (IS_HOST_CHAR(ch)) { + return s_http_host; + } + + /* FALLTHROUGH */ + case s_http_host_v6_end: + if (ch == ':') { + return s_http_host_port_start; + } + + break; + + case s_http_host_v6: + if (ch == ']') { + return s_http_host_v6_end; + } + + /* FALLTHROUGH */ + case s_http_host_v6_start: + if (IS_HEX(ch) || ch == ':' || ch == '.') { + return s_http_host_v6; + } + + if (s == s_http_host_v6 && ch == '%') { + return s_http_host_v6_zone_start; + } + break; + + case s_http_host_v6_zone: + if (ch == ']') { + return s_http_host_v6_end; + } + + /* FALLTHROUGH */ + case s_http_host_v6_zone_start: + /* RFC 6874 Zone ID consists of 1*( unreserved / pct-encoded) */ + if (IS_ALPHANUM(ch) || ch == '%' || ch == '.' || ch == '-' || ch == '_' || + ch == '~') { + return s_http_host_v6_zone; + } + break; + + case s_http_host_port: + case s_http_host_port_start: + if (IS_NUM(ch)) { + return s_http_host_port; + } + + break; + + default: + break; + } + return s_http_host_dead; +} + +static int +http_parse_host(const char * buf, struct http_parser_url *u, int found_at) { + enum http_host_state s; + + const char *p; + size_t buflen = u->field_data[UF_HOST].off + u->field_data[UF_HOST].len; + + assert(u->field_set & (1 << UF_HOST)); + + u->field_data[UF_HOST].len = 0; + + s = found_at ? s_http_userinfo_start : s_http_host_start; + + for (p = buf + u->field_data[UF_HOST].off; p < buf + buflen; p++) { + enum http_host_state new_s = http_parse_host_char(s, *p); + + if (new_s == s_http_host_dead) { + return 1; + } + + switch(new_s) { + case s_http_host: + if (s != s_http_host) { + u->field_data[UF_HOST].off = p - buf; + } + u->field_data[UF_HOST].len++; + break; + + case s_http_host_v6: + if (s != s_http_host_v6) { + u->field_data[UF_HOST].off = p - buf; + } + u->field_data[UF_HOST].len++; + break; + + case s_http_host_v6_zone_start: + case s_http_host_v6_zone: + u->field_data[UF_HOST].len++; + break; + + case s_http_host_port: + if (s != s_http_host_port) { + u->field_data[UF_PORT].off = p - buf; + u->field_data[UF_PORT].len = 0; + u->field_set |= (1 << UF_PORT); + } + u->field_data[UF_PORT].len++; + break; + + case s_http_userinfo: + if (s != s_http_userinfo) { + u->field_data[UF_USERINFO].off = p - buf ; + u->field_data[UF_USERINFO].len = 0; + u->field_set |= (1 << UF_USERINFO); + } + u->field_data[UF_USERINFO].len++; + break; + + default: + break; + } + s = new_s; + } + + /* Make sure we don't end somewhere unexpected */ + switch (s) { + case s_http_host_start: + case s_http_host_v6_start: + case s_http_host_v6: + case s_http_host_v6_zone_start: + case s_http_host_v6_zone: + case s_http_host_port_start: + case s_http_userinfo: + case s_http_userinfo_start: + return 1; + default: + break; + } + + return 0; +} + +void +http_parser_url_init(struct http_parser_url *u) { + memset(u, 0, sizeof(*u)); +} + +int +http_parser_parse_url(const char *buf, size_t buflen, int is_connect, + struct http_parser_url *u) +{ + enum state s; + const char *p; + enum http_parser_url_fields uf, old_uf; + int found_at = 0; + + u->port = u->field_set = 0; + s = is_connect ? s_req_server_start : s_req_spaces_before_url; + old_uf = UF_MAX; + + for (p = buf; p < buf + buflen; p++) { + s = parse_url_char(s, *p); + + /* Figure out the next field that we're operating on */ + switch (s) { + case s_dead: + return 1; + + /* Skip delimeters */ + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_server_start: + case s_req_query_string_start: + case s_req_fragment_start: + continue; + + case s_req_schema: + uf = UF_SCHEMA; + break; + + case s_req_server_with_at: + found_at = 1; + + /* FALLTHROUGH */ + case s_req_server: + uf = UF_HOST; + break; + + case s_req_path: + uf = UF_PATH; + break; + + case s_req_query_string: + uf = UF_QUERY; + break; + + case s_req_fragment: + uf = UF_FRAGMENT; + break; + + default: + assert(!"Unexpected state"); + return 1; + } + + /* Nothing's changed; soldier on */ + if (uf == old_uf) { + u->field_data[uf].len++; + continue; + } + + u->field_data[uf].off = p - buf; + u->field_data[uf].len = 1; + + u->field_set |= (1 << uf); + old_uf = uf; + } + + /* host must be present if there is a schema */ + /* parsing http:///toto will fail */ + if ((u->field_set & (1 << UF_SCHEMA)) && + (u->field_set & (1 << UF_HOST)) == 0) { + return 1; + } + + if (u->field_set & (1 << UF_HOST)) { + if (http_parse_host(buf, u, found_at) != 0) { + return 1; + } + } + + /* CONNECT requests can only contain "hostname:port" */ + if (is_connect && u->field_set != ((1 << UF_HOST)|(1 << UF_PORT))) { + return 1; + } + + if (u->field_set & (1 << UF_PORT)) { + /* Don't bother with endp; we've already validated the string */ + unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10); + + /* Ports have a max value of 2^16 */ + if (v > 0xffff) { + return 1; + } + + u->port = (uint16_t) v; + } + + return 0; +} + +void +http_parser_pause(http_parser *parser, int paused) { + /* Users should only be pausing/unpausing a parser that is not in an error + * state. In non-debug builds, there's not much that we can do about this + * other than ignore it. + */ + if (HTTP_PARSER_ERRNO(parser) == HPE_OK || + HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) { + SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK); + } else { + assert(0 && "Attempting to pause parser in error state"); + } +} + +int +http_body_is_final(const struct http_parser *parser) { + return parser->state == s_message_done; +} + +unsigned long +http_parser_version(void) { + return HTTP_PARSER_VERSION_MAJOR * 0x10000 | + HTTP_PARSER_VERSION_MINOR * 0x00100 | + HTTP_PARSER_VERSION_PATCH * 0x00001; +} diff --git a/deps/ngtcp2/ngtcp2/third-party/http-parser/http_parser.gyp b/deps/ngtcp2/ngtcp2/third-party/http-parser/http_parser.gyp new file mode 100644 index 000000000000..ef34ecaeaeab --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/http-parser/http_parser.gyp @@ -0,0 +1,111 @@ +# This file is used with the GYP meta build system. +# http://code.google.com/p/gyp/ +# To build try this: +# svn co http://gyp.googlecode.com/svn/trunk gyp +# ./gyp/gyp -f make --depth=`pwd` http_parser.gyp +# ./out/Debug/test +{ + 'target_defaults': { + 'default_configuration': 'Debug', + 'configurations': { + # TODO: hoist these out and put them somewhere common, because + # RuntimeLibrary MUST MATCH across the entire project + 'Debug': { + 'defines': [ 'DEBUG', '_DEBUG' ], + 'cflags': [ '-Wall', '-Wextra', '-O0', '-g', '-ftrapv' ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 1, # static debug + }, + }, + }, + 'Release': { + 'defines': [ 'NDEBUG' ], + 'cflags': [ '-Wall', '-Wextra', '-O3' ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 0, # static release + }, + }, + } + }, + 'msvs_settings': { + 'VCCLCompilerTool': { + }, + 'VCLibrarianTool': { + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + }, + 'conditions': [ + ['OS == "win"', { + 'defines': [ + 'WIN32' + ], + }] + ], + }, + + 'targets': [ + { + 'target_name': 'http_parser', + 'type': 'static_library', + 'include_dirs': [ '.' ], + 'direct_dependent_settings': { + 'defines': [ 'HTTP_PARSER_STRICT=0' ], + 'include_dirs': [ '.' ], + }, + 'defines': [ 'HTTP_PARSER_STRICT=0' ], + 'sources': [ './http_parser.c', ], + 'conditions': [ + ['OS=="win"', { + 'msvs_settings': { + 'VCCLCompilerTool': { + # Compile as C++. http_parser.c is actually C99, but C++ is + # close enough in this case. + 'CompileAs': 2, + }, + }, + }] + ], + }, + + { + 'target_name': 'http_parser_strict', + 'type': 'static_library', + 'include_dirs': [ '.' ], + 'direct_dependent_settings': { + 'defines': [ 'HTTP_PARSER_STRICT=1' ], + 'include_dirs': [ '.' ], + }, + 'defines': [ 'HTTP_PARSER_STRICT=1' ], + 'sources': [ './http_parser.c', ], + 'conditions': [ + ['OS=="win"', { + 'msvs_settings': { + 'VCCLCompilerTool': { + # Compile as C++. http_parser.c is actually C99, but C++ is + # close enough in this case. + 'CompileAs': 2, + }, + }, + }] + ], + }, + + { + 'target_name': 'test-nonstrict', + 'type': 'executable', + 'dependencies': [ 'http_parser' ], + 'sources': [ 'test.c' ] + }, + + { + 'target_name': 'test-strict', + 'type': 'executable', + 'dependencies': [ 'http_parser_strict' ], + 'sources': [ 'test.c' ] + } + ] +} diff --git a/deps/ngtcp2/ngtcp2/third-party/http-parser/http_parser.h b/deps/ngtcp2/ngtcp2/third-party/http-parser/http_parser.h new file mode 100644 index 000000000000..fd2a564148be --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/http-parser/http_parser.h @@ -0,0 +1,431 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#ifndef http_parser_h +#define http_parser_h +#ifdef __cplusplus +extern "C" { +#endif + +/* Also update SONAME in the Makefile whenever you change these. */ +#define HTTP_PARSER_VERSION_MAJOR 2 +#define HTTP_PARSER_VERSION_MINOR 7 +#define HTTP_PARSER_VERSION_PATCH 1 + +#include +#if defined(_WIN32) && !defined(__MINGW32__) && \ + (!defined(_MSC_VER) || _MSC_VER<1600) && !defined(__WINE__) +#include +typedef __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +#include +#endif + +/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run + * faster + */ +#ifndef HTTP_PARSER_STRICT +# define HTTP_PARSER_STRICT 1 +#endif + +/* Maximium header size allowed. If the macro is not defined + * before including this header then the default is used. To + * change the maximum header size, define the macro in the build + * environment (e.g. -DHTTP_MAX_HEADER_SIZE=). To remove + * the effective limit on the size of the header, define the macro + * to a very large number (e.g. -DHTTP_MAX_HEADER_SIZE=0x7fffffff) + */ +#ifndef HTTP_MAX_HEADER_SIZE +# define HTTP_MAX_HEADER_SIZE (80*1024) +#endif + +typedef struct http_parser http_parser; +typedef struct http_parser_settings http_parser_settings; + + +/* Callbacks should return non-zero to indicate an error. The parser will + * then halt execution. + * + * The one exception is on_headers_complete. In a HTTP_RESPONSE parser + * returning '1' from on_headers_complete will tell the parser that it + * should not expect a body. This is used when receiving a response to a + * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding: + * chunked' headers that indicate the presence of a body. + * + * Returning `2` from on_headers_complete will tell parser that it should not + * expect neither a body nor any futher responses on this connection. This is + * useful for handling responses to a CONNECT request which may not contain + * `Upgrade` or `Connection: upgrade` headers. + * + * http_data_cb does not return data chunks. It will be called arbitrarily + * many times for each string. E.G. you might get 10 callbacks for "on_url" + * each providing just a few characters more data. + */ +typedef int (*http_data_cb) (http_parser*, const char *at, size_t length); +typedef int (*http_cb) (http_parser*); + + +/* Status Codes */ +#define HTTP_STATUS_MAP(XX) \ + XX(100, CONTINUE, Continue) \ + XX(101, SWITCHING_PROTOCOLS, Switching Protocols) \ + XX(102, PROCESSING, Processing) \ + XX(200, OK, OK) \ + XX(201, CREATED, Created) \ + XX(202, ACCEPTED, Accepted) \ + XX(203, NON_AUTHORITATIVE_INFORMATION, Non-Authoritative Information) \ + XX(204, NO_CONTENT, No Content) \ + XX(205, RESET_CONTENT, Reset Content) \ + XX(206, PARTIAL_CONTENT, Partial Content) \ + XX(207, MULTI_STATUS, Multi-Status) \ + XX(208, ALREADY_REPORTED, Already Reported) \ + XX(226, IM_USED, IM Used) \ + XX(300, MULTIPLE_CHOICES, Multiple Choices) \ + XX(301, MOVED_PERMANENTLY, Moved Permanently) \ + XX(302, FOUND, Found) \ + XX(303, SEE_OTHER, See Other) \ + XX(304, NOT_MODIFIED, Not Modified) \ + XX(305, USE_PROXY, Use Proxy) \ + XX(307, TEMPORARY_REDIRECT, Temporary Redirect) \ + XX(308, PERMANENT_REDIRECT, Permanent Redirect) \ + XX(400, BAD_REQUEST, Bad Request) \ + XX(401, UNAUTHORIZED, Unauthorized) \ + XX(402, PAYMENT_REQUIRED, Payment Required) \ + XX(403, FORBIDDEN, Forbidden) \ + XX(404, NOT_FOUND, Not Found) \ + XX(405, METHOD_NOT_ALLOWED, Method Not Allowed) \ + XX(406, NOT_ACCEPTABLE, Not Acceptable) \ + XX(407, PROXY_AUTHENTICATION_REQUIRED, Proxy Authentication Required) \ + XX(408, REQUEST_TIMEOUT, Request Timeout) \ + XX(409, CONFLICT, Conflict) \ + XX(410, GONE, Gone) \ + XX(411, LENGTH_REQUIRED, Length Required) \ + XX(412, PRECONDITION_FAILED, Precondition Failed) \ + XX(413, PAYLOAD_TOO_LARGE, Payload Too Large) \ + XX(414, URI_TOO_LONG, URI Too Long) \ + XX(415, UNSUPPORTED_MEDIA_TYPE, Unsupported Media Type) \ + XX(416, RANGE_NOT_SATISFIABLE, Range Not Satisfiable) \ + XX(417, EXPECTATION_FAILED, Expectation Failed) \ + XX(421, MISDIRECTED_REQUEST, Misdirected Request) \ + XX(422, UNPROCESSABLE_ENTITY, Unprocessable Entity) \ + XX(423, LOCKED, Locked) \ + XX(424, FAILED_DEPENDENCY, Failed Dependency) \ + XX(426, UPGRADE_REQUIRED, Upgrade Required) \ + XX(428, PRECONDITION_REQUIRED, Precondition Required) \ + XX(429, TOO_MANY_REQUESTS, Too Many Requests) \ + XX(431, REQUEST_HEADER_FIELDS_TOO_LARGE, Request Header Fields Too Large) \ + XX(451, UNAVAILABLE_FOR_LEGAL_REASONS, Unavailable For Legal Reasons) \ + XX(500, INTERNAL_SERVER_ERROR, Internal Server Error) \ + XX(501, NOT_IMPLEMENTED, Not Implemented) \ + XX(502, BAD_GATEWAY, Bad Gateway) \ + XX(503, SERVICE_UNAVAILABLE, Service Unavailable) \ + XX(504, GATEWAY_TIMEOUT, Gateway Timeout) \ + XX(505, HTTP_VERSION_NOT_SUPPORTED, HTTP Version Not Supported) \ + XX(506, VARIANT_ALSO_NEGOTIATES, Variant Also Negotiates) \ + XX(507, INSUFFICIENT_STORAGE, Insufficient Storage) \ + XX(508, LOOP_DETECTED, Loop Detected) \ + XX(510, NOT_EXTENDED, Not Extended) \ + XX(511, NETWORK_AUTHENTICATION_REQUIRED, Network Authentication Required) \ + +enum http_status + { +#define XX(num, name, string) HTTP_STATUS_##name = num, + HTTP_STATUS_MAP(XX) +#undef XX + }; + + +/* Request Methods */ +#define HTTP_METHOD_MAP(XX) \ + XX(0, DELETE, DELETE) \ + XX(1, GET, GET) \ + XX(2, HEAD, HEAD) \ + XX(3, POST, POST) \ + XX(4, PUT, PUT) \ + /* pathological */ \ + XX(5, CONNECT, CONNECT) \ + XX(6, OPTIONS, OPTIONS) \ + XX(7, TRACE, TRACE) \ + /* WebDAV */ \ + XX(8, COPY, COPY) \ + XX(9, LOCK, LOCK) \ + XX(10, MKCOL, MKCOL) \ + XX(11, MOVE, MOVE) \ + XX(12, PROPFIND, PROPFIND) \ + XX(13, PROPPATCH, PROPPATCH) \ + XX(14, SEARCH, SEARCH) \ + XX(15, UNLOCK, UNLOCK) \ + XX(16, BIND, BIND) \ + XX(17, REBIND, REBIND) \ + XX(18, UNBIND, UNBIND) \ + XX(19, ACL, ACL) \ + /* subversion */ \ + XX(20, REPORT, REPORT) \ + XX(21, MKACTIVITY, MKACTIVITY) \ + XX(22, CHECKOUT, CHECKOUT) \ + XX(23, MERGE, MERGE) \ + /* upnp */ \ + XX(24, MSEARCH, M-SEARCH) \ + XX(25, NOTIFY, NOTIFY) \ + XX(26, SUBSCRIBE, SUBSCRIBE) \ + XX(27, UNSUBSCRIBE, UNSUBSCRIBE) \ + /* RFC-5789 */ \ + XX(28, PATCH, PATCH) \ + XX(29, PURGE, PURGE) \ + /* CalDAV */ \ + XX(30, MKCALENDAR, MKCALENDAR) \ + /* RFC-2068, section 19.6.1.2 */ \ + XX(31, LINK, LINK) \ + XX(32, UNLINK, UNLINK) \ + +enum http_method + { +#define XX(num, name, string) HTTP_##name = num, + HTTP_METHOD_MAP(XX) +#undef XX + }; + + +enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH }; + + +/* Flag values for http_parser.flags field */ +enum flags + { F_CHUNKED = 1 << 0 + , F_CONNECTION_KEEP_ALIVE = 1 << 1 + , F_CONNECTION_CLOSE = 1 << 2 + , F_CONNECTION_UPGRADE = 1 << 3 + , F_TRAILING = 1 << 4 + , F_UPGRADE = 1 << 5 + , F_SKIPBODY = 1 << 6 + , F_CONTENTLENGTH = 1 << 7 + }; + + +/* Map for errno-related constants + * + * The provided argument should be a macro that takes 2 arguments. + */ +#define HTTP_ERRNO_MAP(XX) \ + /* No error */ \ + XX(OK, "success") \ + \ + /* Callback-related errors */ \ + XX(CB_message_begin, "the on_message_begin callback failed") \ + XX(CB_url, "the on_url callback failed") \ + XX(CB_header_field, "the on_header_field callback failed") \ + XX(CB_header_value, "the on_header_value callback failed") \ + XX(CB_headers_complete, "the on_headers_complete callback failed") \ + XX(CB_body, "the on_body callback failed") \ + XX(CB_message_complete, "the on_message_complete callback failed") \ + XX(CB_status, "the on_status callback failed") \ + XX(CB_chunk_header, "the on_chunk_header callback failed") \ + XX(CB_chunk_complete, "the on_chunk_complete callback failed") \ + \ + /* Parsing-related errors */ \ + XX(INVALID_EOF_STATE, "stream ended at an unexpected time") \ + XX(HEADER_OVERFLOW, \ + "too many header bytes seen; overflow detected") \ + XX(CLOSED_CONNECTION, \ + "data received after completed connection: close message") \ + XX(INVALID_VERSION, "invalid HTTP version") \ + XX(INVALID_STATUS, "invalid HTTP status code") \ + XX(INVALID_METHOD, "invalid HTTP method") \ + XX(INVALID_URL, "invalid URL") \ + XX(INVALID_HOST, "invalid host") \ + XX(INVALID_PORT, "invalid port") \ + XX(INVALID_PATH, "invalid path") \ + XX(INVALID_QUERY_STRING, "invalid query string") \ + XX(INVALID_FRAGMENT, "invalid fragment") \ + XX(LF_EXPECTED, "LF character expected") \ + XX(INVALID_HEADER_TOKEN, "invalid character in header") \ + XX(INVALID_CONTENT_LENGTH, \ + "invalid character in content-length header") \ + XX(UNEXPECTED_CONTENT_LENGTH, \ + "unexpected content-length header") \ + XX(INVALID_CHUNK_SIZE, \ + "invalid character in chunk size header") \ + XX(INVALID_CONSTANT, "invalid constant string") \ + XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\ + XX(STRICT, "strict mode assertion failed") \ + XX(PAUSED, "parser is paused") \ + XX(UNKNOWN, "an unknown error occurred") + + +/* Define HPE_* values for each errno value above */ +#define HTTP_ERRNO_GEN(n, s) HPE_##n, +enum http_errno { + HTTP_ERRNO_MAP(HTTP_ERRNO_GEN) +}; +#undef HTTP_ERRNO_GEN + + +/* Get an http_errno value from an http_parser */ +#define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno) + + +struct http_parser { + /** PRIVATE **/ + unsigned int type : 2; /* enum http_parser_type */ + unsigned int flags : 8; /* F_* values from 'flags' enum; semi-public */ + unsigned int state : 7; /* enum state from http_parser.c */ + unsigned int header_state : 7; /* enum header_state from http_parser.c */ + unsigned int index : 7; /* index into current matcher */ + unsigned int lenient_http_headers : 1; + + uint32_t nread; /* # bytes read in various scenarios */ + uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */ + + /** READ-ONLY **/ + unsigned short http_major; + unsigned short http_minor; + unsigned int status_code : 16; /* responses only */ + unsigned int method : 8; /* requests only */ + unsigned int http_errno : 7; + + /* 1 = Upgrade header was present and the parser has exited because of that. + * 0 = No upgrade header present. + * Should be checked when http_parser_execute() returns in addition to + * error checking. + */ + unsigned int upgrade : 1; + + /** PUBLIC **/ + void *data; /* A pointer to get hook to the "connection" or "socket" object */ +}; + + +struct http_parser_settings { + http_cb on_message_begin; + http_data_cb on_url; + http_data_cb on_status; + http_data_cb on_header_field; + http_data_cb on_header_value; + http_cb on_headers_complete; + http_data_cb on_body; + http_cb on_message_complete; + /* When on_chunk_header is called, the current chunk length is stored + * in parser->content_length. + */ + http_cb on_chunk_header; + http_cb on_chunk_complete; +}; + + +enum http_parser_url_fields + { UF_SCHEMA = 0 + , UF_HOST = 1 + , UF_PORT = 2 + , UF_PATH = 3 + , UF_QUERY = 4 + , UF_FRAGMENT = 5 + , UF_USERINFO = 6 + , UF_MAX = 7 + }; + + +/* Result structure for http_parser_parse_url(). + * + * Callers should index into field_data[] with UF_* values iff field_set + * has the relevant (1 << UF_*) bit set. As a courtesy to clients (and + * because we probably have padding left over), we convert any port to + * a uint16_t. + */ +struct http_parser_url { + uint16_t field_set; /* Bitmask of (1 << UF_*) values */ + uint16_t port; /* Converted UF_PORT string */ + + struct { + uint16_t off; /* Offset into buffer in which field starts */ + uint16_t len; /* Length of run in buffer */ + } field_data[UF_MAX]; +}; + + +/* Returns the library version. Bits 16-23 contain the major version number, + * bits 8-15 the minor version number and bits 0-7 the patch level. + * Usage example: + * + * unsigned long version = http_parser_version(); + * unsigned major = (version >> 16) & 255; + * unsigned minor = (version >> 8) & 255; + * unsigned patch = version & 255; + * printf("http_parser v%u.%u.%u\n", major, minor, patch); + */ +unsigned long http_parser_version(void); + +void http_parser_init(http_parser *parser, enum http_parser_type type); + + +/* Initialize http_parser_settings members to 0 + */ +void http_parser_settings_init(http_parser_settings *settings); + + +/* Executes the parser. Returns number of parsed bytes. Sets + * `parser->http_errno` on error. */ +size_t http_parser_execute(http_parser *parser, + const http_parser_settings *settings, + const char *data, + size_t len); + + +/* If http_should_keep_alive() in the on_headers_complete or + * on_message_complete callback returns 0, then this should be + * the last message on the connection. + * If you are the server, respond with the "Connection: close" header. + * If you are the client, close the connection. + */ +int http_should_keep_alive(const http_parser *parser); + +/* Returns a string version of the HTTP method. */ +const char *http_method_str(enum http_method m); + +/* Return a string name of the given error */ +const char *http_errno_name(enum http_errno err); + +/* Return a string description of the given error */ +const char *http_errno_description(enum http_errno err); + +/* Initialize all http_parser_url members to 0 */ +void http_parser_url_init(struct http_parser_url *u); + +/* Parse a URL; return nonzero on failure */ +int http_parser_parse_url(const char *buf, size_t buflen, + int is_connect, + struct http_parser_url *u); + +/* Pause or un-pause the parser; a nonzero value pauses */ +void http_parser_pause(http_parser *parser, int paused); + +/* Checks if this is the final chunk of the body. */ +int http_body_is_final(const http_parser *parser); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/ngtcp2/ngtcp2/third-party/http-parser/test.c b/deps/ngtcp2/ngtcp2/third-party/http-parser/test.c new file mode 100644 index 000000000000..ae637d1925d7 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/http-parser/test.c @@ -0,0 +1,4410 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "http_parser.h" +#include +#include +#include +#include +#include + +#if defined(__APPLE__) +# undef strlcat +# undef strlncpy +# undef strlcpy +#endif /* defined(__APPLE__) */ + +#undef TRUE +#define TRUE 1 +#undef FALSE +#define FALSE 0 + +#define MAX_HEADERS 13 +#define MAX_ELEMENT_SIZE 2048 +#define MAX_CHUNKS 16 + +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + +static http_parser *parser; + +struct message { + const char *name; // for debugging purposes + const char *raw; + enum http_parser_type type; + enum http_method method; + int status_code; + char response_status[MAX_ELEMENT_SIZE]; + char request_path[MAX_ELEMENT_SIZE]; + char request_url[MAX_ELEMENT_SIZE]; + char fragment[MAX_ELEMENT_SIZE]; + char query_string[MAX_ELEMENT_SIZE]; + char body[MAX_ELEMENT_SIZE]; + size_t body_size; + const char *host; + const char *userinfo; + uint16_t port; + int num_headers; + enum { NONE=0, FIELD, VALUE } last_header_element; + char headers [MAX_HEADERS][2][MAX_ELEMENT_SIZE]; + int should_keep_alive; + + int num_chunks; + int num_chunks_complete; + int chunk_lengths[MAX_CHUNKS]; + + const char *upgrade; // upgraded body + + unsigned short http_major; + unsigned short http_minor; + + int message_begin_cb_called; + int headers_complete_cb_called; + int message_complete_cb_called; + int status_cb_called; + int message_complete_on_eof; + int body_is_final; +}; + +static int currently_parsing_eof; + +static struct message messages[5]; +static int num_messages; +static http_parser_settings *current_pause_parser; + +/* * R E Q U E S T S * */ +const struct message requests[] = +#define CURL_GET 0 +{ {.name= "curl get" + ,.type= HTTP_REQUEST + ,.raw= "GET /test HTTP/1.1\r\n" + "User-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1\r\n" + "Host: 0.0.0.0=5000\r\n" + "Accept: */*\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 3 + ,.headers= + { { "User-Agent", "curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1" } + , { "Host", "0.0.0.0=5000" } + , { "Accept", "*/*" } + } + ,.body= "" + } + +#define FIREFOX_GET 1 +, {.name= "firefox get" + ,.type= HTTP_REQUEST + ,.raw= "GET /favicon.ico HTTP/1.1\r\n" + "Host: 0.0.0.0=5000\r\n" + "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0\r\n" + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" + "Accept-Language: en-us,en;q=0.5\r\n" + "Accept-Encoding: gzip,deflate\r\n" + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" + "Keep-Alive: 300\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/favicon.ico" + ,.request_url= "/favicon.ico" + ,.num_headers= 8 + ,.headers= + { { "Host", "0.0.0.0=5000" } + , { "User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0" } + , { "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" } + , { "Accept-Language", "en-us,en;q=0.5" } + , { "Accept-Encoding", "gzip,deflate" } + , { "Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7" } + , { "Keep-Alive", "300" } + , { "Connection", "keep-alive" } + } + ,.body= "" + } + +#define DUMBFUCK 2 +, {.name= "dumbfuck" + ,.type= HTTP_REQUEST + ,.raw= "GET /dumbfuck HTTP/1.1\r\n" + "aaaaaaaaaaaaa:++++++++++\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/dumbfuck" + ,.request_url= "/dumbfuck" + ,.num_headers= 1 + ,.headers= + { { "aaaaaaaaaaaaa", "++++++++++" } + } + ,.body= "" + } + +#define FRAGMENT_IN_URI 3 +, {.name= "fragment in url" + ,.type= HTTP_REQUEST + ,.raw= "GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "page=1" + ,.fragment= "posts-17408" + ,.request_path= "/forums/1/topics/2375" + /* XXX request url does include fragment? */ + ,.request_url= "/forums/1/topics/2375?page=1#posts-17408" + ,.num_headers= 0 + ,.body= "" + } + +#define GET_NO_HEADERS_NO_BODY 4 +, {.name= "get no headers no body" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_no_headers_no_body/world HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE /* would need Connection: close */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_no_headers_no_body/world" + ,.request_url= "/get_no_headers_no_body/world" + ,.num_headers= 0 + ,.body= "" + } + +#define GET_ONE_HEADER_NO_BODY 5 +, {.name= "get one header no body" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_one_header_no_body HTTP/1.1\r\n" + "Accept: */*\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE /* would need Connection: close */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_one_header_no_body" + ,.request_url= "/get_one_header_no_body" + ,.num_headers= 1 + ,.headers= + { { "Accept" , "*/*" } + } + ,.body= "" + } + +#define GET_FUNKY_CONTENT_LENGTH 6 +, {.name= "get funky content length body hello" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_funky_content_length_body_hello HTTP/1.0\r\n" + "conTENT-Length: 5\r\n" + "\r\n" + "HELLO" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_funky_content_length_body_hello" + ,.request_url= "/get_funky_content_length_body_hello" + ,.num_headers= 1 + ,.headers= + { { "conTENT-Length" , "5" } + } + ,.body= "HELLO" + } + +#define POST_IDENTITY_BODY_WORLD 7 +, {.name= "post identity body world" + ,.type= HTTP_REQUEST + ,.raw= "POST /post_identity_body_world?q=search#hey HTTP/1.1\r\n" + "Accept: */*\r\n" + "Transfer-Encoding: identity\r\n" + "Content-Length: 5\r\n" + "\r\n" + "World" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "q=search" + ,.fragment= "hey" + ,.request_path= "/post_identity_body_world" + ,.request_url= "/post_identity_body_world?q=search#hey" + ,.num_headers= 3 + ,.headers= + { { "Accept", "*/*" } + , { "Transfer-Encoding", "identity" } + , { "Content-Length", "5" } + } + ,.body= "World" + } + +#define POST_CHUNKED_ALL_YOUR_BASE 8 +, {.name= "post - chunked body: all your base are belong to us" + ,.type= HTTP_REQUEST + ,.raw= "POST /post_chunked_all_your_base HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "1e\r\nall your base are belong to us\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/post_chunked_all_your_base" + ,.request_url= "/post_chunked_all_your_base" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding" , "chunked" } + } + ,.body= "all your base are belong to us" + ,.num_chunks_complete= 2 + ,.chunk_lengths= { 0x1e } + } + +#define TWO_CHUNKS_MULT_ZERO_END 9 +, {.name= "two chunks ; triple zero ending" + ,.type= HTTP_REQUEST + ,.raw= "POST /two_chunks_mult_zero_end HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5\r\nhello\r\n" + "6\r\n world\r\n" + "000\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/two_chunks_mult_zero_end" + ,.request_url= "/two_chunks_mult_zero_end" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body= "hello world" + ,.num_chunks_complete= 3 + ,.chunk_lengths= { 5, 6 } + } + +#define CHUNKED_W_TRAILING_HEADERS 10 +, {.name= "chunked with trailing headers. blech." + ,.type= HTTP_REQUEST + ,.raw= "POST /chunked_w_trailing_headers HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5\r\nhello\r\n" + "6\r\n world\r\n" + "0\r\n" + "Vary: *\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/chunked_w_trailing_headers" + ,.request_url= "/chunked_w_trailing_headers" + ,.num_headers= 3 + ,.headers= + { { "Transfer-Encoding", "chunked" } + , { "Vary", "*" } + , { "Content-Type", "text/plain" } + } + ,.body= "hello world" + ,.num_chunks_complete= 3 + ,.chunk_lengths= { 5, 6 } + } + +#define CHUNKED_W_BULLSHIT_AFTER_LENGTH 11 +, {.name= "with bullshit after the length" + ,.type= HTTP_REQUEST + ,.raw= "POST /chunked_w_bullshit_after_length HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5; ihatew3;whatthefuck=aretheseparametersfor\r\nhello\r\n" + "6; blahblah; blah\r\n world\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/chunked_w_bullshit_after_length" + ,.request_url= "/chunked_w_bullshit_after_length" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body= "hello world" + ,.num_chunks_complete= 3 + ,.chunk_lengths= { 5, 6 } + } + +#define WITH_QUOTES 12 +, {.name= "with quotes" + ,.type= HTTP_REQUEST + ,.raw= "GET /with_\"stupid\"_quotes?foo=\"bar\" HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "foo=\"bar\"" + ,.fragment= "" + ,.request_path= "/with_\"stupid\"_quotes" + ,.request_url= "/with_\"stupid\"_quotes?foo=\"bar\"" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define APACHEBENCH_GET 13 +/* The server receiving this request SHOULD NOT wait for EOF + * to know that content-length == 0. + * How to represent this in a unit test? message_complete_on_eof + * Compare with NO_CONTENT_LENGTH_RESPONSE. + */ +, {.name = "apachebench get" + ,.type= HTTP_REQUEST + ,.raw= "GET /test HTTP/1.0\r\n" + "Host: 0.0.0.0:5000\r\n" + "User-Agent: ApacheBench/2.3\r\n" + "Accept: */*\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 3 + ,.headers= { { "Host", "0.0.0.0:5000" } + , { "User-Agent", "ApacheBench/2.3" } + , { "Accept", "*/*" } + } + ,.body= "" + } + +#define QUERY_URL_WITH_QUESTION_MARK_GET 14 +/* Some clients include '?' characters in query strings. + */ +, {.name = "query url with question mark" + ,.type= HTTP_REQUEST + ,.raw= "GET /test.cgi?foo=bar?baz HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "foo=bar?baz" + ,.fragment= "" + ,.request_path= "/test.cgi" + ,.request_url= "/test.cgi?foo=bar?baz" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define PREFIX_NEWLINE_GET 15 +/* Some clients, especially after a POST in a keep-alive connection, + * will send an extra CRLF before the next request + */ +, {.name = "newline prefix get" + ,.type= HTTP_REQUEST + ,.raw= "\r\nGET /test HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define UPGRADE_REQUEST 16 +, {.name = "upgrade request" + ,.type= HTTP_REQUEST + ,.raw= "GET /demo HTTP/1.1\r\n" + "Host: example.com\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" + "Sec-WebSocket-Protocol: sample\r\n" + "Upgrade: WebSocket\r\n" + "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" + "Origin: http://example.com\r\n" + "\r\n" + "Hot diggity dogg" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/demo" + ,.request_url= "/demo" + ,.num_headers= 7 + ,.upgrade="Hot diggity dogg" + ,.headers= { { "Host", "example.com" } + , { "Connection", "Upgrade" } + , { "Sec-WebSocket-Key2", "12998 5 Y3 1 .P00" } + , { "Sec-WebSocket-Protocol", "sample" } + , { "Upgrade", "WebSocket" } + , { "Sec-WebSocket-Key1", "4 @1 46546xW%0l 1 5" } + , { "Origin", "http://example.com" } + } + ,.body= "" + } + +#define CONNECT_REQUEST 17 +, {.name = "connect request" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT 0-home0.netscape.com:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + "some data\r\n" + "and yet even more data" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "0-home0.netscape.com:443" + ,.num_headers= 2 + ,.upgrade="some data\r\nand yet even more data" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } + +#define REPORT_REQ 18 +, {.name= "report request" + ,.type= HTTP_REQUEST + ,.raw= "REPORT /test HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_REPORT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define NO_HTTP_VERSION 19 +, {.name= "request with no http version" + ,.type= HTTP_REQUEST + ,.raw= "GET /\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 0 + ,.http_minor= 9 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define MSEARCH_REQ 20 +, {.name= "m-search request" + ,.type= HTTP_REQUEST + ,.raw= "M-SEARCH * HTTP/1.1\r\n" + "HOST: 239.255.255.250:1900\r\n" + "MAN: \"ssdp:discover\"\r\n" + "ST: \"ssdp:all\"\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_MSEARCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "*" + ,.request_url= "*" + ,.num_headers= 3 + ,.headers= { { "HOST", "239.255.255.250:1900" } + , { "MAN", "\"ssdp:discover\"" } + , { "ST", "\"ssdp:all\"" } + } + ,.body= "" + } + +#define LINE_FOLDING_IN_HEADER 21 +, {.name= "line folding in header value" + ,.type= HTTP_REQUEST + ,.raw= "GET / HTTP/1.1\r\n" + "Line1: abc\r\n" + "\tdef\r\n" + " ghi\r\n" + "\t\tjkl\r\n" + " mno \r\n" + "\t \tqrs\r\n" + "Line2: \t line2\t\r\n" + "Line3:\r\n" + " line3\r\n" + "Line4: \r\n" + " \r\n" + "Connection:\r\n" + " close\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 5 + ,.headers= { { "Line1", "abc\tdef ghi\t\tjkl mno \t \tqrs" } + , { "Line2", "line2\t" } + , { "Line3", "line3" } + , { "Line4", "" } + , { "Connection", "close" }, + } + ,.body= "" + } + + +#define QUERY_TERMINATED_HOST 22 +, {.name= "host terminated by a query string" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org?hail=all HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "hail=all" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org?hail=all" + ,.host= "hypnotoad.org" + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define QUERY_TERMINATED_HOSTPORT 23 +, {.name= "host:port terminated by a query string" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org:1234?hail=all HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "hail=all" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org:1234?hail=all" + ,.host= "hypnotoad.org" + ,.port= 1234 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define SPACE_TERMINATED_HOSTPORT 24 +, {.name= "host:port terminated by a space" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org:1234 HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org:1234" + ,.host= "hypnotoad.org" + ,.port= 1234 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define PATCH_REQ 25 +, {.name = "PATCH request" + ,.type= HTTP_REQUEST + ,.raw= "PATCH /file.txt HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/example\r\n" + "If-Match: \"e0023aa4e\"\r\n" + "Content-Length: 10\r\n" + "\r\n" + "cccccccccc" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_PATCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/file.txt" + ,.request_url= "/file.txt" + ,.num_headers= 4 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/example" } + , { "If-Match", "\"e0023aa4e\"" } + , { "Content-Length", "10" } + } + ,.body= "cccccccccc" + } + +#define CONNECT_CAPS_REQUEST 26 +, {.name = "connect caps request" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "HOME0.NETSCAPE.COM:443" + ,.num_headers= 2 + ,.upgrade="" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } + +#if !HTTP_PARSER_STRICT +#define UTF8_PATH_REQ 27 +, {.name= "utf-8 path request" + ,.type= HTTP_REQUEST + ,.raw= "GET /δ¶/δt/pope?q=1#narf HTTP/1.1\r\n" + "Host: github.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "q=1" + ,.fragment= "narf" + ,.request_path= "/δ¶/δt/pope" + ,.request_url= "/δ¶/δt/pope?q=1#narf" + ,.num_headers= 1 + ,.headers= { {"Host", "github.com" } + } + ,.body= "" + } + +#define HOSTNAME_UNDERSCORE 28 +, {.name = "hostname underscore" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT home_0.netscape.com:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "home_0.netscape.com:443" + ,.num_headers= 2 + ,.upgrade="" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } +#endif /* !HTTP_PARSER_STRICT */ + +/* see https://github.com/ry/http-parser/issues/47 */ +#define EAT_TRAILING_CRLF_NO_CONNECTION_CLOSE 29 +, {.name = "eat CRLF between requests, no \"Connection: close\" header" + ,.raw= "POST / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 4\r\n" + "\r\n" + "q=42\r\n" /* note the trailing CRLF */ + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 3 + ,.upgrade= 0 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/x-www-form-urlencoded" } + , { "Content-Length", "4" } + } + ,.body= "q=42" + } + +/* see https://github.com/ry/http-parser/issues/47 */ +#define EAT_TRAILING_CRLF_WITH_CONNECTION_CLOSE 30 +, {.name = "eat CRLF between requests even if \"Connection: close\" is set" + ,.raw= "POST / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 4\r\n" + "Connection: close\r\n" + "\r\n" + "q=42\r\n" /* note the trailing CRLF */ + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE /* input buffer isn't empty when on_message_complete is called */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 4 + ,.upgrade= 0 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/x-www-form-urlencoded" } + , { "Content-Length", "4" } + , { "Connection", "close" } + } + ,.body= "q=42" + } + +#define PURGE_REQ 31 +, {.name = "PURGE request" + ,.type= HTTP_REQUEST + ,.raw= "PURGE /file.txt HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_PURGE + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/file.txt" + ,.request_url= "/file.txt" + ,.num_headers= 1 + ,.headers= { { "Host", "www.example.com" } } + ,.body= "" + } + +#define SEARCH_REQ 32 +, {.name = "SEARCH request" + ,.type= HTTP_REQUEST + ,.raw= "SEARCH / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_SEARCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 1 + ,.headers= { { "Host", "www.example.com" } } + ,.body= "" + } + +#define PROXY_WITH_BASIC_AUTH 33 +, {.name= "host:port and basic_auth" + ,.type= HTTP_REQUEST + ,.raw= "GET http://a%12:b!&*$@hypnotoad.org:1234/toto HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.fragment= "" + ,.request_path= "/toto" + ,.request_url= "http://a%12:b!&*$@hypnotoad.org:1234/toto" + ,.host= "hypnotoad.org" + ,.userinfo= "a%12:b!&*$" + ,.port= 1234 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define LINE_FOLDING_IN_HEADER_WITH_LF 34 +, {.name= "line folding in header value" + ,.type= HTTP_REQUEST + ,.raw= "GET / HTTP/1.1\n" + "Line1: abc\n" + "\tdef\n" + " ghi\n" + "\t\tjkl\n" + " mno \n" + "\t \tqrs\n" + "Line2: \t line2\t\n" + "Line3:\n" + " line3\n" + "Line4: \n" + " \n" + "Connection:\n" + " close\n" + "\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.num_headers= 5 + ,.headers= { { "Line1", "abc\tdef ghi\t\tjkl mno \t \tqrs" } + , { "Line2", "line2\t" } + , { "Line3", "line3" } + , { "Line4", "" } + , { "Connection", "close" }, + } + ,.body= "" + } + +#define CONNECTION_MULTI 35 +, {.name = "multiple connection header values with folding" + ,.type= HTTP_REQUEST + ,.raw= "GET /demo HTTP/1.1\r\n" + "Host: example.com\r\n" + "Connection: Something,\r\n" + " Upgrade, ,Keep-Alive\r\n" + "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" + "Sec-WebSocket-Protocol: sample\r\n" + "Upgrade: WebSocket\r\n" + "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" + "Origin: http://example.com\r\n" + "\r\n" + "Hot diggity dogg" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/demo" + ,.request_url= "/demo" + ,.num_headers= 7 + ,.upgrade="Hot diggity dogg" + ,.headers= { { "Host", "example.com" } + , { "Connection", "Something, Upgrade, ,Keep-Alive" } + , { "Sec-WebSocket-Key2", "12998 5 Y3 1 .P00" } + , { "Sec-WebSocket-Protocol", "sample" } + , { "Upgrade", "WebSocket" } + , { "Sec-WebSocket-Key1", "4 @1 46546xW%0l 1 5" } + , { "Origin", "http://example.com" } + } + ,.body= "" + } + +#define CONNECTION_MULTI_LWS 36 +, {.name = "multiple connection header values with folding and lws" + ,.type= HTTP_REQUEST + ,.raw= "GET /demo HTTP/1.1\r\n" + "Connection: keep-alive, upgrade\r\n" + "Upgrade: WebSocket\r\n" + "\r\n" + "Hot diggity dogg" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/demo" + ,.request_url= "/demo" + ,.num_headers= 2 + ,.upgrade="Hot diggity dogg" + ,.headers= { { "Connection", "keep-alive, upgrade" } + , { "Upgrade", "WebSocket" } + } + ,.body= "" + } + +#define CONNECTION_MULTI_LWS_CRLF 37 +, {.name = "multiple connection header values with folding and lws" + ,.type= HTTP_REQUEST + ,.raw= "GET /demo HTTP/1.1\r\n" + "Connection: keep-alive, \r\n upgrade\r\n" + "Upgrade: WebSocket\r\n" + "\r\n" + "Hot diggity dogg" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/demo" + ,.request_url= "/demo" + ,.num_headers= 2 + ,.upgrade="Hot diggity dogg" + ,.headers= { { "Connection", "keep-alive, upgrade" } + , { "Upgrade", "WebSocket" } + } + ,.body= "" + } + +#define UPGRADE_POST_REQUEST 38 +, {.name = "upgrade post request" + ,.type= HTTP_REQUEST + ,.raw= "POST /demo HTTP/1.1\r\n" + "Host: example.com\r\n" + "Connection: Upgrade\r\n" + "Upgrade: HTTP/2.0\r\n" + "Content-Length: 15\r\n" + "\r\n" + "sweet post body" + "Hot diggity dogg" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.request_path= "/demo" + ,.request_url= "/demo" + ,.num_headers= 4 + ,.upgrade="Hot diggity dogg" + ,.headers= { { "Host", "example.com" } + , { "Connection", "Upgrade" } + , { "Upgrade", "HTTP/2.0" } + , { "Content-Length", "15" } + } + ,.body= "sweet post body" + } + +#define CONNECT_WITH_BODY_REQUEST 39 +, {.name = "connect with body request" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT foo.bar.com:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "Content-Length: 10\r\n" + "\r\n" + "blarfcicle" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.request_url= "foo.bar.com:443" + ,.num_headers= 3 + ,.upgrade="blarfcicle" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + , { "Content-Length", "10" } + } + ,.body= "" + } + +/* Examples from the Internet draft for LINK/UNLINK methods: + * https://tools.ietf.org/id/draft-snell-link-method-01.html#rfc.section.5 + */ + +#define LINK_REQUEST 40 +, {.name = "link request" + ,.type= HTTP_REQUEST + ,.raw= "LINK /images/my_dog.jpg HTTP/1.1\r\n" + "Host: example.com\r\n" + "Link: ; rel=\"tag\"\r\n" + "Link: ; rel=\"tag\"\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_LINK + ,.request_path= "/images/my_dog.jpg" + ,.request_url= "/images/my_dog.jpg" + ,.query_string= "" + ,.fragment= "" + ,.num_headers= 3 + ,.headers= { { "Host", "example.com" } + , { "Link", "; rel=\"tag\"" } + , { "Link", "; rel=\"tag\"" } + } + ,.body= "" + } + +#define UNLINK_REQUEST 41 +, {.name = "unlink request" + ,.type= HTTP_REQUEST + ,.raw= "UNLINK /images/my_dog.jpg HTTP/1.1\r\n" + "Host: example.com\r\n" + "Link: ; rel=\"tag\"\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_UNLINK + ,.request_path= "/images/my_dog.jpg" + ,.request_url= "/images/my_dog.jpg" + ,.query_string= "" + ,.fragment= "" + ,.num_headers= 2 + ,.headers= { { "Host", "example.com" } + , { "Link", "; rel=\"tag\"" } + } + ,.body= "" + } + +, {.name= NULL } /* sentinel */ +}; + +/* * R E S P O N S E S * */ +const struct message responses[] = +#define GOOGLE_301 0 +{ {.name= "google 301" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 301 Moved Permanently\r\n" + "Location: http://www.google.com/\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Date: Sun, 26 Apr 2009 11:11:49 GMT\r\n" + "Expires: Tue, 26 May 2009 11:11:49 GMT\r\n" + "X-$PrototypeBI-Version: 1.6.0.3\r\n" /* $ char in header field */ + "Cache-Control: public, max-age=2592000\r\n" + "Server: gws\r\n" + "Content-Length: 219 \r\n" + "\r\n" + "\n" + "301 Moved\n" + "

301 Moved

\n" + "The document has moved\n" + "here.\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 301 + ,.response_status= "Moved Permanently" + ,.num_headers= 8 + ,.headers= + { { "Location", "http://www.google.com/" } + , { "Content-Type", "text/html; charset=UTF-8" } + , { "Date", "Sun, 26 Apr 2009 11:11:49 GMT" } + , { "Expires", "Tue, 26 May 2009 11:11:49 GMT" } + , { "X-$PrototypeBI-Version", "1.6.0.3" } + , { "Cache-Control", "public, max-age=2592000" } + , { "Server", "gws" } + , { "Content-Length", "219 " } + } + ,.body= "\n" + "301 Moved\n" + "

301 Moved

\n" + "The document has moved\n" + "here.\r\n" + "\r\n" + } + +#define NO_CONTENT_LENGTH_RESPONSE 1 +/* The client should wait for the server's EOF. That is, when content-length + * is not specified, and "Connection: close", the end of body is specified + * by the EOF. + * Compare with APACHEBENCH_GET + */ +, {.name= "no content-length response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Date: Tue, 04 Aug 2009 07:59:32 GMT\r\n" + "Server: Apache\r\n" + "X-Powered-By: Servlet/2.5 JSP/2.1\r\n" + "Content-Type: text/xml; charset=utf-8\r\n" + "Connection: close\r\n" + "\r\n" + "\n" + "\n" + " \n" + " \n" + " SOAP-ENV:Client\n" + " Client Error\n" + " \n" + " \n" + "" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 5 + ,.headers= + { { "Date", "Tue, 04 Aug 2009 07:59:32 GMT" } + , { "Server", "Apache" } + , { "X-Powered-By", "Servlet/2.5 JSP/2.1" } + , { "Content-Type", "text/xml; charset=utf-8" } + , { "Connection", "close" } + } + ,.body= "\n" + "\n" + " \n" + " \n" + " SOAP-ENV:Client\n" + " Client Error\n" + " \n" + " \n" + "" + } + +#define NO_HEADERS_NO_BODY_404 2 +, {.name= "404 no headers no body" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 404 Not Found\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 404 + ,.response_status= "Not Found" + ,.num_headers= 0 + ,.headers= {} + ,.body_size= 0 + ,.body= "" + } + +#define NO_REASON_PHRASE 3 +, {.name= "301 no response phrase" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 301\r\n\r\n" + ,.should_keep_alive = FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 301 + ,.response_status= "" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define TRAILING_SPACE_ON_CHUNKED_BODY 4 +, {.name="200 trailing space on chunked body" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "25 \r\n" + "This is the data in the first chunk\r\n" + "\r\n" + "1C\r\n" + "and this is the second one\r\n" + "\r\n" + "0 \r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 2 + ,.headers= + { {"Content-Type", "text/plain" } + , {"Transfer-Encoding", "chunked" } + } + ,.body_size = 37+28 + ,.body = + "This is the data in the first chunk\r\n" + "and this is the second one\r\n" + ,.num_chunks_complete= 3 + ,.chunk_lengths= { 0x25, 0x1c } + } + +#define NO_CARRIAGE_RET 5 +, {.name="no carriage ret" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\n" + "Content-Type: text/html; charset=utf-8\n" + "Connection: close\n" + "\n" + "these headers are from http://news.ycombinator.com/" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 2 + ,.headers= + { {"Content-Type", "text/html; charset=utf-8" } + , {"Connection", "close" } + } + ,.body= "these headers are from http://news.ycombinator.com/" + } + +#define PROXY_CONNECTION 6 +, {.name="proxy connection" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Content-Length: 11\r\n" + "Proxy-Connection: close\r\n" + "Date: Thu, 31 Dec 2009 20:55:48 +0000\r\n" + "\r\n" + "hello world" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 4 + ,.headers= + { {"Content-Type", "text/html; charset=UTF-8" } + , {"Content-Length", "11" } + , {"Proxy-Connection", "close" } + , {"Date", "Thu, 31 Dec 2009 20:55:48 +0000"} + } + ,.body= "hello world" + } + +#define UNDERSTORE_HEADER_KEY 7 + // shown by + // curl -o /dev/null -v "http://ad.doubleclick.net/pfadx/DARTSHELLCONFIGXML;dcmt=text/xml;" +, {.name="underscore header key" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Server: DCLK-AdSvr\r\n" + "Content-Type: text/xml\r\n" + "Content-Length: 0\r\n" + "DCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 4 + ,.headers= + { {"Server", "DCLK-AdSvr" } + , {"Content-Type", "text/xml" } + , {"Content-Length", "0" } + , {"DCLK_imp", "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o" } + } + ,.body= "" + } + +#define BONJOUR_MADAME_FR 8 +/* The client should not merge two headers fields when the first one doesn't + * have a value. + */ +, {.name= "bonjourmadame.fr" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 301 Moved Permanently\r\n" + "Date: Thu, 03 Jun 2010 09:56:32 GMT\r\n" + "Server: Apache/2.2.3 (Red Hat)\r\n" + "Cache-Control: public\r\n" + "Pragma: \r\n" + "Location: http://www.bonjourmadame.fr/\r\n" + "Vary: Accept-Encoding\r\n" + "Content-Length: 0\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 301 + ,.response_status= "Moved Permanently" + ,.num_headers= 9 + ,.headers= + { { "Date", "Thu, 03 Jun 2010 09:56:32 GMT" } + , { "Server", "Apache/2.2.3 (Red Hat)" } + , { "Cache-Control", "public" } + , { "Pragma", "" } + , { "Location", "http://www.bonjourmadame.fr/" } + , { "Vary", "Accept-Encoding" } + , { "Content-Length", "0" } + , { "Content-Type", "text/html; charset=UTF-8" } + , { "Connection", "keep-alive" } + } + ,.body= "" + } + +#define RES_FIELD_UNDERSCORE 9 +/* Should handle spaces in header fields */ +, {.name= "field underscore" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Date: Tue, 28 Sep 2010 01:14:13 GMT\r\n" + "Server: Apache\r\n" + "Cache-Control: no-cache, must-revalidate\r\n" + "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n" + ".et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com\r\n" + "Vary: Accept-Encoding\r\n" + "_eep-Alive: timeout=45\r\n" /* semantic value ignored */ + "_onnection: Keep-Alive\r\n" /* semantic value ignored */ + "Transfer-Encoding: chunked\r\n" + "Content-Type: text/html\r\n" + "Connection: close\r\n" + "\r\n" + "0\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 11 + ,.headers= + { { "Date", "Tue, 28 Sep 2010 01:14:13 GMT" } + , { "Server", "Apache" } + , { "Cache-Control", "no-cache, must-revalidate" } + , { "Expires", "Mon, 26 Jul 1997 05:00:00 GMT" } + , { ".et-Cookie", "PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com" } + , { "Vary", "Accept-Encoding" } + , { "_eep-Alive", "timeout=45" } + , { "_onnection", "Keep-Alive" } + , { "Transfer-Encoding", "chunked" } + , { "Content-Type", "text/html" } + , { "Connection", "close" } + } + ,.body= "" + ,.num_chunks_complete= 1 + ,.chunk_lengths= {} + } + +#define NON_ASCII_IN_STATUS_LINE 10 +/* Should handle non-ASCII in status line */ +, {.name= "non-ASCII in status line" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 500 Oriëntatieprobleem\r\n" + "Date: Fri, 5 Nov 2010 23:07:12 GMT+2\r\n" + "Content-Length: 0\r\n" + "Connection: close\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 500 + ,.response_status= "Oriëntatieprobleem" + ,.num_headers= 3 + ,.headers= + { { "Date", "Fri, 5 Nov 2010 23:07:12 GMT+2" } + , { "Content-Length", "0" } + , { "Connection", "close" } + } + ,.body= "" + } + +#define HTTP_VERSION_0_9 11 +/* Should handle HTTP/0.9 */ +, {.name= "http version 0.9" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/0.9 200 OK\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 0 + ,.http_minor= 9 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 0 + ,.headers= + {} + ,.body= "" + } + +#define NO_CONTENT_LENGTH_NO_TRANSFER_ENCODING_RESPONSE 12 +/* The client should wait for the server's EOF. That is, when neither + * content-length nor transfer-encoding is specified, the end of body + * is specified by the EOF. + */ +, {.name= "neither content-length nor transfer-encoding response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "hello world" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 1 + ,.headers= + { { "Content-Type", "text/plain" } + } + ,.body= "hello world" + } + +#define NO_BODY_HTTP10_KA_200 13 +, {.name= "HTTP/1.0 with keep-alive and EOF-terminated 200 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 200 OK\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 1 + ,.headers= + { { "Connection", "keep-alive" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP10_KA_204 14 +, {.name= "HTTP/1.0 with keep-alive and a 204 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 204 No content\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 204 + ,.response_status= "No content" + ,.num_headers= 1 + ,.headers= + { { "Connection", "keep-alive" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_200 15 +, {.name= "HTTP/1.1 with an EOF-terminated 200 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 0 + ,.headers={} + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_204 16 +, {.name= "HTTP/1.1 with a 204 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 204 No content\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 204 + ,.response_status= "No content" + ,.num_headers= 0 + ,.headers={} + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_NOKA_204 17 +, {.name= "HTTP/1.1 with a 204 status and keep-alive disabled" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 204 No content\r\n" + "Connection: close\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 204 + ,.response_status= "No content" + ,.num_headers= 1 + ,.headers= + { { "Connection", "close" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_CHUNKED_200 18 +, {.name= "HTTP/1.1 with chunked endocing and a 200 response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body_size= 0 + ,.body= "" + ,.num_chunks_complete= 1 + } + +#if !HTTP_PARSER_STRICT +#define SPACE_IN_FIELD_RES 19 +/* Should handle spaces in header fields */ +, {.name= "field space" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Server: Microsoft-IIS/6.0\r\n" + "X-Powered-By: ASP.NET\r\n" + "en-US Content-Type: text/xml\r\n" /* this is the problem */ + "Content-Type: text/xml\r\n" + "Content-Length: 16\r\n" + "Date: Fri, 23 Jul 2010 18:45:38 GMT\r\n" + "Connection: keep-alive\r\n" + "\r\n" + "hello" /* fake body */ + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 7 + ,.headers= + { { "Server", "Microsoft-IIS/6.0" } + , { "X-Powered-By", "ASP.NET" } + , { "en-US Content-Type", "text/xml" } + , { "Content-Type", "text/xml" } + , { "Content-Length", "16" } + , { "Date", "Fri, 23 Jul 2010 18:45:38 GMT" } + , { "Connection", "keep-alive" } + } + ,.body= "hello" + } +#endif /* !HTTP_PARSER_STRICT */ + +#define AMAZON_COM 20 +, {.name= "amazon.com" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 301 MovedPermanently\r\n" + "Date: Wed, 15 May 2013 17:06:33 GMT\r\n" + "Server: Server\r\n" + "x-amz-id-1: 0GPHKXSJQ826RK7GZEB2\r\n" + "p3p: policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \"\r\n" + "x-amz-id-2: STN69VZxIFSz9YJLbz1GDbxpbjG6Qjmmq5E3DxRhOUw+Et0p4hr7c/Q8qNcx4oAD\r\n" + "Location: http://www.amazon.com/Dan-Brown/e/B000AP9DSU/ref=s9_pop_gw_al1?_encoding=UTF8&refinementId=618073011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=0SHYY5BZXN3KR20BNFAY&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846\r\n" + "Vary: Accept-Encoding,User-Agent\r\n" + "Content-Type: text/html; charset=ISO-8859-1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "1\r\n" + "\n\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 301 + ,.response_status= "MovedPermanently" + ,.num_headers= 9 + ,.headers= { { "Date", "Wed, 15 May 2013 17:06:33 GMT" } + , { "Server", "Server" } + , { "x-amz-id-1", "0GPHKXSJQ826RK7GZEB2" } + , { "p3p", "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \"" } + , { "x-amz-id-2", "STN69VZxIFSz9YJLbz1GDbxpbjG6Qjmmq5E3DxRhOUw+Et0p4hr7c/Q8qNcx4oAD" } + , { "Location", "http://www.amazon.com/Dan-Brown/e/B000AP9DSU/ref=s9_pop_gw_al1?_encoding=UTF8&refinementId=618073011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=0SHYY5BZXN3KR20BNFAY&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846" } + , { "Vary", "Accept-Encoding,User-Agent" } + , { "Content-Type", "text/html; charset=ISO-8859-1" } + , { "Transfer-Encoding", "chunked" } + } + ,.body= "\n" + ,.num_chunks_complete= 2 + ,.chunk_lengths= { 1 } + } + +#define EMPTY_REASON_PHRASE_AFTER_SPACE 20 +, {.name= "empty reason phrase after space" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 \r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define CONTENT_LENGTH_X 21 +, {.name= "Content-Length-X" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Length-X: 0\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "2\r\n" + "OK\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 2 + ,.headers= { { "Content-Length-X", "0" } + , { "Transfer-Encoding", "chunked" } + } + ,.body= "OK" + ,.num_chunks_complete= 2 + ,.chunk_lengths= { 2 } + } + +#define HTTP_101_RESPONSE_WITH_UPGRADE_HEADER 22 +, {.name= "HTTP 101 response with Upgrade header" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 101 Switching Protocols\r\n" + "Connection: upgrade\r\n" + "Upgrade: h2c\r\n" + "\r\n" + "proto" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 101 + ,.response_status= "Switching Protocols" + ,.upgrade= "proto" + ,.num_headers= 2 + ,.headers= + { { "Connection", "upgrade" } + , { "Upgrade", "h2c" } + } + } + +#define HTTP_101_RESPONSE_WITH_UPGRADE_HEADER_AND_CONTENT_LENGTH 23 +, {.name= "HTTP 101 response with Upgrade and Content-Length header" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 101 Switching Protocols\r\n" + "Connection: upgrade\r\n" + "Upgrade: h2c\r\n" + "Content-Length: 4\r\n" + "\r\n" + "body" + "proto" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 101 + ,.response_status= "Switching Protocols" + ,.body= "body" + ,.upgrade= "proto" + ,.num_headers= 3 + ,.headers= + { { "Connection", "upgrade" } + , { "Upgrade", "h2c" } + , { "Content-Length", "4" } + } + } + +#define HTTP_101_RESPONSE_WITH_UPGRADE_HEADER_AND_TRANSFER_ENCODING 24 +, {.name= "HTTP 101 response with Upgrade and Transfer-Encoding header" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 101 Switching Protocols\r\n" + "Connection: upgrade\r\n" + "Upgrade: h2c\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "2\r\n" + "bo\r\n" + "2\r\n" + "dy\r\n" + "0\r\n" + "\r\n" + "proto" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 101 + ,.response_status= "Switching Protocols" + ,.body= "body" + ,.upgrade= "proto" + ,.num_headers= 3 + ,.headers= + { { "Connection", "upgrade" } + , { "Upgrade", "h2c" } + , { "Transfer-Encoding", "chunked" } + } + ,.num_chunks_complete= 3 + ,.chunk_lengths= { 2, 2 } + } + +#define HTTP_200_RESPONSE_WITH_UPGRADE_HEADER 25 +, {.name= "HTTP 200 response with Upgrade header" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Connection: upgrade\r\n" + "Upgrade: h2c\r\n" + "\r\n" + "body" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.body= "body" + ,.upgrade= NULL + ,.num_headers= 2 + ,.headers= + { { "Connection", "upgrade" } + , { "Upgrade", "h2c" } + } + } + +#define HTTP_200_RESPONSE_WITH_UPGRADE_HEADER_AND_CONTENT_LENGTH 26 +, {.name= "HTTP 200 response with Upgrade and Content-Length header" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Connection: upgrade\r\n" + "Upgrade: h2c\r\n" + "Content-Length: 4\r\n" + "\r\n" + "body" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 3 + ,.body= "body" + ,.upgrade= NULL + ,.headers= + { { "Connection", "upgrade" } + , { "Upgrade", "h2c" } + , { "Content-Length", "4" } + } + } + +#define HTTP_200_RESPONSE_WITH_UPGRADE_HEADER_AND_TRANSFER_ENCODING 27 +, {.name= "HTTP 200 response with Upgrade and Transfer-Encoding header" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Connection: upgrade\r\n" + "Upgrade: h2c\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "2\r\n" + "bo\r\n" + "2\r\n" + "dy\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 3 + ,.body= "body" + ,.upgrade= NULL + ,.headers= + { { "Connection", "upgrade" } + , { "Upgrade", "h2c" } + , { "Transfer-Encoding", "chunked" } + } + ,.num_chunks_complete= 3 + ,.chunk_lengths= { 2, 2 } + } + +, {.name= NULL } /* sentinel */ +}; + +/* strnlen() is a POSIX.2008 addition. Can't rely on it being available so + * define it ourselves. + */ +size_t +strnlen(const char *s, size_t maxlen) +{ + const char *p; + + p = memchr(s, '\0', maxlen); + if (p == NULL) + return maxlen; + + return p - s; +} + +size_t +strlncat(char *dst, size_t len, const char *src, size_t n) +{ + size_t slen; + size_t dlen; + size_t rlen; + size_t ncpy; + + slen = strnlen(src, n); + dlen = strnlen(dst, len); + + if (dlen < len) { + rlen = len - dlen; + ncpy = slen < rlen ? slen : (rlen - 1); + memcpy(dst + dlen, src, ncpy); + dst[dlen + ncpy] = '\0'; + } + + assert(len > slen + dlen); + return slen + dlen; +} + +size_t +strlcat(char *dst, const char *src, size_t len) +{ + return strlncat(dst, len, src, (size_t) -1); +} + +size_t +strlncpy(char *dst, size_t len, const char *src, size_t n) +{ + size_t slen; + size_t ncpy; + + slen = strnlen(src, n); + + if (len > 0) { + ncpy = slen < len ? slen : (len - 1); + memcpy(dst, src, ncpy); + dst[ncpy] = '\0'; + } + + assert(len > slen); + return slen; +} + +size_t +strlcpy(char *dst, const char *src, size_t len) +{ + return strlncpy(dst, len, src, (size_t) -1); +} + +int +request_url_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + strlncat(messages[num_messages].request_url, + sizeof(messages[num_messages].request_url), + buf, + len); + return 0; +} + +int +header_field_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + struct message *m = &messages[num_messages]; + + if (m->last_header_element != FIELD) + m->num_headers++; + + strlncat(m->headers[m->num_headers-1][0], + sizeof(m->headers[m->num_headers-1][0]), + buf, + len); + + m->last_header_element = FIELD; + + return 0; +} + +int +header_value_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + struct message *m = &messages[num_messages]; + + strlncat(m->headers[m->num_headers-1][1], + sizeof(m->headers[m->num_headers-1][1]), + buf, + len); + + m->last_header_element = VALUE; + + return 0; +} + +void +check_body_is_final (const http_parser *p) +{ + if (messages[num_messages].body_is_final) { + fprintf(stderr, "\n\n *** Error http_body_is_final() should return 1 " + "on last on_body callback call " + "but it doesn't! ***\n\n"); + assert(0); + abort(); + } + messages[num_messages].body_is_final = http_body_is_final(p); +} + +int +body_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + strlncat(messages[num_messages].body, + sizeof(messages[num_messages].body), + buf, + len); + messages[num_messages].body_size += len; + check_body_is_final(p); + // printf("body_cb: '%s'\n", requests[num_messages].body); + return 0; +} + +int +count_body_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + assert(buf); + messages[num_messages].body_size += len; + check_body_is_final(p); + return 0; +} + +int +message_begin_cb (http_parser *p) +{ + assert(p == parser); + messages[num_messages].message_begin_cb_called = TRUE; + return 0; +} + +int +headers_complete_cb (http_parser *p) +{ + assert(p == parser); + messages[num_messages].method = parser->method; + messages[num_messages].status_code = parser->status_code; + messages[num_messages].http_major = parser->http_major; + messages[num_messages].http_minor = parser->http_minor; + messages[num_messages].headers_complete_cb_called = TRUE; + messages[num_messages].should_keep_alive = http_should_keep_alive(parser); + return 0; +} + +int +message_complete_cb (http_parser *p) +{ + assert(p == parser); + if (messages[num_messages].should_keep_alive != http_should_keep_alive(parser)) + { + fprintf(stderr, "\n\n *** Error http_should_keep_alive() should have same " + "value in both on_message_complete and on_headers_complete " + "but it doesn't! ***\n\n"); + assert(0); + abort(); + } + + if (messages[num_messages].body_size && + http_body_is_final(p) && + !messages[num_messages].body_is_final) + { + fprintf(stderr, "\n\n *** Error http_body_is_final() should return 1 " + "on last on_body callback call " + "but it doesn't! ***\n\n"); + assert(0); + abort(); + } + + messages[num_messages].message_complete_cb_called = TRUE; + + messages[num_messages].message_complete_on_eof = currently_parsing_eof; + + num_messages++; + return 0; +} + +int +response_status_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == parser); + + messages[num_messages].status_cb_called = TRUE; + + strlncat(messages[num_messages].response_status, + sizeof(messages[num_messages].response_status), + buf, + len); + return 0; +} + +int +chunk_header_cb (http_parser *p) +{ + assert(p == parser); + int chunk_idx = messages[num_messages].num_chunks; + messages[num_messages].num_chunks++; + if (chunk_idx < MAX_CHUNKS) { + messages[num_messages].chunk_lengths[chunk_idx] = p->content_length; + } + + return 0; +} + +int +chunk_complete_cb (http_parser *p) +{ + assert(p == parser); + + /* Here we want to verify that each chunk_header_cb is matched by a + * chunk_complete_cb, so not only should the total number of calls to + * both callbacks be the same, but they also should be interleaved + * properly */ + assert(messages[num_messages].num_chunks == + messages[num_messages].num_chunks_complete + 1); + + messages[num_messages].num_chunks_complete++; + return 0; +} + +/* These dontcall_* callbacks exist so that we can verify that when we're + * paused, no additional callbacks are invoked */ +int +dontcall_message_begin_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_message_begin() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_header_field_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_header_field() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_header_value_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_header_value() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_request_url_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_request_url() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_body_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_body_cb() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_headers_complete_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_headers_complete() called on paused " + "parser ***\n\n"); + abort(); +} + +int +dontcall_message_complete_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_message_complete() called on paused " + "parser ***\n\n"); + abort(); +} + +int +dontcall_response_status_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_status() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_chunk_header_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_chunk_header() called on paused parser ***\n\n"); + exit(1); +} + +int +dontcall_chunk_complete_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_chunk_complete() " + "called on paused parser ***\n\n"); + exit(1); +} + +static http_parser_settings settings_dontcall = + {.on_message_begin = dontcall_message_begin_cb + ,.on_header_field = dontcall_header_field_cb + ,.on_header_value = dontcall_header_value_cb + ,.on_url = dontcall_request_url_cb + ,.on_status = dontcall_response_status_cb + ,.on_body = dontcall_body_cb + ,.on_headers_complete = dontcall_headers_complete_cb + ,.on_message_complete = dontcall_message_complete_cb + ,.on_chunk_header = dontcall_chunk_header_cb + ,.on_chunk_complete = dontcall_chunk_complete_cb + }; + +/* These pause_* callbacks always pause the parser and just invoke the regular + * callback that tracks content. Before returning, we overwrite the parser + * settings to point to the _dontcall variety so that we can verify that + * the pause actually did, you know, pause. */ +int +pause_message_begin_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return message_begin_cb(p); +} + +int +pause_header_field_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return header_field_cb(p, buf, len); +} + +int +pause_header_value_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return header_value_cb(p, buf, len); +} + +int +pause_request_url_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return request_url_cb(p, buf, len); +} + +int +pause_body_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return body_cb(p, buf, len); +} + +int +pause_headers_complete_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return headers_complete_cb(p); +} + +int +pause_message_complete_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return message_complete_cb(p); +} + +int +pause_response_status_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return response_status_cb(p, buf, len); +} + +int +pause_chunk_header_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return chunk_header_cb(p); +} + +int +pause_chunk_complete_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return chunk_complete_cb(p); +} + +int +connect_headers_complete_cb (http_parser *p) +{ + headers_complete_cb(p); + return 1; +} + +int +connect_message_complete_cb (http_parser *p) +{ + messages[num_messages].should_keep_alive = http_should_keep_alive(parser); + return message_complete_cb(p); +} + +static http_parser_settings settings_pause = + {.on_message_begin = pause_message_begin_cb + ,.on_header_field = pause_header_field_cb + ,.on_header_value = pause_header_value_cb + ,.on_url = pause_request_url_cb + ,.on_status = pause_response_status_cb + ,.on_body = pause_body_cb + ,.on_headers_complete = pause_headers_complete_cb + ,.on_message_complete = pause_message_complete_cb + ,.on_chunk_header = pause_chunk_header_cb + ,.on_chunk_complete = pause_chunk_complete_cb + }; + +static http_parser_settings settings = + {.on_message_begin = message_begin_cb + ,.on_header_field = header_field_cb + ,.on_header_value = header_value_cb + ,.on_url = request_url_cb + ,.on_status = response_status_cb + ,.on_body = body_cb + ,.on_headers_complete = headers_complete_cb + ,.on_message_complete = message_complete_cb + ,.on_chunk_header = chunk_header_cb + ,.on_chunk_complete = chunk_complete_cb + }; + +static http_parser_settings settings_count_body = + {.on_message_begin = message_begin_cb + ,.on_header_field = header_field_cb + ,.on_header_value = header_value_cb + ,.on_url = request_url_cb + ,.on_status = response_status_cb + ,.on_body = count_body_cb + ,.on_headers_complete = headers_complete_cb + ,.on_message_complete = message_complete_cb + ,.on_chunk_header = chunk_header_cb + ,.on_chunk_complete = chunk_complete_cb + }; + +static http_parser_settings settings_connect = + {.on_message_begin = message_begin_cb + ,.on_header_field = header_field_cb + ,.on_header_value = header_value_cb + ,.on_url = request_url_cb + ,.on_status = response_status_cb + ,.on_body = dontcall_body_cb + ,.on_headers_complete = connect_headers_complete_cb + ,.on_message_complete = connect_message_complete_cb + ,.on_chunk_header = chunk_header_cb + ,.on_chunk_complete = chunk_complete_cb + }; + +static http_parser_settings settings_null = + {.on_message_begin = 0 + ,.on_header_field = 0 + ,.on_header_value = 0 + ,.on_url = 0 + ,.on_status = 0 + ,.on_body = 0 + ,.on_headers_complete = 0 + ,.on_message_complete = 0 + ,.on_chunk_header = 0 + ,.on_chunk_complete = 0 + }; + +void +parser_init (enum http_parser_type type) +{ + num_messages = 0; + + assert(parser == NULL); + + parser = malloc(sizeof(http_parser)); + + http_parser_init(parser, type); + + memset(&messages, 0, sizeof messages); + +} + +void +parser_free () +{ + assert(parser); + free(parser); + parser = NULL; +} + +size_t parse (const char *buf, size_t len) +{ + size_t nparsed; + currently_parsing_eof = (len == 0); + nparsed = http_parser_execute(parser, &settings, buf, len); + return nparsed; +} + +size_t parse_count_body (const char *buf, size_t len) +{ + size_t nparsed; + currently_parsing_eof = (len == 0); + nparsed = http_parser_execute(parser, &settings_count_body, buf, len); + return nparsed; +} + +size_t parse_pause (const char *buf, size_t len) +{ + size_t nparsed; + http_parser_settings s = settings_pause; + + currently_parsing_eof = (len == 0); + current_pause_parser = &s; + nparsed = http_parser_execute(parser, current_pause_parser, buf, len); + return nparsed; +} + +size_t parse_connect (const char *buf, size_t len) +{ + size_t nparsed; + currently_parsing_eof = (len == 0); + nparsed = http_parser_execute(parser, &settings_connect, buf, len); + return nparsed; +} + +static inline int +check_str_eq (const struct message *m, + const char *prop, + const char *expected, + const char *found) { + if ((expected == NULL) != (found == NULL)) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected %s\n", (expected == NULL) ? "NULL" : expected); + printf(" found %s\n", (found == NULL) ? "NULL" : found); + return 0; + } + if (expected != NULL && 0 != strcmp(expected, found)) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected '%s'\n", expected); + printf(" found '%s'\n", found); + return 0; + } + return 1; +} + +static inline int +check_num_eq (const struct message *m, + const char *prop, + int expected, + int found) { + if (expected != found) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected %d\n", expected); + printf(" found %d\n", found); + return 0; + } + return 1; +} + +#define MESSAGE_CHECK_STR_EQ(expected, found, prop) \ + if (!check_str_eq(expected, #prop, expected->prop, found->prop)) return 0 + +#define MESSAGE_CHECK_NUM_EQ(expected, found, prop) \ + if (!check_num_eq(expected, #prop, expected->prop, found->prop)) return 0 + +#define MESSAGE_CHECK_URL_EQ(u, expected, found, prop, fn) \ +do { \ + char ubuf[256]; \ + \ + if ((u)->field_set & (1 << (fn))) { \ + memcpy(ubuf, (found)->request_url + (u)->field_data[(fn)].off, \ + (u)->field_data[(fn)].len); \ + ubuf[(u)->field_data[(fn)].len] = '\0'; \ + } else { \ + ubuf[0] = '\0'; \ + } \ + \ + check_str_eq(expected, #prop, expected->prop, ubuf); \ +} while(0) + +int +message_eq (int index, int connect, const struct message *expected) +{ + int i; + struct message *m = &messages[index]; + + MESSAGE_CHECK_NUM_EQ(expected, m, http_major); + MESSAGE_CHECK_NUM_EQ(expected, m, http_minor); + + if (expected->type == HTTP_REQUEST) { + MESSAGE_CHECK_NUM_EQ(expected, m, method); + } else { + MESSAGE_CHECK_NUM_EQ(expected, m, status_code); + MESSAGE_CHECK_STR_EQ(expected, m, response_status); + assert(m->status_cb_called); + } + + if (!connect) { + MESSAGE_CHECK_NUM_EQ(expected, m, should_keep_alive); + MESSAGE_CHECK_NUM_EQ(expected, m, message_complete_on_eof); + } + + assert(m->message_begin_cb_called); + assert(m->headers_complete_cb_called); + assert(m->message_complete_cb_called); + + + MESSAGE_CHECK_STR_EQ(expected, m, request_url); + + /* Check URL components; we can't do this w/ CONNECT since it doesn't + * send us a well-formed URL. + */ + if (*m->request_url && m->method != HTTP_CONNECT) { + struct http_parser_url u; + + if (http_parser_parse_url(m->request_url, strlen(m->request_url), 0, &u)) { + fprintf(stderr, "\n\n*** failed to parse URL %s ***\n\n", + m->request_url); + abort(); + } + + if (expected->host) { + MESSAGE_CHECK_URL_EQ(&u, expected, m, host, UF_HOST); + } + + if (expected->userinfo) { + MESSAGE_CHECK_URL_EQ(&u, expected, m, userinfo, UF_USERINFO); + } + + m->port = (u.field_set & (1 << UF_PORT)) ? + u.port : 0; + + MESSAGE_CHECK_URL_EQ(&u, expected, m, query_string, UF_QUERY); + MESSAGE_CHECK_URL_EQ(&u, expected, m, fragment, UF_FRAGMENT); + MESSAGE_CHECK_URL_EQ(&u, expected, m, request_path, UF_PATH); + MESSAGE_CHECK_NUM_EQ(expected, m, port); + } + + if (connect) { + check_num_eq(m, "body_size", 0, m->body_size); + } else if (expected->body_size) { + MESSAGE_CHECK_NUM_EQ(expected, m, body_size); + } else { + MESSAGE_CHECK_STR_EQ(expected, m, body); + } + + if (connect) { + check_num_eq(m, "num_chunks_complete", 0, m->num_chunks_complete); + } else { + assert(m->num_chunks == m->num_chunks_complete); + MESSAGE_CHECK_NUM_EQ(expected, m, num_chunks_complete); + for (i = 0; i < m->num_chunks && i < MAX_CHUNKS; i++) { + MESSAGE_CHECK_NUM_EQ(expected, m, chunk_lengths[i]); + } + } + + MESSAGE_CHECK_NUM_EQ(expected, m, num_headers); + + int r; + for (i = 0; i < m->num_headers; i++) { + r = check_str_eq(expected, "header field", expected->headers[i][0], m->headers[i][0]); + if (!r) return 0; + r = check_str_eq(expected, "header value", expected->headers[i][1], m->headers[i][1]); + if (!r) return 0; + } + + if (!connect) { + MESSAGE_CHECK_STR_EQ(expected, m, upgrade); + } + + return 1; +} + +/* Given a sequence of varargs messages, return the number of them that the + * parser should successfully parse, taking into account that upgraded + * messages prevent all subsequent messages from being parsed. + */ +size_t +count_parsed_messages(const size_t nmsgs, ...) { + size_t i; + va_list ap; + + va_start(ap, nmsgs); + + for (i = 0; i < nmsgs; i++) { + struct message *m = va_arg(ap, struct message *); + + if (m->upgrade) { + va_end(ap); + return i + 1; + } + } + + va_end(ap); + return nmsgs; +} + +/* Given a sequence of bytes and the number of these that we were able to + * parse, verify that upgrade bodies are correct. + */ +void +upgrade_message_fix(char *body, const size_t nread, const size_t nmsgs, ...) { + va_list ap; + size_t i; + size_t off = 0; + + va_start(ap, nmsgs); + + for (i = 0; i < nmsgs; i++) { + struct message *m = va_arg(ap, struct message *); + + off += strlen(m->raw); + + if (m->upgrade) { + off -= strlen(m->upgrade); + + /* Check the portion of the response after its specified upgrade */ + if (!check_str_eq(m, "upgrade", body + off, body + nread)) { + abort(); + } + + /* Fix up the response so that message_eq() will verify the beginning + * of the upgrade */ + *(body + nread + strlen(m->upgrade)) = '\0'; + messages[num_messages -1 ].upgrade = body + nread; + + va_end(ap); + return; + } + } + + va_end(ap); + printf("\n\n*** Error: expected a message with upgrade ***\n"); + + abort(); +} + +static void +print_error (const char *raw, size_t error_location) +{ + fprintf(stderr, "\n*** %s ***\n\n", + http_errno_description(HTTP_PARSER_ERRNO(parser))); + + int this_line = 0, char_len = 0; + size_t i, j, len = strlen(raw), error_location_line = 0; + for (i = 0; i < len; i++) { + if (i == error_location) this_line = 1; + switch (raw[i]) { + case '\r': + char_len = 2; + fprintf(stderr, "\\r"); + break; + + case '\n': + fprintf(stderr, "\\n\n"); + + if (this_line) goto print; + + error_location_line = 0; + continue; + + default: + char_len = 1; + fputc(raw[i], stderr); + break; + } + if (!this_line) error_location_line += char_len; + } + + fprintf(stderr, "[eof]\n"); + + print: + for (j = 0; j < error_location_line; j++) { + fputc(' ', stderr); + } + fprintf(stderr, "^\n\nerror location: %u\n", (unsigned int)error_location); +} + +void +test_preserve_data (void) +{ + char my_data[] = "application-specific data"; + http_parser parser; + parser.data = my_data; + http_parser_init(&parser, HTTP_REQUEST); + if (parser.data != my_data) { + printf("\n*** parser.data not preserved accross http_parser_init ***\n\n"); + abort(); + } +} + +struct url_test { + const char *name; + const char *url; + int is_connect; + struct http_parser_url u; + int rv; +}; + +const struct url_test url_tests[] = +{ {.name="proxy request" + ,.url="http://hostname/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 7, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 15, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="proxy request with port" + ,.url="http://hostname:444/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PORT) | (1 << UF_PATH) + ,.port=444 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 7, 8 } /* UF_HOST */ + ,{ 16, 3 } /* UF_PORT */ + ,{ 19, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="CONNECT request" + ,.url="hostname:443" + ,.is_connect=1 + ,.u= + {.field_set=(1 << UF_HOST) | (1 << UF_PORT) + ,.port=443 + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 0, 8 } /* UF_HOST */ + ,{ 9, 3 } /* UF_PORT */ + ,{ 0, 0 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="CONNECT request but not connect" + ,.url="hostname:443" + ,.is_connect=0 + ,.rv=1 + } + +, {.name="proxy ipv6 request" + ,.url="http://[1:2::3:4]/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 17, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="proxy ipv6 request with port" + ,.url="http://[1:2::3:4]:67/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PORT) | (1 << UF_PATH) + ,.port=67 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 8 } /* UF_HOST */ + ,{ 18, 2 } /* UF_PORT */ + ,{ 20, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="CONNECT ipv6 address" + ,.url="[1:2::3:4]:443" + ,.is_connect=1 + ,.u= + {.field_set=(1 << UF_HOST) | (1 << UF_PORT) + ,.port=443 + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 1, 8 } /* UF_HOST */ + ,{ 11, 3 } /* UF_PORT */ + ,{ 0, 0 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="ipv4 in ipv6 address" + ,.url="http://[2001:0000:0000:0000:0000:0000:1.9.1.1]/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 37 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 46, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="extra ? in query string" + ,.url="http://a.tbcdn.cn/p/fp/2010c/??fp-header-min.css,fp-base-min.css," + "fp-channel-min.css,fp-product-min.css,fp-mall-min.css,fp-category-min.css," + "fp-sub-min.css,fp-gdp4p-min.css,fp-css3-min.css,fp-misc-min.css?t=20101022.css" + ,.is_connect=0 + ,.u= + {.field_set=(1<field_set, u->port); + for (i = 0; i < UF_MAX; i++) { + if ((u->field_set & (1 << i)) == 0) { + printf("\tfield_data[%u]: unset\n", i); + continue; + } + + printf("\tfield_data[%u]: off: %u len: %u part: \"%.*s\n\"", + i, + u->field_data[i].off, + u->field_data[i].len, + u->field_data[i].len, + url + u->field_data[i].off); + } +} + +void +test_parse_url (void) +{ + struct http_parser_url u; + const struct url_test *test; + unsigned int i; + int rv; + + for (i = 0; i < (sizeof(url_tests) / sizeof(url_tests[0])); i++) { + test = &url_tests[i]; + memset(&u, 0, sizeof(u)); + + rv = http_parser_parse_url(test->url, + strlen(test->url), + test->is_connect, + &u); + + if (test->rv == 0) { + if (rv != 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " + "unexpected rv %d ***\n\n", test->url, test->name, rv); + abort(); + } + + if (memcmp(&u, &test->u, sizeof(u)) != 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" failed ***\n", + test->url, test->name); + + printf("target http_parser_url:\n"); + dump_url(test->url, &test->u); + printf("result http_parser_url:\n"); + dump_url(test->url, &u); + + abort(); + } + } else { + /* test->rv != 0 */ + if (rv == 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " + "unexpected rv %d ***\n\n", test->url, test->name, rv); + abort(); + } + } + } +} + +void +test_method_str (void) +{ + assert(0 == strcmp("GET", http_method_str(HTTP_GET))); + assert(0 == strcmp("", http_method_str(1337))); +} + +void +test_message (const struct message *message) +{ + size_t raw_len = strlen(message->raw); + size_t msg1len; + for (msg1len = 0; msg1len < raw_len; msg1len++) { + parser_init(message->type); + + size_t read; + const char *msg1 = message->raw; + const char *msg2 = msg1 + msg1len; + size_t msg2len = raw_len - msg1len; + + if (msg1len) { + read = parse(msg1, msg1len); + + if (message->upgrade && parser->upgrade && num_messages > 0) { + messages[num_messages - 1].upgrade = msg1 + read; + goto test; + } + + if (read != msg1len) { + print_error(msg1, read); + abort(); + } + } + + + read = parse(msg2, msg2len); + + if (message->upgrade && parser->upgrade) { + messages[num_messages - 1].upgrade = msg2 + read; + goto test; + } + + if (read != msg2len) { + print_error(msg2, read); + abort(); + } + + read = parse(NULL, 0); + + if (read != 0) { + print_error(message->raw, read); + abort(); + } + + test: + + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); + abort(); + } + + if(!message_eq(0, 0, message)) abort(); + + parser_free(); + } +} + +void +test_message_count_body (const struct message *message) +{ + parser_init(message->type); + + size_t read; + size_t l = strlen(message->raw); + size_t i, toread; + size_t chunk = 4024; + + for (i = 0; i < l; i+= chunk) { + toread = MIN(l-i, chunk); + read = parse_count_body(message->raw + i, toread); + if (read != toread) { + print_error(message->raw, read); + abort(); + } + } + + + read = parse_count_body(NULL, 0); + if (read != 0) { + print_error(message->raw, read); + abort(); + } + + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); + abort(); + } + + if(!message_eq(0, 0, message)) abort(); + + parser_free(); +} + +void +test_simple_type (const char *buf, + enum http_errno err_expected, + enum http_parser_type type) +{ + parser_init(type); + + enum http_errno err; + + parse(buf, strlen(buf)); + err = HTTP_PARSER_ERRNO(parser); + parse(NULL, 0); + + parser_free(); + + /* In strict mode, allow us to pass with an unexpected HPE_STRICT as + * long as the caller isn't expecting success. + */ +#if HTTP_PARSER_STRICT + if (err_expected != err && err_expected != HPE_OK && err != HPE_STRICT) { +#else + if (err_expected != err) { +#endif + fprintf(stderr, "\n*** test_simple expected %s, but saw %s ***\n\n%s\n", + http_errno_name(err_expected), http_errno_name(err), buf); + abort(); + } +} + +void +test_simple (const char *buf, enum http_errno err_expected) +{ + test_simple_type(buf, err_expected, HTTP_REQUEST); +} + +void +test_invalid_header_content (int req, const char* str) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? + "GET / HTTP/1.1\r\n" : + "HTTP/1.1 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = str; + size_t buflen = strlen(buf); + + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + assert(HTTP_PARSER_ERRNO(&parser) == HPE_INVALID_HEADER_TOKEN); + return; + } + + fprintf(stderr, + "\n*** Error expected but none in invalid header content test ***\n"); + abort(); +} + +void +test_invalid_header_field_content_error (int req) +{ + test_invalid_header_content(req, "Foo: F\01ailure"); + test_invalid_header_content(req, "Foo: B\02ar"); +} + +void +test_invalid_header_field (int req, const char* str) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? + "GET / HTTP/1.1\r\n" : + "HTTP/1.1 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = str; + size_t buflen = strlen(buf); + + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + assert(HTTP_PARSER_ERRNO(&parser) == HPE_INVALID_HEADER_TOKEN); + return; + } + + fprintf(stderr, + "\n*** Error expected but none in invalid header token test ***\n"); + abort(); +} + +void +test_invalid_header_field_token_error (int req) +{ + test_invalid_header_field(req, "Fo@: Failure"); + test_invalid_header_field(req, "Foo\01\test: Bar"); +} + +void +test_double_content_length_error (int req) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? + "GET / HTTP/1.1\r\n" : + "HTTP/1.1 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = "Content-Length: 0\r\nContent-Length: 1\r\n\r\n"; + size_t buflen = strlen(buf); + + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + assert(HTTP_PARSER_ERRNO(&parser) == HPE_UNEXPECTED_CONTENT_LENGTH); + return; + } + + fprintf(stderr, + "\n*** Error expected but none in double content-length test ***\n"); + abort(); +} + +void +test_chunked_content_length_error (int req) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? + "GET / HTTP/1.1\r\n" : + "HTTP/1.1 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = "Transfer-Encoding: chunked\r\nContent-Length: 1\r\n\r\n"; + size_t buflen = strlen(buf); + + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + assert(HTTP_PARSER_ERRNO(&parser) == HPE_UNEXPECTED_CONTENT_LENGTH); + return; + } + + fprintf(stderr, + "\n*** Error expected but none in chunked content-length test ***\n"); + abort(); +} + +void +test_header_cr_no_lf_error (int req) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? + "GET / HTTP/1.1\r\n" : + "HTTP/1.1 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = "Foo: 1\rBar: 1\r\n\r\n"; + size_t buflen = strlen(buf); + + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + assert(HTTP_PARSER_ERRNO(&parser) == HPE_LF_EXPECTED); + return; + } + + fprintf(stderr, + "\n*** Error expected but none in header whitespace test ***\n"); + abort(); +} + +void +test_header_overflow_error (int req) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? "GET / HTTP/1.1\r\n" : "HTTP/1.0 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = "header-key: header-value\r\n"; + size_t buflen = strlen(buf); + + int i; + for (i = 0; i < 10000; i++) { + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + //fprintf(stderr, "error found on iter %d\n", i); + assert(HTTP_PARSER_ERRNO(&parser) == HPE_HEADER_OVERFLOW); + return; + } + } + + fprintf(stderr, "\n*** Error expected but none in header overflow test ***\n"); + abort(); +} + + +void +test_header_nread_value () +{ + http_parser parser; + http_parser_init(&parser, HTTP_REQUEST); + size_t parsed; + const char *buf; + buf = "GET / HTTP/1.1\r\nheader: value\nhdr: value\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + assert(parser.nread == strlen(buf)); +} + + +static void +test_content_length_overflow (const char *buf, size_t buflen, int expect_ok) +{ + http_parser parser; + http_parser_init(&parser, HTTP_RESPONSE); + http_parser_execute(&parser, &settings_null, buf, buflen); + + if (expect_ok) + assert(HTTP_PARSER_ERRNO(&parser) == HPE_OK); + else + assert(HTTP_PARSER_ERRNO(&parser) == HPE_INVALID_CONTENT_LENGTH); +} + +void +test_header_content_length_overflow_error (void) +{ +#define X(size) \ + "HTTP/1.1 200 OK\r\n" \ + "Content-Length: " #size "\r\n" \ + "\r\n" + const char a[] = X(1844674407370955160); /* 2^64 / 10 - 1 */ + const char b[] = X(18446744073709551615); /* 2^64-1 */ + const char c[] = X(18446744073709551616); /* 2^64 */ +#undef X + test_content_length_overflow(a, sizeof(a) - 1, 1); /* expect ok */ + test_content_length_overflow(b, sizeof(b) - 1, 0); /* expect failure */ + test_content_length_overflow(c, sizeof(c) - 1, 0); /* expect failure */ +} + +void +test_chunk_content_length_overflow_error (void) +{ +#define X(size) \ + "HTTP/1.1 200 OK\r\n" \ + "Transfer-Encoding: chunked\r\n" \ + "\r\n" \ + #size "\r\n" \ + "..." + const char a[] = X(FFFFFFFFFFFFFFE); /* 2^64 / 16 - 1 */ + const char b[] = X(FFFFFFFFFFFFFFFF); /* 2^64-1 */ + const char c[] = X(10000000000000000); /* 2^64 */ +#undef X + test_content_length_overflow(a, sizeof(a) - 1, 1); /* expect ok */ + test_content_length_overflow(b, sizeof(b) - 1, 0); /* expect failure */ + test_content_length_overflow(c, sizeof(c) - 1, 0); /* expect failure */ +} + +void +test_no_overflow_long_body (int req, size_t length) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + size_t i; + char buf1[3000]; + size_t buf1len = sprintf(buf1, "%s\r\nConnection: Keep-Alive\r\nContent-Length: %lu\r\n\r\n", + req ? "POST / HTTP/1.0" : "HTTP/1.0 200 OK", (unsigned long)length); + parsed = http_parser_execute(&parser, &settings_null, buf1, buf1len); + if (parsed != buf1len) + goto err; + + for (i = 0; i < length; i++) { + char foo = 'a'; + parsed = http_parser_execute(&parser, &settings_null, &foo, 1); + if (parsed != 1) + goto err; + } + + parsed = http_parser_execute(&parser, &settings_null, buf1, buf1len); + if (parsed != buf1len) goto err; + return; + + err: + fprintf(stderr, + "\n*** error in test_no_overflow_long_body %s of length %lu ***\n", + req ? "REQUEST" : "RESPONSE", + (unsigned long)length); + abort(); +} + +void +test_multiple3 (const struct message *r1, const struct message *r2, const struct message *r3) +{ + int message_count = count_parsed_messages(3, r1, r2, r3); + + char total[ strlen(r1->raw) + + strlen(r2->raw) + + strlen(r3->raw) + + 1 + ]; + total[0] = '\0'; + + strcat(total, r1->raw); + strcat(total, r2->raw); + strcat(total, r3->raw); + + parser_init(r1->type); + + size_t read; + + read = parse(total, strlen(total)); + + if (parser->upgrade) { + upgrade_message_fix(total, read, 3, r1, r2, r3); + goto test; + } + + if (read != strlen(total)) { + print_error(total, read); + abort(); + } + + read = parse(NULL, 0); + + if (read != 0) { + print_error(total, read); + abort(); + } + +test: + + if (message_count != num_messages) { + fprintf(stderr, "\n\n*** Parser didn't see 3 messages only %d *** \n", num_messages); + abort(); + } + + if (!message_eq(0, 0, r1)) abort(); + if (message_count > 1 && !message_eq(1, 0, r2)) abort(); + if (message_count > 2 && !message_eq(2, 0, r3)) abort(); + + parser_free(); +} + +/* SCAN through every possible breaking to make sure the + * parser can handle getting the content in any chunks that + * might come from the socket + */ +void +test_scan (const struct message *r1, const struct message *r2, const struct message *r3) +{ + char total[80*1024] = "\0"; + char buf1[80*1024] = "\0"; + char buf2[80*1024] = "\0"; + char buf3[80*1024] = "\0"; + + strcat(total, r1->raw); + strcat(total, r2->raw); + strcat(total, r3->raw); + + size_t read; + + int total_len = strlen(total); + + int total_ops = 2 * (total_len - 1) * (total_len - 2) / 2; + int ops = 0 ; + + size_t buf1_len, buf2_len, buf3_len; + int message_count = count_parsed_messages(3, r1, r2, r3); + + int i,j,type_both; + for (type_both = 0; type_both < 2; type_both ++ ) { + for (j = 2; j < total_len; j ++ ) { + for (i = 1; i < j; i ++ ) { + + if (ops % 1000 == 0) { + printf("\b\b\b\b%3.0f%%", 100 * (float)ops /(float)total_ops); + fflush(stdout); + } + ops += 1; + + parser_init(type_both ? HTTP_BOTH : r1->type); + + buf1_len = i; + strlncpy(buf1, sizeof(buf1), total, buf1_len); + buf1[buf1_len] = 0; + + buf2_len = j - i; + strlncpy(buf2, sizeof(buf1), total+i, buf2_len); + buf2[buf2_len] = 0; + + buf3_len = total_len - j; + strlncpy(buf3, sizeof(buf1), total+j, buf3_len); + buf3[buf3_len] = 0; + + read = parse(buf1, buf1_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len) { + print_error(buf1, read); + goto error; + } + + read += parse(buf2, buf2_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len + buf2_len) { + print_error(buf2, read); + goto error; + } + + read += parse(buf3, buf3_len); + + if (parser->upgrade) goto test; + + if (read != buf1_len + buf2_len + buf3_len) { + print_error(buf3, read); + goto error; + } + + parse(NULL, 0); + +test: + if (parser->upgrade) { + upgrade_message_fix(total, read, 3, r1, r2, r3); + } + + if (message_count != num_messages) { + fprintf(stderr, "\n\nParser didn't see %d messages only %d\n", + message_count, num_messages); + goto error; + } + + if (!message_eq(0, 0, r1)) { + fprintf(stderr, "\n\nError matching messages[0] in test_scan.\n"); + goto error; + } + + if (message_count > 1 && !message_eq(1, 0, r2)) { + fprintf(stderr, "\n\nError matching messages[1] in test_scan.\n"); + goto error; + } + + if (message_count > 2 && !message_eq(2, 0, r3)) { + fprintf(stderr, "\n\nError matching messages[2] in test_scan.\n"); + goto error; + } + + parser_free(); + } + } + } + puts("\b\b\b\b100%"); + return; + + error: + fprintf(stderr, "i=%d j=%d\n", i, j); + fprintf(stderr, "buf1 (%u) %s\n\n", (unsigned int)buf1_len, buf1); + fprintf(stderr, "buf2 (%u) %s\n\n", (unsigned int)buf2_len , buf2); + fprintf(stderr, "buf3 (%u) %s\n", (unsigned int)buf3_len, buf3); + abort(); +} + +// user required to free the result +// string terminated by \0 +char * +create_large_chunked_message (int body_size_in_kb, const char* headers) +{ + int i; + size_t wrote = 0; + size_t headers_len = strlen(headers); + size_t bufsize = headers_len + (5+1024+2)*body_size_in_kb + 6; + char * buf = malloc(bufsize); + + memcpy(buf, headers, headers_len); + wrote += headers_len; + + for (i = 0; i < body_size_in_kb; i++) { + // write 1kb chunk into the body. + memcpy(buf + wrote, "400\r\n", 5); + wrote += 5; + memset(buf + wrote, 'C', 1024); + wrote += 1024; + strcpy(buf + wrote, "\r\n"); + wrote += 2; + } + + memcpy(buf + wrote, "0\r\n\r\n", 6); + wrote += 6; + assert(wrote == bufsize); + + return buf; +} + +/* Verify that we can pause parsing at any of the bytes in the + * message and still get the result that we're expecting. */ +void +test_message_pause (const struct message *msg) +{ + char *buf = (char*) msg->raw; + size_t buflen = strlen(msg->raw); + size_t nread; + + parser_init(msg->type); + + do { + nread = parse_pause(buf, buflen); + + // We can only set the upgrade buffer once we've gotten our message + // completion callback. + if (messages[0].message_complete_cb_called && + msg->upgrade && + parser->upgrade) { + messages[0].upgrade = buf + nread; + goto test; + } + + if (nread < buflen) { + + // Not much do to if we failed a strict-mode check + if (HTTP_PARSER_ERRNO(parser) == HPE_STRICT) { + parser_free(); + return; + } + + assert (HTTP_PARSER_ERRNO(parser) == HPE_PAUSED); + } + + buf += nread; + buflen -= nread; + http_parser_pause(parser, 0); + } while (buflen > 0); + + nread = parse_pause(NULL, 0); + assert (nread == 0); + +test: + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", msg->name); + abort(); + } + + if(!message_eq(0, 0, msg)) abort(); + + parser_free(); +} + +/* Verify that body and next message won't be parsed in responses to CONNECT */ +void +test_message_connect (const struct message *msg) +{ + char *buf = (char*) msg->raw; + size_t buflen = strlen(msg->raw); + + parser_init(msg->type); + + parse_connect(buf, buflen); + + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", msg->name); + abort(); + } + + if(!message_eq(0, 1, msg)) abort(); + + parser_free(); +} + +int +main (void) +{ + parser = NULL; + int i, j, k; + int request_count; + int response_count; + unsigned long version; + unsigned major; + unsigned minor; + unsigned patch; + + version = http_parser_version(); + major = (version >> 16) & 255; + minor = (version >> 8) & 255; + patch = version & 255; + printf("http_parser v%u.%u.%u (0x%06lx)\n", major, minor, patch, version); + + printf("sizeof(http_parser) = %u\n", (unsigned int)sizeof(http_parser)); + + for (request_count = 0; requests[request_count].name; request_count++); + for (response_count = 0; responses[response_count].name; response_count++); + + //// API + test_preserve_data(); + test_parse_url(); + test_method_str(); + + //// NREAD + test_header_nread_value(); + + //// OVERFLOW CONDITIONS + + test_header_overflow_error(HTTP_REQUEST); + test_no_overflow_long_body(HTTP_REQUEST, 1000); + test_no_overflow_long_body(HTTP_REQUEST, 100000); + + test_header_overflow_error(HTTP_RESPONSE); + test_no_overflow_long_body(HTTP_RESPONSE, 1000); + test_no_overflow_long_body(HTTP_RESPONSE, 100000); + + test_header_content_length_overflow_error(); + test_chunk_content_length_overflow_error(); + + //// HEADER FIELD CONDITIONS + test_double_content_length_error(HTTP_REQUEST); + test_chunked_content_length_error(HTTP_REQUEST); + test_header_cr_no_lf_error(HTTP_REQUEST); + test_invalid_header_field_token_error(HTTP_REQUEST); + test_invalid_header_field_content_error(HTTP_REQUEST); + test_double_content_length_error(HTTP_RESPONSE); + test_chunked_content_length_error(HTTP_RESPONSE); + test_header_cr_no_lf_error(HTTP_RESPONSE); + test_invalid_header_field_token_error(HTTP_RESPONSE); + test_invalid_header_field_content_error(HTTP_RESPONSE); + + //// RESPONSES + + test_simple_type("HTP/1.1 200 OK\r\n\r\n", HPE_INVALID_VERSION, HTTP_RESPONSE); + test_simple_type("HTTP/01.1 200 OK\r\n\r\n", HPE_INVALID_VERSION, HTTP_RESPONSE); + test_simple_type("HTTP/11.1 200 OK\r\n\r\n", HPE_INVALID_VERSION, HTTP_RESPONSE); + test_simple_type("HTTP/1.01 200 OK\r\n\r\n", HPE_INVALID_VERSION, HTTP_RESPONSE); + test_simple_type("HTTP/1.1\t200 OK\r\n\r\n", HPE_INVALID_VERSION, HTTP_RESPONSE); + + for (i = 0; i < response_count; i++) { + test_message(&responses[i]); + } + + for (i = 0; i < response_count; i++) { + test_message_pause(&responses[i]); + } + + for (i = 0; i < response_count; i++) { + test_message_connect(&responses[i]); + } + + for (i = 0; i < response_count; i++) { + if (!responses[i].should_keep_alive) continue; + for (j = 0; j < response_count; j++) { + if (!responses[j].should_keep_alive) continue; + for (k = 0; k < response_count; k++) { + test_multiple3(&responses[i], &responses[j], &responses[k]); + } + } + } + + test_message_count_body(&responses[NO_HEADERS_NO_BODY_404]); + test_message_count_body(&responses[TRAILING_SPACE_ON_CHUNKED_BODY]); + + // test very large chunked response + { + char * msg = create_large_chunked_message(31337, + "HTTP/1.0 200 OK\r\n" + "Transfer-Encoding: chunked\r\n" + "Content-Type: text/plain\r\n" + "\r\n"); + struct message large_chunked = + {.name= "large chunked" + ,.type= HTTP_RESPONSE + ,.raw= msg + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 2 + ,.headers= + { { "Transfer-Encoding", "chunked" } + , { "Content-Type", "text/plain" } + } + ,.body_size= 31337*1024 + ,.num_chunks_complete= 31338 + }; + for (i = 0; i < MAX_CHUNKS; i++) { + large_chunked.chunk_lengths[i] = 1024; + } + test_message_count_body(&large_chunked); + free(msg); + } + + + + printf("response scan 1/2 "); + test_scan( &responses[TRAILING_SPACE_ON_CHUNKED_BODY] + , &responses[NO_BODY_HTTP10_KA_204] + , &responses[NO_REASON_PHRASE] + ); + + printf("response scan 2/2 "); + test_scan( &responses[BONJOUR_MADAME_FR] + , &responses[UNDERSTORE_HEADER_KEY] + , &responses[NO_CARRIAGE_RET] + ); + + puts("responses okay"); + + + /// REQUESTS + + test_simple("GET / HTP/1.1\r\n\r\n", HPE_INVALID_VERSION); + test_simple("GET / HTTP/01.1\r\n\r\n", HPE_INVALID_VERSION); + test_simple("GET / HTTP/11.1\r\n\r\n", HPE_INVALID_VERSION); + test_simple("GET / HTTP/1.01\r\n\r\n", HPE_INVALID_VERSION); + + // Extended characters - see nodejs/test/parallel/test-http-headers-obstext.js + test_simple("GET / HTTP/1.1\r\n" + "Test: Düsseldorf\r\n", + HPE_OK); + + // Well-formed but incomplete + test_simple("GET / HTTP/1.1\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: 6\r\n" + "\r\n" + "fooba", + HPE_OK); + + static const char *all_methods[] = { + "DELETE", + "GET", + "HEAD", + "POST", + "PUT", + //"CONNECT", //CONNECT can't be tested like other methods, it's a tunnel + "OPTIONS", + "TRACE", + "COPY", + "LOCK", + "MKCOL", + "MOVE", + "PROPFIND", + "PROPPATCH", + "SEARCH", + "UNLOCK", + "BIND", + "REBIND", + "UNBIND", + "ACL", + "REPORT", + "MKACTIVITY", + "CHECKOUT", + "MERGE", + "M-SEARCH", + "NOTIFY", + "SUBSCRIBE", + "UNSUBSCRIBE", + "PATCH", + "PURGE", + "MKCALENDAR", + "LINK", + "UNLINK", + 0 }; + const char **this_method; + for (this_method = all_methods; *this_method; this_method++) { + char buf[200]; + sprintf(buf, "%s / HTTP/1.1\r\n\r\n", *this_method); + test_simple(buf, HPE_OK); + } + + static const char *bad_methods[] = { + "ASDF", + "C******", + "COLA", + "GEM", + "GETA", + "M****", + "MKCOLA", + "PROPPATCHA", + "PUN", + "PX", + "SA", + "hello world", + 0 }; + for (this_method = bad_methods; *this_method; this_method++) { + char buf[200]; + sprintf(buf, "%s / HTTP/1.1\r\n\r\n", *this_method); + test_simple(buf, HPE_INVALID_METHOD); + } + + // illegal header field name line folding + test_simple("GET / HTTP/1.1\r\n" + "name\r\n" + " : value\r\n" + "\r\n", + HPE_INVALID_HEADER_TOKEN); + + const char *dumbfuck2 = + "GET / HTTP/1.1\r\n" + "X-SSL-Bullshit: -----BEGIN CERTIFICATE-----\r\n" + "\tMIIFbTCCBFWgAwIBAgICH4cwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVUsx\r\n" + "\tETAPBgNVBAoTCGVTY2llbmNlMRIwEAYDVQQLEwlBdXRob3JpdHkxCzAJBgNVBAMT\r\n" + "\tAkNBMS0wKwYJKoZIhvcNAQkBFh5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMu\r\n" + "\tdWswHhcNMDYwNzI3MTQxMzI4WhcNMDcwNzI3MTQxMzI4WjBbMQswCQYDVQQGEwJV\r\n" + "\tSzERMA8GA1UEChMIZVNjaWVuY2UxEzARBgNVBAsTCk1hbmNoZXN0ZXIxCzAJBgNV\r\n" + "\tBAcTmrsogriqMWLAk1DMRcwFQYDVQQDEw5taWNoYWVsIHBhcmQYJKoZIhvcNAQEB\r\n" + "\tBQADggEPADCCAQoCggEBANPEQBgl1IaKdSS1TbhF3hEXSl72G9J+WC/1R64fAcEF\r\n" + "\tW51rEyFYiIeZGx/BVzwXbeBoNUK41OK65sxGuflMo5gLflbwJtHBRIEKAfVVp3YR\r\n" + "\tgW7cMA/s/XKgL1GEC7rQw8lIZT8RApukCGqOVHSi/F1SiFlPDxuDfmdiNzL31+sL\r\n" + "\t0iwHDdNkGjy5pyBSB8Y79dsSJtCW/iaLB0/n8Sj7HgvvZJ7x0fr+RQjYOUUfrePP\r\n" + "\tu2MSpFyf+9BbC/aXgaZuiCvSR+8Snv3xApQY+fULK/xY8h8Ua51iXoQ5jrgu2SqR\r\n" + "\twgA7BUi3G8LFzMBl8FRCDYGUDy7M6QaHXx1ZWIPWNKsCAwEAAaOCAiQwggIgMAwG\r\n" + "\tA1UdEwEB/wQCMAAwEQYJYIZIAYb4QgHTTPAQDAgWgMA4GA1UdDwEB/wQEAwID6DAs\r\n" + "\tBglghkgBhvhCAQ0EHxYdVUsgZS1TY2llbmNlIFVzZXIgQ2VydGlmaWNhdGUwHQYD\r\n" + "\tVR0OBBYEFDTt/sf9PeMaZDHkUIldrDYMNTBZMIGaBgNVHSMEgZIwgY+AFAI4qxGj\r\n" + "\tloCLDdMVKwiljjDastqooXSkcjBwMQswCQYDVQQGEwJVSzERMA8GA1UEChMIZVNj\r\n" + "\taWVuY2UxEjAQBgNVBAsTCUF1dGhvcml0eTELMAkGA1UEAxMCQ0ExLTArBgkqhkiG\r\n" + "\t9w0BCQEWHmNhLW9wZXJhdG9yQGdyaWQtc3VwcG9ydC5hYy51a4IBADApBgNVHRIE\r\n" + "\tIjAggR5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMudWswGQYDVR0gBBIwEDAO\r\n" + "\tBgwrBgEEAdkvAQEBAQYwPQYJYIZIAYb4QgEEBDAWLmh0dHA6Ly9jYS5ncmlkLXN1\r\n" + "\tcHBvcnQuYWMudmT4sopwqlBWsvcHViL2NybC9jYWNybC5jcmwwPQYJYIZIAYb4QgEDBDAWLmh0\r\n" + "\tdHA6Ly9jYS5ncmlkLXN1cHBvcnQuYWMudWsvcHViL2NybC9jYWNybC5jcmwwPwYD\r\n" + "\tVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NhLmdyaWQt5hYy51ay9wdWIv\r\n" + "\tY3JsL2NhY3JsLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAS/U4iiooBENGW/Hwmmd3\r\n" + "\tXCy6Zrt08YjKCzGNjorT98g8uGsqYjSxv/hmi0qlnlHs+k/3Iobc3LjS5AMYr5L8\r\n" + "\tUO7OSkgFFlLHQyC9JzPfmLCAugvzEbyv4Olnsr8hbxF1MbKZoQxUZtMVu29wjfXk\r\n" + "\thTeApBv7eaKCWpSp7MCbvgzm74izKhu3vlDk9w6qVrxePfGgpKPqfHiOoGhFnbTK\r\n" + "\twTC6o2xq5y0qZ03JonF7OJspEd3I5zKY3E+ov7/ZhW6DqT8UFvsAdjvQbXyhV8Eu\r\n" + "\tYhixw1aKEPzNjNowuIseVogKOLXxWI5vAi5HgXdS0/ES5gDGsABo4fqovUKlgop3\r\n" + "\tRA==\r\n" + "\t-----END CERTIFICATE-----\r\n" + "\r\n"; + test_simple(dumbfuck2, HPE_OK); + + const char *corrupted_connection = + "GET / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Connection\r\033\065\325eep-Alive\r\n" + "Accept-Encoding: gzip\r\n" + "\r\n"; + test_simple(corrupted_connection, HPE_INVALID_HEADER_TOKEN); + + const char *corrupted_header_name = + "GET / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "X-Some-Header\r\033\065\325eep-Alive\r\n" + "Accept-Encoding: gzip\r\n" + "\r\n"; + test_simple(corrupted_header_name, HPE_INVALID_HEADER_TOKEN); + +#if 0 + // NOTE(Wed Nov 18 11:57:27 CET 2009) this seems okay. we just read body + // until EOF. + // + // no content-length + // error if there is a body without content length + const char *bad_get_no_headers_no_body = "GET /bad_get_no_headers_no_body/world HTTP/1.1\r\n" + "Accept: */*\r\n" + "\r\n" + "HELLO"; + test_simple(bad_get_no_headers_no_body, 0); +#endif + /* TODO sending junk and large headers gets rejected */ + + + /* check to make sure our predefined requests are okay */ + for (i = 0; requests[i].name; i++) { + test_message(&requests[i]); + } + + for (i = 0; i < request_count; i++) { + test_message_pause(&requests[i]); + } + + for (i = 0; i < request_count; i++) { + if (!requests[i].should_keep_alive) continue; + for (j = 0; j < request_count; j++) { + if (!requests[j].should_keep_alive) continue; + for (k = 0; k < request_count; k++) { + test_multiple3(&requests[i], &requests[j], &requests[k]); + } + } + } + + printf("request scan 1/4 "); + test_scan( &requests[GET_NO_HEADERS_NO_BODY] + , &requests[GET_ONE_HEADER_NO_BODY] + , &requests[GET_NO_HEADERS_NO_BODY] + ); + + printf("request scan 2/4 "); + test_scan( &requests[POST_CHUNKED_ALL_YOUR_BASE] + , &requests[POST_IDENTITY_BODY_WORLD] + , &requests[GET_FUNKY_CONTENT_LENGTH] + ); + + printf("request scan 3/4 "); + test_scan( &requests[TWO_CHUNKS_MULT_ZERO_END] + , &requests[CHUNKED_W_TRAILING_HEADERS] + , &requests[CHUNKED_W_BULLSHIT_AFTER_LENGTH] + ); + + printf("request scan 4/4 "); + test_scan( &requests[QUERY_URL_WITH_QUESTION_MARK_GET] + , &requests[PREFIX_NEWLINE_GET ] + , &requests[CONNECT_REQUEST] + ); + + puts("requests okay"); + + return 0; +} diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/Changes b/deps/ngtcp2/ngtcp2/third-party/libev/Changes new file mode 100644 index 000000000000..d200b9ee11e5 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/Changes @@ -0,0 +1,617 @@ +Revision history for libev, a high-performance and full-featured event loop. + +TODO: for next ABI/API change, consider moving EV__IOFDSSET into io->fd instead and provide a getter. +TODO: document EV_TSTAMP_T + +4.33 Wed Mar 18 13:22:29 CET 2020 + - no changes w.r.t. 4.32. + +4.32 (EV only) + - the 4.31 timerfd code wrongly changed the priority of the signal + fd watcher, which is usually harmless unless signal fds are + also used (found via cpan tester service). + - the documentation wrongly claimed that user may modify fd and events + members in io watchers when the watcher was stopped + (found by b_jonas). + - new ev_io_modify mutator which changes only the events member, + which can be faster. also added ev::io::set (int events) method + to ev++.h. + - officially allow a zero events mask for io watchers. this should + work with older libev versions as well but was not officially + allowed before. + - do not wake up every minute when timerfd is used to detect timejumps. + - do not wake up every minute when periodics are disabled and we have + a monotonic clock. + - support a lot more "uncommon" compile time configurations, + such as ev_embed enabled but ev_timer disabled. + - use a start/stop wrapper class to reduce code duplication in + ev++.h and make it needlessly more c++-y. + - the linux aio backend is no longer compiled in by default. + - update to libecb version 0x00010008. + +4.31 Fri Dec 20 21:58:29 CET 2019 + - handle backends with minimum wait time a bit better by not + waiting in the presence of already-expired timers + (behaviour reported by Felipe Gasper). + - new feature: use timerfd to detect timejumps quickly, + can be disabled with the new EVFLAG_NOTIMERFD loop flag. + - document EV_USE_SIGNALFD feature macro. + +4.30 (EV only) + - change non-autoconf test for __kernel_rwf_t by testing + LINUX_VERSION_CODE, the most direct test I could find. + - fix a bug in the io_uring backend that polled the wrong + backend fd, causing it to not work in many cases. + +4.29 (EV only) + - add io uring autoconf and non-autoconf detection. + - disable io_uring when some header files are too old. + +4.28 (EV only) + - linuxaio backend resulted in random memory corruption + when loop is forked. + - linuxaio backend might have tried to cancel an iocb + multiple times (was unable to trigger this). + - linuxaio backend now employs a generation counter to + avoid handling spurious events from cancelled requests. + - io_cancel can return EINTR, deal with it. also, assume + io_submit also returns EINTR. + - fix some other minor bugs in linuxaio backend. + - ev_tstamp type can now be overriden by defining EV_TSTAMP_T. + - cleanup: replace expect_true/false and noinline by their + libecb counterparts. + - move syscall infrastructure from ev_linuxaio.c to ev.c. + - prepare io_uring integration. + - tweak ev_floor. + - epoll, poll, win32 Sleep and other places that use millisecond + reslution now all try to round up times. + - solaris port backend didn't compile. + - abstract time constants into their macros, for more flexibility. + +4.27 Thu Jun 27 22:43:44 CEST 2019 + - linux aio backend almost completely rewritten to work around its + limitations. + - linux aio backend now requires linux 4.19+. + - epoll backend now mandatory for linux aio backend. + - fail assertions more aggressively on invalid fd's detected + in the event loop, do not just silently fd_kill in case of + user error. + - ev_io_start/ev_io_stop now verify the watcher fd using + a syscall when EV_VERIFY is 2 or higher. + +4.26 (EV only) + - update to libecb 0x00010006. + - new experimental linux aio backend (linux 4.18+). + - removed redundant 0-ptr check in ev_once. + - updated/extended ev_set_allocator documentation. + - replaced EMPTY2 macro by array_needsize_noinit. + - minor code cleanups. + - epoll backend now uses epoll_create1 also after fork. + +4.25 Fri Dec 21 07:49:20 CET 2018 + - INCOMPATIBLE CHANGE: EV_THROW was renamed to EV_NOEXCEPT + (EV_THROW still provided) and now uses noexcept on C++11 or newer. + - move the darwin select workaround higher in ev.c, as newer versions of + darwin managed to break their broken select even more. + - ANDROID => __ANDROID__ (reported by enh@google.com). + - disable epoll_create1 on android because it has broken header files + and google is unwilling to fix them (reported by enh@google.com). + - avoid a minor compilation warning on win32. + - c++: remove deprecated dynamic throw() specifications. + - c++: improve the (unsupported) bad_loop exception class. + - backport perl ev_periodic example to C, untested. + - update libecb, biggets change is to include a memory fence + in ECB_MEMORY_FENCE_RELEASE on x86/amd64. + - minor autoconf/automake modernisation. + +4.24 Wed Dec 28 05:19:55 CET 2016 + - bump version to 4.24, as the release tarball inexplicably + didn't have the right version in ev.h, even though the cvs-tagged + version did have the right one (reported by Ales Teska). + +4.23 Wed Nov 16 18:23:41 CET 2016 + - move some declarations at the beginning to help certain retarded + microsoft compilers, even though their documentation claims + otherwise (reported by Ruslan Osmanov). + +4.22 Sun Dec 20 22:11:50 CET 2015 + - when epoll detects unremovable fds in the fd set, rebuild + only the epoll descriptor, not the signal pipe, to avoid + SIGPIPE in ev_async_send. This doesn't solve it on fork, + so document what needs to be done in ev_loop_fork + (analyzed by Benjamin Mahler). + - remove superfluous sys/timeb.h include on win32 + (analyzed by Jason Madden). + - updated libecb. + +4.20 Sat Jun 20 13:01:43 CEST 2015 + - prefer noexcept over throw () with C++ 11. + - update ecb.h due to incompatibilities with c11. + - fix a potential aliasing issue when reading and writing + watcher callbacks. + +4.19 Thu Sep 25 08:18:25 CEST 2014 + - ev.h wasn't valid C++ anymore, which tripped compilers other than + clang, msvc or gcc (analyzed by Raphael 'kena' Poss). Unfortunately, + C++ doesn't support typedefs for function pointers fully, so the affected + declarations have to spell out the types each time. + - when not using autoconf, tighten the check for clock_gettime and related + functionality. + +4.18 Fri Sep 5 17:55:26 CEST 2014 + - events on files were not always generated properly with the + epoll backend (testcase by Assaf Inbal). + - mark event pipe fd as cloexec after a fork (analyzed by Sami Farin). + - (ecb) support m68k, m88k and sh (patch by Miod Vallat). + - use a reasonable fallback for EV_NSIG instead of erroring out + when we can't detect the signal set size. + - in the absence of autoconf, do not use the clock syscall + on glibc >= 2.17 (avoids the syscall AND -lrt on systems + doing clock_gettime in userspace). + - ensure extern "C" function pointers are used for externally-visible + loop callbacks (not watcher callbacks yet). + - (ecb) work around memory barriers and volatile apparently both being + broken in visual studio 2008 and later (analysed and patch by Nicolas Noble). + +4.15 Fri Mar 1 12:04:50 CET 2013 + - destroying a non-default loop would stop the global waitpid + watcher (Denis Bilenko). + - queueing pending watchers of higher priority from a watcher now invokes + them in a timely fashion (reported by Denis Bilenko). + - add throw() to all libev functions that cannot throw exceptions, for + further code size decrease when compiling for C++. + - add throw () to callbacks that must not throw exceptions (allocator, + syserr, loop acquire/release, periodic reschedule cbs). + - fix event_base_loop return code, add event_get_callback, event_base_new, + event_base_get_method calls to improve libevent 1.x emulation and add + some libevent 2.x functionality (based on a patch by Jeff Davey). + - add more memory fences to fix a bug reported by Jeff Davey. Better + be overfenced than underprotected. + - ev_run now returns a boolean status (true meaning watchers are + still active). + - ev_once: undef EV_ERROR in ev_kqueue.c, to avoid clashing with + libev's EV_ERROR (reported by 191919). + - (ecb) add memory fence support for xlC (Darin McBride). + - (ecb) add memory fence support for gcc-mips (Anton Kirilov). + - (ecb) add memory fence support for gcc-alpha (Christian Weisgerber). + - work around some kernels losing file descriptors by leaking + the kqueue descriptor in the child. + - work around linux inotify not reporting IN_ATTRIB changes for directories + in many cases. + - include sys/syscall.h instead of plain syscall.h. + - check for io watcher loops in ev_verify, check for the most + common reported usage bug in ev_io_start. + - choose socket vs. WSASocket at compiletime using EV_USE_WSASOCKET. + - always use WSASend/WSARecv directly on windows, hoping that this + works in all cases (unlike read/write/send/recv...). + - try to detect signals around a fork faster (test program by + Denis Bilenko). + - work around recent glibc versions that leak memory in realloc. + - rename ev::embed::set to ev::embed::set_embed to avoid clashing + the watcher base set (loop) method. + - rewrite the async/signal pipe logic to always keep a valid fd, which + simplifies (and hopefully correctifies :) the race checking + on fork, at the cost of one extra fd. + - add fat, msdos, jffs2, ramfs, ntfs and btrfs to the list of + inotify-supporting filesystems. + - move orig_CFLAGS assignment to after AC_INIT, as newer autoconf + versions ignore it before + (https://bugzilla.redhat.com/show_bug.cgi?id=908096). + - add some untested android support. + - enum expressions must be of type int (reported by Juan Pablo L). + +4.11 Sat Feb 4 19:52:39 CET 2012 + - INCOMPATIBLE CHANGE: ev_timer_again now clears the pending status, as + was documented already, but not implemented in the repeating case. + - new compiletime symbols: EV_NO_SMP and EV_NO_THREADS. + - fix a race where the workaround against the epoll fork bugs + caused signals to not be handled anymore. + - correct backend_fudge for most backends, and implement a windows + specific workaround to avoid looping because we call both + select and Sleep, both with different time resolutions. + - document range and guarantees of ev_sleep. + - document reasonable ranges for periodics interval and offset. + - rename backend_fudge to backend_mintime to avoid future confusion :) + - change the default periodic reschedule function to hopefully be more + exact and correct even in corner cases or in the far future. + - do not rely on -lm anymore: use it when available but use our + own floor () if it is missing. This should make it easier to embed, + as no external libraries are required. + - strategically import macros from libecb and mark rarely-used functions + as cache-cold (saving almost 2k code size on typical amd64 setups). + - add Symbols.ev and Symbols.event files, that were missing. + - fix backend_mintime value for epoll (was 1/1024, is 1/1000 now). + - fix #3 "be smart about timeouts" to not "deadlock" when + timeout == now, also improve the section overall. + - avoid "AVOIDING FINISHING BEFORE RETURNING" idiom. + - support new EV_API_STATIC mode to make all libev symbols + static. + - supply default CFLAGS of -g -O3 with gcc when original CFLAGS + were empty. + +4.04 Wed Feb 16 09:01:51 CET 2011 + - fix two problems in the native win32 backend, where reuse of fd's + with different underlying handles caused handles not to be removed + or added to the select set (analyzed and tested by Bert Belder). + - do no rely on ceil() in ev_e?poll.c. + - backport libev to HP-UX versions before 11 v3. + - configure did not detect nanosleep and clock_gettime properly when + they are available in the libc (as opposed to -lrt). + +4.03 Tue Jan 11 14:37:25 CET 2011 + - officially support polling files with all backends. + - support files, /dev/zero etc. the same way as select in the epoll + backend, by generating events on our own. + - ports backend: work around solaris bug 6874410 and many related ones + (EINTR, maybe more), with no performance loss (note that the solaris + bug report is actually wrong, reality is far more bizarre and broken + than that). + - define EV_READ/EV_WRITE as macros in event.h, as some programs use + #ifdef to test for them. + - new (experimental) function: ev_feed_signal. + - new (to become default) EVFLAG_NOSIGMASK flag. + - new EVBACKEND_MASK symbol. + - updated COMMON IDIOMS SECTION. + +4.01 Fri Nov 5 21:51:29 CET 2010 + - automake fucked it up, apparently, --add-missing -f is not quite enough + to make it update its files, so 4.00 didn't install ev++.h and + event.h on make install. grrr. + - ev_loop(count|depth) didn't return anything (Robin Haberkorn). + - change EV_UNDEF to 0xffffffff to silence some overzealous compilers. + - use "(libev) " prefix for all libev error messages now. + +4.00 Mon Oct 25 12:32:12 CEST 2010 + - "PORTING FROM LIBEV 3.X TO 4.X" (in ev.pod) is recommended reading. + - ev_embed_stop did not correctly stop the watcher (very good + testcase by Vladimir Timofeev). + - ev_run will now always update the current loop time - it erroneously + didn't when idle watchers were active, causing timers not to fire. + - fix a bug where a timeout of zero caused the timer not to fire + in the libevent emulation (testcase by Péter Szabó). + - applied win32 fixes by Michael Lenaghan (also James Mansion). + - replace EV_MINIMAL by EV_FEATURES. + - prefer EPOLL_CTL_ADD over EPOLL_CTL_MOD in some more cases, as it + seems the former is *much* faster than the latter. + - linux kernel version detection (for inotify bug workarounds) + did not work properly. + - reduce the number of spurious wake-ups with the ports backend. + - remove dependency on sys/queue.h on freebsd (patch by Vanilla Hsu). + - do async init within ev_async_start, not ev_async_set, which avoids + an API quirk where the set function must be called in the C++ API + even when there is nothing to set. + - add (undocumented) EV_ENABLE when adding events with kqueue, + this might help with OS X, which seems to need it despite documenting + not to need it (helpfully pointed out by Tilghman Lesher). + - do not use poll by default on freebsd, it's broken (what isn't + on freebsd...). + - allow to embed epoll on kernels >= 2.6.32. + - configure now prepends -O3, not appends it, so one can still + override it. + - ev.pod: greatly expanded the portability section, added a porting + section, a description of watcher states and made lots of minor fixes. + - disable poll backend on AIX, the poll header spams the namespace + and it's not worth working around dead platforms (reported + and analyzed by Aivars Kalvans). + - improve header file compatibility of the standalone eventfd code + in an obscure case. + - implement EV_AVOID_STDIO option. + - do not use sscanf to parse linux version number (smaller, faster, + no sscanf dependency). + - new EV_CHILD_ENABLE and EV_SIGNAL_ENABLE configurable settings. + - update libev.m4 HAVE_CLOCK_SYSCALL test for newer glibcs. + - add section on accept() problems to the manpage. + - rename EV_TIMEOUT to EV_TIMER. + - rename ev_loop_count/depth/verify/loop/unloop. + - remove ev_default_destroy and ev_default_fork. + - switch to two-digit minor version. + - work around an apparent gentoo compiler bug. + - define _DARWIN_UNLIMITED_SELECT. just so. + - use enum instead of #define for most constants. + - improve compatibility to older C++ compilers. + - (experimental) ev_run/ev_default_loop/ev_break/ev_loop_new have now + default arguments when compiled as C++. + - enable automake dependency tracking. + - ev_loop_new no longer leaks memory when loop creation failed. + - new ev_cleanup watcher type. + +3.9 Thu Dec 31 07:59:59 CET 2009 + - signalfd is no longer used by default and has to be requested + explicitly - this means that easy to catch bugs become hard to + catch race conditions, but the users have spoken. + - point out the unspecified signal mask in the documentation, and + that this is a race condition regardless of EV_SIGNALFD. + - backport inotify code to C89. + - inotify file descriptors could leak into child processes. + - ev_stat watchers could keep an erroneous extra ref on the loop, + preventing exit when unregistering all watchers (testcases + provided by ry@tinyclouds.org). + - implement EV_WIN32_HANDLE_TO_FD and EV_WIN32_CLOSE_FD configuration + symbols to make it easier for apps to do their own fd management. + - support EV_IDLE_ENABLE being disabled in ev++.h + (patch by Didier Spezia). + - take advantage of inotify_init1, if available, to set cloexec/nonblock + on fd creation, to avoid races. + - the signal handling pipe wasn't always initialised under windows + (analysed by lekma). + - changed minimum glibc requirement from glibc 2.9 to 2.7, for + signalfd. + - add missing string.h include (Denis F. Latypoff). + - only replace ev_stat.prev when we detect an actual difference, + so prev is (almost) always different to attr. this might + have caused the problems with 04_stat.t. + - add ev::timer->remaining () method to C++ API. + +3.8 Sun Aug 9 14:30:45 CEST 2009 + - incompatible change: do not necessarily reset signal handler + to SIG_DFL when a sighandler is stopped. + - ev_default_destroy did not properly free or zero some members, + potentially causing crashes and memory corruption on repeated + ev_default_destroy/ev_default_loop calls. + - take advantage of signalfd on GNU/Linux systems. + - document that the signal mask might be in an unspecified + state when using libev's signal handling. + - take advantage of some GNU/Linux calls to set cloexec/nonblock + on fd creation, to avoid race conditions. + +3.7 Fri Jul 17 16:36:32 CEST 2009 + - ev_unloop and ev_loop wrongly used a global variable to exit loops, + instead of using a per-loop variable (bug caught by accident...). + - the ev_set_io_collect_interval interpretation has changed. + - add new functionality: ev_set_userdata, ev_userdata, + ev_set_invoke_pending_cb, ev_set_loop_release_cb, + ev_invoke_pending, ev_pending_count, together with a long example + about thread locking. + - add ev_timer_remaining (as requested by Denis F. Latypoff). + - add ev_loop_depth. + - calling ev_unloop in fork/prepare watchers will no longer poll + for new events. + - Denis F. Latypoff corrected many typos in example code snippets. + - honor autoconf detection of EV_USE_CLOCK_SYSCALL, also double- + check that the syscall number is available before trying to + use it (reported by ry@tinyclouds). + - use GetSystemTimeAsFileTime instead of _timeb on windows, for + slightly higher accuracy. + - properly declare ev_loop_verify and ev_now_update even when + !EV_MULTIPLICITY. + - do not compile in any priority code when EV_MAXPRI == EV_MINPRI. + - support EV_MINIMAL==2 for a reduced API. + - actually 0-initialise struct sigaction when installing signals. + - add section on hibernate and stopped processes to ev_timer docs. + +3.6 Tue Apr 28 02:49:30 CEST 2009 + - multiple timers becoming ready within an event loop iteration + will be invoked in the "correct" order now. + - do not leave the event loop early just because we have no active + watchers, fixing a problem when embedding a kqueue loop + that has active kernel events but no registered watchers + (reported by blacksand blacksand). + - correctly zero the idx values for arrays, so destroying and + reinitialising the default loop actually works (patch by + Malek Hadj-Ali). + - implement ev_suspend and ev_resume. + - new EV_CUSTOM revents flag for use by applications. + - add documentation section about priorities. + - add a glossary to the documentation. + - extend the ev_fork description slightly. + - optimize a jump out of call_pending. + +3.53 Sun Feb 15 02:38:20 CET 2009 + - fix a bug in event pipe creation on win32 that would cause a + failed assertion on event loop creation (patch by Malek Hadj-Ali). + - probe for CLOCK_REALTIME support at runtime as well and fall + back to gettimeofday if there is an error, to support older + operating systems with newer header files/libraries. + - prefer gettimeofday over clock_gettime with USE_CLOCK_SYSCALL + (default most everywhere), otherwise not. + +3.52 Wed Jan 7 21:43:02 CET 2009 + - fix compilation of select backend in fd_set mode when NFDBITS is + missing (to get it to compile on QNX, reported by Rodrigo Campos). + - better select-nfds handling when select backend is in fd_set mode. + - diagnose fd_set overruns when select backend is in fd_set mode. + - due to a thinko, instead of disabling everything but + select on the borked OS X platform, everything but select was + allowed (reported by Emanuele Giaquinta). + - actually verify that local and remote port are matching in + libev's socketpair emulation, which makes denial-of-service + attacks harder (but not impossible - it's windows). Make sure + it even works under vista, which thinks that getpeer/sockname + should return fantasy port numbers. + - include "libev" in all assertion messages for potentially + clearer diagnostics. + - event_get_version (libevent compatibility) returned + a useless string instead of the expected version string + (patch by W.C.A. Wijngaards). + +3.51 Wed Dec 24 23:00:11 CET 2008 + - fix a bug where an inotify watcher was added twice, causing + freezes on hash collisions (reported and analysed by Graham Leggett). + - new config symbol, EV_USE_CLOCK_SYSCALL, to make libev use + a direct syscall - slower, but no dependency on librt et al. + - assume negative return values != -1 signals success of port_getn + (http://cvs.epicsol.org/cgi/viewcvs.cgi/epic5/source/newio.c?rev=1.52) + (no known failure reports, but it doesn't hurt). + - fork detection in ev_embed now stops and restarts the watcher + automatically. + - EXPERIMENTAL: default the method to operator () in ev++.h, + to make it nicer to use functors (requested by Benedek László). + - fixed const object callbacks in ev++.h. + - replaced loop_ref argument of watcher.set (loop) by a direct + ev_loop * in ev++.h, to avoid clashes with functor patch. + - do not try to watch the empty string via inotify. + - inotify watchers could be leaked under certain circumstances. + - OS X 10.5 is actually even more broken than earlier versions, + so fall back to select on that piece of garbage. + - fixed some weirdness in the ev_embed documentation. + +3.49 Wed Nov 19 11:26:53 CET 2008 + - ev_stat watchers will now use inotify as a mere hint on + kernels <2.6.25, or if the filesystem is not in the + "known to be good" list. + - better mingw32 compatibility (it's not as borked as native win32) + (analysed by Roger Pack). + - include stdio.h in the example program, as too many people are + confused by the weird C language otherwise. I guess the next thing + I get told is that the "..." ellipses in the examples don't compile + with their C compiler. + +3.48 Thu Oct 30 09:02:37 CET 2008 + - further optimise away the EPOLL_CTL_ADD/MOD combo in the epoll + backend by assuming the kernel event mask hasn't changed if + ADD fails with EEXIST. + - work around spurious event notification bugs in epoll by using + a 32-bit generation counter. recreate kernel state if we receive + spurious notifications or unwanted events. this is very costly, + but I didn't come up with this horrible design. + - use memset to initialise most arrays now and do away with the + init functions. + - expand time-out strategies into a "Be smart about timeouts" section. + - drop the "struct" from all ev_watcher declarations in the + documentation and did other clarifications (yeah, it was a mistake + to have a struct AND a function called ev_loop). + - fix a bug where ev_default would not initialise the default + loop again after it was destroyed with ev_default_destroy. + - rename syserr to ev_syserr to avoid name clashes when embedding, + do similar changes for event.c. + +3.45 Tue Oct 21 21:59:26 CEST 2008 + - disable inotify usage on linux <2.6.25, as it is broken + (reported by Yoann Vandoorselaere). + - ev_stat erroneously would try to add inotify watchers + even when inotify wasn't available (this should only + have a performance impact). + - ev_once now passes both timeout and io to the callback if both + occur concurrently, instead of giving timeouts precedence. + - disable EV_USE_INOTIFY when sys/inotify.h is too old. + +3.44 Mon Sep 29 05:18:39 CEST 2008 + - embed watchers now automatically invoke ev_loop_fork on the + embedded loop when the parent loop forks. + - new function: ev_now_update (loop). + - verify_watcher was not marked static. + - improve the "associating..." manpage section. + - documentation tweaks here and there. + +3.43 Sun Jul 6 05:34:41 CEST 2008 + - include more include files on windows to get struct _stati64 + (reported by Chris Hulbert, but doesn't quite fix his issue). + - add missing #include in ev.c on windows (reported by + Matt Tolton). + +3.42 Tue Jun 17 12:12:07 CEST 2008 + - work around yet another windows bug: FD_SET actually adds fd's + multiple times to the fd_*SET*, despite official MSN docs claiming + otherwise. Reported and well-analysed by Matt Tolton. + - define NFDBITS to 0 when EV_SELECT_IS_WINSOCKET to make it compile + (reported any analysed by Chris Hulbert). + - fix a bug in ev_ebadf (this function is only used to catch + programming errors in the libev user). reported by Matt Tolton. + - fix a bug in fd_intern on win32 (could lead to compile errors + under some circumstances, but would work correctly if it compiles). + reported by Matt Tolton. + - (try to) work around missing lstat on windows. + - pass in the write fd set as except fd set under windows. windows + is so uncontrollably lame that it requires this. this means that + switching off oobinline is not supported (but tcp/ip doesn't + have oob, so that would be stupid anyways. + - use posix module symbol to auto-detect monotonic clock presence + and some other default values. + +3.41 Fri May 23 18:42:54 CEST 2008 + - work around an obscure bug in winsocket select: if you + provide only empty fd sets then select returns WSAEINVAL. how sucky. + - improve timer scheduling stability and reduce use of time_epsilon. + - use 1-based 2-heap for EV_MINIMAL, simplifies code, reduces + codesize and makes for better cache-efficiency. + - use 3-based 4-heap for !EV_MINIMAL. this makes better use + of cpu cache lines and gives better growth behaviour than + 2-based heaps. + - cache timestamp within heap for !EV_MINIMAL, to avoid random + memory accesses. + - document/add EV_USE_4HEAP and EV_HEAP_CACHE_AT. + - fix a potential aliasing issue in ev_timer_again. + - add/document ev_periodic_at, retract direct access to ->at. + - improve ev_stat docs. + - add portability requirements section. + - fix manpage headers etc. + - normalise WSA error codes to lower range on windows. + - add consistency check code that can be called automatically + or on demand to check for internal structures (ev_loop_verify). + +3.31 Wed Apr 16 20:45:04 CEST 2008 + - added last minute fix for ev_poll.c by Brandon Black. + +3.3 Wed Apr 16 19:04:10 CEST 2008 + - event_base_loopexit should return 0 on success + (W.C.A. Wijngaards). + - added linux eventfd support. + - try to autodetect epoll and inotify support + by libc header version if not using autoconf. + - new symbols: EV_DEFAULT_UC and EV_DEFAULT_UC_. + - declare functions defined in ev.h as inline if + C99 or gcc are available. + - enable inlining with gcc versions 2 and 3. + - work around broken poll implementations potentially + not clearing revents field in ev_poll (Brandon Black) + (no such systems are known at this time). + - work around a bug in realloc on openbsd and darwin, + also makes the erroneous valgrind complaints + go away (noted by various people). + - fix ev_async_pending, add c++ wrapper for ev_async + (based on patch sent by Johannes Deisenhofer). + - add sensible set method to ev::embed. + - made integer constants type int in ev.h. + +3.2 Wed Apr 2 17:11:19 CEST 2008 + - fix a 64 bit overflow issue in the select backend, + by using fd_mask instead of int for the mask. + - rename internal sighandler to avoid clash with very old perls. + - entering ev_loop will not clear the ONESHOT or NONBLOCKING + flags of any outer loops anymore. + - add ev_async_pending. + +3.1 Thu Mar 13 13:45:22 CET 2008 + - implement ev_async watchers. + - only initialise signal pipe on demand. + - make use of sig_atomic_t configurable. + - improved documentation. + +3.0 Mon Jan 28 13:14:47 CET 2008 + - API/ABI bump to version 3.0. + - ev++.h includes "ev.h" by default now, not . + - slightly improved documentation. + - speed up signal detection after a fork. + - only optionally return trace status changed in ev_child + watchers. + - experimental (and undocumented) loop wrappers for ev++.h. + +2.01 Tue Dec 25 08:04:41 CET 2007 + - separate Changes file. + - fix ev_path_set => ev_stat_set typo. + - remove event_compat.h from the libev tarball. + - change how include files are found. + - doc updates. + - update licenses, explicitly allow for GPL relicensing. + +2.0 Sat Dec 22 17:47:03 CET 2007 + - new ev_sleep, ev_set_(io|timeout)_collect_interval. + - removed epoll from embeddable fd set. + - fix embed watchers. + - renamed ev_embed.loop to other. + - added exported Symbol tables. + - undefine member wrapper macros at the end of ev.c. + - respect EV_H in ev++.h. + +1.86 Tue Dec 18 02:36:57 CET 2007 + - fix memleak on loop destroy (not relevant for perl). + +1.85 Fri Dec 14 20:32:40 CET 2007 + - fix some aliasing issues w.r.t. timers and periodics + (not relevant for perl). + +(for historic versions refer to EV/Changes, found in the Perl interface) + +0.1 Wed Oct 31 21:31:48 CET 2007 + - original version; hacked together in <24h. + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/LICENSE b/deps/ngtcp2/ngtcp2/third-party/libev/LICENSE new file mode 100644 index 000000000000..2fdabd48afad --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/LICENSE @@ -0,0 +1,37 @@ +All files in libev are +Copyright (c)2007,2008,2009,2010,2011,2012,2013 Marc Alexander Lehmann. + +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. + +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. + +Alternatively, the contents of this package may be used under the terms +of the GNU General Public License ("GPL") version 2 or any later version, +in which case the provisions of the GPL are applicable instead of the +above. If you wish to allow the use of your version of this package only +under the terms of the GPL and not to allow others to use your version of +this file under the BSD license, indicate your decision by deleting the +provisions above and replace them with the notice and other provisions +required by the GPL in this and the other files of this package. If you do +not delete the provisions above, a recipient may use your version of this +file under either the BSD or the GPL. diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/README b/deps/ngtcp2/ngtcp2/third-party/libev/README new file mode 100644 index 000000000000..fca5fdf1a8ec --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/README @@ -0,0 +1,59 @@ +libev is a high-performance event loop/event model with lots of features. +(see benchmark at http://libev.schmorp.de/bench.html) + + +ABOUT + + Homepage: http://software.schmorp.de/pkg/libev + Mailinglist: libev@lists.schmorp.de + http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev + Library Documentation: http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod + + Libev is modelled (very losely) after libevent and the Event perl + module, but is faster, scales better and is more correct, and also more + featureful. And also smaller. Yay. + + Some of the specialties of libev not commonly found elsewhere are: + + - extensive and detailed, readable documentation (not doxygen garbage). + - fully supports fork, can detect fork in various ways and automatically + re-arms kernel mechanisms that do not support fork. + - highly optimised select, poll, linux epoll, linux aio, bsd kqueue + and solaris event ports backends. + - filesystem object (path) watching (with optional linux inotify support). + - wallclock-based times (using absolute time, cron-like). + - relative timers/timeouts (handle time jumps). + - fast intra-thread communication between multiple + event loops (with optional fast linux eventfd backend). + - extremely easy to embed (fully documented, no dependencies, + autoconf supported but optional). + - very small codebase, no bloated library, simple code. + - fully extensible by being able to plug into the event loop, + integrate other event loops, integrate other event loop users. + - very little memory use (small watchers, small event loop data). + - optional C++ interface allowing method and function callbacks + at no extra memory or runtime overhead. + - optional Perl interface with similar characteristics (capable + of running Glib/Gtk2 on libev). + - support for other languages (multiple C++ interfaces, D, Ruby, + Python) available from third-parties. + + Examples of programs that embed libev: the EV perl module, node.js, + auditd, rxvt-unicode, gvpe (GNU Virtual Private Ethernet), the + Deliantra MMORPG server (http://www.deliantra.net/), Rubinius (a + next-generation Ruby VM), the Ebb web server, the Rev event toolkit. + + +CONTRIBUTORS + + libev was written and designed by Marc Lehmann and Emanuele Giaquinta. + + The following people sent in patches or made other noteworthy + contributions to the design (for minor patches, see the Changes + file. If I forgot to include you, please shout at me, it was an + accident): + + W.C.A. Wijngaards + Christopher Layne + Chris Brody + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/Symbols.ev b/deps/ngtcp2/ngtcp2/third-party/libev/Symbols.ev new file mode 100644 index 000000000000..fe169fa064da --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/Symbols.ev @@ -0,0 +1,73 @@ +ev_async_send +ev_async_start +ev_async_stop +ev_backend +ev_break +ev_check_start +ev_check_stop +ev_child_start +ev_child_stop +ev_cleanup_start +ev_cleanup_stop +ev_clear_pending +ev_default_loop +ev_default_loop_ptr +ev_depth +ev_embeddable_backends +ev_embed_start +ev_embed_stop +ev_embed_sweep +ev_feed_event +ev_feed_fd_event +ev_feed_signal +ev_feed_signal_event +ev_fork_start +ev_fork_stop +ev_idle_start +ev_idle_stop +ev_invoke +ev_invoke_pending +ev_io_start +ev_io_stop +ev_iteration +ev_loop_destroy +ev_loop_fork +ev_loop_new +ev_now +ev_now_update +ev_once +ev_pending_count +ev_periodic_again +ev_periodic_start +ev_periodic_stop +ev_prepare_start +ev_prepare_stop +ev_recommended_backends +ev_ref +ev_resume +ev_run +ev_set_allocator +ev_set_invoke_pending_cb +ev_set_io_collect_interval +ev_set_loop_release_cb +ev_set_syserr_cb +ev_set_timeout_collect_interval +ev_set_userdata +ev_signal_start +ev_signal_stop +ev_sleep +ev_stat_start +ev_stat_stat +ev_stat_stop +ev_supported_backends +ev_suspend +ev_time +ev_timer_again +ev_timer_remaining +ev_timer_start +ev_timer_stop +ev_unref +ev_userdata +ev_verify +ev_version_major +ev_version_minor diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/Symbols.event b/deps/ngtcp2/ngtcp2/third-party/libev/Symbols.event new file mode 100644 index 000000000000..799d4246e4e0 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/Symbols.event @@ -0,0 +1,24 @@ +event_active +event_add +event_base_dispatch +event_base_free +event_base_get_method +event_base_loop +event_base_loopexit +event_base_new +event_base_once +event_base_priority_init +event_base_set +event_del +event_dispatch +event_get_callback +event_get_method +event_get_version +event_init +event_loop +event_loopexit +event_once +event_pending +event_priority_init +event_priority_set +event_set diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/TODO b/deps/ngtcp2/ngtcp2/third-party/libev/TODO new file mode 100644 index 000000000000..a9d2c91f61d3 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/TODO @@ -0,0 +1,14 @@ +TODO: ev_loop_wakeup +TODO: EV_STANDALONE == NO_HASSLE (do not use clock_gettime in ev_standalone) +TODO: faq, process a thing in each iteration +TODO: dbeugging tips, ev_verify, ev_init twice +TODO: ev_break for immediate exit (EVBREAK_NOW?) +TODO: ev_feed_child_event +TODO: document the special problem of signals around fork. +TODO: store pid for each signal +TODO: document file descriptor usage per loop +TODO: store loop pid_t and compare isndie signal handler,store 1 for same, 2 for differign pid, clean up in loop_fork +TODO: embed watchers need updating when fd changes +TODO: document portability requirements for atomic pointer access +TODO: document requirements for function pointers and calling conventions. + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/aclocal.m4 b/deps/ngtcp2/ngtcp2/third-party/libev/aclocal.m4 new file mode 100644 index 000000000000..00d36ebd6340 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/aclocal.m4 @@ -0,0 +1,10219 @@ +# generated automatically by aclocal 1.16.1 -*- Autoconf -*- + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[[012]][[,.]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD + if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting $shlibpath_var if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC=$CC +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f "$lt_ac_sed" && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test 10 -lt "$lt_ac_count" && break + lt_ac_count=`expr $lt_ac_count + 1` + if test "$lt_ac_count" -gt "$lt_ac_max"; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS + +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 8 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option '$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_OPTIONS + + + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# LT_INIT options. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) + +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59, which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) + +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 4179 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.6' +macro_revision='2.4.6' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) + +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) + +# Copyright (C) 2002-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.16' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.16.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.16.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + AS_CASE([$CONFIG_FILES], + [*\'*], [eval set x "$CONFIG_FILES"], + [*], [set x $CONFIG_FILES]) + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`AS_DIRNAME(["$am_mf"])` + am_filepart=`AS_BASENAME(["$am_mf"])` + AM_RUN_LOG([cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles]) || am_rc=$? + done + if test $am_rc -ne 0; then + AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. Try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking).]) + fi + AS_UNSET([am_dirpart]) + AS_UNSET([am_filepart]) + AS_UNSET([am_mf]) + AS_UNSET([am_rc]) + rm -f conftest-deps.mk +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking is enabled. +# This creates each '.Po' and '.Plo' makefile fragment that we'll need in +# order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check whether make has an 'include' directive that can support all +# the idioms we need for our automatic dependency tracking code. +AC_DEFUN([AM_MAKE_INCLUDE], +[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) + AS_CASE([$?:`cat confinc.out 2>/dev/null`], + ['0:this is the am__doit target'], + [AS_CASE([$s], + [BSD], [am__include='.include' am__quote='"'], + [am__include='include' am__quote=''])]) + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +AC_MSG_RESULT([${_am_result}]) +AC_SUBST([am__include])]) +AC_SUBST([am__quote])]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/autogen.sh b/deps/ngtcp2/ngtcp2/third-party/libev/autogen.sh new file mode 100644 index 000000000000..8056ee7f9be6 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/autogen.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +autoreconf --install --symlink --force diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/compile b/deps/ngtcp2/ngtcp2/third-party/libev/compile new file mode 100755 index 000000000000..99e50524b3ba --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/compile @@ -0,0 +1,348 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/config.guess b/deps/ngtcp2/ngtcp2/third-party/libev/config.guess new file mode 100755 index 000000000000..f50dcdb6de2a --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/config.guess @@ -0,0 +1,1480 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2018 Free Software Foundation, Inc. + +timestamp='2018-02-24' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2018 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > "$dummy.c" ; + for c in cc gcc c89 c99 ; do + if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval "$set_cc_for_build" + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval "$set_cc_for_build" + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval "$set_cc_for_build" + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + then + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "$HP_ARCH" = "" ]; then + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ "$HP_ARCH" = hppa2.0w ] + then + eval "$set_cc_for_build" + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + *:GNU:*:*) + # the GNU system + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + exit ;; + i*86:Minix:*:*) + echo "$UNAME_MACHINE"-pc-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + eval "$set_cc_for_build" + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" + test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + if objdump -f /bin/sh | grep -q elf32-x86-64; then + echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 + else + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + fi + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval "$set_cc_for_build" + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; +esac + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-functions 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/config.sub b/deps/ngtcp2/ngtcp2/third-party/libev/config.sub new file mode 100755 index 000000000000..1d8e98bcee23 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/config.sub @@ -0,0 +1,1801 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2018 Free Software Foundation, Inc. + +timestamp='2018-02-22' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2018 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo "$1" | sed 's/-[^-]*$//'` + if [ "$basic_machine" != "$1" ] + then os=`echo "$1" | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | ba \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | wasm32 \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | ba-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | e2k-* | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | or1k*-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pru-* \ + | pyramid-* \ + | riscv32-* | riscv64-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | visium-* \ + | wasm32-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-pc + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + asmjs) + basic_machine=asmjs-unknown + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2*) + basic_machine=m68k-bull + os=-sysv3 + ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=$os"spe" + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + nsv-tandem) + basic_machine=nsv-tandem + ;; + nsx-tandem) + basic_machine=nsx-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + x64) + basic_machine=x86_64-pc + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases that might get confused + # with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # es1800 is here to avoid being matched by es* (a different OS) + -es1800*) + os=-ose + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ + | -midnightbsd*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -xray | -os68k* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo "$os" | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo "$os" | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo "$os" | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4*) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $basic_machine in + arm*) + os=-eabi + ;; + *) + os=-elf + ;; + esac + ;; + -nacl*) + ;; + -ios) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + pru-*) + os=-elf + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` + ;; +esac + +echo "$basic_machine$os" +exit + +# Local variables: +# eval: (add-hook 'write-file-functions 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/configure b/deps/ngtcp2/ngtcp2/third-party/libev/configure new file mode 100755 index 000000000000..e4c30cce25cf --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/configure @@ -0,0 +1,14624 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for libev 4.33. +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='libev' +PACKAGE_TARNAME='libev' +PACKAGE_VERSION='4.33' +PACKAGE_STRING='libev 4.33' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +ac_unique_file="ev_epoll.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +CPP +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +DLLTOOL +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL +am__quote' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_maintainer_mode +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +LT_SYS_LIBRARY_PATH +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures libev 4.33 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/libev] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of libev 4.33:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +libev configure 4.33 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by libev $as_me 4.33, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +orig_CFLAGS="$CFLAGS" + + +am__api_version='1.16' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='libev' + VERSION='4.33' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + +ac_config_headers="$ac_config_headers config.h" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in #( + '0:this is the am__doit target') : + case $s in #( + BSD) : + am__include='.include' am__quote='"' ;; #( + *) : + am__include='include' am__quote='' ;; +esac ;; #( + *) : + ;; +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +$as_echo "${_am_result}" >&6; } + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +if test -z "$orig_CFLAGS"; then + if test x$GCC = xyes; then + CFLAGS="-g -O3" + fi +fi + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5 + if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + pic_mode=default +fi + + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + link_all_deplibs=no + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen=shl_load +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen=dlopen +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + + +for ac_header in sys/inotify.h sys/epoll.h sys/event.h port.h poll.h sys/timerfd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +for ac_header in sys/select.h sys/eventfd.h sys/signalfd.h linux/aio_abi.h linux/fs.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_func in inotify_init epoll_ctl kqueue port_create poll select eventfd signalfd +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +for ac_func in clock_gettime +do : + ac_fn_c_check_func "$LINENO" "clock_gettime" "ac_cv_func_clock_gettime" +if test "x$ac_cv_func_clock_gettime" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_CLOCK_GETTIME 1 +_ACEOF + +else + + if test $(uname) = Linux; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime syscall" >&5 +$as_echo_n "checking for clock_gettime syscall... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + #include +int +main () +{ +struct timespec ts; int status = syscall (SYS_clock_gettime, CLOCK_REALTIME, &ts) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_have_clock_syscall=1 + +$as_echo "#define HAVE_CLOCK_SYSCALL 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + if test -z "$LIBEV_M4_AVOID_LIBRT" && test -z "$ac_have_clock_syscall"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5 +$as_echo_n "checking for clock_gettime in -lrt... " >&6; } +if ${ac_cv_lib_rt_clock_gettime+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char clock_gettime (); +int +main () +{ +return clock_gettime (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rt_clock_gettime=yes +else + ac_cv_lib_rt_clock_gettime=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5 +$as_echo "$ac_cv_lib_rt_clock_gettime" >&6; } +if test "x$ac_cv_lib_rt_clock_gettime" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBRT 1 +_ACEOF + + LIBS="-lrt $LIBS" + +fi + + unset ac_cv_func_clock_gettime + for ac_func in clock_gettime +do : + ac_fn_c_check_func "$LINENO" "clock_gettime" "ac_cv_func_clock_gettime" +if test "x$ac_cv_func_clock_gettime" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_CLOCK_GETTIME 1 +_ACEOF + +fi +done + + fi + +fi +done + + +for ac_func in nanosleep +do : + ac_fn_c_check_func "$LINENO" "nanosleep" "ac_cv_func_nanosleep" +if test "x$ac_cv_func_nanosleep" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NANOSLEEP 1 +_ACEOF + +else + + if test -z "$LIBEV_M4_AVOID_LIBRT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanosleep in -lrt" >&5 +$as_echo_n "checking for nanosleep in -lrt... " >&6; } +if ${ac_cv_lib_rt_nanosleep+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char nanosleep (); +int +main () +{ +return nanosleep (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rt_nanosleep=yes +else + ac_cv_lib_rt_nanosleep=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_nanosleep" >&5 +$as_echo "$ac_cv_lib_rt_nanosleep" >&6; } +if test "x$ac_cv_lib_rt_nanosleep" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBRT 1 +_ACEOF + + LIBS="-lrt $LIBS" + +fi + + unset ac_cv_func_nanosleep + for ac_func in nanosleep +do : + ac_fn_c_check_func "$LINENO" "nanosleep" "ac_cv_func_nanosleep" +if test "x$ac_cv_func_nanosleep" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NANOSLEEP 1 +_ACEOF + +fi +done + + fi + +fi +done + + +ac_fn_c_check_type "$LINENO" "__kernel_rwf_t" "ac_cv_type___kernel_rwf_t" "#include +" +if test "x$ac_cv_type___kernel_rwf_t" = xyes; then : + + +$as_echo "#define HAVE_KERNEL_RWF_T 1" >>confdefs.h + + +fi + + +if test -z "$LIBEV_M4_AVOID_LIBM"; then + LIBM=m +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing floor" >&5 +$as_echo_n "checking for library containing floor... " >&6; } +if ${ac_cv_search_floor+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char floor (); +int +main () +{ +return floor (); + ; + return 0; +} +_ACEOF +for ac_lib in '' $LIBM; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_floor=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_floor+:} false; then : + break +fi +done +if ${ac_cv_search_floor+:} false; then : + +else + ac_cv_search_floor=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_floor" >&5 +$as_echo "$ac_cv_search_floor" >&6; } +ac_res=$ac_cv_search_floor +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +$as_echo "#define HAVE_FLOOR 1" >>confdefs.h + +fi + + + + +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by libev $as_me 4.33, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +libev config.status 4.33 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in #( + *\'*) : + eval set x "$CONFIG_FILES" ;; #( + *) : + set x $CONFIG_FILES ;; #( + *) : + ;; +esac + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$am_mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? + done + if test $am_rc -ne 0; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. Try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/configure.ac b/deps/ngtcp2/ngtcp2/third-party/libev/configure.ac new file mode 100644 index 000000000000..196640b56dd0 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/configure.ac @@ -0,0 +1,27 @@ +dnl also update ev.h! +AC_INIT([libev], [4.33]) + +orig_CFLAGS="$CFLAGS" + +AC_CONFIG_SRCDIR([ev_epoll.c]) +AM_INIT_AUTOMAKE + +AC_CONFIG_HEADERS([config.h]) +AM_MAINTAINER_MODE + +AC_PROG_CC + +dnl Supply default CFLAGS, if not specified +if test -z "$orig_CFLAGS"; then + if test x$GCC = xyes; then + CFLAGS="-g -O3" + fi +fi + +AC_PROG_INSTALL +AC_PROG_LIBTOOL + +m4_include([libev.m4]) + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/depcomp b/deps/ngtcp2/ngtcp2/third-party/libev/depcomp new file mode 100755 index 000000000000..65cbf7093a1e --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev++.h b/deps/ngtcp2/ngtcp2/third-party/libev/ev++.h new file mode 100644 index 000000000000..22dfcf58d942 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev++.h @@ -0,0 +1,818 @@ +/* + * libev simple C++ wrapper classes + * + * Copyright (c) 2007,2008,2010,2018,2020 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#ifndef EVPP_H__ +#define EVPP_H__ + +#ifdef EV_H +# include EV_H +#else +# include "ev.h" +#endif + +#ifndef EV_USE_STDEXCEPT +# define EV_USE_STDEXCEPT 1 +#endif + +#if EV_USE_STDEXCEPT +# include +#endif + +namespace ev { + + typedef ev_tstamp tstamp; + + enum { + UNDEF = EV_UNDEF, + NONE = EV_NONE, + READ = EV_READ, + WRITE = EV_WRITE, +#if EV_COMPAT3 + TIMEOUT = EV_TIMEOUT, +#endif + TIMER = EV_TIMER, + PERIODIC = EV_PERIODIC, + SIGNAL = EV_SIGNAL, + CHILD = EV_CHILD, + STAT = EV_STAT, + IDLE = EV_IDLE, + CHECK = EV_CHECK, + PREPARE = EV_PREPARE, + FORK = EV_FORK, + ASYNC = EV_ASYNC, + EMBED = EV_EMBED, +# undef ERROR // some systems stupidly #define ERROR + ERROR = EV_ERROR + }; + + enum + { + AUTO = EVFLAG_AUTO, + NOENV = EVFLAG_NOENV, + FORKCHECK = EVFLAG_FORKCHECK, + + SELECT = EVBACKEND_SELECT, + POLL = EVBACKEND_POLL, + EPOLL = EVBACKEND_EPOLL, + KQUEUE = EVBACKEND_KQUEUE, + DEVPOLL = EVBACKEND_DEVPOLL, + PORT = EVBACKEND_PORT + }; + + enum + { +#if EV_COMPAT3 + NONBLOCK = EVLOOP_NONBLOCK, + ONESHOT = EVLOOP_ONESHOT, +#endif + NOWAIT = EVRUN_NOWAIT, + ONCE = EVRUN_ONCE + }; + + enum how_t + { + ONE = EVBREAK_ONE, + ALL = EVBREAK_ALL + }; + + struct bad_loop +#if EV_USE_STDEXCEPT + : std::exception +#endif + { +#if EV_USE_STDEXCEPT + const char *what () const EV_NOEXCEPT + { + return "libev event loop cannot be initialized, bad value of LIBEV_FLAGS?"; + } +#endif + }; + +#ifdef EV_AX +# undef EV_AX +#endif + +#ifdef EV_AX_ +# undef EV_AX_ +#endif + +#if EV_MULTIPLICITY +# define EV_AX raw_loop +# define EV_AX_ raw_loop, +#else +# define EV_AX +# define EV_AX_ +#endif + + struct loop_ref + { + loop_ref (EV_P) EV_NOEXCEPT +#if EV_MULTIPLICITY + : EV_AX (EV_A) +#endif + { + } + + bool operator == (const loop_ref &other) const EV_NOEXCEPT + { +#if EV_MULTIPLICITY + return EV_AX == other.EV_AX; +#else + return true; +#endif + } + + bool operator != (const loop_ref &other) const EV_NOEXCEPT + { +#if EV_MULTIPLICITY + return ! (*this == other); +#else + return false; +#endif + } + +#if EV_MULTIPLICITY + bool operator == (const EV_P) const EV_NOEXCEPT + { + return this->EV_AX == EV_A; + } + + bool operator != (const EV_P) const EV_NOEXCEPT + { + return ! (*this == EV_A); + } + + operator struct ev_loop * () const EV_NOEXCEPT + { + return EV_AX; + } + + operator const struct ev_loop * () const EV_NOEXCEPT + { + return EV_AX; + } + + bool is_default () const EV_NOEXCEPT + { + return EV_AX == ev_default_loop (0); + } +#endif + +#if EV_COMPAT3 + void loop (int flags = 0) + { + ev_run (EV_AX_ flags); + } + + void unloop (how_t how = ONE) EV_NOEXCEPT + { + ev_break (EV_AX_ how); + } +#endif + + void run (int flags = 0) + { + ev_run (EV_AX_ flags); + } + + void break_loop (how_t how = ONE) EV_NOEXCEPT + { + ev_break (EV_AX_ how); + } + + void post_fork () EV_NOEXCEPT + { + ev_loop_fork (EV_AX); + } + + unsigned int backend () const EV_NOEXCEPT + { + return ev_backend (EV_AX); + } + + tstamp now () const EV_NOEXCEPT + { + return ev_now (EV_AX); + } + + void ref () EV_NOEXCEPT + { + ev_ref (EV_AX); + } + + void unref () EV_NOEXCEPT + { + ev_unref (EV_AX); + } + +#if EV_FEATURE_API + unsigned int iteration () const EV_NOEXCEPT + { + return ev_iteration (EV_AX); + } + + unsigned int depth () const EV_NOEXCEPT + { + return ev_depth (EV_AX); + } + + void set_io_collect_interval (tstamp interval) EV_NOEXCEPT + { + ev_set_io_collect_interval (EV_AX_ interval); + } + + void set_timeout_collect_interval (tstamp interval) EV_NOEXCEPT + { + ev_set_timeout_collect_interval (EV_AX_ interval); + } +#endif + + // function callback + void once (int fd, int events, tstamp timeout, void (*cb)(int, void *), void *arg = 0) EV_NOEXCEPT + { + ev_once (EV_AX_ fd, events, timeout, cb, arg); + } + + // method callback + template + void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT + { + once (fd, events, timeout, method_thunk, object); + } + + // default method == operator () + template + void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT + { + once (fd, events, timeout, method_thunk, object); + } + + template + static void method_thunk (int revents, void *arg) + { + (static_cast(arg)->*method) + (revents); + } + + // no-argument method callback + template + void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT + { + once (fd, events, timeout, method_noargs_thunk, object); + } + + template + static void method_noargs_thunk (int revents, void *arg) + { + (static_cast(arg)->*method) + (); + } + + // simpler function callback + template + void once (int fd, int events, tstamp timeout) EV_NOEXCEPT + { + once (fd, events, timeout, simpler_func_thunk); + } + + template + static void simpler_func_thunk (int revents, void *arg) + { + (*cb) + (revents); + } + + // simplest function callback + template + void once (int fd, int events, tstamp timeout) EV_NOEXCEPT + { + once (fd, events, timeout, simplest_func_thunk); + } + + template + static void simplest_func_thunk (int revents, void *arg) + { + (*cb) + (); + } + + void feed_fd_event (int fd, int revents) EV_NOEXCEPT + { + ev_feed_fd_event (EV_AX_ fd, revents); + } + + void feed_signal_event (int signum) EV_NOEXCEPT + { + ev_feed_signal_event (EV_AX_ signum); + } + +#if EV_MULTIPLICITY + struct ev_loop* EV_AX; +#endif + + }; + +#if EV_MULTIPLICITY + struct dynamic_loop : loop_ref + { + + dynamic_loop (unsigned int flags = AUTO) + : loop_ref (ev_loop_new (flags)) + { + if (!EV_AX) + throw bad_loop (); + } + + ~dynamic_loop () EV_NOEXCEPT + { + ev_loop_destroy (EV_AX); + EV_AX = 0; + } + + private: + + dynamic_loop (const dynamic_loop &); + + dynamic_loop & operator= (const dynamic_loop &); + + }; +#endif + + struct default_loop : loop_ref + { + default_loop (unsigned int flags = AUTO) +#if EV_MULTIPLICITY + : loop_ref (ev_default_loop (flags)) +#endif + { + if ( +#if EV_MULTIPLICITY + !EV_AX +#else + !ev_default_loop (flags) +#endif + ) + throw bad_loop (); + } + + private: + default_loop (const default_loop &); + default_loop &operator = (const default_loop &); + }; + + inline loop_ref get_default_loop () EV_NOEXCEPT + { +#if EV_MULTIPLICITY + return ev_default_loop (0); +#else + return loop_ref (); +#endif + } + +#undef EV_AX +#undef EV_AX_ + +#undef EV_PX +#undef EV_PX_ +#if EV_MULTIPLICITY +# define EV_PX loop_ref EV_A +# define EV_PX_ loop_ref EV_A_ +#else +# define EV_PX +# define EV_PX_ +#endif + + template + struct base : ev_watcher + { + // scoped pause/unpause of a watcher + struct freeze_guard + { + watcher &w; + bool active; + + freeze_guard (watcher *self) EV_NOEXCEPT + : w (*self), active (w.is_active ()) + { + if (active) w.stop (); + } + + ~freeze_guard () + { + if (active) w.start (); + } + }; + + #if EV_MULTIPLICITY + EV_PX; + + // loop set + void set (EV_P) EV_NOEXCEPT + { + this->EV_A = EV_A; + } + #endif + + base (EV_PX) EV_NOEXCEPT + #if EV_MULTIPLICITY + : EV_A (EV_A) + #endif + { + ev_init (this, 0); + } + + void set_ (const void *data, void (*cb)(EV_P_ ev_watcher *w, int revents)) EV_NOEXCEPT + { + this->data = (void *)data; + ev_set_cb (static_cast(this), cb); + } + + // function callback + template + void set (void *data = 0) EV_NOEXCEPT + { + set_ (data, function_thunk); + } + + template + static void function_thunk (EV_P_ ev_watcher *w, int revents) + { + function + (*static_cast(w), revents); + } + + // method callback + template + void set (K *object) EV_NOEXCEPT + { + set_ (object, method_thunk); + } + + // default method == operator () + template + void set (K *object) EV_NOEXCEPT + { + set_ (object, method_thunk); + } + + template + static void method_thunk (EV_P_ ev_watcher *w, int revents) + { + (static_cast(w->data)->*method) + (*static_cast(w), revents); + } + + // no-argument callback + template + void set (K *object) EV_NOEXCEPT + { + set_ (object, method_noargs_thunk); + } + + template + static void method_noargs_thunk (EV_P_ ev_watcher *w, int revents) + { + (static_cast(w->data)->*method) + (); + } + + void operator ()(int events = EV_UNDEF) + { + return + ev_cb (static_cast(this)) + (static_cast(this), events); + } + + bool is_active () const EV_NOEXCEPT + { + return ev_is_active (static_cast(this)); + } + + bool is_pending () const EV_NOEXCEPT + { + return ev_is_pending (static_cast(this)); + } + + void feed_event (int revents) EV_NOEXCEPT + { + ev_feed_event (EV_A_ static_cast(this), revents); + } + }; + + inline tstamp now (EV_P) EV_NOEXCEPT + { + return ev_now (EV_A); + } + + inline void delay (tstamp interval) EV_NOEXCEPT + { + ev_sleep (interval); + } + + inline int version_major () EV_NOEXCEPT + { + return ev_version_major (); + } + + inline int version_minor () EV_NOEXCEPT + { + return ev_version_minor (); + } + + inline unsigned int supported_backends () EV_NOEXCEPT + { + return ev_supported_backends (); + } + + inline unsigned int recommended_backends () EV_NOEXCEPT + { + return ev_recommended_backends (); + } + + inline unsigned int embeddable_backends () EV_NOEXCEPT + { + return ev_embeddable_backends (); + } + + inline void set_allocator (void *(*cb)(void *ptr, long size) EV_NOEXCEPT) EV_NOEXCEPT + { + ev_set_allocator (cb); + } + + inline void set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT + { + ev_set_syserr_cb (cb); + } + + #if EV_MULTIPLICITY + #define EV_CONSTRUCT(cppstem,cstem) \ + (EV_PX = get_default_loop ()) EV_NOEXCEPT \ + : base (EV_A) \ + { \ + } + #else + #define EV_CONSTRUCT(cppstem,cstem) \ + () EV_NOEXCEPT \ + { \ + } + #endif + + /* using a template here would require quite a few more lines, + * so a macro solution was chosen */ + #define EV_BEGIN_WATCHER(cppstem,cstem) \ + \ + struct cppstem : base \ + { \ + void start () EV_NOEXCEPT \ + { \ + ev_ ## cstem ## _start (EV_A_ static_cast(this)); \ + } \ + \ + void stop () EV_NOEXCEPT \ + { \ + ev_ ## cstem ## _stop (EV_A_ static_cast(this)); \ + } \ + \ + cppstem EV_CONSTRUCT(cppstem,cstem) \ + \ + ~cppstem () EV_NOEXCEPT \ + { \ + stop (); \ + } \ + \ + using base::set; \ + \ + private: \ + \ + cppstem (const cppstem &o); \ + \ + cppstem &operator =(const cppstem &o); \ + \ + public: + + #define EV_END_WATCHER(cppstem,cstem) \ + }; + + EV_BEGIN_WATCHER (io, io) + void set (int fd, int events) EV_NOEXCEPT + { + freeze_guard freeze (this); + ev_io_set (static_cast(this), fd, events); + } + + void set (int events) EV_NOEXCEPT + { + freeze_guard freeze (this); + ev_io_modify (static_cast(this), events); + } + + void start (int fd, int events) EV_NOEXCEPT + { + set (fd, events); + start (); + } + EV_END_WATCHER (io, io) + + EV_BEGIN_WATCHER (timer, timer) + void set (ev_tstamp after, ev_tstamp repeat = 0.) EV_NOEXCEPT + { + freeze_guard freeze (this); + ev_timer_set (static_cast(this), after, repeat); + } + + void start (ev_tstamp after, ev_tstamp repeat = 0.) EV_NOEXCEPT + { + set (after, repeat); + start (); + } + + void again () EV_NOEXCEPT + { + ev_timer_again (EV_A_ static_cast(this)); + } + + ev_tstamp remaining () + { + return ev_timer_remaining (EV_A_ static_cast(this)); + } + EV_END_WATCHER (timer, timer) + + #if EV_PERIODIC_ENABLE + EV_BEGIN_WATCHER (periodic, periodic) + void set (ev_tstamp at, ev_tstamp interval = 0.) EV_NOEXCEPT + { + freeze_guard freeze (this); + ev_periodic_set (static_cast(this), at, interval, 0); + } + + void start (ev_tstamp at, ev_tstamp interval = 0.) EV_NOEXCEPT + { + set (at, interval); + start (); + } + + void again () EV_NOEXCEPT + { + ev_periodic_again (EV_A_ static_cast(this)); + } + EV_END_WATCHER (periodic, periodic) + #endif + + #if EV_SIGNAL_ENABLE + EV_BEGIN_WATCHER (sig, signal) + void set (int signum) EV_NOEXCEPT + { + freeze_guard freeze (this); + ev_signal_set (static_cast(this), signum); + } + + void start (int signum) EV_NOEXCEPT + { + set (signum); + start (); + } + EV_END_WATCHER (sig, signal) + #endif + + #if EV_CHILD_ENABLE + EV_BEGIN_WATCHER (child, child) + void set (int pid, int trace = 0) EV_NOEXCEPT + { + freeze_guard freeze (this); + ev_child_set (static_cast(this), pid, trace); + } + + void start (int pid, int trace = 0) EV_NOEXCEPT + { + set (pid, trace); + start (); + } + EV_END_WATCHER (child, child) + #endif + + #if EV_STAT_ENABLE + EV_BEGIN_WATCHER (stat, stat) + void set (const char *path, ev_tstamp interval = 0.) EV_NOEXCEPT + { + freeze_guard freeze (this); + ev_stat_set (static_cast(this), path, interval); + } + + void start (const char *path, ev_tstamp interval = 0.) EV_NOEXCEPT + { + stop (); + set (path, interval); + start (); + } + + void update () EV_NOEXCEPT + { + ev_stat_stat (EV_A_ static_cast(this)); + } + EV_END_WATCHER (stat, stat) + #endif + + #if EV_IDLE_ENABLE + EV_BEGIN_WATCHER (idle, idle) + void set () EV_NOEXCEPT { } + EV_END_WATCHER (idle, idle) + #endif + + #if EV_PREPARE_ENABLE + EV_BEGIN_WATCHER (prepare, prepare) + void set () EV_NOEXCEPT { } + EV_END_WATCHER (prepare, prepare) + #endif + + #if EV_CHECK_ENABLE + EV_BEGIN_WATCHER (check, check) + void set () EV_NOEXCEPT { } + EV_END_WATCHER (check, check) + #endif + + #if EV_EMBED_ENABLE + EV_BEGIN_WATCHER (embed, embed) + void set_embed (struct ev_loop *embedded_loop) EV_NOEXCEPT + { + freeze_guard freeze (this); + ev_embed_set (static_cast(this), embedded_loop); + } + + void start (struct ev_loop *embedded_loop) EV_NOEXCEPT + { + set (embedded_loop); + start (); + } + + void sweep () + { + ev_embed_sweep (EV_A_ static_cast(this)); + } + EV_END_WATCHER (embed, embed) + #endif + + #if EV_FORK_ENABLE + EV_BEGIN_WATCHER (fork, fork) + void set () EV_NOEXCEPT { } + EV_END_WATCHER (fork, fork) + #endif + + #if EV_ASYNC_ENABLE + EV_BEGIN_WATCHER (async, async) + void send () EV_NOEXCEPT + { + ev_async_send (EV_A_ static_cast(this)); + } + + bool async_pending () EV_NOEXCEPT + { + return ev_async_pending (static_cast(this)); + } + EV_END_WATCHER (async, async) + #endif + + #undef EV_PX + #undef EV_PX_ + #undef EV_CONSTRUCT + #undef EV_BEGIN_WATCHER + #undef EV_END_WATCHER +} + +#endif + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev.3 b/deps/ngtcp2/ngtcp2/third-party/libev/ev.3 new file mode 100644 index 000000000000..af578f0bb4ee --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev.3 @@ -0,0 +1,5819 @@ +.\" Automatically generated by Pod::Man 4.11 (Pod::Simple 3.35) +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" Set up some character translations and predefined strings. \*(-- will +.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +.\" double quote, and \*(R" will give a right double quote. \*(C+ will +.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +.\" nothing in troff, for use with C<>. +.tr \(*W- +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.ie n \{\ +. ds -- \(*W- +. ds PI pi +. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +. ds L" "" +. ds R" "" +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds -- \|\(em\| +. ds PI \(*p +. ds L" `` +. ds R" '' +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is >0, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +.\" +.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +.\" Fear. Run. Save yourself. No user-serviceable parts. +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds / +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +.\} +.rm #[ #] #H #V #F C +.\" ======================================================================== +.\" +.IX Title "LIBEV 3" +.TH LIBEV 3 "2020-03-12" "libev-4.31" "libev - high performance full featured event loop" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.SH "NAME" +libev \- a high performance full\-featured event loop written in C +.SH "SYNOPSIS" +.IX Header "SYNOPSIS" +.Vb 1 +\& #include +.Ve +.SS "\s-1EXAMPLE PROGRAM\s0" +.IX Subsection "EXAMPLE PROGRAM" +.Vb 2 +\& // a single header file is required +\& #include +\& +\& #include // for puts +\& +\& // every watcher type has its own typedef\*(Aqd struct +\& // with the name ev_TYPE +\& ev_io stdin_watcher; +\& ev_timer timeout_watcher; +\& +\& // all watcher callbacks have a similar signature +\& // this callback is called when data is readable on stdin +\& static void +\& stdin_cb (EV_P_ ev_io *w, int revents) +\& { +\& puts ("stdin ready"); +\& // for one\-shot events, one must manually stop the watcher +\& // with its corresponding stop function. +\& ev_io_stop (EV_A_ w); +\& +\& // this causes all nested ev_run\*(Aqs to stop iterating +\& ev_break (EV_A_ EVBREAK_ALL); +\& } +\& +\& // another callback, this time for a time\-out +\& static void +\& timeout_cb (EV_P_ ev_timer *w, int revents) +\& { +\& puts ("timeout"); +\& // this causes the innermost ev_run to stop iterating +\& ev_break (EV_A_ EVBREAK_ONE); +\& } +\& +\& int +\& main (void) +\& { +\& // use the default event loop unless you have special needs +\& struct ev_loop *loop = EV_DEFAULT; +\& +\& // initialise an io watcher, then start it +\& // this one will watch for stdin to become readable +\& ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ); +\& ev_io_start (loop, &stdin_watcher); +\& +\& // initialise a timer watcher, then start it +\& // simple non\-repeating 5.5 second timeout +\& ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.); +\& ev_timer_start (loop, &timeout_watcher); +\& +\& // now wait for events to arrive +\& ev_run (loop, 0); +\& +\& // break was called, so exit +\& return 0; +\& } +.Ve +.SH "ABOUT THIS DOCUMENT" +.IX Header "ABOUT THIS DOCUMENT" +This document documents the libev software package. +.PP +The newest version of this document is also available as an html-formatted +web page you might find easier to navigate when reading it for the first +time: . +.PP +While this document tries to be as complete as possible in documenting +libev, its usage and the rationale behind its design, it is not a tutorial +on event-based programming, nor will it introduce event-based programming +with libev. +.PP +Familiarity with event based programming techniques in general is assumed +throughout this document. +.SH "WHAT TO READ WHEN IN A HURRY" +.IX Header "WHAT TO READ WHEN IN A HURRY" +This manual tries to be very detailed, but unfortunately, this also makes +it very long. If you just want to know the basics of libev, I suggest +reading \*(L"\s-1ANATOMY OF A WATCHER\*(R"\s0, then the \*(L"\s-1EXAMPLE PROGRAM\*(R"\s0 above and +look up the missing functions in \*(L"\s-1GLOBAL FUNCTIONS\*(R"\s0 and the \f(CW\*(C`ev_io\*(C'\fR and +\&\f(CW\*(C`ev_timer\*(C'\fR sections in \*(L"\s-1WATCHER TYPES\*(R"\s0. +.SH "ABOUT LIBEV" +.IX Header "ABOUT LIBEV" +Libev is an event loop: you register interest in certain events (such as a +file descriptor being readable or a timeout occurring), and it will manage +these event sources and provide your program with events. +.PP +To do this, it must take more or less complete control over your process +(or thread) by executing the \fIevent loop\fR handler, and will then +communicate events via a callback mechanism. +.PP +You register interest in certain events by registering so-called \fIevent +watchers\fR, which are relatively small C structures you initialise with the +details of the event, and then hand it over to libev by \fIstarting\fR the +watcher. +.SS "\s-1FEATURES\s0" +.IX Subsection "FEATURES" +Libev supports \f(CW\*(C`select\*(C'\fR, \f(CW\*(C`poll\*(C'\fR, the Linux-specific aio and \f(CW\*(C`epoll\*(C'\fR +interfaces, the BSD-specific \f(CW\*(C`kqueue\*(C'\fR and the Solaris-specific event port +mechanisms for file descriptor events (\f(CW\*(C`ev_io\*(C'\fR), the Linux \f(CW\*(C`inotify\*(C'\fR +interface (for \f(CW\*(C`ev_stat\*(C'\fR), Linux eventfd/signalfd (for faster and cleaner +inter-thread wakeup (\f(CW\*(C`ev_async\*(C'\fR)/signal handling (\f(CW\*(C`ev_signal\*(C'\fR)) relative +timers (\f(CW\*(C`ev_timer\*(C'\fR), absolute timers with customised rescheduling +(\f(CW\*(C`ev_periodic\*(C'\fR), synchronous signals (\f(CW\*(C`ev_signal\*(C'\fR), process status +change events (\f(CW\*(C`ev_child\*(C'\fR), and event watchers dealing with the event +loop mechanism itself (\f(CW\*(C`ev_idle\*(C'\fR, \f(CW\*(C`ev_embed\*(C'\fR, \f(CW\*(C`ev_prepare\*(C'\fR and +\&\f(CW\*(C`ev_check\*(C'\fR watchers) as well as file watchers (\f(CW\*(C`ev_stat\*(C'\fR) and even +limited support for fork events (\f(CW\*(C`ev_fork\*(C'\fR). +.PP +It also is quite fast (see this +benchmark comparing it to libevent +for example). +.SS "\s-1CONVENTIONS\s0" +.IX Subsection "CONVENTIONS" +Libev is very configurable. In this manual the default (and most common) +configuration will be described, which supports multiple event loops. For +more info about various configuration options please have a look at +\&\fB\s-1EMBED\s0\fR section in this manual. If libev was configured without support +for multiple event loops, then all functions taking an initial argument of +name \f(CW\*(C`loop\*(C'\fR (which is always of type \f(CW\*(C`struct ev_loop *\*(C'\fR) will not have +this argument. +.SS "\s-1TIME REPRESENTATION\s0" +.IX Subsection "TIME REPRESENTATION" +Libev represents time as a single floating point number, representing +the (fractional) number of seconds since the (\s-1POSIX\s0) epoch (in practice +somewhere near the beginning of 1970, details are complicated, don't +ask). This type is called \f(CW\*(C`ev_tstamp\*(C'\fR, which is what you should use +too. It usually aliases to the \f(CW\*(C`double\*(C'\fR type in C. When you need to do +any calculations on it, you should treat it as some floating point value. +.PP +Unlike the name component \f(CW\*(C`stamp\*(C'\fR might indicate, it is also used for +time differences (e.g. delays) throughout libev. +.SH "ERROR HANDLING" +.IX Header "ERROR HANDLING" +Libev knows three classes of errors: operating system errors, usage errors +and internal errors (bugs). +.PP +When libev catches an operating system error it cannot handle (for example +a system call indicating a condition libev cannot fix), it calls the callback +set via \f(CW\*(C`ev_set_syserr_cb\*(C'\fR, which is supposed to fix the problem or +abort. The default is to print a diagnostic message and to call \f(CW\*(C`abort +()\*(C'\fR. +.PP +When libev detects a usage error such as a negative timer interval, then +it will print a diagnostic message and abort (via the \f(CW\*(C`assert\*(C'\fR mechanism, +so \f(CW\*(C`NDEBUG\*(C'\fR will disable this checking): these are programming errors in +the libev caller and need to be fixed there. +.PP +Via the \f(CW\*(C`EV_FREQUENT\*(C'\fR macro you can compile in and/or enable extensive +consistency checking code inside libev that can be used to check for +internal inconsistencies, suually caused by application bugs. +.PP +Libev also has a few internal error-checking \f(CW\*(C`assert\*(C'\fRions. These do not +trigger under normal circumstances, as they indicate either a bug in libev +or worse. +.SH "GLOBAL FUNCTIONS" +.IX Header "GLOBAL FUNCTIONS" +These functions can be called anytime, even before initialising the +library in any way. +.IP "ev_tstamp ev_time ()" 4 +.IX Item "ev_tstamp ev_time ()" +Returns the current time as libev would use it. Please note that the +\&\f(CW\*(C`ev_now\*(C'\fR function is usually faster and also often returns the timestamp +you actually want to know. Also interesting is the combination of +\&\f(CW\*(C`ev_now_update\*(C'\fR and \f(CW\*(C`ev_now\*(C'\fR. +.IP "ev_sleep (ev_tstamp interval)" 4 +.IX Item "ev_sleep (ev_tstamp interval)" +Sleep for the given interval: The current thread will be blocked +until either it is interrupted or the given time interval has +passed (approximately \- it might return a bit earlier even if not +interrupted). Returns immediately if \f(CW\*(C`interval <= 0\*(C'\fR. +.Sp +Basically this is a sub-second-resolution \f(CW\*(C`sleep ()\*(C'\fR. +.Sp +The range of the \f(CW\*(C`interval\*(C'\fR is limited \- libev only guarantees to work +with sleep times of up to one day (\f(CW\*(C`interval <= 86400\*(C'\fR). +.IP "int ev_version_major ()" 4 +.IX Item "int ev_version_major ()" +.PD 0 +.IP "int ev_version_minor ()" 4 +.IX Item "int ev_version_minor ()" +.PD +You can find out the major and minor \s-1ABI\s0 version numbers of the library +you linked against by calling the functions \f(CW\*(C`ev_version_major\*(C'\fR and +\&\f(CW\*(C`ev_version_minor\*(C'\fR. If you want, you can compare against the global +symbols \f(CW\*(C`EV_VERSION_MAJOR\*(C'\fR and \f(CW\*(C`EV_VERSION_MINOR\*(C'\fR, which specify the +version of the library your program was compiled against. +.Sp +These version numbers refer to the \s-1ABI\s0 version of the library, not the +release version. +.Sp +Usually, it's a good idea to terminate if the major versions mismatch, +as this indicates an incompatible change. Minor versions are usually +compatible to older versions, so a larger minor version alone is usually +not a problem. +.Sp +Example: Make sure we haven't accidentally been linked against the wrong +version (note, however, that this will not detect other \s-1ABI\s0 mismatches, +such as \s-1LFS\s0 or reentrancy). +.Sp +.Vb 3 +\& assert (("libev version mismatch", +\& ev_version_major () == EV_VERSION_MAJOR +\& && ev_version_minor () >= EV_VERSION_MINOR)); +.Ve +.IP "unsigned int ev_supported_backends ()" 4 +.IX Item "unsigned int ev_supported_backends ()" +Return the set of all backends (i.e. their corresponding \f(CW\*(C`EV_BACKEND_*\*(C'\fR +value) compiled into this binary of libev (independent of their +availability on the system you are running on). See \f(CW\*(C`ev_default_loop\*(C'\fR for +a description of the set values. +.Sp +Example: make sure we have the epoll method, because yeah this is cool and +a must have and can we have a torrent of it please!!!11 +.Sp +.Vb 2 +\& assert (("sorry, no epoll, no sex", +\& ev_supported_backends () & EVBACKEND_EPOLL)); +.Ve +.IP "unsigned int ev_recommended_backends ()" 4 +.IX Item "unsigned int ev_recommended_backends ()" +Return the set of all backends compiled into this binary of libev and +also recommended for this platform, meaning it will work for most file +descriptor types. This set is often smaller than the one returned by +\&\f(CW\*(C`ev_supported_backends\*(C'\fR, as for example kqueue is broken on most BSDs +and will not be auto-detected unless you explicitly request it (assuming +you know what you are doing). This is the set of backends that libev will +probe for if you specify no backends explicitly. +.IP "unsigned int ev_embeddable_backends ()" 4 +.IX Item "unsigned int ev_embeddable_backends ()" +Returns the set of backends that are embeddable in other event loops. This +value is platform-specific but can include backends not available on the +current system. To find which embeddable backends might be supported on +the current system, you would need to look at \f(CW\*(C`ev_embeddable_backends () +& ev_supported_backends ()\*(C'\fR, likewise for recommended ones. +.Sp +See the description of \f(CW\*(C`ev_embed\*(C'\fR watchers for more info. +.IP "ev_set_allocator (void *(*cb)(void *ptr, long size) throw ())" 4 +.IX Item "ev_set_allocator (void *(*cb)(void *ptr, long size) throw ())" +Sets the allocation function to use (the prototype is similar \- the +semantics are identical to the \f(CW\*(C`realloc\*(C'\fR C89/SuS/POSIX function). It is +used to allocate and free memory (no surprises here). If it returns zero +when memory needs to be allocated (\f(CW\*(C`size != 0\*(C'\fR), the library might abort +or take some potentially destructive action. +.Sp +Since some systems (at least OpenBSD and Darwin) fail to implement +correct \f(CW\*(C`realloc\*(C'\fR semantics, libev will use a wrapper around the system +\&\f(CW\*(C`realloc\*(C'\fR and \f(CW\*(C`free\*(C'\fR functions by default. +.Sp +You could override this function in high-availability programs to, say, +free some memory if it cannot allocate memory, to use a special allocator, +or even to sleep a while and retry until some memory is available. +.Sp +Example: The following is the \f(CW\*(C`realloc\*(C'\fR function that libev itself uses +which should work with \f(CW\*(C`realloc\*(C'\fR and \f(CW\*(C`free\*(C'\fR functions of all kinds and +is probably a good basis for your own implementation. +.Sp +.Vb 5 +\& static void * +\& ev_realloc_emul (void *ptr, long size) EV_NOEXCEPT +\& { +\& if (size) +\& return realloc (ptr, size); +\& +\& free (ptr); +\& return 0; +\& } +.Ve +.Sp +Example: Replace the libev allocator with one that waits a bit and then +retries. +.Sp +.Vb 8 +\& static void * +\& persistent_realloc (void *ptr, size_t size) +\& { +\& if (!size) +\& { +\& free (ptr); +\& return 0; +\& } +\& +\& for (;;) +\& { +\& void *newptr = realloc (ptr, size); +\& +\& if (newptr) +\& return newptr; +\& +\& sleep (60); +\& } +\& } +\& +\& ... +\& ev_set_allocator (persistent_realloc); +.Ve +.IP "ev_set_syserr_cb (void (*cb)(const char *msg) throw ())" 4 +.IX Item "ev_set_syserr_cb (void (*cb)(const char *msg) throw ())" +Set the callback function to call on a retryable system call error (such +as failed select, poll, epoll_wait). The message is a printable string +indicating the system call or subsystem causing the problem. If this +callback is set, then libev will expect it to remedy the situation, no +matter what, when it returns. That is, libev will generally retry the +requested operation, or, if the condition doesn't go away, do bad stuff +(such as abort). +.Sp +Example: This is basically the same thing that libev does internally, too. +.Sp +.Vb 6 +\& static void +\& fatal_error (const char *msg) +\& { +\& perror (msg); +\& abort (); +\& } +\& +\& ... +\& ev_set_syserr_cb (fatal_error); +.Ve +.IP "ev_feed_signal (int signum)" 4 +.IX Item "ev_feed_signal (int signum)" +This function can be used to \*(L"simulate\*(R" a signal receive. It is completely +safe to call this function at any time, from any context, including signal +handlers or random threads. +.Sp +Its main use is to customise signal handling in your process, especially +in the presence of threads. For example, you could block signals +by default in all threads (and specifying \f(CW\*(C`EVFLAG_NOSIGMASK\*(C'\fR when +creating any loops), and in one thread, use \f(CW\*(C`sigwait\*(C'\fR or any other +mechanism to wait for signals, then \*(L"deliver\*(R" them to libev by calling +\&\f(CW\*(C`ev_feed_signal\*(C'\fR. +.SH "FUNCTIONS CONTROLLING EVENT LOOPS" +.IX Header "FUNCTIONS CONTROLLING EVENT LOOPS" +An event loop is described by a \f(CW\*(C`struct ev_loop *\*(C'\fR (the \f(CW\*(C`struct\*(C'\fR is +\&\fInot\fR optional in this case unless libev 3 compatibility is disabled, as +libev 3 had an \f(CW\*(C`ev_loop\*(C'\fR function colliding with the struct name). +.PP +The library knows two types of such loops, the \fIdefault\fR loop, which +supports child process events, and dynamically created event loops which +do not. +.IP "struct ev_loop *ev_default_loop (unsigned int flags)" 4 +.IX Item "struct ev_loop *ev_default_loop (unsigned int flags)" +This returns the \*(L"default\*(R" event loop object, which is what you should +normally use when you just need \*(L"the event loop\*(R". Event loop objects and +the \f(CW\*(C`flags\*(C'\fR parameter are described in more detail in the entry for +\&\f(CW\*(C`ev_loop_new\*(C'\fR. +.Sp +If the default loop is already initialised then this function simply +returns it (and ignores the flags. If that is troubling you, check +\&\f(CW\*(C`ev_backend ()\*(C'\fR afterwards). Otherwise it will create it with the given +flags, which should almost always be \f(CW0\fR, unless the caller is also the +one calling \f(CW\*(C`ev_run\*(C'\fR or otherwise qualifies as \*(L"the main program\*(R". +.Sp +If you don't know what event loop to use, use the one returned from this +function (or via the \f(CW\*(C`EV_DEFAULT\*(C'\fR macro). +.Sp +Note that this function is \fInot\fR thread-safe, so if you want to use it +from multiple threads, you have to employ some kind of mutex (note also +that this case is unlikely, as loops cannot be shared easily between +threads anyway). +.Sp +The default loop is the only loop that can handle \f(CW\*(C`ev_child\*(C'\fR watchers, +and to do this, it always registers a handler for \f(CW\*(C`SIGCHLD\*(C'\fR. If this is +a problem for your application you can either create a dynamic loop with +\&\f(CW\*(C`ev_loop_new\*(C'\fR which doesn't do that, or you can simply overwrite the +\&\f(CW\*(C`SIGCHLD\*(C'\fR signal handler \fIafter\fR calling \f(CW\*(C`ev_default_init\*(C'\fR. +.Sp +Example: This is the most typical usage. +.Sp +.Vb 2 +\& if (!ev_default_loop (0)) +\& fatal ("could not initialise libev, bad $LIBEV_FLAGS in environment?"); +.Ve +.Sp +Example: Restrict libev to the select and poll backends, and do not allow +environment settings to be taken into account: +.Sp +.Vb 1 +\& ev_default_loop (EVBACKEND_POLL | EVBACKEND_SELECT | EVFLAG_NOENV); +.Ve +.IP "struct ev_loop *ev_loop_new (unsigned int flags)" 4 +.IX Item "struct ev_loop *ev_loop_new (unsigned int flags)" +This will create and initialise a new event loop object. If the loop +could not be initialised, returns false. +.Sp +This function is thread-safe, and one common way to use libev with +threads is indeed to create one loop per thread, and using the default +loop in the \*(L"main\*(R" or \*(L"initial\*(R" thread. +.Sp +The flags argument can be used to specify special behaviour or specific +backends to use, and is usually specified as \f(CW0\fR (or \f(CW\*(C`EVFLAG_AUTO\*(C'\fR). +.Sp +The following flags are supported: +.RS 4 +.ie n .IP """EVFLAG_AUTO""" 4 +.el .IP "\f(CWEVFLAG_AUTO\fR" 4 +.IX Item "EVFLAG_AUTO" +The default flags value. Use this if you have no clue (it's the right +thing, believe me). +.ie n .IP """EVFLAG_NOENV""" 4 +.el .IP "\f(CWEVFLAG_NOENV\fR" 4 +.IX Item "EVFLAG_NOENV" +If this flag bit is or'ed into the flag value (or the program runs setuid +or setgid) then libev will \fInot\fR look at the environment variable +\&\f(CW\*(C`LIBEV_FLAGS\*(C'\fR. Otherwise (the default), this environment variable will +override the flags completely if it is found in the environment. This is +useful to try out specific backends to test their performance, to work +around bugs, or to make libev threadsafe (accessing environment variables +cannot be done in a threadsafe way, but usually it works if no other +thread modifies them). +.ie n .IP """EVFLAG_FORKCHECK""" 4 +.el .IP "\f(CWEVFLAG_FORKCHECK\fR" 4 +.IX Item "EVFLAG_FORKCHECK" +Instead of calling \f(CW\*(C`ev_loop_fork\*(C'\fR manually after a fork, you can also +make libev check for a fork in each iteration by enabling this flag. +.Sp +This works by calling \f(CW\*(C`getpid ()\*(C'\fR on every iteration of the loop, +and thus this might slow down your event loop if you do a lot of loop +iterations and little real work, but is usually not noticeable (on my +GNU/Linux system for example, \f(CW\*(C`getpid\*(C'\fR is actually a simple 5\-insn +sequence without a system call and thus \fIvery\fR fast, but my GNU/Linux +system also has \f(CW\*(C`pthread_atfork\*(C'\fR which is even faster). (Update: glibc +versions 2.25 apparently removed the \f(CW\*(C`getpid\*(C'\fR optimisation again). +.Sp +The big advantage of this flag is that you can forget about fork (and +forget about forgetting to tell libev about forking, although you still +have to ignore \f(CW\*(C`SIGPIPE\*(C'\fR) when you use this flag. +.Sp +This flag setting cannot be overridden or specified in the \f(CW\*(C`LIBEV_FLAGS\*(C'\fR +environment variable. +.ie n .IP """EVFLAG_NOINOTIFY""" 4 +.el .IP "\f(CWEVFLAG_NOINOTIFY\fR" 4 +.IX Item "EVFLAG_NOINOTIFY" +When this flag is specified, then libev will not attempt to use the +\&\fIinotify\fR \s-1API\s0 for its \f(CW\*(C`ev_stat\*(C'\fR watchers. Apart from debugging and +testing, this flag can be useful to conserve inotify file descriptors, as +otherwise each loop using \f(CW\*(C`ev_stat\*(C'\fR watchers consumes one inotify handle. +.ie n .IP """EVFLAG_SIGNALFD""" 4 +.el .IP "\f(CWEVFLAG_SIGNALFD\fR" 4 +.IX Item "EVFLAG_SIGNALFD" +When this flag is specified, then libev will attempt to use the +\&\fIsignalfd\fR \s-1API\s0 for its \f(CW\*(C`ev_signal\*(C'\fR (and \f(CW\*(C`ev_child\*(C'\fR) watchers. This \s-1API\s0 +delivers signals synchronously, which makes it both faster and might make +it possible to get the queued signal data. It can also simplify signal +handling with threads, as long as you properly block signals in your +threads that are not interested in handling them. +.Sp +Signalfd will not be used by default as this changes your signal mask, and +there are a lot of shoddy libraries and programs (glib's threadpool for +example) that can't properly initialise their signal masks. +.ie n .IP """EVFLAG_NOSIGMASK""" 4 +.el .IP "\f(CWEVFLAG_NOSIGMASK\fR" 4 +.IX Item "EVFLAG_NOSIGMASK" +When this flag is specified, then libev will avoid to modify the signal +mask. Specifically, this means you have to make sure signals are unblocked +when you want to receive them. +.Sp +This behaviour is useful when you want to do your own signal handling, or +want to handle signals only in specific threads and want to avoid libev +unblocking the signals. +.Sp +It's also required by \s-1POSIX\s0 in a threaded program, as libev calls +\&\f(CW\*(C`sigprocmask\*(C'\fR, whose behaviour is officially unspecified. +.ie n .IP """EVFLAG_NOTIMERFD""" 4 +.el .IP "\f(CWEVFLAG_NOTIMERFD\fR" 4 +.IX Item "EVFLAG_NOTIMERFD" +When this flag is specified, the libev will avoid using a \f(CW\*(C`timerfd\*(C'\fR to +detect time jumps. It will still be able to detect time jumps, but takes +longer and has a lower accuracy in doing so, but saves a file descriptor +per loop. +.Sp +The current implementation only tries to use a \f(CW\*(C`timerfd\*(C'\fR when the first +\&\f(CW\*(C`ev_periodic\*(C'\fR watcher is started and falls back on other methods if it +cannot be created, but this behaviour might change in the future. +.ie n .IP """EVBACKEND_SELECT"" (value 1, portable select backend)" 4 +.el .IP "\f(CWEVBACKEND_SELECT\fR (value 1, portable select backend)" 4 +.IX Item "EVBACKEND_SELECT (value 1, portable select backend)" +This is your standard \fBselect\fR\|(2) backend. Not \fIcompletely\fR standard, as +libev tries to roll its own fd_set with no limits on the number of fds, +but if that fails, expect a fairly low limit on the number of fds when +using this backend. It doesn't scale too well (O(highest_fd)), but its +usually the fastest backend for a low number of (low-numbered :) fds. +.Sp +To get good performance out of this backend you need a high amount of +parallelism (most of the file descriptors should be busy). If you are +writing a server, you should \f(CW\*(C`accept ()\*(C'\fR in a loop to accept as many +connections as possible during one iteration. You might also want to have +a look at \f(CW\*(C`ev_set_io_collect_interval ()\*(C'\fR to increase the amount of +readiness notifications you get per iteration. +.Sp +This backend maps \f(CW\*(C`EV_READ\*(C'\fR to the \f(CW\*(C`readfds\*(C'\fR set and \f(CW\*(C`EV_WRITE\*(C'\fR to the +\&\f(CW\*(C`writefds\*(C'\fR set (and to work around Microsoft Windows bugs, also onto the +\&\f(CW\*(C`exceptfds\*(C'\fR set on that platform). +.ie n .IP """EVBACKEND_POLL"" (value 2, poll backend, available everywhere except on windows)" 4 +.el .IP "\f(CWEVBACKEND_POLL\fR (value 2, poll backend, available everywhere except on windows)" 4 +.IX Item "EVBACKEND_POLL (value 2, poll backend, available everywhere except on windows)" +And this is your standard \fBpoll\fR\|(2) backend. It's more complicated +than select, but handles sparse fds better and has no artificial +limit on the number of fds you can use (except it will slow down +considerably with a lot of inactive fds). It scales similarly to select, +i.e. O(total_fds). See the entry for \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR, above, for +performance tips. +.Sp +This backend maps \f(CW\*(C`EV_READ\*(C'\fR to \f(CW\*(C`POLLIN | POLLERR | POLLHUP\*(C'\fR, and +\&\f(CW\*(C`EV_WRITE\*(C'\fR to \f(CW\*(C`POLLOUT | POLLERR | POLLHUP\*(C'\fR. +.ie n .IP """EVBACKEND_EPOLL"" (value 4, Linux)" 4 +.el .IP "\f(CWEVBACKEND_EPOLL\fR (value 4, Linux)" 4 +.IX Item "EVBACKEND_EPOLL (value 4, Linux)" +Use the Linux-specific \fBepoll\fR\|(7) interface (for both pre\- and post\-2.6.9 +kernels). +.Sp +For few fds, this backend is a bit little slower than poll and select, but +it scales phenomenally better. While poll and select usually scale like +O(total_fds) where total_fds is the total number of fds (or the highest +fd), epoll scales either O(1) or O(active_fds). +.Sp +The epoll mechanism deserves honorable mention as the most misdesigned +of the more advanced event mechanisms: mere annoyances include silently +dropping file descriptors, requiring a system call per change per file +descriptor (and unnecessary guessing of parameters), problems with dup, +returning before the timeout value, resulting in additional iterations +(and only giving 5ms accuracy while select on the same platform gives +0.1ms) and so on. The biggest issue is fork races, however \- if a program +forks then \fIboth\fR parent and child process have to recreate the epoll +set, which can take considerable time (one syscall per file descriptor) +and is of course hard to detect. +.Sp +Epoll is also notoriously buggy \- embedding epoll fds \fIshould\fR work, +but of course \fIdoesn't\fR, and epoll just loves to report events for +totally \fIdifferent\fR file descriptors (even already closed ones, so +one cannot even remove them from the set) than registered in the set +(especially on \s-1SMP\s0 systems). Libev tries to counter these spurious +notifications by employing an additional generation counter and comparing +that against the events to filter out spurious ones, recreating the set +when required. Epoll also erroneously rounds down timeouts, but gives you +no way to know when and by how much, so sometimes you have to busy-wait +because epoll returns immediately despite a nonzero timeout. And last +not least, it also refuses to work with some file descriptors which work +perfectly fine with \f(CW\*(C`select\*(C'\fR (files, many character devices...). +.Sp +Epoll is truly the train wreck among event poll mechanisms, a frankenpoll, +cobbled together in a hurry, no thought to design or interaction with +others. Oh, the pain, will it ever stop... +.Sp +While stopping, setting and starting an I/O watcher in the same iteration +will result in some caching, there is still a system call per such +incident (because the same \fIfile descriptor\fR could point to a different +\&\fIfile description\fR now), so its best to avoid that. Also, \f(CW\*(C`dup ()\*(C'\fR'ed +file descriptors might not work very well if you register events for both +file descriptors. +.Sp +Best performance from this backend is achieved by not unregistering all +watchers for a file descriptor until it has been closed, if possible, +i.e. keep at least one watcher active per fd at all times. Stopping and +starting a watcher (without re-setting it) also usually doesn't cause +extra overhead. A fork can both result in spurious notifications as well +as in libev having to destroy and recreate the epoll object, which can +take considerable time and thus should be avoided. +.Sp +All this means that, in practice, \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR can be as fast or +faster than epoll for maybe up to a hundred file descriptors, depending on +the usage. So sad. +.Sp +While nominally embeddable in other event loops, this feature is broken in +a lot of kernel revisions, but probably(!) works in current versions. +.Sp +This backend maps \f(CW\*(C`EV_READ\*(C'\fR and \f(CW\*(C`EV_WRITE\*(C'\fR in the same way as +\&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR. +.ie n .IP """EVBACKEND_LINUXAIO"" (value 64, Linux)" 4 +.el .IP "\f(CWEVBACKEND_LINUXAIO\fR (value 64, Linux)" 4 +.IX Item "EVBACKEND_LINUXAIO (value 64, Linux)" +Use the Linux-specific Linux \s-1AIO\s0 (\fInot\fR \f(CWaio(7)\fR but \f(CWio_submit(2)\fR) event interface available in post\-4.18 kernels (but libev +only tries to use it in 4.19+). +.Sp +This is another Linux train wreck of an event interface. +.Sp +If this backend works for you (as of this writing, it was very +experimental), it is the best event interface available on Linux and might +be well worth enabling it \- if it isn't available in your kernel this will +be detected and this backend will be skipped. +.Sp +This backend can batch oneshot requests and supports a user-space ring +buffer to receive events. It also doesn't suffer from most of the design +problems of epoll (such as not being able to remove event sources from +the epoll set), and generally sounds too good to be true. Because, this +being the Linux kernel, of course it suffers from a whole new set of +limitations, forcing you to fall back to epoll, inheriting all its design +issues. +.Sp +For one, it is not easily embeddable (but probably could be done using +an event fd at some extra overhead). It also is subject to a system wide +limit that can be configured in \fI/proc/sys/fs/aio\-max\-nr\fR. If no \s-1AIO\s0 +requests are left, this backend will be skipped during initialisation, and +will switch to epoll when the loop is active. +.Sp +Most problematic in practice, however, is that not all file descriptors +work with it. For example, in Linux 5.1, \s-1TCP\s0 sockets, pipes, event fds, +files, \fI/dev/null\fR and many others are supported, but ttys do not work +properly (a known bug that the kernel developers don't care about, see +), so this is not +(yet?) a generic event polling interface. +.Sp +Overall, it seems the Linux developers just don't want it to have a +generic event handling mechanism other than \f(CW\*(C`select\*(C'\fR or \f(CW\*(C`poll\*(C'\fR. +.Sp +To work around all these problem, the current version of libev uses its +epoll backend as a fallback for file descriptor types that do not work. Or +falls back completely to epoll if the kernel acts up. +.Sp +This backend maps \f(CW\*(C`EV_READ\*(C'\fR and \f(CW\*(C`EV_WRITE\*(C'\fR in the same way as +\&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR. +.ie n .IP """EVBACKEND_KQUEUE"" (value 8, most \s-1BSD\s0 clones)" 4 +.el .IP "\f(CWEVBACKEND_KQUEUE\fR (value 8, most \s-1BSD\s0 clones)" 4 +.IX Item "EVBACKEND_KQUEUE (value 8, most BSD clones)" +Kqueue deserves special mention, as at the time this backend was +implemented, it was broken on all BSDs except NetBSD (usually it doesn't +work reliably with anything but sockets and pipes, except on Darwin, +where of course it's completely useless). Unlike epoll, however, whose +brokenness is by design, these kqueue bugs can be (and mostly have been) +fixed without \s-1API\s0 changes to existing programs. For this reason it's not +being \*(L"auto-detected\*(R" on all platforms unless you explicitly specify it +in the flags (i.e. using \f(CW\*(C`EVBACKEND_KQUEUE\*(C'\fR) or libev was compiled on a +known-to-be-good (\-enough) system like NetBSD. +.Sp +You still can embed kqueue into a normal poll or select backend and use it +only for sockets (after having made sure that sockets work with kqueue on +the target platform). See \f(CW\*(C`ev_embed\*(C'\fR watchers for more info. +.Sp +It scales in the same way as the epoll backend, but the interface to the +kernel is more efficient (which says nothing about its actual speed, of +course). While stopping, setting and starting an I/O watcher does never +cause an extra system call as with \f(CW\*(C`EVBACKEND_EPOLL\*(C'\fR, it still adds up to +two event changes per incident. Support for \f(CW\*(C`fork ()\*(C'\fR is very bad (you +might have to leak fds on fork, but it's more sane than epoll) and it +drops fds silently in similarly hard-to-detect cases. +.Sp +This backend usually performs well under most conditions. +.Sp +While nominally embeddable in other event loops, this doesn't work +everywhere, so you might need to test for this. And since it is broken +almost everywhere, you should only use it when you have a lot of sockets +(for which it usually works), by embedding it into another event loop +(e.g. \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR (but \f(CW\*(C`poll\*(C'\fR is of course +also broken on \s-1OS X\s0)) and, did I mention it, using it only for sockets. +.Sp +This backend maps \f(CW\*(C`EV_READ\*(C'\fR into an \f(CW\*(C`EVFILT_READ\*(C'\fR kevent with +\&\f(CW\*(C`NOTE_EOF\*(C'\fR, and \f(CW\*(C`EV_WRITE\*(C'\fR into an \f(CW\*(C`EVFILT_WRITE\*(C'\fR kevent with +\&\f(CW\*(C`NOTE_EOF\*(C'\fR. +.ie n .IP """EVBACKEND_DEVPOLL"" (value 16, Solaris 8)" 4 +.el .IP "\f(CWEVBACKEND_DEVPOLL\fR (value 16, Solaris 8)" 4 +.IX Item "EVBACKEND_DEVPOLL (value 16, Solaris 8)" +This is not implemented yet (and might never be, unless you send me an +implementation). According to reports, \f(CW\*(C`/dev/poll\*(C'\fR only supports sockets +and is not embeddable, which would limit the usefulness of this backend +immensely. +.ie n .IP """EVBACKEND_PORT"" (value 32, Solaris 10)" 4 +.el .IP "\f(CWEVBACKEND_PORT\fR (value 32, Solaris 10)" 4 +.IX Item "EVBACKEND_PORT (value 32, Solaris 10)" +This uses the Solaris 10 event port mechanism. As with everything on Solaris, +it's really slow, but it still scales very well (O(active_fds)). +.Sp +While this backend scales well, it requires one system call per active +file descriptor per loop iteration. For small and medium numbers of file +descriptors a \*(L"slow\*(R" \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR backend +might perform better. +.Sp +On the positive side, this backend actually performed fully to +specification in all tests and is fully embeddable, which is a rare feat +among the OS-specific backends (I vastly prefer correctness over speed +hacks). +.Sp +On the negative side, the interface is \fIbizarre\fR \- so bizarre that +even sun itself gets it wrong in their code examples: The event polling +function sometimes returns events to the caller even though an error +occurred, but with no indication whether it has done so or not (yes, it's +even documented that way) \- deadly for edge-triggered interfaces where you +absolutely have to know whether an event occurred or not because you have +to re-arm the watcher. +.Sp +Fortunately libev seems to be able to work around these idiocies. +.Sp +This backend maps \f(CW\*(C`EV_READ\*(C'\fR and \f(CW\*(C`EV_WRITE\*(C'\fR in the same way as +\&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR. +.ie n .IP """EVBACKEND_ALL""" 4 +.el .IP "\f(CWEVBACKEND_ALL\fR" 4 +.IX Item "EVBACKEND_ALL" +Try all backends (even potentially broken ones that wouldn't be tried +with \f(CW\*(C`EVFLAG_AUTO\*(C'\fR). Since this is a mask, you can do stuff such as +\&\f(CW\*(C`EVBACKEND_ALL & ~EVBACKEND_KQUEUE\*(C'\fR. +.Sp +It is definitely not recommended to use this flag, use whatever +\&\f(CW\*(C`ev_recommended_backends ()\*(C'\fR returns, or simply do not specify a backend +at all. +.ie n .IP """EVBACKEND_MASK""" 4 +.el .IP "\f(CWEVBACKEND_MASK\fR" 4 +.IX Item "EVBACKEND_MASK" +Not a backend at all, but a mask to select all backend bits from a +\&\f(CW\*(C`flags\*(C'\fR value, in case you want to mask out any backends from a flags +value (e.g. when modifying the \f(CW\*(C`LIBEV_FLAGS\*(C'\fR environment variable). +.RE +.RS 4 +.Sp +If one or more of the backend flags are or'ed into the flags value, +then only these backends will be tried (in the reverse order as listed +here). If none are specified, all backends in \f(CW\*(C`ev_recommended_backends +()\*(C'\fR will be tried. +.Sp +Example: Try to create a event loop that uses epoll and nothing else. +.Sp +.Vb 3 +\& struct ev_loop *epoller = ev_loop_new (EVBACKEND_EPOLL | EVFLAG_NOENV); +\& if (!epoller) +\& fatal ("no epoll found here, maybe it hides under your chair"); +.Ve +.Sp +Example: Use whatever libev has to offer, but make sure that kqueue is +used if available. +.Sp +.Vb 1 +\& struct ev_loop *loop = ev_loop_new (ev_recommended_backends () | EVBACKEND_KQUEUE); +.Ve +.Sp +Example: Similarly, on linux, you mgiht want to take advantage of the +linux aio backend if possible, but fall back to something else if that +isn't available. +.Sp +.Vb 1 +\& struct ev_loop *loop = ev_loop_new (ev_recommended_backends () | EVBACKEND_LINUXAIO); +.Ve +.RE +.IP "ev_loop_destroy (loop)" 4 +.IX Item "ev_loop_destroy (loop)" +Destroys an event loop object (frees all memory and kernel state +etc.). None of the active event watchers will be stopped in the normal +sense, so e.g. \f(CW\*(C`ev_is_active\*(C'\fR might still return true. It is your +responsibility to either stop all watchers cleanly yourself \fIbefore\fR +calling this function, or cope with the fact afterwards (which is usually +the easiest thing, you can just ignore the watchers and/or \f(CW\*(C`free ()\*(C'\fR them +for example). +.Sp +Note that certain global state, such as signal state (and installed signal +handlers), will not be freed by this function, and related watchers (such +as signal and child watchers) would need to be stopped manually. +.Sp +This function is normally used on loop objects allocated by +\&\f(CW\*(C`ev_loop_new\*(C'\fR, but it can also be used on the default loop returned by +\&\f(CW\*(C`ev_default_loop\*(C'\fR, in which case it is not thread-safe. +.Sp +Note that it is not advisable to call this function on the default loop +except in the rare occasion where you really need to free its resources. +If you need dynamically allocated loops it is better to use \f(CW\*(C`ev_loop_new\*(C'\fR +and \f(CW\*(C`ev_loop_destroy\*(C'\fR. +.IP "ev_loop_fork (loop)" 4 +.IX Item "ev_loop_fork (loop)" +This function sets a flag that causes subsequent \f(CW\*(C`ev_run\*(C'\fR iterations +to reinitialise the kernel state for backends that have one. Despite +the name, you can call it anytime you are allowed to start or stop +watchers (except inside an \f(CW\*(C`ev_prepare\*(C'\fR callback), but it makes most +sense after forking, in the child process. You \fImust\fR call it (or use +\&\f(CW\*(C`EVFLAG_FORKCHECK\*(C'\fR) in the child before resuming or calling \f(CW\*(C`ev_run\*(C'\fR. +.Sp +In addition, if you want to reuse a loop (via this function or +\&\f(CW\*(C`EVFLAG_FORKCHECK\*(C'\fR), you \fIalso\fR have to ignore \f(CW\*(C`SIGPIPE\*(C'\fR. +.Sp +Again, you \fIhave\fR to call it on \fIany\fR loop that you want to re-use after +a fork, \fIeven if you do not plan to use the loop in the parent\fR. This is +because some kernel interfaces *cough* \fIkqueue\fR *cough* do funny things +during fork. +.Sp +On the other hand, you only need to call this function in the child +process if and only if you want to use the event loop in the child. If +you just fork+exec or create a new loop in the child, you don't have to +call it at all (in fact, \f(CW\*(C`epoll\*(C'\fR is so badly broken that it makes a +difference, but libev will usually detect this case on its own and do a +costly reset of the backend). +.Sp +The function itself is quite fast and it's usually not a problem to call +it just in case after a fork. +.Sp +Example: Automate calling \f(CW\*(C`ev_loop_fork\*(C'\fR on the default loop when +using pthreads. +.Sp +.Vb 5 +\& static void +\& post_fork_child (void) +\& { +\& ev_loop_fork (EV_DEFAULT); +\& } +\& +\& ... +\& pthread_atfork (0, 0, post_fork_child); +.Ve +.IP "int ev_is_default_loop (loop)" 4 +.IX Item "int ev_is_default_loop (loop)" +Returns true when the given loop is, in fact, the default loop, and false +otherwise. +.IP "unsigned int ev_iteration (loop)" 4 +.IX Item "unsigned int ev_iteration (loop)" +Returns the current iteration count for the event loop, which is identical +to the number of times libev did poll for new events. It starts at \f(CW0\fR +and happily wraps around with enough iterations. +.Sp +This value can sometimes be useful as a generation counter of sorts (it +\&\*(L"ticks\*(R" the number of loop iterations), as it roughly corresponds with +\&\f(CW\*(C`ev_prepare\*(C'\fR and \f(CW\*(C`ev_check\*(C'\fR calls \- and is incremented between the +prepare and check phases. +.IP "unsigned int ev_depth (loop)" 4 +.IX Item "unsigned int ev_depth (loop)" +Returns the number of times \f(CW\*(C`ev_run\*(C'\fR was entered minus the number of +times \f(CW\*(C`ev_run\*(C'\fR was exited normally, in other words, the recursion depth. +.Sp +Outside \f(CW\*(C`ev_run\*(C'\fR, this number is zero. In a callback, this number is +\&\f(CW1\fR, unless \f(CW\*(C`ev_run\*(C'\fR was invoked recursively (or from another thread), +in which case it is higher. +.Sp +Leaving \f(CW\*(C`ev_run\*(C'\fR abnormally (setjmp/longjmp, cancelling the thread, +throwing an exception etc.), doesn't count as \*(L"exit\*(R" \- consider this +as a hint to avoid such ungentleman-like behaviour unless it's really +convenient, in which case it is fully supported. +.IP "unsigned int ev_backend (loop)" 4 +.IX Item "unsigned int ev_backend (loop)" +Returns one of the \f(CW\*(C`EVBACKEND_*\*(C'\fR flags indicating the event backend in +use. +.IP "ev_tstamp ev_now (loop)" 4 +.IX Item "ev_tstamp ev_now (loop)" +Returns the current \*(L"event loop time\*(R", which is the time the event loop +received events and started processing them. This timestamp does not +change as long as callbacks are being processed, and this is also the base +time used for relative timers. You can treat it as the timestamp of the +event occurring (or more correctly, libev finding out about it). +.IP "ev_now_update (loop)" 4 +.IX Item "ev_now_update (loop)" +Establishes the current time by querying the kernel, updating the time +returned by \f(CW\*(C`ev_now ()\*(C'\fR in the progress. This is a costly operation and +is usually done automatically within \f(CW\*(C`ev_run ()\*(C'\fR. +.Sp +This function is rarely useful, but when some event callback runs for a +very long time without entering the event loop, updating libev's idea of +the current time is a good idea. +.Sp +See also \*(L"The special problem of time updates\*(R" in the \f(CW\*(C`ev_timer\*(C'\fR section. +.IP "ev_suspend (loop)" 4 +.IX Item "ev_suspend (loop)" +.PD 0 +.IP "ev_resume (loop)" 4 +.IX Item "ev_resume (loop)" +.PD +These two functions suspend and resume an event loop, for use when the +loop is not used for a while and timeouts should not be processed. +.Sp +A typical use case would be an interactive program such as a game: When +the user presses \f(CW\*(C`^Z\*(C'\fR to suspend the game and resumes it an hour later it +would be best to handle timeouts as if no time had actually passed while +the program was suspended. This can be achieved by calling \f(CW\*(C`ev_suspend\*(C'\fR +in your \f(CW\*(C`SIGTSTP\*(C'\fR handler, sending yourself a \f(CW\*(C`SIGSTOP\*(C'\fR and calling +\&\f(CW\*(C`ev_resume\*(C'\fR directly afterwards to resume timer processing. +.Sp +Effectively, all \f(CW\*(C`ev_timer\*(C'\fR watchers will be delayed by the time spend +between \f(CW\*(C`ev_suspend\*(C'\fR and \f(CW\*(C`ev_resume\*(C'\fR, and all \f(CW\*(C`ev_periodic\*(C'\fR watchers +will be rescheduled (that is, they will lose any events that would have +occurred while suspended). +.Sp +After calling \f(CW\*(C`ev_suspend\*(C'\fR you \fBmust not\fR call \fIany\fR function on the +given loop other than \f(CW\*(C`ev_resume\*(C'\fR, and you \fBmust not\fR call \f(CW\*(C`ev_resume\*(C'\fR +without a previous call to \f(CW\*(C`ev_suspend\*(C'\fR. +.Sp +Calling \f(CW\*(C`ev_suspend\*(C'\fR/\f(CW\*(C`ev_resume\*(C'\fR has the side effect of updating the +event loop time (see \f(CW\*(C`ev_now_update\*(C'\fR). +.IP "bool ev_run (loop, int flags)" 4 +.IX Item "bool ev_run (loop, int flags)" +Finally, this is it, the event handler. This function usually is called +after you have initialised all your watchers and you want to start +handling events. It will ask the operating system for any new events, call +the watcher callbacks, and then repeat the whole process indefinitely: This +is why event loops are called \fIloops\fR. +.Sp +If the flags argument is specified as \f(CW0\fR, it will keep handling events +until either no event watchers are active anymore or \f(CW\*(C`ev_break\*(C'\fR was +called. +.Sp +The return value is false if there are no more active watchers (which +usually means \*(L"all jobs done\*(R" or \*(L"deadlock\*(R"), and true in all other cases +(which usually means " you should call \f(CW\*(C`ev_run\*(C'\fR again"). +.Sp +Please note that an explicit \f(CW\*(C`ev_break\*(C'\fR is usually better than +relying on all watchers to be stopped when deciding when a program has +finished (especially in interactive programs), but having a program +that automatically loops as long as it has to and no longer by virtue +of relying on its watchers stopping correctly, that is truly a thing of +beauty. +.Sp +This function is \fImostly\fR exception-safe \- you can break out of a +\&\f(CW\*(C`ev_run\*(C'\fR call by calling \f(CW\*(C`longjmp\*(C'\fR in a callback, throwing a \*(C+ +exception and so on. This does not decrement the \f(CW\*(C`ev_depth\*(C'\fR value, nor +will it clear any outstanding \f(CW\*(C`EVBREAK_ONE\*(C'\fR breaks. +.Sp +A flags value of \f(CW\*(C`EVRUN_NOWAIT\*(C'\fR will look for new events, will handle +those events and any already outstanding ones, but will not wait and +block your process in case there are no events and will return after one +iteration of the loop. This is sometimes useful to poll and handle new +events while doing lengthy calculations, to keep the program responsive. +.Sp +A flags value of \f(CW\*(C`EVRUN_ONCE\*(C'\fR will look for new events (waiting if +necessary) and will handle those and any already outstanding ones. It +will block your process until at least one new event arrives (which could +be an event internal to libev itself, so there is no guarantee that a +user-registered callback will be called), and will return after one +iteration of the loop. +.Sp +This is useful if you are waiting for some external event in conjunction +with something not expressible using other libev watchers (i.e. "roll your +own \f(CW\*(C`ev_run\*(C'\fR"). However, a pair of \f(CW\*(C`ev_prepare\*(C'\fR/\f(CW\*(C`ev_check\*(C'\fR watchers is +usually a better approach for this kind of thing. +.Sp +Here are the gory details of what \f(CW\*(C`ev_run\*(C'\fR does (this is for your +understanding, not a guarantee that things will work exactly like this in +future versions): +.Sp +.Vb 10 +\& \- Increment loop depth. +\& \- Reset the ev_break status. +\& \- Before the first iteration, call any pending watchers. +\& LOOP: +\& \- If EVFLAG_FORKCHECK was used, check for a fork. +\& \- If a fork was detected (by any means), queue and call all fork watchers. +\& \- Queue and call all prepare watchers. +\& \- If ev_break was called, goto FINISH. +\& \- If we have been forked, detach and recreate the kernel state +\& as to not disturb the other process. +\& \- Update the kernel state with all outstanding changes. +\& \- Update the "event loop time" (ev_now ()). +\& \- Calculate for how long to sleep or block, if at all +\& (active idle watchers, EVRUN_NOWAIT or not having +\& any active watchers at all will result in not sleeping). +\& \- Sleep if the I/O and timer collect interval say so. +\& \- Increment loop iteration counter. +\& \- Block the process, waiting for any events. +\& \- Queue all outstanding I/O (fd) events. +\& \- Update the "event loop time" (ev_now ()), and do time jump adjustments. +\& \- Queue all expired timers. +\& \- Queue all expired periodics. +\& \- Queue all idle watchers with priority higher than that of pending events. +\& \- Queue all check watchers. +\& \- Call all queued watchers in reverse order (i.e. check watchers first). +\& Signals and child watchers are implemented as I/O watchers, and will +\& be handled here by queueing them when their watcher gets executed. +\& \- If ev_break has been called, or EVRUN_ONCE or EVRUN_NOWAIT +\& were used, or there are no active watchers, goto FINISH, otherwise +\& continue with step LOOP. +\& FINISH: +\& \- Reset the ev_break status iff it was EVBREAK_ONE. +\& \- Decrement the loop depth. +\& \- Return. +.Ve +.Sp +Example: Queue some jobs and then loop until no events are outstanding +anymore. +.Sp +.Vb 4 +\& ... queue jobs here, make sure they register event watchers as long +\& ... as they still have work to do (even an idle watcher will do..) +\& ev_run (my_loop, 0); +\& ... jobs done or somebody called break. yeah! +.Ve +.IP "ev_break (loop, how)" 4 +.IX Item "ev_break (loop, how)" +Can be used to make a call to \f(CW\*(C`ev_run\*(C'\fR return early (but only after it +has processed all outstanding events). The \f(CW\*(C`how\*(C'\fR argument must be either +\&\f(CW\*(C`EVBREAK_ONE\*(C'\fR, which will make the innermost \f(CW\*(C`ev_run\*(C'\fR call return, or +\&\f(CW\*(C`EVBREAK_ALL\*(C'\fR, which will make all nested \f(CW\*(C`ev_run\*(C'\fR calls return. +.Sp +This \*(L"break state\*(R" will be cleared on the next call to \f(CW\*(C`ev_run\*(C'\fR. +.Sp +It is safe to call \f(CW\*(C`ev_break\*(C'\fR from outside any \f(CW\*(C`ev_run\*(C'\fR calls, too, in +which case it will have no effect. +.IP "ev_ref (loop)" 4 +.IX Item "ev_ref (loop)" +.PD 0 +.IP "ev_unref (loop)" 4 +.IX Item "ev_unref (loop)" +.PD +Ref/unref can be used to add or remove a reference count on the event +loop: Every watcher keeps one reference, and as long as the reference +count is nonzero, \f(CW\*(C`ev_run\*(C'\fR will not return on its own. +.Sp +This is useful when you have a watcher that you never intend to +unregister, but that nevertheless should not keep \f(CW\*(C`ev_run\*(C'\fR from +returning. In such a case, call \f(CW\*(C`ev_unref\*(C'\fR after starting, and \f(CW\*(C`ev_ref\*(C'\fR +before stopping it. +.Sp +As an example, libev itself uses this for its internal signal pipe: It +is not visible to the libev user and should not keep \f(CW\*(C`ev_run\*(C'\fR from +exiting if no event watchers registered by it are active. It is also an +excellent way to do this for generic recurring timers or from within +third-party libraries. Just remember to \fIunref after start\fR and \fIref +before stop\fR (but only if the watcher wasn't active before, or was active +before, respectively. Note also that libev might stop watchers itself +(e.g. non-repeating timers) in which case you have to \f(CW\*(C`ev_ref\*(C'\fR +in the callback). +.Sp +Example: Create a signal watcher, but keep it from keeping \f(CW\*(C`ev_run\*(C'\fR +running when nothing else is active. +.Sp +.Vb 4 +\& ev_signal exitsig; +\& ev_signal_init (&exitsig, sig_cb, SIGINT); +\& ev_signal_start (loop, &exitsig); +\& ev_unref (loop); +.Ve +.Sp +Example: For some weird reason, unregister the above signal handler again. +.Sp +.Vb 2 +\& ev_ref (loop); +\& ev_signal_stop (loop, &exitsig); +.Ve +.IP "ev_set_io_collect_interval (loop, ev_tstamp interval)" 4 +.IX Item "ev_set_io_collect_interval (loop, ev_tstamp interval)" +.PD 0 +.IP "ev_set_timeout_collect_interval (loop, ev_tstamp interval)" 4 +.IX Item "ev_set_timeout_collect_interval (loop, ev_tstamp interval)" +.PD +These advanced functions influence the time that libev will spend waiting +for events. Both time intervals are by default \f(CW0\fR, meaning that libev +will try to invoke timer/periodic callbacks and I/O callbacks with minimum +latency. +.Sp +Setting these to a higher value (the \f(CW\*(C`interval\*(C'\fR \fImust\fR be >= \f(CW0\fR) +allows libev to delay invocation of I/O and timer/periodic callbacks +to increase efficiency of loop iterations (or to increase power-saving +opportunities). +.Sp +The idea is that sometimes your program runs just fast enough to handle +one (or very few) event(s) per loop iteration. While this makes the +program responsive, it also wastes a lot of \s-1CPU\s0 time to poll for new +events, especially with backends like \f(CW\*(C`select ()\*(C'\fR which have a high +overhead for the actual polling but can deliver many events at once. +.Sp +By setting a higher \fIio collect interval\fR you allow libev to spend more +time collecting I/O events, so you can handle more events per iteration, +at the cost of increasing latency. Timeouts (both \f(CW\*(C`ev_periodic\*(C'\fR and +\&\f(CW\*(C`ev_timer\*(C'\fR) will not be affected. Setting this to a non-null value will +introduce an additional \f(CW\*(C`ev_sleep ()\*(C'\fR call into most loop iterations. The +sleep time ensures that libev will not poll for I/O events more often then +once per this interval, on average (as long as the host time resolution is +good enough). +.Sp +Likewise, by setting a higher \fItimeout collect interval\fR you allow libev +to spend more time collecting timeouts, at the expense of increased +latency/jitter/inexactness (the watcher callback will be called +later). \f(CW\*(C`ev_io\*(C'\fR watchers will not be affected. Setting this to a non-null +value will not introduce any overhead in libev. +.Sp +Many (busy) programs can usually benefit by setting the I/O collect +interval to a value near \f(CW0.1\fR or so, which is often enough for +interactive servers (of course not for games), likewise for timeouts. It +usually doesn't make much sense to set it to a lower value than \f(CW0.01\fR, +as this approaches the timing granularity of most systems. Note that if +you do transactions with the outside world and you can't increase the +parallelity, then this setting will limit your transaction rate (if you +need to poll once per transaction and the I/O collect interval is 0.01, +then you can't do more than 100 transactions per second). +.Sp +Setting the \fItimeout collect interval\fR can improve the opportunity for +saving power, as the program will \*(L"bundle\*(R" timer callback invocations that +are \*(L"near\*(R" in time together, by delaying some, thus reducing the number of +times the process sleeps and wakes up again. Another useful technique to +reduce iterations/wake\-ups is to use \f(CW\*(C`ev_periodic\*(C'\fR watchers and make sure +they fire on, say, one-second boundaries only. +.Sp +Example: we only need 0.1s timeout granularity, and we wish not to poll +more often than 100 times per second: +.Sp +.Vb 2 +\& ev_set_timeout_collect_interval (EV_DEFAULT_UC_ 0.1); +\& ev_set_io_collect_interval (EV_DEFAULT_UC_ 0.01); +.Ve +.IP "ev_invoke_pending (loop)" 4 +.IX Item "ev_invoke_pending (loop)" +This call will simply invoke all pending watchers while resetting their +pending state. Normally, \f(CW\*(C`ev_run\*(C'\fR does this automatically when required, +but when overriding the invoke callback this call comes handy. This +function can be invoked from a watcher \- this can be useful for example +when you want to do some lengthy calculation and want to pass further +event handling to another thread (you still have to make sure only one +thread executes within \f(CW\*(C`ev_invoke_pending\*(C'\fR or \f(CW\*(C`ev_run\*(C'\fR of course). +.IP "int ev_pending_count (loop)" 4 +.IX Item "int ev_pending_count (loop)" +Returns the number of pending watchers \- zero indicates that no watchers +are pending. +.IP "ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(\s-1EV_P\s0))" 4 +.IX Item "ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(EV_P))" +This overrides the invoke pending functionality of the loop: Instead of +invoking all pending watchers when there are any, \f(CW\*(C`ev_run\*(C'\fR will call +this callback instead. This is useful, for example, when you want to +invoke the actual watchers inside another context (another thread etc.). +.Sp +If you want to reset the callback, use \f(CW\*(C`ev_invoke_pending\*(C'\fR as new +callback. +.IP "ev_set_loop_release_cb (loop, void (*release)(\s-1EV_P\s0) throw (), void (*acquire)(\s-1EV_P\s0) throw ())" 4 +.IX Item "ev_set_loop_release_cb (loop, void (*release)(EV_P) throw (), void (*acquire)(EV_P) throw ())" +Sometimes you want to share the same loop between multiple threads. This +can be done relatively simply by putting mutex_lock/unlock calls around +each call to a libev function. +.Sp +However, \f(CW\*(C`ev_run\*(C'\fR can run an indefinite time, so it is not feasible +to wait for it to return. One way around this is to wake up the event +loop via \f(CW\*(C`ev_break\*(C'\fR and \f(CW\*(C`ev_async_send\*(C'\fR, another way is to set these +\&\fIrelease\fR and \fIacquire\fR callbacks on the loop. +.Sp +When set, then \f(CW\*(C`release\*(C'\fR will be called just before the thread is +suspended waiting for new events, and \f(CW\*(C`acquire\*(C'\fR is called just +afterwards. +.Sp +Ideally, \f(CW\*(C`release\*(C'\fR will just call your mutex_unlock function, and +\&\f(CW\*(C`acquire\*(C'\fR will just call the mutex_lock function again. +.Sp +While event loop modifications are allowed between invocations of +\&\f(CW\*(C`release\*(C'\fR and \f(CW\*(C`acquire\*(C'\fR (that's their only purpose after all), no +modifications done will affect the event loop, i.e. adding watchers will +have no effect on the set of file descriptors being watched, or the time +waited. Use an \f(CW\*(C`ev_async\*(C'\fR watcher to wake up \f(CW\*(C`ev_run\*(C'\fR when you want it +to take note of any changes you made. +.Sp +In theory, threads executing \f(CW\*(C`ev_run\*(C'\fR will be async-cancel safe between +invocations of \f(CW\*(C`release\*(C'\fR and \f(CW\*(C`acquire\*(C'\fR. +.Sp +See also the locking example in the \f(CW\*(C`THREADS\*(C'\fR section later in this +document. +.IP "ev_set_userdata (loop, void *data)" 4 +.IX Item "ev_set_userdata (loop, void *data)" +.PD 0 +.IP "void *ev_userdata (loop)" 4 +.IX Item "void *ev_userdata (loop)" +.PD +Set and retrieve a single \f(CW\*(C`void *\*(C'\fR associated with a loop. When +\&\f(CW\*(C`ev_set_userdata\*(C'\fR has never been called, then \f(CW\*(C`ev_userdata\*(C'\fR returns +\&\f(CW0\fR. +.Sp +These two functions can be used to associate arbitrary data with a loop, +and are intended solely for the \f(CW\*(C`invoke_pending_cb\*(C'\fR, \f(CW\*(C`release\*(C'\fR and +\&\f(CW\*(C`acquire\*(C'\fR callbacks described above, but of course can be (ab\-)used for +any other purpose as well. +.IP "ev_verify (loop)" 4 +.IX Item "ev_verify (loop)" +This function only does something when \f(CW\*(C`EV_VERIFY\*(C'\fR support has been +compiled in, which is the default for non-minimal builds. It tries to go +through all internal structures and checks them for validity. If anything +is found to be inconsistent, it will print an error message to standard +error and call \f(CW\*(C`abort ()\*(C'\fR. +.Sp +This can be used to catch bugs inside libev itself: under normal +circumstances, this function will never abort as of course libev keeps its +data structures consistent. +.SH "ANATOMY OF A WATCHER" +.IX Header "ANATOMY OF A WATCHER" +In the following description, uppercase \f(CW\*(C`TYPE\*(C'\fR in names stands for the +watcher type, e.g. \f(CW\*(C`ev_TYPE_start\*(C'\fR can mean \f(CW\*(C`ev_timer_start\*(C'\fR for timer +watchers and \f(CW\*(C`ev_io_start\*(C'\fR for I/O watchers. +.PP +A watcher is an opaque structure that you allocate and register to record +your interest in some event. To make a concrete example, imagine you want +to wait for \s-1STDIN\s0 to become readable, you would create an \f(CW\*(C`ev_io\*(C'\fR watcher +for that: +.PP +.Vb 5 +\& static void my_cb (struct ev_loop *loop, ev_io *w, int revents) +\& { +\& ev_io_stop (w); +\& ev_break (loop, EVBREAK_ALL); +\& } +\& +\& struct ev_loop *loop = ev_default_loop (0); +\& +\& ev_io stdin_watcher; +\& +\& ev_init (&stdin_watcher, my_cb); +\& ev_io_set (&stdin_watcher, STDIN_FILENO, EV_READ); +\& ev_io_start (loop, &stdin_watcher); +\& +\& ev_run (loop, 0); +.Ve +.PP +As you can see, you are responsible for allocating the memory for your +watcher structures (and it is \fIusually\fR a bad idea to do this on the +stack). +.PP +Each watcher has an associated watcher structure (called \f(CW\*(C`struct ev_TYPE\*(C'\fR +or simply \f(CW\*(C`ev_TYPE\*(C'\fR, as typedefs are provided for all watcher structs). +.PP +Each watcher structure must be initialised by a call to \f(CW\*(C`ev_init (watcher +*, callback)\*(C'\fR, which expects a callback to be provided. This callback is +invoked each time the event occurs (or, in the case of I/O watchers, each +time the event loop detects that the file descriptor given is readable +and/or writable). +.PP +Each watcher type further has its own \f(CW\*(C`ev_TYPE_set (watcher *, ...)\*(C'\fR +macro to configure it, with arguments specific to the watcher type. There +is also a macro to combine initialisation and setting in one call: \f(CW\*(C`ev_TYPE_init (watcher *, callback, ...)\*(C'\fR. +.PP +To make the watcher actually watch out for events, you have to start it +with a watcher-specific start function (\f(CW\*(C`ev_TYPE_start (loop, watcher +*)\*(C'\fR), and you can stop watching for events at any time by calling the +corresponding stop function (\f(CW\*(C`ev_TYPE_stop (loop, watcher *)\*(C'\fR. +.PP +As long as your watcher is active (has been started but not stopped) you +must not touch the values stored in it except when explicitly documented +otherwise. Most specifically you must never reinitialise it or call its +\&\f(CW\*(C`ev_TYPE_set\*(C'\fR macro. +.PP +Each and every callback receives the event loop pointer as first, the +registered watcher structure as second, and a bitset of received events as +third argument. +.PP +The received events usually include a single bit per event type received +(you can receive multiple events at the same time). The possible bit masks +are: +.ie n .IP """EV_READ""" 4 +.el .IP "\f(CWEV_READ\fR" 4 +.IX Item "EV_READ" +.PD 0 +.ie n .IP """EV_WRITE""" 4 +.el .IP "\f(CWEV_WRITE\fR" 4 +.IX Item "EV_WRITE" +.PD +The file descriptor in the \f(CW\*(C`ev_io\*(C'\fR watcher has become readable and/or +writable. +.ie n .IP """EV_TIMER""" 4 +.el .IP "\f(CWEV_TIMER\fR" 4 +.IX Item "EV_TIMER" +The \f(CW\*(C`ev_timer\*(C'\fR watcher has timed out. +.ie n .IP """EV_PERIODIC""" 4 +.el .IP "\f(CWEV_PERIODIC\fR" 4 +.IX Item "EV_PERIODIC" +The \f(CW\*(C`ev_periodic\*(C'\fR watcher has timed out. +.ie n .IP """EV_SIGNAL""" 4 +.el .IP "\f(CWEV_SIGNAL\fR" 4 +.IX Item "EV_SIGNAL" +The signal specified in the \f(CW\*(C`ev_signal\*(C'\fR watcher has been received by a thread. +.ie n .IP """EV_CHILD""" 4 +.el .IP "\f(CWEV_CHILD\fR" 4 +.IX Item "EV_CHILD" +The pid specified in the \f(CW\*(C`ev_child\*(C'\fR watcher has received a status change. +.ie n .IP """EV_STAT""" 4 +.el .IP "\f(CWEV_STAT\fR" 4 +.IX Item "EV_STAT" +The path specified in the \f(CW\*(C`ev_stat\*(C'\fR watcher changed its attributes somehow. +.ie n .IP """EV_IDLE""" 4 +.el .IP "\f(CWEV_IDLE\fR" 4 +.IX Item "EV_IDLE" +The \f(CW\*(C`ev_idle\*(C'\fR watcher has determined that you have nothing better to do. +.ie n .IP """EV_PREPARE""" 4 +.el .IP "\f(CWEV_PREPARE\fR" 4 +.IX Item "EV_PREPARE" +.PD 0 +.ie n .IP """EV_CHECK""" 4 +.el .IP "\f(CWEV_CHECK\fR" 4 +.IX Item "EV_CHECK" +.PD +All \f(CW\*(C`ev_prepare\*(C'\fR watchers are invoked just \fIbefore\fR \f(CW\*(C`ev_run\*(C'\fR starts to +gather new events, and all \f(CW\*(C`ev_check\*(C'\fR watchers are queued (not invoked) +just after \f(CW\*(C`ev_run\*(C'\fR has gathered them, but before it queues any callbacks +for any received events. That means \f(CW\*(C`ev_prepare\*(C'\fR watchers are the last +watchers invoked before the event loop sleeps or polls for new events, and +\&\f(CW\*(C`ev_check\*(C'\fR watchers will be invoked before any other watchers of the same +or lower priority within an event loop iteration. +.Sp +Callbacks of both watcher types can start and stop as many watchers as +they want, and all of them will be taken into account (for example, a +\&\f(CW\*(C`ev_prepare\*(C'\fR watcher might start an idle watcher to keep \f(CW\*(C`ev_run\*(C'\fR from +blocking). +.ie n .IP """EV_EMBED""" 4 +.el .IP "\f(CWEV_EMBED\fR" 4 +.IX Item "EV_EMBED" +The embedded event loop specified in the \f(CW\*(C`ev_embed\*(C'\fR watcher needs attention. +.ie n .IP """EV_FORK""" 4 +.el .IP "\f(CWEV_FORK\fR" 4 +.IX Item "EV_FORK" +The event loop has been resumed in the child process after fork (see +\&\f(CW\*(C`ev_fork\*(C'\fR). +.ie n .IP """EV_CLEANUP""" 4 +.el .IP "\f(CWEV_CLEANUP\fR" 4 +.IX Item "EV_CLEANUP" +The event loop is about to be destroyed (see \f(CW\*(C`ev_cleanup\*(C'\fR). +.ie n .IP """EV_ASYNC""" 4 +.el .IP "\f(CWEV_ASYNC\fR" 4 +.IX Item "EV_ASYNC" +The given async watcher has been asynchronously notified (see \f(CW\*(C`ev_async\*(C'\fR). +.ie n .IP """EV_CUSTOM""" 4 +.el .IP "\f(CWEV_CUSTOM\fR" 4 +.IX Item "EV_CUSTOM" +Not ever sent (or otherwise used) by libev itself, but can be freely used +by libev users to signal watchers (e.g. via \f(CW\*(C`ev_feed_event\*(C'\fR). +.ie n .IP """EV_ERROR""" 4 +.el .IP "\f(CWEV_ERROR\fR" 4 +.IX Item "EV_ERROR" +An unspecified error has occurred, the watcher has been stopped. This might +happen because the watcher could not be properly started because libev +ran out of memory, a file descriptor was found to be closed or any other +problem. Libev considers these application bugs. +.Sp +You best act on it by reporting the problem and somehow coping with the +watcher being stopped. Note that well-written programs should not receive +an error ever, so when your watcher receives it, this usually indicates a +bug in your program. +.Sp +Libev will usually signal a few \*(L"dummy\*(R" events together with an error, for +example it might indicate that a fd is readable or writable, and if your +callbacks is well-written it can just attempt the operation and cope with +the error from \fBread()\fR or \fBwrite()\fR. This will not work in multi-threaded +programs, though, as the fd could already be closed and reused for another +thing, so beware. +.SS "\s-1GENERIC WATCHER FUNCTIONS\s0" +.IX Subsection "GENERIC WATCHER FUNCTIONS" +.ie n .IP """ev_init"" (ev_TYPE *watcher, callback)" 4 +.el .IP "\f(CWev_init\fR (ev_TYPE *watcher, callback)" 4 +.IX Item "ev_init (ev_TYPE *watcher, callback)" +This macro initialises the generic portion of a watcher. The contents +of the watcher object can be arbitrary (so \f(CW\*(C`malloc\*(C'\fR will do). Only +the generic parts of the watcher are initialised, you \fIneed\fR to call +the type-specific \f(CW\*(C`ev_TYPE_set\*(C'\fR macro afterwards to initialise the +type-specific parts. For each type there is also a \f(CW\*(C`ev_TYPE_init\*(C'\fR macro +which rolls both calls into one. +.Sp +You can reinitialise a watcher at any time as long as it has been stopped +(or never started) and there are no pending events outstanding. +.Sp +The callback is always of type \f(CW\*(C`void (*)(struct ev_loop *loop, ev_TYPE *watcher, +int revents)\*(C'\fR. +.Sp +Example: Initialise an \f(CW\*(C`ev_io\*(C'\fR watcher in two steps. +.Sp +.Vb 3 +\& ev_io w; +\& ev_init (&w, my_cb); +\& ev_io_set (&w, STDIN_FILENO, EV_READ); +.Ve +.ie n .IP """ev_TYPE_set"" (ev_TYPE *watcher, [args])" 4 +.el .IP "\f(CWev_TYPE_set\fR (ev_TYPE *watcher, [args])" 4 +.IX Item "ev_TYPE_set (ev_TYPE *watcher, [args])" +This macro initialises the type-specific parts of a watcher. You need to +call \f(CW\*(C`ev_init\*(C'\fR at least once before you call this macro, but you can +call \f(CW\*(C`ev_TYPE_set\*(C'\fR any number of times. You must not, however, call this +macro on a watcher that is active (it can be pending, however, which is a +difference to the \f(CW\*(C`ev_init\*(C'\fR macro). +.Sp +Although some watcher types do not have type-specific arguments +(e.g. \f(CW\*(C`ev_prepare\*(C'\fR) you still need to call its \f(CW\*(C`set\*(C'\fR macro. +.Sp +See \f(CW\*(C`ev_init\*(C'\fR, above, for an example. +.ie n .IP """ev_TYPE_init"" (ev_TYPE *watcher, callback, [args])" 4 +.el .IP "\f(CWev_TYPE_init\fR (ev_TYPE *watcher, callback, [args])" 4 +.IX Item "ev_TYPE_init (ev_TYPE *watcher, callback, [args])" +This convenience macro rolls both \f(CW\*(C`ev_init\*(C'\fR and \f(CW\*(C`ev_TYPE_set\*(C'\fR macro +calls into a single call. This is the most convenient method to initialise +a watcher. The same limitations apply, of course. +.Sp +Example: Initialise and set an \f(CW\*(C`ev_io\*(C'\fR watcher in one step. +.Sp +.Vb 1 +\& ev_io_init (&w, my_cb, STDIN_FILENO, EV_READ); +.Ve +.ie n .IP """ev_TYPE_start"" (loop, ev_TYPE *watcher)" 4 +.el .IP "\f(CWev_TYPE_start\fR (loop, ev_TYPE *watcher)" 4 +.IX Item "ev_TYPE_start (loop, ev_TYPE *watcher)" +Starts (activates) the given watcher. Only active watchers will receive +events. If the watcher is already active nothing will happen. +.Sp +Example: Start the \f(CW\*(C`ev_io\*(C'\fR watcher that is being abused as example in this +whole section. +.Sp +.Vb 1 +\& ev_io_start (EV_DEFAULT_UC, &w); +.Ve +.ie n .IP """ev_TYPE_stop"" (loop, ev_TYPE *watcher)" 4 +.el .IP "\f(CWev_TYPE_stop\fR (loop, ev_TYPE *watcher)" 4 +.IX Item "ev_TYPE_stop (loop, ev_TYPE *watcher)" +Stops the given watcher if active, and clears the pending status (whether +the watcher was active or not). +.Sp +It is possible that stopped watchers are pending \- for example, +non-repeating timers are being stopped when they become pending \- but +calling \f(CW\*(C`ev_TYPE_stop\*(C'\fR ensures that the watcher is neither active nor +pending. If you want to free or reuse the memory used by the watcher it is +therefore a good idea to always call its \f(CW\*(C`ev_TYPE_stop\*(C'\fR function. +.IP "bool ev_is_active (ev_TYPE *watcher)" 4 +.IX Item "bool ev_is_active (ev_TYPE *watcher)" +Returns a true value iff the watcher is active (i.e. it has been started +and not yet been stopped). As long as a watcher is active you must not modify +it. +.IP "bool ev_is_pending (ev_TYPE *watcher)" 4 +.IX Item "bool ev_is_pending (ev_TYPE *watcher)" +Returns a true value iff the watcher is pending, (i.e. it has outstanding +events but its callback has not yet been invoked). As long as a watcher +is pending (but not active) you must not call an init function on it (but +\&\f(CW\*(C`ev_TYPE_set\*(C'\fR is safe), you must not change its priority, and you must +make sure the watcher is available to libev (e.g. you cannot \f(CW\*(C`free ()\*(C'\fR +it). +.IP "callback ev_cb (ev_TYPE *watcher)" 4 +.IX Item "callback ev_cb (ev_TYPE *watcher)" +Returns the callback currently set on the watcher. +.IP "ev_set_cb (ev_TYPE *watcher, callback)" 4 +.IX Item "ev_set_cb (ev_TYPE *watcher, callback)" +Change the callback. You can change the callback at virtually any time +(modulo threads). +.IP "ev_set_priority (ev_TYPE *watcher, int priority)" 4 +.IX Item "ev_set_priority (ev_TYPE *watcher, int priority)" +.PD 0 +.IP "int ev_priority (ev_TYPE *watcher)" 4 +.IX Item "int ev_priority (ev_TYPE *watcher)" +.PD +Set and query the priority of the watcher. The priority is a small +integer between \f(CW\*(C`EV_MAXPRI\*(C'\fR (default: \f(CW2\fR) and \f(CW\*(C`EV_MINPRI\*(C'\fR +(default: \f(CW\*(C`\-2\*(C'\fR). Pending watchers with higher priority will be invoked +before watchers with lower priority, but priority will not keep watchers +from being executed (except for \f(CW\*(C`ev_idle\*(C'\fR watchers). +.Sp +If you need to suppress invocation when higher priority events are pending +you need to look at \f(CW\*(C`ev_idle\*(C'\fR watchers, which provide this functionality. +.Sp +You \fImust not\fR change the priority of a watcher as long as it is active or +pending. +.Sp +Setting a priority outside the range of \f(CW\*(C`EV_MINPRI\*(C'\fR to \f(CW\*(C`EV_MAXPRI\*(C'\fR is +fine, as long as you do not mind that the priority value you query might +or might not have been clamped to the valid range. +.Sp +The default priority used by watchers when no priority has been set is +always \f(CW0\fR, which is supposed to not be too high and not be too low :). +.Sp +See \*(L"\s-1WATCHER PRIORITY MODELS\*(R"\s0, below, for a more thorough treatment of +priorities. +.IP "ev_invoke (loop, ev_TYPE *watcher, int revents)" 4 +.IX Item "ev_invoke (loop, ev_TYPE *watcher, int revents)" +Invoke the \f(CW\*(C`watcher\*(C'\fR with the given \f(CW\*(C`loop\*(C'\fR and \f(CW\*(C`revents\*(C'\fR. Neither +\&\f(CW\*(C`loop\*(C'\fR nor \f(CW\*(C`revents\*(C'\fR need to be valid as long as the watcher callback +can deal with that fact, as both are simply passed through to the +callback. +.IP "int ev_clear_pending (loop, ev_TYPE *watcher)" 4 +.IX Item "int ev_clear_pending (loop, ev_TYPE *watcher)" +If the watcher is pending, this function clears its pending status and +returns its \f(CW\*(C`revents\*(C'\fR bitset (as if its callback was invoked). If the +watcher isn't pending it does nothing and returns \f(CW0\fR. +.Sp +Sometimes it can be useful to \*(L"poll\*(R" a watcher instead of waiting for its +callback to be invoked, which can be accomplished with this function. +.IP "ev_feed_event (loop, ev_TYPE *watcher, int revents)" 4 +.IX Item "ev_feed_event (loop, ev_TYPE *watcher, int revents)" +Feeds the given event set into the event loop, as if the specified event +had happened for the specified watcher (which must be a pointer to an +initialised but not necessarily started event watcher). Obviously you must +not free the watcher as long as it has pending events. +.Sp +Stopping the watcher, letting libev invoke it, or calling +\&\f(CW\*(C`ev_clear_pending\*(C'\fR will clear the pending event, even if the watcher was +not started in the first place. +.Sp +See also \f(CW\*(C`ev_feed_fd_event\*(C'\fR and \f(CW\*(C`ev_feed_signal_event\*(C'\fR for related +functions that do not need a watcher. +.PP +See also the \*(L"\s-1ASSOCIATING CUSTOM DATA WITH A WATCHER\*(R"\s0 and \*(L"\s-1BUILDING YOUR +OWN COMPOSITE WATCHERS\*(R"\s0 idioms. +.SS "\s-1WATCHER STATES\s0" +.IX Subsection "WATCHER STATES" +There are various watcher states mentioned throughout this manual \- +active, pending and so on. In this section these states and the rules to +transition between them will be described in more detail \- and while these +rules might look complicated, they usually do \*(L"the right thing\*(R". +.IP "initialised" 4 +.IX Item "initialised" +Before a watcher can be registered with the event loop it has to be +initialised. This can be done with a call to \f(CW\*(C`ev_TYPE_init\*(C'\fR, or calls to +\&\f(CW\*(C`ev_init\*(C'\fR followed by the watcher-specific \f(CW\*(C`ev_TYPE_set\*(C'\fR function. +.Sp +In this state it is simply some block of memory that is suitable for +use in an event loop. It can be moved around, freed, reused etc. at +will \- as long as you either keep the memory contents intact, or call +\&\f(CW\*(C`ev_TYPE_init\*(C'\fR again. +.IP "started/running/active" 4 +.IX Item "started/running/active" +Once a watcher has been started with a call to \f(CW\*(C`ev_TYPE_start\*(C'\fR it becomes +property of the event loop, and is actively waiting for events. While in +this state it cannot be accessed (except in a few documented ways), moved, +freed or anything else \- the only legal thing is to keep a pointer to it, +and call libev functions on it that are documented to work on active watchers. +.IP "pending" 4 +.IX Item "pending" +If a watcher is active and libev determines that an event it is interested +in has occurred (such as a timer expiring), it will become pending. It will +stay in this pending state until either it is stopped or its callback is +about to be invoked, so it is not normally pending inside the watcher +callback. +.Sp +The watcher might or might not be active while it is pending (for example, +an expired non-repeating timer can be pending but no longer active). If it +is stopped, it can be freely accessed (e.g. by calling \f(CW\*(C`ev_TYPE_set\*(C'\fR), +but it is still property of the event loop at this time, so cannot be +moved, freed or reused. And if it is active the rules described in the +previous item still apply. +.Sp +It is also possible to feed an event on a watcher that is not active (e.g. +via \f(CW\*(C`ev_feed_event\*(C'\fR), in which case it becomes pending without being +active. +.IP "stopped" 4 +.IX Item "stopped" +A watcher can be stopped implicitly by libev (in which case it might still +be pending), or explicitly by calling its \f(CW\*(C`ev_TYPE_stop\*(C'\fR function. The +latter will clear any pending state the watcher might be in, regardless +of whether it was active or not, so stopping a watcher explicitly before +freeing it is often a good idea. +.Sp +While stopped (and not pending) the watcher is essentially in the +initialised state, that is, it can be reused, moved, modified in any way +you wish (but when you trash the memory block, you need to \f(CW\*(C`ev_TYPE_init\*(C'\fR +it again). +.SS "\s-1WATCHER PRIORITY MODELS\s0" +.IX Subsection "WATCHER PRIORITY MODELS" +Many event loops support \fIwatcher priorities\fR, which are usually small +integers that influence the ordering of event callback invocation +between watchers in some way, all else being equal. +.PP +In libev, watcher priorities can be set using \f(CW\*(C`ev_set_priority\*(C'\fR. See its +description for the more technical details such as the actual priority +range. +.PP +There are two common ways how these these priorities are being interpreted +by event loops: +.PP +In the more common lock-out model, higher priorities \*(L"lock out\*(R" invocation +of lower priority watchers, which means as long as higher priority +watchers receive events, lower priority watchers are not being invoked. +.PP +The less common only-for-ordering model uses priorities solely to order +callback invocation within a single event loop iteration: Higher priority +watchers are invoked before lower priority ones, but they all get invoked +before polling for new events. +.PP +Libev uses the second (only-for-ordering) model for all its watchers +except for idle watchers (which use the lock-out model). +.PP +The rationale behind this is that implementing the lock-out model for +watchers is not well supported by most kernel interfaces, and most event +libraries will just poll for the same events again and again as long as +their callbacks have not been executed, which is very inefficient in the +common case of one high-priority watcher locking out a mass of lower +priority ones. +.PP +Static (ordering) priorities are most useful when you have two or more +watchers handling the same resource: a typical usage example is having an +\&\f(CW\*(C`ev_io\*(C'\fR watcher to receive data, and an associated \f(CW\*(C`ev_timer\*(C'\fR to handle +timeouts. Under load, data might be received while the program handles +other jobs, but since timers normally get invoked first, the timeout +handler will be executed before checking for data. In that case, giving +the timer a lower priority than the I/O watcher ensures that I/O will be +handled first even under adverse conditions (which is usually, but not +always, what you want). +.PP +Since idle watchers use the \*(L"lock-out\*(R" model, meaning that idle watchers +will only be executed when no same or higher priority watchers have +received events, they can be used to implement the \*(L"lock-out\*(R" model when +required. +.PP +For example, to emulate how many other event libraries handle priorities, +you can associate an \f(CW\*(C`ev_idle\*(C'\fR watcher to each such watcher, and in +the normal watcher callback, you just start the idle watcher. The real +processing is done in the idle watcher callback. This causes libev to +continuously poll and process kernel event data for the watcher, but when +the lock-out case is known to be rare (which in turn is rare :), this is +workable. +.PP +Usually, however, the lock-out model implemented that way will perform +miserably under the type of load it was designed to handle. In that case, +it might be preferable to stop the real watcher before starting the +idle watcher, so the kernel will not have to process the event in case +the actual processing will be delayed for considerable time. +.PP +Here is an example of an I/O watcher that should run at a strictly lower +priority than the default, and which should only process data when no +other events are pending: +.PP +.Vb 2 +\& ev_idle idle; // actual processing watcher +\& ev_io io; // actual event watcher +\& +\& static void +\& io_cb (EV_P_ ev_io *w, int revents) +\& { +\& // stop the I/O watcher, we received the event, but +\& // are not yet ready to handle it. +\& ev_io_stop (EV_A_ w); +\& +\& // start the idle watcher to handle the actual event. +\& // it will not be executed as long as other watchers +\& // with the default priority are receiving events. +\& ev_idle_start (EV_A_ &idle); +\& } +\& +\& static void +\& idle_cb (EV_P_ ev_idle *w, int revents) +\& { +\& // actual processing +\& read (STDIN_FILENO, ...); +\& +\& // have to start the I/O watcher again, as +\& // we have handled the event +\& ev_io_start (EV_P_ &io); +\& } +\& +\& // initialisation +\& ev_idle_init (&idle, idle_cb); +\& ev_io_init (&io, io_cb, STDIN_FILENO, EV_READ); +\& ev_io_start (EV_DEFAULT_ &io); +.Ve +.PP +In the \*(L"real\*(R" world, it might also be beneficial to start a timer, so that +low-priority connections can not be locked out forever under load. This +enables your program to keep a lower latency for important connections +during short periods of high load, while not completely locking out less +important ones. +.SH "WATCHER TYPES" +.IX Header "WATCHER TYPES" +This section describes each watcher in detail, but will not repeat +information given in the last section. Any initialisation/set macros, +functions and members specific to the watcher type are explained. +.PP +Most members are additionally marked with either \fI[read\-only]\fR, meaning +that, while the watcher is active, you can look at the member and expect +some sensible content, but you must not modify it (you can modify it while +the watcher is stopped to your hearts content), or \fI[read\-write]\fR, which +means you can expect it to have some sensible content while the watcher is +active, but you can also modify it (within the same thread as the event +loop, i.e. without creating data races). Modifying it may not do something +sensible or take immediate effect (or do anything at all), but libev will +not crash or malfunction in any way. +.PP +In any case, the documentation for each member will explain what the +effects are, and if there are any additional access restrictions. +.ie n .SS """ev_io"" \- is this file descriptor readable or writable?" +.el .SS "\f(CWev_io\fP \- is this file descriptor readable or writable?" +.IX Subsection "ev_io - is this file descriptor readable or writable?" +I/O watchers check whether a file descriptor is readable or writable +in each iteration of the event loop, or, more precisely, when reading +would not block the process and writing would at least be able to write +some data. This behaviour is called level-triggering because you keep +receiving events as long as the condition persists. Remember you can stop +the watcher if you don't want to act on the event and neither want to +receive future events. +.PP +In general you can register as many read and/or write event watchers per +fd as you want (as long as you don't confuse yourself). Setting all file +descriptors to non-blocking mode is also usually a good idea (but not +required if you know what you are doing). +.PP +Another thing you have to watch out for is that it is quite easy to +receive \*(L"spurious\*(R" readiness notifications, that is, your callback might +be called with \f(CW\*(C`EV_READ\*(C'\fR but a subsequent \f(CW\*(C`read\*(C'\fR(2) will actually block +because there is no data. It is very easy to get into this situation even +with a relatively standard program structure. Thus it is best to always +use non-blocking I/O: An extra \f(CW\*(C`read\*(C'\fR(2) returning \f(CW\*(C`EAGAIN\*(C'\fR is far +preferable to a program hanging until some data arrives. +.PP +If you cannot run the fd in non-blocking mode (for example you should +not play around with an Xlib connection), then you have to separately +re-test whether a file descriptor is really ready with a known-to-be good +interface such as poll (fortunately in the case of Xlib, it already does +this on its own, so its quite safe to use). Some people additionally +use \f(CW\*(C`SIGALRM\*(C'\fR and an interval timer, just to be sure you won't block +indefinitely. +.PP +But really, best use non-blocking mode. +.PP +\fIThe special problem of disappearing file descriptors\fR +.IX Subsection "The special problem of disappearing file descriptors" +.PP +Some backends (e.g. kqueue, epoll, linuxaio) need to be told about closing +a file descriptor (either due to calling \f(CW\*(C`close\*(C'\fR explicitly or any other +means, such as \f(CW\*(C`dup2\*(C'\fR). The reason is that you register interest in some +file descriptor, but when it goes away, the operating system will silently +drop this interest. If another file descriptor with the same number then +is registered with libev, there is no efficient way to see that this is, +in fact, a different file descriptor. +.PP +To avoid having to explicitly tell libev about such cases, libev follows +the following policy: Each time \f(CW\*(C`ev_io_set\*(C'\fR is being called, libev +will assume that this is potentially a new file descriptor, otherwise +it is assumed that the file descriptor stays the same. That means that +you \fIhave\fR to call \f(CW\*(C`ev_io_set\*(C'\fR (or \f(CW\*(C`ev_io_init\*(C'\fR) when you change the +descriptor even if the file descriptor number itself did not change. +.PP +This is how one would do it normally anyway, the important point is that +the libev application should not optimise around libev but should leave +optimisations to libev. +.PP +\fIThe special problem of dup'ed file descriptors\fR +.IX Subsection "The special problem of dup'ed file descriptors" +.PP +Some backends (e.g. epoll), cannot register events for file descriptors, +but only events for the underlying file descriptions. That means when you +have \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors or weirder constellations, and register +events for them, only one file descriptor might actually receive events. +.PP +There is no workaround possible except not registering events +for potentially \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors, or to resort to +\&\f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR. +.PP +\fIThe special problem of files\fR +.IX Subsection "The special problem of files" +.PP +Many people try to use \f(CW\*(C`select\*(C'\fR (or libev) on file descriptors +representing files, and expect it to become ready when their program +doesn't block on disk accesses (which can take a long time on their own). +.PP +However, this cannot ever work in the \*(L"expected\*(R" way \- you get a readiness +notification as soon as the kernel knows whether and how much data is +there, and in the case of open files, that's always the case, so you +always get a readiness notification instantly, and your read (or possibly +write) will still block on the disk I/O. +.PP +Another way to view it is that in the case of sockets, pipes, character +devices and so on, there is another party (the sender) that delivers data +on its own, but in the case of files, there is no such thing: the disk +will not send data on its own, simply because it doesn't know what you +wish to read \- you would first have to request some data. +.PP +Since files are typically not-so-well supported by advanced notification +mechanism, libev tries hard to emulate \s-1POSIX\s0 behaviour with respect +to files, even though you should not use it. The reason for this is +convenience: sometimes you want to watch \s-1STDIN\s0 or \s-1STDOUT,\s0 which is +usually a tty, often a pipe, but also sometimes files or special devices +(for example, \f(CW\*(C`epoll\*(C'\fR on Linux works with \fI/dev/random\fR but not with +\&\fI/dev/urandom\fR), and even though the file might better be served with +asynchronous I/O instead of with non-blocking I/O, it is still useful when +it \*(L"just works\*(R" instead of freezing. +.PP +So avoid file descriptors pointing to files when you know it (e.g. use +libeio), but use them when it is convenient, e.g. for \s-1STDIN/STDOUT,\s0 or +when you rarely read from a file instead of from a socket, and want to +reuse the same code path. +.PP +\fIThe special problem of fork\fR +.IX Subsection "The special problem of fork" +.PP +Some backends (epoll, kqueue, linuxaio, iouring) do not support \f(CW\*(C`fork ()\*(C'\fR +at all or exhibit useless behaviour. Libev fully supports fork, but needs +to be told about it in the child if you want to continue to use it in the +child. +.PP +To support fork in your child processes, you have to call \f(CW\*(C`ev_loop_fork +()\*(C'\fR after a fork in the child, enable \f(CW\*(C`EVFLAG_FORKCHECK\*(C'\fR, or resort to +\&\f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR. +.PP +\fIThe special problem of \s-1SIGPIPE\s0\fR +.IX Subsection "The special problem of SIGPIPE" +.PP +While not really specific to libev, it is easy to forget about \f(CW\*(C`SIGPIPE\*(C'\fR: +when writing to a pipe whose other end has been closed, your program gets +sent a \s-1SIGPIPE,\s0 which, by default, aborts your program. For most programs +this is sensible behaviour, for daemons, this is usually undesirable. +.PP +So when you encounter spurious, unexplained daemon exits, make sure you +ignore \s-1SIGPIPE\s0 (and maybe make sure you log the exit status of your daemon +somewhere, as that would have given you a big clue). +.PP +\fIThe special problem of \f(BIaccept()\fIing when you can't\fR +.IX Subsection "The special problem of accept()ing when you can't" +.PP +Many implementations of the \s-1POSIX\s0 \f(CW\*(C`accept\*(C'\fR function (for example, +found in post\-2004 Linux) have the peculiar behaviour of not removing a +connection from the pending queue in all error cases. +.PP +For example, larger servers often run out of file descriptors (because +of resource limits), causing \f(CW\*(C`accept\*(C'\fR to fail with \f(CW\*(C`ENFILE\*(C'\fR but not +rejecting the connection, leading to libev signalling readiness on +the next iteration again (the connection still exists after all), and +typically causing the program to loop at 100% \s-1CPU\s0 usage. +.PP +Unfortunately, the set of errors that cause this issue differs between +operating systems, there is usually little the app can do to remedy the +situation, and no known thread-safe method of removing the connection to +cope with overload is known (to me). +.PP +One of the easiest ways to handle this situation is to just ignore it +\&\- when the program encounters an overload, it will just loop until the +situation is over. While this is a form of busy waiting, no \s-1OS\s0 offers an +event-based way to handle this situation, so it's the best one can do. +.PP +A better way to handle the situation is to log any errors other than +\&\f(CW\*(C`EAGAIN\*(C'\fR and \f(CW\*(C`EWOULDBLOCK\*(C'\fR, making sure not to flood the log with such +messages, and continue as usual, which at least gives the user an idea of +what could be wrong (\*(L"raise the ulimit!\*(R"). For extra points one could stop +the \f(CW\*(C`ev_io\*(C'\fR watcher on the listening fd \*(L"for a while\*(R", which reduces \s-1CPU\s0 +usage. +.PP +If your program is single-threaded, then you could also keep a dummy file +descriptor for overload situations (e.g. by opening \fI/dev/null\fR), and +when you run into \f(CW\*(C`ENFILE\*(C'\fR or \f(CW\*(C`EMFILE\*(C'\fR, close it, run \f(CW\*(C`accept\*(C'\fR, +close that fd, and create a new dummy fd. This will gracefully refuse +clients under typical overload conditions. +.PP +The last way to handle it is to simply log the error and \f(CW\*(C`exit\*(C'\fR, as +is often done with \f(CW\*(C`malloc\*(C'\fR failures, but this results in an easy +opportunity for a DoS attack. +.PP +\fIWatcher-Specific Functions\fR +.IX Subsection "Watcher-Specific Functions" +.IP "ev_io_init (ev_io *, callback, int fd, int events)" 4 +.IX Item "ev_io_init (ev_io *, callback, int fd, int events)" +.PD 0 +.IP "ev_io_set (ev_io *, int fd, int events)" 4 +.IX Item "ev_io_set (ev_io *, int fd, int events)" +.PD +Configures an \f(CW\*(C`ev_io\*(C'\fR watcher. The \f(CW\*(C`fd\*(C'\fR is the file descriptor to +receive events for and \f(CW\*(C`events\*(C'\fR is either \f(CW\*(C`EV_READ\*(C'\fR, \f(CW\*(C`EV_WRITE\*(C'\fR, both +\&\f(CW\*(C`EV_READ | EV_WRITE\*(C'\fR or \f(CW0\fR, to express the desire to receive the given +events. +.Sp +Note that setting the \f(CW\*(C`events\*(C'\fR to \f(CW0\fR and starting the watcher is +supported, but not specially optimized \- if your program sometimes happens +to generate this combination this is fine, but if it is easy to avoid +starting an io watcher watching for no events you should do so. +.IP "ev_io_modify (ev_io *, int events)" 4 +.IX Item "ev_io_modify (ev_io *, int events)" +Similar to \f(CW\*(C`ev_io_set\*(C'\fR, but only changes the requested events. Using this +might be faster with some backends, as libev can assume that the \f(CW\*(C`fd\*(C'\fR +still refers to the same underlying file description, something it cannot +do when using \f(CW\*(C`ev_io_set\*(C'\fR. +.IP "int fd [no\-modify]" 4 +.IX Item "int fd [no-modify]" +The file descriptor being watched. While it can be read at any time, you +must not modify this member even when the watcher is stopped \- always use +\&\f(CW\*(C`ev_io_set\*(C'\fR for that. +.IP "int events [no\-modify]" 4 +.IX Item "int events [no-modify]" +The set of events the fd is being watched for, among other flags. Remember +that this is a bit set \- to test for \f(CW\*(C`EV_READ\*(C'\fR, use \f(CW\*(C`w\->events & +EV_READ\*(C'\fR, and similarly for \f(CW\*(C`EV_WRITE\*(C'\fR. +.Sp +As with \f(CW\*(C`fd\*(C'\fR, you must not modify this member even when the watcher is +stopped, always use \f(CW\*(C`ev_io_set\*(C'\fR or \f(CW\*(C`ev_io_modify\*(C'\fR for that. +.PP +\fIExamples\fR +.IX Subsection "Examples" +.PP +Example: Call \f(CW\*(C`stdin_readable_cb\*(C'\fR when \s-1STDIN_FILENO\s0 has become, well +readable, but only once. Since it is likely line-buffered, you could +attempt to read a whole line in the callback. +.PP +.Vb 6 +\& static void +\& stdin_readable_cb (struct ev_loop *loop, ev_io *w, int revents) +\& { +\& ev_io_stop (loop, w); +\& .. read from stdin here (or from w\->fd) and handle any I/O errors +\& } +\& +\& ... +\& struct ev_loop *loop = ev_default_init (0); +\& ev_io stdin_readable; +\& ev_io_init (&stdin_readable, stdin_readable_cb, STDIN_FILENO, EV_READ); +\& ev_io_start (loop, &stdin_readable); +\& ev_run (loop, 0); +.Ve +.ie n .SS """ev_timer"" \- relative and optionally repeating timeouts" +.el .SS "\f(CWev_timer\fP \- relative and optionally repeating timeouts" +.IX Subsection "ev_timer - relative and optionally repeating timeouts" +Timer watchers are simple relative timers that generate an event after a +given time, and optionally repeating in regular intervals after that. +.PP +The timers are based on real time, that is, if you register an event that +times out after an hour and you reset your system clock to January last +year, it will still time out after (roughly) one hour. \*(L"Roughly\*(R" because +detecting time jumps is hard, and some inaccuracies are unavoidable (the +monotonic clock option helps a lot here). +.PP +The callback is guaranteed to be invoked only \fIafter\fR its timeout has +passed (not \fIat\fR, so on systems with very low-resolution clocks this +might introduce a small delay, see \*(L"the special problem of being too +early\*(R", below). If multiple timers become ready during the same loop +iteration then the ones with earlier time-out values are invoked before +ones of the same priority with later time-out values (but this is no +longer true when a callback calls \f(CW\*(C`ev_run\*(C'\fR recursively). +.PP +\fIBe smart about timeouts\fR +.IX Subsection "Be smart about timeouts" +.PP +Many real-world problems involve some kind of timeout, usually for error +recovery. A typical example is an \s-1HTTP\s0 request \- if the other side hangs, +you want to raise some error after a while. +.PP +What follows are some ways to handle this problem, from obvious and +inefficient to smart and efficient. +.PP +In the following, a 60 second activity timeout is assumed \- a timeout that +gets reset to 60 seconds each time there is activity (e.g. each time some +data or other life sign was received). +.IP "1. Use a timer and stop, reinitialise and start it on activity." 4 +.IX Item "1. Use a timer and stop, reinitialise and start it on activity." +This is the most obvious, but not the most simple way: In the beginning, +start the watcher: +.Sp +.Vb 2 +\& ev_timer_init (timer, callback, 60., 0.); +\& ev_timer_start (loop, timer); +.Ve +.Sp +Then, each time there is some activity, \f(CW\*(C`ev_timer_stop\*(C'\fR it, initialise it +and start it again: +.Sp +.Vb 3 +\& ev_timer_stop (loop, timer); +\& ev_timer_set (timer, 60., 0.); +\& ev_timer_start (loop, timer); +.Ve +.Sp +This is relatively simple to implement, but means that each time there is +some activity, libev will first have to remove the timer from its internal +data structure and then add it again. Libev tries to be fast, but it's +still not a constant-time operation. +.ie n .IP "2. Use a timer and re-start it with ""ev_timer_again"" inactivity." 4 +.el .IP "2. Use a timer and re-start it with \f(CWev_timer_again\fR inactivity." 4 +.IX Item "2. Use a timer and re-start it with ev_timer_again inactivity." +This is the easiest way, and involves using \f(CW\*(C`ev_timer_again\*(C'\fR instead of +\&\f(CW\*(C`ev_timer_start\*(C'\fR. +.Sp +To implement this, configure an \f(CW\*(C`ev_timer\*(C'\fR with a \f(CW\*(C`repeat\*(C'\fR value +of \f(CW60\fR and then call \f(CW\*(C`ev_timer_again\*(C'\fR at start and each time you +successfully read or write some data. If you go into an idle state where +you do not expect data to travel on the socket, you can \f(CW\*(C`ev_timer_stop\*(C'\fR +the timer, and \f(CW\*(C`ev_timer_again\*(C'\fR will automatically restart it if need be. +.Sp +That means you can ignore both the \f(CW\*(C`ev_timer_start\*(C'\fR function and the +\&\f(CW\*(C`after\*(C'\fR argument to \f(CW\*(C`ev_timer_set\*(C'\fR, and only ever use the \f(CW\*(C`repeat\*(C'\fR +member and \f(CW\*(C`ev_timer_again\*(C'\fR. +.Sp +At start: +.Sp +.Vb 3 +\& ev_init (timer, callback); +\& timer\->repeat = 60.; +\& ev_timer_again (loop, timer); +.Ve +.Sp +Each time there is some activity: +.Sp +.Vb 1 +\& ev_timer_again (loop, timer); +.Ve +.Sp +It is even possible to change the time-out on the fly, regardless of +whether the watcher is active or not: +.Sp +.Vb 2 +\& timer\->repeat = 30.; +\& ev_timer_again (loop, timer); +.Ve +.Sp +This is slightly more efficient then stopping/starting the timer each time +you want to modify its timeout value, as libev does not have to completely +remove and re-insert the timer from/into its internal data structure. +.Sp +It is, however, even simpler than the \*(L"obvious\*(R" way to do it. +.IP "3. Let the timer time out, but then re-arm it as required." 4 +.IX Item "3. Let the timer time out, but then re-arm it as required." +This method is more tricky, but usually most efficient: Most timeouts are +relatively long compared to the intervals between other activity \- in +our example, within 60 seconds, there are usually many I/O events with +associated activity resets. +.Sp +In this case, it would be more efficient to leave the \f(CW\*(C`ev_timer\*(C'\fR alone, +but remember the time of last activity, and check for a real timeout only +within the callback: +.Sp +.Vb 3 +\& ev_tstamp timeout = 60.; +\& ev_tstamp last_activity; // time of last activity +\& ev_timer timer; +\& +\& static void +\& callback (EV_P_ ev_timer *w, int revents) +\& { +\& // calculate when the timeout would happen +\& ev_tstamp after = last_activity \- ev_now (EV_A) + timeout; +\& +\& // if negative, it means we the timeout already occurred +\& if (after < 0.) +\& { +\& // timeout occurred, take action +\& } +\& else +\& { +\& // callback was invoked, but there was some recent +\& // activity. simply restart the timer to time out +\& // after "after" seconds, which is the earliest time +\& // the timeout can occur. +\& ev_timer_set (w, after, 0.); +\& ev_timer_start (EV_A_ w); +\& } +\& } +.Ve +.Sp +To summarise the callback: first calculate in how many seconds the +timeout will occur (by calculating the absolute time when it would occur, +\&\f(CW\*(C`last_activity + timeout\*(C'\fR, and subtracting the current time, \f(CW\*(C`ev_now +(EV_A)\*(C'\fR from that). +.Sp +If this value is negative, then we are already past the timeout, i.e. we +timed out, and need to do whatever is needed in this case. +.Sp +Otherwise, we now the earliest time at which the timeout would trigger, +and simply start the timer with this timeout value. +.Sp +In other words, each time the callback is invoked it will check whether +the timeout occurred. If not, it will simply reschedule itself to check +again at the earliest time it could time out. Rinse. Repeat. +.Sp +This scheme causes more callback invocations (about one every 60 seconds +minus half the average time between activity), but virtually no calls to +libev to change the timeout. +.Sp +To start the machinery, simply initialise the watcher and set +\&\f(CW\*(C`last_activity\*(C'\fR to the current time (meaning there was some activity just +now), then call the callback, which will \*(L"do the right thing\*(R" and start +the timer: +.Sp +.Vb 3 +\& last_activity = ev_now (EV_A); +\& ev_init (&timer, callback); +\& callback (EV_A_ &timer, 0); +.Ve +.Sp +When there is some activity, simply store the current time in +\&\f(CW\*(C`last_activity\*(C'\fR, no libev calls at all: +.Sp +.Vb 2 +\& if (activity detected) +\& last_activity = ev_now (EV_A); +.Ve +.Sp +When your timeout value changes, then the timeout can be changed by simply +providing a new value, stopping the timer and calling the callback, which +will again do the right thing (for example, time out immediately :). +.Sp +.Vb 3 +\& timeout = new_value; +\& ev_timer_stop (EV_A_ &timer); +\& callback (EV_A_ &timer, 0); +.Ve +.Sp +This technique is slightly more complex, but in most cases where the +time-out is unlikely to be triggered, much more efficient. +.IP "4. Wee, just use a double-linked list for your timeouts." 4 +.IX Item "4. Wee, just use a double-linked list for your timeouts." +If there is not one request, but many thousands (millions...), all +employing some kind of timeout with the same timeout value, then one can +do even better: +.Sp +When starting the timeout, calculate the timeout value and put the timeout +at the \fIend\fR of the list. +.Sp +Then use an \f(CW\*(C`ev_timer\*(C'\fR to fire when the timeout at the \fIbeginning\fR of +the list is expected to fire (for example, using the technique #3). +.Sp +When there is some activity, remove the timer from the list, recalculate +the timeout, append it to the end of the list again, and make sure to +update the \f(CW\*(C`ev_timer\*(C'\fR if it was taken from the beginning of the list. +.Sp +This way, one can manage an unlimited number of timeouts in O(1) time for +starting, stopping and updating the timers, at the expense of a major +complication, and having to use a constant timeout. The constant timeout +ensures that the list stays sorted. +.PP +So which method the best? +.PP +Method #2 is a simple no-brain-required solution that is adequate in most +situations. Method #3 requires a bit more thinking, but handles many cases +better, and isn't very complicated either. In most case, choosing either +one is fine, with #3 being better in typical situations. +.PP +Method #1 is almost always a bad idea, and buys you nothing. Method #4 is +rather complicated, but extremely efficient, something that really pays +off after the first million or so of active timers, i.e. it's usually +overkill :) +.PP +\fIThe special problem of being too early\fR +.IX Subsection "The special problem of being too early" +.PP +If you ask a timer to call your callback after three seconds, then +you expect it to be invoked after three seconds \- but of course, this +cannot be guaranteed to infinite precision. Less obviously, it cannot be +guaranteed to any precision by libev \- imagine somebody suspending the +process with a \s-1STOP\s0 signal for a few hours for example. +.PP +So, libev tries to invoke your callback as soon as possible \fIafter\fR the +delay has occurred, but cannot guarantee this. +.PP +A less obvious failure mode is calling your callback too early: many event +loops compare timestamps with a \*(L"elapsed delay >= requested delay\*(R", but +this can cause your callback to be invoked much earlier than you would +expect. +.PP +To see why, imagine a system with a clock that only offers full second +resolution (think windows if you can't come up with a broken enough \s-1OS\s0 +yourself). If you schedule a one-second timer at the time 500.9, then the +event loop will schedule your timeout to elapse at a system time of 500 +(500.9 truncated to the resolution) + 1, or 501. +.PP +If an event library looks at the timeout 0.1s later, it will see \*(L"501 >= +501\*(R" and invoke the callback 0.1s after it was started, even though a +one-second delay was requested \- this is being \*(L"too early\*(R", despite best +intentions. +.PP +This is the reason why libev will never invoke the callback if the elapsed +delay equals the requested delay, but only when the elapsed delay is +larger than the requested delay. In the example above, libev would only invoke +the callback at system time 502, or 1.1s after the timer was started. +.PP +So, while libev cannot guarantee that your callback will be invoked +exactly when requested, it \fIcan\fR and \fIdoes\fR guarantee that the requested +delay has actually elapsed, or in other words, it always errs on the \*(L"too +late\*(R" side of things. +.PP +\fIThe special problem of time updates\fR +.IX Subsection "The special problem of time updates" +.PP +Establishing the current time is a costly operation (it usually takes +at least one system call): \s-1EV\s0 therefore updates its idea of the current +time only before and after \f(CW\*(C`ev_run\*(C'\fR collects new events, which causes a +growing difference between \f(CW\*(C`ev_now ()\*(C'\fR and \f(CW\*(C`ev_time ()\*(C'\fR when handling +lots of events in one iteration. +.PP +The relative timeouts are calculated relative to the \f(CW\*(C`ev_now ()\*(C'\fR +time. This is usually the right thing as this timestamp refers to the time +of the event triggering whatever timeout you are modifying/starting. If +you suspect event processing to be delayed and you \fIneed\fR to base the +timeout on the current time, use something like the following to adjust +for it: +.PP +.Vb 1 +\& ev_timer_set (&timer, after + (ev_time () \- ev_now ()), 0.); +.Ve +.PP +If the event loop is suspended for a long time, you can also force an +update of the time returned by \f(CW\*(C`ev_now ()\*(C'\fR by calling \f(CW\*(C`ev_now_update +()\*(C'\fR, although that will push the event time of all outstanding events +further into the future. +.PP +\fIThe special problem of unsynchronised clocks\fR +.IX Subsection "The special problem of unsynchronised clocks" +.PP +Modern systems have a variety of clocks \- libev itself uses the normal +\&\*(L"wall clock\*(R" clock and, if available, the monotonic clock (to avoid time +jumps). +.PP +Neither of these clocks is synchronised with each other or any other clock +on the system, so \f(CW\*(C`ev_time ()\*(C'\fR might return a considerably different time +than \f(CW\*(C`gettimeofday ()\*(C'\fR or \f(CW\*(C`time ()\*(C'\fR. On a GNU/Linux system, for example, +a call to \f(CW\*(C`gettimeofday\*(C'\fR might return a second count that is one higher +than a directly following call to \f(CW\*(C`time\*(C'\fR. +.PP +The moral of this is to only compare libev-related timestamps with +\&\f(CW\*(C`ev_time ()\*(C'\fR and \f(CW\*(C`ev_now ()\*(C'\fR, at least if you want better precision than +a second or so. +.PP +One more problem arises due to this lack of synchronisation: if libev uses +the system monotonic clock and you compare timestamps from \f(CW\*(C`ev_time\*(C'\fR +or \f(CW\*(C`ev_now\*(C'\fR from when you started your timer and when your callback is +invoked, you will find that sometimes the callback is a bit \*(L"early\*(R". +.PP +This is because \f(CW\*(C`ev_timer\*(C'\fRs work in real time, not wall clock time, so +libev makes sure your callback is not invoked before the delay happened, +\&\fImeasured according to the real time\fR, not the system clock. +.PP +If your timeouts are based on a physical timescale (e.g. \*(L"time out this +connection after 100 seconds\*(R") then this shouldn't bother you as it is +exactly the right behaviour. +.PP +If you want to compare wall clock/system timestamps to your timers, then +you need to use \f(CW\*(C`ev_periodic\*(C'\fRs, as these are based on the wall clock +time, where your comparisons will always generate correct results. +.PP +\fIThe special problems of suspended animation\fR +.IX Subsection "The special problems of suspended animation" +.PP +When you leave the server world it is quite customary to hit machines that +can suspend/hibernate \- what happens to the clocks during such a suspend? +.PP +Some quick tests made with a Linux 2.6.28 indicate that a suspend freezes +all processes, while the clocks (\f(CW\*(C`times\*(C'\fR, \f(CW\*(C`CLOCK_MONOTONIC\*(C'\fR) continue +to run until the system is suspended, but they will not advance while the +system is suspended. That means, on resume, it will be as if the program +was frozen for a few seconds, but the suspend time will not be counted +towards \f(CW\*(C`ev_timer\*(C'\fR when a monotonic clock source is used. The real time +clock advanced as expected, but if it is used as sole clocksource, then a +long suspend would be detected as a time jump by libev, and timers would +be adjusted accordingly. +.PP +I would not be surprised to see different behaviour in different between +operating systems, \s-1OS\s0 versions or even different hardware. +.PP +The other form of suspend (job control, or sending a \s-1SIGSTOP\s0) will see a +time jump in the monotonic clocks and the realtime clock. If the program +is suspended for a very long time, and monotonic clock sources are in use, +then you can expect \f(CW\*(C`ev_timer\*(C'\fRs to expire as the full suspension time +will be counted towards the timers. When no monotonic clock source is in +use, then libev will again assume a timejump and adjust accordingly. +.PP +It might be beneficial for this latter case to call \f(CW\*(C`ev_suspend\*(C'\fR +and \f(CW\*(C`ev_resume\*(C'\fR in code that handles \f(CW\*(C`SIGTSTP\*(C'\fR, to at least get +deterministic behaviour in this case (you can do nothing against +\&\f(CW\*(C`SIGSTOP\*(C'\fR). +.PP +\fIWatcher-Specific Functions and Data Members\fR +.IX Subsection "Watcher-Specific Functions and Data Members" +.IP "ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)" 4 +.IX Item "ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)" +.PD 0 +.IP "ev_timer_set (ev_timer *, ev_tstamp after, ev_tstamp repeat)" 4 +.IX Item "ev_timer_set (ev_timer *, ev_tstamp after, ev_tstamp repeat)" +.PD +Configure the timer to trigger after \f(CW\*(C`after\*(C'\fR seconds (fractional and +negative values are supported). If \f(CW\*(C`repeat\*(C'\fR is \f(CW0.\fR, then it will +automatically be stopped once the timeout is reached. If it is positive, +then the timer will automatically be configured to trigger again \f(CW\*(C`repeat\*(C'\fR +seconds later, again, and again, until stopped manually. +.Sp +The timer itself will do a best-effort at avoiding drift, that is, if +you configure a timer to trigger every 10 seconds, then it will normally +trigger at exactly 10 second intervals. If, however, your program cannot +keep up with the timer (because it takes longer than those 10 seconds to +do stuff) the timer will not fire more than once per event loop iteration. +.IP "ev_timer_again (loop, ev_timer *)" 4 +.IX Item "ev_timer_again (loop, ev_timer *)" +This will act as if the timer timed out, and restarts it again if it is +repeating. It basically works like calling \f(CW\*(C`ev_timer_stop\*(C'\fR, updating the +timeout to the \f(CW\*(C`repeat\*(C'\fR value and calling \f(CW\*(C`ev_timer_start\*(C'\fR. +.Sp +The exact semantics are as in the following rules, all of which will be +applied to the watcher: +.RS 4 +.IP "If the timer is pending, the pending status is always cleared." 4 +.IX Item "If the timer is pending, the pending status is always cleared." +.PD 0 +.IP "If the timer is started but non-repeating, stop it (as if it timed out, without invoking it)." 4 +.IX Item "If the timer is started but non-repeating, stop it (as if it timed out, without invoking it)." +.ie n .IP "If the timer is repeating, make the ""repeat"" value the new timeout and start the timer, if necessary." 4 +.el .IP "If the timer is repeating, make the \f(CWrepeat\fR value the new timeout and start the timer, if necessary." 4 +.IX Item "If the timer is repeating, make the repeat value the new timeout and start the timer, if necessary." +.RE +.RS 4 +.PD +.Sp +This sounds a bit complicated, see \*(L"Be smart about timeouts\*(R", above, for a +usage example. +.RE +.IP "ev_tstamp ev_timer_remaining (loop, ev_timer *)" 4 +.IX Item "ev_tstamp ev_timer_remaining (loop, ev_timer *)" +Returns the remaining time until a timer fires. If the timer is active, +then this time is relative to the current event loop time, otherwise it's +the timeout value currently configured. +.Sp +That is, after an \f(CW\*(C`ev_timer_set (w, 5, 7)\*(C'\fR, \f(CW\*(C`ev_timer_remaining\*(C'\fR returns +\&\f(CW5\fR. When the timer is started and one second passes, \f(CW\*(C`ev_timer_remaining\*(C'\fR +will return \f(CW4\fR. When the timer expires and is restarted, it will return +roughly \f(CW7\fR (likely slightly less as callback invocation takes some time, +too), and so on. +.IP "ev_tstamp repeat [read\-write]" 4 +.IX Item "ev_tstamp repeat [read-write]" +The current \f(CW\*(C`repeat\*(C'\fR value. Will be used each time the watcher times out +or \f(CW\*(C`ev_timer_again\*(C'\fR is called, and determines the next timeout (if any), +which is also when any modifications are taken into account. +.PP +\fIExamples\fR +.IX Subsection "Examples" +.PP +Example: Create a timer that fires after 60 seconds. +.PP +.Vb 5 +\& static void +\& one_minute_cb (struct ev_loop *loop, ev_timer *w, int revents) +\& { +\& .. one minute over, w is actually stopped right here +\& } +\& +\& ev_timer mytimer; +\& ev_timer_init (&mytimer, one_minute_cb, 60., 0.); +\& ev_timer_start (loop, &mytimer); +.Ve +.PP +Example: Create a timeout timer that times out after 10 seconds of +inactivity. +.PP +.Vb 5 +\& static void +\& timeout_cb (struct ev_loop *loop, ev_timer *w, int revents) +\& { +\& .. ten seconds without any activity +\& } +\& +\& ev_timer mytimer; +\& ev_timer_init (&mytimer, timeout_cb, 0., 10.); /* note, only repeat used */ +\& ev_timer_again (&mytimer); /* start timer */ +\& ev_run (loop, 0); +\& +\& // and in some piece of code that gets executed on any "activity": +\& // reset the timeout to start ticking again at 10 seconds +\& ev_timer_again (&mytimer); +.Ve +.ie n .SS """ev_periodic"" \- to cron or not to cron?" +.el .SS "\f(CWev_periodic\fP \- to cron or not to cron?" +.IX Subsection "ev_periodic - to cron or not to cron?" +Periodic watchers are also timers of a kind, but they are very versatile +(and unfortunately a bit complex). +.PP +Unlike \f(CW\*(C`ev_timer\*(C'\fR, periodic watchers are not based on real time (or +relative time, the physical time that passes) but on wall clock time +(absolute time, the thing you can read on your calendar or clock). The +difference is that wall clock time can run faster or slower than real +time, and time jumps are not uncommon (e.g. when you adjust your +wrist-watch). +.PP +You can tell a periodic watcher to trigger after some specific point +in time: for example, if you tell a periodic watcher to trigger \*(L"in 10 +seconds\*(R" (by specifying e.g. \f(CW\*(C`ev_now () + 10.\*(C'\fR, that is, an absolute time +not a delay) and then reset your system clock to January of the previous +year, then it will take a year or more to trigger the event (unlike an +\&\f(CW\*(C`ev_timer\*(C'\fR, which would still trigger roughly 10 seconds after starting +it, as it uses a relative timeout). +.PP +\&\f(CW\*(C`ev_periodic\*(C'\fR watchers can also be used to implement vastly more complex +timers, such as triggering an event on each \*(L"midnight, local time\*(R", or +other complicated rules. This cannot easily be done with \f(CW\*(C`ev_timer\*(C'\fR +watchers, as those cannot react to time jumps. +.PP +As with timers, the callback is guaranteed to be invoked only when the +point in time where it is supposed to trigger has passed. If multiple +timers become ready during the same loop iteration then the ones with +earlier time-out values are invoked before ones with later time-out values +(but this is no longer true when a callback calls \f(CW\*(C`ev_run\*(C'\fR recursively). +.PP +\fIWatcher-Specific Functions and Data Members\fR +.IX Subsection "Watcher-Specific Functions and Data Members" +.IP "ev_periodic_init (ev_periodic *, callback, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" 4 +.IX Item "ev_periodic_init (ev_periodic *, callback, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" +.PD 0 +.IP "ev_periodic_set (ev_periodic *, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" 4 +.IX Item "ev_periodic_set (ev_periodic *, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" +.PD +Lots of arguments, let's sort it out... There are basically three modes of +operation, and we will explain them from simplest to most complex: +.RS 4 +.IP "\(bu" 4 +absolute timer (offset = absolute time, interval = 0, reschedule_cb = 0) +.Sp +In this configuration the watcher triggers an event after the wall clock +time \f(CW\*(C`offset\*(C'\fR has passed. It will not repeat and will not adjust when a +time jump occurs, that is, if it is to be run at January 1st 2011 then it +will be stopped and invoked when the system clock reaches or surpasses +this point in time. +.IP "\(bu" 4 +repeating interval timer (offset = offset within interval, interval > 0, reschedule_cb = 0) +.Sp +In this mode the watcher will always be scheduled to time out at the next +\&\f(CW\*(C`offset + N * interval\*(C'\fR time (for some integer N, which can also be +negative) and then repeat, regardless of any time jumps. The \f(CW\*(C`offset\*(C'\fR +argument is merely an offset into the \f(CW\*(C`interval\*(C'\fR periods. +.Sp +This can be used to create timers that do not drift with respect to the +system clock, for example, here is an \f(CW\*(C`ev_periodic\*(C'\fR that triggers each +hour, on the hour (with respect to \s-1UTC\s0): +.Sp +.Vb 1 +\& ev_periodic_set (&periodic, 0., 3600., 0); +.Ve +.Sp +This doesn't mean there will always be 3600 seconds in between triggers, +but only that the callback will be called when the system time shows a +full hour (\s-1UTC\s0), or more correctly, when the system time is evenly divisible +by 3600. +.Sp +Another way to think about it (for the mathematically inclined) is that +\&\f(CW\*(C`ev_periodic\*(C'\fR will try to run the callback in this mode at the next possible +time where \f(CW\*(C`time = offset (mod interval)\*(C'\fR, regardless of any time jumps. +.Sp +The \f(CW\*(C`interval\*(C'\fR \fI\s-1MUST\s0\fR be positive, and for numerical stability, the +interval value should be higher than \f(CW\*(C`1/8192\*(C'\fR (which is around 100 +microseconds) and \f(CW\*(C`offset\*(C'\fR should be higher than \f(CW0\fR and should have +at most a similar magnitude as the current time (say, within a factor of +ten). Typical values for offset are, in fact, \f(CW0\fR or something between +\&\f(CW0\fR and \f(CW\*(C`interval\*(C'\fR, which is also the recommended range. +.Sp +Note also that there is an upper limit to how often a timer can fire (\s-1CPU\s0 +speed for example), so if \f(CW\*(C`interval\*(C'\fR is very small then timing stability +will of course deteriorate. Libev itself tries to be exact to be about one +millisecond (if the \s-1OS\s0 supports it and the machine is fast enough). +.IP "\(bu" 4 +manual reschedule mode (offset ignored, interval ignored, reschedule_cb = callback) +.Sp +In this mode the values for \f(CW\*(C`interval\*(C'\fR and \f(CW\*(C`offset\*(C'\fR are both being +ignored. Instead, each time the periodic watcher gets scheduled, the +reschedule callback will be called with the watcher as first, and the +current time as second argument. +.Sp +\&\s-1NOTE:\s0 \fIThis callback \s-1MUST NOT\s0 stop or destroy any periodic watcher, ever, +or make \s-1ANY\s0 other event loop modifications whatsoever, unless explicitly +allowed by documentation here\fR. +.Sp +If you need to stop it, return \f(CW\*(C`now + 1e30\*(C'\fR (or so, fudge fudge) and stop +it afterwards (e.g. by starting an \f(CW\*(C`ev_prepare\*(C'\fR watcher, which is the +only event loop modification you are allowed to do). +.Sp +The callback prototype is \f(CW\*(C`ev_tstamp (*reschedule_cb)(ev_periodic +*w, ev_tstamp now)\*(C'\fR, e.g.: +.Sp +.Vb 5 +\& static ev_tstamp +\& my_rescheduler (ev_periodic *w, ev_tstamp now) +\& { +\& return now + 60.; +\& } +.Ve +.Sp +It must return the next time to trigger, based on the passed time value +(that is, the lowest time value larger than to the second argument). It +will usually be called just before the callback will be triggered, but +might be called at other times, too. +.Sp +\&\s-1NOTE:\s0 \fIThis callback must always return a time that is higher than or +equal to the passed \f(CI\*(C`now\*(C'\fI value\fR. +.Sp +This can be used to create very complex timers, such as a timer that +triggers on \*(L"next midnight, local time\*(R". To do this, you would calculate +the next midnight after \f(CW\*(C`now\*(C'\fR and return the timestamp value for +this. Here is a (completely untested, no error checking) example on how to +do this: +.Sp +.Vb 1 +\& #include +\& +\& static ev_tstamp +\& my_rescheduler (ev_periodic *w, ev_tstamp now) +\& { +\& time_t tnow = (time_t)now; +\& struct tm tm; +\& localtime_r (&tnow, &tm); +\& +\& tm.tm_sec = tm.tm_min = tm.tm_hour = 0; // midnight current day +\& ++tm.tm_mday; // midnight next day +\& +\& return mktime (&tm); +\& } +.Ve +.Sp +Note: this code might run into trouble on days that have more then two +midnights (beginning and end). +.RE +.RS 4 +.RE +.IP "ev_periodic_again (loop, ev_periodic *)" 4 +.IX Item "ev_periodic_again (loop, ev_periodic *)" +Simply stops and restarts the periodic watcher again. This is only useful +when you changed some parameters or the reschedule callback would return +a different time than the last time it was called (e.g. in a crond like +program when the crontabs have changed). +.IP "ev_tstamp ev_periodic_at (ev_periodic *)" 4 +.IX Item "ev_tstamp ev_periodic_at (ev_periodic *)" +When active, returns the absolute time that the watcher is supposed +to trigger next. This is not the same as the \f(CW\*(C`offset\*(C'\fR argument to +\&\f(CW\*(C`ev_periodic_set\*(C'\fR, but indeed works even in interval and manual +rescheduling modes. +.IP "ev_tstamp offset [read\-write]" 4 +.IX Item "ev_tstamp offset [read-write]" +When repeating, this contains the offset value, otherwise this is the +absolute point in time (the \f(CW\*(C`offset\*(C'\fR value passed to \f(CW\*(C`ev_periodic_set\*(C'\fR, +although libev might modify this value for better numerical stability). +.Sp +Can be modified any time, but changes only take effect when the periodic +timer fires or \f(CW\*(C`ev_periodic_again\*(C'\fR is being called. +.IP "ev_tstamp interval [read\-write]" 4 +.IX Item "ev_tstamp interval [read-write]" +The current interval value. Can be modified any time, but changes only +take effect when the periodic timer fires or \f(CW\*(C`ev_periodic_again\*(C'\fR is being +called. +.IP "ev_tstamp (*reschedule_cb)(ev_periodic *w, ev_tstamp now) [read\-write]" 4 +.IX Item "ev_tstamp (*reschedule_cb)(ev_periodic *w, ev_tstamp now) [read-write]" +The current reschedule callback, or \f(CW0\fR, if this functionality is +switched off. Can be changed any time, but changes only take effect when +the periodic timer fires or \f(CW\*(C`ev_periodic_again\*(C'\fR is being called. +.PP +\fIExamples\fR +.IX Subsection "Examples" +.PP +Example: Call a callback every hour, or, more precisely, whenever the +system time is divisible by 3600. The callback invocation times have +potentially a lot of jitter, but good long-term stability. +.PP +.Vb 5 +\& static void +\& clock_cb (struct ev_loop *loop, ev_periodic *w, int revents) +\& { +\& ... its now a full hour (UTC, or TAI or whatever your clock follows) +\& } +\& +\& ev_periodic hourly_tick; +\& ev_periodic_init (&hourly_tick, clock_cb, 0., 3600., 0); +\& ev_periodic_start (loop, &hourly_tick); +.Ve +.PP +Example: The same as above, but use a reschedule callback to do it: +.PP +.Vb 1 +\& #include +\& +\& static ev_tstamp +\& my_scheduler_cb (ev_periodic *w, ev_tstamp now) +\& { +\& return now + (3600. \- fmod (now, 3600.)); +\& } +\& +\& ev_periodic_init (&hourly_tick, clock_cb, 0., 0., my_scheduler_cb); +.Ve +.PP +Example: Call a callback every hour, starting now: +.PP +.Vb 4 +\& ev_periodic hourly_tick; +\& ev_periodic_init (&hourly_tick, clock_cb, +\& fmod (ev_now (loop), 3600.), 3600., 0); +\& ev_periodic_start (loop, &hourly_tick); +.Ve +.ie n .SS """ev_signal"" \- signal me when a signal gets signalled!" +.el .SS "\f(CWev_signal\fP \- signal me when a signal gets signalled!" +.IX Subsection "ev_signal - signal me when a signal gets signalled!" +Signal watchers will trigger an event when the process receives a specific +signal one or more times. Even though signals are very asynchronous, libev +will try its best to deliver signals synchronously, i.e. as part of the +normal event processing, like any other event. +.PP +If you want signals to be delivered truly asynchronously, just use +\&\f(CW\*(C`sigaction\*(C'\fR as you would do without libev and forget about sharing +the signal. You can even use \f(CW\*(C`ev_async\*(C'\fR from a signal handler to +synchronously wake up an event loop. +.PP +You can configure as many watchers as you like for the same signal, but +only within the same loop, i.e. you can watch for \f(CW\*(C`SIGINT\*(C'\fR in your +default loop and for \f(CW\*(C`SIGIO\*(C'\fR in another loop, but you cannot watch for +\&\f(CW\*(C`SIGINT\*(C'\fR in both the default loop and another loop at the same time. At +the moment, \f(CW\*(C`SIGCHLD\*(C'\fR is permanently tied to the default loop. +.PP +Only after the first watcher for a signal is started will libev actually +register something with the kernel. It thus coexists with your own signal +handlers as long as you don't register any with libev for the same signal. +.PP +If possible and supported, libev will install its handlers with +\&\f(CW\*(C`SA_RESTART\*(C'\fR (or equivalent) behaviour enabled, so system calls should +not be unduly interrupted. If you have a problem with system calls getting +interrupted by signals you can block all signals in an \f(CW\*(C`ev_check\*(C'\fR watcher +and unblock them in an \f(CW\*(C`ev_prepare\*(C'\fR watcher. +.PP +\fIThe special problem of inheritance over fork/execve/pthread_create\fR +.IX Subsection "The special problem of inheritance over fork/execve/pthread_create" +.PP +Both the signal mask (\f(CW\*(C`sigprocmask\*(C'\fR) and the signal disposition +(\f(CW\*(C`sigaction\*(C'\fR) are unspecified after starting a signal watcher (and after +stopping it again), that is, libev might or might not block the signal, +and might or might not set or restore the installed signal handler (but +see \f(CW\*(C`EVFLAG_NOSIGMASK\*(C'\fR). +.PP +While this does not matter for the signal disposition (libev never +sets signals to \f(CW\*(C`SIG_IGN\*(C'\fR, so handlers will be reset to \f(CW\*(C`SIG_DFL\*(C'\fR on +\&\f(CW\*(C`execve\*(C'\fR), this matters for the signal mask: many programs do not expect +certain signals to be blocked. +.PP +This means that before calling \f(CW\*(C`exec\*(C'\fR (from the child) you should reset +the signal mask to whatever \*(L"default\*(R" you expect (all clear is a good +choice usually). +.PP +The simplest way to ensure that the signal mask is reset in the child is +to install a fork handler with \f(CW\*(C`pthread_atfork\*(C'\fR that resets it. That will +catch fork calls done by libraries (such as the libc) as well. +.PP +In current versions of libev, the signal will not be blocked indefinitely +unless you use the \f(CW\*(C`signalfd\*(C'\fR \s-1API\s0 (\f(CW\*(C`EV_SIGNALFD\*(C'\fR). While this reduces +the window of opportunity for problems, it will not go away, as libev +\&\fIhas\fR to modify the signal mask, at least temporarily. +.PP +So I can't stress this enough: \fIIf you do not reset your signal mask when +you expect it to be empty, you have a race condition in your code\fR. This +is not a libev-specific thing, this is true for most event libraries. +.PP +\fIThe special problem of threads signal handling\fR +.IX Subsection "The special problem of threads signal handling" +.PP +\&\s-1POSIX\s0 threads has problematic signal handling semantics, specifically, +a lot of functionality (sigfd, sigwait etc.) only really works if all +threads in a process block signals, which is hard to achieve. +.PP +When you want to use sigwait (or mix libev signal handling with your own +for the same signals), you can tackle this problem by globally blocking +all signals before creating any threads (or creating them with a fully set +sigprocmask) and also specifying the \f(CW\*(C`EVFLAG_NOSIGMASK\*(C'\fR when creating +loops. Then designate one thread as \*(L"signal receiver thread\*(R" which handles +these signals. You can pass on any signals that libev might be interested +in by calling \f(CW\*(C`ev_feed_signal\*(C'\fR. +.PP +\fIWatcher-Specific Functions and Data Members\fR +.IX Subsection "Watcher-Specific Functions and Data Members" +.IP "ev_signal_init (ev_signal *, callback, int signum)" 4 +.IX Item "ev_signal_init (ev_signal *, callback, int signum)" +.PD 0 +.IP "ev_signal_set (ev_signal *, int signum)" 4 +.IX Item "ev_signal_set (ev_signal *, int signum)" +.PD +Configures the watcher to trigger on the given signal number (usually one +of the \f(CW\*(C`SIGxxx\*(C'\fR constants). +.IP "int signum [read\-only]" 4 +.IX Item "int signum [read-only]" +The signal the watcher watches out for. +.PP +\fIExamples\fR +.IX Subsection "Examples" +.PP +Example: Try to exit cleanly on \s-1SIGINT.\s0 +.PP +.Vb 5 +\& static void +\& sigint_cb (struct ev_loop *loop, ev_signal *w, int revents) +\& { +\& ev_break (loop, EVBREAK_ALL); +\& } +\& +\& ev_signal signal_watcher; +\& ev_signal_init (&signal_watcher, sigint_cb, SIGINT); +\& ev_signal_start (loop, &signal_watcher); +.Ve +.ie n .SS """ev_child"" \- watch out for process status changes" +.el .SS "\f(CWev_child\fP \- watch out for process status changes" +.IX Subsection "ev_child - watch out for process status changes" +Child watchers trigger when your process receives a \s-1SIGCHLD\s0 in response to +some child status changes (most typically when a child of yours dies or +exits). It is permissible to install a child watcher \fIafter\fR the child +has been forked (which implies it might have already exited), as long +as the event loop isn't entered (or is continued from a watcher), i.e., +forking and then immediately registering a watcher for the child is fine, +but forking and registering a watcher a few event loop iterations later or +in the next callback invocation is not. +.PP +Only the default event loop is capable of handling signals, and therefore +you can only register child watchers in the default event loop. +.PP +Due to some design glitches inside libev, child watchers will always be +handled at maximum priority (their priority is set to \f(CW\*(C`EV_MAXPRI\*(C'\fR by +libev) +.PP +\fIProcess Interaction\fR +.IX Subsection "Process Interaction" +.PP +Libev grabs \f(CW\*(C`SIGCHLD\*(C'\fR as soon as the default event loop is +initialised. This is necessary to guarantee proper behaviour even if the +first child watcher is started after the child exits. The occurrence +of \f(CW\*(C`SIGCHLD\*(C'\fR is recorded asynchronously, but child reaping is done +synchronously as part of the event loop processing. Libev always reaps all +children, even ones not watched. +.PP +\fIOverriding the Built-In Processing\fR +.IX Subsection "Overriding the Built-In Processing" +.PP +Libev offers no special support for overriding the built-in child +processing, but if your application collides with libev's default child +handler, you can override it easily by installing your own handler for +\&\f(CW\*(C`SIGCHLD\*(C'\fR after initialising the default loop, and making sure the +default loop never gets destroyed. You are encouraged, however, to use an +event-based approach to child reaping and thus use libev's support for +that, so other libev users can use \f(CW\*(C`ev_child\*(C'\fR watchers freely. +.PP +\fIStopping the Child Watcher\fR +.IX Subsection "Stopping the Child Watcher" +.PP +Currently, the child watcher never gets stopped, even when the +child terminates, so normally one needs to stop the watcher in the +callback. Future versions of libev might stop the watcher automatically +when a child exit is detected (calling \f(CW\*(C`ev_child_stop\*(C'\fR twice is not a +problem). +.PP +\fIWatcher-Specific Functions and Data Members\fR +.IX Subsection "Watcher-Specific Functions and Data Members" +.IP "ev_child_init (ev_child *, callback, int pid, int trace)" 4 +.IX Item "ev_child_init (ev_child *, callback, int pid, int trace)" +.PD 0 +.IP "ev_child_set (ev_child *, int pid, int trace)" 4 +.IX Item "ev_child_set (ev_child *, int pid, int trace)" +.PD +Configures the watcher to wait for status changes of process \f(CW\*(C`pid\*(C'\fR (or +\&\fIany\fR process if \f(CW\*(C`pid\*(C'\fR is specified as \f(CW0\fR). The callback can look +at the \f(CW\*(C`rstatus\*(C'\fR member of the \f(CW\*(C`ev_child\*(C'\fR watcher structure to see +the status word (use the macros from \f(CW\*(C`sys/wait.h\*(C'\fR and see your systems +\&\f(CW\*(C`waitpid\*(C'\fR documentation). The \f(CW\*(C`rpid\*(C'\fR member contains the pid of the +process causing the status change. \f(CW\*(C`trace\*(C'\fR must be either \f(CW0\fR (only +activate the watcher when the process terminates) or \f(CW1\fR (additionally +activate the watcher when the process is stopped or continued). +.IP "int pid [read\-only]" 4 +.IX Item "int pid [read-only]" +The process id this watcher watches out for, or \f(CW0\fR, meaning any process id. +.IP "int rpid [read\-write]" 4 +.IX Item "int rpid [read-write]" +The process id that detected a status change. +.IP "int rstatus [read\-write]" 4 +.IX Item "int rstatus [read-write]" +The process exit/trace status caused by \f(CW\*(C`rpid\*(C'\fR (see your systems +\&\f(CW\*(C`waitpid\*(C'\fR and \f(CW\*(C`sys/wait.h\*(C'\fR documentation for details). +.PP +\fIExamples\fR +.IX Subsection "Examples" +.PP +Example: \f(CW\*(C`fork()\*(C'\fR a new process and install a child handler to wait for +its completion. +.PP +.Vb 1 +\& ev_child cw; +\& +\& static void +\& child_cb (EV_P_ ev_child *w, int revents) +\& { +\& ev_child_stop (EV_A_ w); +\& printf ("process %d exited with status %x\en", w\->rpid, w\->rstatus); +\& } +\& +\& pid_t pid = fork (); +\& +\& if (pid < 0) +\& // error +\& else if (pid == 0) +\& { +\& // the forked child executes here +\& exit (1); +\& } +\& else +\& { +\& ev_child_init (&cw, child_cb, pid, 0); +\& ev_child_start (EV_DEFAULT_ &cw); +\& } +.Ve +.ie n .SS """ev_stat"" \- did the file attributes just change?" +.el .SS "\f(CWev_stat\fP \- did the file attributes just change?" +.IX Subsection "ev_stat - did the file attributes just change?" +This watches a file system path for attribute changes. That is, it calls +\&\f(CW\*(C`stat\*(C'\fR on that path in regular intervals (or when the \s-1OS\s0 says it changed) +and sees if it changed compared to the last time, invoking the callback +if it did. Starting the watcher \f(CW\*(C`stat\*(C'\fR's the file, so only changes that +happen after the watcher has been started will be reported. +.PP +The path does not need to exist: changing from \*(L"path exists\*(R" to \*(L"path does +not exist\*(R" is a status change like any other. The condition \*(L"path does not +exist\*(R" (or more correctly \*(L"path cannot be stat'ed\*(R") is signified by the +\&\f(CW\*(C`st_nlink\*(C'\fR field being zero (which is otherwise always forced to be at +least one) and all the other fields of the stat buffer having unspecified +contents. +.PP +The path \fImust not\fR end in a slash or contain special components such as +\&\f(CW\*(C`.\*(C'\fR or \f(CW\*(C`..\*(C'\fR. The path \fIshould\fR be absolute: If it is relative and +your working directory changes, then the behaviour is undefined. +.PP +Since there is no portable change notification interface available, the +portable implementation simply calls \f(CWstat(2)\fR regularly on the path +to see if it changed somehow. You can specify a recommended polling +interval for this case. If you specify a polling interval of \f(CW0\fR (highly +recommended!) then a \fIsuitable, unspecified default\fR value will be used +(which you can expect to be around five seconds, although this might +change dynamically). Libev will also impose a minimum interval which is +currently around \f(CW0.1\fR, but that's usually overkill. +.PP +This watcher type is not meant for massive numbers of stat watchers, +as even with OS-supported change notifications, this can be +resource-intensive. +.PP +At the time of this writing, the only OS-specific interface implemented +is the Linux inotify interface (implementing kqueue support is left as an +exercise for the reader. Note, however, that the author sees no way of +implementing \f(CW\*(C`ev_stat\*(C'\fR semantics with kqueue, except as a hint). +.PP +\fI\s-1ABI\s0 Issues (Largefile Support)\fR +.IX Subsection "ABI Issues (Largefile Support)" +.PP +Libev by default (unless the user overrides this) uses the default +compilation environment, which means that on systems with large file +support disabled by default, you get the 32 bit version of the stat +structure. When using the library from programs that change the \s-1ABI\s0 to +use 64 bit file offsets the programs will fail. In that case you have to +compile libev with the same flags to get binary compatibility. This is +obviously the case with any flags that change the \s-1ABI,\s0 but the problem is +most noticeably displayed with ev_stat and large file support. +.PP +The solution for this is to lobby your distribution maker to make large +file interfaces available by default (as e.g. FreeBSD does) and not +optional. Libev cannot simply switch on large file support because it has +to exchange stat structures with application programs compiled using the +default compilation environment. +.PP +\fIInotify and Kqueue\fR +.IX Subsection "Inotify and Kqueue" +.PP +When \f(CW\*(C`inotify (7)\*(C'\fR support has been compiled into libev and present at +runtime, it will be used to speed up change detection where possible. The +inotify descriptor will be created lazily when the first \f(CW\*(C`ev_stat\*(C'\fR +watcher is being started. +.PP +Inotify presence does not change the semantics of \f(CW\*(C`ev_stat\*(C'\fR watchers +except that changes might be detected earlier, and in some cases, to avoid +making regular \f(CW\*(C`stat\*(C'\fR calls. Even in the presence of inotify support +there are many cases where libev has to resort to regular \f(CW\*(C`stat\*(C'\fR polling, +but as long as kernel 2.6.25 or newer is used (2.6.24 and older have too +many bugs), the path exists (i.e. stat succeeds), and the path resides on +a local filesystem (libev currently assumes only ext2/3, jfs, reiserfs and +xfs are fully working) libev usually gets away without polling. +.PP +There is no support for kqueue, as apparently it cannot be used to +implement this functionality, due to the requirement of having a file +descriptor open on the object at all times, and detecting renames, unlinks +etc. is difficult. +.PP +\fI\f(CI\*(C`stat ()\*(C'\fI is a synchronous operation\fR +.IX Subsection "stat () is a synchronous operation" +.PP +Libev doesn't normally do any kind of I/O itself, and so is not blocking +the process. The exception are \f(CW\*(C`ev_stat\*(C'\fR watchers \- those call \f(CW\*(C`stat +()\*(C'\fR, which is a synchronous operation. +.PP +For local paths, this usually doesn't matter: unless the system is very +busy or the intervals between stat's are large, a stat call will be fast, +as the path data is usually in memory already (except when starting the +watcher). +.PP +For networked file systems, calling \f(CW\*(C`stat ()\*(C'\fR can block an indefinite +time due to network issues, and even under good conditions, a stat call +often takes multiple milliseconds. +.PP +Therefore, it is best to avoid using \f(CW\*(C`ev_stat\*(C'\fR watchers on networked +paths, although this is fully supported by libev. +.PP +\fIThe special problem of stat time resolution\fR +.IX Subsection "The special problem of stat time resolution" +.PP +The \f(CW\*(C`stat ()\*(C'\fR system call only supports full-second resolution portably, +and even on systems where the resolution is higher, most file systems +still only support whole seconds. +.PP +That means that, if the time is the only thing that changes, you can +easily miss updates: on the first update, \f(CW\*(C`ev_stat\*(C'\fR detects a change and +calls your callback, which does something. When there is another update +within the same second, \f(CW\*(C`ev_stat\*(C'\fR will be unable to detect unless the +stat data does change in other ways (e.g. file size). +.PP +The solution to this is to delay acting on a change for slightly more +than a second (or till slightly after the next full second boundary), using +a roughly one-second-delay \f(CW\*(C`ev_timer\*(C'\fR (e.g. \f(CW\*(C`ev_timer_set (w, 0., 1.02); +ev_timer_again (loop, w)\*(C'\fR). +.PP +The \f(CW.02\fR offset is added to work around small timing inconsistencies +of some operating systems (where the second counter of the current time +might be be delayed. One such system is the Linux kernel, where a call to +\&\f(CW\*(C`gettimeofday\*(C'\fR might return a timestamp with a full second later than +a subsequent \f(CW\*(C`time\*(C'\fR call \- if the equivalent of \f(CW\*(C`time ()\*(C'\fR is used to +update file times then there will be a small window where the kernel uses +the previous second to update file times but libev might already execute +the timer callback). +.PP +\fIWatcher-Specific Functions and Data Members\fR +.IX Subsection "Watcher-Specific Functions and Data Members" +.IP "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" 4 +.IX Item "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" +.PD 0 +.IP "ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)" 4 +.IX Item "ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)" +.PD +Configures the watcher to wait for status changes of the given +\&\f(CW\*(C`path\*(C'\fR. The \f(CW\*(C`interval\*(C'\fR is a hint on how quickly a change is expected to +be detected and should normally be specified as \f(CW0\fR to let libev choose +a suitable value. The memory pointed to by \f(CW\*(C`path\*(C'\fR must point to the same +path for as long as the watcher is active. +.Sp +The callback will receive an \f(CW\*(C`EV_STAT\*(C'\fR event when a change was detected, +relative to the attributes at the time the watcher was started (or the +last change was detected). +.IP "ev_stat_stat (loop, ev_stat *)" 4 +.IX Item "ev_stat_stat (loop, ev_stat *)" +Updates the stat buffer immediately with new values. If you change the +watched path in your callback, you could call this function to avoid +detecting this change (while introducing a race condition if you are not +the only one changing the path). Can also be useful simply to find out the +new values. +.IP "ev_statdata attr [read\-only]" 4 +.IX Item "ev_statdata attr [read-only]" +The most-recently detected attributes of the file. Although the type is +\&\f(CW\*(C`ev_statdata\*(C'\fR, this is usually the (or one of the) \f(CW\*(C`struct stat\*(C'\fR types +suitable for your system, but you can only rely on the POSIX-standardised +members to be present. If the \f(CW\*(C`st_nlink\*(C'\fR member is \f(CW0\fR, then there was +some error while \f(CW\*(C`stat\*(C'\fRing the file. +.IP "ev_statdata prev [read\-only]" 4 +.IX Item "ev_statdata prev [read-only]" +The previous attributes of the file. The callback gets invoked whenever +\&\f(CW\*(C`prev\*(C'\fR != \f(CW\*(C`attr\*(C'\fR, or, more precisely, one or more of these members +differ: \f(CW\*(C`st_dev\*(C'\fR, \f(CW\*(C`st_ino\*(C'\fR, \f(CW\*(C`st_mode\*(C'\fR, \f(CW\*(C`st_nlink\*(C'\fR, \f(CW\*(C`st_uid\*(C'\fR, +\&\f(CW\*(C`st_gid\*(C'\fR, \f(CW\*(C`st_rdev\*(C'\fR, \f(CW\*(C`st_size\*(C'\fR, \f(CW\*(C`st_atime\*(C'\fR, \f(CW\*(C`st_mtime\*(C'\fR, \f(CW\*(C`st_ctime\*(C'\fR. +.IP "ev_tstamp interval [read\-only]" 4 +.IX Item "ev_tstamp interval [read-only]" +The specified interval. +.IP "const char *path [read\-only]" 4 +.IX Item "const char *path [read-only]" +The file system path that is being watched. +.PP +\fIExamples\fR +.IX Subsection "Examples" +.PP +Example: Watch \f(CW\*(C`/etc/passwd\*(C'\fR for attribute changes. +.PP +.Vb 10 +\& static void +\& passwd_cb (struct ev_loop *loop, ev_stat *w, int revents) +\& { +\& /* /etc/passwd changed in some way */ +\& if (w\->attr.st_nlink) +\& { +\& printf ("passwd current size %ld\en", (long)w\->attr.st_size); +\& printf ("passwd current atime %ld\en", (long)w\->attr.st_mtime); +\& printf ("passwd current mtime %ld\en", (long)w\->attr.st_mtime); +\& } +\& else +\& /* you shalt not abuse printf for puts */ +\& puts ("wow, /etc/passwd is not there, expect problems. " +\& "if this is windows, they already arrived\en"); +\& } +\& +\& ... +\& ev_stat passwd; +\& +\& ev_stat_init (&passwd, passwd_cb, "/etc/passwd", 0.); +\& ev_stat_start (loop, &passwd); +.Ve +.PP +Example: Like above, but additionally use a one-second delay so we do not +miss updates (however, frequent updates will delay processing, too, so +one might do the work both on \f(CW\*(C`ev_stat\*(C'\fR callback invocation \fIand\fR on +\&\f(CW\*(C`ev_timer\*(C'\fR callback invocation). +.PP +.Vb 2 +\& static ev_stat passwd; +\& static ev_timer timer; +\& +\& static void +\& timer_cb (EV_P_ ev_timer *w, int revents) +\& { +\& ev_timer_stop (EV_A_ w); +\& +\& /* now it\*(Aqs one second after the most recent passwd change */ +\& } +\& +\& static void +\& stat_cb (EV_P_ ev_stat *w, int revents) +\& { +\& /* reset the one\-second timer */ +\& ev_timer_again (EV_A_ &timer); +\& } +\& +\& ... +\& ev_stat_init (&passwd, stat_cb, "/etc/passwd", 0.); +\& ev_stat_start (loop, &passwd); +\& ev_timer_init (&timer, timer_cb, 0., 1.02); +.Ve +.ie n .SS """ev_idle"" \- when you've got nothing better to do..." +.el .SS "\f(CWev_idle\fP \- when you've got nothing better to do..." +.IX Subsection "ev_idle - when you've got nothing better to do..." +Idle watchers trigger events when no other events of the same or higher +priority are pending (prepare, check and other idle watchers do not count +as receiving \*(L"events\*(R"). +.PP +That is, as long as your process is busy handling sockets or timeouts +(or even signals, imagine) of the same or higher priority it will not be +triggered. But when your process is idle (or only lower-priority watchers +are pending), the idle watchers are being called once per event loop +iteration \- until stopped, that is, or your process receives more events +and becomes busy again with higher priority stuff. +.PP +The most noteworthy effect is that as long as any idle watchers are +active, the process will not block when waiting for new events. +.PP +Apart from keeping your process non-blocking (which is a useful +effect on its own sometimes), idle watchers are a good place to do +\&\*(L"pseudo-background processing\*(R", or delay processing stuff to after the +event loop has handled all outstanding events. +.PP +\fIAbusing an \f(CI\*(C`ev_idle\*(C'\fI watcher for its side-effect\fR +.IX Subsection "Abusing an ev_idle watcher for its side-effect" +.PP +As long as there is at least one active idle watcher, libev will never +sleep unnecessarily. Or in other words, it will loop as fast as possible. +For this to work, the idle watcher doesn't need to be invoked at all \- the +lowest priority will do. +.PP +This mode of operation can be useful together with an \f(CW\*(C`ev_check\*(C'\fR watcher, +to do something on each event loop iteration \- for example to balance load +between different connections. +.PP +See \*(L"Abusing an ev_check watcher for its side-effect\*(R" for a longer +example. +.PP +\fIWatcher-Specific Functions and Data Members\fR +.IX Subsection "Watcher-Specific Functions and Data Members" +.IP "ev_idle_init (ev_idle *, callback)" 4 +.IX Item "ev_idle_init (ev_idle *, callback)" +Initialises and configures the idle watcher \- it has no parameters of any +kind. There is a \f(CW\*(C`ev_idle_set\*(C'\fR macro, but using it is utterly pointless, +believe me. +.PP +\fIExamples\fR +.IX Subsection "Examples" +.PP +Example: Dynamically allocate an \f(CW\*(C`ev_idle\*(C'\fR watcher, start it, and in the +callback, free it. Also, use no error checking, as usual. +.PP +.Vb 5 +\& static void +\& idle_cb (struct ev_loop *loop, ev_idle *w, int revents) +\& { +\& // stop the watcher +\& ev_idle_stop (loop, w); +\& +\& // now we can free it +\& free (w); +\& +\& // now do something you wanted to do when the program has +\& // no longer anything immediate to do. +\& } +\& +\& ev_idle *idle_watcher = malloc (sizeof (ev_idle)); +\& ev_idle_init (idle_watcher, idle_cb); +\& ev_idle_start (loop, idle_watcher); +.Ve +.ie n .SS """ev_prepare"" and ""ev_check"" \- customise your event loop!" +.el .SS "\f(CWev_prepare\fP and \f(CWev_check\fP \- customise your event loop!" +.IX Subsection "ev_prepare and ev_check - customise your event loop!" +Prepare and check watchers are often (but not always) used in pairs: +prepare watchers get invoked before the process blocks and check watchers +afterwards. +.PP +You \fImust not\fR call \f(CW\*(C`ev_run\*(C'\fR (or similar functions that enter the +current event loop) or \f(CW\*(C`ev_loop_fork\*(C'\fR from either \f(CW\*(C`ev_prepare\*(C'\fR or +\&\f(CW\*(C`ev_check\*(C'\fR watchers. Other loops than the current one are fine, +however. The rationale behind this is that you do not need to check +for recursion in those watchers, i.e. the sequence will always be +\&\f(CW\*(C`ev_prepare\*(C'\fR, blocking, \f(CW\*(C`ev_check\*(C'\fR so if you have one watcher of each +kind they will always be called in pairs bracketing the blocking call. +.PP +Their main purpose is to integrate other event mechanisms into libev and +their use is somewhat advanced. They could be used, for example, to track +variable changes, implement your own watchers, integrate net-snmp or a +coroutine library and lots more. They are also occasionally useful if +you cache some data and want to flush it before blocking (for example, +in X programs you might want to do an \f(CW\*(C`XFlush ()\*(C'\fR in an \f(CW\*(C`ev_prepare\*(C'\fR +watcher). +.PP +This is done by examining in each prepare call which file descriptors +need to be watched by the other library, registering \f(CW\*(C`ev_io\*(C'\fR watchers +for them and starting an \f(CW\*(C`ev_timer\*(C'\fR watcher for any timeouts (many +libraries provide exactly this functionality). Then, in the check watcher, +you check for any events that occurred (by checking the pending status +of all watchers and stopping them) and call back into the library. The +I/O and timer callbacks will never actually be called (but must be valid +nevertheless, because you never know, you know?). +.PP +As another example, the Perl Coro module uses these hooks to integrate +coroutines into libev programs, by yielding to other active coroutines +during each prepare and only letting the process block if no coroutines +are ready to run (it's actually more complicated: it only runs coroutines +with priority higher than or equal to the event loop and one coroutine +of lower priority, but only once, using idle watchers to keep the event +loop from blocking if lower-priority coroutines are active, thus mapping +low-priority coroutines to idle/background tasks). +.PP +When used for this purpose, it is recommended to give \f(CW\*(C`ev_check\*(C'\fR watchers +highest (\f(CW\*(C`EV_MAXPRI\*(C'\fR) priority, to ensure that they are being run before +any other watchers after the poll (this doesn't matter for \f(CW\*(C`ev_prepare\*(C'\fR +watchers). +.PP +Also, \f(CW\*(C`ev_check\*(C'\fR watchers (and \f(CW\*(C`ev_prepare\*(C'\fR watchers, too) should not +activate (\*(L"feed\*(R") events into libev. While libev fully supports this, they +might get executed before other \f(CW\*(C`ev_check\*(C'\fR watchers did their job. As +\&\f(CW\*(C`ev_check\*(C'\fR watchers are often used to embed other (non-libev) event +loops those other event loops might be in an unusable state until their +\&\f(CW\*(C`ev_check\*(C'\fR watcher ran (always remind yourself to coexist peacefully with +others). +.PP +\fIAbusing an \f(CI\*(C`ev_check\*(C'\fI watcher for its side-effect\fR +.IX Subsection "Abusing an ev_check watcher for its side-effect" +.PP +\&\f(CW\*(C`ev_check\*(C'\fR (and less often also \f(CW\*(C`ev_prepare\*(C'\fR) watchers can also be +useful because they are called once per event loop iteration. For +example, if you want to handle a large number of connections fairly, you +normally only do a bit of work for each active connection, and if there +is more work to do, you wait for the next event loop iteration, so other +connections have a chance of making progress. +.PP +Using an \f(CW\*(C`ev_check\*(C'\fR watcher is almost enough: it will be called on the +next event loop iteration. However, that isn't as soon as possible \- +without external events, your \f(CW\*(C`ev_check\*(C'\fR watcher will not be invoked. +.PP +This is where \f(CW\*(C`ev_idle\*(C'\fR watchers come in handy \- all you need is a +single global idle watcher that is active as long as you have one active +\&\f(CW\*(C`ev_check\*(C'\fR watcher. The \f(CW\*(C`ev_idle\*(C'\fR watcher makes sure the event loop +will not sleep, and the \f(CW\*(C`ev_check\*(C'\fR watcher makes sure a callback gets +invoked. Neither watcher alone can do that. +.PP +\fIWatcher-Specific Functions and Data Members\fR +.IX Subsection "Watcher-Specific Functions and Data Members" +.IP "ev_prepare_init (ev_prepare *, callback)" 4 +.IX Item "ev_prepare_init (ev_prepare *, callback)" +.PD 0 +.IP "ev_check_init (ev_check *, callback)" 4 +.IX Item "ev_check_init (ev_check *, callback)" +.PD +Initialises and configures the prepare or check watcher \- they have no +parameters of any kind. There are \f(CW\*(C`ev_prepare_set\*(C'\fR and \f(CW\*(C`ev_check_set\*(C'\fR +macros, but using them is utterly, utterly, utterly and completely +pointless. +.PP +\fIExamples\fR +.IX Subsection "Examples" +.PP +There are a number of principal ways to embed other event loops or modules +into libev. Here are some ideas on how to include libadns into libev +(there is a Perl module named \f(CW\*(C`EV::ADNS\*(C'\fR that does this, which you could +use as a working example. Another Perl module named \f(CW\*(C`EV::Glib\*(C'\fR embeds a +Glib main context into libev, and finally, \f(CW\*(C`Glib::EV\*(C'\fR embeds \s-1EV\s0 into the +Glib event loop). +.PP +Method 1: Add \s-1IO\s0 watchers and a timeout watcher in a prepare handler, +and in a check watcher, destroy them and call into libadns. What follows +is pseudo-code only of course. This requires you to either use a low +priority for the check watcher or use \f(CW\*(C`ev_clear_pending\*(C'\fR explicitly, as +the callbacks for the IO/timeout watchers might not have been called yet. +.PP +.Vb 2 +\& static ev_io iow [nfd]; +\& static ev_timer tw; +\& +\& static void +\& io_cb (struct ev_loop *loop, ev_io *w, int revents) +\& { +\& } +\& +\& // create io watchers for each fd and a timer before blocking +\& static void +\& adns_prepare_cb (struct ev_loop *loop, ev_prepare *w, int revents) +\& { +\& int timeout = 3600000; +\& struct pollfd fds [nfd]; +\& // actual code will need to loop here and realloc etc. +\& adns_beforepoll (ads, fds, &nfd, &timeout, timeval_from (ev_time ())); +\& +\& /* the callback is illegal, but won\*(Aqt be called as we stop during check */ +\& ev_timer_init (&tw, 0, timeout * 1e\-3, 0.); +\& ev_timer_start (loop, &tw); +\& +\& // create one ev_io per pollfd +\& for (int i = 0; i < nfd; ++i) +\& { +\& ev_io_init (iow + i, io_cb, fds [i].fd, +\& ((fds [i].events & POLLIN ? EV_READ : 0) +\& | (fds [i].events & POLLOUT ? EV_WRITE : 0))); +\& +\& fds [i].revents = 0; +\& ev_io_start (loop, iow + i); +\& } +\& } +\& +\& // stop all watchers after blocking +\& static void +\& adns_check_cb (struct ev_loop *loop, ev_check *w, int revents) +\& { +\& ev_timer_stop (loop, &tw); +\& +\& for (int i = 0; i < nfd; ++i) +\& { +\& // set the relevant poll flags +\& // could also call adns_processreadable etc. here +\& struct pollfd *fd = fds + i; +\& int revents = ev_clear_pending (iow + i); +\& if (revents & EV_READ ) fd\->revents |= fd\->events & POLLIN; +\& if (revents & EV_WRITE) fd\->revents |= fd\->events & POLLOUT; +\& +\& // now stop the watcher +\& ev_io_stop (loop, iow + i); +\& } +\& +\& adns_afterpoll (adns, fds, nfd, timeval_from (ev_now (loop)); +\& } +.Ve +.PP +Method 2: This would be just like method 1, but you run \f(CW\*(C`adns_afterpoll\*(C'\fR +in the prepare watcher and would dispose of the check watcher. +.PP +Method 3: If the module to be embedded supports explicit event +notification (libadns does), you can also make use of the actual watcher +callbacks, and only destroy/create the watchers in the prepare watcher. +.PP +.Vb 5 +\& static void +\& timer_cb (EV_P_ ev_timer *w, int revents) +\& { +\& adns_state ads = (adns_state)w\->data; +\& update_now (EV_A); +\& +\& adns_processtimeouts (ads, &tv_now); +\& } +\& +\& static void +\& io_cb (EV_P_ ev_io *w, int revents) +\& { +\& adns_state ads = (adns_state)w\->data; +\& update_now (EV_A); +\& +\& if (revents & EV_READ ) adns_processreadable (ads, w\->fd, &tv_now); +\& if (revents & EV_WRITE) adns_processwriteable (ads, w\->fd, &tv_now); +\& } +\& +\& // do not ever call adns_afterpoll +.Ve +.PP +Method 4: Do not use a prepare or check watcher because the module you +want to embed is not flexible enough to support it. Instead, you can +override their poll function. The drawback with this solution is that the +main loop is now no longer controllable by \s-1EV.\s0 The \f(CW\*(C`Glib::EV\*(C'\fR module uses +this approach, effectively embedding \s-1EV\s0 as a client into the horrible +libglib event loop. +.PP +.Vb 4 +\& static gint +\& event_poll_func (GPollFD *fds, guint nfds, gint timeout) +\& { +\& int got_events = 0; +\& +\& for (n = 0; n < nfds; ++n) +\& // create/start io watcher that sets the relevant bits in fds[n] and increment got_events +\& +\& if (timeout >= 0) +\& // create/start timer +\& +\& // poll +\& ev_run (EV_A_ 0); +\& +\& // stop timer again +\& if (timeout >= 0) +\& ev_timer_stop (EV_A_ &to); +\& +\& // stop io watchers again \- their callbacks should have set +\& for (n = 0; n < nfds; ++n) +\& ev_io_stop (EV_A_ iow [n]); +\& +\& return got_events; +\& } +.Ve +.ie n .SS """ev_embed"" \- when one backend isn't enough..." +.el .SS "\f(CWev_embed\fP \- when one backend isn't enough..." +.IX Subsection "ev_embed - when one backend isn't enough..." +This is a rather advanced watcher type that lets you embed one event loop +into another (currently only \f(CW\*(C`ev_io\*(C'\fR events are supported in the embedded +loop, other types of watchers might be handled in a delayed or incorrect +fashion and must not be used). +.PP +There are primarily two reasons you would want that: work around bugs and +prioritise I/O. +.PP +As an example for a bug workaround, the kqueue backend might only support +sockets on some platform, so it is unusable as generic backend, but you +still want to make use of it because you have many sockets and it scales +so nicely. In this case, you would create a kqueue-based loop and embed +it into your default loop (which might use e.g. poll). Overall operation +will be a bit slower because first libev has to call \f(CW\*(C`poll\*(C'\fR and then +\&\f(CW\*(C`kevent\*(C'\fR, but at least you can use both mechanisms for what they are +best: \f(CW\*(C`kqueue\*(C'\fR for scalable sockets and \f(CW\*(C`poll\*(C'\fR if you want it to work :) +.PP +As for prioritising I/O: under rare circumstances you have the case where +some fds have to be watched and handled very quickly (with low latency), +and even priorities and idle watchers might have too much overhead. In +this case you would put all the high priority stuff in one loop and all +the rest in a second one, and embed the second one in the first. +.PP +As long as the watcher is active, the callback will be invoked every +time there might be events pending in the embedded loop. The callback +must then call \f(CW\*(C`ev_embed_sweep (mainloop, watcher)\*(C'\fR to make a single +sweep and invoke their callbacks (the callback doesn't need to invoke the +\&\f(CW\*(C`ev_embed_sweep\*(C'\fR function directly, it could also start an idle watcher +to give the embedded loop strictly lower priority for example). +.PP +You can also set the callback to \f(CW0\fR, in which case the embed watcher +will automatically execute the embedded loop sweep whenever necessary. +.PP +Fork detection will be handled transparently while the \f(CW\*(C`ev_embed\*(C'\fR watcher +is active, i.e., the embedded loop will automatically be forked when the +embedding loop forks. In other cases, the user is responsible for calling +\&\f(CW\*(C`ev_loop_fork\*(C'\fR on the embedded loop. +.PP +Unfortunately, not all backends are embeddable: only the ones returned by +\&\f(CW\*(C`ev_embeddable_backends\*(C'\fR are, which, unfortunately, does not include any +portable one. +.PP +So when you want to use this feature you will always have to be prepared +that you cannot get an embeddable loop. The recommended way to get around +this is to have a separate variables for your embeddable loop, try to +create it, and if that fails, use the normal loop for everything. +.PP +\fI\f(CI\*(C`ev_embed\*(C'\fI and fork\fR +.IX Subsection "ev_embed and fork" +.PP +While the \f(CW\*(C`ev_embed\*(C'\fR watcher is running, forks in the embedding loop will +automatically be applied to the embedded loop as well, so no special +fork handling is required in that case. When the watcher is not running, +however, it is still the task of the libev user to call \f(CW\*(C`ev_loop_fork ()\*(C'\fR +as applicable. +.PP +\fIWatcher-Specific Functions and Data Members\fR +.IX Subsection "Watcher-Specific Functions and Data Members" +.IP "ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)" 4 +.IX Item "ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)" +.PD 0 +.IP "ev_embed_set (ev_embed *, struct ev_loop *embedded_loop)" 4 +.IX Item "ev_embed_set (ev_embed *, struct ev_loop *embedded_loop)" +.PD +Configures the watcher to embed the given loop, which must be +embeddable. If the callback is \f(CW0\fR, then \f(CW\*(C`ev_embed_sweep\*(C'\fR will be +invoked automatically, otherwise it is the responsibility of the callback +to invoke it (it will continue to be called until the sweep has been done, +if you do not want that, you need to temporarily stop the embed watcher). +.IP "ev_embed_sweep (loop, ev_embed *)" 4 +.IX Item "ev_embed_sweep (loop, ev_embed *)" +Make a single, non-blocking sweep over the embedded loop. This works +similarly to \f(CW\*(C`ev_run (embedded_loop, EVRUN_NOWAIT)\*(C'\fR, but in the most +appropriate way for embedded loops. +.IP "struct ev_loop *other [read\-only]" 4 +.IX Item "struct ev_loop *other [read-only]" +The embedded event loop. +.PP +\fIExamples\fR +.IX Subsection "Examples" +.PP +Example: Try to get an embeddable event loop and embed it into the default +event loop. If that is not possible, use the default loop. The default +loop is stored in \f(CW\*(C`loop_hi\*(C'\fR, while the embeddable loop is stored in +\&\f(CW\*(C`loop_lo\*(C'\fR (which is \f(CW\*(C`loop_hi\*(C'\fR in the case no embeddable loop can be +used). +.PP +.Vb 3 +\& struct ev_loop *loop_hi = ev_default_init (0); +\& struct ev_loop *loop_lo = 0; +\& ev_embed embed; +\& +\& // see if there is a chance of getting one that works +\& // (remember that a flags value of 0 means autodetection) +\& loop_lo = ev_embeddable_backends () & ev_recommended_backends () +\& ? ev_loop_new (ev_embeddable_backends () & ev_recommended_backends ()) +\& : 0; +\& +\& // if we got one, then embed it, otherwise default to loop_hi +\& if (loop_lo) +\& { +\& ev_embed_init (&embed, 0, loop_lo); +\& ev_embed_start (loop_hi, &embed); +\& } +\& else +\& loop_lo = loop_hi; +.Ve +.PP +Example: Check if kqueue is available but not recommended and create +a kqueue backend for use with sockets (which usually work with any +kqueue implementation). Store the kqueue/socket\-only event loop in +\&\f(CW\*(C`loop_socket\*(C'\fR. (One might optionally use \f(CW\*(C`EVFLAG_NOENV\*(C'\fR, too). +.PP +.Vb 3 +\& struct ev_loop *loop = ev_default_init (0); +\& struct ev_loop *loop_socket = 0; +\& ev_embed embed; +\& +\& if (ev_supported_backends () & ~ev_recommended_backends () & EVBACKEND_KQUEUE) +\& if ((loop_socket = ev_loop_new (EVBACKEND_KQUEUE)) +\& { +\& ev_embed_init (&embed, 0, loop_socket); +\& ev_embed_start (loop, &embed); +\& } +\& +\& if (!loop_socket) +\& loop_socket = loop; +\& +\& // now use loop_socket for all sockets, and loop for everything else +.Ve +.ie n .SS """ev_fork"" \- the audacity to resume the event loop after a fork" +.el .SS "\f(CWev_fork\fP \- the audacity to resume the event loop after a fork" +.IX Subsection "ev_fork - the audacity to resume the event loop after a fork" +Fork watchers are called when a \f(CW\*(C`fork ()\*(C'\fR was detected (usually because +whoever is a good citizen cared to tell libev about it by calling +\&\f(CW\*(C`ev_loop_fork\*(C'\fR). The invocation is done before the event loop blocks next +and before \f(CW\*(C`ev_check\*(C'\fR watchers are being called, and only in the child +after the fork. If whoever good citizen calling \f(CW\*(C`ev_default_fork\*(C'\fR cheats +and calls it in the wrong process, the fork handlers will be invoked, too, +of course. +.PP +\fIThe special problem of life after fork \- how is it possible?\fR +.IX Subsection "The special problem of life after fork - how is it possible?" +.PP +Most uses of \f(CW\*(C`fork ()\*(C'\fR consist of forking, then some simple calls to set +up/change the process environment, followed by a call to \f(CW\*(C`exec()\*(C'\fR. This +sequence should be handled by libev without any problems. +.PP +This changes when the application actually wants to do event handling +in the child, or both parent in child, in effect \*(L"continuing\*(R" after the +fork. +.PP +The default mode of operation (for libev, with application help to detect +forks) is to duplicate all the state in the child, as would be expected +when \fIeither\fR the parent \fIor\fR the child process continues. +.PP +When both processes want to continue using libev, then this is usually the +wrong result. In that case, usually one process (typically the parent) is +supposed to continue with all watchers in place as before, while the other +process typically wants to start fresh, i.e. without any active watchers. +.PP +The cleanest and most efficient way to achieve that with libev is to +simply create a new event loop, which of course will be \*(L"empty\*(R", and +use that for new watchers. This has the advantage of not touching more +memory than necessary, and thus avoiding the copy-on-write, and the +disadvantage of having to use multiple event loops (which do not support +signal watchers). +.PP +When this is not possible, or you want to use the default loop for +other reasons, then in the process that wants to start \*(L"fresh\*(R", call +\&\f(CW\*(C`ev_loop_destroy (EV_DEFAULT)\*(C'\fR followed by \f(CW\*(C`ev_default_loop (...)\*(C'\fR. +Destroying the default loop will \*(L"orphan\*(R" (not stop) all registered +watchers, so you have to be careful not to execute code that modifies +those watchers. Note also that in that case, you have to re-register any +signal watchers. +.PP +\fIWatcher-Specific Functions and Data Members\fR +.IX Subsection "Watcher-Specific Functions and Data Members" +.IP "ev_fork_init (ev_fork *, callback)" 4 +.IX Item "ev_fork_init (ev_fork *, callback)" +Initialises and configures the fork watcher \- it has no parameters of any +kind. There is a \f(CW\*(C`ev_fork_set\*(C'\fR macro, but using it is utterly pointless, +really. +.ie n .SS """ev_cleanup"" \- even the best things end" +.el .SS "\f(CWev_cleanup\fP \- even the best things end" +.IX Subsection "ev_cleanup - even the best things end" +Cleanup watchers are called just before the event loop is being destroyed +by a call to \f(CW\*(C`ev_loop_destroy\*(C'\fR. +.PP +While there is no guarantee that the event loop gets destroyed, cleanup +watchers provide a convenient method to install cleanup hooks for your +program, worker threads and so on \- you just to make sure to destroy the +loop when you want them to be invoked. +.PP +Cleanup watchers are invoked in the same way as any other watcher. Unlike +all other watchers, they do not keep a reference to the event loop (which +makes a lot of sense if you think about it). Like all other watchers, you +can call libev functions in the callback, except \f(CW\*(C`ev_cleanup_start\*(C'\fR. +.PP +\fIWatcher-Specific Functions and Data Members\fR +.IX Subsection "Watcher-Specific Functions and Data Members" +.IP "ev_cleanup_init (ev_cleanup *, callback)" 4 +.IX Item "ev_cleanup_init (ev_cleanup *, callback)" +Initialises and configures the cleanup watcher \- it has no parameters of +any kind. There is a \f(CW\*(C`ev_cleanup_set\*(C'\fR macro, but using it is utterly +pointless, I assure you. +.PP +Example: Register an atexit handler to destroy the default loop, so any +cleanup functions are called. +.PP +.Vb 5 +\& static void +\& program_exits (void) +\& { +\& ev_loop_destroy (EV_DEFAULT_UC); +\& } +\& +\& ... +\& atexit (program_exits); +.Ve +.ie n .SS """ev_async"" \- how to wake up an event loop" +.el .SS "\f(CWev_async\fP \- how to wake up an event loop" +.IX Subsection "ev_async - how to wake up an event loop" +In general, you cannot use an \f(CW\*(C`ev_loop\*(C'\fR from multiple threads or other +asynchronous sources such as signal handlers (as opposed to multiple event +loops \- those are of course safe to use in different threads). +.PP +Sometimes, however, you need to wake up an event loop you do not control, +for example because it belongs to another thread. This is what \f(CW\*(C`ev_async\*(C'\fR +watchers do: as long as the \f(CW\*(C`ev_async\*(C'\fR watcher is active, you can signal +it by calling \f(CW\*(C`ev_async_send\*(C'\fR, which is thread\- and signal safe. +.PP +This functionality is very similar to \f(CW\*(C`ev_signal\*(C'\fR watchers, as signals, +too, are asynchronous in nature, and signals, too, will be compressed +(i.e. the number of callback invocations may be less than the number of +\&\f(CW\*(C`ev_async_send\*(C'\fR calls). In fact, you could use signal watchers as a kind +of \*(L"global async watchers\*(R" by using a watcher on an otherwise unused +signal, and \f(CW\*(C`ev_feed_signal\*(C'\fR to signal this watcher from another thread, +even without knowing which loop owns the signal. +.PP +\fIQueueing\fR +.IX Subsection "Queueing" +.PP +\&\f(CW\*(C`ev_async\*(C'\fR does not support queueing of data in any way. The reason +is that the author does not know of a simple (or any) algorithm for a +multiple-writer-single-reader queue that works in all cases and doesn't +need elaborate support such as pthreads or unportable memory access +semantics. +.PP +That means that if you want to queue data, you have to provide your own +queue. But at least I can tell you how to implement locking around your +queue: +.IP "queueing from a signal handler context" 4 +.IX Item "queueing from a signal handler context" +To implement race-free queueing, you simply add to the queue in the signal +handler but you block the signal handler in the watcher callback. Here is +an example that does that for some fictitious \s-1SIGUSR1\s0 handler: +.Sp +.Vb 1 +\& static ev_async mysig; +\& +\& static void +\& sigusr1_handler (void) +\& { +\& sometype data; +\& +\& // no locking etc. +\& queue_put (data); +\& ev_async_send (EV_DEFAULT_ &mysig); +\& } +\& +\& static void +\& mysig_cb (EV_P_ ev_async *w, int revents) +\& { +\& sometype data; +\& sigset_t block, prev; +\& +\& sigemptyset (&block); +\& sigaddset (&block, SIGUSR1); +\& sigprocmask (SIG_BLOCK, &block, &prev); +\& +\& while (queue_get (&data)) +\& process (data); +\& +\& if (sigismember (&prev, SIGUSR1) +\& sigprocmask (SIG_UNBLOCK, &block, 0); +\& } +.Ve +.Sp +(Note: pthreads in theory requires you to use \f(CW\*(C`pthread_setmask\*(C'\fR +instead of \f(CW\*(C`sigprocmask\*(C'\fR when you use threads, but libev doesn't do it +either...). +.IP "queueing from a thread context" 4 +.IX Item "queueing from a thread context" +The strategy for threads is different, as you cannot (easily) block +threads but you can easily preempt them, so to queue safely you need to +employ a traditional mutex lock, such as in this pthread example: +.Sp +.Vb 2 +\& static ev_async mysig; +\& static pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER; +\& +\& static void +\& otherthread (void) +\& { +\& // only need to lock the actual queueing operation +\& pthread_mutex_lock (&mymutex); +\& queue_put (data); +\& pthread_mutex_unlock (&mymutex); +\& +\& ev_async_send (EV_DEFAULT_ &mysig); +\& } +\& +\& static void +\& mysig_cb (EV_P_ ev_async *w, int revents) +\& { +\& pthread_mutex_lock (&mymutex); +\& +\& while (queue_get (&data)) +\& process (data); +\& +\& pthread_mutex_unlock (&mymutex); +\& } +.Ve +.PP +\fIWatcher-Specific Functions and Data Members\fR +.IX Subsection "Watcher-Specific Functions and Data Members" +.IP "ev_async_init (ev_async *, callback)" 4 +.IX Item "ev_async_init (ev_async *, callback)" +Initialises and configures the async watcher \- it has no parameters of any +kind. There is a \f(CW\*(C`ev_async_set\*(C'\fR macro, but using it is utterly pointless, +trust me. +.IP "ev_async_send (loop, ev_async *)" 4 +.IX Item "ev_async_send (loop, ev_async *)" +Sends/signals/activates the given \f(CW\*(C`ev_async\*(C'\fR watcher, that is, feeds +an \f(CW\*(C`EV_ASYNC\*(C'\fR event on the watcher into the event loop, and instantly +returns. +.Sp +Unlike \f(CW\*(C`ev_feed_event\*(C'\fR, this call is safe to do from other threads, +signal or similar contexts (see the discussion of \f(CW\*(C`EV_ATOMIC_T\*(C'\fR in the +embedding section below on what exactly this means). +.Sp +Note that, as with other watchers in libev, multiple events might get +compressed into a single callback invocation (another way to look at +this is that \f(CW\*(C`ev_async\*(C'\fR watchers are level-triggered: they are set on +\&\f(CW\*(C`ev_async_send\*(C'\fR, reset when the event loop detects that). +.Sp +This call incurs the overhead of at most one extra system call per event +loop iteration, if the event loop is blocked, and no syscall at all if +the event loop (or your program) is processing events. That means that +repeated calls are basically free (there is no need to avoid calls for +performance reasons) and that the overhead becomes smaller (typically +zero) under load. +.IP "bool = ev_async_pending (ev_async *)" 4 +.IX Item "bool = ev_async_pending (ev_async *)" +Returns a non-zero value when \f(CW\*(C`ev_async_send\*(C'\fR has been called on the +watcher but the event has not yet been processed (or even noted) by the +event loop. +.Sp +\&\f(CW\*(C`ev_async_send\*(C'\fR sets a flag in the watcher and wakes up the loop. When +the loop iterates next and checks for the watcher to have become active, +it will reset the flag again. \f(CW\*(C`ev_async_pending\*(C'\fR can be used to very +quickly check whether invoking the loop might be a good idea. +.Sp +Not that this does \fInot\fR check whether the watcher itself is pending, +only whether it has been requested to make this watcher pending: there +is a time window between the event loop checking and resetting the async +notification, and the callback being invoked. +.SH "OTHER FUNCTIONS" +.IX Header "OTHER FUNCTIONS" +There are some other functions of possible interest. Described. Here. Now. +.IP "ev_once (loop, int fd, int events, ev_tstamp timeout, callback, arg)" 4 +.IX Item "ev_once (loop, int fd, int events, ev_tstamp timeout, callback, arg)" +This function combines a simple timer and an I/O watcher, calls your +callback on whichever event happens first and automatically stops both +watchers. This is useful if you want to wait for a single event on an fd +or timeout without having to allocate/configure/start/stop/free one or +more watchers yourself. +.Sp +If \f(CW\*(C`fd\*(C'\fR is less than 0, then no I/O watcher will be started and the +\&\f(CW\*(C`events\*(C'\fR argument is being ignored. Otherwise, an \f(CW\*(C`ev_io\*(C'\fR watcher for +the given \f(CW\*(C`fd\*(C'\fR and \f(CW\*(C`events\*(C'\fR set will be created and started. +.Sp +If \f(CW\*(C`timeout\*(C'\fR is less than 0, then no timeout watcher will be +started. Otherwise an \f(CW\*(C`ev_timer\*(C'\fR watcher with after = \f(CW\*(C`timeout\*(C'\fR (and +repeat = 0) will be started. \f(CW0\fR is a valid timeout. +.Sp +The callback has the type \f(CW\*(C`void (*cb)(int revents, void *arg)\*(C'\fR and is +passed an \f(CW\*(C`revents\*(C'\fR set like normal event callbacks (a combination of +\&\f(CW\*(C`EV_ERROR\*(C'\fR, \f(CW\*(C`EV_READ\*(C'\fR, \f(CW\*(C`EV_WRITE\*(C'\fR or \f(CW\*(C`EV_TIMER\*(C'\fR) and the \f(CW\*(C`arg\*(C'\fR +value passed to \f(CW\*(C`ev_once\*(C'\fR. Note that it is possible to receive \fIboth\fR +a timeout and an io event at the same time \- you probably should give io +events precedence. +.Sp +Example: wait up to ten seconds for data to appear on \s-1STDIN_FILENO.\s0 +.Sp +.Vb 7 +\& static void stdin_ready (int revents, void *arg) +\& { +\& if (revents & EV_READ) +\& /* stdin might have data for us, joy! */; +\& else if (revents & EV_TIMER) +\& /* doh, nothing entered */; +\& } +\& +\& ev_once (STDIN_FILENO, EV_READ, 10., stdin_ready, 0); +.Ve +.IP "ev_feed_fd_event (loop, int fd, int revents)" 4 +.IX Item "ev_feed_fd_event (loop, int fd, int revents)" +Feed an event on the given fd, as if a file descriptor backend detected +the given events. +.IP "ev_feed_signal_event (loop, int signum)" 4 +.IX Item "ev_feed_signal_event (loop, int signum)" +Feed an event as if the given signal occurred. See also \f(CW\*(C`ev_feed_signal\*(C'\fR, +which is async-safe. +.SH "COMMON OR USEFUL IDIOMS (OR BOTH)" +.IX Header "COMMON OR USEFUL IDIOMS (OR BOTH)" +This section explains some common idioms that are not immediately +obvious. Note that examples are sprinkled over the whole manual, and this +section only contains stuff that wouldn't fit anywhere else. +.SS "\s-1ASSOCIATING CUSTOM DATA WITH A WATCHER\s0" +.IX Subsection "ASSOCIATING CUSTOM DATA WITH A WATCHER" +Each watcher has, by default, a \f(CW\*(C`void *data\*(C'\fR member that you can read +or modify at any time: libev will completely ignore it. This can be used +to associate arbitrary data with your watcher. If you need more data and +don't want to allocate memory separately and store a pointer to it in that +data member, you can also \*(L"subclass\*(R" the watcher type and provide your own +data: +.PP +.Vb 7 +\& struct my_io +\& { +\& ev_io io; +\& int otherfd; +\& void *somedata; +\& struct whatever *mostinteresting; +\& }; +\& +\& ... +\& struct my_io w; +\& ev_io_init (&w.io, my_cb, fd, EV_READ); +.Ve +.PP +And since your callback will be called with a pointer to the watcher, you +can cast it back to your own type: +.PP +.Vb 5 +\& static void my_cb (struct ev_loop *loop, ev_io *w_, int revents) +\& { +\& struct my_io *w = (struct my_io *)w_; +\& ... +\& } +.Ve +.PP +More interesting and less C\-conformant ways of casting your callback +function type instead have been omitted. +.SS "\s-1BUILDING YOUR OWN COMPOSITE WATCHERS\s0" +.IX Subsection "BUILDING YOUR OWN COMPOSITE WATCHERS" +Another common scenario is to use some data structure with multiple +embedded watchers, in effect creating your own watcher that combines +multiple libev event sources into one \*(L"super-watcher\*(R": +.PP +.Vb 6 +\& struct my_biggy +\& { +\& int some_data; +\& ev_timer t1; +\& ev_timer t2; +\& } +.Ve +.PP +In this case getting the pointer to \f(CW\*(C`my_biggy\*(C'\fR is a bit more +complicated: Either you store the address of your \f(CW\*(C`my_biggy\*(C'\fR struct in +the \f(CW\*(C`data\*(C'\fR member of the watcher (for woozies or \*(C+ coders), or you need +to use some pointer arithmetic using \f(CW\*(C`offsetof\*(C'\fR inside your watchers (for +real programmers): +.PP +.Vb 1 +\& #include +\& +\& static void +\& t1_cb (EV_P_ ev_timer *w, int revents) +\& { +\& struct my_biggy big = (struct my_biggy *) +\& (((char *)w) \- offsetof (struct my_biggy, t1)); +\& } +\& +\& static void +\& t2_cb (EV_P_ ev_timer *w, int revents) +\& { +\& struct my_biggy big = (struct my_biggy *) +\& (((char *)w) \- offsetof (struct my_biggy, t2)); +\& } +.Ve +.SS "\s-1AVOIDING FINISHING BEFORE RETURNING\s0" +.IX Subsection "AVOIDING FINISHING BEFORE RETURNING" +Often you have structures like this in event-based programs: +.PP +.Vb 4 +\& callback () +\& { +\& free (request); +\& } +\& +\& request = start_new_request (..., callback); +.Ve +.PP +The intent is to start some \*(L"lengthy\*(R" operation. The \f(CW\*(C`request\*(C'\fR could be +used to cancel the operation, or do other things with it. +.PP +It's not uncommon to have code paths in \f(CW\*(C`start_new_request\*(C'\fR that +immediately invoke the callback, for example, to report errors. Or you add +some caching layer that finds that it can skip the lengthy aspects of the +operation and simply invoke the callback with the result. +.PP +The problem here is that this will happen \fIbefore\fR \f(CW\*(C`start_new_request\*(C'\fR +has returned, so \f(CW\*(C`request\*(C'\fR is not set. +.PP +Even if you pass the request by some safer means to the callback, you +might want to do something to the request after starting it, such as +canceling it, which probably isn't working so well when the callback has +already been invoked. +.PP +A common way around all these issues is to make sure that +\&\f(CW\*(C`start_new_request\*(C'\fR \fIalways\fR returns before the callback is invoked. If +\&\f(CW\*(C`start_new_request\*(C'\fR immediately knows the result, it can artificially +delay invoking the callback by using a \f(CW\*(C`prepare\*(C'\fR or \f(CW\*(C`idle\*(C'\fR watcher for +example, or more sneakily, by reusing an existing (stopped) watcher and +pushing it into the pending queue: +.PP +.Vb 2 +\& ev_set_cb (watcher, callback); +\& ev_feed_event (EV_A_ watcher, 0); +.Ve +.PP +This way, \f(CW\*(C`start_new_request\*(C'\fR can safely return before the callback is +invoked, while not delaying callback invocation too much. +.SS "\s-1MODEL/NESTED EVENT LOOP INVOCATIONS AND EXIT CONDITIONS\s0" +.IX Subsection "MODEL/NESTED EVENT LOOP INVOCATIONS AND EXIT CONDITIONS" +Often (especially in \s-1GUI\s0 toolkits) there are places where you have +\&\fImodal\fR interaction, which is most easily implemented by recursively +invoking \f(CW\*(C`ev_run\*(C'\fR. +.PP +This brings the problem of exiting \- a callback might want to finish the +main \f(CW\*(C`ev_run\*(C'\fR call, but not the nested one (e.g. user clicked \*(L"Quit\*(R", but +a modal \*(L"Are you sure?\*(R" dialog is still waiting), or just the nested one +and not the main one (e.g. user clocked \*(L"Ok\*(R" in a modal dialog), or some +other combination: In these cases, a simple \f(CW\*(C`ev_break\*(C'\fR will not work. +.PP +The solution is to maintain \*(L"break this loop\*(R" variable for each \f(CW\*(C`ev_run\*(C'\fR +invocation, and use a loop around \f(CW\*(C`ev_run\*(C'\fR until the condition is +triggered, using \f(CW\*(C`EVRUN_ONCE\*(C'\fR: +.PP +.Vb 2 +\& // main loop +\& int exit_main_loop = 0; +\& +\& while (!exit_main_loop) +\& ev_run (EV_DEFAULT_ EVRUN_ONCE); +\& +\& // in a modal watcher +\& int exit_nested_loop = 0; +\& +\& while (!exit_nested_loop) +\& ev_run (EV_A_ EVRUN_ONCE); +.Ve +.PP +To exit from any of these loops, just set the corresponding exit variable: +.PP +.Vb 2 +\& // exit modal loop +\& exit_nested_loop = 1; +\& +\& // exit main program, after modal loop is finished +\& exit_main_loop = 1; +\& +\& // exit both +\& exit_main_loop = exit_nested_loop = 1; +.Ve +.SS "\s-1THREAD LOCKING EXAMPLE\s0" +.IX Subsection "THREAD LOCKING EXAMPLE" +Here is a fictitious example of how to run an event loop in a different +thread from where callbacks are being invoked and watchers are +created/added/removed. +.PP +For a real-world example, see the \f(CW\*(C`EV::Loop::Async\*(C'\fR perl module, +which uses exactly this technique (which is suited for many high-level +languages). +.PP +The example uses a pthread mutex to protect the loop data, a condition +variable to wait for callback invocations, an async watcher to notify the +event loop thread and an unspecified mechanism to wake up the main thread. +.PP +First, you need to associate some data with the event loop: +.PP +.Vb 6 +\& typedef struct { +\& mutex_t lock; /* global loop lock */ +\& ev_async async_w; +\& thread_t tid; +\& cond_t invoke_cv; +\& } userdata; +\& +\& void prepare_loop (EV_P) +\& { +\& // for simplicity, we use a static userdata struct. +\& static userdata u; +\& +\& ev_async_init (&u\->async_w, async_cb); +\& ev_async_start (EV_A_ &u\->async_w); +\& +\& pthread_mutex_init (&u\->lock, 0); +\& pthread_cond_init (&u\->invoke_cv, 0); +\& +\& // now associate this with the loop +\& ev_set_userdata (EV_A_ u); +\& ev_set_invoke_pending_cb (EV_A_ l_invoke); +\& ev_set_loop_release_cb (EV_A_ l_release, l_acquire); +\& +\& // then create the thread running ev_run +\& pthread_create (&u\->tid, 0, l_run, EV_A); +\& } +.Ve +.PP +The callback for the \f(CW\*(C`ev_async\*(C'\fR watcher does nothing: the watcher is used +solely to wake up the event loop so it takes notice of any new watchers +that might have been added: +.PP +.Vb 5 +\& static void +\& async_cb (EV_P_ ev_async *w, int revents) +\& { +\& // just used for the side effects +\& } +.Ve +.PP +The \f(CW\*(C`l_release\*(C'\fR and \f(CW\*(C`l_acquire\*(C'\fR callbacks simply unlock/lock the mutex +protecting the loop data, respectively. +.PP +.Vb 6 +\& static void +\& l_release (EV_P) +\& { +\& userdata *u = ev_userdata (EV_A); +\& pthread_mutex_unlock (&u\->lock); +\& } +\& +\& static void +\& l_acquire (EV_P) +\& { +\& userdata *u = ev_userdata (EV_A); +\& pthread_mutex_lock (&u\->lock); +\& } +.Ve +.PP +The event loop thread first acquires the mutex, and then jumps straight +into \f(CW\*(C`ev_run\*(C'\fR: +.PP +.Vb 4 +\& void * +\& l_run (void *thr_arg) +\& { +\& struct ev_loop *loop = (struct ev_loop *)thr_arg; +\& +\& l_acquire (EV_A); +\& pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0); +\& ev_run (EV_A_ 0); +\& l_release (EV_A); +\& +\& return 0; +\& } +.Ve +.PP +Instead of invoking all pending watchers, the \f(CW\*(C`l_invoke\*(C'\fR callback will +signal the main thread via some unspecified mechanism (signals? pipe +writes? \f(CW\*(C`Async::Interrupt\*(C'\fR?) and then waits until all pending watchers +have been called (in a while loop because a) spurious wakeups are possible +and b) skipping inter-thread-communication when there are no pending +watchers is very beneficial): +.PP +.Vb 4 +\& static void +\& l_invoke (EV_P) +\& { +\& userdata *u = ev_userdata (EV_A); +\& +\& while (ev_pending_count (EV_A)) +\& { +\& wake_up_other_thread_in_some_magic_or_not_so_magic_way (); +\& pthread_cond_wait (&u\->invoke_cv, &u\->lock); +\& } +\& } +.Ve +.PP +Now, whenever the main thread gets told to invoke pending watchers, it +will grab the lock, call \f(CW\*(C`ev_invoke_pending\*(C'\fR and then signal the loop +thread to continue: +.PP +.Vb 4 +\& static void +\& real_invoke_pending (EV_P) +\& { +\& userdata *u = ev_userdata (EV_A); +\& +\& pthread_mutex_lock (&u\->lock); +\& ev_invoke_pending (EV_A); +\& pthread_cond_signal (&u\->invoke_cv); +\& pthread_mutex_unlock (&u\->lock); +\& } +.Ve +.PP +Whenever you want to start/stop a watcher or do other modifications to an +event loop, you will now have to lock: +.PP +.Vb 2 +\& ev_timer timeout_watcher; +\& userdata *u = ev_userdata (EV_A); +\& +\& ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.); +\& +\& pthread_mutex_lock (&u\->lock); +\& ev_timer_start (EV_A_ &timeout_watcher); +\& ev_async_send (EV_A_ &u\->async_w); +\& pthread_mutex_unlock (&u\->lock); +.Ve +.PP +Note that sending the \f(CW\*(C`ev_async\*(C'\fR watcher is required because otherwise +an event loop currently blocking in the kernel will have no knowledge +about the newly added timer. By waking up the loop it will pick up any new +watchers in the next event loop iteration. +.SS "\s-1THREADS, COROUTINES, CONTINUATIONS, QUEUES... INSTEAD OF CALLBACKS\s0" +.IX Subsection "THREADS, COROUTINES, CONTINUATIONS, QUEUES... INSTEAD OF CALLBACKS" +While the overhead of a callback that e.g. schedules a thread is small, it +is still an overhead. If you embed libev, and your main usage is with some +kind of threads or coroutines, you might want to customise libev so that +doesn't need callbacks anymore. +.PP +Imagine you have coroutines that you can switch to using a function +\&\f(CW\*(C`switch_to (coro)\*(C'\fR, that libev runs in a coroutine called \f(CW\*(C`libev_coro\*(C'\fR +and that due to some magic, the currently active coroutine is stored in a +global called \f(CW\*(C`current_coro\*(C'\fR. Then you can build your own \*(L"wait for libev +event\*(R" primitive by changing \f(CW\*(C`EV_CB_DECLARE\*(C'\fR and \f(CW\*(C`EV_CB_INVOKE\*(C'\fR (note +the differing \f(CW\*(C`;\*(C'\fR conventions): +.PP +.Vb 2 +\& #define EV_CB_DECLARE(type) struct my_coro *cb; +\& #define EV_CB_INVOKE(watcher) switch_to ((watcher)\->cb) +.Ve +.PP +That means instead of having a C callback function, you store the +coroutine to switch to in each watcher, and instead of having libev call +your callback, you instead have it switch to that coroutine. +.PP +A coroutine might now wait for an event with a function called +\&\f(CW\*(C`wait_for_event\*(C'\fR. (the watcher needs to be started, as always, but it doesn't +matter when, or whether the watcher is active or not when this function is +called): +.PP +.Vb 6 +\& void +\& wait_for_event (ev_watcher *w) +\& { +\& ev_set_cb (w, current_coro); +\& switch_to (libev_coro); +\& } +.Ve +.PP +That basically suspends the coroutine inside \f(CW\*(C`wait_for_event\*(C'\fR and +continues the libev coroutine, which, when appropriate, switches back to +this or any other coroutine. +.PP +You can do similar tricks if you have, say, threads with an event queue \- +instead of storing a coroutine, you store the queue object and instead of +switching to a coroutine, you push the watcher onto the queue and notify +any waiters. +.PP +To embed libev, see \*(L"\s-1EMBEDDING\*(R"\s0, but in short, it's easiest to create two +files, \fImy_ev.h\fR and \fImy_ev.c\fR that include the respective libev files: +.PP +.Vb 4 +\& // my_ev.h +\& #define EV_CB_DECLARE(type) struct my_coro *cb; +\& #define EV_CB_INVOKE(watcher) switch_to ((watcher)\->cb) +\& #include "../libev/ev.h" +\& +\& // my_ev.c +\& #define EV_H "my_ev.h" +\& #include "../libev/ev.c" +.Ve +.PP +And then use \fImy_ev.h\fR when you would normally use \fIev.h\fR, and compile +\&\fImy_ev.c\fR into your project. When properly specifying include paths, you +can even use \fIev.h\fR as header file name directly. +.SH "LIBEVENT EMULATION" +.IX Header "LIBEVENT EMULATION" +Libev offers a compatibility emulation layer for libevent. It cannot +emulate the internals of libevent, so here are some usage hints: +.IP "\(bu" 4 +Only the libevent\-1.4.1\-beta \s-1API\s0 is being emulated. +.Sp +This was the newest libevent version available when libev was implemented, +and is still mostly unchanged in 2010. +.IP "\(bu" 4 +Use it by including , as usual. +.IP "\(bu" 4 +The following members are fully supported: ev_base, ev_callback, +ev_arg, ev_fd, ev_res, ev_events. +.IP "\(bu" 4 +Avoid using ev_flags and the EVLIST_*\-macros, while it is +maintained by libev, it does not work exactly the same way as in libevent (consider +it a private \s-1API\s0). +.IP "\(bu" 4 +Priorities are not currently supported. Initialising priorities +will fail and all watchers will have the same priority, even though there +is an ev_pri field. +.IP "\(bu" 4 +In libevent, the last base created gets the signals, in libev, the +base that registered the signal gets the signals. +.IP "\(bu" 4 +Other members are not supported. +.IP "\(bu" 4 +The libev emulation is \fInot\fR \s-1ABI\s0 compatible to libevent, you need +to use the libev header file and library. +.SH "\*(C+ SUPPORT" +.IX Header " SUPPORT" +.SS "C \s-1API\s0" +.IX Subsection "C API" +The normal C \s-1API\s0 should work fine when used from \*(C+: both ev.h and the +libev sources can be compiled as \*(C+. Therefore, code that uses the C \s-1API\s0 +will work fine. +.PP +Proper exception specifications might have to be added to callbacks passed +to libev: exceptions may be thrown only from watcher callbacks, all other +callbacks (allocator, syserr, loop acquire/release and periodic reschedule +callbacks) must not throw exceptions, and might need a \f(CW\*(C`noexcept\*(C'\fR +specification. If you have code that needs to be compiled as both C and +\&\*(C+ you can use the \f(CW\*(C`EV_NOEXCEPT\*(C'\fR macro for this: +.PP +.Vb 6 +\& static void +\& fatal_error (const char *msg) EV_NOEXCEPT +\& { +\& perror (msg); +\& abort (); +\& } +\& +\& ... +\& ev_set_syserr_cb (fatal_error); +.Ve +.PP +The only \s-1API\s0 functions that can currently throw exceptions are \f(CW\*(C`ev_run\*(C'\fR, +\&\f(CW\*(C`ev_invoke\*(C'\fR, \f(CW\*(C`ev_invoke_pending\*(C'\fR and \f(CW\*(C`ev_loop_destroy\*(C'\fR (the latter +because it runs cleanup watchers). +.PP +Throwing exceptions in watcher callbacks is only supported if libev itself +is compiled with a \*(C+ compiler or your C and \*(C+ environments allow +throwing exceptions through C libraries (most do). +.SS "\*(C+ \s-1API\s0" +.IX Subsection " API" +Libev comes with some simplistic wrapper classes for \*(C+ that mainly allow +you to use some convenience methods to start/stop watchers and also change +the callback model to a model using method callbacks on objects. +.PP +To use it, +.PP +.Vb 1 +\& #include +.Ve +.PP +This automatically includes \fIev.h\fR and puts all of its definitions (many +of them macros) into the global namespace. All \*(C+ specific things are +put into the \f(CW\*(C`ev\*(C'\fR namespace. It should support all the same embedding +options as \fIev.h\fR, most notably \f(CW\*(C`EV_MULTIPLICITY\*(C'\fR. +.PP +Care has been taken to keep the overhead low. The only data member the \*(C+ +classes add (compared to plain C\-style watchers) is the event loop pointer +that the watcher is associated with (or no additional members at all if +you disable \f(CW\*(C`EV_MULTIPLICITY\*(C'\fR when embedding libev). +.PP +Currently, functions, static and non-static member functions and classes +with \f(CW\*(C`operator ()\*(C'\fR can be used as callbacks. Other types should be easy +to add as long as they only need one additional pointer for context. If +you need support for other types of functors please contact the author +(preferably after implementing it). +.PP +For all this to work, your \*(C+ compiler either has to use the same calling +conventions as your C compiler (for static member functions), or you have +to embed libev and compile libev itself as \*(C+. +.PP +Here is a list of things available in the \f(CW\*(C`ev\*(C'\fR namespace: +.ie n .IP """ev::READ"", ""ev::WRITE"" etc." 4 +.el .IP "\f(CWev::READ\fR, \f(CWev::WRITE\fR etc." 4 +.IX Item "ev::READ, ev::WRITE etc." +These are just enum values with the same values as the \f(CW\*(C`EV_READ\*(C'\fR etc. +macros from \fIev.h\fR. +.ie n .IP """ev::tstamp"", ""ev::now""" 4 +.el .IP "\f(CWev::tstamp\fR, \f(CWev::now\fR" 4 +.IX Item "ev::tstamp, ev::now" +Aliases to the same types/functions as with the \f(CW\*(C`ev_\*(C'\fR prefix. +.ie n .IP """ev::io"", ""ev::timer"", ""ev::periodic"", ""ev::idle"", ""ev::sig"" etc." 4 +.el .IP "\f(CWev::io\fR, \f(CWev::timer\fR, \f(CWev::periodic\fR, \f(CWev::idle\fR, \f(CWev::sig\fR etc." 4 +.IX Item "ev::io, ev::timer, ev::periodic, ev::idle, ev::sig etc." +For each \f(CW\*(C`ev_TYPE\*(C'\fR watcher in \fIev.h\fR there is a corresponding class of +the same name in the \f(CW\*(C`ev\*(C'\fR namespace, with the exception of \f(CW\*(C`ev_signal\*(C'\fR +which is called \f(CW\*(C`ev::sig\*(C'\fR to avoid clashes with the \f(CW\*(C`signal\*(C'\fR macro +defined by many implementations. +.Sp +All of those classes have these methods: +.RS 4 +.IP "ev::TYPE::TYPE ()" 4 +.IX Item "ev::TYPE::TYPE ()" +.PD 0 +.IP "ev::TYPE::TYPE (loop)" 4 +.IX Item "ev::TYPE::TYPE (loop)" +.IP "ev::TYPE::~TYPE" 4 +.IX Item "ev::TYPE::~TYPE" +.PD +The constructor (optionally) takes an event loop to associate the watcher +with. If it is omitted, it will use \f(CW\*(C`EV_DEFAULT\*(C'\fR. +.Sp +The constructor calls \f(CW\*(C`ev_init\*(C'\fR for you, which means you have to call the +\&\f(CW\*(C`set\*(C'\fR method before starting it. +.Sp +It will not set a callback, however: You have to call the templated \f(CW\*(C`set\*(C'\fR +method to set a callback before you can start the watcher. +.Sp +(The reason why you have to use a method is a limitation in \*(C+ which does +not allow explicit template arguments for constructors). +.Sp +The destructor automatically stops the watcher if it is active. +.IP "w\->set (object *)" 4 +.IX Item "w->set (object *)" +This method sets the callback method to call. The method has to have a +signature of \f(CW\*(C`void (*)(ev_TYPE &, int)\*(C'\fR, it receives the watcher as +first argument and the \f(CW\*(C`revents\*(C'\fR as second. The object must be given as +parameter and is stored in the \f(CW\*(C`data\*(C'\fR member of the watcher. +.Sp +This method synthesizes efficient thunking code to call your method from +the C callback that libev requires. If your compiler can inline your +callback (i.e. it is visible to it at the place of the \f(CW\*(C`set\*(C'\fR call and +your compiler is good :), then the method will be fully inlined into the +thunking function, making it as fast as a direct C callback. +.Sp +Example: simple class declaration and watcher initialisation +.Sp +.Vb 4 +\& struct myclass +\& { +\& void io_cb (ev::io &w, int revents) { } +\& } +\& +\& myclass obj; +\& ev::io iow; +\& iow.set (&obj); +.Ve +.IP "w\->set (object *)" 4 +.IX Item "w->set (object *)" +This is a variation of a method callback \- leaving out the method to call +will default the method to \f(CW\*(C`operator ()\*(C'\fR, which makes it possible to use +functor objects without having to manually specify the \f(CW\*(C`operator ()\*(C'\fR all +the time. Incidentally, you can then also leave out the template argument +list. +.Sp +The \f(CW\*(C`operator ()\*(C'\fR method prototype must be \f(CW\*(C`void operator ()(watcher &w, +int revents)\*(C'\fR. +.Sp +See the method\-\f(CW\*(C`set\*(C'\fR above for more details. +.Sp +Example: use a functor object as callback. +.Sp +.Vb 7 +\& struct myfunctor +\& { +\& void operator() (ev::io &w, int revents) +\& { +\& ... +\& } +\& } +\& +\& myfunctor f; +\& +\& ev::io w; +\& w.set (&f); +.Ve +.IP "w\->set (void *data = 0)" 4 +.IX Item "w->set (void *data = 0)" +Also sets a callback, but uses a static method or plain function as +callback. The optional \f(CW\*(C`data\*(C'\fR argument will be stored in the watcher's +\&\f(CW\*(C`data\*(C'\fR member and is free for you to use. +.Sp +The prototype of the \f(CW\*(C`function\*(C'\fR must be \f(CW\*(C`void (*)(ev::TYPE &w, int)\*(C'\fR. +.Sp +See the method\-\f(CW\*(C`set\*(C'\fR above for more details. +.Sp +Example: Use a plain function as callback. +.Sp +.Vb 2 +\& static void io_cb (ev::io &w, int revents) { } +\& iow.set (); +.Ve +.IP "w\->set (loop)" 4 +.IX Item "w->set (loop)" +Associates a different \f(CW\*(C`struct ev_loop\*(C'\fR with this watcher. You can only +do this when the watcher is inactive (and not pending either). +.IP "w\->set ([arguments])" 4 +.IX Item "w->set ([arguments])" +Basically the same as \f(CW\*(C`ev_TYPE_set\*(C'\fR (except for \f(CW\*(C`ev::embed\*(C'\fR watchers>), +with the same arguments. Either this method or a suitable start method +must be called at least once. Unlike the C counterpart, an active watcher +gets automatically stopped and restarted when reconfiguring it with this +method. +.Sp +For \f(CW\*(C`ev::embed\*(C'\fR watchers this method is called \f(CW\*(C`set_embed\*(C'\fR, to avoid +clashing with the \f(CW\*(C`set (loop)\*(C'\fR method. +.Sp +For \f(CW\*(C`ev::io\*(C'\fR watchers there is an additional \f(CW\*(C`set\*(C'\fR method that acepts a +new event mask only, and internally calls \f(CW\*(C`ev_io_modfify\*(C'\fR. +.IP "w\->start ()" 4 +.IX Item "w->start ()" +Starts the watcher. Note that there is no \f(CW\*(C`loop\*(C'\fR argument, as the +constructor already stores the event loop. +.IP "w\->start ([arguments])" 4 +.IX Item "w->start ([arguments])" +Instead of calling \f(CW\*(C`set\*(C'\fR and \f(CW\*(C`start\*(C'\fR methods separately, it is often +convenient to wrap them in one call. Uses the same type of arguments as +the configure \f(CW\*(C`set\*(C'\fR method of the watcher. +.IP "w\->stop ()" 4 +.IX Item "w->stop ()" +Stops the watcher if it is active. Again, no \f(CW\*(C`loop\*(C'\fR argument. +.ie n .IP "w\->again () (""ev::timer"", ""ev::periodic"" only)" 4 +.el .IP "w\->again () (\f(CWev::timer\fR, \f(CWev::periodic\fR only)" 4 +.IX Item "w->again () (ev::timer, ev::periodic only)" +For \f(CW\*(C`ev::timer\*(C'\fR and \f(CW\*(C`ev::periodic\*(C'\fR, this invokes the corresponding +\&\f(CW\*(C`ev_TYPE_again\*(C'\fR function. +.ie n .IP "w\->sweep () (""ev::embed"" only)" 4 +.el .IP "w\->sweep () (\f(CWev::embed\fR only)" 4 +.IX Item "w->sweep () (ev::embed only)" +Invokes \f(CW\*(C`ev_embed_sweep\*(C'\fR. +.ie n .IP "w\->update () (""ev::stat"" only)" 4 +.el .IP "w\->update () (\f(CWev::stat\fR only)" 4 +.IX Item "w->update () (ev::stat only)" +Invokes \f(CW\*(C`ev_stat_stat\*(C'\fR. +.RE +.RS 4 +.RE +.PP +Example: Define a class with two I/O and idle watchers, start the I/O +watchers in the constructor. +.PP +.Vb 5 +\& class myclass +\& { +\& ev::io io ; void io_cb (ev::io &w, int revents); +\& ev::io io2 ; void io2_cb (ev::io &w, int revents); +\& ev::idle idle; void idle_cb (ev::idle &w, int revents); +\& +\& myclass (int fd) +\& { +\& io .set (this); +\& io2 .set (this); +\& idle.set (this); +\& +\& io.set (fd, ev::WRITE); // configure the watcher +\& io.start (); // start it whenever convenient +\& +\& io2.start (fd, ev::READ); // set + start in one call +\& } +\& }; +.Ve +.SH "OTHER LANGUAGE BINDINGS" +.IX Header "OTHER LANGUAGE BINDINGS" +Libev does not offer other language bindings itself, but bindings for a +number of languages exist in the form of third-party packages. If you know +any interesting language binding in addition to the ones listed here, drop +me a note. +.IP "Perl" 4 +.IX Item "Perl" +The \s-1EV\s0 module implements the full libev \s-1API\s0 and is actually used to test +libev. \s-1EV\s0 is developed together with libev. Apart from the \s-1EV\s0 core module, +there are additional modules that implement libev-compatible interfaces +to \f(CW\*(C`libadns\*(C'\fR (\f(CW\*(C`EV::ADNS\*(C'\fR, but \f(CW\*(C`AnyEvent::DNS\*(C'\fR is preferred nowadays), +\&\f(CW\*(C`Net::SNMP\*(C'\fR (\f(CW\*(C`Net::SNMP::EV\*(C'\fR) and the \f(CW\*(C`libglib\*(C'\fR event core (\f(CW\*(C`Glib::EV\*(C'\fR +and \f(CW\*(C`EV::Glib\*(C'\fR). +.Sp +It can be found and installed via \s-1CPAN,\s0 its homepage is at +. +.IP "Python" 4 +.IX Item "Python" +Python bindings can be found at . It +seems to be quite complete and well-documented. +.IP "Ruby" 4 +.IX Item "Ruby" +Tony Arcieri has written a ruby extension that offers access to a subset +of the libev \s-1API\s0 and adds file handle abstractions, asynchronous \s-1DNS\s0 and +more on top of it. It can be found via gem servers. Its homepage is at +. +.Sp +Roger Pack reports that using the link order \f(CW\*(C`\-lws2_32 \-lmsvcrt\-ruby\-190\*(C'\fR +makes rev work even on mingw. +.IP "Haskell" 4 +.IX Item "Haskell" +A haskell binding to libev is available at +. +.IP "D" 4 +.IX Item "D" +Leandro Lucarella has written a D language binding (\fIev.d\fR) for libev, to +be found at . +.IP "Ocaml" 4 +.IX Item "Ocaml" +Erkki Seppala has written Ocaml bindings for libev, to be found at +. +.IP "Lua" 4 +.IX Item "Lua" +Brian Maher has written a partial interface to libev for lua (at the +time of this writing, only \f(CW\*(C`ev_io\*(C'\fR and \f(CW\*(C`ev_timer\*(C'\fR), to be found at +. +.IP "Javascript" 4 +.IX Item "Javascript" +Node.js () uses libev as the underlying event library. +.IP "Others" 4 +.IX Item "Others" +There are others, and I stopped counting. +.SH "MACRO MAGIC" +.IX Header "MACRO MAGIC" +Libev can be compiled with a variety of options, the most fundamental +of which is \f(CW\*(C`EV_MULTIPLICITY\*(C'\fR. This option determines whether (most) +functions and callbacks have an initial \f(CW\*(C`struct ev_loop *\*(C'\fR argument. +.PP +To make it easier to write programs that cope with either variant, the +following macros are defined: +.ie n .IP """EV_A"", ""EV_A_""" 4 +.el .IP "\f(CWEV_A\fR, \f(CWEV_A_\fR" 4 +.IX Item "EV_A, EV_A_" +This provides the loop \fIargument\fR for functions, if one is required (\*(L"ev +loop argument\*(R"). The \f(CW\*(C`EV_A\*(C'\fR form is used when this is the sole argument, +\&\f(CW\*(C`EV_A_\*(C'\fR is used when other arguments are following. Example: +.Sp +.Vb 3 +\& ev_unref (EV_A); +\& ev_timer_add (EV_A_ watcher); +\& ev_run (EV_A_ 0); +.Ve +.Sp +It assumes the variable \f(CW\*(C`loop\*(C'\fR of type \f(CW\*(C`struct ev_loop *\*(C'\fR is in scope, +which is often provided by the following macro. +.ie n .IP """EV_P"", ""EV_P_""" 4 +.el .IP "\f(CWEV_P\fR, \f(CWEV_P_\fR" 4 +.IX Item "EV_P, EV_P_" +This provides the loop \fIparameter\fR for functions, if one is required (\*(L"ev +loop parameter\*(R"). The \f(CW\*(C`EV_P\*(C'\fR form is used when this is the sole parameter, +\&\f(CW\*(C`EV_P_\*(C'\fR is used when other parameters are following. Example: +.Sp +.Vb 2 +\& // this is how ev_unref is being declared +\& static void ev_unref (EV_P); +\& +\& // this is how you can declare your typical callback +\& static void cb (EV_P_ ev_timer *w, int revents) +.Ve +.Sp +It declares a parameter \f(CW\*(C`loop\*(C'\fR of type \f(CW\*(C`struct ev_loop *\*(C'\fR, quite +suitable for use with \f(CW\*(C`EV_A\*(C'\fR. +.ie n .IP """EV_DEFAULT"", ""EV_DEFAULT_""" 4 +.el .IP "\f(CWEV_DEFAULT\fR, \f(CWEV_DEFAULT_\fR" 4 +.IX Item "EV_DEFAULT, EV_DEFAULT_" +Similar to the other two macros, this gives you the value of the default +loop, if multiple loops are supported (\*(L"ev loop default\*(R"). The default loop +will be initialised if it isn't already initialised. +.Sp +For non-multiplicity builds, these macros do nothing, so you always have +to initialise the loop somewhere. +.ie n .IP """EV_DEFAULT_UC"", ""EV_DEFAULT_UC_""" 4 +.el .IP "\f(CWEV_DEFAULT_UC\fR, \f(CWEV_DEFAULT_UC_\fR" 4 +.IX Item "EV_DEFAULT_UC, EV_DEFAULT_UC_" +Usage identical to \f(CW\*(C`EV_DEFAULT\*(C'\fR and \f(CW\*(C`EV_DEFAULT_\*(C'\fR, but requires that the +default loop has been initialised (\f(CW\*(C`UC\*(C'\fR == unchecked). Their behaviour +is undefined when the default loop has not been initialised by a previous +execution of \f(CW\*(C`EV_DEFAULT\*(C'\fR, \f(CW\*(C`EV_DEFAULT_\*(C'\fR or \f(CW\*(C`ev_default_init (...)\*(C'\fR. +.Sp +It is often prudent to use \f(CW\*(C`EV_DEFAULT\*(C'\fR when initialising the first +watcher in a function but use \f(CW\*(C`EV_DEFAULT_UC\*(C'\fR afterwards. +.PP +Example: Declare and initialise a check watcher, utilising the above +macros so it will work regardless of whether multiple loops are supported +or not. +.PP +.Vb 5 +\& static void +\& check_cb (EV_P_ ev_timer *w, int revents) +\& { +\& ev_check_stop (EV_A_ w); +\& } +\& +\& ev_check check; +\& ev_check_init (&check, check_cb); +\& ev_check_start (EV_DEFAULT_ &check); +\& ev_run (EV_DEFAULT_ 0); +.Ve +.SH "EMBEDDING" +.IX Header "EMBEDDING" +Libev can (and often is) directly embedded into host +applications. Examples of applications that embed it include the Deliantra +Game Server, the \s-1EV\s0 perl module, the \s-1GNU\s0 Virtual Private Ethernet (gvpe) +and rxvt-unicode. +.PP +The goal is to enable you to just copy the necessary files into your +source directory without having to change even a single line in them, so +you can easily upgrade by simply copying (or having a checked-out copy of +libev somewhere in your source tree). +.SS "\s-1FILESETS\s0" +.IX Subsection "FILESETS" +Depending on what features you need you need to include one or more sets of files +in your application. +.PP +\fI\s-1CORE EVENT LOOP\s0\fR +.IX Subsection "CORE EVENT LOOP" +.PP +To include only the libev core (all the \f(CW\*(C`ev_*\*(C'\fR functions), with manual +configuration (no autoconf): +.PP +.Vb 2 +\& #define EV_STANDALONE 1 +\& #include "ev.c" +.Ve +.PP +This will automatically include \fIev.h\fR, too, and should be done in a +single C source file only to provide the function implementations. To use +it, do the same for \fIev.h\fR in all files wishing to use this \s-1API\s0 (best +done by writing a wrapper around \fIev.h\fR that you can include instead and +where you can put other configuration options): +.PP +.Vb 2 +\& #define EV_STANDALONE 1 +\& #include "ev.h" +.Ve +.PP +Both header files and implementation files can be compiled with a \*(C+ +compiler (at least, that's a stated goal, and breakage will be treated +as a bug). +.PP +You need the following files in your source tree, or in a directory +in your include path (e.g. in libev/ when using \-Ilibev): +.PP +.Vb 4 +\& ev.h +\& ev.c +\& ev_vars.h +\& ev_wrap.h +\& +\& ev_win32.c required on win32 platforms only +\& +\& ev_select.c only when select backend is enabled +\& ev_poll.c only when poll backend is enabled +\& ev_epoll.c only when the epoll backend is enabled +\& ev_linuxaio.c only when the linux aio backend is enabled +\& ev_iouring.c only when the linux io_uring backend is enabled +\& ev_kqueue.c only when the kqueue backend is enabled +\& ev_port.c only when the solaris port backend is enabled +.Ve +.PP +\&\fIev.c\fR includes the backend files directly when enabled, so you only need +to compile this single file. +.PP +\fI\s-1LIBEVENT COMPATIBILITY API\s0\fR +.IX Subsection "LIBEVENT COMPATIBILITY API" +.PP +To include the libevent compatibility \s-1API,\s0 also include: +.PP +.Vb 1 +\& #include "event.c" +.Ve +.PP +in the file including \fIev.c\fR, and: +.PP +.Vb 1 +\& #include "event.h" +.Ve +.PP +in the files that want to use the libevent \s-1API.\s0 This also includes \fIev.h\fR. +.PP +You need the following additional files for this: +.PP +.Vb 2 +\& event.h +\& event.c +.Ve +.PP +\fI\s-1AUTOCONF SUPPORT\s0\fR +.IX Subsection "AUTOCONF SUPPORT" +.PP +Instead of using \f(CW\*(C`EV_STANDALONE=1\*(C'\fR and providing your configuration in +whatever way you want, you can also \f(CW\*(C`m4_include([libev.m4])\*(C'\fR in your +\&\fIconfigure.ac\fR and leave \f(CW\*(C`EV_STANDALONE\*(C'\fR undefined. \fIev.c\fR will then +include \fIconfig.h\fR and configure itself accordingly. +.PP +For this of course you need the m4 file: +.PP +.Vb 1 +\& libev.m4 +.Ve +.SS "\s-1PREPROCESSOR SYMBOLS/MACROS\s0" +.IX Subsection "PREPROCESSOR SYMBOLS/MACROS" +Libev can be configured via a variety of preprocessor symbols you have to +define before including (or compiling) any of its files. The default in +the absence of autoconf is documented for every option. +.PP +Symbols marked with \*(L"(h)\*(R" do not change the \s-1ABI,\s0 and can have different +values when compiling libev vs. including \fIev.h\fR, so it is permissible +to redefine them before including \fIev.h\fR without breaking compatibility +to a compiled library. All other symbols change the \s-1ABI,\s0 which means all +users of libev and the libev code itself must be compiled with compatible +settings. +.IP "\s-1EV_COMPAT3\s0 (h)" 4 +.IX Item "EV_COMPAT3 (h)" +Backwards compatibility is a major concern for libev. This is why this +release of libev comes with wrappers for the functions and symbols that +have been renamed between libev version 3 and 4. +.Sp +You can disable these wrappers (to test compatibility with future +versions) by defining \f(CW\*(C`EV_COMPAT3\*(C'\fR to \f(CW0\fR when compiling your +sources. This has the additional advantage that you can drop the \f(CW\*(C`struct\*(C'\fR +from \f(CW\*(C`struct ev_loop\*(C'\fR declarations, as libev will provide an \f(CW\*(C`ev_loop\*(C'\fR +typedef in that case. +.Sp +In some future version, the default for \f(CW\*(C`EV_COMPAT3\*(C'\fR will become \f(CW0\fR, +and in some even more future version the compatibility code will be +removed completely. +.IP "\s-1EV_STANDALONE\s0 (h)" 4 +.IX Item "EV_STANDALONE (h)" +Must always be \f(CW1\fR if you do not use autoconf configuration, which +keeps libev from including \fIconfig.h\fR, and it also defines dummy +implementations for some libevent functions (such as logging, which is not +supported). It will also not define any of the structs usually found in +\&\fIevent.h\fR that are not directly supported by the libev core alone. +.Sp +In standalone mode, libev will still try to automatically deduce the +configuration, but has to be more conservative. +.IP "\s-1EV_USE_FLOOR\s0" 4 +.IX Item "EV_USE_FLOOR" +If defined to be \f(CW1\fR, libev will use the \f(CW\*(C`floor ()\*(C'\fR function for its +periodic reschedule calculations, otherwise libev will fall back on a +portable (slower) implementation. If you enable this, you usually have to +link against libm or something equivalent. Enabling this when the \f(CW\*(C`floor\*(C'\fR +function is not available will fail, so the safe default is to not enable +this. +.IP "\s-1EV_USE_MONOTONIC\s0" 4 +.IX Item "EV_USE_MONOTONIC" +If defined to be \f(CW1\fR, libev will try to detect the availability of the +monotonic clock option at both compile time and runtime. Otherwise no +use of the monotonic clock option will be attempted. If you enable this, +you usually have to link against librt or something similar. Enabling it +when the functionality isn't available is safe, though, although you have +to make sure you link against any libraries where the \f(CW\*(C`clock_gettime\*(C'\fR +function is hiding in (often \fI\-lrt\fR). See also \f(CW\*(C`EV_USE_CLOCK_SYSCALL\*(C'\fR. +.IP "\s-1EV_USE_REALTIME\s0" 4 +.IX Item "EV_USE_REALTIME" +If defined to be \f(CW1\fR, libev will try to detect the availability of the +real-time clock option at compile time (and assume its availability +at runtime if successful). Otherwise no use of the real-time clock +option will be attempted. This effectively replaces \f(CW\*(C`gettimeofday\*(C'\fR +by \f(CW\*(C`clock_get (CLOCK_REALTIME, ...)\*(C'\fR and will not normally affect +correctness. See the note about libraries in the description of +\&\f(CW\*(C`EV_USE_MONOTONIC\*(C'\fR, though. Defaults to the opposite value of +\&\f(CW\*(C`EV_USE_CLOCK_SYSCALL\*(C'\fR. +.IP "\s-1EV_USE_CLOCK_SYSCALL\s0" 4 +.IX Item "EV_USE_CLOCK_SYSCALL" +If defined to be \f(CW1\fR, libev will try to use a direct syscall instead +of calling the system-provided \f(CW\*(C`clock_gettime\*(C'\fR function. This option +exists because on GNU/Linux, \f(CW\*(C`clock_gettime\*(C'\fR is in \f(CW\*(C`librt\*(C'\fR, but \f(CW\*(C`librt\*(C'\fR +unconditionally pulls in \f(CW\*(C`libpthread\*(C'\fR, slowing down single-threaded +programs needlessly. Using a direct syscall is slightly slower (in +theory), because no optimised vdso implementation can be used, but avoids +the pthread dependency. Defaults to \f(CW1\fR on GNU/Linux with glibc 2.x or +higher, as it simplifies linking (no need for \f(CW\*(C`\-lrt\*(C'\fR). +.IP "\s-1EV_USE_NANOSLEEP\s0" 4 +.IX Item "EV_USE_NANOSLEEP" +If defined to be \f(CW1\fR, libev will assume that \f(CW\*(C`nanosleep ()\*(C'\fR is available +and will use it for delays. Otherwise it will use \f(CW\*(C`select ()\*(C'\fR. +.IP "\s-1EV_USE_EVENTFD\s0" 4 +.IX Item "EV_USE_EVENTFD" +If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`eventfd ()\*(C'\fR is +available and will probe for kernel support at runtime. This will improve +\&\f(CW\*(C`ev_signal\*(C'\fR and \f(CW\*(C`ev_async\*(C'\fR performance and reduce resource consumption. +If undefined, it will be enabled if the headers indicate GNU/Linux + Glibc +2.7 or newer, otherwise disabled. +.IP "\s-1EV_USE_SIGNALFD\s0" 4 +.IX Item "EV_USE_SIGNALFD" +If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`signalfd ()\*(C'\fR is +available and will probe for kernel support at runtime. This enables +the use of \s-1EVFLAG_SIGNALFD\s0 for faster and simpler signal handling. If +undefined, it will be enabled if the headers indicate GNU/Linux + Glibc +2.7 or newer, otherwise disabled. +.IP "\s-1EV_USE_TIMERFD\s0" 4 +.IX Item "EV_USE_TIMERFD" +If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`timerfd ()\*(C'\fR is +available and will probe for kernel support at runtime. This allows +libev to detect time jumps accurately. If undefined, it will be enabled +if the headers indicate GNU/Linux + Glibc 2.8 or newer and define +\&\f(CW\*(C`TFD_TIMER_CANCEL_ON_SET\*(C'\fR, otherwise disabled. +.IP "\s-1EV_USE_EVENTFD\s0" 4 +.IX Item "EV_USE_EVENTFD" +If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`eventfd ()\*(C'\fR is +available and will probe for kernel support at runtime. This will improve +\&\f(CW\*(C`ev_signal\*(C'\fR and \f(CW\*(C`ev_async\*(C'\fR performance and reduce resource consumption. +If undefined, it will be enabled if the headers indicate GNU/Linux + Glibc +2.7 or newer, otherwise disabled. +.IP "\s-1EV_USE_SELECT\s0" 4 +.IX Item "EV_USE_SELECT" +If undefined or defined to be \f(CW1\fR, libev will compile in support for the +\&\f(CW\*(C`select\*(C'\fR(2) backend. No attempt at auto-detection will be done: if no +other method takes over, select will be it. Otherwise the select backend +will not be compiled in. +.IP "\s-1EV_SELECT_USE_FD_SET\s0" 4 +.IX Item "EV_SELECT_USE_FD_SET" +If defined to \f(CW1\fR, then the select backend will use the system \f(CW\*(C`fd_set\*(C'\fR +structure. This is useful if libev doesn't compile due to a missing +\&\f(CW\*(C`NFDBITS\*(C'\fR or \f(CW\*(C`fd_mask\*(C'\fR definition or it mis-guesses the bitset layout +on exotic systems. This usually limits the range of file descriptors to +some low limit such as 1024 or might have other limitations (winsocket +only allows 64 sockets). The \f(CW\*(C`FD_SETSIZE\*(C'\fR macro, set before compilation, +configures the maximum size of the \f(CW\*(C`fd_set\*(C'\fR. +.IP "\s-1EV_SELECT_IS_WINSOCKET\s0" 4 +.IX Item "EV_SELECT_IS_WINSOCKET" +When defined to \f(CW1\fR, the select backend will assume that +select/socket/connect etc. don't understand file descriptors but +wants osf handles on win32 (this is the case when the select to +be used is the winsock select). This means that it will call +\&\f(CW\*(C`_get_osfhandle\*(C'\fR on the fd to convert it to an \s-1OS\s0 handle. Otherwise, +it is assumed that all these functions actually work on fds, even +on win32. Should not be defined on non\-win32 platforms. +.IP "\s-1EV_FD_TO_WIN32_HANDLE\s0(fd)" 4 +.IX Item "EV_FD_TO_WIN32_HANDLE(fd)" +If \f(CW\*(C`EV_SELECT_IS_WINSOCKET\*(C'\fR is enabled, then libev needs a way to map +file descriptors to socket handles. When not defining this symbol (the +default), then libev will call \f(CW\*(C`_get_osfhandle\*(C'\fR, which is usually +correct. In some cases, programs use their own file descriptor management, +in which case they can provide this function to map fds to socket handles. +.IP "\s-1EV_WIN32_HANDLE_TO_FD\s0(handle)" 4 +.IX Item "EV_WIN32_HANDLE_TO_FD(handle)" +If \f(CW\*(C`EV_SELECT_IS_WINSOCKET\*(C'\fR then libev maps handles to file descriptors +using the standard \f(CW\*(C`_open_osfhandle\*(C'\fR function. For programs implementing +their own fd to handle mapping, overwriting this function makes it easier +to do so. This can be done by defining this macro to an appropriate value. +.IP "\s-1EV_WIN32_CLOSE_FD\s0(fd)" 4 +.IX Item "EV_WIN32_CLOSE_FD(fd)" +If programs implement their own fd to handle mapping on win32, then this +macro can be used to override the \f(CW\*(C`close\*(C'\fR function, useful to unregister +file descriptors again. Note that the replacement function has to close +the underlying \s-1OS\s0 handle. +.IP "\s-1EV_USE_WSASOCKET\s0" 4 +.IX Item "EV_USE_WSASOCKET" +If defined to be \f(CW1\fR, libev will use \f(CW\*(C`WSASocket\*(C'\fR to create its internal +communication socket, which works better in some environments. Otherwise, +the normal \f(CW\*(C`socket\*(C'\fR function will be used, which works better in other +environments. +.IP "\s-1EV_USE_POLL\s0" 4 +.IX Item "EV_USE_POLL" +If defined to be \f(CW1\fR, libev will compile in support for the \f(CW\*(C`poll\*(C'\fR(2) +backend. Otherwise it will be enabled on non\-win32 platforms. It +takes precedence over select. +.IP "\s-1EV_USE_EPOLL\s0" 4 +.IX Item "EV_USE_EPOLL" +If defined to be \f(CW1\fR, libev will compile in support for the Linux +\&\f(CW\*(C`epoll\*(C'\fR(7) backend. Its availability will be detected at runtime, +otherwise another method will be used as fallback. This is the preferred +backend for GNU/Linux systems. If undefined, it will be enabled if the +headers indicate GNU/Linux + Glibc 2.4 or newer, otherwise disabled. +.IP "\s-1EV_USE_LINUXAIO\s0" 4 +.IX Item "EV_USE_LINUXAIO" +If defined to be \f(CW1\fR, libev will compile in support for the Linux aio +backend (\f(CW\*(C`EV_USE_EPOLL\*(C'\fR must also be enabled). If undefined, it will be +enabled on linux, otherwise disabled. +.IP "\s-1EV_USE_IOURING\s0" 4 +.IX Item "EV_USE_IOURING" +If defined to be \f(CW1\fR, libev will compile in support for the Linux +io_uring backend (\f(CW\*(C`EV_USE_EPOLL\*(C'\fR must also be enabled). Due to it's +current limitations it has to be requested explicitly. If undefined, it +will be enabled on linux, otherwise disabled. +.IP "\s-1EV_USE_KQUEUE\s0" 4 +.IX Item "EV_USE_KQUEUE" +If defined to be \f(CW1\fR, libev will compile in support for the \s-1BSD\s0 style +\&\f(CW\*(C`kqueue\*(C'\fR(2) backend. Its actual availability will be detected at runtime, +otherwise another method will be used as fallback. This is the preferred +backend for \s-1BSD\s0 and BSD-like systems, although on most BSDs kqueue only +supports some types of fds correctly (the only platform we found that +supports ptys for example was NetBSD), so kqueue might be compiled in, but +not be used unless explicitly requested. The best way to use it is to find +out whether kqueue supports your type of fd properly and use an embedded +kqueue loop. +.IP "\s-1EV_USE_PORT\s0" 4 +.IX Item "EV_USE_PORT" +If defined to be \f(CW1\fR, libev will compile in support for the Solaris +10 port style backend. Its availability will be detected at runtime, +otherwise another method will be used as fallback. This is the preferred +backend for Solaris 10 systems. +.IP "\s-1EV_USE_DEVPOLL\s0" 4 +.IX Item "EV_USE_DEVPOLL" +Reserved for future expansion, works like the \s-1USE\s0 symbols above. +.IP "\s-1EV_USE_INOTIFY\s0" 4 +.IX Item "EV_USE_INOTIFY" +If defined to be \f(CW1\fR, libev will compile in support for the Linux inotify +interface to speed up \f(CW\*(C`ev_stat\*(C'\fR watchers. Its actual availability will +be detected at runtime. If undefined, it will be enabled if the headers +indicate GNU/Linux + Glibc 2.4 or newer, otherwise disabled. +.IP "\s-1EV_NO_SMP\s0" 4 +.IX Item "EV_NO_SMP" +If defined to be \f(CW1\fR, libev will assume that memory is always coherent +between threads, that is, threads can be used, but threads never run on +different cpus (or different cpu cores). This reduces dependencies +and makes libev faster. +.IP "\s-1EV_NO_THREADS\s0" 4 +.IX Item "EV_NO_THREADS" +If defined to be \f(CW1\fR, libev will assume that it will never be called from +different threads (that includes signal handlers), which is a stronger +assumption than \f(CW\*(C`EV_NO_SMP\*(C'\fR, above. This reduces dependencies and makes +libev faster. +.IP "\s-1EV_ATOMIC_T\s0" 4 +.IX Item "EV_ATOMIC_T" +Libev requires an integer type (suitable for storing \f(CW0\fR or \f(CW1\fR) whose +access is atomic with respect to other threads or signal contexts. No +such type is easily found in the C language, so you can provide your own +type that you know is safe for your purposes. It is used both for signal +handler \*(L"locking\*(R" as well as for signal and thread safety in \f(CW\*(C`ev_async\*(C'\fR +watchers. +.Sp +In the absence of this define, libev will use \f(CW\*(C`sig_atomic_t volatile\*(C'\fR +(from \fIsignal.h\fR), which is usually good enough on most platforms. +.IP "\s-1EV_H\s0 (h)" 4 +.IX Item "EV_H (h)" +The name of the \fIev.h\fR header file used to include it. The default if +undefined is \f(CW"ev.h"\fR in \fIevent.h\fR, \fIev.c\fR and \fIev++.h\fR. This can be +used to virtually rename the \fIev.h\fR header file in case of conflicts. +.IP "\s-1EV_CONFIG_H\s0 (h)" 4 +.IX Item "EV_CONFIG_H (h)" +If \f(CW\*(C`EV_STANDALONE\*(C'\fR isn't \f(CW1\fR, this variable can be used to override +\&\fIev.c\fR's idea of where to find the \fIconfig.h\fR file, similarly to +\&\f(CW\*(C`EV_H\*(C'\fR, above. +.IP "\s-1EV_EVENT_H\s0 (h)" 4 +.IX Item "EV_EVENT_H (h)" +Similarly to \f(CW\*(C`EV_H\*(C'\fR, this macro can be used to override \fIevent.c\fR's idea +of how the \fIevent.h\fR header can be found, the default is \f(CW"event.h"\fR. +.IP "\s-1EV_PROTOTYPES\s0 (h)" 4 +.IX Item "EV_PROTOTYPES (h)" +If defined to be \f(CW0\fR, then \fIev.h\fR will not define any function +prototypes, but still define all the structs and other symbols. This is +occasionally useful if you want to provide your own wrapper functions +around libev functions. +.IP "\s-1EV_MULTIPLICITY\s0" 4 +.IX Item "EV_MULTIPLICITY" +If undefined or defined to \f(CW1\fR, then all event-loop-specific functions +will have the \f(CW\*(C`struct ev_loop *\*(C'\fR as first argument, and you can create +additional independent event loops. Otherwise there will be no support +for multiple event loops and there is no first event loop pointer +argument. Instead, all functions act on the single default loop. +.Sp +Note that \f(CW\*(C`EV_DEFAULT\*(C'\fR and \f(CW\*(C`EV_DEFAULT_\*(C'\fR will no longer provide a +default loop when multiplicity is switched off \- you always have to +initialise the loop manually in this case. +.IP "\s-1EV_MINPRI\s0" 4 +.IX Item "EV_MINPRI" +.PD 0 +.IP "\s-1EV_MAXPRI\s0" 4 +.IX Item "EV_MAXPRI" +.PD +The range of allowed priorities. \f(CW\*(C`EV_MINPRI\*(C'\fR must be smaller or equal to +\&\f(CW\*(C`EV_MAXPRI\*(C'\fR, but otherwise there are no non-obvious limitations. You can +provide for more priorities by overriding those symbols (usually defined +to be \f(CW\*(C`\-2\*(C'\fR and \f(CW2\fR, respectively). +.Sp +When doing priority-based operations, libev usually has to linearly search +all the priorities, so having many of them (hundreds) uses a lot of space +and time, so using the defaults of five priorities (\-2 .. +2) is usually +fine. +.Sp +If your embedding application does not need any priorities, defining these +both to \f(CW0\fR will save some memory and \s-1CPU.\s0 +.IP "\s-1EV_PERIODIC_ENABLE, EV_IDLE_ENABLE, EV_EMBED_ENABLE, EV_STAT_ENABLE, EV_PREPARE_ENABLE, EV_CHECK_ENABLE, EV_FORK_ENABLE, EV_SIGNAL_ENABLE, EV_ASYNC_ENABLE, EV_CHILD_ENABLE.\s0" 4 +.IX Item "EV_PERIODIC_ENABLE, EV_IDLE_ENABLE, EV_EMBED_ENABLE, EV_STAT_ENABLE, EV_PREPARE_ENABLE, EV_CHECK_ENABLE, EV_FORK_ENABLE, EV_SIGNAL_ENABLE, EV_ASYNC_ENABLE, EV_CHILD_ENABLE." +If undefined or defined to be \f(CW1\fR (and the platform supports it), then +the respective watcher type is supported. If defined to be \f(CW0\fR, then it +is not. Disabling watcher types mainly saves code size. +.IP "\s-1EV_FEATURES\s0" 4 +.IX Item "EV_FEATURES" +If you need to shave off some kilobytes of code at the expense of some +speed (but with the full \s-1API\s0), you can define this symbol to request +certain subsets of functionality. The default is to enable all features +that can be enabled on the platform. +.Sp +A typical way to use this symbol is to define it to \f(CW0\fR (or to a bitset +with some broad features you want) and then selectively re-enable +additional parts you want, for example if you want everything minimal, +but multiple event loop support, async and child watchers and the poll +backend, use this: +.Sp +.Vb 5 +\& #define EV_FEATURES 0 +\& #define EV_MULTIPLICITY 1 +\& #define EV_USE_POLL 1 +\& #define EV_CHILD_ENABLE 1 +\& #define EV_ASYNC_ENABLE 1 +.Ve +.Sp +The actual value is a bitset, it can be a combination of the following +values (by default, all of these are enabled): +.RS 4 +.ie n .IP "1 \- faster/larger code" 4 +.el .IP "\f(CW1\fR \- faster/larger code" 4 +.IX Item "1 - faster/larger code" +Use larger code to speed up some operations. +.Sp +Currently this is used to override some inlining decisions (enlarging the +code size by roughly 30% on amd64). +.Sp +When optimising for size, use of compiler flags such as \f(CW\*(C`\-Os\*(C'\fR with +gcc is recommended, as well as \f(CW\*(C`\-DNDEBUG\*(C'\fR, as libev contains a number of +assertions. +.Sp +The default is off when \f(CW\*(C`_\|_OPTIMIZE_SIZE_\|_\*(C'\fR is defined by your compiler +(e.g. gcc with \f(CW\*(C`\-Os\*(C'\fR). +.ie n .IP "2 \- faster/larger data structures" 4 +.el .IP "\f(CW2\fR \- faster/larger data structures" 4 +.IX Item "2 - faster/larger data structures" +Replaces the small 2\-heap for timer management by a faster 4\-heap, larger +hash table sizes and so on. This will usually further increase code size +and can additionally have an effect on the size of data structures at +runtime. +.Sp +The default is off when \f(CW\*(C`_\|_OPTIMIZE_SIZE_\|_\*(C'\fR is defined by your compiler +(e.g. gcc with \f(CW\*(C`\-Os\*(C'\fR). +.ie n .IP "4 \- full \s-1API\s0 configuration" 4 +.el .IP "\f(CW4\fR \- full \s-1API\s0 configuration" 4 +.IX Item "4 - full API configuration" +This enables priorities (sets \f(CW\*(C`EV_MAXPRI\*(C'\fR=2 and \f(CW\*(C`EV_MINPRI\*(C'\fR=\-2), and +enables multiplicity (\f(CW\*(C`EV_MULTIPLICITY\*(C'\fR=1). +.ie n .IP "8 \- full \s-1API\s0" 4 +.el .IP "\f(CW8\fR \- full \s-1API\s0" 4 +.IX Item "8 - full API" +This enables a lot of the \*(L"lesser used\*(R" \s-1API\s0 functions. See \f(CW\*(C`ev.h\*(C'\fR for +details on which parts of the \s-1API\s0 are still available without this +feature, and do not complain if this subset changes over time. +.ie n .IP "16 \- enable all optional watcher types" 4 +.el .IP "\f(CW16\fR \- enable all optional watcher types" 4 +.IX Item "16 - enable all optional watcher types" +Enables all optional watcher types. If you want to selectively enable +only some watcher types other than I/O and timers (e.g. prepare, +embed, async, child...) you can enable them manually by defining +\&\f(CW\*(C`EV_watchertype_ENABLE\*(C'\fR to \f(CW1\fR instead. +.ie n .IP "32 \- enable all backends" 4 +.el .IP "\f(CW32\fR \- enable all backends" 4 +.IX Item "32 - enable all backends" +This enables all backends \- without this feature, you need to enable at +least one backend manually (\f(CW\*(C`EV_USE_SELECT\*(C'\fR is a good choice). +.ie n .IP "64 \- enable OS-specific ""helper"" APIs" 4 +.el .IP "\f(CW64\fR \- enable OS-specific ``helper'' APIs" 4 +.IX Item "64 - enable OS-specific helper APIs" +Enable inotify, eventfd, signalfd and similar OS-specific helper APIs by +default. +.RE +.RS 4 +.Sp +Compiling with \f(CW\*(C`gcc \-Os \-DEV_STANDALONE \-DEV_USE_EPOLL=1 \-DEV_FEATURES=0\*(C'\fR +reduces the compiled size of libev from 24.7Kb code/2.8Kb data to 6.5Kb +code/0.3Kb data on my GNU/Linux amd64 system, while still giving you I/O +watchers, timers and monotonic clock support. +.Sp +With an intelligent-enough linker (gcc+binutils are intelligent enough +when you use \f(CW\*(C`\-Wl,\-\-gc\-sections \-ffunction\-sections\*(C'\fR) functions unused by +your program might be left out as well \- a binary starting a timer and an +I/O watcher then might come out at only 5Kb. +.RE +.IP "\s-1EV_API_STATIC\s0" 4 +.IX Item "EV_API_STATIC" +If this symbol is defined (by default it is not), then all identifiers +will have static linkage. This means that libev will not export any +identifiers, and you cannot link against libev anymore. This can be useful +when you embed libev, only want to use libev functions in a single file, +and do not want its identifiers to be visible. +.Sp +To use this, define \f(CW\*(C`EV_API_STATIC\*(C'\fR and include \fIev.c\fR in the file that +wants to use libev. +.Sp +This option only works when libev is compiled with a C compiler, as \*(C+ +doesn't support the required declaration syntax. +.IP "\s-1EV_AVOID_STDIO\s0" 4 +.IX Item "EV_AVOID_STDIO" +If this is set to \f(CW1\fR at compiletime, then libev will avoid using stdio +functions (printf, scanf, perror etc.). This will increase the code size +somewhat, but if your program doesn't otherwise depend on stdio and your +libc allows it, this avoids linking in the stdio library which is quite +big. +.Sp +Note that error messages might become less precise when this option is +enabled. +.IP "\s-1EV_NSIG\s0" 4 +.IX Item "EV_NSIG" +The highest supported signal number, +1 (or, the number of +signals): Normally, libev tries to deduce the maximum number of signals +automatically, but sometimes this fails, in which case it can be +specified. Also, using a lower number than detected (\f(CW32\fR should be +good for about any system in existence) can save some memory, as libev +statically allocates some 12\-24 bytes per signal number. +.IP "\s-1EV_PID_HASHSIZE\s0" 4 +.IX Item "EV_PID_HASHSIZE" +\&\f(CW\*(C`ev_child\*(C'\fR watchers use a small hash table to distribute workload by +pid. The default size is \f(CW16\fR (or \f(CW1\fR with \f(CW\*(C`EV_FEATURES\*(C'\fR disabled), +usually more than enough. If you need to manage thousands of children you +might want to increase this value (\fImust\fR be a power of two). +.IP "\s-1EV_INOTIFY_HASHSIZE\s0" 4 +.IX Item "EV_INOTIFY_HASHSIZE" +\&\f(CW\*(C`ev_stat\*(C'\fR watchers use a small hash table to distribute workload by +inotify watch id. The default size is \f(CW16\fR (or \f(CW1\fR with \f(CW\*(C`EV_FEATURES\*(C'\fR +disabled), usually more than enough. If you need to manage thousands of +\&\f(CW\*(C`ev_stat\*(C'\fR watchers you might want to increase this value (\fImust\fR be a +power of two). +.IP "\s-1EV_USE_4HEAP\s0" 4 +.IX Item "EV_USE_4HEAP" +Heaps are not very cache-efficient. To improve the cache-efficiency of the +timer and periodics heaps, libev uses a 4\-heap when this symbol is defined +to \f(CW1\fR. The 4\-heap uses more complicated (longer) code but has noticeably +faster performance with many (thousands) of watchers. +.Sp +The default is \f(CW1\fR, unless \f(CW\*(C`EV_FEATURES\*(C'\fR overrides it, in which case it +will be \f(CW0\fR. +.IP "\s-1EV_HEAP_CACHE_AT\s0" 4 +.IX Item "EV_HEAP_CACHE_AT" +Heaps are not very cache-efficient. To improve the cache-efficiency of the +timer and periodics heaps, libev can cache the timestamp (\fIat\fR) within +the heap structure (selected by defining \f(CW\*(C`EV_HEAP_CACHE_AT\*(C'\fR to \f(CW1\fR), +which uses 8\-12 bytes more per watcher and a few hundred bytes more code, +but avoids random read accesses on heap changes. This improves performance +noticeably with many (hundreds) of watchers. +.Sp +The default is \f(CW1\fR, unless \f(CW\*(C`EV_FEATURES\*(C'\fR overrides it, in which case it +will be \f(CW0\fR. +.IP "\s-1EV_VERIFY\s0" 4 +.IX Item "EV_VERIFY" +Controls how much internal verification (see \f(CW\*(C`ev_verify ()\*(C'\fR) will +be done: If set to \f(CW0\fR, no internal verification code will be compiled +in. If set to \f(CW1\fR, then verification code will be compiled in, but not +called. If set to \f(CW2\fR, then the internal verification code will be +called once per loop, which can slow down libev. If set to \f(CW3\fR, then the +verification code will be called very frequently, which will slow down +libev considerably. +.Sp +Verification errors are reported via C's \f(CW\*(C`assert\*(C'\fR mechanism, so if you +disable that (e.g. by defining \f(CW\*(C`NDEBUG\*(C'\fR) then no errors will be reported. +.Sp +The default is \f(CW1\fR, unless \f(CW\*(C`EV_FEATURES\*(C'\fR overrides it, in which case it +will be \f(CW0\fR. +.IP "\s-1EV_COMMON\s0" 4 +.IX Item "EV_COMMON" +By default, all watchers have a \f(CW\*(C`void *data\*(C'\fR member. By redefining +this macro to something else you can include more and other types of +members. You have to define it each time you include one of the files, +though, and it must be identical each time. +.Sp +For example, the perl \s-1EV\s0 module uses something like this: +.Sp +.Vb 3 +\& #define EV_COMMON \e +\& SV *self; /* contains this struct */ \e +\& SV *cb_sv, *fh /* note no trailing ";" */ +.Ve +.IP "\s-1EV_CB_DECLARE\s0 (type)" 4 +.IX Item "EV_CB_DECLARE (type)" +.PD 0 +.IP "\s-1EV_CB_INVOKE\s0 (watcher, revents)" 4 +.IX Item "EV_CB_INVOKE (watcher, revents)" +.IP "ev_set_cb (ev, cb)" 4 +.IX Item "ev_set_cb (ev, cb)" +.PD +Can be used to change the callback member declaration in each watcher, +and the way callbacks are invoked and set. Must expand to a struct member +definition and a statement, respectively. See the \fIev.h\fR header file for +their default definitions. One possible use for overriding these is to +avoid the \f(CW\*(C`struct ev_loop *\*(C'\fR as first argument in all cases, or to use +method calls instead of plain function calls in \*(C+. +.SS "\s-1EXPORTED API SYMBOLS\s0" +.IX Subsection "EXPORTED API SYMBOLS" +If you need to re-export the \s-1API\s0 (e.g. via a \s-1DLL\s0) and you need a list of +exported symbols, you can use the provided \fISymbol.*\fR files which list +all public symbols, one per line: +.PP +.Vb 2 +\& Symbols.ev for libev proper +\& Symbols.event for the libevent emulation +.Ve +.PP +This can also be used to rename all public symbols to avoid clashes with +multiple versions of libev linked together (which is obviously bad in +itself, but sometimes it is inconvenient to avoid this). +.PP +A sed command like this will create wrapper \f(CW\*(C`#define\*(C'\fR's that you need to +include before including \fIev.h\fR: +.PP +.Vb 1 +\& wrap.h +.Ve +.PP +This would create a file \fIwrap.h\fR which essentially looks like this: +.PP +.Vb 4 +\& #define ev_backend myprefix_ev_backend +\& #define ev_check_start myprefix_ev_check_start +\& #define ev_check_stop myprefix_ev_check_stop +\& ... +.Ve +.SS "\s-1EXAMPLES\s0" +.IX Subsection "EXAMPLES" +For a real-world example of a program the includes libev +verbatim, you can have a look at the \s-1EV\s0 perl module +(). It has the libev files in +the \fIlibev/\fR subdirectory and includes them in the \fI\s-1EV/EVAPI\s0.h\fR (public +interface) and \fI\s-1EV\s0.xs\fR (implementation) files. Only the \fI\s-1EV\s0.xs\fR file +will be compiled. It is pretty complex because it provides its own header +file. +.PP +The usage in rxvt-unicode is simpler. It has a \fIev_cpp.h\fR header file +that everybody includes and which overrides some configure choices: +.PP +.Vb 8 +\& #define EV_FEATURES 8 +\& #define EV_USE_SELECT 1 +\& #define EV_PREPARE_ENABLE 1 +\& #define EV_IDLE_ENABLE 1 +\& #define EV_SIGNAL_ENABLE 1 +\& #define EV_CHILD_ENABLE 1 +\& #define EV_USE_STDEXCEPT 0 +\& #define EV_CONFIG_H +\& +\& #include "ev++.h" +.Ve +.PP +And a \fIev_cpp.C\fR implementation file that contains libev proper and is compiled: +.PP +.Vb 2 +\& #include "ev_cpp.h" +\& #include "ev.c" +.Ve +.SH "INTERACTION WITH OTHER PROGRAMS, LIBRARIES OR THE ENVIRONMENT" +.IX Header "INTERACTION WITH OTHER PROGRAMS, LIBRARIES OR THE ENVIRONMENT" +.SS "\s-1THREADS AND COROUTINES\s0" +.IX Subsection "THREADS AND COROUTINES" +\fI\s-1THREADS\s0\fR +.IX Subsection "THREADS" +.PP +All libev functions are reentrant and thread-safe unless explicitly +documented otherwise, but libev implements no locking itself. This means +that you can use as many loops as you want in parallel, as long as there +are no concurrent calls into any libev function with the same loop +parameter (\f(CW\*(C`ev_default_*\*(C'\fR calls have an implicit default loop parameter, +of course): libev guarantees that different event loops share no data +structures that need any locking. +.PP +Or to put it differently: calls with different loop parameters can be done +concurrently from multiple threads, calls with the same loop parameter +must be done serially (but can be done from different threads, as long as +only one thread ever is inside a call at any point in time, e.g. by using +a mutex per loop). +.PP +Specifically to support threads (and signal handlers), libev implements +so-called \f(CW\*(C`ev_async\*(C'\fR watchers, which allow some limited form of +concurrency on the same event loop, namely waking it up \*(L"from the +outside\*(R". +.PP +If you want to know which design (one loop, locking, or multiple loops +without or something else still) is best for your problem, then I cannot +help you, but here is some generic advice: +.IP "\(bu" 4 +most applications have a main thread: use the default libev loop +in that thread, or create a separate thread running only the default loop. +.Sp +This helps integrating other libraries or software modules that use libev +themselves and don't care/know about threading. +.IP "\(bu" 4 +one loop per thread is usually a good model. +.Sp +Doing this is almost never wrong, sometimes a better-performance model +exists, but it is always a good start. +.IP "\(bu" 4 +other models exist, such as the leader/follower pattern, where one +loop is handed through multiple threads in a kind of round-robin fashion. +.Sp +Choosing a model is hard \- look around, learn, know that usually you can do +better than you currently do :\-) +.IP "\(bu" 4 +often you need to talk to some other thread which blocks in the +event loop. +.Sp +\&\f(CW\*(C`ev_async\*(C'\fR watchers can be used to wake them up from other threads safely +(or from signal contexts...). +.Sp +An example use would be to communicate signals or other events that only +work in the default loop by registering the signal watcher with the +default loop and triggering an \f(CW\*(C`ev_async\*(C'\fR watcher from the default loop +watcher callback into the event loop interested in the signal. +.PP +See also \*(L"\s-1THREAD LOCKING EXAMPLE\*(R"\s0. +.PP +\fI\s-1COROUTINES\s0\fR +.IX Subsection "COROUTINES" +.PP +Libev is very accommodating to coroutines (\*(L"cooperative threads\*(R"): +libev fully supports nesting calls to its functions from different +coroutines (e.g. you can call \f(CW\*(C`ev_run\*(C'\fR on the same loop from two +different coroutines, and switch freely between both coroutines running +the loop, as long as you don't confuse yourself). The only exception is +that you must not do this from \f(CW\*(C`ev_periodic\*(C'\fR reschedule callbacks. +.PP +Care has been taken to ensure that libev does not keep local state inside +\&\f(CW\*(C`ev_run\*(C'\fR, and other calls do not usually allow for coroutine switches as +they do not call any callbacks. +.SS "\s-1COMPILER WARNINGS\s0" +.IX Subsection "COMPILER WARNINGS" +Depending on your compiler and compiler settings, you might get no or a +lot of warnings when compiling libev code. Some people are apparently +scared by this. +.PP +However, these are unavoidable for many reasons. For one, each compiler +has different warnings, and each user has different tastes regarding +warning options. \*(L"Warn-free\*(R" code therefore cannot be a goal except when +targeting a specific compiler and compiler-version. +.PP +Another reason is that some compiler warnings require elaborate +workarounds, or other changes to the code that make it less clear and less +maintainable. +.PP +And of course, some compiler warnings are just plain stupid, or simply +wrong (because they don't actually warn about the condition their message +seems to warn about). For example, certain older gcc versions had some +warnings that resulted in an extreme number of false positives. These have +been fixed, but some people still insist on making code warn-free with +such buggy versions. +.PP +While libev is written to generate as few warnings as possible, +\&\*(L"warn-free\*(R" code is not a goal, and it is recommended not to build libev +with any compiler warnings enabled unless you are prepared to cope with +them (e.g. by ignoring them). Remember that warnings are just that: +warnings, not errors, or proof of bugs. +.SS "\s-1VALGRIND\s0" +.IX Subsection "VALGRIND" +Valgrind has a special section here because it is a popular tool that is +highly useful. Unfortunately, valgrind reports are very hard to interpret. +.PP +If you think you found a bug (memory leak, uninitialised data access etc.) +in libev, then check twice: If valgrind reports something like: +.PP +.Vb 3 +\& ==2274== definitely lost: 0 bytes in 0 blocks. +\& ==2274== possibly lost: 0 bytes in 0 blocks. +\& ==2274== still reachable: 256 bytes in 1 blocks. +.Ve +.PP +Then there is no memory leak, just as memory accounted to global variables +is not a memleak \- the memory is still being referenced, and didn't leak. +.PP +Similarly, under some circumstances, valgrind might report kernel bugs +as if it were a bug in libev (e.g. in realloc or in the poll backend, +although an acceptable workaround has been found here), or it might be +confused. +.PP +Keep in mind that valgrind is a very good tool, but only a tool. Don't +make it into some kind of religion. +.PP +If you are unsure about something, feel free to contact the mailing list +with the full valgrind report and an explanation on why you think this +is a bug in libev (best check the archives, too :). However, don't be +annoyed when you get a brisk \*(L"this is no bug\*(R" answer and take the chance +of learning how to interpret valgrind properly. +.PP +If you need, for some reason, empty reports from valgrind for your project +I suggest using suppression lists. +.SH "PORTABILITY NOTES" +.IX Header "PORTABILITY NOTES" +.SS "\s-1GNU/LINUX 32 BIT LIMITATIONS\s0" +.IX Subsection "GNU/LINUX 32 BIT LIMITATIONS" +GNU/Linux is the only common platform that supports 64 bit file/large file +interfaces but \fIdisables\fR them by default. +.PP +That means that libev compiled in the default environment doesn't support +files larger than 2GiB or so, which mainly affects \f(CW\*(C`ev_stat\*(C'\fR watchers. +.PP +Unfortunately, many programs try to work around this GNU/Linux issue +by enabling the large file \s-1API,\s0 which makes them incompatible with the +standard libev compiled for their system. +.PP +Likewise, libev cannot enable the large file \s-1API\s0 itself as this would +suddenly make it incompatible to the default compile time environment, +i.e. all programs not using special compile switches. +.SS "\s-1OS/X AND DARWIN BUGS\s0" +.IX Subsection "OS/X AND DARWIN BUGS" +The whole thing is a bug if you ask me \- basically any system interface +you touch is broken, whether it is locales, poll, kqueue or even the +OpenGL drivers. +.PP +\fI\f(CI\*(C`kqueue\*(C'\fI is buggy\fR +.IX Subsection "kqueue is buggy" +.PP +The kqueue syscall is broken in all known versions \- most versions support +only sockets, many support pipes. +.PP +Libev tries to work around this by not using \f(CW\*(C`kqueue\*(C'\fR by default on this +rotten platform, but of course you can still ask for it when creating a +loop \- embedding a socket-only kqueue loop into a select-based one is +probably going to work well. +.PP +\fI\f(CI\*(C`poll\*(C'\fI is buggy\fR +.IX Subsection "poll is buggy" +.PP +Instead of fixing \f(CW\*(C`kqueue\*(C'\fR, Apple replaced their (working) \f(CW\*(C`poll\*(C'\fR +implementation by something calling \f(CW\*(C`kqueue\*(C'\fR internally around the 10.5.6 +release, so now \f(CW\*(C`kqueue\*(C'\fR \fIand\fR \f(CW\*(C`poll\*(C'\fR are broken. +.PP +Libev tries to work around this by not using \f(CW\*(C`poll\*(C'\fR by default on +this rotten platform, but of course you can still ask for it when creating +a loop. +.PP +\fI\f(CI\*(C`select\*(C'\fI is buggy\fR +.IX Subsection "select is buggy" +.PP +All that's left is \f(CW\*(C`select\*(C'\fR, and of course Apple found a way to fuck this +one up as well: On \s-1OS/X,\s0 \f(CW\*(C`select\*(C'\fR actively limits the number of file +descriptors you can pass in to 1024 \- your program suddenly crashes when +you use more. +.PP +There is an undocumented \*(L"workaround\*(R" for this \- defining +\&\f(CW\*(C`_DARWIN_UNLIMITED_SELECT\*(C'\fR, which libev tries to use, so select \fIshould\fR +work on \s-1OS/X.\s0 +.SS "\s-1SOLARIS PROBLEMS AND WORKAROUNDS\s0" +.IX Subsection "SOLARIS PROBLEMS AND WORKAROUNDS" +\fI\f(CI\*(C`errno\*(C'\fI reentrancy\fR +.IX Subsection "errno reentrancy" +.PP +The default compile environment on Solaris is unfortunately so +thread-unsafe that you can't even use components/libraries compiled +without \f(CW\*(C`\-D_REENTRANT\*(C'\fR in a threaded program, which, of course, isn't +defined by default. A valid, if stupid, implementation choice. +.PP +If you want to use libev in threaded environments you have to make sure +it's compiled with \f(CW\*(C`_REENTRANT\*(C'\fR defined. +.PP +\fIEvent port backend\fR +.IX Subsection "Event port backend" +.PP +The scalable event interface for Solaris is called \*(L"event +ports\*(R". Unfortunately, this mechanism is very buggy in all major +releases. If you run into high \s-1CPU\s0 usage, your program freezes or you get +a large number of spurious wakeups, make sure you have all the relevant +and latest kernel patches applied. No, I don't know which ones, but there +are multiple ones to apply, and afterwards, event ports actually work +great. +.PP +If you can't get it to work, you can try running the program by setting +the environment variable \f(CW\*(C`LIBEV_FLAGS=3\*(C'\fR to only allow \f(CW\*(C`poll\*(C'\fR and +\&\f(CW\*(C`select\*(C'\fR backends. +.SS "\s-1AIX POLL BUG\s0" +.IX Subsection "AIX POLL BUG" +\&\s-1AIX\s0 unfortunately has a broken \f(CW\*(C`poll.h\*(C'\fR header. Libev works around +this by trying to avoid the poll backend altogether (i.e. it's not even +compiled in), which normally isn't a big problem as \f(CW\*(C`select\*(C'\fR works fine +with large bitsets on \s-1AIX,\s0 and \s-1AIX\s0 is dead anyway. +.SS "\s-1WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS\s0" +.IX Subsection "WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS" +\fIGeneral issues\fR +.IX Subsection "General issues" +.PP +Win32 doesn't support any of the standards (e.g. \s-1POSIX\s0) that libev +requires, and its I/O model is fundamentally incompatible with the \s-1POSIX\s0 +model. Libev still offers limited functionality on this platform in +the form of the \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR backend, and only supports socket +descriptors. This only applies when using Win32 natively, not when using +e.g. cygwin. Actually, it only applies to the microsofts own compilers, +as every compiler comes with a slightly differently broken/incompatible +environment. +.PP +Lifting these limitations would basically require the full +re-implementation of the I/O system. If you are into this kind of thing, +then note that glib does exactly that for you in a very portable way (note +also that glib is the slowest event library known to man). +.PP +There is no supported compilation method available on windows except +embedding it into other applications. +.PP +Sensible signal handling is officially unsupported by Microsoft \- libev +tries its best, but under most conditions, signals will simply not work. +.PP +Not a libev limitation but worth mentioning: windows apparently doesn't +accept large writes: instead of resulting in a partial write, windows will +either accept everything or return \f(CW\*(C`ENOBUFS\*(C'\fR if the buffer is too large, +so make sure you only write small amounts into your sockets (less than a +megabyte seems safe, but this apparently depends on the amount of memory +available). +.PP +Due to the many, low, and arbitrary limits on the win32 platform and +the abysmal performance of winsockets, using a large number of sockets +is not recommended (and not reasonable). If your program needs to use +more than a hundred or so sockets, then likely it needs to use a totally +different implementation for windows, as libev offers the \s-1POSIX\s0 readiness +notification model, which cannot be implemented efficiently on windows +(due to Microsoft monopoly games). +.PP +A typical way to use libev under windows is to embed it (see the embedding +section for details) and use the following \fIevwrap.h\fR header file instead +of \fIev.h\fR: +.PP +.Vb 2 +\& #define EV_STANDALONE /* keeps ev from requiring config.h */ +\& #define EV_SELECT_IS_WINSOCKET 1 /* configure libev for windows select */ +\& +\& #include "ev.h" +.Ve +.PP +And compile the following \fIevwrap.c\fR file into your project (make sure +you do \fInot\fR compile the \fIev.c\fR or any other embedded source files!): +.PP +.Vb 2 +\& #include "evwrap.h" +\& #include "ev.c" +.Ve +.PP +\fIThe winsocket \f(CI\*(C`select\*(C'\fI function\fR +.IX Subsection "The winsocket select function" +.PP +The winsocket \f(CW\*(C`select\*(C'\fR function doesn't follow \s-1POSIX\s0 in that it +requires socket \fIhandles\fR and not socket \fIfile descriptors\fR (it is +also extremely buggy). This makes select very inefficient, and also +requires a mapping from file descriptors to socket handles (the Microsoft +C runtime provides the function \f(CW\*(C`_open_osfhandle\*(C'\fR for this). See the +discussion of the \f(CW\*(C`EV_SELECT_USE_FD_SET\*(C'\fR, \f(CW\*(C`EV_SELECT_IS_WINSOCKET\*(C'\fR and +\&\f(CW\*(C`EV_FD_TO_WIN32_HANDLE\*(C'\fR preprocessor symbols for more info. +.PP +The configuration for a \*(L"naked\*(R" win32 using the Microsoft runtime +libraries and raw winsocket select is: +.PP +.Vb 2 +\& #define EV_USE_SELECT 1 +\& #define EV_SELECT_IS_WINSOCKET 1 /* forces EV_SELECT_USE_FD_SET, too */ +.Ve +.PP +Note that winsockets handling of fd sets is O(n), so you can easily get a +complexity in the O(nX) range when using win32. +.PP +\fILimited number of file descriptors\fR +.IX Subsection "Limited number of file descriptors" +.PP +Windows has numerous arbitrary (and low) limits on things. +.PP +Early versions of winsocket's select only supported waiting for a maximum +of \f(CW64\fR handles (probably owning to the fact that all windows kernels +can only wait for \f(CW64\fR things at the same time internally; Microsoft +recommends spawning a chain of threads and wait for 63 handles and the +previous thread in each. Sounds great!). +.PP +Newer versions support more handles, but you need to define \f(CW\*(C`FD_SETSIZE\*(C'\fR +to some high number (e.g. \f(CW2048\fR) before compiling the winsocket select +call (which might be in libev or elsewhere, for example, perl and many +other interpreters do their own select emulation on windows). +.PP +Another limit is the number of file descriptors in the Microsoft runtime +libraries, which by default is \f(CW64\fR (there must be a hidden \fI64\fR +fetish or something like this inside Microsoft). You can increase this +by calling \f(CW\*(C`_setmaxstdio\*(C'\fR, which can increase this limit to \f(CW2048\fR +(another arbitrary limit), but is broken in many versions of the Microsoft +runtime libraries. This might get you to about \f(CW512\fR or \f(CW2048\fR sockets +(depending on windows version and/or the phase of the moon). To get more, +you need to wrap all I/O functions and provide your own fd management, but +the cost of calling select (O(nX)) will likely make this unworkable. +.SS "\s-1PORTABILITY REQUIREMENTS\s0" +.IX Subsection "PORTABILITY REQUIREMENTS" +In addition to a working ISO-C implementation and of course the +backend-specific APIs, libev relies on a few additional extensions: +.ie n .IP """void (*)(ev_watcher_type *, int revents)"" must have compatible calling conventions regardless of ""ev_watcher_type *""." 4 +.el .IP "\f(CWvoid (*)(ev_watcher_type *, int revents)\fR must have compatible calling conventions regardless of \f(CWev_watcher_type *\fR." 4 +.IX Item "void (*)(ev_watcher_type *, int revents) must have compatible calling conventions regardless of ev_watcher_type *." +Libev assumes not only that all watcher pointers have the same internal +structure (guaranteed by \s-1POSIX\s0 but not by \s-1ISO C\s0 for example), but it also +assumes that the same (machine) code can be used to call any watcher +callback: The watcher callbacks have different type signatures, but libev +calls them using an \f(CW\*(C`ev_watcher *\*(C'\fR internally. +.IP "null pointers and integer zero are represented by 0 bytes" 4 +.IX Item "null pointers and integer zero are represented by 0 bytes" +Libev uses \f(CW\*(C`memset\*(C'\fR to initialise structs and arrays to \f(CW0\fR bytes, and +relies on this setting pointers and integers to null. +.IP "pointer accesses must be thread-atomic" 4 +.IX Item "pointer accesses must be thread-atomic" +Accessing a pointer value must be atomic, it must both be readable and +writable in one piece \- this is the case on all current architectures. +.ie n .IP """sig_atomic_t volatile"" must be thread-atomic as well" 4 +.el .IP "\f(CWsig_atomic_t volatile\fR must be thread-atomic as well" 4 +.IX Item "sig_atomic_t volatile must be thread-atomic as well" +The type \f(CW\*(C`sig_atomic_t volatile\*(C'\fR (or whatever is defined as +\&\f(CW\*(C`EV_ATOMIC_T\*(C'\fR) must be atomic with respect to accesses from different +threads. This is not part of the specification for \f(CW\*(C`sig_atomic_t\*(C'\fR, but is +believed to be sufficiently portable. +.ie n .IP """sigprocmask"" must work in a threaded environment" 4 +.el .IP "\f(CWsigprocmask\fR must work in a threaded environment" 4 +.IX Item "sigprocmask must work in a threaded environment" +Libev uses \f(CW\*(C`sigprocmask\*(C'\fR to temporarily block signals. This is not +allowed in a threaded program (\f(CW\*(C`pthread_sigmask\*(C'\fR has to be used). Typical +pthread implementations will either allow \f(CW\*(C`sigprocmask\*(C'\fR in the \*(L"main +thread\*(R" or will block signals process-wide, both behaviours would +be compatible with libev. Interaction between \f(CW\*(C`sigprocmask\*(C'\fR and +\&\f(CW\*(C`pthread_sigmask\*(C'\fR could complicate things, however. +.Sp +The most portable way to handle signals is to block signals in all threads +except the initial one, and run the signal handling loop in the initial +thread as well. +.ie n .IP """long"" must be large enough for common memory allocation sizes" 4 +.el .IP "\f(CWlong\fR must be large enough for common memory allocation sizes" 4 +.IX Item "long must be large enough for common memory allocation sizes" +To improve portability and simplify its \s-1API,\s0 libev uses \f(CW\*(C`long\*(C'\fR internally +instead of \f(CW\*(C`size_t\*(C'\fR when allocating its data structures. On non-POSIX +systems (Microsoft...) this might be unexpectedly low, but is still at +least 31 bits everywhere, which is enough for hundreds of millions of +watchers. +.ie n .IP """double"" must hold a time value in seconds with enough accuracy" 4 +.el .IP "\f(CWdouble\fR must hold a time value in seconds with enough accuracy" 4 +.IX Item "double must hold a time value in seconds with enough accuracy" +The type \f(CW\*(C`double\*(C'\fR is used to represent timestamps. It is required to +have at least 51 bits of mantissa (and 9 bits of exponent), which is +good enough for at least into the year 4000 with millisecond accuracy +(the design goal for libev). This requirement is overfulfilled by +implementations using \s-1IEEE 754,\s0 which is basically all existing ones. +.Sp +With \s-1IEEE 754\s0 doubles, you get microsecond accuracy until at least the +year 2255 (and millisecond accuracy till the year 287396 \- by then, libev +is either obsolete or somebody patched it to use \f(CW\*(C`long double\*(C'\fR or +something like that, just kidding). +.PP +If you know of other additional requirements drop me a note. +.SH "ALGORITHMIC COMPLEXITIES" +.IX Header "ALGORITHMIC COMPLEXITIES" +In this section the complexities of (many of) the algorithms used inside +libev will be documented. For complexity discussions about backends see +the documentation for \f(CW\*(C`ev_default_init\*(C'\fR. +.PP +All of the following are about amortised time: If an array needs to be +extended, libev needs to realloc and move the whole array, but this +happens asymptotically rarer with higher number of elements, so O(1) might +mean that libev does a lengthy realloc operation in rare cases, but on +average it is much faster and asymptotically approaches constant time. +.IP "Starting and stopping timer/periodic watchers: O(log skipped_other_timers)" 4 +.IX Item "Starting and stopping timer/periodic watchers: O(log skipped_other_timers)" +This means that, when you have a watcher that triggers in one hour and +there are 100 watchers that would trigger before that, then inserting will +have to skip roughly seven (\f(CW\*(C`ld 100\*(C'\fR) of these watchers. +.IP "Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)" 4 +.IX Item "Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)" +That means that changing a timer costs less than removing/adding them, +as only the relative motion in the event queue has to be paid for. +.IP "Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1)" 4 +.IX Item "Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1)" +These just add the watcher into an array or at the head of a list. +.IP "Stopping check/prepare/idle/fork/async watchers: O(1)" 4 +.IX Item "Stopping check/prepare/idle/fork/async watchers: O(1)" +.PD 0 +.IP "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % \s-1EV_PID_HASHSIZE\s0))" 4 +.IX Item "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE))" +.PD +These watchers are stored in lists, so they need to be walked to find the +correct watcher to remove. The lists are usually short (you don't usually +have many watchers waiting for the same fd or signal: one is typical, two +is rare). +.IP "Finding the next timer in each loop iteration: O(1)" 4 +.IX Item "Finding the next timer in each loop iteration: O(1)" +By virtue of using a binary or 4\-heap, the next timer is always found at a +fixed position in the storage array. +.IP "Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)" 4 +.IX Item "Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)" +A change means an I/O watcher gets started or stopped, which requires +libev to recalculate its status (and possibly tell the kernel, depending +on backend and whether \f(CW\*(C`ev_io_set\*(C'\fR was used). +.IP "Activating one watcher (putting it into the pending state): O(1)" 4 +.IX Item "Activating one watcher (putting it into the pending state): O(1)" +.PD 0 +.IP "Priority handling: O(number_of_priorities)" 4 +.IX Item "Priority handling: O(number_of_priorities)" +.PD +Priorities are implemented by allocating some space for each +priority. When doing priority-based operations, libev usually has to +linearly search all the priorities, but starting/stopping and activating +watchers becomes O(1) with respect to priority handling. +.IP "Sending an ev_async: O(1)" 4 +.IX Item "Sending an ev_async: O(1)" +.PD 0 +.IP "Processing ev_async_send: O(number_of_async_watchers)" 4 +.IX Item "Processing ev_async_send: O(number_of_async_watchers)" +.IP "Processing signals: O(max_signal_number)" 4 +.IX Item "Processing signals: O(max_signal_number)" +.PD +Sending involves a system call \fIiff\fR there were no other \f(CW\*(C`ev_async_send\*(C'\fR +calls in the current loop iteration and the loop is currently +blocked. Checking for async and signal events involves iterating over all +running async watchers or all signal numbers. +.SH "PORTING FROM LIBEV 3.X TO 4.X" +.IX Header "PORTING FROM LIBEV 3.X TO 4.X" +The major version 4 introduced some incompatible changes to the \s-1API.\s0 +.PP +At the moment, the \f(CW\*(C`ev.h\*(C'\fR header file provides compatibility definitions +for all changes, so most programs should still compile. The compatibility +layer might be removed in later versions of libev, so better update to the +new \s-1API\s0 early than late. +.ie n .IP """EV_COMPAT3"" backwards compatibility mechanism" 4 +.el .IP "\f(CWEV_COMPAT3\fR backwards compatibility mechanism" 4 +.IX Item "EV_COMPAT3 backwards compatibility mechanism" +The backward compatibility mechanism can be controlled by +\&\f(CW\*(C`EV_COMPAT3\*(C'\fR. See \*(L"\s-1PREPROCESSOR SYMBOLS/MACROS\*(R"\s0 in the \*(L"\s-1EMBEDDING\*(R"\s0 +section. +.ie n .IP """ev_default_destroy"" and ""ev_default_fork"" have been removed" 4 +.el .IP "\f(CWev_default_destroy\fR and \f(CWev_default_fork\fR have been removed" 4 +.IX Item "ev_default_destroy and ev_default_fork have been removed" +These calls can be replaced easily by their \f(CW\*(C`ev_loop_xxx\*(C'\fR counterparts: +.Sp +.Vb 2 +\& ev_loop_destroy (EV_DEFAULT_UC); +\& ev_loop_fork (EV_DEFAULT); +.Ve +.IP "function/symbol renames" 4 +.IX Item "function/symbol renames" +A number of functions and symbols have been renamed: +.Sp +.Vb 3 +\& ev_loop => ev_run +\& EVLOOP_NONBLOCK => EVRUN_NOWAIT +\& EVLOOP_ONESHOT => EVRUN_ONCE +\& +\& ev_unloop => ev_break +\& EVUNLOOP_CANCEL => EVBREAK_CANCEL +\& EVUNLOOP_ONE => EVBREAK_ONE +\& EVUNLOOP_ALL => EVBREAK_ALL +\& +\& EV_TIMEOUT => EV_TIMER +\& +\& ev_loop_count => ev_iteration +\& ev_loop_depth => ev_depth +\& ev_loop_verify => ev_verify +.Ve +.Sp +Most functions working on \f(CW\*(C`struct ev_loop\*(C'\fR objects don't have an +\&\f(CW\*(C`ev_loop_\*(C'\fR prefix, so it was removed; \f(CW\*(C`ev_loop\*(C'\fR, \f(CW\*(C`ev_unloop\*(C'\fR and +associated constants have been renamed to not collide with the \f(CW\*(C`struct +ev_loop\*(C'\fR anymore and \f(CW\*(C`EV_TIMER\*(C'\fR now follows the same naming scheme +as all other watcher types. Note that \f(CW\*(C`ev_loop_fork\*(C'\fR is still called +\&\f(CW\*(C`ev_loop_fork\*(C'\fR because it would otherwise clash with the \f(CW\*(C`ev_fork\*(C'\fR +typedef. +.ie n .IP """EV_MINIMAL"" mechanism replaced by ""EV_FEATURES""" 4 +.el .IP "\f(CWEV_MINIMAL\fR mechanism replaced by \f(CWEV_FEATURES\fR" 4 +.IX Item "EV_MINIMAL mechanism replaced by EV_FEATURES" +The preprocessor symbol \f(CW\*(C`EV_MINIMAL\*(C'\fR has been replaced by a different +mechanism, \f(CW\*(C`EV_FEATURES\*(C'\fR. Programs using \f(CW\*(C`EV_MINIMAL\*(C'\fR usually compile +and work, but the library code will of course be larger. +.SH "GLOSSARY" +.IX Header "GLOSSARY" +.IP "active" 4 +.IX Item "active" +A watcher is active as long as it has been started and not yet stopped. +See \*(L"\s-1WATCHER STATES\*(R"\s0 for details. +.IP "application" 4 +.IX Item "application" +In this document, an application is whatever is using libev. +.IP "backend" 4 +.IX Item "backend" +The part of the code dealing with the operating system interfaces. +.IP "callback" 4 +.IX Item "callback" +The address of a function that is called when some event has been +detected. Callbacks are being passed the event loop, the watcher that +received the event, and the actual event bitset. +.IP "callback/watcher invocation" 4 +.IX Item "callback/watcher invocation" +The act of calling the callback associated with a watcher. +.IP "event" 4 +.IX Item "event" +A change of state of some external event, such as data now being available +for reading on a file descriptor, time having passed or simply not having +any other events happening anymore. +.Sp +In libev, events are represented as single bits (such as \f(CW\*(C`EV_READ\*(C'\fR or +\&\f(CW\*(C`EV_TIMER\*(C'\fR). +.IP "event library" 4 +.IX Item "event library" +A software package implementing an event model and loop. +.IP "event loop" 4 +.IX Item "event loop" +An entity that handles and processes external events and converts them +into callback invocations. +.IP "event model" 4 +.IX Item "event model" +The model used to describe how an event loop handles and processes +watchers and events. +.IP "pending" 4 +.IX Item "pending" +A watcher is pending as soon as the corresponding event has been +detected. See \*(L"\s-1WATCHER STATES\*(R"\s0 for details. +.IP "real time" 4 +.IX Item "real time" +The physical time that is observed. It is apparently strictly monotonic :) +.IP "wall-clock time" 4 +.IX Item "wall-clock time" +The time and date as shown on clocks. Unlike real time, it can actually +be wrong and jump forwards and backwards, e.g. when you adjust your +clock. +.IP "watcher" 4 +.IX Item "watcher" +A data structure that describes interest in certain events. Watchers need +to be started (attached to an event loop) before they can receive events. +.SH "AUTHOR" +.IX Header "AUTHOR" +Marc Lehmann , with repeated corrections by Mikael +Magnusson and Emanuele Giaquinta, and minor corrections by many others. diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev.c b/deps/ngtcp2/ngtcp2/third-party/libev/ev.c new file mode 100644 index 000000000000..ec212a1f0d21 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev.c @@ -0,0 +1,5627 @@ +/* + * libev event processing core, watcher management + * + * Copyright (c) 2007-2019 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +/* this big block deduces configuration from config.h */ +#ifndef EV_STANDALONE +# ifdef EV_CONFIG_H +# include EV_CONFIG_H +# else +# include "config.h" +# endif + +# if HAVE_FLOOR +# ifndef EV_USE_FLOOR +# define EV_USE_FLOOR 1 +# endif +# endif + +# if HAVE_CLOCK_SYSCALL +# ifndef EV_USE_CLOCK_SYSCALL +# define EV_USE_CLOCK_SYSCALL 1 +# ifndef EV_USE_REALTIME +# define EV_USE_REALTIME 0 +# endif +# ifndef EV_USE_MONOTONIC +# define EV_USE_MONOTONIC 1 +# endif +# endif +# elif !defined EV_USE_CLOCK_SYSCALL +# define EV_USE_CLOCK_SYSCALL 0 +# endif + +# if HAVE_CLOCK_GETTIME +# ifndef EV_USE_MONOTONIC +# define EV_USE_MONOTONIC 1 +# endif +# ifndef EV_USE_REALTIME +# define EV_USE_REALTIME 0 +# endif +# else +# ifndef EV_USE_MONOTONIC +# define EV_USE_MONOTONIC 0 +# endif +# ifndef EV_USE_REALTIME +# define EV_USE_REALTIME 0 +# endif +# endif + +# if HAVE_NANOSLEEP +# ifndef EV_USE_NANOSLEEP +# define EV_USE_NANOSLEEP EV_FEATURE_OS +# endif +# else +# undef EV_USE_NANOSLEEP +# define EV_USE_NANOSLEEP 0 +# endif + +# if HAVE_SELECT && HAVE_SYS_SELECT_H +# ifndef EV_USE_SELECT +# define EV_USE_SELECT EV_FEATURE_BACKENDS +# endif +# else +# undef EV_USE_SELECT +# define EV_USE_SELECT 0 +# endif + +# if HAVE_POLL && HAVE_POLL_H +# ifndef EV_USE_POLL +# define EV_USE_POLL EV_FEATURE_BACKENDS +# endif +# else +# undef EV_USE_POLL +# define EV_USE_POLL 0 +# endif + +# if HAVE_EPOLL_CTL && HAVE_SYS_EPOLL_H +# ifndef EV_USE_EPOLL +# define EV_USE_EPOLL EV_FEATURE_BACKENDS +# endif +# else +# undef EV_USE_EPOLL +# define EV_USE_EPOLL 0 +# endif + +# if HAVE_LINUX_AIO_ABI_H +# ifndef EV_USE_LINUXAIO +# define EV_USE_LINUXAIO 0 /* was: EV_FEATURE_BACKENDS, always off by default */ +# endif +# else +# undef EV_USE_LINUXAIO +# define EV_USE_LINUXAIO 0 +# endif + +# if HAVE_LINUX_FS_H && HAVE_SYS_TIMERFD_H && HAVE_KERNEL_RWF_T +# ifndef EV_USE_IOURING +# define EV_USE_IOURING EV_FEATURE_BACKENDS +# endif +# else +# undef EV_USE_IOURING +# define EV_USE_IOURING 0 +# endif + +# if HAVE_KQUEUE && HAVE_SYS_EVENT_H +# ifndef EV_USE_KQUEUE +# define EV_USE_KQUEUE EV_FEATURE_BACKENDS +# endif +# else +# undef EV_USE_KQUEUE +# define EV_USE_KQUEUE 0 +# endif + +# if HAVE_PORT_H && HAVE_PORT_CREATE +# ifndef EV_USE_PORT +# define EV_USE_PORT EV_FEATURE_BACKENDS +# endif +# else +# undef EV_USE_PORT +# define EV_USE_PORT 0 +# endif + +# if HAVE_INOTIFY_INIT && HAVE_SYS_INOTIFY_H +# ifndef EV_USE_INOTIFY +# define EV_USE_INOTIFY EV_FEATURE_OS +# endif +# else +# undef EV_USE_INOTIFY +# define EV_USE_INOTIFY 0 +# endif + +# if HAVE_SIGNALFD && HAVE_SYS_SIGNALFD_H +# ifndef EV_USE_SIGNALFD +# define EV_USE_SIGNALFD EV_FEATURE_OS +# endif +# else +# undef EV_USE_SIGNALFD +# define EV_USE_SIGNALFD 0 +# endif + +# if HAVE_EVENTFD +# ifndef EV_USE_EVENTFD +# define EV_USE_EVENTFD EV_FEATURE_OS +# endif +# else +# undef EV_USE_EVENTFD +# define EV_USE_EVENTFD 0 +# endif + +# if HAVE_SYS_TIMERFD_H +# ifndef EV_USE_TIMERFD +# define EV_USE_TIMERFD EV_FEATURE_OS +# endif +# else +# undef EV_USE_TIMERFD +# define EV_USE_TIMERFD 0 +# endif + +#endif + +/* OS X, in its infinite idiocy, actually HARDCODES + * a limit of 1024 into their select. Where people have brains, + * OS X engineers apparently have a vacuum. Or maybe they were + * ordered to have a vacuum, or they do anything for money. + * This might help. Or not. + * Note that this must be defined early, as other include files + * will rely on this define as well. + */ +#define _DARWIN_UNLIMITED_SELECT 1 + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include + +#ifdef EV_H +# include EV_H +#else +# include "ev.h" +#endif + +#if EV_NO_THREADS +# undef EV_NO_SMP +# define EV_NO_SMP 1 +# undef ECB_NO_THREADS +# define ECB_NO_THREADS 1 +#endif +#if EV_NO_SMP +# undef EV_NO_SMP +# define ECB_NO_SMP 1 +#endif + +#ifndef _WIN32 +# include +# include +# include +#else +# include +# define WIN32_LEAN_AND_MEAN +# include +# include +# ifndef EV_SELECT_IS_WINSOCKET +# define EV_SELECT_IS_WINSOCKET 1 +# endif +# undef EV_AVOID_STDIO +#endif + +/* this block tries to deduce configuration from header-defined symbols and defaults */ + +/* try to deduce the maximum number of signals on this platform */ +#if defined EV_NSIG +/* use what's provided */ +#elif defined NSIG +# define EV_NSIG (NSIG) +#elif defined _NSIG +# define EV_NSIG (_NSIG) +#elif defined SIGMAX +# define EV_NSIG (SIGMAX+1) +#elif defined SIG_MAX +# define EV_NSIG (SIG_MAX+1) +#elif defined _SIG_MAX +# define EV_NSIG (_SIG_MAX+1) +#elif defined MAXSIG +# define EV_NSIG (MAXSIG+1) +#elif defined MAX_SIG +# define EV_NSIG (MAX_SIG+1) +#elif defined SIGARRAYSIZE +# define EV_NSIG (SIGARRAYSIZE) /* Assume ary[SIGARRAYSIZE] */ +#elif defined _sys_nsig +# define EV_NSIG (_sys_nsig) /* Solaris 2.5 */ +#else +# define EV_NSIG (8 * sizeof (sigset_t) + 1) +#endif + +#ifndef EV_USE_FLOOR +# define EV_USE_FLOOR 0 +#endif + +#ifndef EV_USE_CLOCK_SYSCALL +# if __linux && __GLIBC__ == 2 && __GLIBC_MINOR__ < 17 +# define EV_USE_CLOCK_SYSCALL EV_FEATURE_OS +# else +# define EV_USE_CLOCK_SYSCALL 0 +# endif +#endif + +#if !(_POSIX_TIMERS > 0) +# ifndef EV_USE_MONOTONIC +# define EV_USE_MONOTONIC 0 +# endif +# ifndef EV_USE_REALTIME +# define EV_USE_REALTIME 0 +# endif +#endif + +#ifndef EV_USE_MONOTONIC +# if defined _POSIX_MONOTONIC_CLOCK && _POSIX_MONOTONIC_CLOCK >= 0 +# define EV_USE_MONOTONIC EV_FEATURE_OS +# else +# define EV_USE_MONOTONIC 0 +# endif +#endif + +#ifndef EV_USE_REALTIME +# define EV_USE_REALTIME !EV_USE_CLOCK_SYSCALL +#endif + +#ifndef EV_USE_NANOSLEEP +# if _POSIX_C_SOURCE >= 199309L +# define EV_USE_NANOSLEEP EV_FEATURE_OS +# else +# define EV_USE_NANOSLEEP 0 +# endif +#endif + +#ifndef EV_USE_SELECT +# define EV_USE_SELECT EV_FEATURE_BACKENDS +#endif + +#ifndef EV_USE_POLL +# ifdef _WIN32 +# define EV_USE_POLL 0 +# else +# define EV_USE_POLL EV_FEATURE_BACKENDS +# endif +#endif + +#ifndef EV_USE_EPOLL +# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4)) +# define EV_USE_EPOLL EV_FEATURE_BACKENDS +# else +# define EV_USE_EPOLL 0 +# endif +#endif + +#ifndef EV_USE_KQUEUE +# define EV_USE_KQUEUE 0 +#endif + +#ifndef EV_USE_PORT +# define EV_USE_PORT 0 +#endif + +#ifndef EV_USE_LINUXAIO +# if __linux /* libev currently assumes linux/aio_abi.h is always available on linux */ +# define EV_USE_LINUXAIO 0 /* was: 1, always off by default */ +# else +# define EV_USE_LINUXAIO 0 +# endif +#endif + +#ifndef EV_USE_IOURING +# if __linux /* later checks might disable again */ +# define EV_USE_IOURING 1 +# else +# define EV_USE_IOURING 0 +# endif +#endif + +#ifndef EV_USE_INOTIFY +# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4)) +# define EV_USE_INOTIFY EV_FEATURE_OS +# else +# define EV_USE_INOTIFY 0 +# endif +#endif + +#ifndef EV_PID_HASHSIZE +# define EV_PID_HASHSIZE EV_FEATURE_DATA ? 16 : 1 +#endif + +#ifndef EV_INOTIFY_HASHSIZE +# define EV_INOTIFY_HASHSIZE EV_FEATURE_DATA ? 16 : 1 +#endif + +#ifndef EV_USE_EVENTFD +# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)) +# define EV_USE_EVENTFD EV_FEATURE_OS +# else +# define EV_USE_EVENTFD 0 +# endif +#endif + +#ifndef EV_USE_SIGNALFD +# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)) +# define EV_USE_SIGNALFD EV_FEATURE_OS +# else +# define EV_USE_SIGNALFD 0 +# endif +#endif + +#ifndef EV_USE_TIMERFD +# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8)) +# define EV_USE_TIMERFD EV_FEATURE_OS +# else +# define EV_USE_TIMERFD 0 +# endif +#endif + +#if 0 /* debugging */ +# define EV_VERIFY 3 +# define EV_USE_4HEAP 1 +# define EV_HEAP_CACHE_AT 1 +#endif + +#ifndef EV_VERIFY +# define EV_VERIFY (EV_FEATURE_API ? 1 : 0) +#endif + +#ifndef EV_USE_4HEAP +# define EV_USE_4HEAP EV_FEATURE_DATA +#endif + +#ifndef EV_HEAP_CACHE_AT +# define EV_HEAP_CACHE_AT EV_FEATURE_DATA +#endif + +#ifdef __ANDROID__ +/* supposedly, android doesn't typedef fd_mask */ +# undef EV_USE_SELECT +# define EV_USE_SELECT 0 +/* supposedly, we need to include syscall.h, not sys/syscall.h, so just disable */ +# undef EV_USE_CLOCK_SYSCALL +# define EV_USE_CLOCK_SYSCALL 0 +#endif + +/* aix's poll.h seems to cause lots of trouble */ +#ifdef _AIX +/* AIX has a completely broken poll.h header */ +# undef EV_USE_POLL +# define EV_USE_POLL 0 +#endif + +/* on linux, we can use a (slow) syscall to avoid a dependency on pthread, */ +/* which makes programs even slower. might work on other unices, too. */ +#if EV_USE_CLOCK_SYSCALL +# include +# ifdef SYS_clock_gettime +# define clock_gettime(id, ts) syscall (SYS_clock_gettime, (id), (ts)) +# undef EV_USE_MONOTONIC +# define EV_USE_MONOTONIC 1 +# define EV_NEED_SYSCALL 1 +# else +# undef EV_USE_CLOCK_SYSCALL +# define EV_USE_CLOCK_SYSCALL 0 +# endif +#endif + +/* this block fixes any misconfiguration where we know we run into trouble otherwise */ + +#ifndef CLOCK_MONOTONIC +# undef EV_USE_MONOTONIC +# define EV_USE_MONOTONIC 0 +#endif + +#ifndef CLOCK_REALTIME +# undef EV_USE_REALTIME +# define EV_USE_REALTIME 0 +#endif + +#if !EV_STAT_ENABLE +# undef EV_USE_INOTIFY +# define EV_USE_INOTIFY 0 +#endif + +#if __linux && EV_USE_IOURING +# include +# if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0) +# undef EV_USE_IOURING +# define EV_USE_IOURING 0 +# endif +#endif + +#if !EV_USE_NANOSLEEP +/* hp-ux has it in sys/time.h, which we unconditionally include above */ +# if !defined _WIN32 && !defined __hpux +# include +# endif +#endif + +#if EV_USE_LINUXAIO +# include +# if SYS_io_getevents && EV_USE_EPOLL /* linuxaio backend requires epoll backend */ +# define EV_NEED_SYSCALL 1 +# else +# undef EV_USE_LINUXAIO +# define EV_USE_LINUXAIO 0 +# endif +#endif + +#if EV_USE_IOURING +# include +# if !SYS_io_uring_setup && __linux && !__alpha +# define SYS_io_uring_setup 425 +# define SYS_io_uring_enter 426 +# define SYS_io_uring_wregister 427 +# endif +# if SYS_io_uring_setup && EV_USE_EPOLL /* iouring backend requires epoll backend */ +# define EV_NEED_SYSCALL 1 +# else +# undef EV_USE_IOURING +# define EV_USE_IOURING 0 +# endif +#endif + +#if EV_USE_INOTIFY +# include +# include +/* some very old inotify.h headers don't have IN_DONT_FOLLOW */ +# ifndef IN_DONT_FOLLOW +# undef EV_USE_INOTIFY +# define EV_USE_INOTIFY 0 +# endif +#endif + +#if EV_USE_EVENTFD +/* our minimum requirement is glibc 2.7 which has the stub, but not the full header */ +# include +# ifndef EFD_NONBLOCK +# define EFD_NONBLOCK O_NONBLOCK +# endif +# ifndef EFD_CLOEXEC +# ifdef O_CLOEXEC +# define EFD_CLOEXEC O_CLOEXEC +# else +# define EFD_CLOEXEC 02000000 +# endif +# endif +EV_CPP(extern "C") int (eventfd) (unsigned int initval, int flags); +#endif + +#if EV_USE_SIGNALFD +/* our minimum requirement is glibc 2.7 which has the stub, but not the full header */ +# include +# ifndef SFD_NONBLOCK +# define SFD_NONBLOCK O_NONBLOCK +# endif +# ifndef SFD_CLOEXEC +# ifdef O_CLOEXEC +# define SFD_CLOEXEC O_CLOEXEC +# else +# define SFD_CLOEXEC 02000000 +# endif +# endif +EV_CPP (extern "C") int (signalfd) (int fd, const sigset_t *mask, int flags); + +struct signalfd_siginfo +{ + uint32_t ssi_signo; + char pad[128 - sizeof (uint32_t)]; +}; +#endif + +/* for timerfd, libev core requires TFD_TIMER_CANCEL_ON_SET &c */ +#if EV_USE_TIMERFD +# include +/* timerfd is only used for periodics */ +# if !(defined (TFD_TIMER_CANCEL_ON_SET) && defined (TFD_CLOEXEC) && defined (TFD_NONBLOCK)) || !EV_PERIODIC_ENABLE +# undef EV_USE_TIMERFD +# define EV_USE_TIMERFD 0 +# endif +#endif + +/*****************************************************************************/ + +#if EV_VERIFY >= 3 +# define EV_FREQUENT_CHECK ev_verify (EV_A) +#else +# define EV_FREQUENT_CHECK do { } while (0) +#endif + +/* + * This is used to work around floating point rounding problems. + * This value is good at least till the year 4000. + */ +#define MIN_INTERVAL 0.0001220703125 /* 1/2**13, good till 4000 */ +/*#define MIN_INTERVAL 0.00000095367431640625 /* 1/2**20, good till 2200 */ + +#define MIN_TIMEJUMP 1. /* minimum timejump that gets detected (if monotonic clock available) */ +#define MAX_BLOCKTIME 59.743 /* never wait longer than this time (to detect time jumps) */ +#define MAX_BLOCKTIME2 1500001.07 /* same, but when timerfd is used to detect jumps, also safe delay to not overflow */ + +/* find a portable timestamp that is "always" in the future but fits into time_t. + * this is quite hard, and we are mostly guessing - we handle 32 bit signed/unsigned time_t, + * and sizes larger than 32 bit, and maybe the unlikely floating point time_t */ +#define EV_TSTAMP_HUGE \ + (sizeof (time_t) >= 8 ? 10000000000000. \ + : 0 < (time_t)4294967295 ? 4294967295. \ + : 2147483647.) \ + +#ifndef EV_TS_CONST +# define EV_TS_CONST(nv) nv +# define EV_TS_TO_MSEC(a) a * 1e3 + 0.9999 +# define EV_TS_FROM_USEC(us) us * 1e-6 +# define EV_TV_SET(tv,t) do { tv.tv_sec = (long)t; tv.tv_usec = (long)((t - tv.tv_sec) * 1e6); } while (0) +# define EV_TS_SET(ts,t) do { ts.tv_sec = (long)t; ts.tv_nsec = (long)((t - ts.tv_sec) * 1e9); } while (0) +# define EV_TV_GET(tv) ((tv).tv_sec + (tv).tv_usec * 1e-6) +# define EV_TS_GET(ts) ((ts).tv_sec + (ts).tv_nsec * 1e-9) +#endif + +/* the following is ecb.h embedded into libev - use update_ev_c to update from an external copy */ +/* ECB.H BEGIN */ +/* + * libecb - http://software.schmorp.de/pkg/libecb + * + * Copyright (©) 2009-2015,2018-2020 Marc Alexander Lehmann + * Copyright (©) 2011 Emanuele Giaquinta + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#ifndef ECB_H +#define ECB_H + +/* 16 bits major, 16 bits minor */ +#define ECB_VERSION 0x00010008 + +#include /* for memcpy */ + +#if defined (_WIN32) && !defined (__MINGW32__) + typedef signed char int8_t; + typedef unsigned char uint8_t; + typedef signed char int_fast8_t; + typedef unsigned char uint_fast8_t; + typedef signed short int16_t; + typedef unsigned short uint16_t; + typedef signed int int_fast16_t; + typedef unsigned int uint_fast16_t; + typedef signed int int32_t; + typedef unsigned int uint32_t; + typedef signed int int_fast32_t; + typedef unsigned int uint_fast32_t; + #if __GNUC__ + typedef signed long long int64_t; + typedef unsigned long long uint64_t; + #else /* _MSC_VER || __BORLANDC__ */ + typedef signed __int64 int64_t; + typedef unsigned __int64 uint64_t; + #endif + typedef int64_t int_fast64_t; + typedef uint64_t uint_fast64_t; + #ifdef _WIN64 + #define ECB_PTRSIZE 8 + typedef uint64_t uintptr_t; + typedef int64_t intptr_t; + #else + #define ECB_PTRSIZE 4 + typedef uint32_t uintptr_t; + typedef int32_t intptr_t; + #endif +#else + #include + #if (defined INTPTR_MAX ? INTPTR_MAX : ULONG_MAX) > 0xffffffffU + #define ECB_PTRSIZE 8 + #else + #define ECB_PTRSIZE 4 + #endif +#endif + +#define ECB_GCC_AMD64 (__amd64 || __amd64__ || __x86_64 || __x86_64__) +#define ECB_MSVC_AMD64 (_M_AMD64 || _M_X64) + +#ifndef ECB_OPTIMIZE_SIZE + #if __OPTIMIZE_SIZE__ + #define ECB_OPTIMIZE_SIZE 1 + #else + #define ECB_OPTIMIZE_SIZE 0 + #endif +#endif + +/* work around x32 idiocy by defining proper macros */ +#if ECB_GCC_AMD64 || ECB_MSVC_AMD64 + #if _ILP32 + #define ECB_AMD64_X32 1 + #else + #define ECB_AMD64 1 + #endif +#endif + +/* many compilers define _GNUC_ to some versions but then only implement + * what their idiot authors think are the "more important" extensions, + * causing enormous grief in return for some better fake benchmark numbers. + * or so. + * we try to detect these and simply assume they are not gcc - if they have + * an issue with that they should have done it right in the first place. + */ +#if !defined __GNUC_MINOR__ || defined __INTEL_COMPILER || defined __SUNPRO_C || defined __SUNPRO_CC || defined __llvm__ || defined __clang__ + #define ECB_GCC_VERSION(major,minor) 0 +#else + #define ECB_GCC_VERSION(major,minor) (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) +#endif + +#define ECB_CLANG_VERSION(major,minor) (__clang_major__ > (major) || (__clang_major__ == (major) && __clang_minor__ >= (minor))) + +#if __clang__ && defined __has_builtin + #define ECB_CLANG_BUILTIN(x) __has_builtin (x) +#else + #define ECB_CLANG_BUILTIN(x) 0 +#endif + +#if __clang__ && defined __has_extension + #define ECB_CLANG_EXTENSION(x) __has_extension (x) +#else + #define ECB_CLANG_EXTENSION(x) 0 +#endif + +#define ECB_CPP (__cplusplus+0) +#define ECB_CPP11 (__cplusplus >= 201103L) +#define ECB_CPP14 (__cplusplus >= 201402L) +#define ECB_CPP17 (__cplusplus >= 201703L) + +#if ECB_CPP + #define ECB_C 0 + #define ECB_STDC_VERSION 0 +#else + #define ECB_C 1 + #define ECB_STDC_VERSION __STDC_VERSION__ +#endif + +#define ECB_C99 (ECB_STDC_VERSION >= 199901L) +#define ECB_C11 (ECB_STDC_VERSION >= 201112L) +#define ECB_C17 (ECB_STDC_VERSION >= 201710L) + +#if ECB_CPP + #define ECB_EXTERN_C extern "C" + #define ECB_EXTERN_C_BEG ECB_EXTERN_C { + #define ECB_EXTERN_C_END } +#else + #define ECB_EXTERN_C extern + #define ECB_EXTERN_C_BEG + #define ECB_EXTERN_C_END +#endif + +/*****************************************************************************/ + +/* ECB_NO_THREADS - ecb is not used by multiple threads, ever */ +/* ECB_NO_SMP - ecb might be used in multiple threads, but only on a single cpu */ + +#if ECB_NO_THREADS + #define ECB_NO_SMP 1 +#endif + +#if ECB_NO_SMP + #define ECB_MEMORY_FENCE do { } while (0) +#endif + +/* http://www-01.ibm.com/support/knowledgecenter/SSGH3R_13.1.0/com.ibm.xlcpp131.aix.doc/compiler_ref/compiler_builtins.html */ +#if __xlC__ && ECB_CPP + #include +#endif + +#if 1400 <= _MSC_VER + #include /* fence functions _ReadBarrier, also bit search functions _BitScanReverse */ +#endif + +#ifndef ECB_MEMORY_FENCE + #if ECB_GCC_VERSION(2,5) || defined __INTEL_COMPILER || (__llvm__ && __GNUC__) || __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 + #define ECB_MEMORY_FENCE_RELAXED __asm__ __volatile__ ("" : : : "memory") + #if __i386 || __i386__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory") + #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("" : : : "memory") + #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("" : : : "memory") + #elif ECB_GCC_AMD64 + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mfence" : : : "memory") + #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("" : : : "memory") + #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("" : : : "memory") + #elif __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("sync" : : : "memory") + #elif defined __ARM_ARCH_2__ \ + || defined __ARM_ARCH_3__ || defined __ARM_ARCH_3M__ \ + || defined __ARM_ARCH_4__ || defined __ARM_ARCH_4T__ \ + || defined __ARM_ARCH_5__ || defined __ARM_ARCH_5E__ \ + || defined __ARM_ARCH_5T__ || defined __ARM_ARCH_5TE__ \ + || defined __ARM_ARCH_5TEJ__ + /* should not need any, unless running old code on newer cpu - arm doesn't support that */ + #elif defined __ARM_ARCH_6__ || defined __ARM_ARCH_6J__ \ + || defined __ARM_ARCH_6K__ || defined __ARM_ARCH_6ZK__ \ + || defined __ARM_ARCH_6T2__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mcr p15,0,%0,c7,c10,5" : : "r" (0) : "memory") + #elif defined __ARM_ARCH_7__ || defined __ARM_ARCH_7A__ \ + || defined __ARM_ARCH_7R__ || defined __ARM_ARCH_7M__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("dmb" : : : "memory") + #elif __aarch64__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("dmb ish" : : : "memory") + #elif (__sparc || __sparc__) && !(__sparc_v8__ || defined __sparcv8) + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad | #StoreStore | #StoreLoad" : : : "memory") + #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad" : : : "memory") + #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("membar #LoadStore | #StoreStore") + #elif defined __s390__ || defined __s390x__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("bcr 15,0" : : : "memory") + #elif defined __mips__ + /* GNU/Linux emulates sync on mips1 architectures, so we force its use */ + /* anybody else who still uses mips1 is supposed to send in their version, with detection code. */ + #define ECB_MEMORY_FENCE __asm__ __volatile__ (".set mips2; sync; .set mips0" : : : "memory") + #elif defined __alpha__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mb" : : : "memory") + #elif defined __hppa__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("" : : : "memory") + #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("") + #elif defined __ia64__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mf" : : : "memory") + #elif defined __m68k__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("" : : : "memory") + #elif defined __m88k__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("tb1 0,%%r0,128" : : : "memory") + #elif defined __sh__ + #define ECB_MEMORY_FENCE __asm__ __volatile__ ("" : : : "memory") + #endif + #endif +#endif + +#ifndef ECB_MEMORY_FENCE + #if ECB_GCC_VERSION(4,7) + /* see comment below (stdatomic.h) about the C11 memory model. */ + #define ECB_MEMORY_FENCE __atomic_thread_fence (__ATOMIC_SEQ_CST) + #define ECB_MEMORY_FENCE_ACQUIRE __atomic_thread_fence (__ATOMIC_ACQUIRE) + #define ECB_MEMORY_FENCE_RELEASE __atomic_thread_fence (__ATOMIC_RELEASE) + #define ECB_MEMORY_FENCE_RELAXED __atomic_thread_fence (__ATOMIC_RELAXED) + + #elif ECB_CLANG_EXTENSION(c_atomic) + /* see comment below (stdatomic.h) about the C11 memory model. */ + #define ECB_MEMORY_FENCE __c11_atomic_thread_fence (__ATOMIC_SEQ_CST) + #define ECB_MEMORY_FENCE_ACQUIRE __c11_atomic_thread_fence (__ATOMIC_ACQUIRE) + #define ECB_MEMORY_FENCE_RELEASE __c11_atomic_thread_fence (__ATOMIC_RELEASE) + #define ECB_MEMORY_FENCE_RELAXED __c11_atomic_thread_fence (__ATOMIC_RELAXED) + + #elif ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__ + #define ECB_MEMORY_FENCE __sync_synchronize () + #elif _MSC_VER >= 1500 /* VC++ 2008 */ + /* apparently, microsoft broke all the memory barrier stuff in Visual Studio 2008... */ + #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) + #define ECB_MEMORY_FENCE _ReadWriteBarrier (); MemoryBarrier() + #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier (); MemoryBarrier() /* according to msdn, _ReadBarrier is not a load fence */ + #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier (); MemoryBarrier() + #elif _MSC_VER >= 1400 /* VC++ 2005 */ + #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) + #define ECB_MEMORY_FENCE _ReadWriteBarrier () + #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */ + #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier () + #elif defined _WIN32 + #include + #define ECB_MEMORY_FENCE MemoryBarrier () /* actually just xchg on x86... scary */ + #elif __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110 + #include + #define ECB_MEMORY_FENCE __machine_rw_barrier () + #define ECB_MEMORY_FENCE_ACQUIRE __machine_acq_barrier () + #define ECB_MEMORY_FENCE_RELEASE __machine_rel_barrier () + #define ECB_MEMORY_FENCE_RELAXED __compiler_barrier () + #elif __xlC__ + #define ECB_MEMORY_FENCE __sync () + #endif +#endif + +#ifndef ECB_MEMORY_FENCE + #if ECB_C11 && !defined __STDC_NO_ATOMICS__ + /* we assume that these memory fences work on all variables/all memory accesses, */ + /* not just C11 atomics and atomic accesses */ + #include + #define ECB_MEMORY_FENCE atomic_thread_fence (memory_order_seq_cst) + #define ECB_MEMORY_FENCE_ACQUIRE atomic_thread_fence (memory_order_acquire) + #define ECB_MEMORY_FENCE_RELEASE atomic_thread_fence (memory_order_release) + #endif +#endif + +#ifndef ECB_MEMORY_FENCE + #if !ECB_AVOID_PTHREADS + /* + * if you get undefined symbol references to pthread_mutex_lock, + * or failure to find pthread.h, then you should implement + * the ECB_MEMORY_FENCE operations for your cpu/compiler + * OR provide pthread.h and link against the posix thread library + * of your system. + */ + #include + #define ECB_NEEDS_PTHREADS 1 + #define ECB_MEMORY_FENCE_NEEDS_PTHREADS 1 + + static pthread_mutex_t ecb_mf_lock = PTHREAD_MUTEX_INITIALIZER; + #define ECB_MEMORY_FENCE do { pthread_mutex_lock (&ecb_mf_lock); pthread_mutex_unlock (&ecb_mf_lock); } while (0) + #endif +#endif + +#if !defined ECB_MEMORY_FENCE_ACQUIRE && defined ECB_MEMORY_FENCE + #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE +#endif + +#if !defined ECB_MEMORY_FENCE_RELEASE && defined ECB_MEMORY_FENCE + #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE +#endif + +#if !defined ECB_MEMORY_FENCE_RELAXED && defined ECB_MEMORY_FENCE + #define ECB_MEMORY_FENCE_RELAXED ECB_MEMORY_FENCE /* very heavy-handed */ +#endif + +/*****************************************************************************/ + +#if ECB_CPP + #define ecb_inline static inline +#elif ECB_GCC_VERSION(2,5) + #define ecb_inline static __inline__ +#elif ECB_C99 + #define ecb_inline static inline +#else + #define ecb_inline static +#endif + +#if ECB_GCC_VERSION(3,3) + #define ecb_restrict __restrict__ +#elif ECB_C99 + #define ecb_restrict restrict +#else + #define ecb_restrict +#endif + +typedef int ecb_bool; + +#define ECB_CONCAT_(a, b) a ## b +#define ECB_CONCAT(a, b) ECB_CONCAT_(a, b) +#define ECB_STRINGIFY_(a) # a +#define ECB_STRINGIFY(a) ECB_STRINGIFY_(a) +#define ECB_STRINGIFY_EXPR(expr) ((expr), ECB_STRINGIFY_ (expr)) + +#define ecb_function_ ecb_inline + +#if ECB_GCC_VERSION(3,1) || ECB_CLANG_VERSION(2,8) + #define ecb_attribute(attrlist) __attribute__ (attrlist) +#else + #define ecb_attribute(attrlist) +#endif + +#if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_constant_p) + #define ecb_is_constant(expr) __builtin_constant_p (expr) +#else + /* possible C11 impl for integral types + typedef struct ecb_is_constant_struct ecb_is_constant_struct; + #define ecb_is_constant(expr) _Generic ((1 ? (struct ecb_is_constant_struct *)0 : (void *)((expr) - (expr)), ecb_is_constant_struct *: 0, default: 1)) */ + + #define ecb_is_constant(expr) 0 +#endif + +#if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_expect) + #define ecb_expect(expr,value) __builtin_expect ((expr),(value)) +#else + #define ecb_expect(expr,value) (expr) +#endif + +#if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_prefetch) + #define ecb_prefetch(addr,rw,locality) __builtin_prefetch (addr, rw, locality) +#else + #define ecb_prefetch(addr,rw,locality) +#endif + +/* no emulation for ecb_decltype */ +#if ECB_CPP11 + // older implementations might have problems with decltype(x)::type, work around it + template struct ecb_decltype_t { typedef T type; }; + #define ecb_decltype(x) ecb_decltype_t::type +#elif ECB_GCC_VERSION(3,0) || ECB_CLANG_VERSION(2,8) + #define ecb_decltype(x) __typeof__ (x) +#endif + +#if _MSC_VER >= 1300 + #define ecb_deprecated __declspec (deprecated) +#else + #define ecb_deprecated ecb_attribute ((__deprecated__)) +#endif + +#if _MSC_VER >= 1500 + #define ecb_deprecated_message(msg) __declspec (deprecated (msg)) +#elif ECB_GCC_VERSION(4,5) + #define ecb_deprecated_message(msg) ecb_attribute ((__deprecated__ (msg)) +#else + #define ecb_deprecated_message(msg) ecb_deprecated +#endif + +#if _MSC_VER >= 1400 + #define ecb_noinline __declspec (noinline) +#else + #define ecb_noinline ecb_attribute ((__noinline__)) +#endif + +#define ecb_unused ecb_attribute ((__unused__)) +#define ecb_const ecb_attribute ((__const__)) +#define ecb_pure ecb_attribute ((__pure__)) + +#if ECB_C11 || __IBMC_NORETURN + /* http://www-01.ibm.com/support/knowledgecenter/SSGH3R_13.1.0/com.ibm.xlcpp131.aix.doc/language_ref/noreturn.html */ + #define ecb_noreturn _Noreturn +#elif ECB_CPP11 + #define ecb_noreturn [[noreturn]] +#elif _MSC_VER >= 1200 + /* http://msdn.microsoft.com/en-us/library/k6ktzx3s.aspx */ + #define ecb_noreturn __declspec (noreturn) +#else + #define ecb_noreturn ecb_attribute ((__noreturn__)) +#endif + +#if ECB_GCC_VERSION(4,3) + #define ecb_artificial ecb_attribute ((__artificial__)) + #define ecb_hot ecb_attribute ((__hot__)) + #define ecb_cold ecb_attribute ((__cold__)) +#else + #define ecb_artificial + #define ecb_hot + #define ecb_cold +#endif + +/* put around conditional expressions if you are very sure that the */ +/* expression is mostly true or mostly false. note that these return */ +/* booleans, not the expression. */ +#define ecb_expect_false(expr) ecb_expect (!!(expr), 0) +#define ecb_expect_true(expr) ecb_expect (!!(expr), 1) +/* for compatibility to the rest of the world */ +#define ecb_likely(expr) ecb_expect_true (expr) +#define ecb_unlikely(expr) ecb_expect_false (expr) + +/* count trailing zero bits and count # of one bits */ +#if ECB_GCC_VERSION(3,4) \ + || (ECB_CLANG_BUILTIN(__builtin_clz) && ECB_CLANG_BUILTIN(__builtin_clzll) \ + && ECB_CLANG_BUILTIN(__builtin_ctz) && ECB_CLANG_BUILTIN(__builtin_ctzll) \ + && ECB_CLANG_BUILTIN(__builtin_popcount)) + /* we assume int == 32 bit, long == 32 or 64 bit and long long == 64 bit */ + #define ecb_ld32(x) (__builtin_clz (x) ^ 31) + #define ecb_ld64(x) (__builtin_clzll (x) ^ 63) + #define ecb_ctz32(x) __builtin_ctz (x) + #define ecb_ctz64(x) __builtin_ctzll (x) + #define ecb_popcount32(x) __builtin_popcount (x) + /* no popcountll */ +#else + ecb_function_ ecb_const int ecb_ctz32 (uint32_t x); + ecb_function_ ecb_const int + ecb_ctz32 (uint32_t x) + { +#if 1400 <= _MSC_VER && (_M_IX86 || _M_X64 || _M_IA64 || _M_ARM) + unsigned long r; + _BitScanForward (&r, x); + return (int)r; +#else + int r = 0; + + x &= ~x + 1; /* this isolates the lowest bit */ + +#if ECB_branchless_on_i386 + r += !!(x & 0xaaaaaaaa) << 0; + r += !!(x & 0xcccccccc) << 1; + r += !!(x & 0xf0f0f0f0) << 2; + r += !!(x & 0xff00ff00) << 3; + r += !!(x & 0xffff0000) << 4; +#else + if (x & 0xaaaaaaaa) r += 1; + if (x & 0xcccccccc) r += 2; + if (x & 0xf0f0f0f0) r += 4; + if (x & 0xff00ff00) r += 8; + if (x & 0xffff0000) r += 16; +#endif + + return r; +#endif + } + + ecb_function_ ecb_const int ecb_ctz64 (uint64_t x); + ecb_function_ ecb_const int + ecb_ctz64 (uint64_t x) + { +#if 1400 <= _MSC_VER && (_M_X64 || _M_IA64 || _M_ARM) + unsigned long r; + _BitScanForward64 (&r, x); + return (int)r; +#else + int shift = x & 0xffffffff ? 0 : 32; + return ecb_ctz32 (x >> shift) + shift; +#endif + } + + ecb_function_ ecb_const int ecb_popcount32 (uint32_t x); + ecb_function_ ecb_const int + ecb_popcount32 (uint32_t x) + { + x -= (x >> 1) & 0x55555555; + x = ((x >> 2) & 0x33333333) + (x & 0x33333333); + x = ((x >> 4) + x) & 0x0f0f0f0f; + x *= 0x01010101; + + return x >> 24; + } + + ecb_function_ ecb_const int ecb_ld32 (uint32_t x); + ecb_function_ ecb_const int ecb_ld32 (uint32_t x) + { +#if 1400 <= _MSC_VER && (_M_IX86 || _M_X64 || _M_IA64 || _M_ARM) + unsigned long r; + _BitScanReverse (&r, x); + return (int)r; +#else + int r = 0; + + if (x >> 16) { x >>= 16; r += 16; } + if (x >> 8) { x >>= 8; r += 8; } + if (x >> 4) { x >>= 4; r += 4; } + if (x >> 2) { x >>= 2; r += 2; } + if (x >> 1) { r += 1; } + + return r; +#endif + } + + ecb_function_ ecb_const int ecb_ld64 (uint64_t x); + ecb_function_ ecb_const int ecb_ld64 (uint64_t x) + { +#if 1400 <= _MSC_VER && (_M_X64 || _M_IA64 || _M_ARM) + unsigned long r; + _BitScanReverse64 (&r, x); + return (int)r; +#else + int r = 0; + + if (x >> 32) { x >>= 32; r += 32; } + + return r + ecb_ld32 (x); +#endif + } +#endif + +ecb_function_ ecb_const ecb_bool ecb_is_pot32 (uint32_t x); +ecb_function_ ecb_const ecb_bool ecb_is_pot32 (uint32_t x) { return !(x & (x - 1)); } +ecb_function_ ecb_const ecb_bool ecb_is_pot64 (uint64_t x); +ecb_function_ ecb_const ecb_bool ecb_is_pot64 (uint64_t x) { return !(x & (x - 1)); } + +ecb_function_ ecb_const uint8_t ecb_bitrev8 (uint8_t x); +ecb_function_ ecb_const uint8_t ecb_bitrev8 (uint8_t x) +{ + return ( (x * 0x0802U & 0x22110U) + | (x * 0x8020U & 0x88440U)) * 0x10101U >> 16; +} + +ecb_function_ ecb_const uint16_t ecb_bitrev16 (uint16_t x); +ecb_function_ ecb_const uint16_t ecb_bitrev16 (uint16_t x) +{ + x = ((x >> 1) & 0x5555) | ((x & 0x5555) << 1); + x = ((x >> 2) & 0x3333) | ((x & 0x3333) << 2); + x = ((x >> 4) & 0x0f0f) | ((x & 0x0f0f) << 4); + x = ( x >> 8 ) | ( x << 8); + + return x; +} + +ecb_function_ ecb_const uint32_t ecb_bitrev32 (uint32_t x); +ecb_function_ ecb_const uint32_t ecb_bitrev32 (uint32_t x) +{ + x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1); + x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2); + x = ((x >> 4) & 0x0f0f0f0f) | ((x & 0x0f0f0f0f) << 4); + x = ((x >> 8) & 0x00ff00ff) | ((x & 0x00ff00ff) << 8); + x = ( x >> 16 ) | ( x << 16); + + return x; +} + +/* popcount64 is only available on 64 bit cpus as gcc builtin */ +/* so for this version we are lazy */ +ecb_function_ ecb_const int ecb_popcount64 (uint64_t x); +ecb_function_ ecb_const int +ecb_popcount64 (uint64_t x) +{ + return ecb_popcount32 (x) + ecb_popcount32 (x >> 32); +} + +ecb_inline ecb_const uint8_t ecb_rotl8 (uint8_t x, unsigned int count); +ecb_inline ecb_const uint8_t ecb_rotr8 (uint8_t x, unsigned int count); +ecb_inline ecb_const uint16_t ecb_rotl16 (uint16_t x, unsigned int count); +ecb_inline ecb_const uint16_t ecb_rotr16 (uint16_t x, unsigned int count); +ecb_inline ecb_const uint32_t ecb_rotl32 (uint32_t x, unsigned int count); +ecb_inline ecb_const uint32_t ecb_rotr32 (uint32_t x, unsigned int count); +ecb_inline ecb_const uint64_t ecb_rotl64 (uint64_t x, unsigned int count); +ecb_inline ecb_const uint64_t ecb_rotr64 (uint64_t x, unsigned int count); + +ecb_inline ecb_const uint8_t ecb_rotl8 (uint8_t x, unsigned int count) { return (x >> ( 8 - count)) | (x << count); } +ecb_inline ecb_const uint8_t ecb_rotr8 (uint8_t x, unsigned int count) { return (x << ( 8 - count)) | (x >> count); } +ecb_inline ecb_const uint16_t ecb_rotl16 (uint16_t x, unsigned int count) { return (x >> (16 - count)) | (x << count); } +ecb_inline ecb_const uint16_t ecb_rotr16 (uint16_t x, unsigned int count) { return (x << (16 - count)) | (x >> count); } +ecb_inline ecb_const uint32_t ecb_rotl32 (uint32_t x, unsigned int count) { return (x >> (32 - count)) | (x << count); } +ecb_inline ecb_const uint32_t ecb_rotr32 (uint32_t x, unsigned int count) { return (x << (32 - count)) | (x >> count); } +ecb_inline ecb_const uint64_t ecb_rotl64 (uint64_t x, unsigned int count) { return (x >> (64 - count)) | (x << count); } +ecb_inline ecb_const uint64_t ecb_rotr64 (uint64_t x, unsigned int count) { return (x << (64 - count)) | (x >> count); } + +#if ECB_CPP + +inline uint8_t ecb_ctz (uint8_t v) { return ecb_ctz32 (v); } +inline uint16_t ecb_ctz (uint16_t v) { return ecb_ctz32 (v); } +inline uint32_t ecb_ctz (uint32_t v) { return ecb_ctz32 (v); } +inline uint64_t ecb_ctz (uint64_t v) { return ecb_ctz64 (v); } + +inline bool ecb_is_pot (uint8_t v) { return ecb_is_pot32 (v); } +inline bool ecb_is_pot (uint16_t v) { return ecb_is_pot32 (v); } +inline bool ecb_is_pot (uint32_t v) { return ecb_is_pot32 (v); } +inline bool ecb_is_pot (uint64_t v) { return ecb_is_pot64 (v); } + +inline int ecb_ld (uint8_t v) { return ecb_ld32 (v); } +inline int ecb_ld (uint16_t v) { return ecb_ld32 (v); } +inline int ecb_ld (uint32_t v) { return ecb_ld32 (v); } +inline int ecb_ld (uint64_t v) { return ecb_ld64 (v); } + +inline int ecb_popcount (uint8_t v) { return ecb_popcount32 (v); } +inline int ecb_popcount (uint16_t v) { return ecb_popcount32 (v); } +inline int ecb_popcount (uint32_t v) { return ecb_popcount32 (v); } +inline int ecb_popcount (uint64_t v) { return ecb_popcount64 (v); } + +inline uint8_t ecb_bitrev (uint8_t v) { return ecb_bitrev8 (v); } +inline uint16_t ecb_bitrev (uint16_t v) { return ecb_bitrev16 (v); } +inline uint32_t ecb_bitrev (uint32_t v) { return ecb_bitrev32 (v); } + +inline uint8_t ecb_rotl (uint8_t v, unsigned int count) { return ecb_rotl8 (v, count); } +inline uint16_t ecb_rotl (uint16_t v, unsigned int count) { return ecb_rotl16 (v, count); } +inline uint32_t ecb_rotl (uint32_t v, unsigned int count) { return ecb_rotl32 (v, count); } +inline uint64_t ecb_rotl (uint64_t v, unsigned int count) { return ecb_rotl64 (v, count); } + +inline uint8_t ecb_rotr (uint8_t v, unsigned int count) { return ecb_rotr8 (v, count); } +inline uint16_t ecb_rotr (uint16_t v, unsigned int count) { return ecb_rotr16 (v, count); } +inline uint32_t ecb_rotr (uint32_t v, unsigned int count) { return ecb_rotr32 (v, count); } +inline uint64_t ecb_rotr (uint64_t v, unsigned int count) { return ecb_rotr64 (v, count); } + +#endif + +#if ECB_GCC_VERSION(4,3) || (ECB_CLANG_BUILTIN(__builtin_bswap32) && ECB_CLANG_BUILTIN(__builtin_bswap64)) + #if ECB_GCC_VERSION(4,8) || ECB_CLANG_BUILTIN(__builtin_bswap16) + #define ecb_bswap16(x) __builtin_bswap16 (x) + #else + #define ecb_bswap16(x) (__builtin_bswap32 (x) >> 16) + #endif + #define ecb_bswap32(x) __builtin_bswap32 (x) + #define ecb_bswap64(x) __builtin_bswap64 (x) +#elif _MSC_VER + #include + #define ecb_bswap16(x) ((uint16_t)_byteswap_ushort ((uint16_t)(x))) + #define ecb_bswap32(x) ((uint32_t)_byteswap_ulong ((uint32_t)(x))) + #define ecb_bswap64(x) ((uint64_t)_byteswap_uint64 ((uint64_t)(x))) +#else + ecb_function_ ecb_const uint16_t ecb_bswap16 (uint16_t x); + ecb_function_ ecb_const uint16_t + ecb_bswap16 (uint16_t x) + { + return ecb_rotl16 (x, 8); + } + + ecb_function_ ecb_const uint32_t ecb_bswap32 (uint32_t x); + ecb_function_ ecb_const uint32_t + ecb_bswap32 (uint32_t x) + { + return (((uint32_t)ecb_bswap16 (x)) << 16) | ecb_bswap16 (x >> 16); + } + + ecb_function_ ecb_const uint64_t ecb_bswap64 (uint64_t x); + ecb_function_ ecb_const uint64_t + ecb_bswap64 (uint64_t x) + { + return (((uint64_t)ecb_bswap32 (x)) << 32) | ecb_bswap32 (x >> 32); + } +#endif + +#if ECB_GCC_VERSION(4,5) || ECB_CLANG_BUILTIN(__builtin_unreachable) + #define ecb_unreachable() __builtin_unreachable () +#else + /* this seems to work fine, but gcc always emits a warning for it :/ */ + ecb_inline ecb_noreturn void ecb_unreachable (void); + ecb_inline ecb_noreturn void ecb_unreachable (void) { } +#endif + +/* try to tell the compiler that some condition is definitely true */ +#define ecb_assume(cond) if (!(cond)) ecb_unreachable (); else 0 + +ecb_inline ecb_const uint32_t ecb_byteorder_helper (void); +ecb_inline ecb_const uint32_t +ecb_byteorder_helper (void) +{ + /* the union code still generates code under pressure in gcc, */ + /* but less than using pointers, and always seems to */ + /* successfully return a constant. */ + /* the reason why we have this horrible preprocessor mess */ + /* is to avoid it in all cases, at least on common architectures */ + /* or when using a recent enough gcc version (>= 4.6) */ +#if (defined __BYTE_ORDER__ && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \ + || ((__i386 || __i386__ || _M_IX86 || ECB_GCC_AMD64 || ECB_MSVC_AMD64) && !__VOS__) + #define ECB_LITTLE_ENDIAN 1 + return 0x44332211; +#elif (defined __BYTE_ORDER__ && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) \ + || ((__AARCH64EB__ || __MIPSEB__ || __ARMEB__) && !__VOS__) + #define ECB_BIG_ENDIAN 1 + return 0x11223344; +#else + union + { + uint8_t c[4]; + uint32_t u; + } u = { 0x11, 0x22, 0x33, 0x44 }; + return u.u; +#endif +} + +ecb_inline ecb_const ecb_bool ecb_big_endian (void); +ecb_inline ecb_const ecb_bool ecb_big_endian (void) { return ecb_byteorder_helper () == 0x11223344; } +ecb_inline ecb_const ecb_bool ecb_little_endian (void); +ecb_inline ecb_const ecb_bool ecb_little_endian (void) { return ecb_byteorder_helper () == 0x44332211; } + +/*****************************************************************************/ +/* unaligned load/store */ + +ecb_inline uint_fast16_t ecb_be_u16_to_host (uint_fast16_t v) { return ecb_little_endian () ? ecb_bswap16 (v) : v; } +ecb_inline uint_fast32_t ecb_be_u32_to_host (uint_fast32_t v) { return ecb_little_endian () ? ecb_bswap32 (v) : v; } +ecb_inline uint_fast64_t ecb_be_u64_to_host (uint_fast64_t v) { return ecb_little_endian () ? ecb_bswap64 (v) : v; } + +ecb_inline uint_fast16_t ecb_le_u16_to_host (uint_fast16_t v) { return ecb_big_endian () ? ecb_bswap16 (v) : v; } +ecb_inline uint_fast32_t ecb_le_u32_to_host (uint_fast32_t v) { return ecb_big_endian () ? ecb_bswap32 (v) : v; } +ecb_inline uint_fast64_t ecb_le_u64_to_host (uint_fast64_t v) { return ecb_big_endian () ? ecb_bswap64 (v) : v; } + +ecb_inline uint_fast16_t ecb_peek_u16_u (const void *ptr) { uint16_t v; memcpy (&v, ptr, sizeof (v)); return v; } +ecb_inline uint_fast32_t ecb_peek_u32_u (const void *ptr) { uint32_t v; memcpy (&v, ptr, sizeof (v)); return v; } +ecb_inline uint_fast64_t ecb_peek_u64_u (const void *ptr) { uint64_t v; memcpy (&v, ptr, sizeof (v)); return v; } + +ecb_inline uint_fast16_t ecb_peek_be_u16_u (const void *ptr) { return ecb_be_u16_to_host (ecb_peek_u16_u (ptr)); } +ecb_inline uint_fast32_t ecb_peek_be_u32_u (const void *ptr) { return ecb_be_u32_to_host (ecb_peek_u32_u (ptr)); } +ecb_inline uint_fast64_t ecb_peek_be_u64_u (const void *ptr) { return ecb_be_u64_to_host (ecb_peek_u64_u (ptr)); } + +ecb_inline uint_fast16_t ecb_peek_le_u16_u (const void *ptr) { return ecb_le_u16_to_host (ecb_peek_u16_u (ptr)); } +ecb_inline uint_fast32_t ecb_peek_le_u32_u (const void *ptr) { return ecb_le_u32_to_host (ecb_peek_u32_u (ptr)); } +ecb_inline uint_fast64_t ecb_peek_le_u64_u (const void *ptr) { return ecb_le_u64_to_host (ecb_peek_u64_u (ptr)); } + +ecb_inline uint_fast16_t ecb_host_to_be_u16 (uint_fast16_t v) { return ecb_little_endian () ? ecb_bswap16 (v) : v; } +ecb_inline uint_fast32_t ecb_host_to_be_u32 (uint_fast32_t v) { return ecb_little_endian () ? ecb_bswap32 (v) : v; } +ecb_inline uint_fast64_t ecb_host_to_be_u64 (uint_fast64_t v) { return ecb_little_endian () ? ecb_bswap64 (v) : v; } + +ecb_inline uint_fast16_t ecb_host_to_le_u16 (uint_fast16_t v) { return ecb_big_endian () ? ecb_bswap16 (v) : v; } +ecb_inline uint_fast32_t ecb_host_to_le_u32 (uint_fast32_t v) { return ecb_big_endian () ? ecb_bswap32 (v) : v; } +ecb_inline uint_fast64_t ecb_host_to_le_u64 (uint_fast64_t v) { return ecb_big_endian () ? ecb_bswap64 (v) : v; } + +ecb_inline void ecb_poke_u16_u (void *ptr, uint16_t v) { memcpy (ptr, &v, sizeof (v)); } +ecb_inline void ecb_poke_u32_u (void *ptr, uint32_t v) { memcpy (ptr, &v, sizeof (v)); } +ecb_inline void ecb_poke_u64_u (void *ptr, uint64_t v) { memcpy (ptr, &v, sizeof (v)); } + +ecb_inline void ecb_poke_be_u16_u (void *ptr, uint_fast16_t v) { ecb_poke_u16_u (ptr, ecb_host_to_be_u16 (v)); } +ecb_inline void ecb_poke_be_u32_u (void *ptr, uint_fast32_t v) { ecb_poke_u32_u (ptr, ecb_host_to_be_u32 (v)); } +ecb_inline void ecb_poke_be_u64_u (void *ptr, uint_fast64_t v) { ecb_poke_u64_u (ptr, ecb_host_to_be_u64 (v)); } + +ecb_inline void ecb_poke_le_u16_u (void *ptr, uint_fast16_t v) { ecb_poke_u16_u (ptr, ecb_host_to_le_u16 (v)); } +ecb_inline void ecb_poke_le_u32_u (void *ptr, uint_fast32_t v) { ecb_poke_u32_u (ptr, ecb_host_to_le_u32 (v)); } +ecb_inline void ecb_poke_le_u64_u (void *ptr, uint_fast64_t v) { ecb_poke_u64_u (ptr, ecb_host_to_le_u64 (v)); } + +#if ECB_CPP + +inline uint8_t ecb_bswap (uint8_t v) { return v; } +inline uint16_t ecb_bswap (uint16_t v) { return ecb_bswap16 (v); } +inline uint32_t ecb_bswap (uint32_t v) { return ecb_bswap32 (v); } +inline uint64_t ecb_bswap (uint64_t v) { return ecb_bswap64 (v); } + +template inline T ecb_be_to_host (T v) { return ecb_little_endian () ? ecb_bswap (v) : v; } +template inline T ecb_le_to_host (T v) { return ecb_big_endian () ? ecb_bswap (v) : v; } +template inline T ecb_peek (const void *ptr) { return *(const T *)ptr; } +template inline T ecb_peek_be (const void *ptr) { return ecb_be_to_host (ecb_peek (ptr)); } +template inline T ecb_peek_le (const void *ptr) { return ecb_le_to_host (ecb_peek (ptr)); } +template inline T ecb_peek_u (const void *ptr) { T v; memcpy (&v, ptr, sizeof (v)); return v; } +template inline T ecb_peek_be_u (const void *ptr) { return ecb_be_to_host (ecb_peek_u (ptr)); } +template inline T ecb_peek_le_u (const void *ptr) { return ecb_le_to_host (ecb_peek_u (ptr)); } + +template inline T ecb_host_to_be (T v) { return ecb_little_endian () ? ecb_bswap (v) : v; } +template inline T ecb_host_to_le (T v) { return ecb_big_endian () ? ecb_bswap (v) : v; } +template inline void ecb_poke (void *ptr, T v) { *(T *)ptr = v; } +template inline void ecb_poke_be (void *ptr, T v) { return ecb_poke (ptr, ecb_host_to_be (v)); } +template inline void ecb_poke_le (void *ptr, T v) { return ecb_poke (ptr, ecb_host_to_le (v)); } +template inline void ecb_poke_u (void *ptr, T v) { memcpy (ptr, &v, sizeof (v)); } +template inline void ecb_poke_be_u (void *ptr, T v) { return ecb_poke_u (ptr, ecb_host_to_be (v)); } +template inline void ecb_poke_le_u (void *ptr, T v) { return ecb_poke_u (ptr, ecb_host_to_le (v)); } + +#endif + +/*****************************************************************************/ + +#if ECB_GCC_VERSION(3,0) || ECB_C99 + #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0)) +#else + #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n))) +#endif + +#if ECB_CPP + template + static inline T ecb_div_rd (T val, T div) + { + return val < 0 ? - ((-val + div - 1) / div) : (val ) / div; + } + template + static inline T ecb_div_ru (T val, T div) + { + return val < 0 ? - ((-val ) / div) : (val + div - 1) / div; + } +#else + #define ecb_div_rd(val,div) ((val) < 0 ? - ((-(val) + (div) - 1) / (div)) : ((val) ) / (div)) + #define ecb_div_ru(val,div) ((val) < 0 ? - ((-(val) ) / (div)) : ((val) + (div) - 1) / (div)) +#endif + +#if ecb_cplusplus_does_not_suck + /* does not work for local types (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm) */ + template + static inline int ecb_array_length (const T (&arr)[N]) + { + return N; + } +#else + #define ecb_array_length(name) (sizeof (name) / sizeof (name [0])) +#endif + +/*****************************************************************************/ + +ecb_function_ ecb_const uint32_t ecb_binary16_to_binary32 (uint32_t x); +ecb_function_ ecb_const uint32_t +ecb_binary16_to_binary32 (uint32_t x) +{ + unsigned int s = (x & 0x8000) << (31 - 15); + int e = (x >> 10) & 0x001f; + unsigned int m = x & 0x03ff; + + if (ecb_expect_false (e == 31)) + /* infinity or NaN */ + e = 255 - (127 - 15); + else if (ecb_expect_false (!e)) + { + if (ecb_expect_true (!m)) + /* zero, handled by code below by forcing e to 0 */ + e = 0 - (127 - 15); + else + { + /* subnormal, renormalise */ + unsigned int s = 10 - ecb_ld32 (m); + + m = (m << s) & 0x3ff; /* mask implicit bit */ + e -= s - 1; + } + } + + /* e and m now are normalised, or zero, (or inf or nan) */ + e += 127 - 15; + + return s | (e << 23) | (m << (23 - 10)); +} + +ecb_function_ ecb_const uint16_t ecb_binary32_to_binary16 (uint32_t x); +ecb_function_ ecb_const uint16_t +ecb_binary32_to_binary16 (uint32_t x) +{ + unsigned int s = (x >> 16) & 0x00008000; /* sign bit, the easy part */ + unsigned int e = ((x >> 23) & 0x000000ff) - (127 - 15); /* the desired exponent */ + unsigned int m = x & 0x007fffff; + + x &= 0x7fffffff; + + /* if it's within range of binary16 normals, use fast path */ + if (ecb_expect_true (0x38800000 <= x && x <= 0x477fefff)) + { + /* mantissa round-to-even */ + m += 0x00000fff + ((m >> (23 - 10)) & 1); + + /* handle overflow */ + if (ecb_expect_false (m >= 0x00800000)) + { + m >>= 1; + e += 1; + } + + return s | (e << 10) | (m >> (23 - 10)); + } + + /* handle large numbers and infinity */ + if (ecb_expect_true (0x477fefff < x && x <= 0x7f800000)) + return s | 0x7c00; + + /* handle zero, subnormals and small numbers */ + if (ecb_expect_true (x < 0x38800000)) + { + /* zero */ + if (ecb_expect_true (!x)) + return s; + + /* handle subnormals */ + + /* too small, will be zero */ + if (e < (14 - 24)) /* might not be sharp, but is good enough */ + return s; + + m |= 0x00800000; /* make implicit bit explicit */ + + /* very tricky - we need to round to the nearest e (+10) bit value */ + { + unsigned int bits = 14 - e; + unsigned int half = (1 << (bits - 1)) - 1; + unsigned int even = (m >> bits) & 1; + + /* if this overflows, we will end up with a normalised number */ + m = (m + half + even) >> bits; + } + + return s | m; + } + + /* handle NaNs, preserve leftmost nan bits, but make sure we don't turn them into infinities */ + m >>= 13; + + return s | 0x7c00 | m | !m; +} + +/*******************************************************************************/ +/* floating point stuff, can be disabled by defining ECB_NO_LIBM */ + +/* basically, everything uses "ieee pure-endian" floating point numbers */ +/* the only noteworthy exception is ancient armle, which uses order 43218765 */ +#if 0 \ + || __i386 || __i386__ \ + || ECB_GCC_AMD64 \ + || __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__ \ + || defined __s390__ || defined __s390x__ \ + || defined __mips__ \ + || defined __alpha__ \ + || defined __hppa__ \ + || defined __ia64__ \ + || defined __m68k__ \ + || defined __m88k__ \ + || defined __sh__ \ + || defined _M_IX86 || defined ECB_MSVC_AMD64 || defined _M_IA64 \ + || (defined __arm__ && (defined __ARM_EABI__ || defined __EABI__ || defined __VFP_FP__ || defined _WIN32_WCE || defined __ANDROID__)) \ + || defined __aarch64__ + #define ECB_STDFP 1 +#else + #define ECB_STDFP 0 +#endif + +#ifndef ECB_NO_LIBM + + #include /* for frexp*, ldexp*, INFINITY, NAN */ + + /* only the oldest of old doesn't have this one. solaris. */ + #ifdef INFINITY + #define ECB_INFINITY INFINITY + #else + #define ECB_INFINITY HUGE_VAL + #endif + + #ifdef NAN + #define ECB_NAN NAN + #else + #define ECB_NAN ECB_INFINITY + #endif + + #if ECB_C99 || _XOPEN_VERSION >= 600 || _POSIX_VERSION >= 200112L + #define ecb_ldexpf(x,e) ldexpf ((x), (e)) + #define ecb_frexpf(x,e) frexpf ((x), (e)) + #else + #define ecb_ldexpf(x,e) (float) ldexp ((double) (x), (e)) + #define ecb_frexpf(x,e) (float) frexp ((double) (x), (e)) + #endif + + /* convert a float to ieee single/binary32 */ + ecb_function_ ecb_const uint32_t ecb_float_to_binary32 (float x); + ecb_function_ ecb_const uint32_t + ecb_float_to_binary32 (float x) + { + uint32_t r; + + #if ECB_STDFP + memcpy (&r, &x, 4); + #else + /* slow emulation, works for anything but -0 */ + uint32_t m; + int e; + + if (x == 0e0f ) return 0x00000000U; + if (x > +3.40282346638528860e+38f) return 0x7f800000U; + if (x < -3.40282346638528860e+38f) return 0xff800000U; + if (x != x ) return 0x7fbfffffU; + + m = ecb_frexpf (x, &e) * 0x1000000U; + + r = m & 0x80000000U; + + if (r) + m = -m; + + if (e <= -126) + { + m &= 0xffffffU; + m >>= (-125 - e); + e = -126; + } + + r |= (e + 126) << 23; + r |= m & 0x7fffffU; + #endif + + return r; + } + + /* converts an ieee single/binary32 to a float */ + ecb_function_ ecb_const float ecb_binary32_to_float (uint32_t x); + ecb_function_ ecb_const float + ecb_binary32_to_float (uint32_t x) + { + float r; + + #if ECB_STDFP + memcpy (&r, &x, 4); + #else + /* emulation, only works for normals and subnormals and +0 */ + int neg = x >> 31; + int e = (x >> 23) & 0xffU; + + x &= 0x7fffffU; + + if (e) + x |= 0x800000U; + else + e = 1; + + /* we distrust ldexpf a bit and do the 2**-24 scaling by an extra multiply */ + r = ecb_ldexpf (x * (0.5f / 0x800000U), e - 126); + + r = neg ? -r : r; + #endif + + return r; + } + + /* convert a double to ieee double/binary64 */ + ecb_function_ ecb_const uint64_t ecb_double_to_binary64 (double x); + ecb_function_ ecb_const uint64_t + ecb_double_to_binary64 (double x) + { + uint64_t r; + + #if ECB_STDFP + memcpy (&r, &x, 8); + #else + /* slow emulation, works for anything but -0 */ + uint64_t m; + int e; + + if (x == 0e0 ) return 0x0000000000000000U; + if (x > +1.79769313486231470e+308) return 0x7ff0000000000000U; + if (x < -1.79769313486231470e+308) return 0xfff0000000000000U; + if (x != x ) return 0X7ff7ffffffffffffU; + + m = frexp (x, &e) * 0x20000000000000U; + + r = m & 0x8000000000000000;; + + if (r) + m = -m; + + if (e <= -1022) + { + m &= 0x1fffffffffffffU; + m >>= (-1021 - e); + e = -1022; + } + + r |= ((uint64_t)(e + 1022)) << 52; + r |= m & 0xfffffffffffffU; + #endif + + return r; + } + + /* converts an ieee double/binary64 to a double */ + ecb_function_ ecb_const double ecb_binary64_to_double (uint64_t x); + ecb_function_ ecb_const double + ecb_binary64_to_double (uint64_t x) + { + double r; + + #if ECB_STDFP + memcpy (&r, &x, 8); + #else + /* emulation, only works for normals and subnormals and +0 */ + int neg = x >> 63; + int e = (x >> 52) & 0x7ffU; + + x &= 0xfffffffffffffU; + + if (e) + x |= 0x10000000000000U; + else + e = 1; + + /* we distrust ldexp a bit and do the 2**-53 scaling by an extra multiply */ + r = ldexp (x * (0.5 / 0x10000000000000U), e - 1022); + + r = neg ? -r : r; + #endif + + return r; + } + + /* convert a float to ieee half/binary16 */ + ecb_function_ ecb_const uint16_t ecb_float_to_binary16 (float x); + ecb_function_ ecb_const uint16_t + ecb_float_to_binary16 (float x) + { + return ecb_binary32_to_binary16 (ecb_float_to_binary32 (x)); + } + + /* convert an ieee half/binary16 to float */ + ecb_function_ ecb_const float ecb_binary16_to_float (uint16_t x); + ecb_function_ ecb_const float + ecb_binary16_to_float (uint16_t x) + { + return ecb_binary32_to_float (ecb_binary16_to_binary32 (x)); + } + +#endif + +#endif + +/* ECB.H END */ + +#if ECB_MEMORY_FENCE_NEEDS_PTHREADS +/* if your architecture doesn't need memory fences, e.g. because it is + * single-cpu/core, or if you use libev in a project that doesn't use libev + * from multiple threads, then you can define ECB_NO_THREADS when compiling + * libev, in which cases the memory fences become nops. + * alternatively, you can remove this #error and link against libpthread, + * which will then provide the memory fences. + */ +# error "memory fences not defined for your architecture, please report" +#endif + +#ifndef ECB_MEMORY_FENCE +# define ECB_MEMORY_FENCE do { } while (0) +# define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE +# define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE +#endif + +#define inline_size ecb_inline + +#if EV_FEATURE_CODE +# define inline_speed ecb_inline +#else +# define inline_speed ecb_noinline static +#endif + +/*****************************************************************************/ +/* raw syscall wrappers */ + +#if EV_NEED_SYSCALL + +#include + +/* + * define some syscall wrappers for common architectures + * this is mostly for nice looks during debugging, not performance. + * our syscalls return < 0, not == -1, on error. which is good + * enough for linux aio. + * TODO: arm is also common nowadays, maybe even mips and x86 + * TODO: after implementing this, it suddenly looks like overkill, but its hard to remove... + */ +#if __GNUC__ && __linux && ECB_AMD64 && !EV_FEATURE_CODE + /* the costly errno access probably kills this for size optimisation */ + + #define ev_syscall(nr,narg,arg1,arg2,arg3,arg4,arg5,arg6) \ + ({ \ + long res; \ + register unsigned long r6 __asm__ ("r9" ); \ + register unsigned long r5 __asm__ ("r8" ); \ + register unsigned long r4 __asm__ ("r10"); \ + register unsigned long r3 __asm__ ("rdx"); \ + register unsigned long r2 __asm__ ("rsi"); \ + register unsigned long r1 __asm__ ("rdi"); \ + if (narg >= 6) r6 = (unsigned long)(arg6); \ + if (narg >= 5) r5 = (unsigned long)(arg5); \ + if (narg >= 4) r4 = (unsigned long)(arg4); \ + if (narg >= 3) r3 = (unsigned long)(arg3); \ + if (narg >= 2) r2 = (unsigned long)(arg2); \ + if (narg >= 1) r1 = (unsigned long)(arg1); \ + __asm__ __volatile__ ( \ + "syscall\n\t" \ + : "=a" (res) \ + : "0" (nr), "r" (r1), "r" (r2), "r" (r3), "r" (r4), "r" (r5) \ + : "cc", "r11", "cx", "memory"); \ + errno = -res; \ + res; \ + }) + +#endif + +#ifdef ev_syscall + #define ev_syscall0(nr) ev_syscall (nr, 0, 0, 0, 0, 0, 0, 0) + #define ev_syscall1(nr,arg1) ev_syscall (nr, 1, arg1, 0, 0, 0, 0, 0) + #define ev_syscall2(nr,arg1,arg2) ev_syscall (nr, 2, arg1, arg2, 0, 0, 0, 0) + #define ev_syscall3(nr,arg1,arg2,arg3) ev_syscall (nr, 3, arg1, arg2, arg3, 0, 0, 0) + #define ev_syscall4(nr,arg1,arg2,arg3,arg4) ev_syscall (nr, 3, arg1, arg2, arg3, arg4, 0, 0) + #define ev_syscall5(nr,arg1,arg2,arg3,arg4,arg5) ev_syscall (nr, 5, arg1, arg2, arg3, arg4, arg5, 0) + #define ev_syscall6(nr,arg1,arg2,arg3,arg4,arg5,arg6) ev_syscall (nr, 6, arg1, arg2, arg3, arg4, arg5,arg6) +#else + #define ev_syscall0(nr) syscall (nr) + #define ev_syscall1(nr,arg1) syscall (nr, arg1) + #define ev_syscall2(nr,arg1,arg2) syscall (nr, arg1, arg2) + #define ev_syscall3(nr,arg1,arg2,arg3) syscall (nr, arg1, arg2, arg3) + #define ev_syscall4(nr,arg1,arg2,arg3,arg4) syscall (nr, arg1, arg2, arg3, arg4) + #define ev_syscall5(nr,arg1,arg2,arg3,arg4,arg5) syscall (nr, arg1, arg2, arg3, arg4, arg5) + #define ev_syscall6(nr,arg1,arg2,arg3,arg4,arg5,arg6) syscall (nr, arg1, arg2, arg3, arg4, arg5,arg6) +#endif + +#endif + +/*****************************************************************************/ + +#define NUMPRI (EV_MAXPRI - EV_MINPRI + 1) + +#if EV_MINPRI == EV_MAXPRI +# define ABSPRI(w) (((W)w), 0) +#else +# define ABSPRI(w) (((W)w)->priority - EV_MINPRI) +#endif + +#define EMPTY /* required for microsofts broken pseudo-c compiler */ + +typedef ev_watcher *W; +typedef ev_watcher_list *WL; +typedef ev_watcher_time *WT; + +#define ev_active(w) ((W)(w))->active +#define ev_at(w) ((WT)(w))->at + +#if EV_USE_REALTIME +/* sig_atomic_t is used to avoid per-thread variables or locking but still */ +/* giving it a reasonably high chance of working on typical architectures */ +static EV_ATOMIC_T have_realtime; /* did clock_gettime (CLOCK_REALTIME) work? */ +#endif + +#if EV_USE_MONOTONIC +static EV_ATOMIC_T have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */ +#endif + +#ifndef EV_FD_TO_WIN32_HANDLE +# define EV_FD_TO_WIN32_HANDLE(fd) _get_osfhandle (fd) +#endif +#ifndef EV_WIN32_HANDLE_TO_FD +# define EV_WIN32_HANDLE_TO_FD(handle) _open_osfhandle (handle, 0) +#endif +#ifndef EV_WIN32_CLOSE_FD +# define EV_WIN32_CLOSE_FD(fd) close (fd) +#endif + +#ifdef _WIN32 +# include "ev_win32.c" +#endif + +/*****************************************************************************/ + +#if EV_USE_LINUXAIO +# include /* probably only needed for aio_context_t */ +#endif + +/* define a suitable floor function (only used by periodics atm) */ + +#if EV_USE_FLOOR +# include +# define ev_floor(v) floor (v) +#else + +#include + +/* a floor() replacement function, should be independent of ev_tstamp type */ +ecb_noinline +static ev_tstamp +ev_floor (ev_tstamp v) +{ + /* the choice of shift factor is not terribly important */ +#if FLT_RADIX != 2 /* assume FLT_RADIX == 10 */ + const ev_tstamp shift = sizeof (unsigned long) >= 8 ? 10000000000000000000. : 1000000000.; +#else + const ev_tstamp shift = sizeof (unsigned long) >= 8 ? 18446744073709551616. : 4294967296.; +#endif + + /* special treatment for negative arguments */ + if (ecb_expect_false (v < 0.)) + { + ev_tstamp f = -ev_floor (-v); + + return f - (f == v ? 0 : 1); + } + + /* argument too large for an unsigned long? then reduce it */ + if (ecb_expect_false (v >= shift)) + { + ev_tstamp f; + + if (v == v - 1.) + return v; /* very large numbers are assumed to be integer */ + + f = shift * ev_floor (v * (1. / shift)); + return f + ev_floor (v - f); + } + + /* fits into an unsigned long */ + return (unsigned long)v; +} + +#endif + +/*****************************************************************************/ + +#ifdef __linux +# include +#endif + +ecb_noinline ecb_cold +static unsigned int +ev_linux_version (void) +{ +#ifdef __linux + unsigned int v = 0; + struct utsname buf; + int i; + char *p = buf.release; + + if (uname (&buf)) + return 0; + + for (i = 3+1; --i; ) + { + unsigned int c = 0; + + for (;;) + { + if (*p >= '0' && *p <= '9') + c = c * 10 + *p++ - '0'; + else + { + p += *p == '.'; + break; + } + } + + v = (v << 8) | c; + } + + return v; +#else + return 0; +#endif +} + +/*****************************************************************************/ + +#if EV_AVOID_STDIO +ecb_noinline ecb_cold +static void +ev_printerr (const char *msg) +{ + write (STDERR_FILENO, msg, strlen (msg)); +} +#endif + +static void (*syserr_cb)(const char *msg) EV_NOEXCEPT; + +ecb_cold +void +ev_set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT +{ + syserr_cb = cb; +} + +ecb_noinline ecb_cold +static void +ev_syserr (const char *msg) +{ + if (!msg) + msg = "(libev) system error"; + + if (syserr_cb) + syserr_cb (msg); + else + { +#if EV_AVOID_STDIO + ev_printerr (msg); + ev_printerr (": "); + ev_printerr (strerror (errno)); + ev_printerr ("\n"); +#else + perror (msg); +#endif + abort (); + } +} + +static void * +ev_realloc_emul (void *ptr, long size) EV_NOEXCEPT +{ + /* some systems, notably openbsd and darwin, fail to properly + * implement realloc (x, 0) (as required by both ansi c-89 and + * the single unix specification, so work around them here. + * recently, also (at least) fedora and debian started breaking it, + * despite documenting it otherwise. + */ + + if (size) + return realloc (ptr, size); + + free (ptr); + return 0; +} + +static void *(*alloc)(void *ptr, long size) EV_NOEXCEPT = ev_realloc_emul; + +ecb_cold +void +ev_set_allocator (void *(*cb)(void *ptr, long size) EV_NOEXCEPT) EV_NOEXCEPT +{ + alloc = cb; +} + +inline_speed void * +ev_realloc (void *ptr, long size) +{ + ptr = alloc (ptr, size); + + if (!ptr && size) + { +#if EV_AVOID_STDIO + ev_printerr ("(libev) memory allocation failed, aborting.\n"); +#else + fprintf (stderr, "(libev) cannot allocate %ld bytes, aborting.", size); +#endif + abort (); + } + + return ptr; +} + +#define ev_malloc(size) ev_realloc (0, (size)) +#define ev_free(ptr) ev_realloc ((ptr), 0) + +/*****************************************************************************/ + +/* set in reify when reification needed */ +#define EV_ANFD_REIFY 1 + +/* file descriptor info structure */ +typedef struct +{ + WL head; + unsigned char events; /* the events watched for */ + unsigned char reify; /* flag set when this ANFD needs reification (EV_ANFD_REIFY, EV__IOFDSET) */ + unsigned char emask; /* some backends store the actual kernel mask in here */ + unsigned char eflags; /* flags field for use by backends */ +#if EV_USE_EPOLL + unsigned int egen; /* generation counter to counter epoll bugs */ +#endif +#if EV_SELECT_IS_WINSOCKET || EV_USE_IOCP + SOCKET handle; +#endif +#if EV_USE_IOCP + OVERLAPPED or, ow; +#endif +} ANFD; + +/* stores the pending event set for a given watcher */ +typedef struct +{ + W w; + int events; /* the pending event set for the given watcher */ +} ANPENDING; + +#if EV_USE_INOTIFY +/* hash table entry per inotify-id */ +typedef struct +{ + WL head; +} ANFS; +#endif + +/* Heap Entry */ +#if EV_HEAP_CACHE_AT + /* a heap element */ + typedef struct { + ev_tstamp at; + WT w; + } ANHE; + + #define ANHE_w(he) (he).w /* access watcher, read-write */ + #define ANHE_at(he) (he).at /* access cached at, read-only */ + #define ANHE_at_cache(he) (he).at = (he).w->at /* update at from watcher */ +#else + /* a heap element */ + typedef WT ANHE; + + #define ANHE_w(he) (he) + #define ANHE_at(he) (he)->at + #define ANHE_at_cache(he) +#endif + +#if EV_MULTIPLICITY + + struct ev_loop + { + ev_tstamp ev_rt_now; + #define ev_rt_now ((loop)->ev_rt_now) + #define VAR(name,decl) decl; + #include "ev_vars.h" + #undef VAR + }; + #include "ev_wrap.h" + + static struct ev_loop default_loop_struct; + EV_API_DECL struct ev_loop *ev_default_loop_ptr = 0; /* needs to be initialised to make it a definition despite extern */ + +#else + + EV_API_DECL ev_tstamp ev_rt_now = EV_TS_CONST (0.); /* needs to be initialised to make it a definition despite extern */ + #define VAR(name,decl) static decl; + #include "ev_vars.h" + #undef VAR + + static int ev_default_loop_ptr; + +#endif + +#if EV_FEATURE_API +# define EV_RELEASE_CB if (ecb_expect_false (release_cb)) release_cb (EV_A) +# define EV_ACQUIRE_CB if (ecb_expect_false (acquire_cb)) acquire_cb (EV_A) +# define EV_INVOKE_PENDING invoke_cb (EV_A) +#else +# define EV_RELEASE_CB (void)0 +# define EV_ACQUIRE_CB (void)0 +# define EV_INVOKE_PENDING ev_invoke_pending (EV_A) +#endif + +#define EVBREAK_RECURSE 0x80 + +/*****************************************************************************/ + +#ifndef EV_HAVE_EV_TIME +ev_tstamp +ev_time (void) EV_NOEXCEPT +{ +#if EV_USE_REALTIME + if (ecb_expect_true (have_realtime)) + { + struct timespec ts; + clock_gettime (CLOCK_REALTIME, &ts); + return EV_TS_GET (ts); + } +#endif + + { + struct timeval tv; + gettimeofday (&tv, 0); + return EV_TV_GET (tv); + } +} +#endif + +inline_size ev_tstamp +get_clock (void) +{ +#if EV_USE_MONOTONIC + if (ecb_expect_true (have_monotonic)) + { + struct timespec ts; + clock_gettime (CLOCK_MONOTONIC, &ts); + return EV_TS_GET (ts); + } +#endif + + return ev_time (); +} + +#if EV_MULTIPLICITY +ev_tstamp +ev_now (EV_P) EV_NOEXCEPT +{ + return ev_rt_now; +} +#endif + +void +ev_sleep (ev_tstamp delay) EV_NOEXCEPT +{ + if (delay > EV_TS_CONST (0.)) + { +#if EV_USE_NANOSLEEP + struct timespec ts; + + EV_TS_SET (ts, delay); + nanosleep (&ts, 0); +#elif defined _WIN32 + /* maybe this should round up, as ms is very low resolution */ + /* compared to select (µs) or nanosleep (ns) */ + Sleep ((unsigned long)(EV_TS_TO_MSEC (delay))); +#else + struct timeval tv; + + /* here we rely on sys/time.h + sys/types.h + unistd.h providing select */ + /* something not guaranteed by newer posix versions, but guaranteed */ + /* by older ones */ + EV_TV_SET (tv, delay); + select (0, 0, 0, 0, &tv); +#endif + } +} + +/*****************************************************************************/ + +#define MALLOC_ROUND 4096 /* prefer to allocate in chunks of this size, must be 2**n and >> 4 longs */ + +/* find a suitable new size for the given array, */ +/* hopefully by rounding to a nice-to-malloc size */ +inline_size int +array_nextsize (int elem, int cur, int cnt) +{ + int ncur = cur + 1; + + do + ncur <<= 1; + while (cnt > ncur); + + /* if size is large, round to MALLOC_ROUND - 4 * longs to accommodate malloc overhead */ + if (elem * ncur > MALLOC_ROUND - sizeof (void *) * 4) + { + ncur *= elem; + ncur = (ncur + elem + (MALLOC_ROUND - 1) + sizeof (void *) * 4) & ~(MALLOC_ROUND - 1); + ncur = ncur - sizeof (void *) * 4; + ncur /= elem; + } + + return ncur; +} + +ecb_noinline ecb_cold +static void * +array_realloc (int elem, void *base, int *cur, int cnt) +{ + *cur = array_nextsize (elem, *cur, cnt); + return ev_realloc (base, elem * *cur); +} + +#define array_needsize_noinit(base,offset,count) + +#define array_needsize_zerofill(base,offset,count) \ + memset ((void *)(base + offset), 0, sizeof (*(base)) * (count)) + +#define array_needsize(type,base,cur,cnt,init) \ + if (ecb_expect_false ((cnt) > (cur))) \ + { \ + ecb_unused int ocur_ = (cur); \ + (base) = (type *)array_realloc \ + (sizeof (type), (base), &(cur), (cnt)); \ + init ((base), ocur_, ((cur) - ocur_)); \ + } + +#if 0 +#define array_slim(type,stem) \ + if (stem ## max < array_roundsize (stem ## cnt >> 2)) \ + { \ + stem ## max = array_roundsize (stem ## cnt >> 1); \ + base = (type *)ev_realloc (base, sizeof (type) * (stem ## max));\ + fprintf (stderr, "slimmed down " # stem " to %d\n", stem ## max);/*D*/\ + } +#endif + +#define array_free(stem, idx) \ + ev_free (stem ## s idx); stem ## cnt idx = stem ## max idx = 0; stem ## s idx = 0 + +/*****************************************************************************/ + +/* dummy callback for pending events */ +ecb_noinline +static void +pendingcb (EV_P_ ev_prepare *w, int revents) +{ +} + +ecb_noinline +void +ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT +{ + W w_ = (W)w; + int pri = ABSPRI (w_); + + if (ecb_expect_false (w_->pending)) + pendings [pri][w_->pending - 1].events |= revents; + else + { + w_->pending = ++pendingcnt [pri]; + array_needsize (ANPENDING, pendings [pri], pendingmax [pri], w_->pending, array_needsize_noinit); + pendings [pri][w_->pending - 1].w = w_; + pendings [pri][w_->pending - 1].events = revents; + } + + pendingpri = NUMPRI - 1; +} + +inline_speed void +feed_reverse (EV_P_ W w) +{ + array_needsize (W, rfeeds, rfeedmax, rfeedcnt + 1, array_needsize_noinit); + rfeeds [rfeedcnt++] = w; +} + +inline_size void +feed_reverse_done (EV_P_ int revents) +{ + do + ev_feed_event (EV_A_ rfeeds [--rfeedcnt], revents); + while (rfeedcnt); +} + +inline_speed void +queue_events (EV_P_ W *events, int eventcnt, int type) +{ + int i; + + for (i = 0; i < eventcnt; ++i) + ev_feed_event (EV_A_ events [i], type); +} + +/*****************************************************************************/ + +inline_speed void +fd_event_nocheck (EV_P_ int fd, int revents) +{ + ANFD *anfd = anfds + fd; + ev_io *w; + + for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next) + { + int ev = w->events & revents; + + if (ev) + ev_feed_event (EV_A_ (W)w, ev); + } +} + +/* do not submit kernel events for fds that have reify set */ +/* because that means they changed while we were polling for new events */ +inline_speed void +fd_event (EV_P_ int fd, int revents) +{ + ANFD *anfd = anfds + fd; + + if (ecb_expect_true (!anfd->reify)) + fd_event_nocheck (EV_A_ fd, revents); +} + +void +ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT +{ + if (fd >= 0 && fd < anfdmax) + fd_event_nocheck (EV_A_ fd, revents); +} + +/* make sure the external fd watch events are in-sync */ +/* with the kernel/libev internal state */ +inline_size void +fd_reify (EV_P) +{ + int i; + + /* most backends do not modify the fdchanges list in backend_modfiy. + * except io_uring, which has fixed-size buffers which might force us + * to handle events in backend_modify, causing fdchanges to be amended, + * which could result in an endless loop. + * to avoid this, we do not dynamically handle fds that were added + * during fd_reify. that means that for those backends, fdchangecnt + * might be non-zero during poll, which must cause them to not block. + * to not put too much of a burden on other backends, this detail + * needs to be handled in the backend. + */ + int changecnt = fdchangecnt; + +#if EV_SELECT_IS_WINSOCKET || EV_USE_IOCP + for (i = 0; i < changecnt; ++i) + { + int fd = fdchanges [i]; + ANFD *anfd = anfds + fd; + + if (anfd->reify & EV__IOFDSET && anfd->head) + { + SOCKET handle = EV_FD_TO_WIN32_HANDLE (fd); + + if (handle != anfd->handle) + { + unsigned long arg; + + assert (("libev: only socket fds supported in this configuration", ioctlsocket (handle, FIONREAD, &arg) == 0)); + + /* handle changed, but fd didn't - we need to do it in two steps */ + backend_modify (EV_A_ fd, anfd->events, 0); + anfd->events = 0; + anfd->handle = handle; + } + } + } +#endif + + for (i = 0; i < changecnt; ++i) + { + int fd = fdchanges [i]; + ANFD *anfd = anfds + fd; + ev_io *w; + + unsigned char o_events = anfd->events; + unsigned char o_reify = anfd->reify; + + anfd->reify = 0; + + /*if (ecb_expect_true (o_reify & EV_ANFD_REIFY)) probably a deoptimisation */ + { + anfd->events = 0; + + for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next) + anfd->events |= (unsigned char)w->events; + + if (o_events != anfd->events) + o_reify = EV__IOFDSET; /* actually |= */ + } + + if (o_reify & EV__IOFDSET) + backend_modify (EV_A_ fd, o_events, anfd->events); + } + + /* normally, fdchangecnt hasn't changed. if it has, then new fds have been added. + * this is a rare case (see beginning comment in this function), so we copy them to the + * front and hope the backend handles this case. + */ + if (ecb_expect_false (fdchangecnt != changecnt)) + memmove (fdchanges, fdchanges + changecnt, (fdchangecnt - changecnt) * sizeof (*fdchanges)); + + fdchangecnt -= changecnt; +} + +/* something about the given fd changed */ +inline_size +void +fd_change (EV_P_ int fd, int flags) +{ + unsigned char reify = anfds [fd].reify; + anfds [fd].reify = reify | flags; + + if (ecb_expect_true (!reify)) + { + ++fdchangecnt; + array_needsize (int, fdchanges, fdchangemax, fdchangecnt, array_needsize_noinit); + fdchanges [fdchangecnt - 1] = fd; + } +} + +/* the given fd is invalid/unusable, so make sure it doesn't hurt us anymore */ +inline_speed ecb_cold void +fd_kill (EV_P_ int fd) +{ + ev_io *w; + + while ((w = (ev_io *)anfds [fd].head)) + { + ev_io_stop (EV_A_ w); + ev_feed_event (EV_A_ (W)w, EV_ERROR | EV_READ | EV_WRITE); + } +} + +/* check whether the given fd is actually valid, for error recovery */ +inline_size ecb_cold int +fd_valid (int fd) +{ +#ifdef _WIN32 + return EV_FD_TO_WIN32_HANDLE (fd) != -1; +#else + return fcntl (fd, F_GETFD) != -1; +#endif +} + +/* called on EBADF to verify fds */ +ecb_noinline ecb_cold +static void +fd_ebadf (EV_P) +{ + int fd; + + for (fd = 0; fd < anfdmax; ++fd) + if (anfds [fd].events) + if (!fd_valid (fd) && errno == EBADF) + fd_kill (EV_A_ fd); +} + +/* called on ENOMEM in select/poll to kill some fds and retry */ +ecb_noinline ecb_cold +static void +fd_enomem (EV_P) +{ + int fd; + + for (fd = anfdmax; fd--; ) + if (anfds [fd].events) + { + fd_kill (EV_A_ fd); + break; + } +} + +/* usually called after fork if backend needs to re-arm all fds from scratch */ +ecb_noinline +static void +fd_rearm_all (EV_P) +{ + int fd; + + for (fd = 0; fd < anfdmax; ++fd) + if (anfds [fd].events) + { + anfds [fd].events = 0; + anfds [fd].emask = 0; + fd_change (EV_A_ fd, EV__IOFDSET | EV_ANFD_REIFY); + } +} + +/* used to prepare libev internal fd's */ +/* this is not fork-safe */ +inline_speed void +fd_intern (int fd) +{ +#ifdef _WIN32 + unsigned long arg = 1; + ioctlsocket (EV_FD_TO_WIN32_HANDLE (fd), FIONBIO, &arg); +#else + fcntl (fd, F_SETFD, FD_CLOEXEC); + fcntl (fd, F_SETFL, O_NONBLOCK); +#endif +} + +/*****************************************************************************/ + +/* + * the heap functions want a real array index. array index 0 is guaranteed to not + * be in-use at any time. the first heap entry is at array [HEAP0]. DHEAP gives + * the branching factor of the d-tree. + */ + +/* + * at the moment we allow libev the luxury of two heaps, + * a small-code-size 2-heap one and a ~1.5kb larger 4-heap + * which is more cache-efficient. + * the difference is about 5% with 50000+ watchers. + */ +#if EV_USE_4HEAP + +#define DHEAP 4 +#define HEAP0 (DHEAP - 1) /* index of first element in heap */ +#define HPARENT(k) ((((k) - HEAP0 - 1) / DHEAP) + HEAP0) +#define UPHEAP_DONE(p,k) ((p) == (k)) + +/* away from the root */ +inline_speed void +downheap (ANHE *heap, int N, int k) +{ + ANHE he = heap [k]; + ANHE *E = heap + N + HEAP0; + + for (;;) + { + ev_tstamp minat; + ANHE *minpos; + ANHE *pos = heap + DHEAP * (k - HEAP0) + HEAP0 + 1; + + /* find minimum child */ + if (ecb_expect_true (pos + DHEAP - 1 < E)) + { + /* fast path */ (minpos = pos + 0), (minat = ANHE_at (*minpos)); + if ( minat > ANHE_at (pos [1])) (minpos = pos + 1), (minat = ANHE_at (*minpos)); + if ( minat > ANHE_at (pos [2])) (minpos = pos + 2), (minat = ANHE_at (*minpos)); + if ( minat > ANHE_at (pos [3])) (minpos = pos + 3), (minat = ANHE_at (*minpos)); + } + else if (pos < E) + { + /* slow path */ (minpos = pos + 0), (minat = ANHE_at (*minpos)); + if (pos + 1 < E && minat > ANHE_at (pos [1])) (minpos = pos + 1), (minat = ANHE_at (*minpos)); + if (pos + 2 < E && minat > ANHE_at (pos [2])) (minpos = pos + 2), (minat = ANHE_at (*minpos)); + if (pos + 3 < E && minat > ANHE_at (pos [3])) (minpos = pos + 3), (minat = ANHE_at (*minpos)); + } + else + break; + + if (ANHE_at (he) <= minat) + break; + + heap [k] = *minpos; + ev_active (ANHE_w (*minpos)) = k; + + k = minpos - heap; + } + + heap [k] = he; + ev_active (ANHE_w (he)) = k; +} + +#else /* not 4HEAP */ + +#define HEAP0 1 +#define HPARENT(k) ((k) >> 1) +#define UPHEAP_DONE(p,k) (!(p)) + +/* away from the root */ +inline_speed void +downheap (ANHE *heap, int N, int k) +{ + ANHE he = heap [k]; + + for (;;) + { + int c = k << 1; + + if (c >= N + HEAP0) + break; + + c += c + 1 < N + HEAP0 && ANHE_at (heap [c]) > ANHE_at (heap [c + 1]) + ? 1 : 0; + + if (ANHE_at (he) <= ANHE_at (heap [c])) + break; + + heap [k] = heap [c]; + ev_active (ANHE_w (heap [k])) = k; + + k = c; + } + + heap [k] = he; + ev_active (ANHE_w (he)) = k; +} +#endif + +/* towards the root */ +inline_speed void +upheap (ANHE *heap, int k) +{ + ANHE he = heap [k]; + + for (;;) + { + int p = HPARENT (k); + + if (UPHEAP_DONE (p, k) || ANHE_at (heap [p]) <= ANHE_at (he)) + break; + + heap [k] = heap [p]; + ev_active (ANHE_w (heap [k])) = k; + k = p; + } + + heap [k] = he; + ev_active (ANHE_w (he)) = k; +} + +/* move an element suitably so it is in a correct place */ +inline_size void +adjustheap (ANHE *heap, int N, int k) +{ + if (k > HEAP0 && ANHE_at (heap [k]) <= ANHE_at (heap [HPARENT (k)])) + upheap (heap, k); + else + downheap (heap, N, k); +} + +/* rebuild the heap: this function is used only once and executed rarely */ +inline_size void +reheap (ANHE *heap, int N) +{ + int i; + + /* we don't use floyds algorithm, upheap is simpler and is more cache-efficient */ + /* also, this is easy to implement and correct for both 2-heaps and 4-heaps */ + for (i = 0; i < N; ++i) + upheap (heap, i + HEAP0); +} + +/*****************************************************************************/ + +/* associate signal watchers to a signal */ +typedef struct +{ + EV_ATOMIC_T pending; +#if EV_MULTIPLICITY + EV_P; +#endif + WL head; +} ANSIG; + +static ANSIG signals [EV_NSIG - 1]; + +/*****************************************************************************/ + +#if EV_SIGNAL_ENABLE || EV_ASYNC_ENABLE + +ecb_noinline ecb_cold +static void +evpipe_init (EV_P) +{ + if (!ev_is_active (&pipe_w)) + { + int fds [2]; + +# if EV_USE_EVENTFD + fds [0] = -1; + fds [1] = eventfd (0, EFD_NONBLOCK | EFD_CLOEXEC); + if (fds [1] < 0 && errno == EINVAL) + fds [1] = eventfd (0, 0); + + if (fds [1] < 0) +# endif + { + while (pipe (fds)) + ev_syserr ("(libev) error creating signal/async pipe"); + + fd_intern (fds [0]); + } + + evpipe [0] = fds [0]; + + if (evpipe [1] < 0) + evpipe [1] = fds [1]; /* first call, set write fd */ + else + { + /* on subsequent calls, do not change evpipe [1] */ + /* so that evpipe_write can always rely on its value. */ + /* this branch does not do anything sensible on windows, */ + /* so must not be executed on windows */ + + dup2 (fds [1], evpipe [1]); + close (fds [1]); + } + + fd_intern (evpipe [1]); + + ev_io_set (&pipe_w, evpipe [0] < 0 ? evpipe [1] : evpipe [0], EV_READ); + ev_io_start (EV_A_ &pipe_w); + ev_unref (EV_A); /* watcher should not keep loop alive */ + } +} + +inline_speed void +evpipe_write (EV_P_ EV_ATOMIC_T *flag) +{ + ECB_MEMORY_FENCE; /* push out the write before this function was called, acquire flag */ + + if (ecb_expect_true (*flag)) + return; + + *flag = 1; + ECB_MEMORY_FENCE_RELEASE; /* make sure flag is visible before the wakeup */ + + pipe_write_skipped = 1; + + ECB_MEMORY_FENCE; /* make sure pipe_write_skipped is visible before we check pipe_write_wanted */ + + if (pipe_write_wanted) + { + int old_errno; + + pipe_write_skipped = 0; + ECB_MEMORY_FENCE_RELEASE; + + old_errno = errno; /* save errno because write will clobber it */ + +#if EV_USE_EVENTFD + if (evpipe [0] < 0) + { + uint64_t counter = 1; + write (evpipe [1], &counter, sizeof (uint64_t)); + } + else +#endif + { +#ifdef _WIN32 + WSABUF buf; + DWORD sent; + buf.buf = (char *)&buf; + buf.len = 1; + WSASend (EV_FD_TO_WIN32_HANDLE (evpipe [1]), &buf, 1, &sent, 0, 0, 0); +#else + write (evpipe [1], &(evpipe [1]), 1); +#endif + } + + errno = old_errno; + } +} + +/* called whenever the libev signal pipe */ +/* got some events (signal, async) */ +static void +pipecb (EV_P_ ev_io *iow, int revents) +{ + int i; + + if (revents & EV_READ) + { +#if EV_USE_EVENTFD + if (evpipe [0] < 0) + { + uint64_t counter; + read (evpipe [1], &counter, sizeof (uint64_t)); + } + else +#endif + { + char dummy[4]; +#ifdef _WIN32 + WSABUF buf; + DWORD recvd; + DWORD flags = 0; + buf.buf = dummy; + buf.len = sizeof (dummy); + WSARecv (EV_FD_TO_WIN32_HANDLE (evpipe [0]), &buf, 1, &recvd, &flags, 0, 0); +#else + read (evpipe [0], &dummy, sizeof (dummy)); +#endif + } + } + + pipe_write_skipped = 0; + + ECB_MEMORY_FENCE; /* push out skipped, acquire flags */ + +#if EV_SIGNAL_ENABLE + if (sig_pending) + { + sig_pending = 0; + + ECB_MEMORY_FENCE; + + for (i = EV_NSIG - 1; i--; ) + if (ecb_expect_false (signals [i].pending)) + ev_feed_signal_event (EV_A_ i + 1); + } +#endif + +#if EV_ASYNC_ENABLE + if (async_pending) + { + async_pending = 0; + + ECB_MEMORY_FENCE; + + for (i = asynccnt; i--; ) + if (asyncs [i]->sent) + { + asyncs [i]->sent = 0; + ECB_MEMORY_FENCE_RELEASE; + ev_feed_event (EV_A_ asyncs [i], EV_ASYNC); + } + } +#endif +} + +/*****************************************************************************/ + +void +ev_feed_signal (int signum) EV_NOEXCEPT +{ +#if EV_MULTIPLICITY + EV_P; + ECB_MEMORY_FENCE_ACQUIRE; + EV_A = signals [signum - 1].loop; + + if (!EV_A) + return; +#endif + + signals [signum - 1].pending = 1; + evpipe_write (EV_A_ &sig_pending); +} + +static void +ev_sighandler (int signum) +{ +#ifdef _WIN32 + signal (signum, ev_sighandler); +#endif + + ev_feed_signal (signum); +} + +ecb_noinline +void +ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT +{ + WL w; + + if (ecb_expect_false (signum <= 0 || signum >= EV_NSIG)) + return; + + --signum; + +#if EV_MULTIPLICITY + /* it is permissible to try to feed a signal to the wrong loop */ + /* or, likely more useful, feeding a signal nobody is waiting for */ + + if (ecb_expect_false (signals [signum].loop != EV_A)) + return; +#endif + + signals [signum].pending = 0; + ECB_MEMORY_FENCE_RELEASE; + + for (w = signals [signum].head; w; w = w->next) + ev_feed_event (EV_A_ (W)w, EV_SIGNAL); +} + +#if EV_USE_SIGNALFD +static void +sigfdcb (EV_P_ ev_io *iow, int revents) +{ + struct signalfd_siginfo si[2], *sip; /* these structs are big */ + + for (;;) + { + ssize_t res = read (sigfd, si, sizeof (si)); + + /* not ISO-C, as res might be -1, but works with SuS */ + for (sip = si; (char *)sip < (char *)si + res; ++sip) + ev_feed_signal_event (EV_A_ sip->ssi_signo); + + if (res < (ssize_t)sizeof (si)) + break; + } +} +#endif + +#endif + +/*****************************************************************************/ + +#if EV_CHILD_ENABLE +static WL childs [EV_PID_HASHSIZE]; + +static ev_signal childev; + +#ifndef WIFCONTINUED +# define WIFCONTINUED(status) 0 +#endif + +/* handle a single child status event */ +inline_speed void +child_reap (EV_P_ int chain, int pid, int status) +{ + ev_child *w; + int traced = WIFSTOPPED (status) || WIFCONTINUED (status); + + for (w = (ev_child *)childs [chain & ((EV_PID_HASHSIZE) - 1)]; w; w = (ev_child *)((WL)w)->next) + { + if ((w->pid == pid || !w->pid) + && (!traced || (w->flags & 1))) + { + ev_set_priority (w, EV_MAXPRI); /* need to do it *now*, this *must* be the same prio as the signal watcher itself */ + w->rpid = pid; + w->rstatus = status; + ev_feed_event (EV_A_ (W)w, EV_CHILD); + } + } +} + +#ifndef WCONTINUED +# define WCONTINUED 0 +#endif + +/* called on sigchld etc., calls waitpid */ +static void +childcb (EV_P_ ev_signal *sw, int revents) +{ + int pid, status; + + /* some systems define WCONTINUED but then fail to support it (linux 2.4) */ + if (0 >= (pid = waitpid (-1, &status, WNOHANG | WUNTRACED | WCONTINUED))) + if (!WCONTINUED + || errno != EINVAL + || 0 >= (pid = waitpid (-1, &status, WNOHANG | WUNTRACED))) + return; + + /* make sure we are called again until all children have been reaped */ + /* we need to do it this way so that the callback gets called before we continue */ + ev_feed_event (EV_A_ (W)sw, EV_SIGNAL); + + child_reap (EV_A_ pid, pid, status); + if ((EV_PID_HASHSIZE) > 1) + child_reap (EV_A_ 0, pid, status); /* this might trigger a watcher twice, but feed_event catches that */ +} + +#endif + +/*****************************************************************************/ + +#if EV_USE_TIMERFD + +static void periodics_reschedule (EV_P); + +static void +timerfdcb (EV_P_ ev_io *iow, int revents) +{ + struct itimerspec its = { 0 }; + + its.it_value.tv_sec = ev_rt_now + (int)MAX_BLOCKTIME2; + timerfd_settime (timerfd, TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET, &its, 0); + + ev_rt_now = ev_time (); + /* periodics_reschedule only needs ev_rt_now */ + /* but maybe in the future we want the full treatment. */ + /* + now_floor = EV_TS_CONST (0.); + time_update (EV_A_ EV_TSTAMP_HUGE); + */ +#if EV_PERIODIC_ENABLE + periodics_reschedule (EV_A); +#endif +} + +ecb_noinline ecb_cold +static void +evtimerfd_init (EV_P) +{ + if (!ev_is_active (&timerfd_w)) + { + timerfd = timerfd_create (CLOCK_REALTIME, TFD_NONBLOCK | TFD_CLOEXEC); + + if (timerfd >= 0) + { + fd_intern (timerfd); /* just to be sure */ + + ev_io_init (&timerfd_w, timerfdcb, timerfd, EV_READ); + ev_set_priority (&timerfd_w, EV_MINPRI); + ev_io_start (EV_A_ &timerfd_w); + ev_unref (EV_A); /* watcher should not keep loop alive */ + + /* (re-) arm timer */ + timerfdcb (EV_A_ 0, 0); + } + } +} + +#endif + +/*****************************************************************************/ + +#if EV_USE_IOCP +# include "ev_iocp.c" +#endif +#if EV_USE_PORT +# include "ev_port.c" +#endif +#if EV_USE_KQUEUE +# include "ev_kqueue.c" +#endif +#if EV_USE_EPOLL +# include "ev_epoll.c" +#endif +#if EV_USE_LINUXAIO +# include "ev_linuxaio.c" +#endif +#if EV_USE_IOURING +# include "ev_iouring.c" +#endif +#if EV_USE_POLL +# include "ev_poll.c" +#endif +#if EV_USE_SELECT +# include "ev_select.c" +#endif + +ecb_cold int +ev_version_major (void) EV_NOEXCEPT +{ + return EV_VERSION_MAJOR; +} + +ecb_cold int +ev_version_minor (void) EV_NOEXCEPT +{ + return EV_VERSION_MINOR; +} + +/* return true if we are running with elevated privileges and should ignore env variables */ +inline_size ecb_cold int +enable_secure (void) +{ +#ifdef _WIN32 + return 0; +#else + return getuid () != geteuid () + || getgid () != getegid (); +#endif +} + +ecb_cold +unsigned int +ev_supported_backends (void) EV_NOEXCEPT +{ + unsigned int flags = 0; + + if (EV_USE_PORT ) flags |= EVBACKEND_PORT; + if (EV_USE_KQUEUE ) flags |= EVBACKEND_KQUEUE; + if (EV_USE_EPOLL ) flags |= EVBACKEND_EPOLL; + if (EV_USE_LINUXAIO ) flags |= EVBACKEND_LINUXAIO; + if (EV_USE_IOURING && ev_linux_version () >= 0x050601) flags |= EVBACKEND_IOURING; /* 5.6.1+ */ + if (EV_USE_POLL ) flags |= EVBACKEND_POLL; + if (EV_USE_SELECT ) flags |= EVBACKEND_SELECT; + + return flags; +} + +ecb_cold +unsigned int +ev_recommended_backends (void) EV_NOEXCEPT +{ + unsigned int flags = ev_supported_backends (); + +#ifndef __NetBSD__ + /* kqueue is borked on everything but netbsd apparently */ + /* it usually doesn't work correctly on anything but sockets and pipes */ + flags &= ~EVBACKEND_KQUEUE; +#endif +#ifdef __APPLE__ + /* only select works correctly on that "unix-certified" platform */ + flags &= ~EVBACKEND_KQUEUE; /* horribly broken, even for sockets */ + flags &= ~EVBACKEND_POLL; /* poll is based on kqueue from 10.5 onwards */ +#endif +#ifdef __FreeBSD__ + flags &= ~EVBACKEND_POLL; /* poll return value is unusable (http://forums.freebsd.org/archive/index.php/t-10270.html) */ +#endif + + /* TODO: linuxaio is very experimental */ +#if !EV_RECOMMEND_LINUXAIO + flags &= ~EVBACKEND_LINUXAIO; +#endif + /* TODO: linuxaio is super experimental */ +#if !EV_RECOMMEND_IOURING + flags &= ~EVBACKEND_IOURING; +#endif + + return flags; +} + +ecb_cold +unsigned int +ev_embeddable_backends (void) EV_NOEXCEPT +{ + int flags = EVBACKEND_EPOLL | EVBACKEND_KQUEUE | EVBACKEND_PORT | EVBACKEND_IOURING; + + /* epoll embeddability broken on all linux versions up to at least 2.6.23 */ + if (ev_linux_version () < 0x020620) /* disable it on linux < 2.6.32 */ + flags &= ~EVBACKEND_EPOLL; + + /* EVBACKEND_LINUXAIO is theoretically embeddable, but suffers from a performance overhead */ + + return flags; +} + +unsigned int +ev_backend (EV_P) EV_NOEXCEPT +{ + return backend; +} + +#if EV_FEATURE_API +unsigned int +ev_iteration (EV_P) EV_NOEXCEPT +{ + return loop_count; +} + +unsigned int +ev_depth (EV_P) EV_NOEXCEPT +{ + return loop_depth; +} + +void +ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT +{ + io_blocktime = interval; +} + +void +ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT +{ + timeout_blocktime = interval; +} + +void +ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT +{ + userdata = data; +} + +void * +ev_userdata (EV_P) EV_NOEXCEPT +{ + return userdata; +} + +void +ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT +{ + invoke_cb = invoke_pending_cb; +} + +void +ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_NOEXCEPT, void (*acquire)(EV_P) EV_NOEXCEPT) EV_NOEXCEPT +{ + release_cb = release; + acquire_cb = acquire; +} +#endif + +/* initialise a loop structure, must be zero-initialised */ +ecb_noinline ecb_cold +static void +loop_init (EV_P_ unsigned int flags) EV_NOEXCEPT +{ + if (!backend) + { + origflags = flags; + +#if EV_USE_REALTIME + if (!have_realtime) + { + struct timespec ts; + + if (!clock_gettime (CLOCK_REALTIME, &ts)) + have_realtime = 1; + } +#endif + +#if EV_USE_MONOTONIC + if (!have_monotonic) + { + struct timespec ts; + + if (!clock_gettime (CLOCK_MONOTONIC, &ts)) + have_monotonic = 1; + } +#endif + + /* pid check not overridable via env */ +#ifndef _WIN32 + if (flags & EVFLAG_FORKCHECK) + curpid = getpid (); +#endif + + if (!(flags & EVFLAG_NOENV) + && !enable_secure () + && getenv ("LIBEV_FLAGS")) + flags = atoi (getenv ("LIBEV_FLAGS")); + + ev_rt_now = ev_time (); + mn_now = get_clock (); + now_floor = mn_now; + rtmn_diff = ev_rt_now - mn_now; +#if EV_FEATURE_API + invoke_cb = ev_invoke_pending; +#endif + + io_blocktime = 0.; + timeout_blocktime = 0.; + backend = 0; + backend_fd = -1; + sig_pending = 0; +#if EV_ASYNC_ENABLE + async_pending = 0; +#endif + pipe_write_skipped = 0; + pipe_write_wanted = 0; + evpipe [0] = -1; + evpipe [1] = -1; +#if EV_USE_INOTIFY + fs_fd = flags & EVFLAG_NOINOTIFY ? -1 : -2; +#endif +#if EV_USE_SIGNALFD + sigfd = flags & EVFLAG_SIGNALFD ? -2 : -1; +#endif +#if EV_USE_TIMERFD + timerfd = flags & EVFLAG_NOTIMERFD ? -1 : -2; +#endif + + if (!(flags & EVBACKEND_MASK)) + flags |= ev_recommended_backends (); + +#if EV_USE_IOCP + if (!backend && (flags & EVBACKEND_IOCP )) backend = iocp_init (EV_A_ flags); +#endif +#if EV_USE_PORT + if (!backend && (flags & EVBACKEND_PORT )) backend = port_init (EV_A_ flags); +#endif +#if EV_USE_KQUEUE + if (!backend && (flags & EVBACKEND_KQUEUE )) backend = kqueue_init (EV_A_ flags); +#endif +#if EV_USE_IOURING + if (!backend && (flags & EVBACKEND_IOURING )) backend = iouring_init (EV_A_ flags); +#endif +#if EV_USE_LINUXAIO + if (!backend && (flags & EVBACKEND_LINUXAIO)) backend = linuxaio_init (EV_A_ flags); +#endif +#if EV_USE_EPOLL + if (!backend && (flags & EVBACKEND_EPOLL )) backend = epoll_init (EV_A_ flags); +#endif +#if EV_USE_POLL + if (!backend && (flags & EVBACKEND_POLL )) backend = poll_init (EV_A_ flags); +#endif +#if EV_USE_SELECT + if (!backend && (flags & EVBACKEND_SELECT )) backend = select_init (EV_A_ flags); +#endif + + ev_prepare_init (&pending_w, pendingcb); + +#if EV_SIGNAL_ENABLE || EV_ASYNC_ENABLE + ev_init (&pipe_w, pipecb); + ev_set_priority (&pipe_w, EV_MAXPRI); +#endif + } +} + +/* free up a loop structure */ +ecb_cold +void +ev_loop_destroy (EV_P) +{ + int i; + +#if EV_MULTIPLICITY + /* mimic free (0) */ + if (!EV_A) + return; +#endif + +#if EV_CLEANUP_ENABLE + /* queue cleanup watchers (and execute them) */ + if (ecb_expect_false (cleanupcnt)) + { + queue_events (EV_A_ (W *)cleanups, cleanupcnt, EV_CLEANUP); + EV_INVOKE_PENDING; + } +#endif + +#if EV_CHILD_ENABLE + if (ev_is_default_loop (EV_A) && ev_is_active (&childev)) + { + ev_ref (EV_A); /* child watcher */ + ev_signal_stop (EV_A_ &childev); + } +#endif + + if (ev_is_active (&pipe_w)) + { + /*ev_ref (EV_A);*/ + /*ev_io_stop (EV_A_ &pipe_w);*/ + + if (evpipe [0] >= 0) EV_WIN32_CLOSE_FD (evpipe [0]); + if (evpipe [1] >= 0) EV_WIN32_CLOSE_FD (evpipe [1]); + } + +#if EV_USE_SIGNALFD + if (ev_is_active (&sigfd_w)) + close (sigfd); +#endif + +#if EV_USE_TIMERFD + if (ev_is_active (&timerfd_w)) + close (timerfd); +#endif + +#if EV_USE_INOTIFY + if (fs_fd >= 0) + close (fs_fd); +#endif + + if (backend_fd >= 0) + close (backend_fd); + +#if EV_USE_IOCP + if (backend == EVBACKEND_IOCP ) iocp_destroy (EV_A); +#endif +#if EV_USE_PORT + if (backend == EVBACKEND_PORT ) port_destroy (EV_A); +#endif +#if EV_USE_KQUEUE + if (backend == EVBACKEND_KQUEUE ) kqueue_destroy (EV_A); +#endif +#if EV_USE_IOURING + if (backend == EVBACKEND_IOURING ) iouring_destroy (EV_A); +#endif +#if EV_USE_LINUXAIO + if (backend == EVBACKEND_LINUXAIO) linuxaio_destroy (EV_A); +#endif +#if EV_USE_EPOLL + if (backend == EVBACKEND_EPOLL ) epoll_destroy (EV_A); +#endif +#if EV_USE_POLL + if (backend == EVBACKEND_POLL ) poll_destroy (EV_A); +#endif +#if EV_USE_SELECT + if (backend == EVBACKEND_SELECT ) select_destroy (EV_A); +#endif + + for (i = NUMPRI; i--; ) + { + array_free (pending, [i]); +#if EV_IDLE_ENABLE + array_free (idle, [i]); +#endif + } + + ev_free (anfds); anfds = 0; anfdmax = 0; + + /* have to use the microsoft-never-gets-it-right macro */ + array_free (rfeed, EMPTY); + array_free (fdchange, EMPTY); + array_free (timer, EMPTY); +#if EV_PERIODIC_ENABLE + array_free (periodic, EMPTY); +#endif +#if EV_FORK_ENABLE + array_free (fork, EMPTY); +#endif +#if EV_CLEANUP_ENABLE + array_free (cleanup, EMPTY); +#endif + array_free (prepare, EMPTY); + array_free (check, EMPTY); +#if EV_ASYNC_ENABLE + array_free (async, EMPTY); +#endif + + backend = 0; + +#if EV_MULTIPLICITY + if (ev_is_default_loop (EV_A)) +#endif + ev_default_loop_ptr = 0; +#if EV_MULTIPLICITY + else + ev_free (EV_A); +#endif +} + +#if EV_USE_INOTIFY +inline_size void infy_fork (EV_P); +#endif + +inline_size void +loop_fork (EV_P) +{ +#if EV_USE_PORT + if (backend == EVBACKEND_PORT ) port_fork (EV_A); +#endif +#if EV_USE_KQUEUE + if (backend == EVBACKEND_KQUEUE ) kqueue_fork (EV_A); +#endif +#if EV_USE_IOURING + if (backend == EVBACKEND_IOURING ) iouring_fork (EV_A); +#endif +#if EV_USE_LINUXAIO + if (backend == EVBACKEND_LINUXAIO) linuxaio_fork (EV_A); +#endif +#if EV_USE_EPOLL + if (backend == EVBACKEND_EPOLL ) epoll_fork (EV_A); +#endif +#if EV_USE_INOTIFY + infy_fork (EV_A); +#endif + + if (postfork != 2) + { + #if EV_USE_SIGNALFD + /* surprisingly, nothing needs to be done for signalfd, accoridng to docs, it does the right thing on fork */ + #endif + + #if EV_USE_TIMERFD + if (ev_is_active (&timerfd_w)) + { + ev_ref (EV_A); + ev_io_stop (EV_A_ &timerfd_w); + + close (timerfd); + timerfd = -2; + + evtimerfd_init (EV_A); + /* reschedule periodics, in case we missed something */ + ev_feed_event (EV_A_ &timerfd_w, EV_CUSTOM); + } + #endif + + #if EV_SIGNAL_ENABLE || EV_ASYNC_ENABLE + if (ev_is_active (&pipe_w)) + { + /* pipe_write_wanted must be false now, so modifying fd vars should be safe */ + + ev_ref (EV_A); + ev_io_stop (EV_A_ &pipe_w); + + if (evpipe [0] >= 0) + EV_WIN32_CLOSE_FD (evpipe [0]); + + evpipe_init (EV_A); + /* iterate over everything, in case we missed something before */ + ev_feed_event (EV_A_ &pipe_w, EV_CUSTOM); + } + #endif + } + + postfork = 0; +} + +#if EV_MULTIPLICITY + +ecb_cold +struct ev_loop * +ev_loop_new (unsigned int flags) EV_NOEXCEPT +{ + EV_P = (struct ev_loop *)ev_malloc (sizeof (struct ev_loop)); + + memset (EV_A, 0, sizeof (struct ev_loop)); + loop_init (EV_A_ flags); + + if (ev_backend (EV_A)) + return EV_A; + + ev_free (EV_A); + return 0; +} + +#endif /* multiplicity */ + +#if EV_VERIFY +ecb_noinline ecb_cold +static void +verify_watcher (EV_P_ W w) +{ + assert (("libev: watcher has invalid priority", ABSPRI (w) >= 0 && ABSPRI (w) < NUMPRI)); + + if (w->pending) + assert (("libev: pending watcher not on pending queue", pendings [ABSPRI (w)][w->pending - 1].w == w)); +} + +ecb_noinline ecb_cold +static void +verify_heap (EV_P_ ANHE *heap, int N) +{ + int i; + + for (i = HEAP0; i < N + HEAP0; ++i) + { + assert (("libev: active index mismatch in heap", ev_active (ANHE_w (heap [i])) == i)); + assert (("libev: heap condition violated", i == HEAP0 || ANHE_at (heap [HPARENT (i)]) <= ANHE_at (heap [i]))); + assert (("libev: heap at cache mismatch", ANHE_at (heap [i]) == ev_at (ANHE_w (heap [i])))); + + verify_watcher (EV_A_ (W)ANHE_w (heap [i])); + } +} + +ecb_noinline ecb_cold +static void +array_verify (EV_P_ W *ws, int cnt) +{ + while (cnt--) + { + assert (("libev: active index mismatch", ev_active (ws [cnt]) == cnt + 1)); + verify_watcher (EV_A_ ws [cnt]); + } +} +#endif + +#if EV_FEATURE_API +void ecb_cold +ev_verify (EV_P) EV_NOEXCEPT +{ +#if EV_VERIFY + int i; + WL w, w2; + + assert (activecnt >= -1); + + assert (fdchangemax >= fdchangecnt); + for (i = 0; i < fdchangecnt; ++i) + assert (("libev: negative fd in fdchanges", fdchanges [i] >= 0)); + + assert (anfdmax >= 0); + for (i = 0; i < anfdmax; ++i) + { + int j = 0; + + for (w = w2 = anfds [i].head; w; w = w->next) + { + verify_watcher (EV_A_ (W)w); + + if (j++ & 1) + { + assert (("libev: io watcher list contains a loop", w != w2)); + w2 = w2->next; + } + + assert (("libev: inactive fd watcher on anfd list", ev_active (w) == 1)); + assert (("libev: fd mismatch between watcher and anfd", ((ev_io *)w)->fd == i)); + } + } + + assert (timermax >= timercnt); + verify_heap (EV_A_ timers, timercnt); + +#if EV_PERIODIC_ENABLE + assert (periodicmax >= periodiccnt); + verify_heap (EV_A_ periodics, periodiccnt); +#endif + + for (i = NUMPRI; i--; ) + { + assert (pendingmax [i] >= pendingcnt [i]); +#if EV_IDLE_ENABLE + assert (idleall >= 0); + assert (idlemax [i] >= idlecnt [i]); + array_verify (EV_A_ (W *)idles [i], idlecnt [i]); +#endif + } + +#if EV_FORK_ENABLE + assert (forkmax >= forkcnt); + array_verify (EV_A_ (W *)forks, forkcnt); +#endif + +#if EV_CLEANUP_ENABLE + assert (cleanupmax >= cleanupcnt); + array_verify (EV_A_ (W *)cleanups, cleanupcnt); +#endif + +#if EV_ASYNC_ENABLE + assert (asyncmax >= asynccnt); + array_verify (EV_A_ (W *)asyncs, asynccnt); +#endif + +#if EV_PREPARE_ENABLE + assert (preparemax >= preparecnt); + array_verify (EV_A_ (W *)prepares, preparecnt); +#endif + +#if EV_CHECK_ENABLE + assert (checkmax >= checkcnt); + array_verify (EV_A_ (W *)checks, checkcnt); +#endif + +# if 0 +#if EV_CHILD_ENABLE + for (w = (ev_child *)childs [chain & ((EV_PID_HASHSIZE) - 1)]; w; w = (ev_child *)((WL)w)->next) + for (signum = EV_NSIG; signum--; ) if (signals [signum].pending) +#endif +# endif +#endif +} +#endif + +#if EV_MULTIPLICITY +ecb_cold +struct ev_loop * +#else +int +#endif +ev_default_loop (unsigned int flags) EV_NOEXCEPT +{ + if (!ev_default_loop_ptr) + { +#if EV_MULTIPLICITY + EV_P = ev_default_loop_ptr = &default_loop_struct; +#else + ev_default_loop_ptr = 1; +#endif + + loop_init (EV_A_ flags); + + if (ev_backend (EV_A)) + { +#if EV_CHILD_ENABLE + ev_signal_init (&childev, childcb, SIGCHLD); + ev_set_priority (&childev, EV_MAXPRI); + ev_signal_start (EV_A_ &childev); + ev_unref (EV_A); /* child watcher should not keep loop alive */ +#endif + } + else + ev_default_loop_ptr = 0; + } + + return ev_default_loop_ptr; +} + +void +ev_loop_fork (EV_P) EV_NOEXCEPT +{ + postfork = 1; +} + +/*****************************************************************************/ + +void +ev_invoke (EV_P_ void *w, int revents) +{ + EV_CB_INVOKE ((W)w, revents); +} + +unsigned int +ev_pending_count (EV_P) EV_NOEXCEPT +{ + int pri; + unsigned int count = 0; + + for (pri = NUMPRI; pri--; ) + count += pendingcnt [pri]; + + return count; +} + +ecb_noinline +void +ev_invoke_pending (EV_P) +{ + pendingpri = NUMPRI; + + do + { + --pendingpri; + + /* pendingpri possibly gets modified in the inner loop */ + while (pendingcnt [pendingpri]) + { + ANPENDING *p = pendings [pendingpri] + --pendingcnt [pendingpri]; + + p->w->pending = 0; + EV_CB_INVOKE (p->w, p->events); + EV_FREQUENT_CHECK; + } + } + while (pendingpri); +} + +#if EV_IDLE_ENABLE +/* make idle watchers pending. this handles the "call-idle */ +/* only when higher priorities are idle" logic */ +inline_size void +idle_reify (EV_P) +{ + if (ecb_expect_false (idleall)) + { + int pri; + + for (pri = NUMPRI; pri--; ) + { + if (pendingcnt [pri]) + break; + + if (idlecnt [pri]) + { + queue_events (EV_A_ (W *)idles [pri], idlecnt [pri], EV_IDLE); + break; + } + } + } +} +#endif + +/* make timers pending */ +inline_size void +timers_reify (EV_P) +{ + EV_FREQUENT_CHECK; + + if (timercnt && ANHE_at (timers [HEAP0]) < mn_now) + { + do + { + ev_timer *w = (ev_timer *)ANHE_w (timers [HEAP0]); + + /*assert (("libev: inactive timer on timer heap detected", ev_is_active (w)));*/ + + /* first reschedule or stop timer */ + if (w->repeat) + { + ev_at (w) += w->repeat; + if (ev_at (w) < mn_now) + ev_at (w) = mn_now; + + assert (("libev: negative ev_timer repeat value found while processing timers", w->repeat > EV_TS_CONST (0.))); + + ANHE_at_cache (timers [HEAP0]); + downheap (timers, timercnt, HEAP0); + } + else + ev_timer_stop (EV_A_ w); /* nonrepeating: stop timer */ + + EV_FREQUENT_CHECK; + feed_reverse (EV_A_ (W)w); + } + while (timercnt && ANHE_at (timers [HEAP0]) < mn_now); + + feed_reverse_done (EV_A_ EV_TIMER); + } +} + +#if EV_PERIODIC_ENABLE + +ecb_noinline +static void +periodic_recalc (EV_P_ ev_periodic *w) +{ + ev_tstamp interval = w->interval > MIN_INTERVAL ? w->interval : MIN_INTERVAL; + ev_tstamp at = w->offset + interval * ev_floor ((ev_rt_now - w->offset) / interval); + + /* the above almost always errs on the low side */ + while (at <= ev_rt_now) + { + ev_tstamp nat = at + w->interval; + + /* when resolution fails us, we use ev_rt_now */ + if (ecb_expect_false (nat == at)) + { + at = ev_rt_now; + break; + } + + at = nat; + } + + ev_at (w) = at; +} + +/* make periodics pending */ +inline_size void +periodics_reify (EV_P) +{ + EV_FREQUENT_CHECK; + + while (periodiccnt && ANHE_at (periodics [HEAP0]) < ev_rt_now) + { + do + { + ev_periodic *w = (ev_periodic *)ANHE_w (periodics [HEAP0]); + + /*assert (("libev: inactive timer on periodic heap detected", ev_is_active (w)));*/ + + /* first reschedule or stop timer */ + if (w->reschedule_cb) + { + ev_at (w) = w->reschedule_cb (w, ev_rt_now); + + assert (("libev: ev_periodic reschedule callback returned time in the past", ev_at (w) >= ev_rt_now)); + + ANHE_at_cache (periodics [HEAP0]); + downheap (periodics, periodiccnt, HEAP0); + } + else if (w->interval) + { + periodic_recalc (EV_A_ w); + ANHE_at_cache (periodics [HEAP0]); + downheap (periodics, periodiccnt, HEAP0); + } + else + ev_periodic_stop (EV_A_ w); /* nonrepeating: stop timer */ + + EV_FREQUENT_CHECK; + feed_reverse (EV_A_ (W)w); + } + while (periodiccnt && ANHE_at (periodics [HEAP0]) < ev_rt_now); + + feed_reverse_done (EV_A_ EV_PERIODIC); + } +} + +/* simply recalculate all periodics */ +/* TODO: maybe ensure that at least one event happens when jumping forward? */ +ecb_noinline ecb_cold +static void +periodics_reschedule (EV_P) +{ + int i; + + /* adjust periodics after time jump */ + for (i = HEAP0; i < periodiccnt + HEAP0; ++i) + { + ev_periodic *w = (ev_periodic *)ANHE_w (periodics [i]); + + if (w->reschedule_cb) + ev_at (w) = w->reschedule_cb (w, ev_rt_now); + else if (w->interval) + periodic_recalc (EV_A_ w); + + ANHE_at_cache (periodics [i]); + } + + reheap (periodics, periodiccnt); +} +#endif + +/* adjust all timers by a given offset */ +ecb_noinline ecb_cold +static void +timers_reschedule (EV_P_ ev_tstamp adjust) +{ + int i; + + for (i = 0; i < timercnt; ++i) + { + ANHE *he = timers + i + HEAP0; + ANHE_w (*he)->at += adjust; + ANHE_at_cache (*he); + } +} + +/* fetch new monotonic and realtime times from the kernel */ +/* also detect if there was a timejump, and act accordingly */ +inline_speed void +time_update (EV_P_ ev_tstamp max_block) +{ +#if EV_USE_MONOTONIC + if (ecb_expect_true (have_monotonic)) + { + int i; + ev_tstamp odiff = rtmn_diff; + + mn_now = get_clock (); + + /* only fetch the realtime clock every 0.5*MIN_TIMEJUMP seconds */ + /* interpolate in the meantime */ + if (ecb_expect_true (mn_now - now_floor < EV_TS_CONST (MIN_TIMEJUMP * .5))) + { + ev_rt_now = rtmn_diff + mn_now; + return; + } + + now_floor = mn_now; + ev_rt_now = ev_time (); + + /* loop a few times, before making important decisions. + * on the choice of "4": one iteration isn't enough, + * in case we get preempted during the calls to + * ev_time and get_clock. a second call is almost guaranteed + * to succeed in that case, though. and looping a few more times + * doesn't hurt either as we only do this on time-jumps or + * in the unlikely event of having been preempted here. + */ + for (i = 4; --i; ) + { + ev_tstamp diff; + rtmn_diff = ev_rt_now - mn_now; + + diff = odiff - rtmn_diff; + + if (ecb_expect_true ((diff < EV_TS_CONST (0.) ? -diff : diff) < EV_TS_CONST (MIN_TIMEJUMP))) + return; /* all is well */ + + ev_rt_now = ev_time (); + mn_now = get_clock (); + now_floor = mn_now; + } + + /* no timer adjustment, as the monotonic clock doesn't jump */ + /* timers_reschedule (EV_A_ rtmn_diff - odiff) */ +# if EV_PERIODIC_ENABLE + periodics_reschedule (EV_A); +# endif + } + else +#endif + { + ev_rt_now = ev_time (); + + if (ecb_expect_false (mn_now > ev_rt_now || ev_rt_now > mn_now + max_block + EV_TS_CONST (MIN_TIMEJUMP))) + { + /* adjust timers. this is easy, as the offset is the same for all of them */ + timers_reschedule (EV_A_ ev_rt_now - mn_now); +#if EV_PERIODIC_ENABLE + periodics_reschedule (EV_A); +#endif + } + + mn_now = ev_rt_now; + } +} + +int +ev_run (EV_P_ int flags) +{ +#if EV_FEATURE_API + ++loop_depth; +#endif + + assert (("libev: ev_loop recursion during release detected", loop_done != EVBREAK_RECURSE)); + + loop_done = EVBREAK_CANCEL; + + EV_INVOKE_PENDING; /* in case we recurse, ensure ordering stays nice and clean */ + + do + { +#if EV_VERIFY >= 2 + ev_verify (EV_A); +#endif + +#ifndef _WIN32 + if (ecb_expect_false (curpid)) /* penalise the forking check even more */ + if (ecb_expect_false (getpid () != curpid)) + { + curpid = getpid (); + postfork = 1; + } +#endif + +#if EV_FORK_ENABLE + /* we might have forked, so queue fork handlers */ + if (ecb_expect_false (postfork)) + if (forkcnt) + { + queue_events (EV_A_ (W *)forks, forkcnt, EV_FORK); + EV_INVOKE_PENDING; + } +#endif + +#if EV_PREPARE_ENABLE + /* queue prepare watchers (and execute them) */ + if (ecb_expect_false (preparecnt)) + { + queue_events (EV_A_ (W *)prepares, preparecnt, EV_PREPARE); + EV_INVOKE_PENDING; + } +#endif + + if (ecb_expect_false (loop_done)) + break; + + /* we might have forked, so reify kernel state if necessary */ + if (ecb_expect_false (postfork)) + loop_fork (EV_A); + + /* update fd-related kernel structures */ + fd_reify (EV_A); + + /* calculate blocking time */ + { + ev_tstamp waittime = 0.; + ev_tstamp sleeptime = 0.; + + /* remember old timestamp for io_blocktime calculation */ + ev_tstamp prev_mn_now = mn_now; + + /* update time to cancel out callback processing overhead */ + time_update (EV_A_ EV_TS_CONST (EV_TSTAMP_HUGE)); + + /* from now on, we want a pipe-wake-up */ + pipe_write_wanted = 1; + + ECB_MEMORY_FENCE; /* make sure pipe_write_wanted is visible before we check for potential skips */ + + if (ecb_expect_true (!(flags & EVRUN_NOWAIT || idleall || !activecnt || pipe_write_skipped))) + { + waittime = EV_TS_CONST (MAX_BLOCKTIME); + +#if EV_USE_TIMERFD + /* sleep a lot longer when we can reliably detect timejumps */ + if (ecb_expect_true (timerfd >= 0)) + waittime = EV_TS_CONST (MAX_BLOCKTIME2); +#endif +#if !EV_PERIODIC_ENABLE + /* without periodics but with monotonic clock there is no need */ + /* for any time jump detection, so sleep longer */ + if (ecb_expect_true (have_monotonic)) + waittime = EV_TS_CONST (MAX_BLOCKTIME2); +#endif + + if (timercnt) + { + ev_tstamp to = ANHE_at (timers [HEAP0]) - mn_now; + if (waittime > to) waittime = to; + } + +#if EV_PERIODIC_ENABLE + if (periodiccnt) + { + ev_tstamp to = ANHE_at (periodics [HEAP0]) - ev_rt_now; + if (waittime > to) waittime = to; + } +#endif + + /* don't let timeouts decrease the waittime below timeout_blocktime */ + if (ecb_expect_false (waittime < timeout_blocktime)) + waittime = timeout_blocktime; + + /* now there are two more special cases left, either we have + * already-expired timers, so we should not sleep, or we have timers + * that expire very soon, in which case we need to wait for a minimum + * amount of time for some event loop backends. + */ + if (ecb_expect_false (waittime < backend_mintime)) + waittime = waittime <= EV_TS_CONST (0.) + ? EV_TS_CONST (0.) + : backend_mintime; + + /* extra check because io_blocktime is commonly 0 */ + if (ecb_expect_false (io_blocktime)) + { + sleeptime = io_blocktime - (mn_now - prev_mn_now); + + if (sleeptime > waittime - backend_mintime) + sleeptime = waittime - backend_mintime; + + if (ecb_expect_true (sleeptime > EV_TS_CONST (0.))) + { + ev_sleep (sleeptime); + waittime -= sleeptime; + } + } + } + +#if EV_FEATURE_API + ++loop_count; +#endif + assert ((loop_done = EVBREAK_RECURSE, 1)); /* assert for side effect */ + backend_poll (EV_A_ waittime); + assert ((loop_done = EVBREAK_CANCEL, 1)); /* assert for side effect */ + + pipe_write_wanted = 0; /* just an optimisation, no fence needed */ + + ECB_MEMORY_FENCE_ACQUIRE; + if (pipe_write_skipped) + { + assert (("libev: pipe_w not active, but pipe not written", ev_is_active (&pipe_w))); + ev_feed_event (EV_A_ &pipe_w, EV_CUSTOM); + } + + /* update ev_rt_now, do magic */ + time_update (EV_A_ waittime + sleeptime); + } + + /* queue pending timers and reschedule them */ + timers_reify (EV_A); /* relative timers called last */ +#if EV_PERIODIC_ENABLE + periodics_reify (EV_A); /* absolute timers called first */ +#endif + +#if EV_IDLE_ENABLE + /* queue idle watchers unless other events are pending */ + idle_reify (EV_A); +#endif + +#if EV_CHECK_ENABLE + /* queue check watchers, to be executed first */ + if (ecb_expect_false (checkcnt)) + queue_events (EV_A_ (W *)checks, checkcnt, EV_CHECK); +#endif + + EV_INVOKE_PENDING; + } + while (ecb_expect_true ( + activecnt + && !loop_done + && !(flags & (EVRUN_ONCE | EVRUN_NOWAIT)) + )); + + if (loop_done == EVBREAK_ONE) + loop_done = EVBREAK_CANCEL; + +#if EV_FEATURE_API + --loop_depth; +#endif + + return activecnt; +} + +void +ev_break (EV_P_ int how) EV_NOEXCEPT +{ + loop_done = how; +} + +void +ev_ref (EV_P) EV_NOEXCEPT +{ + ++activecnt; +} + +void +ev_unref (EV_P) EV_NOEXCEPT +{ + --activecnt; +} + +void +ev_now_update (EV_P) EV_NOEXCEPT +{ + time_update (EV_A_ EV_TSTAMP_HUGE); +} + +void +ev_suspend (EV_P) EV_NOEXCEPT +{ + ev_now_update (EV_A); +} + +void +ev_resume (EV_P) EV_NOEXCEPT +{ + ev_tstamp mn_prev = mn_now; + + ev_now_update (EV_A); + timers_reschedule (EV_A_ mn_now - mn_prev); +#if EV_PERIODIC_ENABLE + /* TODO: really do this? */ + periodics_reschedule (EV_A); +#endif +} + +/*****************************************************************************/ +/* singly-linked list management, used when the expected list length is short */ + +inline_size void +wlist_add (WL *head, WL elem) +{ + elem->next = *head; + *head = elem; +} + +inline_size void +wlist_del (WL *head, WL elem) +{ + while (*head) + { + if (ecb_expect_true (*head == elem)) + { + *head = elem->next; + break; + } + + head = &(*head)->next; + } +} + +/* internal, faster, version of ev_clear_pending */ +inline_speed void +clear_pending (EV_P_ W w) +{ + if (w->pending) + { + pendings [ABSPRI (w)][w->pending - 1].w = (W)&pending_w; + w->pending = 0; + } +} + +int +ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT +{ + W w_ = (W)w; + int pending = w_->pending; + + if (ecb_expect_true (pending)) + { + ANPENDING *p = pendings [ABSPRI (w_)] + pending - 1; + p->w = (W)&pending_w; + w_->pending = 0; + return p->events; + } + else + return 0; +} + +inline_size void +pri_adjust (EV_P_ W w) +{ + int pri = ev_priority (w); + pri = pri < EV_MINPRI ? EV_MINPRI : pri; + pri = pri > EV_MAXPRI ? EV_MAXPRI : pri; + ev_set_priority (w, pri); +} + +inline_speed void +ev_start (EV_P_ W w, int active) +{ + pri_adjust (EV_A_ w); + w->active = active; + ev_ref (EV_A); +} + +inline_size void +ev_stop (EV_P_ W w) +{ + ev_unref (EV_A); + w->active = 0; +} + +/*****************************************************************************/ + +ecb_noinline +void +ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT +{ + int fd = w->fd; + + if (ecb_expect_false (ev_is_active (w))) + return; + + assert (("libev: ev_io_start called with negative fd", fd >= 0)); + assert (("libev: ev_io_start called with illegal event mask", !(w->events & ~(EV__IOFDSET | EV_READ | EV_WRITE)))); + +#if EV_VERIFY >= 2 + assert (("libev: ev_io_start called on watcher with invalid fd", fd_valid (fd))); +#endif + EV_FREQUENT_CHECK; + + ev_start (EV_A_ (W)w, 1); + array_needsize (ANFD, anfds, anfdmax, fd + 1, array_needsize_zerofill); + wlist_add (&anfds[fd].head, (WL)w); + + /* common bug, apparently */ + assert (("libev: ev_io_start called with corrupted watcher", ((WL)w)->next != (WL)w)); + + fd_change (EV_A_ fd, w->events & EV__IOFDSET | EV_ANFD_REIFY); + w->events &= ~EV__IOFDSET; + + EV_FREQUENT_CHECK; +} + +ecb_noinline +void +ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + assert (("libev: ev_io_stop called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax)); + +#if EV_VERIFY >= 2 + assert (("libev: ev_io_stop called on watcher with invalid fd", fd_valid (w->fd))); +#endif + EV_FREQUENT_CHECK; + + wlist_del (&anfds[w->fd].head, (WL)w); + ev_stop (EV_A_ (W)w); + + fd_change (EV_A_ w->fd, EV_ANFD_REIFY); + + EV_FREQUENT_CHECK; +} + +ecb_noinline +void +ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + ev_at (w) += mn_now; + + assert (("libev: ev_timer_start called with negative timer repeat value", w->repeat >= 0.)); + + EV_FREQUENT_CHECK; + + ++timercnt; + ev_start (EV_A_ (W)w, timercnt + HEAP0 - 1); + array_needsize (ANHE, timers, timermax, ev_active (w) + 1, array_needsize_noinit); + ANHE_w (timers [ev_active (w)]) = (WT)w; + ANHE_at_cache (timers [ev_active (w)]); + upheap (timers, ev_active (w)); + + EV_FREQUENT_CHECK; + + /*assert (("libev: internal timer heap corruption", timers [ev_active (w)] == (WT)w));*/ +} + +ecb_noinline +void +ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + { + int active = ev_active (w); + + assert (("libev: internal timer heap corruption", ANHE_w (timers [active]) == (WT)w)); + + --timercnt; + + if (ecb_expect_true (active < timercnt + HEAP0)) + { + timers [active] = timers [timercnt + HEAP0]; + adjustheap (timers, timercnt, active); + } + } + + ev_at (w) -= mn_now; + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} + +ecb_noinline +void +ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT +{ + EV_FREQUENT_CHECK; + + clear_pending (EV_A_ (W)w); + + if (ev_is_active (w)) + { + if (w->repeat) + { + ev_at (w) = mn_now + w->repeat; + ANHE_at_cache (timers [ev_active (w)]); + adjustheap (timers, timercnt, ev_active (w)); + } + else + ev_timer_stop (EV_A_ w); + } + else if (w->repeat) + { + ev_at (w) = w->repeat; + ev_timer_start (EV_A_ w); + } + + EV_FREQUENT_CHECK; +} + +ev_tstamp +ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT +{ + return ev_at (w) - (ev_is_active (w) ? mn_now : EV_TS_CONST (0.)); +} + +#if EV_PERIODIC_ENABLE +ecb_noinline +void +ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + +#if EV_USE_TIMERFD + if (timerfd == -2) + evtimerfd_init (EV_A); +#endif + + if (w->reschedule_cb) + ev_at (w) = w->reschedule_cb (w, ev_rt_now); + else if (w->interval) + { + assert (("libev: ev_periodic_start called with negative interval value", w->interval >= 0.)); + periodic_recalc (EV_A_ w); + } + else + ev_at (w) = w->offset; + + EV_FREQUENT_CHECK; + + ++periodiccnt; + ev_start (EV_A_ (W)w, periodiccnt + HEAP0 - 1); + array_needsize (ANHE, periodics, periodicmax, ev_active (w) + 1, array_needsize_noinit); + ANHE_w (periodics [ev_active (w)]) = (WT)w; + ANHE_at_cache (periodics [ev_active (w)]); + upheap (periodics, ev_active (w)); + + EV_FREQUENT_CHECK; + + /*assert (("libev: internal periodic heap corruption", ANHE_w (periodics [ev_active (w)]) == (WT)w));*/ +} + +ecb_noinline +void +ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + { + int active = ev_active (w); + + assert (("libev: internal periodic heap corruption", ANHE_w (periodics [active]) == (WT)w)); + + --periodiccnt; + + if (ecb_expect_true (active < periodiccnt + HEAP0)) + { + periodics [active] = periodics [periodiccnt + HEAP0]; + adjustheap (periodics, periodiccnt, active); + } + } + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} + +ecb_noinline +void +ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT +{ + /* TODO: use adjustheap and recalculation */ + ev_periodic_stop (EV_A_ w); + ev_periodic_start (EV_A_ w); +} +#endif + +#ifndef SA_RESTART +# define SA_RESTART 0 +#endif + +#if EV_SIGNAL_ENABLE + +ecb_noinline +void +ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + assert (("libev: ev_signal_start called with illegal signal number", w->signum > 0 && w->signum < EV_NSIG)); + +#if EV_MULTIPLICITY + assert (("libev: a signal must not be attached to two different loops", + !signals [w->signum - 1].loop || signals [w->signum - 1].loop == loop)); + + signals [w->signum - 1].loop = EV_A; + ECB_MEMORY_FENCE_RELEASE; +#endif + + EV_FREQUENT_CHECK; + +#if EV_USE_SIGNALFD + if (sigfd == -2) + { + sigfd = signalfd (-1, &sigfd_set, SFD_NONBLOCK | SFD_CLOEXEC); + if (sigfd < 0 && errno == EINVAL) + sigfd = signalfd (-1, &sigfd_set, 0); /* retry without flags */ + + if (sigfd >= 0) + { + fd_intern (sigfd); /* doing it twice will not hurt */ + + sigemptyset (&sigfd_set); + + ev_io_init (&sigfd_w, sigfdcb, sigfd, EV_READ); + ev_set_priority (&sigfd_w, EV_MAXPRI); + ev_io_start (EV_A_ &sigfd_w); + ev_unref (EV_A); /* signalfd watcher should not keep loop alive */ + } + } + + if (sigfd >= 0) + { + /* TODO: check .head */ + sigaddset (&sigfd_set, w->signum); + sigprocmask (SIG_BLOCK, &sigfd_set, 0); + + signalfd (sigfd, &sigfd_set, 0); + } +#endif + + ev_start (EV_A_ (W)w, 1); + wlist_add (&signals [w->signum - 1].head, (WL)w); + + if (!((WL)w)->next) +# if EV_USE_SIGNALFD + if (sigfd < 0) /*TODO*/ +# endif + { +# ifdef _WIN32 + evpipe_init (EV_A); + + signal (w->signum, ev_sighandler); +# else + struct sigaction sa; + + evpipe_init (EV_A); + + sa.sa_handler = ev_sighandler; + sigfillset (&sa.sa_mask); + sa.sa_flags = SA_RESTART; /* if restarting works we save one iteration */ + sigaction (w->signum, &sa, 0); + + if (origflags & EVFLAG_NOSIGMASK) + { + sigemptyset (&sa.sa_mask); + sigaddset (&sa.sa_mask, w->signum); + sigprocmask (SIG_UNBLOCK, &sa.sa_mask, 0); + } +#endif + } + + EV_FREQUENT_CHECK; +} + +ecb_noinline +void +ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + wlist_del (&signals [w->signum - 1].head, (WL)w); + ev_stop (EV_A_ (W)w); + + if (!signals [w->signum - 1].head) + { +#if EV_MULTIPLICITY + signals [w->signum - 1].loop = 0; /* unattach from signal */ +#endif +#if EV_USE_SIGNALFD + if (sigfd >= 0) + { + sigset_t ss; + + sigemptyset (&ss); + sigaddset (&ss, w->signum); + sigdelset (&sigfd_set, w->signum); + + signalfd (sigfd, &sigfd_set, 0); + sigprocmask (SIG_UNBLOCK, &ss, 0); + } + else +#endif + signal (w->signum, SIG_DFL); + } + + EV_FREQUENT_CHECK; +} + +#endif + +#if EV_CHILD_ENABLE + +void +ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT +{ +#if EV_MULTIPLICITY + assert (("libev: child watchers are only supported in the default loop", loop == ev_default_loop_ptr)); +#endif + if (ecb_expect_false (ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + ev_start (EV_A_ (W)w, 1); + wlist_add (&childs [w->pid & ((EV_PID_HASHSIZE) - 1)], (WL)w); + + EV_FREQUENT_CHECK; +} + +void +ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + wlist_del (&childs [w->pid & ((EV_PID_HASHSIZE) - 1)], (WL)w); + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} + +#endif + +#if EV_STAT_ENABLE + +# ifdef _WIN32 +# undef lstat +# define lstat(a,b) _stati64 (a,b) +# endif + +#define DEF_STAT_INTERVAL 5.0074891 +#define NFS_STAT_INTERVAL 30.1074891 /* for filesystems potentially failing inotify */ +#define MIN_STAT_INTERVAL 0.1074891 + +ecb_noinline static void stat_timer_cb (EV_P_ ev_timer *w_, int revents); + +#if EV_USE_INOTIFY + +/* the * 2 is to allow for alignment padding, which for some reason is >> 8 */ +# define EV_INOTIFY_BUFSIZE (sizeof (struct inotify_event) * 2 + NAME_MAX) + +ecb_noinline +static void +infy_add (EV_P_ ev_stat *w) +{ + w->wd = inotify_add_watch (fs_fd, w->path, + IN_ATTRIB | IN_DELETE_SELF | IN_MOVE_SELF | IN_MODIFY + | IN_CREATE | IN_DELETE | IN_MOVED_FROM | IN_MOVED_TO + | IN_DONT_FOLLOW | IN_MASK_ADD); + + if (w->wd >= 0) + { + struct statfs sfs; + + /* now local changes will be tracked by inotify, but remote changes won't */ + /* unless the filesystem is known to be local, we therefore still poll */ + /* also do poll on <2.6.25, but with normal frequency */ + + if (!fs_2625) + w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL; + else if (!statfs (w->path, &sfs) + && (sfs.f_type == 0x1373 /* devfs */ + || sfs.f_type == 0x4006 /* fat */ + || sfs.f_type == 0x4d44 /* msdos */ + || sfs.f_type == 0xEF53 /* ext2/3 */ + || sfs.f_type == 0x72b6 /* jffs2 */ + || sfs.f_type == 0x858458f6 /* ramfs */ + || sfs.f_type == 0x5346544e /* ntfs */ + || sfs.f_type == 0x3153464a /* jfs */ + || sfs.f_type == 0x9123683e /* btrfs */ + || sfs.f_type == 0x52654973 /* reiser3 */ + || sfs.f_type == 0x01021994 /* tmpfs */ + || sfs.f_type == 0x58465342 /* xfs */)) + w->timer.repeat = 0.; /* filesystem is local, kernel new enough */ + else + w->timer.repeat = w->interval ? w->interval : NFS_STAT_INTERVAL; /* remote, use reduced frequency */ + } + else + { + /* can't use inotify, continue to stat */ + w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL; + + /* if path is not there, monitor some parent directory for speedup hints */ + /* note that exceeding the hardcoded path limit is not a correctness issue, */ + /* but an efficiency issue only */ + if ((errno == ENOENT || errno == EACCES) && strlen (w->path) < 4096) + { + char path [4096]; + strcpy (path, w->path); + + do + { + int mask = IN_MASK_ADD | IN_DELETE_SELF | IN_MOVE_SELF + | (errno == EACCES ? IN_ATTRIB : IN_CREATE | IN_MOVED_TO); + + char *pend = strrchr (path, '/'); + + if (!pend || pend == path) + break; + + *pend = 0; + w->wd = inotify_add_watch (fs_fd, path, mask); + } + while (w->wd < 0 && (errno == ENOENT || errno == EACCES)); + } + } + + if (w->wd >= 0) + wlist_add (&fs_hash [w->wd & ((EV_INOTIFY_HASHSIZE) - 1)].head, (WL)w); + + /* now re-arm timer, if required */ + if (ev_is_active (&w->timer)) ev_ref (EV_A); + ev_timer_again (EV_A_ &w->timer); + if (ev_is_active (&w->timer)) ev_unref (EV_A); +} + +ecb_noinline +static void +infy_del (EV_P_ ev_stat *w) +{ + int slot; + int wd = w->wd; + + if (wd < 0) + return; + + w->wd = -2; + slot = wd & ((EV_INOTIFY_HASHSIZE) - 1); + wlist_del (&fs_hash [slot].head, (WL)w); + + /* remove this watcher, if others are watching it, they will rearm */ + inotify_rm_watch (fs_fd, wd); +} + +ecb_noinline +static void +infy_wd (EV_P_ int slot, int wd, struct inotify_event *ev) +{ + if (slot < 0) + /* overflow, need to check for all hash slots */ + for (slot = 0; slot < (EV_INOTIFY_HASHSIZE); ++slot) + infy_wd (EV_A_ slot, wd, ev); + else + { + WL w_; + + for (w_ = fs_hash [slot & ((EV_INOTIFY_HASHSIZE) - 1)].head; w_; ) + { + ev_stat *w = (ev_stat *)w_; + w_ = w_->next; /* lets us remove this watcher and all before it */ + + if (w->wd == wd || wd == -1) + { + if (ev->mask & (IN_IGNORED | IN_UNMOUNT | IN_DELETE_SELF)) + { + wlist_del (&fs_hash [slot & ((EV_INOTIFY_HASHSIZE) - 1)].head, (WL)w); + w->wd = -1; + infy_add (EV_A_ w); /* re-add, no matter what */ + } + + stat_timer_cb (EV_A_ &w->timer, 0); + } + } + } +} + +static void +infy_cb (EV_P_ ev_io *w, int revents) +{ + char buf [EV_INOTIFY_BUFSIZE]; + int ofs; + int len = read (fs_fd, buf, sizeof (buf)); + + for (ofs = 0; ofs < len; ) + { + struct inotify_event *ev = (struct inotify_event *)(buf + ofs); + infy_wd (EV_A_ ev->wd, ev->wd, ev); + ofs += sizeof (struct inotify_event) + ev->len; + } +} + +inline_size ecb_cold +void +ev_check_2625 (EV_P) +{ + /* kernels < 2.6.25 are borked + * http://www.ussg.indiana.edu/hypermail/linux/kernel/0711.3/1208.html + */ + if (ev_linux_version () < 0x020619) + return; + + fs_2625 = 1; +} + +inline_size int +infy_newfd (void) +{ +#if defined IN_CLOEXEC && defined IN_NONBLOCK + int fd = inotify_init1 (IN_CLOEXEC | IN_NONBLOCK); + if (fd >= 0) + return fd; +#endif + return inotify_init (); +} + +inline_size void +infy_init (EV_P) +{ + if (fs_fd != -2) + return; + + fs_fd = -1; + + ev_check_2625 (EV_A); + + fs_fd = infy_newfd (); + + if (fs_fd >= 0) + { + fd_intern (fs_fd); + ev_io_init (&fs_w, infy_cb, fs_fd, EV_READ); + ev_set_priority (&fs_w, EV_MAXPRI); + ev_io_start (EV_A_ &fs_w); + ev_unref (EV_A); + } +} + +inline_size void +infy_fork (EV_P) +{ + int slot; + + if (fs_fd < 0) + return; + + ev_ref (EV_A); + ev_io_stop (EV_A_ &fs_w); + close (fs_fd); + fs_fd = infy_newfd (); + + if (fs_fd >= 0) + { + fd_intern (fs_fd); + ev_io_set (&fs_w, fs_fd, EV_READ); + ev_io_start (EV_A_ &fs_w); + ev_unref (EV_A); + } + + for (slot = 0; slot < (EV_INOTIFY_HASHSIZE); ++slot) + { + WL w_ = fs_hash [slot].head; + fs_hash [slot].head = 0; + + while (w_) + { + ev_stat *w = (ev_stat *)w_; + w_ = w_->next; /* lets us add this watcher */ + + w->wd = -1; + + if (fs_fd >= 0) + infy_add (EV_A_ w); /* re-add, no matter what */ + else + { + w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL; + if (ev_is_active (&w->timer)) ev_ref (EV_A); + ev_timer_again (EV_A_ &w->timer); + if (ev_is_active (&w->timer)) ev_unref (EV_A); + } + } + } +} + +#endif + +#ifdef _WIN32 +# define EV_LSTAT(p,b) _stati64 (p, b) +#else +# define EV_LSTAT(p,b) lstat (p, b) +#endif + +void +ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT +{ + if (lstat (w->path, &w->attr) < 0) + w->attr.st_nlink = 0; + else if (!w->attr.st_nlink) + w->attr.st_nlink = 1; +} + +ecb_noinline +static void +stat_timer_cb (EV_P_ ev_timer *w_, int revents) +{ + ev_stat *w = (ev_stat *)(((char *)w_) - offsetof (ev_stat, timer)); + + ev_statdata prev = w->attr; + ev_stat_stat (EV_A_ w); + + /* memcmp doesn't work on netbsd, they.... do stuff to their struct stat */ + if ( + prev.st_dev != w->attr.st_dev + || prev.st_ino != w->attr.st_ino + || prev.st_mode != w->attr.st_mode + || prev.st_nlink != w->attr.st_nlink + || prev.st_uid != w->attr.st_uid + || prev.st_gid != w->attr.st_gid + || prev.st_rdev != w->attr.st_rdev + || prev.st_size != w->attr.st_size + || prev.st_atime != w->attr.st_atime + || prev.st_mtime != w->attr.st_mtime + || prev.st_ctime != w->attr.st_ctime + ) { + /* we only update w->prev on actual differences */ + /* in case we test more often than invoke the callback, */ + /* to ensure that prev is always different to attr */ + w->prev = prev; + + #if EV_USE_INOTIFY + if (fs_fd >= 0) + { + infy_del (EV_A_ w); + infy_add (EV_A_ w); + ev_stat_stat (EV_A_ w); /* avoid race... */ + } + #endif + + ev_feed_event (EV_A_ w, EV_STAT); + } +} + +void +ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + ev_stat_stat (EV_A_ w); + + if (w->interval < MIN_STAT_INTERVAL && w->interval) + w->interval = MIN_STAT_INTERVAL; + + ev_timer_init (&w->timer, stat_timer_cb, 0., w->interval ? w->interval : DEF_STAT_INTERVAL); + ev_set_priority (&w->timer, ev_priority (w)); + +#if EV_USE_INOTIFY + infy_init (EV_A); + + if (fs_fd >= 0) + infy_add (EV_A_ w); + else +#endif + { + ev_timer_again (EV_A_ &w->timer); + ev_unref (EV_A); + } + + ev_start (EV_A_ (W)w, 1); + + EV_FREQUENT_CHECK; +} + +void +ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + +#if EV_USE_INOTIFY + infy_del (EV_A_ w); +#endif + + if (ev_is_active (&w->timer)) + { + ev_ref (EV_A); + ev_timer_stop (EV_A_ &w->timer); + } + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} +#endif + +#if EV_IDLE_ENABLE +void +ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + pri_adjust (EV_A_ (W)w); + + EV_FREQUENT_CHECK; + + { + int active = ++idlecnt [ABSPRI (w)]; + + ++idleall; + ev_start (EV_A_ (W)w, active); + + array_needsize (ev_idle *, idles [ABSPRI (w)], idlemax [ABSPRI (w)], active, array_needsize_noinit); + idles [ABSPRI (w)][active - 1] = w; + } + + EV_FREQUENT_CHECK; +} + +void +ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + { + int active = ev_active (w); + + idles [ABSPRI (w)][active - 1] = idles [ABSPRI (w)][--idlecnt [ABSPRI (w)]]; + ev_active (idles [ABSPRI (w)][active - 1]) = active; + + ev_stop (EV_A_ (W)w); + --idleall; + } + + EV_FREQUENT_CHECK; +} +#endif + +#if EV_PREPARE_ENABLE +void +ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + ev_start (EV_A_ (W)w, ++preparecnt); + array_needsize (ev_prepare *, prepares, preparemax, preparecnt, array_needsize_noinit); + prepares [preparecnt - 1] = w; + + EV_FREQUENT_CHECK; +} + +void +ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + { + int active = ev_active (w); + + prepares [active - 1] = prepares [--preparecnt]; + ev_active (prepares [active - 1]) = active; + } + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} +#endif + +#if EV_CHECK_ENABLE +void +ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + ev_start (EV_A_ (W)w, ++checkcnt); + array_needsize (ev_check *, checks, checkmax, checkcnt, array_needsize_noinit); + checks [checkcnt - 1] = w; + + EV_FREQUENT_CHECK; +} + +void +ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + { + int active = ev_active (w); + + checks [active - 1] = checks [--checkcnt]; + ev_active (checks [active - 1]) = active; + } + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} +#endif + +#if EV_EMBED_ENABLE +ecb_noinline +void +ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT +{ + ev_run (w->other, EVRUN_NOWAIT); +} + +static void +embed_io_cb (EV_P_ ev_io *io, int revents) +{ + ev_embed *w = (ev_embed *)(((char *)io) - offsetof (ev_embed, io)); + + if (ev_cb (w)) + ev_feed_event (EV_A_ (W)w, EV_EMBED); + else + ev_run (w->other, EVRUN_NOWAIT); +} + +static void +embed_prepare_cb (EV_P_ ev_prepare *prepare, int revents) +{ + ev_embed *w = (ev_embed *)(((char *)prepare) - offsetof (ev_embed, prepare)); + + { + EV_P = w->other; + + while (fdchangecnt) + { + fd_reify (EV_A); + ev_run (EV_A_ EVRUN_NOWAIT); + } + } +} + +#if EV_FORK_ENABLE +static void +embed_fork_cb (EV_P_ ev_fork *fork_w, int revents) +{ + ev_embed *w = (ev_embed *)(((char *)fork_w) - offsetof (ev_embed, fork)); + + ev_embed_stop (EV_A_ w); + + { + EV_P = w->other; + + ev_loop_fork (EV_A); + ev_run (EV_A_ EVRUN_NOWAIT); + } + + ev_embed_start (EV_A_ w); +} +#endif + +#if 0 +static void +embed_idle_cb (EV_P_ ev_idle *idle, int revents) +{ + ev_idle_stop (EV_A_ idle); +} +#endif + +void +ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + { + EV_P = w->other; + assert (("libev: loop to be embedded is not embeddable", backend & ev_embeddable_backends ())); + ev_io_init (&w->io, embed_io_cb, backend_fd, EV_READ); + } + + EV_FREQUENT_CHECK; + + ev_set_priority (&w->io, ev_priority (w)); + ev_io_start (EV_A_ &w->io); + + ev_prepare_init (&w->prepare, embed_prepare_cb); + ev_set_priority (&w->prepare, EV_MINPRI); + ev_prepare_start (EV_A_ &w->prepare); + +#if EV_FORK_ENABLE + ev_fork_init (&w->fork, embed_fork_cb); + ev_fork_start (EV_A_ &w->fork); +#endif + + /*ev_idle_init (&w->idle, e,bed_idle_cb);*/ + + ev_start (EV_A_ (W)w, 1); + + EV_FREQUENT_CHECK; +} + +void +ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + ev_io_stop (EV_A_ &w->io); + ev_prepare_stop (EV_A_ &w->prepare); +#if EV_FORK_ENABLE + ev_fork_stop (EV_A_ &w->fork); +#endif + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} +#endif + +#if EV_FORK_ENABLE +void +ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + ev_start (EV_A_ (W)w, ++forkcnt); + array_needsize (ev_fork *, forks, forkmax, forkcnt, array_needsize_noinit); + forks [forkcnt - 1] = w; + + EV_FREQUENT_CHECK; +} + +void +ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + { + int active = ev_active (w); + + forks [active - 1] = forks [--forkcnt]; + ev_active (forks [active - 1]) = active; + } + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} +#endif + +#if EV_CLEANUP_ENABLE +void +ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + ev_start (EV_A_ (W)w, ++cleanupcnt); + array_needsize (ev_cleanup *, cleanups, cleanupmax, cleanupcnt, array_needsize_noinit); + cleanups [cleanupcnt - 1] = w; + + /* cleanup watchers should never keep a refcount on the loop */ + ev_unref (EV_A); + EV_FREQUENT_CHECK; +} + +void +ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + ev_ref (EV_A); + + { + int active = ev_active (w); + + cleanups [active - 1] = cleanups [--cleanupcnt]; + ev_active (cleanups [active - 1]) = active; + } + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} +#endif + +#if EV_ASYNC_ENABLE +void +ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT +{ + if (ecb_expect_false (ev_is_active (w))) + return; + + w->sent = 0; + + evpipe_init (EV_A); + + EV_FREQUENT_CHECK; + + ev_start (EV_A_ (W)w, ++asynccnt); + array_needsize (ev_async *, asyncs, asyncmax, asynccnt, array_needsize_noinit); + asyncs [asynccnt - 1] = w; + + EV_FREQUENT_CHECK; +} + +void +ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT +{ + clear_pending (EV_A_ (W)w); + if (ecb_expect_false (!ev_is_active (w))) + return; + + EV_FREQUENT_CHECK; + + { + int active = ev_active (w); + + asyncs [active - 1] = asyncs [--asynccnt]; + ev_active (asyncs [active - 1]) = active; + } + + ev_stop (EV_A_ (W)w); + + EV_FREQUENT_CHECK; +} + +void +ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT +{ + w->sent = 1; + evpipe_write (EV_A_ &async_pending); +} +#endif + +/*****************************************************************************/ + +struct ev_once +{ + ev_io io; + ev_timer to; + void (*cb)(int revents, void *arg); + void *arg; +}; + +static void +once_cb (EV_P_ struct ev_once *once, int revents) +{ + void (*cb)(int revents, void *arg) = once->cb; + void *arg = once->arg; + + ev_io_stop (EV_A_ &once->io); + ev_timer_stop (EV_A_ &once->to); + ev_free (once); + + cb (revents, arg); +} + +static void +once_cb_io (EV_P_ ev_io *w, int revents) +{ + struct ev_once *once = (struct ev_once *)(((char *)w) - offsetof (struct ev_once, io)); + + once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->to)); +} + +static void +once_cb_to (EV_P_ ev_timer *w, int revents) +{ + struct ev_once *once = (struct ev_once *)(((char *)w) - offsetof (struct ev_once, to)); + + once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->io)); +} + +void +ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_NOEXCEPT +{ + struct ev_once *once = (struct ev_once *)ev_malloc (sizeof (struct ev_once)); + + once->cb = cb; + once->arg = arg; + + ev_init (&once->io, once_cb_io); + if (fd >= 0) + { + ev_io_set (&once->io, fd, events); + ev_io_start (EV_A_ &once->io); + } + + ev_init (&once->to, once_cb_to); + if (timeout >= 0.) + { + ev_timer_set (&once->to, timeout, 0.); + ev_timer_start (EV_A_ &once->to); + } +} + +/*****************************************************************************/ + +#if EV_WALK_ENABLE +ecb_cold +void +ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT +{ + int i, j; + ev_watcher_list *wl, *wn; + + if (types & (EV_IO | EV_EMBED)) + for (i = 0; i < anfdmax; ++i) + for (wl = anfds [i].head; wl; ) + { + wn = wl->next; + +#if EV_EMBED_ENABLE + if (ev_cb ((ev_io *)wl) == embed_io_cb) + { + if (types & EV_EMBED) + cb (EV_A_ EV_EMBED, ((char *)wl) - offsetof (struct ev_embed, io)); + } + else +#endif +#if EV_USE_INOTIFY + if (ev_cb ((ev_io *)wl) == infy_cb) + ; + else +#endif + if ((ev_io *)wl != &pipe_w) + if (types & EV_IO) + cb (EV_A_ EV_IO, wl); + + wl = wn; + } + + if (types & (EV_TIMER | EV_STAT)) + for (i = timercnt + HEAP0; i-- > HEAP0; ) +#if EV_STAT_ENABLE + /*TODO: timer is not always active*/ + if (ev_cb ((ev_timer *)ANHE_w (timers [i])) == stat_timer_cb) + { + if (types & EV_STAT) + cb (EV_A_ EV_STAT, ((char *)ANHE_w (timers [i])) - offsetof (struct ev_stat, timer)); + } + else +#endif + if (types & EV_TIMER) + cb (EV_A_ EV_TIMER, ANHE_w (timers [i])); + +#if EV_PERIODIC_ENABLE + if (types & EV_PERIODIC) + for (i = periodiccnt + HEAP0; i-- > HEAP0; ) + cb (EV_A_ EV_PERIODIC, ANHE_w (periodics [i])); +#endif + +#if EV_IDLE_ENABLE + if (types & EV_IDLE) + for (j = NUMPRI; j--; ) + for (i = idlecnt [j]; i--; ) + cb (EV_A_ EV_IDLE, idles [j][i]); +#endif + +#if EV_FORK_ENABLE + if (types & EV_FORK) + for (i = forkcnt; i--; ) + if (ev_cb (forks [i]) != embed_fork_cb) + cb (EV_A_ EV_FORK, forks [i]); +#endif + +#if EV_ASYNC_ENABLE + if (types & EV_ASYNC) + for (i = asynccnt; i--; ) + cb (EV_A_ EV_ASYNC, asyncs [i]); +#endif + +#if EV_PREPARE_ENABLE + if (types & EV_PREPARE) + for (i = preparecnt; i--; ) +# if EV_EMBED_ENABLE + if (ev_cb (prepares [i]) != embed_prepare_cb) +# endif + cb (EV_A_ EV_PREPARE, prepares [i]); +#endif + +#if EV_CHECK_ENABLE + if (types & EV_CHECK) + for (i = checkcnt; i--; ) + cb (EV_A_ EV_CHECK, checks [i]); +#endif + +#if EV_SIGNAL_ENABLE + if (types & EV_SIGNAL) + for (i = 0; i < EV_NSIG - 1; ++i) + for (wl = signals [i].head; wl; ) + { + wn = wl->next; + cb (EV_A_ EV_SIGNAL, wl); + wl = wn; + } +#endif + +#if EV_CHILD_ENABLE + if (types & EV_CHILD) + for (i = (EV_PID_HASHSIZE); i--; ) + for (wl = childs [i]; wl; ) + { + wn = wl->next; + cb (EV_A_ EV_CHILD, wl); + wl = wn; + } +#endif +/* EV_STAT 0x00001000 /* stat data changed */ +/* EV_EMBED 0x00010000 /* embedded event loop needs sweep */ +} +#endif + +#if EV_MULTIPLICITY + #include "ev_wrap.h" +#endif + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev.h b/deps/ngtcp2/ngtcp2/third-party/libev/ev.h new file mode 100644 index 000000000000..4669c39b6145 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev.h @@ -0,0 +1,860 @@ +/* + * libev native API header + * + * Copyright (c) 2007-2020 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#ifndef EV_H_ +#define EV_H_ + +#ifdef __cplusplus +# define EV_CPP(x) x +# if __cplusplus >= 201103L +# define EV_NOEXCEPT noexcept +# else +# define EV_NOEXCEPT +# endif +#else +# define EV_CPP(x) +# define EV_NOEXCEPT +#endif +#define EV_THROW EV_NOEXCEPT /* pre-4.25, do not use in new code */ + +EV_CPP(extern "C" {) + +/*****************************************************************************/ + +/* pre-4.0 compatibility */ +#ifndef EV_COMPAT3 +# define EV_COMPAT3 1 +#endif + +#ifndef EV_FEATURES +# if defined __OPTIMIZE_SIZE__ +# define EV_FEATURES 0x7c +# else +# define EV_FEATURES 0x7f +# endif +#endif + +#define EV_FEATURE_CODE ((EV_FEATURES) & 1) +#define EV_FEATURE_DATA ((EV_FEATURES) & 2) +#define EV_FEATURE_CONFIG ((EV_FEATURES) & 4) +#define EV_FEATURE_API ((EV_FEATURES) & 8) +#define EV_FEATURE_WATCHERS ((EV_FEATURES) & 16) +#define EV_FEATURE_BACKENDS ((EV_FEATURES) & 32) +#define EV_FEATURE_OS ((EV_FEATURES) & 64) + +/* these priorities are inclusive, higher priorities will be invoked earlier */ +#ifndef EV_MINPRI +# define EV_MINPRI (EV_FEATURE_CONFIG ? -2 : 0) +#endif +#ifndef EV_MAXPRI +# define EV_MAXPRI (EV_FEATURE_CONFIG ? +2 : 0) +#endif + +#ifndef EV_MULTIPLICITY +# define EV_MULTIPLICITY EV_FEATURE_CONFIG +#endif + +#ifndef EV_PERIODIC_ENABLE +# define EV_PERIODIC_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_STAT_ENABLE +# define EV_STAT_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_PREPARE_ENABLE +# define EV_PREPARE_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_CHECK_ENABLE +# define EV_CHECK_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_IDLE_ENABLE +# define EV_IDLE_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_FORK_ENABLE +# define EV_FORK_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_CLEANUP_ENABLE +# define EV_CLEANUP_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_SIGNAL_ENABLE +# define EV_SIGNAL_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_CHILD_ENABLE +# ifdef _WIN32 +# define EV_CHILD_ENABLE 0 +# else +# define EV_CHILD_ENABLE EV_FEATURE_WATCHERS +#endif +#endif + +#ifndef EV_ASYNC_ENABLE +# define EV_ASYNC_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_EMBED_ENABLE +# define EV_EMBED_ENABLE EV_FEATURE_WATCHERS +#endif + +#ifndef EV_WALK_ENABLE +# define EV_WALK_ENABLE 0 /* not yet */ +#endif + +/*****************************************************************************/ + +#if EV_CHILD_ENABLE && !EV_SIGNAL_ENABLE +# undef EV_SIGNAL_ENABLE +# define EV_SIGNAL_ENABLE 1 +#endif + +/*****************************************************************************/ + +#ifndef EV_TSTAMP_T +# define EV_TSTAMP_T double +#endif +typedef EV_TSTAMP_T ev_tstamp; + +#include /* for memmove */ + +#ifndef EV_ATOMIC_T +# include +# define EV_ATOMIC_T sig_atomic_t volatile +#endif + +#if EV_STAT_ENABLE +# ifdef _WIN32 +# include +# include +# endif +# include +#endif + +/* support multiple event loops? */ +#if EV_MULTIPLICITY +struct ev_loop; +# define EV_P struct ev_loop *loop /* a loop as sole parameter in a declaration */ +# define EV_P_ EV_P, /* a loop as first of multiple parameters */ +# define EV_A loop /* a loop as sole argument to a function call */ +# define EV_A_ EV_A, /* a loop as first of multiple arguments */ +# define EV_DEFAULT_UC ev_default_loop_uc_ () /* the default loop, if initialised, as sole arg */ +# define EV_DEFAULT_UC_ EV_DEFAULT_UC, /* the default loop as first of multiple arguments */ +# define EV_DEFAULT ev_default_loop (0) /* the default loop as sole arg */ +# define EV_DEFAULT_ EV_DEFAULT, /* the default loop as first of multiple arguments */ +#else +# define EV_P void +# define EV_P_ +# define EV_A +# define EV_A_ +# define EV_DEFAULT +# define EV_DEFAULT_ +# define EV_DEFAULT_UC +# define EV_DEFAULT_UC_ +# undef EV_EMBED_ENABLE +#endif + +/* EV_INLINE is used for functions in header files */ +#if __STDC_VERSION__ >= 199901L || __GNUC__ >= 3 +# define EV_INLINE static inline +#else +# define EV_INLINE static +#endif + +#ifdef EV_API_STATIC +# define EV_API_DECL static +#else +# define EV_API_DECL extern +#endif + +/* EV_PROTOTYPES can be used to switch of prototype declarations */ +#ifndef EV_PROTOTYPES +# define EV_PROTOTYPES 1 +#endif + +/*****************************************************************************/ + +#define EV_VERSION_MAJOR 4 +#define EV_VERSION_MINOR 33 + +/* eventmask, revents, events... */ +enum { + EV_UNDEF = (int)0xFFFFFFFF, /* guaranteed to be invalid */ + EV_NONE = 0x00, /* no events */ + EV_READ = 0x01, /* ev_io detected read will not block */ + EV_WRITE = 0x02, /* ev_io detected write will not block */ + EV__IOFDSET = 0x80, /* internal use only */ + EV_IO = EV_READ, /* alias for type-detection */ + EV_TIMER = 0x00000100, /* timer timed out */ +#if EV_COMPAT3 + EV_TIMEOUT = EV_TIMER, /* pre 4.0 API compatibility */ +#endif + EV_PERIODIC = 0x00000200, /* periodic timer timed out */ + EV_SIGNAL = 0x00000400, /* signal was received */ + EV_CHILD = 0x00000800, /* child/pid had status change */ + EV_STAT = 0x00001000, /* stat data changed */ + EV_IDLE = 0x00002000, /* event loop is idling */ + EV_PREPARE = 0x00004000, /* event loop about to poll */ + EV_CHECK = 0x00008000, /* event loop finished poll */ + EV_EMBED = 0x00010000, /* embedded event loop needs sweep */ + EV_FORK = 0x00020000, /* event loop resumed in child */ + EV_CLEANUP = 0x00040000, /* event loop resumed in child */ + EV_ASYNC = 0x00080000, /* async intra-loop signal */ + EV_CUSTOM = 0x01000000, /* for use by user code */ + EV_ERROR = (int)0x80000000 /* sent when an error occurs */ +}; + +/* can be used to add custom fields to all watchers, while losing binary compatibility */ +#ifndef EV_COMMON +# define EV_COMMON void *data; +#endif + +#ifndef EV_CB_DECLARE +# define EV_CB_DECLARE(type) void (*cb)(EV_P_ struct type *w, int revents); +#endif +#ifndef EV_CB_INVOKE +# define EV_CB_INVOKE(watcher,revents) (watcher)->cb (EV_A_ (watcher), (revents)) +#endif + +/* not official, do not use */ +#define EV_CB(type,name) void name (EV_P_ struct ev_ ## type *w, int revents) + +/* + * struct member types: + * private: you may look at them, but not change them, + * and they might not mean anything to you. + * ro: can be read anytime, but only changed when the watcher isn't active. + * rw: can be read and modified anytime, even when the watcher is active. + * + * some internal details that might be helpful for debugging: + * + * active is either 0, which means the watcher is not active, + * or the array index of the watcher (periodics, timers) + * or the array index + 1 (most other watchers) + * or simply 1 for watchers that aren't in some array. + * pending is either 0, in which case the watcher isn't, + * or the array index + 1 in the pendings array. + */ + +#if EV_MINPRI == EV_MAXPRI +# define EV_DECL_PRIORITY +#elif !defined (EV_DECL_PRIORITY) +# define EV_DECL_PRIORITY int priority; +#endif + +/* shared by all watchers */ +#define EV_WATCHER(type) \ + int active; /* private */ \ + int pending; /* private */ \ + EV_DECL_PRIORITY /* private */ \ + EV_COMMON /* rw */ \ + EV_CB_DECLARE (type) /* private */ + +#define EV_WATCHER_LIST(type) \ + EV_WATCHER (type) \ + struct ev_watcher_list *next; /* private */ + +#define EV_WATCHER_TIME(type) \ + EV_WATCHER (type) \ + ev_tstamp at; /* private */ + +/* base class, nothing to see here unless you subclass */ +typedef struct ev_watcher +{ + EV_WATCHER (ev_watcher) +} ev_watcher; + +/* base class, nothing to see here unless you subclass */ +typedef struct ev_watcher_list +{ + EV_WATCHER_LIST (ev_watcher_list) +} ev_watcher_list; + +/* base class, nothing to see here unless you subclass */ +typedef struct ev_watcher_time +{ + EV_WATCHER_TIME (ev_watcher_time) +} ev_watcher_time; + +/* invoked when fd is either EV_READable or EV_WRITEable */ +/* revent EV_READ, EV_WRITE */ +typedef struct ev_io +{ + EV_WATCHER_LIST (ev_io) + + int fd; /* ro */ + int events; /* ro */ +} ev_io; + +/* invoked after a specific time, repeatable (based on monotonic clock) */ +/* revent EV_TIMEOUT */ +typedef struct ev_timer +{ + EV_WATCHER_TIME (ev_timer) + + ev_tstamp repeat; /* rw */ +} ev_timer; + +/* invoked at some specific time, possibly repeating at regular intervals (based on UTC) */ +/* revent EV_PERIODIC */ +typedef struct ev_periodic +{ + EV_WATCHER_TIME (ev_periodic) + + ev_tstamp offset; /* rw */ + ev_tstamp interval; /* rw */ + ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) EV_NOEXCEPT; /* rw */ +} ev_periodic; + +/* invoked when the given signal has been received */ +/* revent EV_SIGNAL */ +typedef struct ev_signal +{ + EV_WATCHER_LIST (ev_signal) + + int signum; /* ro */ +} ev_signal; + +/* invoked when sigchld is received and waitpid indicates the given pid */ +/* revent EV_CHILD */ +/* does not support priorities */ +typedef struct ev_child +{ + EV_WATCHER_LIST (ev_child) + + int flags; /* private */ + int pid; /* ro */ + int rpid; /* rw, holds the received pid */ + int rstatus; /* rw, holds the exit status, use the macros from sys/wait.h */ +} ev_child; + +#if EV_STAT_ENABLE +/* st_nlink = 0 means missing file or other error */ +# ifdef _WIN32 +typedef struct _stati64 ev_statdata; +# else +typedef struct stat ev_statdata; +# endif + +/* invoked each time the stat data changes for a given path */ +/* revent EV_STAT */ +typedef struct ev_stat +{ + EV_WATCHER_LIST (ev_stat) + + ev_timer timer; /* private */ + ev_tstamp interval; /* ro */ + const char *path; /* ro */ + ev_statdata prev; /* ro */ + ev_statdata attr; /* ro */ + + int wd; /* wd for inotify, fd for kqueue */ +} ev_stat; +#endif + +/* invoked when the nothing else needs to be done, keeps the process from blocking */ +/* revent EV_IDLE */ +typedef struct ev_idle +{ + EV_WATCHER (ev_idle) +} ev_idle; + +/* invoked for each run of the mainloop, just before the blocking call */ +/* you can still change events in any way you like */ +/* revent EV_PREPARE */ +typedef struct ev_prepare +{ + EV_WATCHER (ev_prepare) +} ev_prepare; + +/* invoked for each run of the mainloop, just after the blocking call */ +/* revent EV_CHECK */ +typedef struct ev_check +{ + EV_WATCHER (ev_check) +} ev_check; + +/* the callback gets invoked before check in the child process when a fork was detected */ +/* revent EV_FORK */ +typedef struct ev_fork +{ + EV_WATCHER (ev_fork) +} ev_fork; + +/* is invoked just before the loop gets destroyed */ +/* revent EV_CLEANUP */ +typedef struct ev_cleanup +{ + EV_WATCHER (ev_cleanup) +} ev_cleanup; + +#if EV_EMBED_ENABLE +/* used to embed an event loop inside another */ +/* the callback gets invoked when the event loop has handled events, and can be 0 */ +typedef struct ev_embed +{ + EV_WATCHER (ev_embed) + + struct ev_loop *other; /* ro */ +#undef EV_IO_ENABLE +#define EV_IO_ENABLE 1 + ev_io io; /* private */ +#undef EV_PREPARE_ENABLE +#define EV_PREPARE_ENABLE 1 + ev_prepare prepare; /* private */ + ev_check check; /* unused */ + ev_timer timer; /* unused */ + ev_periodic periodic; /* unused */ + ev_idle idle; /* unused */ + ev_fork fork; /* private */ + ev_cleanup cleanup; /* unused */ +} ev_embed; +#endif + +#if EV_ASYNC_ENABLE +/* invoked when somebody calls ev_async_send on the watcher */ +/* revent EV_ASYNC */ +typedef struct ev_async +{ + EV_WATCHER (ev_async) + + EV_ATOMIC_T sent; /* private */ +} ev_async; + +# define ev_async_pending(w) (+(w)->sent) +#endif + +/* the presence of this union forces similar struct layout */ +union ev_any_watcher +{ + struct ev_watcher w; + struct ev_watcher_list wl; + + struct ev_io io; + struct ev_timer timer; + struct ev_periodic periodic; + struct ev_signal signal; + struct ev_child child; +#if EV_STAT_ENABLE + struct ev_stat stat; +#endif +#if EV_IDLE_ENABLE + struct ev_idle idle; +#endif + struct ev_prepare prepare; + struct ev_check check; +#if EV_FORK_ENABLE + struct ev_fork fork; +#endif +#if EV_CLEANUP_ENABLE + struct ev_cleanup cleanup; +#endif +#if EV_EMBED_ENABLE + struct ev_embed embed; +#endif +#if EV_ASYNC_ENABLE + struct ev_async async; +#endif +}; + +/* flag bits for ev_default_loop and ev_loop_new */ +enum { + /* the default */ + EVFLAG_AUTO = 0x00000000U, /* not quite a mask */ + /* flag bits */ + EVFLAG_NOENV = 0x01000000U, /* do NOT consult environment */ + EVFLAG_FORKCHECK = 0x02000000U, /* check for a fork in each iteration */ + /* debugging/feature disable */ + EVFLAG_NOINOTIFY = 0x00100000U, /* do not attempt to use inotify */ +#if EV_COMPAT3 + EVFLAG_NOSIGFD = 0, /* compatibility to pre-3.9 */ +#endif + EVFLAG_SIGNALFD = 0x00200000U, /* attempt to use signalfd */ + EVFLAG_NOSIGMASK = 0x00400000U, /* avoid modifying the signal mask */ + EVFLAG_NOTIMERFD = 0x00800000U /* avoid creating a timerfd */ +}; + +/* method bits to be ored together */ +enum { + EVBACKEND_SELECT = 0x00000001U, /* available just about anywhere */ + EVBACKEND_POLL = 0x00000002U, /* !win, !aix, broken on osx */ + EVBACKEND_EPOLL = 0x00000004U, /* linux */ + EVBACKEND_KQUEUE = 0x00000008U, /* bsd, broken on osx */ + EVBACKEND_DEVPOLL = 0x00000010U, /* solaris 8 */ /* NYI */ + EVBACKEND_PORT = 0x00000020U, /* solaris 10 */ + EVBACKEND_LINUXAIO = 0x00000040U, /* linux AIO, 4.19+ */ + EVBACKEND_IOURING = 0x00000080U, /* linux io_uring, 5.1+ */ + EVBACKEND_ALL = 0x000000FFU, /* all known backends */ + EVBACKEND_MASK = 0x0000FFFFU /* all future backends */ +}; + +#if EV_PROTOTYPES +EV_API_DECL int ev_version_major (void) EV_NOEXCEPT; +EV_API_DECL int ev_version_minor (void) EV_NOEXCEPT; + +EV_API_DECL unsigned int ev_supported_backends (void) EV_NOEXCEPT; +EV_API_DECL unsigned int ev_recommended_backends (void) EV_NOEXCEPT; +EV_API_DECL unsigned int ev_embeddable_backends (void) EV_NOEXCEPT; + +EV_API_DECL ev_tstamp ev_time (void) EV_NOEXCEPT; +EV_API_DECL void ev_sleep (ev_tstamp delay) EV_NOEXCEPT; /* sleep for a while */ + +/* Sets the allocation function to use, works like realloc. + * It is used to allocate and free memory. + * If it returns zero when memory needs to be allocated, the library might abort + * or take some potentially destructive action. + * The default is your system realloc function. + */ +EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, long size) EV_NOEXCEPT) EV_NOEXCEPT; + +/* set the callback function to call on a + * retryable syscall error + * (such as failed select, poll, epoll_wait) + */ +EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT; + +#if EV_MULTIPLICITY + +/* the default loop is the only one that handles signals and child watchers */ +/* you can call this as often as you like */ +EV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; + +#ifdef EV_API_STATIC +EV_API_DECL struct ev_loop *ev_default_loop_ptr; +#endif + +EV_INLINE struct ev_loop * +ev_default_loop_uc_ (void) EV_NOEXCEPT +{ + extern struct ev_loop *ev_default_loop_ptr; + + return ev_default_loop_ptr; +} + +EV_INLINE int +ev_is_default_loop (EV_P) EV_NOEXCEPT +{ + return EV_A == EV_DEFAULT_UC; +} + +/* create and destroy alternative loops that don't handle signals */ +EV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; + +EV_API_DECL ev_tstamp ev_now (EV_P) EV_NOEXCEPT; /* time w.r.t. timers and the eventloop, updated after each poll */ + +#else + +EV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; /* returns true when successful */ + +EV_API_DECL ev_tstamp ev_rt_now; + +EV_INLINE ev_tstamp +ev_now (void) EV_NOEXCEPT +{ + return ev_rt_now; +} + +/* looks weird, but ev_is_default_loop (EV_A) still works if this exists */ +EV_INLINE int +ev_is_default_loop (void) EV_NOEXCEPT +{ + return 1; +} + +#endif /* multiplicity */ + +/* destroy event loops, also works for the default loop */ +EV_API_DECL void ev_loop_destroy (EV_P); + +/* this needs to be called after fork, to duplicate the loop */ +/* when you want to re-use it in the child */ +/* you can call it in either the parent or the child */ +/* you can actually call it at any time, anywhere :) */ +EV_API_DECL void ev_loop_fork (EV_P) EV_NOEXCEPT; + +EV_API_DECL unsigned int ev_backend (EV_P) EV_NOEXCEPT; /* backend in use by loop */ + +EV_API_DECL void ev_now_update (EV_P) EV_NOEXCEPT; /* update event loop time */ + +#if EV_WALK_ENABLE +/* walk (almost) all watchers in the loop of a given type, invoking the */ +/* callback on every such watcher. The callback might stop the watcher, */ +/* but do nothing else with the loop */ +EV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT; +#endif + +#endif /* prototypes */ + +/* ev_run flags values */ +enum { + EVRUN_NOWAIT = 1, /* do not block/wait */ + EVRUN_ONCE = 2 /* block *once* only */ +}; + +/* ev_break how values */ +enum { + EVBREAK_CANCEL = 0, /* undo unloop */ + EVBREAK_ONE = 1, /* unloop once */ + EVBREAK_ALL = 2 /* unloop all loops */ +}; + +#if EV_PROTOTYPES +EV_API_DECL int ev_run (EV_P_ int flags EV_CPP (= 0)); +EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_NOEXCEPT; /* break out of the loop */ + +/* + * ref/unref can be used to add or remove a refcount on the mainloop. every watcher + * keeps one reference. if you have a long-running watcher you never unregister that + * should not keep ev_loop from running, unref() after starting, and ref() before stopping. + */ +EV_API_DECL void ev_ref (EV_P) EV_NOEXCEPT; +EV_API_DECL void ev_unref (EV_P) EV_NOEXCEPT; + +/* + * convenience function, wait for a single event, without registering an event watcher + * if timeout is < 0, do wait indefinitely + */ +EV_API_DECL void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_NOEXCEPT; + +EV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */ + +# if EV_FEATURE_API +EV_API_DECL unsigned int ev_iteration (EV_P) EV_NOEXCEPT; /* number of loop iterations */ +EV_API_DECL unsigned int ev_depth (EV_P) EV_NOEXCEPT; /* #ev_loop enters - #ev_loop leaves */ +EV_API_DECL void ev_verify (EV_P) EV_NOEXCEPT; /* abort if loop data corrupted */ + +EV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */ +EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */ + +/* advanced stuff for threading etc. support, see docs */ +EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT; +EV_API_DECL void *ev_userdata (EV_P) EV_NOEXCEPT; +typedef void (*ev_loop_callback)(EV_P); +EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT; +/* C++ doesn't allow the use of the ev_loop_callback typedef here, so we need to spell it out */ +EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_NOEXCEPT, void (*acquire)(EV_P) EV_NOEXCEPT) EV_NOEXCEPT; + +EV_API_DECL unsigned int ev_pending_count (EV_P) EV_NOEXCEPT; /* number of pending events, if any */ + +/* + * stop/start the timer handling. + */ +EV_API_DECL void ev_suspend (EV_P) EV_NOEXCEPT; +EV_API_DECL void ev_resume (EV_P) EV_NOEXCEPT; +#endif + +#endif + +/* these may evaluate ev multiple times, and the other arguments at most once */ +/* either use ev_init + ev_TYPE_set, or the ev_TYPE_init macro, below, to first initialise a watcher */ +#define ev_init(ev,cb_) do { \ + ((ev_watcher *)(void *)(ev))->active = \ + ((ev_watcher *)(void *)(ev))->pending = 0; \ + ev_set_priority ((ev), 0); \ + ev_set_cb ((ev), cb_); \ +} while (0) + +#define ev_io_modify(ev,events_) do { (ev)->events = (ev)->events & EV__IOFDSET | (events_); } while (0) +#define ev_io_set(ev,fd_,events_) do { (ev)->fd = (fd_); (ev)->events = (events_) | EV__IOFDSET; } while (0) +#define ev_timer_set(ev,after_,repeat_) do { ((ev_watcher_time *)(ev))->at = (after_); (ev)->repeat = (repeat_); } while (0) +#define ev_periodic_set(ev,ofs_,ival_,rcb_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb = (rcb_); } while (0) +#define ev_signal_set(ev,signum_) do { (ev)->signum = (signum_); } while (0) +#define ev_child_set(ev,pid_,trace_) do { (ev)->pid = (pid_); (ev)->flags = !!(trace_); } while (0) +#define ev_stat_set(ev,path_,interval_) do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0) +#define ev_idle_set(ev) /* nop, yes, this is a serious in-joke */ +#define ev_prepare_set(ev) /* nop, yes, this is a serious in-joke */ +#define ev_check_set(ev) /* nop, yes, this is a serious in-joke */ +#define ev_embed_set(ev,other_) do { (ev)->other = (other_); } while (0) +#define ev_fork_set(ev) /* nop, yes, this is a serious in-joke */ +#define ev_cleanup_set(ev) /* nop, yes, this is a serious in-joke */ +#define ev_async_set(ev) /* nop, yes, this is a serious in-joke */ + +#define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0) +#define ev_timer_init(ev,cb,after,repeat) do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0) +#define ev_periodic_init(ev,cb,ofs,ival,rcb) do { ev_init ((ev), (cb)); ev_periodic_set ((ev),(ofs),(ival),(rcb)); } while (0) +#define ev_signal_init(ev,cb,signum) do { ev_init ((ev), (cb)); ev_signal_set ((ev), (signum)); } while (0) +#define ev_child_init(ev,cb,pid,trace) do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid),(trace)); } while (0) +#define ev_stat_init(ev,cb,path,interval) do { ev_init ((ev), (cb)); ev_stat_set ((ev),(path),(interval)); } while (0) +#define ev_idle_init(ev,cb) do { ev_init ((ev), (cb)); ev_idle_set ((ev)); } while (0) +#define ev_prepare_init(ev,cb) do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0) +#define ev_check_init(ev,cb) do { ev_init ((ev), (cb)); ev_check_set ((ev)); } while (0) +#define ev_embed_init(ev,cb,other) do { ev_init ((ev), (cb)); ev_embed_set ((ev),(other)); } while (0) +#define ev_fork_init(ev,cb) do { ev_init ((ev), (cb)); ev_fork_set ((ev)); } while (0) +#define ev_cleanup_init(ev,cb) do { ev_init ((ev), (cb)); ev_cleanup_set ((ev)); } while (0) +#define ev_async_init(ev,cb) do { ev_init ((ev), (cb)); ev_async_set ((ev)); } while (0) + +#define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */ +#define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */ + +#define ev_cb_(ev) (ev)->cb /* rw */ +#define ev_cb(ev) (memmove (&ev_cb_ (ev), &((ev_watcher *)(ev))->cb, sizeof (ev_cb_ (ev))), (ev)->cb) + +#if EV_MINPRI == EV_MAXPRI +# define ev_priority(ev) ((ev), EV_MINPRI) +# define ev_set_priority(ev,pri) ((ev), (pri)) +#else +# define ev_priority(ev) (+(((ev_watcher *)(void *)(ev))->priority)) +# define ev_set_priority(ev,pri) ( (ev_watcher *)(void *)(ev))->priority = (pri) +#endif + +#define ev_periodic_at(ev) (+((ev_watcher_time *)(ev))->at) + +#ifndef ev_set_cb +/* memmove is used here to avoid strict aliasing violations, and hopefully is optimized out by any reasonable compiler */ +# define ev_set_cb(ev,cb_) (ev_cb_ (ev) = (cb_), memmove (&((ev_watcher *)(ev))->cb, &ev_cb_ (ev), sizeof (ev_cb_ (ev)))) +#endif + +/* stopping (enabling, adding) a watcher does nothing if it is already running */ +/* stopping (disabling, deleting) a watcher does nothing unless it's already running */ +#if EV_PROTOTYPES + +/* feeds an event into a watcher as if the event actually occurred */ +/* accepts any ev_watcher type */ +EV_API_DECL void ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT; +EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT; +#if EV_SIGNAL_ENABLE +EV_API_DECL void ev_feed_signal (int signum) EV_NOEXCEPT; +EV_API_DECL void ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT; +#endif +EV_API_DECL void ev_invoke (EV_P_ void *w, int revents); +EV_API_DECL int ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT; + +EV_API_DECL void ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT; +EV_API_DECL void ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT; + +EV_API_DECL void ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT; +EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT; +/* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */ +EV_API_DECL void ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT; +/* return remaining time */ +EV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT; + +#if EV_PERIODIC_ENABLE +EV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT; +EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT; +EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT; +#endif + +/* only supported in the default loop */ +#if EV_SIGNAL_ENABLE +EV_API_DECL void ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT; +EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT; +#endif + +/* only supported in the default loop */ +# if EV_CHILD_ENABLE +EV_API_DECL void ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT; +EV_API_DECL void ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT; +# endif + +# if EV_STAT_ENABLE +EV_API_DECL void ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT; +EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT; +EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT; +# endif + +# if EV_IDLE_ENABLE +EV_API_DECL void ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT; +EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT; +# endif + +#if EV_PREPARE_ENABLE +EV_API_DECL void ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT; +EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT; +#endif + +#if EV_CHECK_ENABLE +EV_API_DECL void ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT; +EV_API_DECL void ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT; +#endif + +# if EV_FORK_ENABLE +EV_API_DECL void ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT; +EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT; +# endif + +# if EV_CLEANUP_ENABLE +EV_API_DECL void ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT; +EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT; +# endif + +# if EV_EMBED_ENABLE +/* only supported when loop to be embedded is in fact embeddable */ +EV_API_DECL void ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT; +EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT; +EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT; +# endif + +# if EV_ASYNC_ENABLE +EV_API_DECL void ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT; +EV_API_DECL void ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT; +EV_API_DECL void ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT; +# endif + +#if EV_COMPAT3 + #define EVLOOP_NONBLOCK EVRUN_NOWAIT + #define EVLOOP_ONESHOT EVRUN_ONCE + #define EVUNLOOP_CANCEL EVBREAK_CANCEL + #define EVUNLOOP_ONE EVBREAK_ONE + #define EVUNLOOP_ALL EVBREAK_ALL + #if EV_PROTOTYPES + EV_INLINE void ev_loop (EV_P_ int flags) { ev_run (EV_A_ flags); } + EV_INLINE void ev_unloop (EV_P_ int how ) { ev_break (EV_A_ how ); } + EV_INLINE void ev_default_destroy (void) { ev_loop_destroy (EV_DEFAULT); } + EV_INLINE void ev_default_fork (void) { ev_loop_fork (EV_DEFAULT); } + #if EV_FEATURE_API + EV_INLINE unsigned int ev_loop_count (EV_P) { return ev_iteration (EV_A); } + EV_INLINE unsigned int ev_loop_depth (EV_P) { return ev_depth (EV_A); } + EV_INLINE void ev_loop_verify (EV_P) { ev_verify (EV_A); } + #endif + #endif +#else + typedef struct ev_loop ev_loop; +#endif + +#endif + +EV_CPP(}) + +#endif + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev.pod b/deps/ngtcp2/ngtcp2/third-party/libev/ev.pod new file mode 100644 index 000000000000..e4eeb5073fe5 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev.pod @@ -0,0 +1,5741 @@ +=encoding utf-8 + +=head1 NAME + +libev - a high performance full-featured event loop written in C + +=head1 SYNOPSIS + + #include + +=head2 EXAMPLE PROGRAM + + // a single header file is required + #include + + #include // for puts + + // every watcher type has its own typedef'd struct + // with the name ev_TYPE + ev_io stdin_watcher; + ev_timer timeout_watcher; + + // all watcher callbacks have a similar signature + // this callback is called when data is readable on stdin + static void + stdin_cb (EV_P_ ev_io *w, int revents) + { + puts ("stdin ready"); + // for one-shot events, one must manually stop the watcher + // with its corresponding stop function. + ev_io_stop (EV_A_ w); + + // this causes all nested ev_run's to stop iterating + ev_break (EV_A_ EVBREAK_ALL); + } + + // another callback, this time for a time-out + static void + timeout_cb (EV_P_ ev_timer *w, int revents) + { + puts ("timeout"); + // this causes the innermost ev_run to stop iterating + ev_break (EV_A_ EVBREAK_ONE); + } + + int + main (void) + { + // use the default event loop unless you have special needs + struct ev_loop *loop = EV_DEFAULT; + + // initialise an io watcher, then start it + // this one will watch for stdin to become readable + ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ); + ev_io_start (loop, &stdin_watcher); + + // initialise a timer watcher, then start it + // simple non-repeating 5.5 second timeout + ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.); + ev_timer_start (loop, &timeout_watcher); + + // now wait for events to arrive + ev_run (loop, 0); + + // break was called, so exit + return 0; + } + +=head1 ABOUT THIS DOCUMENT + +This document documents the libev software package. + +The newest version of this document is also available as an html-formatted +web page you might find easier to navigate when reading it for the first +time: L. + +While this document tries to be as complete as possible in documenting +libev, its usage and the rationale behind its design, it is not a tutorial +on event-based programming, nor will it introduce event-based programming +with libev. + +Familiarity with event based programming techniques in general is assumed +throughout this document. + +=head1 WHAT TO READ WHEN IN A HURRY + +This manual tries to be very detailed, but unfortunately, this also makes +it very long. If you just want to know the basics of libev, I suggest +reading L, then the L above and +look up the missing functions in L and the C and +C sections in L. + +=head1 ABOUT LIBEV + +Libev is an event loop: you register interest in certain events (such as a +file descriptor being readable or a timeout occurring), and it will manage +these event sources and provide your program with events. + +To do this, it must take more or less complete control over your process +(or thread) by executing the I handler, and will then +communicate events via a callback mechanism. + +You register interest in certain events by registering so-called I, which are relatively small C structures you initialise with the +details of the event, and then hand it over to libev by I the +watcher. + +=head2 FEATURES + +Libev supports C (files, many character devices...). + +Epoll is truly the train wreck among event poll mechanisms, a frankenpoll, +cobbled together in a hurry, no thought to design or interaction with +others. Oh, the pain, will it ever stop... + +While stopping, setting and starting an I/O watcher in the same iteration +will result in some caching, there is still a system call per such +incident (because the same I could point to a different +I now), so its best to avoid that. Also, C'ed +file descriptors might not work very well if you register events for both +file descriptors. + +Best performance from this backend is achieved by not unregistering all +watchers for a file descriptor until it has been closed, if possible, +i.e. keep at least one watcher active per fd at all times. Stopping and +starting a watcher (without re-setting it) also usually doesn't cause +extra overhead. A fork can both result in spurious notifications as well +as in libev having to destroy and recreate the epoll object, which can +take considerable time and thus should be avoided. + +All this means that, in practice, C can be as fast or +faster than epoll for maybe up to a hundred file descriptors, depending on +the usage. So sad. + +While nominally embeddable in other event loops, this feature is broken in +a lot of kernel revisions, but probably(!) works in current versions. + +This backend maps C and C in the same way as +C. + +=item C (value 64, Linux) + +Use the Linux-specific Linux AIO (I C<< aio(7) >> but C<< +io_submit(2) >>) event interface available in post-4.18 kernels (but libev +only tries to use it in 4.19+). + +This is another Linux train wreck of an event interface. + +If this backend works for you (as of this writing, it was very +experimental), it is the best event interface available on Linux and might +be well worth enabling it - if it isn't available in your kernel this will +be detected and this backend will be skipped. + +This backend can batch oneshot requests and supports a user-space ring +buffer to receive events. It also doesn't suffer from most of the design +problems of epoll (such as not being able to remove event sources from +the epoll set), and generally sounds too good to be true. Because, this +being the Linux kernel, of course it suffers from a whole new set of +limitations, forcing you to fall back to epoll, inheriting all its design +issues. + +For one, it is not easily embeddable (but probably could be done using +an event fd at some extra overhead). It also is subject to a system wide +limit that can be configured in F. If no AIO +requests are left, this backend will be skipped during initialisation, and +will switch to epoll when the loop is active. + +Most problematic in practice, however, is that not all file descriptors +work with it. For example, in Linux 5.1, TCP sockets, pipes, event fds, +files, F and many others are supported, but ttys do not work +properly (a known bug that the kernel developers don't care about, see +L), so this is not +(yet?) a generic event polling interface. + +Overall, it seems the Linux developers just don't want it to have a +generic event handling mechanism other than C which have a high +overhead for the actual polling but can deliver many events at once. + +By setting a higher I you allow libev to spend more +time collecting I/O events, so you can handle more events per iteration, +at the cost of increasing latency. Timeouts (both C and +C) will not be affected. Setting this to a non-null value will +introduce an additional C call into most loop iterations. The +sleep time ensures that libev will not poll for I/O events more often then +once per this interval, on average (as long as the host time resolution is +good enough). + +Likewise, by setting a higher I you allow libev +to spend more time collecting timeouts, at the expense of increased +latency/jitter/inexactness (the watcher callback will be called +later). C watchers will not be affected. Setting this to a non-null +value will not introduce any overhead in libev. + +Many (busy) programs can usually benefit by setting the I/O collect +interval to a value near C<0.1> or so, which is often enough for +interactive servers (of course not for games), likewise for timeouts. It +usually doesn't make much sense to set it to a lower value than C<0.01>, +as this approaches the timing granularity of most systems. Note that if +you do transactions with the outside world and you can't increase the +parallelity, then this setting will limit your transaction rate (if you +need to poll once per transaction and the I/O collect interval is 0.01, +then you can't do more than 100 transactions per second). + +Setting the I can improve the opportunity for +saving power, as the program will "bundle" timer callback invocations that +are "near" in time together, by delaying some, thus reducing the number of +times the process sleeps and wakes up again. Another useful technique to +reduce iterations/wake-ups is to use C watchers and make sure +they fire on, say, one-second boundaries only. + +Example: we only need 0.1s timeout granularity, and we wish not to poll +more often than 100 times per second: + + ev_set_timeout_collect_interval (EV_DEFAULT_UC_ 0.1); + ev_set_io_collect_interval (EV_DEFAULT_UC_ 0.01); + +=item ev_invoke_pending (loop) + +This call will simply invoke all pending watchers while resetting their +pending state. Normally, C does this automatically when required, +but when overriding the invoke callback this call comes handy. This +function can be invoked from a watcher - this can be useful for example +when you want to do some lengthy calculation and want to pass further +event handling to another thread (you still have to make sure only one +thread executes within C or C of course). + +=item int ev_pending_count (loop) + +Returns the number of pending watchers - zero indicates that no watchers +are pending. + +=item ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(EV_P)) + +This overrides the invoke pending functionality of the loop: Instead of +invoking all pending watchers when there are any, C will call +this callback instead. This is useful, for example, when you want to +invoke the actual watchers inside another context (another thread etc.). + +If you want to reset the callback, use C as new +callback. + +=item ev_set_loop_release_cb (loop, void (*release)(EV_P) throw (), void (*acquire)(EV_P) throw ()) + +Sometimes you want to share the same loop between multiple threads. This +can be done relatively simply by putting mutex_lock/unlock calls around +each call to a libev function. + +However, C can run an indefinite time, so it is not feasible +to wait for it to return. One way around this is to wake up the event +loop via C and C, another way is to set these +I and I callbacks on the loop. + +When set, then C will be called just before the thread is +suspended waiting for new events, and C is called just +afterwards. + +Ideally, C will just call your mutex_unlock function, and +C will just call the mutex_lock function again. + +While event loop modifications are allowed between invocations of +C and C (that's their only purpose after all), no +modifications done will affect the event loop, i.e. adding watchers will +have no effect on the set of file descriptors being watched, or the time +waited. Use an C watcher to wake up C when you want it +to take note of any changes you made. + +In theory, threads executing C will be async-cancel safe between +invocations of C and C. + +See also the locking example in the C section later in this +document. + +=item ev_set_userdata (loop, void *data) + +=item void *ev_userdata (loop) + +Set and retrieve a single C associated with a loop. When +C has never been called, then C returns +C<0>. + +These two functions can be used to associate arbitrary data with a loop, +and are intended solely for the C, C and +C callbacks described above, but of course can be (ab-)used for +any other purpose as well. + +=item ev_verify (loop) + +This function only does something when C support has been +compiled in, which is the default for non-minimal builds. It tries to go +through all internal structures and checks them for validity. If anything +is found to be inconsistent, it will print an error message to standard +error and call C. + +This can be used to catch bugs inside libev itself: under normal +circumstances, this function will never abort as of course libev keeps its +data structures consistent. + +=back + + +=head1 ANATOMY OF A WATCHER + +In the following description, uppercase C in names stands for the +watcher type, e.g. C can mean C for timer +watchers and C for I/O watchers. + +A watcher is an opaque structure that you allocate and register to record +your interest in some event. To make a concrete example, imagine you want +to wait for STDIN to become readable, you would create an C watcher +for that: + + static void my_cb (struct ev_loop *loop, ev_io *w, int revents) + { + ev_io_stop (w); + ev_break (loop, EVBREAK_ALL); + } + + struct ev_loop *loop = ev_default_loop (0); + + ev_io stdin_watcher; + + ev_init (&stdin_watcher, my_cb); + ev_io_set (&stdin_watcher, STDIN_FILENO, EV_READ); + ev_io_start (loop, &stdin_watcher); + + ev_run (loop, 0); + +As you can see, you are responsible for allocating the memory for your +watcher structures (and it is I a bad idea to do this on the +stack). + +Each watcher has an associated watcher structure (called C +or simply C, as typedefs are provided for all watcher structs). + +Each watcher structure must be initialised by a call to C, which expects a callback to be provided. This callback is +invoked each time the event occurs (or, in the case of I/O watchers, each +time the event loop detects that the file descriptor given is readable +and/or writable). + +Each watcher type further has its own C<< ev_TYPE_set (watcher *, ...) >> +macro to configure it, with arguments specific to the watcher type. There +is also a macro to combine initialisation and setting in one call: C<< +ev_TYPE_init (watcher *, callback, ...) >>. + +To make the watcher actually watch out for events, you have to start it +with a watcher-specific start function (C<< ev_TYPE_start (loop, watcher +*) >>), and you can stop watching for events at any time by calling the +corresponding stop function (C<< ev_TYPE_stop (loop, watcher *) >>. + +As long as your watcher is active (has been started but not stopped) you +must not touch the values stored in it except when explicitly documented +otherwise. Most specifically you must never reinitialise it or call its +C macro. + +Each and every callback receives the event loop pointer as first, the +registered watcher structure as second, and a bitset of received events as +third argument. + +The received events usually include a single bit per event type received +(you can receive multiple events at the same time). The possible bit masks +are: + +=over 4 + +=item C + +=item C + +The file descriptor in the C watcher has become readable and/or +writable. + +=item C + +The C watcher has timed out. + +=item C + +The C watcher has timed out. + +=item C + +The signal specified in the C watcher has been received by a thread. + +=item C + +The pid specified in the C watcher has received a status change. + +=item C + +The path specified in the C watcher changed its attributes somehow. + +=item C + +The C watcher has determined that you have nothing better to do. + +=item C + +=item C + +All C watchers are invoked just I C starts to +gather new events, and all C watchers are queued (not invoked) +just after C has gathered them, but before it queues any callbacks +for any received events. That means C watchers are the last +watchers invoked before the event loop sleeps or polls for new events, and +C watchers will be invoked before any other watchers of the same +or lower priority within an event loop iteration. + +Callbacks of both watcher types can start and stop as many watchers as +they want, and all of them will be taken into account (for example, a +C watcher might start an idle watcher to keep C from +blocking). + +=item C + +The embedded event loop specified in the C watcher needs attention. + +=item C + +The event loop has been resumed in the child process after fork (see +C). + +=item C + +The event loop is about to be destroyed (see C). + +=item C + +The given async watcher has been asynchronously notified (see C). + +=item C + +Not ever sent (or otherwise used) by libev itself, but can be freely used +by libev users to signal watchers (e.g. via C). + +=item C + +An unspecified error has occurred, the watcher has been stopped. This might +happen because the watcher could not be properly started because libev +ran out of memory, a file descriptor was found to be closed or any other +problem. Libev considers these application bugs. + +You best act on it by reporting the problem and somehow coping with the +watcher being stopped. Note that well-written programs should not receive +an error ever, so when your watcher receives it, this usually indicates a +bug in your program. + +Libev will usually signal a few "dummy" events together with an error, for +example it might indicate that a fd is readable or writable, and if your +callbacks is well-written it can just attempt the operation and cope with +the error from read() or write(). This will not work in multi-threaded +programs, though, as the fd could already be closed and reused for another +thing, so beware. + +=back + +=head2 GENERIC WATCHER FUNCTIONS + +=over 4 + +=item C (ev_TYPE *watcher, callback) + +This macro initialises the generic portion of a watcher. The contents +of the watcher object can be arbitrary (so C will do). Only +the generic parts of the watcher are initialised, you I to call +the type-specific C macro afterwards to initialise the +type-specific parts. For each type there is also a C macro +which rolls both calls into one. + +You can reinitialise a watcher at any time as long as it has been stopped +(or never started) and there are no pending events outstanding. + +The callback is always of type C. + +Example: Initialise an C watcher in two steps. + + ev_io w; + ev_init (&w, my_cb); + ev_io_set (&w, STDIN_FILENO, EV_READ); + +=item C (ev_TYPE *watcher, [args]) + +This macro initialises the type-specific parts of a watcher. You need to +call C at least once before you call this macro, but you can +call C any number of times. You must not, however, call this +macro on a watcher that is active (it can be pending, however, which is a +difference to the C macro). + +Although some watcher types do not have type-specific arguments +(e.g. C) you still need to call its C macro. + +See C, above, for an example. + +=item C (ev_TYPE *watcher, callback, [args]) + +This convenience macro rolls both C and C macro +calls into a single call. This is the most convenient method to initialise +a watcher. The same limitations apply, of course. + +Example: Initialise and set an C watcher in one step. + + ev_io_init (&w, my_cb, STDIN_FILENO, EV_READ); + +=item C (loop, ev_TYPE *watcher) + +Starts (activates) the given watcher. Only active watchers will receive +events. If the watcher is already active nothing will happen. + +Example: Start the C watcher that is being abused as example in this +whole section. + + ev_io_start (EV_DEFAULT_UC, &w); + +=item C (loop, ev_TYPE *watcher) + +Stops the given watcher if active, and clears the pending status (whether +the watcher was active or not). + +It is possible that stopped watchers are pending - for example, +non-repeating timers are being stopped when they become pending - but +calling C ensures that the watcher is neither active nor +pending. If you want to free or reuse the memory used by the watcher it is +therefore a good idea to always call its C function. + +=item bool ev_is_active (ev_TYPE *watcher) + +Returns a true value iff the watcher is active (i.e. it has been started +and not yet been stopped). As long as a watcher is active you must not modify +it. + +=item bool ev_is_pending (ev_TYPE *watcher) + +Returns a true value iff the watcher is pending, (i.e. it has outstanding +events but its callback has not yet been invoked). As long as a watcher +is pending (but not active) you must not call an init function on it (but +C is safe), you must not change its priority, and you must +make sure the watcher is available to libev (e.g. you cannot C +it). + +=item callback ev_cb (ev_TYPE *watcher) + +Returns the callback currently set on the watcher. + +=item ev_set_cb (ev_TYPE *watcher, callback) + +Change the callback. You can change the callback at virtually any time +(modulo threads). + +=item ev_set_priority (ev_TYPE *watcher, int priority) + +=item int ev_priority (ev_TYPE *watcher) + +Set and query the priority of the watcher. The priority is a small +integer between C (default: C<2>) and C +(default: C<-2>). Pending watchers with higher priority will be invoked +before watchers with lower priority, but priority will not keep watchers +from being executed (except for C watchers). + +If you need to suppress invocation when higher priority events are pending +you need to look at C watchers, which provide this functionality. + +You I change the priority of a watcher as long as it is active or +pending. + +Setting a priority outside the range of C to C is +fine, as long as you do not mind that the priority value you query might +or might not have been clamped to the valid range. + +The default priority used by watchers when no priority has been set is +always C<0>, which is supposed to not be too high and not be too low :). + +See L, below, for a more thorough treatment of +priorities. + +=item ev_invoke (loop, ev_TYPE *watcher, int revents) + +Invoke the C with the given C and C. Neither +C nor C need to be valid as long as the watcher callback +can deal with that fact, as both are simply passed through to the +callback. + +=item int ev_clear_pending (loop, ev_TYPE *watcher) + +If the watcher is pending, this function clears its pending status and +returns its C bitset (as if its callback was invoked). If the +watcher isn't pending it does nothing and returns C<0>. + +Sometimes it can be useful to "poll" a watcher instead of waiting for its +callback to be invoked, which can be accomplished with this function. + +=item ev_feed_event (loop, ev_TYPE *watcher, int revents) + +Feeds the given event set into the event loop, as if the specified event +had happened for the specified watcher (which must be a pointer to an +initialised but not necessarily started event watcher). Obviously you must +not free the watcher as long as it has pending events. + +Stopping the watcher, letting libev invoke it, or calling +C will clear the pending event, even if the watcher was +not started in the first place. + +See also C and C for related +functions that do not need a watcher. + +=back + +See also the L and L idioms. + +=head2 WATCHER STATES + +There are various watcher states mentioned throughout this manual - +active, pending and so on. In this section these states and the rules to +transition between them will be described in more detail - and while these +rules might look complicated, they usually do "the right thing". + +=over 4 + +=item initialised + +Before a watcher can be registered with the event loop it has to be +initialised. This can be done with a call to C, or calls to +C followed by the watcher-specific C function. + +In this state it is simply some block of memory that is suitable for +use in an event loop. It can be moved around, freed, reused etc. at +will - as long as you either keep the memory contents intact, or call +C again. + +=item started/running/active + +Once a watcher has been started with a call to C it becomes +property of the event loop, and is actively waiting for events. While in +this state it cannot be accessed (except in a few documented ways), moved, +freed or anything else - the only legal thing is to keep a pointer to it, +and call libev functions on it that are documented to work on active watchers. + +=item pending + +If a watcher is active and libev determines that an event it is interested +in has occurred (such as a timer expiring), it will become pending. It will +stay in this pending state until either it is stopped or its callback is +about to be invoked, so it is not normally pending inside the watcher +callback. + +The watcher might or might not be active while it is pending (for example, +an expired non-repeating timer can be pending but no longer active). If it +is stopped, it can be freely accessed (e.g. by calling C), +but it is still property of the event loop at this time, so cannot be +moved, freed or reused. And if it is active the rules described in the +previous item still apply. + +It is also possible to feed an event on a watcher that is not active (e.g. +via C), in which case it becomes pending without being +active. + +=item stopped + +A watcher can be stopped implicitly by libev (in which case it might still +be pending), or explicitly by calling its C function. The +latter will clear any pending state the watcher might be in, regardless +of whether it was active or not, so stopping a watcher explicitly before +freeing it is often a good idea. + +While stopped (and not pending) the watcher is essentially in the +initialised state, that is, it can be reused, moved, modified in any way +you wish (but when you trash the memory block, you need to C +it again). + +=back + +=head2 WATCHER PRIORITY MODELS + +Many event loops support I, which are usually small +integers that influence the ordering of event callback invocation +between watchers in some way, all else being equal. + +In libev, watcher priorities can be set using C. See its +description for the more technical details such as the actual priority +range. + +There are two common ways how these these priorities are being interpreted +by event loops: + +In the more common lock-out model, higher priorities "lock out" invocation +of lower priority watchers, which means as long as higher priority +watchers receive events, lower priority watchers are not being invoked. + +The less common only-for-ordering model uses priorities solely to order +callback invocation within a single event loop iteration: Higher priority +watchers are invoked before lower priority ones, but they all get invoked +before polling for new events. + +Libev uses the second (only-for-ordering) model for all its watchers +except for idle watchers (which use the lock-out model). + +The rationale behind this is that implementing the lock-out model for +watchers is not well supported by most kernel interfaces, and most event +libraries will just poll for the same events again and again as long as +their callbacks have not been executed, which is very inefficient in the +common case of one high-priority watcher locking out a mass of lower +priority ones. + +Static (ordering) priorities are most useful when you have two or more +watchers handling the same resource: a typical usage example is having an +C watcher to receive data, and an associated C to handle +timeouts. Under load, data might be received while the program handles +other jobs, but since timers normally get invoked first, the timeout +handler will be executed before checking for data. In that case, giving +the timer a lower priority than the I/O watcher ensures that I/O will be +handled first even under adverse conditions (which is usually, but not +always, what you want). + +Since idle watchers use the "lock-out" model, meaning that idle watchers +will only be executed when no same or higher priority watchers have +received events, they can be used to implement the "lock-out" model when +required. + +For example, to emulate how many other event libraries handle priorities, +you can associate an C watcher to each such watcher, and in +the normal watcher callback, you just start the idle watcher. The real +processing is done in the idle watcher callback. This causes libev to +continuously poll and process kernel event data for the watcher, but when +the lock-out case is known to be rare (which in turn is rare :), this is +workable. + +Usually, however, the lock-out model implemented that way will perform +miserably under the type of load it was designed to handle. In that case, +it might be preferable to stop the real watcher before starting the +idle watcher, so the kernel will not have to process the event in case +the actual processing will be delayed for considerable time. + +Here is an example of an I/O watcher that should run at a strictly lower +priority than the default, and which should only process data when no +other events are pending: + + ev_idle idle; // actual processing watcher + ev_io io; // actual event watcher + + static void + io_cb (EV_P_ ev_io *w, int revents) + { + // stop the I/O watcher, we received the event, but + // are not yet ready to handle it. + ev_io_stop (EV_A_ w); + + // start the idle watcher to handle the actual event. + // it will not be executed as long as other watchers + // with the default priority are receiving events. + ev_idle_start (EV_A_ &idle); + } + + static void + idle_cb (EV_P_ ev_idle *w, int revents) + { + // actual processing + read (STDIN_FILENO, ...); + + // have to start the I/O watcher again, as + // we have handled the event + ev_io_start (EV_P_ &io); + } + + // initialisation + ev_idle_init (&idle, idle_cb); + ev_io_init (&io, io_cb, STDIN_FILENO, EV_READ); + ev_io_start (EV_DEFAULT_ &io); + +In the "real" world, it might also be beneficial to start a timer, so that +low-priority connections can not be locked out forever under load. This +enables your program to keep a lower latency for important connections +during short periods of high load, while not completely locking out less +important ones. + + +=head1 WATCHER TYPES + +This section describes each watcher in detail, but will not repeat +information given in the last section. Any initialisation/set macros, +functions and members specific to the watcher type are explained. + +Most members are additionally marked with either I<[read-only]>, meaning +that, while the watcher is active, you can look at the member and expect +some sensible content, but you must not modify it (you can modify it while +the watcher is stopped to your hearts content), or I<[read-write]>, which +means you can expect it to have some sensible content while the watcher is +active, but you can also modify it (within the same thread as the event +loop, i.e. without creating data races). Modifying it may not do something +sensible or take immediate effect (or do anything at all), but libev will +not crash or malfunction in any way. + +In any case, the documentation for each member will explain what the +effects are, and if there are any additional access restrictions. + +=head2 C - is this file descriptor readable or writable? + +I/O watchers check whether a file descriptor is readable or writable +in each iteration of the event loop, or, more precisely, when reading +would not block the process and writing would at least be able to write +some data. This behaviour is called level-triggering because you keep +receiving events as long as the condition persists. Remember you can stop +the watcher if you don't want to act on the event and neither want to +receive future events. + +In general you can register as many read and/or write event watchers per +fd as you want (as long as you don't confuse yourself). Setting all file +descriptors to non-blocking mode is also usually a good idea (but not +required if you know what you are doing). + +Another thing you have to watch out for is that it is quite easy to +receive "spurious" readiness notifications, that is, your callback might +be called with C but a subsequent C(2) will actually block +because there is no data. It is very easy to get into this situation even +with a relatively standard program structure. Thus it is best to always +use non-blocking I/O: An extra C(2) returning C is far +preferable to a program hanging until some data arrives. + +If you cannot run the fd in non-blocking mode (for example you should +not play around with an Xlib connection), then you have to separately +re-test whether a file descriptor is really ready with a known-to-be good +interface such as poll (fortunately in the case of Xlib, it already does +this on its own, so its quite safe to use). Some people additionally +use C and an interval timer, just to be sure you won't block +indefinitely. + +But really, best use non-blocking mode. + +=head3 The special problem of disappearing file descriptors + +Some backends (e.g. kqueue, epoll, linuxaio) need to be told about closing +a file descriptor (either due to calling C explicitly or any other +means, such as C). The reason is that you register interest in some +file descriptor, but when it goes away, the operating system will silently +drop this interest. If another file descriptor with the same number then +is registered with libev, there is no efficient way to see that this is, +in fact, a different file descriptor. + +To avoid having to explicitly tell libev about such cases, libev follows +the following policy: Each time C is being called, libev +will assume that this is potentially a new file descriptor, otherwise +it is assumed that the file descriptor stays the same. That means that +you I to call C (or C) when you change the +descriptor even if the file descriptor number itself did not change. + +This is how one would do it normally anyway, the important point is that +the libev application should not optimise around libev but should leave +optimisations to libev. + +=head3 The special problem of dup'ed file descriptors + +Some backends (e.g. epoll), cannot register events for file descriptors, +but only events for the underlying file descriptions. That means when you +have C'ed file descriptors or weirder constellations, and register +events for them, only one file descriptor might actually receive events. + +There is no workaround possible except not registering events +for potentially C'ed file descriptors, or to resort to +C or C. + +=head3 The special problem of files + +Many people try to use C. + +=item EV_USE_EVENTFD + +If defined to be C<1>, then libev will assume that C is +available and will probe for kernel support at runtime. This will improve +C and C performance and reduce resource consumption. +If undefined, it will be enabled if the headers indicate GNU/Linux + Glibc +2.7 or newer, otherwise disabled. + +=item EV_USE_SIGNALFD + +If defined to be C<1>, then libev will assume that C is +available and will probe for kernel support at runtime. This enables +the use of EVFLAG_SIGNALFD for faster and simpler signal handling. If +undefined, it will be enabled if the headers indicate GNU/Linux + Glibc +2.7 or newer, otherwise disabled. + +=item EV_USE_TIMERFD + +If defined to be C<1>, then libev will assume that C is +available and will probe for kernel support at runtime. This allows +libev to detect time jumps accurately. If undefined, it will be enabled +if the headers indicate GNU/Linux + Glibc 2.8 or newer and define +C, otherwise disabled. + +=item EV_USE_EVENTFD + +If defined to be C<1>, then libev will assume that C is +available and will probe for kernel support at runtime. This will improve +C and C performance and reduce resource consumption. +If undefined, it will be enabled if the headers indicate GNU/Linux + Glibc +2.7 or newer, otherwise disabled. + +=item EV_USE_SELECT + +If undefined or defined to be C<1>, libev will compile in support for the +C is buggy + +All that's left is C actively limits the number of file +descriptors you can pass in to 1024 - your program suddenly crashes when +you use more. + +There is an undocumented "workaround" for this - defining +C<_DARWIN_UNLIMITED_SELECT>, which libev tries to use, so select I +work on OS/X. + +=head2 SOLARIS PROBLEMS AND WORKAROUNDS + +=head3 C reentrancy + +The default compile environment on Solaris is unfortunately so +thread-unsafe that you can't even use components/libraries compiled +without C<-D_REENTRANT> in a threaded program, which, of course, isn't +defined by default. A valid, if stupid, implementation choice. + +If you want to use libev in threaded environments you have to make sure +it's compiled with C<_REENTRANT> defined. + +=head3 Event port backend + +The scalable event interface for Solaris is called "event +ports". Unfortunately, this mechanism is very buggy in all major +releases. If you run into high CPU usage, your program freezes or you get +a large number of spurious wakeups, make sure you have all the relevant +and latest kernel patches applied. No, I don't know which ones, but there +are multiple ones to apply, and afterwards, event ports actually work +great. + +If you can't get it to work, you can try running the program by setting +the environment variable C to only allow C and +C works fine +with large bitsets on AIX, and AIX is dead anyway. + +=head2 WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS + +=head3 General issues + +Win32 doesn't support any of the standards (e.g. POSIX) that libev +requires, and its I/O model is fundamentally incompatible with the POSIX +model. Libev still offers limited functionality on this platform in +the form of the C backend, and only supports socket +descriptors. This only applies when using Win32 natively, not when using +e.g. cygwin. Actually, it only applies to the microsofts own compilers, +as every compiler comes with a slightly differently broken/incompatible +environment. + +Lifting these limitations would basically require the full +re-implementation of the I/O system. If you are into this kind of thing, +then note that glib does exactly that for you in a very portable way (note +also that glib is the slowest event library known to man). + +There is no supported compilation method available on windows except +embedding it into other applications. + +Sensible signal handling is officially unsupported by Microsoft - libev +tries its best, but under most conditions, signals will simply not work. + +Not a libev limitation but worth mentioning: windows apparently doesn't +accept large writes: instead of resulting in a partial write, windows will +either accept everything or return C if the buffer is too large, +so make sure you only write small amounts into your sockets (less than a +megabyte seems safe, but this apparently depends on the amount of memory +available). + +Due to the many, low, and arbitrary limits on the win32 platform and +the abysmal performance of winsockets, using a large number of sockets +is not recommended (and not reasonable). If your program needs to use +more than a hundred or so sockets, then likely it needs to use a totally +different implementation for windows, as libev offers the POSIX readiness +notification model, which cannot be implemented efficiently on windows +(due to Microsoft monopoly games). + +A typical way to use libev under windows is to embed it (see the embedding +section for details) and use the following F header file instead +of F: + + #define EV_STANDALONE /* keeps ev from requiring config.h */ + #define EV_SELECT_IS_WINSOCKET 1 /* configure libev for windows select */ + + #include "ev.h" + +And compile the following F file into your project (make sure +you do I compile the F or any other embedded source files!): + + #include "evwrap.h" + #include "ev.c" + +=head3 The winsocket C function doesn't follow POSIX in that it +requires socket I and not socket I (it is +also extremely buggy). This makes select very inefficient, and also +requires a mapping from file descriptors to socket handles (the Microsoft +C runtime provides the function C<_open_osfhandle> for this). See the +discussion of the C, C and +C preprocessor symbols for more info. + +The configuration for a "naked" win32 using the Microsoft runtime +libraries and raw winsocket select is: + + #define EV_USE_SELECT 1 + #define EV_SELECT_IS_WINSOCKET 1 /* forces EV_SELECT_USE_FD_SET, too */ + +Note that winsockets handling of fd sets is O(n), so you can easily get a +complexity in the O(n²) range when using win32. + +=head3 Limited number of file descriptors + +Windows has numerous arbitrary (and low) limits on things. + +Early versions of winsocket's select only supported waiting for a maximum +of C<64> handles (probably owning to the fact that all windows kernels +can only wait for C<64> things at the same time internally; Microsoft +recommends spawning a chain of threads and wait for 63 handles and the +previous thread in each. Sounds great!). + +Newer versions support more handles, but you need to define C +to some high number (e.g. C<2048>) before compiling the winsocket select +call (which might be in libev or elsewhere, for example, perl and many +other interpreters do their own select emulation on windows). + +Another limit is the number of file descriptors in the Microsoft runtime +libraries, which by default is C<64> (there must be a hidden I<64> +fetish or something like this inside Microsoft). You can increase this +by calling C<_setmaxstdio>, which can increase this limit to C<2048> +(another arbitrary limit), but is broken in many versions of the Microsoft +runtime libraries. This might get you to about C<512> or C<2048> sockets +(depending on windows version and/or the phase of the moon). To get more, +you need to wrap all I/O functions and provide your own fd management, but +the cost of calling select (O(n²)) will likely make this unworkable. + +=head2 PORTABILITY REQUIREMENTS + +In addition to a working ISO-C implementation and of course the +backend-specific APIs, libev relies on a few additional extensions: + +=over 4 + +=item C must have compatible +calling conventions regardless of C. + +Libev assumes not only that all watcher pointers have the same internal +structure (guaranteed by POSIX but not by ISO C for example), but it also +assumes that the same (machine) code can be used to call any watcher +callback: The watcher callbacks have different type signatures, but libev +calls them using an C internally. + +=item null pointers and integer zero are represented by 0 bytes + +Libev uses C to initialise structs and arrays to C<0> bytes, and +relies on this setting pointers and integers to null. + +=item pointer accesses must be thread-atomic + +Accessing a pointer value must be atomic, it must both be readable and +writable in one piece - this is the case on all current architectures. + +=item C must be thread-atomic as well + +The type C (or whatever is defined as +C) must be atomic with respect to accesses from different +threads. This is not part of the specification for C, but is +believed to be sufficiently portable. + +=item C must work in a threaded environment + +Libev uses C to temporarily block signals. This is not +allowed in a threaded program (C has to be used). Typical +pthread implementations will either allow C in the "main +thread" or will block signals process-wide, both behaviours would +be compatible with libev. Interaction between C and +C could complicate things, however. + +The most portable way to handle signals is to block signals in all threads +except the initial one, and run the signal handling loop in the initial +thread as well. + +=item C must be large enough for common memory allocation sizes + +To improve portability and simplify its API, libev uses C internally +instead of C when allocating its data structures. On non-POSIX +systems (Microsoft...) this might be unexpectedly low, but is still at +least 31 bits everywhere, which is enough for hundreds of millions of +watchers. + +=item C must hold a time value in seconds with enough accuracy + +The type C is used to represent timestamps. It is required to +have at least 51 bits of mantissa (and 9 bits of exponent), which is +good enough for at least into the year 4000 with millisecond accuracy +(the design goal for libev). This requirement is overfulfilled by +implementations using IEEE 754, which is basically all existing ones. + +With IEEE 754 doubles, you get microsecond accuracy until at least the +year 2255 (and millisecond accuracy till the year 287396 - by then, libev +is either obsolete or somebody patched it to use C or +something like that, just kidding). + +=back + +If you know of other additional requirements drop me a note. + + +=head1 ALGORITHMIC COMPLEXITIES + +In this section the complexities of (many of) the algorithms used inside +libev will be documented. For complexity discussions about backends see +the documentation for C. + +All of the following are about amortised time: If an array needs to be +extended, libev needs to realloc and move the whole array, but this +happens asymptotically rarer with higher number of elements, so O(1) might +mean that libev does a lengthy realloc operation in rare cases, but on +average it is much faster and asymptotically approaches constant time. + +=over 4 + +=item Starting and stopping timer/periodic watchers: O(log skipped_other_timers) + +This means that, when you have a watcher that triggers in one hour and +there are 100 watchers that would trigger before that, then inserting will +have to skip roughly seven (C) of these watchers. + +=item Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers) + +That means that changing a timer costs less than removing/adding them, +as only the relative motion in the event queue has to be paid for. + +=item Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1) + +These just add the watcher into an array or at the head of a list. + +=item Stopping check/prepare/idle/fork/async watchers: O(1) + +=item Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE)) + +These watchers are stored in lists, so they need to be walked to find the +correct watcher to remove. The lists are usually short (you don't usually +have many watchers waiting for the same fd or signal: one is typical, two +is rare). + +=item Finding the next timer in each loop iteration: O(1) + +By virtue of using a binary or 4-heap, the next timer is always found at a +fixed position in the storage array. + +=item Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd) + +A change means an I/O watcher gets started or stopped, which requires +libev to recalculate its status (and possibly tell the kernel, depending +on backend and whether C was used). + +=item Activating one watcher (putting it into the pending state): O(1) + +=item Priority handling: O(number_of_priorities) + +Priorities are implemented by allocating some space for each +priority. When doing priority-based operations, libev usually has to +linearly search all the priorities, but starting/stopping and activating +watchers becomes O(1) with respect to priority handling. + +=item Sending an ev_async: O(1) + +=item Processing ev_async_send: O(number_of_async_watchers) + +=item Processing signals: O(max_signal_number) + +Sending involves a system call I there were no other C +calls in the current loop iteration and the loop is currently +blocked. Checking for async and signal events involves iterating over all +running async watchers or all signal numbers. + +=back + + +=head1 PORTING FROM LIBEV 3.X TO 4.X + +The major version 4 introduced some incompatible changes to the API. + +At the moment, the C header file provides compatibility definitions +for all changes, so most programs should still compile. The compatibility +layer might be removed in later versions of libev, so better update to the +new API early than late. + +=over 4 + +=item C backwards compatibility mechanism + +The backward compatibility mechanism can be controlled by +C. See L in the L +section. + +=item C and C have been removed + +These calls can be replaced easily by their C counterparts: + + ev_loop_destroy (EV_DEFAULT_UC); + ev_loop_fork (EV_DEFAULT); + +=item function/symbol renames + +A number of functions and symbols have been renamed: + + ev_loop => ev_run + EVLOOP_NONBLOCK => EVRUN_NOWAIT + EVLOOP_ONESHOT => EVRUN_ONCE + + ev_unloop => ev_break + EVUNLOOP_CANCEL => EVBREAK_CANCEL + EVUNLOOP_ONE => EVBREAK_ONE + EVUNLOOP_ALL => EVBREAK_ALL + + EV_TIMEOUT => EV_TIMER + + ev_loop_count => ev_iteration + ev_loop_depth => ev_depth + ev_loop_verify => ev_verify + +Most functions working on C objects don't have an +C prefix, so it was removed; C, C and +associated constants have been renamed to not collide with the C anymore and C now follows the same naming scheme +as all other watcher types. Note that C is still called +C because it would otherwise clash with the C +typedef. + +=item C mechanism replaced by C + +The preprocessor symbol C has been replaced by a different +mechanism, C. Programs using C usually compile +and work, but the library code will of course be larger. + +=back + + +=head1 GLOSSARY + +=over 4 + +=item active + +A watcher is active as long as it has been started and not yet stopped. +See L for details. + +=item application + +In this document, an application is whatever is using libev. + +=item backend + +The part of the code dealing with the operating system interfaces. + +=item callback + +The address of a function that is called when some event has been +detected. Callbacks are being passed the event loop, the watcher that +received the event, and the actual event bitset. + +=item callback/watcher invocation + +The act of calling the callback associated with a watcher. + +=item event + +A change of state of some external event, such as data now being available +for reading on a file descriptor, time having passed or simply not having +any other events happening anymore. + +In libev, events are represented as single bits (such as C or +C). + +=item event library + +A software package implementing an event model and loop. + +=item event loop + +An entity that handles and processes external events and converts them +into callback invocations. + +=item event model + +The model used to describe how an event loop handles and processes +watchers and events. + +=item pending + +A watcher is pending as soon as the corresponding event has been +detected. See L for details. + +=item real time + +The physical time that is observed. It is apparently strictly monotonic :) + +=item wall-clock time + +The time and date as shown on clocks. Unlike real time, it can actually +be wrong and jump forwards and backwards, e.g. when you adjust your +clock. + +=item watcher + +A data structure that describes interest in certain events. Watchers need +to be started (attached to an event loop) before they can receive events. + +=back + +=head1 AUTHOR + +Marc Lehmann , with repeated corrections by Mikael +Magnusson and Emanuele Giaquinta, and minor corrections by many others. + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev_epoll.c b/deps/ngtcp2/ngtcp2/third-party/libev/ev_epoll.c new file mode 100644 index 000000000000..58cfa684d513 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev_epoll.c @@ -0,0 +1,298 @@ +/* + * libev epoll fd activity backend + * + * Copyright (c) 2007,2008,2009,2010,2011,2016,2017,2019 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +/* + * general notes about epoll: + * + * a) epoll silently removes fds from the fd set. as nothing tells us + * that an fd has been removed otherwise, we have to continually + * "rearm" fds that we suspect *might* have changed (same + * problem with kqueue, but much less costly there). + * b) the fact that ADD != MOD creates a lot of extra syscalls due to a) + * and seems not to have any advantage. + * c) the inability to handle fork or file descriptors (think dup) + * limits the applicability over poll, so this is not a generic + * poll replacement. + * d) epoll doesn't work the same as select with many file descriptors + * (such as files). while not critical, no other advanced interface + * seems to share this (rather non-unixy) limitation. + * e) epoll claims to be embeddable, but in practise you never get + * a ready event for the epoll fd (broken: <=2.6.26, working: >=2.6.32). + * f) epoll_ctl returning EPERM means the fd is always ready. + * + * lots of "weird code" and complication handling in this file is due + * to these design problems with epoll, as we try very hard to avoid + * epoll_ctl syscalls for common usage patterns and handle the breakage + * ensuing from receiving events for closed and otherwise long gone + * file descriptors. + */ + +#include + +#define EV_EMASK_EPERM 0x80 + +static void +epoll_modify (EV_P_ int fd, int oev, int nev) +{ + struct epoll_event ev; + unsigned char oldmask; + + /* + * we handle EPOLL_CTL_DEL by ignoring it here + * on the assumption that the fd is gone anyways + * if that is wrong, we have to handle the spurious + * event in epoll_poll. + * if the fd is added again, we try to ADD it, and, if that + * fails, we assume it still has the same eventmask. + */ + if (!nev) + return; + + oldmask = anfds [fd].emask; + anfds [fd].emask = nev; + + /* store the generation counter in the upper 32 bits, the fd in the lower 32 bits */ + ev.data.u64 = (uint64_t)(uint32_t)fd + | ((uint64_t)(uint32_t)++anfds [fd].egen << 32); + ev.events = (nev & EV_READ ? EPOLLIN : 0) + | (nev & EV_WRITE ? EPOLLOUT : 0); + + if (ecb_expect_true (!epoll_ctl (backend_fd, oev && oldmask != nev ? EPOLL_CTL_MOD : EPOLL_CTL_ADD, fd, &ev))) + return; + + if (ecb_expect_true (errno == ENOENT)) + { + /* if ENOENT then the fd went away, so try to do the right thing */ + if (!nev) + goto dec_egen; + + if (!epoll_ctl (backend_fd, EPOLL_CTL_ADD, fd, &ev)) + return; + } + else if (ecb_expect_true (errno == EEXIST)) + { + /* EEXIST means we ignored a previous DEL, but the fd is still active */ + /* if the kernel mask is the same as the new mask, we assume it hasn't changed */ + if (oldmask == nev) + goto dec_egen; + + if (!epoll_ctl (backend_fd, EPOLL_CTL_MOD, fd, &ev)) + return; + } + else if (ecb_expect_true (errno == EPERM)) + { + /* EPERM means the fd is always ready, but epoll is too snobbish */ + /* to handle it, unlike select or poll. */ + anfds [fd].emask = EV_EMASK_EPERM; + + /* add fd to epoll_eperms, if not already inside */ + if (!(oldmask & EV_EMASK_EPERM)) + { + array_needsize (int, epoll_eperms, epoll_epermmax, epoll_epermcnt + 1, array_needsize_noinit); + epoll_eperms [epoll_epermcnt++] = fd; + } + + return; + } + else + assert (("libev: I/O watcher with invalid fd found in epoll_ctl", errno != EBADF && errno != ELOOP && errno != EINVAL)); + + fd_kill (EV_A_ fd); + +dec_egen: + /* we didn't successfully call epoll_ctl, so decrement the generation counter again */ + --anfds [fd].egen; +} + +static void +epoll_poll (EV_P_ ev_tstamp timeout) +{ + int i; + int eventcnt; + + if (ecb_expect_false (epoll_epermcnt)) + timeout = EV_TS_CONST (0.); + + /* epoll wait times cannot be larger than (LONG_MAX - 999UL) / HZ msecs, which is below */ + /* the default libev max wait time, however. */ + EV_RELEASE_CB; + eventcnt = epoll_wait (backend_fd, epoll_events, epoll_eventmax, EV_TS_TO_MSEC (timeout)); + EV_ACQUIRE_CB; + + if (ecb_expect_false (eventcnt < 0)) + { + if (errno != EINTR) + ev_syserr ("(libev) epoll_wait"); + + return; + } + + for (i = 0; i < eventcnt; ++i) + { + struct epoll_event *ev = epoll_events + i; + + int fd = (uint32_t)ev->data.u64; /* mask out the lower 32 bits */ + int want = anfds [fd].events; + int got = (ev->events & (EPOLLOUT | EPOLLERR | EPOLLHUP) ? EV_WRITE : 0) + | (ev->events & (EPOLLIN | EPOLLERR | EPOLLHUP) ? EV_READ : 0); + + /* + * check for spurious notification. + * this only finds spurious notifications on egen updates + * other spurious notifications will be found by epoll_ctl, below + * we assume that fd is always in range, as we never shrink the anfds array + */ + if (ecb_expect_false ((uint32_t)anfds [fd].egen != (uint32_t)(ev->data.u64 >> 32))) + { + /* recreate kernel state */ + postfork |= 2; + continue; + } + + if (ecb_expect_false (got & ~want)) + { + anfds [fd].emask = want; + + /* + * we received an event but are not interested in it, try mod or del + * this often happens because we optimistically do not unregister fds + * when we are no longer interested in them, but also when we get spurious + * notifications for fds from another process. this is partially handled + * above with the gencounter check (== our fd is not the event fd), and + * partially here, when epoll_ctl returns an error (== a child has the fd + * but we closed it). + * note: for events such as POLLHUP, where we can't know whether it refers + * to EV_READ or EV_WRITE, we might issue redundant EPOLL_CTL_MOD calls. + */ + ev->events = (want & EV_READ ? EPOLLIN : 0) + | (want & EV_WRITE ? EPOLLOUT : 0); + + /* pre-2.6.9 kernels require a non-null pointer with EPOLL_CTL_DEL, */ + /* which is fortunately easy to do for us. */ + if (epoll_ctl (backend_fd, want ? EPOLL_CTL_MOD : EPOLL_CTL_DEL, fd, ev)) + { + postfork |= 2; /* an error occurred, recreate kernel state */ + continue; + } + } + + fd_event (EV_A_ fd, got); + } + + /* if the receive array was full, increase its size */ + if (ecb_expect_false (eventcnt == epoll_eventmax)) + { + ev_free (epoll_events); + epoll_eventmax = array_nextsize (sizeof (struct epoll_event), epoll_eventmax, epoll_eventmax + 1); + epoll_events = (struct epoll_event *)ev_malloc (sizeof (struct epoll_event) * epoll_eventmax); + } + + /* now synthesize events for all fds where epoll fails, while select works... */ + for (i = epoll_epermcnt; i--; ) + { + int fd = epoll_eperms [i]; + unsigned char events = anfds [fd].events & (EV_READ | EV_WRITE); + + if (anfds [fd].emask & EV_EMASK_EPERM && events) + fd_event (EV_A_ fd, events); + else + { + epoll_eperms [i] = epoll_eperms [--epoll_epermcnt]; + anfds [fd].emask = 0; + } + } +} + +static int +epoll_epoll_create (void) +{ + int fd; + +#if defined EPOLL_CLOEXEC && !defined __ANDROID__ + fd = epoll_create1 (EPOLL_CLOEXEC); + + if (fd < 0 && (errno == EINVAL || errno == ENOSYS)) +#endif + { + fd = epoll_create (256); + + if (fd >= 0) + fcntl (fd, F_SETFD, FD_CLOEXEC); + } + + return fd; +} + +inline_size +int +epoll_init (EV_P_ int flags) +{ + if ((backend_fd = epoll_epoll_create ()) < 0) + return 0; + + backend_mintime = EV_TS_CONST (1e-3); /* epoll does sometimes return early, this is just to avoid the worst */ + backend_modify = epoll_modify; + backend_poll = epoll_poll; + + epoll_eventmax = 64; /* initial number of events receivable per poll */ + epoll_events = (struct epoll_event *)ev_malloc (sizeof (struct epoll_event) * epoll_eventmax); + + return EVBACKEND_EPOLL; +} + +inline_size +void +epoll_destroy (EV_P) +{ + ev_free (epoll_events); + array_free (epoll_eperm, EMPTY); +} + +ecb_cold +static void +epoll_fork (EV_P) +{ + close (backend_fd); + + while ((backend_fd = epoll_epoll_create ()) < 0) + ev_syserr ("(libev) epoll_create"); + + fd_rearm_all (EV_A); +} + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev_iouring.c b/deps/ngtcp2/ngtcp2/third-party/libev/ev_iouring.c new file mode 100644 index 000000000000..bfd3de65f14e --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev_iouring.c @@ -0,0 +1,694 @@ +/* + * libev linux io_uring fd activity backend + * + * Copyright (c) 2019-2020 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +/* + * general notes about linux io_uring: + * + * a) it's the best interface I have seen so far. on linux. + * b) best is not necessarily very good. + * c) it's better than the aio mess, doesn't suffer from the fork problems + * of linux aio or epoll and so on and so on. and you could do event stuff + * without any syscalls. what's not to like? + * d) ok, it's vastly more complex, but that's ok, really. + * e) why two mmaps instead of one? one would be more space-efficient, + * and I can't see what benefit two would have (other than being + * somehow resizable/relocatable, but that's apparently not possible). + * f) hmm, it's practically undebuggable (gdb can't access the memory, and + * the bizarre way structure offsets are communicated makes it hard to + * just print the ring buffer heads, even *iff* the memory were visible + * in gdb. but then, that's also ok, really. + * g) well, you cannot specify a timeout when waiting for events. no, + * seriously, the interface doesn't support a timeout. never seen _that_ + * before. sure, you can use a timerfd, but that's another syscall + * you could have avoided. overall, this bizarre omission smells + * like a µ-optimisation by the io_uring author for his personal + * applications, to the detriment of everybody else who just wants + * an event loop. but, umm, ok, if that's all, it could be worse. + * (from what I gather from the author Jens Axboe, it simply didn't + * occur to him, and he made good on it by adding an unlimited nuber + * of timeouts later :). + * h) initially there was a hardcoded limit of 4096 outstanding events. + * later versions not only bump this to 32k, but also can handle + * an unlimited amount of events, so this only affects the batch size. + * i) unlike linux aio, you *can* register more then the limit + * of fd events. while early verisons of io_uring signalled an overflow + * and you ended up getting wet. 5.5+ does not do this anymore. + * j) but, oh my! it had exactly the same bugs as the linux aio backend, + * where some undocumented poll combinations just fail. fortunately, + * after finally reaching the author, he was more than willing to fix + * this probably in 5.6+. + * k) overall, the *API* itself is, I dare to say, not a total trainwreck. + * once the bugs ae fixed (probably in 5.6+), it will be without + * competition. + */ + +/* TODO: use internal TIMEOUT */ +/* TODO: take advantage of single mmap, NODROP etc. */ +/* TODO: resize cq/sq size independently */ + +#include +#include +#include +#include + +#define IOURING_INIT_ENTRIES 32 + +/*****************************************************************************/ +/* syscall wrapdadoop - this section has the raw api/abi definitions */ + +#include +#include + +/* mostly directly taken from the kernel or documentation */ + +struct io_uring_sqe +{ + __u8 opcode; + __u8 flags; + __u16 ioprio; + __s32 fd; + union { + __u64 off; + __u64 addr2; + }; + __u64 addr; + __u32 len; + union { + __kernel_rwf_t rw_flags; + __u32 fsync_flags; + __u16 poll_events; + __u32 sync_range_flags; + __u32 msg_flags; + __u32 timeout_flags; + __u32 accept_flags; + __u32 cancel_flags; + __u32 open_flags; + __u32 statx_flags; + }; + __u64 user_data; + union { + __u16 buf_index; + __u64 __pad2[3]; + }; +}; + +struct io_uring_cqe +{ + __u64 user_data; + __s32 res; + __u32 flags; +}; + +struct io_sqring_offsets +{ + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 flags; + __u32 dropped; + __u32 array; + __u32 resv1; + __u64 resv2; +}; + +struct io_cqring_offsets +{ + __u32 head; + __u32 tail; + __u32 ring_mask; + __u32 ring_entries; + __u32 overflow; + __u32 cqes; + __u64 resv[2]; +}; + +struct io_uring_params +{ + __u32 sq_entries; + __u32 cq_entries; + __u32 flags; + __u32 sq_thread_cpu; + __u32 sq_thread_idle; + __u32 features; + __u32 resv[4]; + struct io_sqring_offsets sq_off; + struct io_cqring_offsets cq_off; +}; + +#define IORING_SETUP_CQSIZE 0x00000008 + +#define IORING_OP_POLL_ADD 6 +#define IORING_OP_POLL_REMOVE 7 +#define IORING_OP_TIMEOUT 11 +#define IORING_OP_TIMEOUT_REMOVE 12 + +/* relative or absolute, reference clock is CLOCK_MONOTONIC */ +struct iouring_kernel_timespec +{ + int64_t tv_sec; + long long tv_nsec; +}; + +#define IORING_TIMEOUT_ABS 0x00000001 + +#define IORING_ENTER_GETEVENTS 0x01 + +#define IORING_OFF_SQ_RING 0x00000000ULL +#define IORING_OFF_CQ_RING 0x08000000ULL +#define IORING_OFF_SQES 0x10000000ULL + +#define IORING_FEAT_SINGLE_MMAP 0x00000001 +#define IORING_FEAT_NODROP 0x00000002 +#define IORING_FEAT_SUBMIT_STABLE 0x00000004 + +inline_size +int +evsys_io_uring_setup (unsigned entries, struct io_uring_params *params) +{ + return ev_syscall2 (SYS_io_uring_setup, entries, params); +} + +inline_size +int +evsys_io_uring_enter (int fd, unsigned to_submit, unsigned min_complete, unsigned flags, const sigset_t *sig, size_t sigsz) +{ + return ev_syscall6 (SYS_io_uring_enter, fd, to_submit, min_complete, flags, sig, sigsz); +} + +/*****************************************************************************/ +/* actual backed implementation */ + +/* we hope that volatile will make the compiler access this variables only once */ +#define EV_SQ_VAR(name) *(volatile unsigned *)((char *)iouring_sq_ring + iouring_sq_ ## name) +#define EV_CQ_VAR(name) *(volatile unsigned *)((char *)iouring_cq_ring + iouring_cq_ ## name) + +/* the index array */ +#define EV_SQ_ARRAY ((unsigned *)((char *)iouring_sq_ring + iouring_sq_array)) + +/* the submit/completion queue entries */ +#define EV_SQES ((struct io_uring_sqe *) iouring_sqes) +#define EV_CQES ((struct io_uring_cqe *)((char *)iouring_cq_ring + iouring_cq_cqes)) + +inline_speed +int +iouring_enter (EV_P_ ev_tstamp timeout) +{ + int res; + + EV_RELEASE_CB; + + res = evsys_io_uring_enter (iouring_fd, iouring_to_submit, 1, + timeout > EV_TS_CONST (0.) ? IORING_ENTER_GETEVENTS : 0, 0, 0); + + assert (("libev: io_uring_enter did not consume all sqes", (res < 0 || res == iouring_to_submit))); + + iouring_to_submit = 0; + + EV_ACQUIRE_CB; + + return res; +} + +/* TODO: can we move things around so we don't need this forward-reference? */ +static void +iouring_poll (EV_P_ ev_tstamp timeout); + +static +struct io_uring_sqe * +iouring_sqe_get (EV_P) +{ + unsigned tail; + + for (;;) + { + tail = EV_SQ_VAR (tail); + + if (ecb_expect_true (tail + 1 - EV_SQ_VAR (head) <= EV_SQ_VAR (ring_entries))) + break; /* whats the problem, we have free sqes */ + + /* queue full, need to flush and possibly handle some events */ + +#if EV_FEATURE_CODE + /* first we ask the kernel nicely, most often this frees up some sqes */ + int res = iouring_enter (EV_A_ EV_TS_CONST (0.)); + + ECB_MEMORY_FENCE_ACQUIRE; /* better safe than sorry */ + + if (res >= 0) + continue; /* yes, it worked, try again */ +#endif + + /* some problem, possibly EBUSY - do the full poll and let it handle any issues */ + + iouring_poll (EV_A_ EV_TS_CONST (0.)); + /* iouring_poll should have done ECB_MEMORY_FENCE_ACQUIRE for us */ + } + + /*assert (("libev: io_uring queue full after flush", tail + 1 - EV_SQ_VAR (head) <= EV_SQ_VAR (ring_entries)));*/ + + return EV_SQES + (tail & EV_SQ_VAR (ring_mask)); +} + +inline_size +struct io_uring_sqe * +iouring_sqe_submit (EV_P_ struct io_uring_sqe *sqe) +{ + unsigned idx = sqe - EV_SQES; + + EV_SQ_ARRAY [idx] = idx; + ECB_MEMORY_FENCE_RELEASE; + ++EV_SQ_VAR (tail); + /*ECB_MEMORY_FENCE_RELEASE; /* for the time being we assume this is not needed */ + ++iouring_to_submit; +} + +/*****************************************************************************/ + +/* when the timerfd expires we simply note the fact, + * as the purpose of the timerfd is to wake us up, nothing else. + * the next iteration should re-set it. + */ +static void +iouring_tfd_cb (EV_P_ struct ev_io *w, int revents) +{ + iouring_tfd_to = EV_TSTAMP_HUGE; +} + +/* called for full and partial cleanup */ +ecb_cold +static int +iouring_internal_destroy (EV_P) +{ + close (iouring_tfd); + close (iouring_fd); + + if (iouring_sq_ring != MAP_FAILED) munmap (iouring_sq_ring, iouring_sq_ring_size); + if (iouring_cq_ring != MAP_FAILED) munmap (iouring_cq_ring, iouring_cq_ring_size); + if (iouring_sqes != MAP_FAILED) munmap (iouring_sqes , iouring_sqes_size ); + + if (ev_is_active (&iouring_tfd_w)) + { + ev_ref (EV_A); + ev_io_stop (EV_A_ &iouring_tfd_w); + } +} + +ecb_cold +static int +iouring_internal_init (EV_P) +{ + struct io_uring_params params = { 0 }; + + iouring_to_submit = 0; + + iouring_tfd = -1; + iouring_sq_ring = MAP_FAILED; + iouring_cq_ring = MAP_FAILED; + iouring_sqes = MAP_FAILED; + + if (!have_monotonic) /* cannot really happen, but what if11 */ + return -1; + + for (;;) + { + iouring_fd = evsys_io_uring_setup (iouring_entries, ¶ms); + + if (iouring_fd >= 0) + break; /* yippie */ + + if (errno != EINVAL) + return -1; /* we failed */ + +#if TODO + if ((~params.features) & (IORING_FEAT_NODROP | IORING_FEATURE_SINGLE_MMAP | IORING_FEAT_SUBMIT_STABLE)) + return -1; /* we require the above features */ +#endif + + /* EINVAL: lots of possible reasons, but maybe + * it is because we hit the unqueryable hardcoded size limit + */ + + /* we hit the limit already, give up */ + if (iouring_max_entries) + return -1; + + /* first time we hit EINVAL? assume we hit the limit, so go back and retry */ + iouring_entries >>= 1; + iouring_max_entries = iouring_entries; + } + + iouring_sq_ring_size = params.sq_off.array + params.sq_entries * sizeof (unsigned); + iouring_cq_ring_size = params.cq_off.cqes + params.cq_entries * sizeof (struct io_uring_cqe); + iouring_sqes_size = params.sq_entries * sizeof (struct io_uring_sqe); + + iouring_sq_ring = mmap (0, iouring_sq_ring_size, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, iouring_fd, IORING_OFF_SQ_RING); + iouring_cq_ring = mmap (0, iouring_cq_ring_size, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, iouring_fd, IORING_OFF_CQ_RING); + iouring_sqes = mmap (0, iouring_sqes_size, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, iouring_fd, IORING_OFF_SQES); + + if (iouring_sq_ring == MAP_FAILED || iouring_cq_ring == MAP_FAILED || iouring_sqes == MAP_FAILED) + return -1; + + iouring_sq_head = params.sq_off.head; + iouring_sq_tail = params.sq_off.tail; + iouring_sq_ring_mask = params.sq_off.ring_mask; + iouring_sq_ring_entries = params.sq_off.ring_entries; + iouring_sq_flags = params.sq_off.flags; + iouring_sq_dropped = params.sq_off.dropped; + iouring_sq_array = params.sq_off.array; + + iouring_cq_head = params.cq_off.head; + iouring_cq_tail = params.cq_off.tail; + iouring_cq_ring_mask = params.cq_off.ring_mask; + iouring_cq_ring_entries = params.cq_off.ring_entries; + iouring_cq_overflow = params.cq_off.overflow; + iouring_cq_cqes = params.cq_off.cqes; + + iouring_tfd = timerfd_create (CLOCK_MONOTONIC, TFD_CLOEXEC); + + if (iouring_tfd < 0) + return iouring_tfd; + + iouring_tfd_to = EV_TSTAMP_HUGE; + + return 0; +} + +ecb_cold +static void +iouring_fork (EV_P) +{ + iouring_internal_destroy (EV_A); + + while (iouring_internal_init (EV_A) < 0) + ev_syserr ("(libev) io_uring_setup"); + + fd_rearm_all (EV_A); + + ev_io_stop (EV_A_ &iouring_tfd_w); + ev_io_set (EV_A_ &iouring_tfd_w, iouring_tfd, EV_READ); + ev_io_start (EV_A_ &iouring_tfd_w); +} + +/*****************************************************************************/ + +static void +iouring_modify (EV_P_ int fd, int oev, int nev) +{ + if (oev) + { + /* we assume the sqe's are all "properly" initialised */ + struct io_uring_sqe *sqe = iouring_sqe_get (EV_A); + sqe->opcode = IORING_OP_POLL_REMOVE; + sqe->fd = fd; + /* Jens Axboe notified me that user_data is not what is documented, but is + * some kind of unique ID that has to match, otherwise the request cannot + * be removed. Since we don't *really* have that, we pass in the old + * generation counter - if that fails, too bad, it will hopefully be removed + * at close time and then be ignored. */ + sqe->addr = (uint32_t)fd | ((__u64)(uint32_t)anfds [fd].egen << 32); + sqe->user_data = (uint64_t)-1; + iouring_sqe_submit (EV_A_ sqe); + + /* increment generation counter to avoid handling old events */ + ++anfds [fd].egen; + } + + if (nev) + { + struct io_uring_sqe *sqe = iouring_sqe_get (EV_A); + sqe->opcode = IORING_OP_POLL_ADD; + sqe->fd = fd; + sqe->addr = 0; + sqe->user_data = (uint32_t)fd | ((__u64)(uint32_t)anfds [fd].egen << 32); + sqe->poll_events = + (nev & EV_READ ? POLLIN : 0) + | (nev & EV_WRITE ? POLLOUT : 0); + iouring_sqe_submit (EV_A_ sqe); + } +} + +inline_size +void +iouring_tfd_update (EV_P_ ev_tstamp timeout) +{ + ev_tstamp tfd_to = mn_now + timeout; + + /* we assume there will be many iterations per timer change, so + * we only re-set the timerfd when we have to because its expiry + * is too late. + */ + if (ecb_expect_false (tfd_to < iouring_tfd_to)) + { + struct itimerspec its; + + iouring_tfd_to = tfd_to; + EV_TS_SET (its.it_interval, 0.); + EV_TS_SET (its.it_value, tfd_to); + + if (timerfd_settime (iouring_tfd, TFD_TIMER_ABSTIME, &its, 0) < 0) + assert (("libev: iouring timerfd_settime failed", 0)); + } +} + +inline_size +void +iouring_process_cqe (EV_P_ struct io_uring_cqe *cqe) +{ + int fd = cqe->user_data & 0xffffffffU; + uint32_t gen = cqe->user_data >> 32; + int res = cqe->res; + + /* user_data -1 is a remove that we are not atm. interested in */ + if (cqe->user_data == (uint64_t)-1) + return; + + assert (("libev: io_uring fd must be in-bounds", fd >= 0 && fd < anfdmax)); + + /* documentation lies, of course. the result value is NOT like + * normal syscalls, but like linux raw syscalls, i.e. negative + * error numbers. fortunate, as otherwise there would be no way + * to get error codes at all. still, why not document this? + */ + + /* ignore event if generation doesn't match */ + /* other than skipping removal events, */ + /* this should actually be very rare */ + if (ecb_expect_false (gen != (uint32_t)anfds [fd].egen)) + return; + + if (ecb_expect_false (res < 0)) + { + /*TODO: EINVAL handling (was something failed with this fd)*/ + + if (res == -EBADF) + { + assert (("libev: event loop rejected bad fd", res != -EBADF)); + fd_kill (EV_A_ fd); + } + else + { + errno = -res; + ev_syserr ("(libev) IORING_OP_POLL_ADD"); + } + + return; + } + + /* feed events, we do not expect or handle POLLNVAL */ + fd_event ( + EV_A_ + fd, + (res & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0) + | (res & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0) + ); + + /* io_uring is oneshot, so we need to re-arm the fd next iteration */ + /* this also means we usually have to do at least one syscall per iteration */ + anfds [fd].events = 0; + fd_change (EV_A_ fd, EV_ANFD_REIFY); +} + +/* called when the event queue overflows */ +ecb_cold +static void +iouring_overflow (EV_P) +{ + /* we have two options, resize the queue (by tearing down + * everything and recreating it, or living with it + * and polling. + * we implement this by resizing the queue, and, if that fails, + * we just recreate the state on every failure, which + * kind of is a very inefficient poll. + * one danger is, due to the bios toward lower fds, + * we will only really get events for those, so + * maybe we need a poll() fallback, after all. + */ + /*EV_CQ_VAR (overflow) = 0;*/ /* need to do this if we keep the state and poll manually */ + + fd_rearm_all (EV_A); + + /* we double the size until we hit the hard-to-probe maximum */ + if (!iouring_max_entries) + { + iouring_entries <<= 1; + iouring_fork (EV_A); + } + else + { + /* we hit the kernel limit, we should fall back to something else. + * we can either poll() a few times and hope for the best, + * poll always, or switch to epoll. + * TODO: is this necessary with newer kernels? + */ + + iouring_internal_destroy (EV_A); + + /* this should make it so that on return, we don't call any uring functions */ + iouring_to_submit = 0; + + for (;;) + { + backend = epoll_init (EV_A_ 0); + + if (backend) + break; + + ev_syserr ("(libev) iouring switch to epoll"); + } + } +} + +/* handle any events in the completion queue, return true if there were any */ +static int +iouring_handle_cq (EV_P) +{ + unsigned head, tail, mask; + + head = EV_CQ_VAR (head); + ECB_MEMORY_FENCE_ACQUIRE; + tail = EV_CQ_VAR (tail); + + if (head == tail) + return 0; + + /* it can only overflow if we have events, yes, yes? */ + if (ecb_expect_false (EV_CQ_VAR (overflow))) + { + iouring_overflow (EV_A); + return 1; + } + + mask = EV_CQ_VAR (ring_mask); + + do + iouring_process_cqe (EV_A_ &EV_CQES [head++ & mask]); + while (head != tail); + + EV_CQ_VAR (head) = head; + ECB_MEMORY_FENCE_RELEASE; + + return 1; +} + +static void +iouring_poll (EV_P_ ev_tstamp timeout) +{ + /* if we have events, no need for extra syscalls, but we might have to queue events */ + /* we also clar the timeout if there are outstanding fdchanges */ + /* the latter should only happen if both the sq and cq are full, most likely */ + /* because we have a lot of event sources that immediately complete */ + /* TODO: fdchacngecnt is always 0 because fd_reify does not have two buffers yet */ + if (iouring_handle_cq (EV_A) || fdchangecnt) + timeout = EV_TS_CONST (0.); + else + /* no events, so maybe wait for some */ + iouring_tfd_update (EV_A_ timeout); + + /* only enter the kernel if we have something to submit, or we need to wait */ + if (timeout || iouring_to_submit) + { + int res = iouring_enter (EV_A_ timeout); + + if (ecb_expect_false (res < 0)) + if (errno == EINTR) + /* ignore */; + else if (errno == EBUSY) + /* cq full, cannot submit - should be rare because we flush the cq first, so simply ignore */; + else + ev_syserr ("(libev) iouring setup"); + else + iouring_handle_cq (EV_A); + } +} + +inline_size +int +iouring_init (EV_P_ int flags) +{ + iouring_entries = IOURING_INIT_ENTRIES; + iouring_max_entries = 0; + + if (iouring_internal_init (EV_A) < 0) + { + iouring_internal_destroy (EV_A); + return 0; + } + + ev_io_init (&iouring_tfd_w, iouring_tfd_cb, iouring_tfd, EV_READ); + ev_set_priority (&iouring_tfd_w, EV_MINPRI); + ev_io_start (EV_A_ &iouring_tfd_w); + ev_unref (EV_A); /* watcher should not keep loop alive */ + + backend_modify = iouring_modify; + backend_poll = iouring_poll; + + return EVBACKEND_IOURING; +} + +inline_size +void +iouring_destroy (EV_P) +{ + iouring_internal_destroy (EV_A); +} + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev_kqueue.c b/deps/ngtcp2/ngtcp2/third-party/libev/ev_kqueue.c new file mode 100644 index 000000000000..69c5147f1388 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev_kqueue.c @@ -0,0 +1,224 @@ +/* + * libev kqueue backend + * + * Copyright (c) 2007,2008,2009,2010,2011,2012,2013,2016,2019 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#include +#include +#include +#include +#include + +inline_speed +void +kqueue_change (EV_P_ int fd, int filter, int flags, int fflags) +{ + ++kqueue_changecnt; + array_needsize (struct kevent, kqueue_changes, kqueue_changemax, kqueue_changecnt, array_needsize_noinit); + + EV_SET (&kqueue_changes [kqueue_changecnt - 1], fd, filter, flags, fflags, 0, 0); +} + +/* OS X at least needs this */ +#ifndef EV_ENABLE +# define EV_ENABLE 0 +#endif +#ifndef NOTE_EOF +# define NOTE_EOF 0 +#endif + +static void +kqueue_modify (EV_P_ int fd, int oev, int nev) +{ + if (oev != nev) + { + if (oev & EV_READ) + kqueue_change (EV_A_ fd, EVFILT_READ , EV_DELETE, 0); + + if (oev & EV_WRITE) + kqueue_change (EV_A_ fd, EVFILT_WRITE, EV_DELETE, 0); + } + + /* to detect close/reopen reliably, we have to re-add */ + /* event requests even when oev == nev */ + + if (nev & EV_READ) + kqueue_change (EV_A_ fd, EVFILT_READ , EV_ADD | EV_ENABLE, NOTE_EOF); + + if (nev & EV_WRITE) + kqueue_change (EV_A_ fd, EVFILT_WRITE, EV_ADD | EV_ENABLE, NOTE_EOF); +} + +static void +kqueue_poll (EV_P_ ev_tstamp timeout) +{ + int res, i; + struct timespec ts; + + /* need to resize so there is enough space for errors */ + if (kqueue_changecnt > kqueue_eventmax) + { + ev_free (kqueue_events); + kqueue_eventmax = array_nextsize (sizeof (struct kevent), kqueue_eventmax, kqueue_changecnt); + kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax); + } + + EV_RELEASE_CB; + EV_TS_SET (ts, timeout); + res = kevent (backend_fd, kqueue_changes, kqueue_changecnt, kqueue_events, kqueue_eventmax, &ts); + EV_ACQUIRE_CB; + kqueue_changecnt = 0; + + if (ecb_expect_false (res < 0)) + { + if (errno != EINTR) + ev_syserr ("(libev) kqueue kevent"); + + return; + } + + for (i = 0; i < res; ++i) + { + int fd = kqueue_events [i].ident; + + if (ecb_expect_false (kqueue_events [i].flags & EV_ERROR)) + { + int err = kqueue_events [i].data; + + /* we are only interested in errors for fds that we are interested in :) */ + if (anfds [fd].events) + { + if (err == ENOENT) /* resubmit changes on ENOENT */ + kqueue_modify (EV_A_ fd, 0, anfds [fd].events); + else if (err == EBADF) /* on EBADF, we re-check the fd */ + { + if (fd_valid (fd)) + kqueue_modify (EV_A_ fd, 0, anfds [fd].events); + else + { + assert (("libev: kqueue found invalid fd", 0)); + fd_kill (EV_A_ fd); + } + } + else /* on all other errors, we error out on the fd */ + { + assert (("libev: kqueue found invalid fd", 0)); + fd_kill (EV_A_ fd); + } + } + } + else + fd_event ( + EV_A_ + fd, + kqueue_events [i].filter == EVFILT_READ ? EV_READ + : kqueue_events [i].filter == EVFILT_WRITE ? EV_WRITE + : 0 + ); + } + + if (ecb_expect_false (res == kqueue_eventmax)) + { + ev_free (kqueue_events); + kqueue_eventmax = array_nextsize (sizeof (struct kevent), kqueue_eventmax, kqueue_eventmax + 1); + kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax); + } +} + +inline_size +int +kqueue_init (EV_P_ int flags) +{ + /* initialize the kernel queue */ + kqueue_fd_pid = getpid (); + if ((backend_fd = kqueue ()) < 0) + return 0; + + fcntl (backend_fd, F_SETFD, FD_CLOEXEC); /* not sure if necessary, hopefully doesn't hurt */ + + backend_mintime = EV_TS_CONST (1e-9); /* apparently, they did the right thing in freebsd */ + backend_modify = kqueue_modify; + backend_poll = kqueue_poll; + + kqueue_eventmax = 64; /* initial number of events receivable per poll */ + kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax); + + kqueue_changes = 0; + kqueue_changemax = 0; + kqueue_changecnt = 0; + + return EVBACKEND_KQUEUE; +} + +inline_size +void +kqueue_destroy (EV_P) +{ + ev_free (kqueue_events); + ev_free (kqueue_changes); +} + +inline_size +void +kqueue_fork (EV_P) +{ + /* some BSD kernels don't just destroy the kqueue itself, + * but also close the fd, which isn't documented, and + * impossible to support properly. + * we remember the pid of the kqueue call and only close + * the fd if the pid is still the same. + * this leaks fds on sane kernels, but BSD interfaces are + * notoriously buggy and rarely get fixed. + */ + pid_t newpid = getpid (); + + if (newpid == kqueue_fd_pid) + close (backend_fd); + + kqueue_fd_pid = newpid; + while ((backend_fd = kqueue ()) < 0) + ev_syserr ("(libev) kqueue"); + + fcntl (backend_fd, F_SETFD, FD_CLOEXEC); + + /* re-register interest in fds */ + fd_rearm_all (EV_A); +} + +/* sys/event.h defines EV_ERROR */ +#undef EV_ERROR + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev_linuxaio.c b/deps/ngtcp2/ngtcp2/third-party/libev/ev_linuxaio.c new file mode 100644 index 000000000000..4687a703e8d5 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev_linuxaio.c @@ -0,0 +1,620 @@ +/* + * libev linux aio fd activity backend + * + * Copyright (c) 2019 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +/* + * general notes about linux aio: + * + * a) at first, the linux aio IOCB_CMD_POLL functionality introduced in + * 4.18 looks too good to be true: both watchers and events can be + * batched, and events can even be handled in userspace using + * a ring buffer shared with the kernel. watchers can be canceled + * regardless of whether the fd has been closed. no problems with fork. + * ok, the ring buffer is 200% undocumented (there isn't even a + * header file), but otherwise, it's pure bliss! + * b) ok, watchers are one-shot, so you have to re-arm active ones + * on every iteration. so much for syscall-less event handling, + * but at least these re-arms can be batched, no big deal, right? + * c) well, linux as usual: the documentation lies to you: io_submit + * sometimes returns EINVAL because the kernel doesn't feel like + * handling your poll mask - ttys can be polled for POLLOUT, + * POLLOUT|POLLIN, but polling for POLLIN fails. just great, + * so we have to fall back to something else (hello, epoll), + * but at least the fallback can be slow, because these are + * exceptional cases, right? + * d) hmm, you have to tell the kernel the maximum number of watchers + * you want to queue when initialising the aio context. but of + * course the real limit is magically calculated in the kernel, and + * is often higher then we asked for. so we just have to destroy + * the aio context and re-create it a bit larger if we hit the limit. + * (starts to remind you of epoll? well, it's a bit more deterministic + * and less gambling, but still ugly as hell). + * e) that's when you find out you can also hit an arbitrary system-wide + * limit. or the kernel simply doesn't want to handle your watchers. + * what the fuck do we do then? you guessed it, in the middle + * of event handling we have to switch to 100% epoll polling. and + * that better is as fast as normal epoll polling, so you practically + * have to use the normal epoll backend with all its quirks. + * f) end result of this train wreck: it inherits all the disadvantages + * from epoll, while adding a number on its own. why even bother to use + * it? because if conditions are right and your fds are supported and you + * don't hit a limit, this backend is actually faster, doesn't gamble with + * your fds, batches watchers and events and doesn't require costly state + * recreates. well, until it does. + * g) all of this makes this backend use almost twice as much code as epoll. + * which in turn uses twice as much code as poll. and that#s not counting + * the fact that this backend also depends on the epoll backend, making + * it three times as much code as poll, or kqueue. + * h) bleah. why can't linux just do kqueue. sure kqueue is ugly, but by now + * it's clear that whatever linux comes up with is far, far, far worse. + */ + +#include /* actually linux/time.h, but we must assume they are compatible */ +#include +#include + +/*****************************************************************************/ +/* syscall wrapdadoop - this section has the raw api/abi definitions */ + +#include /* no glibc wrappers */ + +/* aio_abi.h is not versioned in any way, so we cannot test for its existance */ +#define IOCB_CMD_POLL 5 + +/* taken from linux/fs/aio.c. yup, that's a .c file. + * not only is this totally undocumented, not even the source code + * can tell you what the future semantics of compat_features and + * incompat_features are, or what header_length actually is for. + */ +#define AIO_RING_MAGIC 0xa10a10a1 +#define EV_AIO_RING_INCOMPAT_FEATURES 0 +struct aio_ring +{ + unsigned id; /* kernel internal index number */ + unsigned nr; /* number of io_events */ + unsigned head; /* Written to by userland or by kernel. */ + unsigned tail; + + unsigned magic; + unsigned compat_features; + unsigned incompat_features; + unsigned header_length; /* size of aio_ring */ + + struct io_event io_events[0]; +}; + +inline_size +int +evsys_io_setup (unsigned nr_events, aio_context_t *ctx_idp) +{ + return ev_syscall2 (SYS_io_setup, nr_events, ctx_idp); +} + +inline_size +int +evsys_io_destroy (aio_context_t ctx_id) +{ + return ev_syscall1 (SYS_io_destroy, ctx_id); +} + +inline_size +int +evsys_io_submit (aio_context_t ctx_id, long nr, struct iocb *cbp[]) +{ + return ev_syscall3 (SYS_io_submit, ctx_id, nr, cbp); +} + +inline_size +int +evsys_io_cancel (aio_context_t ctx_id, struct iocb *cbp, struct io_event *result) +{ + return ev_syscall3 (SYS_io_cancel, ctx_id, cbp, result); +} + +inline_size +int +evsys_io_getevents (aio_context_t ctx_id, long min_nr, long nr, struct io_event *events, struct timespec *timeout) +{ + return ev_syscall5 (SYS_io_getevents, ctx_id, min_nr, nr, events, timeout); +} + +/*****************************************************************************/ +/* actual backed implementation */ + +ecb_cold +static int +linuxaio_nr_events (EV_P) +{ + /* we start with 16 iocbs and incraese from there + * that's tiny, but the kernel has a rather low system-wide + * limit that can be reached quickly, so let's be parsimonious + * with this resource. + * Rest assured, the kernel generously rounds up small and big numbers + * in different ways (but doesn't seem to charge you for it). + * The 15 here is because the kernel usually has a power of two as aio-max-nr, + * and this helps to take advantage of that limit. + */ + + /* we try to fill 4kB pages exactly. + * the ring buffer header is 32 bytes, every io event is 32 bytes. + * the kernel takes the io requests number, doubles it, adds 2 + * and adds the ring buffer. + * the way we use this is by starting low, and then roughly doubling the + * size each time we hit a limit. + */ + + int requests = 15 << linuxaio_iteration; + int one_page = (4096 + / sizeof (struct io_event) ) / 2; /* how many fit into one page */ + int first_page = ((4096 - sizeof (struct aio_ring)) + / sizeof (struct io_event) - 2) / 2; /* how many fit into the first page */ + + /* if everything fits into one page, use count exactly */ + if (requests > first_page) + /* otherwise, round down to full pages and add the first page */ + requests = requests / one_page * one_page + first_page; + + return requests; +} + +/* we use out own wrapper structure in case we ever want to do something "clever" */ +typedef struct aniocb +{ + struct iocb io; + /*int inuse;*/ +} *ANIOCBP; + +inline_size +void +linuxaio_array_needsize_iocbp (ANIOCBP *base, int offset, int count) +{ + while (count--) + { + /* TODO: quite the overhead to allocate every iocb separately, maybe use our own allocator? */ + ANIOCBP iocb = (ANIOCBP)ev_malloc (sizeof (*iocb)); + + /* full zero initialise is probably not required at the moment, but + * this is not well documented, so we better do it. + */ + memset (iocb, 0, sizeof (*iocb)); + + iocb->io.aio_lio_opcode = IOCB_CMD_POLL; + iocb->io.aio_fildes = offset; + + base [offset++] = iocb; + } +} + +ecb_cold +static void +linuxaio_free_iocbp (EV_P) +{ + while (linuxaio_iocbpmax--) + ev_free (linuxaio_iocbps [linuxaio_iocbpmax]); + + linuxaio_iocbpmax = 0; /* next resize will completely reallocate the array, at some overhead */ +} + +static void +linuxaio_modify (EV_P_ int fd, int oev, int nev) +{ + array_needsize (ANIOCBP, linuxaio_iocbps, linuxaio_iocbpmax, fd + 1, linuxaio_array_needsize_iocbp); + ANIOCBP iocb = linuxaio_iocbps [fd]; + ANFD *anfd = &anfds [fd]; + + if (ecb_expect_false (iocb->io.aio_reqprio < 0)) + { + /* we handed this fd over to epoll, so undo this first */ + /* we do it manually because the optimisations on epoll_modify won't do us any good */ + epoll_ctl (backend_fd, EPOLL_CTL_DEL, fd, 0); + anfd->emask = 0; + iocb->io.aio_reqprio = 0; + } + else if (ecb_expect_false (iocb->io.aio_buf)) + { + /* iocb active, so cancel it first before resubmit */ + /* this assumes we only ever get one call per fd per loop iteration */ + for (;;) + { + /* on all relevant kernels, io_cancel fails with EINPROGRESS on "success" */ + if (ecb_expect_false (evsys_io_cancel (linuxaio_ctx, &iocb->io, (struct io_event *)0) == 0)) + break; + + if (ecb_expect_true (errno == EINPROGRESS)) + break; + + /* the EINPROGRESS test is for nicer error message. clumsy. */ + if (errno != EINTR) + { + assert (("libev: linuxaio unexpected io_cancel failed", errno != EINTR && errno != EINPROGRESS)); + break; + } + } + + /* increment generation counter to avoid handling old events */ + ++anfd->egen; + } + + iocb->io.aio_buf = (nev & EV_READ ? POLLIN : 0) + | (nev & EV_WRITE ? POLLOUT : 0); + + if (nev) + { + iocb->io.aio_data = (uint32_t)fd | ((__u64)(uint32_t)anfd->egen << 32); + + /* queue iocb up for io_submit */ + /* this assumes we only ever get one call per fd per loop iteration */ + ++linuxaio_submitcnt; + array_needsize (struct iocb *, linuxaio_submits, linuxaio_submitmax, linuxaio_submitcnt, array_needsize_noinit); + linuxaio_submits [linuxaio_submitcnt - 1] = &iocb->io; + } +} + +static void +linuxaio_epoll_cb (EV_P_ struct ev_io *w, int revents) +{ + epoll_poll (EV_A_ 0); +} + +inline_speed +void +linuxaio_fd_rearm (EV_P_ int fd) +{ + anfds [fd].events = 0; + linuxaio_iocbps [fd]->io.aio_buf = 0; + fd_change (EV_A_ fd, EV_ANFD_REIFY); +} + +static void +linuxaio_parse_events (EV_P_ struct io_event *ev, int nr) +{ + while (nr) + { + int fd = ev->data & 0xffffffff; + uint32_t gen = ev->data >> 32; + int res = ev->res; + + assert (("libev: iocb fd must be in-bounds", fd >= 0 && fd < anfdmax)); + + /* only accept events if generation counter matches */ + if (ecb_expect_true (gen == (uint32_t)anfds [fd].egen)) + { + /* feed events, we do not expect or handle POLLNVAL */ + fd_event ( + EV_A_ + fd, + (res & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0) + | (res & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0) + ); + + /* linux aio is oneshot: rearm fd. TODO: this does more work than strictly needed */ + linuxaio_fd_rearm (EV_A_ fd); + } + + --nr; + ++ev; + } +} + +/* get any events from ring buffer, return true if any were handled */ +static int +linuxaio_get_events_from_ring (EV_P) +{ + struct aio_ring *ring = (struct aio_ring *)linuxaio_ctx; + unsigned head, tail; + + /* the kernel reads and writes both of these variables, */ + /* as a C extension, we assume that volatile use here */ + /* both makes reads atomic and once-only */ + head = *(volatile unsigned *)&ring->head; + ECB_MEMORY_FENCE_ACQUIRE; + tail = *(volatile unsigned *)&ring->tail; + + if (head == tail) + return 0; + + /* parse all available events, but only once, to avoid starvation */ + if (ecb_expect_true (tail > head)) /* normal case around */ + linuxaio_parse_events (EV_A_ ring->io_events + head, tail - head); + else /* wrapped around */ + { + linuxaio_parse_events (EV_A_ ring->io_events + head, ring->nr - head); + linuxaio_parse_events (EV_A_ ring->io_events, tail); + } + + ECB_MEMORY_FENCE_RELEASE; + /* as an extension to C, we hope that the volatile will make this atomic and once-only */ + *(volatile unsigned *)&ring->head = tail; + + return 1; +} + +inline_size +int +linuxaio_ringbuf_valid (EV_P) +{ + struct aio_ring *ring = (struct aio_ring *)linuxaio_ctx; + + return ecb_expect_true (ring->magic == AIO_RING_MAGIC) + && ring->incompat_features == EV_AIO_RING_INCOMPAT_FEATURES + && ring->header_length == sizeof (struct aio_ring); /* TODO: or use it to find io_event[0]? */ +} + +/* read at least one event from kernel, or timeout */ +inline_size +void +linuxaio_get_events (EV_P_ ev_tstamp timeout) +{ + struct timespec ts; + struct io_event ioev[8]; /* 256 octet stack space */ + int want = 1; /* how many events to request */ + int ringbuf_valid = linuxaio_ringbuf_valid (EV_A); + + if (ecb_expect_true (ringbuf_valid)) + { + /* if the ring buffer has any events, we don't wait or call the kernel at all */ + if (linuxaio_get_events_from_ring (EV_A)) + return; + + /* if the ring buffer is empty, and we don't have a timeout, then don't call the kernel */ + if (!timeout) + return; + } + else + /* no ringbuffer, request slightly larger batch */ + want = sizeof (ioev) / sizeof (ioev [0]); + + /* no events, so wait for some + * for fairness reasons, we do this in a loop, to fetch all events + */ + for (;;) + { + int res; + + EV_RELEASE_CB; + + EV_TS_SET (ts, timeout); + res = evsys_io_getevents (linuxaio_ctx, 1, want, ioev, &ts); + + EV_ACQUIRE_CB; + + if (res < 0) + if (errno == EINTR) + /* ignored, retry */; + else + ev_syserr ("(libev) linuxaio io_getevents"); + else if (res) + { + /* at least one event available, handle them */ + linuxaio_parse_events (EV_A_ ioev, res); + + if (ecb_expect_true (ringbuf_valid)) + { + /* if we have a ring buffer, handle any remaining events in it */ + linuxaio_get_events_from_ring (EV_A); + + /* at this point, we should have handled all outstanding events */ + break; + } + else if (res < want) + /* otherwise, if there were fewere events than we wanted, we assume there are no more */ + break; + } + else + break; /* no events from the kernel, we are done */ + + timeout = EV_TS_CONST (0.); /* only wait in the first iteration */ + } +} + +inline_size +int +linuxaio_io_setup (EV_P) +{ + linuxaio_ctx = 0; + return evsys_io_setup (linuxaio_nr_events (EV_A), &linuxaio_ctx); +} + +static void +linuxaio_poll (EV_P_ ev_tstamp timeout) +{ + int submitted; + + /* first phase: submit new iocbs */ + + /* io_submit might return less than the requested number of iocbs */ + /* this is, afaics, only because of errors, but we go by the book and use a loop, */ + /* which allows us to pinpoint the erroneous iocb */ + for (submitted = 0; submitted < linuxaio_submitcnt; ) + { + int res = evsys_io_submit (linuxaio_ctx, linuxaio_submitcnt - submitted, linuxaio_submits + submitted); + + if (ecb_expect_false (res < 0)) + if (errno == EINVAL) + { + /* This happens for unsupported fds, officially, but in my testing, + * also randomly happens for supported fds. We fall back to good old + * poll() here, under the assumption that this is a very rare case. + * See https://lore.kernel.org/patchwork/patch/1047453/ to see + * discussion about such a case (ttys) where polling for POLLIN + * fails but POLLIN|POLLOUT works. + */ + struct iocb *iocb = linuxaio_submits [submitted]; + epoll_modify (EV_A_ iocb->aio_fildes, 0, anfds [iocb->aio_fildes].events); + iocb->aio_reqprio = -1; /* mark iocb as epoll */ + + res = 1; /* skip this iocb - another iocb, another chance */ + } + else if (errno == EAGAIN) + { + /* This happens when the ring buffer is full, or some other shit we + * don't know and isn't documented. Most likely because we have too + * many requests and linux aio can't be assed to handle them. + * In this case, we try to allocate a larger ring buffer, freeing + * ours first. This might fail, in which case we have to fall back to 100% + * epoll. + * God, how I hate linux not getting its act together. Ever. + */ + evsys_io_destroy (linuxaio_ctx); + linuxaio_submitcnt = 0; + + /* rearm all fds with active iocbs */ + { + int fd; + for (fd = 0; fd < linuxaio_iocbpmax; ++fd) + if (linuxaio_iocbps [fd]->io.aio_buf) + linuxaio_fd_rearm (EV_A_ fd); + } + + ++linuxaio_iteration; + if (linuxaio_io_setup (EV_A) < 0) + { + /* TODO: rearm all and recreate epoll backend from scratch */ + /* TODO: might be more prudent? */ + + /* to bad, we can't get a new aio context, go 100% epoll */ + linuxaio_free_iocbp (EV_A); + ev_io_stop (EV_A_ &linuxaio_epoll_w); + ev_ref (EV_A); + linuxaio_ctx = 0; + + backend = EVBACKEND_EPOLL; + backend_modify = epoll_modify; + backend_poll = epoll_poll; + } + + timeout = EV_TS_CONST (0.); + /* it's easiest to handle this mess in another iteration */ + return; + } + else if (errno == EBADF) + { + assert (("libev: event loop rejected bad fd", errno != EBADF)); + fd_kill (EV_A_ linuxaio_submits [submitted]->aio_fildes); + + res = 1; /* skip this iocb */ + } + else if (errno == EINTR) /* not seen in reality, not documented */ + res = 0; /* silently ignore and retry */ + else + { + ev_syserr ("(libev) linuxaio io_submit"); + res = 0; + } + + submitted += res; + } + + linuxaio_submitcnt = 0; + + /* second phase: fetch and parse events */ + + linuxaio_get_events (EV_A_ timeout); +} + +inline_size +int +linuxaio_init (EV_P_ int flags) +{ + /* would be great to have a nice test for IOCB_CMD_POLL instead */ + /* also: test some semi-common fd types, such as files and ttys in recommended_backends */ + /* 4.18 introduced IOCB_CMD_POLL, 4.19 made epoll work, and we need that */ + if (ev_linux_version () < 0x041300) + return 0; + + if (!epoll_init (EV_A_ 0)) + return 0; + + linuxaio_iteration = 0; + + if (linuxaio_io_setup (EV_A) < 0) + { + epoll_destroy (EV_A); + return 0; + } + + ev_io_init (&linuxaio_epoll_w, linuxaio_epoll_cb, backend_fd, EV_READ); + ev_set_priority (&linuxaio_epoll_w, EV_MAXPRI); + ev_io_start (EV_A_ &linuxaio_epoll_w); + ev_unref (EV_A); /* watcher should not keep loop alive */ + + backend_modify = linuxaio_modify; + backend_poll = linuxaio_poll; + + linuxaio_iocbpmax = 0; + linuxaio_iocbps = 0; + + linuxaio_submits = 0; + linuxaio_submitmax = 0; + linuxaio_submitcnt = 0; + + return EVBACKEND_LINUXAIO; +} + +inline_size +void +linuxaio_destroy (EV_P) +{ + epoll_destroy (EV_A); + linuxaio_free_iocbp (EV_A); + evsys_io_destroy (linuxaio_ctx); /* fails in child, aio context is destroyed */ +} + +ecb_cold +static void +linuxaio_fork (EV_P) +{ + linuxaio_submitcnt = 0; /* all pointers were invalidated */ + linuxaio_free_iocbp (EV_A); /* this frees all iocbs, which is very heavy-handed */ + evsys_io_destroy (linuxaio_ctx); /* fails in child, aio context is destroyed */ + + linuxaio_iteration = 0; /* we start over in the child */ + + while (linuxaio_io_setup (EV_A) < 0) + ev_syserr ("(libev) linuxaio io_setup"); + + /* forking epoll should also effectively unregister all fds from the backend */ + epoll_fork (EV_A); + /* epoll_fork already did this. hopefully */ + /*fd_rearm_all (EV_A);*/ + + ev_io_stop (EV_A_ &linuxaio_epoll_w); + ev_io_set (EV_A_ &linuxaio_epoll_w, backend_fd, EV_READ); + ev_io_start (EV_A_ &linuxaio_epoll_w); +} + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev_poll.c b/deps/ngtcp2/ngtcp2/third-party/libev/ev_poll.c new file mode 100644 index 000000000000..e5508ddb0c25 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev_poll.c @@ -0,0 +1,156 @@ +/* + * libev poll fd activity backend + * + * Copyright (c) 2007,2008,2009,2010,2011,2016,2019 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#include + +inline_size +void +array_needsize_pollidx (int *base, int offset, int count) +{ + /* using memset (.., -1, ...) is tempting, we we try + * to be ultraportable + */ + base += offset; + while (count--) + *base++ = -1; +} + +static void +poll_modify (EV_P_ int fd, int oev, int nev) +{ + int idx; + + if (oev == nev) + return; + + array_needsize (int, pollidxs, pollidxmax, fd + 1, array_needsize_pollidx); + + idx = pollidxs [fd]; + + if (idx < 0) /* need to allocate a new pollfd */ + { + pollidxs [fd] = idx = pollcnt++; + array_needsize (struct pollfd, polls, pollmax, pollcnt, array_needsize_noinit); + polls [idx].fd = fd; + } + + assert (polls [idx].fd == fd); + + if (nev) + polls [idx].events = + (nev & EV_READ ? POLLIN : 0) + | (nev & EV_WRITE ? POLLOUT : 0); + else /* remove pollfd */ + { + pollidxs [fd] = -1; + + if (ecb_expect_true (idx < --pollcnt)) + { + polls [idx] = polls [pollcnt]; + pollidxs [polls [idx].fd] = idx; + } + } +} + +static void +poll_poll (EV_P_ ev_tstamp timeout) +{ + struct pollfd *p; + int res; + + EV_RELEASE_CB; + res = poll (polls, pollcnt, EV_TS_TO_MSEC (timeout)); + EV_ACQUIRE_CB; + + if (ecb_expect_false (res < 0)) + { + if (errno == EBADF) + fd_ebadf (EV_A); + else if (errno == ENOMEM && !syserr_cb) + fd_enomem (EV_A); + else if (errno != EINTR) + ev_syserr ("(libev) poll"); + } + else + for (p = polls; res; ++p) + { + assert (("libev: poll returned illegal result, broken BSD kernel?", p < polls + pollcnt)); + + if (ecb_expect_false (p->revents)) /* this expect is debatable */ + { + --res; + + if (ecb_expect_false (p->revents & POLLNVAL)) + { + assert (("libev: poll found invalid fd in poll set", 0)); + fd_kill (EV_A_ p->fd); + } + else + fd_event ( + EV_A_ + p->fd, + (p->revents & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0) + | (p->revents & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0) + ); + } + } +} + +inline_size +int +poll_init (EV_P_ int flags) +{ + backend_mintime = EV_TS_CONST (1e-3); + backend_modify = poll_modify; + backend_poll = poll_poll; + + pollidxs = 0; pollidxmax = 0; + polls = 0; pollmax = 0; pollcnt = 0; + + return EVBACKEND_POLL; +} + +inline_size +void +poll_destroy (EV_P) +{ + ev_free (pollidxs); + ev_free (polls); +} + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev_port.c b/deps/ngtcp2/ngtcp2/third-party/libev/ev_port.c new file mode 100644 index 000000000000..f4cd9d99cd39 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev_port.c @@ -0,0 +1,192 @@ +/* + * libev solaris event port backend + * + * Copyright (c) 2007,2008,2009,2010,2011,2019 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +/* useful reading: + * + * http://bugs.opensolaris.org/view_bug.do?bug_id=6268715 (random results) + * http://bugs.opensolaris.org/view_bug.do?bug_id=6455223 (just totally broken) + * http://bugs.opensolaris.org/view_bug.do?bug_id=6873782 (manpage ETIME) + * http://bugs.opensolaris.org/view_bug.do?bug_id=6874410 (implementation ETIME) + * http://www.mail-archive.com/networking-discuss@opensolaris.org/msg11898.html ETIME vs. nget + * http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libc/port/gen/event_port.c (libc) + * http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/fs/portfs/port.c#1325 (kernel) + */ + +#include +#include +#include +#include +#include +#include + +inline_speed +void +port_associate_and_check (EV_P_ int fd, int ev) +{ + if (0 > + port_associate ( + backend_fd, PORT_SOURCE_FD, fd, + (ev & EV_READ ? POLLIN : 0) + | (ev & EV_WRITE ? POLLOUT : 0), + 0 + ) + ) + { + if (errno == EBADFD) + { + assert (("libev: port_associate found invalid fd", errno != EBADFD)); + fd_kill (EV_A_ fd); + } + else + ev_syserr ("(libev) port_associate"); + } +} + +static void +port_modify (EV_P_ int fd, int oev, int nev) +{ + /* we need to reassociate no matter what, as closes are + * once more silently being discarded. + */ + if (!nev) + { + if (oev) + port_dissociate (backend_fd, PORT_SOURCE_FD, fd); + } + else + port_associate_and_check (EV_A_ fd, nev); +} + +static void +port_poll (EV_P_ ev_tstamp timeout) +{ + int res, i; + struct timespec ts; + uint_t nget = 1; + + /* we initialise this to something we will skip in the loop, as */ + /* port_getn can return with nget unchanged, but no indication */ + /* whether it was the original value or has been updated :/ */ + port_events [0].portev_source = 0; + + EV_RELEASE_CB; + EV_TS_SET (ts, timeout); + res = port_getn (backend_fd, port_events, port_eventmax, &nget, &ts); + EV_ACQUIRE_CB; + + /* port_getn may or may not set nget on error */ + /* so we rely on port_events [0].portev_source not being updated */ + if (res == -1 && errno != ETIME && errno != EINTR) + ev_syserr ("(libev) port_getn (see http://bugs.opensolaris.org/view_bug.do?bug_id=6268715, try LIBEV_FLAGS=3 env variable)"); + + for (i = 0; i < nget; ++i) + { + if (port_events [i].portev_source == PORT_SOURCE_FD) + { + int fd = port_events [i].portev_object; + + fd_event ( + EV_A_ + fd, + (port_events [i].portev_events & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0) + | (port_events [i].portev_events & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0) + ); + + fd_change (EV_A_ fd, EV__IOFDSET); + } + } + + if (ecb_expect_false (nget == port_eventmax)) + { + ev_free (port_events); + port_eventmax = array_nextsize (sizeof (port_event_t), port_eventmax, port_eventmax + 1); + port_events = (port_event_t *)ev_malloc (sizeof (port_event_t) * port_eventmax); + } +} + +inline_size +int +port_init (EV_P_ int flags) +{ + /* Initialize the kernel queue */ + if ((backend_fd = port_create ()) < 0) + return 0; + + assert (("libev: PORT_SOURCE_FD must not be zero", PORT_SOURCE_FD)); + + fcntl (backend_fd, F_SETFD, FD_CLOEXEC); /* not sure if necessary, hopefully doesn't hurt */ + + /* if my reading of the opensolaris kernel sources are correct, then + * opensolaris does something very stupid: it checks if the time has already + * elapsed and doesn't round up if that is the case, otherwise it DOES round + * up. Since we can't know what the case is, we need to guess by using a + * "large enough" timeout. Normally, 1e-9 would be correct. + */ + backend_mintime = EV_TS_CONST (1e-3); /* needed to compensate for port_getn returning early */ + backend_modify = port_modify; + backend_poll = port_poll; + + port_eventmax = 64; /* initial number of events receivable per poll */ + port_events = (port_event_t *)ev_malloc (sizeof (port_event_t) * port_eventmax); + + return EVBACKEND_PORT; +} + +inline_size +void +port_destroy (EV_P) +{ + ev_free (port_events); +} + +inline_size +void +port_fork (EV_P) +{ + close (backend_fd); + + while ((backend_fd = port_create ()) < 0) + ev_syserr ("(libev) port"); + + fcntl (backend_fd, F_SETFD, FD_CLOEXEC); + + /* re-register interest in fds */ + fd_rearm_all (EV_A); +} + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev_select.c b/deps/ngtcp2/ngtcp2/third-party/libev/ev_select.c new file mode 100644 index 000000000000..b862c8113783 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev_select.c @@ -0,0 +1,316 @@ +/* + * libev select fd activity backend + * + * Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#ifndef _WIN32 +/* for unix systems */ +# include +# ifndef __hpux +/* for REAL unix systems */ +# include +# endif +#endif + +#ifndef EV_SELECT_USE_FD_SET +# ifdef NFDBITS +# define EV_SELECT_USE_FD_SET 0 +# else +# define EV_SELECT_USE_FD_SET 1 +# endif +#endif + +#if EV_SELECT_IS_WINSOCKET +# undef EV_SELECT_USE_FD_SET +# define EV_SELECT_USE_FD_SET 1 +# undef NFDBITS +# define NFDBITS 0 +#endif + +#if !EV_SELECT_USE_FD_SET +# define NFDBYTES (NFDBITS / 8) +#endif + +#include + +static void +select_modify (EV_P_ int fd, int oev, int nev) +{ + if (oev == nev) + return; + + { +#if EV_SELECT_USE_FD_SET + + #if EV_SELECT_IS_WINSOCKET + SOCKET handle = anfds [fd].handle; + #else + int handle = fd; + #endif + + assert (("libev: fd >= FD_SETSIZE passed to fd_set-based select backend", fd < FD_SETSIZE)); + + /* FD_SET is broken on windows (it adds the fd to a set twice or more, + * which eventually leads to overflows). Need to call it only on changes. + */ + #if EV_SELECT_IS_WINSOCKET + if ((oev ^ nev) & EV_READ) + #endif + if (nev & EV_READ) + FD_SET (handle, (fd_set *)vec_ri); + else + FD_CLR (handle, (fd_set *)vec_ri); + + #if EV_SELECT_IS_WINSOCKET + if ((oev ^ nev) & EV_WRITE) + #endif + if (nev & EV_WRITE) + FD_SET (handle, (fd_set *)vec_wi); + else + FD_CLR (handle, (fd_set *)vec_wi); + +#else + + int word = fd / NFDBITS; + fd_mask mask = 1UL << (fd % NFDBITS); + + if (ecb_expect_false (vec_max <= word)) + { + int new_max = word + 1; + + vec_ri = ev_realloc (vec_ri, new_max * NFDBYTES); + vec_ro = ev_realloc (vec_ro, new_max * NFDBYTES); /* could free/malloc */ + vec_wi = ev_realloc (vec_wi, new_max * NFDBYTES); + vec_wo = ev_realloc (vec_wo, new_max * NFDBYTES); /* could free/malloc */ + #ifdef _WIN32 + vec_eo = ev_realloc (vec_eo, new_max * NFDBYTES); /* could free/malloc */ + #endif + + for (; vec_max < new_max; ++vec_max) + ((fd_mask *)vec_ri) [vec_max] = + ((fd_mask *)vec_wi) [vec_max] = 0; + } + + ((fd_mask *)vec_ri) [word] |= mask; + if (!(nev & EV_READ)) + ((fd_mask *)vec_ri) [word] &= ~mask; + + ((fd_mask *)vec_wi) [word] |= mask; + if (!(nev & EV_WRITE)) + ((fd_mask *)vec_wi) [word] &= ~mask; +#endif + } +} + +static void +select_poll (EV_P_ ev_tstamp timeout) +{ + struct timeval tv; + int res; + int fd_setsize; + + EV_RELEASE_CB; + EV_TV_SET (tv, timeout); + +#if EV_SELECT_USE_FD_SET + fd_setsize = sizeof (fd_set); +#else + fd_setsize = vec_max * NFDBYTES; +#endif + + memcpy (vec_ro, vec_ri, fd_setsize); + memcpy (vec_wo, vec_wi, fd_setsize); + +#ifdef _WIN32 + /* pass in the write set as except set. + * the idea behind this is to work around a windows bug that causes + * errors to be reported as an exception and not by setting + * the writable bit. this is so uncontrollably lame. + */ + memcpy (vec_eo, vec_wi, fd_setsize); + res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, (fd_set *)vec_eo, &tv); +#elif EV_SELECT_USE_FD_SET + fd_setsize = anfdmax < FD_SETSIZE ? anfdmax : FD_SETSIZE; + res = select (fd_setsize, (fd_set *)vec_ro, (fd_set *)vec_wo, 0, &tv); +#else + res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, 0, &tv); +#endif + EV_ACQUIRE_CB; + + if (ecb_expect_false (res < 0)) + { + #if EV_SELECT_IS_WINSOCKET + errno = WSAGetLastError (); + #endif + #ifdef WSABASEERR + /* on windows, select returns incompatible error codes, fix this */ + if (errno >= WSABASEERR && errno < WSABASEERR + 1000) + if (errno == WSAENOTSOCK) + errno = EBADF; + else + errno -= WSABASEERR; + #endif + + #ifdef _WIN32 + /* select on windows erroneously returns EINVAL when no fd sets have been + * provided (this is documented). what microsoft doesn't tell you that this bug + * exists even when the fd sets _are_ provided, so we have to check for this bug + * here and emulate by sleeping manually. + * we also get EINVAL when the timeout is invalid, but we ignore this case here + * and assume that EINVAL always means: you have to wait manually. + */ + if (errno == EINVAL) + { + if (timeout) + { + unsigned long ms = EV_TS_TO_MSEC (timeout); + Sleep (ms ? ms : 1); + } + + return; + } + #endif + + if (errno == EBADF) + fd_ebadf (EV_A); + else if (errno == ENOMEM && !syserr_cb) + fd_enomem (EV_A); + else if (errno != EINTR) + ev_syserr ("(libev) select"); + + return; + } + +#if EV_SELECT_USE_FD_SET + + { + int fd; + + for (fd = 0; fd < anfdmax; ++fd) + if (anfds [fd].events) + { + int events = 0; + #if EV_SELECT_IS_WINSOCKET + SOCKET handle = anfds [fd].handle; + #else + int handle = fd; + #endif + + if (FD_ISSET (handle, (fd_set *)vec_ro)) events |= EV_READ; + if (FD_ISSET (handle, (fd_set *)vec_wo)) events |= EV_WRITE; + #ifdef _WIN32 + if (FD_ISSET (handle, (fd_set *)vec_eo)) events |= EV_WRITE; + #endif + + if (ecb_expect_true (events)) + fd_event (EV_A_ fd, events); + } + } + +#else + + { + int word, bit; + for (word = vec_max; word--; ) + { + fd_mask word_r = ((fd_mask *)vec_ro) [word]; + fd_mask word_w = ((fd_mask *)vec_wo) [word]; + #ifdef _WIN32 + word_w |= ((fd_mask *)vec_eo) [word]; + #endif + + if (word_r || word_w) + for (bit = NFDBITS; bit--; ) + { + fd_mask mask = 1UL << bit; + int events = 0; + + events |= word_r & mask ? EV_READ : 0; + events |= word_w & mask ? EV_WRITE : 0; + + if (ecb_expect_true (events)) + fd_event (EV_A_ word * NFDBITS + bit, events); + } + } + } + +#endif +} + +inline_size +int +select_init (EV_P_ int flags) +{ + backend_mintime = EV_TS_CONST (1e-6); + backend_modify = select_modify; + backend_poll = select_poll; + +#if EV_SELECT_USE_FD_SET + vec_ri = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_ri); + vec_ro = ev_malloc (sizeof (fd_set)); + vec_wi = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_wi); + vec_wo = ev_malloc (sizeof (fd_set)); + #ifdef _WIN32 + vec_eo = ev_malloc (sizeof (fd_set)); + #endif +#else + vec_max = 0; + vec_ri = 0; + vec_ro = 0; + vec_wi = 0; + vec_wo = 0; + #ifdef _WIN32 + vec_eo = 0; + #endif +#endif + + return EVBACKEND_SELECT; +} + +inline_size +void +select_destroy (EV_P) +{ + ev_free (vec_ri); + ev_free (vec_ro); + ev_free (vec_wi); + ev_free (vec_wo); + #ifdef _WIN32 + ev_free (vec_eo); + #endif +} + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev_vars.h b/deps/ngtcp2/ngtcp2/third-party/libev/ev_vars.h new file mode 100644 index 000000000000..fb0c58316245 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev_vars.h @@ -0,0 +1,249 @@ +/* + * loop member variable declarations + * + * Copyright (c) 2007,2008,2009,2010,2011,2012,2013,2019 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#define VARx(type,name) VAR(name, type name) + +VARx(ev_tstamp, now_floor) /* last time we refreshed rt_time */ +VARx(ev_tstamp, mn_now) /* monotonic clock "now" */ +VARx(ev_tstamp, rtmn_diff) /* difference realtime - monotonic time */ + +/* for reverse feeding of events */ +VARx(W *, rfeeds) +VARx(int, rfeedmax) +VARx(int, rfeedcnt) + +VAR (pendings, ANPENDING *pendings [NUMPRI]) +VAR (pendingmax, int pendingmax [NUMPRI]) +VAR (pendingcnt, int pendingcnt [NUMPRI]) +VARx(int, pendingpri) /* highest priority currently pending */ +VARx(ev_prepare, pending_w) /* dummy pending watcher */ + +VARx(ev_tstamp, io_blocktime) +VARx(ev_tstamp, timeout_blocktime) + +VARx(int, backend) +VARx(int, activecnt) /* total number of active events ("refcount") */ +VARx(EV_ATOMIC_T, loop_done) /* signal by ev_break */ + +VARx(int, backend_fd) +VARx(ev_tstamp, backend_mintime) /* assumed typical timer resolution */ +VAR (backend_modify, void (*backend_modify)(EV_P_ int fd, int oev, int nev)) +VAR (backend_poll , void (*backend_poll)(EV_P_ ev_tstamp timeout)) + +VARx(ANFD *, anfds) +VARx(int, anfdmax) + +VAR (evpipe, int evpipe [2]) +VARx(ev_io, pipe_w) +VARx(EV_ATOMIC_T, pipe_write_wanted) +VARx(EV_ATOMIC_T, pipe_write_skipped) + +#if !defined(_WIN32) || EV_GENWRAP +VARx(pid_t, curpid) +#endif + +VARx(char, postfork) /* true if we need to recreate kernel state after fork */ + +#if EV_USE_SELECT || EV_GENWRAP +VARx(void *, vec_ri) +VARx(void *, vec_ro) +VARx(void *, vec_wi) +VARx(void *, vec_wo) +#if defined(_WIN32) || EV_GENWRAP +VARx(void *, vec_eo) +#endif +VARx(int, vec_max) +#endif + +#if EV_USE_POLL || EV_GENWRAP +VARx(struct pollfd *, polls) +VARx(int, pollmax) +VARx(int, pollcnt) +VARx(int *, pollidxs) /* maps fds into structure indices */ +VARx(int, pollidxmax) +#endif + +#if EV_USE_EPOLL || EV_GENWRAP +VARx(struct epoll_event *, epoll_events) +VARx(int, epoll_eventmax) +VARx(int *, epoll_eperms) +VARx(int, epoll_epermcnt) +VARx(int, epoll_epermmax) +#endif + +#if EV_USE_LINUXAIO || EV_GENWRAP +VARx(aio_context_t, linuxaio_ctx) +VARx(int, linuxaio_iteration) +VARx(struct aniocb **, linuxaio_iocbps) +VARx(int, linuxaio_iocbpmax) +VARx(struct iocb **, linuxaio_submits) +VARx(int, linuxaio_submitcnt) +VARx(int, linuxaio_submitmax) +VARx(ev_io, linuxaio_epoll_w) +#endif + +#if EV_USE_IOURING || EV_GENWRAP +VARx(int, iouring_fd) +VARx(unsigned, iouring_to_submit); +VARx(int, iouring_entries) +VARx(int, iouring_max_entries) +VARx(void *, iouring_sq_ring) +VARx(void *, iouring_cq_ring) +VARx(void *, iouring_sqes) +VARx(uint32_t, iouring_sq_ring_size) +VARx(uint32_t, iouring_cq_ring_size) +VARx(uint32_t, iouring_sqes_size) +VARx(uint32_t, iouring_sq_head) +VARx(uint32_t, iouring_sq_tail) +VARx(uint32_t, iouring_sq_ring_mask) +VARx(uint32_t, iouring_sq_ring_entries) +VARx(uint32_t, iouring_sq_flags) +VARx(uint32_t, iouring_sq_dropped) +VARx(uint32_t, iouring_sq_array) +VARx(uint32_t, iouring_cq_head) +VARx(uint32_t, iouring_cq_tail) +VARx(uint32_t, iouring_cq_ring_mask) +VARx(uint32_t, iouring_cq_ring_entries) +VARx(uint32_t, iouring_cq_overflow) +VARx(uint32_t, iouring_cq_cqes) +VARx(ev_tstamp, iouring_tfd_to) +VARx(int, iouring_tfd) +VARx(ev_io, iouring_tfd_w) +#endif + +#if EV_USE_KQUEUE || EV_GENWRAP +VARx(pid_t, kqueue_fd_pid) +VARx(struct kevent *, kqueue_changes) +VARx(int, kqueue_changemax) +VARx(int, kqueue_changecnt) +VARx(struct kevent *, kqueue_events) +VARx(int, kqueue_eventmax) +#endif + +#if EV_USE_PORT || EV_GENWRAP +VARx(struct port_event *, port_events) +VARx(int, port_eventmax) +#endif + +#if EV_USE_IOCP || EV_GENWRAP +VARx(HANDLE, iocp) +#endif + +VARx(int *, fdchanges) +VARx(int, fdchangemax) +VARx(int, fdchangecnt) + +VARx(ANHE *, timers) +VARx(int, timermax) +VARx(int, timercnt) + +#if EV_PERIODIC_ENABLE || EV_GENWRAP +VARx(ANHE *, periodics) +VARx(int, periodicmax) +VARx(int, periodiccnt) +#endif + +#if EV_IDLE_ENABLE || EV_GENWRAP +VAR (idles, ev_idle **idles [NUMPRI]) +VAR (idlemax, int idlemax [NUMPRI]) +VAR (idlecnt, int idlecnt [NUMPRI]) +#endif +VARx(int, idleall) /* total number */ + +VARx(struct ev_prepare **, prepares) +VARx(int, preparemax) +VARx(int, preparecnt) + +VARx(struct ev_check **, checks) +VARx(int, checkmax) +VARx(int, checkcnt) + +#if EV_FORK_ENABLE || EV_GENWRAP +VARx(struct ev_fork **, forks) +VARx(int, forkmax) +VARx(int, forkcnt) +#endif + +#if EV_CLEANUP_ENABLE || EV_GENWRAP +VARx(struct ev_cleanup **, cleanups) +VARx(int, cleanupmax) +VARx(int, cleanupcnt) +#endif + +#if EV_ASYNC_ENABLE || EV_GENWRAP +VARx(EV_ATOMIC_T, async_pending) +VARx(struct ev_async **, asyncs) +VARx(int, asyncmax) +VARx(int, asynccnt) +#endif + +#if EV_USE_INOTIFY || EV_GENWRAP +VARx(int, fs_fd) +VARx(ev_io, fs_w) +VARx(char, fs_2625) /* whether we are running in linux 2.6.25 or newer */ +VAR (fs_hash, ANFS fs_hash [EV_INOTIFY_HASHSIZE]) +#endif + +VARx(EV_ATOMIC_T, sig_pending) +#if EV_USE_SIGNALFD || EV_GENWRAP +VARx(int, sigfd) +VARx(ev_io, sigfd_w) +VARx(sigset_t, sigfd_set) +#endif + +#if EV_USE_TIMERFD || EV_GENWRAP +VARx(int, timerfd) /* timerfd for time jump detection */ +VARx(ev_io, timerfd_w) +#endif + +VARx(unsigned int, origflags) /* original loop flags */ + +#if EV_FEATURE_API || EV_GENWRAP +VARx(unsigned int, loop_count) /* total number of loop iterations/blocks */ +VARx(unsigned int, loop_depth) /* #ev_run enters - #ev_run leaves */ + +VARx(void *, userdata) +/* C++ doesn't support the ev_loop_callback typedef here. stinks. */ +VAR (release_cb, void (*release_cb)(EV_P) EV_NOEXCEPT) +VAR (acquire_cb, void (*acquire_cb)(EV_P) EV_NOEXCEPT) +VAR (invoke_cb , ev_loop_callback invoke_cb) +#endif + +#undef VARx + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev_win32.c b/deps/ngtcp2/ngtcp2/third-party/libev/ev_win32.c new file mode 100644 index 000000000000..97344c3e1cd4 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev_win32.c @@ -0,0 +1,162 @@ +/* + * libev win32 compatibility cruft (_not_ a backend) + * + * Copyright (c) 2007,2008,2009 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#ifdef _WIN32 + +/* note: the comment below could not be substantiated, but what would I care */ +/* MSDN says this is required to handle SIGFPE */ +/* my wild guess would be that using something floating-pointy is required */ +/* for the crt to do something about it */ +volatile double SIGFPE_REQ = 0.0f; + +static SOCKET +ev_tcp_socket (void) +{ +#if EV_USE_WSASOCKET + return WSASocket (AF_INET, SOCK_STREAM, 0, 0, 0, 0); +#else + return socket (AF_INET, SOCK_STREAM, 0); +#endif +} + +/* oh, the humanity! */ +static int +ev_pipe (int filedes [2]) +{ + struct sockaddr_in addr = { 0 }; + int addr_size = sizeof (addr); + struct sockaddr_in adr2; + int adr2_size = sizeof (adr2); + SOCKET listener; + SOCKET sock [2] = { -1, -1 }; + + if ((listener = ev_tcp_socket ()) == INVALID_SOCKET) + return -1; + + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); + addr.sin_port = 0; + + if (bind (listener, (struct sockaddr *)&addr, addr_size)) + goto fail; + + if (getsockname (listener, (struct sockaddr *)&addr, &addr_size)) + goto fail; + + if (listen (listener, 1)) + goto fail; + + if ((sock [0] = ev_tcp_socket ()) == INVALID_SOCKET) + goto fail; + + if (connect (sock [0], (struct sockaddr *)&addr, addr_size)) + goto fail; + + /* TODO: returns INVALID_SOCKET on winsock accept, not < 0. fix it */ + /* when convenient, probably by just removing error checking altogether? */ + if ((sock [1] = accept (listener, 0, 0)) < 0) + goto fail; + + /* windows vista returns fantasy port numbers for sockets: + * example for two interconnected tcp sockets: + * + * (Socket::unpack_sockaddr_in getsockname $sock0)[0] == 53364 + * (Socket::unpack_sockaddr_in getpeername $sock0)[0] == 53363 + * (Socket::unpack_sockaddr_in getsockname $sock1)[0] == 53363 + * (Socket::unpack_sockaddr_in getpeername $sock1)[0] == 53365 + * + * wow! tridirectional sockets! + * + * this way of checking ports seems to work: + */ + if (getpeername (sock [0], (struct sockaddr *)&addr, &addr_size)) + goto fail; + + if (getsockname (sock [1], (struct sockaddr *)&adr2, &adr2_size)) + goto fail; + + errno = WSAEINVAL; + if (addr_size != adr2_size + || addr.sin_addr.s_addr != adr2.sin_addr.s_addr /* just to be sure, I mean, it's windows */ + || addr.sin_port != adr2.sin_port) + goto fail; + + closesocket (listener); + +#if EV_SELECT_IS_WINSOCKET + filedes [0] = EV_WIN32_HANDLE_TO_FD (sock [0]); + filedes [1] = EV_WIN32_HANDLE_TO_FD (sock [1]); +#else + /* when select isn't winsocket, we also expect socket, connect, accept etc. + * to work on fds */ + filedes [0] = sock [0]; + filedes [1] = sock [1]; +#endif + + return 0; + +fail: + closesocket (listener); + + if (sock [0] != INVALID_SOCKET) closesocket (sock [0]); + if (sock [1] != INVALID_SOCKET) closesocket (sock [1]); + + return -1; +} + +#undef pipe +#define pipe(filedes) ev_pipe (filedes) + +#define EV_HAVE_EV_TIME 1 +ev_tstamp +ev_time (void) +{ + FILETIME ft; + ULARGE_INTEGER ui; + + GetSystemTimeAsFileTime (&ft); + ui.u.LowPart = ft.dwLowDateTime; + ui.u.HighPart = ft.dwHighDateTime; + + /* also, msvc cannot convert ulonglong to double... yes, it is that sucky */ + return EV_TS_FROM_USEC (((LONGLONG)(ui.QuadPart - 116444736000000000) * 1e-1)); +} + +#endif + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ev_wrap.h b/deps/ngtcp2/ngtcp2/third-party/libev/ev_wrap.h new file mode 100644 index 000000000000..45d793cedb8e --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ev_wrap.h @@ -0,0 +1,272 @@ +/* DO NOT EDIT, automatically generated by update_ev_wrap */ +#ifndef EV_WRAP_H +#define EV_WRAP_H +#define acquire_cb ((loop)->acquire_cb) +#define activecnt ((loop)->activecnt) +#define anfdmax ((loop)->anfdmax) +#define anfds ((loop)->anfds) +#define async_pending ((loop)->async_pending) +#define asynccnt ((loop)->asynccnt) +#define asyncmax ((loop)->asyncmax) +#define asyncs ((loop)->asyncs) +#define backend ((loop)->backend) +#define backend_fd ((loop)->backend_fd) +#define backend_mintime ((loop)->backend_mintime) +#define backend_modify ((loop)->backend_modify) +#define backend_poll ((loop)->backend_poll) +#define checkcnt ((loop)->checkcnt) +#define checkmax ((loop)->checkmax) +#define checks ((loop)->checks) +#define cleanupcnt ((loop)->cleanupcnt) +#define cleanupmax ((loop)->cleanupmax) +#define cleanups ((loop)->cleanups) +#define curpid ((loop)->curpid) +#define epoll_epermcnt ((loop)->epoll_epermcnt) +#define epoll_epermmax ((loop)->epoll_epermmax) +#define epoll_eperms ((loop)->epoll_eperms) +#define epoll_eventmax ((loop)->epoll_eventmax) +#define epoll_events ((loop)->epoll_events) +#define evpipe ((loop)->evpipe) +#define fdchangecnt ((loop)->fdchangecnt) +#define fdchangemax ((loop)->fdchangemax) +#define fdchanges ((loop)->fdchanges) +#define forkcnt ((loop)->forkcnt) +#define forkmax ((loop)->forkmax) +#define forks ((loop)->forks) +#define fs_2625 ((loop)->fs_2625) +#define fs_fd ((loop)->fs_fd) +#define fs_hash ((loop)->fs_hash) +#define fs_w ((loop)->fs_w) +#define idleall ((loop)->idleall) +#define idlecnt ((loop)->idlecnt) +#define idlemax ((loop)->idlemax) +#define idles ((loop)->idles) +#define invoke_cb ((loop)->invoke_cb) +#define io_blocktime ((loop)->io_blocktime) +#define iocp ((loop)->iocp) +#define iouring_cq_cqes ((loop)->iouring_cq_cqes) +#define iouring_cq_head ((loop)->iouring_cq_head) +#define iouring_cq_overflow ((loop)->iouring_cq_overflow) +#define iouring_cq_ring ((loop)->iouring_cq_ring) +#define iouring_cq_ring_entries ((loop)->iouring_cq_ring_entries) +#define iouring_cq_ring_mask ((loop)->iouring_cq_ring_mask) +#define iouring_cq_ring_size ((loop)->iouring_cq_ring_size) +#define iouring_cq_tail ((loop)->iouring_cq_tail) +#define iouring_entries ((loop)->iouring_entries) +#define iouring_fd ((loop)->iouring_fd) +#define iouring_max_entries ((loop)->iouring_max_entries) +#define iouring_sq_array ((loop)->iouring_sq_array) +#define iouring_sq_dropped ((loop)->iouring_sq_dropped) +#define iouring_sq_flags ((loop)->iouring_sq_flags) +#define iouring_sq_head ((loop)->iouring_sq_head) +#define iouring_sq_ring ((loop)->iouring_sq_ring) +#define iouring_sq_ring_entries ((loop)->iouring_sq_ring_entries) +#define iouring_sq_ring_mask ((loop)->iouring_sq_ring_mask) +#define iouring_sq_ring_size ((loop)->iouring_sq_ring_size) +#define iouring_sq_tail ((loop)->iouring_sq_tail) +#define iouring_sqes ((loop)->iouring_sqes) +#define iouring_sqes_size ((loop)->iouring_sqes_size) +#define iouring_tfd ((loop)->iouring_tfd) +#define iouring_tfd_to ((loop)->iouring_tfd_to) +#define iouring_tfd_w ((loop)->iouring_tfd_w) +#define iouring_to_submit ((loop)->iouring_to_submit) +#define kqueue_changecnt ((loop)->kqueue_changecnt) +#define kqueue_changemax ((loop)->kqueue_changemax) +#define kqueue_changes ((loop)->kqueue_changes) +#define kqueue_eventmax ((loop)->kqueue_eventmax) +#define kqueue_events ((loop)->kqueue_events) +#define kqueue_fd_pid ((loop)->kqueue_fd_pid) +#define linuxaio_ctx ((loop)->linuxaio_ctx) +#define linuxaio_epoll_w ((loop)->linuxaio_epoll_w) +#define linuxaio_iocbpmax ((loop)->linuxaio_iocbpmax) +#define linuxaio_iocbps ((loop)->linuxaio_iocbps) +#define linuxaio_iteration ((loop)->linuxaio_iteration) +#define linuxaio_submitcnt ((loop)->linuxaio_submitcnt) +#define linuxaio_submitmax ((loop)->linuxaio_submitmax) +#define linuxaio_submits ((loop)->linuxaio_submits) +#define loop_count ((loop)->loop_count) +#define loop_depth ((loop)->loop_depth) +#define loop_done ((loop)->loop_done) +#define mn_now ((loop)->mn_now) +#define now_floor ((loop)->now_floor) +#define origflags ((loop)->origflags) +#define pending_w ((loop)->pending_w) +#define pendingcnt ((loop)->pendingcnt) +#define pendingmax ((loop)->pendingmax) +#define pendingpri ((loop)->pendingpri) +#define pendings ((loop)->pendings) +#define periodiccnt ((loop)->periodiccnt) +#define periodicmax ((loop)->periodicmax) +#define periodics ((loop)->periodics) +#define pipe_w ((loop)->pipe_w) +#define pipe_write_skipped ((loop)->pipe_write_skipped) +#define pipe_write_wanted ((loop)->pipe_write_wanted) +#define pollcnt ((loop)->pollcnt) +#define pollidxmax ((loop)->pollidxmax) +#define pollidxs ((loop)->pollidxs) +#define pollmax ((loop)->pollmax) +#define polls ((loop)->polls) +#define port_eventmax ((loop)->port_eventmax) +#define port_events ((loop)->port_events) +#define postfork ((loop)->postfork) +#define preparecnt ((loop)->preparecnt) +#define preparemax ((loop)->preparemax) +#define prepares ((loop)->prepares) +#define release_cb ((loop)->release_cb) +#define rfeedcnt ((loop)->rfeedcnt) +#define rfeedmax ((loop)->rfeedmax) +#define rfeeds ((loop)->rfeeds) +#define rtmn_diff ((loop)->rtmn_diff) +#define sig_pending ((loop)->sig_pending) +#define sigfd ((loop)->sigfd) +#define sigfd_set ((loop)->sigfd_set) +#define sigfd_w ((loop)->sigfd_w) +#define timeout_blocktime ((loop)->timeout_blocktime) +#define timercnt ((loop)->timercnt) +#define timerfd ((loop)->timerfd) +#define timerfd_w ((loop)->timerfd_w) +#define timermax ((loop)->timermax) +#define timers ((loop)->timers) +#define userdata ((loop)->userdata) +#define vec_eo ((loop)->vec_eo) +#define vec_max ((loop)->vec_max) +#define vec_ri ((loop)->vec_ri) +#define vec_ro ((loop)->vec_ro) +#define vec_wi ((loop)->vec_wi) +#define vec_wo ((loop)->vec_wo) +#else +#undef EV_WRAP_H +#undef acquire_cb +#undef activecnt +#undef anfdmax +#undef anfds +#undef async_pending +#undef asynccnt +#undef asyncmax +#undef asyncs +#undef backend +#undef backend_fd +#undef backend_mintime +#undef backend_modify +#undef backend_poll +#undef checkcnt +#undef checkmax +#undef checks +#undef cleanupcnt +#undef cleanupmax +#undef cleanups +#undef curpid +#undef epoll_epermcnt +#undef epoll_epermmax +#undef epoll_eperms +#undef epoll_eventmax +#undef epoll_events +#undef evpipe +#undef fdchangecnt +#undef fdchangemax +#undef fdchanges +#undef forkcnt +#undef forkmax +#undef forks +#undef fs_2625 +#undef fs_fd +#undef fs_hash +#undef fs_w +#undef idleall +#undef idlecnt +#undef idlemax +#undef idles +#undef invoke_cb +#undef io_blocktime +#undef iocp +#undef iouring_cq_cqes +#undef iouring_cq_head +#undef iouring_cq_overflow +#undef iouring_cq_ring +#undef iouring_cq_ring_entries +#undef iouring_cq_ring_mask +#undef iouring_cq_ring_size +#undef iouring_cq_tail +#undef iouring_entries +#undef iouring_fd +#undef iouring_max_entries +#undef iouring_sq_array +#undef iouring_sq_dropped +#undef iouring_sq_flags +#undef iouring_sq_head +#undef iouring_sq_ring +#undef iouring_sq_ring_entries +#undef iouring_sq_ring_mask +#undef iouring_sq_ring_size +#undef iouring_sq_tail +#undef iouring_sqes +#undef iouring_sqes_size +#undef iouring_tfd +#undef iouring_tfd_to +#undef iouring_tfd_w +#undef iouring_to_submit +#undef kqueue_changecnt +#undef kqueue_changemax +#undef kqueue_changes +#undef kqueue_eventmax +#undef kqueue_events +#undef kqueue_fd_pid +#undef linuxaio_ctx +#undef linuxaio_epoll_w +#undef linuxaio_iocbpmax +#undef linuxaio_iocbps +#undef linuxaio_iteration +#undef linuxaio_submitcnt +#undef linuxaio_submitmax +#undef linuxaio_submits +#undef loop_count +#undef loop_depth +#undef loop_done +#undef mn_now +#undef now_floor +#undef origflags +#undef pending_w +#undef pendingcnt +#undef pendingmax +#undef pendingpri +#undef pendings +#undef periodiccnt +#undef periodicmax +#undef periodics +#undef pipe_w +#undef pipe_write_skipped +#undef pipe_write_wanted +#undef pollcnt +#undef pollidxmax +#undef pollidxs +#undef pollmax +#undef polls +#undef port_eventmax +#undef port_events +#undef postfork +#undef preparecnt +#undef preparemax +#undef prepares +#undef release_cb +#undef rfeedcnt +#undef rfeedmax +#undef rfeeds +#undef rtmn_diff +#undef sig_pending +#undef sigfd +#undef sigfd_set +#undef sigfd_w +#undef timeout_blocktime +#undef timercnt +#undef timerfd +#undef timerfd_w +#undef timermax +#undef timers +#undef userdata +#undef vec_eo +#undef vec_max +#undef vec_ri +#undef vec_ro +#undef vec_wi +#undef vec_wo +#endif diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/event.c b/deps/ngtcp2/ngtcp2/third-party/libev/event.c new file mode 100644 index 000000000000..5586cd353835 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/event.c @@ -0,0 +1,425 @@ +/* + * libevent compatibility layer + * + * Copyright (c) 2007,2008,2009,2010,2012 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#include +#include +#include + +#ifdef EV_EVENT_H +# include EV_EVENT_H +#else +# include "event.h" +#endif + +#if EV_MULTIPLICITY +# define dLOOPev struct ev_loop *loop = (struct ev_loop *)ev->ev_base +# define dLOOPbase struct ev_loop *loop = (struct ev_loop *)base +#else +# define dLOOPev +# define dLOOPbase +#endif + +/* never accessed, will always be cast from/to ev_loop */ +struct event_base +{ + int dummy; +}; + +static struct event_base *ev_x_cur; + +static ev_tstamp +ev_tv_get (struct timeval *tv) +{ + if (tv) + { + ev_tstamp after = tv->tv_sec + tv->tv_usec * 1e-6; + return after ? after : 1e-6; + } + else + return -1.; +} + +#define EVENT_STRINGIFY(s) # s +#define EVENT_VERSION(a,b) EVENT_STRINGIFY (a) "." EVENT_STRINGIFY (b) + +const char * +event_get_version (void) +{ + /* returns ABI, not API or library, version */ + return EVENT_VERSION (EV_VERSION_MAJOR, EV_VERSION_MINOR); +} + +const char * +event_get_method (void) +{ + return "libev"; +} + +void *event_init (void) +{ +#if EV_MULTIPLICITY + if (ev_x_cur) + ev_x_cur = (struct event_base *)ev_loop_new (EVFLAG_AUTO); + else + ev_x_cur = (struct event_base *)ev_default_loop (EVFLAG_AUTO); +#else + assert (("libev: multiple event bases not supported when not compiled with EV_MULTIPLICITY", !ev_x_cur)); + + ev_x_cur = (struct event_base *)(long)ev_default_loop (EVFLAG_AUTO); +#endif + + return ev_x_cur; +} + +const char * +event_base_get_method (const struct event_base *base) +{ + return "libev"; +} + +struct event_base * +event_base_new (void) +{ +#if EV_MULTIPLICITY + return (struct event_base *)ev_loop_new (EVFLAG_AUTO); +#else + assert (("libev: multiple event bases not supported when not compiled with EV_MULTIPLICITY")); + return NULL; +#endif +} + +void event_base_free (struct event_base *base) +{ + dLOOPbase; + +#if EV_MULTIPLICITY + if (!ev_is_default_loop (loop)) + ev_loop_destroy (loop); +#endif +} + +int event_dispatch (void) +{ + return event_base_dispatch (ev_x_cur); +} + +#ifdef EV_STANDALONE +void event_set_log_callback (event_log_cb cb) +{ + /* nop */ +} +#endif + +int event_loop (int flags) +{ + return event_base_loop (ev_x_cur, flags); +} + +int event_loopexit (struct timeval *tv) +{ + return event_base_loopexit (ev_x_cur, tv); +} + +event_callback_fn event_get_callback +(const struct event *ev) +{ + return ev->ev_callback; +} + +static void +ev_x_cb (struct event *ev, int revents) +{ + revents &= EV_READ | EV_WRITE | EV_TIMER | EV_SIGNAL; + + ev->ev_res = revents; + ev->ev_callback (ev->ev_fd, (short)revents, ev->ev_arg); +} + +static void +ev_x_cb_sig (EV_P_ struct ev_signal *w, int revents) +{ + struct event *ev = (struct event *)(((char *)w) - offsetof (struct event, iosig.sig)); + + if (revents & EV_ERROR) + event_del (ev); + + ev_x_cb (ev, revents); +} + +static void +ev_x_cb_io (EV_P_ struct ev_io *w, int revents) +{ + struct event *ev = (struct event *)(((char *)w) - offsetof (struct event, iosig.io)); + + if ((revents & EV_ERROR) || !(ev->ev_events & EV_PERSIST)) + event_del (ev); + + ev_x_cb (ev, revents); +} + +static void +ev_x_cb_to (EV_P_ struct ev_timer *w, int revents) +{ + struct event *ev = (struct event *)(((char *)w) - offsetof (struct event, to)); + + event_del (ev); + + ev_x_cb (ev, revents); +} + +void event_set (struct event *ev, int fd, short events, void (*cb)(int, short, void *), void *arg) +{ + if (events & EV_SIGNAL) + ev_init (&ev->iosig.sig, ev_x_cb_sig); + else + ev_init (&ev->iosig.io, ev_x_cb_io); + + ev_init (&ev->to, ev_x_cb_to); + + ev->ev_base = ev_x_cur; /* not threadsafe, but it's how libevent works */ + ev->ev_fd = fd; + ev->ev_events = events; + ev->ev_pri = 0; + ev->ev_callback = cb; + ev->ev_arg = arg; + ev->ev_res = 0; + ev->ev_flags = EVLIST_INIT; +} + +int event_once (int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv) +{ + return event_base_once (ev_x_cur, fd, events, cb, arg, tv); +} + +int event_add (struct event *ev, struct timeval *tv) +{ + dLOOPev; + + if (ev->ev_events & EV_SIGNAL) + { + if (!ev_is_active (&ev->iosig.sig)) + { + ev_signal_set (&ev->iosig.sig, ev->ev_fd); + ev_signal_start (EV_A_ &ev->iosig.sig); + + ev->ev_flags |= EVLIST_SIGNAL; + } + } + else if (ev->ev_events & (EV_READ | EV_WRITE)) + { + if (!ev_is_active (&ev->iosig.io)) + { + ev_io_set (&ev->iosig.io, ev->ev_fd, ev->ev_events & (EV_READ | EV_WRITE)); + ev_io_start (EV_A_ &ev->iosig.io); + + ev->ev_flags |= EVLIST_INSERTED; + } + } + + if (tv) + { + ev->to.repeat = ev_tv_get (tv); + ev_timer_again (EV_A_ &ev->to); + ev->ev_flags |= EVLIST_TIMEOUT; + } + else + { + ev_timer_stop (EV_A_ &ev->to); + ev->ev_flags &= ~EVLIST_TIMEOUT; + } + + ev->ev_flags |= EVLIST_ACTIVE; + + return 0; +} + +int event_del (struct event *ev) +{ + dLOOPev; + + if (ev->ev_events & EV_SIGNAL) + ev_signal_stop (EV_A_ &ev->iosig.sig); + else if (ev->ev_events & (EV_READ | EV_WRITE)) + ev_io_stop (EV_A_ &ev->iosig.io); + + if (ev_is_active (&ev->to)) + ev_timer_stop (EV_A_ &ev->to); + + ev->ev_flags = EVLIST_INIT; + + return 0; +} + +void event_active (struct event *ev, int res, short ncalls) +{ + dLOOPev; + + if (res & EV_TIMEOUT) + ev_feed_event (EV_A_ &ev->to, res & EV_TIMEOUT); + + if (res & EV_SIGNAL) + ev_feed_event (EV_A_ &ev->iosig.sig, res & EV_SIGNAL); + + if (res & (EV_READ | EV_WRITE)) + ev_feed_event (EV_A_ &ev->iosig.io, res & (EV_READ | EV_WRITE)); +} + +int event_pending (struct event *ev, short events, struct timeval *tv) +{ + short revents = 0; + dLOOPev; + + if (ev->ev_events & EV_SIGNAL) + { + /* sig */ + if (ev_is_active (&ev->iosig.sig) || ev_is_pending (&ev->iosig.sig)) + revents |= EV_SIGNAL; + } + else if (ev->ev_events & (EV_READ | EV_WRITE)) + { + /* io */ + if (ev_is_active (&ev->iosig.io) || ev_is_pending (&ev->iosig.io)) + revents |= ev->ev_events & (EV_READ | EV_WRITE); + } + + if (ev->ev_events & EV_TIMEOUT || ev_is_active (&ev->to) || ev_is_pending (&ev->to)) + { + revents |= EV_TIMEOUT; + + if (tv) + { + ev_tstamp at = ev_now (EV_A); + + tv->tv_sec = (long)at; + tv->tv_usec = (long)((at - (ev_tstamp)tv->tv_sec) * 1e6); + } + } + + return events & revents; +} + +int event_priority_init (int npri) +{ + return event_base_priority_init (ev_x_cur, npri); +} + +int event_priority_set (struct event *ev, int pri) +{ + ev->ev_pri = pri; + + return 0; +} + +int event_base_set (struct event_base *base, struct event *ev) +{ + ev->ev_base = base; + + return 0; +} + +int event_base_loop (struct event_base *base, int flags) +{ + dLOOPbase; + + return !ev_run (EV_A_ flags); +} + +int event_base_dispatch (struct event_base *base) +{ + return event_base_loop (base, 0); +} + +static void +ev_x_loopexit_cb (int revents, void *base) +{ + dLOOPbase; + + ev_break (EV_A_ EVBREAK_ONE); +} + +int event_base_loopexit (struct event_base *base, struct timeval *tv) +{ + ev_tstamp after = ev_tv_get (tv); + dLOOPbase; + + ev_once (EV_A_ -1, 0, after >= 0. ? after : 0., ev_x_loopexit_cb, (void *)base); + + return 0; +} + +struct ev_x_once +{ + int fd; + void (*cb)(int, short, void *); + void *arg; +}; + +static void +ev_x_once_cb (int revents, void *arg) +{ + struct ev_x_once *once = (struct ev_x_once *)arg; + + once->cb (once->fd, (short)revents, once->arg); + free (once); +} + +int event_base_once (struct event_base *base, int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv) +{ + struct ev_x_once *once = (struct ev_x_once *)malloc (sizeof (struct ev_x_once)); + dLOOPbase; + + if (!once) + return -1; + + once->fd = fd; + once->cb = cb; + once->arg = arg; + + ev_once (EV_A_ fd, events & (EV_READ | EV_WRITE), ev_tv_get (tv), ev_x_once_cb, (void *)once); + + return 0; +} + +int event_base_priority_init (struct event_base *base, int npri) +{ + /*dLOOPbase;*/ + + return 0; +} + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/event.h b/deps/ngtcp2/ngtcp2/third-party/libev/event.h new file mode 100644 index 000000000000..aa81928f3564 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/event.h @@ -0,0 +1,177 @@ +/* + * libevent compatibility header, only core events supported + * + * Copyright (c) 2007,2008,2010,2012 Marc Alexander Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- + * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- + * CIAL, 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 OTH- + * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, the contents of this file may be used under the terms of + * the GNU General Public License ("GPL") version 2 or any later version, + * in which case the provisions of the GPL are applicable instead of + * the above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the BSD license, indicate your decision + * by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file under + * either the BSD or the GPL. + */ + +#ifndef EVENT_H_ +#define EVENT_H_ + +#ifdef EV_H +# include EV_H +#else +# include "ev.h" +#endif + +#ifndef EVLOOP_NONBLOCK +# define EVLOOP_NONBLOCK EVRUN_NOWAIT +#endif +#ifndef EVLOOP_ONESHOT +# define EVLOOP_ONESHOT EVRUN_ONCE +#endif +#ifndef EV_TIMEOUT +# define EV_TIMEOUT EV_TIMER +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* we need sys/time.h for struct timeval only */ +#if !defined (WIN32) || defined (__MINGW32__) +# include /* mingw seems to need this, for whatever reason */ +# include +#endif + +struct event_base; + +#define EVLIST_TIMEOUT 0x01 +#define EVLIST_INSERTED 0x02 +#define EVLIST_SIGNAL 0x04 +#define EVLIST_ACTIVE 0x08 +#define EVLIST_INTERNAL 0x10 +#define EVLIST_INIT 0x80 + +typedef void (*event_callback_fn)(int, short, void *); + +struct event +{ + /* libev watchers we map onto */ + union { + struct ev_io io; + struct ev_signal sig; + } iosig; + struct ev_timer to; + + /* compatibility slots */ + struct event_base *ev_base; + event_callback_fn ev_callback; + void *ev_arg; + int ev_fd; + int ev_pri; + int ev_res; + int ev_flags; + short ev_events; +}; + +event_callback_fn event_get_callback (const struct event *ev); + +#define EV_READ EV_READ +#define EV_WRITE EV_WRITE +#define EV_PERSIST 0x10 +#define EV_ET 0x20 /* nop */ + +#define EVENT_SIGNAL(ev) ((int) (ev)->ev_fd) +#define EVENT_FD(ev) ((int) (ev)->ev_fd) + +#define event_initialized(ev) ((ev)->ev_flags & EVLIST_INIT) + +#define evtimer_add(ev,tv) event_add (ev, tv) +#define evtimer_set(ev,cb,data) event_set (ev, -1, 0, cb, data) +#define evtimer_del(ev) event_del (ev) +#define evtimer_pending(ev,tv) event_pending (ev, EV_TIMEOUT, tv) +#define evtimer_initialized(ev) event_initialized (ev) + +#define timeout_add(ev,tv) evtimer_add (ev, tv) +#define timeout_set(ev,cb,data) evtimer_set (ev, cb, data) +#define timeout_del(ev) evtimer_del (ev) +#define timeout_pending(ev,tv) evtimer_pending (ev, tv) +#define timeout_initialized(ev) evtimer_initialized (ev) + +#define signal_add(ev,tv) event_add (ev, tv) +#define signal_set(ev,sig,cb,data) event_set (ev, sig, EV_SIGNAL | EV_PERSIST, cb, data) +#define signal_del(ev) event_del (ev) +#define signal_pending(ev,tv) event_pending (ev, EV_SIGNAL, tv) +#define signal_initialized(ev) event_initialized (ev) + +const char *event_get_version (void); +const char *event_get_method (void); + +void *event_init (void); +void event_base_free (struct event_base *base); + +#define EVLOOP_ONCE EVLOOP_ONESHOT +int event_loop (int); +int event_loopexit (struct timeval *tv); +int event_dispatch (void); + +#define _EVENT_LOG_DEBUG 0 +#define _EVENT_LOG_MSG 1 +#define _EVENT_LOG_WARN 2 +#define _EVENT_LOG_ERR 3 +typedef void (*event_log_cb)(int severity, const char *msg); +void event_set_log_callback(event_log_cb cb); + +void event_set (struct event *ev, int fd, short events, void (*cb)(int, short, void *), void *arg); +int event_once (int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv); + +int event_add (struct event *ev, struct timeval *tv); +int event_del (struct event *ev); +void event_active (struct event *ev, int res, short ncalls); /* ncalls is being ignored */ + +int event_pending (struct event *ev, short, struct timeval *tv); + +int event_priority_init (int npri); +int event_priority_set (struct event *ev, int pri); + +struct event_base *event_base_new (void); +const char *event_base_get_method (const struct event_base *); +int event_base_set (struct event_base *base, struct event *ev); +int event_base_loop (struct event_base *base, int); +int event_base_loopexit (struct event_base *base, struct timeval *tv); +int event_base_dispatch (struct event_base *base); +int event_base_once (struct event_base *base, int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv); +int event_base_priority_init (struct event_base *base, int fd); + +/* next line is different in the libevent+libev version */ +/*libevent-include*/ + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/install-sh b/deps/ngtcp2/ngtcp2/third-party/libev/install-sh new file mode 100755 index 000000000000..8175c640fe62 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/install-sh @@ -0,0 +1,518 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2018-03-11.20; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + # Note that $RANDOM variable is not portable (e.g. dash); Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p' feature. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/libev.m4 b/deps/ngtcp2/ngtcp2/third-party/libev/libev.m4 new file mode 100644 index 000000000000..f859eff27c19 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/libev.m4 @@ -0,0 +1,47 @@ +dnl this file is part of libev, do not make local modifications +dnl http://software.schmorp.de/pkg/libev + +dnl libev support +AC_CHECK_HEADERS(sys/inotify.h sys/epoll.h sys/event.h port.h poll.h sys/timerfd.h) +AC_CHECK_HEADERS(sys/select.h sys/eventfd.h sys/signalfd.h linux/aio_abi.h linux/fs.h) + +AC_CHECK_FUNCS(inotify_init epoll_ctl kqueue port_create poll select eventfd signalfd) + +AC_CHECK_FUNCS(clock_gettime, [], [ + dnl on linux, try syscall wrapper first + if test $(uname) = Linux; then + AC_MSG_CHECKING(for clock_gettime syscall) + AC_LINK_IFELSE([AC_LANG_PROGRAM( + [#include + #include + #include ], + [struct timespec ts; int status = syscall (SYS_clock_gettime, CLOCK_REALTIME, &ts)])], + [ac_have_clock_syscall=1 + AC_DEFINE(HAVE_CLOCK_SYSCALL, 1, Define to 1 to use the syscall interface for clock_gettime) + AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no)]) + fi + if test -z "$LIBEV_M4_AVOID_LIBRT" && test -z "$ac_have_clock_syscall"; then + AC_CHECK_LIB(rt, clock_gettime) + unset ac_cv_func_clock_gettime + AC_CHECK_FUNCS(clock_gettime) + fi +]) + +AC_CHECK_FUNCS(nanosleep, [], [ + if test -z "$LIBEV_M4_AVOID_LIBRT"; then + AC_CHECK_LIB(rt, nanosleep) + unset ac_cv_func_nanosleep + AC_CHECK_FUNCS(nanosleep) + fi +]) + +AC_CHECK_TYPE(__kernel_rwf_t, [ + AC_DEFINE(HAVE_KERNEL_RWF_T, 1, Define to 1 if linux/fs.h defined kernel_rwf_t) +], [], [#include ]) + +if test -z "$LIBEV_M4_AVOID_LIBM"; then + LIBM=m +fi +AC_SEARCH_LIBS(floor, $LIBM, [AC_DEFINE(HAVE_FLOOR, 1, Define to 1 if the floor function is available)]) + diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/ltmain.sh b/deps/ngtcp2/ngtcp2/third-party/libev/ltmain.sh new file mode 100644 index 000000000000..c12c197be787 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/ltmain.sh @@ -0,0 +1,11249 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.6 Debian-2.4.6-9" +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2015-10-07.11; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + _G_rc_run_hooks=false + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + if eval $_G_hook '"$@"'; then + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + _G_rc_run_hooks=: + fi + done + + $_G_rc_run_hooks && func_run_hooks_result=$_G_hook_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, you may remove/edit +# any options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. In this case you also must return $EXIT_SUCCESS to let the +# hook's caller know that it should pay attention to +# '_result'. Returning $EXIT_FAILURE signalizes that +# arguments are left untouched by the hook and therefore caller will ignore the +# result variable. +# +# Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# # No change in '$@' (ignored completely by this hook). There is +# # no need to do the equivalent (but slower) action: +# # func_quote_for_eval ${1+"$@"} +# # my_options_prep_result=$func_quote_for_eval_result +# false +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# args_changed=false +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: +# args_changed=: +# ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# args_changed=: +# ;; +# *) # Make sure the first unrecognised option "$_G_opt" +# # is added back to "$@", we could need that later +# # if $args_changed is true. +# set dummy "$_G_opt" ${1+"$@"}; shift; break ;; +# esac +# done +# +# if $args_changed; then +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# fi +# +# $args_changed +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# false +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll also need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options_finish [ARG]... +# ---------------------------- +# Finishing the option parse loop (call 'func_options' hooks ATM). +func_options_finish () +{ + $debug_cmd + + _G_func_options_finish_exit=false + if func_run_hooks func_options ${1+"$@"}; then + func_options_finish_result=$func_run_hooks_result + _G_func_options_finish_exit=: + fi + + $_G_func_options_finish_exit +} + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + _G_rc_options=false + + for my_func in options_prep parse_options validate_options options_finish + do + if eval func_$my_func '${1+"$@"}'; then + eval _G_res_var='$'"func_${my_func}_result" + eval set dummy "$_G_res_var" ; shift + _G_rc_options=: + fi + done + + # Save modified positional parameters for caller. As a top-level + # options-parser function we always need to set the 'func_options_result' + # variable (regardless the $_G_rc_options value). + if $_G_rc_options; then + func_options_result=$_G_res_var + else + func_quote_for_eval ${1+"$@"} + func_options_result=$func_quote_for_eval_result + fi + + $_G_rc_options +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propagate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning $EXIT_SUCCESS (otherwise $EXIT_FAILURE is returned). +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + _G_rc_options_prep=false + if func_run_hooks func_options_prep ${1+"$@"}; then + _G_rc_options_prep=: + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result + fi + + $_G_rc_options_prep +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + _G_rc_parse_options=false + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + if func_run_hooks func_parse_options ${1+"$@"}; then + eval set dummy "$func_run_hooks_result"; shift + _G_rc_parse_options=: + fi + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_match_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + if test $# = 0 && func_missing_arg $_G_opt; then + _G_rc_parse_options=: + break + fi + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) _G_rc_parse_options=: ; break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift + _G_match_parse_options=false + break + ;; + esac + + $_G_match_parse_options && _G_rc_parse_options=: + done + + + if $_G_rc_parse_options; then + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result + fi + + $_G_rc_parse_options +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + _G_rc_validate_options=false + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + if func_run_hooks func_validate_options ${1+"$@"}; then + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result + _G_rc_validate_options=: + fi + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + $_G_rc_validate_options +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname $scriptversion Debian-2.4.6-9 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + _G_rc_lt_options_prep=: + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + *) + _G_rc_lt_options_prep=false + ;; + esac + + if $_G_rc_lt_options_prep; then + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result + fi + + $_G_rc_lt_options_prep +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + _G_rc_lt_parse_options=false + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_match_lt_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"} ; shift + _G_match_lt_parse_options=false + break + ;; + esac + $_G_match_lt_parse_options && _G_rc_lt_parse_options=: + done + + if $_G_rc_lt_parse_options; then + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result + fi + + $_G_rc_lt_parse_options +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -specs=* GCC specs files + # -stdlib=* select c++ std lib with clang + # -fsanitize=* Clang/GCC memory and address sanitizer + # -fuse-ld=* Linker select flags for GCC + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ + -specs=*|-fsanitize=*|-fuse-ld=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type '$version_type'" + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/missing b/deps/ngtcp2/ngtcp2/third-party/libev/missing new file mode 100755 index 000000000000..625aeb11897a --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=https://www.perl.org/ +flex_URL=https://github.com/westes/flex +gnu_software_URL=https://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/deps/ngtcp2/ngtcp2/third-party/libev/mkinstalldirs b/deps/ngtcp2/ngtcp2/third-party/libev/mkinstalldirs new file mode 100755 index 000000000000..36aa90953b3e --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/libev/mkinstalldirs @@ -0,0 +1,162 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2018-03-07.03; # UTC + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' +IFS=" "" $nl" +errstatus=0 +dirmode= + +usage="\ +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the 'mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because '.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file + shift + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr= + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp=$pathcomp/ + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/.clang-format b/deps/ngtcp2/ngtcp2/third-party/urlparse/.clang-format new file mode 100644 index 000000000000..4a4552bdb278 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/.clang-format @@ -0,0 +1,246 @@ +--- +Language: Cpp +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignArrayOfStructures: None +AlignConsecutiveAssignments: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveBitFields: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveDeclarations: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveMacros: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveShortCaseStatements: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCaseColons: false +AlignEscapedNewlines: Right +AlignOperands: Align +AlignTrailingComments: + Kind: Always + OverEmptyLines: 0 +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowBreakBeforeNoexceptSpecifier: Never +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortCompoundRequirementOnASingleLine: true +AllowShortEnumsOnASingleLine: true +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +AttributeMacros: + - __capability +BinPackArguments: true +BinPackParameters: true +BitFieldColonSpacing: Both +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterExternBlock: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakAdjacentStringLiterals: true +BreakAfterAttributes: Leave +BreakAfterJavaFieldAnnotations: false +BreakArrays: true +BreakBeforeBinaryOperators: None +BreakBeforeConceptDeclarations: Always +BreakBeforeBraces: Attach +BreakBeforeInlineASMColon: OnlyMultiline +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeColon +BreakInheritanceList: BeforeColon +BreakStringLiterals: true +ColumnLimit: 80 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerIndentWidth: 2 +ContinuationIndentWidth: 2 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseBlocks: false +IndentCaseLabels: false +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true +IndentPPDirectives: AfterHash +IndentRequiresClause: false +IndentWidth: 2 +IndentWrappedFunctionNames: false +InsertBraces: false +InsertNewlineAtEOF: false +InsertTrailingCommas: None +IntegerLiteralSeparator: + Binary: 0 + BinaryMinDigits: 0 + Decimal: 0 + DecimalMinDigits: 0 + Hex: 0 + HexMinDigits: 0 +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: false +KeepEmptyLinesAtEOF: false +LambdaBodyIndentation: Signature +LineEnding: DeriveLF +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PackConstructorInitializers: NextLine +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakScopeResolution: 500 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyIndentedWhitespace: 0 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Right +PPIndentWidth: -1 +QualifierAlignment: Leave +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: false +RemoveParentheses: Leave +RemoveSemicolon: false +RequiresClausePosition: OwnLine +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SkipMacroDefinitionBody: false +SortIncludes: Never +SortJavaStaticImport: Before +SortUsingDeclarations: LexicographicNumeric +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceAroundPointerQualifiers: Default +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeJsonColon: false +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + AfterPlacementOperator: true + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParens: Never +SpacesInParensOptions: + InCStyleCasts: false + InConditionalStatements: false + InEmptyParentheses: false + Other: false +SpacesInSquareBrackets: false +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION + - munit_void_test_decl +TabWidth: 8 +UseTab: Never +VerilogBreakBetweenInstancePorts: true +WhitespaceSensitiveMacros: + - STRINGIZE + - PP_STRINGIZE + - BOOST_PP_STRINGIZE + - NS_SWIFT_NAME + - CF_SWIFT_NAME +... + diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/.clusterfuzzlite/Dockerfile b/deps/ngtcp2/ngtcp2/third-party/urlparse/.clusterfuzzlite/Dockerfile new file mode 100644 index 000000000000..a2763c87d756 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/.clusterfuzzlite/Dockerfile @@ -0,0 +1,5 @@ +FROM gcr.io/oss-fuzz-base/base-builder:v1 +RUN apt-get update && apt-get install -y make autoconf automake libtool pkg-config +COPY . $SRC/urlparse +WORKDIR urlparse +COPY .clusterfuzzlite/build.sh $SRC/ diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/.clusterfuzzlite/build.sh b/deps/ngtcp2/ngtcp2/third-party/urlparse/.clusterfuzzlite/build.sh new file mode 100755 index 000000000000..6f3386703156 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/.clusterfuzzlite/build.sh @@ -0,0 +1,11 @@ +#!/bin/bash -eu + +autoreconf -i +./configure --disable-dependency-tracking +make -j$(nproc) check TESTS="" + +$CXX $CXXFLAGS -std=c++17 -I. \ + fuzz/parser.cc -o $OUT/parser \ + $LIB_FUZZING_ENGINE .libs/liburlparse.a .libs/libhttp-parser.a + +zip -j $OUT/parser_seed_corpus.zip fuzz/corpus/parser/* diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/.clusterfuzzlite/project.yaml b/deps/ngtcp2/ngtcp2/third-party/urlparse/.clusterfuzzlite/project.yaml new file mode 100644 index 000000000000..b4788012b102 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/.clusterfuzzlite/project.yaml @@ -0,0 +1 @@ +language: c++ diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/.gitmodules b/deps/ngtcp2/ngtcp2/third-party/urlparse/.gitmodules new file mode 100644 index 000000000000..19a1abdfd49a --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/.gitmodules @@ -0,0 +1,6 @@ +[submodule "munit"] + path = munit + url = https://github.com/ngtcp2/munit +[submodule "http-parser"] + path = http-parser + url = https://github.com/nodejs/http-parser diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/AUTHORS b/deps/ngtcp2/ngtcp2/third-party/urlparse/AUTHORS new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/COPYING b/deps/ngtcp2/ngtcp2/third-party/urlparse/COPYING new file mode 100644 index 000000000000..06af8be1d9d5 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/COPYING @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2024 urlparse contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/ChangeLog b/deps/ngtcp2/ngtcp2/third-party/urlparse/ChangeLog new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/NEWS b/deps/ngtcp2/ngtcp2/third-party/urlparse/NEWS new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/README b/deps/ngtcp2/ngtcp2/third-party/urlparse/README new file mode 100644 index 000000000000..5ccc0ea36b54 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/README @@ -0,0 +1 @@ +See README.rst diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/README.rst b/deps/ngtcp2/ngtcp2/third-party/urlparse/README.rst new file mode 100644 index 000000000000..4e8c470bcdeb --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/README.rst @@ -0,0 +1,38 @@ +urlparse +======== + +urlparse is a URL parser compatible to `url_parser_parse_url()` from +`nodejs/http-parser `_ which +has been archived since 2022. urlparse only implements the strict +mode. + +There is a slight difference in a return code when they fail. +`url_parser_parse_url()` returns nonzero if it fails. +`urlparse_parse_url()` returns the negative error code +``URLPARSE_ERR_PARSE`` if it fails. + +A caller needs to call `http_parser_url_init()` before +`http_parser_parse_url()`. urlparse does not need a similar function +because `urlparse_parser_url()` initializes ``urlparse_url`` before +its use. + +`url_parser_parse_url()` historically does not follow any standards +like RFC 3986. Here is the allowed characters in each URL component: + +- scheme: ``A-Za-z`` +- userinfo: ``A-Za-z!$%&'()*+,-.:;=_~`` +- host: ``a-zA-Z0-9-.`` +- IPv6 host: ``A-Fa-f0-9.:`` + + - optionally followed by zone info which starts ``%`` and can + contain: ``A-Za-z0-9%-._~`` + + - and IPv6 host must be enclosed by ``[`` and ``]`` + +- port: ``0-9`` +- path: ``A-Za-z0-9!"$%&'()*+,-./:;<=>@[\]^_`{|}~`` +- query: ``A-Za-z0-9!"$%&'()*+,-./:;<=>?@[\]^_`{|}~`` +- fragment: ``A-Za-z0-9!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~`` + + - all consecutive ``#`` characters that precede a fragment are + treated as a single ``#``. A fragment cannot start with ``#``. diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/configure.ac b/deps/ngtcp2/ngtcp2/third-party/urlparse/configure.ac new file mode 100644 index 000000000000..16818ca8fa04 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/configure.ac @@ -0,0 +1,183 @@ +# urlparse +# +# Copyright (c) 2024 urlparse contributors +# Copyright (c) 2023 sfparse contributors +# Copyright (c) 2019 nghttp3 contributors +# Copyright (c) 2016 ngtcp2 contributors +# Copyright (c) 2012 nghttp2 contributors +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +AC_PREREQ(2.61) +AC_INIT([urlparse], [0.0.0-DEV], [t-tujikawa@users.sourceforge.net]) +AC_CONFIG_AUX_DIR([.]) +AC_CONFIG_MACRO_DIR([m4]) +AC_CONFIG_HEADERS([config.h]) +AC_USE_SYSTEM_EXTENSIONS + +LT_PREREQ([2.2.6]) +LT_INIT() + +AC_CANONICAL_BUILD +AC_CANONICAL_HOST +AC_CANONICAL_TARGET + +AM_INIT_AUTOMAKE([subdir-objects]) + +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +# See versioning rule: +# https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html +AC_SUBST(LT_CURRENT, 0) +AC_SUBST(LT_REVISION, 0) +AC_SUBST(LT_AGE, 0) + +# Checks for command-line options +AC_ARG_ENABLE([werror], + [AS_HELP_STRING([--enable-werror], + [Turn on compile time warnings])], + [werror=$enableval], [werror=no]) + +# Checks for programs +AC_PROG_CC +AC_PROG_CPP +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET +AC_PROG_MKDIR_P + +PKG_PROG_PKG_CONFIG([0.20]) + +# Checks for libraries. + +# Checks for header files. +AC_CHECK_HEADERS([ \ + assert.h \ + inttypes.h \ + stddef.h \ + stdint.h \ + stdlib.h \ + string.h \ + sys/types.h +]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_TYPE_SIZE_T +AC_TYPE_UINT8_T +AC_TYPE_UINT16_T +AC_TYPE_UINT32_T +AC_TYPE_UINT64_T + +# More compiler flags from nghttp2. +save_CFLAGS=$CFLAGS + +CFLAGS= + +if test "x$werror" != "xno"; then + # For C compiler + AX_CHECK_COMPILE_FLAG([-Wall], [CFLAGS="$CFLAGS -Wall"]) + AX_CHECK_COMPILE_FLAG([-Wextra], [CFLAGS="$CFLAGS -Wextra"]) + AX_CHECK_COMPILE_FLAG([-Werror], [CFLAGS="$CFLAGS -Werror"]) + AX_CHECK_COMPILE_FLAG([-Wmissing-prototypes], [CFLAGS="$CFLAGS -Wmissing-prototypes"]) + AX_CHECK_COMPILE_FLAG([-Wstrict-prototypes], [CFLAGS="$CFLAGS -Wstrict-prototypes"]) + AX_CHECK_COMPILE_FLAG([-Wmissing-declarations], [CFLAGS="$CFLAGS -Wmissing-declarations"]) + AX_CHECK_COMPILE_FLAG([-Wpointer-arith], [CFLAGS="$CFLAGS -Wpointer-arith"]) + AX_CHECK_COMPILE_FLAG([-Wdeclaration-after-statement], [CFLAGS="$CFLAGS -Wdeclaration-after-statement"]) + AX_CHECK_COMPILE_FLAG([-Wformat-security], [CFLAGS="$CFLAGS -Wformat-security"]) + AX_CHECK_COMPILE_FLAG([-Wwrite-strings], [CFLAGS="$CFLAGS -Wwrite-strings"]) + AX_CHECK_COMPILE_FLAG([-Wshadow], [CFLAGS="$CFLAGS -Wshadow"]) + AX_CHECK_COMPILE_FLAG([-Winline], [CFLAGS="$CFLAGS -Winline"]) + AX_CHECK_COMPILE_FLAG([-Wnested-externs], [CFLAGS="$CFLAGS -Wnested-externs"]) + AX_CHECK_COMPILE_FLAG([-Wfloat-equal], [CFLAGS="$CFLAGS -Wfloat-equal"]) + AX_CHECK_COMPILE_FLAG([-Wundef], [CFLAGS="$CFLAGS -Wundef"]) + AX_CHECK_COMPILE_FLAG([-Wendif-labels], [CFLAGS="$CFLAGS -Wendif-labels"]) + AX_CHECK_COMPILE_FLAG([-Wempty-body], [CFLAGS="$CFLAGS -Wempty-body"]) + AX_CHECK_COMPILE_FLAG([-Wcast-align], [CFLAGS="$CFLAGS -Wcast-align"]) + AX_CHECK_COMPILE_FLAG([-Wclobbered], [CFLAGS="$CFLAGS -Wclobbered"]) + AX_CHECK_COMPILE_FLAG([-Wvla], [CFLAGS="$CFLAGS -Wvla"]) + AX_CHECK_COMPILE_FLAG([-Wpragmas], [CFLAGS="$CFLAGS -Wpragmas"]) + AX_CHECK_COMPILE_FLAG([-Wunreachable-code], [CFLAGS="$CFLAGS -Wunreachable-code"]) + AX_CHECK_COMPILE_FLAG([-Waddress], [CFLAGS="$CFLAGS -Waddress"]) + AX_CHECK_COMPILE_FLAG([-Wattributes], [CFLAGS="$CFLAGS -Wattributes"]) + AX_CHECK_COMPILE_FLAG([-Wdiv-by-zero], [CFLAGS="$CFLAGS -Wdiv-by-zero"]) + AX_CHECK_COMPILE_FLAG([-Wshorten-64-to-32], [CFLAGS="$CFLAGS -Wshorten-64-to-32"]) + + AX_CHECK_COMPILE_FLAG([-Wconversion], [CFLAGS="$CFLAGS -Wconversion"]) + AX_CHECK_COMPILE_FLAG([-Wextended-offsetof], [CFLAGS="$CFLAGS -Wextended-offsetof"]) + AX_CHECK_COMPILE_FLAG([-Wformat-nonliteral], [CFLAGS="$CFLAGS -Wformat-nonliteral"]) + AX_CHECK_COMPILE_FLAG([-Wlanguage-extension-token], [CFLAGS="$CFLAGS -Wlanguage-extension-token"]) + AX_CHECK_COMPILE_FLAG([-Wmissing-field-initializers], [CFLAGS="$CFLAGS -Wmissing-field-initializers"]) + AX_CHECK_COMPILE_FLAG([-Wmissing-noreturn], [CFLAGS="$CFLAGS -Wmissing-noreturn"]) + AX_CHECK_COMPILE_FLAG([-Wmissing-variable-declarations], [CFLAGS="$CFLAGS -Wmissing-variable-declarations"]) + # Not used because we cannot change public structs + # AX_CHECK_COMPILE_FLAG([-Wpadded], [CFLAGS="$CFLAGS -Wpadded"]) + AX_CHECK_COMPILE_FLAG([-Wsign-conversion], [CFLAGS="$CFLAGS -Wsign-conversion"]) + # Not used because this basically disallows default case + # AX_CHECK_COMPILE_FLAG([-Wswitch-enum], [CFLAGS="$CFLAGS -Wswitch-enum"]) + AX_CHECK_COMPILE_FLAG([-Wunreachable-code-break], [CFLAGS="$CFLAGS -Wunreachable-code-break"]) + AX_CHECK_COMPILE_FLAG([-Wunused-macros], [CFLAGS="$CFLAGS -Wunused-macros"]) + AX_CHECK_COMPILE_FLAG([-Wunused-parameter], [CFLAGS="$CFLAGS -Wunused-parameter"]) + AX_CHECK_COMPILE_FLAG([-Wredundant-decls], [CFLAGS="$CFLAGS -Wredundant-decls"]) + # Only work with Clang for the moment + AX_CHECK_COMPILE_FLAG([-Wheader-guard], [CFLAGS="$CFLAGS -Wheader-guard"]) + AX_CHECK_COMPILE_FLAG([-Wsometimes-uninitialized], [CFLAGS="$CFLAGS -Wsometimes-uninitialized"]) + AX_CHECK_COMPILE_FLAG([-Wextra-semi], [CFLAGS="$CFLAGS -Wextra-semi"]) + + # Only work with gcc7 for the moment + AX_CHECK_COMPILE_FLAG([-Wduplicated-branches], [CFLAGS="$CFLAGS -Wduplicated-branches"]) + + # This is required because we pass format string as "const char*. + AX_CHECK_COMPILE_FLAG([-Wno-format-nonliteral], [CFLAGS="$CFLAGS -Wno-format-nonliteral"]) +fi + +WARNCFLAGS=$CFLAGS + +CFLAGS=$save_CFLAGS + +AC_SUBST([WARNCFLAGS]) + +AC_CONFIG_FILES([ + Makefile + doc/Makefile + doc/source/conf.py +]) +AC_OUTPUT + +AC_MSG_NOTICE([summary of build options: + + Package version: ${VERSION} + Library version: $LT_CURRENT:$LT_REVISION:$LT_AGE + Install prefix: ${prefix} + System types: + Build: ${build} + Host: ${host} + Target: ${target} + Compiler: + C preprocessor: ${CPP} + CPPFLAGS: ${CPPFLAGS} + C compiler: ${CC} + CFLAGS: ${CFLAGS} + LDFLAGS: ${LDFLAGS} + WARNCFLAGS: ${WARNCFLAGS} + LIBS: ${LIBS} + Library: + Shared: ${enable_shared} + Static: ${enable_static} +}') +]) diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/doc/mkapiref.py b/deps/ngtcp2/ngtcp2/third-party/urlparse/doc/mkapiref.py new file mode 100755 index 000000000000..6ac4d58add8b --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/doc/mkapiref.py @@ -0,0 +1,396 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# urlparse +# +# Copyright (c) 2024 urlparse contributors +# Copyright (c) 2023 sfparse contributors +# Copyright (c) 2020 nghttp3 contributors +# Copyright (c) 2020 ngtcp2 contributors +# Copyright (c) 2012 Tatsuhiro Tsujikawa +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: + +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +# Generates API reference from C source code. + +import re, sys, argparse, os.path + +class FunctionDoc: + def __init__(self, name, content, domain, filename): + self.name = name + self.content = content + self.domain = domain + if self.domain == 'function': + self.funcname = re.search(r'(urlparse_[^ )]+)\(', self.name).group(1) + self.filename = filename + + def write(self, out): + out.write('.. {}:: {}\n'.format(self.domain, self.name)) + out.write('\n') + for line in self.content: + out.write(' {}\n'.format(line)) + +class StructDoc: + def __init__(self, name, content, members, member_domain): + self.name = name + self.content = content + self.members = members + self.member_domain = member_domain + + def write(self, out): + indents = ' ' + if self.name: + out.write('.. type:: {}\n'.format(self.name)) + out.write('\n') + for line in self.content: + out.write(' {}\n'.format(line)) + out.write('\n') + for name, content, indent in self.members: + if name.startswith('@union_'): + out.write('{} .. union:: {}\n'.format(indents * indent, name)) + if name.startswith('@struct_'): + out.write('{} .. {}:: struct {}\n'.format(indents * indent, self.member_domain, name)) + else: + out.write('{} .. {}:: {}\n'.format(indents * indent, self.member_domain, name)) + out.write('\n') + for line in content: + out.write('{} {}\n'.format(indents * indent, line)) + if name.startswith('@struct_'): + out.write('\n') + out.write('\n') + +class EnumDoc: + def __init__(self, name, content, members): + self.name = name + self.content = content + self.members = members + + def write(self, out): + if self.name: + out.write('.. type:: {}\n'.format(self.name)) + out.write('\n') + for line in self.content: + out.write(' {}\n'.format(line)) + out.write('\n') + for name, content in self.members: + out.write(' .. enum:: {}\n'.format(name)) + out.write('\n') + for line in content: + out.write(' {}\n'.format(line)) + out.write('\n') + +class MacroDoc: + def __init__(self, name, content): + self.name = name + self.content = content + + def write(self, out): + out.write('''.. macro:: {}\n'''.format(self.name)) + out.write('\n') + for line in self.content: + out.write(' {}\n'.format(line)) + +class MacroSectionDoc: + def __init__(self, content): + self.content = content + + def write(self, out): + out.write('\n') + c = ' '.join(self.content).strip() + out.write(c) + out.write('\n') + out.write('-' * len(c)) + out.write('\n\n') + +class TypedefDoc: + def __init__(self, name, content): + self.name = name + self.content = content + + def write(self, out): + out.write('''.. type:: {}\n'''.format(self.name)) + out.write('\n') + for line in self.content: + out.write(' {}\n'.format(line)) + +def make_api_ref(infile): + macros = [] + enums = [] + types = [] + functions = [] + while True: + line = infile.readline() + if not line: + break + elif line == '/**\n': + line = infile.readline() + doctype = line.split()[1] + if doctype == '@function': + functions.append(process_function('function', infile)) + elif doctype == '@functypedef': + types.append(process_function('type', infile)) + elif doctype == '@struct' or doctype == '@union': + types.append(process_struct(infile)) + elif doctype == '@enum': + enums.append(process_enum(infile)) + elif doctype == '@macro': + macros.append(process_macro(infile)) + elif doctype == '@macrosection': + macros.append(process_macrosection(infile)) + elif doctype == '@typedef': + types.append(process_typedef(infile)) + return macros, enums, types, functions + +def output( + title, indexfile, macrosfile, enumsfile, typesfile, funcsdir, + macros, enums, types, functions): + indexfile.write(''' +{title} +{titledecoration} + +.. toctree:: + :maxdepth: 1 + + {macros} + {enums} + {types} +'''.format( + title=title, titledecoration='='*len(title), + macros=os.path.splitext(os.path.basename(macrosfile.name))[0], + enums=os.path.splitext(os.path.basename(enumsfile.name))[0], + types=os.path.splitext(os.path.basename(typesfile.name))[0], +)) + + for doc in functions: + indexfile.write(' {}\n'.format(doc.funcname)) + + macrosfile.write(''' +Macros +====== +''') + for doc in macros: + doc.write(macrosfile) + + enumsfile.write(''' +Enums +===== +''') + for doc in enums: + doc.write(enumsfile) + + typesfile.write(''' +Types (structs, unions and typedefs) +==================================== +''') + for doc in types: + doc.write(typesfile) + + for doc in functions: + with open(os.path.join(funcsdir, doc.funcname + '.rst'), 'w') as f: + f.write(''' +{funcname} +{secul} + +Synopsis +-------- + +*#include <{filename}>* + +'''.format(funcname=doc.funcname, secul='='*len(doc.funcname), + filename=doc.filename)) + doc.write(f) + +def process_macro(infile): + content = read_content(infile) + lines = [] + while True: + line = infile.readline() + if not line: + break + line = line.rstrip() + lines.append(line.rstrip('\\')) + if not line.endswith('\\'): + break + + macro_name = re.sub(r'#define ', '', ''.join(lines)) + m = re.match(r'^[^( ]+(:?\(.*?\))?', macro_name) + macro_name = m.group(0) + return MacroDoc(macro_name, content) + +def process_macrosection(infile): + content = read_content(infile) + return MacroSectionDoc(content) + +def process_typedef(infile): + content = read_content(infile) + typedef = infile.readline() + typedef = re.sub(r';\n$', '', typedef) + typedef = re.sub(r'typedef ', '', typedef) + return TypedefDoc(typedef, content) + +def process_enum(infile): + members = [] + enum_name = None + content = read_content(infile) + while True: + line = infile.readline() + if not line: + break + elif re.match(r'\s*/\*\*\n', line): + member_content = read_content(infile) + line = infile.readline() + items = line.split() + member_name = items[0].rstrip(',') + if len(items) >= 3: + member_content.insert(0, '(``{}``) '\ + .format(' '.join(items[2:]).rstrip(','))) + members.append((member_name, member_content)) + elif line.startswith('}'): + enum_name = line.rstrip().split()[1] + enum_name = re.sub(r';$', '', enum_name) + break + return EnumDoc(enum_name, content, members) + +def process_struct(infile): + members = [] + struct_name = None + content = read_content(infile) + indent = 0 + anonstruct_name = None + anonstruct_member_name = None + anonstruct_member_content = None + anonstruct_members = [] + while True: + line = infile.readline() + if not line: + break + elif re.match(r'\s*/\*\*\n', line): + member_content = read_content(infile) + if '@anonunion_start' in member_content: + member_name = member_content[2].strip() + members.append((member_name, '', indent)) + indent += 1 + elif '@anonunion_end' in member_content: + indent -= 1 + elif '@anonstruct_start' in member_content: + anonstruct_name = member_content[2].strip() + anonstruct_member_content = member_content[4:] + indent += 1 + elif '@anonstruct_end' in member_content: + line = infile.readline() + anonstruct_member_name = re.sub(r'\s*}\s*', '', line).rstrip().rstrip(';') + indent -= 1 + members.append((anonstruct_name + ' ' + anonstruct_member_name, + anonstruct_member_content, indent)) + members.extend(anonstruct_members) + anonstruct_name = None + anonstruct_member_name = None + anonstruct_member_content = None + anonstruct_members = [] + else: + line = infile.readline() + member_name = line.rstrip().rstrip(';') + if anonstruct_name is None: + members.append((member_name, member_content, indent)) + else: + anonstruct_members.append((member_name, member_content, indent)) + elif line.startswith('}') or\ + (line.startswith('typedef ') and line.endswith(';\n')): + if line.startswith('}'): + index = 1 + else: + index = 3 + struct_name = line.rstrip().split()[index] + struct_name = re.sub(r';$', '', struct_name) + break + return StructDoc(struct_name, content, members, 'member') + +def process_function(domain, infile): + content = read_content(infile) + func_proto = [] + while True: + line = infile.readline() + if not line: + break + elif line == '\n': + break + else: + func_proto.append(line) + func_proto = ''.join(func_proto) + func_proto = re.sub(r'int (settings|callbacks)_version,', + '', func_proto) + func_proto = re.sub(r'_versioned\(', '(', func_proto) + func_proto = re.sub(r';\n$', '', func_proto) + func_proto = re.sub(r'\s+', ' ', func_proto) + func_proto = re.sub(r'typedef ', '', func_proto) + filename = os.path.basename(infile.name) + return FunctionDoc(func_proto, content, domain, filename) + +def read_content(infile): + content = [] + while True: + line = infile.readline() + if not line: + break + if re.match(r'\s*\*/\n', line): + break + else: + content.append(transform_content(line.rstrip())) + return content + +def arg_repl(matchobj): + return '*{}*'.format(matchobj.group(1).replace('*', '\\*')) + +def transform_content(content): + content = re.sub(r'^\s+\* ?', '', content) + content = re.sub(r'\|([^\s|]+)\|', arg_repl, content) + return content + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="Generate API reference") + parser.add_argument('--title', default='API Reference', + help='title of index page') + parser.add_argument('index', type=argparse.FileType('w'), + help='index output file') + parser.add_argument('macros', type=argparse.FileType('w'), + help='macros section output file. The filename should be macros.rst') + parser.add_argument('enums', type=argparse.FileType('w'), + help='enums section output file. The filename should be enums.rst') + parser.add_argument('types', type=argparse.FileType('w'), + help='types section output file. The filename should be types.rst') + parser.add_argument('funcsdir', + help='functions doc output dir') + parser.add_argument('files', nargs='+', type=argparse.FileType('r'), + help='source file') + args = parser.parse_args() + macros = [] + enums = [] + types = [] + funcs = [] + for infile in args.files: + m, e, t, f = make_api_ref(infile) + macros.extend(m) + enums.extend(e) + types.extend(t) + funcs.extend(f) + funcs.sort(key=lambda x: x.funcname) + output( + args.title, + args.index, args.macros, args.enums, args.types, args.funcsdir, + macros, enums, types, funcs) diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/doc/source/index.rst b/deps/ngtcp2/ngtcp2/third-party/urlparse/doc/source/index.rst new file mode 100644 index 000000000000..0bf657a27497 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/doc/source/index.rst @@ -0,0 +1,15 @@ +Welcome to urlparse's documentation! +==================================== + +.. toctree:: + :maxdepth: 1 + :caption: Contents: + + apiref + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/examples.c b/deps/ngtcp2/ngtcp2/third-party/urlparse/examples.c new file mode 100644 index 000000000000..78f2de106c92 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/examples.c @@ -0,0 +1 @@ +int main(void) { return 0; } diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/connect b/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/connect new file mode 100644 index 000000000000..cc56d45bb4bd --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/connect @@ -0,0 +1 @@ +abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%!$&'()*+,;=:@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-:12345 \ No newline at end of file diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/connect-ipv6 b/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/connect-ipv6 new file mode 100644 index 000000000000..f5cd1c4b68cf --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/connect-ipv6 @@ -0,0 +1 @@ +abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%!$&'()*+,;=:@[abcdefABCDEF0123456789:.%abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789%.-_~]:12345 \ No newline at end of file diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/example b/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/example new file mode 100644 index 000000000000..a364175574b4 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/example @@ -0,0 +1 @@ +https://example.com/ \ No newline at end of file diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/ipv6 b/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/ipv6 new file mode 100644 index 000000000000..4d03e8809575 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/ipv6 @@ -0,0 +1 @@ +https://abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%!$&'()*+,;=:@[abcdefABCDEF0123456789:.%abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789%.-_~]:12345/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%!$&'()*+,;=:@/"<>[\]^`{|}?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%!$&'()*+,;=:@/?"<>[\]^`{|}#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%!$&'()*+,;=:@/?"<>[\]^`{|} \ No newline at end of file diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/long b/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/long new file mode 100644 index 000000000000..a9026edba99c --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/corpus/parser/long @@ -0,0 +1 @@ +https://abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%!$&'()*+,;=:@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-:12345/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%!$&'()*+,;=:@/"<>[\]^`{|}?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%!$&'()*+,;=:@/?"<>[\]^`{|}#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%!$&'()*+,;=:@/?"<>[\]^`{|} \ No newline at end of file diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/parser.cc b/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/parser.cc new file mode 100644 index 000000000000..57e5256a9d1b --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/fuzz/parser.cc @@ -0,0 +1,72 @@ +#include +#include +#include + +#include "urlparse.h" +#include "http-parser/http_parser.h" + +namespace { +/* Copied from https://github.com/nodejs/http-parser */ +void dump_url(const uint8_t *url, const urlparse_url *u) { + size_t i; + + fprintf(stderr, "\tfield_set: 0x%x, port: %u\n", u->field_set, u->port); + for (i = 0; i < URLPARSE_MAX; i++) { + if ((u->field_set & (1 << i)) == 0) { + fprintf(stderr, "\tfield_data[%zu]: unset\n", i); + continue; + } + + fprintf(stderr, "\tfield_data[%zu]: off: %u len: %u part: \"%.*s\"\n", i, + u->field_data[i].off, u->field_data[i].len, u->field_data[i].len, + url + u->field_data[i].off); + } +} +} // namespace + +namespace { +int fuzz(const uint8_t *data, size_t size, int is_connect) { + urlparse_url u; + struct http_parser_url hu; + int rv1, rv2; + + rv1 = urlparse_parse_url(reinterpret_cast(data), size, + is_connect, &u); + memset(&hu, 0, sizeof(hu)); + rv2 = http_parser_parse_url(reinterpret_cast(data), size, + is_connect, &hu); + if (rv2 != 0) { + rv2 = URLPARSE_ERR_PARSE; + } + + if (rv1 != rv2) { + fprintf( + stderr, + "urlparse_parse_url(%d) and http_parser_parse_url(%d) disagree with " + "is_connect = %d\n", + rv1, rv2, is_connect); + return -1; + } + + if (rv1 == 0 && memcmp(&hu, &u, sizeof(u)) != 0) { + fprintf(stderr, "is_connect = %d\n", is_connect); + fprintf(stderr, "target http_parser_url:\n"); + dump_url(data, reinterpret_cast(&hu)); + fprintf(stderr, "result urlparse_url:\n"); + dump_url(data, &u); + + return -1; + } + + return 0; +} +} // namespace + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (fuzz(data, size, /* is_connect = */ 0) != 0 || + fuzz(data, size, /* is_connect = */ 1) != 0) { + abort(); + } + + return 0; +} diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/.mailmap b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/.mailmap new file mode 100644 index 000000000000..278d14126372 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/.mailmap @@ -0,0 +1,8 @@ +# update AUTHORS with: +# git log --all --reverse --format='%aN <%aE>' | perl -ne 'BEGIN{print "# Authors ordered by first contribution.\n"} print unless $h{$_}; $h{$_} = 1' > AUTHORS +Ryan Dahl +Salman Haq +Simon Zimmermann +Thomas LE ROUX LE ROUX Thomas +Thomas LE ROUX Thomas LE ROUX +Fedor Indutny diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/.travis.yml b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/.travis.yml new file mode 100644 index 000000000000..4b038e6e62d6 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/.travis.yml @@ -0,0 +1,13 @@ +language: c + +compiler: + - clang + - gcc + +script: + - "make" + +notifications: + email: false + irc: + - "irc.freenode.net#node-ci" diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/AUTHORS b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/AUTHORS new file mode 100644 index 000000000000..5323b685caef --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/AUTHORS @@ -0,0 +1,68 @@ +# Authors ordered by first contribution. +Ryan Dahl +Jeremy Hinegardner +Sergey Shepelev +Joe Damato +tomika +Phoenix Sol +Cliff Frey +Ewen Cheslack-Postava +Santiago Gala +Tim Becker +Jeff Terrace +Ben Noordhuis +Nathan Rajlich +Mark Nottingham +Aman Gupta +Tim Becker +Sean Cunningham +Peter Griess +Salman Haq +Cliff Frey +Jon Kolb +Fouad Mardini +Paul Querna +Felix Geisendörfer +koichik +Andre Caron +Ivo Raisr +James McLaughlin +David Gwynne +Thomas LE ROUX +Randy Rizun +Andre Louis Caron +Simon Zimmermann +Erik Dubbelboer +Martell Malone +Bertrand Paquet +BogDan Vatra +Peter Faiman +Corey Richardson +Tóth Tamás +Cam Swords +Chris Dickinson +Uli Köhler +Charlie Somerville +Patrik Stutz +Fedor Indutny +runner +Alexis Campailla +David Wragg +Vinnie Falco +Alex Butum +Rex Feng +Alex Kocharin +Mark Koopman +Helge Heß +Alexis La Goutte +George Miroshnykov +Maciej Małecki +Marc O'Morain +Jeff Pinner +Timothy J Fontaine +Akagi201 +Romain Giraud +Jay Satiro +Arne Steen +Kjell Schubert +Olivier Mengué diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/LICENSE-MIT b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/LICENSE-MIT new file mode 100644 index 000000000000..1ec0ab4e1746 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/LICENSE-MIT @@ -0,0 +1,19 @@ +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/README.md b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/README.md new file mode 100644 index 000000000000..e38d3a57881a --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/README.md @@ -0,0 +1,249 @@ +HTTP Parser +=========== + +http-parser is [**not** actively maintained](https://github.com/nodejs/http-parser/issues/522). +New projects and projects looking to migrate should consider [llhttp](https://github.com/nodejs/llhttp). + +[![Build Status](https://api.travis-ci.org/nodejs/http-parser.svg?branch=master)](https://travis-ci.org/nodejs/http-parser) + +This is a parser for HTTP messages written in C. It parses both requests and +responses. The parser is designed to be used in performance HTTP +applications. It does not make any syscalls nor allocations, it does not +buffer data, it can be interrupted at anytime. Depending on your +architecture, it only requires about 40 bytes of data per message +stream (in a web server that is per connection). + +Features: + + * No dependencies + * Handles persistent streams (keep-alive). + * Decodes chunked encoding. + * Upgrade support + * Defends against buffer overflow attacks. + +The parser extracts the following information from HTTP messages: + + * Header fields and values + * Content-Length + * Request method + * Response status code + * Transfer-Encoding + * HTTP version + * Request URL + * Message body + + +Usage +----- + +One `http_parser` object is used per TCP connection. Initialize the struct +using `http_parser_init()` and set the callbacks. That might look something +like this for a request parser: +```c +http_parser_settings settings; +settings.on_url = my_url_callback; +settings.on_header_field = my_header_field_callback; +/* ... */ + +http_parser *parser = malloc(sizeof(http_parser)); +http_parser_init(parser, HTTP_REQUEST); +parser->data = my_socket; +``` + +When data is received on the socket execute the parser and check for errors. + +```c +size_t len = 80*1024, nparsed; +char buf[len]; +ssize_t recved; + +recved = recv(fd, buf, len, 0); + +if (recved < 0) { + /* Handle error. */ +} + +/* Start up / continue the parser. + * Note we pass recved==0 to signal that EOF has been received. + */ +nparsed = http_parser_execute(parser, &settings, buf, recved); + +if (parser->upgrade) { + /* handle new protocol */ +} else if (nparsed != recved) { + /* Handle error. Usually just close the connection. */ +} +``` + +`http_parser` needs to know where the end of the stream is. For example, sometimes +servers send responses without Content-Length and expect the client to +consume input (for the body) until EOF. To tell `http_parser` about EOF, give +`0` as the fourth parameter to `http_parser_execute()`. Callbacks and errors +can still be encountered during an EOF, so one must still be prepared +to receive them. + +Scalar valued message information such as `status_code`, `method`, and the +HTTP version are stored in the parser structure. This data is only +temporally stored in `http_parser` and gets reset on each new message. If +this information is needed later, copy it out of the structure during the +`headers_complete` callback. + +The parser decodes the transfer-encoding for both requests and responses +transparently. That is, a chunked encoding is decoded before being sent to +the on_body callback. + + +The Special Problem of Upgrade +------------------------------ + +`http_parser` supports upgrading the connection to a different protocol. An +increasingly common example of this is the WebSocket protocol which sends +a request like + + GET /demo HTTP/1.1 + Upgrade: WebSocket + Connection: Upgrade + Host: example.com + Origin: http://example.com + WebSocket-Protocol: sample + +followed by non-HTTP data. + +(See [RFC6455](https://tools.ietf.org/html/rfc6455) for more information the +WebSocket protocol.) + +To support this, the parser will treat this as a normal HTTP message without a +body, issuing both on_headers_complete and on_message_complete callbacks. However +http_parser_execute() will stop parsing at the end of the headers and return. + +The user is expected to check if `parser->upgrade` has been set to 1 after +`http_parser_execute()` returns. Non-HTTP data begins at the buffer supplied +offset by the return value of `http_parser_execute()`. + + +Callbacks +--------- + +During the `http_parser_execute()` call, the callbacks set in +`http_parser_settings` will be executed. The parser maintains state and +never looks behind, so buffering the data is not necessary. If you need to +save certain data for later usage, you can do that from the callbacks. + +There are two types of callbacks: + +* notification `typedef int (*http_cb) (http_parser*);` + Callbacks: on_message_begin, on_headers_complete, on_message_complete. +* data `typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);` + Callbacks: (requests only) on_url, + (common) on_header_field, on_header_value, on_body; + +Callbacks must return 0 on success. Returning a non-zero value indicates +error to the parser, making it exit immediately. + +For cases where it is necessary to pass local information to/from a callback, +the `http_parser` object's `data` field can be used. +An example of such a case is when using threads to handle a socket connection, +parse a request, and then give a response over that socket. By instantiation +of a thread-local struct containing relevant data (e.g. accepted socket, +allocated memory for callbacks to write into, etc), a parser's callbacks are +able to communicate data between the scope of the thread and the scope of the +callback in a threadsafe manner. This allows `http_parser` to be used in +multi-threaded contexts. + +Example: +```c + typedef struct { + socket_t sock; + void* buffer; + int buf_len; + } custom_data_t; + + +int my_url_callback(http_parser* parser, const char *at, size_t length) { + /* access to thread local custom_data_t struct. + Use this access save parsed data for later use into thread local + buffer, or communicate over socket + */ + parser->data; + ... + return 0; +} + +... + +void http_parser_thread(socket_t sock) { + int nparsed = 0; + /* allocate memory for user data */ + custom_data_t *my_data = malloc(sizeof(custom_data_t)); + + /* some information for use by callbacks. + * achieves thread -> callback information flow */ + my_data->sock = sock; + + /* instantiate a thread-local parser */ + http_parser *parser = malloc(sizeof(http_parser)); + http_parser_init(parser, HTTP_REQUEST); /* initialise parser */ + /* this custom data reference is accessible through the reference to the + parser supplied to callback functions */ + parser->data = my_data; + + http_parser_settings settings; /* set up callbacks */ + settings.on_url = my_url_callback; + + /* execute parser */ + nparsed = http_parser_execute(parser, &settings, buf, recved); + + ... + /* parsed information copied from callback. + can now perform action on data copied into thread-local memory from callbacks. + achieves callback -> thread information flow */ + my_data->buffer; + ... +} + +``` + +In case you parse HTTP message in chunks (i.e. `read()` request line +from socket, parse, read half headers, parse, etc) your data callbacks +may be called more than once. `http_parser` guarantees that data pointer is only +valid for the lifetime of callback. You can also `read()` into a heap allocated +buffer to avoid copying memory around if this fits your application. + +Reading headers may be a tricky task if you read/parse headers partially. +Basically, you need to remember whether last header callback was field or value +and apply the following logic: + + (on_header_field and on_header_value shortened to on_h_*) + ------------------------ ------------ -------------------------------------------- + | State (prev. callback) | Callback | Description/action | + ------------------------ ------------ -------------------------------------------- + | nothing (first call) | on_h_field | Allocate new buffer and copy callback data | + | | | into it | + ------------------------ ------------ -------------------------------------------- + | value | on_h_field | New header started. | + | | | Copy current name,value buffers to headers | + | | | list and allocate new buffer for new name | + ------------------------ ------------ -------------------------------------------- + | field | on_h_field | Previous name continues. Reallocate name | + | | | buffer and append callback data to it | + ------------------------ ------------ -------------------------------------------- + | field | on_h_value | Value for current header started. Allocate | + | | | new buffer and copy callback data to it | + ------------------------ ------------ -------------------------------------------- + | value | on_h_value | Value continues. Reallocate value buffer | + | | | and append callback data to it | + ------------------------ ------------ -------------------------------------------- + + +Parsing URLs +------------ + +A simplistic zero-copy URL parser is provided as `http_parser_parse_url()`. +Users of this library may wish to use it to parse URLs constructed from +consecutive `on_url` callbacks. + +See examples of reading in headers: + +* [partial example](http://gist.github.com/155877) in C +* [from http-parser tests](https://github.com/joyent/http-parser/blob/37a0ff8/test.c#L403) in C +* [from Node library](https://github.com/joyent/node/blob/842eaf4/src/http.js#L284) in Javascript diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/bench.c b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/bench.c new file mode 100644 index 000000000000..678f5556c598 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/bench.c @@ -0,0 +1,128 @@ +/* Copyright Fedor Indutny. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "http_parser.h" +#include +#include +#include +#include +#include + +/* 8 gb */ +static const int64_t kBytes = 8LL << 30; + +static const char data[] = + "POST /joyent/http-parser HTTP/1.1\r\n" + "Host: github.com\r\n" + "DNT: 1\r\n" + "Accept-Encoding: gzip, deflate, sdch\r\n" + "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n" + "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/39.0.2171.65 Safari/537.36\r\n" + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9," + "image/webp,*/*;q=0.8\r\n" + "Referer: https://github.com/joyent/http-parser\r\n" + "Connection: keep-alive\r\n" + "Transfer-Encoding: chunked\r\n" + "Cache-Control: max-age=0\r\n\r\nb\r\nhello world\r\n0\r\n"; +static const size_t data_len = sizeof(data) - 1; + +static int on_info(http_parser* p) { + return 0; +} + + +static int on_data(http_parser* p, const char *at, size_t length) { + return 0; +} + +static http_parser_settings settings = { + .on_message_begin = on_info, + .on_headers_complete = on_info, + .on_message_complete = on_info, + .on_header_field = on_data, + .on_header_value = on_data, + .on_url = on_data, + .on_status = on_data, + .on_body = on_data +}; + +int bench(int iter_count, int silent) { + struct http_parser parser; + int i; + int err; + struct timeval start; + struct timeval end; + + if (!silent) { + err = gettimeofday(&start, NULL); + assert(err == 0); + } + + fprintf(stderr, "req_len=%d\n", (int) data_len); + for (i = 0; i < iter_count; i++) { + size_t parsed; + http_parser_init(&parser, HTTP_REQUEST); + + parsed = http_parser_execute(&parser, &settings, data, data_len); + assert(parsed == data_len); + } + + if (!silent) { + double elapsed; + double bw; + double total; + + err = gettimeofday(&end, NULL); + assert(err == 0); + + fprintf(stdout, "Benchmark result:\n"); + + elapsed = (double) (end.tv_sec - start.tv_sec) + + (end.tv_usec - start.tv_usec) * 1e-6f; + + total = (double) iter_count * data_len; + bw = (double) total / elapsed; + + fprintf(stdout, "%.2f mb | %.2f mb/s | %.2f req/sec | %.2f s\n", + (double) total / (1024 * 1024), + bw / (1024 * 1024), + (double) iter_count / elapsed, + elapsed); + + fflush(stdout); + } + + return 0; +} + +int main(int argc, char** argv) { + int64_t iterations; + + iterations = kBytes / (int64_t) data_len; + if (argc == 2 && strcmp(argv[1], "infinite") == 0) { + for (;;) + bench(iterations, 1); + return 0; + } else { + return bench(iterations, 0); + } +} diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/contrib/parsertrace.c b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/contrib/parsertrace.c new file mode 100644 index 000000000000..3daa7f46a193 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/contrib/parsertrace.c @@ -0,0 +1,157 @@ +/* Copyright Joyent, Inc. and other Node contributors. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* Dump what the parser finds to stdout as it happen */ + +#include "http_parser.h" +#include +#include +#include + +int on_message_begin(http_parser* _) { + (void)_; + printf("\n***MESSAGE BEGIN***\n\n"); + return 0; +} + +int on_headers_complete(http_parser* _) { + (void)_; + printf("\n***HEADERS COMPLETE***\n\n"); + return 0; +} + +int on_message_complete(http_parser* _) { + (void)_; + printf("\n***MESSAGE COMPLETE***\n\n"); + return 0; +} + +int on_url(http_parser* _, const char* at, size_t length) { + (void)_; + printf("Url: %.*s\n", (int)length, at); + return 0; +} + +int on_header_field(http_parser* _, const char* at, size_t length) { + (void)_; + printf("Header field: %.*s\n", (int)length, at); + return 0; +} + +int on_header_value(http_parser* _, const char* at, size_t length) { + (void)_; + printf("Header value: %.*s\n", (int)length, at); + return 0; +} + +int on_body(http_parser* _, const char* at, size_t length) { + (void)_; + printf("Body: %.*s\n", (int)length, at); + return 0; +} + +void usage(const char* name) { + fprintf(stderr, + "Usage: %s $type $filename\n" + " type: -x, where x is one of {r,b,q}\n" + " parses file as a Response, reQuest, or Both\n", + name); + exit(EXIT_FAILURE); +} + +int main(int argc, char* argv[]) { + enum http_parser_type file_type; + + if (argc != 3) { + usage(argv[0]); + } + + char* type = argv[1]; + if (type[0] != '-') { + usage(argv[0]); + } + + switch (type[1]) { + /* in the case of "-", type[1] will be NUL */ + case 'r': + file_type = HTTP_RESPONSE; + break; + case 'q': + file_type = HTTP_REQUEST; + break; + case 'b': + file_type = HTTP_BOTH; + break; + default: + usage(argv[0]); + } + + char* filename = argv[2]; + FILE* file = fopen(filename, "r"); + if (file == NULL) { + perror("fopen"); + goto fail; + } + + fseek(file, 0, SEEK_END); + long file_length = ftell(file); + if (file_length == -1) { + perror("ftell"); + goto fail; + } + fseek(file, 0, SEEK_SET); + + char* data = malloc(file_length); + if (fread(data, 1, file_length, file) != (size_t)file_length) { + fprintf(stderr, "couldn't read entire file\n"); + free(data); + goto fail; + } + + http_parser_settings settings; + memset(&settings, 0, sizeof(settings)); + settings.on_message_begin = on_message_begin; + settings.on_url = on_url; + settings.on_header_field = on_header_field; + settings.on_header_value = on_header_value; + settings.on_headers_complete = on_headers_complete; + settings.on_body = on_body; + settings.on_message_complete = on_message_complete; + + http_parser parser; + http_parser_init(&parser, file_type); + size_t nparsed = http_parser_execute(&parser, &settings, data, file_length); + free(data); + + if (nparsed != (size_t)file_length) { + fprintf(stderr, + "Error: %s (%s)\n", + http_errno_description(HTTP_PARSER_ERRNO(&parser)), + http_errno_name(HTTP_PARSER_ERRNO(&parser))); + goto fail; + } + + return EXIT_SUCCESS; + +fail: + fclose(file); + return EXIT_FAILURE; +} diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/contrib/url_parser.c b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/contrib/url_parser.c new file mode 100644 index 000000000000..f235bed9e483 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/contrib/url_parser.c @@ -0,0 +1,47 @@ +#include "http_parser.h" +#include +#include + +void +dump_url (const char *url, const struct http_parser_url *u) +{ + unsigned int i; + + printf("\tfield_set: 0x%x, port: %u\n", u->field_set, u->port); + for (i = 0; i < UF_MAX; i++) { + if ((u->field_set & (1 << i)) == 0) { + printf("\tfield_data[%u]: unset\n", i); + continue; + } + + printf("\tfield_data[%u]: off: %u, len: %u, part: %.*s\n", + i, + u->field_data[i].off, + u->field_data[i].len, + u->field_data[i].len, + url + u->field_data[i].off); + } +} + +int main(int argc, char ** argv) { + struct http_parser_url u; + int len, connect, result; + + if (argc != 3) { + printf("Syntax : %s connect|get url\n", argv[0]); + return 1; + } + len = strlen(argv[2]); + connect = strcmp("connect", argv[1]) == 0 ? 1 : 0; + printf("Parsing %s, connect %d\n", argv[2], connect); + + http_parser_url_init(&u); + result = http_parser_parse_url(argv[2], len, connect, &u); + if (result != 0) { + printf("Parse error : %d\n", result); + return result; + } + printf("Parse ok, result : \n"); + dump_url(argv[2], &u); + return 0; +} diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/fuzzers/fuzz_parser.c b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/fuzzers/fuzz_parser.c new file mode 100644 index 000000000000..1a8442c9b637 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/fuzzers/fuzz_parser.c @@ -0,0 +1,26 @@ +#include +#include +#include +#include "http_parser.h" + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + static const http_parser_settings settings_null = { + .on_message_begin = 0 + , .on_header_field = 0 + ,.on_header_value = 0 + ,.on_url = 0 + ,.on_status = 0 + ,.on_body = 0 + ,.on_headers_complete = 0 + ,.on_message_complete = 0 + ,.on_chunk_header = 0 + ,.on_chunk_complete = 0 + }; + + http_parser parser; + http_parser_init(&parser, HTTP_BOTH); + http_parser_execute(&parser, &settings_null, (char*)data, size); + + return 0; +} diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/fuzzers/fuzz_url.c b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/fuzzers/fuzz_url.c new file mode 100644 index 000000000000..eca11a2edce5 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/fuzzers/fuzz_url.c @@ -0,0 +1,14 @@ +#include +#include +#include +#include "http_parser.h" + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + struct http_parser_url u; + http_parser_url_init(&u); + http_parser_parse_url((char*)data, size, 0, &u); + http_parser_parse_url((char*)data, size, 1, &u); + + return 0; +} diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/http_parser.c b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/http_parser.c new file mode 100644 index 000000000000..9be003e7322e --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/http_parser.c @@ -0,0 +1,2575 @@ +/* Copyright Joyent, Inc. and other Node contributors. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "http_parser.h" +#include +#include +#include +#include +#include + +static uint32_t max_header_size = HTTP_MAX_HEADER_SIZE; + +#ifndef ULLONG_MAX +# define ULLONG_MAX ((uint64_t) -1) /* 2^64-1 */ +#endif + +#ifndef MIN +# define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef ARRAY_SIZE +# define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +#endif + +#ifndef BIT_AT +# define BIT_AT(a, i) \ + (!!((unsigned int) (a)[(unsigned int) (i) >> 3] & \ + (1 << ((unsigned int) (i) & 7)))) +#endif + +#ifndef ELEM_AT +# define ELEM_AT(a, i, v) ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v)) +#endif + +#define SET_ERRNO(e) \ +do { \ + parser->nread = nread; \ + parser->http_errno = (e); \ +} while(0) + +#define CURRENT_STATE() p_state +#define UPDATE_STATE(V) p_state = (enum state) (V); +#define RETURN(V) \ +do { \ + parser->nread = nread; \ + parser->state = CURRENT_STATE(); \ + return (V); \ +} while (0); +#define REEXECUTE() \ + goto reexecute; \ + + +#ifdef __GNUC__ +# define LIKELY(X) __builtin_expect(!!(X), 1) +# define UNLIKELY(X) __builtin_expect(!!(X), 0) +#else +# define LIKELY(X) (X) +# define UNLIKELY(X) (X) +#endif + + +/* Run the notify callback FOR, returning ER if it fails */ +#define CALLBACK_NOTIFY_(FOR, ER) \ +do { \ + assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ + \ + if (LIKELY(settings->on_##FOR)) { \ + parser->state = CURRENT_STATE(); \ + if (UNLIKELY(0 != settings->on_##FOR(parser))) { \ + SET_ERRNO(HPE_CB_##FOR); \ + } \ + UPDATE_STATE(parser->state); \ + \ + /* We either errored above or got paused; get out */ \ + if (UNLIKELY(HTTP_PARSER_ERRNO(parser) != HPE_OK)) { \ + return (ER); \ + } \ + } \ +} while (0) + +/* Run the notify callback FOR and consume the current byte */ +#define CALLBACK_NOTIFY(FOR) CALLBACK_NOTIFY_(FOR, p - data + 1) + +/* Run the notify callback FOR and don't consume the current byte */ +#define CALLBACK_NOTIFY_NOADVANCE(FOR) CALLBACK_NOTIFY_(FOR, p - data) + +/* Run data callback FOR with LEN bytes, returning ER if it fails */ +#define CALLBACK_DATA_(FOR, LEN, ER) \ +do { \ + assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ + \ + if (FOR##_mark) { \ + if (LIKELY(settings->on_##FOR)) { \ + parser->state = CURRENT_STATE(); \ + if (UNLIKELY(0 != \ + settings->on_##FOR(parser, FOR##_mark, (LEN)))) { \ + SET_ERRNO(HPE_CB_##FOR); \ + } \ + UPDATE_STATE(parser->state); \ + \ + /* We either errored above or got paused; get out */ \ + if (UNLIKELY(HTTP_PARSER_ERRNO(parser) != HPE_OK)) { \ + return (ER); \ + } \ + } \ + FOR##_mark = NULL; \ + } \ +} while (0) + +/* Run the data callback FOR and consume the current byte */ +#define CALLBACK_DATA(FOR) \ + CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1) + +/* Run the data callback FOR and don't consume the current byte */ +#define CALLBACK_DATA_NOADVANCE(FOR) \ + CALLBACK_DATA_(FOR, p - FOR##_mark, p - data) + +/* Set the mark FOR; non-destructive if mark is already set */ +#define MARK(FOR) \ +do { \ + if (!FOR##_mark) { \ + FOR##_mark = p; \ + } \ +} while (0) + +/* Don't allow the total size of the HTTP headers (including the status + * line) to exceed max_header_size. This check is here to protect + * embedders against denial-of-service attacks where the attacker feeds + * us a never-ending header that the embedder keeps buffering. + * + * This check is arguably the responsibility of embedders but we're doing + * it on the embedder's behalf because most won't bother and this way we + * make the web a little safer. max_header_size is still far bigger + * than any reasonable request or response so this should never affect + * day-to-day operation. + */ +#define COUNT_HEADER_SIZE(V) \ +do { \ + nread += (uint32_t)(V); \ + if (UNLIKELY(nread > max_header_size)) { \ + SET_ERRNO(HPE_HEADER_OVERFLOW); \ + goto error; \ + } \ +} while (0) + + +#define PROXY_CONNECTION "proxy-connection" +#define CONNECTION "connection" +#define CONTENT_LENGTH "content-length" +#define TRANSFER_ENCODING "transfer-encoding" +#define UPGRADE "upgrade" +#define CHUNKED "chunked" +#define KEEP_ALIVE "keep-alive" +#define CLOSE "close" + + +static const char *method_strings[] = + { +#define XX(num, name, string) #string, + HTTP_METHOD_MAP(XX) +#undef XX + }; + + +/* Tokens as defined by rfc 2616. Also lowercases them. + * token = 1* + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + */ +static const char tokens[256] = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + ' ', '!', 0, '#', '$', '%', '&', '\'', +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + 0, 0, '*', '+', 0, '-', '.', 0, +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + '0', '1', '2', '3', '4', '5', '6', '7', +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + '8', '9', 0, 0, 0, 0, 0, 0, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + 'x', 'y', 'z', 0, 0, 0, '^', '_', +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + 'x', 'y', 'z', 0, '|', 0, '~', 0 }; + + +static const int8_t unhex[256] = + {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + }; + + +#if HTTP_PARSER_STRICT +# define T(v) 0 +#else +# define T(v) v +#endif + + +static const uint8_t normal_url_char[32] = { +/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, +/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ + 0 | T(2) | 0 | 0 | T(16) | 0 | 0 | 0, +/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, +/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, +/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ + 0 | 2 | 4 | 0 | 16 | 32 | 64 | 128, +/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, +/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, +/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, }; + +#undef T + +enum state + { s_dead = 1 /* important that this is > 0 */ + + , s_start_req_or_res + , s_res_or_resp_H + , s_start_res + , s_res_H + , s_res_HT + , s_res_HTT + , s_res_HTTP + , s_res_http_major + , s_res_http_dot + , s_res_http_minor + , s_res_http_end + , s_res_first_status_code + , s_res_status_code + , s_res_status_start + , s_res_status + , s_res_line_almost_done + + , s_start_req + + , s_req_method + , s_req_spaces_before_url + , s_req_schema + , s_req_schema_slash + , s_req_schema_slash_slash + , s_req_server_start + , s_req_server + , s_req_server_with_at + , s_req_path + , s_req_query_string_start + , s_req_query_string + , s_req_fragment_start + , s_req_fragment + , s_req_http_start + , s_req_http_H + , s_req_http_HT + , s_req_http_HTT + , s_req_http_HTTP + , s_req_http_I + , s_req_http_IC + , s_req_http_major + , s_req_http_dot + , s_req_http_minor + , s_req_http_end + , s_req_line_almost_done + + , s_header_field_start + , s_header_field + , s_header_value_discard_ws + , s_header_value_discard_ws_almost_done + , s_header_value_discard_lws + , s_header_value_start + , s_header_value + , s_header_value_lws + + , s_header_almost_done + + , s_chunk_size_start + , s_chunk_size + , s_chunk_parameters + , s_chunk_size_almost_done + + , s_headers_almost_done + , s_headers_done + + /* Important: 's_headers_done' must be the last 'header' state. All + * states beyond this must be 'body' states. It is used for overflow + * checking. See the PARSING_HEADER() macro. + */ + + , s_chunk_data + , s_chunk_data_almost_done + , s_chunk_data_done + + , s_body_identity + , s_body_identity_eof + + , s_message_done + }; + + +#define PARSING_HEADER(state) (state <= s_headers_done) + + +enum header_states + { h_general = 0 + , h_C + , h_CO + , h_CON + + , h_matching_connection + , h_matching_proxy_connection + , h_matching_content_length + , h_matching_transfer_encoding + , h_matching_upgrade + + , h_connection + , h_content_length + , h_content_length_num + , h_content_length_ws + , h_transfer_encoding + , h_upgrade + + , h_matching_transfer_encoding_token_start + , h_matching_transfer_encoding_chunked + , h_matching_transfer_encoding_token + + , h_matching_connection_token_start + , h_matching_connection_keep_alive + , h_matching_connection_close + , h_matching_connection_upgrade + , h_matching_connection_token + + , h_transfer_encoding_chunked + , h_connection_keep_alive + , h_connection_close + , h_connection_upgrade + }; + +enum http_host_state + { + s_http_host_dead = 1 + , s_http_userinfo_start + , s_http_userinfo + , s_http_host_start + , s_http_host_v6_start + , s_http_host + , s_http_host_v6 + , s_http_host_v6_end + , s_http_host_v6_zone_start + , s_http_host_v6_zone + , s_http_host_port_start + , s_http_host_port +}; + +/* Macros for character classes; depends on strict-mode */ +#define CR '\r' +#define LF '\n' +#define LOWER(c) (unsigned char)(c | 0x20) +#define IS_ALPHA(c) (LOWER(c) >= 'a' && LOWER(c) <= 'z') +#define IS_NUM(c) ((c) >= '0' && (c) <= '9') +#define IS_ALPHANUM(c) (IS_ALPHA(c) || IS_NUM(c)) +#define IS_HEX(c) (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f')) +#define IS_MARK(c) ((c) == '-' || (c) == '_' || (c) == '.' || \ + (c) == '!' || (c) == '~' || (c) == '*' || (c) == '\'' || (c) == '(' || \ + (c) == ')') +#define IS_USERINFO_CHAR(c) (IS_ALPHANUM(c) || IS_MARK(c) || (c) == '%' || \ + (c) == ';' || (c) == ':' || (c) == '&' || (c) == '=' || (c) == '+' || \ + (c) == '$' || (c) == ',') + +#define STRICT_TOKEN(c) ((c == ' ') ? 0 : tokens[(unsigned char)c]) + +#if HTTP_PARSER_STRICT +#define TOKEN(c) STRICT_TOKEN(c) +#define IS_URL_CHAR(c) (BIT_AT(normal_url_char, (unsigned char)c)) +#define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-') +#else +#define TOKEN(c) tokens[(unsigned char)c] +#define IS_URL_CHAR(c) \ + (BIT_AT(normal_url_char, (unsigned char)c) || ((c) & 0x80)) +#define IS_HOST_CHAR(c) \ + (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_') +#endif + +/** + * Verify that a char is a valid visible (printable) US-ASCII + * character or %x80-FF + **/ +#define IS_HEADER_CHAR(ch) \ + (ch == CR || ch == LF || ch == 9 || ((unsigned char)ch > 31 && ch != 127)) + +#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res) + + +#if HTTP_PARSER_STRICT +# define STRICT_CHECK(cond) \ +do { \ + if (cond) { \ + SET_ERRNO(HPE_STRICT); \ + goto error; \ + } \ +} while (0) +# define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead) +#else +# define STRICT_CHECK(cond) +# define NEW_MESSAGE() start_state +#endif + + +/* Map errno values to strings for human-readable output */ +#define HTTP_STRERROR_GEN(n, s) { "HPE_" #n, s }, +static struct { + const char *name; + const char *description; +} http_strerror_tab[] = { + HTTP_ERRNO_MAP(HTTP_STRERROR_GEN) +}; +#undef HTTP_STRERROR_GEN + +int http_message_needs_eof(const http_parser *parser); + +/* Our URL parser. + * + * This is designed to be shared by http_parser_execute() for URL validation, + * hence it has a state transition + byte-for-byte interface. In addition, it + * is meant to be embedded in http_parser_parse_url(), which does the dirty + * work of turning state transitions URL components for its API. + * + * This function should only be invoked with non-space characters. It is + * assumed that the caller cares about (and can detect) the transition between + * URL and non-URL states by looking for these. + */ +static enum state +parse_url_char(enum state s, const char ch) +{ + if (ch == ' ' || ch == '\r' || ch == '\n') { + return s_dead; + } + +#if HTTP_PARSER_STRICT + if (ch == '\t' || ch == '\f') { + return s_dead; + } +#endif + + switch (s) { + case s_req_spaces_before_url: + /* Proxied requests are followed by scheme of an absolute URI (alpha). + * All methods except CONNECT are followed by '/' or '*'. + */ + + if (ch == '/' || ch == '*') { + return s_req_path; + } + + if (IS_ALPHA(ch)) { + return s_req_schema; + } + + break; + + case s_req_schema: + if (IS_ALPHA(ch)) { + return s; + } + + if (ch == ':') { + return s_req_schema_slash; + } + + break; + + case s_req_schema_slash: + if (ch == '/') { + return s_req_schema_slash_slash; + } + + break; + + case s_req_schema_slash_slash: + if (ch == '/') { + return s_req_server_start; + } + + break; + + case s_req_server_with_at: + if (ch == '@') { + return s_dead; + } + + /* fall through */ + case s_req_server_start: + case s_req_server: + if (ch == '/') { + return s_req_path; + } + + if (ch == '?') { + return s_req_query_string_start; + } + + if (ch == '@') { + return s_req_server_with_at; + } + + if (IS_USERINFO_CHAR(ch) || ch == '[' || ch == ']') { + return s_req_server; + } + + break; + + case s_req_path: + if (IS_URL_CHAR(ch)) { + return s; + } + + switch (ch) { + case '?': + return s_req_query_string_start; + + case '#': + return s_req_fragment_start; + } + + break; + + case s_req_query_string_start: + case s_req_query_string: + if (IS_URL_CHAR(ch)) { + return s_req_query_string; + } + + switch (ch) { + case '?': + /* allow extra '?' in query string */ + return s_req_query_string; + + case '#': + return s_req_fragment_start; + } + + break; + + case s_req_fragment_start: + if (IS_URL_CHAR(ch)) { + return s_req_fragment; + } + + switch (ch) { + case '?': + return s_req_fragment; + + case '#': + return s; + } + + break; + + case s_req_fragment: + if (IS_URL_CHAR(ch)) { + return s; + } + + switch (ch) { + case '?': + case '#': + return s; + } + + break; + + default: + break; + } + + /* We should never fall out of the switch above unless there's an error */ + return s_dead; +} + +size_t http_parser_execute (http_parser *parser, + const http_parser_settings *settings, + const char *data, + size_t len) +{ + char c, ch; + int8_t unhex_val; + const char *p = data; + const char *header_field_mark = 0; + const char *header_value_mark = 0; + const char *url_mark = 0; + const char *body_mark = 0; + const char *status_mark = 0; + enum state p_state = (enum state) parser->state; + const unsigned int lenient = parser->lenient_http_headers; + const unsigned int allow_chunked_length = parser->allow_chunked_length; + + uint32_t nread = parser->nread; + + /* We're in an error state. Don't bother doing anything. */ + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { + return 0; + } + + if (len == 0) { + switch (CURRENT_STATE()) { + case s_body_identity_eof: + /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if + * we got paused. + */ + CALLBACK_NOTIFY_NOADVANCE(message_complete); + return 0; + + case s_dead: + case s_start_req_or_res: + case s_start_res: + case s_start_req: + return 0; + + default: + SET_ERRNO(HPE_INVALID_EOF_STATE); + return 1; + } + } + + + if (CURRENT_STATE() == s_header_field) + header_field_mark = data; + if (CURRENT_STATE() == s_header_value) + header_value_mark = data; + switch (CURRENT_STATE()) { + case s_req_path: + case s_req_schema: + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_server_start: + case s_req_server: + case s_req_server_with_at: + case s_req_query_string_start: + case s_req_query_string: + case s_req_fragment_start: + case s_req_fragment: + url_mark = data; + break; + case s_res_status: + status_mark = data; + break; + default: + break; + } + + for (p=data; p != data + len; p++) { + ch = *p; + + if (PARSING_HEADER(CURRENT_STATE())) + COUNT_HEADER_SIZE(1); + +reexecute: + switch (CURRENT_STATE()) { + + case s_dead: + /* this state is used after a 'Connection: close' message + * the parser will error out if it reads another message + */ + if (LIKELY(ch == CR || ch == LF)) + break; + + SET_ERRNO(HPE_CLOSED_CONNECTION); + goto error; + + case s_start_req_or_res: + { + if (ch == CR || ch == LF) + break; + parser->flags = 0; + parser->uses_transfer_encoding = 0; + parser->content_length = ULLONG_MAX; + + if (ch == 'H') { + UPDATE_STATE(s_res_or_resp_H); + + CALLBACK_NOTIFY(message_begin); + } else { + parser->type = HTTP_REQUEST; + UPDATE_STATE(s_start_req); + REEXECUTE(); + } + + break; + } + + case s_res_or_resp_H: + if (ch == 'T') { + parser->type = HTTP_RESPONSE; + UPDATE_STATE(s_res_HT); + } else { + if (UNLIKELY(ch != 'E')) { + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + + parser->type = HTTP_REQUEST; + parser->method = HTTP_HEAD; + parser->index = 2; + UPDATE_STATE(s_req_method); + } + break; + + case s_start_res: + { + if (ch == CR || ch == LF) + break; + parser->flags = 0; + parser->uses_transfer_encoding = 0; + parser->content_length = ULLONG_MAX; + + if (ch == 'H') { + UPDATE_STATE(s_res_H); + } else { + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + + CALLBACK_NOTIFY(message_begin); + break; + } + + case s_res_H: + STRICT_CHECK(ch != 'T'); + UPDATE_STATE(s_res_HT); + break; + + case s_res_HT: + STRICT_CHECK(ch != 'T'); + UPDATE_STATE(s_res_HTT); + break; + + case s_res_HTT: + STRICT_CHECK(ch != 'P'); + UPDATE_STATE(s_res_HTTP); + break; + + case s_res_HTTP: + STRICT_CHECK(ch != '/'); + UPDATE_STATE(s_res_http_major); + break; + + case s_res_http_major: + if (UNLIKELY(!IS_NUM(ch))) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major = ch - '0'; + UPDATE_STATE(s_res_http_dot); + break; + + case s_res_http_dot: + { + if (UNLIKELY(ch != '.')) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + UPDATE_STATE(s_res_http_minor); + break; + } + + case s_res_http_minor: + if (UNLIKELY(!IS_NUM(ch))) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor = ch - '0'; + UPDATE_STATE(s_res_http_end); + break; + + case s_res_http_end: + { + if (UNLIKELY(ch != ' ')) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + UPDATE_STATE(s_res_first_status_code); + break; + } + + case s_res_first_status_code: + { + if (!IS_NUM(ch)) { + if (ch == ' ') { + break; + } + + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + parser->status_code = ch - '0'; + UPDATE_STATE(s_res_status_code); + break; + } + + case s_res_status_code: + { + if (!IS_NUM(ch)) { + switch (ch) { + case ' ': + UPDATE_STATE(s_res_status_start); + break; + case CR: + case LF: + UPDATE_STATE(s_res_status_start); + REEXECUTE(); + break; + default: + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + break; + } + + parser->status_code *= 10; + parser->status_code += ch - '0'; + + if (UNLIKELY(parser->status_code > 999)) { + SET_ERRNO(HPE_INVALID_STATUS); + goto error; + } + + break; + } + + case s_res_status_start: + { + MARK(status); + UPDATE_STATE(s_res_status); + parser->index = 0; + + if (ch == CR || ch == LF) + REEXECUTE(); + + break; + } + + case s_res_status: + if (ch == CR) { + UPDATE_STATE(s_res_line_almost_done); + CALLBACK_DATA(status); + break; + } + + if (ch == LF) { + UPDATE_STATE(s_header_field_start); + CALLBACK_DATA(status); + break; + } + + break; + + case s_res_line_almost_done: + STRICT_CHECK(ch != LF); + UPDATE_STATE(s_header_field_start); + break; + + case s_start_req: + { + if (ch == CR || ch == LF) + break; + parser->flags = 0; + parser->uses_transfer_encoding = 0; + parser->content_length = ULLONG_MAX; + + if (UNLIKELY(!IS_ALPHA(ch))) { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + parser->method = (enum http_method) 0; + parser->index = 1; + switch (ch) { + case 'A': parser->method = HTTP_ACL; break; + case 'B': parser->method = HTTP_BIND; break; + case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break; + case 'D': parser->method = HTTP_DELETE; break; + case 'G': parser->method = HTTP_GET; break; + case 'H': parser->method = HTTP_HEAD; break; + case 'L': parser->method = HTTP_LOCK; /* or LINK */ break; + case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH, MKCALENDAR */ break; + case 'N': parser->method = HTTP_NOTIFY; break; + case 'O': parser->method = HTTP_OPTIONS; break; + case 'P': parser->method = HTTP_POST; + /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */ + break; + case 'R': parser->method = HTTP_REPORT; /* or REBIND */ break; + case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH, SOURCE */ break; + case 'T': parser->method = HTTP_TRACE; break; + case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE, UNBIND, UNLINK */ break; + default: + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + UPDATE_STATE(s_req_method); + + CALLBACK_NOTIFY(message_begin); + + break; + } + + case s_req_method: + { + const char *matcher; + if (UNLIKELY(ch == '\0')) { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + matcher = method_strings[parser->method]; + if (ch == ' ' && matcher[parser->index] == '\0') { + UPDATE_STATE(s_req_spaces_before_url); + } else if (ch == matcher[parser->index]) { + ; /* nada */ + } else if ((ch >= 'A' && ch <= 'Z') || ch == '-') { + + switch (parser->method << 16 | parser->index << 8 | ch) { +#define XX(meth, pos, ch, new_meth) \ + case (HTTP_##meth << 16 | pos << 8 | ch): \ + parser->method = HTTP_##new_meth; break; + + XX(POST, 1, 'U', PUT) + XX(POST, 1, 'A', PATCH) + XX(POST, 1, 'R', PROPFIND) + XX(PUT, 2, 'R', PURGE) + XX(CONNECT, 1, 'H', CHECKOUT) + XX(CONNECT, 2, 'P', COPY) + XX(MKCOL, 1, 'O', MOVE) + XX(MKCOL, 1, 'E', MERGE) + XX(MKCOL, 1, '-', MSEARCH) + XX(MKCOL, 2, 'A', MKACTIVITY) + XX(MKCOL, 3, 'A', MKCALENDAR) + XX(SUBSCRIBE, 1, 'E', SEARCH) + XX(SUBSCRIBE, 1, 'O', SOURCE) + XX(REPORT, 2, 'B', REBIND) + XX(PROPFIND, 4, 'P', PROPPATCH) + XX(LOCK, 1, 'I', LINK) + XX(UNLOCK, 2, 'S', UNSUBSCRIBE) + XX(UNLOCK, 2, 'B', UNBIND) + XX(UNLOCK, 3, 'I', UNLINK) +#undef XX + default: + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + } else { + SET_ERRNO(HPE_INVALID_METHOD); + goto error; + } + + ++parser->index; + break; + } + + case s_req_spaces_before_url: + { + if (ch == ' ') break; + + MARK(url); + if (parser->method == HTTP_CONNECT) { + UPDATE_STATE(s_req_server_start); + } + + UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch)); + if (UNLIKELY(CURRENT_STATE() == s_dead)) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + + break; + } + + case s_req_schema: + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_server_start: + { + switch (ch) { + /* No whitespace allowed here */ + case ' ': + case CR: + case LF: + SET_ERRNO(HPE_INVALID_URL); + goto error; + default: + UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch)); + if (UNLIKELY(CURRENT_STATE() == s_dead)) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + } + + break; + } + + case s_req_server: + case s_req_server_with_at: + case s_req_path: + case s_req_query_string_start: + case s_req_query_string: + case s_req_fragment_start: + case s_req_fragment: + { + switch (ch) { + case ' ': + UPDATE_STATE(s_req_http_start); + CALLBACK_DATA(url); + break; + case CR: + case LF: + parser->http_major = 0; + parser->http_minor = 9; + UPDATE_STATE((ch == CR) ? + s_req_line_almost_done : + s_header_field_start); + CALLBACK_DATA(url); + break; + default: + UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch)); + if (UNLIKELY(CURRENT_STATE() == s_dead)) { + SET_ERRNO(HPE_INVALID_URL); + goto error; + } + } + break; + } + + case s_req_http_start: + switch (ch) { + case ' ': + break; + case 'H': + UPDATE_STATE(s_req_http_H); + break; + case 'I': + if (parser->method == HTTP_SOURCE) { + UPDATE_STATE(s_req_http_I); + break; + } + /* fall through */ + default: + SET_ERRNO(HPE_INVALID_CONSTANT); + goto error; + } + break; + + case s_req_http_H: + STRICT_CHECK(ch != 'T'); + UPDATE_STATE(s_req_http_HT); + break; + + case s_req_http_HT: + STRICT_CHECK(ch != 'T'); + UPDATE_STATE(s_req_http_HTT); + break; + + case s_req_http_HTT: + STRICT_CHECK(ch != 'P'); + UPDATE_STATE(s_req_http_HTTP); + break; + + case s_req_http_I: + STRICT_CHECK(ch != 'C'); + UPDATE_STATE(s_req_http_IC); + break; + + case s_req_http_IC: + STRICT_CHECK(ch != 'E'); + UPDATE_STATE(s_req_http_HTTP); /* Treat "ICE" as "HTTP". */ + break; + + case s_req_http_HTTP: + STRICT_CHECK(ch != '/'); + UPDATE_STATE(s_req_http_major); + break; + + case s_req_http_major: + if (UNLIKELY(!IS_NUM(ch))) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_major = ch - '0'; + UPDATE_STATE(s_req_http_dot); + break; + + case s_req_http_dot: + { + if (UNLIKELY(ch != '.')) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + UPDATE_STATE(s_req_http_minor); + break; + } + + case s_req_http_minor: + if (UNLIKELY(!IS_NUM(ch))) { + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + } + + parser->http_minor = ch - '0'; + UPDATE_STATE(s_req_http_end); + break; + + case s_req_http_end: + { + if (ch == CR) { + UPDATE_STATE(s_req_line_almost_done); + break; + } + + if (ch == LF) { + UPDATE_STATE(s_header_field_start); + break; + } + + SET_ERRNO(HPE_INVALID_VERSION); + goto error; + break; + } + + /* end of request line */ + case s_req_line_almost_done: + { + if (UNLIKELY(ch != LF)) { + SET_ERRNO(HPE_LF_EXPECTED); + goto error; + } + + UPDATE_STATE(s_header_field_start); + break; + } + + case s_header_field_start: + { + if (ch == CR) { + UPDATE_STATE(s_headers_almost_done); + break; + } + + if (ch == LF) { + /* they might be just sending \n instead of \r\n so this would be + * the second \n to denote the end of headers*/ + UPDATE_STATE(s_headers_almost_done); + REEXECUTE(); + } + + c = TOKEN(ch); + + if (UNLIKELY(!c)) { + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + + MARK(header_field); + + parser->index = 0; + UPDATE_STATE(s_header_field); + + switch (c) { + case 'c': + parser->header_state = h_C; + break; + + case 'p': + parser->header_state = h_matching_proxy_connection; + break; + + case 't': + parser->header_state = h_matching_transfer_encoding; + break; + + case 'u': + parser->header_state = h_matching_upgrade; + break; + + default: + parser->header_state = h_general; + break; + } + break; + } + + case s_header_field: + { + const char* start = p; + for (; p != data + len; p++) { + ch = *p; + c = TOKEN(ch); + + if (!c) + break; + + switch (parser->header_state) { + case h_general: { + size_t left = data + len - p; + const char* pe = p + MIN(left, max_header_size); + while (p+1 < pe && TOKEN(p[1])) { + p++; + } + break; + } + + case h_C: + parser->index++; + parser->header_state = (c == 'o' ? h_CO : h_general); + break; + + case h_CO: + parser->index++; + parser->header_state = (c == 'n' ? h_CON : h_general); + break; + + case h_CON: + parser->index++; + switch (c) { + case 'n': + parser->header_state = h_matching_connection; + break; + case 't': + parser->header_state = h_matching_content_length; + break; + default: + parser->header_state = h_general; + break; + } + break; + + /* connection */ + + case h_matching_connection: + parser->index++; + if (parser->index > sizeof(CONNECTION)-1 + || c != CONNECTION[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CONNECTION)-2) { + parser->header_state = h_connection; + } + break; + + /* proxy-connection */ + + case h_matching_proxy_connection: + parser->index++; + if (parser->index > sizeof(PROXY_CONNECTION)-1 + || c != PROXY_CONNECTION[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(PROXY_CONNECTION)-2) { + parser->header_state = h_connection; + } + break; + + /* content-length */ + + case h_matching_content_length: + parser->index++; + if (parser->index > sizeof(CONTENT_LENGTH)-1 + || c != CONTENT_LENGTH[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(CONTENT_LENGTH)-2) { + parser->header_state = h_content_length; + } + break; + + /* transfer-encoding */ + + case h_matching_transfer_encoding: + parser->index++; + if (parser->index > sizeof(TRANSFER_ENCODING)-1 + || c != TRANSFER_ENCODING[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) { + parser->header_state = h_transfer_encoding; + parser->uses_transfer_encoding = 1; + } + break; + + /* upgrade */ + + case h_matching_upgrade: + parser->index++; + if (parser->index > sizeof(UPGRADE)-1 + || c != UPGRADE[parser->index]) { + parser->header_state = h_general; + } else if (parser->index == sizeof(UPGRADE)-2) { + parser->header_state = h_upgrade; + } + break; + + case h_connection: + case h_content_length: + case h_transfer_encoding: + case h_upgrade: + if (ch != ' ') parser->header_state = h_general; + break; + + default: + assert(0 && "Unknown header_state"); + break; + } + } + + if (p == data + len) { + --p; + COUNT_HEADER_SIZE(p - start); + break; + } + + COUNT_HEADER_SIZE(p - start); + + if (ch == ':') { + UPDATE_STATE(s_header_value_discard_ws); + CALLBACK_DATA(header_field); + break; + } + + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + + case s_header_value_discard_ws: + if (ch == ' ' || ch == '\t') break; + + if (ch == CR) { + UPDATE_STATE(s_header_value_discard_ws_almost_done); + break; + } + + if (ch == LF) { + UPDATE_STATE(s_header_value_discard_lws); + break; + } + + /* fall through */ + + case s_header_value_start: + { + MARK(header_value); + + UPDATE_STATE(s_header_value); + parser->index = 0; + + c = LOWER(ch); + + switch (parser->header_state) { + case h_upgrade: + parser->flags |= F_UPGRADE; + parser->header_state = h_general; + break; + + case h_transfer_encoding: + /* looking for 'Transfer-Encoding: chunked' */ + if ('c' == c) { + parser->header_state = h_matching_transfer_encoding_chunked; + } else { + parser->header_state = h_matching_transfer_encoding_token; + } + break; + + /* Multi-value `Transfer-Encoding` header */ + case h_matching_transfer_encoding_token_start: + break; + + case h_content_length: + if (UNLIKELY(!IS_NUM(ch))) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + if (parser->flags & F_CONTENTLENGTH) { + SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH); + goto error; + } + + parser->flags |= F_CONTENTLENGTH; + parser->content_length = ch - '0'; + parser->header_state = h_content_length_num; + break; + + /* when obsolete line folding is encountered for content length + * continue to the s_header_value state */ + case h_content_length_ws: + break; + + case h_connection: + /* looking for 'Connection: keep-alive' */ + if (c == 'k') { + parser->header_state = h_matching_connection_keep_alive; + /* looking for 'Connection: close' */ + } else if (c == 'c') { + parser->header_state = h_matching_connection_close; + } else if (c == 'u') { + parser->header_state = h_matching_connection_upgrade; + } else { + parser->header_state = h_matching_connection_token; + } + break; + + /* Multi-value `Connection` header */ + case h_matching_connection_token_start: + break; + + default: + parser->header_state = h_general; + break; + } + break; + } + + case s_header_value: + { + const char* start = p; + enum header_states h_state = (enum header_states) parser->header_state; + for (; p != data + len; p++) { + ch = *p; + if (ch == CR) { + UPDATE_STATE(s_header_almost_done); + parser->header_state = h_state; + CALLBACK_DATA(header_value); + break; + } + + if (ch == LF) { + UPDATE_STATE(s_header_almost_done); + COUNT_HEADER_SIZE(p - start); + parser->header_state = h_state; + CALLBACK_DATA_NOADVANCE(header_value); + REEXECUTE(); + } + + if (!lenient && !IS_HEADER_CHAR(ch)) { + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + + c = LOWER(ch); + + switch (h_state) { + case h_general: + { + size_t left = data + len - p; + const char* pe = p + MIN(left, max_header_size); + + for (; p != pe; p++) { + ch = *p; + if (ch == CR || ch == LF) { + --p; + break; + } + if (!lenient && !IS_HEADER_CHAR(ch)) { + SET_ERRNO(HPE_INVALID_HEADER_TOKEN); + goto error; + } + } + if (p == data + len) + --p; + break; + } + + case h_connection: + case h_transfer_encoding: + assert(0 && "Shouldn't get here."); + break; + + case h_content_length: + if (ch == ' ') break; + h_state = h_content_length_num; + /* fall through */ + + case h_content_length_num: + { + uint64_t t; + + if (ch == ' ') { + h_state = h_content_length_ws; + break; + } + + if (UNLIKELY(!IS_NUM(ch))) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + parser->header_state = h_state; + goto error; + } + + t = parser->content_length; + t *= 10; + t += ch - '0'; + + /* Overflow? Test against a conservative limit for simplicity. */ + if (UNLIKELY((ULLONG_MAX - 10) / 10 < parser->content_length)) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + parser->header_state = h_state; + goto error; + } + + parser->content_length = t; + break; + } + + case h_content_length_ws: + if (ch == ' ') break; + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + parser->header_state = h_state; + goto error; + + /* Transfer-Encoding: chunked */ + case h_matching_transfer_encoding_token_start: + /* looking for 'Transfer-Encoding: chunked' */ + if ('c' == c) { + h_state = h_matching_transfer_encoding_chunked; + } else if (STRICT_TOKEN(c)) { + /* TODO(indutny): similar code below does this, but why? + * At the very least it seems to be inconsistent given that + * h_matching_transfer_encoding_token does not check for + * `STRICT_TOKEN` + */ + h_state = h_matching_transfer_encoding_token; + } else if (c == ' ' || c == '\t') { + /* Skip lws */ + } else { + h_state = h_general; + } + break; + + case h_matching_transfer_encoding_chunked: + parser->index++; + if (parser->index > sizeof(CHUNKED)-1 + || c != CHUNKED[parser->index]) { + h_state = h_matching_transfer_encoding_token; + } else if (parser->index == sizeof(CHUNKED)-2) { + h_state = h_transfer_encoding_chunked; + } + break; + + case h_matching_transfer_encoding_token: + if (ch == ',') { + h_state = h_matching_transfer_encoding_token_start; + parser->index = 0; + } + break; + + case h_matching_connection_token_start: + /* looking for 'Connection: keep-alive' */ + if (c == 'k') { + h_state = h_matching_connection_keep_alive; + /* looking for 'Connection: close' */ + } else if (c == 'c') { + h_state = h_matching_connection_close; + } else if (c == 'u') { + h_state = h_matching_connection_upgrade; + } else if (STRICT_TOKEN(c)) { + h_state = h_matching_connection_token; + } else if (c == ' ' || c == '\t') { + /* Skip lws */ + } else { + h_state = h_general; + } + break; + + /* looking for 'Connection: keep-alive' */ + case h_matching_connection_keep_alive: + parser->index++; + if (parser->index > sizeof(KEEP_ALIVE)-1 + || c != KEEP_ALIVE[parser->index]) { + h_state = h_matching_connection_token; + } else if (parser->index == sizeof(KEEP_ALIVE)-2) { + h_state = h_connection_keep_alive; + } + break; + + /* looking for 'Connection: close' */ + case h_matching_connection_close: + parser->index++; + if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) { + h_state = h_matching_connection_token; + } else if (parser->index == sizeof(CLOSE)-2) { + h_state = h_connection_close; + } + break; + + /* looking for 'Connection: upgrade' */ + case h_matching_connection_upgrade: + parser->index++; + if (parser->index > sizeof(UPGRADE) - 1 || + c != UPGRADE[parser->index]) { + h_state = h_matching_connection_token; + } else if (parser->index == sizeof(UPGRADE)-2) { + h_state = h_connection_upgrade; + } + break; + + case h_matching_connection_token: + if (ch == ',') { + h_state = h_matching_connection_token_start; + parser->index = 0; + } + break; + + case h_transfer_encoding_chunked: + if (ch != ' ') h_state = h_matching_transfer_encoding_token; + break; + + case h_connection_keep_alive: + case h_connection_close: + case h_connection_upgrade: + if (ch == ',') { + if (h_state == h_connection_keep_alive) { + parser->flags |= F_CONNECTION_KEEP_ALIVE; + } else if (h_state == h_connection_close) { + parser->flags |= F_CONNECTION_CLOSE; + } else if (h_state == h_connection_upgrade) { + parser->flags |= F_CONNECTION_UPGRADE; + } + h_state = h_matching_connection_token_start; + parser->index = 0; + } else if (ch != ' ') { + h_state = h_matching_connection_token; + } + break; + + default: + UPDATE_STATE(s_header_value); + h_state = h_general; + break; + } + } + parser->header_state = h_state; + + if (p == data + len) + --p; + + COUNT_HEADER_SIZE(p - start); + break; + } + + case s_header_almost_done: + { + if (UNLIKELY(ch != LF)) { + SET_ERRNO(HPE_LF_EXPECTED); + goto error; + } + + UPDATE_STATE(s_header_value_lws); + break; + } + + case s_header_value_lws: + { + if (ch == ' ' || ch == '\t') { + if (parser->header_state == h_content_length_num) { + /* treat obsolete line folding as space */ + parser->header_state = h_content_length_ws; + } + UPDATE_STATE(s_header_value_start); + REEXECUTE(); + } + + /* finished the header */ + switch (parser->header_state) { + case h_connection_keep_alive: + parser->flags |= F_CONNECTION_KEEP_ALIVE; + break; + case h_connection_close: + parser->flags |= F_CONNECTION_CLOSE; + break; + case h_transfer_encoding_chunked: + parser->flags |= F_CHUNKED; + break; + case h_connection_upgrade: + parser->flags |= F_CONNECTION_UPGRADE; + break; + default: + break; + } + + UPDATE_STATE(s_header_field_start); + REEXECUTE(); + } + + case s_header_value_discard_ws_almost_done: + { + STRICT_CHECK(ch != LF); + UPDATE_STATE(s_header_value_discard_lws); + break; + } + + case s_header_value_discard_lws: + { + if (ch == ' ' || ch == '\t') { + UPDATE_STATE(s_header_value_discard_ws); + break; + } else { + switch (parser->header_state) { + case h_connection_keep_alive: + parser->flags |= F_CONNECTION_KEEP_ALIVE; + break; + case h_connection_close: + parser->flags |= F_CONNECTION_CLOSE; + break; + case h_connection_upgrade: + parser->flags |= F_CONNECTION_UPGRADE; + break; + case h_transfer_encoding_chunked: + parser->flags |= F_CHUNKED; + break; + case h_content_length: + /* do not allow empty content length */ + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + break; + default: + break; + } + + /* header value was empty */ + MARK(header_value); + UPDATE_STATE(s_header_field_start); + CALLBACK_DATA_NOADVANCE(header_value); + REEXECUTE(); + } + } + + case s_headers_almost_done: + { + STRICT_CHECK(ch != LF); + + if (parser->flags & F_TRAILING) { + /* End of a chunked request */ + UPDATE_STATE(s_message_done); + CALLBACK_NOTIFY_NOADVANCE(chunk_complete); + REEXECUTE(); + } + + /* Cannot use transfer-encoding and a content-length header together + per the HTTP specification. (RFC 7230 Section 3.3.3) */ + if ((parser->uses_transfer_encoding == 1) && + (parser->flags & F_CONTENTLENGTH)) { + /* Allow it for lenient parsing as long as `Transfer-Encoding` is + * not `chunked` or allow_length_with_encoding is set + */ + if (parser->flags & F_CHUNKED) { + if (!allow_chunked_length) { + SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH); + goto error; + } + } else if (!lenient) { + SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH); + goto error; + } + } + + UPDATE_STATE(s_headers_done); + + /* Set this here so that on_headers_complete() callbacks can see it */ + if ((parser->flags & F_UPGRADE) && + (parser->flags & F_CONNECTION_UPGRADE)) { + /* For responses, "Upgrade: foo" and "Connection: upgrade" are + * mandatory only when it is a 101 Switching Protocols response, + * otherwise it is purely informational, to announce support. + */ + parser->upgrade = + (parser->type == HTTP_REQUEST || parser->status_code == 101); + } else { + parser->upgrade = (parser->method == HTTP_CONNECT); + } + + /* Here we call the headers_complete callback. This is somewhat + * different than other callbacks because if the user returns 1, we + * will interpret that as saying that this message has no body. This + * is needed for the annoying case of recieving a response to a HEAD + * request. + * + * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so + * we have to simulate it by handling a change in errno below. + */ + if (settings->on_headers_complete) { + switch (settings->on_headers_complete(parser)) { + case 0: + break; + + case 2: + parser->upgrade = 1; + + /* fall through */ + case 1: + parser->flags |= F_SKIPBODY; + break; + + default: + SET_ERRNO(HPE_CB_headers_complete); + RETURN(p - data); /* Error */ + } + } + + if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { + RETURN(p - data); + } + + REEXECUTE(); + } + + case s_headers_done: + { + int hasBody; + STRICT_CHECK(ch != LF); + + parser->nread = 0; + nread = 0; + + hasBody = parser->flags & F_CHUNKED || + (parser->content_length > 0 && parser->content_length != ULLONG_MAX); + if (parser->upgrade && (parser->method == HTTP_CONNECT || + (parser->flags & F_SKIPBODY) || !hasBody)) { + /* Exit, the rest of the message is in a different protocol. */ + UPDATE_STATE(NEW_MESSAGE()); + CALLBACK_NOTIFY(message_complete); + RETURN((p - data) + 1); + } + + if (parser->flags & F_SKIPBODY) { + UPDATE_STATE(NEW_MESSAGE()); + CALLBACK_NOTIFY(message_complete); + } else if (parser->flags & F_CHUNKED) { + /* chunked encoding - ignore Content-Length header, + * prepare for a chunk */ + UPDATE_STATE(s_chunk_size_start); + } else if (parser->uses_transfer_encoding == 1) { + if (parser->type == HTTP_REQUEST && !lenient) { + /* RFC 7230 3.3.3 */ + + /* If a Transfer-Encoding header field + * is present in a request and the chunked transfer coding is not + * the final encoding, the message body length cannot be determined + * reliably; the server MUST respond with the 400 (Bad Request) + * status code and then close the connection. + */ + SET_ERRNO(HPE_INVALID_TRANSFER_ENCODING); + RETURN(p - data); /* Error */ + } else { + /* RFC 7230 3.3.3 */ + + /* If a Transfer-Encoding header field is present in a response and + * the chunked transfer coding is not the final encoding, the + * message body length is determined by reading the connection until + * it is closed by the server. + */ + UPDATE_STATE(s_body_identity_eof); + } + } else { + if (parser->content_length == 0) { + /* Content-Length header given but zero: Content-Length: 0\r\n */ + UPDATE_STATE(NEW_MESSAGE()); + CALLBACK_NOTIFY(message_complete); + } else if (parser->content_length != ULLONG_MAX) { + /* Content-Length header given and non-zero */ + UPDATE_STATE(s_body_identity); + } else { + if (!http_message_needs_eof(parser)) { + /* Assume content-length 0 - read the next */ + UPDATE_STATE(NEW_MESSAGE()); + CALLBACK_NOTIFY(message_complete); + } else { + /* Read body until EOF */ + UPDATE_STATE(s_body_identity_eof); + } + } + } + + break; + } + + case s_body_identity: + { + uint64_t to_read = MIN(parser->content_length, + (uint64_t) ((data + len) - p)); + + assert(parser->content_length != 0 + && parser->content_length != ULLONG_MAX); + + /* The difference between advancing content_length and p is because + * the latter will automaticaly advance on the next loop iteration. + * Further, if content_length ends up at 0, we want to see the last + * byte again for our message complete callback. + */ + MARK(body); + parser->content_length -= to_read; + p += to_read - 1; + + if (parser->content_length == 0) { + UPDATE_STATE(s_message_done); + + /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte. + * + * The alternative to doing this is to wait for the next byte to + * trigger the data callback, just as in every other case. The + * problem with this is that this makes it difficult for the test + * harness to distinguish between complete-on-EOF and + * complete-on-length. It's not clear that this distinction is + * important for applications, but let's keep it for now. + */ + CALLBACK_DATA_(body, p - body_mark + 1, p - data); + REEXECUTE(); + } + + break; + } + + /* read until EOF */ + case s_body_identity_eof: + MARK(body); + p = data + len - 1; + + break; + + case s_message_done: + UPDATE_STATE(NEW_MESSAGE()); + CALLBACK_NOTIFY(message_complete); + if (parser->upgrade) { + /* Exit, the rest of the message is in a different protocol. */ + RETURN((p - data) + 1); + } + break; + + case s_chunk_size_start: + { + assert(nread == 1); + assert(parser->flags & F_CHUNKED); + + unhex_val = unhex[(unsigned char)ch]; + if (UNLIKELY(unhex_val == -1)) { + SET_ERRNO(HPE_INVALID_CHUNK_SIZE); + goto error; + } + + parser->content_length = unhex_val; + UPDATE_STATE(s_chunk_size); + break; + } + + case s_chunk_size: + { + uint64_t t; + + assert(parser->flags & F_CHUNKED); + + if (ch == CR) { + UPDATE_STATE(s_chunk_size_almost_done); + break; + } + + unhex_val = unhex[(unsigned char)ch]; + + if (unhex_val == -1) { + if (ch == ';' || ch == ' ') { + UPDATE_STATE(s_chunk_parameters); + break; + } + + SET_ERRNO(HPE_INVALID_CHUNK_SIZE); + goto error; + } + + t = parser->content_length; + t *= 16; + t += unhex_val; + + /* Overflow? Test against a conservative limit for simplicity. */ + if (UNLIKELY((ULLONG_MAX - 16) / 16 < parser->content_length)) { + SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); + goto error; + } + + parser->content_length = t; + break; + } + + case s_chunk_parameters: + { + assert(parser->flags & F_CHUNKED); + /* just ignore this shit. TODO check for overflow */ + if (ch == CR) { + UPDATE_STATE(s_chunk_size_almost_done); + break; + } + break; + } + + case s_chunk_size_almost_done: + { + assert(parser->flags & F_CHUNKED); + STRICT_CHECK(ch != LF); + + parser->nread = 0; + nread = 0; + + if (parser->content_length == 0) { + parser->flags |= F_TRAILING; + UPDATE_STATE(s_header_field_start); + } else { + UPDATE_STATE(s_chunk_data); + } + CALLBACK_NOTIFY(chunk_header); + break; + } + + case s_chunk_data: + { + uint64_t to_read = MIN(parser->content_length, + (uint64_t) ((data + len) - p)); + + assert(parser->flags & F_CHUNKED); + assert(parser->content_length != 0 + && parser->content_length != ULLONG_MAX); + + /* See the explanation in s_body_identity for why the content + * length and data pointers are managed this way. + */ + MARK(body); + parser->content_length -= to_read; + p += to_read - 1; + + if (parser->content_length == 0) { + UPDATE_STATE(s_chunk_data_almost_done); + } + + break; + } + + case s_chunk_data_almost_done: + assert(parser->flags & F_CHUNKED); + assert(parser->content_length == 0); + STRICT_CHECK(ch != CR); + UPDATE_STATE(s_chunk_data_done); + CALLBACK_DATA(body); + break; + + case s_chunk_data_done: + assert(parser->flags & F_CHUNKED); + STRICT_CHECK(ch != LF); + parser->nread = 0; + nread = 0; + UPDATE_STATE(s_chunk_size_start); + CALLBACK_NOTIFY(chunk_complete); + break; + + default: + assert(0 && "unhandled state"); + SET_ERRNO(HPE_INVALID_INTERNAL_STATE); + goto error; + } + } + + /* Run callbacks for any marks that we have leftover after we ran out of + * bytes. There should be at most one of these set, so it's OK to invoke + * them in series (unset marks will not result in callbacks). + * + * We use the NOADVANCE() variety of callbacks here because 'p' has already + * overflowed 'data' and this allows us to correct for the off-by-one that + * we'd otherwise have (since CALLBACK_DATA() is meant to be run with a 'p' + * value that's in-bounds). + */ + + assert(((header_field_mark ? 1 : 0) + + (header_value_mark ? 1 : 0) + + (url_mark ? 1 : 0) + + (body_mark ? 1 : 0) + + (status_mark ? 1 : 0)) <= 1); + + CALLBACK_DATA_NOADVANCE(header_field); + CALLBACK_DATA_NOADVANCE(header_value); + CALLBACK_DATA_NOADVANCE(url); + CALLBACK_DATA_NOADVANCE(body); + CALLBACK_DATA_NOADVANCE(status); + + RETURN(len); + +error: + if (HTTP_PARSER_ERRNO(parser) == HPE_OK) { + SET_ERRNO(HPE_UNKNOWN); + } + + RETURN(p - data); +} + + +/* Does the parser need to see an EOF to find the end of the message? */ +int +http_message_needs_eof (const http_parser *parser) +{ + if (parser->type == HTTP_REQUEST) { + return 0; + } + + /* See RFC 2616 section 4.4 */ + if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */ + parser->status_code == 204 || /* No Content */ + parser->status_code == 304 || /* Not Modified */ + parser->flags & F_SKIPBODY) { /* response to a HEAD request */ + return 0; + } + + /* RFC 7230 3.3.3, see `s_headers_almost_done` */ + if ((parser->uses_transfer_encoding == 1) && + (parser->flags & F_CHUNKED) == 0) { + return 1; + } + + if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) { + return 0; + } + + return 1; +} + + +int +http_should_keep_alive (const http_parser *parser) +{ + if (parser->http_major > 0 && parser->http_minor > 0) { + /* HTTP/1.1 */ + if (parser->flags & F_CONNECTION_CLOSE) { + return 0; + } + } else { + /* HTTP/1.0 or earlier */ + if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) { + return 0; + } + } + + return !http_message_needs_eof(parser); +} + + +const char * +http_method_str (enum http_method m) +{ + return ELEM_AT(method_strings, m, ""); +} + +const char * +http_status_str (enum http_status s) +{ + switch (s) { +#define XX(num, name, string) case HTTP_STATUS_##name: return #string; + HTTP_STATUS_MAP(XX) +#undef XX + default: return ""; + } +} + +void +http_parser_init (http_parser *parser, enum http_parser_type t) +{ + void *data = parser->data; /* preserve application data */ + memset(parser, 0, sizeof(*parser)); + parser->data = data; + parser->type = t; + parser->state = (t == HTTP_REQUEST ? s_start_req : (t == HTTP_RESPONSE ? s_start_res : s_start_req_or_res)); + parser->http_errno = HPE_OK; +} + +void +http_parser_settings_init(http_parser_settings *settings) +{ + memset(settings, 0, sizeof(*settings)); +} + +const char * +http_errno_name(enum http_errno err) { + assert(((size_t) err) < ARRAY_SIZE(http_strerror_tab)); + return http_strerror_tab[err].name; +} + +const char * +http_errno_description(enum http_errno err) { + assert(((size_t) err) < ARRAY_SIZE(http_strerror_tab)); + return http_strerror_tab[err].description; +} + +static enum http_host_state +http_parse_host_char(enum http_host_state s, const char ch) { + switch(s) { + case s_http_userinfo: + case s_http_userinfo_start: + if (ch == '@') { + return s_http_host_start; + } + + if (IS_USERINFO_CHAR(ch)) { + return s_http_userinfo; + } + break; + + case s_http_host_start: + if (ch == '[') { + return s_http_host_v6_start; + } + + if (IS_HOST_CHAR(ch)) { + return s_http_host; + } + + break; + + case s_http_host: + if (IS_HOST_CHAR(ch)) { + return s_http_host; + } + + /* fall through */ + case s_http_host_v6_end: + if (ch == ':') { + return s_http_host_port_start; + } + + break; + + case s_http_host_v6: + if (ch == ']') { + return s_http_host_v6_end; + } + + /* fall through */ + case s_http_host_v6_start: + if (IS_HEX(ch) || ch == ':' || ch == '.') { + return s_http_host_v6; + } + + if (s == s_http_host_v6 && ch == '%') { + return s_http_host_v6_zone_start; + } + break; + + case s_http_host_v6_zone: + if (ch == ']') { + return s_http_host_v6_end; + } + + /* fall through */ + case s_http_host_v6_zone_start: + /* RFC 6874 Zone ID consists of 1*( unreserved / pct-encoded) */ + if (IS_ALPHANUM(ch) || ch == '%' || ch == '.' || ch == '-' || ch == '_' || + ch == '~') { + return s_http_host_v6_zone; + } + break; + + case s_http_host_port: + case s_http_host_port_start: + if (IS_NUM(ch)) { + return s_http_host_port; + } + + break; + + default: + break; + } + return s_http_host_dead; +} + +static int +http_parse_host(const char * buf, struct http_parser_url *u, int found_at) { + enum http_host_state s; + + const char *p; + size_t buflen = u->field_data[UF_HOST].off + u->field_data[UF_HOST].len; + + assert(u->field_set & (1 << UF_HOST)); + + u->field_data[UF_HOST].len = 0; + + s = found_at ? s_http_userinfo_start : s_http_host_start; + + for (p = buf + u->field_data[UF_HOST].off; p < buf + buflen; p++) { + enum http_host_state new_s = http_parse_host_char(s, *p); + + if (new_s == s_http_host_dead) { + return 1; + } + + switch(new_s) { + case s_http_host: + if (s != s_http_host) { + u->field_data[UF_HOST].off = (uint16_t)(p - buf); + } + u->field_data[UF_HOST].len++; + break; + + case s_http_host_v6: + if (s != s_http_host_v6) { + u->field_data[UF_HOST].off = (uint16_t)(p - buf); + } + u->field_data[UF_HOST].len++; + break; + + case s_http_host_v6_zone_start: + case s_http_host_v6_zone: + u->field_data[UF_HOST].len++; + break; + + case s_http_host_port: + if (s != s_http_host_port) { + u->field_data[UF_PORT].off = (uint16_t)(p - buf); + u->field_data[UF_PORT].len = 0; + u->field_set |= (1 << UF_PORT); + } + u->field_data[UF_PORT].len++; + break; + + case s_http_userinfo: + if (s != s_http_userinfo) { + u->field_data[UF_USERINFO].off = (uint16_t)(p - buf); + u->field_data[UF_USERINFO].len = 0; + u->field_set |= (1 << UF_USERINFO); + } + u->field_data[UF_USERINFO].len++; + break; + + default: + break; + } + s = new_s; + } + + /* Make sure we don't end somewhere unexpected */ + switch (s) { + case s_http_host_start: + case s_http_host_v6_start: + case s_http_host_v6: + case s_http_host_v6_zone_start: + case s_http_host_v6_zone: + case s_http_host_port_start: + case s_http_userinfo: + case s_http_userinfo_start: + return 1; + default: + break; + } + + return 0; +} + +void +http_parser_url_init(struct http_parser_url *u) { + memset(u, 0, sizeof(*u)); +} + +int +http_parser_parse_url(const char *buf, size_t buflen, int is_connect, + struct http_parser_url *u) +{ + enum state s; + const char *p; + enum http_parser_url_fields uf, old_uf; + int found_at = 0; + + if (buflen == 0) { + return 1; + } + + u->port = u->field_set = 0; + s = is_connect ? s_req_server_start : s_req_spaces_before_url; + old_uf = UF_MAX; + + for (p = buf; p < buf + buflen; p++) { + s = parse_url_char(s, *p); + + /* Figure out the next field that we're operating on */ + switch (s) { + case s_dead: + return 1; + + /* Skip delimeters */ + case s_req_schema_slash: + case s_req_schema_slash_slash: + case s_req_server_start: + case s_req_query_string_start: + case s_req_fragment_start: + continue; + + case s_req_schema: + uf = UF_SCHEMA; + break; + + case s_req_server_with_at: + found_at = 1; + + /* fall through */ + case s_req_server: + uf = UF_HOST; + break; + + case s_req_path: + uf = UF_PATH; + break; + + case s_req_query_string: + uf = UF_QUERY; + break; + + case s_req_fragment: + uf = UF_FRAGMENT; + break; + + default: + assert(!"Unexpected state"); + return 1; + } + + /* Nothing's changed; soldier on */ + if (uf == old_uf) { + u->field_data[uf].len++; + continue; + } + + u->field_data[uf].off = (uint16_t)(p - buf); + u->field_data[uf].len = 1; + + u->field_set |= (1 << uf); + old_uf = uf; + } + + /* host must be present if there is a schema */ + /* parsing http:///toto will fail */ + if ((u->field_set & (1 << UF_SCHEMA)) && + (u->field_set & (1 << UF_HOST)) == 0) { + return 1; + } + + if (u->field_set & (1 << UF_HOST)) { + if (http_parse_host(buf, u, found_at) != 0) { + return 1; + } + } + + /* CONNECT requests can only contain "hostname:port" */ + if (is_connect && u->field_set != ((1 << UF_HOST)|(1 << UF_PORT))) { + return 1; + } + + if (u->field_set & (1 << UF_PORT)) { + uint16_t off; + uint16_t len; + const char* p; + const char* end; + unsigned long v; + + off = u->field_data[UF_PORT].off; + len = u->field_data[UF_PORT].len; + end = buf + off + len; + + /* NOTE: The characters are already validated and are in the [0-9] range */ + assert((size_t) (off + len) <= buflen && "Port number overflow"); + v = 0; + for (p = buf + off; p < end; p++) { + v *= 10; + v += *p - '0'; + + /* Ports have a max value of 2^16 */ + if (v > 0xffff) { + return 1; + } + } + + u->port = (uint16_t) v; + } + + return 0; +} + +void +http_parser_pause(http_parser *parser, int paused) { + /* Users should only be pausing/unpausing a parser that is not in an error + * state. In non-debug builds, there's not much that we can do about this + * other than ignore it. + */ + if (HTTP_PARSER_ERRNO(parser) == HPE_OK || + HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) { + uint32_t nread = parser->nread; /* used by the SET_ERRNO macro */ + SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK); + } else { + assert(0 && "Attempting to pause parser in error state"); + } +} + +int +http_body_is_final(const struct http_parser *parser) { + return parser->state == s_message_done; +} + +unsigned long +http_parser_version(void) { + return HTTP_PARSER_VERSION_MAJOR * 0x10000 | + HTTP_PARSER_VERSION_MINOR * 0x00100 | + HTTP_PARSER_VERSION_PATCH * 0x00001; +} + +void +http_parser_set_max_header_size(uint32_t size) { + max_header_size = size; +} diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/http_parser.gyp b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/http_parser.gyp new file mode 100644 index 000000000000..ef34ecaeaeab --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/http_parser.gyp @@ -0,0 +1,111 @@ +# This file is used with the GYP meta build system. +# http://code.google.com/p/gyp/ +# To build try this: +# svn co http://gyp.googlecode.com/svn/trunk gyp +# ./gyp/gyp -f make --depth=`pwd` http_parser.gyp +# ./out/Debug/test +{ + 'target_defaults': { + 'default_configuration': 'Debug', + 'configurations': { + # TODO: hoist these out and put them somewhere common, because + # RuntimeLibrary MUST MATCH across the entire project + 'Debug': { + 'defines': [ 'DEBUG', '_DEBUG' ], + 'cflags': [ '-Wall', '-Wextra', '-O0', '-g', '-ftrapv' ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 1, # static debug + }, + }, + }, + 'Release': { + 'defines': [ 'NDEBUG' ], + 'cflags': [ '-Wall', '-Wextra', '-O3' ], + 'msvs_settings': { + 'VCCLCompilerTool': { + 'RuntimeLibrary': 0, # static release + }, + }, + } + }, + 'msvs_settings': { + 'VCCLCompilerTool': { + }, + 'VCLibrarianTool': { + }, + 'VCLinkerTool': { + 'GenerateDebugInformation': 'true', + }, + }, + 'conditions': [ + ['OS == "win"', { + 'defines': [ + 'WIN32' + ], + }] + ], + }, + + 'targets': [ + { + 'target_name': 'http_parser', + 'type': 'static_library', + 'include_dirs': [ '.' ], + 'direct_dependent_settings': { + 'defines': [ 'HTTP_PARSER_STRICT=0' ], + 'include_dirs': [ '.' ], + }, + 'defines': [ 'HTTP_PARSER_STRICT=0' ], + 'sources': [ './http_parser.c', ], + 'conditions': [ + ['OS=="win"', { + 'msvs_settings': { + 'VCCLCompilerTool': { + # Compile as C++. http_parser.c is actually C99, but C++ is + # close enough in this case. + 'CompileAs': 2, + }, + }, + }] + ], + }, + + { + 'target_name': 'http_parser_strict', + 'type': 'static_library', + 'include_dirs': [ '.' ], + 'direct_dependent_settings': { + 'defines': [ 'HTTP_PARSER_STRICT=1' ], + 'include_dirs': [ '.' ], + }, + 'defines': [ 'HTTP_PARSER_STRICT=1' ], + 'sources': [ './http_parser.c', ], + 'conditions': [ + ['OS=="win"', { + 'msvs_settings': { + 'VCCLCompilerTool': { + # Compile as C++. http_parser.c is actually C99, but C++ is + # close enough in this case. + 'CompileAs': 2, + }, + }, + }] + ], + }, + + { + 'target_name': 'test-nonstrict', + 'type': 'executable', + 'dependencies': [ 'http_parser' ], + 'sources': [ 'test.c' ] + }, + + { + 'target_name': 'test-strict', + 'type': 'executable', + 'dependencies': [ 'http_parser_strict' ], + 'sources': [ 'test.c' ] + } + ] +} diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/http_parser.h b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/http_parser.h new file mode 100644 index 000000000000..3772b3994fe4 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/http_parser.h @@ -0,0 +1,449 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#ifndef http_parser_h +#define http_parser_h +#ifdef __cplusplus +extern "C" { +#endif + +/* Also update SONAME in the Makefile whenever you change these. */ +#define HTTP_PARSER_VERSION_MAJOR 2 +#define HTTP_PARSER_VERSION_MINOR 9 +#define HTTP_PARSER_VERSION_PATCH 4 + +#include +#if defined(_WIN32) && !defined(__MINGW32__) && \ + (!defined(_MSC_VER) || _MSC_VER<1600) && !defined(__WINE__) +#include +typedef __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#elif (defined(__sun) || defined(__sun__)) && defined(__SunOS_5_9) +#include +#else +#include +#endif + +/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run + * faster + */ +#ifndef HTTP_PARSER_STRICT +# define HTTP_PARSER_STRICT 1 +#endif + +/* Maximium header size allowed. If the macro is not defined + * before including this header then the default is used. To + * change the maximum header size, define the macro in the build + * environment (e.g. -DHTTP_MAX_HEADER_SIZE=). To remove + * the effective limit on the size of the header, define the macro + * to a very large number (e.g. -DHTTP_MAX_HEADER_SIZE=0x7fffffff) + */ +#ifndef HTTP_MAX_HEADER_SIZE +# define HTTP_MAX_HEADER_SIZE (80*1024) +#endif + +typedef struct http_parser http_parser; +typedef struct http_parser_settings http_parser_settings; + + +/* Callbacks should return non-zero to indicate an error. The parser will + * then halt execution. + * + * The one exception is on_headers_complete. In a HTTP_RESPONSE parser + * returning '1' from on_headers_complete will tell the parser that it + * should not expect a body. This is used when receiving a response to a + * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding: + * chunked' headers that indicate the presence of a body. + * + * Returning `2` from on_headers_complete will tell parser that it should not + * expect neither a body nor any futher responses on this connection. This is + * useful for handling responses to a CONNECT request which may not contain + * `Upgrade` or `Connection: upgrade` headers. + * + * http_data_cb does not return data chunks. It will be called arbitrarily + * many times for each string. E.G. you might get 10 callbacks for "on_url" + * each providing just a few characters more data. + */ +typedef int (*http_data_cb) (http_parser*, const char *at, size_t length); +typedef int (*http_cb) (http_parser*); + + +/* Status Codes */ +#define HTTP_STATUS_MAP(XX) \ + XX(100, CONTINUE, Continue) \ + XX(101, SWITCHING_PROTOCOLS, Switching Protocols) \ + XX(102, PROCESSING, Processing) \ + XX(200, OK, OK) \ + XX(201, CREATED, Created) \ + XX(202, ACCEPTED, Accepted) \ + XX(203, NON_AUTHORITATIVE_INFORMATION, Non-Authoritative Information) \ + XX(204, NO_CONTENT, No Content) \ + XX(205, RESET_CONTENT, Reset Content) \ + XX(206, PARTIAL_CONTENT, Partial Content) \ + XX(207, MULTI_STATUS, Multi-Status) \ + XX(208, ALREADY_REPORTED, Already Reported) \ + XX(226, IM_USED, IM Used) \ + XX(300, MULTIPLE_CHOICES, Multiple Choices) \ + XX(301, MOVED_PERMANENTLY, Moved Permanently) \ + XX(302, FOUND, Found) \ + XX(303, SEE_OTHER, See Other) \ + XX(304, NOT_MODIFIED, Not Modified) \ + XX(305, USE_PROXY, Use Proxy) \ + XX(307, TEMPORARY_REDIRECT, Temporary Redirect) \ + XX(308, PERMANENT_REDIRECT, Permanent Redirect) \ + XX(400, BAD_REQUEST, Bad Request) \ + XX(401, UNAUTHORIZED, Unauthorized) \ + XX(402, PAYMENT_REQUIRED, Payment Required) \ + XX(403, FORBIDDEN, Forbidden) \ + XX(404, NOT_FOUND, Not Found) \ + XX(405, METHOD_NOT_ALLOWED, Method Not Allowed) \ + XX(406, NOT_ACCEPTABLE, Not Acceptable) \ + XX(407, PROXY_AUTHENTICATION_REQUIRED, Proxy Authentication Required) \ + XX(408, REQUEST_TIMEOUT, Request Timeout) \ + XX(409, CONFLICT, Conflict) \ + XX(410, GONE, Gone) \ + XX(411, LENGTH_REQUIRED, Length Required) \ + XX(412, PRECONDITION_FAILED, Precondition Failed) \ + XX(413, PAYLOAD_TOO_LARGE, Payload Too Large) \ + XX(414, URI_TOO_LONG, URI Too Long) \ + XX(415, UNSUPPORTED_MEDIA_TYPE, Unsupported Media Type) \ + XX(416, RANGE_NOT_SATISFIABLE, Range Not Satisfiable) \ + XX(417, EXPECTATION_FAILED, Expectation Failed) \ + XX(421, MISDIRECTED_REQUEST, Misdirected Request) \ + XX(422, UNPROCESSABLE_ENTITY, Unprocessable Entity) \ + XX(423, LOCKED, Locked) \ + XX(424, FAILED_DEPENDENCY, Failed Dependency) \ + XX(426, UPGRADE_REQUIRED, Upgrade Required) \ + XX(428, PRECONDITION_REQUIRED, Precondition Required) \ + XX(429, TOO_MANY_REQUESTS, Too Many Requests) \ + XX(431, REQUEST_HEADER_FIELDS_TOO_LARGE, Request Header Fields Too Large) \ + XX(451, UNAVAILABLE_FOR_LEGAL_REASONS, Unavailable For Legal Reasons) \ + XX(500, INTERNAL_SERVER_ERROR, Internal Server Error) \ + XX(501, NOT_IMPLEMENTED, Not Implemented) \ + XX(502, BAD_GATEWAY, Bad Gateway) \ + XX(503, SERVICE_UNAVAILABLE, Service Unavailable) \ + XX(504, GATEWAY_TIMEOUT, Gateway Timeout) \ + XX(505, HTTP_VERSION_NOT_SUPPORTED, HTTP Version Not Supported) \ + XX(506, VARIANT_ALSO_NEGOTIATES, Variant Also Negotiates) \ + XX(507, INSUFFICIENT_STORAGE, Insufficient Storage) \ + XX(508, LOOP_DETECTED, Loop Detected) \ + XX(510, NOT_EXTENDED, Not Extended) \ + XX(511, NETWORK_AUTHENTICATION_REQUIRED, Network Authentication Required) \ + +enum http_status + { +#define XX(num, name, string) HTTP_STATUS_##name = num, + HTTP_STATUS_MAP(XX) +#undef XX + }; + + +/* Request Methods */ +#define HTTP_METHOD_MAP(XX) \ + XX(0, DELETE, DELETE) \ + XX(1, GET, GET) \ + XX(2, HEAD, HEAD) \ + XX(3, POST, POST) \ + XX(4, PUT, PUT) \ + /* pathological */ \ + XX(5, CONNECT, CONNECT) \ + XX(6, OPTIONS, OPTIONS) \ + XX(7, TRACE, TRACE) \ + /* WebDAV */ \ + XX(8, COPY, COPY) \ + XX(9, LOCK, LOCK) \ + XX(10, MKCOL, MKCOL) \ + XX(11, MOVE, MOVE) \ + XX(12, PROPFIND, PROPFIND) \ + XX(13, PROPPATCH, PROPPATCH) \ + XX(14, SEARCH, SEARCH) \ + XX(15, UNLOCK, UNLOCK) \ + XX(16, BIND, BIND) \ + XX(17, REBIND, REBIND) \ + XX(18, UNBIND, UNBIND) \ + XX(19, ACL, ACL) \ + /* subversion */ \ + XX(20, REPORT, REPORT) \ + XX(21, MKACTIVITY, MKACTIVITY) \ + XX(22, CHECKOUT, CHECKOUT) \ + XX(23, MERGE, MERGE) \ + /* upnp */ \ + XX(24, MSEARCH, M-SEARCH) \ + XX(25, NOTIFY, NOTIFY) \ + XX(26, SUBSCRIBE, SUBSCRIBE) \ + XX(27, UNSUBSCRIBE, UNSUBSCRIBE) \ + /* RFC-5789 */ \ + XX(28, PATCH, PATCH) \ + XX(29, PURGE, PURGE) \ + /* CalDAV */ \ + XX(30, MKCALENDAR, MKCALENDAR) \ + /* RFC-2068, section 19.6.1.2 */ \ + XX(31, LINK, LINK) \ + XX(32, UNLINK, UNLINK) \ + /* icecast */ \ + XX(33, SOURCE, SOURCE) \ + +enum http_method + { +#define XX(num, name, string) HTTP_##name = num, + HTTP_METHOD_MAP(XX) +#undef XX + }; + + +enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH }; + + +/* Flag values for http_parser.flags field */ +enum flags + { F_CHUNKED = 1 << 0 + , F_CONNECTION_KEEP_ALIVE = 1 << 1 + , F_CONNECTION_CLOSE = 1 << 2 + , F_CONNECTION_UPGRADE = 1 << 3 + , F_TRAILING = 1 << 4 + , F_UPGRADE = 1 << 5 + , F_SKIPBODY = 1 << 6 + , F_CONTENTLENGTH = 1 << 7 + }; + + +/* Map for errno-related constants + * + * The provided argument should be a macro that takes 2 arguments. + */ +#define HTTP_ERRNO_MAP(XX) \ + /* No error */ \ + XX(OK, "success") \ + \ + /* Callback-related errors */ \ + XX(CB_message_begin, "the on_message_begin callback failed") \ + XX(CB_url, "the on_url callback failed") \ + XX(CB_header_field, "the on_header_field callback failed") \ + XX(CB_header_value, "the on_header_value callback failed") \ + XX(CB_headers_complete, "the on_headers_complete callback failed") \ + XX(CB_body, "the on_body callback failed") \ + XX(CB_message_complete, "the on_message_complete callback failed") \ + XX(CB_status, "the on_status callback failed") \ + XX(CB_chunk_header, "the on_chunk_header callback failed") \ + XX(CB_chunk_complete, "the on_chunk_complete callback failed") \ + \ + /* Parsing-related errors */ \ + XX(INVALID_EOF_STATE, "stream ended at an unexpected time") \ + XX(HEADER_OVERFLOW, \ + "too many header bytes seen; overflow detected") \ + XX(CLOSED_CONNECTION, \ + "data received after completed connection: close message") \ + XX(INVALID_VERSION, "invalid HTTP version") \ + XX(INVALID_STATUS, "invalid HTTP status code") \ + XX(INVALID_METHOD, "invalid HTTP method") \ + XX(INVALID_URL, "invalid URL") \ + XX(INVALID_HOST, "invalid host") \ + XX(INVALID_PORT, "invalid port") \ + XX(INVALID_PATH, "invalid path") \ + XX(INVALID_QUERY_STRING, "invalid query string") \ + XX(INVALID_FRAGMENT, "invalid fragment") \ + XX(LF_EXPECTED, "LF character expected") \ + XX(INVALID_HEADER_TOKEN, "invalid character in header") \ + XX(INVALID_CONTENT_LENGTH, \ + "invalid character in content-length header") \ + XX(UNEXPECTED_CONTENT_LENGTH, \ + "unexpected content-length header") \ + XX(INVALID_CHUNK_SIZE, \ + "invalid character in chunk size header") \ + XX(INVALID_CONSTANT, "invalid constant string") \ + XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\ + XX(STRICT, "strict mode assertion failed") \ + XX(PAUSED, "parser is paused") \ + XX(UNKNOWN, "an unknown error occurred") \ + XX(INVALID_TRANSFER_ENCODING, \ + "request has invalid transfer-encoding") \ + + +/* Define HPE_* values for each errno value above */ +#define HTTP_ERRNO_GEN(n, s) HPE_##n, +enum http_errno { + HTTP_ERRNO_MAP(HTTP_ERRNO_GEN) +}; +#undef HTTP_ERRNO_GEN + + +/* Get an http_errno value from an http_parser */ +#define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno) + + +struct http_parser { + /** PRIVATE **/ + unsigned int type : 2; /* enum http_parser_type */ + unsigned int flags : 8; /* F_* values from 'flags' enum; semi-public */ + unsigned int state : 7; /* enum state from http_parser.c */ + unsigned int header_state : 7; /* enum header_state from http_parser.c */ + unsigned int index : 5; /* index into current matcher */ + unsigned int uses_transfer_encoding : 1; /* Transfer-Encoding header is present */ + unsigned int allow_chunked_length : 1; /* Allow headers with both + * `Content-Length` and + * `Transfer-Encoding: chunked` set */ + unsigned int lenient_http_headers : 1; + + uint32_t nread; /* # bytes read in various scenarios */ + uint64_t content_length; /* # bytes in body. `(uint64_t) -1` (all bits one) + * if no Content-Length header. + */ + + /** READ-ONLY **/ + unsigned short http_major; + unsigned short http_minor; + unsigned int status_code : 16; /* responses only */ + unsigned int method : 8; /* requests only */ + unsigned int http_errno : 7; + + /* 1 = Upgrade header was present and the parser has exited because of that. + * 0 = No upgrade header present. + * Should be checked when http_parser_execute() returns in addition to + * error checking. + */ + unsigned int upgrade : 1; + + /** PUBLIC **/ + void *data; /* A pointer to get hook to the "connection" or "socket" object */ +}; + + +struct http_parser_settings { + http_cb on_message_begin; + http_data_cb on_url; + http_data_cb on_status; + http_data_cb on_header_field; + http_data_cb on_header_value; + http_cb on_headers_complete; + http_data_cb on_body; + http_cb on_message_complete; + /* When on_chunk_header is called, the current chunk length is stored + * in parser->content_length. + */ + http_cb on_chunk_header; + http_cb on_chunk_complete; +}; + + +enum http_parser_url_fields + { UF_SCHEMA = 0 + , UF_HOST = 1 + , UF_PORT = 2 + , UF_PATH = 3 + , UF_QUERY = 4 + , UF_FRAGMENT = 5 + , UF_USERINFO = 6 + , UF_MAX = 7 + }; + + +/* Result structure for http_parser_parse_url(). + * + * Callers should index into field_data[] with UF_* values iff field_set + * has the relevant (1 << UF_*) bit set. As a courtesy to clients (and + * because we probably have padding left over), we convert any port to + * a uint16_t. + */ +struct http_parser_url { + uint16_t field_set; /* Bitmask of (1 << UF_*) values */ + uint16_t port; /* Converted UF_PORT string */ + + struct { + uint16_t off; /* Offset into buffer in which field starts */ + uint16_t len; /* Length of run in buffer */ + } field_data[UF_MAX]; +}; + + +/* Returns the library version. Bits 16-23 contain the major version number, + * bits 8-15 the minor version number and bits 0-7 the patch level. + * Usage example: + * + * unsigned long version = http_parser_version(); + * unsigned major = (version >> 16) & 255; + * unsigned minor = (version >> 8) & 255; + * unsigned patch = version & 255; + * printf("http_parser v%u.%u.%u\n", major, minor, patch); + */ +unsigned long http_parser_version(void); + +void http_parser_init(http_parser *parser, enum http_parser_type type); + + +/* Initialize http_parser_settings members to 0 + */ +void http_parser_settings_init(http_parser_settings *settings); + + +/* Executes the parser. Returns number of parsed bytes. Sets + * `parser->http_errno` on error. */ +size_t http_parser_execute(http_parser *parser, + const http_parser_settings *settings, + const char *data, + size_t len); + + +/* If http_should_keep_alive() in the on_headers_complete or + * on_message_complete callback returns 0, then this should be + * the last message on the connection. + * If you are the server, respond with the "Connection: close" header. + * If you are the client, close the connection. + */ +int http_should_keep_alive(const http_parser *parser); + +/* Returns a string version of the HTTP method. */ +const char *http_method_str(enum http_method m); + +/* Returns a string version of the HTTP status code. */ +const char *http_status_str(enum http_status s); + +/* Return a string name of the given error */ +const char *http_errno_name(enum http_errno err); + +/* Return a string description of the given error */ +const char *http_errno_description(enum http_errno err); + +/* Initialize all http_parser_url members to 0 */ +void http_parser_url_init(struct http_parser_url *u); + +/* Parse a URL; return nonzero on failure */ +int http_parser_parse_url(const char *buf, size_t buflen, + int is_connect, + struct http_parser_url *u); + +/* Pause or un-pause the parser; a nonzero value pauses */ +void http_parser_pause(http_parser *parser, int paused); + +/* Checks if this is the final chunk of the body. */ +int http_body_is_final(const http_parser *parser); + +/* Change the maximum header size provided at compile time. */ +void http_parser_set_max_header_size(uint32_t size); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/test.c b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/test.c new file mode 100644 index 000000000000..3f7c77b34944 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http-parser/test.c @@ -0,0 +1,4729 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#include "http_parser.h" +#include +#include +#include +#include /* rand */ +#include +#include + +#if defined(__APPLE__) +# undef strlncpy +#endif /* defined(__APPLE__) */ + +#undef TRUE +#define TRUE 1 +#undef FALSE +#define FALSE 0 + +#define MAX_HEADERS 13 +#define MAX_ELEMENT_SIZE 2048 +#define MAX_CHUNKS 16 + +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*x)) + +static http_parser parser; + +struct message { + const char *name; // for debugging purposes + const char *raw; + enum http_parser_type type; + enum http_method method; + int status_code; + char response_status[MAX_ELEMENT_SIZE]; + char request_path[MAX_ELEMENT_SIZE]; + char request_url[MAX_ELEMENT_SIZE]; + char fragment[MAX_ELEMENT_SIZE]; + char query_string[MAX_ELEMENT_SIZE]; + char body[MAX_ELEMENT_SIZE]; + size_t body_size; + const char *host; + const char *userinfo; + uint16_t port; + int num_headers; + enum { NONE=0, FIELD, VALUE } last_header_element; + char headers [MAX_HEADERS][2][MAX_ELEMENT_SIZE]; + int should_keep_alive; + + int num_chunks; + int num_chunks_complete; + int chunk_lengths[MAX_CHUNKS]; + + const char *upgrade; // upgraded body + + unsigned short http_major; + unsigned short http_minor; + uint64_t content_length; + + int message_begin_cb_called; + int headers_complete_cb_called; + int message_complete_cb_called; + int status_cb_called; + int message_complete_on_eof; + int body_is_final; + int allow_chunked_length; +}; + +static int currently_parsing_eof; + +static struct message messages[5]; +static int num_messages; +static http_parser_settings *current_pause_parser; + +/* * R E Q U E S T S * */ +const struct message requests[] = +#define CURL_GET 0 +{ {.name= "curl get" + ,.type= HTTP_REQUEST + ,.raw= "GET /test HTTP/1.1\r\n" + "User-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1\r\n" + "Host: 0.0.0.0=5000\r\n" + "Accept: */*\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.content_length= -1 + ,.num_headers= 3 + ,.headers= + { { "User-Agent", "curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1" } + , { "Host", "0.0.0.0=5000" } + , { "Accept", "*/*" } + } + ,.body= "" + } + +#define FIREFOX_GET 1 +, {.name= "firefox get" + ,.type= HTTP_REQUEST + ,.raw= "GET /favicon.ico HTTP/1.1\r\n" + "Host: 0.0.0.0=5000\r\n" + "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0\r\n" + "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" + "Accept-Language: en-us,en;q=0.5\r\n" + "Accept-Encoding: gzip,deflate\r\n" + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" + "Keep-Alive: 300\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/favicon.ico" + ,.request_url= "/favicon.ico" + ,.content_length= -1 + ,.num_headers= 8 + ,.headers= + { { "Host", "0.0.0.0=5000" } + , { "User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008061015 Firefox/3.0" } + , { "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" } + , { "Accept-Language", "en-us,en;q=0.5" } + , { "Accept-Encoding", "gzip,deflate" } + , { "Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7" } + , { "Keep-Alive", "300" } + , { "Connection", "keep-alive" } + } + ,.body= "" + } + +#define DUMBLUCK 2 +, {.name= "dumbluck" + ,.type= HTTP_REQUEST + ,.raw= "GET /dumbluck HTTP/1.1\r\n" + "aaaaaaaaaaaaa:++++++++++\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/dumbluck" + ,.request_url= "/dumbluck" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= + { { "aaaaaaaaaaaaa", "++++++++++" } + } + ,.body= "" + } + +#define FRAGMENT_IN_URI 3 +, {.name= "fragment in url" + ,.type= HTTP_REQUEST + ,.raw= "GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "page=1" + ,.fragment= "posts-17408" + ,.request_path= "/forums/1/topics/2375" + /* XXX request url does include fragment? */ + ,.request_url= "/forums/1/topics/2375?page=1#posts-17408" + ,.content_length= -1 + ,.num_headers= 0 + ,.body= "" + } + +#define GET_NO_HEADERS_NO_BODY 4 +, {.name= "get no headers no body" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_no_headers_no_body/world HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE /* would need Connection: close */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_no_headers_no_body/world" + ,.request_url= "/get_no_headers_no_body/world" + ,.content_length= -1 + ,.num_headers= 0 + ,.body= "" + } + +#define GET_ONE_HEADER_NO_BODY 5 +, {.name= "get one header no body" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_one_header_no_body HTTP/1.1\r\n" + "Accept: */*\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE /* would need Connection: close */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_one_header_no_body" + ,.request_url= "/get_one_header_no_body" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= + { { "Accept" , "*/*" } + } + ,.body= "" + } + +#define GET_FUNKY_CONTENT_LENGTH 6 +, {.name= "get funky content length body hello" + ,.type= HTTP_REQUEST + ,.raw= "GET /get_funky_content_length_body_hello HTTP/1.0\r\n" + "conTENT-Length: 5\r\n" + "\r\n" + "HELLO" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/get_funky_content_length_body_hello" + ,.request_url= "/get_funky_content_length_body_hello" + ,.content_length= 5 + ,.num_headers= 1 + ,.headers= + { { "conTENT-Length" , "5" } + } + ,.body= "HELLO" + } + +#define POST_IDENTITY_BODY_WORLD 7 +, {.name= "post identity body world" + ,.type= HTTP_REQUEST + ,.raw= "POST /post_identity_body_world?q=search#hey HTTP/1.1\r\n" + "Accept: */*\r\n" + "Content-Length: 5\r\n" + "\r\n" + "World" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "q=search" + ,.fragment= "hey" + ,.request_path= "/post_identity_body_world" + ,.request_url= "/post_identity_body_world?q=search#hey" + ,.content_length= 5 + ,.num_headers= 2 + ,.headers= + { { "Accept", "*/*" } + , { "Content-Length", "5" } + } + ,.body= "World" + } + +#define POST_CHUNKED_ALL_YOUR_BASE 8 +, {.name= "post - chunked body: all your base are belong to us" + ,.type= HTTP_REQUEST + ,.raw= "POST /post_chunked_all_your_base HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "1e\r\nall your base are belong to us\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/post_chunked_all_your_base" + ,.request_url= "/post_chunked_all_your_base" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding" , "chunked" } + } + ,.body= "all your base are belong to us" + ,.num_chunks_complete= 2 + ,.chunk_lengths= { 0x1e } + } + +#define TWO_CHUNKS_MULT_ZERO_END 9 +, {.name= "two chunks ; triple zero ending" + ,.type= HTTP_REQUEST + ,.raw= "POST /two_chunks_mult_zero_end HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5\r\nhello\r\n" + "6\r\n world\r\n" + "000\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/two_chunks_mult_zero_end" + ,.request_url= "/two_chunks_mult_zero_end" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body= "hello world" + ,.num_chunks_complete= 3 + ,.chunk_lengths= { 5, 6 } + } + +#define CHUNKED_W_TRAILING_HEADERS 10 +, {.name= "chunked with trailing headers. blech." + ,.type= HTTP_REQUEST + ,.raw= "POST /chunked_w_trailing_headers HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5\r\nhello\r\n" + "6\r\n world\r\n" + "0\r\n" + "Vary: *\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/chunked_w_trailing_headers" + ,.request_url= "/chunked_w_trailing_headers" + ,.content_length= -1 + ,.num_headers= 3 + ,.headers= + { { "Transfer-Encoding", "chunked" } + , { "Vary", "*" } + , { "Content-Type", "text/plain" } + } + ,.body= "hello world" + ,.num_chunks_complete= 3 + ,.chunk_lengths= { 5, 6 } + } + +#define CHUNKED_W_NONSENSE_AFTER_LENGTH 11 +, {.name= "with nonsense after the length" + ,.type= HTTP_REQUEST + ,.raw= "POST /chunked_w_nonsense_after_length HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5; ilovew3;whattheluck=aretheseparametersfor\r\nhello\r\n" + "6; blahblah; blah\r\n world\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/chunked_w_nonsense_after_length" + ,.request_url= "/chunked_w_nonsense_after_length" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body= "hello world" + ,.num_chunks_complete= 3 + ,.chunk_lengths= { 5, 6 } + } + +#define WITH_QUOTES 12 +, {.name= "with quotes" + ,.type= HTTP_REQUEST + ,.raw= "GET /with_\"stupid\"_quotes?foo=\"bar\" HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "foo=\"bar\"" + ,.fragment= "" + ,.request_path= "/with_\"stupid\"_quotes" + ,.request_url= "/with_\"stupid\"_quotes?foo=\"bar\"" + ,.content_length= -1 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define APACHEBENCH_GET 13 +/* The server receiving this request SHOULD NOT wait for EOF + * to know that content-length == 0. + * How to represent this in a unit test? message_complete_on_eof + * Compare with NO_CONTENT_LENGTH_RESPONSE. + */ +, {.name = "apachebench get" + ,.type= HTTP_REQUEST + ,.raw= "GET /test HTTP/1.0\r\n" + "Host: 0.0.0.0:5000\r\n" + "User-Agent: ApacheBench/2.3\r\n" + "Accept: */*\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.content_length= -1 + ,.num_headers= 3 + ,.headers= { { "Host", "0.0.0.0:5000" } + , { "User-Agent", "ApacheBench/2.3" } + , { "Accept", "*/*" } + } + ,.body= "" + } + +#define QUERY_URL_WITH_QUESTION_MARK_GET 14 +/* Some clients include '?' characters in query strings. + */ +, {.name = "query url with question mark" + ,.type= HTTP_REQUEST + ,.raw= "GET /test.cgi?foo=bar?baz HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "foo=bar?baz" + ,.fragment= "" + ,.request_path= "/test.cgi" + ,.request_url= "/test.cgi?foo=bar?baz" + ,.content_length= -1 + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define PREFIX_NEWLINE_GET 15 +/* Some clients, especially after a POST in a keep-alive connection, + * will send an extra CRLF before the next request + */ +, {.name = "newline prefix get" + ,.type= HTTP_REQUEST + ,.raw= "\r\nGET /test HTTP/1.1\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.content_length= -1 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define UPGRADE_REQUEST 16 +, {.name = "upgrade request" + ,.type= HTTP_REQUEST + ,.raw= "GET /demo HTTP/1.1\r\n" + "Host: example.com\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" + "Sec-WebSocket-Protocol: sample\r\n" + "Upgrade: WebSocket\r\n" + "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" + "Origin: http://example.com\r\n" + "\r\n" + "Hot diggity dogg" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/demo" + ,.request_url= "/demo" + ,.content_length= -1 + ,.num_headers= 7 + ,.upgrade="Hot diggity dogg" + ,.headers= { { "Host", "example.com" } + , { "Connection", "Upgrade" } + , { "Sec-WebSocket-Key2", "12998 5 Y3 1 .P00" } + , { "Sec-WebSocket-Protocol", "sample" } + , { "Upgrade", "WebSocket" } + , { "Sec-WebSocket-Key1", "4 @1 46546xW%0l 1 5" } + , { "Origin", "http://example.com" } + } + ,.body= "" + } + +#define CONNECT_REQUEST 17 +, {.name = "connect request" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT 0-home0.netscape.com:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + "some data\r\n" + "and yet even more data" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "0-home0.netscape.com:443" + ,.content_length= -1 + ,.num_headers= 2 + ,.upgrade="some data\r\nand yet even more data" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } + +#define REPORT_REQ 18 +, {.name= "report request" + ,.type= HTTP_REQUEST + ,.raw= "REPORT /test HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_REPORT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/test" + ,.request_url= "/test" + ,.content_length= -1 + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define NO_HTTP_VERSION 19 +, {.name= "request with no http version" + ,.type= HTTP_REQUEST + ,.raw= "GET /\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 0 + ,.http_minor= 9 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.content_length= -1 + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define MSEARCH_REQ 20 +, {.name= "m-search request" + ,.type= HTTP_REQUEST + ,.raw= "M-SEARCH * HTTP/1.1\r\n" + "HOST: 239.255.255.250:1900\r\n" + "MAN: \"ssdp:discover\"\r\n" + "ST: \"ssdp:all\"\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_MSEARCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "*" + ,.request_url= "*" + ,.content_length= -1 + ,.num_headers= 3 + ,.headers= { { "HOST", "239.255.255.250:1900" } + , { "MAN", "\"ssdp:discover\"" } + , { "ST", "\"ssdp:all\"" } + } + ,.body= "" + } + +#define LINE_FOLDING_IN_HEADER 21 +, {.name= "line folding in header value" + ,.type= HTTP_REQUEST + ,.raw= "GET / HTTP/1.1\r\n" + "Line1: abc\r\n" + "\tdef\r\n" + " ghi\r\n" + "\t\tjkl\r\n" + " mno \r\n" + "\t \tqrs\r\n" + "Line2: \t line2\t\r\n" + "Line3:\r\n" + " line3\r\n" + "Line4: \r\n" + " \r\n" + "Connection:\r\n" + " close\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.content_length= -1 + ,.num_headers= 5 + ,.headers= { { "Line1", "abc\tdef ghi\t\tjkl mno \t \tqrs" } + , { "Line2", "line2\t" } + , { "Line3", "line3" } + , { "Line4", "" } + , { "Connection", "close" }, + } + ,.body= "" + } + + +#define QUERY_TERMINATED_HOST 22 +, {.name= "host terminated by a query string" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org?hail=all HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "hail=all" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org?hail=all" + ,.host= "hypnotoad.org" + ,.content_length= -1 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define QUERY_TERMINATED_HOSTPORT 23 +, {.name= "host:port terminated by a query string" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org:1234?hail=all HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "hail=all" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org:1234?hail=all" + ,.host= "hypnotoad.org" + ,.port= 1234 + ,.content_length= -1 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define SPACE_TERMINATED_HOSTPORT 24 +, {.name= "host:port terminated by a space" + ,.type= HTTP_REQUEST + ,.raw= "GET http://hypnotoad.org:1234 HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "http://hypnotoad.org:1234" + ,.host= "hypnotoad.org" + ,.port= 1234 + ,.content_length= -1 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define PATCH_REQ 25 +, {.name = "PATCH request" + ,.type= HTTP_REQUEST + ,.raw= "PATCH /file.txt HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/example\r\n" + "If-Match: \"e0023aa4e\"\r\n" + "Content-Length: 10\r\n" + "\r\n" + "cccccccccc" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_PATCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/file.txt" + ,.request_url= "/file.txt" + ,.content_length= 10 + ,.num_headers= 4 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/example" } + , { "If-Match", "\"e0023aa4e\"" } + , { "Content-Length", "10" } + } + ,.body= "cccccccccc" + } + +#define CONNECT_CAPS_REQUEST 26 +, {.name = "connect caps request" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT HOME0.NETSCAPE.COM:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "HOME0.NETSCAPE.COM:443" + ,.content_length= -1 + ,.num_headers= 2 + ,.upgrade="" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } + +#if !HTTP_PARSER_STRICT +#define UTF8_PATH_REQ 27 +, {.name= "utf-8 path request" + ,.type= HTTP_REQUEST + ,.raw= "GET /δ¶/δt/pope?q=1#narf HTTP/1.1\r\n" + "Host: github.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "q=1" + ,.fragment= "narf" + ,.request_path= "/δ¶/δt/pope" + ,.request_url= "/δ¶/δt/pope?q=1#narf" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= { {"Host", "github.com" } + } + ,.body= "" + } + +#define HOSTNAME_UNDERSCORE 28 +, {.name = "hostname underscore" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT home_0.netscape.com:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.query_string= "" + ,.fragment= "" + ,.request_path= "" + ,.request_url= "home_0.netscape.com:443" + ,.content_length= -1 + ,.num_headers= 2 + ,.upgrade="" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + } + ,.body= "" + } +#endif /* !HTTP_PARSER_STRICT */ + +/* see https://github.com/ry/http-parser/issues/47 */ +#define EAT_TRAILING_CRLF_NO_CONNECTION_CLOSE 29 +, {.name = "eat CRLF between requests, no \"Connection: close\" header" + ,.raw= "POST / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 4\r\n" + "\r\n" + "q=42\r\n" /* note the trailing CRLF */ + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.content_length= 4 + ,.num_headers= 3 + ,.upgrade= 0 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/x-www-form-urlencoded" } + , { "Content-Length", "4" } + } + ,.body= "q=42" + } + +/* see https://github.com/ry/http-parser/issues/47 */ +#define EAT_TRAILING_CRLF_WITH_CONNECTION_CLOSE 30 +, {.name = "eat CRLF between requests even if \"Connection: close\" is set" + ,.raw= "POST / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 4\r\n" + "Connection: close\r\n" + "\r\n" + "q=42\r\n" /* note the trailing CRLF */ + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE /* input buffer isn't empty when on_message_complete is called */ + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.content_length= 4 + ,.num_headers= 4 + ,.upgrade= 0 + ,.headers= { { "Host", "www.example.com" } + , { "Content-Type", "application/x-www-form-urlencoded" } + , { "Content-Length", "4" } + , { "Connection", "close" } + } + ,.body= "q=42" + } + +#define PURGE_REQ 31 +, {.name = "PURGE request" + ,.type= HTTP_REQUEST + ,.raw= "PURGE /file.txt HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_PURGE + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/file.txt" + ,.request_url= "/file.txt" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= { { "Host", "www.example.com" } } + ,.body= "" + } + +#define SEARCH_REQ 32 +, {.name = "SEARCH request" + ,.type= HTTP_REQUEST + ,.raw= "SEARCH / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_SEARCH + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= { { "Host", "www.example.com" } } + ,.body= "" + } + +#define PROXY_WITH_BASIC_AUTH 33 +, {.name= "host:port and basic_auth" + ,.type= HTTP_REQUEST + ,.raw= "GET http://a%12:b!&*$@hypnotoad.org:1234/toto HTTP/1.1\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.fragment= "" + ,.request_path= "/toto" + ,.request_url= "http://a%12:b!&*$@hypnotoad.org:1234/toto" + ,.host= "hypnotoad.org" + ,.userinfo= "a%12:b!&*$" + ,.port= 1234 + ,.content_length= -1 + ,.num_headers= 0 + ,.headers= { } + ,.body= "" + } + +#define LINE_FOLDING_IN_HEADER_WITH_LF 34 +, {.name= "line folding in header value" + ,.type= HTTP_REQUEST + ,.raw= "GET / HTTP/1.1\n" + "Line1: abc\n" + "\tdef\n" + " ghi\n" + "\t\tjkl\n" + " mno \n" + "\t \tqrs\n" + "Line2: \t line2\t\n" + "Line3:\n" + " line3\n" + "Line4: \n" + " \n" + "Connection:\n" + " close\n" + "\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.content_length= -1 + ,.num_headers= 5 + ,.headers= { { "Line1", "abc\tdef ghi\t\tjkl mno \t \tqrs" } + , { "Line2", "line2\t" } + , { "Line3", "line3" } + , { "Line4", "" } + , { "Connection", "close" }, + } + ,.body= "" + } + +#define CONNECTION_MULTI 35 +, {.name = "multiple connection header values with folding" + ,.type= HTTP_REQUEST + ,.raw= "GET /demo HTTP/1.1\r\n" + "Host: example.com\r\n" + "Connection: Something,\r\n" + " Upgrade, ,Keep-Alive\r\n" + "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n" + "Sec-WebSocket-Protocol: sample\r\n" + "Upgrade: WebSocket\r\n" + "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n" + "Origin: http://example.com\r\n" + "\r\n" + "Hot diggity dogg" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/demo" + ,.request_url= "/demo" + ,.content_length= -1 + ,.num_headers= 7 + ,.upgrade="Hot diggity dogg" + ,.headers= { { "Host", "example.com" } + , { "Connection", "Something, Upgrade, ,Keep-Alive" } + , { "Sec-WebSocket-Key2", "12998 5 Y3 1 .P00" } + , { "Sec-WebSocket-Protocol", "sample" } + , { "Upgrade", "WebSocket" } + , { "Sec-WebSocket-Key1", "4 @1 46546xW%0l 1 5" } + , { "Origin", "http://example.com" } + } + ,.body= "" + } + +#define CONNECTION_MULTI_LWS 36 +, {.name = "multiple connection header values with folding and lws" + ,.type= HTTP_REQUEST + ,.raw= "GET /demo HTTP/1.1\r\n" + "Connection: keep-alive, upgrade\r\n" + "Upgrade: WebSocket\r\n" + "\r\n" + "Hot diggity dogg" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/demo" + ,.request_url= "/demo" + ,.content_length= -1 + ,.num_headers= 2 + ,.upgrade="Hot diggity dogg" + ,.headers= { { "Connection", "keep-alive, upgrade" } + , { "Upgrade", "WebSocket" } + } + ,.body= "" + } + +#define CONNECTION_MULTI_LWS_CRLF 37 +, {.name = "multiple connection header values with folding and lws" + ,.type= HTTP_REQUEST + ,.raw= "GET /demo HTTP/1.1\r\n" + "Connection: keep-alive, \r\n upgrade\r\n" + "Upgrade: WebSocket\r\n" + "\r\n" + "Hot diggity dogg" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_GET + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/demo" + ,.request_url= "/demo" + ,.content_length= -1 + ,.num_headers= 2 + ,.upgrade="Hot diggity dogg" + ,.headers= { { "Connection", "keep-alive, upgrade" } + , { "Upgrade", "WebSocket" } + } + ,.body= "" + } + +#define UPGRADE_POST_REQUEST 38 +, {.name = "upgrade post request" + ,.type= HTTP_REQUEST + ,.raw= "POST /demo HTTP/1.1\r\n" + "Host: example.com\r\n" + "Connection: Upgrade\r\n" + "Upgrade: HTTP/2.0\r\n" + "Content-Length: 15\r\n" + "\r\n" + "sweet post body" + "Hot diggity dogg" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.request_path= "/demo" + ,.request_url= "/demo" + ,.content_length= 15 + ,.num_headers= 4 + ,.upgrade="Hot diggity dogg" + ,.headers= { { "Host", "example.com" } + , { "Connection", "Upgrade" } + , { "Upgrade", "HTTP/2.0" } + , { "Content-Length", "15" } + } + ,.body= "sweet post body" + } + +#define CONNECT_WITH_BODY_REQUEST 39 +, {.name = "connect with body request" + ,.type= HTTP_REQUEST + ,.raw= "CONNECT foo.bar.com:443 HTTP/1.0\r\n" + "User-agent: Mozilla/1.1N\r\n" + "Proxy-authorization: basic aGVsbG86d29ybGQ=\r\n" + "Content-Length: 10\r\n" + "\r\n" + "blarfcicle" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_CONNECT + ,.request_url= "foo.bar.com:443" + ,.content_length= 10 + ,.num_headers= 3 + ,.upgrade="blarfcicle" + ,.headers= { { "User-agent", "Mozilla/1.1N" } + , { "Proxy-authorization", "basic aGVsbG86d29ybGQ=" } + , { "Content-Length", "10" } + } + ,.body= "" + } + +/* Examples from the Internet draft for LINK/UNLINK methods: + * https://tools.ietf.org/id/draft-snell-link-method-01.html#rfc.section.5 + */ + +#define LINK_REQUEST 40 +, {.name = "link request" + ,.type= HTTP_REQUEST + ,.raw= "LINK /images/my_dog.jpg HTTP/1.1\r\n" + "Host: example.com\r\n" + "Link: ; rel=\"tag\"\r\n" + "Link: ; rel=\"tag\"\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_LINK + ,.request_path= "/images/my_dog.jpg" + ,.request_url= "/images/my_dog.jpg" + ,.query_string= "" + ,.fragment= "" + ,.content_length= -1 + ,.num_headers= 3 + ,.headers= { { "Host", "example.com" } + , { "Link", "; rel=\"tag\"" } + , { "Link", "; rel=\"tag\"" } + } + ,.body= "" + } + +#define UNLINK_REQUEST 41 +, {.name = "unlink request" + ,.type= HTTP_REQUEST + ,.raw= "UNLINK /images/my_dog.jpg HTTP/1.1\r\n" + "Host: example.com\r\n" + "Link: ; rel=\"tag\"\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_UNLINK + ,.request_path= "/images/my_dog.jpg" + ,.request_url= "/images/my_dog.jpg" + ,.query_string= "" + ,.fragment= "" + ,.content_length= -1 + ,.num_headers= 2 + ,.headers= { { "Host", "example.com" } + , { "Link", "; rel=\"tag\"" } + } + ,.body= "" + } + +#define SOURCE_REQUEST 42 +, {.name = "source request" + ,.type= HTTP_REQUEST + ,.raw= "SOURCE /music/sweet/music HTTP/1.1\r\n" + "Host: example.com\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_SOURCE + ,.request_path= "/music/sweet/music" + ,.request_url= "/music/sweet/music" + ,.query_string= "" + ,.fragment= "" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= { { "Host", "example.com" } } + ,.body= "" + } + +#define SOURCE_ICE_REQUEST 43 +, {.name = "source request" + ,.type= HTTP_REQUEST + ,.raw= "SOURCE /music/sweet/music ICE/1.0\r\n" + "Host: example.com\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.method= HTTP_SOURCE + ,.request_path= "/music/sweet/music" + ,.request_url= "/music/sweet/music" + ,.query_string= "" + ,.fragment= "" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= { { "Host", "example.com" } } + ,.body= "" + } + +#define POST_MULTI_TE_LAST_CHUNKED 44 +, {.name= "post - multi coding transfer-encoding chunked body" + ,.type= HTTP_REQUEST + ,.raw= "POST / HTTP/1.1\r\n" + "Transfer-Encoding: deflate, chunked\r\n" + "\r\n" + "1e\r\nall your base are belong to us\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding" , "deflate, chunked" } + } + ,.body= "all your base are belong to us" + ,.num_chunks_complete= 2 + ,.chunk_lengths= { 0x1e } + } + +#define POST_MULTI_LINE_TE_LAST_CHUNKED 45 +, {.name= "post - multi line coding transfer-encoding chunked body" + ,.type= HTTP_REQUEST + ,.raw= "POST / HTTP/1.1\r\n" + "Transfer-Encoding: deflate,\r\n" + " chunked\r\n" + "\r\n" + "1e\r\nall your base are belong to us\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/" + ,.request_url= "/" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding" , "deflate, chunked" } + } + ,.body= "all your base are belong to us" + ,.num_chunks_complete= 2 + ,.chunk_lengths= { 0x1e } + } + +#define CHUNKED_CONTENT_LENGTH 46 +, {.name= "chunked with content-length set, allow_chunked_length flag is set" + ,.type= HTTP_REQUEST + ,.raw= "POST /chunked_w_content_length HTTP/1.1\r\n" + "Content-Length: 10\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "5; ilovew3;whattheluck=aretheseparametersfor\r\nhello\r\n" + "6; blahblah; blah\r\n world\r\n" + "0\r\n" + "\r\n" + ,.allow_chunked_length = 1 + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.method= HTTP_POST + ,.query_string= "" + ,.fragment= "" + ,.request_path= "/chunked_w_content_length" + ,.request_url= "/chunked_w_content_length" + ,.content_length= 10 + ,.num_headers= 2 + ,.headers={ { "Content-Length", "10"} + , { "Transfer-Encoding", "chunked" } + } + ,.body= "hello world" + ,.num_chunks_complete= 3 + ,.chunk_lengths= { 5, 6 } + } +}; + +/* * R E S P O N S E S * */ +const struct message responses[] = +#define GOOGLE_301 0 +{ {.name= "google 301" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 301 Moved Permanently\r\n" + "Location: http://www.google.com/\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Date: Sun, 26 Apr 2009 11:11:49 GMT\r\n" + "Expires: Tue, 26 May 2009 11:11:49 GMT\r\n" + "X-$PrototypeBI-Version: 1.6.0.3\r\n" /* $ char in header field */ + "Cache-Control: public, max-age=2592000\r\n" + "Server: gws\r\n" + "Content-Length: 219 \r\n" + "\r\n" + "\n" + "301 Moved\n" + "

301 Moved

\n" + "The document has moved\n" + "here.\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 301 + ,.response_status= "Moved Permanently" + ,.content_length= 219 + ,.num_headers= 8 + ,.headers= + { { "Location", "http://www.google.com/" } + , { "Content-Type", "text/html; charset=UTF-8" } + , { "Date", "Sun, 26 Apr 2009 11:11:49 GMT" } + , { "Expires", "Tue, 26 May 2009 11:11:49 GMT" } + , { "X-$PrototypeBI-Version", "1.6.0.3" } + , { "Cache-Control", "public, max-age=2592000" } + , { "Server", "gws" } + , { "Content-Length", "219 " } + } + ,.body= "\n" + "301 Moved\n" + "

301 Moved

\n" + "The document has moved\n" + "here.\r\n" + "\r\n" + } + +#define NO_CONTENT_LENGTH_RESPONSE 1 +/* The client should wait for the server's EOF. That is, when content-length + * is not specified, and "Connection: close", the end of body is specified + * by the EOF. + * Compare with APACHEBENCH_GET + */ +, {.name= "no content-length response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Date: Tue, 04 Aug 2009 07:59:32 GMT\r\n" + "Server: Apache\r\n" + "X-Powered-By: Servlet/2.5 JSP/2.1\r\n" + "Content-Type: text/xml; charset=utf-8\r\n" + "Connection: close\r\n" + "\r\n" + "\n" + "\n" + " \n" + " \n" + " SOAP-ENV:Client\n" + " Client Error\n" + " \n" + " \n" + "" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= -1 + ,.num_headers= 5 + ,.headers= + { { "Date", "Tue, 04 Aug 2009 07:59:32 GMT" } + , { "Server", "Apache" } + , { "X-Powered-By", "Servlet/2.5 JSP/2.1" } + , { "Content-Type", "text/xml; charset=utf-8" } + , { "Connection", "close" } + } + ,.body= "\n" + "\n" + " \n" + " \n" + " SOAP-ENV:Client\n" + " Client Error\n" + " \n" + " \n" + "" + } + +#define NO_HEADERS_NO_BODY_404 2 +, {.name= "404 no headers no body" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 404 Not Found\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 404 + ,.response_status= "Not Found" + ,.content_length= -1 + ,.num_headers= 0 + ,.headers= {} + ,.body_size= 0 + ,.body= "" + } + +#define NO_REASON_PHRASE 3 +, {.name= "301 no response phrase" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 301\r\n\r\n" + ,.should_keep_alive = FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 301 + ,.content_length= -1 + ,.response_status= "" + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define TRAILING_SPACE_ON_CHUNKED_BODY 4 +, {.name="200 trailing space on chunked body" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "25 \r\n" + "This is the data in the first chunk\r\n" + "\r\n" + "1C\r\n" + "and this is the second one\r\n" + "\r\n" + "0 \r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= -1 + ,.num_headers= 2 + ,.headers= + { {"Content-Type", "text/plain" } + , {"Transfer-Encoding", "chunked" } + } + ,.body_size = 37+28 + ,.body = + "This is the data in the first chunk\r\n" + "and this is the second one\r\n" + ,.num_chunks_complete= 3 + ,.chunk_lengths= { 0x25, 0x1c } + } + +#define NO_CARRIAGE_RET 5 +, {.name="no carriage ret" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\n" + "Content-Type: text/html; charset=utf-8\n" + "Connection: close\n" + "\n" + "these headers are from http://news.ycombinator.com/" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= -1 + ,.num_headers= 2 + ,.headers= + { {"Content-Type", "text/html; charset=utf-8" } + , {"Connection", "close" } + } + ,.body= "these headers are from http://news.ycombinator.com/" + } + +#define PROXY_CONNECTION 6 +, {.name="proxy connection" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Content-Length: 11\r\n" + "Proxy-Connection: close\r\n" + "Date: Thu, 31 Dec 2009 20:55:48 +0000\r\n" + "\r\n" + "hello world" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= 11 + ,.num_headers= 4 + ,.headers= + { {"Content-Type", "text/html; charset=UTF-8" } + , {"Content-Length", "11" } + , {"Proxy-Connection", "close" } + , {"Date", "Thu, 31 Dec 2009 20:55:48 +0000"} + } + ,.body= "hello world" + } + +#define UNDERSTORE_HEADER_KEY 7 + // shown by + // curl -o /dev/null -v "http://ad.doubleclick.net/pfadx/DARTSHELLCONFIGXML;dcmt=text/xml;" +, {.name="underscore header key" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Server: DCLK-AdSvr\r\n" + "Content-Type: text/xml\r\n" + "Content-Length: 0\r\n" + "DCLK_imp: v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o\r\n\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= 0 + ,.num_headers= 4 + ,.headers= + { {"Server", "DCLK-AdSvr" } + , {"Content-Type", "text/xml" } + , {"Content-Length", "0" } + , {"DCLK_imp", "v7;x;114750856;0-0;0;17820020;0/0;21603567/21621457/1;;~okv=;dcmt=text/xml;;~cs=o" } + } + ,.body= "" + } + +#define BONJOUR_MADAME_FR 8 +/* The client should not merge two headers fields when the first one doesn't + * have a value. + */ +, {.name= "bonjourmadame.fr" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 301 Moved Permanently\r\n" + "Date: Thu, 03 Jun 2010 09:56:32 GMT\r\n" + "Server: Apache/2.2.3 (Red Hat)\r\n" + "Cache-Control: public\r\n" + "Pragma: \r\n" + "Location: http://www.bonjourmadame.fr/\r\n" + "Vary: Accept-Encoding\r\n" + "Content-Length: 0\r\n" + "Content-Type: text/html; charset=UTF-8\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 301 + ,.response_status= "Moved Permanently" + ,.content_length= 0 + ,.num_headers= 9 + ,.headers= + { { "Date", "Thu, 03 Jun 2010 09:56:32 GMT" } + , { "Server", "Apache/2.2.3 (Red Hat)" } + , { "Cache-Control", "public" } + , { "Pragma", "" } + , { "Location", "http://www.bonjourmadame.fr/" } + , { "Vary", "Accept-Encoding" } + , { "Content-Length", "0" } + , { "Content-Type", "text/html; charset=UTF-8" } + , { "Connection", "keep-alive" } + } + ,.body= "" + } + +#define RES_FIELD_UNDERSCORE 9 +/* Should handle spaces in header fields */ +, {.name= "field underscore" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Date: Tue, 28 Sep 2010 01:14:13 GMT\r\n" + "Server: Apache\r\n" + "Cache-Control: no-cache, must-revalidate\r\n" + "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n" + ".et-Cookie: PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com\r\n" + "Vary: Accept-Encoding\r\n" + "_eep-Alive: timeout=45\r\n" /* semantic value ignored */ + "_onnection: Keep-Alive\r\n" /* semantic value ignored */ + "Transfer-Encoding: chunked\r\n" + "Content-Type: text/html\r\n" + "Connection: close\r\n" + "\r\n" + "0\r\n\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= -1 + ,.num_headers= 11 + ,.headers= + { { "Date", "Tue, 28 Sep 2010 01:14:13 GMT" } + , { "Server", "Apache" } + , { "Cache-Control", "no-cache, must-revalidate" } + , { "Expires", "Mon, 26 Jul 1997 05:00:00 GMT" } + , { ".et-Cookie", "PlaxoCS=1274804622353690521; path=/; domain=.plaxo.com" } + , { "Vary", "Accept-Encoding" } + , { "_eep-Alive", "timeout=45" } + , { "_onnection", "Keep-Alive" } + , { "Transfer-Encoding", "chunked" } + , { "Content-Type", "text/html" } + , { "Connection", "close" } + } + ,.body= "" + ,.num_chunks_complete= 1 + ,.chunk_lengths= {} + } + +#define NON_ASCII_IN_STATUS_LINE 10 +/* Should handle non-ASCII in status line */ +, {.name= "non-ASCII in status line" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 500 Oriëntatieprobleem\r\n" + "Date: Fri, 5 Nov 2010 23:07:12 GMT+2\r\n" + "Content-Length: 0\r\n" + "Connection: close\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 500 + ,.response_status= "Oriëntatieprobleem" + ,.content_length= 0 + ,.num_headers= 3 + ,.headers= + { { "Date", "Fri, 5 Nov 2010 23:07:12 GMT+2" } + , { "Content-Length", "0" } + , { "Connection", "close" } + } + ,.body= "" + } + +#define HTTP_VERSION_0_9 11 +/* Should handle HTTP/0.9 */ +, {.name= "http version 0.9" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/0.9 200 OK\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 0 + ,.http_minor= 9 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= -1 + ,.num_headers= 0 + ,.headers= + {} + ,.body= "" + } + +#define NO_CONTENT_LENGTH_NO_TRANSFER_ENCODING_RESPONSE 12 +/* The client should wait for the server's EOF. That is, when neither + * content-length nor transfer-encoding is specified, the end of body + * is specified by the EOF. + */ +, {.name= "neither content-length nor transfer-encoding response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "\r\n" + "hello world" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= + { { "Content-Type", "text/plain" } + } + ,.body= "hello world" + } + +#define NO_BODY_HTTP10_KA_200 13 +, {.name= "HTTP/1.0 with keep-alive and EOF-terminated 200 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 200 OK\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= + { { "Connection", "keep-alive" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP10_KA_204 14 +, {.name= "HTTP/1.0 with keep-alive and a 204 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.0 204 No content\r\n" + "Connection: keep-alive\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 204 + ,.response_status= "No content" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= + { { "Connection", "keep-alive" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_200 15 +, {.name= "HTTP/1.1 with an EOF-terminated 200 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= -1 + ,.num_headers= 0 + ,.headers={} + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_204 16 +, {.name= "HTTP/1.1 with a 204 status" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 204 No content\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 204 + ,.response_status= "No content" + ,.content_length= -1 + ,.num_headers= 0 + ,.headers={} + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_NOKA_204 17 +, {.name= "HTTP/1.1 with a 204 status and keep-alive disabled" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 204 No content\r\n" + "Connection: close\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 204 + ,.response_status= "No content" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= + { { "Connection", "close" } + } + ,.body_size= 0 + ,.body= "" + } + +#define NO_BODY_HTTP11_KA_CHUNKED_200 18 +, {.name= "HTTP/1.1 with chunked endocing and a 200 response" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= + { { "Transfer-Encoding", "chunked" } + } + ,.body_size= 0 + ,.body= "" + ,.num_chunks_complete= 1 + } + +#if !HTTP_PARSER_STRICT +#define SPACE_IN_FIELD_RES 19 +/* Should handle spaces in header fields */ +, {.name= "field space" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Server: Microsoft-IIS/6.0\r\n" + "X-Powered-By: ASP.NET\r\n" + "en-US Content-Type: text/xml\r\n" /* this is the problem */ + "Content-Type: text/xml\r\n" + "Content-Length: 16\r\n" + "Date: Fri, 23 Jul 2010 18:45:38 GMT\r\n" + "Connection: keep-alive\r\n" + "\r\n" + "hello" /* fake body */ + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= 16 + ,.num_headers= 7 + ,.headers= + { { "Server", "Microsoft-IIS/6.0" } + , { "X-Powered-By", "ASP.NET" } + , { "en-US Content-Type", "text/xml" } + , { "Content-Type", "text/xml" } + , { "Content-Length", "16" } + , { "Date", "Fri, 23 Jul 2010 18:45:38 GMT" } + , { "Connection", "keep-alive" } + } + ,.body= "hello" + } +#endif /* !HTTP_PARSER_STRICT */ + +#define AMAZON_COM 20 +, {.name= "amazon.com" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 301 MovedPermanently\r\n" + "Date: Wed, 15 May 2013 17:06:33 GMT\r\n" + "Server: Server\r\n" + "x-amz-id-1: 0GPHKXSJQ826RK7GZEB2\r\n" + "p3p: policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \"\r\n" + "x-amz-id-2: STN69VZxIFSz9YJLbz1GDbxpbjG6Qjmmq5E3DxRhOUw+Et0p4hr7c/Q8qNcx4oAD\r\n" + "Location: http://www.amazon.com/Dan-Brown/e/B000AP9DSU/ref=s9_pop_gw_al1?_encoding=UTF8&refinementId=618073011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=0SHYY5BZXN3KR20BNFAY&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846\r\n" + "Vary: Accept-Encoding,User-Agent\r\n" + "Content-Type: text/html; charset=ISO-8859-1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "1\r\n" + "\n\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 301 + ,.response_status= "MovedPermanently" + ,.content_length= -1 + ,.num_headers= 9 + ,.headers= { { "Date", "Wed, 15 May 2013 17:06:33 GMT" } + , { "Server", "Server" } + , { "x-amz-id-1", "0GPHKXSJQ826RK7GZEB2" } + , { "p3p", "policyref=\"http://www.amazon.com/w3c/p3p.xml\",CP=\"CAO DSP LAW CUR ADM IVAo IVDo CONo OTPo OUR DELi PUBi OTRi BUS PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA HEA PRE LOC GOV OTC \"" } + , { "x-amz-id-2", "STN69VZxIFSz9YJLbz1GDbxpbjG6Qjmmq5E3DxRhOUw+Et0p4hr7c/Q8qNcx4oAD" } + , { "Location", "http://www.amazon.com/Dan-Brown/e/B000AP9DSU/ref=s9_pop_gw_al1?_encoding=UTF8&refinementId=618073011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=0SHYY5BZXN3KR20BNFAY&pf_rd_t=101&pf_rd_p=1263340922&pf_rd_i=507846" } + , { "Vary", "Accept-Encoding,User-Agent" } + , { "Content-Type", "text/html; charset=ISO-8859-1" } + , { "Transfer-Encoding", "chunked" } + } + ,.body= "\n" + ,.num_chunks_complete= 2 + ,.chunk_lengths= { 1 } + } + +#define EMPTY_REASON_PHRASE_AFTER_SPACE 21 +, {.name= "empty reason phrase after space" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 \r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "" + ,.content_length= -1 + ,.num_headers= 0 + ,.headers= {} + ,.body= "" + } + +#define CONTENT_LENGTH_X 22 +, {.name= "Content-Length-X" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Length-X: 0\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "2\r\n" + "OK\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= -1 + ,.num_headers= 2 + ,.headers= { { "Content-Length-X", "0" } + , { "Transfer-Encoding", "chunked" } + } + ,.body= "OK" + ,.num_chunks_complete= 2 + ,.chunk_lengths= { 2 } + } + +#define HTTP_101_RESPONSE_WITH_UPGRADE_HEADER 23 +, {.name= "HTTP 101 response with Upgrade header" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 101 Switching Protocols\r\n" + "Connection: upgrade\r\n" + "Upgrade: h2c\r\n" + "\r\n" + "proto" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 101 + ,.response_status= "Switching Protocols" + ,.upgrade= "proto" + ,.content_length= -1 + ,.num_headers= 2 + ,.headers= + { { "Connection", "upgrade" } + , { "Upgrade", "h2c" } + } + } + +#define HTTP_101_RESPONSE_WITH_UPGRADE_HEADER_AND_CONTENT_LENGTH 24 +, {.name= "HTTP 101 response with Upgrade and Content-Length header" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 101 Switching Protocols\r\n" + "Connection: upgrade\r\n" + "Upgrade: h2c\r\n" + "Content-Length: 4\r\n" + "\r\n" + "body" + "proto" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 101 + ,.response_status= "Switching Protocols" + ,.body= "body" + ,.upgrade= "proto" + ,.content_length= 4 + ,.num_headers= 3 + ,.headers= + { { "Connection", "upgrade" } + , { "Upgrade", "h2c" } + , { "Content-Length", "4" } + } + } + +#define HTTP_101_RESPONSE_WITH_UPGRADE_HEADER_AND_TRANSFER_ENCODING 25 +, {.name= "HTTP 101 response with Upgrade and Transfer-Encoding header" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 101 Switching Protocols\r\n" + "Connection: upgrade\r\n" + "Upgrade: h2c\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "2\r\n" + "bo\r\n" + "2\r\n" + "dy\r\n" + "0\r\n" + "\r\n" + "proto" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 101 + ,.response_status= "Switching Protocols" + ,.body= "body" + ,.upgrade= "proto" + ,.content_length= -1 + ,.num_headers= 3 + ,.headers= + { { "Connection", "upgrade" } + , { "Upgrade", "h2c" } + , { "Transfer-Encoding", "chunked" } + } + ,.num_chunks_complete= 3 + ,.chunk_lengths= { 2, 2 } + } + +#define HTTP_200_RESPONSE_WITH_UPGRADE_HEADER 26 +, {.name= "HTTP 200 response with Upgrade header" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Connection: upgrade\r\n" + "Upgrade: h2c\r\n" + "\r\n" + "body" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.body= "body" + ,.upgrade= NULL + ,.content_length= -1 + ,.num_headers= 2 + ,.headers= + { { "Connection", "upgrade" } + , { "Upgrade", "h2c" } + } + } + +#define HTTP_200_RESPONSE_WITH_UPGRADE_HEADER_AND_CONTENT_LENGTH 27 +, {.name= "HTTP 200 response with Upgrade and Content-Length header" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Connection: upgrade\r\n" + "Upgrade: h2c\r\n" + "Content-Length: 4\r\n" + "\r\n" + "body" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= 4 + ,.num_headers= 3 + ,.body= "body" + ,.upgrade= NULL + ,.headers= + { { "Connection", "upgrade" } + , { "Upgrade", "h2c" } + , { "Content-Length", "4" } + } + } + +#define HTTP_200_RESPONSE_WITH_UPGRADE_HEADER_AND_TRANSFER_ENCODING 28 +, {.name= "HTTP 200 response with Upgrade and Transfer-Encoding header" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Connection: upgrade\r\n" + "Upgrade: h2c\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "2\r\n" + "bo\r\n" + "2\r\n" + "dy\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= -1 + ,.num_headers= 3 + ,.body= "body" + ,.upgrade= NULL + ,.headers= + { { "Connection", "upgrade" } + , { "Upgrade", "h2c" } + , { "Transfer-Encoding", "chunked" } + } + ,.num_chunks_complete= 3 + ,.chunk_lengths= { 2, 2 } + } +#define HTTP_200_MULTI_TE_NOT_LAST_CHUNKED 29 +, {.name= "HTTP 200 response with `chunked` being *not last* Transfer-Encoding" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Transfer-Encoding: chunked, identity\r\n" + "\r\n" + "2\r\n" + "OK\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= TRUE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= -1 + ,.num_headers= 1 + ,.headers= { { "Transfer-Encoding", "chunked, identity" } + } + ,.body= "2\r\nOK\r\n0\r\n\r\n" + ,.num_chunks_complete= 0 + } +}; + +/* strnlen() is a POSIX.2008 addition. Can't rely on it being available so + * define it ourselves. + */ +size_t +strnlen(const char *s, size_t maxlen) +{ + const char *p; + + p = memchr(s, '\0', maxlen); + if (p == NULL) + return maxlen; + + return p - s; +} + +size_t +strlncat(char *dst, size_t len, const char *src, size_t n) +{ + size_t slen; + size_t dlen; + size_t rlen; + size_t ncpy; + + slen = strnlen(src, n); + dlen = strnlen(dst, len); + + if (dlen < len) { + rlen = len - dlen; + ncpy = slen < rlen ? slen : (rlen - 1); + memcpy(dst + dlen, src, ncpy); + dst[dlen + ncpy] = '\0'; + } + + assert(len > slen + dlen); + return slen + dlen; +} + +size_t +strlncpy(char *dst, size_t len, const char *src, size_t n) +{ + size_t slen; + size_t ncpy; + + slen = strnlen(src, n); + + if (len > 0) { + ncpy = slen < len ? slen : (len - 1); + memcpy(dst, src, ncpy); + dst[ncpy] = '\0'; + } + + assert(len > slen); + return slen; +} + +int +request_url_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == &parser); + strlncat(messages[num_messages].request_url, + sizeof(messages[num_messages].request_url), + buf, + len); + return 0; +} + +int +header_field_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == &parser); + struct message *m = &messages[num_messages]; + + if (m->last_header_element != FIELD) + m->num_headers++; + + strlncat(m->headers[m->num_headers-1][0], + sizeof(m->headers[m->num_headers-1][0]), + buf, + len); + + m->last_header_element = FIELD; + + return 0; +} + +int +header_value_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == &parser); + struct message *m = &messages[num_messages]; + + strlncat(m->headers[m->num_headers-1][1], + sizeof(m->headers[m->num_headers-1][1]), + buf, + len); + + m->last_header_element = VALUE; + + return 0; +} + +void +check_body_is_final (const http_parser *p) +{ + if (messages[num_messages].body_is_final) { + fprintf(stderr, "\n\n *** Error http_body_is_final() should return 1 " + "on last on_body callback call " + "but it doesn't! ***\n\n"); + assert(0); + abort(); + } + messages[num_messages].body_is_final = http_body_is_final(p); +} + +int +body_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == &parser); + strlncat(messages[num_messages].body, + sizeof(messages[num_messages].body), + buf, + len); + messages[num_messages].body_size += len; + check_body_is_final(p); + // printf("body_cb: '%s'\n", requests[num_messages].body); + return 0; +} + +int +count_body_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == &parser); + assert(buf); + messages[num_messages].body_size += len; + check_body_is_final(p); + return 0; +} + +int +message_begin_cb (http_parser *p) +{ + assert(p == &parser); + assert(!messages[num_messages].message_begin_cb_called); + messages[num_messages].message_begin_cb_called = TRUE; + return 0; +} + +int +headers_complete_cb (http_parser *p) +{ + assert(p == &parser); + messages[num_messages].method = parser.method; + messages[num_messages].status_code = parser.status_code; + messages[num_messages].http_major = parser.http_major; + messages[num_messages].http_minor = parser.http_minor; + messages[num_messages].content_length = parser.content_length; + messages[num_messages].headers_complete_cb_called = TRUE; + messages[num_messages].should_keep_alive = http_should_keep_alive(&parser); + return 0; +} + +int +message_complete_cb (http_parser *p) +{ + assert(p == &parser); + if (messages[num_messages].should_keep_alive != + http_should_keep_alive(&parser)) + { + fprintf(stderr, "\n\n *** Error http_should_keep_alive() should have same " + "value in both on_message_complete and on_headers_complete " + "but it doesn't! ***\n\n"); + assert(0); + abort(); + } + + if (messages[num_messages].body_size && + http_body_is_final(p) && + !messages[num_messages].body_is_final) + { + fprintf(stderr, "\n\n *** Error http_body_is_final() should return 1 " + "on last on_body callback call " + "but it doesn't! ***\n\n"); + assert(0); + abort(); + } + + messages[num_messages].message_complete_cb_called = TRUE; + + messages[num_messages].message_complete_on_eof = currently_parsing_eof; + + num_messages++; + return 0; +} + +int +response_status_cb (http_parser *p, const char *buf, size_t len) +{ + assert(p == &parser); + + messages[num_messages].status_cb_called = TRUE; + + strlncat(messages[num_messages].response_status, + sizeof(messages[num_messages].response_status), + buf, + len); + return 0; +} + +int +chunk_header_cb (http_parser *p) +{ + assert(p == &parser); + int chunk_idx = messages[num_messages].num_chunks; + messages[num_messages].num_chunks++; + if (chunk_idx < MAX_CHUNKS) { + messages[num_messages].chunk_lengths[chunk_idx] = p->content_length; + } + + return 0; +} + +int +chunk_complete_cb (http_parser *p) +{ + assert(p == &parser); + + /* Here we want to verify that each chunk_header_cb is matched by a + * chunk_complete_cb, so not only should the total number of calls to + * both callbacks be the same, but they also should be interleaved + * properly */ + assert(messages[num_messages].num_chunks == + messages[num_messages].num_chunks_complete + 1); + + messages[num_messages].num_chunks_complete++; + return 0; +} + +/* These dontcall_* callbacks exist so that we can verify that when we're + * paused, no additional callbacks are invoked */ +int +dontcall_message_begin_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_message_begin() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_header_field_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_header_field() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_header_value_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_header_value() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_request_url_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_request_url() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_body_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_body_cb() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_headers_complete_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_headers_complete() called on paused " + "parser ***\n\n"); + abort(); +} + +int +dontcall_message_complete_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_message_complete() called on paused " + "parser ***\n\n"); + abort(); +} + +int +dontcall_response_status_cb (http_parser *p, const char *buf, size_t len) +{ + if (p || buf || len) { } // gcc + fprintf(stderr, "\n\n*** on_status() called on paused parser ***\n\n"); + abort(); +} + +int +dontcall_chunk_header_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_chunk_header() called on paused parser ***\n\n"); + exit(1); +} + +int +dontcall_chunk_complete_cb (http_parser *p) +{ + if (p) { } // gcc + fprintf(stderr, "\n\n*** on_chunk_complete() " + "called on paused parser ***\n\n"); + exit(1); +} + +static http_parser_settings settings_dontcall = + {.on_message_begin = dontcall_message_begin_cb + ,.on_header_field = dontcall_header_field_cb + ,.on_header_value = dontcall_header_value_cb + ,.on_url = dontcall_request_url_cb + ,.on_status = dontcall_response_status_cb + ,.on_body = dontcall_body_cb + ,.on_headers_complete = dontcall_headers_complete_cb + ,.on_message_complete = dontcall_message_complete_cb + ,.on_chunk_header = dontcall_chunk_header_cb + ,.on_chunk_complete = dontcall_chunk_complete_cb + }; + +/* These pause_* callbacks always pause the parser and just invoke the regular + * callback that tracks content. Before returning, we overwrite the parser + * settings to point to the _dontcall variety so that we can verify that + * the pause actually did, you know, pause. */ +int +pause_message_begin_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return message_begin_cb(p); +} + +int +pause_header_field_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return header_field_cb(p, buf, len); +} + +int +pause_header_value_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return header_value_cb(p, buf, len); +} + +int +pause_request_url_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return request_url_cb(p, buf, len); +} + +int +pause_body_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return body_cb(p, buf, len); +} + +int +pause_headers_complete_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return headers_complete_cb(p); +} + +int +pause_message_complete_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return message_complete_cb(p); +} + +int +pause_response_status_cb (http_parser *p, const char *buf, size_t len) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return response_status_cb(p, buf, len); +} + +int +pause_chunk_header_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return chunk_header_cb(p); +} + +int +pause_chunk_complete_cb (http_parser *p) +{ + http_parser_pause(p, 1); + *current_pause_parser = settings_dontcall; + return chunk_complete_cb(p); +} + +int +connect_headers_complete_cb (http_parser *p) +{ + headers_complete_cb(p); + return 1; +} + +int +connect_message_complete_cb (http_parser *p) +{ + messages[num_messages].should_keep_alive = http_should_keep_alive(&parser); + return message_complete_cb(p); +} + +static http_parser_settings settings_pause = + {.on_message_begin = pause_message_begin_cb + ,.on_header_field = pause_header_field_cb + ,.on_header_value = pause_header_value_cb + ,.on_url = pause_request_url_cb + ,.on_status = pause_response_status_cb + ,.on_body = pause_body_cb + ,.on_headers_complete = pause_headers_complete_cb + ,.on_message_complete = pause_message_complete_cb + ,.on_chunk_header = pause_chunk_header_cb + ,.on_chunk_complete = pause_chunk_complete_cb + }; + +static http_parser_settings settings = + {.on_message_begin = message_begin_cb + ,.on_header_field = header_field_cb + ,.on_header_value = header_value_cb + ,.on_url = request_url_cb + ,.on_status = response_status_cb + ,.on_body = body_cb + ,.on_headers_complete = headers_complete_cb + ,.on_message_complete = message_complete_cb + ,.on_chunk_header = chunk_header_cb + ,.on_chunk_complete = chunk_complete_cb + }; + +static http_parser_settings settings_count_body = + {.on_message_begin = message_begin_cb + ,.on_header_field = header_field_cb + ,.on_header_value = header_value_cb + ,.on_url = request_url_cb + ,.on_status = response_status_cb + ,.on_body = count_body_cb + ,.on_headers_complete = headers_complete_cb + ,.on_message_complete = message_complete_cb + ,.on_chunk_header = chunk_header_cb + ,.on_chunk_complete = chunk_complete_cb + }; + +static http_parser_settings settings_connect = + {.on_message_begin = message_begin_cb + ,.on_header_field = header_field_cb + ,.on_header_value = header_value_cb + ,.on_url = request_url_cb + ,.on_status = response_status_cb + ,.on_body = dontcall_body_cb + ,.on_headers_complete = connect_headers_complete_cb + ,.on_message_complete = connect_message_complete_cb + ,.on_chunk_header = chunk_header_cb + ,.on_chunk_complete = chunk_complete_cb + }; + +static http_parser_settings settings_null = + {.on_message_begin = 0 + ,.on_header_field = 0 + ,.on_header_value = 0 + ,.on_url = 0 + ,.on_status = 0 + ,.on_body = 0 + ,.on_headers_complete = 0 + ,.on_message_complete = 0 + ,.on_chunk_header = 0 + ,.on_chunk_complete = 0 + }; + +void +parser_init (enum http_parser_type type) +{ + num_messages = 0; + http_parser_init(&parser, type); + memset(&messages, 0, sizeof messages); +} + +size_t parse (const char *buf, size_t len) +{ + size_t nparsed; + currently_parsing_eof = (len == 0); + nparsed = http_parser_execute(&parser, &settings, buf, len); + return nparsed; +} + +size_t parse_count_body (const char *buf, size_t len) +{ + size_t nparsed; + currently_parsing_eof = (len == 0); + nparsed = http_parser_execute(&parser, &settings_count_body, buf, len); + return nparsed; +} + +size_t parse_pause (const char *buf, size_t len) +{ + size_t nparsed; + http_parser_settings s = settings_pause; + + currently_parsing_eof = (len == 0); + current_pause_parser = &s; + nparsed = http_parser_execute(&parser, current_pause_parser, buf, len); + return nparsed; +} + +size_t parse_connect (const char *buf, size_t len) +{ + size_t nparsed; + currently_parsing_eof = (len == 0); + nparsed = http_parser_execute(&parser, &settings_connect, buf, len); + return nparsed; +} + +static inline int +check_str_eq (const struct message *m, + const char *prop, + const char *expected, + const char *found) { + if ((expected == NULL) != (found == NULL)) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected %s\n", (expected == NULL) ? "NULL" : expected); + printf(" found %s\n", (found == NULL) ? "NULL" : found); + return 0; + } + if (expected != NULL && 0 != strcmp(expected, found)) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected '%s'\n", expected); + printf(" found '%s'\n", found); + return 0; + } + return 1; +} + +static inline int +check_num_eq (const struct message *m, + const char *prop, + int expected, + int found) { + if (expected != found) { + printf("\n*** Error: %s in '%s' ***\n\n", prop, m->name); + printf("expected %d\n", expected); + printf(" found %d\n", found); + return 0; + } + return 1; +} + +#define MESSAGE_CHECK_STR_EQ(expected, found, prop) \ + if (!check_str_eq(expected, #prop, expected->prop, found->prop)) return 0 + +#define MESSAGE_CHECK_NUM_EQ(expected, found, prop) \ + if (!check_num_eq(expected, #prop, expected->prop, found->prop)) return 0 + +#define MESSAGE_CHECK_URL_EQ(u, expected, found, prop, fn) \ +do { \ + char ubuf[256]; \ + \ + if ((u)->field_set & (1 << (fn))) { \ + memcpy(ubuf, (found)->request_url + (u)->field_data[(fn)].off, \ + (u)->field_data[(fn)].len); \ + ubuf[(u)->field_data[(fn)].len] = '\0'; \ + } else { \ + ubuf[0] = '\0'; \ + } \ + \ + check_str_eq(expected, #prop, expected->prop, ubuf); \ +} while(0) + +int +message_eq (int index, int connect, const struct message *expected) +{ + int i; + struct message *m = &messages[index]; + + MESSAGE_CHECK_NUM_EQ(expected, m, http_major); + MESSAGE_CHECK_NUM_EQ(expected, m, http_minor); + MESSAGE_CHECK_NUM_EQ(expected, m, content_length); + + if (expected->type == HTTP_REQUEST) { + MESSAGE_CHECK_NUM_EQ(expected, m, method); + } else { + MESSAGE_CHECK_NUM_EQ(expected, m, status_code); + MESSAGE_CHECK_STR_EQ(expected, m, response_status); + assert(m->status_cb_called); + } + + if (!connect) { + MESSAGE_CHECK_NUM_EQ(expected, m, should_keep_alive); + MESSAGE_CHECK_NUM_EQ(expected, m, message_complete_on_eof); + } + + assert(m->message_begin_cb_called); + assert(m->headers_complete_cb_called); + assert(m->message_complete_cb_called); + + + MESSAGE_CHECK_STR_EQ(expected, m, request_url); + + /* Check URL components; we can't do this w/ CONNECT since it doesn't + * send us a well-formed URL. + */ + if (*m->request_url && m->method != HTTP_CONNECT) { + struct http_parser_url u; + + if (http_parser_parse_url(m->request_url, strlen(m->request_url), 0, &u)) { + fprintf(stderr, "\n\n*** failed to parse URL %s ***\n\n", + m->request_url); + abort(); + } + + if (expected->host) { + MESSAGE_CHECK_URL_EQ(&u, expected, m, host, UF_HOST); + } + + if (expected->userinfo) { + MESSAGE_CHECK_URL_EQ(&u, expected, m, userinfo, UF_USERINFO); + } + + m->port = (u.field_set & (1 << UF_PORT)) ? + u.port : 0; + + MESSAGE_CHECK_URL_EQ(&u, expected, m, query_string, UF_QUERY); + MESSAGE_CHECK_URL_EQ(&u, expected, m, fragment, UF_FRAGMENT); + MESSAGE_CHECK_URL_EQ(&u, expected, m, request_path, UF_PATH); + MESSAGE_CHECK_NUM_EQ(expected, m, port); + } + + if (connect) { + check_num_eq(m, "body_size", 0, m->body_size); + } else if (expected->body_size) { + MESSAGE_CHECK_NUM_EQ(expected, m, body_size); + } else { + MESSAGE_CHECK_STR_EQ(expected, m, body); + } + + if (connect) { + check_num_eq(m, "num_chunks_complete", 0, m->num_chunks_complete); + } else { + assert(m->num_chunks == m->num_chunks_complete); + MESSAGE_CHECK_NUM_EQ(expected, m, num_chunks_complete); + for (i = 0; i < m->num_chunks && i < MAX_CHUNKS; i++) { + MESSAGE_CHECK_NUM_EQ(expected, m, chunk_lengths[i]); + } + } + + MESSAGE_CHECK_NUM_EQ(expected, m, num_headers); + + int r; + for (i = 0; i < m->num_headers; i++) { + r = check_str_eq(expected, "header field", expected->headers[i][0], m->headers[i][0]); + if (!r) return 0; + r = check_str_eq(expected, "header value", expected->headers[i][1], m->headers[i][1]); + if (!r) return 0; + } + + if (!connect) { + MESSAGE_CHECK_STR_EQ(expected, m, upgrade); + } + + return 1; +} + +/* Given a sequence of varargs messages, return the number of them that the + * parser should successfully parse, taking into account that upgraded + * messages prevent all subsequent messages from being parsed. + */ +size_t +count_parsed_messages(const size_t nmsgs, ...) { + size_t i; + va_list ap; + + va_start(ap, nmsgs); + + for (i = 0; i < nmsgs; i++) { + struct message *m = va_arg(ap, struct message *); + + if (m->upgrade) { + va_end(ap); + return i + 1; + } + } + + va_end(ap); + return nmsgs; +} + +/* Given a sequence of bytes and the number of these that we were able to + * parse, verify that upgrade bodies are correct. + */ +void +upgrade_message_fix(char *body, const size_t nread, const size_t nmsgs, ...) { + va_list ap; + size_t i; + size_t off = 0; + + va_start(ap, nmsgs); + + for (i = 0; i < nmsgs; i++) { + struct message *m = va_arg(ap, struct message *); + + off += strlen(m->raw); + + if (m->upgrade) { + off -= strlen(m->upgrade); + + /* Check the portion of the response after its specified upgrade */ + if (!check_str_eq(m, "upgrade", body + off, body + nread)) { + abort(); + } + + /* Fix up the response so that message_eq() will verify the beginning + * of the upgrade */ + *(body + nread + strlen(m->upgrade)) = '\0'; + messages[num_messages -1 ].upgrade = body + nread; + + va_end(ap); + return; + } + } + + va_end(ap); + printf("\n\n*** Error: expected a message with upgrade ***\n"); + + abort(); +} + +static void +print_error (const char *raw, size_t error_location) +{ + fprintf(stderr, "\n*** %s ***\n\n", + http_errno_description(HTTP_PARSER_ERRNO(&parser))); + + int this_line = 0, char_len = 0; + size_t i, j, len = strlen(raw), error_location_line = 0; + for (i = 0; i < len; i++) { + if (i == error_location) this_line = 1; + switch (raw[i]) { + case '\r': + char_len = 2; + fprintf(stderr, "\\r"); + break; + + case '\n': + fprintf(stderr, "\\n\n"); + + if (this_line) goto print; + + error_location_line = 0; + continue; + + default: + char_len = 1; + fputc(raw[i], stderr); + break; + } + if (!this_line) error_location_line += char_len; + } + + fprintf(stderr, "[eof]\n"); + + print: + for (j = 0; j < error_location_line; j++) { + fputc(' ', stderr); + } + fprintf(stderr, "^\n\nerror location: %u\n", (unsigned int)error_location); +} + +void +test_preserve_data (void) +{ + char my_data[] = "application-specific data"; + http_parser parser; + parser.data = my_data; + http_parser_init(&parser, HTTP_REQUEST); + if (parser.data != my_data) { + printf("\n*** parser.data not preserved accross http_parser_init ***\n\n"); + abort(); + } +} + +struct url_test { + const char *name; + const char *url; + int is_connect; + struct http_parser_url u; + int rv; +}; + +const struct url_test url_tests[] = +{ {.name="proxy request" + ,.url="http://hostname/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 7, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 15, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="proxy request with port" + ,.url="http://hostname:444/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PORT) | (1 << UF_PATH) + ,.port=444 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 7, 8 } /* UF_HOST */ + ,{ 16, 3 } /* UF_PORT */ + ,{ 19, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="CONNECT request" + ,.url="hostname:443" + ,.is_connect=1 + ,.u= + {.field_set=(1 << UF_HOST) | (1 << UF_PORT) + ,.port=443 + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 0, 8 } /* UF_HOST */ + ,{ 9, 3 } /* UF_PORT */ + ,{ 0, 0 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="CONNECT request but not connect" + ,.url="hostname:443" + ,.is_connect=0 + ,.rv=1 + } + +, {.name="proxy ipv6 request" + ,.url="http://[1:2::3:4]/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 8 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 17, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="proxy ipv6 request with port" + ,.url="http://[1:2::3:4]:67/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PORT) | (1 << UF_PATH) + ,.port=67 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 8 } /* UF_HOST */ + ,{ 18, 2 } /* UF_PORT */ + ,{ 20, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="CONNECT ipv6 address" + ,.url="[1:2::3:4]:443" + ,.is_connect=1 + ,.u= + {.field_set=(1 << UF_HOST) | (1 << UF_PORT) + ,.port=443 + ,.field_data= + {{ 0, 0 } /* UF_SCHEMA */ + ,{ 1, 8 } /* UF_HOST */ + ,{ 11, 3 } /* UF_PORT */ + ,{ 0, 0 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="ipv4 in ipv6 address" + ,.url="http://[2001:0000:0000:0000:0000:0000:1.9.1.1]/" + ,.is_connect=0 + ,.u= + {.field_set=(1 << UF_SCHEMA) | (1 << UF_HOST) | (1 << UF_PATH) + ,.port=0 + ,.field_data= + {{ 0, 4 } /* UF_SCHEMA */ + ,{ 8, 37 } /* UF_HOST */ + ,{ 0, 0 } /* UF_PORT */ + ,{ 46, 1 } /* UF_PATH */ + ,{ 0, 0 } /* UF_QUERY */ + ,{ 0, 0 } /* UF_FRAGMENT */ + ,{ 0, 0 } /* UF_USERINFO */ + } + } + ,.rv=0 + } + +, {.name="extra ? in query string" + ,.url="http://a.tbcdn.cn/p/fp/2010c/??fp-header-min.css,fp-base-min.css," + "fp-channel-min.css,fp-product-min.css,fp-mall-min.css,fp-category-min.css," + "fp-sub-min.css,fp-gdp4p-min.css,fp-css3-min.css,fp-misc-min.css?t=20101022.css" + ,.is_connect=0 + ,.u= + {.field_set=(1<field_set, u->port); + for (i = 0; i < UF_MAX; i++) { + if ((u->field_set & (1 << i)) == 0) { + printf("\tfield_data[%u]: unset\n", i); + continue; + } + + printf("\tfield_data[%u]: off: %u len: %u part: \"%.*s\n\"", + i, + u->field_data[i].off, + u->field_data[i].len, + u->field_data[i].len, + url + u->field_data[i].off); + } +} + +void +test_parse_url (void) +{ + struct http_parser_url u; + const struct url_test *test; + unsigned int i; + int rv; + + for (i = 0; i < (sizeof(url_tests) / sizeof(url_tests[0])); i++) { + test = &url_tests[i]; + memset(&u, 0, sizeof(u)); + + rv = http_parser_parse_url(test->url, + test->url ? strlen(test->url) : 0, + test->is_connect, + &u); + + if (test->rv == 0) { + if (rv != 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " + "unexpected rv %d ***\n\n", test->url, test->name, rv); + abort(); + } + + if (memcmp(&u, &test->u, sizeof(u)) != 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" failed ***\n", + test->url, test->name); + + printf("target http_parser_url:\n"); + dump_url(test->url, &test->u); + printf("result http_parser_url:\n"); + dump_url(test->url, &u); + + abort(); + } + } else { + /* test->rv != 0 */ + if (rv == 0) { + printf("\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " + "unexpected rv %d ***\n\n", test->url, test->name, rv); + abort(); + } + } + } +} + +void +test_method_str (void) +{ + assert(0 == strcmp("GET", http_method_str(HTTP_GET))); + assert(0 == strcmp("", http_method_str(1337))); +} + +void +test_status_str (void) +{ + assert(0 == strcmp("OK", http_status_str(HTTP_STATUS_OK))); + assert(0 == strcmp("Not Found", http_status_str(HTTP_STATUS_NOT_FOUND))); + assert(0 == strcmp("", http_status_str(1337))); +} + +void +test_message (const struct message *message) +{ + size_t raw_len = strlen(message->raw); + size_t msg1len; + for (msg1len = 0; msg1len < raw_len; msg1len++) { + parser_init(message->type); + if (message->allow_chunked_length) { + parser.allow_chunked_length = 1; + } + + size_t read; + const char *msg1 = message->raw; + const char *msg2 = msg1 + msg1len; + size_t msg2len = raw_len - msg1len; + + if (msg1len) { + assert(num_messages == 0); + messages[0].headers_complete_cb_called = FALSE; + + read = parse(msg1, msg1len); + + if (!messages[0].headers_complete_cb_called && parser.nread != read) { + assert(parser.nread == read); + print_error(msg1, read); + abort(); + } + + if (message->upgrade && parser.upgrade && num_messages > 0) { + messages[num_messages - 1].upgrade = msg1 + read; + goto test; + } + + if (read != msg1len) { + print_error(msg1, read); + abort(); + } + } + + + read = parse(msg2, msg2len); + + if (message->upgrade && parser.upgrade) { + messages[num_messages - 1].upgrade = msg2 + read; + goto test; + } + + if (read != msg2len) { + print_error(msg2, read); + abort(); + } + + read = parse(NULL, 0); + + if (read != 0) { + print_error(message->raw, read); + abort(); + } + + test: + + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); + abort(); + } + + if(!message_eq(0, 0, message)) abort(); + } +} + +void +test_message_count_body (const struct message *message) +{ + parser_init(message->type); + + size_t read; + size_t l = strlen(message->raw); + size_t i, toread; + size_t chunk = 4024; + + for (i = 0; i < l; i+= chunk) { + toread = MIN(l-i, chunk); + read = parse_count_body(message->raw + i, toread); + if (read != toread) { + print_error(message->raw, read); + abort(); + } + } + + + read = parse_count_body(NULL, 0); + if (read != 0) { + print_error(message->raw, read); + abort(); + } + + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", message->name); + abort(); + } + + if(!message_eq(0, 0, message)) abort(); +} + +void +test_simple_type (const char *buf, + enum http_errno err_expected, + enum http_parser_type type) +{ + parser_init(type); + + enum http_errno err; + + parse(buf, strlen(buf)); + err = HTTP_PARSER_ERRNO(&parser); + parse(NULL, 0); + + /* In strict mode, allow us to pass with an unexpected HPE_STRICT as + * long as the caller isn't expecting success. + */ +#if HTTP_PARSER_STRICT + if (err_expected != err && err_expected != HPE_OK && err != HPE_STRICT) { +#else + if (err_expected != err) { +#endif + fprintf(stderr, "\n*** test_simple expected %s, but saw %s ***\n\n%s\n", + http_errno_name(err_expected), http_errno_name(err), buf); + abort(); + } +} + +void +test_simple (const char *buf, enum http_errno err_expected) +{ + test_simple_type(buf, err_expected, HTTP_REQUEST); +} + +void +test_invalid_header_content (int req, const char* str) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? + "GET / HTTP/1.1\r\n" : + "HTTP/1.1 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = str; + size_t buflen = strlen(buf); + + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + assert(HTTP_PARSER_ERRNO(&parser) == HPE_INVALID_HEADER_TOKEN); + return; + } + + fprintf(stderr, + "\n*** Error expected but none in invalid header content test ***\n"); + abort(); +} + +void +test_invalid_header_field_content_error (int req) +{ + test_invalid_header_content(req, "Foo: F\01ailure"); + test_invalid_header_content(req, "Foo: B\02ar"); +} + +void +test_invalid_header_field (int req, const char* str) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? + "GET / HTTP/1.1\r\n" : + "HTTP/1.1 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = str; + size_t buflen = strlen(buf); + + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + assert(HTTP_PARSER_ERRNO(&parser) == HPE_INVALID_HEADER_TOKEN); + return; + } + + fprintf(stderr, + "\n*** Error expected but none in invalid header token test ***\n"); + abort(); +} + +void +test_invalid_header_field_token_error (int req) +{ + test_invalid_header_field(req, "Fo@: Failure"); + test_invalid_header_field(req, "Foo\01\test: Bar"); +} + +void +test_double_content_length_error (int req) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? + "GET / HTTP/1.1\r\n" : + "HTTP/1.1 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = "Content-Length: 0\r\nContent-Length: 1\r\n\r\n"; + size_t buflen = strlen(buf); + + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + assert(HTTP_PARSER_ERRNO(&parser) == HPE_UNEXPECTED_CONTENT_LENGTH); + return; + } + + fprintf(stderr, + "\n*** Error expected but none in double content-length test ***\n"); + abort(); +} + +void +test_chunked_content_length_error (int req) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? + "GET / HTTP/1.1\r\n" : + "HTTP/1.1 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = "Transfer-Encoding: anything\r\nContent-Length: 1\r\n\r\n"; + size_t buflen = strlen(buf); + + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + assert(HTTP_PARSER_ERRNO(&parser) == HPE_UNEXPECTED_CONTENT_LENGTH); + return; + } + + fprintf(stderr, + "\n*** Error expected but none in chunked content-length test ***\n"); + abort(); +} + +void +test_header_cr_no_lf_error (int req) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? + "GET / HTTP/1.1\r\n" : + "HTTP/1.1 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = "Foo: 1\rBar: 1\r\n\r\n"; + size_t buflen = strlen(buf); + + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + assert(HTTP_PARSER_ERRNO(&parser) == HPE_LF_EXPECTED); + return; + } + + fprintf(stderr, + "\n*** Error expected but none in header whitespace test ***\n"); + abort(); +} + +void +test_no_overflow_parse_url (void) +{ + int rv; + struct http_parser_url u; + + http_parser_url_init(&u); + rv = http_parser_parse_url("http://example.com:8001", 22, 0, &u); + + if (rv != 0) { + fprintf(stderr, + "\n*** test_no_overflow_parse_url invalid return value=%d\n", + rv); + abort(); + } + + if (u.port != 800) { + fprintf(stderr, + "\n*** test_no_overflow_parse_url invalid port number=%d\n", + u.port); + abort(); + } +} + +void +test_header_overflow_error (int req) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + const char *buf; + buf = req ? "GET / HTTP/1.1\r\n" : "HTTP/1.0 200 OK\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + buf = "header-key: header-value\r\n"; + size_t buflen = strlen(buf); + + int i; + for (i = 0; i < 10000; i++) { + parsed = http_parser_execute(&parser, &settings_null, buf, buflen); + if (parsed != buflen) { + //fprintf(stderr, "error found on iter %d\n", i); + assert(HTTP_PARSER_ERRNO(&parser) == HPE_HEADER_OVERFLOW); + return; + } + } + + fprintf(stderr, "\n*** Error expected but none in header overflow test ***\n"); + abort(); +} + + +void +test_header_nread_value () +{ + http_parser parser; + http_parser_init(&parser, HTTP_REQUEST); + size_t parsed; + const char *buf; + buf = "GET / HTTP/1.1\r\nheader: value\nhdr: value\r\n"; + parsed = http_parser_execute(&parser, &settings_null, buf, strlen(buf)); + assert(parsed == strlen(buf)); + + assert(parser.nread == strlen(buf)); +} + + +static void +test_content_length_overflow (const char *buf, size_t buflen, int expect_ok) +{ + http_parser parser; + http_parser_init(&parser, HTTP_RESPONSE); + http_parser_execute(&parser, &settings_null, buf, buflen); + + if (expect_ok) + assert(HTTP_PARSER_ERRNO(&parser) == HPE_OK); + else + assert(HTTP_PARSER_ERRNO(&parser) == HPE_INVALID_CONTENT_LENGTH); +} + +void +test_header_content_length_overflow_error (void) +{ +#define X(size) \ + "HTTP/1.1 200 OK\r\n" \ + "Content-Length: " #size "\r\n" \ + "\r\n" + const char a[] = X(1844674407370955160); /* 2^64 / 10 - 1 */ + const char b[] = X(18446744073709551615); /* 2^64-1 */ + const char c[] = X(18446744073709551616); /* 2^64 */ +#undef X + test_content_length_overflow(a, sizeof(a) - 1, 1); /* expect ok */ + test_content_length_overflow(b, sizeof(b) - 1, 0); /* expect failure */ + test_content_length_overflow(c, sizeof(c) - 1, 0); /* expect failure */ +} + +void +test_chunk_content_length_overflow_error (void) +{ +#define X(size) \ + "HTTP/1.1 200 OK\r\n" \ + "Transfer-Encoding: chunked\r\n" \ + "\r\n" \ + #size "\r\n" \ + "..." + const char a[] = X(FFFFFFFFFFFFFFE); /* 2^64 / 16 - 1 */ + const char b[] = X(FFFFFFFFFFFFFFFF); /* 2^64-1 */ + const char c[] = X(10000000000000000); /* 2^64 */ +#undef X + test_content_length_overflow(a, sizeof(a) - 1, 1); /* expect ok */ + test_content_length_overflow(b, sizeof(b) - 1, 0); /* expect failure */ + test_content_length_overflow(c, sizeof(c) - 1, 0); /* expect failure */ +} + +void +test_no_overflow_long_body (int req, size_t length) +{ + http_parser parser; + http_parser_init(&parser, req ? HTTP_REQUEST : HTTP_RESPONSE); + size_t parsed; + size_t i; + char buf1[3000]; + size_t buf1len = sprintf(buf1, "%s\r\nConnection: Keep-Alive\r\nContent-Length: %lu\r\n\r\n", + req ? "POST / HTTP/1.0" : "HTTP/1.0 200 OK", (unsigned long)length); + parsed = http_parser_execute(&parser, &settings_null, buf1, buf1len); + if (parsed != buf1len) + goto err; + + for (i = 0; i < length; i++) { + char foo = 'a'; + parsed = http_parser_execute(&parser, &settings_null, &foo, 1); + if (parsed != 1) + goto err; + } + + parsed = http_parser_execute(&parser, &settings_null, buf1, buf1len); + if (parsed != buf1len) goto err; + return; + + err: + fprintf(stderr, + "\n*** error in test_no_overflow_long_body %s of length %lu ***\n", + req ? "REQUEST" : "RESPONSE", + (unsigned long)length); + abort(); +} + +void +test_multiple3 (const struct message *r1, const struct message *r2, const struct message *r3) +{ + int message_count = count_parsed_messages(3, r1, r2, r3); + + char total[ strlen(r1->raw) + + strlen(r2->raw) + + strlen(r3->raw) + + 1 + ]; + total[0] = '\0'; + + strcat(total, r1->raw); + strcat(total, r2->raw); + strcat(total, r3->raw); + + parser_init(r1->type); + if (r1->allow_chunked_length || + r2->allow_chunked_length || + r3->allow_chunked_length) { + parser.allow_chunked_length = 1; + } + + size_t read; + + read = parse(total, strlen(total)); + + if (parser.upgrade) { + upgrade_message_fix(total, read, 3, r1, r2, r3); + goto test; + } + + if (read != strlen(total)) { + print_error(total, read); + abort(); + } + + read = parse(NULL, 0); + + if (read != 0) { + print_error(total, read); + abort(); + } + +test: + + if (message_count != num_messages) { + fprintf(stderr, "\n\n*** Parser didn't see 3 messages only %d *** \n", num_messages); + abort(); + } + + if (!message_eq(0, 0, r1)) abort(); + if (message_count > 1 && !message_eq(1, 0, r2)) abort(); + if (message_count > 2 && !message_eq(2, 0, r3)) abort(); +} + +/* SCAN through every possible breaking to make sure the + * parser can handle getting the content in any chunks that + * might come from the socket + */ +void +test_scan (const struct message *r1, const struct message *r2, const struct message *r3) +{ + char total[80*1024] = "\0"; + char buf1[80*1024] = "\0"; + char buf2[80*1024] = "\0"; + char buf3[80*1024] = "\0"; + + strcat(total, r1->raw); + strcat(total, r2->raw); + strcat(total, r3->raw); + + size_t read; + + int total_len = strlen(total); + + int total_ops = 2 * (total_len - 1) * (total_len - 2) / 2; + int ops = 0 ; + + size_t buf1_len, buf2_len, buf3_len; + int message_count = count_parsed_messages(3, r1, r2, r3); + + int i,j,type_both; + for (type_both = 0; type_both < 2; type_both ++ ) { + for (j = 2; j < total_len; j ++ ) { + for (i = 1; i < j; i ++ ) { + + if (ops % 1000 == 0) { + printf("\b\b\b\b%3.0f%%", 100 * (float)ops /(float)total_ops); + fflush(stdout); + } + ops += 1; + + parser_init(type_both ? HTTP_BOTH : r1->type); + + buf1_len = i; + strlncpy(buf1, sizeof(buf1), total, buf1_len); + buf1[buf1_len] = 0; + + buf2_len = j - i; + strlncpy(buf2, sizeof(buf1), total+i, buf2_len); + buf2[buf2_len] = 0; + + buf3_len = total_len - j; + strlncpy(buf3, sizeof(buf1), total+j, buf3_len); + buf3[buf3_len] = 0; + + assert(num_messages == 0); + messages[0].headers_complete_cb_called = FALSE; + + read = parse(buf1, buf1_len); + + if (!messages[0].headers_complete_cb_called && parser.nread != read) { + print_error(buf1, read); + goto error; + } + + if (parser.upgrade) goto test; + + if (read != buf1_len) { + print_error(buf1, read); + goto error; + } + + read += parse(buf2, buf2_len); + + if (parser.upgrade) goto test; + + if (read != buf1_len + buf2_len) { + print_error(buf2, read); + goto error; + } + + read += parse(buf3, buf3_len); + + if (parser.upgrade) goto test; + + if (read != buf1_len + buf2_len + buf3_len) { + print_error(buf3, read); + goto error; + } + + parse(NULL, 0); + +test: + if (parser.upgrade) { + upgrade_message_fix(total, read, 3, r1, r2, r3); + } + + if (message_count != num_messages) { + fprintf(stderr, "\n\nParser didn't see %d messages only %d\n", + message_count, num_messages); + goto error; + } + + if (!message_eq(0, 0, r1)) { + fprintf(stderr, "\n\nError matching messages[0] in test_scan.\n"); + goto error; + } + + if (message_count > 1 && !message_eq(1, 0, r2)) { + fprintf(stderr, "\n\nError matching messages[1] in test_scan.\n"); + goto error; + } + + if (message_count > 2 && !message_eq(2, 0, r3)) { + fprintf(stderr, "\n\nError matching messages[2] in test_scan.\n"); + goto error; + } + } + } + } + puts("\b\b\b\b100%"); + return; + + error: + fprintf(stderr, "i=%d j=%d\n", i, j); + fprintf(stderr, "buf1 (%u) %s\n\n", (unsigned int)buf1_len, buf1); + fprintf(stderr, "buf2 (%u) %s\n\n", (unsigned int)buf2_len , buf2); + fprintf(stderr, "buf3 (%u) %s\n", (unsigned int)buf3_len, buf3); + abort(); +} + +// user required to free the result +// string terminated by \0 +char * +create_large_chunked_message (int body_size_in_kb, const char* headers) +{ + int i; + size_t wrote = 0; + size_t headers_len = strlen(headers); + size_t bufsize = headers_len + (5+1024+2)*body_size_in_kb + 6; + char * buf = malloc(bufsize); + + memcpy(buf, headers, headers_len); + wrote += headers_len; + + for (i = 0; i < body_size_in_kb; i++) { + // write 1kb chunk into the body. + memcpy(buf + wrote, "400\r\n", 5); + wrote += 5; + memset(buf + wrote, 'C', 1024); + wrote += 1024; + strcpy(buf + wrote, "\r\n"); + wrote += 2; + } + + memcpy(buf + wrote, "0\r\n\r\n", 6); + wrote += 6; + assert(wrote == bufsize); + + return buf; +} + +/* Verify that we can pause parsing at any of the bytes in the + * message and still get the result that we're expecting. */ +void +test_message_pause (const struct message *msg) +{ + char *buf = (char*) msg->raw; + size_t buflen = strlen(msg->raw); + size_t nread; + + parser_init(msg->type); + if (msg->allow_chunked_length) { + parser.allow_chunked_length = 1; + } + + do { + nread = parse_pause(buf, buflen); + + // We can only set the upgrade buffer once we've gotten our message + // completion callback. + if (messages[0].message_complete_cb_called && + msg->upgrade && + parser.upgrade) { + messages[0].upgrade = buf + nread; + goto test; + } + + if (nread < buflen) { + + // Not much do to if we failed a strict-mode check + if (HTTP_PARSER_ERRNO(&parser) == HPE_STRICT) { + return; + } + + assert (HTTP_PARSER_ERRNO(&parser) == HPE_PAUSED); + } + + buf += nread; + buflen -= nread; + http_parser_pause(&parser, 0); + } while (buflen > 0); + + nread = parse_pause(NULL, 0); + assert (nread == 0); + +test: + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", msg->name); + abort(); + } + + if(!message_eq(0, 0, msg)) abort(); +} + +/* Verify that body and next message won't be parsed in responses to CONNECT */ +void +test_message_connect (const struct message *msg) +{ + char *buf = (char*) msg->raw; + size_t buflen = strlen(msg->raw); + + parser_init(msg->type); + + parse_connect(buf, buflen); + + if (num_messages != 1) { + printf("\n*** num_messages != 1 after testing '%s' ***\n\n", msg->name); + abort(); + } + + if(!message_eq(0, 1, msg)) abort(); +} + +int +main (void) +{ + unsigned i, j, k; + unsigned long version; + unsigned major; + unsigned minor; + unsigned patch; + + version = http_parser_version(); + major = (version >> 16) & 255; + minor = (version >> 8) & 255; + patch = version & 255; + printf("http_parser v%u.%u.%u (0x%06lx)\n", major, minor, patch, version); + + printf("sizeof(http_parser) = %u\n", (unsigned int)sizeof(http_parser)); + +#if defined(__i386__) || defined(__x86_64__) + /* Should be 32 on both 32 bits and 64 bits x86 because of struct padding, + * see https://github.com/nodejs/http-parser/issues/507. + */ + assert(sizeof(http_parser) == 32); +#endif + + //// API + test_preserve_data(); + test_parse_url(); + test_method_str(); + test_status_str(); + + //// NREAD + test_header_nread_value(); + + //// OVERFLOW CONDITIONS + test_no_overflow_parse_url(); + + test_header_overflow_error(HTTP_REQUEST); + test_no_overflow_long_body(HTTP_REQUEST, 1000); + test_no_overflow_long_body(HTTP_REQUEST, 100000); + + test_header_overflow_error(HTTP_RESPONSE); + test_no_overflow_long_body(HTTP_RESPONSE, 1000); + test_no_overflow_long_body(HTTP_RESPONSE, 100000); + + test_header_content_length_overflow_error(); + test_chunk_content_length_overflow_error(); + + //// HEADER FIELD CONDITIONS + test_double_content_length_error(HTTP_REQUEST); + test_chunked_content_length_error(HTTP_REQUEST); + test_header_cr_no_lf_error(HTTP_REQUEST); + test_invalid_header_field_token_error(HTTP_REQUEST); + test_invalid_header_field_content_error(HTTP_REQUEST); + test_double_content_length_error(HTTP_RESPONSE); + test_chunked_content_length_error(HTTP_RESPONSE); + test_header_cr_no_lf_error(HTTP_RESPONSE); + test_invalid_header_field_token_error(HTTP_RESPONSE); + test_invalid_header_field_content_error(HTTP_RESPONSE); + + test_simple_type( + "POST / HTTP/1.1\r\n" + "Content-Length:\r\n" // empty + "\r\n", + HPE_INVALID_CONTENT_LENGTH, + HTTP_REQUEST); + + test_simple_type( + "POST / HTTP/1.1\r\n" + "Content-Length: 42 \r\n" // Note the surrounding whitespace. + "\r\n", + HPE_OK, + HTTP_REQUEST); + + test_simple_type( + "POST / HTTP/1.1\r\n" + "Content-Length: 4 2\r\n" + "\r\n", + HPE_INVALID_CONTENT_LENGTH, + HTTP_REQUEST); + + test_simple_type( + "POST / HTTP/1.1\r\n" + "Content-Length: 13 37\r\n" + "\r\n", + HPE_INVALID_CONTENT_LENGTH, + HTTP_REQUEST); + + test_simple_type( + "POST / HTTP/1.1\r\n" + "Content-Length: 42\r\n" + " Hello world!\r\n", + HPE_INVALID_CONTENT_LENGTH, + HTTP_REQUEST); + + test_simple_type( + "POST / HTTP/1.1\r\n" + "Content-Length: 42\r\n" + " \r\n", + HPE_OK, + HTTP_REQUEST); + + //// RESPONSES + + test_simple_type("HTP/1.1 200 OK\r\n\r\n", HPE_INVALID_VERSION, HTTP_RESPONSE); + test_simple_type("HTTP/01.1 200 OK\r\n\r\n", HPE_INVALID_VERSION, HTTP_RESPONSE); + test_simple_type("HTTP/11.1 200 OK\r\n\r\n", HPE_INVALID_VERSION, HTTP_RESPONSE); + test_simple_type("HTTP/1.01 200 OK\r\n\r\n", HPE_INVALID_VERSION, HTTP_RESPONSE); + test_simple_type("HTTP/1.1\t200 OK\r\n\r\n", HPE_INVALID_VERSION, HTTP_RESPONSE); + test_simple_type("\rHTTP/1.1\t200 OK\r\n\r\n", HPE_INVALID_VERSION, HTTP_RESPONSE); + + for (i = 0; i < ARRAY_SIZE(responses); i++) { + test_message(&responses[i]); + } + + for (i = 0; i < ARRAY_SIZE(responses); i++) { + test_message_pause(&responses[i]); + } + + for (i = 0; i < ARRAY_SIZE(responses); i++) { + test_message_connect(&responses[i]); + } + + for (i = 0; i < ARRAY_SIZE(responses); i++) { + if (!responses[i].should_keep_alive) continue; + for (j = 0; j < ARRAY_SIZE(responses); j++) { + if (!responses[j].should_keep_alive) continue; + for (k = 0; k < ARRAY_SIZE(responses); k++) { + test_multiple3(&responses[i], &responses[j], &responses[k]); + } + } + } + + test_message_count_body(&responses[NO_HEADERS_NO_BODY_404]); + test_message_count_body(&responses[TRAILING_SPACE_ON_CHUNKED_BODY]); + + // test very large chunked response + { + char * msg = create_large_chunked_message(31337, + "HTTP/1.0 200 OK\r\n" + "Transfer-Encoding: chunked\r\n" + "Content-Type: text/plain\r\n" + "\r\n"); + struct message large_chunked = + {.name= "large chunked" + ,.type= HTTP_RESPONSE + ,.raw= msg + ,.should_keep_alive= FALSE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 0 + ,.status_code= 200 + ,.response_status= "OK" + ,.content_length= -1 + ,.num_headers= 2 + ,.headers= + { { "Transfer-Encoding", "chunked" } + , { "Content-Type", "text/plain" } + } + ,.body_size= 31337*1024 + ,.num_chunks_complete= 31338 + }; + for (i = 0; i < MAX_CHUNKS; i++) { + large_chunked.chunk_lengths[i] = 1024; + } + test_message_count_body(&large_chunked); + free(msg); + } + + + + printf("response scan 1/2 "); + test_scan( &responses[TRAILING_SPACE_ON_CHUNKED_BODY] + , &responses[NO_BODY_HTTP10_KA_204] + , &responses[NO_REASON_PHRASE] + ); + + printf("response scan 2/2 "); + test_scan( &responses[BONJOUR_MADAME_FR] + , &responses[UNDERSTORE_HEADER_KEY] + , &responses[NO_CARRIAGE_RET] + ); + + puts("responses okay"); + + + /// REQUESTS + + test_simple("GET / IHTTP/1.0\r\n\r\n", HPE_INVALID_CONSTANT); + test_simple("GET / ICE/1.0\r\n\r\n", HPE_INVALID_CONSTANT); + test_simple("GET / HTP/1.1\r\n\r\n", HPE_INVALID_VERSION); + test_simple("GET / HTTP/01.1\r\n\r\n", HPE_INVALID_VERSION); + test_simple("GET / HTTP/11.1\r\n\r\n", HPE_INVALID_VERSION); + test_simple("GET / HTTP/1.01\r\n\r\n", HPE_INVALID_VERSION); + + test_simple("GET / HTTP/1.0\r\nHello: w\1rld\r\n\r\n", HPE_INVALID_HEADER_TOKEN); + test_simple("GET / HTTP/1.0\r\nHello: woooo\2rld\r\n\r\n", HPE_INVALID_HEADER_TOKEN); + + // Extended characters - see nodejs/test/parallel/test-http-headers-obstext.js + test_simple("GET / HTTP/1.1\r\n" + "Test: Düsseldorf\r\n", + HPE_OK); + + // Well-formed but incomplete + test_simple("GET / HTTP/1.1\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: 6\r\n" + "\r\n" + "fooba", + HPE_OK); + + // Unknown Transfer-Encoding in request + test_simple("GET / HTTP/1.1\r\n" + "Transfer-Encoding: unknown\r\n" + "\r\n", + HPE_INVALID_TRANSFER_ENCODING); + + static const char *all_methods[] = { + "DELETE", + "GET", + "HEAD", + "POST", + "PUT", + //"CONNECT", //CONNECT can't be tested like other methods, it's a tunnel + "OPTIONS", + "TRACE", + "COPY", + "LOCK", + "MKCOL", + "MOVE", + "PROPFIND", + "PROPPATCH", + "SEARCH", + "UNLOCK", + "BIND", + "REBIND", + "UNBIND", + "ACL", + "REPORT", + "MKACTIVITY", + "CHECKOUT", + "MERGE", + "M-SEARCH", + "NOTIFY", + "SUBSCRIBE", + "UNSUBSCRIBE", + "PATCH", + "PURGE", + "MKCALENDAR", + "LINK", + "UNLINK", + 0 }; + const char **this_method; + for (this_method = all_methods; *this_method; this_method++) { + char buf[200]; + sprintf(buf, "%s / HTTP/1.1\r\n\r\n", *this_method); + test_simple(buf, HPE_OK); + } + + static const char *bad_methods[] = { + "ASDF", + "C******", + "COLA", + "GEM", + "GETA", + "M****", + "MKCOLA", + "PROPPATCHA", + "PUN", + "PX", + "SA", + "hello world", + 0 }; + for (this_method = bad_methods; *this_method; this_method++) { + char buf[200]; + sprintf(buf, "%s / HTTP/1.1\r\n\r\n", *this_method); + test_simple(buf, HPE_INVALID_METHOD); + } + + // illegal header field name line folding + test_simple("GET / HTTP/1.1\r\n" + "name\r\n" + " : value\r\n" + "\r\n", + HPE_INVALID_HEADER_TOKEN); + + const char *dumbluck2 = + "GET / HTTP/1.1\r\n" + "X-SSL-Nonsense: -----BEGIN CERTIFICATE-----\r\n" + "\tMIIFbTCCBFWgAwIBAgICH4cwDQYJKoZIhvcNAQEFBQAwcDELMAkGA1UEBhMCVUsx\r\n" + "\tETAPBgNVBAoTCGVTY2llbmNlMRIwEAYDVQQLEwlBdXRob3JpdHkxCzAJBgNVBAMT\r\n" + "\tAkNBMS0wKwYJKoZIhvcNAQkBFh5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMu\r\n" + "\tdWswHhcNMDYwNzI3MTQxMzI4WhcNMDcwNzI3MTQxMzI4WjBbMQswCQYDVQQGEwJV\r\n" + "\tSzERMA8GA1UEChMIZVNjaWVuY2UxEzARBgNVBAsTCk1hbmNoZXN0ZXIxCzAJBgNV\r\n" + "\tBAcTmrsogriqMWLAk1DMRcwFQYDVQQDEw5taWNoYWVsIHBhcmQYJKoZIhvcNAQEB\r\n" + "\tBQADggEPADCCAQoCggEBANPEQBgl1IaKdSS1TbhF3hEXSl72G9J+WC/1R64fAcEF\r\n" + "\tW51rEyFYiIeZGx/BVzwXbeBoNUK41OK65sxGuflMo5gLflbwJtHBRIEKAfVVp3YR\r\n" + "\tgW7cMA/s/XKgL1GEC7rQw8lIZT8RApukCGqOVHSi/F1SiFlPDxuDfmdiNzL31+sL\r\n" + "\t0iwHDdNkGjy5pyBSB8Y79dsSJtCW/iaLB0/n8Sj7HgvvZJ7x0fr+RQjYOUUfrePP\r\n" + "\tu2MSpFyf+9BbC/aXgaZuiCvSR+8Snv3xApQY+fULK/xY8h8Ua51iXoQ5jrgu2SqR\r\n" + "\twgA7BUi3G8LFzMBl8FRCDYGUDy7M6QaHXx1ZWIPWNKsCAwEAAaOCAiQwggIgMAwG\r\n" + "\tA1UdEwEB/wQCMAAwEQYJYIZIAYb4QgHTTPAQDAgWgMA4GA1UdDwEB/wQEAwID6DAs\r\n" + "\tBglghkgBhvhCAQ0EHxYdVUsgZS1TY2llbmNlIFVzZXIgQ2VydGlmaWNhdGUwHQYD\r\n" + "\tVR0OBBYEFDTt/sf9PeMaZDHkUIldrDYMNTBZMIGaBgNVHSMEgZIwgY+AFAI4qxGj\r\n" + "\tloCLDdMVKwiljjDastqooXSkcjBwMQswCQYDVQQGEwJVSzERMA8GA1UEChMIZVNj\r\n" + "\taWVuY2UxEjAQBgNVBAsTCUF1dGhvcml0eTELMAkGA1UEAxMCQ0ExLTArBgkqhkiG\r\n" + "\t9w0BCQEWHmNhLW9wZXJhdG9yQGdyaWQtc3VwcG9ydC5hYy51a4IBADApBgNVHRIE\r\n" + "\tIjAggR5jYS1vcGVyYXRvckBncmlkLXN1cHBvcnQuYWMudWswGQYDVR0gBBIwEDAO\r\n" + "\tBgwrBgEEAdkvAQEBAQYwPQYJYIZIAYb4QgEEBDAWLmh0dHA6Ly9jYS5ncmlkLXN1\r\n" + "\tcHBvcnQuYWMudmT4sopwqlBWsvcHViL2NybC9jYWNybC5jcmwwPQYJYIZIAYb4QgEDBDAWLmh0\r\n" + "\tdHA6Ly9jYS5ncmlkLXN1cHBvcnQuYWMudWsvcHViL2NybC9jYWNybC5jcmwwPwYD\r\n" + "\tVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NhLmdyaWQt5hYy51ay9wdWIv\r\n" + "\tY3JsL2NhY3JsLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAS/U4iiooBENGW/Hwmmd3\r\n" + "\tXCy6Zrt08YjKCzGNjorT98g8uGsqYjSxv/hmi0qlnlHs+k/3Iobc3LjS5AMYr5L8\r\n" + "\tUO7OSkgFFlLHQyC9JzPfmLCAugvzEbyv4Olnsr8hbxF1MbKZoQxUZtMVu29wjfXk\r\n" + "\thTeApBv7eaKCWpSp7MCbvgzm74izKhu3vlDk9w6qVrxePfGgpKPqfHiOoGhFnbTK\r\n" + "\twTC6o2xq5y0qZ03JonF7OJspEd3I5zKY3E+ov7/ZhW6DqT8UFvsAdjvQbXyhV8Eu\r\n" + "\tYhixw1aKEPzNjNowuIseVogKOLXxWI5vAi5HgXdS0/ES5gDGsABo4fqovUKlgop3\r\n" + "\tRA==\r\n" + "\t-----END CERTIFICATE-----\r\n" + "\r\n"; + test_simple(dumbluck2, HPE_OK); + + const char *corrupted_connection = + "GET / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "Connection\r\033\065\325eep-Alive\r\n" + "Accept-Encoding: gzip\r\n" + "\r\n"; + test_simple(corrupted_connection, HPE_INVALID_HEADER_TOKEN); + + const char *corrupted_header_name = + "GET / HTTP/1.1\r\n" + "Host: www.example.com\r\n" + "X-Some-Header\r\033\065\325eep-Alive\r\n" + "Accept-Encoding: gzip\r\n" + "\r\n"; + test_simple(corrupted_header_name, HPE_INVALID_HEADER_TOKEN); + +#if 0 + // NOTE(Wed Nov 18 11:57:27 CET 2009) this seems okay. we just read body + // until EOF. + // + // no content-length + // error if there is a body without content length + const char *bad_get_no_headers_no_body = "GET /bad_get_no_headers_no_body/world HTTP/1.1\r\n" + "Accept: */*\r\n" + "\r\n" + "HELLO"; + test_simple(bad_get_no_headers_no_body, 0); +#endif + /* TODO sending junk and large headers gets rejected */ + + + /* check to make sure our predefined requests are okay */ + for (i = 0; i < ARRAY_SIZE(requests); i++) { + test_message(&requests[i]); + } + + for (i = 0; i < ARRAY_SIZE(requests); i++) { + test_message_pause(&requests[i]); + } + + for (i = 0; i < ARRAY_SIZE(requests); i++) { + if (!requests[i].should_keep_alive) continue; + for (j = 0; j < ARRAY_SIZE(requests); j++) { + if (!requests[j].should_keep_alive) continue; + for (k = 0; k < ARRAY_SIZE(requests); k++) { + test_multiple3(&requests[i], &requests[j], &requests[k]); + } + } + } + + printf("request scan 1/4 "); + test_scan( &requests[GET_NO_HEADERS_NO_BODY] + , &requests[GET_ONE_HEADER_NO_BODY] + , &requests[GET_NO_HEADERS_NO_BODY] + ); + + printf("request scan 2/4 "); + test_scan( &requests[POST_CHUNKED_ALL_YOUR_BASE] + , &requests[POST_IDENTITY_BODY_WORLD] + , &requests[GET_FUNKY_CONTENT_LENGTH] + ); + + printf("request scan 3/4 "); + test_scan( &requests[TWO_CHUNKS_MULT_ZERO_END] + , &requests[CHUNKED_W_TRAILING_HEADERS] + , &requests[CHUNKED_W_NONSENSE_AFTER_LENGTH] + ); + + printf("request scan 4/4 "); + test_scan( &requests[QUERY_URL_WITH_QUESTION_MARK_GET] + , &requests[PREFIX_NEWLINE_GET ] + , &requests[CONNECT_REQUEST] + ); + + puts("requests okay"); + + return 0; +} diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http_parser_compat_test.c b/deps/ngtcp2/ngtcp2/third-party/urlparse/http_parser_compat_test.c new file mode 100644 index 000000000000..f39cf7630a61 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http_parser_compat_test.c @@ -0,0 +1,689 @@ +/* + * urlparse + * + * Copyright (c) 2024 urlparse contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "http_parser_compat_test.h" + +#include +#include +#include + +#include "urlparse.h" + +static const MunitTest tests[] = { + munit_void_test(test_http_parser_compat), + munit_test_end(), +}; + +const MunitSuite http_parser_compat_suite = { + "/http_parser_compat", tests, NULL, 1, MUNIT_SUITE_OPTION_NONE, +}; + +/* Copied from + https://github.com/nodejs/http-parser/blob/ec8b5ee63f0e51191ea43bb0c6eac7bfbff3141d/test.c + */ + +struct url_test { + const char *name; + const char *url; + int is_connect; + urlparse_url u; + int rv; +}; + +static const struct url_test url_tests[] = + { + { + .name = "proxy request", + .url = "http://hostname/", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PATH), + .port = 0, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {7, 8} /* URLPARSE_HOST */, + {0, 0} /* URLPARSE_PORT */, + {15, 1} /* URLPARSE_PATH */, + {0, 0} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "proxy request with port", + .url = "http://hostname:444/", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PORT) | (1 << URLPARSE_PATH), + .port = 444, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {7, 8} /* URLPARSE_HOST */, + {16, 3} /* URLPARSE_PORT */, + {19, 1} /* URLPARSE_PATH */, + {0, 0} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "CONNECT request", + .url = "hostname:443", + .is_connect = 1, + .u = + { + .field_set = (1 << URLPARSE_HOST) | (1 << URLPARSE_PORT), + .port = 443, + .field_data = + { + {0, 0} /* URLPARSE_SCHEMA */, + {0, 8} /* URLPARSE_HOST */, + {9, 3} /* URLPARSE_PORT */, + {0, 0} /* URLPARSE_PATH */, + {0, 0} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "CONNECT request but not connect", + .url = "hostname:443", + .is_connect = 0, + .rv = URLPARSE_ERR_PARSE, + }, + { + .name = "proxy ipv6 request", + .url = "http://[1:2::3:4]/", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PATH), + .port = 0, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {8, 8} /* URLPARSE_HOST */, + {0, 0} /* URLPARSE_PORT */, + {17, 1} /* URLPARSE_PATH */, + {0, 0} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "proxy ipv6 request with port", + .url = "http://[1:2::3:4]:67/", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PORT) | (1 << URLPARSE_PATH), + .port = 67, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {8, 8} /* URLPARSE_HOST */, + {18, 2} /* URLPARSE_PORT */, + {20, 1} /* URLPARSE_PATH */, + {0, 0} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "CONNECT ipv6 address", + .url = "[1:2::3:4]:443", + .is_connect = 1, + .u = + { + .field_set = (1 << URLPARSE_HOST) | (1 << URLPARSE_PORT), + .port = 443, + .field_data = + { + {0, 0} /* URLPARSE_SCHEMA */, + {1, 8} /* URLPARSE_HOST */, + {11, 3} /* URLPARSE_PORT */, + {0, 0} /* URLPARSE_PATH */, + {0, 0} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "ipv4 in ipv6 address", + .url = "http://[2001:0000:0000:0000:0000:0000:1.9.1.1]/", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PATH), + .port = 0, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {8, 37} /* URLPARSE_HOST */, + {0, 0} /* URLPARSE_PORT */, + {46, 1} /* URLPARSE_PATH */, + {0, 0} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "extra ? in query string", + .url = "http://a.tbcdn.cn/p/fp/2010c/??fp-header-min.css,fp-base-min.css," + "fp-channel-min.css,fp-product-min.css,fp-mall-min.css,fp-" + "category-min.css," + "fp-sub-min.css,fp-gdp4p-min.css,fp-css3-min.css,fp-misc-min.css?" + "t=20101022.css", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PATH) | (1 << URLPARSE_QUERY), + .port = 0, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {7, 10} /* URLPARSE_HOST */, + {0, 0} /* URLPARSE_PORT */, + {17, 12} /* URLPARSE_PATH */, + {30, 187} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "space URL encoded", + .url = "/toto.html?toto=a%20b", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_PATH) | (1 << URLPARSE_QUERY), + .port = 0, + .field_data = + { + {0, 0} /* URLPARSE_SCHEMA */, + {0, 0} /* URLPARSE_HOST */, + {0, 0} /* URLPARSE_PORT */, + {0, 10} /* URLPARSE_PATH */, + {11, 10} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "URL fragment", + .url = "/toto.html#titi", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_PATH) | (1 << URLPARSE_FRAGMENT), + .port = 0, + .field_data = + { + {0, 0} /* URLPARSE_SCHEMA */, + {0, 0} /* URLPARSE_HOST */, + {0, 0} /* URLPARSE_PORT */, + {0, 10} /* URLPARSE_PATH */, + {0, 0} /* URLPARSE_QUERY */, + {11, 4} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "complex URL fragment", + .url = "http://www.webmasterworld.com/r.cgi?f=21&d=8405&url=" + "http://www.example.com/index.html?foo=bar&hello=world#midpage", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PATH) | (1 << URLPARSE_QUERY) | + (1 << URLPARSE_FRAGMENT), + .port = 0, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {7, 22} /* URLPARSE_HOST */, + {0, 0} /* URLPARSE_PORT */, + {29, 6} /* URLPARSE_PATH */, + {36, 69} /* URLPARSE_QUERY */, + {106, 7} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "complex URL from node js url parser doc", + .url = "http://host.com:8080/p/a/t/h?query=string#hash", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PORT) | (1 << URLPARSE_PATH) | + (1 << URLPARSE_QUERY) | (1 << URLPARSE_FRAGMENT), + .port = 8080, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {7, 8} /* URLPARSE_HOST */, + {16, 4} /* URLPARSE_PORT */, + {20, 8} /* URLPARSE_PATH */, + {29, 12} /* URLPARSE_QUERY */, + {42, 4} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "complex URL with basic auth from node js url parser doc", + .url = "http://a:b@host.com:8080/p/a/t/h?query=string#hash", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PORT) | (1 << URLPARSE_PATH) | + (1 << URLPARSE_QUERY) | (1 << URLPARSE_FRAGMENT) | + (1 << URLPARSE_USERINFO), + .port = 8080, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {11, 8} /* URLPARSE_HOST */, + {20, 4} /* URLPARSE_PORT */, + {24, 8} /* URLPARSE_PATH */, + {33, 12} /* URLPARSE_QUERY */, + {46, 4} /* URLPARSE_FRAGMENT */, + {7, 3} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "double @", + .url = "http://a:b@@hostname:443/", + .is_connect = 0, + .rv = URLPARSE_ERR_PARSE, + }, + { + .name = "proxy empty host", + .url = "http://:443/", + .is_connect = 0, + .rv = URLPARSE_ERR_PARSE, + }, + { + .name = "proxy empty port", + .url = "http://hostname:/", + .is_connect = 0, + .rv = URLPARSE_ERR_PARSE, + }, + { + .name = "CONNECT with basic auth", + .url = "a:b@hostname:443", + .is_connect = 1, + .rv = URLPARSE_ERR_PARSE, + }, + { + .name = "CONNECT empty host", + .url = ":443", + .is_connect = 1, + .rv = URLPARSE_ERR_PARSE, + }, + { + .name = "CONNECT empty port", + .url = "hostname:", + .is_connect = 1, + .rv = URLPARSE_ERR_PARSE, + }, + { + .name = "CONNECT with extra bits", + .url = "hostname:443/", + .is_connect = 1, + .rv = URLPARSE_ERR_PARSE, + }, + { + .name = "space in URL", + .url = "/foo bar/", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "proxy basic auth with space url encoded", + .url = "http://a%20:b@host.com/", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PATH) | (1 << URLPARSE_USERINFO), + .port = 0, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {14, 8} /* URLPARSE_HOST */, + {0, 0} /* URLPARSE_PORT */, + {22, 1} /* URLPARSE_PATH */, + {0, 0} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {7, 6} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "carriage return in URL", + .url = "/foo\rbar/", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "proxy double : in URL", + .url = "http://hostname::443/", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "proxy basic auth with double :", + .url = "http://a::b@host.com/", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PATH) | (1 << URLPARSE_USERINFO), + .port = 0, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {12, 8} /* URLPARSE_HOST */, + {0, 0} /* URLPARSE_PORT */, + {20, 1} /* URLPARSE_PATH */, + {0, 0} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {7, 4} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "line feed in URL", + .url = "/foo\nbar/", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "proxy empty basic auth", + .url = "http://@hostname/fo", + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PATH), + .port = 0, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {8, 8} /* URLPARSE_HOST */, + {0, 0} /* URLPARSE_PORT */, + {16, 3} /* URLPARSE_PATH */, + {0, 0} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "proxy line feed in hostname", + .url = "http://host\name/fo", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "proxy % in hostname", + .url = "http://host%name/fo", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "proxy ; in hostname", + .url = "http://host;ame/fo", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "proxy basic auth with unreservedchars", + .url = "http://a!;-_!=+$@host.com/", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PATH) | (1 << URLPARSE_USERINFO), + .port = 0, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {17, 8} /* URLPARSE_HOST */, + {0, 0} /* URLPARSE_PORT */, + {25, 1} /* URLPARSE_PATH */, + {0, 0} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {7, 9} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "proxy only empty basic auth", + .url = "http://@/fo", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "proxy only basic auth", + .url = "http://toto@/fo", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "proxy emtpy hostname", + .url = "http:///fo", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "proxy = in URL", + .url = "http://host=ame/fo", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "ipv6 address with Zone ID", + .url = "http://[fe80::a%25eth0]/", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PATH), + .port = 0, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {8, 14} /* URLPARSE_HOST */, + {0, 0} /* URLPARSE_PORT */, + {23, 1} /* URLPARSE_PATH */, + {0, 0} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "ipv6 address with Zone ID, but '%' is not percent-encoded", + .url = "http://[fe80::a%eth0]/", + .is_connect = 0, + .u = + { + .field_set = (1 << URLPARSE_SCHEMA) | (1 << URLPARSE_HOST) | + (1 << URLPARSE_PATH), + .port = 0, + .field_data = + { + {0, 4} /* URLPARSE_SCHEMA */, + {8, 12} /* URLPARSE_HOST */, + {0, 0} /* URLPARSE_PORT */, + {21, 1} /* URLPARSE_PATH */, + {0, 0} /* URLPARSE_QUERY */, + {0, 0} /* URLPARSE_FRAGMENT */, + {0, 0} /* URLPARSE_USERINFO */, + }, + }, + .rv = 0, + }, + { + .name = "ipv6 address ending with '%'", + .url = "http://[fe80::a%]/", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "ipv6 address with Zone ID including bad character", + .url = "http://[fe80::a%$HOME]/", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "just ipv6 Zone ID", + .url = "http://[%eth0]/", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "empty url", + .url = "", + .is_connect = 0, + .rv = URLPARSE_ERR_PARSE, + }, + { + .name = "NULL url", + .url = NULL, + .is_connect = 0, + .rv = URLPARSE_ERR_PARSE, + }, + { + .name = "full of spaces url", + .url = " ", + .is_connect = 0, + .rv = URLPARSE_ERR_PARSE, + }, + { + .name = "tab in URL", + .url = "/foo\tbar/", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, + { + .name = "form feed in URL", + .url = "/foo\fbar/", + .rv = URLPARSE_ERR_PARSE /* s_dead */, + }, +}; + +static void dump_url(const char *url, const urlparse_url *u) { + size_t i; + + fprintf(stderr, "\tfield_set: 0x%x, port: %u\n", u->field_set, u->port); + for (i = 0; i < URLPARSE_MAX; i++) { + if ((u->field_set & (1 << i)) == 0) { + fprintf(stderr, "\tfield_data[%zu]: unset\n", i); + continue; + } + + fprintf(stderr, "\tfield_data[%zu]: off: %u len: %u part: \"%.*s\"\n", i, + u->field_data[i].off, u->field_data[i].len, u->field_data[i].len, + url + u->field_data[i].off); + } +} + +void test_http_parser_compat(void) { + urlparse_url u; + const struct url_test *test; + size_t i; + int rv; + + for (i = 0; i < (sizeof(url_tests) / sizeof(url_tests[0])); ++i) { + test = &url_tests[i]; + memset(&u, 0, sizeof(u)); + + rv = urlparse_parse_url(test->url, test->url ? strlen(test->url) : 0, + test->is_connect, &u); + + if (test->rv == 0) { + if (rv != 0) { + fprintf(stderr, + "\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " + "unexpected rv %d ***\n\n", + test->url, test->name, rv); + + assert_int(0, ==, rv); + } + + if (memcmp(&u, &test->u, sizeof(u)) != 0) { + fprintf(stderr, + "\n*** http_parser_parse_url(\"%s\") \"%s\" failed ***\n", + test->url, test->name); + + fprintf(stderr, "target http_parser_url:\n"); + dump_url(test->url, &test->u); + fprintf(stderr, "result http_parser_url:\n"); + dump_url(test->url, &u); + + assert_memory_equal(sizeof(u), &test->u, &u); + } + } else { + /* test->rv != 0 */ + if (rv == 0) { + fprintf(stderr, + "\n*** http_parser_parse_url(\"%s\") \"%s\" test failed, " + "unexpected rv %d ***\n\n", + test->url, test->name, rv); + + assert_int(test->rv, ==, rv); + } + } + } +} diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/http_parser_compat_test.h b/deps/ngtcp2/ngtcp2/third-party/urlparse/http_parser_compat_test.h new file mode 100644 index 000000000000..f97f5593928c --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/http_parser_compat_test.h @@ -0,0 +1,36 @@ +/* + * urlparse + * + * Copyright (c) 2024 urlparse contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef HTTP_PARSER_COMPAT_TEST_H +#define HTTP_PARSER_COMPAT_TEST_H + +#define MUNIT_ENABLE_ASSERT_ALIASES + +#include "munit.h" + +extern const MunitSuite http_parser_compat_suite; + +munit_void_test_decl(test_http_parser_compat) + +#endif /* !defined(HTTP_PARSER_COMPAT_TEST_H) */ diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/.appveyor.yml b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/.appveyor.yml new file mode 100644 index 000000000000..55720926e46a --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/.appveyor.yml @@ -0,0 +1,34 @@ +version: "{build}" + +environment: + matrix: + - ARCHITECTURE: x64 + MSVC_VER: 14 + - ARCHITECTURE: x86 + MSVC_VER: 14 + - ARCHITECTURE: x64 + MSVC_VER: 12 + - ARCHITECTURE: x86 + MSVC_VER: 12 + - ARCHITECTURE: x86 + MSVC_VER: 11 + - ARCHITECTURE: x86 + MSVC_VER: 10 + - ARCHITECTURE: x86 + MSVC_VER: 9 + +branches: + except: + - master + - /^(wip\/)?(travis|osx|mingw|ipp)(\-.+)?$/ + +configuration: Debug + +install: + +before_build: + - call "C:\Program Files (x86)\Microsoft Visual Studio %MSVC_VER%.0\VC\vcvarsall.bat" %ARCHITECTURE% + +build_script: cl.exe /W4 /WX /Feexample munit.c example.c + +test_script: example.exe --color always diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/.clang-format b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/.clang-format new file mode 100644 index 000000000000..0604933b9738 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/.clang-format @@ -0,0 +1,245 @@ +--- +Language: Cpp +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignArrayOfStructures: None +AlignConsecutiveAssignments: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveBitFields: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveDeclarations: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveMacros: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveShortCaseStatements: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCaseColons: false +AlignEscapedNewlines: Right +AlignOperands: Align +AlignTrailingComments: + Kind: Always + OverEmptyLines: 0 +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowBreakBeforeNoexceptSpecifier: Never +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortCompoundRequirementOnASingleLine: true +AllowShortEnumsOnASingleLine: true +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +AttributeMacros: + - __capability +BinPackArguments: true +BinPackParameters: true +BitFieldColonSpacing: Both +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterExternBlock: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakAdjacentStringLiterals: true +BreakAfterAttributes: Leave +BreakAfterJavaFieldAnnotations: false +BreakArrays: true +BreakBeforeBinaryOperators: None +BreakBeforeConceptDeclarations: Always +BreakBeforeBraces: Attach +BreakBeforeInlineASMColon: OnlyMultiline +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeColon +BreakInheritanceList: BeforeColon +BreakStringLiterals: true +ColumnLimit: 80 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerIndentWidth: 2 +ContinuationIndentWidth: 2 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseBlocks: false +IndentCaseLabels: false +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true +IndentPPDirectives: AfterHash +IndentRequiresClause: false +IndentWidth: 2 +IndentWrappedFunctionNames: false +InsertBraces: false +InsertNewlineAtEOF: false +InsertTrailingCommas: None +IntegerLiteralSeparator: + Binary: 0 + BinaryMinDigits: 0 + Decimal: 0 + DecimalMinDigits: 0 + Hex: 0 + HexMinDigits: 0 +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: false +KeepEmptyLinesAtEOF: false +LambdaBodyIndentation: Signature +LineEnding: DeriveLF +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PackConstructorInitializers: NextLine +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakScopeResolution: 500 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyIndentedWhitespace: 0 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Right +PPIndentWidth: -1 +QualifierAlignment: Leave +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: false +RemoveParentheses: Leave +RemoveSemicolon: false +RequiresClausePosition: OwnLine +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SkipMacroDefinitionBody: false +SortIncludes: Never +SortJavaStaticImport: Before +SortUsingDeclarations: LexicographicNumeric +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceAroundPointerQualifiers: Default +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeJsonColon: false +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + AfterPlacementOperator: true + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParens: Never +SpacesInParensOptions: + InCStyleCasts: false + InConditionalStatements: false + InEmptyParentheses: false + Other: false +SpacesInSquareBrackets: false +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 8 +UseTab: Never +VerilogBreakBetweenInstancePorts: true +WhitespaceSensitiveMacros: + - STRINGIZE + - PP_STRINGIZE + - BOOST_PP_STRINGIZE + - NS_SWIFT_NAME + - CF_SWIFT_NAME +... + diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/.dir-locals.el b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/.dir-locals.el new file mode 100644 index 000000000000..4cc5d8496910 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/.dir-locals.el @@ -0,0 +1,2 @@ +((nil . ((indent-tabs-mode . nil) + (c-basic-offset . 2)))) diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/.travis.yml b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/.travis.yml new file mode 100644 index 000000000000..6f221a8ba00a --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/.travis.yml @@ -0,0 +1,149 @@ +language: c +sudo: false +dist: trusty +branches: + except: + - /^(wip\/)?(appveyor|msvc|mingw|windows)(\-.+)?$/ + # https://github.com/travis-ci/travis-ci/issues/6632 + # - /^master$/ +matrix: + include: + ### + ## Linux builds using various versions of GCC. + ### + - env: C_COMPILER=gcc-6 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-6 + - g++-6 + - env: C_COMPILER=gcc-5 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-5 + - g++-5 + # - env: C_COMPILER=gcc-4.9 + # addons: + # apt: + # sources: + # - ubuntu-toolchain-r-test + # packages: + # - gcc-4.9 + # - g++-4.9 + - env: C_COMPILER=gcc-4.8 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-4.8 + - g++-4.8 + # - env: C_COMPILER=gcc-4.7 + # addons: + # apt: + # sources: + # - ubuntu-toolchain-r-test + # packages: + # - gcc-4.7 + # - g++-4.7 + - env: C_COMPILER=gcc-4.6 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-4.6 + - g++-4.6 + # - os: linux + # env: C_COMPILER=gcc-4.5 + # addons: + # apt: + # sources: + # - ubuntu-toolchain-r-test + # packages: + # - gcc-4.5 + # - g++-4.5 + - env: C_COMPILER=gcc-4.4 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-4.4 + - g++-4.4 + + ### + ## clang on Linux + ### + - env: C_COMPILER=clang-3.9 + addons: + apt: + sources: + - llvm-toolchain-precise-3.9 + - ubuntu-toolchain-r-test + packages: + - clang-3.9 + # - env: C_COMPILER=clang-3.8 + # addons: + # apt: + # sources: + # - llvm-toolchain-precise-3.8 + # - ubuntu-toolchain-r-test + # packages: + # - clang-3.8 + - env: C_COMPILER=clang-3.7 + addons: + apt: + sources: + - llvm-toolchain-precise-3.7 + - ubuntu-toolchain-r-test + packages: + - clang-3.7 + # - env: C_COMPILER=clang-3.6 + # addons: + # apt: + # sources: + # - llvm-toolchain-precise-3.6 + # - ubuntu-toolchain-r-test + # packages: + # - clang-3.6 + - env: C_COMPILER=clang-3.5 + addons: + apt: + sources: + - llvm-toolchain-precise-3.5 + - ubuntu-toolchain-r-test + packages: + - clang-3.5 + + ### + ## PGI + ### + - env: C_COMPILER=pgcc OPENMP=y + + ### + ## OS X + ### + - os: osx + + ### + ## Meson + ### + - env: BUILD_SYSTEM=meson + +before_install: +- if [ -n "${C_COMPILER}" ]; then export CC="${C_COMPILER}"; fi +- if [ "${C_COMPILER}" = "pgcc" ]; then wget -q -O /dev/stdout 'https://raw.githubusercontent.com/nemequ/pgi-travis/master/install-pgi.sh' | /bin/sh; fi +- if [ "${BUILD_SYSTEM}" = "meson" ]; then wget -O /tmp/ninja-linux.zip $(curl -s https://api.github.com/repos/ninja-build/ninja/releases/latest | grep -oP 'https://github.com/ninja-build/ninja/releases/download/v[0-9\.]+/ninja-linux.zip') && unzip -q /tmp/ninja-linux.zip -d ~/bin && pyenv local 3.6 && pip3 install meson; fi + +script: + - if [ "${BUILD_SYSTEM}" = "meson" ]; then meson build && ninja -Cbuild; else make CC="${CC}" AGGRESSIVE_WARNINGS=y EXTENSION="${EXTENSION}" OPENMP="${OPENMP}" ASAN="${ASAN}" UBSAN="${UBSAN}"; fi + - if [ "${BUILD_SYSTEM}" = "meson" ]; then ninja -Cbuild test; else make test; fi + +notifications: + email: false diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/COPYING b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/COPYING new file mode 100644 index 000000000000..2991ac706dd3 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/COPYING @@ -0,0 +1,21 @@ +µnit Testing Framework +Copyright (c) 2013-2016 Evan Nemerson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/README.md b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/README.md new file mode 100644 index 000000000000..9f861f2a1d90 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/README.md @@ -0,0 +1,54 @@ +# µnit + +µnit is a small but full-featured unit testing framework for C. It has +no dependencies (beyond libc), is permissively licensed (MIT), and is +easy to include into any project. + +For more information, see +[the µnit web site](https://nemequ.github.io/munit). + +[![Build status](https://travis-ci.org/nemequ/munit.svg?branch=master)](https://travis-ci.org/nemequ/munit) +[![Windows build status](https://ci.appveyor.com/api/projects/status/db515g5ifcwjohq7/branch/master?svg=true)](https://ci.appveyor.com/project/quixdb/munit/branch/master) + +## Features + +Features µnit currently includes include: + + * Handy assertion macros which make for nice error messages. + * Reproducible cross-platform random number generation, including + support for supplying a seed via CLI. + * Timing of both wall-clock and CPU time. + * Parameterized tests. + * Nested test suites. + * Flexible CLI. + * Forking + ([except on Windows](https://github.com/nemequ/munit/issues/2)). + * Hiding output of successful tests. + +Features µnit does not currently include, but some day may include +(a.k.a., if you file a PR…), include: + + * [TAP](http://testanything.org/) support; feel free to discuss in + [issue #1](https://github.com/nemequ/munit/issues/1) + +### Include into your project with meson + +In your `subprojects` folder put a `munit.wrap` file containing: + +``` +[wrap-git] +directory=munit +url=https://github.com/nemequ/munit/ +revision=head +``` + +Then you can use a subproject fallback when you include munit as a +dependency to your project: `dependency('munit', fallback: ['munit', 'munit_dep'])` + +## Documentation + +See [the µnit web site](https://nemequ.github.io/munit). + +Additionally, there is a heavily-commented +[example.c](https://github.com/nemequ/munit/blob/master/example.c) in +the repository. diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/example.c b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/example.c new file mode 100644 index 000000000000..8a2bf1d36bd5 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/example.c @@ -0,0 +1,341 @@ +/* Example file for using µnit. + * + * µnit is MIT-licensed, but for this file and this file alone: + * + * To the extent possible under law, the author(s) of this file have + * waived all copyright and related or neighboring rights to this + * work. See for + * details. + *********************************************************************/ + +#include "munit.h" + +/* This is just to disable an MSVC warning about conditional + * expressions being constant, which you shouldn't have to do for your + * code. It's only here because we want to be able to do silly things + * like assert that 0 != 1 for our demo. */ +#if defined(_MSC_VER) +# pragma warning(disable : 4127) +#endif + +/* Tests are functions that return void, and take a single void* + * parameter. We'll get to what that parameter is later. */ +static MunitResult test_compare(const MunitParameter params[], void *data) { + /* We'll use these later */ + const unsigned char val_uchar = 'b'; + const short val_short = 1729; + double pi = 3.141592654; + char *stewardesses = "stewardesses"; + char *most_fun_word_to_type; + + /* These are just to silence compiler warnings about the parameters + * being unused. */ + (void)params; + (void)data; + + /* Let's start with the basics. */ + munit_assert(0 != 1); + + /* There is also the more verbose, though slightly more descriptive + munit_assert_true/false: */ + munit_assert_false(0); + + /* You can also call munit_error and munit_errorf yourself. We + * won't do it is used to indicate a failure, but here is what it + * would look like: */ + /* munit_error("FAIL"); */ + /* munit_errorf("Goodbye, cruel %s", "world"); */ + + /* There are macros for comparing lots of types. */ + munit_assert_char('a', ==, 'a'); + + /* Sure, you could just assert('a' == 'a'), but if you did that, a + * failed assertion would just say something like "assertion failed: + * val_uchar == 'b'". µnit will tell you the actual values, so a + * failure here would result in something like "assertion failed: + * val_uchar == 'b' ('X' == 'b')." */ + munit_assert_uchar(val_uchar, ==, 'b'); + + /* Obviously we can handle values larger than 'char' and 'uchar'. + * There are versions for char, short, int, long, long long, + * int8/16/32/64_t, as well as the unsigned versions of them all. */ + munit_assert_short(42, <, val_short); + + /* There is also support for size_t. + * + * The longest word in English without repeating any letters is + * "uncopyrightables", which has uncopyrightable (and + * dermatoglyphics, which is the study of fingerprints) beat by a + * character */ + munit_assert_size(strlen("uncopyrightables"), >, strlen("dermatoglyphics")); + + /* Of course there is also support for doubles and floats. */ + munit_assert_double(pi, ==, 3.141592654); + + /* If you want to compare two doubles for equality, you might want + * to consider using munit_assert_double_equal. It compares two + * doubles for equality within a precison of 1.0 x 10^-(precision). + * Note that precision (the third argument to the macro) needs to be + * fully evaluated to an integer by the preprocessor so µnit doesn't + * have to depend pow, which is often in libm not libc. */ + munit_assert_double_equal(3.141592654, 3.141592653589793, 9); + + /* And if you want to check strings for equality (or inequality), + * there is munit_assert_string_equal/not_equal. + * + * "stewardesses" is the longest word you can type on a QWERTY + * keyboard with only one hand, which makes it loads of fun to type. + * If I'm going to have to type a string repeatedly, let's make it a + * good one! */ + munit_assert_string_equal(stewardesses, "stewardesses"); + + /* A personal favorite macro which is fantastic if you're working + * with binary data, is the one which naïvely checks two blobs of + * memory for equality. If this fails it will tell you the offset + * of the first differing byte. */ + munit_assert_memory_equal(7, stewardesses, "steward"); + + /* You can also make sure that two blobs differ *somewhere*: */ + munit_assert_memory_not_equal(8, stewardesses, "steward"); + + /* There are equal/not_equal macros for pointers, too: */ + most_fun_word_to_type = stewardesses; + munit_assert_ptr_equal(most_fun_word_to_type, stewardesses); + + /* And null/not_null */ + munit_assert_null(NULL); + munit_assert_not_null(most_fun_word_to_type); + + /* Lets verify that the data parameter is what we expected. We'll + * see where this comes from in a bit. + * + * Note that the casting isn't usually required; if you give this + * function a real pointer (instead of a number like 0xdeadbeef) it + * would work as expected. */ + munit_assert_ptr_equal(data, (void *)(uintptr_t)0xdeadbeef); + + return MUNIT_OK; +} + +static MunitResult test_rand(const MunitParameter params[], void *user_data) { + int random_int; + double random_dbl; + munit_uint8_t data[5]; + + (void)params; + (void)user_data; + + /* One thing missing from a lot of unit testing frameworks is a + * random number generator. You can't just use srand/rand because + * the implementation varies across different platforms, and it's + * important to be able to look at the seed used in a failing test + * to see if you can reproduce it. Some randomness is a fantastic + * thing to have in your tests, I don't know why more people don't + * do it... + * + * µnit's PRNG is re-seeded with the same value for each iteration + * of each test. The seed is retrieved from the MUNIT_SEED + * envirnment variable or, if none is provided, one will be + * (pseudo-)randomly generated. */ + + /* If you need an integer in a given range */ + random_int = munit_rand_int_range(128, 4096); + munit_assert_int(random_int, >=, 128); + munit_assert_int(random_int, <=, 4096); + + /* Or maybe you want a double, between 0 and 1: */ + random_dbl = munit_rand_double(); + munit_assert_double(random_dbl, >=, 0.0); + munit_assert_double(random_dbl, <=, 1.0); + + /* Of course, you want to be able to reproduce bugs discovered + * during testing, so every time the tests are run they print the + * random seed used. When you want to reproduce a result, just put + * that random seed in the MUNIT_SEED environment variable; it even + * works on different platforms. + * + * If you want this to pass, use 0xdeadbeef as the random seed and + * uncomment the next line of code. Note that the PRNG is not + * re-seeded between iterations of the same test, so this will only + * work on the first iteration. */ + /* munit_assert_uint32(munit_rand_uint32(), ==, 1306447409); */ + + /* You can also get blobs of random memory: */ + munit_rand_memory(sizeof(data), data); + + return MUNIT_OK; +} + +/* This test case shows how to accept parameters. We'll see how to + * specify them soon. + * + * By default, every possible variation of a parameterized test is + * run, but you can specify parameters manually if you want to only + * run specific test(s), or you can pass the --single argument to the + * CLI to have the harness simply choose one variation at random + * instead of running them all. */ +static MunitResult test_parameters(const MunitParameter params[], + void *user_data) { + const char *foo; + const char *bar; + + (void)user_data; + + /* The "foo" parameter is specified as one of the following values: + * "one", "two", or "three". */ + foo = munit_parameters_get(params, "foo"); + /* Similarly, "bar" is one of "four", "five", or "six". */ + bar = munit_parameters_get(params, "bar"); + /* "baz" is a bit more complicated. We don't actually specify a + * list of valid values, so by default NULL is passed. However, the + * CLI will accept any value. This is a good way to have a value + * that is usually selected randomly by the test, but can be + * overridden on the command line if desired. */ + /* const char* baz = munit_parameters_get(params, "baz"); */ + + /* Notice that we're returning MUNIT_FAIL instead of writing an + * error message. Error messages are generally preferable, since + * they make it easier to diagnose the issue, but this is an + * option. + * + * Possible values are: + * - MUNIT_OK: Sucess + * - MUNIT_FAIL: Failure + * - MUNIT_SKIP: The test was skipped; usually this happens when a + * particular feature isn't in use. For example, if you're + * writing a test which uses a Wayland-only feature, but your + * application is running on X11. + * - MUNIT_ERROR: The test failed, but not because of anything you + * wanted to test. For example, maybe your test downloads a + * remote resource and tries to parse it, but the network was + * down. + */ + + if (strcmp(foo, "one") != 0 && strcmp(foo, "two") != 0 && + strcmp(foo, "three") != 0) + return MUNIT_FAIL; + + if (strcmp(bar, "red") != 0 && strcmp(bar, "green") != 0 && + strcmp(bar, "blue") != 0) + return MUNIT_FAIL; + + return MUNIT_OK; +} + +/* The setup function, if you provide one, for a test will be run + * before the test, and the return value will be passed as the sole + * parameter to the test function. */ +static void *test_compare_setup(const MunitParameter params[], + void *user_data) { + (void)params; + + munit_assert_string_equal(user_data, "µnit"); + return (void *)(uintptr_t)0xdeadbeef; +} + +/* To clean up after a test, you can use a tear down function. The + * fixture argument is the value returned by the setup function + * above. */ +static void test_compare_tear_down(void *fixture) { + munit_assert_ptr_equal(fixture, (void *)(uintptr_t)0xdeadbeef); +} + +static char *foo_params[] = {(char *)"one", (char *)"two", (char *)"three", + NULL}; + +static char *bar_params[] = {(char *)"red", (char *)"green", (char *)"blue", + NULL}; + +static MunitParameterEnum test_params[] = { + {(char *)"foo", foo_params}, + {(char *)"bar", bar_params}, + {(char *)"baz", NULL}, + {NULL, NULL}, +}; + +/* Creating a test suite is pretty simple. First, you'll need an + * array of tests: */ +static MunitTest test_suite_tests[] = { + {/* The name is just a unique human-readable way to identify the + * test. You can use it to run a specific test if you want, but + * usually it's mostly decorative. */ + (char *)"/example/compare", + /* You probably won't be surprised to learn that the tests are + * functions. */ + test_compare, + /* If you want, you can supply a function to set up a fixture. If + * you supply NULL, the user_data parameter from munit_suite_main + * will be used directly. If, however, you provide a callback + * here the user_data parameter will be passed to this callback, + * and the return value from this callback will be passed to the + * test function. + * + * For our example we don't really need a fixture, but lets + * provide one anyways. */ + test_compare_setup, + /* If you passed a callback for the fixture setup function, you + * may want to pass a corresponding callback here to reverse the + * operation. */ + test_compare_tear_down, + /* Finally, there is a bitmask for options you can pass here. You + * can provide either MUNIT_TEST_OPTION_NONE or 0 here to use the + * defaults. */ + MUNIT_TEST_OPTION_NONE, NULL}, + /* Usually this is written in a much more compact format; all these + * comments kind of ruin that, though. Here is how you'll usually + * see entries written: */ + {(char *)"/example/rand", test_rand, NULL, NULL, MUNIT_TEST_OPTION_NONE, + NULL}, + /* To tell the test runner when the array is over, just add a NULL + * entry at the end. */ + {(char *)"/example/parameters", test_parameters, NULL, NULL, + MUNIT_TEST_OPTION_NONE, test_params}, + {NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL}}; + +/* If you wanted to have your test suite run other test suites you + * could declare an array of them. Of course each sub-suite can + * contain more suites, etc. */ +/* static const MunitSuite other_suites[] = { */ +/* { "/second", test_suite_tests, NULL, 1, MUNIT_SUITE_OPTION_NONE }, */ +/* { NULL, NULL, NULL, 0, MUNIT_SUITE_OPTION_NONE } */ +/* }; */ + +/* Now we'll actually declare the test suite. You could do this in + * the main function, or on the heap, or whatever you want. */ +static const MunitSuite test_suite = { + /* This string will be prepended to all test names in this suite; + * for example, "/example/rand" will become "/µnit/example/rand". + * Note that, while it doesn't really matter for the top-level + * suite, NULL signal the end of an array of tests; you should use + * an empty string ("") instead. */ + (char *)"", + /* The first parameter is the array of test suites. */ + test_suite_tests, + /* In addition to containing test cases, suites can contain other + * test suites. This isn't necessary in this example, but it can be + * a great help to projects with lots of tests by making it easier + * to spread the tests across many files. This is where you would + * put "other_suites" (which is commented out above). */ + NULL, + /* An interesting feature of µnit is that it supports automatically + * running multiple iterations of the tests. This is usually only + * interesting if you make use of the PRNG to randomize your tests + * cases a bit, or if you are doing performance testing and want to + * average multiple runs. 0 is an alias for 1. */ + 1, + /* Just like MUNIT_TEST_OPTION_NONE, you can provide + * MUNIT_SUITE_OPTION_NONE or 0 to use the default settings. */ + MUNIT_SUITE_OPTION_NONE}; + +/* This is only necessary for EXIT_SUCCESS and EXIT_FAILURE, which you + * *should* be using but probably aren't (no, zero and non-zero don't + * always mean success and failure). I guess my point is that nothing + * about µnit requires it. */ +#include + +int main(int argc, char *argv[]) { + /* Finally, we'll actually run our test suite! That second argument + * is the user_data parameter which will be passed either to the + * test or (if provided) the fixture setup function. */ + return munit_suite_main(&test_suite, (void *)"µnit", argc, argv); +} diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/meson.build b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/meson.build new file mode 100644 index 000000000000..c15b405a831a --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/meson.build @@ -0,0 +1,37 @@ +project('munit', 'c') + +conf_data = configuration_data() +conf_data.set('version', '0.2.0') + +add_project_arguments('-std=c99', language : 'c') + +cc = meson.get_compiler('c') + +root_include = include_directories('.') + +munit = library('munit', + ['munit.c'], + install: meson.is_subproject()) + +if meson.is_subproject() + munit_dep = declare_dependency( + include_directories : root_include, + link_with : munit) +else + # standalone install + install_headers('munit.h') + + pkg = import('pkgconfig') + pkg.generate(name: 'munit', + description: 'µnit Testing Library for C', + version: conf_data.get('version'), + libraries: munit) + + # compile the demo project + munit_example_src = files('example.c') + munit_example = executable('munit_example', munit_example_src, + include_directories: root_include, + link_with: munit) + + test('munit example test', munit_example) +endif diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/munit.c b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/munit.c new file mode 100644 index 000000000000..c5faec09b111 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/munit.c @@ -0,0 +1,2447 @@ +/* Copyright (c) 2013-2018 Evan Nemerson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/*** Configuration ***/ + +/* This is just where the output from the test goes. It's really just + * meant to let you choose stdout or stderr, but if anyone really want + * to direct it to a file let me know, it would be fairly easy to + * support. */ +#if !defined(MUNIT_OUTPUT_FILE) +# define MUNIT_OUTPUT_FILE stdout +#endif + +/* This is a bit more useful; it tells µnit how to format the seconds in + * timed tests. If your tests run for longer you might want to reduce + * it, and if your computer is really fast and your tests are tiny you + * can increase it. */ +#if !defined(MUNIT_TEST_TIME_FORMAT) +# define MUNIT_TEST_TIME_FORMAT "0.8f" +#endif + +/* If you have long test names you might want to consider bumping + * this. The result information takes 43 characters. */ +#if !defined(MUNIT_TEST_NAME_LEN) +# define MUNIT_TEST_NAME_LEN 37 +#endif + +/* If you don't like the timing information, you can disable it by + * defining MUNIT_DISABLE_TIMING. */ +#if !defined(MUNIT_DISABLE_TIMING) +# define MUNIT_ENABLE_TIMING +#endif + +/*** End configuration ***/ + +#if defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE < 200809L) +# undef _POSIX_C_SOURCE +#endif +#if !defined(_POSIX_C_SOURCE) +# define _POSIX_C_SOURCE 200809L +#endif + +/* Solaris freaks out if you try to use a POSIX or SUS standard without + * the "right" C standard. */ +#if defined(_XOPEN_SOURCE) +# undef _XOPEN_SOURCE +#endif + +#if defined(__STDC_VERSION__) +# if __STDC_VERSION__ >= 201112L +# define _XOPEN_SOURCE 700 +# elif __STDC_VERSION__ >= 199901L +# define _XOPEN_SOURCE 600 +# endif +#endif + +/* Because, according to Microsoft, POSIX is deprecated. You've got + * to appreciate the chutzpah. */ +#if defined(_MSC_VER) && !defined(_CRT_NONSTDC_NO_DEPRECATE) +# define _CRT_NONSTDC_NO_DEPRECATE +#endif + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +# include +#elif defined(_WIN32) +/* https://msdn.microsoft.com/en-us/library/tf4dy80a.aspx */ +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#if !defined(MUNIT_NO_NL_LANGINFO) && !defined(_WIN32) +# define MUNIT_NL_LANGINFO +# include +# include +# include +#endif + +#if !defined(_WIN32) +# include +# include +# include +#else +# include +# include +# include +# if !defined(STDERR_FILENO) +# define STDERR_FILENO _fileno(stderr) +# endif +#endif + +#include "munit.h" + +#define MUNIT_STRINGIFY(x) #x +#define MUNIT_XSTRINGIFY(x) MUNIT_STRINGIFY(x) + +#if defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__SUNPRO_CC) || \ + defined(__IBMCPP__) +# define MUNIT_THREAD_LOCAL __thread +#elif (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201102L)) || \ + defined(_Thread_local) +# define MUNIT_THREAD_LOCAL _Thread_local +#elif defined(_WIN32) +# define MUNIT_THREAD_LOCAL __declspec(thread) +#endif + +/* MSVC 12.0 will emit a warning at /W4 for code like 'do { ... } + * while (0)', or 'do { ... } while (1)'. I'm pretty sure nobody + * at Microsoft compiles with /W4. */ +#if defined(_MSC_VER) && (_MSC_VER <= 1800) +# pragma warning(disable : 4127) +#endif + +#if defined(_WIN32) || defined(__EMSCRIPTEN__) +# define MUNIT_NO_FORK +#endif + +#if defined(__EMSCRIPTEN__) +# define MUNIT_NO_BUFFER +#endif + +/*** Logging ***/ + +static MunitLogLevel munit_log_level_visible = MUNIT_LOG_INFO; +static MunitLogLevel munit_log_level_fatal = MUNIT_LOG_ERROR; + +#if defined(MUNIT_THREAD_LOCAL) +static MUNIT_THREAD_LOCAL munit_bool munit_error_jmp_buf_valid = 0; +static MUNIT_THREAD_LOCAL jmp_buf munit_error_jmp_buf; +#endif + +/* At certain warning levels, mingw will trigger warnings about + * suggesting the format attribute, which we've explicity *not* set + * because it will then choke on our attempts to use the MS-specific + * I64 modifier for size_t (which we have to use since MSVC doesn't + * support the C99 z modifier). */ + +#if defined(__MINGW32__) || defined(__MINGW64__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wsuggest-attribute=format" +#endif + +MUNIT_PRINTF(5, 0) +static void munit_logf_exv(MunitLogLevel level, FILE *fp, const char *filename, + int line, const char *format, va_list ap) { + if (level < munit_log_level_visible) + return; + + switch (level) { + case MUNIT_LOG_DEBUG: + fputs("Debug", fp); + break; + case MUNIT_LOG_INFO: + fputs("Info", fp); + break; + case MUNIT_LOG_WARNING: + fputs("Warning", fp); + break; + case MUNIT_LOG_ERROR: + fputs("Error", fp); + break; + default: + munit_logf_ex(MUNIT_LOG_ERROR, filename, line, "Invalid log level (%d)", + level); + return; + } + + fputs(": ", fp); + if (filename != NULL) + fprintf(fp, "%s:%d: ", filename, line); + vfprintf(fp, format, ap); + fputc('\n', fp); +} + +MUNIT_PRINTF(3, 4) +static void munit_logf_internal(MunitLogLevel level, FILE *fp, + const char *format, ...) { + va_list ap; + + va_start(ap, format); + munit_logf_exv(level, fp, NULL, 0, format, ap); + va_end(ap); +} + +static void munit_log_internal(MunitLogLevel level, FILE *fp, + const char *message) { + munit_logf_internal(level, fp, "%s", message); +} + +void munit_logf_ex(MunitLogLevel level, const char *filename, int line, + const char *format, ...) { + va_list ap; + + va_start(ap, format); + munit_logf_exv(level, stderr, filename, line, format, ap); + va_end(ap); + + if (level >= munit_log_level_fatal) { +#if defined(MUNIT_THREAD_LOCAL) + if (munit_error_jmp_buf_valid) + longjmp(munit_error_jmp_buf, 1); +#endif + abort(); + } +} + +void munit_errorf_ex(const char *filename, int line, const char *format, ...) { + va_list ap; + + va_start(ap, format); + munit_logf_exv(MUNIT_LOG_ERROR, stderr, filename, line, format, ap); + va_end(ap); + +#if defined(MUNIT_THREAD_LOCAL) + if (munit_error_jmp_buf_valid) + longjmp(munit_error_jmp_buf, 1); +#endif + abort(); +} + +#if defined(__MINGW32__) || defined(__MINGW64__) +# pragma GCC diagnostic pop +#endif + +#if !defined(MUNIT_STRERROR_LEN) +# define MUNIT_STRERROR_LEN 80 +#endif + +static void munit_log_errno(MunitLogLevel level, FILE *fp, const char *msg) { +#if defined(MUNIT_NO_STRERROR_R) || \ + (defined(__MINGW32__) && !defined(MINGW_HAS_SECURE_API)) + munit_logf_internal(level, fp, "%s: %s (%d)", msg, strerror(errno), errno); +#else + char munit_error_str[MUNIT_STRERROR_LEN]; + munit_error_str[0] = '\0'; + +# if !defined(_WIN32) + strerror_r(errno, munit_error_str, MUNIT_STRERROR_LEN); +# else + strerror_s(munit_error_str, MUNIT_STRERROR_LEN, errno); +# endif + + munit_logf_internal(level, fp, "%s: %s (%d)", msg, munit_error_str, errno); +#endif +} + +/*** Memory allocation ***/ + +void *munit_malloc_ex(const char *filename, int line, size_t size) { + void *ptr; + + if (size == 0) + return NULL; + + ptr = calloc(1, size); + if (MUNIT_UNLIKELY(ptr == NULL)) { + munit_logf_ex(MUNIT_LOG_ERROR, filename, line, + "Failed to allocate %" MUNIT_SIZE_MODIFIER "u bytes.", size); + } + + return ptr; +} + +/*** Timer code ***/ + +#if defined(MUNIT_ENABLE_TIMING) + +# define psnip_uint64_t munit_uint64_t +# define psnip_uint32_t munit_uint32_t + +/* Code copied from portable-snippets + * . If you need to + * change something, please do it there so we can keep the code in + * sync. */ + +/* Clocks (v1) + * Portable Snippets - https://gitub.com/nemequ/portable-snippets + * Created by Evan Nemerson + * + * To the extent possible under law, the authors have waived all + * copyright and related or neighboring rights to this code. For + * details, see the Creative Commons Zero 1.0 Universal license at + * https://creativecommons.org/publicdomain/zero/1.0/ + */ + +# if !defined(PSNIP_CLOCK_H) +# define PSNIP_CLOCK_H + +# if !defined(psnip_uint64_t) +# include "../exact-int/exact-int.h" +# endif + +# if !defined(PSNIP_CLOCK_STATIC_INLINE) +# if defined(__GNUC__) +# define PSNIP_CLOCK__COMPILER_ATTRIBUTES __attribute__((__unused__)) +# else +# define PSNIP_CLOCK__COMPILER_ATTRIBUTES +# endif + +# define PSNIP_CLOCK__FUNCTION PSNIP_CLOCK__COMPILER_ATTRIBUTES static +# endif + +enum PsnipClockType { + /* This clock provides the current time, in units since 1970-01-01 + * 00:00:00 UTC not including leap seconds. In other words, UNIX + * time. Keep in mind that this clock doesn't account for leap + * seconds, and can go backwards (think NTP adjustments). */ + PSNIP_CLOCK_TYPE_WALL = 1, + /* The CPU time is a clock which increases only when the current + * process is active (i.e., it doesn't increment while blocking on + * I/O). */ + PSNIP_CLOCK_TYPE_CPU = 2, + /* Monotonic time is always running (unlike CPU time), but it only + ever moves forward unless you reboot the system. Things like NTP + adjustments have no effect on this clock. */ + PSNIP_CLOCK_TYPE_MONOTONIC = 3 +}; + +struct PsnipClockTimespec { + psnip_uint64_t seconds; + psnip_uint64_t nanoseconds; +}; + +/* Methods we support: */ + +# define PSNIP_CLOCK_METHOD_CLOCK_GETTIME 1 +# define PSNIP_CLOCK_METHOD_TIME 2 +# define PSNIP_CLOCK_METHOD_GETTIMEOFDAY 3 +# define PSNIP_CLOCK_METHOD_QUERYPERFORMANCECOUNTER 4 +# define PSNIP_CLOCK_METHOD_MACH_ABSOLUTE_TIME 5 +# define PSNIP_CLOCK_METHOD_CLOCK 6 +# define PSNIP_CLOCK_METHOD_GETPROCESSTIMES 7 +# define PSNIP_CLOCK_METHOD_GETRUSAGE 8 +# define PSNIP_CLOCK_METHOD_GETSYSTEMTIMEPRECISEASFILETIME 9 +# define PSNIP_CLOCK_METHOD_GETTICKCOUNT64 10 + +# include + +# if defined(HEDLEY_UNREACHABLE) +# define PSNIP_CLOCK_UNREACHABLE() HEDLEY_UNREACHABLE() +# else +# define PSNIP_CLOCK_UNREACHABLE() assert(0) +# endif + +/* Choose an implementation */ + +/* #undef PSNIP_CLOCK_WALL_METHOD */ +/* #undef PSNIP_CLOCK_CPU_METHOD */ +/* #undef PSNIP_CLOCK_MONOTONIC_METHOD */ + +/* We want to be able to detect the libc implementation, so we include + ( isn't available everywhere). */ + +# if defined(__unix__) || defined(__unix) || defined(__linux__) +# include +# include +# endif + +# if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) +/* These are known to work without librt. If you know of others + * please let us know so we can add them. */ +# if (defined(__GLIBC__) && \ + (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 17))) || \ + (defined(__FreeBSD__)) +# define PSNIP_CLOCK_HAVE_CLOCK_GETTIME +# elif !defined(PSNIP_CLOCK_NO_LIBRT) +# define PSNIP_CLOCK_HAVE_CLOCK_GETTIME +# endif +# endif + +# if defined(_WIN32) +# if !defined(PSNIP_CLOCK_CPU_METHOD) +# define PSNIP_CLOCK_CPU_METHOD PSNIP_CLOCK_METHOD_GETPROCESSTIMES +# endif +# if !defined(PSNIP_CLOCK_MONOTONIC_METHOD) +# define PSNIP_CLOCK_MONOTONIC_METHOD \ + PSNIP_CLOCK_METHOD_QUERYPERFORMANCECOUNTER +# endif +# endif + +# if defined(__MACH__) && !defined(__gnu_hurd__) +# if !defined(PSNIP_CLOCK_MONOTONIC_METHOD) +# define PSNIP_CLOCK_MONOTONIC_METHOD \ + PSNIP_CLOCK_METHOD_MACH_ABSOLUTE_TIME +# endif +# endif + +# if defined(PSNIP_CLOCK_HAVE_CLOCK_GETTIME) +# include +# if !defined(PSNIP_CLOCK_WALL_METHOD) +# if defined(CLOCK_REALTIME_PRECISE) +# define PSNIP_CLOCK_WALL_METHOD PSNIP_CLOCK_METHOD_CLOCK_GETTIME +# define PSNIP_CLOCK_CLOCK_GETTIME_WALL CLOCK_REALTIME_PRECISE +# elif !defined(__sun) +# define PSNIP_CLOCK_WALL_METHOD PSNIP_CLOCK_METHOD_CLOCK_GETTIME +# define PSNIP_CLOCK_CLOCK_GETTIME_WALL CLOCK_REALTIME +# endif +# endif +# if !defined(PSNIP_CLOCK_CPU_METHOD) +# if defined(_POSIX_CPUTIME) || defined(CLOCK_PROCESS_CPUTIME_ID) +# define PSNIP_CLOCK_CPU_METHOD PSNIP_CLOCK_METHOD_CLOCK_GETTIME +# define PSNIP_CLOCK_CLOCK_GETTIME_CPU CLOCK_PROCESS_CPUTIME_ID +# elif defined(CLOCK_VIRTUAL) +# define PSNIP_CLOCK_CPU_METHOD PSNIP_CLOCK_METHOD_CLOCK_GETTIME +# define PSNIP_CLOCK_CLOCK_GETTIME_CPU CLOCK_VIRTUAL +# endif +# endif +# if !defined(PSNIP_CLOCK_MONOTONIC_METHOD) +# if defined(CLOCK_MONOTONIC_RAW) +# define PSNIP_CLOCK_MONOTONIC_METHOD PSNIP_CLOCK_METHOD_CLOCK_GETTIME +# define PSNIP_CLOCK_CLOCK_GETTIME_MONOTONIC CLOCK_MONOTONIC +# elif defined(CLOCK_MONOTONIC_PRECISE) +# define PSNIP_CLOCK_MONOTONIC_METHOD PSNIP_CLOCK_METHOD_CLOCK_GETTIME +# define PSNIP_CLOCK_CLOCK_GETTIME_MONOTONIC CLOCK_MONOTONIC_PRECISE +# elif defined(_POSIX_MONOTONIC_CLOCK) || defined(CLOCK_MONOTONIC) +# define PSNIP_CLOCK_MONOTONIC_METHOD PSNIP_CLOCK_METHOD_CLOCK_GETTIME +# define PSNIP_CLOCK_CLOCK_GETTIME_MONOTONIC CLOCK_MONOTONIC +# endif +# endif +# endif + +# if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 200112L) +# if !defined(PSNIP_CLOCK_WALL_METHOD) +# define PSNIP_CLOCK_WALL_METHOD PSNIP_CLOCK_METHOD_GETTIMEOFDAY +# endif +# endif + +# if !defined(PSNIP_CLOCK_WALL_METHOD) +# define PSNIP_CLOCK_WALL_METHOD PSNIP_CLOCK_METHOD_TIME +# endif + +# if !defined(PSNIP_CLOCK_CPU_METHOD) +# define PSNIP_CLOCK_CPU_METHOD PSNIP_CLOCK_METHOD_CLOCK +# endif + +/* Primarily here for testing. */ +# if !defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + defined(PSNIP_CLOCK_REQUIRE_MONOTONIC) +# error No monotonic clock found. +# endif + +/* Implementations */ + +# if (defined(PSNIP_CLOCK_CPU_METHOD) && \ + (PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_CLOCK_GETTIME)) || \ + (defined(PSNIP_CLOCK_WALL_METHOD) && \ + (PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_CLOCK_GETTIME)) || \ + (defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + (PSNIP_CLOCK_MONOTONIC_METHOD == PSNIP_CLOCK_METHOD_CLOCK_GETTIME)) || \ + (defined(PSNIP_CLOCK_CPU_METHOD) && \ + (PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_CLOCK)) || \ + (defined(PSNIP_CLOCK_WALL_METHOD) && \ + (PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_CLOCK)) || \ + (defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + (PSNIP_CLOCK_MONOTONIC_METHOD == PSNIP_CLOCK_METHOD_CLOCK)) || \ + (defined(PSNIP_CLOCK_CPU_METHOD) && \ + (PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_TIME)) || \ + (defined(PSNIP_CLOCK_WALL_METHOD) && \ + (PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_TIME)) || \ + (defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + (PSNIP_CLOCK_MONOTONIC_METHOD == PSNIP_CLOCK_METHOD_TIME)) +# include +# endif + +# if (defined(PSNIP_CLOCK_CPU_METHOD) && \ + (PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_GETTIMEOFDAY)) || \ + (defined(PSNIP_CLOCK_WALL_METHOD) && \ + (PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_GETTIMEOFDAY)) || \ + (defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + (PSNIP_CLOCK_MONOTONIC_METHOD == PSNIP_CLOCK_METHOD_GETTIMEOFDAY)) +# include +# endif + +# if (defined(PSNIP_CLOCK_CPU_METHOD) && \ + (PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_GETPROCESSTIMES)) || \ + (defined(PSNIP_CLOCK_WALL_METHOD) && \ + (PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_GETPROCESSTIMES)) || \ + (defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + (PSNIP_CLOCK_MONOTONIC_METHOD == \ + PSNIP_CLOCK_METHOD_GETPROCESSTIMES)) || \ + (defined(PSNIP_CLOCK_CPU_METHOD) && \ + (PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_GETTICKCOUNT64)) || \ + (defined(PSNIP_CLOCK_WALL_METHOD) && \ + (PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_GETTICKCOUNT64)) || \ + (defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + (PSNIP_CLOCK_MONOTONIC_METHOD == PSNIP_CLOCK_METHOD_GETTICKCOUNT64)) +# include +# endif + +# if (defined(PSNIP_CLOCK_CPU_METHOD) && \ + (PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_GETRUSAGE)) || \ + (defined(PSNIP_CLOCK_WALL_METHOD) && \ + (PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_GETRUSAGE)) || \ + (defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + (PSNIP_CLOCK_MONOTONIC_METHOD == PSNIP_CLOCK_METHOD_GETRUSAGE)) +# include +# include +# endif + +# if (defined(PSNIP_CLOCK_CPU_METHOD) && \ + (PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_MACH_ABSOLUTE_TIME)) || \ + (defined(PSNIP_CLOCK_WALL_METHOD) && \ + (PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_MACH_ABSOLUTE_TIME)) || \ + (defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + (PSNIP_CLOCK_MONOTONIC_METHOD == \ + PSNIP_CLOCK_METHOD_MACH_ABSOLUTE_TIME)) +# include +# include +# include +# endif + +/*** Implementations ***/ + +# define PSNIP_CLOCK_NSEC_PER_SEC ((psnip_uint32_t)(1000000000ULL)) + +# if (defined(PSNIP_CLOCK_CPU_METHOD) && \ + (PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_CLOCK_GETTIME)) || \ + (defined(PSNIP_CLOCK_WALL_METHOD) && \ + (PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_CLOCK_GETTIME)) || \ + (defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + (PSNIP_CLOCK_MONOTONIC_METHOD == PSNIP_CLOCK_METHOD_CLOCK_GETTIME)) +PSNIP_CLOCK__FUNCTION psnip_uint32_t +psnip_clock__clock_getres(clockid_t clk_id) { + struct timespec res; + int r; + + r = clock_getres(clk_id, &res); + if (r != 0) + return 0; + + return (psnip_uint32_t)(PSNIP_CLOCK_NSEC_PER_SEC / + (psnip_uint64_t)res.tv_nsec); +} + +PSNIP_CLOCK__FUNCTION int +psnip_clock__clock_gettime(clockid_t clk_id, struct PsnipClockTimespec *res) { + struct timespec ts; + + if (clock_gettime(clk_id, &ts) != 0) + return -10; + + res->seconds = (psnip_uint64_t)(ts.tv_sec); + res->nanoseconds = (psnip_uint64_t)(ts.tv_nsec); + + return 0; +} +# endif + +PSNIP_CLOCK__FUNCTION psnip_uint32_t psnip_clock_wall_get_precision(void) { +# if !defined(PSNIP_CLOCK_WALL_METHOD) + return 0; +# elif defined(PSNIP_CLOCK_WALL_METHOD) && \ + PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_CLOCK_GETTIME + return psnip_clock__clock_getres(PSNIP_CLOCK_CLOCK_GETTIME_WALL); +# elif defined(PSNIP_CLOCK_WALL_METHOD) && \ + PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_GETTIMEOFDAY + return 1000000; +# elif defined(PSNIP_CLOCK_WALL_METHOD) && \ + PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_TIME + return 1; +# else + return 0; +# endif +} + +PSNIP_CLOCK__FUNCTION int +psnip_clock_wall_get_time(struct PsnipClockTimespec *res) { +# if !defined(PSNIP_CLOCK_WALL_METHOD) + (void)res; + + return -2; +# elif defined(PSNIP_CLOCK_WALL_METHOD) && \ + PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_CLOCK_GETTIME + return psnip_clock__clock_gettime(PSNIP_CLOCK_CLOCK_GETTIME_WALL, res); +# elif defined(PSNIP_CLOCK_WALL_METHOD) && \ + PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_TIME + res->seconds = time(NULL); + res->nanoseconds = 0; +# elif defined(PSNIP_CLOCK_WALL_METHOD) && \ + PSNIP_CLOCK_WALL_METHOD == PSNIP_CLOCK_METHOD_GETTIMEOFDAY + struct timeval tv; + + if (gettimeofday(&tv, NULL) != 0) + return -6; + + res->seconds = (psnip_uint64_t)tv.tv_sec; + res->nanoseconds = (psnip_uint64_t)tv.tv_usec * 1000; +# else + (void)res; + + return -2; +# endif + + return 0; +} + +PSNIP_CLOCK__FUNCTION psnip_uint32_t psnip_clock_cpu_get_precision(void) { +# if !defined(PSNIP_CLOCK_CPU_METHOD) + return 0; +# elif defined(PSNIP_CLOCK_CPU_METHOD) && \ + PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_CLOCK_GETTIME + return psnip_clock__clock_getres(PSNIP_CLOCK_CLOCK_GETTIME_CPU); +# elif defined(PSNIP_CLOCK_CPU_METHOD) && \ + PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_CLOCK + return CLOCKS_PER_SEC; +# elif defined(PSNIP_CLOCK_CPU_METHOD) && \ + PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_GETPROCESSTIMES + return PSNIP_CLOCK_NSEC_PER_SEC / 100; +# else + return 0; +# endif +} + +PSNIP_CLOCK__FUNCTION int +psnip_clock_cpu_get_time(struct PsnipClockTimespec *res) { +# if !defined(PSNIP_CLOCK_CPU_METHOD) + (void)res; + return -2; +# elif defined(PSNIP_CLOCK_CPU_METHOD) && \ + PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_CLOCK_GETTIME + return psnip_clock__clock_gettime(PSNIP_CLOCK_CLOCK_GETTIME_CPU, res); +# elif defined(PSNIP_CLOCK_CPU_METHOD) && \ + PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_CLOCK + clock_t t = clock(); + if (t == ((clock_t)-1)) + return -5; + res->seconds = t / CLOCKS_PER_SEC; + res->nanoseconds = + (t % CLOCKS_PER_SEC) * (PSNIP_CLOCK_NSEC_PER_SEC / CLOCKS_PER_SEC); +# elif defined(PSNIP_CLOCK_CPU_METHOD) && \ + PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_GETPROCESSTIMES + FILETIME CreationTime, ExitTime, KernelTime, UserTime; + LARGE_INTEGER date, adjust; + + if (!GetProcessTimes(GetCurrentProcess(), &CreationTime, &ExitTime, + &KernelTime, &UserTime)) + return -7; + + /* http://www.frenk.com/2009/12/convert-filetime-to-unix-timestamp/ */ + date.HighPart = (LONG)UserTime.dwHighDateTime; + date.LowPart = UserTime.dwLowDateTime; + adjust.QuadPart = 11644473600000 * 10000; + date.QuadPart -= adjust.QuadPart; + + res->seconds = (psnip_uint64_t)(date.QuadPart / 10000000); + res->nanoseconds = (psnip_uint64_t)(date.QuadPart % 10000000) * + (PSNIP_CLOCK_NSEC_PER_SEC / 100); +# elif PSNIP_CLOCK_CPU_METHOD == PSNIP_CLOCK_METHOD_GETRUSAGE + struct rusage usage; + if (getrusage(RUSAGE_SELF, &usage) != 0) + return -8; + + res->seconds = usage.ru_utime.tv_sec; + res->nanoseconds = tv.tv_usec * 1000; +# else + (void)res; + return -2; +# endif + + return 0; +} + +PSNIP_CLOCK__FUNCTION psnip_uint32_t psnip_clock_monotonic_get_precision(void) { +# if !defined(PSNIP_CLOCK_MONOTONIC_METHOD) + return 0; +# elif defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + PSNIP_CLOCK_MONOTONIC_METHOD == PSNIP_CLOCK_METHOD_CLOCK_GETTIME + return psnip_clock__clock_getres(PSNIP_CLOCK_CLOCK_GETTIME_MONOTONIC); +# elif defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + PSNIP_CLOCK_MONOTONIC_METHOD == PSNIP_CLOCK_METHOD_MACH_ABSOLUTE_TIME + static mach_timebase_info_data_t tbi = { + 0, + }; + if (tbi.denom == 0) + mach_timebase_info(&tbi); + return (psnip_uint32_t)(tbi.numer / tbi.denom); +# elif defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + PSNIP_CLOCK_MONOTONIC_METHOD == PSNIP_CLOCK_METHOD_GETTICKCOUNT64 + return 1000; +# elif defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + PSNIP_CLOCK_MONOTONIC_METHOD == \ + PSNIP_CLOCK_METHOD_QUERYPERFORMANCECOUNTER + LARGE_INTEGER Frequency; + QueryPerformanceFrequency(&Frequency); + return (psnip_uint32_t)((Frequency.QuadPart > PSNIP_CLOCK_NSEC_PER_SEC) + ? PSNIP_CLOCK_NSEC_PER_SEC + : Frequency.QuadPart); +# else + return 0; +# endif +} + +PSNIP_CLOCK__FUNCTION int +psnip_clock_monotonic_get_time(struct PsnipClockTimespec *res) { +# if !defined(PSNIP_CLOCK_MONOTONIC_METHOD) + (void)res; + return -2; +# elif defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + PSNIP_CLOCK_MONOTONIC_METHOD == PSNIP_CLOCK_METHOD_CLOCK_GETTIME + return psnip_clock__clock_gettime(PSNIP_CLOCK_CLOCK_GETTIME_MONOTONIC, res); +# elif defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + PSNIP_CLOCK_MONOTONIC_METHOD == PSNIP_CLOCK_METHOD_MACH_ABSOLUTE_TIME + psnip_uint64_t nsec = mach_absolute_time(); + static mach_timebase_info_data_t tbi = { + 0, + }; + if (tbi.denom == 0) + mach_timebase_info(&tbi); + nsec *= ((psnip_uint64_t)tbi.numer) / ((psnip_uint64_t)tbi.denom); + res->seconds = nsec / PSNIP_CLOCK_NSEC_PER_SEC; + res->nanoseconds = nsec % PSNIP_CLOCK_NSEC_PER_SEC; +# elif defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + PSNIP_CLOCK_MONOTONIC_METHOD == \ + PSNIP_CLOCK_METHOD_QUERYPERFORMANCECOUNTER + LARGE_INTEGER t, f; + if (QueryPerformanceCounter(&t) == 0) + return -12; + + QueryPerformanceFrequency(&f); + res->seconds = (psnip_uint64_t)(t.QuadPart / f.QuadPart); + res->nanoseconds = (psnip_uint64_t)(t.QuadPart % f.QuadPart); + if (f.QuadPart > PSNIP_CLOCK_NSEC_PER_SEC) + res->nanoseconds /= (psnip_uint64_t)f.QuadPart / PSNIP_CLOCK_NSEC_PER_SEC; + else + res->nanoseconds *= PSNIP_CLOCK_NSEC_PER_SEC / (psnip_uint64_t)f.QuadPart; +# elif defined(PSNIP_CLOCK_MONOTONIC_METHOD) && \ + PSNIP_CLOCK_MONOTONIC_METHOD == PSNIP_CLOCK_METHOD_GETTICKCOUNT64 + const ULONGLONG msec = GetTickCount64(); + res->seconds = msec / 1000; + res->nanoseconds = sec % 1000; +# else + return -2; +# endif + + return 0; +} + +/* Returns the number of ticks per second for the specified clock. + * For example, a clock with millisecond precision would return 1000, + * and a clock with 1 second (such as the time() function) would + * return 1. + * + * If the requested clock isn't available, it will return 0. + * Hopefully this will be rare, but if it happens to you please let us + * know so we can work on finding a way to support your system. + * + * Note that different clocks on the same system often have a + * different precisions. + */ +PSNIP_CLOCK__FUNCTION psnip_uint32_t +psnip_clock_get_precision(enum PsnipClockType clock_type) { + switch (clock_type) { + case PSNIP_CLOCK_TYPE_MONOTONIC: + return psnip_clock_monotonic_get_precision(); + case PSNIP_CLOCK_TYPE_CPU: + return psnip_clock_cpu_get_precision(); + case PSNIP_CLOCK_TYPE_WALL: + return psnip_clock_wall_get_precision(); + } + + PSNIP_CLOCK_UNREACHABLE(); + return 0; +} + +/* Set the provided timespec to the requested time. Returns 0 on + * success, or a negative value on failure. */ +PSNIP_CLOCK__FUNCTION int psnip_clock_get_time(enum PsnipClockType clock_type, + struct PsnipClockTimespec *res) { + assert(res != NULL); + + switch (clock_type) { + case PSNIP_CLOCK_TYPE_MONOTONIC: + return psnip_clock_monotonic_get_time(res); + case PSNIP_CLOCK_TYPE_CPU: + return psnip_clock_cpu_get_time(res); + case PSNIP_CLOCK_TYPE_WALL: + return psnip_clock_wall_get_time(res); + } + + return -1; +} + +# endif /* !defined(PSNIP_CLOCK_H) */ + +static psnip_uint64_t munit_clock_get_elapsed(struct PsnipClockTimespec *start, + struct PsnipClockTimespec *end) { + psnip_uint64_t r = (end->seconds - start->seconds) * PSNIP_CLOCK_NSEC_PER_SEC; + if (end->nanoseconds < start->nanoseconds) { + return r - (start->nanoseconds - end->nanoseconds); + } + + return r + (end->nanoseconds - start->nanoseconds); +} + +#else +# include +#endif /* defined(MUNIT_ENABLE_TIMING) */ + +/*** PRNG stuff ***/ + +/* This is (unless I screwed up, which is entirely possible) the + * version of PCG with 32-bit state. It was chosen because it has a + * small enough state that we should reliably be able to use CAS + * instead of requiring a lock for thread-safety. + * + * If I did screw up, I probably will not bother changing it unless + * there is a significant bias. It's really not important this be + * particularly strong, as long as it is fairly random it's much more + * important that it be reproducible, so bug reports have a better + * chance of being reproducible. */ + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ + !defined(__STDC_NO_ATOMICS__) && !defined(__EMSCRIPTEN__) && \ + (!defined(__GNUC_MINOR__) || (__GNUC__ > 4) || \ + (__GNUC__ == 4 && __GNUC_MINOR__ > 8)) +# define HAVE_STDATOMIC +#elif defined(__clang__) +# if __has_extension(c_atomic) +# define HAVE_CLANG_ATOMICS +# endif +#endif + +/* Workaround for http://llvm.org/bugs/show_bug.cgi?id=26911 */ +#if defined(__clang__) && defined(_WIN32) +# undef HAVE_STDATOMIC +# if defined(__c2__) +# undef HAVE_CLANG_ATOMICS +# endif +#endif + +#if defined(_OPENMP) +# define ATOMIC_UINT32_T uint32_t +#elif defined(HAVE_STDATOMIC) +# include +# define ATOMIC_UINT32_T _Atomic uint32_t +#elif defined(HAVE_CLANG_ATOMICS) +# define ATOMIC_UINT32_T _Atomic uint32_t +#elif defined(_WIN32) +# define ATOMIC_UINT32_T volatile LONG +#else +# define ATOMIC_UINT32_T volatile uint32_t +#endif + +static ATOMIC_UINT32_T munit_rand_state = 42; + +#if defined(_OPENMP) +static inline void munit_atomic_store(ATOMIC_UINT32_T *dest, + ATOMIC_UINT32_T value) { +# pragma omp critical(munit_atomics) + *dest = value; +} + +static inline uint32_t munit_atomic_load(ATOMIC_UINT32_T *src) { + int ret; +# pragma omp critical(munit_atomics) + ret = *src; + return ret; +} + +static inline uint32_t munit_atomic_cas(ATOMIC_UINT32_T *dest, + ATOMIC_UINT32_T *expected, + ATOMIC_UINT32_T desired) { + munit_bool ret; + +# pragma omp critical(munit_atomics) + { + if (*dest == *expected) { + *dest = desired; + ret = 1; + } else { + ret = 0; + } + } + + return ret; +} +#elif defined(HAVE_STDATOMIC) +# define munit_atomic_store(dest, value) atomic_store(dest, value) +# define munit_atomic_load(src) atomic_load(src) +# define munit_atomic_cas(dest, expected, value) \ + atomic_compare_exchange_weak(dest, expected, value) +#elif defined(HAVE_CLANG_ATOMICS) +# define munit_atomic_store(dest, value) \ + __c11_atomic_store(dest, value, __ATOMIC_SEQ_CST) +# define munit_atomic_load(src) __c11_atomic_load(src, __ATOMIC_SEQ_CST) +# define munit_atomic_cas(dest, expected, value) \ + __c11_atomic_compare_exchange_weak(dest, expected, value, \ + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) +#elif defined(__GNUC__) && (__GNUC__ > 4) || \ + (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) +# define munit_atomic_store(dest, value) \ + __atomic_store_n(dest, value, __ATOMIC_SEQ_CST) +# define munit_atomic_load(src) __atomic_load_n(src, __ATOMIC_SEQ_CST) +# define munit_atomic_cas(dest, expected, value) \ + __atomic_compare_exchange_n(dest, expected, value, 1, __ATOMIC_SEQ_CST, \ + __ATOMIC_SEQ_CST) +#elif defined(__GNUC__) && (__GNUC__ >= 4) +# define munit_atomic_store(dest, value) \ + do { \ + *(dest) = (value); \ + } while (0) +# define munit_atomic_load(src) (*(src)) +# define munit_atomic_cas(dest, expected, value) \ + __sync_bool_compare_and_swap(dest, *expected, value) +#elif defined(_WIN32) /* Untested */ +# define munit_atomic_store(dest, value) \ + do { \ + *(dest) = (value); \ + } while (0) +# define munit_atomic_load(src) (*(src)) +# define munit_atomic_cas(dest, expected, value) \ + InterlockedCompareExchange((dest), (value), *(expected)) +#else +# warning No atomic implementation, PRNG will not be thread-safe +# define munit_atomic_store(dest, value) \ + do { \ + *(dest) = (value); \ + } while (0) +# define munit_atomic_load(src) (*(src)) +static inline munit_bool munit_atomic_cas(ATOMIC_UINT32_T *dest, + ATOMIC_UINT32_T *expected, + ATOMIC_UINT32_T desired) { + if (*dest == *expected) { + *dest = desired; + return 1; + } else { + return 0; + } +} +#endif + +#define MUNIT_PRNG_MULTIPLIER (747796405U) +#define MUNIT_PRNG_INCREMENT (1729U) + +static munit_uint32_t munit_rand_next_state(munit_uint32_t state) { + return state * MUNIT_PRNG_MULTIPLIER + MUNIT_PRNG_INCREMENT; +} + +static munit_uint32_t munit_rand_from_state(munit_uint32_t state) { + munit_uint32_t res = ((state >> ((state >> 28) + 4)) ^ state) * (277803737U); + res ^= res >> 22; + return res; +} + +void munit_rand_seed(munit_uint32_t seed) { + munit_uint32_t state = munit_rand_next_state(seed + MUNIT_PRNG_INCREMENT); + munit_atomic_store(&munit_rand_state, state); +} + +static munit_uint32_t munit_rand_generate_seed(void) { + munit_uint32_t seed, state; +#if defined(MUNIT_ENABLE_TIMING) + struct PsnipClockTimespec wc = { + 0, + }; + + psnip_clock_get_time(PSNIP_CLOCK_TYPE_WALL, &wc); + seed = (munit_uint32_t)wc.nanoseconds; +#else + seed = (munit_uint32_t)time(NULL); +#endif + + state = munit_rand_next_state(seed + MUNIT_PRNG_INCREMENT); + return munit_rand_from_state(state); +} + +static munit_uint32_t munit_rand_state_uint32(munit_uint32_t *state) { + const munit_uint32_t old = *state; + *state = munit_rand_next_state(old); + return munit_rand_from_state(old); +} + +munit_uint32_t munit_rand_uint32(void) { + munit_uint32_t old, state; + + do { + old = munit_atomic_load(&munit_rand_state); + state = munit_rand_next_state(old); + } while (!munit_atomic_cas(&munit_rand_state, &old, state)); + + return munit_rand_from_state(old); +} + +static void munit_rand_state_memory(munit_uint32_t *state, size_t size, + munit_uint8_t *data) { + size_t members_remaining = size / sizeof(munit_uint32_t); + size_t bytes_remaining = size % sizeof(munit_uint32_t); + munit_uint8_t *b = data; + munit_uint32_t rv; + while (members_remaining-- > 0) { + rv = munit_rand_state_uint32(state); + memcpy(b, &rv, sizeof(munit_uint32_t)); + b += sizeof(munit_uint32_t); + } + if (bytes_remaining != 0) { + rv = munit_rand_state_uint32(state); + memcpy(b, &rv, bytes_remaining); + } +} + +void munit_rand_memory(size_t size, munit_uint8_t *data) { + munit_uint32_t old, state; + + do { + state = old = munit_atomic_load(&munit_rand_state); + munit_rand_state_memory(&state, size, data); + } while (!munit_atomic_cas(&munit_rand_state, &old, state)); +} + +static munit_uint32_t munit_rand_state_at_most(munit_uint32_t *state, + munit_uint32_t salt, + munit_uint32_t max) { + /* We want (UINT32_MAX + 1) % max, which in unsigned arithmetic is the same + * as (UINT32_MAX + 1 - max) % max = -max % max. We compute -max using not + * to avoid compiler warnings. + */ + const munit_uint32_t min = (~max + 1U) % max; + munit_uint32_t x; + + if (max == (~((munit_uint32_t)0U))) + return munit_rand_state_uint32(state) ^ salt; + + max++; + + do { + x = munit_rand_state_uint32(state) ^ salt; + } while (x < min); + + return x % max; +} + +static munit_uint32_t munit_rand_at_most(munit_uint32_t salt, + munit_uint32_t max) { + munit_uint32_t old, state; + munit_uint32_t retval; + + do { + state = old = munit_atomic_load(&munit_rand_state); + retval = munit_rand_state_at_most(&state, salt, max); + } while (!munit_atomic_cas(&munit_rand_state, &old, state)); + + return retval; +} + +int munit_rand_int_range(int min, int max) { + munit_uint64_t range = (munit_uint64_t)max - (munit_uint64_t)min; + + if (min > max) + return munit_rand_int_range(max, min); + + if (range > (~((munit_uint32_t)0U))) + range = (~((munit_uint32_t)0U)); + + return min + (int)munit_rand_at_most(0, (munit_uint32_t)range); +} + +double munit_rand_double(void) { + munit_uint32_t old, state; + double retval = 0.0; + + do { + state = old = munit_atomic_load(&munit_rand_state); + + /* See http://mumble.net/~campbell/tmp/random_real.c for how to do + * this right. Patches welcome if you feel that this is too + * biased. */ + retval = munit_rand_state_uint32(&state) / ((~((munit_uint32_t)0U)) + 1.0); + } while (!munit_atomic_cas(&munit_rand_state, &old, state)); + + return retval; +} + +/*** Test suite handling ***/ + +typedef struct { + unsigned int successful; + unsigned int skipped; + unsigned int failed; + unsigned int errored; +#if defined(MUNIT_ENABLE_TIMING) + munit_uint64_t cpu_clock; + munit_uint64_t wall_clock; +#endif +} MunitReport; + +typedef struct { + const char *prefix; + const MunitSuite *suite; + const char **tests; + munit_uint32_t seed; + unsigned int iterations; + MunitParameter *parameters; + munit_bool single_parameter_mode; + void *user_data; + MunitReport report; + munit_bool colorize; + munit_bool fork; + munit_bool show_stderr; + munit_bool fatal_failures; +} MunitTestRunner; + +const char *munit_parameters_get(const MunitParameter params[], + const char *key) { + const MunitParameter *param; + + for (param = params; param != NULL && param->name != NULL; param++) + if (strcmp(param->name, key) == 0) + return param->value; + return NULL; +} + +#if defined(MUNIT_ENABLE_TIMING) +static void munit_print_time(FILE *fp, munit_uint64_t nanoseconds) { + fprintf(fp, "%" MUNIT_TEST_TIME_FORMAT, + ((double)nanoseconds) / ((double)PSNIP_CLOCK_NSEC_PER_SEC)); +} +#endif + +/* Add a paramter to an array of parameters. */ +static MunitResult munit_parameters_add(size_t *params_size, + MunitParameter **params, char *name, + char *value) { + *params = realloc(*params, sizeof(MunitParameter) * (*params_size + 2)); + if (*params == NULL) + return MUNIT_ERROR; + + (*params)[*params_size].name = name; + (*params)[*params_size].value = value; + (*params_size)++; + (*params)[*params_size].name = NULL; + (*params)[*params_size].value = NULL; + + return MUNIT_OK; +} + +/* Concatenate two strings, but just return one of the components + * unaltered if the other is NULL or "". */ +static char *munit_maybe_concat(size_t *len, char *prefix, char *suffix) { + char *res; + size_t res_l; + const size_t prefix_l = prefix != NULL ? strlen(prefix) : 0; + const size_t suffix_l = suffix != NULL ? strlen(suffix) : 0; + if (prefix_l == 0 && suffix_l == 0) { + res = NULL; + res_l = 0; + } else if (prefix_l == 0 && suffix_l != 0) { + res = suffix; + res_l = suffix_l; + } else if (prefix_l != 0 && suffix_l == 0) { + res = prefix; + res_l = prefix_l; + } else { + res_l = prefix_l + suffix_l; + res = malloc(res_l + 1); + memcpy(res, prefix, prefix_l); + memcpy(res + prefix_l, suffix, suffix_l); + res[res_l] = 0; + } + + if (len != NULL) + *len = res_l; + + return res; +} + +/* Possbily free a string returned by munit_maybe_concat. */ +static void munit_maybe_free_concat(char *s, const char *prefix, + const char *suffix) { + if (prefix != s && suffix != s) + free(s); +} + +/* Cheap string hash function, just used to salt the PRNG. */ +static munit_uint32_t munit_str_hash(const char *name) { + const char *p; + munit_uint32_t h = 5381U; + + for (p = name; *p != '\0'; p++) + h = (munit_uint32_t)(h << 5) + h + (munit_uint32_t)*p; + + return h; +} + +static void munit_splice(int from, int to) { + munit_uint8_t buf[1024]; +#if !defined(_WIN32) + ssize_t len; + ssize_t bytes_written; + ssize_t write_res; +#else + int len; + int bytes_written; + int write_res; +#endif + do { + len = read(from, buf, sizeof(buf)); + if (len > 0) { + bytes_written = 0; + do { + write_res = write(to, buf + bytes_written, +#if !defined(_WIN32) + (size_t) +#else + (unsigned int) +#endif + (len - bytes_written)); + if (write_res < 0) + break; + bytes_written += write_res; + } while (bytes_written < len); + } else + break; + } while (1); +} + +/* This is the part that should be handled in the child process */ +static MunitResult munit_test_runner_exec(MunitTestRunner *runner, + const MunitTest *test, + const MunitParameter params[], + MunitReport *report) { + unsigned int iterations = runner->iterations; + MunitResult result = MUNIT_FAIL; +#if defined(MUNIT_ENABLE_TIMING) + struct PsnipClockTimespec wall_clock_begin = + { + 0, + }, + wall_clock_end = { + 0, + }; + struct PsnipClockTimespec cpu_clock_begin = + { + 0, + }, + cpu_clock_end = { + 0, + }; +#endif + unsigned int i = 0; + + if ((test->options & MUNIT_TEST_OPTION_SINGLE_ITERATION) == + MUNIT_TEST_OPTION_SINGLE_ITERATION) + iterations = 1; + else if (iterations == 0) + iterations = runner->suite->iterations; + + munit_rand_seed(runner->seed); + + do { + void *data = (test->setup == NULL) ? runner->user_data + : test->setup(params, runner->user_data); + +#if defined(MUNIT_ENABLE_TIMING) + psnip_clock_get_time(PSNIP_CLOCK_TYPE_WALL, &wall_clock_begin); + psnip_clock_get_time(PSNIP_CLOCK_TYPE_CPU, &cpu_clock_begin); +#endif + + result = test->test(params, data); + +#if defined(MUNIT_ENABLE_TIMING) + psnip_clock_get_time(PSNIP_CLOCK_TYPE_WALL, &wall_clock_end); + psnip_clock_get_time(PSNIP_CLOCK_TYPE_CPU, &cpu_clock_end); +#endif + + if (test->tear_down != NULL) + test->tear_down(data); + + if (MUNIT_LIKELY(result == MUNIT_OK)) { + report->successful++; +#if defined(MUNIT_ENABLE_TIMING) + report->wall_clock += + munit_clock_get_elapsed(&wall_clock_begin, &wall_clock_end); + report->cpu_clock += + munit_clock_get_elapsed(&cpu_clock_begin, &cpu_clock_end); +#endif + } else { + switch ((int)result) { + case MUNIT_SKIP: + report->skipped++; + break; + case MUNIT_FAIL: + report->failed++; + break; + case MUNIT_ERROR: + report->errored++; + break; + default: + break; + } + break; + } + } while (++i < iterations); + + return result; +} + +#if defined(MUNIT_EMOTICON) +# define MUNIT_RESULT_STRING_OK ":)" +# define MUNIT_RESULT_STRING_SKIP ":|" +# define MUNIT_RESULT_STRING_FAIL ":(" +# define MUNIT_RESULT_STRING_ERROR ":o" +# define MUNIT_RESULT_STRING_TODO ":/" +#else +# define MUNIT_RESULT_STRING_OK "OK " +# define MUNIT_RESULT_STRING_SKIP "SKIP " +# define MUNIT_RESULT_STRING_FAIL "FAIL " +# define MUNIT_RESULT_STRING_ERROR "ERROR" +# define MUNIT_RESULT_STRING_TODO "TODO " +#endif + +static void munit_test_runner_print_color(const MunitTestRunner *runner, + const char *string, char color) { + if (runner->colorize) + fprintf(MUNIT_OUTPUT_FILE, "\x1b[3%cm%s\x1b[39m", color, string); + else + fputs(string, MUNIT_OUTPUT_FILE); +} + +#if !defined(MUNIT_NO_BUFFER) +static int munit_replace_stderr(FILE *stderr_buf) { + if (stderr_buf != NULL) { + const int orig_stderr = dup(STDERR_FILENO); + + int errfd = fileno(stderr_buf); + if (MUNIT_UNLIKELY(errfd == -1)) { + exit(EXIT_FAILURE); + } + + dup2(errfd, STDERR_FILENO); + + return orig_stderr; + } + + return -1; +} + +static void munit_restore_stderr(int orig_stderr) { + if (orig_stderr != -1) { + dup2(orig_stderr, STDERR_FILENO); + close(orig_stderr); + } +} +#endif /* !defined(MUNIT_NO_BUFFER) */ + +/* Run a test with the specified parameters. */ +static void +munit_test_runner_run_test_with_params(MunitTestRunner *runner, + const MunitTest *test, + const MunitParameter params[]) { + MunitResult result = MUNIT_OK; + MunitReport report = {0, 0, 0, 0, +#if defined(MUNIT_ENABLE_TIMING) + 0, 0 +#endif + }; + unsigned int output_l; + munit_bool first; + const MunitParameter *param; + FILE *stderr_buf; +#if !defined(MUNIT_NO_FORK) + int pipefd[2]; + pid_t fork_pid; + ssize_t bytes_written = 0; + ssize_t write_res; + ssize_t bytes_read = 0; + ssize_t read_res; + int status = 0; + pid_t changed_pid; +#endif + + if (params != NULL) { + output_l = 2; + fputs(" ", MUNIT_OUTPUT_FILE); + first = 1; + for (param = params; param != NULL && param->name != NULL; param++) { + if (!first) { + fputs(", ", MUNIT_OUTPUT_FILE); + output_l += 2; + } else { + first = 0; + } + + output_l += (unsigned int)fprintf(MUNIT_OUTPUT_FILE, "%s=%s", param->name, + param->value); + } + while (output_l++ < MUNIT_TEST_NAME_LEN) { + fputc(' ', MUNIT_OUTPUT_FILE); + } + } + + fflush(MUNIT_OUTPUT_FILE); + + stderr_buf = NULL; +#if !defined(_WIN32) || defined(__MINGW32__) + stderr_buf = tmpfile(); +#else + tmpfile_s(&stderr_buf); +#endif + if (stderr_buf == NULL) { + munit_log_errno(MUNIT_LOG_ERROR, stderr, + "unable to create buffer for stderr"); + result = MUNIT_ERROR; + goto print_result; + } + +#if !defined(MUNIT_NO_FORK) + if (runner->fork) { + pipefd[0] = -1; + pipefd[1] = -1; + if (pipe(pipefd) != 0) { + munit_log_errno(MUNIT_LOG_ERROR, stderr, "unable to create pipe"); + result = MUNIT_ERROR; + goto print_result; + } + + fork_pid = fork(); + if (fork_pid == 0) { + int orig_stderr; + + close(pipefd[0]); + + orig_stderr = munit_replace_stderr(stderr_buf); + munit_test_runner_exec(runner, test, params, &report); + + /* Note that we don't restore stderr. This is so we can buffer + * things written to stderr later on (such as by + * asan/tsan/ubsan, valgrind, etc.) */ + close(orig_stderr); + + do { + write_res = + write(pipefd[1], ((munit_uint8_t *)(&report)) + bytes_written, + sizeof(report) - (size_t)bytes_written); + if (write_res < 0) { + if (stderr_buf != NULL) { + munit_log_errno(MUNIT_LOG_ERROR, stderr, "unable to write to pipe"); + } + exit(EXIT_FAILURE); + } + bytes_written += write_res; + } while ((size_t)bytes_written < sizeof(report)); + + if (stderr_buf != NULL) + fclose(stderr_buf); + close(pipefd[1]); + + exit(EXIT_SUCCESS); + } else if (fork_pid == -1) { + close(pipefd[0]); + close(pipefd[1]); + if (stderr_buf != NULL) { + munit_log_errno(MUNIT_LOG_ERROR, stderr, "unable to fork"); + } + report.errored++; + result = MUNIT_ERROR; + } else { + close(pipefd[1]); + do { + read_res = read(pipefd[0], ((munit_uint8_t *)(&report)) + bytes_read, + sizeof(report) - (size_t)bytes_read); + if (read_res < 1) + break; + bytes_read += read_res; + } while (bytes_read < (ssize_t)sizeof(report)); + + changed_pid = waitpid(fork_pid, &status, 0); + + if (MUNIT_LIKELY(changed_pid == fork_pid) && + MUNIT_LIKELY(WIFEXITED(status))) { + if (bytes_read != sizeof(report)) { + munit_logf_internal(MUNIT_LOG_ERROR, stderr_buf, + "child exited unexpectedly with status %d", + WEXITSTATUS(status)); + report.errored++; + } else if (WEXITSTATUS(status) != EXIT_SUCCESS) { + munit_logf_internal(MUNIT_LOG_ERROR, stderr_buf, + "child exited with status %d", + WEXITSTATUS(status)); + report.errored++; + } + } else { + if (WIFSIGNALED(status)) { +# if defined(_XOPEN_VERSION) && (_XOPEN_VERSION >= 700) + munit_logf_internal(MUNIT_LOG_ERROR, stderr_buf, + "child killed by signal %d (%s)", + WTERMSIG(status), strsignal(WTERMSIG(status))); +# else + munit_logf_internal(MUNIT_LOG_ERROR, stderr_buf, + "child killed by signal %d", WTERMSIG(status)); +# endif + } else if (WIFSTOPPED(status)) { + munit_logf_internal(MUNIT_LOG_ERROR, stderr_buf, + "child stopped by signal %d", WSTOPSIG(status)); + } + report.errored++; + } + + close(pipefd[0]); + waitpid(fork_pid, NULL, 0); + } + } else +#endif + { +#if !defined(MUNIT_NO_BUFFER) + const volatile int orig_stderr = munit_replace_stderr(stderr_buf); +#endif + +#if defined(MUNIT_THREAD_LOCAL) + if (MUNIT_UNLIKELY(setjmp(munit_error_jmp_buf) != 0)) { + result = MUNIT_FAIL; + report.failed++; + } else { + munit_error_jmp_buf_valid = 1; + result = munit_test_runner_exec(runner, test, params, &report); + } +#else + result = munit_test_runner_exec(runner, test, params, &report); +#endif + +#if !defined(MUNIT_NO_BUFFER) + munit_restore_stderr(orig_stderr); +#endif + + /* Here just so that the label is used on Windows and we don't get + * a warning */ + goto print_result; + } + +print_result: + + fputs("[ ", MUNIT_OUTPUT_FILE); + if ((test->options & MUNIT_TEST_OPTION_TODO) == MUNIT_TEST_OPTION_TODO) { + if (report.failed != 0 || report.errored != 0 || report.skipped != 0) { + munit_test_runner_print_color(runner, MUNIT_RESULT_STRING_TODO, '3'); + result = MUNIT_OK; + } else { + munit_test_runner_print_color(runner, MUNIT_RESULT_STRING_ERROR, '1'); + if (MUNIT_LIKELY(stderr_buf != NULL)) + munit_log_internal(MUNIT_LOG_ERROR, stderr_buf, + "Test marked TODO, but was successful."); + runner->report.failed++; + result = MUNIT_ERROR; + } + } else if (report.failed > 0) { + munit_test_runner_print_color(runner, MUNIT_RESULT_STRING_FAIL, '1'); + runner->report.failed++; + result = MUNIT_FAIL; + } else if (report.errored > 0) { + munit_test_runner_print_color(runner, MUNIT_RESULT_STRING_ERROR, '1'); + runner->report.errored++; + result = MUNIT_ERROR; + } else if (report.skipped > 0) { + munit_test_runner_print_color(runner, MUNIT_RESULT_STRING_SKIP, '3'); + runner->report.skipped++; + result = MUNIT_SKIP; + } else if (report.successful > 1) { + munit_test_runner_print_color(runner, MUNIT_RESULT_STRING_OK, '2'); +#if defined(MUNIT_ENABLE_TIMING) + fputs(" ] [ ", MUNIT_OUTPUT_FILE); + munit_print_time(MUNIT_OUTPUT_FILE, report.wall_clock / report.successful); + fputs(" / ", MUNIT_OUTPUT_FILE); + munit_print_time(MUNIT_OUTPUT_FILE, report.cpu_clock / report.successful); + fprintf(MUNIT_OUTPUT_FILE, + " CPU ]\n %-" MUNIT_XSTRINGIFY(MUNIT_TEST_NAME_LEN) "s Total: [ ", + ""); + munit_print_time(MUNIT_OUTPUT_FILE, report.wall_clock); + fputs(" / ", MUNIT_OUTPUT_FILE); + munit_print_time(MUNIT_OUTPUT_FILE, report.cpu_clock); + fputs(" CPU", MUNIT_OUTPUT_FILE); +#endif + runner->report.successful++; + result = MUNIT_OK; + } else if (report.successful > 0) { + munit_test_runner_print_color(runner, MUNIT_RESULT_STRING_OK, '2'); +#if defined(MUNIT_ENABLE_TIMING) + fputs(" ] [ ", MUNIT_OUTPUT_FILE); + munit_print_time(MUNIT_OUTPUT_FILE, report.wall_clock); + fputs(" / ", MUNIT_OUTPUT_FILE); + munit_print_time(MUNIT_OUTPUT_FILE, report.cpu_clock); + fputs(" CPU", MUNIT_OUTPUT_FILE); +#endif + runner->report.successful++; + result = MUNIT_OK; + } + fputs(" ]\n", MUNIT_OUTPUT_FILE); + + if (stderr_buf != NULL) { + if (result == MUNIT_FAIL || result == MUNIT_ERROR || runner->show_stderr) { + fflush(MUNIT_OUTPUT_FILE); + + rewind(stderr_buf); + munit_splice(fileno(stderr_buf), STDERR_FILENO); + + fflush(stderr); + } + + fclose(stderr_buf); + } +} + +static void munit_test_runner_run_test_wild(MunitTestRunner *runner, + const MunitTest *test, + const char *test_name, + MunitParameter *params, + MunitParameter *p) { + const MunitParameterEnum *pe; + char **values; + MunitParameter *next; + + for (pe = test->parameters; pe != NULL && pe->name != NULL; pe++) { + if (p->name == pe->name) + break; + } + + if (pe == NULL) + return; + + for (values = pe->values; *values != NULL; values++) { + next = p + 1; + p->value = *values; + if (next->name == NULL) { + munit_test_runner_run_test_with_params(runner, test, params); + } else { + munit_test_runner_run_test_wild(runner, test, test_name, params, next); + } + if (runner->fatal_failures && + (runner->report.failed != 0 || runner->report.errored != 0)) + break; + } +} + +/* Run a single test, with every combination of parameters + * requested. */ +static void munit_test_runner_run_test(MunitTestRunner *runner, + const MunitTest *test, + const char *prefix) { + char *test_name = + munit_maybe_concat(NULL, (char *)prefix, (char *)test->name); + /* The array of parameters to pass to + * munit_test_runner_run_test_with_params */ + MunitParameter *params = NULL; + size_t params_l = 0; + /* Wildcard parameters are parameters which have possible values + * specified in the test, but no specific value was passed to the + * CLI. That means we want to run the test once for every + * possible combination of parameter values or, if --single was + * passed to the CLI, a single time with a random set of + * parameters. */ + MunitParameter *wild_params = NULL; + size_t wild_params_l = 0; + const MunitParameterEnum *pe; + const MunitParameter *cli_p; + munit_bool filled; + unsigned int possible; + char **vals; + size_t first_wild; + const MunitParameter *wp; + int pidx; + + munit_rand_seed(runner->seed); + + fprintf(MUNIT_OUTPUT_FILE, "%-" MUNIT_XSTRINGIFY(MUNIT_TEST_NAME_LEN) "s", + test_name); + + if (test->parameters == NULL) { + /* No parameters. Simple, nice. */ + munit_test_runner_run_test_with_params(runner, test, NULL); + } else { + fputc('\n', MUNIT_OUTPUT_FILE); + + for (pe = test->parameters; pe != NULL && pe->name != NULL; pe++) { + /* Did we received a value for this parameter from the CLI? */ + filled = 0; + for (cli_p = runner->parameters; cli_p != NULL && cli_p->name != NULL; + cli_p++) { + if (strcmp(cli_p->name, pe->name) == 0) { + if (MUNIT_UNLIKELY(munit_parameters_add(¶ms_l, ¶ms, pe->name, + cli_p->value) != MUNIT_OK)) + goto cleanup; + filled = 1; + break; + } + } + if (filled) + continue; + + /* Nothing from CLI, is the enum NULL/empty? We're not a + * fuzzer… */ + if (pe->values == NULL || pe->values[0] == NULL) + continue; + + /* If --single was passed to the CLI, choose a value from the + * list of possibilities randomly. */ + if (runner->single_parameter_mode) { + possible = 0; + for (vals = pe->values; *vals != NULL; vals++) + possible++; + /* We want the tests to be reproducible, even if you're only + * running a single test, but we don't want every test with + * the same number of parameters to choose the same parameter + * number, so use the test name as a primitive salt. */ + pidx = (int)munit_rand_at_most(munit_str_hash(test_name), possible - 1); + if (MUNIT_UNLIKELY(munit_parameters_add(¶ms_l, ¶ms, pe->name, + pe->values[pidx]) != MUNIT_OK)) + goto cleanup; + } else { + /* We want to try every permutation. Put in a placeholder + * entry, we'll iterate through them later. */ + if (MUNIT_UNLIKELY(munit_parameters_add(&wild_params_l, &wild_params, + pe->name, NULL) != MUNIT_OK)) + goto cleanup; + } + } + + if (wild_params_l != 0) { + first_wild = params_l; + for (wp = wild_params; wp != NULL && wp->name != NULL; wp++) { + for (pe = test->parameters; + pe != NULL && pe->name != NULL && pe->values != NULL; pe++) { + if (strcmp(wp->name, pe->name) == 0) { + if (MUNIT_UNLIKELY(munit_parameters_add(¶ms_l, ¶ms, + pe->name, + pe->values[0]) != MUNIT_OK)) + goto cleanup; + } + } + } + + munit_test_runner_run_test_wild(runner, test, test_name, params, + params + first_wild); + } else { + munit_test_runner_run_test_with_params(runner, test, params); + } + + cleanup: + free(params); + free(wild_params); + } + + munit_maybe_free_concat(test_name, prefix, test->name); +} + +/* Recurse through the suite and run all the tests. If a list of + * tests to run was provied on the command line, run only those + * tests. */ +static void munit_test_runner_run_suite(MunitTestRunner *runner, + const MunitSuite *suite, + const char *prefix) { + size_t pre_l; + char *pre = munit_maybe_concat(&pre_l, (char *)prefix, (char *)suite->prefix); + const MunitTest *test; + const char **test_name; + const MunitSuite *child_suite; + + /* Run the tests. */ + for (test = suite->tests; test != NULL && test->test != NULL; test++) { + if (runner->tests != NULL) { /* Specific tests were requested on the CLI */ + for (test_name = runner->tests; test_name != NULL && *test_name != NULL; + test_name++) { + if ((pre_l == 0 || strncmp(pre, *test_name, pre_l) == 0) && + strncmp(test->name, *test_name + pre_l, + strlen(*test_name + pre_l)) == 0) { + munit_test_runner_run_test(runner, test, pre); + if (runner->fatal_failures && + (runner->report.failed != 0 || runner->report.errored != 0)) + goto cleanup; + } + } + } else { /* Run all tests */ + munit_test_runner_run_test(runner, test, pre); + } + } + + if (runner->fatal_failures && + (runner->report.failed != 0 || runner->report.errored != 0)) + goto cleanup; + + /* Run any child suites. */ + for (child_suite = suite->suites; + child_suite != NULL && child_suite->prefix != NULL; child_suite++) { + munit_test_runner_run_suite(runner, child_suite, pre); + } + +cleanup: + + munit_maybe_free_concat(pre, prefix, suite->prefix); +} + +static void munit_test_runner_run(MunitTestRunner *runner) { + munit_test_runner_run_suite(runner, runner->suite, NULL); +} + +static void munit_print_help(int argc, char *const *argv, void *user_data, + const MunitArgument arguments[]) { + const MunitArgument *arg; + (void)argc; + + printf("USAGE: %s [OPTIONS...] [TEST...]\n\n", argv[0]); + puts( + " --seed SEED\n" + " Value used to seed the PRNG. Must be a 32-bit integer in " + "decimal\n" + " notation with no separators (commas, decimals, spaces, " + "etc.), or\n" + " hexidecimal prefixed by \"0x\".\n" + " --iterations N\n" + " Run each test N times. 0 means the default number.\n" + " --param name value\n" + " A parameter key/value pair which will be passed to any test " + "with\n" + " takes a parameter of that name. If not provided, the test " + "will be\n" + " run once for each possible parameter value.\n" + " --list Write a list of all available tests.\n" + " --list-params\n" + " Write a list of all available tests and their possible " + "parameters.\n" + " --single Run each parameterized test in a single configuration " + "instead of\n" + " every possible combination\n" + " --log-visible debug|info|warning|error\n" + " --log-fatal debug|info|warning|error\n" + " Set the level at which messages of different severities are " + "visible,\n" + " or cause the test to terminate.\n" +#if !defined(MUNIT_NO_FORK) + " --no-fork Do not execute tests in a child process. If this option is " + "supplied\n" + " and a test crashes (including by failing an assertion), no " + "further\n" + " tests will be performed.\n" +#endif + " --fatal-failures\n" + " Stop executing tests as soon as a failure is found.\n" + " --show-stderr\n" + " Show data written to stderr by the tests, even if the test " + "succeeds.\n" + " --color auto|always|never\n" + " Colorize (or don't) the output.\n" + /* 12345678901234567890123456789012345678901234567890123456789012345678901234567890 + */ + " --help Print this help message and exit.\n"); +#if defined(MUNIT_NL_LANGINFO) + setlocale(LC_ALL, ""); + fputs((strcasecmp("UTF-8", nl_langinfo(CODESET)) == 0) ? "µnit" : "munit", + stdout); +#else + puts("munit"); +#endif + printf(" %d.%d.%d\n" + "Full documentation at: https://nemequ.github.io/munit/\n", + (MUNIT_CURRENT_VERSION >> 16) & 0xff, + (MUNIT_CURRENT_VERSION >> 8) & 0xff, + (MUNIT_CURRENT_VERSION >> 0) & 0xff); + for (arg = arguments; arg != NULL && arg->name != NULL; arg++) + arg->write_help(arg, user_data); +} + +static const MunitArgument * +munit_arguments_find(const MunitArgument arguments[], const char *name) { + const MunitArgument *arg; + + for (arg = arguments; arg != NULL && arg->name != NULL; arg++) + if (strcmp(arg->name, name) == 0) + return arg; + + return NULL; +} + +static void munit_suite_list_tests(const MunitSuite *suite, + munit_bool show_params, const char *prefix) { + size_t pre_l; + char *pre = munit_maybe_concat(&pre_l, (char *)prefix, (char *)suite->prefix); + const MunitTest *test; + const MunitParameterEnum *params; + munit_bool first; + char **val; + const MunitSuite *child_suite; + + for (test = suite->tests; test != NULL && test->name != NULL; test++) { + if (pre != NULL) + fputs(pre, stdout); + puts(test->name); + + if (show_params) { + for (params = test->parameters; params != NULL && params->name != NULL; + params++) { + fprintf(stdout, " - %s: ", params->name); + if (params->values == NULL) { + puts("Any"); + } else { + first = 1; + for (val = params->values; *val != NULL; val++) { + if (!first) { + fputs(", ", stdout); + } else { + first = 0; + } + fputs(*val, stdout); + } + putc('\n', stdout); + } + } + } + } + + for (child_suite = suite->suites; + child_suite != NULL && child_suite->prefix != NULL; child_suite++) { + munit_suite_list_tests(child_suite, show_params, pre); + } + + munit_maybe_free_concat(pre, prefix, suite->prefix); +} + +static munit_bool munit_stream_supports_ansi(FILE *stream) { +#if !defined(_WIN32) + return isatty(fileno(stream)); +#else + +# if !defined(__MINGW32__) + size_t ansicon_size = 0; +# endif + + if (isatty(fileno(stream))) { +# if !defined(__MINGW32__) + getenv_s(&ansicon_size, NULL, 0, "ANSICON"); + return ansicon_size != 0; +# else + return getenv("ANSICON") != NULL; +# endif + } + return 0; +#endif +} + +int munit_suite_main_custom(const MunitSuite *suite, void *user_data, int argc, + char *const *argv, + const MunitArgument arguments[]) { + int result = EXIT_FAILURE; + MunitTestRunner runner; + size_t parameters_size = 0; + size_t tests_size = 0; + int arg; + + char *envptr; + unsigned long ts; + char *endptr; + unsigned long long iterations; + MunitLogLevel level; + const MunitArgument *argument; + const char **runner_tests; + unsigned int tests_run; + unsigned int tests_total; + + runner.prefix = NULL; + runner.suite = NULL; + runner.tests = NULL; + runner.seed = 0; + runner.iterations = 0; + runner.parameters = NULL; + runner.single_parameter_mode = 0; + runner.user_data = NULL; + + runner.report.successful = 0; + runner.report.skipped = 0; + runner.report.failed = 0; + runner.report.errored = 0; +#if defined(MUNIT_ENABLE_TIMING) + runner.report.cpu_clock = 0; + runner.report.wall_clock = 0; +#endif + + runner.colorize = 0; +#if !defined(_WIN32) + runner.fork = 1; +#else + runner.fork = 0; +#endif + runner.show_stderr = 0; + runner.fatal_failures = 0; + runner.suite = suite; + runner.user_data = user_data; + runner.seed = munit_rand_generate_seed(); + runner.colorize = munit_stream_supports_ansi(MUNIT_OUTPUT_FILE); + + for (arg = 1; arg < argc; arg++) { + if (strncmp("--", argv[arg], 2) == 0) { + if (strcmp("seed", argv[arg] + 2) == 0) { + if (arg + 1 >= argc) { + munit_logf_internal(MUNIT_LOG_ERROR, stderr, + "%s requires an argument", argv[arg]); + goto cleanup; + } + + envptr = argv[arg + 1]; + ts = strtoul(argv[arg + 1], &envptr, 0); + if (*envptr != '\0' || ts > (~((munit_uint32_t)0U))) { + munit_logf_internal(MUNIT_LOG_ERROR, stderr, + "invalid value ('%s') passed to %s", + argv[arg + 1], argv[arg]); + goto cleanup; + } + runner.seed = (munit_uint32_t)ts; + + arg++; + } else if (strcmp("iterations", argv[arg] + 2) == 0) { + if (arg + 1 >= argc) { + munit_logf_internal(MUNIT_LOG_ERROR, stderr, + "%s requires an argument", argv[arg]); + goto cleanup; + } + + endptr = argv[arg + 1]; + iterations = strtoul(argv[arg + 1], &endptr, 0); + if (*endptr != '\0' || iterations > UINT_MAX) { + munit_logf_internal(MUNIT_LOG_ERROR, stderr, + "invalid value ('%s') passed to %s", + argv[arg + 1], argv[arg]); + goto cleanup; + } + + runner.iterations = (unsigned int)iterations; + + arg++; + } else if (strcmp("param", argv[arg] + 2) == 0) { + if (arg + 2 >= argc) { + munit_logf_internal(MUNIT_LOG_ERROR, stderr, + "%s requires two arguments", argv[arg]); + goto cleanup; + } + + runner.parameters = realloc(runner.parameters, sizeof(MunitParameter) * + (parameters_size + 2)); + if (runner.parameters == NULL) { + munit_log_internal(MUNIT_LOG_ERROR, stderr, + "failed to allocate memory"); + goto cleanup; + } + runner.parameters[parameters_size].name = (char *)argv[arg + 1]; + runner.parameters[parameters_size].value = (char *)argv[arg + 2]; + parameters_size++; + runner.parameters[parameters_size].name = NULL; + runner.parameters[parameters_size].value = NULL; + arg += 2; + } else if (strcmp("color", argv[arg] + 2) == 0) { + if (arg + 1 >= argc) { + munit_logf_internal(MUNIT_LOG_ERROR, stderr, + "%s requires an argument", argv[arg]); + goto cleanup; + } + + if (strcmp(argv[arg + 1], "always") == 0) + runner.colorize = 1; + else if (strcmp(argv[arg + 1], "never") == 0) + runner.colorize = 0; + else if (strcmp(argv[arg + 1], "auto") == 0) + runner.colorize = munit_stream_supports_ansi(MUNIT_OUTPUT_FILE); + else { + munit_logf_internal(MUNIT_LOG_ERROR, stderr, + "invalid value ('%s') passed to %s", + argv[arg + 1], argv[arg]); + goto cleanup; + } + + arg++; + } else if (strcmp("help", argv[arg] + 2) == 0) { + munit_print_help(argc, argv, user_data, arguments); + result = EXIT_SUCCESS; + goto cleanup; + } else if (strcmp("single", argv[arg] + 2) == 0) { + runner.single_parameter_mode = 1; + } else if (strcmp("show-stderr", argv[arg] + 2) == 0) { + runner.show_stderr = 1; +#if !defined(_WIN32) + } else if (strcmp("no-fork", argv[arg] + 2) == 0) { + runner.fork = 0; +#endif + } else if (strcmp("fatal-failures", argv[arg] + 2) == 0) { + runner.fatal_failures = 1; + } else if (strcmp("log-visible", argv[arg] + 2) == 0 || + strcmp("log-fatal", argv[arg] + 2) == 0) { + if (arg + 1 >= argc) { + munit_logf_internal(MUNIT_LOG_ERROR, stderr, + "%s requires an argument", argv[arg]); + goto cleanup; + } + + if (strcmp(argv[arg + 1], "debug") == 0) + level = MUNIT_LOG_DEBUG; + else if (strcmp(argv[arg + 1], "info") == 0) + level = MUNIT_LOG_INFO; + else if (strcmp(argv[arg + 1], "warning") == 0) + level = MUNIT_LOG_WARNING; + else if (strcmp(argv[arg + 1], "error") == 0) + level = MUNIT_LOG_ERROR; + else { + munit_logf_internal(MUNIT_LOG_ERROR, stderr, + "invalid value ('%s') passed to %s", + argv[arg + 1], argv[arg]); + goto cleanup; + } + + if (strcmp("log-visible", argv[arg] + 2) == 0) + munit_log_level_visible = level; + else + munit_log_level_fatal = level; + + arg++; + } else if (strcmp("list", argv[arg] + 2) == 0) { + munit_suite_list_tests(suite, 0, NULL); + result = EXIT_SUCCESS; + goto cleanup; + } else if (strcmp("list-params", argv[arg] + 2) == 0) { + munit_suite_list_tests(suite, 1, NULL); + result = EXIT_SUCCESS; + goto cleanup; + } else { + argument = munit_arguments_find(arguments, argv[arg] + 2); + if (argument == NULL) { + munit_logf_internal(MUNIT_LOG_ERROR, stderr, + "unknown argument ('%s')", argv[arg]); + goto cleanup; + } + + if (!argument->parse_argument(suite, user_data, &arg, argc, argv)) + goto cleanup; + } + } else { + runner_tests = + realloc((void *)runner.tests, sizeof(char *) * (tests_size + 2)); + if (runner_tests == NULL) { + munit_log_internal(MUNIT_LOG_ERROR, stderr, + "failed to allocate memory"); + goto cleanup; + } + runner.tests = runner_tests; + runner.tests[tests_size++] = argv[arg]; + runner.tests[tests_size] = NULL; + } + } + + fflush(stderr); + fprintf(MUNIT_OUTPUT_FILE, + "Running test suite with seed 0x%08" PRIx32 "...\n", runner.seed); + + munit_test_runner_run(&runner); + + tests_run = + runner.report.successful + runner.report.failed + runner.report.errored; + tests_total = tests_run + runner.report.skipped; + if (tests_run == 0) { + fprintf(stderr, "No tests run, %d (100%%) skipped.\n", + runner.report.skipped); + } else { + fprintf(MUNIT_OUTPUT_FILE, + "%d of %d (%0.0f%%) tests successful, %d (%0.0f%%) test skipped.\n", + runner.report.successful, tests_run, + (((double)runner.report.successful) / ((double)tests_run)) * 100.0, + runner.report.skipped, + (((double)runner.report.skipped) / ((double)tests_total)) * 100.0); + } + + if (runner.report.failed == 0 && runner.report.errored == 0) { + result = EXIT_SUCCESS; + } + +cleanup: + free(runner.parameters); + free((void *)runner.tests); + + return result; +} + +int munit_suite_main(const MunitSuite *suite, void *user_data, int argc, + char *const *argv) { + return munit_suite_main_custom(suite, user_data, argc, argv, NULL); +} + +static uint8_t hexchars[] = "0123456789abcdef"; + +static uint8_t *hexdump_addr(uint8_t *dest, size_t addr) { + size_t i; + uint8_t a; + + for (i = 0; i < 4; ++i) { + a = (addr >> (3 - i) * 8) & 0xff; + + *dest++ = hexchars[a >> 4]; + *dest++ = hexchars[a & 0xf]; + } + + return dest; +} + +static uint8_t *asciidump(uint8_t *dest, const uint8_t *data, size_t datalen) { + size_t i; + + *dest++ = '|'; + + for (i = 0; i < datalen; ++i) { + if (0x20 <= data[i] && data[i] <= 0x7e) { + *dest++ = data[i]; + } else { + *dest++ = '.'; + } + } + + *dest++ = '|'; + + return dest; +} + +static uint8_t *hexdump8(uint8_t *dest, const uint8_t *data, size_t datalen) { + size_t i; + + for (i = 0; i < datalen; ++i) { + *dest++ = hexchars[data[i] >> 4]; + *dest++ = hexchars[data[i] & 0xf]; + *dest++ = ' '; + } + + for (; i < 8; ++i) { + *dest++ = ' '; + *dest++ = ' '; + *dest++ = ' '; + } + + return dest; +} + +static uint8_t *hexdump16(uint8_t *dest, const uint8_t *data, size_t datalen) { + dest = hexdump8(dest, data, datalen < 8 ? datalen : 8); + *dest++ = ' '; + + if (datalen < 8) { + data = NULL; + datalen = 0; + } else { + data += 8; + datalen -= 8; + } + + dest = hexdump8(dest, data, datalen); + *dest++ = ' '; + + return dest; +} + +static uint8_t *hexdump_line(uint8_t *dest, const uint8_t *data, size_t datalen, + size_t addr) { + dest = hexdump_addr(dest, addr); + *dest++ = ' '; + *dest++ = ' '; + + dest = hexdump16(dest, data, datalen); + + dest = asciidump(dest, data, datalen); + + return dest; +} + +int munit_hexdump(FILE *fp, const void *data, size_t datalen) { + size_t offset = 0, n, len; + uint8_t buf[128], *p; + const uint8_t *s; + int repeated = 0; + + if (datalen == 0) { + return 0; + } + + for (; offset < datalen; offset += 16) { + n = datalen - offset; + s = (const uint8_t *)data + offset; + + if (n >= 16) { + n = 16; + + if (offset > 0) { + if (memcmp(s - 16, s, 16) == 0) { + if (repeated) { + continue; + } + + repeated = 1; + + if (fwrite("*\n", 1, 2, fp) < 2) { + return -1; + } + + continue; + } + + repeated = 0; + } + } + + p = hexdump_line(buf, s, n, offset); + *p++ = '\n'; + + len = (size_t)(p - buf); + + if (fwrite(buf, 1, len, fp) < len) { + return -1; + } + } + + p = hexdump_addr(buf, datalen); + *p++ = '\n'; + + len = (size_t)(p - buf); + + if (fwrite(buf, 1, len, fp) < len) { + return -1; + } + + return 0; +} + +int munit_hexdump_diff(FILE *fp, const void *a, size_t alen, const void *b, + size_t blen) { + size_t offset = 0, k, i, len, ncomp, maxlen, adoff = 0; + uint8_t buf[128], *p; + const uint8_t mk[2] = {'-', '+'}; + struct datasource { + const uint8_t *data; + size_t datalen; + const uint8_t *s; + size_t n; + } ds[] = {{a, alen, NULL, 0}, {b, blen, NULL, 0}}, *dp; + + maxlen = alen < blen ? blen : alen; + + for (; offset < maxlen; offset += 16) { + for (k = 0; k < 2; ++k) { + dp = &ds[k]; + + if (offset < dp->datalen) { + dp->s = (const uint8_t *)dp->data + offset; + dp->n = dp->datalen - offset; + + if (dp->n > 16) { + dp->n = 16; + } + } else { + dp->s = NULL; + dp->n = 0; + } + } + + if (ds[0].n == ds[1].n && memcmp(ds[0].s, ds[1].s, ds[0].n) == 0) { + continue; + } + + for (k = 0; k < 2; ++k) { + dp = &ds[k]; + + if (!dp->n) { + continue; + } + + p = buf; + *p++ = mk[k]; + *p++ = mk[k]; + *p++ = mk[k]; + *p++ = mk[k]; + + p = hexdump_line(p, dp->s, dp->n, offset); + *p++ = '\n'; + + len = (size_t)(p - buf); + + if (fwrite(buf, 1, len, fp) < len) { + return -1; + } + } + + if (!ds[0].n || !ds[1].n) { + continue; + } + + ncomp = ds[0].n < ds[1].n ? ds[0].n : ds[1].n; + + p = buf + 4 + 10; + + memset(buf, ' ', 4 + 78); + + for (i = 0; i < ncomp; ++i) { + if (ds[0].s[i] == ds[1].s[i]) { + *p++ = ' '; + *p++ = ' '; + } else { + adoff = 4 + 10 + 51 + i; + *(buf + adoff) = '^'; + + *p++ = '^'; + *p++ = '^'; + } + + *p++ = ' '; + + if (i == 7) { + *p++ = ' '; + } + } + + if (adoff) { + len = adoff + 1; + } else { + len = (size_t)(p - buf); + } + + buf[len++] = '\n'; + + if (fwrite(buf, 1, len, fp) < len) { + return -1; + } + } + + return 0; +} diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/munit.h b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/munit.h new file mode 100644 index 000000000000..e78a4801216b --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/munit.h @@ -0,0 +1,574 @@ +/* µnit Testing Framework + * Copyright (c) 2013-2017 Evan Nemerson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef MUNIT_H +#define MUNIT_H + +#include +#include +#include +#include + +#define MUNIT_VERSION(major, minor, revision) \ + (((major) << 16) | ((minor) << 8) | (revision)) + +#define MUNIT_CURRENT_VERSION MUNIT_VERSION(0, 4, 1) + +#if defined(_MSC_VER) && (_MSC_VER < 1600) +# define munit_int8_t __int8 +# define munit_uint8_t unsigned __int8 +# define munit_int16_t __int16 +# define munit_uint16_t unsigned __int16 +# define munit_int32_t __int32 +# define munit_uint32_t unsigned __int32 +# define munit_int64_t __int64 +# define munit_uint64_t unsigned __int64 +#else +# include +# define munit_int8_t int8_t +# define munit_uint8_t uint8_t +# define munit_int16_t int16_t +# define munit_uint16_t uint16_t +# define munit_int32_t int32_t +# define munit_uint32_t uint32_t +# define munit_int64_t int64_t +# define munit_uint64_t uint64_t +#endif + +#if defined(_MSC_VER) && (_MSC_VER < 1800) +# if !defined(PRIi8) +# define PRIi8 "i" +# endif +# if !defined(PRIi16) +# define PRIi16 "i" +# endif +# if !defined(PRIi32) +# define PRIi32 "i" +# endif +# if !defined(PRIi64) +# define PRIi64 "I64i" +# endif +# if !defined(PRId8) +# define PRId8 "d" +# endif +# if !defined(PRId16) +# define PRId16 "d" +# endif +# if !defined(PRId32) +# define PRId32 "d" +# endif +# if !defined(PRId64) +# define PRId64 "I64d" +# endif +# if !defined(PRIx8) +# define PRIx8 "x" +# endif +# if !defined(PRIx16) +# define PRIx16 "x" +# endif +# if !defined(PRIx32) +# define PRIx32 "x" +# endif +# if !defined(PRIx64) +# define PRIx64 "I64x" +# endif +# if !defined(PRIu8) +# define PRIu8 "u" +# endif +# if !defined(PRIu16) +# define PRIu16 "u" +# endif +# if !defined(PRIu32) +# define PRIu32 "u" +# endif +# if !defined(PRIu64) +# define PRIu64 "I64u" +# endif +#else +# include +#endif + +#if !defined(munit_bool) +# if defined(bool) +# define munit_bool bool +# elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +# define munit_bool _Bool +# else +# define munit_bool int +# endif +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +#if defined(__GNUC__) +# define MUNIT_LIKELY(expr) (__builtin_expect((expr), 1)) +# define MUNIT_UNLIKELY(expr) (__builtin_expect((expr), 0)) +# define MUNIT_UNUSED __attribute__((__unused__)) +#else +# define MUNIT_LIKELY(expr) (expr) +# define MUNIT_UNLIKELY(expr) (expr) +# define MUNIT_UNUSED +#endif + +#if !defined(_WIN32) +# define MUNIT_SIZE_MODIFIER "z" +# define MUNIT_CHAR_MODIFIER "hh" +# define MUNIT_SHORT_MODIFIER "h" +#else +# if defined(_M_X64) || defined(__amd64__) +# define MUNIT_SIZE_MODIFIER "I64" +# else +# define MUNIT_SIZE_MODIFIER "" +# endif +# define MUNIT_CHAR_MODIFIER "" +# define MUNIT_SHORT_MODIFIER "" +#endif + +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L +# define MUNIT_NO_RETURN _Noreturn +#elif defined(__GNUC__) +# define MUNIT_NO_RETURN __attribute__((__noreturn__)) +#elif defined(_MSC_VER) +# define MUNIT_NO_RETURN __declspec(noreturn) +#else +# define MUNIT_NO_RETURN +#endif + +#if defined(_MSC_VER) && (_MSC_VER >= 1500) +# define MUNIT_PUSH_DISABLE_MSVC_C4127_ \ + __pragma(warning(push)) __pragma(warning(disable : 4127)) +# define MUNIT_POP_DISABLE_MSVC_C4127_ __pragma(warning(pop)) +#else +# define MUNIT_PUSH_DISABLE_MSVC_C4127_ +# define MUNIT_POP_DISABLE_MSVC_C4127_ +#endif + +typedef enum { + MUNIT_LOG_DEBUG, + MUNIT_LOG_INFO, + MUNIT_LOG_WARNING, + MUNIT_LOG_ERROR +} MunitLogLevel; + +#if defined(__GNUC__) && !defined(__MINGW32__) +# define MUNIT_PRINTF(string_index, first_to_check) \ + __attribute__((format(printf, string_index, first_to_check))) +#else +# define MUNIT_PRINTF(string_index, first_to_check) +#endif + +MUNIT_PRINTF(4, 5) +void munit_logf_ex(MunitLogLevel level, const char *filename, int line, + const char *format, ...); + +#define munit_logf(level, format, ...) \ + munit_logf_ex(level, __FILE__, __LINE__, format, __VA_ARGS__) + +#define munit_log(level, msg) munit_logf(level, "%s", msg) + +MUNIT_NO_RETURN +MUNIT_PRINTF(3, 4) +void munit_errorf_ex(const char *filename, int line, const char *format, ...); + +#define munit_errorf(format, ...) \ + munit_errorf_ex(__FILE__, __LINE__, format, __VA_ARGS__) + +#define munit_error(msg) munit_errorf("%s", msg) + +#define munit_assert(expr) \ + do { \ + if (!MUNIT_LIKELY(expr)) { \ + munit_error("assertion failed: " #expr); \ + } \ + MUNIT_PUSH_DISABLE_MSVC_C4127_ \ + } while (0) MUNIT_POP_DISABLE_MSVC_C4127_ + +#define munit_assert_true(expr) \ + do { \ + if (!MUNIT_LIKELY(expr)) { \ + munit_error("assertion failed: " #expr " is not true"); \ + } \ + MUNIT_PUSH_DISABLE_MSVC_C4127_ \ + } while (0) MUNIT_POP_DISABLE_MSVC_C4127_ + +#define munit_assert_false(expr) \ + do { \ + if (!MUNIT_LIKELY(!(expr))) { \ + munit_error("assertion failed: " #expr " is not false"); \ + } \ + MUNIT_PUSH_DISABLE_MSVC_C4127_ \ + } while (0) MUNIT_POP_DISABLE_MSVC_C4127_ + +#define munit_assert_type_full(prefix, suffix, T, fmt, a, op, b) \ + do { \ + T munit_tmp_a_ = (a); \ + T munit_tmp_b_ = (b); \ + if (!(munit_tmp_a_ op munit_tmp_b_)) { \ + munit_errorf("assertion failed: %s %s %s (" prefix "%" fmt suffix \ + " %s " prefix "%" fmt suffix ")", \ + #a, #op, #b, munit_tmp_a_, #op, munit_tmp_b_); \ + } \ + MUNIT_PUSH_DISABLE_MSVC_C4127_ \ + } while (0) MUNIT_POP_DISABLE_MSVC_C4127_ + +#define munit_assert_type(T, fmt, a, op, b) \ + munit_assert_type_full("", "", T, fmt, a, op, b) + +#define munit_assert_char(a, op, b) \ + munit_assert_type_full("'\\x", "'", char, "02" MUNIT_CHAR_MODIFIER "x", a, \ + op, b) +#define munit_assert_uchar(a, op, b) \ + munit_assert_type_full("'\\x", "'", unsigned char, \ + "02" MUNIT_CHAR_MODIFIER "x", a, op, b) +#define munit_assert_short(a, op, b) \ + munit_assert_type(short, MUNIT_SHORT_MODIFIER "d", a, op, b) +#define munit_assert_ushort(a, op, b) \ + munit_assert_type(unsigned short, MUNIT_SHORT_MODIFIER "u", a, op, b) +#define munit_assert_int(a, op, b) munit_assert_type(int, "d", a, op, b) +#define munit_assert_uint(a, op, b) \ + munit_assert_type(unsigned int, "u", a, op, b) +#define munit_assert_long(a, op, b) munit_assert_type(long int, "ld", a, op, b) +#define munit_assert_ulong(a, op, b) \ + munit_assert_type(unsigned long int, "lu", a, op, b) +#define munit_assert_llong(a, op, b) \ + munit_assert_type(long long int, "lld", a, op, b) +#define munit_assert_ullong(a, op, b) \ + munit_assert_type(unsigned long long int, "llu", a, op, b) + +#define munit_assert_size(a, op, b) \ + munit_assert_type(size_t, MUNIT_SIZE_MODIFIER "u", a, op, b) +#define munit_assert_ssize(a, op, b) \ + munit_assert_type(ssize_t, MUNIT_SIZE_MODIFIER "d", a, op, b) + +#define munit_assert_float(a, op, b) munit_assert_type(float, "f", a, op, b) +#define munit_assert_double(a, op, b) munit_assert_type(double, "g", a, op, b) +#define munit_assert_ptr(a, op, b) \ + munit_assert_type(const void *, "p", a, op, b) + +#define munit_assert_int8(a, op, b) \ + munit_assert_type(munit_int8_t, PRIi8, a, op, b) +#define munit_assert_uint8(a, op, b) \ + munit_assert_type(munit_uint8_t, PRIu8, a, op, b) +#define munit_assert_int16(a, op, b) \ + munit_assert_type(munit_int16_t, PRIi16, a, op, b) +#define munit_assert_uint16(a, op, b) \ + munit_assert_type(munit_uint16_t, PRIu16, a, op, b) +#define munit_assert_int32(a, op, b) \ + munit_assert_type(munit_int32_t, PRIi32, a, op, b) +#define munit_assert_uint32(a, op, b) \ + munit_assert_type(munit_uint32_t, PRIu32, a, op, b) +#define munit_assert_int64(a, op, b) \ + munit_assert_type(munit_int64_t, PRIi64, a, op, b) +#define munit_assert_uint64(a, op, b) \ + munit_assert_type(munit_uint64_t, PRIu64, a, op, b) + +#define munit_assert_ptrdiff(a, op, b) \ + munit_assert_type(ptrdiff_t, "td", a, op, b) + +#define munit_assert_enum(T, a, op, b) munit_assert_type(T, "d", a, op, b) + +#define munit_assert_double_equal(a, b, precision) \ + do { \ + const double munit_tmp_a_ = (a); \ + const double munit_tmp_b_ = (b); \ + const double munit_tmp_diff_ = ((munit_tmp_a_ - munit_tmp_b_) < 0) \ + ? -(munit_tmp_a_ - munit_tmp_b_) \ + : (munit_tmp_a_ - munit_tmp_b_); \ + if (MUNIT_UNLIKELY(munit_tmp_diff_ > 1e-##precision)) { \ + munit_errorf("assertion failed: %s == %s (%0." #precision \ + "g == %0." #precision "g)", \ + #a, #b, munit_tmp_a_, munit_tmp_b_); \ + } \ + MUNIT_PUSH_DISABLE_MSVC_C4127_ \ + } while (0) MUNIT_POP_DISABLE_MSVC_C4127_ + +#include +#define munit_assert_string_equal(a, b) \ + do { \ + const char *munit_tmp_a_ = (a); \ + const char *munit_tmp_b_ = (b); \ + if (MUNIT_UNLIKELY(strcmp(munit_tmp_a_, munit_tmp_b_) != 0)) { \ + munit_hexdump_diff(stderr, munit_tmp_a_, strlen(munit_tmp_a_), \ + munit_tmp_b_, strlen(munit_tmp_b_)); \ + munit_errorf("assertion failed: string %s == %s (\"%s\" == \"%s\")", #a, \ + #b, munit_tmp_a_, munit_tmp_b_); \ + } \ + MUNIT_PUSH_DISABLE_MSVC_C4127_ \ + } while (0) MUNIT_POP_DISABLE_MSVC_C4127_ + +#define munit_assert_string_not_equal(a, b) \ + do { \ + const char *munit_tmp_a_ = (a); \ + const char *munit_tmp_b_ = (b); \ + if (MUNIT_UNLIKELY(strcmp(munit_tmp_a_, munit_tmp_b_) == 0)) { \ + munit_errorf("assertion failed: string %s != %s (\"%s\" == \"%s\")", #a, \ + #b, munit_tmp_a_, munit_tmp_b_); \ + } \ + MUNIT_PUSH_DISABLE_MSVC_C4127_ \ + } while (0) MUNIT_POP_DISABLE_MSVC_C4127_ + +#define munit_assert_memory_equal(size, a, b) \ + do { \ + const unsigned char *munit_tmp_a_ = (const unsigned char *)(a); \ + const unsigned char *munit_tmp_b_ = (const unsigned char *)(b); \ + const size_t munit_tmp_size_ = (size); \ + if (MUNIT_UNLIKELY(memcmp(munit_tmp_a_, munit_tmp_b_, munit_tmp_size_)) != \ + 0) { \ + size_t munit_tmp_pos_; \ + for (munit_tmp_pos_ = 0; munit_tmp_pos_ < munit_tmp_size_; \ + munit_tmp_pos_++) { \ + if (munit_tmp_a_[munit_tmp_pos_] != munit_tmp_b_[munit_tmp_pos_]) { \ + munit_hexdump_diff(stderr, munit_tmp_a_, size, munit_tmp_b_, size); \ + munit_errorf("assertion failed: memory %s == %s, at offset " \ + "%" MUNIT_SIZE_MODIFIER "u", \ + #a, #b, munit_tmp_pos_); \ + break; \ + } \ + } \ + } \ + MUNIT_PUSH_DISABLE_MSVC_C4127_ \ + } while (0) MUNIT_POP_DISABLE_MSVC_C4127_ + +#define munit_assert_memn_equal(a, a_size, b, b_size) \ + do { \ + const unsigned char *munit_tmp_a_ = (const unsigned char *)(a); \ + const unsigned char *munit_tmp_b_ = (const unsigned char *)(b); \ + const size_t munit_tmp_a_size_ = (a_size); \ + const size_t munit_tmp_b_size_ = (b_size); \ + if (MUNIT_UNLIKELY(munit_tmp_a_size_ != munit_tmp_b_size_) || \ + MUNIT_UNLIKELY(munit_tmp_a_size_ && memcmp(munit_tmp_a_, munit_tmp_b_, \ + munit_tmp_a_size_)) != 0) { \ + munit_hexdump_diff(stderr, munit_tmp_a_, munit_tmp_a_size_, \ + munit_tmp_b_, munit_tmp_b_size_); \ + munit_errorf("assertion failed: memory %s == %s", #a, #b); \ + } \ + MUNIT_PUSH_DISABLE_MSVC_C4127_ \ + } while (0) MUNIT_POP_DISABLE_MSVC_C4127_ + +#define munit_assert_memory_not_equal(size, a, b) \ + do { \ + const unsigned char *munit_tmp_a_ = (const unsigned char *)(a); \ + const unsigned char *munit_tmp_b_ = (const unsigned char *)(b); \ + const size_t munit_tmp_size_ = (size); \ + if (MUNIT_UNLIKELY(memcmp(munit_tmp_a_, munit_tmp_b_, munit_tmp_size_)) == \ + 0) { \ + munit_errorf("assertion failed: memory %s != %s (%zu bytes)", #a, #b, \ + munit_tmp_size_); \ + } \ + MUNIT_PUSH_DISABLE_MSVC_C4127_ \ + } while (0) MUNIT_POP_DISABLE_MSVC_C4127_ + +#define munit_assert_ptr_equal(a, b) munit_assert_ptr(a, ==, b) +#define munit_assert_ptr_not_equal(a, b) munit_assert_ptr(a, !=, b) +#define munit_assert_null(ptr) munit_assert_ptr(ptr, ==, NULL) +#define munit_assert_not_null(ptr) munit_assert_ptr(ptr, !=, NULL) +#define munit_assert_ptr_null(ptr) munit_assert_ptr(ptr, ==, NULL) +#define munit_assert_ptr_not_null(ptr) munit_assert_ptr(ptr, !=, NULL) + +/*** Memory allocation ***/ + +void *munit_malloc_ex(const char *filename, int line, size_t size); + +#define munit_malloc(size) munit_malloc_ex(__FILE__, __LINE__, (size)) + +#define munit_new(type) ((type *)munit_malloc(sizeof(type))) + +#define munit_calloc(nmemb, size) munit_malloc((nmemb) * (size)) + +#define munit_newa(type, nmemb) ((type *)munit_calloc((nmemb), sizeof(type))) + +/*** Random number generation ***/ + +void munit_rand_seed(munit_uint32_t seed); +munit_uint32_t munit_rand_uint32(void); +int munit_rand_int_range(int min, int max); +double munit_rand_double(void); +void munit_rand_memory(size_t size, munit_uint8_t *buffer); + +/*** Tests and Suites ***/ + +typedef enum { + /* Test successful */ + MUNIT_OK, + /* Test failed */ + MUNIT_FAIL, + /* Test was skipped */ + MUNIT_SKIP, + /* Test failed due to circumstances not intended to be tested + * (things like network errors, invalid parameter value, failure to + * allocate memory in the test harness, etc.). */ + MUNIT_ERROR +} MunitResult; + +typedef struct { + char *name; + char **values; +} MunitParameterEnum; + +typedef struct { + char *name; + char *value; +} MunitParameter; + +const char *munit_parameters_get(const MunitParameter params[], + const char *key); + +typedef enum { + MUNIT_TEST_OPTION_NONE = 0, + MUNIT_TEST_OPTION_SINGLE_ITERATION = 1 << 0, + MUNIT_TEST_OPTION_TODO = 1 << 1 +} MunitTestOptions; + +typedef MunitResult (*MunitTestFunc)(const MunitParameter params[], + void *user_data_or_fixture); +typedef void *(*MunitTestSetup)(const MunitParameter params[], void *user_data); +typedef void (*MunitTestTearDown)(void *fixture); + +typedef struct { + const char *name; + MunitTestFunc test; + MunitTestSetup setup; + MunitTestTearDown tear_down; + MunitTestOptions options; + MunitParameterEnum *parameters; +} MunitTest; + +typedef enum { MUNIT_SUITE_OPTION_NONE = 0 } MunitSuiteOptions; + +typedef struct MunitSuite_ MunitSuite; + +struct MunitSuite_ { + const char *prefix; + const MunitTest *tests; + const MunitSuite *suites; + unsigned int iterations; + MunitSuiteOptions options; +}; + +int munit_suite_main(const MunitSuite *suite, void *user_data, int argc, + char *const *argv); + +/* Note: I'm not very happy with this API; it's likely to change if I + * figure out something better. Suggestions welcome. */ + +typedef struct MunitArgument_ MunitArgument; + +struct MunitArgument_ { + char *name; + munit_bool (*parse_argument)(const MunitSuite *suite, void *user_data, + int *arg, int argc, char *const *argv); + void (*write_help)(const MunitArgument *argument, void *user_data); +}; + +int munit_suite_main_custom(const MunitSuite *suite, void *user_data, int argc, + char *const *argv, const MunitArgument arguments[]); + +#if defined(MUNIT_ENABLE_ASSERT_ALIASES) + +# define assert_true(expr) munit_assert_true(expr) +# define assert_false(expr) munit_assert_false(expr) +# define assert_char(a, op, b) munit_assert_char(a, op, b) +# define assert_uchar(a, op, b) munit_assert_uchar(a, op, b) +# define assert_short(a, op, b) munit_assert_short(a, op, b) +# define assert_ushort(a, op, b) munit_assert_ushort(a, op, b) +# define assert_int(a, op, b) munit_assert_int(a, op, b) +# define assert_uint(a, op, b) munit_assert_uint(a, op, b) +# define assert_long(a, op, b) munit_assert_long(a, op, b) +# define assert_ulong(a, op, b) munit_assert_ulong(a, op, b) +# define assert_llong(a, op, b) munit_assert_llong(a, op, b) +# define assert_ullong(a, op, b) munit_assert_ullong(a, op, b) +# define assert_size(a, op, b) munit_assert_size(a, op, b) +# define assert_ssize(a, op, b) munit_assert_ssize(a, op, b) +# define assert_float(a, op, b) munit_assert_float(a, op, b) +# define assert_double(a, op, b) munit_assert_double(a, op, b) +# define assert_ptr(a, op, b) munit_assert_ptr(a, op, b) + +# define assert_int8(a, op, b) munit_assert_int8(a, op, b) +# define assert_uint8(a, op, b) munit_assert_uint8(a, op, b) +# define assert_int16(a, op, b) munit_assert_int16(a, op, b) +# define assert_uint16(a, op, b) munit_assert_uint16(a, op, b) +# define assert_int32(a, op, b) munit_assert_int32(a, op, b) +# define assert_uint32(a, op, b) munit_assert_uint32(a, op, b) +# define assert_int64(a, op, b) munit_assert_int64(a, op, b) +# define assert_uint64(a, op, b) munit_assert_uint64(a, op, b) + +# define assert_ptrdiff(a, op, b) munit_assert_ptrdiff(a, op, b) + +# define assert_enum(T, a, op, b) munit_assert_enum(T, a, op, b) + +# define assert_double_equal(a, b, precision) \ + munit_assert_double_equal(a, b, precision) +# define assert_string_equal(a, b) munit_assert_string_equal(a, b) +# define assert_string_not_equal(a, b) munit_assert_string_not_equal(a, b) +# define assert_memory_equal(size, a, b) munit_assert_memory_equal(size, a, b) +# define assert_memn_equal(a, a_size, b, b_size) \ + munit_assert_memn_equal(a, a_size, b, b_size) +# define assert_memory_not_equal(size, a, b) \ + munit_assert_memory_not_equal(size, a, b) +# define assert_ptr_equal(a, b) munit_assert_ptr_equal(a, b) +# define assert_ptr_not_equal(a, b) munit_assert_ptr_not_equal(a, b) +# define assert_ptr_null(ptr) munit_assert_null_equal(ptr) +# define assert_ptr_not_null(ptr) munit_assert_not_null(ptr) + +# define assert_null(ptr) munit_assert_null(ptr) +# define assert_not_null(ptr) munit_assert_not_null(ptr) + +#endif /* defined(MUNIT_ENABLE_ASSERT_ALIASES) */ + +#define munit_void_test_decl(func) \ + void func(void); \ + \ + static inline MunitResult wrap_##func(const MunitParameter params[], \ + void *fixture) { \ + (void)params; \ + (void)fixture; \ + \ + func(); \ + return MUNIT_OK; \ + } + +#define munit_void_test(func) \ + {"/" #func, wrap_##func, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL} + +#define munit_test_end() {NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL} + +int munit_hexdump(FILE *fp, const void *data, size_t datalen); + +int munit_hexdump_diff(FILE *fp, const void *a, size_t alen, const void *b, + size_t blen); + +#if defined(__cplusplus) +} +#endif + +#endif /* !defined(MUNIT_H) */ + +#if defined(MUNIT_ENABLE_ASSERT_ALIASES) +#if defined(assert) +# undef assert +#endif +#define assert(expr) munit_assert(expr) +#endif diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/munitxx.h b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/munitxx.h new file mode 100644 index 000000000000..8f9d7830c9c3 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/munit/munitxx.h @@ -0,0 +1,94 @@ +/* µnit Testing Framework + * Copyright (c) 2013-2017 Evan Nemerson + * Copyright (c) 2023 munit contributors + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef MUNITXX_H +#define MUNITXX_H + +#include + +#include +#include +#if __cplusplus >= 201703L +# include +#endif // __cplusplus >= 201703L + +#define munit_assert_stdstring_equal(a, b) \ + do { \ + const std::string munit_tmp_a_ = (a); \ + const std::string munit_tmp_b_ = (b); \ + if (MUNIT_UNLIKELY(munit_tmp_a_ != munit_tmp_b_)) { \ + munit_hexdump_diff(stderr, munit_tmp_a_.c_str(), munit_tmp_a_.size(), \ + munit_tmp_b_.c_str(), munit_tmp_b_.size()); \ + munit_errorf("assertion failed: string %s == %s (\"%s\" == \"%s\")", #a, \ + #b, munit_tmp_a_.c_str(), munit_tmp_b_.c_str()); \ + } \ + MUNIT_PUSH_DISABLE_MSVC_C4127_ \ + } while (0) MUNIT_POP_DISABLE_MSVC_C4127_ + +#if __cplusplus >= 201703L +# define munit_assert_stdsv_equal(a, b) \ + do { \ + const std::string_view munit_tmp_a_ = (a); \ + const std::string_view munit_tmp_b_ = (b); \ + if (MUNIT_UNLIKELY(munit_tmp_a_ != munit_tmp_b_)) { \ + munit_hexdump_diff(stderr, munit_tmp_a_.data(), munit_tmp_a_.size(), \ + munit_tmp_b_.data(), munit_tmp_b_.size()); \ + munit_errorf( \ + "assertion failed: string %s == %s (\"%.*s\" == \"%.*s\")", #a, #b, \ + (int)munit_tmp_a_.size(), munit_tmp_a_.data(), \ + (int)munit_tmp_b_.size(), munit_tmp_b_.data()); \ + } \ + MUNIT_PUSH_DISABLE_MSVC_C4127_ \ + } while (0) MUNIT_POP_DISABLE_MSVC_C4127_ +#endif // __cplusplus >= 201703L + +#define munit_assert_enum_class(a, op, b) \ + do { \ + auto munit_tmp_a_ = (a); \ + auto munit_tmp_b_ = (b); \ + if (!(munit_tmp_a_ op munit_tmp_b_)) { \ + auto munit_tmp_a_str_ = std::to_string( \ + static_cast>( \ + munit_tmp_a_)); \ + auto munit_tmp_b_str_ = std::to_string( \ + static_cast>( \ + munit_tmp_b_)); \ + munit_errorf("assertion failed: %s %s %s (%s %s %s)", #a, #op, #b, \ + munit_tmp_a_str_.c_str(), #op, munit_tmp_b_str_.c_str()); \ + } \ + MUNIT_PUSH_DISABLE_MSVC_C4127_ \ + } while (0) MUNIT_POP_DISABLE_MSVC_C4127_ + +#if defined(MUNIT_ENABLE_ASSERT_ALIASES) + +# define assert_stdstring_equal(a, b) munit_assert_stdstring_equal(a, b) +# if __cplusplus >= 201703L +# define assert_stdsv_equal(a, b) munit_assert_stdsv_equal(a, b) +# endif // __cplusplus >= 201703L +# define assert_enum_class(a, op, b) munit_assert_enum_class(a, op, b) + +#endif /* defined(MUNIT_ENABLE_ASSERT_ALIASES) */ + +#endif // MUNITXX_H diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse.c b/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse.c new file mode 100644 index 000000000000..3e00da5eb0cf --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse.c @@ -0,0 +1,635 @@ +/* + * urlparse + * + * Copyright (c) 2024 urlparse contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "urlparse.h" + +#include +#include + +#define ALPHAS \ + ['A'] = 1, ['B'] = 1, ['C'] = 1, ['D'] = 1, ['E'] = 1, ['F'] = 1, ['G'] = 1, \ + ['H'] = 1, ['I'] = 1, ['J'] = 1, ['K'] = 1, ['L'] = 1, ['M'] = 1, ['N'] = 1, \ + ['O'] = 1, ['P'] = 1, ['Q'] = 1, ['R'] = 1, ['S'] = 1, ['T'] = 1, ['U'] = 1, \ + ['V'] = 1, ['W'] = 1, ['X'] = 1, ['Y'] = 1, ['Z'] = 1, ['a'] = 1, ['b'] = 1, \ + ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1, ['g'] = 1, ['h'] = 1, ['i'] = 1, \ + ['j'] = 1, ['k'] = 1, ['l'] = 1, ['m'] = 1, ['n'] = 1, ['o'] = 1, ['p'] = 1, \ + ['q'] = 1, ['r'] = 1, ['s'] = 1, ['t'] = 1, ['u'] = 1, ['v'] = 1, ['w'] = 1, \ + ['x'] = 1, ['y'] = 1, ['z'] = 1 + +#define DIGITS \ + ['0'] = 1, ['1'] = 1, ['2'] = 1, ['3'] = 1, ['4'] = 1, ['5'] = 1, ['6'] = 1, \ + ['7'] = 1, ['8'] = 1, ['9'] = 1 + +#define HEXDIGITS \ + DIGITS, ['A'] = 1, ['B'] = 1, ['C'] = 1, ['D'] = 1, ['E'] = 1, ['F'] = 1, \ + ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1 + +typedef struct urlparse_parser { + const char *begin; + const char *pos; + const char *end; +} urlparse_parser; + +static int urlparse_parser_eof(urlparse_parser *up) { + return up->pos == up->end; +} + +static void urlparse_url_set_field_data(urlparse_url *dest, int field, + const char *data, const char *start, + const char *end) { + dest->field_set |= (uint16_t)(1 << field); + dest->field_data[field].off = (uint16_t)(start - data); + dest->field_data[field].len = (uint16_t)(end - start); +} + +static const uint8_t scheme_chars[256] = { + ALPHAS, + [':'] = 2, + ['/'] = 3, + ['*'] = 3, +}; + +static int parse_scheme(urlparse_parser *up, urlparse_url *dest) { + const char *start; + + if (urlparse_parser_eof(up)) { + return URLPARSE_ERR_PARSE; + } + + switch (scheme_chars[(uint8_t)*up->pos]) { + case 0: + case 2: + return URLPARSE_ERR_PARSE; + case 1: + break; + case 3: + return 0; + } + + start = up->pos; + ++up->pos; + + for (; !urlparse_parser_eof(up); ++up->pos) { + switch (scheme_chars[(uint8_t)*up->pos]) { + case 0: + case 3: + return URLPARSE_ERR_PARSE; + case 1: + continue; + case 2: + goto fin; + } + } + + return URLPARSE_ERR_PARSE; + +fin: + urlparse_url_set_field_data(dest, URLPARSE_SCHEMA, up->begin, start, up->pos); + + return 0; +} + +static const uint8_t path_chars[256] = { + /* unreserved */ + DIGITS, + ALPHAS, + ['-'] = 1, + ['.'] = 1, + ['_'] = 1, + ['~'] = 1, + /* pct-encoded */ + ['%'] = 1, + /* sub-delims */ + ['!'] = 1, + ['$'] = 1, + ['&'] = 1, + ['\''] = 1, + ['('] = 1, + [')'] = 1, + ['*'] = 1, + ['+'] = 1, + [','] = 1, + [';'] = 1, + ['='] = 1, + /* extra */ + [':'] = 1, + ['@'] = 1, + ['/'] = 1, + /* http-parser allows the following characters as well. */ + ['"'] = 1, + ['<'] = 1, + ['>'] = 1, + ['['] = 1, + ['\\'] = 1, + [']'] = 1, + ['^'] = 1, + ['`'] = 1, + ['{'] = 1, + ['|'] = 1, + ['}'] = 1, + /* query found */ + ['?'] = 2, + /* fragment found */ + ['#'] = 2, +}; + +static int parse_path_abempty(urlparse_parser *up, urlparse_url *dest) { + const char *start; + + if (urlparse_parser_eof(up)) { + return 0; + } + + switch (*up->pos) { + case '?': + return 0; + case '/': + break; + case '*': + if (dest->field_set & (1 << URLPARSE_HOST)) { + return URLPARSE_ERR_PARSE; + } + + break; + default: + return URLPARSE_ERR_PARSE; + } + + start = up->pos++; + + for (; !urlparse_parser_eof(up); ++up->pos) { + switch (path_chars[(uint8_t)*up->pos]) { + case 0: + return URLPARSE_ERR_PARSE; + case 1: + continue; + case 2: + goto fin; + } + } + +fin: + urlparse_url_set_field_data(dest, URLPARSE_PATH, up->begin, start, up->pos); + + return 0; +} + +static const uint8_t userinfo_chars[256] = { + /* unreserved */ + DIGITS, + ALPHAS, + ['-'] = 1, + ['.'] = 1, + ['_'] = 1, + ['~'] = 1, + /* pct-encoded */ + ['%'] = 1, + /* sub-delims */ + ['!'] = 1, + ['$'] = 1, + ['&'] = 1, + ['\''] = 1, + ['('] = 1, + [')'] = 1, + ['*'] = 1, + ['+'] = 1, + [','] = 1, + [';'] = 1, + ['='] = 1, + [':'] = 1, + ['@'] = 2, +}; + +static int parse_userinfo(urlparse_parser *up, urlparse_url *dest) { + const char *start; + + assert(!urlparse_parser_eof(up)); + + start = up->pos; + + for (; !urlparse_parser_eof(up); ++up->pos) { + switch (userinfo_chars[(uint8_t)*up->pos]) { + case 0: + return URLPARSE_ERR_PARSE; + case 1: + continue; + case 2: + goto fin; + } + } + + return URLPARSE_ERR_PARSE; + +fin: + if (start != up->pos) { + urlparse_url_set_field_data(dest, URLPARSE_USERINFO, up->begin, start, + up->pos); + } + + ++up->pos; + + return 0; +} + +static const uint8_t host_chars[256] = { + DIGITS, ALPHAS, ['.'] = 1, ['-'] = 1, [':'] = 2, ['/'] = 2, ['?'] = 2, +}; + +static int parse_host(urlparse_parser *up, urlparse_url *dest) { + const char *start; + + assert(!urlparse_parser_eof(up)); + + start = up->pos; + + for (; !urlparse_parser_eof(up); ++up->pos) { + switch (host_chars[(uint8_t)*up->pos]) { + case 0: + return URLPARSE_ERR_PARSE; + case 1: + continue; + case 2: + break; + } + + break; + } + + if (start == up->pos) { + return URLPARSE_ERR_PARSE; + } + + urlparse_url_set_field_data(dest, URLPARSE_HOST, up->begin, start, up->pos); + + return 0; +} + +static const uint8_t ipv6_host_chars[256] = { + HEXDIGITS, [':'] = 1, ['.'] = 1, ['%'] = 2, [']'] = 3, +}; + +static const uint8_t ipv6_zone_chars[256] = { + DIGITS, ALPHAS, ['%'] = 1, ['.'] = 1, + ['-'] = 1, ['_'] = 1, ['~'] = 1, [']'] = 2, +}; + +static int parse_ipv6_host(urlparse_parser *up, urlparse_url *dest) { + const char *start, *zone_start; + + if (urlparse_parser_eof(up)) { + return URLPARSE_ERR_PARSE; + } + + start = up->pos; + + for (; !urlparse_parser_eof(up); ++up->pos) { + switch (ipv6_host_chars[(uint8_t)*up->pos]) { + case 0: + return URLPARSE_ERR_PARSE; + case 1: + continue; + case 2: + if (start == up->pos) { + return URLPARSE_ERR_PARSE; + } + + zone_start = up->pos; + + ++up->pos; + if (urlparse_parser_eof(up)) { + return URLPARSE_ERR_PARSE; + } + + for (; !urlparse_parser_eof(up); ++up->pos) { + switch (ipv6_zone_chars[(uint8_t)*up->pos]) { + case 0: + return URLPARSE_ERR_PARSE; + case 1: + continue; + case 2: + if (zone_start + 1 == up->pos) { + return URLPARSE_ERR_PARSE; + } + + goto fin; + } + } + + return URLPARSE_ERR_PARSE; + case 3: + goto fin; + } + } + + return URLPARSE_ERR_PARSE; + +fin: + if (start == up->pos) { + return URLPARSE_ERR_PARSE; + } + + urlparse_url_set_field_data(dest, URLPARSE_HOST, up->begin, start, up->pos); + + ++up->pos; + + return 0; +} + +static const uint8_t port_chars[256] = { + DIGITS, + ['/'] = 2, + ['?'] = 2, +}; + +static int parse_port(urlparse_parser *up, urlparse_url *dest) { + const char *start; + uint16_t port, d; + + if (urlparse_parser_eof(up)) { + /* http_parser disallows empty port. */ + return URLPARSE_ERR_PARSE; + } + + start = up->pos; + port = 0; + + for (; !urlparse_parser_eof(up); ++up->pos) { + switch (port_chars[(uint8_t)*up->pos]) { + case 0: + return URLPARSE_ERR_PARSE; + case 1: + if (port > UINT16_MAX / 10) { + return URLPARSE_ERR_PARSE; + } + + port *= 10; + d = (uint16_t)(*up->pos - '0'); + + if (port > UINT16_MAX - d) { + return URLPARSE_ERR_PARSE; + } + + port += d; + + break; + case 2: + /* http_parser disallows empty port. */ + if (start == up->pos) { + return URLPARSE_ERR_PARSE; + } + + goto fin; + } + } + +fin: + urlparse_url_set_field_data(dest, URLPARSE_PORT, up->begin, start, up->pos); + dest->port = port; + + return 0; +} + +static int parse_authority(urlparse_parser *up, urlparse_url *dest) { + const char *start; + int rv; + + if (urlparse_parser_eof(up)) { + return URLPARSE_ERR_PARSE; + } + + if (*up->pos == '[') { + ++up->pos; + + rv = parse_ipv6_host(up, dest); + if (rv != 0) { + return rv; + } + } else { + start = up->pos; + + rv = parse_host(up, dest); + if (rv == 0) { + if (urlparse_parser_eof(up) || *up->pos != ':') { + return 0; + } + + ++up->pos; + + rv = parse_port(up, dest); + if (rv == 0) { + return 0; + } + } + + /* Rewind, and try parsing userinfo, and then host. */ + up->pos = start; + + rv = parse_userinfo(up, dest); + if (rv != 0) { + return rv; + } + + if (urlparse_parser_eof(up)) { + return URLPARSE_ERR_PARSE; + } + + if (*up->pos == '[') { + ++up->pos; + + rv = parse_ipv6_host(up, dest); + if (rv != 0) { + return rv; + } + } else { + rv = parse_host(up, dest); + if (rv != 0) { + return rv; + } + } + } + + if (urlparse_parser_eof(up) || *up->pos != ':') { + return 0; + } + + ++up->pos; + + return parse_port(up, dest); +} + +static const uint8_t extra_chars[256] = { + /* unreserved */ + DIGITS, + ALPHAS, + ['-'] = 1, + ['.'] = 1, + ['_'] = 1, + ['~'] = 1, + /* pct-encoded */ + ['%'] = 1, + /* sub-delims */ + ['!'] = 1, + ['$'] = 1, + ['&'] = 1, + ['\''] = 1, + ['('] = 1, + [')'] = 1, + ['*'] = 1, + ['+'] = 1, + [','] = 1, + [';'] = 1, + ['='] = 1, + /* extra */ + [':'] = 1, + ['@'] = 1, + /* query/fragment specific */ + ['/'] = 1, + ['?'] = 1, + /* http-parser allows the following characters as well. */ + ['"'] = 1, + ['<'] = 1, + ['>'] = 1, + ['['] = 1, + ['\\'] = 1, + [']'] = 1, + ['^'] = 1, + ['`'] = 1, + ['{'] = 1, + ['|'] = 1, + ['}'] = 1, + ['#'] = 2, +}; + +static int parse_extra(urlparse_parser *up, urlparse_url *dest, int field) { + const char *start; + + start = up->pos; + + for (; !urlparse_parser_eof(up); ++up->pos) { + switch (extra_chars[(uint8_t)*up->pos]) { + case 0: + return URLPARSE_ERR_PARSE; + case 1: + continue; + case 2: + if (field == URLPARSE_QUERY) { + goto fin; + } + + continue; + } + } + +fin: + if (start != up->pos) { + urlparse_url_set_field_data(dest, field, up->begin, start, up->pos); + } + + return 0; +} + +int urlparse_parse_url(const char *url, size_t urllen, int is_connect, + urlparse_url *dest) { + urlparse_parser up; + int rv; + + if (urllen == 0 || urllen > UINT16_MAX) { + return URLPARSE_ERR_PARSE; + } + + up.begin = url; + up.pos = url; + up.end = url + urllen; + + memset(dest, 0, sizeof(*dest)); + + if (is_connect) { + /* http_parser requires host:port when is_connect is nonzero. */ + rv = parse_authority(&up, dest); + if (rv != 0) { + return rv; + } + } else { + rv = parse_scheme(&up, dest); + if (rv != 0) { + return rv; + } + + if (dest->field_set & (1 << URLPARSE_SCHEMA)) { + if (up.end - up.pos < 3 || *up.pos != ':' || *(up.pos + 1) != '/' || + *(up.pos + 2) != '/') { + return URLPARSE_ERR_PARSE; + } + + up.pos += 3; + + rv = parse_authority(&up, dest); + if (rv != 0) { + return rv; + } + } + } + + rv = parse_path_abempty(&up, dest); + if (rv != 0) { + return rv; + } + + if (urlparse_parser_eof(&up)) { + goto fin; + } + + if (*up.pos == '?') { + ++up.pos; + + rv = parse_extra(&up, dest, URLPARSE_QUERY); + if (rv != 0) { + return rv; + } + } + + if (urlparse_parser_eof(&up)) { + goto fin; + } + + assert(*up.pos == '#'); + + ++up.pos; + + for (; !urlparse_parser_eof(&up) && *up.pos == '#'; ++up.pos) + ; + + rv = parse_extra(&up, dest, URLPARSE_FRAGMENT); + if (rv != 0) { + return rv; + } + +fin: + if (is_connect && + dest->field_set != ((1 << URLPARSE_HOST) | (1 << URLPARSE_PORT))) { + return URLPARSE_ERR_PARSE; + } + + return 0; +} diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse.h b/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse.h new file mode 100644 index 000000000000..8941ba27426a --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse.h @@ -0,0 +1,170 @@ +/* + * urlparse + * + * Copyright (c) 2024 urlparse contributors + * Copyright (c) 2023 sfparse contributors + * Copyright (c) 2019 nghttp3 contributors + * Copyright (c) 2015 nghttp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef URLPARSE_H +#define URLPARSE_H + +/* Define WIN32 when build target is Win32 API (borrowed from + libcurl) */ +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) +# define WIN32 +#endif /* (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) */ + +#ifdef __cplusplus +extern "C" { +#endif /* defined(__cplusplus) */ + +#if defined(_MSC_VER) && (_MSC_VER < 1800) +/* MSVC < 2013 does not have inttypes.h because it is not C99 + compliant. See compiler macros and version number in + https://sourceforge.net/p/predef/wiki/Compilers/ */ +# include +#else /* !(defined(_MSC_VER) && (_MSC_VER < 1800)) */ +# include +#endif /* !(defined(_MSC_VER) && (_MSC_VER < 1800)) */ +#include +#include + +/** + * @macro + * + * :macro:`URLPARSE_ERR_PARSE` indicates that an error occurred while + * the parser is processing a URL. + */ +#define URLPARSE_ERR_PARSE -1 + +/** + * @enum + * + * :type:`urlparse_url_fields` defines URL component fields. + */ +typedef enum urlparse_url_fields { + /** + * :enum:`URLPARSE_SCHEMA` is a URL scheme. + */ + URLPARSE_SCHEMA = 0, + /** + * :enum:`URLPARSE_HOST` is a host. + */ + URLPARSE_HOST = 1, + /** + * :enum:`URLPARSE_PORT` is a port. + */ + URLPARSE_PORT = 2, + /** + * :enum:`URLPARSE_PATH` is a path. + */ + URLPARSE_PATH = 3, + /** + * :enum:`URLPARSE_QUERY` is a query. + */ + URLPARSE_QUERY = 4, + /** + * :enum:`URLPARSE_FRAGMENT` is a fragment. + */ + URLPARSE_FRAGMENT = 5, + /** + * :enum:`URLPARSE_USERINFO` is a userinfo. + */ + URLPARSE_USERINFO = 6, + /** + * :enum:`URLPARSE_MAX` is the number of fields. + */ + URLPARSE_MAX = 7 +} urlparse_url_fields; + +/** + * @struct + * + * :type:`urlparse_url` is a struct to store the result of parsing a + * URL. + */ +typedef struct urlparse_url { + /** + * :member:`field_set` is a bitmask of (1 << :type:`URLPARSE_* + * `) values. + */ + uint16_t field_set; + /** + * :member:`port` is the integer representation of + * :enum:`URLPARSE_PORT ` string. + * It is assigned only when (:member:`field_set` & (1 << + * :enum:`URLPARSE_PORT `)) is + * nonzero. + */ + uint16_t port; + + /** + * @anonstruct_start + * + * @struct_urlparse_field_data + * + * :member:`field_data` stores the position and its length of each + * URL component if the corresponding bit is set in + * :member:`field_set`. For example, + * field_data[:enum:`URLPARSE_HOST + * `] is assigned if + * (:member:`field_set` & (1 << :enum:`URLPARSE_HOST + * `)) is nonzero. + */ + struct { + /** + * :member:`off` is an offset into buffer in which field starts. + */ + uint16_t off; + /** + * :member:`len` is a length of run in buffer. + */ + uint16_t len; + /** + * @anonstruct_end + */ + } field_data[URLPARSE_MAX]; +} urlparse_url; + +/** + * @function + * + * `urlparse_parse_url` parses |url| of length |urllen| bytes, and + * stores the result in |u|. If |is_connect| is nonzero, it parses + * the URL as a request target that appears in CONNECT request, that + * is, consisting of only the host and port number. + * + * This function initializes |u| before its use. If this function + * returns nonzero, |u| might not be initialized. + * + * This function returns 0 if it succeeds, or + * :macro:`URLPARSE_ERR_PARSE`. + */ +int urlparse_parse_url(const char *url, size_t urllen, int is_connect, + urlparse_url *u); + +#ifdef __cplusplus +} +#endif /* defined(__cplusplus) */ + +#endif /* !defined(URLPARSE_H) */ diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse_test.c b/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse_test.c new file mode 100644 index 000000000000..7339a253d126 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse_test.c @@ -0,0 +1,1128 @@ +/* + * urlparse + * + * Copyright (c) 2024 urlparse contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "urlparse_test.h" + +#include +#include +#include + +#include "urlparse.h" +#include "http-parser/http_parser.h" + +static const MunitTest tests[] = { + munit_void_test(test_urlparse_parse_url), + munit_test_end(), +}; + +const MunitSuite urlparse_suite = { + "/urlparse", tests, NULL, 1, MUNIT_SUITE_OPTION_NONE, +}; + +#define init_buffer(BUF, BUFLEN, S) \ + do { \ + (BUF) = malloc(sizeof(S) - 1); \ + memcpy((BUF), (S), sizeof(S) - 1); \ + (BUFLEN) = sizeof(S) - 1; \ + } while (0) + +#define assert_field_equal(URL, FIELD, BUF, EXPECTED) \ + do { \ + assert_true((URL).field_set & (1 << (FIELD))); \ + assert_memn_equal((EXPECTED), sizeof(EXPECTED) - 1, \ + (BUF) + (URL).field_data[(FIELD)].off, \ + (URL).field_data[(FIELD)].len); \ + } while (0) + +#define assert_field_unset(URL, FIELD) \ + assert_false((URL).field_set & (1 << (FIELD))) + +/* Copied from https://github.com/nodejs/http-parser */ +static void dump_url(const char *url, const urlparse_url *u) { + size_t i; + + fprintf(stderr, "\tfield_set: 0x%x, port: %u\n", u->field_set, u->port); + for (i = 0; i < URLPARSE_MAX; i++) { + if ((u->field_set & (1 << i)) == 0) { + fprintf(stderr, "\tfield_data[%zu]: unset\n", i); + continue; + } + + fprintf(stderr, "\tfield_data[%zu]: off: %u len: %u part: \"%.*s\"\n", i, + u->field_data[i].off, u->field_data[i].len, u->field_data[i].len, + url + u->field_data[i].off); + } +} + +#define assert_url(BUF, U1, U2) \ + do { \ + if (memcmp((U1), (U2), sizeof(urlparse_url)) == 0) { \ + break; \ + } \ + \ + dump_url((BUF), (urlparse_url *)(U1)); \ + dump_url((BUF), (U2)); \ + assert_memory_equal(sizeof(urlparse_url), (U1), (U2)); \ + } while (0) + +void test_urlparse_parse_url(void) { + char *b; + size_t blen; + urlparse_url u; + int rv; + struct http_parser_url hu; + + { + /* absempty */ + init_buffer(b, blen, "https://example.com/"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_equal(u, URLPARSE_PATH, b, "/"); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_QUERY); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* absempty + port */ + init_buffer(b, blen, "https://example.com:8080/foo"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_equal(u, URLPARSE_PORT, b, "8080"); + assert_uint16(8080, ==, u.port); + assert_field_equal(u, URLPARSE_PATH, b, "/foo"); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* port too large */ + init_buffer(b, blen, "https://example.com:65536/foo"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* leading zeros in port */ + init_buffer(b, blen, "https://example.com:0000443/foo"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_equal(u, URLPARSE_PORT, b, "0000443"); + assert_uint16(443, ==, u.port); + assert_field_equal(u, URLPARSE_PATH, b, "/foo"); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_QUERY); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* empty path */ + init_buffer(b, blen, "https://example.com"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_PATH); + assert_field_unset(u, URLPARSE_QUERY); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* userinfo */ + init_buffer(b, blen, "https://foo:bar@example.com/"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_USERINFO, b, "foo:bar"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_equal(u, URLPARSE_PATH, b, "/"); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* host:port like userinfo */ + init_buffer(b, blen, "https://foo:111@example.com/"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_USERINFO, b, "foo:111"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_equal(u, URLPARSE_PATH, b, "/"); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_QUERY); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* IPv6 host */ + init_buffer(b, blen, "https://[::1]/"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_HOST, b, "::1"); + assert_field_equal(u, URLPARSE_PATH, b, "/"); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* query */ + init_buffer(b, blen, "https://example.com/?foo/??"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_equal(u, URLPARSE_PATH, b, "/"); + assert_field_equal(u, URLPARSE_QUERY, b, "foo/??"); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* fragment */ + init_buffer(b, blen, "https://example.com/#?foo/??"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_equal(u, URLPARSE_PATH, b, "/"); + assert_field_equal(u, URLPARSE_FRAGMENT, b, "?foo/??"); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* path + fragment */ + init_buffer(b, blen, "https://example.com/?32423?fdaff#?foo/??"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_equal(u, URLPARSE_PATH, b, "/"); + assert_field_equal(u, URLPARSE_QUERY, b, "32423?fdaff"); + assert_field_equal(u, URLPARSE_FRAGMENT, b, "?foo/??"); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_PORT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* path_rootless */ + init_buffer(b, blen, "foo"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* path_absolute */ + init_buffer(b, blen, "/foo/bar"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_PATH, b, "/foo/bar"); + assert_field_unset(u, URLPARSE_SCHEMA); + assert_field_unset(u, URLPARSE_HOST); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_QUERY); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* is_connect */ + init_buffer(b, blen, "example.com:443"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 1, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_equal(u, URLPARSE_PORT, b, "443"); + assert_uint16(443, ==, u.port); + assert_field_unset(u, URLPARSE_SCHEMA); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_PATH); + assert_field_unset(u, URLPARSE_QUERY); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 1, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* is_connect without port */ + init_buffer(b, blen, "example.com"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 1, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 1, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* is_connect with empty port */ + init_buffer(b, blen, "example.com:"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 1, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 1, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* is_connect with scheme */ + init_buffer(b, blen, "https://example.com:443"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 1, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 1, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* empty scheme */ + init_buffer(b, blen, "://example.com:443"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* starts with "//" */ + init_buffer(b, blen, "//example.com:443"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_PATH, b, "//example.com:443"); + assert_field_unset(u, URLPARSE_SCHEMA); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_HOST); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_QUERY); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* no colon in first component */ + init_buffer(b, blen, "https/foo"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* '*' in scheme */ + init_buffer(b, blen, "https*://example.com"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* scheme contains a character that has the highest bit set, which + can make the char negative. */ + init_buffer(b, blen, + "https" + "\x80" + "://example.com"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* query starts with ?? */ + init_buffer(b, blen, "/foo??bar"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_PATH, b, "/foo"); + assert_field_equal(u, URLPARSE_QUERY, b, "?bar"); + assert_field_unset(u, URLPARSE_SCHEMA); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_HOST); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* fragment starts with ## */ + init_buffer(b, blen, "/foo##bar"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_PATH, b, "/foo"); + assert_field_equal(u, URLPARSE_FRAGMENT, b, "bar"); + assert_field_unset(u, URLPARSE_SCHEMA); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_HOST); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_QUERY); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* query after host */ + init_buffer(b, blen, "https://example.com?foo"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_equal(u, URLPARSE_QUERY, b, "foo"); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_PATH); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* query after port */ + init_buffer(b, blen, "https://example.com:8443?foo"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_equal(u, URLPARSE_PORT, b, "8443"); + assert_uint16(8443, ==, u.port); + assert_field_equal(u, URLPARSE_QUERY, b, "foo"); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_PATH); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* fragment after host */ + init_buffer(b, blen, "https://example.com#foo"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* fragment after port */ + init_buffer(b, blen, "https://example.com:8443#foo"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* query only */ + init_buffer(b, blen, "?foo"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* fragment only */ + init_buffer(b, blen, "#foo"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* host all chars */ + init_buffer( + b, blen, + "https://" + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal( + u, URLPARSE_HOST, b, + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-"); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_PATH); + assert_field_unset(u, URLPARSE_QUERY); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* IPv6 all chars */ + init_buffer( + b, blen, + "https://" + "[abcdefABCDEF0123456789:.%" + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789%.-_~]"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal( + u, URLPARSE_HOST, b, + "abcdefABCDEF0123456789:.%" + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789%.-_~"); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_PATH); + assert_field_unset(u, URLPARSE_QUERY); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* userinfo all chars */ + init_buffer(b, blen, + "https://" + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + "-._~%!$&'()*+,;=:@example.com"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_USERINFO, b, + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012" + "3456789-._~%!$&'()*+,;=:"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_PATH); + assert_field_unset(u, URLPARSE_QUERY); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* path all chars */ + init_buffer(b, blen, + "https://example.com/" + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + "-._~%!$&'()*+,;=:@/\"<>[\\]^`{|}"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_equal( + u, URLPARSE_PATH, b, + "/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + "-._~%!$&'()*+,;=:@/\"<>[\\]^`{|}"); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_QUERY); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* query all chars */ + init_buffer(b, blen, + "https://" + "example.com?" + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + "-._~%!$&'()*+,;=:@/?\"<>[\\]^`{|}"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_equal( + u, URLPARSE_QUERY, b, + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + "-._~%!$&'()*+,;=:@/?\"<>[\\]^`{|}"); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_PATH); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* fragment all chars */ + init_buffer(b, blen, + "https://" + "example.com/#" + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + "-._~%!$&'()*+,;=:@/?\"<>[\\]^`{|}"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_SCHEMA, b, "https"); + assert_field_equal(u, URLPARSE_HOST, b, "example.com"); + assert_field_equal(u, URLPARSE_PATH, b, "/"); + assert_field_equal( + u, URLPARSE_FRAGMENT, b, + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + "-._~%!$&'()*+,;=:@/?\"<>[\\]^`{|}"); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_QUERY); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* just * */ + init_buffer(b, blen, "*"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_PATH, b, "*"); + assert_field_unset(u, URLPARSE_SCHEMA); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_HOST); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_QUERY); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* just ** */ + init_buffer(b, blen, "**"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_PATH, b, "**"); + assert_field_unset(u, URLPARSE_SCHEMA); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_HOST); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_QUERY); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* ** followed by ? */ + init_buffer(b, blen, "**?foo"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_PATH, b, "**"); + assert_field_equal(u, URLPARSE_QUERY, b, "foo"); + assert_field_unset(u, URLPARSE_SCHEMA); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_HOST); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* just / */ + init_buffer(b, blen, "/"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_PATH, b, "/"); + assert_field_unset(u, URLPARSE_SCHEMA); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_HOST); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_QUERY); + assert_field_unset(u, URLPARSE_FRAGMENT); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* * flollowed by # */ + init_buffer(b, blen, "*#w#"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + assert_field_equal(u, URLPARSE_PATH, b, "*"); + assert_field_equal(u, URLPARSE_FRAGMENT, b, "w#"); + assert_field_unset(u, URLPARSE_SCHEMA); + assert_field_unset(u, URLPARSE_USERINFO); + assert_field_unset(u, URLPARSE_HOST); + assert_field_unset(u, URLPARSE_PORT); + assert_field_unset(u, URLPARSE_QUERY); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* bad IPv6 */ + init_buffer(b, blen, "mmm://[[[[[[[[)iomm://)mo"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* non-alpha scheme */ + init_buffer(b, blen, "c6://c:@N"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* unterminated IPv6 */ + init_buffer(b, blen, "Cc://[8"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* IPv6 followed by garbage */ + init_buffer(b, blen, "s://[F]*iiiiffy"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* empty IPv6 */ + init_buffer(b, blen, "h://@[]//2h:"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(URLPARSE_ERR_PARSE, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, !=, rv); + + free(b); + } + + { + /* is_connect with query */ + init_buffer(b, blen, "A:1?"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 1, &u); + + assert_int(0, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 1, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } + + { + /* long URL */ + init_buffer( + b, blen, + "https://" + "abcdefghijklmno2qrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%!$&'(" + ")*+,;=:@[abcdefABCDEF0123456789:.%" + "abcdefghijklmnopqrDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.~_%]:12345/" + "abcdefghijklmnopqrstuxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%!$&'()*" + "+,;=:@[abcdefABCDEF0123456789:.%" + "abcdefghijklmnopqrDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.~_%]:12345/" + "abcdefghijklmnopqrstuvwx$&'()*+,;=:@/" + "?\"<>[\\]^`{|}#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP<>[\\]^`{|}"); + + rv = urlparse_parse_url(b, blen, /* is_connect = */ 0, &u); + + assert_int(0, ==, rv); + + memset(&hu, 0, sizeof(hu)); + rv = http_parser_parse_url(b, blen, /* is_connect = */ 0, &hu); + + assert_int(0, ==, rv); + assert_url(b, &hu, &u); + + free(b); + } +} diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse_test.h b/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse_test.h new file mode 100644 index 000000000000..4aa11605cf81 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse_test.h @@ -0,0 +1,36 @@ +/* + * urlparse + * + * Copyright (c) 2024 urlparse contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef URLPARSE_TEST_H +#define URLPARSE_TEST_H + +#define MUNIT_ENABLE_ASSERT_ALIASES + +#include "munit.h" + +extern const MunitSuite urlparse_suite; + +munit_void_test_decl(test_urlparse_parse_url) + +#endif /* !defined(URLPARSE_TEST_H) */ diff --git a/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse_test_main.c b/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse_test_main.c new file mode 100644 index 000000000000..5998d9ac9475 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/third-party/urlparse/urlparse_test_main.c @@ -0,0 +1,46 @@ +/* + * urlparse + * + * Copyright (c) 2024 urlparse contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifdef HAVE_CONFIG_H +# include +#endif /* defined(HAVE_CONFIG_H) */ + +#include "munit.h" + +/* include test cases' include files here */ +#include "urlparse_test.h" +#include "http_parser_compat_test.h" + +int main(int argc, char *argv[]) { + const MunitSuite suites[] = { + urlparse_suite, + http_parser_compat_suite, + {NULL, NULL, NULL, 0, MUNIT_SUITE_OPTION_NONE}, + }; + const MunitSuite suite = { + "", NULL, suites, 1, MUNIT_SUITE_OPTION_NONE, + }; + + return munit_suite_main(&suite, NULL, argc, argv); +} diff --git a/deps/npm/docs/content/commands/npm-approve-scripts.md b/deps/npm/docs/content/commands/npm-approve-scripts.md index a89a250a769d..c4d3c15a8149 100644 --- a/deps/npm/docs/content/commands/npm-approve-scripts.md +++ b/deps/npm/docs/content/commands/npm-approve-scripts.md @@ -59,6 +59,14 @@ the command cannot infer. Existing `false` entries always win; `approve-scripts` will not silently re-allow a package you previously denied. +If a registry dependency has no `resolved` URL in your `package-lock.json` +(for example, an older lockfile or one written with +`omit-lockfile-registry-resolved`), npm cannot verify a trusted version for +it and cannot pin it: a `pkg@1.2.3` entry never matches, so the package +keeps appearing under `--allow-scripts-pending`. `approve-scripts` approves +these by name (`pkg: true`) and warns when it does. To restore pinning, +refresh the lockfile with `npm install`. + ### Examples ```bash diff --git a/deps/npm/docs/content/commands/npm-ci.md b/deps/npm/docs/content/commands/npm-ci.md index bc4600704596..741caf5eae70 100644 --- a/deps/npm/docs/content/commands/npm-ci.md +++ b/deps/npm/docs/content/commands/npm-ci.md @@ -74,8 +74,16 @@ Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted. +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted. + +We recommend that package authors use `--install-strategy=linked` during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +`import` of a package that was never added to `package.json` can fail +instead of resolving by accident and shipping broken. See [Catching +undeclared ("phantom") +dependencies](/using-npm/developers#catching-undeclared-phantom-dependencies). @@ -298,6 +306,10 @@ silently skipped; this setting only affects unreviewed entries. `--ignore-scripts` and `--dangerously-allow-all-scripts` both override this setting. +Optional dependencies that cannot be installed on the current platform or +engine (a non-matching `os`, `cpu`, or `libc`) are not flagged, because +their install scripts never run. + #### `dangerously-allow-all-scripts` diff --git a/deps/npm/docs/content/commands/npm-dedupe.md b/deps/npm/docs/content/commands/npm-dedupe.md index 8186ee2c1f31..a48bf1bd622e 100644 --- a/deps/npm/docs/content/commands/npm-dedupe.md +++ b/deps/npm/docs/content/commands/npm-dedupe.md @@ -74,8 +74,16 @@ Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted. +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted. + +We recommend that package authors use `--install-strategy=linked` during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +`import` of a package that was never added to `package.json` can fail +instead of resolving by accident and shipping broken. See [Catching +undeclared ("phantom") +dependencies](/using-npm/developers#catching-undeclared-phantom-dependencies). diff --git a/deps/npm/docs/content/commands/npm-exec.md b/deps/npm/docs/content/commands/npm-exec.md index 13a0939209a5..ff08d07786a8 100644 --- a/deps/npm/docs/content/commands/npm-exec.md +++ b/deps/npm/docs/content/commands/npm-exec.md @@ -194,6 +194,10 @@ silently skipped; this setting only affects unreviewed entries. `--ignore-scripts` and `--dangerously-allow-all-scripts` both override this setting. +Optional dependencies that cannot be installed on the current platform or +engine (a non-matching `os`, `cpu`, or `libc`) are not flagged, because +their install scripts never run. + #### `dangerously-allow-all-scripts` diff --git a/deps/npm/docs/content/commands/npm-find-dupes.md b/deps/npm/docs/content/commands/npm-find-dupes.md index 52bb59b9f81b..2d72186fe5a2 100644 --- a/deps/npm/docs/content/commands/npm-find-dupes.md +++ b/deps/npm/docs/content/commands/npm-find-dupes.md @@ -25,8 +25,16 @@ Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted. +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted. + +We recommend that package authors use `--install-strategy=linked` during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +`import` of a package that was never added to `package.json` can fail +instead of resolving by accident and shipping broken. See [Catching +undeclared ("phantom") +dependencies](/using-npm/developers#catching-undeclared-phantom-dependencies). diff --git a/deps/npm/docs/content/commands/npm-install-ci-test.md b/deps/npm/docs/content/commands/npm-install-ci-test.md index 4528f63dfe28..2194a4df84a8 100644 --- a/deps/npm/docs/content/commands/npm-install-ci-test.md +++ b/deps/npm/docs/content/commands/npm-install-ci-test.md @@ -27,8 +27,16 @@ Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted. +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted. + +We recommend that package authors use `--install-strategy=linked` during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +`import` of a package that was never added to `package.json` can fail +instead of resolving by accident and shipping broken. See [Catching +undeclared ("phantom") +dependencies](/using-npm/developers#catching-undeclared-phantom-dependencies). @@ -251,6 +259,10 @@ silently skipped; this setting only affects unreviewed entries. `--ignore-scripts` and `--dangerously-allow-all-scripts` both override this setting. +Optional dependencies that cannot be installed on the current platform or +engine (a non-matching `os`, `cpu`, or `libc`) are not flagged, because +their install scripts never run. + #### `dangerously-allow-all-scripts` diff --git a/deps/npm/docs/content/commands/npm-install-scripts.md b/deps/npm/docs/content/commands/npm-install-scripts.md new file mode 100644 index 000000000000..4182392c9a3d --- /dev/null +++ b/deps/npm/docs/content/commands/npm-install-scripts.md @@ -0,0 +1,166 @@ +--- +title: npm-install-scripts +section: 1 +description: Manage install-script approvals for dependencies +--- + +### Synopsis + +```bash +npm install-scripts approve [ ...] +npm install-scripts approve --all +npm install-scripts deny [ ...] +npm install-scripts deny --all +npm install-scripts ls +npm install-scripts prune +``` + +Note: This command is unaware of workspaces. + +### Description + +Manages the `allowScripts` field in your project's `package.json`, which +records which of your dependencies are permitted to run install scripts +(`preinstall`, `install`, `postinstall`, and `prepare` for non-registry +sources). This is the recommended way to maintain that field. + +Dependency install scripts are blocked by default. Install commands +silently skip lifecycle scripts for any dependency that does not have a +matching entry in `allowScripts`, and end with a list of the packages +whose scripts were skipped so you can review them here. + +This command only works inside a project that has a `package.json`. Running +it with `--global` (`-g`) fails with an `EGLOBAL` error, since global +installs (`npm install -g`) and one-off executions (`npm exec` / `npx`) have +no project `package.json` to write to. To allow install scripts in those +contexts, use the `--allow-scripts` flag at install time (for example +`npm install -g --allow-scripts=canvas,sharp`) or persist the setting with +`npm config set allow-scripts=canvas,sharp --location=user`. + +There are four subcommands: + +```bash +npm install-scripts approve [ ...] +npm install-scripts approve --all +npm install-scripts deny [ ...] +npm install-scripts deny --all +npm install-scripts ls +npm install-scripts prune +``` + +`approve` allows install scripts for the named packages. `` matches +every installed version of that package. By default it writes pinned entries +(`pkg@1.2.3`), which keep their approval narrowed to the specific version you +reviewed. Pass `--no-allow-scripts-pin` to write name-only entries that allow +any future version. `--all` approves every package with unreviewed install +scripts in one go. + +`deny` records an explicit denial for the named packages (a name-only `false` +entry), which survives `npm install-scripts approve --all` and excludes the +package from any future blanket approval. `--all` denies every package with +unreviewed install scripts. + +`ls` is read-only: it lists every package whose install scripts are not yet +covered by `allowScripts`, without modifying `package.json`. + +`prune` removes `allowScripts` entries that no longer match an installed +package with an install script, either because the package is no longer +installed (a transitive dependency changed, or a pinned `pkg@1.2.3` was +upgraded) or because it no longer has an install script. Both approvals +(`true`) and denials (`false`) are removed. It edits only the `allowScripts` +field in `package.json`, never `.npmrc` or `--allow-scripts`. Pass `--dry-run` +to preview without writing. Unparseable keys are left alone. + +`approve` honours the asymmetric pin rule: if you re-approve a package whose +installed version has changed, the existing pin is rewritten to track the new +installed version. Multi-version statements (`pkg@1 || 2`) are left alone, +since they likely capture intent that the command cannot infer. Existing +`false` entries always win; `approve` will not silently re-allow a package you +previously denied. + +The standalone commands [`npm approve-scripts`](/commands/npm-approve-scripts) +and [`npm deny-scripts`](/commands/npm-deny-scripts) are aliases for +`npm install-scripts approve` and `npm install-scripts deny`. + +### Examples + +```bash +# Approve all currently-installed install scripts after reviewing them +npm install-scripts approve --all + +# Approve specific packages, pinned to their installed version +npm install-scripts approve canvas sharp + +# Deny a package so it stays blocked +npm install-scripts deny telemetry-pkg + +# Preview which packages still need review +npm install-scripts ls + +# Preview stale allowScripts entries, then remove them +npm install-scripts prune --dry-run +npm install-scripts prune +``` + +### Configuration + +#### `all` + +* Default: false +* Type: Boolean + +Show or act on all packages, not just the ones your project directly depends +on. For `npm outdated` and `npm ls` this lists every outdated or installed +package. For `npm approve-scripts` and `npm deny-scripts` it selects every +package with pending install scripts. + + + +#### `allow-scripts-pin` + +* Default: true +* Type: Boolean + +Write pinned (`pkg@version`) entries when approving install scripts. Set to +`false` to write name-only entries that allow any version. Has no effect on +`npm deny-scripts`, which always writes name-only entries regardless of this +setting. + + + +#### `dry-run` + +* Default: false +* Type: Boolean + +Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, `install`, `update`, +`dedupe`, `uninstall`, as well as `pack` and `publish`. + +Note: This is NOT honored by other network related commands, eg `dist-tags`, +`owner`, etc. + + + +#### `json` + +* Default: false +* Type: Boolean + +Whether or not to output JSON data, rather than the normal output. + +* In `npm pkg set` it enables parsing set values with JSON.parse() before + saving them to your `package.json`. + +Not supported by all npm commands. + + + +### See Also + +* [npm approve-scripts](/commands/npm-approve-scripts) +* [npm deny-scripts](/commands/npm-deny-scripts) +* [npm install](/commands/npm-install) +* [npm rebuild](/commands/npm-rebuild) +* [package.json](/configuring-npm/package-json) diff --git a/deps/npm/docs/content/commands/npm-install-test.md b/deps/npm/docs/content/commands/npm-install-test.md index 44de058c56aa..e13f79a51e6f 100644 --- a/deps/npm/docs/content/commands/npm-install-test.md +++ b/deps/npm/docs/content/commands/npm-install-test.md @@ -68,8 +68,16 @@ Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted. +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted. + +We recommend that package authors use `--install-strategy=linked` during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +`import` of a package that was never added to `package.json` can fail +instead of resolving by accident and shipping broken. See [Catching +undeclared ("phantom") +dependencies](/using-npm/developers#catching-undeclared-phantom-dependencies). @@ -328,6 +336,10 @@ silently skipped; this setting only affects unreviewed entries. `--ignore-scripts` and `--dangerously-allow-all-scripts` both override this setting. +Optional dependencies that cannot be installed on the current platform or +engine (a non-matching `os`, `cpu`, or `libc`) are not flagged, because +their install scripts never run. + #### `dangerously-allow-all-scripts` @@ -375,6 +387,10 @@ sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one. +As with `min-release-age`, when this cutoff blocks a fix that `npm audit +fix` would install, npm keeps the vulnerable version, warns, and exits with +a non-zero code. + Packages whose names match `min-release-age-exclude` are exempt from this filter. @@ -397,6 +413,12 @@ your `.npmrc` is preserved when npm internally spawns a sub-process with apply, `before` wins within a single source and across sources the standard precedence rules apply. +When this window stops `npm audit fix` from installing a patched version +(because the fix was published too recently), npm keeps the package at its +vulnerable version, warns that the fix was blocked, and exits with a +non-zero code. To install the fix, add the package to +`min-release-age-exclude`, or relax `min-release-age` or `before`. + Packages whose names match `min-release-age-exclude` are exempt from this filter. diff --git a/deps/npm/docs/content/commands/npm-install.md b/deps/npm/docs/content/commands/npm-install.md index 5bd36c1fa453..98d69d5e8424 100644 --- a/deps/npm/docs/content/commands/npm-install.md +++ b/deps/npm/docs/content/commands/npm-install.md @@ -410,8 +410,16 @@ Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted. +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted. + +We recommend that package authors use `--install-strategy=linked` during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +`import` of a package that was never added to `package.json` can fail +instead of resolving by accident and shipping broken. See [Catching +undeclared ("phantom") +dependencies](/using-npm/developers#catching-undeclared-phantom-dependencies). @@ -670,6 +678,10 @@ silently skipped; this setting only affects unreviewed entries. `--ignore-scripts` and `--dangerously-allow-all-scripts` both override this setting. +Optional dependencies that cannot be installed on the current platform or +engine (a non-matching `os`, `cpu`, or `libc`) are not flagged, because +their install scripts never run. + #### `dangerously-allow-all-scripts` @@ -717,6 +729,10 @@ sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one. +As with `min-release-age`, when this cutoff blocks a fix that `npm audit +fix` would install, npm keeps the vulnerable version, warns, and exits with +a non-zero code. + Packages whose names match `min-release-age-exclude` are exempt from this filter. @@ -739,6 +755,12 @@ your `.npmrc` is preserved when npm internally spawns a sub-process with apply, `before` wins within a single source and across sources the standard precedence rules apply. +When this window stops `npm audit fix` from installing a patched version +(because the fix was published too recently), npm keeps the package at its +vulnerable version, warns that the fix was blocked, and exits with a +non-zero code. To install the fix, add the package to +`min-release-age-exclude`, or relax `min-release-age` or `before`. + Packages whose names match `min-release-age-exclude` are exempt from this filter. diff --git a/deps/npm/docs/content/commands/npm-link.md b/deps/npm/docs/content/commands/npm-link.md index 37efda66408f..fa9626c4edd8 100644 --- a/deps/npm/docs/content/commands/npm-link.md +++ b/deps/npm/docs/content/commands/npm-link.md @@ -138,8 +138,16 @@ Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted. +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted. + +We recommend that package authors use `--install-strategy=linked` during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +`import` of a package that was never added to `package.json` can fail +instead of resolving by accident and shipping broken. See [Catching +undeclared ("phantom") +dependencies](/using-npm/developers#catching-undeclared-phantom-dependencies). diff --git a/deps/npm/docs/content/commands/npm-ls.md b/deps/npm/docs/content/commands/npm-ls.md index ae8e64ada955..24746c173b7c 100644 --- a/deps/npm/docs/content/commands/npm-ls.md +++ b/deps/npm/docs/content/commands/npm-ls.md @@ -23,7 +23,7 @@ Note that nested packages will *also* show the paths to the specified packages. For example, running `npm ls promzard` in npm's source tree will show: ```bash -npm@11.17.0 /path/to/npm +npm@11.19.0 /path/to/npm └─┬ init-package-json@0.0.4 └── promzard@0.1.5 ``` diff --git a/deps/npm/docs/content/commands/npm-outdated.md b/deps/npm/docs/content/commands/npm-outdated.md index 1f368132c465..40f7e835a68a 100644 --- a/deps/npm/docs/content/commands/npm-outdated.md +++ b/deps/npm/docs/content/commands/npm-outdated.md @@ -172,6 +172,10 @@ sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one. +As with `min-release-age`, when this cutoff blocks a fix that `npm audit +fix` would install, npm keeps the vulnerable version, warns, and exits with +a non-zero code. + Packages whose names match `min-release-age-exclude` are exempt from this filter. @@ -194,6 +198,12 @@ your `.npmrc` is preserved when npm internally spawns a sub-process with apply, `before` wins within a single source and across sources the standard precedence rules apply. +When this window stops `npm audit fix` from installing a patched version +(because the fix was published too recently), npm keeps the package at its +vulnerable version, warns that the fix was blocked, and exits with a +non-zero code. To install the fix, add the package to +`min-release-age-exclude`, or relax `min-release-age` or `before`. + Packages whose names match `min-release-age-exclude` are exempt from this filter. diff --git a/deps/npm/docs/content/commands/npm-query.md b/deps/npm/docs/content/commands/npm-query.md index 83ea73188f7f..4349e47ad23e 100644 --- a/deps/npm/docs/content/commands/npm-query.md +++ b/deps/npm/docs/content/commands/npm-query.md @@ -284,6 +284,10 @@ sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one. +As with `min-release-age`, when this cutoff blocks a fix that `npm audit +fix` would install, npm keeps the vulnerable version, warns, and exits with +a non-zero code. + Packages whose names match `min-release-age-exclude` are exempt from this filter. @@ -306,6 +310,12 @@ your `.npmrc` is preserved when npm internally spawns a sub-process with apply, `before` wins within a single source and across sources the standard precedence rules apply. +When this window stops `npm audit fix` from installing a patched version +(because the fix was published too recently), npm keeps the package at its +vulnerable version, warns that the fix was blocked, and exits with a +non-zero code. To install the fix, add the package to +`min-release-age-exclude`, or relax `min-release-age` or `before`. + Packages whose names match `min-release-age-exclude` are exempt from this filter. diff --git a/deps/npm/docs/content/commands/npm-rebuild.md b/deps/npm/docs/content/commands/npm-rebuild.md index 18b1d37c7799..c70307a2a7fe 100644 --- a/deps/npm/docs/content/commands/npm-rebuild.md +++ b/deps/npm/docs/content/commands/npm-rebuild.md @@ -136,6 +136,10 @@ silently skipped; this setting only affects unreviewed entries. `--ignore-scripts` and `--dangerously-allow-all-scripts` both override this setting. +Optional dependencies that cannot be installed on the current platform or +engine (a non-matching `os`, `cpu`, or `libc`) are not flagged, because +their install scripts never run. + #### `dangerously-allow-all-scripts` diff --git a/deps/npm/docs/content/commands/npm-update.md b/deps/npm/docs/content/commands/npm-update.md index ee61e27dcda0..317f85f7d0db 100644 --- a/deps/npm/docs/content/commands/npm-update.md +++ b/deps/npm/docs/content/commands/npm-update.md @@ -177,8 +177,16 @@ Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted. +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted. + +We recommend that package authors use `--install-strategy=linked` during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +`import` of a package that was never added to `package.json` can fail +instead of resolving by accident and shipping broken. See [Catching +undeclared ("phantom") +dependencies](/using-npm/developers#catching-undeclared-phantom-dependencies). @@ -338,6 +346,10 @@ silently skipped; this setting only affects unreviewed entries. `--ignore-scripts` and `--dangerously-allow-all-scripts` both override this setting. +Optional dependencies that cannot be installed on the current platform or +engine (a non-matching `os`, `cpu`, or `libc`) are not flagged, because +their install scripts never run. + #### `dangerously-allow-all-scripts` @@ -385,6 +397,10 @@ sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one. +As with `min-release-age`, when this cutoff blocks a fix that `npm audit +fix` would install, npm keeps the vulnerable version, warns, and exits with +a non-zero code. + Packages whose names match `min-release-age-exclude` are exempt from this filter. @@ -407,6 +423,12 @@ your `.npmrc` is preserved when npm internally spawns a sub-process with apply, `before` wins within a single source and across sources the standard precedence rules apply. +When this window stops `npm audit fix` from installing a patched version +(because the fix was published too recently), npm keeps the package at its +vulnerable version, warns that the fix was blocked, and exits with a +non-zero code. To install the fix, add the package to +`min-release-age-exclude`, or relax `min-release-age` or `before`. + Packages whose names match `min-release-age-exclude` are exempt from this filter. diff --git a/deps/npm/docs/content/commands/npm.md b/deps/npm/docs/content/commands/npm.md index d924d23c0ece..769bb262064e 100644 --- a/deps/npm/docs/content/commands/npm.md +++ b/deps/npm/docs/content/commands/npm.md @@ -14,7 +14,7 @@ Note: This command is unaware of workspaces. ### Version -11.17.0 +11.19.0 ### Description diff --git a/deps/npm/docs/content/using-npm/config.md b/deps/npm/docs/content/using-npm/config.md index 6bbb68fdf565..5d951493e8a1 100644 --- a/deps/npm/docs/content/using-npm/config.md +++ b/deps/npm/docs/content/using-npm/config.md @@ -349,6 +349,10 @@ sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one. +As with `min-release-age`, when this cutoff blocks a fix that `npm audit +fix` would install, npm keeps the vulnerable version, warns, and exits with +a non-zero code. + Packages whose names match `min-release-age-exclude` are exempt from this filter. @@ -1029,8 +1033,16 @@ Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted. +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted. + +We recommend that package authors use `--install-strategy=linked` during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +`import` of a package that was never added to `package.json` can fail +instead of resolving by accident and shipping broken. See [Catching +undeclared ("phantom") +dependencies](/using-npm/developers#catching-undeclared-phantom-dependencies). @@ -1224,6 +1236,12 @@ your `.npmrc` is preserved when npm internally spawns a sub-process with apply, `before` wins within a single source and across sources the standard precedence rules apply. +When this window stops `npm audit fix` from installing a patched version +(because the fix was published too recently), npm keeps the package at its +vulnerable version, warns that the fix was blocked, and exits with a +non-zero code. To install the fix, add the package to +`min-release-age-exclude`, or relax `min-release-age` or `before`. + Packages whose names match `min-release-age-exclude` are exempt from this filter. @@ -1620,7 +1638,14 @@ registry (https://registry.npmjs.org) to the configured registry. If set to "never", then use the registry value. If set to "always", then replace the registry host with the configured host every time. -You may also specify a bare hostname (e.g., "registry.npmjs.org"). +You may also specify a bare hostname (e.g., "registry.npmjs.org") to only +replace URLs coming from that host. + +You may also specify a full URL including a path (e.g., +"https://old-registry.example.com/npm/path"). In that case, resolved URLs +whose host and path begin with that prefix will have the entire prefix +replaced with the configured registry URL (host and path), without +duplicating path segments. @@ -1877,6 +1902,10 @@ silently skipped; this setting only affects unreviewed entries. `--ignore-scripts` and `--dangerously-allow-all-scripts` both override this setting. +Optional dependencies that cannot be installed on the current platform or +engine (a non-matching `os`, `cpu`, or `libc`) are not flagged, because +their install scripts never run. + #### `strict-peer-deps` diff --git a/deps/npm/docs/content/using-npm/developers.md b/deps/npm/docs/content/using-npm/developers.md index de0cb848c59f..b1fff0e3894f 100644 --- a/deps/npm/docs/content/using-npm/developers.md +++ b/deps/npm/docs/content/using-npm/developers.md @@ -171,6 +171,24 @@ to install it locally into the node_modules folder in that other place. Then go into the node-repl, and try using require("my-thing") to bring in your module's main module. +#### Catching undeclared ("phantom") dependencies + +Under the default hoisted `node_modules` layout, your package can `import` a dependency it never declared and still resolve it. +A transitive dependency hoisted alongside it, or your workspace root's `node_modules`, happens to satisfy the `import`. +That undeclared ("phantom") dependency passes your own build silently, then fails for anyone who installs your package on its own. + +We recommend developing your package under [`install-strategy=linked`](/using-npm/config#install-strategy). +The isolated layout only exposes a package's *declared* dependencies, so an `import` of an undeclared package fails for you during development instead of resolving by accident, shipping broken, and failing for your users: + +```bash +npm install --install-strategy=linked +npm test +``` + +> **Note:** This doesn't catch every case. +> A dependency that's still satisfied at your build by a `devDependency` or by your workspace root's `node_modules` can resolve fine for you and still be missing for whoever installs your package. +> So treat it as one check, not a guarantee, alongside auditing the dependencies your published package actually uses. + ### Create a User Account Create a user with the adduser command. diff --git a/deps/npm/docs/output/commands/npm-access.html b/deps/npm/docs/output/commands/npm-access.html index fd3ccdbdf886..2a044ef5ed59 100644 --- a/deps/npm/docs/output/commands/npm-access.html +++ b/deps/npm/docs/output/commands/npm-access.html @@ -186,9 +186,9 @@
-

+

npm-access - @11.17.0 + @11.19.0

Set access level on published packages
diff --git a/deps/npm/docs/output/commands/npm-adduser.html b/deps/npm/docs/output/commands/npm-adduser.html index 56679269f198..c59e21d94298 100644 --- a/deps/npm/docs/output/commands/npm-adduser.html +++ b/deps/npm/docs/output/commands/npm-adduser.html @@ -186,9 +186,9 @@
-

+

npm-adduser - @11.17.0 + @11.19.0

Add a registry user account
diff --git a/deps/npm/docs/output/commands/npm-approve-scripts.html b/deps/npm/docs/output/commands/npm-approve-scripts.html index 8d13f05fb30d..55c9db2b2a2b 100644 --- a/deps/npm/docs/output/commands/npm-approve-scripts.html +++ b/deps/npm/docs/output/commands/npm-approve-scripts.html @@ -186,9 +186,9 @@
-

+

npm-approve-scripts - @11.17.0 + @11.19.0

Approve install scripts for specific dependencies
@@ -238,6 +238,13 @@

Description

the command cannot infer. Existing false entries always win; approve-scripts will not silently re-allow a package you previously denied.

+

If a registry dependency has no resolved URL in your package-lock.json +(for example, an older lockfile or one written with +omit-lockfile-registry-resolved), npm cannot verify a trusted version for +it and cannot pin it: a pkg@1.2.3 entry never matches, so the package +keeps appearing under --allow-scripts-pending. approve-scripts approves +these by name (pkg: true) and warns when it does. To restore pinning, +refresh the lockfile with npm install.

Examples

# Approve all currently-installed install scripts after reviewing them
 npm approve-scripts --all
diff --git a/deps/npm/docs/output/commands/npm-audit.html b/deps/npm/docs/output/commands/npm-audit.html
index e250ae85e009..438891b03cbc 100644
--- a/deps/npm/docs/output/commands/npm-audit.html
+++ b/deps/npm/docs/output/commands/npm-audit.html
@@ -186,9 +186,9 @@
 
 
-

+

npm-audit - @11.17.0 + @11.19.0

Run a security audit
diff --git a/deps/npm/docs/output/commands/npm-bugs.html b/deps/npm/docs/output/commands/npm-bugs.html index 9d7cabb2eb07..eb7a91c9457f 100644 --- a/deps/npm/docs/output/commands/npm-bugs.html +++ b/deps/npm/docs/output/commands/npm-bugs.html @@ -186,9 +186,9 @@
-

+

npm-bugs - @11.17.0 + @11.19.0

Report bugs for a package in a web browser
diff --git a/deps/npm/docs/output/commands/npm-cache.html b/deps/npm/docs/output/commands/npm-cache.html index 49b091085717..374878c8d04e 100644 --- a/deps/npm/docs/output/commands/npm-cache.html +++ b/deps/npm/docs/output/commands/npm-cache.html @@ -186,9 +186,9 @@
-

+

npm-cache - @11.17.0 + @11.19.0

Manipulates packages cache
diff --git a/deps/npm/docs/output/commands/npm-ci.html b/deps/npm/docs/output/commands/npm-ci.html index f01388a8be4f..0a91d5159b12 100644 --- a/deps/npm/docs/output/commands/npm-ci.html +++ b/deps/npm/docs/output/commands/npm-ci.html @@ -186,9 +186,9 @@
-

+

npm-ci - @11.17.0 + @11.19.0

Clean install a project
@@ -251,8 +251,15 @@

install-strategy

(default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted.

+deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted.

+

We recommend that package authors use --install-strategy=linked during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +import of a package that was never added to package.json can fail +instead of resolving by accident and shipping broken. See Catching +undeclared ("phantom") +dependencies.

legacy-bundling

  • Default: false
  • @@ -419,6 +426,9 @@

    strict-allow-scripts

    silently skipped; this setting only affects unreviewed entries. --ignore-scripts and --dangerously-allow-all-scripts both override this setting.

    +

    Optional dependencies that cannot be installed on the current platform or +engine (a non-matching os, cpu, or libc) are not flagged, because +their install scripts never run.

    dangerously-allow-all-scripts

    • Default: false
    • diff --git a/deps/npm/docs/output/commands/npm-completion.html b/deps/npm/docs/output/commands/npm-completion.html index e0769eb5665c..dc927a82868a 100644 --- a/deps/npm/docs/output/commands/npm-completion.html +++ b/deps/npm/docs/output/commands/npm-completion.html @@ -186,9 +186,9 @@
      -

      +

      npm-completion - @11.17.0 + @11.19.0

      Tab Completion for npm
      diff --git a/deps/npm/docs/output/commands/npm-config.html b/deps/npm/docs/output/commands/npm-config.html index 83b7a3b0eeab..5b4e3e1204bc 100644 --- a/deps/npm/docs/output/commands/npm-config.html +++ b/deps/npm/docs/output/commands/npm-config.html @@ -186,9 +186,9 @@
      -

      +

      npm-config - @11.17.0 + @11.19.0

      Manage the npm configuration files
      diff --git a/deps/npm/docs/output/commands/npm-dedupe.html b/deps/npm/docs/output/commands/npm-dedupe.html index 26065b3862e1..0f08ae285737 100644 --- a/deps/npm/docs/output/commands/npm-dedupe.html +++ b/deps/npm/docs/output/commands/npm-dedupe.html @@ -186,9 +186,9 @@
      -

      +

      npm-dedupe - @11.17.0 + @11.19.0

      Reduce duplication in the package tree
      @@ -245,8 +245,15 @@

      install-strategy

      (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted.

      +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted.

      +

      We recommend that package authors use --install-strategy=linked during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +import of a package that was never added to package.json can fail +instead of resolving by accident and shipping broken. See Catching +undeclared ("phantom") +dependencies.

      legacy-bundling

      • Default: false
      • diff --git a/deps/npm/docs/output/commands/npm-deny-scripts.html b/deps/npm/docs/output/commands/npm-deny-scripts.html index 957193be87c4..8b82b3684feb 100644 --- a/deps/npm/docs/output/commands/npm-deny-scripts.html +++ b/deps/npm/docs/output/commands/npm-deny-scripts.html @@ -186,9 +186,9 @@
        -

        +

        npm-deny-scripts - @11.17.0 + @11.19.0

        Deny install scripts for specific dependencies
        diff --git a/deps/npm/docs/output/commands/npm-deprecate.html b/deps/npm/docs/output/commands/npm-deprecate.html index b58d5388a985..489345c280bc 100644 --- a/deps/npm/docs/output/commands/npm-deprecate.html +++ b/deps/npm/docs/output/commands/npm-deprecate.html @@ -186,9 +186,9 @@
        -

        +

        npm-deprecate - @11.17.0 + @11.19.0

        Deprecate a version of a package
        diff --git a/deps/npm/docs/output/commands/npm-diff.html b/deps/npm/docs/output/commands/npm-diff.html index a092efb1faf4..3bb3d244a198 100644 --- a/deps/npm/docs/output/commands/npm-diff.html +++ b/deps/npm/docs/output/commands/npm-diff.html @@ -186,9 +186,9 @@
        -

        +

        npm-diff - @11.17.0 + @11.19.0

        The registry diff command
        diff --git a/deps/npm/docs/output/commands/npm-dist-tag.html b/deps/npm/docs/output/commands/npm-dist-tag.html index 2fc358fef37c..9f3aafdf4314 100644 --- a/deps/npm/docs/output/commands/npm-dist-tag.html +++ b/deps/npm/docs/output/commands/npm-dist-tag.html @@ -186,9 +186,9 @@
        -

        +

        npm-dist-tag - @11.17.0 + @11.19.0

        Modify package distribution tags
        diff --git a/deps/npm/docs/output/commands/npm-docs.html b/deps/npm/docs/output/commands/npm-docs.html index 2eaade58d4d9..fbdd0ad2b626 100644 --- a/deps/npm/docs/output/commands/npm-docs.html +++ b/deps/npm/docs/output/commands/npm-docs.html @@ -186,9 +186,9 @@
        -

        +

        npm-docs - @11.17.0 + @11.19.0

        Open documentation for a package in a web browser
        diff --git a/deps/npm/docs/output/commands/npm-doctor.html b/deps/npm/docs/output/commands/npm-doctor.html index e7a3771d5d65..b7dc5d2caf84 100644 --- a/deps/npm/docs/output/commands/npm-doctor.html +++ b/deps/npm/docs/output/commands/npm-doctor.html @@ -186,9 +186,9 @@
        -

        +

        npm-doctor - @11.17.0 + @11.19.0

        Check the health of your npm environment
        diff --git a/deps/npm/docs/output/commands/npm-edit.html b/deps/npm/docs/output/commands/npm-edit.html index 6f1ee44d54b0..3aed53c2677a 100644 --- a/deps/npm/docs/output/commands/npm-edit.html +++ b/deps/npm/docs/output/commands/npm-edit.html @@ -186,9 +186,9 @@
        -

        +

        npm-edit - @11.17.0 + @11.19.0

        Edit an installed package
        diff --git a/deps/npm/docs/output/commands/npm-exec.html b/deps/npm/docs/output/commands/npm-exec.html index d64cf7d587da..a5ea0d54c343 100644 --- a/deps/npm/docs/output/commands/npm-exec.html +++ b/deps/npm/docs/output/commands/npm-exec.html @@ -186,9 +186,9 @@
        -

        +

        npm-exec - @11.17.0 + @11.19.0

        Run a command from a local or remote npm package
        @@ -336,6 +336,9 @@

        strict-allow-scripts

        silently skipped; this setting only affects unreviewed entries. --ignore-scripts and --dangerously-allow-all-scripts both override this setting.

        +

        Optional dependencies that cannot be installed on the current platform or +engine (a non-matching os, cpu, or libc) are not flagged, because +their install scripts never run.

        dangerously-allow-all-scripts

        • Default: false
        • diff --git a/deps/npm/docs/output/commands/npm-explain.html b/deps/npm/docs/output/commands/npm-explain.html index 4c61e4dc5fbf..bce1694bcf08 100644 --- a/deps/npm/docs/output/commands/npm-explain.html +++ b/deps/npm/docs/output/commands/npm-explain.html @@ -186,9 +186,9 @@
          -

          +

          npm-explain - @11.17.0 + @11.19.0

          Explain installed packages
          diff --git a/deps/npm/docs/output/commands/npm-explore.html b/deps/npm/docs/output/commands/npm-explore.html index 68f61b31ed7d..872892c9f1d5 100644 --- a/deps/npm/docs/output/commands/npm-explore.html +++ b/deps/npm/docs/output/commands/npm-explore.html @@ -186,9 +186,9 @@
          -

          +

          npm-explore - @11.17.0 + @11.19.0

          Browse an installed package
          diff --git a/deps/npm/docs/output/commands/npm-find-dupes.html b/deps/npm/docs/output/commands/npm-find-dupes.html index c6dea14d12f9..b71cbeb015db 100644 --- a/deps/npm/docs/output/commands/npm-find-dupes.html +++ b/deps/npm/docs/output/commands/npm-find-dupes.html @@ -186,9 +186,9 @@
          -

          +

          npm-find-dupes - @11.17.0 + @11.19.0

          Find duplication in the package tree
          @@ -213,8 +213,15 @@

          install-strategy

          (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted.

          +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted.

          +

          We recommend that package authors use --install-strategy=linked during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +import of a package that was never added to package.json can fail +instead of resolving by accident and shipping broken. See Catching +undeclared ("phantom") +dependencies.

          legacy-bundling

          • Default: false
          • diff --git a/deps/npm/docs/output/commands/npm-fund.html b/deps/npm/docs/output/commands/npm-fund.html index 0b7602251f02..9f04fd7ea66b 100644 --- a/deps/npm/docs/output/commands/npm-fund.html +++ b/deps/npm/docs/output/commands/npm-fund.html @@ -186,9 +186,9 @@
            -

            +

            npm-fund - @11.17.0 + @11.19.0

            Retrieve funding information
            diff --git a/deps/npm/docs/output/commands/npm-get.html b/deps/npm/docs/output/commands/npm-get.html index e81310c39b33..94a56fd4a81b 100644 --- a/deps/npm/docs/output/commands/npm-get.html +++ b/deps/npm/docs/output/commands/npm-get.html @@ -186,9 +186,9 @@
            -

            +

            npm-get - @11.17.0 + @11.19.0

            Get a value from the npm configuration
            diff --git a/deps/npm/docs/output/commands/npm-help-search.html b/deps/npm/docs/output/commands/npm-help-search.html index b44eddadf701..d3666992d1e9 100644 --- a/deps/npm/docs/output/commands/npm-help-search.html +++ b/deps/npm/docs/output/commands/npm-help-search.html @@ -186,9 +186,9 @@
            -

            +

            npm-help-search - @11.17.0 + @11.19.0

            Search npm help documentation
            diff --git a/deps/npm/docs/output/commands/npm-help.html b/deps/npm/docs/output/commands/npm-help.html index d22edb7c826b..e7fa1b32e601 100644 --- a/deps/npm/docs/output/commands/npm-help.html +++ b/deps/npm/docs/output/commands/npm-help.html @@ -186,9 +186,9 @@
            -

            +

            npm-help - @11.17.0 + @11.19.0

            Get help on npm
            diff --git a/deps/npm/docs/output/commands/npm-init.html b/deps/npm/docs/output/commands/npm-init.html index 836969ed1353..265ee78ad2cf 100644 --- a/deps/npm/docs/output/commands/npm-init.html +++ b/deps/npm/docs/output/commands/npm-init.html @@ -186,9 +186,9 @@
            -

            +

            npm-init - @11.17.0 + @11.19.0

            Create a package.json file
            diff --git a/deps/npm/docs/output/commands/npm-install-ci-test.html b/deps/npm/docs/output/commands/npm-install-ci-test.html index 6f633c2c18a0..94d4e4a663b8 100644 --- a/deps/npm/docs/output/commands/npm-install-ci-test.html +++ b/deps/npm/docs/output/commands/npm-install-ci-test.html @@ -186,9 +186,9 @@
            -

            +

            npm-install-ci-test - @11.17.0 + @11.19.0

            Install a project with a clean slate and run tests
            @@ -215,8 +215,15 @@

            install-strategy

            (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted.

            +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted.

            +

            We recommend that package authors use --install-strategy=linked during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +import of a package that was never added to package.json can fail +instead of resolving by accident and shipping broken. See Catching +undeclared ("phantom") +dependencies.

            legacy-bundling

            • Default: false
            • @@ -383,6 +390,9 @@

              strict-allow-scripts

              silently skipped; this setting only affects unreviewed entries. --ignore-scripts and --dangerously-allow-all-scripts both override this setting.

              +

              Optional dependencies that cannot be installed on the current platform or +engine (a non-matching os, cpu, or libc) are not flagged, because +their install scripts never run.

              dangerously-allow-all-scripts

              • Default: false
              • diff --git a/deps/npm/docs/output/commands/npm-install-scripts.html b/deps/npm/docs/output/commands/npm-install-scripts.html new file mode 100644 index 000000000000..d78f5efc1653 --- /dev/null +++ b/deps/npm/docs/output/commands/npm-install-scripts.html @@ -0,0 +1,341 @@ + + +npm-install-scripts + + + + + +
                +
                +

                + npm-install-scripts + @11.19.0 +

                +Manage install-script approvals for dependencies +
                + +
                +

                Table of contents

                + +
                + +

                Synopsis

                +
                npm install-scripts approve <pkg> [<pkg> ...]
                +npm install-scripts approve --all
                +npm install-scripts deny <pkg> [<pkg> ...]
                +npm install-scripts deny --all
                +npm install-scripts ls
                +npm install-scripts prune
                +
                +

                Note: This command is unaware of workspaces.

                +

                Description

                +

                Manages the allowScripts field in your project's package.json, which +records which of your dependencies are permitted to run install scripts +(preinstall, install, postinstall, and prepare for non-registry +sources). This is the recommended way to maintain that field.

                +

                Dependency install scripts are blocked by default. Install commands +silently skip lifecycle scripts for any dependency that does not have a +matching entry in allowScripts, and end with a list of the packages +whose scripts were skipped so you can review them here.

                +

                This command only works inside a project that has a package.json. Running +it with --global (-g) fails with an EGLOBAL error, since global +installs (npm install -g) and one-off executions (npm exec / npx) have +no project package.json to write to. To allow install scripts in those +contexts, use the --allow-scripts flag at install time (for example +npm install -g --allow-scripts=canvas,sharp) or persist the setting with +npm config set allow-scripts=canvas,sharp --location=user.

                +

                There are four subcommands:

                +
                npm install-scripts approve <pkg> [<pkg> ...]
                +npm install-scripts approve --all
                +npm install-scripts deny <pkg> [<pkg> ...]
                +npm install-scripts deny --all
                +npm install-scripts ls
                +npm install-scripts prune
                +
                +

                approve allows install scripts for the named packages. <pkg> matches +every installed version of that package. By default it writes pinned entries +(pkg@1.2.3), which keep their approval narrowed to the specific version you +reviewed. Pass --no-allow-scripts-pin to write name-only entries that allow +any future version. --all approves every package with unreviewed install +scripts in one go.

                +

                deny records an explicit denial for the named packages (a name-only false +entry), which survives npm install-scripts approve --all and excludes the +package from any future blanket approval. --all denies every package with +unreviewed install scripts.

                +

                ls is read-only: it lists every package whose install scripts are not yet +covered by allowScripts, without modifying package.json.

                +

                prune removes allowScripts entries that no longer match an installed +package with an install script, either because the package is no longer +installed (a transitive dependency changed, or a pinned pkg@1.2.3 was +upgraded) or because it no longer has an install script. Both approvals +(true) and denials (false) are removed. It edits only the allowScripts +field in package.json, never .npmrc or --allow-scripts. Pass --dry-run +to preview without writing. Unparseable keys are left alone.

                +

                approve honours the asymmetric pin rule: if you re-approve a package whose +installed version has changed, the existing pin is rewritten to track the new +installed version. Multi-version statements (pkg@1 || 2) are left alone, +since they likely capture intent that the command cannot infer. Existing +false entries always win; approve will not silently re-allow a package you +previously denied.

                +

                The standalone commands npm approve-scripts +and npm deny-scripts are aliases for +npm install-scripts approve and npm install-scripts deny.

                +

                Examples

                +
                # Approve all currently-installed install scripts after reviewing them
                +npm install-scripts approve --all
                +
                +# Approve specific packages, pinned to their installed version
                +npm install-scripts approve canvas sharp
                +
                +# Deny a package so it stays blocked
                +npm install-scripts deny telemetry-pkg
                +
                +# Preview which packages still need review
                +npm install-scripts ls
                +
                +# Preview stale allowScripts entries, then remove them
                +npm install-scripts prune --dry-run
                +npm install-scripts prune
                +
                +

                Configuration

                +

                all

                +
                  +
                • Default: false
                • +
                • Type: Boolean
                • +
                +

                Show or act on all packages, not just the ones your project directly depends +on. For npm outdated and npm ls this lists every outdated or installed +package. For npm approve-scripts and npm deny-scripts it selects every +package with pending install scripts.

                +

                allow-scripts-pin

                +
                  +
                • Default: true
                • +
                • Type: Boolean
                • +
                +

                Write pinned (pkg@version) entries when approving install scripts. Set to +false to write name-only entries that allow any version. Has no effect on +npm deny-scripts, which always writes name-only entries regardless of this +setting.

                +

                dry-run

                +
                  +
                • Default: false
                • +
                • Type: Boolean
                • +
                +

                Indicates that you don't want npm to make any changes and that it should +only report what it would have done. This can be passed into any of the +commands that modify your local installation, eg, install, update, +dedupe, uninstall, as well as pack and publish.

                +

                Note: This is NOT honored by other network related commands, eg dist-tags, +owner, etc.

                +

                json

                +
                  +
                • Default: false
                • +
                • Type: Boolean
                • +
                +

                Whether or not to output JSON data, rather than the normal output.

                +
                  +
                • In npm pkg set it enables parsing set values with JSON.parse() before +saving them to your package.json.
                • +
                +

                Not supported by all npm commands.

                +

                See Also

                +
                + + +
                + + + + \ No newline at end of file diff --git a/deps/npm/docs/output/commands/npm-install-test.html b/deps/npm/docs/output/commands/npm-install-test.html index bd12094e8ca1..c55b06547a9d 100644 --- a/deps/npm/docs/output/commands/npm-install-test.html +++ b/deps/npm/docs/output/commands/npm-install-test.html @@ -186,9 +186,9 @@
                -

                +

                npm-install-test - @11.17.0 + @11.19.0

                Install package(s) and run tests
                @@ -246,8 +246,15 @@

                install-strategy

                (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted.

                +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted.

                +

                We recommend that package authors use --install-strategy=linked during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +import of a package that was never added to package.json can fail +instead of resolving by accident and shipping broken. See Catching +undeclared ("phantom") +dependencies.

                legacy-bundling

                • Default: false
                • @@ -439,6 +446,9 @@

                  strict-allow-scripts

                  silently skipped; this setting only affects unreviewed entries. --ignore-scripts and --dangerously-allow-all-scripts both override this setting.

                  +

                  Optional dependencies that cannot be installed on the current platform or +engine (a non-matching os, cpu, or libc) are not flagged, because +their install scripts never run.

                  dangerously-allow-all-scripts

                  • Default: false
                  • @@ -475,6 +485,8 @@

                    before

                    sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one.

                    +

                    As with min-release-age, when this cutoff blocks a fix that npm audit fix would install, npm keeps the vulnerable version, warns, and exits with +a non-zero code.

                    Packages whose names match min-release-age-exclude are exempt from this filter.

                    min-release-age

                    @@ -492,6 +504,11 @@

                    min-release-age

                    --before while preparing a git: or github: dependency); when both apply, before wins within a single source and across sources the standard precedence rules apply.

                    +

                    When this window stops npm audit fix from installing a patched version +(because the fix was published too recently), npm keeps the package at its +vulnerable version, warns that the fix was blocked, and exits with a +non-zero code. To install the fix, add the package to +min-release-age-exclude, or relax min-release-age or before.

                    Packages whose names match min-release-age-exclude are exempt from this filter.

                    This value is not exported to the environment for child processes.

                    diff --git a/deps/npm/docs/output/commands/npm-install.html b/deps/npm/docs/output/commands/npm-install.html index 767a65f28bbd..80af90cc3db9 100644 --- a/deps/npm/docs/output/commands/npm-install.html +++ b/deps/npm/docs/output/commands/npm-install.html @@ -186,9 +186,9 @@
                    -

                    +

                    npm-install - @11.17.0 + @11.19.0

                    Install a package
                    @@ -521,8 +521,15 @@

                    install-strategy

                    (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted.

                    +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted.

                    +

                    We recommend that package authors use --install-strategy=linked during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +import of a package that was never added to package.json can fail +instead of resolving by accident and shipping broken. See Catching +undeclared ("phantom") +dependencies.

                    legacy-bundling

                    • Default: false
                    • @@ -714,6 +721,9 @@

                      strict-allow-scripts

                      silently skipped; this setting only affects unreviewed entries. --ignore-scripts and --dangerously-allow-all-scripts both override this setting.

                      +

                      Optional dependencies that cannot be installed on the current platform or +engine (a non-matching os, cpu, or libc) are not flagged, because +their install scripts never run.

                      dangerously-allow-all-scripts

                      • Default: false
                      • @@ -750,6 +760,8 @@

                        before

                        sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one.

                        +

                        As with min-release-age, when this cutoff blocks a fix that npm audit fix would install, npm keeps the vulnerable version, warns, and exits with +a non-zero code.

                        Packages whose names match min-release-age-exclude are exempt from this filter.

                        min-release-age

                        @@ -767,6 +779,11 @@

                        min-release-age

                        --before while preparing a git: or github: dependency); when both apply, before wins within a single source and across sources the standard precedence rules apply.

                        +

                        When this window stops npm audit fix from installing a patched version +(because the fix was published too recently), npm keeps the package at its +vulnerable version, warns that the fix was blocked, and exits with a +non-zero code. To install the fix, add the package to +min-release-age-exclude, or relax min-release-age or before.

                        Packages whose names match min-release-age-exclude are exempt from this filter.

                        This value is not exported to the environment for child processes.

                        diff --git a/deps/npm/docs/output/commands/npm-link.html b/deps/npm/docs/output/commands/npm-link.html index 42fd82304ecf..3a5795b866f5 100644 --- a/deps/npm/docs/output/commands/npm-link.html +++ b/deps/npm/docs/output/commands/npm-link.html @@ -186,9 +186,9 @@
                        -

                        +

                        npm-link - @11.17.0 + @11.19.0

                        Symlink a package folder
                        @@ -288,8 +288,15 @@

                        install-strategy

                        (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted.

                        +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted.

                        +

                        We recommend that package authors use --install-strategy=linked during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +import of a package that was never added to package.json can fail +instead of resolving by accident and shipping broken. See Catching +undeclared ("phantom") +dependencies.

                        legacy-bundling

                        • Default: false
                        • diff --git a/deps/npm/docs/output/commands/npm-ll.html b/deps/npm/docs/output/commands/npm-ll.html index e288cc8a65d6..601f99e91029 100644 --- a/deps/npm/docs/output/commands/npm-ll.html +++ b/deps/npm/docs/output/commands/npm-ll.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-ll - @11.17.0 + @11.19.0

                          List installed packages
                          diff --git a/deps/npm/docs/output/commands/npm-login.html b/deps/npm/docs/output/commands/npm-login.html index 7ead867b8d39..33d44e488838 100644 --- a/deps/npm/docs/output/commands/npm-login.html +++ b/deps/npm/docs/output/commands/npm-login.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-login - @11.17.0 + @11.19.0

                          Login to a registry user account
                          diff --git a/deps/npm/docs/output/commands/npm-logout.html b/deps/npm/docs/output/commands/npm-logout.html index 19ecf24f01ef..0be803c18ae7 100644 --- a/deps/npm/docs/output/commands/npm-logout.html +++ b/deps/npm/docs/output/commands/npm-logout.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-logout - @11.17.0 + @11.19.0

                          Log out of the registry
                          diff --git a/deps/npm/docs/output/commands/npm-ls.html b/deps/npm/docs/output/commands/npm-ls.html index 181541d978ea..bda454a04c77 100644 --- a/deps/npm/docs/output/commands/npm-ls.html +++ b/deps/npm/docs/output/commands/npm-ls.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-ls - @11.17.0 + @11.19.0

                          List installed packages
                          @@ -209,7 +209,7 @@

                          Description

                          Positional arguments are name@version-range identifiers, which will limit the results to only the paths to the packages named. Note that nested packages will also show the paths to the specified packages. For example, running npm ls promzard in npm's source tree will show:

                          -
                          npm@11.17.0 /path/to/npm
                          +
                          npm@11.19.0 /path/to/npm
                           └─┬ init-package-json@0.0.4
                             └── promzard@0.1.5
                           
                          diff --git a/deps/npm/docs/output/commands/npm-org.html b/deps/npm/docs/output/commands/npm-org.html index 361f44be6f30..32df155d69ce 100644 --- a/deps/npm/docs/output/commands/npm-org.html +++ b/deps/npm/docs/output/commands/npm-org.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-org - @11.17.0 + @11.19.0

                          Manage orgs
                          diff --git a/deps/npm/docs/output/commands/npm-outdated.html b/deps/npm/docs/output/commands/npm-outdated.html index 9703cf4bacf7..5355d7dd09aa 100644 --- a/deps/npm/docs/output/commands/npm-outdated.html +++ b/deps/npm/docs/output/commands/npm-outdated.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-outdated - @11.17.0 + @11.19.0

                          Check for outdated packages
                          @@ -334,6 +334,8 @@

                          before

                          sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one.

                          +

                          As with min-release-age, when this cutoff blocks a fix that npm audit fix would install, npm keeps the vulnerable version, warns, and exits with +a non-zero code.

                          Packages whose names match min-release-age-exclude are exempt from this filter.

                          min-release-age

                          @@ -351,6 +353,11 @@

                          min-release-age

                          --before while preparing a git: or github: dependency); when both apply, before wins within a single source and across sources the standard precedence rules apply.

                          +

                          When this window stops npm audit fix from installing a patched version +(because the fix was published too recently), npm keeps the package at its +vulnerable version, warns that the fix was blocked, and exits with a +non-zero code. To install the fix, add the package to +min-release-age-exclude, or relax min-release-age or before.

                          Packages whose names match min-release-age-exclude are exempt from this filter.

                          This value is not exported to the environment for child processes.

                          diff --git a/deps/npm/docs/output/commands/npm-owner.html b/deps/npm/docs/output/commands/npm-owner.html index 649e74081309..7dc17627f50a 100644 --- a/deps/npm/docs/output/commands/npm-owner.html +++ b/deps/npm/docs/output/commands/npm-owner.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-owner - @11.17.0 + @11.19.0

                          Manage package owners
                          diff --git a/deps/npm/docs/output/commands/npm-pack.html b/deps/npm/docs/output/commands/npm-pack.html index ab45154d21a3..3f92c3ff7579 100644 --- a/deps/npm/docs/output/commands/npm-pack.html +++ b/deps/npm/docs/output/commands/npm-pack.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-pack - @11.17.0 + @11.19.0

                          Create a tarball from a package
                          diff --git a/deps/npm/docs/output/commands/npm-ping.html b/deps/npm/docs/output/commands/npm-ping.html index 2f2ad0f779fa..84d634064212 100644 --- a/deps/npm/docs/output/commands/npm-ping.html +++ b/deps/npm/docs/output/commands/npm-ping.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-ping - @11.17.0 + @11.19.0

                          Ping npm registry
                          diff --git a/deps/npm/docs/output/commands/npm-pkg.html b/deps/npm/docs/output/commands/npm-pkg.html index 7462527a5904..cf995cca7679 100644 --- a/deps/npm/docs/output/commands/npm-pkg.html +++ b/deps/npm/docs/output/commands/npm-pkg.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-pkg - @11.17.0 + @11.19.0

                          Manages your package.json
                          diff --git a/deps/npm/docs/output/commands/npm-prefix.html b/deps/npm/docs/output/commands/npm-prefix.html index 3fe3a77f2baf..0336ac659020 100644 --- a/deps/npm/docs/output/commands/npm-prefix.html +++ b/deps/npm/docs/output/commands/npm-prefix.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-prefix - @11.17.0 + @11.19.0

                          Display prefix
                          diff --git a/deps/npm/docs/output/commands/npm-profile.html b/deps/npm/docs/output/commands/npm-profile.html index 9a03fa257961..8c0d0a337c8c 100644 --- a/deps/npm/docs/output/commands/npm-profile.html +++ b/deps/npm/docs/output/commands/npm-profile.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-profile - @11.17.0 + @11.19.0

                          Change settings on your registry profile
                          diff --git a/deps/npm/docs/output/commands/npm-prune.html b/deps/npm/docs/output/commands/npm-prune.html index 539533b3e9a8..d340e0fd84a6 100644 --- a/deps/npm/docs/output/commands/npm-prune.html +++ b/deps/npm/docs/output/commands/npm-prune.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-prune - @11.17.0 + @11.19.0

                          Remove extraneous packages
                          diff --git a/deps/npm/docs/output/commands/npm-publish.html b/deps/npm/docs/output/commands/npm-publish.html index 4200a9105d23..d1ee0efa5d16 100644 --- a/deps/npm/docs/output/commands/npm-publish.html +++ b/deps/npm/docs/output/commands/npm-publish.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-publish - @11.17.0 + @11.19.0

                          Publish a package
                          diff --git a/deps/npm/docs/output/commands/npm-query.html b/deps/npm/docs/output/commands/npm-query.html index 862a6a6ad62f..a8347390a34a 100644 --- a/deps/npm/docs/output/commands/npm-query.html +++ b/deps/npm/docs/output/commands/npm-query.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-query - @11.17.0 + @11.19.0

                          Dependency selector query
                          @@ -432,6 +432,8 @@

                          before

                          sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one.

                          +

                          As with min-release-age, when this cutoff blocks a fix that npm audit fix would install, npm keeps the vulnerable version, warns, and exits with +a non-zero code.

                          Packages whose names match min-release-age-exclude are exempt from this filter.

                          min-release-age

                          @@ -449,6 +451,11 @@

                          min-release-age

                          --before while preparing a git: or github: dependency); when both apply, before wins within a single source and across sources the standard precedence rules apply.

                          +

                          When this window stops npm audit fix from installing a patched version +(because the fix was published too recently), npm keeps the package at its +vulnerable version, warns that the fix was blocked, and exits with a +non-zero code. To install the fix, add the package to +min-release-age-exclude, or relax min-release-age or before.

                          Packages whose names match min-release-age-exclude are exempt from this filter.

                          This value is not exported to the environment for child processes.

                          diff --git a/deps/npm/docs/output/commands/npm-rebuild.html b/deps/npm/docs/output/commands/npm-rebuild.html index 822091ab35b0..8c2277d8a914 100644 --- a/deps/npm/docs/output/commands/npm-rebuild.html +++ b/deps/npm/docs/output/commands/npm-rebuild.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-rebuild - @11.17.0 + @11.19.0

                          Rebuild a package
                          @@ -298,6 +298,9 @@

                          strict-allow-scripts

                          silently skipped; this setting only affects unreviewed entries. --ignore-scripts and --dangerously-allow-all-scripts both override this setting.

                          +

                          Optional dependencies that cannot be installed on the current platform or +engine (a non-matching os, cpu, or libc) are not flagged, because +their install scripts never run.

                          dangerously-allow-all-scripts

                          • Default: false
                          • diff --git a/deps/npm/docs/output/commands/npm-repo.html b/deps/npm/docs/output/commands/npm-repo.html index c18499bd35e9..b60cd8bc1ddd 100644 --- a/deps/npm/docs/output/commands/npm-repo.html +++ b/deps/npm/docs/output/commands/npm-repo.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-repo - @11.17.0 + @11.19.0

                            Open package repository page in the browser
                            diff --git a/deps/npm/docs/output/commands/npm-restart.html b/deps/npm/docs/output/commands/npm-restart.html index e9be582f21a6..960530ad2975 100644 --- a/deps/npm/docs/output/commands/npm-restart.html +++ b/deps/npm/docs/output/commands/npm-restart.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-restart - @11.17.0 + @11.19.0

                            Restart a package
                            diff --git a/deps/npm/docs/output/commands/npm-root.html b/deps/npm/docs/output/commands/npm-root.html index 2aaae514e72d..b5ad8c5c1389 100644 --- a/deps/npm/docs/output/commands/npm-root.html +++ b/deps/npm/docs/output/commands/npm-root.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-root - @11.17.0 + @11.19.0

                            Display npm root
                            diff --git a/deps/npm/docs/output/commands/npm-run.html b/deps/npm/docs/output/commands/npm-run.html index 4036f6e0153b..985df67fddef 100644 --- a/deps/npm/docs/output/commands/npm-run.html +++ b/deps/npm/docs/output/commands/npm-run.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-run - @11.17.0 + @11.19.0

                            Run arbitrary package scripts
                            diff --git a/deps/npm/docs/output/commands/npm-sbom.html b/deps/npm/docs/output/commands/npm-sbom.html index be951feb1903..db72c21adc4f 100644 --- a/deps/npm/docs/output/commands/npm-sbom.html +++ b/deps/npm/docs/output/commands/npm-sbom.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-sbom - @11.17.0 + @11.19.0

                            Generate a Software Bill of Materials (SBOM)
                            diff --git a/deps/npm/docs/output/commands/npm-search.html b/deps/npm/docs/output/commands/npm-search.html index 8b397932b4bd..f4764833e25a 100644 --- a/deps/npm/docs/output/commands/npm-search.html +++ b/deps/npm/docs/output/commands/npm-search.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-search - @11.17.0 + @11.19.0

                            Search for packages
                            diff --git a/deps/npm/docs/output/commands/npm-set.html b/deps/npm/docs/output/commands/npm-set.html index 4be22387a407..d0fe94ba7e98 100644 --- a/deps/npm/docs/output/commands/npm-set.html +++ b/deps/npm/docs/output/commands/npm-set.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-set - @11.17.0 + @11.19.0

                            Set a value in the npm configuration
                            diff --git a/deps/npm/docs/output/commands/npm-shrinkwrap.html b/deps/npm/docs/output/commands/npm-shrinkwrap.html index 83e1f76e6572..85fb2b99986f 100644 --- a/deps/npm/docs/output/commands/npm-shrinkwrap.html +++ b/deps/npm/docs/output/commands/npm-shrinkwrap.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-shrinkwrap - @11.17.0 + @11.19.0

                            Lock down dependency versions for publication
                            diff --git a/deps/npm/docs/output/commands/npm-stage.html b/deps/npm/docs/output/commands/npm-stage.html index 7a72369ac86e..225d4970fad3 100644 --- a/deps/npm/docs/output/commands/npm-stage.html +++ b/deps/npm/docs/output/commands/npm-stage.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-stage - @11.17.0 + @11.19.0

                            Stage packages for publishing
                            diff --git a/deps/npm/docs/output/commands/npm-star.html b/deps/npm/docs/output/commands/npm-star.html index a58d3d91913c..5521c413462c 100644 --- a/deps/npm/docs/output/commands/npm-star.html +++ b/deps/npm/docs/output/commands/npm-star.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-star - @11.17.0 + @11.19.0

                            Mark your favorite packages
                            diff --git a/deps/npm/docs/output/commands/npm-stars.html b/deps/npm/docs/output/commands/npm-stars.html index b13d859bffac..9f497020875d 100644 --- a/deps/npm/docs/output/commands/npm-stars.html +++ b/deps/npm/docs/output/commands/npm-stars.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-stars - @11.17.0 + @11.19.0

                            View packages marked as favorites
                            diff --git a/deps/npm/docs/output/commands/npm-start.html b/deps/npm/docs/output/commands/npm-start.html index 0c88d59c6492..4a6ec9e7e2c8 100644 --- a/deps/npm/docs/output/commands/npm-start.html +++ b/deps/npm/docs/output/commands/npm-start.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-start - @11.17.0 + @11.19.0

                            Start a package
                            diff --git a/deps/npm/docs/output/commands/npm-stop.html b/deps/npm/docs/output/commands/npm-stop.html index 12b8779cc221..243f702c961e 100644 --- a/deps/npm/docs/output/commands/npm-stop.html +++ b/deps/npm/docs/output/commands/npm-stop.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-stop - @11.17.0 + @11.19.0

                            Stop a package
                            diff --git a/deps/npm/docs/output/commands/npm-team.html b/deps/npm/docs/output/commands/npm-team.html index 9e311e6d52ad..0baf06db4b1a 100644 --- a/deps/npm/docs/output/commands/npm-team.html +++ b/deps/npm/docs/output/commands/npm-team.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-team - @11.17.0 + @11.19.0

                            Manage organization teams and team memberships
                            diff --git a/deps/npm/docs/output/commands/npm-test.html b/deps/npm/docs/output/commands/npm-test.html index dddced02bd1f..2d46aafd0b14 100644 --- a/deps/npm/docs/output/commands/npm-test.html +++ b/deps/npm/docs/output/commands/npm-test.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-test - @11.17.0 + @11.19.0

                            Test a package
                            diff --git a/deps/npm/docs/output/commands/npm-token.html b/deps/npm/docs/output/commands/npm-token.html index 45962d19ed7b..58a528ce2180 100644 --- a/deps/npm/docs/output/commands/npm-token.html +++ b/deps/npm/docs/output/commands/npm-token.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-token - @11.17.0 + @11.19.0

                            Manage your authentication tokens
                            diff --git a/deps/npm/docs/output/commands/npm-trust.html b/deps/npm/docs/output/commands/npm-trust.html index 761283abca7c..429e22957b18 100644 --- a/deps/npm/docs/output/commands/npm-trust.html +++ b/deps/npm/docs/output/commands/npm-trust.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-trust - @11.17.0 + @11.19.0

                            Manage trusted publishing relationships between packages and CI/CD providers
                            diff --git a/deps/npm/docs/output/commands/npm-undeprecate.html b/deps/npm/docs/output/commands/npm-undeprecate.html index ccabc141b24e..67b6d048c079 100644 --- a/deps/npm/docs/output/commands/npm-undeprecate.html +++ b/deps/npm/docs/output/commands/npm-undeprecate.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-undeprecate - @11.17.0 + @11.19.0

                            Undeprecate a version of a package
                            diff --git a/deps/npm/docs/output/commands/npm-uninstall.html b/deps/npm/docs/output/commands/npm-uninstall.html index e15dd8bfa7dc..8197d3646c62 100644 --- a/deps/npm/docs/output/commands/npm-uninstall.html +++ b/deps/npm/docs/output/commands/npm-uninstall.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-uninstall - @11.17.0 + @11.19.0

                            Remove a package
                            diff --git a/deps/npm/docs/output/commands/npm-unpublish.html b/deps/npm/docs/output/commands/npm-unpublish.html index df9f218803c0..21b698cad72e 100644 --- a/deps/npm/docs/output/commands/npm-unpublish.html +++ b/deps/npm/docs/output/commands/npm-unpublish.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-unpublish - @11.17.0 + @11.19.0

                            Remove a package from the registry
                            diff --git a/deps/npm/docs/output/commands/npm-unstar.html b/deps/npm/docs/output/commands/npm-unstar.html index fbe3311b6f71..2564643c7435 100644 --- a/deps/npm/docs/output/commands/npm-unstar.html +++ b/deps/npm/docs/output/commands/npm-unstar.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-unstar - @11.17.0 + @11.19.0

                            Remove an item from your favorite packages
                            diff --git a/deps/npm/docs/output/commands/npm-update.html b/deps/npm/docs/output/commands/npm-update.html index dc8794bcb36e..c89bc400aa3c 100644 --- a/deps/npm/docs/output/commands/npm-update.html +++ b/deps/npm/docs/output/commands/npm-update.html @@ -186,9 +186,9 @@
                            -

                            +

                            npm-update - @11.17.0 + @11.19.0

                            Update packages
                            @@ -317,8 +317,15 @@

                            install-strategy

                            (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted.

                            +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted.

                            +

                            We recommend that package authors use --install-strategy=linked during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +import of a package that was never added to package.json can fail +instead of resolving by accident and shipping broken. See Catching +undeclared ("phantom") +dependencies.

                            legacy-bundling

                            • Default: false
                            • @@ -435,6 +442,9 @@

                              strict-allow-scripts

                              silently skipped; this setting only affects unreviewed entries. --ignore-scripts and --dangerously-allow-all-scripts both override this setting.

                              +

                              Optional dependencies that cannot be installed on the current platform or +engine (a non-matching os, cpu, or libc) are not flagged, because +their install scripts never run.

                              dangerously-allow-all-scripts

                              • Default: false
                              • @@ -471,6 +481,8 @@

                                before

                                sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one.

                                +

                                As with min-release-age, when this cutoff blocks a fix that npm audit fix would install, npm keeps the vulnerable version, warns, and exits with +a non-zero code.

                                Packages whose names match min-release-age-exclude are exempt from this filter.

                                min-release-age

                                @@ -488,6 +500,11 @@

                                min-release-age

                                --before while preparing a git: or github: dependency); when both apply, before wins within a single source and across sources the standard precedence rules apply.

                                +

                                When this window stops npm audit fix from installing a patched version +(because the fix was published too recently), npm keeps the package at its +vulnerable version, warns that the fix was blocked, and exits with a +non-zero code. To install the fix, add the package to +min-release-age-exclude, or relax min-release-age or before.

                                Packages whose names match min-release-age-exclude are exempt from this filter.

                                This value is not exported to the environment for child processes.

                                diff --git a/deps/npm/docs/output/commands/npm-version.html b/deps/npm/docs/output/commands/npm-version.html index ca53ca723f3d..2cb36d263256 100644 --- a/deps/npm/docs/output/commands/npm-version.html +++ b/deps/npm/docs/output/commands/npm-version.html @@ -186,9 +186,9 @@
                                -

                                +

                                npm-version - @11.17.0 + @11.19.0

                                Bump a package version
                                diff --git a/deps/npm/docs/output/commands/npm-view.html b/deps/npm/docs/output/commands/npm-view.html index 24b933c2bcd1..2356b4e79166 100644 --- a/deps/npm/docs/output/commands/npm-view.html +++ b/deps/npm/docs/output/commands/npm-view.html @@ -186,9 +186,9 @@
                                -

                                +

                                npm-view - @11.17.0 + @11.19.0

                                View registry info
                                diff --git a/deps/npm/docs/output/commands/npm-whoami.html b/deps/npm/docs/output/commands/npm-whoami.html index 6cbef18cbef7..bd768a237695 100644 --- a/deps/npm/docs/output/commands/npm-whoami.html +++ b/deps/npm/docs/output/commands/npm-whoami.html @@ -186,9 +186,9 @@
                                -

                                +

                                npm-whoami - @11.17.0 + @11.19.0

                                Display npm username
                                diff --git a/deps/npm/docs/output/commands/npm.html b/deps/npm/docs/output/commands/npm.html index 1e26458f7cf0..cc749dc6e59a 100644 --- a/deps/npm/docs/output/commands/npm.html +++ b/deps/npm/docs/output/commands/npm.html @@ -186,9 +186,9 @@
                                -

                                +

                                npm - @11.17.0 + @11.19.0

                                javascript package manager
                                @@ -203,7 +203,7 @@

                                Table of contents

                          Note: This command is unaware of workspaces.

                          Version

                          -

                          11.17.0

                          +

                          11.19.0

                          Description

                          npm is the package manager for the Node JavaScript platform. It puts modules in place so that node can find them, and manages dependency conflicts intelligently.

                          diff --git a/deps/npm/docs/output/commands/npx.html b/deps/npm/docs/output/commands/npx.html index 8cd5c4dcaf63..8abb0349d715 100644 --- a/deps/npm/docs/output/commands/npx.html +++ b/deps/npm/docs/output/commands/npx.html @@ -186,9 +186,9 @@
                          -

                          +

                          npx - @11.17.0 + @11.19.0

                          Run a command from a local or remote npm package
                          diff --git a/deps/npm/docs/output/configuring-npm/folders.html b/deps/npm/docs/output/configuring-npm/folders.html index 6523b966186e..7b04e59dbed2 100644 --- a/deps/npm/docs/output/configuring-npm/folders.html +++ b/deps/npm/docs/output/configuring-npm/folders.html @@ -186,9 +186,9 @@
                          -

                          +

                          Folders - @11.17.0 + @11.19.0

                          Folder structures used by npm
                          diff --git a/deps/npm/docs/output/configuring-npm/install.html b/deps/npm/docs/output/configuring-npm/install.html index 21589fead823..d607ef84697b 100644 --- a/deps/npm/docs/output/configuring-npm/install.html +++ b/deps/npm/docs/output/configuring-npm/install.html @@ -186,9 +186,9 @@
                          -

                          +

                          Install - @11.17.0 + @11.19.0

                          Download and install node and npm
                          diff --git a/deps/npm/docs/output/configuring-npm/npm-global.html b/deps/npm/docs/output/configuring-npm/npm-global.html index 6523b966186e..7b04e59dbed2 100644 --- a/deps/npm/docs/output/configuring-npm/npm-global.html +++ b/deps/npm/docs/output/configuring-npm/npm-global.html @@ -186,9 +186,9 @@
                          -

                          +

                          Folders - @11.17.0 + @11.19.0

                          Folder structures used by npm
                          diff --git a/deps/npm/docs/output/configuring-npm/npm-json.html b/deps/npm/docs/output/configuring-npm/npm-json.html index bccbdcc5d327..0cdb967a8c34 100644 --- a/deps/npm/docs/output/configuring-npm/npm-json.html +++ b/deps/npm/docs/output/configuring-npm/npm-json.html @@ -186,9 +186,9 @@
                          -

                          +

                          package.json - @11.17.0 + @11.19.0

                          Specifics of npm's package.json handling
                          diff --git a/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html b/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html index 0b58b9608ecd..f26ba837f409 100644 --- a/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html +++ b/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html @@ -186,9 +186,9 @@
                          -

                          +

                          npm-shrinkwrap.json - @11.17.0 + @11.19.0

                          A publishable lockfile
                          diff --git a/deps/npm/docs/output/configuring-npm/npmrc.html b/deps/npm/docs/output/configuring-npm/npmrc.html index 1bea346797ae..6e88197b3fbf 100644 --- a/deps/npm/docs/output/configuring-npm/npmrc.html +++ b/deps/npm/docs/output/configuring-npm/npmrc.html @@ -186,9 +186,9 @@
                          -

                          +

                          .npmrc - @11.17.0 + @11.19.0

                          The npm config files
                          diff --git a/deps/npm/docs/output/configuring-npm/package-json.html b/deps/npm/docs/output/configuring-npm/package-json.html index bccbdcc5d327..0cdb967a8c34 100644 --- a/deps/npm/docs/output/configuring-npm/package-json.html +++ b/deps/npm/docs/output/configuring-npm/package-json.html @@ -186,9 +186,9 @@
                          -

                          +

                          package.json - @11.17.0 + @11.19.0

                          Specifics of npm's package.json handling
                          diff --git a/deps/npm/docs/output/configuring-npm/package-lock-json.html b/deps/npm/docs/output/configuring-npm/package-lock-json.html index 25d262fadf53..68476b2f14e4 100644 --- a/deps/npm/docs/output/configuring-npm/package-lock-json.html +++ b/deps/npm/docs/output/configuring-npm/package-lock-json.html @@ -186,9 +186,9 @@
                          -

                          +

                          package-lock.json - @11.17.0 + @11.19.0

                          A manifestation of the manifest
                          diff --git a/deps/npm/docs/output/using-npm/config.html b/deps/npm/docs/output/using-npm/config.html index 17e7bd138963..9d288a3a2e86 100644 --- a/deps/npm/docs/output/using-npm/config.html +++ b/deps/npm/docs/output/using-npm/config.html @@ -186,9 +186,9 @@
                          -

                          +

                          Config - @11.17.0 + @11.19.0

                          About npm configuration
                          @@ -464,6 +464,8 @@

                          before

                          sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one.

                          +

                          As with min-release-age, when this cutoff blocks a fix that npm audit fix would install, npm keeps the vulnerable version, warns, and exits with +a non-zero code.

                          Packages whose names match min-release-age-exclude are exempt from this filter.

                          @@ -948,8 +950,15 @@

                          install-strategy

                          (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted.

                          +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted.

                          +

                          We recommend that package authors use --install-strategy=linked during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +import of a package that was never added to package.json can fail +instead of resolving by accident and shipping broken. See Catching +undeclared ("phantom") +dependencies.

                          json

to install it locally into the node_modules folder in that other place.

Then go into the node-repl, and try using require("my-thing") to bring in your module's main module.

+

Catching undeclared ("phantom") dependencies

+

Under the default hoisted node_modules layout, your package can import a dependency it never declared and still resolve it. +A transitive dependency hoisted alongside it, or your workspace root's node_modules, happens to satisfy the import. +That undeclared ("phantom") dependency passes your own build silently, then fails for anyone who installs your package on its own.

+

We recommend developing your package under install-strategy=linked. +The isolated layout only exposes a package's declared dependencies, so an import of an undeclared package fails for you during development instead of resolving by accident, shipping broken, and failing for your users:

+
npm install --install-strategy=linked
+npm test
+
+
+

Note: This doesn't catch every case. +A dependency that's still satisfied at your build by a devDependency or by your workspace root's node_modules can resolve fine for you and still be missing for whoever installs your package. +So treat it as one check, not a guarantee, alongside auditing the dependencies your published package actually uses.

+

Create a User Account

Create a user with the adduser command. It works like this:

diff --git a/deps/npm/docs/output/using-npm/logging.html b/deps/npm/docs/output/using-npm/logging.html index bbba11e5508a..62b819e82646 100644 --- a/deps/npm/docs/output/using-npm/logging.html +++ b/deps/npm/docs/output/using-npm/logging.html @@ -186,9 +186,9 @@
-

+

Logging - @11.17.0 + @11.19.0

Why, What & How we Log
diff --git a/deps/npm/docs/output/using-npm/orgs.html b/deps/npm/docs/output/using-npm/orgs.html index ae4920f10c3c..39559c361b78 100644 --- a/deps/npm/docs/output/using-npm/orgs.html +++ b/deps/npm/docs/output/using-npm/orgs.html @@ -186,9 +186,9 @@
-

+

Organizations - @11.17.0 + @11.19.0

Working with teams & organizations
diff --git a/deps/npm/docs/output/using-npm/package-spec.html b/deps/npm/docs/output/using-npm/package-spec.html index 47d02ec2b6b9..82b8d1d9ad2e 100644 --- a/deps/npm/docs/output/using-npm/package-spec.html +++ b/deps/npm/docs/output/using-npm/package-spec.html @@ -186,9 +186,9 @@
-

+

Package spec - @11.17.0 + @11.19.0

Package name specifier
diff --git a/deps/npm/docs/output/using-npm/registry.html b/deps/npm/docs/output/using-npm/registry.html index 2c221dee07a0..b3d34df82033 100644 --- a/deps/npm/docs/output/using-npm/registry.html +++ b/deps/npm/docs/output/using-npm/registry.html @@ -186,9 +186,9 @@
-

+

Registry - @11.17.0 + @11.19.0

The JavaScript Package Registry
diff --git a/deps/npm/docs/output/using-npm/removal.html b/deps/npm/docs/output/using-npm/removal.html index 932d43121c9d..b85ee02590cc 100644 --- a/deps/npm/docs/output/using-npm/removal.html +++ b/deps/npm/docs/output/using-npm/removal.html @@ -186,9 +186,9 @@
-

+

Removal - @11.17.0 + @11.19.0

Cleaning the slate
diff --git a/deps/npm/docs/output/using-npm/scope.html b/deps/npm/docs/output/using-npm/scope.html index 657021503ff5..f2e733bc9ebf 100644 --- a/deps/npm/docs/output/using-npm/scope.html +++ b/deps/npm/docs/output/using-npm/scope.html @@ -186,9 +186,9 @@
-

+

Scope - @11.17.0 + @11.19.0

Scoped packages
diff --git a/deps/npm/docs/output/using-npm/scripts.html b/deps/npm/docs/output/using-npm/scripts.html index 3a87423e11f5..c2a9641f62d2 100644 --- a/deps/npm/docs/output/using-npm/scripts.html +++ b/deps/npm/docs/output/using-npm/scripts.html @@ -186,9 +186,9 @@
-

+

Scripts - @11.17.0 + @11.19.0

How npm handles the "scripts" field
diff --git a/deps/npm/docs/output/using-npm/workspaces.html b/deps/npm/docs/output/using-npm/workspaces.html index 2e5ac47adfc8..3a9986755339 100644 --- a/deps/npm/docs/output/using-npm/workspaces.html +++ b/deps/npm/docs/output/using-npm/workspaces.html @@ -186,9 +186,9 @@
-

+

Workspaces - @11.17.0 + @11.19.0

Working with workspaces
diff --git a/deps/npm/lib/commands/audit.js b/deps/npm/lib/commands/audit.js index a8d742cc73a6..6a55af431358 100644 --- a/deps/npm/lib/commands/audit.js +++ b/deps/npm/lib/commands/audit.js @@ -73,6 +73,19 @@ class Audit extends ArboristWorkspaceCmd { await arb.audit({ fix }) if (fix) { await reifyFinish(this.npm, arb) + // Report any fix that a `min-release-age`/`before` window blocked from + // installing, and exit non-zero so a blocked fix is not missed. + const report = arb.auditReport + const blocked = report instanceof Map + ? [...report.values()].filter(v => v.fixBlockedByReleaseAge).map(v => v.name) + : [] + if (blocked.length) { + log.warn('audit', `${blocked.length} package(s) left at a vulnerable version because ` + + `a fix is newer than the release-age cutoff: ${blocked.join(', ')}.\n` + + 'Add the package to min-release-age-exclude, or relax min-release-age or before, ' + + 'to install the fix.') + process.exitCode = 1 + } } else { // will throw if there's an error, because this is an audit command auditError(this.npm, arb.auditReport) diff --git a/deps/npm/lib/commands/exec.js b/deps/npm/lib/commands/exec.js index 23c47a0cc1ad..7b7d8ad30fcd 100644 --- a/deps/npm/lib/commands/exec.js +++ b/deps/npm/lib/commands/exec.js @@ -42,7 +42,7 @@ class Exec extends BaseCommand { } } - async callExec (args, { name, locationMsg, runPath } = {}) { + async callExec (args, { locationMsg, runPath } = {}) { let localBin = this.npm.localBin let pkgPath = this.npm.localPrefix @@ -50,8 +50,8 @@ class Exec extends BaseCommand { if (!runPath) { runPath = process.cwd() } else { - // We have to consider if the workspace has its own separate versions libnpmexec will walk up to localDir after looking here - localBin = resolve(this.npm.localDir, name, 'node_modules', '.bin') + // Use the workspace's own node_modules/.bin, not localDir/, since the linked strategy does not symlink workspaces into the root node_modules. + localBin = resolve(runPath, 'node_modules', '.bin') // We also need to look for `bin` entries in the workspace package.json // libnpmexec will NOT look in the project root for the bin entry pkgPath = runPath diff --git a/deps/npm/lib/commands/install-scripts.js b/deps/npm/lib/commands/install-scripts.js new file mode 100644 index 000000000000..c6f91f87b087 --- /dev/null +++ b/deps/npm/lib/commands/install-scripts.js @@ -0,0 +1,53 @@ +const AllowScriptsCmd = require('../utils/allow-scripts-cmd.js') + +// Namespaced front-end for install-script approvals. +// `approve`/`deny` write the `allowScripts` policy, `ls` lists unreviewed packages, +// `prune` drops entries that no longer match an installed package with an install script. +// `npm approve-scripts` / `npm deny-scripts` are aliases for `approve` / `deny`. +class InstallScripts extends AllowScriptsCmd { + static description = 'Manage install-script approvals for dependencies' + static name = 'install-scripts' + static usage = [ + 'approve [ ...]', + 'approve --all', + 'deny [ ...]', + 'deny --all', + 'ls', + 'prune', + ] + + static params = ['all', 'allow-scripts-pin', 'dry-run', 'json'] + + static async completion (opts) { + const argv = opts.conf.argv.remain + const subcommands = ['approve', 'deny', 'ls', 'prune'] + if (argv.length === 2) { + return subcommands + } + if (subcommands.includes(argv[2])) { + return [] + } + throw new Error(`${argv[2]} not recognized`) + } + + async exec (args) { + const [sub, ...rest] = args + switch (sub) { + case 'approve': + return this.runMode('approve', rest) + case 'deny': + return this.runMode('deny', rest) + case 'ls': + case 'list': + return this.runMode('list', rest) + case 'prune': + return this.runMode('prune', rest) + default: + throw this.usageError( + sub ? `\`${sub}\` is not a recognized subcommand.` : undefined + ) + } + } +} + +module.exports = InstallScripts diff --git a/deps/npm/lib/commands/link.js b/deps/npm/lib/commands/link.js index 160ba2b707ef..cad499b2df8e 100644 --- a/deps/npm/lib/commands/link.js +++ b/deps/npm/lib/commands/link.js @@ -5,6 +5,7 @@ const pkgJson = require('@npmcli/package-json') const semver = require('semver') const reifyFinish = require('../utils/reify-finish.js') const resolveAllowScripts = require('../utils/resolve-allow-scripts.js') +const strictAllowScriptsPreflight = require('../utils/strict-allow-scripts-preflight.js') const ArboristWorkspaceCmd = require('../arborist-cmd.js') class Link extends ArboristWorkspaceCmd { @@ -68,12 +69,16 @@ class Link extends ArboristWorkspaceCmd { // load current packages from the global space, and then add symlinks installs locally const globalTop = resolve(this.npm.globalDir, '..') const Arborist = require('@npmcli/arborist') + // Resolve the policy up front so it also gates the global install of + // missing packages, not just the local link. + const { policy: allowScriptsPolicy } = await resolveAllowScripts(this.npm) const globalOpts = { ...this.npm.flatOptions, Arborist, path: globalTop, global: true, prune: false, + allowScripts: allowScriptsPolicy, } const globalArb = new Arborist(globalOpts) @@ -86,10 +91,17 @@ class Link extends ArboristWorkspaceCmd { // any extra arg that is missing from the current global space should be reified there first const missing = this.missingArgsFromTree(globals, args) if (missing.length) { - await globalArb.reify({ + const globalReifyOpts = { ...globalOpts, add: missing, + } + // Gate the global install with the same preflight as `npm install`. + await strictAllowScriptsPreflight({ + arb: globalArb, + npm: this.npm, + idealTreeOpts: globalReifyOpts, }) + await globalArb.reify(globalReifyOpts) } // get a list of module names that should be linked in the local prefix @@ -116,12 +128,13 @@ class Link extends ArboristWorkspaceCmd { ) // create a new arborist instance for the local prefix and // reify all the pending names as symlinks there - const { policy: allowScriptsPolicy } = await resolveAllowScripts(this.npm) const localArb = new Arborist({ ...this.npm.flatOptions, prune: false, path: this.npm.prefix, save, + // Arborist reads this.options.workspaces (set at construction) to decide which node receives the add, so it must be set here, not only at reify time. + workspaces: this.workspaceNames, allowScripts: allowScriptsPolicy, }) await localArb.reify({ diff --git a/deps/npm/lib/commands/ls.js b/deps/npm/lib/commands/ls.js index 5dacd3919882..8b9b4f3f5d2e 100644 --- a/deps/npm/lib/commands/ls.js +++ b/deps/npm/lib/commands/ls.js @@ -135,7 +135,7 @@ class LS extends ArboristWorkspaceCmd { omit, }) : () => true) .filter(installStrategy === 'linked' - ? filterLinkedStrategyEdges({ node, currentDepth }) + ? filterLinkedStrategyEdges({ currentDepth }) : () => true) .map(mapEdgesToNodes({ seenPaths })) .concat(appendExtraneousChildren({ node, seenPaths })) @@ -400,32 +400,16 @@ const getJsonOutputItem = (node, { global, long }) => { return augmentItemWithIncludeMetadata(node, item) } -// In linked strategy, two types of edges produce false UNMET DEPENDENCYs: -// 1. Workspace edges for undeclared workspaces: the lockfile records edges from root to ALL workspaces, but only declared workspaces are hoisted to root/node_modules in linked mode. Undeclared ones are intentionally absent. -// 2. Dev edges on non-root packages: store package link targets have no parent in the node tree, so they are treated as "top" nodes and their devDependencies are loaded as edges. Those devDeps are never installed. -const filterLinkedStrategyEdges = ({ node, currentDepth }) => { - const declaredDeps = new Set(Object.keys(Object.assign({}, - node.target.package.dependencies, - node.target.package.devDependencies, - node.target.package.optionalDependencies, - node.target.package.peerDependencies - ))) - - return (edge) => { - // Skip workspace edges for undeclared workspaces at root level - if (currentDepth === 0 && edge.type === 'workspace' && edge.missing) { - if (!declaredDeps.has(edge.name)) { - return false - } - } - - // Skip dev edges for non-root packages (store packages) - if (currentDepth > 0 && edge.dev) { - return false - } - - return true +// In linked strategy, dev edges on non-root packages produce false UNMET DEPENDENCYs: store package link targets have no parent in the node tree, so they are treated as "top" nodes and their devDependencies are loaded as edges. Those devDeps are never installed. +// Undeclared workspaces no longer need filtering here: loadActual synthesizes their root links so their edges resolve instead of reporting missing. +const filterLinkedStrategyEdges = ({ currentDepth }) => (edge) => { + // Skip dev edges for non-root packages (store packages) + /* istanbul ignore next: store packages no longer carry dev edges, so this guard is not exercised by tests */ + if (currentDepth > 0 && edge.dev) { + return false } + + return true } const filterByEdgesTypes = ({ link, omit }) => (edge) => { diff --git a/deps/npm/lib/commands/owner.js b/deps/npm/lib/commands/owner.js index d53c1c97b77f..e7540c9bf7b8 100644 --- a/deps/npm/lib/commands/owner.js +++ b/deps/npm/lib/commands/owner.js @@ -160,7 +160,10 @@ class Owner extends BaseCommand { let u try { - u = await npmFetch.json(uri, this.npm.flatOptions) + u = await npmFetch.json(uri, { + ...this.npm.flatOptions, + spec, + }) } catch (err) { log.error('owner mutate', `Error getting user data for ${user}`) throw err diff --git a/deps/npm/lib/commands/pack.js b/deps/npm/lib/commands/pack.js index ca57de03997b..be4a1b240bea 100644 --- a/deps/npm/lib/commands/pack.js +++ b/deps/npm/lib/commands/pack.js @@ -2,6 +2,10 @@ const pacote = require('pacote') const libpack = require('libnpmpack') const npa = require('npm-package-arg') const { log, output } = require('proc-log') +const { + isReleaseAgeExcluded, + trustedSpecName, +} = require('@npmcli/arborist/lib/release-age-exclude.js') const { getContents, logTar } = require('../utils/tar.js') const BaseCommand = require('../base-cmd.js') @@ -35,8 +39,12 @@ class Pack extends BaseCommand { const manifests = [] for (const arg of args) { const spec = npa(arg) + const options = isReleaseAgeExcluded( + trustedSpecName(spec), + this.npm.flatOptions.minReleaseAgeExclude + ) ? { ...this.npm.flatOptions, before: null } : this.npm.flatOptions const manifest = await pacote.manifest(spec, { - ...this.npm.flatOptions, + ...options, Arborist, preferOnline: true, _isRoot: true, @@ -44,14 +52,14 @@ class Pack extends BaseCommand { if (!manifest._id) { throw new Error('Invalid package, must have name and version') } - manifests.push({ arg, manifest }) + manifests.push({ arg, manifest, options }) } // Load tarball names up for printing afterward to isolate from the noise generated during packing const tarballs = [] - for (const { arg, manifest } of manifests) { + for (const { arg, manifest, options } of manifests) { const tarballData = await libpack(arg, { - ...this.npm.flatOptions, + ...options, foregroundScripts: this.npm.config.isDefault('foreground-scripts') ? true : this.npm.config.get('foreground-scripts'), diff --git a/deps/npm/lib/commands/query.js b/deps/npm/lib/commands/query.js index 63bd00c3206b..f826cdc52659 100644 --- a/deps/npm/lib/commands/query.js +++ b/deps/npm/lib/commands/query.js @@ -2,6 +2,15 @@ const { resolve } = require('node:path') const BaseCommand = require('../base-cmd.js') const { log, output } = require('proc-log') +// Ranks competing representations of the same physical package so the most logical one is reported. +// A top-level placement (e.g. node_modules/) beats the canonical store node, which beats an internal store symlink. +const locationRank = (node) => { + if (!node.location.includes('node_modules/.store/')) { + return 2 + } + return node.isLink ? 0 : 1 +} + class QuerySelectorItem { constructor (node) { // all enumerable properties from the target @@ -9,8 +18,11 @@ class QuerySelectorItem { // append extra info this.pkgid = node.target.pkgid - this.location = node.target.location - this.path = node.target.path + // For a dep symlinked into the isolated store, report the logical link location (node_modules/) rather than the .store backing path. + // Workspaces and regular nodes keep the target location (e.g. packages/). + const logical = node.target.isInStore ? node : node.target + this.location = logical.location + this.path = logical.path this.realpath = node.target.realpath this.resolved = node.target.resolved this.from = [] @@ -33,7 +45,7 @@ class QuerySelectorItem { class Query extends BaseCommand { #response = [] // response is the query response - #seen = new Set() // paths we've seen so we can keep response deduped + #seen = new Map() // physical location -> index in #response, to keep response deduped static description = 'Retrieve a filtered list of packages' static name = 'query' @@ -127,12 +139,22 @@ class Query extends BaseCommand { async #queryTree (tree, arg) { const items = await tree.querySelectorAll(arg, this.npm.flatOptions) for (const node of items) { + // Dedup by the target's physical location so multiple logical links to the same store node collapse to one result. const { location } = node.target - if (!location || !this.#seen.has(location)) { - const item = new QuerySelectorItem(node) - this.#response.push(item) - if (location) { - this.#seen.add(item.location) + if (!location) { + this.#response.push(new QuerySelectorItem(node)) + continue + } + const seen = this.#seen.get(location) + if (seen === undefined) { + this.#seen.set(location, { index: this.#response.length, rank: locationRank(node) }) + this.#response.push(new QuerySelectorItem(node)) + } else { + // Replace the stored representation only with a more logical one for the same physical package. + const rank = locationRank(node) + if (rank > seen.rank) { + this.#response[seen.index] = new QuerySelectorItem(node) + seen.rank = rank } } } diff --git a/deps/npm/lib/commands/rebuild.js b/deps/npm/lib/commands/rebuild.js index 3f8cb98154d5..17595aa4eb72 100644 --- a/deps/npm/lib/commands/rebuild.js +++ b/deps/npm/lib/commands/rebuild.js @@ -75,13 +75,13 @@ class Rebuild extends ArboristWorkspaceCmd { if (unreviewed.length > 0) { const count = unreviewed.length const noun = count === 1 ? 'package has' : 'packages have' - // `npm approve-scripts` writes to a project package.json, which doesn't + // `npm install-scripts` writes to a project package.json, which doesn't // exist for global rebuilds. Point global users at `npm config set`, // which writes the `allow-scripts` setting to their user .npmrc. const names = unreviewed.map(({ node }) => trustedDisplay(node).name) const remediation = this.npm.global ? `Run \`${configSetAllowScripts(names)}\` to allow their scripts.` - : 'Run `npm approve-scripts --allow-scripts-pending` to review.' + : 'Run `npm install-scripts ls` to review.' log.warn( 'rebuild', `${count} ${noun} install scripts not yet covered by allowScripts. ` + diff --git a/deps/npm/lib/commands/token.js b/deps/npm/lib/commands/token.js index b248d6a789a1..8f54e9d8725d 100644 --- a/deps/npm/lib/commands/token.js +++ b/deps/npm/lib/commands/token.js @@ -73,17 +73,22 @@ class Token extends BaseCommand { const parseable = this.npm.config.get('parseable') log.info('token', 'getting list') const tokens = await paginate('/-/npm/v1/tokens', this.npm.flatOptions) + + this.generateTokenIds(tokens, 6) + if (json) { output.buffer(tokens) return } if (parseable) { - output.standard(['key', 'token', 'created', 'readonly', 'CIDR whitelist'].join('\t')) + output.standard(['key', 'token', 'id', 'name', 'created', 'readonly', 'CIDR whitelist'].join('\t')) tokens.forEach(token => { output.standard( [ token.key, token.token, + token.id, + token.name, token.created, token.readonly ? 'true' : 'false', token.cidr_whitelist ? token.cidr_whitelist.join(',') : '', @@ -92,11 +97,10 @@ class Token extends BaseCommand { }) return } - this.generateTokenIds(tokens, 6) const chalk = this.npm.chalk for (const token of tokens) { const created = String(token.created).slice(0, 10) - output.standard(`${chalk.blue('Token')} ${token.token}… with id ${chalk.cyan(token.id)} created ${created}`) + output.standard(`${chalk.blue('Token')} ${token.token}… with id ${chalk.cyan(token.id)} name ${chalk.magenta(token.name)} created ${created}`) if (token.cidr_whitelist) { output.standard(`with IP whitelist: ${chalk.green(token.cidr_whitelist.join(','))}`) } diff --git a/deps/npm/lib/utils/allow-scripts-cmd.js b/deps/npm/lib/utils/allow-scripts-cmd.js index b6ec663124fe..315b7b0b4fb9 100644 --- a/deps/npm/lib/utils/allow-scripts-cmd.js +++ b/deps/npm/lib/utils/allow-scripts-cmd.js @@ -3,6 +3,7 @@ const npa = require('npm-package-arg') const semver = require('semver') const pkgJson = require('@npmcli/package-json') const { trustedDisplay } = require('@npmcli/arborist/lib/script-allowed.js') +const getInstallScripts = require('@npmcli/arborist/lib/install-scripts.js') const checkAllowScripts = require('./check-allow-scripts.js') const resolveAllowScripts = require('./resolve-allow-scripts.js') const { @@ -10,6 +11,7 @@ const { applyDenyForPackage, nameKeyFor, } = require('./allow-scripts-writer.js') +const { classifyUnusedEntries } = require('./allow-scripts-prune.js') const BaseCommand = require('../base-cmd.js') // Parse a positional arg into a name and an optional version range. A bare @@ -34,8 +36,9 @@ const parsePositional = (arg) => { return { name, range: null } } -// Shared implementation for `npm approve-scripts` and `npm deny-scripts`. -// Subclasses set `verb` to `'approve'` or `'deny'`. +// Shared implementation for `npm approve-scripts`, `npm deny-scripts`, and the `npm install-scripts` namespace. +// `npm install-scripts` dispatches to `runMode('approve' | 'deny' | 'list', ...)`. +// The standalone commands set `static verb` and run through the default `exec`. // // Extends `BaseCommand` rather than `ArboristCmd` on purpose. Per RFC, // `allowScripts` is read from the workspace root's `package.json` only; @@ -48,13 +51,23 @@ class AllowScriptsCmd extends BaseCommand { static params = ['all', 'allow-scripts-pending', 'allow-scripts-pin', 'json'] static ignoreImplicitWorkspace = false - // Subclasses set `static verb = 'approve' | 'deny'`. + // Mode of the current run, set by runMode. + // One of 'approve', 'deny', 'list', or 'prune'. + #mode = null + + // verb drives the writers and summaries, which only run in the two write modes, so it is never read while listing. get verb () { - /* istanbul ignore next: every concrete subclass declares static verb */ - return this.constructor.verb + return this.#mode } + // Standalone `npm approve-scripts` / `npm deny-scripts` pick their mode from `static verb`. async exec (args) { + return this.runMode(this.constructor.verb, args) + } + + async runMode (mode, args) { + this.#mode = mode + if (this.npm.global) { throw Object.assign( new Error(`\`npm ${this.constructor.name}\` does not work for global installs`), @@ -62,19 +75,33 @@ class AllowScriptsCmd extends BaseCommand { ) } - const pending = !!this.npm.config.get('allow-scripts-pending') + // `prune` has its own flow: it reads the literal package.json#allowScripts + // map, not the resolved policy. + if (mode === 'prune') { + return this.runPrune(args) + } + + // `--allow-scripts-pending` is only honored by commands that declare it; the namespace lists via `ls` instead. + const pending = this.constructor.params.includes('allow-scripts-pending') && + !!this.npm.config.get('allow-scripts-pending') const all = !!this.npm.config.get('all') + // The `ls` subcommand lists, and so does `--allow-scripts-pending` on the write commands. + const list = mode === 'list' || pending - if (pending && (args.length > 0 || all)) { + if (list && (args.length > 0 || all)) { + const what = mode === 'list' ? '`npm install-scripts ls`' : '`--allow-scripts-pending`' throw this.usageError( - '`--allow-scripts-pending` cannot be combined with positional arguments or `--all`.' + `${what} cannot be combined with positional arguments or \`--all\`.` ) } - if (!pending && !all && args.length === 0) { + if (!list && !all && args.length === 0) { throw this.usageError() } - if (this.verb === 'deny' && pending) { - throw this.usageError('`npm deny-scripts --allow-scripts-pending` is not supported.') + if (mode === 'deny' && pending) { + throw this.usageError( + '`npm deny-scripts --allow-scripts-pending` is not supported; ' + + 'run `npm install-scripts ls` to list unreviewed packages.' + ) } const Arborist = require('@npmcli/arborist') @@ -91,7 +118,7 @@ class AllowScriptsCmd extends BaseCommand { // only lists; nothing runs. const unreviewed = await checkAllowScripts({ arb, npm: this.npm, includeWhenIgnored: true }) - if (pending) { + if (list) { return this.runPending(unreviewed) } @@ -129,7 +156,8 @@ class AllowScriptsCmd extends BaseCommand { } output.standard('') output.standard( - 'Run `npm approve-scripts ` to allow, or `npm deny-scripts ` to deny.' + 'Run `npm install-scripts approve ` to allow, ' + + 'or `npm install-scripts deny ` to deny.' ) } @@ -298,6 +326,78 @@ class AllowScriptsCmd extends BaseCommand { output.standard(`Nothing to ${this.verb}; allowScripts unchanged.`) } } + + // `npm install-scripts prune`: drop package.json#allowScripts entries that no + // longer match an installed package with an install script. Edits only + // package.json (never `.npmrc`/CLI policy); `--dry-run` reports without writing. + async runPrune (args) { + const all = !!this.npm.config.get('all') + if (args.length > 0 || all) { + throw this.usageError( + '`npm install-scripts prune` cannot be combined with positional arguments or `--all`.' + ) + } + + const dryRun = !!this.npm.config.get('dry-run') + const pkg = await pkgJson.load(this.npm.prefix) + const existing = pkg.content.allowScripts && typeof pkg.content.allowScripts === 'object' + ? pkg.content.allowScripts + : {} + + let removed = [] + if (Object.keys(existing).length > 0) { + const Arborist = require('@npmcli/arborist') + const arb = new Arborist({ + ...this.npm.flatOptions, + path: this.npm.prefix, + }) + await arb.loadActual() + + // Candidate install nodes (mirrors collectUnreviewedScripts), tagged with + // whether each has install scripts so the classifier can tell "gone" from + // "no longer has scripts". + const nodes = [] + for (const node of arb.actualTree.inventory.values()) { + if (node.isProjectRoot || node.isWorkspace || node.isLink || node.inBundle || node.inert) { + continue + } + const scripts = await getInstallScripts(node) + nodes.push({ node, hasScripts: Object.keys(scripts).length > 0 }) + } + + const { remaining, removed: unused } = classifyUnusedEntries(existing, nodes) + removed = unused + + if (removed.length > 0 && !dryRun) { + // Drop the field entirely when nothing is left rather than leaving `{}`. + pkg.update({ + allowScripts: Object.keys(remaining).length > 0 ? remaining : undefined, + }) + await pkg.save() + } + } + + this.printPruneSummary({ removed, dryRun }) + } + + printPruneSummary ({ removed, dryRun }) { + if (this.npm.flatOptions.json) { + output.buffer({ allowScripts: { removed, dryRun } }) + return + } + if (removed.length === 0) { + output.standard('No unused allowScripts entries.') + return + } + const entry = removed.length === 1 ? 'entry' : 'entries' + output.standard( + `${dryRun ? 'Would remove' : 'Removed'} ${removed.length} unused allowScripts ${entry}:` + ) + for (const { key, reason } of removed) { + const text = reason === 'not-installed' ? 'package not installed' : 'no install scripts' + output.standard(` ${key} (${text})`) + } + } } module.exports = AllowScriptsCmd diff --git a/deps/npm/lib/utils/allow-scripts-prune.js b/deps/npm/lib/utils/allow-scripts-prune.js new file mode 100644 index 000000000000..1111b45d9ca3 --- /dev/null +++ b/deps/npm/lib/utils/allow-scripts-prune.js @@ -0,0 +1,47 @@ +const npa = require('npm-package-arg') +const { matches } = require('@npmcli/arborist/lib/script-allowed.js') + +// Pure classifier behind `npm install-scripts prune`. +// +// Splits the `package.json#allowScripts` map into entries to keep (`remaining`) +// and unused ones to drop (`removed`). `nodes` is the install candidates as +// `{ node, hasScripts }`; the caller gathers them so this stays sync. +// +// An entry is unused (version-aware, by trusted identity) when: +// - no installed node matches the key -> reason 'not-installed' +// - it matches but none have scripts -> reason 'no-scripts' +// +// Unparseable keys are kept (prune never drops what it can't parse). Both +// `true` (approve) and `false` (deny) entries are pruned. +const classifyUnusedEntries = (allowScripts, nodes) => { + const remaining = {} + const removed = [] + + for (const [key, value] of Object.entries(allowScripts || {})) { + let parseable = true + try { + npa(key) + } catch { + parseable = false + } + if (!parseable) { + remaining[key] = value + continue + } + + const matching = nodes.filter(({ node }) => matches(node, key)) + if (matching.length === 0) { + removed.push({ key, value, reason: 'not-installed' }) + continue + } + if (!matching.some(({ hasScripts }) => hasScripts)) { + removed.push({ key, value, reason: 'no-scripts' }) + continue + } + remaining[key] = value + } + + return { remaining, removed } +} + +module.exports = { classifyUnusedEntries } diff --git a/deps/npm/lib/utils/allow-scripts-writer.js b/deps/npm/lib/utils/allow-scripts-writer.js index 310e22412a4a..6964279f2f2e 100644 --- a/deps/npm/lib/utils/allow-scripts-writer.js +++ b/deps/npm/lib/utils/allow-scripts-writer.js @@ -50,7 +50,7 @@ const versionedKeyFor = (node) => { // parse (private-registry mirror, alternate CDN URL shape). Leave a // breadcrumb so users notice when policy keys are silently pruned. log.silly( - 'allow-scripts', + 'install-scripts', `unable to derive trusted versioned key for ${node.path || node.name || ''} ` + `(resolved: ${resolved}); key will be pruned on next save` ) @@ -108,15 +108,15 @@ const isSingleVersionPin = (key) => { // an approval. Per RFC, a name-only deny ("pkg": false) is widest and // the only remediation is to remove the entry. A versioned deny // ("pkg@1.2.3": false or a disjunction) blocks only specific versions; -// the user can either widen it via `npm deny-scripts ` or remove -// it to approve the currently-installed version only. +// the user can either widen it via `npm install-scripts deny ` or +// remove it to approve the currently-installed version only. const denyWarning = (key, subject, name) => { if (isNameOnlyKey(key)) { return `${key} is denied; remove the entry from allowScripts to approve ${subject}.` } /* istanbul ignore next: name fallback is defensive; callers pass nameKeyFor(sample) */ const widenTarget = name || 'this package' - return `${key} is a versioned deny; run \`npm deny-scripts ${widenTarget}\` ` + + return `${key} is a versioned deny; run \`npm install-scripts deny ${widenTarget}\` ` + `to widen the deny to all versions of ${widenTarget}, or remove the entry ` + `to approve ${subject}.` } @@ -250,7 +250,41 @@ const applyApprovalForPackage = (existing, nodes, { pin = true } = {}) => { // package are removed. Per the RFC's pin-mismatch table, an existing // name-only entry (`pkg: true`) is replaced by `pkg@x.y.z: true` once // every installed version has a pin. - const installedKeys = new Set(nodes.map(versionedKeyFor).filter(Boolean)) + const versionedKeys = nodes.map(versionedKeyFor) + const installedKeys = new Set(versionedKeys.filter(Boolean)) + + // A registry dep with no `resolved` URL in the lockfile has no trustable + // version (getTrustedRegistryIdentity won't trust the tarball's + // node.version), so versionedKeyFor returns null and a `pkg@x.y.z` pin can + // never match it (npm/cli#9558). When any installed version can't be + // pinned, approve the whole package by name and drop now-redundant pins. + if (name && versionedKeys.some(key => !key)) { + for (const key of Object.keys(allowScripts)) { + if ( + keyTargetsNode(key, sample) && + key !== name && + isSingleVersionPin(key) && + allowScripts[key] === true + ) { + delete allowScripts[key] + changes.push({ key, change: 'removed-pinned-allow' }) + } + } + if (allowScripts[name] !== true) { + allowScripts[name] = true + changes.push({ key: name, change: 'added' }) + } + return { + allowScripts, + changes, + warning: changes.length + ? `${name}: approved by name (all versions) because its ` + + `package-lock.json entry has no "resolved" URL, so npm can't pin a ` + + `specific version. Run \`npm install\` to refresh the lockfile and ` + + `enable pinning.` + : undefined, + } + } for (const key of Object.keys(allowScripts)) { if ( diff --git a/deps/npm/lib/utils/cmd-list.js b/deps/npm/lib/utils/cmd-list.js index 1909df0d0454..8816d8294716 100644 --- a/deps/npm/lib/utils/cmd-list.js +++ b/deps/npm/lib/utils/cmd-list.js @@ -31,6 +31,7 @@ const commands = [ 'init', 'install', 'install-ci-test', + 'install-scripts', 'install-test', 'link', 'll', diff --git a/deps/npm/lib/utils/reify-output.js b/deps/npm/lib/utils/reify-output.js index 1ccbd4d0cad7..fa229a318d26 100644 --- a/deps/npm/lib/utils/reify-output.js +++ b/deps/npm/lib/utils/reify-output.js @@ -66,7 +66,8 @@ const reifyOutput = (npm, arb, extras = {}) => { if (showDiff) { output.standard(`${chalk.green('add')} ${d.ideal.name} ${d.ideal.package.version}`) } - if (actualTree.inventory.has(d.ideal)) { + // Linked store packages live under .store, absent from the logical actualTree, so identity lookup misses them; count each store package node (non-link). + if (actualTree.inventory.has(d.ideal) || (d.ideal.isInStore && !d.ideal.isLink)) { summary.added++ summary.add.push({ name: d.ideal.name, @@ -258,7 +259,7 @@ const unreviewedScriptsMessage = (npm, unreviewedScripts) => { }) log.warn( - 'allow-scripts', + 'install-scripts', [ header, ...lines, @@ -268,7 +269,7 @@ const unreviewedScriptsMessage = (npm, unreviewedScripts) => { ) } -// `npm approve-scripts` writes to a project package.json, which doesn't +// `npm install-scripts` writes to a project package.json, which doesn't // exist for global installs (it throws EGLOBAL). For those, point users at // the mechanism that does work globally: the `--allow-scripts` flag for a // one-off, or `npm config set allow-scripts` to persist it. @@ -282,8 +283,8 @@ const remediationLines = (npm, names) => { ] } return [ - 'Run `npm approve-scripts --allow-scripts-pending` to review, ' + - 'or `npm approve-scripts ` to allow.', + 'Run `npm install-scripts ls` to review, ' + + 'or `npm install-scripts approve ` to allow.', ] } diff --git a/deps/npm/lib/utils/resolve-allow-scripts.js b/deps/npm/lib/utils/resolve-allow-scripts.js index b658e1a68ad0..ef0236992ddf 100644 --- a/deps/npm/lib/utils/resolve-allow-scripts.js +++ b/deps/npm/lib/utils/resolve-allow-scripts.js @@ -46,7 +46,7 @@ const validatePolicy = (policy, sourceLabel) => { try { parsed = npa(key) } catch { - log.warn('allow-scripts', `${sourceLabel}: ignoring unparseable entry "${key}"`) + log.warn('install-scripts', `${sourceLabel}: ignoring unparseable entry "${key}"`) continue } if (parsed.type === 'tag') { @@ -54,7 +54,7 @@ const validatePolicy = (policy, sourceLabel) => { // only — the matcher has no way to verify what the tag points at // when scripts run. Reject for the same reason as semver ranges. log.warn( - 'allow-scripts', + 'install-scripts', `${sourceLabel}: ignoring "${key}" — dist-tag specs (@latest, @next, ...) are not allowed; ` + 'use exact versions joined by "||", or the bare package name, instead' ) @@ -66,7 +66,7 @@ const validatePolicy = (policy, sourceLabel) => { || parsed.rawSpec === '*' if (!isNameOnly && !isExactVersionDisjunction(parsed.fetchSpec)) { log.warn( - 'allow-scripts', + 'install-scripts', `${sourceLabel}: ignoring "${key}" — semver ranges (^, ~, >=, <) are not allowed; ` + 'use exact versions joined by "||" instead' ) @@ -137,7 +137,7 @@ const resolveAllowScripts = async (npm, { skipProjectConfig = false } = {}) => { } } } catch (err) { - log.silly('allow-scripts', 'no package.json at prefix', err.message) + log.silly('install-scripts', 'no package.json at prefix', err.message) } } @@ -154,7 +154,7 @@ const resolveAllowScripts = async (npm, { skipProjectConfig = false } = {}) => { // set, package.json is never consulted. if (rc) { log.warn( - 'allow-scripts', + 'install-scripts', '.npmrc allow-scripts setting is being ignored because --allow-scripts was passed on the command line' ) } @@ -164,7 +164,7 @@ const resolveAllowScripts = async (npm, { skipProjectConfig = false } = {}) => { if (pkg) { if (rc) { log.warn( - 'allow-scripts', + 'install-scripts', '.npmrc allow-scripts setting is being ignored because package.json declares its own allowScripts field' ) } diff --git a/deps/npm/lib/utils/sbom-cyclonedx.js b/deps/npm/lib/utils/sbom-cyclonedx.js index fe368e968baa..bd741718bef0 100644 --- a/deps/npm/lib/utils/sbom-cyclonedx.js +++ b/deps/npm/lib/utils/sbom-cyclonedx.js @@ -76,7 +76,7 @@ const toCyclonedxItem = (node, { packageType }) => { // Calculate purl from package spec let spec = npa(node.pkgid) spec = (spec.type === 'alias') ? spec.subSpec : spec - const purl = npa.toPurl(spec) + (isGitNode(node) ? `?vcs_url=${node.resolved}` : '') + const purl = npa.toPurl(spec) + (isGitNode(node) ? `?vcs_url=${encodeURIComponent(node.resolved)}` : '') if (node.package) { const toNormalize = new PackageJson() diff --git a/deps/npm/lib/utils/sbom-spdx.js b/deps/npm/lib/utils/sbom-spdx.js index 8ea75c688bc8..88797fd03eff 100644 --- a/deps/npm/lib/utils/sbom-spdx.js +++ b/deps/npm/lib/utils/sbom-spdx.js @@ -109,7 +109,7 @@ const toSpdxItem = (node, { packageType }) => { // Calculate purl from package spec let spec = npa(node.pkgid) spec = (spec.type === 'alias') ? spec.subSpec : spec - const purl = npa.toPurl(spec) + (isGitNode(node) ? `?vcs_url=${node.resolved}` : '') + const purl = npa.toPurl(spec) + (isGitNode(node) ? `?vcs_url=${encodeURIComponent(node.resolved)}` : '') /* For workspace nodes, use the location from their linkNode */ let location = node.location diff --git a/deps/npm/lib/utils/strict-allow-scripts-preflight.js b/deps/npm/lib/utils/strict-allow-scripts-preflight.js index d3575289fa8e..0c500018184c 100644 --- a/deps/npm/lib/utils/strict-allow-scripts-preflight.js +++ b/deps/npm/lib/utils/strict-allow-scripts-preflight.js @@ -48,19 +48,19 @@ const strictAllowScriptsPreflight = async ({ arb, npm, idealTreeOpts }) => { return ` ${label} (${events})` }).join('\n') - // `npm approve-scripts` / `npm deny-scripts` write to a project - // package.json, which doesn't exist for global installs. Point global - // users at the `--allow-scripts` flag and `npm config set allow-scripts`, - // which both work for global installs. Use the trusted display identity - // so the suggested `npm config set` value matches what the policy matches - // on, not the tarball's self-reported name. + // `npm install-scripts` writes to a project package.json, which doesn't + // exist for global installs. Point global users at the `--allow-scripts` + // flag and `npm config set allow-scripts`, which both work for global + // installs. Use the trusted display identity so the suggested `npm config + // set` value matches what the policy matches on, not the tarball's + // self-reported name. const names = unreviewed.map(({ node }) => trustedDisplay(node).name) const remediation = npm.global ? 'Allow them with `--allow-scripts`, persist them with ' + `\`${configSetAllowScripts(names)}\`, or bypass this ` + 'check with `--dangerously-allow-all-scripts`.' - : 'Approve them with `npm approve-scripts`, deny them with ' + - '`npm deny-scripts`, or bypass this check with ' + + : 'Approve them with `npm install-scripts approve`, deny them with ' + + '`npm install-scripts deny`, or bypass this check with ' + '`--dangerously-allow-all-scripts`.' throw Object.assign( diff --git a/deps/npm/lib/utils/warn-workspace-allow-scripts.js b/deps/npm/lib/utils/warn-workspace-allow-scripts.js index e46e6cf4d2a1..f867e93aa040 100644 --- a/deps/npm/lib/utils/warn-workspace-allow-scripts.js +++ b/deps/npm/lib/utils/warn-workspace-allow-scripts.js @@ -28,7 +28,7 @@ const warnWorkspaceAllowScripts = (tree) => { for (const node of findWorkspaceAllowScripts(tree)) { const name = node.packageName || node.name log.warn( - 'allow-scripts', + 'install-scripts', `allowScripts in workspace ${name} (${node.path}) is ignored. ` + 'Move the field to the project root package.json.' ) diff --git a/deps/npm/man/man1/npm-access.1 b/deps/npm/man/man1/npm-access.1 index 5ffc6914ad06..3b7d77d8962f 100644 --- a/deps/npm/man/man1/npm-access.1 +++ b/deps/npm/man/man1/npm-access.1 @@ -1,4 +1,4 @@ -.TH "NPM-ACCESS" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-ACCESS" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-access\fR - Set access level on published packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-adduser.1 b/deps/npm/man/man1/npm-adduser.1 index 83f72e330080..53ed267a0aa4 100644 --- a/deps/npm/man/man1/npm-adduser.1 +++ b/deps/npm/man/man1/npm-adduser.1 @@ -1,4 +1,4 @@ -.TH "NPM-ADDUSER" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-ADDUSER" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-adduser\fR - Add a registry user account .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-approve-scripts.1 b/deps/npm/man/man1/npm-approve-scripts.1 index 1fa1807f1972..943459b20562 100644 --- a/deps/npm/man/man1/npm-approve-scripts.1 +++ b/deps/npm/man/man1/npm-approve-scripts.1 @@ -1,4 +1,4 @@ -.TH "NPM-APPROVE-SCRIPTS" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-APPROVE-SCRIPTS" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-approve-scripts\fR - Approve install scripts for specific dependencies .SS "Synopsis" @@ -37,6 +37,8 @@ npm approve-scripts --allow-scripts-pending \fB--allow-scripts-pending\fR is read-only: it lists every package whose install scripts are not yet covered by \fBallowScripts\fR, without modifying \fBpackage.json\fR. .P \fBapprove-scripts\fR honours the asymmetric pin rule: if you re-approve a package whose installed version has changed, the existing pin is rewritten to track the new installed version. Multi-version statements (\fBpkg@1 || 2\fR) are left alone, since they likely capture intent that the command cannot infer. Existing \fBfalse\fR entries always win; \fBapprove-scripts\fR will not silently re-allow a package you previously denied. +.P +If a registry dependency has no \fBresolved\fR URL in your \fBpackage-lock.json\fR (for example, an older lockfile or one written with \fBomit-lockfile-registry-resolved\fR), npm cannot verify a trusted version for it and cannot pin it: a \fBpkg@1.2.3\fR entry never matches, so the package keeps appearing under \fB--allow-scripts-pending\fR. \fBapprove-scripts\fR approves these by name (\fBpkg: true\fR) and warns when it does. To restore pinning, refresh the lockfile with \fBnpm install\fR. .SS "Examples" .P .RS 2 diff --git a/deps/npm/man/man1/npm-audit.1 b/deps/npm/man/man1/npm-audit.1 index 9dca2a16806c..77fbcbe595ef 100644 --- a/deps/npm/man/man1/npm-audit.1 +++ b/deps/npm/man/man1/npm-audit.1 @@ -1,4 +1,4 @@ -.TH "NPM-AUDIT" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-AUDIT" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-audit\fR - Run a security audit .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-bugs.1 b/deps/npm/man/man1/npm-bugs.1 index 4e9fb5d6d1dd..05a37e504c7e 100644 --- a/deps/npm/man/man1/npm-bugs.1 +++ b/deps/npm/man/man1/npm-bugs.1 @@ -1,4 +1,4 @@ -.TH "NPM-BUGS" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-BUGS" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-bugs\fR - Report bugs for a package in a web browser .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-cache.1 b/deps/npm/man/man1/npm-cache.1 index 056647fd1f36..fd725dd57fe2 100644 --- a/deps/npm/man/man1/npm-cache.1 +++ b/deps/npm/man/man1/npm-cache.1 @@ -1,4 +1,4 @@ -.TH "NPM-CACHE" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-CACHE" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-cache\fR - Manipulates packages cache .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-ci.1 b/deps/npm/man/man1/npm-ci.1 index 88d49e4cfd29..bbae51d8e983 100644 --- a/deps/npm/man/man1/npm-ci.1 +++ b/deps/npm/man/man1/npm-ci.1 @@ -1,4 +1,4 @@ -.TH "NPM-CI" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-CI" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-ci\fR - Clean install a project .SS "Synopsis" @@ -75,7 +75,9 @@ Type: "hoisted", "nested", "shallow", or "linked" .RE 0 .P -Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: (experimental) install in node_modules/.store, link in place, unhoisted. +Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: install in node_modules/.store, link in place, unhoisted. +.P +We recommend that package authors use \fB--install-strategy=linked\fR during development to catch undeclared ("phantom") dependencies before publishing: the isolated layout only exposes a package's declared dependencies, so an \fBimport\fR of a package that was never added to \fBpackage.json\fR can fail instead of resolving by accident and shipping broken. See \fBCatching undeclared ("phantom") dependencies\fR \fI\(la/using-npm/developers#catching-undeclared-phantom-dependencies\(ra\fR. .SS "\fBlegacy-bundling\fR" .RS 0 .IP \(bu 4 @@ -242,6 +244,8 @@ Type: Boolean If \fBtrue\fR, turn the install-script policy from a warning into a hard error: any dependency with install scripts not covered by \fBallowScripts\fR will fail the install instead of running with a notice. .P Dependencies explicitly denied with \fBfalse\fR in \fBallowScripts\fR are always silently skipped; this setting only affects unreviewed entries. \fB--ignore-scripts\fR and \fB--dangerously-allow-all-scripts\fR both override this setting. +.P +Optional dependencies that cannot be installed on the current platform or engine (a non-matching \fBos\fR, \fBcpu\fR, or \fBlibc\fR) are not flagged, because their install scripts never run. .SS "\fBdangerously-allow-all-scripts\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-completion.1 b/deps/npm/man/man1/npm-completion.1 index 15444b319c76..d01c54ab63af 100644 --- a/deps/npm/man/man1/npm-completion.1 +++ b/deps/npm/man/man1/npm-completion.1 @@ -1,4 +1,4 @@ -.TH "NPM-COMPLETION" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-COMPLETION" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-completion\fR - Tab Completion for npm .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-config.1 b/deps/npm/man/man1/npm-config.1 index 446486b11938..34b79e9d1c57 100644 --- a/deps/npm/man/man1/npm-config.1 +++ b/deps/npm/man/man1/npm-config.1 @@ -1,4 +1,4 @@ -.TH "NPM-CONFIG" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-CONFIG" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-config\fR - Manage the npm configuration files .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-dedupe.1 b/deps/npm/man/man1/npm-dedupe.1 index c370607b6fc1..0b11deb4d467 100644 --- a/deps/npm/man/man1/npm-dedupe.1 +++ b/deps/npm/man/man1/npm-dedupe.1 @@ -1,4 +1,4 @@ -.TH "NPM-DEDUPE" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-DEDUPE" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-dedupe\fR - Reduce duplication in the package tree .SS "Synopsis" @@ -74,7 +74,9 @@ Type: "hoisted", "nested", "shallow", or "linked" .RE 0 .P -Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: (experimental) install in node_modules/.store, link in place, unhoisted. +Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: install in node_modules/.store, link in place, unhoisted. +.P +We recommend that package authors use \fB--install-strategy=linked\fR during development to catch undeclared ("phantom") dependencies before publishing: the isolated layout only exposes a package's declared dependencies, so an \fBimport\fR of a package that was never added to \fBpackage.json\fR can fail instead of resolving by accident and shipping broken. See \fBCatching undeclared ("phantom") dependencies\fR \fI\(la/using-npm/developers#catching-undeclared-phantom-dependencies\(ra\fR. .SS "\fBlegacy-bundling\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-deny-scripts.1 b/deps/npm/man/man1/npm-deny-scripts.1 index f60c26b5a3c4..d8a41f57479e 100644 --- a/deps/npm/man/man1/npm-deny-scripts.1 +++ b/deps/npm/man/man1/npm-deny-scripts.1 @@ -1,4 +1,4 @@ -.TH "NPM-DENY-SCRIPTS" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-DENY-SCRIPTS" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-deny-scripts\fR - Deny install scripts for specific dependencies .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-deprecate.1 b/deps/npm/man/man1/npm-deprecate.1 index e04d1228f86d..c45dd75584ec 100644 --- a/deps/npm/man/man1/npm-deprecate.1 +++ b/deps/npm/man/man1/npm-deprecate.1 @@ -1,4 +1,4 @@ -.TH "NPM-DEPRECATE" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-DEPRECATE" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-deprecate\fR - Deprecate a version of a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-diff.1 b/deps/npm/man/man1/npm-diff.1 index ed49280aa5a1..45efb60c236c 100644 --- a/deps/npm/man/man1/npm-diff.1 +++ b/deps/npm/man/man1/npm-diff.1 @@ -1,4 +1,4 @@ -.TH "NPM-DIFF" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-DIFF" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-diff\fR - The registry diff command .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-dist-tag.1 b/deps/npm/man/man1/npm-dist-tag.1 index 3aeacd51dcce..989a2c64d307 100644 --- a/deps/npm/man/man1/npm-dist-tag.1 +++ b/deps/npm/man/man1/npm-dist-tag.1 @@ -1,4 +1,4 @@ -.TH "NPM-DIST-TAG" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-DIST-TAG" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-dist-tag\fR - Modify package distribution tags .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-docs.1 b/deps/npm/man/man1/npm-docs.1 index e3e9a43aac9c..ee614b710885 100644 --- a/deps/npm/man/man1/npm-docs.1 +++ b/deps/npm/man/man1/npm-docs.1 @@ -1,4 +1,4 @@ -.TH "NPM-DOCS" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-DOCS" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-docs\fR - Open documentation for a package in a web browser .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-doctor.1 b/deps/npm/man/man1/npm-doctor.1 index 1e89fec2f3f9..5344645b17ed 100644 --- a/deps/npm/man/man1/npm-doctor.1 +++ b/deps/npm/man/man1/npm-doctor.1 @@ -1,4 +1,4 @@ -.TH "NPM-DOCTOR" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-DOCTOR" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-doctor\fR - Check the health of your npm environment .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-edit.1 b/deps/npm/man/man1/npm-edit.1 index 530543a029b1..bca15e054f60 100644 --- a/deps/npm/man/man1/npm-edit.1 +++ b/deps/npm/man/man1/npm-edit.1 @@ -1,4 +1,4 @@ -.TH "NPM-EDIT" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-EDIT" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-edit\fR - Edit an installed package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-exec.1 b/deps/npm/man/man1/npm-exec.1 index 3122968e4065..4b580f484bc1 100644 --- a/deps/npm/man/man1/npm-exec.1 +++ b/deps/npm/man/man1/npm-exec.1 @@ -1,4 +1,4 @@ -.TH "NPM-EXEC" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-EXEC" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-exec\fR - Run a command from a local or remote npm package .SS "Synopsis" @@ -193,6 +193,8 @@ Type: Boolean If \fBtrue\fR, turn the install-script policy from a warning into a hard error: any dependency with install scripts not covered by \fBallowScripts\fR will fail the install instead of running with a notice. .P Dependencies explicitly denied with \fBfalse\fR in \fBallowScripts\fR are always silently skipped; this setting only affects unreviewed entries. \fB--ignore-scripts\fR and \fB--dangerously-allow-all-scripts\fR both override this setting. +.P +Optional dependencies that cannot be installed on the current platform or engine (a non-matching \fBos\fR, \fBcpu\fR, or \fBlibc\fR) are not flagged, because their install scripts never run. .SS "\fBdangerously-allow-all-scripts\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-explain.1 b/deps/npm/man/man1/npm-explain.1 index ad4b6a15bf64..20374a8fbb37 100644 --- a/deps/npm/man/man1/npm-explain.1 +++ b/deps/npm/man/man1/npm-explain.1 @@ -1,4 +1,4 @@ -.TH "NPM-EXPLAIN" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-EXPLAIN" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-explain\fR - Explain installed packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-explore.1 b/deps/npm/man/man1/npm-explore.1 index ee12137b4d62..bee110155bd5 100644 --- a/deps/npm/man/man1/npm-explore.1 +++ b/deps/npm/man/man1/npm-explore.1 @@ -1,4 +1,4 @@ -.TH "NPM-EXPLORE" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-EXPLORE" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-explore\fR - Browse an installed package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-find-dupes.1 b/deps/npm/man/man1/npm-find-dupes.1 index 287971553cc9..a1cfc3abd0d2 100644 --- a/deps/npm/man/man1/npm-find-dupes.1 +++ b/deps/npm/man/man1/npm-find-dupes.1 @@ -1,4 +1,4 @@ -.TH "NPM-FIND-DUPES" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-FIND-DUPES" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-find-dupes\fR - Find duplication in the package tree .SS "Synopsis" @@ -21,7 +21,9 @@ Type: "hoisted", "nested", "shallow", or "linked" .RE 0 .P -Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: (experimental) install in node_modules/.store, link in place, unhoisted. +Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: install in node_modules/.store, link in place, unhoisted. +.P +We recommend that package authors use \fB--install-strategy=linked\fR during development to catch undeclared ("phantom") dependencies before publishing: the isolated layout only exposes a package's declared dependencies, so an \fBimport\fR of a package that was never added to \fBpackage.json\fR can fail instead of resolving by accident and shipping broken. See \fBCatching undeclared ("phantom") dependencies\fR \fI\(la/using-npm/developers#catching-undeclared-phantom-dependencies\(ra\fR. .SS "\fBlegacy-bundling\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-fund.1 b/deps/npm/man/man1/npm-fund.1 index fbe8cdc9bee9..ec516b28396d 100644 --- a/deps/npm/man/man1/npm-fund.1 +++ b/deps/npm/man/man1/npm-fund.1 @@ -1,4 +1,4 @@ -.TH "NPM-FUND" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-FUND" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-fund\fR - Retrieve funding information .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-get.1 b/deps/npm/man/man1/npm-get.1 index 03c66b0379ff..d4763eb28c8c 100644 --- a/deps/npm/man/man1/npm-get.1 +++ b/deps/npm/man/man1/npm-get.1 @@ -1,4 +1,4 @@ -.TH "NPM-GET" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-GET" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-get\fR - Get a value from the npm configuration .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-help-search.1 b/deps/npm/man/man1/npm-help-search.1 index 00a4a24dce4a..63213fa4188a 100644 --- a/deps/npm/man/man1/npm-help-search.1 +++ b/deps/npm/man/man1/npm-help-search.1 @@ -1,4 +1,4 @@ -.TH "NPM-HELP-SEARCH" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-HELP-SEARCH" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-help-search\fR - Search npm help documentation .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-help.1 b/deps/npm/man/man1/npm-help.1 index 7462b626b6f0..59f2f1df9436 100644 --- a/deps/npm/man/man1/npm-help.1 +++ b/deps/npm/man/man1/npm-help.1 @@ -1,4 +1,4 @@ -.TH "NPM-HELP" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-HELP" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-help\fR - Get help on npm .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-init.1 b/deps/npm/man/man1/npm-init.1 index 80e94e4140e0..cf4c37761d14 100644 --- a/deps/npm/man/man1/npm-init.1 +++ b/deps/npm/man/man1/npm-init.1 @@ -1,4 +1,4 @@ -.TH "NPM-INIT" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-INIT" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-init\fR - Create a package.json file .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-install-ci-test.1 b/deps/npm/man/man1/npm-install-ci-test.1 index 77d75105800b..e30140015a1c 100644 --- a/deps/npm/man/man1/npm-install-ci-test.1 +++ b/deps/npm/man/man1/npm-install-ci-test.1 @@ -1,4 +1,4 @@ -.TH "NPM-INSTALL-CI-TEST" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-INSTALL-CI-TEST" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-install-ci-test\fR - Install a project with a clean slate and run tests .SS "Synopsis" @@ -23,7 +23,9 @@ Type: "hoisted", "nested", "shallow", or "linked" .RE 0 .P -Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: (experimental) install in node_modules/.store, link in place, unhoisted. +Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: install in node_modules/.store, link in place, unhoisted. +.P +We recommend that package authors use \fB--install-strategy=linked\fR during development to catch undeclared ("phantom") dependencies before publishing: the isolated layout only exposes a package's declared dependencies, so an \fBimport\fR of a package that was never added to \fBpackage.json\fR can fail instead of resolving by accident and shipping broken. See \fBCatching undeclared ("phantom") dependencies\fR \fI\(la/using-npm/developers#catching-undeclared-phantom-dependencies\(ra\fR. .SS "\fBlegacy-bundling\fR" .RS 0 .IP \(bu 4 @@ -190,6 +192,8 @@ Type: Boolean If \fBtrue\fR, turn the install-script policy from a warning into a hard error: any dependency with install scripts not covered by \fBallowScripts\fR will fail the install instead of running with a notice. .P Dependencies explicitly denied with \fBfalse\fR in \fBallowScripts\fR are always silently skipped; this setting only affects unreviewed entries. \fB--ignore-scripts\fR and \fB--dangerously-allow-all-scripts\fR both override this setting. +.P +Optional dependencies that cannot be installed on the current platform or engine (a non-matching \fBos\fR, \fBcpu\fR, or \fBlibc\fR) are not flagged, because their install scripts never run. .SS "\fBdangerously-allow-all-scripts\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-install-scripts.1 b/deps/npm/man/man1/npm-install-scripts.1 new file mode 100644 index 000000000000..907b48c50ff5 --- /dev/null +++ b/deps/npm/man/man1/npm-install-scripts.1 @@ -0,0 +1,133 @@ +.TH "NPM-INSTALL-SCRIPTS" "1" "July 2026" "NPM@11.19.0" "" +.SH "NAME" +\fBnpm-install-scripts\fR - Manage install-script approvals for dependencies +.SS "Synopsis" +.P +.RS 2 +.nf +npm install-scripts approve \[lB] ...\[rB] +npm install-scripts approve --all +npm install-scripts deny \[lB] ...\[rB] +npm install-scripts deny --all +npm install-scripts ls +npm install-scripts prune +.fi +.RE +.P +Note: This command is unaware of workspaces. +.SS "Description" +.P +Manages the \fBallowScripts\fR field in your project's \fBpackage.json\fR, which records which of your dependencies are permitted to run install scripts (\fBpreinstall\fR, \fBinstall\fR, \fBpostinstall\fR, and \fBprepare\fR for non-registry sources). This is the recommended way to maintain that field. +.P +Dependency install scripts are blocked by default. Install commands silently skip lifecycle scripts for any dependency that does not have a matching entry in \fBallowScripts\fR, and end with a list of the packages whose scripts were skipped so you can review them here. +.P +This command only works inside a project that has a \fBpackage.json\fR. Running it with \fB--global\fR (\fB-g\fR) fails with an \fBEGLOBAL\fR error, since global installs (\fBnpm install -g\fR) and one-off executions (\fBnpm exec\fR / \fBnpx\fR) have no project \fBpackage.json\fR to write to. To allow install scripts in those contexts, use the \fB--allow-scripts\fR flag at install time (for example \fBnpm install -g --allow-scripts=canvas,sharp\fR) or persist the setting with \fBnpm config set allow-scripts=canvas,sharp --location=user\fR. +.P +There are four subcommands: +.P +.RS 2 +.nf +npm install-scripts approve \[lB] ...\[rB] +npm install-scripts approve --all +npm install-scripts deny \[lB] ...\[rB] +npm install-scripts deny --all +npm install-scripts ls +npm install-scripts prune +.fi +.RE +.P +\fBapprove\fR allows install scripts for the named packages. \fB\fR matches every installed version of that package. By default it writes pinned entries (\fBpkg@1.2.3\fR), which keep their approval narrowed to the specific version you reviewed. Pass \fB--no-allow-scripts-pin\fR to write name-only entries that allow any future version. \fB--all\fR approves every package with unreviewed install scripts in one go. +.P +\fBdeny\fR records an explicit denial for the named packages (a name-only \fBfalse\fR entry), which survives \fBnpm install-scripts approve --all\fR and excludes the package from any future blanket approval. \fB--all\fR denies every package with unreviewed install scripts. +.P +\fBls\fR is read-only: it lists every package whose install scripts are not yet covered by \fBallowScripts\fR, without modifying \fBpackage.json\fR. +.P +\fBprune\fR removes \fBallowScripts\fR entries that no longer match an installed package with an install script, either because the package is no longer installed (a transitive dependency changed, or a pinned \fBpkg@1.2.3\fR was upgraded) or because it no longer has an install script. Both approvals (\fBtrue\fR) and denials (\fBfalse\fR) are removed. It edits only the \fBallowScripts\fR field in \fBpackage.json\fR, never \fB.npmrc\fR or \fB--allow-scripts\fR. Pass \fB--dry-run\fR to preview without writing. Unparseable keys are left alone. +.P +\fBapprove\fR honours the asymmetric pin rule: if you re-approve a package whose installed version has changed, the existing pin is rewritten to track the new installed version. Multi-version statements (\fBpkg@1 || 2\fR) are left alone, since they likely capture intent that the command cannot infer. Existing \fBfalse\fR entries always win; \fBapprove\fR will not silently re-allow a package you previously denied. +.P +The standalone commands npm help approve-scripts and npm help deny-scripts are aliases for \fBnpm install-scripts approve\fR and \fBnpm install-scripts deny\fR. +.SS "Examples" +.P +.RS 2 +.nf +# Approve all currently-installed install scripts after reviewing them +npm install-scripts approve --all + +# Approve specific packages, pinned to their installed version +npm install-scripts approve canvas sharp + +# Deny a package so it stays blocked +npm install-scripts deny telemetry-pkg + +# Preview which packages still need review +npm install-scripts ls + +# Preview stale allowScripts entries, then remove them +npm install-scripts prune --dry-run +npm install-scripts prune +.fi +.RE +.SS "Configuration" +.SS "\fBall\fR" +.RS 0 +.IP \(bu 4 +Default: false +.IP \(bu 4 +Type: Boolean +.RE 0 + +.P +Show or act on all packages, not just the ones your project directly depends on. For \fBnpm outdated\fR and \fBnpm ls\fR this lists every outdated or installed package. For \fBnpm approve-scripts\fR and \fBnpm deny-scripts\fR it selects every package with pending install scripts. +.SS "\fBallow-scripts-pin\fR" +.RS 0 +.IP \(bu 4 +Default: true +.IP \(bu 4 +Type: Boolean +.RE 0 + +.P +Write pinned (\fBpkg@version\fR) entries when approving install scripts. Set to \fBfalse\fR to write name-only entries that allow any version. Has no effect on \fBnpm deny-scripts\fR, which always writes name-only entries regardless of this setting. +.SS "\fBdry-run\fR" +.RS 0 +.IP \(bu 4 +Default: false +.IP \(bu 4 +Type: Boolean +.RE 0 + +.P +Indicates that you don't want npm to make any changes and that it should only report what it would have done. This can be passed into any of the commands that modify your local installation, eg, \fBinstall\fR, \fBupdate\fR, \fBdedupe\fR, \fBuninstall\fR, as well as \fBpack\fR and \fBpublish\fR. +.P +Note: This is NOT honored by other network related commands, eg \fBdist-tags\fR, \fBowner\fR, etc. +.SS "\fBjson\fR" +.RS 0 +.IP \(bu 4 +Default: false +.IP \(bu 4 +Type: Boolean +.RE 0 + +.P +Whether or not to output JSON data, rather than the normal output. +.RS 0 +.IP \(bu 4 +In \fBnpm pkg set\fR it enables parsing set values with JSON.parse() before saving them to your \fBpackage.json\fR. +.RE 0 + +.P +Not supported by all npm commands. +.SS "See Also" +.RS 0 +.IP \(bu 4 +npm help approve-scripts +.IP \(bu 4 +npm help deny-scripts +.IP \(bu 4 +npm help install +.IP \(bu 4 +npm help rebuild +.IP \(bu 4 +\fBpackage.json\fR \fI\(la/configuring-npm/package-json\(ra\fR +.RE 0 diff --git a/deps/npm/man/man1/npm-install-test.1 b/deps/npm/man/man1/npm-install-test.1 index bea21d8f9996..88e0ed187377 100644 --- a/deps/npm/man/man1/npm-install-test.1 +++ b/deps/npm/man/man1/npm-install-test.1 @@ -1,4 +1,4 @@ -.TH "NPM-INSTALL-TEST" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-INSTALL-TEST" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-install-test\fR - Install package(s) and run tests .SS "Synopsis" @@ -66,7 +66,9 @@ Type: "hoisted", "nested", "shallow", or "linked" .RE 0 .P -Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: (experimental) install in node_modules/.store, link in place, unhoisted. +Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: install in node_modules/.store, link in place, unhoisted. +.P +We recommend that package authors use \fB--install-strategy=linked\fR during development to catch undeclared ("phantom") dependencies before publishing: the isolated layout only exposes a package's declared dependencies, so an \fBimport\fR of a package that was never added to \fBpackage.json\fR can fail instead of resolving by accident and shipping broken. See \fBCatching undeclared ("phantom") dependencies\fR \fI\(la/using-npm/developers#catching-undeclared-phantom-dependencies\(ra\fR. .SS "\fBlegacy-bundling\fR" .RS 0 .IP \(bu 4 @@ -267,6 +269,8 @@ Type: Boolean If \fBtrue\fR, turn the install-script policy from a warning into a hard error: any dependency with install scripts not covered by \fBallowScripts\fR will fail the install instead of running with a notice. .P Dependencies explicitly denied with \fBfalse\fR in \fBallowScripts\fR are always silently skipped; this setting only affects unreviewed entries. \fB--ignore-scripts\fR and \fB--dangerously-allow-all-scripts\fR both override this setting. +.P +Optional dependencies that cannot be installed on the current platform or engine (a non-matching \fBos\fR, \fBcpu\fR, or \fBlibc\fR) are not flagged, because their install scripts never run. .SS "\fBdangerously-allow-all-scripts\fR" .RS 0 .IP \(bu 4 @@ -302,6 +306,9 @@ If the requested version is a \fBdist-tag\fR and the given tag does not pass the .P If \fBbefore\fR and \fBmin-release-age\fR are both set in the same source, \fBbefore\fR wins (an explicit absolute date overrides a relative window). Across sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one. .P +As with \fBmin-release-age\fR, when this cutoff blocks a fix that \fBnpm audit +fix\fR would install, npm keeps the vulnerable version, warns, and exits with a non-zero code. +.P Packages whose names match \fBmin-release-age-exclude\fR are exempt from this filter. .SS "\fBmin-release-age\fR" .RS 0 @@ -316,6 +323,8 @@ If set, npm will build the npm tree such that only versions that were available .P This flag is a complement to \fBbefore\fR, which accepts an exact date instead of a relative number of days. The two may coexist (e.g. \fBmin-release-age\fR in your \fB.npmrc\fR is preserved when npm internally spawns a sub-process with \fB--before\fR while preparing a \fBgit:\fR or \fBgithub:\fR dependency); when both apply, \fBbefore\fR wins within a single source and across sources the standard precedence rules apply. .P +When this window stops \fBnpm audit fix\fR from installing a patched version (because the fix was published too recently), npm keeps the package at its vulnerable version, warns that the fix was blocked, and exits with a non-zero code. To install the fix, add the package to \fBmin-release-age-exclude\fR, or relax \fBmin-release-age\fR or \fBbefore\fR. +.P Packages whose names match \fBmin-release-age-exclude\fR are exempt from this filter. .P This value is not exported to the environment for child processes. diff --git a/deps/npm/man/man1/npm-install.1 b/deps/npm/man/man1/npm-install.1 index c4a9d33e00e7..b1ccd245238d 100644 --- a/deps/npm/man/man1/npm-install.1 +++ b/deps/npm/man/man1/npm-install.1 @@ -1,4 +1,4 @@ -.TH "NPM-INSTALL" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-INSTALL" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-install\fR - Install a package .SS "Synopsis" @@ -456,7 +456,9 @@ Type: "hoisted", "nested", "shallow", or "linked" .RE 0 .P -Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: (experimental) install in node_modules/.store, link in place, unhoisted. +Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: install in node_modules/.store, link in place, unhoisted. +.P +We recommend that package authors use \fB--install-strategy=linked\fR during development to catch undeclared ("phantom") dependencies before publishing: the isolated layout only exposes a package's declared dependencies, so an \fBimport\fR of a package that was never added to \fBpackage.json\fR can fail instead of resolving by accident and shipping broken. See \fBCatching undeclared ("phantom") dependencies\fR \fI\(la/using-npm/developers#catching-undeclared-phantom-dependencies\(ra\fR. .SS "\fBlegacy-bundling\fR" .RS 0 .IP \(bu 4 @@ -657,6 +659,8 @@ Type: Boolean If \fBtrue\fR, turn the install-script policy from a warning into a hard error: any dependency with install scripts not covered by \fBallowScripts\fR will fail the install instead of running with a notice. .P Dependencies explicitly denied with \fBfalse\fR in \fBallowScripts\fR are always silently skipped; this setting only affects unreviewed entries. \fB--ignore-scripts\fR and \fB--dangerously-allow-all-scripts\fR both override this setting. +.P +Optional dependencies that cannot be installed on the current platform or engine (a non-matching \fBos\fR, \fBcpu\fR, or \fBlibc\fR) are not flagged, because their install scripts never run. .SS "\fBdangerously-allow-all-scripts\fR" .RS 0 .IP \(bu 4 @@ -692,6 +696,9 @@ If the requested version is a \fBdist-tag\fR and the given tag does not pass the .P If \fBbefore\fR and \fBmin-release-age\fR are both set in the same source, \fBbefore\fR wins (an explicit absolute date overrides a relative window). Across sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one. .P +As with \fBmin-release-age\fR, when this cutoff blocks a fix that \fBnpm audit +fix\fR would install, npm keeps the vulnerable version, warns, and exits with a non-zero code. +.P Packages whose names match \fBmin-release-age-exclude\fR are exempt from this filter. .SS "\fBmin-release-age\fR" .RS 0 @@ -706,6 +713,8 @@ If set, npm will build the npm tree such that only versions that were available .P This flag is a complement to \fBbefore\fR, which accepts an exact date instead of a relative number of days. The two may coexist (e.g. \fBmin-release-age\fR in your \fB.npmrc\fR is preserved when npm internally spawns a sub-process with \fB--before\fR while preparing a \fBgit:\fR or \fBgithub:\fR dependency); when both apply, \fBbefore\fR wins within a single source and across sources the standard precedence rules apply. .P +When this window stops \fBnpm audit fix\fR from installing a patched version (because the fix was published too recently), npm keeps the package at its vulnerable version, warns that the fix was blocked, and exits with a non-zero code. To install the fix, add the package to \fBmin-release-age-exclude\fR, or relax \fBmin-release-age\fR or \fBbefore\fR. +.P Packages whose names match \fBmin-release-age-exclude\fR are exempt from this filter. .P This value is not exported to the environment for child processes. diff --git a/deps/npm/man/man1/npm-link.1 b/deps/npm/man/man1/npm-link.1 index 52b718e15e9c..d124bcf66a33 100644 --- a/deps/npm/man/man1/npm-link.1 +++ b/deps/npm/man/man1/npm-link.1 @@ -1,4 +1,4 @@ -.TH "NPM-LINK" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-LINK" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-link\fR - Symlink a package folder .SS "Synopsis" @@ -133,7 +133,9 @@ Type: "hoisted", "nested", "shallow", or "linked" .RE 0 .P -Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: (experimental) install in node_modules/.store, link in place, unhoisted. +Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: install in node_modules/.store, link in place, unhoisted. +.P +We recommend that package authors use \fB--install-strategy=linked\fR during development to catch undeclared ("phantom") dependencies before publishing: the isolated layout only exposes a package's declared dependencies, so an \fBimport\fR of a package that was never added to \fBpackage.json\fR can fail instead of resolving by accident and shipping broken. See \fBCatching undeclared ("phantom") dependencies\fR \fI\(la/using-npm/developers#catching-undeclared-phantom-dependencies\(ra\fR. .SS "\fBlegacy-bundling\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-ll.1 b/deps/npm/man/man1/npm-ll.1 index cd62068571d7..982d8ee3a6c7 100644 --- a/deps/npm/man/man1/npm-ll.1 +++ b/deps/npm/man/man1/npm-ll.1 @@ -1,4 +1,4 @@ -.TH "NPM-LL" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-LL" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-ll\fR - List installed packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-login.1 b/deps/npm/man/man1/npm-login.1 index 3848cf175db3..392c5b25d84d 100644 --- a/deps/npm/man/man1/npm-login.1 +++ b/deps/npm/man/man1/npm-login.1 @@ -1,4 +1,4 @@ -.TH "NPM-LOGIN" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-LOGIN" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-login\fR - Login to a registry user account .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-logout.1 b/deps/npm/man/man1/npm-logout.1 index ebb1c62f3199..7ca6be27366c 100644 --- a/deps/npm/man/man1/npm-logout.1 +++ b/deps/npm/man/man1/npm-logout.1 @@ -1,4 +1,4 @@ -.TH "NPM-LOGOUT" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-LOGOUT" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-logout\fR - Log out of the registry .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-ls.1 b/deps/npm/man/man1/npm-ls.1 index f1d982134141..6fe6245988fe 100644 --- a/deps/npm/man/man1/npm-ls.1 +++ b/deps/npm/man/man1/npm-ls.1 @@ -1,4 +1,4 @@ -.TH "NPM-LS" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-LS" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-ls\fR - List installed packages .SS "Synopsis" @@ -20,7 +20,7 @@ Positional arguments are \fBname@version-range\fR identifiers, which will limit .P .RS 2 .nf -npm@11.17.0 /path/to/npm +npm@11.19.0 /path/to/npm └─┬ init-package-json@0.0.4 └── promzard@0.1.5 .fi diff --git a/deps/npm/man/man1/npm-org.1 b/deps/npm/man/man1/npm-org.1 index 879be21b203a..50e94a589d49 100644 --- a/deps/npm/man/man1/npm-org.1 +++ b/deps/npm/man/man1/npm-org.1 @@ -1,4 +1,4 @@ -.TH "NPM-ORG" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-ORG" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-org\fR - Manage orgs .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-outdated.1 b/deps/npm/man/man1/npm-outdated.1 index 446ddba893f3..a2ecbcc50b5c 100644 --- a/deps/npm/man/man1/npm-outdated.1 +++ b/deps/npm/man/man1/npm-outdated.1 @@ -1,4 +1,4 @@ -.TH "NPM-OUTDATED" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-OUTDATED" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-outdated\fR - Check for outdated packages .SS "Synopsis" @@ -182,6 +182,9 @@ If the requested version is a \fBdist-tag\fR and the given tag does not pass the .P If \fBbefore\fR and \fBmin-release-age\fR are both set in the same source, \fBbefore\fR wins (an explicit absolute date overrides a relative window). Across sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one. .P +As with \fBmin-release-age\fR, when this cutoff blocks a fix that \fBnpm audit +fix\fR would install, npm keeps the vulnerable version, warns, and exits with a non-zero code. +.P Packages whose names match \fBmin-release-age-exclude\fR are exempt from this filter. .SS "\fBmin-release-age\fR" .RS 0 @@ -196,6 +199,8 @@ If set, npm will build the npm tree such that only versions that were available .P This flag is a complement to \fBbefore\fR, which accepts an exact date instead of a relative number of days. The two may coexist (e.g. \fBmin-release-age\fR in your \fB.npmrc\fR is preserved when npm internally spawns a sub-process with \fB--before\fR while preparing a \fBgit:\fR or \fBgithub:\fR dependency); when both apply, \fBbefore\fR wins within a single source and across sources the standard precedence rules apply. .P +When this window stops \fBnpm audit fix\fR from installing a patched version (because the fix was published too recently), npm keeps the package at its vulnerable version, warns that the fix was blocked, and exits with a non-zero code. To install the fix, add the package to \fBmin-release-age-exclude\fR, or relax \fBmin-release-age\fR or \fBbefore\fR. +.P Packages whose names match \fBmin-release-age-exclude\fR are exempt from this filter. .P This value is not exported to the environment for child processes. diff --git a/deps/npm/man/man1/npm-owner.1 b/deps/npm/man/man1/npm-owner.1 index f257550482cc..3815d60d8b2b 100644 --- a/deps/npm/man/man1/npm-owner.1 +++ b/deps/npm/man/man1/npm-owner.1 @@ -1,4 +1,4 @@ -.TH "NPM-OWNER" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-OWNER" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-owner\fR - Manage package owners .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-pack.1 b/deps/npm/man/man1/npm-pack.1 index 64de41545273..f5f159779bdc 100644 --- a/deps/npm/man/man1/npm-pack.1 +++ b/deps/npm/man/man1/npm-pack.1 @@ -1,4 +1,4 @@ -.TH "NPM-PACK" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-PACK" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-pack\fR - Create a tarball from a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-ping.1 b/deps/npm/man/man1/npm-ping.1 index 8f4292b8b5e9..e44d02e67e88 100644 --- a/deps/npm/man/man1/npm-ping.1 +++ b/deps/npm/man/man1/npm-ping.1 @@ -1,4 +1,4 @@ -.TH "NPM-PING" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-PING" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-ping\fR - Ping npm registry .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-pkg.1 b/deps/npm/man/man1/npm-pkg.1 index fba0a9b61aee..ad4adfa8c654 100644 --- a/deps/npm/man/man1/npm-pkg.1 +++ b/deps/npm/man/man1/npm-pkg.1 @@ -1,4 +1,4 @@ -.TH "NPM-PKG" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-PKG" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-pkg\fR - Manages your package.json .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-prefix.1 b/deps/npm/man/man1/npm-prefix.1 index 17248aa54d53..a810bc8c0140 100644 --- a/deps/npm/man/man1/npm-prefix.1 +++ b/deps/npm/man/man1/npm-prefix.1 @@ -1,4 +1,4 @@ -.TH "NPM-PREFIX" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-PREFIX" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-prefix\fR - Display prefix .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-profile.1 b/deps/npm/man/man1/npm-profile.1 index c050f580f4c8..0593fa483958 100644 --- a/deps/npm/man/man1/npm-profile.1 +++ b/deps/npm/man/man1/npm-profile.1 @@ -1,4 +1,4 @@ -.TH "NPM-PROFILE" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-PROFILE" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-profile\fR - Change settings on your registry profile .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-prune.1 b/deps/npm/man/man1/npm-prune.1 index d70133afd0dc..c62e7d6bd395 100644 --- a/deps/npm/man/man1/npm-prune.1 +++ b/deps/npm/man/man1/npm-prune.1 @@ -1,4 +1,4 @@ -.TH "NPM-PRUNE" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-PRUNE" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-prune\fR - Remove extraneous packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-publish.1 b/deps/npm/man/man1/npm-publish.1 index d25d25c75904..62676301d5ab 100644 --- a/deps/npm/man/man1/npm-publish.1 +++ b/deps/npm/man/man1/npm-publish.1 @@ -1,4 +1,4 @@ -.TH "NPM-PUBLISH" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-PUBLISH" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-publish\fR - Publish a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-query.1 b/deps/npm/man/man1/npm-query.1 index 654f2c33242b..3ca4eb1b659f 100644 --- a/deps/npm/man/man1/npm-query.1 +++ b/deps/npm/man/man1/npm-query.1 @@ -1,4 +1,4 @@ -.TH "NPM-QUERY" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-QUERY" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-query\fR - Dependency selector query .SS "Synopsis" @@ -289,6 +289,9 @@ If the requested version is a \fBdist-tag\fR and the given tag does not pass the .P If \fBbefore\fR and \fBmin-release-age\fR are both set in the same source, \fBbefore\fR wins (an explicit absolute date overrides a relative window). Across sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one. .P +As with \fBmin-release-age\fR, when this cutoff blocks a fix that \fBnpm audit +fix\fR would install, npm keeps the vulnerable version, warns, and exits with a non-zero code. +.P Packages whose names match \fBmin-release-age-exclude\fR are exempt from this filter. .SS "\fBmin-release-age\fR" .RS 0 @@ -303,6 +306,8 @@ If set, npm will build the npm tree such that only versions that were available .P This flag is a complement to \fBbefore\fR, which accepts an exact date instead of a relative number of days. The two may coexist (e.g. \fBmin-release-age\fR in your \fB.npmrc\fR is preserved when npm internally spawns a sub-process with \fB--before\fR while preparing a \fBgit:\fR or \fBgithub:\fR dependency); when both apply, \fBbefore\fR wins within a single source and across sources the standard precedence rules apply. .P +When this window stops \fBnpm audit fix\fR from installing a patched version (because the fix was published too recently), npm keeps the package at its vulnerable version, warns that the fix was blocked, and exits with a non-zero code. To install the fix, add the package to \fBmin-release-age-exclude\fR, or relax \fBmin-release-age\fR or \fBbefore\fR. +.P Packages whose names match \fBmin-release-age-exclude\fR are exempt from this filter. .P This value is not exported to the environment for child processes. diff --git a/deps/npm/man/man1/npm-rebuild.1 b/deps/npm/man/man1/npm-rebuild.1 index 9c4aac4a2491..b0710049573e 100644 --- a/deps/npm/man/man1/npm-rebuild.1 +++ b/deps/npm/man/man1/npm-rebuild.1 @@ -1,4 +1,4 @@ -.TH "NPM-REBUILD" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-REBUILD" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-rebuild\fR - Rebuild a package .SS "Synopsis" @@ -127,6 +127,8 @@ Type: Boolean If \fBtrue\fR, turn the install-script policy from a warning into a hard error: any dependency with install scripts not covered by \fBallowScripts\fR will fail the install instead of running with a notice. .P Dependencies explicitly denied with \fBfalse\fR in \fBallowScripts\fR are always silently skipped; this setting only affects unreviewed entries. \fB--ignore-scripts\fR and \fB--dangerously-allow-all-scripts\fR both override this setting. +.P +Optional dependencies that cannot be installed on the current platform or engine (a non-matching \fBos\fR, \fBcpu\fR, or \fBlibc\fR) are not flagged, because their install scripts never run. .SS "\fBdangerously-allow-all-scripts\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man1/npm-repo.1 b/deps/npm/man/man1/npm-repo.1 index 2ddf9937d8e7..46fdc0cb111e 100644 --- a/deps/npm/man/man1/npm-repo.1 +++ b/deps/npm/man/man1/npm-repo.1 @@ -1,4 +1,4 @@ -.TH "NPM-REPO" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-REPO" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-repo\fR - Open package repository page in the browser .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-restart.1 b/deps/npm/man/man1/npm-restart.1 index 2b9b1161058b..b552a5e2a86a 100644 --- a/deps/npm/man/man1/npm-restart.1 +++ b/deps/npm/man/man1/npm-restart.1 @@ -1,4 +1,4 @@ -.TH "NPM-RESTART" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-RESTART" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-restart\fR - Restart a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-root.1 b/deps/npm/man/man1/npm-root.1 index 7b85912e45cf..9d701e336bff 100644 --- a/deps/npm/man/man1/npm-root.1 +++ b/deps/npm/man/man1/npm-root.1 @@ -1,4 +1,4 @@ -.TH "NPM-ROOT" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-ROOT" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-root\fR - Display npm root .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-run.1 b/deps/npm/man/man1/npm-run.1 index 0beb0b5fd044..185111dbafbb 100644 --- a/deps/npm/man/man1/npm-run.1 +++ b/deps/npm/man/man1/npm-run.1 @@ -1,4 +1,4 @@ -.TH "NPM-RUN" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-RUN" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-run\fR - Run arbitrary package scripts .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-sbom.1 b/deps/npm/man/man1/npm-sbom.1 index c04aca73069b..a8a74f9e02c6 100644 --- a/deps/npm/man/man1/npm-sbom.1 +++ b/deps/npm/man/man1/npm-sbom.1 @@ -1,4 +1,4 @@ -.TH "NPM-SBOM" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-SBOM" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-sbom\fR - Generate a Software Bill of Materials (SBOM) .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-search.1 b/deps/npm/man/man1/npm-search.1 index 72e8175649c8..2a0fbbc58709 100644 --- a/deps/npm/man/man1/npm-search.1 +++ b/deps/npm/man/man1/npm-search.1 @@ -1,4 +1,4 @@ -.TH "NPM-SEARCH" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-SEARCH" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-search\fR - Search for packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-set.1 b/deps/npm/man/man1/npm-set.1 index 84190092eaa8..4333006b47ff 100644 --- a/deps/npm/man/man1/npm-set.1 +++ b/deps/npm/man/man1/npm-set.1 @@ -1,4 +1,4 @@ -.TH "NPM-SET" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-SET" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-set\fR - Set a value in the npm configuration .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-shrinkwrap.1 b/deps/npm/man/man1/npm-shrinkwrap.1 index faf1d8081df6..0fc20a6ccaeb 100644 --- a/deps/npm/man/man1/npm-shrinkwrap.1 +++ b/deps/npm/man/man1/npm-shrinkwrap.1 @@ -1,4 +1,4 @@ -.TH "NPM-SHRINKWRAP" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-SHRINKWRAP" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-shrinkwrap\fR - Lock down dependency versions for publication .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-stage.1 b/deps/npm/man/man1/npm-stage.1 index 20549ea1b368..9a677ba6b03e 100644 --- a/deps/npm/man/man1/npm-stage.1 +++ b/deps/npm/man/man1/npm-stage.1 @@ -1,4 +1,4 @@ -.TH "NPM-STAGE" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-STAGE" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-stage\fR - Stage packages for publishing .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-star.1 b/deps/npm/man/man1/npm-star.1 index 545945e0bdbc..dbabe90b0bd6 100644 --- a/deps/npm/man/man1/npm-star.1 +++ b/deps/npm/man/man1/npm-star.1 @@ -1,4 +1,4 @@ -.TH "NPM-STAR" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-STAR" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-star\fR - Mark your favorite packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-stars.1 b/deps/npm/man/man1/npm-stars.1 index 1eb8ca9b8f31..2999dd8abbf0 100644 --- a/deps/npm/man/man1/npm-stars.1 +++ b/deps/npm/man/man1/npm-stars.1 @@ -1,4 +1,4 @@ -.TH "NPM-STARS" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-STARS" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-stars\fR - View packages marked as favorites .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-start.1 b/deps/npm/man/man1/npm-start.1 index 7722f5aa5bfa..c8966bd38a68 100644 --- a/deps/npm/man/man1/npm-start.1 +++ b/deps/npm/man/man1/npm-start.1 @@ -1,4 +1,4 @@ -.TH "NPM-START" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-START" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-start\fR - Start a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-stop.1 b/deps/npm/man/man1/npm-stop.1 index df8ec8448baa..c900d58437f5 100644 --- a/deps/npm/man/man1/npm-stop.1 +++ b/deps/npm/man/man1/npm-stop.1 @@ -1,4 +1,4 @@ -.TH "NPM-STOP" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-STOP" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-stop\fR - Stop a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-team.1 b/deps/npm/man/man1/npm-team.1 index 4ef28794fc6c..4de50f8c6b06 100644 --- a/deps/npm/man/man1/npm-team.1 +++ b/deps/npm/man/man1/npm-team.1 @@ -1,4 +1,4 @@ -.TH "NPM-TEAM" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-TEAM" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-team\fR - Manage organization teams and team memberships .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-test.1 b/deps/npm/man/man1/npm-test.1 index b000e1bc6417..311ba399498b 100644 --- a/deps/npm/man/man1/npm-test.1 +++ b/deps/npm/man/man1/npm-test.1 @@ -1,4 +1,4 @@ -.TH "NPM-TEST" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-TEST" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-test\fR - Test a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-token.1 b/deps/npm/man/man1/npm-token.1 index a6823c2e2fa5..4b1cbae98b24 100644 --- a/deps/npm/man/man1/npm-token.1 +++ b/deps/npm/man/man1/npm-token.1 @@ -1,4 +1,4 @@ -.TH "NPM-TOKEN" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-TOKEN" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-token\fR - Manage your authentication tokens .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-trust.1 b/deps/npm/man/man1/npm-trust.1 index 9d20c2d45e8e..f8de6022c0f0 100644 --- a/deps/npm/man/man1/npm-trust.1 +++ b/deps/npm/man/man1/npm-trust.1 @@ -1,4 +1,4 @@ -.TH "NPM-TRUST" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-TRUST" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-trust\fR - Manage trusted publishing relationships between packages and CI/CD providers .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-undeprecate.1 b/deps/npm/man/man1/npm-undeprecate.1 index 896fdb1f228f..1a26688b4530 100644 --- a/deps/npm/man/man1/npm-undeprecate.1 +++ b/deps/npm/man/man1/npm-undeprecate.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNDEPRECATE" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-UNDEPRECATE" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-undeprecate\fR - Undeprecate a version of a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-uninstall.1 b/deps/npm/man/man1/npm-uninstall.1 index 7384f0c4b2ac..39791e588e7e 100644 --- a/deps/npm/man/man1/npm-uninstall.1 +++ b/deps/npm/man/man1/npm-uninstall.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNINSTALL" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-UNINSTALL" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-uninstall\fR - Remove a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-unpublish.1 b/deps/npm/man/man1/npm-unpublish.1 index 15ece4ea1512..f839376efe0f 100644 --- a/deps/npm/man/man1/npm-unpublish.1 +++ b/deps/npm/man/man1/npm-unpublish.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNPUBLISH" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-UNPUBLISH" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-unpublish\fR - Remove a package from the registry .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-unstar.1 b/deps/npm/man/man1/npm-unstar.1 index 756d74ff7191..555868c3fb68 100644 --- a/deps/npm/man/man1/npm-unstar.1 +++ b/deps/npm/man/man1/npm-unstar.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNSTAR" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-UNSTAR" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-unstar\fR - Remove an item from your favorite packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-update.1 b/deps/npm/man/man1/npm-update.1 index 1d2904e2000d..55b4191e801b 100644 --- a/deps/npm/man/man1/npm-update.1 +++ b/deps/npm/man/man1/npm-update.1 @@ -1,4 +1,4 @@ -.TH "NPM-UPDATE" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-UPDATE" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-update\fR - Update packages .SS "Synopsis" @@ -174,7 +174,9 @@ Type: "hoisted", "nested", "shallow", or "linked" .RE 0 .P -Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: (experimental) install in node_modules/.store, link in place, unhoisted. +Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: install in node_modules/.store, link in place, unhoisted. +.P +We recommend that package authors use \fB--install-strategy=linked\fR during development to catch undeclared ("phantom") dependencies before publishing: the isolated layout only exposes a package's declared dependencies, so an \fBimport\fR of a package that was never added to \fBpackage.json\fR can fail instead of resolving by accident and shipping broken. See \fBCatching undeclared ("phantom") dependencies\fR \fI\(la/using-npm/developers#catching-undeclared-phantom-dependencies\(ra\fR. .SS "\fBlegacy-bundling\fR" .RS 0 .IP \(bu 4 @@ -303,6 +305,8 @@ Type: Boolean If \fBtrue\fR, turn the install-script policy from a warning into a hard error: any dependency with install scripts not covered by \fBallowScripts\fR will fail the install instead of running with a notice. .P Dependencies explicitly denied with \fBfalse\fR in \fBallowScripts\fR are always silently skipped; this setting only affects unreviewed entries. \fB--ignore-scripts\fR and \fB--dangerously-allow-all-scripts\fR both override this setting. +.P +Optional dependencies that cannot be installed on the current platform or engine (a non-matching \fBos\fR, \fBcpu\fR, or \fBlibc\fR) are not flagged, because their install scripts never run. .SS "\fBdangerously-allow-all-scripts\fR" .RS 0 .IP \(bu 4 @@ -338,6 +342,9 @@ If the requested version is a \fBdist-tag\fR and the given tag does not pass the .P If \fBbefore\fR and \fBmin-release-age\fR are both set in the same source, \fBbefore\fR wins (an explicit absolute date overrides a relative window). Across sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one. .P +As with \fBmin-release-age\fR, when this cutoff blocks a fix that \fBnpm audit +fix\fR would install, npm keeps the vulnerable version, warns, and exits with a non-zero code. +.P Packages whose names match \fBmin-release-age-exclude\fR are exempt from this filter. .SS "\fBmin-release-age\fR" .RS 0 @@ -352,6 +359,8 @@ If set, npm will build the npm tree such that only versions that were available .P This flag is a complement to \fBbefore\fR, which accepts an exact date instead of a relative number of days. The two may coexist (e.g. \fBmin-release-age\fR in your \fB.npmrc\fR is preserved when npm internally spawns a sub-process with \fB--before\fR while preparing a \fBgit:\fR or \fBgithub:\fR dependency); when both apply, \fBbefore\fR wins within a single source and across sources the standard precedence rules apply. .P +When this window stops \fBnpm audit fix\fR from installing a patched version (because the fix was published too recently), npm keeps the package at its vulnerable version, warns that the fix was blocked, and exits with a non-zero code. To install the fix, add the package to \fBmin-release-age-exclude\fR, or relax \fBmin-release-age\fR or \fBbefore\fR. +.P Packages whose names match \fBmin-release-age-exclude\fR are exempt from this filter. .P This value is not exported to the environment for child processes. diff --git a/deps/npm/man/man1/npm-version.1 b/deps/npm/man/man1/npm-version.1 index 165689083e7f..fd261b5cd42a 100644 --- a/deps/npm/man/man1/npm-version.1 +++ b/deps/npm/man/man1/npm-version.1 @@ -1,4 +1,4 @@ -.TH "NPM-VERSION" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-VERSION" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-version\fR - Bump a package version .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-view.1 b/deps/npm/man/man1/npm-view.1 index f487a05cc30e..a150ce2d979d 100644 --- a/deps/npm/man/man1/npm-view.1 +++ b/deps/npm/man/man1/npm-view.1 @@ -1,4 +1,4 @@ -.TH "NPM-VIEW" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-VIEW" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-view\fR - View registry info .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-whoami.1 b/deps/npm/man/man1/npm-whoami.1 index 93c147ae1626..920d19146bd3 100644 --- a/deps/npm/man/man1/npm-whoami.1 +++ b/deps/npm/man/man1/npm-whoami.1 @@ -1,4 +1,4 @@ -.TH "NPM-WHOAMI" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM-WHOAMI" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-whoami\fR - Display npm username .SS "Synopsis" diff --git a/deps/npm/man/man1/npm.1 b/deps/npm/man/man1/npm.1 index 29634dd59b29..9791f5f274f5 100644 --- a/deps/npm/man/man1/npm.1 +++ b/deps/npm/man/man1/npm.1 @@ -1,4 +1,4 @@ -.TH "NPM" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPM" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm\fR - javascript package manager .SS "Synopsis" @@ -12,7 +12,7 @@ npm Note: This command is unaware of workspaces. .SS "Version" .P -11.17.0 +11.19.0 .SS "Description" .P npm is the package manager for the Node JavaScript platform. It puts modules in place so that node can find them, and manages dependency conflicts intelligently. diff --git a/deps/npm/man/man1/npx.1 b/deps/npm/man/man1/npx.1 index d8d510d6d9bf..3c4afb8aec51 100644 --- a/deps/npm/man/man1/npx.1 +++ b/deps/npm/man/man1/npx.1 @@ -1,4 +1,4 @@ -.TH "NPX" "1" "June 2026" "NPM@11.17.0" "" +.TH "NPX" "1" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpx\fR - Run a command from a local or remote npm package .SS "Synopsis" diff --git a/deps/npm/man/man5/folders.5 b/deps/npm/man/man5/folders.5 index 5dd5cc2f5c53..0717f575c47f 100644 --- a/deps/npm/man/man5/folders.5 +++ b/deps/npm/man/man5/folders.5 @@ -1,4 +1,4 @@ -.TH "FOLDERS" "5" "June 2026" "NPM@11.17.0" "" +.TH "FOLDERS" "5" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBFolders\fR - Folder structures used by npm .SS "Description" diff --git a/deps/npm/man/man5/install.5 b/deps/npm/man/man5/install.5 index ecd657bf2a4b..200dcc3dfd3a 100644 --- a/deps/npm/man/man5/install.5 +++ b/deps/npm/man/man5/install.5 @@ -1,4 +1,4 @@ -.TH "INSTALL" "5" "June 2026" "NPM@11.17.0" "" +.TH "INSTALL" "5" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBInstall\fR - Download and install node and npm .SS "Description" diff --git a/deps/npm/man/man5/npm-global.5 b/deps/npm/man/man5/npm-global.5 index 5dd5cc2f5c53..0717f575c47f 100644 --- a/deps/npm/man/man5/npm-global.5 +++ b/deps/npm/man/man5/npm-global.5 @@ -1,4 +1,4 @@ -.TH "FOLDERS" "5" "June 2026" "NPM@11.17.0" "" +.TH "FOLDERS" "5" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBFolders\fR - Folder structures used by npm .SS "Description" diff --git a/deps/npm/man/man5/npm-json.5 b/deps/npm/man/man5/npm-json.5 index b1a7646edc8f..4d4a9084ac7a 100644 --- a/deps/npm/man/man5/npm-json.5 +++ b/deps/npm/man/man5/npm-json.5 @@ -1,4 +1,4 @@ -.TH "PACKAGE.JSON" "5" "June 2026" "NPM@11.17.0" "" +.TH "PACKAGE.JSON" "5" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBpackage.json\fR - Specifics of npm's package.json handling .SS "Description" diff --git a/deps/npm/man/man5/npm-shrinkwrap-json.5 b/deps/npm/man/man5/npm-shrinkwrap-json.5 index 25c446d62389..9f3d7597d161 100644 --- a/deps/npm/man/man5/npm-shrinkwrap-json.5 +++ b/deps/npm/man/man5/npm-shrinkwrap-json.5 @@ -1,4 +1,4 @@ -.TH "NPM-SHRINKWRAP.JSON" "5" "June 2026" "NPM@11.17.0" "" +.TH "NPM-SHRINKWRAP.JSON" "5" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBnpm-shrinkwrap.json\fR - A publishable lockfile .SS "Description" diff --git a/deps/npm/man/man5/npmrc.5 b/deps/npm/man/man5/npmrc.5 index f57ca1f46819..83578c624089 100644 --- a/deps/npm/man/man5/npmrc.5 +++ b/deps/npm/man/man5/npmrc.5 @@ -1,4 +1,4 @@ -.TH ".NPMRC" "5" "June 2026" "NPM@11.17.0" "" +.TH ".NPMRC" "5" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fB.npmrc\fR - The npm config files .SS "Description" diff --git a/deps/npm/man/man5/package-json.5 b/deps/npm/man/man5/package-json.5 index b1a7646edc8f..4d4a9084ac7a 100644 --- a/deps/npm/man/man5/package-json.5 +++ b/deps/npm/man/man5/package-json.5 @@ -1,4 +1,4 @@ -.TH "PACKAGE.JSON" "5" "June 2026" "NPM@11.17.0" "" +.TH "PACKAGE.JSON" "5" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBpackage.json\fR - Specifics of npm's package.json handling .SS "Description" diff --git a/deps/npm/man/man5/package-lock-json.5 b/deps/npm/man/man5/package-lock-json.5 index 527fc62ab1bb..7bc632269f50 100644 --- a/deps/npm/man/man5/package-lock-json.5 +++ b/deps/npm/man/man5/package-lock-json.5 @@ -1,4 +1,4 @@ -.TH "PACKAGE-LOCK.JSON" "5" "June 2026" "NPM@11.17.0" "" +.TH "PACKAGE-LOCK.JSON" "5" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBpackage-lock.json\fR - A manifestation of the manifest .SS "Description" diff --git a/deps/npm/man/man7/config.7 b/deps/npm/man/man7/config.7 index 75c854342d85..b68980abc38f 100644 --- a/deps/npm/man/man7/config.7 +++ b/deps/npm/man/man7/config.7 @@ -1,4 +1,4 @@ -.TH "CONFIG" "7" "June 2026" "NPM@11.17.0" "" +.TH "CONFIG" "7" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBConfig\fR - About npm configuration .SS "Description" @@ -333,6 +333,9 @@ If the requested version is a \fBdist-tag\fR and the given tag does not pass the .P If \fBbefore\fR and \fBmin-release-age\fR are both set in the same source, \fBbefore\fR wins (an explicit absolute date overrides a relative window). Across sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one. .P +As with \fBmin-release-age\fR, when this cutoff blocks a fix that \fBnpm audit +fix\fR would install, npm keeps the vulnerable version, warns, and exits with a non-zero code. +.P Packages whose names match \fBmin-release-age-exclude\fR are exempt from this filter. .SS "\fBbin-links\fR" .RS 0 @@ -1020,7 +1023,9 @@ Type: "hoisted", "nested", "shallow", or "linked" .RE 0 .P -Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: (experimental) install in node_modules/.store, link in place, unhoisted. +Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. linked: install in node_modules/.store, link in place, unhoisted. +.P +We recommend that package authors use \fB--install-strategy=linked\fR during development to catch undeclared ("phantom") dependencies before publishing: the isolated layout only exposes a package's declared dependencies, so an \fBimport\fR of a package that was never added to \fBpackage.json\fR can fail instead of resolving by accident and shipping broken. See \fBCatching undeclared ("phantom") dependencies\fR \fI\(la/using-npm/developers#catching-undeclared-phantom-dependencies\(ra\fR. .SS "\fBjson\fR" .RS 0 .IP \(bu 4 @@ -1202,6 +1207,8 @@ If set, npm will build the npm tree such that only versions that were available .P This flag is a complement to \fBbefore\fR, which accepts an exact date instead of a relative number of days. The two may coexist (e.g. \fBmin-release-age\fR in your \fB.npmrc\fR is preserved when npm internally spawns a sub-process with \fB--before\fR while preparing a \fBgit:\fR or \fBgithub:\fR dependency); when both apply, \fBbefore\fR wins within a single source and across sources the standard precedence rules apply. .P +When this window stops \fBnpm audit fix\fR from installing a patched version (because the fix was published too recently), npm keeps the package at its vulnerable version, warns that the fix was blocked, and exits with a non-zero code. To install the fix, add the package to \fBmin-release-age-exclude\fR, or relax \fBmin-release-age\fR or \fBbefore\fR. +.P Packages whose names match \fBmin-release-age-exclude\fR are exempt from this filter. .P This value is not exported to the environment for child processes. @@ -1586,7 +1593,9 @@ Defines behavior for replacing the registry host in a lockfile with the configur .P The default behavior is to replace package dist URLs from the default registry (https://registry.npmjs.org) to the configured registry. If set to "never", then use the registry value. If set to "always", then replace the registry host with the configured host every time. .P -You may also specify a bare hostname (e.g., "registry.npmjs.org"). +You may also specify a bare hostname (e.g., "registry.npmjs.org") to only replace URLs coming from that host. +.P +You may also specify a full URL including a path (e.g., "https://old-registry.example.com/npm/path"). In that case, resolved URLs whose host and path begin with that prefix will have the entire prefix replaced with the configured registry URL (host and path), without duplicating path segments. .SS "\fBsave\fR" .RS 0 .IP \(bu 4 @@ -1847,6 +1856,8 @@ Type: Boolean If \fBtrue\fR, turn the install-script policy from a warning into a hard error: any dependency with install scripts not covered by \fBallowScripts\fR will fail the install instead of running with a notice. .P Dependencies explicitly denied with \fBfalse\fR in \fBallowScripts\fR are always silently skipped; this setting only affects unreviewed entries. \fB--ignore-scripts\fR and \fB--dangerously-allow-all-scripts\fR both override this setting. +.P +Optional dependencies that cannot be installed on the current platform or engine (a non-matching \fBos\fR, \fBcpu\fR, or \fBlibc\fR) are not flagged, because their install scripts never run. .SS "\fBstrict-peer-deps\fR" .RS 0 .IP \(bu 4 diff --git a/deps/npm/man/man7/dependency-selectors.7 b/deps/npm/man/man7/dependency-selectors.7 index be698295b15f..4d242ab6e6c4 100644 --- a/deps/npm/man/man7/dependency-selectors.7 +++ b/deps/npm/man/man7/dependency-selectors.7 @@ -1,4 +1,4 @@ -.TH "SELECTORS" "7" "June 2026" "NPM@11.17.0" "" +.TH "SELECTORS" "7" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBSelectors\fR - Dependency Selector Syntax & Querying .SS "Description" diff --git a/deps/npm/man/man7/developers.7 b/deps/npm/man/man7/developers.7 index 0956c032d8f6..201aedc081dd 100644 --- a/deps/npm/man/man7/developers.7 +++ b/deps/npm/man/man7/developers.7 @@ -1,4 +1,4 @@ -.TH "DEVELOPERS" "7" "June 2026" "NPM@11.17.0" "" +.TH "DEVELOPERS" "7" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBDevelopers\fR - Developer guide .SS "Description" @@ -184,6 +184,23 @@ npm install ../my-package to install it locally into the node_modules folder in that other place. .P Then go into the node-repl, and try using require("my-thing") to bring in your module's main module. +.SS "Catching undeclared (\"phantom\") dependencies" +.P +Under the default hoisted \fBnode_modules\fR layout, your package can \fBimport\fR a dependency it never declared and still resolve it. A transitive dependency hoisted alongside it, or your workspace root's \fBnode_modules\fR, happens to satisfy the \fBimport\fR. That undeclared ("phantom") dependency passes your own build silently, then fails for anyone who installs your package on its own. +.P +We recommend developing your package under \fB\[rs]fBinstall-strategy=linked\[rs]fR\fR \fI\(la/using-npm/config#install-strategy\(ra\fR. The isolated layout only exposes a package's \fIdeclared\fR dependencies, so an \fBimport\fR of an undeclared package fails for you during development instead of resolving by accident, shipping broken, and failing for your users: +.P +.RS 2 +.nf +npm install --install-strategy=linked +npm test +.fi +.RE +.RS 0 +.P +\fBNote:\fR This doesn't catch every case. A dependency that's still satisfied at your build by a \fBdevDependency\fR or by your workspace root's \fBnode_modules\fR can resolve fine for you and still be missing for whoever installs your package. So treat it as one check, not a guarantee, alongside auditing the dependencies your published package actually uses. +.RE 0 + .SS "Create a User Account" .P Create a user with the adduser command. It works like this: diff --git a/deps/npm/man/man7/logging.7 b/deps/npm/man/man7/logging.7 index 3d037957e556..be1e6ea6fffa 100644 --- a/deps/npm/man/man7/logging.7 +++ b/deps/npm/man/man7/logging.7 @@ -1,4 +1,4 @@ -.TH "LOGGING" "7" "June 2026" "NPM@11.17.0" "" +.TH "LOGGING" "7" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBLogging\fR - Why, What & How we Log .SS "Description" diff --git a/deps/npm/man/man7/orgs.7 b/deps/npm/man/man7/orgs.7 index 3224946c994e..43732ecdb5cb 100644 --- a/deps/npm/man/man7/orgs.7 +++ b/deps/npm/man/man7/orgs.7 @@ -1,4 +1,4 @@ -.TH "ORGANIZATIONS" "7" "June 2026" "NPM@11.17.0" "" +.TH "ORGANIZATIONS" "7" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBOrganizations\fR - Working with teams & organizations .SS "Description" diff --git a/deps/npm/man/man7/package-spec.7 b/deps/npm/man/man7/package-spec.7 index 8c57645a9ca7..d76da151b48e 100644 --- a/deps/npm/man/man7/package-spec.7 +++ b/deps/npm/man/man7/package-spec.7 @@ -1,4 +1,4 @@ -.TH "SPEC" "7" "June 2026" "NPM@11.17.0" "" +.TH "SPEC" "7" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBspec\fR - Package name specifier .SS "Description" diff --git a/deps/npm/man/man7/registry.7 b/deps/npm/man/man7/registry.7 index 6fc1fa42503e..16e295f6ac11 100644 --- a/deps/npm/man/man7/registry.7 +++ b/deps/npm/man/man7/registry.7 @@ -1,4 +1,4 @@ -.TH "REGISTRY" "7" "June 2026" "NPM@11.17.0" "" +.TH "REGISTRY" "7" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBRegistry\fR - The JavaScript Package Registry .SS "Description" diff --git a/deps/npm/man/man7/removal.7 b/deps/npm/man/man7/removal.7 index 63295bda5955..1e0a0ddd0cf3 100644 --- a/deps/npm/man/man7/removal.7 +++ b/deps/npm/man/man7/removal.7 @@ -1,4 +1,4 @@ -.TH "REMOVAL" "7" "June 2026" "NPM@11.17.0" "" +.TH "REMOVAL" "7" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBRemoval\fR - Cleaning the slate .SS "Synopsis" diff --git a/deps/npm/man/man7/scope.7 b/deps/npm/man/man7/scope.7 index 5d81873536a6..6bb685d20984 100644 --- a/deps/npm/man/man7/scope.7 +++ b/deps/npm/man/man7/scope.7 @@ -1,4 +1,4 @@ -.TH "SCOPE" "7" "June 2026" "NPM@11.17.0" "" +.TH "SCOPE" "7" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBScope\fR - Scoped packages .SS "Description" diff --git a/deps/npm/man/man7/scripts.7 b/deps/npm/man/man7/scripts.7 index 6f104de691ad..797e70b65138 100644 --- a/deps/npm/man/man7/scripts.7 +++ b/deps/npm/man/man7/scripts.7 @@ -1,4 +1,4 @@ -.TH "SCRIPTS" "7" "June 2026" "NPM@11.17.0" "" +.TH "SCRIPTS" "7" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBScripts\fR - How npm handles the "scripts" field .SS "Description" diff --git a/deps/npm/man/man7/workspaces.7 b/deps/npm/man/man7/workspaces.7 index d68c1394c1c8..fb9807cdfe4c 100644 --- a/deps/npm/man/man7/workspaces.7 +++ b/deps/npm/man/man7/workspaces.7 @@ -1,4 +1,4 @@ -.TH "WORKSPACES" "7" "June 2026" "NPM@11.17.0" "" +.TH "WORKSPACES" "7" "July 2026" "NPM@11.19.0" "" .SH "NAME" \fBWorkspaces\fR - Working with workspaces .SS "Description" diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js index 68527972b1fc..2f8ed83e1153 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js @@ -97,6 +97,7 @@ module.exports = cls => class IdealTreeBuilder extends cls { #loadFailures = new Set() #manifests = new Map() #mutateTree = false + #requestedTreeMutation = false // a map of each module in a peer set to the thing that depended on // that set of peers in the first place. Use a WeakMap so that we // don't hold onto references for nodes that are garbage collected. @@ -261,12 +262,13 @@ module.exports = cls => class IdealTreeBuilder extends cls { // set if we add anything, but also set here if we know we'll make // changes and thus have to maybe prune later. - this.#mutateTree = !!( + this.#requestedTreeMutation = !!( options.add || options.rm || update.all || update.names.length ) + this.#mutateTree = this.#requestedTreeMutation } // load the initial tree, either the virtualTree from a shrinkwrap, @@ -344,7 +346,9 @@ module.exports = cls => class IdealTreeBuilder extends cls { filter: node => node, visit: node => { for (const edge of node.edgesOut.values()) { - const skipPeerOptional = edge.type === 'peerOptional' && this.options.save === false + const skipPeerOptional = edge.type === 'peerOptional' && + this.options.save === false && + !this.#requestedTreeMutation if (!skipPeerOptional && (!edge.to || !edge.valid)) { this.#depsQueue.push(node) break // no need to continue the loop after the first hit @@ -579,6 +583,17 @@ module.exports = cls => class IdealTreeBuilder extends cls { // and leaving the user subject to getting it overwritten later anyway. async #queueVulnDependents (options) { for (const vuln of this.auditReport.values()) { + // A fix is available in-range but a release-age window blocks the patched + // version, so audit fix leaves this package at a vulnerable version. + if (vuln.fixBlockedByReleaseAge) { + const { version, before } = vuln.fixBlockedByReleaseAge + const cutoff = new Date(before).toISOString().slice(0, 10) + log.warn('audit', `A fix for ${vuln.name} is available (${vuln.name}@${version}) ` + + `but was published after the configured release-age cutoff (${cutoff}), so ` + + `${vuln.name} was left at a vulnerable version.\n` + + `To install it, add "${vuln.name}" to min-release-age-exclude, or relax ` + + 'min-release-age or before.') + } for (const node of vuln.nodes) { const bundler = node.getBundler() @@ -1036,9 +1051,16 @@ This is a one-time fix-up, please be patient... } const { from, valid, peerConflicted } = edgeIn if (!peerConflicted && !valid) { - if (this.#depsSeen.has(from) && this.options.save) { - // Re-queue already-processed nodes when a newly placed dep creates an invalid edge during npm install (save=true). - // This handles the case where a peerOptional dep was valid (missing) when the node was first processed, but becomes invalid when the dep is later placed by another path with a version that doesn't satisfy the peer spec. + if (this.#depsSeen.has(from) && + (this.options.save || + (this.options.save === false && this.#requestedTreeMutation))) { + // Re-queue already-processed nodes when a newly placed dep + // creates an invalid edge during npm install or another + // lockfile-mutating operation. This handles the case where a + // peerOptional dep was valid (missing) when the node was + // first processed, but becomes invalid when the dep is later + // placed by another path with a version that doesn't satisfy + // the peer spec. // See npm/cli#8726. this.#depsSeen.delete(from) this.#depsQueue.push(from) @@ -1249,11 +1271,16 @@ This is a one-time fix-up, please be patient... continue } - // If the edge has an error, there's a problem, unless it's peerOptional and we're not saving (e.g. npm ci), in which case we trust the lockfile and skip re-resolution. - // When saving (npm install), peerOptional invalid edges ARE treated as problems so the lockfile gets fixed. + // If the edge has an error, there's a problem, unless it's peerOptional + // and we're not saving or otherwise mutating (e.g. npm ci), in which + // case we trust the lockfile and skip re-resolution. When saving (npm + // install) or updating, peerOptional invalid edges ARE treated as + // problems so the lockfile gets fixed. // See npm/cli#8726. if (!edge.valid) { - if (edge.type !== 'peerOptional' || this.options.save !== false) { + if (edge.type !== 'peerOptional' || + this.options.save !== false || + this.#requestedTreeMutation) { problems.push(edge) } continue @@ -1478,6 +1505,12 @@ This is a one-time fix-up, please be patient... continue } + // The recursion above may replace node with a compatible peer, detaching it. + // A detached node has no real conflict to report, so stop instead of crashing on it. + if (!node.parent) { + break + } + // problem this.#failPeerConflict(edge, parentEdge) } @@ -1568,6 +1601,10 @@ This is a one-time fix-up, please be patient... !link.target.parent && !link.target.fsParent || unseenLink) { + // Forward the link's overrides before its subtree resolves, so a root override reaches a transitive dep across the link boundary (npm/cli#9659). + if (link.overrides) { + link.target.updateOverridesEdgeInAdded(link.overrides) + } this.addTracker('idealTree', link.target.name, link.target.location) this.#depsQueue.push(link.target) } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js index a63f607ef687..a07c55e3f283 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js @@ -266,7 +266,9 @@ module.exports = cls => class IsolatedReifier extends cls { } // local `file:` deps (non-workspace fsChildren) should be treated as local dependencies, not external, so they get symlinked directly instead of being extracted into the store. - const isLocal = (n) => n.isWorkspace || node.fsChildren?.has(n) + // A file: dep surfaces as a Link edge whose resolved spec starts with file:; detect it from the edge so the target is treated as local even when it is absent from idealTree.fsChildren (a workspace consumer, or a target outside the repo root via npm link). + const fileLinkTargets = new Set(edges.filter(e => e.to?.isLink && e.to.resolved?.startsWith('file:')).map(e => e.to.target)) + const isLocal = (n) => n.isWorkspace || node.fsChildren?.has(n) || fileLinkTargets.has(n) const optionalDeps = edges.filter(edge => edge.optional).map(edge => edge.to.target) // Optional peers declared only in peerDependenciesMeta (e.g. `@types/react`) have no edge, so the materialization above misses them. diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-actual.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-actual.js index 2356227a5baa..2158f6d32ae1 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-actual.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/load-actual.js @@ -1,6 +1,6 @@ // mix-in implementing the loadActual method -const { dirname, join, normalize, relative, resolve } = require('node:path') +const { dirname, join, normalize, relative, resolve, sep } = require('node:path') const PackageJson = require('@npmcli/package-json') const { readdirScoped } = require('@npmcli/fs') @@ -70,6 +70,7 @@ module.exports = cls => class ActualLoader extends cls { // only reset root flags if we're not re-rooting, // otherwise leave as-is calcDepFlags(tree, !options.root) + this.#repropagateOverrides() this.actualTree = treeCheck(tree) return this.actualTree }) @@ -141,6 +142,7 @@ module.exports = cls => class ActualLoader extends cls { root: this.#actualTree, }) await this[_setWorkspaces](this.#actualTree) + this.#linkActualWorkspaces() this.#transplant(root) return this.#actualTree @@ -173,6 +175,8 @@ module.exports = cls => class ActualLoader extends cls { await Promise.all(promises) } + this.#linkActualWorkspaces() + if (!ignoreMissing) { await this.#findMissingEdges() } @@ -211,6 +215,48 @@ module.exports = cls => class ActualLoader extends cls { return this.#actualTree } + // Under the linked (isolated) strategy, workspaces the root does not depend on are not symlinked into the root node_modules, so neither the on-disk scan nor the hidden lockfile gives the root's workspace edges a node_modules/ link to resolve to. + // Synthesize those links from the authoritative workspaces map so npm ls and npm query surface the workspaces, matching hoisted and the logical package-lock. + #linkActualWorkspaces () { + const root = this.#actualTree + if (this.options.installStrategy !== 'linked' || !root.workspaces) { + return + } + // Declared workspaces ARE symlinked at root node_modules under linked, so a missing link there is a real problem that must surface as UNMET. + // Only undeclared workspaces are intentionally absent from root node_modules and need a synthesized link so their root edges resolve. + const pkg = root.package + const declared = new Set(Object.keys(Object.assign({}, + pkg.dependencies, + pkg.devDependencies, + pkg.optionalDependencies, + pkg.peerDependencies + ))) + // index loaded workspace targets by both path and realpath, so a workspace reached through a symlinked dir still matches + const byLoc = new Map() + for (const node of root.fsChildren) { + byLoc.set(node.path, node) + byLoc.set(node.realpath, node) + } + for (const [name, path] of root.workspaces.entries()) { + // declared workspaces, and any name already a root child, resolve their edge without a synthesized link + if (declared.has(name) || root.children.has(name)) { + continue + } + const target = byLoc.get(path) + if (target) { + // eslint-disable-next-line no-new + new Link({ + name, + path: resolve(root.path, 'node_modules', name), + realpath: target.realpath, + target, + parent: root, + root, + }) + } + } + } + #transplant (root) { if (!root || root === this.#actualTree) { return @@ -263,6 +309,9 @@ module.exports = cls => class ActualLoader extends cls { parent, root, loadOverrides, + // A package physically located in the linked strategy's store is a transitive dependency, not a real tree top, so it must not load its devDependencies. + // Never flag the loaded root itself, even if its own path happens to sit under a .store directory. + isInStore: path !== this.path && real.includes(`${sep}node_modules${sep}.store${sep}`), } try { @@ -352,6 +401,18 @@ module.exports = cls => class ActualLoader extends cls { } } + // Re-forward overrides through links once all edges are resolved, since a Link may forward before its subtree resolves and miss a transitive match (npm/cli#9619, #9659). + #repropagateOverrides () { + if (!this.#actualTree.overrides) { + return + } + for (const node of this.#actualTree.inventory.values()) { + if (node.isLink && node.overrides) { + node.recalculateOutEdgesOverrides() + } + } + } + async #findMissingEdges () { // try to resolve any missing edges by walking up the directory tree, // checking for the package in each node_modules folder. stop at the @@ -368,9 +429,10 @@ module.exports = cls => class ActualLoader extends cls { const depPromises = [] for (const [name, edge] of node.edgesOut.entries()) { - const notMissing = !edge.missing && - !(edge.to && (edge.to.dummy || edge.to.parent !== node)) - if (notMissing) { + // An unresolved optional edge reports missing === false, so check the target directly. + // Otherwise an installed optional dep that lives only as a store sibling is never loaded. + const resolved = edge.to && !edge.to.dummy && edge.to.parent === node + if (resolved) { continue } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js index e70a2186c297..a99d328f5d29 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js @@ -11,7 +11,7 @@ const { depth: dfwalk } = require('treeverse') const { isNodeGypPackage, defaultGypInstallScript } = require('@npmcli/node-gyp') const { promiseRetry } = require('@gar/promise-retry') const { log, time } = require('proc-log') -const { resolve } = require('node:path') +const { resolve, delimiter } = require('node:path') const { isScriptAllowed } = require('../script-allowed.js') const boolEnv = b => b ? '1' : '' @@ -199,10 +199,21 @@ module.exports = cls => class Builder extends cls { const { package: { bin, scripts = {} } } = node.target const { preinstall, install, postinstall, prepare } = scripts const tests = { bin, preinstall, install, postinstall, prepare } + // A denied package (allowScripts resolves to `false`) still gets its + // bins linked; only its lifecycle scripts are skipped, matching + // --ignore-scripts (npm/cli#9681). --dangerously-allow-all-scripts + // bypasses the gate. + const scriptsDenied = + !this.options.dangerouslyAllowAllScripts && + isScriptAllowed(node, this.options.allowScripts) === false for (const [key, has] of Object.entries(tests)) { - if (has) { - this.#queues[key].push(node) + if (!has) { + continue } + if (key !== 'bin' && scriptsDenied) { + continue + } + this.#queues[key].push(node) } } timeEnd() @@ -226,18 +237,6 @@ module.exports = cls => class Builder extends cls { return } - // Phase 1 allowScripts gate: a `false` verdict from the policy matcher - // means the user explicitly denied install scripts for this node, so skip - // it. `true` and `null` (unreviewed) both fall through to the existing - // detection logic — unreviewed nodes still run their scripts in Phase 1 - // and are surfaced via the post-reify advisory warning. The global - // --ignore-scripts kill switch in #build() still takes precedence, and - // --dangerously-allow-all-scripts bypasses this gate entirely. - if (!this.options.dangerouslyAllowAllScripts && - isScriptAllowed(node, this.options.allowScripts) === false) { - return - } - if (this.#oldMeta === null) { const { root: { meta } } = node this.#oldMeta = meta && meta.loadedFromDisk && @@ -301,6 +300,7 @@ module.exports = cls => class Builder extends cls { await promiseCallLimit(queue.map(node => async () => { const { path, + name, integrity, resolved, optional, @@ -309,6 +309,7 @@ module.exports = cls => class Builder extends cls { devOptional, package: pkg, location, + isInStore, } = node.target // skip any that we know we'll be deleting @@ -330,6 +331,12 @@ module.exports = cls => class Builder extends cls { npm_package_dev_optional: boolEnv(devOptional && !dev && !optional), } + // In the linked strategy a store package's dependencies are symlinked siblings in its store node_modules. + // A separate bin invoked by the script (e.g. napi-postinstall) resolves modules from its own realpath in the store and cannot see those deps, so expose them via NODE_PATH. + if (isInStore) { + const storeNodeModules = resolve(path, ...name.split('/').map(() => '..')) + env.NODE_PATH = [storeNodeModules, process.env.NODE_PATH].filter(Boolean).join(delimiter) + } const runOpts = { event, path, diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js index c49f352cef14..db5171ff7367 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js @@ -11,7 +11,7 @@ const { callLimit: promiseCallLimit } = require('promise-call-limit') const { depth: dfwalk } = require('treeverse') const { dirname, resolve, relative, join, sep } = require('node:path') const { log, time } = require('proc-log') -const { existsSync } = require('node:fs') +const { existsSync, realpathSync } = require('node:fs') const { lstat, mkdir, readdir, readlink, rm, symlink } = require('node:fs/promises') const { moveFile } = require('@npmcli/fs') const { subset, intersects } = require('semver') @@ -26,7 +26,8 @@ const optionalSet = require('../optional-set.js') const relpath = require('../relpath.js') const retirePath = require('../retire-path.js') const treeCheck = require('../tree-check.js') -const { defaultLockfileVersion } = require('../shrinkwrap.js') +const Shrinkwrap = require('../shrinkwrap.js') +const { defaultLockfileVersion } = Shrinkwrap const { saveTypeMap, hasSubKey } = require('../add-rm-pkg-deps.js') const { IsolatedNode, IsolatedLink } = require('../isolated-classes.js') @@ -77,6 +78,9 @@ module.exports = cls => class Reifier extends cls { #sparseTreeDirs = new Set() #sparseTreeRoots = new Set() #linkedActualForDiff = null + // Under the linked strategy the audit runs against this non-isolated ideal tree. + // The isolated tree's inventory has no queryable indexes and its edges route through symlinks, so auditing it reports no vulnerabilities. + #linkedIdealForAudit = null constructor (options) { super(options) @@ -86,7 +90,9 @@ module.exports = cls => class Reifier extends cls { // public method async reify (options = {}) { - const linked = (options.installStrategy || this.options.installStrategy) === 'linked' + // Global installs are normalized to the shallow strategy in the constructor; honor that here so a per-call installStrategy:'linked' can't re-engage the unsupported linked path. + const linked = !this.options.global && + (options.installStrategy || this.options.installStrategy) === 'linked' if (this.options.packageLockOnly && this.options.global) { const er = new Error('cannot generate lockfile for global packages') @@ -112,32 +118,50 @@ module.exports = cls => class Reifier extends cls { await this[_loadTrees](options) const oldTree = this.idealTree + // Kept to serialize the hidden lockfile from the on-disk .store/symlink layout. + let isolatedTree = null if (linked) { // swap out the tree with the isolated tree // this is currently technical debt which will be resolved in a refactor // of Node/Link trees - log.warn('reify', 'The "linked" install strategy is EXPERIMENTAL and may contain bugs.') this.idealTree = await this.createIsolatedTree() + isolatedTree = this.idealTree if (this.actualTree) { this.#linkedActualForDiff = this.#buildLinkedActualForDiff( this.idealTree, this.actualTree ) } + // Keep the non-isolated tree so the quick audit can run against it. + this.#linkedIdealForAudit = oldTree } - await this[_diffTrees]() - await this.#reifyPackages() - if (linked) { - // The sweep mutates node_modules on disk, so skip it for dry runs and lockfile-only installs (those modes also short-circuit #reifyPackages). - // The sweep itself scopes to in-filter workspaces when a filter is active, so it's safe to run for filtered installs too. - if (!this.options.dryRun && !this.options.packageLockOnly) { - await this.#cleanOrphanedStoreEntries() + try { + await this[_diffTrees]() + await this.#reifyPackages() + if (linked) { + // The sweep mutates node_modules on disk, so skip it for dry runs and lockfile-only installs (those modes also short-circuit #reifyPackages). + // The sweep itself scopes to in-filter workspaces when a filter is active, so it's safe to run for filtered installs too. + if (!this.options.dryRun && !this.options.packageLockOnly) { + await this.#cleanOrphanedStoreEntries() + } + } else if (!this.options.dryRun && !this.options.packageLockOnly) { + // The .store directory is exclusively a linked-strategy artifact, and load-actual ignores dot-directories, so the diff never sees it. + // Remove it here when switching away from linked so it does not linger under hoisted/nested. + // Only do this for a full-project install: a workspace-filtered or --workspaces=false install may leave out-of-scope workspaces with links still pointing into the store. + const filtered = this.options.workspaces.length > 0 || !this.options.workspacesEnabled + if (!filtered) { + await this.#removeStaleStoreDir() + } + } + } finally { + // Restore the non-isolated tree so the lockfile is preserved and a reused Arborist never sees the isolated tree, even if reify throws. + if (linked) { + this.idealTree = oldTree } - // swap back in the idealTree - // so that the lockfile is preserved - this.idealTree = oldTree + // The quick audit has captured its tree synchronously by now, so drop the stashed references even on throw. + this.#linkedIdealForAudit = null + this.#linkedActualForDiff = null } await this[_saveIdealTree](options) - this.#linkedActualForDiff = null // clean inert for (const node of this.idealTree.inventory.values()) { if (node.inert) { @@ -230,17 +254,24 @@ module.exports = cls => class Reifier extends cls { calcDepFlags(this.idealTree) } - // save the ideal's meta as a hidden lockfile after we actualize it - this.idealTree.meta.filename = - this.idealTree.realpath + '/node_modules/.package-lock.json' - this.idealTree.meta.hiddenLockfile = true - this.idealTree.meta.lockfileVersion = defaultLockfileVersion + // save the ideal's meta as a hidden lockfile after we actualize it. + // Under linked the logical tree is the hoisted layout, so the hidden lockfile is serialized from the isolated tree instead. + if (!linked) { + this.idealTree.meta.filename = + this.idealTree.realpath + '/node_modules/.package-lock.json' + this.idealTree.meta.hiddenLockfile = true + this.idealTree.meta.lockfileVersion = defaultLockfileVersion + } this.actualTree = this.idealTree this.idealTree = null if (!this.options.global && !this.options.dryRun) { - await this.actualTree.meta.save() + if (linked) { + await this.#saveLinkedHiddenLockfile(isolatedTree) + } else { + await this.actualTree.meta.save() + } const ignoreScripts = !!this.options.ignoreScripts // if we aren't doing a dry run or ignoring scripts and we actually made changes to the dep // tree, then run the dependencies scripts @@ -452,7 +483,10 @@ module.exports = cls => class Reifier extends cls { } if (includeRootDeps) { // add all non-workspace nodes to filterNodes - for (const tree of [this.idealTree, this.actualTree]) { + // Skip the actual tree under the linked diff wrapper: its edge targets have root===actualTree, not the wrapper, which trips Diff.calculate's filterNode guard. + // The ideal-side targets alone scope the diff. + const trees = this.#linkedActualForDiff ? [this.idealTree] : [this.idealTree, this.actualTree] + for (const tree of trees) { for (const { type, to } of tree.edgesOut.values()) { if (type !== 'workspace' && to) { filterNodes.push(to) @@ -823,6 +857,47 @@ module.exports = cls => class Reifier extends cls { return join(filePath) } + // Serialize the hidden lockfile from the isolated tree, which mirrors the on-disk .store/symlink layout. + // Its children are every materialized node_modules entry: store package dirs and all symlinks. + async #saveLinkedHiddenLockfile (isolatedTree) { + const path = isolatedTree.realpath + const meta = new Shrinkwrap({ + path, + hiddenLockfile: true, + lockfileVersion: defaultLockfileVersion, + resolveOptions: this.options, + }) + meta.reset() + meta.filename = resolve(path, 'node_modules/.package-lock.json') + const storeRe = /^(.*\/\.store\/.+?)\/node_modules\// + const containers = new Set() + const nodes = new Set() + for (const node of isolatedTree.children.values()) { + // Tree-only undeclared workspace self-links aren't on disk. + if (node.isUndeclaredWorkspaceLink) { + continue + } + nodes.add(node) + // Record the enclosing .store/ dir so loadVirtual can resolve a store package's sibling deps. + // node.location uses the platform separator; lockfile keys are posix. + const m = node.location.replace(/\\/g, '/').match(storeRe) + if (m) { + containers.add(m[1]) + } + } + // Workspace dirs hold their own dep symlinks; record them so the cache can validate those subtrees. + for (const ws of isolatedTree.fsChildren) { + nodes.add(ws) + } + for (const node of nodes) { + meta.add(node) + } + for (const loc of containers) { + meta.data.packages[loc] = {} + } + await meta.save() + } + // Build a flat actual tree wrapper for linked installs so the diff can correctly match store entries that already exist on disk. // The proxy tree from createIsolatedTree() is flat (all children on root), but loadActual() produces a nested tree where store entries are deep link targets. // This wrapper surfaces them at the root level for comparison. @@ -841,6 +916,10 @@ module.exports = cls => class Reifier extends cls { if (child.isLink && child.resolved?.startsWith('file:.store/') && !existsSync(child.realpath)) { continue } + // Skip a link whose on-disk target is a valid-but-wrong store key (e.g. an interrupted update), so the diff repoints it via ADD. + if (child.isLink && this.#linkTargetMismatch(child)) { + continue + } let entry if (child.isLink) { entry = new IsolatedLink(child) @@ -880,6 +959,12 @@ module.exports = cls => class Reifier extends cls { return wrapper } + // True when the link's on-disk target resolves to a different path than its ideal target. + // The caller only invokes this once both paths exist, so realpathSync won't throw. + #linkTargetMismatch (child) { + return realpathSync(child.path) !== realpathSync(child.realpath) + } + // When extracting a registry-resolved package, the spec we hand to pacote is name@URL. // pacote re-parses that with npa and gets spec.type === 'remote', so without an override the allow-remote gate would fire on every registry tarball (both =none and =root mis-fire). // Returns true only when we are confident this is a registry-mediated install. @@ -888,12 +973,14 @@ module.exports = cls => class Reifier extends cls { return false } try { - const resolved = new URL(node.resolved) + // Match the effective fetch URL, not the raw lockfile value. + // #registryResolved applies replace-registry-host, rewriting a public-registry pin to the configured proxy/mirror so it matches. + const resolvedURL = new URL(this.#registryResolved(node.resolved)) // pickRegistry only consults spec.scope, so a bare-name (tag) parse is sufficient and avoids a node.version dependency. const registry = new URL(pickRegistry(npa(node.name), this.options)) const registryPath = registry.pathname.replace(/\/?$/, '/') - return resolved.origin === registry.origin && - (registryPath === '/' || resolved.pathname.startsWith(registryPath)) + return resolvedURL.origin === registry.origin && + (registryPath === '/' || resolvedURL.pathname.startsWith(registryPath)) } catch { return false } @@ -910,36 +997,42 @@ module.exports = cls => class Reifier extends cls { // the default reg as the magical animal that it has been. try { const resolvedURL = hgi.parseUrl(resolved) + const registryURL = new URL(this.registry) + const registryPath = registryURL.pathname.replace(/\/$/, '') - if ((this.options.replaceRegistryHost === resolvedURL.hostname) || - this.options.replaceRegistryHost === 'always') { - const registryURL = new URL(this.registry) + let matchURL = null + try { + matchURL = new URL(this.options.replaceRegistryHost) + } catch { + // keep matchURL null + } - // Replace the host with the registry host while keeping the path intact - resolvedURL.hostname = registryURL.hostname - resolvedURL.port = registryURL.port - resolvedURL.protocol = registryURL.protocol + const matchHost = matchURL?.hostname ?? this.options.replaceRegistryHost + const matchPath = matchURL?.pathname.replace(/\/$/, '') ?? null + const hasPathPrefix = (pathname, prefix) => + pathname === prefix || pathname.startsWith(`${prefix}/`) - // Make sure we don't double-include the path if it's already there - const registryPath = registryURL.pathname.replace(/\/$/, '') + const hostMatches = this.options.replaceRegistryHost === 'always' || matchHost === resolvedURL.hostname + const pathMatches = !matchPath || hasPathPrefix(resolvedURL.pathname, matchPath) - if (registryPath && registryPath !== '/') { - // Check if the resolved pathname already starts with the registry path - // We need to ensure it's a proper path prefix, not just a string prefix - // e.g., registry path '/npm' should not match '/npm-run-path' - const hasRegistryPath = resolvedURL.pathname === registryPath || - resolvedURL.pathname.startsWith(registryPath + '/') + if (!hostMatches || !pathMatches) { + return resolved + } - if (!hasRegistryPath) { - // Since hostname is changed, we need to ensure the registry path is included - resolvedURL.pathname = registryPath + resolvedURL.pathname - } - } + resolvedURL.protocol = registryURL.protocol + resolvedURL.hostname = registryURL.hostname + resolvedURL.port = registryURL.port - return resolvedURL.toString() + if (matchPath) { + // full-URL prefix: swap old path prefix for the registry path + resolvedURL.pathname = registryPath + resolvedURL.pathname.slice(matchPath.length) + } else if (registryPath && !hasPathPrefix(resolvedURL.pathname, registryPath)) { + // host-only: prepend registry path if not already present + resolvedURL.pathname = registryPath + resolvedURL.pathname } - return resolved - } catch (e) { + + return resolvedURL.toString() + } catch { // if we could not parse the url at all then returning nothing // here means it will get removed from the tree in the next step return undefined @@ -1150,7 +1243,8 @@ module.exports = cls => class Reifier extends cls { // with the reification, and be resolved at a later time. const timeEnd = time.start('reify:audit') const options = { ...this.options } - const tree = this.idealTree + // Under the linked strategy idealTree is the isolated tree, which the audit cannot traverse; audit the non-isolated tree instead. + const tree = this.#linkedIdealForAudit || this.idealTree // if we're operating on a workspace, only audit the workspace deps if (this.options.workspaces.length) { @@ -1357,6 +1451,18 @@ module.exports = cls => class Reifier extends cls { timeEnd() } + // Remove the root .store left behind by a previous linked install when reifying under a non-linked strategy. + async #removeStaleStoreDir () { + const storeDir = resolve(this.path, 'node_modules', '.store') + if (!existsSync(storeDir)) { + return + } + log.silly('reify', 'removing stale .store from a previous linked install') + await rm(storeDir, { recursive: true, force: true }) + .catch(/* istanbul ignore next -- rm with force rarely fails */ + er => log.warn('cleanup', 'Failed to remove stale .store directory', er)) + } + // After a linked install, scan node_modules/.store/ and remove any directories that are not referenced by the current ideal tree. // Store entries become orphaned when dependencies are updated or removed, because the diff never sees the old store keys. // Then sweep the top-level node_modules/ for orphaned symlinks (e.g. an uninstalled dep whose store entry was just removed) so we don't leave dangling links. @@ -1395,6 +1501,8 @@ module.exports = cls => class Reifier extends cls { // Locations are normalized to forward slashes here because IsolatedNode/IsolatedLink locations are built with path.join, which uses backslashes on Windows. const validKeys = new Set() const nmDirs = new Map() + // Valid bin shim names per node_modules dir, collected from each top-level entry's package.bin so the .bin sweep keeps only shims a still-installed package provides. + const binsByDir = new Map() const NM_PREFIX = 'node_modules/' const STORE_MARKER = '/.store/' for (const child of this.idealTree.children.values()) { @@ -1407,13 +1515,11 @@ module.exports = cls => class Reifier extends cls { validKeys.add(key) continue } - if (!child.isLink) { - continue - } // Tree-only Links never exist on disk; skipping them lets the sweep remove any stale self-link left by an older npm version. - if (child.isUndeclaredWorkspaceLink) { + if (child.isLink && child.isUndeclaredWorkspaceLink) { continue } + // Real top-level Nodes (e.g. the root's bundled deps) fall through here too, so they are recorded as valid and never swept as stale. const nmIdx = loc.lastIndexOf(NM_PREFIX) if (nmIdx === -1 || loc.includes(STORE_MARKER)) { continue @@ -1434,6 +1540,19 @@ module.exports = cls => class Reifier extends cls { nmDirs.set(dir, set) } set.add(entry) + + // package.bin is normalized to an object keyed by bin name; shim names are unscoped even for scoped packages. + const bin = child.package?.bin + if (bin && typeof bin === 'object') { + let binSet = binsByDir.get(dir) + if (!binSet) { + binSet = new Set() + binsByDir.set(dir, binSet) + } + for (const bn of Object.keys(bin)) { + binSet.add(bn) + } + } } // Determine which node_modules directories to sweep. @@ -1507,14 +1626,47 @@ module.exports = cls => class Reifier extends cls { for (const [dir, valid] of nmDirs) { await this.#cleanOrphanedTopLevelLinks(dir, valid) + await this.#cleanStaleBinLinks(dir, binsByDir.get(dir)) } } + // Remove stale bin shims left in node_modules/.bin after an uninstall under linked, where the diff never emits an action to drop them. + // A shim is stale when no still-linked package provides its name, or when it is a dangling symlink; matching by name handles both POSIX symlinks and Windows .cmd/.ps1 shims. + async #cleanStaleBinLinks (nmDir, validBins = new Set()) { + const binDir = resolve(nmDir, '.bin') + let names + try { + names = await readdir(binDir) + } catch { + return + } + + const stale = names.filter(name => { + const base = name.replace(/\.(cmd|ps1)$/, '') + return !validBins.has(base) || !existsSync(resolve(binDir, name)) + }) + + if (!stale.length) { + return + } + + log.silly('reify', 'cleaning stale bin links', stale) + await promiseAllRejectLate( + stale.map(name => + rm(resolve(binDir, name), { force: true }) + .catch(/* istanbul ignore next -- rm with force rarely fails */ + er => log.warn('cleanup', `Failed to remove stale bin link ${name}`, er)) + ) + ) + } + // Remove node_modules/ entries that aren't represented in the ideal tree. // Run for the project root and each workspace's node_modules. // The linked diff path can't see these because #buildLinkedActualForDiff derives the actual tree from the ideal, so removed deps are never compared. - // Only symlinks whose target resolves inside the project root are removed — that covers store links (node_modules/.store/...) and workspace self-links (e.g. node_modules/ -> ../packages/) that npm itself created. - // Symlinks pointing outside the project (e.g. `npm link foo` without --save targeting the global prefix, or hand-made `ln -s` to an external path) and real directories are preserved. + // Two kinds of stale entry are removed: + // - symlinks whose target resolves inside the project root — store links (node_modules/.store/...) and workspace self-links (e.g. node_modules/ -> ../packages/) that npm itself created. + // - real package directories — hoisted-layout deps left behind when switching from the hoisted strategy to linked, where every valid top-level entry is a symlink. + // Symlinks pointing outside the project (e.g. `npm link foo` without --save targeting the global prefix, or hand-made `ln -s` to an external path) and non-package real directories are preserved. async #cleanOrphanedTopLevelLinks (nmDir, validTopLevel) { const projectPrefix = resolve(this.path) + sep let dirents @@ -1535,7 +1687,15 @@ module.exports = cls => class Reifier extends cls { return resolve(dirname(linkPath), target).startsWith(projectPrefix) } + // A real directory is stale only when it is an actual package (has a package.json), so unrelated user directories are never touched. + const isStaleRealPkg = (dirent, entPath) => + dirent.isDirectory() && existsSync(resolve(entPath, 'package.json')) + + const isOrphan = async (dirent, entPath) => + (dirent.isSymbolicLink() && await isOurOrphan(entPath)) || isStaleRealPkg(dirent, entPath) + const orphaned = [] + const scopes = new Set() for (const ent of dirents) { // skip npm-managed entries (.bin, .store, .package-lock.json, etc) if (ent.name.startsWith('.')) { @@ -1551,11 +1711,12 @@ module.exports = cls => class Reifier extends cls { } for (const pkgEnt of scoped) { const key = `${ent.name}${sep}${pkgEnt.name}` - if (!validTopLevel.has(key) && pkgEnt.isSymbolicLink() && await isOurOrphan(resolve(nmDir, key))) { + if (!validTopLevel.has(key) && await isOrphan(pkgEnt, resolve(nmDir, key))) { orphaned.push(key) + scopes.add(ent.name) } } - } else if (!validTopLevel.has(ent.name) && ent.isSymbolicLink() && await isOurOrphan(resolve(nmDir, ent.name))) { + } else if (!validTopLevel.has(ent.name) && await isOrphan(ent, resolve(nmDir, ent.name))) { orphaned.push(ent.name) } } @@ -1564,14 +1725,29 @@ module.exports = cls => class Reifier extends cls { return } - log.silly('reify', 'cleaning orphaned top-level links', orphaned) + log.silly('reify', 'cleaning orphaned top-level entries', orphaned) await promiseAllRejectLate( orphaned.map(name => rm(resolve(nmDir, name), { recursive: true, force: true }) .catch(/* istanbul ignore next -- rm with force rarely fails */ - er => log.warn('cleanup', `Failed to remove orphaned link ${name}`, er)) + er => log.warn('cleanup', `Failed to remove orphaned entry ${name}`, er)) ) ) + + // Removing the last package under a scope leaves an empty @scope directory behind, so prune any scope directory that is now empty. + await promiseAllRejectLate( + [...scopes].map(async scope => { + const scopeDir = resolve(nmDir, scope) + try { + const remaining = await readdir(scopeDir) + if (!remaining.length) { + await rm(scopeDir, { recursive: true, force: true }) + } + } catch { + /* istanbul ignore next -- readdir of a scope dir we just listed should not fail */ + } + }) + ) } // last but not least, we save the ideal tree metadata to the package-lock diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/audit-report.js b/deps/npm/node_modules/@npmcli/arborist/lib/audit-report.js index 3e74e100b6c5..1c3e15dee192 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/audit-report.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/audit-report.js @@ -6,6 +6,7 @@ const pickManifest = require('npm-pick-manifest') const Vuln = require('./vuln.js') const Calculator = require('@npmcli/metavuln-calculator') +const { isReleaseAgeExcluded } = require('./release-age-exclude.js') const { log, time } = require('proc-log') @@ -151,11 +152,6 @@ class AuditReport extends Map { continue } - // we will have loaded the source already if this is a metavuln - if (advisory.type === 'metavuln') { - vuln.addVia(this.get(advisory.dependency)) - } - // already marked this one, no need to do it again if (vuln.nodes.has(node)) { continue @@ -173,6 +169,11 @@ class AuditReport extends Map { // depends on root. this.topVulns.set(vuln.name, vuln) vuln.topNodes.add(dep) + } else { + // An in-range fix exists, but a `min-release-age`/`before` + // window may put the patched version out of reach, leaving the + // vulnerable version installed. + vuln.fixBlockedByReleaseAge = this.#fixBlockedByReleaseAge(vuln, spec) } } else { // calculate a metavuln, if necessary @@ -213,6 +214,17 @@ class AuditReport extends Map { } } + // post-loop reconciliation: establish all via links + // done here to ensure all vulns exist, avoid redundant setter triggers, + // and correctly handle multiple paths and omission cleanups. + for (const vuln of this.values()) { + for (const advisory of vuln.advisories) { + if (advisory.type === 'metavuln') { + vuln.addVia(this.get(advisory.dependency)) + } + } + } + timeEnd() } @@ -251,6 +263,53 @@ class AuditReport extends Map { } } + // A fix that `#fixAvailable` reports as installable in-range can still be + // unreachable when a release-age window (`before` / `min-release-age`) is set, + // because the patched version was published after the cutoff. `npm audit fix` + // then resolves back to a version that is still vulnerable, so detect that + // here and let callers warn about it. Only meaningful when an in-range fix + // exists (fixAvailable === true). Returns the blocked fix as + // `{ version, before }`, or `false` when nothing is blocked. + #fixBlockedByReleaseAge (vuln, spec) { + const { before, minReleaseAgeExclude } = this.options + // No window, or this package is explicitly exempt from it. + if (!before || isReleaseAgeExcluded(vuln.name, minReleaseAgeExclude)) { + return false + } + + // For `npm:` aliases the fix resolves against the alias target, so feed + // pickManifest the underlying range rather than the alias spec (which it + // rejects). Mirrors `#fixAvailable`. + const specObj = npa(spec) + if (specObj.subSpec) { + spec = specObj.subSpec.rawSpec + } + + // The version that would be installed if the window were lifted. + const { version } = pickManifest(vuln.packument, spec, { + ...this.options, + before: null, + avoid: vuln.range, + }) + + // What resolution can actually reach within the window. This mirrors how + // `build-ideal-tree` re-resolves the edge (non-strict avoid + `before`). + let windowed + try { + windowed = pickManifest(vuln.packument, spec, { + ...this.options, + avoid: vuln.range, + }) + } catch { + // Nothing is old enough to install at all: the fix is blocked. + return { version, before } + } + + // `_shouldAvoid` means the best version available within the window is still + // in the vulnerable range, so the only non-vulnerable fix is too new. + return windowed._shouldAvoid ? { version, before } : false + } + set () { throw new Error('do not call AuditReport.set() directly') } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js b/deps/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js index 5f2484858094..965127f5ac9d 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js @@ -35,12 +35,32 @@ const calcDepFlags = (tree, resetRoot = true) => { if (node.target == null) { continue } - node.target.dev = node.dev - node.target.optional = node.optional - node.target.devOptional = node.devOptional - node.target.peer = node.peer - node.target.extraneous = node.extraneous - queue.push(node.target) + // Only unset flags, matching the edge walk below, so multiple links to one target can't clobber a correct value. + let changed = false + if (node.target.dev && !node.dev) { + node.target.dev = false + changed = true + } + if (node.target.optional && !node.optional) { + node.target.optional = false + changed = true + } + if (node.target.devOptional && !node.devOptional) { + node.target.devOptional = false + changed = true + } + if (node.target.peer && !node.peer) { + node.target.peer = false + changed = true + } + if (node.target.extraneous && !node.extraneous) { + node.target.extraneous = false + changed = true + } + // queue target on first visit so its deps are walked + if (changed || !seen.has(node.target)) { + queue.push(node.target) + } continue } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/can-place-dep.js b/deps/npm/node_modules/@npmcli/arborist/lib/can-place-dep.js index 1a3ccff66922..1069fee8d65a 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/can-place-dep.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/can-place-dep.js @@ -21,6 +21,8 @@ // - if satisfying and preferDedupe? KEEP // - else: REPLACE // - if there is a newer version present, and preferDedupe, REPLACE +// - if there is a newer vulnerable version present during an audit fix, +// and the candidate is older and not vulnerable, REPLACE // - if the version present satisfies the edge, KEEP // - else: CONFLICT // - if the node is not in conflict, check each of its peers: @@ -62,6 +64,7 @@ class CanPlaceDep { parent = null, peerPath = [], explicitRequest = false, + auditReport = null, } = options debug(() => { @@ -92,6 +95,7 @@ class CanPlaceDep { this.target = target this.edge = edge this.explicitRequest = explicitRequest + this.auditReport = auditReport // preventing cycles when we check peer sets this.peerPath = peerPath @@ -170,7 +174,15 @@ class CanPlaceDep { const { version: curVer } = current const { version: newVer } = dep - const tryReplace = curVer && newVer && semver.gte(newVer, curVer) + // Audit fix may select an older safe version within the declared range. + // This only makes the candidate eligible; canReplace() and peer checks + // below still enforce placement compatibility. + const auditFixDowngrade = curVer && newVer && + semver.lt(newVer, curVer) && + this.auditReport?.isVulnerable(current) && + !this.auditReport.isVulnerable(dep) + const tryReplace = curVer && newVer && + (semver.gte(newVer, curVer) || auditFixDowngrade) if (tryReplace && dep.canReplace(current)) { // It's extremely rare that a replaceable node would be a conflict, if // the current one wasn't a conflict, but it is theoretically possible @@ -381,6 +393,7 @@ class CanPlaceDep { parent: this, edge: peerEdge, peerPath, + auditReport: this.auditReport, // always place peers in preferDedupe mode preferDedupe: true, }) diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/isolated-classes.js b/deps/npm/node_modules/@npmcli/arborist/lib/isolated-classes.js index 3a2ade64bbb3..fc119119664d 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/isolated-classes.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/isolated-classes.js @@ -2,13 +2,6 @@ const CaseInsensitiveMap = require('./case-insensitive-map.js') const { resolve } = require('node:path') -// fake lib/inventory.js -class IsolatedInventory extends Map { - query () { - return [] - } -} - // fake lib/node.js class IsolatedNode { binPaths = [] @@ -18,7 +11,7 @@ class IsolatedNode { fsChildren = new Set() hasShrinkwrap = false integrity = null - inventory = new IsolatedInventory() + inventory = new Map() isInStore = false inBundle = false isRegistryDependency = false diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/link.js b/deps/npm/node_modules/@npmcli/arborist/lib/link.js index 3824dc81ffb3..89f993bb1690 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/link.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/link.js @@ -109,21 +109,12 @@ class Link extends Node { // so this is a no-op [_loadDeps] () {} - // When a Link receives overrides (via edgesIn), forward them to the target node which holds the actual edgesOut — but only when the OverrideSet has at least one rule that names a dep the target actually depends on. - // Without this scope, the link forwards a generic ancestor OverrideSet that has no real effect on the target's edges, but still flips the target to "has overrides", which changes downstream `canReplaceWith` / placement decisions and causes `npm ci` to re-resolve lockfile-pinned edges from the registry. - // See npm/cli#9357. + // Forward overrides to the target only when a rule names a dep it needs, directly or transitively (npm/cli#9357, #9619). recalculateOutEdgesOverrides () { if (!this.target || !this.overrides) { return } - let hasMatchingRule = false - for (const rule of this.overrides.ruleset.values()) { - if (this.target.edgesOut.has(rule.name)) { - hasMatchingRule = true - break - } - } - if (!hasMatchingRule) { + if (!overrideMatchesSubtree(this.overrides, this.target)) { return } this.target.updateOverridesEdgeInAdded(this.overrides) @@ -143,4 +134,29 @@ class Link extends Node { } } +// True when an override rule applies to an edge reachable from the target at any depth. +// getEdgeRule matches on name and spec, returning the set itself when nothing applies, so a non-applicable version-qualified rule doesn't flip an intermediate node to "has overrides" (npm/cli#9357). +// Not a method: runs from the Node super-constructor, before subclass private methods exist. +const overrideMatchesSubtree = (overrides, target) => { + const seen = new Set() + const stack = [target] + while (stack.length) { + const node = stack.pop() + const resolved = node.isLink ? node.target : node + if (seen.has(resolved)) { + continue + } + seen.add(resolved) + for (const edge of resolved.edgesOut.values()) { + if (overrides.getEdgeRule(edge).name === edge.name) { + return true + } + if (edge.to) { + stack.push(edge.to) + } + } + } + return false +} + module.exports = Link diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/node.js b/deps/npm/node_modules/@npmcli/arborist/lib/node.js index 451ede1e52cb..87b0ac41740b 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/node.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/node.js @@ -927,7 +927,8 @@ class Node { isTop: srcTop, path: srcPath, } = sourceReference || {} - const thisDev = isTop && !globalTop && path + // A package in the linked strategy's .store is a transitive dependency that is structurally a tree top, but its devDependencies are never installed or required, so they must not be loaded. + const thisDev = isTop && !globalTop && path && !this.isInStore const srcDev = !sourceReference || srcTop && !srcGlobalTop && srcPath if (thisDev && srcDev) { this.#loadDepType(this.package.devDependencies, 'dev', ad) diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/place-dep.js b/deps/npm/node_modules/@npmcli/arborist/lib/place-dep.js index c7b3e10d408d..bf21f01464d2 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/place-dep.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/place-dep.js @@ -96,6 +96,7 @@ class PlaceDep { target, preferDedupe: this.preferDedupe, explicitRequest: this.explicitRequest, + auditReport: this.auditReport, }) this.checks.set(target, cpd) diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/query-selector-all.js b/deps/npm/node_modules/@npmcli/arborist/lib/query-selector-all.js index 3a6c15139d40..05faa551f76e 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/query-selector-all.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/query-selector-all.js @@ -798,7 +798,8 @@ const hasParent = (node, compareNodes) => { // Only match if the node has a link whose parent is the compareNode. Without this check, nodes deep in the store (linked strategy) would incorrectly match as children of root via their fsParent chain. if (node.isTop && (node.resolveParent === compareNode)) { for (const link of node.linksIn) { - if (link.parent === compareNode) { + // A store-backing node (linked strategy) is reached through its logical Link, which matches via edgesIn below, so the store node itself is never a direct child. + if (link.parent === compareNode && !node.isInStore) { return true } } diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/script-allowed.js b/deps/npm/node_modules/@npmcli/arborist/lib/script-allowed.js index 89e24339791f..8c9b3fe118a8 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/script-allowed.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/script-allowed.js @@ -43,7 +43,9 @@ const isScriptAllowed = (node, policy) => { let anyDeny = false for (const [key, value] of Object.entries(policy)) { - if (!matches(node, key)) { + // Pass deny intent so matchRegistry can fail closed on an unverifiable + // version: a deny still blocks, an allow stays refused. + if (!matches(node, key, value === false)) { continue } if (value === false) { @@ -66,7 +68,7 @@ const isScriptAllowed = (node, policy) => { return null } -const matches = (node, key) => { +const matches = (node, key, failClosed) => { let parsed try { parsed = npa(key) @@ -78,7 +80,7 @@ const matches = (node, key) => { case 'tag': case 'range': case 'version': - return matchRegistry(node, parsed) + return matchRegistry(node, parsed, failClosed) case 'git': return matchGit(node, parsed) case 'file': @@ -132,7 +134,7 @@ const resolvedSourceSpecs = (node) => { return specs } -const matchRegistry = (node, parsed) => { +const matchRegistry = (node, parsed, failClosed) => { // If this node is not a registry dep, refuse the match. A registry-style // key (`pkg`, `pkg@1`, `pkg@1 || 2`) must not match a tarball or git node // even if their names happen to coincide. @@ -168,9 +170,14 @@ const matchRegistry = (node, parsed) => { if (parsed.fetchSpec === '*' || parsed.rawSpec === '' || parsed.rawSpec === '*') { return true } - if (!trusted.version || !isExactVersionDisjunction(parsed.fetchSpec)) { + if (!isExactVersionDisjunction(parsed.fetchSpec)) { return false } + // Unverifiable version (omit-lockfile-registry-resolved): a deny blocks, + // an allow is refused. + if (!trusted.version) { + return failClosed + } return semver.satisfies(trusted.version, parsed.fetchSpec, { loose: true }) } @@ -178,6 +185,10 @@ const matchRegistry = (node, parsed) => { /* istanbul ignore else: parsed.type at this point is always 'version'; the istanbul-ignored fallback below handles the impossible case. */ if (parsed.type === 'version') { + // Unverifiable version: a deny blocks, an allow is refused. + if (!trusted.version) { + return failClosed + } return trusted.version === parsed.fetchSpec } @@ -366,6 +377,7 @@ const trustedDisplay = (node) => { module.exports = isScriptAllowed module.exports.isScriptAllowed = isScriptAllowed +module.exports.matches = matches module.exports.isExactVersionDisjunction = isExactVersionDisjunction module.exports.getTrustedRegistryIdentity = getTrustedRegistryIdentity module.exports.resolvedSourceSpecs = resolvedSourceSpecs diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/shrinkwrap.js b/deps/npm/node_modules/@npmcli/arborist/lib/shrinkwrap.js index cf27bcf4ac72..03cc86edbd4e 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/shrinkwrap.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/shrinkwrap.js @@ -172,6 +172,35 @@ const assertNoNewer = async (path, data, lockTime, dir, seen) => { return } + // The walk above can't reach two linked-strategy layouts: a store package's sibling deps under .store//node_modules (.store is a skipped dot-dir), and an undeclared workspace not symlinked into root node_modules. Walk those dirs, derived from the lockfile entries. + // A dir reachable through a link entry is skipped: it was already reached (or, if the symlink is stale, correctly stays unseen so the lockfile is rejected). This keeps the hoisted strategy's stale-symlink detection intact, since there every workspace is a link target. + const linkTargets = new Set() + for (const loc in data.packages) { + const { link, resolved } = data.packages[loc] + if (link && resolved) { + linkTargets.add(resolved.replace(/\\/g, '/')) + } + } + const extraDirs = new Set() + for (const loc in data.packages) { + const store = loc.match(/^(.*\/\.store\/.+?)\/node_modules\//) + if (store) { + // .store/ is never walked but has no entry, so mark it seen. + seen.add(store[1]) + extraDirs.add(`${store[1]}/node_modules`) + continue + } + // A workspace/fsChild dir outside node_modules, e.g. packages/a. + const i = loc.indexOf('/node_modules/') + const root = i === -1 ? loc : loc.slice(0, i) + if (root && !/(^|\/)node_modules(\/|$)/.test(root) && !linkTargets.has(root)) { + extraDirs.add(root) + } + } + for (const rel of extraDirs) { + await assertNoNewer(path, data, lockTime, resolve(path, rel), seen) + } + // assert that all the entries in the lockfile were seen for (const loc in data.packages) { if (!seen.has(loc)) { diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/unreviewed-scripts.js b/deps/npm/node_modules/@npmcli/arborist/lib/unreviewed-scripts.js index 587d06bf8fe5..f7bed387845e 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/unreviewed-scripts.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/unreviewed-scripts.js @@ -50,6 +50,13 @@ const collectUnreviewedScripts = async ({ // its own lifecycle scripts. continue } + if (node.inert) { + // Inert = an optional dep that can't be installed here (failed the + // os/cpu/libc or engine check, or failed to load). reify drops it + // before any script runs, so its install scripts never execute and it + // must not be flagged (npm/cli#9562). + continue + } const verdict = isScriptAllowed(node, resolvedPolicy) if (verdict === true || verdict === false) { diff --git a/deps/npm/node_modules/@npmcli/arborist/lib/vuln.js b/deps/npm/node_modules/@npmcli/arborist/lib/vuln.js index 2bffe54f2dac..e6c6bbab383e 100644 --- a/deps/npm/node_modules/@npmcli/arborist/lib/vuln.js +++ b/deps/npm/node_modules/@npmcli/arborist/lib/vuln.js @@ -41,6 +41,7 @@ class Vuln { this.effects = new Set() this.topNodes = new Set() this.nodes = new Set() + this.fixBlockedByReleaseAge = false this.addAdvisory(advisory) this.packument = advisory.packument this.versions = advisory.versions @@ -126,6 +127,9 @@ class Vuln { range: this.simpleRange, nodes: [...this.nodes].map(n => n.location).sort(localeCompare), fixAvailable: this.#fixAvailable, + ...(this.fixBlockedByReleaseAge + ? { fixBlockedByReleaseAge: this.fixBlockedByReleaseAge } + : {}), } } diff --git a/deps/npm/node_modules/@npmcli/arborist/package.json b/deps/npm/node_modules/@npmcli/arborist/package.json index 9a5e883cefe2..1b71dfa4f124 100644 --- a/deps/npm/node_modules/@npmcli/arborist/package.json +++ b/deps/npm/node_modules/@npmcli/arborist/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/arborist", - "version": "9.8.0", + "version": "9.9.1", "description": "Manage node_modules trees", "dependencies": { "@gar/promise-retry": "^1.0.0", diff --git a/deps/npm/node_modules/@npmcli/config/lib/definitions/definitions.js b/deps/npm/node_modules/@npmcli/config/lib/definitions/definitions.js index a4933facff63..2bb1713458af 100644 --- a/deps/npm/node_modules/@npmcli/config/lib/definitions/definitions.js +++ b/deps/npm/node_modules/@npmcli/config/lib/definitions/definitions.js @@ -341,6 +341,10 @@ const definitions = { user > global), so a higher-priority source can always relax or override a lower-priority one. + As with \`min-release-age\`, when this cutoff blocks a fix that + \`npm audit fix\` would install, npm keeps the vulnerable version, warns, + and exits with a non-zero code. + Packages whose names match \`min-release-age-exclude\` are exempt from this filter. `, @@ -1204,8 +1208,15 @@ const definitions = { necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct deps at top-level. - linked: (experimental) install in node_modules/.store, link in place, - unhoisted. + linked: install in node_modules/.store, link in place, unhoisted. + + We recommend that package authors use \`--install-strategy=linked\` + during development to catch undeclared ("phantom") dependencies before + publishing: the isolated layout only exposes a package's declared + dependencies, so an \`import\` of a package that was never added to + \`package.json\` can fail instead of resolving by accident and shipping + broken. See [Catching undeclared ("phantom") + dependencies](/using-npm/developers#catching-undeclared-phantom-dependencies). `, flatten, }), @@ -1475,6 +1486,12 @@ const definitions = { \`github:\` dependency); when both apply, \`before\` wins within a single source and across sources the standard precedence rules apply. + When this window stops \`npm audit fix\` from installing a patched + version (because the fix was published too recently), npm keeps the + package at its vulnerable version, warns that the fix was blocked, and + exits with a non-zero code. To install the fix, add the package to + \`min-release-age-exclude\`, or relax \`min-release-age\` or \`before\`. + Packages whose names match \`min-release-age-exclude\` are exempt from this filter. `, @@ -1913,7 +1930,7 @@ const definitions = { }), 'replace-registry-host': new Definition('replace-registry-host', { default: 'npmjs', - hint: ' | hostname', + hint: ' | hostname | url', type: ['npmjs', 'never', 'always', String], description: ` Defines behavior for replacing the registry host in a lockfile with the @@ -1924,7 +1941,14 @@ const definitions = { "never", then use the registry value. If set to "always", then replace the registry host with the configured host every time. - You may also specify a bare hostname (e.g., "registry.npmjs.org"). + You may also specify a bare hostname (e.g., "registry.npmjs.org") to only + replace URLs coming from that host. + + You may also specify a full URL including a path (e.g., + "https://old-registry.example.com/npm/path"). In that case, resolved URLs + whose host and path begin with that prefix will have the entire prefix + replaced with the configured registry URL (host and path), without + duplicating path segments. `, flatten, }), @@ -2361,6 +2385,10 @@ const definitions = { always silently skipped; this setting only affects unreviewed entries. \`--ignore-scripts\` and \`--dangerously-allow-all-scripts\` both override this setting. + + Optional dependencies that cannot be installed on the current platform + or engine (a non-matching \`os\`, \`cpu\`, or \`libc\`) are not flagged, + because their install scripts never run. `, flatten, }), diff --git a/deps/npm/node_modules/@npmcli/config/package.json b/deps/npm/node_modules/@npmcli/config/package.json index 2d91ded3f9a1..360b0ab128a0 100644 --- a/deps/npm/node_modules/@npmcli/config/package.json +++ b/deps/npm/node_modules/@npmcli/config/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/config", - "version": "10.11.0", + "version": "10.12.0", "files": [ "bin/", "lib/" diff --git a/deps/npm/node_modules/brace-expansion/dist/commonjs/index.js b/deps/npm/node_modules/brace-expansion/dist/commonjs/index.js index 33063dd3552c..e4e5bd87666d 100644 --- a/deps/npm/node_modules/brace-expansion/dist/commonjs/index.js +++ b/deps/npm/node_modules/brace-expansion/dist/commonjs/index.js @@ -95,19 +95,23 @@ function gte(i, y) { function expand_(str, max, isTop) { /** @type {string[]} */ const expansions = []; - const m = (0, balanced_match_1.balanced)('{', '}', str); - if (!m) - return [str]; - // no need to expand pre, since it is guaranteed to be free of brace-sets - const pre = m.pre; - const post = m.post.length ? expand_(m.post, max, false) : ['']; - if (/\$$/.test(m.pre)) { - for (let k = 0; k < post.length && k < max; k++) { - const expansion = pre + '{' + m.body + '}' + post[k]; - expansions.push(expansion); + // The `{a},b}` rewrite below restarts expansion on a rewritten string with + // the same `max` and `isTop = true`. Loop instead of recursing so a long run + // of non-expanding `{}` groups can't exhaust the call stack. + for (;;) { + const m = (0, balanced_match_1.balanced)('{', '}', str); + if (!m) + return [str]; + // no need to expand pre, since it is guaranteed to be free of brace-sets + const pre = m.pre; + if (/\$$/.test(m.pre)) { + const post = m.post.length ? expand_(m.post, max, false) : ['']; + for (let k = 0; k < post.length && k < max; k++) { + const expansion = pre + '{' + m.body + '}' + post[k]; + expansions.push(expansion); + } + return expansions; } - } - else { const isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); const isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); const isSequence = isNumericSequence || isAlphaSequence; @@ -116,10 +120,16 @@ function expand_(str, max, isTop) { // {a},b} if (m.post.match(/,(?!,).*\}/)) { str = m.pre + '{' + m.body + escClose + m.post; - return expand_(str, max, true); + isTop = true; + continue; } return [str]; } + // Only expand post once we know this brace set actually expands. Computing + // it before the early returns above expanded post a second time on every + // non-expanding `{}`, which is what made inputs like `a{},{},{}...` blow up + // exponentially. + const post = m.post.length ? expand_(m.post, max, false) : ['']; let n; if (isSequence) { n = m.body.split(/\.\./); @@ -195,7 +205,7 @@ function expand_(str, max, isTop) { } } } + return expansions; } - return expansions; } //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/brace-expansion/dist/esm/index.js b/deps/npm/node_modules/brace-expansion/dist/esm/index.js index 32399e7b2f5c..b2d2aa91bb1c 100644 --- a/deps/npm/node_modules/brace-expansion/dist/esm/index.js +++ b/deps/npm/node_modules/brace-expansion/dist/esm/index.js @@ -91,19 +91,23 @@ function gte(i, y) { function expand_(str, max, isTop) { /** @type {string[]} */ const expansions = []; - const m = balanced('{', '}', str); - if (!m) - return [str]; - // no need to expand pre, since it is guaranteed to be free of brace-sets - const pre = m.pre; - const post = m.post.length ? expand_(m.post, max, false) : ['']; - if (/\$$/.test(m.pre)) { - for (let k = 0; k < post.length && k < max; k++) { - const expansion = pre + '{' + m.body + '}' + post[k]; - expansions.push(expansion); + // The `{a},b}` rewrite below restarts expansion on a rewritten string with + // the same `max` and `isTop = true`. Loop instead of recursing so a long run + // of non-expanding `{}` groups can't exhaust the call stack. + for (;;) { + const m = balanced('{', '}', str); + if (!m) + return [str]; + // no need to expand pre, since it is guaranteed to be free of brace-sets + const pre = m.pre; + if (/\$$/.test(m.pre)) { + const post = m.post.length ? expand_(m.post, max, false) : ['']; + for (let k = 0; k < post.length && k < max; k++) { + const expansion = pre + '{' + m.body + '}' + post[k]; + expansions.push(expansion); + } + return expansions; } - } - else { const isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); const isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); const isSequence = isNumericSequence || isAlphaSequence; @@ -112,10 +116,16 @@ function expand_(str, max, isTop) { // {a},b} if (m.post.match(/,(?!,).*\}/)) { str = m.pre + '{' + m.body + escClose + m.post; - return expand_(str, max, true); + isTop = true; + continue; } return [str]; } + // Only expand post once we know this brace set actually expands. Computing + // it before the early returns above expanded post a second time on every + // non-expanding `{}`, which is what made inputs like `a{},{},{}...` blow up + // exponentially. + const post = m.post.length ? expand_(m.post, max, false) : ['']; let n; if (isSequence) { n = m.body.split(/\.\./); @@ -191,7 +201,7 @@ function expand_(str, max, isTop) { } } } + return expansions; } - return expansions; } //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/brace-expansion/package.json b/deps/npm/node_modules/brace-expansion/package.json index 81524809e586..a5142f2787b6 100644 --- a/deps/npm/node_modules/brace-expansion/package.json +++ b/deps/npm/node_modules/brace-expansion/package.json @@ -1,7 +1,7 @@ { "name": "brace-expansion", "description": "Brace expansion as known from sh/bash", - "version": "5.0.6", + "version": "5.0.7", "files": [ "dist" ], @@ -59,6 +59,6 @@ "module": "./dist/esm/index.js", "repository": { "type": "git", - "url": "git+ssh://git@github.com/juliangruber/brace-expansion.git" + "url": "git+https://github.com/juliangruber/brace-expansion.git" } } diff --git a/deps/npm/node_modules/libnpmdiff/package.json b/deps/npm/node_modules/libnpmdiff/package.json index 0e2a7968c74c..8ce3729c325a 100644 --- a/deps/npm/node_modules/libnpmdiff/package.json +++ b/deps/npm/node_modules/libnpmdiff/package.json @@ -1,6 +1,6 @@ { "name": "libnpmdiff", - "version": "8.1.10", + "version": "8.1.12", "description": "The registry diff", "repository": { "type": "git", @@ -47,7 +47,7 @@ "tap": "^16.3.8" }, "dependencies": { - "@npmcli/arborist": "^9.8.0", + "@npmcli/arborist": "^9.9.1", "@npmcli/installed-package-contents": "^4.0.0", "binary-extensions": "^3.0.0", "diff": "^8.0.2", diff --git a/deps/npm/node_modules/libnpmexec/lib/index.js b/deps/npm/node_modules/libnpmexec/lib/index.js index 35452f796246..4d7c12665468 100644 --- a/deps/npm/node_modules/libnpmexec/lib/index.js +++ b/deps/npm/node_modules/libnpmexec/lib/index.js @@ -19,8 +19,6 @@ const runScript = require('./run-script.js') const isWindows = require('./is-windows.js') const withLock = require('./with-lock.js') -const binPaths = [] - // when checking the local tree we look up manifests, cache those results by // spec.raw so we don't have to fetch again when we check npxCache const manifests = new Map() @@ -113,6 +111,8 @@ const exec = async (opts) => { ...flatOptions } = opts + const binPaths = [] + let pkgPaths = opts.pkgPath if (typeof pkgPaths === 'string') { pkgPaths = [pkgPaths] @@ -196,7 +196,11 @@ const exec = async (opts) => { let commandManifest await Promise.all(packages.map(async (pkg, i) => { const spec = npa(pkg, path) - const { manifest, node } = await missingFromTree({ spec, tree: localTree, flatOptions }) + const { manifest, node } = await missingFromTree({ + spec, + tree: localTree, + flatOptions, + }) if (manifest) { // Package does not exist in the local tree needInstall.push({ spec, manifest }) diff --git a/deps/npm/node_modules/libnpmexec/package.json b/deps/npm/node_modules/libnpmexec/package.json index 77af2f57ccd5..c76c285e56a4 100644 --- a/deps/npm/node_modules/libnpmexec/package.json +++ b/deps/npm/node_modules/libnpmexec/package.json @@ -1,6 +1,6 @@ { "name": "libnpmexec", - "version": "10.3.0", + "version": "10.3.2", "files": [ "bin/", "lib/" @@ -61,7 +61,7 @@ }, "dependencies": { "@gar/promise-retry": "^1.0.0", - "@npmcli/arborist": "^9.8.0", + "@npmcli/arborist": "^9.9.1", "@npmcli/package-json": "^7.0.0", "@npmcli/run-script": "^10.0.0", "ci-info": "^4.0.0", diff --git a/deps/npm/node_modules/libnpmfund/package.json b/deps/npm/node_modules/libnpmfund/package.json index a03c4e89d63f..88852421c70f 100644 --- a/deps/npm/node_modules/libnpmfund/package.json +++ b/deps/npm/node_modules/libnpmfund/package.json @@ -1,6 +1,6 @@ { "name": "libnpmfund", - "version": "7.0.24", + "version": "7.0.26", "main": "lib/index.js", "files": [ "bin/", @@ -46,7 +46,7 @@ "tap": "^16.3.8" }, "dependencies": { - "@npmcli/arborist": "^9.8.0" + "@npmcli/arborist": "^9.9.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" diff --git a/deps/npm/node_modules/libnpmpack/package.json b/deps/npm/node_modules/libnpmpack/package.json index 5c285836d353..5741c8522c19 100644 --- a/deps/npm/node_modules/libnpmpack/package.json +++ b/deps/npm/node_modules/libnpmpack/package.json @@ -1,6 +1,6 @@ { "name": "libnpmpack", - "version": "9.1.10", + "version": "9.1.12", "description": "Programmatic API for the bits behind npm pack", "author": "GitHub Inc.", "main": "lib/index.js", @@ -37,7 +37,7 @@ "bugs": "https://github.com/npm/libnpmpack/issues", "homepage": "https://npmjs.com/package/libnpmpack", "dependencies": { - "@npmcli/arborist": "^9.8.0", + "@npmcli/arborist": "^9.9.1", "@npmcli/run-script": "^10.0.0", "npm-package-arg": "^13.0.0", "pacote": "^21.0.2" diff --git a/deps/npm/node_modules/npm-profile/lib/index.js b/deps/npm/node_modules/npm-profile/lib/index.js index 83ab5e1b46b6..734e08abb655 100644 --- a/deps/npm/node_modules/npm-profile/lib/index.js +++ b/deps/npm/node_modules/npm-profile/lib/index.js @@ -49,6 +49,33 @@ const isValidUrl = u => { } } +// npm's web-login response names the canonical npmjs registry in `doneUrl`, which a proxy/mirror forwards verbatim. +// The poll would then hit npmjs.org instead of the proxy that holds the session, so rewrite only that npmjs host to the configured registry origin, preserving the path prefix and query string. +// Any other done host is left untouched, since a non-npmjs canonical host cannot be inferred here and may be served intentionally. +const CANONICAL_REGISTRY_HOST = 'registry.npmjs.org' + +// doneUrl is already validated by isValidUrl and registry is the origin a prior +// POST /-/v1/login succeeded against, so both parse cleanly here. +const replaceDoneUrlOrigin = (doneUrl, registry) => { + if (!registry) { + return doneUrl + } + const done = new URL(doneUrl) + if (done.hostname !== CANONICAL_REGISTRY_HOST) { + return doneUrl + } + const reg = new URL(registry) + done.protocol = reg.protocol + done.host = reg.host + const prefix = reg.pathname.replace(/\/$/, '') + if (prefix && prefix !== '/' && + done.pathname !== prefix && + !done.pathname.startsWith(prefix + '/')) { + done.pathname = prefix + done.pathname + } + return done.href +} + const webAuth = async (opener, opts, body) => { try { const res = await fetch('/-/v1/login', { @@ -65,7 +92,7 @@ const webAuth = async (opener, opts, body) => { throw new WebLoginInvalidResponse('POST', res, content) } - return await webAuthOpener(opener, loginUrl, doneUrl, opts) + return await webAuthOpener(opener, loginUrl, replaceDoneUrlOrigin(doneUrl, opts.registry), opts) } catch (er) { if ((er.statusCode >= 400 && er.statusCode <= 499) || er.statusCode === 500) { throw new WebLoginNotSupported('POST', { diff --git a/deps/npm/node_modules/npm-profile/package.json b/deps/npm/node_modules/npm-profile/package.json index 0f97cc1efa19..bb7f23ec8312 100644 --- a/deps/npm/node_modules/npm-profile/package.json +++ b/deps/npm/node_modules/npm-profile/package.json @@ -1,13 +1,13 @@ { "name": "npm-profile", - "version": "12.0.1", + "version": "12.0.2", "description": "Library for updating an npmjs.com profile", "keywords": [], "author": "GitHub Inc.", "license": "ISC", "dependencies": { "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.0.0" + "proc-log": "^6.1.0" }, "main": "./lib/index.js", "repository": { @@ -19,8 +19,8 @@ "lib/" ], "devDependencies": { - "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.27.1", + "@npmcli/eslint-config": "^7.0.0", + "@npmcli/template-oss": "5.1.1", "nock": "^13.5.6", "tap": "^16.0.1" }, @@ -46,7 +46,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.27.1", + "version": "5.1.1", "publish": true } } diff --git a/deps/npm/node_modules/semver/classes/range.js b/deps/npm/node_modules/semver/classes/range.js index 766d505a2269..a7d6556febb4 100644 --- a/deps/npm/node_modules/semver/classes/range.js +++ b/deps/npm/node_modules/semver/classes/range.js @@ -299,6 +299,10 @@ const replaceTildes = (comp, options) => { const replaceTilde = (comp, options) => { const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] + // if we're including prereleases in the match, then the lower bound is + // -0, the lowest possible prerelease value, just like x-ranges and carets. + // this keeps `~1.2` equivalent to the `1.2.x` x-range it's documented as. + const z = options.includePrerelease ? '-0' : '' return comp.replace(r, (_, M, m, p, pr) => { debug('tilde', comp, _, M, m, p, pr) let ret @@ -306,10 +310,10 @@ const replaceTilde = (comp, options) => { if (isX(M)) { ret = '' } else if (isX(m)) { - ret = `>=${M}.0.0 <${+M + 1}.0.0-0` + ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` } else if (isX(p)) { // ~1.2 == >=1.2.0 <1.3.0-0 - ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` + ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` } else if (pr) { debug('replaceTilde pr', pr) ret = `>=${M}.${m}.${p}-${pr diff --git a/deps/npm/node_modules/semver/package.json b/deps/npm/node_modules/semver/package.json index ddedbf7bdaba..0cb7c7bb465e 100644 --- a/deps/npm/node_modules/semver/package.json +++ b/deps/npm/node_modules/semver/package.json @@ -1,6 +1,6 @@ { "name": "semver", - "version": "7.8.4", + "version": "7.8.5", "description": "The semantic version parser used by npm.", "main": "index.js", "scripts": { diff --git a/deps/npm/node_modules/tar/dist/commonjs/header.js b/deps/npm/node_modules/tar/dist/commonjs/header.js index d6e8f0ec3426..f4a84fb76c34 100644 --- a/deps/npm/node_modules/tar/dist/commonjs/header.js +++ b/deps/npm/node_modules/tar/dist/commonjs/header.js @@ -41,6 +41,7 @@ exports.Header = void 0; const node_path_1 = require("node:path"); const large = __importStar(require("./large-numbers.js")); const types = __importStar(require("./types.js")); +const notNegative = (n) => n === undefined || n < 0 ? undefined : n; class Header { cksumValid = false; needPax = false; @@ -99,10 +100,9 @@ class Header { exForFields?.uid ?? gexForFields?.uid ?? decNumber(buf, off + 108, 8); this.gid = exForFields?.gid ?? gexForFields?.gid ?? decNumber(buf, off + 116, 8); - this.size = - exForFields?.size ?? - gexForFields?.size ?? - decNumber(buf, off + 124, 12); + this.size = notNegative(exForFields?.size ?? + gexForFields?.size ?? + decNumber(buf, off + 124, 12)); this.mtime = exForFields?.mtime ?? gexForFields?.mtime ?? @@ -188,6 +188,7 @@ class Header { // null/undefined values are ignored. return !(v === null || v === undefined || + (k === 'size' && Number(v) < 0) || (k === 'path' && gex) || (k === 'linkpath' && gex) || k === 'global'); diff --git a/deps/npm/node_modules/tar/dist/commonjs/index.min.js b/deps/npm/node_modules/tar/dist/commonjs/index.min.js index 6bce016bcece..1a229a01e5a5 100644 --- a/deps/npm/node_modules/tar/dist/commonjs/index.min.js +++ b/deps/npm/node_modules/tar/dist/commonjs/index.min.js @@ -1,4 +1,4 @@ -"use strict";var d=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports);var We=d(F=>{"use strict";var Ro=F&&F.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(F,"__esModule",{value:!0});F.Minipass=F.isWritable=F.isReadable=F.isStream=void 0;var Br=typeof process=="object"&&process?process:{stdout:null,stderr:null},is=require("node:events"),jr=Ro(require("node:stream")),vo=require("node:string_decoder"),To=s=>!!s&&typeof s=="object"&&(s instanceof Zt||s instanceof jr.default||(0,F.isReadable)(s)||(0,F.isWritable)(s));F.isStream=To;var Do=s=>!!s&&typeof s=="object"&&s instanceof is.EventEmitter&&typeof s.pipe=="function"&&s.pipe!==jr.default.Writable.prototype.pipe;F.isReadable=Do;var Po=s=>!!s&&typeof s=="object"&&s instanceof is.EventEmitter&&typeof s.write=="function"&&typeof s.end=="function";F.isWritable=Po;var le=Symbol("EOF"),ue=Symbol("maybeEmitEnd"),_e=Symbol("emittedEnd"),xt=Symbol("emittingEnd"),dt=Symbol("emittedError"),jt=Symbol("closed"),zr=Symbol("read"),Ut=Symbol("flush"),kr=Symbol("flushChunk"),K=Symbol("encoding"),Ue=Symbol("decoder"),O=Symbol("flowing"),mt=Symbol("paused"),qe=Symbol("resume"),R=Symbol("buffer"),I=Symbol("pipes"),v=Symbol("bufferLength"),$i=Symbol("bufferPush"),qt=Symbol("bufferShift"),N=Symbol("objectMode"),y=Symbol("destroyed"),Xi=Symbol("error"),Qi=Symbol("emitData"),xr=Symbol("emitEnd"),Ji=Symbol("emitEnd2"),J=Symbol("async"),es=Symbol("abort"),Wt=Symbol("aborted"),pt=Symbol("signal"),Ne=Symbol("dataListeners"),x=Symbol("discarded"),_t=s=>Promise.resolve().then(s),No=s=>s(),Mo=s=>s==="end"||s==="finish"||s==="prefinish",Lo=s=>s instanceof ArrayBuffer||!!s&&typeof s=="object"&&s.constructor&&s.constructor.name==="ArrayBuffer"&&s.byteLength>=0,Ao=s=>!Buffer.isBuffer(s)&&ArrayBuffer.isView(s),Ht=class{src;dest;opts;ondrain;constructor(e,t,i){this.src=e,this.dest=t,this.opts=i,this.ondrain=()=>e[qe](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},ts=class extends Ht{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,t,i){super(e,t,i),this.proxyErrors=r=>this.dest.emit("error",r),e.on("error",this.proxyErrors)}},Io=s=>!!s.objectMode,Fo=s=>!s.objectMode&&!!s.encoding&&s.encoding!=="buffer",Zt=class extends is.EventEmitter{[O]=!1;[mt]=!1;[I]=[];[R]=[];[N];[K];[J];[Ue];[le]=!1;[_e]=!1;[xt]=!1;[jt]=!1;[dt]=null;[v]=0;[y]=!1;[pt];[Wt]=!1;[Ne]=0;[x]=!1;writable=!0;readable=!0;constructor(...e){let t=e[0]||{};if(super(),t.objectMode&&typeof t.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");Io(t)?(this[N]=!0,this[K]=null):Fo(t)?(this[K]=t.encoding,this[N]=!1):(this[N]=!1,this[K]=null),this[J]=!!t.async,this[Ue]=this[K]?new vo.StringDecoder(this[K]):null,t&&t.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[R]}),t&&t.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[I]});let{signal:i}=t;i&&(this[pt]=i,i.aborted?this[es]():i.addEventListener("abort",()=>this[es]()))}get bufferLength(){return this[v]}get encoding(){return this[K]}set encoding(e){throw new Error("Encoding must be set at instantiation time")}setEncoding(e){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[N]}set objectMode(e){throw new Error("objectMode must be set at instantiation time")}get async(){return this[J]}set async(e){this[J]=this[J]||!!e}[es](){this[Wt]=!0,this.emit("abort",this[pt]?.reason),this.destroy(this[pt]?.reason)}get aborted(){return this[Wt]}set aborted(e){}write(e,t,i){if(this[Wt])return!1;if(this[le])throw new Error("write after end");if(this[y])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof t=="function"&&(i=t,t="utf8"),t||(t="utf8");let r=this[J]?_t:No;if(!this[N]&&!Buffer.isBuffer(e)){if(Ao(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(Lo(e))e=Buffer.from(e);else if(typeof e!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[N]?(this[O]&&this[v]!==0&&this[Ut](!0),this[O]?this.emit("data",e):this[$i](e),this[v]!==0&&this.emit("readable"),i&&r(i),this[O]):e.length?(typeof e=="string"&&!(t===this[K]&&!this[Ue]?.lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[K]&&(e=this[Ue].write(e)),this[O]&&this[v]!==0&&this[Ut](!0),this[O]?this.emit("data",e):this[$i](e),this[v]!==0&&this.emit("readable"),i&&r(i),this[O]):(this[v]!==0&&this.emit("readable"),i&&r(i),this[O])}read(e){if(this[y])return null;if(this[x]=!1,this[v]===0||e===0||e&&e>this[v])return this[ue](),null;this[N]&&(e=null),this[R].length>1&&!this[N]&&(this[R]=[this[K]?this[R].join(""):Buffer.concat(this[R],this[v])]);let t=this[zr](e||null,this[R][0]);return this[ue](),t}[zr](e,t){if(this[N])this[qt]();else{let i=t;e===i.length||e===null?this[qt]():typeof i=="string"?(this[R][0]=i.slice(e),t=i.slice(0,e),this[v]-=e):(this[R][0]=i.subarray(e),t=i.subarray(0,e),this[v]-=e)}return this.emit("data",t),!this[R].length&&!this[le]&&this.emit("drain"),t}end(e,t,i){return typeof e=="function"&&(i=e,e=void 0),typeof t=="function"&&(i=t,t="utf8"),e!==void 0&&this.write(e,t),i&&this.once("end",i),this[le]=!0,this.writable=!1,(this[O]||!this[mt])&&this[ue](),this}[qe](){this[y]||(!this[Ne]&&!this[I].length&&(this[x]=!0),this[mt]=!1,this[O]=!0,this.emit("resume"),this[R].length?this[Ut]():this[le]?this[ue]():this.emit("drain"))}resume(){return this[qe]()}pause(){this[O]=!1,this[mt]=!0,this[x]=!1}get destroyed(){return this[y]}get flowing(){return this[O]}get paused(){return this[mt]}[$i](e){this[N]?this[v]+=1:this[v]+=e.length,this[R].push(e)}[qt](){return this[N]?this[v]-=1:this[v]-=this[R][0].length,this[R].shift()}[Ut](e=!1){do;while(this[kr](this[qt]())&&this[R].length);!e&&!this[R].length&&!this[le]&&this.emit("drain")}[kr](e){return this.emit("data",e),this[O]}pipe(e,t){if(this[y])return e;this[x]=!1;let i=this[_e];return t=t||{},e===Br.stdout||e===Br.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,i?t.end&&e.end():(this[I].push(t.proxyErrors?new ts(this,e,t):new Ht(this,e,t)),this[J]?_t(()=>this[qe]()):this[qe]()),e}unpipe(e){let t=this[I].find(i=>i.dest===e);t&&(this[I].length===1?(this[O]&&this[Ne]===0&&(this[O]=!1),this[I]=[]):this[I].splice(this[I].indexOf(t),1),t.unpipe())}addListener(e,t){return this.on(e,t)}on(e,t){let i=super.on(e,t);if(e==="data")this[x]=!1,this[Ne]++,!this[I].length&&!this[O]&&this[qe]();else if(e==="readable"&&this[v]!==0)super.emit("readable");else if(Mo(e)&&this[_e])super.emit(e),this.removeAllListeners(e);else if(e==="error"&&this[dt]){let r=t;this[J]?_t(()=>r.call(this,this[dt])):r.call(this,this[dt])}return i}removeListener(e,t){return this.off(e,t)}off(e,t){let i=super.off(e,t);return e==="data"&&(this[Ne]=this.listeners("data").length,this[Ne]===0&&!this[x]&&!this[I].length&&(this[O]=!1)),i}removeAllListeners(e){let t=super.removeAllListeners(e);return(e==="data"||e===void 0)&&(this[Ne]=0,!this[x]&&!this[I].length&&(this[O]=!1)),t}get emittedEnd(){return this[_e]}[ue](){!this[xt]&&!this[_e]&&!this[y]&&this[R].length===0&&this[le]&&(this[xt]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[jt]&&this.emit("close"),this[xt]=!1)}emit(e,...t){let i=t[0];if(e!=="error"&&e!=="close"&&e!==y&&this[y])return!1;if(e==="data")return!this[N]&&!i?!1:this[J]?(_t(()=>this[Qi](i)),!0):this[Qi](i);if(e==="end")return this[xr]();if(e==="close"){if(this[jt]=!0,!this[_e]&&!this[y])return!1;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(e==="error"){this[dt]=i,super.emit(Xi,i);let n=!this[pt]||this.listeners("error").length?super.emit("error",i):!1;return this[ue](),n}else if(e==="resume"){let n=super.emit("resume");return this[ue](),n}else if(e==="finish"||e==="prefinish"){let n=super.emit(e);return this.removeAllListeners(e),n}let r=super.emit(e,...t);return this[ue](),r}[Qi](e){for(let i of this[I])i.dest.write(e)===!1&&this.pause();let t=this[x]?!1:super.emit("data",e);return this[ue](),t}[xr](){return this[_e]?!1:(this[_e]=!0,this.readable=!1,this[J]?(_t(()=>this[Ji]()),!0):this[Ji]())}[Ji](){if(this[Ue]){let t=this[Ue].end();if(t){for(let i of this[I])i.dest.write(t);this[x]||super.emit("data",t)}}for(let t of this[I])t.end();let e=super.emit("end");return this.removeAllListeners("end"),e}async collect(){let e=Object.assign([],{dataLength:0});this[N]||(e.dataLength=0);let t=this.promise();return this.on("data",i=>{e.push(i),this[N]||(e.dataLength+=i.length)}),await t,e}async concat(){if(this[N])throw new Error("cannot concat in objectMode");let e=await this.collect();return this[K]?e.join(""):Buffer.concat(e,e.dataLength)}async promise(){return new Promise((e,t)=>{this.on(y,()=>t(new Error("stream destroyed"))),this.on("error",i=>t(i)),this.on("end",()=>e())})}[Symbol.asyncIterator](){this[x]=!1;let e=!1,t=async()=>(this.pause(),e=!0,{value:void 0,done:!0});return{next:()=>{if(e)return t();let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[le])return t();let n,o,h=c=>{this.off("data",a),this.off("end",l),this.off(y,u),t(),o(c)},a=c=>{this.off("error",h),this.off("end",l),this.off(y,u),this.pause(),n({value:c,done:!!this[le]})},l=()=>{this.off("error",h),this.off("data",a),this.off(y,u),t(),n({done:!0,value:void 0})},u=()=>h(new Error("stream destroyed"));return new Promise((c,E)=>{o=E,n=c,this.once(y,u),this.once("error",h),this.once("end",l),this.once("data",a)})},throw:t,return:t,[Symbol.asyncIterator](){return this},[Symbol.asyncDispose]:async()=>{}}}[Symbol.iterator](){this[x]=!1;let e=!1,t=()=>(this.pause(),this.off(Xi,t),this.off(y,t),this.off("end",t),e=!0,{done:!0,value:void 0}),i=()=>{if(e)return t();let r=this.read();return r===null?t():{done:!1,value:r}};return this.once("end",t),this.once(Xi,t),this.once(y,t),{next:i,throw:t,return:t,[Symbol.iterator](){return this},[Symbol.dispose]:()=>{}}}destroy(e){if(this[y])return e?this.emit("error",e):this.emit(y),this;this[y]=!0,this[x]=!0,this[R].length=0,this[v]=0;let t=this;return typeof t.close=="function"&&!this[jt]&&t.close(),e?this.emit("error",e):this.emit(y),this}static get isStream(){return F.isStream}};F.Minipass=Zt});var Ke=d(W=>{"use strict";var Ur=W&&W.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(W,"__esModule",{value:!0});W.WriteStreamSync=W.WriteStream=W.ReadStreamSync=W.ReadStream=void 0;var Co=Ur(require("events")),z=Ur(require("fs")),Bo=We(),zo=z.default.writev,ye=Symbol("_autoClose"),$=Symbol("_close"),wt=Symbol("_ended"),p=Symbol("_fd"),ss=Symbol("_finished"),fe=Symbol("_flags"),rs=Symbol("_flush"),hs=Symbol("_handleChunk"),ls=Symbol("_makeBuf"),Et=Symbol("_mode"),Gt=Symbol("_needDrain"),Ge=Symbol("_onerror"),Ye=Symbol("_onopen"),ns=Symbol("_onread"),He=Symbol("_onwrite"),Ee=Symbol("_open"),V=Symbol("_path"),we=Symbol("_pos"),ee=Symbol("_queue"),Ze=Symbol("_read"),os=Symbol("_readSize"),ce=Symbol("_reading"),yt=Symbol("_remain"),as=Symbol("_size"),Yt=Symbol("_write"),Me=Symbol("_writing"),Kt=Symbol("_defaultFlag"),Le=Symbol("_errored"),Vt=class extends Bo.Minipass{[Le]=!1;[p];[V];[os];[ce]=!1;[as];[yt];[ye];constructor(e,t){if(t=t||{},super(t),this.readable=!0,this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[Le]=!1,this[p]=typeof t.fd=="number"?t.fd:void 0,this[V]=e,this[os]=t.readSize||16*1024*1024,this[ce]=!1,this[as]=typeof t.size=="number"?t.size:1/0,this[yt]=this[as],this[ye]=typeof t.autoClose=="boolean"?t.autoClose:!0,typeof this[p]=="number"?this[Ze]():this[Ee]()}get fd(){return this[p]}get path(){return this[V]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[Ee](){z.default.open(this[V],"r",(e,t)=>this[Ye](e,t))}[Ye](e,t){e?this[Ge](e):(this[p]=t,this.emit("open",t),this[Ze]())}[ls](){return Buffer.allocUnsafe(Math.min(this[os],this[yt]))}[Ze](){if(!this[ce]){this[ce]=!0;let e=this[ls]();if(e.length===0)return process.nextTick(()=>this[ns](null,0,e));z.default.read(this[p],e,0,e.length,null,(t,i,r)=>this[ns](t,i,r))}}[ns](e,t,i){this[ce]=!1,e?this[Ge](e):this[hs](t,i)&&this[Ze]()}[$](){if(this[ye]&&typeof this[p]=="number"){let e=this[p];this[p]=void 0,z.default.close(e,t=>t?this.emit("error",t):this.emit("close"))}}[Ge](e){this[ce]=!0,this[$](),this.emit("error",e)}[hs](e,t){let i=!1;return this[yt]-=e,e>0&&(i=super.write(ethis[Ye](e,t))}[Ye](e,t){this[Kt]&&this[fe]==="r+"&&e&&e.code==="ENOENT"?(this[fe]="w",this[Ee]()):e?this[Ge](e):(this[p]=t,this.emit("open",t),this[Me]||this[rs]())}end(e,t){return e&&this.write(e,t),this[wt]=!0,!this[Me]&&!this[ee].length&&typeof this[p]=="number"&&this[He](null,0),this}write(e,t){return typeof e=="string"&&(e=Buffer.from(e,t)),this[wt]?(this.emit("error",new Error("write() after end()")),!1):this[p]===void 0||this[Me]||this[ee].length?(this[ee].push(e),this[Gt]=!0,!1):(this[Me]=!0,this[Yt](e),!0)}[Yt](e){z.default.write(this[p],e,0,e.length,this[we],(t,i)=>this[He](t,i))}[He](e,t){e?this[Ge](e):(this[we]!==void 0&&typeof t=="number"&&(this[we]+=t),this[ee].length?this[rs]():(this[Me]=!1,this[wt]&&!this[ss]?(this[ss]=!0,this[$](),this.emit("finish")):this[Gt]&&(this[Gt]=!1,this.emit("drain"))))}[rs](){if(this[ee].length===0)this[wt]&&this[He](null,0);else if(this[ee].length===1)this[Yt](this[ee].pop());else{let e=this[ee];this[ee]=[],zo(this[p],e,this[we],(t,i)=>this[He](t,i))}}[$](){if(this[ye]&&typeof this[p]=="number"){let e=this[p];this[p]=void 0,z.default.close(e,t=>t?this.emit("error",t):this.emit("close"))}}};W.WriteStream=$t;var cs=class extends $t{[Ee](){let e;if(this[Kt]&&this[fe]==="r+")try{e=z.default.openSync(this[V],this[fe],this[Et])}catch(t){if(t?.code==="ENOENT")return this[fe]="w",this[Ee]();throw t}else e=z.default.openSync(this[V],this[fe],this[Et]);this[Ye](null,e)}[$](){if(this[ye]&&typeof this[p]=="number"){let e=this[p];this[p]=void 0,z.default.closeSync(e),this.emit("close")}}[Yt](e){let t=!0;try{this[He](null,z.default.writeSync(this[p],e,0,e.length,this[we])),t=!1}finally{if(t)try{this[$]()}catch{}}}};W.WriteStreamSync=cs});var Xt=d(b=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});b.dealias=b.isNoFile=b.isFile=b.isAsync=b.isSync=b.isAsyncNoFile=b.isSyncNoFile=b.isAsyncFile=b.isSyncFile=void 0;var ko=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"],["onentry","onReadEntry"]]),xo=s=>!!s.sync&&!!s.file;b.isSyncFile=xo;var jo=s=>!s.sync&&!!s.file;b.isAsyncFile=jo;var Uo=s=>!!s.sync&&!s.file;b.isSyncNoFile=Uo;var qo=s=>!s.sync&&!s.file;b.isAsyncNoFile=qo;var Wo=s=>!!s.sync;b.isSync=Wo;var Ho=s=>!s.sync;b.isAsync=Ho;var Zo=s=>!!s.file;b.isFile=Zo;var Go=s=>!s.file;b.isNoFile=Go;var Yo=s=>{let e=ko.get(s);return e||s},Ko=(s={})=>{if(!s)return{};let e={};for(let[t,i]of Object.entries(s)){let r=Yo(t);e[r]=i}return e.chmod===void 0&&e.noChmod===!1&&(e.chmod=!0),delete e.noChmod,e};b.dealias=Ko});var Ve=d(Qt=>{"use strict";Object.defineProperty(Qt,"__esModule",{value:!0});Qt.makeCommand=void 0;var bt=Xt(),Vo=(s,e,t,i,r)=>Object.assign((n=[],o,h)=>{Array.isArray(n)&&(o=n,n={}),typeof o=="function"&&(h=o,o=void 0),o=o?Array.from(o):[];let a=(0,bt.dealias)(n);if(r?.(a,o),(0,bt.isSyncFile)(a)){if(typeof h=="function")throw new TypeError("callback not supported for sync tar functions");return s(a,o)}else if((0,bt.isAsyncFile)(a)){let l=e(a,o);return h?l.then(()=>h(),h):l}else if((0,bt.isSyncNoFile)(a)){if(typeof h=="function")throw new TypeError("callback not supported for sync tar functions");return t(a,o)}else if((0,bt.isAsyncNoFile)(a)){if(typeof h=="function")throw new TypeError("callback only supported with file option");return i(a,o)}throw new Error("impossible options??")},{syncFile:s,asyncFile:e,syncNoFile:t,asyncNoFile:i,validate:r});Qt.makeCommand=Vo});var fs=d($e=>{"use strict";var $o=$e&&$e.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty($e,"__esModule",{value:!0});$e.constants=void 0;var Xo=$o(require("zlib")),Qo=Xo.default.constants||{ZLIB_VERNUM:4736};$e.constants=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},Qo))});var Ds=d(f=>{"use strict";var Jo=f&&f.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),ea=f&&f.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),ta=f&&f.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;rs,ds=Wr?.writable===!0||Wr?.set!==void 0?s=>{Ae.Buffer.concat=s?oa:na}:s=>{},Ie=Symbol("_superWrite"),Fe=class extends Error{code;errno;constructor(e,t){super("zlib: "+e.message,{cause:e}),this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,t??this.constructor)}get name(){return"ZlibError"}};f.ZlibError=Fe;var ms=Symbol("flushFlag"),St=class extends sa.Minipass{#e=!1;#i=!1;#s;#n;#r;#t;#o;get sawError(){return this.#e}get handle(){return this.#t}get flushFlag(){return this.#s}constructor(e,t){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");if(super(e),this.#s=e.flush??0,this.#n=e.finishFlush??0,this.#r=e.fullFlushFlag??0,typeof qr[t]!="function")throw new TypeError("Compression method not supported: "+t);try{this.#t=new qr[t](e)}catch(i){throw new Fe(i,this.constructor)}this.#o=i=>{this.#e||(this.#e=!0,this.close(),this.emit("error",i))},this.#t?.on("error",i=>this.#o(new Fe(i))),this.once("end",()=>this.close)}close(){this.#t&&(this.#t.close(),this.#t=void 0,this.emit("close"))}reset(){if(!this.#e)return(0,ps.default)(this.#t,"zlib binding closed"),this.#t.reset?.()}flush(e){this.ended||(typeof e!="number"&&(e=this.#r),this.write(Object.assign(Ae.Buffer.alloc(0),{[ms]:e})))}end(e,t,i){return typeof e=="function"&&(i=e,t=void 0,e=void 0),typeof t=="function"&&(i=t,t=void 0),e&&(t?this.write(e,t):this.write(e)),this.flush(this.#n),this.#i=!0,super.end(i)}get ended(){return this.#i}[Ie](e){return super.write(e)}write(e,t,i){if(typeof t=="function"&&(i=t,t="utf8"),typeof e=="string"&&(e=Ae.Buffer.from(e,t)),this.#e)return;(0,ps.default)(this.#t,"zlib binding closed");let r=this.#t._handle,n=r.close;r.close=()=>{};let o=this.#t.close;this.#t.close=()=>{},ds(!0);let h;try{let l=typeof e[ms]=="number"?e[ms]:this.#s;h=this.#t._processChunk(e,l),ds(!1)}catch(l){ds(!1),this.#o(new Fe(l,this.write))}finally{this.#t&&(this.#t._handle=r,r.close=n,this.#t.close=o,this.#t.removeAllListeners("error"))}this.#t&&this.#t.on("error",l=>this.#o(new Fe(l,this.write)));let a;if(h)if(Array.isArray(h)&&h.length>0){let l=h[0];a=this[Ie](Ae.Buffer.from(l));for(let u=1;u{typeof r=="function"&&(n=r,r=this.flushFlag),this.flush(r),n?.()};try{this.handle.params(e,t)}finally{this.handle.flush=i}this.handle&&(this.#e=e,this.#i=t)}}}};f.Zlib=ie;var _s=class extends ie{constructor(e){super(e,"Deflate")}};f.Deflate=_s;var ws=class extends ie{constructor(e){super(e,"Inflate")}};f.Inflate=ws;var ys=class extends ie{#e;constructor(e){super(e,"Gzip"),this.#e=e&&!!e.portable}[Ie](e){return this.#e?(this.#e=!1,e[9]=255,super[Ie](e)):super[Ie](e)}};f.Gzip=ys;var Es=class extends ie{constructor(e){super(e,"Gunzip")}};f.Gunzip=Es;var bs=class extends ie{constructor(e){super(e,"DeflateRaw")}};f.DeflateRaw=bs;var Ss=class extends ie{constructor(e){super(e,"InflateRaw")}};f.InflateRaw=Ss;var gs=class extends ie{constructor(e){super(e,"Unzip")}};f.Unzip=gs;var Jt=class extends St{constructor(e,t){e=e||{},e.flush=e.flush||te.constants.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||te.constants.BROTLI_OPERATION_FINISH,e.fullFlushFlag=te.constants.BROTLI_OPERATION_FLUSH,super(e,t)}},Os=class extends Jt{constructor(e){super(e,"BrotliCompress")}};f.BrotliCompress=Os;var Rs=class extends Jt{constructor(e){super(e,"BrotliDecompress")}};f.BrotliDecompress=Rs;var ei=class extends St{constructor(e,t){e=e||{},e.flush=e.flush||te.constants.ZSTD_e_continue,e.finishFlush=e.finishFlush||te.constants.ZSTD_e_end,e.fullFlushFlag=te.constants.ZSTD_e_flush,super(e,t)}},vs=class extends ei{constructor(e){super(e,"ZstdCompress")}};f.ZstdCompress=vs;var Ts=class extends ei{constructor(e){super(e,"ZstdDecompress")}};f.ZstdDecompress=Ts});var Gr=d(Xe=>{"use strict";Object.defineProperty(Xe,"__esModule",{value:!0});Xe.parse=Xe.encode=void 0;var aa=(s,e)=>{if(Number.isSafeInteger(s))s<0?la(s,e):ha(s,e);else throw Error("cannot encode number outside of javascript safe integer range");return e};Xe.encode=aa;var ha=(s,e)=>{e[0]=128;for(var t=e.length;t>1;t--)e[t-1]=s&255,s=Math.floor(s/256)},la=(s,e)=>{e[0]=255;var t=!1;s=s*-1;for(var i=e.length;i>1;i--){var r=s&255;s=Math.floor(s/256),t?e[i-1]=Hr(r):r===0?e[i-1]=0:(t=!0,e[i-1]=Zr(r))}},ua=s=>{let e=s[0],t=e===128?fa(s.subarray(1,s.length)):e===255?ca(s):null;if(t===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(t))throw Error("parsed number outside of javascript safe integer range");return t};Xe.parse=ua;var ca=s=>{for(var e=s.length,t=0,i=!1,r=e-1;r>-1;r--){var n=Number(s[r]),o;i?o=Hr(n):n===0?o=n:(i=!0,o=Zr(n)),o!==0&&(t-=o*Math.pow(256,e-r-1))}return t},fa=s=>{for(var e=s.length,t=0,i=e-1;i>-1;i--){var r=Number(s[i]);r!==0&&(t+=r*Math.pow(256,e-i-1))}return t},Hr=s=>(255^s)&255,Zr=s=>(255^s)+1&255});var Ps=d(C=>{"use strict";Object.defineProperty(C,"__esModule",{value:!0});C.code=C.name=C.normalFsTypes=C.isName=C.isCode=void 0;var da=s=>C.name.has(s);C.isCode=da;var ma=s=>C.code.has(s);C.isName=ma;C.normalFsTypes=new Set(["0","","1","2","3","4","5","6","7","D"]);C.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);C.code=new Map(Array.from(C.name).map(s=>[s[1],s[0]]))});var et=d(se=>{"use strict";var pa=se&&se.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),_a=se&&se.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),Yr=se&&se.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r=t+512))throw new Error("need 512 bytes for header");let n=Ce(e,t+156,1),o=Je.normalFsTypes.has(n),h=o?i:void 0,a=o?r:void 0;if(this.path=h?.path??Ce(e,t,100),this.mode=h?.mode??a?.mode??be(e,t+100,8),this.uid=h?.uid??a?.uid??be(e,t+108,8),this.gid=h?.gid??a?.gid??be(e,t+116,8),this.size=h?.size??a?.size??be(e,t+124,12),this.mtime=h?.mtime??a?.mtime??Ns(e,t+136,12),this.cksum=be(e,t+148,12),a&&this.#i(a,!0),h&&this.#i(h),Je.isCode(n)&&(this.#e=n||"0"),this.#e==="0"&&this.path.slice(-1)==="/"&&(this.#e="5"),this.#e==="5"&&(this.size=0),this.linkpath=Ce(e,t+157,100),e.subarray(t+257,t+265).toString()==="ustar\x0000")if(this.uname=h?.uname??a?.uname??Ce(e,t+265,32),this.gname=h?.gname??a?.gname??Ce(e,t+297,32),this.devmaj=h?.devmaj??a?.devmaj??be(e,t+329,8)??0,this.devmin=h?.devmin??a?.devmin??be(e,t+337,8)??0,e[t+475]!==0){let u=Ce(e,t+345,155);this.path=u+"/"+this.path}else{let u=Ce(e,t+345,130);u&&(this.path=u+"/"+this.path),this.atime=i?.atime??r?.atime??Ns(e,t+476,12),this.ctime=i?.ctime??r?.ctime??Ns(e,t+488,12)}let l=256;for(let u=t;u!(r==null||i==="path"&&t||i==="linkpath"&&t||i==="global"))))}encode(e,t=0){if(e||(e=this.block=Buffer.alloc(512)),this.#e==="Unsupported"&&(this.#e="0"),!(e.length>=t+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,r=wa(this.path||"",i),n=r[0],o=r[1];this.needPax=!!r[2],this.needPax=Be(e,t,100,n)||this.needPax,this.needPax=Se(e,t+100,8,this.mode)||this.needPax,this.needPax=Se(e,t+108,8,this.uid)||this.needPax,this.needPax=Se(e,t+116,8,this.gid)||this.needPax,this.needPax=Se(e,t+124,12,this.size)||this.needPax,this.needPax=Ms(e,t+136,12,this.mtime)||this.needPax,e[t+156]=Number(this.#e.codePointAt(0)),this.needPax=Be(e,t+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",t+257,8),this.needPax=Be(e,t+265,32,this.uname)||this.needPax,this.needPax=Be(e,t+297,32,this.gname)||this.needPax,this.needPax=Se(e,t+329,8,this.devmaj)||this.needPax,this.needPax=Se(e,t+337,8,this.devmin)||this.needPax,this.needPax=Be(e,t+345,i,o)||this.needPax,e[t+475]!==0?this.needPax=Be(e,t+345,155,o)||this.needPax:(this.needPax=Be(e,t+345,130,o)||this.needPax,this.needPax=Ms(e,t+476,12,this.atime)||this.needPax,this.needPax=Ms(e,t+488,12,this.ctime)||this.needPax);let h=256;for(let a=t;a{let i=s,r="",n,o=Qe.posix.parse(s).root||".";if(Buffer.byteLength(i)<100)n=[i,r,!1];else{r=Qe.posix.dirname(i),i=Qe.posix.basename(i);do Buffer.byteLength(i)<=100&&Buffer.byteLength(r)<=e?n=[i,r,!1]:Buffer.byteLength(i)>100&&Buffer.byteLength(r)<=e?n=[i.slice(0,99),r,!0]:(i=Qe.posix.join(Qe.posix.basename(r),i),r=Qe.posix.dirname(r));while(r!==o&&n===void 0);n||(n=[s.slice(0,99),"",!0])}return n},Ce=(s,e,t)=>s.subarray(e,e+t).toString("utf8").replace(/\0.*/,""),Ns=(s,e,t)=>ya(be(s,e,t)),ya=s=>s===void 0?void 0:new Date(s*1e3),be=(s,e,t)=>Number(s[e])&128?Kr.parse(s.subarray(e,e+t)):ba(s,e,t),Ea=s=>isNaN(s)?void 0:s,ba=(s,e,t)=>Ea(parseInt(s.subarray(e,e+t).toString("utf8").replace(/\0.*$/,"").trim(),8)),Sa={12:8589934591,8:2097151},Se=(s,e,t,i)=>i===void 0?!1:i>Sa[t]||i<0?(Kr.encode(i,s.subarray(e,e+t)),!0):(ga(s,e,t,i),!1),ga=(s,e,t,i)=>s.write(Oa(i,t),e,t,"ascii"),Oa=(s,e)=>Ra(Math.floor(s).toString(8),e),Ra=(s,e)=>(s.length===e-1?s:new Array(e-s.length-1).join("0")+s+" ")+"\0",Ms=(s,e,t,i)=>i===void 0?!1:Se(s,e,t,i.getTime()/1e3),va=new Array(156).join("\0"),Be=(s,e,t,i)=>i===void 0?!1:(s.write(i+va,e,t,"utf8"),i.length!==Buffer.byteLength(i)||i.length>t)});var ii=d(ti=>{"use strict";Object.defineProperty(ti,"__esModule",{value:!0});ti.Pax=void 0;var Ta=require("node:path"),Da=et(),As=class s{atime;mtime;ctime;charset;comment;gid;uid;gname;uname;linkpath;dev;ino;nlink;path;size;mode;global;constructor(e,t=!1){this.atime=e.atime,this.charset=e.charset,this.comment=e.comment,this.ctime=e.ctime,this.dev=e.dev,this.gid=e.gid,this.global=t,this.gname=e.gname,this.ino=e.ino,this.linkpath=e.linkpath,this.mtime=e.mtime,this.nlink=e.nlink,this.path=e.path,this.size=e.size,this.uid=e.uid,this.uname=e.uname}encode(){let e=this.encodeBody();if(e==="")return Buffer.allocUnsafe(0);let t=Buffer.byteLength(e),i=512*Math.ceil(1+t/512),r=Buffer.allocUnsafe(i);for(let n=0;n<512;n++)r[n]=0;new Da.Header({path:("PaxHeader/"+(0,Ta.basename)(this.path??"")).slice(0,99),mode:this.mode||420,uid:this.uid,gid:this.gid,size:t,mtime:this.mtime,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime,ctime:this.ctime}).encode(r),r.write(e,512,t,"utf8");for(let n=t+512;n=Math.pow(10,o)&&(o+=1),o+n+r}static parse(e,t,i=!1){return new s(Pa(Na(e),t),i)}};ti.Pax=As;var Pa=(s,e)=>e?Object.assign({},e,s):s,Na=s=>s.replace(/\n$/,"").split(` -`).reduce(Ma,Object.create(null)),Ma=(s,e)=>{let t=parseInt(e,10);if(t!==Buffer.byteLength(e)+1)return s;e=e.slice((t+" ").length);let i=e.split("="),r=i.shift();if(!r)return s;let n=r.replace(/^SCHILY\.(dev|ino|nlink)/,"$1"),o=i.join("=");return s[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(Number(o)*1e3):/^[0-9]+$/.test(o)?+o:o,s}});var tt=d(si=>{"use strict";Object.defineProperty(si,"__esModule",{value:!0});si.normalizeWindowsPath=void 0;var La=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;si.normalizeWindowsPath=La!=="win32"?s=>s:s=>s&&s.replaceAll(/\\/g,"/")});var Fs=d(ni=>{"use strict";Object.defineProperty(ni,"__esModule",{value:!0});ni.ReadEntry=void 0;var Aa=We(),ri=tt(),Is=class extends Aa.Minipass{extended;globalExtended;header;startBlockSize;blockRemain;remain;type;meta=!1;ignore=!1;path;mode;uid;gid;uname;gname;size=0;mtime;atime;ctime;linkpath;dev;ino;nlink;invalid=!1;absolute;unsupported=!1;constructor(e,t,i){switch(super({}),this.pause(),this.extended=t,this.globalExtended=i,this.header=e,this.remain=e.size??0,this.startBlockSize=512*Math.ceil(this.remain/512),this.blockRemain=this.startBlockSize,this.type=e.type,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}if(!e.path)throw new Error("no path provided for tar.ReadEntry");this.path=(0,ri.normalizeWindowsPath)(e.path),this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=this.remain,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=e.linkpath?(0,ri.normalizeWindowsPath)(e.linkpath):void 0,this.uname=e.uname,this.gname=e.gname,t&&this.#e(t),i&&this.#e(i,!0)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,r=this.blockRemain;return this.remain=Math.max(0,i-t),this.blockRemain=Math.max(0,r-t),this.ignore?!0:i>=t?super.write(e):super.write(e.subarray(0,i))}#e(e,t=!1){e.path&&(e.path=(0,ri.normalizeWindowsPath)(e.path)),e.linkpath&&(e.linkpath=(0,ri.normalizeWindowsPath)(e.linkpath)),Object.assign(this,Object.fromEntries(Object.entries(e).filter(([i,r])=>!(r==null||i==="path"&&t))))}};ni.ReadEntry=Is});var ai=d(oi=>{"use strict";Object.defineProperty(oi,"__esModule",{value:!0});oi.warnMethod=void 0;var Ia=(s,e,t,i={})=>{s.file&&(i.file=s.file),s.cwd&&(i.cwd=s.cwd),i.code=t instanceof Error&&t.code||e,i.tarCode=e,!s.strict&&i.recoverable!==!1?(t instanceof Error&&(i=Object.assign(t,i),t=t.message),s.emit("warn",e,t,i)):t instanceof Error?s.emit("error",Object.assign(t,i)):s.emit("error",Object.assign(new Error(`${e}: ${t}`),i))};oi.warnMethod=Ia});var pi=d(mi=>{"use strict";Object.defineProperty(mi,"__esModule",{value:!0});mi.Parser=void 0;var Fa=require("events"),Cs=Ds(),Vr=et(),$r=ii(),Ca=Fs(),Ba=ai(),za=1024*1024,js=Buffer.from([31,139]),Us=Buffer.from([40,181,47,253]),ka=Math.max(js.length,Us.length),H=Symbol("state"),ze=Symbol("writeEntry"),de=Symbol("readEntry"),Bs=Symbol("nextEntry"),Xr=Symbol("processEntry"),re=Symbol("extendedHeader"),gt=Symbol("globalExtendedHeader"),ge=Symbol("meta"),Qr=Symbol("emitMeta"),_=Symbol("buffer"),me=Symbol("queue"),Oe=Symbol("ended"),zs=Symbol("emittedEnd"),ke=Symbol("emit"),S=Symbol("unzip"),hi=Symbol("consumeChunk"),li=Symbol("consumeChunkSub"),ks=Symbol("consumeBody"),Jr=Symbol("consumeMeta"),en=Symbol("consumeHeader"),Ot=Symbol("consuming"),xs=Symbol("bufferConcat"),ui=Symbol("maybeEnd"),it=Symbol("writing"),Re=Symbol("aborted"),ci=Symbol("onDone"),xe=Symbol("sawValidEntry"),fi=Symbol("sawNullBlock"),di=Symbol("sawEOF"),tn=Symbol("closeStream"),xa=()=>!0,qs=class extends Fa.EventEmitter{file;strict;maxMetaEntrySize;filter;brotli;zstd;writable=!0;readable=!1;[me]=[];[_];[de];[ze];[H]="begin";[ge]="";[re];[gt];[Oe]=!1;[S];[Re]=!1;[xe];[fi]=!1;[di]=!1;[it]=!1;[Ot]=!1;[zs]=!1;constructor(e={}){super(),this.file=e.file||"",this.on(ci,()=>{(this[H]==="begin"||this[xe]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(ci,e.ondone):this.on(ci,()=>{this.emit("prefinish"),this.emit("finish"),this.emit("end")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||za,this.filter=typeof e.filter=="function"?e.filter:xa;let t=e.file&&(e.file.endsWith(".tar.br")||e.file.endsWith(".tbr"));this.brotli=!(e.gzip||e.zstd)&&e.brotli!==void 0?e.brotli:t?void 0:!1;let i=e.file&&(e.file.endsWith(".tar.zst")||e.file.endsWith(".tzst"));this.zstd=!(e.gzip||e.brotli)&&e.zstd!==void 0?e.zstd:i?!0:void 0,this.on("end",()=>this[tn]()),typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onReadEntry=="function"&&this.on("entry",e.onReadEntry)}warn(e,t,i={}){(0,Ba.warnMethod)(this,e,t,i)}[en](e,t){this[xe]===void 0&&(this[xe]=!1);let i;try{i=new Vr.Header(e,t,this[re],this[gt])}catch(r){return this.warn("TAR_ENTRY_INVALID",r)}if(i.nullBlock)this[fi]?(this[di]=!0,this[H]==="begin"&&(this[H]="header"),this[ke]("eof")):(this[fi]=!0,this[ke]("nullBlock"));else if(this[fi]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let r=i.type;if(/^(Symbolic)?Link$/.test(r)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(r)&&!/^(Global)?ExtendedHeader$/.test(r)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let n=this[ze]=new Ca.ReadEntry(i,this[re],this[gt]);if(!this[xe])if(n.remain){let o=()=>{n.invalid||(this[xe]=!0)};n.on("end",o)}else this[xe]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[ke]("ignoredEntry",n),this[H]="ignore",n.resume()):n.size>0&&(this[ge]="",n.on("data",o=>this[ge]+=o),this[H]="meta"):(this[re]=void 0,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[ke]("ignoredEntry",n),this[H]=n.remain?"ignore":"header",n.resume()):(n.remain?this[H]="body":(this[H]="header",n.end()),this[de]?this[me].push(n):(this[me].push(n),this[Bs]())))}}}[tn](){queueMicrotask(()=>this.emit("close"))}[Xr](e){let t=!0;if(!e)this[de]=void 0,t=!1;else if(Array.isArray(e)){let[i,...r]=e;this.emit(i,...r)}else this[de]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",()=>this[Bs]()),t=!1);return t}[Bs](){do;while(this[Xr](this[me].shift()));if(this[me].length===0){let e=this[de];!e||e.flowing||e.size===e.remain?this[it]||this.emit("drain"):e.once("drain",()=>this.emit("drain"))}}[ks](e,t){let i=this[ze];if(!i)throw new Error("attempt to consume body without entry??");let r=i.blockRemain??0,n=r>=e.length&&t===0?e:e.subarray(t,t+r);return i.write(n),i.blockRemain||(this[H]="header",this[ze]=void 0,i.end()),n.length}[Jr](e,t){let i=this[ze],r=this[ks](e,t);return!this[ze]&&i&&this[Qr](i),r}[ke](e,t,i){this[me].length===0&&!this[de]?this.emit(e,t,i):this[me].push([e,t,i])}[Qr](e){switch(this[ke]("meta",this[ge]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[re]=$r.Pax.parse(this[ge],this[re],!1);break;case"GlobalExtendedHeader":this[gt]=$r.Pax.parse(this[ge],this[gt],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":{let t=this[re]??Object.create(null);this[re]=t,t.path=this[ge].replace(/\0.*/,"");break}case"NextFileHasLongLinkpath":{let t=this[re]||Object.create(null);this[re]=t,t.linkpath=this[ge].replace(/\0.*/,"");break}default:throw new Error("unknown meta: "+e.type)}}abort(e){this[Re]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e,t,i){if(typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8")),this[Re])return i?.(),!1;if((this[S]===void 0||this.brotli===void 0&&this[S]===!1)&&e){if(this[_]&&(e=Buffer.concat([this[_],e]),this[_]=void 0),e.lengththis[hi](u)),this[S].on("error",u=>this.abort(u)),this[S].on("end",()=>{this[Oe]=!0,this[hi]()}),this[it]=!0;let l=!!this[S][a?"end":"write"](e);return this[it]=!1,i?.(),l}}this[it]=!0,this[S]?this[S].write(e):this[hi](e),this[it]=!1;let n=this[me].length>0?!1:this[de]?this[de].flowing:!0;return!n&&this[me].length===0&&this[de]?.once("drain",()=>this.emit("drain")),i?.(),n}[xs](e){e&&!this[Re]&&(this[_]=this[_]?Buffer.concat([this[_],e]):e)}[ui](){if(this[Oe]&&!this[zs]&&!this[Re]&&!this[Ot]){this[zs]=!0;let e=this[ze];if(e&&e.blockRemain){let t=this[_]?this[_].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${t} available)`,{entry:e}),this[_]&&e.write(this[_]),e.end()}this[ke](ci)}}[hi](e){if(this[Ot]&&e)this[xs](e);else if(!e&&!this[_])this[ui]();else if(e){if(this[Ot]=!0,this[_]){this[xs](e);let t=this[_];this[_]=void 0,this[li](t)}else this[li](e);for(;this[_]&&this[_]?.length>=512&&!this[Re]&&!this[di];){let t=this[_];this[_]=void 0,this[li](t)}this[Ot]=!1}(!this[_]||this[Oe])&&this[ui]()}[li](e){let t=0,i=e.length;for(;t+512<=i&&!this[Re]&&!this[di];)switch(this[H]){case"begin":case"header":this[en](e,t),t+=512;break;case"ignore":case"body":t+=this[ks](e,t);break;case"meta":t+=this[Jr](e,t);break;default:throw new Error("invalid state: "+this[H])}t{"use strict";Object.defineProperty(_i,"__esModule",{value:!0});_i.stripTrailingSlashes=void 0;var ja=s=>{let e=s.length-1,t=-1;for(;e>-1&&s.charAt(e)==="/";)t=e,e--;return t===-1?s:s.slice(0,t)};_i.stripTrailingSlashes=ja});var rt=d(B=>{"use strict";var Ua=B&&B.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),qa=B&&B.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),Wa=B&&B.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r{let e=s.onReadEntry;s.onReadEntry=e?t=>{e(t),t.resume()}:t=>t.resume()},Ka=(s,e)=>{let t=new Map(e.map(n=>[(0,Ws.stripTrailingSlashes)(n),!0])),i=s.filter,r=(n,o="")=>{let h=o||(0,sn.parse)(n).root||".",a;if(n===h)a=!1;else{let l=t.get(n);a=l!==void 0?l:r((0,sn.dirname)(n),h)}return t.set(n,a),a};s.filter=i?(n,o)=>i(n,o)&&r((0,Ws.stripTrailingSlashes)(n)):n=>r((0,Ws.stripTrailingSlashes)(n))};B.filesFilter=Ka;var Va=s=>{let e=new yi.Parser(s),t=s.file,i;try{i=st.default.openSync(t,"r");let r=st.default.fstatSync(i),n=s.maxReadSize||16*1024*1024;if(r.size{let t=new yi.Parser(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,h)=>{t.on("error",h),t.on("end",o),st.default.stat(r,(a,l)=>{if(a)h(a);else{let u=new Za.ReadStream(r,{readSize:i,size:l.size});u.on("error",h),u.pipe(t)}})})};B.list=(0,Ga.makeCommand)(Va,$a,s=>new yi.Parser(s),s=>new yi.Parser(s),(s,e)=>{e?.length&&(0,B.filesFilter)(s,e),s.noResume||Ya(s)})});var rn=d(Ei=>{"use strict";Object.defineProperty(Ei,"__esModule",{value:!0});Ei.modeFix=void 0;var Xa=(s,e,t)=>(s&=4095,t&&(s=(s|384)&-19),e&&(s&256&&(s|=64),s&32&&(s|=8),s&4&&(s|=1)),s);Ei.modeFix=Xa});var Hs=d(bi=>{"use strict";Object.defineProperty(bi,"__esModule",{value:!0});bi.stripAbsolutePath=void 0;var Qa=require("node:path"),{isAbsolute:Ja,parse:nn}=Qa.win32,eh=s=>{let e="",t=nn(s);for(;Ja(s)||t.root;){let i=s.charAt(0)==="/"&&s.slice(0,4)!=="//?/"?"/":t.root;s=s.slice(i.length),e+=i,t=nn(s)}return[e,s]};bi.stripAbsolutePath=eh});var Gs=d(nt=>{"use strict";Object.defineProperty(nt,"__esModule",{value:!0});nt.decode=nt.encode=void 0;var Si=["|","<",">","?",":"],Zs=Si.map(s=>String.fromCodePoint(61440+Number(s.codePointAt(0)))),th=new Map(Si.map((s,e)=>[s,Zs[e]])),ih=new Map(Zs.map((s,e)=>[s,Si[e]])),sh=s=>Si.reduce((e,t)=>e.split(t).join(th.get(t)),s);nt.encode=sh;var rh=s=>Zs.reduce((e,t)=>e.split(t).join(ih.get(t)),s);nt.decode=rh});var sr=d(M=>{"use strict";var nh=M&&M.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),oh=M&&M.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),ah=M&&M.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;re?(s=(0,ne.normalizeWindowsPath)(s).replace(/^\.(\/|$)/,""),(0,hh.stripTrailingSlashes)(e)+"/"+s):(0,ne.normalizeWindowsPath)(s),uh=16*1024*1024,an=Symbol("process"),hn=Symbol("file"),ln=Symbol("directory"),Ks=Symbol("symlink"),un=Symbol("hardlink"),Rt=Symbol("header"),gi=Symbol("read"),Vs=Symbol("lstat"),Oi=Symbol("onlstat"),$s=Symbol("onread"),Xs=Symbol("onreadlink"),Qs=Symbol("openfile"),Js=Symbol("onopenfile"),ve=Symbol("close"),Ri=Symbol("mode"),er=Symbol("awaitDrain"),Ys=Symbol("ondrain"),ae=Symbol("prefix"),vi=class extends fn.Minipass{path;portable;myuid=process.getuid&&process.getuid()||0;myuser=process.env.USER||"";maxReadSize;linkCache;statCache;preservePaths;cwd;strict;mtime;noPax;noMtime;prefix;fd;blockLen=0;blockRemain=0;buf;pos=0;remain=0;length=0;offset=0;win32;absolute;header;type;linkpath;stat;onWriteEntry;#e=!1;constructor(e,t={}){let i=(0,pn.dealias)(t);super(),this.path=(0,ne.normalizeWindowsPath)(e),this.portable=!!i.portable,this.maxReadSize=i.maxReadSize||uh,this.linkCache=i.linkCache||new Map,this.statCache=i.statCache||new Map,this.preservePaths=!!i.preservePaths,this.cwd=(0,ne.normalizeWindowsPath)(i.cwd||process.cwd()),this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.mtime=i.mtime,this.prefix=i.prefix?(0,ne.normalizeWindowsPath)(i.prefix):void 0,this.onWriteEntry=i.onWriteEntry,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let r=!1;if(!this.preservePaths){let[o,h]=(0,wn.stripAbsolutePath)(this.path);o&&typeof h=="string"&&(this.path=h,r=o)}this.win32=!!i.win32||process.platform==="win32",this.win32&&(this.path=lh.decode(this.path.replaceAll(/\\/g,"/")),e=e.replaceAll(/\\/g,"/")),this.absolute=(0,ne.normalizeWindowsPath)(i.absolute||on.default.resolve(this.cwd,e)),this.path===""&&(this.path="./"),r&&this.warn("TAR_ENTRY_INFO",`stripping ${r} from absolute path`,{entry:this,path:r+this.path});let n=this.statCache.get(this.absolute);n?this[Oi](n):this[Vs]()}warn(e,t,i={}){return(0,yn.warnMethod)(this,e,t,i)}emit(e,...t){return e==="error"&&(this.#e=!0),super.emit(e,...t)}[Vs](){oe.default.lstat(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[Oi](t)})}[Oi](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=ch(e),this.emit("stat",e),this[an]()}[an](){switch(this.type){case"File":return this[hn]();case"Directory":return this[ln]();case"SymbolicLink":return this[Ks]();default:return this.end()}}[Ri](e){return(0,mn.modeFix)(e,this.type==="Directory",this.portable)}[ae](e){return En(e,this.prefix)}[Rt](){if(!this.stat)throw new Error("cannot write header before stat");this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.onWriteEntry?.(this),this.header=new dn.Header({path:this[ae](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[ae](this.linkpath):this.linkpath,mode:this[Ri](this.stat.mode),uid:this.portable?void 0:this.stat.uid,gid:this.portable?void 0:this.stat.gid,size:this.stat.size,mtime:this.noMtime?void 0:this.mtime||this.stat.mtime,type:this.type==="Unsupported"?void 0:this.type,uname:this.portable?void 0:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?void 0:this.stat.atime,ctime:this.portable?void 0:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new _n.Pax({atime:this.portable?void 0:this.header.atime,ctime:this.portable?void 0:this.header.ctime,gid:this.portable?void 0:this.header.gid,mtime:this.noMtime?void 0:this.mtime||this.header.mtime,path:this[ae](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[ae](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?void 0:this.header.uid,uname:this.portable?void 0:this.header.uname,dev:this.portable?void 0:this.stat.dev,ino:this.portable?void 0:this.stat.ino,nlink:this.portable?void 0:this.stat.nlink}).encode());let e=this.header?.block;if(!e)throw new Error("failed to encode header");super.write(e)}[ln](){if(!this.stat)throw new Error("cannot create directory entry without stat");this.path.slice(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[Rt](),this.end()}[Ks](){oe.default.readlink(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[Xs](t)})}[Xs](e){this.linkpath=(0,ne.normalizeWindowsPath)(e),this[Rt](),this.end()}[un](e){if(!this.stat)throw new Error("cannot create link entry without stat");this.type="Link",this.linkpath=(0,ne.normalizeWindowsPath)(on.default.relative(this.cwd,e)),this.stat.size=0,this[Rt](),this.end()}[hn](){if(!this.stat)throw new Error("cannot create file entry without stat");if(this.stat.nlink>1){let e=`${this.stat.dev}:${this.stat.ino}`,t=this.linkCache.get(e);if(t?.indexOf(this.cwd)===0)return this[un](t);this.linkCache.set(e,this.absolute)}if(this[Rt](),this.stat.size===0)return this.end();this[Qs]()}[Qs](){oe.default.open(this.absolute,"r",(e,t)=>{if(e)return this.emit("error",e);this[Js](t)})}[Js](e){if(this.fd=e,this.#e)return this[ve]();if(!this.stat)throw new Error("should stat before calling onopenfile");this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let t=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(t),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[gi]()}[gi](){let{fd:e,buf:t,offset:i,length:r,pos:n}=this;if(e===void 0||t===void 0)throw new Error("cannot read file without first opening");oe.default.read(e,t,i,r,n,(o,h)=>{if(o)return this[ve](()=>this.emit("error",o));this[$s](h)})}[ve](e=()=>{}){this.fd!==void 0&&oe.default.close(this.fd,e)}[$s](e){if(e<=0&&this.remain>0){let r=Object.assign(new Error("encountered unexpected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[ve](()=>this.emit("error",r))}if(e>this.remain){let r=Object.assign(new Error("did not encounter expected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[ve](()=>this.emit("error",r))}if(!this.buf)throw new Error("should have created buffer prior to reading");if(e===this.remain)for(let r=e;rthis[Ys]())}[er](e){this.once("drain",e)}write(e,t,i){if(typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8")),this.blockRemaine?this.emit("error",e):this.end());if(!this.buf)throw new Error("buffer lost somehow in ONDRAIN");this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[gi]()}};M.WriteEntry=vi;var tr=class extends vi{sync=!0;[Vs](){this[Oi](oe.default.lstatSync(this.absolute))}[Ks](){this[Xs](oe.default.readlinkSync(this.absolute))}[Qs](){this[Js](oe.default.openSync(this.absolute,"r"))}[gi](){let e=!0;try{let{fd:t,buf:i,offset:r,length:n,pos:o}=this;if(t===void 0||i===void 0)throw new Error("fd and buf must be set in READ method");let h=oe.default.readSync(t,i,r,n,o);this[$s](h),e=!1}finally{if(e)try{this[ve](()=>{})}catch{}}}[er](e){e()}[ve](e=()=>{}){this.fd!==void 0&&oe.default.closeSync(this.fd),e()}};M.WriteEntrySync=tr;var ir=class extends fn.Minipass{blockLen=0;blockRemain=0;buf=0;pos=0;remain=0;length=0;preservePaths;portable;strict;noPax;noMtime;readEntry;type;prefix;path;mode;uid;gid;uname;gname;header;mtime;atime;ctime;linkpath;size;onWriteEntry;warn(e,t,i={}){return(0,yn.warnMethod)(this,e,t,i)}constructor(e,t={}){let i=(0,pn.dealias)(t);super(),this.preservePaths=!!i.preservePaths,this.portable=!!i.portable,this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.onWriteEntry=i.onWriteEntry,this.readEntry=e;let{type:r}=e;if(r==="Unsupported")throw new Error("writing entry that should be ignored");this.type=r,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=i.prefix,this.path=(0,ne.normalizeWindowsPath)(e.path),this.mode=e.mode!==void 0?this[Ri](e.mode):void 0,this.uid=this.portable?void 0:e.uid,this.gid=this.portable?void 0:e.gid,this.uname=this.portable?void 0:e.uname,this.gname=this.portable?void 0:e.gname,this.size=e.size,this.mtime=this.noMtime?void 0:i.mtime||e.mtime,this.atime=this.portable?void 0:e.atime,this.ctime=this.portable?void 0:e.ctime,this.linkpath=e.linkpath!==void 0?(0,ne.normalizeWindowsPath)(e.linkpath):void 0,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let n=!1;if(!this.preservePaths){let[h,a]=(0,wn.stripAbsolutePath)(this.path);h&&typeof a=="string"&&(this.path=a,n=h)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.onWriteEntry?.(this),this.header=new dn.Header({path:this[ae](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[ae](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?void 0:this.uid,gid:this.portable?void 0:this.gid,size:this.size,mtime:this.noMtime?void 0:this.mtime,type:this.type,uname:this.portable?void 0:this.uname,atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime}),n&&this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:this,path:n+this.path}),this.header.encode()&&!this.noPax&&super.write(new _n.Pax({atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime,gid:this.portable?void 0:this.gid,mtime:this.noMtime?void 0:this.mtime,path:this[ae](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[ae](this.linkpath):this.linkpath,size:this.size,uid:this.portable?void 0:this.uid,uname:this.portable?void 0:this.uname,dev:this.portable?void 0:this.readEntry.dev,ino:this.portable?void 0:this.readEntry.ino,nlink:this.portable?void 0:this.readEntry.nlink}).encode());let o=this.header?.block;if(!o)throw new Error("failed to encode header");super.write(o),e.pipe(this)}[ae](e){return En(e,this.prefix)}[Ri](e){return(0,mn.modeFix)(e,this.type==="Directory",this.portable)}write(e,t,i){typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8"));let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e,i)}end(e,t,i){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),typeof e=="function"&&(i=e,t=void 0,e=void 0),typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,t??"utf8")),i&&this.once("finish",i),e?super.end(e,i):super.end(i),this}};M.WriteEntryTar=ir;var ch=s=>s.isFile()?"File":s.isDirectory()?"Directory":s.isSymbolicLink()?"SymbolicLink":"Unsupported"});var bn=d(at=>{"use strict";Object.defineProperty(at,"__esModule",{value:!0});at.Node=at.Yallist=void 0;var rr=class s{tail;head;length=0;static create(e=[]){return new s(e)}constructor(e=[]){for(let t of e)this.push(t)}*[Symbol.iterator](){for(let e=this.head;e;e=e.next)yield e.value}removeNode(e){if(e.list!==this)throw new Error("removing node which does not belong to this list");let t=e.next,i=e.prev;return t&&(t.prev=i),i&&(i.next=t),e===this.head&&(this.head=t),e===this.tail&&(this.tail=i),this.length--,e.next=void 0,e.prev=void 0,e.list=void 0,t}unshiftNode(e){if(e===this.head)return;e.list&&e.list.removeNode(e);let t=this.head;e.list=this,e.next=t,t&&(t.prev=e),this.head=e,this.tail||(this.tail=e),this.length++}pushNode(e){if(e===this.tail)return;e.list&&e.list.removeNode(e);let t=this.tail;e.list=this,e.prev=t,t&&(t.next=e),this.tail=e,this.head||(this.head=e),this.length++}push(...e){for(let t=0,i=e.length;t1)i=t;else if(this.head)r=this.head.next,i=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;r;n++)i=e(i,r.value,n),r=r.next;return i}reduceReverse(e,t){let i,r=this.tail;if(arguments.length>1)i=t;else if(this.tail)r=this.tail.prev,i=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(let n=this.length-1;r;n--)i=e(i,r.value,n),r=r.prev;return i}toArray(){let e=new Array(this.length);for(let t=0,i=this.head;i;t++)e[t]=i.value,i=i.next;return e}toArrayReverse(){let e=new Array(this.length);for(let t=0,i=this.tail;i;t++)e[t]=i.value,i=i.prev;return e}slice(e=0,t=this.length){t<0&&(t+=this.length),e<0&&(e+=this.length);let i=new s;if(tthis.length&&(t=this.length);let r=this.head,n=0;for(n=0;r&&nthis.length&&(t=this.length);let r=this.length,n=this.tail;for(;n&&r>t;r--)n=n.prev;for(;n&&r>e;r--,n=n.prev)i.push(n.value);return i}splice(e,t=0,...i){e>this.length&&(e=this.length-1),e<0&&(e=this.length+e);let r=this.head;for(let o=0;r&&o{"use strict";var ph=L&&L.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),_h=L&&L.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),wh=L&&L.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r1)throw new TypeError("gzip, brotli, zstd are mutually exclusive");if(e.gzip&&(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new nr.Gzip(e.gzip)),e.brotli&&(typeof e.brotli!="object"&&(e.brotli={}),this.zip=new nr.BrotliCompress(e.brotli)),e.zstd&&(typeof e.zstd!="object"&&(e.zstd={}),this.zip=new nr.ZstdCompress(e.zstd)),!this.zip)throw new Error("impossible");let t=this.zip;t.on("data",i=>super.write(i)),t.on("end",()=>super.end()),t.on("drain",()=>this[hr]()),this.on("resume",()=>t.resume())}else this.on("drain",this[hr]);this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,e.mtime&&(this.mtime=e.mtime),this.filter=typeof e.filter=="function"?e.filter:()=>!0,this[X]=new Eh.Yallist,this[Q]=0,this.jobs=Number(e.jobs)||4,this[Dt]=!1,this[vt]=!1}[Tn](e){return super.write(e)}add(e){return this.write(e),this}end(e,t,i){return typeof e=="function"&&(i=e,e=void 0),typeof t=="function"&&(i=t,t=void 0),e&&this.add(e),this[vt]=!0,this[je](),i&&i(),this}write(e){if(this[vt])throw new Error("write after end");return typeof e=="string"?this[Pi](e):this[gn](e),this.flowing}[gn](e){let t=(0,lr.normalizeWindowsPath)(Rn.default.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let i=new Pt(e.path,t);i.entry=new ur.WriteEntryTar(e,this[ar](i)),i.entry.on("end",()=>this[or](i)),this[Q]+=1,this[X].push(i)}this[je]()}[Pi](e){let t=(0,lr.normalizeWindowsPath)(Rn.default.resolve(this.cwd,e));this[X].push(new Pt(e,t)),this[je]()}[cr](e){e.pending=!0,this[Q]+=1;let t=this.follow?"stat":"lstat";Ai.default[t](e.absolute,(i,r)=>{e.pending=!1,this[Q]-=1,i?this.emit("error",i):this[Di](e,r)})}[Di](e,t){if(this.statCache.set(e.absolute,t),e.stat=t,!this.filter(e.path,t))e.ignore=!0;else if(t.isFile()&&t.nlink>1&&!this.linkCache.get(`${t.dev}:${t.ino}`)&&!this.sync)if(e===this[Te])this[Ti](e);else{let i=`${t.dev}:${t.ino}`,r=this[Tt].get(i);r?r.push(e):this[Tt].set(i,[e]),e.pendingLink=!0,e.pending=!0}this[je]()}[fr](e){e.pending=!0,this[Q]+=1,Ai.default.readdir(e.absolute,(t,i)=>{if(e.pending=!1,this[Q]-=1,t)return this.emit("error",t);this[Ni](e,i)})}[Ni](e,t){this.readdirCache.set(e.absolute,t),e.readdir=t,this[je]()}[je](){if(!this[Dt]){this[Dt]=!0;for(let e=this[X].head;e&&this[Q]1){let i=`${t.dev}:${t.ino}`,r=this[Tt].get(i);if(r){this[Tt].delete(i);for(let n of r)n.pending=!1,this[Ti](n)}}this[je]()}[Ti](e){if(e.pending&&e.pendingLink&&e===this[Te]&&(e.pending=!1,e.pendingLink=!1),!e.pending){if(e.entry){e===this[Te]&&!e.piped&&this[Mi](e);return}if(!e.stat){let t=this.statCache.get(e.absolute);t?this[Di](e,t):this[cr](e)}if(e.stat&&!e.ignore){if(!this.noDirRecurse&&e.stat.isDirectory()&&!e.readdir){let t=this.readdirCache.get(e.absolute);if(t?this[Ni](e,t):this[fr](e),!e.readdir)return}if(e.entry=this[On](e),!e.entry){e.ignore=!0;return}e===this[Te]&&!e.piped&&this[Mi](e)}}}[ar](e){return{onwarn:(t,i,r)=>this.warn(t,i,r),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix,onWriteEntry:this.onWriteEntry}}[On](e){this[Q]+=1;try{return new this[Li](e.path,this[ar](e)).on("end",()=>this[or](e)).on("error",i=>this.emit("error",i))}catch(t){this.emit("error",t)}}[hr](){this[Te]&&this[Te].entry&&this[Te].entry.resume()}[Mi](e){e.piped=!0,e.readdir&&e.readdir.forEach(r=>{let n=e.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[Pi](o+r)});let t=e.entry,i=this.zip;if(!t)throw new Error("cannot pipe without source");i?t.on("data",r=>{i.write(r)||t.pause()}):t.on("data",r=>{super.write(r)||t.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}warn(e,t,i={}){(0,bh.warnMethod)(this,e,t,i)}};L.Pack=Ii;var dr=class extends Ii{sync=!0;constructor(e){super(e),this[Li]=ur.WriteEntrySync}pause(){}resume(){}[cr](e){let t=this.follow?"statSync":"lstatSync";this[Di](e,Ai.default[t](e.absolute))}[fr](e){this[Ni](e,Ai.default.readdirSync(e.absolute))}[Mi](e){let t=e.entry,i=this.zip;if(e.readdir&&e.readdir.forEach(r=>{let n=e.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[Pi](o+r)}),!t)throw new Error("Cannot pipe without source");i?t.on("data",r=>{i.write(r)}):t.on("data",r=>{super[Tn](r)})}};L.PackSync=dr});var mr=d(ht=>{"use strict";var Sh=ht&&ht.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(ht,"__esModule",{value:!0});ht.create=void 0;var Dn=Ke(),Pn=Sh(require("node:path")),Nn=rt(),gh=Ve(),Ci=Fi(),Oh=(s,e)=>{let t=new Ci.PackSync(s),i=new Dn.WriteStreamSync(s.file,{mode:s.mode||438});t.pipe(i),Mn(t,e)},Rh=(s,e)=>{let t=new Ci.Pack(s),i=new Dn.WriteStream(s.file,{mode:s.mode||438});t.pipe(i);let r=new Promise((n,o)=>{i.on("error",o),i.on("close",n),t.on("error",o)});return Ln(t,e).catch(n=>t.emit("error",n)),r},Mn=(s,e)=>{e.forEach(t=>{t.charAt(0)==="@"?(0,Nn.list)({file:Pn.default.resolve(s.cwd,t.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(t)}),s.end()},Ln=async(s,e)=>{for(let t of e)t.charAt(0)==="@"?await(0,Nn.list)({file:Pn.default.resolve(String(s.cwd),t.slice(1)),noResume:!0,onReadEntry:i=>{s.add(i)}}):s.add(t);s.end()},vh=(s,e)=>{let t=new Ci.PackSync(s);return Mn(t,e),t},Th=(s,e)=>{let t=new Ci.Pack(s);return Ln(t,e).catch(i=>t.emit("error",i)),t};ht.create=(0,gh.makeCommand)(Oh,Rh,vh,Th,(s,e)=>{if(!e?.length)throw new TypeError("no paths specified to add to archive")})});var jn=d(lt=>{"use strict";var Dh=lt&<.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(lt,"__esModule",{value:!0});lt.getWriteFlag=void 0;var Fn=Dh(require("fs")),Ph=process.env.__FAKE_PLATFORM__||process.platform,Cn=Ph==="win32",{O_CREAT:Bn,O_NOFOLLOW:An,O_TRUNC:zn,O_WRONLY:kn}=Fn.default.constants,xn=Number(process.env.__FAKE_FS_O_FILENAME__)||Fn.default.constants.UV_FS_O_FILEMAP||0,Nh=Cn&&!!xn,Mh=512*1024,Lh=xn|zn|Bn|kn,In=!Cn&&typeof An=="number"?An|zn|Bn|kn:null;lt.getWriteFlag=In!==null?()=>In:Nh?s=>s"w"});var qn=d(he=>{"use strict";var Un=he&&he.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(he,"__esModule",{value:!0});he.chownrSync=he.chownr=void 0;var zi=Un(require("node:fs")),Nt=Un(require("node:path")),pr=(s,e,t)=>{try{return zi.default.lchownSync(s,e,t)}catch(i){if(i?.code!=="ENOENT")throw i}},Bi=(s,e,t,i)=>{zi.default.lchown(s,e,t,r=>{i(r&&r?.code!=="ENOENT"?r:null)})},Ah=(s,e,t,i,r)=>{if(e.isDirectory())(0,he.chownr)(Nt.default.resolve(s,e.name),t,i,n=>{if(n)return r(n);let o=Nt.default.resolve(s,e.name);Bi(o,t,i,r)});else{let n=Nt.default.resolve(s,e.name);Bi(n,t,i,r)}},Ih=(s,e,t,i)=>{zi.default.readdir(s,{withFileTypes:!0},(r,n)=>{if(r){if(r.code==="ENOENT")return i();if(r.code!=="ENOTDIR"&&r.code!=="ENOTSUP")return i(r)}if(r||!n.length)return Bi(s,e,t,i);let o=n.length,h=null,a=l=>{if(!h){if(l)return i(h=l);if(--o===0)return Bi(s,e,t,i)}};for(let l of n)Ah(s,l,e,t,a)})};he.chownr=Ih;var Fh=(s,e,t,i)=>{e.isDirectory()&&(0,he.chownrSync)(Nt.default.resolve(s,e.name),t,i),pr(Nt.default.resolve(s,e.name),t,i)},Ch=(s,e,t)=>{let i;try{i=zi.default.readdirSync(s,{withFileTypes:!0})}catch(r){let n=r;if(n?.code==="ENOENT")return;if(n?.code==="ENOTDIR"||n?.code==="ENOTSUP")return pr(s,e,t);throw n}for(let r of i)Fh(s,r,e,t);return pr(s,e,t)};he.chownrSync=Ch});var Wn=d(ki=>{"use strict";Object.defineProperty(ki,"__esModule",{value:!0});ki.CwdError=void 0;var _r=class extends Error{path;code;syscall="chdir";constructor(e,t){super(`${t}: Cannot cd into '${e}'`),this.path=e,this.code=t}get name(){return"CwdError"}};ki.CwdError=_r});var yr=d(xi=>{"use strict";Object.defineProperty(xi,"__esModule",{value:!0});xi.SymlinkError=void 0;var wr=class extends Error{path;symlink;syscall="symlink";code="TAR_SYMLINK_ERROR";constructor(e,t){super("TAR_SYMLINK_ERROR: Cannot extract through symbolic link"),this.symlink=e,this.path=t}get name(){return"SymlinkError"}};xi.SymlinkError=wr});var Kn=d(De=>{"use strict";var br=De&&De.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(De,"__esModule",{value:!0});De.mkdirSync=De.mkdir=void 0;var Hn=qn(),j=br(require("node:fs")),Bh=br(require("node:fs/promises")),ji=br(require("node:path")),Zn=Wn(),pe=tt(),Gn=yr(),zh=(s,e)=>{j.default.stat(s,(t,i)=>{(t||!i.isDirectory())&&(t=new Zn.CwdError(s,t?.code||"ENOTDIR")),e(t)})},kh=(s,e,t)=>{s=(0,pe.normalizeWindowsPath)(s);let i=e.umask??18,r=e.mode|448,n=(r&i)!==0,o=e.uid,h=e.gid,a=typeof o=="number"&&typeof h=="number"&&(o!==e.processUid||h!==e.processGid),l=e.preserve,u=e.unlink,c=(0,pe.normalizeWindowsPath)(e.cwd),E=(w,P)=>{w?t(w):P&&a?(0,Hn.chownr)(P,o,h,kt=>E(kt)):n?j.default.chmod(s,r,t):t()};if(s===c)return zh(s,E);if(l)return Bh.default.mkdir(s,{mode:r,recursive:!0}).then(w=>E(null,w??void 0),E);let A=(0,pe.normalizeWindowsPath)(ji.default.relative(c,s)).split("/");Er(c,A,r,u,c,void 0,E)};De.mkdir=kh;var Er=(s,e,t,i,r,n,o)=>{if(e.length===0)return o(null,n);let h=e.shift(),a=(0,pe.normalizeWindowsPath)(ji.default.resolve(s+"/"+h));j.default.mkdir(a,t,Yn(a,e,t,i,r,n,o))},Yn=(s,e,t,i,r,n,o)=>h=>{h?j.default.lstat(s,(a,l)=>{if(a)a.path=a.path&&(0,pe.normalizeWindowsPath)(a.path),o(a);else if(l.isDirectory())Er(s,e,t,i,r,n,o);else if(i)j.default.unlink(s,u=>{if(u)return o(u);j.default.mkdir(s,t,Yn(s,e,t,i,r,n,o))});else{if(l.isSymbolicLink())return o(new Gn.SymlinkError(s,s+"/"+e.join("/")));o(h)}}):(n=n||s,Er(s,e,t,i,r,n,o))},xh=s=>{let e=!1,t;try{e=j.default.statSync(s).isDirectory()}catch(i){t=i?.code}finally{if(!e)throw new Zn.CwdError(s,t??"ENOTDIR")}},jh=(s,e)=>{s=(0,pe.normalizeWindowsPath)(s);let t=e.umask??18,i=e.mode|448,r=(i&t)!==0,n=e.uid,o=e.gid,h=typeof n=="number"&&typeof o=="number"&&(n!==e.processUid||o!==e.processGid),a=e.preserve,l=e.unlink,u=(0,pe.normalizeWindowsPath)(e.cwd),c=w=>{w&&h&&(0,Hn.chownrSync)(w,n,o),r&&j.default.chmodSync(s,i)};if(s===u)return xh(u),c();if(a)return c(j.default.mkdirSync(s,{mode:i,recursive:!0})??void 0);let D=(0,pe.normalizeWindowsPath)(ji.default.relative(u,s)).split("/"),A;for(let w=D.shift(),P=u;w&&(P+="/"+w);w=D.shift()){P=(0,pe.normalizeWindowsPath)(ji.default.resolve(P));try{j.default.mkdirSync(P,i),A=A||P}catch{let kt=j.default.lstatSync(P);if(kt.isDirectory())continue;if(l){j.default.unlinkSync(P),j.default.mkdirSync(P,i),A=A||P;continue}else if(kt.isSymbolicLink())return new Gn.SymlinkError(P,P+"/"+D.join("/"))}}return c(A)};De.mkdirSync=jh});var $n=d(Ui=>{"use strict";Object.defineProperty(Ui,"__esModule",{value:!0});Ui.normalizeUnicode=void 0;var Sr=Object.create(null),Vn=1e4,ut=new Set,Uh=s=>{ut.has(s)?ut.delete(s):Sr[s]=s.normalize("NFD").toLocaleLowerCase("en").toLocaleUpperCase("en"),ut.add(s);let e=Sr[s],t=ut.size-Vn;if(t>Vn/10){for(let i of ut)if(ut.delete(i),delete Sr[i],--t<=0)break}return e};Ui.normalizeUnicode=Uh});var Qn=d(qi=>{"use strict";Object.defineProperty(qi,"__esModule",{value:!0});qi.PathReservations=void 0;var Xn=require("node:path"),qh=$n(),Wh=wi(),Hh=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,Zh=Hh==="win32",Gh=s=>s.split("/").slice(0,-1).reduce((t,i)=>{let r=t.at(-1);return r!==void 0&&(i=(0,Xn.join)(r,i)),t.push(i||"/"),t},[]),gr=class{#e=new Map;#i=new Map;#s=new Set;reserve(e,t){e=Zh?["win32 parallelization disabled"]:e.map(r=>(0,Wh.stripTrailingSlashes)((0,Xn.join)((0,qh.normalizeUnicode)(r))));let i=new Set(e.map(r=>Gh(r)).reduce((r,n)=>r.concat(n)));this.#i.set(t,{dirs:i,paths:e});for(let r of e){let n=this.#e.get(r);n?n.push(t):this.#e.set(r,[t])}for(let r of i){let n=this.#e.get(r);if(!n)this.#e.set(r,[new Set([t])]);else{let o=n.at(-1);o instanceof Set?o.add(t):n.push(new Set([t]))}}return this.#r(t)}#n(e){let t=this.#i.get(e);if(!t)throw new Error("function does not have any path reservations");return{paths:t.paths.map(i=>this.#e.get(i)),dirs:[...t.dirs].map(i=>this.#e.get(i))}}check(e){let{paths:t,dirs:i}=this.#n(e);return t.every(r=>r&&r[0]===e)&&i.every(r=>r&&r[0]instanceof Set&&r[0].has(e))}#r(e){return this.#s.has(e)||!this.check(e)?!1:(this.#s.add(e),e(()=>this.#t(e)),!0)}#t(e){if(!this.#s.has(e))return!1;let t=this.#i.get(e);if(!t)throw new Error("invalid reservation");let{paths:i,dirs:r}=t,n=new Set;for(let o of i){let h=this.#e.get(o);if(!h||h?.[0]!==e)continue;let a=h[1];if(!a){this.#e.delete(o);continue}if(h.shift(),typeof a=="function")n.add(a);else for(let l of a)n.add(l)}for(let o of r){let h=this.#e.get(o),a=h?.[0];if(!(!h||!(a instanceof Set)))if(a.size===1&&h.length===1){this.#e.delete(o);continue}else if(a.size===1){h.shift();let l=h[0];typeof l=="function"&&n.add(l)}else a.delete(e)}return this.#s.delete(e),n.forEach(o=>this.#r(o)),!0}};qi.PathReservations=gr});var Jn=d(Wi=>{"use strict";Object.defineProperty(Wi,"__esModule",{value:!0});Wi.umask=void 0;var Yh=()=>process.umask();Wi.umask=Yh});var Ir=d(k=>{"use strict";var Kh=k&&k.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),Vh=k&&k.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),lo=k&&k.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r{if(!Bt)return m.default.unlink(s,e);let t=s+".DELETE."+(0,uo.randomBytes)(16).toString("hex");m.default.rename(s,t,i=>{if(i)return e(i);m.default.unlink(t,e)})},nl=s=>{if(!Bt)return m.default.unlinkSync(s);let e=s+".DELETE."+(0,uo.randomBytes)(16).toString("hex");m.default.renameSync(s,e),m.default.unlinkSync(e)},ho=(s,e,t)=>s!==void 0&&s===s>>>0?s:e!==void 0&&e===e>>>0?e:t,Gi=class extends Qh.Parser{[Rr]=!1;[Ct]=!1;[Hi]=0;reservations=new el.PathReservations;transform;writable=!0;readable=!1;uid;gid;setOwner;preserveOwner;processGid;processUid;maxDepth;forceChown;win32;newer;keep;noMtime;preservePaths;unlink;cwd;strip;processUmask;umask;dmode;fmode;chmod;constructor(e={}){if(e.ondone=()=>{this[Rr]=!0,this[vr]()},super(e),this.transform=e.transform,this.chmod=!!e.chmod,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=void 0,this.gid=void 0,this.setOwner=!1;this.preserveOwner=e.preserveOwner===void 0&&typeof e.uid!="number"?!!(process.getuid&&process.getuid()===0):!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():void 0,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():void 0,this.maxDepth=typeof e.maxDepth=="number"?e.maxDepth:sl,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||Bt,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=(0,U.normalizeWindowsPath)(g.default.resolve(e.cwd||process.cwd())),this.strip=Number(e.strip)||0,this.processUmask=this.chmod?typeof e.processUmask=="number"?e.processUmask:(0,tl.umask)():0,this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",t=>this[to](t))}warn(e,t,i={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(i.recoverable=!1),super.warn(e,t,i)}[vr](){this[Rr]&&this[Hi]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"))}[Or](e,t){let i=e[t],{type:r}=e;if(!i||this.preservePaths)return!0;let[n,o]=(0,Jh.stripAbsolutePath)(i),h=o.replaceAll(/\\/g,"/").split("/");if(h.includes("..")||Bt&&/^[a-z]:\.\.$/i.test(h[0]??"")){if(t==="path"||r==="Link")return this.warn("TAR_ENTRY_ERROR",`${t} contains '..'`,{entry:e,[t]:i}),!1;let a=g.default.posix.dirname(e.path),l=g.default.posix.normalize(g.default.posix.join(a,h.join("/")));if(l.startsWith("../")||l==="..")return this.warn("TAR_ENTRY_ERROR",`${t} escapes extraction directory`,{entry:e,[t]:i}),!1}return n&&(e[t]=String(o),this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute ${t}`,{entry:e,[t]:i})),!0}[oo](e){let t=(0,U.normalizeWindowsPath)(e.path),i=t.split("/");if(this.strip){if(i.length=this.strip)e.linkpath=r.slice(this.strip).join("/");else return!1}i.splice(0,this.strip),e.path=i.join("/")}if(isFinite(this.maxDepth)&&i.length>this.maxDepth)return this.warn("TAR_ENTRY_ERROR","path excessively deep",{entry:e,path:t,depth:i.length,maxDepth:this.maxDepth}),!1;if(!this[Or](e,"path")||!this[Or](e,"linkpath"))return!1;if(e.absolute=g.default.isAbsolute(e.path)?(0,U.normalizeWindowsPath)(g.default.resolve(e.path)):(0,U.normalizeWindowsPath)(g.default.resolve(this.cwd,e.path)),!this.preservePaths&&typeof e.absolute=="string"&&e.absolute.indexOf(this.cwd+"/")!==0&&e.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:e,path:(0,U.normalizeWindowsPath)(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!=="Directory"&&e.type!=="GNUDumpDir")return!1;if(this.win32){let{root:r}=g.default.win32.parse(String(e.absolute));e.absolute=r+eo.encode(String(e.absolute).slice(r.length));let{root:n}=g.default.win32.parse(e.path);e.path=n+eo.encode(e.path.slice(n.length))}return!0}[to](e){if(!this[oo](e))return e.resume();switch(Xh.default.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[Tr](e);default:return this[no](e)}}[T](e,t){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:t}),this[ct](),t.resume())}[Pe](e,t,i){(0,fo.mkdir)((0,U.normalizeWindowsPath)(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:t},i)}[At](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[It](e){return ho(this.uid,e.uid,this.processUid)}[Ft](e){return ho(this.gid,e.gid,this.processGid)}[Pr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.fmode,r=new $h.WriteStream(String(e.absolute),{flags:(0,co.getWriteFlag)(e.size),mode:i,autoClose:!1});r.on("error",a=>{r.fd&&m.default.close(r.fd,()=>{}),r.write=()=>!0,this[T](a,e),t()});let n=1,o=a=>{if(a){r.fd&&m.default.close(r.fd,()=>{}),this[T](a,e),t();return}--n===0&&r.fd!==void 0&&m.default.close(r.fd,l=>{l?this[T](l,e):this[ct](),t()})};r.on("finish",()=>{let a=String(e.absolute),l=r.fd;if(typeof l=="number"&&e.mtime&&!this.noMtime){n++;let u=e.atime||new Date,c=e.mtime;m.default.futimes(l,u,c,E=>E?m.default.utimes(a,u,c,D=>o(D&&E)):o())}if(typeof l=="number"&&this[At](e)){n++;let u=this[It](e),c=this[Ft](e);typeof u=="number"&&typeof c=="number"&&m.default.fchown(l,u,c,E=>E?m.default.chown(a,u,c,D=>o(D&&E)):o())}o()});let h=this.transform&&this.transform(e)||e;h!==e&&(h.on("error",a=>{this[T](a,e),t()}),e.pipe(h)),h.pipe(r)}[Nr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.dmode;this[Pe](String(e.absolute),i,r=>{if(r){this[T](r,e),t();return}let n=1,o=()=>{--n===0&&(t(),this[ct](),e.resume())};e.mtime&&!this.noMtime&&(n++,m.default.utimes(String(e.absolute),e.atime||new Date,e.mtime,o)),this[At](e)&&(n++,m.default.chown(String(e.absolute),Number(this[It](e)),Number(this[Ft](e)),o)),o()})}[no](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[so](e,t){let i=(0,U.normalizeWindowsPath)(g.default.relative(this.cwd,g.default.resolve(g.default.dirname(String(e.absolute)),String(e.linkpath)))).split("/");this[Lt](e,this.cwd,i,()=>this[Zi](e,String(e.linkpath),"symlink",t),r=>{this[T](r,e),t()})}[ro](e,t){let i=(0,U.normalizeWindowsPath)(g.default.resolve(this.cwd,String(e.linkpath))),r=(0,U.normalizeWindowsPath)(String(e.linkpath)).split("/");this[Lt](e,this.cwd,r,()=>this[Zi](e,i,"link",t),n=>{this[T](n,e),t()})}[Lt](e,t,i,r,n){let o=i.shift();if(this.preservePaths||o===void 0)return r();let h=g.default.resolve(t,o);m.default.lstat(h,(a,l)=>{if(a)return r();if(l?.isSymbolicLink())return n(new mo.SymlinkError(h,g.default.resolve(h,i.join("/"))));this[Lt](e,h,i,r,n)})}[ao](){this[Hi]++}[ct](){this[Hi]--,this[vr]()}[Mr](e){this[ct](),e.resume()}[Dr](e,t){return e.type==="File"&&!this.unlink&&t.isFile()&&t.nlink<=1&&!Bt}[Tr](e){this[ao]();let t=[e.path];e.linkpath&&t.push(e.linkpath),this.reservations.reserve(t,i=>this[io](e,i))}[io](e,t){let i=h=>{t(h)},r=()=>{this[Pe](this.cwd,this.dmode,h=>{if(h){this[T](h,e),i();return}this[Ct]=!0,n()})},n=()=>{if(e.absolute!==this.cwd){let h=(0,U.normalizeWindowsPath)(g.default.dirname(String(e.absolute)));if(h!==this.cwd)return this[Pe](h,this.dmode,a=>{if(a){this[T](a,e),i();return}o()})}o()},o=()=>{m.default.lstat(String(e.absolute),(h,a)=>{if(a&&(this.keep||this.newer&&a.mtime>(e.mtime??a.mtime))){this[Mr](e),i();return}if(h||this[Dr](e,a))return this[Z](null,e,i);if(a.isDirectory()){if(e.type==="Directory"){let l=this.chmod&&e.mode&&(a.mode&4095)!==e.mode,u=c=>this[Z](c??null,e,i);return l?m.default.chmod(String(e.absolute),Number(e.mode),u):u()}if(e.absolute!==this.cwd)return m.default.rmdir(String(e.absolute),l=>this[Z](l??null,e,i))}if(e.absolute===this.cwd)return this[Z](null,e,i);rl(String(e.absolute),l=>this[Z](l??null,e,i))})};this[Ct]?n():r()}[Z](e,t,i){if(e){this[T](e,t),i();return}switch(t.type){case"File":case"OldFile":case"ContiguousFile":return this[Pr](t,i);case"Link":return this[ro](t,i);case"SymbolicLink":return this[so](t,i);case"Directory":case"GNUDumpDir":return this[Nr](t,i)}}[Zi](e,t,i,r){m.default[i](t,String(e.absolute),n=>{n?this[T](n,e):(this[ct](),e.resume()),r()})}};k.Unpack=Gi;var Mt=s=>{try{return[null,s()]}catch(e){return[e,null]}},Lr=class extends Gi{sync=!0;[Z](e,t){return super[Z](e,t,()=>{})}[Tr](e){if(!this[Ct]){let n=this[Pe](this.cwd,this.dmode);if(n)return this[T](n,e);this[Ct]=!0}if(e.absolute!==this.cwd){let n=(0,U.normalizeWindowsPath)(g.default.dirname(String(e.absolute)));if(n!==this.cwd){let o=this[Pe](n,this.dmode);if(o)return this[T](o,e)}}let[t,i]=Mt(()=>m.default.lstatSync(String(e.absolute)));if(i&&(this.keep||this.newer&&i.mtime>(e.mtime??i.mtime)))return this[Mr](e);if(t||this[Dr](e,i))return this[Z](null,e);if(i.isDirectory()){if(e.type==="Directory"){let o=this.chmod&&e.mode&&(i.mode&4095)!==e.mode,[h]=o?Mt(()=>{m.default.chmodSync(String(e.absolute),Number(e.mode))}):[];return this[Z](h,e)}let[n]=Mt(()=>m.default.rmdirSync(String(e.absolute)));this[Z](n,e)}let[r]=e.absolute===this.cwd?[]:Mt(()=>nl(String(e.absolute)));this[Z](r,e)}[Pr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.fmode,r=h=>{let a;try{m.default.closeSync(n)}catch(l){a=l}(h||a)&&this[T](h||a,e),t()},n;try{n=m.default.openSync(String(e.absolute),(0,co.getWriteFlag)(e.size),i)}catch(h){return r(h)}let o=this.transform&&this.transform(e)||e;o!==e&&(o.on("error",h=>this[T](h,e)),e.pipe(o)),o.on("data",h=>{try{m.default.writeSync(n,h,0,h.length)}catch(a){r(a)}}),o.on("end",()=>{let h=null;if(e.mtime&&!this.noMtime){let a=e.atime||new Date,l=e.mtime;try{m.default.futimesSync(n,a,l)}catch(u){try{m.default.utimesSync(String(e.absolute),a,l)}catch{h=u}}}if(this[At](e)){let a=this[It](e),l=this[Ft](e);try{m.default.fchownSync(n,Number(a),Number(l))}catch(u){try{m.default.chownSync(String(e.absolute),Number(a),Number(l))}catch{h=h||u}}}r(h)})}[Nr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.dmode,r=this[Pe](String(e.absolute),i);if(r){this[T](r,e),t();return}if(e.mtime&&!this.noMtime)try{m.default.utimesSync(String(e.absolute),e.atime||new Date,e.mtime)}catch{}if(this[At](e))try{m.default.chownSync(String(e.absolute),Number(this[It](e)),Number(this[Ft](e)))}catch{}t(),e.resume()}[Pe](e,t){try{return(0,fo.mkdirSync)((0,U.normalizeWindowsPath)(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:t})}catch(i){return i}}[Lt](e,t,i,r,n){if(this.preservePaths||i.length===0)return r();let o=t;for(let h of i){o=g.default.resolve(o,h);let[a,l]=Mt(()=>m.default.lstatSync(o));if(a)return r();if(l.isSymbolicLink())return n(new mo.SymlinkError(o,g.default.resolve(t,i.join("/"))))}r()}[Zi](e,t,i,r){let n=`${i}Sync`;try{m.default[n](t,String(e.absolute)),r(),e.resume()}catch(o){return this[T](o,e)}}};k.UnpackSync=Lr});var Fr=d(G=>{"use strict";var ol=G&&G.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),al=G&&G.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),hl=G&&G.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r{let e=new Yi.UnpackSync(s),t=s.file,i=_o.default.statSync(t),r=s.maxReadSize||16*1024*1024;new po.ReadStreamSync(t,{readSize:r,size:i.size}).pipe(e)},dl=(s,e)=>{let t=new Yi.Unpack(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,h)=>{t.on("error",h),t.on("close",o),_o.default.stat(r,(a,l)=>{if(a)h(a);else{let u=new po.ReadStream(r,{readSize:i,size:l.size});u.on("error",h),u.pipe(t)}})})};G.extract=(0,cl.makeCommand)(fl,dl,s=>new Yi.UnpackSync(s),s=>new Yi.Unpack(s),(s,e)=>{e?.length&&(0,ul.filesFilter)(s,e)})});var Ki=d(ft=>{"use strict";var wo=ft&&ft.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(ft,"__esModule",{value:!0});ft.replace=void 0;var yo=Ke(),q=wo(require("node:fs")),Eo=wo(require("node:path")),bo=et(),So=rt(),ml=Ve(),pl=Xt(),go=Fi(),_l=(s,e)=>{let t=new go.PackSync(s),i=!0,r,n;try{try{r=q.default.openSync(s.file,"r+")}catch(a){if(a?.code==="ENOENT")r=q.default.openSync(s.file,"w+");else throw a}let o=q.default.fstatSync(r),h=Buffer.alloc(512);e:for(n=0;no.size)break;n+=l,s.mtimeCache&&a.mtime&&s.mtimeCache.set(String(a.path),a.mtime)}i=!1,wl(s,t,n,r,e)}finally{if(i)try{q.default.closeSync(r)}catch{}}},wl=(s,e,t,i,r)=>{let n=new yo.WriteStreamSync(s.file,{fd:i,start:t});e.pipe(n),El(e,r)},yl=(s,e)=>{e=Array.from(e);let t=new go.Pack(s),i=(n,o,h)=>{let a=(D,A)=>{D?q.default.close(n,w=>h(D)):h(null,A)},l=0;if(o===0)return a(null,0);let u=0,c=Buffer.alloc(512),E=(D,A)=>{if(D||A===void 0)return a(D);if(u+=A,u<512&&A)return q.default.read(n,c,u,c.length-u,l+u,E);if(l===0&&c[0]===31&&c[1]===139)return a(new Error("cannot append to compressed archives"));if(u<512)return a(null,l);let w=new bo.Header(c);if(!w.cksumValid)return a(null,l);let P=512*Math.ceil((w.size??0)/512);if(l+P+512>o||(l+=P+512,l>=o))return a(null,l);s.mtimeCache&&w.mtime&&s.mtimeCache.set(String(w.path),w.mtime),u=0,q.default.read(n,c,0,512,l,E)};q.default.read(n,c,0,512,l,E)};return new Promise((n,o)=>{t.on("error",o);let h="r+",a=(l,u)=>{if(l&&l.code==="ENOENT"&&h==="r+")return h="w+",q.default.open(s.file,h,a);if(l||!u)return o(l);q.default.fstat(u,(c,E)=>{if(c)return q.default.close(u,()=>o(c));i(u,E.size,(D,A)=>{if(D)return o(D);let w=new yo.WriteStream(s.file,{fd:u,start:A});t.pipe(w),w.on("error",o),w.on("close",n),bl(t,e)})})};q.default.open(s.file,h,a)})},El=(s,e)=>{e.forEach(t=>{t.charAt(0)==="@"?(0,So.list)({file:Eo.default.resolve(s.cwd,t.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(t)}),s.end()},bl=async(s,e)=>{for(let t of e)t.charAt(0)==="@"?await(0,So.list)({file:Eo.default.resolve(String(s.cwd),t.slice(1)),noResume:!0,onReadEntry:i=>s.add(i)}):s.add(t);s.end()};ft.replace=(0,ml.makeCommand)(_l,yl,()=>{throw new TypeError("file is required")},()=>{throw new TypeError("file is required")},(s,e)=>{if(!(0,pl.isFile)(s))throw new TypeError("file is required");if(s.gzip||s.brotli||s.zstd||s.file.endsWith(".br")||s.file.endsWith(".tbr"))throw new TypeError("cannot append to compressed archives");if(!e?.length)throw new TypeError("no paths specified to add/replace")})});var Cr=d(Vi=>{"use strict";Object.defineProperty(Vi,"__esModule",{value:!0});Vi.update=void 0;var Sl=Ve(),zt=Ki();Vi.update=(0,Sl.makeCommand)(zt.replace.syncFile,zt.replace.asyncFile,zt.replace.syncNoFile,zt.replace.asyncNoFile,(s,e=[])=>{zt.replace.validate?.(s,e),gl(s)});var gl=s=>{let e=s.filter;s.mtimeCache||(s.mtimeCache=new Map),s.filter=e?(t,i)=>e(t,i)&&!((s.mtimeCache?.get(t)??i.mtime??0)>(i.mtime??0)):(t,i)=>!((s.mtimeCache?.get(t)??i.mtime??0)>(i.mtime??0))}});var Oo=exports&&exports.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),Ol=exports&&exports.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),Y=exports&&exports.__exportStar||function(s,e){for(var t in s)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Oo(e,s,t)},Rl=exports&&exports.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r()=>(e||s((e={exports:{}}).exports,e),e.exports);var We=d(F=>{"use strict";var Do=F&&F.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(F,"__esModule",{value:!0});F.Minipass=F.isWritable=F.isReadable=F.isStream=void 0;var kr=typeof process=="object"&&process?process:{stdout:null,stderr:null},ss=require("node:events"),qr=Do(require("node:stream")),Po=require("node:string_decoder"),No=s=>!!s&&typeof s=="object"&&(s instanceof Zt||s instanceof qr.default||(0,F.isReadable)(s)||(0,F.isWritable)(s));F.isStream=No;var Mo=s=>!!s&&typeof s=="object"&&s instanceof ss.EventEmitter&&typeof s.pipe=="function"&&s.pipe!==qr.default.Writable.prototype.pipe;F.isReadable=Mo;var Lo=s=>!!s&&typeof s=="object"&&s instanceof ss.EventEmitter&&typeof s.write=="function"&&typeof s.end=="function";F.isWritable=Lo;var ce=Symbol("EOF"),ue=Symbol("maybeEmitEnd"),we=Symbol("emittedEnd"),jt=Symbol("emittingEnd"),dt=Symbol("emittedError"),Ut=Symbol("closed"),xr=Symbol("read"),qt=Symbol("flush"),jr=Symbol("flushChunk"),K=Symbol("encoding"),Ue=Symbol("decoder"),R=Symbol("flowing"),mt=Symbol("paused"),qe=Symbol("resume"),O=Symbol("buffer"),I=Symbol("pipes"),v=Symbol("bufferLength"),Xi=Symbol("bufferPush"),Wt=Symbol("bufferShift"),N=Symbol("objectMode"),y=Symbol("destroyed"),Qi=Symbol("error"),Ji=Symbol("emitData"),Ur=Symbol("emitEnd"),es=Symbol("emitEnd2"),J=Symbol("async"),ts=Symbol("abort"),Ht=Symbol("aborted"),pt=Symbol("signal"),Ne=Symbol("dataListeners"),x=Symbol("discarded"),_t=s=>Promise.resolve().then(s),Ao=s=>s(),Io=s=>s==="end"||s==="finish"||s==="prefinish",Fo=s=>s instanceof ArrayBuffer||!!s&&typeof s=="object"&&s.constructor&&s.constructor.name==="ArrayBuffer"&&s.byteLength>=0,Co=s=>!Buffer.isBuffer(s)&&ArrayBuffer.isView(s),Gt=class{src;dest;opts;ondrain;constructor(e,t,i){this.src=e,this.dest=t,this.opts=i,this.ondrain=()=>e[qe](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},is=class extends Gt{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,t,i){super(e,t,i),this.proxyErrors=r=>this.dest.emit("error",r),e.on("error",this.proxyErrors)}},Bo=s=>!!s.objectMode,zo=s=>!s.objectMode&&!!s.encoding&&s.encoding!=="buffer",Zt=class extends ss.EventEmitter{[R]=!1;[mt]=!1;[I]=[];[O]=[];[N];[K];[J];[Ue];[ce]=!1;[we]=!1;[jt]=!1;[Ut]=!1;[dt]=null;[v]=0;[y]=!1;[pt];[Ht]=!1;[Ne]=0;[x]=!1;writable=!0;readable=!0;constructor(...e){let t=e[0]||{};if(super(),t.objectMode&&typeof t.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");Bo(t)?(this[N]=!0,this[K]=null):zo(t)?(this[K]=t.encoding,this[N]=!1):(this[N]=!1,this[K]=null),this[J]=!!t.async,this[Ue]=this[K]?new Po.StringDecoder(this[K]):null,t&&t.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[O]}),t&&t.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[I]});let{signal:i}=t;i&&(this[pt]=i,i.aborted?this[ts]():i.addEventListener("abort",()=>this[ts]()))}get bufferLength(){return this[v]}get encoding(){return this[K]}set encoding(e){throw new Error("Encoding must be set at instantiation time")}setEncoding(e){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[N]}set objectMode(e){throw new Error("objectMode must be set at instantiation time")}get async(){return this[J]}set async(e){this[J]=this[J]||!!e}[ts](){this[Ht]=!0,this.emit("abort",this[pt]?.reason),this.destroy(this[pt]?.reason)}get aborted(){return this[Ht]}set aborted(e){}write(e,t,i){if(this[Ht])return!1;if(this[ce])throw new Error("write after end");if(this[y])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof t=="function"&&(i=t,t="utf8"),t||(t="utf8");let r=this[J]?_t:Ao;if(!this[N]&&!Buffer.isBuffer(e)){if(Co(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(Fo(e))e=Buffer.from(e);else if(typeof e!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[N]?(this[R]&&this[v]!==0&&this[qt](!0),this[R]?this.emit("data",e):this[Xi](e),this[v]!==0&&this.emit("readable"),i&&r(i),this[R]):e.length?(typeof e=="string"&&!(t===this[K]&&!this[Ue]?.lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[K]&&(e=this[Ue].write(e)),this[R]&&this[v]!==0&&this[qt](!0),this[R]?this.emit("data",e):this[Xi](e),this[v]!==0&&this.emit("readable"),i&&r(i),this[R]):(this[v]!==0&&this.emit("readable"),i&&r(i),this[R])}read(e){if(this[y])return null;if(this[x]=!1,this[v]===0||e===0||e&&e>this[v])return this[ue](),null;this[N]&&(e=null),this[O].length>1&&!this[N]&&(this[O]=[this[K]?this[O].join(""):Buffer.concat(this[O],this[v])]);let t=this[xr](e||null,this[O][0]);return this[ue](),t}[xr](e,t){if(this[N])this[Wt]();else{let i=t;e===i.length||e===null?this[Wt]():typeof i=="string"?(this[O][0]=i.slice(e),t=i.slice(0,e),this[v]-=e):(this[O][0]=i.subarray(e),t=i.subarray(0,e),this[v]-=e)}return this.emit("data",t),!this[O].length&&!this[ce]&&this.emit("drain"),t}end(e,t,i){return typeof e=="function"&&(i=e,e=void 0),typeof t=="function"&&(i=t,t="utf8"),e!==void 0&&this.write(e,t),i&&this.once("end",i),this[ce]=!0,this.writable=!1,(this[R]||!this[mt])&&this[ue](),this}[qe](){this[y]||(!this[Ne]&&!this[I].length&&(this[x]=!0),this[mt]=!1,this[R]=!0,this.emit("resume"),this[O].length?this[qt]():this[ce]?this[ue]():this.emit("drain"))}resume(){return this[qe]()}pause(){this[R]=!1,this[mt]=!0,this[x]=!1}get destroyed(){return this[y]}get flowing(){return this[R]}get paused(){return this[mt]}[Xi](e){this[N]?this[v]+=1:this[v]+=e.length,this[O].push(e)}[Wt](){return this[N]?this[v]-=1:this[v]-=this[O][0].length,this[O].shift()}[qt](e=!1){do;while(this[jr](this[Wt]())&&this[O].length);!e&&!this[O].length&&!this[ce]&&this.emit("drain")}[jr](e){return this.emit("data",e),this[R]}pipe(e,t){if(this[y])return e;this[x]=!1;let i=this[we];return t=t||{},e===kr.stdout||e===kr.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,i?t.end&&e.end():(this[I].push(t.proxyErrors?new is(this,e,t):new Gt(this,e,t)),this[J]?_t(()=>this[qe]()):this[qe]()),e}unpipe(e){let t=this[I].find(i=>i.dest===e);t&&(this[I].length===1?(this[R]&&this[Ne]===0&&(this[R]=!1),this[I]=[]):this[I].splice(this[I].indexOf(t),1),t.unpipe())}addListener(e,t){return this.on(e,t)}on(e,t){let i=super.on(e,t);if(e==="data")this[x]=!1,this[Ne]++,!this[I].length&&!this[R]&&this[qe]();else if(e==="readable"&&this[v]!==0)super.emit("readable");else if(Io(e)&&this[we])super.emit(e),this.removeAllListeners(e);else if(e==="error"&&this[dt]){let r=t;this[J]?_t(()=>r.call(this,this[dt])):r.call(this,this[dt])}return i}removeListener(e,t){return this.off(e,t)}off(e,t){let i=super.off(e,t);return e==="data"&&(this[Ne]=this.listeners("data").length,this[Ne]===0&&!this[x]&&!this[I].length&&(this[R]=!1)),i}removeAllListeners(e){let t=super.removeAllListeners(e);return(e==="data"||e===void 0)&&(this[Ne]=0,!this[x]&&!this[I].length&&(this[R]=!1)),t}get emittedEnd(){return this[we]}[ue](){!this[jt]&&!this[we]&&!this[y]&&this[O].length===0&&this[ce]&&(this[jt]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[Ut]&&this.emit("close"),this[jt]=!1)}emit(e,...t){let i=t[0];if(e!=="error"&&e!=="close"&&e!==y&&this[y])return!1;if(e==="data")return!this[N]&&!i?!1:this[J]?(_t(()=>this[Ji](i)),!0):this[Ji](i);if(e==="end")return this[Ur]();if(e==="close"){if(this[Ut]=!0,!this[we]&&!this[y])return!1;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(e==="error"){this[dt]=i,super.emit(Qi,i);let n=!this[pt]||this.listeners("error").length?super.emit("error",i):!1;return this[ue](),n}else if(e==="resume"){let n=super.emit("resume");return this[ue](),n}else if(e==="finish"||e==="prefinish"){let n=super.emit(e);return this.removeAllListeners(e),n}let r=super.emit(e,...t);return this[ue](),r}[Ji](e){for(let i of this[I])i.dest.write(e)===!1&&this.pause();let t=this[x]?!1:super.emit("data",e);return this[ue](),t}[Ur](){return this[we]?!1:(this[we]=!0,this.readable=!1,this[J]?(_t(()=>this[es]()),!0):this[es]())}[es](){if(this[Ue]){let t=this[Ue].end();if(t){for(let i of this[I])i.dest.write(t);this[x]||super.emit("data",t)}}for(let t of this[I])t.end();let e=super.emit("end");return this.removeAllListeners("end"),e}async collect(){let e=Object.assign([],{dataLength:0});this[N]||(e.dataLength=0);let t=this.promise();return this.on("data",i=>{e.push(i),this[N]||(e.dataLength+=i.length)}),await t,e}async concat(){if(this[N])throw new Error("cannot concat in objectMode");let e=await this.collect();return this[K]?e.join(""):Buffer.concat(e,e.dataLength)}async promise(){return new Promise((e,t)=>{this.on(y,()=>t(new Error("stream destroyed"))),this.on("error",i=>t(i)),this.on("end",()=>e())})}[Symbol.asyncIterator](){this[x]=!1;let e=!1,t=async()=>(this.pause(),e=!0,{value:void 0,done:!0});return{next:()=>{if(e)return t();let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[ce])return t();let n,o,a=u=>{this.off("data",h),this.off("end",l),this.off(y,c),t(),o(u)},h=u=>{this.off("error",a),this.off("end",l),this.off(y,c),this.pause(),n({value:u,done:!!this[ce]})},l=()=>{this.off("error",a),this.off("data",h),this.off(y,c),t(),n({done:!0,value:void 0})},c=()=>a(new Error("stream destroyed"));return new Promise((u,E)=>{o=E,n=u,this.once(y,c),this.once("error",a),this.once("end",l),this.once("data",h)})},throw:t,return:t,[Symbol.asyncIterator](){return this},[Symbol.asyncDispose]:async()=>{}}}[Symbol.iterator](){this[x]=!1;let e=!1,t=()=>(this.pause(),this.off(Qi,t),this.off(y,t),this.off("end",t),e=!0,{done:!0,value:void 0}),i=()=>{if(e)return t();let r=this.read();return r===null?t():{done:!1,value:r}};return this.once("end",t),this.once(Qi,t),this.once(y,t),{next:i,throw:t,return:t,[Symbol.iterator](){return this},[Symbol.dispose]:()=>{}}}destroy(e){if(this[y])return e?this.emit("error",e):this.emit(y),this;this[y]=!0,this[x]=!0,this[O].length=0,this[v]=0;let t=this;return typeof t.close=="function"&&!this[Ut]&&t.close(),e?this.emit("error",e):this.emit(y),this}static get isStream(){return F.isStream}};F.Minipass=Zt});var Ke=d(W=>{"use strict";var Wr=W&&W.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(W,"__esModule",{value:!0});W.WriteStreamSync=W.WriteStream=W.ReadStreamSync=W.ReadStream=void 0;var ko=Wr(require("events")),z=Wr(require("fs")),xo=We(),jo=z.default.writev,Ee=Symbol("_autoClose"),$=Symbol("_close"),wt=Symbol("_ended"),p=Symbol("_fd"),rs=Symbol("_finished"),de=Symbol("_flags"),ns=Symbol("_flush"),ls=Symbol("_handleChunk"),cs=Symbol("_makeBuf"),Et=Symbol("_mode"),Yt=Symbol("_needDrain"),Ze=Symbol("_onerror"),Ye=Symbol("_onopen"),os=Symbol("_onread"),He=Symbol("_onwrite"),be=Symbol("_open"),V=Symbol("_path"),ye=Symbol("_pos"),ee=Symbol("_queue"),Ge=Symbol("_read"),as=Symbol("_readSize"),fe=Symbol("_reading"),yt=Symbol("_remain"),hs=Symbol("_size"),Kt=Symbol("_write"),Me=Symbol("_writing"),Vt=Symbol("_defaultFlag"),Le=Symbol("_errored"),$t=class extends xo.Minipass{[Le]=!1;[p];[V];[as];[fe]=!1;[hs];[yt];[Ee];constructor(e,t){if(t=t||{},super(t),this.readable=!0,this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[Le]=!1,this[p]=typeof t.fd=="number"?t.fd:void 0,this[V]=e,this[as]=t.readSize||16*1024*1024,this[fe]=!1,this[hs]=typeof t.size=="number"?t.size:1/0,this[yt]=this[hs],this[Ee]=typeof t.autoClose=="boolean"?t.autoClose:!0,typeof this[p]=="number"?this[Ge]():this[be]()}get fd(){return this[p]}get path(){return this[V]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[be](){z.default.open(this[V],"r",(e,t)=>this[Ye](e,t))}[Ye](e,t){e?this[Ze](e):(this[p]=t,this.emit("open",t),this[Ge]())}[cs](){return Buffer.allocUnsafe(Math.min(this[as],this[yt]))}[Ge](){if(!this[fe]){this[fe]=!0;let e=this[cs]();if(e.length===0)return process.nextTick(()=>this[os](null,0,e));z.default.read(this[p],e,0,e.length,null,(t,i,r)=>this[os](t,i,r))}}[os](e,t,i){this[fe]=!1,e?this[Ze](e):this[ls](t,i)&&this[Ge]()}[$](){if(this[Ee]&&typeof this[p]=="number"){let e=this[p];this[p]=void 0,z.default.close(e,t=>t?this.emit("error",t):this.emit("close"))}}[Ze](e){this[fe]=!0,this[$](),this.emit("error",e)}[ls](e,t){let i=!1;return this[yt]-=e,e>0&&(i=super.write(ethis[Ye](e,t))}[Ye](e,t){this[Vt]&&this[de]==="r+"&&e&&e.code==="ENOENT"?(this[de]="w",this[be]()):e?this[Ze](e):(this[p]=t,this.emit("open",t),this[Me]||this[ns]())}end(e,t){return e&&this.write(e,t),this[wt]=!0,!this[Me]&&!this[ee].length&&typeof this[p]=="number"&&this[He](null,0),this}write(e,t){return typeof e=="string"&&(e=Buffer.from(e,t)),this[wt]?(this.emit("error",new Error("write() after end()")),!1):this[p]===void 0||this[Me]||this[ee].length?(this[ee].push(e),this[Yt]=!0,!1):(this[Me]=!0,this[Kt](e),!0)}[Kt](e){z.default.write(this[p],e,0,e.length,this[ye],(t,i)=>this[He](t,i))}[He](e,t){e?this[Ze](e):(this[ye]!==void 0&&typeof t=="number"&&(this[ye]+=t),this[ee].length?this[ns]():(this[Me]=!1,this[wt]&&!this[rs]?(this[rs]=!0,this[$](),this.emit("finish")):this[Yt]&&(this[Yt]=!1,this.emit("drain"))))}[ns](){if(this[ee].length===0)this[wt]&&this[He](null,0);else if(this[ee].length===1)this[Kt](this[ee].pop());else{let e=this[ee];this[ee]=[],jo(this[p],e,this[ye],(t,i)=>this[He](t,i))}}[$](){if(this[Ee]&&typeof this[p]=="number"){let e=this[p];this[p]=void 0,z.default.close(e,t=>t?this.emit("error",t):this.emit("close"))}}};W.WriteStream=Xt;var fs=class extends Xt{[be](){let e;if(this[Vt]&&this[de]==="r+")try{e=z.default.openSync(this[V],this[de],this[Et])}catch(t){if(t?.code==="ENOENT")return this[de]="w",this[be]();throw t}else e=z.default.openSync(this[V],this[de],this[Et]);this[Ye](null,e)}[$](){if(this[Ee]&&typeof this[p]=="number"){let e=this[p];this[p]=void 0,z.default.closeSync(e),this.emit("close")}}[Kt](e){let t=!0;try{this[He](null,z.default.writeSync(this[p],e,0,e.length,this[ye])),t=!1}finally{if(t)try{this[$]()}catch{}}}};W.WriteStreamSync=fs});var Qt=d(b=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});b.dealias=b.isNoFile=b.isFile=b.isAsync=b.isSync=b.isAsyncNoFile=b.isSyncNoFile=b.isAsyncFile=b.isSyncFile=void 0;var Uo=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"],["onentry","onReadEntry"]]),qo=s=>!!s.sync&&!!s.file;b.isSyncFile=qo;var Wo=s=>!s.sync&&!!s.file;b.isAsyncFile=Wo;var Ho=s=>!!s.sync&&!s.file;b.isSyncNoFile=Ho;var Go=s=>!s.sync&&!s.file;b.isAsyncNoFile=Go;var Zo=s=>!!s.sync;b.isSync=Zo;var Yo=s=>!s.sync;b.isAsync=Yo;var Ko=s=>!!s.file;b.isFile=Ko;var Vo=s=>!s.file;b.isNoFile=Vo;var $o=s=>{let e=Uo.get(s);return e||s},Xo=(s={})=>{if(!s)return{};let e={};for(let[t,i]of Object.entries(s)){let r=$o(t);e[r]=i}return e.chmod===void 0&&e.noChmod===!1&&(e.chmod=!0),delete e.noChmod,e};b.dealias=Xo});var Ve=d(Jt=>{"use strict";Object.defineProperty(Jt,"__esModule",{value:!0});Jt.makeCommand=void 0;var bt=Qt(),Qo=(s,e,t,i,r)=>Object.assign((n=[],o,a)=>{Array.isArray(n)&&(o=n,n={}),typeof o=="function"&&(a=o,o=void 0),o=o?Array.from(o):[];let h=(0,bt.dealias)(n);if(r?.(h,o),(0,bt.isSyncFile)(h)){if(typeof a=="function")throw new TypeError("callback not supported for sync tar functions");return s(h,o)}else if((0,bt.isAsyncFile)(h)){let l=e(h,o);return a?l.then(()=>a(),a):l}else if((0,bt.isSyncNoFile)(h)){if(typeof a=="function")throw new TypeError("callback not supported for sync tar functions");return t(h,o)}else if((0,bt.isAsyncNoFile)(h)){if(typeof a=="function")throw new TypeError("callback only supported with file option");return i(h,o)}throw new Error("impossible options??")},{syncFile:s,asyncFile:e,syncNoFile:t,asyncNoFile:i,validate:r});Jt.makeCommand=Qo});var ds=d($e=>{"use strict";var Jo=$e&&$e.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty($e,"__esModule",{value:!0});$e.constants=void 0;var ea=Jo(require("zlib")),ta=ea.default.constants||{ZLIB_VERNUM:4736};$e.constants=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},ta))});var Ps=d(f=>{"use strict";var ia=f&&f.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),sa=f&&f.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),ra=f&&f.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;rs,ms=Gr?.writable===!0||Gr?.set!==void 0?s=>{Ae.Buffer.concat=s?la:ha}:s=>{},Ie=Symbol("_superWrite"),Fe=class extends Error{code;errno;constructor(e,t){super("zlib: "+e.message,{cause:e}),this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,t??this.constructor)}get name(){return"ZlibError"}};f.ZlibError=Fe;var ps=Symbol("flushFlag"),St=class extends oa.Minipass{#e=!1;#i=!1;#s;#n;#r;#t;#o;get sawError(){return this.#e}get handle(){return this.#t}get flushFlag(){return this.#s}constructor(e,t){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");if(super(e),this.#s=e.flush??0,this.#n=e.finishFlush??0,this.#r=e.fullFlushFlag??0,typeof Hr[t]!="function")throw new TypeError("Compression method not supported: "+t);try{this.#t=new Hr[t](e)}catch(i){throw new Fe(i,this.constructor)}this.#o=i=>{this.#e||(this.#e=!0,this.close(),this.emit("error",i))},this.#t?.on("error",i=>this.#o(new Fe(i))),this.once("end",()=>this.close)}close(){this.#t&&(this.#t.close(),this.#t=void 0,this.emit("close"))}reset(){if(!this.#e)return(0,_s.default)(this.#t,"zlib binding closed"),this.#t.reset?.()}flush(e){this.ended||(typeof e!="number"&&(e=this.#r),this.write(Object.assign(Ae.Buffer.alloc(0),{[ps]:e})))}end(e,t,i){return typeof e=="function"&&(i=e,t=void 0,e=void 0),typeof t=="function"&&(i=t,t=void 0),e&&(t?this.write(e,t):this.write(e)),this.flush(this.#n),this.#i=!0,super.end(i)}get ended(){return this.#i}[Ie](e){return super.write(e)}write(e,t,i){if(typeof t=="function"&&(i=t,t="utf8"),typeof e=="string"&&(e=Ae.Buffer.from(e,t)),this.#e)return;(0,_s.default)(this.#t,"zlib binding closed");let r=this.#t._handle,n=r.close;r.close=()=>{};let o=this.#t.close;this.#t.close=()=>{},ms(!0);let a;try{let l=typeof e[ps]=="number"?e[ps]:this.#s;a=this.#t._processChunk(e,l),ms(!1)}catch(l){ms(!1),this.#o(new Fe(l,this.write))}finally{this.#t&&(this.#t._handle=r,r.close=n,this.#t.close=o,this.#t.removeAllListeners("error"))}this.#t&&this.#t.on("error",l=>this.#o(new Fe(l,this.write)));let h;if(a)if(Array.isArray(a)&&a.length>0){let l=a[0];h=this[Ie](Ae.Buffer.from(l));for(let c=1;c{typeof r=="function"&&(n=r,r=this.flushFlag),this.flush(r),n?.()};try{this.handle.params(e,t)}finally{this.handle.flush=i}this.handle&&(this.#e=e,this.#i=t)}}}};f.Zlib=ie;var ws=class extends ie{constructor(e){super(e,"Deflate")}};f.Deflate=ws;var ys=class extends ie{constructor(e){super(e,"Inflate")}};f.Inflate=ys;var Es=class extends ie{#e;constructor(e){super(e,"Gzip"),this.#e=e&&!!e.portable}[Ie](e){return this.#e?(this.#e=!1,e[9]=255,super[Ie](e)):super[Ie](e)}};f.Gzip=Es;var bs=class extends ie{constructor(e){super(e,"Gunzip")}};f.Gunzip=bs;var Ss=class extends ie{constructor(e){super(e,"DeflateRaw")}};f.DeflateRaw=Ss;var gs=class extends ie{constructor(e){super(e,"InflateRaw")}};f.InflateRaw=gs;var Rs=class extends ie{constructor(e){super(e,"Unzip")}};f.Unzip=Rs;var ei=class extends St{constructor(e,t){e=e||{},e.flush=e.flush||te.constants.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||te.constants.BROTLI_OPERATION_FINISH,e.fullFlushFlag=te.constants.BROTLI_OPERATION_FLUSH,super(e,t)}},Os=class extends ei{constructor(e){super(e,"BrotliCompress")}};f.BrotliCompress=Os;var vs=class extends ei{constructor(e){super(e,"BrotliDecompress")}};f.BrotliDecompress=vs;var ti=class extends St{constructor(e,t){e=e||{},e.flush=e.flush||te.constants.ZSTD_e_continue,e.finishFlush=e.finishFlush||te.constants.ZSTD_e_end,e.fullFlushFlag=te.constants.ZSTD_e_flush,super(e,t)}},Ts=class extends ti{constructor(e){super(e,"ZstdCompress")}};f.ZstdCompress=Ts;var Ds=class extends ti{constructor(e){super(e,"ZstdDecompress")}};f.ZstdDecompress=Ds});var Kr=d(Xe=>{"use strict";Object.defineProperty(Xe,"__esModule",{value:!0});Xe.parse=Xe.encode=void 0;var ca=(s,e)=>{if(Number.isSafeInteger(s))s<0?fa(s,e):ua(s,e);else throw Error("cannot encode number outside of javascript safe integer range");return e};Xe.encode=ca;var ua=(s,e)=>{e[0]=128;for(var t=e.length;t>1;t--)e[t-1]=s&255,s=Math.floor(s/256)},fa=(s,e)=>{e[0]=255;var t=!1;s=s*-1;for(var i=e.length;i>1;i--){var r=s&255;s=Math.floor(s/256),t?e[i-1]=Zr(r):r===0?e[i-1]=0:(t=!0,e[i-1]=Yr(r))}},da=s=>{let e=s[0],t=e===128?pa(s.subarray(1,s.length)):e===255?ma(s):null;if(t===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(t))throw Error("parsed number outside of javascript safe integer range");return t};Xe.parse=da;var ma=s=>{for(var e=s.length,t=0,i=!1,r=e-1;r>-1;r--){var n=Number(s[r]),o;i?o=Zr(n):n===0?o=n:(i=!0,o=Yr(n)),o!==0&&(t-=o*Math.pow(256,e-r-1))}return t},pa=s=>{for(var e=s.length,t=0,i=e-1;i>-1;i--){var r=Number(s[i]);r!==0&&(t+=r*Math.pow(256,e-i-1))}return t},Zr=s=>(255^s)&255,Yr=s=>(255^s)+1&255});var Ns=d(C=>{"use strict";Object.defineProperty(C,"__esModule",{value:!0});C.code=C.name=C.normalFsTypes=C.isName=C.isCode=void 0;var _a=s=>C.name.has(s);C.isCode=_a;var wa=s=>C.code.has(s);C.isName=wa;C.normalFsTypes=new Set(["0","","1","2","3","4","5","6","7","D"]);C.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);C.code=new Map(Array.from(C.name).map(s=>[s[1],s[0]]))});var et=d(se=>{"use strict";var ya=se&&se.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),Ea=se&&se.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),Vr=se&&se.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;rs===void 0||s<0?void 0:s,As=class{cksumValid=!1;needPax=!1;nullBlock=!1;block;path;mode;uid;gid;size;cksum;#e="Unsupported";linkpath;uname;gname;devmaj=0;devmin=0;atime;ctime;mtime;charset;comment;constructor(e,t=0,i,r){Buffer.isBuffer(e)?this.decode(e,t||0,i,r):e&&this.#i(e)}decode(e,t,i,r){if(t||(t=0),!e||!(e.length>=t+512))throw new Error("need 512 bytes for header");let n=Ce(e,t+156,1),o=Je.normalFsTypes.has(n),a=o?i:void 0,h=o?r:void 0;if(this.path=a?.path??Ce(e,t,100),this.mode=a?.mode??h?.mode??Se(e,t+100,8),this.uid=a?.uid??h?.uid??Se(e,t+108,8),this.gid=a?.gid??h?.gid??Se(e,t+116,8),this.size=ba(a?.size??h?.size??Se(e,t+124,12)),this.mtime=a?.mtime??h?.mtime??Ms(e,t+136,12),this.cksum=Se(e,t+148,12),h&&this.#i(h,!0),a&&this.#i(a),Je.isCode(n)&&(this.#e=n||"0"),this.#e==="0"&&this.path.slice(-1)==="/"&&(this.#e="5"),this.#e==="5"&&(this.size=0),this.linkpath=Ce(e,t+157,100),e.subarray(t+257,t+265).toString()==="ustar\x0000")if(this.uname=a?.uname??h?.uname??Ce(e,t+265,32),this.gname=a?.gname??h?.gname??Ce(e,t+297,32),this.devmaj=a?.devmaj??h?.devmaj??Se(e,t+329,8)??0,this.devmin=a?.devmin??h?.devmin??Se(e,t+337,8)??0,e[t+475]!==0){let c=Ce(e,t+345,155);this.path=c+"/"+this.path}else{let c=Ce(e,t+345,130);c&&(this.path=c+"/"+this.path),this.atime=i?.atime??r?.atime??Ms(e,t+476,12),this.ctime=i?.ctime??r?.ctime??Ms(e,t+488,12)}let l=256;for(let c=t;c!(r==null||i==="size"&&Number(r)<0||i==="path"&&t||i==="linkpath"&&t||i==="global"))))}encode(e,t=0){if(e||(e=this.block=Buffer.alloc(512)),this.#e==="Unsupported"&&(this.#e="0"),!(e.length>=t+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,r=Sa(this.path||"",i),n=r[0],o=r[1];this.needPax=!!r[2],this.needPax=Be(e,t,100,n)||this.needPax,this.needPax=ge(e,t+100,8,this.mode)||this.needPax,this.needPax=ge(e,t+108,8,this.uid)||this.needPax,this.needPax=ge(e,t+116,8,this.gid)||this.needPax,this.needPax=ge(e,t+124,12,this.size)||this.needPax,this.needPax=Ls(e,t+136,12,this.mtime)||this.needPax,e[t+156]=Number(this.#e.codePointAt(0)),this.needPax=Be(e,t+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",t+257,8),this.needPax=Be(e,t+265,32,this.uname)||this.needPax,this.needPax=Be(e,t+297,32,this.gname)||this.needPax,this.needPax=ge(e,t+329,8,this.devmaj)||this.needPax,this.needPax=ge(e,t+337,8,this.devmin)||this.needPax,this.needPax=Be(e,t+345,i,o)||this.needPax,e[t+475]!==0?this.needPax=Be(e,t+345,155,o)||this.needPax:(this.needPax=Be(e,t+345,130,o)||this.needPax,this.needPax=Ls(e,t+476,12,this.atime)||this.needPax,this.needPax=Ls(e,t+488,12,this.ctime)||this.needPax);let a=256;for(let h=t;h{let i=s,r="",n,o=Qe.posix.parse(s).root||".";if(Buffer.byteLength(i)<100)n=[i,r,!1];else{r=Qe.posix.dirname(i),i=Qe.posix.basename(i);do Buffer.byteLength(i)<=100&&Buffer.byteLength(r)<=e?n=[i,r,!1]:Buffer.byteLength(i)>100&&Buffer.byteLength(r)<=e?n=[i.slice(0,99),r,!0]:(i=Qe.posix.join(Qe.posix.basename(r),i),r=Qe.posix.dirname(r));while(r!==o&&n===void 0);n||(n=[s.slice(0,99),"",!0])}return n},Ce=(s,e,t)=>s.subarray(e,e+t).toString("utf8").replace(/\0.*/,""),Ms=(s,e,t)=>ga(Se(s,e,t)),ga=s=>s===void 0?void 0:new Date(s*1e3),Se=(s,e,t)=>Number(s[e])&128?$r.parse(s.subarray(e,e+t)):Oa(s,e,t),Ra=s=>isNaN(s)?void 0:s,Oa=(s,e,t)=>Ra(parseInt(s.subarray(e,e+t).toString("utf8").replace(/\0.*$/,"").trim(),8)),va={12:8589934591,8:2097151},ge=(s,e,t,i)=>i===void 0?!1:i>va[t]||i<0?($r.encode(i,s.subarray(e,e+t)),!0):(Ta(s,e,t,i),!1),Ta=(s,e,t,i)=>s.write(Da(i,t),e,t,"ascii"),Da=(s,e)=>Pa(Math.floor(s).toString(8),e),Pa=(s,e)=>(s.length===e-1?s:new Array(e-s.length-1).join("0")+s+" ")+"\0",Ls=(s,e,t,i)=>i===void 0?!1:ge(s,e,t,i.getTime()/1e3),Na=new Array(156).join("\0"),Be=(s,e,t,i)=>i===void 0?!1:(s.write(i+Na,e,t,"utf8"),i.length!==Buffer.byteLength(i)||i.length>t)});var si=d(ii=>{"use strict";Object.defineProperty(ii,"__esModule",{value:!0});ii.Pax=void 0;var Ma=require("node:path"),La=et(),Is=class s{atime;mtime;ctime;charset;comment;gid;uid;gname;uname;linkpath;dev;ino;nlink;path;size;mode;global;constructor(e,t=!1){this.atime=e.atime,this.charset=e.charset,this.comment=e.comment,this.ctime=e.ctime,this.dev=e.dev,this.gid=e.gid,this.global=t,this.gname=e.gname,this.ino=e.ino,this.linkpath=e.linkpath,this.mtime=e.mtime,this.nlink=e.nlink,this.path=e.path,this.size=e.size,this.uid=e.uid,this.uname=e.uname}encode(){let e=this.encodeBody();if(e==="")return Buffer.allocUnsafe(0);let t=Buffer.byteLength(e),i=512*Math.ceil(1+t/512),r=Buffer.allocUnsafe(i);for(let n=0;n<512;n++)r[n]=0;new La.Header({path:("PaxHeader/"+(0,Ma.basename)(this.path??"")).slice(0,99),mode:this.mode||420,uid:this.uid,gid:this.gid,size:t,mtime:this.mtime,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime,ctime:this.ctime}).encode(r),r.write(e,512,t,"utf8");for(let n=t+512;n=Math.pow(10,o)&&(o+=1),o+n+r}static parse(e,t,i=!1){return new s(Aa(Ia(e),t),i)}};ii.Pax=Is;var Aa=(s,e)=>e?Object.assign({},e,s):s,Ia=s=>s.replace(/\n$/,"").split(` +`).reduce(Fa,Object.create(null)),Fa=(s,e)=>{let t=parseInt(e,10);if(t!==Buffer.byteLength(e)+1)return s;e=e.slice((t+" ").length);let i=e.split("="),r=i.shift();if(!r)return s;let n=r.replace(/^SCHILY\.(dev|ino|nlink)/,"$1"),o=i.join("=").replace(/\0.*/,"");switch(n){case"path":case"linkpath":case"type":case"charset":case"comment":case"gname":case"uname":s[n]=o;break;case"ctime":case"atime":case"mtime":s[n]=new Date(Number(o)*1e3);break;case"size":let a=+o;a>=0&&(s[n]=a);break;case"gid":case"uid":case"dev":case"ino":case"nlink":case"mode":s[n]=+o;break}return s}});var tt=d(ri=>{"use strict";Object.defineProperty(ri,"__esModule",{value:!0});ri.normalizeWindowsPath=void 0;var Ca=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;ri.normalizeWindowsPath=Ca!=="win32"?s=>String(s):s=>String(s).replaceAll(/\\/g,"/")});var Cs=d(oi=>{"use strict";Object.defineProperty(oi,"__esModule",{value:!0});oi.ReadEntry=void 0;var Ba=We(),ni=tt(),Fs=class extends Ba.Minipass{extended;globalExtended;header;startBlockSize;blockRemain;remain;type;meta=!1;ignore=!1;path;mode;uid;gid;uname;gname;size=0;mtime;atime;ctime;linkpath;dev;ino;nlink;invalid=!1;absolute;unsupported=!1;constructor(e,t,i){switch(super({}),this.pause(),this.extended=t,this.globalExtended=i,this.header=e,this.remain=e.size??0,this.startBlockSize=512*Math.ceil(this.remain/512),this.blockRemain=this.startBlockSize,this.type=e.type,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}if(!e.path)throw new Error("no path provided for tar.ReadEntry");this.path=(0,ni.normalizeWindowsPath)(e.path),this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=this.remain,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=e.linkpath?(0,ni.normalizeWindowsPath)(e.linkpath):void 0,this.uname=e.uname,this.gname=e.gname,t&&this.#e(t),i&&this.#e(i,!0)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,r=this.blockRemain;return this.remain=Math.max(0,i-t),this.blockRemain=Math.max(0,r-t),this.ignore?!0:i>=t?super.write(e):super.write(e.subarray(0,i))}#e(e,t=!1){e.path&&(e.path=(0,ni.normalizeWindowsPath)(e.path)),e.linkpath&&(e.linkpath=(0,ni.normalizeWindowsPath)(e.linkpath)),Object.assign(this,Object.fromEntries(Object.entries(e).filter(([i,r])=>!(r==null||i==="path"&&t))))}};oi.ReadEntry=Fs});var hi=d(ai=>{"use strict";Object.defineProperty(ai,"__esModule",{value:!0});ai.warnMethod=void 0;var za=(s,e,t,i={})=>{s.file&&(i.file=s.file),s.cwd&&(i.cwd=s.cwd),i.code=t instanceof Error&&t.code||e,i.tarCode=e,!s.strict&&i.recoverable!==!1?(t instanceof Error&&(i=Object.assign(t,i),t=t.message),s.emit("warn",e,t,i)):t instanceof Error?s.emit("error",Object.assign(t,i)):s.emit("error",Object.assign(new Error(`${e}: ${t}`),i))};ai.warnMethod=za});var _i=d(pi=>{"use strict";Object.defineProperty(pi,"__esModule",{value:!0});pi.Parser=void 0;var ka=require("events"),Bs=Ps(),Xr=et(),Qr=si(),xa=Cs(),ja=hi(),Ua=1024*1024,qs=Buffer.from([31,139]),Ws=Buffer.from([40,181,47,253]),qa=Math.max(qs.length,Ws.length),H=Symbol("state"),ze=Symbol("writeEntry"),me=Symbol("readEntry"),zs=Symbol("nextEntry"),Jr=Symbol("processEntry"),re=Symbol("extendedHeader"),gt=Symbol("globalExtendedHeader"),Re=Symbol("meta"),en=Symbol("emitMeta"),_=Symbol("buffer"),pe=Symbol("queue"),Oe=Symbol("ended"),ks=Symbol("emittedEnd"),ke=Symbol("emit"),S=Symbol("unzip"),li=Symbol("consumeChunk"),ci=Symbol("consumeChunkSub"),xs=Symbol("consumeBody"),tn=Symbol("consumeMeta"),sn=Symbol("consumeHeader"),Rt=Symbol("consuming"),js=Symbol("bufferConcat"),ui=Symbol("maybeEnd"),it=Symbol("writing"),ne=Symbol("aborted"),fi=Symbol("onDone"),xe=Symbol("sawValidEntry"),di=Symbol("sawNullBlock"),mi=Symbol("sawEOF"),rn=Symbol("closeStream"),Wa=1e3,Ot=Symbol("compressedBytesRead"),Us=Symbol("decompressedBytesRead"),nn=Symbol("checkDecompressionRatio"),Ha=()=>!0,Hs=class extends ka.EventEmitter{file;strict;maxMetaEntrySize;filter;brotli;zstd;maxDecompressionRatio;writable=!0;readable=!1;[pe]=[];[_];[me];[ze];[H]="begin";[Re]="";[re];[gt];[Oe]=!1;[S];[ne]=!1;[xe];[di]=!1;[mi]=!1;[it]=!1;[Rt]=!1;[ks]=!1;[Ot]=0;[Us]=0;constructor(e={}){super(),this.file=e.file||"",this.on(fi,()=>{(this[H]==="begin"||this[xe]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(fi,e.ondone):this.on(fi,()=>{this.emit("prefinish"),this.emit("finish"),this.emit("end")}),this.strict=!!e.strict,this.maxDecompressionRatio=typeof e.maxDecompressionRatio=="number"?e.maxDecompressionRatio:Wa,this.maxMetaEntrySize=e.maxMetaEntrySize||Ua,this.filter=typeof e.filter=="function"?e.filter:Ha;let t=e.file&&(e.file.endsWith(".tar.br")||e.file.endsWith(".tbr"));this.brotli=!(e.gzip||e.zstd)&&e.brotli!==void 0?e.brotli:t?void 0:!1;let i=e.file&&(e.file.endsWith(".tar.zst")||e.file.endsWith(".tzst"));this.zstd=!(e.gzip||e.brotli)&&e.zstd!==void 0?e.zstd:i?!0:void 0,this.on("end",()=>this[rn]()),typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onReadEntry=="function"&&this.on("entry",e.onReadEntry)}warn(e,t,i={}){(0,ja.warnMethod)(this,e,t,i)}[sn](e,t){this[xe]===void 0&&(this[xe]=!1);let i;try{i=new Xr.Header(e,t,this[re],this[gt])}catch(r){return this.warn("TAR_ENTRY_INVALID",r)}if(i.nullBlock)this[di]?(this[mi]=!0,this[H]==="begin"&&(this[H]="header"),this[ke]("eof")):(this[di]=!0,this[ke]("nullBlock"));else if(this[di]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let r=i.type;if(/^(Symbolic)?Link$/.test(r)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(r)&&!/^(Global)?ExtendedHeader$/.test(r)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let n=this[ze]=new xa.ReadEntry(i,this[re],this[gt]);if(!this[xe])if(n.remain){let o=()=>{n.invalid||(this[xe]=!0)};n.on("end",o)}else this[xe]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[ke]("ignoredEntry",n),this[H]="ignore",n.resume()):n.size>0&&(this[Re]="",n.on("data",o=>this[Re]+=o),this[H]="meta"):(this[re]=void 0,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[ke]("ignoredEntry",n),this[H]=n.remain?"ignore":"header",n.resume()):(n.remain?this[H]="body":(this[H]="header",n.end()),this[me]?this[pe].push(n):(this[pe].push(n),this[zs]())))}}}[rn](){queueMicrotask(()=>this.emit("close"))}[Jr](e){let t=!0;if(!e)this[me]=void 0,t=!1;else if(Array.isArray(e)){let[i,...r]=e;this.emit(i,...r)}else this[me]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",()=>this[zs]()),t=!1);return t}[zs](){do;while(this[Jr](this[pe].shift()));if(this[pe].length===0){let e=this[me];!e||e.flowing||e.size===e.remain?this[it]||this.emit("drain"):e.once("drain",()=>this.emit("drain"))}}[xs](e,t){let i=this[ze];if(!i)throw new Error("attempt to consume body without entry??");let r=i.blockRemain??0,n=r>=e.length&&t===0?e:e.subarray(t,t+r);return i.write(n),i.blockRemain||(this[H]="header",this[ze]=void 0,i.end()),n.length}[tn](e,t){let i=this[ze],r=this[xs](e,t);return!this[ze]&&i&&this[en](i),r}[ke](e,t,i){this[pe].length===0&&!this[me]?this.emit(e,t,i):this[pe].push([e,t,i])}[en](e){switch(this[ke]("meta",this[Re]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[re]=Qr.Pax.parse(this[Re],this[re],!1);break;case"GlobalExtendedHeader":this[gt]=Qr.Pax.parse(this[Re],this[gt],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":{let t=this[re]??Object.create(null);this[re]=t,t.path=this[Re].replace(/\0.*/,"");break}case"NextFileHasLongLinkpath":{let t=this[re]||Object.create(null);this[re]=t,t.linkpath=this[Re].replace(/\0.*/,"");break}default:throw new Error("unknown meta: "+e.type)}}abort(e){this[ne]||(this[ne]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1}))}[nn](e){this[Us]+=e.length;let t=this[Us]/this[Ot];return t>this.maxDecompressionRatio?(this.abort(new Error(`max decompression ratio exceeded: ${t.toFixed(2)} > ${this.maxDecompressionRatio}`)),!1):!0}write(e,t,i){if(typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8")),this[ne])return i?.(),!1;if((this[S]===void 0||this.brotli===void 0&&this[S]===!1)&&e){if(this[_]&&(e=Buffer.concat([this[_],e]),this[_]=void 0),e.length{this[nn](c)&&this[li](c)}),this[S].on("error",c=>{this[ne]||this.abort(c)}),this[S].on("end",()=>{this[Oe]=!0,this[li]()}),this[it]=!0,this[Ot]+=e.length;let l=!!this[S][h?"end":"write"](e);return this[it]=!1,i?.(),l}}this[it]=!0,this[S]?(this[Ot]+=e.length,this[S].write(e)):this[li](e),this[it]=!1;let n=this[pe].length>0?!1:this[me]?this[me].flowing:!0;return!n&&this[pe].length===0&&this[me]?.once("drain",()=>this.emit("drain")),i?.(),n}[js](e){e&&!this[ne]&&(this[_]=this[_]?Buffer.concat([this[_],e]):e)}[ui](){if(this[Oe]&&!this[ks]&&!this[ne]&&!this[Rt]){this[ks]=!0;let e=this[ze];if(e?.blockRemain){let t=this[_]?this[_].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${t} available)`,{entry:e}),this[_]&&e.write(this[_]),e.end()}this[ke](fi)}}[li](e){if(this[Rt]&&e)this[js](e);else if(!e&&!this[_])this[ui]();else if(e){if(this[Rt]=!0,this[_]){this[js](e);let t=this[_];this[_]=void 0,this[ci](t)}else this[ci](e);for(;this[_]&&this[_]?.length>=512&&!this[ne]&&!this[mi];){let t=this[_];this[_]=void 0,this[ci](t)}this[Rt]=!1}(!this[_]||this[Oe])&&this[ui]()}[ci](e){let t=0,i=e.length;for(;t+512<=i&&!this[ne]&&!this[mi];)switch(this[H]){case"begin":case"header":this[sn](e,t),t+=512;break;case"ignore":case"body":t+=this[xs](e,t);break;case"meta":t+=this[tn](e,t);break;default:throw new Error("invalid state: "+this[H])}t{"use strict";Object.defineProperty(wi,"__esModule",{value:!0});wi.stripTrailingSlashes=void 0;var Ga=s=>{let e=s.length-1,t=-1;for(;e>-1&&s.charAt(e)==="/";)t=e,e--;return t===-1?s:s.slice(0,t)};wi.stripTrailingSlashes=Ga});var rt=d(B=>{"use strict";var Za=B&&B.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),Ya=B&&B.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),Ka=B&&B.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r{let e=s.onReadEntry;s.onReadEntry=e?t=>{e(t),t.resume()}:t=>t.resume()},Ja=(s,e)=>{let t=new Map(e.map(n=>[(0,Gs.stripTrailingSlashes)(n),!0])),i=s.filter,r=(n,o="")=>{let a=o||(0,on.parse)(n).root||".",h;if(n===a)h=!1;else{let l=t.get(n);h=l!==void 0?l:r((0,on.dirname)(n),a)}return t.set(n,h),h};s.filter=i?(n,o)=>i(n,o)&&r((0,Gs.stripTrailingSlashes)(n)):n=>r((0,Gs.stripTrailingSlashes)(n))};B.filesFilter=Ja;var eh=s=>{let e=new Ei.Parser(s),t=s.file,i;try{i=st.default.openSync(t,"r");let r=st.default.fstatSync(i),n=s.maxReadSize||16*1024*1024;if(r.size{let t=new Ei.Parser(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,a)=>{t.on("error",a),t.on("end",o),st.default.stat(r,(h,l)=>{if(h)a(h);else{let c=new $a.ReadStream(r,{readSize:i,size:l.size});c.on("error",a),c.pipe(t)}})})};B.list=(0,Xa.makeCommand)(eh,th,s=>new Ei.Parser(s),s=>new Ei.Parser(s),(s,e)=>{e?.length&&(0,B.filesFilter)(s,e),s.noResume||Qa(s)})});var an=d(bi=>{"use strict";Object.defineProperty(bi,"__esModule",{value:!0});bi.modeFix=void 0;var ih=(s,e,t)=>(s&=4095,t&&(s=(s|384)&-19),e&&(s&256&&(s|=64),s&32&&(s|=8),s&4&&(s|=1)),s);bi.modeFix=ih});var Zs=d(Si=>{"use strict";Object.defineProperty(Si,"__esModule",{value:!0});Si.stripAbsolutePath=void 0;var sh=require("node:path"),{isAbsolute:rh,parse:hn}=sh.win32,nh=s=>{let e="",t=hn(s);for(;rh(s)||t.root;){let i=s.charAt(0)==="/"&&s.slice(0,4)!=="//?/"?"/":t.root;s=s.slice(i.length),e+=i,t=hn(s)}return[e,s]};Si.stripAbsolutePath=nh});var Ks=d(nt=>{"use strict";Object.defineProperty(nt,"__esModule",{value:!0});nt.decode=nt.encode=void 0;var gi=["|","<",">","?",":"],Ys=gi.map(s=>String.fromCodePoint(61440+Number(s.codePointAt(0)))),oh=new Map(gi.map((s,e)=>[s,Ys[e]])),ah=new Map(Ys.map((s,e)=>[s,gi[e]])),hh=s=>gi.reduce((e,t)=>e.split(t).join(oh.get(t)),s);nt.encode=hh;var lh=s=>Ys.reduce((e,t)=>e.split(t).join(ah.get(t)),s);nt.decode=lh});var nr=d(M=>{"use strict";var ch=M&&M.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),uh=M&&M.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),fh=M&&M.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;re?(s=(0,oe.normalizeWindowsPath)(s).replace(/^\.(\/|$)/,""),(0,dh.stripTrailingSlashes)(e)+"/"+s):(0,oe.normalizeWindowsPath)(s),ph=16*1024*1024,cn=Symbol("process"),un=Symbol("file"),fn=Symbol("directory"),$s=Symbol("symlink"),dn=Symbol("hardlink"),vt=Symbol("header"),Ri=Symbol("read"),Xs=Symbol("lstat"),Oi=Symbol("onlstat"),Qs=Symbol("onread"),Js=Symbol("onreadlink"),er=Symbol("openfile"),tr=Symbol("onopenfile"),ve=Symbol("close"),vi=Symbol("mode"),ir=Symbol("awaitDrain"),Vs=Symbol("ondrain"),he=Symbol("prefix"),Ti=class extends pn.Minipass{path;portable;myuid=process.getuid&&process.getuid()||0;myuser=process.env.USER||"";maxReadSize;linkCache;statCache;preservePaths;cwd;strict;mtime;noPax;noMtime;prefix;fd;blockLen=0;blockRemain=0;buf;pos=0;remain=0;length=0;offset=0;win32;absolute;header;type;linkpath;stat;onWriteEntry;#e=!1;constructor(e,t={}){let i=(0,yn.dealias)(t);super(),this.path=(0,oe.normalizeWindowsPath)(e),this.portable=!!i.portable,this.maxReadSize=i.maxReadSize||ph,this.linkCache=i.linkCache||new Map,this.statCache=i.statCache||new Map,this.preservePaths=!!i.preservePaths,this.cwd=(0,oe.normalizeWindowsPath)(i.cwd||process.cwd()),this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.mtime=i.mtime,this.prefix=i.prefix?(0,oe.normalizeWindowsPath)(i.prefix):void 0,this.onWriteEntry=i.onWriteEntry,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let r=!1;if(!this.preservePaths){let[o,a]=(0,bn.stripAbsolutePath)(this.path);o&&typeof a=="string"&&(this.path=a,r=o)}this.win32=!!i.win32||process.platform==="win32",this.win32&&(this.path=mh.decode(this.path.replaceAll(/\\/g,"/")),e=e.replaceAll(/\\/g,"/")),this.absolute=(0,oe.normalizeWindowsPath)(i.absolute||ln.default.resolve(this.cwd,e)),this.path===""&&(this.path="./"),r&&this.warn("TAR_ENTRY_INFO",`stripping ${r} from absolute path`,{entry:this,path:r+this.path});let n=this.statCache.get(this.absolute);n?this[Oi](n):this[Xs]()}warn(e,t,i={}){return(0,Sn.warnMethod)(this,e,t,i)}emit(e,...t){return e==="error"&&(this.#e=!0),super.emit(e,...t)}[Xs](){ae.default.lstat(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[Oi](t)})}[Oi](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=_h(e),this.emit("stat",e),this[cn]()}[cn](){switch(this.type){case"File":return this[un]();case"Directory":return this[fn]();case"SymbolicLink":return this[$s]();default:return this.end()}}[vi](e){return(0,wn.modeFix)(e,this.type==="Directory",this.portable)}[he](e){return gn(e,this.prefix)}[vt](){if(!this.stat)throw new Error("cannot write header before stat");this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.onWriteEntry?.(this),this.header=new _n.Header({path:this[he](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[he](this.linkpath):this.linkpath,mode:this[vi](this.stat.mode),uid:this.portable?void 0:this.stat.uid,gid:this.portable?void 0:this.stat.gid,size:this.stat.size,mtime:this.noMtime?void 0:this.mtime||this.stat.mtime,type:this.type==="Unsupported"?void 0:this.type,uname:this.portable?void 0:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?void 0:this.stat.atime,ctime:this.portable?void 0:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new En.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[he](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[he](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?void 0:this.header.uid,uname:this.portable?void 0:this.header.uname,dev:this.portable?void 0:this.stat.dev,ino:this.portable?void 0:this.stat.ino,nlink:this.portable?void 0:this.stat.nlink}).encode());let e=this.header?.block;if(!e)throw new Error("failed to encode header");super.write(e)}[fn](){if(!this.stat)throw new Error("cannot create directory entry without stat");this.path.slice(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[vt](),this.end()}[$s](){ae.default.readlink(this.absolute,(e,t)=>{if(e)return this.emit("error",e);this[Js](t)})}[Js](e){this.linkpath=(0,oe.normalizeWindowsPath)(e),this[vt](),this.end()}[dn](e){if(!this.stat)throw new Error("cannot create link entry without stat");this.type="Link",this.linkpath=(0,oe.normalizeWindowsPath)(ln.default.relative(this.cwd,e)),this.stat.size=0,this[vt](),this.end()}[un](){if(!this.stat)throw new Error("cannot create file entry without stat");if(this.stat.nlink>1){let e=`${this.stat.dev}:${this.stat.ino}`,t=this.linkCache.get(e);if(t?.indexOf(this.cwd)===0)return this[dn](t);this.linkCache.set(e,this.absolute)}if(this[vt](),this.stat.size===0)return this.end();this[er]()}[er](){ae.default.open(this.absolute,"r",(e,t)=>{if(e)return this.emit("error",e);this[tr](t)})}[tr](e){if(this.fd=e,this.#e)return this[ve]();if(!this.stat)throw new Error("should stat before calling onopenfile");this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let t=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(t),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[Ri]()}[Ri](){let{fd:e,buf:t,offset:i,length:r,pos:n}=this;if(e===void 0||t===void 0)throw new Error("cannot read file without first opening");ae.default.read(e,t,i,r,n,(o,a)=>{if(o)return this[ve](()=>this.emit("error",o));this[Qs](a)})}[ve](e=()=>{}){this.fd!==void 0&&ae.default.close(this.fd,e)}[Qs](e){if(e<=0&&this.remain>0){let r=Object.assign(new Error("encountered unexpected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[ve](()=>this.emit("error",r))}if(e>this.remain){let r=Object.assign(new Error("did not encounter expected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[ve](()=>this.emit("error",r))}if(!this.buf)throw new Error("should have created buffer prior to reading");if(e===this.remain)for(let r=e;rthis[Vs]())}[ir](e){this.once("drain",e)}write(e,t,i){if(typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8")),this.blockRemaine?this.emit("error",e):this.end());if(!this.buf)throw new Error("buffer lost somehow in ONDRAIN");this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[Ri]()}};M.WriteEntry=Ti;var sr=class extends Ti{sync=!0;[Xs](){this[Oi](ae.default.lstatSync(this.absolute))}[$s](){this[Js](ae.default.readlinkSync(this.absolute))}[er](){this[tr](ae.default.openSync(this.absolute,"r"))}[Ri](){let e=!0;try{let{fd:t,buf:i,offset:r,length:n,pos:o}=this;if(t===void 0||i===void 0)throw new Error("fd and buf must be set in READ method");let a=ae.default.readSync(t,i,r,n,o);this[Qs](a),e=!1}finally{if(e)try{this[ve](()=>{})}catch{}}}[ir](e){e()}[ve](e=()=>{}){this.fd!==void 0&&ae.default.closeSync(this.fd),e()}};M.WriteEntrySync=sr;var rr=class extends pn.Minipass{blockLen=0;blockRemain=0;buf=0;pos=0;remain=0;length=0;preservePaths;portable;strict;noPax;noMtime;readEntry;type;prefix;path;mode;uid;gid;uname;gname;header;mtime;atime;ctime;linkpath;size;onWriteEntry;warn(e,t,i={}){return(0,Sn.warnMethod)(this,e,t,i)}constructor(e,t={}){let i=(0,yn.dealias)(t);super(),this.preservePaths=!!i.preservePaths,this.portable=!!i.portable,this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.onWriteEntry=i.onWriteEntry,this.readEntry=e;let{type:r}=e;if(r==="Unsupported")throw new Error("writing entry that should be ignored");this.type=r,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=i.prefix,this.path=(0,oe.normalizeWindowsPath)(e.path),this.mode=e.mode!==void 0?this[vi](e.mode):void 0,this.uid=this.portable?void 0:e.uid,this.gid=this.portable?void 0:e.gid,this.uname=this.portable?void 0:e.uname,this.gname=this.portable?void 0:e.gname,this.size=e.size,this.mtime=this.noMtime?void 0:i.mtime||e.mtime,this.atime=this.portable?void 0:e.atime,this.ctime=this.portable?void 0:e.ctime,this.linkpath=e.linkpath!==void 0?(0,oe.normalizeWindowsPath)(e.linkpath):void 0,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let n=!1;if(!this.preservePaths){let[a,h]=(0,bn.stripAbsolutePath)(this.path);a&&typeof h=="string"&&(this.path=h,n=a)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.onWriteEntry?.(this),this.header=new _n.Header({path:this[he](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[he](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?void 0:this.uid,gid:this.portable?void 0:this.gid,size:this.size,mtime:this.noMtime?void 0:this.mtime,type:this.type,uname:this.portable?void 0:this.uname,atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime}),n&&this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:this,path:n+this.path}),this.header.encode()&&!this.noPax&&super.write(new En.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[he](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[he](this.linkpath):this.linkpath,size:this.size,uid:this.portable?void 0:this.uid,uname:this.portable?void 0:this.uname,dev:this.portable?void 0:this.readEntry.dev,ino:this.portable?void 0:this.readEntry.ino,nlink:this.portable?void 0:this.readEntry.nlink}).encode());let o=this.header?.block;if(!o)throw new Error("failed to encode header");super.write(o),e.pipe(this)}[he](e){return gn(e,this.prefix)}[vi](e){return(0,wn.modeFix)(e,this.type==="Directory",this.portable)}write(e,t,i){typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,typeof t=="string"?t:"utf8"));let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e,i)}end(e,t,i){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),typeof e=="function"&&(i=e,t=void 0,e=void 0),typeof t=="function"&&(i=t,t=void 0),typeof e=="string"&&(e=Buffer.from(e,t??"utf8")),i&&this.once("finish",i),e?super.end(e,i):super.end(i),this}};M.WriteEntryTar=rr;var _h=s=>s.isFile()?"File":s.isDirectory()?"Directory":s.isSymbolicLink()?"SymbolicLink":"Unsupported"});var Rn=d(at=>{"use strict";Object.defineProperty(at,"__esModule",{value:!0});at.Node=at.Yallist=void 0;var or=class s{tail;head;length=0;static create(e=[]){return new s(e)}constructor(e=[]){for(let t of e)this.push(t)}*[Symbol.iterator](){for(let e=this.head;e;e=e.next)yield e.value}removeNode(e){if(e.list!==this)throw new Error("removing node which does not belong to this list");let t=e.next,i=e.prev;return t&&(t.prev=i),i&&(i.next=t),e===this.head&&(this.head=t),e===this.tail&&(this.tail=i),this.length--,e.next=void 0,e.prev=void 0,e.list=void 0,t}unshiftNode(e){if(e===this.head)return;e.list&&e.list.removeNode(e);let t=this.head;e.list=this,e.next=t,t&&(t.prev=e),this.head=e,this.tail||(this.tail=e),this.length++}pushNode(e){if(e===this.tail)return;e.list&&e.list.removeNode(e);let t=this.tail;e.list=this,e.prev=t,t&&(t.next=e),this.tail=e,this.head||(this.head=e),this.length++}push(...e){for(let t=0,i=e.length;t1)i=t;else if(this.head)r=this.head.next,i=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;r;n++)i=e(i,r.value,n),r=r.next;return i}reduceReverse(e,t){let i,r=this.tail;if(arguments.length>1)i=t;else if(this.tail)r=this.tail.prev,i=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(let n=this.length-1;r;n--)i=e(i,r.value,n),r=r.prev;return i}toArray(){let e=new Array(this.length);for(let t=0,i=this.head;i;t++)e[t]=i.value,i=i.next;return e}toArrayReverse(){let e=new Array(this.length);for(let t=0,i=this.tail;i;t++)e[t]=i.value,i=i.prev;return e}slice(e=0,t=this.length){t<0&&(t+=this.length),e<0&&(e+=this.length);let i=new s;if(tthis.length&&(t=this.length);let r=this.head,n=0;for(n=0;r&&nthis.length&&(t=this.length);let r=this.length,n=this.tail;for(;n&&r>t;r--)n=n.prev;for(;n&&r>e;r--,n=n.prev)i.push(n.value);return i}splice(e,t=0,...i){e>this.length&&(e=this.length-1),e<0&&(e=this.length+e);let r=this.head;for(let o=0;r&&o{"use strict";var bh=L&&L.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),Sh=L&&L.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),gh=L&&L.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r1)throw new TypeError("gzip, brotli, zstd are mutually exclusive");if(e.gzip&&(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new ar.Gzip(e.gzip)),e.brotli&&(typeof e.brotli!="object"&&(e.brotli={}),this.zip=new ar.BrotliCompress(e.brotli)),e.zstd&&(typeof e.zstd!="object"&&(e.zstd={}),this.zip=new ar.ZstdCompress(e.zstd)),!this.zip)throw new Error("impossible");let t=this.zip;t.on("data",i=>super.write(i)),t.on("end",()=>super.end()),t.on("drain",()=>this[cr]()),this.on("resume",()=>t.resume())}else this.on("drain",this[cr]);this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,e.mtime&&(this.mtime=e.mtime),this.filter=typeof e.filter=="function"?e.filter:()=>!0,this[X]=new Oh.Yallist,this[Q]=0,this.jobs=Number(e.jobs)||4,this[Pt]=!1,this[Tt]=!1}[Nn](e){return super.write(e)}add(e){return this.write(e),this}end(e,t,i){return typeof e=="function"&&(i=e,e=void 0),typeof t=="function"&&(i=t,t=void 0),e&&this.add(e),this[Tt]=!0,this[je](),i&&i(),this}write(e){if(this[Tt])throw new Error("write after end");return typeof e=="string"?this[Ni](e):this[vn](e),this.flowing}[vn](e){let t=(0,ur.normalizeWindowsPath)(Dn.default.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let i=new Nt(e.path,t);i.entry=new fr.WriteEntryTar(e,this[lr](i)),i.entry.on("end",()=>this[hr](i)),this[Q]+=1,this[X].push(i)}this[je]()}[Ni](e){let t=(0,ur.normalizeWindowsPath)(Dn.default.resolve(this.cwd,e));this[X].push(new Nt(e,t)),this[je]()}[dr](e){e.pending=!0,this[Q]+=1;let t=this.follow?"stat":"lstat";Ii.default[t](e.absolute,(i,r)=>{e.pending=!1,this[Q]-=1,i?this.emit("error",i):this[Pi](e,r)})}[Pi](e,t){if(this.statCache.set(e.absolute,t),e.stat=t,!this.filter(e.path,t))e.ignore=!0;else if(t.isFile()&&t.nlink>1&&!this.linkCache.get(`${t.dev}:${t.ino}`)&&!this.sync)if(e===this[Te])this[Di](e);else{let i=`${t.dev}:${t.ino}`,r=this[Dt].get(i);r?r.push(e):this[Dt].set(i,[e]),e.pendingLink=!0,e.pending=!0}this[je]()}[mr](e){e.pending=!0,this[Q]+=1,Ii.default.readdir(e.absolute,(t,i)=>{if(e.pending=!1,this[Q]-=1,t)return this.emit("error",t);this[Mi](e,i)})}[Mi](e,t){this.readdirCache.set(e.absolute,t),e.readdir=t,this[je]()}[je](){if(!this[Pt]){this[Pt]=!0;for(let e=this[X].head;e&&this[Q]1){let i=`${t.dev}:${t.ino}`,r=this[Dt].get(i);if(r){this[Dt].delete(i);for(let n of r)n.pending=!1,this[Di](n)}}this[je]()}[Di](e){if(e.pending&&e.pendingLink&&e===this[Te]&&(e.pending=!1,e.pendingLink=!1),!e.pending){if(e.entry){e===this[Te]&&!e.piped&&this[Li](e);return}if(!e.stat){let t=this.statCache.get(e.absolute);t?this[Pi](e,t):this[dr](e)}if(e.stat&&!e.ignore){if(!this.noDirRecurse&&e.stat.isDirectory()&&!e.readdir){let t=this.readdirCache.get(e.absolute);if(t?this[Mi](e,t):this[mr](e),!e.readdir)return}if(e.entry=this[Tn](e),!e.entry){e.ignore=!0;return}e===this[Te]&&!e.piped&&this[Li](e)}}}[lr](e){return{onwarn:(t,i,r)=>this.warn(t,i,r),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix,onWriteEntry:this.onWriteEntry}}[Tn](e){this[Q]+=1;try{return new this[Ai](e.path,this[lr](e)).on("end",()=>this[hr](e)).on("error",i=>this.emit("error",i))}catch(t){this.emit("error",t)}}[cr](){this[Te]&&this[Te].entry&&this[Te].entry.resume()}[Li](e){e.piped=!0,e.readdir&&e.readdir.forEach(r=>{let n=e.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[Ni](o+r)});let t=e.entry,i=this.zip;if(!t)throw new Error("cannot pipe without source");i?t.on("data",r=>{i.write(r)||t.pause()}):t.on("data",r=>{super.write(r)||t.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}warn(e,t,i={}){(0,vh.warnMethod)(this,e,t,i)}};L.Pack=Fi;var pr=class extends Fi{sync=!0;constructor(e){super(e),this[Ai]=fr.WriteEntrySync}pause(){}resume(){}[dr](e){let t=this.follow?"statSync":"lstatSync";this[Pi](e,Ii.default[t](e.absolute))}[mr](e){this[Mi](e,Ii.default.readdirSync(e.absolute))}[Li](e){let t=e.entry,i=this.zip;if(e.readdir&&e.readdir.forEach(r=>{let n=e.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[Ni](o+r)}),!t)throw new Error("Cannot pipe without source");i?t.on("data",r=>{i.write(r)}):t.on("data",r=>{super[Nn](r)})}};L.PackSync=pr});var _r=d(ht=>{"use strict";var Th=ht&&ht.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(ht,"__esModule",{value:!0});ht.create=void 0;var Mn=Ke(),Ln=Th(require("node:path")),An=rt(),Dh=Ve(),Bi=Ci(),Ph=(s,e)=>{let t=new Bi.PackSync(s),i=new Mn.WriteStreamSync(s.file,{mode:s.mode||438});t.pipe(i),In(t,e)},Nh=(s,e)=>{let t=new Bi.Pack(s),i=new Mn.WriteStream(s.file,{mode:s.mode||438});t.pipe(i);let r=new Promise((n,o)=>{i.on("error",o),i.on("close",n),t.on("error",o)});return Fn(t,e).catch(n=>t.emit("error",n)),r},In=(s,e)=>{e.forEach(t=>{t.charAt(0)==="@"?(0,An.list)({file:Ln.default.resolve(s.cwd,t.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(t)}),s.end()},Fn=async(s,e)=>{for(let t of e)t.charAt(0)==="@"?await(0,An.list)({file:Ln.default.resolve(String(s.cwd),t.slice(1)),noResume:!0,onReadEntry:i=>{s.add(i)}}):s.add(t);s.end()},Mh=(s,e)=>{let t=new Bi.PackSync(s);return In(t,e),t},Lh=(s,e)=>{let t=new Bi.Pack(s);return Fn(t,e).catch(i=>t.emit("error",i)),t};ht.create=(0,Dh.makeCommand)(Ph,Nh,Mh,Lh,(s,e)=>{if(!e?.length)throw new TypeError("no paths specified to add to archive")})});var Wn=d(lt=>{"use strict";var Ah=lt&<.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(lt,"__esModule",{value:!0});lt.getWriteFlag=void 0;var zn=Ah(require("fs")),Ih=process.env.__FAKE_PLATFORM__||process.platform,kn=Ih==="win32",{O_CREAT:xn,O_NOFOLLOW:Cn,O_TRUNC:jn,O_WRONLY:Un}=zn.default.constants,qn=Number(process.env.__FAKE_FS_O_FILENAME__)||zn.default.constants.UV_FS_O_FILEMAP||0,Fh=kn&&!!qn,Ch=512*1024,Bh=qn|jn|xn|Un,Bn=!kn&&typeof Cn=="number"?Cn|jn|xn|Un:null;lt.getWriteFlag=Bn!==null?()=>Bn:Fh?s=>s"w"});var Gn=d(le=>{"use strict";var Hn=le&&le.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(le,"__esModule",{value:!0});le.chownrSync=le.chownr=void 0;var ki=Hn(require("node:fs")),Mt=Hn(require("node:path")),wr=(s,e,t)=>{try{return ki.default.lchownSync(s,e,t)}catch(i){if(i?.code!=="ENOENT")throw i}},zi=(s,e,t,i)=>{ki.default.lchown(s,e,t,r=>{i(r&&r?.code!=="ENOENT"?r:null)})},zh=(s,e,t,i,r)=>{if(e.isDirectory())(0,le.chownr)(Mt.default.resolve(s,e.name),t,i,n=>{if(n)return r(n);let o=Mt.default.resolve(s,e.name);zi(o,t,i,r)});else{let n=Mt.default.resolve(s,e.name);zi(n,t,i,r)}},kh=(s,e,t,i)=>{ki.default.readdir(s,{withFileTypes:!0},(r,n)=>{if(r){if(r.code==="ENOENT")return i();if(r.code!=="ENOTDIR"&&r.code!=="ENOTSUP")return i(r)}if(r||!n.length)return zi(s,e,t,i);let o=n.length,a=null,h=l=>{if(!a){if(l)return i(a=l);if(--o===0)return zi(s,e,t,i)}};for(let l of n)zh(s,l,e,t,h)})};le.chownr=kh;var xh=(s,e,t,i)=>{e.isDirectory()&&(0,le.chownrSync)(Mt.default.resolve(s,e.name),t,i),wr(Mt.default.resolve(s,e.name),t,i)},jh=(s,e,t)=>{let i;try{i=ki.default.readdirSync(s,{withFileTypes:!0})}catch(r){let n=r;if(n?.code==="ENOENT")return;if(n?.code==="ENOTDIR"||n?.code==="ENOTSUP")return wr(s,e,t);throw n}for(let r of i)xh(s,r,e,t);return wr(s,e,t)};le.chownrSync=jh});var Zn=d(xi=>{"use strict";Object.defineProperty(xi,"__esModule",{value:!0});xi.CwdError=void 0;var yr=class extends Error{path;code;syscall="chdir";constructor(e,t){super(`${t}: Cannot cd into '${e}'`),this.path=e,this.code=t}get name(){return"CwdError"}};xi.CwdError=yr});var br=d(ji=>{"use strict";Object.defineProperty(ji,"__esModule",{value:!0});ji.SymlinkError=void 0;var Er=class extends Error{path;symlink;syscall="symlink";code="TAR_SYMLINK_ERROR";constructor(e,t){super("TAR_SYMLINK_ERROR: Cannot extract through symbolic link"),this.symlink=e,this.path=t}get name(){return"SymlinkError"}};ji.SymlinkError=Er});var Xn=d(De=>{"use strict";var gr=De&&De.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(De,"__esModule",{value:!0});De.mkdirSync=De.mkdir=void 0;var Yn=Gn(),j=gr(require("node:fs")),Uh=gr(require("node:fs/promises")),Ui=gr(require("node:path")),Kn=Zn(),_e=tt(),Vn=br(),qh=(s,e)=>{j.default.stat(s,(t,i)=>{(t||!i.isDirectory())&&(t=new Kn.CwdError(s,t?.code||"ENOTDIR")),e(t)})},Wh=(s,e,t)=>{s=(0,_e.normalizeWindowsPath)(s);let i=e.umask??18,r=e.mode|448,n=(r&i)!==0,o=e.uid,a=e.gid,h=typeof o=="number"&&typeof a=="number"&&(o!==e.processUid||a!==e.processGid),l=e.preserve,c=e.unlink,u=(0,_e.normalizeWindowsPath)(e.cwd),E=(w,P)=>{w?t(w):P&&h?(0,Yn.chownr)(P,o,a,xt=>E(xt)):n?j.default.chmod(s,r,t):t()};if(s===u)return qh(s,E);if(l)return Uh.default.mkdir(s,{mode:r,recursive:!0}).then(w=>E(null,w??void 0),E);let A=(0,_e.normalizeWindowsPath)(Ui.default.relative(u,s)).split("/");Sr(u,A,r,c,u,void 0,E)};De.mkdir=Wh;var Sr=(s,e,t,i,r,n,o)=>{if(e.length===0)return o(null,n);let a=e.shift(),h=(0,_e.normalizeWindowsPath)(Ui.default.resolve(s+"/"+a));j.default.mkdir(h,t,$n(h,e,t,i,r,n,o))},$n=(s,e,t,i,r,n,o)=>a=>{a?j.default.lstat(s,(h,l)=>{if(h)h.path=h.path&&(0,_e.normalizeWindowsPath)(h.path),o(h);else if(l.isDirectory())Sr(s,e,t,i,r,n,o);else if(i)j.default.unlink(s,c=>{if(c)return o(c);j.default.mkdir(s,t,$n(s,e,t,i,r,n,o))});else{if(l.isSymbolicLink())return o(new Vn.SymlinkError(s,s+"/"+e.join("/")));o(a)}}):(n=n||s,Sr(s,e,t,i,r,n,o))},Hh=s=>{let e=!1,t;try{e=j.default.statSync(s).isDirectory()}catch(i){t=i?.code}finally{if(!e)throw new Kn.CwdError(s,t??"ENOTDIR")}},Gh=(s,e)=>{s=(0,_e.normalizeWindowsPath)(s);let t=e.umask??18,i=e.mode|448,r=(i&t)!==0,n=e.uid,o=e.gid,a=typeof n=="number"&&typeof o=="number"&&(n!==e.processUid||o!==e.processGid),h=e.preserve,l=e.unlink,c=(0,_e.normalizeWindowsPath)(e.cwd),u=w=>{w&&a&&(0,Yn.chownrSync)(w,n,o),r&&j.default.chmodSync(s,i)};if(s===c)return Hh(c),u();if(h)return u(j.default.mkdirSync(s,{mode:i,recursive:!0})??void 0);let D=(0,_e.normalizeWindowsPath)(Ui.default.relative(c,s)).split("/"),A;for(let w=D.shift(),P=c;w&&(P+="/"+w);w=D.shift()){P=(0,_e.normalizeWindowsPath)(Ui.default.resolve(P));try{j.default.mkdirSync(P,i),A=A||P}catch{let xt=j.default.lstatSync(P);if(xt.isDirectory())continue;if(l){j.default.unlinkSync(P),j.default.mkdirSync(P,i),A=A||P;continue}else if(xt.isSymbolicLink())return new Vn.SymlinkError(P,P+"/"+D.join("/"))}}return u(A)};De.mkdirSync=Gh});var Jn=d(qi=>{"use strict";Object.defineProperty(qi,"__esModule",{value:!0});qi.normalizeUnicode=void 0;var Rr=Object.create(null),Qn=1e4,ct=new Set,Zh=s=>{ct.has(s)?ct.delete(s):Rr[s]=s.normalize("NFD").toLocaleLowerCase("en").toLocaleUpperCase("en"),ct.add(s);let e=Rr[s],t=ct.size-Qn;if(t>Qn/10){for(let i of ct)if(ct.delete(i),delete Rr[i],--t<=0)break}return e};qi.normalizeUnicode=Zh});var to=d(Wi=>{"use strict";Object.defineProperty(Wi,"__esModule",{value:!0});Wi.PathReservations=void 0;var eo=require("node:path"),Yh=Jn(),Kh=yi(),Vh=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,$h=Vh==="win32",Xh=s=>s.split("/").slice(0,-1).reduce((t,i)=>{let r=t.at(-1);return r!==void 0&&(i=(0,eo.join)(r,i)),t.push(i||"/"),t},[]),Or=class{#e=new Map;#i=new Map;#s=new Set;reserve(e,t){e=$h?["win32 parallelization disabled"]:e.map(r=>(0,Kh.stripTrailingSlashes)((0,eo.join)((0,Yh.normalizeUnicode)(r))));let i=new Set(e.map(r=>Xh(r)).reduce((r,n)=>r.concat(n)));this.#i.set(t,{dirs:i,paths:e});for(let r of e){let n=this.#e.get(r);n?n.push(t):this.#e.set(r,[t])}for(let r of i){let n=this.#e.get(r);if(!n)this.#e.set(r,[new Set([t])]);else{let o=n.at(-1);o instanceof Set?o.add(t):n.push(new Set([t]))}}return this.#r(t)}#n(e){let t=this.#i.get(e);if(!t)throw new Error("function does not have any path reservations");return{paths:t.paths.map(i=>this.#e.get(i)),dirs:[...t.dirs].map(i=>this.#e.get(i))}}check(e){let{paths:t,dirs:i}=this.#n(e);return t.every(r=>r&&r[0]===e)&&i.every(r=>r&&r[0]instanceof Set&&r[0].has(e))}#r(e){return this.#s.has(e)||!this.check(e)?!1:(this.#s.add(e),e(()=>this.#t(e)),!0)}#t(e){if(!this.#s.has(e))return!1;let t=this.#i.get(e);if(!t)throw new Error("invalid reservation");let{paths:i,dirs:r}=t,n=new Set;for(let o of i){let a=this.#e.get(o);if(!a||a?.[0]!==e)continue;let h=a[1];if(!h){this.#e.delete(o);continue}if(a.shift(),typeof h=="function")n.add(h);else for(let l of h)n.add(l)}for(let o of r){let a=this.#e.get(o),h=a?.[0];if(!(!a||!(h instanceof Set)))if(h.size===1&&a.length===1){this.#e.delete(o);continue}else if(h.size===1){a.shift();let l=a[0];typeof l=="function"&&n.add(l)}else h.delete(e)}return this.#s.delete(e),n.forEach(o=>this.#r(o)),!0}};Wi.PathReservations=Or});var io=d(Hi=>{"use strict";Object.defineProperty(Hi,"__esModule",{value:!0});Hi.umask=void 0;var Qh=()=>process.umask();Hi.umask=Qh});var Cr=d(k=>{"use strict";var Jh=k&&k.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),el=k&&k.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),fo=k&&k.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r{if(!zt)return m.default.unlink(s,e);let t=s+".DELETE."+(0,mo.randomBytes)(16).toString("hex");m.default.rename(s,t,i=>{if(i)return e(i);m.default.unlink(t,e)})},cl=s=>{if(!zt)return m.default.unlinkSync(s);let e=s+".DELETE."+(0,mo.randomBytes)(16).toString("hex");m.default.renameSync(s,e),m.default.unlinkSync(e)},uo=(s,e,t)=>s!==void 0&&s===s>>>0?s:e!==void 0&&e===e>>>0?e:t,Yi=class extends sl.Parser{[Tr]=!1;[Bt]=!1;[Gi]=0;reservations=new nl.PathReservations;transform;writable=!0;readable=!1;uid;gid;setOwner;preserveOwner;processGid;processUid;maxDepth;forceChown;win32;newer;keep;noMtime;preservePaths;unlink;cwd;strip;processUmask;umask;dmode;fmode;chmod;constructor(e={}){if(e.ondone=()=>{this[Tr]=!0,this[Dr]()},super(e),this.transform=e.transform,this.chmod=!!e.chmod,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=void 0,this.gid=void 0,this.setOwner=!1;this.preserveOwner=e.preserveOwner===void 0&&typeof e.uid!="number"?process.getuid?.()===0:!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():void 0,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():void 0,this.maxDepth=typeof e.maxDepth=="number"?e.maxDepth:hl,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||zt,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=(0,U.normalizeWindowsPath)(g.default.resolve(e.cwd||process.cwd())),this.strip=Number(e.strip)||0,this.processUmask=this.chmod?typeof e.processUmask=="number"?e.processUmask:(0,ol.umask)():0,this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",t=>this[ro](t))}warn(e,t,i={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(i.recoverable=!1),super.warn(e,t,i)}[Dr](){this[Tr]&&this[Gi]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"))}[vr](e,t){let i=e[t],{type:r}=e;if(!i||this.preservePaths)return!0;let[n,o]=(0,rl.stripAbsolutePath)(i),a=o.replaceAll(/\\/g,"/").split("/");if(a.includes("..")||zt&&/^[a-z]:\.\.$/i.test(a[0]??"")){if(t==="path"||r==="Link")return this.warn("TAR_ENTRY_ERROR",`${t} contains '..'`,{entry:e,[t]:i}),!1;let h=g.default.posix.dirname(e.path),l=g.default.posix.normalize(g.default.posix.join(h,a.join("/")));if(l.startsWith("../")||l==="..")return this.warn("TAR_ENTRY_ERROR",`${t} escapes extraction directory`,{entry:e,[t]:i}),!1}return n&&(e[t]=String(o),this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute ${t}`,{entry:e,[t]:i})),!0}[lo](e){let t=(0,U.normalizeWindowsPath)(e.path),i=t.split("/");if(this.strip){if(i.length=this.strip)e.linkpath=r.slice(this.strip).join("/");else return!1}i.splice(0,this.strip),e.path=i.join("/")}if(isFinite(this.maxDepth)&&i.length>this.maxDepth)return this.warn("TAR_ENTRY_ERROR","path excessively deep",{entry:e,path:t,depth:i.length,maxDepth:this.maxDepth}),!1;if(!this[vr](e,"path")||!this[vr](e,"linkpath"))return!1;if(e.absolute=g.default.isAbsolute(e.path)?(0,U.normalizeWindowsPath)(g.default.resolve(e.path)):(0,U.normalizeWindowsPath)(g.default.resolve(this.cwd,e.path)),!this.preservePaths&&typeof e.absolute=="string"&&e.absolute.indexOf(this.cwd+"/")!==0&&e.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:e,path:(0,U.normalizeWindowsPath)(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!=="Directory"&&e.type!=="GNUDumpDir")return!1;if(this.win32){let{root:r}=g.default.win32.parse(String(e.absolute));e.absolute=r+so.encode(String(e.absolute).slice(r.length));let{root:n}=g.default.win32.parse(e.path);e.path=n+so.encode(e.path.slice(n.length))}return!0}[ro](e){if(!this[lo](e))return e.resume();switch(il.default.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[Pr](e);default:return this[ho](e)}}[T](e,t){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:t}),this[ut](),t.resume())}[Pe](e,t,i){(0,_o.mkdir)((0,U.normalizeWindowsPath)(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:t},i)}[It](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[Ft](e){return uo(this.uid,e.uid,this.processUid)}[Ct](e){return uo(this.gid,e.gid,this.processGid)}[Mr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.fmode,r=new tl.WriteStream(String(e.absolute),{flags:(0,po.getWriteFlag)(e.size),mode:i,autoClose:!1});r.on("error",h=>{r.fd&&m.default.close(r.fd,()=>{}),r.write=()=>!0,this[T](h,e),t()});let n=1,o=h=>{if(h){r.fd&&m.default.close(r.fd,()=>{}),this[T](h,e),t();return}--n===0&&r.fd!==void 0&&m.default.close(r.fd,l=>{l?this[T](l,e):this[ut](),t()})};r.on("finish",()=>{let h=String(e.absolute),l=r.fd;if(typeof l=="number"&&e.mtime&&!this.noMtime){n++;let c=e.atime||new Date,u=e.mtime;m.default.futimes(l,c,u,E=>E?m.default.utimes(h,c,u,D=>o(D&&E)):o())}if(typeof l=="number"&&this[It](e)){n++;let c=this[Ft](e),u=this[Ct](e);typeof c=="number"&&typeof u=="number"&&m.default.fchown(l,c,u,E=>E?m.default.chown(h,c,u,D=>o(D&&E)):o())}o()});let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",h=>{this[T](h,e),t()}),e.pipe(a)),a.pipe(r)}[Lr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.dmode;this[Pe](String(e.absolute),i,r=>{if(r){this[T](r,e),t();return}let n=1,o=()=>{--n===0&&(t(),this[ut](),e.resume())};e.mtime&&!this.noMtime&&(n++,m.default.utimes(String(e.absolute),e.atime||new Date,e.mtime,o)),this[It](e)&&(n++,m.default.chown(String(e.absolute),Number(this[Ft](e)),Number(this[Ct](e)),o)),o()})}[ho](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[oo](e,t){let i=(0,U.normalizeWindowsPath)(g.default.relative(this.cwd,g.default.resolve(g.default.dirname(String(e.absolute)),String(e.linkpath)))).split("/");this[At](e,this.cwd,i,()=>this[Zi](e,String(e.linkpath),"symlink",t),r=>{this[T](r,e),t()})}[ao](e,t){let i=(0,U.normalizeWindowsPath)(g.default.resolve(this.cwd,String(e.linkpath))),r=(0,U.normalizeWindowsPath)(String(e.linkpath)).split("/");this[At](e,this.cwd,r,()=>this[Zi](e,i,"link",t),n=>{this[T](n,e),t()})}[At](e,t,i,r,n){let o=i.shift();if(this.preservePaths||o===void 0)return r();let a=g.default.resolve(t,o);m.default.lstat(a,(h,l)=>{if(h)return r();if(l?.isSymbolicLink())return n(new wo.SymlinkError(a,g.default.resolve(a,i.join("/"))));this[At](e,a,i,r,n)})}[co](){this[Gi]++}[ut](){this[Gi]--,this[Dr]()}[Ar](e){this[ut](),e.resume()}[Nr](e,t){return e.type==="File"&&!this.unlink&&t.isFile()&&t.nlink<=1&&!zt}[Pr](e){this[co]();let t=[e.path];e.linkpath&&t.push(e.linkpath),this.reservations.reserve(t,i=>this[no](e,i))}[no](e,t){let i=a=>{t(a)},r=()=>{this[Pe](this.cwd,this.dmode,a=>{if(a){this[T](a,e),i();return}this[Bt]=!0,n()})},n=()=>{if(e.absolute!==this.cwd){let a=(0,U.normalizeWindowsPath)(g.default.dirname(String(e.absolute)));if(a!==this.cwd)return this[Pe](a,this.dmode,h=>{if(h){this[T](h,e),i();return}o()})}o()},o=()=>{m.default.lstat(String(e.absolute),(a,h)=>{if(h&&(this.keep||this.newer&&h.mtime>(e.mtime??h.mtime))){this[Ar](e),i();return}if(a||this[Nr](e,h))return this[G](null,e,i);if(h.isDirectory()){if(e.type==="Directory"){let l=this.chmod&&e.mode&&(h.mode&4095)!==e.mode,c=u=>this[G](u??null,e,i);return l?m.default.chmod(String(e.absolute),Number(e.mode),c):c()}if(e.absolute!==this.cwd)return m.default.rmdir(String(e.absolute),l=>this[G](l??null,e,i))}if(e.absolute===this.cwd)return this[G](null,e,i);ll(String(e.absolute),l=>this[G](l??null,e,i))})};this[Bt]?n():r()}[G](e,t,i){if(e){this[T](e,t),i();return}switch(t.type){case"File":case"OldFile":case"ContiguousFile":return this[Mr](t,i);case"Link":return this[ao](t,i);case"SymbolicLink":return this[oo](t,i);case"Directory":case"GNUDumpDir":return this[Lr](t,i)}}[Zi](e,t,i,r){m.default[i](t,String(e.absolute),n=>{n?this[T](n,e):(this[ut](),e.resume()),r()})}};k.Unpack=Yi;var Lt=s=>{try{return[null,s()]}catch(e){return[e,null]}},Ir=class extends Yi{sync=!0;[G](e,t){return super[G](e,t,()=>{})}[Pr](e){if(!this[Bt]){let n=this[Pe](this.cwd,this.dmode);if(n)return this[T](n,e);this[Bt]=!0}if(e.absolute!==this.cwd){let n=(0,U.normalizeWindowsPath)(g.default.dirname(String(e.absolute)));if(n!==this.cwd){let o=this[Pe](n,this.dmode);if(o)return this[T](o,e)}}let[t,i]=Lt(()=>m.default.lstatSync(String(e.absolute)));if(i&&(this.keep||this.newer&&i.mtime>(e.mtime??i.mtime)))return this[Ar](e);if(t||this[Nr](e,i))return this[G](null,e);if(i.isDirectory()){if(e.type==="Directory"){let o=this.chmod&&e.mode&&(i.mode&4095)!==e.mode,[a]=o?Lt(()=>{m.default.chmodSync(String(e.absolute),Number(e.mode))}):[];return this[G](a,e)}let[n]=Lt(()=>m.default.rmdirSync(String(e.absolute)));this[G](n,e)}let[r]=e.absolute===this.cwd?[]:Lt(()=>cl(String(e.absolute)));this[G](r,e)}[Mr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.fmode,r=a=>{let h;try{m.default.closeSync(n)}catch(l){h=l}(a||h)&&this[T](a||h,e),t()},n;try{n=m.default.openSync(String(e.absolute),(0,po.getWriteFlag)(e.size),i)}catch(a){return r(a)}let o=this.transform&&this.transform(e)||e;o!==e&&(o.on("error",a=>this[T](a,e)),e.pipe(o)),o.on("data",a=>{try{m.default.writeSync(n,a,0,a.length)}catch(h){r(h)}}),o.on("end",()=>{let a=null;if(e.mtime&&!this.noMtime){let h=e.atime||new Date,l=e.mtime;try{m.default.futimesSync(n,h,l)}catch(c){try{m.default.utimesSync(String(e.absolute),h,l)}catch{a=c}}}if(this[It](e)){let h=this[Ft](e),l=this[Ct](e);try{m.default.fchownSync(n,Number(h),Number(l))}catch(c){try{m.default.chownSync(String(e.absolute),Number(h),Number(l))}catch{a=a||c}}}r(a)})}[Lr](e,t){let i=typeof e.mode=="number"?e.mode&4095:this.dmode,r=this[Pe](String(e.absolute),i);if(r){this[T](r,e),t();return}if(e.mtime&&!this.noMtime)try{m.default.utimesSync(String(e.absolute),e.atime||new Date,e.mtime)}catch{}if(this[It](e))try{m.default.chownSync(String(e.absolute),Number(this[Ft](e)),Number(this[Ct](e)))}catch{}t(),e.resume()}[Pe](e,t){try{return(0,_o.mkdirSync)((0,U.normalizeWindowsPath)(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:t})}catch(i){return i}}[At](e,t,i,r,n){if(this.preservePaths||i.length===0)return r();let o=t;for(let a of i){o=g.default.resolve(o,a);let[h,l]=Lt(()=>m.default.lstatSync(o));if(h)return r();if(l.isSymbolicLink())return n(new wo.SymlinkError(o,g.default.resolve(t,i.join("/"))))}r()}[Zi](e,t,i,r){let n=`${i}Sync`;try{m.default[n](t,String(e.absolute)),r(),e.resume()}catch(o){return this[T](o,e)}}};k.UnpackSync=Ir});var Br=d(Z=>{"use strict";var ul=Z&&Z.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),fl=Z&&Z.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),dl=Z&&Z.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r{let e=new Ki.UnpackSync(s),t=s.file,i=Eo.default.statSync(t),r=s.maxReadSize||16*1024*1024;new yo.ReadStreamSync(t,{readSize:r,size:i.size}).pipe(e)},yl=(s,e)=>{let t=new Ki.Unpack(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,a)=>{t.on("error",a),t.on("close",o),Eo.default.stat(r,(h,l)=>{if(h)a(h);else{let c=new yo.ReadStream(r,{readSize:i,size:l.size});c.on("error",a),c.pipe(t)}})})};Z.extract=(0,_l.makeCommand)(wl,yl,s=>new Ki.UnpackSync(s),s=>new Ki.Unpack(s),(s,e)=>{e?.length&&(0,pl.filesFilter)(s,e)})});var Vi=d(ft=>{"use strict";var bo=ft&&ft.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(ft,"__esModule",{value:!0});ft.replace=void 0;var So=Ke(),q=bo(require("node:fs")),go=bo(require("node:path")),Ro=et(),Oo=rt(),El=Ve(),bl=Qt(),vo=Ci(),Sl=(s,e)=>{let t=new vo.PackSync(s),i=!0,r,n;try{try{r=q.default.openSync(s.file,"r+")}catch(h){if(h?.code==="ENOENT")r=q.default.openSync(s.file,"w+");else throw h}let o=q.default.fstatSync(r),a=Buffer.alloc(512);e:for(n=0;no.size)break;n+=l,s.mtimeCache&&h.mtime&&s.mtimeCache.set(String(h.path),h.mtime)}i=!1,gl(s,t,n,r,e)}finally{if(i)try{q.default.closeSync(r)}catch{}}},gl=(s,e,t,i,r)=>{let n=new So.WriteStreamSync(s.file,{fd:i,start:t});e.pipe(n),Ol(e,r)},Rl=(s,e)=>{e=Array.from(e);let t=new vo.Pack(s),i=(n,o,a)=>{let h=(D,A)=>{D?q.default.close(n,w=>a(D)):a(null,A)},l=0;if(o===0)return h(null,0);let c=0,u=Buffer.alloc(512),E=(D,A)=>{if(D||A===void 0)return h(D);if(c+=A,c<512&&A)return q.default.read(n,u,c,u.length-c,l+c,E);if(l===0&&u[0]===31&&u[1]===139)return h(new Error("cannot append to compressed archives"));if(c<512)return h(null,l);let w=new Ro.Header(u);if(!w.cksumValid)return h(null,l);let P=512*Math.ceil((w.size??0)/512);if(l+P+512>o||(l+=P+512,l>=o))return h(null,l);s.mtimeCache&&w.mtime&&s.mtimeCache.set(String(w.path),w.mtime),c=0,q.default.read(n,u,0,512,l,E)};q.default.read(n,u,0,512,l,E)};return new Promise((n,o)=>{t.on("error",o);let a="r+",h=(l,c)=>{if(l&&l.code==="ENOENT"&&a==="r+")return a="w+",q.default.open(s.file,a,h);if(l||!c)return o(l);q.default.fstat(c,(u,E)=>{if(u)return q.default.close(c,()=>o(u));i(c,E.size,(D,A)=>{if(D)return o(D);let w=new So.WriteStream(s.file,{fd:c,start:A});t.pipe(w),w.on("error",o),w.on("close",n),vl(t,e)})})};q.default.open(s.file,a,h)})},Ol=(s,e)=>{e.forEach(t=>{t.charAt(0)==="@"?(0,Oo.list)({file:go.default.resolve(s.cwd,t.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(t)}),s.end()},vl=async(s,e)=>{for(let t of e)t.charAt(0)==="@"?await(0,Oo.list)({file:go.default.resolve(String(s.cwd),t.slice(1)),noResume:!0,onReadEntry:i=>s.add(i)}):s.add(t);s.end()};ft.replace=(0,El.makeCommand)(Sl,Rl,()=>{throw new TypeError("file is required")},()=>{throw new TypeError("file is required")},(s,e)=>{if(!(0,bl.isFile)(s))throw new TypeError("file is required");if(s.gzip||s.brotli||s.zstd||s.file.endsWith(".br")||s.file.endsWith(".tbr"))throw new TypeError("cannot append to compressed archives");if(!e?.length)throw new TypeError("no paths specified to add/replace")})});var zr=d($i=>{"use strict";Object.defineProperty($i,"__esModule",{value:!0});$i.update=void 0;var Tl=Ve(),kt=Vi();$i.update=(0,Tl.makeCommand)(kt.replace.syncFile,kt.replace.asyncFile,kt.replace.syncNoFile,kt.replace.asyncNoFile,(s,e=[])=>{kt.replace.validate?.(s,e),Dl(s)});var Dl=s=>{let e=s.filter;s.mtimeCache||(s.mtimeCache=new Map),s.filter=e?(t,i)=>e(t,i)&&!((s.mtimeCache?.get(t)??i.mtime??0)>(i.mtime??0)):(t,i)=>!((s.mtimeCache?.get(t)??i.mtime??0)>(i.mtime??0))}});var To=exports&&exports.__createBinding||(Object.create?(function(s,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(s,i,r)}):(function(s,e,t,i){i===void 0&&(i=t),s[i]=e[t]})),Pl=exports&&exports.__setModuleDefault||(Object.create?(function(s,e){Object.defineProperty(s,"default",{enumerable:!0,value:e})}):function(s,e){s.default=e}),Y=exports&&exports.__exportStar||function(s,e){for(var t in s)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&To(e,s,t)},Nl=exports&&exports.__importStar||(function(){var s=function(e){return s=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},s(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i=s(e),r=0;r p - : (p) => p && p.replaceAll(/\\/g, '/'); + (p) => String(p) + : (p) => String(p).replaceAll(/\\/g, '/'); //# sourceMappingURL=normalize-windows-path.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/tar/dist/commonjs/parse.js b/deps/npm/node_modules/tar/dist/commonjs/parse.js index 999873ec6403..2968e861ee68 100644 --- a/deps/npm/node_modules/tar/dist/commonjs/parse.js +++ b/deps/npm/node_modules/tar/dist/commonjs/parse.js @@ -60,6 +60,10 @@ const SAW_VALID_ENTRY = Symbol('sawValidEntry'); const SAW_NULL_BLOCK = Symbol('sawNullBlock'); const SAW_EOF = Symbol('sawEOF'); const CLOSESTREAM = Symbol('closeStream'); +const MAX_DECOMPRESSION_RATIO = 1000; +const COMPRESSEDBYTESREAD = Symbol('compressedBytesRead'); +const DECOMPRESSEDBYTESREAD = Symbol('decompressedBytesRead'); +const CHECKDECOMPRESSIONRATIO = Symbol('checkDecompressionRatio'); const noop = () => true; class Parser extends events_1.EventEmitter { file; @@ -68,6 +72,7 @@ class Parser extends events_1.EventEmitter { filter; brotli; zstd; + maxDecompressionRatio; writable = true; readable = false; [QUEUE] = []; @@ -87,6 +92,8 @@ class Parser extends events_1.EventEmitter { [WRITING] = false; [CONSUMING] = false; [EMITTEDEND] = false; + [COMPRESSEDBYTESREAD] = 0; + [DECOMPRESSEDBYTESREAD] = 0; constructor(opt = {}) { super(); this.file = opt.file || ''; @@ -109,6 +116,10 @@ class Parser extends events_1.EventEmitter { }); } this.strict = !!opt.strict; + this.maxDecompressionRatio = + typeof opt.maxDecompressionRatio === 'number' ? + opt.maxDecompressionRatio + : MAX_DECOMPRESSION_RATIO; this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize; this.filter = typeof opt.filter === 'function' ? opt.filter : noop; // Unlike gzip, brotli doesn't have any magic bytes to identify it @@ -362,11 +373,23 @@ class Parser extends events_1.EventEmitter { } } abort(error) { + if (this[ABORTED]) { + return; + } this[ABORTED] = true; this.emit('abort', error); // always throws, even in non-strict mode this.warn('TAR_ABORT', error, { recoverable: false }); } + [CHECKDECOMPRESSIONRATIO](chunk) { + this[DECOMPRESSEDBYTESREAD] += chunk.length; + const ratio = this[DECOMPRESSEDBYTESREAD] / this[COMPRESSEDBYTESREAD]; + if (ratio > this.maxDecompressionRatio) { + this.abort(new Error(`max decompression ratio exceeded: ${ratio.toFixed(2)} > ${this.maxDecompressionRatio}`)); + return false; + } + return true; + } write(chunk, encoding, cb) { if (typeof encoding === 'function') { cb = encoding; @@ -450,13 +473,22 @@ class Parser extends events_1.EventEmitter { this[UNZIP] === undefined ? new minizlib_1.Unzip({}) : isZstd ? new minizlib_1.ZstdDecompress({}) : new minizlib_1.BrotliDecompress({}); - this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk)); - this[UNZIP].on('error', er => this.abort(er)); + this[UNZIP].on('data', chunk => { + if (this[CHECKDECOMPRESSIONRATIO](chunk)) { + this[CONSUMECHUNK](chunk); + } + }); + this[UNZIP].on('error', er => { + if (!this[ABORTED]) { + this.abort(er); + } + }); this[UNZIP].on('end', () => { this[ENDED] = true; this[CONSUMECHUNK](); }); this[WRITING] = true; + this[COMPRESSEDBYTESREAD] += chunk.length; const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk); this[WRITING] = false; cb?.(); @@ -465,6 +497,7 @@ class Parser extends events_1.EventEmitter { } this[WRITING] = true; if (this[UNZIP]) { + this[COMPRESSEDBYTESREAD] += chunk.length; this[UNZIP].write(chunk); } else { @@ -495,7 +528,7 @@ class Parser extends events_1.EventEmitter { !this[CONSUMING]) { this[EMITTEDEND] = true; const entry = this[WRITEENTRY]; - if (entry && entry.blockRemain) { + if (entry?.blockRemain) { // truncated, likely a damaged file const have = this[BUFFER] ? this[BUFFER].length : 0; this.warn('TAR_BAD_ARCHIVE', `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`, { entry }); @@ -589,8 +622,10 @@ class Parser extends events_1.EventEmitter { if (!this[ABORTED]) { if (this[UNZIP]) { /* c8 ignore start */ - if (chunk) + if (chunk) { + this[COMPRESSEDBYTESREAD] += chunk.length; this[UNZIP].write(chunk); + } /* c8 ignore stop */ this[UNZIP].end(); } diff --git a/deps/npm/node_modules/tar/dist/commonjs/pax.js b/deps/npm/node_modules/tar/dist/commonjs/pax.js index d30c0f3efbe9..fce37f63058e 100644 --- a/deps/npm/node_modules/tar/dist/commonjs/pax.js +++ b/deps/npm/node_modules/tar/dist/commonjs/pax.js @@ -147,12 +147,36 @@ const parseKVLine = (set, line) => { 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) * 1000) - : /^[0-9]+$/.test(v) ? +v - : v; + const v = kv.join('=').replace(/\0.*/, ''); + switch (k) { + case 'path': + case 'linkpath': + case 'type': + case 'charset': + case 'comment': + case 'gname': + case 'uname': + set[k] = v; + break; + case 'ctime': + case 'atime': + case 'mtime': + set[k] = new Date(Number(v) * 1000); + break; + case 'size': + const s = +v; + if (s >= 0) + set[k] = s; + break; + case 'gid': + case 'uid': + case 'dev': + case 'ino': + case 'nlink': + case 'mode': + set[k] = +v; + break; + } return set; }; //# sourceMappingURL=pax.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/tar/dist/commonjs/unpack.js b/deps/npm/node_modules/tar/dist/commonjs/unpack.js index 3df1031d84cb..0e9f861abb87 100644 --- a/deps/npm/node_modules/tar/dist/commonjs/unpack.js +++ b/deps/npm/node_modules/tar/dist/commonjs/unpack.js @@ -185,7 +185,7 @@ class Unpack extends parse_js_1.Parser { // default true for root this.preserveOwner = opt.preserveOwner === undefined && typeof opt.uid !== 'number' ? - !!(process.getuid && process.getuid() === 0) + !!(process.getuid?.() === 0) : !!opt.preserveOwner; this.processUid = (this.preserveOwner || this.setOwner) && process.getuid ? @@ -406,7 +406,7 @@ class Unpack extends parse_js_1.Parser { } } [MKDIR](dir, mode, cb) { - (0, mkdir_js_1.mkdir)((0, normalize_windows_path_js_1.normalizeWindowsPath)(dir), { + void (0, mkdir_js_1.mkdir)((0, normalize_windows_path_js_1.normalizeWindowsPath)(dir), { uid: this.uid, gid: this.gid, processUid: this.processUid, diff --git a/deps/npm/node_modules/tar/dist/esm/header.js b/deps/npm/node_modules/tar/dist/esm/header.js index fe8c09928e46..068c4ea03988 100644 --- a/deps/npm/node_modules/tar/dist/esm/header.js +++ b/deps/npm/node_modules/tar/dist/esm/header.js @@ -5,6 +5,7 @@ import { posix as pathModule } from 'node:path'; import * as large from './large-numbers.js'; import * as types from './types.js'; +const notNegative = (n) => n === undefined || n < 0 ? undefined : n; export class Header { cksumValid = false; needPax = false; @@ -63,10 +64,9 @@ export class Header { exForFields?.uid ?? gexForFields?.uid ?? decNumber(buf, off + 108, 8); this.gid = exForFields?.gid ?? gexForFields?.gid ?? decNumber(buf, off + 116, 8); - this.size = - exForFields?.size ?? - gexForFields?.size ?? - decNumber(buf, off + 124, 12); + this.size = notNegative(exForFields?.size ?? + gexForFields?.size ?? + decNumber(buf, off + 124, 12)); this.mtime = exForFields?.mtime ?? gexForFields?.mtime ?? @@ -152,6 +152,7 @@ export class Header { // null/undefined values are ignored. return !(v === null || v === undefined || + (k === 'size' && Number(v) < 0) || (k === 'path' && gex) || (k === 'linkpath' && gex) || k === 'global'); diff --git a/deps/npm/node_modules/tar/dist/esm/index.min.js b/deps/npm/node_modules/tar/dist/esm/index.min.js index 57c1c7a4df9a..bf4036b4115e 100644 --- a/deps/npm/node_modules/tar/dist/esm/index.min.js +++ b/deps/npm/node_modules/tar/dist/esm/index.min.js @@ -1,4 +1,4 @@ -var Mr=Object.defineProperty;var Br=(s,t)=>{for(var e in t)Mr(s,e,{get:t[e],enumerable:!0})};import $r from"events";import I from"fs";import{EventEmitter as Li}from"node:events";import As from"node:stream";import{StringDecoder as Pr}from"node:string_decoder";var xs=typeof process=="object"&&process?process:{stdout:null,stderr:null},zr=s=>!!s&&typeof s=="object"&&(s instanceof A||s instanceof As||Ur(s)||Hr(s)),Ur=s=>!!s&&typeof s=="object"&&s instanceof Li&&typeof s.pipe=="function"&&s.pipe!==As.Writable.prototype.pipe,Hr=s=>!!s&&typeof s=="object"&&s instanceof Li&&typeof s.write=="function"&&typeof s.end=="function",q=Symbol("EOF"),Q=Symbol("maybeEmitEnd"),rt=Symbol("emittedEnd"),Le=Symbol("emittingEnd"),qt=Symbol("emittedError"),Ne=Symbol("closed"),Ls=Symbol("read"),De=Symbol("flush"),Ns=Symbol("flushChunk"),z=Symbol("encoding"),Mt=Symbol("decoder"),g=Symbol("flowing"),Qt=Symbol("paused"),Bt=Symbol("resume"),b=Symbol("buffer"),D=Symbol("pipes"),_=Symbol("bufferLength"),gi=Symbol("bufferPush"),Ae=Symbol("bufferShift"),L=Symbol("objectMode"),w=Symbol("destroyed"),bi=Symbol("error"),_i=Symbol("emitData"),Ds=Symbol("emitEnd"),Oi=Symbol("emitEnd2"),Z=Symbol("async"),Ti=Symbol("abort"),Ie=Symbol("aborted"),Jt=Symbol("signal"),Rt=Symbol("dataListeners"),F=Symbol("discarded"),jt=s=>Promise.resolve().then(s),Wr=s=>s(),Gr=s=>s==="end"||s==="finish"||s==="prefinish",Zr=s=>s instanceof ArrayBuffer||!!s&&typeof s=="object"&&s.constructor&&s.constructor.name==="ArrayBuffer"&&s.byteLength>=0,Yr=s=>!Buffer.isBuffer(s)&&ArrayBuffer.isView(s),Fe=class{src;dest;opts;ondrain;constructor(t,e,i){this.src=t,this.dest=e,this.opts=i,this.ondrain=()=>t[Bt](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(t){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},xi=class extends Fe{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(t,e,i){super(t,e,i),this.proxyErrors=r=>this.dest.emit("error",r),t.on("error",this.proxyErrors)}},Kr=s=>!!s.objectMode,Vr=s=>!s.objectMode&&!!s.encoding&&s.encoding!=="buffer",A=class extends Li{[g]=!1;[Qt]=!1;[D]=[];[b]=[];[L];[z];[Z];[Mt];[q]=!1;[rt]=!1;[Le]=!1;[Ne]=!1;[qt]=null;[_]=0;[w]=!1;[Jt];[Ie]=!1;[Rt]=0;[F]=!1;writable=!0;readable=!0;constructor(...t){let e=t[0]||{};if(super(),e.objectMode&&typeof e.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");Kr(e)?(this[L]=!0,this[z]=null):Vr(e)?(this[z]=e.encoding,this[L]=!1):(this[L]=!1,this[z]=null),this[Z]=!!e.async,this[Mt]=this[z]?new Pr(this[z]):null,e&&e.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[b]}),e&&e.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[D]});let{signal:i}=e;i&&(this[Jt]=i,i.aborted?this[Ti]():i.addEventListener("abort",()=>this[Ti]()))}get bufferLength(){return this[_]}get encoding(){return this[z]}set encoding(t){throw new Error("Encoding must be set at instantiation time")}setEncoding(t){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[L]}set objectMode(t){throw new Error("objectMode must be set at instantiation time")}get async(){return this[Z]}set async(t){this[Z]=this[Z]||!!t}[Ti](){this[Ie]=!0,this.emit("abort",this[Jt]?.reason),this.destroy(this[Jt]?.reason)}get aborted(){return this[Ie]}set aborted(t){}write(t,e,i){if(this[Ie])return!1;if(this[q])throw new Error("write after end");if(this[w])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof e=="function"&&(i=e,e="utf8"),e||(e="utf8");let r=this[Z]?jt:Wr;if(!this[L]&&!Buffer.isBuffer(t)){if(Yr(t))t=Buffer.from(t.buffer,t.byteOffset,t.byteLength);else if(Zr(t))t=Buffer.from(t);else if(typeof t!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[L]?(this[g]&&this[_]!==0&&this[De](!0),this[g]?this.emit("data",t):this[gi](t),this[_]!==0&&this.emit("readable"),i&&r(i),this[g]):t.length?(typeof t=="string"&&!(e===this[z]&&!this[Mt]?.lastNeed)&&(t=Buffer.from(t,e)),Buffer.isBuffer(t)&&this[z]&&(t=this[Mt].write(t)),this[g]&&this[_]!==0&&this[De](!0),this[g]?this.emit("data",t):this[gi](t),this[_]!==0&&this.emit("readable"),i&&r(i),this[g]):(this[_]!==0&&this.emit("readable"),i&&r(i),this[g])}read(t){if(this[w])return null;if(this[F]=!1,this[_]===0||t===0||t&&t>this[_])return this[Q](),null;this[L]&&(t=null),this[b].length>1&&!this[L]&&(this[b]=[this[z]?this[b].join(""):Buffer.concat(this[b],this[_])]);let e=this[Ls](t||null,this[b][0]);return this[Q](),e}[Ls](t,e){if(this[L])this[Ae]();else{let i=e;t===i.length||t===null?this[Ae]():typeof i=="string"?(this[b][0]=i.slice(t),e=i.slice(0,t),this[_]-=t):(this[b][0]=i.subarray(t),e=i.subarray(0,t),this[_]-=t)}return this.emit("data",e),!this[b].length&&!this[q]&&this.emit("drain"),e}end(t,e,i){return typeof t=="function"&&(i=t,t=void 0),typeof e=="function"&&(i=e,e="utf8"),t!==void 0&&this.write(t,e),i&&this.once("end",i),this[q]=!0,this.writable=!1,(this[g]||!this[Qt])&&this[Q](),this}[Bt](){this[w]||(!this[Rt]&&!this[D].length&&(this[F]=!0),this[Qt]=!1,this[g]=!0,this.emit("resume"),this[b].length?this[De]():this[q]?this[Q]():this.emit("drain"))}resume(){return this[Bt]()}pause(){this[g]=!1,this[Qt]=!0,this[F]=!1}get destroyed(){return this[w]}get flowing(){return this[g]}get paused(){return this[Qt]}[gi](t){this[L]?this[_]+=1:this[_]+=t.length,this[b].push(t)}[Ae](){return this[L]?this[_]-=1:this[_]-=this[b][0].length,this[b].shift()}[De](t=!1){do;while(this[Ns](this[Ae]())&&this[b].length);!t&&!this[b].length&&!this[q]&&this.emit("drain")}[Ns](t){return this.emit("data",t),this[g]}pipe(t,e){if(this[w])return t;this[F]=!1;let i=this[rt];return e=e||{},t===xs.stdout||t===xs.stderr?e.end=!1:e.end=e.end!==!1,e.proxyErrors=!!e.proxyErrors,i?e.end&&t.end():(this[D].push(e.proxyErrors?new xi(this,t,e):new Fe(this,t,e)),this[Z]?jt(()=>this[Bt]()):this[Bt]()),t}unpipe(t){let e=this[D].find(i=>i.dest===t);e&&(this[D].length===1?(this[g]&&this[Rt]===0&&(this[g]=!1),this[D]=[]):this[D].splice(this[D].indexOf(e),1),e.unpipe())}addListener(t,e){return this.on(t,e)}on(t,e){let i=super.on(t,e);if(t==="data")this[F]=!1,this[Rt]++,!this[D].length&&!this[g]&&this[Bt]();else if(t==="readable"&&this[_]!==0)super.emit("readable");else if(Gr(t)&&this[rt])super.emit(t),this.removeAllListeners(t);else if(t==="error"&&this[qt]){let r=e;this[Z]?jt(()=>r.call(this,this[qt])):r.call(this,this[qt])}return i}removeListener(t,e){return this.off(t,e)}off(t,e){let i=super.off(t,e);return t==="data"&&(this[Rt]=this.listeners("data").length,this[Rt]===0&&!this[F]&&!this[D].length&&(this[g]=!1)),i}removeAllListeners(t){let e=super.removeAllListeners(t);return(t==="data"||t===void 0)&&(this[Rt]=0,!this[F]&&!this[D].length&&(this[g]=!1)),e}get emittedEnd(){return this[rt]}[Q](){!this[Le]&&!this[rt]&&!this[w]&&this[b].length===0&&this[q]&&(this[Le]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[Ne]&&this.emit("close"),this[Le]=!1)}emit(t,...e){let i=e[0];if(t!=="error"&&t!=="close"&&t!==w&&this[w])return!1;if(t==="data")return!this[L]&&!i?!1:this[Z]?(jt(()=>this[_i](i)),!0):this[_i](i);if(t==="end")return this[Ds]();if(t==="close"){if(this[Ne]=!0,!this[rt]&&!this[w])return!1;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(t==="error"){this[qt]=i,super.emit(bi,i);let n=!this[Jt]||this.listeners("error").length?super.emit("error",i):!1;return this[Q](),n}else if(t==="resume"){let n=super.emit("resume");return this[Q](),n}else if(t==="finish"||t==="prefinish"){let n=super.emit(t);return this.removeAllListeners(t),n}let r=super.emit(t,...e);return this[Q](),r}[_i](t){for(let i of this[D])i.dest.write(t)===!1&&this.pause();let e=this[F]?!1:super.emit("data",t);return this[Q](),e}[Ds](){return this[rt]?!1:(this[rt]=!0,this.readable=!1,this[Z]?(jt(()=>this[Oi]()),!0):this[Oi]())}[Oi](){if(this[Mt]){let e=this[Mt].end();if(e){for(let i of this[D])i.dest.write(e);this[F]||super.emit("data",e)}}for(let e of this[D])e.end();let t=super.emit("end");return this.removeAllListeners("end"),t}async collect(){let t=Object.assign([],{dataLength:0});this[L]||(t.dataLength=0);let e=this.promise();return this.on("data",i=>{t.push(i),this[L]||(t.dataLength+=i.length)}),await e,t}async concat(){if(this[L])throw new Error("cannot concat in objectMode");let t=await this.collect();return this[z]?t.join(""):Buffer.concat(t,t.dataLength)}async promise(){return new Promise((t,e)=>{this.on(w,()=>e(new Error("stream destroyed"))),this.on("error",i=>e(i)),this.on("end",()=>t())})}[Symbol.asyncIterator](){this[F]=!1;let t=!1,e=async()=>(this.pause(),t=!0,{value:void 0,done:!0});return{next:()=>{if(t)return e();let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[q])return e();let n,o,a=d=>{this.off("data",h),this.off("end",l),this.off(w,c),e(),o(d)},h=d=>{this.off("error",a),this.off("end",l),this.off(w,c),this.pause(),n({value:d,done:!!this[q]})},l=()=>{this.off("error",a),this.off("data",h),this.off(w,c),e(),n({done:!0,value:void 0})},c=()=>a(new Error("stream destroyed"));return new Promise((d,S)=>{o=S,n=d,this.once(w,c),this.once("error",a),this.once("end",l),this.once("data",h)})},throw:e,return:e,[Symbol.asyncIterator](){return this},[Symbol.asyncDispose]:async()=>{}}}[Symbol.iterator](){this[F]=!1;let t=!1,e=()=>(this.pause(),this.off(bi,e),this.off(w,e),this.off("end",e),t=!0,{done:!0,value:void 0}),i=()=>{if(t)return e();let r=this.read();return r===null?e():{done:!1,value:r}};return this.once("end",e),this.once(bi,e),this.once(w,e),{next:i,throw:e,return:e,[Symbol.iterator](){return this},[Symbol.dispose]:()=>{}}}destroy(t){if(this[w])return t?this.emit("error",t):this.emit(w),this;this[w]=!0,this[F]=!0,this[b].length=0,this[_]=0;let e=this;return typeof e.close=="function"&&!this[Ne]&&e.close(),t?this.emit("error",t):this.emit(w),this}static get isStream(){return zr}};var Xr=I.writev,ot=Symbol("_autoClose"),H=Symbol("_close"),te=Symbol("_ended"),m=Symbol("_fd"),Ni=Symbol("_finished"),j=Symbol("_flags"),Di=Symbol("_flush"),Ci=Symbol("_handleChunk"),ki=Symbol("_makeBuf"),ie=Symbol("_mode"),Ce=Symbol("_needDrain"),Ut=Symbol("_onerror"),Ht=Symbol("_onopen"),Ai=Symbol("_onread"),Pt=Symbol("_onwrite"),ht=Symbol("_open"),U=Symbol("_path"),nt=Symbol("_pos"),Y=Symbol("_queue"),zt=Symbol("_read"),Ii=Symbol("_readSize"),J=Symbol("_reading"),ee=Symbol("_remain"),Fi=Symbol("_size"),ke=Symbol("_write"),gt=Symbol("_writing"),ve=Symbol("_defaultFlag"),bt=Symbol("_errored"),_t=class extends A{[bt]=!1;[m];[U];[Ii];[J]=!1;[Fi];[ee];[ot];constructor(t,e){if(e=e||{},super(e),this.readable=!0,this.writable=!1,typeof t!="string")throw new TypeError("path must be a string");this[bt]=!1,this[m]=typeof e.fd=="number"?e.fd:void 0,this[U]=t,this[Ii]=e.readSize||16*1024*1024,this[J]=!1,this[Fi]=typeof e.size=="number"?e.size:1/0,this[ee]=this[Fi],this[ot]=typeof e.autoClose=="boolean"?e.autoClose:!0,typeof this[m]=="number"?this[zt]():this[ht]()}get fd(){return this[m]}get path(){return this[U]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[ht](){I.open(this[U],"r",(t,e)=>this[Ht](t,e))}[Ht](t,e){t?this[Ut](t):(this[m]=e,this.emit("open",e),this[zt]())}[ki](){return Buffer.allocUnsafe(Math.min(this[Ii],this[ee]))}[zt](){if(!this[J]){this[J]=!0;let t=this[ki]();if(t.length===0)return process.nextTick(()=>this[Ai](null,0,t));I.read(this[m],t,0,t.length,null,(e,i,r)=>this[Ai](e,i,r))}}[Ai](t,e,i){this[J]=!1,t?this[Ut](t):this[Ci](e,i)&&this[zt]()}[H](){if(this[ot]&&typeof this[m]=="number"){let t=this[m];this[m]=void 0,I.close(t,e=>e?this.emit("error",e):this.emit("close"))}}[Ut](t){this[J]=!0,this[H](),this.emit("error",t)}[Ci](t,e){let i=!1;return this[ee]-=t,t>0&&(i=super.write(tthis[Ht](t,e))}[Ht](t,e){this[ve]&&this[j]==="r+"&&t&&t.code==="ENOENT"?(this[j]="w",this[ht]()):t?this[Ut](t):(this[m]=e,this.emit("open",e),this[gt]||this[Di]())}end(t,e){return t&&this.write(t,e),this[te]=!0,!this[gt]&&!this[Y].length&&typeof this[m]=="number"&&this[Pt](null,0),this}write(t,e){return typeof t=="string"&&(t=Buffer.from(t,e)),this[te]?(this.emit("error",new Error("write() after end()")),!1):this[m]===void 0||this[gt]||this[Y].length?(this[Y].push(t),this[Ce]=!0,!1):(this[gt]=!0,this[ke](t),!0)}[ke](t){I.write(this[m],t,0,t.length,this[nt],(e,i)=>this[Pt](e,i))}[Pt](t,e){t?this[Ut](t):(this[nt]!==void 0&&typeof e=="number"&&(this[nt]+=e),this[Y].length?this[Di]():(this[gt]=!1,this[te]&&!this[Ni]?(this[Ni]=!0,this[H](),this.emit("finish")):this[Ce]&&(this[Ce]=!1,this.emit("drain"))))}[Di](){if(this[Y].length===0)this[te]&&this[Pt](null,0);else if(this[Y].length===1)this[ke](this[Y].pop());else{let t=this[Y];this[Y]=[],Xr(this[m],t,this[nt],(e,i)=>this[Pt](e,i))}}[H](){if(this[ot]&&typeof this[m]=="number"){let t=this[m];this[m]=void 0,I.close(t,e=>e?this.emit("error",e):this.emit("close"))}}},Wt=class extends tt{[ht](){let t;if(this[ve]&&this[j]==="r+")try{t=I.openSync(this[U],this[j],this[ie])}catch(e){if(e?.code==="ENOENT")return this[j]="w",this[ht]();throw e}else t=I.openSync(this[U],this[j],this[ie]);this[Ht](null,t)}[H](){if(this[ot]&&typeof this[m]=="number"){let t=this[m];this[m]=void 0,I.closeSync(t),this.emit("close")}}[ke](t){let e=!0;try{this[Pt](null,I.writeSync(this[m],t,0,t.length,this[nt])),e=!1}finally{if(e)try{this[H]()}catch{}}}};import hr from"node:path";import Kt from"node:fs";import{dirname as Nn,parse as Dn}from"path";var qr=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"],["onentry","onReadEntry"]]),Is=s=>!!s.sync&&!!s.file,Fs=s=>!s.sync&&!!s.file,Cs=s=>!!s.sync&&!s.file,ks=s=>!s.sync&&!s.file;var vs=s=>!!s.file;var Qr=s=>{let t=qr.get(s);return t||s},se=(s={})=>{if(!s)return{};let t={};for(let[e,i]of Object.entries(s)){let r=Qr(e);t[r]=i}return t.chmod===void 0&&t.noChmod===!1&&(t.chmod=!0),delete t.noChmod,t};var K=(s,t,e,i,r)=>Object.assign((n=[],o,a)=>{Array.isArray(n)&&(o=n,n={}),typeof o=="function"&&(a=o,o=void 0),o=o?Array.from(o):[];let h=se(n);if(r?.(h,o),Is(h)){if(typeof a=="function")throw new TypeError("callback not supported for sync tar functions");return s(h,o)}else if(Fs(h)){let l=t(h,o);return a?l.then(()=>a(),a):l}else if(Cs(h)){if(typeof a=="function")throw new TypeError("callback not supported for sync tar functions");return e(h,o)}else if(ks(h)){if(typeof a=="function")throw new TypeError("callback only supported with file option");return i(h,o)}throw new Error("impossible options??")},{syncFile:s,asyncFile:t,syncNoFile:e,asyncNoFile:i,validate:r});import{EventEmitter as On}from"events";import Pi from"assert";import{Buffer as Ot}from"buffer";import*as Ms from"zlib";import Jr from"zlib";var jr=Jr.constants||{ZLIB_VERNUM:4736},M=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},jr));var tn=Ot.concat,Bs=Object.getOwnPropertyDescriptor(Ot,"concat"),en=s=>s,Mi=Bs?.writable===!0||Bs?.set!==void 0?s=>{Ot.concat=s?en:tn}:s=>{},Tt=Symbol("_superWrite"),Gt=class extends Error{code;errno;constructor(t,e){super("zlib: "+t.message,{cause:t}),this.code=t.code,this.errno=t.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+t.message,Error.captureStackTrace(this,e??this.constructor)}get name(){return"ZlibError"}},Bi=Symbol("flushFlag"),re=class extends A{#t=!1;#i=!1;#s;#n;#r;#e;#o;get sawError(){return this.#t}get handle(){return this.#e}get flushFlag(){return this.#s}constructor(t,e){if(!t||typeof t!="object")throw new TypeError("invalid options for ZlibBase constructor");if(super(t),this.#s=t.flush??0,this.#n=t.finishFlush??0,this.#r=t.fullFlushFlag??0,typeof Ms[e]!="function")throw new TypeError("Compression method not supported: "+e);try{this.#e=new Ms[e](t)}catch(i){throw new Gt(i,this.constructor)}this.#o=i=>{this.#t||(this.#t=!0,this.close(),this.emit("error",i))},this.#e?.on("error",i=>this.#o(new Gt(i))),this.once("end",()=>this.close)}close(){this.#e&&(this.#e.close(),this.#e=void 0,this.emit("close"))}reset(){if(!this.#t)return Pi(this.#e,"zlib binding closed"),this.#e.reset?.()}flush(t){this.ended||(typeof t!="number"&&(t=this.#r),this.write(Object.assign(Ot.alloc(0),{[Bi]:t})))}end(t,e,i){return typeof t=="function"&&(i=t,e=void 0,t=void 0),typeof e=="function"&&(i=e,e=void 0),t&&(e?this.write(t,e):this.write(t)),this.flush(this.#n),this.#i=!0,super.end(i)}get ended(){return this.#i}[Tt](t){return super.write(t)}write(t,e,i){if(typeof e=="function"&&(i=e,e="utf8"),typeof t=="string"&&(t=Ot.from(t,e)),this.#t)return;Pi(this.#e,"zlib binding closed");let r=this.#e._handle,n=r.close;r.close=()=>{};let o=this.#e.close;this.#e.close=()=>{},Mi(!0);let a;try{let l=typeof t[Bi]=="number"?t[Bi]:this.#s;a=this.#e._processChunk(t,l),Mi(!1)}catch(l){Mi(!1),this.#o(new Gt(l,this.write))}finally{this.#e&&(this.#e._handle=r,r.close=n,this.#e.close=o,this.#e.removeAllListeners("error"))}this.#e&&this.#e.on("error",l=>this.#o(new Gt(l,this.write)));let h;if(a)if(Array.isArray(a)&&a.length>0){let l=a[0];h=this[Tt](Ot.from(l));for(let c=1;c{typeof r=="function"&&(n=r,r=this.flushFlag),this.flush(r),n?.()};try{this.handle.params(t,e)}finally{this.handle.flush=i}this.handle&&(this.#t=t,this.#i=e)}}}};var Pe=class extends Be{#t;constructor(t){super(t,"Gzip"),this.#t=t&&!!t.portable}[Tt](t){return this.#t?(this.#t=!1,t[9]=255,super[Tt](t)):super[Tt](t)}};var ze=class extends Be{constructor(t){super(t,"Unzip")}},Ue=class extends re{constructor(t,e){t=t||{},t.flush=t.flush||M.BROTLI_OPERATION_PROCESS,t.finishFlush=t.finishFlush||M.BROTLI_OPERATION_FINISH,t.fullFlushFlag=M.BROTLI_OPERATION_FLUSH,super(t,e)}},He=class extends Ue{constructor(t){super(t,"BrotliCompress")}},We=class extends Ue{constructor(t){super(t,"BrotliDecompress")}},Ge=class extends re{constructor(t,e){t=t||{},t.flush=t.flush||M.ZSTD_e_continue,t.finishFlush=t.finishFlush||M.ZSTD_e_end,t.fullFlushFlag=M.ZSTD_e_flush,super(t,e)}},Ze=class extends Ge{constructor(t){super(t,"ZstdCompress")}},Ye=class extends Ge{constructor(t){super(t,"ZstdDecompress")}};import{posix as Zt}from"node:path";var Ps=(s,t)=>{if(Number.isSafeInteger(s))s<0?nn(s,t):rn(s,t);else throw Error("cannot encode number outside of javascript safe integer range");return t},rn=(s,t)=>{t[0]=128;for(var e=t.length;e>1;e--)t[e-1]=s&255,s=Math.floor(s/256)},nn=(s,t)=>{t[0]=255;var e=!1;s=s*-1;for(var i=t.length;i>1;i--){var r=s&255;s=Math.floor(s/256),e?t[i-1]=Us(r):r===0?t[i-1]=0:(e=!0,t[i-1]=Hs(r))}},zs=s=>{let t=s[0],e=t===128?hn(s.subarray(1,s.length)):t===255?on(s):null;if(e===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(e))throw Error("parsed number outside of javascript safe integer range");return e},on=s=>{for(var t=s.length,e=0,i=!1,r=t-1;r>-1;r--){var n=Number(s[r]),o;i?o=Us(n):n===0?o=n:(i=!0,o=Hs(n)),o!==0&&(e-=o*Math.pow(256,t-r-1))}return e},hn=s=>{for(var t=s.length,e=0,i=t-1;i>-1;i--){var r=Number(s[i]);r!==0&&(e+=r*Math.pow(256,t-i-1))}return e},Us=s=>(255^s)&255,Hs=s=>(255^s)+1&255;var Ui={};Br(Ui,{code:()=>Ke,isCode:()=>ne,isName:()=>ln,name:()=>oe,normalFsTypes:()=>zi});var ne=s=>oe.has(s),ln=s=>Ke.has(s),zi=new Set(["0","","1","2","3","4","5","6","7","D"]),oe=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]),Ke=new Map(Array.from(oe).map(s=>[s[1],s[0]]));var C=class{cksumValid=!1;needPax=!1;nullBlock=!1;block;path;mode;uid;gid;size;cksum;#t="Unsupported";linkpath;uname;gname;devmaj=0;devmin=0;atime;ctime;mtime;charset;comment;constructor(t,e=0,i,r){Buffer.isBuffer(t)?this.decode(t,e||0,i,r):t&&this.#i(t)}decode(t,e,i,r){if(e||(e=0),!t||!(t.length>=e+512))throw new Error("need 512 bytes for header");let n=xt(t,e+156,1),o=zi.has(n),a=o?i:void 0,h=o?r:void 0;if(this.path=a?.path??xt(t,e,100),this.mode=a?.mode??h?.mode??at(t,e+100,8),this.uid=a?.uid??h?.uid??at(t,e+108,8),this.gid=a?.gid??h?.gid??at(t,e+116,8),this.size=a?.size??h?.size??at(t,e+124,12),this.mtime=a?.mtime??h?.mtime??Hi(t,e+136,12),this.cksum=at(t,e+148,12),h&&this.#i(h,!0),a&&this.#i(a),ne(n)&&(this.#t=n||"0"),this.#t==="0"&&this.path.slice(-1)==="/"&&(this.#t="5"),this.#t==="5"&&(this.size=0),this.linkpath=xt(t,e+157,100),t.subarray(e+257,e+265).toString()==="ustar\x0000")if(this.uname=a?.uname??h?.uname??xt(t,e+265,32),this.gname=a?.gname??h?.gname??xt(t,e+297,32),this.devmaj=a?.devmaj??h?.devmaj??at(t,e+329,8)??0,this.devmin=a?.devmin??h?.devmin??at(t,e+337,8)??0,t[e+475]!==0){let c=xt(t,e+345,155);this.path=c+"/"+this.path}else{let c=xt(t,e+345,130);c&&(this.path=c+"/"+this.path),this.atime=i?.atime??r?.atime??Hi(t,e+476,12),this.ctime=i?.ctime??r?.ctime??Hi(t,e+488,12)}let l=256;for(let c=e;c!(r==null||i==="path"&&e||i==="linkpath"&&e||i==="global"))))}encode(t,e=0){if(t||(t=this.block=Buffer.alloc(512)),this.#t==="Unsupported"&&(this.#t="0"),!(t.length>=e+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,r=cn(this.path||"",i),n=r[0],o=r[1];this.needPax=!!r[2],this.needPax=Lt(t,e,100,n)||this.needPax,this.needPax=lt(t,e+100,8,this.mode)||this.needPax,this.needPax=lt(t,e+108,8,this.uid)||this.needPax,this.needPax=lt(t,e+116,8,this.gid)||this.needPax,this.needPax=lt(t,e+124,12,this.size)||this.needPax,this.needPax=Wi(t,e+136,12,this.mtime)||this.needPax,t[e+156]=Number(this.#t.codePointAt(0)),this.needPax=Lt(t,e+157,100,this.linkpath)||this.needPax,t.write("ustar\x0000",e+257,8),this.needPax=Lt(t,e+265,32,this.uname)||this.needPax,this.needPax=Lt(t,e+297,32,this.gname)||this.needPax,this.needPax=lt(t,e+329,8,this.devmaj)||this.needPax,this.needPax=lt(t,e+337,8,this.devmin)||this.needPax,this.needPax=Lt(t,e+345,i,o)||this.needPax,t[e+475]!==0?this.needPax=Lt(t,e+345,155,o)||this.needPax:(this.needPax=Lt(t,e+345,130,o)||this.needPax,this.needPax=Wi(t,e+476,12,this.atime)||this.needPax,this.needPax=Wi(t,e+488,12,this.ctime)||this.needPax);let a=256;for(let h=e;h{let i=s,r="",n,o=Zt.parse(s).root||".";if(Buffer.byteLength(i)<100)n=[i,r,!1];else{r=Zt.dirname(i),i=Zt.basename(i);do Buffer.byteLength(i)<=100&&Buffer.byteLength(r)<=t?n=[i,r,!1]:Buffer.byteLength(i)>100&&Buffer.byteLength(r)<=t?n=[i.slice(0,99),r,!0]:(i=Zt.join(Zt.basename(r),i),r=Zt.dirname(r));while(r!==o&&n===void 0);n||(n=[s.slice(0,99),"",!0])}return n},xt=(s,t,e)=>s.subarray(t,t+e).toString("utf8").replace(/\0.*/,""),Hi=(s,t,e)=>fn(at(s,t,e)),fn=s=>s===void 0?void 0:new Date(s*1e3),at=(s,t,e)=>Number(s[t])&128?zs(s.subarray(t,t+e)):un(s,t,e),dn=s=>isNaN(s)?void 0:s,un=(s,t,e)=>dn(parseInt(s.subarray(t,t+e).toString("utf8").replace(/\0.*$/,"").trim(),8)),mn={12:8589934591,8:2097151},lt=(s,t,e,i)=>i===void 0?!1:i>mn[e]||i<0?(Ps(i,s.subarray(t,t+e)),!0):(pn(s,t,e,i),!1),pn=(s,t,e,i)=>s.write(En(i,e),t,e,"ascii"),En=(s,t)=>wn(Math.floor(s).toString(8),t),wn=(s,t)=>(s.length===t-1?s:new Array(t-s.length-1).join("0")+s+" ")+"\0",Wi=(s,t,e,i)=>i===void 0?!1:lt(s,t,e,i.getTime()/1e3),Sn=new Array(156).join("\0"),Lt=(s,t,e,i)=>i===void 0?!1:(s.write(i+Sn,t,e,"utf8"),i.length!==Buffer.byteLength(i)||i.length>e);import{basename as yn}from"node:path";var ct=class s{atime;mtime;ctime;charset;comment;gid;uid;gname;uname;linkpath;dev;ino;nlink;path;size;mode;global;constructor(t,e=!1){this.atime=t.atime,this.charset=t.charset,this.comment=t.comment,this.ctime=t.ctime,this.dev=t.dev,this.gid=t.gid,this.global=e,this.gname=t.gname,this.ino=t.ino,this.linkpath=t.linkpath,this.mtime=t.mtime,this.nlink=t.nlink,this.path=t.path,this.size=t.size,this.uid=t.uid,this.uname=t.uname}encode(){let t=this.encodeBody();if(t==="")return Buffer.allocUnsafe(0);let e=Buffer.byteLength(t),i=512*Math.ceil(1+e/512),r=Buffer.allocUnsafe(i);for(let n=0;n<512;n++)r[n]=0;new C({path:("PaxHeader/"+yn(this.path??"")).slice(0,99),mode:this.mode||420,uid:this.uid,gid:this.gid,size:e,mtime:this.mtime,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime,ctime:this.ctime}).encode(r),r.write(t,512,e,"utf8");for(let n=e+512;n=Math.pow(10,o)&&(o+=1),o+n+r}static parse(t,e,i=!1){return new s(Rn(gn(t),e),i)}},Rn=(s,t)=>t?Object.assign({},t,s):s,gn=s=>s.replace(/\n$/,"").split(` -`).reduce(bn,Object.create(null)),bn=(s,t)=>{let e=parseInt(t,10);if(e!==Buffer.byteLength(t)+1)return s;t=t.slice((e+" ").length);let i=t.split("="),r=i.shift();if(!r)return s;let n=r.replace(/^SCHILY\.(dev|ino|nlink)/,"$1"),o=i.join("=");return s[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(Number(o)*1e3):/^[0-9]+$/.test(o)?+o:o,s};var _n=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,f=_n!=="win32"?s=>s:s=>s&&s.replaceAll(/\\/g,"/");var Ve=class extends A{extended;globalExtended;header;startBlockSize;blockRemain;remain;type;meta=!1;ignore=!1;path;mode;uid;gid;uname;gname;size=0;mtime;atime;ctime;linkpath;dev;ino;nlink;invalid=!1;absolute;unsupported=!1;constructor(t,e,i){switch(super({}),this.pause(),this.extended=e,this.globalExtended=i,this.header=t,this.remain=t.size??0,this.startBlockSize=512*Math.ceil(this.remain/512),this.blockRemain=this.startBlockSize,this.type=t.type,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}if(!t.path)throw new Error("no path provided for tar.ReadEntry");this.path=f(t.path),this.mode=t.mode,this.mode&&(this.mode=this.mode&4095),this.uid=t.uid,this.gid=t.gid,this.uname=t.uname,this.gname=t.gname,this.size=this.remain,this.mtime=t.mtime,this.atime=t.atime,this.ctime=t.ctime,this.linkpath=t.linkpath?f(t.linkpath):void 0,this.uname=t.uname,this.gname=t.gname,e&&this.#t(e),i&&this.#t(i,!0)}write(t){let e=t.length;if(e>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,r=this.blockRemain;return this.remain=Math.max(0,i-e),this.blockRemain=Math.max(0,r-e),this.ignore?!0:i>=e?super.write(t):super.write(t.subarray(0,i))}#t(t,e=!1){t.path&&(t.path=f(t.path)),t.linkpath&&(t.linkpath=f(t.linkpath)),Object.assign(this,Object.fromEntries(Object.entries(t).filter(([i,r])=>!(r==null||i==="path"&&e))))}};var Nt=(s,t,e,i={})=>{s.file&&(i.file=s.file),s.cwd&&(i.cwd=s.cwd),i.code=e instanceof Error&&e.code||t,i.tarCode=t,!s.strict&&i.recoverable!==!1?(e instanceof Error&&(i=Object.assign(e,i),e=e.message),s.emit("warn",t,e,i)):e instanceof Error?s.emit("error",Object.assign(e,i)):s.emit("error",Object.assign(new Error(`${t}: ${e}`),i))};var Tn=1024*1024,Vi=Buffer.from([31,139]),$i=Buffer.from([40,181,47,253]),xn=Math.max(Vi.length,$i.length),B=Symbol("state"),Dt=Symbol("writeEntry"),et=Symbol("readEntry"),Gi=Symbol("nextEntry"),Ws=Symbol("processEntry"),V=Symbol("extendedHeader"),he=Symbol("globalExtendedHeader"),ft=Symbol("meta"),Gs=Symbol("emitMeta"),p=Symbol("buffer"),it=Symbol("queue"),dt=Symbol("ended"),Zi=Symbol("emittedEnd"),At=Symbol("emit"),y=Symbol("unzip"),$e=Symbol("consumeChunk"),Xe=Symbol("consumeChunkSub"),Yi=Symbol("consumeBody"),Zs=Symbol("consumeMeta"),Ys=Symbol("consumeHeader"),ae=Symbol("consuming"),Ki=Symbol("bufferConcat"),qe=Symbol("maybeEnd"),Yt=Symbol("writing"),ut=Symbol("aborted"),Qe=Symbol("onDone"),It=Symbol("sawValidEntry"),Je=Symbol("sawNullBlock"),je=Symbol("sawEOF"),Ks=Symbol("closeStream"),Ln=()=>!0,st=class extends On{file;strict;maxMetaEntrySize;filter;brotli;zstd;writable=!0;readable=!1;[it]=[];[p];[et];[Dt];[B]="begin";[ft]="";[V];[he];[dt]=!1;[y];[ut]=!1;[It];[Je]=!1;[je]=!1;[Yt]=!1;[ae]=!1;[Zi]=!1;constructor(t={}){super(),this.file=t.file||"",this.on(Qe,()=>{(this[B]==="begin"||this[It]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),t.ondone?this.on(Qe,t.ondone):this.on(Qe,()=>{this.emit("prefinish"),this.emit("finish"),this.emit("end")}),this.strict=!!t.strict,this.maxMetaEntrySize=t.maxMetaEntrySize||Tn,this.filter=typeof t.filter=="function"?t.filter:Ln;let e=t.file&&(t.file.endsWith(".tar.br")||t.file.endsWith(".tbr"));this.brotli=!(t.gzip||t.zstd)&&t.brotli!==void 0?t.brotli:e?void 0:!1;let i=t.file&&(t.file.endsWith(".tar.zst")||t.file.endsWith(".tzst"));this.zstd=!(t.gzip||t.brotli)&&t.zstd!==void 0?t.zstd:i?!0:void 0,this.on("end",()=>this[Ks]()),typeof t.onwarn=="function"&&this.on("warn",t.onwarn),typeof t.onReadEntry=="function"&&this.on("entry",t.onReadEntry)}warn(t,e,i={}){Nt(this,t,e,i)}[Ys](t,e){this[It]===void 0&&(this[It]=!1);let i;try{i=new C(t,e,this[V],this[he])}catch(r){return this.warn("TAR_ENTRY_INVALID",r)}if(i.nullBlock)this[Je]?(this[je]=!0,this[B]==="begin"&&(this[B]="header"),this[At]("eof")):(this[Je]=!0,this[At]("nullBlock"));else if(this[Je]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let r=i.type;if(/^(Symbolic)?Link$/.test(r)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(r)&&!/^(Global)?ExtendedHeader$/.test(r)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let n=this[Dt]=new Ve(i,this[V],this[he]);if(!this[It])if(n.remain){let o=()=>{n.invalid||(this[It]=!0)};n.on("end",o)}else this[It]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[At]("ignoredEntry",n),this[B]="ignore",n.resume()):n.size>0&&(this[ft]="",n.on("data",o=>this[ft]+=o),this[B]="meta"):(this[V]=void 0,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[At]("ignoredEntry",n),this[B]=n.remain?"ignore":"header",n.resume()):(n.remain?this[B]="body":(this[B]="header",n.end()),this[et]?this[it].push(n):(this[it].push(n),this[Gi]())))}}}[Ks](){queueMicrotask(()=>this.emit("close"))}[Ws](t){let e=!0;if(!t)this[et]=void 0,e=!1;else if(Array.isArray(t)){let[i,...r]=t;this.emit(i,...r)}else this[et]=t,this.emit("entry",t),t.emittedEnd||(t.on("end",()=>this[Gi]()),e=!1);return e}[Gi](){do;while(this[Ws](this[it].shift()));if(this[it].length===0){let t=this[et];!t||t.flowing||t.size===t.remain?this[Yt]||this.emit("drain"):t.once("drain",()=>this.emit("drain"))}}[Yi](t,e){let i=this[Dt];if(!i)throw new Error("attempt to consume body without entry??");let r=i.blockRemain??0,n=r>=t.length&&e===0?t:t.subarray(e,e+r);return i.write(n),i.blockRemain||(this[B]="header",this[Dt]=void 0,i.end()),n.length}[Zs](t,e){let i=this[Dt],r=this[Yi](t,e);return!this[Dt]&&i&&this[Gs](i),r}[At](t,e,i){this[it].length===0&&!this[et]?this.emit(t,e,i):this[it].push([t,e,i])}[Gs](t){switch(this[At]("meta",this[ft]),t.type){case"ExtendedHeader":case"OldExtendedHeader":this[V]=ct.parse(this[ft],this[V],!1);break;case"GlobalExtendedHeader":this[he]=ct.parse(this[ft],this[he],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":{let e=this[V]??Object.create(null);this[V]=e,e.path=this[ft].replace(/\0.*/,"");break}case"NextFileHasLongLinkpath":{let e=this[V]||Object.create(null);this[V]=e,e.linkpath=this[ft].replace(/\0.*/,"");break}default:throw new Error("unknown meta: "+t.type)}}abort(t){this[ut]=!0,this.emit("abort",t),this.warn("TAR_ABORT",t,{recoverable:!1})}write(t,e,i){if(typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,typeof e=="string"?e:"utf8")),this[ut])return i?.(),!1;if((this[y]===void 0||this.brotli===void 0&&this[y]===!1)&&t){if(this[p]&&(t=Buffer.concat([this[p],t]),this[p]=void 0),t.lengththis[$e](c)),this[y].on("error",c=>this.abort(c)),this[y].on("end",()=>{this[dt]=!0,this[$e]()}),this[Yt]=!0;let l=!!this[y][h?"end":"write"](t);return this[Yt]=!1,i?.(),l}}this[Yt]=!0,this[y]?this[y].write(t):this[$e](t),this[Yt]=!1;let n=this[it].length>0?!1:this[et]?this[et].flowing:!0;return!n&&this[it].length===0&&this[et]?.once("drain",()=>this.emit("drain")),i?.(),n}[Ki](t){t&&!this[ut]&&(this[p]=this[p]?Buffer.concat([this[p],t]):t)}[qe](){if(this[dt]&&!this[Zi]&&!this[ut]&&!this[ae]){this[Zi]=!0;let t=this[Dt];if(t&&t.blockRemain){let e=this[p]?this[p].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${t.blockRemain} more bytes, only ${e} available)`,{entry:t}),this[p]&&t.write(this[p]),t.end()}this[At](Qe)}}[$e](t){if(this[ae]&&t)this[Ki](t);else if(!t&&!this[p])this[qe]();else if(t){if(this[ae]=!0,this[p]){this[Ki](t);let e=this[p];this[p]=void 0,this[Xe](e)}else this[Xe](t);for(;this[p]&&this[p]?.length>=512&&!this[ut]&&!this[je];){let e=this[p];this[p]=void 0,this[Xe](e)}this[ae]=!1}(!this[p]||this[dt])&&this[qe]()}[Xe](t){let e=0,i=t.length;for(;e+512<=i&&!this[ut]&&!this[je];)switch(this[B]){case"begin":case"header":this[Ys](t,e),e+=512;break;case"ignore":case"body":e+=this[Yi](t,e);break;case"meta":e+=this[Zs](t,e);break;default:throw new Error("invalid state: "+this[B])}e{let t=s.length-1,e=-1;for(;t>-1&&s.charAt(t)==="/";)e=t,t--;return e===-1?s:s.slice(0,e)};var An=s=>{let t=s.onReadEntry;s.onReadEntry=t?e=>{t(e),e.resume()}:e=>e.resume()},Xi=(s,t)=>{let e=new Map(t.map(n=>[mt(n),!0])),i=s.filter,r=(n,o="")=>{let a=o||Dn(n).root||".",h;if(n===a)h=!1;else{let l=e.get(n);h=l!==void 0?l:r(Nn(n),a)}return e.set(n,h),h};s.filter=i?(n,o)=>i(n,o)&&r(mt(n)):n=>r(mt(n))},In=s=>{let t=new st(s),e=s.file,i;try{i=Kt.openSync(e,"r");let r=Kt.fstatSync(i),n=s.maxReadSize||16*1024*1024;if(r.size{let e=new st(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,a)=>{e.on("error",a),e.on("end",o),Kt.stat(r,(h,l)=>{if(h)a(h);else{let c=new _t(r,{readSize:i,size:l.size});c.on("error",a),c.pipe(e)}})})},Ft=K(In,Fn,s=>new st(s),s=>new st(s),(s,t)=>{t?.length&&Xi(s,t),s.noResume||An(s)});import ui from"fs";import $ from"fs";import qs from"path";var qi=(s,t,e)=>(s&=4095,e&&(s=(s|384)&-19),t&&(s&256&&(s|=64),s&32&&(s|=8),s&4&&(s|=1)),s);import{win32 as Cn}from"node:path";var{isAbsolute:kn,parse:Vs}=Cn,le=s=>{let t="",e=Vs(s);for(;kn(s)||e.root;){let i=s.charAt(0)==="/"&&s.slice(0,4)!=="//?/"?"/":e.root;s=s.slice(i.length),t+=i,e=Vs(s)}return[t,s]};var ti=["|","<",">","?",":"],Qi=ti.map(s=>String.fromCodePoint(61440+Number(s.codePointAt(0)))),vn=new Map(ti.map((s,t)=>[s,Qi[t]])),Mn=new Map(Qi.map((s,t)=>[s,ti[t]])),Ji=s=>ti.reduce((t,e)=>t.split(e).join(vn.get(e)),s),$s=s=>Qi.reduce((t,e)=>t.split(e).join(Mn.get(e)),s);var er=(s,t)=>t?(s=f(s).replace(/^\.(\/|$)/,""),mt(t)+"/"+s):f(s),Bn=16*1024*1024,Qs=Symbol("process"),Js=Symbol("file"),js=Symbol("directory"),ts=Symbol("symlink"),tr=Symbol("hardlink"),ce=Symbol("header"),ei=Symbol("read"),es=Symbol("lstat"),ii=Symbol("onlstat"),is=Symbol("onread"),ss=Symbol("onreadlink"),rs=Symbol("openfile"),ns=Symbol("onopenfile"),pt=Symbol("close"),si=Symbol("mode"),os=Symbol("awaitDrain"),ji=Symbol("ondrain"),X=Symbol("prefix"),fe=class extends A{path;portable;myuid=process.getuid&&process.getuid()||0;myuser=process.env.USER||"";maxReadSize;linkCache;statCache;preservePaths;cwd;strict;mtime;noPax;noMtime;prefix;fd;blockLen=0;blockRemain=0;buf;pos=0;remain=0;length=0;offset=0;win32;absolute;header;type;linkpath;stat;onWriteEntry;#t=!1;constructor(t,e={}){let i=se(e);super(),this.path=f(t),this.portable=!!i.portable,this.maxReadSize=i.maxReadSize||Bn,this.linkCache=i.linkCache||new Map,this.statCache=i.statCache||new Map,this.preservePaths=!!i.preservePaths,this.cwd=f(i.cwd||process.cwd()),this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.mtime=i.mtime,this.prefix=i.prefix?f(i.prefix):void 0,this.onWriteEntry=i.onWriteEntry,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let r=!1;if(!this.preservePaths){let[o,a]=le(this.path);o&&typeof a=="string"&&(this.path=a,r=o)}this.win32=!!i.win32||process.platform==="win32",this.win32&&(this.path=$s(this.path.replaceAll(/\\/g,"/")),t=t.replaceAll(/\\/g,"/")),this.absolute=f(i.absolute||qs.resolve(this.cwd,t)),this.path===""&&(this.path="./"),r&&this.warn("TAR_ENTRY_INFO",`stripping ${r} from absolute path`,{entry:this,path:r+this.path});let n=this.statCache.get(this.absolute);n?this[ii](n):this[es]()}warn(t,e,i={}){return Nt(this,t,e,i)}emit(t,...e){return t==="error"&&(this.#t=!0),super.emit(t,...e)}[es](){$.lstat(this.absolute,(t,e)=>{if(t)return this.emit("error",t);this[ii](e)})}[ii](t){this.statCache.set(this.absolute,t),this.stat=t,t.isFile()||(t.size=0),this.type=Pn(t),this.emit("stat",t),this[Qs]()}[Qs](){switch(this.type){case"File":return this[Js]();case"Directory":return this[js]();case"SymbolicLink":return this[ts]();default:return this.end()}}[si](t){return qi(t,this.type==="Directory",this.portable)}[X](t){return er(t,this.prefix)}[ce](){if(!this.stat)throw new Error("cannot write header before stat");this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.onWriteEntry?.(this),this.header=new C({path:this[X](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[X](this.linkpath):this.linkpath,mode:this[si](this.stat.mode),uid:this.portable?void 0:this.stat.uid,gid:this.portable?void 0:this.stat.gid,size:this.stat.size,mtime:this.noMtime?void 0:this.mtime||this.stat.mtime,type:this.type==="Unsupported"?void 0:this.type,uname:this.portable?void 0:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?void 0:this.stat.atime,ctime:this.portable?void 0:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new ct({atime:this.portable?void 0:this.header.atime,ctime:this.portable?void 0:this.header.ctime,gid:this.portable?void 0:this.header.gid,mtime:this.noMtime?void 0:this.mtime||this.header.mtime,path:this[X](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[X](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?void 0:this.header.uid,uname:this.portable?void 0:this.header.uname,dev:this.portable?void 0:this.stat.dev,ino:this.portable?void 0:this.stat.ino,nlink:this.portable?void 0:this.stat.nlink}).encode());let t=this.header?.block;if(!t)throw new Error("failed to encode header");super.write(t)}[js](){if(!this.stat)throw new Error("cannot create directory entry without stat");this.path.slice(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[ce](),this.end()}[ts](){$.readlink(this.absolute,(t,e)=>{if(t)return this.emit("error",t);this[ss](e)})}[ss](t){this.linkpath=f(t),this[ce](),this.end()}[tr](t){if(!this.stat)throw new Error("cannot create link entry without stat");this.type="Link",this.linkpath=f(qs.relative(this.cwd,t)),this.stat.size=0,this[ce](),this.end()}[Js](){if(!this.stat)throw new Error("cannot create file entry without stat");if(this.stat.nlink>1){let t=`${this.stat.dev}:${this.stat.ino}`,e=this.linkCache.get(t);if(e?.indexOf(this.cwd)===0)return this[tr](e);this.linkCache.set(t,this.absolute)}if(this[ce](),this.stat.size===0)return this.end();this[rs]()}[rs](){$.open(this.absolute,"r",(t,e)=>{if(t)return this.emit("error",t);this[ns](e)})}[ns](t){if(this.fd=t,this.#t)return this[pt]();if(!this.stat)throw new Error("should stat before calling onopenfile");this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let e=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(e),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[ei]()}[ei](){let{fd:t,buf:e,offset:i,length:r,pos:n}=this;if(t===void 0||e===void 0)throw new Error("cannot read file without first opening");$.read(t,e,i,r,n,(o,a)=>{if(o)return this[pt](()=>this.emit("error",o));this[is](a)})}[pt](t=()=>{}){this.fd!==void 0&&$.close(this.fd,t)}[is](t){if(t<=0&&this.remain>0){let r=Object.assign(new Error("encountered unexpected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[pt](()=>this.emit("error",r))}if(t>this.remain){let r=Object.assign(new Error("did not encounter expected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[pt](()=>this.emit("error",r))}if(!this.buf)throw new Error("should have created buffer prior to reading");if(t===this.remain)for(let r=t;rthis[ji]())}[os](t){this.once("drain",t)}write(t,e,i){if(typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,typeof e=="string"?e:"utf8")),this.blockRemaint?this.emit("error",t):this.end());if(!this.buf)throw new Error("buffer lost somehow in ONDRAIN");this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[ei]()}},ri=class extends fe{sync=!0;[es](){this[ii]($.lstatSync(this.absolute))}[ts](){this[ss]($.readlinkSync(this.absolute))}[rs](){this[ns]($.openSync(this.absolute,"r"))}[ei](){let t=!0;try{let{fd:e,buf:i,offset:r,length:n,pos:o}=this;if(e===void 0||i===void 0)throw new Error("fd and buf must be set in READ method");let a=$.readSync(e,i,r,n,o);this[is](a),t=!1}finally{if(t)try{this[pt](()=>{})}catch{}}}[os](t){t()}[pt](t=()=>{}){this.fd!==void 0&&$.closeSync(this.fd),t()}},ni=class extends A{blockLen=0;blockRemain=0;buf=0;pos=0;remain=0;length=0;preservePaths;portable;strict;noPax;noMtime;readEntry;type;prefix;path;mode;uid;gid;uname;gname;header;mtime;atime;ctime;linkpath;size;onWriteEntry;warn(t,e,i={}){return Nt(this,t,e,i)}constructor(t,e={}){let i=se(e);super(),this.preservePaths=!!i.preservePaths,this.portable=!!i.portable,this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.onWriteEntry=i.onWriteEntry,this.readEntry=t;let{type:r}=t;if(r==="Unsupported")throw new Error("writing entry that should be ignored");this.type=r,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=i.prefix,this.path=f(t.path),this.mode=t.mode!==void 0?this[si](t.mode):void 0,this.uid=this.portable?void 0:t.uid,this.gid=this.portable?void 0:t.gid,this.uname=this.portable?void 0:t.uname,this.gname=this.portable?void 0:t.gname,this.size=t.size,this.mtime=this.noMtime?void 0:i.mtime||t.mtime,this.atime=this.portable?void 0:t.atime,this.ctime=this.portable?void 0:t.ctime,this.linkpath=t.linkpath!==void 0?f(t.linkpath):void 0,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let n=!1;if(!this.preservePaths){let[a,h]=le(this.path);a&&typeof h=="string"&&(this.path=h,n=a)}this.remain=t.size,this.blockRemain=t.startBlockSize,this.onWriteEntry?.(this),this.header=new C({path:this[X](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[X](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?void 0:this.uid,gid:this.portable?void 0:this.gid,size:this.size,mtime:this.noMtime?void 0:this.mtime,type:this.type,uname:this.portable?void 0:this.uname,atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime}),n&&this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:this,path:n+this.path}),this.header.encode()&&!this.noPax&&super.write(new ct({atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime,gid:this.portable?void 0:this.gid,mtime:this.noMtime?void 0:this.mtime,path:this[X](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[X](this.linkpath):this.linkpath,size:this.size,uid:this.portable?void 0:this.uid,uname:this.portable?void 0:this.uname,dev:this.portable?void 0:this.readEntry.dev,ino:this.portable?void 0:this.readEntry.ino,nlink:this.portable?void 0:this.readEntry.nlink}).encode());let o=this.header?.block;if(!o)throw new Error("failed to encode header");super.write(o),t.pipe(this)}[X](t){return er(t,this.prefix)}[si](t){return qi(t,this.type==="Directory",this.portable)}write(t,e,i){typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,typeof e=="string"?e:"utf8"));let r=t.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(t,i)}end(t,e,i){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),typeof t=="function"&&(i=t,e=void 0,t=void 0),typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,e??"utf8")),i&&this.once("finish",i),t?super.end(t,i):super.end(i),this}},Pn=s=>s.isFile()?"File":s.isDirectory()?"Directory":s.isSymbolicLink()?"SymbolicLink":"Unsupported";var oi=class s{tail;head;length=0;static create(t=[]){return new s(t)}constructor(t=[]){for(let e of t)this.push(e)}*[Symbol.iterator](){for(let t=this.head;t;t=t.next)yield t.value}removeNode(t){if(t.list!==this)throw new Error("removing node which does not belong to this list");let e=t.next,i=t.prev;return e&&(e.prev=i),i&&(i.next=e),t===this.head&&(this.head=e),t===this.tail&&(this.tail=i),this.length--,t.next=void 0,t.prev=void 0,t.list=void 0,e}unshiftNode(t){if(t===this.head)return;t.list&&t.list.removeNode(t);let e=this.head;t.list=this,t.next=e,e&&(e.prev=t),this.head=t,this.tail||(this.tail=t),this.length++}pushNode(t){if(t===this.tail)return;t.list&&t.list.removeNode(t);let e=this.tail;t.list=this,t.prev=e,e&&(e.next=t),this.tail=t,this.head||(this.head=t),this.length++}push(...t){for(let e=0,i=t.length;e1)i=e;else if(this.head)r=this.head.next,i=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;r;n++)i=t(i,r.value,n),r=r.next;return i}reduceReverse(t,e){let i,r=this.tail;if(arguments.length>1)i=e;else if(this.tail)r=this.tail.prev,i=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(let n=this.length-1;r;n--)i=t(i,r.value,n),r=r.prev;return i}toArray(){let t=new Array(this.length);for(let e=0,i=this.head;i;e++)t[e]=i.value,i=i.next;return t}toArrayReverse(){let t=new Array(this.length);for(let e=0,i=this.tail;i;e++)t[e]=i.value,i=i.prev;return t}slice(t=0,e=this.length){e<0&&(e+=this.length),t<0&&(t+=this.length);let i=new s;if(ethis.length&&(e=this.length);let r=this.head,n=0;for(n=0;r&&nthis.length&&(e=this.length);let r=this.length,n=this.tail;for(;n&&r>e;r--)n=n.prev;for(;n&&r>t;r--,n=n.prev)i.push(n.value);return i}splice(t,e=0,...i){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);let r=this.head;for(let o=0;r&&o1)throw new TypeError("gzip, brotli, zstd are mutually exclusive");if(t.gzip&&(typeof t.gzip!="object"&&(t.gzip={}),this.portable&&(t.gzip.portable=!0),this.zip=new Pe(t.gzip)),t.brotli&&(typeof t.brotli!="object"&&(t.brotli={}),this.zip=new He(t.brotli)),t.zstd&&(typeof t.zstd!="object"&&(t.zstd={}),this.zip=new Ze(t.zstd)),!this.zip)throw new Error("impossible");let e=this.zip;e.on("data",i=>super.write(i)),e.on("end",()=>super.end()),e.on("drain",()=>this[ls]()),this.on("resume",()=>e.resume())}else this.on("drain",this[ls]);this.noDirRecurse=!!t.noDirRecurse,this.follow=!!t.follow,this.noMtime=!!t.noMtime,t.mtime&&(this.mtime=t.mtime),this.filter=typeof t.filter=="function"?t.filter:()=>!0,this[W]=new oi,this[G]=0,this.jobs=Number(t.jobs)||4,this[pe]=!1,this[ue]=!1}[or](t){return super.write(t)}add(t){return this.write(t),this}end(t,e,i){return typeof t=="function"&&(i=t,t=void 0),typeof e=="function"&&(i=e,e=void 0),t&&this.add(t),this[ue]=!0,this[Ct](),i&&i(),this}write(t){if(this[ue])throw new Error("write after end");return typeof t=="string"?this[li](t):this[sr](t),this.flowing}[sr](t){let e=f(nr.resolve(this.cwd,t.path));if(!this.filter(t.path,t))t.resume();else{let i=new mi(t.path,e);i.entry=new ni(t,this[as](i)),i.entry.on("end",()=>this[hs](i)),this[G]+=1,this[W].push(i)}this[Ct]()}[li](t){let e=f(nr.resolve(this.cwd,t));this[W].push(new mi(t,e)),this[Ct]()}[cs](t){t.pending=!0,this[G]+=1;let e=this.follow?"stat":"lstat";ui[e](t.absolute,(i,r)=>{t.pending=!1,this[G]-=1,i?this.emit("error",i):this[ai](t,r)})}[ai](t,e){if(this.statCache.set(t.absolute,e),t.stat=e,!this.filter(t.path,e))t.ignore=!0;else if(e.isFile()&&e.nlink>1&&!this.linkCache.get(`${e.dev}:${e.ino}`)&&!this.sync)if(t===this[Et])this[hi](t);else{let i=`${e.dev}:${e.ino}`,r=this[me].get(i);r?r.push(t):this[me].set(i,[t]),t.pendingLink=!0,t.pending=!0}this[Ct]()}[fs](t){t.pending=!0,this[G]+=1,ui.readdir(t.absolute,(e,i)=>{if(t.pending=!1,this[G]-=1,e)return this.emit("error",e);this[ci](t,i)})}[ci](t,e){this.readdirCache.set(t.absolute,e),t.readdir=e,this[Ct]()}[Ct](){if(!this[pe]){this[pe]=!0;for(let t=this[W].head;t&&this[G]1){let i=`${e.dev}:${e.ino}`,r=this[me].get(i);if(r){this[me].delete(i);for(let n of r)n.pending=!1,this[hi](n)}}this[Ct]()}[hi](t){if(t.pending&&t.pendingLink&&t===this[Et]&&(t.pending=!1,t.pendingLink=!1),!t.pending){if(t.entry){t===this[Et]&&!t.piped&&this[fi](t);return}if(!t.stat){let e=this.statCache.get(t.absolute);e?this[ai](t,e):this[cs](t)}if(t.stat&&!t.ignore){if(!this.noDirRecurse&&t.stat.isDirectory()&&!t.readdir){let e=this.readdirCache.get(t.absolute);if(e?this[ci](t,e):this[fs](t),!t.readdir)return}if(t.entry=this[rr](t),!t.entry){t.ignore=!0;return}t===this[Et]&&!t.piped&&this[fi](t)}}}[as](t){return{onwarn:(e,i,r)=>this.warn(e,i,r),noPax:this.noPax,cwd:this.cwd,absolute:t.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix,onWriteEntry:this.onWriteEntry}}[rr](t){this[G]+=1;try{return new this[di](t.path,this[as](t)).on("end",()=>this[hs](t)).on("error",i=>this.emit("error",i))}catch(e){this.emit("error",e)}}[ls](){this[Et]&&this[Et].entry&&this[Et].entry.resume()}[fi](t){t.piped=!0,t.readdir&&t.readdir.forEach(r=>{let n=t.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[li](o+r)});let e=t.entry,i=this.zip;if(!e)throw new Error("cannot pipe without source");i?e.on("data",r=>{i.write(r)||e.pause()}):e.on("data",r=>{super.write(r)||e.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}warn(t,e,i={}){Nt(this,t,e,i)}},kt=class extends wt{sync=!0;constructor(t){super(t),this[di]=ri}pause(){}resume(){}[cs](t){let e=this.follow?"statSync":"lstatSync";this[ai](t,ui[e](t.absolute))}[fs](t){this[ci](t,ui.readdirSync(t.absolute))}[fi](t){let e=t.entry,i=this.zip;if(t.readdir&&t.readdir.forEach(r=>{let n=t.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[li](o+r)}),!e)throw new Error("Cannot pipe without source");i?e.on("data",r=>{i.write(r)}):e.on("data",r=>{super[or](r)})}};var Wn=(s,t)=>{let e=new kt(s),i=new Wt(s.file,{mode:s.mode||438});e.pipe(i),ar(e,t)},Gn=(s,t)=>{let e=new wt(s),i=new tt(s.file,{mode:s.mode||438});e.pipe(i);let r=new Promise((n,o)=>{i.on("error",o),i.on("close",n),e.on("error",o)});return lr(e,t).catch(n=>e.emit("error",n)),r},ar=(s,t)=>{t.forEach(e=>{e.charAt(0)==="@"?Ft({file:hr.resolve(s.cwd,e.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(e)}),s.end()},lr=async(s,t)=>{for(let e of t)e.charAt(0)==="@"?await Ft({file:hr.resolve(String(s.cwd),e.slice(1)),noResume:!0,onReadEntry:i=>{s.add(i)}}):s.add(e);s.end()},Zn=(s,t)=>{let e=new kt(s);return ar(e,t),e},Yn=(s,t)=>{let e=new wt(s);return lr(e,t).catch(i=>e.emit("error",i)),e},Kn=K(Wn,Gn,Zn,Yn,(s,t)=>{if(!t?.length)throw new TypeError("no paths specified to add to archive")});import kr from"node:fs";import no from"node:assert";import{randomBytes as Cr}from"node:crypto";import u from"node:fs";import R from"node:path";import dr from"fs";var Vn=process.env.__FAKE_PLATFORM__||process.platform,ur=Vn==="win32",{O_CREAT:mr,O_NOFOLLOW:cr,O_TRUNC:pr,O_WRONLY:Er}=dr.constants,wr=Number(process.env.__FAKE_FS_O_FILENAME__)||dr.constants.UV_FS_O_FILEMAP||0,$n=ur&&!!wr,Xn=512*1024,qn=wr|pr|mr|Er,fr=!ur&&typeof cr=="number"?cr|pr|mr|Er:null,ds=fr!==null?()=>fr:$n?s=>s"w";import Ei from"node:fs";import Ee from"node:path";var us=(s,t,e)=>{try{return Ei.lchownSync(s,t,e)}catch(i){if(i?.code!=="ENOENT")throw i}},pi=(s,t,e,i)=>{Ei.lchown(s,t,e,r=>{i(r&&r?.code!=="ENOENT"?r:null)})},Qn=(s,t,e,i,r)=>{if(t.isDirectory())ms(Ee.resolve(s,t.name),e,i,n=>{if(n)return r(n);let o=Ee.resolve(s,t.name);pi(o,e,i,r)});else{let n=Ee.resolve(s,t.name);pi(n,e,i,r)}},ms=(s,t,e,i)=>{Ei.readdir(s,{withFileTypes:!0},(r,n)=>{if(r){if(r.code==="ENOENT")return i();if(r.code!=="ENOTDIR"&&r.code!=="ENOTSUP")return i(r)}if(r||!n.length)return pi(s,t,e,i);let o=n.length,a=null,h=l=>{if(!a){if(l)return i(a=l);if(--o===0)return pi(s,t,e,i)}};for(let l of n)Qn(s,l,t,e,h)})},Jn=(s,t,e,i)=>{t.isDirectory()&&ps(Ee.resolve(s,t.name),e,i),us(Ee.resolve(s,t.name),e,i)},ps=(s,t,e)=>{let i;try{i=Ei.readdirSync(s,{withFileTypes:!0})}catch(r){let n=r;if(n?.code==="ENOENT")return;if(n?.code==="ENOTDIR"||n?.code==="ENOTSUP")return us(s,t,e);throw n}for(let r of i)Jn(s,r,t,e);return us(s,t,e)};import k from"node:fs";import jn from"node:fs/promises";import wi from"node:path";var we=class extends Error{path;code;syscall="chdir";constructor(t,e){super(`${e}: Cannot cd into '${t}'`),this.path=t,this.code=e}get name(){return"CwdError"}};var St=class extends Error{path;symlink;syscall="symlink";code="TAR_SYMLINK_ERROR";constructor(t,e){super("TAR_SYMLINK_ERROR: Cannot extract through symbolic link"),this.symlink=t,this.path=e}get name(){return"SymlinkError"}};var to=(s,t)=>{k.stat(s,(e,i)=>{(e||!i.isDirectory())&&(e=new we(s,e?.code||"ENOTDIR")),t(e)})},Sr=(s,t,e)=>{s=f(s);let i=t.umask??18,r=t.mode|448,n=(r&i)!==0,o=t.uid,a=t.gid,h=typeof o=="number"&&typeof a=="number"&&(o!==t.processUid||a!==t.processGid),l=t.preserve,c=t.unlink,d=f(t.cwd),S=(E,x)=>{E?e(E):x&&h?ms(x,o,a,xe=>S(xe)):n?k.chmod(s,r,e):e()};if(s===d)return to(s,S);if(l)return jn.mkdir(s,{mode:r,recursive:!0}).then(E=>S(null,E??void 0),S);let N=f(wi.relative(d,s)).split("/");Es(d,N,r,c,d,void 0,S)},Es=(s,t,e,i,r,n,o)=>{if(t.length===0)return o(null,n);let a=t.shift(),h=f(wi.resolve(s+"/"+a));k.mkdir(h,e,yr(h,t,e,i,r,n,o))},yr=(s,t,e,i,r,n,o)=>a=>{a?k.lstat(s,(h,l)=>{if(h)h.path=h.path&&f(h.path),o(h);else if(l.isDirectory())Es(s,t,e,i,r,n,o);else if(i)k.unlink(s,c=>{if(c)return o(c);k.mkdir(s,e,yr(s,t,e,i,r,n,o))});else{if(l.isSymbolicLink())return o(new St(s,s+"/"+t.join("/")));o(a)}}):(n=n||s,Es(s,t,e,i,r,n,o))},eo=s=>{let t=!1,e;try{t=k.statSync(s).isDirectory()}catch(i){e=i?.code}finally{if(!t)throw new we(s,e??"ENOTDIR")}},Rr=(s,t)=>{s=f(s);let e=t.umask??18,i=t.mode|448,r=(i&e)!==0,n=t.uid,o=t.gid,a=typeof n=="number"&&typeof o=="number"&&(n!==t.processUid||o!==t.processGid),h=t.preserve,l=t.unlink,c=f(t.cwd),d=E=>{E&&a&&ps(E,n,o),r&&k.chmodSync(s,i)};if(s===c)return eo(c),d();if(h)return d(k.mkdirSync(s,{mode:i,recursive:!0})??void 0);let T=f(wi.relative(c,s)).split("/"),N;for(let E=T.shift(),x=c;E&&(x+="/"+E);E=T.shift()){x=f(wi.resolve(x));try{k.mkdirSync(x,i),N=N||x}catch{let xe=k.lstatSync(x);if(xe.isDirectory())continue;if(l){k.unlinkSync(x),k.mkdirSync(x,i),N=N||x;continue}else if(xe.isSymbolicLink())return new St(x,x+"/"+T.join("/"))}}return d(N)};import{join as _r}from"node:path";var ws=Object.create(null),gr=1e4,Vt=new Set,br=s=>{Vt.has(s)?Vt.delete(s):ws[s]=s.normalize("NFD").toLocaleLowerCase("en").toLocaleUpperCase("en"),Vt.add(s);let t=ws[s],e=Vt.size-gr;if(e>gr/10){for(let i of Vt)if(Vt.delete(i),delete ws[i],--e<=0)break}return t};var io=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,so=io==="win32",ro=s=>s.split("/").slice(0,-1).reduce((e,i)=>{let r=e.at(-1);return r!==void 0&&(i=_r(r,i)),e.push(i||"/"),e},[]),Si=class{#t=new Map;#i=new Map;#s=new Set;reserve(t,e){t=so?["win32 parallelization disabled"]:t.map(r=>mt(_r(br(r))));let i=new Set(t.map(r=>ro(r)).reduce((r,n)=>r.concat(n)));this.#i.set(e,{dirs:i,paths:t});for(let r of t){let n=this.#t.get(r);n?n.push(e):this.#t.set(r,[e])}for(let r of i){let n=this.#t.get(r);if(!n)this.#t.set(r,[new Set([e])]);else{let o=n.at(-1);o instanceof Set?o.add(e):n.push(new Set([e]))}}return this.#r(e)}#n(t){let e=this.#i.get(t);if(!e)throw new Error("function does not have any path reservations");return{paths:e.paths.map(i=>this.#t.get(i)),dirs:[...e.dirs].map(i=>this.#t.get(i))}}check(t){let{paths:e,dirs:i}=this.#n(t);return e.every(r=>r&&r[0]===t)&&i.every(r=>r&&r[0]instanceof Set&&r[0].has(t))}#r(t){return this.#s.has(t)||!this.check(t)?!1:(this.#s.add(t),t(()=>this.#e(t)),!0)}#e(t){if(!this.#s.has(t))return!1;let e=this.#i.get(t);if(!e)throw new Error("invalid reservation");let{paths:i,dirs:r}=e,n=new Set;for(let o of i){let a=this.#t.get(o);if(!a||a?.[0]!==t)continue;let h=a[1];if(!h){this.#t.delete(o);continue}if(a.shift(),typeof h=="function")n.add(h);else for(let l of h)n.add(l)}for(let o of r){let a=this.#t.get(o),h=a?.[0];if(!(!a||!(h instanceof Set)))if(h.size===1&&a.length===1){this.#t.delete(o);continue}else if(h.size===1){a.shift();let l=a[0];typeof l=="function"&&n.add(l)}else h.delete(t)}return this.#s.delete(t),n.forEach(o=>this.#r(o)),!0}};var Or=()=>process.umask();var Tr=Symbol("onEntry"),gs=Symbol("checkFs"),xr=Symbol("checkFs2"),bs=Symbol("isReusable"),P=Symbol("makeFs"),_s=Symbol("file"),Os=Symbol("directory"),Ri=Symbol("link"),Lr=Symbol("symlink"),Nr=Symbol("hardlink"),ye=Symbol("ensureNoSymlink"),Dr=Symbol("unsupported"),Ar=Symbol("checkPath"),Ss=Symbol("stripAbsolutePath"),yt=Symbol("mkdir"),O=Symbol("onError"),yi=Symbol("pending"),Ir=Symbol("pend"),$t=Symbol("unpend"),ys=Symbol("ended"),Rs=Symbol("maybeClose"),Ts=Symbol("skip"),Re=Symbol("doChown"),ge=Symbol("uid"),be=Symbol("gid"),_e=Symbol("checkedCwd"),oo=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,Oe=oo==="win32",ho=1024,ao=(s,t)=>{if(!Oe)return u.unlink(s,t);let e=s+".DELETE."+Cr(16).toString("hex");u.rename(s,e,i=>{if(i)return t(i);u.unlink(e,t)})},lo=s=>{if(!Oe)return u.unlinkSync(s);let t=s+".DELETE."+Cr(16).toString("hex");u.renameSync(s,t),u.unlinkSync(t)},Fr=(s,t,e)=>s!==void 0&&s===s>>>0?s:t!==void 0&&t===t>>>0?t:e,Xt=class extends st{[ys]=!1;[_e]=!1;[yi]=0;reservations=new Si;transform;writable=!0;readable=!1;uid;gid;setOwner;preserveOwner;processGid;processUid;maxDepth;forceChown;win32;newer;keep;noMtime;preservePaths;unlink;cwd;strip;processUmask;umask;dmode;fmode;chmod;constructor(t={}){if(t.ondone=()=>{this[ys]=!0,this[Rs]()},super(t),this.transform=t.transform,this.chmod=!!t.chmod,typeof t.uid=="number"||typeof t.gid=="number"){if(typeof t.uid!="number"||typeof t.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(t.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=t.uid,this.gid=t.gid,this.setOwner=!0}else this.uid=void 0,this.gid=void 0,this.setOwner=!1;this.preserveOwner=t.preserveOwner===void 0&&typeof t.uid!="number"?!!(process.getuid&&process.getuid()===0):!!t.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():void 0,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():void 0,this.maxDepth=typeof t.maxDepth=="number"?t.maxDepth:ho,this.forceChown=t.forceChown===!0,this.win32=!!t.win32||Oe,this.newer=!!t.newer,this.keep=!!t.keep,this.noMtime=!!t.noMtime,this.preservePaths=!!t.preservePaths,this.unlink=!!t.unlink,this.cwd=f(R.resolve(t.cwd||process.cwd())),this.strip=Number(t.strip)||0,this.processUmask=this.chmod?typeof t.processUmask=="number"?t.processUmask:Or():0,this.umask=typeof t.umask=="number"?t.umask:this.processUmask,this.dmode=t.dmode||511&~this.umask,this.fmode=t.fmode||438&~this.umask,this.on("entry",e=>this[Tr](e))}warn(t,e,i={}){return(t==="TAR_BAD_ARCHIVE"||t==="TAR_ABORT")&&(i.recoverable=!1),super.warn(t,e,i)}[Rs](){this[ys]&&this[yi]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"))}[Ss](t,e){let i=t[e],{type:r}=t;if(!i||this.preservePaths)return!0;let[n,o]=le(i),a=o.replaceAll(/\\/g,"/").split("/");if(a.includes("..")||Oe&&/^[a-z]:\.\.$/i.test(a[0]??"")){if(e==="path"||r==="Link")return this.warn("TAR_ENTRY_ERROR",`${e} contains '..'`,{entry:t,[e]:i}),!1;let h=R.posix.dirname(t.path),l=R.posix.normalize(R.posix.join(h,a.join("/")));if(l.startsWith("../")||l==="..")return this.warn("TAR_ENTRY_ERROR",`${e} escapes extraction directory`,{entry:t,[e]:i}),!1}return n&&(t[e]=String(o),this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute ${e}`,{entry:t,[e]:i})),!0}[Ar](t){let e=f(t.path),i=e.split("/");if(this.strip){if(i.length=this.strip)t.linkpath=r.slice(this.strip).join("/");else return!1}i.splice(0,this.strip),t.path=i.join("/")}if(isFinite(this.maxDepth)&&i.length>this.maxDepth)return this.warn("TAR_ENTRY_ERROR","path excessively deep",{entry:t,path:e,depth:i.length,maxDepth:this.maxDepth}),!1;if(!this[Ss](t,"path")||!this[Ss](t,"linkpath"))return!1;if(t.absolute=R.isAbsolute(t.path)?f(R.resolve(t.path)):f(R.resolve(this.cwd,t.path)),!this.preservePaths&&typeof t.absolute=="string"&&t.absolute.indexOf(this.cwd+"/")!==0&&t.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:t,path:f(t.path),resolvedPath:t.absolute,cwd:this.cwd}),!1;if(t.absolute===this.cwd&&t.type!=="Directory"&&t.type!=="GNUDumpDir")return!1;if(this.win32){let{root:r}=R.win32.parse(String(t.absolute));t.absolute=r+Ji(String(t.absolute).slice(r.length));let{root:n}=R.win32.parse(t.path);t.path=n+Ji(t.path.slice(n.length))}return!0}[Tr](t){if(!this[Ar](t))return t.resume();switch(no.equal(typeof t.absolute,"string"),t.type){case"Directory":case"GNUDumpDir":t.mode&&(t.mode=t.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[gs](t);default:return this[Dr](t)}}[O](t,e){t.name==="CwdError"?this.emit("error",t):(this.warn("TAR_ENTRY_ERROR",t,{entry:e}),this[$t](),e.resume())}[yt](t,e,i){Sr(f(t),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:e},i)}[Re](t){return this.forceChown||this.preserveOwner&&(typeof t.uid=="number"&&t.uid!==this.processUid||typeof t.gid=="number"&&t.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[ge](t){return Fr(this.uid,t.uid,this.processUid)}[be](t){return Fr(this.gid,t.gid,this.processGid)}[_s](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.fmode,r=new tt(String(t.absolute),{flags:ds(t.size),mode:i,autoClose:!1});r.on("error",h=>{r.fd&&u.close(r.fd,()=>{}),r.write=()=>!0,this[O](h,t),e()});let n=1,o=h=>{if(h){r.fd&&u.close(r.fd,()=>{}),this[O](h,t),e();return}--n===0&&r.fd!==void 0&&u.close(r.fd,l=>{l?this[O](l,t):this[$t](),e()})};r.on("finish",()=>{let h=String(t.absolute),l=r.fd;if(typeof l=="number"&&t.mtime&&!this.noMtime){n++;let c=t.atime||new Date,d=t.mtime;u.futimes(l,c,d,S=>S?u.utimes(h,c,d,T=>o(T&&S)):o())}if(typeof l=="number"&&this[Re](t)){n++;let c=this[ge](t),d=this[be](t);typeof c=="number"&&typeof d=="number"&&u.fchown(l,c,d,S=>S?u.chown(h,c,d,T=>o(T&&S)):o())}o()});let a=this.transform&&this.transform(t)||t;a!==t&&(a.on("error",h=>{this[O](h,t),e()}),t.pipe(a)),a.pipe(r)}[Os](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.dmode;this[yt](String(t.absolute),i,r=>{if(r){this[O](r,t),e();return}let n=1,o=()=>{--n===0&&(e(),this[$t](),t.resume())};t.mtime&&!this.noMtime&&(n++,u.utimes(String(t.absolute),t.atime||new Date,t.mtime,o)),this[Re](t)&&(n++,u.chown(String(t.absolute),Number(this[ge](t)),Number(this[be](t)),o)),o()})}[Dr](t){t.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${t.type}`,{entry:t}),t.resume()}[Lr](t,e){let i=f(R.relative(this.cwd,R.resolve(R.dirname(String(t.absolute)),String(t.linkpath)))).split("/");this[ye](t,this.cwd,i,()=>this[Ri](t,String(t.linkpath),"symlink",e),r=>{this[O](r,t),e()})}[Nr](t,e){let i=f(R.resolve(this.cwd,String(t.linkpath))),r=f(String(t.linkpath)).split("/");this[ye](t,this.cwd,r,()=>this[Ri](t,i,"link",e),n=>{this[O](n,t),e()})}[ye](t,e,i,r,n){let o=i.shift();if(this.preservePaths||o===void 0)return r();let a=R.resolve(e,o);u.lstat(a,(h,l)=>{if(h)return r();if(l?.isSymbolicLink())return n(new St(a,R.resolve(a,i.join("/"))));this[ye](t,a,i,r,n)})}[Ir](){this[yi]++}[$t](){this[yi]--,this[Rs]()}[Ts](t){this[$t](),t.resume()}[bs](t,e){return t.type==="File"&&!this.unlink&&e.isFile()&&e.nlink<=1&&!Oe}[gs](t){this[Ir]();let e=[t.path];t.linkpath&&e.push(t.linkpath),this.reservations.reserve(e,i=>this[xr](t,i))}[xr](t,e){let i=a=>{e(a)},r=()=>{this[yt](this.cwd,this.dmode,a=>{if(a){this[O](a,t),i();return}this[_e]=!0,n()})},n=()=>{if(t.absolute!==this.cwd){let a=f(R.dirname(String(t.absolute)));if(a!==this.cwd)return this[yt](a,this.dmode,h=>{if(h){this[O](h,t),i();return}o()})}o()},o=()=>{u.lstat(String(t.absolute),(a,h)=>{if(h&&(this.keep||this.newer&&h.mtime>(t.mtime??h.mtime))){this[Ts](t),i();return}if(a||this[bs](t,h))return this[P](null,t,i);if(h.isDirectory()){if(t.type==="Directory"){let l=this.chmod&&t.mode&&(h.mode&4095)!==t.mode,c=d=>this[P](d??null,t,i);return l?u.chmod(String(t.absolute),Number(t.mode),c):c()}if(t.absolute!==this.cwd)return u.rmdir(String(t.absolute),l=>this[P](l??null,t,i))}if(t.absolute===this.cwd)return this[P](null,t,i);ao(String(t.absolute),l=>this[P](l??null,t,i))})};this[_e]?n():r()}[P](t,e,i){if(t){this[O](t,e),i();return}switch(e.type){case"File":case"OldFile":case"ContiguousFile":return this[_s](e,i);case"Link":return this[Nr](e,i);case"SymbolicLink":return this[Lr](e,i);case"Directory":case"GNUDumpDir":return this[Os](e,i)}}[Ri](t,e,i,r){u[i](e,String(t.absolute),n=>{n?this[O](n,t):(this[$t](),t.resume()),r()})}},Se=s=>{try{return[null,s()]}catch(t){return[t,null]}},Te=class extends Xt{sync=!0;[P](t,e){return super[P](t,e,()=>{})}[gs](t){if(!this[_e]){let n=this[yt](this.cwd,this.dmode);if(n)return this[O](n,t);this[_e]=!0}if(t.absolute!==this.cwd){let n=f(R.dirname(String(t.absolute)));if(n!==this.cwd){let o=this[yt](n,this.dmode);if(o)return this[O](o,t)}}let[e,i]=Se(()=>u.lstatSync(String(t.absolute)));if(i&&(this.keep||this.newer&&i.mtime>(t.mtime??i.mtime)))return this[Ts](t);if(e||this[bs](t,i))return this[P](null,t);if(i.isDirectory()){if(t.type==="Directory"){let o=this.chmod&&t.mode&&(i.mode&4095)!==t.mode,[a]=o?Se(()=>{u.chmodSync(String(t.absolute),Number(t.mode))}):[];return this[P](a,t)}let[n]=Se(()=>u.rmdirSync(String(t.absolute)));this[P](n,t)}let[r]=t.absolute===this.cwd?[]:Se(()=>lo(String(t.absolute)));this[P](r,t)}[_s](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.fmode,r=a=>{let h;try{u.closeSync(n)}catch(l){h=l}(a||h)&&this[O](a||h,t),e()},n;try{n=u.openSync(String(t.absolute),ds(t.size),i)}catch(a){return r(a)}let o=this.transform&&this.transform(t)||t;o!==t&&(o.on("error",a=>this[O](a,t)),t.pipe(o)),o.on("data",a=>{try{u.writeSync(n,a,0,a.length)}catch(h){r(h)}}),o.on("end",()=>{let a=null;if(t.mtime&&!this.noMtime){let h=t.atime||new Date,l=t.mtime;try{u.futimesSync(n,h,l)}catch(c){try{u.utimesSync(String(t.absolute),h,l)}catch{a=c}}}if(this[Re](t)){let h=this[ge](t),l=this[be](t);try{u.fchownSync(n,Number(h),Number(l))}catch(c){try{u.chownSync(String(t.absolute),Number(h),Number(l))}catch{a=a||c}}}r(a)})}[Os](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.dmode,r=this[yt](String(t.absolute),i);if(r){this[O](r,t),e();return}if(t.mtime&&!this.noMtime)try{u.utimesSync(String(t.absolute),t.atime||new Date,t.mtime)}catch{}if(this[Re](t))try{u.chownSync(String(t.absolute),Number(this[ge](t)),Number(this[be](t)))}catch{}e(),t.resume()}[yt](t,e){try{return Rr(f(t),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:e})}catch(i){return i}}[ye](t,e,i,r,n){if(this.preservePaths||i.length===0)return r();let o=e;for(let a of i){o=R.resolve(o,a);let[h,l]=Se(()=>u.lstatSync(o));if(h)return r();if(l.isSymbolicLink())return n(new St(o,R.resolve(e,i.join("/"))))}r()}[Ri](t,e,i,r){let n=`${i}Sync`;try{u[n](e,String(t.absolute)),r(),t.resume()}catch(o){return this[O](o,t)}}};var co=s=>{let t=new Te(s),e=s.file,i=kr.statSync(e),r=s.maxReadSize||16*1024*1024;new Me(e,{readSize:r,size:i.size}).pipe(t)},fo=(s,t)=>{let e=new Xt(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,a)=>{e.on("error",a),e.on("close",o),kr.stat(r,(h,l)=>{if(h)a(h);else{let c=new _t(r,{readSize:i,size:l.size});c.on("error",a),c.pipe(e)}})})},uo=K(co,fo,s=>new Te(s),s=>new Xt(s),(s,t)=>{t?.length&&Xi(s,t)});import v from"node:fs";import vr from"node:path";var mo=(s,t)=>{let e=new kt(s),i=!0,r,n;try{try{r=v.openSync(s.file,"r+")}catch(h){if(h?.code==="ENOENT")r=v.openSync(s.file,"w+");else throw h}let o=v.fstatSync(r),a=Buffer.alloc(512);t:for(n=0;no.size)break;n+=l,s.mtimeCache&&h.mtime&&s.mtimeCache.set(String(h.path),h.mtime)}i=!1,po(s,e,n,r,t)}finally{if(i)try{v.closeSync(r)}catch{}}},po=(s,t,e,i,r)=>{let n=new Wt(s.file,{fd:i,start:e});t.pipe(n),wo(t,r)},Eo=(s,t)=>{t=Array.from(t);let e=new wt(s),i=(n,o,a)=>{let h=(T,N)=>{T?v.close(n,E=>a(T)):a(null,N)},l=0;if(o===0)return h(null,0);let c=0,d=Buffer.alloc(512),S=(T,N)=>{if(T||N===void 0)return h(T);if(c+=N,c<512&&N)return v.read(n,d,c,d.length-c,l+c,S);if(l===0&&d[0]===31&&d[1]===139)return h(new Error("cannot append to compressed archives"));if(c<512)return h(null,l);let E=new C(d);if(!E.cksumValid)return h(null,l);let x=512*Math.ceil((E.size??0)/512);if(l+x+512>o||(l+=x+512,l>=o))return h(null,l);s.mtimeCache&&E.mtime&&s.mtimeCache.set(String(E.path),E.mtime),c=0,v.read(n,d,0,512,l,S)};v.read(n,d,0,512,l,S)};return new Promise((n,o)=>{e.on("error",o);let a="r+",h=(l,c)=>{if(l&&l.code==="ENOENT"&&a==="r+")return a="w+",v.open(s.file,a,h);if(l||!c)return o(l);v.fstat(c,(d,S)=>{if(d)return v.close(c,()=>o(d));i(c,S.size,(T,N)=>{if(T)return o(T);let E=new tt(s.file,{fd:c,start:N});e.pipe(E),E.on("error",o),E.on("close",n),So(e,t)})})};v.open(s.file,a,h)})},wo=(s,t)=>{t.forEach(e=>{e.charAt(0)==="@"?Ft({file:vr.resolve(s.cwd,e.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(e)}),s.end()},So=async(s,t)=>{for(let e of t)e.charAt(0)==="@"?await Ft({file:vr.resolve(String(s.cwd),e.slice(1)),noResume:!0,onReadEntry:i=>s.add(i)}):s.add(e);s.end()},vt=K(mo,Eo,()=>{throw new TypeError("file is required")},()=>{throw new TypeError("file is required")},(s,t)=>{if(!vs(s))throw new TypeError("file is required");if(s.gzip||s.brotli||s.zstd||s.file.endsWith(".br")||s.file.endsWith(".tbr"))throw new TypeError("cannot append to compressed archives");if(!t?.length)throw new TypeError("no paths specified to add/replace")});var yo=K(vt.syncFile,vt.asyncFile,vt.syncNoFile,vt.asyncNoFile,(s,t=[])=>{vt.validate?.(s,t),Ro(s)}),Ro=s=>{let t=s.filter;s.mtimeCache||(s.mtimeCache=new Map),s.filter=t?(e,i)=>t(e,i)&&!((s.mtimeCache?.get(e)??i.mtime??0)>(i.mtime??0)):(e,i)=>!((s.mtimeCache?.get(e)??i.mtime??0)>(i.mtime??0))};export{C as Header,wt as Pack,mi as PackJob,kt as PackSync,st as Parser,ct as Pax,Ve as ReadEntry,Xt as Unpack,Te as UnpackSync,fe as WriteEntry,ri as WriteEntrySync,ni as WriteEntryTar,Kn as c,Kn as create,uo as extract,Xi as filesFilter,Ft as list,vt as r,vt as replace,Ft as t,Ui as types,yo as u,yo as update,uo as x}; +var zr=Object.defineProperty;var Ur=(s,t)=>{for(var e in t)zr(s,e,{get:t[e],enumerable:!0})};import Qr from"events";import I from"fs";import{EventEmitter as Di}from"node:events";import Cs from"node:stream";import{StringDecoder as Hr}from"node:string_decoder";var Ds=typeof process=="object"&&process?process:{stdout:null,stderr:null},Wr=s=>!!s&&typeof s=="object"&&(s instanceof A||s instanceof Cs||Gr(s)||Zr(s)),Gr=s=>!!s&&typeof s=="object"&&s instanceof Di&&typeof s.pipe=="function"&&s.pipe!==Cs.Writable.prototype.pipe,Zr=s=>!!s&&typeof s=="object"&&s instanceof Di&&typeof s.write=="function"&&typeof s.end=="function",Q=Symbol("EOF"),J=Symbol("maybeEmitEnd"),nt=Symbol("emittedEnd"),De=Symbol("emittingEnd"),qt=Symbol("emittedError"),Ne=Symbol("closed"),Ns=Symbol("read"),Ae=Symbol("flush"),As=Symbol("flushChunk"),z=Symbol("encoding"),Mt=Symbol("decoder"),g=Symbol("flowing"),Qt=Symbol("paused"),Bt=Symbol("resume"),b=Symbol("buffer"),N=Symbol("pipes"),_=Symbol("bufferLength"),bi=Symbol("bufferPush"),Ie=Symbol("bufferShift"),L=Symbol("objectMode"),w=Symbol("destroyed"),_i=Symbol("error"),Oi=Symbol("emitData"),Is=Symbol("emitEnd"),Ti=Symbol("emitEnd2"),Z=Symbol("async"),xi=Symbol("abort"),Ce=Symbol("aborted"),Jt=Symbol("signal"),Rt=Symbol("dataListeners"),C=Symbol("discarded"),jt=s=>Promise.resolve().then(s),Yr=s=>s(),Kr=s=>s==="end"||s==="finish"||s==="prefinish",Vr=s=>s instanceof ArrayBuffer||!!s&&typeof s=="object"&&s.constructor&&s.constructor.name==="ArrayBuffer"&&s.byteLength>=0,$r=s=>!Buffer.isBuffer(s)&&ArrayBuffer.isView(s),Fe=class{src;dest;opts;ondrain;constructor(t,e,i){this.src=t,this.dest=e,this.opts=i,this.ondrain=()=>t[Bt](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(t){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},Li=class extends Fe{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(t,e,i){super(t,e,i),this.proxyErrors=r=>this.dest.emit("error",r),t.on("error",this.proxyErrors)}},Xr=s=>!!s.objectMode,qr=s=>!s.objectMode&&!!s.encoding&&s.encoding!=="buffer",A=class extends Di{[g]=!1;[Qt]=!1;[N]=[];[b]=[];[L];[z];[Z];[Mt];[Q]=!1;[nt]=!1;[De]=!1;[Ne]=!1;[qt]=null;[_]=0;[w]=!1;[Jt];[Ce]=!1;[Rt]=0;[C]=!1;writable=!0;readable=!0;constructor(...t){let e=t[0]||{};if(super(),e.objectMode&&typeof e.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");Xr(e)?(this[L]=!0,this[z]=null):qr(e)?(this[z]=e.encoding,this[L]=!1):(this[L]=!1,this[z]=null),this[Z]=!!e.async,this[Mt]=this[z]?new Hr(this[z]):null,e&&e.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[b]}),e&&e.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[N]});let{signal:i}=e;i&&(this[Jt]=i,i.aborted?this[xi]():i.addEventListener("abort",()=>this[xi]()))}get bufferLength(){return this[_]}get encoding(){return this[z]}set encoding(t){throw new Error("Encoding must be set at instantiation time")}setEncoding(t){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[L]}set objectMode(t){throw new Error("objectMode must be set at instantiation time")}get async(){return this[Z]}set async(t){this[Z]=this[Z]||!!t}[xi](){this[Ce]=!0,this.emit("abort",this[Jt]?.reason),this.destroy(this[Jt]?.reason)}get aborted(){return this[Ce]}set aborted(t){}write(t,e,i){if(this[Ce])return!1;if(this[Q])throw new Error("write after end");if(this[w])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof e=="function"&&(i=e,e="utf8"),e||(e="utf8");let r=this[Z]?jt:Yr;if(!this[L]&&!Buffer.isBuffer(t)){if($r(t))t=Buffer.from(t.buffer,t.byteOffset,t.byteLength);else if(Vr(t))t=Buffer.from(t);else if(typeof t!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[L]?(this[g]&&this[_]!==0&&this[Ae](!0),this[g]?this.emit("data",t):this[bi](t),this[_]!==0&&this.emit("readable"),i&&r(i),this[g]):t.length?(typeof t=="string"&&!(e===this[z]&&!this[Mt]?.lastNeed)&&(t=Buffer.from(t,e)),Buffer.isBuffer(t)&&this[z]&&(t=this[Mt].write(t)),this[g]&&this[_]!==0&&this[Ae](!0),this[g]?this.emit("data",t):this[bi](t),this[_]!==0&&this.emit("readable"),i&&r(i),this[g]):(this[_]!==0&&this.emit("readable"),i&&r(i),this[g])}read(t){if(this[w])return null;if(this[C]=!1,this[_]===0||t===0||t&&t>this[_])return this[J](),null;this[L]&&(t=null),this[b].length>1&&!this[L]&&(this[b]=[this[z]?this[b].join(""):Buffer.concat(this[b],this[_])]);let e=this[Ns](t||null,this[b][0]);return this[J](),e}[Ns](t,e){if(this[L])this[Ie]();else{let i=e;t===i.length||t===null?this[Ie]():typeof i=="string"?(this[b][0]=i.slice(t),e=i.slice(0,t),this[_]-=t):(this[b][0]=i.subarray(t),e=i.subarray(0,t),this[_]-=t)}return this.emit("data",e),!this[b].length&&!this[Q]&&this.emit("drain"),e}end(t,e,i){return typeof t=="function"&&(i=t,t=void 0),typeof e=="function"&&(i=e,e="utf8"),t!==void 0&&this.write(t,e),i&&this.once("end",i),this[Q]=!0,this.writable=!1,(this[g]||!this[Qt])&&this[J](),this}[Bt](){this[w]||(!this[Rt]&&!this[N].length&&(this[C]=!0),this[Qt]=!1,this[g]=!0,this.emit("resume"),this[b].length?this[Ae]():this[Q]?this[J]():this.emit("drain"))}resume(){return this[Bt]()}pause(){this[g]=!1,this[Qt]=!0,this[C]=!1}get destroyed(){return this[w]}get flowing(){return this[g]}get paused(){return this[Qt]}[bi](t){this[L]?this[_]+=1:this[_]+=t.length,this[b].push(t)}[Ie](){return this[L]?this[_]-=1:this[_]-=this[b][0].length,this[b].shift()}[Ae](t=!1){do;while(this[As](this[Ie]())&&this[b].length);!t&&!this[b].length&&!this[Q]&&this.emit("drain")}[As](t){return this.emit("data",t),this[g]}pipe(t,e){if(this[w])return t;this[C]=!1;let i=this[nt];return e=e||{},t===Ds.stdout||t===Ds.stderr?e.end=!1:e.end=e.end!==!1,e.proxyErrors=!!e.proxyErrors,i?e.end&&t.end():(this[N].push(e.proxyErrors?new Li(this,t,e):new Fe(this,t,e)),this[Z]?jt(()=>this[Bt]()):this[Bt]()),t}unpipe(t){let e=this[N].find(i=>i.dest===t);e&&(this[N].length===1?(this[g]&&this[Rt]===0&&(this[g]=!1),this[N]=[]):this[N].splice(this[N].indexOf(e),1),e.unpipe())}addListener(t,e){return this.on(t,e)}on(t,e){let i=super.on(t,e);if(t==="data")this[C]=!1,this[Rt]++,!this[N].length&&!this[g]&&this[Bt]();else if(t==="readable"&&this[_]!==0)super.emit("readable");else if(Kr(t)&&this[nt])super.emit(t),this.removeAllListeners(t);else if(t==="error"&&this[qt]){let r=e;this[Z]?jt(()=>r.call(this,this[qt])):r.call(this,this[qt])}return i}removeListener(t,e){return this.off(t,e)}off(t,e){let i=super.off(t,e);return t==="data"&&(this[Rt]=this.listeners("data").length,this[Rt]===0&&!this[C]&&!this[N].length&&(this[g]=!1)),i}removeAllListeners(t){let e=super.removeAllListeners(t);return(t==="data"||t===void 0)&&(this[Rt]=0,!this[C]&&!this[N].length&&(this[g]=!1)),e}get emittedEnd(){return this[nt]}[J](){!this[De]&&!this[nt]&&!this[w]&&this[b].length===0&&this[Q]&&(this[De]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[Ne]&&this.emit("close"),this[De]=!1)}emit(t,...e){let i=e[0];if(t!=="error"&&t!=="close"&&t!==w&&this[w])return!1;if(t==="data")return!this[L]&&!i?!1:this[Z]?(jt(()=>this[Oi](i)),!0):this[Oi](i);if(t==="end")return this[Is]();if(t==="close"){if(this[Ne]=!0,!this[nt]&&!this[w])return!1;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(t==="error"){this[qt]=i,super.emit(_i,i);let n=!this[Jt]||this.listeners("error").length?super.emit("error",i):!1;return this[J](),n}else if(t==="resume"){let n=super.emit("resume");return this[J](),n}else if(t==="finish"||t==="prefinish"){let n=super.emit(t);return this.removeAllListeners(t),n}let r=super.emit(t,...e);return this[J](),r}[Oi](t){for(let i of this[N])i.dest.write(t)===!1&&this.pause();let e=this[C]?!1:super.emit("data",t);return this[J](),e}[Is](){return this[nt]?!1:(this[nt]=!0,this.readable=!1,this[Z]?(jt(()=>this[Ti]()),!0):this[Ti]())}[Ti](){if(this[Mt]){let e=this[Mt].end();if(e){for(let i of this[N])i.dest.write(e);this[C]||super.emit("data",e)}}for(let e of this[N])e.end();let t=super.emit("end");return this.removeAllListeners("end"),t}async collect(){let t=Object.assign([],{dataLength:0});this[L]||(t.dataLength=0);let e=this.promise();return this.on("data",i=>{t.push(i),this[L]||(t.dataLength+=i.length)}),await e,t}async concat(){if(this[L])throw new Error("cannot concat in objectMode");let t=await this.collect();return this[z]?t.join(""):Buffer.concat(t,t.dataLength)}async promise(){return new Promise((t,e)=>{this.on(w,()=>e(new Error("stream destroyed"))),this.on("error",i=>e(i)),this.on("end",()=>t())})}[Symbol.asyncIterator](){this[C]=!1;let t=!1,e=async()=>(this.pause(),t=!0,{value:void 0,done:!0});return{next:()=>{if(t)return e();let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[Q])return e();let n,o,h=d=>{this.off("data",a),this.off("end",l),this.off(w,c),e(),o(d)},a=d=>{this.off("error",h),this.off("end",l),this.off(w,c),this.pause(),n({value:d,done:!!this[Q]})},l=()=>{this.off("error",h),this.off("data",a),this.off(w,c),e(),n({done:!0,value:void 0})},c=()=>h(new Error("stream destroyed"));return new Promise((d,S)=>{o=S,n=d,this.once(w,c),this.once("error",h),this.once("end",l),this.once("data",a)})},throw:e,return:e,[Symbol.asyncIterator](){return this},[Symbol.asyncDispose]:async()=>{}}}[Symbol.iterator](){this[C]=!1;let t=!1,e=()=>(this.pause(),this.off(_i,e),this.off(w,e),this.off("end",e),t=!0,{done:!0,value:void 0}),i=()=>{if(t)return e();let r=this.read();return r===null?e():{done:!1,value:r}};return this.once("end",e),this.once(_i,e),this.once(w,e),{next:i,throw:e,return:e,[Symbol.iterator](){return this},[Symbol.dispose]:()=>{}}}destroy(t){if(this[w])return t?this.emit("error",t):this.emit(w),this;this[w]=!0,this[C]=!0,this[b].length=0,this[_]=0;let e=this;return typeof e.close=="function"&&!this[Ne]&&e.close(),t?this.emit("error",t):this.emit(w),this}static get isStream(){return Wr}};var Jr=I.writev,ht=Symbol("_autoClose"),H=Symbol("_close"),te=Symbol("_ended"),u=Symbol("_fd"),Ni=Symbol("_finished"),tt=Symbol("_flags"),Ai=Symbol("_flush"),ki=Symbol("_handleChunk"),vi=Symbol("_makeBuf"),ie=Symbol("_mode"),ke=Symbol("_needDrain"),Ut=Symbol("_onerror"),Ht=Symbol("_onopen"),Ii=Symbol("_onread"),Pt=Symbol("_onwrite"),at=Symbol("_open"),U=Symbol("_path"),ot=Symbol("_pos"),Y=Symbol("_queue"),zt=Symbol("_read"),Ci=Symbol("_readSize"),j=Symbol("_reading"),ee=Symbol("_remain"),Fi=Symbol("_size"),ve=Symbol("_write"),gt=Symbol("_writing"),Me=Symbol("_defaultFlag"),bt=Symbol("_errored"),_t=class extends A{[bt]=!1;[u];[U];[Ci];[j]=!1;[Fi];[ee];[ht];constructor(t,e){if(e=e||{},super(e),this.readable=!0,this.writable=!1,typeof t!="string")throw new TypeError("path must be a string");this[bt]=!1,this[u]=typeof e.fd=="number"?e.fd:void 0,this[U]=t,this[Ci]=e.readSize||16*1024*1024,this[j]=!1,this[Fi]=typeof e.size=="number"?e.size:1/0,this[ee]=this[Fi],this[ht]=typeof e.autoClose=="boolean"?e.autoClose:!0,typeof this[u]=="number"?this[zt]():this[at]()}get fd(){return this[u]}get path(){return this[U]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[at](){I.open(this[U],"r",(t,e)=>this[Ht](t,e))}[Ht](t,e){t?this[Ut](t):(this[u]=e,this.emit("open",e),this[zt]())}[vi](){return Buffer.allocUnsafe(Math.min(this[Ci],this[ee]))}[zt](){if(!this[j]){this[j]=!0;let t=this[vi]();if(t.length===0)return process.nextTick(()=>this[Ii](null,0,t));I.read(this[u],t,0,t.length,null,(e,i,r)=>this[Ii](e,i,r))}}[Ii](t,e,i){this[j]=!1,t?this[Ut](t):this[ki](e,i)&&this[zt]()}[H](){if(this[ht]&&typeof this[u]=="number"){let t=this[u];this[u]=void 0,I.close(t,e=>e?this.emit("error",e):this.emit("close"))}}[Ut](t){this[j]=!0,this[H](),this.emit("error",t)}[ki](t,e){let i=!1;return this[ee]-=t,t>0&&(i=super.write(tthis[Ht](t,e))}[Ht](t,e){this[Me]&&this[tt]==="r+"&&t&&t.code==="ENOENT"?(this[tt]="w",this[at]()):t?this[Ut](t):(this[u]=e,this.emit("open",e),this[gt]||this[Ai]())}end(t,e){return t&&this.write(t,e),this[te]=!0,!this[gt]&&!this[Y].length&&typeof this[u]=="number"&&this[Pt](null,0),this}write(t,e){return typeof t=="string"&&(t=Buffer.from(t,e)),this[te]?(this.emit("error",new Error("write() after end()")),!1):this[u]===void 0||this[gt]||this[Y].length?(this[Y].push(t),this[ke]=!0,!1):(this[gt]=!0,this[ve](t),!0)}[ve](t){I.write(this[u],t,0,t.length,this[ot],(e,i)=>this[Pt](e,i))}[Pt](t,e){t?this[Ut](t):(this[ot]!==void 0&&typeof e=="number"&&(this[ot]+=e),this[Y].length?this[Ai]():(this[gt]=!1,this[te]&&!this[Ni]?(this[Ni]=!0,this[H](),this.emit("finish")):this[ke]&&(this[ke]=!1,this.emit("drain"))))}[Ai](){if(this[Y].length===0)this[te]&&this[Pt](null,0);else if(this[Y].length===1)this[ve](this[Y].pop());else{let t=this[Y];this[Y]=[],Jr(this[u],t,this[ot],(e,i)=>this[Pt](e,i))}}[H](){if(this[ht]&&typeof this[u]=="number"){let t=this[u];this[u]=void 0,I.close(t,e=>e?this.emit("error",e):this.emit("close"))}}},Wt=class extends et{[at](){let t;if(this[Me]&&this[tt]==="r+")try{t=I.openSync(this[U],this[tt],this[ie])}catch(e){if(e?.code==="ENOENT")return this[tt]="w",this[at]();throw e}else t=I.openSync(this[U],this[tt],this[ie]);this[Ht](null,t)}[H](){if(this[ht]&&typeof this[u]=="number"){let t=this[u];this[u]=void 0,I.closeSync(t),this.emit("close")}}[ve](t){let e=!0;try{this[Pt](null,I.writeSync(this[u],t,0,t.length,this[ot])),e=!1}finally{if(e)try{this[H]()}catch{}}}};import cr from"node:path";import Kt from"node:fs";import{dirname as Fn,parse as kn}from"path";var jr=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"],["onentry","onReadEntry"]]),Fs=s=>!!s.sync&&!!s.file,ks=s=>!s.sync&&!!s.file,vs=s=>!!s.sync&&!s.file,Ms=s=>!s.sync&&!s.file;var Bs=s=>!!s.file;var tn=s=>{let t=jr.get(s);return t||s},se=(s={})=>{if(!s)return{};let t={};for(let[e,i]of Object.entries(s)){let r=tn(e);t[r]=i}return t.chmod===void 0&&t.noChmod===!1&&(t.chmod=!0),delete t.noChmod,t};var K=(s,t,e,i,r)=>Object.assign((n=[],o,h)=>{Array.isArray(n)&&(o=n,n={}),typeof o=="function"&&(h=o,o=void 0),o=o?Array.from(o):[];let a=se(n);if(r?.(a,o),Fs(a)){if(typeof h=="function")throw new TypeError("callback not supported for sync tar functions");return s(a,o)}else if(ks(a)){let l=t(a,o);return h?l.then(()=>h(),h):l}else if(vs(a)){if(typeof h=="function")throw new TypeError("callback not supported for sync tar functions");return e(a,o)}else if(Ms(a)){if(typeof h=="function")throw new TypeError("callback only supported with file option");return i(a,o)}throw new Error("impossible options??")},{syncFile:s,asyncFile:t,syncNoFile:e,asyncNoFile:i,validate:r});import{EventEmitter as Dn}from"events";import zi from"assert";import{Buffer as Ot}from"buffer";import*as Ps from"zlib";import en from"zlib";var sn=en.constants||{ZLIB_VERNUM:4736},M=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},sn));var rn=Ot.concat,zs=Object.getOwnPropertyDescriptor(Ot,"concat"),nn=s=>s,Bi=zs?.writable===!0||zs?.set!==void 0?s=>{Ot.concat=s?nn:rn}:s=>{},Tt=Symbol("_superWrite"),Gt=class extends Error{code;errno;constructor(t,e){super("zlib: "+t.message,{cause:t}),this.code=t.code,this.errno=t.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+t.message,Error.captureStackTrace(this,e??this.constructor)}get name(){return"ZlibError"}},Pi=Symbol("flushFlag"),re=class extends A{#t=!1;#i=!1;#s;#n;#r;#e;#o;get sawError(){return this.#t}get handle(){return this.#e}get flushFlag(){return this.#s}constructor(t,e){if(!t||typeof t!="object")throw new TypeError("invalid options for ZlibBase constructor");if(super(t),this.#s=t.flush??0,this.#n=t.finishFlush??0,this.#r=t.fullFlushFlag??0,typeof Ps[e]!="function")throw new TypeError("Compression method not supported: "+e);try{this.#e=new Ps[e](t)}catch(i){throw new Gt(i,this.constructor)}this.#o=i=>{this.#t||(this.#t=!0,this.close(),this.emit("error",i))},this.#e?.on("error",i=>this.#o(new Gt(i))),this.once("end",()=>this.close)}close(){this.#e&&(this.#e.close(),this.#e=void 0,this.emit("close"))}reset(){if(!this.#t)return zi(this.#e,"zlib binding closed"),this.#e.reset?.()}flush(t){this.ended||(typeof t!="number"&&(t=this.#r),this.write(Object.assign(Ot.alloc(0),{[Pi]:t})))}end(t,e,i){return typeof t=="function"&&(i=t,e=void 0,t=void 0),typeof e=="function"&&(i=e,e=void 0),t&&(e?this.write(t,e):this.write(t)),this.flush(this.#n),this.#i=!0,super.end(i)}get ended(){return this.#i}[Tt](t){return super.write(t)}write(t,e,i){if(typeof e=="function"&&(i=e,e="utf8"),typeof t=="string"&&(t=Ot.from(t,e)),this.#t)return;zi(this.#e,"zlib binding closed");let r=this.#e._handle,n=r.close;r.close=()=>{};let o=this.#e.close;this.#e.close=()=>{},Bi(!0);let h;try{let l=typeof t[Pi]=="number"?t[Pi]:this.#s;h=this.#e._processChunk(t,l),Bi(!1)}catch(l){Bi(!1),this.#o(new Gt(l,this.write))}finally{this.#e&&(this.#e._handle=r,r.close=n,this.#e.close=o,this.#e.removeAllListeners("error"))}this.#e&&this.#e.on("error",l=>this.#o(new Gt(l,this.write)));let a;if(h)if(Array.isArray(h)&&h.length>0){let l=h[0];a=this[Tt](Ot.from(l));for(let c=1;c{typeof r=="function"&&(n=r,r=this.flushFlag),this.flush(r),n?.()};try{this.handle.params(t,e)}finally{this.handle.flush=i}this.handle&&(this.#t=t,this.#i=e)}}}};var ze=class extends Pe{#t;constructor(t){super(t,"Gzip"),this.#t=t&&!!t.portable}[Tt](t){return this.#t?(this.#t=!1,t[9]=255,super[Tt](t)):super[Tt](t)}};var Ue=class extends Pe{constructor(t){super(t,"Unzip")}},He=class extends re{constructor(t,e){t=t||{},t.flush=t.flush||M.BROTLI_OPERATION_PROCESS,t.finishFlush=t.finishFlush||M.BROTLI_OPERATION_FINISH,t.fullFlushFlag=M.BROTLI_OPERATION_FLUSH,super(t,e)}},We=class extends He{constructor(t){super(t,"BrotliCompress")}},Ge=class extends He{constructor(t){super(t,"BrotliDecompress")}},Ze=class extends re{constructor(t,e){t=t||{},t.flush=t.flush||M.ZSTD_e_continue,t.finishFlush=t.finishFlush||M.ZSTD_e_end,t.fullFlushFlag=M.ZSTD_e_flush,super(t,e)}},Ye=class extends Ze{constructor(t){super(t,"ZstdCompress")}},Ke=class extends Ze{constructor(t){super(t,"ZstdDecompress")}};import{posix as Zt}from"node:path";var Us=(s,t)=>{if(Number.isSafeInteger(s))s<0?an(s,t):hn(s,t);else throw Error("cannot encode number outside of javascript safe integer range");return t},hn=(s,t)=>{t[0]=128;for(var e=t.length;e>1;e--)t[e-1]=s&255,s=Math.floor(s/256)},an=(s,t)=>{t[0]=255;var e=!1;s=s*-1;for(var i=t.length;i>1;i--){var r=s&255;s=Math.floor(s/256),e?t[i-1]=Ws(r):r===0?t[i-1]=0:(e=!0,t[i-1]=Gs(r))}},Hs=s=>{let t=s[0],e=t===128?cn(s.subarray(1,s.length)):t===255?ln(s):null;if(e===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(e))throw Error("parsed number outside of javascript safe integer range");return e},ln=s=>{for(var t=s.length,e=0,i=!1,r=t-1;r>-1;r--){var n=Number(s[r]),o;i?o=Ws(n):n===0?o=n:(i=!0,o=Gs(n)),o!==0&&(e-=o*Math.pow(256,t-r-1))}return e},cn=s=>{for(var t=s.length,e=0,i=t-1;i>-1;i--){var r=Number(s[i]);r!==0&&(e+=r*Math.pow(256,t-i-1))}return e},Ws=s=>(255^s)&255,Gs=s=>(255^s)+1&255;var Hi={};Ur(Hi,{code:()=>Ve,isCode:()=>ne,isName:()=>dn,name:()=>oe,normalFsTypes:()=>Ui});var ne=s=>oe.has(s),dn=s=>Ve.has(s),Ui=new Set(["0","","1","2","3","4","5","6","7","D"]),oe=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]),Ve=new Map(Array.from(oe).map(s=>[s[1],s[0]]));var mn=s=>s===void 0||s<0?void 0:s,F=class{cksumValid=!1;needPax=!1;nullBlock=!1;block;path;mode;uid;gid;size;cksum;#t="Unsupported";linkpath;uname;gname;devmaj=0;devmin=0;atime;ctime;mtime;charset;comment;constructor(t,e=0,i,r){Buffer.isBuffer(t)?this.decode(t,e||0,i,r):t&&this.#i(t)}decode(t,e,i,r){if(e||(e=0),!t||!(t.length>=e+512))throw new Error("need 512 bytes for header");let n=xt(t,e+156,1),o=Ui.has(n),h=o?i:void 0,a=o?r:void 0;if(this.path=h?.path??xt(t,e,100),this.mode=h?.mode??a?.mode??lt(t,e+100,8),this.uid=h?.uid??a?.uid??lt(t,e+108,8),this.gid=h?.gid??a?.gid??lt(t,e+116,8),this.size=mn(h?.size??a?.size??lt(t,e+124,12)),this.mtime=h?.mtime??a?.mtime??Wi(t,e+136,12),this.cksum=lt(t,e+148,12),a&&this.#i(a,!0),h&&this.#i(h),ne(n)&&(this.#t=n||"0"),this.#t==="0"&&this.path.slice(-1)==="/"&&(this.#t="5"),this.#t==="5"&&(this.size=0),this.linkpath=xt(t,e+157,100),t.subarray(e+257,e+265).toString()==="ustar\x0000")if(this.uname=h?.uname??a?.uname??xt(t,e+265,32),this.gname=h?.gname??a?.gname??xt(t,e+297,32),this.devmaj=h?.devmaj??a?.devmaj??lt(t,e+329,8)??0,this.devmin=h?.devmin??a?.devmin??lt(t,e+337,8)??0,t[e+475]!==0){let c=xt(t,e+345,155);this.path=c+"/"+this.path}else{let c=xt(t,e+345,130);c&&(this.path=c+"/"+this.path),this.atime=i?.atime??r?.atime??Wi(t,e+476,12),this.ctime=i?.ctime??r?.ctime??Wi(t,e+488,12)}let l=256;for(let c=e;c!(r==null||i==="size"&&Number(r)<0||i==="path"&&e||i==="linkpath"&&e||i==="global"))))}encode(t,e=0){if(t||(t=this.block=Buffer.alloc(512)),this.#t==="Unsupported"&&(this.#t="0"),!(t.length>=e+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,r=un(this.path||"",i),n=r[0],o=r[1];this.needPax=!!r[2],this.needPax=Lt(t,e,100,n)||this.needPax,this.needPax=ct(t,e+100,8,this.mode)||this.needPax,this.needPax=ct(t,e+108,8,this.uid)||this.needPax,this.needPax=ct(t,e+116,8,this.gid)||this.needPax,this.needPax=ct(t,e+124,12,this.size)||this.needPax,this.needPax=Gi(t,e+136,12,this.mtime)||this.needPax,t[e+156]=Number(this.#t.codePointAt(0)),this.needPax=Lt(t,e+157,100,this.linkpath)||this.needPax,t.write("ustar\x0000",e+257,8),this.needPax=Lt(t,e+265,32,this.uname)||this.needPax,this.needPax=Lt(t,e+297,32,this.gname)||this.needPax,this.needPax=ct(t,e+329,8,this.devmaj)||this.needPax,this.needPax=ct(t,e+337,8,this.devmin)||this.needPax,this.needPax=Lt(t,e+345,i,o)||this.needPax,t[e+475]!==0?this.needPax=Lt(t,e+345,155,o)||this.needPax:(this.needPax=Lt(t,e+345,130,o)||this.needPax,this.needPax=Gi(t,e+476,12,this.atime)||this.needPax,this.needPax=Gi(t,e+488,12,this.ctime)||this.needPax);let h=256;for(let a=e;a{let i=s,r="",n,o=Zt.parse(s).root||".";if(Buffer.byteLength(i)<100)n=[i,r,!1];else{r=Zt.dirname(i),i=Zt.basename(i);do Buffer.byteLength(i)<=100&&Buffer.byteLength(r)<=t?n=[i,r,!1]:Buffer.byteLength(i)>100&&Buffer.byteLength(r)<=t?n=[i.slice(0,99),r,!0]:(i=Zt.join(Zt.basename(r),i),r=Zt.dirname(r));while(r!==o&&n===void 0);n||(n=[s.slice(0,99),"",!0])}return n},xt=(s,t,e)=>s.subarray(t,t+e).toString("utf8").replace(/\0.*/,""),Wi=(s,t,e)=>pn(lt(s,t,e)),pn=s=>s===void 0?void 0:new Date(s*1e3),lt=(s,t,e)=>Number(s[t])&128?Hs(s.subarray(t,t+e)):wn(s,t,e),En=s=>isNaN(s)?void 0:s,wn=(s,t,e)=>En(parseInt(s.subarray(t,t+e).toString("utf8").replace(/\0.*$/,"").trim(),8)),Sn={12:8589934591,8:2097151},ct=(s,t,e,i)=>i===void 0?!1:i>Sn[e]||i<0?(Us(i,s.subarray(t,t+e)),!0):(yn(s,t,e,i),!1),yn=(s,t,e,i)=>s.write(Rn(i,e),t,e,"ascii"),Rn=(s,t)=>gn(Math.floor(s).toString(8),t),gn=(s,t)=>(s.length===t-1?s:new Array(t-s.length-1).join("0")+s+" ")+"\0",Gi=(s,t,e,i)=>i===void 0?!1:ct(s,t,e,i.getTime()/1e3),bn=new Array(156).join("\0"),Lt=(s,t,e,i)=>i===void 0?!1:(s.write(i+bn,t,e,"utf8"),i.length!==Buffer.byteLength(i)||i.length>e);import{basename as _n}from"node:path";var ft=class s{atime;mtime;ctime;charset;comment;gid;uid;gname;uname;linkpath;dev;ino;nlink;path;size;mode;global;constructor(t,e=!1){this.atime=t.atime,this.charset=t.charset,this.comment=t.comment,this.ctime=t.ctime,this.dev=t.dev,this.gid=t.gid,this.global=e,this.gname=t.gname,this.ino=t.ino,this.linkpath=t.linkpath,this.mtime=t.mtime,this.nlink=t.nlink,this.path=t.path,this.size=t.size,this.uid=t.uid,this.uname=t.uname}encode(){let t=this.encodeBody();if(t==="")return Buffer.allocUnsafe(0);let e=Buffer.byteLength(t),i=512*Math.ceil(1+e/512),r=Buffer.allocUnsafe(i);for(let n=0;n<512;n++)r[n]=0;new F({path:("PaxHeader/"+_n(this.path??"")).slice(0,99),mode:this.mode||420,uid:this.uid,gid:this.gid,size:e,mtime:this.mtime,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime,ctime:this.ctime}).encode(r),r.write(t,512,e,"utf8");for(let n=e+512;n=Math.pow(10,o)&&(o+=1),o+n+r}static parse(t,e,i=!1){return new s(On(Tn(t),e),i)}},On=(s,t)=>t?Object.assign({},t,s):s,Tn=s=>s.replace(/\n$/,"").split(` +`).reduce(xn,Object.create(null)),xn=(s,t)=>{let e=parseInt(t,10);if(e!==Buffer.byteLength(t)+1)return s;t=t.slice((e+" ").length);let i=t.split("="),r=i.shift();if(!r)return s;let n=r.replace(/^SCHILY\.(dev|ino|nlink)/,"$1"),o=i.join("=").replace(/\0.*/,"");switch(n){case"path":case"linkpath":case"type":case"charset":case"comment":case"gname":case"uname":s[n]=o;break;case"ctime":case"atime":case"mtime":s[n]=new Date(Number(o)*1e3);break;case"size":let h=+o;h>=0&&(s[n]=h);break;case"gid":case"uid":case"dev":case"ino":case"nlink":case"mode":s[n]=+o;break}return s};var Ln=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,f=Ln!=="win32"?s=>String(s):s=>String(s).replaceAll(/\\/g,"/");var $e=class extends A{extended;globalExtended;header;startBlockSize;blockRemain;remain;type;meta=!1;ignore=!1;path;mode;uid;gid;uname;gname;size=0;mtime;atime;ctime;linkpath;dev;ino;nlink;invalid=!1;absolute;unsupported=!1;constructor(t,e,i){switch(super({}),this.pause(),this.extended=e,this.globalExtended=i,this.header=t,this.remain=t.size??0,this.startBlockSize=512*Math.ceil(this.remain/512),this.blockRemain=this.startBlockSize,this.type=t.type,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}if(!t.path)throw new Error("no path provided for tar.ReadEntry");this.path=f(t.path),this.mode=t.mode,this.mode&&(this.mode=this.mode&4095),this.uid=t.uid,this.gid=t.gid,this.uname=t.uname,this.gname=t.gname,this.size=this.remain,this.mtime=t.mtime,this.atime=t.atime,this.ctime=t.ctime,this.linkpath=t.linkpath?f(t.linkpath):void 0,this.uname=t.uname,this.gname=t.gname,e&&this.#t(e),i&&this.#t(i,!0)}write(t){let e=t.length;if(e>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,r=this.blockRemain;return this.remain=Math.max(0,i-e),this.blockRemain=Math.max(0,r-e),this.ignore?!0:i>=e?super.write(t):super.write(t.subarray(0,i))}#t(t,e=!1){t.path&&(t.path=f(t.path)),t.linkpath&&(t.linkpath=f(t.linkpath)),Object.assign(this,Object.fromEntries(Object.entries(t).filter(([i,r])=>!(r==null||i==="path"&&e))))}};var Dt=(s,t,e,i={})=>{s.file&&(i.file=s.file),s.cwd&&(i.cwd=s.cwd),i.code=e instanceof Error&&e.code||t,i.tarCode=t,!s.strict&&i.recoverable!==!1?(e instanceof Error&&(i=Object.assign(e,i),e=e.message),s.emit("warn",t,e,i)):e instanceof Error?s.emit("error",Object.assign(e,i)):s.emit("error",Object.assign(new Error(`${t}: ${e}`),i))};var Nn=1024*1024,Xi=Buffer.from([31,139]),qi=Buffer.from([40,181,47,253]),An=Math.max(Xi.length,qi.length),B=Symbol("state"),Nt=Symbol("writeEntry"),it=Symbol("readEntry"),Zi=Symbol("nextEntry"),Zs=Symbol("processEntry"),V=Symbol("extendedHeader"),he=Symbol("globalExtendedHeader"),dt=Symbol("meta"),Ys=Symbol("emitMeta"),p=Symbol("buffer"),st=Symbol("queue"),mt=Symbol("ended"),Yi=Symbol("emittedEnd"),At=Symbol("emit"),y=Symbol("unzip"),Xe=Symbol("consumeChunk"),qe=Symbol("consumeChunkSub"),Ki=Symbol("consumeBody"),Ks=Symbol("consumeMeta"),Vs=Symbol("consumeHeader"),ae=Symbol("consuming"),Vi=Symbol("bufferConcat"),Qe=Symbol("maybeEnd"),Yt=Symbol("writing"),$=Symbol("aborted"),Je=Symbol("onDone"),It=Symbol("sawValidEntry"),je=Symbol("sawNullBlock"),ti=Symbol("sawEOF"),$s=Symbol("closeStream"),In=1e3,le=Symbol("compressedBytesRead"),$i=Symbol("decompressedBytesRead"),Xs=Symbol("checkDecompressionRatio"),Cn=()=>!0,rt=class extends Dn{file;strict;maxMetaEntrySize;filter;brotli;zstd;maxDecompressionRatio;writable=!0;readable=!1;[st]=[];[p];[it];[Nt];[B]="begin";[dt]="";[V];[he];[mt]=!1;[y];[$]=!1;[It];[je]=!1;[ti]=!1;[Yt]=!1;[ae]=!1;[Yi]=!1;[le]=0;[$i]=0;constructor(t={}){super(),this.file=t.file||"",this.on(Je,()=>{(this[B]==="begin"||this[It]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),t.ondone?this.on(Je,t.ondone):this.on(Je,()=>{this.emit("prefinish"),this.emit("finish"),this.emit("end")}),this.strict=!!t.strict,this.maxDecompressionRatio=typeof t.maxDecompressionRatio=="number"?t.maxDecompressionRatio:In,this.maxMetaEntrySize=t.maxMetaEntrySize||Nn,this.filter=typeof t.filter=="function"?t.filter:Cn;let e=t.file&&(t.file.endsWith(".tar.br")||t.file.endsWith(".tbr"));this.brotli=!(t.gzip||t.zstd)&&t.brotli!==void 0?t.brotli:e?void 0:!1;let i=t.file&&(t.file.endsWith(".tar.zst")||t.file.endsWith(".tzst"));this.zstd=!(t.gzip||t.brotli)&&t.zstd!==void 0?t.zstd:i?!0:void 0,this.on("end",()=>this[$s]()),typeof t.onwarn=="function"&&this.on("warn",t.onwarn),typeof t.onReadEntry=="function"&&this.on("entry",t.onReadEntry)}warn(t,e,i={}){Dt(this,t,e,i)}[Vs](t,e){this[It]===void 0&&(this[It]=!1);let i;try{i=new F(t,e,this[V],this[he])}catch(r){return this.warn("TAR_ENTRY_INVALID",r)}if(i.nullBlock)this[je]?(this[ti]=!0,this[B]==="begin"&&(this[B]="header"),this[At]("eof")):(this[je]=!0,this[At]("nullBlock"));else if(this[je]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let r=i.type;if(/^(Symbolic)?Link$/.test(r)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(r)&&!/^(Global)?ExtendedHeader$/.test(r)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let n=this[Nt]=new $e(i,this[V],this[he]);if(!this[It])if(n.remain){let o=()=>{n.invalid||(this[It]=!0)};n.on("end",o)}else this[It]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[At]("ignoredEntry",n),this[B]="ignore",n.resume()):n.size>0&&(this[dt]="",n.on("data",o=>this[dt]+=o),this[B]="meta"):(this[V]=void 0,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[At]("ignoredEntry",n),this[B]=n.remain?"ignore":"header",n.resume()):(n.remain?this[B]="body":(this[B]="header",n.end()),this[it]?this[st].push(n):(this[st].push(n),this[Zi]())))}}}[$s](){queueMicrotask(()=>this.emit("close"))}[Zs](t){let e=!0;if(!t)this[it]=void 0,e=!1;else if(Array.isArray(t)){let[i,...r]=t;this.emit(i,...r)}else this[it]=t,this.emit("entry",t),t.emittedEnd||(t.on("end",()=>this[Zi]()),e=!1);return e}[Zi](){do;while(this[Zs](this[st].shift()));if(this[st].length===0){let t=this[it];!t||t.flowing||t.size===t.remain?this[Yt]||this.emit("drain"):t.once("drain",()=>this.emit("drain"))}}[Ki](t,e){let i=this[Nt];if(!i)throw new Error("attempt to consume body without entry??");let r=i.blockRemain??0,n=r>=t.length&&e===0?t:t.subarray(e,e+r);return i.write(n),i.blockRemain||(this[B]="header",this[Nt]=void 0,i.end()),n.length}[Ks](t,e){let i=this[Nt],r=this[Ki](t,e);return!this[Nt]&&i&&this[Ys](i),r}[At](t,e,i){this[st].length===0&&!this[it]?this.emit(t,e,i):this[st].push([t,e,i])}[Ys](t){switch(this[At]("meta",this[dt]),t.type){case"ExtendedHeader":case"OldExtendedHeader":this[V]=ft.parse(this[dt],this[V],!1);break;case"GlobalExtendedHeader":this[he]=ft.parse(this[dt],this[he],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":{let e=this[V]??Object.create(null);this[V]=e,e.path=this[dt].replace(/\0.*/,"");break}case"NextFileHasLongLinkpath":{let e=this[V]||Object.create(null);this[V]=e,e.linkpath=this[dt].replace(/\0.*/,"");break}default:throw new Error("unknown meta: "+t.type)}}abort(t){this[$]||(this[$]=!0,this.emit("abort",t),this.warn("TAR_ABORT",t,{recoverable:!1}))}[Xs](t){this[$i]+=t.length;let e=this[$i]/this[le];return e>this.maxDecompressionRatio?(this.abort(new Error(`max decompression ratio exceeded: ${e.toFixed(2)} > ${this.maxDecompressionRatio}`)),!1):!0}write(t,e,i){if(typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,typeof e=="string"?e:"utf8")),this[$])return i?.(),!1;if((this[y]===void 0||this.brotli===void 0&&this[y]===!1)&&t){if(this[p]&&(t=Buffer.concat([this[p],t]),this[p]=void 0),t.length{this[Xs](c)&&this[Xe](c)}),this[y].on("error",c=>{this[$]||this.abort(c)}),this[y].on("end",()=>{this[mt]=!0,this[Xe]()}),this[Yt]=!0,this[le]+=t.length;let l=!!this[y][a?"end":"write"](t);return this[Yt]=!1,i?.(),l}}this[Yt]=!0,this[y]?(this[le]+=t.length,this[y].write(t)):this[Xe](t),this[Yt]=!1;let n=this[st].length>0?!1:this[it]?this[it].flowing:!0;return!n&&this[st].length===0&&this[it]?.once("drain",()=>this.emit("drain")),i?.(),n}[Vi](t){t&&!this[$]&&(this[p]=this[p]?Buffer.concat([this[p],t]):t)}[Qe](){if(this[mt]&&!this[Yi]&&!this[$]&&!this[ae]){this[Yi]=!0;let t=this[Nt];if(t?.blockRemain){let e=this[p]?this[p].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${t.blockRemain} more bytes, only ${e} available)`,{entry:t}),this[p]&&t.write(this[p]),t.end()}this[At](Je)}}[Xe](t){if(this[ae]&&t)this[Vi](t);else if(!t&&!this[p])this[Qe]();else if(t){if(this[ae]=!0,this[p]){this[Vi](t);let e=this[p];this[p]=void 0,this[qe](e)}else this[qe](t);for(;this[p]&&this[p]?.length>=512&&!this[$]&&!this[ti];){let e=this[p];this[p]=void 0,this[qe](e)}this[ae]=!1}(!this[p]||this[mt])&&this[Qe]()}[qe](t){let e=0,i=t.length;for(;e+512<=i&&!this[$]&&!this[ti];)switch(this[B]){case"begin":case"header":this[Vs](t,e),e+=512;break;case"ignore":case"body":e+=this[Ki](t,e);break;case"meta":e+=this[Ks](t,e);break;default:throw new Error("invalid state: "+this[B])}e{let t=s.length-1,e=-1;for(;t>-1&&s.charAt(t)==="/";)e=t,t--;return e===-1?s:s.slice(0,e)};var vn=s=>{let t=s.onReadEntry;s.onReadEntry=t?e=>{t(e),e.resume()}:e=>e.resume()},Qi=(s,t)=>{let e=new Map(t.map(n=>[ut(n),!0])),i=s.filter,r=(n,o="")=>{let h=o||kn(n).root||".",a;if(n===h)a=!1;else{let l=e.get(n);a=l!==void 0?l:r(Fn(n),h)}return e.set(n,a),a};s.filter=i?(n,o)=>i(n,o)&&r(ut(n)):n=>r(ut(n))},Mn=s=>{let t=new rt(s),e=s.file,i;try{i=Kt.openSync(e,"r");let r=Kt.fstatSync(i),n=s.maxReadSize||16*1024*1024;if(r.size{let e=new rt(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,h)=>{e.on("error",h),e.on("end",o),Kt.stat(r,(a,l)=>{if(a)h(a);else{let c=new _t(r,{readSize:i,size:l.size});c.on("error",h),c.pipe(e)}})})},Ct=K(Mn,Bn,s=>new rt(s),s=>new rt(s),(s,t)=>{t?.length&&Qi(s,t),s.noResume||vn(s)});import ui from"fs";import X from"fs";import js from"path";var Ji=(s,t,e)=>(s&=4095,e&&(s=(s|384)&-19),t&&(s&256&&(s|=64),s&32&&(s|=8),s&4&&(s|=1)),s);import{win32 as Pn}from"node:path";var{isAbsolute:zn,parse:qs}=Pn,ce=s=>{let t="",e=qs(s);for(;zn(s)||e.root;){let i=s.charAt(0)==="/"&&s.slice(0,4)!=="//?/"?"/":e.root;s=s.slice(i.length),t+=i,e=qs(s)}return[t,s]};var ei=["|","<",">","?",":"],ji=ei.map(s=>String.fromCodePoint(61440+Number(s.codePointAt(0)))),Un=new Map(ei.map((s,t)=>[s,ji[t]])),Hn=new Map(ji.map((s,t)=>[s,ei[t]])),ts=s=>ei.reduce((t,e)=>t.split(e).join(Un.get(e)),s),Qs=s=>ji.reduce((t,e)=>t.split(e).join(Hn.get(e)),s);var rr=(s,t)=>t?(s=f(s).replace(/^\.(\/|$)/,""),ut(t)+"/"+s):f(s),Wn=16*1024*1024,tr=Symbol("process"),er=Symbol("file"),ir=Symbol("directory"),is=Symbol("symlink"),sr=Symbol("hardlink"),fe=Symbol("header"),ii=Symbol("read"),ss=Symbol("lstat"),si=Symbol("onlstat"),rs=Symbol("onread"),ns=Symbol("onreadlink"),os=Symbol("openfile"),hs=Symbol("onopenfile"),pt=Symbol("close"),ri=Symbol("mode"),as=Symbol("awaitDrain"),es=Symbol("ondrain"),q=Symbol("prefix"),de=class extends A{path;portable;myuid=process.getuid&&process.getuid()||0;myuser=process.env.USER||"";maxReadSize;linkCache;statCache;preservePaths;cwd;strict;mtime;noPax;noMtime;prefix;fd;blockLen=0;blockRemain=0;buf;pos=0;remain=0;length=0;offset=0;win32;absolute;header;type;linkpath;stat;onWriteEntry;#t=!1;constructor(t,e={}){let i=se(e);super(),this.path=f(t),this.portable=!!i.portable,this.maxReadSize=i.maxReadSize||Wn,this.linkCache=i.linkCache||new Map,this.statCache=i.statCache||new Map,this.preservePaths=!!i.preservePaths,this.cwd=f(i.cwd||process.cwd()),this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.mtime=i.mtime,this.prefix=i.prefix?f(i.prefix):void 0,this.onWriteEntry=i.onWriteEntry,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let r=!1;if(!this.preservePaths){let[o,h]=ce(this.path);o&&typeof h=="string"&&(this.path=h,r=o)}this.win32=!!i.win32||process.platform==="win32",this.win32&&(this.path=Qs(this.path.replaceAll(/\\/g,"/")),t=t.replaceAll(/\\/g,"/")),this.absolute=f(i.absolute||js.resolve(this.cwd,t)),this.path===""&&(this.path="./"),r&&this.warn("TAR_ENTRY_INFO",`stripping ${r} from absolute path`,{entry:this,path:r+this.path});let n=this.statCache.get(this.absolute);n?this[si](n):this[ss]()}warn(t,e,i={}){return Dt(this,t,e,i)}emit(t,...e){return t==="error"&&(this.#t=!0),super.emit(t,...e)}[ss](){X.lstat(this.absolute,(t,e)=>{if(t)return this.emit("error",t);this[si](e)})}[si](t){this.statCache.set(this.absolute,t),this.stat=t,t.isFile()||(t.size=0),this.type=Gn(t),this.emit("stat",t),this[tr]()}[tr](){switch(this.type){case"File":return this[er]();case"Directory":return this[ir]();case"SymbolicLink":return this[is]();default:return this.end()}}[ri](t){return Ji(t,this.type==="Directory",this.portable)}[q](t){return rr(t,this.prefix)}[fe](){if(!this.stat)throw new Error("cannot write header before stat");this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.onWriteEntry?.(this),this.header=new F({path:this[q](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[q](this.linkpath):this.linkpath,mode:this[ri](this.stat.mode),uid:this.portable?void 0:this.stat.uid,gid:this.portable?void 0:this.stat.gid,size:this.stat.size,mtime:this.noMtime?void 0:this.mtime||this.stat.mtime,type:this.type==="Unsupported"?void 0:this.type,uname:this.portable?void 0:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?void 0:this.stat.atime,ctime:this.portable?void 0:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new ft({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[q](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[q](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?void 0:this.header.uid,uname:this.portable?void 0:this.header.uname,dev:this.portable?void 0:this.stat.dev,ino:this.portable?void 0:this.stat.ino,nlink:this.portable?void 0:this.stat.nlink}).encode());let t=this.header?.block;if(!t)throw new Error("failed to encode header");super.write(t)}[ir](){if(!this.stat)throw new Error("cannot create directory entry without stat");this.path.slice(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[fe](),this.end()}[is](){X.readlink(this.absolute,(t,e)=>{if(t)return this.emit("error",t);this[ns](e)})}[ns](t){this.linkpath=f(t),this[fe](),this.end()}[sr](t){if(!this.stat)throw new Error("cannot create link entry without stat");this.type="Link",this.linkpath=f(js.relative(this.cwd,t)),this.stat.size=0,this[fe](),this.end()}[er](){if(!this.stat)throw new Error("cannot create file entry without stat");if(this.stat.nlink>1){let t=`${this.stat.dev}:${this.stat.ino}`,e=this.linkCache.get(t);if(e?.indexOf(this.cwd)===0)return this[sr](e);this.linkCache.set(t,this.absolute)}if(this[fe](),this.stat.size===0)return this.end();this[os]()}[os](){X.open(this.absolute,"r",(t,e)=>{if(t)return this.emit("error",t);this[hs](e)})}[hs](t){if(this.fd=t,this.#t)return this[pt]();if(!this.stat)throw new Error("should stat before calling onopenfile");this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let e=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(e),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[ii]()}[ii](){let{fd:t,buf:e,offset:i,length:r,pos:n}=this;if(t===void 0||e===void 0)throw new Error("cannot read file without first opening");X.read(t,e,i,r,n,(o,h)=>{if(o)return this[pt](()=>this.emit("error",o));this[rs](h)})}[pt](t=()=>{}){this.fd!==void 0&&X.close(this.fd,t)}[rs](t){if(t<=0&&this.remain>0){let r=Object.assign(new Error("encountered unexpected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[pt](()=>this.emit("error",r))}if(t>this.remain){let r=Object.assign(new Error("did not encounter expected EOF"),{path:this.absolute,syscall:"read",code:"EOF"});return this[pt](()=>this.emit("error",r))}if(!this.buf)throw new Error("should have created buffer prior to reading");if(t===this.remain)for(let r=t;rthis[es]())}[as](t){this.once("drain",t)}write(t,e,i){if(typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,typeof e=="string"?e:"utf8")),this.blockRemaint?this.emit("error",t):this.end());if(!this.buf)throw new Error("buffer lost somehow in ONDRAIN");this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[ii]()}},ni=class extends de{sync=!0;[ss](){this[si](X.lstatSync(this.absolute))}[is](){this[ns](X.readlinkSync(this.absolute))}[os](){this[hs](X.openSync(this.absolute,"r"))}[ii](){let t=!0;try{let{fd:e,buf:i,offset:r,length:n,pos:o}=this;if(e===void 0||i===void 0)throw new Error("fd and buf must be set in READ method");let h=X.readSync(e,i,r,n,o);this[rs](h),t=!1}finally{if(t)try{this[pt](()=>{})}catch{}}}[as](t){t()}[pt](t=()=>{}){this.fd!==void 0&&X.closeSync(this.fd),t()}},oi=class extends A{blockLen=0;blockRemain=0;buf=0;pos=0;remain=0;length=0;preservePaths;portable;strict;noPax;noMtime;readEntry;type;prefix;path;mode;uid;gid;uname;gname;header;mtime;atime;ctime;linkpath;size;onWriteEntry;warn(t,e,i={}){return Dt(this,t,e,i)}constructor(t,e={}){let i=se(e);super(),this.preservePaths=!!i.preservePaths,this.portable=!!i.portable,this.strict=!!i.strict,this.noPax=!!i.noPax,this.noMtime=!!i.noMtime,this.onWriteEntry=i.onWriteEntry,this.readEntry=t;let{type:r}=t;if(r==="Unsupported")throw new Error("writing entry that should be ignored");this.type=r,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=i.prefix,this.path=f(t.path),this.mode=t.mode!==void 0?this[ri](t.mode):void 0,this.uid=this.portable?void 0:t.uid,this.gid=this.portable?void 0:t.gid,this.uname=this.portable?void 0:t.uname,this.gname=this.portable?void 0:t.gname,this.size=t.size,this.mtime=this.noMtime?void 0:i.mtime||t.mtime,this.atime=this.portable?void 0:t.atime,this.ctime=this.portable?void 0:t.ctime,this.linkpath=t.linkpath!==void 0?f(t.linkpath):void 0,typeof i.onwarn=="function"&&this.on("warn",i.onwarn);let n=!1;if(!this.preservePaths){let[h,a]=ce(this.path);h&&typeof a=="string"&&(this.path=a,n=h)}this.remain=t.size,this.blockRemain=t.startBlockSize,this.onWriteEntry?.(this),this.header=new F({path:this[q](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[q](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?void 0:this.uid,gid:this.portable?void 0:this.gid,size:this.size,mtime:this.noMtime?void 0:this.mtime,type:this.type,uname:this.portable?void 0:this.uname,atime:this.portable?void 0:this.atime,ctime:this.portable?void 0:this.ctime}),n&&this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:this,path:n+this.path}),this.header.encode()&&!this.noPax&&super.write(new ft({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[q](this.path),linkpath:this.type==="Link"&&this.linkpath!==void 0?this[q](this.linkpath):this.linkpath,size:this.size,uid:this.portable?void 0:this.uid,uname:this.portable?void 0:this.uname,dev:this.portable?void 0:this.readEntry.dev,ino:this.portable?void 0:this.readEntry.ino,nlink:this.portable?void 0:this.readEntry.nlink}).encode());let o=this.header?.block;if(!o)throw new Error("failed to encode header");super.write(o),t.pipe(this)}[q](t){return rr(t,this.prefix)}[ri](t){return Ji(t,this.type==="Directory",this.portable)}write(t,e,i){typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,typeof e=="string"?e:"utf8"));let r=t.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(t,i)}end(t,e,i){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),typeof t=="function"&&(i=t,e=void 0,t=void 0),typeof e=="function"&&(i=e,e=void 0),typeof t=="string"&&(t=Buffer.from(t,e??"utf8")),i&&this.once("finish",i),t?super.end(t,i):super.end(i),this}},Gn=s=>s.isFile()?"File":s.isDirectory()?"Directory":s.isSymbolicLink()?"SymbolicLink":"Unsupported";var hi=class s{tail;head;length=0;static create(t=[]){return new s(t)}constructor(t=[]){for(let e of t)this.push(e)}*[Symbol.iterator](){for(let t=this.head;t;t=t.next)yield t.value}removeNode(t){if(t.list!==this)throw new Error("removing node which does not belong to this list");let e=t.next,i=t.prev;return e&&(e.prev=i),i&&(i.next=e),t===this.head&&(this.head=e),t===this.tail&&(this.tail=i),this.length--,t.next=void 0,t.prev=void 0,t.list=void 0,e}unshiftNode(t){if(t===this.head)return;t.list&&t.list.removeNode(t);let e=this.head;t.list=this,t.next=e,e&&(e.prev=t),this.head=t,this.tail||(this.tail=t),this.length++}pushNode(t){if(t===this.tail)return;t.list&&t.list.removeNode(t);let e=this.tail;t.list=this,t.prev=e,e&&(e.next=t),this.tail=t,this.head||(this.head=t),this.length++}push(...t){for(let e=0,i=t.length;e1)i=e;else if(this.head)r=this.head.next,i=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;r;n++)i=t(i,r.value,n),r=r.next;return i}reduceReverse(t,e){let i,r=this.tail;if(arguments.length>1)i=e;else if(this.tail)r=this.tail.prev,i=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(let n=this.length-1;r;n--)i=t(i,r.value,n),r=r.prev;return i}toArray(){let t=new Array(this.length);for(let e=0,i=this.head;i;e++)t[e]=i.value,i=i.next;return t}toArrayReverse(){let t=new Array(this.length);for(let e=0,i=this.tail;i;e++)t[e]=i.value,i=i.prev;return t}slice(t=0,e=this.length){e<0&&(e+=this.length),t<0&&(t+=this.length);let i=new s;if(ethis.length&&(e=this.length);let r=this.head,n=0;for(n=0;r&&nthis.length&&(e=this.length);let r=this.length,n=this.tail;for(;n&&r>e;r--)n=n.prev;for(;n&&r>t;r--,n=n.prev)i.push(n.value);return i}splice(t,e=0,...i){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);let r=this.head;for(let o=0;r&&o1)throw new TypeError("gzip, brotli, zstd are mutually exclusive");if(t.gzip&&(typeof t.gzip!="object"&&(t.gzip={}),this.portable&&(t.gzip.portable=!0),this.zip=new ze(t.gzip)),t.brotli&&(typeof t.brotli!="object"&&(t.brotli={}),this.zip=new We(t.brotli)),t.zstd&&(typeof t.zstd!="object"&&(t.zstd={}),this.zip=new Ye(t.zstd)),!this.zip)throw new Error("impossible");let e=this.zip;e.on("data",i=>super.write(i)),e.on("end",()=>super.end()),e.on("drain",()=>this[fs]()),this.on("resume",()=>e.resume())}else this.on("drain",this[fs]);this.noDirRecurse=!!t.noDirRecurse,this.follow=!!t.follow,this.noMtime=!!t.noMtime,t.mtime&&(this.mtime=t.mtime),this.filter=typeof t.filter=="function"?t.filter:()=>!0,this[W]=new hi,this[G]=0,this.jobs=Number(t.jobs)||4,this[Ee]=!1,this[ue]=!1}[lr](t){return super.write(t)}add(t){return this.write(t),this}end(t,e,i){return typeof t=="function"&&(i=t,t=void 0),typeof e=="function"&&(i=e,e=void 0),t&&this.add(t),this[ue]=!0,this[Ft](),i&&i(),this}write(t){if(this[ue])throw new Error("write after end");return typeof t=="string"?this[ci](t):this[or](t),this.flowing}[or](t){let e=f(ar.resolve(this.cwd,t.path));if(!this.filter(t.path,t))t.resume();else{let i=new pi(t.path,e);i.entry=new oi(t,this[cs](i)),i.entry.on("end",()=>this[ls](i)),this[G]+=1,this[W].push(i)}this[Ft]()}[ci](t){let e=f(ar.resolve(this.cwd,t));this[W].push(new pi(t,e)),this[Ft]()}[ds](t){t.pending=!0,this[G]+=1;let e=this.follow?"stat":"lstat";ui[e](t.absolute,(i,r)=>{t.pending=!1,this[G]-=1,i?this.emit("error",i):this[li](t,r)})}[li](t,e){if(this.statCache.set(t.absolute,e),t.stat=e,!this.filter(t.path,e))t.ignore=!0;else if(e.isFile()&&e.nlink>1&&!this.linkCache.get(`${e.dev}:${e.ino}`)&&!this.sync)if(t===this[Et])this[ai](t);else{let i=`${e.dev}:${e.ino}`,r=this[pe].get(i);r?r.push(t):this[pe].set(i,[t]),t.pendingLink=!0,t.pending=!0}this[Ft]()}[ms](t){t.pending=!0,this[G]+=1,ui.readdir(t.absolute,(e,i)=>{if(t.pending=!1,this[G]-=1,e)return this.emit("error",e);this[fi](t,i)})}[fi](t,e){this.readdirCache.set(t.absolute,e),t.readdir=e,this[Ft]()}[Ft](){if(!this[Ee]){this[Ee]=!0;for(let t=this[W].head;t&&this[G]1){let i=`${e.dev}:${e.ino}`,r=this[pe].get(i);if(r){this[pe].delete(i);for(let n of r)n.pending=!1,this[ai](n)}}this[Ft]()}[ai](t){if(t.pending&&t.pendingLink&&t===this[Et]&&(t.pending=!1,t.pendingLink=!1),!t.pending){if(t.entry){t===this[Et]&&!t.piped&&this[di](t);return}if(!t.stat){let e=this.statCache.get(t.absolute);e?this[li](t,e):this[ds](t)}if(t.stat&&!t.ignore){if(!this.noDirRecurse&&t.stat.isDirectory()&&!t.readdir){let e=this.readdirCache.get(t.absolute);if(e?this[fi](t,e):this[ms](t),!t.readdir)return}if(t.entry=this[hr](t),!t.entry){t.ignore=!0;return}t===this[Et]&&!t.piped&&this[di](t)}}}[cs](t){return{onwarn:(e,i,r)=>this.warn(e,i,r),noPax:this.noPax,cwd:this.cwd,absolute:t.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix,onWriteEntry:this.onWriteEntry}}[hr](t){this[G]+=1;try{return new this[mi](t.path,this[cs](t)).on("end",()=>this[ls](t)).on("error",i=>this.emit("error",i))}catch(e){this.emit("error",e)}}[fs](){this[Et]&&this[Et].entry&&this[Et].entry.resume()}[di](t){t.piped=!0,t.readdir&&t.readdir.forEach(r=>{let n=t.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[ci](o+r)});let e=t.entry,i=this.zip;if(!e)throw new Error("cannot pipe without source");i?e.on("data",r=>{i.write(r)||e.pause()}):e.on("data",r=>{super.write(r)||e.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}warn(t,e,i={}){Dt(this,t,e,i)}},kt=class extends wt{sync=!0;constructor(t){super(t),this[mi]=ni}pause(){}resume(){}[ds](t){let e=this.follow?"statSync":"lstatSync";this[li](t,ui[e](t.absolute))}[ms](t){this[fi](t,ui.readdirSync(t.absolute))}[di](t){let e=t.entry,i=this.zip;if(t.readdir&&t.readdir.forEach(r=>{let n=t.path,o=n==="./"?"":n.replace(/\/*$/,"/");this[ci](o+r)}),!e)throw new Error("Cannot pipe without source");i?e.on("data",r=>{i.write(r)}):e.on("data",r=>{super[lr](r)})}};var Vn=(s,t)=>{let e=new kt(s),i=new Wt(s.file,{mode:s.mode||438});e.pipe(i),fr(e,t)},$n=(s,t)=>{let e=new wt(s),i=new et(s.file,{mode:s.mode||438});e.pipe(i);let r=new Promise((n,o)=>{i.on("error",o),i.on("close",n),e.on("error",o)});return dr(e,t).catch(n=>e.emit("error",n)),r},fr=(s,t)=>{t.forEach(e=>{e.charAt(0)==="@"?Ct({file:cr.resolve(s.cwd,e.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(e)}),s.end()},dr=async(s,t)=>{for(let e of t)e.charAt(0)==="@"?await Ct({file:cr.resolve(String(s.cwd),e.slice(1)),noResume:!0,onReadEntry:i=>{s.add(i)}}):s.add(e);s.end()},Xn=(s,t)=>{let e=new kt(s);return fr(e,t),e},qn=(s,t)=>{let e=new wt(s);return dr(e,t).catch(i=>e.emit("error",i)),e},Qn=K(Vn,$n,Xn,qn,(s,t)=>{if(!t?.length)throw new TypeError("no paths specified to add to archive")});import Br from"node:fs";import co from"node:assert";import{randomBytes as Mr}from"node:crypto";import m from"node:fs";import R from"node:path";import pr from"fs";var Jn=process.env.__FAKE_PLATFORM__||process.platform,Er=Jn==="win32",{O_CREAT:wr,O_NOFOLLOW:mr,O_TRUNC:Sr,O_WRONLY:yr}=pr.constants,Rr=Number(process.env.__FAKE_FS_O_FILENAME__)||pr.constants.UV_FS_O_FILEMAP||0,jn=Er&&!!Rr,to=512*1024,eo=Rr|Sr|wr|yr,ur=!Er&&typeof mr=="number"?mr|Sr|wr|yr:null,us=ur!==null?()=>ur:jn?s=>s"w";import wi from"node:fs";import we from"node:path";var ps=(s,t,e)=>{try{return wi.lchownSync(s,t,e)}catch(i){if(i?.code!=="ENOENT")throw i}},Ei=(s,t,e,i)=>{wi.lchown(s,t,e,r=>{i(r&&r?.code!=="ENOENT"?r:null)})},io=(s,t,e,i,r)=>{if(t.isDirectory())Es(we.resolve(s,t.name),e,i,n=>{if(n)return r(n);let o=we.resolve(s,t.name);Ei(o,e,i,r)});else{let n=we.resolve(s,t.name);Ei(n,e,i,r)}},Es=(s,t,e,i)=>{wi.readdir(s,{withFileTypes:!0},(r,n)=>{if(r){if(r.code==="ENOENT")return i();if(r.code!=="ENOTDIR"&&r.code!=="ENOTSUP")return i(r)}if(r||!n.length)return Ei(s,t,e,i);let o=n.length,h=null,a=l=>{if(!h){if(l)return i(h=l);if(--o===0)return Ei(s,t,e,i)}};for(let l of n)io(s,l,t,e,a)})},so=(s,t,e,i)=>{t.isDirectory()&&ws(we.resolve(s,t.name),e,i),ps(we.resolve(s,t.name),e,i)},ws=(s,t,e)=>{let i;try{i=wi.readdirSync(s,{withFileTypes:!0})}catch(r){let n=r;if(n?.code==="ENOENT")return;if(n?.code==="ENOTDIR"||n?.code==="ENOTSUP")return ps(s,t,e);throw n}for(let r of i)so(s,r,t,e);return ps(s,t,e)};import k from"node:fs";import ro from"node:fs/promises";import Si from"node:path";var Se=class extends Error{path;code;syscall="chdir";constructor(t,e){super(`${e}: Cannot cd into '${t}'`),this.path=t,this.code=e}get name(){return"CwdError"}};var St=class extends Error{path;symlink;syscall="symlink";code="TAR_SYMLINK_ERROR";constructor(t,e){super("TAR_SYMLINK_ERROR: Cannot extract through symbolic link"),this.symlink=t,this.path=e}get name(){return"SymlinkError"}};var no=(s,t)=>{k.stat(s,(e,i)=>{(e||!i.isDirectory())&&(e=new Se(s,e?.code||"ENOTDIR")),t(e)})},gr=(s,t,e)=>{s=f(s);let i=t.umask??18,r=t.mode|448,n=(r&i)!==0,o=t.uid,h=t.gid,a=typeof o=="number"&&typeof h=="number"&&(o!==t.processUid||h!==t.processGid),l=t.preserve,c=t.unlink,d=f(t.cwd),S=(E,x)=>{E?e(E):x&&a?Es(x,o,h,Le=>S(Le)):n?k.chmod(s,r,e):e()};if(s===d)return no(s,S);if(l)return ro.mkdir(s,{mode:r,recursive:!0}).then(E=>S(null,E??void 0),S);let D=f(Si.relative(d,s)).split("/");Ss(d,D,r,c,d,void 0,S)},Ss=(s,t,e,i,r,n,o)=>{if(t.length===0)return o(null,n);let h=t.shift(),a=f(Si.resolve(s+"/"+h));k.mkdir(a,e,br(a,t,e,i,r,n,o))},br=(s,t,e,i,r,n,o)=>h=>{h?k.lstat(s,(a,l)=>{if(a)a.path=a.path&&f(a.path),o(a);else if(l.isDirectory())Ss(s,t,e,i,r,n,o);else if(i)k.unlink(s,c=>{if(c)return o(c);k.mkdir(s,e,br(s,t,e,i,r,n,o))});else{if(l.isSymbolicLink())return o(new St(s,s+"/"+t.join("/")));o(h)}}):(n=n||s,Ss(s,t,e,i,r,n,o))},oo=s=>{let t=!1,e;try{t=k.statSync(s).isDirectory()}catch(i){e=i?.code}finally{if(!t)throw new Se(s,e??"ENOTDIR")}},_r=(s,t)=>{s=f(s);let e=t.umask??18,i=t.mode|448,r=(i&e)!==0,n=t.uid,o=t.gid,h=typeof n=="number"&&typeof o=="number"&&(n!==t.processUid||o!==t.processGid),a=t.preserve,l=t.unlink,c=f(t.cwd),d=E=>{E&&h&&ws(E,n,o),r&&k.chmodSync(s,i)};if(s===c)return oo(c),d();if(a)return d(k.mkdirSync(s,{mode:i,recursive:!0})??void 0);let T=f(Si.relative(c,s)).split("/"),D;for(let E=T.shift(),x=c;E&&(x+="/"+E);E=T.shift()){x=f(Si.resolve(x));try{k.mkdirSync(x,i),D=D||x}catch{let Le=k.lstatSync(x);if(Le.isDirectory())continue;if(l){k.unlinkSync(x),k.mkdirSync(x,i),D=D||x;continue}else if(Le.isSymbolicLink())return new St(x,x+"/"+T.join("/"))}}return d(D)};import{join as xr}from"node:path";var ys=Object.create(null),Or=1e4,Vt=new Set,Tr=s=>{Vt.has(s)?Vt.delete(s):ys[s]=s.normalize("NFD").toLocaleLowerCase("en").toLocaleUpperCase("en"),Vt.add(s);let t=ys[s],e=Vt.size-Or;if(e>Or/10){for(let i of Vt)if(Vt.delete(i),delete ys[i],--e<=0)break}return t};var ho=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,ao=ho==="win32",lo=s=>s.split("/").slice(0,-1).reduce((e,i)=>{let r=e.at(-1);return r!==void 0&&(i=xr(r,i)),e.push(i||"/"),e},[]),yi=class{#t=new Map;#i=new Map;#s=new Set;reserve(t,e){t=ao?["win32 parallelization disabled"]:t.map(r=>ut(xr(Tr(r))));let i=new Set(t.map(r=>lo(r)).reduce((r,n)=>r.concat(n)));this.#i.set(e,{dirs:i,paths:t});for(let r of t){let n=this.#t.get(r);n?n.push(e):this.#t.set(r,[e])}for(let r of i){let n=this.#t.get(r);if(!n)this.#t.set(r,[new Set([e])]);else{let o=n.at(-1);o instanceof Set?o.add(e):n.push(new Set([e]))}}return this.#r(e)}#n(t){let e=this.#i.get(t);if(!e)throw new Error("function does not have any path reservations");return{paths:e.paths.map(i=>this.#t.get(i)),dirs:[...e.dirs].map(i=>this.#t.get(i))}}check(t){let{paths:e,dirs:i}=this.#n(t);return e.every(r=>r&&r[0]===t)&&i.every(r=>r&&r[0]instanceof Set&&r[0].has(t))}#r(t){return this.#s.has(t)||!this.check(t)?!1:(this.#s.add(t),t(()=>this.#e(t)),!0)}#e(t){if(!this.#s.has(t))return!1;let e=this.#i.get(t);if(!e)throw new Error("invalid reservation");let{paths:i,dirs:r}=e,n=new Set;for(let o of i){let h=this.#t.get(o);if(!h||h?.[0]!==t)continue;let a=h[1];if(!a){this.#t.delete(o);continue}if(h.shift(),typeof a=="function")n.add(a);else for(let l of a)n.add(l)}for(let o of r){let h=this.#t.get(o),a=h?.[0];if(!(!h||!(a instanceof Set)))if(a.size===1&&h.length===1){this.#t.delete(o);continue}else if(a.size===1){h.shift();let l=h[0];typeof l=="function"&&n.add(l)}else a.delete(t)}return this.#s.delete(t),n.forEach(o=>this.#r(o)),!0}};var Lr=()=>process.umask();var Dr=Symbol("onEntry"),_s=Symbol("checkFs"),Nr=Symbol("checkFs2"),Os=Symbol("isReusable"),P=Symbol("makeFs"),Ts=Symbol("file"),xs=Symbol("directory"),gi=Symbol("link"),Ar=Symbol("symlink"),Ir=Symbol("hardlink"),Re=Symbol("ensureNoSymlink"),Cr=Symbol("unsupported"),Fr=Symbol("checkPath"),Rs=Symbol("stripAbsolutePath"),yt=Symbol("mkdir"),O=Symbol("onError"),Ri=Symbol("pending"),kr=Symbol("pend"),$t=Symbol("unpend"),gs=Symbol("ended"),bs=Symbol("maybeClose"),Ls=Symbol("skip"),ge=Symbol("doChown"),be=Symbol("uid"),_e=Symbol("gid"),Oe=Symbol("checkedCwd"),fo=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,Te=fo==="win32",mo=1024,uo=(s,t)=>{if(!Te)return m.unlink(s,t);let e=s+".DELETE."+Mr(16).toString("hex");m.rename(s,e,i=>{if(i)return t(i);m.unlink(e,t)})},po=s=>{if(!Te)return m.unlinkSync(s);let t=s+".DELETE."+Mr(16).toString("hex");m.renameSync(s,t),m.unlinkSync(t)},vr=(s,t,e)=>s!==void 0&&s===s>>>0?s:t!==void 0&&t===t>>>0?t:e,Xt=class extends rt{[gs]=!1;[Oe]=!1;[Ri]=0;reservations=new yi;transform;writable=!0;readable=!1;uid;gid;setOwner;preserveOwner;processGid;processUid;maxDepth;forceChown;win32;newer;keep;noMtime;preservePaths;unlink;cwd;strip;processUmask;umask;dmode;fmode;chmod;constructor(t={}){if(t.ondone=()=>{this[gs]=!0,this[bs]()},super(t),this.transform=t.transform,this.chmod=!!t.chmod,typeof t.uid=="number"||typeof t.gid=="number"){if(typeof t.uid!="number"||typeof t.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(t.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=t.uid,this.gid=t.gid,this.setOwner=!0}else this.uid=void 0,this.gid=void 0,this.setOwner=!1;this.preserveOwner=t.preserveOwner===void 0&&typeof t.uid!="number"?process.getuid?.()===0:!!t.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():void 0,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():void 0,this.maxDepth=typeof t.maxDepth=="number"?t.maxDepth:mo,this.forceChown=t.forceChown===!0,this.win32=!!t.win32||Te,this.newer=!!t.newer,this.keep=!!t.keep,this.noMtime=!!t.noMtime,this.preservePaths=!!t.preservePaths,this.unlink=!!t.unlink,this.cwd=f(R.resolve(t.cwd||process.cwd())),this.strip=Number(t.strip)||0,this.processUmask=this.chmod?typeof t.processUmask=="number"?t.processUmask:Lr():0,this.umask=typeof t.umask=="number"?t.umask:this.processUmask,this.dmode=t.dmode||511&~this.umask,this.fmode=t.fmode||438&~this.umask,this.on("entry",e=>this[Dr](e))}warn(t,e,i={}){return(t==="TAR_BAD_ARCHIVE"||t==="TAR_ABORT")&&(i.recoverable=!1),super.warn(t,e,i)}[bs](){this[gs]&&this[Ri]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"))}[Rs](t,e){let i=t[e],{type:r}=t;if(!i||this.preservePaths)return!0;let[n,o]=ce(i),h=o.replaceAll(/\\/g,"/").split("/");if(h.includes("..")||Te&&/^[a-z]:\.\.$/i.test(h[0]??"")){if(e==="path"||r==="Link")return this.warn("TAR_ENTRY_ERROR",`${e} contains '..'`,{entry:t,[e]:i}),!1;let a=R.posix.dirname(t.path),l=R.posix.normalize(R.posix.join(a,h.join("/")));if(l.startsWith("../")||l==="..")return this.warn("TAR_ENTRY_ERROR",`${e} escapes extraction directory`,{entry:t,[e]:i}),!1}return n&&(t[e]=String(o),this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute ${e}`,{entry:t,[e]:i})),!0}[Fr](t){let e=f(t.path),i=e.split("/");if(this.strip){if(i.length=this.strip)t.linkpath=r.slice(this.strip).join("/");else return!1}i.splice(0,this.strip),t.path=i.join("/")}if(isFinite(this.maxDepth)&&i.length>this.maxDepth)return this.warn("TAR_ENTRY_ERROR","path excessively deep",{entry:t,path:e,depth:i.length,maxDepth:this.maxDepth}),!1;if(!this[Rs](t,"path")||!this[Rs](t,"linkpath"))return!1;if(t.absolute=R.isAbsolute(t.path)?f(R.resolve(t.path)):f(R.resolve(this.cwd,t.path)),!this.preservePaths&&typeof t.absolute=="string"&&t.absolute.indexOf(this.cwd+"/")!==0&&t.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:t,path:f(t.path),resolvedPath:t.absolute,cwd:this.cwd}),!1;if(t.absolute===this.cwd&&t.type!=="Directory"&&t.type!=="GNUDumpDir")return!1;if(this.win32){let{root:r}=R.win32.parse(String(t.absolute));t.absolute=r+ts(String(t.absolute).slice(r.length));let{root:n}=R.win32.parse(t.path);t.path=n+ts(t.path.slice(n.length))}return!0}[Dr](t){if(!this[Fr](t))return t.resume();switch(co.equal(typeof t.absolute,"string"),t.type){case"Directory":case"GNUDumpDir":t.mode&&(t.mode=t.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[_s](t);default:return this[Cr](t)}}[O](t,e){t.name==="CwdError"?this.emit("error",t):(this.warn("TAR_ENTRY_ERROR",t,{entry:e}),this[$t](),e.resume())}[yt](t,e,i){gr(f(t),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:e},i)}[ge](t){return this.forceChown||this.preserveOwner&&(typeof t.uid=="number"&&t.uid!==this.processUid||typeof t.gid=="number"&&t.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[be](t){return vr(this.uid,t.uid,this.processUid)}[_e](t){return vr(this.gid,t.gid,this.processGid)}[Ts](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.fmode,r=new et(String(t.absolute),{flags:us(t.size),mode:i,autoClose:!1});r.on("error",a=>{r.fd&&m.close(r.fd,()=>{}),r.write=()=>!0,this[O](a,t),e()});let n=1,o=a=>{if(a){r.fd&&m.close(r.fd,()=>{}),this[O](a,t),e();return}--n===0&&r.fd!==void 0&&m.close(r.fd,l=>{l?this[O](l,t):this[$t](),e()})};r.on("finish",()=>{let a=String(t.absolute),l=r.fd;if(typeof l=="number"&&t.mtime&&!this.noMtime){n++;let c=t.atime||new Date,d=t.mtime;m.futimes(l,c,d,S=>S?m.utimes(a,c,d,T=>o(T&&S)):o())}if(typeof l=="number"&&this[ge](t)){n++;let c=this[be](t),d=this[_e](t);typeof c=="number"&&typeof d=="number"&&m.fchown(l,c,d,S=>S?m.chown(a,c,d,T=>o(T&&S)):o())}o()});let h=this.transform&&this.transform(t)||t;h!==t&&(h.on("error",a=>{this[O](a,t),e()}),t.pipe(h)),h.pipe(r)}[xs](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.dmode;this[yt](String(t.absolute),i,r=>{if(r){this[O](r,t),e();return}let n=1,o=()=>{--n===0&&(e(),this[$t](),t.resume())};t.mtime&&!this.noMtime&&(n++,m.utimes(String(t.absolute),t.atime||new Date,t.mtime,o)),this[ge](t)&&(n++,m.chown(String(t.absolute),Number(this[be](t)),Number(this[_e](t)),o)),o()})}[Cr](t){t.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${t.type}`,{entry:t}),t.resume()}[Ar](t,e){let i=f(R.relative(this.cwd,R.resolve(R.dirname(String(t.absolute)),String(t.linkpath)))).split("/");this[Re](t,this.cwd,i,()=>this[gi](t,String(t.linkpath),"symlink",e),r=>{this[O](r,t),e()})}[Ir](t,e){let i=f(R.resolve(this.cwd,String(t.linkpath))),r=f(String(t.linkpath)).split("/");this[Re](t,this.cwd,r,()=>this[gi](t,i,"link",e),n=>{this[O](n,t),e()})}[Re](t,e,i,r,n){let o=i.shift();if(this.preservePaths||o===void 0)return r();let h=R.resolve(e,o);m.lstat(h,(a,l)=>{if(a)return r();if(l?.isSymbolicLink())return n(new St(h,R.resolve(h,i.join("/"))));this[Re](t,h,i,r,n)})}[kr](){this[Ri]++}[$t](){this[Ri]--,this[bs]()}[Ls](t){this[$t](),t.resume()}[Os](t,e){return t.type==="File"&&!this.unlink&&e.isFile()&&e.nlink<=1&&!Te}[_s](t){this[kr]();let e=[t.path];t.linkpath&&e.push(t.linkpath),this.reservations.reserve(e,i=>this[Nr](t,i))}[Nr](t,e){let i=h=>{e(h)},r=()=>{this[yt](this.cwd,this.dmode,h=>{if(h){this[O](h,t),i();return}this[Oe]=!0,n()})},n=()=>{if(t.absolute!==this.cwd){let h=f(R.dirname(String(t.absolute)));if(h!==this.cwd)return this[yt](h,this.dmode,a=>{if(a){this[O](a,t),i();return}o()})}o()},o=()=>{m.lstat(String(t.absolute),(h,a)=>{if(a&&(this.keep||this.newer&&a.mtime>(t.mtime??a.mtime))){this[Ls](t),i();return}if(h||this[Os](t,a))return this[P](null,t,i);if(a.isDirectory()){if(t.type==="Directory"){let l=this.chmod&&t.mode&&(a.mode&4095)!==t.mode,c=d=>this[P](d??null,t,i);return l?m.chmod(String(t.absolute),Number(t.mode),c):c()}if(t.absolute!==this.cwd)return m.rmdir(String(t.absolute),l=>this[P](l??null,t,i))}if(t.absolute===this.cwd)return this[P](null,t,i);uo(String(t.absolute),l=>this[P](l??null,t,i))})};this[Oe]?n():r()}[P](t,e,i){if(t){this[O](t,e),i();return}switch(e.type){case"File":case"OldFile":case"ContiguousFile":return this[Ts](e,i);case"Link":return this[Ir](e,i);case"SymbolicLink":return this[Ar](e,i);case"Directory":case"GNUDumpDir":return this[xs](e,i)}}[gi](t,e,i,r){m[i](e,String(t.absolute),n=>{n?this[O](n,t):(this[$t](),t.resume()),r()})}},ye=s=>{try{return[null,s()]}catch(t){return[t,null]}},xe=class extends Xt{sync=!0;[P](t,e){return super[P](t,e,()=>{})}[_s](t){if(!this[Oe]){let n=this[yt](this.cwd,this.dmode);if(n)return this[O](n,t);this[Oe]=!0}if(t.absolute!==this.cwd){let n=f(R.dirname(String(t.absolute)));if(n!==this.cwd){let o=this[yt](n,this.dmode);if(o)return this[O](o,t)}}let[e,i]=ye(()=>m.lstatSync(String(t.absolute)));if(i&&(this.keep||this.newer&&i.mtime>(t.mtime??i.mtime)))return this[Ls](t);if(e||this[Os](t,i))return this[P](null,t);if(i.isDirectory()){if(t.type==="Directory"){let o=this.chmod&&t.mode&&(i.mode&4095)!==t.mode,[h]=o?ye(()=>{m.chmodSync(String(t.absolute),Number(t.mode))}):[];return this[P](h,t)}let[n]=ye(()=>m.rmdirSync(String(t.absolute)));this[P](n,t)}let[r]=t.absolute===this.cwd?[]:ye(()=>po(String(t.absolute)));this[P](r,t)}[Ts](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.fmode,r=h=>{let a;try{m.closeSync(n)}catch(l){a=l}(h||a)&&this[O](h||a,t),e()},n;try{n=m.openSync(String(t.absolute),us(t.size),i)}catch(h){return r(h)}let o=this.transform&&this.transform(t)||t;o!==t&&(o.on("error",h=>this[O](h,t)),t.pipe(o)),o.on("data",h=>{try{m.writeSync(n,h,0,h.length)}catch(a){r(a)}}),o.on("end",()=>{let h=null;if(t.mtime&&!this.noMtime){let a=t.atime||new Date,l=t.mtime;try{m.futimesSync(n,a,l)}catch(c){try{m.utimesSync(String(t.absolute),a,l)}catch{h=c}}}if(this[ge](t)){let a=this[be](t),l=this[_e](t);try{m.fchownSync(n,Number(a),Number(l))}catch(c){try{m.chownSync(String(t.absolute),Number(a),Number(l))}catch{h=h||c}}}r(h)})}[xs](t,e){let i=typeof t.mode=="number"?t.mode&4095:this.dmode,r=this[yt](String(t.absolute),i);if(r){this[O](r,t),e();return}if(t.mtime&&!this.noMtime)try{m.utimesSync(String(t.absolute),t.atime||new Date,t.mtime)}catch{}if(this[ge](t))try{m.chownSync(String(t.absolute),Number(this[be](t)),Number(this[_e](t)))}catch{}e(),t.resume()}[yt](t,e){try{return _r(f(t),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cwd:this.cwd,mode:e})}catch(i){return i}}[Re](t,e,i,r,n){if(this.preservePaths||i.length===0)return r();let o=e;for(let h of i){o=R.resolve(o,h);let[a,l]=ye(()=>m.lstatSync(o));if(a)return r();if(l.isSymbolicLink())return n(new St(o,R.resolve(e,i.join("/"))))}r()}[gi](t,e,i,r){let n=`${i}Sync`;try{m[n](e,String(t.absolute)),r(),t.resume()}catch(o){return this[O](o,t)}}};var Eo=s=>{let t=new xe(s),e=s.file,i=Br.statSync(e),r=s.maxReadSize||16*1024*1024;new Be(e,{readSize:r,size:i.size}).pipe(t)},wo=(s,t)=>{let e=new Xt(s),i=s.maxReadSize||16*1024*1024,r=s.file;return new Promise((o,h)=>{e.on("error",h),e.on("close",o),Br.stat(r,(a,l)=>{if(a)h(a);else{let c=new _t(r,{readSize:i,size:l.size});c.on("error",h),c.pipe(e)}})})},So=K(Eo,wo,s=>new xe(s),s=>new Xt(s),(s,t)=>{t?.length&&Qi(s,t)});import v from"node:fs";import Pr from"node:path";var yo=(s,t)=>{let e=new kt(s),i=!0,r,n;try{try{r=v.openSync(s.file,"r+")}catch(a){if(a?.code==="ENOENT")r=v.openSync(s.file,"w+");else throw a}let o=v.fstatSync(r),h=Buffer.alloc(512);t:for(n=0;no.size)break;n+=l,s.mtimeCache&&a.mtime&&s.mtimeCache.set(String(a.path),a.mtime)}i=!1,Ro(s,e,n,r,t)}finally{if(i)try{v.closeSync(r)}catch{}}},Ro=(s,t,e,i,r)=>{let n=new Wt(s.file,{fd:i,start:e});t.pipe(n),bo(t,r)},go=(s,t)=>{t=Array.from(t);let e=new wt(s),i=(n,o,h)=>{let a=(T,D)=>{T?v.close(n,E=>h(T)):h(null,D)},l=0;if(o===0)return a(null,0);let c=0,d=Buffer.alloc(512),S=(T,D)=>{if(T||D===void 0)return a(T);if(c+=D,c<512&&D)return v.read(n,d,c,d.length-c,l+c,S);if(l===0&&d[0]===31&&d[1]===139)return a(new Error("cannot append to compressed archives"));if(c<512)return a(null,l);let E=new F(d);if(!E.cksumValid)return a(null,l);let x=512*Math.ceil((E.size??0)/512);if(l+x+512>o||(l+=x+512,l>=o))return a(null,l);s.mtimeCache&&E.mtime&&s.mtimeCache.set(String(E.path),E.mtime),c=0,v.read(n,d,0,512,l,S)};v.read(n,d,0,512,l,S)};return new Promise((n,o)=>{e.on("error",o);let h="r+",a=(l,c)=>{if(l&&l.code==="ENOENT"&&h==="r+")return h="w+",v.open(s.file,h,a);if(l||!c)return o(l);v.fstat(c,(d,S)=>{if(d)return v.close(c,()=>o(d));i(c,S.size,(T,D)=>{if(T)return o(T);let E=new et(s.file,{fd:c,start:D});e.pipe(E),E.on("error",o),E.on("close",n),_o(e,t)})})};v.open(s.file,h,a)})},bo=(s,t)=>{t.forEach(e=>{e.charAt(0)==="@"?Ct({file:Pr.resolve(s.cwd,e.slice(1)),sync:!0,noResume:!0,onReadEntry:i=>s.add(i)}):s.add(e)}),s.end()},_o=async(s,t)=>{for(let e of t)e.charAt(0)==="@"?await Ct({file:Pr.resolve(String(s.cwd),e.slice(1)),noResume:!0,onReadEntry:i=>s.add(i)}):s.add(e);s.end()},vt=K(yo,go,()=>{throw new TypeError("file is required")},()=>{throw new TypeError("file is required")},(s,t)=>{if(!Bs(s))throw new TypeError("file is required");if(s.gzip||s.brotli||s.zstd||s.file.endsWith(".br")||s.file.endsWith(".tbr"))throw new TypeError("cannot append to compressed archives");if(!t?.length)throw new TypeError("no paths specified to add/replace")});var Oo=K(vt.syncFile,vt.asyncFile,vt.syncNoFile,vt.asyncNoFile,(s,t=[])=>{vt.validate?.(s,t),To(s)}),To=s=>{let t=s.filter;s.mtimeCache||(s.mtimeCache=new Map),s.filter=t?(e,i)=>t(e,i)&&!((s.mtimeCache?.get(e)??i.mtime??0)>(i.mtime??0)):(e,i)=>!((s.mtimeCache?.get(e)??i.mtime??0)>(i.mtime??0))};export{F as Header,wt as Pack,pi as PackJob,kt as PackSync,rt as Parser,ft as Pax,$e as ReadEntry,Xt as Unpack,xe as UnpackSync,de as WriteEntry,ni as WriteEntrySync,oi as WriteEntryTar,Qn as c,Qn as create,So as extract,Qi as filesFilter,Ct as list,vt as r,vt as replace,Ct as t,Hi as types,Oo as u,Oo as update,So as x}; //# sourceMappingURL=index.min.js.map diff --git a/deps/npm/node_modules/tar/dist/esm/normalize-windows-path.js b/deps/npm/node_modules/tar/dist/esm/normalize-windows-path.js index bde0c962344a..cc75178aa9ce 100644 --- a/deps/npm/node_modules/tar/dist/esm/normalize-windows-path.js +++ b/deps/npm/node_modules/tar/dist/esm/normalize-windows-path.js @@ -4,6 +4,6 @@ // so that we can use / as our one and only directory separator char. const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; export const normalizeWindowsPath = platform !== 'win32' ? - (p) => p - : (p) => p && p.replaceAll(/\\/g, '/'); + (p) => String(p) + : (p) => String(p).replaceAll(/\\/g, '/'); //# sourceMappingURL=normalize-windows-path.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/tar/dist/esm/parse.js b/deps/npm/node_modules/tar/dist/esm/parse.js index 02454bfd2c40..fb303a5171be 100644 --- a/deps/npm/node_modules/tar/dist/esm/parse.js +++ b/deps/npm/node_modules/tar/dist/esm/parse.js @@ -57,6 +57,10 @@ const SAW_VALID_ENTRY = Symbol('sawValidEntry'); const SAW_NULL_BLOCK = Symbol('sawNullBlock'); const SAW_EOF = Symbol('sawEOF'); const CLOSESTREAM = Symbol('closeStream'); +const MAX_DECOMPRESSION_RATIO = 1000; +const COMPRESSEDBYTESREAD = Symbol('compressedBytesRead'); +const DECOMPRESSEDBYTESREAD = Symbol('decompressedBytesRead'); +const CHECKDECOMPRESSIONRATIO = Symbol('checkDecompressionRatio'); const noop = () => true; export class Parser extends EE { file; @@ -65,6 +69,7 @@ export class Parser extends EE { filter; brotli; zstd; + maxDecompressionRatio; writable = true; readable = false; [QUEUE] = []; @@ -84,6 +89,8 @@ export class Parser extends EE { [WRITING] = false; [CONSUMING] = false; [EMITTEDEND] = false; + [COMPRESSEDBYTESREAD] = 0; + [DECOMPRESSEDBYTESREAD] = 0; constructor(opt = {}) { super(); this.file = opt.file || ''; @@ -106,6 +113,10 @@ export class Parser extends EE { }); } this.strict = !!opt.strict; + this.maxDecompressionRatio = + typeof opt.maxDecompressionRatio === 'number' ? + opt.maxDecompressionRatio + : MAX_DECOMPRESSION_RATIO; this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize; this.filter = typeof opt.filter === 'function' ? opt.filter : noop; // Unlike gzip, brotli doesn't have any magic bytes to identify it @@ -359,11 +370,23 @@ export class Parser extends EE { } } abort(error) { + if (this[ABORTED]) { + return; + } this[ABORTED] = true; this.emit('abort', error); // always throws, even in non-strict mode this.warn('TAR_ABORT', error, { recoverable: false }); } + [CHECKDECOMPRESSIONRATIO](chunk) { + this[DECOMPRESSEDBYTESREAD] += chunk.length; + const ratio = this[DECOMPRESSEDBYTESREAD] / this[COMPRESSEDBYTESREAD]; + if (ratio > this.maxDecompressionRatio) { + this.abort(new Error(`max decompression ratio exceeded: ${ratio.toFixed(2)} > ${this.maxDecompressionRatio}`)); + return false; + } + return true; + } write(chunk, encoding, cb) { if (typeof encoding === 'function') { cb = encoding; @@ -447,13 +470,22 @@ export class Parser extends EE { this[UNZIP] === undefined ? new Unzip({}) : isZstd ? new ZstdDecompress({}) : new BrotliDecompress({}); - this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk)); - this[UNZIP].on('error', er => this.abort(er)); + this[UNZIP].on('data', chunk => { + if (this[CHECKDECOMPRESSIONRATIO](chunk)) { + this[CONSUMECHUNK](chunk); + } + }); + this[UNZIP].on('error', er => { + if (!this[ABORTED]) { + this.abort(er); + } + }); this[UNZIP].on('end', () => { this[ENDED] = true; this[CONSUMECHUNK](); }); this[WRITING] = true; + this[COMPRESSEDBYTESREAD] += chunk.length; const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk); this[WRITING] = false; cb?.(); @@ -462,6 +494,7 @@ export class Parser extends EE { } this[WRITING] = true; if (this[UNZIP]) { + this[COMPRESSEDBYTESREAD] += chunk.length; this[UNZIP].write(chunk); } else { @@ -492,7 +525,7 @@ export class Parser extends EE { !this[CONSUMING]) { this[EMITTEDEND] = true; const entry = this[WRITEENTRY]; - if (entry && entry.blockRemain) { + if (entry?.blockRemain) { // truncated, likely a damaged file const have = this[BUFFER] ? this[BUFFER].length : 0; this.warn('TAR_BAD_ARCHIVE', `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`, { entry }); @@ -586,8 +619,10 @@ export class Parser extends EE { if (!this[ABORTED]) { if (this[UNZIP]) { /* c8 ignore start */ - if (chunk) + if (chunk) { + this[COMPRESSEDBYTESREAD] += chunk.length; this[UNZIP].write(chunk); + } /* c8 ignore stop */ this[UNZIP].end(); } diff --git a/deps/npm/node_modules/tar/dist/esm/pax.js b/deps/npm/node_modules/tar/dist/esm/pax.js index 832808f344da..907193a4b932 100644 --- a/deps/npm/node_modules/tar/dist/esm/pax.js +++ b/deps/npm/node_modules/tar/dist/esm/pax.js @@ -143,12 +143,36 @@ const parseKVLine = (set, line) => { 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) * 1000) - : /^[0-9]+$/.test(v) ? +v - : v; + const v = kv.join('=').replace(/\0.*/, ''); + switch (k) { + case 'path': + case 'linkpath': + case 'type': + case 'charset': + case 'comment': + case 'gname': + case 'uname': + set[k] = v; + break; + case 'ctime': + case 'atime': + case 'mtime': + set[k] = new Date(Number(v) * 1000); + break; + case 'size': + const s = +v; + if (s >= 0) + set[k] = s; + break; + case 'gid': + case 'uid': + case 'dev': + case 'ino': + case 'nlink': + case 'mode': + set[k] = +v; + break; + } return set; }; //# sourceMappingURL=pax.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/tar/dist/esm/unpack.js b/deps/npm/node_modules/tar/dist/esm/unpack.js index 46c53db2ad57..3bbdad99bcd8 100644 --- a/deps/npm/node_modules/tar/dist/esm/unpack.js +++ b/deps/npm/node_modules/tar/dist/esm/unpack.js @@ -146,7 +146,7 @@ export class Unpack extends Parser { // default true for root this.preserveOwner = opt.preserveOwner === undefined && typeof opt.uid !== 'number' ? - !!(process.getuid && process.getuid() === 0) + !!(process.getuid?.() === 0) : !!opt.preserveOwner; this.processUid = (this.preserveOwner || this.setOwner) && process.getuid ? @@ -367,7 +367,7 @@ export class Unpack extends Parser { } } [MKDIR](dir, mode, cb) { - mkdir(normalizeWindowsPath(dir), { + void mkdir(normalizeWindowsPath(dir), { uid: this.uid, gid: this.gid, processUid: this.processUid, diff --git a/deps/npm/node_modules/tar/package.json b/deps/npm/node_modules/tar/package.json index 556b3e7d9f2f..9d082e440494 100644 --- a/deps/npm/node_modules/tar/package.json +++ b/deps/npm/node_modules/tar/package.json @@ -2,7 +2,7 @@ "author": "Isaac Z. Schlueter", "name": "tar", "description": "tar for node", - "version": "7.5.16", + "version": "7.5.19", "repository": { "type": "git", "url": "https://github.com/isaacs/node-tar.git" diff --git a/deps/npm/node_modules/undici/docs/docs/api/Client.md b/deps/npm/node_modules/undici/docs/docs/api/Client.md index fdee5ea70267..e0d41b47805e 100644 --- a/deps/npm/node_modules/undici/docs/docs/api/Client.md +++ b/deps/npm/node_modules/undici/docs/docs/api/Client.md @@ -27,6 +27,7 @@ Returns: `Client` * **maxHeaderSize** `number | null` (optional) - Default: `--max-http-header-size` or `16384` - The maximum length of request headers in bytes. Defaults to Node.js' --max-http-header-size or 16KiB. * **maxResponseSize** `number | null` (optional) - Default: `-1` - The maximum length of response body in bytes. Set to `-1` to disable. * **webSocket** `WebSocketOptions` (optional) - WebSocket-specific configuration options. + * **maxFragments** `number` (optional) - Default: `131072` - Maximum number of fragments in a message. Set to 0 to disable the limit. * **maxPayloadSize** `number` (optional) - Default: `134217728` (128 MB) - Maximum allowed payload size in bytes for WebSocket messages. Applied to uncompressed messages, compressed frame payloads, and decompressed (permessage-deflate) messages. Set to 0 to disable the limit. * **pipelining** `number | null` (optional) - Default: `1` - The amount of concurrent requests to be sent over the single TCP/TLS connection according to [RFC7230](https://tools.ietf.org/html/rfc7230#section-6.3.2). Carefully consider your workload and environment before enabling concurrent requests as pipelining may reduce performance if used incorrectly. Pipelining is sensitive to network stack settings as well as head of line blocking caused by e.g. long running requests. Set to `0` to disable keep-alive connections. * **connect** `ConnectOptions | Function | null` (optional) - Default: `null`. diff --git a/deps/npm/node_modules/undici/lib/dispatcher/client-h1.js b/deps/npm/node_modules/undici/lib/dispatcher/client-h1.js index ef3d38ea4f2e..9455517a19b1 100644 --- a/deps/npm/node_modules/undici/lib/dispatcher/client-h1.js +++ b/deps/npm/node_modules/undici/lib/dispatcher/client-h1.js @@ -57,6 +57,9 @@ const EMPTY_BUF = Buffer.alloc(0) const FastBuffer = Buffer[Symbol.species] const addListener = util.addListener const removeAllListeners = util.removeAllListeners +const kIdleSocketValidation = Symbol('kIdleSocketValidation') +const kIdleSocketValidationTimeout = Symbol('kIdleSocketValidationTimeout') +const kSocketUsed = Symbol('kSocketUsed') let extractBody @@ -371,6 +374,11 @@ class Parser { return -1 } + if (client[kRunning] === 0) { + util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) + return -1 + } + const request = client[kQueue][client[kRunningIdx]] if (!request) { return -1 @@ -474,6 +482,11 @@ class Parser { return -1 } + if (client[kRunning] === 0) { + util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) + return -1 + } + const request = client[kQueue][client[kRunningIdx]] /* istanbul ignore next: difficult to make a test case for */ @@ -647,6 +660,7 @@ class Parser { request.onComplete(headers) client[kQueue][client[kRunningIdx]++] = null + socket[kSocketUsed] = true if (socket[kWriting]) { assert(client[kRunning] === 0) @@ -705,6 +719,9 @@ async function connectH1 (client, socket) { socket[kWriting] = false socket[kReset] = false socket[kBlocking] = false + socket[kIdleSocketValidation] = 0 + socket[kIdleSocketValidationTimeout] = null + socket[kSocketUsed] = false socket[kParser] = new Parser(client, socket, llhttpInstance) addListener(socket, 'error', function (err) { @@ -751,6 +768,8 @@ async function connectH1 (client, socket) { const client = this[kClient] const parser = this[kParser] + clearIdleSocketValidation(this) + if (parser) { if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { this[kError] = parser.finish() || this[kError] @@ -816,7 +835,7 @@ async function connectH1 (client, socket) { return socket.destroyed }, busy (request) { - if (socket[kWriting] || socket[kReset] || socket[kBlocking]) { + if (socket[kWriting] || socket[kReset] || socket[kBlocking] || socket[kIdleSocketValidation] === 1) { return true } @@ -854,6 +873,31 @@ async function connectH1 (client, socket) { } } +function clearIdleSocketValidation (socket) { + if (socket[kIdleSocketValidationTimeout]) { + clearTimeout(socket[kIdleSocketValidationTimeout]) + socket[kIdleSocketValidationTimeout] = null + } + + socket[kIdleSocketValidation] = 0 +} + +function scheduleIdleSocketValidation (client, socket) { + socket[kIdleSocketValidation] = 1 + socket[kIdleSocketValidationTimeout] = setTimeout(() => { + socket[kIdleSocketValidationTimeout] = null + socket[kIdleSocketValidation] = 2 + + if (client[kSocket] === socket && !socket.destroyed) { + client[kResume]() + } + }, 0) + socket[kIdleSocketValidationTimeout].unref?.() +} + +/** + * @param {import('./client.js')} client + */ function resumeH1 (client) { const socket = client[kSocket] @@ -868,6 +912,32 @@ function resumeH1 (client) { socket[kNoRef] = false } + if (client[kRunning] === 0 && client[kPending] > 0 && socket[kSocketUsed]) { + if (socket[kIdleSocketValidation] === 0) { + scheduleIdleSocketValidation(client, socket) + socket[kParser].readMore() + if (socket.destroyed) { + return + } + return + } + + if (socket[kIdleSocketValidation] === 1) { + socket[kParser].readMore() + if (socket.destroyed) { + return + } + return + } + } + + if (client[kRunning] === 0) { + socket[kParser].readMore() + if (socket.destroyed) { + return + } + } + if (client[kSize] === 0) { if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) { socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE) @@ -961,6 +1031,7 @@ function writeH1 (client, request) { } const socket = client[kSocket] + clearIdleSocketValidation(socket) const abort = (err) => { if (request.aborted || request.completed) { diff --git a/deps/npm/node_modules/undici/lib/dispatcher/dispatcher-base.js b/deps/npm/node_modules/undici/lib/dispatcher/dispatcher-base.js index c999b2c2fb67..371a3ea1f6f1 100644 --- a/deps/npm/node_modules/undici/lib/dispatcher/dispatcher-base.js +++ b/deps/npm/node_modules/undici/lib/dispatcher/dispatcher-base.js @@ -26,6 +26,7 @@ class DispatcherBase extends Dispatcher { get webSocketOptions () { return { + maxFragments: this[kWebSocketOptions].maxFragments ?? 131072, maxPayloadSize: this[kWebSocketOptions].maxPayloadSize ?? 128 * 1024 * 1024 } } diff --git a/deps/npm/node_modules/undici/lib/web/cookies/parse.js b/deps/npm/node_modules/undici/lib/web/cookies/parse.js index 3c48c26b93ff..b3c25fb9423e 100644 --- a/deps/npm/node_modules/undici/lib/web/cookies/parse.js +++ b/deps/npm/node_modules/undici/lib/web/cookies/parse.js @@ -275,32 +275,25 @@ function parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) // If the attribute-name case-insensitively matches the string // "SameSite", the user agent MUST process the cookie-av as follows: - // 1. Let enforcement be "Default". - let enforcement = 'Default' - const attributeValueLowercase = attributeValue.toLowerCase() - // 2. If cookie-av's attribute-value is a case-insensitive match for - // "None", set enforcement to "None". - if (attributeValueLowercase.includes('none')) { - enforcement = 'None' - } - // 3. If cookie-av's attribute-value is a case-insensitive match for - // "Strict", set enforcement to "Strict". - if (attributeValueLowercase.includes('strict')) { - enforcement = 'Strict' + // 1. If cookie-av's attribute-value is a case-insensitive match for + // "None", append an attribute to the cookie-attribute-list with an + // attribute-name of "SameSite" and an attribute-value of "None". + if (attributeValueLowercase === 'none') { + cookieAttributeList.sameSite = 'None' + } else if (attributeValueLowercase === 'strict') { + // 2. If cookie-av's attribute-value is a case-insensitive match for + // "Strict", append an attribute to the cookie-attribute-list with + // an attribute-name of "SameSite" and an attribute-value of + // "Strict". + cookieAttributeList.sameSite = 'Strict' + } else if (attributeValueLowercase === 'lax') { + // 3. If cookie-av's attribute-value is a case-insensitive match for + // "Lax", append an attribute to the cookie-attribute-list with an + // attribute-name of "SameSite" and an attribute-value of "Lax". + cookieAttributeList.sameSite = 'Lax' } - - // 4. If cookie-av's attribute-value is a case-insensitive match for - // "Lax", set enforcement to "Lax". - if (attributeValueLowercase.includes('lax')) { - enforcement = 'Lax' - } - - // 5. Append an attribute to the cookie-attribute-list with an - // attribute-name of "SameSite" and an attribute-value of - // enforcement. - cookieAttributeList.sameSite = enforcement } else { cookieAttributeList.unparsed ??= [] diff --git a/deps/npm/node_modules/undici/lib/web/websocket/receiver.js b/deps/npm/node_modules/undici/lib/web/websocket/receiver.js index 53e427eb2e46..a7dea7fae1c1 100644 --- a/deps/npm/node_modules/undici/lib/web/websocket/receiver.js +++ b/deps/npm/node_modules/undici/lib/web/websocket/receiver.js @@ -20,6 +20,11 @@ const { closeWebSocketConnection } = require('./connection') const { PerMessageDeflate } = require('./permessage-deflate') const { MessageSizeExceededError } = require('../../core/errors') +function failWebsocketConnectionWithCode (ws, code, reason) { + closeWebSocketConnection(ws, code, reason, Buffer.byteLength(reason)) + failWebsocketConnection(ws, reason) +} + // This code was influenced by ws released under the MIT license. // Copyright (c) 2011 Einar Otto Stangvik // Copyright (c) 2013 Arnout Kazemier and contributors @@ -39,19 +44,23 @@ class ByteParser extends Writable { /** @type {Map} */ #extensions + /** @type {number} */ + #maxFragments + /** @type {number} */ #maxPayloadSize /** * @param {import('./websocket').WebSocket} ws * @param {Map|null} extensions - * @param {{ maxPayloadSize?: number }} [options] + * @param {{ maxFragments?: number, maxPayloadSize?: number }} [options] */ constructor (ws, extensions, options = {}) { super() this.ws = ws this.#extensions = extensions == null ? new Map() : extensions + this.#maxFragments = options.maxFragments ?? 0 this.#maxPayloadSize = options.maxPayloadSize ?? 0 if (this.#extensions.has('permessage-deflate')) { @@ -75,9 +84,9 @@ class ByteParser extends Writable { if ( this.#maxPayloadSize > 0 && !isControlFrame(this.#info.opcode) && - this.#info.payloadLength > this.#maxPayloadSize + this.#info.payloadLength + this.#fragmentsBytes > this.#maxPayloadSize ) { - failWebsocketConnection(this.ws, 'Payload size exceeds maximum allowed size') + failWebsocketConnectionWithCode(this.ws, 1009, 'Payload size exceeds maximum allowed size') return false } @@ -242,10 +251,12 @@ class ByteParser extends Writable { this.#state = parserStates.INFO } else { if (!this.#info.compressed) { - this.writeFragments(body) + if (!this.writeFragments(body)) { + return + } if (this.#maxPayloadSize > 0 && this.#fragmentsBytes > this.#maxPayloadSize) { - failWebsocketConnection(this.ws, new MessageSizeExceededError().message) + failWebsocketConnectionWithCode(this.ws, 1009, new MessageSizeExceededError().message) return } @@ -264,14 +275,17 @@ class ByteParser extends Writable { this.#info.fin, (error, data) => { if (error) { - failWebsocketConnection(this.ws, error.message) + const code = error instanceof MessageSizeExceededError ? 1009 : 1007 + failWebsocketConnectionWithCode(this.ws, code, error.message) return } - this.writeFragments(data) + if (!this.writeFragments(data)) { + return + } if (this.#maxPayloadSize > 0 && this.#fragmentsBytes > this.#maxPayloadSize) { - failWebsocketConnection(this.ws, new MessageSizeExceededError().message) + failWebsocketConnectionWithCode(this.ws, 1009, new MessageSizeExceededError().message) return } @@ -341,8 +355,17 @@ class ByteParser extends Writable { } writeFragments (fragment) { + if ( + this.#maxFragments > 0 && + this.#fragments.length === this.#maxFragments + ) { + failWebsocketConnectionWithCode(this.ws, 1008, 'Too many message fragments') + return false + } + this.#fragmentsBytes += fragment.length this.#fragments.push(fragment) + return true } consumeFragments () { diff --git a/deps/npm/node_modules/undici/lib/web/websocket/websocket.js b/deps/npm/node_modules/undici/lib/web/websocket/websocket.js index ccedb792169a..80991e96a2e9 100644 --- a/deps/npm/node_modules/undici/lib/web/websocket/websocket.js +++ b/deps/npm/node_modules/undici/lib/web/websocket/websocket.js @@ -435,9 +435,12 @@ class WebSocket extends EventTarget { // once this happens, the connection is open this[kResponse] = response - const maxPayloadSize = this[kController]?.dispatcher?.webSocketOptions?.maxPayloadSize + const webSocketOptions = this[kController]?.dispatcher?.webSocketOptions + const maxFragments = webSocketOptions?.maxFragments + const maxPayloadSize = webSocketOptions?.maxPayloadSize const parser = new ByteParser(this, parsedExtensions, { + maxFragments, maxPayloadSize }) parser.on('drain', onParserDrain) diff --git a/deps/npm/node_modules/undici/package.json b/deps/npm/node_modules/undici/package.json index d1eef502c416..3c2001f391e3 100644 --- a/deps/npm/node_modules/undici/package.json +++ b/deps/npm/node_modules/undici/package.json @@ -1,6 +1,6 @@ { "name": "undici", - "version": "6.26.0", + "version": "6.27.0", "description": "An HTTP/1.1 client, written from scratch for Node.js", "homepage": "https://undici.nodejs.org", "bugs": { diff --git a/deps/npm/package.json b/deps/npm/package.json index 3309782d55e6..5ce61281a2b0 100644 --- a/deps/npm/package.json +++ b/deps/npm/package.json @@ -1,5 +1,5 @@ { - "version": "11.17.0", + "version": "11.19.0", "name": "npm", "description": "a package manager for JavaScript", "workspaces": [ @@ -52,8 +52,8 @@ }, "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^9.8.0", - "@npmcli/config": "^10.11.0", + "@npmcli/arborist": "^9.9.1", + "@npmcli/config": "^10.12.0", "@npmcli/fs": "^5.0.0", "@npmcli/map-workspaces": "^5.0.3", "@npmcli/metavuln-calculator": "^9.0.3", @@ -77,11 +77,11 @@ "is-cidr": "^6.0.4", "json-parse-even-better-errors": "^5.0.0", "libnpmaccess": "^10.0.3", - "libnpmdiff": "^8.1.10", - "libnpmexec": "^10.3.0", - "libnpmfund": "^7.0.24", + "libnpmdiff": "^8.1.12", + "libnpmexec": "^10.3.2", + "libnpmfund": "^7.0.26", "libnpmorg": "^8.0.1", - "libnpmpack": "^9.1.10", + "libnpmpack": "^9.1.12", "libnpmpublish": "^11.2.0", "libnpmsearch": "^9.0.1", "libnpmteam": "^8.0.2", @@ -97,7 +97,7 @@ "npm-install-checks": "^8.0.0", "npm-package-arg": "^13.0.2", "npm-pick-manifest": "^11.0.3", - "npm-profile": "^12.0.1", + "npm-profile": "^12.0.2", "npm-registry-fetch": "^19.1.1", "npm-user-validate": "^4.0.0", "p-map": "^7.0.4", @@ -106,11 +106,11 @@ "proc-log": "^6.1.0", "qrcode-terminal": "^0.12.0", "read": "^5.0.1", - "semver": "^7.8.4", + "semver": "^7.8.5", "spdx-expression-parse": "^4.0.0", "ssri": "^13.0.1", "supports-color": "^10.2.2", - "tar": "^7.5.16", + "tar": "^7.5.19", "text-table": "~0.2.0", "tiny-relative-date": "^2.0.2", "treeverse": "^3.0.0", diff --git a/deps/npm/tap-snapshots/test/lib/commands/publish.js.test.cjs b/deps/npm/tap-snapshots/test/lib/commands/publish.js.test.cjs index 143d08dda8ff..dbc6b9f13b0a 100644 --- a/deps/npm/tap-snapshots/test/lib/commands/publish.js.test.cjs +++ b/deps/npm/tap-snapshots/test/lib/commands/publish.js.test.cjs @@ -181,6 +181,7 @@ Object { "man/man1/npm-help.1", "man/man1/npm-init.1", "man/man1/npm-install-ci-test.1", + "man/man1/npm-install-scripts.1", "man/man1/npm-install-test.1", "man/man1/npm-install.1", "man/man1/npm-link.1", diff --git a/deps/npm/tap-snapshots/test/lib/docs.js.test.cjs b/deps/npm/tap-snapshots/test/lib/docs.js.test.cjs index c5fd6a2ecfe0..1e2799652c91 100644 --- a/deps/npm/tap-snapshots/test/lib/docs.js.test.cjs +++ b/deps/npm/tap-snapshots/test/lib/docs.js.test.cjs @@ -125,6 +125,7 @@ Array [ "init", "install", "install-ci-test", + "install-scripts", "install-test", "link", "ll", @@ -404,6 +405,10 @@ sources, the standard precedence applies (cli > env > project > user > global), so a higher-priority source can always relax or override a lower-priority one. +As with \`min-release-age\`, when this cutoff blocks a fix that \`npm audit +fix\` would install, npm keeps the vulnerable version, warns, and exits with +a non-zero code. + Packages whose names match \`min-release-age-exclude\` are exempt from this filter. @@ -1084,8 +1089,16 @@ Sets the strategy for installing packages in node_modules. hoisted (default): Install non-duplicated in top-level, and duplicated as necessary within directory structure. nested: (formerly --legacy-bundling) install in place, no hoisting. shallow (formerly --global-style) only install direct -deps at top-level. linked: (experimental) install in node_modules/.store, -link in place, unhoisted. +deps at top-level. linked: install in node_modules/.store, link in place, +unhoisted. + +We recommend that package authors use \`--install-strategy=linked\` during +development to catch undeclared ("phantom") dependencies before publishing: +the isolated layout only exposes a package's declared dependencies, so an +\`import\` of a package that was never added to \`package.json\` can fail +instead of resolving by accident and shipping broken. See [Catching +undeclared ("phantom") +dependencies](/using-npm/developers#catching-undeclared-phantom-dependencies). @@ -1279,6 +1292,12 @@ your \`.npmrc\` is preserved when npm internally spawns a sub-process with apply, \`before\` wins within a single source and across sources the standard precedence rules apply. +When this window stops \`npm audit fix\` from installing a patched version +(because the fix was published too recently), npm keeps the package at its +vulnerable version, warns that the fix was blocked, and exits with a +non-zero code. To install the fix, add the package to +\`min-release-age-exclude\`, or relax \`min-release-age\` or \`before\`. + Packages whose names match \`min-release-age-exclude\` are exempt from this filter. @@ -1675,7 +1694,14 @@ registry (https://registry.npmjs.org) to the configured registry. If set to "never", then use the registry value. If set to "always", then replace the registry host with the configured host every time. -You may also specify a bare hostname (e.g., "registry.npmjs.org"). +You may also specify a bare hostname (e.g., "registry.npmjs.org") to only +replace URLs coming from that host. + +You may also specify a full URL including a path (e.g., +"https://old-registry.example.com/npm/path"). In that case, resolved URLs +whose host and path begin with that prefix will have the entire prefix +replaced with the configured registry URL (host and path), without +duplicating path segments. @@ -1932,6 +1958,10 @@ silently skipped; this setting only affects unreviewed entries. \`--ignore-scripts\` and \`--dangerously-allow-all-scripts\` both override this setting. +Optional dependencies that cannot be installed on the current platform or +engine (a non-matching \`os\`, \`cpu\`, or \`libc\`) are not flagged, because +their install scripts never run. + #### \`strict-peer-deps\` @@ -4573,6 +4603,52 @@ aliases: cit, clean-install-test, sit #### \`install-links\` ` +exports[`test/lib/docs.js TAP usage install-scripts > must match snapshot 1`] = ` +Manage install-script approvals for dependencies + +Usage: +npm install-scripts approve [ ...] +npm install-scripts approve --all +npm install-scripts deny [ ...] +npm install-scripts deny --all +npm install-scripts ls +npm install-scripts prune + +Options: +[-a|--all] [--no-allow-scripts-pin] [--dry-run] [--json] + + -a|--all + Show or act on all packages, not just the ones your project directly + + --allow-scripts-pin + Write pinned (\`pkg@version\`) entries when approving install scripts. + + --dry-run + Indicates that you don't want npm to make any changes and that it should + + --json + Whether or not to output JSON data, rather than the normal output. + + +Run "npm help install-scripts" for more info + +\`\`\`bash +npm install-scripts approve [ ...] +npm install-scripts approve --all +npm install-scripts deny [ ...] +npm install-scripts deny --all +npm install-scripts ls +npm install-scripts prune +\`\`\` + +Note: This command is unaware of workspaces. + +#### \`all\` +#### \`allow-scripts-pin\` +#### \`dry-run\` +#### \`json\` +` + exports[`test/lib/docs.js TAP usage install-test > must match snapshot 1`] = ` Install package(s) and run tests diff --git a/deps/npm/tap-snapshots/test/lib/npm.js.test.cjs b/deps/npm/tap-snapshots/test/lib/npm.js.test.cjs index dc1c95cd3c57..a3837dc72ab7 100644 --- a/deps/npm/tap-snapshots/test/lib/npm.js.test.cjs +++ b/deps/npm/tap-snapshots/test/lib/npm.js.test.cjs @@ -35,12 +35,13 @@ All commands: completion, config, dedupe, deny-scripts, deprecate, diff, dist-tag, docs, doctor, edit, exec, explain, explore, find-dupes, fund, get, help, help-search, init, install, - install-ci-test, install-test, link, ll, login, logout, ls, - org, outdated, owner, pack, ping, pkg, prefix, profile, - prune, publish, query, rebuild, repo, restart, root, run, - sbom, search, set, shrinkwrap, stage, star, stars, start, - stop, team, test, token, trust, undeprecate, uninstall, - unpublish, unstar, update, version, view, whoami + install-ci-test, install-scripts, install-test, link, ll, + login, logout, ls, org, outdated, owner, pack, ping, pkg, + prefix, profile, prune, publish, query, rebuild, repo, + restart, root, run, sbom, search, set, shrinkwrap, stage, + star, stars, start, stop, team, test, token, trust, + undeprecate, uninstall, unpublish, unstar, update, version, + view, whoami Specify configs in the ini-formatted file: {USERCONFIG} @@ -81,6 +82,7 @@ All commands: help-search, init, install, install-ci-test, + install-scripts, install-test, link, ll, login, logout, ls, org, outdated, owner, pack, @@ -136,6 +138,7 @@ All commands: help-search, init, install, install-ci-test, + install-scripts, install-test, link, ll, login, logout, ls, org, outdated, owner, pack, @@ -182,12 +185,13 @@ All commands: completion, config, dedupe, deny-scripts, deprecate, diff, dist-tag, docs, doctor, edit, exec, explain, explore, find-dupes, fund, get, help, help-search, init, install, - install-ci-test, install-test, link, ll, login, logout, ls, - org, outdated, owner, pack, ping, pkg, prefix, profile, - prune, publish, query, rebuild, repo, restart, root, run, - sbom, search, set, shrinkwrap, stage, star, stars, start, - stop, team, test, token, trust, undeprecate, uninstall, - unpublish, unstar, update, version, view, whoami + install-ci-test, install-scripts, install-test, link, ll, + login, logout, ls, org, outdated, owner, pack, ping, pkg, + prefix, profile, prune, publish, query, rebuild, repo, + restart, root, run, sbom, search, set, shrinkwrap, stage, + star, stars, start, stop, team, test, token, trust, + undeprecate, uninstall, unpublish, unstar, update, version, + view, whoami Specify configs in the ini-formatted file: {USERCONFIG} @@ -228,6 +232,7 @@ All commands: help-search, init, install, install-ci-test, + install-scripts, install-test, link, ll, login, logout, ls, org, outdated, owner, pack, @@ -283,6 +288,7 @@ All commands: help-search, init, install, install-ci-test, + install-scripts, install-test, link, ll, login, logout, ls, org, outdated, owner, pack, @@ -337,6 +343,7 @@ All commands: fund, get, help, help-search, init, install, install-ci-test, + install-scripts, install-test, link, ll, login, logout, ls, org, outdated, owner, pack, @@ -383,12 +390,13 @@ All commands: completion, config, dedupe, deny-scripts, deprecate, diff, dist-tag, docs, doctor, edit, exec, explain, explore, find-dupes, fund, get, help, help-search, init, install, - install-ci-test, install-test, link, ll, login, logout, ls, - org, outdated, owner, pack, ping, pkg, prefix, profile, - prune, publish, query, rebuild, repo, restart, root, run, - sbom, search, set, shrinkwrap, stage, star, stars, start, - stop, team, test, token, trust, undeprecate, uninstall, - unpublish, unstar, update, version, view, whoami + install-ci-test, install-scripts, install-test, link, ll, + login, logout, ls, org, outdated, owner, pack, ping, pkg, + prefix, profile, prune, publish, query, rebuild, repo, + restart, root, run, sbom, search, set, shrinkwrap, stage, + star, stars, start, stop, team, test, token, trust, + undeprecate, uninstall, unpublish, unstar, update, version, + view, whoami Specify configs in the ini-formatted file: {USERCONFIG} @@ -420,12 +428,13 @@ All commands: completion, config, dedupe, deny-scripts, deprecate, diff, dist-tag, docs, doctor, edit, exec, explain, explore, find-dupes, fund, get, help, help-search, init, install, - install-ci-test, install-test, link, ll, login, logout, ls, - org, outdated, owner, pack, ping, pkg, prefix, profile, - prune, publish, query, rebuild, repo, restart, root, run, - sbom, search, set, shrinkwrap, stage, star, stars, start, - stop, team, test, token, trust, undeprecate, uninstall, - unpublish, unstar, update, version, view, whoami + install-ci-test, install-scripts, install-test, link, ll, + login, logout, ls, org, outdated, owner, pack, ping, pkg, + prefix, profile, prune, publish, query, rebuild, repo, + restart, root, run, sbom, search, set, shrinkwrap, stage, + star, stars, start, stop, team, test, token, trust, + undeprecate, uninstall, unpublish, unstar, update, version, + view, whoami Specify configs in the ini-formatted file: {USERCONFIG} @@ -457,12 +466,13 @@ All commands: completion, config, dedupe, deny-scripts, deprecate, diff, dist-tag, docs, doctor, edit, exec, explain, explore, find-dupes, fund, get, help, help-search, init, install, - install-ci-test, install-test, link, ll, login, logout, ls, - org, outdated, owner, pack, ping, pkg, prefix, profile, - prune, publish, query, rebuild, repo, restart, root, run, - sbom, search, set, shrinkwrap, stage, star, stars, start, - stop, team, test, token, trust, undeprecate, uninstall, - unpublish, unstar, update, version, view, whoami + install-ci-test, install-scripts, install-test, link, ll, + login, logout, ls, org, outdated, owner, pack, ping, pkg, + prefix, profile, prune, publish, query, rebuild, repo, + restart, root, run, sbom, search, set, shrinkwrap, stage, + star, stars, start, stop, team, test, token, trust, + undeprecate, uninstall, unpublish, unstar, update, version, + view, whoami Specify configs in the ini-formatted file: {USERCONFIG} diff --git a/deps/npm/tap-snapshots/test/lib/utils/reify-output.js.test.cjs b/deps/npm/tap-snapshots/test/lib/utils/reify-output.js.test.cjs index 40d4cd221ca0..828a99679eab 100644 --- a/deps/npm/tap-snapshots/test/lib/utils/reify-output.js.test.cjs +++ b/deps/npm/tap-snapshots/test/lib/utils/reify-output.js.test.cjs @@ -10,6 +10,11 @@ exports[`test/lib/utils/reify-output.js TAP added packages should be looked up w added 1 package in {TIME} ` +exports[`test/lib/utils/reify-output.js TAP added packages should be looked up within returned tree linked store package counted though absent from actualTree > must match snapshot 1`] = ` + +added 1 package in {TIME} +` + exports[`test/lib/utils/reify-output.js TAP added packages should be looked up within returned tree missing added pkg in inventory > must match snapshot 1`] = ` up to date in {TIME} diff --git a/deps/npm/tap-snapshots/test/lib/utils/sbom-cyclonedx.js.test.cjs b/deps/npm/tap-snapshots/test/lib/utils/sbom-cyclonedx.js.test.cjs index 124478bc8299..6963299566d5 100644 --- a/deps/npm/tap-snapshots/test/lib/utils/sbom-cyclonedx.js.test.cjs +++ b/deps/npm/tap-snapshots/test/lib/utils/sbom-cyclonedx.js.test.cjs @@ -417,7 +417,7 @@ exports[`test/lib/utils/sbom-cyclonedx.js TAP single node - from git url > must "version": "1.0.0", "scope": "required", "author": "Author", - "purl": "pkg:npm/root@1.0.0?vcs_url=https://github.com/foo/bar#1234", + "purl": "pkg:npm/root@1.0.0?vcs_url=https%3A%2F%2Fgithub.com%2Ffoo%2Fbar%231234", "properties": [], "externalReferences": [ { diff --git a/deps/npm/tap-snapshots/test/lib/utils/sbom-spdx.js.test.cjs b/deps/npm/tap-snapshots/test/lib/utils/sbom-spdx.js.test.cjs index 6adb6d26de14..eda01bcaa4ed 100644 --- a/deps/npm/tap-snapshots/test/lib/utils/sbom-spdx.js.test.cjs +++ b/deps/npm/tap-snapshots/test/lib/utils/sbom-spdx.js.test.cjs @@ -414,7 +414,7 @@ exports[`test/lib/utils/sbom-spdx.js TAP single node - from git url > must match { "referenceCategory": "PACKAGE-MANAGER", "referenceType": "purl", - "referenceLocator": "pkg:npm/root@1.0.0?vcs_url=https://github.com/foo/bar#1234" + "referenceLocator": "pkg:npm/root@1.0.0?vcs_url=https%3A%2F%2Fgithub.com%2Ffoo%2Fbar%231234" } ] } diff --git a/deps/npm/test/lib/commands/approve-scripts.js b/deps/npm/test/lib/commands/approve-scripts.js index 30325f41014c..1f29cb898949 100644 --- a/deps/npm/test/lib/commands/approve-scripts.js +++ b/deps/npm/test/lib/commands/approve-scripts.js @@ -7,7 +7,7 @@ const mockNpm = async (t, opts = {}) => { return _mockNpm(t, opts) } -const setupProject = ({ allowScripts, withScripts = ['canvas'] } = {}) => { +const setupProject = ({ allowScripts, withScripts = ['canvas'], noResolved = [] } = {}) => { const pkg = { name: 'host', version: '1.0.0', @@ -28,11 +28,16 @@ const setupProject = ({ allowScripts, withScripts = ['canvas'] } = {}) => { scripts: { install: 'echo install' }, }), } - lockPackages[`node_modules/${name}`] = { + const lockEntry = { version: '1.0.0', - resolved: tarUrl, hasInstallScript: true, } + // Some lockfiles omit `resolved` for registry deps. Those nodes have no + // trustable version, so they can only be approved by name. + if (!noResolved.includes(name)) { + lockEntry.resolved = tarUrl + } + lockPackages[`node_modules/${name}`] = lockEntry } return { @@ -119,6 +124,51 @@ t.test('approve-scripts --all approves every unreviewed package', async t => { }) }) +t.test('approve-scripts --all approves a dep without a resolved URL by name', async t => { + // Regression for npm/cli#9558: a dep with no `resolved` URL can't be + // pinned, but must still be approved by name, not silently skipped. + const { npm, prefix, logs } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'], noResolved: ['canvas'] }), + config: { all: true }, + }) + await npm.exec('approve-scripts', []) + + const pkg = JSON.parse(fs.readFileSync(resolve(prefix, 'package.json'), 'utf8')) + t.strictSame(pkg.allowScripts, { canvas: true }, 'approved by name, not skipped') + t.match( + logs.warn.byTitle('approve-scripts').join('\n'), + /no "resolved" URL/, + 'warns that a version pin could not be written' + ) +}) + +t.test('approve-scripts approves a dep without a resolved URL by name', async t => { + const { npm, prefix } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'], noResolved: ['canvas'] }), + }) + await npm.exec('approve-scripts', ['canvas']) + + const pkg = JSON.parse(fs.readFileSync(resolve(prefix, 'package.json'), 'utf8')) + t.strictSame(pkg.allowScripts, { canvas: true }) +}) + +t.test('approve-scripts --pending is empty after a no-resolved dep is approved by name', async t => { + const { npm, joinedOutput } = await mockNpm(t, { + prefixDir: setupProject({ + allowScripts: { canvas: true }, + withScripts: ['canvas'], + noResolved: ['canvas'], + }), + config: { 'allow-scripts-pending': true }, + }) + await npm.exec('approve-scripts', []) + t.match( + joinedOutput(), + /No packages with unreviewed install scripts/, + 'name-only entry covers the dep even without a resolved URL' + ) +}) + t.test('approve-scripts errors on unknown package', async t => { const { npm } = await mockNpm(t, { prefixDir: setupProject({ withScripts: ['canvas'] }), @@ -577,7 +627,7 @@ t.test('forbidden semver range in package.json#allowScripts is dropped with a wa }) await mock.npm.exec('approve-scripts', []) - const warnings = mock.logs.warn.byTitle('allow-scripts') + const warnings = mock.logs.warn.byTitle('install-scripts') t.ok( warnings.some(m => /semver ranges/.test(m) && /canvas@\^0\.33\.0/.test(m)), 'resolver emits warning about forbidden range' diff --git a/deps/npm/test/lib/commands/audit.js b/deps/npm/test/lib/commands/audit.js index 3bd5e5033c49..61887417216e 100644 --- a/deps/npm/test/lib/commands/audit.js +++ b/deps/npm/test/lib/commands/audit.js @@ -163,6 +163,86 @@ t.test('audit fix - bulk endpoint', async t => { ) }) +t.test('audit fix exits non-zero when min-release-age blocks a fix', async t => { + const { npm, logs } = await loadMockNpm(t, { + prefixDir: tree, + config: { 'min-release-age': 30 }, + }) + const registry = new MockRegistry({ + tap: t, + registry: npm.config.get('registry'), + }) + const manifest = registry.manifest({ + name: 'test-dep-a', + packuments: [{ version: '1.0.0' }, { version: '1.0.1' }], + }) + // 1.0.0 is old enough to install; the fix 1.0.1 was published too recently. + manifest.time['1.0.0'] = '2020-01-01T00:00:00.000Z' + manifest.time['1.0.1'] = new Date().toISOString() + await registry.package({ + manifest, + tarballs: { + '1.0.0': path.join(npm.prefix, 'test-dep-a-vuln'), + }, + times: 2, + }) + const advisory = registry.advisory({ id: 100, vulnerable_versions: '<1.0.1' }) + registry.nock.post('/-/npm/v1/security/advisories/bulk', body => { + const unzipped = JSON.parse(gunzip(Buffer.from(body, 'hex'))) + return t.same(unzipped, { 'test-dep-a': ['1.0.0'] }) + }) + .reply(200, { 'test-dep-a': [advisory] }) + .post('/-/npm/v1/security/advisories/bulk', body => { + const unzipped = JSON.parse(gunzip(Buffer.from(body, 'hex'))) + return t.same(unzipped, { 'test-dep-a': ['1.0.0'] }) + }) + .reply(200, { 'test-dep-a': [advisory] }) + + await npm.exec('audit', ['fix']) + + t.equal(process.exitCode, 1, 'exits non-zero because the fix was blocked') + t.ok( + logs.warn.some(w => + /left at a vulnerable version because a fix is newer than the release-age cutoff/.test(w)), + 'warns that the fix was blocked by min-release-age' + ) + const lock = JSON.parse(fs.readFileSync(path.join(npm.prefix, 'package-lock.json'), 'utf8')) + t.equal(lock.packages['node_modules/test-dep-a'].version, '1.0.0', + 'test-dep-a was left at the vulnerable version') +}) + +t.test('json audit reports fixBlockedByReleaseAge when a fix is too new', async t => { + const { npm, joinedOutput } = await loadMockNpm(t, { + prefixDir: tree, + config: { + json: true, + 'min-release-age': 30, + }, + }) + const registry = new MockRegistry({ + tap: t, + registry: npm.config.get('registry'), + }) + const manifest = registry.manifest({ + name: 'test-dep-a', + packuments: [{ version: '1.0.0' }, { version: '1.0.1' }], + }) + manifest.time['1.0.0'] = '2020-01-01T00:00:00.000Z' + manifest.time['1.0.1'] = new Date().toISOString() + await registry.package({ manifest }) + const advisory = registry.advisory({ id: 100, vulnerable_versions: '<1.0.1' }) + const bulkBody = gzip(JSON.stringify({ 'test-dep-a': ['1.0.0'] })) + registry.nock.post('/-/npm/v1/security/advisories/bulk', bulkBody) + .reply(200, { + 'test-dep-a': [advisory], + }) + + await npm.exec('audit', []) + const report = JSON.parse(joinedOutput()) + t.match(report.vulnerabilities['test-dep-a'].fixBlockedByReleaseAge, { version: '1.0.1' }, + 'json output flags the fix that min-release-age blocked') +}) + t.test('audit fix no package lock', async t => { const { npm } = await loadMockNpm(t, { config: { diff --git a/deps/npm/test/lib/commands/deny-scripts.js b/deps/npm/test/lib/commands/deny-scripts.js index 358b71d7da7b..1caf93b71513 100644 --- a/deps/npm/test/lib/commands/deny-scripts.js +++ b/deps/npm/test/lib/commands/deny-scripts.js @@ -80,7 +80,10 @@ t.test('deny-scripts --pending is rejected', async t => { prefixDir: setupProject({ withScripts: ['core-js'] }), config: { 'allow-scripts-pending': true }, }) - await t.rejects(npm.exec('deny-scripts', []), { code: 'EUSAGE' }) + await t.rejects(npm.exec('deny-scripts', []), { + code: 'EUSAGE', + message: /`npm deny-scripts --allow-scripts-pending` is not supported; run `npm install-scripts ls` to list unreviewed packages/, + }) }) t.test('deny-scripts --all denies every unreviewed package', async t => { diff --git a/deps/npm/test/lib/commands/exec.js b/deps/npm/test/lib/commands/exec.js index 92ea993e3edf..45e7634da5e1 100644 --- a/deps/npm/test/lib/commands/exec.js +++ b/deps/npm/test/lib/commands/exec.js @@ -220,6 +220,41 @@ t.test('finds workspace dep first', async t => { t.ok(exists.isFile(), 'bin ran, creating file') }) +t.test('finds workspace dep bin under linked install strategy', async t => { + const { npm } = await loadMockNpm(t, { + config: { + 'install-strategy': 'linked', + }, + prefixDir: { + 'package.json': JSON.stringify({ + name: '@npmcli/npx-workspace-root-test', + workspaces: ['workspace-a', 'tool'], + }), + 'workspace-a': { + 'package.json': JSON.stringify({ + name: 'workspace-a', + dependencies: { tool: '*' }, + }), + }, + tool: { + 'package.json': JSON.stringify({ + name: 'tool', + version: '1.0.0', + bin: { 'npx-test': 'index.js' }, + }), + 'index.js': `#!/usr/bin/env node + require('fs').writeFileSync('npm-exec-test-success', '')`, + }, + }, + }) + + await npm.exec('install', []) + npm.config.set('workspace', ['workspace-a']) + await npm.exec('exec', ['npx-test']) + const exists = await fs.stat(path.join(npm.prefix, 'workspace-a', 'npm-exec-test-success')) + t.ok(exists.isFile(), 'workspace-local bin ran instead of falling back to the registry') +}) + t.test('npx --no-install @npmcli/npx-test', async t => { const registry = new MockRegistry({ tap: t, diff --git a/deps/npm/test/lib/commands/install-scripts.js b/deps/npm/test/lib/commands/install-scripts.js new file mode 100644 index 000000000000..523aba42bdd9 --- /dev/null +++ b/deps/npm/test/lib/commands/install-scripts.js @@ -0,0 +1,336 @@ +const t = require('tap') +const fs = require('node:fs') +const { resolve } = require('node:path') +const _mockNpm = require('../../fixtures/mock-npm') +const InstallScripts = require('../../../lib/commands/install-scripts.js') + +const mockNpm = async (t, opts = {}) => { + return _mockNpm(t, opts) +} + +const setupProject = ({ allowScripts, withScripts = ['canvas'], noScripts = [] } = {}) => { + const pkg = { + name: 'host', + version: '1.0.0', + dependencies: Object.fromEntries([...withScripts, ...noScripts].map((n) => [n, '*'])), + } + if (allowScripts !== undefined) { + pkg.allowScripts = allowScripts + } + + const lockPackages = { '': pkg } + const nodeModules = {} + for (const name of withScripts) { + nodeModules[name] = { + 'package.json': JSON.stringify({ + name, + version: '1.0.0', + scripts: { install: 'echo install' }, + }), + } + lockPackages[`node_modules/${name}`] = { + version: '1.0.0', + hasInstallScript: true, + resolved: `https://registry.npmjs.org/${name}/-/${name}-1.0.0.tgz`, + } + } + for (const name of noScripts) { + nodeModules[name] = { + 'package.json': JSON.stringify({ name, version: '1.0.0' }), + } + lockPackages[`node_modules/${name}`] = { + version: '1.0.0', + resolved: `https://registry.npmjs.org/${name}/-/${name}-1.0.0.tgz`, + } + } + + return { + 'package.json': JSON.stringify(pkg, null, 2), + 'package-lock.json': JSON.stringify({ + name: pkg.name, + version: pkg.version, + lockfileVersion: 3, + requires: true, + packages: lockPackages, + }), + node_modules: nodeModules, + } +} + +t.test('completion', async t => { + const comp = (argv) => + InstallScripts.completion({ conf: { argv: { remain: argv } } }) + + t.resolveMatch(comp(['npm', 'install-scripts']), ['approve', 'deny', 'ls', 'prune']) + t.resolveMatch(comp(['npm', 'install-scripts', 'approve']), []) + t.resolveMatch(comp(['npm', 'install-scripts', 'deny']), []) + t.resolveMatch(comp(['npm', 'install-scripts', 'ls']), []) + t.resolveMatch(comp(['npm', 'install-scripts', 'prune']), []) + await t.rejects(comp(['npm', 'install-scripts', 'frobnicate']), { + message: 'frobnicate not recognized', + }) +}) + +t.test('install-scripts approve writes a pinned entry', async t => { + const { npm, prefix } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'] }), + }) + await npm.exec('install-scripts', ['approve', 'canvas']) + + const pkg = JSON.parse(fs.readFileSync(resolve(prefix, 'package.json'), 'utf8')) + t.strictSame(pkg.allowScripts, { 'canvas@1.0.0': true }) +}) + +t.test('install-scripts approve --all approves every unreviewed package', async t => { + const { npm, prefix } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas', 'sharp'] }), + config: { all: true }, + }) + await npm.exec('install-scripts', ['approve']) + + const pkg = JSON.parse(fs.readFileSync(resolve(prefix, 'package.json'), 'utf8')) + t.strictSame(pkg.allowScripts, { + 'canvas@1.0.0': true, + 'sharp@1.0.0': true, + }) +}) + +t.test('install-scripts deny writes a name-only false entry', async t => { + const { npm, prefix } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'] }), + }) + await npm.exec('install-scripts', ['deny', 'canvas']) + + const pkg = JSON.parse(fs.readFileSync(resolve(prefix, 'package.json'), 'utf8')) + t.strictSame(pkg.allowScripts, { canvas: false }) +}) + +t.test('install-scripts deny --all denies every unreviewed package', async t => { + const { npm, prefix } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas', 'sharp'] }), + config: { all: true }, + }) + await npm.exec('install-scripts', ['deny']) + + const pkg = JSON.parse(fs.readFileSync(resolve(prefix, 'package.json'), 'utf8')) + t.strictSame(pkg.allowScripts, { canvas: false, sharp: false }) +}) + +t.test('install-scripts ignores allow-scripts-pending and still writes', async t => { + // The namespace exposes listing through `ls`, so a stray + // `allow-scripts-pending` config must not divert approve into list mode. + const { npm, prefix } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'] }), + config: { 'allow-scripts-pending': true }, + }) + await npm.exec('install-scripts', ['approve', 'canvas']) + + const pkg = JSON.parse(fs.readFileSync(resolve(prefix, 'package.json'), 'utf8')) + t.strictSame(pkg.allowScripts, { 'canvas@1.0.0': true }) +}) + +t.test('install-scripts ls lists unreviewed packages', async t => { + const { npm, joinedOutput } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas', 'sharp'] }), + }) + await npm.exec('install-scripts', ['ls']) + const out = joinedOutput() + t.match(out, /2 packages have install scripts not yet covered by allowScripts/) + t.match(out, /canvas@1\.0\.0/) + t.match(out, /sharp@1\.0\.0/) +}) + +t.test('install-scripts ls with no unreviewed says so', async t => { + const { npm, joinedOutput } = await mockNpm(t, { + prefixDir: setupProject({ allowScripts: { canvas: true }, withScripts: ['canvas'] }), + }) + await npm.exec('install-scripts', ['ls']) + t.match(joinedOutput(), /No packages with unreviewed install scripts/) +}) + +t.test('install-scripts ls rejects positional args', async t => { + const { npm } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'] }), + }) + await t.rejects( + npm.exec('install-scripts', ['ls', 'canvas']), + /cannot be combined with positional arguments/ + ) +}) + +t.test('install-scripts with no subcommand errors with usage', async t => { + const { npm } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'] }), + }) + await t.rejects( + npm.exec('install-scripts', []), + { code: 'EUSAGE' } + ) +}) + +t.test('install-scripts with an unknown subcommand errors', async t => { + const { npm } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'] }), + }) + await t.rejects( + npm.exec('install-scripts', ['frobnicate']), + /`frobnicate` is not a recognized subcommand/ + ) +}) + +t.test('install-scripts approve errors on unknown package', async t => { + const { npm } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'] }), + }) + await t.rejects( + npm.exec('install-scripts', ['approve', 'not-installed']), + { code: 'ENOMATCH' } + ) +}) + +t.test('install-scripts fails for global installs', async t => { + const { npm } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'] }), + config: { global: true }, + }) + await t.rejects( + npm.exec('install-scripts', ['approve', 'canvas']), + { code: 'EGLOBAL' } + ) +}) + +t.test('install-scripts prune removes not-installed and no-script entries', async t => { + const { npm, prefix, joinedOutput } = await mockNpm(t, { + prefixDir: setupProject({ + withScripts: ['canvas'], + noScripts: ['no-scripts-pkg'], + allowScripts: { + 'canvas@1.0.0': true, + 'no-scripts-pkg': true, + gone: true, + }, + }), + }) + await npm.exec('install-scripts', ['prune']) + + const pkg = JSON.parse(fs.readFileSync(resolve(prefix, 'package.json'), 'utf8')) + t.strictSame(pkg.allowScripts, { 'canvas@1.0.0': true }) + + const out = joinedOutput() + t.match(out, /Removed 2 unused allowScripts entries:/) + t.match(out, /no-scripts-pkg \(no install scripts\)/) + t.match(out, /gone \(package not installed\)/) +}) + +t.test('install-scripts prune removes unused deny entries too', async t => { + const { npm, prefix } = await mockNpm(t, { + prefixDir: setupProject({ + withScripts: ['canvas'], + allowScripts: { 'canvas@1.0.0': true, 'denied-gone': false }, + }), + }) + await npm.exec('install-scripts', ['prune']) + + const pkg = JSON.parse(fs.readFileSync(resolve(prefix, 'package.json'), 'utf8')) + t.strictSame(pkg.allowScripts, { 'canvas@1.0.0': true }) +}) + +t.test('install-scripts prune removes a stale version pin and drops the field', async t => { + const { npm, prefix, joinedOutput } = await mockNpm(t, { + prefixDir: setupProject({ + withScripts: ['canvas'], + allowScripts: { 'canvas@9.9.9': true }, + }), + }) + await npm.exec('install-scripts', ['prune']) + + const pkg = JSON.parse(fs.readFileSync(resolve(prefix, 'package.json'), 'utf8')) + t.notOk('allowScripts' in pkg, 'allowScripts field is removed when empty') + // Singular wording for a single entry. + t.match(joinedOutput(), /Removed 1 unused allowScripts entry:/) +}) + +t.test('install-scripts prune --dry-run reports without writing', async t => { + const allowScripts = { 'canvas@1.0.0': true, gone: true } + const { npm, prefix, joinedOutput } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'], allowScripts }), + config: { 'dry-run': true }, + }) + await npm.exec('install-scripts', ['prune']) + + const pkg = JSON.parse(fs.readFileSync(resolve(prefix, 'package.json'), 'utf8')) + t.strictSame(pkg.allowScripts, allowScripts, 'package.json is unchanged') + t.match(joinedOutput(), /Would remove 1 unused allowScripts entry:/) +}) + +t.test('install-scripts prune --json emits a machine-readable summary', async t => { + const { npm, joinedOutput } = await mockNpm(t, { + prefixDir: setupProject({ + withScripts: ['canvas'], + allowScripts: { 'canvas@1.0.0': true, gone: true }, + }), + config: { json: true }, + }) + await npm.exec('install-scripts', ['prune']) + + t.strictSame(JSON.parse(joinedOutput()), { + allowScripts: { + removed: [{ key: 'gone', value: true, reason: 'not-installed' }], + dryRun: false, + }, + }) +}) + +t.test('install-scripts prune with nothing unused says so', async t => { + const { npm, prefix, joinedOutput } = await mockNpm(t, { + prefixDir: setupProject({ + withScripts: ['canvas'], + allowScripts: { 'canvas@1.0.0': true }, + }), + }) + await npm.exec('install-scripts', ['prune']) + + const pkg = JSON.parse(fs.readFileSync(resolve(prefix, 'package.json'), 'utf8')) + t.strictSame(pkg.allowScripts, { 'canvas@1.0.0': true }) + t.match(joinedOutput(), /No unused allowScripts entries\./) +}) + +t.test('install-scripts prune with no allowScripts field says so', async t => { + const { npm, joinedOutput } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'] }), + }) + await npm.exec('install-scripts', ['prune']) + t.match(joinedOutput(), /No unused allowScripts entries\./) +}) + +t.test('install-scripts prune rejects positional args', async t => { + const { npm } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'] }), + }) + await t.rejects( + npm.exec('install-scripts', ['prune', 'canvas']), + /cannot be combined with positional arguments/ + ) +}) + +t.test('install-scripts prune rejects --all', async t => { + const { npm } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'] }), + config: { all: true }, + }) + await t.rejects( + npm.exec('install-scripts', ['prune']), + /cannot be combined with positional arguments or `--all`/ + ) +}) + +t.test('install-scripts prune fails for global installs', async t => { + const { npm } = await mockNpm(t, { + prefixDir: setupProject({ withScripts: ['canvas'] }), + config: { global: true }, + }) + await t.rejects( + npm.exec('install-scripts', ['prune']), + { code: 'EGLOBAL' } + ) +}) diff --git a/deps/npm/test/lib/commands/link.js b/deps/npm/test/lib/commands/link.js index 4aaf24c9d0a2..11ed182edd94 100644 --- a/deps/npm/test/lib/commands/link.js +++ b/deps/npm/test/lib/commands/link.js @@ -289,6 +289,44 @@ t.test('link global linked pkg to local workspace using args', async t => { t.matchSnapshot(await printLinks(), 'should create a local symlink to global pkg') }) +t.test('link --workspace --save targets the workspace manifest, not the root', async t => { + const { link, prefix } = await mockLink(t, { + globalPrefixDir: { + node_modules: { + a: { + 'package.json': JSON.stringify({ + name: 'a', + version: '1.0.0', + }), + }, + }, + }, + prefixDir: { + 'package.json': JSON.stringify({ + name: 'my-project', + version: '1.0.0', + workspaces: ['packages/*'], + }), + packages: { + x: { + 'package.json': JSON.stringify({ + name: 'x', + version: '1.0.0', + }), + }, + }, + }, + config: { workspace: 'x', save: true }, + }) + + await link.exec(['a']) + + const root = JSON.parse(fs.readFileSync(join(prefix, 'package.json'), 'utf8')) + const ws = JSON.parse(fs.readFileSync(join(prefix, 'packages', 'x', 'package.json'), 'utf8')) + t.notOk(root.dependencies, 'root manifest should not get the dependency') + t.match(ws.dependencies, { a: /^file:/ }, 'workspace manifest should get the file: dependency') +}) + t.test('link pkg already in global space', async t => { const { npm, link, printLinks, prefix } = await mockLink(t, { globalPrefixDir: { @@ -554,3 +592,73 @@ t.test('link threads allowScripts policy through to arborist', async t => { t.strictSame(localOpts.allowScripts, { canvas: true }, 'local arborist opts.allowScripts populated from package.json') }) + +t.test('link threads allowScripts policy to the global install', async t => { + const capturedOpts = [] + const FakeArborist = function (opts) { + capturedOpts.push(opts) + this.options = opts + this.actualTree = { inventory: new Map() } + } + FakeArborist.prototype.loadActual = async () => ({ isLink: false, children: new Map() }) + FakeArborist.prototype.reify = async () => {} + + const mock = await mockNpm(t, { + command: 'link', + prefixDir: { + 'package.json': JSON.stringify({ + name: 'host', + version: '1.0.0', + allowScripts: { canvas: true }, + }), + }, + mocks: { + '@npmcli/arborist': FakeArborist, + '{LIB}/utils/reify-finish.js': async () => {}, + }, + }) + await mock.npm.exec('link', ['canvas']) + // the global Arborist is constructed first; its missing-package install + // must carry the project policy. + t.strictSame(capturedOpts[0].allowScripts, { canvas: true }, + 'global arborist opts.allowScripts populated from package.json') +}) + +t.test('link runs the strict-allow-scripts preflight before the global install', async t => { + // The mocked preflight stands in for strict mode finding an uncovered + // script. It must run and throw before the global reify. + const calls = [] + const FakeArborist = function (opts) { + this.options = opts + this.actualTree = { inventory: new Map() } + } + FakeArborist.prototype.loadActual = async () => ({ isLink: false, children: new Map() }) + FakeArborist.prototype.reify = async () => { + calls.push('reify') + } + + const mock = await mockNpm(t, { + command: 'link', + prefixDir: { + 'package.json': JSON.stringify({ + name: 'host', + version: '1.0.0', + }), + }, + mocks: { + '@npmcli/arborist': FakeArborist, + '{LIB}/utils/reify-finish.js': async () => {}, + '{LIB}/utils/strict-allow-scripts-preflight.js': async () => { + calls.push('preflight') + throw Object.assign(new Error('blocked'), { code: 'ESTRICTALLOWSCRIPTS' }) + }, + }, + }) + await t.rejects( + mock.npm.exec('link', ['canvas']), + { code: 'ESTRICTALLOWSCRIPTS' }, + 'the strict preflight blocks the link' + ) + t.strictSame(calls, ['preflight'], + 'preflight ran and the global reify never executed') +}) diff --git a/deps/npm/test/lib/commands/login.js b/deps/npm/test/lib/commands/login.js index 55568edd09f9..4ebc7147e46a 100644 --- a/deps/npm/test/lib/commands/login.js +++ b/deps/npm/test/lib/commands/login.js @@ -130,6 +130,19 @@ t.test('web', t => { }) t.match(outputs[0], '/npm-cli-test/login/cli/00000000-0000-0000-0000-000000000000') }) + t.test('proxy registry whose doneUrl points at the canonical registry', async t => { + // Regression for npm/cli#8875: a proxy/mirror returns a doneUrl on registry.npmjs.org. + // npm must poll the configured proxy where the session lives, not the canonical registry. + const proxy = 'https://proxy.registry.example/' + const { npm, registry, login, rc } = await mockLogin(t, { + registry: proxy, + config: { 'auth-type': 'web', registry: proxy }, + }) + registry.weblogin({ token: 'npm_proxy-token', doneRegistry: 'https://registry.npmjs.org' }) + await login.exec([]) + t.same(npm.config.get('//proxy.registry.example/:_authToken'), 'npm_proxy-token') + t.match(rc(), { '//proxy.registry.example/:_authToken': 'npm_proxy-token' }) + }) t.test('server error', async t => { const { registry, login } = await mockLogin(t, { config: { 'auth-type': 'web' }, diff --git a/deps/npm/test/lib/commands/ls.js b/deps/npm/test/lib/commands/ls.js index ab98773bc68e..899a2b816905 100644 --- a/deps/npm/test/lib/commands/ls.js +++ b/deps/npm/test/lib/commands/ls.js @@ -5332,6 +5332,25 @@ t.test('ls --install-strategy=linked', async t => { node_modules: { 'workspace-a': t.fixture('symlink', '../packages/workspace-a'), // workspace-b intentionally NOT linked (undeclared in dependencies) + // The hidden lockfile a real linked install writes records only the + // declared workspace as linked into root node_modules, so loadActual + // resolves workspace-b's root edge as missing (the undeclared-workspace case). + '.package-lock.json': JSON.stringify({ + lockfileVersion: 3, + requires: true, + packages: { + 'node_modules/workspace-a': { + resolved: 'packages/workspace-a', + link: true, + }, + 'packages/workspace-a': { + version: '1.0.0', + }, + 'packages/workspace-b': { + version: '1.0.0', + }, + }, + }), }, }, }) @@ -5339,6 +5358,7 @@ t.test('ls --install-strategy=linked', async t => { const output = cleanCwd(result()) t.notMatch(output, /UNMET DEPENDENCY/, 'should not report undeclared workspace as UNMET DEPENDENCY') t.match(output, /workspace-a/, 'should list declared workspace') + t.match(output, /workspace-b/, 'should list undeclared workspace (npm/cli#9618)') }) t.test('should not report devDeps of store packages as UNMET DEPENDENCY', async t => { @@ -5397,7 +5417,20 @@ t.test('ls --install-strategy=linked', async t => { }, }, node_modules: { - // workspace-a is declared but its symlink is missing + // workspace-a is declared but its symlink is missing. + // The hidden lockfile records the workspace target without a root + // node_modules link, so loadActual resolves the declared workspace's + // root edge as missing (the declared-but-missing case), which must + // still be reported as UNMET DEPENDENCY. + '.package-lock.json': JSON.stringify({ + lockfileVersion: 3, + requires: true, + packages: { + 'packages/workspace-a': { + version: '1.0.0', + }, + }, + }), }, }, }) diff --git a/deps/npm/test/lib/commands/owner.js b/deps/npm/test/lib/commands/owner.js index e8b890a753eb..baaf960b9037 100644 --- a/deps/npm/test/lib/commands/owner.js +++ b/deps/npm/test/lib/commands/owner.js @@ -189,6 +189,58 @@ t.test('owner add ', async t => { t.equal(joinedOutput(), `+ ${username} (${packageName})`) }) +t.test('owner add resolves user from package scoped registry', async t => { + const scopedRegistryUrl = 'https://scoped.registry.npmjs.org' + const scopedAuth = '//scoped.registry.npmjs.org/:_authToken' + const { npm, joinedOutput } = await loadMockNpm(t, { + config: { + ...auth, + '@npmcli:registry': scopedRegistryUrl, + [scopedAuth]: 'scoped-auth-token', + }, + }) + const username = 'requested-user' + const globalRegistry = new MockRegistry({ + tap: t, + registry: npm.config.get('registry'), + authorization: 'test-auth-token', + }) + const scopedRegistry = new MockRegistry({ + tap: t, + registry: scopedRegistryUrl, + authorization: 'scoped-auth-token', + }) + + // If `owner add` mistakenly asked the global registry for user data + // instead of the package's scoped registry, this substituted user would + // be added as the owner instead of the one requested. + globalRegistry.nock = globalRegistry.nock + .get(`/-/user/org.couchdb.user:${encodeURIComponent(username)}`) + .optionally() + .reply(200, { name: 'substituted-user', email: 'substituted@example.com' }) + scopedRegistry.couchuser({ username, body: { name: username, email: 'requested@example.com' } }) + + const manifest = scopedRegistry.manifest({ + name: packageName, + packuments: [{ maintainers, version: '1.0.0' }], + }) + await scopedRegistry.package({ manifest }) + scopedRegistry.nock.put(`/${spec.escapedName}/-rev/${manifest._rev}`, body => { + t.match(body, { + _id: manifest._id, + _rev: manifest._rev, + maintainers: [ + ...manifest.maintainers, + { name: username, email: 'requested@example.com' }, + ], + }) + return true + }).reply(200, {}) + + await npm.exec('owner', ['add', username, packageName]) + t.equal(joinedOutput(), `+ ${username} (${packageName})`) +}) + t.test('owner add cwd package', async t => { const { npm, joinedOutput } = await loadMockNpm(t, { prefixDir: { @@ -364,6 +416,57 @@ t.test('owner rm ', async t => { t.equal(joinedOutput(), `- ${username} (${packageName})`) }) +t.test('owner rm resolves user from package scoped registry', async t => { + const scopedRegistryUrl = 'https://scoped.registry.npmjs.org' + const scopedAuth = '//scoped.registry.npmjs.org/:_authToken' + const { npm, joinedOutput, logs } = await loadMockNpm(t, { + config: { + ...auth, + '@npmcli:registry': scopedRegistryUrl, + [scopedAuth]: 'scoped-auth-token', + }, + }) + const username = 'requested-user' + const globalRegistry = new MockRegistry({ + tap: t, + registry: npm.config.get('registry'), + authorization: 'test-auth-token', + }) + const scopedRegistry = new MockRegistry({ + tap: t, + registry: scopedRegistryUrl, + authorization: 'scoped-auth-token', + }) + + // If `owner rm` mistakenly asked the global registry for user data instead + // of the package's scoped registry, this substituted user would be + // resolved and treated as an existing owner rather than the one requested. + globalRegistry.nock = globalRegistry.nock + .get(`/-/user/org.couchdb.user:${encodeURIComponent(username)}`) + .optionally() + .reply(200, maintainers[0]) + scopedRegistry.couchuser({ username, body: { name: username, email: 'requested@example.com' } }) + + const manifest = scopedRegistry.manifest({ + name: packageName, + packuments: [{ maintainers, version: '1.0.0' }], + }) + await scopedRegistry.package({ manifest }) + let update + scopedRegistry.nock + .put(`/${spec.escapedName}/-rev/${manifest._rev}`, body => { + update = body + return true + }) + .optionally() + .reply(200, {}) + + await npm.exec('owner', ['rm', username, packageName]) + t.equal(update, undefined, 'does not remove the substituted user') + t.equal(joinedOutput(), '', 'does not report a removal') + t.match(logs.info.byTitle('owner rm'), [`Not a package owner: ${username}`]) +}) + t.test('owner rm not a current owner', async t => { const { npm, logs } = await loadMockNpm(t, { config: { ...auth }, diff --git a/deps/npm/test/lib/commands/pack.js b/deps/npm/test/lib/commands/pack.js index 7e98b12704df..9805427de4f6 100644 --- a/deps/npm/test/lib/commands/pack.js +++ b/deps/npm/test/lib/commands/pack.js @@ -1,6 +1,7 @@ const t = require('tap') const { load: loadMockNpm } = require('../../fixtures/mock-npm') const { cleanZlib } = require('../../fixtures/clean-snapshot') +const MockRegistry = require('@npmcli/mock-registry') const path = require('node:path') const fs = require('node:fs') @@ -167,6 +168,61 @@ t.test('foreground-scripts can still be set to false', async t => { t.throws(() => fs.statSync(path.resolve(npm.prefix, filename))) }) +t.test('min-release-age-exclude applies to registry packages', async t => { + const name = '@myscope/some-package' + const version = '1.2.3' + const { npm, outputs } = await loadMockNpm(t, { + prefixDir: { + package: { + 'package.json': JSON.stringify({ name, version }), + }, + }, + config: { + 'min-release-age': 7, + 'min-release-age-exclude': ['@myscope/*'], + }, + }) + const registry = new MockRegistry({ + tap: t, + registry: npm.config.get('registry'), + }) + const manifest = registry.manifest({ name, versions: [version] }) + await registry.package({ + manifest, + times: 2, + tarballs: { [version]: path.join(npm.prefix, 'package') }, + }) + + await npm.exec('pack', [`${name}@${version}`]) + + const filename = 'myscope-some-package-1.2.3.tgz' + t.strictSame(outputs, [filename]) + t.ok(fs.statSync(path.resolve(npm.prefix, filename))) +}) + +t.test('excluded alias name does not bypass min-release-age for its target', async t => { + const target = 'other-package' + const version = '1.2.3' + const { npm } = await loadMockNpm(t, { + config: { + 'min-release-age': 7, + 'min-release-age-exclude': ['@myscope/*'], + }, + }) + const registry = new MockRegistry({ + tap: t, + registry: npm.config.get('registry'), + }) + await registry.package({ + manifest: registry.manifest({ name: target, versions: [version] }), + }) + + await t.rejects( + npm.exec('pack', [`@myscope/alias@npm:${target}@${version}`]), + { code: 'ETARGET' } + ) +}) + t.test('invalid packument', async t => { const { npm, outputs } = await loadMockNpm(t, { prefixDir: { diff --git a/deps/npm/test/lib/commands/query.js b/deps/npm/test/lib/commands/query.js index 40dadc888583..cb9230c93fbc 100644 --- a/deps/npm/test/lib/commands/query.js +++ b/deps/npm/test/lib/commands/query.js @@ -160,6 +160,61 @@ t.test('linked node', async t => { t.matchSnapshot(joinedOutput(), 'should return linked node res') }) +t.test('linked strategy reports logical location, not store backing path', async t => { + /* linked layout: nopt (direct) symlinked to its store key, abbrev a transitive dep of nopt */ + const linkedDir = { + prefixDir: { + node_modules: { + nopt: t.fixture('symlink', '.store/nopt-hash/node_modules/nopt'), + '.store': { + 'nopt-hash': { + node_modules: { + nopt: { + 'package.json': JSON.stringify({ + name: 'nopt', + version: '7.2.1', + dependencies: { abbrev: '^2.0.0' }, + }), + }, + abbrev: t.fixture('symlink', '../../abbrev-hash/node_modules/abbrev'), + }, + }, + 'abbrev-hash': { + node_modules: { + abbrev: { + 'package.json': JSON.stringify({ name: 'abbrev', version: '2.0.0' }), + }, + }, + }, + }, + }, + 'package.json': JSON.stringify({ + name: 'project', + version: '1.0.0', + dependencies: { nopt: '^7.0.0' }, + }), + }, + } + + await t.test(':root > * reports the logical link location', async t => { + const { npm, joinedOutput } = await loadMockNpm(t, linkedDir) + await npm.exec('query', [':root > *']) + const res = JSON.parse(joinedOutput()) + t.equal(res.length, 1, 'returns a single result, not the store node duplicate') + t.equal(res[0].location, 'node_modules/nopt', 'reports the logical location') + t.match(res[0].realpath, /\.store/, 'realpath still resolves to the store') + }) + + await t.test(':root * keeps direct deps logical and transitive deps canonical', async t => { + const { npm, joinedOutput } = await loadMockNpm(t, linkedDir) + await npm.exec('query', [':root *']) + const byName = Object.fromEntries(JSON.parse(joinedOutput()).map(n => [n.name, n.location])) + t.equal(byName.nopt, 'node_modules/nopt', 'direct dep keeps its logical location') + t.equal(byName.abbrev, 'node_modules/.store/abbrev-hash/node_modules/abbrev', + 'transitive dep reports its canonical store key, not a consumer symlink') + }) +}) + t.test('global', async t => { const { npm, joinedOutput } = await loadMockNpm(t, { config: { @@ -434,3 +489,24 @@ t.test('missing', async t => { await npm.exec('query', [':missing']) t.matchSnapshot(joinedOutput(), 'should return missing node') }) + +t.test('linked strategy surfaces undeclared workspaces', async t => { + // npm/cli#9618: undeclared workspaces are not symlinked into root node_modules under linked, but must remain visible to `npm query`. + const { npm, joinedOutput } = await loadMockNpm(t, { + config: { 'install-strategy': 'linked' }, + prefixDir: { + 'package.json': JSON.stringify({ + name: 'root', + version: '1.0.0', + workspaces: ['packages/*'], + }), + packages: { + a: { 'package.json': JSON.stringify({ name: 'a', version: '1.0.0' }) }, + b: { 'package.json': JSON.stringify({ name: 'b', version: '1.0.0' }) }, + }, + }, + }) + await npm.exec('query', [':root > *']) + const names = JSON.parse(joinedOutput()).map(n => n.name).sort() + t.same(names, ['a', 'b'], 'both undeclared workspaces are listed') +}) diff --git a/deps/npm/test/lib/commands/token.js b/deps/npm/test/lib/commands/token.js index 56ab906d921b..34297a923c89 100644 --- a/deps/npm/test/lib/commands/token.js +++ b/deps/npm/test/lib/commands/token.js @@ -13,6 +13,7 @@ const tokens = [ { key: 'abcd1234abcd1234', token: 'efgh5678efgh5678', + name: 'abcd001', cidr_whitelist: null, readonly: false, created: now, @@ -21,6 +22,7 @@ const tokens = [ { key: 'abcd1256', token: 'hgfe8765', + name: 'abcd002', cidr_whitelist: ['192.168.1.1/32'], readonly: true, created: now, @@ -63,9 +65,9 @@ t.test('token list', async t => { registry.getTokens(tokens) await npm.exec('token', []) t.strictSame(outputs, [ - `Token efgh5678efgh5678… with id abcd123 created ${now.slice(0, 10)}`, + `Token efgh5678efgh5678… with id abcd123 name abcd001 created ${now.slice(0, 10)}`, '', - `Token hgfe8765… with id abcd125 created ${now.slice(0, 10)}`, + `Token hgfe8765… with id abcd125 name abcd002 created ${now.slice(0, 10)}`, 'with IP whitelist: 192.168.1.1/32', '', ]) @@ -104,9 +106,9 @@ t.test('token list parseable output', async t => { registry.getTokens(tokens) await npm.exec('token', []) t.strictSame(outputs, [ - 'key\ttoken\tcreated\treadonly\tCIDR whitelist', - `abcd1234abcd1234\tefgh5678efgh5678\t${now}\tfalse\t`, - `abcd1256\thgfe8765\t${now}\ttrue\t192.168.1.1/32`, + 'key\ttoken\tid\tname\tcreated\treadonly\tCIDR whitelist', + `abcd1234abcd1234\tefgh5678efgh5678\tabcd123\tabcd001\t${now}\tfalse\t`, + `abcd1256\thgfe8765\tabcd125\tabcd002\t${now}\ttrue\t192.168.1.1/32`, ]) }) diff --git a/deps/npm/test/lib/utils/allow-scripts-prune.js b/deps/npm/test/lib/utils/allow-scripts-prune.js new file mode 100644 index 000000000000..880b1dfe3437 --- /dev/null +++ b/deps/npm/test/lib/utils/allow-scripts-prune.js @@ -0,0 +1,90 @@ +const t = require('tap') +const { classifyUnusedEntries } = require('../../../lib/utils/allow-scripts-prune.js') + +// Minimal registry node: `matches` derives name/version from the resolved URL. +const node = ({ name = 'pkg', version = '1.0.0' } = {}) => ({ + name, + version, + isRegistryDependency: true, + resolved: `https://registry.npmjs.org/${name}/-/${name}-${version}.tgz`, +}) + +const withScripts = (overrides) => ({ node: node(overrides), hasScripts: true }) +const noScripts = (overrides) => ({ node: node(overrides), hasScripts: false }) + +t.test('empty / nullish policy', t => { + t.same(classifyUnusedEntries({}, []), { remaining: {}, removed: [] }) + t.same(classifyUnusedEntries(null, []), { remaining: {}, removed: [] }) + t.same(classifyUnusedEntries(undefined, [withScripts()]), { remaining: {}, removed: [] }) + t.end() +}) + +t.test('keeps entries that match an installed package with scripts', t => { + const { remaining, removed } = classifyUnusedEntries( + { canvas: true, 'esbuild@1.0.0': true }, + [withScripts({ name: 'canvas' }), withScripts({ name: 'esbuild', version: '1.0.0' })] + ) + t.same(remaining, { canvas: true, 'esbuild@1.0.0': true }) + t.same(removed, []) + t.end() +}) + +t.test('removes entries for packages no longer installed', t => { + const { remaining, removed } = classifyUnusedEntries( + { canvas: true, gone: true }, + [withScripts({ name: 'canvas' })] + ) + t.same(remaining, { canvas: true }) + t.same(removed, [{ key: 'gone', value: true, reason: 'not-installed' }]) + t.end() +}) + +t.test('removes entries whose package no longer has install scripts', t => { + const { remaining, removed } = classifyUnusedEntries( + { canvas: true }, + [noScripts({ name: 'canvas' })] + ) + t.same(remaining, {}) + t.same(removed, [{ key: 'canvas', value: true, reason: 'no-scripts' }]) + t.end() +}) + +t.test('a matching version with scripts keeps the entry even if another lacks them', t => { + const { remaining, removed } = classifyUnusedEntries( + { canvas: true }, + [noScripts({ name: 'canvas', version: '1.0.0' }), withScripts({ name: 'canvas', version: '2.0.0' })] + ) + t.same(remaining, { canvas: true }) + t.same(removed, []) + t.end() +}) + +t.test('version-pinned entry is unused when that exact version is not installed', t => { + const { remaining, removed } = classifyUnusedEntries( + { 'canvas@1.0.0': true }, + [withScripts({ name: 'canvas', version: '2.0.0' })] + ) + t.same(remaining, {}) + t.same(removed, [{ key: 'canvas@1.0.0', value: true, reason: 'not-installed' }]) + t.end() +}) + +t.test('prunes unused deny (false) entries the same way', t => { + const { remaining, removed } = classifyUnusedEntries( + { 'denied-gone': false, 'denied-here': false }, + [withScripts({ name: 'denied-here' })] + ) + t.same(remaining, { 'denied-here': false }) + t.same(removed, [{ key: 'denied-gone', value: false, reason: 'not-installed' }]) + t.end() +}) + +t.test('keeps unparseable keys untouched', t => { + const { remaining, removed } = classifyUnusedEntries( + { 'a b': true, gone: true }, + [withScripts({ name: 'canvas' })] + ) + t.same(remaining, { 'a b': true }) + t.same(removed, [{ key: 'gone', value: true, reason: 'not-installed' }]) + t.end() +}) diff --git a/deps/npm/test/lib/utils/allow-scripts-writer.js b/deps/npm/test/lib/utils/allow-scripts-writer.js index f72a84eef113..8edf25be3079 100644 --- a/deps/npm/test/lib/utils/allow-scripts-writer.js +++ b/deps/npm/test/lib/utils/allow-scripts-writer.js @@ -24,6 +24,23 @@ const node = (overrides = {}) => { } } +// A registry node with no `resolved` URL in the lockfile. Its trusted name +// comes from a dependency edge, but its version isn't trustable, so +// versionedKeyFor returns null (npm/cli#9558). +const noResolvedNode = (overrides = {}) => { + const name = overrides.name ?? 'pkg' + const version = overrides.version ?? '1.0.0' + return { + name, + packageName: overrides.packageName ?? name, + version, + resolved: undefined, + location: `node_modules/${name}`, + isRegistryDependency: true, + edgesIn: new Set([{ name, spec: overrides.spec ?? `^${version}` }]), + } +} + t.test('nameKeyFor / versionedKeyFor — registry', async t => { const n = node({ name: 'canvas', version: '2.11.0' }) t.equal(nameKeyFor(n), 'canvas') @@ -214,6 +231,73 @@ t.test('applyApprovalForPackage — keeps existing pin matching one installed, a t.strictSame(allowScripts, { 'lodash@3.10.1': true, 'lodash@4.17.21': true }) }) +t.test('versionedKeyFor — registry dep without a resolved URL has no trustable version', async t => { + const n = noResolvedNode({ name: 'esbuild', version: '0.25.0' }) + t.equal(nameKeyFor(n), 'esbuild', 'name still recoverable from the dependency edge') + t.equal(versionedKeyFor(n), null, 'version cannot be trusted without a resolved URL') +}) + +t.test('applyApprovalForPackage — pin mode falls back to name-only when version is not trustable', async t => { + const { allowScripts, changes, warning } = applyApprovalForPackage( + {}, + [noResolvedNode({ name: 'esbuild', version: '0.25.0' })], + { pin: true } + ) + t.strictSame(allowScripts, { esbuild: true }, 'approved by name instead of silently skipped') + t.strictSame(changes, [{ key: 'esbuild', change: 'added' }]) + t.match(warning, /no "resolved" URL/, 'explains why a pin was not written') +}) + +t.test('applyApprovalForPackage — mixed resolved/no-resolved collapses to one name-only entry', async t => { + const { allowScripts, warning } = applyApprovalForPackage( + {}, + [ + node({ name: 'esbuild', version: '0.21.5' }), + noResolvedNode({ name: 'esbuild', version: '0.25.0' }), + ], + { pin: true } + ) + t.strictSame(allowScripts, { esbuild: true }, 'no redundant pin alongside the name-only entry') + t.match(warning, /no "resolved" URL/) +}) + +t.test('applyApprovalForPackage — existing pin collapses into name-only when a sibling cannot be pinned', async t => { + const { allowScripts, changes } = applyApprovalForPackage( + { 'esbuild@0.21.5': true }, + [ + node({ name: 'esbuild', version: '0.21.5' }), + noResolvedNode({ name: 'esbuild', version: '0.25.0' }), + ], + { pin: true } + ) + t.strictSame(allowScripts, { esbuild: true }) + t.match(changes, [ + { key: 'esbuild@0.21.5', change: 'removed-pinned-allow' }, + { key: 'esbuild', change: 'added' }, + ]) +}) + +t.test('applyApprovalForPackage — no-resolved dep already approved by name is a no-op', async t => { + const { allowScripts, changes } = applyApprovalForPackage( + { esbuild: true }, + [noResolvedNode({ name: 'esbuild', version: '0.25.0' })], + { pin: true } + ) + t.strictSame(allowScripts, { esbuild: true }) + t.strictSame(changes, []) +}) + +t.test('applyApprovalForPackage — no-resolved dep with name-only deny still loses to the deny', async t => { + const { allowScripts, changes, warning } = applyApprovalForPackage( + { esbuild: false }, + [noResolvedNode({ name: 'esbuild', version: '0.25.0' })], + { pin: true } + ) + t.strictSame(allowScripts, { esbuild: false }, 'deny wins; nothing approved') + t.strictSame(changes, []) + t.match(warning, /esbuild is denied/) +}) + t.test('applyDenyForPackage — empty allowScripts adds name-only false', async t => { const { allowScripts, changes } = applyDenyForPackage( {}, @@ -620,7 +704,7 @@ t.test('denyWarning branches on key shape per RFC §approve-scripts', async t => { pin: true } ) t.match(pinned.warning, /versioned deny/) - t.match(pinned.warning, /npm deny-scripts canvas/) + t.match(pinned.warning, /npm install-scripts deny canvas/) t.match(pinned.warning, /widen the deny to all versions/) t.match(pinned.warning, /remove the entry/) @@ -631,7 +715,7 @@ t.test('denyWarning branches on key shape per RFC §approve-scripts', async t => { pin: true } ) t.match(multi.warning, /versioned deny/) - t.match(multi.warning, /npm deny-scripts canvas/) + t.match(multi.warning, /npm install-scripts deny canvas/) }) t.test('denyWarning: tag-type key (pkg@latest: false) is name-only', async t => { diff --git a/deps/npm/test/lib/utils/reify-output.js b/deps/npm/test/lib/utils/reify-output.js index 597a03374815..ee9201482a75 100644 --- a/deps/npm/test/lib/utils/reify-output.js +++ b/deps/npm/test/lib/utils/reify-output.js @@ -391,6 +391,25 @@ t.test('added packages should be looked up within returned tree', async t => { t.matchSnapshot(out) }) + + t.test('linked store package counted though absent from actualTree', async t => { + const out = await mockReify(t, { + actualTree: { + name: 'foo', + inventory: { + has: () => false, + }, + }, + diff: { + children: [ + { action: 'ADD', ideal: { path: 'test/baz', name: 'baz', isInStore: true, isLink: false, package: { version: '1.0.0' } } }, + { action: 'ADD', ideal: { path: 'test/baz-link', name: 'baz', isInStore: false, isLink: true, package: { version: '1.0.0' } } }, + ], + }, + }) + + t.matchSnapshot(out) + }) }) t.test('prints dedupe difference on dry-run', async t => { @@ -480,11 +499,11 @@ t.test('prints unreviewed install scripts summary', async t => { ] const mock = await mockReifyWithExtras(t, baseReify, { unreviewedScripts }) - const warn = mock.logs.warn.byTitle('allow-scripts').join('\n') + const warn = mock.logs.warn.byTitle('install-scripts').join('\n') t.match(warn, /2 packages have install scripts not yet covered/) t.match(warn, /canvas@2\.11\.0 \(install: node-gyp rebuild\)/) t.match(warn, /sharp@0\.33\.2 \(preinstall: pre; postinstall: post\)/) - t.match(warn, /npm approve-scripts --allow-scripts-pending/) + t.match(warn, /npm install-scripts ls/) }) t.test('global install suggests --allow-scripts, not approve-scripts', async t => { @@ -512,7 +531,7 @@ t.test('global install suggests --allow-scripts, not approve-scripts', async t = ] const mock = await mockReifyWithExtras(t, baseReify, { unreviewedScripts }, { global: true }) - const warn = mock.logs.warn.byTitle('allow-scripts').join('\n') + const warn = mock.logs.warn.byTitle('install-scripts').join('\n') t.match(warn, /2 packages have install scripts not yet covered/) t.match(warn, /canvas@2\.11\.0 \(install: node-gyp rebuild\)/) t.match(warn, /npm install -g --allow-scripts=canvas,sharp/) @@ -538,7 +557,7 @@ t.test('single unreviewed script uses singular wording', async t => { }], } ) - t.match(mock.logs.warn.byTitle('allow-scripts').join('\n'), /1 package has install scripts/) + t.match(mock.logs.warn.byTitle('install-scripts').join('\n'), /1 package has install scripts/) }) t.test('json output includes unreviewedScripts', async t => { @@ -574,7 +593,7 @@ t.test('unreviewed script with node.name only (no packageName) still renders', a }], }) mock.npm.finish() - t.match(mock.logs.warn.byTitle('allow-scripts').join('\n'), / fallback \(install: cmd\)/) + t.match(mock.logs.warn.byTitle('install-scripts').join('\n'), / fallback \(install: cmd\)/) }) t.test('json output includes node.name when packageName is missing', async t => { diff --git a/deps/npm/test/lib/utils/resolve-allow-scripts.js b/deps/npm/test/lib/utils/resolve-allow-scripts.js index 0d6cdb8c040a..a27d600d98f0 100644 --- a/deps/npm/test/lib/utils/resolve-allow-scripts.js +++ b/deps/npm/test/lib/utils/resolve-allow-scripts.js @@ -119,7 +119,7 @@ t.test('package.json wins over .npmrc setting (RFC layer 2 > layer 3)', async t t.equal(result.source, 'package.json') t.strictSame(result.policy, { sharp: true }) t.match( - mock.logs.warn.byTitle('allow-scripts'), + mock.logs.warn.byTitle('install-scripts'), [/\.npmrc allow-scripts setting is being ignored because package.json/] ) }) @@ -150,7 +150,7 @@ t.test('--allow-scripts CLI flag is accepted via skipProjectConfig (npm exec)', t.equal(result.source, 'cli') t.strictSame(result.policy, { sharp: true }) t.match( - mock.logs.warn.byTitle('allow-scripts'), + mock.logs.warn.byTitle('install-scripts'), [/\.npmrc allow-scripts setting is being ignored because --allow-scripts/] ) }) @@ -224,7 +224,7 @@ t.test('drops package.json entries with forbidden semver ranges and warns', asyn 'also-good': true, 'disjunction@1.0.0 || 2.0.0': true, }) - const warnings = mock.logs.warn.byTitle('allow-scripts') + const warnings = mock.logs.warn.byTitle('install-scripts') t.equal(warnings.filter(m => /semver ranges/.test(m)).length, 3) }) @@ -245,7 +245,7 @@ t.test('drops package.json entries with dist-tag specs and warns', async t => { const result = await resolveAllowScripts(mock.npm) t.equal(result.source, 'package.json') t.strictSame(result.policy, { 'good@1.2.3': true }) - const warnings = mock.logs.warn.byTitle('allow-scripts') + const warnings = mock.logs.warn.byTitle('install-scripts') t.equal(warnings.filter(m => /dist-tag specs/.test(m)).length, 2) }) @@ -260,7 +260,7 @@ t.test('drops .npmrc forbidden ranges (and warns) but keeps valid entries', asyn const result = await resolveAllowScripts(mock.npm) t.equal(result.source, '.npmrc') t.strictSame(result.policy, { canvas: true, 'lodash@4.17.21': true }) - const warnings = mock.logs.warn.byTitle('allow-scripts') + const warnings = mock.logs.warn.byTitle('install-scripts') t.ok(warnings.some(m => /sharp@\^0\.33\.0/.test(m) && /semver ranges/.test(m))) }) @@ -280,7 +280,7 @@ t.test('drops package.json entries that fail npa parse', async t => { const result = await resolveAllowScripts(mock.npm) t.equal(result.source, 'package.json') t.strictSame(result.policy, { good: true }) - t.ok(mock.logs.warn.byTitle('allow-scripts').some(m => /unparseable/.test(m))) + t.ok(mock.logs.warn.byTitle('install-scripts').some(m => /unparseable/.test(m))) }) t.test('returns null when all package.json entries are dropped as invalid', async t => { diff --git a/deps/npm/test/lib/utils/sbom-cyclonedx.js b/deps/npm/test/lib/utils/sbom-cyclonedx.js index ea569d41c57d..f3105e3cd487 100644 --- a/deps/npm/test/lib/utils/sbom-cyclonedx.js +++ b/deps/npm/test/lib/utils/sbom-cyclonedx.js @@ -257,6 +257,17 @@ t.test('single node - from git url', t => { t.end() }) +t.test('git url with special chars is encoded into the vcs_url qualifier', t => { + const node = { ...root, type: 'git', resolved: 'https://github.com/foo/bar.git?a=b&c=d#1234' } + const res = cyclonedxOutput({ npm, nodes: [node] }) + const { purl } = res.metadata.component + // everything after vcs_url= must be a single percent-encoded value, so the + // committish/query can't leak out as an extra purl qualifier or subpath + t.equal(purl, 'pkg:npm/root@1.0.0?vcs_url=https%3A%2F%2Fgithub.com%2Ffoo%2Fbar.git%3Fa%3Db%26c%3Dd%231234') + t.notMatch(purl.split('vcs_url=')[1], /[#&]/) + t.end() +}) + t.test('single node - no package info', t => { const node = { ...root, package: undefined } const res = cyclonedxOutput({ npm, nodes: [node] }) diff --git a/deps/npm/test/lib/utils/sbom-spdx.js b/deps/npm/test/lib/utils/sbom-spdx.js index d2599b082451..1e21c945ca75 100644 --- a/deps/npm/test/lib/utils/sbom-spdx.js +++ b/deps/npm/test/lib/utils/sbom-spdx.js @@ -223,6 +223,17 @@ t.test('single node - from git url', t => { t.end() }) +t.test('git url with special chars is encoded into the vcs_url qualifier', t => { + const node = { ...root, type: 'git', resolved: 'https://github.com/foo/bar.git?a=b&c=d#1234' } + const res = spdxOutput({ npm, nodes: [node] }) + const purl = res.packages + .find(p => p.SPDXID === 'SPDXRef-Package-root-1.0.0') + .externalRefs.find(r => r.referenceType === 'purl').referenceLocator + t.equal(purl, 'pkg:npm/root@1.0.0?vcs_url=https%3A%2F%2Fgithub.com%2Ffoo%2Fbar.git%3Fa%3Db%26c%3Dd%231234') + t.notMatch(purl.split('vcs_url=')[1], /[#&]/) + t.end() +}) + t.test('single node - linked', t => { const node = { ...root, isLink: true, target: { edgesOut: [] } } const res = spdxOutput({ npm, nodes: [node] }) diff --git a/deps/npm/test/lib/utils/strict-allow-scripts-preflight.js b/deps/npm/test/lib/utils/strict-allow-scripts-preflight.js index e0c54105f886..c67a6e4853a1 100644 --- a/deps/npm/test/lib/utils/strict-allow-scripts-preflight.js +++ b/deps/npm/test/lib/utils/strict-allow-scripts-preflight.js @@ -76,6 +76,19 @@ t.test('throws when unreviewed install scripts exist (idealTree path)', async t ) }) +t.test('passes when the only unreviewed node is inert (platform-incompatible optional dep)', async t => { + // An inert dep is in the ideal tree but removed before any script runs, so + // strict mode must not reject it (npm/cli#9562). + const inertNode = { ...node({ name: 'fsevents' }), inert: true } + const arb = makeArb({ ideal: tree([inertNode]) }) + await preflight({ + arb, + npm: { flatOptions: { strictAllowScripts: true } }, + idealTreeOpts: {}, + }) + t.pass('no error thrown for inert node') +}) + t.test('passes when all install-script nodes are explicitly approved', async t => { const arb = makeArb({ ideal: tree([node({ name: 'canvas' })]), @@ -190,7 +203,7 @@ t.test('error label falls back to node.name when package.version is missing', as ) }) -t.test('project-scoped error suggests approve-scripts / deny-scripts', async t => { +t.test('project-scoped error suggests install-scripts approve / deny', async t => { const arb = makeArb({ ideal: tree([node({ name: 'canvas' })]) }) await t.rejects( preflight({ @@ -198,7 +211,7 @@ t.test('project-scoped error suggests approve-scripts / deny-scripts', async t = npm: { flatOptions: { strictAllowScripts: true } }, idealTreeOpts: {}, }), - { message: /Approve them with `npm approve-scripts`/ } + { message: /Approve them with `npm install-scripts approve`/ } ) }) diff --git a/deps/openssl/README.md b/deps/openssl/README.md index 06f5c71c65d4..c3e48022c604 100644 --- a/deps/openssl/README.md +++ b/deps/openssl/README.md @@ -54,6 +54,7 @@ Here is a list of supported architectures for use of ASM in OpenSSL. | linux | ppc64(*1) | linux-ppc64le | o | | linux | s390 | linux32-s390x | o | | linux | s390x | linux64-s390x | o | + | linux | riscv64 | linux64-riscv64 | - | | mac | ia32 | darwin-i386-cc | - | | mac | x64 | darwin64-x86-cc | o | | win | ia32 | VC-WIN32 | - | diff --git a/deps/openssl/config/Makefile b/deps/openssl/config/Makefile index 785db7972ded..11f2f7290ba3 100644 --- a/deps/openssl/config/Makefile +++ b/deps/openssl/config/Makefile @@ -13,9 +13,10 @@ ASM_ARCHS = aix64-gcc-as BSD-x86 BSD-x86_64 \ darwin64-x86_64-cc darwin-i386-cc darwin64-arm64-cc linux-aarch64 \ linux-armv4 linux-elf linux-x86_64 \ linux-ppc64le linux32-s390x linux64-s390x linux64-mips64\ +linux64-riscv64 \ solaris-x86-gcc solaris64-x86_64-gcc VC-WIN64A VC-WIN32 -NO_ASM_ARCHS = VC-WIN64-ARM linux64-riscv64 linux64-loongarch64 +NO_ASM_ARCHS = VC-WIN64-ARM linux64-loongarch64 CC = gcc FAKE_GCC = ../config/fake_gcc.pl diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/apps/progs.c b/deps/openssl/config/archs/linux64-riscv64/asm/apps/progs.c new file mode 100644 index 000000000000..317acf5bc8b2 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/apps/progs.c @@ -0,0 +1,404 @@ +/* + * WARNING: do not edit! + * Generated by apps/progs.pl + * + * Copyright 1995-2026 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "progs.h" + +FUNCTION functions[] = { + {FT_general, "asn1parse", asn1parse_main, asn1parse_options, NULL, NULL}, + {FT_general, "ca", ca_main, ca_options, NULL, NULL}, +#ifndef OPENSSL_NO_SOCK + {FT_general, "ciphers", ciphers_main, ciphers_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_CMP + {FT_general, "cmp", cmp_main, cmp_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_CMS + {FT_general, "cms", cms_main, cms_options, NULL, NULL}, +#endif + {FT_general, "crl", crl_main, crl_options, NULL, NULL}, + {FT_general, "crl2pkcs7", crl2pkcs7_main, crl2pkcs7_options, NULL, NULL}, + {FT_general, "dgst", dgst_main, dgst_options, NULL, NULL}, +#ifndef OPENSSL_NO_DH + {FT_general, "dhparam", dhparam_main, dhparam_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_DSA + {FT_general, "dsa", dsa_main, dsa_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_DSA + {FT_general, "dsaparam", dsaparam_main, dsaparam_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_EC + {FT_general, "ec", ec_main, ec_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_EC + {FT_general, "ecparam", ecparam_main, ecparam_options, NULL, NULL}, +#endif + {FT_general, "enc", enc_main, enc_options, NULL, NULL}, +#ifndef OPENSSL_NO_ENGINE + {FT_general, "engine", engine_main, engine_options, NULL, NULL}, +#endif + {FT_general, "errstr", errstr_main, errstr_options, NULL, NULL}, + {FT_general, "fipsinstall", fipsinstall_main, fipsinstall_options, NULL, NULL}, +#ifndef OPENSSL_NO_DSA + {FT_general, "gendsa", gendsa_main, gendsa_options, NULL, NULL}, +#endif + {FT_general, "genpkey", genpkey_main, genpkey_options, NULL, NULL}, +#ifndef OPENSSL_NO_RSA + {FT_general, "genrsa", genrsa_main, genrsa_options, NULL, NULL}, +#endif + {FT_general, "help", help_main, help_options, NULL, NULL}, + {FT_general, "info", info_main, info_options, NULL, NULL}, + {FT_general, "kdf", kdf_main, kdf_options, NULL, NULL}, + {FT_general, "list", list_main, list_options, NULL, NULL}, + {FT_general, "mac", mac_main, mac_options, NULL, NULL}, + {FT_general, "nseq", nseq_main, nseq_options, NULL, NULL}, +#ifndef OPENSSL_NO_OCSP + {FT_general, "ocsp", ocsp_main, ocsp_options, NULL, NULL}, +#endif + {FT_general, "passwd", passwd_main, passwd_options, NULL, NULL}, + {FT_general, "pkcs12", pkcs12_main, pkcs12_options, NULL, NULL}, + {FT_general, "pkcs7", pkcs7_main, pkcs7_options, NULL, NULL}, + {FT_general, "pkcs8", pkcs8_main, pkcs8_options, NULL, NULL}, + {FT_general, "pkey", pkey_main, pkey_options, NULL, NULL}, + {FT_general, "pkeyparam", pkeyparam_main, pkeyparam_options, NULL, NULL}, + {FT_general, "pkeyutl", pkeyutl_main, pkeyutl_options, NULL, NULL}, + {FT_general, "prime", prime_main, prime_options, NULL, NULL}, + {FT_general, "rand", rand_main, rand_options, NULL, NULL}, + {FT_general, "rehash", rehash_main, rehash_options, NULL, NULL}, + {FT_general, "req", req_main, req_options, NULL, NULL}, + {FT_general, "rsa", rsa_main, rsa_options, NULL, NULL}, +#if !defined(OPENSSL_NO_DEPRECATED_3_0) && !defined(OPENSSL_NO_RSA) + {FT_general, "rsautl", rsautl_main, rsautl_options, "pkeyutl", "3.0"}, +#endif +#ifndef OPENSSL_NO_SOCK + {FT_general, "s_client", s_client_main, s_client_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_SOCK + {FT_general, "s_server", s_server_main, s_server_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_SOCK + {FT_general, "s_time", s_time_main, s_time_options, NULL, NULL}, +#endif + {FT_general, "sess_id", sess_id_main, sess_id_options, NULL, NULL}, + {FT_general, "skeyutl", skeyutl_main, skeyutl_options, NULL, NULL}, + {FT_general, "smime", smime_main, smime_options, NULL, NULL}, + {FT_general, "speed", speed_main, speed_options, NULL, NULL}, + {FT_general, "spkac", spkac_main, spkac_options, NULL, NULL}, +#ifndef OPENSSL_NO_SRP + {FT_general, "srp", srp_main, srp_options, NULL, NULL}, +#endif + {FT_general, "storeutl", storeutl_main, storeutl_options, NULL, NULL}, +#ifndef OPENSSL_NO_TS + {FT_general, "ts", ts_main, ts_options, NULL, NULL}, +#endif + {FT_general, "verify", verify_main, verify_options, NULL, NULL}, + {FT_general, "version", version_main, version_options, NULL, NULL}, + {FT_general, "x509", x509_main, x509_options, NULL, NULL}, +#ifndef OPENSSL_NO_MD2 + {FT_md, "md2", dgst_main, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_MD4 + {FT_md, "md4", dgst_main, NULL, NULL}, +#endif + {FT_md, "md5", dgst_main, NULL, NULL}, + {FT_md, "sha1", dgst_main, NULL, NULL}, + {FT_md, "sha224", dgst_main, NULL, NULL}, + {FT_md, "sha256", dgst_main, NULL, NULL}, + {FT_md, "sha384", dgst_main, NULL, NULL}, + {FT_md, "sha512", dgst_main, NULL, NULL}, + {FT_md, "sha512-224", dgst_main, NULL, NULL}, + {FT_md, "sha512-256", dgst_main, NULL, NULL}, + {FT_md, "sha3-224", dgst_main, NULL, NULL}, + {FT_md, "sha3-256", dgst_main, NULL, NULL}, + {FT_md, "sha3-384", dgst_main, NULL, NULL}, + {FT_md, "sha3-512", dgst_main, NULL, NULL}, + {FT_md, "shake128", dgst_main, NULL, NULL}, + {FT_md, "shake256", dgst_main, NULL, NULL}, +#ifndef OPENSSL_NO_MDC2 + {FT_md, "mdc2", dgst_main, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_RMD160 + {FT_md, "rmd160", dgst_main, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_BLAKE2 + {FT_md, "blake2b512", dgst_main, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_BLAKE2 + {FT_md, "blake2s256", dgst_main, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_SM3 + {FT_md, "sm3", dgst_main, NULL, NULL}, +#endif + {FT_cipher, "aes-128-cbc", enc_main, enc_options, NULL}, + {FT_cipher, "aes-128-ecb", enc_main, enc_options, NULL}, + {FT_cipher, "aes-192-cbc", enc_main, enc_options, NULL}, + {FT_cipher, "aes-192-ecb", enc_main, enc_options, NULL}, + {FT_cipher, "aes-256-cbc", enc_main, enc_options, NULL}, + {FT_cipher, "aes-256-ecb", enc_main, enc_options, NULL}, +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-128-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-128-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-128-ctr", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-128-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-128-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-128-cfb1", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-128-cfb8", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-192-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-192-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-192-ctr", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-192-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-192-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-192-cfb1", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-192-cfb8", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-256-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-256-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-256-ctr", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-256-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-256-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-256-cfb1", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-256-cfb8", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAMELLIA + {FT_cipher, "camellia-128-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAMELLIA + {FT_cipher, "camellia-128-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAMELLIA + {FT_cipher, "camellia-192-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAMELLIA + {FT_cipher, "camellia-192-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAMELLIA + {FT_cipher, "camellia-256-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAMELLIA + {FT_cipher, "camellia-256-ecb", enc_main, enc_options, NULL}, +#endif + {FT_cipher, "base64", enc_main, enc_options, NULL}, +#ifndef OPENSSL_NO_ZLIB + {FT_cipher, "zlib", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_BROTLI + {FT_cipher, "brotli", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ZSTD + {FT_cipher, "zstd", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des3", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "desx", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_IDEA + {FT_cipher, "idea", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SEED + {FT_cipher, "seed", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC4 + {FT_cipher, "rc4", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC4 + {FT_cipher, "rc4-40", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC2 + {FT_cipher, "rc2", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_BF + {FT_cipher, "bf", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAST + {FT_cipher, "cast", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC5 + {FT_cipher, "rc5", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede3", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede3-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede3-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede3-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_IDEA + {FT_cipher, "idea-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_IDEA + {FT_cipher, "idea-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_IDEA + {FT_cipher, "idea-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_IDEA + {FT_cipher, "idea-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SEED + {FT_cipher, "seed-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SEED + {FT_cipher, "seed-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SEED + {FT_cipher, "seed-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SEED + {FT_cipher, "seed-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC2 + {FT_cipher, "rc2-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC2 + {FT_cipher, "rc2-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC2 + {FT_cipher, "rc2-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC2 + {FT_cipher, "rc2-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC2 + {FT_cipher, "rc2-64-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC2 + {FT_cipher, "rc2-40-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_BF + {FT_cipher, "bf-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_BF + {FT_cipher, "bf-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_BF + {FT_cipher, "bf-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_BF + {FT_cipher, "bf-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAST + {FT_cipher, "cast5-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAST + {FT_cipher, "cast5-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAST + {FT_cipher, "cast5-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAST + {FT_cipher, "cast5-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAST + {FT_cipher, "cast-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC5 + {FT_cipher, "rc5-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC5 + {FT_cipher, "rc5-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC5 + {FT_cipher, "rc5-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC5 + {FT_cipher, "rc5-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SM4 + {FT_cipher, "sm4-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SM4 + {FT_cipher, "sm4-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SM4 + {FT_cipher, "sm4-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SM4 + {FT_cipher, "sm4-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SM4 + {FT_cipher, "sm4-ctr", enc_main, enc_options, NULL}, +#endif + {0, NULL, NULL, NULL, NULL} +}; diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/configdata.pm b/deps/openssl/config/archs/linux64-riscv64/asm/configdata.pm new file mode 100644 index 000000000000..4431f75a1afd --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/configdata.pm @@ -0,0 +1,25808 @@ +#! /usr/bin/env perl +# -*- mode: perl -*- + +package configdata; + +use strict; +use warnings; + +use Exporter; +our @ISA = qw(Exporter); +our @EXPORT = qw( + %config %target %disabled %withargs %unified_info + @disablables @disablables_int +); + +our %config = ( + "AR" => "ar", + "ARFLAGS" => [ + "qc" + ], + "AS" => "as", + "ASFLAGS" => [], + "CC" => "gcc", + "CFLAGS" => [ + "-Wall -O3" + ], + "CPPDEFINES" => [], + "CPPFLAGS" => [], + "CPPINCLUDES" => [], + "CXX" => "g++", + "CXXFLAGS" => [ + "-Wall -O3" + ], + "FIPSKEY" => "f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813", + "FIPS_VENDOR" => "OpenSSL FIPS Provider", + "HASHBANGPERL" => "/usr/bin/env perl", + "LD" => "ld", + "LDFLAGS" => [], + "LDLIBS" => [], + "OBJCOPY" => "objcopy", + "PERL" => "/usr/bin/perl", + "RANLIB" => "ranlib", + "RC" => "windres", + "RCFLAGS" => [], + "api" => "30500", + "b32" => "0", + "b64" => "0", + "b64l" => "1", + "bn_ll" => "0", + "build_file" => "Makefile", + "build_file_templates" => [ + "Configurations/common0.tmpl", + "Configurations/unix-Makefile.tmpl" + ], + "build_infos" => [ + "./build.info", + "crypto/build.info", + "ssl/build.info", + "apps/build.info", + "util/build.info", + "tools/build.info", + "fuzz/build.info", + "providers/build.info", + "doc/build.info", + "engines/build.info", + "exporters/build.info", + "crypto/objects/build.info", + "crypto/buffer/build.info", + "crypto/bio/build.info", + "crypto/stack/build.info", + "crypto/lhash/build.info", + "crypto/hashtable/build.info", + "crypto/rand/build.info", + "crypto/evp/build.info", + "crypto/asn1/build.info", + "crypto/pem/build.info", + "crypto/x509/build.info", + "crypto/conf/build.info", + "crypto/txt_db/build.info", + "crypto/pkcs7/build.info", + "crypto/pkcs12/build.info", + "crypto/ui/build.info", + "crypto/kdf/build.info", + "crypto/store/build.info", + "crypto/property/build.info", + "crypto/md4/build.info", + "crypto/md5/build.info", + "crypto/sha/build.info", + "crypto/mdc2/build.info", + "crypto/ml_kem/build.info", + "crypto/hmac/build.info", + "crypto/ripemd/build.info", + "crypto/whrlpool/build.info", + "crypto/poly1305/build.info", + "crypto/siphash/build.info", + "crypto/sm3/build.info", + "crypto/des/build.info", + "crypto/aes/build.info", + "crypto/rc2/build.info", + "crypto/rc4/build.info", + "crypto/idea/build.info", + "crypto/aria/build.info", + "crypto/bf/build.info", + "crypto/cast/build.info", + "crypto/camellia/build.info", + "crypto/seed/build.info", + "crypto/sm4/build.info", + "crypto/chacha/build.info", + "crypto/modes/build.info", + "crypto/bn/build.info", + "crypto/ec/build.info", + "crypto/rsa/build.info", + "crypto/dsa/build.info", + "crypto/dh/build.info", + "crypto/sm2/build.info", + "crypto/dso/build.info", + "crypto/engine/build.info", + "crypto/err/build.info", + "crypto/comp/build.info", + "crypto/http/build.info", + "crypto/ocsp/build.info", + "crypto/cms/build.info", + "crypto/ts/build.info", + "crypto/srp/build.info", + "crypto/cmac/build.info", + "crypto/ct/build.info", + "crypto/async/build.info", + "crypto/ess/build.info", + "crypto/crmf/build.info", + "crypto/cmp/build.info", + "crypto/encode_decode/build.info", + "crypto/ffc/build.info", + "crypto/hpke/build.info", + "crypto/thread/build.info", + "crypto/ml_dsa/build.info", + "crypto/slh_dsa/build.info", + "ssl/record/build.info", + "ssl/rio/build.info", + "ssl/quic/build.info", + "apps/lib/build.info", + "providers/common/build.info", + "providers/implementations/build.info", + "providers/fips/build.info", + "doc/man1/build.info", + "ssl/record/methods/build.info", + "providers/common/der/build.info", + "providers/implementations/digests/build.info", + "providers/implementations/ciphers/build.info", + "providers/implementations/rands/build.info", + "providers/implementations/macs/build.info", + "providers/implementations/kdfs/build.info", + "providers/implementations/exchange/build.info", + "providers/implementations/keymgmt/build.info", + "providers/implementations/signature/build.info", + "providers/implementations/asymciphers/build.info", + "providers/implementations/encode_decode/build.info", + "providers/implementations/storemgmt/build.info", + "providers/implementations/kem/build.info", + "providers/implementations/skeymgmt/build.info", + "providers/implementations/rands/seeding/build.info" + ], + "build_metadata" => "", + "build_type" => "release", + "builddir" => ".", + "cflags" => [ + "-Wa,--noexecstack" + ], + "conf_files" => [ + "Configurations/00-base-templates.conf", + "Configurations/10-main.conf" + ], + "cppflags" => [], + "cxxflags" => [], + "defines" => [ + "NDEBUG" + ], + "dynamic_engines" => "0", + "ex_libs" => [], + "full_version" => "3.5.7", + "includes" => [], + "lflags" => [], + "lib_defines" => [ + "OPENSSL_PIC" + ], + "libdir" => "", + "major" => "3", + "makedep_scheme" => "gcc", + "minor" => "5", + "openssl_api_defines" => [ + "OPENSSL_CONFIGURED_API=30500" + ], + "openssl_feature_defines" => [ + "OPENSSL_RAND_SEED_OS", + "OPENSSL_THREADS", + "OPENSSL_NO_AFALGENG", + "OPENSSL_NO_ASAN", + "OPENSSL_NO_BROTLI_DYNAMIC", + "OPENSSL_NO_CRYPTO_MDEBUG", + "OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE", + "OPENSSL_NO_DEMOS", + "OPENSSL_NO_DEVCRYPTOENG", + "OPENSSL_NO_EC_NISTP_64_GCC_128", + "OPENSSL_NO_EGD", + "OPENSSL_NO_EXTERNAL_TESTS", + "OPENSSL_NO_FIPS_JITTER", + "OPENSSL_NO_FUZZ_AFL", + "OPENSSL_NO_FUZZ_LIBFUZZER", + "OPENSSL_NO_H3DEMO", + "OPENSSL_NO_HQINTEROP", + "OPENSSL_NO_JITTER", + "OPENSSL_NO_KTLS", + "OPENSSL_NO_LOADERENG", + "OPENSSL_NO_MD2", + "OPENSSL_NO_MSAN", + "OPENSSL_NO_PIE", + "OPENSSL_NO_RC5", + "OPENSSL_NO_SCTP", + "OPENSSL_NO_SSL3", + "OPENSSL_NO_SSL3_METHOD", + "OPENSSL_NO_SSLKEYLOG", + "OPENSSL_NO_TESTS", + "OPENSSL_NO_TFO", + "OPENSSL_NO_TRACE", + "OPENSSL_NO_UBSAN", + "OPENSSL_NO_UNIT_TEST", + "OPENSSL_NO_UPLINK", + "OPENSSL_NO_WEAK_SSL_CIPHERS", + "OPENSSL_NO_WINSTORE", + "OPENSSL_NO_ZLIB_DYNAMIC", + "OPENSSL_NO_ZSTD_DYNAMIC", + "OPENSSL_NO_DYNAMIC_ENGINE" + ], + "openssl_other_defines" => [ + "OPENSSL_NO_KTLS" + ], + "openssl_sys_defines" => [], + "openssldir" => "", + "options" => "enable-ssl-trace enable-fips enable-zlib --with-zlib-include=../../zlib enable-brotli --with-brotli-include=../../brotli/c/include enable-zstd --with-zstd-include=../../zstd/lib no-afalgeng no-asan no-brotli-dynamic no-buildtest-c++ no-crypto-mdebug no-crypto-mdebug-backtrace no-demos no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fips-jitter no-fuzz-afl no-fuzz-libfuzzer no-h3demo no-hqinterop no-jitter no-ktls no-loadereng no-md2 no-msan no-pie no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-sslkeylog no-tests no-tfo no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-winstore no-zlib-dynamic no-zstd-dynamic", + "patch" => "7", + "perl_archname" => "x86_64-linux-thread-multi", + "perl_cmd" => "/usr/bin/perl", + "perl_version" => "5.42.2", + "perlargv" => [ + "no-tests", + "no-shared", + "no-afalgeng", + "enable-ssl-trace", + "enable-fips", + "zlib", + "--with-zlib-include=../../zlib", + "enable-brotli", + "--with-brotli-include=../../brotli/c/include", + "enable-zstd", + "--with-zstd-include=../../zstd/lib", + "linux64-riscv64" + ], + "perlenv" => { + "AR" => "ar", + "ARFLAGS" => undef, + "AS" => "as", + "ASFLAGS" => undef, + "BUILDFILE" => undef, + "CC" => "gcc", + "CFLAGS" => undef, + "CPP" => undef, + "CPPDEFINES" => undef, + "CPPFLAGS" => undef, + "CPPINCLUDES" => undef, + "CROSS_COMPILE" => undef, + "CXX" => "g++", + "CXXFLAGS" => undef, + "HASHBANGPERL" => undef, + "LD" => "ld", + "LDFLAGS" => undef, + "LDLIBS" => undef, + "MT" => undef, + "MTFLAGS" => undef, + "OBJCOPY" => "objcopy", + "OPENSSL_LOCAL_CONFIG_DIR" => undef, + "PERL" => undef, + "RANLIB" => "ranlib", + "RC" => undef, + "RCFLAGS" => undef, + "RM" => undef, + "WINDRES" => undef, + "__CNF_CFLAGS" => undef, + "__CNF_CPPDEFINES" => undef, + "__CNF_CPPFLAGS" => undef, + "__CNF_CPPINCLUDES" => undef, + "__CNF_CXXFLAGS" => undef, + "__CNF_LDFLAGS" => undef, + "__CNF_LDLIBS" => undef + }, + "prefix" => "", + "prerelease" => "", + "processor" => "", + "rc4_int" => "unsigned char", + "release_date" => "9 Jun 2026", + "shlib_version" => "3", + "sourcedir" => ".", + "target" => "linux64-riscv64", + "version" => "3.5.7" +); +our %target = ( + "AR" => "ar", + "ARFLAGS" => "qc", + "CC" => "gcc", + "CFLAGS" => "-Wall -O3", + "CXX" => "g++", + "CXXFLAGS" => "-Wall -O3", + "HASHBANGPERL" => "/usr/bin/env perl", + "OBJCOPY" => "objcopy", + "RANLIB" => "ranlib", + "RC" => "windres", + "_conf_fname_int" => [ + "Configurations/00-base-templates.conf", + "Configurations/00-base-templates.conf", + "Configurations/10-main.conf", + "Configurations/10-main.conf", + "Configurations/10-main.conf", + "Configurations/shared-info.pl" + ], + "asm_arch" => "riscv64", + "bin_cflags" => "", + "bin_lflags" => "", + "bn_ops" => "SIXTY_FOUR_BIT_LONG RC4_CHAR", + "build_file" => "Makefile", + "build_scheme" => [ + "unified", + "unix" + ], + "cflags" => "-pthread", + "cppflags" => "", + "cxxflags" => "-std=c++11 -pthread", + "defines" => [ + "OPENSSL_BUILDING_OPENSSL", + "BROTLI", + "ZLIB", + "ZSTD" + ], + "disable" => [], + "dso_ldflags" => "-Wl,-z,defs", + "dso_scheme" => "dlfcn", + "enable" => [ + "afalgeng" + ], + "ex_libs" => "-lz -lbrotlienc -lbrotlidec -lbrotlicommon -lm -lzstd -ldl -pthread", + "includes" => [ + "../../brotli/c/include", + "../../zlib", + "../../zstd/lib" + ], + "lflags" => "", + "lib_cflags" => "", + "lib_cppflags" => "-DOPENSSL_USE_NODELETE", + "lib_defines" => [], + "module_cflags" => "-fPIC", + "module_cxxflags" => undef, + "module_ldflags" => "-Wl,-znodelete -shared -Wl,-Bsymbolic", + "perl_platform" => "Unix", + "perlasm_scheme" => "linux64", + "shared_cflag" => "-fPIC", + "shared_defflag" => "-Wl,--version-script=", + "shared_defines" => [], + "shared_ldflag" => "-Wl,-znodelete -shared -Wl,-Bsymbolic", + "shared_rcflag" => "", + "shared_sonameflag" => "-Wl,-soname=", + "shared_target" => "linux-shared", + "template" => "1", + "thread_defines" => [], + "thread_scheme" => "pthreads", + "unistd" => "" +); +our @disablables = ( + "acvp-tests", + "afalgeng", + "apps", + "argon2", + "aria", + "asan", + "asm", + "async", + "atexit", + "autoalginit", + "autoerrinit", + "autoload-config", + "bf", + "blake2", + "brotli", + "brotli-dynamic", + "buildtest-c++", + "bulk", + "cached-fetch", + "camellia", + "capieng", + "winstore", + "cast", + "chacha", + "cmac", + "cmp", + "cms", + "comp", + "crypto-mdebug", + "ct", + "default-thread-pool", + "demos", + "h3demo", + "hqinterop", + "deprecated", + "des", + "devcryptoeng", + "dgram", + "dh", + "docs", + "dsa", + "dso", + "dtls", + "dynamic-engine", + "ec", + "ec2m", + "ec_nistp_64_gcc_128", + "ecdh", + "ecdsa", + "ecx", + "egd", + "engine", + "err", + "external-tests", + "filenames", + "fips", + "fips-securitychecks", + "fips-post", + "fips-jitter", + "fuzz-afl", + "fuzz-libfuzzer", + "gost", + "http", + "idea", + "integrity-only-ciphers", + "jitter", + "ktls", + "legacy", + "loadereng", + "makedepend", + "md2", + "md4", + "mdc2", + "ml-dsa", + "ml-kem", + "module", + "msan", + "multiblock", + "nextprotoneg", + "ocb", + "ocsp", + "padlockeng", + "pic", + "pie", + "pinshared", + "poly1305", + "posix-io", + "psk", + "quic", + "unstable-qlog", + "rc2", + "rc4", + "rc5", + "rdrand", + "rfc3779", + "rmd160", + "scrypt", + "sctp", + "secure-memory", + "seed", + "shared", + "siphash", + "siv", + "slh-dsa", + "sm2", + "sm2-precomp", + "sm3", + "sm4", + "sock", + "srp", + "srtp", + "sse2", + "ssl", + "ssl-trace", + "static-engine", + "stdio", + "sslkeylog", + "tests", + "tfo", + "thread-pool", + "threads", + "tls", + "tls-deprecated-ec", + "trace", + "ts", + "ubsan", + "ui-console", + "unit-test", + "uplink", + "weak-ssl-ciphers", + "whirlpool", + "zlib", + "zlib-dynamic", + "zstd", + "zstd-dynamic", + "ssl3", + "ssl3-method", + "tls1", + "tls1-method", + "tls1_1", + "tls1_1-method", + "tls1_2", + "tls1_2-method", + "tls1_3", + "dtls1", + "dtls1-method", + "dtls1_2", + "dtls1_2-method" +); +our @disablables_int = ( + "crmf" +); +our %disabled = ( + "afalgeng" => "option", + "asan" => "default", + "brotli-dynamic" => "default", + "buildtest-c++" => "default", + "crypto-mdebug" => "default", + "crypto-mdebug-backtrace" => "default", + "demos" => "default", + "devcryptoeng" => "default", + "dynamic-engine" => "cascade", + "ec_nistp_64_gcc_128" => "default", + "egd" => "default", + "external-tests" => "default", + "fips-jitter" => "default", + "fuzz-afl" => "default", + "fuzz-libfuzzer" => "default", + "h3demo" => "default", + "hqinterop" => "default", + "jitter" => "default", + "ktls" => "default", + "loadereng" => "cascade", + "md2" => "default", + "msan" => "default", + "pie" => "default", + "rc5" => "default", + "sctp" => "default", + "shared" => "option", + "ssl3" => "default", + "ssl3-method" => "default", + "sslkeylog" => "default", + "tests" => "option", + "tfo" => "default", + "trace" => "default", + "ubsan" => "default", + "unit-test" => "default", + "uplink" => "no uplink_arch", + "weak-ssl-ciphers" => "default", + "winstore" => "not-windows", + "zlib-dynamic" => "default", + "zstd-dynamic" => "default" +); +our %withargs = ( + "brotli_include" => "../../brotli/c/include", + "zlib_include" => "../../zlib", + "zstd_include" => "../../zstd/lib" +); +our %unified_info = ( + "attributes" => { + "depends" => { + "doc/man1/openssl-asn1parse.pod" => { + "doc/man1/openssl-asn1parse.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-ca.pod" => { + "doc/man1/openssl-ca.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-ciphers.pod" => { + "doc/man1/openssl-ciphers.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-cmds.pod" => { + "doc/man1/openssl-cmds.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-cmp.pod" => { + "doc/man1/openssl-cmp.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-cms.pod" => { + "doc/man1/openssl-cms.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-crl.pod" => { + "doc/man1/openssl-crl.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-crl2pkcs7.pod" => { + "doc/man1/openssl-crl2pkcs7.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-dgst.pod" => { + "doc/man1/openssl-dgst.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-dhparam.pod" => { + "doc/man1/openssl-dhparam.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-dsa.pod" => { + "doc/man1/openssl-dsa.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-dsaparam.pod" => { + "doc/man1/openssl-dsaparam.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-ec.pod" => { + "doc/man1/openssl-ec.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-ecparam.pod" => { + "doc/man1/openssl-ecparam.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-enc.pod" => { + "doc/man1/openssl-enc.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-engine.pod" => { + "doc/man1/openssl-engine.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-errstr.pod" => { + "doc/man1/openssl-errstr.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-fipsinstall.pod" => { + "doc/man1/openssl-fipsinstall.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-gendsa.pod" => { + "doc/man1/openssl-gendsa.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-genpkey.pod" => { + "doc/man1/openssl-genpkey.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-genrsa.pod" => { + "doc/man1/openssl-genrsa.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-info.pod" => { + "doc/man1/openssl-info.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-kdf.pod" => { + "doc/man1/openssl-kdf.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-list.pod" => { + "doc/man1/openssl-list.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-mac.pod" => { + "doc/man1/openssl-mac.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-nseq.pod" => { + "doc/man1/openssl-nseq.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-ocsp.pod" => { + "doc/man1/openssl-ocsp.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-passwd.pod" => { + "doc/man1/openssl-passwd.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-pkcs12.pod" => { + "doc/man1/openssl-pkcs12.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-pkcs7.pod" => { + "doc/man1/openssl-pkcs7.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-pkcs8.pod" => { + "doc/man1/openssl-pkcs8.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-pkey.pod" => { + "doc/man1/openssl-pkey.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-pkeyparam.pod" => { + "doc/man1/openssl-pkeyparam.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-pkeyutl.pod" => { + "doc/man1/openssl-pkeyutl.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-prime.pod" => { + "doc/man1/openssl-prime.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-rand.pod" => { + "doc/man1/openssl-rand.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-rehash.pod" => { + "doc/man1/openssl-rehash.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-req.pod" => { + "doc/man1/openssl-req.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-rsa.pod" => { + "doc/man1/openssl-rsa.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-rsautl.pod" => { + "doc/man1/openssl-rsautl.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-s_client.pod" => { + "doc/man1/openssl-s_client.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-s_server.pod" => { + "doc/man1/openssl-s_server.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-s_time.pod" => { + "doc/man1/openssl-s_time.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-sess_id.pod" => { + "doc/man1/openssl-sess_id.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-skeyutl.pod" => { + "doc/man1/openssl-skeyutl.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-smime.pod" => { + "doc/man1/openssl-smime.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-speed.pod" => { + "doc/man1/openssl-speed.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-spkac.pod" => { + "doc/man1/openssl-spkac.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-srp.pod" => { + "doc/man1/openssl-srp.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-storeutl.pod" => { + "doc/man1/openssl-storeutl.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-ts.pod" => { + "doc/man1/openssl-ts.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-verify.pod" => { + "doc/man1/openssl-verify.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-version.pod" => { + "doc/man1/openssl-version.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-x509.pod" => { + "doc/man1/openssl-x509.pod.in" => { + "pod" => "1" + } + }, + "doc/man7/openssl_user_macros.pod" => { + "doc/man7/openssl_user_macros.pod.in" => { + "pod" => "1" + } + }, + "providers/libcommon.a" => { + "libcrypto" => { + "weak" => "1" + } + } + }, + "generate" => { + "exporters/OpenSSLConfig.cmake" => { + "exporter" => "cmake" + }, + "exporters/OpenSSLConfigVersion.cmake" => { + "exporter" => "cmake" + }, + "exporters/libcrypto.pc" => { + "exporter" => "pkg-config" + }, + "exporters/libssl.pc" => { + "exporter" => "pkg-config" + }, + "exporters/openssl.pc" => { + "exporter" => "pkg-config" + }, + "include/openssl/configuration.h" => { + "skip" => "1" + } + }, + "libraries" => { + "apps/libapps.a" => { + "noinst" => "1" + }, + "providers/libcommon.a" => { + "noinst" => "1" + }, + "providers/libdefault.a" => { + "noinst" => "1" + }, + "providers/libfips.a" => { + "noinst" => "1" + }, + "providers/liblegacy.a" => { + "noinst" => "1" + }, + "providers/libtemplate.a" => { + "noinst" => "1" + } + }, + "modules" => { + "providers/fips" => { + "fips" => "1" + } + }, + "scripts" => { + "apps/CA.pl" => { + "misc" => "1" + }, + "apps/tsget.pl" => { + "linkname" => "tsget", + "misc" => "1" + }, + "util/shlib_wrap.sh" => { + "noinst" => "1" + }, + "util/wrap.pl" => { + "noinst" => "1" + } + }, + "sources" => { + "apps/openssl" => { + "apps/openssl-bin-progs.o" => { + "nocheck" => "1" + } + }, + "apps/openssl-bin-progs.o" => { + "apps/progs.c" => { + "nocheck" => "1" + } + }, + "apps/progs.o" => {} + } + }, + "defines" => { + "libcrypto" => [ + "AES_ASM", + "GHASH_ASM", + "INCLUDE_C_CHACHA20", + "INCLUDE_C_SHA256", + "INCLUDE_C_SHA512", + "OPENSSL_CPUID_OBJ", + "OPENSSL_SM3_ASM", + "SHA256_ASM", + "SHA512_ASM", + "SM4_ASM" + ], + "providers/fips" => [ + "FIPS_MODULE" + ], + "providers/libcommon.a" => [ + "OPENSSL_CPUID_OBJ" + ], + "providers/libdefault.a" => [ + "AES_ASM", + "GHASH_ASM", + "INCLUDE_C_SHA256", + "INCLUDE_C_SHA512", + "OPENSSL_CPUID_OBJ", + "SHA256_ASM", + "SHA512_ASM", + "SM4_ASM" + ], + "providers/libfips.a" => [ + "AES_ASM", + "FIPS_MODULE", + "GHASH_ASM", + "INCLUDE_C_SHA256", + "INCLUDE_C_SHA512", + "OPENSSL_CPUID_OBJ", + "SHA256_ASM", + "SHA512_ASM", + "SM4_ASM" + ] + }, + "depends" => { + "" => [ + "OpenSSLConfigVersion.cmake", + "crypto/params_idx.c", + "exporters/OpenSSLConfigVersion.cmake", + "exporters/openssl.pc", + "include/crypto/bn_conf.h", + "include/crypto/dso_conf.h", + "include/internal/param_names.h", + "include/openssl/asn1.h", + "include/openssl/asn1t.h", + "include/openssl/bio.h", + "include/openssl/cmp.h", + "include/openssl/cms.h", + "include/openssl/comp.h", + "include/openssl/conf.h", + "include/openssl/core_names.h", + "include/openssl/crmf.h", + "include/openssl/crypto.h", + "include/openssl/ct.h", + "include/openssl/err.h", + "include/openssl/ess.h", + "include/openssl/fipskey.h", + "include/openssl/lhash.h", + "include/openssl/ocsp.h", + "include/openssl/opensslv.h", + "include/openssl/pkcs12.h", + "include/openssl/pkcs7.h", + "include/openssl/safestack.h", + "include/openssl/srp.h", + "include/openssl/ssl.h", + "include/openssl/ui.h", + "include/openssl/x509.h", + "include/openssl/x509_acert.h", + "include/openssl/x509_vfy.h", + "include/openssl/x509v3.h", + "openssl.pc" + ], + "OpenSSLConfig.cmake" => [ + "builddata.pm" + ], + "OpenSSLConfigVersion.cmake" => [ + "OpenSSLConfig.cmake", + "builddata.pm" + ], + "apps/lib/openssl-bin-cmp_mock_srv.o" => [ + "apps/progs.h" + ], + "apps/openssl" => [ + "apps/libapps.a", + "libssl" + ], + "apps/openssl-bin-asn1parse.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-ca.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-ciphers.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-cmp.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-cms.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-crl.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-crl2pkcs7.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-dgst.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-dhparam.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-dsa.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-dsaparam.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-ec.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-ecparam.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-enc.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-engine.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-errstr.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-fipsinstall.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-gendsa.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-genpkey.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-genrsa.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-info.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-kdf.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-list.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-mac.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-nseq.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-ocsp.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-openssl.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-passwd.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-pkcs12.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-pkcs7.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-pkcs8.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-pkey.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-pkeyparam.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-pkeyutl.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-prime.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-progs.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-rand.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-rehash.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-req.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-rsa.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-rsautl.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-s_client.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-s_server.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-s_time.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-sess_id.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-skeyutl.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-smime.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-speed.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-spkac.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-srp.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-storeutl.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-ts.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-verify.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-version.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-x509.o" => [ + "apps/progs.h" + ], + "apps/progs.c" => [ + "configdata.pm" + ], + "apps/progs.h" => [ + "apps/progs.c" + ], + "build_modules_nodep" => [ + "providers/fipsmodule.cnf" + ], + "crypto/aes/aes-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/aes/aesni-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/aes/aest4-sparcv9.S" => [ + "crypto/perlasm/sparcv9_modes.pl" + ], + "crypto/aes/vpaes-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/bf/bf-586.S" => [ + "crypto/perlasm/cbc.pl", + "crypto/perlasm/x86asm.pl" + ], + "crypto/bn/bn-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/bn/co-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/bn/x86-gf2m.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/bn/x86-mont.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/camellia/cmll-x86.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/camellia/cmllt4-sparcv9.S" => [ + "crypto/perlasm/sparcv9_modes.pl" + ], + "crypto/cast/cast-586.S" => [ + "crypto/perlasm/cbc.pl", + "crypto/perlasm/x86asm.pl" + ], + "crypto/des/crypt586.S" => [ + "crypto/perlasm/cbc.pl", + "crypto/perlasm/x86asm.pl" + ], + "crypto/des/des-586.S" => [ + "crypto/perlasm/cbc.pl", + "crypto/perlasm/x86asm.pl" + ], + "crypto/libcrypto-lib-cversion.o" => [ + "crypto/buildinf.h" + ], + "crypto/libcrypto-lib-info.o" => [ + "crypto/buildinf.h" + ], + "crypto/params_idx.c" => [ + "util/perl|OpenSSL/paramnames.pm" + ], + "crypto/rc4/rc4-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/ripemd/rmd-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/sha/sha1-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/sha/sha256-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/sha/sha512-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/whrlpool/wp-mmx.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/x86cpuid.s" => [ + "crypto/perlasm/x86asm.pl" + ], + "doc/html/man1/CA.pl.html" => [ + "doc/man1/CA.pl.pod" + ], + "doc/html/man1/openssl-asn1parse.html" => [ + "doc/man1/openssl-asn1parse.pod" + ], + "doc/html/man1/openssl-ca.html" => [ + "doc/man1/openssl-ca.pod" + ], + "doc/html/man1/openssl-ciphers.html" => [ + "doc/man1/openssl-ciphers.pod" + ], + "doc/html/man1/openssl-cmds.html" => [ + "doc/man1/openssl-cmds.pod" + ], + "doc/html/man1/openssl-cmp.html" => [ + "doc/man1/openssl-cmp.pod" + ], + "doc/html/man1/openssl-cms.html" => [ + "doc/man1/openssl-cms.pod" + ], + "doc/html/man1/openssl-crl.html" => [ + "doc/man1/openssl-crl.pod" + ], + "doc/html/man1/openssl-crl2pkcs7.html" => [ + "doc/man1/openssl-crl2pkcs7.pod" + ], + "doc/html/man1/openssl-dgst.html" => [ + "doc/man1/openssl-dgst.pod" + ], + "doc/html/man1/openssl-dhparam.html" => [ + "doc/man1/openssl-dhparam.pod" + ], + "doc/html/man1/openssl-dsa.html" => [ + "doc/man1/openssl-dsa.pod" + ], + "doc/html/man1/openssl-dsaparam.html" => [ + "doc/man1/openssl-dsaparam.pod" + ], + "doc/html/man1/openssl-ec.html" => [ + "doc/man1/openssl-ec.pod" + ], + "doc/html/man1/openssl-ecparam.html" => [ + "doc/man1/openssl-ecparam.pod" + ], + "doc/html/man1/openssl-enc.html" => [ + "doc/man1/openssl-enc.pod" + ], + "doc/html/man1/openssl-engine.html" => [ + "doc/man1/openssl-engine.pod" + ], + "doc/html/man1/openssl-errstr.html" => [ + "doc/man1/openssl-errstr.pod" + ], + "doc/html/man1/openssl-fipsinstall.html" => [ + "doc/man1/openssl-fipsinstall.pod" + ], + "doc/html/man1/openssl-format-options.html" => [ + "doc/man1/openssl-format-options.pod" + ], + "doc/html/man1/openssl-gendsa.html" => [ + "doc/man1/openssl-gendsa.pod" + ], + "doc/html/man1/openssl-genpkey.html" => [ + "doc/man1/openssl-genpkey.pod" + ], + "doc/html/man1/openssl-genrsa.html" => [ + "doc/man1/openssl-genrsa.pod" + ], + "doc/html/man1/openssl-info.html" => [ + "doc/man1/openssl-info.pod" + ], + "doc/html/man1/openssl-kdf.html" => [ + "doc/man1/openssl-kdf.pod" + ], + "doc/html/man1/openssl-list.html" => [ + "doc/man1/openssl-list.pod" + ], + "doc/html/man1/openssl-mac.html" => [ + "doc/man1/openssl-mac.pod" + ], + "doc/html/man1/openssl-namedisplay-options.html" => [ + "doc/man1/openssl-namedisplay-options.pod" + ], + "doc/html/man1/openssl-nseq.html" => [ + "doc/man1/openssl-nseq.pod" + ], + "doc/html/man1/openssl-ocsp.html" => [ + "doc/man1/openssl-ocsp.pod" + ], + "doc/html/man1/openssl-passphrase-options.html" => [ + "doc/man1/openssl-passphrase-options.pod" + ], + "doc/html/man1/openssl-passwd.html" => [ + "doc/man1/openssl-passwd.pod" + ], + "doc/html/man1/openssl-pkcs12.html" => [ + "doc/man1/openssl-pkcs12.pod" + ], + "doc/html/man1/openssl-pkcs7.html" => [ + "doc/man1/openssl-pkcs7.pod" + ], + "doc/html/man1/openssl-pkcs8.html" => [ + "doc/man1/openssl-pkcs8.pod" + ], + "doc/html/man1/openssl-pkey.html" => [ + "doc/man1/openssl-pkey.pod" + ], + "doc/html/man1/openssl-pkeyparam.html" => [ + "doc/man1/openssl-pkeyparam.pod" + ], + "doc/html/man1/openssl-pkeyutl.html" => [ + "doc/man1/openssl-pkeyutl.pod" + ], + "doc/html/man1/openssl-prime.html" => [ + "doc/man1/openssl-prime.pod" + ], + "doc/html/man1/openssl-rand.html" => [ + "doc/man1/openssl-rand.pod" + ], + "doc/html/man1/openssl-rehash.html" => [ + "doc/man1/openssl-rehash.pod" + ], + "doc/html/man1/openssl-req.html" => [ + "doc/man1/openssl-req.pod" + ], + "doc/html/man1/openssl-rsa.html" => [ + "doc/man1/openssl-rsa.pod" + ], + "doc/html/man1/openssl-rsautl.html" => [ + "doc/man1/openssl-rsautl.pod" + ], + "doc/html/man1/openssl-s_client.html" => [ + "doc/man1/openssl-s_client.pod" + ], + "doc/html/man1/openssl-s_server.html" => [ + "doc/man1/openssl-s_server.pod" + ], + "doc/html/man1/openssl-s_time.html" => [ + "doc/man1/openssl-s_time.pod" + ], + "doc/html/man1/openssl-sess_id.html" => [ + "doc/man1/openssl-sess_id.pod" + ], + "doc/html/man1/openssl-skeyutl.html" => [ + "doc/man1/openssl-skeyutl.pod" + ], + "doc/html/man1/openssl-smime.html" => [ + "doc/man1/openssl-smime.pod" + ], + "doc/html/man1/openssl-speed.html" => [ + "doc/man1/openssl-speed.pod" + ], + "doc/html/man1/openssl-spkac.html" => [ + "doc/man1/openssl-spkac.pod" + ], + "doc/html/man1/openssl-srp.html" => [ + "doc/man1/openssl-srp.pod" + ], + "doc/html/man1/openssl-storeutl.html" => [ + "doc/man1/openssl-storeutl.pod" + ], + "doc/html/man1/openssl-ts.html" => [ + "doc/man1/openssl-ts.pod" + ], + "doc/html/man1/openssl-verification-options.html" => [ + "doc/man1/openssl-verification-options.pod" + ], + "doc/html/man1/openssl-verify.html" => [ + "doc/man1/openssl-verify.pod" + ], + "doc/html/man1/openssl-version.html" => [ + "doc/man1/openssl-version.pod" + ], + "doc/html/man1/openssl-x509.html" => [ + "doc/man1/openssl-x509.pod" + ], + "doc/html/man1/openssl.html" => [ + "doc/man1/openssl.pod" + ], + "doc/html/man1/tsget.html" => [ + "doc/man1/tsget.pod" + ], + "doc/html/man3/ADMISSIONS.html" => [ + "doc/man3/ADMISSIONS.pod" + ], + "doc/html/man3/ASN1_EXTERN_FUNCS.html" => [ + "doc/man3/ASN1_EXTERN_FUNCS.pod" + ], + "doc/html/man3/ASN1_INTEGER_get_int64.html" => [ + "doc/man3/ASN1_INTEGER_get_int64.pod" + ], + "doc/html/man3/ASN1_INTEGER_new.html" => [ + "doc/man3/ASN1_INTEGER_new.pod" + ], + "doc/html/man3/ASN1_ITEM_lookup.html" => [ + "doc/man3/ASN1_ITEM_lookup.pod" + ], + "doc/html/man3/ASN1_OBJECT_new.html" => [ + "doc/man3/ASN1_OBJECT_new.pod" + ], + "doc/html/man3/ASN1_STRING_TABLE_add.html" => [ + "doc/man3/ASN1_STRING_TABLE_add.pod" + ], + "doc/html/man3/ASN1_STRING_length.html" => [ + "doc/man3/ASN1_STRING_length.pod" + ], + "doc/html/man3/ASN1_STRING_new.html" => [ + "doc/man3/ASN1_STRING_new.pod" + ], + "doc/html/man3/ASN1_STRING_print_ex.html" => [ + "doc/man3/ASN1_STRING_print_ex.pod" + ], + "doc/html/man3/ASN1_TIME_set.html" => [ + "doc/man3/ASN1_TIME_set.pod" + ], + "doc/html/man3/ASN1_TYPE_get.html" => [ + "doc/man3/ASN1_TYPE_get.pod" + ], + "doc/html/man3/ASN1_aux_cb.html" => [ + "doc/man3/ASN1_aux_cb.pod" + ], + "doc/html/man3/ASN1_generate_nconf.html" => [ + "doc/man3/ASN1_generate_nconf.pod" + ], + "doc/html/man3/ASN1_item_d2i_bio.html" => [ + "doc/man3/ASN1_item_d2i_bio.pod" + ], + "doc/html/man3/ASN1_item_new.html" => [ + "doc/man3/ASN1_item_new.pod" + ], + "doc/html/man3/ASN1_item_sign.html" => [ + "doc/man3/ASN1_item_sign.pod" + ], + "doc/html/man3/ASYNC_WAIT_CTX_new.html" => [ + "doc/man3/ASYNC_WAIT_CTX_new.pod" + ], + "doc/html/man3/ASYNC_start_job.html" => [ + "doc/man3/ASYNC_start_job.pod" + ], + "doc/html/man3/BF_encrypt.html" => [ + "doc/man3/BF_encrypt.pod" + ], + "doc/html/man3/BIO_ADDR.html" => [ + "doc/man3/BIO_ADDR.pod" + ], + "doc/html/man3/BIO_ADDRINFO.html" => [ + "doc/man3/BIO_ADDRINFO.pod" + ], + "doc/html/man3/BIO_connect.html" => [ + "doc/man3/BIO_connect.pod" + ], + "doc/html/man3/BIO_ctrl.html" => [ + "doc/man3/BIO_ctrl.pod" + ], + "doc/html/man3/BIO_f_base64.html" => [ + "doc/man3/BIO_f_base64.pod" + ], + "doc/html/man3/BIO_f_buffer.html" => [ + "doc/man3/BIO_f_buffer.pod" + ], + "doc/html/man3/BIO_f_cipher.html" => [ + "doc/man3/BIO_f_cipher.pod" + ], + "doc/html/man3/BIO_f_md.html" => [ + "doc/man3/BIO_f_md.pod" + ], + "doc/html/man3/BIO_f_null.html" => [ + "doc/man3/BIO_f_null.pod" + ], + "doc/html/man3/BIO_f_prefix.html" => [ + "doc/man3/BIO_f_prefix.pod" + ], + "doc/html/man3/BIO_f_readbuffer.html" => [ + "doc/man3/BIO_f_readbuffer.pod" + ], + "doc/html/man3/BIO_f_ssl.html" => [ + "doc/man3/BIO_f_ssl.pod" + ], + "doc/html/man3/BIO_find_type.html" => [ + "doc/man3/BIO_find_type.pod" + ], + "doc/html/man3/BIO_get_data.html" => [ + "doc/man3/BIO_get_data.pod" + ], + "doc/html/man3/BIO_get_ex_new_index.html" => [ + "doc/man3/BIO_get_ex_new_index.pod" + ], + "doc/html/man3/BIO_get_rpoll_descriptor.html" => [ + "doc/man3/BIO_get_rpoll_descriptor.pod" + ], + "doc/html/man3/BIO_meth_new.html" => [ + "doc/man3/BIO_meth_new.pod" + ], + "doc/html/man3/BIO_new.html" => [ + "doc/man3/BIO_new.pod" + ], + "doc/html/man3/BIO_new_CMS.html" => [ + "doc/man3/BIO_new_CMS.pod" + ], + "doc/html/man3/BIO_parse_hostserv.html" => [ + "doc/man3/BIO_parse_hostserv.pod" + ], + "doc/html/man3/BIO_printf.html" => [ + "doc/man3/BIO_printf.pod" + ], + "doc/html/man3/BIO_push.html" => [ + "doc/man3/BIO_push.pod" + ], + "doc/html/man3/BIO_read.html" => [ + "doc/man3/BIO_read.pod" + ], + "doc/html/man3/BIO_s_accept.html" => [ + "doc/man3/BIO_s_accept.pod" + ], + "doc/html/man3/BIO_s_bio.html" => [ + "doc/man3/BIO_s_bio.pod" + ], + "doc/html/man3/BIO_s_connect.html" => [ + "doc/man3/BIO_s_connect.pod" + ], + "doc/html/man3/BIO_s_core.html" => [ + "doc/man3/BIO_s_core.pod" + ], + "doc/html/man3/BIO_s_datagram.html" => [ + "doc/man3/BIO_s_datagram.pod" + ], + "doc/html/man3/BIO_s_dgram_pair.html" => [ + "doc/man3/BIO_s_dgram_pair.pod" + ], + "doc/html/man3/BIO_s_fd.html" => [ + "doc/man3/BIO_s_fd.pod" + ], + "doc/html/man3/BIO_s_file.html" => [ + "doc/man3/BIO_s_file.pod" + ], + "doc/html/man3/BIO_s_mem.html" => [ + "doc/man3/BIO_s_mem.pod" + ], + "doc/html/man3/BIO_s_null.html" => [ + "doc/man3/BIO_s_null.pod" + ], + "doc/html/man3/BIO_s_socket.html" => [ + "doc/man3/BIO_s_socket.pod" + ], + "doc/html/man3/BIO_sendmmsg.html" => [ + "doc/man3/BIO_sendmmsg.pod" + ], + "doc/html/man3/BIO_set_callback.html" => [ + "doc/man3/BIO_set_callback.pod" + ], + "doc/html/man3/BIO_set_flags.html" => [ + "doc/man3/BIO_set_flags.pod" + ], + "doc/html/man3/BIO_should_retry.html" => [ + "doc/man3/BIO_should_retry.pod" + ], + "doc/html/man3/BIO_socket_wait.html" => [ + "doc/man3/BIO_socket_wait.pod" + ], + "doc/html/man3/BN_BLINDING_new.html" => [ + "doc/man3/BN_BLINDING_new.pod" + ], + "doc/html/man3/BN_CTX_new.html" => [ + "doc/man3/BN_CTX_new.pod" + ], + "doc/html/man3/BN_CTX_start.html" => [ + "doc/man3/BN_CTX_start.pod" + ], + "doc/html/man3/BN_add.html" => [ + "doc/man3/BN_add.pod" + ], + "doc/html/man3/BN_add_word.html" => [ + "doc/man3/BN_add_word.pod" + ], + "doc/html/man3/BN_bn2bin.html" => [ + "doc/man3/BN_bn2bin.pod" + ], + "doc/html/man3/BN_cmp.html" => [ + "doc/man3/BN_cmp.pod" + ], + "doc/html/man3/BN_copy.html" => [ + "doc/man3/BN_copy.pod" + ], + "doc/html/man3/BN_generate_prime.html" => [ + "doc/man3/BN_generate_prime.pod" + ], + "doc/html/man3/BN_mod_exp_mont.html" => [ + "doc/man3/BN_mod_exp_mont.pod" + ], + "doc/html/man3/BN_mod_inverse.html" => [ + "doc/man3/BN_mod_inverse.pod" + ], + "doc/html/man3/BN_mod_mul_montgomery.html" => [ + "doc/man3/BN_mod_mul_montgomery.pod" + ], + "doc/html/man3/BN_mod_mul_reciprocal.html" => [ + "doc/man3/BN_mod_mul_reciprocal.pod" + ], + "doc/html/man3/BN_new.html" => [ + "doc/man3/BN_new.pod" + ], + "doc/html/man3/BN_num_bytes.html" => [ + "doc/man3/BN_num_bytes.pod" + ], + "doc/html/man3/BN_rand.html" => [ + "doc/man3/BN_rand.pod" + ], + "doc/html/man3/BN_security_bits.html" => [ + "doc/man3/BN_security_bits.pod" + ], + "doc/html/man3/BN_set_bit.html" => [ + "doc/man3/BN_set_bit.pod" + ], + "doc/html/man3/BN_swap.html" => [ + "doc/man3/BN_swap.pod" + ], + "doc/html/man3/BN_zero.html" => [ + "doc/man3/BN_zero.pod" + ], + "doc/html/man3/BUF_MEM_new.html" => [ + "doc/man3/BUF_MEM_new.pod" + ], + "doc/html/man3/CMAC_CTX.html" => [ + "doc/man3/CMAC_CTX.pod" + ], + "doc/html/man3/CMS_EncryptedData_decrypt.html" => [ + "doc/man3/CMS_EncryptedData_decrypt.pod" + ], + "doc/html/man3/CMS_EncryptedData_encrypt.html" => [ + "doc/man3/CMS_EncryptedData_encrypt.pod" + ], + "doc/html/man3/CMS_EncryptedData_set1_key.html" => [ + "doc/man3/CMS_EncryptedData_set1_key.pod" + ], + "doc/html/man3/CMS_EnvelopedData_create.html" => [ + "doc/man3/CMS_EnvelopedData_create.pod" + ], + "doc/html/man3/CMS_add0_cert.html" => [ + "doc/man3/CMS_add0_cert.pod" + ], + "doc/html/man3/CMS_add1_recipient_cert.html" => [ + "doc/man3/CMS_add1_recipient_cert.pod" + ], + "doc/html/man3/CMS_add1_signer.html" => [ + "doc/man3/CMS_add1_signer.pod" + ], + "doc/html/man3/CMS_compress.html" => [ + "doc/man3/CMS_compress.pod" + ], + "doc/html/man3/CMS_data_create.html" => [ + "doc/man3/CMS_data_create.pod" + ], + "doc/html/man3/CMS_decrypt.html" => [ + "doc/man3/CMS_decrypt.pod" + ], + "doc/html/man3/CMS_digest_create.html" => [ + "doc/man3/CMS_digest_create.pod" + ], + "doc/html/man3/CMS_encrypt.html" => [ + "doc/man3/CMS_encrypt.pod" + ], + "doc/html/man3/CMS_final.html" => [ + "doc/man3/CMS_final.pod" + ], + "doc/html/man3/CMS_get0_RecipientInfos.html" => [ + "doc/man3/CMS_get0_RecipientInfos.pod" + ], + "doc/html/man3/CMS_get0_SignerInfos.html" => [ + "doc/man3/CMS_get0_SignerInfos.pod" + ], + "doc/html/man3/CMS_get0_type.html" => [ + "doc/man3/CMS_get0_type.pod" + ], + "doc/html/man3/CMS_get1_ReceiptRequest.html" => [ + "doc/man3/CMS_get1_ReceiptRequest.pod" + ], + "doc/html/man3/CMS_sign.html" => [ + "doc/man3/CMS_sign.pod" + ], + "doc/html/man3/CMS_sign_receipt.html" => [ + "doc/man3/CMS_sign_receipt.pod" + ], + "doc/html/man3/CMS_signed_get_attr.html" => [ + "doc/man3/CMS_signed_get_attr.pod" + ], + "doc/html/man3/CMS_uncompress.html" => [ + "doc/man3/CMS_uncompress.pod" + ], + "doc/html/man3/CMS_verify.html" => [ + "doc/man3/CMS_verify.pod" + ], + "doc/html/man3/CMS_verify_receipt.html" => [ + "doc/man3/CMS_verify_receipt.pod" + ], + "doc/html/man3/COMP_CTX_new.html" => [ + "doc/man3/COMP_CTX_new.pod" + ], + "doc/html/man3/CONF_modules_free.html" => [ + "doc/man3/CONF_modules_free.pod" + ], + "doc/html/man3/CONF_modules_load_file.html" => [ + "doc/man3/CONF_modules_load_file.pod" + ], + "doc/html/man3/CRYPTO_THREAD_run_once.html" => [ + "doc/man3/CRYPTO_THREAD_run_once.pod" + ], + "doc/html/man3/CRYPTO_get_ex_new_index.html" => [ + "doc/man3/CRYPTO_get_ex_new_index.pod" + ], + "doc/html/man3/CRYPTO_memcmp.html" => [ + "doc/man3/CRYPTO_memcmp.pod" + ], + "doc/html/man3/CTLOG_STORE_get0_log_by_id.html" => [ + "doc/man3/CTLOG_STORE_get0_log_by_id.pod" + ], + "doc/html/man3/CTLOG_STORE_new.html" => [ + "doc/man3/CTLOG_STORE_new.pod" + ], + "doc/html/man3/CTLOG_new.html" => [ + "doc/man3/CTLOG_new.pod" + ], + "doc/html/man3/CT_POLICY_EVAL_CTX_new.html" => [ + "doc/man3/CT_POLICY_EVAL_CTX_new.pod" + ], + "doc/html/man3/DEFINE_STACK_OF.html" => [ + "doc/man3/DEFINE_STACK_OF.pod" + ], + "doc/html/man3/DES_random_key.html" => [ + "doc/man3/DES_random_key.pod" + ], + "doc/html/man3/DH_generate_key.html" => [ + "doc/man3/DH_generate_key.pod" + ], + "doc/html/man3/DH_generate_parameters.html" => [ + "doc/man3/DH_generate_parameters.pod" + ], + "doc/html/man3/DH_get0_pqg.html" => [ + "doc/man3/DH_get0_pqg.pod" + ], + "doc/html/man3/DH_get_1024_160.html" => [ + "doc/man3/DH_get_1024_160.pod" + ], + "doc/html/man3/DH_meth_new.html" => [ + "doc/man3/DH_meth_new.pod" + ], + "doc/html/man3/DH_new.html" => [ + "doc/man3/DH_new.pod" + ], + "doc/html/man3/DH_new_by_nid.html" => [ + "doc/man3/DH_new_by_nid.pod" + ], + "doc/html/man3/DH_set_method.html" => [ + "doc/man3/DH_set_method.pod" + ], + "doc/html/man3/DH_size.html" => [ + "doc/man3/DH_size.pod" + ], + "doc/html/man3/DSA_SIG_new.html" => [ + "doc/man3/DSA_SIG_new.pod" + ], + "doc/html/man3/DSA_do_sign.html" => [ + "doc/man3/DSA_do_sign.pod" + ], + "doc/html/man3/DSA_dup_DH.html" => [ + "doc/man3/DSA_dup_DH.pod" + ], + "doc/html/man3/DSA_generate_key.html" => [ + "doc/man3/DSA_generate_key.pod" + ], + "doc/html/man3/DSA_generate_parameters.html" => [ + "doc/man3/DSA_generate_parameters.pod" + ], + "doc/html/man3/DSA_get0_pqg.html" => [ + "doc/man3/DSA_get0_pqg.pod" + ], + "doc/html/man3/DSA_meth_new.html" => [ + "doc/man3/DSA_meth_new.pod" + ], + "doc/html/man3/DSA_new.html" => [ + "doc/man3/DSA_new.pod" + ], + "doc/html/man3/DSA_set_method.html" => [ + "doc/man3/DSA_set_method.pod" + ], + "doc/html/man3/DSA_sign.html" => [ + "doc/man3/DSA_sign.pod" + ], + "doc/html/man3/DSA_size.html" => [ + "doc/man3/DSA_size.pod" + ], + "doc/html/man3/DTLS_get_data_mtu.html" => [ + "doc/man3/DTLS_get_data_mtu.pod" + ], + "doc/html/man3/DTLS_set_timer_cb.html" => [ + "doc/man3/DTLS_set_timer_cb.pod" + ], + "doc/html/man3/DTLSv1_get_timeout.html" => [ + "doc/man3/DTLSv1_get_timeout.pod" + ], + "doc/html/man3/DTLSv1_handle_timeout.html" => [ + "doc/man3/DTLSv1_handle_timeout.pod" + ], + "doc/html/man3/DTLSv1_listen.html" => [ + "doc/man3/DTLSv1_listen.pod" + ], + "doc/html/man3/ECDSA_SIG_new.html" => [ + "doc/man3/ECDSA_SIG_new.pod" + ], + "doc/html/man3/ECDSA_sign.html" => [ + "doc/man3/ECDSA_sign.pod" + ], + "doc/html/man3/ECPKParameters_print.html" => [ + "doc/man3/ECPKParameters_print.pod" + ], + "doc/html/man3/EC_GFp_simple_method.html" => [ + "doc/man3/EC_GFp_simple_method.pod" + ], + "doc/html/man3/EC_GROUP_copy.html" => [ + "doc/man3/EC_GROUP_copy.pod" + ], + "doc/html/man3/EC_GROUP_new.html" => [ + "doc/man3/EC_GROUP_new.pod" + ], + "doc/html/man3/EC_KEY_get_enc_flags.html" => [ + "doc/man3/EC_KEY_get_enc_flags.pod" + ], + "doc/html/man3/EC_KEY_new.html" => [ + "doc/man3/EC_KEY_new.pod" + ], + "doc/html/man3/EC_POINT_add.html" => [ + "doc/man3/EC_POINT_add.pod" + ], + "doc/html/man3/EC_POINT_new.html" => [ + "doc/man3/EC_POINT_new.pod" + ], + "doc/html/man3/ENGINE_add.html" => [ + "doc/man3/ENGINE_add.pod" + ], + "doc/html/man3/ERR_GET_LIB.html" => [ + "doc/man3/ERR_GET_LIB.pod" + ], + "doc/html/man3/ERR_clear_error.html" => [ + "doc/man3/ERR_clear_error.pod" + ], + "doc/html/man3/ERR_error_string.html" => [ + "doc/man3/ERR_error_string.pod" + ], + "doc/html/man3/ERR_get_error.html" => [ + "doc/man3/ERR_get_error.pod" + ], + "doc/html/man3/ERR_load_crypto_strings.html" => [ + "doc/man3/ERR_load_crypto_strings.pod" + ], + "doc/html/man3/ERR_load_strings.html" => [ + "doc/man3/ERR_load_strings.pod" + ], + "doc/html/man3/ERR_new.html" => [ + "doc/man3/ERR_new.pod" + ], + "doc/html/man3/ERR_print_errors.html" => [ + "doc/man3/ERR_print_errors.pod" + ], + "doc/html/man3/ERR_put_error.html" => [ + "doc/man3/ERR_put_error.pod" + ], + "doc/html/man3/ERR_remove_state.html" => [ + "doc/man3/ERR_remove_state.pod" + ], + "doc/html/man3/ERR_set_mark.html" => [ + "doc/man3/ERR_set_mark.pod" + ], + "doc/html/man3/EVP_ASYM_CIPHER_free.html" => [ + "doc/man3/EVP_ASYM_CIPHER_free.pod" + ], + "doc/html/man3/EVP_BytesToKey.html" => [ + "doc/man3/EVP_BytesToKey.pod" + ], + "doc/html/man3/EVP_CIPHER_CTX_get_app_data.html" => [ + "doc/man3/EVP_CIPHER_CTX_get_app_data.pod" + ], + "doc/html/man3/EVP_CIPHER_CTX_get_cipher_data.html" => [ + "doc/man3/EVP_CIPHER_CTX_get_cipher_data.pod" + ], + "doc/html/man3/EVP_CIPHER_CTX_get_original_iv.html" => [ + "doc/man3/EVP_CIPHER_CTX_get_original_iv.pod" + ], + "doc/html/man3/EVP_CIPHER_meth_new.html" => [ + "doc/man3/EVP_CIPHER_meth_new.pod" + ], + "doc/html/man3/EVP_DigestInit.html" => [ + "doc/man3/EVP_DigestInit.pod" + ], + "doc/html/man3/EVP_DigestSignInit.html" => [ + "doc/man3/EVP_DigestSignInit.pod" + ], + "doc/html/man3/EVP_DigestVerifyInit.html" => [ + "doc/man3/EVP_DigestVerifyInit.pod" + ], + "doc/html/man3/EVP_EncodeInit.html" => [ + "doc/man3/EVP_EncodeInit.pod" + ], + "doc/html/man3/EVP_EncryptInit.html" => [ + "doc/man3/EVP_EncryptInit.pod" + ], + "doc/html/man3/EVP_KDF.html" => [ + "doc/man3/EVP_KDF.pod" + ], + "doc/html/man3/EVP_KEM_free.html" => [ + "doc/man3/EVP_KEM_free.pod" + ], + "doc/html/man3/EVP_KEYEXCH_free.html" => [ + "doc/man3/EVP_KEYEXCH_free.pod" + ], + "doc/html/man3/EVP_KEYMGMT.html" => [ + "doc/man3/EVP_KEYMGMT.pod" + ], + "doc/html/man3/EVP_MAC.html" => [ + "doc/man3/EVP_MAC.pod" + ], + "doc/html/man3/EVP_MD_meth_new.html" => [ + "doc/man3/EVP_MD_meth_new.pod" + ], + "doc/html/man3/EVP_OpenInit.html" => [ + "doc/man3/EVP_OpenInit.pod" + ], + "doc/html/man3/EVP_PBE_CipherInit.html" => [ + "doc/man3/EVP_PBE_CipherInit.pod" + ], + "doc/html/man3/EVP_PKEY2PKCS8.html" => [ + "doc/man3/EVP_PKEY2PKCS8.pod" + ], + "doc/html/man3/EVP_PKEY_ASN1_METHOD.html" => [ + "doc/man3/EVP_PKEY_ASN1_METHOD.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_ctrl.html" => [ + "doc/man3/EVP_PKEY_CTX_ctrl.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_get0_libctx.html" => [ + "doc/man3/EVP_PKEY_CTX_get0_libctx.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_get0_pkey.html" => [ + "doc/man3/EVP_PKEY_CTX_get0_pkey.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_get_algor.html" => [ + "doc/man3/EVP_PKEY_CTX_get_algor.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_new.html" => [ + "doc/man3/EVP_PKEY_CTX_new.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set1_pbe_pass.html" => [ + "doc/man3/EVP_PKEY_CTX_set1_pbe_pass.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_hkdf_md.html" => [ + "doc/man3/EVP_PKEY_CTX_set_hkdf_md.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_params.html" => [ + "doc/man3/EVP_PKEY_CTX_set_params.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.html" => [ + "doc/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_scrypt_N.html" => [ + "doc/man3/EVP_PKEY_CTX_set_scrypt_N.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_tls1_prf_md.html" => [ + "doc/man3/EVP_PKEY_CTX_set_tls1_prf_md.pod" + ], + "doc/html/man3/EVP_PKEY_asn1_get_count.html" => [ + "doc/man3/EVP_PKEY_asn1_get_count.pod" + ], + "doc/html/man3/EVP_PKEY_check.html" => [ + "doc/man3/EVP_PKEY_check.pod" + ], + "doc/html/man3/EVP_PKEY_copy_parameters.html" => [ + "doc/man3/EVP_PKEY_copy_parameters.pod" + ], + "doc/html/man3/EVP_PKEY_decapsulate.html" => [ + "doc/man3/EVP_PKEY_decapsulate.pod" + ], + "doc/html/man3/EVP_PKEY_decrypt.html" => [ + "doc/man3/EVP_PKEY_decrypt.pod" + ], + "doc/html/man3/EVP_PKEY_derive.html" => [ + "doc/man3/EVP_PKEY_derive.pod" + ], + "doc/html/man3/EVP_PKEY_digestsign_supports_digest.html" => [ + "doc/man3/EVP_PKEY_digestsign_supports_digest.pod" + ], + "doc/html/man3/EVP_PKEY_encapsulate.html" => [ + "doc/man3/EVP_PKEY_encapsulate.pod" + ], + "doc/html/man3/EVP_PKEY_encrypt.html" => [ + "doc/man3/EVP_PKEY_encrypt.pod" + ], + "doc/html/man3/EVP_PKEY_fromdata.html" => [ + "doc/man3/EVP_PKEY_fromdata.pod" + ], + "doc/html/man3/EVP_PKEY_get_attr.html" => [ + "doc/man3/EVP_PKEY_get_attr.pod" + ], + "doc/html/man3/EVP_PKEY_get_default_digest_nid.html" => [ + "doc/man3/EVP_PKEY_get_default_digest_nid.pod" + ], + "doc/html/man3/EVP_PKEY_get_field_type.html" => [ + "doc/man3/EVP_PKEY_get_field_type.pod" + ], + "doc/html/man3/EVP_PKEY_get_group_name.html" => [ + "doc/man3/EVP_PKEY_get_group_name.pod" + ], + "doc/html/man3/EVP_PKEY_get_size.html" => [ + "doc/man3/EVP_PKEY_get_size.pod" + ], + "doc/html/man3/EVP_PKEY_gettable_params.html" => [ + "doc/man3/EVP_PKEY_gettable_params.pod" + ], + "doc/html/man3/EVP_PKEY_is_a.html" => [ + "doc/man3/EVP_PKEY_is_a.pod" + ], + "doc/html/man3/EVP_PKEY_keygen.html" => [ + "doc/man3/EVP_PKEY_keygen.pod" + ], + "doc/html/man3/EVP_PKEY_meth_get_count.html" => [ + "doc/man3/EVP_PKEY_meth_get_count.pod" + ], + "doc/html/man3/EVP_PKEY_meth_new.html" => [ + "doc/man3/EVP_PKEY_meth_new.pod" + ], + "doc/html/man3/EVP_PKEY_new.html" => [ + "doc/man3/EVP_PKEY_new.pod" + ], + "doc/html/man3/EVP_PKEY_print_private.html" => [ + "doc/man3/EVP_PKEY_print_private.pod" + ], + "doc/html/man3/EVP_PKEY_set1_RSA.html" => [ + "doc/man3/EVP_PKEY_set1_RSA.pod" + ], + "doc/html/man3/EVP_PKEY_set1_encoded_public_key.html" => [ + "doc/man3/EVP_PKEY_set1_encoded_public_key.pod" + ], + "doc/html/man3/EVP_PKEY_set_type.html" => [ + "doc/man3/EVP_PKEY_set_type.pod" + ], + "doc/html/man3/EVP_PKEY_settable_params.html" => [ + "doc/man3/EVP_PKEY_settable_params.pod" + ], + "doc/html/man3/EVP_PKEY_sign.html" => [ + "doc/man3/EVP_PKEY_sign.pod" + ], + "doc/html/man3/EVP_PKEY_todata.html" => [ + "doc/man3/EVP_PKEY_todata.pod" + ], + "doc/html/man3/EVP_PKEY_verify.html" => [ + "doc/man3/EVP_PKEY_verify.pod" + ], + "doc/html/man3/EVP_PKEY_verify_recover.html" => [ + "doc/man3/EVP_PKEY_verify_recover.pod" + ], + "doc/html/man3/EVP_RAND.html" => [ + "doc/man3/EVP_RAND.pod" + ], + "doc/html/man3/EVP_SIGNATURE.html" => [ + "doc/man3/EVP_SIGNATURE.pod" + ], + "doc/html/man3/EVP_SKEY.html" => [ + "doc/man3/EVP_SKEY.pod" + ], + "doc/html/man3/EVP_SKEYMGMT.html" => [ + "doc/man3/EVP_SKEYMGMT.pod" + ], + "doc/html/man3/EVP_SealInit.html" => [ + "doc/man3/EVP_SealInit.pod" + ], + "doc/html/man3/EVP_SignInit.html" => [ + "doc/man3/EVP_SignInit.pod" + ], + "doc/html/man3/EVP_VerifyInit.html" => [ + "doc/man3/EVP_VerifyInit.pod" + ], + "doc/html/man3/EVP_aes_128_gcm.html" => [ + "doc/man3/EVP_aes_128_gcm.pod" + ], + "doc/html/man3/EVP_aria_128_gcm.html" => [ + "doc/man3/EVP_aria_128_gcm.pod" + ], + "doc/html/man3/EVP_bf_cbc.html" => [ + "doc/man3/EVP_bf_cbc.pod" + ], + "doc/html/man3/EVP_blake2b512.html" => [ + "doc/man3/EVP_blake2b512.pod" + ], + "doc/html/man3/EVP_camellia_128_ecb.html" => [ + "doc/man3/EVP_camellia_128_ecb.pod" + ], + "doc/html/man3/EVP_cast5_cbc.html" => [ + "doc/man3/EVP_cast5_cbc.pod" + ], + "doc/html/man3/EVP_chacha20.html" => [ + "doc/man3/EVP_chacha20.pod" + ], + "doc/html/man3/EVP_des_cbc.html" => [ + "doc/man3/EVP_des_cbc.pod" + ], + "doc/html/man3/EVP_desx_cbc.html" => [ + "doc/man3/EVP_desx_cbc.pod" + ], + "doc/html/man3/EVP_idea_cbc.html" => [ + "doc/man3/EVP_idea_cbc.pod" + ], + "doc/html/man3/EVP_md2.html" => [ + "doc/man3/EVP_md2.pod" + ], + "doc/html/man3/EVP_md4.html" => [ + "doc/man3/EVP_md4.pod" + ], + "doc/html/man3/EVP_md5.html" => [ + "doc/man3/EVP_md5.pod" + ], + "doc/html/man3/EVP_mdc2.html" => [ + "doc/man3/EVP_mdc2.pod" + ], + "doc/html/man3/EVP_rc2_cbc.html" => [ + "doc/man3/EVP_rc2_cbc.pod" + ], + "doc/html/man3/EVP_rc4.html" => [ + "doc/man3/EVP_rc4.pod" + ], + "doc/html/man3/EVP_rc5_32_12_16_cbc.html" => [ + "doc/man3/EVP_rc5_32_12_16_cbc.pod" + ], + "doc/html/man3/EVP_ripemd160.html" => [ + "doc/man3/EVP_ripemd160.pod" + ], + "doc/html/man3/EVP_seed_cbc.html" => [ + "doc/man3/EVP_seed_cbc.pod" + ], + "doc/html/man3/EVP_set_default_properties.html" => [ + "doc/man3/EVP_set_default_properties.pod" + ], + "doc/html/man3/EVP_sha1.html" => [ + "doc/man3/EVP_sha1.pod" + ], + "doc/html/man3/EVP_sha224.html" => [ + "doc/man3/EVP_sha224.pod" + ], + "doc/html/man3/EVP_sha3_224.html" => [ + "doc/man3/EVP_sha3_224.pod" + ], + "doc/html/man3/EVP_sm3.html" => [ + "doc/man3/EVP_sm3.pod" + ], + "doc/html/man3/EVP_sm4_cbc.html" => [ + "doc/man3/EVP_sm4_cbc.pod" + ], + "doc/html/man3/EVP_whirlpool.html" => [ + "doc/man3/EVP_whirlpool.pod" + ], + "doc/html/man3/GENERAL_NAME.html" => [ + "doc/man3/GENERAL_NAME.pod" + ], + "doc/html/man3/HMAC.html" => [ + "doc/man3/HMAC.pod" + ], + "doc/html/man3/MD5.html" => [ + "doc/man3/MD5.pod" + ], + "doc/html/man3/MDC2_Init.html" => [ + "doc/man3/MDC2_Init.pod" + ], + "doc/html/man3/NCONF_new_ex.html" => [ + "doc/man3/NCONF_new_ex.pod" + ], + "doc/html/man3/OBJ_nid2obj.html" => [ + "doc/man3/OBJ_nid2obj.pod" + ], + "doc/html/man3/OCSP_REQUEST_new.html" => [ + "doc/man3/OCSP_REQUEST_new.pod" + ], + "doc/html/man3/OCSP_cert_to_id.html" => [ + "doc/man3/OCSP_cert_to_id.pod" + ], + "doc/html/man3/OCSP_request_add1_nonce.html" => [ + "doc/man3/OCSP_request_add1_nonce.pod" + ], + "doc/html/man3/OCSP_resp_find_status.html" => [ + "doc/man3/OCSP_resp_find_status.pod" + ], + "doc/html/man3/OCSP_response_status.html" => [ + "doc/man3/OCSP_response_status.pod" + ], + "doc/html/man3/OCSP_sendreq_new.html" => [ + "doc/man3/OCSP_sendreq_new.pod" + ], + "doc/html/man3/OPENSSL_Applink.html" => [ + "doc/man3/OPENSSL_Applink.pod" + ], + "doc/html/man3/OPENSSL_FILE.html" => [ + "doc/man3/OPENSSL_FILE.pod" + ], + "doc/html/man3/OPENSSL_LH_COMPFUNC.html" => [ + "doc/man3/OPENSSL_LH_COMPFUNC.pod" + ], + "doc/html/man3/OPENSSL_LH_stats.html" => [ + "doc/man3/OPENSSL_LH_stats.pod" + ], + "doc/html/man3/OPENSSL_config.html" => [ + "doc/man3/OPENSSL_config.pod" + ], + "doc/html/man3/OPENSSL_fork_prepare.html" => [ + "doc/man3/OPENSSL_fork_prepare.pod" + ], + "doc/html/man3/OPENSSL_gmtime.html" => [ + "doc/man3/OPENSSL_gmtime.pod" + ], + "doc/html/man3/OPENSSL_hexchar2int.html" => [ + "doc/man3/OPENSSL_hexchar2int.pod" + ], + "doc/html/man3/OPENSSL_ia32cap.html" => [ + "doc/man3/OPENSSL_ia32cap.pod" + ], + "doc/html/man3/OPENSSL_init_crypto.html" => [ + "doc/man3/OPENSSL_init_crypto.pod" + ], + "doc/html/man3/OPENSSL_init_ssl.html" => [ + "doc/man3/OPENSSL_init_ssl.pod" + ], + "doc/html/man3/OPENSSL_instrument_bus.html" => [ + "doc/man3/OPENSSL_instrument_bus.pod" + ], + "doc/html/man3/OPENSSL_load_builtin_modules.html" => [ + "doc/man3/OPENSSL_load_builtin_modules.pod" + ], + "doc/html/man3/OPENSSL_load_u16_le.html" => [ + "doc/man3/OPENSSL_load_u16_le.pod" + ], + "doc/html/man3/OPENSSL_malloc.html" => [ + "doc/man3/OPENSSL_malloc.pod" + ], + "doc/html/man3/OPENSSL_ppccap.html" => [ + "doc/man3/OPENSSL_ppccap.pod" + ], + "doc/html/man3/OPENSSL_riscvcap.html" => [ + "doc/man3/OPENSSL_riscvcap.pod" + ], + "doc/html/man3/OPENSSL_s390xcap.html" => [ + "doc/man3/OPENSSL_s390xcap.pod" + ], + "doc/html/man3/OPENSSL_secure_malloc.html" => [ + "doc/man3/OPENSSL_secure_malloc.pod" + ], + "doc/html/man3/OPENSSL_strcasecmp.html" => [ + "doc/man3/OPENSSL_strcasecmp.pod" + ], + "doc/html/man3/OSSL_ALGORITHM.html" => [ + "doc/man3/OSSL_ALGORITHM.pod" + ], + "doc/html/man3/OSSL_CALLBACK.html" => [ + "doc/man3/OSSL_CALLBACK.pod" + ], + "doc/html/man3/OSSL_CMP_ATAV_set0.html" => [ + "doc/man3/OSSL_CMP_ATAV_set0.pod" + ], + "doc/html/man3/OSSL_CMP_CTX_new.html" => [ + "doc/man3/OSSL_CMP_CTX_new.pod" + ], + "doc/html/man3/OSSL_CMP_HDR_get0_transactionID.html" => [ + "doc/man3/OSSL_CMP_HDR_get0_transactionID.pod" + ], + "doc/html/man3/OSSL_CMP_ITAV_new_caCerts.html" => [ + "doc/man3/OSSL_CMP_ITAV_new_caCerts.pod" + ], + "doc/html/man3/OSSL_CMP_ITAV_set0.html" => [ + "doc/man3/OSSL_CMP_ITAV_set0.pod" + ], + "doc/html/man3/OSSL_CMP_MSG_get0_header.html" => [ + "doc/man3/OSSL_CMP_MSG_get0_header.pod" + ], + "doc/html/man3/OSSL_CMP_MSG_http_perform.html" => [ + "doc/man3/OSSL_CMP_MSG_http_perform.pod" + ], + "doc/html/man3/OSSL_CMP_SRV_CTX_new.html" => [ + "doc/man3/OSSL_CMP_SRV_CTX_new.pod" + ], + "doc/html/man3/OSSL_CMP_STATUSINFO_new.html" => [ + "doc/man3/OSSL_CMP_STATUSINFO_new.pod" + ], + "doc/html/man3/OSSL_CMP_exec_certreq.html" => [ + "doc/man3/OSSL_CMP_exec_certreq.pod" + ], + "doc/html/man3/OSSL_CMP_log_open.html" => [ + "doc/man3/OSSL_CMP_log_open.pod" + ], + "doc/html/man3/OSSL_CMP_validate_msg.html" => [ + "doc/man3/OSSL_CMP_validate_msg.pod" + ], + "doc/html/man3/OSSL_CORE_MAKE_FUNC.html" => [ + "doc/man3/OSSL_CORE_MAKE_FUNC.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_get0_tmpl.html" => [ + "doc/man3/OSSL_CRMF_MSG_get0_tmpl.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_set0_validity.html" => [ + "doc/man3/OSSL_CRMF_MSG_set0_validity.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.html" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.html" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.pod" + ], + "doc/html/man3/OSSL_CRMF_pbmp_new.html" => [ + "doc/man3/OSSL_CRMF_pbmp_new.pod" + ], + "doc/html/man3/OSSL_DECODER.html" => [ + "doc/man3/OSSL_DECODER.pod" + ], + "doc/html/man3/OSSL_DECODER_CTX.html" => [ + "doc/man3/OSSL_DECODER_CTX.pod" + ], + "doc/html/man3/OSSL_DECODER_CTX_new_for_pkey.html" => [ + "doc/man3/OSSL_DECODER_CTX_new_for_pkey.pod" + ], + "doc/html/man3/OSSL_DECODER_from_bio.html" => [ + "doc/man3/OSSL_DECODER_from_bio.pod" + ], + "doc/html/man3/OSSL_DISPATCH.html" => [ + "doc/man3/OSSL_DISPATCH.pod" + ], + "doc/html/man3/OSSL_ENCODER.html" => [ + "doc/man3/OSSL_ENCODER.pod" + ], + "doc/html/man3/OSSL_ENCODER_CTX.html" => [ + "doc/man3/OSSL_ENCODER_CTX.pod" + ], + "doc/html/man3/OSSL_ENCODER_CTX_new_for_pkey.html" => [ + "doc/man3/OSSL_ENCODER_CTX_new_for_pkey.pod" + ], + "doc/html/man3/OSSL_ENCODER_to_bio.html" => [ + "doc/man3/OSSL_ENCODER_to_bio.pod" + ], + "doc/html/man3/OSSL_ERR_STATE_save.html" => [ + "doc/man3/OSSL_ERR_STATE_save.pod" + ], + "doc/html/man3/OSSL_ESS_check_signing_certs.html" => [ + "doc/man3/OSSL_ESS_check_signing_certs.pod" + ], + "doc/html/man3/OSSL_GENERAL_NAMES_print.html" => [ + "doc/man3/OSSL_GENERAL_NAMES_print.pod" + ], + "doc/html/man3/OSSL_HPKE_CTX_new.html" => [ + "doc/man3/OSSL_HPKE_CTX_new.pod" + ], + "doc/html/man3/OSSL_HTTP_REQ_CTX.html" => [ + "doc/man3/OSSL_HTTP_REQ_CTX.pod" + ], + "doc/html/man3/OSSL_HTTP_parse_url.html" => [ + "doc/man3/OSSL_HTTP_parse_url.pod" + ], + "doc/html/man3/OSSL_HTTP_transfer.html" => [ + "doc/man3/OSSL_HTTP_transfer.pod" + ], + "doc/html/man3/OSSL_IETF_ATTR_SYNTAX.html" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX.pod" + ], + "doc/html/man3/OSSL_IETF_ATTR_SYNTAX_print.html" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX_print.pod" + ], + "doc/html/man3/OSSL_INDICATOR_set_callback.html" => [ + "doc/man3/OSSL_INDICATOR_set_callback.pod" + ], + "doc/html/man3/OSSL_ITEM.html" => [ + "doc/man3/OSSL_ITEM.pod" + ], + "doc/html/man3/OSSL_LIB_CTX.html" => [ + "doc/man3/OSSL_LIB_CTX.pod" + ], + "doc/html/man3/OSSL_LIB_CTX_set_conf_diagnostics.html" => [ + "doc/man3/OSSL_LIB_CTX_set_conf_diagnostics.pod" + ], + "doc/html/man3/OSSL_PARAM.html" => [ + "doc/man3/OSSL_PARAM.pod" + ], + "doc/html/man3/OSSL_PARAM_BLD.html" => [ + "doc/man3/OSSL_PARAM_BLD.pod" + ], + "doc/html/man3/OSSL_PARAM_allocate_from_text.html" => [ + "doc/man3/OSSL_PARAM_allocate_from_text.pod" + ], + "doc/html/man3/OSSL_PARAM_dup.html" => [ + "doc/man3/OSSL_PARAM_dup.pod" + ], + "doc/html/man3/OSSL_PARAM_int.html" => [ + "doc/man3/OSSL_PARAM_int.pod" + ], + "doc/html/man3/OSSL_PARAM_print_to_bio.html" => [ + "doc/man3/OSSL_PARAM_print_to_bio.pod" + ], + "doc/html/man3/OSSL_PROVIDER.html" => [ + "doc/man3/OSSL_PROVIDER.pod" + ], + "doc/html/man3/OSSL_QUIC_client_method.html" => [ + "doc/man3/OSSL_QUIC_client_method.pod" + ], + "doc/html/man3/OSSL_SELF_TEST_new.html" => [ + "doc/man3/OSSL_SELF_TEST_new.pod" + ], + "doc/html/man3/OSSL_SELF_TEST_set_callback.html" => [ + "doc/man3/OSSL_SELF_TEST_set_callback.pod" + ], + "doc/html/man3/OSSL_STORE_INFO.html" => [ + "doc/man3/OSSL_STORE_INFO.pod" + ], + "doc/html/man3/OSSL_STORE_LOADER.html" => [ + "doc/man3/OSSL_STORE_LOADER.pod" + ], + "doc/html/man3/OSSL_STORE_SEARCH.html" => [ + "doc/man3/OSSL_STORE_SEARCH.pod" + ], + "doc/html/man3/OSSL_STORE_attach.html" => [ + "doc/man3/OSSL_STORE_attach.pod" + ], + "doc/html/man3/OSSL_STORE_expect.html" => [ + "doc/man3/OSSL_STORE_expect.pod" + ], + "doc/html/man3/OSSL_STORE_open.html" => [ + "doc/man3/OSSL_STORE_open.pod" + ], + "doc/html/man3/OSSL_sleep.html" => [ + "doc/man3/OSSL_sleep.pod" + ], + "doc/html/man3/OSSL_trace_enabled.html" => [ + "doc/man3/OSSL_trace_enabled.pod" + ], + "doc/html/man3/OSSL_trace_get_category_num.html" => [ + "doc/man3/OSSL_trace_get_category_num.pod" + ], + "doc/html/man3/OSSL_trace_set_channel.html" => [ + "doc/man3/OSSL_trace_set_channel.pod" + ], + "doc/html/man3/OpenSSL_add_all_algorithms.html" => [ + "doc/man3/OpenSSL_add_all_algorithms.pod" + ], + "doc/html/man3/OpenSSL_version.html" => [ + "doc/man3/OpenSSL_version.pod" + ], + "doc/html/man3/PBMAC1_get1_pbkdf2_param.html" => [ + "doc/man3/PBMAC1_get1_pbkdf2_param.pod" + ], + "doc/html/man3/PEM_X509_INFO_read_bio_ex.html" => [ + "doc/man3/PEM_X509_INFO_read_bio_ex.pod" + ], + "doc/html/man3/PEM_bytes_read_bio.html" => [ + "doc/man3/PEM_bytes_read_bio.pod" + ], + "doc/html/man3/PEM_read.html" => [ + "doc/man3/PEM_read.pod" + ], + "doc/html/man3/PEM_read_CMS.html" => [ + "doc/man3/PEM_read_CMS.pod" + ], + "doc/html/man3/PEM_read_bio_PrivateKey.html" => [ + "doc/man3/PEM_read_bio_PrivateKey.pod" + ], + "doc/html/man3/PEM_read_bio_ex.html" => [ + "doc/man3/PEM_read_bio_ex.pod" + ], + "doc/html/man3/PEM_write_bio_CMS_stream.html" => [ + "doc/man3/PEM_write_bio_CMS_stream.pod" + ], + "doc/html/man3/PEM_write_bio_PKCS7_stream.html" => [ + "doc/man3/PEM_write_bio_PKCS7_stream.pod" + ], + "doc/html/man3/PKCS12_PBE_keyivgen.html" => [ + "doc/man3/PKCS12_PBE_keyivgen.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_create_cert.html" => [ + "doc/man3/PKCS12_SAFEBAG_create_cert.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_get0_attrs.html" => [ + "doc/man3/PKCS12_SAFEBAG_get0_attrs.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_get1_cert.html" => [ + "doc/man3/PKCS12_SAFEBAG_get1_cert.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_set0_attrs.html" => [ + "doc/man3/PKCS12_SAFEBAG_set0_attrs.pod" + ], + "doc/html/man3/PKCS12_add1_attr_by_NID.html" => [ + "doc/man3/PKCS12_add1_attr_by_NID.pod" + ], + "doc/html/man3/PKCS12_add_CSPName_asc.html" => [ + "doc/man3/PKCS12_add_CSPName_asc.pod" + ], + "doc/html/man3/PKCS12_add_cert.html" => [ + "doc/man3/PKCS12_add_cert.pod" + ], + "doc/html/man3/PKCS12_add_friendlyname_asc.html" => [ + "doc/man3/PKCS12_add_friendlyname_asc.pod" + ], + "doc/html/man3/PKCS12_add_localkeyid.html" => [ + "doc/man3/PKCS12_add_localkeyid.pod" + ], + "doc/html/man3/PKCS12_add_safe.html" => [ + "doc/man3/PKCS12_add_safe.pod" + ], + "doc/html/man3/PKCS12_create.html" => [ + "doc/man3/PKCS12_create.pod" + ], + "doc/html/man3/PKCS12_decrypt_skey.html" => [ + "doc/man3/PKCS12_decrypt_skey.pod" + ], + "doc/html/man3/PKCS12_gen_mac.html" => [ + "doc/man3/PKCS12_gen_mac.pod" + ], + "doc/html/man3/PKCS12_get_friendlyname.html" => [ + "doc/man3/PKCS12_get_friendlyname.pod" + ], + "doc/html/man3/PKCS12_init.html" => [ + "doc/man3/PKCS12_init.pod" + ], + "doc/html/man3/PKCS12_item_decrypt_d2i.html" => [ + "doc/man3/PKCS12_item_decrypt_d2i.pod" + ], + "doc/html/man3/PKCS12_key_gen_utf8_ex.html" => [ + "doc/man3/PKCS12_key_gen_utf8_ex.pod" + ], + "doc/html/man3/PKCS12_newpass.html" => [ + "doc/man3/PKCS12_newpass.pod" + ], + "doc/html/man3/PKCS12_pack_p7encdata.html" => [ + "doc/man3/PKCS12_pack_p7encdata.pod" + ], + "doc/html/man3/PKCS12_parse.html" => [ + "doc/man3/PKCS12_parse.pod" + ], + "doc/html/man3/PKCS5_PBE_keyivgen.html" => [ + "doc/man3/PKCS5_PBE_keyivgen.pod" + ], + "doc/html/man3/PKCS5_PBKDF2_HMAC.html" => [ + "doc/man3/PKCS5_PBKDF2_HMAC.pod" + ], + "doc/html/man3/PKCS7_decrypt.html" => [ + "doc/man3/PKCS7_decrypt.pod" + ], + "doc/html/man3/PKCS7_encrypt.html" => [ + "doc/man3/PKCS7_encrypt.pod" + ], + "doc/html/man3/PKCS7_get_octet_string.html" => [ + "doc/man3/PKCS7_get_octet_string.pod" + ], + "doc/html/man3/PKCS7_sign.html" => [ + "doc/man3/PKCS7_sign.pod" + ], + "doc/html/man3/PKCS7_sign_add_signer.html" => [ + "doc/man3/PKCS7_sign_add_signer.pod" + ], + "doc/html/man3/PKCS7_type_is_other.html" => [ + "doc/man3/PKCS7_type_is_other.pod" + ], + "doc/html/man3/PKCS7_verify.html" => [ + "doc/man3/PKCS7_verify.pod" + ], + "doc/html/man3/PKCS8_encrypt.html" => [ + "doc/man3/PKCS8_encrypt.pod" + ], + "doc/html/man3/PKCS8_pkey_add1_attr.html" => [ + "doc/man3/PKCS8_pkey_add1_attr.pod" + ], + "doc/html/man3/RAND_add.html" => [ + "doc/man3/RAND_add.pod" + ], + "doc/html/man3/RAND_bytes.html" => [ + "doc/man3/RAND_bytes.pod" + ], + "doc/html/man3/RAND_cleanup.html" => [ + "doc/man3/RAND_cleanup.pod" + ], + "doc/html/man3/RAND_egd.html" => [ + "doc/man3/RAND_egd.pod" + ], + "doc/html/man3/RAND_get0_primary.html" => [ + "doc/man3/RAND_get0_primary.pod" + ], + "doc/html/man3/RAND_load_file.html" => [ + "doc/man3/RAND_load_file.pod" + ], + "doc/html/man3/RAND_set_DRBG_type.html" => [ + "doc/man3/RAND_set_DRBG_type.pod" + ], + "doc/html/man3/RAND_set_rand_method.html" => [ + "doc/man3/RAND_set_rand_method.pod" + ], + "doc/html/man3/RC4_set_key.html" => [ + "doc/man3/RC4_set_key.pod" + ], + "doc/html/man3/RIPEMD160_Init.html" => [ + "doc/man3/RIPEMD160_Init.pod" + ], + "doc/html/man3/RSA_blinding_on.html" => [ + "doc/man3/RSA_blinding_on.pod" + ], + "doc/html/man3/RSA_check_key.html" => [ + "doc/man3/RSA_check_key.pod" + ], + "doc/html/man3/RSA_generate_key.html" => [ + "doc/man3/RSA_generate_key.pod" + ], + "doc/html/man3/RSA_get0_key.html" => [ + "doc/man3/RSA_get0_key.pod" + ], + "doc/html/man3/RSA_meth_new.html" => [ + "doc/man3/RSA_meth_new.pod" + ], + "doc/html/man3/RSA_new.html" => [ + "doc/man3/RSA_new.pod" + ], + "doc/html/man3/RSA_padding_add_PKCS1_type_1.html" => [ + "doc/man3/RSA_padding_add_PKCS1_type_1.pod" + ], + "doc/html/man3/RSA_print.html" => [ + "doc/man3/RSA_print.pod" + ], + "doc/html/man3/RSA_private_encrypt.html" => [ + "doc/man3/RSA_private_encrypt.pod" + ], + "doc/html/man3/RSA_public_encrypt.html" => [ + "doc/man3/RSA_public_encrypt.pod" + ], + "doc/html/man3/RSA_set_method.html" => [ + "doc/man3/RSA_set_method.pod" + ], + "doc/html/man3/RSA_sign.html" => [ + "doc/man3/RSA_sign.pod" + ], + "doc/html/man3/RSA_sign_ASN1_OCTET_STRING.html" => [ + "doc/man3/RSA_sign_ASN1_OCTET_STRING.pod" + ], + "doc/html/man3/RSA_size.html" => [ + "doc/man3/RSA_size.pod" + ], + "doc/html/man3/SCT_new.html" => [ + "doc/man3/SCT_new.pod" + ], + "doc/html/man3/SCT_print.html" => [ + "doc/man3/SCT_print.pod" + ], + "doc/html/man3/SCT_validate.html" => [ + "doc/man3/SCT_validate.pod" + ], + "doc/html/man3/SHA256_Init.html" => [ + "doc/man3/SHA256_Init.pod" + ], + "doc/html/man3/SMIME_read_ASN1.html" => [ + "doc/man3/SMIME_read_ASN1.pod" + ], + "doc/html/man3/SMIME_read_CMS.html" => [ + "doc/man3/SMIME_read_CMS.pod" + ], + "doc/html/man3/SMIME_read_PKCS7.html" => [ + "doc/man3/SMIME_read_PKCS7.pod" + ], + "doc/html/man3/SMIME_write_ASN1.html" => [ + "doc/man3/SMIME_write_ASN1.pod" + ], + "doc/html/man3/SMIME_write_CMS.html" => [ + "doc/man3/SMIME_write_CMS.pod" + ], + "doc/html/man3/SMIME_write_PKCS7.html" => [ + "doc/man3/SMIME_write_PKCS7.pod" + ], + "doc/html/man3/SRP_Calc_B.html" => [ + "doc/man3/SRP_Calc_B.pod" + ], + "doc/html/man3/SRP_VBASE_new.html" => [ + "doc/man3/SRP_VBASE_new.pod" + ], + "doc/html/man3/SRP_create_verifier.html" => [ + "doc/man3/SRP_create_verifier.pod" + ], + "doc/html/man3/SRP_user_pwd_new.html" => [ + "doc/man3/SRP_user_pwd_new.pod" + ], + "doc/html/man3/SSL_CIPHER_get_name.html" => [ + "doc/man3/SSL_CIPHER_get_name.pod" + ], + "doc/html/man3/SSL_COMP_add_compression_method.html" => [ + "doc/man3/SSL_COMP_add_compression_method.pod" + ], + "doc/html/man3/SSL_CONF_CTX_new.html" => [ + "doc/man3/SSL_CONF_CTX_new.pod" + ], + "doc/html/man3/SSL_CONF_CTX_set1_prefix.html" => [ + "doc/man3/SSL_CONF_CTX_set1_prefix.pod" + ], + "doc/html/man3/SSL_CONF_CTX_set_flags.html" => [ + "doc/man3/SSL_CONF_CTX_set_flags.pod" + ], + "doc/html/man3/SSL_CONF_CTX_set_ssl_ctx.html" => [ + "doc/man3/SSL_CONF_CTX_set_ssl_ctx.pod" + ], + "doc/html/man3/SSL_CONF_cmd.html" => [ + "doc/man3/SSL_CONF_cmd.pod" + ], + "doc/html/man3/SSL_CONF_cmd_argv.html" => [ + "doc/man3/SSL_CONF_cmd_argv.pod" + ], + "doc/html/man3/SSL_CTX_add1_chain_cert.html" => [ + "doc/man3/SSL_CTX_add1_chain_cert.pod" + ], + "doc/html/man3/SSL_CTX_add_extra_chain_cert.html" => [ + "doc/man3/SSL_CTX_add_extra_chain_cert.pod" + ], + "doc/html/man3/SSL_CTX_add_session.html" => [ + "doc/man3/SSL_CTX_add_session.pod" + ], + "doc/html/man3/SSL_CTX_config.html" => [ + "doc/man3/SSL_CTX_config.pod" + ], + "doc/html/man3/SSL_CTX_ctrl.html" => [ + "doc/man3/SSL_CTX_ctrl.pod" + ], + "doc/html/man3/SSL_CTX_dane_enable.html" => [ + "doc/man3/SSL_CTX_dane_enable.pod" + ], + "doc/html/man3/SSL_CTX_flush_sessions.html" => [ + "doc/man3/SSL_CTX_flush_sessions.pod" + ], + "doc/html/man3/SSL_CTX_free.html" => [ + "doc/man3/SSL_CTX_free.pod" + ], + "doc/html/man3/SSL_CTX_get0_param.html" => [ + "doc/man3/SSL_CTX_get0_param.pod" + ], + "doc/html/man3/SSL_CTX_get_verify_mode.html" => [ + "doc/man3/SSL_CTX_get_verify_mode.pod" + ], + "doc/html/man3/SSL_CTX_has_client_custom_ext.html" => [ + "doc/man3/SSL_CTX_has_client_custom_ext.pod" + ], + "doc/html/man3/SSL_CTX_load_verify_locations.html" => [ + "doc/man3/SSL_CTX_load_verify_locations.pod" + ], + "doc/html/man3/SSL_CTX_new.html" => [ + "doc/man3/SSL_CTX_new.pod" + ], + "doc/html/man3/SSL_CTX_sess_number.html" => [ + "doc/man3/SSL_CTX_sess_number.pod" + ], + "doc/html/man3/SSL_CTX_sess_set_cache_size.html" => [ + "doc/man3/SSL_CTX_sess_set_cache_size.pod" + ], + "doc/html/man3/SSL_CTX_sess_set_get_cb.html" => [ + "doc/man3/SSL_CTX_sess_set_get_cb.pod" + ], + "doc/html/man3/SSL_CTX_sessions.html" => [ + "doc/man3/SSL_CTX_sessions.pod" + ], + "doc/html/man3/SSL_CTX_set0_CA_list.html" => [ + "doc/man3/SSL_CTX_set0_CA_list.pod" + ], + "doc/html/man3/SSL_CTX_set1_cert_comp_preference.html" => [ + "doc/man3/SSL_CTX_set1_cert_comp_preference.pod" + ], + "doc/html/man3/SSL_CTX_set1_curves.html" => [ + "doc/man3/SSL_CTX_set1_curves.pod" + ], + "doc/html/man3/SSL_CTX_set1_sigalgs.html" => [ + "doc/man3/SSL_CTX_set1_sigalgs.pod" + ], + "doc/html/man3/SSL_CTX_set1_verify_cert_store.html" => [ + "doc/man3/SSL_CTX_set1_verify_cert_store.pod" + ], + "doc/html/man3/SSL_CTX_set_alpn_select_cb.html" => [ + "doc/man3/SSL_CTX_set_alpn_select_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_cert_cb.html" => [ + "doc/man3/SSL_CTX_set_cert_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_cert_store.html" => [ + "doc/man3/SSL_CTX_set_cert_store.pod" + ], + "doc/html/man3/SSL_CTX_set_cert_verify_callback.html" => [ + "doc/man3/SSL_CTX_set_cert_verify_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_cipher_list.html" => [ + "doc/man3/SSL_CTX_set_cipher_list.pod" + ], + "doc/html/man3/SSL_CTX_set_client_cert_cb.html" => [ + "doc/man3/SSL_CTX_set_client_cert_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_client_hello_cb.html" => [ + "doc/man3/SSL_CTX_set_client_hello_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_ct_validation_callback.html" => [ + "doc/man3/SSL_CTX_set_ct_validation_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_ctlog_list_file.html" => [ + "doc/man3/SSL_CTX_set_ctlog_list_file.pod" + ], + "doc/html/man3/SSL_CTX_set_default_passwd_cb.html" => [ + "doc/man3/SSL_CTX_set_default_passwd_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_domain_flags.html" => [ + "doc/man3/SSL_CTX_set_domain_flags.pod" + ], + "doc/html/man3/SSL_CTX_set_generate_session_id.html" => [ + "doc/man3/SSL_CTX_set_generate_session_id.pod" + ], + "doc/html/man3/SSL_CTX_set_info_callback.html" => [ + "doc/man3/SSL_CTX_set_info_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_keylog_callback.html" => [ + "doc/man3/SSL_CTX_set_keylog_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_max_cert_list.html" => [ + "doc/man3/SSL_CTX_set_max_cert_list.pod" + ], + "doc/html/man3/SSL_CTX_set_min_proto_version.html" => [ + "doc/man3/SSL_CTX_set_min_proto_version.pod" + ], + "doc/html/man3/SSL_CTX_set_mode.html" => [ + "doc/man3/SSL_CTX_set_mode.pod" + ], + "doc/html/man3/SSL_CTX_set_msg_callback.html" => [ + "doc/man3/SSL_CTX_set_msg_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_new_pending_conn_cb.html" => [ + "doc/man3/SSL_CTX_set_new_pending_conn_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_num_tickets.html" => [ + "doc/man3/SSL_CTX_set_num_tickets.pod" + ], + "doc/html/man3/SSL_CTX_set_options.html" => [ + "doc/man3/SSL_CTX_set_options.pod" + ], + "doc/html/man3/SSL_CTX_set_psk_client_callback.html" => [ + "doc/man3/SSL_CTX_set_psk_client_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_quiet_shutdown.html" => [ + "doc/man3/SSL_CTX_set_quiet_shutdown.pod" + ], + "doc/html/man3/SSL_CTX_set_read_ahead.html" => [ + "doc/man3/SSL_CTX_set_read_ahead.pod" + ], + "doc/html/man3/SSL_CTX_set_record_padding_callback.html" => [ + "doc/man3/SSL_CTX_set_record_padding_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_security_level.html" => [ + "doc/man3/SSL_CTX_set_security_level.pod" + ], + "doc/html/man3/SSL_CTX_set_session_cache_mode.html" => [ + "doc/man3/SSL_CTX_set_session_cache_mode.pod" + ], + "doc/html/man3/SSL_CTX_set_session_id_context.html" => [ + "doc/man3/SSL_CTX_set_session_id_context.pod" + ], + "doc/html/man3/SSL_CTX_set_session_ticket_cb.html" => [ + "doc/man3/SSL_CTX_set_session_ticket_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_split_send_fragment.html" => [ + "doc/man3/SSL_CTX_set_split_send_fragment.pod" + ], + "doc/html/man3/SSL_CTX_set_srp_password.html" => [ + "doc/man3/SSL_CTX_set_srp_password.pod" + ], + "doc/html/man3/SSL_CTX_set_ssl_version.html" => [ + "doc/man3/SSL_CTX_set_ssl_version.pod" + ], + "doc/html/man3/SSL_CTX_set_stateless_cookie_generate_cb.html" => [ + "doc/man3/SSL_CTX_set_stateless_cookie_generate_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_timeout.html" => [ + "doc/man3/SSL_CTX_set_timeout.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_servername_callback.html" => [ + "doc/man3/SSL_CTX_set_tlsext_servername_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_status_cb.html" => [ + "doc/man3/SSL_CTX_set_tlsext_status_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_ticket_key_cb.html" => [ + "doc/man3/SSL_CTX_set_tlsext_ticket_key_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_use_srtp.html" => [ + "doc/man3/SSL_CTX_set_tlsext_use_srtp.pod" + ], + "doc/html/man3/SSL_CTX_set_tmp_dh_callback.html" => [ + "doc/man3/SSL_CTX_set_tmp_dh_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_tmp_ecdh.html" => [ + "doc/man3/SSL_CTX_set_tmp_ecdh.pod" + ], + "doc/html/man3/SSL_CTX_set_verify.html" => [ + "doc/man3/SSL_CTX_set_verify.pod" + ], + "doc/html/man3/SSL_CTX_use_certificate.html" => [ + "doc/man3/SSL_CTX_use_certificate.pod" + ], + "doc/html/man3/SSL_CTX_use_psk_identity_hint.html" => [ + "doc/man3/SSL_CTX_use_psk_identity_hint.pod" + ], + "doc/html/man3/SSL_CTX_use_serverinfo.html" => [ + "doc/man3/SSL_CTX_use_serverinfo.pod" + ], + "doc/html/man3/SSL_SESSION_free.html" => [ + "doc/man3/SSL_SESSION_free.pod" + ], + "doc/html/man3/SSL_SESSION_get0_cipher.html" => [ + "doc/man3/SSL_SESSION_get0_cipher.pod" + ], + "doc/html/man3/SSL_SESSION_get0_hostname.html" => [ + "doc/man3/SSL_SESSION_get0_hostname.pod" + ], + "doc/html/man3/SSL_SESSION_get0_id_context.html" => [ + "doc/man3/SSL_SESSION_get0_id_context.pod" + ], + "doc/html/man3/SSL_SESSION_get0_peer.html" => [ + "doc/man3/SSL_SESSION_get0_peer.pod" + ], + "doc/html/man3/SSL_SESSION_get_compress_id.html" => [ + "doc/man3/SSL_SESSION_get_compress_id.pod" + ], + "doc/html/man3/SSL_SESSION_get_protocol_version.html" => [ + "doc/man3/SSL_SESSION_get_protocol_version.pod" + ], + "doc/html/man3/SSL_SESSION_get_time.html" => [ + "doc/man3/SSL_SESSION_get_time.pod" + ], + "doc/html/man3/SSL_SESSION_has_ticket.html" => [ + "doc/man3/SSL_SESSION_has_ticket.pod" + ], + "doc/html/man3/SSL_SESSION_is_resumable.html" => [ + "doc/man3/SSL_SESSION_is_resumable.pod" + ], + "doc/html/man3/SSL_SESSION_print.html" => [ + "doc/man3/SSL_SESSION_print.pod" + ], + "doc/html/man3/SSL_SESSION_set1_id.html" => [ + "doc/man3/SSL_SESSION_set1_id.pod" + ], + "doc/html/man3/SSL_accept.html" => [ + "doc/man3/SSL_accept.pod" + ], + "doc/html/man3/SSL_accept_stream.html" => [ + "doc/man3/SSL_accept_stream.pod" + ], + "doc/html/man3/SSL_alert_type_string.html" => [ + "doc/man3/SSL_alert_type_string.pod" + ], + "doc/html/man3/SSL_alloc_buffers.html" => [ + "doc/man3/SSL_alloc_buffers.pod" + ], + "doc/html/man3/SSL_check_chain.html" => [ + "doc/man3/SSL_check_chain.pod" + ], + "doc/html/man3/SSL_clear.html" => [ + "doc/man3/SSL_clear.pod" + ], + "doc/html/man3/SSL_connect.html" => [ + "doc/man3/SSL_connect.pod" + ], + "doc/html/man3/SSL_do_handshake.html" => [ + "doc/man3/SSL_do_handshake.pod" + ], + "doc/html/man3/SSL_export_keying_material.html" => [ + "doc/man3/SSL_export_keying_material.pod" + ], + "doc/html/man3/SSL_extension_supported.html" => [ + "doc/man3/SSL_extension_supported.pod" + ], + "doc/html/man3/SSL_free.html" => [ + "doc/man3/SSL_free.pod" + ], + "doc/html/man3/SSL_get0_connection.html" => [ + "doc/man3/SSL_get0_connection.pod" + ], + "doc/html/man3/SSL_get0_group_name.html" => [ + "doc/man3/SSL_get0_group_name.pod" + ], + "doc/html/man3/SSL_get0_peer_rpk.html" => [ + "doc/man3/SSL_get0_peer_rpk.pod" + ], + "doc/html/man3/SSL_get0_peer_scts.html" => [ + "doc/man3/SSL_get0_peer_scts.pod" + ], + "doc/html/man3/SSL_get1_builtin_sigalgs.html" => [ + "doc/man3/SSL_get1_builtin_sigalgs.pod" + ], + "doc/html/man3/SSL_get_SSL_CTX.html" => [ + "doc/man3/SSL_get_SSL_CTX.pod" + ], + "doc/html/man3/SSL_get_all_async_fds.html" => [ + "doc/man3/SSL_get_all_async_fds.pod" + ], + "doc/html/man3/SSL_get_certificate.html" => [ + "doc/man3/SSL_get_certificate.pod" + ], + "doc/html/man3/SSL_get_ciphers.html" => [ + "doc/man3/SSL_get_ciphers.pod" + ], + "doc/html/man3/SSL_get_client_random.html" => [ + "doc/man3/SSL_get_client_random.pod" + ], + "doc/html/man3/SSL_get_conn_close_info.html" => [ + "doc/man3/SSL_get_conn_close_info.pod" + ], + "doc/html/man3/SSL_get_current_cipher.html" => [ + "doc/man3/SSL_get_current_cipher.pod" + ], + "doc/html/man3/SSL_get_default_timeout.html" => [ + "doc/man3/SSL_get_default_timeout.pod" + ], + "doc/html/man3/SSL_get_error.html" => [ + "doc/man3/SSL_get_error.pod" + ], + "doc/html/man3/SSL_get_event_timeout.html" => [ + "doc/man3/SSL_get_event_timeout.pod" + ], + "doc/html/man3/SSL_get_extms_support.html" => [ + "doc/man3/SSL_get_extms_support.pod" + ], + "doc/html/man3/SSL_get_fd.html" => [ + "doc/man3/SSL_get_fd.pod" + ], + "doc/html/man3/SSL_get_handshake_rtt.html" => [ + "doc/man3/SSL_get_handshake_rtt.pod" + ], + "doc/html/man3/SSL_get_peer_cert_chain.html" => [ + "doc/man3/SSL_get_peer_cert_chain.pod" + ], + "doc/html/man3/SSL_get_peer_certificate.html" => [ + "doc/man3/SSL_get_peer_certificate.pod" + ], + "doc/html/man3/SSL_get_peer_signature_nid.html" => [ + "doc/man3/SSL_get_peer_signature_nid.pod" + ], + "doc/html/man3/SSL_get_peer_tmp_key.html" => [ + "doc/man3/SSL_get_peer_tmp_key.pod" + ], + "doc/html/man3/SSL_get_psk_identity.html" => [ + "doc/man3/SSL_get_psk_identity.pod" + ], + "doc/html/man3/SSL_get_rbio.html" => [ + "doc/man3/SSL_get_rbio.pod" + ], + "doc/html/man3/SSL_get_rpoll_descriptor.html" => [ + "doc/man3/SSL_get_rpoll_descriptor.pod" + ], + "doc/html/man3/SSL_get_session.html" => [ + "doc/man3/SSL_get_session.pod" + ], + "doc/html/man3/SSL_get_shared_sigalgs.html" => [ + "doc/man3/SSL_get_shared_sigalgs.pod" + ], + "doc/html/man3/SSL_get_stream_id.html" => [ + "doc/man3/SSL_get_stream_id.pod" + ], + "doc/html/man3/SSL_get_stream_read_state.html" => [ + "doc/man3/SSL_get_stream_read_state.pod" + ], + "doc/html/man3/SSL_get_value_uint.html" => [ + "doc/man3/SSL_get_value_uint.pod" + ], + "doc/html/man3/SSL_get_verify_result.html" => [ + "doc/man3/SSL_get_verify_result.pod" + ], + "doc/html/man3/SSL_get_version.html" => [ + "doc/man3/SSL_get_version.pod" + ], + "doc/html/man3/SSL_group_to_name.html" => [ + "doc/man3/SSL_group_to_name.pod" + ], + "doc/html/man3/SSL_handle_events.html" => [ + "doc/man3/SSL_handle_events.pod" + ], + "doc/html/man3/SSL_in_init.html" => [ + "doc/man3/SSL_in_init.pod" + ], + "doc/html/man3/SSL_inject_net_dgram.html" => [ + "doc/man3/SSL_inject_net_dgram.pod" + ], + "doc/html/man3/SSL_key_update.html" => [ + "doc/man3/SSL_key_update.pod" + ], + "doc/html/man3/SSL_library_init.html" => [ + "doc/man3/SSL_library_init.pod" + ], + "doc/html/man3/SSL_load_client_CA_file.html" => [ + "doc/man3/SSL_load_client_CA_file.pod" + ], + "doc/html/man3/SSL_new.html" => [ + "doc/man3/SSL_new.pod" + ], + "doc/html/man3/SSL_new_domain.html" => [ + "doc/man3/SSL_new_domain.pod" + ], + "doc/html/man3/SSL_new_listener.html" => [ + "doc/man3/SSL_new_listener.pod" + ], + "doc/html/man3/SSL_new_stream.html" => [ + "doc/man3/SSL_new_stream.pod" + ], + "doc/html/man3/SSL_pending.html" => [ + "doc/man3/SSL_pending.pod" + ], + "doc/html/man3/SSL_poll.html" => [ + "doc/man3/SSL_poll.pod" + ], + "doc/html/man3/SSL_read.html" => [ + "doc/man3/SSL_read.pod" + ], + "doc/html/man3/SSL_read_early_data.html" => [ + "doc/man3/SSL_read_early_data.pod" + ], + "doc/html/man3/SSL_rstate_string.html" => [ + "doc/man3/SSL_rstate_string.pod" + ], + "doc/html/man3/SSL_session_reused.html" => [ + "doc/man3/SSL_session_reused.pod" + ], + "doc/html/man3/SSL_set1_host.html" => [ + "doc/man3/SSL_set1_host.pod" + ], + "doc/html/man3/SSL_set1_initial_peer_addr.html" => [ + "doc/man3/SSL_set1_initial_peer_addr.pod" + ], + "doc/html/man3/SSL_set1_server_cert_type.html" => [ + "doc/man3/SSL_set1_server_cert_type.pod" + ], + "doc/html/man3/SSL_set_async_callback.html" => [ + "doc/man3/SSL_set_async_callback.pod" + ], + "doc/html/man3/SSL_set_bio.html" => [ + "doc/man3/SSL_set_bio.pod" + ], + "doc/html/man3/SSL_set_blocking_mode.html" => [ + "doc/man3/SSL_set_blocking_mode.pod" + ], + "doc/html/man3/SSL_set_connect_state.html" => [ + "doc/man3/SSL_set_connect_state.pod" + ], + "doc/html/man3/SSL_set_default_stream_mode.html" => [ + "doc/man3/SSL_set_default_stream_mode.pod" + ], + "doc/html/man3/SSL_set_fd.html" => [ + "doc/man3/SSL_set_fd.pod" + ], + "doc/html/man3/SSL_set_incoming_stream_policy.html" => [ + "doc/man3/SSL_set_incoming_stream_policy.pod" + ], + "doc/html/man3/SSL_set_quic_tls_cbs.html" => [ + "doc/man3/SSL_set_quic_tls_cbs.pod" + ], + "doc/html/man3/SSL_set_retry_verify.html" => [ + "doc/man3/SSL_set_retry_verify.pod" + ], + "doc/html/man3/SSL_set_session.html" => [ + "doc/man3/SSL_set_session.pod" + ], + "doc/html/man3/SSL_set_session_secret_cb.html" => [ + "doc/man3/SSL_set_session_secret_cb.pod" + ], + "doc/html/man3/SSL_set_shutdown.html" => [ + "doc/man3/SSL_set_shutdown.pod" + ], + "doc/html/man3/SSL_set_verify_result.html" => [ + "doc/man3/SSL_set_verify_result.pod" + ], + "doc/html/man3/SSL_shutdown.html" => [ + "doc/man3/SSL_shutdown.pod" + ], + "doc/html/man3/SSL_state_string.html" => [ + "doc/man3/SSL_state_string.pod" + ], + "doc/html/man3/SSL_stream_conclude.html" => [ + "doc/man3/SSL_stream_conclude.pod" + ], + "doc/html/man3/SSL_stream_reset.html" => [ + "doc/man3/SSL_stream_reset.pod" + ], + "doc/html/man3/SSL_want.html" => [ + "doc/man3/SSL_want.pod" + ], + "doc/html/man3/SSL_write.html" => [ + "doc/man3/SSL_write.pod" + ], + "doc/html/man3/TS_RESP_CTX_new.html" => [ + "doc/man3/TS_RESP_CTX_new.pod" + ], + "doc/html/man3/TS_VERIFY_CTX.html" => [ + "doc/man3/TS_VERIFY_CTX.pod" + ], + "doc/html/man3/UI_STRING.html" => [ + "doc/man3/UI_STRING.pod" + ], + "doc/html/man3/UI_UTIL_read_pw.html" => [ + "doc/man3/UI_UTIL_read_pw.pod" + ], + "doc/html/man3/UI_create_method.html" => [ + "doc/man3/UI_create_method.pod" + ], + "doc/html/man3/UI_new.html" => [ + "doc/man3/UI_new.pod" + ], + "doc/html/man3/X509V3_EXT_print.html" => [ + "doc/man3/X509V3_EXT_print.pod" + ], + "doc/html/man3/X509V3_get_d2i.html" => [ + "doc/man3/X509V3_get_d2i.pod" + ], + "doc/html/man3/X509V3_set_ctx.html" => [ + "doc/man3/X509V3_set_ctx.pod" + ], + "doc/html/man3/X509_ACERT_add1_attr.html" => [ + "doc/man3/X509_ACERT_add1_attr.pod" + ], + "doc/html/man3/X509_ACERT_add_attr_nconf.html" => [ + "doc/man3/X509_ACERT_add_attr_nconf.pod" + ], + "doc/html/man3/X509_ACERT_get0_holder_baseCertId.html" => [ + "doc/man3/X509_ACERT_get0_holder_baseCertId.pod" + ], + "doc/html/man3/X509_ACERT_get_attr.html" => [ + "doc/man3/X509_ACERT_get_attr.pod" + ], + "doc/html/man3/X509_ACERT_print_ex.html" => [ + "doc/man3/X509_ACERT_print_ex.pod" + ], + "doc/html/man3/X509_ALGOR_dup.html" => [ + "doc/man3/X509_ALGOR_dup.pod" + ], + "doc/html/man3/X509_ATTRIBUTE.html" => [ + "doc/man3/X509_ATTRIBUTE.pod" + ], + "doc/html/man3/X509_CRL_get0_by_serial.html" => [ + "doc/man3/X509_CRL_get0_by_serial.pod" + ], + "doc/html/man3/X509_EXTENSION_set_object.html" => [ + "doc/man3/X509_EXTENSION_set_object.pod" + ], + "doc/html/man3/X509_LOOKUP.html" => [ + "doc/man3/X509_LOOKUP.pod" + ], + "doc/html/man3/X509_LOOKUP_hash_dir.html" => [ + "doc/man3/X509_LOOKUP_hash_dir.pod" + ], + "doc/html/man3/X509_LOOKUP_meth_new.html" => [ + "doc/man3/X509_LOOKUP_meth_new.pod" + ], + "doc/html/man3/X509_NAME_ENTRY_get_object.html" => [ + "doc/man3/X509_NAME_ENTRY_get_object.pod" + ], + "doc/html/man3/X509_NAME_add_entry_by_txt.html" => [ + "doc/man3/X509_NAME_add_entry_by_txt.pod" + ], + "doc/html/man3/X509_NAME_get0_der.html" => [ + "doc/man3/X509_NAME_get0_der.pod" + ], + "doc/html/man3/X509_NAME_get_index_by_NID.html" => [ + "doc/man3/X509_NAME_get_index_by_NID.pod" + ], + "doc/html/man3/X509_NAME_print_ex.html" => [ + "doc/man3/X509_NAME_print_ex.pod" + ], + "doc/html/man3/X509_PUBKEY_new.html" => [ + "doc/man3/X509_PUBKEY_new.pod" + ], + "doc/html/man3/X509_REQ_get_attr.html" => [ + "doc/man3/X509_REQ_get_attr.pod" + ], + "doc/html/man3/X509_REQ_get_extensions.html" => [ + "doc/man3/X509_REQ_get_extensions.pod" + ], + "doc/html/man3/X509_SIG_get0.html" => [ + "doc/man3/X509_SIG_get0.pod" + ], + "doc/html/man3/X509_STORE_CTX_get_by_subject.html" => [ + "doc/man3/X509_STORE_CTX_get_by_subject.pod" + ], + "doc/html/man3/X509_STORE_CTX_get_error.html" => [ + "doc/man3/X509_STORE_CTX_get_error.pod" + ], + "doc/html/man3/X509_STORE_CTX_new.html" => [ + "doc/man3/X509_STORE_CTX_new.pod" + ], + "doc/html/man3/X509_STORE_CTX_set_verify_cb.html" => [ + "doc/man3/X509_STORE_CTX_set_verify_cb.pod" + ], + "doc/html/man3/X509_STORE_add_cert.html" => [ + "doc/man3/X509_STORE_add_cert.pod" + ], + "doc/html/man3/X509_STORE_get0_param.html" => [ + "doc/man3/X509_STORE_get0_param.pod" + ], + "doc/html/man3/X509_STORE_new.html" => [ + "doc/man3/X509_STORE_new.pod" + ], + "doc/html/man3/X509_STORE_set_verify_cb_func.html" => [ + "doc/man3/X509_STORE_set_verify_cb_func.pod" + ], + "doc/html/man3/X509_VERIFY_PARAM_set_flags.html" => [ + "doc/man3/X509_VERIFY_PARAM_set_flags.pod" + ], + "doc/html/man3/X509_add_cert.html" => [ + "doc/man3/X509_add_cert.pod" + ], + "doc/html/man3/X509_check_ca.html" => [ + "doc/man3/X509_check_ca.pod" + ], + "doc/html/man3/X509_check_host.html" => [ + "doc/man3/X509_check_host.pod" + ], + "doc/html/man3/X509_check_issued.html" => [ + "doc/man3/X509_check_issued.pod" + ], + "doc/html/man3/X509_check_private_key.html" => [ + "doc/man3/X509_check_private_key.pod" + ], + "doc/html/man3/X509_check_purpose.html" => [ + "doc/man3/X509_check_purpose.pod" + ], + "doc/html/man3/X509_cmp.html" => [ + "doc/man3/X509_cmp.pod" + ], + "doc/html/man3/X509_cmp_time.html" => [ + "doc/man3/X509_cmp_time.pod" + ], + "doc/html/man3/X509_digest.html" => [ + "doc/man3/X509_digest.pod" + ], + "doc/html/man3/X509_dup.html" => [ + "doc/man3/X509_dup.pod" + ], + "doc/html/man3/X509_get0_distinguishing_id.html" => [ + "doc/man3/X509_get0_distinguishing_id.pod" + ], + "doc/html/man3/X509_get0_notBefore.html" => [ + "doc/man3/X509_get0_notBefore.pod" + ], + "doc/html/man3/X509_get0_signature.html" => [ + "doc/man3/X509_get0_signature.pod" + ], + "doc/html/man3/X509_get0_uids.html" => [ + "doc/man3/X509_get0_uids.pod" + ], + "doc/html/man3/X509_get_default_cert_file.html" => [ + "doc/man3/X509_get_default_cert_file.pod" + ], + "doc/html/man3/X509_get_extension_flags.html" => [ + "doc/man3/X509_get_extension_flags.pod" + ], + "doc/html/man3/X509_get_pubkey.html" => [ + "doc/man3/X509_get_pubkey.pod" + ], + "doc/html/man3/X509_get_serialNumber.html" => [ + "doc/man3/X509_get_serialNumber.pod" + ], + "doc/html/man3/X509_get_subject_name.html" => [ + "doc/man3/X509_get_subject_name.pod" + ], + "doc/html/man3/X509_get_version.html" => [ + "doc/man3/X509_get_version.pod" + ], + "doc/html/man3/X509_load_http.html" => [ + "doc/man3/X509_load_http.pod" + ], + "doc/html/man3/X509_new.html" => [ + "doc/man3/X509_new.pod" + ], + "doc/html/man3/X509_sign.html" => [ + "doc/man3/X509_sign.pod" + ], + "doc/html/man3/X509_verify.html" => [ + "doc/man3/X509_verify.pod" + ], + "doc/html/man3/X509_verify_cert.html" => [ + "doc/man3/X509_verify_cert.pod" + ], + "doc/html/man3/X509v3_get_ext_by_NID.html" => [ + "doc/man3/X509v3_get_ext_by_NID.pod" + ], + "doc/html/man3/b2i_PVK_bio_ex.html" => [ + "doc/man3/b2i_PVK_bio_ex.pod" + ], + "doc/html/man3/d2i_PKCS8PrivateKey_bio.html" => [ + "doc/man3/d2i_PKCS8PrivateKey_bio.pod" + ], + "doc/html/man3/d2i_PrivateKey.html" => [ + "doc/man3/d2i_PrivateKey.pod" + ], + "doc/html/man3/d2i_RSAPrivateKey.html" => [ + "doc/man3/d2i_RSAPrivateKey.pod" + ], + "doc/html/man3/d2i_SSL_SESSION.html" => [ + "doc/man3/d2i_SSL_SESSION.pod" + ], + "doc/html/man3/d2i_X509.html" => [ + "doc/man3/d2i_X509.pod" + ], + "doc/html/man3/i2d_CMS_bio_stream.html" => [ + "doc/man3/i2d_CMS_bio_stream.pod" + ], + "doc/html/man3/i2d_PKCS7_bio_stream.html" => [ + "doc/man3/i2d_PKCS7_bio_stream.pod" + ], + "doc/html/man3/i2d_re_X509_tbs.html" => [ + "doc/man3/i2d_re_X509_tbs.pod" + ], + "doc/html/man3/o2i_SCT_LIST.html" => [ + "doc/man3/o2i_SCT_LIST.pod" + ], + "doc/html/man3/s2i_ASN1_IA5STRING.html" => [ + "doc/man3/s2i_ASN1_IA5STRING.pod" + ], + "doc/html/man5/config.html" => [ + "doc/man5/config.pod" + ], + "doc/html/man5/fips_config.html" => [ + "doc/man5/fips_config.pod" + ], + "doc/html/man5/x509v3_config.html" => [ + "doc/man5/x509v3_config.pod" + ], + "doc/html/man7/EVP_ASYM_CIPHER-RSA.html" => [ + "doc/man7/EVP_ASYM_CIPHER-RSA.pod" + ], + "doc/html/man7/EVP_ASYM_CIPHER-SM2.html" => [ + "doc/man7/EVP_ASYM_CIPHER-SM2.pod" + ], + "doc/html/man7/EVP_CIPHER-AES.html" => [ + "doc/man7/EVP_CIPHER-AES.pod" + ], + "doc/html/man7/EVP_CIPHER-ARIA.html" => [ + "doc/man7/EVP_CIPHER-ARIA.pod" + ], + "doc/html/man7/EVP_CIPHER-BLOWFISH.html" => [ + "doc/man7/EVP_CIPHER-BLOWFISH.pod" + ], + "doc/html/man7/EVP_CIPHER-CAMELLIA.html" => [ + "doc/man7/EVP_CIPHER-CAMELLIA.pod" + ], + "doc/html/man7/EVP_CIPHER-CAST.html" => [ + "doc/man7/EVP_CIPHER-CAST.pod" + ], + "doc/html/man7/EVP_CIPHER-CHACHA.html" => [ + "doc/man7/EVP_CIPHER-CHACHA.pod" + ], + "doc/html/man7/EVP_CIPHER-DES.html" => [ + "doc/man7/EVP_CIPHER-DES.pod" + ], + "doc/html/man7/EVP_CIPHER-IDEA.html" => [ + "doc/man7/EVP_CIPHER-IDEA.pod" + ], + "doc/html/man7/EVP_CIPHER-NULL.html" => [ + "doc/man7/EVP_CIPHER-NULL.pod" + ], + "doc/html/man7/EVP_CIPHER-RC2.html" => [ + "doc/man7/EVP_CIPHER-RC2.pod" + ], + "doc/html/man7/EVP_CIPHER-RC4.html" => [ + "doc/man7/EVP_CIPHER-RC4.pod" + ], + "doc/html/man7/EVP_CIPHER-RC5.html" => [ + "doc/man7/EVP_CIPHER-RC5.pod" + ], + "doc/html/man7/EVP_CIPHER-SEED.html" => [ + "doc/man7/EVP_CIPHER-SEED.pod" + ], + "doc/html/man7/EVP_CIPHER-SM4.html" => [ + "doc/man7/EVP_CIPHER-SM4.pod" + ], + "doc/html/man7/EVP_KDF-ARGON2.html" => [ + "doc/man7/EVP_KDF-ARGON2.pod" + ], + "doc/html/man7/EVP_KDF-HKDF.html" => [ + "doc/man7/EVP_KDF-HKDF.pod" + ], + "doc/html/man7/EVP_KDF-HMAC-DRBG.html" => [ + "doc/man7/EVP_KDF-HMAC-DRBG.pod" + ], + "doc/html/man7/EVP_KDF-KB.html" => [ + "doc/man7/EVP_KDF-KB.pod" + ], + "doc/html/man7/EVP_KDF-KRB5KDF.html" => [ + "doc/man7/EVP_KDF-KRB5KDF.pod" + ], + "doc/html/man7/EVP_KDF-PBKDF1.html" => [ + "doc/man7/EVP_KDF-PBKDF1.pod" + ], + "doc/html/man7/EVP_KDF-PBKDF2.html" => [ + "doc/man7/EVP_KDF-PBKDF2.pod" + ], + "doc/html/man7/EVP_KDF-PKCS12KDF.html" => [ + "doc/man7/EVP_KDF-PKCS12KDF.pod" + ], + "doc/html/man7/EVP_KDF-PVKKDF.html" => [ + "doc/man7/EVP_KDF-PVKKDF.pod" + ], + "doc/html/man7/EVP_KDF-SCRYPT.html" => [ + "doc/man7/EVP_KDF-SCRYPT.pod" + ], + "doc/html/man7/EVP_KDF-SS.html" => [ + "doc/man7/EVP_KDF-SS.pod" + ], + "doc/html/man7/EVP_KDF-SSHKDF.html" => [ + "doc/man7/EVP_KDF-SSHKDF.pod" + ], + "doc/html/man7/EVP_KDF-TLS13_KDF.html" => [ + "doc/man7/EVP_KDF-TLS13_KDF.pod" + ], + "doc/html/man7/EVP_KDF-TLS1_PRF.html" => [ + "doc/man7/EVP_KDF-TLS1_PRF.pod" + ], + "doc/html/man7/EVP_KDF-X942-ASN1.html" => [ + "doc/man7/EVP_KDF-X942-ASN1.pod" + ], + "doc/html/man7/EVP_KDF-X942-CONCAT.html" => [ + "doc/man7/EVP_KDF-X942-CONCAT.pod" + ], + "doc/html/man7/EVP_KDF-X963.html" => [ + "doc/man7/EVP_KDF-X963.pod" + ], + "doc/html/man7/EVP_KEM-EC.html" => [ + "doc/man7/EVP_KEM-EC.pod" + ], + "doc/html/man7/EVP_KEM-ML-KEM.html" => [ + "doc/man7/EVP_KEM-ML-KEM.pod" + ], + "doc/html/man7/EVP_KEM-RSA.html" => [ + "doc/man7/EVP_KEM-RSA.pod" + ], + "doc/html/man7/EVP_KEM-X25519.html" => [ + "doc/man7/EVP_KEM-X25519.pod" + ], + "doc/html/man7/EVP_KEYEXCH-DH.html" => [ + "doc/man7/EVP_KEYEXCH-DH.pod" + ], + "doc/html/man7/EVP_KEYEXCH-ECDH.html" => [ + "doc/man7/EVP_KEYEXCH-ECDH.pod" + ], + "doc/html/man7/EVP_KEYEXCH-X25519.html" => [ + "doc/man7/EVP_KEYEXCH-X25519.pod" + ], + "doc/html/man7/EVP_MAC-BLAKE2.html" => [ + "doc/man7/EVP_MAC-BLAKE2.pod" + ], + "doc/html/man7/EVP_MAC-CMAC.html" => [ + "doc/man7/EVP_MAC-CMAC.pod" + ], + "doc/html/man7/EVP_MAC-GMAC.html" => [ + "doc/man7/EVP_MAC-GMAC.pod" + ], + "doc/html/man7/EVP_MAC-HMAC.html" => [ + "doc/man7/EVP_MAC-HMAC.pod" + ], + "doc/html/man7/EVP_MAC-KMAC.html" => [ + "doc/man7/EVP_MAC-KMAC.pod" + ], + "doc/html/man7/EVP_MAC-Poly1305.html" => [ + "doc/man7/EVP_MAC-Poly1305.pod" + ], + "doc/html/man7/EVP_MAC-Siphash.html" => [ + "doc/man7/EVP_MAC-Siphash.pod" + ], + "doc/html/man7/EVP_MD-BLAKE2.html" => [ + "doc/man7/EVP_MD-BLAKE2.pod" + ], + "doc/html/man7/EVP_MD-KECCAK.html" => [ + "doc/man7/EVP_MD-KECCAK.pod" + ], + "doc/html/man7/EVP_MD-MD2.html" => [ + "doc/man7/EVP_MD-MD2.pod" + ], + "doc/html/man7/EVP_MD-MD4.html" => [ + "doc/man7/EVP_MD-MD4.pod" + ], + "doc/html/man7/EVP_MD-MD5-SHA1.html" => [ + "doc/man7/EVP_MD-MD5-SHA1.pod" + ], + "doc/html/man7/EVP_MD-MD5.html" => [ + "doc/man7/EVP_MD-MD5.pod" + ], + "doc/html/man7/EVP_MD-MDC2.html" => [ + "doc/man7/EVP_MD-MDC2.pod" + ], + "doc/html/man7/EVP_MD-NULL.html" => [ + "doc/man7/EVP_MD-NULL.pod" + ], + "doc/html/man7/EVP_MD-RIPEMD160.html" => [ + "doc/man7/EVP_MD-RIPEMD160.pod" + ], + "doc/html/man7/EVP_MD-SHA1.html" => [ + "doc/man7/EVP_MD-SHA1.pod" + ], + "doc/html/man7/EVP_MD-SHA2.html" => [ + "doc/man7/EVP_MD-SHA2.pod" + ], + "doc/html/man7/EVP_MD-SHA3.html" => [ + "doc/man7/EVP_MD-SHA3.pod" + ], + "doc/html/man7/EVP_MD-SHAKE.html" => [ + "doc/man7/EVP_MD-SHAKE.pod" + ], + "doc/html/man7/EVP_MD-SM3.html" => [ + "doc/man7/EVP_MD-SM3.pod" + ], + "doc/html/man7/EVP_MD-WHIRLPOOL.html" => [ + "doc/man7/EVP_MD-WHIRLPOOL.pod" + ], + "doc/html/man7/EVP_MD-common.html" => [ + "doc/man7/EVP_MD-common.pod" + ], + "doc/html/man7/EVP_PKEY-DH.html" => [ + "doc/man7/EVP_PKEY-DH.pod" + ], + "doc/html/man7/EVP_PKEY-DSA.html" => [ + "doc/man7/EVP_PKEY-DSA.pod" + ], + "doc/html/man7/EVP_PKEY-EC.html" => [ + "doc/man7/EVP_PKEY-EC.pod" + ], + "doc/html/man7/EVP_PKEY-FFC.html" => [ + "doc/man7/EVP_PKEY-FFC.pod" + ], + "doc/html/man7/EVP_PKEY-HMAC.html" => [ + "doc/man7/EVP_PKEY-HMAC.pod" + ], + "doc/html/man7/EVP_PKEY-ML-DSA.html" => [ + "doc/man7/EVP_PKEY-ML-DSA.pod" + ], + "doc/html/man7/EVP_PKEY-ML-KEM.html" => [ + "doc/man7/EVP_PKEY-ML-KEM.pod" + ], + "doc/html/man7/EVP_PKEY-RSA.html" => [ + "doc/man7/EVP_PKEY-RSA.pod" + ], + "doc/html/man7/EVP_PKEY-SLH-DSA.html" => [ + "doc/man7/EVP_PKEY-SLH-DSA.pod" + ], + "doc/html/man7/EVP_PKEY-SM2.html" => [ + "doc/man7/EVP_PKEY-SM2.pod" + ], + "doc/html/man7/EVP_PKEY-X25519.html" => [ + "doc/man7/EVP_PKEY-X25519.pod" + ], + "doc/html/man7/EVP_RAND-CRNG-TEST.html" => [ + "doc/man7/EVP_RAND-CRNG-TEST.pod" + ], + "doc/html/man7/EVP_RAND-CTR-DRBG.html" => [ + "doc/man7/EVP_RAND-CTR-DRBG.pod" + ], + "doc/html/man7/EVP_RAND-HASH-DRBG.html" => [ + "doc/man7/EVP_RAND-HASH-DRBG.pod" + ], + "doc/html/man7/EVP_RAND-HMAC-DRBG.html" => [ + "doc/man7/EVP_RAND-HMAC-DRBG.pod" + ], + "doc/html/man7/EVP_RAND-JITTER.html" => [ + "doc/man7/EVP_RAND-JITTER.pod" + ], + "doc/html/man7/EVP_RAND-SEED-SRC.html" => [ + "doc/man7/EVP_RAND-SEED-SRC.pod" + ], + "doc/html/man7/EVP_RAND-TEST-RAND.html" => [ + "doc/man7/EVP_RAND-TEST-RAND.pod" + ], + "doc/html/man7/EVP_RAND.html" => [ + "doc/man7/EVP_RAND.pod" + ], + "doc/html/man7/EVP_SIGNATURE-DSA.html" => [ + "doc/man7/EVP_SIGNATURE-DSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-ECDSA.html" => [ + "doc/man7/EVP_SIGNATURE-ECDSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-ED25519.html" => [ + "doc/man7/EVP_SIGNATURE-ED25519.pod" + ], + "doc/html/man7/EVP_SIGNATURE-HMAC.html" => [ + "doc/man7/EVP_SIGNATURE-HMAC.pod" + ], + "doc/html/man7/EVP_SIGNATURE-ML-DSA.html" => [ + "doc/man7/EVP_SIGNATURE-ML-DSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-RSA.html" => [ + "doc/man7/EVP_SIGNATURE-RSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-SLH-DSA.html" => [ + "doc/man7/EVP_SIGNATURE-SLH-DSA.pod" + ], + "doc/html/man7/OSSL_PROVIDER-FIPS.html" => [ + "doc/man7/OSSL_PROVIDER-FIPS.pod" + ], + "doc/html/man7/OSSL_PROVIDER-base.html" => [ + "doc/man7/OSSL_PROVIDER-base.pod" + ], + "doc/html/man7/OSSL_PROVIDER-default.html" => [ + "doc/man7/OSSL_PROVIDER-default.pod" + ], + "doc/html/man7/OSSL_PROVIDER-legacy.html" => [ + "doc/man7/OSSL_PROVIDER-legacy.pod" + ], + "doc/html/man7/OSSL_PROVIDER-null.html" => [ + "doc/man7/OSSL_PROVIDER-null.pod" + ], + "doc/html/man7/OSSL_STORE-winstore.html" => [ + "doc/man7/OSSL_STORE-winstore.pod" + ], + "doc/html/man7/RAND.html" => [ + "doc/man7/RAND.pod" + ], + "doc/html/man7/RSA-PSS.html" => [ + "doc/man7/RSA-PSS.pod" + ], + "doc/html/man7/X25519.html" => [ + "doc/man7/X25519.pod" + ], + "doc/html/man7/bio.html" => [ + "doc/man7/bio.pod" + ], + "doc/html/man7/ct.html" => [ + "doc/man7/ct.pod" + ], + "doc/html/man7/des_modes.html" => [ + "doc/man7/des_modes.pod" + ], + "doc/html/man7/evp.html" => [ + "doc/man7/evp.pod" + ], + "doc/html/man7/fips_module.html" => [ + "doc/man7/fips_module.pod" + ], + "doc/html/man7/life_cycle-cipher.html" => [ + "doc/man7/life_cycle-cipher.pod" + ], + "doc/html/man7/life_cycle-digest.html" => [ + "doc/man7/life_cycle-digest.pod" + ], + "doc/html/man7/life_cycle-kdf.html" => [ + "doc/man7/life_cycle-kdf.pod" + ], + "doc/html/man7/life_cycle-mac.html" => [ + "doc/man7/life_cycle-mac.pod" + ], + "doc/html/man7/life_cycle-pkey.html" => [ + "doc/man7/life_cycle-pkey.pod" + ], + "doc/html/man7/life_cycle-rand.html" => [ + "doc/man7/life_cycle-rand.pod" + ], + "doc/html/man7/openssl-core.h.html" => [ + "doc/man7/openssl-core.h.pod" + ], + "doc/html/man7/openssl-core_dispatch.h.html" => [ + "doc/man7/openssl-core_dispatch.h.pod" + ], + "doc/html/man7/openssl-core_names.h.html" => [ + "doc/man7/openssl-core_names.h.pod" + ], + "doc/html/man7/openssl-env.html" => [ + "doc/man7/openssl-env.pod" + ], + "doc/html/man7/openssl-glossary.html" => [ + "doc/man7/openssl-glossary.pod" + ], + "doc/html/man7/openssl-qlog.html" => [ + "doc/man7/openssl-qlog.pod" + ], + "doc/html/man7/openssl-quic-concurrency.html" => [ + "doc/man7/openssl-quic-concurrency.pod" + ], + "doc/html/man7/openssl-quic.html" => [ + "doc/man7/openssl-quic.pod" + ], + "doc/html/man7/openssl-threads.html" => [ + "doc/man7/openssl-threads.pod" + ], + "doc/html/man7/openssl_user_macros.html" => [ + "doc/man7/openssl_user_macros.pod" + ], + "doc/html/man7/ossl-guide-introduction.html" => [ + "doc/man7/ossl-guide-introduction.pod" + ], + "doc/html/man7/ossl-guide-libcrypto-introduction.html" => [ + "doc/man7/ossl-guide-libcrypto-introduction.pod" + ], + "doc/html/man7/ossl-guide-libraries-introduction.html" => [ + "doc/man7/ossl-guide-libraries-introduction.pod" + ], + "doc/html/man7/ossl-guide-libssl-introduction.html" => [ + "doc/man7/ossl-guide-libssl-introduction.pod" + ], + "doc/html/man7/ossl-guide-migration.html" => [ + "doc/man7/ossl-guide-migration.pod" + ], + "doc/html/man7/ossl-guide-quic-client-block.html" => [ + "doc/man7/ossl-guide-quic-client-block.pod" + ], + "doc/html/man7/ossl-guide-quic-client-non-block.html" => [ + "doc/man7/ossl-guide-quic-client-non-block.pod" + ], + "doc/html/man7/ossl-guide-quic-introduction.html" => [ + "doc/man7/ossl-guide-quic-introduction.pod" + ], + "doc/html/man7/ossl-guide-quic-multi-stream.html" => [ + "doc/man7/ossl-guide-quic-multi-stream.pod" + ], + "doc/html/man7/ossl-guide-quic-server-block.html" => [ + "doc/man7/ossl-guide-quic-server-block.pod" + ], + "doc/html/man7/ossl-guide-quic-server-non-block.html" => [ + "doc/man7/ossl-guide-quic-server-non-block.pod" + ], + "doc/html/man7/ossl-guide-tls-client-block.html" => [ + "doc/man7/ossl-guide-tls-client-block.pod" + ], + "doc/html/man7/ossl-guide-tls-client-non-block.html" => [ + "doc/man7/ossl-guide-tls-client-non-block.pod" + ], + "doc/html/man7/ossl-guide-tls-introduction.html" => [ + "doc/man7/ossl-guide-tls-introduction.pod" + ], + "doc/html/man7/ossl-guide-tls-server-block.html" => [ + "doc/man7/ossl-guide-tls-server-block.pod" + ], + "doc/html/man7/ossl_store-file.html" => [ + "doc/man7/ossl_store-file.pod" + ], + "doc/html/man7/ossl_store.html" => [ + "doc/man7/ossl_store.pod" + ], + "doc/html/man7/passphrase-encoding.html" => [ + "doc/man7/passphrase-encoding.pod" + ], + "doc/html/man7/property.html" => [ + "doc/man7/property.pod" + ], + "doc/html/man7/provider-asym_cipher.html" => [ + "doc/man7/provider-asym_cipher.pod" + ], + "doc/html/man7/provider-base.html" => [ + "doc/man7/provider-base.pod" + ], + "doc/html/man7/provider-cipher.html" => [ + "doc/man7/provider-cipher.pod" + ], + "doc/html/man7/provider-decoder.html" => [ + "doc/man7/provider-decoder.pod" + ], + "doc/html/man7/provider-digest.html" => [ + "doc/man7/provider-digest.pod" + ], + "doc/html/man7/provider-encoder.html" => [ + "doc/man7/provider-encoder.pod" + ], + "doc/html/man7/provider-kdf.html" => [ + "doc/man7/provider-kdf.pod" + ], + "doc/html/man7/provider-kem.html" => [ + "doc/man7/provider-kem.pod" + ], + "doc/html/man7/provider-keyexch.html" => [ + "doc/man7/provider-keyexch.pod" + ], + "doc/html/man7/provider-keymgmt.html" => [ + "doc/man7/provider-keymgmt.pod" + ], + "doc/html/man7/provider-mac.html" => [ + "doc/man7/provider-mac.pod" + ], + "doc/html/man7/provider-object.html" => [ + "doc/man7/provider-object.pod" + ], + "doc/html/man7/provider-rand.html" => [ + "doc/man7/provider-rand.pod" + ], + "doc/html/man7/provider-signature.html" => [ + "doc/man7/provider-signature.pod" + ], + "doc/html/man7/provider-skeymgmt.html" => [ + "doc/man7/provider-skeymgmt.pod" + ], + "doc/html/man7/provider-storemgmt.html" => [ + "doc/man7/provider-storemgmt.pod" + ], + "doc/html/man7/provider.html" => [ + "doc/man7/provider.pod" + ], + "doc/html/man7/proxy-certificates.html" => [ + "doc/man7/proxy-certificates.pod" + ], + "doc/html/man7/x509.html" => [ + "doc/man7/x509.pod" + ], + "doc/man/man1/CA.pl.1" => [ + "doc/man1/CA.pl.pod" + ], + "doc/man/man1/openssl-asn1parse.1" => [ + "doc/man1/openssl-asn1parse.pod" + ], + "doc/man/man1/openssl-ca.1" => [ + "doc/man1/openssl-ca.pod" + ], + "doc/man/man1/openssl-ciphers.1" => [ + "doc/man1/openssl-ciphers.pod" + ], + "doc/man/man1/openssl-cmds.1" => [ + "doc/man1/openssl-cmds.pod" + ], + "doc/man/man1/openssl-cmp.1" => [ + "doc/man1/openssl-cmp.pod" + ], + "doc/man/man1/openssl-cms.1" => [ + "doc/man1/openssl-cms.pod" + ], + "doc/man/man1/openssl-crl.1" => [ + "doc/man1/openssl-crl.pod" + ], + "doc/man/man1/openssl-crl2pkcs7.1" => [ + "doc/man1/openssl-crl2pkcs7.pod" + ], + "doc/man/man1/openssl-dgst.1" => [ + "doc/man1/openssl-dgst.pod" + ], + "doc/man/man1/openssl-dhparam.1" => [ + "doc/man1/openssl-dhparam.pod" + ], + "doc/man/man1/openssl-dsa.1" => [ + "doc/man1/openssl-dsa.pod" + ], + "doc/man/man1/openssl-dsaparam.1" => [ + "doc/man1/openssl-dsaparam.pod" + ], + "doc/man/man1/openssl-ec.1" => [ + "doc/man1/openssl-ec.pod" + ], + "doc/man/man1/openssl-ecparam.1" => [ + "doc/man1/openssl-ecparam.pod" + ], + "doc/man/man1/openssl-enc.1" => [ + "doc/man1/openssl-enc.pod" + ], + "doc/man/man1/openssl-engine.1" => [ + "doc/man1/openssl-engine.pod" + ], + "doc/man/man1/openssl-errstr.1" => [ + "doc/man1/openssl-errstr.pod" + ], + "doc/man/man1/openssl-fipsinstall.1" => [ + "doc/man1/openssl-fipsinstall.pod" + ], + "doc/man/man1/openssl-format-options.1" => [ + "doc/man1/openssl-format-options.pod" + ], + "doc/man/man1/openssl-gendsa.1" => [ + "doc/man1/openssl-gendsa.pod" + ], + "doc/man/man1/openssl-genpkey.1" => [ + "doc/man1/openssl-genpkey.pod" + ], + "doc/man/man1/openssl-genrsa.1" => [ + "doc/man1/openssl-genrsa.pod" + ], + "doc/man/man1/openssl-info.1" => [ + "doc/man1/openssl-info.pod" + ], + "doc/man/man1/openssl-kdf.1" => [ + "doc/man1/openssl-kdf.pod" + ], + "doc/man/man1/openssl-list.1" => [ + "doc/man1/openssl-list.pod" + ], + "doc/man/man1/openssl-mac.1" => [ + "doc/man1/openssl-mac.pod" + ], + "doc/man/man1/openssl-namedisplay-options.1" => [ + "doc/man1/openssl-namedisplay-options.pod" + ], + "doc/man/man1/openssl-nseq.1" => [ + "doc/man1/openssl-nseq.pod" + ], + "doc/man/man1/openssl-ocsp.1" => [ + "doc/man1/openssl-ocsp.pod" + ], + "doc/man/man1/openssl-passphrase-options.1" => [ + "doc/man1/openssl-passphrase-options.pod" + ], + "doc/man/man1/openssl-passwd.1" => [ + "doc/man1/openssl-passwd.pod" + ], + "doc/man/man1/openssl-pkcs12.1" => [ + "doc/man1/openssl-pkcs12.pod" + ], + "doc/man/man1/openssl-pkcs7.1" => [ + "doc/man1/openssl-pkcs7.pod" + ], + "doc/man/man1/openssl-pkcs8.1" => [ + "doc/man1/openssl-pkcs8.pod" + ], + "doc/man/man1/openssl-pkey.1" => [ + "doc/man1/openssl-pkey.pod" + ], + "doc/man/man1/openssl-pkeyparam.1" => [ + "doc/man1/openssl-pkeyparam.pod" + ], + "doc/man/man1/openssl-pkeyutl.1" => [ + "doc/man1/openssl-pkeyutl.pod" + ], + "doc/man/man1/openssl-prime.1" => [ + "doc/man1/openssl-prime.pod" + ], + "doc/man/man1/openssl-rand.1" => [ + "doc/man1/openssl-rand.pod" + ], + "doc/man/man1/openssl-rehash.1" => [ + "doc/man1/openssl-rehash.pod" + ], + "doc/man/man1/openssl-req.1" => [ + "doc/man1/openssl-req.pod" + ], + "doc/man/man1/openssl-rsa.1" => [ + "doc/man1/openssl-rsa.pod" + ], + "doc/man/man1/openssl-rsautl.1" => [ + "doc/man1/openssl-rsautl.pod" + ], + "doc/man/man1/openssl-s_client.1" => [ + "doc/man1/openssl-s_client.pod" + ], + "doc/man/man1/openssl-s_server.1" => [ + "doc/man1/openssl-s_server.pod" + ], + "doc/man/man1/openssl-s_time.1" => [ + "doc/man1/openssl-s_time.pod" + ], + "doc/man/man1/openssl-sess_id.1" => [ + "doc/man1/openssl-sess_id.pod" + ], + "doc/man/man1/openssl-skeyutl.1" => [ + "doc/man1/openssl-skeyutl.pod" + ], + "doc/man/man1/openssl-smime.1" => [ + "doc/man1/openssl-smime.pod" + ], + "doc/man/man1/openssl-speed.1" => [ + "doc/man1/openssl-speed.pod" + ], + "doc/man/man1/openssl-spkac.1" => [ + "doc/man1/openssl-spkac.pod" + ], + "doc/man/man1/openssl-srp.1" => [ + "doc/man1/openssl-srp.pod" + ], + "doc/man/man1/openssl-storeutl.1" => [ + "doc/man1/openssl-storeutl.pod" + ], + "doc/man/man1/openssl-ts.1" => [ + "doc/man1/openssl-ts.pod" + ], + "doc/man/man1/openssl-verification-options.1" => [ + "doc/man1/openssl-verification-options.pod" + ], + "doc/man/man1/openssl-verify.1" => [ + "doc/man1/openssl-verify.pod" + ], + "doc/man/man1/openssl-version.1" => [ + "doc/man1/openssl-version.pod" + ], + "doc/man/man1/openssl-x509.1" => [ + "doc/man1/openssl-x509.pod" + ], + "doc/man/man1/openssl.1" => [ + "doc/man1/openssl.pod" + ], + "doc/man/man1/tsget.1" => [ + "doc/man1/tsget.pod" + ], + "doc/man/man3/ADMISSIONS.3" => [ + "doc/man3/ADMISSIONS.pod" + ], + "doc/man/man3/ASN1_EXTERN_FUNCS.3" => [ + "doc/man3/ASN1_EXTERN_FUNCS.pod" + ], + "doc/man/man3/ASN1_INTEGER_get_int64.3" => [ + "doc/man3/ASN1_INTEGER_get_int64.pod" + ], + "doc/man/man3/ASN1_INTEGER_new.3" => [ + "doc/man3/ASN1_INTEGER_new.pod" + ], + "doc/man/man3/ASN1_ITEM_lookup.3" => [ + "doc/man3/ASN1_ITEM_lookup.pod" + ], + "doc/man/man3/ASN1_OBJECT_new.3" => [ + "doc/man3/ASN1_OBJECT_new.pod" + ], + "doc/man/man3/ASN1_STRING_TABLE_add.3" => [ + "doc/man3/ASN1_STRING_TABLE_add.pod" + ], + "doc/man/man3/ASN1_STRING_length.3" => [ + "doc/man3/ASN1_STRING_length.pod" + ], + "doc/man/man3/ASN1_STRING_new.3" => [ + "doc/man3/ASN1_STRING_new.pod" + ], + "doc/man/man3/ASN1_STRING_print_ex.3" => [ + "doc/man3/ASN1_STRING_print_ex.pod" + ], + "doc/man/man3/ASN1_TIME_set.3" => [ + "doc/man3/ASN1_TIME_set.pod" + ], + "doc/man/man3/ASN1_TYPE_get.3" => [ + "doc/man3/ASN1_TYPE_get.pod" + ], + "doc/man/man3/ASN1_aux_cb.3" => [ + "doc/man3/ASN1_aux_cb.pod" + ], + "doc/man/man3/ASN1_generate_nconf.3" => [ + "doc/man3/ASN1_generate_nconf.pod" + ], + "doc/man/man3/ASN1_item_d2i_bio.3" => [ + "doc/man3/ASN1_item_d2i_bio.pod" + ], + "doc/man/man3/ASN1_item_new.3" => [ + "doc/man3/ASN1_item_new.pod" + ], + "doc/man/man3/ASN1_item_sign.3" => [ + "doc/man3/ASN1_item_sign.pod" + ], + "doc/man/man3/ASYNC_WAIT_CTX_new.3" => [ + "doc/man3/ASYNC_WAIT_CTX_new.pod" + ], + "doc/man/man3/ASYNC_start_job.3" => [ + "doc/man3/ASYNC_start_job.pod" + ], + "doc/man/man3/BF_encrypt.3" => [ + "doc/man3/BF_encrypt.pod" + ], + "doc/man/man3/BIO_ADDR.3" => [ + "doc/man3/BIO_ADDR.pod" + ], + "doc/man/man3/BIO_ADDRINFO.3" => [ + "doc/man3/BIO_ADDRINFO.pod" + ], + "doc/man/man3/BIO_connect.3" => [ + "doc/man3/BIO_connect.pod" + ], + "doc/man/man3/BIO_ctrl.3" => [ + "doc/man3/BIO_ctrl.pod" + ], + "doc/man/man3/BIO_f_base64.3" => [ + "doc/man3/BIO_f_base64.pod" + ], + "doc/man/man3/BIO_f_buffer.3" => [ + "doc/man3/BIO_f_buffer.pod" + ], + "doc/man/man3/BIO_f_cipher.3" => [ + "doc/man3/BIO_f_cipher.pod" + ], + "doc/man/man3/BIO_f_md.3" => [ + "doc/man3/BIO_f_md.pod" + ], + "doc/man/man3/BIO_f_null.3" => [ + "doc/man3/BIO_f_null.pod" + ], + "doc/man/man3/BIO_f_prefix.3" => [ + "doc/man3/BIO_f_prefix.pod" + ], + "doc/man/man3/BIO_f_readbuffer.3" => [ + "doc/man3/BIO_f_readbuffer.pod" + ], + "doc/man/man3/BIO_f_ssl.3" => [ + "doc/man3/BIO_f_ssl.pod" + ], + "doc/man/man3/BIO_find_type.3" => [ + "doc/man3/BIO_find_type.pod" + ], + "doc/man/man3/BIO_get_data.3" => [ + "doc/man3/BIO_get_data.pod" + ], + "doc/man/man3/BIO_get_ex_new_index.3" => [ + "doc/man3/BIO_get_ex_new_index.pod" + ], + "doc/man/man3/BIO_get_rpoll_descriptor.3" => [ + "doc/man3/BIO_get_rpoll_descriptor.pod" + ], + "doc/man/man3/BIO_meth_new.3" => [ + "doc/man3/BIO_meth_new.pod" + ], + "doc/man/man3/BIO_new.3" => [ + "doc/man3/BIO_new.pod" + ], + "doc/man/man3/BIO_new_CMS.3" => [ + "doc/man3/BIO_new_CMS.pod" + ], + "doc/man/man3/BIO_parse_hostserv.3" => [ + "doc/man3/BIO_parse_hostserv.pod" + ], + "doc/man/man3/BIO_printf.3" => [ + "doc/man3/BIO_printf.pod" + ], + "doc/man/man3/BIO_push.3" => [ + "doc/man3/BIO_push.pod" + ], + "doc/man/man3/BIO_read.3" => [ + "doc/man3/BIO_read.pod" + ], + "doc/man/man3/BIO_s_accept.3" => [ + "doc/man3/BIO_s_accept.pod" + ], + "doc/man/man3/BIO_s_bio.3" => [ + "doc/man3/BIO_s_bio.pod" + ], + "doc/man/man3/BIO_s_connect.3" => [ + "doc/man3/BIO_s_connect.pod" + ], + "doc/man/man3/BIO_s_core.3" => [ + "doc/man3/BIO_s_core.pod" + ], + "doc/man/man3/BIO_s_datagram.3" => [ + "doc/man3/BIO_s_datagram.pod" + ], + "doc/man/man3/BIO_s_dgram_pair.3" => [ + "doc/man3/BIO_s_dgram_pair.pod" + ], + "doc/man/man3/BIO_s_fd.3" => [ + "doc/man3/BIO_s_fd.pod" + ], + "doc/man/man3/BIO_s_file.3" => [ + "doc/man3/BIO_s_file.pod" + ], + "doc/man/man3/BIO_s_mem.3" => [ + "doc/man3/BIO_s_mem.pod" + ], + "doc/man/man3/BIO_s_null.3" => [ + "doc/man3/BIO_s_null.pod" + ], + "doc/man/man3/BIO_s_socket.3" => [ + "doc/man3/BIO_s_socket.pod" + ], + "doc/man/man3/BIO_sendmmsg.3" => [ + "doc/man3/BIO_sendmmsg.pod" + ], + "doc/man/man3/BIO_set_callback.3" => [ + "doc/man3/BIO_set_callback.pod" + ], + "doc/man/man3/BIO_set_flags.3" => [ + "doc/man3/BIO_set_flags.pod" + ], + "doc/man/man3/BIO_should_retry.3" => [ + "doc/man3/BIO_should_retry.pod" + ], + "doc/man/man3/BIO_socket_wait.3" => [ + "doc/man3/BIO_socket_wait.pod" + ], + "doc/man/man3/BN_BLINDING_new.3" => [ + "doc/man3/BN_BLINDING_new.pod" + ], + "doc/man/man3/BN_CTX_new.3" => [ + "doc/man3/BN_CTX_new.pod" + ], + "doc/man/man3/BN_CTX_start.3" => [ + "doc/man3/BN_CTX_start.pod" + ], + "doc/man/man3/BN_add.3" => [ + "doc/man3/BN_add.pod" + ], + "doc/man/man3/BN_add_word.3" => [ + "doc/man3/BN_add_word.pod" + ], + "doc/man/man3/BN_bn2bin.3" => [ + "doc/man3/BN_bn2bin.pod" + ], + "doc/man/man3/BN_cmp.3" => [ + "doc/man3/BN_cmp.pod" + ], + "doc/man/man3/BN_copy.3" => [ + "doc/man3/BN_copy.pod" + ], + "doc/man/man3/BN_generate_prime.3" => [ + "doc/man3/BN_generate_prime.pod" + ], + "doc/man/man3/BN_mod_exp_mont.3" => [ + "doc/man3/BN_mod_exp_mont.pod" + ], + "doc/man/man3/BN_mod_inverse.3" => [ + "doc/man3/BN_mod_inverse.pod" + ], + "doc/man/man3/BN_mod_mul_montgomery.3" => [ + "doc/man3/BN_mod_mul_montgomery.pod" + ], + "doc/man/man3/BN_mod_mul_reciprocal.3" => [ + "doc/man3/BN_mod_mul_reciprocal.pod" + ], + "doc/man/man3/BN_new.3" => [ + "doc/man3/BN_new.pod" + ], + "doc/man/man3/BN_num_bytes.3" => [ + "doc/man3/BN_num_bytes.pod" + ], + "doc/man/man3/BN_rand.3" => [ + "doc/man3/BN_rand.pod" + ], + "doc/man/man3/BN_security_bits.3" => [ + "doc/man3/BN_security_bits.pod" + ], + "doc/man/man3/BN_set_bit.3" => [ + "doc/man3/BN_set_bit.pod" + ], + "doc/man/man3/BN_swap.3" => [ + "doc/man3/BN_swap.pod" + ], + "doc/man/man3/BN_zero.3" => [ + "doc/man3/BN_zero.pod" + ], + "doc/man/man3/BUF_MEM_new.3" => [ + "doc/man3/BUF_MEM_new.pod" + ], + "doc/man/man3/CMAC_CTX.3" => [ + "doc/man3/CMAC_CTX.pod" + ], + "doc/man/man3/CMS_EncryptedData_decrypt.3" => [ + "doc/man3/CMS_EncryptedData_decrypt.pod" + ], + "doc/man/man3/CMS_EncryptedData_encrypt.3" => [ + "doc/man3/CMS_EncryptedData_encrypt.pod" + ], + "doc/man/man3/CMS_EncryptedData_set1_key.3" => [ + "doc/man3/CMS_EncryptedData_set1_key.pod" + ], + "doc/man/man3/CMS_EnvelopedData_create.3" => [ + "doc/man3/CMS_EnvelopedData_create.pod" + ], + "doc/man/man3/CMS_add0_cert.3" => [ + "doc/man3/CMS_add0_cert.pod" + ], + "doc/man/man3/CMS_add1_recipient_cert.3" => [ + "doc/man3/CMS_add1_recipient_cert.pod" + ], + "doc/man/man3/CMS_add1_signer.3" => [ + "doc/man3/CMS_add1_signer.pod" + ], + "doc/man/man3/CMS_compress.3" => [ + "doc/man3/CMS_compress.pod" + ], + "doc/man/man3/CMS_data_create.3" => [ + "doc/man3/CMS_data_create.pod" + ], + "doc/man/man3/CMS_decrypt.3" => [ + "doc/man3/CMS_decrypt.pod" + ], + "doc/man/man3/CMS_digest_create.3" => [ + "doc/man3/CMS_digest_create.pod" + ], + "doc/man/man3/CMS_encrypt.3" => [ + "doc/man3/CMS_encrypt.pod" + ], + "doc/man/man3/CMS_final.3" => [ + "doc/man3/CMS_final.pod" + ], + "doc/man/man3/CMS_get0_RecipientInfos.3" => [ + "doc/man3/CMS_get0_RecipientInfos.pod" + ], + "doc/man/man3/CMS_get0_SignerInfos.3" => [ + "doc/man3/CMS_get0_SignerInfos.pod" + ], + "doc/man/man3/CMS_get0_type.3" => [ + "doc/man3/CMS_get0_type.pod" + ], + "doc/man/man3/CMS_get1_ReceiptRequest.3" => [ + "doc/man3/CMS_get1_ReceiptRequest.pod" + ], + "doc/man/man3/CMS_sign.3" => [ + "doc/man3/CMS_sign.pod" + ], + "doc/man/man3/CMS_sign_receipt.3" => [ + "doc/man3/CMS_sign_receipt.pod" + ], + "doc/man/man3/CMS_signed_get_attr.3" => [ + "doc/man3/CMS_signed_get_attr.pod" + ], + "doc/man/man3/CMS_uncompress.3" => [ + "doc/man3/CMS_uncompress.pod" + ], + "doc/man/man3/CMS_verify.3" => [ + "doc/man3/CMS_verify.pod" + ], + "doc/man/man3/CMS_verify_receipt.3" => [ + "doc/man3/CMS_verify_receipt.pod" + ], + "doc/man/man3/COMP_CTX_new.3" => [ + "doc/man3/COMP_CTX_new.pod" + ], + "doc/man/man3/CONF_modules_free.3" => [ + "doc/man3/CONF_modules_free.pod" + ], + "doc/man/man3/CONF_modules_load_file.3" => [ + "doc/man3/CONF_modules_load_file.pod" + ], + "doc/man/man3/CRYPTO_THREAD_run_once.3" => [ + "doc/man3/CRYPTO_THREAD_run_once.pod" + ], + "doc/man/man3/CRYPTO_get_ex_new_index.3" => [ + "doc/man3/CRYPTO_get_ex_new_index.pod" + ], + "doc/man/man3/CRYPTO_memcmp.3" => [ + "doc/man3/CRYPTO_memcmp.pod" + ], + "doc/man/man3/CTLOG_STORE_get0_log_by_id.3" => [ + "doc/man3/CTLOG_STORE_get0_log_by_id.pod" + ], + "doc/man/man3/CTLOG_STORE_new.3" => [ + "doc/man3/CTLOG_STORE_new.pod" + ], + "doc/man/man3/CTLOG_new.3" => [ + "doc/man3/CTLOG_new.pod" + ], + "doc/man/man3/CT_POLICY_EVAL_CTX_new.3" => [ + "doc/man3/CT_POLICY_EVAL_CTX_new.pod" + ], + "doc/man/man3/DEFINE_STACK_OF.3" => [ + "doc/man3/DEFINE_STACK_OF.pod" + ], + "doc/man/man3/DES_random_key.3" => [ + "doc/man3/DES_random_key.pod" + ], + "doc/man/man3/DH_generate_key.3" => [ + "doc/man3/DH_generate_key.pod" + ], + "doc/man/man3/DH_generate_parameters.3" => [ + "doc/man3/DH_generate_parameters.pod" + ], + "doc/man/man3/DH_get0_pqg.3" => [ + "doc/man3/DH_get0_pqg.pod" + ], + "doc/man/man3/DH_get_1024_160.3" => [ + "doc/man3/DH_get_1024_160.pod" + ], + "doc/man/man3/DH_meth_new.3" => [ + "doc/man3/DH_meth_new.pod" + ], + "doc/man/man3/DH_new.3" => [ + "doc/man3/DH_new.pod" + ], + "doc/man/man3/DH_new_by_nid.3" => [ + "doc/man3/DH_new_by_nid.pod" + ], + "doc/man/man3/DH_set_method.3" => [ + "doc/man3/DH_set_method.pod" + ], + "doc/man/man3/DH_size.3" => [ + "doc/man3/DH_size.pod" + ], + "doc/man/man3/DSA_SIG_new.3" => [ + "doc/man3/DSA_SIG_new.pod" + ], + "doc/man/man3/DSA_do_sign.3" => [ + "doc/man3/DSA_do_sign.pod" + ], + "doc/man/man3/DSA_dup_DH.3" => [ + "doc/man3/DSA_dup_DH.pod" + ], + "doc/man/man3/DSA_generate_key.3" => [ + "doc/man3/DSA_generate_key.pod" + ], + "doc/man/man3/DSA_generate_parameters.3" => [ + "doc/man3/DSA_generate_parameters.pod" + ], + "doc/man/man3/DSA_get0_pqg.3" => [ + "doc/man3/DSA_get0_pqg.pod" + ], + "doc/man/man3/DSA_meth_new.3" => [ + "doc/man3/DSA_meth_new.pod" + ], + "doc/man/man3/DSA_new.3" => [ + "doc/man3/DSA_new.pod" + ], + "doc/man/man3/DSA_set_method.3" => [ + "doc/man3/DSA_set_method.pod" + ], + "doc/man/man3/DSA_sign.3" => [ + "doc/man3/DSA_sign.pod" + ], + "doc/man/man3/DSA_size.3" => [ + "doc/man3/DSA_size.pod" + ], + "doc/man/man3/DTLS_get_data_mtu.3" => [ + "doc/man3/DTLS_get_data_mtu.pod" + ], + "doc/man/man3/DTLS_set_timer_cb.3" => [ + "doc/man3/DTLS_set_timer_cb.pod" + ], + "doc/man/man3/DTLSv1_get_timeout.3" => [ + "doc/man3/DTLSv1_get_timeout.pod" + ], + "doc/man/man3/DTLSv1_handle_timeout.3" => [ + "doc/man3/DTLSv1_handle_timeout.pod" + ], + "doc/man/man3/DTLSv1_listen.3" => [ + "doc/man3/DTLSv1_listen.pod" + ], + "doc/man/man3/ECDSA_SIG_new.3" => [ + "doc/man3/ECDSA_SIG_new.pod" + ], + "doc/man/man3/ECDSA_sign.3" => [ + "doc/man3/ECDSA_sign.pod" + ], + "doc/man/man3/ECPKParameters_print.3" => [ + "doc/man3/ECPKParameters_print.pod" + ], + "doc/man/man3/EC_GFp_simple_method.3" => [ + "doc/man3/EC_GFp_simple_method.pod" + ], + "doc/man/man3/EC_GROUP_copy.3" => [ + "doc/man3/EC_GROUP_copy.pod" + ], + "doc/man/man3/EC_GROUP_new.3" => [ + "doc/man3/EC_GROUP_new.pod" + ], + "doc/man/man3/EC_KEY_get_enc_flags.3" => [ + "doc/man3/EC_KEY_get_enc_flags.pod" + ], + "doc/man/man3/EC_KEY_new.3" => [ + "doc/man3/EC_KEY_new.pod" + ], + "doc/man/man3/EC_POINT_add.3" => [ + "doc/man3/EC_POINT_add.pod" + ], + "doc/man/man3/EC_POINT_new.3" => [ + "doc/man3/EC_POINT_new.pod" + ], + "doc/man/man3/ENGINE_add.3" => [ + "doc/man3/ENGINE_add.pod" + ], + "doc/man/man3/ERR_GET_LIB.3" => [ + "doc/man3/ERR_GET_LIB.pod" + ], + "doc/man/man3/ERR_clear_error.3" => [ + "doc/man3/ERR_clear_error.pod" + ], + "doc/man/man3/ERR_error_string.3" => [ + "doc/man3/ERR_error_string.pod" + ], + "doc/man/man3/ERR_get_error.3" => [ + "doc/man3/ERR_get_error.pod" + ], + "doc/man/man3/ERR_load_crypto_strings.3" => [ + "doc/man3/ERR_load_crypto_strings.pod" + ], + "doc/man/man3/ERR_load_strings.3" => [ + "doc/man3/ERR_load_strings.pod" + ], + "doc/man/man3/ERR_new.3" => [ + "doc/man3/ERR_new.pod" + ], + "doc/man/man3/ERR_print_errors.3" => [ + "doc/man3/ERR_print_errors.pod" + ], + "doc/man/man3/ERR_put_error.3" => [ + "doc/man3/ERR_put_error.pod" + ], + "doc/man/man3/ERR_remove_state.3" => [ + "doc/man3/ERR_remove_state.pod" + ], + "doc/man/man3/ERR_set_mark.3" => [ + "doc/man3/ERR_set_mark.pod" + ], + "doc/man/man3/EVP_ASYM_CIPHER_free.3" => [ + "doc/man3/EVP_ASYM_CIPHER_free.pod" + ], + "doc/man/man3/EVP_BytesToKey.3" => [ + "doc/man3/EVP_BytesToKey.pod" + ], + "doc/man/man3/EVP_CIPHER_CTX_get_app_data.3" => [ + "doc/man3/EVP_CIPHER_CTX_get_app_data.pod" + ], + "doc/man/man3/EVP_CIPHER_CTX_get_cipher_data.3" => [ + "doc/man3/EVP_CIPHER_CTX_get_cipher_data.pod" + ], + "doc/man/man3/EVP_CIPHER_CTX_get_original_iv.3" => [ + "doc/man3/EVP_CIPHER_CTX_get_original_iv.pod" + ], + "doc/man/man3/EVP_CIPHER_meth_new.3" => [ + "doc/man3/EVP_CIPHER_meth_new.pod" + ], + "doc/man/man3/EVP_DigestInit.3" => [ + "doc/man3/EVP_DigestInit.pod" + ], + "doc/man/man3/EVP_DigestSignInit.3" => [ + "doc/man3/EVP_DigestSignInit.pod" + ], + "doc/man/man3/EVP_DigestVerifyInit.3" => [ + "doc/man3/EVP_DigestVerifyInit.pod" + ], + "doc/man/man3/EVP_EncodeInit.3" => [ + "doc/man3/EVP_EncodeInit.pod" + ], + "doc/man/man3/EVP_EncryptInit.3" => [ + "doc/man3/EVP_EncryptInit.pod" + ], + "doc/man/man3/EVP_KDF.3" => [ + "doc/man3/EVP_KDF.pod" + ], + "doc/man/man3/EVP_KEM_free.3" => [ + "doc/man3/EVP_KEM_free.pod" + ], + "doc/man/man3/EVP_KEYEXCH_free.3" => [ + "doc/man3/EVP_KEYEXCH_free.pod" + ], + "doc/man/man3/EVP_KEYMGMT.3" => [ + "doc/man3/EVP_KEYMGMT.pod" + ], + "doc/man/man3/EVP_MAC.3" => [ + "doc/man3/EVP_MAC.pod" + ], + "doc/man/man3/EVP_MD_meth_new.3" => [ + "doc/man3/EVP_MD_meth_new.pod" + ], + "doc/man/man3/EVP_OpenInit.3" => [ + "doc/man3/EVP_OpenInit.pod" + ], + "doc/man/man3/EVP_PBE_CipherInit.3" => [ + "doc/man3/EVP_PBE_CipherInit.pod" + ], + "doc/man/man3/EVP_PKEY2PKCS8.3" => [ + "doc/man3/EVP_PKEY2PKCS8.pod" + ], + "doc/man/man3/EVP_PKEY_ASN1_METHOD.3" => [ + "doc/man3/EVP_PKEY_ASN1_METHOD.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_ctrl.3" => [ + "doc/man3/EVP_PKEY_CTX_ctrl.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_get0_libctx.3" => [ + "doc/man3/EVP_PKEY_CTX_get0_libctx.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_get0_pkey.3" => [ + "doc/man3/EVP_PKEY_CTX_get0_pkey.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_get_algor.3" => [ + "doc/man3/EVP_PKEY_CTX_get_algor.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_new.3" => [ + "doc/man3/EVP_PKEY_CTX_new.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set1_pbe_pass.3" => [ + "doc/man3/EVP_PKEY_CTX_set1_pbe_pass.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_hkdf_md.3" => [ + "doc/man3/EVP_PKEY_CTX_set_hkdf_md.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_params.3" => [ + "doc/man3/EVP_PKEY_CTX_set_params.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.3" => [ + "doc/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_scrypt_N.3" => [ + "doc/man3/EVP_PKEY_CTX_set_scrypt_N.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_tls1_prf_md.3" => [ + "doc/man3/EVP_PKEY_CTX_set_tls1_prf_md.pod" + ], + "doc/man/man3/EVP_PKEY_asn1_get_count.3" => [ + "doc/man3/EVP_PKEY_asn1_get_count.pod" + ], + "doc/man/man3/EVP_PKEY_check.3" => [ + "doc/man3/EVP_PKEY_check.pod" + ], + "doc/man/man3/EVP_PKEY_copy_parameters.3" => [ + "doc/man3/EVP_PKEY_copy_parameters.pod" + ], + "doc/man/man3/EVP_PKEY_decapsulate.3" => [ + "doc/man3/EVP_PKEY_decapsulate.pod" + ], + "doc/man/man3/EVP_PKEY_decrypt.3" => [ + "doc/man3/EVP_PKEY_decrypt.pod" + ], + "doc/man/man3/EVP_PKEY_derive.3" => [ + "doc/man3/EVP_PKEY_derive.pod" + ], + "doc/man/man3/EVP_PKEY_digestsign_supports_digest.3" => [ + "doc/man3/EVP_PKEY_digestsign_supports_digest.pod" + ], + "doc/man/man3/EVP_PKEY_encapsulate.3" => [ + "doc/man3/EVP_PKEY_encapsulate.pod" + ], + "doc/man/man3/EVP_PKEY_encrypt.3" => [ + "doc/man3/EVP_PKEY_encrypt.pod" + ], + "doc/man/man3/EVP_PKEY_fromdata.3" => [ + "doc/man3/EVP_PKEY_fromdata.pod" + ], + "doc/man/man3/EVP_PKEY_get_attr.3" => [ + "doc/man3/EVP_PKEY_get_attr.pod" + ], + "doc/man/man3/EVP_PKEY_get_default_digest_nid.3" => [ + "doc/man3/EVP_PKEY_get_default_digest_nid.pod" + ], + "doc/man/man3/EVP_PKEY_get_field_type.3" => [ + "doc/man3/EVP_PKEY_get_field_type.pod" + ], + "doc/man/man3/EVP_PKEY_get_group_name.3" => [ + "doc/man3/EVP_PKEY_get_group_name.pod" + ], + "doc/man/man3/EVP_PKEY_get_size.3" => [ + "doc/man3/EVP_PKEY_get_size.pod" + ], + "doc/man/man3/EVP_PKEY_gettable_params.3" => [ + "doc/man3/EVP_PKEY_gettable_params.pod" + ], + "doc/man/man3/EVP_PKEY_is_a.3" => [ + "doc/man3/EVP_PKEY_is_a.pod" + ], + "doc/man/man3/EVP_PKEY_keygen.3" => [ + "doc/man3/EVP_PKEY_keygen.pod" + ], + "doc/man/man3/EVP_PKEY_meth_get_count.3" => [ + "doc/man3/EVP_PKEY_meth_get_count.pod" + ], + "doc/man/man3/EVP_PKEY_meth_new.3" => [ + "doc/man3/EVP_PKEY_meth_new.pod" + ], + "doc/man/man3/EVP_PKEY_new.3" => [ + "doc/man3/EVP_PKEY_new.pod" + ], + "doc/man/man3/EVP_PKEY_print_private.3" => [ + "doc/man3/EVP_PKEY_print_private.pod" + ], + "doc/man/man3/EVP_PKEY_set1_RSA.3" => [ + "doc/man3/EVP_PKEY_set1_RSA.pod" + ], + "doc/man/man3/EVP_PKEY_set1_encoded_public_key.3" => [ + "doc/man3/EVP_PKEY_set1_encoded_public_key.pod" + ], + "doc/man/man3/EVP_PKEY_set_type.3" => [ + "doc/man3/EVP_PKEY_set_type.pod" + ], + "doc/man/man3/EVP_PKEY_settable_params.3" => [ + "doc/man3/EVP_PKEY_settable_params.pod" + ], + "doc/man/man3/EVP_PKEY_sign.3" => [ + "doc/man3/EVP_PKEY_sign.pod" + ], + "doc/man/man3/EVP_PKEY_todata.3" => [ + "doc/man3/EVP_PKEY_todata.pod" + ], + "doc/man/man3/EVP_PKEY_verify.3" => [ + "doc/man3/EVP_PKEY_verify.pod" + ], + "doc/man/man3/EVP_PKEY_verify_recover.3" => [ + "doc/man3/EVP_PKEY_verify_recover.pod" + ], + "doc/man/man3/EVP_RAND.3" => [ + "doc/man3/EVP_RAND.pod" + ], + "doc/man/man3/EVP_SIGNATURE.3" => [ + "doc/man3/EVP_SIGNATURE.pod" + ], + "doc/man/man3/EVP_SKEY.3" => [ + "doc/man3/EVP_SKEY.pod" + ], + "doc/man/man3/EVP_SKEYMGMT.3" => [ + "doc/man3/EVP_SKEYMGMT.pod" + ], + "doc/man/man3/EVP_SealInit.3" => [ + "doc/man3/EVP_SealInit.pod" + ], + "doc/man/man3/EVP_SignInit.3" => [ + "doc/man3/EVP_SignInit.pod" + ], + "doc/man/man3/EVP_VerifyInit.3" => [ + "doc/man3/EVP_VerifyInit.pod" + ], + "doc/man/man3/EVP_aes_128_gcm.3" => [ + "doc/man3/EVP_aes_128_gcm.pod" + ], + "doc/man/man3/EVP_aria_128_gcm.3" => [ + "doc/man3/EVP_aria_128_gcm.pod" + ], + "doc/man/man3/EVP_bf_cbc.3" => [ + "doc/man3/EVP_bf_cbc.pod" + ], + "doc/man/man3/EVP_blake2b512.3" => [ + "doc/man3/EVP_blake2b512.pod" + ], + "doc/man/man3/EVP_camellia_128_ecb.3" => [ + "doc/man3/EVP_camellia_128_ecb.pod" + ], + "doc/man/man3/EVP_cast5_cbc.3" => [ + "doc/man3/EVP_cast5_cbc.pod" + ], + "doc/man/man3/EVP_chacha20.3" => [ + "doc/man3/EVP_chacha20.pod" + ], + "doc/man/man3/EVP_des_cbc.3" => [ + "doc/man3/EVP_des_cbc.pod" + ], + "doc/man/man3/EVP_desx_cbc.3" => [ + "doc/man3/EVP_desx_cbc.pod" + ], + "doc/man/man3/EVP_idea_cbc.3" => [ + "doc/man3/EVP_idea_cbc.pod" + ], + "doc/man/man3/EVP_md2.3" => [ + "doc/man3/EVP_md2.pod" + ], + "doc/man/man3/EVP_md4.3" => [ + "doc/man3/EVP_md4.pod" + ], + "doc/man/man3/EVP_md5.3" => [ + "doc/man3/EVP_md5.pod" + ], + "doc/man/man3/EVP_mdc2.3" => [ + "doc/man3/EVP_mdc2.pod" + ], + "doc/man/man3/EVP_rc2_cbc.3" => [ + "doc/man3/EVP_rc2_cbc.pod" + ], + "doc/man/man3/EVP_rc4.3" => [ + "doc/man3/EVP_rc4.pod" + ], + "doc/man/man3/EVP_rc5_32_12_16_cbc.3" => [ + "doc/man3/EVP_rc5_32_12_16_cbc.pod" + ], + "doc/man/man3/EVP_ripemd160.3" => [ + "doc/man3/EVP_ripemd160.pod" + ], + "doc/man/man3/EVP_seed_cbc.3" => [ + "doc/man3/EVP_seed_cbc.pod" + ], + "doc/man/man3/EVP_set_default_properties.3" => [ + "doc/man3/EVP_set_default_properties.pod" + ], + "doc/man/man3/EVP_sha1.3" => [ + "doc/man3/EVP_sha1.pod" + ], + "doc/man/man3/EVP_sha224.3" => [ + "doc/man3/EVP_sha224.pod" + ], + "doc/man/man3/EVP_sha3_224.3" => [ + "doc/man3/EVP_sha3_224.pod" + ], + "doc/man/man3/EVP_sm3.3" => [ + "doc/man3/EVP_sm3.pod" + ], + "doc/man/man3/EVP_sm4_cbc.3" => [ + "doc/man3/EVP_sm4_cbc.pod" + ], + "doc/man/man3/EVP_whirlpool.3" => [ + "doc/man3/EVP_whirlpool.pod" + ], + "doc/man/man3/GENERAL_NAME.3" => [ + "doc/man3/GENERAL_NAME.pod" + ], + "doc/man/man3/HMAC.3" => [ + "doc/man3/HMAC.pod" + ], + "doc/man/man3/MD5.3" => [ + "doc/man3/MD5.pod" + ], + "doc/man/man3/MDC2_Init.3" => [ + "doc/man3/MDC2_Init.pod" + ], + "doc/man/man3/NCONF_new_ex.3" => [ + "doc/man3/NCONF_new_ex.pod" + ], + "doc/man/man3/OBJ_nid2obj.3" => [ + "doc/man3/OBJ_nid2obj.pod" + ], + "doc/man/man3/OCSP_REQUEST_new.3" => [ + "doc/man3/OCSP_REQUEST_new.pod" + ], + "doc/man/man3/OCSP_cert_to_id.3" => [ + "doc/man3/OCSP_cert_to_id.pod" + ], + "doc/man/man3/OCSP_request_add1_nonce.3" => [ + "doc/man3/OCSP_request_add1_nonce.pod" + ], + "doc/man/man3/OCSP_resp_find_status.3" => [ + "doc/man3/OCSP_resp_find_status.pod" + ], + "doc/man/man3/OCSP_response_status.3" => [ + "doc/man3/OCSP_response_status.pod" + ], + "doc/man/man3/OCSP_sendreq_new.3" => [ + "doc/man3/OCSP_sendreq_new.pod" + ], + "doc/man/man3/OPENSSL_Applink.3" => [ + "doc/man3/OPENSSL_Applink.pod" + ], + "doc/man/man3/OPENSSL_FILE.3" => [ + "doc/man3/OPENSSL_FILE.pod" + ], + "doc/man/man3/OPENSSL_LH_COMPFUNC.3" => [ + "doc/man3/OPENSSL_LH_COMPFUNC.pod" + ], + "doc/man/man3/OPENSSL_LH_stats.3" => [ + "doc/man3/OPENSSL_LH_stats.pod" + ], + "doc/man/man3/OPENSSL_config.3" => [ + "doc/man3/OPENSSL_config.pod" + ], + "doc/man/man3/OPENSSL_fork_prepare.3" => [ + "doc/man3/OPENSSL_fork_prepare.pod" + ], + "doc/man/man3/OPENSSL_gmtime.3" => [ + "doc/man3/OPENSSL_gmtime.pod" + ], + "doc/man/man3/OPENSSL_hexchar2int.3" => [ + "doc/man3/OPENSSL_hexchar2int.pod" + ], + "doc/man/man3/OPENSSL_ia32cap.3" => [ + "doc/man3/OPENSSL_ia32cap.pod" + ], + "doc/man/man3/OPENSSL_init_crypto.3" => [ + "doc/man3/OPENSSL_init_crypto.pod" + ], + "doc/man/man3/OPENSSL_init_ssl.3" => [ + "doc/man3/OPENSSL_init_ssl.pod" + ], + "doc/man/man3/OPENSSL_instrument_bus.3" => [ + "doc/man3/OPENSSL_instrument_bus.pod" + ], + "doc/man/man3/OPENSSL_load_builtin_modules.3" => [ + "doc/man3/OPENSSL_load_builtin_modules.pod" + ], + "doc/man/man3/OPENSSL_load_u16_le.3" => [ + "doc/man3/OPENSSL_load_u16_le.pod" + ], + "doc/man/man3/OPENSSL_malloc.3" => [ + "doc/man3/OPENSSL_malloc.pod" + ], + "doc/man/man3/OPENSSL_ppccap.3" => [ + "doc/man3/OPENSSL_ppccap.pod" + ], + "doc/man/man3/OPENSSL_riscvcap.3" => [ + "doc/man3/OPENSSL_riscvcap.pod" + ], + "doc/man/man3/OPENSSL_s390xcap.3" => [ + "doc/man3/OPENSSL_s390xcap.pod" + ], + "doc/man/man3/OPENSSL_secure_malloc.3" => [ + "doc/man3/OPENSSL_secure_malloc.pod" + ], + "doc/man/man3/OPENSSL_strcasecmp.3" => [ + "doc/man3/OPENSSL_strcasecmp.pod" + ], + "doc/man/man3/OSSL_ALGORITHM.3" => [ + "doc/man3/OSSL_ALGORITHM.pod" + ], + "doc/man/man3/OSSL_CALLBACK.3" => [ + "doc/man3/OSSL_CALLBACK.pod" + ], + "doc/man/man3/OSSL_CMP_ATAV_set0.3" => [ + "doc/man3/OSSL_CMP_ATAV_set0.pod" + ], + "doc/man/man3/OSSL_CMP_CTX_new.3" => [ + "doc/man3/OSSL_CMP_CTX_new.pod" + ], + "doc/man/man3/OSSL_CMP_HDR_get0_transactionID.3" => [ + "doc/man3/OSSL_CMP_HDR_get0_transactionID.pod" + ], + "doc/man/man3/OSSL_CMP_ITAV_new_caCerts.3" => [ + "doc/man3/OSSL_CMP_ITAV_new_caCerts.pod" + ], + "doc/man/man3/OSSL_CMP_ITAV_set0.3" => [ + "doc/man3/OSSL_CMP_ITAV_set0.pod" + ], + "doc/man/man3/OSSL_CMP_MSG_get0_header.3" => [ + "doc/man3/OSSL_CMP_MSG_get0_header.pod" + ], + "doc/man/man3/OSSL_CMP_MSG_http_perform.3" => [ + "doc/man3/OSSL_CMP_MSG_http_perform.pod" + ], + "doc/man/man3/OSSL_CMP_SRV_CTX_new.3" => [ + "doc/man3/OSSL_CMP_SRV_CTX_new.pod" + ], + "doc/man/man3/OSSL_CMP_STATUSINFO_new.3" => [ + "doc/man3/OSSL_CMP_STATUSINFO_new.pod" + ], + "doc/man/man3/OSSL_CMP_exec_certreq.3" => [ + "doc/man3/OSSL_CMP_exec_certreq.pod" + ], + "doc/man/man3/OSSL_CMP_log_open.3" => [ + "doc/man3/OSSL_CMP_log_open.pod" + ], + "doc/man/man3/OSSL_CMP_validate_msg.3" => [ + "doc/man3/OSSL_CMP_validate_msg.pod" + ], + "doc/man/man3/OSSL_CORE_MAKE_FUNC.3" => [ + "doc/man3/OSSL_CORE_MAKE_FUNC.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_get0_tmpl.3" => [ + "doc/man3/OSSL_CRMF_MSG_get0_tmpl.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_set0_validity.3" => [ + "doc/man3/OSSL_CRMF_MSG_set0_validity.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.3" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.3" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.pod" + ], + "doc/man/man3/OSSL_CRMF_pbmp_new.3" => [ + "doc/man3/OSSL_CRMF_pbmp_new.pod" + ], + "doc/man/man3/OSSL_DECODER.3" => [ + "doc/man3/OSSL_DECODER.pod" + ], + "doc/man/man3/OSSL_DECODER_CTX.3" => [ + "doc/man3/OSSL_DECODER_CTX.pod" + ], + "doc/man/man3/OSSL_DECODER_CTX_new_for_pkey.3" => [ + "doc/man3/OSSL_DECODER_CTX_new_for_pkey.pod" + ], + "doc/man/man3/OSSL_DECODER_from_bio.3" => [ + "doc/man3/OSSL_DECODER_from_bio.pod" + ], + "doc/man/man3/OSSL_DISPATCH.3" => [ + "doc/man3/OSSL_DISPATCH.pod" + ], + "doc/man/man3/OSSL_ENCODER.3" => [ + "doc/man3/OSSL_ENCODER.pod" + ], + "doc/man/man3/OSSL_ENCODER_CTX.3" => [ + "doc/man3/OSSL_ENCODER_CTX.pod" + ], + "doc/man/man3/OSSL_ENCODER_CTX_new_for_pkey.3" => [ + "doc/man3/OSSL_ENCODER_CTX_new_for_pkey.pod" + ], + "doc/man/man3/OSSL_ENCODER_to_bio.3" => [ + "doc/man3/OSSL_ENCODER_to_bio.pod" + ], + "doc/man/man3/OSSL_ERR_STATE_save.3" => [ + "doc/man3/OSSL_ERR_STATE_save.pod" + ], + "doc/man/man3/OSSL_ESS_check_signing_certs.3" => [ + "doc/man3/OSSL_ESS_check_signing_certs.pod" + ], + "doc/man/man3/OSSL_GENERAL_NAMES_print.3" => [ + "doc/man3/OSSL_GENERAL_NAMES_print.pod" + ], + "doc/man/man3/OSSL_HPKE_CTX_new.3" => [ + "doc/man3/OSSL_HPKE_CTX_new.pod" + ], + "doc/man/man3/OSSL_HTTP_REQ_CTX.3" => [ + "doc/man3/OSSL_HTTP_REQ_CTX.pod" + ], + "doc/man/man3/OSSL_HTTP_parse_url.3" => [ + "doc/man3/OSSL_HTTP_parse_url.pod" + ], + "doc/man/man3/OSSL_HTTP_transfer.3" => [ + "doc/man3/OSSL_HTTP_transfer.pod" + ], + "doc/man/man3/OSSL_IETF_ATTR_SYNTAX.3" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX.pod" + ], + "doc/man/man3/OSSL_IETF_ATTR_SYNTAX_print.3" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX_print.pod" + ], + "doc/man/man3/OSSL_INDICATOR_set_callback.3" => [ + "doc/man3/OSSL_INDICATOR_set_callback.pod" + ], + "doc/man/man3/OSSL_ITEM.3" => [ + "doc/man3/OSSL_ITEM.pod" + ], + "doc/man/man3/OSSL_LIB_CTX.3" => [ + "doc/man3/OSSL_LIB_CTX.pod" + ], + "doc/man/man3/OSSL_LIB_CTX_set_conf_diagnostics.3" => [ + "doc/man3/OSSL_LIB_CTX_set_conf_diagnostics.pod" + ], + "doc/man/man3/OSSL_PARAM.3" => [ + "doc/man3/OSSL_PARAM.pod" + ], + "doc/man/man3/OSSL_PARAM_BLD.3" => [ + "doc/man3/OSSL_PARAM_BLD.pod" + ], + "doc/man/man3/OSSL_PARAM_allocate_from_text.3" => [ + "doc/man3/OSSL_PARAM_allocate_from_text.pod" + ], + "doc/man/man3/OSSL_PARAM_dup.3" => [ + "doc/man3/OSSL_PARAM_dup.pod" + ], + "doc/man/man3/OSSL_PARAM_int.3" => [ + "doc/man3/OSSL_PARAM_int.pod" + ], + "doc/man/man3/OSSL_PARAM_print_to_bio.3" => [ + "doc/man3/OSSL_PARAM_print_to_bio.pod" + ], + "doc/man/man3/OSSL_PROVIDER.3" => [ + "doc/man3/OSSL_PROVIDER.pod" + ], + "doc/man/man3/OSSL_QUIC_client_method.3" => [ + "doc/man3/OSSL_QUIC_client_method.pod" + ], + "doc/man/man3/OSSL_SELF_TEST_new.3" => [ + "doc/man3/OSSL_SELF_TEST_new.pod" + ], + "doc/man/man3/OSSL_SELF_TEST_set_callback.3" => [ + "doc/man3/OSSL_SELF_TEST_set_callback.pod" + ], + "doc/man/man3/OSSL_STORE_INFO.3" => [ + "doc/man3/OSSL_STORE_INFO.pod" + ], + "doc/man/man3/OSSL_STORE_LOADER.3" => [ + "doc/man3/OSSL_STORE_LOADER.pod" + ], + "doc/man/man3/OSSL_STORE_SEARCH.3" => [ + "doc/man3/OSSL_STORE_SEARCH.pod" + ], + "doc/man/man3/OSSL_STORE_attach.3" => [ + "doc/man3/OSSL_STORE_attach.pod" + ], + "doc/man/man3/OSSL_STORE_expect.3" => [ + "doc/man3/OSSL_STORE_expect.pod" + ], + "doc/man/man3/OSSL_STORE_open.3" => [ + "doc/man3/OSSL_STORE_open.pod" + ], + "doc/man/man3/OSSL_sleep.3" => [ + "doc/man3/OSSL_sleep.pod" + ], + "doc/man/man3/OSSL_trace_enabled.3" => [ + "doc/man3/OSSL_trace_enabled.pod" + ], + "doc/man/man3/OSSL_trace_get_category_num.3" => [ + "doc/man3/OSSL_trace_get_category_num.pod" + ], + "doc/man/man3/OSSL_trace_set_channel.3" => [ + "doc/man3/OSSL_trace_set_channel.pod" + ], + "doc/man/man3/OpenSSL_add_all_algorithms.3" => [ + "doc/man3/OpenSSL_add_all_algorithms.pod" + ], + "doc/man/man3/OpenSSL_version.3" => [ + "doc/man3/OpenSSL_version.pod" + ], + "doc/man/man3/PBMAC1_get1_pbkdf2_param.3" => [ + "doc/man3/PBMAC1_get1_pbkdf2_param.pod" + ], + "doc/man/man3/PEM_X509_INFO_read_bio_ex.3" => [ + "doc/man3/PEM_X509_INFO_read_bio_ex.pod" + ], + "doc/man/man3/PEM_bytes_read_bio.3" => [ + "doc/man3/PEM_bytes_read_bio.pod" + ], + "doc/man/man3/PEM_read.3" => [ + "doc/man3/PEM_read.pod" + ], + "doc/man/man3/PEM_read_CMS.3" => [ + "doc/man3/PEM_read_CMS.pod" + ], + "doc/man/man3/PEM_read_bio_PrivateKey.3" => [ + "doc/man3/PEM_read_bio_PrivateKey.pod" + ], + "doc/man/man3/PEM_read_bio_ex.3" => [ + "doc/man3/PEM_read_bio_ex.pod" + ], + "doc/man/man3/PEM_write_bio_CMS_stream.3" => [ + "doc/man3/PEM_write_bio_CMS_stream.pod" + ], + "doc/man/man3/PEM_write_bio_PKCS7_stream.3" => [ + "doc/man3/PEM_write_bio_PKCS7_stream.pod" + ], + "doc/man/man3/PKCS12_PBE_keyivgen.3" => [ + "doc/man3/PKCS12_PBE_keyivgen.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_create_cert.3" => [ + "doc/man3/PKCS12_SAFEBAG_create_cert.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_get0_attrs.3" => [ + "doc/man3/PKCS12_SAFEBAG_get0_attrs.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_get1_cert.3" => [ + "doc/man3/PKCS12_SAFEBAG_get1_cert.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_set0_attrs.3" => [ + "doc/man3/PKCS12_SAFEBAG_set0_attrs.pod" + ], + "doc/man/man3/PKCS12_add1_attr_by_NID.3" => [ + "doc/man3/PKCS12_add1_attr_by_NID.pod" + ], + "doc/man/man3/PKCS12_add_CSPName_asc.3" => [ + "doc/man3/PKCS12_add_CSPName_asc.pod" + ], + "doc/man/man3/PKCS12_add_cert.3" => [ + "doc/man3/PKCS12_add_cert.pod" + ], + "doc/man/man3/PKCS12_add_friendlyname_asc.3" => [ + "doc/man3/PKCS12_add_friendlyname_asc.pod" + ], + "doc/man/man3/PKCS12_add_localkeyid.3" => [ + "doc/man3/PKCS12_add_localkeyid.pod" + ], + "doc/man/man3/PKCS12_add_safe.3" => [ + "doc/man3/PKCS12_add_safe.pod" + ], + "doc/man/man3/PKCS12_create.3" => [ + "doc/man3/PKCS12_create.pod" + ], + "doc/man/man3/PKCS12_decrypt_skey.3" => [ + "doc/man3/PKCS12_decrypt_skey.pod" + ], + "doc/man/man3/PKCS12_gen_mac.3" => [ + "doc/man3/PKCS12_gen_mac.pod" + ], + "doc/man/man3/PKCS12_get_friendlyname.3" => [ + "doc/man3/PKCS12_get_friendlyname.pod" + ], + "doc/man/man3/PKCS12_init.3" => [ + "doc/man3/PKCS12_init.pod" + ], + "doc/man/man3/PKCS12_item_decrypt_d2i.3" => [ + "doc/man3/PKCS12_item_decrypt_d2i.pod" + ], + "doc/man/man3/PKCS12_key_gen_utf8_ex.3" => [ + "doc/man3/PKCS12_key_gen_utf8_ex.pod" + ], + "doc/man/man3/PKCS12_newpass.3" => [ + "doc/man3/PKCS12_newpass.pod" + ], + "doc/man/man3/PKCS12_pack_p7encdata.3" => [ + "doc/man3/PKCS12_pack_p7encdata.pod" + ], + "doc/man/man3/PKCS12_parse.3" => [ + "doc/man3/PKCS12_parse.pod" + ], + "doc/man/man3/PKCS5_PBE_keyivgen.3" => [ + "doc/man3/PKCS5_PBE_keyivgen.pod" + ], + "doc/man/man3/PKCS5_PBKDF2_HMAC.3" => [ + "doc/man3/PKCS5_PBKDF2_HMAC.pod" + ], + "doc/man/man3/PKCS7_decrypt.3" => [ + "doc/man3/PKCS7_decrypt.pod" + ], + "doc/man/man3/PKCS7_encrypt.3" => [ + "doc/man3/PKCS7_encrypt.pod" + ], + "doc/man/man3/PKCS7_get_octet_string.3" => [ + "doc/man3/PKCS7_get_octet_string.pod" + ], + "doc/man/man3/PKCS7_sign.3" => [ + "doc/man3/PKCS7_sign.pod" + ], + "doc/man/man3/PKCS7_sign_add_signer.3" => [ + "doc/man3/PKCS7_sign_add_signer.pod" + ], + "doc/man/man3/PKCS7_type_is_other.3" => [ + "doc/man3/PKCS7_type_is_other.pod" + ], + "doc/man/man3/PKCS7_verify.3" => [ + "doc/man3/PKCS7_verify.pod" + ], + "doc/man/man3/PKCS8_encrypt.3" => [ + "doc/man3/PKCS8_encrypt.pod" + ], + "doc/man/man3/PKCS8_pkey_add1_attr.3" => [ + "doc/man3/PKCS8_pkey_add1_attr.pod" + ], + "doc/man/man3/RAND_add.3" => [ + "doc/man3/RAND_add.pod" + ], + "doc/man/man3/RAND_bytes.3" => [ + "doc/man3/RAND_bytes.pod" + ], + "doc/man/man3/RAND_cleanup.3" => [ + "doc/man3/RAND_cleanup.pod" + ], + "doc/man/man3/RAND_egd.3" => [ + "doc/man3/RAND_egd.pod" + ], + "doc/man/man3/RAND_get0_primary.3" => [ + "doc/man3/RAND_get0_primary.pod" + ], + "doc/man/man3/RAND_load_file.3" => [ + "doc/man3/RAND_load_file.pod" + ], + "doc/man/man3/RAND_set_DRBG_type.3" => [ + "doc/man3/RAND_set_DRBG_type.pod" + ], + "doc/man/man3/RAND_set_rand_method.3" => [ + "doc/man3/RAND_set_rand_method.pod" + ], + "doc/man/man3/RC4_set_key.3" => [ + "doc/man3/RC4_set_key.pod" + ], + "doc/man/man3/RIPEMD160_Init.3" => [ + "doc/man3/RIPEMD160_Init.pod" + ], + "doc/man/man3/RSA_blinding_on.3" => [ + "doc/man3/RSA_blinding_on.pod" + ], + "doc/man/man3/RSA_check_key.3" => [ + "doc/man3/RSA_check_key.pod" + ], + "doc/man/man3/RSA_generate_key.3" => [ + "doc/man3/RSA_generate_key.pod" + ], + "doc/man/man3/RSA_get0_key.3" => [ + "doc/man3/RSA_get0_key.pod" + ], + "doc/man/man3/RSA_meth_new.3" => [ + "doc/man3/RSA_meth_new.pod" + ], + "doc/man/man3/RSA_new.3" => [ + "doc/man3/RSA_new.pod" + ], + "doc/man/man3/RSA_padding_add_PKCS1_type_1.3" => [ + "doc/man3/RSA_padding_add_PKCS1_type_1.pod" + ], + "doc/man/man3/RSA_print.3" => [ + "doc/man3/RSA_print.pod" + ], + "doc/man/man3/RSA_private_encrypt.3" => [ + "doc/man3/RSA_private_encrypt.pod" + ], + "doc/man/man3/RSA_public_encrypt.3" => [ + "doc/man3/RSA_public_encrypt.pod" + ], + "doc/man/man3/RSA_set_method.3" => [ + "doc/man3/RSA_set_method.pod" + ], + "doc/man/man3/RSA_sign.3" => [ + "doc/man3/RSA_sign.pod" + ], + "doc/man/man3/RSA_sign_ASN1_OCTET_STRING.3" => [ + "doc/man3/RSA_sign_ASN1_OCTET_STRING.pod" + ], + "doc/man/man3/RSA_size.3" => [ + "doc/man3/RSA_size.pod" + ], + "doc/man/man3/SCT_new.3" => [ + "doc/man3/SCT_new.pod" + ], + "doc/man/man3/SCT_print.3" => [ + "doc/man3/SCT_print.pod" + ], + "doc/man/man3/SCT_validate.3" => [ + "doc/man3/SCT_validate.pod" + ], + "doc/man/man3/SHA256_Init.3" => [ + "doc/man3/SHA256_Init.pod" + ], + "doc/man/man3/SMIME_read_ASN1.3" => [ + "doc/man3/SMIME_read_ASN1.pod" + ], + "doc/man/man3/SMIME_read_CMS.3" => [ + "doc/man3/SMIME_read_CMS.pod" + ], + "doc/man/man3/SMIME_read_PKCS7.3" => [ + "doc/man3/SMIME_read_PKCS7.pod" + ], + "doc/man/man3/SMIME_write_ASN1.3" => [ + "doc/man3/SMIME_write_ASN1.pod" + ], + "doc/man/man3/SMIME_write_CMS.3" => [ + "doc/man3/SMIME_write_CMS.pod" + ], + "doc/man/man3/SMIME_write_PKCS7.3" => [ + "doc/man3/SMIME_write_PKCS7.pod" + ], + "doc/man/man3/SRP_Calc_B.3" => [ + "doc/man3/SRP_Calc_B.pod" + ], + "doc/man/man3/SRP_VBASE_new.3" => [ + "doc/man3/SRP_VBASE_new.pod" + ], + "doc/man/man3/SRP_create_verifier.3" => [ + "doc/man3/SRP_create_verifier.pod" + ], + "doc/man/man3/SRP_user_pwd_new.3" => [ + "doc/man3/SRP_user_pwd_new.pod" + ], + "doc/man/man3/SSL_CIPHER_get_name.3" => [ + "doc/man3/SSL_CIPHER_get_name.pod" + ], + "doc/man/man3/SSL_COMP_add_compression_method.3" => [ + "doc/man3/SSL_COMP_add_compression_method.pod" + ], + "doc/man/man3/SSL_CONF_CTX_new.3" => [ + "doc/man3/SSL_CONF_CTX_new.pod" + ], + "doc/man/man3/SSL_CONF_CTX_set1_prefix.3" => [ + "doc/man3/SSL_CONF_CTX_set1_prefix.pod" + ], + "doc/man/man3/SSL_CONF_CTX_set_flags.3" => [ + "doc/man3/SSL_CONF_CTX_set_flags.pod" + ], + "doc/man/man3/SSL_CONF_CTX_set_ssl_ctx.3" => [ + "doc/man3/SSL_CONF_CTX_set_ssl_ctx.pod" + ], + "doc/man/man3/SSL_CONF_cmd.3" => [ + "doc/man3/SSL_CONF_cmd.pod" + ], + "doc/man/man3/SSL_CONF_cmd_argv.3" => [ + "doc/man3/SSL_CONF_cmd_argv.pod" + ], + "doc/man/man3/SSL_CTX_add1_chain_cert.3" => [ + "doc/man3/SSL_CTX_add1_chain_cert.pod" + ], + "doc/man/man3/SSL_CTX_add_extra_chain_cert.3" => [ + "doc/man3/SSL_CTX_add_extra_chain_cert.pod" + ], + "doc/man/man3/SSL_CTX_add_session.3" => [ + "doc/man3/SSL_CTX_add_session.pod" + ], + "doc/man/man3/SSL_CTX_config.3" => [ + "doc/man3/SSL_CTX_config.pod" + ], + "doc/man/man3/SSL_CTX_ctrl.3" => [ + "doc/man3/SSL_CTX_ctrl.pod" + ], + "doc/man/man3/SSL_CTX_dane_enable.3" => [ + "doc/man3/SSL_CTX_dane_enable.pod" + ], + "doc/man/man3/SSL_CTX_flush_sessions.3" => [ + "doc/man3/SSL_CTX_flush_sessions.pod" + ], + "doc/man/man3/SSL_CTX_free.3" => [ + "doc/man3/SSL_CTX_free.pod" + ], + "doc/man/man3/SSL_CTX_get0_param.3" => [ + "doc/man3/SSL_CTX_get0_param.pod" + ], + "doc/man/man3/SSL_CTX_get_verify_mode.3" => [ + "doc/man3/SSL_CTX_get_verify_mode.pod" + ], + "doc/man/man3/SSL_CTX_has_client_custom_ext.3" => [ + "doc/man3/SSL_CTX_has_client_custom_ext.pod" + ], + "doc/man/man3/SSL_CTX_load_verify_locations.3" => [ + "doc/man3/SSL_CTX_load_verify_locations.pod" + ], + "doc/man/man3/SSL_CTX_new.3" => [ + "doc/man3/SSL_CTX_new.pod" + ], + "doc/man/man3/SSL_CTX_sess_number.3" => [ + "doc/man3/SSL_CTX_sess_number.pod" + ], + "doc/man/man3/SSL_CTX_sess_set_cache_size.3" => [ + "doc/man3/SSL_CTX_sess_set_cache_size.pod" + ], + "doc/man/man3/SSL_CTX_sess_set_get_cb.3" => [ + "doc/man3/SSL_CTX_sess_set_get_cb.pod" + ], + "doc/man/man3/SSL_CTX_sessions.3" => [ + "doc/man3/SSL_CTX_sessions.pod" + ], + "doc/man/man3/SSL_CTX_set0_CA_list.3" => [ + "doc/man3/SSL_CTX_set0_CA_list.pod" + ], + "doc/man/man3/SSL_CTX_set1_cert_comp_preference.3" => [ + "doc/man3/SSL_CTX_set1_cert_comp_preference.pod" + ], + "doc/man/man3/SSL_CTX_set1_curves.3" => [ + "doc/man3/SSL_CTX_set1_curves.pod" + ], + "doc/man/man3/SSL_CTX_set1_sigalgs.3" => [ + "doc/man3/SSL_CTX_set1_sigalgs.pod" + ], + "doc/man/man3/SSL_CTX_set1_verify_cert_store.3" => [ + "doc/man3/SSL_CTX_set1_verify_cert_store.pod" + ], + "doc/man/man3/SSL_CTX_set_alpn_select_cb.3" => [ + "doc/man3/SSL_CTX_set_alpn_select_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_cert_cb.3" => [ + "doc/man3/SSL_CTX_set_cert_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_cert_store.3" => [ + "doc/man3/SSL_CTX_set_cert_store.pod" + ], + "doc/man/man3/SSL_CTX_set_cert_verify_callback.3" => [ + "doc/man3/SSL_CTX_set_cert_verify_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_cipher_list.3" => [ + "doc/man3/SSL_CTX_set_cipher_list.pod" + ], + "doc/man/man3/SSL_CTX_set_client_cert_cb.3" => [ + "doc/man3/SSL_CTX_set_client_cert_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_client_hello_cb.3" => [ + "doc/man3/SSL_CTX_set_client_hello_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_ct_validation_callback.3" => [ + "doc/man3/SSL_CTX_set_ct_validation_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_ctlog_list_file.3" => [ + "doc/man3/SSL_CTX_set_ctlog_list_file.pod" + ], + "doc/man/man3/SSL_CTX_set_default_passwd_cb.3" => [ + "doc/man3/SSL_CTX_set_default_passwd_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_domain_flags.3" => [ + "doc/man3/SSL_CTX_set_domain_flags.pod" + ], + "doc/man/man3/SSL_CTX_set_generate_session_id.3" => [ + "doc/man3/SSL_CTX_set_generate_session_id.pod" + ], + "doc/man/man3/SSL_CTX_set_info_callback.3" => [ + "doc/man3/SSL_CTX_set_info_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_keylog_callback.3" => [ + "doc/man3/SSL_CTX_set_keylog_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_max_cert_list.3" => [ + "doc/man3/SSL_CTX_set_max_cert_list.pod" + ], + "doc/man/man3/SSL_CTX_set_min_proto_version.3" => [ + "doc/man3/SSL_CTX_set_min_proto_version.pod" + ], + "doc/man/man3/SSL_CTX_set_mode.3" => [ + "doc/man3/SSL_CTX_set_mode.pod" + ], + "doc/man/man3/SSL_CTX_set_msg_callback.3" => [ + "doc/man3/SSL_CTX_set_msg_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_new_pending_conn_cb.3" => [ + "doc/man3/SSL_CTX_set_new_pending_conn_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_num_tickets.3" => [ + "doc/man3/SSL_CTX_set_num_tickets.pod" + ], + "doc/man/man3/SSL_CTX_set_options.3" => [ + "doc/man3/SSL_CTX_set_options.pod" + ], + "doc/man/man3/SSL_CTX_set_psk_client_callback.3" => [ + "doc/man3/SSL_CTX_set_psk_client_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_quiet_shutdown.3" => [ + "doc/man3/SSL_CTX_set_quiet_shutdown.pod" + ], + "doc/man/man3/SSL_CTX_set_read_ahead.3" => [ + "doc/man3/SSL_CTX_set_read_ahead.pod" + ], + "doc/man/man3/SSL_CTX_set_record_padding_callback.3" => [ + "doc/man3/SSL_CTX_set_record_padding_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_security_level.3" => [ + "doc/man3/SSL_CTX_set_security_level.pod" + ], + "doc/man/man3/SSL_CTX_set_session_cache_mode.3" => [ + "doc/man3/SSL_CTX_set_session_cache_mode.pod" + ], + "doc/man/man3/SSL_CTX_set_session_id_context.3" => [ + "doc/man3/SSL_CTX_set_session_id_context.pod" + ], + "doc/man/man3/SSL_CTX_set_session_ticket_cb.3" => [ + "doc/man3/SSL_CTX_set_session_ticket_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_split_send_fragment.3" => [ + "doc/man3/SSL_CTX_set_split_send_fragment.pod" + ], + "doc/man/man3/SSL_CTX_set_srp_password.3" => [ + "doc/man3/SSL_CTX_set_srp_password.pod" + ], + "doc/man/man3/SSL_CTX_set_ssl_version.3" => [ + "doc/man3/SSL_CTX_set_ssl_version.pod" + ], + "doc/man/man3/SSL_CTX_set_stateless_cookie_generate_cb.3" => [ + "doc/man3/SSL_CTX_set_stateless_cookie_generate_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_timeout.3" => [ + "doc/man3/SSL_CTX_set_timeout.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_servername_callback.3" => [ + "doc/man3/SSL_CTX_set_tlsext_servername_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_status_cb.3" => [ + "doc/man3/SSL_CTX_set_tlsext_status_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_ticket_key_cb.3" => [ + "doc/man3/SSL_CTX_set_tlsext_ticket_key_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_use_srtp.3" => [ + "doc/man3/SSL_CTX_set_tlsext_use_srtp.pod" + ], + "doc/man/man3/SSL_CTX_set_tmp_dh_callback.3" => [ + "doc/man3/SSL_CTX_set_tmp_dh_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_tmp_ecdh.3" => [ + "doc/man3/SSL_CTX_set_tmp_ecdh.pod" + ], + "doc/man/man3/SSL_CTX_set_verify.3" => [ + "doc/man3/SSL_CTX_set_verify.pod" + ], + "doc/man/man3/SSL_CTX_use_certificate.3" => [ + "doc/man3/SSL_CTX_use_certificate.pod" + ], + "doc/man/man3/SSL_CTX_use_psk_identity_hint.3" => [ + "doc/man3/SSL_CTX_use_psk_identity_hint.pod" + ], + "doc/man/man3/SSL_CTX_use_serverinfo.3" => [ + "doc/man3/SSL_CTX_use_serverinfo.pod" + ], + "doc/man/man3/SSL_SESSION_free.3" => [ + "doc/man3/SSL_SESSION_free.pod" + ], + "doc/man/man3/SSL_SESSION_get0_cipher.3" => [ + "doc/man3/SSL_SESSION_get0_cipher.pod" + ], + "doc/man/man3/SSL_SESSION_get0_hostname.3" => [ + "doc/man3/SSL_SESSION_get0_hostname.pod" + ], + "doc/man/man3/SSL_SESSION_get0_id_context.3" => [ + "doc/man3/SSL_SESSION_get0_id_context.pod" + ], + "doc/man/man3/SSL_SESSION_get0_peer.3" => [ + "doc/man3/SSL_SESSION_get0_peer.pod" + ], + "doc/man/man3/SSL_SESSION_get_compress_id.3" => [ + "doc/man3/SSL_SESSION_get_compress_id.pod" + ], + "doc/man/man3/SSL_SESSION_get_protocol_version.3" => [ + "doc/man3/SSL_SESSION_get_protocol_version.pod" + ], + "doc/man/man3/SSL_SESSION_get_time.3" => [ + "doc/man3/SSL_SESSION_get_time.pod" + ], + "doc/man/man3/SSL_SESSION_has_ticket.3" => [ + "doc/man3/SSL_SESSION_has_ticket.pod" + ], + "doc/man/man3/SSL_SESSION_is_resumable.3" => [ + "doc/man3/SSL_SESSION_is_resumable.pod" + ], + "doc/man/man3/SSL_SESSION_print.3" => [ + "doc/man3/SSL_SESSION_print.pod" + ], + "doc/man/man3/SSL_SESSION_set1_id.3" => [ + "doc/man3/SSL_SESSION_set1_id.pod" + ], + "doc/man/man3/SSL_accept.3" => [ + "doc/man3/SSL_accept.pod" + ], + "doc/man/man3/SSL_accept_stream.3" => [ + "doc/man3/SSL_accept_stream.pod" + ], + "doc/man/man3/SSL_alert_type_string.3" => [ + "doc/man3/SSL_alert_type_string.pod" + ], + "doc/man/man3/SSL_alloc_buffers.3" => [ + "doc/man3/SSL_alloc_buffers.pod" + ], + "doc/man/man3/SSL_check_chain.3" => [ + "doc/man3/SSL_check_chain.pod" + ], + "doc/man/man3/SSL_clear.3" => [ + "doc/man3/SSL_clear.pod" + ], + "doc/man/man3/SSL_connect.3" => [ + "doc/man3/SSL_connect.pod" + ], + "doc/man/man3/SSL_do_handshake.3" => [ + "doc/man3/SSL_do_handshake.pod" + ], + "doc/man/man3/SSL_export_keying_material.3" => [ + "doc/man3/SSL_export_keying_material.pod" + ], + "doc/man/man3/SSL_extension_supported.3" => [ + "doc/man3/SSL_extension_supported.pod" + ], + "doc/man/man3/SSL_free.3" => [ + "doc/man3/SSL_free.pod" + ], + "doc/man/man3/SSL_get0_connection.3" => [ + "doc/man3/SSL_get0_connection.pod" + ], + "doc/man/man3/SSL_get0_group_name.3" => [ + "doc/man3/SSL_get0_group_name.pod" + ], + "doc/man/man3/SSL_get0_peer_rpk.3" => [ + "doc/man3/SSL_get0_peer_rpk.pod" + ], + "doc/man/man3/SSL_get0_peer_scts.3" => [ + "doc/man3/SSL_get0_peer_scts.pod" + ], + "doc/man/man3/SSL_get1_builtin_sigalgs.3" => [ + "doc/man3/SSL_get1_builtin_sigalgs.pod" + ], + "doc/man/man3/SSL_get_SSL_CTX.3" => [ + "doc/man3/SSL_get_SSL_CTX.pod" + ], + "doc/man/man3/SSL_get_all_async_fds.3" => [ + "doc/man3/SSL_get_all_async_fds.pod" + ], + "doc/man/man3/SSL_get_certificate.3" => [ + "doc/man3/SSL_get_certificate.pod" + ], + "doc/man/man3/SSL_get_ciphers.3" => [ + "doc/man3/SSL_get_ciphers.pod" + ], + "doc/man/man3/SSL_get_client_random.3" => [ + "doc/man3/SSL_get_client_random.pod" + ], + "doc/man/man3/SSL_get_conn_close_info.3" => [ + "doc/man3/SSL_get_conn_close_info.pod" + ], + "doc/man/man3/SSL_get_current_cipher.3" => [ + "doc/man3/SSL_get_current_cipher.pod" + ], + "doc/man/man3/SSL_get_default_timeout.3" => [ + "doc/man3/SSL_get_default_timeout.pod" + ], + "doc/man/man3/SSL_get_error.3" => [ + "doc/man3/SSL_get_error.pod" + ], + "doc/man/man3/SSL_get_event_timeout.3" => [ + "doc/man3/SSL_get_event_timeout.pod" + ], + "doc/man/man3/SSL_get_extms_support.3" => [ + "doc/man3/SSL_get_extms_support.pod" + ], + "doc/man/man3/SSL_get_fd.3" => [ + "doc/man3/SSL_get_fd.pod" + ], + "doc/man/man3/SSL_get_handshake_rtt.3" => [ + "doc/man3/SSL_get_handshake_rtt.pod" + ], + "doc/man/man3/SSL_get_peer_cert_chain.3" => [ + "doc/man3/SSL_get_peer_cert_chain.pod" + ], + "doc/man/man3/SSL_get_peer_certificate.3" => [ + "doc/man3/SSL_get_peer_certificate.pod" + ], + "doc/man/man3/SSL_get_peer_signature_nid.3" => [ + "doc/man3/SSL_get_peer_signature_nid.pod" + ], + "doc/man/man3/SSL_get_peer_tmp_key.3" => [ + "doc/man3/SSL_get_peer_tmp_key.pod" + ], + "doc/man/man3/SSL_get_psk_identity.3" => [ + "doc/man3/SSL_get_psk_identity.pod" + ], + "doc/man/man3/SSL_get_rbio.3" => [ + "doc/man3/SSL_get_rbio.pod" + ], + "doc/man/man3/SSL_get_rpoll_descriptor.3" => [ + "doc/man3/SSL_get_rpoll_descriptor.pod" + ], + "doc/man/man3/SSL_get_session.3" => [ + "doc/man3/SSL_get_session.pod" + ], + "doc/man/man3/SSL_get_shared_sigalgs.3" => [ + "doc/man3/SSL_get_shared_sigalgs.pod" + ], + "doc/man/man3/SSL_get_stream_id.3" => [ + "doc/man3/SSL_get_stream_id.pod" + ], + "doc/man/man3/SSL_get_stream_read_state.3" => [ + "doc/man3/SSL_get_stream_read_state.pod" + ], + "doc/man/man3/SSL_get_value_uint.3" => [ + "doc/man3/SSL_get_value_uint.pod" + ], + "doc/man/man3/SSL_get_verify_result.3" => [ + "doc/man3/SSL_get_verify_result.pod" + ], + "doc/man/man3/SSL_get_version.3" => [ + "doc/man3/SSL_get_version.pod" + ], + "doc/man/man3/SSL_group_to_name.3" => [ + "doc/man3/SSL_group_to_name.pod" + ], + "doc/man/man3/SSL_handle_events.3" => [ + "doc/man3/SSL_handle_events.pod" + ], + "doc/man/man3/SSL_in_init.3" => [ + "doc/man3/SSL_in_init.pod" + ], + "doc/man/man3/SSL_inject_net_dgram.3" => [ + "doc/man3/SSL_inject_net_dgram.pod" + ], + "doc/man/man3/SSL_key_update.3" => [ + "doc/man3/SSL_key_update.pod" + ], + "doc/man/man3/SSL_library_init.3" => [ + "doc/man3/SSL_library_init.pod" + ], + "doc/man/man3/SSL_load_client_CA_file.3" => [ + "doc/man3/SSL_load_client_CA_file.pod" + ], + "doc/man/man3/SSL_new.3" => [ + "doc/man3/SSL_new.pod" + ], + "doc/man/man3/SSL_new_domain.3" => [ + "doc/man3/SSL_new_domain.pod" + ], + "doc/man/man3/SSL_new_listener.3" => [ + "doc/man3/SSL_new_listener.pod" + ], + "doc/man/man3/SSL_new_stream.3" => [ + "doc/man3/SSL_new_stream.pod" + ], + "doc/man/man3/SSL_pending.3" => [ + "doc/man3/SSL_pending.pod" + ], + "doc/man/man3/SSL_poll.3" => [ + "doc/man3/SSL_poll.pod" + ], + "doc/man/man3/SSL_read.3" => [ + "doc/man3/SSL_read.pod" + ], + "doc/man/man3/SSL_read_early_data.3" => [ + "doc/man3/SSL_read_early_data.pod" + ], + "doc/man/man3/SSL_rstate_string.3" => [ + "doc/man3/SSL_rstate_string.pod" + ], + "doc/man/man3/SSL_session_reused.3" => [ + "doc/man3/SSL_session_reused.pod" + ], + "doc/man/man3/SSL_set1_host.3" => [ + "doc/man3/SSL_set1_host.pod" + ], + "doc/man/man3/SSL_set1_initial_peer_addr.3" => [ + "doc/man3/SSL_set1_initial_peer_addr.pod" + ], + "doc/man/man3/SSL_set1_server_cert_type.3" => [ + "doc/man3/SSL_set1_server_cert_type.pod" + ], + "doc/man/man3/SSL_set_async_callback.3" => [ + "doc/man3/SSL_set_async_callback.pod" + ], + "doc/man/man3/SSL_set_bio.3" => [ + "doc/man3/SSL_set_bio.pod" + ], + "doc/man/man3/SSL_set_blocking_mode.3" => [ + "doc/man3/SSL_set_blocking_mode.pod" + ], + "doc/man/man3/SSL_set_connect_state.3" => [ + "doc/man3/SSL_set_connect_state.pod" + ], + "doc/man/man3/SSL_set_default_stream_mode.3" => [ + "doc/man3/SSL_set_default_stream_mode.pod" + ], + "doc/man/man3/SSL_set_fd.3" => [ + "doc/man3/SSL_set_fd.pod" + ], + "doc/man/man3/SSL_set_incoming_stream_policy.3" => [ + "doc/man3/SSL_set_incoming_stream_policy.pod" + ], + "doc/man/man3/SSL_set_quic_tls_cbs.3" => [ + "doc/man3/SSL_set_quic_tls_cbs.pod" + ], + "doc/man/man3/SSL_set_retry_verify.3" => [ + "doc/man3/SSL_set_retry_verify.pod" + ], + "doc/man/man3/SSL_set_session.3" => [ + "doc/man3/SSL_set_session.pod" + ], + "doc/man/man3/SSL_set_session_secret_cb.3" => [ + "doc/man3/SSL_set_session_secret_cb.pod" + ], + "doc/man/man3/SSL_set_shutdown.3" => [ + "doc/man3/SSL_set_shutdown.pod" + ], + "doc/man/man3/SSL_set_verify_result.3" => [ + "doc/man3/SSL_set_verify_result.pod" + ], + "doc/man/man3/SSL_shutdown.3" => [ + "doc/man3/SSL_shutdown.pod" + ], + "doc/man/man3/SSL_state_string.3" => [ + "doc/man3/SSL_state_string.pod" + ], + "doc/man/man3/SSL_stream_conclude.3" => [ + "doc/man3/SSL_stream_conclude.pod" + ], + "doc/man/man3/SSL_stream_reset.3" => [ + "doc/man3/SSL_stream_reset.pod" + ], + "doc/man/man3/SSL_want.3" => [ + "doc/man3/SSL_want.pod" + ], + "doc/man/man3/SSL_write.3" => [ + "doc/man3/SSL_write.pod" + ], + "doc/man/man3/TS_RESP_CTX_new.3" => [ + "doc/man3/TS_RESP_CTX_new.pod" + ], + "doc/man/man3/TS_VERIFY_CTX.3" => [ + "doc/man3/TS_VERIFY_CTX.pod" + ], + "doc/man/man3/UI_STRING.3" => [ + "doc/man3/UI_STRING.pod" + ], + "doc/man/man3/UI_UTIL_read_pw.3" => [ + "doc/man3/UI_UTIL_read_pw.pod" + ], + "doc/man/man3/UI_create_method.3" => [ + "doc/man3/UI_create_method.pod" + ], + "doc/man/man3/UI_new.3" => [ + "doc/man3/UI_new.pod" + ], + "doc/man/man3/X509V3_EXT_print.3" => [ + "doc/man3/X509V3_EXT_print.pod" + ], + "doc/man/man3/X509V3_get_d2i.3" => [ + "doc/man3/X509V3_get_d2i.pod" + ], + "doc/man/man3/X509V3_set_ctx.3" => [ + "doc/man3/X509V3_set_ctx.pod" + ], + "doc/man/man3/X509_ACERT_add1_attr.3" => [ + "doc/man3/X509_ACERT_add1_attr.pod" + ], + "doc/man/man3/X509_ACERT_add_attr_nconf.3" => [ + "doc/man3/X509_ACERT_add_attr_nconf.pod" + ], + "doc/man/man3/X509_ACERT_get0_holder_baseCertId.3" => [ + "doc/man3/X509_ACERT_get0_holder_baseCertId.pod" + ], + "doc/man/man3/X509_ACERT_get_attr.3" => [ + "doc/man3/X509_ACERT_get_attr.pod" + ], + "doc/man/man3/X509_ACERT_print_ex.3" => [ + "doc/man3/X509_ACERT_print_ex.pod" + ], + "doc/man/man3/X509_ALGOR_dup.3" => [ + "doc/man3/X509_ALGOR_dup.pod" + ], + "doc/man/man3/X509_ATTRIBUTE.3" => [ + "doc/man3/X509_ATTRIBUTE.pod" + ], + "doc/man/man3/X509_CRL_get0_by_serial.3" => [ + "doc/man3/X509_CRL_get0_by_serial.pod" + ], + "doc/man/man3/X509_EXTENSION_set_object.3" => [ + "doc/man3/X509_EXTENSION_set_object.pod" + ], + "doc/man/man3/X509_LOOKUP.3" => [ + "doc/man3/X509_LOOKUP.pod" + ], + "doc/man/man3/X509_LOOKUP_hash_dir.3" => [ + "doc/man3/X509_LOOKUP_hash_dir.pod" + ], + "doc/man/man3/X509_LOOKUP_meth_new.3" => [ + "doc/man3/X509_LOOKUP_meth_new.pod" + ], + "doc/man/man3/X509_NAME_ENTRY_get_object.3" => [ + "doc/man3/X509_NAME_ENTRY_get_object.pod" + ], + "doc/man/man3/X509_NAME_add_entry_by_txt.3" => [ + "doc/man3/X509_NAME_add_entry_by_txt.pod" + ], + "doc/man/man3/X509_NAME_get0_der.3" => [ + "doc/man3/X509_NAME_get0_der.pod" + ], + "doc/man/man3/X509_NAME_get_index_by_NID.3" => [ + "doc/man3/X509_NAME_get_index_by_NID.pod" + ], + "doc/man/man3/X509_NAME_print_ex.3" => [ + "doc/man3/X509_NAME_print_ex.pod" + ], + "doc/man/man3/X509_PUBKEY_new.3" => [ + "doc/man3/X509_PUBKEY_new.pod" + ], + "doc/man/man3/X509_REQ_get_attr.3" => [ + "doc/man3/X509_REQ_get_attr.pod" + ], + "doc/man/man3/X509_REQ_get_extensions.3" => [ + "doc/man3/X509_REQ_get_extensions.pod" + ], + "doc/man/man3/X509_SIG_get0.3" => [ + "doc/man3/X509_SIG_get0.pod" + ], + "doc/man/man3/X509_STORE_CTX_get_by_subject.3" => [ + "doc/man3/X509_STORE_CTX_get_by_subject.pod" + ], + "doc/man/man3/X509_STORE_CTX_get_error.3" => [ + "doc/man3/X509_STORE_CTX_get_error.pod" + ], + "doc/man/man3/X509_STORE_CTX_new.3" => [ + "doc/man3/X509_STORE_CTX_new.pod" + ], + "doc/man/man3/X509_STORE_CTX_set_verify_cb.3" => [ + "doc/man3/X509_STORE_CTX_set_verify_cb.pod" + ], + "doc/man/man3/X509_STORE_add_cert.3" => [ + "doc/man3/X509_STORE_add_cert.pod" + ], + "doc/man/man3/X509_STORE_get0_param.3" => [ + "doc/man3/X509_STORE_get0_param.pod" + ], + "doc/man/man3/X509_STORE_new.3" => [ + "doc/man3/X509_STORE_new.pod" + ], + "doc/man/man3/X509_STORE_set_verify_cb_func.3" => [ + "doc/man3/X509_STORE_set_verify_cb_func.pod" + ], + "doc/man/man3/X509_VERIFY_PARAM_set_flags.3" => [ + "doc/man3/X509_VERIFY_PARAM_set_flags.pod" + ], + "doc/man/man3/X509_add_cert.3" => [ + "doc/man3/X509_add_cert.pod" + ], + "doc/man/man3/X509_check_ca.3" => [ + "doc/man3/X509_check_ca.pod" + ], + "doc/man/man3/X509_check_host.3" => [ + "doc/man3/X509_check_host.pod" + ], + "doc/man/man3/X509_check_issued.3" => [ + "doc/man3/X509_check_issued.pod" + ], + "doc/man/man3/X509_check_private_key.3" => [ + "doc/man3/X509_check_private_key.pod" + ], + "doc/man/man3/X509_check_purpose.3" => [ + "doc/man3/X509_check_purpose.pod" + ], + "doc/man/man3/X509_cmp.3" => [ + "doc/man3/X509_cmp.pod" + ], + "doc/man/man3/X509_cmp_time.3" => [ + "doc/man3/X509_cmp_time.pod" + ], + "doc/man/man3/X509_digest.3" => [ + "doc/man3/X509_digest.pod" + ], + "doc/man/man3/X509_dup.3" => [ + "doc/man3/X509_dup.pod" + ], + "doc/man/man3/X509_get0_distinguishing_id.3" => [ + "doc/man3/X509_get0_distinguishing_id.pod" + ], + "doc/man/man3/X509_get0_notBefore.3" => [ + "doc/man3/X509_get0_notBefore.pod" + ], + "doc/man/man3/X509_get0_signature.3" => [ + "doc/man3/X509_get0_signature.pod" + ], + "doc/man/man3/X509_get0_uids.3" => [ + "doc/man3/X509_get0_uids.pod" + ], + "doc/man/man3/X509_get_default_cert_file.3" => [ + "doc/man3/X509_get_default_cert_file.pod" + ], + "doc/man/man3/X509_get_extension_flags.3" => [ + "doc/man3/X509_get_extension_flags.pod" + ], + "doc/man/man3/X509_get_pubkey.3" => [ + "doc/man3/X509_get_pubkey.pod" + ], + "doc/man/man3/X509_get_serialNumber.3" => [ + "doc/man3/X509_get_serialNumber.pod" + ], + "doc/man/man3/X509_get_subject_name.3" => [ + "doc/man3/X509_get_subject_name.pod" + ], + "doc/man/man3/X509_get_version.3" => [ + "doc/man3/X509_get_version.pod" + ], + "doc/man/man3/X509_load_http.3" => [ + "doc/man3/X509_load_http.pod" + ], + "doc/man/man3/X509_new.3" => [ + "doc/man3/X509_new.pod" + ], + "doc/man/man3/X509_sign.3" => [ + "doc/man3/X509_sign.pod" + ], + "doc/man/man3/X509_verify.3" => [ + "doc/man3/X509_verify.pod" + ], + "doc/man/man3/X509_verify_cert.3" => [ + "doc/man3/X509_verify_cert.pod" + ], + "doc/man/man3/X509v3_get_ext_by_NID.3" => [ + "doc/man3/X509v3_get_ext_by_NID.pod" + ], + "doc/man/man3/b2i_PVK_bio_ex.3" => [ + "doc/man3/b2i_PVK_bio_ex.pod" + ], + "doc/man/man3/d2i_PKCS8PrivateKey_bio.3" => [ + "doc/man3/d2i_PKCS8PrivateKey_bio.pod" + ], + "doc/man/man3/d2i_PrivateKey.3" => [ + "doc/man3/d2i_PrivateKey.pod" + ], + "doc/man/man3/d2i_RSAPrivateKey.3" => [ + "doc/man3/d2i_RSAPrivateKey.pod" + ], + "doc/man/man3/d2i_SSL_SESSION.3" => [ + "doc/man3/d2i_SSL_SESSION.pod" + ], + "doc/man/man3/d2i_X509.3" => [ + "doc/man3/d2i_X509.pod" + ], + "doc/man/man3/i2d_CMS_bio_stream.3" => [ + "doc/man3/i2d_CMS_bio_stream.pod" + ], + "doc/man/man3/i2d_PKCS7_bio_stream.3" => [ + "doc/man3/i2d_PKCS7_bio_stream.pod" + ], + "doc/man/man3/i2d_re_X509_tbs.3" => [ + "doc/man3/i2d_re_X509_tbs.pod" + ], + "doc/man/man3/o2i_SCT_LIST.3" => [ + "doc/man3/o2i_SCT_LIST.pod" + ], + "doc/man/man3/s2i_ASN1_IA5STRING.3" => [ + "doc/man3/s2i_ASN1_IA5STRING.pod" + ], + "doc/man/man5/config.5" => [ + "doc/man5/config.pod" + ], + "doc/man/man5/fips_config.5" => [ + "doc/man5/fips_config.pod" + ], + "doc/man/man5/x509v3_config.5" => [ + "doc/man5/x509v3_config.pod" + ], + "doc/man/man7/EVP_ASYM_CIPHER-RSA.7" => [ + "doc/man7/EVP_ASYM_CIPHER-RSA.pod" + ], + "doc/man/man7/EVP_ASYM_CIPHER-SM2.7" => [ + "doc/man7/EVP_ASYM_CIPHER-SM2.pod" + ], + "doc/man/man7/EVP_CIPHER-AES.7" => [ + "doc/man7/EVP_CIPHER-AES.pod" + ], + "doc/man/man7/EVP_CIPHER-ARIA.7" => [ + "doc/man7/EVP_CIPHER-ARIA.pod" + ], + "doc/man/man7/EVP_CIPHER-BLOWFISH.7" => [ + "doc/man7/EVP_CIPHER-BLOWFISH.pod" + ], + "doc/man/man7/EVP_CIPHER-CAMELLIA.7" => [ + "doc/man7/EVP_CIPHER-CAMELLIA.pod" + ], + "doc/man/man7/EVP_CIPHER-CAST.7" => [ + "doc/man7/EVP_CIPHER-CAST.pod" + ], + "doc/man/man7/EVP_CIPHER-CHACHA.7" => [ + "doc/man7/EVP_CIPHER-CHACHA.pod" + ], + "doc/man/man7/EVP_CIPHER-DES.7" => [ + "doc/man7/EVP_CIPHER-DES.pod" + ], + "doc/man/man7/EVP_CIPHER-IDEA.7" => [ + "doc/man7/EVP_CIPHER-IDEA.pod" + ], + "doc/man/man7/EVP_CIPHER-NULL.7" => [ + "doc/man7/EVP_CIPHER-NULL.pod" + ], + "doc/man/man7/EVP_CIPHER-RC2.7" => [ + "doc/man7/EVP_CIPHER-RC2.pod" + ], + "doc/man/man7/EVP_CIPHER-RC4.7" => [ + "doc/man7/EVP_CIPHER-RC4.pod" + ], + "doc/man/man7/EVP_CIPHER-RC5.7" => [ + "doc/man7/EVP_CIPHER-RC5.pod" + ], + "doc/man/man7/EVP_CIPHER-SEED.7" => [ + "doc/man7/EVP_CIPHER-SEED.pod" + ], + "doc/man/man7/EVP_CIPHER-SM4.7" => [ + "doc/man7/EVP_CIPHER-SM4.pod" + ], + "doc/man/man7/EVP_KDF-ARGON2.7" => [ + "doc/man7/EVP_KDF-ARGON2.pod" + ], + "doc/man/man7/EVP_KDF-HKDF.7" => [ + "doc/man7/EVP_KDF-HKDF.pod" + ], + "doc/man/man7/EVP_KDF-HMAC-DRBG.7" => [ + "doc/man7/EVP_KDF-HMAC-DRBG.pod" + ], + "doc/man/man7/EVP_KDF-KB.7" => [ + "doc/man7/EVP_KDF-KB.pod" + ], + "doc/man/man7/EVP_KDF-KRB5KDF.7" => [ + "doc/man7/EVP_KDF-KRB5KDF.pod" + ], + "doc/man/man7/EVP_KDF-PBKDF1.7" => [ + "doc/man7/EVP_KDF-PBKDF1.pod" + ], + "doc/man/man7/EVP_KDF-PBKDF2.7" => [ + "doc/man7/EVP_KDF-PBKDF2.pod" + ], + "doc/man/man7/EVP_KDF-PKCS12KDF.7" => [ + "doc/man7/EVP_KDF-PKCS12KDF.pod" + ], + "doc/man/man7/EVP_KDF-PVKKDF.7" => [ + "doc/man7/EVP_KDF-PVKKDF.pod" + ], + "doc/man/man7/EVP_KDF-SCRYPT.7" => [ + "doc/man7/EVP_KDF-SCRYPT.pod" + ], + "doc/man/man7/EVP_KDF-SS.7" => [ + "doc/man7/EVP_KDF-SS.pod" + ], + "doc/man/man7/EVP_KDF-SSHKDF.7" => [ + "doc/man7/EVP_KDF-SSHKDF.pod" + ], + "doc/man/man7/EVP_KDF-TLS13_KDF.7" => [ + "doc/man7/EVP_KDF-TLS13_KDF.pod" + ], + "doc/man/man7/EVP_KDF-TLS1_PRF.7" => [ + "doc/man7/EVP_KDF-TLS1_PRF.pod" + ], + "doc/man/man7/EVP_KDF-X942-ASN1.7" => [ + "doc/man7/EVP_KDF-X942-ASN1.pod" + ], + "doc/man/man7/EVP_KDF-X942-CONCAT.7" => [ + "doc/man7/EVP_KDF-X942-CONCAT.pod" + ], + "doc/man/man7/EVP_KDF-X963.7" => [ + "doc/man7/EVP_KDF-X963.pod" + ], + "doc/man/man7/EVP_KEM-EC.7" => [ + "doc/man7/EVP_KEM-EC.pod" + ], + "doc/man/man7/EVP_KEM-ML-KEM.7" => [ + "doc/man7/EVP_KEM-ML-KEM.pod" + ], + "doc/man/man7/EVP_KEM-RSA.7" => [ + "doc/man7/EVP_KEM-RSA.pod" + ], + "doc/man/man7/EVP_KEM-X25519.7" => [ + "doc/man7/EVP_KEM-X25519.pod" + ], + "doc/man/man7/EVP_KEYEXCH-DH.7" => [ + "doc/man7/EVP_KEYEXCH-DH.pod" + ], + "doc/man/man7/EVP_KEYEXCH-ECDH.7" => [ + "doc/man7/EVP_KEYEXCH-ECDH.pod" + ], + "doc/man/man7/EVP_KEYEXCH-X25519.7" => [ + "doc/man7/EVP_KEYEXCH-X25519.pod" + ], + "doc/man/man7/EVP_MAC-BLAKE2.7" => [ + "doc/man7/EVP_MAC-BLAKE2.pod" + ], + "doc/man/man7/EVP_MAC-CMAC.7" => [ + "doc/man7/EVP_MAC-CMAC.pod" + ], + "doc/man/man7/EVP_MAC-GMAC.7" => [ + "doc/man7/EVP_MAC-GMAC.pod" + ], + "doc/man/man7/EVP_MAC-HMAC.7" => [ + "doc/man7/EVP_MAC-HMAC.pod" + ], + "doc/man/man7/EVP_MAC-KMAC.7" => [ + "doc/man7/EVP_MAC-KMAC.pod" + ], + "doc/man/man7/EVP_MAC-Poly1305.7" => [ + "doc/man7/EVP_MAC-Poly1305.pod" + ], + "doc/man/man7/EVP_MAC-Siphash.7" => [ + "doc/man7/EVP_MAC-Siphash.pod" + ], + "doc/man/man7/EVP_MD-BLAKE2.7" => [ + "doc/man7/EVP_MD-BLAKE2.pod" + ], + "doc/man/man7/EVP_MD-KECCAK.7" => [ + "doc/man7/EVP_MD-KECCAK.pod" + ], + "doc/man/man7/EVP_MD-MD2.7" => [ + "doc/man7/EVP_MD-MD2.pod" + ], + "doc/man/man7/EVP_MD-MD4.7" => [ + "doc/man7/EVP_MD-MD4.pod" + ], + "doc/man/man7/EVP_MD-MD5-SHA1.7" => [ + "doc/man7/EVP_MD-MD5-SHA1.pod" + ], + "doc/man/man7/EVP_MD-MD5.7" => [ + "doc/man7/EVP_MD-MD5.pod" + ], + "doc/man/man7/EVP_MD-MDC2.7" => [ + "doc/man7/EVP_MD-MDC2.pod" + ], + "doc/man/man7/EVP_MD-NULL.7" => [ + "doc/man7/EVP_MD-NULL.pod" + ], + "doc/man/man7/EVP_MD-RIPEMD160.7" => [ + "doc/man7/EVP_MD-RIPEMD160.pod" + ], + "doc/man/man7/EVP_MD-SHA1.7" => [ + "doc/man7/EVP_MD-SHA1.pod" + ], + "doc/man/man7/EVP_MD-SHA2.7" => [ + "doc/man7/EVP_MD-SHA2.pod" + ], + "doc/man/man7/EVP_MD-SHA3.7" => [ + "doc/man7/EVP_MD-SHA3.pod" + ], + "doc/man/man7/EVP_MD-SHAKE.7" => [ + "doc/man7/EVP_MD-SHAKE.pod" + ], + "doc/man/man7/EVP_MD-SM3.7" => [ + "doc/man7/EVP_MD-SM3.pod" + ], + "doc/man/man7/EVP_MD-WHIRLPOOL.7" => [ + "doc/man7/EVP_MD-WHIRLPOOL.pod" + ], + "doc/man/man7/EVP_MD-common.7" => [ + "doc/man7/EVP_MD-common.pod" + ], + "doc/man/man7/EVP_PKEY-DH.7" => [ + "doc/man7/EVP_PKEY-DH.pod" + ], + "doc/man/man7/EVP_PKEY-DSA.7" => [ + "doc/man7/EVP_PKEY-DSA.pod" + ], + "doc/man/man7/EVP_PKEY-EC.7" => [ + "doc/man7/EVP_PKEY-EC.pod" + ], + "doc/man/man7/EVP_PKEY-FFC.7" => [ + "doc/man7/EVP_PKEY-FFC.pod" + ], + "doc/man/man7/EVP_PKEY-HMAC.7" => [ + "doc/man7/EVP_PKEY-HMAC.pod" + ], + "doc/man/man7/EVP_PKEY-ML-DSA.7" => [ + "doc/man7/EVP_PKEY-ML-DSA.pod" + ], + "doc/man/man7/EVP_PKEY-ML-KEM.7" => [ + "doc/man7/EVP_PKEY-ML-KEM.pod" + ], + "doc/man/man7/EVP_PKEY-RSA.7" => [ + "doc/man7/EVP_PKEY-RSA.pod" + ], + "doc/man/man7/EVP_PKEY-SLH-DSA.7" => [ + "doc/man7/EVP_PKEY-SLH-DSA.pod" + ], + "doc/man/man7/EVP_PKEY-SM2.7" => [ + "doc/man7/EVP_PKEY-SM2.pod" + ], + "doc/man/man7/EVP_PKEY-X25519.7" => [ + "doc/man7/EVP_PKEY-X25519.pod" + ], + "doc/man/man7/EVP_RAND-CRNG-TEST.7" => [ + "doc/man7/EVP_RAND-CRNG-TEST.pod" + ], + "doc/man/man7/EVP_RAND-CTR-DRBG.7" => [ + "doc/man7/EVP_RAND-CTR-DRBG.pod" + ], + "doc/man/man7/EVP_RAND-HASH-DRBG.7" => [ + "doc/man7/EVP_RAND-HASH-DRBG.pod" + ], + "doc/man/man7/EVP_RAND-HMAC-DRBG.7" => [ + "doc/man7/EVP_RAND-HMAC-DRBG.pod" + ], + "doc/man/man7/EVP_RAND-JITTER.7" => [ + "doc/man7/EVP_RAND-JITTER.pod" + ], + "doc/man/man7/EVP_RAND-SEED-SRC.7" => [ + "doc/man7/EVP_RAND-SEED-SRC.pod" + ], + "doc/man/man7/EVP_RAND-TEST-RAND.7" => [ + "doc/man7/EVP_RAND-TEST-RAND.pod" + ], + "doc/man/man7/EVP_RAND.7" => [ + "doc/man7/EVP_RAND.pod" + ], + "doc/man/man7/EVP_SIGNATURE-DSA.7" => [ + "doc/man7/EVP_SIGNATURE-DSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-ECDSA.7" => [ + "doc/man7/EVP_SIGNATURE-ECDSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-ED25519.7" => [ + "doc/man7/EVP_SIGNATURE-ED25519.pod" + ], + "doc/man/man7/EVP_SIGNATURE-HMAC.7" => [ + "doc/man7/EVP_SIGNATURE-HMAC.pod" + ], + "doc/man/man7/EVP_SIGNATURE-ML-DSA.7" => [ + "doc/man7/EVP_SIGNATURE-ML-DSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-RSA.7" => [ + "doc/man7/EVP_SIGNATURE-RSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-SLH-DSA.7" => [ + "doc/man7/EVP_SIGNATURE-SLH-DSA.pod" + ], + "doc/man/man7/OSSL_PROVIDER-FIPS.7" => [ + "doc/man7/OSSL_PROVIDER-FIPS.pod" + ], + "doc/man/man7/OSSL_PROVIDER-base.7" => [ + "doc/man7/OSSL_PROVIDER-base.pod" + ], + "doc/man/man7/OSSL_PROVIDER-default.7" => [ + "doc/man7/OSSL_PROVIDER-default.pod" + ], + "doc/man/man7/OSSL_PROVIDER-legacy.7" => [ + "doc/man7/OSSL_PROVIDER-legacy.pod" + ], + "doc/man/man7/OSSL_PROVIDER-null.7" => [ + "doc/man7/OSSL_PROVIDER-null.pod" + ], + "doc/man/man7/OSSL_STORE-winstore.7" => [ + "doc/man7/OSSL_STORE-winstore.pod" + ], + "doc/man/man7/RAND.7" => [ + "doc/man7/RAND.pod" + ], + "doc/man/man7/RSA-PSS.7" => [ + "doc/man7/RSA-PSS.pod" + ], + "doc/man/man7/X25519.7" => [ + "doc/man7/X25519.pod" + ], + "doc/man/man7/bio.7" => [ + "doc/man7/bio.pod" + ], + "doc/man/man7/ct.7" => [ + "doc/man7/ct.pod" + ], + "doc/man/man7/des_modes.7" => [ + "doc/man7/des_modes.pod" + ], + "doc/man/man7/evp.7" => [ + "doc/man7/evp.pod" + ], + "doc/man/man7/fips_module.7" => [ + "doc/man7/fips_module.pod" + ], + "doc/man/man7/life_cycle-cipher.7" => [ + "doc/man7/life_cycle-cipher.pod" + ], + "doc/man/man7/life_cycle-digest.7" => [ + "doc/man7/life_cycle-digest.pod" + ], + "doc/man/man7/life_cycle-kdf.7" => [ + "doc/man7/life_cycle-kdf.pod" + ], + "doc/man/man7/life_cycle-mac.7" => [ + "doc/man7/life_cycle-mac.pod" + ], + "doc/man/man7/life_cycle-pkey.7" => [ + "doc/man7/life_cycle-pkey.pod" + ], + "doc/man/man7/life_cycle-rand.7" => [ + "doc/man7/life_cycle-rand.pod" + ], + "doc/man/man7/openssl-core.h.7" => [ + "doc/man7/openssl-core.h.pod" + ], + "doc/man/man7/openssl-core_dispatch.h.7" => [ + "doc/man7/openssl-core_dispatch.h.pod" + ], + "doc/man/man7/openssl-core_names.h.7" => [ + "doc/man7/openssl-core_names.h.pod" + ], + "doc/man/man7/openssl-env.7" => [ + "doc/man7/openssl-env.pod" + ], + "doc/man/man7/openssl-glossary.7" => [ + "doc/man7/openssl-glossary.pod" + ], + "doc/man/man7/openssl-qlog.7" => [ + "doc/man7/openssl-qlog.pod" + ], + "doc/man/man7/openssl-quic-concurrency.7" => [ + "doc/man7/openssl-quic-concurrency.pod" + ], + "doc/man/man7/openssl-quic.7" => [ + "doc/man7/openssl-quic.pod" + ], + "doc/man/man7/openssl-threads.7" => [ + "doc/man7/openssl-threads.pod" + ], + "doc/man/man7/openssl_user_macros.7" => [ + "doc/man7/openssl_user_macros.pod" + ], + "doc/man/man7/ossl-guide-introduction.7" => [ + "doc/man7/ossl-guide-introduction.pod" + ], + "doc/man/man7/ossl-guide-libcrypto-introduction.7" => [ + "doc/man7/ossl-guide-libcrypto-introduction.pod" + ], + "doc/man/man7/ossl-guide-libraries-introduction.7" => [ + "doc/man7/ossl-guide-libraries-introduction.pod" + ], + "doc/man/man7/ossl-guide-libssl-introduction.7" => [ + "doc/man7/ossl-guide-libssl-introduction.pod" + ], + "doc/man/man7/ossl-guide-migration.7" => [ + "doc/man7/ossl-guide-migration.pod" + ], + "doc/man/man7/ossl-guide-quic-client-block.7" => [ + "doc/man7/ossl-guide-quic-client-block.pod" + ], + "doc/man/man7/ossl-guide-quic-client-non-block.7" => [ + "doc/man7/ossl-guide-quic-client-non-block.pod" + ], + "doc/man/man7/ossl-guide-quic-introduction.7" => [ + "doc/man7/ossl-guide-quic-introduction.pod" + ], + "doc/man/man7/ossl-guide-quic-multi-stream.7" => [ + "doc/man7/ossl-guide-quic-multi-stream.pod" + ], + "doc/man/man7/ossl-guide-quic-server-block.7" => [ + "doc/man7/ossl-guide-quic-server-block.pod" + ], + "doc/man/man7/ossl-guide-quic-server-non-block.7" => [ + "doc/man7/ossl-guide-quic-server-non-block.pod" + ], + "doc/man/man7/ossl-guide-tls-client-block.7" => [ + "doc/man7/ossl-guide-tls-client-block.pod" + ], + "doc/man/man7/ossl-guide-tls-client-non-block.7" => [ + "doc/man7/ossl-guide-tls-client-non-block.pod" + ], + "doc/man/man7/ossl-guide-tls-introduction.7" => [ + "doc/man7/ossl-guide-tls-introduction.pod" + ], + "doc/man/man7/ossl-guide-tls-server-block.7" => [ + "doc/man7/ossl-guide-tls-server-block.pod" + ], + "doc/man/man7/ossl_store-file.7" => [ + "doc/man7/ossl_store-file.pod" + ], + "doc/man/man7/ossl_store.7" => [ + "doc/man7/ossl_store.pod" + ], + "doc/man/man7/passphrase-encoding.7" => [ + "doc/man7/passphrase-encoding.pod" + ], + "doc/man/man7/property.7" => [ + "doc/man7/property.pod" + ], + "doc/man/man7/provider-asym_cipher.7" => [ + "doc/man7/provider-asym_cipher.pod" + ], + "doc/man/man7/provider-base.7" => [ + "doc/man7/provider-base.pod" + ], + "doc/man/man7/provider-cipher.7" => [ + "doc/man7/provider-cipher.pod" + ], + "doc/man/man7/provider-decoder.7" => [ + "doc/man7/provider-decoder.pod" + ], + "doc/man/man7/provider-digest.7" => [ + "doc/man7/provider-digest.pod" + ], + "doc/man/man7/provider-encoder.7" => [ + "doc/man7/provider-encoder.pod" + ], + "doc/man/man7/provider-kdf.7" => [ + "doc/man7/provider-kdf.pod" + ], + "doc/man/man7/provider-kem.7" => [ + "doc/man7/provider-kem.pod" + ], + "doc/man/man7/provider-keyexch.7" => [ + "doc/man7/provider-keyexch.pod" + ], + "doc/man/man7/provider-keymgmt.7" => [ + "doc/man7/provider-keymgmt.pod" + ], + "doc/man/man7/provider-mac.7" => [ + "doc/man7/provider-mac.pod" + ], + "doc/man/man7/provider-object.7" => [ + "doc/man7/provider-object.pod" + ], + "doc/man/man7/provider-rand.7" => [ + "doc/man7/provider-rand.pod" + ], + "doc/man/man7/provider-signature.7" => [ + "doc/man7/provider-signature.pod" + ], + "doc/man/man7/provider-skeymgmt.7" => [ + "doc/man7/provider-skeymgmt.pod" + ], + "doc/man/man7/provider-storemgmt.7" => [ + "doc/man7/provider-storemgmt.pod" + ], + "doc/man/man7/provider.7" => [ + "doc/man7/provider.pod" + ], + "doc/man/man7/proxy-certificates.7" => [ + "doc/man7/proxy-certificates.pod" + ], + "doc/man/man7/x509.7" => [ + "doc/man7/x509.pod" + ], + "doc/man1/openssl-asn1parse.pod" => [ + "doc/man1/openssl-asn1parse.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-ca.pod" => [ + "doc/man1/openssl-ca.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-ciphers.pod" => [ + "doc/man1/openssl-ciphers.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-cmds.pod" => [ + "doc/man1/openssl-cmds.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-cmp.pod" => [ + "doc/man1/openssl-cmp.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-cms.pod" => [ + "doc/man1/openssl-cms.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-crl.pod" => [ + "doc/man1/openssl-crl.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-crl2pkcs7.pod" => [ + "doc/man1/openssl-crl2pkcs7.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-dgst.pod" => [ + "doc/man1/openssl-dgst.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-dhparam.pod" => [ + "doc/man1/openssl-dhparam.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-dsa.pod" => [ + "doc/man1/openssl-dsa.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-dsaparam.pod" => [ + "doc/man1/openssl-dsaparam.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-ec.pod" => [ + "doc/man1/openssl-ec.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-ecparam.pod" => [ + "doc/man1/openssl-ecparam.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-enc.pod" => [ + "doc/man1/openssl-enc.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-engine.pod" => [ + "doc/man1/openssl-engine.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-errstr.pod" => [ + "doc/man1/openssl-errstr.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-fipsinstall.pod" => [ + "doc/man1/openssl-fipsinstall.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-gendsa.pod" => [ + "doc/man1/openssl-gendsa.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-genpkey.pod" => [ + "doc/man1/openssl-genpkey.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-genrsa.pod" => [ + "doc/man1/openssl-genrsa.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-info.pod" => [ + "doc/man1/openssl-info.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-kdf.pod" => [ + "doc/man1/openssl-kdf.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-list.pod" => [ + "doc/man1/openssl-list.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-mac.pod" => [ + "doc/man1/openssl-mac.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-nseq.pod" => [ + "doc/man1/openssl-nseq.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-ocsp.pod" => [ + "doc/man1/openssl-ocsp.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-passwd.pod" => [ + "doc/man1/openssl-passwd.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-pkcs12.pod" => [ + "doc/man1/openssl-pkcs12.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-pkcs7.pod" => [ + "doc/man1/openssl-pkcs7.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-pkcs8.pod" => [ + "doc/man1/openssl-pkcs8.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-pkey.pod" => [ + "doc/man1/openssl-pkey.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-pkeyparam.pod" => [ + "doc/man1/openssl-pkeyparam.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-pkeyutl.pod" => [ + "doc/man1/openssl-pkeyutl.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-prime.pod" => [ + "doc/man1/openssl-prime.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-rand.pod" => [ + "doc/man1/openssl-rand.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-rehash.pod" => [ + "doc/man1/openssl-rehash.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-req.pod" => [ + "doc/man1/openssl-req.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-rsa.pod" => [ + "doc/man1/openssl-rsa.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-rsautl.pod" => [ + "doc/man1/openssl-rsautl.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-s_client.pod" => [ + "doc/man1/openssl-s_client.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-s_server.pod" => [ + "doc/man1/openssl-s_server.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-s_time.pod" => [ + "doc/man1/openssl-s_time.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-sess_id.pod" => [ + "doc/man1/openssl-sess_id.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-skeyutl.pod" => [ + "doc/man1/openssl-skeyutl.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-smime.pod" => [ + "doc/man1/openssl-smime.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-speed.pod" => [ + "doc/man1/openssl-speed.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-spkac.pod" => [ + "doc/man1/openssl-spkac.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-srp.pod" => [ + "doc/man1/openssl-srp.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-storeutl.pod" => [ + "doc/man1/openssl-storeutl.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-ts.pod" => [ + "doc/man1/openssl-ts.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-verify.pod" => [ + "doc/man1/openssl-verify.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-version.pod" => [ + "doc/man1/openssl-version.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-x509.pod" => [ + "doc/man1/openssl-x509.pod.in", + "doc/perlvars.pm" + ], + "doc/man7/openssl_user_macros.pod" => [ + "doc/man7/openssl_user_macros.pod.in" + ], + "exporters/OpenSSLConfig.cmake" => [ + "installdata.pm" + ], + "exporters/OpenSSLConfigVersion.cmake" => [ + "exporters/OpenSSLConfig.cmake", + "installdata.pm" + ], + "exporters/libcrypto.pc" => [ + "installdata.pm" + ], + "exporters/libssl.pc" => [ + "installdata.pm" + ], + "exporters/openssl.pc" => [ + "exporters/libcrypto.pc", + "exporters/libssl.pc", + "installdata.pm" + ], + "include/internal/param_names.h" => [ + "util/perl|OpenSSL/paramnames.pm" + ], + "include/openssl/core_names.h" => [ + "util/perl|OpenSSL/paramnames.pm" + ], + "libcrypto.ld" => [ + "configdata.pm", + "util/perl/OpenSSL/Ordinals.pm" + ], + "libcrypto.pc" => [ + "builddata.pm" + ], + "libssl" => [ + "libcrypto" + ], + "libssl.ld" => [ + "configdata.pm", + "util/perl/OpenSSL/Ordinals.pm" + ], + "libssl.pc" => [ + "builddata.pm" + ], + "openssl.pc" => [ + "builddata.pm", + "libcrypto.pc", + "libssl.pc" + ], + "providers/common/der/der_digests_gen.c" => [ + "providers/common/der/DIGESTS.asn1", + "providers/common/der/NIST.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_dsa_gen.c" => [ + "providers/common/der/DSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_ec_gen.c" => [ + "providers/common/der/EC.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_ecx_gen.c" => [ + "providers/common/der/ECX.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_ml_dsa_gen.c" => [ + "providers/common/der/ML_DSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_rsa_gen.c" => [ + "providers/common/der/NIST.asn1", + "providers/common/der/RSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_slh_dsa_gen.c" => [ + "providers/common/der/SLH_DSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_sm2_gen.c" => [ + "providers/common/der/SM2.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_wrap_gen.c" => [ + "providers/common/der/oids_to_c.pm", + "providers/common/der/wrap.asn1" + ], + "providers/common/der/libcommon-lib-der_digests_gen.o" => [ + "providers/common/include/prov/der_digests.h" + ], + "providers/common/der/libcommon-lib-der_dsa_gen.o" => [ + "providers/common/include/prov/der_dsa.h" + ], + "providers/common/der/libcommon-lib-der_dsa_key.o" => [ + "providers/common/include/prov/der_digests.h", + "providers/common/include/prov/der_dsa.h" + ], + "providers/common/der/libcommon-lib-der_dsa_sig.o" => [ + "providers/common/include/prov/der_digests.h", + "providers/common/include/prov/der_dsa.h" + ], + "providers/common/der/libcommon-lib-der_ec_gen.o" => [ + "providers/common/include/prov/der_ec.h" + ], + "providers/common/der/libcommon-lib-der_ec_key.o" => [ + "providers/common/include/prov/der_digests.h", + "providers/common/include/prov/der_ec.h" + ], + "providers/common/der/libcommon-lib-der_ec_sig.o" => [ + "providers/common/include/prov/der_digests.h", + "providers/common/include/prov/der_ec.h" + ], + "providers/common/der/libcommon-lib-der_ecx_gen.o" => [ + "providers/common/include/prov/der_ecx.h" + ], + "providers/common/der/libcommon-lib-der_ecx_key.o" => [ + "providers/common/include/prov/der_ecx.h" + ], + "providers/common/der/libcommon-lib-der_ml_dsa_gen.o" => [ + "providers/common/include/prov/der_ml_dsa.h" + ], + "providers/common/der/libcommon-lib-der_ml_dsa_key.o" => [ + "providers/common/include/prov/der_ml_dsa.h" + ], + "providers/common/der/libcommon-lib-der_rsa_gen.o" => [ + "providers/common/include/prov/der_rsa.h" + ], + "providers/common/der/libcommon-lib-der_rsa_key.o" => [ + "providers/common/include/prov/der_digests.h", + "providers/common/include/prov/der_rsa.h" + ], + "providers/common/der/libcommon-lib-der_slh_dsa_gen.o" => [ + "providers/common/include/prov/der_slh_dsa.h" + ], + "providers/common/der/libcommon-lib-der_slh_dsa_key.o" => [ + "providers/common/include/prov/der_slh_dsa.h" + ], + "providers/common/der/libcommon-lib-der_wrap_gen.o" => [ + "providers/common/include/prov/der_wrap.h" + ], + "providers/common/der/libdefault-lib-der_rsa_sig.o" => [ + "providers/common/include/prov/der_digests.h", + "providers/common/include/prov/der_rsa.h" + ], + "providers/common/der/libdefault-lib-der_sm2_gen.o" => [ + "providers/common/include/prov/der_sm2.h" + ], + "providers/common/der/libdefault-lib-der_sm2_key.o" => [ + "providers/common/include/prov/der_ec.h", + "providers/common/include/prov/der_sm2.h" + ], + "providers/common/der/libdefault-lib-der_sm2_sig.o" => [ + "providers/common/include/prov/der_ec.h", + "providers/common/include/prov/der_sm2.h" + ], + "providers/common/der/libfips-lib-der_rsa_sig.o" => [ + "providers/common/include/prov/der_digests.h", + "providers/common/include/prov/der_rsa.h" + ], + "providers/common/include/prov/der_digests.h" => [ + "providers/common/der/DIGESTS.asn1", + "providers/common/der/NIST.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_dsa.h" => [ + "providers/common/der/DSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_ec.h" => [ + "providers/common/der/EC.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_ecx.h" => [ + "providers/common/der/ECX.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_ml_dsa.h" => [ + "providers/common/der/ML_DSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_rsa.h" => [ + "providers/common/der/NIST.asn1", + "providers/common/der/RSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_slh_dsa.h" => [ + "providers/common/der/SLH_DSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_sm2.h" => [ + "providers/common/der/SM2.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_wrap.h" => [ + "providers/common/der/oids_to_c.pm", + "providers/common/der/wrap.asn1" + ], + "providers/fips" => [ + "providers/libfips.a" + ], + "providers/fipsmodule.cnf" => [ + "providers/fips" + ], + "providers/implementations/encode_decode/libdefault-lib-encode_key2any.o" => [ + "providers/common/include/prov/der_rsa.h" + ], + "providers/implementations/kdfs/libdefault-lib-x942kdf.o" => [ + "providers/common/include/prov/der_wrap.h" + ], + "providers/implementations/kdfs/libfips-lib-x942kdf.o" => [ + "providers/common/include/prov/der_wrap.h" + ], + "providers/implementations/signature/libdefault-lib-dsa_sig.o" => [ + "providers/common/include/prov/der_dsa.h" + ], + "providers/implementations/signature/libdefault-lib-ecdsa_sig.o" => [ + "providers/common/include/prov/der_ec.h" + ], + "providers/implementations/signature/libdefault-lib-eddsa_sig.o" => [ + "providers/common/include/prov/der_ecx.h" + ], + "providers/implementations/signature/libdefault-lib-ml_dsa_sig.o" => [ + "providers/common/include/prov/der_ml_dsa.h" + ], + "providers/implementations/signature/libdefault-lib-rsa_sig.o" => [ + "providers/common/include/prov/der_rsa.h" + ], + "providers/implementations/signature/libdefault-lib-slh_dsa_sig.o" => [ + "providers/common/include/prov/der_slh_dsa.h" + ], + "providers/implementations/signature/libdefault-lib-sm2_sig.o" => [ + "providers/common/include/prov/der_sm2.h" + ], + "providers/implementations/signature/libfips-lib-dsa_sig.o" => [ + "providers/common/include/prov/der_dsa.h" + ], + "providers/implementations/signature/libfips-lib-ecdsa_sig.o" => [ + "providers/common/include/prov/der_ec.h" + ], + "providers/implementations/signature/libfips-lib-eddsa_sig.o" => [ + "providers/common/include/prov/der_ecx.h" + ], + "providers/implementations/signature/libfips-lib-ml_dsa_sig.o" => [ + "providers/common/include/prov/der_ml_dsa.h" + ], + "providers/implementations/signature/libfips-lib-rsa_sig.o" => [ + "providers/common/include/prov/der_rsa.h" + ], + "providers/implementations/signature/libfips-lib-slh_dsa_sig.o" => [ + "providers/common/include/prov/der_slh_dsa.h" + ], + "providers/legacy" => [ + "libcrypto", + "providers/liblegacy.a" + ], + "providers/libcommon.a" => [ + "libcrypto" + ], + "providers/libdefault.a" => [ + "providers/libcommon.a" + ], + "providers/liblegacy.a" => [ + "providers/libcommon.a" + ], + "util/wrap.pl" => [ + "configdata.pm" + ] + }, + "dirinfo" => { + "apps" => { + "products" => { + "bin" => [ + "apps/openssl" + ], + "script" => [ + "apps/CA.pl", + "apps/tsget.pl" + ] + } + }, + "apps/lib" => { + "deps" => [ + "apps/lib/openssl-bin-cmp_mock_srv.o", + "apps/lib/libapps-lib-app_libctx.o", + "apps/lib/libapps-lib-app_params.o", + "apps/lib/libapps-lib-app_provider.o", + "apps/lib/libapps-lib-app_rand.o", + "apps/lib/libapps-lib-app_x509.o", + "apps/lib/libapps-lib-apps.o", + "apps/lib/libapps-lib-apps_opt_printf.o", + "apps/lib/libapps-lib-apps_ui.o", + "apps/lib/libapps-lib-columns.o", + "apps/lib/libapps-lib-engine.o", + "apps/lib/libapps-lib-engine_loader.o", + "apps/lib/libapps-lib-fmt.o", + "apps/lib/libapps-lib-http_server.o", + "apps/lib/libapps-lib-log.o", + "apps/lib/libapps-lib-names.o", + "apps/lib/libapps-lib-opt.o", + "apps/lib/libapps-lib-s_cb.o", + "apps/lib/libapps-lib-s_socket.o", + "apps/lib/libapps-lib-tlssrp_depr.o" + ], + "products" => { + "bin" => [ + "apps/openssl" + ], + "lib" => [ + "apps/libapps.a" + ] + } + }, + "crypto" => { + "deps" => [ + "crypto/libcrypto-lib-asn1_dsa.o", + "crypto/libcrypto-lib-bsearch.o", + "crypto/libcrypto-lib-comp_methods.o", + "crypto/libcrypto-lib-context.o", + "crypto/libcrypto-lib-core_algorithm.o", + "crypto/libcrypto-lib-core_fetch.o", + "crypto/libcrypto-lib-core_namemap.o", + "crypto/libcrypto-lib-cpt_err.o", + "crypto/libcrypto-lib-cpuid.o", + "crypto/libcrypto-lib-cryptlib.o", + "crypto/libcrypto-lib-ctype.o", + "crypto/libcrypto-lib-cversion.o", + "crypto/libcrypto-lib-defaults.o", + "crypto/libcrypto-lib-der_writer.o", + "crypto/libcrypto-lib-deterministic_nonce.o", + "crypto/libcrypto-lib-ebcdic.o", + "crypto/libcrypto-lib-ex_data.o", + "crypto/libcrypto-lib-getenv.o", + "crypto/libcrypto-lib-indicator_core.o", + "crypto/libcrypto-lib-info.o", + "crypto/libcrypto-lib-init.o", + "crypto/libcrypto-lib-initthread.o", + "crypto/libcrypto-lib-mem.o", + "crypto/libcrypto-lib-mem_sec.o", + "crypto/libcrypto-lib-o_dir.o", + "crypto/libcrypto-lib-o_fopen.o", + "crypto/libcrypto-lib-o_init.o", + "crypto/libcrypto-lib-o_str.o", + "crypto/libcrypto-lib-o_time.o", + "crypto/libcrypto-lib-packet.o", + "crypto/libcrypto-lib-param_build.o", + "crypto/libcrypto-lib-param_build_set.o", + "crypto/libcrypto-lib-params.o", + "crypto/libcrypto-lib-params_dup.o", + "crypto/libcrypto-lib-params_from_text.o", + "crypto/libcrypto-lib-params_idx.o", + "crypto/libcrypto-lib-passphrase.o", + "crypto/libcrypto-lib-provider.o", + "crypto/libcrypto-lib-provider_child.o", + "crypto/libcrypto-lib-provider_conf.o", + "crypto/libcrypto-lib-provider_core.o", + "crypto/libcrypto-lib-provider_predefined.o", + "crypto/libcrypto-lib-punycode.o", + "crypto/libcrypto-lib-quic_vlint.o", + "crypto/libcrypto-lib-riscv64cpuid.o", + "crypto/libcrypto-lib-riscvcap.o", + "crypto/libcrypto-lib-self_test_core.o", + "crypto/libcrypto-lib-sleep.o", + "crypto/libcrypto-lib-sparse_array.o", + "crypto/libcrypto-lib-ssl_err.o", + "crypto/libcrypto-lib-threads_lib.o", + "crypto/libcrypto-lib-threads_none.o", + "crypto/libcrypto-lib-threads_pthread.o", + "crypto/libcrypto-lib-threads_win.o", + "crypto/libcrypto-lib-time.o", + "crypto/libcrypto-lib-trace.o", + "crypto/libcrypto-lib-uid.o", + "crypto/libfips-lib-asn1_dsa.o", + "crypto/libfips-lib-bsearch.o", + "crypto/libfips-lib-context.o", + "crypto/libfips-lib-core_algorithm.o", + "crypto/libfips-lib-core_fetch.o", + "crypto/libfips-lib-core_namemap.o", + "crypto/libfips-lib-cpuid.o", + "crypto/libfips-lib-cryptlib.o", + "crypto/libfips-lib-ctype.o", + "crypto/libfips-lib-der_writer.o", + "crypto/libfips-lib-ex_data.o", + "crypto/libfips-lib-initthread.o", + "crypto/libfips-lib-o_str.o", + "crypto/libfips-lib-packet.o", + "crypto/libfips-lib-param_build.o", + "crypto/libfips-lib-param_build_set.o", + "crypto/libfips-lib-params.o", + "crypto/libfips-lib-params_dup.o", + "crypto/libfips-lib-params_from_text.o", + "crypto/libfips-lib-params_idx.o", + "crypto/libfips-lib-provider_core.o", + "crypto/libfips-lib-provider_predefined.o", + "crypto/libfips-lib-riscv64cpuid.o", + "crypto/libfips-lib-riscvcap.o", + "crypto/libfips-lib-self_test_core.o", + "crypto/libfips-lib-sparse_array.o", + "crypto/libfips-lib-threads_lib.o", + "crypto/libfips-lib-threads_none.o", + "crypto/libfips-lib-threads_pthread.o", + "crypto/libfips-lib-threads_win.o", + "crypto/libfips-lib-time.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/aes" => { + "deps" => [ + "crypto/aes/libcrypto-lib-aes-riscv64-zkn.o", + "crypto/aes/libcrypto-lib-aes-riscv64-zvbb-zvkg-zvkned.o", + "crypto/aes/libcrypto-lib-aes-riscv64-zvkb-zvkned.o", + "crypto/aes/libcrypto-lib-aes-riscv64-zvkned.o", + "crypto/aes/libcrypto-lib-aes-riscv64.o", + "crypto/aes/libcrypto-lib-aes_cbc.o", + "crypto/aes/libcrypto-lib-aes_cfb.o", + "crypto/aes/libcrypto-lib-aes_ecb.o", + "crypto/aes/libcrypto-lib-aes_ige.o", + "crypto/aes/libcrypto-lib-aes_misc.o", + "crypto/aes/libcrypto-lib-aes_ofb.o", + "crypto/aes/libcrypto-lib-aes_wrap.o", + "crypto/aes/libfips-lib-aes-riscv64-zkn.o", + "crypto/aes/libfips-lib-aes-riscv64-zvbb-zvkg-zvkned.o", + "crypto/aes/libfips-lib-aes-riscv64-zvkb-zvkned.o", + "crypto/aes/libfips-lib-aes-riscv64-zvkned.o", + "crypto/aes/libfips-lib-aes-riscv64.o", + "crypto/aes/libfips-lib-aes_cbc.o", + "crypto/aes/libfips-lib-aes_ecb.o", + "crypto/aes/libfips-lib-aes_misc.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/aria" => { + "deps" => [ + "crypto/aria/libcrypto-lib-aria.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/asn1" => { + "deps" => [ + "crypto/asn1/libcrypto-lib-a_bitstr.o", + "crypto/asn1/libcrypto-lib-a_d2i_fp.o", + "crypto/asn1/libcrypto-lib-a_digest.o", + "crypto/asn1/libcrypto-lib-a_dup.o", + "crypto/asn1/libcrypto-lib-a_gentm.o", + "crypto/asn1/libcrypto-lib-a_i2d_fp.o", + "crypto/asn1/libcrypto-lib-a_int.o", + "crypto/asn1/libcrypto-lib-a_mbstr.o", + "crypto/asn1/libcrypto-lib-a_object.o", + "crypto/asn1/libcrypto-lib-a_octet.o", + "crypto/asn1/libcrypto-lib-a_print.o", + "crypto/asn1/libcrypto-lib-a_sign.o", + "crypto/asn1/libcrypto-lib-a_strex.o", + "crypto/asn1/libcrypto-lib-a_strnid.o", + "crypto/asn1/libcrypto-lib-a_time.o", + "crypto/asn1/libcrypto-lib-a_type.o", + "crypto/asn1/libcrypto-lib-a_utctm.o", + "crypto/asn1/libcrypto-lib-a_utf8.o", + "crypto/asn1/libcrypto-lib-a_verify.o", + "crypto/asn1/libcrypto-lib-ameth_lib.o", + "crypto/asn1/libcrypto-lib-asn1_err.o", + "crypto/asn1/libcrypto-lib-asn1_gen.o", + "crypto/asn1/libcrypto-lib-asn1_item_list.o", + "crypto/asn1/libcrypto-lib-asn1_lib.o", + "crypto/asn1/libcrypto-lib-asn1_parse.o", + "crypto/asn1/libcrypto-lib-asn_mime.o", + "crypto/asn1/libcrypto-lib-asn_moid.o", + "crypto/asn1/libcrypto-lib-asn_mstbl.o", + "crypto/asn1/libcrypto-lib-asn_pack.o", + "crypto/asn1/libcrypto-lib-bio_asn1.o", + "crypto/asn1/libcrypto-lib-bio_ndef.o", + "crypto/asn1/libcrypto-lib-d2i_param.o", + "crypto/asn1/libcrypto-lib-d2i_pr.o", + "crypto/asn1/libcrypto-lib-d2i_pu.o", + "crypto/asn1/libcrypto-lib-evp_asn1.o", + "crypto/asn1/libcrypto-lib-f_int.o", + "crypto/asn1/libcrypto-lib-f_string.o", + "crypto/asn1/libcrypto-lib-i2d_evp.o", + "crypto/asn1/libcrypto-lib-n_pkey.o", + "crypto/asn1/libcrypto-lib-nsseq.o", + "crypto/asn1/libcrypto-lib-p5_pbe.o", + "crypto/asn1/libcrypto-lib-p5_pbev2.o", + "crypto/asn1/libcrypto-lib-p5_scrypt.o", + "crypto/asn1/libcrypto-lib-p8_pkey.o", + "crypto/asn1/libcrypto-lib-t_bitst.o", + "crypto/asn1/libcrypto-lib-t_pkey.o", + "crypto/asn1/libcrypto-lib-t_spki.o", + "crypto/asn1/libcrypto-lib-tasn_dec.o", + "crypto/asn1/libcrypto-lib-tasn_enc.o", + "crypto/asn1/libcrypto-lib-tasn_fre.o", + "crypto/asn1/libcrypto-lib-tasn_new.o", + "crypto/asn1/libcrypto-lib-tasn_prn.o", + "crypto/asn1/libcrypto-lib-tasn_scn.o", + "crypto/asn1/libcrypto-lib-tasn_typ.o", + "crypto/asn1/libcrypto-lib-tasn_utl.o", + "crypto/asn1/libcrypto-lib-x_algor.o", + "crypto/asn1/libcrypto-lib-x_bignum.o", + "crypto/asn1/libcrypto-lib-x_info.o", + "crypto/asn1/libcrypto-lib-x_int64.o", + "crypto/asn1/libcrypto-lib-x_long.o", + "crypto/asn1/libcrypto-lib-x_pkey.o", + "crypto/asn1/libcrypto-lib-x_sig.o", + "crypto/asn1/libcrypto-lib-x_spki.o", + "crypto/asn1/libcrypto-lib-x_val.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/async" => { + "deps" => [ + "crypto/async/libcrypto-lib-async.o", + "crypto/async/libcrypto-lib-async_err.o", + "crypto/async/libcrypto-lib-async_wait.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/async/arch" => { + "deps" => [ + "crypto/async/arch/libcrypto-lib-async_null.o", + "crypto/async/arch/libcrypto-lib-async_posix.o", + "crypto/async/arch/libcrypto-lib-async_win.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/bf" => { + "deps" => [ + "crypto/bf/libcrypto-lib-bf_cfb64.o", + "crypto/bf/libcrypto-lib-bf_ecb.o", + "crypto/bf/libcrypto-lib-bf_enc.o", + "crypto/bf/libcrypto-lib-bf_ofb64.o", + "crypto/bf/libcrypto-lib-bf_skey.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/bio" => { + "deps" => [ + "crypto/bio/libcrypto-lib-bf_buff.o", + "crypto/bio/libcrypto-lib-bf_lbuf.o", + "crypto/bio/libcrypto-lib-bf_nbio.o", + "crypto/bio/libcrypto-lib-bf_null.o", + "crypto/bio/libcrypto-lib-bf_prefix.o", + "crypto/bio/libcrypto-lib-bf_readbuff.o", + "crypto/bio/libcrypto-lib-bio_addr.o", + "crypto/bio/libcrypto-lib-bio_cb.o", + "crypto/bio/libcrypto-lib-bio_dump.o", + "crypto/bio/libcrypto-lib-bio_err.o", + "crypto/bio/libcrypto-lib-bio_lib.o", + "crypto/bio/libcrypto-lib-bio_meth.o", + "crypto/bio/libcrypto-lib-bio_print.o", + "crypto/bio/libcrypto-lib-bio_sock.o", + "crypto/bio/libcrypto-lib-bio_sock2.o", + "crypto/bio/libcrypto-lib-bss_acpt.o", + "crypto/bio/libcrypto-lib-bss_bio.o", + "crypto/bio/libcrypto-lib-bss_conn.o", + "crypto/bio/libcrypto-lib-bss_core.o", + "crypto/bio/libcrypto-lib-bss_dgram.o", + "crypto/bio/libcrypto-lib-bss_dgram_pair.o", + "crypto/bio/libcrypto-lib-bss_fd.o", + "crypto/bio/libcrypto-lib-bss_file.o", + "crypto/bio/libcrypto-lib-bss_log.o", + "crypto/bio/libcrypto-lib-bss_mem.o", + "crypto/bio/libcrypto-lib-bss_null.o", + "crypto/bio/libcrypto-lib-bss_sock.o", + "crypto/bio/libcrypto-lib-ossl_core_bio.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/bn" => { + "deps" => [ + "crypto/bn/libcrypto-lib-bn_add.o", + "crypto/bn/libcrypto-lib-bn_asm.o", + "crypto/bn/libcrypto-lib-bn_blind.o", + "crypto/bn/libcrypto-lib-bn_const.o", + "crypto/bn/libcrypto-lib-bn_conv.o", + "crypto/bn/libcrypto-lib-bn_ctx.o", + "crypto/bn/libcrypto-lib-bn_depr.o", + "crypto/bn/libcrypto-lib-bn_dh.o", + "crypto/bn/libcrypto-lib-bn_div.o", + "crypto/bn/libcrypto-lib-bn_err.o", + "crypto/bn/libcrypto-lib-bn_exp.o", + "crypto/bn/libcrypto-lib-bn_exp2.o", + "crypto/bn/libcrypto-lib-bn_gcd.o", + "crypto/bn/libcrypto-lib-bn_gf2m.o", + "crypto/bn/libcrypto-lib-bn_intern.o", + "crypto/bn/libcrypto-lib-bn_kron.o", + "crypto/bn/libcrypto-lib-bn_lib.o", + "crypto/bn/libcrypto-lib-bn_mod.o", + "crypto/bn/libcrypto-lib-bn_mont.o", + "crypto/bn/libcrypto-lib-bn_mpi.o", + "crypto/bn/libcrypto-lib-bn_mul.o", + "crypto/bn/libcrypto-lib-bn_nist.o", + "crypto/bn/libcrypto-lib-bn_prime.o", + "crypto/bn/libcrypto-lib-bn_print.o", + "crypto/bn/libcrypto-lib-bn_rand.o", + "crypto/bn/libcrypto-lib-bn_recp.o", + "crypto/bn/libcrypto-lib-bn_rsa_fips186_4.o", + "crypto/bn/libcrypto-lib-bn_shift.o", + "crypto/bn/libcrypto-lib-bn_sqr.o", + "crypto/bn/libcrypto-lib-bn_sqrt.o", + "crypto/bn/libcrypto-lib-bn_srp.o", + "crypto/bn/libcrypto-lib-bn_word.o", + "crypto/bn/libcrypto-lib-bn_x931p.o", + "crypto/bn/libfips-lib-bn_add.o", + "crypto/bn/libfips-lib-bn_asm.o", + "crypto/bn/libfips-lib-bn_blind.o", + "crypto/bn/libfips-lib-bn_const.o", + "crypto/bn/libfips-lib-bn_conv.o", + "crypto/bn/libfips-lib-bn_ctx.o", + "crypto/bn/libfips-lib-bn_dh.o", + "crypto/bn/libfips-lib-bn_div.o", + "crypto/bn/libfips-lib-bn_exp.o", + "crypto/bn/libfips-lib-bn_exp2.o", + "crypto/bn/libfips-lib-bn_gcd.o", + "crypto/bn/libfips-lib-bn_gf2m.o", + "crypto/bn/libfips-lib-bn_intern.o", + "crypto/bn/libfips-lib-bn_kron.o", + "crypto/bn/libfips-lib-bn_lib.o", + "crypto/bn/libfips-lib-bn_mod.o", + "crypto/bn/libfips-lib-bn_mont.o", + "crypto/bn/libfips-lib-bn_mpi.o", + "crypto/bn/libfips-lib-bn_mul.o", + "crypto/bn/libfips-lib-bn_nist.o", + "crypto/bn/libfips-lib-bn_prime.o", + "crypto/bn/libfips-lib-bn_rand.o", + "crypto/bn/libfips-lib-bn_recp.o", + "crypto/bn/libfips-lib-bn_rsa_fips186_4.o", + "crypto/bn/libfips-lib-bn_shift.o", + "crypto/bn/libfips-lib-bn_sqr.o", + "crypto/bn/libfips-lib-bn_sqrt.o", + "crypto/bn/libfips-lib-bn_word.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/buffer" => { + "deps" => [ + "crypto/buffer/libcrypto-lib-buf_err.o", + "crypto/buffer/libcrypto-lib-buffer.o", + "crypto/buffer/libfips-lib-buffer.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/camellia" => { + "deps" => [ + "crypto/camellia/libcrypto-lib-camellia.o", + "crypto/camellia/libcrypto-lib-cmll_cbc.o", + "crypto/camellia/libcrypto-lib-cmll_cfb.o", + "crypto/camellia/libcrypto-lib-cmll_ctr.o", + "crypto/camellia/libcrypto-lib-cmll_ecb.o", + "crypto/camellia/libcrypto-lib-cmll_misc.o", + "crypto/camellia/libcrypto-lib-cmll_ofb.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/cast" => { + "deps" => [ + "crypto/cast/libcrypto-lib-c_cfb64.o", + "crypto/cast/libcrypto-lib-c_ecb.o", + "crypto/cast/libcrypto-lib-c_enc.o", + "crypto/cast/libcrypto-lib-c_ofb64.o", + "crypto/cast/libcrypto-lib-c_skey.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/chacha" => { + "deps" => [ + "crypto/chacha/libcrypto-lib-chacha-riscv64-v-zbb-zvkb.o", + "crypto/chacha/libcrypto-lib-chacha-riscv64-v-zbb.o", + "crypto/chacha/libcrypto-lib-chacha_enc.o", + "crypto/chacha/libcrypto-lib-chacha_riscv.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/cmac" => { + "deps" => [ + "crypto/cmac/libcrypto-lib-cmac.o", + "crypto/cmac/libfips-lib-cmac.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/cmp" => { + "deps" => [ + "crypto/cmp/libcrypto-lib-cmp_asn.o", + "crypto/cmp/libcrypto-lib-cmp_client.o", + "crypto/cmp/libcrypto-lib-cmp_ctx.o", + "crypto/cmp/libcrypto-lib-cmp_err.o", + "crypto/cmp/libcrypto-lib-cmp_genm.o", + "crypto/cmp/libcrypto-lib-cmp_hdr.o", + "crypto/cmp/libcrypto-lib-cmp_http.o", + "crypto/cmp/libcrypto-lib-cmp_msg.o", + "crypto/cmp/libcrypto-lib-cmp_protect.o", + "crypto/cmp/libcrypto-lib-cmp_server.o", + "crypto/cmp/libcrypto-lib-cmp_status.o", + "crypto/cmp/libcrypto-lib-cmp_util.o", + "crypto/cmp/libcrypto-lib-cmp_vfy.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/cms" => { + "deps" => [ + "crypto/cms/libcrypto-lib-cms_asn1.o", + "crypto/cms/libcrypto-lib-cms_att.o", + "crypto/cms/libcrypto-lib-cms_cd.o", + "crypto/cms/libcrypto-lib-cms_dd.o", + "crypto/cms/libcrypto-lib-cms_dh.o", + "crypto/cms/libcrypto-lib-cms_ec.o", + "crypto/cms/libcrypto-lib-cms_enc.o", + "crypto/cms/libcrypto-lib-cms_env.o", + "crypto/cms/libcrypto-lib-cms_err.o", + "crypto/cms/libcrypto-lib-cms_ess.o", + "crypto/cms/libcrypto-lib-cms_io.o", + "crypto/cms/libcrypto-lib-cms_kari.o", + "crypto/cms/libcrypto-lib-cms_lib.o", + "crypto/cms/libcrypto-lib-cms_pwri.o", + "crypto/cms/libcrypto-lib-cms_rsa.o", + "crypto/cms/libcrypto-lib-cms_sd.o", + "crypto/cms/libcrypto-lib-cms_smime.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/comp" => { + "deps" => [ + "crypto/comp/libcrypto-lib-c_brotli.o", + "crypto/comp/libcrypto-lib-c_zlib.o", + "crypto/comp/libcrypto-lib-c_zstd.o", + "crypto/comp/libcrypto-lib-comp_err.o", + "crypto/comp/libcrypto-lib-comp_lib.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/conf" => { + "deps" => [ + "crypto/conf/libcrypto-lib-conf_api.o", + "crypto/conf/libcrypto-lib-conf_def.o", + "crypto/conf/libcrypto-lib-conf_err.o", + "crypto/conf/libcrypto-lib-conf_lib.o", + "crypto/conf/libcrypto-lib-conf_mall.o", + "crypto/conf/libcrypto-lib-conf_mod.o", + "crypto/conf/libcrypto-lib-conf_sap.o", + "crypto/conf/libcrypto-lib-conf_ssl.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/crmf" => { + "deps" => [ + "crypto/crmf/libcrypto-lib-crmf_asn.o", + "crypto/crmf/libcrypto-lib-crmf_err.o", + "crypto/crmf/libcrypto-lib-crmf_lib.o", + "crypto/crmf/libcrypto-lib-crmf_pbm.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/ct" => { + "deps" => [ + "crypto/ct/libcrypto-lib-ct_b64.o", + "crypto/ct/libcrypto-lib-ct_err.o", + "crypto/ct/libcrypto-lib-ct_log.o", + "crypto/ct/libcrypto-lib-ct_oct.o", + "crypto/ct/libcrypto-lib-ct_policy.o", + "crypto/ct/libcrypto-lib-ct_prn.o", + "crypto/ct/libcrypto-lib-ct_sct.o", + "crypto/ct/libcrypto-lib-ct_sct_ctx.o", + "crypto/ct/libcrypto-lib-ct_vfy.o", + "crypto/ct/libcrypto-lib-ct_x509v3.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/des" => { + "deps" => [ + "crypto/des/libcrypto-lib-cbc_cksm.o", + "crypto/des/libcrypto-lib-cbc_enc.o", + "crypto/des/libcrypto-lib-cfb64ede.o", + "crypto/des/libcrypto-lib-cfb64enc.o", + "crypto/des/libcrypto-lib-cfb_enc.o", + "crypto/des/libcrypto-lib-des_enc.o", + "crypto/des/libcrypto-lib-ecb3_enc.o", + "crypto/des/libcrypto-lib-ecb_enc.o", + "crypto/des/libcrypto-lib-fcrypt.o", + "crypto/des/libcrypto-lib-fcrypt_b.o", + "crypto/des/libcrypto-lib-ofb64ede.o", + "crypto/des/libcrypto-lib-ofb64enc.o", + "crypto/des/libcrypto-lib-ofb_enc.o", + "crypto/des/libcrypto-lib-pcbc_enc.o", + "crypto/des/libcrypto-lib-qud_cksm.o", + "crypto/des/libcrypto-lib-rand_key.o", + "crypto/des/libcrypto-lib-set_key.o", + "crypto/des/libcrypto-lib-str2key.o", + "crypto/des/libcrypto-lib-xcbc_enc.o", + "crypto/des/libfips-lib-des_enc.o", + "crypto/des/libfips-lib-ecb3_enc.o", + "crypto/des/libfips-lib-fcrypt_b.o", + "crypto/des/libfips-lib-set_key.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/dh" => { + "deps" => [ + "crypto/dh/libcrypto-lib-dh_ameth.o", + "crypto/dh/libcrypto-lib-dh_asn1.o", + "crypto/dh/libcrypto-lib-dh_backend.o", + "crypto/dh/libcrypto-lib-dh_check.o", + "crypto/dh/libcrypto-lib-dh_depr.o", + "crypto/dh/libcrypto-lib-dh_err.o", + "crypto/dh/libcrypto-lib-dh_gen.o", + "crypto/dh/libcrypto-lib-dh_group_params.o", + "crypto/dh/libcrypto-lib-dh_kdf.o", + "crypto/dh/libcrypto-lib-dh_key.o", + "crypto/dh/libcrypto-lib-dh_lib.o", + "crypto/dh/libcrypto-lib-dh_meth.o", + "crypto/dh/libcrypto-lib-dh_pmeth.o", + "crypto/dh/libcrypto-lib-dh_prn.o", + "crypto/dh/libcrypto-lib-dh_rfc5114.o", + "crypto/dh/libfips-lib-dh_backend.o", + "crypto/dh/libfips-lib-dh_check.o", + "crypto/dh/libfips-lib-dh_gen.o", + "crypto/dh/libfips-lib-dh_group_params.o", + "crypto/dh/libfips-lib-dh_kdf.o", + "crypto/dh/libfips-lib-dh_key.o", + "crypto/dh/libfips-lib-dh_lib.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/dsa" => { + "deps" => [ + "crypto/dsa/libcrypto-lib-dsa_ameth.o", + "crypto/dsa/libcrypto-lib-dsa_asn1.o", + "crypto/dsa/libcrypto-lib-dsa_backend.o", + "crypto/dsa/libcrypto-lib-dsa_check.o", + "crypto/dsa/libcrypto-lib-dsa_depr.o", + "crypto/dsa/libcrypto-lib-dsa_err.o", + "crypto/dsa/libcrypto-lib-dsa_gen.o", + "crypto/dsa/libcrypto-lib-dsa_key.o", + "crypto/dsa/libcrypto-lib-dsa_lib.o", + "crypto/dsa/libcrypto-lib-dsa_meth.o", + "crypto/dsa/libcrypto-lib-dsa_ossl.o", + "crypto/dsa/libcrypto-lib-dsa_pmeth.o", + "crypto/dsa/libcrypto-lib-dsa_prn.o", + "crypto/dsa/libcrypto-lib-dsa_sign.o", + "crypto/dsa/libcrypto-lib-dsa_vrf.o", + "crypto/dsa/libfips-lib-dsa_backend.o", + "crypto/dsa/libfips-lib-dsa_check.o", + "crypto/dsa/libfips-lib-dsa_gen.o", + "crypto/dsa/libfips-lib-dsa_key.o", + "crypto/dsa/libfips-lib-dsa_lib.o", + "crypto/dsa/libfips-lib-dsa_ossl.o", + "crypto/dsa/libfips-lib-dsa_sign.o", + "crypto/dsa/libfips-lib-dsa_vrf.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/dso" => { + "deps" => [ + "crypto/dso/libcrypto-lib-dso_dl.o", + "crypto/dso/libcrypto-lib-dso_dlfcn.o", + "crypto/dso/libcrypto-lib-dso_err.o", + "crypto/dso/libcrypto-lib-dso_lib.o", + "crypto/dso/libcrypto-lib-dso_openssl.o", + "crypto/dso/libcrypto-lib-dso_vms.o", + "crypto/dso/libcrypto-lib-dso_win32.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/ec" => { + "deps" => [ + "crypto/ec/libcrypto-lib-curve25519.o", + "crypto/ec/libcrypto-lib-ec2_oct.o", + "crypto/ec/libcrypto-lib-ec2_smpl.o", + "crypto/ec/libcrypto-lib-ec_ameth.o", + "crypto/ec/libcrypto-lib-ec_asn1.o", + "crypto/ec/libcrypto-lib-ec_backend.o", + "crypto/ec/libcrypto-lib-ec_check.o", + "crypto/ec/libcrypto-lib-ec_curve.o", + "crypto/ec/libcrypto-lib-ec_cvt.o", + "crypto/ec/libcrypto-lib-ec_deprecated.o", + "crypto/ec/libcrypto-lib-ec_err.o", + "crypto/ec/libcrypto-lib-ec_key.o", + "crypto/ec/libcrypto-lib-ec_kmeth.o", + "crypto/ec/libcrypto-lib-ec_lib.o", + "crypto/ec/libcrypto-lib-ec_mult.o", + "crypto/ec/libcrypto-lib-ec_oct.o", + "crypto/ec/libcrypto-lib-ec_pmeth.o", + "crypto/ec/libcrypto-lib-ec_print.o", + "crypto/ec/libcrypto-lib-ecdh_kdf.o", + "crypto/ec/libcrypto-lib-ecdh_ossl.o", + "crypto/ec/libcrypto-lib-ecdsa_ossl.o", + "crypto/ec/libcrypto-lib-ecdsa_sign.o", + "crypto/ec/libcrypto-lib-ecdsa_vrf.o", + "crypto/ec/libcrypto-lib-eck_prn.o", + "crypto/ec/libcrypto-lib-ecp_mont.o", + "crypto/ec/libcrypto-lib-ecp_nist.o", + "crypto/ec/libcrypto-lib-ecp_oct.o", + "crypto/ec/libcrypto-lib-ecp_smpl.o", + "crypto/ec/libcrypto-lib-ecx_backend.o", + "crypto/ec/libcrypto-lib-ecx_key.o", + "crypto/ec/libcrypto-lib-ecx_meth.o", + "crypto/ec/libfips-lib-curve25519.o", + "crypto/ec/libfips-lib-ec2_oct.o", + "crypto/ec/libfips-lib-ec2_smpl.o", + "crypto/ec/libfips-lib-ec_asn1.o", + "crypto/ec/libfips-lib-ec_backend.o", + "crypto/ec/libfips-lib-ec_check.o", + "crypto/ec/libfips-lib-ec_curve.o", + "crypto/ec/libfips-lib-ec_cvt.o", + "crypto/ec/libfips-lib-ec_key.o", + "crypto/ec/libfips-lib-ec_kmeth.o", + "crypto/ec/libfips-lib-ec_lib.o", + "crypto/ec/libfips-lib-ec_mult.o", + "crypto/ec/libfips-lib-ec_oct.o", + "crypto/ec/libfips-lib-ecdh_kdf.o", + "crypto/ec/libfips-lib-ecdh_ossl.o", + "crypto/ec/libfips-lib-ecdsa_ossl.o", + "crypto/ec/libfips-lib-ecdsa_sign.o", + "crypto/ec/libfips-lib-ecdsa_vrf.o", + "crypto/ec/libfips-lib-ecp_mont.o", + "crypto/ec/libfips-lib-ecp_nist.o", + "crypto/ec/libfips-lib-ecp_oct.o", + "crypto/ec/libfips-lib-ecp_smpl.o", + "crypto/ec/libfips-lib-ecx_backend.o", + "crypto/ec/libfips-lib-ecx_key.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/ec/curve448" => { + "deps" => [ + "crypto/ec/curve448/libcrypto-lib-curve448.o", + "crypto/ec/curve448/libcrypto-lib-curve448_tables.o", + "crypto/ec/curve448/libcrypto-lib-eddsa.o", + "crypto/ec/curve448/libcrypto-lib-f_generic.o", + "crypto/ec/curve448/libcrypto-lib-scalar.o", + "crypto/ec/curve448/libfips-lib-curve448.o", + "crypto/ec/curve448/libfips-lib-curve448_tables.o", + "crypto/ec/curve448/libfips-lib-eddsa.o", + "crypto/ec/curve448/libfips-lib-f_generic.o", + "crypto/ec/curve448/libfips-lib-scalar.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/ec/curve448/arch_32" => { + "deps" => [ + "crypto/ec/curve448/arch_32/libcrypto-lib-f_impl32.o", + "crypto/ec/curve448/arch_32/libfips-lib-f_impl32.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/ec/curve448/arch_64" => { + "deps" => [ + "crypto/ec/curve448/arch_64/libcrypto-lib-f_impl64.o", + "crypto/ec/curve448/arch_64/libfips-lib-f_impl64.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/encode_decode" => { + "deps" => [ + "crypto/encode_decode/libcrypto-lib-decoder_err.o", + "crypto/encode_decode/libcrypto-lib-decoder_lib.o", + "crypto/encode_decode/libcrypto-lib-decoder_meth.o", + "crypto/encode_decode/libcrypto-lib-decoder_pkey.o", + "crypto/encode_decode/libcrypto-lib-encoder_err.o", + "crypto/encode_decode/libcrypto-lib-encoder_lib.o", + "crypto/encode_decode/libcrypto-lib-encoder_meth.o", + "crypto/encode_decode/libcrypto-lib-encoder_pkey.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/engine" => { + "deps" => [ + "crypto/engine/libcrypto-lib-eng_all.o", + "crypto/engine/libcrypto-lib-eng_cnf.o", + "crypto/engine/libcrypto-lib-eng_ctrl.o", + "crypto/engine/libcrypto-lib-eng_dyn.o", + "crypto/engine/libcrypto-lib-eng_err.o", + "crypto/engine/libcrypto-lib-eng_fat.o", + "crypto/engine/libcrypto-lib-eng_init.o", + "crypto/engine/libcrypto-lib-eng_lib.o", + "crypto/engine/libcrypto-lib-eng_list.o", + "crypto/engine/libcrypto-lib-eng_openssl.o", + "crypto/engine/libcrypto-lib-eng_pkey.o", + "crypto/engine/libcrypto-lib-eng_rdrand.o", + "crypto/engine/libcrypto-lib-eng_table.o", + "crypto/engine/libcrypto-lib-tb_asnmth.o", + "crypto/engine/libcrypto-lib-tb_cipher.o", + "crypto/engine/libcrypto-lib-tb_dh.o", + "crypto/engine/libcrypto-lib-tb_digest.o", + "crypto/engine/libcrypto-lib-tb_dsa.o", + "crypto/engine/libcrypto-lib-tb_eckey.o", + "crypto/engine/libcrypto-lib-tb_pkmeth.o", + "crypto/engine/libcrypto-lib-tb_rand.o", + "crypto/engine/libcrypto-lib-tb_rsa.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/err" => { + "deps" => [ + "crypto/err/libcrypto-lib-err.o", + "crypto/err/libcrypto-lib-err_all.o", + "crypto/err/libcrypto-lib-err_all_legacy.o", + "crypto/err/libcrypto-lib-err_blocks.o", + "crypto/err/libcrypto-lib-err_mark.o", + "crypto/err/libcrypto-lib-err_prn.o", + "crypto/err/libcrypto-lib-err_save.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/ess" => { + "deps" => [ + "crypto/ess/libcrypto-lib-ess_asn1.o", + "crypto/ess/libcrypto-lib-ess_err.o", + "crypto/ess/libcrypto-lib-ess_lib.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/evp" => { + "deps" => [ + "crypto/evp/libcrypto-lib-asymcipher.o", + "crypto/evp/libcrypto-lib-bio_b64.o", + "crypto/evp/libcrypto-lib-bio_enc.o", + "crypto/evp/libcrypto-lib-bio_md.o", + "crypto/evp/libcrypto-lib-bio_ok.o", + "crypto/evp/libcrypto-lib-c_allc.o", + "crypto/evp/libcrypto-lib-c_alld.o", + "crypto/evp/libcrypto-lib-cmeth_lib.o", + "crypto/evp/libcrypto-lib-ctrl_params_translate.o", + "crypto/evp/libcrypto-lib-dh_ctrl.o", + "crypto/evp/libcrypto-lib-dh_support.o", + "crypto/evp/libcrypto-lib-digest.o", + "crypto/evp/libcrypto-lib-dsa_ctrl.o", + "crypto/evp/libcrypto-lib-e_aes.o", + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha1.o", + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha256.o", + "crypto/evp/libcrypto-lib-e_aria.o", + "crypto/evp/libcrypto-lib-e_bf.o", + "crypto/evp/libcrypto-lib-e_camellia.o", + "crypto/evp/libcrypto-lib-e_cast.o", + "crypto/evp/libcrypto-lib-e_chacha20_poly1305.o", + "crypto/evp/libcrypto-lib-e_des.o", + "crypto/evp/libcrypto-lib-e_des3.o", + "crypto/evp/libcrypto-lib-e_idea.o", + "crypto/evp/libcrypto-lib-e_null.o", + "crypto/evp/libcrypto-lib-e_old.o", + "crypto/evp/libcrypto-lib-e_rc2.o", + "crypto/evp/libcrypto-lib-e_rc4.o", + "crypto/evp/libcrypto-lib-e_rc4_hmac_md5.o", + "crypto/evp/libcrypto-lib-e_rc5.o", + "crypto/evp/libcrypto-lib-e_seed.o", + "crypto/evp/libcrypto-lib-e_sm4.o", + "crypto/evp/libcrypto-lib-e_xcbc_d.o", + "crypto/evp/libcrypto-lib-ec_ctrl.o", + "crypto/evp/libcrypto-lib-ec_support.o", + "crypto/evp/libcrypto-lib-encode.o", + "crypto/evp/libcrypto-lib-evp_cnf.o", + "crypto/evp/libcrypto-lib-evp_enc.o", + "crypto/evp/libcrypto-lib-evp_err.o", + "crypto/evp/libcrypto-lib-evp_fetch.o", + "crypto/evp/libcrypto-lib-evp_key.o", + "crypto/evp/libcrypto-lib-evp_lib.o", + "crypto/evp/libcrypto-lib-evp_pbe.o", + "crypto/evp/libcrypto-lib-evp_pkey.o", + "crypto/evp/libcrypto-lib-evp_rand.o", + "crypto/evp/libcrypto-lib-evp_utils.o", + "crypto/evp/libcrypto-lib-exchange.o", + "crypto/evp/libcrypto-lib-kdf_lib.o", + "crypto/evp/libcrypto-lib-kdf_meth.o", + "crypto/evp/libcrypto-lib-kem.o", + "crypto/evp/libcrypto-lib-keymgmt_lib.o", + "crypto/evp/libcrypto-lib-keymgmt_meth.o", + "crypto/evp/libcrypto-lib-legacy_blake2.o", + "crypto/evp/libcrypto-lib-legacy_md4.o", + "crypto/evp/libcrypto-lib-legacy_md5.o", + "crypto/evp/libcrypto-lib-legacy_md5_sha1.o", + "crypto/evp/libcrypto-lib-legacy_mdc2.o", + "crypto/evp/libcrypto-lib-legacy_ripemd.o", + "crypto/evp/libcrypto-lib-legacy_sha.o", + "crypto/evp/libcrypto-lib-legacy_wp.o", + "crypto/evp/libcrypto-lib-m_null.o", + "crypto/evp/libcrypto-lib-m_sigver.o", + "crypto/evp/libcrypto-lib-mac_lib.o", + "crypto/evp/libcrypto-lib-mac_meth.o", + "crypto/evp/libcrypto-lib-names.o", + "crypto/evp/libcrypto-lib-p5_crpt.o", + "crypto/evp/libcrypto-lib-p5_crpt2.o", + "crypto/evp/libcrypto-lib-p_dec.o", + "crypto/evp/libcrypto-lib-p_enc.o", + "crypto/evp/libcrypto-lib-p_legacy.o", + "crypto/evp/libcrypto-lib-p_lib.o", + "crypto/evp/libcrypto-lib-p_open.o", + "crypto/evp/libcrypto-lib-p_seal.o", + "crypto/evp/libcrypto-lib-p_sign.o", + "crypto/evp/libcrypto-lib-p_verify.o", + "crypto/evp/libcrypto-lib-pbe_scrypt.o", + "crypto/evp/libcrypto-lib-pmeth_check.o", + "crypto/evp/libcrypto-lib-pmeth_gn.o", + "crypto/evp/libcrypto-lib-pmeth_lib.o", + "crypto/evp/libcrypto-lib-s_lib.o", + "crypto/evp/libcrypto-lib-signature.o", + "crypto/evp/libcrypto-lib-skeymgmt_meth.o", + "crypto/evp/libfips-lib-asymcipher.o", + "crypto/evp/libfips-lib-dh_support.o", + "crypto/evp/libfips-lib-digest.o", + "crypto/evp/libfips-lib-ec_support.o", + "crypto/evp/libfips-lib-evp_enc.o", + "crypto/evp/libfips-lib-evp_fetch.o", + "crypto/evp/libfips-lib-evp_lib.o", + "crypto/evp/libfips-lib-evp_rand.o", + "crypto/evp/libfips-lib-evp_utils.o", + "crypto/evp/libfips-lib-exchange.o", + "crypto/evp/libfips-lib-kdf_lib.o", + "crypto/evp/libfips-lib-kdf_meth.o", + "crypto/evp/libfips-lib-kem.o", + "crypto/evp/libfips-lib-keymgmt_lib.o", + "crypto/evp/libfips-lib-keymgmt_meth.o", + "crypto/evp/libfips-lib-mac_lib.o", + "crypto/evp/libfips-lib-mac_meth.o", + "crypto/evp/libfips-lib-p_lib.o", + "crypto/evp/libfips-lib-pmeth_check.o", + "crypto/evp/libfips-lib-pmeth_gn.o", + "crypto/evp/libfips-lib-pmeth_lib.o", + "crypto/evp/libfips-lib-s_lib.o", + "crypto/evp/libfips-lib-signature.o", + "crypto/evp/libfips-lib-skeymgmt_meth.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/ffc" => { + "deps" => [ + "crypto/ffc/libcrypto-lib-ffc_backend.o", + "crypto/ffc/libcrypto-lib-ffc_dh.o", + "crypto/ffc/libcrypto-lib-ffc_key_generate.o", + "crypto/ffc/libcrypto-lib-ffc_key_validate.o", + "crypto/ffc/libcrypto-lib-ffc_params.o", + "crypto/ffc/libcrypto-lib-ffc_params_generate.o", + "crypto/ffc/libcrypto-lib-ffc_params_validate.o", + "crypto/ffc/libfips-lib-ffc_backend.o", + "crypto/ffc/libfips-lib-ffc_dh.o", + "crypto/ffc/libfips-lib-ffc_key_generate.o", + "crypto/ffc/libfips-lib-ffc_key_validate.o", + "crypto/ffc/libfips-lib-ffc_params.o", + "crypto/ffc/libfips-lib-ffc_params_generate.o", + "crypto/ffc/libfips-lib-ffc_params_validate.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/hashtable" => { + "deps" => [ + "crypto/hashtable/libcrypto-lib-hashfunc.o", + "crypto/hashtable/libcrypto-lib-hashtable.o", + "crypto/hashtable/libfips-lib-hashfunc.o", + "crypto/hashtable/libfips-lib-hashtable.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/hmac" => { + "deps" => [ + "crypto/hmac/libcrypto-lib-hmac.o", + "crypto/hmac/libfips-lib-hmac.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/hpke" => { + "deps" => [ + "crypto/hpke/libcrypto-lib-hpke.o", + "crypto/hpke/libcrypto-lib-hpke_util.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/http" => { + "deps" => [ + "crypto/http/libcrypto-lib-http_client.o", + "crypto/http/libcrypto-lib-http_err.o", + "crypto/http/libcrypto-lib-http_lib.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/idea" => { + "deps" => [ + "crypto/idea/libcrypto-lib-i_cbc.o", + "crypto/idea/libcrypto-lib-i_cfb64.o", + "crypto/idea/libcrypto-lib-i_ecb.o", + "crypto/idea/libcrypto-lib-i_ofb64.o", + "crypto/idea/libcrypto-lib-i_skey.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/kdf" => { + "deps" => [ + "crypto/kdf/libcrypto-lib-kdf_err.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/lhash" => { + "deps" => [ + "crypto/lhash/libcrypto-lib-lh_stats.o", + "crypto/lhash/libcrypto-lib-lhash.o", + "crypto/lhash/libfips-lib-lhash.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/md4" => { + "deps" => [ + "crypto/md4/libcrypto-lib-md4_dgst.o", + "crypto/md4/libcrypto-lib-md4_one.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/md5" => { + "deps" => [ + "crypto/md5/libcrypto-lib-md5_dgst.o", + "crypto/md5/libcrypto-lib-md5_one.o", + "crypto/md5/libcrypto-lib-md5_sha1.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/mdc2" => { + "deps" => [ + "crypto/mdc2/libcrypto-lib-mdc2_one.o", + "crypto/mdc2/libcrypto-lib-mdc2dgst.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/ml_dsa" => { + "deps" => [ + "crypto/ml_dsa/libcrypto-lib-ml_dsa_encoders.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_key.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_key_compress.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_matrix.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_ntt.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_params.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_sample.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_sign.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_encoders.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_key.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_key_compress.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_matrix.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_ntt.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_params.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_sample.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_sign.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/ml_kem" => { + "deps" => [ + "crypto/ml_kem/libcrypto-lib-ml_kem.o", + "crypto/ml_kem/libfips-lib-ml_kem.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/modes" => { + "deps" => [ + "crypto/modes/libcrypto-lib-aes-gcm-riscv64-zvkb-zvkg-zvkned.o", + "crypto/modes/libcrypto-lib-cbc128.o", + "crypto/modes/libcrypto-lib-ccm128.o", + "crypto/modes/libcrypto-lib-cfb128.o", + "crypto/modes/libcrypto-lib-ctr128.o", + "crypto/modes/libcrypto-lib-cts128.o", + "crypto/modes/libcrypto-lib-gcm128.o", + "crypto/modes/libcrypto-lib-ghash-riscv64-zvkb-zvbc.o", + "crypto/modes/libcrypto-lib-ghash-riscv64-zvkg.o", + "crypto/modes/libcrypto-lib-ghash-riscv64.o", + "crypto/modes/libcrypto-lib-ocb128.o", + "crypto/modes/libcrypto-lib-ofb128.o", + "crypto/modes/libcrypto-lib-siv128.o", + "crypto/modes/libcrypto-lib-wrap128.o", + "crypto/modes/libcrypto-lib-xts128.o", + "crypto/modes/libcrypto-lib-xts128gb.o", + "crypto/modes/libfips-lib-aes-gcm-riscv64-zvkb-zvkg-zvkned.o", + "crypto/modes/libfips-lib-cbc128.o", + "crypto/modes/libfips-lib-ccm128.o", + "crypto/modes/libfips-lib-cfb128.o", + "crypto/modes/libfips-lib-ctr128.o", + "crypto/modes/libfips-lib-gcm128.o", + "crypto/modes/libfips-lib-ghash-riscv64-zvkb-zvbc.o", + "crypto/modes/libfips-lib-ghash-riscv64-zvkg.o", + "crypto/modes/libfips-lib-ghash-riscv64.o", + "crypto/modes/libfips-lib-ofb128.o", + "crypto/modes/libfips-lib-wrap128.o", + "crypto/modes/libfips-lib-xts128.o", + "crypto/modes/libfips-lib-xts128gb.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/objects" => { + "deps" => [ + "crypto/objects/libcrypto-lib-o_names.o", + "crypto/objects/libcrypto-lib-obj_dat.o", + "crypto/objects/libcrypto-lib-obj_err.o", + "crypto/objects/libcrypto-lib-obj_lib.o", + "crypto/objects/libcrypto-lib-obj_xref.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/ocsp" => { + "deps" => [ + "crypto/ocsp/libcrypto-lib-ocsp_asn.o", + "crypto/ocsp/libcrypto-lib-ocsp_cl.o", + "crypto/ocsp/libcrypto-lib-ocsp_err.o", + "crypto/ocsp/libcrypto-lib-ocsp_ext.o", + "crypto/ocsp/libcrypto-lib-ocsp_http.o", + "crypto/ocsp/libcrypto-lib-ocsp_lib.o", + "crypto/ocsp/libcrypto-lib-ocsp_prn.o", + "crypto/ocsp/libcrypto-lib-ocsp_srv.o", + "crypto/ocsp/libcrypto-lib-ocsp_vfy.o", + "crypto/ocsp/libcrypto-lib-v3_ocsp.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/pem" => { + "deps" => [ + "crypto/pem/libcrypto-lib-pem_all.o", + "crypto/pem/libcrypto-lib-pem_err.o", + "crypto/pem/libcrypto-lib-pem_info.o", + "crypto/pem/libcrypto-lib-pem_lib.o", + "crypto/pem/libcrypto-lib-pem_oth.o", + "crypto/pem/libcrypto-lib-pem_pk8.o", + "crypto/pem/libcrypto-lib-pem_pkey.o", + "crypto/pem/libcrypto-lib-pem_sign.o", + "crypto/pem/libcrypto-lib-pem_x509.o", + "crypto/pem/libcrypto-lib-pem_xaux.o", + "crypto/pem/libcrypto-lib-pvkfmt.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/pkcs12" => { + "deps" => [ + "crypto/pkcs12/libcrypto-lib-p12_add.o", + "crypto/pkcs12/libcrypto-lib-p12_asn.o", + "crypto/pkcs12/libcrypto-lib-p12_attr.o", + "crypto/pkcs12/libcrypto-lib-p12_crpt.o", + "crypto/pkcs12/libcrypto-lib-p12_crt.o", + "crypto/pkcs12/libcrypto-lib-p12_decr.o", + "crypto/pkcs12/libcrypto-lib-p12_init.o", + "crypto/pkcs12/libcrypto-lib-p12_key.o", + "crypto/pkcs12/libcrypto-lib-p12_kiss.o", + "crypto/pkcs12/libcrypto-lib-p12_mutl.o", + "crypto/pkcs12/libcrypto-lib-p12_npas.o", + "crypto/pkcs12/libcrypto-lib-p12_p8d.o", + "crypto/pkcs12/libcrypto-lib-p12_p8e.o", + "crypto/pkcs12/libcrypto-lib-p12_sbag.o", + "crypto/pkcs12/libcrypto-lib-p12_utl.o", + "crypto/pkcs12/libcrypto-lib-pk12err.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/pkcs7" => { + "deps" => [ + "crypto/pkcs7/libcrypto-lib-bio_pk7.o", + "crypto/pkcs7/libcrypto-lib-pk7_asn1.o", + "crypto/pkcs7/libcrypto-lib-pk7_attr.o", + "crypto/pkcs7/libcrypto-lib-pk7_doit.o", + "crypto/pkcs7/libcrypto-lib-pk7_lib.o", + "crypto/pkcs7/libcrypto-lib-pk7_mime.o", + "crypto/pkcs7/libcrypto-lib-pk7_smime.o", + "crypto/pkcs7/libcrypto-lib-pkcs7err.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/poly1305" => { + "deps" => [ + "crypto/poly1305/libcrypto-lib-poly1305.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/property" => { + "deps" => [ + "crypto/property/libcrypto-lib-defn_cache.o", + "crypto/property/libcrypto-lib-property.o", + "crypto/property/libcrypto-lib-property_err.o", + "crypto/property/libcrypto-lib-property_parse.o", + "crypto/property/libcrypto-lib-property_query.o", + "crypto/property/libcrypto-lib-property_string.o", + "crypto/property/libfips-lib-defn_cache.o", + "crypto/property/libfips-lib-property.o", + "crypto/property/libfips-lib-property_parse.o", + "crypto/property/libfips-lib-property_query.o", + "crypto/property/libfips-lib-property_string.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/rand" => { + "deps" => [ + "crypto/rand/libcrypto-lib-prov_seed.o", + "crypto/rand/libcrypto-lib-rand_deprecated.o", + "crypto/rand/libcrypto-lib-rand_err.o", + "crypto/rand/libcrypto-lib-rand_lib.o", + "crypto/rand/libcrypto-lib-rand_meth.o", + "crypto/rand/libcrypto-lib-rand_pool.o", + "crypto/rand/libcrypto-lib-rand_uniform.o", + "crypto/rand/libcrypto-lib-randfile.o", + "crypto/rand/libfips-lib-rand_lib.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/rc2" => { + "deps" => [ + "crypto/rc2/libcrypto-lib-rc2_cbc.o", + "crypto/rc2/libcrypto-lib-rc2_ecb.o", + "crypto/rc2/libcrypto-lib-rc2_skey.o", + "crypto/rc2/libcrypto-lib-rc2cfb64.o", + "crypto/rc2/libcrypto-lib-rc2ofb64.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/rc4" => { + "deps" => [ + "crypto/rc4/libcrypto-lib-rc4_enc.o", + "crypto/rc4/libcrypto-lib-rc4_skey.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/ripemd" => { + "deps" => [ + "crypto/ripemd/libcrypto-lib-rmd_dgst.o", + "crypto/ripemd/libcrypto-lib-rmd_one.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/rsa" => { + "deps" => [ + "crypto/rsa/libcrypto-lib-rsa_ameth.o", + "crypto/rsa/libcrypto-lib-rsa_asn1.o", + "crypto/rsa/libcrypto-lib-rsa_backend.o", + "crypto/rsa/libcrypto-lib-rsa_chk.o", + "crypto/rsa/libcrypto-lib-rsa_crpt.o", + "crypto/rsa/libcrypto-lib-rsa_depr.o", + "crypto/rsa/libcrypto-lib-rsa_err.o", + "crypto/rsa/libcrypto-lib-rsa_gen.o", + "crypto/rsa/libcrypto-lib-rsa_lib.o", + "crypto/rsa/libcrypto-lib-rsa_meth.o", + "crypto/rsa/libcrypto-lib-rsa_mp.o", + "crypto/rsa/libcrypto-lib-rsa_mp_names.o", + "crypto/rsa/libcrypto-lib-rsa_none.o", + "crypto/rsa/libcrypto-lib-rsa_oaep.o", + "crypto/rsa/libcrypto-lib-rsa_ossl.o", + "crypto/rsa/libcrypto-lib-rsa_pk1.o", + "crypto/rsa/libcrypto-lib-rsa_pmeth.o", + "crypto/rsa/libcrypto-lib-rsa_prn.o", + "crypto/rsa/libcrypto-lib-rsa_pss.o", + "crypto/rsa/libcrypto-lib-rsa_saos.o", + "crypto/rsa/libcrypto-lib-rsa_schemes.o", + "crypto/rsa/libcrypto-lib-rsa_sign.o", + "crypto/rsa/libcrypto-lib-rsa_sp800_56b_check.o", + "crypto/rsa/libcrypto-lib-rsa_sp800_56b_gen.o", + "crypto/rsa/libcrypto-lib-rsa_x931.o", + "crypto/rsa/libcrypto-lib-rsa_x931g.o", + "crypto/rsa/libfips-lib-rsa_acvp_test_params.o", + "crypto/rsa/libfips-lib-rsa_backend.o", + "crypto/rsa/libfips-lib-rsa_chk.o", + "crypto/rsa/libfips-lib-rsa_crpt.o", + "crypto/rsa/libfips-lib-rsa_gen.o", + "crypto/rsa/libfips-lib-rsa_lib.o", + "crypto/rsa/libfips-lib-rsa_mp_names.o", + "crypto/rsa/libfips-lib-rsa_none.o", + "crypto/rsa/libfips-lib-rsa_oaep.o", + "crypto/rsa/libfips-lib-rsa_ossl.o", + "crypto/rsa/libfips-lib-rsa_pk1.o", + "crypto/rsa/libfips-lib-rsa_pss.o", + "crypto/rsa/libfips-lib-rsa_schemes.o", + "crypto/rsa/libfips-lib-rsa_sign.o", + "crypto/rsa/libfips-lib-rsa_sp800_56b_check.o", + "crypto/rsa/libfips-lib-rsa_sp800_56b_gen.o", + "crypto/rsa/libfips-lib-rsa_x931.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/seed" => { + "deps" => [ + "crypto/seed/libcrypto-lib-seed.o", + "crypto/seed/libcrypto-lib-seed_cbc.o", + "crypto/seed/libcrypto-lib-seed_cfb.o", + "crypto/seed/libcrypto-lib-seed_ecb.o", + "crypto/seed/libcrypto-lib-seed_ofb.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/sha" => { + "deps" => [ + "crypto/sha/libcrypto-lib-keccak1600.o", + "crypto/sha/libcrypto-lib-sha1_one.o", + "crypto/sha/libcrypto-lib-sha1dgst.o", + "crypto/sha/libcrypto-lib-sha256-riscv64-zvkb-zvknha_or_zvknhb.o", + "crypto/sha/libcrypto-lib-sha256.o", + "crypto/sha/libcrypto-lib-sha3.o", + "crypto/sha/libcrypto-lib-sha512-riscv64-zvkb-zvknhb.o", + "crypto/sha/libcrypto-lib-sha512.o", + "crypto/sha/libcrypto-lib-sha_riscv.o", + "crypto/sha/libfips-lib-keccak1600.o", + "crypto/sha/libfips-lib-sha1dgst.o", + "crypto/sha/libfips-lib-sha256-riscv64-zvkb-zvknha_or_zvknhb.o", + "crypto/sha/libfips-lib-sha256.o", + "crypto/sha/libfips-lib-sha3.o", + "crypto/sha/libfips-lib-sha512-riscv64-zvkb-zvknhb.o", + "crypto/sha/libfips-lib-sha512.o", + "crypto/sha/libfips-lib-sha_riscv.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/siphash" => { + "deps" => [ + "crypto/siphash/libcrypto-lib-siphash.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/slh_dsa" => { + "deps" => [ + "crypto/slh_dsa/libcrypto-lib-slh_adrs.o", + "crypto/slh_dsa/libcrypto-lib-slh_dsa.o", + "crypto/slh_dsa/libcrypto-lib-slh_dsa_hash_ctx.o", + "crypto/slh_dsa/libcrypto-lib-slh_dsa_key.o", + "crypto/slh_dsa/libcrypto-lib-slh_fors.o", + "crypto/slh_dsa/libcrypto-lib-slh_hash.o", + "crypto/slh_dsa/libcrypto-lib-slh_hypertree.o", + "crypto/slh_dsa/libcrypto-lib-slh_params.o", + "crypto/slh_dsa/libcrypto-lib-slh_wots.o", + "crypto/slh_dsa/libcrypto-lib-slh_xmss.o", + "crypto/slh_dsa/libfips-lib-slh_adrs.o", + "crypto/slh_dsa/libfips-lib-slh_dsa.o", + "crypto/slh_dsa/libfips-lib-slh_dsa_hash_ctx.o", + "crypto/slh_dsa/libfips-lib-slh_dsa_key.o", + "crypto/slh_dsa/libfips-lib-slh_fors.o", + "crypto/slh_dsa/libfips-lib-slh_hash.o", + "crypto/slh_dsa/libfips-lib-slh_hypertree.o", + "crypto/slh_dsa/libfips-lib-slh_params.o", + "crypto/slh_dsa/libfips-lib-slh_wots.o", + "crypto/slh_dsa/libfips-lib-slh_xmss.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/sm2" => { + "deps" => [ + "crypto/sm2/libcrypto-lib-sm2_crypt.o", + "crypto/sm2/libcrypto-lib-sm2_err.o", + "crypto/sm2/libcrypto-lib-sm2_key.o", + "crypto/sm2/libcrypto-lib-sm2_sign.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/sm3" => { + "deps" => [ + "crypto/sm3/libcrypto-lib-legacy_sm3.o", + "crypto/sm3/libcrypto-lib-sm3-riscv64-zvksh.o", + "crypto/sm3/libcrypto-lib-sm3.o", + "crypto/sm3/libcrypto-lib-sm3_riscv.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/sm4" => { + "deps" => [ + "crypto/sm4/libcrypto-lib-sm4-riscv64-zvksed.o", + "crypto/sm4/libcrypto-lib-sm4.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/srp" => { + "deps" => [ + "crypto/srp/libcrypto-lib-srp_lib.o", + "crypto/srp/libcrypto-lib-srp_vfy.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/stack" => { + "deps" => [ + "crypto/stack/libcrypto-lib-stack.o", + "crypto/stack/libfips-lib-stack.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/store" => { + "deps" => [ + "crypto/store/libcrypto-lib-store_err.o", + "crypto/store/libcrypto-lib-store_init.o", + "crypto/store/libcrypto-lib-store_lib.o", + "crypto/store/libcrypto-lib-store_meth.o", + "crypto/store/libcrypto-lib-store_register.o", + "crypto/store/libcrypto-lib-store_result.o", + "crypto/store/libcrypto-lib-store_strings.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/thread" => { + "deps" => [ + "crypto/thread/libcrypto-lib-api.o", + "crypto/thread/libcrypto-lib-arch.o", + "crypto/thread/libcrypto-lib-internal.o", + "crypto/thread/libfips-lib-api.o", + "crypto/thread/libfips-lib-arch.o", + "crypto/thread/libfips-lib-internal.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/thread/arch" => { + "deps" => [ + "crypto/thread/arch/libcrypto-lib-thread_none.o", + "crypto/thread/arch/libcrypto-lib-thread_posix.o", + "crypto/thread/arch/libcrypto-lib-thread_win.o", + "crypto/thread/arch/libfips-lib-thread_none.o", + "crypto/thread/arch/libfips-lib-thread_posix.o", + "crypto/thread/arch/libfips-lib-thread_win.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/ts" => { + "deps" => [ + "crypto/ts/libcrypto-lib-ts_asn1.o", + "crypto/ts/libcrypto-lib-ts_conf.o", + "crypto/ts/libcrypto-lib-ts_err.o", + "crypto/ts/libcrypto-lib-ts_lib.o", + "crypto/ts/libcrypto-lib-ts_req_print.o", + "crypto/ts/libcrypto-lib-ts_req_utils.o", + "crypto/ts/libcrypto-lib-ts_rsp_print.o", + "crypto/ts/libcrypto-lib-ts_rsp_sign.o", + "crypto/ts/libcrypto-lib-ts_rsp_utils.o", + "crypto/ts/libcrypto-lib-ts_rsp_verify.o", + "crypto/ts/libcrypto-lib-ts_verify_ctx.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/txt_db" => { + "deps" => [ + "crypto/txt_db/libcrypto-lib-txt_db.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/ui" => { + "deps" => [ + "crypto/ui/libcrypto-lib-ui_err.o", + "crypto/ui/libcrypto-lib-ui_lib.o", + "crypto/ui/libcrypto-lib-ui_null.o", + "crypto/ui/libcrypto-lib-ui_openssl.o", + "crypto/ui/libcrypto-lib-ui_util.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/whrlpool" => { + "deps" => [ + "crypto/whrlpool/libcrypto-lib-wp_block.o", + "crypto/whrlpool/libcrypto-lib-wp_dgst.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/x509" => { + "deps" => [ + "crypto/x509/libcrypto-lib-by_dir.o", + "crypto/x509/libcrypto-lib-by_file.o", + "crypto/x509/libcrypto-lib-by_store.o", + "crypto/x509/libcrypto-lib-pcy_cache.o", + "crypto/x509/libcrypto-lib-pcy_data.o", + "crypto/x509/libcrypto-lib-pcy_lib.o", + "crypto/x509/libcrypto-lib-pcy_map.o", + "crypto/x509/libcrypto-lib-pcy_node.o", + "crypto/x509/libcrypto-lib-pcy_tree.o", + "crypto/x509/libcrypto-lib-t_acert.o", + "crypto/x509/libcrypto-lib-t_crl.o", + "crypto/x509/libcrypto-lib-t_req.o", + "crypto/x509/libcrypto-lib-t_x509.o", + "crypto/x509/libcrypto-lib-v3_aaa.o", + "crypto/x509/libcrypto-lib-v3_ac_tgt.o", + "crypto/x509/libcrypto-lib-v3_addr.o", + "crypto/x509/libcrypto-lib-v3_admis.o", + "crypto/x509/libcrypto-lib-v3_akeya.o", + "crypto/x509/libcrypto-lib-v3_akid.o", + "crypto/x509/libcrypto-lib-v3_asid.o", + "crypto/x509/libcrypto-lib-v3_attrdesc.o", + "crypto/x509/libcrypto-lib-v3_attrmap.o", + "crypto/x509/libcrypto-lib-v3_audit_id.o", + "crypto/x509/libcrypto-lib-v3_authattid.o", + "crypto/x509/libcrypto-lib-v3_battcons.o", + "crypto/x509/libcrypto-lib-v3_bcons.o", + "crypto/x509/libcrypto-lib-v3_bitst.o", + "crypto/x509/libcrypto-lib-v3_conf.o", + "crypto/x509/libcrypto-lib-v3_cpols.o", + "crypto/x509/libcrypto-lib-v3_crld.o", + "crypto/x509/libcrypto-lib-v3_enum.o", + "crypto/x509/libcrypto-lib-v3_extku.o", + "crypto/x509/libcrypto-lib-v3_genn.o", + "crypto/x509/libcrypto-lib-v3_group_ac.o", + "crypto/x509/libcrypto-lib-v3_ia5.o", + "crypto/x509/libcrypto-lib-v3_ind_iss.o", + "crypto/x509/libcrypto-lib-v3_info.o", + "crypto/x509/libcrypto-lib-v3_int.o", + "crypto/x509/libcrypto-lib-v3_iobo.o", + "crypto/x509/libcrypto-lib-v3_ist.o", + "crypto/x509/libcrypto-lib-v3_lib.o", + "crypto/x509/libcrypto-lib-v3_ncons.o", + "crypto/x509/libcrypto-lib-v3_no_ass.o", + "crypto/x509/libcrypto-lib-v3_no_rev_avail.o", + "crypto/x509/libcrypto-lib-v3_pci.o", + "crypto/x509/libcrypto-lib-v3_pcia.o", + "crypto/x509/libcrypto-lib-v3_pcons.o", + "crypto/x509/libcrypto-lib-v3_pku.o", + "crypto/x509/libcrypto-lib-v3_pmaps.o", + "crypto/x509/libcrypto-lib-v3_prn.o", + "crypto/x509/libcrypto-lib-v3_purp.o", + "crypto/x509/libcrypto-lib-v3_rolespec.o", + "crypto/x509/libcrypto-lib-v3_san.o", + "crypto/x509/libcrypto-lib-v3_sda.o", + "crypto/x509/libcrypto-lib-v3_single_use.o", + "crypto/x509/libcrypto-lib-v3_skid.o", + "crypto/x509/libcrypto-lib-v3_soa_id.o", + "crypto/x509/libcrypto-lib-v3_sxnet.o", + "crypto/x509/libcrypto-lib-v3_timespec.o", + "crypto/x509/libcrypto-lib-v3_tlsf.o", + "crypto/x509/libcrypto-lib-v3_usernotice.o", + "crypto/x509/libcrypto-lib-v3_utf8.o", + "crypto/x509/libcrypto-lib-v3_utl.o", + "crypto/x509/libcrypto-lib-v3err.o", + "crypto/x509/libcrypto-lib-x509_acert.o", + "crypto/x509/libcrypto-lib-x509_att.o", + "crypto/x509/libcrypto-lib-x509_cmp.o", + "crypto/x509/libcrypto-lib-x509_d2.o", + "crypto/x509/libcrypto-lib-x509_def.o", + "crypto/x509/libcrypto-lib-x509_err.o", + "crypto/x509/libcrypto-lib-x509_ext.o", + "crypto/x509/libcrypto-lib-x509_lu.o", + "crypto/x509/libcrypto-lib-x509_meth.o", + "crypto/x509/libcrypto-lib-x509_obj.o", + "crypto/x509/libcrypto-lib-x509_r2x.o", + "crypto/x509/libcrypto-lib-x509_req.o", + "crypto/x509/libcrypto-lib-x509_set.o", + "crypto/x509/libcrypto-lib-x509_trust.o", + "crypto/x509/libcrypto-lib-x509_txt.o", + "crypto/x509/libcrypto-lib-x509_v3.o", + "crypto/x509/libcrypto-lib-x509_vfy.o", + "crypto/x509/libcrypto-lib-x509_vpm.o", + "crypto/x509/libcrypto-lib-x509aset.o", + "crypto/x509/libcrypto-lib-x509cset.o", + "crypto/x509/libcrypto-lib-x509name.o", + "crypto/x509/libcrypto-lib-x509rset.o", + "crypto/x509/libcrypto-lib-x509spki.o", + "crypto/x509/libcrypto-lib-x509type.o", + "crypto/x509/libcrypto-lib-x_all.o", + "crypto/x509/libcrypto-lib-x_attrib.o", + "crypto/x509/libcrypto-lib-x_crl.o", + "crypto/x509/libcrypto-lib-x_exten.o", + "crypto/x509/libcrypto-lib-x_ietfatt.o", + "crypto/x509/libcrypto-lib-x_name.o", + "crypto/x509/libcrypto-lib-x_pubkey.o", + "crypto/x509/libcrypto-lib-x_req.o", + "crypto/x509/libcrypto-lib-x_x509.o", + "crypto/x509/libcrypto-lib-x_x509a.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "engines" => { + "deps" => [ + "engines/libcrypto-lib-e_capi.o", + "engines/libcrypto-lib-e_padlock.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "providers" => { + "deps" => [ + "providers/libcrypto-lib-baseprov.o", + "providers/libcrypto-lib-defltprov.o", + "providers/libcrypto-lib-nullprov.o", + "providers/libcrypto-lib-prov_running.o", + "providers/libdefault.a" + ], + "products" => { + "dso" => [ + "providers/fips", + "providers/legacy" + ], + "lib" => [ + "libcrypto", + "providers/libfips.a", + "providers/liblegacy.a" + ] + } + }, + "providers/common" => { + "deps" => [ + "providers/common/libcommon-lib-provider_ctx.o", + "providers/common/libcommon-lib-provider_err.o", + "providers/common/libdefault-lib-bio_prov.o", + "providers/common/libdefault-lib-capabilities.o", + "providers/common/libdefault-lib-digest_to_nid.o", + "providers/common/libdefault-lib-provider_seeding.o", + "providers/common/libdefault-lib-provider_util.o", + "providers/common/libdefault-lib-securitycheck.o", + "providers/common/libdefault-lib-securitycheck_default.o", + "providers/common/libfips-lib-bio_prov.o", + "providers/common/libfips-lib-capabilities.o", + "providers/common/libfips-lib-digest_to_nid.o", + "providers/common/libfips-lib-provider_seeding.o", + "providers/common/libfips-lib-provider_util.o", + "providers/common/libfips-lib-securitycheck.o", + "providers/common/libfips-lib-securitycheck_fips.o" + ], + "products" => { + "lib" => [ + "providers/libcommon.a", + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/common/der" => { + "deps" => [ + "providers/common/der/libcommon-lib-der_digests_gen.o", + "providers/common/der/libcommon-lib-der_dsa_gen.o", + "providers/common/der/libcommon-lib-der_dsa_key.o", + "providers/common/der/libcommon-lib-der_dsa_sig.o", + "providers/common/der/libcommon-lib-der_ec_gen.o", + "providers/common/der/libcommon-lib-der_ec_key.o", + "providers/common/der/libcommon-lib-der_ec_sig.o", + "providers/common/der/libcommon-lib-der_ecx_gen.o", + "providers/common/der/libcommon-lib-der_ecx_key.o", + "providers/common/der/libcommon-lib-der_ml_dsa_gen.o", + "providers/common/der/libcommon-lib-der_ml_dsa_key.o", + "providers/common/der/libcommon-lib-der_rsa_gen.o", + "providers/common/der/libcommon-lib-der_rsa_key.o", + "providers/common/der/libcommon-lib-der_slh_dsa_gen.o", + "providers/common/der/libcommon-lib-der_slh_dsa_key.o", + "providers/common/der/libcommon-lib-der_wrap_gen.o", + "providers/common/der/libdefault-lib-der_rsa_sig.o", + "providers/common/der/libdefault-lib-der_sm2_gen.o", + "providers/common/der/libdefault-lib-der_sm2_key.o", + "providers/common/der/libdefault-lib-der_sm2_sig.o", + "providers/common/der/libfips-lib-der_rsa_sig.o" + ], + "products" => { + "lib" => [ + "providers/libcommon.a", + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/fips" => { + "deps" => [ + "providers/fips/fips-dso-fips_entry.o", + "providers/fips/libfips-lib-fipsindicator.o", + "providers/fips/libfips-lib-fipsprov.o", + "providers/fips/libfips-lib-self_test.o", + "providers/fips/libfips-lib-self_test_kats.o" + ], + "products" => { + "dso" => [ + "providers/fips" + ], + "lib" => [ + "providers/libfips.a" + ] + } + }, + "providers/implementations/asymciphers" => { + "deps" => [ + "providers/implementations/asymciphers/libdefault-lib-rsa_enc.o", + "providers/implementations/asymciphers/libdefault-lib-sm2_enc.o", + "providers/implementations/asymciphers/libfips-lib-rsa_enc.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/implementations/ciphers" => { + "deps" => [ + "providers/implementations/ciphers/libcommon-lib-ciphercommon.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_block.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_ccm.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_ccm_hw.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_gcm.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_gcm_hw.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha1_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha256_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ccm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ccm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv_polyval.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ocb.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ocb_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_siv.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_siv_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_wrp.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts_fips.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_ccm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_ccm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_gcm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_gcm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_camellia.o", + "providers/implementations/ciphers/libdefault-lib-cipher_camellia_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_poly1305.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_poly1305_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_cts.o", + "providers/implementations/ciphers/libdefault-lib-cipher_null.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_ccm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_ccm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_gcm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_gcm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_xts.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_xts_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_common.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_default.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_default_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_wrap.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_wrap_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha1_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha256_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ccm.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ccm_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_gcm.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_gcm_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ocb.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ocb_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_wrp.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts_fips.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_cts.o", + "providers/implementations/ciphers/libfips-lib-cipher_tdes.o", + "providers/implementations/ciphers/libfips-lib-cipher_tdes_common.o", + "providers/implementations/ciphers/libfips-lib-cipher_tdes_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_blowfish.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_blowfish_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_cast5.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_cast5_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_des.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_des_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_desx.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_desx_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_idea.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_idea_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc2.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc2_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hmac_md5.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hmac_md5_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_seed.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_seed_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_tdes_common.o" + ], + "products" => { + "lib" => [ + "providers/libcommon.a", + "providers/libdefault.a", + "providers/libfips.a", + "providers/liblegacy.a" + ] + } + }, + "providers/implementations/digests" => { + "deps" => [ + "providers/implementations/digests/libcommon-lib-digestcommon.o", + "providers/implementations/digests/libdefault-lib-blake2_prov.o", + "providers/implementations/digests/libdefault-lib-blake2b_prov.o", + "providers/implementations/digests/libdefault-lib-blake2s_prov.o", + "providers/implementations/digests/libdefault-lib-md5_prov.o", + "providers/implementations/digests/libdefault-lib-md5_sha1_prov.o", + "providers/implementations/digests/libdefault-lib-null_prov.o", + "providers/implementations/digests/libdefault-lib-ripemd_prov.o", + "providers/implementations/digests/libdefault-lib-sha2_prov.o", + "providers/implementations/digests/libdefault-lib-sha3_prov.o", + "providers/implementations/digests/libdefault-lib-sm3_prov.o", + "providers/implementations/digests/libfips-lib-sha2_prov.o", + "providers/implementations/digests/libfips-lib-sha3_prov.o", + "providers/implementations/digests/liblegacy-lib-md4_prov.o", + "providers/implementations/digests/liblegacy-lib-mdc2_prov.o", + "providers/implementations/digests/liblegacy-lib-ripemd_prov.o", + "providers/implementations/digests/liblegacy-lib-wp_prov.o" + ], + "products" => { + "lib" => [ + "providers/libcommon.a", + "providers/libdefault.a", + "providers/libfips.a", + "providers/liblegacy.a" + ] + } + }, + "providers/implementations/encode_decode" => { + "deps" => [ + "providers/implementations/encode_decode/libdefault-lib-decode_der2key.o", + "providers/implementations/encode_decode/libdefault-lib-decode_epki2pki.o", + "providers/implementations/encode_decode/libdefault-lib-decode_msblob2key.o", + "providers/implementations/encode_decode/libdefault-lib-decode_pem2der.o", + "providers/implementations/encode_decode/libdefault-lib-decode_pvk2key.o", + "providers/implementations/encode_decode/libdefault-lib-decode_spki2typespki.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2any.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2blob.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2ms.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2text.o", + "providers/implementations/encode_decode/libdefault-lib-endecoder_common.o", + "providers/implementations/encode_decode/libdefault-lib-ml_common_codecs.o", + "providers/implementations/encode_decode/libdefault-lib-ml_dsa_codecs.o", + "providers/implementations/encode_decode/libdefault-lib-ml_kem_codecs.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a" + ] + } + }, + "providers/implementations/exchange" => { + "deps" => [ + "providers/implementations/exchange/libdefault-lib-dh_exch.o", + "providers/implementations/exchange/libdefault-lib-ecdh_exch.o", + "providers/implementations/exchange/libdefault-lib-ecx_exch.o", + "providers/implementations/exchange/libdefault-lib-kdf_exch.o", + "providers/implementations/exchange/libfips-lib-dh_exch.o", + "providers/implementations/exchange/libfips-lib-ecdh_exch.o", + "providers/implementations/exchange/libfips-lib-ecx_exch.o", + "providers/implementations/exchange/libfips-lib-kdf_exch.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/implementations/kdfs" => { + "deps" => [ + "providers/implementations/kdfs/libdefault-lib-argon2.o", + "providers/implementations/kdfs/libdefault-lib-hkdf.o", + "providers/implementations/kdfs/libdefault-lib-hmacdrbg_kdf.o", + "providers/implementations/kdfs/libdefault-lib-kbkdf.o", + "providers/implementations/kdfs/libdefault-lib-krb5kdf.o", + "providers/implementations/kdfs/libdefault-lib-pbkdf2.o", + "providers/implementations/kdfs/libdefault-lib-pbkdf2_fips.o", + "providers/implementations/kdfs/libdefault-lib-pkcs12kdf.o", + "providers/implementations/kdfs/libdefault-lib-scrypt.o", + "providers/implementations/kdfs/libdefault-lib-sshkdf.o", + "providers/implementations/kdfs/libdefault-lib-sskdf.o", + "providers/implementations/kdfs/libdefault-lib-tls1_prf.o", + "providers/implementations/kdfs/libdefault-lib-x942kdf.o", + "providers/implementations/kdfs/libfips-lib-hkdf.o", + "providers/implementations/kdfs/libfips-lib-kbkdf.o", + "providers/implementations/kdfs/libfips-lib-pbkdf2.o", + "providers/implementations/kdfs/libfips-lib-pbkdf2_fips.o", + "providers/implementations/kdfs/libfips-lib-sshkdf.o", + "providers/implementations/kdfs/libfips-lib-sskdf.o", + "providers/implementations/kdfs/libfips-lib-tls1_prf.o", + "providers/implementations/kdfs/libfips-lib-x942kdf.o", + "providers/implementations/kdfs/liblegacy-lib-pbkdf1.o", + "providers/implementations/kdfs/liblegacy-lib-pvkkdf.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a", + "providers/liblegacy.a" + ] + } + }, + "providers/implementations/kem" => { + "deps" => [ + "providers/implementations/kem/libdefault-lib-ec_kem.o", + "providers/implementations/kem/libdefault-lib-ecx_kem.o", + "providers/implementations/kem/libdefault-lib-kem_util.o", + "providers/implementations/kem/libdefault-lib-ml_kem_kem.o", + "providers/implementations/kem/libdefault-lib-mlx_kem.o", + "providers/implementations/kem/libdefault-lib-rsa_kem.o", + "providers/implementations/kem/libfips-lib-ml_kem_kem.o", + "providers/implementations/kem/libfips-lib-mlx_kem.o", + "providers/implementations/kem/libfips-lib-rsa_kem.o", + "providers/implementations/kem/libtemplate-lib-template_kem.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a", + "providers/libtemplate.a" + ] + } + }, + "providers/implementations/keymgmt" => { + "deps" => [ + "providers/implementations/keymgmt/libdefault-lib-dh_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-dsa_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ec_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ecx_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-kdf_legacy_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-mac_legacy_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ml_dsa_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ml_kem_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-mlx_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-rsa_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-slh_dsa_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-dh_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-dsa_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ec_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ecx_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-kdf_legacy_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-mac_legacy_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ml_dsa_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ml_kem_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-mlx_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-rsa_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-slh_dsa_kmgmt.o", + "providers/implementations/keymgmt/libtemplate-lib-template_kmgmt.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a", + "providers/libtemplate.a" + ] + } + }, + "providers/implementations/macs" => { + "deps" => [ + "providers/implementations/macs/libdefault-lib-blake2b_mac.o", + "providers/implementations/macs/libdefault-lib-blake2s_mac.o", + "providers/implementations/macs/libdefault-lib-cmac_prov.o", + "providers/implementations/macs/libdefault-lib-gmac_prov.o", + "providers/implementations/macs/libdefault-lib-hmac_prov.o", + "providers/implementations/macs/libdefault-lib-kmac_prov.o", + "providers/implementations/macs/libdefault-lib-poly1305_prov.o", + "providers/implementations/macs/libdefault-lib-siphash_prov.o", + "providers/implementations/macs/libfips-lib-cmac_prov.o", + "providers/implementations/macs/libfips-lib-gmac_prov.o", + "providers/implementations/macs/libfips-lib-hmac_prov.o", + "providers/implementations/macs/libfips-lib-kmac_prov.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/implementations/rands" => { + "deps" => [ + "providers/implementations/rands/libdefault-lib-drbg.o", + "providers/implementations/rands/libdefault-lib-drbg_ctr.o", + "providers/implementations/rands/libdefault-lib-drbg_hash.o", + "providers/implementations/rands/libdefault-lib-drbg_hmac.o", + "providers/implementations/rands/libdefault-lib-seed_src.o", + "providers/implementations/rands/libdefault-lib-seed_src_jitter.o", + "providers/implementations/rands/libdefault-lib-test_rng.o", + "providers/implementations/rands/libfips-lib-drbg.o", + "providers/implementations/rands/libfips-lib-drbg_ctr.o", + "providers/implementations/rands/libfips-lib-drbg_hash.o", + "providers/implementations/rands/libfips-lib-drbg_hmac.o", + "providers/implementations/rands/libfips-lib-fips_crng_test.o", + "providers/implementations/rands/libfips-lib-test_rng.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/implementations/rands/seeding" => { + "deps" => [ + "providers/implementations/rands/seeding/libdefault-lib-rand_cpu_x86.o", + "providers/implementations/rands/seeding/libdefault-lib-rand_tsc.o", + "providers/implementations/rands/seeding/libdefault-lib-rand_unix.o", + "providers/implementations/rands/seeding/libdefault-lib-rand_win.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a" + ] + } + }, + "providers/implementations/signature" => { + "deps" => [ + "providers/implementations/signature/libdefault-lib-dsa_sig.o", + "providers/implementations/signature/libdefault-lib-ecdsa_sig.o", + "providers/implementations/signature/libdefault-lib-eddsa_sig.o", + "providers/implementations/signature/libdefault-lib-mac_legacy_sig.o", + "providers/implementations/signature/libdefault-lib-ml_dsa_sig.o", + "providers/implementations/signature/libdefault-lib-rsa_sig.o", + "providers/implementations/signature/libdefault-lib-slh_dsa_sig.o", + "providers/implementations/signature/libdefault-lib-sm2_sig.o", + "providers/implementations/signature/libfips-lib-dsa_sig.o", + "providers/implementations/signature/libfips-lib-ecdsa_sig.o", + "providers/implementations/signature/libfips-lib-eddsa_sig.o", + "providers/implementations/signature/libfips-lib-mac_legacy_sig.o", + "providers/implementations/signature/libfips-lib-ml_dsa_sig.o", + "providers/implementations/signature/libfips-lib-rsa_sig.o", + "providers/implementations/signature/libfips-lib-slh_dsa_sig.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/implementations/skeymgmt" => { + "deps" => [ + "providers/implementations/skeymgmt/libdefault-lib-aes_skmgmt.o", + "providers/implementations/skeymgmt/libdefault-lib-generic.o", + "providers/implementations/skeymgmt/libfips-lib-aes_skmgmt.o", + "providers/implementations/skeymgmt/libfips-lib-generic.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/implementations/storemgmt" => { + "deps" => [ + "providers/implementations/storemgmt/libdefault-lib-file_store.o", + "providers/implementations/storemgmt/libdefault-lib-file_store_any2obj.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a" + ] + } + }, + "ssl" => { + "deps" => [ + "ssl/libssl-lib-bio_ssl.o", + "ssl/libssl-lib-d1_lib.o", + "ssl/libssl-lib-d1_msg.o", + "ssl/libssl-lib-d1_srtp.o", + "ssl/libssl-lib-methods.o", + "ssl/libssl-lib-pqueue.o", + "ssl/libssl-lib-priority_queue.o", + "ssl/libssl-lib-s3_enc.o", + "ssl/libssl-lib-s3_lib.o", + "ssl/libssl-lib-s3_msg.o", + "ssl/libssl-lib-ssl_asn1.o", + "ssl/libssl-lib-ssl_cert.o", + "ssl/libssl-lib-ssl_cert_comp.o", + "ssl/libssl-lib-ssl_ciph.o", + "ssl/libssl-lib-ssl_conf.o", + "ssl/libssl-lib-ssl_err_legacy.o", + "ssl/libssl-lib-ssl_init.o", + "ssl/libssl-lib-ssl_lib.o", + "ssl/libssl-lib-ssl_mcnf.o", + "ssl/libssl-lib-ssl_rsa.o", + "ssl/libssl-lib-ssl_rsa_legacy.o", + "ssl/libssl-lib-ssl_sess.o", + "ssl/libssl-lib-ssl_stat.o", + "ssl/libssl-lib-ssl_txt.o", + "ssl/libssl-lib-ssl_utst.o", + "ssl/libssl-lib-t1_enc.o", + "ssl/libssl-lib-t1_lib.o", + "ssl/libssl-lib-t1_trce.o", + "ssl/libssl-lib-tls13_enc.o", + "ssl/libssl-lib-tls_depr.o", + "ssl/libssl-lib-tls_srp.o" + ], + "products" => { + "lib" => [ + "libssl" + ] + } + }, + "ssl/quic" => { + "deps" => [ + "ssl/quic/libssl-lib-cc_newreno.o", + "ssl/quic/libssl-lib-json_enc.o", + "ssl/quic/libssl-lib-qlog.o", + "ssl/quic/libssl-lib-qlog_event_helpers.o", + "ssl/quic/libssl-lib-quic_ackm.o", + "ssl/quic/libssl-lib-quic_cfq.o", + "ssl/quic/libssl-lib-quic_channel.o", + "ssl/quic/libssl-lib-quic_demux.o", + "ssl/quic/libssl-lib-quic_engine.o", + "ssl/quic/libssl-lib-quic_fc.o", + "ssl/quic/libssl-lib-quic_fifd.o", + "ssl/quic/libssl-lib-quic_impl.o", + "ssl/quic/libssl-lib-quic_lcidm.o", + "ssl/quic/libssl-lib-quic_method.o", + "ssl/quic/libssl-lib-quic_obj.o", + "ssl/quic/libssl-lib-quic_port.o", + "ssl/quic/libssl-lib-quic_rcidm.o", + "ssl/quic/libssl-lib-quic_reactor.o", + "ssl/quic/libssl-lib-quic_reactor_wait_ctx.o", + "ssl/quic/libssl-lib-quic_record_rx.o", + "ssl/quic/libssl-lib-quic_record_shared.o", + "ssl/quic/libssl-lib-quic_record_tx.o", + "ssl/quic/libssl-lib-quic_record_util.o", + "ssl/quic/libssl-lib-quic_rstream.o", + "ssl/quic/libssl-lib-quic_rx_depack.o", + "ssl/quic/libssl-lib-quic_sf_list.o", + "ssl/quic/libssl-lib-quic_srt_gen.o", + "ssl/quic/libssl-lib-quic_srtm.o", + "ssl/quic/libssl-lib-quic_sstream.o", + "ssl/quic/libssl-lib-quic_statm.o", + "ssl/quic/libssl-lib-quic_stream_map.o", + "ssl/quic/libssl-lib-quic_thread_assist.o", + "ssl/quic/libssl-lib-quic_tls.o", + "ssl/quic/libssl-lib-quic_tls_api.o", + "ssl/quic/libssl-lib-quic_trace.o", + "ssl/quic/libssl-lib-quic_tserver.o", + "ssl/quic/libssl-lib-quic_txp.o", + "ssl/quic/libssl-lib-quic_txpim.o", + "ssl/quic/libssl-lib-quic_types.o", + "ssl/quic/libssl-lib-quic_wire.o", + "ssl/quic/libssl-lib-quic_wire_pkt.o", + "ssl/quic/libssl-lib-uint_set.o" + ], + "products" => { + "lib" => [ + "libssl" + ] + } + }, + "ssl/record" => { + "deps" => [ + "ssl/record/libssl-lib-rec_layer_d1.o", + "ssl/record/libssl-lib-rec_layer_s3.o" + ], + "products" => { + "lib" => [ + "libssl" + ] + } + }, + "ssl/record/methods" => { + "deps" => [ + "ssl/record/methods/libssl-lib-dtls_meth.o", + "ssl/record/methods/libssl-lib-ssl3_meth.o", + "ssl/record/methods/libssl-lib-tls13_meth.o", + "ssl/record/methods/libssl-lib-tls1_meth.o", + "ssl/record/methods/libssl-lib-tls_common.o", + "ssl/record/methods/libssl-lib-tls_multib.o", + "ssl/record/methods/libssl-lib-tlsany_meth.o", + "ssl/record/methods/libcommon-lib-tls_pad.o", + "ssl/record/methods/libdefault-lib-ssl3_cbc.o", + "ssl/record/methods/libfips-lib-ssl3_cbc.o" + ], + "products" => { + "lib" => [ + "libssl", + "providers/libcommon.a", + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "ssl/rio" => { + "deps" => [ + "ssl/rio/libssl-lib-poll_builder.o", + "ssl/rio/libssl-lib-poll_immediate.o", + "ssl/rio/libssl-lib-rio_notifier.o" + ], + "products" => { + "lib" => [ + "libssl" + ] + } + }, + "ssl/statem" => { + "deps" => [ + "ssl/statem/libssl-lib-extensions.o", + "ssl/statem/libssl-lib-extensions_clnt.o", + "ssl/statem/libssl-lib-extensions_cust.o", + "ssl/statem/libssl-lib-extensions_srvr.o", + "ssl/statem/libssl-lib-statem.o", + "ssl/statem/libssl-lib-statem_clnt.o", + "ssl/statem/libssl-lib-statem_dtls.o", + "ssl/statem/libssl-lib-statem_lib.o", + "ssl/statem/libssl-lib-statem_srvr.o" + ], + "products" => { + "lib" => [ + "libssl" + ] + } + }, + "tools" => { + "products" => { + "script" => [ + "tools/c_rehash" + ] + } + }, + "util" => { + "products" => { + "script" => [ + "util/shlib_wrap.sh", + "util/wrap.pl" + ] + } + } + }, + "generate" => { + "OpenSSLConfig.cmake" => [ + "exporters/cmake/OpenSSLConfig.cmake.in" + ], + "OpenSSLConfigVersion.cmake" => [ + "exporters/cmake/OpenSSLConfigVersion.cmake.in" + ], + "apps/progs.c" => [ + "apps/progs.pl", + "\"-C\"", + "\$(APPS_OPENSSL)" + ], + "apps/progs.h" => [ + "apps/progs.pl", + "\"-H\"", + "\$(APPS_OPENSSL)" + ], + "builddata.pm" => [ + "util/mkinstallvars.pl", + "COMMENT=\"This", + "file", + "should", + "be", + "used", + "when", + "building", + "against", + "this", + "OpenSSL", + "build,", + "and", + "should", + "never", + "be", + "installed\"", + "PREFIX=.", + "BINDIR=apps", + "APPLINKDIR=ms", + "LIBDIR=", + "INCLUDEDIR=include", + "\"INCLUDEDIR=\$(SRCDIR)/include\"", + "ENGINESDIR=engines", + "MODULESDIR=providers", + "\"VERSION=\$(VERSION)\"", + "\"LDLIBS=\$(LIB_EX_LIBS)\"" + ], + "crypto/aes/aes-586.S" => [ + "crypto/aes/asm/aes-586.pl" + ], + "crypto/aes/aes-armv4.S" => [ + "crypto/aes/asm/aes-armv4.pl" + ], + "crypto/aes/aes-c64xplus.S" => [ + "crypto/aes/asm/aes-c64xplus.pl" + ], + "crypto/aes/aes-ia64.s" => [ + "crypto/aes/asm/aes-ia64.S" + ], + "crypto/aes/aes-mips.S" => [ + "crypto/aes/asm/aes-mips.pl" + ], + "crypto/aes/aes-parisc.s" => [ + "crypto/aes/asm/aes-parisc.pl" + ], + "crypto/aes/aes-ppc.s" => [ + "crypto/aes/asm/aes-ppc.pl" + ], + "crypto/aes/aes-riscv32-zkn.s" => [ + "crypto/aes/asm/aes-riscv32-zkn.pl" + ], + "crypto/aes/aes-riscv64-zkn.s" => [ + "crypto/aes/asm/aes-riscv64-zkn.pl" + ], + "crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s" => [ + "crypto/aes/asm/aes-riscv64-zvbb-zvkg-zvkned.pl" + ], + "crypto/aes/aes-riscv64-zvkb-zvkned.s" => [ + "crypto/aes/asm/aes-riscv64-zvkb-zvkned.pl" + ], + "crypto/aes/aes-riscv64-zvkned.s" => [ + "crypto/aes/asm/aes-riscv64-zvkned.pl" + ], + "crypto/aes/aes-riscv64.s" => [ + "crypto/aes/asm/aes-riscv64.pl" + ], + "crypto/aes/aes-s390x.S" => [ + "crypto/aes/asm/aes-s390x.pl" + ], + "crypto/aes/aes-sparcv9.S" => [ + "crypto/aes/asm/aes-sparcv9.pl" + ], + "crypto/aes/aes-x86_64.s" => [ + "crypto/aes/asm/aes-x86_64.pl" + ], + "crypto/aes/aesfx-sparcv9.S" => [ + "crypto/aes/asm/aesfx-sparcv9.pl" + ], + "crypto/aes/aesni-mb-x86_64.s" => [ + "crypto/aes/asm/aesni-mb-x86_64.pl" + ], + "crypto/aes/aesni-sha1-x86_64.s" => [ + "crypto/aes/asm/aesni-sha1-x86_64.pl" + ], + "crypto/aes/aesni-sha256-x86_64.s" => [ + "crypto/aes/asm/aesni-sha256-x86_64.pl" + ], + "crypto/aes/aesni-x86.S" => [ + "crypto/aes/asm/aesni-x86.pl" + ], + "crypto/aes/aesni-x86_64.s" => [ + "crypto/aes/asm/aesni-x86_64.pl" + ], + "crypto/aes/aesni-xts-avx512.s" => [ + "crypto/aes/asm/aesni-xts-avx512.pl" + ], + "crypto/aes/aesp8-ppc.s" => [ + "crypto/aes/asm/aesp8-ppc.pl" + ], + "crypto/aes/aest4-sparcv9.S" => [ + "crypto/aes/asm/aest4-sparcv9.pl" + ], + "crypto/aes/aesv8-armx.S" => [ + "crypto/aes/asm/aesv8-armx.pl" + ], + "crypto/aes/bsaes-armv7.S" => [ + "crypto/aes/asm/bsaes-armv7.pl" + ], + "crypto/aes/bsaes-armv8.S" => [ + "crypto/aes/asm/bsaes-armv8.pl" + ], + "crypto/aes/bsaes-x86_64.s" => [ + "crypto/aes/asm/bsaes-x86_64.pl" + ], + "crypto/aes/vpaes-armv8.S" => [ + "crypto/aes/asm/vpaes-armv8.pl" + ], + "crypto/aes/vpaes-loongarch64.S" => [ + "crypto/aes/asm/vpaes-loongarch64.pl" + ], + "crypto/aes/vpaes-ppc.s" => [ + "crypto/aes/asm/vpaes-ppc.pl" + ], + "crypto/aes/vpaes-x86.S" => [ + "crypto/aes/asm/vpaes-x86.pl" + ], + "crypto/aes/vpaes-x86_64.s" => [ + "crypto/aes/asm/vpaes-x86_64.pl" + ], + "crypto/alphacpuid.s" => [ + "crypto/alphacpuid.pl" + ], + "crypto/arm64cpuid.S" => [ + "crypto/arm64cpuid.pl" + ], + "crypto/armv4cpuid.S" => [ + "crypto/armv4cpuid.pl" + ], + "crypto/bf/bf-586.S" => [ + "crypto/bf/asm/bf-586.pl" + ], + "crypto/bn/alpha-mont.S" => [ + "crypto/bn/asm/alpha-mont.pl" + ], + "crypto/bn/armv4-gf2m.S" => [ + "crypto/bn/asm/armv4-gf2m.pl" + ], + "crypto/bn/armv4-mont.S" => [ + "crypto/bn/asm/armv4-mont.pl" + ], + "crypto/bn/armv8-mont.S" => [ + "crypto/bn/asm/armv8-mont.pl" + ], + "crypto/bn/bn-586.S" => [ + "crypto/bn/asm/bn-586.pl" + ], + "crypto/bn/bn-ia64.s" => [ + "crypto/bn/asm/ia64.S" + ], + "crypto/bn/bn-mips.S" => [ + "crypto/bn/asm/mips.pl" + ], + "crypto/bn/bn-ppc.s" => [ + "crypto/bn/asm/ppc.pl" + ], + "crypto/bn/co-586.S" => [ + "crypto/bn/asm/co-586.pl" + ], + "crypto/bn/ia64-mont.s" => [ + "crypto/bn/asm/ia64-mont.pl" + ], + "crypto/bn/mips-mont.S" => [ + "crypto/bn/asm/mips-mont.pl" + ], + "crypto/bn/parisc-mont.s" => [ + "crypto/bn/asm/parisc-mont.pl" + ], + "crypto/bn/ppc-mont.s" => [ + "crypto/bn/asm/ppc-mont.pl" + ], + "crypto/bn/ppc64-mont-fixed.s" => [ + "crypto/bn/asm/ppc64-mont-fixed.pl" + ], + "crypto/bn/ppc64-mont.s" => [ + "crypto/bn/asm/ppc64-mont.pl" + ], + "crypto/bn/rsaz-2k-avx512.s" => [ + "crypto/bn/asm/rsaz-2k-avx512.pl" + ], + "crypto/bn/rsaz-2k-avxifma.s" => [ + "crypto/bn/asm/rsaz-2k-avxifma.pl" + ], + "crypto/bn/rsaz-3k-avx512.s" => [ + "crypto/bn/asm/rsaz-3k-avx512.pl" + ], + "crypto/bn/rsaz-3k-avxifma.s" => [ + "crypto/bn/asm/rsaz-3k-avxifma.pl" + ], + "crypto/bn/rsaz-4k-avx512.s" => [ + "crypto/bn/asm/rsaz-4k-avx512.pl" + ], + "crypto/bn/rsaz-4k-avxifma.s" => [ + "crypto/bn/asm/rsaz-4k-avxifma.pl" + ], + "crypto/bn/rsaz-avx2.s" => [ + "crypto/bn/asm/rsaz-avx2.pl" + ], + "crypto/bn/rsaz-x86_64.s" => [ + "crypto/bn/asm/rsaz-x86_64.pl" + ], + "crypto/bn/s390x-gf2m.s" => [ + "crypto/bn/asm/s390x-gf2m.pl" + ], + "crypto/bn/s390x-mont.S" => [ + "crypto/bn/asm/s390x-mont.pl" + ], + "crypto/bn/sparct4-mont.S" => [ + "crypto/bn/asm/sparct4-mont.pl" + ], + "crypto/bn/sparcv9-gf2m.S" => [ + "crypto/bn/asm/sparcv9-gf2m.pl" + ], + "crypto/bn/sparcv9-mont.S" => [ + "crypto/bn/asm/sparcv9-mont.pl" + ], + "crypto/bn/sparcv9a-mont.S" => [ + "crypto/bn/asm/sparcv9a-mont.pl" + ], + "crypto/bn/vis3-mont.S" => [ + "crypto/bn/asm/vis3-mont.pl" + ], + "crypto/bn/x86-gf2m.S" => [ + "crypto/bn/asm/x86-gf2m.pl" + ], + "crypto/bn/x86-mont.S" => [ + "crypto/bn/asm/x86-mont.pl" + ], + "crypto/bn/x86_64-gf2m.s" => [ + "crypto/bn/asm/x86_64-gf2m.pl" + ], + "crypto/bn/x86_64-mont.s" => [ + "crypto/bn/asm/x86_64-mont.pl" + ], + "crypto/bn/x86_64-mont5.s" => [ + "crypto/bn/asm/x86_64-mont5.pl" + ], + "crypto/buildinf.h" => [ + "util/mkbuildinf.pl", + "\"\$(CC)", + "\$(LIB_CFLAGS)", + "\$(CPPFLAGS_Q)\"", + "\"\$(PLATFORM)\"" + ], + "crypto/camellia/cmll-x86.S" => [ + "crypto/camellia/asm/cmll-x86.pl" + ], + "crypto/camellia/cmll-x86_64.s" => [ + "crypto/camellia/asm/cmll-x86_64.pl" + ], + "crypto/camellia/cmllt4-sparcv9.S" => [ + "crypto/camellia/asm/cmllt4-sparcv9.pl" + ], + "crypto/cast/cast-586.S" => [ + "crypto/cast/asm/cast-586.pl" + ], + "crypto/chacha/chacha-armv4.S" => [ + "crypto/chacha/asm/chacha-armv4.pl" + ], + "crypto/chacha/chacha-armv8-sve.S" => [ + "crypto/chacha/asm/chacha-armv8-sve.pl" + ], + "crypto/chacha/chacha-armv8.S" => [ + "crypto/chacha/asm/chacha-armv8.pl" + ], + "crypto/chacha/chacha-c64xplus.S" => [ + "crypto/chacha/asm/chacha-c64xplus.pl" + ], + "crypto/chacha/chacha-ia64.S" => [ + "crypto/chacha/asm/chacha-ia64.pl" + ], + "crypto/chacha/chacha-ia64.s" => [ + "crypto/chacha/chacha-ia64.S" + ], + "crypto/chacha/chacha-loongarch64.S" => [ + "crypto/chacha/asm/chacha-loongarch64.pl" + ], + "crypto/chacha/chacha-ppc.s" => [ + "crypto/chacha/asm/chacha-ppc.pl" + ], + "crypto/chacha/chacha-riscv64-v-zbb-zvkb.s" => [ + "crypto/chacha/asm/chacha-riscv64-v-zbb.pl", + "zvkb" + ], + "crypto/chacha/chacha-riscv64-v-zbb.s" => [ + "crypto/chacha/asm/chacha-riscv64-v-zbb.pl" + ], + "crypto/chacha/chacha-s390x.S" => [ + "crypto/chacha/asm/chacha-s390x.pl" + ], + "crypto/chacha/chacha-x86.S" => [ + "crypto/chacha/asm/chacha-x86.pl" + ], + "crypto/chacha/chacha-x86_64.s" => [ + "crypto/chacha/asm/chacha-x86_64.pl" + ], + "crypto/chacha/chachap10-ppc.s" => [ + "crypto/chacha/asm/chachap10-ppc.pl" + ], + "crypto/des/crypt586.S" => [ + "crypto/des/asm/crypt586.pl" + ], + "crypto/des/des-586.S" => [ + "crypto/des/asm/des-586.pl" + ], + "crypto/des/des_enc-sparc.S" => [ + "crypto/des/asm/des_enc.m4" + ], + "crypto/des/dest4-sparcv9.S" => [ + "crypto/des/asm/dest4-sparcv9.pl" + ], + "crypto/ec/ecp_nistp384-ppc64.s" => [ + "crypto/ec/asm/ecp_nistp384-ppc64.pl" + ], + "crypto/ec/ecp_nistp521-ppc64.s" => [ + "crypto/ec/asm/ecp_nistp521-ppc64.pl" + ], + "crypto/ec/ecp_nistz256-armv4.S" => [ + "crypto/ec/asm/ecp_nistz256-armv4.pl" + ], + "crypto/ec/ecp_nistz256-armv8.S" => [ + "crypto/ec/asm/ecp_nistz256-armv8.pl" + ], + "crypto/ec/ecp_nistz256-avx2.s" => [ + "crypto/ec/asm/ecp_nistz256-avx2.pl" + ], + "crypto/ec/ecp_nistz256-ppc64.s" => [ + "crypto/ec/asm/ecp_nistz256-ppc64.pl" + ], + "crypto/ec/ecp_nistz256-sparcv9.S" => [ + "crypto/ec/asm/ecp_nistz256-sparcv9.pl" + ], + "crypto/ec/ecp_nistz256-x86.S" => [ + "crypto/ec/asm/ecp_nistz256-x86.pl" + ], + "crypto/ec/ecp_nistz256-x86_64.s" => [ + "crypto/ec/asm/ecp_nistz256-x86_64.pl" + ], + "crypto/ec/ecp_sm2p256-armv8.S" => [ + "crypto/ec/asm/ecp_sm2p256-armv8.pl" + ], + "crypto/ec/x25519-ppc64.s" => [ + "crypto/ec/asm/x25519-ppc64.pl" + ], + "crypto/ec/x25519-x86_64.s" => [ + "crypto/ec/asm/x25519-x86_64.pl" + ], + "crypto/ia64cpuid.s" => [ + "crypto/ia64cpuid.S" + ], + "crypto/loongarch64cpuid.s" => [ + "crypto/loongarch64cpuid.pl" + ], + "crypto/md5/md5-586.S" => [ + "crypto/md5/asm/md5-586.pl" + ], + "crypto/md5/md5-aarch64.S" => [ + "crypto/md5/asm/md5-aarch64.pl" + ], + "crypto/md5/md5-loongarch64.S" => [ + "crypto/md5/asm/md5-loongarch64.pl" + ], + "crypto/md5/md5-sparcv9.S" => [ + "crypto/md5/asm/md5-sparcv9.pl" + ], + "crypto/md5/md5-x86_64.s" => [ + "crypto/md5/asm/md5-x86_64.pl" + ], + "crypto/modes/aes-gcm-armv8-unroll8_64.S" => [ + "crypto/modes/asm/aes-gcm-armv8-unroll8_64.pl" + ], + "crypto/modes/aes-gcm-armv8_64.S" => [ + "crypto/modes/asm/aes-gcm-armv8_64.pl" + ], + "crypto/modes/aes-gcm-avx512.s" => [ + "crypto/modes/asm/aes-gcm-avx512.pl" + ], + "crypto/modes/aes-gcm-ppc.s" => [ + "crypto/modes/asm/aes-gcm-ppc.pl" + ], + "crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s" => [ + "crypto/modes/asm/aes-gcm-riscv64-zvkb-zvkg-zvkned.pl" + ], + "crypto/modes/aesni-gcm-x86_64.s" => [ + "crypto/modes/asm/aesni-gcm-x86_64.pl" + ], + "crypto/modes/ghash-alpha.S" => [ + "crypto/modes/asm/ghash-alpha.pl" + ], + "crypto/modes/ghash-armv4.S" => [ + "crypto/modes/asm/ghash-armv4.pl" + ], + "crypto/modes/ghash-c64xplus.S" => [ + "crypto/modes/asm/ghash-c64xplus.pl" + ], + "crypto/modes/ghash-ia64.s" => [ + "crypto/modes/asm/ghash-ia64.pl" + ], + "crypto/modes/ghash-parisc.s" => [ + "crypto/modes/asm/ghash-parisc.pl" + ], + "crypto/modes/ghash-riscv64-zvkb-zvbc.s" => [ + "crypto/modes/asm/ghash-riscv64-zvkb-zvbc.pl" + ], + "crypto/modes/ghash-riscv64-zvkg.s" => [ + "crypto/modes/asm/ghash-riscv64-zvkg.pl" + ], + "crypto/modes/ghash-riscv64.s" => [ + "crypto/modes/asm/ghash-riscv64.pl" + ], + "crypto/modes/ghash-s390x.S" => [ + "crypto/modes/asm/ghash-s390x.pl" + ], + "crypto/modes/ghash-sparcv9.S" => [ + "crypto/modes/asm/ghash-sparcv9.pl" + ], + "crypto/modes/ghash-x86.S" => [ + "crypto/modes/asm/ghash-x86.pl" + ], + "crypto/modes/ghash-x86_64.s" => [ + "crypto/modes/asm/ghash-x86_64.pl" + ], + "crypto/modes/ghashp8-ppc.s" => [ + "crypto/modes/asm/ghashp8-ppc.pl" + ], + "crypto/modes/ghashv8-armx.S" => [ + "crypto/modes/asm/ghashv8-armx.pl" + ], + "crypto/params_idx.c" => [ + "crypto/params_idx.c.in" + ], + "crypto/pariscid.s" => [ + "crypto/pariscid.pl" + ], + "crypto/poly1305/poly1305-armv4.S" => [ + "crypto/poly1305/asm/poly1305-armv4.pl" + ], + "crypto/poly1305/poly1305-armv8.S" => [ + "crypto/poly1305/asm/poly1305-armv8.pl" + ], + "crypto/poly1305/poly1305-c64xplus.S" => [ + "crypto/poly1305/asm/poly1305-c64xplus.pl" + ], + "crypto/poly1305/poly1305-ia64.s" => [ + "crypto/poly1305/asm/poly1305-ia64.S" + ], + "crypto/poly1305/poly1305-mips.S" => [ + "crypto/poly1305/asm/poly1305-mips.pl" + ], + "crypto/poly1305/poly1305-ppc.s" => [ + "crypto/poly1305/asm/poly1305-ppc.pl" + ], + "crypto/poly1305/poly1305-ppcfp.s" => [ + "crypto/poly1305/asm/poly1305-ppcfp.pl" + ], + "crypto/poly1305/poly1305-s390x.S" => [ + "crypto/poly1305/asm/poly1305-s390x.pl" + ], + "crypto/poly1305/poly1305-sparcv9.S" => [ + "crypto/poly1305/asm/poly1305-sparcv9.pl" + ], + "crypto/poly1305/poly1305-x86.S" => [ + "crypto/poly1305/asm/poly1305-x86.pl" + ], + "crypto/poly1305/poly1305-x86_64.s" => [ + "crypto/poly1305/asm/poly1305-x86_64.pl" + ], + "crypto/ppccpuid.s" => [ + "crypto/ppccpuid.pl" + ], + "crypto/rc4/rc4-586.S" => [ + "crypto/rc4/asm/rc4-586.pl" + ], + "crypto/rc4/rc4-c64xplus.s" => [ + "crypto/rc4/asm/rc4-c64xplus.pl" + ], + "crypto/rc4/rc4-md5-x86_64.s" => [ + "crypto/rc4/asm/rc4-md5-x86_64.pl" + ], + "crypto/rc4/rc4-parisc.s" => [ + "crypto/rc4/asm/rc4-parisc.pl" + ], + "crypto/rc4/rc4-s390x.s" => [ + "crypto/rc4/asm/rc4-s390x.pl" + ], + "crypto/rc4/rc4-x86_64.s" => [ + "crypto/rc4/asm/rc4-x86_64.pl" + ], + "crypto/ripemd/rmd-586.S" => [ + "crypto/ripemd/asm/rmd-586.pl" + ], + "crypto/riscv32cpuid.s" => [ + "crypto/riscv32cpuid.pl" + ], + "crypto/riscv64cpuid.s" => [ + "crypto/riscv64cpuid.pl" + ], + "crypto/s390xcpuid.S" => [ + "crypto/s390xcpuid.pl" + ], + "crypto/sha/keccak1600-armv4.S" => [ + "crypto/sha/asm/keccak1600-armv4.pl" + ], + "crypto/sha/keccak1600-armv8.S" => [ + "crypto/sha/asm/keccak1600-armv8.pl" + ], + "crypto/sha/keccak1600-avx2.S" => [ + "crypto/sha/asm/keccak1600-avx2.pl" + ], + "crypto/sha/keccak1600-avx512.S" => [ + "crypto/sha/asm/keccak1600-avx512.pl" + ], + "crypto/sha/keccak1600-avx512vl.S" => [ + "crypto/sha/asm/keccak1600-avx512vl.pl" + ], + "crypto/sha/keccak1600-c64x.S" => [ + "crypto/sha/asm/keccak1600-c64x.pl" + ], + "crypto/sha/keccak1600-mmx.S" => [ + "crypto/sha/asm/keccak1600-mmx.pl" + ], + "crypto/sha/keccak1600-ppc64.s" => [ + "crypto/sha/asm/keccak1600-ppc64.pl" + ], + "crypto/sha/keccak1600-s390x.S" => [ + "crypto/sha/asm/keccak1600-s390x.pl" + ], + "crypto/sha/keccak1600-x86_64.s" => [ + "crypto/sha/asm/keccak1600-x86_64.pl" + ], + "crypto/sha/keccak1600p8-ppc.S" => [ + "crypto/sha/asm/keccak1600p8-ppc.pl" + ], + "crypto/sha/sha1-586.S" => [ + "crypto/sha/asm/sha1-586.pl" + ], + "crypto/sha/sha1-alpha.S" => [ + "crypto/sha/asm/sha1-alpha.pl" + ], + "crypto/sha/sha1-armv4-large.S" => [ + "crypto/sha/asm/sha1-armv4-large.pl" + ], + "crypto/sha/sha1-armv8.S" => [ + "crypto/sha/asm/sha1-armv8.pl" + ], + "crypto/sha/sha1-c64xplus.S" => [ + "crypto/sha/asm/sha1-c64xplus.pl" + ], + "crypto/sha/sha1-ia64.s" => [ + "crypto/sha/asm/sha1-ia64.pl" + ], + "crypto/sha/sha1-mb-x86_64.s" => [ + "crypto/sha/asm/sha1-mb-x86_64.pl" + ], + "crypto/sha/sha1-mips.S" => [ + "crypto/sha/asm/sha1-mips.pl" + ], + "crypto/sha/sha1-parisc.s" => [ + "crypto/sha/asm/sha1-parisc.pl" + ], + "crypto/sha/sha1-ppc.s" => [ + "crypto/sha/asm/sha1-ppc.pl" + ], + "crypto/sha/sha1-s390x.S" => [ + "crypto/sha/asm/sha1-s390x.pl" + ], + "crypto/sha/sha1-sparcv9.S" => [ + "crypto/sha/asm/sha1-sparcv9.pl" + ], + "crypto/sha/sha1-sparcv9a.S" => [ + "crypto/sha/asm/sha1-sparcv9a.pl" + ], + "crypto/sha/sha1-thumb.S" => [ + "crypto/sha/asm/sha1-thumb.pl" + ], + "crypto/sha/sha1-x86_64.s" => [ + "crypto/sha/asm/sha1-x86_64.pl" + ], + "crypto/sha/sha256-586.S" => [ + "crypto/sha/asm/sha256-586.pl" + ], + "crypto/sha/sha256-armv4.S" => [ + "crypto/sha/asm/sha256-armv4.pl" + ], + "crypto/sha/sha256-armv8.S" => [ + "crypto/sha/asm/sha512-armv8.pl" + ], + "crypto/sha/sha256-c64xplus.S" => [ + "crypto/sha/asm/sha256-c64xplus.pl" + ], + "crypto/sha/sha256-ia64.s" => [ + "crypto/sha/asm/sha512-ia64.pl" + ], + "crypto/sha/sha256-mb-x86_64.s" => [ + "crypto/sha/asm/sha256-mb-x86_64.pl" + ], + "crypto/sha/sha256-mips.S" => [ + "crypto/sha/asm/sha512-mips.pl" + ], + "crypto/sha/sha256-parisc.s" => [ + "crypto/sha/asm/sha512-parisc.pl" + ], + "crypto/sha/sha256-ppc.s" => [ + "crypto/sha/asm/sha512-ppc.pl" + ], + "crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S" => [ + "crypto/sha/asm/sha256-riscv64-zvkb-zvknha_or_zvknhb.pl" + ], + "crypto/sha/sha256-s390x.S" => [ + "crypto/sha/asm/sha512-s390x.pl" + ], + "crypto/sha/sha256-sparcv9.S" => [ + "crypto/sha/asm/sha512-sparcv9.pl" + ], + "crypto/sha/sha256-x86_64.s" => [ + "crypto/sha/asm/sha512-x86_64.pl" + ], + "crypto/sha/sha256p8-ppc.s" => [ + "crypto/sha/asm/sha512p8-ppc.pl" + ], + "crypto/sha/sha512-586.S" => [ + "crypto/sha/asm/sha512-586.pl" + ], + "crypto/sha/sha512-armv4.S" => [ + "crypto/sha/asm/sha512-armv4.pl" + ], + "crypto/sha/sha512-armv8.S" => [ + "crypto/sha/asm/sha512-armv8.pl" + ], + "crypto/sha/sha512-c64xplus.S" => [ + "crypto/sha/asm/sha512-c64xplus.pl" + ], + "crypto/sha/sha512-ia64.s" => [ + "crypto/sha/asm/sha512-ia64.pl" + ], + "crypto/sha/sha512-mips.S" => [ + "crypto/sha/asm/sha512-mips.pl" + ], + "crypto/sha/sha512-parisc.s" => [ + "crypto/sha/asm/sha512-parisc.pl" + ], + "crypto/sha/sha512-ppc.s" => [ + "crypto/sha/asm/sha512-ppc.pl" + ], + "crypto/sha/sha512-riscv64-zvkb-zvknhb.S" => [ + "crypto/sha/asm/sha512-riscv64-zvkb-zvknhb.pl" + ], + "crypto/sha/sha512-s390x.S" => [ + "crypto/sha/asm/sha512-s390x.pl" + ], + "crypto/sha/sha512-sparcv9.S" => [ + "crypto/sha/asm/sha512-sparcv9.pl" + ], + "crypto/sha/sha512-x86_64.s" => [ + "crypto/sha/asm/sha512-x86_64.pl" + ], + "crypto/sha/sha512p8-ppc.s" => [ + "crypto/sha/asm/sha512p8-ppc.pl" + ], + "crypto/sm3/sm3-armv8.S" => [ + "crypto/sm3/asm/sm3-armv8.pl" + ], + "crypto/sm3/sm3-riscv64-zvksh.S" => [ + "crypto/sm3/asm/sm3-riscv64-zvksh.pl" + ], + "crypto/sm4/sm4-armv8.S" => [ + "crypto/sm4/asm/sm4-armv8.pl" + ], + "crypto/sm4/sm4-riscv64-zvksed.s" => [ + "crypto/sm4/asm/sm4-riscv64-zvksed.pl" + ], + "crypto/sm4/vpsm4-armv8.S" => [ + "crypto/sm4/asm/vpsm4-armv8.pl" + ], + "crypto/sm4/vpsm4_ex-armv8.S" => [ + "crypto/sm4/asm/vpsm4_ex-armv8.pl" + ], + "crypto/uplink-ia64.s" => [ + "ms/uplink-ia64.pl" + ], + "crypto/uplink-x86.S" => [ + "ms/uplink-x86.pl" + ], + "crypto/uplink-x86_64.s" => [ + "ms/uplink-x86_64.pl" + ], + "crypto/whrlpool/wp-mmx.S" => [ + "crypto/whrlpool/asm/wp-mmx.pl" + ], + "crypto/whrlpool/wp-x86_64.s" => [ + "crypto/whrlpool/asm/wp-x86_64.pl" + ], + "crypto/x86_64cpuid.s" => [ + "crypto/x86_64cpuid.pl" + ], + "crypto/x86cpuid.S" => [ + "crypto/x86cpuid.pl" + ], + "doc/html/man1/CA.pl.html" => [ + "doc/man1/CA.pl.pod" + ], + "doc/html/man1/openssl-asn1parse.html" => [ + "doc/man1/openssl-asn1parse.pod" + ], + "doc/html/man1/openssl-ca.html" => [ + "doc/man1/openssl-ca.pod" + ], + "doc/html/man1/openssl-ciphers.html" => [ + "doc/man1/openssl-ciphers.pod" + ], + "doc/html/man1/openssl-cmds.html" => [ + "doc/man1/openssl-cmds.pod" + ], + "doc/html/man1/openssl-cmp.html" => [ + "doc/man1/openssl-cmp.pod" + ], + "doc/html/man1/openssl-cms.html" => [ + "doc/man1/openssl-cms.pod" + ], + "doc/html/man1/openssl-crl.html" => [ + "doc/man1/openssl-crl.pod" + ], + "doc/html/man1/openssl-crl2pkcs7.html" => [ + "doc/man1/openssl-crl2pkcs7.pod" + ], + "doc/html/man1/openssl-dgst.html" => [ + "doc/man1/openssl-dgst.pod" + ], + "doc/html/man1/openssl-dhparam.html" => [ + "doc/man1/openssl-dhparam.pod" + ], + "doc/html/man1/openssl-dsa.html" => [ + "doc/man1/openssl-dsa.pod" + ], + "doc/html/man1/openssl-dsaparam.html" => [ + "doc/man1/openssl-dsaparam.pod" + ], + "doc/html/man1/openssl-ec.html" => [ + "doc/man1/openssl-ec.pod" + ], + "doc/html/man1/openssl-ecparam.html" => [ + "doc/man1/openssl-ecparam.pod" + ], + "doc/html/man1/openssl-enc.html" => [ + "doc/man1/openssl-enc.pod" + ], + "doc/html/man1/openssl-engine.html" => [ + "doc/man1/openssl-engine.pod" + ], + "doc/html/man1/openssl-errstr.html" => [ + "doc/man1/openssl-errstr.pod" + ], + "doc/html/man1/openssl-fipsinstall.html" => [ + "doc/man1/openssl-fipsinstall.pod" + ], + "doc/html/man1/openssl-format-options.html" => [ + "doc/man1/openssl-format-options.pod" + ], + "doc/html/man1/openssl-gendsa.html" => [ + "doc/man1/openssl-gendsa.pod" + ], + "doc/html/man1/openssl-genpkey.html" => [ + "doc/man1/openssl-genpkey.pod" + ], + "doc/html/man1/openssl-genrsa.html" => [ + "doc/man1/openssl-genrsa.pod" + ], + "doc/html/man1/openssl-info.html" => [ + "doc/man1/openssl-info.pod" + ], + "doc/html/man1/openssl-kdf.html" => [ + "doc/man1/openssl-kdf.pod" + ], + "doc/html/man1/openssl-list.html" => [ + "doc/man1/openssl-list.pod" + ], + "doc/html/man1/openssl-mac.html" => [ + "doc/man1/openssl-mac.pod" + ], + "doc/html/man1/openssl-namedisplay-options.html" => [ + "doc/man1/openssl-namedisplay-options.pod" + ], + "doc/html/man1/openssl-nseq.html" => [ + "doc/man1/openssl-nseq.pod" + ], + "doc/html/man1/openssl-ocsp.html" => [ + "doc/man1/openssl-ocsp.pod" + ], + "doc/html/man1/openssl-passphrase-options.html" => [ + "doc/man1/openssl-passphrase-options.pod" + ], + "doc/html/man1/openssl-passwd.html" => [ + "doc/man1/openssl-passwd.pod" + ], + "doc/html/man1/openssl-pkcs12.html" => [ + "doc/man1/openssl-pkcs12.pod" + ], + "doc/html/man1/openssl-pkcs7.html" => [ + "doc/man1/openssl-pkcs7.pod" + ], + "doc/html/man1/openssl-pkcs8.html" => [ + "doc/man1/openssl-pkcs8.pod" + ], + "doc/html/man1/openssl-pkey.html" => [ + "doc/man1/openssl-pkey.pod" + ], + "doc/html/man1/openssl-pkeyparam.html" => [ + "doc/man1/openssl-pkeyparam.pod" + ], + "doc/html/man1/openssl-pkeyutl.html" => [ + "doc/man1/openssl-pkeyutl.pod" + ], + "doc/html/man1/openssl-prime.html" => [ + "doc/man1/openssl-prime.pod" + ], + "doc/html/man1/openssl-rand.html" => [ + "doc/man1/openssl-rand.pod" + ], + "doc/html/man1/openssl-rehash.html" => [ + "doc/man1/openssl-rehash.pod" + ], + "doc/html/man1/openssl-req.html" => [ + "doc/man1/openssl-req.pod" + ], + "doc/html/man1/openssl-rsa.html" => [ + "doc/man1/openssl-rsa.pod" + ], + "doc/html/man1/openssl-rsautl.html" => [ + "doc/man1/openssl-rsautl.pod" + ], + "doc/html/man1/openssl-s_client.html" => [ + "doc/man1/openssl-s_client.pod" + ], + "doc/html/man1/openssl-s_server.html" => [ + "doc/man1/openssl-s_server.pod" + ], + "doc/html/man1/openssl-s_time.html" => [ + "doc/man1/openssl-s_time.pod" + ], + "doc/html/man1/openssl-sess_id.html" => [ + "doc/man1/openssl-sess_id.pod" + ], + "doc/html/man1/openssl-skeyutl.html" => [ + "doc/man1/openssl-skeyutl.pod" + ], + "doc/html/man1/openssl-smime.html" => [ + "doc/man1/openssl-smime.pod" + ], + "doc/html/man1/openssl-speed.html" => [ + "doc/man1/openssl-speed.pod" + ], + "doc/html/man1/openssl-spkac.html" => [ + "doc/man1/openssl-spkac.pod" + ], + "doc/html/man1/openssl-srp.html" => [ + "doc/man1/openssl-srp.pod" + ], + "doc/html/man1/openssl-storeutl.html" => [ + "doc/man1/openssl-storeutl.pod" + ], + "doc/html/man1/openssl-ts.html" => [ + "doc/man1/openssl-ts.pod" + ], + "doc/html/man1/openssl-verification-options.html" => [ + "doc/man1/openssl-verification-options.pod" + ], + "doc/html/man1/openssl-verify.html" => [ + "doc/man1/openssl-verify.pod" + ], + "doc/html/man1/openssl-version.html" => [ + "doc/man1/openssl-version.pod" + ], + "doc/html/man1/openssl-x509.html" => [ + "doc/man1/openssl-x509.pod" + ], + "doc/html/man1/openssl.html" => [ + "doc/man1/openssl.pod" + ], + "doc/html/man1/tsget.html" => [ + "doc/man1/tsget.pod" + ], + "doc/html/man3/ADMISSIONS.html" => [ + "doc/man3/ADMISSIONS.pod" + ], + "doc/html/man3/ASN1_EXTERN_FUNCS.html" => [ + "doc/man3/ASN1_EXTERN_FUNCS.pod" + ], + "doc/html/man3/ASN1_INTEGER_get_int64.html" => [ + "doc/man3/ASN1_INTEGER_get_int64.pod" + ], + "doc/html/man3/ASN1_INTEGER_new.html" => [ + "doc/man3/ASN1_INTEGER_new.pod" + ], + "doc/html/man3/ASN1_ITEM_lookup.html" => [ + "doc/man3/ASN1_ITEM_lookup.pod" + ], + "doc/html/man3/ASN1_OBJECT_new.html" => [ + "doc/man3/ASN1_OBJECT_new.pod" + ], + "doc/html/man3/ASN1_STRING_TABLE_add.html" => [ + "doc/man3/ASN1_STRING_TABLE_add.pod" + ], + "doc/html/man3/ASN1_STRING_length.html" => [ + "doc/man3/ASN1_STRING_length.pod" + ], + "doc/html/man3/ASN1_STRING_new.html" => [ + "doc/man3/ASN1_STRING_new.pod" + ], + "doc/html/man3/ASN1_STRING_print_ex.html" => [ + "doc/man3/ASN1_STRING_print_ex.pod" + ], + "doc/html/man3/ASN1_TIME_set.html" => [ + "doc/man3/ASN1_TIME_set.pod" + ], + "doc/html/man3/ASN1_TYPE_get.html" => [ + "doc/man3/ASN1_TYPE_get.pod" + ], + "doc/html/man3/ASN1_aux_cb.html" => [ + "doc/man3/ASN1_aux_cb.pod" + ], + "doc/html/man3/ASN1_generate_nconf.html" => [ + "doc/man3/ASN1_generate_nconf.pod" + ], + "doc/html/man3/ASN1_item_d2i_bio.html" => [ + "doc/man3/ASN1_item_d2i_bio.pod" + ], + "doc/html/man3/ASN1_item_new.html" => [ + "doc/man3/ASN1_item_new.pod" + ], + "doc/html/man3/ASN1_item_sign.html" => [ + "doc/man3/ASN1_item_sign.pod" + ], + "doc/html/man3/ASYNC_WAIT_CTX_new.html" => [ + "doc/man3/ASYNC_WAIT_CTX_new.pod" + ], + "doc/html/man3/ASYNC_start_job.html" => [ + "doc/man3/ASYNC_start_job.pod" + ], + "doc/html/man3/BF_encrypt.html" => [ + "doc/man3/BF_encrypt.pod" + ], + "doc/html/man3/BIO_ADDR.html" => [ + "doc/man3/BIO_ADDR.pod" + ], + "doc/html/man3/BIO_ADDRINFO.html" => [ + "doc/man3/BIO_ADDRINFO.pod" + ], + "doc/html/man3/BIO_connect.html" => [ + "doc/man3/BIO_connect.pod" + ], + "doc/html/man3/BIO_ctrl.html" => [ + "doc/man3/BIO_ctrl.pod" + ], + "doc/html/man3/BIO_f_base64.html" => [ + "doc/man3/BIO_f_base64.pod" + ], + "doc/html/man3/BIO_f_buffer.html" => [ + "doc/man3/BIO_f_buffer.pod" + ], + "doc/html/man3/BIO_f_cipher.html" => [ + "doc/man3/BIO_f_cipher.pod" + ], + "doc/html/man3/BIO_f_md.html" => [ + "doc/man3/BIO_f_md.pod" + ], + "doc/html/man3/BIO_f_null.html" => [ + "doc/man3/BIO_f_null.pod" + ], + "doc/html/man3/BIO_f_prefix.html" => [ + "doc/man3/BIO_f_prefix.pod" + ], + "doc/html/man3/BIO_f_readbuffer.html" => [ + "doc/man3/BIO_f_readbuffer.pod" + ], + "doc/html/man3/BIO_f_ssl.html" => [ + "doc/man3/BIO_f_ssl.pod" + ], + "doc/html/man3/BIO_find_type.html" => [ + "doc/man3/BIO_find_type.pod" + ], + "doc/html/man3/BIO_get_data.html" => [ + "doc/man3/BIO_get_data.pod" + ], + "doc/html/man3/BIO_get_ex_new_index.html" => [ + "doc/man3/BIO_get_ex_new_index.pod" + ], + "doc/html/man3/BIO_get_rpoll_descriptor.html" => [ + "doc/man3/BIO_get_rpoll_descriptor.pod" + ], + "doc/html/man3/BIO_meth_new.html" => [ + "doc/man3/BIO_meth_new.pod" + ], + "doc/html/man3/BIO_new.html" => [ + "doc/man3/BIO_new.pod" + ], + "doc/html/man3/BIO_new_CMS.html" => [ + "doc/man3/BIO_new_CMS.pod" + ], + "doc/html/man3/BIO_parse_hostserv.html" => [ + "doc/man3/BIO_parse_hostserv.pod" + ], + "doc/html/man3/BIO_printf.html" => [ + "doc/man3/BIO_printf.pod" + ], + "doc/html/man3/BIO_push.html" => [ + "doc/man3/BIO_push.pod" + ], + "doc/html/man3/BIO_read.html" => [ + "doc/man3/BIO_read.pod" + ], + "doc/html/man3/BIO_s_accept.html" => [ + "doc/man3/BIO_s_accept.pod" + ], + "doc/html/man3/BIO_s_bio.html" => [ + "doc/man3/BIO_s_bio.pod" + ], + "doc/html/man3/BIO_s_connect.html" => [ + "doc/man3/BIO_s_connect.pod" + ], + "doc/html/man3/BIO_s_core.html" => [ + "doc/man3/BIO_s_core.pod" + ], + "doc/html/man3/BIO_s_datagram.html" => [ + "doc/man3/BIO_s_datagram.pod" + ], + "doc/html/man3/BIO_s_dgram_pair.html" => [ + "doc/man3/BIO_s_dgram_pair.pod" + ], + "doc/html/man3/BIO_s_fd.html" => [ + "doc/man3/BIO_s_fd.pod" + ], + "doc/html/man3/BIO_s_file.html" => [ + "doc/man3/BIO_s_file.pod" + ], + "doc/html/man3/BIO_s_mem.html" => [ + "doc/man3/BIO_s_mem.pod" + ], + "doc/html/man3/BIO_s_null.html" => [ + "doc/man3/BIO_s_null.pod" + ], + "doc/html/man3/BIO_s_socket.html" => [ + "doc/man3/BIO_s_socket.pod" + ], + "doc/html/man3/BIO_sendmmsg.html" => [ + "doc/man3/BIO_sendmmsg.pod" + ], + "doc/html/man3/BIO_set_callback.html" => [ + "doc/man3/BIO_set_callback.pod" + ], + "doc/html/man3/BIO_set_flags.html" => [ + "doc/man3/BIO_set_flags.pod" + ], + "doc/html/man3/BIO_should_retry.html" => [ + "doc/man3/BIO_should_retry.pod" + ], + "doc/html/man3/BIO_socket_wait.html" => [ + "doc/man3/BIO_socket_wait.pod" + ], + "doc/html/man3/BN_BLINDING_new.html" => [ + "doc/man3/BN_BLINDING_new.pod" + ], + "doc/html/man3/BN_CTX_new.html" => [ + "doc/man3/BN_CTX_new.pod" + ], + "doc/html/man3/BN_CTX_start.html" => [ + "doc/man3/BN_CTX_start.pod" + ], + "doc/html/man3/BN_add.html" => [ + "doc/man3/BN_add.pod" + ], + "doc/html/man3/BN_add_word.html" => [ + "doc/man3/BN_add_word.pod" + ], + "doc/html/man3/BN_bn2bin.html" => [ + "doc/man3/BN_bn2bin.pod" + ], + "doc/html/man3/BN_cmp.html" => [ + "doc/man3/BN_cmp.pod" + ], + "doc/html/man3/BN_copy.html" => [ + "doc/man3/BN_copy.pod" + ], + "doc/html/man3/BN_generate_prime.html" => [ + "doc/man3/BN_generate_prime.pod" + ], + "doc/html/man3/BN_mod_exp_mont.html" => [ + "doc/man3/BN_mod_exp_mont.pod" + ], + "doc/html/man3/BN_mod_inverse.html" => [ + "doc/man3/BN_mod_inverse.pod" + ], + "doc/html/man3/BN_mod_mul_montgomery.html" => [ + "doc/man3/BN_mod_mul_montgomery.pod" + ], + "doc/html/man3/BN_mod_mul_reciprocal.html" => [ + "doc/man3/BN_mod_mul_reciprocal.pod" + ], + "doc/html/man3/BN_new.html" => [ + "doc/man3/BN_new.pod" + ], + "doc/html/man3/BN_num_bytes.html" => [ + "doc/man3/BN_num_bytes.pod" + ], + "doc/html/man3/BN_rand.html" => [ + "doc/man3/BN_rand.pod" + ], + "doc/html/man3/BN_security_bits.html" => [ + "doc/man3/BN_security_bits.pod" + ], + "doc/html/man3/BN_set_bit.html" => [ + "doc/man3/BN_set_bit.pod" + ], + "doc/html/man3/BN_swap.html" => [ + "doc/man3/BN_swap.pod" + ], + "doc/html/man3/BN_zero.html" => [ + "doc/man3/BN_zero.pod" + ], + "doc/html/man3/BUF_MEM_new.html" => [ + "doc/man3/BUF_MEM_new.pod" + ], + "doc/html/man3/CMAC_CTX.html" => [ + "doc/man3/CMAC_CTX.pod" + ], + "doc/html/man3/CMS_EncryptedData_decrypt.html" => [ + "doc/man3/CMS_EncryptedData_decrypt.pod" + ], + "doc/html/man3/CMS_EncryptedData_encrypt.html" => [ + "doc/man3/CMS_EncryptedData_encrypt.pod" + ], + "doc/html/man3/CMS_EncryptedData_set1_key.html" => [ + "doc/man3/CMS_EncryptedData_set1_key.pod" + ], + "doc/html/man3/CMS_EnvelopedData_create.html" => [ + "doc/man3/CMS_EnvelopedData_create.pod" + ], + "doc/html/man3/CMS_add0_cert.html" => [ + "doc/man3/CMS_add0_cert.pod" + ], + "doc/html/man3/CMS_add1_recipient_cert.html" => [ + "doc/man3/CMS_add1_recipient_cert.pod" + ], + "doc/html/man3/CMS_add1_signer.html" => [ + "doc/man3/CMS_add1_signer.pod" + ], + "doc/html/man3/CMS_compress.html" => [ + "doc/man3/CMS_compress.pod" + ], + "doc/html/man3/CMS_data_create.html" => [ + "doc/man3/CMS_data_create.pod" + ], + "doc/html/man3/CMS_decrypt.html" => [ + "doc/man3/CMS_decrypt.pod" + ], + "doc/html/man3/CMS_digest_create.html" => [ + "doc/man3/CMS_digest_create.pod" + ], + "doc/html/man3/CMS_encrypt.html" => [ + "doc/man3/CMS_encrypt.pod" + ], + "doc/html/man3/CMS_final.html" => [ + "doc/man3/CMS_final.pod" + ], + "doc/html/man3/CMS_get0_RecipientInfos.html" => [ + "doc/man3/CMS_get0_RecipientInfos.pod" + ], + "doc/html/man3/CMS_get0_SignerInfos.html" => [ + "doc/man3/CMS_get0_SignerInfos.pod" + ], + "doc/html/man3/CMS_get0_type.html" => [ + "doc/man3/CMS_get0_type.pod" + ], + "doc/html/man3/CMS_get1_ReceiptRequest.html" => [ + "doc/man3/CMS_get1_ReceiptRequest.pod" + ], + "doc/html/man3/CMS_sign.html" => [ + "doc/man3/CMS_sign.pod" + ], + "doc/html/man3/CMS_sign_receipt.html" => [ + "doc/man3/CMS_sign_receipt.pod" + ], + "doc/html/man3/CMS_signed_get_attr.html" => [ + "doc/man3/CMS_signed_get_attr.pod" + ], + "doc/html/man3/CMS_uncompress.html" => [ + "doc/man3/CMS_uncompress.pod" + ], + "doc/html/man3/CMS_verify.html" => [ + "doc/man3/CMS_verify.pod" + ], + "doc/html/man3/CMS_verify_receipt.html" => [ + "doc/man3/CMS_verify_receipt.pod" + ], + "doc/html/man3/COMP_CTX_new.html" => [ + "doc/man3/COMP_CTX_new.pod" + ], + "doc/html/man3/CONF_modules_free.html" => [ + "doc/man3/CONF_modules_free.pod" + ], + "doc/html/man3/CONF_modules_load_file.html" => [ + "doc/man3/CONF_modules_load_file.pod" + ], + "doc/html/man3/CRYPTO_THREAD_run_once.html" => [ + "doc/man3/CRYPTO_THREAD_run_once.pod" + ], + "doc/html/man3/CRYPTO_get_ex_new_index.html" => [ + "doc/man3/CRYPTO_get_ex_new_index.pod" + ], + "doc/html/man3/CRYPTO_memcmp.html" => [ + "doc/man3/CRYPTO_memcmp.pod" + ], + "doc/html/man3/CTLOG_STORE_get0_log_by_id.html" => [ + "doc/man3/CTLOG_STORE_get0_log_by_id.pod" + ], + "doc/html/man3/CTLOG_STORE_new.html" => [ + "doc/man3/CTLOG_STORE_new.pod" + ], + "doc/html/man3/CTLOG_new.html" => [ + "doc/man3/CTLOG_new.pod" + ], + "doc/html/man3/CT_POLICY_EVAL_CTX_new.html" => [ + "doc/man3/CT_POLICY_EVAL_CTX_new.pod" + ], + "doc/html/man3/DEFINE_STACK_OF.html" => [ + "doc/man3/DEFINE_STACK_OF.pod" + ], + "doc/html/man3/DES_random_key.html" => [ + "doc/man3/DES_random_key.pod" + ], + "doc/html/man3/DH_generate_key.html" => [ + "doc/man3/DH_generate_key.pod" + ], + "doc/html/man3/DH_generate_parameters.html" => [ + "doc/man3/DH_generate_parameters.pod" + ], + "doc/html/man3/DH_get0_pqg.html" => [ + "doc/man3/DH_get0_pqg.pod" + ], + "doc/html/man3/DH_get_1024_160.html" => [ + "doc/man3/DH_get_1024_160.pod" + ], + "doc/html/man3/DH_meth_new.html" => [ + "doc/man3/DH_meth_new.pod" + ], + "doc/html/man3/DH_new.html" => [ + "doc/man3/DH_new.pod" + ], + "doc/html/man3/DH_new_by_nid.html" => [ + "doc/man3/DH_new_by_nid.pod" + ], + "doc/html/man3/DH_set_method.html" => [ + "doc/man3/DH_set_method.pod" + ], + "doc/html/man3/DH_size.html" => [ + "doc/man3/DH_size.pod" + ], + "doc/html/man3/DSA_SIG_new.html" => [ + "doc/man3/DSA_SIG_new.pod" + ], + "doc/html/man3/DSA_do_sign.html" => [ + "doc/man3/DSA_do_sign.pod" + ], + "doc/html/man3/DSA_dup_DH.html" => [ + "doc/man3/DSA_dup_DH.pod" + ], + "doc/html/man3/DSA_generate_key.html" => [ + "doc/man3/DSA_generate_key.pod" + ], + "doc/html/man3/DSA_generate_parameters.html" => [ + "doc/man3/DSA_generate_parameters.pod" + ], + "doc/html/man3/DSA_get0_pqg.html" => [ + "doc/man3/DSA_get0_pqg.pod" + ], + "doc/html/man3/DSA_meth_new.html" => [ + "doc/man3/DSA_meth_new.pod" + ], + "doc/html/man3/DSA_new.html" => [ + "doc/man3/DSA_new.pod" + ], + "doc/html/man3/DSA_set_method.html" => [ + "doc/man3/DSA_set_method.pod" + ], + "doc/html/man3/DSA_sign.html" => [ + "doc/man3/DSA_sign.pod" + ], + "doc/html/man3/DSA_size.html" => [ + "doc/man3/DSA_size.pod" + ], + "doc/html/man3/DTLS_get_data_mtu.html" => [ + "doc/man3/DTLS_get_data_mtu.pod" + ], + "doc/html/man3/DTLS_set_timer_cb.html" => [ + "doc/man3/DTLS_set_timer_cb.pod" + ], + "doc/html/man3/DTLSv1_get_timeout.html" => [ + "doc/man3/DTLSv1_get_timeout.pod" + ], + "doc/html/man3/DTLSv1_handle_timeout.html" => [ + "doc/man3/DTLSv1_handle_timeout.pod" + ], + "doc/html/man3/DTLSv1_listen.html" => [ + "doc/man3/DTLSv1_listen.pod" + ], + "doc/html/man3/ECDSA_SIG_new.html" => [ + "doc/man3/ECDSA_SIG_new.pod" + ], + "doc/html/man3/ECDSA_sign.html" => [ + "doc/man3/ECDSA_sign.pod" + ], + "doc/html/man3/ECPKParameters_print.html" => [ + "doc/man3/ECPKParameters_print.pod" + ], + "doc/html/man3/EC_GFp_simple_method.html" => [ + "doc/man3/EC_GFp_simple_method.pod" + ], + "doc/html/man3/EC_GROUP_copy.html" => [ + "doc/man3/EC_GROUP_copy.pod" + ], + "doc/html/man3/EC_GROUP_new.html" => [ + "doc/man3/EC_GROUP_new.pod" + ], + "doc/html/man3/EC_KEY_get_enc_flags.html" => [ + "doc/man3/EC_KEY_get_enc_flags.pod" + ], + "doc/html/man3/EC_KEY_new.html" => [ + "doc/man3/EC_KEY_new.pod" + ], + "doc/html/man3/EC_POINT_add.html" => [ + "doc/man3/EC_POINT_add.pod" + ], + "doc/html/man3/EC_POINT_new.html" => [ + "doc/man3/EC_POINT_new.pod" + ], + "doc/html/man3/ENGINE_add.html" => [ + "doc/man3/ENGINE_add.pod" + ], + "doc/html/man3/ERR_GET_LIB.html" => [ + "doc/man3/ERR_GET_LIB.pod" + ], + "doc/html/man3/ERR_clear_error.html" => [ + "doc/man3/ERR_clear_error.pod" + ], + "doc/html/man3/ERR_error_string.html" => [ + "doc/man3/ERR_error_string.pod" + ], + "doc/html/man3/ERR_get_error.html" => [ + "doc/man3/ERR_get_error.pod" + ], + "doc/html/man3/ERR_load_crypto_strings.html" => [ + "doc/man3/ERR_load_crypto_strings.pod" + ], + "doc/html/man3/ERR_load_strings.html" => [ + "doc/man3/ERR_load_strings.pod" + ], + "doc/html/man3/ERR_new.html" => [ + "doc/man3/ERR_new.pod" + ], + "doc/html/man3/ERR_print_errors.html" => [ + "doc/man3/ERR_print_errors.pod" + ], + "doc/html/man3/ERR_put_error.html" => [ + "doc/man3/ERR_put_error.pod" + ], + "doc/html/man3/ERR_remove_state.html" => [ + "doc/man3/ERR_remove_state.pod" + ], + "doc/html/man3/ERR_set_mark.html" => [ + "doc/man3/ERR_set_mark.pod" + ], + "doc/html/man3/EVP_ASYM_CIPHER_free.html" => [ + "doc/man3/EVP_ASYM_CIPHER_free.pod" + ], + "doc/html/man3/EVP_BytesToKey.html" => [ + "doc/man3/EVP_BytesToKey.pod" + ], + "doc/html/man3/EVP_CIPHER_CTX_get_app_data.html" => [ + "doc/man3/EVP_CIPHER_CTX_get_app_data.pod" + ], + "doc/html/man3/EVP_CIPHER_CTX_get_cipher_data.html" => [ + "doc/man3/EVP_CIPHER_CTX_get_cipher_data.pod" + ], + "doc/html/man3/EVP_CIPHER_CTX_get_original_iv.html" => [ + "doc/man3/EVP_CIPHER_CTX_get_original_iv.pod" + ], + "doc/html/man3/EVP_CIPHER_meth_new.html" => [ + "doc/man3/EVP_CIPHER_meth_new.pod" + ], + "doc/html/man3/EVP_DigestInit.html" => [ + "doc/man3/EVP_DigestInit.pod" + ], + "doc/html/man3/EVP_DigestSignInit.html" => [ + "doc/man3/EVP_DigestSignInit.pod" + ], + "doc/html/man3/EVP_DigestVerifyInit.html" => [ + "doc/man3/EVP_DigestVerifyInit.pod" + ], + "doc/html/man3/EVP_EncodeInit.html" => [ + "doc/man3/EVP_EncodeInit.pod" + ], + "doc/html/man3/EVP_EncryptInit.html" => [ + "doc/man3/EVP_EncryptInit.pod" + ], + "doc/html/man3/EVP_KDF.html" => [ + "doc/man3/EVP_KDF.pod" + ], + "doc/html/man3/EVP_KEM_free.html" => [ + "doc/man3/EVP_KEM_free.pod" + ], + "doc/html/man3/EVP_KEYEXCH_free.html" => [ + "doc/man3/EVP_KEYEXCH_free.pod" + ], + "doc/html/man3/EVP_KEYMGMT.html" => [ + "doc/man3/EVP_KEYMGMT.pod" + ], + "doc/html/man3/EVP_MAC.html" => [ + "doc/man3/EVP_MAC.pod" + ], + "doc/html/man3/EVP_MD_meth_new.html" => [ + "doc/man3/EVP_MD_meth_new.pod" + ], + "doc/html/man3/EVP_OpenInit.html" => [ + "doc/man3/EVP_OpenInit.pod" + ], + "doc/html/man3/EVP_PBE_CipherInit.html" => [ + "doc/man3/EVP_PBE_CipherInit.pod" + ], + "doc/html/man3/EVP_PKEY2PKCS8.html" => [ + "doc/man3/EVP_PKEY2PKCS8.pod" + ], + "doc/html/man3/EVP_PKEY_ASN1_METHOD.html" => [ + "doc/man3/EVP_PKEY_ASN1_METHOD.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_ctrl.html" => [ + "doc/man3/EVP_PKEY_CTX_ctrl.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_get0_libctx.html" => [ + "doc/man3/EVP_PKEY_CTX_get0_libctx.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_get0_pkey.html" => [ + "doc/man3/EVP_PKEY_CTX_get0_pkey.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_get_algor.html" => [ + "doc/man3/EVP_PKEY_CTX_get_algor.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_new.html" => [ + "doc/man3/EVP_PKEY_CTX_new.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set1_pbe_pass.html" => [ + "doc/man3/EVP_PKEY_CTX_set1_pbe_pass.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_hkdf_md.html" => [ + "doc/man3/EVP_PKEY_CTX_set_hkdf_md.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_params.html" => [ + "doc/man3/EVP_PKEY_CTX_set_params.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.html" => [ + "doc/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_scrypt_N.html" => [ + "doc/man3/EVP_PKEY_CTX_set_scrypt_N.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_tls1_prf_md.html" => [ + "doc/man3/EVP_PKEY_CTX_set_tls1_prf_md.pod" + ], + "doc/html/man3/EVP_PKEY_asn1_get_count.html" => [ + "doc/man3/EVP_PKEY_asn1_get_count.pod" + ], + "doc/html/man3/EVP_PKEY_check.html" => [ + "doc/man3/EVP_PKEY_check.pod" + ], + "doc/html/man3/EVP_PKEY_copy_parameters.html" => [ + "doc/man3/EVP_PKEY_copy_parameters.pod" + ], + "doc/html/man3/EVP_PKEY_decapsulate.html" => [ + "doc/man3/EVP_PKEY_decapsulate.pod" + ], + "doc/html/man3/EVP_PKEY_decrypt.html" => [ + "doc/man3/EVP_PKEY_decrypt.pod" + ], + "doc/html/man3/EVP_PKEY_derive.html" => [ + "doc/man3/EVP_PKEY_derive.pod" + ], + "doc/html/man3/EVP_PKEY_digestsign_supports_digest.html" => [ + "doc/man3/EVP_PKEY_digestsign_supports_digest.pod" + ], + "doc/html/man3/EVP_PKEY_encapsulate.html" => [ + "doc/man3/EVP_PKEY_encapsulate.pod" + ], + "doc/html/man3/EVP_PKEY_encrypt.html" => [ + "doc/man3/EVP_PKEY_encrypt.pod" + ], + "doc/html/man3/EVP_PKEY_fromdata.html" => [ + "doc/man3/EVP_PKEY_fromdata.pod" + ], + "doc/html/man3/EVP_PKEY_get_attr.html" => [ + "doc/man3/EVP_PKEY_get_attr.pod" + ], + "doc/html/man3/EVP_PKEY_get_default_digest_nid.html" => [ + "doc/man3/EVP_PKEY_get_default_digest_nid.pod" + ], + "doc/html/man3/EVP_PKEY_get_field_type.html" => [ + "doc/man3/EVP_PKEY_get_field_type.pod" + ], + "doc/html/man3/EVP_PKEY_get_group_name.html" => [ + "doc/man3/EVP_PKEY_get_group_name.pod" + ], + "doc/html/man3/EVP_PKEY_get_size.html" => [ + "doc/man3/EVP_PKEY_get_size.pod" + ], + "doc/html/man3/EVP_PKEY_gettable_params.html" => [ + "doc/man3/EVP_PKEY_gettable_params.pod" + ], + "doc/html/man3/EVP_PKEY_is_a.html" => [ + "doc/man3/EVP_PKEY_is_a.pod" + ], + "doc/html/man3/EVP_PKEY_keygen.html" => [ + "doc/man3/EVP_PKEY_keygen.pod" + ], + "doc/html/man3/EVP_PKEY_meth_get_count.html" => [ + "doc/man3/EVP_PKEY_meth_get_count.pod" + ], + "doc/html/man3/EVP_PKEY_meth_new.html" => [ + "doc/man3/EVP_PKEY_meth_new.pod" + ], + "doc/html/man3/EVP_PKEY_new.html" => [ + "doc/man3/EVP_PKEY_new.pod" + ], + "doc/html/man3/EVP_PKEY_print_private.html" => [ + "doc/man3/EVP_PKEY_print_private.pod" + ], + "doc/html/man3/EVP_PKEY_set1_RSA.html" => [ + "doc/man3/EVP_PKEY_set1_RSA.pod" + ], + "doc/html/man3/EVP_PKEY_set1_encoded_public_key.html" => [ + "doc/man3/EVP_PKEY_set1_encoded_public_key.pod" + ], + "doc/html/man3/EVP_PKEY_set_type.html" => [ + "doc/man3/EVP_PKEY_set_type.pod" + ], + "doc/html/man3/EVP_PKEY_settable_params.html" => [ + "doc/man3/EVP_PKEY_settable_params.pod" + ], + "doc/html/man3/EVP_PKEY_sign.html" => [ + "doc/man3/EVP_PKEY_sign.pod" + ], + "doc/html/man3/EVP_PKEY_todata.html" => [ + "doc/man3/EVP_PKEY_todata.pod" + ], + "doc/html/man3/EVP_PKEY_verify.html" => [ + "doc/man3/EVP_PKEY_verify.pod" + ], + "doc/html/man3/EVP_PKEY_verify_recover.html" => [ + "doc/man3/EVP_PKEY_verify_recover.pod" + ], + "doc/html/man3/EVP_RAND.html" => [ + "doc/man3/EVP_RAND.pod" + ], + "doc/html/man3/EVP_SIGNATURE.html" => [ + "doc/man3/EVP_SIGNATURE.pod" + ], + "doc/html/man3/EVP_SKEY.html" => [ + "doc/man3/EVP_SKEY.pod" + ], + "doc/html/man3/EVP_SKEYMGMT.html" => [ + "doc/man3/EVP_SKEYMGMT.pod" + ], + "doc/html/man3/EVP_SealInit.html" => [ + "doc/man3/EVP_SealInit.pod" + ], + "doc/html/man3/EVP_SignInit.html" => [ + "doc/man3/EVP_SignInit.pod" + ], + "doc/html/man3/EVP_VerifyInit.html" => [ + "doc/man3/EVP_VerifyInit.pod" + ], + "doc/html/man3/EVP_aes_128_gcm.html" => [ + "doc/man3/EVP_aes_128_gcm.pod" + ], + "doc/html/man3/EVP_aria_128_gcm.html" => [ + "doc/man3/EVP_aria_128_gcm.pod" + ], + "doc/html/man3/EVP_bf_cbc.html" => [ + "doc/man3/EVP_bf_cbc.pod" + ], + "doc/html/man3/EVP_blake2b512.html" => [ + "doc/man3/EVP_blake2b512.pod" + ], + "doc/html/man3/EVP_camellia_128_ecb.html" => [ + "doc/man3/EVP_camellia_128_ecb.pod" + ], + "doc/html/man3/EVP_cast5_cbc.html" => [ + "doc/man3/EVP_cast5_cbc.pod" + ], + "doc/html/man3/EVP_chacha20.html" => [ + "doc/man3/EVP_chacha20.pod" + ], + "doc/html/man3/EVP_des_cbc.html" => [ + "doc/man3/EVP_des_cbc.pod" + ], + "doc/html/man3/EVP_desx_cbc.html" => [ + "doc/man3/EVP_desx_cbc.pod" + ], + "doc/html/man3/EVP_idea_cbc.html" => [ + "doc/man3/EVP_idea_cbc.pod" + ], + "doc/html/man3/EVP_md2.html" => [ + "doc/man3/EVP_md2.pod" + ], + "doc/html/man3/EVP_md4.html" => [ + "doc/man3/EVP_md4.pod" + ], + "doc/html/man3/EVP_md5.html" => [ + "doc/man3/EVP_md5.pod" + ], + "doc/html/man3/EVP_mdc2.html" => [ + "doc/man3/EVP_mdc2.pod" + ], + "doc/html/man3/EVP_rc2_cbc.html" => [ + "doc/man3/EVP_rc2_cbc.pod" + ], + "doc/html/man3/EVP_rc4.html" => [ + "doc/man3/EVP_rc4.pod" + ], + "doc/html/man3/EVP_rc5_32_12_16_cbc.html" => [ + "doc/man3/EVP_rc5_32_12_16_cbc.pod" + ], + "doc/html/man3/EVP_ripemd160.html" => [ + "doc/man3/EVP_ripemd160.pod" + ], + "doc/html/man3/EVP_seed_cbc.html" => [ + "doc/man3/EVP_seed_cbc.pod" + ], + "doc/html/man3/EVP_set_default_properties.html" => [ + "doc/man3/EVP_set_default_properties.pod" + ], + "doc/html/man3/EVP_sha1.html" => [ + "doc/man3/EVP_sha1.pod" + ], + "doc/html/man3/EVP_sha224.html" => [ + "doc/man3/EVP_sha224.pod" + ], + "doc/html/man3/EVP_sha3_224.html" => [ + "doc/man3/EVP_sha3_224.pod" + ], + "doc/html/man3/EVP_sm3.html" => [ + "doc/man3/EVP_sm3.pod" + ], + "doc/html/man3/EVP_sm4_cbc.html" => [ + "doc/man3/EVP_sm4_cbc.pod" + ], + "doc/html/man3/EVP_whirlpool.html" => [ + "doc/man3/EVP_whirlpool.pod" + ], + "doc/html/man3/GENERAL_NAME.html" => [ + "doc/man3/GENERAL_NAME.pod" + ], + "doc/html/man3/HMAC.html" => [ + "doc/man3/HMAC.pod" + ], + "doc/html/man3/MD5.html" => [ + "doc/man3/MD5.pod" + ], + "doc/html/man3/MDC2_Init.html" => [ + "doc/man3/MDC2_Init.pod" + ], + "doc/html/man3/NCONF_new_ex.html" => [ + "doc/man3/NCONF_new_ex.pod" + ], + "doc/html/man3/OBJ_nid2obj.html" => [ + "doc/man3/OBJ_nid2obj.pod" + ], + "doc/html/man3/OCSP_REQUEST_new.html" => [ + "doc/man3/OCSP_REQUEST_new.pod" + ], + "doc/html/man3/OCSP_cert_to_id.html" => [ + "doc/man3/OCSP_cert_to_id.pod" + ], + "doc/html/man3/OCSP_request_add1_nonce.html" => [ + "doc/man3/OCSP_request_add1_nonce.pod" + ], + "doc/html/man3/OCSP_resp_find_status.html" => [ + "doc/man3/OCSP_resp_find_status.pod" + ], + "doc/html/man3/OCSP_response_status.html" => [ + "doc/man3/OCSP_response_status.pod" + ], + "doc/html/man3/OCSP_sendreq_new.html" => [ + "doc/man3/OCSP_sendreq_new.pod" + ], + "doc/html/man3/OPENSSL_Applink.html" => [ + "doc/man3/OPENSSL_Applink.pod" + ], + "doc/html/man3/OPENSSL_FILE.html" => [ + "doc/man3/OPENSSL_FILE.pod" + ], + "doc/html/man3/OPENSSL_LH_COMPFUNC.html" => [ + "doc/man3/OPENSSL_LH_COMPFUNC.pod" + ], + "doc/html/man3/OPENSSL_LH_stats.html" => [ + "doc/man3/OPENSSL_LH_stats.pod" + ], + "doc/html/man3/OPENSSL_config.html" => [ + "doc/man3/OPENSSL_config.pod" + ], + "doc/html/man3/OPENSSL_fork_prepare.html" => [ + "doc/man3/OPENSSL_fork_prepare.pod" + ], + "doc/html/man3/OPENSSL_gmtime.html" => [ + "doc/man3/OPENSSL_gmtime.pod" + ], + "doc/html/man3/OPENSSL_hexchar2int.html" => [ + "doc/man3/OPENSSL_hexchar2int.pod" + ], + "doc/html/man3/OPENSSL_ia32cap.html" => [ + "doc/man3/OPENSSL_ia32cap.pod" + ], + "doc/html/man3/OPENSSL_init_crypto.html" => [ + "doc/man3/OPENSSL_init_crypto.pod" + ], + "doc/html/man3/OPENSSL_init_ssl.html" => [ + "doc/man3/OPENSSL_init_ssl.pod" + ], + "doc/html/man3/OPENSSL_instrument_bus.html" => [ + "doc/man3/OPENSSL_instrument_bus.pod" + ], + "doc/html/man3/OPENSSL_load_builtin_modules.html" => [ + "doc/man3/OPENSSL_load_builtin_modules.pod" + ], + "doc/html/man3/OPENSSL_load_u16_le.html" => [ + "doc/man3/OPENSSL_load_u16_le.pod" + ], + "doc/html/man3/OPENSSL_malloc.html" => [ + "doc/man3/OPENSSL_malloc.pod" + ], + "doc/html/man3/OPENSSL_ppccap.html" => [ + "doc/man3/OPENSSL_ppccap.pod" + ], + "doc/html/man3/OPENSSL_riscvcap.html" => [ + "doc/man3/OPENSSL_riscvcap.pod" + ], + "doc/html/man3/OPENSSL_s390xcap.html" => [ + "doc/man3/OPENSSL_s390xcap.pod" + ], + "doc/html/man3/OPENSSL_secure_malloc.html" => [ + "doc/man3/OPENSSL_secure_malloc.pod" + ], + "doc/html/man3/OPENSSL_strcasecmp.html" => [ + "doc/man3/OPENSSL_strcasecmp.pod" + ], + "doc/html/man3/OSSL_ALGORITHM.html" => [ + "doc/man3/OSSL_ALGORITHM.pod" + ], + "doc/html/man3/OSSL_CALLBACK.html" => [ + "doc/man3/OSSL_CALLBACK.pod" + ], + "doc/html/man3/OSSL_CMP_ATAV_set0.html" => [ + "doc/man3/OSSL_CMP_ATAV_set0.pod" + ], + "doc/html/man3/OSSL_CMP_CTX_new.html" => [ + "doc/man3/OSSL_CMP_CTX_new.pod" + ], + "doc/html/man3/OSSL_CMP_HDR_get0_transactionID.html" => [ + "doc/man3/OSSL_CMP_HDR_get0_transactionID.pod" + ], + "doc/html/man3/OSSL_CMP_ITAV_new_caCerts.html" => [ + "doc/man3/OSSL_CMP_ITAV_new_caCerts.pod" + ], + "doc/html/man3/OSSL_CMP_ITAV_set0.html" => [ + "doc/man3/OSSL_CMP_ITAV_set0.pod" + ], + "doc/html/man3/OSSL_CMP_MSG_get0_header.html" => [ + "doc/man3/OSSL_CMP_MSG_get0_header.pod" + ], + "doc/html/man3/OSSL_CMP_MSG_http_perform.html" => [ + "doc/man3/OSSL_CMP_MSG_http_perform.pod" + ], + "doc/html/man3/OSSL_CMP_SRV_CTX_new.html" => [ + "doc/man3/OSSL_CMP_SRV_CTX_new.pod" + ], + "doc/html/man3/OSSL_CMP_STATUSINFO_new.html" => [ + "doc/man3/OSSL_CMP_STATUSINFO_new.pod" + ], + "doc/html/man3/OSSL_CMP_exec_certreq.html" => [ + "doc/man3/OSSL_CMP_exec_certreq.pod" + ], + "doc/html/man3/OSSL_CMP_log_open.html" => [ + "doc/man3/OSSL_CMP_log_open.pod" + ], + "doc/html/man3/OSSL_CMP_validate_msg.html" => [ + "doc/man3/OSSL_CMP_validate_msg.pod" + ], + "doc/html/man3/OSSL_CORE_MAKE_FUNC.html" => [ + "doc/man3/OSSL_CORE_MAKE_FUNC.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_get0_tmpl.html" => [ + "doc/man3/OSSL_CRMF_MSG_get0_tmpl.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_set0_validity.html" => [ + "doc/man3/OSSL_CRMF_MSG_set0_validity.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.html" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.html" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.pod" + ], + "doc/html/man3/OSSL_CRMF_pbmp_new.html" => [ + "doc/man3/OSSL_CRMF_pbmp_new.pod" + ], + "doc/html/man3/OSSL_DECODER.html" => [ + "doc/man3/OSSL_DECODER.pod" + ], + "doc/html/man3/OSSL_DECODER_CTX.html" => [ + "doc/man3/OSSL_DECODER_CTX.pod" + ], + "doc/html/man3/OSSL_DECODER_CTX_new_for_pkey.html" => [ + "doc/man3/OSSL_DECODER_CTX_new_for_pkey.pod" + ], + "doc/html/man3/OSSL_DECODER_from_bio.html" => [ + "doc/man3/OSSL_DECODER_from_bio.pod" + ], + "doc/html/man3/OSSL_DISPATCH.html" => [ + "doc/man3/OSSL_DISPATCH.pod" + ], + "doc/html/man3/OSSL_ENCODER.html" => [ + "doc/man3/OSSL_ENCODER.pod" + ], + "doc/html/man3/OSSL_ENCODER_CTX.html" => [ + "doc/man3/OSSL_ENCODER_CTX.pod" + ], + "doc/html/man3/OSSL_ENCODER_CTX_new_for_pkey.html" => [ + "doc/man3/OSSL_ENCODER_CTX_new_for_pkey.pod" + ], + "doc/html/man3/OSSL_ENCODER_to_bio.html" => [ + "doc/man3/OSSL_ENCODER_to_bio.pod" + ], + "doc/html/man3/OSSL_ERR_STATE_save.html" => [ + "doc/man3/OSSL_ERR_STATE_save.pod" + ], + "doc/html/man3/OSSL_ESS_check_signing_certs.html" => [ + "doc/man3/OSSL_ESS_check_signing_certs.pod" + ], + "doc/html/man3/OSSL_GENERAL_NAMES_print.html" => [ + "doc/man3/OSSL_GENERAL_NAMES_print.pod" + ], + "doc/html/man3/OSSL_HPKE_CTX_new.html" => [ + "doc/man3/OSSL_HPKE_CTX_new.pod" + ], + "doc/html/man3/OSSL_HTTP_REQ_CTX.html" => [ + "doc/man3/OSSL_HTTP_REQ_CTX.pod" + ], + "doc/html/man3/OSSL_HTTP_parse_url.html" => [ + "doc/man3/OSSL_HTTP_parse_url.pod" + ], + "doc/html/man3/OSSL_HTTP_transfer.html" => [ + "doc/man3/OSSL_HTTP_transfer.pod" + ], + "doc/html/man3/OSSL_IETF_ATTR_SYNTAX.html" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX.pod" + ], + "doc/html/man3/OSSL_IETF_ATTR_SYNTAX_print.html" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX_print.pod" + ], + "doc/html/man3/OSSL_INDICATOR_set_callback.html" => [ + "doc/man3/OSSL_INDICATOR_set_callback.pod" + ], + "doc/html/man3/OSSL_ITEM.html" => [ + "doc/man3/OSSL_ITEM.pod" + ], + "doc/html/man3/OSSL_LIB_CTX.html" => [ + "doc/man3/OSSL_LIB_CTX.pod" + ], + "doc/html/man3/OSSL_LIB_CTX_set_conf_diagnostics.html" => [ + "doc/man3/OSSL_LIB_CTX_set_conf_diagnostics.pod" + ], + "doc/html/man3/OSSL_PARAM.html" => [ + "doc/man3/OSSL_PARAM.pod" + ], + "doc/html/man3/OSSL_PARAM_BLD.html" => [ + "doc/man3/OSSL_PARAM_BLD.pod" + ], + "doc/html/man3/OSSL_PARAM_allocate_from_text.html" => [ + "doc/man3/OSSL_PARAM_allocate_from_text.pod" + ], + "doc/html/man3/OSSL_PARAM_dup.html" => [ + "doc/man3/OSSL_PARAM_dup.pod" + ], + "doc/html/man3/OSSL_PARAM_int.html" => [ + "doc/man3/OSSL_PARAM_int.pod" + ], + "doc/html/man3/OSSL_PARAM_print_to_bio.html" => [ + "doc/man3/OSSL_PARAM_print_to_bio.pod" + ], + "doc/html/man3/OSSL_PROVIDER.html" => [ + "doc/man3/OSSL_PROVIDER.pod" + ], + "doc/html/man3/OSSL_QUIC_client_method.html" => [ + "doc/man3/OSSL_QUIC_client_method.pod" + ], + "doc/html/man3/OSSL_SELF_TEST_new.html" => [ + "doc/man3/OSSL_SELF_TEST_new.pod" + ], + "doc/html/man3/OSSL_SELF_TEST_set_callback.html" => [ + "doc/man3/OSSL_SELF_TEST_set_callback.pod" + ], + "doc/html/man3/OSSL_STORE_INFO.html" => [ + "doc/man3/OSSL_STORE_INFO.pod" + ], + "doc/html/man3/OSSL_STORE_LOADER.html" => [ + "doc/man3/OSSL_STORE_LOADER.pod" + ], + "doc/html/man3/OSSL_STORE_SEARCH.html" => [ + "doc/man3/OSSL_STORE_SEARCH.pod" + ], + "doc/html/man3/OSSL_STORE_attach.html" => [ + "doc/man3/OSSL_STORE_attach.pod" + ], + "doc/html/man3/OSSL_STORE_expect.html" => [ + "doc/man3/OSSL_STORE_expect.pod" + ], + "doc/html/man3/OSSL_STORE_open.html" => [ + "doc/man3/OSSL_STORE_open.pod" + ], + "doc/html/man3/OSSL_sleep.html" => [ + "doc/man3/OSSL_sleep.pod" + ], + "doc/html/man3/OSSL_trace_enabled.html" => [ + "doc/man3/OSSL_trace_enabled.pod" + ], + "doc/html/man3/OSSL_trace_get_category_num.html" => [ + "doc/man3/OSSL_trace_get_category_num.pod" + ], + "doc/html/man3/OSSL_trace_set_channel.html" => [ + "doc/man3/OSSL_trace_set_channel.pod" + ], + "doc/html/man3/OpenSSL_add_all_algorithms.html" => [ + "doc/man3/OpenSSL_add_all_algorithms.pod" + ], + "doc/html/man3/OpenSSL_version.html" => [ + "doc/man3/OpenSSL_version.pod" + ], + "doc/html/man3/PBMAC1_get1_pbkdf2_param.html" => [ + "doc/man3/PBMAC1_get1_pbkdf2_param.pod" + ], + "doc/html/man3/PEM_X509_INFO_read_bio_ex.html" => [ + "doc/man3/PEM_X509_INFO_read_bio_ex.pod" + ], + "doc/html/man3/PEM_bytes_read_bio.html" => [ + "doc/man3/PEM_bytes_read_bio.pod" + ], + "doc/html/man3/PEM_read.html" => [ + "doc/man3/PEM_read.pod" + ], + "doc/html/man3/PEM_read_CMS.html" => [ + "doc/man3/PEM_read_CMS.pod" + ], + "doc/html/man3/PEM_read_bio_PrivateKey.html" => [ + "doc/man3/PEM_read_bio_PrivateKey.pod" + ], + "doc/html/man3/PEM_read_bio_ex.html" => [ + "doc/man3/PEM_read_bio_ex.pod" + ], + "doc/html/man3/PEM_write_bio_CMS_stream.html" => [ + "doc/man3/PEM_write_bio_CMS_stream.pod" + ], + "doc/html/man3/PEM_write_bio_PKCS7_stream.html" => [ + "doc/man3/PEM_write_bio_PKCS7_stream.pod" + ], + "doc/html/man3/PKCS12_PBE_keyivgen.html" => [ + "doc/man3/PKCS12_PBE_keyivgen.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_create_cert.html" => [ + "doc/man3/PKCS12_SAFEBAG_create_cert.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_get0_attrs.html" => [ + "doc/man3/PKCS12_SAFEBAG_get0_attrs.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_get1_cert.html" => [ + "doc/man3/PKCS12_SAFEBAG_get1_cert.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_set0_attrs.html" => [ + "doc/man3/PKCS12_SAFEBAG_set0_attrs.pod" + ], + "doc/html/man3/PKCS12_add1_attr_by_NID.html" => [ + "doc/man3/PKCS12_add1_attr_by_NID.pod" + ], + "doc/html/man3/PKCS12_add_CSPName_asc.html" => [ + "doc/man3/PKCS12_add_CSPName_asc.pod" + ], + "doc/html/man3/PKCS12_add_cert.html" => [ + "doc/man3/PKCS12_add_cert.pod" + ], + "doc/html/man3/PKCS12_add_friendlyname_asc.html" => [ + "doc/man3/PKCS12_add_friendlyname_asc.pod" + ], + "doc/html/man3/PKCS12_add_localkeyid.html" => [ + "doc/man3/PKCS12_add_localkeyid.pod" + ], + "doc/html/man3/PKCS12_add_safe.html" => [ + "doc/man3/PKCS12_add_safe.pod" + ], + "doc/html/man3/PKCS12_create.html" => [ + "doc/man3/PKCS12_create.pod" + ], + "doc/html/man3/PKCS12_decrypt_skey.html" => [ + "doc/man3/PKCS12_decrypt_skey.pod" + ], + "doc/html/man3/PKCS12_gen_mac.html" => [ + "doc/man3/PKCS12_gen_mac.pod" + ], + "doc/html/man3/PKCS12_get_friendlyname.html" => [ + "doc/man3/PKCS12_get_friendlyname.pod" + ], + "doc/html/man3/PKCS12_init.html" => [ + "doc/man3/PKCS12_init.pod" + ], + "doc/html/man3/PKCS12_item_decrypt_d2i.html" => [ + "doc/man3/PKCS12_item_decrypt_d2i.pod" + ], + "doc/html/man3/PKCS12_key_gen_utf8_ex.html" => [ + "doc/man3/PKCS12_key_gen_utf8_ex.pod" + ], + "doc/html/man3/PKCS12_newpass.html" => [ + "doc/man3/PKCS12_newpass.pod" + ], + "doc/html/man3/PKCS12_pack_p7encdata.html" => [ + "doc/man3/PKCS12_pack_p7encdata.pod" + ], + "doc/html/man3/PKCS12_parse.html" => [ + "doc/man3/PKCS12_parse.pod" + ], + "doc/html/man3/PKCS5_PBE_keyivgen.html" => [ + "doc/man3/PKCS5_PBE_keyivgen.pod" + ], + "doc/html/man3/PKCS5_PBKDF2_HMAC.html" => [ + "doc/man3/PKCS5_PBKDF2_HMAC.pod" + ], + "doc/html/man3/PKCS7_decrypt.html" => [ + "doc/man3/PKCS7_decrypt.pod" + ], + "doc/html/man3/PKCS7_encrypt.html" => [ + "doc/man3/PKCS7_encrypt.pod" + ], + "doc/html/man3/PKCS7_get_octet_string.html" => [ + "doc/man3/PKCS7_get_octet_string.pod" + ], + "doc/html/man3/PKCS7_sign.html" => [ + "doc/man3/PKCS7_sign.pod" + ], + "doc/html/man3/PKCS7_sign_add_signer.html" => [ + "doc/man3/PKCS7_sign_add_signer.pod" + ], + "doc/html/man3/PKCS7_type_is_other.html" => [ + "doc/man3/PKCS7_type_is_other.pod" + ], + "doc/html/man3/PKCS7_verify.html" => [ + "doc/man3/PKCS7_verify.pod" + ], + "doc/html/man3/PKCS8_encrypt.html" => [ + "doc/man3/PKCS8_encrypt.pod" + ], + "doc/html/man3/PKCS8_pkey_add1_attr.html" => [ + "doc/man3/PKCS8_pkey_add1_attr.pod" + ], + "doc/html/man3/RAND_add.html" => [ + "doc/man3/RAND_add.pod" + ], + "doc/html/man3/RAND_bytes.html" => [ + "doc/man3/RAND_bytes.pod" + ], + "doc/html/man3/RAND_cleanup.html" => [ + "doc/man3/RAND_cleanup.pod" + ], + "doc/html/man3/RAND_egd.html" => [ + "doc/man3/RAND_egd.pod" + ], + "doc/html/man3/RAND_get0_primary.html" => [ + "doc/man3/RAND_get0_primary.pod" + ], + "doc/html/man3/RAND_load_file.html" => [ + "doc/man3/RAND_load_file.pod" + ], + "doc/html/man3/RAND_set_DRBG_type.html" => [ + "doc/man3/RAND_set_DRBG_type.pod" + ], + "doc/html/man3/RAND_set_rand_method.html" => [ + "doc/man3/RAND_set_rand_method.pod" + ], + "doc/html/man3/RC4_set_key.html" => [ + "doc/man3/RC4_set_key.pod" + ], + "doc/html/man3/RIPEMD160_Init.html" => [ + "doc/man3/RIPEMD160_Init.pod" + ], + "doc/html/man3/RSA_blinding_on.html" => [ + "doc/man3/RSA_blinding_on.pod" + ], + "doc/html/man3/RSA_check_key.html" => [ + "doc/man3/RSA_check_key.pod" + ], + "doc/html/man3/RSA_generate_key.html" => [ + "doc/man3/RSA_generate_key.pod" + ], + "doc/html/man3/RSA_get0_key.html" => [ + "doc/man3/RSA_get0_key.pod" + ], + "doc/html/man3/RSA_meth_new.html" => [ + "doc/man3/RSA_meth_new.pod" + ], + "doc/html/man3/RSA_new.html" => [ + "doc/man3/RSA_new.pod" + ], + "doc/html/man3/RSA_padding_add_PKCS1_type_1.html" => [ + "doc/man3/RSA_padding_add_PKCS1_type_1.pod" + ], + "doc/html/man3/RSA_print.html" => [ + "doc/man3/RSA_print.pod" + ], + "doc/html/man3/RSA_private_encrypt.html" => [ + "doc/man3/RSA_private_encrypt.pod" + ], + "doc/html/man3/RSA_public_encrypt.html" => [ + "doc/man3/RSA_public_encrypt.pod" + ], + "doc/html/man3/RSA_set_method.html" => [ + "doc/man3/RSA_set_method.pod" + ], + "doc/html/man3/RSA_sign.html" => [ + "doc/man3/RSA_sign.pod" + ], + "doc/html/man3/RSA_sign_ASN1_OCTET_STRING.html" => [ + "doc/man3/RSA_sign_ASN1_OCTET_STRING.pod" + ], + "doc/html/man3/RSA_size.html" => [ + "doc/man3/RSA_size.pod" + ], + "doc/html/man3/SCT_new.html" => [ + "doc/man3/SCT_new.pod" + ], + "doc/html/man3/SCT_print.html" => [ + "doc/man3/SCT_print.pod" + ], + "doc/html/man3/SCT_validate.html" => [ + "doc/man3/SCT_validate.pod" + ], + "doc/html/man3/SHA256_Init.html" => [ + "doc/man3/SHA256_Init.pod" + ], + "doc/html/man3/SMIME_read_ASN1.html" => [ + "doc/man3/SMIME_read_ASN1.pod" + ], + "doc/html/man3/SMIME_read_CMS.html" => [ + "doc/man3/SMIME_read_CMS.pod" + ], + "doc/html/man3/SMIME_read_PKCS7.html" => [ + "doc/man3/SMIME_read_PKCS7.pod" + ], + "doc/html/man3/SMIME_write_ASN1.html" => [ + "doc/man3/SMIME_write_ASN1.pod" + ], + "doc/html/man3/SMIME_write_CMS.html" => [ + "doc/man3/SMIME_write_CMS.pod" + ], + "doc/html/man3/SMIME_write_PKCS7.html" => [ + "doc/man3/SMIME_write_PKCS7.pod" + ], + "doc/html/man3/SRP_Calc_B.html" => [ + "doc/man3/SRP_Calc_B.pod" + ], + "doc/html/man3/SRP_VBASE_new.html" => [ + "doc/man3/SRP_VBASE_new.pod" + ], + "doc/html/man3/SRP_create_verifier.html" => [ + "doc/man3/SRP_create_verifier.pod" + ], + "doc/html/man3/SRP_user_pwd_new.html" => [ + "doc/man3/SRP_user_pwd_new.pod" + ], + "doc/html/man3/SSL_CIPHER_get_name.html" => [ + "doc/man3/SSL_CIPHER_get_name.pod" + ], + "doc/html/man3/SSL_COMP_add_compression_method.html" => [ + "doc/man3/SSL_COMP_add_compression_method.pod" + ], + "doc/html/man3/SSL_CONF_CTX_new.html" => [ + "doc/man3/SSL_CONF_CTX_new.pod" + ], + "doc/html/man3/SSL_CONF_CTX_set1_prefix.html" => [ + "doc/man3/SSL_CONF_CTX_set1_prefix.pod" + ], + "doc/html/man3/SSL_CONF_CTX_set_flags.html" => [ + "doc/man3/SSL_CONF_CTX_set_flags.pod" + ], + "doc/html/man3/SSL_CONF_CTX_set_ssl_ctx.html" => [ + "doc/man3/SSL_CONF_CTX_set_ssl_ctx.pod" + ], + "doc/html/man3/SSL_CONF_cmd.html" => [ + "doc/man3/SSL_CONF_cmd.pod" + ], + "doc/html/man3/SSL_CONF_cmd_argv.html" => [ + "doc/man3/SSL_CONF_cmd_argv.pod" + ], + "doc/html/man3/SSL_CTX_add1_chain_cert.html" => [ + "doc/man3/SSL_CTX_add1_chain_cert.pod" + ], + "doc/html/man3/SSL_CTX_add_extra_chain_cert.html" => [ + "doc/man3/SSL_CTX_add_extra_chain_cert.pod" + ], + "doc/html/man3/SSL_CTX_add_session.html" => [ + "doc/man3/SSL_CTX_add_session.pod" + ], + "doc/html/man3/SSL_CTX_config.html" => [ + "doc/man3/SSL_CTX_config.pod" + ], + "doc/html/man3/SSL_CTX_ctrl.html" => [ + "doc/man3/SSL_CTX_ctrl.pod" + ], + "doc/html/man3/SSL_CTX_dane_enable.html" => [ + "doc/man3/SSL_CTX_dane_enable.pod" + ], + "doc/html/man3/SSL_CTX_flush_sessions.html" => [ + "doc/man3/SSL_CTX_flush_sessions.pod" + ], + "doc/html/man3/SSL_CTX_free.html" => [ + "doc/man3/SSL_CTX_free.pod" + ], + "doc/html/man3/SSL_CTX_get0_param.html" => [ + "doc/man3/SSL_CTX_get0_param.pod" + ], + "doc/html/man3/SSL_CTX_get_verify_mode.html" => [ + "doc/man3/SSL_CTX_get_verify_mode.pod" + ], + "doc/html/man3/SSL_CTX_has_client_custom_ext.html" => [ + "doc/man3/SSL_CTX_has_client_custom_ext.pod" + ], + "doc/html/man3/SSL_CTX_load_verify_locations.html" => [ + "doc/man3/SSL_CTX_load_verify_locations.pod" + ], + "doc/html/man3/SSL_CTX_new.html" => [ + "doc/man3/SSL_CTX_new.pod" + ], + "doc/html/man3/SSL_CTX_sess_number.html" => [ + "doc/man3/SSL_CTX_sess_number.pod" + ], + "doc/html/man3/SSL_CTX_sess_set_cache_size.html" => [ + "doc/man3/SSL_CTX_sess_set_cache_size.pod" + ], + "doc/html/man3/SSL_CTX_sess_set_get_cb.html" => [ + "doc/man3/SSL_CTX_sess_set_get_cb.pod" + ], + "doc/html/man3/SSL_CTX_sessions.html" => [ + "doc/man3/SSL_CTX_sessions.pod" + ], + "doc/html/man3/SSL_CTX_set0_CA_list.html" => [ + "doc/man3/SSL_CTX_set0_CA_list.pod" + ], + "doc/html/man3/SSL_CTX_set1_cert_comp_preference.html" => [ + "doc/man3/SSL_CTX_set1_cert_comp_preference.pod" + ], + "doc/html/man3/SSL_CTX_set1_curves.html" => [ + "doc/man3/SSL_CTX_set1_curves.pod" + ], + "doc/html/man3/SSL_CTX_set1_sigalgs.html" => [ + "doc/man3/SSL_CTX_set1_sigalgs.pod" + ], + "doc/html/man3/SSL_CTX_set1_verify_cert_store.html" => [ + "doc/man3/SSL_CTX_set1_verify_cert_store.pod" + ], + "doc/html/man3/SSL_CTX_set_alpn_select_cb.html" => [ + "doc/man3/SSL_CTX_set_alpn_select_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_cert_cb.html" => [ + "doc/man3/SSL_CTX_set_cert_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_cert_store.html" => [ + "doc/man3/SSL_CTX_set_cert_store.pod" + ], + "doc/html/man3/SSL_CTX_set_cert_verify_callback.html" => [ + "doc/man3/SSL_CTX_set_cert_verify_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_cipher_list.html" => [ + "doc/man3/SSL_CTX_set_cipher_list.pod" + ], + "doc/html/man3/SSL_CTX_set_client_cert_cb.html" => [ + "doc/man3/SSL_CTX_set_client_cert_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_client_hello_cb.html" => [ + "doc/man3/SSL_CTX_set_client_hello_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_ct_validation_callback.html" => [ + "doc/man3/SSL_CTX_set_ct_validation_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_ctlog_list_file.html" => [ + "doc/man3/SSL_CTX_set_ctlog_list_file.pod" + ], + "doc/html/man3/SSL_CTX_set_default_passwd_cb.html" => [ + "doc/man3/SSL_CTX_set_default_passwd_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_domain_flags.html" => [ + "doc/man3/SSL_CTX_set_domain_flags.pod" + ], + "doc/html/man3/SSL_CTX_set_generate_session_id.html" => [ + "doc/man3/SSL_CTX_set_generate_session_id.pod" + ], + "doc/html/man3/SSL_CTX_set_info_callback.html" => [ + "doc/man3/SSL_CTX_set_info_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_keylog_callback.html" => [ + "doc/man3/SSL_CTX_set_keylog_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_max_cert_list.html" => [ + "doc/man3/SSL_CTX_set_max_cert_list.pod" + ], + "doc/html/man3/SSL_CTX_set_min_proto_version.html" => [ + "doc/man3/SSL_CTX_set_min_proto_version.pod" + ], + "doc/html/man3/SSL_CTX_set_mode.html" => [ + "doc/man3/SSL_CTX_set_mode.pod" + ], + "doc/html/man3/SSL_CTX_set_msg_callback.html" => [ + "doc/man3/SSL_CTX_set_msg_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_new_pending_conn_cb.html" => [ + "doc/man3/SSL_CTX_set_new_pending_conn_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_num_tickets.html" => [ + "doc/man3/SSL_CTX_set_num_tickets.pod" + ], + "doc/html/man3/SSL_CTX_set_options.html" => [ + "doc/man3/SSL_CTX_set_options.pod" + ], + "doc/html/man3/SSL_CTX_set_psk_client_callback.html" => [ + "doc/man3/SSL_CTX_set_psk_client_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_quiet_shutdown.html" => [ + "doc/man3/SSL_CTX_set_quiet_shutdown.pod" + ], + "doc/html/man3/SSL_CTX_set_read_ahead.html" => [ + "doc/man3/SSL_CTX_set_read_ahead.pod" + ], + "doc/html/man3/SSL_CTX_set_record_padding_callback.html" => [ + "doc/man3/SSL_CTX_set_record_padding_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_security_level.html" => [ + "doc/man3/SSL_CTX_set_security_level.pod" + ], + "doc/html/man3/SSL_CTX_set_session_cache_mode.html" => [ + "doc/man3/SSL_CTX_set_session_cache_mode.pod" + ], + "doc/html/man3/SSL_CTX_set_session_id_context.html" => [ + "doc/man3/SSL_CTX_set_session_id_context.pod" + ], + "doc/html/man3/SSL_CTX_set_session_ticket_cb.html" => [ + "doc/man3/SSL_CTX_set_session_ticket_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_split_send_fragment.html" => [ + "doc/man3/SSL_CTX_set_split_send_fragment.pod" + ], + "doc/html/man3/SSL_CTX_set_srp_password.html" => [ + "doc/man3/SSL_CTX_set_srp_password.pod" + ], + "doc/html/man3/SSL_CTX_set_ssl_version.html" => [ + "doc/man3/SSL_CTX_set_ssl_version.pod" + ], + "doc/html/man3/SSL_CTX_set_stateless_cookie_generate_cb.html" => [ + "doc/man3/SSL_CTX_set_stateless_cookie_generate_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_timeout.html" => [ + "doc/man3/SSL_CTX_set_timeout.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_servername_callback.html" => [ + "doc/man3/SSL_CTX_set_tlsext_servername_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_status_cb.html" => [ + "doc/man3/SSL_CTX_set_tlsext_status_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_ticket_key_cb.html" => [ + "doc/man3/SSL_CTX_set_tlsext_ticket_key_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_use_srtp.html" => [ + "doc/man3/SSL_CTX_set_tlsext_use_srtp.pod" + ], + "doc/html/man3/SSL_CTX_set_tmp_dh_callback.html" => [ + "doc/man3/SSL_CTX_set_tmp_dh_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_tmp_ecdh.html" => [ + "doc/man3/SSL_CTX_set_tmp_ecdh.pod" + ], + "doc/html/man3/SSL_CTX_set_verify.html" => [ + "doc/man3/SSL_CTX_set_verify.pod" + ], + "doc/html/man3/SSL_CTX_use_certificate.html" => [ + "doc/man3/SSL_CTX_use_certificate.pod" + ], + "doc/html/man3/SSL_CTX_use_psk_identity_hint.html" => [ + "doc/man3/SSL_CTX_use_psk_identity_hint.pod" + ], + "doc/html/man3/SSL_CTX_use_serverinfo.html" => [ + "doc/man3/SSL_CTX_use_serverinfo.pod" + ], + "doc/html/man3/SSL_SESSION_free.html" => [ + "doc/man3/SSL_SESSION_free.pod" + ], + "doc/html/man3/SSL_SESSION_get0_cipher.html" => [ + "doc/man3/SSL_SESSION_get0_cipher.pod" + ], + "doc/html/man3/SSL_SESSION_get0_hostname.html" => [ + "doc/man3/SSL_SESSION_get0_hostname.pod" + ], + "doc/html/man3/SSL_SESSION_get0_id_context.html" => [ + "doc/man3/SSL_SESSION_get0_id_context.pod" + ], + "doc/html/man3/SSL_SESSION_get0_peer.html" => [ + "doc/man3/SSL_SESSION_get0_peer.pod" + ], + "doc/html/man3/SSL_SESSION_get_compress_id.html" => [ + "doc/man3/SSL_SESSION_get_compress_id.pod" + ], + "doc/html/man3/SSL_SESSION_get_protocol_version.html" => [ + "doc/man3/SSL_SESSION_get_protocol_version.pod" + ], + "doc/html/man3/SSL_SESSION_get_time.html" => [ + "doc/man3/SSL_SESSION_get_time.pod" + ], + "doc/html/man3/SSL_SESSION_has_ticket.html" => [ + "doc/man3/SSL_SESSION_has_ticket.pod" + ], + "doc/html/man3/SSL_SESSION_is_resumable.html" => [ + "doc/man3/SSL_SESSION_is_resumable.pod" + ], + "doc/html/man3/SSL_SESSION_print.html" => [ + "doc/man3/SSL_SESSION_print.pod" + ], + "doc/html/man3/SSL_SESSION_set1_id.html" => [ + "doc/man3/SSL_SESSION_set1_id.pod" + ], + "doc/html/man3/SSL_accept.html" => [ + "doc/man3/SSL_accept.pod" + ], + "doc/html/man3/SSL_accept_stream.html" => [ + "doc/man3/SSL_accept_stream.pod" + ], + "doc/html/man3/SSL_alert_type_string.html" => [ + "doc/man3/SSL_alert_type_string.pod" + ], + "doc/html/man3/SSL_alloc_buffers.html" => [ + "doc/man3/SSL_alloc_buffers.pod" + ], + "doc/html/man3/SSL_check_chain.html" => [ + "doc/man3/SSL_check_chain.pod" + ], + "doc/html/man3/SSL_clear.html" => [ + "doc/man3/SSL_clear.pod" + ], + "doc/html/man3/SSL_connect.html" => [ + "doc/man3/SSL_connect.pod" + ], + "doc/html/man3/SSL_do_handshake.html" => [ + "doc/man3/SSL_do_handshake.pod" + ], + "doc/html/man3/SSL_export_keying_material.html" => [ + "doc/man3/SSL_export_keying_material.pod" + ], + "doc/html/man3/SSL_extension_supported.html" => [ + "doc/man3/SSL_extension_supported.pod" + ], + "doc/html/man3/SSL_free.html" => [ + "doc/man3/SSL_free.pod" + ], + "doc/html/man3/SSL_get0_connection.html" => [ + "doc/man3/SSL_get0_connection.pod" + ], + "doc/html/man3/SSL_get0_group_name.html" => [ + "doc/man3/SSL_get0_group_name.pod" + ], + "doc/html/man3/SSL_get0_peer_rpk.html" => [ + "doc/man3/SSL_get0_peer_rpk.pod" + ], + "doc/html/man3/SSL_get0_peer_scts.html" => [ + "doc/man3/SSL_get0_peer_scts.pod" + ], + "doc/html/man3/SSL_get1_builtin_sigalgs.html" => [ + "doc/man3/SSL_get1_builtin_sigalgs.pod" + ], + "doc/html/man3/SSL_get_SSL_CTX.html" => [ + "doc/man3/SSL_get_SSL_CTX.pod" + ], + "doc/html/man3/SSL_get_all_async_fds.html" => [ + "doc/man3/SSL_get_all_async_fds.pod" + ], + "doc/html/man3/SSL_get_certificate.html" => [ + "doc/man3/SSL_get_certificate.pod" + ], + "doc/html/man3/SSL_get_ciphers.html" => [ + "doc/man3/SSL_get_ciphers.pod" + ], + "doc/html/man3/SSL_get_client_random.html" => [ + "doc/man3/SSL_get_client_random.pod" + ], + "doc/html/man3/SSL_get_conn_close_info.html" => [ + "doc/man3/SSL_get_conn_close_info.pod" + ], + "doc/html/man3/SSL_get_current_cipher.html" => [ + "doc/man3/SSL_get_current_cipher.pod" + ], + "doc/html/man3/SSL_get_default_timeout.html" => [ + "doc/man3/SSL_get_default_timeout.pod" + ], + "doc/html/man3/SSL_get_error.html" => [ + "doc/man3/SSL_get_error.pod" + ], + "doc/html/man3/SSL_get_event_timeout.html" => [ + "doc/man3/SSL_get_event_timeout.pod" + ], + "doc/html/man3/SSL_get_extms_support.html" => [ + "doc/man3/SSL_get_extms_support.pod" + ], + "doc/html/man3/SSL_get_fd.html" => [ + "doc/man3/SSL_get_fd.pod" + ], + "doc/html/man3/SSL_get_handshake_rtt.html" => [ + "doc/man3/SSL_get_handshake_rtt.pod" + ], + "doc/html/man3/SSL_get_peer_cert_chain.html" => [ + "doc/man3/SSL_get_peer_cert_chain.pod" + ], + "doc/html/man3/SSL_get_peer_certificate.html" => [ + "doc/man3/SSL_get_peer_certificate.pod" + ], + "doc/html/man3/SSL_get_peer_signature_nid.html" => [ + "doc/man3/SSL_get_peer_signature_nid.pod" + ], + "doc/html/man3/SSL_get_peer_tmp_key.html" => [ + "doc/man3/SSL_get_peer_tmp_key.pod" + ], + "doc/html/man3/SSL_get_psk_identity.html" => [ + "doc/man3/SSL_get_psk_identity.pod" + ], + "doc/html/man3/SSL_get_rbio.html" => [ + "doc/man3/SSL_get_rbio.pod" + ], + "doc/html/man3/SSL_get_rpoll_descriptor.html" => [ + "doc/man3/SSL_get_rpoll_descriptor.pod" + ], + "doc/html/man3/SSL_get_session.html" => [ + "doc/man3/SSL_get_session.pod" + ], + "doc/html/man3/SSL_get_shared_sigalgs.html" => [ + "doc/man3/SSL_get_shared_sigalgs.pod" + ], + "doc/html/man3/SSL_get_stream_id.html" => [ + "doc/man3/SSL_get_stream_id.pod" + ], + "doc/html/man3/SSL_get_stream_read_state.html" => [ + "doc/man3/SSL_get_stream_read_state.pod" + ], + "doc/html/man3/SSL_get_value_uint.html" => [ + "doc/man3/SSL_get_value_uint.pod" + ], + "doc/html/man3/SSL_get_verify_result.html" => [ + "doc/man3/SSL_get_verify_result.pod" + ], + "doc/html/man3/SSL_get_version.html" => [ + "doc/man3/SSL_get_version.pod" + ], + "doc/html/man3/SSL_group_to_name.html" => [ + "doc/man3/SSL_group_to_name.pod" + ], + "doc/html/man3/SSL_handle_events.html" => [ + "doc/man3/SSL_handle_events.pod" + ], + "doc/html/man3/SSL_in_init.html" => [ + "doc/man3/SSL_in_init.pod" + ], + "doc/html/man3/SSL_inject_net_dgram.html" => [ + "doc/man3/SSL_inject_net_dgram.pod" + ], + "doc/html/man3/SSL_key_update.html" => [ + "doc/man3/SSL_key_update.pod" + ], + "doc/html/man3/SSL_library_init.html" => [ + "doc/man3/SSL_library_init.pod" + ], + "doc/html/man3/SSL_load_client_CA_file.html" => [ + "doc/man3/SSL_load_client_CA_file.pod" + ], + "doc/html/man3/SSL_new.html" => [ + "doc/man3/SSL_new.pod" + ], + "doc/html/man3/SSL_new_domain.html" => [ + "doc/man3/SSL_new_domain.pod" + ], + "doc/html/man3/SSL_new_listener.html" => [ + "doc/man3/SSL_new_listener.pod" + ], + "doc/html/man3/SSL_new_stream.html" => [ + "doc/man3/SSL_new_stream.pod" + ], + "doc/html/man3/SSL_pending.html" => [ + "doc/man3/SSL_pending.pod" + ], + "doc/html/man3/SSL_poll.html" => [ + "doc/man3/SSL_poll.pod" + ], + "doc/html/man3/SSL_read.html" => [ + "doc/man3/SSL_read.pod" + ], + "doc/html/man3/SSL_read_early_data.html" => [ + "doc/man3/SSL_read_early_data.pod" + ], + "doc/html/man3/SSL_rstate_string.html" => [ + "doc/man3/SSL_rstate_string.pod" + ], + "doc/html/man3/SSL_session_reused.html" => [ + "doc/man3/SSL_session_reused.pod" + ], + "doc/html/man3/SSL_set1_host.html" => [ + "doc/man3/SSL_set1_host.pod" + ], + "doc/html/man3/SSL_set1_initial_peer_addr.html" => [ + "doc/man3/SSL_set1_initial_peer_addr.pod" + ], + "doc/html/man3/SSL_set1_server_cert_type.html" => [ + "doc/man3/SSL_set1_server_cert_type.pod" + ], + "doc/html/man3/SSL_set_async_callback.html" => [ + "doc/man3/SSL_set_async_callback.pod" + ], + "doc/html/man3/SSL_set_bio.html" => [ + "doc/man3/SSL_set_bio.pod" + ], + "doc/html/man3/SSL_set_blocking_mode.html" => [ + "doc/man3/SSL_set_blocking_mode.pod" + ], + "doc/html/man3/SSL_set_connect_state.html" => [ + "doc/man3/SSL_set_connect_state.pod" + ], + "doc/html/man3/SSL_set_default_stream_mode.html" => [ + "doc/man3/SSL_set_default_stream_mode.pod" + ], + "doc/html/man3/SSL_set_fd.html" => [ + "doc/man3/SSL_set_fd.pod" + ], + "doc/html/man3/SSL_set_incoming_stream_policy.html" => [ + "doc/man3/SSL_set_incoming_stream_policy.pod" + ], + "doc/html/man3/SSL_set_quic_tls_cbs.html" => [ + "doc/man3/SSL_set_quic_tls_cbs.pod" + ], + "doc/html/man3/SSL_set_retry_verify.html" => [ + "doc/man3/SSL_set_retry_verify.pod" + ], + "doc/html/man3/SSL_set_session.html" => [ + "doc/man3/SSL_set_session.pod" + ], + "doc/html/man3/SSL_set_session_secret_cb.html" => [ + "doc/man3/SSL_set_session_secret_cb.pod" + ], + "doc/html/man3/SSL_set_shutdown.html" => [ + "doc/man3/SSL_set_shutdown.pod" + ], + "doc/html/man3/SSL_set_verify_result.html" => [ + "doc/man3/SSL_set_verify_result.pod" + ], + "doc/html/man3/SSL_shutdown.html" => [ + "doc/man3/SSL_shutdown.pod" + ], + "doc/html/man3/SSL_state_string.html" => [ + "doc/man3/SSL_state_string.pod" + ], + "doc/html/man3/SSL_stream_conclude.html" => [ + "doc/man3/SSL_stream_conclude.pod" + ], + "doc/html/man3/SSL_stream_reset.html" => [ + "doc/man3/SSL_stream_reset.pod" + ], + "doc/html/man3/SSL_want.html" => [ + "doc/man3/SSL_want.pod" + ], + "doc/html/man3/SSL_write.html" => [ + "doc/man3/SSL_write.pod" + ], + "doc/html/man3/TS_RESP_CTX_new.html" => [ + "doc/man3/TS_RESP_CTX_new.pod" + ], + "doc/html/man3/TS_VERIFY_CTX.html" => [ + "doc/man3/TS_VERIFY_CTX.pod" + ], + "doc/html/man3/UI_STRING.html" => [ + "doc/man3/UI_STRING.pod" + ], + "doc/html/man3/UI_UTIL_read_pw.html" => [ + "doc/man3/UI_UTIL_read_pw.pod" + ], + "doc/html/man3/UI_create_method.html" => [ + "doc/man3/UI_create_method.pod" + ], + "doc/html/man3/UI_new.html" => [ + "doc/man3/UI_new.pod" + ], + "doc/html/man3/X509V3_EXT_print.html" => [ + "doc/man3/X509V3_EXT_print.pod" + ], + "doc/html/man3/X509V3_get_d2i.html" => [ + "doc/man3/X509V3_get_d2i.pod" + ], + "doc/html/man3/X509V3_set_ctx.html" => [ + "doc/man3/X509V3_set_ctx.pod" + ], + "doc/html/man3/X509_ACERT_add1_attr.html" => [ + "doc/man3/X509_ACERT_add1_attr.pod" + ], + "doc/html/man3/X509_ACERT_add_attr_nconf.html" => [ + "doc/man3/X509_ACERT_add_attr_nconf.pod" + ], + "doc/html/man3/X509_ACERT_get0_holder_baseCertId.html" => [ + "doc/man3/X509_ACERT_get0_holder_baseCertId.pod" + ], + "doc/html/man3/X509_ACERT_get_attr.html" => [ + "doc/man3/X509_ACERT_get_attr.pod" + ], + "doc/html/man3/X509_ACERT_print_ex.html" => [ + "doc/man3/X509_ACERT_print_ex.pod" + ], + "doc/html/man3/X509_ALGOR_dup.html" => [ + "doc/man3/X509_ALGOR_dup.pod" + ], + "doc/html/man3/X509_ATTRIBUTE.html" => [ + "doc/man3/X509_ATTRIBUTE.pod" + ], + "doc/html/man3/X509_CRL_get0_by_serial.html" => [ + "doc/man3/X509_CRL_get0_by_serial.pod" + ], + "doc/html/man3/X509_EXTENSION_set_object.html" => [ + "doc/man3/X509_EXTENSION_set_object.pod" + ], + "doc/html/man3/X509_LOOKUP.html" => [ + "doc/man3/X509_LOOKUP.pod" + ], + "doc/html/man3/X509_LOOKUP_hash_dir.html" => [ + "doc/man3/X509_LOOKUP_hash_dir.pod" + ], + "doc/html/man3/X509_LOOKUP_meth_new.html" => [ + "doc/man3/X509_LOOKUP_meth_new.pod" + ], + "doc/html/man3/X509_NAME_ENTRY_get_object.html" => [ + "doc/man3/X509_NAME_ENTRY_get_object.pod" + ], + "doc/html/man3/X509_NAME_add_entry_by_txt.html" => [ + "doc/man3/X509_NAME_add_entry_by_txt.pod" + ], + "doc/html/man3/X509_NAME_get0_der.html" => [ + "doc/man3/X509_NAME_get0_der.pod" + ], + "doc/html/man3/X509_NAME_get_index_by_NID.html" => [ + "doc/man3/X509_NAME_get_index_by_NID.pod" + ], + "doc/html/man3/X509_NAME_print_ex.html" => [ + "doc/man3/X509_NAME_print_ex.pod" + ], + "doc/html/man3/X509_PUBKEY_new.html" => [ + "doc/man3/X509_PUBKEY_new.pod" + ], + "doc/html/man3/X509_REQ_get_attr.html" => [ + "doc/man3/X509_REQ_get_attr.pod" + ], + "doc/html/man3/X509_REQ_get_extensions.html" => [ + "doc/man3/X509_REQ_get_extensions.pod" + ], + "doc/html/man3/X509_SIG_get0.html" => [ + "doc/man3/X509_SIG_get0.pod" + ], + "doc/html/man3/X509_STORE_CTX_get_by_subject.html" => [ + "doc/man3/X509_STORE_CTX_get_by_subject.pod" + ], + "doc/html/man3/X509_STORE_CTX_get_error.html" => [ + "doc/man3/X509_STORE_CTX_get_error.pod" + ], + "doc/html/man3/X509_STORE_CTX_new.html" => [ + "doc/man3/X509_STORE_CTX_new.pod" + ], + "doc/html/man3/X509_STORE_CTX_set_verify_cb.html" => [ + "doc/man3/X509_STORE_CTX_set_verify_cb.pod" + ], + "doc/html/man3/X509_STORE_add_cert.html" => [ + "doc/man3/X509_STORE_add_cert.pod" + ], + "doc/html/man3/X509_STORE_get0_param.html" => [ + "doc/man3/X509_STORE_get0_param.pod" + ], + "doc/html/man3/X509_STORE_new.html" => [ + "doc/man3/X509_STORE_new.pod" + ], + "doc/html/man3/X509_STORE_set_verify_cb_func.html" => [ + "doc/man3/X509_STORE_set_verify_cb_func.pod" + ], + "doc/html/man3/X509_VERIFY_PARAM_set_flags.html" => [ + "doc/man3/X509_VERIFY_PARAM_set_flags.pod" + ], + "doc/html/man3/X509_add_cert.html" => [ + "doc/man3/X509_add_cert.pod" + ], + "doc/html/man3/X509_check_ca.html" => [ + "doc/man3/X509_check_ca.pod" + ], + "doc/html/man3/X509_check_host.html" => [ + "doc/man3/X509_check_host.pod" + ], + "doc/html/man3/X509_check_issued.html" => [ + "doc/man3/X509_check_issued.pod" + ], + "doc/html/man3/X509_check_private_key.html" => [ + "doc/man3/X509_check_private_key.pod" + ], + "doc/html/man3/X509_check_purpose.html" => [ + "doc/man3/X509_check_purpose.pod" + ], + "doc/html/man3/X509_cmp.html" => [ + "doc/man3/X509_cmp.pod" + ], + "doc/html/man3/X509_cmp_time.html" => [ + "doc/man3/X509_cmp_time.pod" + ], + "doc/html/man3/X509_digest.html" => [ + "doc/man3/X509_digest.pod" + ], + "doc/html/man3/X509_dup.html" => [ + "doc/man3/X509_dup.pod" + ], + "doc/html/man3/X509_get0_distinguishing_id.html" => [ + "doc/man3/X509_get0_distinguishing_id.pod" + ], + "doc/html/man3/X509_get0_notBefore.html" => [ + "doc/man3/X509_get0_notBefore.pod" + ], + "doc/html/man3/X509_get0_signature.html" => [ + "doc/man3/X509_get0_signature.pod" + ], + "doc/html/man3/X509_get0_uids.html" => [ + "doc/man3/X509_get0_uids.pod" + ], + "doc/html/man3/X509_get_default_cert_file.html" => [ + "doc/man3/X509_get_default_cert_file.pod" + ], + "doc/html/man3/X509_get_extension_flags.html" => [ + "doc/man3/X509_get_extension_flags.pod" + ], + "doc/html/man3/X509_get_pubkey.html" => [ + "doc/man3/X509_get_pubkey.pod" + ], + "doc/html/man3/X509_get_serialNumber.html" => [ + "doc/man3/X509_get_serialNumber.pod" + ], + "doc/html/man3/X509_get_subject_name.html" => [ + "doc/man3/X509_get_subject_name.pod" + ], + "doc/html/man3/X509_get_version.html" => [ + "doc/man3/X509_get_version.pod" + ], + "doc/html/man3/X509_load_http.html" => [ + "doc/man3/X509_load_http.pod" + ], + "doc/html/man3/X509_new.html" => [ + "doc/man3/X509_new.pod" + ], + "doc/html/man3/X509_sign.html" => [ + "doc/man3/X509_sign.pod" + ], + "doc/html/man3/X509_verify.html" => [ + "doc/man3/X509_verify.pod" + ], + "doc/html/man3/X509_verify_cert.html" => [ + "doc/man3/X509_verify_cert.pod" + ], + "doc/html/man3/X509v3_get_ext_by_NID.html" => [ + "doc/man3/X509v3_get_ext_by_NID.pod" + ], + "doc/html/man3/b2i_PVK_bio_ex.html" => [ + "doc/man3/b2i_PVK_bio_ex.pod" + ], + "doc/html/man3/d2i_PKCS8PrivateKey_bio.html" => [ + "doc/man3/d2i_PKCS8PrivateKey_bio.pod" + ], + "doc/html/man3/d2i_PrivateKey.html" => [ + "doc/man3/d2i_PrivateKey.pod" + ], + "doc/html/man3/d2i_RSAPrivateKey.html" => [ + "doc/man3/d2i_RSAPrivateKey.pod" + ], + "doc/html/man3/d2i_SSL_SESSION.html" => [ + "doc/man3/d2i_SSL_SESSION.pod" + ], + "doc/html/man3/d2i_X509.html" => [ + "doc/man3/d2i_X509.pod" + ], + "doc/html/man3/i2d_CMS_bio_stream.html" => [ + "doc/man3/i2d_CMS_bio_stream.pod" + ], + "doc/html/man3/i2d_PKCS7_bio_stream.html" => [ + "doc/man3/i2d_PKCS7_bio_stream.pod" + ], + "doc/html/man3/i2d_re_X509_tbs.html" => [ + "doc/man3/i2d_re_X509_tbs.pod" + ], + "doc/html/man3/o2i_SCT_LIST.html" => [ + "doc/man3/o2i_SCT_LIST.pod" + ], + "doc/html/man3/s2i_ASN1_IA5STRING.html" => [ + "doc/man3/s2i_ASN1_IA5STRING.pod" + ], + "doc/html/man5/config.html" => [ + "doc/man5/config.pod" + ], + "doc/html/man5/fips_config.html" => [ + "doc/man5/fips_config.pod" + ], + "doc/html/man5/x509v3_config.html" => [ + "doc/man5/x509v3_config.pod" + ], + "doc/html/man7/EVP_ASYM_CIPHER-RSA.html" => [ + "doc/man7/EVP_ASYM_CIPHER-RSA.pod" + ], + "doc/html/man7/EVP_ASYM_CIPHER-SM2.html" => [ + "doc/man7/EVP_ASYM_CIPHER-SM2.pod" + ], + "doc/html/man7/EVP_CIPHER-AES.html" => [ + "doc/man7/EVP_CIPHER-AES.pod" + ], + "doc/html/man7/EVP_CIPHER-ARIA.html" => [ + "doc/man7/EVP_CIPHER-ARIA.pod" + ], + "doc/html/man7/EVP_CIPHER-BLOWFISH.html" => [ + "doc/man7/EVP_CIPHER-BLOWFISH.pod" + ], + "doc/html/man7/EVP_CIPHER-CAMELLIA.html" => [ + "doc/man7/EVP_CIPHER-CAMELLIA.pod" + ], + "doc/html/man7/EVP_CIPHER-CAST.html" => [ + "doc/man7/EVP_CIPHER-CAST.pod" + ], + "doc/html/man7/EVP_CIPHER-CHACHA.html" => [ + "doc/man7/EVP_CIPHER-CHACHA.pod" + ], + "doc/html/man7/EVP_CIPHER-DES.html" => [ + "doc/man7/EVP_CIPHER-DES.pod" + ], + "doc/html/man7/EVP_CIPHER-IDEA.html" => [ + "doc/man7/EVP_CIPHER-IDEA.pod" + ], + "doc/html/man7/EVP_CIPHER-NULL.html" => [ + "doc/man7/EVP_CIPHER-NULL.pod" + ], + "doc/html/man7/EVP_CIPHER-RC2.html" => [ + "doc/man7/EVP_CIPHER-RC2.pod" + ], + "doc/html/man7/EVP_CIPHER-RC4.html" => [ + "doc/man7/EVP_CIPHER-RC4.pod" + ], + "doc/html/man7/EVP_CIPHER-RC5.html" => [ + "doc/man7/EVP_CIPHER-RC5.pod" + ], + "doc/html/man7/EVP_CIPHER-SEED.html" => [ + "doc/man7/EVP_CIPHER-SEED.pod" + ], + "doc/html/man7/EVP_CIPHER-SM4.html" => [ + "doc/man7/EVP_CIPHER-SM4.pod" + ], + "doc/html/man7/EVP_KDF-ARGON2.html" => [ + "doc/man7/EVP_KDF-ARGON2.pod" + ], + "doc/html/man7/EVP_KDF-HKDF.html" => [ + "doc/man7/EVP_KDF-HKDF.pod" + ], + "doc/html/man7/EVP_KDF-HMAC-DRBG.html" => [ + "doc/man7/EVP_KDF-HMAC-DRBG.pod" + ], + "doc/html/man7/EVP_KDF-KB.html" => [ + "doc/man7/EVP_KDF-KB.pod" + ], + "doc/html/man7/EVP_KDF-KRB5KDF.html" => [ + "doc/man7/EVP_KDF-KRB5KDF.pod" + ], + "doc/html/man7/EVP_KDF-PBKDF1.html" => [ + "doc/man7/EVP_KDF-PBKDF1.pod" + ], + "doc/html/man7/EVP_KDF-PBKDF2.html" => [ + "doc/man7/EVP_KDF-PBKDF2.pod" + ], + "doc/html/man7/EVP_KDF-PKCS12KDF.html" => [ + "doc/man7/EVP_KDF-PKCS12KDF.pod" + ], + "doc/html/man7/EVP_KDF-PVKKDF.html" => [ + "doc/man7/EVP_KDF-PVKKDF.pod" + ], + "doc/html/man7/EVP_KDF-SCRYPT.html" => [ + "doc/man7/EVP_KDF-SCRYPT.pod" + ], + "doc/html/man7/EVP_KDF-SS.html" => [ + "doc/man7/EVP_KDF-SS.pod" + ], + "doc/html/man7/EVP_KDF-SSHKDF.html" => [ + "doc/man7/EVP_KDF-SSHKDF.pod" + ], + "doc/html/man7/EVP_KDF-TLS13_KDF.html" => [ + "doc/man7/EVP_KDF-TLS13_KDF.pod" + ], + "doc/html/man7/EVP_KDF-TLS1_PRF.html" => [ + "doc/man7/EVP_KDF-TLS1_PRF.pod" + ], + "doc/html/man7/EVP_KDF-X942-ASN1.html" => [ + "doc/man7/EVP_KDF-X942-ASN1.pod" + ], + "doc/html/man7/EVP_KDF-X942-CONCAT.html" => [ + "doc/man7/EVP_KDF-X942-CONCAT.pod" + ], + "doc/html/man7/EVP_KDF-X963.html" => [ + "doc/man7/EVP_KDF-X963.pod" + ], + "doc/html/man7/EVP_KEM-EC.html" => [ + "doc/man7/EVP_KEM-EC.pod" + ], + "doc/html/man7/EVP_KEM-ML-KEM.html" => [ + "doc/man7/EVP_KEM-ML-KEM.pod" + ], + "doc/html/man7/EVP_KEM-RSA.html" => [ + "doc/man7/EVP_KEM-RSA.pod" + ], + "doc/html/man7/EVP_KEM-X25519.html" => [ + "doc/man7/EVP_KEM-X25519.pod" + ], + "doc/html/man7/EVP_KEYEXCH-DH.html" => [ + "doc/man7/EVP_KEYEXCH-DH.pod" + ], + "doc/html/man7/EVP_KEYEXCH-ECDH.html" => [ + "doc/man7/EVP_KEYEXCH-ECDH.pod" + ], + "doc/html/man7/EVP_KEYEXCH-X25519.html" => [ + "doc/man7/EVP_KEYEXCH-X25519.pod" + ], + "doc/html/man7/EVP_MAC-BLAKE2.html" => [ + "doc/man7/EVP_MAC-BLAKE2.pod" + ], + "doc/html/man7/EVP_MAC-CMAC.html" => [ + "doc/man7/EVP_MAC-CMAC.pod" + ], + "doc/html/man7/EVP_MAC-GMAC.html" => [ + "doc/man7/EVP_MAC-GMAC.pod" + ], + "doc/html/man7/EVP_MAC-HMAC.html" => [ + "doc/man7/EVP_MAC-HMAC.pod" + ], + "doc/html/man7/EVP_MAC-KMAC.html" => [ + "doc/man7/EVP_MAC-KMAC.pod" + ], + "doc/html/man7/EVP_MAC-Poly1305.html" => [ + "doc/man7/EVP_MAC-Poly1305.pod" + ], + "doc/html/man7/EVP_MAC-Siphash.html" => [ + "doc/man7/EVP_MAC-Siphash.pod" + ], + "doc/html/man7/EVP_MD-BLAKE2.html" => [ + "doc/man7/EVP_MD-BLAKE2.pod" + ], + "doc/html/man7/EVP_MD-KECCAK.html" => [ + "doc/man7/EVP_MD-KECCAK.pod" + ], + "doc/html/man7/EVP_MD-MD2.html" => [ + "doc/man7/EVP_MD-MD2.pod" + ], + "doc/html/man7/EVP_MD-MD4.html" => [ + "doc/man7/EVP_MD-MD4.pod" + ], + "doc/html/man7/EVP_MD-MD5-SHA1.html" => [ + "doc/man7/EVP_MD-MD5-SHA1.pod" + ], + "doc/html/man7/EVP_MD-MD5.html" => [ + "doc/man7/EVP_MD-MD5.pod" + ], + "doc/html/man7/EVP_MD-MDC2.html" => [ + "doc/man7/EVP_MD-MDC2.pod" + ], + "doc/html/man7/EVP_MD-NULL.html" => [ + "doc/man7/EVP_MD-NULL.pod" + ], + "doc/html/man7/EVP_MD-RIPEMD160.html" => [ + "doc/man7/EVP_MD-RIPEMD160.pod" + ], + "doc/html/man7/EVP_MD-SHA1.html" => [ + "doc/man7/EVP_MD-SHA1.pod" + ], + "doc/html/man7/EVP_MD-SHA2.html" => [ + "doc/man7/EVP_MD-SHA2.pod" + ], + "doc/html/man7/EVP_MD-SHA3.html" => [ + "doc/man7/EVP_MD-SHA3.pod" + ], + "doc/html/man7/EVP_MD-SHAKE.html" => [ + "doc/man7/EVP_MD-SHAKE.pod" + ], + "doc/html/man7/EVP_MD-SM3.html" => [ + "doc/man7/EVP_MD-SM3.pod" + ], + "doc/html/man7/EVP_MD-WHIRLPOOL.html" => [ + "doc/man7/EVP_MD-WHIRLPOOL.pod" + ], + "doc/html/man7/EVP_MD-common.html" => [ + "doc/man7/EVP_MD-common.pod" + ], + "doc/html/man7/EVP_PKEY-DH.html" => [ + "doc/man7/EVP_PKEY-DH.pod" + ], + "doc/html/man7/EVP_PKEY-DSA.html" => [ + "doc/man7/EVP_PKEY-DSA.pod" + ], + "doc/html/man7/EVP_PKEY-EC.html" => [ + "doc/man7/EVP_PKEY-EC.pod" + ], + "doc/html/man7/EVP_PKEY-FFC.html" => [ + "doc/man7/EVP_PKEY-FFC.pod" + ], + "doc/html/man7/EVP_PKEY-HMAC.html" => [ + "doc/man7/EVP_PKEY-HMAC.pod" + ], + "doc/html/man7/EVP_PKEY-ML-DSA.html" => [ + "doc/man7/EVP_PKEY-ML-DSA.pod" + ], + "doc/html/man7/EVP_PKEY-ML-KEM.html" => [ + "doc/man7/EVP_PKEY-ML-KEM.pod" + ], + "doc/html/man7/EVP_PKEY-RSA.html" => [ + "doc/man7/EVP_PKEY-RSA.pod" + ], + "doc/html/man7/EVP_PKEY-SLH-DSA.html" => [ + "doc/man7/EVP_PKEY-SLH-DSA.pod" + ], + "doc/html/man7/EVP_PKEY-SM2.html" => [ + "doc/man7/EVP_PKEY-SM2.pod" + ], + "doc/html/man7/EVP_PKEY-X25519.html" => [ + "doc/man7/EVP_PKEY-X25519.pod" + ], + "doc/html/man7/EVP_RAND-CRNG-TEST.html" => [ + "doc/man7/EVP_RAND-CRNG-TEST.pod" + ], + "doc/html/man7/EVP_RAND-CTR-DRBG.html" => [ + "doc/man7/EVP_RAND-CTR-DRBG.pod" + ], + "doc/html/man7/EVP_RAND-HASH-DRBG.html" => [ + "doc/man7/EVP_RAND-HASH-DRBG.pod" + ], + "doc/html/man7/EVP_RAND-HMAC-DRBG.html" => [ + "doc/man7/EVP_RAND-HMAC-DRBG.pod" + ], + "doc/html/man7/EVP_RAND-JITTER.html" => [ + "doc/man7/EVP_RAND-JITTER.pod" + ], + "doc/html/man7/EVP_RAND-SEED-SRC.html" => [ + "doc/man7/EVP_RAND-SEED-SRC.pod" + ], + "doc/html/man7/EVP_RAND-TEST-RAND.html" => [ + "doc/man7/EVP_RAND-TEST-RAND.pod" + ], + "doc/html/man7/EVP_RAND.html" => [ + "doc/man7/EVP_RAND.pod" + ], + "doc/html/man7/EVP_SIGNATURE-DSA.html" => [ + "doc/man7/EVP_SIGNATURE-DSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-ECDSA.html" => [ + "doc/man7/EVP_SIGNATURE-ECDSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-ED25519.html" => [ + "doc/man7/EVP_SIGNATURE-ED25519.pod" + ], + "doc/html/man7/EVP_SIGNATURE-HMAC.html" => [ + "doc/man7/EVP_SIGNATURE-HMAC.pod" + ], + "doc/html/man7/EVP_SIGNATURE-ML-DSA.html" => [ + "doc/man7/EVP_SIGNATURE-ML-DSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-RSA.html" => [ + "doc/man7/EVP_SIGNATURE-RSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-SLH-DSA.html" => [ + "doc/man7/EVP_SIGNATURE-SLH-DSA.pod" + ], + "doc/html/man7/OSSL_PROVIDER-FIPS.html" => [ + "doc/man7/OSSL_PROVIDER-FIPS.pod" + ], + "doc/html/man7/OSSL_PROVIDER-base.html" => [ + "doc/man7/OSSL_PROVIDER-base.pod" + ], + "doc/html/man7/OSSL_PROVIDER-default.html" => [ + "doc/man7/OSSL_PROVIDER-default.pod" + ], + "doc/html/man7/OSSL_PROVIDER-legacy.html" => [ + "doc/man7/OSSL_PROVIDER-legacy.pod" + ], + "doc/html/man7/OSSL_PROVIDER-null.html" => [ + "doc/man7/OSSL_PROVIDER-null.pod" + ], + "doc/html/man7/OSSL_STORE-winstore.html" => [ + "doc/man7/OSSL_STORE-winstore.pod" + ], + "doc/html/man7/RAND.html" => [ + "doc/man7/RAND.pod" + ], + "doc/html/man7/RSA-PSS.html" => [ + "doc/man7/RSA-PSS.pod" + ], + "doc/html/man7/X25519.html" => [ + "doc/man7/X25519.pod" + ], + "doc/html/man7/bio.html" => [ + "doc/man7/bio.pod" + ], + "doc/html/man7/ct.html" => [ + "doc/man7/ct.pod" + ], + "doc/html/man7/des_modes.html" => [ + "doc/man7/des_modes.pod" + ], + "doc/html/man7/evp.html" => [ + "doc/man7/evp.pod" + ], + "doc/html/man7/fips_module.html" => [ + "doc/man7/fips_module.pod" + ], + "doc/html/man7/life_cycle-cipher.html" => [ + "doc/man7/life_cycle-cipher.pod" + ], + "doc/html/man7/life_cycle-digest.html" => [ + "doc/man7/life_cycle-digest.pod" + ], + "doc/html/man7/life_cycle-kdf.html" => [ + "doc/man7/life_cycle-kdf.pod" + ], + "doc/html/man7/life_cycle-mac.html" => [ + "doc/man7/life_cycle-mac.pod" + ], + "doc/html/man7/life_cycle-pkey.html" => [ + "doc/man7/life_cycle-pkey.pod" + ], + "doc/html/man7/life_cycle-rand.html" => [ + "doc/man7/life_cycle-rand.pod" + ], + "doc/html/man7/openssl-core.h.html" => [ + "doc/man7/openssl-core.h.pod" + ], + "doc/html/man7/openssl-core_dispatch.h.html" => [ + "doc/man7/openssl-core_dispatch.h.pod" + ], + "doc/html/man7/openssl-core_names.h.html" => [ + "doc/man7/openssl-core_names.h.pod" + ], + "doc/html/man7/openssl-env.html" => [ + "doc/man7/openssl-env.pod" + ], + "doc/html/man7/openssl-glossary.html" => [ + "doc/man7/openssl-glossary.pod" + ], + "doc/html/man7/openssl-qlog.html" => [ + "doc/man7/openssl-qlog.pod" + ], + "doc/html/man7/openssl-quic-concurrency.html" => [ + "doc/man7/openssl-quic-concurrency.pod" + ], + "doc/html/man7/openssl-quic.html" => [ + "doc/man7/openssl-quic.pod" + ], + "doc/html/man7/openssl-threads.html" => [ + "doc/man7/openssl-threads.pod" + ], + "doc/html/man7/openssl_user_macros.html" => [ + "doc/man7/openssl_user_macros.pod" + ], + "doc/html/man7/ossl-guide-introduction.html" => [ + "doc/man7/ossl-guide-introduction.pod" + ], + "doc/html/man7/ossl-guide-libcrypto-introduction.html" => [ + "doc/man7/ossl-guide-libcrypto-introduction.pod" + ], + "doc/html/man7/ossl-guide-libraries-introduction.html" => [ + "doc/man7/ossl-guide-libraries-introduction.pod" + ], + "doc/html/man7/ossl-guide-libssl-introduction.html" => [ + "doc/man7/ossl-guide-libssl-introduction.pod" + ], + "doc/html/man7/ossl-guide-migration.html" => [ + "doc/man7/ossl-guide-migration.pod" + ], + "doc/html/man7/ossl-guide-quic-client-block.html" => [ + "doc/man7/ossl-guide-quic-client-block.pod" + ], + "doc/html/man7/ossl-guide-quic-client-non-block.html" => [ + "doc/man7/ossl-guide-quic-client-non-block.pod" + ], + "doc/html/man7/ossl-guide-quic-introduction.html" => [ + "doc/man7/ossl-guide-quic-introduction.pod" + ], + "doc/html/man7/ossl-guide-quic-multi-stream.html" => [ + "doc/man7/ossl-guide-quic-multi-stream.pod" + ], + "doc/html/man7/ossl-guide-quic-server-block.html" => [ + "doc/man7/ossl-guide-quic-server-block.pod" + ], + "doc/html/man7/ossl-guide-quic-server-non-block.html" => [ + "doc/man7/ossl-guide-quic-server-non-block.pod" + ], + "doc/html/man7/ossl-guide-tls-client-block.html" => [ + "doc/man7/ossl-guide-tls-client-block.pod" + ], + "doc/html/man7/ossl-guide-tls-client-non-block.html" => [ + "doc/man7/ossl-guide-tls-client-non-block.pod" + ], + "doc/html/man7/ossl-guide-tls-introduction.html" => [ + "doc/man7/ossl-guide-tls-introduction.pod" + ], + "doc/html/man7/ossl-guide-tls-server-block.html" => [ + "doc/man7/ossl-guide-tls-server-block.pod" + ], + "doc/html/man7/ossl_store-file.html" => [ + "doc/man7/ossl_store-file.pod" + ], + "doc/html/man7/ossl_store.html" => [ + "doc/man7/ossl_store.pod" + ], + "doc/html/man7/passphrase-encoding.html" => [ + "doc/man7/passphrase-encoding.pod" + ], + "doc/html/man7/property.html" => [ + "doc/man7/property.pod" + ], + "doc/html/man7/provider-asym_cipher.html" => [ + "doc/man7/provider-asym_cipher.pod" + ], + "doc/html/man7/provider-base.html" => [ + "doc/man7/provider-base.pod" + ], + "doc/html/man7/provider-cipher.html" => [ + "doc/man7/provider-cipher.pod" + ], + "doc/html/man7/provider-decoder.html" => [ + "doc/man7/provider-decoder.pod" + ], + "doc/html/man7/provider-digest.html" => [ + "doc/man7/provider-digest.pod" + ], + "doc/html/man7/provider-encoder.html" => [ + "doc/man7/provider-encoder.pod" + ], + "doc/html/man7/provider-kdf.html" => [ + "doc/man7/provider-kdf.pod" + ], + "doc/html/man7/provider-kem.html" => [ + "doc/man7/provider-kem.pod" + ], + "doc/html/man7/provider-keyexch.html" => [ + "doc/man7/provider-keyexch.pod" + ], + "doc/html/man7/provider-keymgmt.html" => [ + "doc/man7/provider-keymgmt.pod" + ], + "doc/html/man7/provider-mac.html" => [ + "doc/man7/provider-mac.pod" + ], + "doc/html/man7/provider-object.html" => [ + "doc/man7/provider-object.pod" + ], + "doc/html/man7/provider-rand.html" => [ + "doc/man7/provider-rand.pod" + ], + "doc/html/man7/provider-signature.html" => [ + "doc/man7/provider-signature.pod" + ], + "doc/html/man7/provider-skeymgmt.html" => [ + "doc/man7/provider-skeymgmt.pod" + ], + "doc/html/man7/provider-storemgmt.html" => [ + "doc/man7/provider-storemgmt.pod" + ], + "doc/html/man7/provider.html" => [ + "doc/man7/provider.pod" + ], + "doc/html/man7/proxy-certificates.html" => [ + "doc/man7/proxy-certificates.pod" + ], + "doc/html/man7/x509.html" => [ + "doc/man7/x509.pod" + ], + "doc/man/man1/CA.pl.1" => [ + "doc/man1/CA.pl.pod" + ], + "doc/man/man1/openssl-asn1parse.1" => [ + "doc/man1/openssl-asn1parse.pod" + ], + "doc/man/man1/openssl-ca.1" => [ + "doc/man1/openssl-ca.pod" + ], + "doc/man/man1/openssl-ciphers.1" => [ + "doc/man1/openssl-ciphers.pod" + ], + "doc/man/man1/openssl-cmds.1" => [ + "doc/man1/openssl-cmds.pod" + ], + "doc/man/man1/openssl-cmp.1" => [ + "doc/man1/openssl-cmp.pod" + ], + "doc/man/man1/openssl-cms.1" => [ + "doc/man1/openssl-cms.pod" + ], + "doc/man/man1/openssl-crl.1" => [ + "doc/man1/openssl-crl.pod" + ], + "doc/man/man1/openssl-crl2pkcs7.1" => [ + "doc/man1/openssl-crl2pkcs7.pod" + ], + "doc/man/man1/openssl-dgst.1" => [ + "doc/man1/openssl-dgst.pod" + ], + "doc/man/man1/openssl-dhparam.1" => [ + "doc/man1/openssl-dhparam.pod" + ], + "doc/man/man1/openssl-dsa.1" => [ + "doc/man1/openssl-dsa.pod" + ], + "doc/man/man1/openssl-dsaparam.1" => [ + "doc/man1/openssl-dsaparam.pod" + ], + "doc/man/man1/openssl-ec.1" => [ + "doc/man1/openssl-ec.pod" + ], + "doc/man/man1/openssl-ecparam.1" => [ + "doc/man1/openssl-ecparam.pod" + ], + "doc/man/man1/openssl-enc.1" => [ + "doc/man1/openssl-enc.pod" + ], + "doc/man/man1/openssl-engine.1" => [ + "doc/man1/openssl-engine.pod" + ], + "doc/man/man1/openssl-errstr.1" => [ + "doc/man1/openssl-errstr.pod" + ], + "doc/man/man1/openssl-fipsinstall.1" => [ + "doc/man1/openssl-fipsinstall.pod" + ], + "doc/man/man1/openssl-format-options.1" => [ + "doc/man1/openssl-format-options.pod" + ], + "doc/man/man1/openssl-gendsa.1" => [ + "doc/man1/openssl-gendsa.pod" + ], + "doc/man/man1/openssl-genpkey.1" => [ + "doc/man1/openssl-genpkey.pod" + ], + "doc/man/man1/openssl-genrsa.1" => [ + "doc/man1/openssl-genrsa.pod" + ], + "doc/man/man1/openssl-info.1" => [ + "doc/man1/openssl-info.pod" + ], + "doc/man/man1/openssl-kdf.1" => [ + "doc/man1/openssl-kdf.pod" + ], + "doc/man/man1/openssl-list.1" => [ + "doc/man1/openssl-list.pod" + ], + "doc/man/man1/openssl-mac.1" => [ + "doc/man1/openssl-mac.pod" + ], + "doc/man/man1/openssl-namedisplay-options.1" => [ + "doc/man1/openssl-namedisplay-options.pod" + ], + "doc/man/man1/openssl-nseq.1" => [ + "doc/man1/openssl-nseq.pod" + ], + "doc/man/man1/openssl-ocsp.1" => [ + "doc/man1/openssl-ocsp.pod" + ], + "doc/man/man1/openssl-passphrase-options.1" => [ + "doc/man1/openssl-passphrase-options.pod" + ], + "doc/man/man1/openssl-passwd.1" => [ + "doc/man1/openssl-passwd.pod" + ], + "doc/man/man1/openssl-pkcs12.1" => [ + "doc/man1/openssl-pkcs12.pod" + ], + "doc/man/man1/openssl-pkcs7.1" => [ + "doc/man1/openssl-pkcs7.pod" + ], + "doc/man/man1/openssl-pkcs8.1" => [ + "doc/man1/openssl-pkcs8.pod" + ], + "doc/man/man1/openssl-pkey.1" => [ + "doc/man1/openssl-pkey.pod" + ], + "doc/man/man1/openssl-pkeyparam.1" => [ + "doc/man1/openssl-pkeyparam.pod" + ], + "doc/man/man1/openssl-pkeyutl.1" => [ + "doc/man1/openssl-pkeyutl.pod" + ], + "doc/man/man1/openssl-prime.1" => [ + "doc/man1/openssl-prime.pod" + ], + "doc/man/man1/openssl-rand.1" => [ + "doc/man1/openssl-rand.pod" + ], + "doc/man/man1/openssl-rehash.1" => [ + "doc/man1/openssl-rehash.pod" + ], + "doc/man/man1/openssl-req.1" => [ + "doc/man1/openssl-req.pod" + ], + "doc/man/man1/openssl-rsa.1" => [ + "doc/man1/openssl-rsa.pod" + ], + "doc/man/man1/openssl-rsautl.1" => [ + "doc/man1/openssl-rsautl.pod" + ], + "doc/man/man1/openssl-s_client.1" => [ + "doc/man1/openssl-s_client.pod" + ], + "doc/man/man1/openssl-s_server.1" => [ + "doc/man1/openssl-s_server.pod" + ], + "doc/man/man1/openssl-s_time.1" => [ + "doc/man1/openssl-s_time.pod" + ], + "doc/man/man1/openssl-sess_id.1" => [ + "doc/man1/openssl-sess_id.pod" + ], + "doc/man/man1/openssl-skeyutl.1" => [ + "doc/man1/openssl-skeyutl.pod" + ], + "doc/man/man1/openssl-smime.1" => [ + "doc/man1/openssl-smime.pod" + ], + "doc/man/man1/openssl-speed.1" => [ + "doc/man1/openssl-speed.pod" + ], + "doc/man/man1/openssl-spkac.1" => [ + "doc/man1/openssl-spkac.pod" + ], + "doc/man/man1/openssl-srp.1" => [ + "doc/man1/openssl-srp.pod" + ], + "doc/man/man1/openssl-storeutl.1" => [ + "doc/man1/openssl-storeutl.pod" + ], + "doc/man/man1/openssl-ts.1" => [ + "doc/man1/openssl-ts.pod" + ], + "doc/man/man1/openssl-verification-options.1" => [ + "doc/man1/openssl-verification-options.pod" + ], + "doc/man/man1/openssl-verify.1" => [ + "doc/man1/openssl-verify.pod" + ], + "doc/man/man1/openssl-version.1" => [ + "doc/man1/openssl-version.pod" + ], + "doc/man/man1/openssl-x509.1" => [ + "doc/man1/openssl-x509.pod" + ], + "doc/man/man1/openssl.1" => [ + "doc/man1/openssl.pod" + ], + "doc/man/man1/tsget.1" => [ + "doc/man1/tsget.pod" + ], + "doc/man/man3/ADMISSIONS.3" => [ + "doc/man3/ADMISSIONS.pod" + ], + "doc/man/man3/ASN1_EXTERN_FUNCS.3" => [ + "doc/man3/ASN1_EXTERN_FUNCS.pod" + ], + "doc/man/man3/ASN1_INTEGER_get_int64.3" => [ + "doc/man3/ASN1_INTEGER_get_int64.pod" + ], + "doc/man/man3/ASN1_INTEGER_new.3" => [ + "doc/man3/ASN1_INTEGER_new.pod" + ], + "doc/man/man3/ASN1_ITEM_lookup.3" => [ + "doc/man3/ASN1_ITEM_lookup.pod" + ], + "doc/man/man3/ASN1_OBJECT_new.3" => [ + "doc/man3/ASN1_OBJECT_new.pod" + ], + "doc/man/man3/ASN1_STRING_TABLE_add.3" => [ + "doc/man3/ASN1_STRING_TABLE_add.pod" + ], + "doc/man/man3/ASN1_STRING_length.3" => [ + "doc/man3/ASN1_STRING_length.pod" + ], + "doc/man/man3/ASN1_STRING_new.3" => [ + "doc/man3/ASN1_STRING_new.pod" + ], + "doc/man/man3/ASN1_STRING_print_ex.3" => [ + "doc/man3/ASN1_STRING_print_ex.pod" + ], + "doc/man/man3/ASN1_TIME_set.3" => [ + "doc/man3/ASN1_TIME_set.pod" + ], + "doc/man/man3/ASN1_TYPE_get.3" => [ + "doc/man3/ASN1_TYPE_get.pod" + ], + "doc/man/man3/ASN1_aux_cb.3" => [ + "doc/man3/ASN1_aux_cb.pod" + ], + "doc/man/man3/ASN1_generate_nconf.3" => [ + "doc/man3/ASN1_generate_nconf.pod" + ], + "doc/man/man3/ASN1_item_d2i_bio.3" => [ + "doc/man3/ASN1_item_d2i_bio.pod" + ], + "doc/man/man3/ASN1_item_new.3" => [ + "doc/man3/ASN1_item_new.pod" + ], + "doc/man/man3/ASN1_item_sign.3" => [ + "doc/man3/ASN1_item_sign.pod" + ], + "doc/man/man3/ASYNC_WAIT_CTX_new.3" => [ + "doc/man3/ASYNC_WAIT_CTX_new.pod" + ], + "doc/man/man3/ASYNC_start_job.3" => [ + "doc/man3/ASYNC_start_job.pod" + ], + "doc/man/man3/BF_encrypt.3" => [ + "doc/man3/BF_encrypt.pod" + ], + "doc/man/man3/BIO_ADDR.3" => [ + "doc/man3/BIO_ADDR.pod" + ], + "doc/man/man3/BIO_ADDRINFO.3" => [ + "doc/man3/BIO_ADDRINFO.pod" + ], + "doc/man/man3/BIO_connect.3" => [ + "doc/man3/BIO_connect.pod" + ], + "doc/man/man3/BIO_ctrl.3" => [ + "doc/man3/BIO_ctrl.pod" + ], + "doc/man/man3/BIO_f_base64.3" => [ + "doc/man3/BIO_f_base64.pod" + ], + "doc/man/man3/BIO_f_buffer.3" => [ + "doc/man3/BIO_f_buffer.pod" + ], + "doc/man/man3/BIO_f_cipher.3" => [ + "doc/man3/BIO_f_cipher.pod" + ], + "doc/man/man3/BIO_f_md.3" => [ + "doc/man3/BIO_f_md.pod" + ], + "doc/man/man3/BIO_f_null.3" => [ + "doc/man3/BIO_f_null.pod" + ], + "doc/man/man3/BIO_f_prefix.3" => [ + "doc/man3/BIO_f_prefix.pod" + ], + "doc/man/man3/BIO_f_readbuffer.3" => [ + "doc/man3/BIO_f_readbuffer.pod" + ], + "doc/man/man3/BIO_f_ssl.3" => [ + "doc/man3/BIO_f_ssl.pod" + ], + "doc/man/man3/BIO_find_type.3" => [ + "doc/man3/BIO_find_type.pod" + ], + "doc/man/man3/BIO_get_data.3" => [ + "doc/man3/BIO_get_data.pod" + ], + "doc/man/man3/BIO_get_ex_new_index.3" => [ + "doc/man3/BIO_get_ex_new_index.pod" + ], + "doc/man/man3/BIO_get_rpoll_descriptor.3" => [ + "doc/man3/BIO_get_rpoll_descriptor.pod" + ], + "doc/man/man3/BIO_meth_new.3" => [ + "doc/man3/BIO_meth_new.pod" + ], + "doc/man/man3/BIO_new.3" => [ + "doc/man3/BIO_new.pod" + ], + "doc/man/man3/BIO_new_CMS.3" => [ + "doc/man3/BIO_new_CMS.pod" + ], + "doc/man/man3/BIO_parse_hostserv.3" => [ + "doc/man3/BIO_parse_hostserv.pod" + ], + "doc/man/man3/BIO_printf.3" => [ + "doc/man3/BIO_printf.pod" + ], + "doc/man/man3/BIO_push.3" => [ + "doc/man3/BIO_push.pod" + ], + "doc/man/man3/BIO_read.3" => [ + "doc/man3/BIO_read.pod" + ], + "doc/man/man3/BIO_s_accept.3" => [ + "doc/man3/BIO_s_accept.pod" + ], + "doc/man/man3/BIO_s_bio.3" => [ + "doc/man3/BIO_s_bio.pod" + ], + "doc/man/man3/BIO_s_connect.3" => [ + "doc/man3/BIO_s_connect.pod" + ], + "doc/man/man3/BIO_s_core.3" => [ + "doc/man3/BIO_s_core.pod" + ], + "doc/man/man3/BIO_s_datagram.3" => [ + "doc/man3/BIO_s_datagram.pod" + ], + "doc/man/man3/BIO_s_dgram_pair.3" => [ + "doc/man3/BIO_s_dgram_pair.pod" + ], + "doc/man/man3/BIO_s_fd.3" => [ + "doc/man3/BIO_s_fd.pod" + ], + "doc/man/man3/BIO_s_file.3" => [ + "doc/man3/BIO_s_file.pod" + ], + "doc/man/man3/BIO_s_mem.3" => [ + "doc/man3/BIO_s_mem.pod" + ], + "doc/man/man3/BIO_s_null.3" => [ + "doc/man3/BIO_s_null.pod" + ], + "doc/man/man3/BIO_s_socket.3" => [ + "doc/man3/BIO_s_socket.pod" + ], + "doc/man/man3/BIO_sendmmsg.3" => [ + "doc/man3/BIO_sendmmsg.pod" + ], + "doc/man/man3/BIO_set_callback.3" => [ + "doc/man3/BIO_set_callback.pod" + ], + "doc/man/man3/BIO_set_flags.3" => [ + "doc/man3/BIO_set_flags.pod" + ], + "doc/man/man3/BIO_should_retry.3" => [ + "doc/man3/BIO_should_retry.pod" + ], + "doc/man/man3/BIO_socket_wait.3" => [ + "doc/man3/BIO_socket_wait.pod" + ], + "doc/man/man3/BN_BLINDING_new.3" => [ + "doc/man3/BN_BLINDING_new.pod" + ], + "doc/man/man3/BN_CTX_new.3" => [ + "doc/man3/BN_CTX_new.pod" + ], + "doc/man/man3/BN_CTX_start.3" => [ + "doc/man3/BN_CTX_start.pod" + ], + "doc/man/man3/BN_add.3" => [ + "doc/man3/BN_add.pod" + ], + "doc/man/man3/BN_add_word.3" => [ + "doc/man3/BN_add_word.pod" + ], + "doc/man/man3/BN_bn2bin.3" => [ + "doc/man3/BN_bn2bin.pod" + ], + "doc/man/man3/BN_cmp.3" => [ + "doc/man3/BN_cmp.pod" + ], + "doc/man/man3/BN_copy.3" => [ + "doc/man3/BN_copy.pod" + ], + "doc/man/man3/BN_generate_prime.3" => [ + "doc/man3/BN_generate_prime.pod" + ], + "doc/man/man3/BN_mod_exp_mont.3" => [ + "doc/man3/BN_mod_exp_mont.pod" + ], + "doc/man/man3/BN_mod_inverse.3" => [ + "doc/man3/BN_mod_inverse.pod" + ], + "doc/man/man3/BN_mod_mul_montgomery.3" => [ + "doc/man3/BN_mod_mul_montgomery.pod" + ], + "doc/man/man3/BN_mod_mul_reciprocal.3" => [ + "doc/man3/BN_mod_mul_reciprocal.pod" + ], + "doc/man/man3/BN_new.3" => [ + "doc/man3/BN_new.pod" + ], + "doc/man/man3/BN_num_bytes.3" => [ + "doc/man3/BN_num_bytes.pod" + ], + "doc/man/man3/BN_rand.3" => [ + "doc/man3/BN_rand.pod" + ], + "doc/man/man3/BN_security_bits.3" => [ + "doc/man3/BN_security_bits.pod" + ], + "doc/man/man3/BN_set_bit.3" => [ + "doc/man3/BN_set_bit.pod" + ], + "doc/man/man3/BN_swap.3" => [ + "doc/man3/BN_swap.pod" + ], + "doc/man/man3/BN_zero.3" => [ + "doc/man3/BN_zero.pod" + ], + "doc/man/man3/BUF_MEM_new.3" => [ + "doc/man3/BUF_MEM_new.pod" + ], + "doc/man/man3/CMAC_CTX.3" => [ + "doc/man3/CMAC_CTX.pod" + ], + "doc/man/man3/CMS_EncryptedData_decrypt.3" => [ + "doc/man3/CMS_EncryptedData_decrypt.pod" + ], + "doc/man/man3/CMS_EncryptedData_encrypt.3" => [ + "doc/man3/CMS_EncryptedData_encrypt.pod" + ], + "doc/man/man3/CMS_EncryptedData_set1_key.3" => [ + "doc/man3/CMS_EncryptedData_set1_key.pod" + ], + "doc/man/man3/CMS_EnvelopedData_create.3" => [ + "doc/man3/CMS_EnvelopedData_create.pod" + ], + "doc/man/man3/CMS_add0_cert.3" => [ + "doc/man3/CMS_add0_cert.pod" + ], + "doc/man/man3/CMS_add1_recipient_cert.3" => [ + "doc/man3/CMS_add1_recipient_cert.pod" + ], + "doc/man/man3/CMS_add1_signer.3" => [ + "doc/man3/CMS_add1_signer.pod" + ], + "doc/man/man3/CMS_compress.3" => [ + "doc/man3/CMS_compress.pod" + ], + "doc/man/man3/CMS_data_create.3" => [ + "doc/man3/CMS_data_create.pod" + ], + "doc/man/man3/CMS_decrypt.3" => [ + "doc/man3/CMS_decrypt.pod" + ], + "doc/man/man3/CMS_digest_create.3" => [ + "doc/man3/CMS_digest_create.pod" + ], + "doc/man/man3/CMS_encrypt.3" => [ + "doc/man3/CMS_encrypt.pod" + ], + "doc/man/man3/CMS_final.3" => [ + "doc/man3/CMS_final.pod" + ], + "doc/man/man3/CMS_get0_RecipientInfos.3" => [ + "doc/man3/CMS_get0_RecipientInfos.pod" + ], + "doc/man/man3/CMS_get0_SignerInfos.3" => [ + "doc/man3/CMS_get0_SignerInfos.pod" + ], + "doc/man/man3/CMS_get0_type.3" => [ + "doc/man3/CMS_get0_type.pod" + ], + "doc/man/man3/CMS_get1_ReceiptRequest.3" => [ + "doc/man3/CMS_get1_ReceiptRequest.pod" + ], + "doc/man/man3/CMS_sign.3" => [ + "doc/man3/CMS_sign.pod" + ], + "doc/man/man3/CMS_sign_receipt.3" => [ + "doc/man3/CMS_sign_receipt.pod" + ], + "doc/man/man3/CMS_signed_get_attr.3" => [ + "doc/man3/CMS_signed_get_attr.pod" + ], + "doc/man/man3/CMS_uncompress.3" => [ + "doc/man3/CMS_uncompress.pod" + ], + "doc/man/man3/CMS_verify.3" => [ + "doc/man3/CMS_verify.pod" + ], + "doc/man/man3/CMS_verify_receipt.3" => [ + "doc/man3/CMS_verify_receipt.pod" + ], + "doc/man/man3/COMP_CTX_new.3" => [ + "doc/man3/COMP_CTX_new.pod" + ], + "doc/man/man3/CONF_modules_free.3" => [ + "doc/man3/CONF_modules_free.pod" + ], + "doc/man/man3/CONF_modules_load_file.3" => [ + "doc/man3/CONF_modules_load_file.pod" + ], + "doc/man/man3/CRYPTO_THREAD_run_once.3" => [ + "doc/man3/CRYPTO_THREAD_run_once.pod" + ], + "doc/man/man3/CRYPTO_get_ex_new_index.3" => [ + "doc/man3/CRYPTO_get_ex_new_index.pod" + ], + "doc/man/man3/CRYPTO_memcmp.3" => [ + "doc/man3/CRYPTO_memcmp.pod" + ], + "doc/man/man3/CTLOG_STORE_get0_log_by_id.3" => [ + "doc/man3/CTLOG_STORE_get0_log_by_id.pod" + ], + "doc/man/man3/CTLOG_STORE_new.3" => [ + "doc/man3/CTLOG_STORE_new.pod" + ], + "doc/man/man3/CTLOG_new.3" => [ + "doc/man3/CTLOG_new.pod" + ], + "doc/man/man3/CT_POLICY_EVAL_CTX_new.3" => [ + "doc/man3/CT_POLICY_EVAL_CTX_new.pod" + ], + "doc/man/man3/DEFINE_STACK_OF.3" => [ + "doc/man3/DEFINE_STACK_OF.pod" + ], + "doc/man/man3/DES_random_key.3" => [ + "doc/man3/DES_random_key.pod" + ], + "doc/man/man3/DH_generate_key.3" => [ + "doc/man3/DH_generate_key.pod" + ], + "doc/man/man3/DH_generate_parameters.3" => [ + "doc/man3/DH_generate_parameters.pod" + ], + "doc/man/man3/DH_get0_pqg.3" => [ + "doc/man3/DH_get0_pqg.pod" + ], + "doc/man/man3/DH_get_1024_160.3" => [ + "doc/man3/DH_get_1024_160.pod" + ], + "doc/man/man3/DH_meth_new.3" => [ + "doc/man3/DH_meth_new.pod" + ], + "doc/man/man3/DH_new.3" => [ + "doc/man3/DH_new.pod" + ], + "doc/man/man3/DH_new_by_nid.3" => [ + "doc/man3/DH_new_by_nid.pod" + ], + "doc/man/man3/DH_set_method.3" => [ + "doc/man3/DH_set_method.pod" + ], + "doc/man/man3/DH_size.3" => [ + "doc/man3/DH_size.pod" + ], + "doc/man/man3/DSA_SIG_new.3" => [ + "doc/man3/DSA_SIG_new.pod" + ], + "doc/man/man3/DSA_do_sign.3" => [ + "doc/man3/DSA_do_sign.pod" + ], + "doc/man/man3/DSA_dup_DH.3" => [ + "doc/man3/DSA_dup_DH.pod" + ], + "doc/man/man3/DSA_generate_key.3" => [ + "doc/man3/DSA_generate_key.pod" + ], + "doc/man/man3/DSA_generate_parameters.3" => [ + "doc/man3/DSA_generate_parameters.pod" + ], + "doc/man/man3/DSA_get0_pqg.3" => [ + "doc/man3/DSA_get0_pqg.pod" + ], + "doc/man/man3/DSA_meth_new.3" => [ + "doc/man3/DSA_meth_new.pod" + ], + "doc/man/man3/DSA_new.3" => [ + "doc/man3/DSA_new.pod" + ], + "doc/man/man3/DSA_set_method.3" => [ + "doc/man3/DSA_set_method.pod" + ], + "doc/man/man3/DSA_sign.3" => [ + "doc/man3/DSA_sign.pod" + ], + "doc/man/man3/DSA_size.3" => [ + "doc/man3/DSA_size.pod" + ], + "doc/man/man3/DTLS_get_data_mtu.3" => [ + "doc/man3/DTLS_get_data_mtu.pod" + ], + "doc/man/man3/DTLS_set_timer_cb.3" => [ + "doc/man3/DTLS_set_timer_cb.pod" + ], + "doc/man/man3/DTLSv1_get_timeout.3" => [ + "doc/man3/DTLSv1_get_timeout.pod" + ], + "doc/man/man3/DTLSv1_handle_timeout.3" => [ + "doc/man3/DTLSv1_handle_timeout.pod" + ], + "doc/man/man3/DTLSv1_listen.3" => [ + "doc/man3/DTLSv1_listen.pod" + ], + "doc/man/man3/ECDSA_SIG_new.3" => [ + "doc/man3/ECDSA_SIG_new.pod" + ], + "doc/man/man3/ECDSA_sign.3" => [ + "doc/man3/ECDSA_sign.pod" + ], + "doc/man/man3/ECPKParameters_print.3" => [ + "doc/man3/ECPKParameters_print.pod" + ], + "doc/man/man3/EC_GFp_simple_method.3" => [ + "doc/man3/EC_GFp_simple_method.pod" + ], + "doc/man/man3/EC_GROUP_copy.3" => [ + "doc/man3/EC_GROUP_copy.pod" + ], + "doc/man/man3/EC_GROUP_new.3" => [ + "doc/man3/EC_GROUP_new.pod" + ], + "doc/man/man3/EC_KEY_get_enc_flags.3" => [ + "doc/man3/EC_KEY_get_enc_flags.pod" + ], + "doc/man/man3/EC_KEY_new.3" => [ + "doc/man3/EC_KEY_new.pod" + ], + "doc/man/man3/EC_POINT_add.3" => [ + "doc/man3/EC_POINT_add.pod" + ], + "doc/man/man3/EC_POINT_new.3" => [ + "doc/man3/EC_POINT_new.pod" + ], + "doc/man/man3/ENGINE_add.3" => [ + "doc/man3/ENGINE_add.pod" + ], + "doc/man/man3/ERR_GET_LIB.3" => [ + "doc/man3/ERR_GET_LIB.pod" + ], + "doc/man/man3/ERR_clear_error.3" => [ + "doc/man3/ERR_clear_error.pod" + ], + "doc/man/man3/ERR_error_string.3" => [ + "doc/man3/ERR_error_string.pod" + ], + "doc/man/man3/ERR_get_error.3" => [ + "doc/man3/ERR_get_error.pod" + ], + "doc/man/man3/ERR_load_crypto_strings.3" => [ + "doc/man3/ERR_load_crypto_strings.pod" + ], + "doc/man/man3/ERR_load_strings.3" => [ + "doc/man3/ERR_load_strings.pod" + ], + "doc/man/man3/ERR_new.3" => [ + "doc/man3/ERR_new.pod" + ], + "doc/man/man3/ERR_print_errors.3" => [ + "doc/man3/ERR_print_errors.pod" + ], + "doc/man/man3/ERR_put_error.3" => [ + "doc/man3/ERR_put_error.pod" + ], + "doc/man/man3/ERR_remove_state.3" => [ + "doc/man3/ERR_remove_state.pod" + ], + "doc/man/man3/ERR_set_mark.3" => [ + "doc/man3/ERR_set_mark.pod" + ], + "doc/man/man3/EVP_ASYM_CIPHER_free.3" => [ + "doc/man3/EVP_ASYM_CIPHER_free.pod" + ], + "doc/man/man3/EVP_BytesToKey.3" => [ + "doc/man3/EVP_BytesToKey.pod" + ], + "doc/man/man3/EVP_CIPHER_CTX_get_app_data.3" => [ + "doc/man3/EVP_CIPHER_CTX_get_app_data.pod" + ], + "doc/man/man3/EVP_CIPHER_CTX_get_cipher_data.3" => [ + "doc/man3/EVP_CIPHER_CTX_get_cipher_data.pod" + ], + "doc/man/man3/EVP_CIPHER_CTX_get_original_iv.3" => [ + "doc/man3/EVP_CIPHER_CTX_get_original_iv.pod" + ], + "doc/man/man3/EVP_CIPHER_meth_new.3" => [ + "doc/man3/EVP_CIPHER_meth_new.pod" + ], + "doc/man/man3/EVP_DigestInit.3" => [ + "doc/man3/EVP_DigestInit.pod" + ], + "doc/man/man3/EVP_DigestSignInit.3" => [ + "doc/man3/EVP_DigestSignInit.pod" + ], + "doc/man/man3/EVP_DigestVerifyInit.3" => [ + "doc/man3/EVP_DigestVerifyInit.pod" + ], + "doc/man/man3/EVP_EncodeInit.3" => [ + "doc/man3/EVP_EncodeInit.pod" + ], + "doc/man/man3/EVP_EncryptInit.3" => [ + "doc/man3/EVP_EncryptInit.pod" + ], + "doc/man/man3/EVP_KDF.3" => [ + "doc/man3/EVP_KDF.pod" + ], + "doc/man/man3/EVP_KEM_free.3" => [ + "doc/man3/EVP_KEM_free.pod" + ], + "doc/man/man3/EVP_KEYEXCH_free.3" => [ + "doc/man3/EVP_KEYEXCH_free.pod" + ], + "doc/man/man3/EVP_KEYMGMT.3" => [ + "doc/man3/EVP_KEYMGMT.pod" + ], + "doc/man/man3/EVP_MAC.3" => [ + "doc/man3/EVP_MAC.pod" + ], + "doc/man/man3/EVP_MD_meth_new.3" => [ + "doc/man3/EVP_MD_meth_new.pod" + ], + "doc/man/man3/EVP_OpenInit.3" => [ + "doc/man3/EVP_OpenInit.pod" + ], + "doc/man/man3/EVP_PBE_CipherInit.3" => [ + "doc/man3/EVP_PBE_CipherInit.pod" + ], + "doc/man/man3/EVP_PKEY2PKCS8.3" => [ + "doc/man3/EVP_PKEY2PKCS8.pod" + ], + "doc/man/man3/EVP_PKEY_ASN1_METHOD.3" => [ + "doc/man3/EVP_PKEY_ASN1_METHOD.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_ctrl.3" => [ + "doc/man3/EVP_PKEY_CTX_ctrl.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_get0_libctx.3" => [ + "doc/man3/EVP_PKEY_CTX_get0_libctx.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_get0_pkey.3" => [ + "doc/man3/EVP_PKEY_CTX_get0_pkey.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_get_algor.3" => [ + "doc/man3/EVP_PKEY_CTX_get_algor.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_new.3" => [ + "doc/man3/EVP_PKEY_CTX_new.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set1_pbe_pass.3" => [ + "doc/man3/EVP_PKEY_CTX_set1_pbe_pass.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_hkdf_md.3" => [ + "doc/man3/EVP_PKEY_CTX_set_hkdf_md.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_params.3" => [ + "doc/man3/EVP_PKEY_CTX_set_params.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.3" => [ + "doc/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_scrypt_N.3" => [ + "doc/man3/EVP_PKEY_CTX_set_scrypt_N.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_tls1_prf_md.3" => [ + "doc/man3/EVP_PKEY_CTX_set_tls1_prf_md.pod" + ], + "doc/man/man3/EVP_PKEY_asn1_get_count.3" => [ + "doc/man3/EVP_PKEY_asn1_get_count.pod" + ], + "doc/man/man3/EVP_PKEY_check.3" => [ + "doc/man3/EVP_PKEY_check.pod" + ], + "doc/man/man3/EVP_PKEY_copy_parameters.3" => [ + "doc/man3/EVP_PKEY_copy_parameters.pod" + ], + "doc/man/man3/EVP_PKEY_decapsulate.3" => [ + "doc/man3/EVP_PKEY_decapsulate.pod" + ], + "doc/man/man3/EVP_PKEY_decrypt.3" => [ + "doc/man3/EVP_PKEY_decrypt.pod" + ], + "doc/man/man3/EVP_PKEY_derive.3" => [ + "doc/man3/EVP_PKEY_derive.pod" + ], + "doc/man/man3/EVP_PKEY_digestsign_supports_digest.3" => [ + "doc/man3/EVP_PKEY_digestsign_supports_digest.pod" + ], + "doc/man/man3/EVP_PKEY_encapsulate.3" => [ + "doc/man3/EVP_PKEY_encapsulate.pod" + ], + "doc/man/man3/EVP_PKEY_encrypt.3" => [ + "doc/man3/EVP_PKEY_encrypt.pod" + ], + "doc/man/man3/EVP_PKEY_fromdata.3" => [ + "doc/man3/EVP_PKEY_fromdata.pod" + ], + "doc/man/man3/EVP_PKEY_get_attr.3" => [ + "doc/man3/EVP_PKEY_get_attr.pod" + ], + "doc/man/man3/EVP_PKEY_get_default_digest_nid.3" => [ + "doc/man3/EVP_PKEY_get_default_digest_nid.pod" + ], + "doc/man/man3/EVP_PKEY_get_field_type.3" => [ + "doc/man3/EVP_PKEY_get_field_type.pod" + ], + "doc/man/man3/EVP_PKEY_get_group_name.3" => [ + "doc/man3/EVP_PKEY_get_group_name.pod" + ], + "doc/man/man3/EVP_PKEY_get_size.3" => [ + "doc/man3/EVP_PKEY_get_size.pod" + ], + "doc/man/man3/EVP_PKEY_gettable_params.3" => [ + "doc/man3/EVP_PKEY_gettable_params.pod" + ], + "doc/man/man3/EVP_PKEY_is_a.3" => [ + "doc/man3/EVP_PKEY_is_a.pod" + ], + "doc/man/man3/EVP_PKEY_keygen.3" => [ + "doc/man3/EVP_PKEY_keygen.pod" + ], + "doc/man/man3/EVP_PKEY_meth_get_count.3" => [ + "doc/man3/EVP_PKEY_meth_get_count.pod" + ], + "doc/man/man3/EVP_PKEY_meth_new.3" => [ + "doc/man3/EVP_PKEY_meth_new.pod" + ], + "doc/man/man3/EVP_PKEY_new.3" => [ + "doc/man3/EVP_PKEY_new.pod" + ], + "doc/man/man3/EVP_PKEY_print_private.3" => [ + "doc/man3/EVP_PKEY_print_private.pod" + ], + "doc/man/man3/EVP_PKEY_set1_RSA.3" => [ + "doc/man3/EVP_PKEY_set1_RSA.pod" + ], + "doc/man/man3/EVP_PKEY_set1_encoded_public_key.3" => [ + "doc/man3/EVP_PKEY_set1_encoded_public_key.pod" + ], + "doc/man/man3/EVP_PKEY_set_type.3" => [ + "doc/man3/EVP_PKEY_set_type.pod" + ], + "doc/man/man3/EVP_PKEY_settable_params.3" => [ + "doc/man3/EVP_PKEY_settable_params.pod" + ], + "doc/man/man3/EVP_PKEY_sign.3" => [ + "doc/man3/EVP_PKEY_sign.pod" + ], + "doc/man/man3/EVP_PKEY_todata.3" => [ + "doc/man3/EVP_PKEY_todata.pod" + ], + "doc/man/man3/EVP_PKEY_verify.3" => [ + "doc/man3/EVP_PKEY_verify.pod" + ], + "doc/man/man3/EVP_PKEY_verify_recover.3" => [ + "doc/man3/EVP_PKEY_verify_recover.pod" + ], + "doc/man/man3/EVP_RAND.3" => [ + "doc/man3/EVP_RAND.pod" + ], + "doc/man/man3/EVP_SIGNATURE.3" => [ + "doc/man3/EVP_SIGNATURE.pod" + ], + "doc/man/man3/EVP_SKEY.3" => [ + "doc/man3/EVP_SKEY.pod" + ], + "doc/man/man3/EVP_SKEYMGMT.3" => [ + "doc/man3/EVP_SKEYMGMT.pod" + ], + "doc/man/man3/EVP_SealInit.3" => [ + "doc/man3/EVP_SealInit.pod" + ], + "doc/man/man3/EVP_SignInit.3" => [ + "doc/man3/EVP_SignInit.pod" + ], + "doc/man/man3/EVP_VerifyInit.3" => [ + "doc/man3/EVP_VerifyInit.pod" + ], + "doc/man/man3/EVP_aes_128_gcm.3" => [ + "doc/man3/EVP_aes_128_gcm.pod" + ], + "doc/man/man3/EVP_aria_128_gcm.3" => [ + "doc/man3/EVP_aria_128_gcm.pod" + ], + "doc/man/man3/EVP_bf_cbc.3" => [ + "doc/man3/EVP_bf_cbc.pod" + ], + "doc/man/man3/EVP_blake2b512.3" => [ + "doc/man3/EVP_blake2b512.pod" + ], + "doc/man/man3/EVP_camellia_128_ecb.3" => [ + "doc/man3/EVP_camellia_128_ecb.pod" + ], + "doc/man/man3/EVP_cast5_cbc.3" => [ + "doc/man3/EVP_cast5_cbc.pod" + ], + "doc/man/man3/EVP_chacha20.3" => [ + "doc/man3/EVP_chacha20.pod" + ], + "doc/man/man3/EVP_des_cbc.3" => [ + "doc/man3/EVP_des_cbc.pod" + ], + "doc/man/man3/EVP_desx_cbc.3" => [ + "doc/man3/EVP_desx_cbc.pod" + ], + "doc/man/man3/EVP_idea_cbc.3" => [ + "doc/man3/EVP_idea_cbc.pod" + ], + "doc/man/man3/EVP_md2.3" => [ + "doc/man3/EVP_md2.pod" + ], + "doc/man/man3/EVP_md4.3" => [ + "doc/man3/EVP_md4.pod" + ], + "doc/man/man3/EVP_md5.3" => [ + "doc/man3/EVP_md5.pod" + ], + "doc/man/man3/EVP_mdc2.3" => [ + "doc/man3/EVP_mdc2.pod" + ], + "doc/man/man3/EVP_rc2_cbc.3" => [ + "doc/man3/EVP_rc2_cbc.pod" + ], + "doc/man/man3/EVP_rc4.3" => [ + "doc/man3/EVP_rc4.pod" + ], + "doc/man/man3/EVP_rc5_32_12_16_cbc.3" => [ + "doc/man3/EVP_rc5_32_12_16_cbc.pod" + ], + "doc/man/man3/EVP_ripemd160.3" => [ + "doc/man3/EVP_ripemd160.pod" + ], + "doc/man/man3/EVP_seed_cbc.3" => [ + "doc/man3/EVP_seed_cbc.pod" + ], + "doc/man/man3/EVP_set_default_properties.3" => [ + "doc/man3/EVP_set_default_properties.pod" + ], + "doc/man/man3/EVP_sha1.3" => [ + "doc/man3/EVP_sha1.pod" + ], + "doc/man/man3/EVP_sha224.3" => [ + "doc/man3/EVP_sha224.pod" + ], + "doc/man/man3/EVP_sha3_224.3" => [ + "doc/man3/EVP_sha3_224.pod" + ], + "doc/man/man3/EVP_sm3.3" => [ + "doc/man3/EVP_sm3.pod" + ], + "doc/man/man3/EVP_sm4_cbc.3" => [ + "doc/man3/EVP_sm4_cbc.pod" + ], + "doc/man/man3/EVP_whirlpool.3" => [ + "doc/man3/EVP_whirlpool.pod" + ], + "doc/man/man3/GENERAL_NAME.3" => [ + "doc/man3/GENERAL_NAME.pod" + ], + "doc/man/man3/HMAC.3" => [ + "doc/man3/HMAC.pod" + ], + "doc/man/man3/MD5.3" => [ + "doc/man3/MD5.pod" + ], + "doc/man/man3/MDC2_Init.3" => [ + "doc/man3/MDC2_Init.pod" + ], + "doc/man/man3/NCONF_new_ex.3" => [ + "doc/man3/NCONF_new_ex.pod" + ], + "doc/man/man3/OBJ_nid2obj.3" => [ + "doc/man3/OBJ_nid2obj.pod" + ], + "doc/man/man3/OCSP_REQUEST_new.3" => [ + "doc/man3/OCSP_REQUEST_new.pod" + ], + "doc/man/man3/OCSP_cert_to_id.3" => [ + "doc/man3/OCSP_cert_to_id.pod" + ], + "doc/man/man3/OCSP_request_add1_nonce.3" => [ + "doc/man3/OCSP_request_add1_nonce.pod" + ], + "doc/man/man3/OCSP_resp_find_status.3" => [ + "doc/man3/OCSP_resp_find_status.pod" + ], + "doc/man/man3/OCSP_response_status.3" => [ + "doc/man3/OCSP_response_status.pod" + ], + "doc/man/man3/OCSP_sendreq_new.3" => [ + "doc/man3/OCSP_sendreq_new.pod" + ], + "doc/man/man3/OPENSSL_Applink.3" => [ + "doc/man3/OPENSSL_Applink.pod" + ], + "doc/man/man3/OPENSSL_FILE.3" => [ + "doc/man3/OPENSSL_FILE.pod" + ], + "doc/man/man3/OPENSSL_LH_COMPFUNC.3" => [ + "doc/man3/OPENSSL_LH_COMPFUNC.pod" + ], + "doc/man/man3/OPENSSL_LH_stats.3" => [ + "doc/man3/OPENSSL_LH_stats.pod" + ], + "doc/man/man3/OPENSSL_config.3" => [ + "doc/man3/OPENSSL_config.pod" + ], + "doc/man/man3/OPENSSL_fork_prepare.3" => [ + "doc/man3/OPENSSL_fork_prepare.pod" + ], + "doc/man/man3/OPENSSL_gmtime.3" => [ + "doc/man3/OPENSSL_gmtime.pod" + ], + "doc/man/man3/OPENSSL_hexchar2int.3" => [ + "doc/man3/OPENSSL_hexchar2int.pod" + ], + "doc/man/man3/OPENSSL_ia32cap.3" => [ + "doc/man3/OPENSSL_ia32cap.pod" + ], + "doc/man/man3/OPENSSL_init_crypto.3" => [ + "doc/man3/OPENSSL_init_crypto.pod" + ], + "doc/man/man3/OPENSSL_init_ssl.3" => [ + "doc/man3/OPENSSL_init_ssl.pod" + ], + "doc/man/man3/OPENSSL_instrument_bus.3" => [ + "doc/man3/OPENSSL_instrument_bus.pod" + ], + "doc/man/man3/OPENSSL_load_builtin_modules.3" => [ + "doc/man3/OPENSSL_load_builtin_modules.pod" + ], + "doc/man/man3/OPENSSL_load_u16_le.3" => [ + "doc/man3/OPENSSL_load_u16_le.pod" + ], + "doc/man/man3/OPENSSL_malloc.3" => [ + "doc/man3/OPENSSL_malloc.pod" + ], + "doc/man/man3/OPENSSL_ppccap.3" => [ + "doc/man3/OPENSSL_ppccap.pod" + ], + "doc/man/man3/OPENSSL_riscvcap.3" => [ + "doc/man3/OPENSSL_riscvcap.pod" + ], + "doc/man/man3/OPENSSL_s390xcap.3" => [ + "doc/man3/OPENSSL_s390xcap.pod" + ], + "doc/man/man3/OPENSSL_secure_malloc.3" => [ + "doc/man3/OPENSSL_secure_malloc.pod" + ], + "doc/man/man3/OPENSSL_strcasecmp.3" => [ + "doc/man3/OPENSSL_strcasecmp.pod" + ], + "doc/man/man3/OSSL_ALGORITHM.3" => [ + "doc/man3/OSSL_ALGORITHM.pod" + ], + "doc/man/man3/OSSL_CALLBACK.3" => [ + "doc/man3/OSSL_CALLBACK.pod" + ], + "doc/man/man3/OSSL_CMP_ATAV_set0.3" => [ + "doc/man3/OSSL_CMP_ATAV_set0.pod" + ], + "doc/man/man3/OSSL_CMP_CTX_new.3" => [ + "doc/man3/OSSL_CMP_CTX_new.pod" + ], + "doc/man/man3/OSSL_CMP_HDR_get0_transactionID.3" => [ + "doc/man3/OSSL_CMP_HDR_get0_transactionID.pod" + ], + "doc/man/man3/OSSL_CMP_ITAV_new_caCerts.3" => [ + "doc/man3/OSSL_CMP_ITAV_new_caCerts.pod" + ], + "doc/man/man3/OSSL_CMP_ITAV_set0.3" => [ + "doc/man3/OSSL_CMP_ITAV_set0.pod" + ], + "doc/man/man3/OSSL_CMP_MSG_get0_header.3" => [ + "doc/man3/OSSL_CMP_MSG_get0_header.pod" + ], + "doc/man/man3/OSSL_CMP_MSG_http_perform.3" => [ + "doc/man3/OSSL_CMP_MSG_http_perform.pod" + ], + "doc/man/man3/OSSL_CMP_SRV_CTX_new.3" => [ + "doc/man3/OSSL_CMP_SRV_CTX_new.pod" + ], + "doc/man/man3/OSSL_CMP_STATUSINFO_new.3" => [ + "doc/man3/OSSL_CMP_STATUSINFO_new.pod" + ], + "doc/man/man3/OSSL_CMP_exec_certreq.3" => [ + "doc/man3/OSSL_CMP_exec_certreq.pod" + ], + "doc/man/man3/OSSL_CMP_log_open.3" => [ + "doc/man3/OSSL_CMP_log_open.pod" + ], + "doc/man/man3/OSSL_CMP_validate_msg.3" => [ + "doc/man3/OSSL_CMP_validate_msg.pod" + ], + "doc/man/man3/OSSL_CORE_MAKE_FUNC.3" => [ + "doc/man3/OSSL_CORE_MAKE_FUNC.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_get0_tmpl.3" => [ + "doc/man3/OSSL_CRMF_MSG_get0_tmpl.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_set0_validity.3" => [ + "doc/man3/OSSL_CRMF_MSG_set0_validity.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.3" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.3" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.pod" + ], + "doc/man/man3/OSSL_CRMF_pbmp_new.3" => [ + "doc/man3/OSSL_CRMF_pbmp_new.pod" + ], + "doc/man/man3/OSSL_DECODER.3" => [ + "doc/man3/OSSL_DECODER.pod" + ], + "doc/man/man3/OSSL_DECODER_CTX.3" => [ + "doc/man3/OSSL_DECODER_CTX.pod" + ], + "doc/man/man3/OSSL_DECODER_CTX_new_for_pkey.3" => [ + "doc/man3/OSSL_DECODER_CTX_new_for_pkey.pod" + ], + "doc/man/man3/OSSL_DECODER_from_bio.3" => [ + "doc/man3/OSSL_DECODER_from_bio.pod" + ], + "doc/man/man3/OSSL_DISPATCH.3" => [ + "doc/man3/OSSL_DISPATCH.pod" + ], + "doc/man/man3/OSSL_ENCODER.3" => [ + "doc/man3/OSSL_ENCODER.pod" + ], + "doc/man/man3/OSSL_ENCODER_CTX.3" => [ + "doc/man3/OSSL_ENCODER_CTX.pod" + ], + "doc/man/man3/OSSL_ENCODER_CTX_new_for_pkey.3" => [ + "doc/man3/OSSL_ENCODER_CTX_new_for_pkey.pod" + ], + "doc/man/man3/OSSL_ENCODER_to_bio.3" => [ + "doc/man3/OSSL_ENCODER_to_bio.pod" + ], + "doc/man/man3/OSSL_ERR_STATE_save.3" => [ + "doc/man3/OSSL_ERR_STATE_save.pod" + ], + "doc/man/man3/OSSL_ESS_check_signing_certs.3" => [ + "doc/man3/OSSL_ESS_check_signing_certs.pod" + ], + "doc/man/man3/OSSL_GENERAL_NAMES_print.3" => [ + "doc/man3/OSSL_GENERAL_NAMES_print.pod" + ], + "doc/man/man3/OSSL_HPKE_CTX_new.3" => [ + "doc/man3/OSSL_HPKE_CTX_new.pod" + ], + "doc/man/man3/OSSL_HTTP_REQ_CTX.3" => [ + "doc/man3/OSSL_HTTP_REQ_CTX.pod" + ], + "doc/man/man3/OSSL_HTTP_parse_url.3" => [ + "doc/man3/OSSL_HTTP_parse_url.pod" + ], + "doc/man/man3/OSSL_HTTP_transfer.3" => [ + "doc/man3/OSSL_HTTP_transfer.pod" + ], + "doc/man/man3/OSSL_IETF_ATTR_SYNTAX.3" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX.pod" + ], + "doc/man/man3/OSSL_IETF_ATTR_SYNTAX_print.3" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX_print.pod" + ], + "doc/man/man3/OSSL_INDICATOR_set_callback.3" => [ + "doc/man3/OSSL_INDICATOR_set_callback.pod" + ], + "doc/man/man3/OSSL_ITEM.3" => [ + "doc/man3/OSSL_ITEM.pod" + ], + "doc/man/man3/OSSL_LIB_CTX.3" => [ + "doc/man3/OSSL_LIB_CTX.pod" + ], + "doc/man/man3/OSSL_LIB_CTX_set_conf_diagnostics.3" => [ + "doc/man3/OSSL_LIB_CTX_set_conf_diagnostics.pod" + ], + "doc/man/man3/OSSL_PARAM.3" => [ + "doc/man3/OSSL_PARAM.pod" + ], + "doc/man/man3/OSSL_PARAM_BLD.3" => [ + "doc/man3/OSSL_PARAM_BLD.pod" + ], + "doc/man/man3/OSSL_PARAM_allocate_from_text.3" => [ + "doc/man3/OSSL_PARAM_allocate_from_text.pod" + ], + "doc/man/man3/OSSL_PARAM_dup.3" => [ + "doc/man3/OSSL_PARAM_dup.pod" + ], + "doc/man/man3/OSSL_PARAM_int.3" => [ + "doc/man3/OSSL_PARAM_int.pod" + ], + "doc/man/man3/OSSL_PARAM_print_to_bio.3" => [ + "doc/man3/OSSL_PARAM_print_to_bio.pod" + ], + "doc/man/man3/OSSL_PROVIDER.3" => [ + "doc/man3/OSSL_PROVIDER.pod" + ], + "doc/man/man3/OSSL_QUIC_client_method.3" => [ + "doc/man3/OSSL_QUIC_client_method.pod" + ], + "doc/man/man3/OSSL_SELF_TEST_new.3" => [ + "doc/man3/OSSL_SELF_TEST_new.pod" + ], + "doc/man/man3/OSSL_SELF_TEST_set_callback.3" => [ + "doc/man3/OSSL_SELF_TEST_set_callback.pod" + ], + "doc/man/man3/OSSL_STORE_INFO.3" => [ + "doc/man3/OSSL_STORE_INFO.pod" + ], + "doc/man/man3/OSSL_STORE_LOADER.3" => [ + "doc/man3/OSSL_STORE_LOADER.pod" + ], + "doc/man/man3/OSSL_STORE_SEARCH.3" => [ + "doc/man3/OSSL_STORE_SEARCH.pod" + ], + "doc/man/man3/OSSL_STORE_attach.3" => [ + "doc/man3/OSSL_STORE_attach.pod" + ], + "doc/man/man3/OSSL_STORE_expect.3" => [ + "doc/man3/OSSL_STORE_expect.pod" + ], + "doc/man/man3/OSSL_STORE_open.3" => [ + "doc/man3/OSSL_STORE_open.pod" + ], + "doc/man/man3/OSSL_sleep.3" => [ + "doc/man3/OSSL_sleep.pod" + ], + "doc/man/man3/OSSL_trace_enabled.3" => [ + "doc/man3/OSSL_trace_enabled.pod" + ], + "doc/man/man3/OSSL_trace_get_category_num.3" => [ + "doc/man3/OSSL_trace_get_category_num.pod" + ], + "doc/man/man3/OSSL_trace_set_channel.3" => [ + "doc/man3/OSSL_trace_set_channel.pod" + ], + "doc/man/man3/OpenSSL_add_all_algorithms.3" => [ + "doc/man3/OpenSSL_add_all_algorithms.pod" + ], + "doc/man/man3/OpenSSL_version.3" => [ + "doc/man3/OpenSSL_version.pod" + ], + "doc/man/man3/PBMAC1_get1_pbkdf2_param.3" => [ + "doc/man3/PBMAC1_get1_pbkdf2_param.pod" + ], + "doc/man/man3/PEM_X509_INFO_read_bio_ex.3" => [ + "doc/man3/PEM_X509_INFO_read_bio_ex.pod" + ], + "doc/man/man3/PEM_bytes_read_bio.3" => [ + "doc/man3/PEM_bytes_read_bio.pod" + ], + "doc/man/man3/PEM_read.3" => [ + "doc/man3/PEM_read.pod" + ], + "doc/man/man3/PEM_read_CMS.3" => [ + "doc/man3/PEM_read_CMS.pod" + ], + "doc/man/man3/PEM_read_bio_PrivateKey.3" => [ + "doc/man3/PEM_read_bio_PrivateKey.pod" + ], + "doc/man/man3/PEM_read_bio_ex.3" => [ + "doc/man3/PEM_read_bio_ex.pod" + ], + "doc/man/man3/PEM_write_bio_CMS_stream.3" => [ + "doc/man3/PEM_write_bio_CMS_stream.pod" + ], + "doc/man/man3/PEM_write_bio_PKCS7_stream.3" => [ + "doc/man3/PEM_write_bio_PKCS7_stream.pod" + ], + "doc/man/man3/PKCS12_PBE_keyivgen.3" => [ + "doc/man3/PKCS12_PBE_keyivgen.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_create_cert.3" => [ + "doc/man3/PKCS12_SAFEBAG_create_cert.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_get0_attrs.3" => [ + "doc/man3/PKCS12_SAFEBAG_get0_attrs.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_get1_cert.3" => [ + "doc/man3/PKCS12_SAFEBAG_get1_cert.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_set0_attrs.3" => [ + "doc/man3/PKCS12_SAFEBAG_set0_attrs.pod" + ], + "doc/man/man3/PKCS12_add1_attr_by_NID.3" => [ + "doc/man3/PKCS12_add1_attr_by_NID.pod" + ], + "doc/man/man3/PKCS12_add_CSPName_asc.3" => [ + "doc/man3/PKCS12_add_CSPName_asc.pod" + ], + "doc/man/man3/PKCS12_add_cert.3" => [ + "doc/man3/PKCS12_add_cert.pod" + ], + "doc/man/man3/PKCS12_add_friendlyname_asc.3" => [ + "doc/man3/PKCS12_add_friendlyname_asc.pod" + ], + "doc/man/man3/PKCS12_add_localkeyid.3" => [ + "doc/man3/PKCS12_add_localkeyid.pod" + ], + "doc/man/man3/PKCS12_add_safe.3" => [ + "doc/man3/PKCS12_add_safe.pod" + ], + "doc/man/man3/PKCS12_create.3" => [ + "doc/man3/PKCS12_create.pod" + ], + "doc/man/man3/PKCS12_decrypt_skey.3" => [ + "doc/man3/PKCS12_decrypt_skey.pod" + ], + "doc/man/man3/PKCS12_gen_mac.3" => [ + "doc/man3/PKCS12_gen_mac.pod" + ], + "doc/man/man3/PKCS12_get_friendlyname.3" => [ + "doc/man3/PKCS12_get_friendlyname.pod" + ], + "doc/man/man3/PKCS12_init.3" => [ + "doc/man3/PKCS12_init.pod" + ], + "doc/man/man3/PKCS12_item_decrypt_d2i.3" => [ + "doc/man3/PKCS12_item_decrypt_d2i.pod" + ], + "doc/man/man3/PKCS12_key_gen_utf8_ex.3" => [ + "doc/man3/PKCS12_key_gen_utf8_ex.pod" + ], + "doc/man/man3/PKCS12_newpass.3" => [ + "doc/man3/PKCS12_newpass.pod" + ], + "doc/man/man3/PKCS12_pack_p7encdata.3" => [ + "doc/man3/PKCS12_pack_p7encdata.pod" + ], + "doc/man/man3/PKCS12_parse.3" => [ + "doc/man3/PKCS12_parse.pod" + ], + "doc/man/man3/PKCS5_PBE_keyivgen.3" => [ + "doc/man3/PKCS5_PBE_keyivgen.pod" + ], + "doc/man/man3/PKCS5_PBKDF2_HMAC.3" => [ + "doc/man3/PKCS5_PBKDF2_HMAC.pod" + ], + "doc/man/man3/PKCS7_decrypt.3" => [ + "doc/man3/PKCS7_decrypt.pod" + ], + "doc/man/man3/PKCS7_encrypt.3" => [ + "doc/man3/PKCS7_encrypt.pod" + ], + "doc/man/man3/PKCS7_get_octet_string.3" => [ + "doc/man3/PKCS7_get_octet_string.pod" + ], + "doc/man/man3/PKCS7_sign.3" => [ + "doc/man3/PKCS7_sign.pod" + ], + "doc/man/man3/PKCS7_sign_add_signer.3" => [ + "doc/man3/PKCS7_sign_add_signer.pod" + ], + "doc/man/man3/PKCS7_type_is_other.3" => [ + "doc/man3/PKCS7_type_is_other.pod" + ], + "doc/man/man3/PKCS7_verify.3" => [ + "doc/man3/PKCS7_verify.pod" + ], + "doc/man/man3/PKCS8_encrypt.3" => [ + "doc/man3/PKCS8_encrypt.pod" + ], + "doc/man/man3/PKCS8_pkey_add1_attr.3" => [ + "doc/man3/PKCS8_pkey_add1_attr.pod" + ], + "doc/man/man3/RAND_add.3" => [ + "doc/man3/RAND_add.pod" + ], + "doc/man/man3/RAND_bytes.3" => [ + "doc/man3/RAND_bytes.pod" + ], + "doc/man/man3/RAND_cleanup.3" => [ + "doc/man3/RAND_cleanup.pod" + ], + "doc/man/man3/RAND_egd.3" => [ + "doc/man3/RAND_egd.pod" + ], + "doc/man/man3/RAND_get0_primary.3" => [ + "doc/man3/RAND_get0_primary.pod" + ], + "doc/man/man3/RAND_load_file.3" => [ + "doc/man3/RAND_load_file.pod" + ], + "doc/man/man3/RAND_set_DRBG_type.3" => [ + "doc/man3/RAND_set_DRBG_type.pod" + ], + "doc/man/man3/RAND_set_rand_method.3" => [ + "doc/man3/RAND_set_rand_method.pod" + ], + "doc/man/man3/RC4_set_key.3" => [ + "doc/man3/RC4_set_key.pod" + ], + "doc/man/man3/RIPEMD160_Init.3" => [ + "doc/man3/RIPEMD160_Init.pod" + ], + "doc/man/man3/RSA_blinding_on.3" => [ + "doc/man3/RSA_blinding_on.pod" + ], + "doc/man/man3/RSA_check_key.3" => [ + "doc/man3/RSA_check_key.pod" + ], + "doc/man/man3/RSA_generate_key.3" => [ + "doc/man3/RSA_generate_key.pod" + ], + "doc/man/man3/RSA_get0_key.3" => [ + "doc/man3/RSA_get0_key.pod" + ], + "doc/man/man3/RSA_meth_new.3" => [ + "doc/man3/RSA_meth_new.pod" + ], + "doc/man/man3/RSA_new.3" => [ + "doc/man3/RSA_new.pod" + ], + "doc/man/man3/RSA_padding_add_PKCS1_type_1.3" => [ + "doc/man3/RSA_padding_add_PKCS1_type_1.pod" + ], + "doc/man/man3/RSA_print.3" => [ + "doc/man3/RSA_print.pod" + ], + "doc/man/man3/RSA_private_encrypt.3" => [ + "doc/man3/RSA_private_encrypt.pod" + ], + "doc/man/man3/RSA_public_encrypt.3" => [ + "doc/man3/RSA_public_encrypt.pod" + ], + "doc/man/man3/RSA_set_method.3" => [ + "doc/man3/RSA_set_method.pod" + ], + "doc/man/man3/RSA_sign.3" => [ + "doc/man3/RSA_sign.pod" + ], + "doc/man/man3/RSA_sign_ASN1_OCTET_STRING.3" => [ + "doc/man3/RSA_sign_ASN1_OCTET_STRING.pod" + ], + "doc/man/man3/RSA_size.3" => [ + "doc/man3/RSA_size.pod" + ], + "doc/man/man3/SCT_new.3" => [ + "doc/man3/SCT_new.pod" + ], + "doc/man/man3/SCT_print.3" => [ + "doc/man3/SCT_print.pod" + ], + "doc/man/man3/SCT_validate.3" => [ + "doc/man3/SCT_validate.pod" + ], + "doc/man/man3/SHA256_Init.3" => [ + "doc/man3/SHA256_Init.pod" + ], + "doc/man/man3/SMIME_read_ASN1.3" => [ + "doc/man3/SMIME_read_ASN1.pod" + ], + "doc/man/man3/SMIME_read_CMS.3" => [ + "doc/man3/SMIME_read_CMS.pod" + ], + "doc/man/man3/SMIME_read_PKCS7.3" => [ + "doc/man3/SMIME_read_PKCS7.pod" + ], + "doc/man/man3/SMIME_write_ASN1.3" => [ + "doc/man3/SMIME_write_ASN1.pod" + ], + "doc/man/man3/SMIME_write_CMS.3" => [ + "doc/man3/SMIME_write_CMS.pod" + ], + "doc/man/man3/SMIME_write_PKCS7.3" => [ + "doc/man3/SMIME_write_PKCS7.pod" + ], + "doc/man/man3/SRP_Calc_B.3" => [ + "doc/man3/SRP_Calc_B.pod" + ], + "doc/man/man3/SRP_VBASE_new.3" => [ + "doc/man3/SRP_VBASE_new.pod" + ], + "doc/man/man3/SRP_create_verifier.3" => [ + "doc/man3/SRP_create_verifier.pod" + ], + "doc/man/man3/SRP_user_pwd_new.3" => [ + "doc/man3/SRP_user_pwd_new.pod" + ], + "doc/man/man3/SSL_CIPHER_get_name.3" => [ + "doc/man3/SSL_CIPHER_get_name.pod" + ], + "doc/man/man3/SSL_COMP_add_compression_method.3" => [ + "doc/man3/SSL_COMP_add_compression_method.pod" + ], + "doc/man/man3/SSL_CONF_CTX_new.3" => [ + "doc/man3/SSL_CONF_CTX_new.pod" + ], + "doc/man/man3/SSL_CONF_CTX_set1_prefix.3" => [ + "doc/man3/SSL_CONF_CTX_set1_prefix.pod" + ], + "doc/man/man3/SSL_CONF_CTX_set_flags.3" => [ + "doc/man3/SSL_CONF_CTX_set_flags.pod" + ], + "doc/man/man3/SSL_CONF_CTX_set_ssl_ctx.3" => [ + "doc/man3/SSL_CONF_CTX_set_ssl_ctx.pod" + ], + "doc/man/man3/SSL_CONF_cmd.3" => [ + "doc/man3/SSL_CONF_cmd.pod" + ], + "doc/man/man3/SSL_CONF_cmd_argv.3" => [ + "doc/man3/SSL_CONF_cmd_argv.pod" + ], + "doc/man/man3/SSL_CTX_add1_chain_cert.3" => [ + "doc/man3/SSL_CTX_add1_chain_cert.pod" + ], + "doc/man/man3/SSL_CTX_add_extra_chain_cert.3" => [ + "doc/man3/SSL_CTX_add_extra_chain_cert.pod" + ], + "doc/man/man3/SSL_CTX_add_session.3" => [ + "doc/man3/SSL_CTX_add_session.pod" + ], + "doc/man/man3/SSL_CTX_config.3" => [ + "doc/man3/SSL_CTX_config.pod" + ], + "doc/man/man3/SSL_CTX_ctrl.3" => [ + "doc/man3/SSL_CTX_ctrl.pod" + ], + "doc/man/man3/SSL_CTX_dane_enable.3" => [ + "doc/man3/SSL_CTX_dane_enable.pod" + ], + "doc/man/man3/SSL_CTX_flush_sessions.3" => [ + "doc/man3/SSL_CTX_flush_sessions.pod" + ], + "doc/man/man3/SSL_CTX_free.3" => [ + "doc/man3/SSL_CTX_free.pod" + ], + "doc/man/man3/SSL_CTX_get0_param.3" => [ + "doc/man3/SSL_CTX_get0_param.pod" + ], + "doc/man/man3/SSL_CTX_get_verify_mode.3" => [ + "doc/man3/SSL_CTX_get_verify_mode.pod" + ], + "doc/man/man3/SSL_CTX_has_client_custom_ext.3" => [ + "doc/man3/SSL_CTX_has_client_custom_ext.pod" + ], + "doc/man/man3/SSL_CTX_load_verify_locations.3" => [ + "doc/man3/SSL_CTX_load_verify_locations.pod" + ], + "doc/man/man3/SSL_CTX_new.3" => [ + "doc/man3/SSL_CTX_new.pod" + ], + "doc/man/man3/SSL_CTX_sess_number.3" => [ + "doc/man3/SSL_CTX_sess_number.pod" + ], + "doc/man/man3/SSL_CTX_sess_set_cache_size.3" => [ + "doc/man3/SSL_CTX_sess_set_cache_size.pod" + ], + "doc/man/man3/SSL_CTX_sess_set_get_cb.3" => [ + "doc/man3/SSL_CTX_sess_set_get_cb.pod" + ], + "doc/man/man3/SSL_CTX_sessions.3" => [ + "doc/man3/SSL_CTX_sessions.pod" + ], + "doc/man/man3/SSL_CTX_set0_CA_list.3" => [ + "doc/man3/SSL_CTX_set0_CA_list.pod" + ], + "doc/man/man3/SSL_CTX_set1_cert_comp_preference.3" => [ + "doc/man3/SSL_CTX_set1_cert_comp_preference.pod" + ], + "doc/man/man3/SSL_CTX_set1_curves.3" => [ + "doc/man3/SSL_CTX_set1_curves.pod" + ], + "doc/man/man3/SSL_CTX_set1_sigalgs.3" => [ + "doc/man3/SSL_CTX_set1_sigalgs.pod" + ], + "doc/man/man3/SSL_CTX_set1_verify_cert_store.3" => [ + "doc/man3/SSL_CTX_set1_verify_cert_store.pod" + ], + "doc/man/man3/SSL_CTX_set_alpn_select_cb.3" => [ + "doc/man3/SSL_CTX_set_alpn_select_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_cert_cb.3" => [ + "doc/man3/SSL_CTX_set_cert_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_cert_store.3" => [ + "doc/man3/SSL_CTX_set_cert_store.pod" + ], + "doc/man/man3/SSL_CTX_set_cert_verify_callback.3" => [ + "doc/man3/SSL_CTX_set_cert_verify_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_cipher_list.3" => [ + "doc/man3/SSL_CTX_set_cipher_list.pod" + ], + "doc/man/man3/SSL_CTX_set_client_cert_cb.3" => [ + "doc/man3/SSL_CTX_set_client_cert_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_client_hello_cb.3" => [ + "doc/man3/SSL_CTX_set_client_hello_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_ct_validation_callback.3" => [ + "doc/man3/SSL_CTX_set_ct_validation_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_ctlog_list_file.3" => [ + "doc/man3/SSL_CTX_set_ctlog_list_file.pod" + ], + "doc/man/man3/SSL_CTX_set_default_passwd_cb.3" => [ + "doc/man3/SSL_CTX_set_default_passwd_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_domain_flags.3" => [ + "doc/man3/SSL_CTX_set_domain_flags.pod" + ], + "doc/man/man3/SSL_CTX_set_generate_session_id.3" => [ + "doc/man3/SSL_CTX_set_generate_session_id.pod" + ], + "doc/man/man3/SSL_CTX_set_info_callback.3" => [ + "doc/man3/SSL_CTX_set_info_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_keylog_callback.3" => [ + "doc/man3/SSL_CTX_set_keylog_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_max_cert_list.3" => [ + "doc/man3/SSL_CTX_set_max_cert_list.pod" + ], + "doc/man/man3/SSL_CTX_set_min_proto_version.3" => [ + "doc/man3/SSL_CTX_set_min_proto_version.pod" + ], + "doc/man/man3/SSL_CTX_set_mode.3" => [ + "doc/man3/SSL_CTX_set_mode.pod" + ], + "doc/man/man3/SSL_CTX_set_msg_callback.3" => [ + "doc/man3/SSL_CTX_set_msg_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_new_pending_conn_cb.3" => [ + "doc/man3/SSL_CTX_set_new_pending_conn_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_num_tickets.3" => [ + "doc/man3/SSL_CTX_set_num_tickets.pod" + ], + "doc/man/man3/SSL_CTX_set_options.3" => [ + "doc/man3/SSL_CTX_set_options.pod" + ], + "doc/man/man3/SSL_CTX_set_psk_client_callback.3" => [ + "doc/man3/SSL_CTX_set_psk_client_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_quiet_shutdown.3" => [ + "doc/man3/SSL_CTX_set_quiet_shutdown.pod" + ], + "doc/man/man3/SSL_CTX_set_read_ahead.3" => [ + "doc/man3/SSL_CTX_set_read_ahead.pod" + ], + "doc/man/man3/SSL_CTX_set_record_padding_callback.3" => [ + "doc/man3/SSL_CTX_set_record_padding_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_security_level.3" => [ + "doc/man3/SSL_CTX_set_security_level.pod" + ], + "doc/man/man3/SSL_CTX_set_session_cache_mode.3" => [ + "doc/man3/SSL_CTX_set_session_cache_mode.pod" + ], + "doc/man/man3/SSL_CTX_set_session_id_context.3" => [ + "doc/man3/SSL_CTX_set_session_id_context.pod" + ], + "doc/man/man3/SSL_CTX_set_session_ticket_cb.3" => [ + "doc/man3/SSL_CTX_set_session_ticket_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_split_send_fragment.3" => [ + "doc/man3/SSL_CTX_set_split_send_fragment.pod" + ], + "doc/man/man3/SSL_CTX_set_srp_password.3" => [ + "doc/man3/SSL_CTX_set_srp_password.pod" + ], + "doc/man/man3/SSL_CTX_set_ssl_version.3" => [ + "doc/man3/SSL_CTX_set_ssl_version.pod" + ], + "doc/man/man3/SSL_CTX_set_stateless_cookie_generate_cb.3" => [ + "doc/man3/SSL_CTX_set_stateless_cookie_generate_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_timeout.3" => [ + "doc/man3/SSL_CTX_set_timeout.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_servername_callback.3" => [ + "doc/man3/SSL_CTX_set_tlsext_servername_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_status_cb.3" => [ + "doc/man3/SSL_CTX_set_tlsext_status_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_ticket_key_cb.3" => [ + "doc/man3/SSL_CTX_set_tlsext_ticket_key_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_use_srtp.3" => [ + "doc/man3/SSL_CTX_set_tlsext_use_srtp.pod" + ], + "doc/man/man3/SSL_CTX_set_tmp_dh_callback.3" => [ + "doc/man3/SSL_CTX_set_tmp_dh_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_tmp_ecdh.3" => [ + "doc/man3/SSL_CTX_set_tmp_ecdh.pod" + ], + "doc/man/man3/SSL_CTX_set_verify.3" => [ + "doc/man3/SSL_CTX_set_verify.pod" + ], + "doc/man/man3/SSL_CTX_use_certificate.3" => [ + "doc/man3/SSL_CTX_use_certificate.pod" + ], + "doc/man/man3/SSL_CTX_use_psk_identity_hint.3" => [ + "doc/man3/SSL_CTX_use_psk_identity_hint.pod" + ], + "doc/man/man3/SSL_CTX_use_serverinfo.3" => [ + "doc/man3/SSL_CTX_use_serverinfo.pod" + ], + "doc/man/man3/SSL_SESSION_free.3" => [ + "doc/man3/SSL_SESSION_free.pod" + ], + "doc/man/man3/SSL_SESSION_get0_cipher.3" => [ + "doc/man3/SSL_SESSION_get0_cipher.pod" + ], + "doc/man/man3/SSL_SESSION_get0_hostname.3" => [ + "doc/man3/SSL_SESSION_get0_hostname.pod" + ], + "doc/man/man3/SSL_SESSION_get0_id_context.3" => [ + "doc/man3/SSL_SESSION_get0_id_context.pod" + ], + "doc/man/man3/SSL_SESSION_get0_peer.3" => [ + "doc/man3/SSL_SESSION_get0_peer.pod" + ], + "doc/man/man3/SSL_SESSION_get_compress_id.3" => [ + "doc/man3/SSL_SESSION_get_compress_id.pod" + ], + "doc/man/man3/SSL_SESSION_get_protocol_version.3" => [ + "doc/man3/SSL_SESSION_get_protocol_version.pod" + ], + "doc/man/man3/SSL_SESSION_get_time.3" => [ + "doc/man3/SSL_SESSION_get_time.pod" + ], + "doc/man/man3/SSL_SESSION_has_ticket.3" => [ + "doc/man3/SSL_SESSION_has_ticket.pod" + ], + "doc/man/man3/SSL_SESSION_is_resumable.3" => [ + "doc/man3/SSL_SESSION_is_resumable.pod" + ], + "doc/man/man3/SSL_SESSION_print.3" => [ + "doc/man3/SSL_SESSION_print.pod" + ], + "doc/man/man3/SSL_SESSION_set1_id.3" => [ + "doc/man3/SSL_SESSION_set1_id.pod" + ], + "doc/man/man3/SSL_accept.3" => [ + "doc/man3/SSL_accept.pod" + ], + "doc/man/man3/SSL_accept_stream.3" => [ + "doc/man3/SSL_accept_stream.pod" + ], + "doc/man/man3/SSL_alert_type_string.3" => [ + "doc/man3/SSL_alert_type_string.pod" + ], + "doc/man/man3/SSL_alloc_buffers.3" => [ + "doc/man3/SSL_alloc_buffers.pod" + ], + "doc/man/man3/SSL_check_chain.3" => [ + "doc/man3/SSL_check_chain.pod" + ], + "doc/man/man3/SSL_clear.3" => [ + "doc/man3/SSL_clear.pod" + ], + "doc/man/man3/SSL_connect.3" => [ + "doc/man3/SSL_connect.pod" + ], + "doc/man/man3/SSL_do_handshake.3" => [ + "doc/man3/SSL_do_handshake.pod" + ], + "doc/man/man3/SSL_export_keying_material.3" => [ + "doc/man3/SSL_export_keying_material.pod" + ], + "doc/man/man3/SSL_extension_supported.3" => [ + "doc/man3/SSL_extension_supported.pod" + ], + "doc/man/man3/SSL_free.3" => [ + "doc/man3/SSL_free.pod" + ], + "doc/man/man3/SSL_get0_connection.3" => [ + "doc/man3/SSL_get0_connection.pod" + ], + "doc/man/man3/SSL_get0_group_name.3" => [ + "doc/man3/SSL_get0_group_name.pod" + ], + "doc/man/man3/SSL_get0_peer_rpk.3" => [ + "doc/man3/SSL_get0_peer_rpk.pod" + ], + "doc/man/man3/SSL_get0_peer_scts.3" => [ + "doc/man3/SSL_get0_peer_scts.pod" + ], + "doc/man/man3/SSL_get1_builtin_sigalgs.3" => [ + "doc/man3/SSL_get1_builtin_sigalgs.pod" + ], + "doc/man/man3/SSL_get_SSL_CTX.3" => [ + "doc/man3/SSL_get_SSL_CTX.pod" + ], + "doc/man/man3/SSL_get_all_async_fds.3" => [ + "doc/man3/SSL_get_all_async_fds.pod" + ], + "doc/man/man3/SSL_get_certificate.3" => [ + "doc/man3/SSL_get_certificate.pod" + ], + "doc/man/man3/SSL_get_ciphers.3" => [ + "doc/man3/SSL_get_ciphers.pod" + ], + "doc/man/man3/SSL_get_client_random.3" => [ + "doc/man3/SSL_get_client_random.pod" + ], + "doc/man/man3/SSL_get_conn_close_info.3" => [ + "doc/man3/SSL_get_conn_close_info.pod" + ], + "doc/man/man3/SSL_get_current_cipher.3" => [ + "doc/man3/SSL_get_current_cipher.pod" + ], + "doc/man/man3/SSL_get_default_timeout.3" => [ + "doc/man3/SSL_get_default_timeout.pod" + ], + "doc/man/man3/SSL_get_error.3" => [ + "doc/man3/SSL_get_error.pod" + ], + "doc/man/man3/SSL_get_event_timeout.3" => [ + "doc/man3/SSL_get_event_timeout.pod" + ], + "doc/man/man3/SSL_get_extms_support.3" => [ + "doc/man3/SSL_get_extms_support.pod" + ], + "doc/man/man3/SSL_get_fd.3" => [ + "doc/man3/SSL_get_fd.pod" + ], + "doc/man/man3/SSL_get_handshake_rtt.3" => [ + "doc/man3/SSL_get_handshake_rtt.pod" + ], + "doc/man/man3/SSL_get_peer_cert_chain.3" => [ + "doc/man3/SSL_get_peer_cert_chain.pod" + ], + "doc/man/man3/SSL_get_peer_certificate.3" => [ + "doc/man3/SSL_get_peer_certificate.pod" + ], + "doc/man/man3/SSL_get_peer_signature_nid.3" => [ + "doc/man3/SSL_get_peer_signature_nid.pod" + ], + "doc/man/man3/SSL_get_peer_tmp_key.3" => [ + "doc/man3/SSL_get_peer_tmp_key.pod" + ], + "doc/man/man3/SSL_get_psk_identity.3" => [ + "doc/man3/SSL_get_psk_identity.pod" + ], + "doc/man/man3/SSL_get_rbio.3" => [ + "doc/man3/SSL_get_rbio.pod" + ], + "doc/man/man3/SSL_get_rpoll_descriptor.3" => [ + "doc/man3/SSL_get_rpoll_descriptor.pod" + ], + "doc/man/man3/SSL_get_session.3" => [ + "doc/man3/SSL_get_session.pod" + ], + "doc/man/man3/SSL_get_shared_sigalgs.3" => [ + "doc/man3/SSL_get_shared_sigalgs.pod" + ], + "doc/man/man3/SSL_get_stream_id.3" => [ + "doc/man3/SSL_get_stream_id.pod" + ], + "doc/man/man3/SSL_get_stream_read_state.3" => [ + "doc/man3/SSL_get_stream_read_state.pod" + ], + "doc/man/man3/SSL_get_value_uint.3" => [ + "doc/man3/SSL_get_value_uint.pod" + ], + "doc/man/man3/SSL_get_verify_result.3" => [ + "doc/man3/SSL_get_verify_result.pod" + ], + "doc/man/man3/SSL_get_version.3" => [ + "doc/man3/SSL_get_version.pod" + ], + "doc/man/man3/SSL_group_to_name.3" => [ + "doc/man3/SSL_group_to_name.pod" + ], + "doc/man/man3/SSL_handle_events.3" => [ + "doc/man3/SSL_handle_events.pod" + ], + "doc/man/man3/SSL_in_init.3" => [ + "doc/man3/SSL_in_init.pod" + ], + "doc/man/man3/SSL_inject_net_dgram.3" => [ + "doc/man3/SSL_inject_net_dgram.pod" + ], + "doc/man/man3/SSL_key_update.3" => [ + "doc/man3/SSL_key_update.pod" + ], + "doc/man/man3/SSL_library_init.3" => [ + "doc/man3/SSL_library_init.pod" + ], + "doc/man/man3/SSL_load_client_CA_file.3" => [ + "doc/man3/SSL_load_client_CA_file.pod" + ], + "doc/man/man3/SSL_new.3" => [ + "doc/man3/SSL_new.pod" + ], + "doc/man/man3/SSL_new_domain.3" => [ + "doc/man3/SSL_new_domain.pod" + ], + "doc/man/man3/SSL_new_listener.3" => [ + "doc/man3/SSL_new_listener.pod" + ], + "doc/man/man3/SSL_new_stream.3" => [ + "doc/man3/SSL_new_stream.pod" + ], + "doc/man/man3/SSL_pending.3" => [ + "doc/man3/SSL_pending.pod" + ], + "doc/man/man3/SSL_poll.3" => [ + "doc/man3/SSL_poll.pod" + ], + "doc/man/man3/SSL_read.3" => [ + "doc/man3/SSL_read.pod" + ], + "doc/man/man3/SSL_read_early_data.3" => [ + "doc/man3/SSL_read_early_data.pod" + ], + "doc/man/man3/SSL_rstate_string.3" => [ + "doc/man3/SSL_rstate_string.pod" + ], + "doc/man/man3/SSL_session_reused.3" => [ + "doc/man3/SSL_session_reused.pod" + ], + "doc/man/man3/SSL_set1_host.3" => [ + "doc/man3/SSL_set1_host.pod" + ], + "doc/man/man3/SSL_set1_initial_peer_addr.3" => [ + "doc/man3/SSL_set1_initial_peer_addr.pod" + ], + "doc/man/man3/SSL_set1_server_cert_type.3" => [ + "doc/man3/SSL_set1_server_cert_type.pod" + ], + "doc/man/man3/SSL_set_async_callback.3" => [ + "doc/man3/SSL_set_async_callback.pod" + ], + "doc/man/man3/SSL_set_bio.3" => [ + "doc/man3/SSL_set_bio.pod" + ], + "doc/man/man3/SSL_set_blocking_mode.3" => [ + "doc/man3/SSL_set_blocking_mode.pod" + ], + "doc/man/man3/SSL_set_connect_state.3" => [ + "doc/man3/SSL_set_connect_state.pod" + ], + "doc/man/man3/SSL_set_default_stream_mode.3" => [ + "doc/man3/SSL_set_default_stream_mode.pod" + ], + "doc/man/man3/SSL_set_fd.3" => [ + "doc/man3/SSL_set_fd.pod" + ], + "doc/man/man3/SSL_set_incoming_stream_policy.3" => [ + "doc/man3/SSL_set_incoming_stream_policy.pod" + ], + "doc/man/man3/SSL_set_quic_tls_cbs.3" => [ + "doc/man3/SSL_set_quic_tls_cbs.pod" + ], + "doc/man/man3/SSL_set_retry_verify.3" => [ + "doc/man3/SSL_set_retry_verify.pod" + ], + "doc/man/man3/SSL_set_session.3" => [ + "doc/man3/SSL_set_session.pod" + ], + "doc/man/man3/SSL_set_session_secret_cb.3" => [ + "doc/man3/SSL_set_session_secret_cb.pod" + ], + "doc/man/man3/SSL_set_shutdown.3" => [ + "doc/man3/SSL_set_shutdown.pod" + ], + "doc/man/man3/SSL_set_verify_result.3" => [ + "doc/man3/SSL_set_verify_result.pod" + ], + "doc/man/man3/SSL_shutdown.3" => [ + "doc/man3/SSL_shutdown.pod" + ], + "doc/man/man3/SSL_state_string.3" => [ + "doc/man3/SSL_state_string.pod" + ], + "doc/man/man3/SSL_stream_conclude.3" => [ + "doc/man3/SSL_stream_conclude.pod" + ], + "doc/man/man3/SSL_stream_reset.3" => [ + "doc/man3/SSL_stream_reset.pod" + ], + "doc/man/man3/SSL_want.3" => [ + "doc/man3/SSL_want.pod" + ], + "doc/man/man3/SSL_write.3" => [ + "doc/man3/SSL_write.pod" + ], + "doc/man/man3/TS_RESP_CTX_new.3" => [ + "doc/man3/TS_RESP_CTX_new.pod" + ], + "doc/man/man3/TS_VERIFY_CTX.3" => [ + "doc/man3/TS_VERIFY_CTX.pod" + ], + "doc/man/man3/UI_STRING.3" => [ + "doc/man3/UI_STRING.pod" + ], + "doc/man/man3/UI_UTIL_read_pw.3" => [ + "doc/man3/UI_UTIL_read_pw.pod" + ], + "doc/man/man3/UI_create_method.3" => [ + "doc/man3/UI_create_method.pod" + ], + "doc/man/man3/UI_new.3" => [ + "doc/man3/UI_new.pod" + ], + "doc/man/man3/X509V3_EXT_print.3" => [ + "doc/man3/X509V3_EXT_print.pod" + ], + "doc/man/man3/X509V3_get_d2i.3" => [ + "doc/man3/X509V3_get_d2i.pod" + ], + "doc/man/man3/X509V3_set_ctx.3" => [ + "doc/man3/X509V3_set_ctx.pod" + ], + "doc/man/man3/X509_ACERT_add1_attr.3" => [ + "doc/man3/X509_ACERT_add1_attr.pod" + ], + "doc/man/man3/X509_ACERT_add_attr_nconf.3" => [ + "doc/man3/X509_ACERT_add_attr_nconf.pod" + ], + "doc/man/man3/X509_ACERT_get0_holder_baseCertId.3" => [ + "doc/man3/X509_ACERT_get0_holder_baseCertId.pod" + ], + "doc/man/man3/X509_ACERT_get_attr.3" => [ + "doc/man3/X509_ACERT_get_attr.pod" + ], + "doc/man/man3/X509_ACERT_print_ex.3" => [ + "doc/man3/X509_ACERT_print_ex.pod" + ], + "doc/man/man3/X509_ALGOR_dup.3" => [ + "doc/man3/X509_ALGOR_dup.pod" + ], + "doc/man/man3/X509_ATTRIBUTE.3" => [ + "doc/man3/X509_ATTRIBUTE.pod" + ], + "doc/man/man3/X509_CRL_get0_by_serial.3" => [ + "doc/man3/X509_CRL_get0_by_serial.pod" + ], + "doc/man/man3/X509_EXTENSION_set_object.3" => [ + "doc/man3/X509_EXTENSION_set_object.pod" + ], + "doc/man/man3/X509_LOOKUP.3" => [ + "doc/man3/X509_LOOKUP.pod" + ], + "doc/man/man3/X509_LOOKUP_hash_dir.3" => [ + "doc/man3/X509_LOOKUP_hash_dir.pod" + ], + "doc/man/man3/X509_LOOKUP_meth_new.3" => [ + "doc/man3/X509_LOOKUP_meth_new.pod" + ], + "doc/man/man3/X509_NAME_ENTRY_get_object.3" => [ + "doc/man3/X509_NAME_ENTRY_get_object.pod" + ], + "doc/man/man3/X509_NAME_add_entry_by_txt.3" => [ + "doc/man3/X509_NAME_add_entry_by_txt.pod" + ], + "doc/man/man3/X509_NAME_get0_der.3" => [ + "doc/man3/X509_NAME_get0_der.pod" + ], + "doc/man/man3/X509_NAME_get_index_by_NID.3" => [ + "doc/man3/X509_NAME_get_index_by_NID.pod" + ], + "doc/man/man3/X509_NAME_print_ex.3" => [ + "doc/man3/X509_NAME_print_ex.pod" + ], + "doc/man/man3/X509_PUBKEY_new.3" => [ + "doc/man3/X509_PUBKEY_new.pod" + ], + "doc/man/man3/X509_REQ_get_attr.3" => [ + "doc/man3/X509_REQ_get_attr.pod" + ], + "doc/man/man3/X509_REQ_get_extensions.3" => [ + "doc/man3/X509_REQ_get_extensions.pod" + ], + "doc/man/man3/X509_SIG_get0.3" => [ + "doc/man3/X509_SIG_get0.pod" + ], + "doc/man/man3/X509_STORE_CTX_get_by_subject.3" => [ + "doc/man3/X509_STORE_CTX_get_by_subject.pod" + ], + "doc/man/man3/X509_STORE_CTX_get_error.3" => [ + "doc/man3/X509_STORE_CTX_get_error.pod" + ], + "doc/man/man3/X509_STORE_CTX_new.3" => [ + "doc/man3/X509_STORE_CTX_new.pod" + ], + "doc/man/man3/X509_STORE_CTX_set_verify_cb.3" => [ + "doc/man3/X509_STORE_CTX_set_verify_cb.pod" + ], + "doc/man/man3/X509_STORE_add_cert.3" => [ + "doc/man3/X509_STORE_add_cert.pod" + ], + "doc/man/man3/X509_STORE_get0_param.3" => [ + "doc/man3/X509_STORE_get0_param.pod" + ], + "doc/man/man3/X509_STORE_new.3" => [ + "doc/man3/X509_STORE_new.pod" + ], + "doc/man/man3/X509_STORE_set_verify_cb_func.3" => [ + "doc/man3/X509_STORE_set_verify_cb_func.pod" + ], + "doc/man/man3/X509_VERIFY_PARAM_set_flags.3" => [ + "doc/man3/X509_VERIFY_PARAM_set_flags.pod" + ], + "doc/man/man3/X509_add_cert.3" => [ + "doc/man3/X509_add_cert.pod" + ], + "doc/man/man3/X509_check_ca.3" => [ + "doc/man3/X509_check_ca.pod" + ], + "doc/man/man3/X509_check_host.3" => [ + "doc/man3/X509_check_host.pod" + ], + "doc/man/man3/X509_check_issued.3" => [ + "doc/man3/X509_check_issued.pod" + ], + "doc/man/man3/X509_check_private_key.3" => [ + "doc/man3/X509_check_private_key.pod" + ], + "doc/man/man3/X509_check_purpose.3" => [ + "doc/man3/X509_check_purpose.pod" + ], + "doc/man/man3/X509_cmp.3" => [ + "doc/man3/X509_cmp.pod" + ], + "doc/man/man3/X509_cmp_time.3" => [ + "doc/man3/X509_cmp_time.pod" + ], + "doc/man/man3/X509_digest.3" => [ + "doc/man3/X509_digest.pod" + ], + "doc/man/man3/X509_dup.3" => [ + "doc/man3/X509_dup.pod" + ], + "doc/man/man3/X509_get0_distinguishing_id.3" => [ + "doc/man3/X509_get0_distinguishing_id.pod" + ], + "doc/man/man3/X509_get0_notBefore.3" => [ + "doc/man3/X509_get0_notBefore.pod" + ], + "doc/man/man3/X509_get0_signature.3" => [ + "doc/man3/X509_get0_signature.pod" + ], + "doc/man/man3/X509_get0_uids.3" => [ + "doc/man3/X509_get0_uids.pod" + ], + "doc/man/man3/X509_get_default_cert_file.3" => [ + "doc/man3/X509_get_default_cert_file.pod" + ], + "doc/man/man3/X509_get_extension_flags.3" => [ + "doc/man3/X509_get_extension_flags.pod" + ], + "doc/man/man3/X509_get_pubkey.3" => [ + "doc/man3/X509_get_pubkey.pod" + ], + "doc/man/man3/X509_get_serialNumber.3" => [ + "doc/man3/X509_get_serialNumber.pod" + ], + "doc/man/man3/X509_get_subject_name.3" => [ + "doc/man3/X509_get_subject_name.pod" + ], + "doc/man/man3/X509_get_version.3" => [ + "doc/man3/X509_get_version.pod" + ], + "doc/man/man3/X509_load_http.3" => [ + "doc/man3/X509_load_http.pod" + ], + "doc/man/man3/X509_new.3" => [ + "doc/man3/X509_new.pod" + ], + "doc/man/man3/X509_sign.3" => [ + "doc/man3/X509_sign.pod" + ], + "doc/man/man3/X509_verify.3" => [ + "doc/man3/X509_verify.pod" + ], + "doc/man/man3/X509_verify_cert.3" => [ + "doc/man3/X509_verify_cert.pod" + ], + "doc/man/man3/X509v3_get_ext_by_NID.3" => [ + "doc/man3/X509v3_get_ext_by_NID.pod" + ], + "doc/man/man3/b2i_PVK_bio_ex.3" => [ + "doc/man3/b2i_PVK_bio_ex.pod" + ], + "doc/man/man3/d2i_PKCS8PrivateKey_bio.3" => [ + "doc/man3/d2i_PKCS8PrivateKey_bio.pod" + ], + "doc/man/man3/d2i_PrivateKey.3" => [ + "doc/man3/d2i_PrivateKey.pod" + ], + "doc/man/man3/d2i_RSAPrivateKey.3" => [ + "doc/man3/d2i_RSAPrivateKey.pod" + ], + "doc/man/man3/d2i_SSL_SESSION.3" => [ + "doc/man3/d2i_SSL_SESSION.pod" + ], + "doc/man/man3/d2i_X509.3" => [ + "doc/man3/d2i_X509.pod" + ], + "doc/man/man3/i2d_CMS_bio_stream.3" => [ + "doc/man3/i2d_CMS_bio_stream.pod" + ], + "doc/man/man3/i2d_PKCS7_bio_stream.3" => [ + "doc/man3/i2d_PKCS7_bio_stream.pod" + ], + "doc/man/man3/i2d_re_X509_tbs.3" => [ + "doc/man3/i2d_re_X509_tbs.pod" + ], + "doc/man/man3/o2i_SCT_LIST.3" => [ + "doc/man3/o2i_SCT_LIST.pod" + ], + "doc/man/man3/s2i_ASN1_IA5STRING.3" => [ + "doc/man3/s2i_ASN1_IA5STRING.pod" + ], + "doc/man/man5/config.5" => [ + "doc/man5/config.pod" + ], + "doc/man/man5/fips_config.5" => [ + "doc/man5/fips_config.pod" + ], + "doc/man/man5/x509v3_config.5" => [ + "doc/man5/x509v3_config.pod" + ], + "doc/man/man7/EVP_ASYM_CIPHER-RSA.7" => [ + "doc/man7/EVP_ASYM_CIPHER-RSA.pod" + ], + "doc/man/man7/EVP_ASYM_CIPHER-SM2.7" => [ + "doc/man7/EVP_ASYM_CIPHER-SM2.pod" + ], + "doc/man/man7/EVP_CIPHER-AES.7" => [ + "doc/man7/EVP_CIPHER-AES.pod" + ], + "doc/man/man7/EVP_CIPHER-ARIA.7" => [ + "doc/man7/EVP_CIPHER-ARIA.pod" + ], + "doc/man/man7/EVP_CIPHER-BLOWFISH.7" => [ + "doc/man7/EVP_CIPHER-BLOWFISH.pod" + ], + "doc/man/man7/EVP_CIPHER-CAMELLIA.7" => [ + "doc/man7/EVP_CIPHER-CAMELLIA.pod" + ], + "doc/man/man7/EVP_CIPHER-CAST.7" => [ + "doc/man7/EVP_CIPHER-CAST.pod" + ], + "doc/man/man7/EVP_CIPHER-CHACHA.7" => [ + "doc/man7/EVP_CIPHER-CHACHA.pod" + ], + "doc/man/man7/EVP_CIPHER-DES.7" => [ + "doc/man7/EVP_CIPHER-DES.pod" + ], + "doc/man/man7/EVP_CIPHER-IDEA.7" => [ + "doc/man7/EVP_CIPHER-IDEA.pod" + ], + "doc/man/man7/EVP_CIPHER-NULL.7" => [ + "doc/man7/EVP_CIPHER-NULL.pod" + ], + "doc/man/man7/EVP_CIPHER-RC2.7" => [ + "doc/man7/EVP_CIPHER-RC2.pod" + ], + "doc/man/man7/EVP_CIPHER-RC4.7" => [ + "doc/man7/EVP_CIPHER-RC4.pod" + ], + "doc/man/man7/EVP_CIPHER-RC5.7" => [ + "doc/man7/EVP_CIPHER-RC5.pod" + ], + "doc/man/man7/EVP_CIPHER-SEED.7" => [ + "doc/man7/EVP_CIPHER-SEED.pod" + ], + "doc/man/man7/EVP_CIPHER-SM4.7" => [ + "doc/man7/EVP_CIPHER-SM4.pod" + ], + "doc/man/man7/EVP_KDF-ARGON2.7" => [ + "doc/man7/EVP_KDF-ARGON2.pod" + ], + "doc/man/man7/EVP_KDF-HKDF.7" => [ + "doc/man7/EVP_KDF-HKDF.pod" + ], + "doc/man/man7/EVP_KDF-HMAC-DRBG.7" => [ + "doc/man7/EVP_KDF-HMAC-DRBG.pod" + ], + "doc/man/man7/EVP_KDF-KB.7" => [ + "doc/man7/EVP_KDF-KB.pod" + ], + "doc/man/man7/EVP_KDF-KRB5KDF.7" => [ + "doc/man7/EVP_KDF-KRB5KDF.pod" + ], + "doc/man/man7/EVP_KDF-PBKDF1.7" => [ + "doc/man7/EVP_KDF-PBKDF1.pod" + ], + "doc/man/man7/EVP_KDF-PBKDF2.7" => [ + "doc/man7/EVP_KDF-PBKDF2.pod" + ], + "doc/man/man7/EVP_KDF-PKCS12KDF.7" => [ + "doc/man7/EVP_KDF-PKCS12KDF.pod" + ], + "doc/man/man7/EVP_KDF-PVKKDF.7" => [ + "doc/man7/EVP_KDF-PVKKDF.pod" + ], + "doc/man/man7/EVP_KDF-SCRYPT.7" => [ + "doc/man7/EVP_KDF-SCRYPT.pod" + ], + "doc/man/man7/EVP_KDF-SS.7" => [ + "doc/man7/EVP_KDF-SS.pod" + ], + "doc/man/man7/EVP_KDF-SSHKDF.7" => [ + "doc/man7/EVP_KDF-SSHKDF.pod" + ], + "doc/man/man7/EVP_KDF-TLS13_KDF.7" => [ + "doc/man7/EVP_KDF-TLS13_KDF.pod" + ], + "doc/man/man7/EVP_KDF-TLS1_PRF.7" => [ + "doc/man7/EVP_KDF-TLS1_PRF.pod" + ], + "doc/man/man7/EVP_KDF-X942-ASN1.7" => [ + "doc/man7/EVP_KDF-X942-ASN1.pod" + ], + "doc/man/man7/EVP_KDF-X942-CONCAT.7" => [ + "doc/man7/EVP_KDF-X942-CONCAT.pod" + ], + "doc/man/man7/EVP_KDF-X963.7" => [ + "doc/man7/EVP_KDF-X963.pod" + ], + "doc/man/man7/EVP_KEM-EC.7" => [ + "doc/man7/EVP_KEM-EC.pod" + ], + "doc/man/man7/EVP_KEM-ML-KEM.7" => [ + "doc/man7/EVP_KEM-ML-KEM.pod" + ], + "doc/man/man7/EVP_KEM-RSA.7" => [ + "doc/man7/EVP_KEM-RSA.pod" + ], + "doc/man/man7/EVP_KEM-X25519.7" => [ + "doc/man7/EVP_KEM-X25519.pod" + ], + "doc/man/man7/EVP_KEYEXCH-DH.7" => [ + "doc/man7/EVP_KEYEXCH-DH.pod" + ], + "doc/man/man7/EVP_KEYEXCH-ECDH.7" => [ + "doc/man7/EVP_KEYEXCH-ECDH.pod" + ], + "doc/man/man7/EVP_KEYEXCH-X25519.7" => [ + "doc/man7/EVP_KEYEXCH-X25519.pod" + ], + "doc/man/man7/EVP_MAC-BLAKE2.7" => [ + "doc/man7/EVP_MAC-BLAKE2.pod" + ], + "doc/man/man7/EVP_MAC-CMAC.7" => [ + "doc/man7/EVP_MAC-CMAC.pod" + ], + "doc/man/man7/EVP_MAC-GMAC.7" => [ + "doc/man7/EVP_MAC-GMAC.pod" + ], + "doc/man/man7/EVP_MAC-HMAC.7" => [ + "doc/man7/EVP_MAC-HMAC.pod" + ], + "doc/man/man7/EVP_MAC-KMAC.7" => [ + "doc/man7/EVP_MAC-KMAC.pod" + ], + "doc/man/man7/EVP_MAC-Poly1305.7" => [ + "doc/man7/EVP_MAC-Poly1305.pod" + ], + "doc/man/man7/EVP_MAC-Siphash.7" => [ + "doc/man7/EVP_MAC-Siphash.pod" + ], + "doc/man/man7/EVP_MD-BLAKE2.7" => [ + "doc/man7/EVP_MD-BLAKE2.pod" + ], + "doc/man/man7/EVP_MD-KECCAK.7" => [ + "doc/man7/EVP_MD-KECCAK.pod" + ], + "doc/man/man7/EVP_MD-MD2.7" => [ + "doc/man7/EVP_MD-MD2.pod" + ], + "doc/man/man7/EVP_MD-MD4.7" => [ + "doc/man7/EVP_MD-MD4.pod" + ], + "doc/man/man7/EVP_MD-MD5-SHA1.7" => [ + "doc/man7/EVP_MD-MD5-SHA1.pod" + ], + "doc/man/man7/EVP_MD-MD5.7" => [ + "doc/man7/EVP_MD-MD5.pod" + ], + "doc/man/man7/EVP_MD-MDC2.7" => [ + "doc/man7/EVP_MD-MDC2.pod" + ], + "doc/man/man7/EVP_MD-NULL.7" => [ + "doc/man7/EVP_MD-NULL.pod" + ], + "doc/man/man7/EVP_MD-RIPEMD160.7" => [ + "doc/man7/EVP_MD-RIPEMD160.pod" + ], + "doc/man/man7/EVP_MD-SHA1.7" => [ + "doc/man7/EVP_MD-SHA1.pod" + ], + "doc/man/man7/EVP_MD-SHA2.7" => [ + "doc/man7/EVP_MD-SHA2.pod" + ], + "doc/man/man7/EVP_MD-SHA3.7" => [ + "doc/man7/EVP_MD-SHA3.pod" + ], + "doc/man/man7/EVP_MD-SHAKE.7" => [ + "doc/man7/EVP_MD-SHAKE.pod" + ], + "doc/man/man7/EVP_MD-SM3.7" => [ + "doc/man7/EVP_MD-SM3.pod" + ], + "doc/man/man7/EVP_MD-WHIRLPOOL.7" => [ + "doc/man7/EVP_MD-WHIRLPOOL.pod" + ], + "doc/man/man7/EVP_MD-common.7" => [ + "doc/man7/EVP_MD-common.pod" + ], + "doc/man/man7/EVP_PKEY-DH.7" => [ + "doc/man7/EVP_PKEY-DH.pod" + ], + "doc/man/man7/EVP_PKEY-DSA.7" => [ + "doc/man7/EVP_PKEY-DSA.pod" + ], + "doc/man/man7/EVP_PKEY-EC.7" => [ + "doc/man7/EVP_PKEY-EC.pod" + ], + "doc/man/man7/EVP_PKEY-FFC.7" => [ + "doc/man7/EVP_PKEY-FFC.pod" + ], + "doc/man/man7/EVP_PKEY-HMAC.7" => [ + "doc/man7/EVP_PKEY-HMAC.pod" + ], + "doc/man/man7/EVP_PKEY-ML-DSA.7" => [ + "doc/man7/EVP_PKEY-ML-DSA.pod" + ], + "doc/man/man7/EVP_PKEY-ML-KEM.7" => [ + "doc/man7/EVP_PKEY-ML-KEM.pod" + ], + "doc/man/man7/EVP_PKEY-RSA.7" => [ + "doc/man7/EVP_PKEY-RSA.pod" + ], + "doc/man/man7/EVP_PKEY-SLH-DSA.7" => [ + "doc/man7/EVP_PKEY-SLH-DSA.pod" + ], + "doc/man/man7/EVP_PKEY-SM2.7" => [ + "doc/man7/EVP_PKEY-SM2.pod" + ], + "doc/man/man7/EVP_PKEY-X25519.7" => [ + "doc/man7/EVP_PKEY-X25519.pod" + ], + "doc/man/man7/EVP_RAND-CRNG-TEST.7" => [ + "doc/man7/EVP_RAND-CRNG-TEST.pod" + ], + "doc/man/man7/EVP_RAND-CTR-DRBG.7" => [ + "doc/man7/EVP_RAND-CTR-DRBG.pod" + ], + "doc/man/man7/EVP_RAND-HASH-DRBG.7" => [ + "doc/man7/EVP_RAND-HASH-DRBG.pod" + ], + "doc/man/man7/EVP_RAND-HMAC-DRBG.7" => [ + "doc/man7/EVP_RAND-HMAC-DRBG.pod" + ], + "doc/man/man7/EVP_RAND-JITTER.7" => [ + "doc/man7/EVP_RAND-JITTER.pod" + ], + "doc/man/man7/EVP_RAND-SEED-SRC.7" => [ + "doc/man7/EVP_RAND-SEED-SRC.pod" + ], + "doc/man/man7/EVP_RAND-TEST-RAND.7" => [ + "doc/man7/EVP_RAND-TEST-RAND.pod" + ], + "doc/man/man7/EVP_RAND.7" => [ + "doc/man7/EVP_RAND.pod" + ], + "doc/man/man7/EVP_SIGNATURE-DSA.7" => [ + "doc/man7/EVP_SIGNATURE-DSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-ECDSA.7" => [ + "doc/man7/EVP_SIGNATURE-ECDSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-ED25519.7" => [ + "doc/man7/EVP_SIGNATURE-ED25519.pod" + ], + "doc/man/man7/EVP_SIGNATURE-HMAC.7" => [ + "doc/man7/EVP_SIGNATURE-HMAC.pod" + ], + "doc/man/man7/EVP_SIGNATURE-ML-DSA.7" => [ + "doc/man7/EVP_SIGNATURE-ML-DSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-RSA.7" => [ + "doc/man7/EVP_SIGNATURE-RSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-SLH-DSA.7" => [ + "doc/man7/EVP_SIGNATURE-SLH-DSA.pod" + ], + "doc/man/man7/OSSL_PROVIDER-FIPS.7" => [ + "doc/man7/OSSL_PROVIDER-FIPS.pod" + ], + "doc/man/man7/OSSL_PROVIDER-base.7" => [ + "doc/man7/OSSL_PROVIDER-base.pod" + ], + "doc/man/man7/OSSL_PROVIDER-default.7" => [ + "doc/man7/OSSL_PROVIDER-default.pod" + ], + "doc/man/man7/OSSL_PROVIDER-legacy.7" => [ + "doc/man7/OSSL_PROVIDER-legacy.pod" + ], + "doc/man/man7/OSSL_PROVIDER-null.7" => [ + "doc/man7/OSSL_PROVIDER-null.pod" + ], + "doc/man/man7/OSSL_STORE-winstore.7" => [ + "doc/man7/OSSL_STORE-winstore.pod" + ], + "doc/man/man7/RAND.7" => [ + "doc/man7/RAND.pod" + ], + "doc/man/man7/RSA-PSS.7" => [ + "doc/man7/RSA-PSS.pod" + ], + "doc/man/man7/X25519.7" => [ + "doc/man7/X25519.pod" + ], + "doc/man/man7/bio.7" => [ + "doc/man7/bio.pod" + ], + "doc/man/man7/ct.7" => [ + "doc/man7/ct.pod" + ], + "doc/man/man7/des_modes.7" => [ + "doc/man7/des_modes.pod" + ], + "doc/man/man7/evp.7" => [ + "doc/man7/evp.pod" + ], + "doc/man/man7/fips_module.7" => [ + "doc/man7/fips_module.pod" + ], + "doc/man/man7/life_cycle-cipher.7" => [ + "doc/man7/life_cycle-cipher.pod" + ], + "doc/man/man7/life_cycle-digest.7" => [ + "doc/man7/life_cycle-digest.pod" + ], + "doc/man/man7/life_cycle-kdf.7" => [ + "doc/man7/life_cycle-kdf.pod" + ], + "doc/man/man7/life_cycle-mac.7" => [ + "doc/man7/life_cycle-mac.pod" + ], + "doc/man/man7/life_cycle-pkey.7" => [ + "doc/man7/life_cycle-pkey.pod" + ], + "doc/man/man7/life_cycle-rand.7" => [ + "doc/man7/life_cycle-rand.pod" + ], + "doc/man/man7/openssl-core.h.7" => [ + "doc/man7/openssl-core.h.pod" + ], + "doc/man/man7/openssl-core_dispatch.h.7" => [ + "doc/man7/openssl-core_dispatch.h.pod" + ], + "doc/man/man7/openssl-core_names.h.7" => [ + "doc/man7/openssl-core_names.h.pod" + ], + "doc/man/man7/openssl-env.7" => [ + "doc/man7/openssl-env.pod" + ], + "doc/man/man7/openssl-glossary.7" => [ + "doc/man7/openssl-glossary.pod" + ], + "doc/man/man7/openssl-qlog.7" => [ + "doc/man7/openssl-qlog.pod" + ], + "doc/man/man7/openssl-quic-concurrency.7" => [ + "doc/man7/openssl-quic-concurrency.pod" + ], + "doc/man/man7/openssl-quic.7" => [ + "doc/man7/openssl-quic.pod" + ], + "doc/man/man7/openssl-threads.7" => [ + "doc/man7/openssl-threads.pod" + ], + "doc/man/man7/openssl_user_macros.7" => [ + "doc/man7/openssl_user_macros.pod" + ], + "doc/man/man7/ossl-guide-introduction.7" => [ + "doc/man7/ossl-guide-introduction.pod" + ], + "doc/man/man7/ossl-guide-libcrypto-introduction.7" => [ + "doc/man7/ossl-guide-libcrypto-introduction.pod" + ], + "doc/man/man7/ossl-guide-libraries-introduction.7" => [ + "doc/man7/ossl-guide-libraries-introduction.pod" + ], + "doc/man/man7/ossl-guide-libssl-introduction.7" => [ + "doc/man7/ossl-guide-libssl-introduction.pod" + ], + "doc/man/man7/ossl-guide-migration.7" => [ + "doc/man7/ossl-guide-migration.pod" + ], + "doc/man/man7/ossl-guide-quic-client-block.7" => [ + "doc/man7/ossl-guide-quic-client-block.pod" + ], + "doc/man/man7/ossl-guide-quic-client-non-block.7" => [ + "doc/man7/ossl-guide-quic-client-non-block.pod" + ], + "doc/man/man7/ossl-guide-quic-introduction.7" => [ + "doc/man7/ossl-guide-quic-introduction.pod" + ], + "doc/man/man7/ossl-guide-quic-multi-stream.7" => [ + "doc/man7/ossl-guide-quic-multi-stream.pod" + ], + "doc/man/man7/ossl-guide-quic-server-block.7" => [ + "doc/man7/ossl-guide-quic-server-block.pod" + ], + "doc/man/man7/ossl-guide-quic-server-non-block.7" => [ + "doc/man7/ossl-guide-quic-server-non-block.pod" + ], + "doc/man/man7/ossl-guide-tls-client-block.7" => [ + "doc/man7/ossl-guide-tls-client-block.pod" + ], + "doc/man/man7/ossl-guide-tls-client-non-block.7" => [ + "doc/man7/ossl-guide-tls-client-non-block.pod" + ], + "doc/man/man7/ossl-guide-tls-introduction.7" => [ + "doc/man7/ossl-guide-tls-introduction.pod" + ], + "doc/man/man7/ossl-guide-tls-server-block.7" => [ + "doc/man7/ossl-guide-tls-server-block.pod" + ], + "doc/man/man7/ossl_store-file.7" => [ + "doc/man7/ossl_store-file.pod" + ], + "doc/man/man7/ossl_store.7" => [ + "doc/man7/ossl_store.pod" + ], + "doc/man/man7/passphrase-encoding.7" => [ + "doc/man7/passphrase-encoding.pod" + ], + "doc/man/man7/property.7" => [ + "doc/man7/property.pod" + ], + "doc/man/man7/provider-asym_cipher.7" => [ + "doc/man7/provider-asym_cipher.pod" + ], + "doc/man/man7/provider-base.7" => [ + "doc/man7/provider-base.pod" + ], + "doc/man/man7/provider-cipher.7" => [ + "doc/man7/provider-cipher.pod" + ], + "doc/man/man7/provider-decoder.7" => [ + "doc/man7/provider-decoder.pod" + ], + "doc/man/man7/provider-digest.7" => [ + "doc/man7/provider-digest.pod" + ], + "doc/man/man7/provider-encoder.7" => [ + "doc/man7/provider-encoder.pod" + ], + "doc/man/man7/provider-kdf.7" => [ + "doc/man7/provider-kdf.pod" + ], + "doc/man/man7/provider-kem.7" => [ + "doc/man7/provider-kem.pod" + ], + "doc/man/man7/provider-keyexch.7" => [ + "doc/man7/provider-keyexch.pod" + ], + "doc/man/man7/provider-keymgmt.7" => [ + "doc/man7/provider-keymgmt.pod" + ], + "doc/man/man7/provider-mac.7" => [ + "doc/man7/provider-mac.pod" + ], + "doc/man/man7/provider-object.7" => [ + "doc/man7/provider-object.pod" + ], + "doc/man/man7/provider-rand.7" => [ + "doc/man7/provider-rand.pod" + ], + "doc/man/man7/provider-signature.7" => [ + "doc/man7/provider-signature.pod" + ], + "doc/man/man7/provider-skeymgmt.7" => [ + "doc/man7/provider-skeymgmt.pod" + ], + "doc/man/man7/provider-storemgmt.7" => [ + "doc/man7/provider-storemgmt.pod" + ], + "doc/man/man7/provider.7" => [ + "doc/man7/provider.pod" + ], + "doc/man/man7/proxy-certificates.7" => [ + "doc/man7/proxy-certificates.pod" + ], + "doc/man/man7/x509.7" => [ + "doc/man7/x509.pod" + ], + "doc/man1/openssl-asn1parse.pod" => [ + "doc/man1/openssl-asn1parse.pod.in" + ], + "doc/man1/openssl-ca.pod" => [ + "doc/man1/openssl-ca.pod.in" + ], + "doc/man1/openssl-ciphers.pod" => [ + "doc/man1/openssl-ciphers.pod.in" + ], + "doc/man1/openssl-cmds.pod" => [ + "doc/man1/openssl-cmds.pod.in" + ], + "doc/man1/openssl-cmp.pod" => [ + "doc/man1/openssl-cmp.pod.in" + ], + "doc/man1/openssl-cms.pod" => [ + "doc/man1/openssl-cms.pod.in" + ], + "doc/man1/openssl-crl.pod" => [ + "doc/man1/openssl-crl.pod.in" + ], + "doc/man1/openssl-crl2pkcs7.pod" => [ + "doc/man1/openssl-crl2pkcs7.pod.in" + ], + "doc/man1/openssl-dgst.pod" => [ + "doc/man1/openssl-dgst.pod.in" + ], + "doc/man1/openssl-dhparam.pod" => [ + "doc/man1/openssl-dhparam.pod.in" + ], + "doc/man1/openssl-dsa.pod" => [ + "doc/man1/openssl-dsa.pod.in" + ], + "doc/man1/openssl-dsaparam.pod" => [ + "doc/man1/openssl-dsaparam.pod.in" + ], + "doc/man1/openssl-ec.pod" => [ + "doc/man1/openssl-ec.pod.in" + ], + "doc/man1/openssl-ecparam.pod" => [ + "doc/man1/openssl-ecparam.pod.in" + ], + "doc/man1/openssl-enc.pod" => [ + "doc/man1/openssl-enc.pod.in" + ], + "doc/man1/openssl-engine.pod" => [ + "doc/man1/openssl-engine.pod.in" + ], + "doc/man1/openssl-errstr.pod" => [ + "doc/man1/openssl-errstr.pod.in" + ], + "doc/man1/openssl-fipsinstall.pod" => [ + "doc/man1/openssl-fipsinstall.pod.in" + ], + "doc/man1/openssl-gendsa.pod" => [ + "doc/man1/openssl-gendsa.pod.in" + ], + "doc/man1/openssl-genpkey.pod" => [ + "doc/man1/openssl-genpkey.pod.in" + ], + "doc/man1/openssl-genrsa.pod" => [ + "doc/man1/openssl-genrsa.pod.in" + ], + "doc/man1/openssl-info.pod" => [ + "doc/man1/openssl-info.pod.in" + ], + "doc/man1/openssl-kdf.pod" => [ + "doc/man1/openssl-kdf.pod.in" + ], + "doc/man1/openssl-list.pod" => [ + "doc/man1/openssl-list.pod.in" + ], + "doc/man1/openssl-mac.pod" => [ + "doc/man1/openssl-mac.pod.in" + ], + "doc/man1/openssl-nseq.pod" => [ + "doc/man1/openssl-nseq.pod.in" + ], + "doc/man1/openssl-ocsp.pod" => [ + "doc/man1/openssl-ocsp.pod.in" + ], + "doc/man1/openssl-passwd.pod" => [ + "doc/man1/openssl-passwd.pod.in" + ], + "doc/man1/openssl-pkcs12.pod" => [ + "doc/man1/openssl-pkcs12.pod.in" + ], + "doc/man1/openssl-pkcs7.pod" => [ + "doc/man1/openssl-pkcs7.pod.in" + ], + "doc/man1/openssl-pkcs8.pod" => [ + "doc/man1/openssl-pkcs8.pod.in" + ], + "doc/man1/openssl-pkey.pod" => [ + "doc/man1/openssl-pkey.pod.in" + ], + "doc/man1/openssl-pkeyparam.pod" => [ + "doc/man1/openssl-pkeyparam.pod.in" + ], + "doc/man1/openssl-pkeyutl.pod" => [ + "doc/man1/openssl-pkeyutl.pod.in" + ], + "doc/man1/openssl-prime.pod" => [ + "doc/man1/openssl-prime.pod.in" + ], + "doc/man1/openssl-rand.pod" => [ + "doc/man1/openssl-rand.pod.in" + ], + "doc/man1/openssl-rehash.pod" => [ + "doc/man1/openssl-rehash.pod.in" + ], + "doc/man1/openssl-req.pod" => [ + "doc/man1/openssl-req.pod.in" + ], + "doc/man1/openssl-rsa.pod" => [ + "doc/man1/openssl-rsa.pod.in" + ], + "doc/man1/openssl-rsautl.pod" => [ + "doc/man1/openssl-rsautl.pod.in" + ], + "doc/man1/openssl-s_client.pod" => [ + "doc/man1/openssl-s_client.pod.in" + ], + "doc/man1/openssl-s_server.pod" => [ + "doc/man1/openssl-s_server.pod.in" + ], + "doc/man1/openssl-s_time.pod" => [ + "doc/man1/openssl-s_time.pod.in" + ], + "doc/man1/openssl-sess_id.pod" => [ + "doc/man1/openssl-sess_id.pod.in" + ], + "doc/man1/openssl-skeyutl.pod" => [ + "doc/man1/openssl-skeyutl.pod.in" + ], + "doc/man1/openssl-smime.pod" => [ + "doc/man1/openssl-smime.pod.in" + ], + "doc/man1/openssl-speed.pod" => [ + "doc/man1/openssl-speed.pod.in" + ], + "doc/man1/openssl-spkac.pod" => [ + "doc/man1/openssl-spkac.pod.in" + ], + "doc/man1/openssl-srp.pod" => [ + "doc/man1/openssl-srp.pod.in" + ], + "doc/man1/openssl-storeutl.pod" => [ + "doc/man1/openssl-storeutl.pod.in" + ], + "doc/man1/openssl-ts.pod" => [ + "doc/man1/openssl-ts.pod.in" + ], + "doc/man1/openssl-verify.pod" => [ + "doc/man1/openssl-verify.pod.in" + ], + "doc/man1/openssl-version.pod" => [ + "doc/man1/openssl-version.pod.in" + ], + "doc/man1/openssl-x509.pod" => [ + "doc/man1/openssl-x509.pod.in" + ], + "doc/man7/openssl_user_macros.pod" => [ + "doc/man7/openssl_user_macros.pod.in" + ], + "engines/e_padlock-x86.S" => [ + "engines/asm/e_padlock-x86.pl" + ], + "engines/e_padlock-x86_64.s" => [ + "engines/asm/e_padlock-x86_64.pl" + ], + "exporters/OpenSSLConfig.cmake" => [ + "exporters/cmake/OpenSSLConfig.cmake.in" + ], + "exporters/OpenSSLConfigVersion.cmake" => [ + "exporters/cmake/OpenSSLConfigVersion.cmake.in" + ], + "exporters/libcrypto.pc" => [ + "exporters/pkg-config/libcrypto.pc.in" + ], + "exporters/libssl.pc" => [ + "exporters/pkg-config/libssl.pc.in" + ], + "exporters/openssl.pc" => [ + "exporters/pkg-config/openssl.pc.in" + ], + "include/crypto/bn_conf.h" => [ + "include/crypto/bn_conf.h.in" + ], + "include/crypto/dso_conf.h" => [ + "include/crypto/dso_conf.h.in" + ], + "include/internal/param_names.h" => [ + "include/internal/param_names.h.in" + ], + "include/openssl/asn1.h" => [ + "include/openssl/asn1.h.in" + ], + "include/openssl/asn1t.h" => [ + "include/openssl/asn1t.h.in" + ], + "include/openssl/bio.h" => [ + "include/openssl/bio.h.in" + ], + "include/openssl/cmp.h" => [ + "include/openssl/cmp.h.in" + ], + "include/openssl/cms.h" => [ + "include/openssl/cms.h.in" + ], + "include/openssl/comp.h" => [ + "include/openssl/comp.h.in" + ], + "include/openssl/conf.h" => [ + "include/openssl/conf.h.in" + ], + "include/openssl/configuration.h" => [ + "include/openssl/configuration.h.in" + ], + "include/openssl/core_names.h" => [ + "include/openssl/core_names.h.in" + ], + "include/openssl/crmf.h" => [ + "include/openssl/crmf.h.in" + ], + "include/openssl/crypto.h" => [ + "include/openssl/crypto.h.in" + ], + "include/openssl/ct.h" => [ + "include/openssl/ct.h.in" + ], + "include/openssl/err.h" => [ + "include/openssl/err.h.in" + ], + "include/openssl/ess.h" => [ + "include/openssl/ess.h.in" + ], + "include/openssl/fipskey.h" => [ + "include/openssl/fipskey.h.in" + ], + "include/openssl/lhash.h" => [ + "include/openssl/lhash.h.in" + ], + "include/openssl/ocsp.h" => [ + "include/openssl/ocsp.h.in" + ], + "include/openssl/opensslv.h" => [ + "include/openssl/opensslv.h.in" + ], + "include/openssl/pkcs12.h" => [ + "include/openssl/pkcs12.h.in" + ], + "include/openssl/pkcs7.h" => [ + "include/openssl/pkcs7.h.in" + ], + "include/openssl/safestack.h" => [ + "include/openssl/safestack.h.in" + ], + "include/openssl/srp.h" => [ + "include/openssl/srp.h.in" + ], + "include/openssl/ssl.h" => [ + "include/openssl/ssl.h.in" + ], + "include/openssl/ui.h" => [ + "include/openssl/ui.h.in" + ], + "include/openssl/x509.h" => [ + "include/openssl/x509.h.in" + ], + "include/openssl/x509_acert.h" => [ + "include/openssl/x509_acert.h.in" + ], + "include/openssl/x509_vfy.h" => [ + "include/openssl/x509_vfy.h.in" + ], + "include/openssl/x509v3.h" => [ + "include/openssl/x509v3.h.in" + ], + "installdata.pm" => [ + "util/mkinstallvars.pl", + "\"PREFIX=\$(INSTALLTOP)\"", + "BINDIR=bin", + "\"LIBDIR=\$(LIBDIR)\"", + "\"libdir=\$(libdir)\"", + "INCLUDEDIR=include", + "APPLINKDIR=include/openssl", + "\"ENGINESDIR=\$(ENGINESDIR)\"", + "\"MODULESDIR=\$(MODULESDIR)\"", + "\"PKGCONFIGDIR=\$(PKGCONFIGDIR)\"", + "\"CMAKECONFIGDIR=\$(CMAKECONFIGDIR)\"", + "\"LDLIBS=\$(LIB_EX_LIBS)\"", + "\"VERSION=\$(VERSION)\"" + ], + "libcrypto.ld" => [ + "util/libcrypto.num", + "libcrypto" + ], + "libcrypto.pc" => [ + "exporters/pkg-config/libcrypto.pc.in" + ], + "libssl.ld" => [ + "util/libssl.num", + "libssl" + ], + "libssl.pc" => [ + "exporters/pkg-config/libssl.pc.in" + ], + "openssl.pc" => [ + "exporters/pkg-config/openssl.pc.in" + ], + "providers/common/der/der_digests_gen.c" => [ + "providers/common/der/der_digests_gen.c.in" + ], + "providers/common/der/der_dsa_gen.c" => [ + "providers/common/der/der_dsa_gen.c.in" + ], + "providers/common/der/der_ec_gen.c" => [ + "providers/common/der/der_ec_gen.c.in" + ], + "providers/common/der/der_ecx_gen.c" => [ + "providers/common/der/der_ecx_gen.c.in" + ], + "providers/common/der/der_ml_dsa_gen.c" => [ + "providers/common/der/der_ml_dsa_gen.c.in" + ], + "providers/common/der/der_rsa_gen.c" => [ + "providers/common/der/der_rsa_gen.c.in" + ], + "providers/common/der/der_slh_dsa_gen.c" => [ + "providers/common/der/der_slh_dsa_gen.c.in" + ], + "providers/common/der/der_sm2_gen.c" => [ + "providers/common/der/der_sm2_gen.c.in" + ], + "providers/common/der/der_wrap_gen.c" => [ + "providers/common/der/der_wrap_gen.c.in" + ], + "providers/common/include/prov/der_digests.h" => [ + "providers/common/include/prov/der_digests.h.in" + ], + "providers/common/include/prov/der_dsa.h" => [ + "providers/common/include/prov/der_dsa.h.in" + ], + "providers/common/include/prov/der_ec.h" => [ + "providers/common/include/prov/der_ec.h.in" + ], + "providers/common/include/prov/der_ecx.h" => [ + "providers/common/include/prov/der_ecx.h.in" + ], + "providers/common/include/prov/der_ml_dsa.h" => [ + "providers/common/include/prov/der_ml_dsa.h.in" + ], + "providers/common/include/prov/der_rsa.h" => [ + "providers/common/include/prov/der_rsa.h.in" + ], + "providers/common/include/prov/der_slh_dsa.h" => [ + "providers/common/include/prov/der_slh_dsa.h.in" + ], + "providers/common/include/prov/der_sm2.h" => [ + "providers/common/include/prov/der_sm2.h.in" + ], + "providers/common/include/prov/der_wrap.h" => [ + "providers/common/include/prov/der_wrap.h.in" + ], + "providers/fips.ld" => [ + "util/providers.num" + ], + "providers/fipsmodule.cnf" => [ + "util/mk-fipsmodule-cnf.pl", + "-module", + "\$(FIPSMODULE)", + "-section_name", + "fips_sect", + "-key", + "\$(FIPSKEY)" + ], + "providers/legacy.ld" => [ + "util/providers.num" + ] + }, + "htmldocs" => { + "man1" => [ + "doc/html/man1/CA.pl.html", + "doc/html/man1/openssl-asn1parse.html", + "doc/html/man1/openssl-ca.html", + "doc/html/man1/openssl-ciphers.html", + "doc/html/man1/openssl-cmds.html", + "doc/html/man1/openssl-cmp.html", + "doc/html/man1/openssl-cms.html", + "doc/html/man1/openssl-crl.html", + "doc/html/man1/openssl-crl2pkcs7.html", + "doc/html/man1/openssl-dgst.html", + "doc/html/man1/openssl-dhparam.html", + "doc/html/man1/openssl-dsa.html", + "doc/html/man1/openssl-dsaparam.html", + "doc/html/man1/openssl-ec.html", + "doc/html/man1/openssl-ecparam.html", + "doc/html/man1/openssl-enc.html", + "doc/html/man1/openssl-engine.html", + "doc/html/man1/openssl-errstr.html", + "doc/html/man1/openssl-fipsinstall.html", + "doc/html/man1/openssl-format-options.html", + "doc/html/man1/openssl-gendsa.html", + "doc/html/man1/openssl-genpkey.html", + "doc/html/man1/openssl-genrsa.html", + "doc/html/man1/openssl-info.html", + "doc/html/man1/openssl-kdf.html", + "doc/html/man1/openssl-list.html", + "doc/html/man1/openssl-mac.html", + "doc/html/man1/openssl-namedisplay-options.html", + "doc/html/man1/openssl-nseq.html", + "doc/html/man1/openssl-ocsp.html", + "doc/html/man1/openssl-passphrase-options.html", + "doc/html/man1/openssl-passwd.html", + "doc/html/man1/openssl-pkcs12.html", + "doc/html/man1/openssl-pkcs7.html", + "doc/html/man1/openssl-pkcs8.html", + "doc/html/man1/openssl-pkey.html", + "doc/html/man1/openssl-pkeyparam.html", + "doc/html/man1/openssl-pkeyutl.html", + "doc/html/man1/openssl-prime.html", + "doc/html/man1/openssl-rand.html", + "doc/html/man1/openssl-rehash.html", + "doc/html/man1/openssl-req.html", + "doc/html/man1/openssl-rsa.html", + "doc/html/man1/openssl-rsautl.html", + "doc/html/man1/openssl-s_client.html", + "doc/html/man1/openssl-s_server.html", + "doc/html/man1/openssl-s_time.html", + "doc/html/man1/openssl-sess_id.html", + "doc/html/man1/openssl-skeyutl.html", + "doc/html/man1/openssl-smime.html", + "doc/html/man1/openssl-speed.html", + "doc/html/man1/openssl-spkac.html", + "doc/html/man1/openssl-srp.html", + "doc/html/man1/openssl-storeutl.html", + "doc/html/man1/openssl-ts.html", + "doc/html/man1/openssl-verification-options.html", + "doc/html/man1/openssl-verify.html", + "doc/html/man1/openssl-version.html", + "doc/html/man1/openssl-x509.html", + "doc/html/man1/openssl.html", + "doc/html/man1/tsget.html" + ], + "man3" => [ + "doc/html/man3/ADMISSIONS.html", + "doc/html/man3/ASN1_EXTERN_FUNCS.html", + "doc/html/man3/ASN1_INTEGER_get_int64.html", + "doc/html/man3/ASN1_INTEGER_new.html", + "doc/html/man3/ASN1_ITEM_lookup.html", + "doc/html/man3/ASN1_OBJECT_new.html", + "doc/html/man3/ASN1_STRING_TABLE_add.html", + "doc/html/man3/ASN1_STRING_length.html", + "doc/html/man3/ASN1_STRING_new.html", + "doc/html/man3/ASN1_STRING_print_ex.html", + "doc/html/man3/ASN1_TIME_set.html", + "doc/html/man3/ASN1_TYPE_get.html", + "doc/html/man3/ASN1_aux_cb.html", + "doc/html/man3/ASN1_generate_nconf.html", + "doc/html/man3/ASN1_item_d2i_bio.html", + "doc/html/man3/ASN1_item_new.html", + "doc/html/man3/ASN1_item_sign.html", + "doc/html/man3/ASYNC_WAIT_CTX_new.html", + "doc/html/man3/ASYNC_start_job.html", + "doc/html/man3/BF_encrypt.html", + "doc/html/man3/BIO_ADDR.html", + "doc/html/man3/BIO_ADDRINFO.html", + "doc/html/man3/BIO_connect.html", + "doc/html/man3/BIO_ctrl.html", + "doc/html/man3/BIO_f_base64.html", + "doc/html/man3/BIO_f_buffer.html", + "doc/html/man3/BIO_f_cipher.html", + "doc/html/man3/BIO_f_md.html", + "doc/html/man3/BIO_f_null.html", + "doc/html/man3/BIO_f_prefix.html", + "doc/html/man3/BIO_f_readbuffer.html", + "doc/html/man3/BIO_f_ssl.html", + "doc/html/man3/BIO_find_type.html", + "doc/html/man3/BIO_get_data.html", + "doc/html/man3/BIO_get_ex_new_index.html", + "doc/html/man3/BIO_get_rpoll_descriptor.html", + "doc/html/man3/BIO_meth_new.html", + "doc/html/man3/BIO_new.html", + "doc/html/man3/BIO_new_CMS.html", + "doc/html/man3/BIO_parse_hostserv.html", + "doc/html/man3/BIO_printf.html", + "doc/html/man3/BIO_push.html", + "doc/html/man3/BIO_read.html", + "doc/html/man3/BIO_s_accept.html", + "doc/html/man3/BIO_s_bio.html", + "doc/html/man3/BIO_s_connect.html", + "doc/html/man3/BIO_s_core.html", + "doc/html/man3/BIO_s_datagram.html", + "doc/html/man3/BIO_s_dgram_pair.html", + "doc/html/man3/BIO_s_fd.html", + "doc/html/man3/BIO_s_file.html", + "doc/html/man3/BIO_s_mem.html", + "doc/html/man3/BIO_s_null.html", + "doc/html/man3/BIO_s_socket.html", + "doc/html/man3/BIO_sendmmsg.html", + "doc/html/man3/BIO_set_callback.html", + "doc/html/man3/BIO_set_flags.html", + "doc/html/man3/BIO_should_retry.html", + "doc/html/man3/BIO_socket_wait.html", + "doc/html/man3/BN_BLINDING_new.html", + "doc/html/man3/BN_CTX_new.html", + "doc/html/man3/BN_CTX_start.html", + "doc/html/man3/BN_add.html", + "doc/html/man3/BN_add_word.html", + "doc/html/man3/BN_bn2bin.html", + "doc/html/man3/BN_cmp.html", + "doc/html/man3/BN_copy.html", + "doc/html/man3/BN_generate_prime.html", + "doc/html/man3/BN_mod_exp_mont.html", + "doc/html/man3/BN_mod_inverse.html", + "doc/html/man3/BN_mod_mul_montgomery.html", + "doc/html/man3/BN_mod_mul_reciprocal.html", + "doc/html/man3/BN_new.html", + "doc/html/man3/BN_num_bytes.html", + "doc/html/man3/BN_rand.html", + "doc/html/man3/BN_security_bits.html", + "doc/html/man3/BN_set_bit.html", + "doc/html/man3/BN_swap.html", + "doc/html/man3/BN_zero.html", + "doc/html/man3/BUF_MEM_new.html", + "doc/html/man3/CMAC_CTX.html", + "doc/html/man3/CMS_EncryptedData_decrypt.html", + "doc/html/man3/CMS_EncryptedData_encrypt.html", + "doc/html/man3/CMS_EncryptedData_set1_key.html", + "doc/html/man3/CMS_EnvelopedData_create.html", + "doc/html/man3/CMS_add0_cert.html", + "doc/html/man3/CMS_add1_recipient_cert.html", + "doc/html/man3/CMS_add1_signer.html", + "doc/html/man3/CMS_compress.html", + "doc/html/man3/CMS_data_create.html", + "doc/html/man3/CMS_decrypt.html", + "doc/html/man3/CMS_digest_create.html", + "doc/html/man3/CMS_encrypt.html", + "doc/html/man3/CMS_final.html", + "doc/html/man3/CMS_get0_RecipientInfos.html", + "doc/html/man3/CMS_get0_SignerInfos.html", + "doc/html/man3/CMS_get0_type.html", + "doc/html/man3/CMS_get1_ReceiptRequest.html", + "doc/html/man3/CMS_sign.html", + "doc/html/man3/CMS_sign_receipt.html", + "doc/html/man3/CMS_signed_get_attr.html", + "doc/html/man3/CMS_uncompress.html", + "doc/html/man3/CMS_verify.html", + "doc/html/man3/CMS_verify_receipt.html", + "doc/html/man3/COMP_CTX_new.html", + "doc/html/man3/CONF_modules_free.html", + "doc/html/man3/CONF_modules_load_file.html", + "doc/html/man3/CRYPTO_THREAD_run_once.html", + "doc/html/man3/CRYPTO_get_ex_new_index.html", + "doc/html/man3/CRYPTO_memcmp.html", + "doc/html/man3/CTLOG_STORE_get0_log_by_id.html", + "doc/html/man3/CTLOG_STORE_new.html", + "doc/html/man3/CTLOG_new.html", + "doc/html/man3/CT_POLICY_EVAL_CTX_new.html", + "doc/html/man3/DEFINE_STACK_OF.html", + "doc/html/man3/DES_random_key.html", + "doc/html/man3/DH_generate_key.html", + "doc/html/man3/DH_generate_parameters.html", + "doc/html/man3/DH_get0_pqg.html", + "doc/html/man3/DH_get_1024_160.html", + "doc/html/man3/DH_meth_new.html", + "doc/html/man3/DH_new.html", + "doc/html/man3/DH_new_by_nid.html", + "doc/html/man3/DH_set_method.html", + "doc/html/man3/DH_size.html", + "doc/html/man3/DSA_SIG_new.html", + "doc/html/man3/DSA_do_sign.html", + "doc/html/man3/DSA_dup_DH.html", + "doc/html/man3/DSA_generate_key.html", + "doc/html/man3/DSA_generate_parameters.html", + "doc/html/man3/DSA_get0_pqg.html", + "doc/html/man3/DSA_meth_new.html", + "doc/html/man3/DSA_new.html", + "doc/html/man3/DSA_set_method.html", + "doc/html/man3/DSA_sign.html", + "doc/html/man3/DSA_size.html", + "doc/html/man3/DTLS_get_data_mtu.html", + "doc/html/man3/DTLS_set_timer_cb.html", + "doc/html/man3/DTLSv1_get_timeout.html", + "doc/html/man3/DTLSv1_handle_timeout.html", + "doc/html/man3/DTLSv1_listen.html", + "doc/html/man3/ECDSA_SIG_new.html", + "doc/html/man3/ECDSA_sign.html", + "doc/html/man3/ECPKParameters_print.html", + "doc/html/man3/EC_GFp_simple_method.html", + "doc/html/man3/EC_GROUP_copy.html", + "doc/html/man3/EC_GROUP_new.html", + "doc/html/man3/EC_KEY_get_enc_flags.html", + "doc/html/man3/EC_KEY_new.html", + "doc/html/man3/EC_POINT_add.html", + "doc/html/man3/EC_POINT_new.html", + "doc/html/man3/ENGINE_add.html", + "doc/html/man3/ERR_GET_LIB.html", + "doc/html/man3/ERR_clear_error.html", + "doc/html/man3/ERR_error_string.html", + "doc/html/man3/ERR_get_error.html", + "doc/html/man3/ERR_load_crypto_strings.html", + "doc/html/man3/ERR_load_strings.html", + "doc/html/man3/ERR_new.html", + "doc/html/man3/ERR_print_errors.html", + "doc/html/man3/ERR_put_error.html", + "doc/html/man3/ERR_remove_state.html", + "doc/html/man3/ERR_set_mark.html", + "doc/html/man3/EVP_ASYM_CIPHER_free.html", + "doc/html/man3/EVP_BytesToKey.html", + "doc/html/man3/EVP_CIPHER_CTX_get_app_data.html", + "doc/html/man3/EVP_CIPHER_CTX_get_cipher_data.html", + "doc/html/man3/EVP_CIPHER_CTX_get_original_iv.html", + "doc/html/man3/EVP_CIPHER_meth_new.html", + "doc/html/man3/EVP_DigestInit.html", + "doc/html/man3/EVP_DigestSignInit.html", + "doc/html/man3/EVP_DigestVerifyInit.html", + "doc/html/man3/EVP_EncodeInit.html", + "doc/html/man3/EVP_EncryptInit.html", + "doc/html/man3/EVP_KDF.html", + "doc/html/man3/EVP_KEM_free.html", + "doc/html/man3/EVP_KEYEXCH_free.html", + "doc/html/man3/EVP_KEYMGMT.html", + "doc/html/man3/EVP_MAC.html", + "doc/html/man3/EVP_MD_meth_new.html", + "doc/html/man3/EVP_OpenInit.html", + "doc/html/man3/EVP_PBE_CipherInit.html", + "doc/html/man3/EVP_PKEY2PKCS8.html", + "doc/html/man3/EVP_PKEY_ASN1_METHOD.html", + "doc/html/man3/EVP_PKEY_CTX_ctrl.html", + "doc/html/man3/EVP_PKEY_CTX_get0_libctx.html", + "doc/html/man3/EVP_PKEY_CTX_get0_pkey.html", + "doc/html/man3/EVP_PKEY_CTX_get_algor.html", + "doc/html/man3/EVP_PKEY_CTX_new.html", + "doc/html/man3/EVP_PKEY_CTX_set1_pbe_pass.html", + "doc/html/man3/EVP_PKEY_CTX_set_hkdf_md.html", + "doc/html/man3/EVP_PKEY_CTX_set_params.html", + "doc/html/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.html", + "doc/html/man3/EVP_PKEY_CTX_set_scrypt_N.html", + "doc/html/man3/EVP_PKEY_CTX_set_tls1_prf_md.html", + "doc/html/man3/EVP_PKEY_asn1_get_count.html", + "doc/html/man3/EVP_PKEY_check.html", + "doc/html/man3/EVP_PKEY_copy_parameters.html", + "doc/html/man3/EVP_PKEY_decapsulate.html", + "doc/html/man3/EVP_PKEY_decrypt.html", + "doc/html/man3/EVP_PKEY_derive.html", + "doc/html/man3/EVP_PKEY_digestsign_supports_digest.html", + "doc/html/man3/EVP_PKEY_encapsulate.html", + "doc/html/man3/EVP_PKEY_encrypt.html", + "doc/html/man3/EVP_PKEY_fromdata.html", + "doc/html/man3/EVP_PKEY_get_attr.html", + "doc/html/man3/EVP_PKEY_get_default_digest_nid.html", + "doc/html/man3/EVP_PKEY_get_field_type.html", + "doc/html/man3/EVP_PKEY_get_group_name.html", + "doc/html/man3/EVP_PKEY_get_size.html", + "doc/html/man3/EVP_PKEY_gettable_params.html", + "doc/html/man3/EVP_PKEY_is_a.html", + "doc/html/man3/EVP_PKEY_keygen.html", + "doc/html/man3/EVP_PKEY_meth_get_count.html", + "doc/html/man3/EVP_PKEY_meth_new.html", + "doc/html/man3/EVP_PKEY_new.html", + "doc/html/man3/EVP_PKEY_print_private.html", + "doc/html/man3/EVP_PKEY_set1_RSA.html", + "doc/html/man3/EVP_PKEY_set1_encoded_public_key.html", + "doc/html/man3/EVP_PKEY_set_type.html", + "doc/html/man3/EVP_PKEY_settable_params.html", + "doc/html/man3/EVP_PKEY_sign.html", + "doc/html/man3/EVP_PKEY_todata.html", + "doc/html/man3/EVP_PKEY_verify.html", + "doc/html/man3/EVP_PKEY_verify_recover.html", + "doc/html/man3/EVP_RAND.html", + "doc/html/man3/EVP_SIGNATURE.html", + "doc/html/man3/EVP_SKEY.html", + "doc/html/man3/EVP_SKEYMGMT.html", + "doc/html/man3/EVP_SealInit.html", + "doc/html/man3/EVP_SignInit.html", + "doc/html/man3/EVP_VerifyInit.html", + "doc/html/man3/EVP_aes_128_gcm.html", + "doc/html/man3/EVP_aria_128_gcm.html", + "doc/html/man3/EVP_bf_cbc.html", + "doc/html/man3/EVP_blake2b512.html", + "doc/html/man3/EVP_camellia_128_ecb.html", + "doc/html/man3/EVP_cast5_cbc.html", + "doc/html/man3/EVP_chacha20.html", + "doc/html/man3/EVP_des_cbc.html", + "doc/html/man3/EVP_desx_cbc.html", + "doc/html/man3/EVP_idea_cbc.html", + "doc/html/man3/EVP_md2.html", + "doc/html/man3/EVP_md4.html", + "doc/html/man3/EVP_md5.html", + "doc/html/man3/EVP_mdc2.html", + "doc/html/man3/EVP_rc2_cbc.html", + "doc/html/man3/EVP_rc4.html", + "doc/html/man3/EVP_rc5_32_12_16_cbc.html", + "doc/html/man3/EVP_ripemd160.html", + "doc/html/man3/EVP_seed_cbc.html", + "doc/html/man3/EVP_set_default_properties.html", + "doc/html/man3/EVP_sha1.html", + "doc/html/man3/EVP_sha224.html", + "doc/html/man3/EVP_sha3_224.html", + "doc/html/man3/EVP_sm3.html", + "doc/html/man3/EVP_sm4_cbc.html", + "doc/html/man3/EVP_whirlpool.html", + "doc/html/man3/GENERAL_NAME.html", + "doc/html/man3/HMAC.html", + "doc/html/man3/MD5.html", + "doc/html/man3/MDC2_Init.html", + "doc/html/man3/NCONF_new_ex.html", + "doc/html/man3/OBJ_nid2obj.html", + "doc/html/man3/OCSP_REQUEST_new.html", + "doc/html/man3/OCSP_cert_to_id.html", + "doc/html/man3/OCSP_request_add1_nonce.html", + "doc/html/man3/OCSP_resp_find_status.html", + "doc/html/man3/OCSP_response_status.html", + "doc/html/man3/OCSP_sendreq_new.html", + "doc/html/man3/OPENSSL_Applink.html", + "doc/html/man3/OPENSSL_FILE.html", + "doc/html/man3/OPENSSL_LH_COMPFUNC.html", + "doc/html/man3/OPENSSL_LH_stats.html", + "doc/html/man3/OPENSSL_config.html", + "doc/html/man3/OPENSSL_fork_prepare.html", + "doc/html/man3/OPENSSL_gmtime.html", + "doc/html/man3/OPENSSL_hexchar2int.html", + "doc/html/man3/OPENSSL_ia32cap.html", + "doc/html/man3/OPENSSL_init_crypto.html", + "doc/html/man3/OPENSSL_init_ssl.html", + "doc/html/man3/OPENSSL_instrument_bus.html", + "doc/html/man3/OPENSSL_load_builtin_modules.html", + "doc/html/man3/OPENSSL_load_u16_le.html", + "doc/html/man3/OPENSSL_malloc.html", + "doc/html/man3/OPENSSL_ppccap.html", + "doc/html/man3/OPENSSL_riscvcap.html", + "doc/html/man3/OPENSSL_s390xcap.html", + "doc/html/man3/OPENSSL_secure_malloc.html", + "doc/html/man3/OPENSSL_strcasecmp.html", + "doc/html/man3/OSSL_ALGORITHM.html", + "doc/html/man3/OSSL_CALLBACK.html", + "doc/html/man3/OSSL_CMP_ATAV_set0.html", + "doc/html/man3/OSSL_CMP_CTX_new.html", + "doc/html/man3/OSSL_CMP_HDR_get0_transactionID.html", + "doc/html/man3/OSSL_CMP_ITAV_new_caCerts.html", + "doc/html/man3/OSSL_CMP_ITAV_set0.html", + "doc/html/man3/OSSL_CMP_MSG_get0_header.html", + "doc/html/man3/OSSL_CMP_MSG_http_perform.html", + "doc/html/man3/OSSL_CMP_SRV_CTX_new.html", + "doc/html/man3/OSSL_CMP_STATUSINFO_new.html", + "doc/html/man3/OSSL_CMP_exec_certreq.html", + "doc/html/man3/OSSL_CMP_log_open.html", + "doc/html/man3/OSSL_CMP_validate_msg.html", + "doc/html/man3/OSSL_CORE_MAKE_FUNC.html", + "doc/html/man3/OSSL_CRMF_MSG_get0_tmpl.html", + "doc/html/man3/OSSL_CRMF_MSG_set0_validity.html", + "doc/html/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.html", + "doc/html/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.html", + "doc/html/man3/OSSL_CRMF_pbmp_new.html", + "doc/html/man3/OSSL_DECODER.html", + "doc/html/man3/OSSL_DECODER_CTX.html", + "doc/html/man3/OSSL_DECODER_CTX_new_for_pkey.html", + "doc/html/man3/OSSL_DECODER_from_bio.html", + "doc/html/man3/OSSL_DISPATCH.html", + "doc/html/man3/OSSL_ENCODER.html", + "doc/html/man3/OSSL_ENCODER_CTX.html", + "doc/html/man3/OSSL_ENCODER_CTX_new_for_pkey.html", + "doc/html/man3/OSSL_ENCODER_to_bio.html", + "doc/html/man3/OSSL_ERR_STATE_save.html", + "doc/html/man3/OSSL_ESS_check_signing_certs.html", + "doc/html/man3/OSSL_GENERAL_NAMES_print.html", + "doc/html/man3/OSSL_HPKE_CTX_new.html", + "doc/html/man3/OSSL_HTTP_REQ_CTX.html", + "doc/html/man3/OSSL_HTTP_parse_url.html", + "doc/html/man3/OSSL_HTTP_transfer.html", + "doc/html/man3/OSSL_IETF_ATTR_SYNTAX.html", + "doc/html/man3/OSSL_IETF_ATTR_SYNTAX_print.html", + "doc/html/man3/OSSL_INDICATOR_set_callback.html", + "doc/html/man3/OSSL_ITEM.html", + "doc/html/man3/OSSL_LIB_CTX.html", + "doc/html/man3/OSSL_LIB_CTX_set_conf_diagnostics.html", + "doc/html/man3/OSSL_PARAM.html", + "doc/html/man3/OSSL_PARAM_BLD.html", + "doc/html/man3/OSSL_PARAM_allocate_from_text.html", + "doc/html/man3/OSSL_PARAM_dup.html", + "doc/html/man3/OSSL_PARAM_int.html", + "doc/html/man3/OSSL_PARAM_print_to_bio.html", + "doc/html/man3/OSSL_PROVIDER.html", + "doc/html/man3/OSSL_QUIC_client_method.html", + "doc/html/man3/OSSL_SELF_TEST_new.html", + "doc/html/man3/OSSL_SELF_TEST_set_callback.html", + "doc/html/man3/OSSL_STORE_INFO.html", + "doc/html/man3/OSSL_STORE_LOADER.html", + "doc/html/man3/OSSL_STORE_SEARCH.html", + "doc/html/man3/OSSL_STORE_attach.html", + "doc/html/man3/OSSL_STORE_expect.html", + "doc/html/man3/OSSL_STORE_open.html", + "doc/html/man3/OSSL_sleep.html", + "doc/html/man3/OSSL_trace_enabled.html", + "doc/html/man3/OSSL_trace_get_category_num.html", + "doc/html/man3/OSSL_trace_set_channel.html", + "doc/html/man3/OpenSSL_add_all_algorithms.html", + "doc/html/man3/OpenSSL_version.html", + "doc/html/man3/PBMAC1_get1_pbkdf2_param.html", + "doc/html/man3/PEM_X509_INFO_read_bio_ex.html", + "doc/html/man3/PEM_bytes_read_bio.html", + "doc/html/man3/PEM_read.html", + "doc/html/man3/PEM_read_CMS.html", + "doc/html/man3/PEM_read_bio_PrivateKey.html", + "doc/html/man3/PEM_read_bio_ex.html", + "doc/html/man3/PEM_write_bio_CMS_stream.html", + "doc/html/man3/PEM_write_bio_PKCS7_stream.html", + "doc/html/man3/PKCS12_PBE_keyivgen.html", + "doc/html/man3/PKCS12_SAFEBAG_create_cert.html", + "doc/html/man3/PKCS12_SAFEBAG_get0_attrs.html", + "doc/html/man3/PKCS12_SAFEBAG_get1_cert.html", + "doc/html/man3/PKCS12_SAFEBAG_set0_attrs.html", + "doc/html/man3/PKCS12_add1_attr_by_NID.html", + "doc/html/man3/PKCS12_add_CSPName_asc.html", + "doc/html/man3/PKCS12_add_cert.html", + "doc/html/man3/PKCS12_add_friendlyname_asc.html", + "doc/html/man3/PKCS12_add_localkeyid.html", + "doc/html/man3/PKCS12_add_safe.html", + "doc/html/man3/PKCS12_create.html", + "doc/html/man3/PKCS12_decrypt_skey.html", + "doc/html/man3/PKCS12_gen_mac.html", + "doc/html/man3/PKCS12_get_friendlyname.html", + "doc/html/man3/PKCS12_init.html", + "doc/html/man3/PKCS12_item_decrypt_d2i.html", + "doc/html/man3/PKCS12_key_gen_utf8_ex.html", + "doc/html/man3/PKCS12_newpass.html", + "doc/html/man3/PKCS12_pack_p7encdata.html", + "doc/html/man3/PKCS12_parse.html", + "doc/html/man3/PKCS5_PBE_keyivgen.html", + "doc/html/man3/PKCS5_PBKDF2_HMAC.html", + "doc/html/man3/PKCS7_decrypt.html", + "doc/html/man3/PKCS7_encrypt.html", + "doc/html/man3/PKCS7_get_octet_string.html", + "doc/html/man3/PKCS7_sign.html", + "doc/html/man3/PKCS7_sign_add_signer.html", + "doc/html/man3/PKCS7_type_is_other.html", + "doc/html/man3/PKCS7_verify.html", + "doc/html/man3/PKCS8_encrypt.html", + "doc/html/man3/PKCS8_pkey_add1_attr.html", + "doc/html/man3/RAND_add.html", + "doc/html/man3/RAND_bytes.html", + "doc/html/man3/RAND_cleanup.html", + "doc/html/man3/RAND_egd.html", + "doc/html/man3/RAND_get0_primary.html", + "doc/html/man3/RAND_load_file.html", + "doc/html/man3/RAND_set_DRBG_type.html", + "doc/html/man3/RAND_set_rand_method.html", + "doc/html/man3/RC4_set_key.html", + "doc/html/man3/RIPEMD160_Init.html", + "doc/html/man3/RSA_blinding_on.html", + "doc/html/man3/RSA_check_key.html", + "doc/html/man3/RSA_generate_key.html", + "doc/html/man3/RSA_get0_key.html", + "doc/html/man3/RSA_meth_new.html", + "doc/html/man3/RSA_new.html", + "doc/html/man3/RSA_padding_add_PKCS1_type_1.html", + "doc/html/man3/RSA_print.html", + "doc/html/man3/RSA_private_encrypt.html", + "doc/html/man3/RSA_public_encrypt.html", + "doc/html/man3/RSA_set_method.html", + "doc/html/man3/RSA_sign.html", + "doc/html/man3/RSA_sign_ASN1_OCTET_STRING.html", + "doc/html/man3/RSA_size.html", + "doc/html/man3/SCT_new.html", + "doc/html/man3/SCT_print.html", + "doc/html/man3/SCT_validate.html", + "doc/html/man3/SHA256_Init.html", + "doc/html/man3/SMIME_read_ASN1.html", + "doc/html/man3/SMIME_read_CMS.html", + "doc/html/man3/SMIME_read_PKCS7.html", + "doc/html/man3/SMIME_write_ASN1.html", + "doc/html/man3/SMIME_write_CMS.html", + "doc/html/man3/SMIME_write_PKCS7.html", + "doc/html/man3/SRP_Calc_B.html", + "doc/html/man3/SRP_VBASE_new.html", + "doc/html/man3/SRP_create_verifier.html", + "doc/html/man3/SRP_user_pwd_new.html", + "doc/html/man3/SSL_CIPHER_get_name.html", + "doc/html/man3/SSL_COMP_add_compression_method.html", + "doc/html/man3/SSL_CONF_CTX_new.html", + "doc/html/man3/SSL_CONF_CTX_set1_prefix.html", + "doc/html/man3/SSL_CONF_CTX_set_flags.html", + "doc/html/man3/SSL_CONF_CTX_set_ssl_ctx.html", + "doc/html/man3/SSL_CONF_cmd.html", + "doc/html/man3/SSL_CONF_cmd_argv.html", + "doc/html/man3/SSL_CTX_add1_chain_cert.html", + "doc/html/man3/SSL_CTX_add_extra_chain_cert.html", + "doc/html/man3/SSL_CTX_add_session.html", + "doc/html/man3/SSL_CTX_config.html", + "doc/html/man3/SSL_CTX_ctrl.html", + "doc/html/man3/SSL_CTX_dane_enable.html", + "doc/html/man3/SSL_CTX_flush_sessions.html", + "doc/html/man3/SSL_CTX_free.html", + "doc/html/man3/SSL_CTX_get0_param.html", + "doc/html/man3/SSL_CTX_get_verify_mode.html", + "doc/html/man3/SSL_CTX_has_client_custom_ext.html", + "doc/html/man3/SSL_CTX_load_verify_locations.html", + "doc/html/man3/SSL_CTX_new.html", + "doc/html/man3/SSL_CTX_sess_number.html", + "doc/html/man3/SSL_CTX_sess_set_cache_size.html", + "doc/html/man3/SSL_CTX_sess_set_get_cb.html", + "doc/html/man3/SSL_CTX_sessions.html", + "doc/html/man3/SSL_CTX_set0_CA_list.html", + "doc/html/man3/SSL_CTX_set1_cert_comp_preference.html", + "doc/html/man3/SSL_CTX_set1_curves.html", + "doc/html/man3/SSL_CTX_set1_sigalgs.html", + "doc/html/man3/SSL_CTX_set1_verify_cert_store.html", + "doc/html/man3/SSL_CTX_set_alpn_select_cb.html", + "doc/html/man3/SSL_CTX_set_cert_cb.html", + "doc/html/man3/SSL_CTX_set_cert_store.html", + "doc/html/man3/SSL_CTX_set_cert_verify_callback.html", + "doc/html/man3/SSL_CTX_set_cipher_list.html", + "doc/html/man3/SSL_CTX_set_client_cert_cb.html", + "doc/html/man3/SSL_CTX_set_client_hello_cb.html", + "doc/html/man3/SSL_CTX_set_ct_validation_callback.html", + "doc/html/man3/SSL_CTX_set_ctlog_list_file.html", + "doc/html/man3/SSL_CTX_set_default_passwd_cb.html", + "doc/html/man3/SSL_CTX_set_domain_flags.html", + "doc/html/man3/SSL_CTX_set_generate_session_id.html", + "doc/html/man3/SSL_CTX_set_info_callback.html", + "doc/html/man3/SSL_CTX_set_keylog_callback.html", + "doc/html/man3/SSL_CTX_set_max_cert_list.html", + "doc/html/man3/SSL_CTX_set_min_proto_version.html", + "doc/html/man3/SSL_CTX_set_mode.html", + "doc/html/man3/SSL_CTX_set_msg_callback.html", + "doc/html/man3/SSL_CTX_set_new_pending_conn_cb.html", + "doc/html/man3/SSL_CTX_set_num_tickets.html", + "doc/html/man3/SSL_CTX_set_options.html", + "doc/html/man3/SSL_CTX_set_psk_client_callback.html", + "doc/html/man3/SSL_CTX_set_quiet_shutdown.html", + "doc/html/man3/SSL_CTX_set_read_ahead.html", + "doc/html/man3/SSL_CTX_set_record_padding_callback.html", + "doc/html/man3/SSL_CTX_set_security_level.html", + "doc/html/man3/SSL_CTX_set_session_cache_mode.html", + "doc/html/man3/SSL_CTX_set_session_id_context.html", + "doc/html/man3/SSL_CTX_set_session_ticket_cb.html", + "doc/html/man3/SSL_CTX_set_split_send_fragment.html", + "doc/html/man3/SSL_CTX_set_srp_password.html", + "doc/html/man3/SSL_CTX_set_ssl_version.html", + "doc/html/man3/SSL_CTX_set_stateless_cookie_generate_cb.html", + "doc/html/man3/SSL_CTX_set_timeout.html", + "doc/html/man3/SSL_CTX_set_tlsext_servername_callback.html", + "doc/html/man3/SSL_CTX_set_tlsext_status_cb.html", + "doc/html/man3/SSL_CTX_set_tlsext_ticket_key_cb.html", + "doc/html/man3/SSL_CTX_set_tlsext_use_srtp.html", + "doc/html/man3/SSL_CTX_set_tmp_dh_callback.html", + "doc/html/man3/SSL_CTX_set_tmp_ecdh.html", + "doc/html/man3/SSL_CTX_set_verify.html", + "doc/html/man3/SSL_CTX_use_certificate.html", + "doc/html/man3/SSL_CTX_use_psk_identity_hint.html", + "doc/html/man3/SSL_CTX_use_serverinfo.html", + "doc/html/man3/SSL_SESSION_free.html", + "doc/html/man3/SSL_SESSION_get0_cipher.html", + "doc/html/man3/SSL_SESSION_get0_hostname.html", + "doc/html/man3/SSL_SESSION_get0_id_context.html", + "doc/html/man3/SSL_SESSION_get0_peer.html", + "doc/html/man3/SSL_SESSION_get_compress_id.html", + "doc/html/man3/SSL_SESSION_get_protocol_version.html", + "doc/html/man3/SSL_SESSION_get_time.html", + "doc/html/man3/SSL_SESSION_has_ticket.html", + "doc/html/man3/SSL_SESSION_is_resumable.html", + "doc/html/man3/SSL_SESSION_print.html", + "doc/html/man3/SSL_SESSION_set1_id.html", + "doc/html/man3/SSL_accept.html", + "doc/html/man3/SSL_accept_stream.html", + "doc/html/man3/SSL_alert_type_string.html", + "doc/html/man3/SSL_alloc_buffers.html", + "doc/html/man3/SSL_check_chain.html", + "doc/html/man3/SSL_clear.html", + "doc/html/man3/SSL_connect.html", + "doc/html/man3/SSL_do_handshake.html", + "doc/html/man3/SSL_export_keying_material.html", + "doc/html/man3/SSL_extension_supported.html", + "doc/html/man3/SSL_free.html", + "doc/html/man3/SSL_get0_connection.html", + "doc/html/man3/SSL_get0_group_name.html", + "doc/html/man3/SSL_get0_peer_rpk.html", + "doc/html/man3/SSL_get0_peer_scts.html", + "doc/html/man3/SSL_get1_builtin_sigalgs.html", + "doc/html/man3/SSL_get_SSL_CTX.html", + "doc/html/man3/SSL_get_all_async_fds.html", + "doc/html/man3/SSL_get_certificate.html", + "doc/html/man3/SSL_get_ciphers.html", + "doc/html/man3/SSL_get_client_random.html", + "doc/html/man3/SSL_get_conn_close_info.html", + "doc/html/man3/SSL_get_current_cipher.html", + "doc/html/man3/SSL_get_default_timeout.html", + "doc/html/man3/SSL_get_error.html", + "doc/html/man3/SSL_get_event_timeout.html", + "doc/html/man3/SSL_get_extms_support.html", + "doc/html/man3/SSL_get_fd.html", + "doc/html/man3/SSL_get_handshake_rtt.html", + "doc/html/man3/SSL_get_peer_cert_chain.html", + "doc/html/man3/SSL_get_peer_certificate.html", + "doc/html/man3/SSL_get_peer_signature_nid.html", + "doc/html/man3/SSL_get_peer_tmp_key.html", + "doc/html/man3/SSL_get_psk_identity.html", + "doc/html/man3/SSL_get_rbio.html", + "doc/html/man3/SSL_get_rpoll_descriptor.html", + "doc/html/man3/SSL_get_session.html", + "doc/html/man3/SSL_get_shared_sigalgs.html", + "doc/html/man3/SSL_get_stream_id.html", + "doc/html/man3/SSL_get_stream_read_state.html", + "doc/html/man3/SSL_get_value_uint.html", + "doc/html/man3/SSL_get_verify_result.html", + "doc/html/man3/SSL_get_version.html", + "doc/html/man3/SSL_group_to_name.html", + "doc/html/man3/SSL_handle_events.html", + "doc/html/man3/SSL_in_init.html", + "doc/html/man3/SSL_inject_net_dgram.html", + "doc/html/man3/SSL_key_update.html", + "doc/html/man3/SSL_library_init.html", + "doc/html/man3/SSL_load_client_CA_file.html", + "doc/html/man3/SSL_new.html", + "doc/html/man3/SSL_new_domain.html", + "doc/html/man3/SSL_new_listener.html", + "doc/html/man3/SSL_new_stream.html", + "doc/html/man3/SSL_pending.html", + "doc/html/man3/SSL_poll.html", + "doc/html/man3/SSL_read.html", + "doc/html/man3/SSL_read_early_data.html", + "doc/html/man3/SSL_rstate_string.html", + "doc/html/man3/SSL_session_reused.html", + "doc/html/man3/SSL_set1_host.html", + "doc/html/man3/SSL_set1_initial_peer_addr.html", + "doc/html/man3/SSL_set1_server_cert_type.html", + "doc/html/man3/SSL_set_async_callback.html", + "doc/html/man3/SSL_set_bio.html", + "doc/html/man3/SSL_set_blocking_mode.html", + "doc/html/man3/SSL_set_connect_state.html", + "doc/html/man3/SSL_set_default_stream_mode.html", + "doc/html/man3/SSL_set_fd.html", + "doc/html/man3/SSL_set_incoming_stream_policy.html", + "doc/html/man3/SSL_set_quic_tls_cbs.html", + "doc/html/man3/SSL_set_retry_verify.html", + "doc/html/man3/SSL_set_session.html", + "doc/html/man3/SSL_set_session_secret_cb.html", + "doc/html/man3/SSL_set_shutdown.html", + "doc/html/man3/SSL_set_verify_result.html", + "doc/html/man3/SSL_shutdown.html", + "doc/html/man3/SSL_state_string.html", + "doc/html/man3/SSL_stream_conclude.html", + "doc/html/man3/SSL_stream_reset.html", + "doc/html/man3/SSL_want.html", + "doc/html/man3/SSL_write.html", + "doc/html/man3/TS_RESP_CTX_new.html", + "doc/html/man3/TS_VERIFY_CTX.html", + "doc/html/man3/UI_STRING.html", + "doc/html/man3/UI_UTIL_read_pw.html", + "doc/html/man3/UI_create_method.html", + "doc/html/man3/UI_new.html", + "doc/html/man3/X509V3_EXT_print.html", + "doc/html/man3/X509V3_get_d2i.html", + "doc/html/man3/X509V3_set_ctx.html", + "doc/html/man3/X509_ACERT_add1_attr.html", + "doc/html/man3/X509_ACERT_add_attr_nconf.html", + "doc/html/man3/X509_ACERT_get0_holder_baseCertId.html", + "doc/html/man3/X509_ACERT_get_attr.html", + "doc/html/man3/X509_ACERT_print_ex.html", + "doc/html/man3/X509_ALGOR_dup.html", + "doc/html/man3/X509_ATTRIBUTE.html", + "doc/html/man3/X509_CRL_get0_by_serial.html", + "doc/html/man3/X509_EXTENSION_set_object.html", + "doc/html/man3/X509_LOOKUP.html", + "doc/html/man3/X509_LOOKUP_hash_dir.html", + "doc/html/man3/X509_LOOKUP_meth_new.html", + "doc/html/man3/X509_NAME_ENTRY_get_object.html", + "doc/html/man3/X509_NAME_add_entry_by_txt.html", + "doc/html/man3/X509_NAME_get0_der.html", + "doc/html/man3/X509_NAME_get_index_by_NID.html", + "doc/html/man3/X509_NAME_print_ex.html", + "doc/html/man3/X509_PUBKEY_new.html", + "doc/html/man3/X509_REQ_get_attr.html", + "doc/html/man3/X509_REQ_get_extensions.html", + "doc/html/man3/X509_SIG_get0.html", + "doc/html/man3/X509_STORE_CTX_get_by_subject.html", + "doc/html/man3/X509_STORE_CTX_get_error.html", + "doc/html/man3/X509_STORE_CTX_new.html", + "doc/html/man3/X509_STORE_CTX_set_verify_cb.html", + "doc/html/man3/X509_STORE_add_cert.html", + "doc/html/man3/X509_STORE_get0_param.html", + "doc/html/man3/X509_STORE_new.html", + "doc/html/man3/X509_STORE_set_verify_cb_func.html", + "doc/html/man3/X509_VERIFY_PARAM_set_flags.html", + "doc/html/man3/X509_add_cert.html", + "doc/html/man3/X509_check_ca.html", + "doc/html/man3/X509_check_host.html", + "doc/html/man3/X509_check_issued.html", + "doc/html/man3/X509_check_private_key.html", + "doc/html/man3/X509_check_purpose.html", + "doc/html/man3/X509_cmp.html", + "doc/html/man3/X509_cmp_time.html", + "doc/html/man3/X509_digest.html", + "doc/html/man3/X509_dup.html", + "doc/html/man3/X509_get0_distinguishing_id.html", + "doc/html/man3/X509_get0_notBefore.html", + "doc/html/man3/X509_get0_signature.html", + "doc/html/man3/X509_get0_uids.html", + "doc/html/man3/X509_get_default_cert_file.html", + "doc/html/man3/X509_get_extension_flags.html", + "doc/html/man3/X509_get_pubkey.html", + "doc/html/man3/X509_get_serialNumber.html", + "doc/html/man3/X509_get_subject_name.html", + "doc/html/man3/X509_get_version.html", + "doc/html/man3/X509_load_http.html", + "doc/html/man3/X509_new.html", + "doc/html/man3/X509_sign.html", + "doc/html/man3/X509_verify.html", + "doc/html/man3/X509_verify_cert.html", + "doc/html/man3/X509v3_get_ext_by_NID.html", + "doc/html/man3/b2i_PVK_bio_ex.html", + "doc/html/man3/d2i_PKCS8PrivateKey_bio.html", + "doc/html/man3/d2i_PrivateKey.html", + "doc/html/man3/d2i_RSAPrivateKey.html", + "doc/html/man3/d2i_SSL_SESSION.html", + "doc/html/man3/d2i_X509.html", + "doc/html/man3/i2d_CMS_bio_stream.html", + "doc/html/man3/i2d_PKCS7_bio_stream.html", + "doc/html/man3/i2d_re_X509_tbs.html", + "doc/html/man3/o2i_SCT_LIST.html", + "doc/html/man3/s2i_ASN1_IA5STRING.html" + ], + "man5" => [ + "doc/html/man5/config.html", + "doc/html/man5/fips_config.html", + "doc/html/man5/x509v3_config.html" + ], + "man7" => [ + "doc/html/man7/EVP_ASYM_CIPHER-RSA.html", + "doc/html/man7/EVP_ASYM_CIPHER-SM2.html", + "doc/html/man7/EVP_CIPHER-AES.html", + "doc/html/man7/EVP_CIPHER-ARIA.html", + "doc/html/man7/EVP_CIPHER-BLOWFISH.html", + "doc/html/man7/EVP_CIPHER-CAMELLIA.html", + "doc/html/man7/EVP_CIPHER-CAST.html", + "doc/html/man7/EVP_CIPHER-CHACHA.html", + "doc/html/man7/EVP_CIPHER-DES.html", + "doc/html/man7/EVP_CIPHER-IDEA.html", + "doc/html/man7/EVP_CIPHER-NULL.html", + "doc/html/man7/EVP_CIPHER-RC2.html", + "doc/html/man7/EVP_CIPHER-RC4.html", + "doc/html/man7/EVP_CIPHER-RC5.html", + "doc/html/man7/EVP_CIPHER-SEED.html", + "doc/html/man7/EVP_CIPHER-SM4.html", + "doc/html/man7/EVP_KDF-ARGON2.html", + "doc/html/man7/EVP_KDF-HKDF.html", + "doc/html/man7/EVP_KDF-HMAC-DRBG.html", + "doc/html/man7/EVP_KDF-KB.html", + "doc/html/man7/EVP_KDF-KRB5KDF.html", + "doc/html/man7/EVP_KDF-PBKDF1.html", + "doc/html/man7/EVP_KDF-PBKDF2.html", + "doc/html/man7/EVP_KDF-PKCS12KDF.html", + "doc/html/man7/EVP_KDF-PVKKDF.html", + "doc/html/man7/EVP_KDF-SCRYPT.html", + "doc/html/man7/EVP_KDF-SS.html", + "doc/html/man7/EVP_KDF-SSHKDF.html", + "doc/html/man7/EVP_KDF-TLS13_KDF.html", + "doc/html/man7/EVP_KDF-TLS1_PRF.html", + "doc/html/man7/EVP_KDF-X942-ASN1.html", + "doc/html/man7/EVP_KDF-X942-CONCAT.html", + "doc/html/man7/EVP_KDF-X963.html", + "doc/html/man7/EVP_KEM-EC.html", + "doc/html/man7/EVP_KEM-ML-KEM.html", + "doc/html/man7/EVP_KEM-RSA.html", + "doc/html/man7/EVP_KEM-X25519.html", + "doc/html/man7/EVP_KEYEXCH-DH.html", + "doc/html/man7/EVP_KEYEXCH-ECDH.html", + "doc/html/man7/EVP_KEYEXCH-X25519.html", + "doc/html/man7/EVP_MAC-BLAKE2.html", + "doc/html/man7/EVP_MAC-CMAC.html", + "doc/html/man7/EVP_MAC-GMAC.html", + "doc/html/man7/EVP_MAC-HMAC.html", + "doc/html/man7/EVP_MAC-KMAC.html", + "doc/html/man7/EVP_MAC-Poly1305.html", + "doc/html/man7/EVP_MAC-Siphash.html", + "doc/html/man7/EVP_MD-BLAKE2.html", + "doc/html/man7/EVP_MD-KECCAK.html", + "doc/html/man7/EVP_MD-MD2.html", + "doc/html/man7/EVP_MD-MD4.html", + "doc/html/man7/EVP_MD-MD5-SHA1.html", + "doc/html/man7/EVP_MD-MD5.html", + "doc/html/man7/EVP_MD-MDC2.html", + "doc/html/man7/EVP_MD-NULL.html", + "doc/html/man7/EVP_MD-RIPEMD160.html", + "doc/html/man7/EVP_MD-SHA1.html", + "doc/html/man7/EVP_MD-SHA2.html", + "doc/html/man7/EVP_MD-SHA3.html", + "doc/html/man7/EVP_MD-SHAKE.html", + "doc/html/man7/EVP_MD-SM3.html", + "doc/html/man7/EVP_MD-WHIRLPOOL.html", + "doc/html/man7/EVP_MD-common.html", + "doc/html/man7/EVP_PKEY-DH.html", + "doc/html/man7/EVP_PKEY-DSA.html", + "doc/html/man7/EVP_PKEY-EC.html", + "doc/html/man7/EVP_PKEY-FFC.html", + "doc/html/man7/EVP_PKEY-HMAC.html", + "doc/html/man7/EVP_PKEY-ML-DSA.html", + "doc/html/man7/EVP_PKEY-ML-KEM.html", + "doc/html/man7/EVP_PKEY-RSA.html", + "doc/html/man7/EVP_PKEY-SLH-DSA.html", + "doc/html/man7/EVP_PKEY-SM2.html", + "doc/html/man7/EVP_PKEY-X25519.html", + "doc/html/man7/EVP_RAND-CRNG-TEST.html", + "doc/html/man7/EVP_RAND-CTR-DRBG.html", + "doc/html/man7/EVP_RAND-HASH-DRBG.html", + "doc/html/man7/EVP_RAND-HMAC-DRBG.html", + "doc/html/man7/EVP_RAND-JITTER.html", + "doc/html/man7/EVP_RAND-SEED-SRC.html", + "doc/html/man7/EVP_RAND-TEST-RAND.html", + "doc/html/man7/EVP_RAND.html", + "doc/html/man7/EVP_SIGNATURE-DSA.html", + "doc/html/man7/EVP_SIGNATURE-ECDSA.html", + "doc/html/man7/EVP_SIGNATURE-ED25519.html", + "doc/html/man7/EVP_SIGNATURE-HMAC.html", + "doc/html/man7/EVP_SIGNATURE-ML-DSA.html", + "doc/html/man7/EVP_SIGNATURE-RSA.html", + "doc/html/man7/EVP_SIGNATURE-SLH-DSA.html", + "doc/html/man7/OSSL_PROVIDER-FIPS.html", + "doc/html/man7/OSSL_PROVIDER-base.html", + "doc/html/man7/OSSL_PROVIDER-default.html", + "doc/html/man7/OSSL_PROVIDER-legacy.html", + "doc/html/man7/OSSL_PROVIDER-null.html", + "doc/html/man7/OSSL_STORE-winstore.html", + "doc/html/man7/RAND.html", + "doc/html/man7/RSA-PSS.html", + "doc/html/man7/X25519.html", + "doc/html/man7/bio.html", + "doc/html/man7/ct.html", + "doc/html/man7/des_modes.html", + "doc/html/man7/evp.html", + "doc/html/man7/fips_module.html", + "doc/html/man7/life_cycle-cipher.html", + "doc/html/man7/life_cycle-digest.html", + "doc/html/man7/life_cycle-kdf.html", + "doc/html/man7/life_cycle-mac.html", + "doc/html/man7/life_cycle-pkey.html", + "doc/html/man7/life_cycle-rand.html", + "doc/html/man7/openssl-core.h.html", + "doc/html/man7/openssl-core_dispatch.h.html", + "doc/html/man7/openssl-core_names.h.html", + "doc/html/man7/openssl-env.html", + "doc/html/man7/openssl-glossary.html", + "doc/html/man7/openssl-qlog.html", + "doc/html/man7/openssl-quic-concurrency.html", + "doc/html/man7/openssl-quic.html", + "doc/html/man7/openssl-threads.html", + "doc/html/man7/openssl_user_macros.html", + "doc/html/man7/ossl-guide-introduction.html", + "doc/html/man7/ossl-guide-libcrypto-introduction.html", + "doc/html/man7/ossl-guide-libraries-introduction.html", + "doc/html/man7/ossl-guide-libssl-introduction.html", + "doc/html/man7/ossl-guide-migration.html", + "doc/html/man7/ossl-guide-quic-client-block.html", + "doc/html/man7/ossl-guide-quic-client-non-block.html", + "doc/html/man7/ossl-guide-quic-introduction.html", + "doc/html/man7/ossl-guide-quic-multi-stream.html", + "doc/html/man7/ossl-guide-quic-server-block.html", + "doc/html/man7/ossl-guide-quic-server-non-block.html", + "doc/html/man7/ossl-guide-tls-client-block.html", + "doc/html/man7/ossl-guide-tls-client-non-block.html", + "doc/html/man7/ossl-guide-tls-introduction.html", + "doc/html/man7/ossl-guide-tls-server-block.html", + "doc/html/man7/ossl_store-file.html", + "doc/html/man7/ossl_store.html", + "doc/html/man7/passphrase-encoding.html", + "doc/html/man7/property.html", + "doc/html/man7/provider-asym_cipher.html", + "doc/html/man7/provider-base.html", + "doc/html/man7/provider-cipher.html", + "doc/html/man7/provider-decoder.html", + "doc/html/man7/provider-digest.html", + "doc/html/man7/provider-encoder.html", + "doc/html/man7/provider-kdf.html", + "doc/html/man7/provider-kem.html", + "doc/html/man7/provider-keyexch.html", + "doc/html/man7/provider-keymgmt.html", + "doc/html/man7/provider-mac.html", + "doc/html/man7/provider-object.html", + "doc/html/man7/provider-rand.html", + "doc/html/man7/provider-signature.html", + "doc/html/man7/provider-skeymgmt.html", + "doc/html/man7/provider-storemgmt.html", + "doc/html/man7/provider.html", + "doc/html/man7/proxy-certificates.html", + "doc/html/man7/x509.html" + ] + }, + "imagedocs" => { + "man7" => [ + "doc/man7/img/cipher.png", + "doc/man7/img/digest.png", + "doc/man7/img/kdf.png", + "doc/man7/img/mac.png", + "doc/man7/img/pkey.png", + "doc/man7/img/rand.png" + ] + }, + "includes" => { + "OpenSSLConfig.cmake" => [ + "." + ], + "OpenSSLConfigVersion.cmake" => [ + "." + ], + "apps/asn1parse.o" => [ + "apps" + ], + "apps/ca.o" => [ + "apps" + ], + "apps/ciphers.o" => [ + "apps" + ], + "apps/cmp.o" => [ + "apps" + ], + "apps/cms.o" => [ + "apps" + ], + "apps/crl.o" => [ + "apps" + ], + "apps/crl2pkcs7.o" => [ + "apps" + ], + "apps/dgst.o" => [ + "apps" + ], + "apps/dhparam.o" => [ + "apps" + ], + "apps/dsa.o" => [ + "apps" + ], + "apps/dsaparam.o" => [ + "apps" + ], + "apps/ec.o" => [ + "apps" + ], + "apps/ecparam.o" => [ + "apps" + ], + "apps/enc.o" => [ + "apps" + ], + "apps/engine.o" => [ + "apps" + ], + "apps/errstr.o" => [ + "apps" + ], + "apps/fipsinstall.o" => [ + "apps" + ], + "apps/gendsa.o" => [ + "apps" + ], + "apps/genpkey.o" => [ + "apps" + ], + "apps/genrsa.o" => [ + "apps" + ], + "apps/info.o" => [ + "apps" + ], + "apps/kdf.o" => [ + "apps" + ], + "apps/lib/cmp_mock_srv.o" => [ + "apps" + ], + "apps/lib/openssl-bin-cmp_mock_srv.o" => [ + "apps" + ], + "apps/libapps.a" => [ + ".", + "include", + "apps/include" + ], + "apps/list.o" => [ + "apps" + ], + "apps/mac.o" => [ + "apps" + ], + "apps/nseq.o" => [ + "apps" + ], + "apps/ocsp.o" => [ + "apps" + ], + "apps/openssl" => [ + ".", + "include", + "apps/include" + ], + "apps/openssl-bin-asn1parse.o" => [ + "apps" + ], + "apps/openssl-bin-ca.o" => [ + "apps" + ], + "apps/openssl-bin-ciphers.o" => [ + "apps" + ], + "apps/openssl-bin-cmp.o" => [ + "apps" + ], + "apps/openssl-bin-cms.o" => [ + "apps" + ], + "apps/openssl-bin-crl.o" => [ + "apps" + ], + "apps/openssl-bin-crl2pkcs7.o" => [ + "apps" + ], + "apps/openssl-bin-dgst.o" => [ + "apps" + ], + "apps/openssl-bin-dhparam.o" => [ + "apps" + ], + "apps/openssl-bin-dsa.o" => [ + "apps" + ], + "apps/openssl-bin-dsaparam.o" => [ + "apps" + ], + "apps/openssl-bin-ec.o" => [ + "apps" + ], + "apps/openssl-bin-ecparam.o" => [ + "apps" + ], + "apps/openssl-bin-enc.o" => [ + "apps" + ], + "apps/openssl-bin-engine.o" => [ + "apps" + ], + "apps/openssl-bin-errstr.o" => [ + "apps" + ], + "apps/openssl-bin-fipsinstall.o" => [ + "apps" + ], + "apps/openssl-bin-gendsa.o" => [ + "apps" + ], + "apps/openssl-bin-genpkey.o" => [ + "apps" + ], + "apps/openssl-bin-genrsa.o" => [ + "apps" + ], + "apps/openssl-bin-info.o" => [ + "apps" + ], + "apps/openssl-bin-kdf.o" => [ + "apps" + ], + "apps/openssl-bin-list.o" => [ + "apps" + ], + "apps/openssl-bin-mac.o" => [ + "apps" + ], + "apps/openssl-bin-nseq.o" => [ + "apps" + ], + "apps/openssl-bin-ocsp.o" => [ + "apps" + ], + "apps/openssl-bin-openssl.o" => [ + "apps" + ], + "apps/openssl-bin-passwd.o" => [ + "apps" + ], + "apps/openssl-bin-pkcs12.o" => [ + "apps" + ], + "apps/openssl-bin-pkcs7.o" => [ + "apps" + ], + "apps/openssl-bin-pkcs8.o" => [ + "apps" + ], + "apps/openssl-bin-pkey.o" => [ + "apps" + ], + "apps/openssl-bin-pkeyparam.o" => [ + "apps" + ], + "apps/openssl-bin-pkeyutl.o" => [ + "apps" + ], + "apps/openssl-bin-prime.o" => [ + "apps" + ], + "apps/openssl-bin-progs.o" => [ + "apps" + ], + "apps/openssl-bin-rand.o" => [ + "apps" + ], + "apps/openssl-bin-rehash.o" => [ + "apps" + ], + "apps/openssl-bin-req.o" => [ + "apps" + ], + "apps/openssl-bin-rsa.o" => [ + "apps" + ], + "apps/openssl-bin-rsautl.o" => [ + "apps" + ], + "apps/openssl-bin-s_client.o" => [ + "apps" + ], + "apps/openssl-bin-s_server.o" => [ + "apps" + ], + "apps/openssl-bin-s_time.o" => [ + "apps" + ], + "apps/openssl-bin-sess_id.o" => [ + "apps" + ], + "apps/openssl-bin-skeyutl.o" => [ + "apps" + ], + "apps/openssl-bin-smime.o" => [ + "apps" + ], + "apps/openssl-bin-speed.o" => [ + "apps" + ], + "apps/openssl-bin-spkac.o" => [ + "apps" + ], + "apps/openssl-bin-srp.o" => [ + "apps" + ], + "apps/openssl-bin-storeutl.o" => [ + "apps" + ], + "apps/openssl-bin-ts.o" => [ + "apps" + ], + "apps/openssl-bin-verify.o" => [ + "apps" + ], + "apps/openssl-bin-version.o" => [ + "apps" + ], + "apps/openssl-bin-x509.o" => [ + "apps" + ], + "apps/openssl.o" => [ + "apps" + ], + "apps/passwd.o" => [ + "apps" + ], + "apps/pkcs12.o" => [ + "apps" + ], + "apps/pkcs7.o" => [ + "apps" + ], + "apps/pkcs8.o" => [ + "apps" + ], + "apps/pkey.o" => [ + "apps" + ], + "apps/pkeyparam.o" => [ + "apps" + ], + "apps/pkeyutl.o" => [ + "apps" + ], + "apps/prime.o" => [ + "apps" + ], + "apps/progs.c" => [ + "." + ], + "apps/progs.o" => [ + "apps" + ], + "apps/rand.o" => [ + "apps" + ], + "apps/rehash.o" => [ + "apps" + ], + "apps/req.o" => [ + "apps" + ], + "apps/rsa.o" => [ + "apps" + ], + "apps/rsautl.o" => [ + "apps" + ], + "apps/s_client.o" => [ + "apps" + ], + "apps/s_server.o" => [ + "apps" + ], + "apps/s_time.o" => [ + "apps" + ], + "apps/sess_id.o" => [ + "apps" + ], + "apps/skeyutl.o" => [ + "apps" + ], + "apps/smime.o" => [ + "apps" + ], + "apps/speed.o" => [ + "apps" + ], + "apps/spkac.o" => [ + "apps" + ], + "apps/srp.o" => [ + "apps" + ], + "apps/storeutl.o" => [ + "apps" + ], + "apps/ts.o" => [ + "apps" + ], + "apps/verify.o" => [ + "apps" + ], + "apps/version.o" => [ + "apps" + ], + "apps/x509.o" => [ + "apps" + ], + "crypto/aes/aes-armv4.o" => [ + "crypto" + ], + "crypto/aes/aes-mips.o" => [ + "crypto" + ], + "crypto/aes/aes-s390x.o" => [ + "crypto" + ], + "crypto/aes/aes-sparcv9.o" => [ + "crypto" + ], + "crypto/aes/aesfx-sparcv9.o" => [ + "crypto" + ], + "crypto/aes/aest4-sparcv9.o" => [ + "crypto" + ], + "crypto/aes/aesv8-armx.o" => [ + "crypto" + ], + "crypto/aes/bsaes-armv7.o" => [ + "crypto" + ], + "crypto/aes/vpaes-armv8.o" => [ + "crypto" + ], + "crypto/aes/vpaes-loongarch64.o" => [ + "crypto" + ], + "crypto/arm64cpuid.o" => [ + "crypto" + ], + "crypto/armv4cpuid.o" => [ + "crypto" + ], + "crypto/bn/armv4-gf2m.o" => [ + "crypto" + ], + "crypto/bn/armv4-mont.o" => [ + "crypto" + ], + "crypto/bn/armv8-mont.o" => [ + "crypto" + ], + "crypto/bn/bn-mips.o" => [ + "crypto" + ], + "crypto/bn/bn_exp.o" => [ + "crypto" + ], + "crypto/bn/libcrypto-lib-bn_exp.o" => [ + "crypto" + ], + "crypto/bn/libfips-lib-bn_exp.o" => [ + "crypto" + ], + "crypto/bn/mips-mont.o" => [ + "crypto" + ], + "crypto/bn/sparct4-mont.o" => [ + "crypto" + ], + "crypto/bn/sparcv9-gf2m.o" => [ + "crypto" + ], + "crypto/bn/sparcv9-mont.o" => [ + "crypto" + ], + "crypto/bn/sparcv9a-mont.o" => [ + "crypto" + ], + "crypto/bn/vis3-mont.o" => [ + "crypto" + ], + "crypto/camellia/cmllt4-sparcv9.o" => [ + "crypto" + ], + "crypto/chacha/chacha-armv4.o" => [ + "crypto" + ], + "crypto/chacha/chacha-armv8-sve.o" => [ + "crypto" + ], + "crypto/chacha/chacha-armv8.o" => [ + "crypto" + ], + "crypto/chacha/chacha-loongarch64.o" => [ + "crypto" + ], + "crypto/chacha/chacha-s390x.o" => [ + "crypto" + ], + "crypto/cpuid.o" => [ + "." + ], + "crypto/cversion.o" => [ + "crypto" + ], + "crypto/des/dest4-sparcv9.o" => [ + "crypto" + ], + "crypto/ec/ecp_nistz256-armv4.o" => [ + "crypto" + ], + "crypto/ec/ecp_nistz256-armv8.o" => [ + "crypto" + ], + "crypto/ec/ecp_nistz256-sparcv9.o" => [ + "crypto" + ], + "crypto/ec/ecp_s390x_nistp.o" => [ + "crypto" + ], + "crypto/ec/ecp_sm2p256-armv8.o" => [ + "crypto" + ], + "crypto/ec/ecx_key.o" => [ + "crypto" + ], + "crypto/ec/ecx_meth.o" => [ + "crypto" + ], + "crypto/ec/ecx_s390x.o" => [ + "crypto" + ], + "crypto/ec/libcrypto-lib-ecx_key.o" => [ + "crypto" + ], + "crypto/ec/libcrypto-lib-ecx_meth.o" => [ + "crypto" + ], + "crypto/ec/libfips-lib-ecx_key.o" => [ + "crypto" + ], + "crypto/evp/e_aes.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/evp/e_aes_cbc_hmac_sha1.o" => [ + "crypto/modes" + ], + "crypto/evp/e_aes_cbc_hmac_sha256.o" => [ + "crypto/modes" + ], + "crypto/evp/e_aria.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/evp/e_camellia.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/evp/e_des.o" => [ + "crypto" + ], + "crypto/evp/e_des3.o" => [ + "crypto" + ], + "crypto/evp/e_sm4.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/evp/libcrypto-lib-e_aes.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha1.o" => [ + "crypto/modes" + ], + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha256.o" => [ + "crypto/modes" + ], + "crypto/evp/libcrypto-lib-e_aria.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/evp/libcrypto-lib-e_camellia.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/evp/libcrypto-lib-e_des.o" => [ + "crypto" + ], + "crypto/evp/libcrypto-lib-e_des3.o" => [ + "crypto" + ], + "crypto/evp/libcrypto-lib-e_sm4.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/info.o" => [ + "crypto" + ], + "crypto/libcrypto-lib-cpuid.o" => [ + "." + ], + "crypto/libcrypto-lib-cversion.o" => [ + "crypto" + ], + "crypto/libcrypto-lib-info.o" => [ + "crypto" + ], + "crypto/libfips-lib-cpuid.o" => [ + "." + ], + "crypto/md5/md5-aarch64.o" => [ + "crypto" + ], + "crypto/md5/md5-loongarch64.o" => [ + "crypto" + ], + "crypto/md5/md5-sparcv9.o" => [ + "crypto" + ], + "crypto/modes/aes-gcm-armv8-unroll8_64.o" => [ + "crypto" + ], + "crypto/modes/aes-gcm-armv8_64.o" => [ + "crypto" + ], + "crypto/modes/gcm128.o" => [ + "crypto" + ], + "crypto/modes/ghash-armv4.o" => [ + "crypto" + ], + "crypto/modes/ghash-s390x.o" => [ + "crypto" + ], + "crypto/modes/ghash-sparcv9.o" => [ + "crypto" + ], + "crypto/modes/ghashv8-armx.o" => [ + "crypto" + ], + "crypto/modes/libcrypto-lib-gcm128.o" => [ + "crypto" + ], + "crypto/modes/libfips-lib-gcm128.o" => [ + "crypto" + ], + "crypto/params_idx.c" => [ + "util/perl" + ], + "crypto/poly1305/poly1305-armv4.o" => [ + "crypto" + ], + "crypto/poly1305/poly1305-armv8.o" => [ + "crypto" + ], + "crypto/poly1305/poly1305-mips.o" => [ + "crypto" + ], + "crypto/poly1305/poly1305-s390x.o" => [ + "crypto" + ], + "crypto/poly1305/poly1305-sparcv9.o" => [ + "crypto" + ], + "crypto/s390xcpuid.o" => [ + "crypto" + ], + "crypto/sha/keccak1600-armv4.o" => [ + "crypto" + ], + "crypto/sha/keccak1600-armv8.o" => [ + "crypto" + ], + "crypto/sha/sha1-armv4-large.o" => [ + "crypto" + ], + "crypto/sha/sha1-armv8.o" => [ + "crypto" + ], + "crypto/sha/sha1-mips.o" => [ + "crypto" + ], + "crypto/sha/sha1-s390x.o" => [ + "crypto" + ], + "crypto/sha/sha1-sparcv9.o" => [ + "crypto" + ], + "crypto/sha/sha256-armv4.o" => [ + "crypto" + ], + "crypto/sha/sha256-armv8.o" => [ + "crypto" + ], + "crypto/sha/sha256-mips.o" => [ + "crypto" + ], + "crypto/sha/sha256-s390x.o" => [ + "crypto" + ], + "crypto/sha/sha256-sparcv9.o" => [ + "crypto" + ], + "crypto/sha/sha512-armv4.o" => [ + "crypto" + ], + "crypto/sha/sha512-armv8.o" => [ + "crypto" + ], + "crypto/sha/sha512-mips.o" => [ + "crypto" + ], + "crypto/sha/sha512-s390x.o" => [ + "crypto" + ], + "crypto/sha/sha512-sparcv9.o" => [ + "crypto" + ], + "crypto/sm3/sm3-armv8.o" => [ + "crypto" + ], + "crypto/sm4/sm4-armv8.o" => [ + "crypto" + ], + "crypto/sm4/vpsm4-armv8.o" => [ + "crypto" + ], + "crypto/sm4/vpsm4_ex-armv8.o" => [ + "crypto" + ], + "doc/man1/openssl-asn1parse.pod" => [ + "doc" + ], + "doc/man1/openssl-ca.pod" => [ + "doc" + ], + "doc/man1/openssl-ciphers.pod" => [ + "doc" + ], + "doc/man1/openssl-cmds.pod" => [ + "doc" + ], + "doc/man1/openssl-cmp.pod" => [ + "doc" + ], + "doc/man1/openssl-cms.pod" => [ + "doc" + ], + "doc/man1/openssl-crl.pod" => [ + "doc" + ], + "doc/man1/openssl-crl2pkcs7.pod" => [ + "doc" + ], + "doc/man1/openssl-dgst.pod" => [ + "doc" + ], + "doc/man1/openssl-dhparam.pod" => [ + "doc" + ], + "doc/man1/openssl-dsa.pod" => [ + "doc" + ], + "doc/man1/openssl-dsaparam.pod" => [ + "doc" + ], + "doc/man1/openssl-ec.pod" => [ + "doc" + ], + "doc/man1/openssl-ecparam.pod" => [ + "doc" + ], + "doc/man1/openssl-enc.pod" => [ + "doc" + ], + "doc/man1/openssl-engine.pod" => [ + "doc" + ], + "doc/man1/openssl-errstr.pod" => [ + "doc" + ], + "doc/man1/openssl-fipsinstall.pod" => [ + "doc" + ], + "doc/man1/openssl-gendsa.pod" => [ + "doc" + ], + "doc/man1/openssl-genpkey.pod" => [ + "doc" + ], + "doc/man1/openssl-genrsa.pod" => [ + "doc" + ], + "doc/man1/openssl-info.pod" => [ + "doc" + ], + "doc/man1/openssl-kdf.pod" => [ + "doc" + ], + "doc/man1/openssl-list.pod" => [ + "doc" + ], + "doc/man1/openssl-mac.pod" => [ + "doc" + ], + "doc/man1/openssl-nseq.pod" => [ + "doc" + ], + "doc/man1/openssl-ocsp.pod" => [ + "doc" + ], + "doc/man1/openssl-passwd.pod" => [ + "doc" + ], + "doc/man1/openssl-pkcs12.pod" => [ + "doc" + ], + "doc/man1/openssl-pkcs7.pod" => [ + "doc" + ], + "doc/man1/openssl-pkcs8.pod" => [ + "doc" + ], + "doc/man1/openssl-pkey.pod" => [ + "doc" + ], + "doc/man1/openssl-pkeyparam.pod" => [ + "doc" + ], + "doc/man1/openssl-pkeyutl.pod" => [ + "doc" + ], + "doc/man1/openssl-prime.pod" => [ + "doc" + ], + "doc/man1/openssl-rand.pod" => [ + "doc" + ], + "doc/man1/openssl-rehash.pod" => [ + "doc" + ], + "doc/man1/openssl-req.pod" => [ + "doc" + ], + "doc/man1/openssl-rsa.pod" => [ + "doc" + ], + "doc/man1/openssl-rsautl.pod" => [ + "doc" + ], + "doc/man1/openssl-s_client.pod" => [ + "doc" + ], + "doc/man1/openssl-s_server.pod" => [ + "doc" + ], + "doc/man1/openssl-s_time.pod" => [ + "doc" + ], + "doc/man1/openssl-sess_id.pod" => [ + "doc" + ], + "doc/man1/openssl-skeyutl.pod" => [ + "doc" + ], + "doc/man1/openssl-smime.pod" => [ + "doc" + ], + "doc/man1/openssl-speed.pod" => [ + "doc" + ], + "doc/man1/openssl-spkac.pod" => [ + "doc" + ], + "doc/man1/openssl-srp.pod" => [ + "doc" + ], + "doc/man1/openssl-storeutl.pod" => [ + "doc" + ], + "doc/man1/openssl-ts.pod" => [ + "doc" + ], + "doc/man1/openssl-verify.pod" => [ + "doc" + ], + "doc/man1/openssl-version.pod" => [ + "doc" + ], + "doc/man1/openssl-x509.pod" => [ + "doc" + ], + "exporters/OpenSSLConfig.cmake" => [ + "." + ], + "exporters/OpenSSLConfigVersion.cmake" => [ + "." + ], + "exporters/libcrypto.pc" => [ + "." + ], + "exporters/libssl.pc" => [ + "." + ], + "exporters/openssl.pc" => [ + "." + ], + "include/internal/param_names.h" => [ + "util/perl" + ], + "include/openssl/core_names.h" => [ + "util/perl" + ], + "libcrypto" => [ + ".", + "include", + "providers/common/include", + "providers/implementations/include" + ], + "libcrypto.ld" => [ + ".", + "util/perl/OpenSSL" + ], + "libcrypto.pc" => [ + "." + ], + "libssl" => [ + ".", + "include" + ], + "libssl.ld" => [ + ".", + "util/perl/OpenSSL" + ], + "libssl.pc" => [ + "." + ], + "openssl.pc" => [ + "." + ], + "providers/common/der/der_digests_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_digests_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_dsa_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_dsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_dsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_ec_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_ec_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_ec_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_ec_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_ecx_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_ecx_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_ecx_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_ml_dsa_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_ml_dsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_ml_dsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_rsa_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_rsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_rsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_rsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_slh_dsa_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_slh_dsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_slh_dsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_sm2_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_sm2_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_sm2_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_sm2_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_wrap_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_wrap_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_digests_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_dsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_dsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_ec_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_ec_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_ec_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_ecx_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_ecx_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_ml_dsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_ml_dsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_rsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_rsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_slh_dsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_slh_dsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_wrap_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libdefault-lib-der_rsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libdefault-lib-der_sm2_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libdefault-lib-der_sm2_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libdefault-lib-der_sm2_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libfips-lib-der_rsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/include/prov/der_digests.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_dsa.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_ec.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_ecx.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_ml_dsa.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_rsa.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_slh_dsa.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_sm2.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_wrap.h" => [ + "providers/common/der" + ], + "providers/fips" => [ + "include" + ], + "providers/implementations/encode_decode/encode_key2any.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/encode_decode/libdefault-lib-encode_key2any.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/kdfs/libdefault-lib-x942kdf.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/kdfs/libfips-lib-x942kdf.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/kdfs/x942kdf.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/ecdsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/eddsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libdefault-lib-dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libdefault-lib-ecdsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libdefault-lib-eddsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libdefault-lib-ml_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libdefault-lib-rsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libdefault-lib-slh_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libdefault-lib-sm2_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libfips-lib-dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libfips-lib-ecdsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libfips-lib-eddsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libfips-lib-ml_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libfips-lib-rsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libfips-lib-slh_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/ml_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/rsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/slh_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/sm2_sig.o" => [ + "providers/common/include/prov" + ], + "providers/legacy" => [ + "include", + "providers/implementations/include", + "providers/common/include" + ], + "providers/libcommon.a" => [ + "crypto", + "include", + "providers/implementations/include", + "providers/common/include", + "providers/fips/include" + ], + "providers/libdefault.a" => [ + ".", + "crypto", + "include", + "providers/implementations/include", + "providers/common/include", + "providers/fips/include" + ], + "providers/libfips.a" => [ + ".", + "crypto", + "include", + "providers/implementations/include", + "providers/common/include", + "providers/fips/include" + ], + "providers/liblegacy.a" => [ + ".", + "crypto", + "include", + "providers/implementations/include", + "providers/common/include", + "providers/fips/include" + ], + "providers/libtemplate.a" => [ + "crypto", + "include", + "providers/implementations/include", + "providers/common/include", + "providers/fips/include" + ], + "util/wrap.pl" => [ + "." + ] + }, + "ldadd" => {}, + "libraries" => [ + "apps/libapps.a", + "libcrypto", + "libssl", + "providers/libcommon.a", + "providers/libdefault.a", + "providers/libfips.a", + "providers/liblegacy.a", + "providers/libtemplate.a" + ], + "mandocs" => { + "man1" => [ + "doc/man/man1/CA.pl.1", + "doc/man/man1/openssl-asn1parse.1", + "doc/man/man1/openssl-ca.1", + "doc/man/man1/openssl-ciphers.1", + "doc/man/man1/openssl-cmds.1", + "doc/man/man1/openssl-cmp.1", + "doc/man/man1/openssl-cms.1", + "doc/man/man1/openssl-crl.1", + "doc/man/man1/openssl-crl2pkcs7.1", + "doc/man/man1/openssl-dgst.1", + "doc/man/man1/openssl-dhparam.1", + "doc/man/man1/openssl-dsa.1", + "doc/man/man1/openssl-dsaparam.1", + "doc/man/man1/openssl-ec.1", + "doc/man/man1/openssl-ecparam.1", + "doc/man/man1/openssl-enc.1", + "doc/man/man1/openssl-engine.1", + "doc/man/man1/openssl-errstr.1", + "doc/man/man1/openssl-fipsinstall.1", + "doc/man/man1/openssl-format-options.1", + "doc/man/man1/openssl-gendsa.1", + "doc/man/man1/openssl-genpkey.1", + "doc/man/man1/openssl-genrsa.1", + "doc/man/man1/openssl-info.1", + "doc/man/man1/openssl-kdf.1", + "doc/man/man1/openssl-list.1", + "doc/man/man1/openssl-mac.1", + "doc/man/man1/openssl-namedisplay-options.1", + "doc/man/man1/openssl-nseq.1", + "doc/man/man1/openssl-ocsp.1", + "doc/man/man1/openssl-passphrase-options.1", + "doc/man/man1/openssl-passwd.1", + "doc/man/man1/openssl-pkcs12.1", + "doc/man/man1/openssl-pkcs7.1", + "doc/man/man1/openssl-pkcs8.1", + "doc/man/man1/openssl-pkey.1", + "doc/man/man1/openssl-pkeyparam.1", + "doc/man/man1/openssl-pkeyutl.1", + "doc/man/man1/openssl-prime.1", + "doc/man/man1/openssl-rand.1", + "doc/man/man1/openssl-rehash.1", + "doc/man/man1/openssl-req.1", + "doc/man/man1/openssl-rsa.1", + "doc/man/man1/openssl-rsautl.1", + "doc/man/man1/openssl-s_client.1", + "doc/man/man1/openssl-s_server.1", + "doc/man/man1/openssl-s_time.1", + "doc/man/man1/openssl-sess_id.1", + "doc/man/man1/openssl-skeyutl.1", + "doc/man/man1/openssl-smime.1", + "doc/man/man1/openssl-speed.1", + "doc/man/man1/openssl-spkac.1", + "doc/man/man1/openssl-srp.1", + "doc/man/man1/openssl-storeutl.1", + "doc/man/man1/openssl-ts.1", + "doc/man/man1/openssl-verification-options.1", + "doc/man/man1/openssl-verify.1", + "doc/man/man1/openssl-version.1", + "doc/man/man1/openssl-x509.1", + "doc/man/man1/openssl.1", + "doc/man/man1/tsget.1" + ], + "man3" => [ + "doc/man/man3/ADMISSIONS.3", + "doc/man/man3/ASN1_EXTERN_FUNCS.3", + "doc/man/man3/ASN1_INTEGER_get_int64.3", + "doc/man/man3/ASN1_INTEGER_new.3", + "doc/man/man3/ASN1_ITEM_lookup.3", + "doc/man/man3/ASN1_OBJECT_new.3", + "doc/man/man3/ASN1_STRING_TABLE_add.3", + "doc/man/man3/ASN1_STRING_length.3", + "doc/man/man3/ASN1_STRING_new.3", + "doc/man/man3/ASN1_STRING_print_ex.3", + "doc/man/man3/ASN1_TIME_set.3", + "doc/man/man3/ASN1_TYPE_get.3", + "doc/man/man3/ASN1_aux_cb.3", + "doc/man/man3/ASN1_generate_nconf.3", + "doc/man/man3/ASN1_item_d2i_bio.3", + "doc/man/man3/ASN1_item_new.3", + "doc/man/man3/ASN1_item_sign.3", + "doc/man/man3/ASYNC_WAIT_CTX_new.3", + "doc/man/man3/ASYNC_start_job.3", + "doc/man/man3/BF_encrypt.3", + "doc/man/man3/BIO_ADDR.3", + "doc/man/man3/BIO_ADDRINFO.3", + "doc/man/man3/BIO_connect.3", + "doc/man/man3/BIO_ctrl.3", + "doc/man/man3/BIO_f_base64.3", + "doc/man/man3/BIO_f_buffer.3", + "doc/man/man3/BIO_f_cipher.3", + "doc/man/man3/BIO_f_md.3", + "doc/man/man3/BIO_f_null.3", + "doc/man/man3/BIO_f_prefix.3", + "doc/man/man3/BIO_f_readbuffer.3", + "doc/man/man3/BIO_f_ssl.3", + "doc/man/man3/BIO_find_type.3", + "doc/man/man3/BIO_get_data.3", + "doc/man/man3/BIO_get_ex_new_index.3", + "doc/man/man3/BIO_get_rpoll_descriptor.3", + "doc/man/man3/BIO_meth_new.3", + "doc/man/man3/BIO_new.3", + "doc/man/man3/BIO_new_CMS.3", + "doc/man/man3/BIO_parse_hostserv.3", + "doc/man/man3/BIO_printf.3", + "doc/man/man3/BIO_push.3", + "doc/man/man3/BIO_read.3", + "doc/man/man3/BIO_s_accept.3", + "doc/man/man3/BIO_s_bio.3", + "doc/man/man3/BIO_s_connect.3", + "doc/man/man3/BIO_s_core.3", + "doc/man/man3/BIO_s_datagram.3", + "doc/man/man3/BIO_s_dgram_pair.3", + "doc/man/man3/BIO_s_fd.3", + "doc/man/man3/BIO_s_file.3", + "doc/man/man3/BIO_s_mem.3", + "doc/man/man3/BIO_s_null.3", + "doc/man/man3/BIO_s_socket.3", + "doc/man/man3/BIO_sendmmsg.3", + "doc/man/man3/BIO_set_callback.3", + "doc/man/man3/BIO_set_flags.3", + "doc/man/man3/BIO_should_retry.3", + "doc/man/man3/BIO_socket_wait.3", + "doc/man/man3/BN_BLINDING_new.3", + "doc/man/man3/BN_CTX_new.3", + "doc/man/man3/BN_CTX_start.3", + "doc/man/man3/BN_add.3", + "doc/man/man3/BN_add_word.3", + "doc/man/man3/BN_bn2bin.3", + "doc/man/man3/BN_cmp.3", + "doc/man/man3/BN_copy.3", + "doc/man/man3/BN_generate_prime.3", + "doc/man/man3/BN_mod_exp_mont.3", + "doc/man/man3/BN_mod_inverse.3", + "doc/man/man3/BN_mod_mul_montgomery.3", + "doc/man/man3/BN_mod_mul_reciprocal.3", + "doc/man/man3/BN_new.3", + "doc/man/man3/BN_num_bytes.3", + "doc/man/man3/BN_rand.3", + "doc/man/man3/BN_security_bits.3", + "doc/man/man3/BN_set_bit.3", + "doc/man/man3/BN_swap.3", + "doc/man/man3/BN_zero.3", + "doc/man/man3/BUF_MEM_new.3", + "doc/man/man3/CMAC_CTX.3", + "doc/man/man3/CMS_EncryptedData_decrypt.3", + "doc/man/man3/CMS_EncryptedData_encrypt.3", + "doc/man/man3/CMS_EncryptedData_set1_key.3", + "doc/man/man3/CMS_EnvelopedData_create.3", + "doc/man/man3/CMS_add0_cert.3", + "doc/man/man3/CMS_add1_recipient_cert.3", + "doc/man/man3/CMS_add1_signer.3", + "doc/man/man3/CMS_compress.3", + "doc/man/man3/CMS_data_create.3", + "doc/man/man3/CMS_decrypt.3", + "doc/man/man3/CMS_digest_create.3", + "doc/man/man3/CMS_encrypt.3", + "doc/man/man3/CMS_final.3", + "doc/man/man3/CMS_get0_RecipientInfos.3", + "doc/man/man3/CMS_get0_SignerInfos.3", + "doc/man/man3/CMS_get0_type.3", + "doc/man/man3/CMS_get1_ReceiptRequest.3", + "doc/man/man3/CMS_sign.3", + "doc/man/man3/CMS_sign_receipt.3", + "doc/man/man3/CMS_signed_get_attr.3", + "doc/man/man3/CMS_uncompress.3", + "doc/man/man3/CMS_verify.3", + "doc/man/man3/CMS_verify_receipt.3", + "doc/man/man3/COMP_CTX_new.3", + "doc/man/man3/CONF_modules_free.3", + "doc/man/man3/CONF_modules_load_file.3", + "doc/man/man3/CRYPTO_THREAD_run_once.3", + "doc/man/man3/CRYPTO_get_ex_new_index.3", + "doc/man/man3/CRYPTO_memcmp.3", + "doc/man/man3/CTLOG_STORE_get0_log_by_id.3", + "doc/man/man3/CTLOG_STORE_new.3", + "doc/man/man3/CTLOG_new.3", + "doc/man/man3/CT_POLICY_EVAL_CTX_new.3", + "doc/man/man3/DEFINE_STACK_OF.3", + "doc/man/man3/DES_random_key.3", + "doc/man/man3/DH_generate_key.3", + "doc/man/man3/DH_generate_parameters.3", + "doc/man/man3/DH_get0_pqg.3", + "doc/man/man3/DH_get_1024_160.3", + "doc/man/man3/DH_meth_new.3", + "doc/man/man3/DH_new.3", + "doc/man/man3/DH_new_by_nid.3", + "doc/man/man3/DH_set_method.3", + "doc/man/man3/DH_size.3", + "doc/man/man3/DSA_SIG_new.3", + "doc/man/man3/DSA_do_sign.3", + "doc/man/man3/DSA_dup_DH.3", + "doc/man/man3/DSA_generate_key.3", + "doc/man/man3/DSA_generate_parameters.3", + "doc/man/man3/DSA_get0_pqg.3", + "doc/man/man3/DSA_meth_new.3", + "doc/man/man3/DSA_new.3", + "doc/man/man3/DSA_set_method.3", + "doc/man/man3/DSA_sign.3", + "doc/man/man3/DSA_size.3", + "doc/man/man3/DTLS_get_data_mtu.3", + "doc/man/man3/DTLS_set_timer_cb.3", + "doc/man/man3/DTLSv1_get_timeout.3", + "doc/man/man3/DTLSv1_handle_timeout.3", + "doc/man/man3/DTLSv1_listen.3", + "doc/man/man3/ECDSA_SIG_new.3", + "doc/man/man3/ECDSA_sign.3", + "doc/man/man3/ECPKParameters_print.3", + "doc/man/man3/EC_GFp_simple_method.3", + "doc/man/man3/EC_GROUP_copy.3", + "doc/man/man3/EC_GROUP_new.3", + "doc/man/man3/EC_KEY_get_enc_flags.3", + "doc/man/man3/EC_KEY_new.3", + "doc/man/man3/EC_POINT_add.3", + "doc/man/man3/EC_POINT_new.3", + "doc/man/man3/ENGINE_add.3", + "doc/man/man3/ERR_GET_LIB.3", + "doc/man/man3/ERR_clear_error.3", + "doc/man/man3/ERR_error_string.3", + "doc/man/man3/ERR_get_error.3", + "doc/man/man3/ERR_load_crypto_strings.3", + "doc/man/man3/ERR_load_strings.3", + "doc/man/man3/ERR_new.3", + "doc/man/man3/ERR_print_errors.3", + "doc/man/man3/ERR_put_error.3", + "doc/man/man3/ERR_remove_state.3", + "doc/man/man3/ERR_set_mark.3", + "doc/man/man3/EVP_ASYM_CIPHER_free.3", + "doc/man/man3/EVP_BytesToKey.3", + "doc/man/man3/EVP_CIPHER_CTX_get_app_data.3", + "doc/man/man3/EVP_CIPHER_CTX_get_cipher_data.3", + "doc/man/man3/EVP_CIPHER_CTX_get_original_iv.3", + "doc/man/man3/EVP_CIPHER_meth_new.3", + "doc/man/man3/EVP_DigestInit.3", + "doc/man/man3/EVP_DigestSignInit.3", + "doc/man/man3/EVP_DigestVerifyInit.3", + "doc/man/man3/EVP_EncodeInit.3", + "doc/man/man3/EVP_EncryptInit.3", + "doc/man/man3/EVP_KDF.3", + "doc/man/man3/EVP_KEM_free.3", + "doc/man/man3/EVP_KEYEXCH_free.3", + "doc/man/man3/EVP_KEYMGMT.3", + "doc/man/man3/EVP_MAC.3", + "doc/man/man3/EVP_MD_meth_new.3", + "doc/man/man3/EVP_OpenInit.3", + "doc/man/man3/EVP_PBE_CipherInit.3", + "doc/man/man3/EVP_PKEY2PKCS8.3", + "doc/man/man3/EVP_PKEY_ASN1_METHOD.3", + "doc/man/man3/EVP_PKEY_CTX_ctrl.3", + "doc/man/man3/EVP_PKEY_CTX_get0_libctx.3", + "doc/man/man3/EVP_PKEY_CTX_get0_pkey.3", + "doc/man/man3/EVP_PKEY_CTX_get_algor.3", + "doc/man/man3/EVP_PKEY_CTX_new.3", + "doc/man/man3/EVP_PKEY_CTX_set1_pbe_pass.3", + "doc/man/man3/EVP_PKEY_CTX_set_hkdf_md.3", + "doc/man/man3/EVP_PKEY_CTX_set_params.3", + "doc/man/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.3", + "doc/man/man3/EVP_PKEY_CTX_set_scrypt_N.3", + "doc/man/man3/EVP_PKEY_CTX_set_tls1_prf_md.3", + "doc/man/man3/EVP_PKEY_asn1_get_count.3", + "doc/man/man3/EVP_PKEY_check.3", + "doc/man/man3/EVP_PKEY_copy_parameters.3", + "doc/man/man3/EVP_PKEY_decapsulate.3", + "doc/man/man3/EVP_PKEY_decrypt.3", + "doc/man/man3/EVP_PKEY_derive.3", + "doc/man/man3/EVP_PKEY_digestsign_supports_digest.3", + "doc/man/man3/EVP_PKEY_encapsulate.3", + "doc/man/man3/EVP_PKEY_encrypt.3", + "doc/man/man3/EVP_PKEY_fromdata.3", + "doc/man/man3/EVP_PKEY_get_attr.3", + "doc/man/man3/EVP_PKEY_get_default_digest_nid.3", + "doc/man/man3/EVP_PKEY_get_field_type.3", + "doc/man/man3/EVP_PKEY_get_group_name.3", + "doc/man/man3/EVP_PKEY_get_size.3", + "doc/man/man3/EVP_PKEY_gettable_params.3", + "doc/man/man3/EVP_PKEY_is_a.3", + "doc/man/man3/EVP_PKEY_keygen.3", + "doc/man/man3/EVP_PKEY_meth_get_count.3", + "doc/man/man3/EVP_PKEY_meth_new.3", + "doc/man/man3/EVP_PKEY_new.3", + "doc/man/man3/EVP_PKEY_print_private.3", + "doc/man/man3/EVP_PKEY_set1_RSA.3", + "doc/man/man3/EVP_PKEY_set1_encoded_public_key.3", + "doc/man/man3/EVP_PKEY_set_type.3", + "doc/man/man3/EVP_PKEY_settable_params.3", + "doc/man/man3/EVP_PKEY_sign.3", + "doc/man/man3/EVP_PKEY_todata.3", + "doc/man/man3/EVP_PKEY_verify.3", + "doc/man/man3/EVP_PKEY_verify_recover.3", + "doc/man/man3/EVP_RAND.3", + "doc/man/man3/EVP_SIGNATURE.3", + "doc/man/man3/EVP_SKEY.3", + "doc/man/man3/EVP_SKEYMGMT.3", + "doc/man/man3/EVP_SealInit.3", + "doc/man/man3/EVP_SignInit.3", + "doc/man/man3/EVP_VerifyInit.3", + "doc/man/man3/EVP_aes_128_gcm.3", + "doc/man/man3/EVP_aria_128_gcm.3", + "doc/man/man3/EVP_bf_cbc.3", + "doc/man/man3/EVP_blake2b512.3", + "doc/man/man3/EVP_camellia_128_ecb.3", + "doc/man/man3/EVP_cast5_cbc.3", + "doc/man/man3/EVP_chacha20.3", + "doc/man/man3/EVP_des_cbc.3", + "doc/man/man3/EVP_desx_cbc.3", + "doc/man/man3/EVP_idea_cbc.3", + "doc/man/man3/EVP_md2.3", + "doc/man/man3/EVP_md4.3", + "doc/man/man3/EVP_md5.3", + "doc/man/man3/EVP_mdc2.3", + "doc/man/man3/EVP_rc2_cbc.3", + "doc/man/man3/EVP_rc4.3", + "doc/man/man3/EVP_rc5_32_12_16_cbc.3", + "doc/man/man3/EVP_ripemd160.3", + "doc/man/man3/EVP_seed_cbc.3", + "doc/man/man3/EVP_set_default_properties.3", + "doc/man/man3/EVP_sha1.3", + "doc/man/man3/EVP_sha224.3", + "doc/man/man3/EVP_sha3_224.3", + "doc/man/man3/EVP_sm3.3", + "doc/man/man3/EVP_sm4_cbc.3", + "doc/man/man3/EVP_whirlpool.3", + "doc/man/man3/GENERAL_NAME.3", + "doc/man/man3/HMAC.3", + "doc/man/man3/MD5.3", + "doc/man/man3/MDC2_Init.3", + "doc/man/man3/NCONF_new_ex.3", + "doc/man/man3/OBJ_nid2obj.3", + "doc/man/man3/OCSP_REQUEST_new.3", + "doc/man/man3/OCSP_cert_to_id.3", + "doc/man/man3/OCSP_request_add1_nonce.3", + "doc/man/man3/OCSP_resp_find_status.3", + "doc/man/man3/OCSP_response_status.3", + "doc/man/man3/OCSP_sendreq_new.3", + "doc/man/man3/OPENSSL_Applink.3", + "doc/man/man3/OPENSSL_FILE.3", + "doc/man/man3/OPENSSL_LH_COMPFUNC.3", + "doc/man/man3/OPENSSL_LH_stats.3", + "doc/man/man3/OPENSSL_config.3", + "doc/man/man3/OPENSSL_fork_prepare.3", + "doc/man/man3/OPENSSL_gmtime.3", + "doc/man/man3/OPENSSL_hexchar2int.3", + "doc/man/man3/OPENSSL_ia32cap.3", + "doc/man/man3/OPENSSL_init_crypto.3", + "doc/man/man3/OPENSSL_init_ssl.3", + "doc/man/man3/OPENSSL_instrument_bus.3", + "doc/man/man3/OPENSSL_load_builtin_modules.3", + "doc/man/man3/OPENSSL_load_u16_le.3", + "doc/man/man3/OPENSSL_malloc.3", + "doc/man/man3/OPENSSL_ppccap.3", + "doc/man/man3/OPENSSL_riscvcap.3", + "doc/man/man3/OPENSSL_s390xcap.3", + "doc/man/man3/OPENSSL_secure_malloc.3", + "doc/man/man3/OPENSSL_strcasecmp.3", + "doc/man/man3/OSSL_ALGORITHM.3", + "doc/man/man3/OSSL_CALLBACK.3", + "doc/man/man3/OSSL_CMP_ATAV_set0.3", + "doc/man/man3/OSSL_CMP_CTX_new.3", + "doc/man/man3/OSSL_CMP_HDR_get0_transactionID.3", + "doc/man/man3/OSSL_CMP_ITAV_new_caCerts.3", + "doc/man/man3/OSSL_CMP_ITAV_set0.3", + "doc/man/man3/OSSL_CMP_MSG_get0_header.3", + "doc/man/man3/OSSL_CMP_MSG_http_perform.3", + "doc/man/man3/OSSL_CMP_SRV_CTX_new.3", + "doc/man/man3/OSSL_CMP_STATUSINFO_new.3", + "doc/man/man3/OSSL_CMP_exec_certreq.3", + "doc/man/man3/OSSL_CMP_log_open.3", + "doc/man/man3/OSSL_CMP_validate_msg.3", + "doc/man/man3/OSSL_CORE_MAKE_FUNC.3", + "doc/man/man3/OSSL_CRMF_MSG_get0_tmpl.3", + "doc/man/man3/OSSL_CRMF_MSG_set0_validity.3", + "doc/man/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.3", + "doc/man/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.3", + "doc/man/man3/OSSL_CRMF_pbmp_new.3", + "doc/man/man3/OSSL_DECODER.3", + "doc/man/man3/OSSL_DECODER_CTX.3", + "doc/man/man3/OSSL_DECODER_CTX_new_for_pkey.3", + "doc/man/man3/OSSL_DECODER_from_bio.3", + "doc/man/man3/OSSL_DISPATCH.3", + "doc/man/man3/OSSL_ENCODER.3", + "doc/man/man3/OSSL_ENCODER_CTX.3", + "doc/man/man3/OSSL_ENCODER_CTX_new_for_pkey.3", + "doc/man/man3/OSSL_ENCODER_to_bio.3", + "doc/man/man3/OSSL_ERR_STATE_save.3", + "doc/man/man3/OSSL_ESS_check_signing_certs.3", + "doc/man/man3/OSSL_GENERAL_NAMES_print.3", + "doc/man/man3/OSSL_HPKE_CTX_new.3", + "doc/man/man3/OSSL_HTTP_REQ_CTX.3", + "doc/man/man3/OSSL_HTTP_parse_url.3", + "doc/man/man3/OSSL_HTTP_transfer.3", + "doc/man/man3/OSSL_IETF_ATTR_SYNTAX.3", + "doc/man/man3/OSSL_IETF_ATTR_SYNTAX_print.3", + "doc/man/man3/OSSL_INDICATOR_set_callback.3", + "doc/man/man3/OSSL_ITEM.3", + "doc/man/man3/OSSL_LIB_CTX.3", + "doc/man/man3/OSSL_LIB_CTX_set_conf_diagnostics.3", + "doc/man/man3/OSSL_PARAM.3", + "doc/man/man3/OSSL_PARAM_BLD.3", + "doc/man/man3/OSSL_PARAM_allocate_from_text.3", + "doc/man/man3/OSSL_PARAM_dup.3", + "doc/man/man3/OSSL_PARAM_int.3", + "doc/man/man3/OSSL_PARAM_print_to_bio.3", + "doc/man/man3/OSSL_PROVIDER.3", + "doc/man/man3/OSSL_QUIC_client_method.3", + "doc/man/man3/OSSL_SELF_TEST_new.3", + "doc/man/man3/OSSL_SELF_TEST_set_callback.3", + "doc/man/man3/OSSL_STORE_INFO.3", + "doc/man/man3/OSSL_STORE_LOADER.3", + "doc/man/man3/OSSL_STORE_SEARCH.3", + "doc/man/man3/OSSL_STORE_attach.3", + "doc/man/man3/OSSL_STORE_expect.3", + "doc/man/man3/OSSL_STORE_open.3", + "doc/man/man3/OSSL_sleep.3", + "doc/man/man3/OSSL_trace_enabled.3", + "doc/man/man3/OSSL_trace_get_category_num.3", + "doc/man/man3/OSSL_trace_set_channel.3", + "doc/man/man3/OpenSSL_add_all_algorithms.3", + "doc/man/man3/OpenSSL_version.3", + "doc/man/man3/PBMAC1_get1_pbkdf2_param.3", + "doc/man/man3/PEM_X509_INFO_read_bio_ex.3", + "doc/man/man3/PEM_bytes_read_bio.3", + "doc/man/man3/PEM_read.3", + "doc/man/man3/PEM_read_CMS.3", + "doc/man/man3/PEM_read_bio_PrivateKey.3", + "doc/man/man3/PEM_read_bio_ex.3", + "doc/man/man3/PEM_write_bio_CMS_stream.3", + "doc/man/man3/PEM_write_bio_PKCS7_stream.3", + "doc/man/man3/PKCS12_PBE_keyivgen.3", + "doc/man/man3/PKCS12_SAFEBAG_create_cert.3", + "doc/man/man3/PKCS12_SAFEBAG_get0_attrs.3", + "doc/man/man3/PKCS12_SAFEBAG_get1_cert.3", + "doc/man/man3/PKCS12_SAFEBAG_set0_attrs.3", + "doc/man/man3/PKCS12_add1_attr_by_NID.3", + "doc/man/man3/PKCS12_add_CSPName_asc.3", + "doc/man/man3/PKCS12_add_cert.3", + "doc/man/man3/PKCS12_add_friendlyname_asc.3", + "doc/man/man3/PKCS12_add_localkeyid.3", + "doc/man/man3/PKCS12_add_safe.3", + "doc/man/man3/PKCS12_create.3", + "doc/man/man3/PKCS12_decrypt_skey.3", + "doc/man/man3/PKCS12_gen_mac.3", + "doc/man/man3/PKCS12_get_friendlyname.3", + "doc/man/man3/PKCS12_init.3", + "doc/man/man3/PKCS12_item_decrypt_d2i.3", + "doc/man/man3/PKCS12_key_gen_utf8_ex.3", + "doc/man/man3/PKCS12_newpass.3", + "doc/man/man3/PKCS12_pack_p7encdata.3", + "doc/man/man3/PKCS12_parse.3", + "doc/man/man3/PKCS5_PBE_keyivgen.3", + "doc/man/man3/PKCS5_PBKDF2_HMAC.3", + "doc/man/man3/PKCS7_decrypt.3", + "doc/man/man3/PKCS7_encrypt.3", + "doc/man/man3/PKCS7_get_octet_string.3", + "doc/man/man3/PKCS7_sign.3", + "doc/man/man3/PKCS7_sign_add_signer.3", + "doc/man/man3/PKCS7_type_is_other.3", + "doc/man/man3/PKCS7_verify.3", + "doc/man/man3/PKCS8_encrypt.3", + "doc/man/man3/PKCS8_pkey_add1_attr.3", + "doc/man/man3/RAND_add.3", + "doc/man/man3/RAND_bytes.3", + "doc/man/man3/RAND_cleanup.3", + "doc/man/man3/RAND_egd.3", + "doc/man/man3/RAND_get0_primary.3", + "doc/man/man3/RAND_load_file.3", + "doc/man/man3/RAND_set_DRBG_type.3", + "doc/man/man3/RAND_set_rand_method.3", + "doc/man/man3/RC4_set_key.3", + "doc/man/man3/RIPEMD160_Init.3", + "doc/man/man3/RSA_blinding_on.3", + "doc/man/man3/RSA_check_key.3", + "doc/man/man3/RSA_generate_key.3", + "doc/man/man3/RSA_get0_key.3", + "doc/man/man3/RSA_meth_new.3", + "doc/man/man3/RSA_new.3", + "doc/man/man3/RSA_padding_add_PKCS1_type_1.3", + "doc/man/man3/RSA_print.3", + "doc/man/man3/RSA_private_encrypt.3", + "doc/man/man3/RSA_public_encrypt.3", + "doc/man/man3/RSA_set_method.3", + "doc/man/man3/RSA_sign.3", + "doc/man/man3/RSA_sign_ASN1_OCTET_STRING.3", + "doc/man/man3/RSA_size.3", + "doc/man/man3/SCT_new.3", + "doc/man/man3/SCT_print.3", + "doc/man/man3/SCT_validate.3", + "doc/man/man3/SHA256_Init.3", + "doc/man/man3/SMIME_read_ASN1.3", + "doc/man/man3/SMIME_read_CMS.3", + "doc/man/man3/SMIME_read_PKCS7.3", + "doc/man/man3/SMIME_write_ASN1.3", + "doc/man/man3/SMIME_write_CMS.3", + "doc/man/man3/SMIME_write_PKCS7.3", + "doc/man/man3/SRP_Calc_B.3", + "doc/man/man3/SRP_VBASE_new.3", + "doc/man/man3/SRP_create_verifier.3", + "doc/man/man3/SRP_user_pwd_new.3", + "doc/man/man3/SSL_CIPHER_get_name.3", + "doc/man/man3/SSL_COMP_add_compression_method.3", + "doc/man/man3/SSL_CONF_CTX_new.3", + "doc/man/man3/SSL_CONF_CTX_set1_prefix.3", + "doc/man/man3/SSL_CONF_CTX_set_flags.3", + "doc/man/man3/SSL_CONF_CTX_set_ssl_ctx.3", + "doc/man/man3/SSL_CONF_cmd.3", + "doc/man/man3/SSL_CONF_cmd_argv.3", + "doc/man/man3/SSL_CTX_add1_chain_cert.3", + "doc/man/man3/SSL_CTX_add_extra_chain_cert.3", + "doc/man/man3/SSL_CTX_add_session.3", + "doc/man/man3/SSL_CTX_config.3", + "doc/man/man3/SSL_CTX_ctrl.3", + "doc/man/man3/SSL_CTX_dane_enable.3", + "doc/man/man3/SSL_CTX_flush_sessions.3", + "doc/man/man3/SSL_CTX_free.3", + "doc/man/man3/SSL_CTX_get0_param.3", + "doc/man/man3/SSL_CTX_get_verify_mode.3", + "doc/man/man3/SSL_CTX_has_client_custom_ext.3", + "doc/man/man3/SSL_CTX_load_verify_locations.3", + "doc/man/man3/SSL_CTX_new.3", + "doc/man/man3/SSL_CTX_sess_number.3", + "doc/man/man3/SSL_CTX_sess_set_cache_size.3", + "doc/man/man3/SSL_CTX_sess_set_get_cb.3", + "doc/man/man3/SSL_CTX_sessions.3", + "doc/man/man3/SSL_CTX_set0_CA_list.3", + "doc/man/man3/SSL_CTX_set1_cert_comp_preference.3", + "doc/man/man3/SSL_CTX_set1_curves.3", + "doc/man/man3/SSL_CTX_set1_sigalgs.3", + "doc/man/man3/SSL_CTX_set1_verify_cert_store.3", + "doc/man/man3/SSL_CTX_set_alpn_select_cb.3", + "doc/man/man3/SSL_CTX_set_cert_cb.3", + "doc/man/man3/SSL_CTX_set_cert_store.3", + "doc/man/man3/SSL_CTX_set_cert_verify_callback.3", + "doc/man/man3/SSL_CTX_set_cipher_list.3", + "doc/man/man3/SSL_CTX_set_client_cert_cb.3", + "doc/man/man3/SSL_CTX_set_client_hello_cb.3", + "doc/man/man3/SSL_CTX_set_ct_validation_callback.3", + "doc/man/man3/SSL_CTX_set_ctlog_list_file.3", + "doc/man/man3/SSL_CTX_set_default_passwd_cb.3", + "doc/man/man3/SSL_CTX_set_domain_flags.3", + "doc/man/man3/SSL_CTX_set_generate_session_id.3", + "doc/man/man3/SSL_CTX_set_info_callback.3", + "doc/man/man3/SSL_CTX_set_keylog_callback.3", + "doc/man/man3/SSL_CTX_set_max_cert_list.3", + "doc/man/man3/SSL_CTX_set_min_proto_version.3", + "doc/man/man3/SSL_CTX_set_mode.3", + "doc/man/man3/SSL_CTX_set_msg_callback.3", + "doc/man/man3/SSL_CTX_set_new_pending_conn_cb.3", + "doc/man/man3/SSL_CTX_set_num_tickets.3", + "doc/man/man3/SSL_CTX_set_options.3", + "doc/man/man3/SSL_CTX_set_psk_client_callback.3", + "doc/man/man3/SSL_CTX_set_quiet_shutdown.3", + "doc/man/man3/SSL_CTX_set_read_ahead.3", + "doc/man/man3/SSL_CTX_set_record_padding_callback.3", + "doc/man/man3/SSL_CTX_set_security_level.3", + "doc/man/man3/SSL_CTX_set_session_cache_mode.3", + "doc/man/man3/SSL_CTX_set_session_id_context.3", + "doc/man/man3/SSL_CTX_set_session_ticket_cb.3", + "doc/man/man3/SSL_CTX_set_split_send_fragment.3", + "doc/man/man3/SSL_CTX_set_srp_password.3", + "doc/man/man3/SSL_CTX_set_ssl_version.3", + "doc/man/man3/SSL_CTX_set_stateless_cookie_generate_cb.3", + "doc/man/man3/SSL_CTX_set_timeout.3", + "doc/man/man3/SSL_CTX_set_tlsext_servername_callback.3", + "doc/man/man3/SSL_CTX_set_tlsext_status_cb.3", + "doc/man/man3/SSL_CTX_set_tlsext_ticket_key_cb.3", + "doc/man/man3/SSL_CTX_set_tlsext_use_srtp.3", + "doc/man/man3/SSL_CTX_set_tmp_dh_callback.3", + "doc/man/man3/SSL_CTX_set_tmp_ecdh.3", + "doc/man/man3/SSL_CTX_set_verify.3", + "doc/man/man3/SSL_CTX_use_certificate.3", + "doc/man/man3/SSL_CTX_use_psk_identity_hint.3", + "doc/man/man3/SSL_CTX_use_serverinfo.3", + "doc/man/man3/SSL_SESSION_free.3", + "doc/man/man3/SSL_SESSION_get0_cipher.3", + "doc/man/man3/SSL_SESSION_get0_hostname.3", + "doc/man/man3/SSL_SESSION_get0_id_context.3", + "doc/man/man3/SSL_SESSION_get0_peer.3", + "doc/man/man3/SSL_SESSION_get_compress_id.3", + "doc/man/man3/SSL_SESSION_get_protocol_version.3", + "doc/man/man3/SSL_SESSION_get_time.3", + "doc/man/man3/SSL_SESSION_has_ticket.3", + "doc/man/man3/SSL_SESSION_is_resumable.3", + "doc/man/man3/SSL_SESSION_print.3", + "doc/man/man3/SSL_SESSION_set1_id.3", + "doc/man/man3/SSL_accept.3", + "doc/man/man3/SSL_accept_stream.3", + "doc/man/man3/SSL_alert_type_string.3", + "doc/man/man3/SSL_alloc_buffers.3", + "doc/man/man3/SSL_check_chain.3", + "doc/man/man3/SSL_clear.3", + "doc/man/man3/SSL_connect.3", + "doc/man/man3/SSL_do_handshake.3", + "doc/man/man3/SSL_export_keying_material.3", + "doc/man/man3/SSL_extension_supported.3", + "doc/man/man3/SSL_free.3", + "doc/man/man3/SSL_get0_connection.3", + "doc/man/man3/SSL_get0_group_name.3", + "doc/man/man3/SSL_get0_peer_rpk.3", + "doc/man/man3/SSL_get0_peer_scts.3", + "doc/man/man3/SSL_get1_builtin_sigalgs.3", + "doc/man/man3/SSL_get_SSL_CTX.3", + "doc/man/man3/SSL_get_all_async_fds.3", + "doc/man/man3/SSL_get_certificate.3", + "doc/man/man3/SSL_get_ciphers.3", + "doc/man/man3/SSL_get_client_random.3", + "doc/man/man3/SSL_get_conn_close_info.3", + "doc/man/man3/SSL_get_current_cipher.3", + "doc/man/man3/SSL_get_default_timeout.3", + "doc/man/man3/SSL_get_error.3", + "doc/man/man3/SSL_get_event_timeout.3", + "doc/man/man3/SSL_get_extms_support.3", + "doc/man/man3/SSL_get_fd.3", + "doc/man/man3/SSL_get_handshake_rtt.3", + "doc/man/man3/SSL_get_peer_cert_chain.3", + "doc/man/man3/SSL_get_peer_certificate.3", + "doc/man/man3/SSL_get_peer_signature_nid.3", + "doc/man/man3/SSL_get_peer_tmp_key.3", + "doc/man/man3/SSL_get_psk_identity.3", + "doc/man/man3/SSL_get_rbio.3", + "doc/man/man3/SSL_get_rpoll_descriptor.3", + "doc/man/man3/SSL_get_session.3", + "doc/man/man3/SSL_get_shared_sigalgs.3", + "doc/man/man3/SSL_get_stream_id.3", + "doc/man/man3/SSL_get_stream_read_state.3", + "doc/man/man3/SSL_get_value_uint.3", + "doc/man/man3/SSL_get_verify_result.3", + "doc/man/man3/SSL_get_version.3", + "doc/man/man3/SSL_group_to_name.3", + "doc/man/man3/SSL_handle_events.3", + "doc/man/man3/SSL_in_init.3", + "doc/man/man3/SSL_inject_net_dgram.3", + "doc/man/man3/SSL_key_update.3", + "doc/man/man3/SSL_library_init.3", + "doc/man/man3/SSL_load_client_CA_file.3", + "doc/man/man3/SSL_new.3", + "doc/man/man3/SSL_new_domain.3", + "doc/man/man3/SSL_new_listener.3", + "doc/man/man3/SSL_new_stream.3", + "doc/man/man3/SSL_pending.3", + "doc/man/man3/SSL_poll.3", + "doc/man/man3/SSL_read.3", + "doc/man/man3/SSL_read_early_data.3", + "doc/man/man3/SSL_rstate_string.3", + "doc/man/man3/SSL_session_reused.3", + "doc/man/man3/SSL_set1_host.3", + "doc/man/man3/SSL_set1_initial_peer_addr.3", + "doc/man/man3/SSL_set1_server_cert_type.3", + "doc/man/man3/SSL_set_async_callback.3", + "doc/man/man3/SSL_set_bio.3", + "doc/man/man3/SSL_set_blocking_mode.3", + "doc/man/man3/SSL_set_connect_state.3", + "doc/man/man3/SSL_set_default_stream_mode.3", + "doc/man/man3/SSL_set_fd.3", + "doc/man/man3/SSL_set_incoming_stream_policy.3", + "doc/man/man3/SSL_set_quic_tls_cbs.3", + "doc/man/man3/SSL_set_retry_verify.3", + "doc/man/man3/SSL_set_session.3", + "doc/man/man3/SSL_set_session_secret_cb.3", + "doc/man/man3/SSL_set_shutdown.3", + "doc/man/man3/SSL_set_verify_result.3", + "doc/man/man3/SSL_shutdown.3", + "doc/man/man3/SSL_state_string.3", + "doc/man/man3/SSL_stream_conclude.3", + "doc/man/man3/SSL_stream_reset.3", + "doc/man/man3/SSL_want.3", + "doc/man/man3/SSL_write.3", + "doc/man/man3/TS_RESP_CTX_new.3", + "doc/man/man3/TS_VERIFY_CTX.3", + "doc/man/man3/UI_STRING.3", + "doc/man/man3/UI_UTIL_read_pw.3", + "doc/man/man3/UI_create_method.3", + "doc/man/man3/UI_new.3", + "doc/man/man3/X509V3_EXT_print.3", + "doc/man/man3/X509V3_get_d2i.3", + "doc/man/man3/X509V3_set_ctx.3", + "doc/man/man3/X509_ACERT_add1_attr.3", + "doc/man/man3/X509_ACERT_add_attr_nconf.3", + "doc/man/man3/X509_ACERT_get0_holder_baseCertId.3", + "doc/man/man3/X509_ACERT_get_attr.3", + "doc/man/man3/X509_ACERT_print_ex.3", + "doc/man/man3/X509_ALGOR_dup.3", + "doc/man/man3/X509_ATTRIBUTE.3", + "doc/man/man3/X509_CRL_get0_by_serial.3", + "doc/man/man3/X509_EXTENSION_set_object.3", + "doc/man/man3/X509_LOOKUP.3", + "doc/man/man3/X509_LOOKUP_hash_dir.3", + "doc/man/man3/X509_LOOKUP_meth_new.3", + "doc/man/man3/X509_NAME_ENTRY_get_object.3", + "doc/man/man3/X509_NAME_add_entry_by_txt.3", + "doc/man/man3/X509_NAME_get0_der.3", + "doc/man/man3/X509_NAME_get_index_by_NID.3", + "doc/man/man3/X509_NAME_print_ex.3", + "doc/man/man3/X509_PUBKEY_new.3", + "doc/man/man3/X509_REQ_get_attr.3", + "doc/man/man3/X509_REQ_get_extensions.3", + "doc/man/man3/X509_SIG_get0.3", + "doc/man/man3/X509_STORE_CTX_get_by_subject.3", + "doc/man/man3/X509_STORE_CTX_get_error.3", + "doc/man/man3/X509_STORE_CTX_new.3", + "doc/man/man3/X509_STORE_CTX_set_verify_cb.3", + "doc/man/man3/X509_STORE_add_cert.3", + "doc/man/man3/X509_STORE_get0_param.3", + "doc/man/man3/X509_STORE_new.3", + "doc/man/man3/X509_STORE_set_verify_cb_func.3", + "doc/man/man3/X509_VERIFY_PARAM_set_flags.3", + "doc/man/man3/X509_add_cert.3", + "doc/man/man3/X509_check_ca.3", + "doc/man/man3/X509_check_host.3", + "doc/man/man3/X509_check_issued.3", + "doc/man/man3/X509_check_private_key.3", + "doc/man/man3/X509_check_purpose.3", + "doc/man/man3/X509_cmp.3", + "doc/man/man3/X509_cmp_time.3", + "doc/man/man3/X509_digest.3", + "doc/man/man3/X509_dup.3", + "doc/man/man3/X509_get0_distinguishing_id.3", + "doc/man/man3/X509_get0_notBefore.3", + "doc/man/man3/X509_get0_signature.3", + "doc/man/man3/X509_get0_uids.3", + "doc/man/man3/X509_get_default_cert_file.3", + "doc/man/man3/X509_get_extension_flags.3", + "doc/man/man3/X509_get_pubkey.3", + "doc/man/man3/X509_get_serialNumber.3", + "doc/man/man3/X509_get_subject_name.3", + "doc/man/man3/X509_get_version.3", + "doc/man/man3/X509_load_http.3", + "doc/man/man3/X509_new.3", + "doc/man/man3/X509_sign.3", + "doc/man/man3/X509_verify.3", + "doc/man/man3/X509_verify_cert.3", + "doc/man/man3/X509v3_get_ext_by_NID.3", + "doc/man/man3/b2i_PVK_bio_ex.3", + "doc/man/man3/d2i_PKCS8PrivateKey_bio.3", + "doc/man/man3/d2i_PrivateKey.3", + "doc/man/man3/d2i_RSAPrivateKey.3", + "doc/man/man3/d2i_SSL_SESSION.3", + "doc/man/man3/d2i_X509.3", + "doc/man/man3/i2d_CMS_bio_stream.3", + "doc/man/man3/i2d_PKCS7_bio_stream.3", + "doc/man/man3/i2d_re_X509_tbs.3", + "doc/man/man3/o2i_SCT_LIST.3", + "doc/man/man3/s2i_ASN1_IA5STRING.3" + ], + "man5" => [ + "doc/man/man5/config.5", + "doc/man/man5/fips_config.5", + "doc/man/man5/x509v3_config.5" + ], + "man7" => [ + "doc/man/man7/EVP_ASYM_CIPHER-RSA.7", + "doc/man/man7/EVP_ASYM_CIPHER-SM2.7", + "doc/man/man7/EVP_CIPHER-AES.7", + "doc/man/man7/EVP_CIPHER-ARIA.7", + "doc/man/man7/EVP_CIPHER-BLOWFISH.7", + "doc/man/man7/EVP_CIPHER-CAMELLIA.7", + "doc/man/man7/EVP_CIPHER-CAST.7", + "doc/man/man7/EVP_CIPHER-CHACHA.7", + "doc/man/man7/EVP_CIPHER-DES.7", + "doc/man/man7/EVP_CIPHER-IDEA.7", + "doc/man/man7/EVP_CIPHER-NULL.7", + "doc/man/man7/EVP_CIPHER-RC2.7", + "doc/man/man7/EVP_CIPHER-RC4.7", + "doc/man/man7/EVP_CIPHER-RC5.7", + "doc/man/man7/EVP_CIPHER-SEED.7", + "doc/man/man7/EVP_CIPHER-SM4.7", + "doc/man/man7/EVP_KDF-ARGON2.7", + "doc/man/man7/EVP_KDF-HKDF.7", + "doc/man/man7/EVP_KDF-HMAC-DRBG.7", + "doc/man/man7/EVP_KDF-KB.7", + "doc/man/man7/EVP_KDF-KRB5KDF.7", + "doc/man/man7/EVP_KDF-PBKDF1.7", + "doc/man/man7/EVP_KDF-PBKDF2.7", + "doc/man/man7/EVP_KDF-PKCS12KDF.7", + "doc/man/man7/EVP_KDF-PVKKDF.7", + "doc/man/man7/EVP_KDF-SCRYPT.7", + "doc/man/man7/EVP_KDF-SS.7", + "doc/man/man7/EVP_KDF-SSHKDF.7", + "doc/man/man7/EVP_KDF-TLS13_KDF.7", + "doc/man/man7/EVP_KDF-TLS1_PRF.7", + "doc/man/man7/EVP_KDF-X942-ASN1.7", + "doc/man/man7/EVP_KDF-X942-CONCAT.7", + "doc/man/man7/EVP_KDF-X963.7", + "doc/man/man7/EVP_KEM-EC.7", + "doc/man/man7/EVP_KEM-ML-KEM.7", + "doc/man/man7/EVP_KEM-RSA.7", + "doc/man/man7/EVP_KEM-X25519.7", + "doc/man/man7/EVP_KEYEXCH-DH.7", + "doc/man/man7/EVP_KEYEXCH-ECDH.7", + "doc/man/man7/EVP_KEYEXCH-X25519.7", + "doc/man/man7/EVP_MAC-BLAKE2.7", + "doc/man/man7/EVP_MAC-CMAC.7", + "doc/man/man7/EVP_MAC-GMAC.7", + "doc/man/man7/EVP_MAC-HMAC.7", + "doc/man/man7/EVP_MAC-KMAC.7", + "doc/man/man7/EVP_MAC-Poly1305.7", + "doc/man/man7/EVP_MAC-Siphash.7", + "doc/man/man7/EVP_MD-BLAKE2.7", + "doc/man/man7/EVP_MD-KECCAK.7", + "doc/man/man7/EVP_MD-MD2.7", + "doc/man/man7/EVP_MD-MD4.7", + "doc/man/man7/EVP_MD-MD5-SHA1.7", + "doc/man/man7/EVP_MD-MD5.7", + "doc/man/man7/EVP_MD-MDC2.7", + "doc/man/man7/EVP_MD-NULL.7", + "doc/man/man7/EVP_MD-RIPEMD160.7", + "doc/man/man7/EVP_MD-SHA1.7", + "doc/man/man7/EVP_MD-SHA2.7", + "doc/man/man7/EVP_MD-SHA3.7", + "doc/man/man7/EVP_MD-SHAKE.7", + "doc/man/man7/EVP_MD-SM3.7", + "doc/man/man7/EVP_MD-WHIRLPOOL.7", + "doc/man/man7/EVP_MD-common.7", + "doc/man/man7/EVP_PKEY-DH.7", + "doc/man/man7/EVP_PKEY-DSA.7", + "doc/man/man7/EVP_PKEY-EC.7", + "doc/man/man7/EVP_PKEY-FFC.7", + "doc/man/man7/EVP_PKEY-HMAC.7", + "doc/man/man7/EVP_PKEY-ML-DSA.7", + "doc/man/man7/EVP_PKEY-ML-KEM.7", + "doc/man/man7/EVP_PKEY-RSA.7", + "doc/man/man7/EVP_PKEY-SLH-DSA.7", + "doc/man/man7/EVP_PKEY-SM2.7", + "doc/man/man7/EVP_PKEY-X25519.7", + "doc/man/man7/EVP_RAND-CRNG-TEST.7", + "doc/man/man7/EVP_RAND-CTR-DRBG.7", + "doc/man/man7/EVP_RAND-HASH-DRBG.7", + "doc/man/man7/EVP_RAND-HMAC-DRBG.7", + "doc/man/man7/EVP_RAND-JITTER.7", + "doc/man/man7/EVP_RAND-SEED-SRC.7", + "doc/man/man7/EVP_RAND-TEST-RAND.7", + "doc/man/man7/EVP_RAND.7", + "doc/man/man7/EVP_SIGNATURE-DSA.7", + "doc/man/man7/EVP_SIGNATURE-ECDSA.7", + "doc/man/man7/EVP_SIGNATURE-ED25519.7", + "doc/man/man7/EVP_SIGNATURE-HMAC.7", + "doc/man/man7/EVP_SIGNATURE-ML-DSA.7", + "doc/man/man7/EVP_SIGNATURE-RSA.7", + "doc/man/man7/EVP_SIGNATURE-SLH-DSA.7", + "doc/man/man7/OSSL_PROVIDER-FIPS.7", + "doc/man/man7/OSSL_PROVIDER-base.7", + "doc/man/man7/OSSL_PROVIDER-default.7", + "doc/man/man7/OSSL_PROVIDER-legacy.7", + "doc/man/man7/OSSL_PROVIDER-null.7", + "doc/man/man7/OSSL_STORE-winstore.7", + "doc/man/man7/RAND.7", + "doc/man/man7/RSA-PSS.7", + "doc/man/man7/X25519.7", + "doc/man/man7/bio.7", + "doc/man/man7/ct.7", + "doc/man/man7/des_modes.7", + "doc/man/man7/evp.7", + "doc/man/man7/fips_module.7", + "doc/man/man7/life_cycle-cipher.7", + "doc/man/man7/life_cycle-digest.7", + "doc/man/man7/life_cycle-kdf.7", + "doc/man/man7/life_cycle-mac.7", + "doc/man/man7/life_cycle-pkey.7", + "doc/man/man7/life_cycle-rand.7", + "doc/man/man7/openssl-core.h.7", + "doc/man/man7/openssl-core_dispatch.h.7", + "doc/man/man7/openssl-core_names.h.7", + "doc/man/man7/openssl-env.7", + "doc/man/man7/openssl-glossary.7", + "doc/man/man7/openssl-qlog.7", + "doc/man/man7/openssl-quic-concurrency.7", + "doc/man/man7/openssl-quic.7", + "doc/man/man7/openssl-threads.7", + "doc/man/man7/openssl_user_macros.7", + "doc/man/man7/ossl-guide-introduction.7", + "doc/man/man7/ossl-guide-libcrypto-introduction.7", + "doc/man/man7/ossl-guide-libraries-introduction.7", + "doc/man/man7/ossl-guide-libssl-introduction.7", + "doc/man/man7/ossl-guide-migration.7", + "doc/man/man7/ossl-guide-quic-client-block.7", + "doc/man/man7/ossl-guide-quic-client-non-block.7", + "doc/man/man7/ossl-guide-quic-introduction.7", + "doc/man/man7/ossl-guide-quic-multi-stream.7", + "doc/man/man7/ossl-guide-quic-server-block.7", + "doc/man/man7/ossl-guide-quic-server-non-block.7", + "doc/man/man7/ossl-guide-tls-client-block.7", + "doc/man/man7/ossl-guide-tls-client-non-block.7", + "doc/man/man7/ossl-guide-tls-introduction.7", + "doc/man/man7/ossl-guide-tls-server-block.7", + "doc/man/man7/ossl_store-file.7", + "doc/man/man7/ossl_store.7", + "doc/man/man7/passphrase-encoding.7", + "doc/man/man7/property.7", + "doc/man/man7/provider-asym_cipher.7", + "doc/man/man7/provider-base.7", + "doc/man/man7/provider-cipher.7", + "doc/man/man7/provider-decoder.7", + "doc/man/man7/provider-digest.7", + "doc/man/man7/provider-encoder.7", + "doc/man/man7/provider-kdf.7", + "doc/man/man7/provider-kem.7", + "doc/man/man7/provider-keyexch.7", + "doc/man/man7/provider-keymgmt.7", + "doc/man/man7/provider-mac.7", + "doc/man/man7/provider-object.7", + "doc/man/man7/provider-rand.7", + "doc/man/man7/provider-signature.7", + "doc/man/man7/provider-skeymgmt.7", + "doc/man/man7/provider-storemgmt.7", + "doc/man/man7/provider.7", + "doc/man/man7/proxy-certificates.7", + "doc/man/man7/x509.7" + ] + }, + "modules" => [ + "providers/fips", + "providers/legacy" + ], + "programs" => [ + "apps/openssl" + ], + "scripts" => [ + "apps/CA.pl", + "apps/tsget.pl", + "tools/c_rehash", + "util/shlib_wrap.sh", + "util/wrap.pl" + ], + "shared_sources" => {}, + "sources" => { + "apps/CA.pl" => [ + "apps/CA.pl.in" + ], + "apps/lib/libapps-lib-app_libctx.o" => [ + "apps/lib/app_libctx.c" + ], + "apps/lib/libapps-lib-app_params.o" => [ + "apps/lib/app_params.c" + ], + "apps/lib/libapps-lib-app_provider.o" => [ + "apps/lib/app_provider.c" + ], + "apps/lib/libapps-lib-app_rand.o" => [ + "apps/lib/app_rand.c" + ], + "apps/lib/libapps-lib-app_x509.o" => [ + "apps/lib/app_x509.c" + ], + "apps/lib/libapps-lib-apps.o" => [ + "apps/lib/apps.c" + ], + "apps/lib/libapps-lib-apps_opt_printf.o" => [ + "apps/lib/apps_opt_printf.c" + ], + "apps/lib/libapps-lib-apps_ui.o" => [ + "apps/lib/apps_ui.c" + ], + "apps/lib/libapps-lib-columns.o" => [ + "apps/lib/columns.c" + ], + "apps/lib/libapps-lib-engine.o" => [ + "apps/lib/engine.c" + ], + "apps/lib/libapps-lib-engine_loader.o" => [ + "apps/lib/engine_loader.c" + ], + "apps/lib/libapps-lib-fmt.o" => [ + "apps/lib/fmt.c" + ], + "apps/lib/libapps-lib-http_server.o" => [ + "apps/lib/http_server.c" + ], + "apps/lib/libapps-lib-log.o" => [ + "apps/lib/log.c" + ], + "apps/lib/libapps-lib-names.o" => [ + "apps/lib/names.c" + ], + "apps/lib/libapps-lib-opt.o" => [ + "apps/lib/opt.c" + ], + "apps/lib/libapps-lib-s_cb.o" => [ + "apps/lib/s_cb.c" + ], + "apps/lib/libapps-lib-s_socket.o" => [ + "apps/lib/s_socket.c" + ], + "apps/lib/libapps-lib-tlssrp_depr.o" => [ + "apps/lib/tlssrp_depr.c" + ], + "apps/lib/openssl-bin-cmp_mock_srv.o" => [ + "apps/lib/cmp_mock_srv.c" + ], + "apps/libapps.a" => [ + "apps/lib/libapps-lib-app_libctx.o", + "apps/lib/libapps-lib-app_params.o", + "apps/lib/libapps-lib-app_provider.o", + "apps/lib/libapps-lib-app_rand.o", + "apps/lib/libapps-lib-app_x509.o", + "apps/lib/libapps-lib-apps.o", + "apps/lib/libapps-lib-apps_opt_printf.o", + "apps/lib/libapps-lib-apps_ui.o", + "apps/lib/libapps-lib-columns.o", + "apps/lib/libapps-lib-engine.o", + "apps/lib/libapps-lib-engine_loader.o", + "apps/lib/libapps-lib-fmt.o", + "apps/lib/libapps-lib-http_server.o", + "apps/lib/libapps-lib-log.o", + "apps/lib/libapps-lib-names.o", + "apps/lib/libapps-lib-opt.o", + "apps/lib/libapps-lib-s_cb.o", + "apps/lib/libapps-lib-s_socket.o", + "apps/lib/libapps-lib-tlssrp_depr.o" + ], + "apps/openssl" => [ + "apps/lib/openssl-bin-cmp_mock_srv.o", + "apps/openssl-bin-asn1parse.o", + "apps/openssl-bin-ca.o", + "apps/openssl-bin-ciphers.o", + "apps/openssl-bin-cmp.o", + "apps/openssl-bin-cms.o", + "apps/openssl-bin-crl.o", + "apps/openssl-bin-crl2pkcs7.o", + "apps/openssl-bin-dgst.o", + "apps/openssl-bin-dhparam.o", + "apps/openssl-bin-dsa.o", + "apps/openssl-bin-dsaparam.o", + "apps/openssl-bin-ec.o", + "apps/openssl-bin-ecparam.o", + "apps/openssl-bin-enc.o", + "apps/openssl-bin-engine.o", + "apps/openssl-bin-errstr.o", + "apps/openssl-bin-fipsinstall.o", + "apps/openssl-bin-gendsa.o", + "apps/openssl-bin-genpkey.o", + "apps/openssl-bin-genrsa.o", + "apps/openssl-bin-info.o", + "apps/openssl-bin-kdf.o", + "apps/openssl-bin-list.o", + "apps/openssl-bin-mac.o", + "apps/openssl-bin-nseq.o", + "apps/openssl-bin-ocsp.o", + "apps/openssl-bin-openssl.o", + "apps/openssl-bin-passwd.o", + "apps/openssl-bin-pkcs12.o", + "apps/openssl-bin-pkcs7.o", + "apps/openssl-bin-pkcs8.o", + "apps/openssl-bin-pkey.o", + "apps/openssl-bin-pkeyparam.o", + "apps/openssl-bin-pkeyutl.o", + "apps/openssl-bin-prime.o", + "apps/openssl-bin-progs.o", + "apps/openssl-bin-rand.o", + "apps/openssl-bin-rehash.o", + "apps/openssl-bin-req.o", + "apps/openssl-bin-rsa.o", + "apps/openssl-bin-rsautl.o", + "apps/openssl-bin-s_client.o", + "apps/openssl-bin-s_server.o", + "apps/openssl-bin-s_time.o", + "apps/openssl-bin-sess_id.o", + "apps/openssl-bin-skeyutl.o", + "apps/openssl-bin-smime.o", + "apps/openssl-bin-speed.o", + "apps/openssl-bin-spkac.o", + "apps/openssl-bin-srp.o", + "apps/openssl-bin-storeutl.o", + "apps/openssl-bin-ts.o", + "apps/openssl-bin-verify.o", + "apps/openssl-bin-version.o", + "apps/openssl-bin-x509.o" + ], + "apps/openssl-bin-asn1parse.o" => [ + "apps/asn1parse.c" + ], + "apps/openssl-bin-ca.o" => [ + "apps/ca.c" + ], + "apps/openssl-bin-ciphers.o" => [ + "apps/ciphers.c" + ], + "apps/openssl-bin-cmp.o" => [ + "apps/cmp.c" + ], + "apps/openssl-bin-cms.o" => [ + "apps/cms.c" + ], + "apps/openssl-bin-crl.o" => [ + "apps/crl.c" + ], + "apps/openssl-bin-crl2pkcs7.o" => [ + "apps/crl2pkcs7.c" + ], + "apps/openssl-bin-dgst.o" => [ + "apps/dgst.c" + ], + "apps/openssl-bin-dhparam.o" => [ + "apps/dhparam.c" + ], + "apps/openssl-bin-dsa.o" => [ + "apps/dsa.c" + ], + "apps/openssl-bin-dsaparam.o" => [ + "apps/dsaparam.c" + ], + "apps/openssl-bin-ec.o" => [ + "apps/ec.c" + ], + "apps/openssl-bin-ecparam.o" => [ + "apps/ecparam.c" + ], + "apps/openssl-bin-enc.o" => [ + "apps/enc.c" + ], + "apps/openssl-bin-engine.o" => [ + "apps/engine.c" + ], + "apps/openssl-bin-errstr.o" => [ + "apps/errstr.c" + ], + "apps/openssl-bin-fipsinstall.o" => [ + "apps/fipsinstall.c" + ], + "apps/openssl-bin-gendsa.o" => [ + "apps/gendsa.c" + ], + "apps/openssl-bin-genpkey.o" => [ + "apps/genpkey.c" + ], + "apps/openssl-bin-genrsa.o" => [ + "apps/genrsa.c" + ], + "apps/openssl-bin-info.o" => [ + "apps/info.c" + ], + "apps/openssl-bin-kdf.o" => [ + "apps/kdf.c" + ], + "apps/openssl-bin-list.o" => [ + "apps/list.c" + ], + "apps/openssl-bin-mac.o" => [ + "apps/mac.c" + ], + "apps/openssl-bin-nseq.o" => [ + "apps/nseq.c" + ], + "apps/openssl-bin-ocsp.o" => [ + "apps/ocsp.c" + ], + "apps/openssl-bin-openssl.o" => [ + "apps/openssl.c" + ], + "apps/openssl-bin-passwd.o" => [ + "apps/passwd.c" + ], + "apps/openssl-bin-pkcs12.o" => [ + "apps/pkcs12.c" + ], + "apps/openssl-bin-pkcs7.o" => [ + "apps/pkcs7.c" + ], + "apps/openssl-bin-pkcs8.o" => [ + "apps/pkcs8.c" + ], + "apps/openssl-bin-pkey.o" => [ + "apps/pkey.c" + ], + "apps/openssl-bin-pkeyparam.o" => [ + "apps/pkeyparam.c" + ], + "apps/openssl-bin-pkeyutl.o" => [ + "apps/pkeyutl.c" + ], + "apps/openssl-bin-prime.o" => [ + "apps/prime.c" + ], + "apps/openssl-bin-progs.o" => [ + "apps/progs.c" + ], + "apps/openssl-bin-rand.o" => [ + "apps/rand.c" + ], + "apps/openssl-bin-rehash.o" => [ + "apps/rehash.c" + ], + "apps/openssl-bin-req.o" => [ + "apps/req.c" + ], + "apps/openssl-bin-rsa.o" => [ + "apps/rsa.c" + ], + "apps/openssl-bin-rsautl.o" => [ + "apps/rsautl.c" + ], + "apps/openssl-bin-s_client.o" => [ + "apps/s_client.c" + ], + "apps/openssl-bin-s_server.o" => [ + "apps/s_server.c" + ], + "apps/openssl-bin-s_time.o" => [ + "apps/s_time.c" + ], + "apps/openssl-bin-sess_id.o" => [ + "apps/sess_id.c" + ], + "apps/openssl-bin-skeyutl.o" => [ + "apps/skeyutl.c" + ], + "apps/openssl-bin-smime.o" => [ + "apps/smime.c" + ], + "apps/openssl-bin-speed.o" => [ + "apps/speed.c" + ], + "apps/openssl-bin-spkac.o" => [ + "apps/spkac.c" + ], + "apps/openssl-bin-srp.o" => [ + "apps/srp.c" + ], + "apps/openssl-bin-storeutl.o" => [ + "apps/storeutl.c" + ], + "apps/openssl-bin-ts.o" => [ + "apps/ts.c" + ], + "apps/openssl-bin-verify.o" => [ + "apps/verify.c" + ], + "apps/openssl-bin-version.o" => [ + "apps/version.c" + ], + "apps/openssl-bin-x509.o" => [ + "apps/x509.c" + ], + "apps/tsget.pl" => [ + "apps/tsget.in" + ], + "crypto/aes/libcrypto-lib-aes-riscv64-zkn.o" => [ + "crypto/aes/aes-riscv64-zkn.s" + ], + "crypto/aes/libcrypto-lib-aes-riscv64-zvbb-zvkg-zvkned.o" => [ + "crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s" + ], + "crypto/aes/libcrypto-lib-aes-riscv64-zvkb-zvkned.o" => [ + "crypto/aes/aes-riscv64-zvkb-zvkned.s" + ], + "crypto/aes/libcrypto-lib-aes-riscv64-zvkned.o" => [ + "crypto/aes/aes-riscv64-zvkned.s" + ], + "crypto/aes/libcrypto-lib-aes-riscv64.o" => [ + "crypto/aes/aes-riscv64.s" + ], + "crypto/aes/libcrypto-lib-aes_cbc.o" => [ + "crypto/aes/aes_cbc.c" + ], + "crypto/aes/libcrypto-lib-aes_cfb.o" => [ + "crypto/aes/aes_cfb.c" + ], + "crypto/aes/libcrypto-lib-aes_ecb.o" => [ + "crypto/aes/aes_ecb.c" + ], + "crypto/aes/libcrypto-lib-aes_ige.o" => [ + "crypto/aes/aes_ige.c" + ], + "crypto/aes/libcrypto-lib-aes_misc.o" => [ + "crypto/aes/aes_misc.c" + ], + "crypto/aes/libcrypto-lib-aes_ofb.o" => [ + "crypto/aes/aes_ofb.c" + ], + "crypto/aes/libcrypto-lib-aes_wrap.o" => [ + "crypto/aes/aes_wrap.c" + ], + "crypto/aes/libfips-lib-aes-riscv64-zkn.o" => [ + "crypto/aes/aes-riscv64-zkn.s" + ], + "crypto/aes/libfips-lib-aes-riscv64-zvbb-zvkg-zvkned.o" => [ + "crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s" + ], + "crypto/aes/libfips-lib-aes-riscv64-zvkb-zvkned.o" => [ + "crypto/aes/aes-riscv64-zvkb-zvkned.s" + ], + "crypto/aes/libfips-lib-aes-riscv64-zvkned.o" => [ + "crypto/aes/aes-riscv64-zvkned.s" + ], + "crypto/aes/libfips-lib-aes-riscv64.o" => [ + "crypto/aes/aes-riscv64.s" + ], + "crypto/aes/libfips-lib-aes_cbc.o" => [ + "crypto/aes/aes_cbc.c" + ], + "crypto/aes/libfips-lib-aes_ecb.o" => [ + "crypto/aes/aes_ecb.c" + ], + "crypto/aes/libfips-lib-aes_misc.o" => [ + "crypto/aes/aes_misc.c" + ], + "crypto/aria/libcrypto-lib-aria.o" => [ + "crypto/aria/aria.c" + ], + "crypto/asn1/libcrypto-lib-a_bitstr.o" => [ + "crypto/asn1/a_bitstr.c" + ], + "crypto/asn1/libcrypto-lib-a_d2i_fp.o" => [ + "crypto/asn1/a_d2i_fp.c" + ], + "crypto/asn1/libcrypto-lib-a_digest.o" => [ + "crypto/asn1/a_digest.c" + ], + "crypto/asn1/libcrypto-lib-a_dup.o" => [ + "crypto/asn1/a_dup.c" + ], + "crypto/asn1/libcrypto-lib-a_gentm.o" => [ + "crypto/asn1/a_gentm.c" + ], + "crypto/asn1/libcrypto-lib-a_i2d_fp.o" => [ + "crypto/asn1/a_i2d_fp.c" + ], + "crypto/asn1/libcrypto-lib-a_int.o" => [ + "crypto/asn1/a_int.c" + ], + "crypto/asn1/libcrypto-lib-a_mbstr.o" => [ + "crypto/asn1/a_mbstr.c" + ], + "crypto/asn1/libcrypto-lib-a_object.o" => [ + "crypto/asn1/a_object.c" + ], + "crypto/asn1/libcrypto-lib-a_octet.o" => [ + "crypto/asn1/a_octet.c" + ], + "crypto/asn1/libcrypto-lib-a_print.o" => [ + "crypto/asn1/a_print.c" + ], + "crypto/asn1/libcrypto-lib-a_sign.o" => [ + "crypto/asn1/a_sign.c" + ], + "crypto/asn1/libcrypto-lib-a_strex.o" => [ + "crypto/asn1/a_strex.c" + ], + "crypto/asn1/libcrypto-lib-a_strnid.o" => [ + "crypto/asn1/a_strnid.c" + ], + "crypto/asn1/libcrypto-lib-a_time.o" => [ + "crypto/asn1/a_time.c" + ], + "crypto/asn1/libcrypto-lib-a_type.o" => [ + "crypto/asn1/a_type.c" + ], + "crypto/asn1/libcrypto-lib-a_utctm.o" => [ + "crypto/asn1/a_utctm.c" + ], + "crypto/asn1/libcrypto-lib-a_utf8.o" => [ + "crypto/asn1/a_utf8.c" + ], + "crypto/asn1/libcrypto-lib-a_verify.o" => [ + "crypto/asn1/a_verify.c" + ], + "crypto/asn1/libcrypto-lib-ameth_lib.o" => [ + "crypto/asn1/ameth_lib.c" + ], + "crypto/asn1/libcrypto-lib-asn1_err.o" => [ + "crypto/asn1/asn1_err.c" + ], + "crypto/asn1/libcrypto-lib-asn1_gen.o" => [ + "crypto/asn1/asn1_gen.c" + ], + "crypto/asn1/libcrypto-lib-asn1_item_list.o" => [ + "crypto/asn1/asn1_item_list.c" + ], + "crypto/asn1/libcrypto-lib-asn1_lib.o" => [ + "crypto/asn1/asn1_lib.c" + ], + "crypto/asn1/libcrypto-lib-asn1_parse.o" => [ + "crypto/asn1/asn1_parse.c" + ], + "crypto/asn1/libcrypto-lib-asn_mime.o" => [ + "crypto/asn1/asn_mime.c" + ], + "crypto/asn1/libcrypto-lib-asn_moid.o" => [ + "crypto/asn1/asn_moid.c" + ], + "crypto/asn1/libcrypto-lib-asn_mstbl.o" => [ + "crypto/asn1/asn_mstbl.c" + ], + "crypto/asn1/libcrypto-lib-asn_pack.o" => [ + "crypto/asn1/asn_pack.c" + ], + "crypto/asn1/libcrypto-lib-bio_asn1.o" => [ + "crypto/asn1/bio_asn1.c" + ], + "crypto/asn1/libcrypto-lib-bio_ndef.o" => [ + "crypto/asn1/bio_ndef.c" + ], + "crypto/asn1/libcrypto-lib-d2i_param.o" => [ + "crypto/asn1/d2i_param.c" + ], + "crypto/asn1/libcrypto-lib-d2i_pr.o" => [ + "crypto/asn1/d2i_pr.c" + ], + "crypto/asn1/libcrypto-lib-d2i_pu.o" => [ + "crypto/asn1/d2i_pu.c" + ], + "crypto/asn1/libcrypto-lib-evp_asn1.o" => [ + "crypto/asn1/evp_asn1.c" + ], + "crypto/asn1/libcrypto-lib-f_int.o" => [ + "crypto/asn1/f_int.c" + ], + "crypto/asn1/libcrypto-lib-f_string.o" => [ + "crypto/asn1/f_string.c" + ], + "crypto/asn1/libcrypto-lib-i2d_evp.o" => [ + "crypto/asn1/i2d_evp.c" + ], + "crypto/asn1/libcrypto-lib-n_pkey.o" => [ + "crypto/asn1/n_pkey.c" + ], + "crypto/asn1/libcrypto-lib-nsseq.o" => [ + "crypto/asn1/nsseq.c" + ], + "crypto/asn1/libcrypto-lib-p5_pbe.o" => [ + "crypto/asn1/p5_pbe.c" + ], + "crypto/asn1/libcrypto-lib-p5_pbev2.o" => [ + "crypto/asn1/p5_pbev2.c" + ], + "crypto/asn1/libcrypto-lib-p5_scrypt.o" => [ + "crypto/asn1/p5_scrypt.c" + ], + "crypto/asn1/libcrypto-lib-p8_pkey.o" => [ + "crypto/asn1/p8_pkey.c" + ], + "crypto/asn1/libcrypto-lib-t_bitst.o" => [ + "crypto/asn1/t_bitst.c" + ], + "crypto/asn1/libcrypto-lib-t_pkey.o" => [ + "crypto/asn1/t_pkey.c" + ], + "crypto/asn1/libcrypto-lib-t_spki.o" => [ + "crypto/asn1/t_spki.c" + ], + "crypto/asn1/libcrypto-lib-tasn_dec.o" => [ + "crypto/asn1/tasn_dec.c" + ], + "crypto/asn1/libcrypto-lib-tasn_enc.o" => [ + "crypto/asn1/tasn_enc.c" + ], + "crypto/asn1/libcrypto-lib-tasn_fre.o" => [ + "crypto/asn1/tasn_fre.c" + ], + "crypto/asn1/libcrypto-lib-tasn_new.o" => [ + "crypto/asn1/tasn_new.c" + ], + "crypto/asn1/libcrypto-lib-tasn_prn.o" => [ + "crypto/asn1/tasn_prn.c" + ], + "crypto/asn1/libcrypto-lib-tasn_scn.o" => [ + "crypto/asn1/tasn_scn.c" + ], + "crypto/asn1/libcrypto-lib-tasn_typ.o" => [ + "crypto/asn1/tasn_typ.c" + ], + "crypto/asn1/libcrypto-lib-tasn_utl.o" => [ + "crypto/asn1/tasn_utl.c" + ], + "crypto/asn1/libcrypto-lib-x_algor.o" => [ + "crypto/asn1/x_algor.c" + ], + "crypto/asn1/libcrypto-lib-x_bignum.o" => [ + "crypto/asn1/x_bignum.c" + ], + "crypto/asn1/libcrypto-lib-x_info.o" => [ + "crypto/asn1/x_info.c" + ], + "crypto/asn1/libcrypto-lib-x_int64.o" => [ + "crypto/asn1/x_int64.c" + ], + "crypto/asn1/libcrypto-lib-x_long.o" => [ + "crypto/asn1/x_long.c" + ], + "crypto/asn1/libcrypto-lib-x_pkey.o" => [ + "crypto/asn1/x_pkey.c" + ], + "crypto/asn1/libcrypto-lib-x_sig.o" => [ + "crypto/asn1/x_sig.c" + ], + "crypto/asn1/libcrypto-lib-x_spki.o" => [ + "crypto/asn1/x_spki.c" + ], + "crypto/asn1/libcrypto-lib-x_val.o" => [ + "crypto/asn1/x_val.c" + ], + "crypto/async/arch/libcrypto-lib-async_null.o" => [ + "crypto/async/arch/async_null.c" + ], + "crypto/async/arch/libcrypto-lib-async_posix.o" => [ + "crypto/async/arch/async_posix.c" + ], + "crypto/async/arch/libcrypto-lib-async_win.o" => [ + "crypto/async/arch/async_win.c" + ], + "crypto/async/libcrypto-lib-async.o" => [ + "crypto/async/async.c" + ], + "crypto/async/libcrypto-lib-async_err.o" => [ + "crypto/async/async_err.c" + ], + "crypto/async/libcrypto-lib-async_wait.o" => [ + "crypto/async/async_wait.c" + ], + "crypto/bf/libcrypto-lib-bf_cfb64.o" => [ + "crypto/bf/bf_cfb64.c" + ], + "crypto/bf/libcrypto-lib-bf_ecb.o" => [ + "crypto/bf/bf_ecb.c" + ], + "crypto/bf/libcrypto-lib-bf_enc.o" => [ + "crypto/bf/bf_enc.c" + ], + "crypto/bf/libcrypto-lib-bf_ofb64.o" => [ + "crypto/bf/bf_ofb64.c" + ], + "crypto/bf/libcrypto-lib-bf_skey.o" => [ + "crypto/bf/bf_skey.c" + ], + "crypto/bio/libcrypto-lib-bf_buff.o" => [ + "crypto/bio/bf_buff.c" + ], + "crypto/bio/libcrypto-lib-bf_lbuf.o" => [ + "crypto/bio/bf_lbuf.c" + ], + "crypto/bio/libcrypto-lib-bf_nbio.o" => [ + "crypto/bio/bf_nbio.c" + ], + "crypto/bio/libcrypto-lib-bf_null.o" => [ + "crypto/bio/bf_null.c" + ], + "crypto/bio/libcrypto-lib-bf_prefix.o" => [ + "crypto/bio/bf_prefix.c" + ], + "crypto/bio/libcrypto-lib-bf_readbuff.o" => [ + "crypto/bio/bf_readbuff.c" + ], + "crypto/bio/libcrypto-lib-bio_addr.o" => [ + "crypto/bio/bio_addr.c" + ], + "crypto/bio/libcrypto-lib-bio_cb.o" => [ + "crypto/bio/bio_cb.c" + ], + "crypto/bio/libcrypto-lib-bio_dump.o" => [ + "crypto/bio/bio_dump.c" + ], + "crypto/bio/libcrypto-lib-bio_err.o" => [ + "crypto/bio/bio_err.c" + ], + "crypto/bio/libcrypto-lib-bio_lib.o" => [ + "crypto/bio/bio_lib.c" + ], + "crypto/bio/libcrypto-lib-bio_meth.o" => [ + "crypto/bio/bio_meth.c" + ], + "crypto/bio/libcrypto-lib-bio_print.o" => [ + "crypto/bio/bio_print.c" + ], + "crypto/bio/libcrypto-lib-bio_sock.o" => [ + "crypto/bio/bio_sock.c" + ], + "crypto/bio/libcrypto-lib-bio_sock2.o" => [ + "crypto/bio/bio_sock2.c" + ], + "crypto/bio/libcrypto-lib-bss_acpt.o" => [ + "crypto/bio/bss_acpt.c" + ], + "crypto/bio/libcrypto-lib-bss_bio.o" => [ + "crypto/bio/bss_bio.c" + ], + "crypto/bio/libcrypto-lib-bss_conn.o" => [ + "crypto/bio/bss_conn.c" + ], + "crypto/bio/libcrypto-lib-bss_core.o" => [ + "crypto/bio/bss_core.c" + ], + "crypto/bio/libcrypto-lib-bss_dgram.o" => [ + "crypto/bio/bss_dgram.c" + ], + "crypto/bio/libcrypto-lib-bss_dgram_pair.o" => [ + "crypto/bio/bss_dgram_pair.c" + ], + "crypto/bio/libcrypto-lib-bss_fd.o" => [ + "crypto/bio/bss_fd.c" + ], + "crypto/bio/libcrypto-lib-bss_file.o" => [ + "crypto/bio/bss_file.c" + ], + "crypto/bio/libcrypto-lib-bss_log.o" => [ + "crypto/bio/bss_log.c" + ], + "crypto/bio/libcrypto-lib-bss_mem.o" => [ + "crypto/bio/bss_mem.c" + ], + "crypto/bio/libcrypto-lib-bss_null.o" => [ + "crypto/bio/bss_null.c" + ], + "crypto/bio/libcrypto-lib-bss_sock.o" => [ + "crypto/bio/bss_sock.c" + ], + "crypto/bio/libcrypto-lib-ossl_core_bio.o" => [ + "crypto/bio/ossl_core_bio.c" + ], + "crypto/bn/libcrypto-lib-bn_add.o" => [ + "crypto/bn/bn_add.c" + ], + "crypto/bn/libcrypto-lib-bn_asm.o" => [ + "crypto/bn/bn_asm.c" + ], + "crypto/bn/libcrypto-lib-bn_blind.o" => [ + "crypto/bn/bn_blind.c" + ], + "crypto/bn/libcrypto-lib-bn_const.o" => [ + "crypto/bn/bn_const.c" + ], + "crypto/bn/libcrypto-lib-bn_conv.o" => [ + "crypto/bn/bn_conv.c" + ], + "crypto/bn/libcrypto-lib-bn_ctx.o" => [ + "crypto/bn/bn_ctx.c" + ], + "crypto/bn/libcrypto-lib-bn_depr.o" => [ + "crypto/bn/bn_depr.c" + ], + "crypto/bn/libcrypto-lib-bn_dh.o" => [ + "crypto/bn/bn_dh.c" + ], + "crypto/bn/libcrypto-lib-bn_div.o" => [ + "crypto/bn/bn_div.c" + ], + "crypto/bn/libcrypto-lib-bn_err.o" => [ + "crypto/bn/bn_err.c" + ], + "crypto/bn/libcrypto-lib-bn_exp.o" => [ + "crypto/bn/bn_exp.c" + ], + "crypto/bn/libcrypto-lib-bn_exp2.o" => [ + "crypto/bn/bn_exp2.c" + ], + "crypto/bn/libcrypto-lib-bn_gcd.o" => [ + "crypto/bn/bn_gcd.c" + ], + "crypto/bn/libcrypto-lib-bn_gf2m.o" => [ + "crypto/bn/bn_gf2m.c" + ], + "crypto/bn/libcrypto-lib-bn_intern.o" => [ + "crypto/bn/bn_intern.c" + ], + "crypto/bn/libcrypto-lib-bn_kron.o" => [ + "crypto/bn/bn_kron.c" + ], + "crypto/bn/libcrypto-lib-bn_lib.o" => [ + "crypto/bn/bn_lib.c" + ], + "crypto/bn/libcrypto-lib-bn_mod.o" => [ + "crypto/bn/bn_mod.c" + ], + "crypto/bn/libcrypto-lib-bn_mont.o" => [ + "crypto/bn/bn_mont.c" + ], + "crypto/bn/libcrypto-lib-bn_mpi.o" => [ + "crypto/bn/bn_mpi.c" + ], + "crypto/bn/libcrypto-lib-bn_mul.o" => [ + "crypto/bn/bn_mul.c" + ], + "crypto/bn/libcrypto-lib-bn_nist.o" => [ + "crypto/bn/bn_nist.c" + ], + "crypto/bn/libcrypto-lib-bn_prime.o" => [ + "crypto/bn/bn_prime.c" + ], + "crypto/bn/libcrypto-lib-bn_print.o" => [ + "crypto/bn/bn_print.c" + ], + "crypto/bn/libcrypto-lib-bn_rand.o" => [ + "crypto/bn/bn_rand.c" + ], + "crypto/bn/libcrypto-lib-bn_recp.o" => [ + "crypto/bn/bn_recp.c" + ], + "crypto/bn/libcrypto-lib-bn_rsa_fips186_4.o" => [ + "crypto/bn/bn_rsa_fips186_4.c" + ], + "crypto/bn/libcrypto-lib-bn_shift.o" => [ + "crypto/bn/bn_shift.c" + ], + "crypto/bn/libcrypto-lib-bn_sqr.o" => [ + "crypto/bn/bn_sqr.c" + ], + "crypto/bn/libcrypto-lib-bn_sqrt.o" => [ + "crypto/bn/bn_sqrt.c" + ], + "crypto/bn/libcrypto-lib-bn_srp.o" => [ + "crypto/bn/bn_srp.c" + ], + "crypto/bn/libcrypto-lib-bn_word.o" => [ + "crypto/bn/bn_word.c" + ], + "crypto/bn/libcrypto-lib-bn_x931p.o" => [ + "crypto/bn/bn_x931p.c" + ], + "crypto/bn/libfips-lib-bn_add.o" => [ + "crypto/bn/bn_add.c" + ], + "crypto/bn/libfips-lib-bn_asm.o" => [ + "crypto/bn/bn_asm.c" + ], + "crypto/bn/libfips-lib-bn_blind.o" => [ + "crypto/bn/bn_blind.c" + ], + "crypto/bn/libfips-lib-bn_const.o" => [ + "crypto/bn/bn_const.c" + ], + "crypto/bn/libfips-lib-bn_conv.o" => [ + "crypto/bn/bn_conv.c" + ], + "crypto/bn/libfips-lib-bn_ctx.o" => [ + "crypto/bn/bn_ctx.c" + ], + "crypto/bn/libfips-lib-bn_dh.o" => [ + "crypto/bn/bn_dh.c" + ], + "crypto/bn/libfips-lib-bn_div.o" => [ + "crypto/bn/bn_div.c" + ], + "crypto/bn/libfips-lib-bn_exp.o" => [ + "crypto/bn/bn_exp.c" + ], + "crypto/bn/libfips-lib-bn_exp2.o" => [ + "crypto/bn/bn_exp2.c" + ], + "crypto/bn/libfips-lib-bn_gcd.o" => [ + "crypto/bn/bn_gcd.c" + ], + "crypto/bn/libfips-lib-bn_gf2m.o" => [ + "crypto/bn/bn_gf2m.c" + ], + "crypto/bn/libfips-lib-bn_intern.o" => [ + "crypto/bn/bn_intern.c" + ], + "crypto/bn/libfips-lib-bn_kron.o" => [ + "crypto/bn/bn_kron.c" + ], + "crypto/bn/libfips-lib-bn_lib.o" => [ + "crypto/bn/bn_lib.c" + ], + "crypto/bn/libfips-lib-bn_mod.o" => [ + "crypto/bn/bn_mod.c" + ], + "crypto/bn/libfips-lib-bn_mont.o" => [ + "crypto/bn/bn_mont.c" + ], + "crypto/bn/libfips-lib-bn_mpi.o" => [ + "crypto/bn/bn_mpi.c" + ], + "crypto/bn/libfips-lib-bn_mul.o" => [ + "crypto/bn/bn_mul.c" + ], + "crypto/bn/libfips-lib-bn_nist.o" => [ + "crypto/bn/bn_nist.c" + ], + "crypto/bn/libfips-lib-bn_prime.o" => [ + "crypto/bn/bn_prime.c" + ], + "crypto/bn/libfips-lib-bn_rand.o" => [ + "crypto/bn/bn_rand.c" + ], + "crypto/bn/libfips-lib-bn_recp.o" => [ + "crypto/bn/bn_recp.c" + ], + "crypto/bn/libfips-lib-bn_rsa_fips186_4.o" => [ + "crypto/bn/bn_rsa_fips186_4.c" + ], + "crypto/bn/libfips-lib-bn_shift.o" => [ + "crypto/bn/bn_shift.c" + ], + "crypto/bn/libfips-lib-bn_sqr.o" => [ + "crypto/bn/bn_sqr.c" + ], + "crypto/bn/libfips-lib-bn_sqrt.o" => [ + "crypto/bn/bn_sqrt.c" + ], + "crypto/bn/libfips-lib-bn_word.o" => [ + "crypto/bn/bn_word.c" + ], + "crypto/buffer/libcrypto-lib-buf_err.o" => [ + "crypto/buffer/buf_err.c" + ], + "crypto/buffer/libcrypto-lib-buffer.o" => [ + "crypto/buffer/buffer.c" + ], + "crypto/buffer/libfips-lib-buffer.o" => [ + "crypto/buffer/buffer.c" + ], + "crypto/camellia/libcrypto-lib-camellia.o" => [ + "crypto/camellia/camellia.c" + ], + "crypto/camellia/libcrypto-lib-cmll_cbc.o" => [ + "crypto/camellia/cmll_cbc.c" + ], + "crypto/camellia/libcrypto-lib-cmll_cfb.o" => [ + "crypto/camellia/cmll_cfb.c" + ], + "crypto/camellia/libcrypto-lib-cmll_ctr.o" => [ + "crypto/camellia/cmll_ctr.c" + ], + "crypto/camellia/libcrypto-lib-cmll_ecb.o" => [ + "crypto/camellia/cmll_ecb.c" + ], + "crypto/camellia/libcrypto-lib-cmll_misc.o" => [ + "crypto/camellia/cmll_misc.c" + ], + "crypto/camellia/libcrypto-lib-cmll_ofb.o" => [ + "crypto/camellia/cmll_ofb.c" + ], + "crypto/cast/libcrypto-lib-c_cfb64.o" => [ + "crypto/cast/c_cfb64.c" + ], + "crypto/cast/libcrypto-lib-c_ecb.o" => [ + "crypto/cast/c_ecb.c" + ], + "crypto/cast/libcrypto-lib-c_enc.o" => [ + "crypto/cast/c_enc.c" + ], + "crypto/cast/libcrypto-lib-c_ofb64.o" => [ + "crypto/cast/c_ofb64.c" + ], + "crypto/cast/libcrypto-lib-c_skey.o" => [ + "crypto/cast/c_skey.c" + ], + "crypto/chacha/libcrypto-lib-chacha-riscv64-v-zbb-zvkb.o" => [ + "crypto/chacha/chacha-riscv64-v-zbb-zvkb.s" + ], + "crypto/chacha/libcrypto-lib-chacha-riscv64-v-zbb.o" => [ + "crypto/chacha/chacha-riscv64-v-zbb.s" + ], + "crypto/chacha/libcrypto-lib-chacha_enc.o" => [ + "crypto/chacha/chacha_enc.c" + ], + "crypto/chacha/libcrypto-lib-chacha_riscv.o" => [ + "crypto/chacha/chacha_riscv.c" + ], + "crypto/cmac/libcrypto-lib-cmac.o" => [ + "crypto/cmac/cmac.c" + ], + "crypto/cmac/libfips-lib-cmac.o" => [ + "crypto/cmac/cmac.c" + ], + "crypto/cmp/libcrypto-lib-cmp_asn.o" => [ + "crypto/cmp/cmp_asn.c" + ], + "crypto/cmp/libcrypto-lib-cmp_client.o" => [ + "crypto/cmp/cmp_client.c" + ], + "crypto/cmp/libcrypto-lib-cmp_ctx.o" => [ + "crypto/cmp/cmp_ctx.c" + ], + "crypto/cmp/libcrypto-lib-cmp_err.o" => [ + "crypto/cmp/cmp_err.c" + ], + "crypto/cmp/libcrypto-lib-cmp_genm.o" => [ + "crypto/cmp/cmp_genm.c" + ], + "crypto/cmp/libcrypto-lib-cmp_hdr.o" => [ + "crypto/cmp/cmp_hdr.c" + ], + "crypto/cmp/libcrypto-lib-cmp_http.o" => [ + "crypto/cmp/cmp_http.c" + ], + "crypto/cmp/libcrypto-lib-cmp_msg.o" => [ + "crypto/cmp/cmp_msg.c" + ], + "crypto/cmp/libcrypto-lib-cmp_protect.o" => [ + "crypto/cmp/cmp_protect.c" + ], + "crypto/cmp/libcrypto-lib-cmp_server.o" => [ + "crypto/cmp/cmp_server.c" + ], + "crypto/cmp/libcrypto-lib-cmp_status.o" => [ + "crypto/cmp/cmp_status.c" + ], + "crypto/cmp/libcrypto-lib-cmp_util.o" => [ + "crypto/cmp/cmp_util.c" + ], + "crypto/cmp/libcrypto-lib-cmp_vfy.o" => [ + "crypto/cmp/cmp_vfy.c" + ], + "crypto/cms/libcrypto-lib-cms_asn1.o" => [ + "crypto/cms/cms_asn1.c" + ], + "crypto/cms/libcrypto-lib-cms_att.o" => [ + "crypto/cms/cms_att.c" + ], + "crypto/cms/libcrypto-lib-cms_cd.o" => [ + "crypto/cms/cms_cd.c" + ], + "crypto/cms/libcrypto-lib-cms_dd.o" => [ + "crypto/cms/cms_dd.c" + ], + "crypto/cms/libcrypto-lib-cms_dh.o" => [ + "crypto/cms/cms_dh.c" + ], + "crypto/cms/libcrypto-lib-cms_ec.o" => [ + "crypto/cms/cms_ec.c" + ], + "crypto/cms/libcrypto-lib-cms_enc.o" => [ + "crypto/cms/cms_enc.c" + ], + "crypto/cms/libcrypto-lib-cms_env.o" => [ + "crypto/cms/cms_env.c" + ], + "crypto/cms/libcrypto-lib-cms_err.o" => [ + "crypto/cms/cms_err.c" + ], + "crypto/cms/libcrypto-lib-cms_ess.o" => [ + "crypto/cms/cms_ess.c" + ], + "crypto/cms/libcrypto-lib-cms_io.o" => [ + "crypto/cms/cms_io.c" + ], + "crypto/cms/libcrypto-lib-cms_kari.o" => [ + "crypto/cms/cms_kari.c" + ], + "crypto/cms/libcrypto-lib-cms_lib.o" => [ + "crypto/cms/cms_lib.c" + ], + "crypto/cms/libcrypto-lib-cms_pwri.o" => [ + "crypto/cms/cms_pwri.c" + ], + "crypto/cms/libcrypto-lib-cms_rsa.o" => [ + "crypto/cms/cms_rsa.c" + ], + "crypto/cms/libcrypto-lib-cms_sd.o" => [ + "crypto/cms/cms_sd.c" + ], + "crypto/cms/libcrypto-lib-cms_smime.o" => [ + "crypto/cms/cms_smime.c" + ], + "crypto/comp/libcrypto-lib-c_brotli.o" => [ + "crypto/comp/c_brotli.c" + ], + "crypto/comp/libcrypto-lib-c_zlib.o" => [ + "crypto/comp/c_zlib.c" + ], + "crypto/comp/libcrypto-lib-c_zstd.o" => [ + "crypto/comp/c_zstd.c" + ], + "crypto/comp/libcrypto-lib-comp_err.o" => [ + "crypto/comp/comp_err.c" + ], + "crypto/comp/libcrypto-lib-comp_lib.o" => [ + "crypto/comp/comp_lib.c" + ], + "crypto/conf/libcrypto-lib-conf_api.o" => [ + "crypto/conf/conf_api.c" + ], + "crypto/conf/libcrypto-lib-conf_def.o" => [ + "crypto/conf/conf_def.c" + ], + "crypto/conf/libcrypto-lib-conf_err.o" => [ + "crypto/conf/conf_err.c" + ], + "crypto/conf/libcrypto-lib-conf_lib.o" => [ + "crypto/conf/conf_lib.c" + ], + "crypto/conf/libcrypto-lib-conf_mall.o" => [ + "crypto/conf/conf_mall.c" + ], + "crypto/conf/libcrypto-lib-conf_mod.o" => [ + "crypto/conf/conf_mod.c" + ], + "crypto/conf/libcrypto-lib-conf_sap.o" => [ + "crypto/conf/conf_sap.c" + ], + "crypto/conf/libcrypto-lib-conf_ssl.o" => [ + "crypto/conf/conf_ssl.c" + ], + "crypto/crmf/libcrypto-lib-crmf_asn.o" => [ + "crypto/crmf/crmf_asn.c" + ], + "crypto/crmf/libcrypto-lib-crmf_err.o" => [ + "crypto/crmf/crmf_err.c" + ], + "crypto/crmf/libcrypto-lib-crmf_lib.o" => [ + "crypto/crmf/crmf_lib.c" + ], + "crypto/crmf/libcrypto-lib-crmf_pbm.o" => [ + "crypto/crmf/crmf_pbm.c" + ], + "crypto/ct/libcrypto-lib-ct_b64.o" => [ + "crypto/ct/ct_b64.c" + ], + "crypto/ct/libcrypto-lib-ct_err.o" => [ + "crypto/ct/ct_err.c" + ], + "crypto/ct/libcrypto-lib-ct_log.o" => [ + "crypto/ct/ct_log.c" + ], + "crypto/ct/libcrypto-lib-ct_oct.o" => [ + "crypto/ct/ct_oct.c" + ], + "crypto/ct/libcrypto-lib-ct_policy.o" => [ + "crypto/ct/ct_policy.c" + ], + "crypto/ct/libcrypto-lib-ct_prn.o" => [ + "crypto/ct/ct_prn.c" + ], + "crypto/ct/libcrypto-lib-ct_sct.o" => [ + "crypto/ct/ct_sct.c" + ], + "crypto/ct/libcrypto-lib-ct_sct_ctx.o" => [ + "crypto/ct/ct_sct_ctx.c" + ], + "crypto/ct/libcrypto-lib-ct_vfy.o" => [ + "crypto/ct/ct_vfy.c" + ], + "crypto/ct/libcrypto-lib-ct_x509v3.o" => [ + "crypto/ct/ct_x509v3.c" + ], + "crypto/des/libcrypto-lib-cbc_cksm.o" => [ + "crypto/des/cbc_cksm.c" + ], + "crypto/des/libcrypto-lib-cbc_enc.o" => [ + "crypto/des/cbc_enc.c" + ], + "crypto/des/libcrypto-lib-cfb64ede.o" => [ + "crypto/des/cfb64ede.c" + ], + "crypto/des/libcrypto-lib-cfb64enc.o" => [ + "crypto/des/cfb64enc.c" + ], + "crypto/des/libcrypto-lib-cfb_enc.o" => [ + "crypto/des/cfb_enc.c" + ], + "crypto/des/libcrypto-lib-des_enc.o" => [ + "crypto/des/des_enc.c" + ], + "crypto/des/libcrypto-lib-ecb3_enc.o" => [ + "crypto/des/ecb3_enc.c" + ], + "crypto/des/libcrypto-lib-ecb_enc.o" => [ + "crypto/des/ecb_enc.c" + ], + "crypto/des/libcrypto-lib-fcrypt.o" => [ + "crypto/des/fcrypt.c" + ], + "crypto/des/libcrypto-lib-fcrypt_b.o" => [ + "crypto/des/fcrypt_b.c" + ], + "crypto/des/libcrypto-lib-ofb64ede.o" => [ + "crypto/des/ofb64ede.c" + ], + "crypto/des/libcrypto-lib-ofb64enc.o" => [ + "crypto/des/ofb64enc.c" + ], + "crypto/des/libcrypto-lib-ofb_enc.o" => [ + "crypto/des/ofb_enc.c" + ], + "crypto/des/libcrypto-lib-pcbc_enc.o" => [ + "crypto/des/pcbc_enc.c" + ], + "crypto/des/libcrypto-lib-qud_cksm.o" => [ + "crypto/des/qud_cksm.c" + ], + "crypto/des/libcrypto-lib-rand_key.o" => [ + "crypto/des/rand_key.c" + ], + "crypto/des/libcrypto-lib-set_key.o" => [ + "crypto/des/set_key.c" + ], + "crypto/des/libcrypto-lib-str2key.o" => [ + "crypto/des/str2key.c" + ], + "crypto/des/libcrypto-lib-xcbc_enc.o" => [ + "crypto/des/xcbc_enc.c" + ], + "crypto/des/libfips-lib-des_enc.o" => [ + "crypto/des/des_enc.c" + ], + "crypto/des/libfips-lib-ecb3_enc.o" => [ + "crypto/des/ecb3_enc.c" + ], + "crypto/des/libfips-lib-fcrypt_b.o" => [ + "crypto/des/fcrypt_b.c" + ], + "crypto/des/libfips-lib-set_key.o" => [ + "crypto/des/set_key.c" + ], + "crypto/dh/libcrypto-lib-dh_ameth.o" => [ + "crypto/dh/dh_ameth.c" + ], + "crypto/dh/libcrypto-lib-dh_asn1.o" => [ + "crypto/dh/dh_asn1.c" + ], + "crypto/dh/libcrypto-lib-dh_backend.o" => [ + "crypto/dh/dh_backend.c" + ], + "crypto/dh/libcrypto-lib-dh_check.o" => [ + "crypto/dh/dh_check.c" + ], + "crypto/dh/libcrypto-lib-dh_depr.o" => [ + "crypto/dh/dh_depr.c" + ], + "crypto/dh/libcrypto-lib-dh_err.o" => [ + "crypto/dh/dh_err.c" + ], + "crypto/dh/libcrypto-lib-dh_gen.o" => [ + "crypto/dh/dh_gen.c" + ], + "crypto/dh/libcrypto-lib-dh_group_params.o" => [ + "crypto/dh/dh_group_params.c" + ], + "crypto/dh/libcrypto-lib-dh_kdf.o" => [ + "crypto/dh/dh_kdf.c" + ], + "crypto/dh/libcrypto-lib-dh_key.o" => [ + "crypto/dh/dh_key.c" + ], + "crypto/dh/libcrypto-lib-dh_lib.o" => [ + "crypto/dh/dh_lib.c" + ], + "crypto/dh/libcrypto-lib-dh_meth.o" => [ + "crypto/dh/dh_meth.c" + ], + "crypto/dh/libcrypto-lib-dh_pmeth.o" => [ + "crypto/dh/dh_pmeth.c" + ], + "crypto/dh/libcrypto-lib-dh_prn.o" => [ + "crypto/dh/dh_prn.c" + ], + "crypto/dh/libcrypto-lib-dh_rfc5114.o" => [ + "crypto/dh/dh_rfc5114.c" + ], + "crypto/dh/libfips-lib-dh_backend.o" => [ + "crypto/dh/dh_backend.c" + ], + "crypto/dh/libfips-lib-dh_check.o" => [ + "crypto/dh/dh_check.c" + ], + "crypto/dh/libfips-lib-dh_gen.o" => [ + "crypto/dh/dh_gen.c" + ], + "crypto/dh/libfips-lib-dh_group_params.o" => [ + "crypto/dh/dh_group_params.c" + ], + "crypto/dh/libfips-lib-dh_kdf.o" => [ + "crypto/dh/dh_kdf.c" + ], + "crypto/dh/libfips-lib-dh_key.o" => [ + "crypto/dh/dh_key.c" + ], + "crypto/dh/libfips-lib-dh_lib.o" => [ + "crypto/dh/dh_lib.c" + ], + "crypto/dsa/libcrypto-lib-dsa_ameth.o" => [ + "crypto/dsa/dsa_ameth.c" + ], + "crypto/dsa/libcrypto-lib-dsa_asn1.o" => [ + "crypto/dsa/dsa_asn1.c" + ], + "crypto/dsa/libcrypto-lib-dsa_backend.o" => [ + "crypto/dsa/dsa_backend.c" + ], + "crypto/dsa/libcrypto-lib-dsa_check.o" => [ + "crypto/dsa/dsa_check.c" + ], + "crypto/dsa/libcrypto-lib-dsa_depr.o" => [ + "crypto/dsa/dsa_depr.c" + ], + "crypto/dsa/libcrypto-lib-dsa_err.o" => [ + "crypto/dsa/dsa_err.c" + ], + "crypto/dsa/libcrypto-lib-dsa_gen.o" => [ + "crypto/dsa/dsa_gen.c" + ], + "crypto/dsa/libcrypto-lib-dsa_key.o" => [ + "crypto/dsa/dsa_key.c" + ], + "crypto/dsa/libcrypto-lib-dsa_lib.o" => [ + "crypto/dsa/dsa_lib.c" + ], + "crypto/dsa/libcrypto-lib-dsa_meth.o" => [ + "crypto/dsa/dsa_meth.c" + ], + "crypto/dsa/libcrypto-lib-dsa_ossl.o" => [ + "crypto/dsa/dsa_ossl.c" + ], + "crypto/dsa/libcrypto-lib-dsa_pmeth.o" => [ + "crypto/dsa/dsa_pmeth.c" + ], + "crypto/dsa/libcrypto-lib-dsa_prn.o" => [ + "crypto/dsa/dsa_prn.c" + ], + "crypto/dsa/libcrypto-lib-dsa_sign.o" => [ + "crypto/dsa/dsa_sign.c" + ], + "crypto/dsa/libcrypto-lib-dsa_vrf.o" => [ + "crypto/dsa/dsa_vrf.c" + ], + "crypto/dsa/libfips-lib-dsa_backend.o" => [ + "crypto/dsa/dsa_backend.c" + ], + "crypto/dsa/libfips-lib-dsa_check.o" => [ + "crypto/dsa/dsa_check.c" + ], + "crypto/dsa/libfips-lib-dsa_gen.o" => [ + "crypto/dsa/dsa_gen.c" + ], + "crypto/dsa/libfips-lib-dsa_key.o" => [ + "crypto/dsa/dsa_key.c" + ], + "crypto/dsa/libfips-lib-dsa_lib.o" => [ + "crypto/dsa/dsa_lib.c" + ], + "crypto/dsa/libfips-lib-dsa_ossl.o" => [ + "crypto/dsa/dsa_ossl.c" + ], + "crypto/dsa/libfips-lib-dsa_sign.o" => [ + "crypto/dsa/dsa_sign.c" + ], + "crypto/dsa/libfips-lib-dsa_vrf.o" => [ + "crypto/dsa/dsa_vrf.c" + ], + "crypto/dso/libcrypto-lib-dso_dl.o" => [ + "crypto/dso/dso_dl.c" + ], + "crypto/dso/libcrypto-lib-dso_dlfcn.o" => [ + "crypto/dso/dso_dlfcn.c" + ], + "crypto/dso/libcrypto-lib-dso_err.o" => [ + "crypto/dso/dso_err.c" + ], + "crypto/dso/libcrypto-lib-dso_lib.o" => [ + "crypto/dso/dso_lib.c" + ], + "crypto/dso/libcrypto-lib-dso_openssl.o" => [ + "crypto/dso/dso_openssl.c" + ], + "crypto/dso/libcrypto-lib-dso_vms.o" => [ + "crypto/dso/dso_vms.c" + ], + "crypto/dso/libcrypto-lib-dso_win32.o" => [ + "crypto/dso/dso_win32.c" + ], + "crypto/ec/curve448/arch_32/libcrypto-lib-f_impl32.o" => [ + "crypto/ec/curve448/arch_32/f_impl32.c" + ], + "crypto/ec/curve448/arch_32/libfips-lib-f_impl32.o" => [ + "crypto/ec/curve448/arch_32/f_impl32.c" + ], + "crypto/ec/curve448/arch_64/libcrypto-lib-f_impl64.o" => [ + "crypto/ec/curve448/arch_64/f_impl64.c" + ], + "crypto/ec/curve448/arch_64/libfips-lib-f_impl64.o" => [ + "crypto/ec/curve448/arch_64/f_impl64.c" + ], + "crypto/ec/curve448/libcrypto-lib-curve448.o" => [ + "crypto/ec/curve448/curve448.c" + ], + "crypto/ec/curve448/libcrypto-lib-curve448_tables.o" => [ + "crypto/ec/curve448/curve448_tables.c" + ], + "crypto/ec/curve448/libcrypto-lib-eddsa.o" => [ + "crypto/ec/curve448/eddsa.c" + ], + "crypto/ec/curve448/libcrypto-lib-f_generic.o" => [ + "crypto/ec/curve448/f_generic.c" + ], + "crypto/ec/curve448/libcrypto-lib-scalar.o" => [ + "crypto/ec/curve448/scalar.c" + ], + "crypto/ec/curve448/libfips-lib-curve448.o" => [ + "crypto/ec/curve448/curve448.c" + ], + "crypto/ec/curve448/libfips-lib-curve448_tables.o" => [ + "crypto/ec/curve448/curve448_tables.c" + ], + "crypto/ec/curve448/libfips-lib-eddsa.o" => [ + "crypto/ec/curve448/eddsa.c" + ], + "crypto/ec/curve448/libfips-lib-f_generic.o" => [ + "crypto/ec/curve448/f_generic.c" + ], + "crypto/ec/curve448/libfips-lib-scalar.o" => [ + "crypto/ec/curve448/scalar.c" + ], + "crypto/ec/libcrypto-lib-curve25519.o" => [ + "crypto/ec/curve25519.c" + ], + "crypto/ec/libcrypto-lib-ec2_oct.o" => [ + "crypto/ec/ec2_oct.c" + ], + "crypto/ec/libcrypto-lib-ec2_smpl.o" => [ + "crypto/ec/ec2_smpl.c" + ], + "crypto/ec/libcrypto-lib-ec_ameth.o" => [ + "crypto/ec/ec_ameth.c" + ], + "crypto/ec/libcrypto-lib-ec_asn1.o" => [ + "crypto/ec/ec_asn1.c" + ], + "crypto/ec/libcrypto-lib-ec_backend.o" => [ + "crypto/ec/ec_backend.c" + ], + "crypto/ec/libcrypto-lib-ec_check.o" => [ + "crypto/ec/ec_check.c" + ], + "crypto/ec/libcrypto-lib-ec_curve.o" => [ + "crypto/ec/ec_curve.c" + ], + "crypto/ec/libcrypto-lib-ec_cvt.o" => [ + "crypto/ec/ec_cvt.c" + ], + "crypto/ec/libcrypto-lib-ec_deprecated.o" => [ + "crypto/ec/ec_deprecated.c" + ], + "crypto/ec/libcrypto-lib-ec_err.o" => [ + "crypto/ec/ec_err.c" + ], + "crypto/ec/libcrypto-lib-ec_key.o" => [ + "crypto/ec/ec_key.c" + ], + "crypto/ec/libcrypto-lib-ec_kmeth.o" => [ + "crypto/ec/ec_kmeth.c" + ], + "crypto/ec/libcrypto-lib-ec_lib.o" => [ + "crypto/ec/ec_lib.c" + ], + "crypto/ec/libcrypto-lib-ec_mult.o" => [ + "crypto/ec/ec_mult.c" + ], + "crypto/ec/libcrypto-lib-ec_oct.o" => [ + "crypto/ec/ec_oct.c" + ], + "crypto/ec/libcrypto-lib-ec_pmeth.o" => [ + "crypto/ec/ec_pmeth.c" + ], + "crypto/ec/libcrypto-lib-ec_print.o" => [ + "crypto/ec/ec_print.c" + ], + "crypto/ec/libcrypto-lib-ecdh_kdf.o" => [ + "crypto/ec/ecdh_kdf.c" + ], + "crypto/ec/libcrypto-lib-ecdh_ossl.o" => [ + "crypto/ec/ecdh_ossl.c" + ], + "crypto/ec/libcrypto-lib-ecdsa_ossl.o" => [ + "crypto/ec/ecdsa_ossl.c" + ], + "crypto/ec/libcrypto-lib-ecdsa_sign.o" => [ + "crypto/ec/ecdsa_sign.c" + ], + "crypto/ec/libcrypto-lib-ecdsa_vrf.o" => [ + "crypto/ec/ecdsa_vrf.c" + ], + "crypto/ec/libcrypto-lib-eck_prn.o" => [ + "crypto/ec/eck_prn.c" + ], + "crypto/ec/libcrypto-lib-ecp_mont.o" => [ + "crypto/ec/ecp_mont.c" + ], + "crypto/ec/libcrypto-lib-ecp_nist.o" => [ + "crypto/ec/ecp_nist.c" + ], + "crypto/ec/libcrypto-lib-ecp_oct.o" => [ + "crypto/ec/ecp_oct.c" + ], + "crypto/ec/libcrypto-lib-ecp_smpl.o" => [ + "crypto/ec/ecp_smpl.c" + ], + "crypto/ec/libcrypto-lib-ecx_backend.o" => [ + "crypto/ec/ecx_backend.c" + ], + "crypto/ec/libcrypto-lib-ecx_key.o" => [ + "crypto/ec/ecx_key.c" + ], + "crypto/ec/libcrypto-lib-ecx_meth.o" => [ + "crypto/ec/ecx_meth.c" + ], + "crypto/ec/libfips-lib-curve25519.o" => [ + "crypto/ec/curve25519.c" + ], + "crypto/ec/libfips-lib-ec2_oct.o" => [ + "crypto/ec/ec2_oct.c" + ], + "crypto/ec/libfips-lib-ec2_smpl.o" => [ + "crypto/ec/ec2_smpl.c" + ], + "crypto/ec/libfips-lib-ec_asn1.o" => [ + "crypto/ec/ec_asn1.c" + ], + "crypto/ec/libfips-lib-ec_backend.o" => [ + "crypto/ec/ec_backend.c" + ], + "crypto/ec/libfips-lib-ec_check.o" => [ + "crypto/ec/ec_check.c" + ], + "crypto/ec/libfips-lib-ec_curve.o" => [ + "crypto/ec/ec_curve.c" + ], + "crypto/ec/libfips-lib-ec_cvt.o" => [ + "crypto/ec/ec_cvt.c" + ], + "crypto/ec/libfips-lib-ec_key.o" => [ + "crypto/ec/ec_key.c" + ], + "crypto/ec/libfips-lib-ec_kmeth.o" => [ + "crypto/ec/ec_kmeth.c" + ], + "crypto/ec/libfips-lib-ec_lib.o" => [ + "crypto/ec/ec_lib.c" + ], + "crypto/ec/libfips-lib-ec_mult.o" => [ + "crypto/ec/ec_mult.c" + ], + "crypto/ec/libfips-lib-ec_oct.o" => [ + "crypto/ec/ec_oct.c" + ], + "crypto/ec/libfips-lib-ecdh_kdf.o" => [ + "crypto/ec/ecdh_kdf.c" + ], + "crypto/ec/libfips-lib-ecdh_ossl.o" => [ + "crypto/ec/ecdh_ossl.c" + ], + "crypto/ec/libfips-lib-ecdsa_ossl.o" => [ + "crypto/ec/ecdsa_ossl.c" + ], + "crypto/ec/libfips-lib-ecdsa_sign.o" => [ + "crypto/ec/ecdsa_sign.c" + ], + "crypto/ec/libfips-lib-ecdsa_vrf.o" => [ + "crypto/ec/ecdsa_vrf.c" + ], + "crypto/ec/libfips-lib-ecp_mont.o" => [ + "crypto/ec/ecp_mont.c" + ], + "crypto/ec/libfips-lib-ecp_nist.o" => [ + "crypto/ec/ecp_nist.c" + ], + "crypto/ec/libfips-lib-ecp_oct.o" => [ + "crypto/ec/ecp_oct.c" + ], + "crypto/ec/libfips-lib-ecp_smpl.o" => [ + "crypto/ec/ecp_smpl.c" + ], + "crypto/ec/libfips-lib-ecx_backend.o" => [ + "crypto/ec/ecx_backend.c" + ], + "crypto/ec/libfips-lib-ecx_key.o" => [ + "crypto/ec/ecx_key.c" + ], + "crypto/encode_decode/libcrypto-lib-decoder_err.o" => [ + "crypto/encode_decode/decoder_err.c" + ], + "crypto/encode_decode/libcrypto-lib-decoder_lib.o" => [ + "crypto/encode_decode/decoder_lib.c" + ], + "crypto/encode_decode/libcrypto-lib-decoder_meth.o" => [ + "crypto/encode_decode/decoder_meth.c" + ], + "crypto/encode_decode/libcrypto-lib-decoder_pkey.o" => [ + "crypto/encode_decode/decoder_pkey.c" + ], + "crypto/encode_decode/libcrypto-lib-encoder_err.o" => [ + "crypto/encode_decode/encoder_err.c" + ], + "crypto/encode_decode/libcrypto-lib-encoder_lib.o" => [ + "crypto/encode_decode/encoder_lib.c" + ], + "crypto/encode_decode/libcrypto-lib-encoder_meth.o" => [ + "crypto/encode_decode/encoder_meth.c" + ], + "crypto/encode_decode/libcrypto-lib-encoder_pkey.o" => [ + "crypto/encode_decode/encoder_pkey.c" + ], + "crypto/engine/libcrypto-lib-eng_all.o" => [ + "crypto/engine/eng_all.c" + ], + "crypto/engine/libcrypto-lib-eng_cnf.o" => [ + "crypto/engine/eng_cnf.c" + ], + "crypto/engine/libcrypto-lib-eng_ctrl.o" => [ + "crypto/engine/eng_ctrl.c" + ], + "crypto/engine/libcrypto-lib-eng_dyn.o" => [ + "crypto/engine/eng_dyn.c" + ], + "crypto/engine/libcrypto-lib-eng_err.o" => [ + "crypto/engine/eng_err.c" + ], + "crypto/engine/libcrypto-lib-eng_fat.o" => [ + "crypto/engine/eng_fat.c" + ], + "crypto/engine/libcrypto-lib-eng_init.o" => [ + "crypto/engine/eng_init.c" + ], + "crypto/engine/libcrypto-lib-eng_lib.o" => [ + "crypto/engine/eng_lib.c" + ], + "crypto/engine/libcrypto-lib-eng_list.o" => [ + "crypto/engine/eng_list.c" + ], + "crypto/engine/libcrypto-lib-eng_openssl.o" => [ + "crypto/engine/eng_openssl.c" + ], + "crypto/engine/libcrypto-lib-eng_pkey.o" => [ + "crypto/engine/eng_pkey.c" + ], + "crypto/engine/libcrypto-lib-eng_rdrand.o" => [ + "crypto/engine/eng_rdrand.c" + ], + "crypto/engine/libcrypto-lib-eng_table.o" => [ + "crypto/engine/eng_table.c" + ], + "crypto/engine/libcrypto-lib-tb_asnmth.o" => [ + "crypto/engine/tb_asnmth.c" + ], + "crypto/engine/libcrypto-lib-tb_cipher.o" => [ + "crypto/engine/tb_cipher.c" + ], + "crypto/engine/libcrypto-lib-tb_dh.o" => [ + "crypto/engine/tb_dh.c" + ], + "crypto/engine/libcrypto-lib-tb_digest.o" => [ + "crypto/engine/tb_digest.c" + ], + "crypto/engine/libcrypto-lib-tb_dsa.o" => [ + "crypto/engine/tb_dsa.c" + ], + "crypto/engine/libcrypto-lib-tb_eckey.o" => [ + "crypto/engine/tb_eckey.c" + ], + "crypto/engine/libcrypto-lib-tb_pkmeth.o" => [ + "crypto/engine/tb_pkmeth.c" + ], + "crypto/engine/libcrypto-lib-tb_rand.o" => [ + "crypto/engine/tb_rand.c" + ], + "crypto/engine/libcrypto-lib-tb_rsa.o" => [ + "crypto/engine/tb_rsa.c" + ], + "crypto/err/libcrypto-lib-err.o" => [ + "crypto/err/err.c" + ], + "crypto/err/libcrypto-lib-err_all.o" => [ + "crypto/err/err_all.c" + ], + "crypto/err/libcrypto-lib-err_all_legacy.o" => [ + "crypto/err/err_all_legacy.c" + ], + "crypto/err/libcrypto-lib-err_blocks.o" => [ + "crypto/err/err_blocks.c" + ], + "crypto/err/libcrypto-lib-err_mark.o" => [ + "crypto/err/err_mark.c" + ], + "crypto/err/libcrypto-lib-err_prn.o" => [ + "crypto/err/err_prn.c" + ], + "crypto/err/libcrypto-lib-err_save.o" => [ + "crypto/err/err_save.c" + ], + "crypto/ess/libcrypto-lib-ess_asn1.o" => [ + "crypto/ess/ess_asn1.c" + ], + "crypto/ess/libcrypto-lib-ess_err.o" => [ + "crypto/ess/ess_err.c" + ], + "crypto/ess/libcrypto-lib-ess_lib.o" => [ + "crypto/ess/ess_lib.c" + ], + "crypto/evp/libcrypto-lib-asymcipher.o" => [ + "crypto/evp/asymcipher.c" + ], + "crypto/evp/libcrypto-lib-bio_b64.o" => [ + "crypto/evp/bio_b64.c" + ], + "crypto/evp/libcrypto-lib-bio_enc.o" => [ + "crypto/evp/bio_enc.c" + ], + "crypto/evp/libcrypto-lib-bio_md.o" => [ + "crypto/evp/bio_md.c" + ], + "crypto/evp/libcrypto-lib-bio_ok.o" => [ + "crypto/evp/bio_ok.c" + ], + "crypto/evp/libcrypto-lib-c_allc.o" => [ + "crypto/evp/c_allc.c" + ], + "crypto/evp/libcrypto-lib-c_alld.o" => [ + "crypto/evp/c_alld.c" + ], + "crypto/evp/libcrypto-lib-cmeth_lib.o" => [ + "crypto/evp/cmeth_lib.c" + ], + "crypto/evp/libcrypto-lib-ctrl_params_translate.o" => [ + "crypto/evp/ctrl_params_translate.c" + ], + "crypto/evp/libcrypto-lib-dh_ctrl.o" => [ + "crypto/evp/dh_ctrl.c" + ], + "crypto/evp/libcrypto-lib-dh_support.o" => [ + "crypto/evp/dh_support.c" + ], + "crypto/evp/libcrypto-lib-digest.o" => [ + "crypto/evp/digest.c" + ], + "crypto/evp/libcrypto-lib-dsa_ctrl.o" => [ + "crypto/evp/dsa_ctrl.c" + ], + "crypto/evp/libcrypto-lib-e_aes.o" => [ + "crypto/evp/e_aes.c" + ], + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha1.o" => [ + "crypto/evp/e_aes_cbc_hmac_sha1.c" + ], + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha256.o" => [ + "crypto/evp/e_aes_cbc_hmac_sha256.c" + ], + "crypto/evp/libcrypto-lib-e_aria.o" => [ + "crypto/evp/e_aria.c" + ], + "crypto/evp/libcrypto-lib-e_bf.o" => [ + "crypto/evp/e_bf.c" + ], + "crypto/evp/libcrypto-lib-e_camellia.o" => [ + "crypto/evp/e_camellia.c" + ], + "crypto/evp/libcrypto-lib-e_cast.o" => [ + "crypto/evp/e_cast.c" + ], + "crypto/evp/libcrypto-lib-e_chacha20_poly1305.o" => [ + "crypto/evp/e_chacha20_poly1305.c" + ], + "crypto/evp/libcrypto-lib-e_des.o" => [ + "crypto/evp/e_des.c" + ], + "crypto/evp/libcrypto-lib-e_des3.o" => [ + "crypto/evp/e_des3.c" + ], + "crypto/evp/libcrypto-lib-e_idea.o" => [ + "crypto/evp/e_idea.c" + ], + "crypto/evp/libcrypto-lib-e_null.o" => [ + "crypto/evp/e_null.c" + ], + "crypto/evp/libcrypto-lib-e_old.o" => [ + "crypto/evp/e_old.c" + ], + "crypto/evp/libcrypto-lib-e_rc2.o" => [ + "crypto/evp/e_rc2.c" + ], + "crypto/evp/libcrypto-lib-e_rc4.o" => [ + "crypto/evp/e_rc4.c" + ], + "crypto/evp/libcrypto-lib-e_rc4_hmac_md5.o" => [ + "crypto/evp/e_rc4_hmac_md5.c" + ], + "crypto/evp/libcrypto-lib-e_rc5.o" => [ + "crypto/evp/e_rc5.c" + ], + "crypto/evp/libcrypto-lib-e_seed.o" => [ + "crypto/evp/e_seed.c" + ], + "crypto/evp/libcrypto-lib-e_sm4.o" => [ + "crypto/evp/e_sm4.c" + ], + "crypto/evp/libcrypto-lib-e_xcbc_d.o" => [ + "crypto/evp/e_xcbc_d.c" + ], + "crypto/evp/libcrypto-lib-ec_ctrl.o" => [ + "crypto/evp/ec_ctrl.c" + ], + "crypto/evp/libcrypto-lib-ec_support.o" => [ + "crypto/evp/ec_support.c" + ], + "crypto/evp/libcrypto-lib-encode.o" => [ + "crypto/evp/encode.c" + ], + "crypto/evp/libcrypto-lib-evp_cnf.o" => [ + "crypto/evp/evp_cnf.c" + ], + "crypto/evp/libcrypto-lib-evp_enc.o" => [ + "crypto/evp/evp_enc.c" + ], + "crypto/evp/libcrypto-lib-evp_err.o" => [ + "crypto/evp/evp_err.c" + ], + "crypto/evp/libcrypto-lib-evp_fetch.o" => [ + "crypto/evp/evp_fetch.c" + ], + "crypto/evp/libcrypto-lib-evp_key.o" => [ + "crypto/evp/evp_key.c" + ], + "crypto/evp/libcrypto-lib-evp_lib.o" => [ + "crypto/evp/evp_lib.c" + ], + "crypto/evp/libcrypto-lib-evp_pbe.o" => [ + "crypto/evp/evp_pbe.c" + ], + "crypto/evp/libcrypto-lib-evp_pkey.o" => [ + "crypto/evp/evp_pkey.c" + ], + "crypto/evp/libcrypto-lib-evp_rand.o" => [ + "crypto/evp/evp_rand.c" + ], + "crypto/evp/libcrypto-lib-evp_utils.o" => [ + "crypto/evp/evp_utils.c" + ], + "crypto/evp/libcrypto-lib-exchange.o" => [ + "crypto/evp/exchange.c" + ], + "crypto/evp/libcrypto-lib-kdf_lib.o" => [ + "crypto/evp/kdf_lib.c" + ], + "crypto/evp/libcrypto-lib-kdf_meth.o" => [ + "crypto/evp/kdf_meth.c" + ], + "crypto/evp/libcrypto-lib-kem.o" => [ + "crypto/evp/kem.c" + ], + "crypto/evp/libcrypto-lib-keymgmt_lib.o" => [ + "crypto/evp/keymgmt_lib.c" + ], + "crypto/evp/libcrypto-lib-keymgmt_meth.o" => [ + "crypto/evp/keymgmt_meth.c" + ], + "crypto/evp/libcrypto-lib-legacy_blake2.o" => [ + "crypto/evp/legacy_blake2.c" + ], + "crypto/evp/libcrypto-lib-legacy_md4.o" => [ + "crypto/evp/legacy_md4.c" + ], + "crypto/evp/libcrypto-lib-legacy_md5.o" => [ + "crypto/evp/legacy_md5.c" + ], + "crypto/evp/libcrypto-lib-legacy_md5_sha1.o" => [ + "crypto/evp/legacy_md5_sha1.c" + ], + "crypto/evp/libcrypto-lib-legacy_mdc2.o" => [ + "crypto/evp/legacy_mdc2.c" + ], + "crypto/evp/libcrypto-lib-legacy_ripemd.o" => [ + "crypto/evp/legacy_ripemd.c" + ], + "crypto/evp/libcrypto-lib-legacy_sha.o" => [ + "crypto/evp/legacy_sha.c" + ], + "crypto/evp/libcrypto-lib-legacy_wp.o" => [ + "crypto/evp/legacy_wp.c" + ], + "crypto/evp/libcrypto-lib-m_null.o" => [ + "crypto/evp/m_null.c" + ], + "crypto/evp/libcrypto-lib-m_sigver.o" => [ + "crypto/evp/m_sigver.c" + ], + "crypto/evp/libcrypto-lib-mac_lib.o" => [ + "crypto/evp/mac_lib.c" + ], + "crypto/evp/libcrypto-lib-mac_meth.o" => [ + "crypto/evp/mac_meth.c" + ], + "crypto/evp/libcrypto-lib-names.o" => [ + "crypto/evp/names.c" + ], + "crypto/evp/libcrypto-lib-p5_crpt.o" => [ + "crypto/evp/p5_crpt.c" + ], + "crypto/evp/libcrypto-lib-p5_crpt2.o" => [ + "crypto/evp/p5_crpt2.c" + ], + "crypto/evp/libcrypto-lib-p_dec.o" => [ + "crypto/evp/p_dec.c" + ], + "crypto/evp/libcrypto-lib-p_enc.o" => [ + "crypto/evp/p_enc.c" + ], + "crypto/evp/libcrypto-lib-p_legacy.o" => [ + "crypto/evp/p_legacy.c" + ], + "crypto/evp/libcrypto-lib-p_lib.o" => [ + "crypto/evp/p_lib.c" + ], + "crypto/evp/libcrypto-lib-p_open.o" => [ + "crypto/evp/p_open.c" + ], + "crypto/evp/libcrypto-lib-p_seal.o" => [ + "crypto/evp/p_seal.c" + ], + "crypto/evp/libcrypto-lib-p_sign.o" => [ + "crypto/evp/p_sign.c" + ], + "crypto/evp/libcrypto-lib-p_verify.o" => [ + "crypto/evp/p_verify.c" + ], + "crypto/evp/libcrypto-lib-pbe_scrypt.o" => [ + "crypto/evp/pbe_scrypt.c" + ], + "crypto/evp/libcrypto-lib-pmeth_check.o" => [ + "crypto/evp/pmeth_check.c" + ], + "crypto/evp/libcrypto-lib-pmeth_gn.o" => [ + "crypto/evp/pmeth_gn.c" + ], + "crypto/evp/libcrypto-lib-pmeth_lib.o" => [ + "crypto/evp/pmeth_lib.c" + ], + "crypto/evp/libcrypto-lib-s_lib.o" => [ + "crypto/evp/s_lib.c" + ], + "crypto/evp/libcrypto-lib-signature.o" => [ + "crypto/evp/signature.c" + ], + "crypto/evp/libcrypto-lib-skeymgmt_meth.o" => [ + "crypto/evp/skeymgmt_meth.c" + ], + "crypto/evp/libfips-lib-asymcipher.o" => [ + "crypto/evp/asymcipher.c" + ], + "crypto/evp/libfips-lib-dh_support.o" => [ + "crypto/evp/dh_support.c" + ], + "crypto/evp/libfips-lib-digest.o" => [ + "crypto/evp/digest.c" + ], + "crypto/evp/libfips-lib-ec_support.o" => [ + "crypto/evp/ec_support.c" + ], + "crypto/evp/libfips-lib-evp_enc.o" => [ + "crypto/evp/evp_enc.c" + ], + "crypto/evp/libfips-lib-evp_fetch.o" => [ + "crypto/evp/evp_fetch.c" + ], + "crypto/evp/libfips-lib-evp_lib.o" => [ + "crypto/evp/evp_lib.c" + ], + "crypto/evp/libfips-lib-evp_rand.o" => [ + "crypto/evp/evp_rand.c" + ], + "crypto/evp/libfips-lib-evp_utils.o" => [ + "crypto/evp/evp_utils.c" + ], + "crypto/evp/libfips-lib-exchange.o" => [ + "crypto/evp/exchange.c" + ], + "crypto/evp/libfips-lib-kdf_lib.o" => [ + "crypto/evp/kdf_lib.c" + ], + "crypto/evp/libfips-lib-kdf_meth.o" => [ + "crypto/evp/kdf_meth.c" + ], + "crypto/evp/libfips-lib-kem.o" => [ + "crypto/evp/kem.c" + ], + "crypto/evp/libfips-lib-keymgmt_lib.o" => [ + "crypto/evp/keymgmt_lib.c" + ], + "crypto/evp/libfips-lib-keymgmt_meth.o" => [ + "crypto/evp/keymgmt_meth.c" + ], + "crypto/evp/libfips-lib-mac_lib.o" => [ + "crypto/evp/mac_lib.c" + ], + "crypto/evp/libfips-lib-mac_meth.o" => [ + "crypto/evp/mac_meth.c" + ], + "crypto/evp/libfips-lib-p_lib.o" => [ + "crypto/evp/p_lib.c" + ], + "crypto/evp/libfips-lib-pmeth_check.o" => [ + "crypto/evp/pmeth_check.c" + ], + "crypto/evp/libfips-lib-pmeth_gn.o" => [ + "crypto/evp/pmeth_gn.c" + ], + "crypto/evp/libfips-lib-pmeth_lib.o" => [ + "crypto/evp/pmeth_lib.c" + ], + "crypto/evp/libfips-lib-s_lib.o" => [ + "crypto/evp/s_lib.c" + ], + "crypto/evp/libfips-lib-signature.o" => [ + "crypto/evp/signature.c" + ], + "crypto/evp/libfips-lib-skeymgmt_meth.o" => [ + "crypto/evp/skeymgmt_meth.c" + ], + "crypto/ffc/libcrypto-lib-ffc_backend.o" => [ + "crypto/ffc/ffc_backend.c" + ], + "crypto/ffc/libcrypto-lib-ffc_dh.o" => [ + "crypto/ffc/ffc_dh.c" + ], + "crypto/ffc/libcrypto-lib-ffc_key_generate.o" => [ + "crypto/ffc/ffc_key_generate.c" + ], + "crypto/ffc/libcrypto-lib-ffc_key_validate.o" => [ + "crypto/ffc/ffc_key_validate.c" + ], + "crypto/ffc/libcrypto-lib-ffc_params.o" => [ + "crypto/ffc/ffc_params.c" + ], + "crypto/ffc/libcrypto-lib-ffc_params_generate.o" => [ + "crypto/ffc/ffc_params_generate.c" + ], + "crypto/ffc/libcrypto-lib-ffc_params_validate.o" => [ + "crypto/ffc/ffc_params_validate.c" + ], + "crypto/ffc/libfips-lib-ffc_backend.o" => [ + "crypto/ffc/ffc_backend.c" + ], + "crypto/ffc/libfips-lib-ffc_dh.o" => [ + "crypto/ffc/ffc_dh.c" + ], + "crypto/ffc/libfips-lib-ffc_key_generate.o" => [ + "crypto/ffc/ffc_key_generate.c" + ], + "crypto/ffc/libfips-lib-ffc_key_validate.o" => [ + "crypto/ffc/ffc_key_validate.c" + ], + "crypto/ffc/libfips-lib-ffc_params.o" => [ + "crypto/ffc/ffc_params.c" + ], + "crypto/ffc/libfips-lib-ffc_params_generate.o" => [ + "crypto/ffc/ffc_params_generate.c" + ], + "crypto/ffc/libfips-lib-ffc_params_validate.o" => [ + "crypto/ffc/ffc_params_validate.c" + ], + "crypto/hashtable/libcrypto-lib-hashfunc.o" => [ + "crypto/hashtable/hashfunc.c" + ], + "crypto/hashtable/libcrypto-lib-hashtable.o" => [ + "crypto/hashtable/hashtable.c" + ], + "crypto/hashtable/libfips-lib-hashfunc.o" => [ + "crypto/hashtable/hashfunc.c" + ], + "crypto/hashtable/libfips-lib-hashtable.o" => [ + "crypto/hashtable/hashtable.c" + ], + "crypto/hmac/libcrypto-lib-hmac.o" => [ + "crypto/hmac/hmac.c" + ], + "crypto/hmac/libfips-lib-hmac.o" => [ + "crypto/hmac/hmac.c" + ], + "crypto/hpke/libcrypto-lib-hpke.o" => [ + "crypto/hpke/hpke.c" + ], + "crypto/hpke/libcrypto-lib-hpke_util.o" => [ + "crypto/hpke/hpke_util.c" + ], + "crypto/http/libcrypto-lib-http_client.o" => [ + "crypto/http/http_client.c" + ], + "crypto/http/libcrypto-lib-http_err.o" => [ + "crypto/http/http_err.c" + ], + "crypto/http/libcrypto-lib-http_lib.o" => [ + "crypto/http/http_lib.c" + ], + "crypto/idea/libcrypto-lib-i_cbc.o" => [ + "crypto/idea/i_cbc.c" + ], + "crypto/idea/libcrypto-lib-i_cfb64.o" => [ + "crypto/idea/i_cfb64.c" + ], + "crypto/idea/libcrypto-lib-i_ecb.o" => [ + "crypto/idea/i_ecb.c" + ], + "crypto/idea/libcrypto-lib-i_ofb64.o" => [ + "crypto/idea/i_ofb64.c" + ], + "crypto/idea/libcrypto-lib-i_skey.o" => [ + "crypto/idea/i_skey.c" + ], + "crypto/kdf/libcrypto-lib-kdf_err.o" => [ + "crypto/kdf/kdf_err.c" + ], + "crypto/lhash/libcrypto-lib-lh_stats.o" => [ + "crypto/lhash/lh_stats.c" + ], + "crypto/lhash/libcrypto-lib-lhash.o" => [ + "crypto/lhash/lhash.c" + ], + "crypto/lhash/libfips-lib-lhash.o" => [ + "crypto/lhash/lhash.c" + ], + "crypto/libcrypto-lib-asn1_dsa.o" => [ + "crypto/asn1_dsa.c" + ], + "crypto/libcrypto-lib-bsearch.o" => [ + "crypto/bsearch.c" + ], + "crypto/libcrypto-lib-comp_methods.o" => [ + "crypto/comp_methods.c" + ], + "crypto/libcrypto-lib-context.o" => [ + "crypto/context.c" + ], + "crypto/libcrypto-lib-core_algorithm.o" => [ + "crypto/core_algorithm.c" + ], + "crypto/libcrypto-lib-core_fetch.o" => [ + "crypto/core_fetch.c" + ], + "crypto/libcrypto-lib-core_namemap.o" => [ + "crypto/core_namemap.c" + ], + "crypto/libcrypto-lib-cpt_err.o" => [ + "crypto/cpt_err.c" + ], + "crypto/libcrypto-lib-cpuid.o" => [ + "crypto/cpuid.c" + ], + "crypto/libcrypto-lib-cryptlib.o" => [ + "crypto/cryptlib.c" + ], + "crypto/libcrypto-lib-ctype.o" => [ + "crypto/ctype.c" + ], + "crypto/libcrypto-lib-cversion.o" => [ + "crypto/cversion.c" + ], + "crypto/libcrypto-lib-defaults.o" => [ + "crypto/defaults.c" + ], + "crypto/libcrypto-lib-der_writer.o" => [ + "crypto/der_writer.c" + ], + "crypto/libcrypto-lib-deterministic_nonce.o" => [ + "crypto/deterministic_nonce.c" + ], + "crypto/libcrypto-lib-ebcdic.o" => [ + "crypto/ebcdic.c" + ], + "crypto/libcrypto-lib-ex_data.o" => [ + "crypto/ex_data.c" + ], + "crypto/libcrypto-lib-getenv.o" => [ + "crypto/getenv.c" + ], + "crypto/libcrypto-lib-indicator_core.o" => [ + "crypto/indicator_core.c" + ], + "crypto/libcrypto-lib-info.o" => [ + "crypto/info.c" + ], + "crypto/libcrypto-lib-init.o" => [ + "crypto/init.c" + ], + "crypto/libcrypto-lib-initthread.o" => [ + "crypto/initthread.c" + ], + "crypto/libcrypto-lib-mem.o" => [ + "crypto/mem.c" + ], + "crypto/libcrypto-lib-mem_sec.o" => [ + "crypto/mem_sec.c" + ], + "crypto/libcrypto-lib-o_dir.o" => [ + "crypto/o_dir.c" + ], + "crypto/libcrypto-lib-o_fopen.o" => [ + "crypto/o_fopen.c" + ], + "crypto/libcrypto-lib-o_init.o" => [ + "crypto/o_init.c" + ], + "crypto/libcrypto-lib-o_str.o" => [ + "crypto/o_str.c" + ], + "crypto/libcrypto-lib-o_time.o" => [ + "crypto/o_time.c" + ], + "crypto/libcrypto-lib-packet.o" => [ + "crypto/packet.c" + ], + "crypto/libcrypto-lib-param_build.o" => [ + "crypto/param_build.c" + ], + "crypto/libcrypto-lib-param_build_set.o" => [ + "crypto/param_build_set.c" + ], + "crypto/libcrypto-lib-params.o" => [ + "crypto/params.c" + ], + "crypto/libcrypto-lib-params_dup.o" => [ + "crypto/params_dup.c" + ], + "crypto/libcrypto-lib-params_from_text.o" => [ + "crypto/params_from_text.c" + ], + "crypto/libcrypto-lib-params_idx.o" => [ + "crypto/params_idx.c" + ], + "crypto/libcrypto-lib-passphrase.o" => [ + "crypto/passphrase.c" + ], + "crypto/libcrypto-lib-provider.o" => [ + "crypto/provider.c" + ], + "crypto/libcrypto-lib-provider_child.o" => [ + "crypto/provider_child.c" + ], + "crypto/libcrypto-lib-provider_conf.o" => [ + "crypto/provider_conf.c" + ], + "crypto/libcrypto-lib-provider_core.o" => [ + "crypto/provider_core.c" + ], + "crypto/libcrypto-lib-provider_predefined.o" => [ + "crypto/provider_predefined.c" + ], + "crypto/libcrypto-lib-punycode.o" => [ + "crypto/punycode.c" + ], + "crypto/libcrypto-lib-quic_vlint.o" => [ + "crypto/quic_vlint.c" + ], + "crypto/libcrypto-lib-riscv64cpuid.o" => [ + "crypto/riscv64cpuid.s" + ], + "crypto/libcrypto-lib-riscvcap.o" => [ + "crypto/riscvcap.c" + ], + "crypto/libcrypto-lib-self_test_core.o" => [ + "crypto/self_test_core.c" + ], + "crypto/libcrypto-lib-sleep.o" => [ + "crypto/sleep.c" + ], + "crypto/libcrypto-lib-sparse_array.o" => [ + "crypto/sparse_array.c" + ], + "crypto/libcrypto-lib-ssl_err.o" => [ + "crypto/ssl_err.c" + ], + "crypto/libcrypto-lib-threads_lib.o" => [ + "crypto/threads_lib.c" + ], + "crypto/libcrypto-lib-threads_none.o" => [ + "crypto/threads_none.c" + ], + "crypto/libcrypto-lib-threads_pthread.o" => [ + "crypto/threads_pthread.c" + ], + "crypto/libcrypto-lib-threads_win.o" => [ + "crypto/threads_win.c" + ], + "crypto/libcrypto-lib-time.o" => [ + "crypto/time.c" + ], + "crypto/libcrypto-lib-trace.o" => [ + "crypto/trace.c" + ], + "crypto/libcrypto-lib-uid.o" => [ + "crypto/uid.c" + ], + "crypto/libfips-lib-asn1_dsa.o" => [ + "crypto/asn1_dsa.c" + ], + "crypto/libfips-lib-bsearch.o" => [ + "crypto/bsearch.c" + ], + "crypto/libfips-lib-context.o" => [ + "crypto/context.c" + ], + "crypto/libfips-lib-core_algorithm.o" => [ + "crypto/core_algorithm.c" + ], + "crypto/libfips-lib-core_fetch.o" => [ + "crypto/core_fetch.c" + ], + "crypto/libfips-lib-core_namemap.o" => [ + "crypto/core_namemap.c" + ], + "crypto/libfips-lib-cpuid.o" => [ + "crypto/cpuid.c" + ], + "crypto/libfips-lib-cryptlib.o" => [ + "crypto/cryptlib.c" + ], + "crypto/libfips-lib-ctype.o" => [ + "crypto/ctype.c" + ], + "crypto/libfips-lib-der_writer.o" => [ + "crypto/der_writer.c" + ], + "crypto/libfips-lib-ex_data.o" => [ + "crypto/ex_data.c" + ], + "crypto/libfips-lib-initthread.o" => [ + "crypto/initthread.c" + ], + "crypto/libfips-lib-o_str.o" => [ + "crypto/o_str.c" + ], + "crypto/libfips-lib-packet.o" => [ + "crypto/packet.c" + ], + "crypto/libfips-lib-param_build.o" => [ + "crypto/param_build.c" + ], + "crypto/libfips-lib-param_build_set.o" => [ + "crypto/param_build_set.c" + ], + "crypto/libfips-lib-params.o" => [ + "crypto/params.c" + ], + "crypto/libfips-lib-params_dup.o" => [ + "crypto/params_dup.c" + ], + "crypto/libfips-lib-params_from_text.o" => [ + "crypto/params_from_text.c" + ], + "crypto/libfips-lib-params_idx.o" => [ + "crypto/params_idx.c" + ], + "crypto/libfips-lib-provider_core.o" => [ + "crypto/provider_core.c" + ], + "crypto/libfips-lib-provider_predefined.o" => [ + "crypto/provider_predefined.c" + ], + "crypto/libfips-lib-riscv64cpuid.o" => [ + "crypto/riscv64cpuid.s" + ], + "crypto/libfips-lib-riscvcap.o" => [ + "crypto/riscvcap.c" + ], + "crypto/libfips-lib-self_test_core.o" => [ + "crypto/self_test_core.c" + ], + "crypto/libfips-lib-sparse_array.o" => [ + "crypto/sparse_array.c" + ], + "crypto/libfips-lib-threads_lib.o" => [ + "crypto/threads_lib.c" + ], + "crypto/libfips-lib-threads_none.o" => [ + "crypto/threads_none.c" + ], + "crypto/libfips-lib-threads_pthread.o" => [ + "crypto/threads_pthread.c" + ], + "crypto/libfips-lib-threads_win.o" => [ + "crypto/threads_win.c" + ], + "crypto/libfips-lib-time.o" => [ + "crypto/time.c" + ], + "crypto/md4/libcrypto-lib-md4_dgst.o" => [ + "crypto/md4/md4_dgst.c" + ], + "crypto/md4/libcrypto-lib-md4_one.o" => [ + "crypto/md4/md4_one.c" + ], + "crypto/md5/libcrypto-lib-md5_dgst.o" => [ + "crypto/md5/md5_dgst.c" + ], + "crypto/md5/libcrypto-lib-md5_one.o" => [ + "crypto/md5/md5_one.c" + ], + "crypto/md5/libcrypto-lib-md5_sha1.o" => [ + "crypto/md5/md5_sha1.c" + ], + "crypto/mdc2/libcrypto-lib-mdc2_one.o" => [ + "crypto/mdc2/mdc2_one.c" + ], + "crypto/mdc2/libcrypto-lib-mdc2dgst.o" => [ + "crypto/mdc2/mdc2dgst.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_encoders.o" => [ + "crypto/ml_dsa/ml_dsa_encoders.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_key.o" => [ + "crypto/ml_dsa/ml_dsa_key.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_key_compress.o" => [ + "crypto/ml_dsa/ml_dsa_key_compress.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_matrix.o" => [ + "crypto/ml_dsa/ml_dsa_matrix.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_ntt.o" => [ + "crypto/ml_dsa/ml_dsa_ntt.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_params.o" => [ + "crypto/ml_dsa/ml_dsa_params.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_sample.o" => [ + "crypto/ml_dsa/ml_dsa_sample.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_sign.o" => [ + "crypto/ml_dsa/ml_dsa_sign.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_encoders.o" => [ + "crypto/ml_dsa/ml_dsa_encoders.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_key.o" => [ + "crypto/ml_dsa/ml_dsa_key.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_key_compress.o" => [ + "crypto/ml_dsa/ml_dsa_key_compress.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_matrix.o" => [ + "crypto/ml_dsa/ml_dsa_matrix.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_ntt.o" => [ + "crypto/ml_dsa/ml_dsa_ntt.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_params.o" => [ + "crypto/ml_dsa/ml_dsa_params.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_sample.o" => [ + "crypto/ml_dsa/ml_dsa_sample.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_sign.o" => [ + "crypto/ml_dsa/ml_dsa_sign.c" + ], + "crypto/ml_kem/libcrypto-lib-ml_kem.o" => [ + "crypto/ml_kem/ml_kem.c" + ], + "crypto/ml_kem/libfips-lib-ml_kem.o" => [ + "crypto/ml_kem/ml_kem.c" + ], + "crypto/modes/libcrypto-lib-aes-gcm-riscv64-zvkb-zvkg-zvkned.o" => [ + "crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s" + ], + "crypto/modes/libcrypto-lib-cbc128.o" => [ + "crypto/modes/cbc128.c" + ], + "crypto/modes/libcrypto-lib-ccm128.o" => [ + "crypto/modes/ccm128.c" + ], + "crypto/modes/libcrypto-lib-cfb128.o" => [ + "crypto/modes/cfb128.c" + ], + "crypto/modes/libcrypto-lib-ctr128.o" => [ + "crypto/modes/ctr128.c" + ], + "crypto/modes/libcrypto-lib-cts128.o" => [ + "crypto/modes/cts128.c" + ], + "crypto/modes/libcrypto-lib-gcm128.o" => [ + "crypto/modes/gcm128.c" + ], + "crypto/modes/libcrypto-lib-ghash-riscv64-zvkb-zvbc.o" => [ + "crypto/modes/ghash-riscv64-zvkb-zvbc.s" + ], + "crypto/modes/libcrypto-lib-ghash-riscv64-zvkg.o" => [ + "crypto/modes/ghash-riscv64-zvkg.s" + ], + "crypto/modes/libcrypto-lib-ghash-riscv64.o" => [ + "crypto/modes/ghash-riscv64.s" + ], + "crypto/modes/libcrypto-lib-ocb128.o" => [ + "crypto/modes/ocb128.c" + ], + "crypto/modes/libcrypto-lib-ofb128.o" => [ + "crypto/modes/ofb128.c" + ], + "crypto/modes/libcrypto-lib-siv128.o" => [ + "crypto/modes/siv128.c" + ], + "crypto/modes/libcrypto-lib-wrap128.o" => [ + "crypto/modes/wrap128.c" + ], + "crypto/modes/libcrypto-lib-xts128.o" => [ + "crypto/modes/xts128.c" + ], + "crypto/modes/libcrypto-lib-xts128gb.o" => [ + "crypto/modes/xts128gb.c" + ], + "crypto/modes/libfips-lib-aes-gcm-riscv64-zvkb-zvkg-zvkned.o" => [ + "crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s" + ], + "crypto/modes/libfips-lib-cbc128.o" => [ + "crypto/modes/cbc128.c" + ], + "crypto/modes/libfips-lib-ccm128.o" => [ + "crypto/modes/ccm128.c" + ], + "crypto/modes/libfips-lib-cfb128.o" => [ + "crypto/modes/cfb128.c" + ], + "crypto/modes/libfips-lib-ctr128.o" => [ + "crypto/modes/ctr128.c" + ], + "crypto/modes/libfips-lib-gcm128.o" => [ + "crypto/modes/gcm128.c" + ], + "crypto/modes/libfips-lib-ghash-riscv64-zvkb-zvbc.o" => [ + "crypto/modes/ghash-riscv64-zvkb-zvbc.s" + ], + "crypto/modes/libfips-lib-ghash-riscv64-zvkg.o" => [ + "crypto/modes/ghash-riscv64-zvkg.s" + ], + "crypto/modes/libfips-lib-ghash-riscv64.o" => [ + "crypto/modes/ghash-riscv64.s" + ], + "crypto/modes/libfips-lib-ofb128.o" => [ + "crypto/modes/ofb128.c" + ], + "crypto/modes/libfips-lib-wrap128.o" => [ + "crypto/modes/wrap128.c" + ], + "crypto/modes/libfips-lib-xts128.o" => [ + "crypto/modes/xts128.c" + ], + "crypto/modes/libfips-lib-xts128gb.o" => [ + "crypto/modes/xts128gb.c" + ], + "crypto/objects/libcrypto-lib-o_names.o" => [ + "crypto/objects/o_names.c" + ], + "crypto/objects/libcrypto-lib-obj_dat.o" => [ + "crypto/objects/obj_dat.c" + ], + "crypto/objects/libcrypto-lib-obj_err.o" => [ + "crypto/objects/obj_err.c" + ], + "crypto/objects/libcrypto-lib-obj_lib.o" => [ + "crypto/objects/obj_lib.c" + ], + "crypto/objects/libcrypto-lib-obj_xref.o" => [ + "crypto/objects/obj_xref.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_asn.o" => [ + "crypto/ocsp/ocsp_asn.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_cl.o" => [ + "crypto/ocsp/ocsp_cl.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_err.o" => [ + "crypto/ocsp/ocsp_err.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_ext.o" => [ + "crypto/ocsp/ocsp_ext.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_http.o" => [ + "crypto/ocsp/ocsp_http.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_lib.o" => [ + "crypto/ocsp/ocsp_lib.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_prn.o" => [ + "crypto/ocsp/ocsp_prn.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_srv.o" => [ + "crypto/ocsp/ocsp_srv.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_vfy.o" => [ + "crypto/ocsp/ocsp_vfy.c" + ], + "crypto/ocsp/libcrypto-lib-v3_ocsp.o" => [ + "crypto/ocsp/v3_ocsp.c" + ], + "crypto/pem/libcrypto-lib-pem_all.o" => [ + "crypto/pem/pem_all.c" + ], + "crypto/pem/libcrypto-lib-pem_err.o" => [ + "crypto/pem/pem_err.c" + ], + "crypto/pem/libcrypto-lib-pem_info.o" => [ + "crypto/pem/pem_info.c" + ], + "crypto/pem/libcrypto-lib-pem_lib.o" => [ + "crypto/pem/pem_lib.c" + ], + "crypto/pem/libcrypto-lib-pem_oth.o" => [ + "crypto/pem/pem_oth.c" + ], + "crypto/pem/libcrypto-lib-pem_pk8.o" => [ + "crypto/pem/pem_pk8.c" + ], + "crypto/pem/libcrypto-lib-pem_pkey.o" => [ + "crypto/pem/pem_pkey.c" + ], + "crypto/pem/libcrypto-lib-pem_sign.o" => [ + "crypto/pem/pem_sign.c" + ], + "crypto/pem/libcrypto-lib-pem_x509.o" => [ + "crypto/pem/pem_x509.c" + ], + "crypto/pem/libcrypto-lib-pem_xaux.o" => [ + "crypto/pem/pem_xaux.c" + ], + "crypto/pem/libcrypto-lib-pvkfmt.o" => [ + "crypto/pem/pvkfmt.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_add.o" => [ + "crypto/pkcs12/p12_add.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_asn.o" => [ + "crypto/pkcs12/p12_asn.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_attr.o" => [ + "crypto/pkcs12/p12_attr.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_crpt.o" => [ + "crypto/pkcs12/p12_crpt.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_crt.o" => [ + "crypto/pkcs12/p12_crt.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_decr.o" => [ + "crypto/pkcs12/p12_decr.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_init.o" => [ + "crypto/pkcs12/p12_init.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_key.o" => [ + "crypto/pkcs12/p12_key.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_kiss.o" => [ + "crypto/pkcs12/p12_kiss.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_mutl.o" => [ + "crypto/pkcs12/p12_mutl.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_npas.o" => [ + "crypto/pkcs12/p12_npas.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_p8d.o" => [ + "crypto/pkcs12/p12_p8d.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_p8e.o" => [ + "crypto/pkcs12/p12_p8e.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_sbag.o" => [ + "crypto/pkcs12/p12_sbag.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_utl.o" => [ + "crypto/pkcs12/p12_utl.c" + ], + "crypto/pkcs12/libcrypto-lib-pk12err.o" => [ + "crypto/pkcs12/pk12err.c" + ], + "crypto/pkcs7/libcrypto-lib-bio_pk7.o" => [ + "crypto/pkcs7/bio_pk7.c" + ], + "crypto/pkcs7/libcrypto-lib-pk7_asn1.o" => [ + "crypto/pkcs7/pk7_asn1.c" + ], + "crypto/pkcs7/libcrypto-lib-pk7_attr.o" => [ + "crypto/pkcs7/pk7_attr.c" + ], + "crypto/pkcs7/libcrypto-lib-pk7_doit.o" => [ + "crypto/pkcs7/pk7_doit.c" + ], + "crypto/pkcs7/libcrypto-lib-pk7_lib.o" => [ + "crypto/pkcs7/pk7_lib.c" + ], + "crypto/pkcs7/libcrypto-lib-pk7_mime.o" => [ + "crypto/pkcs7/pk7_mime.c" + ], + "crypto/pkcs7/libcrypto-lib-pk7_smime.o" => [ + "crypto/pkcs7/pk7_smime.c" + ], + "crypto/pkcs7/libcrypto-lib-pkcs7err.o" => [ + "crypto/pkcs7/pkcs7err.c" + ], + "crypto/poly1305/libcrypto-lib-poly1305.o" => [ + "crypto/poly1305/poly1305.c" + ], + "crypto/property/libcrypto-lib-defn_cache.o" => [ + "crypto/property/defn_cache.c" + ], + "crypto/property/libcrypto-lib-property.o" => [ + "crypto/property/property.c" + ], + "crypto/property/libcrypto-lib-property_err.o" => [ + "crypto/property/property_err.c" + ], + "crypto/property/libcrypto-lib-property_parse.o" => [ + "crypto/property/property_parse.c" + ], + "crypto/property/libcrypto-lib-property_query.o" => [ + "crypto/property/property_query.c" + ], + "crypto/property/libcrypto-lib-property_string.o" => [ + "crypto/property/property_string.c" + ], + "crypto/property/libfips-lib-defn_cache.o" => [ + "crypto/property/defn_cache.c" + ], + "crypto/property/libfips-lib-property.o" => [ + "crypto/property/property.c" + ], + "crypto/property/libfips-lib-property_parse.o" => [ + "crypto/property/property_parse.c" + ], + "crypto/property/libfips-lib-property_query.o" => [ + "crypto/property/property_query.c" + ], + "crypto/property/libfips-lib-property_string.o" => [ + "crypto/property/property_string.c" + ], + "crypto/rand/libcrypto-lib-prov_seed.o" => [ + "crypto/rand/prov_seed.c" + ], + "crypto/rand/libcrypto-lib-rand_deprecated.o" => [ + "crypto/rand/rand_deprecated.c" + ], + "crypto/rand/libcrypto-lib-rand_err.o" => [ + "crypto/rand/rand_err.c" + ], + "crypto/rand/libcrypto-lib-rand_lib.o" => [ + "crypto/rand/rand_lib.c" + ], + "crypto/rand/libcrypto-lib-rand_meth.o" => [ + "crypto/rand/rand_meth.c" + ], + "crypto/rand/libcrypto-lib-rand_pool.o" => [ + "crypto/rand/rand_pool.c" + ], + "crypto/rand/libcrypto-lib-rand_uniform.o" => [ + "crypto/rand/rand_uniform.c" + ], + "crypto/rand/libcrypto-lib-randfile.o" => [ + "crypto/rand/randfile.c" + ], + "crypto/rand/libfips-lib-rand_lib.o" => [ + "crypto/rand/rand_lib.c" + ], + "crypto/rc2/libcrypto-lib-rc2_cbc.o" => [ + "crypto/rc2/rc2_cbc.c" + ], + "crypto/rc2/libcrypto-lib-rc2_ecb.o" => [ + "crypto/rc2/rc2_ecb.c" + ], + "crypto/rc2/libcrypto-lib-rc2_skey.o" => [ + "crypto/rc2/rc2_skey.c" + ], + "crypto/rc2/libcrypto-lib-rc2cfb64.o" => [ + "crypto/rc2/rc2cfb64.c" + ], + "crypto/rc2/libcrypto-lib-rc2ofb64.o" => [ + "crypto/rc2/rc2ofb64.c" + ], + "crypto/rc4/libcrypto-lib-rc4_enc.o" => [ + "crypto/rc4/rc4_enc.c" + ], + "crypto/rc4/libcrypto-lib-rc4_skey.o" => [ + "crypto/rc4/rc4_skey.c" + ], + "crypto/ripemd/libcrypto-lib-rmd_dgst.o" => [ + "crypto/ripemd/rmd_dgst.c" + ], + "crypto/ripemd/libcrypto-lib-rmd_one.o" => [ + "crypto/ripemd/rmd_one.c" + ], + "crypto/rsa/libcrypto-lib-rsa_ameth.o" => [ + "crypto/rsa/rsa_ameth.c" + ], + "crypto/rsa/libcrypto-lib-rsa_asn1.o" => [ + "crypto/rsa/rsa_asn1.c" + ], + "crypto/rsa/libcrypto-lib-rsa_backend.o" => [ + "crypto/rsa/rsa_backend.c" + ], + "crypto/rsa/libcrypto-lib-rsa_chk.o" => [ + "crypto/rsa/rsa_chk.c" + ], + "crypto/rsa/libcrypto-lib-rsa_crpt.o" => [ + "crypto/rsa/rsa_crpt.c" + ], + "crypto/rsa/libcrypto-lib-rsa_depr.o" => [ + "crypto/rsa/rsa_depr.c" + ], + "crypto/rsa/libcrypto-lib-rsa_err.o" => [ + "crypto/rsa/rsa_err.c" + ], + "crypto/rsa/libcrypto-lib-rsa_gen.o" => [ + "crypto/rsa/rsa_gen.c" + ], + "crypto/rsa/libcrypto-lib-rsa_lib.o" => [ + "crypto/rsa/rsa_lib.c" + ], + "crypto/rsa/libcrypto-lib-rsa_meth.o" => [ + "crypto/rsa/rsa_meth.c" + ], + "crypto/rsa/libcrypto-lib-rsa_mp.o" => [ + "crypto/rsa/rsa_mp.c" + ], + "crypto/rsa/libcrypto-lib-rsa_mp_names.o" => [ + "crypto/rsa/rsa_mp_names.c" + ], + "crypto/rsa/libcrypto-lib-rsa_none.o" => [ + "crypto/rsa/rsa_none.c" + ], + "crypto/rsa/libcrypto-lib-rsa_oaep.o" => [ + "crypto/rsa/rsa_oaep.c" + ], + "crypto/rsa/libcrypto-lib-rsa_ossl.o" => [ + "crypto/rsa/rsa_ossl.c" + ], + "crypto/rsa/libcrypto-lib-rsa_pk1.o" => [ + "crypto/rsa/rsa_pk1.c" + ], + "crypto/rsa/libcrypto-lib-rsa_pmeth.o" => [ + "crypto/rsa/rsa_pmeth.c" + ], + "crypto/rsa/libcrypto-lib-rsa_prn.o" => [ + "crypto/rsa/rsa_prn.c" + ], + "crypto/rsa/libcrypto-lib-rsa_pss.o" => [ + "crypto/rsa/rsa_pss.c" + ], + "crypto/rsa/libcrypto-lib-rsa_saos.o" => [ + "crypto/rsa/rsa_saos.c" + ], + "crypto/rsa/libcrypto-lib-rsa_schemes.o" => [ + "crypto/rsa/rsa_schemes.c" + ], + "crypto/rsa/libcrypto-lib-rsa_sign.o" => [ + "crypto/rsa/rsa_sign.c" + ], + "crypto/rsa/libcrypto-lib-rsa_sp800_56b_check.o" => [ + "crypto/rsa/rsa_sp800_56b_check.c" + ], + "crypto/rsa/libcrypto-lib-rsa_sp800_56b_gen.o" => [ + "crypto/rsa/rsa_sp800_56b_gen.c" + ], + "crypto/rsa/libcrypto-lib-rsa_x931.o" => [ + "crypto/rsa/rsa_x931.c" + ], + "crypto/rsa/libcrypto-lib-rsa_x931g.o" => [ + "crypto/rsa/rsa_x931g.c" + ], + "crypto/rsa/libfips-lib-rsa_acvp_test_params.o" => [ + "crypto/rsa/rsa_acvp_test_params.c" + ], + "crypto/rsa/libfips-lib-rsa_backend.o" => [ + "crypto/rsa/rsa_backend.c" + ], + "crypto/rsa/libfips-lib-rsa_chk.o" => [ + "crypto/rsa/rsa_chk.c" + ], + "crypto/rsa/libfips-lib-rsa_crpt.o" => [ + "crypto/rsa/rsa_crpt.c" + ], + "crypto/rsa/libfips-lib-rsa_gen.o" => [ + "crypto/rsa/rsa_gen.c" + ], + "crypto/rsa/libfips-lib-rsa_lib.o" => [ + "crypto/rsa/rsa_lib.c" + ], + "crypto/rsa/libfips-lib-rsa_mp_names.o" => [ + "crypto/rsa/rsa_mp_names.c" + ], + "crypto/rsa/libfips-lib-rsa_none.o" => [ + "crypto/rsa/rsa_none.c" + ], + "crypto/rsa/libfips-lib-rsa_oaep.o" => [ + "crypto/rsa/rsa_oaep.c" + ], + "crypto/rsa/libfips-lib-rsa_ossl.o" => [ + "crypto/rsa/rsa_ossl.c" + ], + "crypto/rsa/libfips-lib-rsa_pk1.o" => [ + "crypto/rsa/rsa_pk1.c" + ], + "crypto/rsa/libfips-lib-rsa_pss.o" => [ + "crypto/rsa/rsa_pss.c" + ], + "crypto/rsa/libfips-lib-rsa_schemes.o" => [ + "crypto/rsa/rsa_schemes.c" + ], + "crypto/rsa/libfips-lib-rsa_sign.o" => [ + "crypto/rsa/rsa_sign.c" + ], + "crypto/rsa/libfips-lib-rsa_sp800_56b_check.o" => [ + "crypto/rsa/rsa_sp800_56b_check.c" + ], + "crypto/rsa/libfips-lib-rsa_sp800_56b_gen.o" => [ + "crypto/rsa/rsa_sp800_56b_gen.c" + ], + "crypto/rsa/libfips-lib-rsa_x931.o" => [ + "crypto/rsa/rsa_x931.c" + ], + "crypto/seed/libcrypto-lib-seed.o" => [ + "crypto/seed/seed.c" + ], + "crypto/seed/libcrypto-lib-seed_cbc.o" => [ + "crypto/seed/seed_cbc.c" + ], + "crypto/seed/libcrypto-lib-seed_cfb.o" => [ + "crypto/seed/seed_cfb.c" + ], + "crypto/seed/libcrypto-lib-seed_ecb.o" => [ + "crypto/seed/seed_ecb.c" + ], + "crypto/seed/libcrypto-lib-seed_ofb.o" => [ + "crypto/seed/seed_ofb.c" + ], + "crypto/sha/libcrypto-lib-keccak1600.o" => [ + "crypto/sha/keccak1600.c" + ], + "crypto/sha/libcrypto-lib-sha1_one.o" => [ + "crypto/sha/sha1_one.c" + ], + "crypto/sha/libcrypto-lib-sha1dgst.o" => [ + "crypto/sha/sha1dgst.c" + ], + "crypto/sha/libcrypto-lib-sha256-riscv64-zvkb-zvknha_or_zvknhb.o" => [ + "crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S" + ], + "crypto/sha/libcrypto-lib-sha256.o" => [ + "crypto/sha/sha256.c" + ], + "crypto/sha/libcrypto-lib-sha3.o" => [ + "crypto/sha/sha3.c" + ], + "crypto/sha/libcrypto-lib-sha512-riscv64-zvkb-zvknhb.o" => [ + "crypto/sha/sha512-riscv64-zvkb-zvknhb.S" + ], + "crypto/sha/libcrypto-lib-sha512.o" => [ + "crypto/sha/sha512.c" + ], + "crypto/sha/libcrypto-lib-sha_riscv.o" => [ + "crypto/sha/sha_riscv.c" + ], + "crypto/sha/libfips-lib-keccak1600.o" => [ + "crypto/sha/keccak1600.c" + ], + "crypto/sha/libfips-lib-sha1dgst.o" => [ + "crypto/sha/sha1dgst.c" + ], + "crypto/sha/libfips-lib-sha256-riscv64-zvkb-zvknha_or_zvknhb.o" => [ + "crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S" + ], + "crypto/sha/libfips-lib-sha256.o" => [ + "crypto/sha/sha256.c" + ], + "crypto/sha/libfips-lib-sha3.o" => [ + "crypto/sha/sha3.c" + ], + "crypto/sha/libfips-lib-sha512-riscv64-zvkb-zvknhb.o" => [ + "crypto/sha/sha512-riscv64-zvkb-zvknhb.S" + ], + "crypto/sha/libfips-lib-sha512.o" => [ + "crypto/sha/sha512.c" + ], + "crypto/sha/libfips-lib-sha_riscv.o" => [ + "crypto/sha/sha_riscv.c" + ], + "crypto/siphash/libcrypto-lib-siphash.o" => [ + "crypto/siphash/siphash.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_adrs.o" => [ + "crypto/slh_dsa/slh_adrs.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_dsa.o" => [ + "crypto/slh_dsa/slh_dsa.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_dsa_hash_ctx.o" => [ + "crypto/slh_dsa/slh_dsa_hash_ctx.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_dsa_key.o" => [ + "crypto/slh_dsa/slh_dsa_key.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_fors.o" => [ + "crypto/slh_dsa/slh_fors.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_hash.o" => [ + "crypto/slh_dsa/slh_hash.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_hypertree.o" => [ + "crypto/slh_dsa/slh_hypertree.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_params.o" => [ + "crypto/slh_dsa/slh_params.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_wots.o" => [ + "crypto/slh_dsa/slh_wots.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_xmss.o" => [ + "crypto/slh_dsa/slh_xmss.c" + ], + "crypto/slh_dsa/libfips-lib-slh_adrs.o" => [ + "crypto/slh_dsa/slh_adrs.c" + ], + "crypto/slh_dsa/libfips-lib-slh_dsa.o" => [ + "crypto/slh_dsa/slh_dsa.c" + ], + "crypto/slh_dsa/libfips-lib-slh_dsa_hash_ctx.o" => [ + "crypto/slh_dsa/slh_dsa_hash_ctx.c" + ], + "crypto/slh_dsa/libfips-lib-slh_dsa_key.o" => [ + "crypto/slh_dsa/slh_dsa_key.c" + ], + "crypto/slh_dsa/libfips-lib-slh_fors.o" => [ + "crypto/slh_dsa/slh_fors.c" + ], + "crypto/slh_dsa/libfips-lib-slh_hash.o" => [ + "crypto/slh_dsa/slh_hash.c" + ], + "crypto/slh_dsa/libfips-lib-slh_hypertree.o" => [ + "crypto/slh_dsa/slh_hypertree.c" + ], + "crypto/slh_dsa/libfips-lib-slh_params.o" => [ + "crypto/slh_dsa/slh_params.c" + ], + "crypto/slh_dsa/libfips-lib-slh_wots.o" => [ + "crypto/slh_dsa/slh_wots.c" + ], + "crypto/slh_dsa/libfips-lib-slh_xmss.o" => [ + "crypto/slh_dsa/slh_xmss.c" + ], + "crypto/sm2/libcrypto-lib-sm2_crypt.o" => [ + "crypto/sm2/sm2_crypt.c" + ], + "crypto/sm2/libcrypto-lib-sm2_err.o" => [ + "crypto/sm2/sm2_err.c" + ], + "crypto/sm2/libcrypto-lib-sm2_key.o" => [ + "crypto/sm2/sm2_key.c" + ], + "crypto/sm2/libcrypto-lib-sm2_sign.o" => [ + "crypto/sm2/sm2_sign.c" + ], + "crypto/sm3/libcrypto-lib-legacy_sm3.o" => [ + "crypto/sm3/legacy_sm3.c" + ], + "crypto/sm3/libcrypto-lib-sm3-riscv64-zvksh.o" => [ + "crypto/sm3/sm3-riscv64-zvksh.S" + ], + "crypto/sm3/libcrypto-lib-sm3.o" => [ + "crypto/sm3/sm3.c" + ], + "crypto/sm3/libcrypto-lib-sm3_riscv.o" => [ + "crypto/sm3/sm3_riscv.c" + ], + "crypto/sm4/libcrypto-lib-sm4-riscv64-zvksed.o" => [ + "crypto/sm4/sm4-riscv64-zvksed.s" + ], + "crypto/sm4/libcrypto-lib-sm4.o" => [ + "crypto/sm4/sm4.c" + ], + "crypto/srp/libcrypto-lib-srp_lib.o" => [ + "crypto/srp/srp_lib.c" + ], + "crypto/srp/libcrypto-lib-srp_vfy.o" => [ + "crypto/srp/srp_vfy.c" + ], + "crypto/stack/libcrypto-lib-stack.o" => [ + "crypto/stack/stack.c" + ], + "crypto/stack/libfips-lib-stack.o" => [ + "crypto/stack/stack.c" + ], + "crypto/store/libcrypto-lib-store_err.o" => [ + "crypto/store/store_err.c" + ], + "crypto/store/libcrypto-lib-store_init.o" => [ + "crypto/store/store_init.c" + ], + "crypto/store/libcrypto-lib-store_lib.o" => [ + "crypto/store/store_lib.c" + ], + "crypto/store/libcrypto-lib-store_meth.o" => [ + "crypto/store/store_meth.c" + ], + "crypto/store/libcrypto-lib-store_register.o" => [ + "crypto/store/store_register.c" + ], + "crypto/store/libcrypto-lib-store_result.o" => [ + "crypto/store/store_result.c" + ], + "crypto/store/libcrypto-lib-store_strings.o" => [ + "crypto/store/store_strings.c" + ], + "crypto/thread/arch/libcrypto-lib-thread_none.o" => [ + "crypto/thread/arch/thread_none.c" + ], + "crypto/thread/arch/libcrypto-lib-thread_posix.o" => [ + "crypto/thread/arch/thread_posix.c" + ], + "crypto/thread/arch/libcrypto-lib-thread_win.o" => [ + "crypto/thread/arch/thread_win.c" + ], + "crypto/thread/arch/libfips-lib-thread_none.o" => [ + "crypto/thread/arch/thread_none.c" + ], + "crypto/thread/arch/libfips-lib-thread_posix.o" => [ + "crypto/thread/arch/thread_posix.c" + ], + "crypto/thread/arch/libfips-lib-thread_win.o" => [ + "crypto/thread/arch/thread_win.c" + ], + "crypto/thread/libcrypto-lib-api.o" => [ + "crypto/thread/api.c" + ], + "crypto/thread/libcrypto-lib-arch.o" => [ + "crypto/thread/arch.c" + ], + "crypto/thread/libcrypto-lib-internal.o" => [ + "crypto/thread/internal.c" + ], + "crypto/thread/libfips-lib-api.o" => [ + "crypto/thread/api.c" + ], + "crypto/thread/libfips-lib-arch.o" => [ + "crypto/thread/arch.c" + ], + "crypto/thread/libfips-lib-internal.o" => [ + "crypto/thread/internal.c" + ], + "crypto/ts/libcrypto-lib-ts_asn1.o" => [ + "crypto/ts/ts_asn1.c" + ], + "crypto/ts/libcrypto-lib-ts_conf.o" => [ + "crypto/ts/ts_conf.c" + ], + "crypto/ts/libcrypto-lib-ts_err.o" => [ + "crypto/ts/ts_err.c" + ], + "crypto/ts/libcrypto-lib-ts_lib.o" => [ + "crypto/ts/ts_lib.c" + ], + "crypto/ts/libcrypto-lib-ts_req_print.o" => [ + "crypto/ts/ts_req_print.c" + ], + "crypto/ts/libcrypto-lib-ts_req_utils.o" => [ + "crypto/ts/ts_req_utils.c" + ], + "crypto/ts/libcrypto-lib-ts_rsp_print.o" => [ + "crypto/ts/ts_rsp_print.c" + ], + "crypto/ts/libcrypto-lib-ts_rsp_sign.o" => [ + "crypto/ts/ts_rsp_sign.c" + ], + "crypto/ts/libcrypto-lib-ts_rsp_utils.o" => [ + "crypto/ts/ts_rsp_utils.c" + ], + "crypto/ts/libcrypto-lib-ts_rsp_verify.o" => [ + "crypto/ts/ts_rsp_verify.c" + ], + "crypto/ts/libcrypto-lib-ts_verify_ctx.o" => [ + "crypto/ts/ts_verify_ctx.c" + ], + "crypto/txt_db/libcrypto-lib-txt_db.o" => [ + "crypto/txt_db/txt_db.c" + ], + "crypto/ui/libcrypto-lib-ui_err.o" => [ + "crypto/ui/ui_err.c" + ], + "crypto/ui/libcrypto-lib-ui_lib.o" => [ + "crypto/ui/ui_lib.c" + ], + "crypto/ui/libcrypto-lib-ui_null.o" => [ + "crypto/ui/ui_null.c" + ], + "crypto/ui/libcrypto-lib-ui_openssl.o" => [ + "crypto/ui/ui_openssl.c" + ], + "crypto/ui/libcrypto-lib-ui_util.o" => [ + "crypto/ui/ui_util.c" + ], + "crypto/whrlpool/libcrypto-lib-wp_block.o" => [ + "crypto/whrlpool/wp_block.c" + ], + "crypto/whrlpool/libcrypto-lib-wp_dgst.o" => [ + "crypto/whrlpool/wp_dgst.c" + ], + "crypto/x509/libcrypto-lib-by_dir.o" => [ + "crypto/x509/by_dir.c" + ], + "crypto/x509/libcrypto-lib-by_file.o" => [ + "crypto/x509/by_file.c" + ], + "crypto/x509/libcrypto-lib-by_store.o" => [ + "crypto/x509/by_store.c" + ], + "crypto/x509/libcrypto-lib-pcy_cache.o" => [ + "crypto/x509/pcy_cache.c" + ], + "crypto/x509/libcrypto-lib-pcy_data.o" => [ + "crypto/x509/pcy_data.c" + ], + "crypto/x509/libcrypto-lib-pcy_lib.o" => [ + "crypto/x509/pcy_lib.c" + ], + "crypto/x509/libcrypto-lib-pcy_map.o" => [ + "crypto/x509/pcy_map.c" + ], + "crypto/x509/libcrypto-lib-pcy_node.o" => [ + "crypto/x509/pcy_node.c" + ], + "crypto/x509/libcrypto-lib-pcy_tree.o" => [ + "crypto/x509/pcy_tree.c" + ], + "crypto/x509/libcrypto-lib-t_acert.o" => [ + "crypto/x509/t_acert.c" + ], + "crypto/x509/libcrypto-lib-t_crl.o" => [ + "crypto/x509/t_crl.c" + ], + "crypto/x509/libcrypto-lib-t_req.o" => [ + "crypto/x509/t_req.c" + ], + "crypto/x509/libcrypto-lib-t_x509.o" => [ + "crypto/x509/t_x509.c" + ], + "crypto/x509/libcrypto-lib-v3_aaa.o" => [ + "crypto/x509/v3_aaa.c" + ], + "crypto/x509/libcrypto-lib-v3_ac_tgt.o" => [ + "crypto/x509/v3_ac_tgt.c" + ], + "crypto/x509/libcrypto-lib-v3_addr.o" => [ + "crypto/x509/v3_addr.c" + ], + "crypto/x509/libcrypto-lib-v3_admis.o" => [ + "crypto/x509/v3_admis.c" + ], + "crypto/x509/libcrypto-lib-v3_akeya.o" => [ + "crypto/x509/v3_akeya.c" + ], + "crypto/x509/libcrypto-lib-v3_akid.o" => [ + "crypto/x509/v3_akid.c" + ], + "crypto/x509/libcrypto-lib-v3_asid.o" => [ + "crypto/x509/v3_asid.c" + ], + "crypto/x509/libcrypto-lib-v3_attrdesc.o" => [ + "crypto/x509/v3_attrdesc.c" + ], + "crypto/x509/libcrypto-lib-v3_attrmap.o" => [ + "crypto/x509/v3_attrmap.c" + ], + "crypto/x509/libcrypto-lib-v3_audit_id.o" => [ + "crypto/x509/v3_audit_id.c" + ], + "crypto/x509/libcrypto-lib-v3_authattid.o" => [ + "crypto/x509/v3_authattid.c" + ], + "crypto/x509/libcrypto-lib-v3_battcons.o" => [ + "crypto/x509/v3_battcons.c" + ], + "crypto/x509/libcrypto-lib-v3_bcons.o" => [ + "crypto/x509/v3_bcons.c" + ], + "crypto/x509/libcrypto-lib-v3_bitst.o" => [ + "crypto/x509/v3_bitst.c" + ], + "crypto/x509/libcrypto-lib-v3_conf.o" => [ + "crypto/x509/v3_conf.c" + ], + "crypto/x509/libcrypto-lib-v3_cpols.o" => [ + "crypto/x509/v3_cpols.c" + ], + "crypto/x509/libcrypto-lib-v3_crld.o" => [ + "crypto/x509/v3_crld.c" + ], + "crypto/x509/libcrypto-lib-v3_enum.o" => [ + "crypto/x509/v3_enum.c" + ], + "crypto/x509/libcrypto-lib-v3_extku.o" => [ + "crypto/x509/v3_extku.c" + ], + "crypto/x509/libcrypto-lib-v3_genn.o" => [ + "crypto/x509/v3_genn.c" + ], + "crypto/x509/libcrypto-lib-v3_group_ac.o" => [ + "crypto/x509/v3_group_ac.c" + ], + "crypto/x509/libcrypto-lib-v3_ia5.o" => [ + "crypto/x509/v3_ia5.c" + ], + "crypto/x509/libcrypto-lib-v3_ind_iss.o" => [ + "crypto/x509/v3_ind_iss.c" + ], + "crypto/x509/libcrypto-lib-v3_info.o" => [ + "crypto/x509/v3_info.c" + ], + "crypto/x509/libcrypto-lib-v3_int.o" => [ + "crypto/x509/v3_int.c" + ], + "crypto/x509/libcrypto-lib-v3_iobo.o" => [ + "crypto/x509/v3_iobo.c" + ], + "crypto/x509/libcrypto-lib-v3_ist.o" => [ + "crypto/x509/v3_ist.c" + ], + "crypto/x509/libcrypto-lib-v3_lib.o" => [ + "crypto/x509/v3_lib.c" + ], + "crypto/x509/libcrypto-lib-v3_ncons.o" => [ + "crypto/x509/v3_ncons.c" + ], + "crypto/x509/libcrypto-lib-v3_no_ass.o" => [ + "crypto/x509/v3_no_ass.c" + ], + "crypto/x509/libcrypto-lib-v3_no_rev_avail.o" => [ + "crypto/x509/v3_no_rev_avail.c" + ], + "crypto/x509/libcrypto-lib-v3_pci.o" => [ + "crypto/x509/v3_pci.c" + ], + "crypto/x509/libcrypto-lib-v3_pcia.o" => [ + "crypto/x509/v3_pcia.c" + ], + "crypto/x509/libcrypto-lib-v3_pcons.o" => [ + "crypto/x509/v3_pcons.c" + ], + "crypto/x509/libcrypto-lib-v3_pku.o" => [ + "crypto/x509/v3_pku.c" + ], + "crypto/x509/libcrypto-lib-v3_pmaps.o" => [ + "crypto/x509/v3_pmaps.c" + ], + "crypto/x509/libcrypto-lib-v3_prn.o" => [ + "crypto/x509/v3_prn.c" + ], + "crypto/x509/libcrypto-lib-v3_purp.o" => [ + "crypto/x509/v3_purp.c" + ], + "crypto/x509/libcrypto-lib-v3_rolespec.o" => [ + "crypto/x509/v3_rolespec.c" + ], + "crypto/x509/libcrypto-lib-v3_san.o" => [ + "crypto/x509/v3_san.c" + ], + "crypto/x509/libcrypto-lib-v3_sda.o" => [ + "crypto/x509/v3_sda.c" + ], + "crypto/x509/libcrypto-lib-v3_single_use.o" => [ + "crypto/x509/v3_single_use.c" + ], + "crypto/x509/libcrypto-lib-v3_skid.o" => [ + "crypto/x509/v3_skid.c" + ], + "crypto/x509/libcrypto-lib-v3_soa_id.o" => [ + "crypto/x509/v3_soa_id.c" + ], + "crypto/x509/libcrypto-lib-v3_sxnet.o" => [ + "crypto/x509/v3_sxnet.c" + ], + "crypto/x509/libcrypto-lib-v3_timespec.o" => [ + "crypto/x509/v3_timespec.c" + ], + "crypto/x509/libcrypto-lib-v3_tlsf.o" => [ + "crypto/x509/v3_tlsf.c" + ], + "crypto/x509/libcrypto-lib-v3_usernotice.o" => [ + "crypto/x509/v3_usernotice.c" + ], + "crypto/x509/libcrypto-lib-v3_utf8.o" => [ + "crypto/x509/v3_utf8.c" + ], + "crypto/x509/libcrypto-lib-v3_utl.o" => [ + "crypto/x509/v3_utl.c" + ], + "crypto/x509/libcrypto-lib-v3err.o" => [ + "crypto/x509/v3err.c" + ], + "crypto/x509/libcrypto-lib-x509_acert.o" => [ + "crypto/x509/x509_acert.c" + ], + "crypto/x509/libcrypto-lib-x509_att.o" => [ + "crypto/x509/x509_att.c" + ], + "crypto/x509/libcrypto-lib-x509_cmp.o" => [ + "crypto/x509/x509_cmp.c" + ], + "crypto/x509/libcrypto-lib-x509_d2.o" => [ + "crypto/x509/x509_d2.c" + ], + "crypto/x509/libcrypto-lib-x509_def.o" => [ + "crypto/x509/x509_def.c" + ], + "crypto/x509/libcrypto-lib-x509_err.o" => [ + "crypto/x509/x509_err.c" + ], + "crypto/x509/libcrypto-lib-x509_ext.o" => [ + "crypto/x509/x509_ext.c" + ], + "crypto/x509/libcrypto-lib-x509_lu.o" => [ + "crypto/x509/x509_lu.c" + ], + "crypto/x509/libcrypto-lib-x509_meth.o" => [ + "crypto/x509/x509_meth.c" + ], + "crypto/x509/libcrypto-lib-x509_obj.o" => [ + "crypto/x509/x509_obj.c" + ], + "crypto/x509/libcrypto-lib-x509_r2x.o" => [ + "crypto/x509/x509_r2x.c" + ], + "crypto/x509/libcrypto-lib-x509_req.o" => [ + "crypto/x509/x509_req.c" + ], + "crypto/x509/libcrypto-lib-x509_set.o" => [ + "crypto/x509/x509_set.c" + ], + "crypto/x509/libcrypto-lib-x509_trust.o" => [ + "crypto/x509/x509_trust.c" + ], + "crypto/x509/libcrypto-lib-x509_txt.o" => [ + "crypto/x509/x509_txt.c" + ], + "crypto/x509/libcrypto-lib-x509_v3.o" => [ + "crypto/x509/x509_v3.c" + ], + "crypto/x509/libcrypto-lib-x509_vfy.o" => [ + "crypto/x509/x509_vfy.c" + ], + "crypto/x509/libcrypto-lib-x509_vpm.o" => [ + "crypto/x509/x509_vpm.c" + ], + "crypto/x509/libcrypto-lib-x509aset.o" => [ + "crypto/x509/x509aset.c" + ], + "crypto/x509/libcrypto-lib-x509cset.o" => [ + "crypto/x509/x509cset.c" + ], + "crypto/x509/libcrypto-lib-x509name.o" => [ + "crypto/x509/x509name.c" + ], + "crypto/x509/libcrypto-lib-x509rset.o" => [ + "crypto/x509/x509rset.c" + ], + "crypto/x509/libcrypto-lib-x509spki.o" => [ + "crypto/x509/x509spki.c" + ], + "crypto/x509/libcrypto-lib-x509type.o" => [ + "crypto/x509/x509type.c" + ], + "crypto/x509/libcrypto-lib-x_all.o" => [ + "crypto/x509/x_all.c" + ], + "crypto/x509/libcrypto-lib-x_attrib.o" => [ + "crypto/x509/x_attrib.c" + ], + "crypto/x509/libcrypto-lib-x_crl.o" => [ + "crypto/x509/x_crl.c" + ], + "crypto/x509/libcrypto-lib-x_exten.o" => [ + "crypto/x509/x_exten.c" + ], + "crypto/x509/libcrypto-lib-x_ietfatt.o" => [ + "crypto/x509/x_ietfatt.c" + ], + "crypto/x509/libcrypto-lib-x_name.o" => [ + "crypto/x509/x_name.c" + ], + "crypto/x509/libcrypto-lib-x_pubkey.o" => [ + "crypto/x509/x_pubkey.c" + ], + "crypto/x509/libcrypto-lib-x_req.o" => [ + "crypto/x509/x_req.c" + ], + "crypto/x509/libcrypto-lib-x_x509.o" => [ + "crypto/x509/x_x509.c" + ], + "crypto/x509/libcrypto-lib-x_x509a.o" => [ + "crypto/x509/x_x509a.c" + ], + "engines/libcrypto-lib-e_capi.o" => [ + "engines/e_capi.c" + ], + "engines/libcrypto-lib-e_padlock.o" => [ + "engines/e_padlock.c" + ], + "libcrypto" => [ + "crypto/aes/libcrypto-lib-aes-riscv64-zkn.o", + "crypto/aes/libcrypto-lib-aes-riscv64-zvbb-zvkg-zvkned.o", + "crypto/aes/libcrypto-lib-aes-riscv64-zvkb-zvkned.o", + "crypto/aes/libcrypto-lib-aes-riscv64-zvkned.o", + "crypto/aes/libcrypto-lib-aes-riscv64.o", + "crypto/aes/libcrypto-lib-aes_cbc.o", + "crypto/aes/libcrypto-lib-aes_cfb.o", + "crypto/aes/libcrypto-lib-aes_ecb.o", + "crypto/aes/libcrypto-lib-aes_ige.o", + "crypto/aes/libcrypto-lib-aes_misc.o", + "crypto/aes/libcrypto-lib-aes_ofb.o", + "crypto/aes/libcrypto-lib-aes_wrap.o", + "crypto/aria/libcrypto-lib-aria.o", + "crypto/asn1/libcrypto-lib-a_bitstr.o", + "crypto/asn1/libcrypto-lib-a_d2i_fp.o", + "crypto/asn1/libcrypto-lib-a_digest.o", + "crypto/asn1/libcrypto-lib-a_dup.o", + "crypto/asn1/libcrypto-lib-a_gentm.o", + "crypto/asn1/libcrypto-lib-a_i2d_fp.o", + "crypto/asn1/libcrypto-lib-a_int.o", + "crypto/asn1/libcrypto-lib-a_mbstr.o", + "crypto/asn1/libcrypto-lib-a_object.o", + "crypto/asn1/libcrypto-lib-a_octet.o", + "crypto/asn1/libcrypto-lib-a_print.o", + "crypto/asn1/libcrypto-lib-a_sign.o", + "crypto/asn1/libcrypto-lib-a_strex.o", + "crypto/asn1/libcrypto-lib-a_strnid.o", + "crypto/asn1/libcrypto-lib-a_time.o", + "crypto/asn1/libcrypto-lib-a_type.o", + "crypto/asn1/libcrypto-lib-a_utctm.o", + "crypto/asn1/libcrypto-lib-a_utf8.o", + "crypto/asn1/libcrypto-lib-a_verify.o", + "crypto/asn1/libcrypto-lib-ameth_lib.o", + "crypto/asn1/libcrypto-lib-asn1_err.o", + "crypto/asn1/libcrypto-lib-asn1_gen.o", + "crypto/asn1/libcrypto-lib-asn1_item_list.o", + "crypto/asn1/libcrypto-lib-asn1_lib.o", + "crypto/asn1/libcrypto-lib-asn1_parse.o", + "crypto/asn1/libcrypto-lib-asn_mime.o", + "crypto/asn1/libcrypto-lib-asn_moid.o", + "crypto/asn1/libcrypto-lib-asn_mstbl.o", + "crypto/asn1/libcrypto-lib-asn_pack.o", + "crypto/asn1/libcrypto-lib-bio_asn1.o", + "crypto/asn1/libcrypto-lib-bio_ndef.o", + "crypto/asn1/libcrypto-lib-d2i_param.o", + "crypto/asn1/libcrypto-lib-d2i_pr.o", + "crypto/asn1/libcrypto-lib-d2i_pu.o", + "crypto/asn1/libcrypto-lib-evp_asn1.o", + "crypto/asn1/libcrypto-lib-f_int.o", + "crypto/asn1/libcrypto-lib-f_string.o", + "crypto/asn1/libcrypto-lib-i2d_evp.o", + "crypto/asn1/libcrypto-lib-n_pkey.o", + "crypto/asn1/libcrypto-lib-nsseq.o", + "crypto/asn1/libcrypto-lib-p5_pbe.o", + "crypto/asn1/libcrypto-lib-p5_pbev2.o", + "crypto/asn1/libcrypto-lib-p5_scrypt.o", + "crypto/asn1/libcrypto-lib-p8_pkey.o", + "crypto/asn1/libcrypto-lib-t_bitst.o", + "crypto/asn1/libcrypto-lib-t_pkey.o", + "crypto/asn1/libcrypto-lib-t_spki.o", + "crypto/asn1/libcrypto-lib-tasn_dec.o", + "crypto/asn1/libcrypto-lib-tasn_enc.o", + "crypto/asn1/libcrypto-lib-tasn_fre.o", + "crypto/asn1/libcrypto-lib-tasn_new.o", + "crypto/asn1/libcrypto-lib-tasn_prn.o", + "crypto/asn1/libcrypto-lib-tasn_scn.o", + "crypto/asn1/libcrypto-lib-tasn_typ.o", + "crypto/asn1/libcrypto-lib-tasn_utl.o", + "crypto/asn1/libcrypto-lib-x_algor.o", + "crypto/asn1/libcrypto-lib-x_bignum.o", + "crypto/asn1/libcrypto-lib-x_info.o", + "crypto/asn1/libcrypto-lib-x_int64.o", + "crypto/asn1/libcrypto-lib-x_long.o", + "crypto/asn1/libcrypto-lib-x_pkey.o", + "crypto/asn1/libcrypto-lib-x_sig.o", + "crypto/asn1/libcrypto-lib-x_spki.o", + "crypto/asn1/libcrypto-lib-x_val.o", + "crypto/async/arch/libcrypto-lib-async_null.o", + "crypto/async/arch/libcrypto-lib-async_posix.o", + "crypto/async/arch/libcrypto-lib-async_win.o", + "crypto/async/libcrypto-lib-async.o", + "crypto/async/libcrypto-lib-async_err.o", + "crypto/async/libcrypto-lib-async_wait.o", + "crypto/bf/libcrypto-lib-bf_cfb64.o", + "crypto/bf/libcrypto-lib-bf_ecb.o", + "crypto/bf/libcrypto-lib-bf_enc.o", + "crypto/bf/libcrypto-lib-bf_ofb64.o", + "crypto/bf/libcrypto-lib-bf_skey.o", + "crypto/bio/libcrypto-lib-bf_buff.o", + "crypto/bio/libcrypto-lib-bf_lbuf.o", + "crypto/bio/libcrypto-lib-bf_nbio.o", + "crypto/bio/libcrypto-lib-bf_null.o", + "crypto/bio/libcrypto-lib-bf_prefix.o", + "crypto/bio/libcrypto-lib-bf_readbuff.o", + "crypto/bio/libcrypto-lib-bio_addr.o", + "crypto/bio/libcrypto-lib-bio_cb.o", + "crypto/bio/libcrypto-lib-bio_dump.o", + "crypto/bio/libcrypto-lib-bio_err.o", + "crypto/bio/libcrypto-lib-bio_lib.o", + "crypto/bio/libcrypto-lib-bio_meth.o", + "crypto/bio/libcrypto-lib-bio_print.o", + "crypto/bio/libcrypto-lib-bio_sock.o", + "crypto/bio/libcrypto-lib-bio_sock2.o", + "crypto/bio/libcrypto-lib-bss_acpt.o", + "crypto/bio/libcrypto-lib-bss_bio.o", + "crypto/bio/libcrypto-lib-bss_conn.o", + "crypto/bio/libcrypto-lib-bss_core.o", + "crypto/bio/libcrypto-lib-bss_dgram.o", + "crypto/bio/libcrypto-lib-bss_dgram_pair.o", + "crypto/bio/libcrypto-lib-bss_fd.o", + "crypto/bio/libcrypto-lib-bss_file.o", + "crypto/bio/libcrypto-lib-bss_log.o", + "crypto/bio/libcrypto-lib-bss_mem.o", + "crypto/bio/libcrypto-lib-bss_null.o", + "crypto/bio/libcrypto-lib-bss_sock.o", + "crypto/bio/libcrypto-lib-ossl_core_bio.o", + "crypto/bn/libcrypto-lib-bn_add.o", + "crypto/bn/libcrypto-lib-bn_asm.o", + "crypto/bn/libcrypto-lib-bn_blind.o", + "crypto/bn/libcrypto-lib-bn_const.o", + "crypto/bn/libcrypto-lib-bn_conv.o", + "crypto/bn/libcrypto-lib-bn_ctx.o", + "crypto/bn/libcrypto-lib-bn_depr.o", + "crypto/bn/libcrypto-lib-bn_dh.o", + "crypto/bn/libcrypto-lib-bn_div.o", + "crypto/bn/libcrypto-lib-bn_err.o", + "crypto/bn/libcrypto-lib-bn_exp.o", + "crypto/bn/libcrypto-lib-bn_exp2.o", + "crypto/bn/libcrypto-lib-bn_gcd.o", + "crypto/bn/libcrypto-lib-bn_gf2m.o", + "crypto/bn/libcrypto-lib-bn_intern.o", + "crypto/bn/libcrypto-lib-bn_kron.o", + "crypto/bn/libcrypto-lib-bn_lib.o", + "crypto/bn/libcrypto-lib-bn_mod.o", + "crypto/bn/libcrypto-lib-bn_mont.o", + "crypto/bn/libcrypto-lib-bn_mpi.o", + "crypto/bn/libcrypto-lib-bn_mul.o", + "crypto/bn/libcrypto-lib-bn_nist.o", + "crypto/bn/libcrypto-lib-bn_prime.o", + "crypto/bn/libcrypto-lib-bn_print.o", + "crypto/bn/libcrypto-lib-bn_rand.o", + "crypto/bn/libcrypto-lib-bn_recp.o", + "crypto/bn/libcrypto-lib-bn_rsa_fips186_4.o", + "crypto/bn/libcrypto-lib-bn_shift.o", + "crypto/bn/libcrypto-lib-bn_sqr.o", + "crypto/bn/libcrypto-lib-bn_sqrt.o", + "crypto/bn/libcrypto-lib-bn_srp.o", + "crypto/bn/libcrypto-lib-bn_word.o", + "crypto/bn/libcrypto-lib-bn_x931p.o", + "crypto/buffer/libcrypto-lib-buf_err.o", + "crypto/buffer/libcrypto-lib-buffer.o", + "crypto/camellia/libcrypto-lib-camellia.o", + "crypto/camellia/libcrypto-lib-cmll_cbc.o", + "crypto/camellia/libcrypto-lib-cmll_cfb.o", + "crypto/camellia/libcrypto-lib-cmll_ctr.o", + "crypto/camellia/libcrypto-lib-cmll_ecb.o", + "crypto/camellia/libcrypto-lib-cmll_misc.o", + "crypto/camellia/libcrypto-lib-cmll_ofb.o", + "crypto/cast/libcrypto-lib-c_cfb64.o", + "crypto/cast/libcrypto-lib-c_ecb.o", + "crypto/cast/libcrypto-lib-c_enc.o", + "crypto/cast/libcrypto-lib-c_ofb64.o", + "crypto/cast/libcrypto-lib-c_skey.o", + "crypto/chacha/libcrypto-lib-chacha-riscv64-v-zbb-zvkb.o", + "crypto/chacha/libcrypto-lib-chacha-riscv64-v-zbb.o", + "crypto/chacha/libcrypto-lib-chacha_enc.o", + "crypto/chacha/libcrypto-lib-chacha_riscv.o", + "crypto/cmac/libcrypto-lib-cmac.o", + "crypto/cmp/libcrypto-lib-cmp_asn.o", + "crypto/cmp/libcrypto-lib-cmp_client.o", + "crypto/cmp/libcrypto-lib-cmp_ctx.o", + "crypto/cmp/libcrypto-lib-cmp_err.o", + "crypto/cmp/libcrypto-lib-cmp_genm.o", + "crypto/cmp/libcrypto-lib-cmp_hdr.o", + "crypto/cmp/libcrypto-lib-cmp_http.o", + "crypto/cmp/libcrypto-lib-cmp_msg.o", + "crypto/cmp/libcrypto-lib-cmp_protect.o", + "crypto/cmp/libcrypto-lib-cmp_server.o", + "crypto/cmp/libcrypto-lib-cmp_status.o", + "crypto/cmp/libcrypto-lib-cmp_util.o", + "crypto/cmp/libcrypto-lib-cmp_vfy.o", + "crypto/cms/libcrypto-lib-cms_asn1.o", + "crypto/cms/libcrypto-lib-cms_att.o", + "crypto/cms/libcrypto-lib-cms_cd.o", + "crypto/cms/libcrypto-lib-cms_dd.o", + "crypto/cms/libcrypto-lib-cms_dh.o", + "crypto/cms/libcrypto-lib-cms_ec.o", + "crypto/cms/libcrypto-lib-cms_enc.o", + "crypto/cms/libcrypto-lib-cms_env.o", + "crypto/cms/libcrypto-lib-cms_err.o", + "crypto/cms/libcrypto-lib-cms_ess.o", + "crypto/cms/libcrypto-lib-cms_io.o", + "crypto/cms/libcrypto-lib-cms_kari.o", + "crypto/cms/libcrypto-lib-cms_lib.o", + "crypto/cms/libcrypto-lib-cms_pwri.o", + "crypto/cms/libcrypto-lib-cms_rsa.o", + "crypto/cms/libcrypto-lib-cms_sd.o", + "crypto/cms/libcrypto-lib-cms_smime.o", + "crypto/comp/libcrypto-lib-c_brotli.o", + "crypto/comp/libcrypto-lib-c_zlib.o", + "crypto/comp/libcrypto-lib-c_zstd.o", + "crypto/comp/libcrypto-lib-comp_err.o", + "crypto/comp/libcrypto-lib-comp_lib.o", + "crypto/conf/libcrypto-lib-conf_api.o", + "crypto/conf/libcrypto-lib-conf_def.o", + "crypto/conf/libcrypto-lib-conf_err.o", + "crypto/conf/libcrypto-lib-conf_lib.o", + "crypto/conf/libcrypto-lib-conf_mall.o", + "crypto/conf/libcrypto-lib-conf_mod.o", + "crypto/conf/libcrypto-lib-conf_sap.o", + "crypto/conf/libcrypto-lib-conf_ssl.o", + "crypto/crmf/libcrypto-lib-crmf_asn.o", + "crypto/crmf/libcrypto-lib-crmf_err.o", + "crypto/crmf/libcrypto-lib-crmf_lib.o", + "crypto/crmf/libcrypto-lib-crmf_pbm.o", + "crypto/ct/libcrypto-lib-ct_b64.o", + "crypto/ct/libcrypto-lib-ct_err.o", + "crypto/ct/libcrypto-lib-ct_log.o", + "crypto/ct/libcrypto-lib-ct_oct.o", + "crypto/ct/libcrypto-lib-ct_policy.o", + "crypto/ct/libcrypto-lib-ct_prn.o", + "crypto/ct/libcrypto-lib-ct_sct.o", + "crypto/ct/libcrypto-lib-ct_sct_ctx.o", + "crypto/ct/libcrypto-lib-ct_vfy.o", + "crypto/ct/libcrypto-lib-ct_x509v3.o", + "crypto/des/libcrypto-lib-cbc_cksm.o", + "crypto/des/libcrypto-lib-cbc_enc.o", + "crypto/des/libcrypto-lib-cfb64ede.o", + "crypto/des/libcrypto-lib-cfb64enc.o", + "crypto/des/libcrypto-lib-cfb_enc.o", + "crypto/des/libcrypto-lib-des_enc.o", + "crypto/des/libcrypto-lib-ecb3_enc.o", + "crypto/des/libcrypto-lib-ecb_enc.o", + "crypto/des/libcrypto-lib-fcrypt.o", + "crypto/des/libcrypto-lib-fcrypt_b.o", + "crypto/des/libcrypto-lib-ofb64ede.o", + "crypto/des/libcrypto-lib-ofb64enc.o", + "crypto/des/libcrypto-lib-ofb_enc.o", + "crypto/des/libcrypto-lib-pcbc_enc.o", + "crypto/des/libcrypto-lib-qud_cksm.o", + "crypto/des/libcrypto-lib-rand_key.o", + "crypto/des/libcrypto-lib-set_key.o", + "crypto/des/libcrypto-lib-str2key.o", + "crypto/des/libcrypto-lib-xcbc_enc.o", + "crypto/dh/libcrypto-lib-dh_ameth.o", + "crypto/dh/libcrypto-lib-dh_asn1.o", + "crypto/dh/libcrypto-lib-dh_backend.o", + "crypto/dh/libcrypto-lib-dh_check.o", + "crypto/dh/libcrypto-lib-dh_depr.o", + "crypto/dh/libcrypto-lib-dh_err.o", + "crypto/dh/libcrypto-lib-dh_gen.o", + "crypto/dh/libcrypto-lib-dh_group_params.o", + "crypto/dh/libcrypto-lib-dh_kdf.o", + "crypto/dh/libcrypto-lib-dh_key.o", + "crypto/dh/libcrypto-lib-dh_lib.o", + "crypto/dh/libcrypto-lib-dh_meth.o", + "crypto/dh/libcrypto-lib-dh_pmeth.o", + "crypto/dh/libcrypto-lib-dh_prn.o", + "crypto/dh/libcrypto-lib-dh_rfc5114.o", + "crypto/dsa/libcrypto-lib-dsa_ameth.o", + "crypto/dsa/libcrypto-lib-dsa_asn1.o", + "crypto/dsa/libcrypto-lib-dsa_backend.o", + "crypto/dsa/libcrypto-lib-dsa_check.o", + "crypto/dsa/libcrypto-lib-dsa_depr.o", + "crypto/dsa/libcrypto-lib-dsa_err.o", + "crypto/dsa/libcrypto-lib-dsa_gen.o", + "crypto/dsa/libcrypto-lib-dsa_key.o", + "crypto/dsa/libcrypto-lib-dsa_lib.o", + "crypto/dsa/libcrypto-lib-dsa_meth.o", + "crypto/dsa/libcrypto-lib-dsa_ossl.o", + "crypto/dsa/libcrypto-lib-dsa_pmeth.o", + "crypto/dsa/libcrypto-lib-dsa_prn.o", + "crypto/dsa/libcrypto-lib-dsa_sign.o", + "crypto/dsa/libcrypto-lib-dsa_vrf.o", + "crypto/dso/libcrypto-lib-dso_dl.o", + "crypto/dso/libcrypto-lib-dso_dlfcn.o", + "crypto/dso/libcrypto-lib-dso_err.o", + "crypto/dso/libcrypto-lib-dso_lib.o", + "crypto/dso/libcrypto-lib-dso_openssl.o", + "crypto/dso/libcrypto-lib-dso_vms.o", + "crypto/dso/libcrypto-lib-dso_win32.o", + "crypto/ec/curve448/arch_32/libcrypto-lib-f_impl32.o", + "crypto/ec/curve448/arch_64/libcrypto-lib-f_impl64.o", + "crypto/ec/curve448/libcrypto-lib-curve448.o", + "crypto/ec/curve448/libcrypto-lib-curve448_tables.o", + "crypto/ec/curve448/libcrypto-lib-eddsa.o", + "crypto/ec/curve448/libcrypto-lib-f_generic.o", + "crypto/ec/curve448/libcrypto-lib-scalar.o", + "crypto/ec/libcrypto-lib-curve25519.o", + "crypto/ec/libcrypto-lib-ec2_oct.o", + "crypto/ec/libcrypto-lib-ec2_smpl.o", + "crypto/ec/libcrypto-lib-ec_ameth.o", + "crypto/ec/libcrypto-lib-ec_asn1.o", + "crypto/ec/libcrypto-lib-ec_backend.o", + "crypto/ec/libcrypto-lib-ec_check.o", + "crypto/ec/libcrypto-lib-ec_curve.o", + "crypto/ec/libcrypto-lib-ec_cvt.o", + "crypto/ec/libcrypto-lib-ec_deprecated.o", + "crypto/ec/libcrypto-lib-ec_err.o", + "crypto/ec/libcrypto-lib-ec_key.o", + "crypto/ec/libcrypto-lib-ec_kmeth.o", + "crypto/ec/libcrypto-lib-ec_lib.o", + "crypto/ec/libcrypto-lib-ec_mult.o", + "crypto/ec/libcrypto-lib-ec_oct.o", + "crypto/ec/libcrypto-lib-ec_pmeth.o", + "crypto/ec/libcrypto-lib-ec_print.o", + "crypto/ec/libcrypto-lib-ecdh_kdf.o", + "crypto/ec/libcrypto-lib-ecdh_ossl.o", + "crypto/ec/libcrypto-lib-ecdsa_ossl.o", + "crypto/ec/libcrypto-lib-ecdsa_sign.o", + "crypto/ec/libcrypto-lib-ecdsa_vrf.o", + "crypto/ec/libcrypto-lib-eck_prn.o", + "crypto/ec/libcrypto-lib-ecp_mont.o", + "crypto/ec/libcrypto-lib-ecp_nist.o", + "crypto/ec/libcrypto-lib-ecp_oct.o", + "crypto/ec/libcrypto-lib-ecp_smpl.o", + "crypto/ec/libcrypto-lib-ecx_backend.o", + "crypto/ec/libcrypto-lib-ecx_key.o", + "crypto/ec/libcrypto-lib-ecx_meth.o", + "crypto/encode_decode/libcrypto-lib-decoder_err.o", + "crypto/encode_decode/libcrypto-lib-decoder_lib.o", + "crypto/encode_decode/libcrypto-lib-decoder_meth.o", + "crypto/encode_decode/libcrypto-lib-decoder_pkey.o", + "crypto/encode_decode/libcrypto-lib-encoder_err.o", + "crypto/encode_decode/libcrypto-lib-encoder_lib.o", + "crypto/encode_decode/libcrypto-lib-encoder_meth.o", + "crypto/encode_decode/libcrypto-lib-encoder_pkey.o", + "crypto/engine/libcrypto-lib-eng_all.o", + "crypto/engine/libcrypto-lib-eng_cnf.o", + "crypto/engine/libcrypto-lib-eng_ctrl.o", + "crypto/engine/libcrypto-lib-eng_dyn.o", + "crypto/engine/libcrypto-lib-eng_err.o", + "crypto/engine/libcrypto-lib-eng_fat.o", + "crypto/engine/libcrypto-lib-eng_init.o", + "crypto/engine/libcrypto-lib-eng_lib.o", + "crypto/engine/libcrypto-lib-eng_list.o", + "crypto/engine/libcrypto-lib-eng_openssl.o", + "crypto/engine/libcrypto-lib-eng_pkey.o", + "crypto/engine/libcrypto-lib-eng_rdrand.o", + "crypto/engine/libcrypto-lib-eng_table.o", + "crypto/engine/libcrypto-lib-tb_asnmth.o", + "crypto/engine/libcrypto-lib-tb_cipher.o", + "crypto/engine/libcrypto-lib-tb_dh.o", + "crypto/engine/libcrypto-lib-tb_digest.o", + "crypto/engine/libcrypto-lib-tb_dsa.o", + "crypto/engine/libcrypto-lib-tb_eckey.o", + "crypto/engine/libcrypto-lib-tb_pkmeth.o", + "crypto/engine/libcrypto-lib-tb_rand.o", + "crypto/engine/libcrypto-lib-tb_rsa.o", + "crypto/err/libcrypto-lib-err.o", + "crypto/err/libcrypto-lib-err_all.o", + "crypto/err/libcrypto-lib-err_all_legacy.o", + "crypto/err/libcrypto-lib-err_blocks.o", + "crypto/err/libcrypto-lib-err_mark.o", + "crypto/err/libcrypto-lib-err_prn.o", + "crypto/err/libcrypto-lib-err_save.o", + "crypto/ess/libcrypto-lib-ess_asn1.o", + "crypto/ess/libcrypto-lib-ess_err.o", + "crypto/ess/libcrypto-lib-ess_lib.o", + "crypto/evp/libcrypto-lib-asymcipher.o", + "crypto/evp/libcrypto-lib-bio_b64.o", + "crypto/evp/libcrypto-lib-bio_enc.o", + "crypto/evp/libcrypto-lib-bio_md.o", + "crypto/evp/libcrypto-lib-bio_ok.o", + "crypto/evp/libcrypto-lib-c_allc.o", + "crypto/evp/libcrypto-lib-c_alld.o", + "crypto/evp/libcrypto-lib-cmeth_lib.o", + "crypto/evp/libcrypto-lib-ctrl_params_translate.o", + "crypto/evp/libcrypto-lib-dh_ctrl.o", + "crypto/evp/libcrypto-lib-dh_support.o", + "crypto/evp/libcrypto-lib-digest.o", + "crypto/evp/libcrypto-lib-dsa_ctrl.o", + "crypto/evp/libcrypto-lib-e_aes.o", + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha1.o", + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha256.o", + "crypto/evp/libcrypto-lib-e_aria.o", + "crypto/evp/libcrypto-lib-e_bf.o", + "crypto/evp/libcrypto-lib-e_camellia.o", + "crypto/evp/libcrypto-lib-e_cast.o", + "crypto/evp/libcrypto-lib-e_chacha20_poly1305.o", + "crypto/evp/libcrypto-lib-e_des.o", + "crypto/evp/libcrypto-lib-e_des3.o", + "crypto/evp/libcrypto-lib-e_idea.o", + "crypto/evp/libcrypto-lib-e_null.o", + "crypto/evp/libcrypto-lib-e_old.o", + "crypto/evp/libcrypto-lib-e_rc2.o", + "crypto/evp/libcrypto-lib-e_rc4.o", + "crypto/evp/libcrypto-lib-e_rc4_hmac_md5.o", + "crypto/evp/libcrypto-lib-e_rc5.o", + "crypto/evp/libcrypto-lib-e_seed.o", + "crypto/evp/libcrypto-lib-e_sm4.o", + "crypto/evp/libcrypto-lib-e_xcbc_d.o", + "crypto/evp/libcrypto-lib-ec_ctrl.o", + "crypto/evp/libcrypto-lib-ec_support.o", + "crypto/evp/libcrypto-lib-encode.o", + "crypto/evp/libcrypto-lib-evp_cnf.o", + "crypto/evp/libcrypto-lib-evp_enc.o", + "crypto/evp/libcrypto-lib-evp_err.o", + "crypto/evp/libcrypto-lib-evp_fetch.o", + "crypto/evp/libcrypto-lib-evp_key.o", + "crypto/evp/libcrypto-lib-evp_lib.o", + "crypto/evp/libcrypto-lib-evp_pbe.o", + "crypto/evp/libcrypto-lib-evp_pkey.o", + "crypto/evp/libcrypto-lib-evp_rand.o", + "crypto/evp/libcrypto-lib-evp_utils.o", + "crypto/evp/libcrypto-lib-exchange.o", + "crypto/evp/libcrypto-lib-kdf_lib.o", + "crypto/evp/libcrypto-lib-kdf_meth.o", + "crypto/evp/libcrypto-lib-kem.o", + "crypto/evp/libcrypto-lib-keymgmt_lib.o", + "crypto/evp/libcrypto-lib-keymgmt_meth.o", + "crypto/evp/libcrypto-lib-legacy_blake2.o", + "crypto/evp/libcrypto-lib-legacy_md4.o", + "crypto/evp/libcrypto-lib-legacy_md5.o", + "crypto/evp/libcrypto-lib-legacy_md5_sha1.o", + "crypto/evp/libcrypto-lib-legacy_mdc2.o", + "crypto/evp/libcrypto-lib-legacy_ripemd.o", + "crypto/evp/libcrypto-lib-legacy_sha.o", + "crypto/evp/libcrypto-lib-legacy_wp.o", + "crypto/evp/libcrypto-lib-m_null.o", + "crypto/evp/libcrypto-lib-m_sigver.o", + "crypto/evp/libcrypto-lib-mac_lib.o", + "crypto/evp/libcrypto-lib-mac_meth.o", + "crypto/evp/libcrypto-lib-names.o", + "crypto/evp/libcrypto-lib-p5_crpt.o", + "crypto/evp/libcrypto-lib-p5_crpt2.o", + "crypto/evp/libcrypto-lib-p_dec.o", + "crypto/evp/libcrypto-lib-p_enc.o", + "crypto/evp/libcrypto-lib-p_legacy.o", + "crypto/evp/libcrypto-lib-p_lib.o", + "crypto/evp/libcrypto-lib-p_open.o", + "crypto/evp/libcrypto-lib-p_seal.o", + "crypto/evp/libcrypto-lib-p_sign.o", + "crypto/evp/libcrypto-lib-p_verify.o", + "crypto/evp/libcrypto-lib-pbe_scrypt.o", + "crypto/evp/libcrypto-lib-pmeth_check.o", + "crypto/evp/libcrypto-lib-pmeth_gn.o", + "crypto/evp/libcrypto-lib-pmeth_lib.o", + "crypto/evp/libcrypto-lib-s_lib.o", + "crypto/evp/libcrypto-lib-signature.o", + "crypto/evp/libcrypto-lib-skeymgmt_meth.o", + "crypto/ffc/libcrypto-lib-ffc_backend.o", + "crypto/ffc/libcrypto-lib-ffc_dh.o", + "crypto/ffc/libcrypto-lib-ffc_key_generate.o", + "crypto/ffc/libcrypto-lib-ffc_key_validate.o", + "crypto/ffc/libcrypto-lib-ffc_params.o", + "crypto/ffc/libcrypto-lib-ffc_params_generate.o", + "crypto/ffc/libcrypto-lib-ffc_params_validate.o", + "crypto/hashtable/libcrypto-lib-hashfunc.o", + "crypto/hashtable/libcrypto-lib-hashtable.o", + "crypto/hmac/libcrypto-lib-hmac.o", + "crypto/hpke/libcrypto-lib-hpke.o", + "crypto/hpke/libcrypto-lib-hpke_util.o", + "crypto/http/libcrypto-lib-http_client.o", + "crypto/http/libcrypto-lib-http_err.o", + "crypto/http/libcrypto-lib-http_lib.o", + "crypto/idea/libcrypto-lib-i_cbc.o", + "crypto/idea/libcrypto-lib-i_cfb64.o", + "crypto/idea/libcrypto-lib-i_ecb.o", + "crypto/idea/libcrypto-lib-i_ofb64.o", + "crypto/idea/libcrypto-lib-i_skey.o", + "crypto/kdf/libcrypto-lib-kdf_err.o", + "crypto/lhash/libcrypto-lib-lh_stats.o", + "crypto/lhash/libcrypto-lib-lhash.o", + "crypto/libcrypto-lib-asn1_dsa.o", + "crypto/libcrypto-lib-bsearch.o", + "crypto/libcrypto-lib-comp_methods.o", + "crypto/libcrypto-lib-context.o", + "crypto/libcrypto-lib-core_algorithm.o", + "crypto/libcrypto-lib-core_fetch.o", + "crypto/libcrypto-lib-core_namemap.o", + "crypto/libcrypto-lib-cpt_err.o", + "crypto/libcrypto-lib-cpuid.o", + "crypto/libcrypto-lib-cryptlib.o", + "crypto/libcrypto-lib-ctype.o", + "crypto/libcrypto-lib-cversion.o", + "crypto/libcrypto-lib-defaults.o", + "crypto/libcrypto-lib-der_writer.o", + "crypto/libcrypto-lib-deterministic_nonce.o", + "crypto/libcrypto-lib-ebcdic.o", + "crypto/libcrypto-lib-ex_data.o", + "crypto/libcrypto-lib-getenv.o", + "crypto/libcrypto-lib-indicator_core.o", + "crypto/libcrypto-lib-info.o", + "crypto/libcrypto-lib-init.o", + "crypto/libcrypto-lib-initthread.o", + "crypto/libcrypto-lib-mem.o", + "crypto/libcrypto-lib-mem_sec.o", + "crypto/libcrypto-lib-o_dir.o", + "crypto/libcrypto-lib-o_fopen.o", + "crypto/libcrypto-lib-o_init.o", + "crypto/libcrypto-lib-o_str.o", + "crypto/libcrypto-lib-o_time.o", + "crypto/libcrypto-lib-packet.o", + "crypto/libcrypto-lib-param_build.o", + "crypto/libcrypto-lib-param_build_set.o", + "crypto/libcrypto-lib-params.o", + "crypto/libcrypto-lib-params_dup.o", + "crypto/libcrypto-lib-params_from_text.o", + "crypto/libcrypto-lib-params_idx.o", + "crypto/libcrypto-lib-passphrase.o", + "crypto/libcrypto-lib-provider.o", + "crypto/libcrypto-lib-provider_child.o", + "crypto/libcrypto-lib-provider_conf.o", + "crypto/libcrypto-lib-provider_core.o", + "crypto/libcrypto-lib-provider_predefined.o", + "crypto/libcrypto-lib-punycode.o", + "crypto/libcrypto-lib-quic_vlint.o", + "crypto/libcrypto-lib-riscv64cpuid.o", + "crypto/libcrypto-lib-riscvcap.o", + "crypto/libcrypto-lib-self_test_core.o", + "crypto/libcrypto-lib-sleep.o", + "crypto/libcrypto-lib-sparse_array.o", + "crypto/libcrypto-lib-ssl_err.o", + "crypto/libcrypto-lib-threads_lib.o", + "crypto/libcrypto-lib-threads_none.o", + "crypto/libcrypto-lib-threads_pthread.o", + "crypto/libcrypto-lib-threads_win.o", + "crypto/libcrypto-lib-time.o", + "crypto/libcrypto-lib-trace.o", + "crypto/libcrypto-lib-uid.o", + "crypto/md4/libcrypto-lib-md4_dgst.o", + "crypto/md4/libcrypto-lib-md4_one.o", + "crypto/md5/libcrypto-lib-md5_dgst.o", + "crypto/md5/libcrypto-lib-md5_one.o", + "crypto/md5/libcrypto-lib-md5_sha1.o", + "crypto/mdc2/libcrypto-lib-mdc2_one.o", + "crypto/mdc2/libcrypto-lib-mdc2dgst.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_encoders.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_key.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_key_compress.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_matrix.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_ntt.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_params.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_sample.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_sign.o", + "crypto/ml_kem/libcrypto-lib-ml_kem.o", + "crypto/modes/libcrypto-lib-aes-gcm-riscv64-zvkb-zvkg-zvkned.o", + "crypto/modes/libcrypto-lib-cbc128.o", + "crypto/modes/libcrypto-lib-ccm128.o", + "crypto/modes/libcrypto-lib-cfb128.o", + "crypto/modes/libcrypto-lib-ctr128.o", + "crypto/modes/libcrypto-lib-cts128.o", + "crypto/modes/libcrypto-lib-gcm128.o", + "crypto/modes/libcrypto-lib-ghash-riscv64-zvkb-zvbc.o", + "crypto/modes/libcrypto-lib-ghash-riscv64-zvkg.o", + "crypto/modes/libcrypto-lib-ghash-riscv64.o", + "crypto/modes/libcrypto-lib-ocb128.o", + "crypto/modes/libcrypto-lib-ofb128.o", + "crypto/modes/libcrypto-lib-siv128.o", + "crypto/modes/libcrypto-lib-wrap128.o", + "crypto/modes/libcrypto-lib-xts128.o", + "crypto/modes/libcrypto-lib-xts128gb.o", + "crypto/objects/libcrypto-lib-o_names.o", + "crypto/objects/libcrypto-lib-obj_dat.o", + "crypto/objects/libcrypto-lib-obj_err.o", + "crypto/objects/libcrypto-lib-obj_lib.o", + "crypto/objects/libcrypto-lib-obj_xref.o", + "crypto/ocsp/libcrypto-lib-ocsp_asn.o", + "crypto/ocsp/libcrypto-lib-ocsp_cl.o", + "crypto/ocsp/libcrypto-lib-ocsp_err.o", + "crypto/ocsp/libcrypto-lib-ocsp_ext.o", + "crypto/ocsp/libcrypto-lib-ocsp_http.o", + "crypto/ocsp/libcrypto-lib-ocsp_lib.o", + "crypto/ocsp/libcrypto-lib-ocsp_prn.o", + "crypto/ocsp/libcrypto-lib-ocsp_srv.o", + "crypto/ocsp/libcrypto-lib-ocsp_vfy.o", + "crypto/ocsp/libcrypto-lib-v3_ocsp.o", + "crypto/pem/libcrypto-lib-pem_all.o", + "crypto/pem/libcrypto-lib-pem_err.o", + "crypto/pem/libcrypto-lib-pem_info.o", + "crypto/pem/libcrypto-lib-pem_lib.o", + "crypto/pem/libcrypto-lib-pem_oth.o", + "crypto/pem/libcrypto-lib-pem_pk8.o", + "crypto/pem/libcrypto-lib-pem_pkey.o", + "crypto/pem/libcrypto-lib-pem_sign.o", + "crypto/pem/libcrypto-lib-pem_x509.o", + "crypto/pem/libcrypto-lib-pem_xaux.o", + "crypto/pem/libcrypto-lib-pvkfmt.o", + "crypto/pkcs12/libcrypto-lib-p12_add.o", + "crypto/pkcs12/libcrypto-lib-p12_asn.o", + "crypto/pkcs12/libcrypto-lib-p12_attr.o", + "crypto/pkcs12/libcrypto-lib-p12_crpt.o", + "crypto/pkcs12/libcrypto-lib-p12_crt.o", + "crypto/pkcs12/libcrypto-lib-p12_decr.o", + "crypto/pkcs12/libcrypto-lib-p12_init.o", + "crypto/pkcs12/libcrypto-lib-p12_key.o", + "crypto/pkcs12/libcrypto-lib-p12_kiss.o", + "crypto/pkcs12/libcrypto-lib-p12_mutl.o", + "crypto/pkcs12/libcrypto-lib-p12_npas.o", + "crypto/pkcs12/libcrypto-lib-p12_p8d.o", + "crypto/pkcs12/libcrypto-lib-p12_p8e.o", + "crypto/pkcs12/libcrypto-lib-p12_sbag.o", + "crypto/pkcs12/libcrypto-lib-p12_utl.o", + "crypto/pkcs12/libcrypto-lib-pk12err.o", + "crypto/pkcs7/libcrypto-lib-bio_pk7.o", + "crypto/pkcs7/libcrypto-lib-pk7_asn1.o", + "crypto/pkcs7/libcrypto-lib-pk7_attr.o", + "crypto/pkcs7/libcrypto-lib-pk7_doit.o", + "crypto/pkcs7/libcrypto-lib-pk7_lib.o", + "crypto/pkcs7/libcrypto-lib-pk7_mime.o", + "crypto/pkcs7/libcrypto-lib-pk7_smime.o", + "crypto/pkcs7/libcrypto-lib-pkcs7err.o", + "crypto/poly1305/libcrypto-lib-poly1305.o", + "crypto/property/libcrypto-lib-defn_cache.o", + "crypto/property/libcrypto-lib-property.o", + "crypto/property/libcrypto-lib-property_err.o", + "crypto/property/libcrypto-lib-property_parse.o", + "crypto/property/libcrypto-lib-property_query.o", + "crypto/property/libcrypto-lib-property_string.o", + "crypto/rand/libcrypto-lib-prov_seed.o", + "crypto/rand/libcrypto-lib-rand_deprecated.o", + "crypto/rand/libcrypto-lib-rand_err.o", + "crypto/rand/libcrypto-lib-rand_lib.o", + "crypto/rand/libcrypto-lib-rand_meth.o", + "crypto/rand/libcrypto-lib-rand_pool.o", + "crypto/rand/libcrypto-lib-rand_uniform.o", + "crypto/rand/libcrypto-lib-randfile.o", + "crypto/rc2/libcrypto-lib-rc2_cbc.o", + "crypto/rc2/libcrypto-lib-rc2_ecb.o", + "crypto/rc2/libcrypto-lib-rc2_skey.o", + "crypto/rc2/libcrypto-lib-rc2cfb64.o", + "crypto/rc2/libcrypto-lib-rc2ofb64.o", + "crypto/rc4/libcrypto-lib-rc4_enc.o", + "crypto/rc4/libcrypto-lib-rc4_skey.o", + "crypto/ripemd/libcrypto-lib-rmd_dgst.o", + "crypto/ripemd/libcrypto-lib-rmd_one.o", + "crypto/rsa/libcrypto-lib-rsa_ameth.o", + "crypto/rsa/libcrypto-lib-rsa_asn1.o", + "crypto/rsa/libcrypto-lib-rsa_backend.o", + "crypto/rsa/libcrypto-lib-rsa_chk.o", + "crypto/rsa/libcrypto-lib-rsa_crpt.o", + "crypto/rsa/libcrypto-lib-rsa_depr.o", + "crypto/rsa/libcrypto-lib-rsa_err.o", + "crypto/rsa/libcrypto-lib-rsa_gen.o", + "crypto/rsa/libcrypto-lib-rsa_lib.o", + "crypto/rsa/libcrypto-lib-rsa_meth.o", + "crypto/rsa/libcrypto-lib-rsa_mp.o", + "crypto/rsa/libcrypto-lib-rsa_mp_names.o", + "crypto/rsa/libcrypto-lib-rsa_none.o", + "crypto/rsa/libcrypto-lib-rsa_oaep.o", + "crypto/rsa/libcrypto-lib-rsa_ossl.o", + "crypto/rsa/libcrypto-lib-rsa_pk1.o", + "crypto/rsa/libcrypto-lib-rsa_pmeth.o", + "crypto/rsa/libcrypto-lib-rsa_prn.o", + "crypto/rsa/libcrypto-lib-rsa_pss.o", + "crypto/rsa/libcrypto-lib-rsa_saos.o", + "crypto/rsa/libcrypto-lib-rsa_schemes.o", + "crypto/rsa/libcrypto-lib-rsa_sign.o", + "crypto/rsa/libcrypto-lib-rsa_sp800_56b_check.o", + "crypto/rsa/libcrypto-lib-rsa_sp800_56b_gen.o", + "crypto/rsa/libcrypto-lib-rsa_x931.o", + "crypto/rsa/libcrypto-lib-rsa_x931g.o", + "crypto/seed/libcrypto-lib-seed.o", + "crypto/seed/libcrypto-lib-seed_cbc.o", + "crypto/seed/libcrypto-lib-seed_cfb.o", + "crypto/seed/libcrypto-lib-seed_ecb.o", + "crypto/seed/libcrypto-lib-seed_ofb.o", + "crypto/sha/libcrypto-lib-keccak1600.o", + "crypto/sha/libcrypto-lib-sha1_one.o", + "crypto/sha/libcrypto-lib-sha1dgst.o", + "crypto/sha/libcrypto-lib-sha256-riscv64-zvkb-zvknha_or_zvknhb.o", + "crypto/sha/libcrypto-lib-sha256.o", + "crypto/sha/libcrypto-lib-sha3.o", + "crypto/sha/libcrypto-lib-sha512-riscv64-zvkb-zvknhb.o", + "crypto/sha/libcrypto-lib-sha512.o", + "crypto/sha/libcrypto-lib-sha_riscv.o", + "crypto/siphash/libcrypto-lib-siphash.o", + "crypto/slh_dsa/libcrypto-lib-slh_adrs.o", + "crypto/slh_dsa/libcrypto-lib-slh_dsa.o", + "crypto/slh_dsa/libcrypto-lib-slh_dsa_hash_ctx.o", + "crypto/slh_dsa/libcrypto-lib-slh_dsa_key.o", + "crypto/slh_dsa/libcrypto-lib-slh_fors.o", + "crypto/slh_dsa/libcrypto-lib-slh_hash.o", + "crypto/slh_dsa/libcrypto-lib-slh_hypertree.o", + "crypto/slh_dsa/libcrypto-lib-slh_params.o", + "crypto/slh_dsa/libcrypto-lib-slh_wots.o", + "crypto/slh_dsa/libcrypto-lib-slh_xmss.o", + "crypto/sm2/libcrypto-lib-sm2_crypt.o", + "crypto/sm2/libcrypto-lib-sm2_err.o", + "crypto/sm2/libcrypto-lib-sm2_key.o", + "crypto/sm2/libcrypto-lib-sm2_sign.o", + "crypto/sm3/libcrypto-lib-legacy_sm3.o", + "crypto/sm3/libcrypto-lib-sm3-riscv64-zvksh.o", + "crypto/sm3/libcrypto-lib-sm3.o", + "crypto/sm3/libcrypto-lib-sm3_riscv.o", + "crypto/sm4/libcrypto-lib-sm4-riscv64-zvksed.o", + "crypto/sm4/libcrypto-lib-sm4.o", + "crypto/srp/libcrypto-lib-srp_lib.o", + "crypto/srp/libcrypto-lib-srp_vfy.o", + "crypto/stack/libcrypto-lib-stack.o", + "crypto/store/libcrypto-lib-store_err.o", + "crypto/store/libcrypto-lib-store_init.o", + "crypto/store/libcrypto-lib-store_lib.o", + "crypto/store/libcrypto-lib-store_meth.o", + "crypto/store/libcrypto-lib-store_register.o", + "crypto/store/libcrypto-lib-store_result.o", + "crypto/store/libcrypto-lib-store_strings.o", + "crypto/thread/arch/libcrypto-lib-thread_none.o", + "crypto/thread/arch/libcrypto-lib-thread_posix.o", + "crypto/thread/arch/libcrypto-lib-thread_win.o", + "crypto/thread/libcrypto-lib-api.o", + "crypto/thread/libcrypto-lib-arch.o", + "crypto/thread/libcrypto-lib-internal.o", + "crypto/ts/libcrypto-lib-ts_asn1.o", + "crypto/ts/libcrypto-lib-ts_conf.o", + "crypto/ts/libcrypto-lib-ts_err.o", + "crypto/ts/libcrypto-lib-ts_lib.o", + "crypto/ts/libcrypto-lib-ts_req_print.o", + "crypto/ts/libcrypto-lib-ts_req_utils.o", + "crypto/ts/libcrypto-lib-ts_rsp_print.o", + "crypto/ts/libcrypto-lib-ts_rsp_sign.o", + "crypto/ts/libcrypto-lib-ts_rsp_utils.o", + "crypto/ts/libcrypto-lib-ts_rsp_verify.o", + "crypto/ts/libcrypto-lib-ts_verify_ctx.o", + "crypto/txt_db/libcrypto-lib-txt_db.o", + "crypto/ui/libcrypto-lib-ui_err.o", + "crypto/ui/libcrypto-lib-ui_lib.o", + "crypto/ui/libcrypto-lib-ui_null.o", + "crypto/ui/libcrypto-lib-ui_openssl.o", + "crypto/ui/libcrypto-lib-ui_util.o", + "crypto/whrlpool/libcrypto-lib-wp_block.o", + "crypto/whrlpool/libcrypto-lib-wp_dgst.o", + "crypto/x509/libcrypto-lib-by_dir.o", + "crypto/x509/libcrypto-lib-by_file.o", + "crypto/x509/libcrypto-lib-by_store.o", + "crypto/x509/libcrypto-lib-pcy_cache.o", + "crypto/x509/libcrypto-lib-pcy_data.o", + "crypto/x509/libcrypto-lib-pcy_lib.o", + "crypto/x509/libcrypto-lib-pcy_map.o", + "crypto/x509/libcrypto-lib-pcy_node.o", + "crypto/x509/libcrypto-lib-pcy_tree.o", + "crypto/x509/libcrypto-lib-t_acert.o", + "crypto/x509/libcrypto-lib-t_crl.o", + "crypto/x509/libcrypto-lib-t_req.o", + "crypto/x509/libcrypto-lib-t_x509.o", + "crypto/x509/libcrypto-lib-v3_aaa.o", + "crypto/x509/libcrypto-lib-v3_ac_tgt.o", + "crypto/x509/libcrypto-lib-v3_addr.o", + "crypto/x509/libcrypto-lib-v3_admis.o", + "crypto/x509/libcrypto-lib-v3_akeya.o", + "crypto/x509/libcrypto-lib-v3_akid.o", + "crypto/x509/libcrypto-lib-v3_asid.o", + "crypto/x509/libcrypto-lib-v3_attrdesc.o", + "crypto/x509/libcrypto-lib-v3_attrmap.o", + "crypto/x509/libcrypto-lib-v3_audit_id.o", + "crypto/x509/libcrypto-lib-v3_authattid.o", + "crypto/x509/libcrypto-lib-v3_battcons.o", + "crypto/x509/libcrypto-lib-v3_bcons.o", + "crypto/x509/libcrypto-lib-v3_bitst.o", + "crypto/x509/libcrypto-lib-v3_conf.o", + "crypto/x509/libcrypto-lib-v3_cpols.o", + "crypto/x509/libcrypto-lib-v3_crld.o", + "crypto/x509/libcrypto-lib-v3_enum.o", + "crypto/x509/libcrypto-lib-v3_extku.o", + "crypto/x509/libcrypto-lib-v3_genn.o", + "crypto/x509/libcrypto-lib-v3_group_ac.o", + "crypto/x509/libcrypto-lib-v3_ia5.o", + "crypto/x509/libcrypto-lib-v3_ind_iss.o", + "crypto/x509/libcrypto-lib-v3_info.o", + "crypto/x509/libcrypto-lib-v3_int.o", + "crypto/x509/libcrypto-lib-v3_iobo.o", + "crypto/x509/libcrypto-lib-v3_ist.o", + "crypto/x509/libcrypto-lib-v3_lib.o", + "crypto/x509/libcrypto-lib-v3_ncons.o", + "crypto/x509/libcrypto-lib-v3_no_ass.o", + "crypto/x509/libcrypto-lib-v3_no_rev_avail.o", + "crypto/x509/libcrypto-lib-v3_pci.o", + "crypto/x509/libcrypto-lib-v3_pcia.o", + "crypto/x509/libcrypto-lib-v3_pcons.o", + "crypto/x509/libcrypto-lib-v3_pku.o", + "crypto/x509/libcrypto-lib-v3_pmaps.o", + "crypto/x509/libcrypto-lib-v3_prn.o", + "crypto/x509/libcrypto-lib-v3_purp.o", + "crypto/x509/libcrypto-lib-v3_rolespec.o", + "crypto/x509/libcrypto-lib-v3_san.o", + "crypto/x509/libcrypto-lib-v3_sda.o", + "crypto/x509/libcrypto-lib-v3_single_use.o", + "crypto/x509/libcrypto-lib-v3_skid.o", + "crypto/x509/libcrypto-lib-v3_soa_id.o", + "crypto/x509/libcrypto-lib-v3_sxnet.o", + "crypto/x509/libcrypto-lib-v3_timespec.o", + "crypto/x509/libcrypto-lib-v3_tlsf.o", + "crypto/x509/libcrypto-lib-v3_usernotice.o", + "crypto/x509/libcrypto-lib-v3_utf8.o", + "crypto/x509/libcrypto-lib-v3_utl.o", + "crypto/x509/libcrypto-lib-v3err.o", + "crypto/x509/libcrypto-lib-x509_acert.o", + "crypto/x509/libcrypto-lib-x509_att.o", + "crypto/x509/libcrypto-lib-x509_cmp.o", + "crypto/x509/libcrypto-lib-x509_d2.o", + "crypto/x509/libcrypto-lib-x509_def.o", + "crypto/x509/libcrypto-lib-x509_err.o", + "crypto/x509/libcrypto-lib-x509_ext.o", + "crypto/x509/libcrypto-lib-x509_lu.o", + "crypto/x509/libcrypto-lib-x509_meth.o", + "crypto/x509/libcrypto-lib-x509_obj.o", + "crypto/x509/libcrypto-lib-x509_r2x.o", + "crypto/x509/libcrypto-lib-x509_req.o", + "crypto/x509/libcrypto-lib-x509_set.o", + "crypto/x509/libcrypto-lib-x509_trust.o", + "crypto/x509/libcrypto-lib-x509_txt.o", + "crypto/x509/libcrypto-lib-x509_v3.o", + "crypto/x509/libcrypto-lib-x509_vfy.o", + "crypto/x509/libcrypto-lib-x509_vpm.o", + "crypto/x509/libcrypto-lib-x509aset.o", + "crypto/x509/libcrypto-lib-x509cset.o", + "crypto/x509/libcrypto-lib-x509name.o", + "crypto/x509/libcrypto-lib-x509rset.o", + "crypto/x509/libcrypto-lib-x509spki.o", + "crypto/x509/libcrypto-lib-x509type.o", + "crypto/x509/libcrypto-lib-x_all.o", + "crypto/x509/libcrypto-lib-x_attrib.o", + "crypto/x509/libcrypto-lib-x_crl.o", + "crypto/x509/libcrypto-lib-x_exten.o", + "crypto/x509/libcrypto-lib-x_ietfatt.o", + "crypto/x509/libcrypto-lib-x_name.o", + "crypto/x509/libcrypto-lib-x_pubkey.o", + "crypto/x509/libcrypto-lib-x_req.o", + "crypto/x509/libcrypto-lib-x_x509.o", + "crypto/x509/libcrypto-lib-x_x509a.o", + "engines/libcrypto-lib-e_capi.o", + "engines/libcrypto-lib-e_padlock.o", + "providers/libcrypto-lib-baseprov.o", + "providers/libcrypto-lib-defltprov.o", + "providers/libcrypto-lib-nullprov.o", + "providers/libcrypto-lib-prov_running.o", + "providers/libdefault.a" + ], + "libssl" => [ + "ssl/libssl-lib-bio_ssl.o", + "ssl/libssl-lib-d1_lib.o", + "ssl/libssl-lib-d1_msg.o", + "ssl/libssl-lib-d1_srtp.o", + "ssl/libssl-lib-methods.o", + "ssl/libssl-lib-pqueue.o", + "ssl/libssl-lib-priority_queue.o", + "ssl/libssl-lib-s3_enc.o", + "ssl/libssl-lib-s3_lib.o", + "ssl/libssl-lib-s3_msg.o", + "ssl/libssl-lib-ssl_asn1.o", + "ssl/libssl-lib-ssl_cert.o", + "ssl/libssl-lib-ssl_cert_comp.o", + "ssl/libssl-lib-ssl_ciph.o", + "ssl/libssl-lib-ssl_conf.o", + "ssl/libssl-lib-ssl_err_legacy.o", + "ssl/libssl-lib-ssl_init.o", + "ssl/libssl-lib-ssl_lib.o", + "ssl/libssl-lib-ssl_mcnf.o", + "ssl/libssl-lib-ssl_rsa.o", + "ssl/libssl-lib-ssl_rsa_legacy.o", + "ssl/libssl-lib-ssl_sess.o", + "ssl/libssl-lib-ssl_stat.o", + "ssl/libssl-lib-ssl_txt.o", + "ssl/libssl-lib-ssl_utst.o", + "ssl/libssl-lib-t1_enc.o", + "ssl/libssl-lib-t1_lib.o", + "ssl/libssl-lib-t1_trce.o", + "ssl/libssl-lib-tls13_enc.o", + "ssl/libssl-lib-tls_depr.o", + "ssl/libssl-lib-tls_srp.o", + "ssl/quic/libssl-lib-cc_newreno.o", + "ssl/quic/libssl-lib-json_enc.o", + "ssl/quic/libssl-lib-qlog.o", + "ssl/quic/libssl-lib-qlog_event_helpers.o", + "ssl/quic/libssl-lib-quic_ackm.o", + "ssl/quic/libssl-lib-quic_cfq.o", + "ssl/quic/libssl-lib-quic_channel.o", + "ssl/quic/libssl-lib-quic_demux.o", + "ssl/quic/libssl-lib-quic_engine.o", + "ssl/quic/libssl-lib-quic_fc.o", + "ssl/quic/libssl-lib-quic_fifd.o", + "ssl/quic/libssl-lib-quic_impl.o", + "ssl/quic/libssl-lib-quic_lcidm.o", + "ssl/quic/libssl-lib-quic_method.o", + "ssl/quic/libssl-lib-quic_obj.o", + "ssl/quic/libssl-lib-quic_port.o", + "ssl/quic/libssl-lib-quic_rcidm.o", + "ssl/quic/libssl-lib-quic_reactor.o", + "ssl/quic/libssl-lib-quic_reactor_wait_ctx.o", + "ssl/quic/libssl-lib-quic_record_rx.o", + "ssl/quic/libssl-lib-quic_record_shared.o", + "ssl/quic/libssl-lib-quic_record_tx.o", + "ssl/quic/libssl-lib-quic_record_util.o", + "ssl/quic/libssl-lib-quic_rstream.o", + "ssl/quic/libssl-lib-quic_rx_depack.o", + "ssl/quic/libssl-lib-quic_sf_list.o", + "ssl/quic/libssl-lib-quic_srt_gen.o", + "ssl/quic/libssl-lib-quic_srtm.o", + "ssl/quic/libssl-lib-quic_sstream.o", + "ssl/quic/libssl-lib-quic_statm.o", + "ssl/quic/libssl-lib-quic_stream_map.o", + "ssl/quic/libssl-lib-quic_thread_assist.o", + "ssl/quic/libssl-lib-quic_tls.o", + "ssl/quic/libssl-lib-quic_tls_api.o", + "ssl/quic/libssl-lib-quic_trace.o", + "ssl/quic/libssl-lib-quic_tserver.o", + "ssl/quic/libssl-lib-quic_txp.o", + "ssl/quic/libssl-lib-quic_txpim.o", + "ssl/quic/libssl-lib-quic_types.o", + "ssl/quic/libssl-lib-quic_wire.o", + "ssl/quic/libssl-lib-quic_wire_pkt.o", + "ssl/quic/libssl-lib-uint_set.o", + "ssl/record/libssl-lib-rec_layer_d1.o", + "ssl/record/libssl-lib-rec_layer_s3.o", + "ssl/record/methods/libssl-lib-dtls_meth.o", + "ssl/record/methods/libssl-lib-ssl3_meth.o", + "ssl/record/methods/libssl-lib-tls13_meth.o", + "ssl/record/methods/libssl-lib-tls1_meth.o", + "ssl/record/methods/libssl-lib-tls_common.o", + "ssl/record/methods/libssl-lib-tls_multib.o", + "ssl/record/methods/libssl-lib-tlsany_meth.o", + "ssl/rio/libssl-lib-poll_builder.o", + "ssl/rio/libssl-lib-poll_immediate.o", + "ssl/rio/libssl-lib-rio_notifier.o", + "ssl/statem/libssl-lib-extensions.o", + "ssl/statem/libssl-lib-extensions_clnt.o", + "ssl/statem/libssl-lib-extensions_cust.o", + "ssl/statem/libssl-lib-extensions_srvr.o", + "ssl/statem/libssl-lib-statem.o", + "ssl/statem/libssl-lib-statem_clnt.o", + "ssl/statem/libssl-lib-statem_dtls.o", + "ssl/statem/libssl-lib-statem_lib.o", + "ssl/statem/libssl-lib-statem_srvr.o" + ], + "providers/common/der/libcommon-lib-der_digests_gen.o" => [ + "providers/common/der/der_digests_gen.c" + ], + "providers/common/der/libcommon-lib-der_dsa_gen.o" => [ + "providers/common/der/der_dsa_gen.c" + ], + "providers/common/der/libcommon-lib-der_dsa_key.o" => [ + "providers/common/der/der_dsa_key.c" + ], + "providers/common/der/libcommon-lib-der_dsa_sig.o" => [ + "providers/common/der/der_dsa_sig.c" + ], + "providers/common/der/libcommon-lib-der_ec_gen.o" => [ + "providers/common/der/der_ec_gen.c" + ], + "providers/common/der/libcommon-lib-der_ec_key.o" => [ + "providers/common/der/der_ec_key.c" + ], + "providers/common/der/libcommon-lib-der_ec_sig.o" => [ + "providers/common/der/der_ec_sig.c" + ], + "providers/common/der/libcommon-lib-der_ecx_gen.o" => [ + "providers/common/der/der_ecx_gen.c" + ], + "providers/common/der/libcommon-lib-der_ecx_key.o" => [ + "providers/common/der/der_ecx_key.c" + ], + "providers/common/der/libcommon-lib-der_ml_dsa_gen.o" => [ + "providers/common/der/der_ml_dsa_gen.c" + ], + "providers/common/der/libcommon-lib-der_ml_dsa_key.o" => [ + "providers/common/der/der_ml_dsa_key.c" + ], + "providers/common/der/libcommon-lib-der_rsa_gen.o" => [ + "providers/common/der/der_rsa_gen.c" + ], + "providers/common/der/libcommon-lib-der_rsa_key.o" => [ + "providers/common/der/der_rsa_key.c" + ], + "providers/common/der/libcommon-lib-der_slh_dsa_gen.o" => [ + "providers/common/der/der_slh_dsa_gen.c" + ], + "providers/common/der/libcommon-lib-der_slh_dsa_key.o" => [ + "providers/common/der/der_slh_dsa_key.c" + ], + "providers/common/der/libcommon-lib-der_wrap_gen.o" => [ + "providers/common/der/der_wrap_gen.c" + ], + "providers/common/der/libdefault-lib-der_rsa_sig.o" => [ + "providers/common/der/der_rsa_sig.c" + ], + "providers/common/der/libdefault-lib-der_sm2_gen.o" => [ + "providers/common/der/der_sm2_gen.c" + ], + "providers/common/der/libdefault-lib-der_sm2_key.o" => [ + "providers/common/der/der_sm2_key.c" + ], + "providers/common/der/libdefault-lib-der_sm2_sig.o" => [ + "providers/common/der/der_sm2_sig.c" + ], + "providers/common/der/libfips-lib-der_rsa_sig.o" => [ + "providers/common/der/der_rsa_sig.c" + ], + "providers/common/libcommon-lib-provider_ctx.o" => [ + "providers/common/provider_ctx.c" + ], + "providers/common/libcommon-lib-provider_err.o" => [ + "providers/common/provider_err.c" + ], + "providers/common/libdefault-lib-bio_prov.o" => [ + "providers/common/bio_prov.c" + ], + "providers/common/libdefault-lib-capabilities.o" => [ + "providers/common/capabilities.c" + ], + "providers/common/libdefault-lib-digest_to_nid.o" => [ + "providers/common/digest_to_nid.c" + ], + "providers/common/libdefault-lib-provider_seeding.o" => [ + "providers/common/provider_seeding.c" + ], + "providers/common/libdefault-lib-provider_util.o" => [ + "providers/common/provider_util.c" + ], + "providers/common/libdefault-lib-securitycheck.o" => [ + "providers/common/securitycheck.c" + ], + "providers/common/libdefault-lib-securitycheck_default.o" => [ + "providers/common/securitycheck_default.c" + ], + "providers/common/libfips-lib-bio_prov.o" => [ + "providers/common/bio_prov.c" + ], + "providers/common/libfips-lib-capabilities.o" => [ + "providers/common/capabilities.c" + ], + "providers/common/libfips-lib-digest_to_nid.o" => [ + "providers/common/digest_to_nid.c" + ], + "providers/common/libfips-lib-provider_seeding.o" => [ + "providers/common/provider_seeding.c" + ], + "providers/common/libfips-lib-provider_util.o" => [ + "providers/common/provider_util.c" + ], + "providers/common/libfips-lib-securitycheck.o" => [ + "providers/common/securitycheck.c" + ], + "providers/common/libfips-lib-securitycheck_fips.o" => [ + "providers/common/securitycheck_fips.c" + ], + "providers/fips" => [ + "providers/fips.ld", + "providers/fips/fips-dso-fips_entry.o" + ], + "providers/fips/fips-dso-fips_entry.o" => [ + "providers/fips/fips_entry.c" + ], + "providers/fips/libfips-lib-fipsindicator.o" => [ + "providers/fips/fipsindicator.c" + ], + "providers/fips/libfips-lib-fipsprov.o" => [ + "providers/fips/fipsprov.c" + ], + "providers/fips/libfips-lib-self_test.o" => [ + "providers/fips/self_test.c" + ], + "providers/fips/libfips-lib-self_test_kats.o" => [ + "providers/fips/self_test_kats.c" + ], + "providers/implementations/asymciphers/libdefault-lib-rsa_enc.o" => [ + "providers/implementations/asymciphers/rsa_enc.c" + ], + "providers/implementations/asymciphers/libdefault-lib-sm2_enc.o" => [ + "providers/implementations/asymciphers/sm2_enc.c" + ], + "providers/implementations/asymciphers/libfips-lib-rsa_enc.o" => [ + "providers/implementations/asymciphers/rsa_enc.c" + ], + "providers/implementations/ciphers/libcommon-lib-ciphercommon.o" => [ + "providers/implementations/ciphers/ciphercommon.c" + ], + "providers/implementations/ciphers/libcommon-lib-ciphercommon_block.o" => [ + "providers/implementations/ciphers/ciphercommon_block.c" + ], + "providers/implementations/ciphers/libcommon-lib-ciphercommon_ccm.o" => [ + "providers/implementations/ciphers/ciphercommon_ccm.c" + ], + "providers/implementations/ciphers/libcommon-lib-ciphercommon_ccm_hw.o" => [ + "providers/implementations/ciphers/ciphercommon_ccm_hw.c" + ], + "providers/implementations/ciphers/libcommon-lib-ciphercommon_gcm.o" => [ + "providers/implementations/ciphers/ciphercommon_gcm.c" + ], + "providers/implementations/ciphers/libcommon-lib-ciphercommon_gcm_hw.o" => [ + "providers/implementations/ciphers/ciphercommon_gcm_hw.c" + ], + "providers/implementations/ciphers/libcommon-lib-ciphercommon_hw.o" => [ + "providers/implementations/ciphers/ciphercommon_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes.o" => [ + "providers/implementations/ciphers/cipher_aes.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha.o" => [ + "providers/implementations/ciphers/cipher_aes_cbc_hmac_sha.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha1_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_cbc_hmac_sha1_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha256_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_cbc_hmac_sha256_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ccm.o" => [ + "providers/implementations/ciphers/cipher_aes_ccm.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ccm_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_ccm_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm.o" => [ + "providers/implementations/ciphers/cipher_aes_gcm.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_gcm_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv.o" => [ + "providers/implementations/ciphers/cipher_aes_gcm_siv.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_gcm_siv_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv_polyval.o" => [ + "providers/implementations/ciphers/cipher_aes_gcm_siv_polyval.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ocb.o" => [ + "providers/implementations/ciphers/cipher_aes_ocb.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ocb_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_ocb_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_siv.o" => [ + "providers/implementations/ciphers/cipher_aes_siv.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_siv_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_siv_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_wrp.o" => [ + "providers/implementations/ciphers/cipher_aes_wrp.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts.o" => [ + "providers/implementations/ciphers/cipher_aes_xts.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts_fips.o" => [ + "providers/implementations/ciphers/cipher_aes_xts_fips.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_xts_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aria.o" => [ + "providers/implementations/ciphers/cipher_aria.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aria_ccm.o" => [ + "providers/implementations/ciphers/cipher_aria_ccm.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aria_ccm_hw.o" => [ + "providers/implementations/ciphers/cipher_aria_ccm_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aria_gcm.o" => [ + "providers/implementations/ciphers/cipher_aria_gcm.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aria_gcm_hw.o" => [ + "providers/implementations/ciphers/cipher_aria_gcm_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aria_hw.o" => [ + "providers/implementations/ciphers/cipher_aria_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_camellia.o" => [ + "providers/implementations/ciphers/cipher_camellia.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_camellia_hw.o" => [ + "providers/implementations/ciphers/cipher_camellia_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20.o" => [ + "providers/implementations/ciphers/cipher_chacha20.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_hw.o" => [ + "providers/implementations/ciphers/cipher_chacha20_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_poly1305.o" => [ + "providers/implementations/ciphers/cipher_chacha20_poly1305.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_poly1305_hw.o" => [ + "providers/implementations/ciphers/cipher_chacha20_poly1305_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_cts.o" => [ + "providers/implementations/ciphers/cipher_cts.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_null.o" => [ + "providers/implementations/ciphers/cipher_null.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4.o" => [ + "providers/implementations/ciphers/cipher_sm4.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_ccm.o" => [ + "providers/implementations/ciphers/cipher_sm4_ccm.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_ccm_hw.o" => [ + "providers/implementations/ciphers/cipher_sm4_ccm_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_gcm.o" => [ + "providers/implementations/ciphers/cipher_sm4_gcm.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_gcm_hw.o" => [ + "providers/implementations/ciphers/cipher_sm4_gcm_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_hw.o" => [ + "providers/implementations/ciphers/cipher_sm4_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_xts.o" => [ + "providers/implementations/ciphers/cipher_sm4_xts.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_xts_hw.o" => [ + "providers/implementations/ciphers/cipher_sm4_xts_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_tdes.o" => [ + "providers/implementations/ciphers/cipher_tdes.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_common.o" => [ + "providers/implementations/ciphers/cipher_tdes_common.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_default.o" => [ + "providers/implementations/ciphers/cipher_tdes_default.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_default_hw.o" => [ + "providers/implementations/ciphers/cipher_tdes_default_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_hw.o" => [ + "providers/implementations/ciphers/cipher_tdes_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_wrap.o" => [ + "providers/implementations/ciphers/cipher_tdes_wrap.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_wrap_hw.o" => [ + "providers/implementations/ciphers/cipher_tdes_wrap_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes.o" => [ + "providers/implementations/ciphers/cipher_aes.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha.o" => [ + "providers/implementations/ciphers/cipher_aes_cbc_hmac_sha.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha1_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_cbc_hmac_sha1_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha256_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_cbc_hmac_sha256_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_ccm.o" => [ + "providers/implementations/ciphers/cipher_aes_ccm.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_ccm_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_ccm_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_gcm.o" => [ + "providers/implementations/ciphers/cipher_aes_gcm.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_gcm_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_gcm_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_ocb.o" => [ + "providers/implementations/ciphers/cipher_aes_ocb.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_ocb_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_ocb_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_wrp.o" => [ + "providers/implementations/ciphers/cipher_aes_wrp.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts.o" => [ + "providers/implementations/ciphers/cipher_aes_xts.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts_fips.o" => [ + "providers/implementations/ciphers/cipher_aes_xts_fips.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_xts_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_cts.o" => [ + "providers/implementations/ciphers/cipher_cts.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_tdes.o" => [ + "providers/implementations/ciphers/cipher_tdes.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_tdes_common.o" => [ + "providers/implementations/ciphers/cipher_tdes_common.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_tdes_hw.o" => [ + "providers/implementations/ciphers/cipher_tdes_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_blowfish.o" => [ + "providers/implementations/ciphers/cipher_blowfish.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_blowfish_hw.o" => [ + "providers/implementations/ciphers/cipher_blowfish_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_cast5.o" => [ + "providers/implementations/ciphers/cipher_cast5.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_cast5_hw.o" => [ + "providers/implementations/ciphers/cipher_cast5_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_des.o" => [ + "providers/implementations/ciphers/cipher_des.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_des_hw.o" => [ + "providers/implementations/ciphers/cipher_des_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_desx.o" => [ + "providers/implementations/ciphers/cipher_desx.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_desx_hw.o" => [ + "providers/implementations/ciphers/cipher_desx_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_idea.o" => [ + "providers/implementations/ciphers/cipher_idea.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_idea_hw.o" => [ + "providers/implementations/ciphers/cipher_idea_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_rc2.o" => [ + "providers/implementations/ciphers/cipher_rc2.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_rc2_hw.o" => [ + "providers/implementations/ciphers/cipher_rc2_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4.o" => [ + "providers/implementations/ciphers/cipher_rc4.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hmac_md5.o" => [ + "providers/implementations/ciphers/cipher_rc4_hmac_md5.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hmac_md5_hw.o" => [ + "providers/implementations/ciphers/cipher_rc4_hmac_md5_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hw.o" => [ + "providers/implementations/ciphers/cipher_rc4_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_seed.o" => [ + "providers/implementations/ciphers/cipher_seed.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_seed_hw.o" => [ + "providers/implementations/ciphers/cipher_seed_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_tdes_common.o" => [ + "providers/implementations/ciphers/cipher_tdes_common.c" + ], + "providers/implementations/digests/libcommon-lib-digestcommon.o" => [ + "providers/implementations/digests/digestcommon.c" + ], + "providers/implementations/digests/libdefault-lib-blake2_prov.o" => [ + "providers/implementations/digests/blake2_prov.c" + ], + "providers/implementations/digests/libdefault-lib-blake2b_prov.o" => [ + "providers/implementations/digests/blake2b_prov.c" + ], + "providers/implementations/digests/libdefault-lib-blake2s_prov.o" => [ + "providers/implementations/digests/blake2s_prov.c" + ], + "providers/implementations/digests/libdefault-lib-md5_prov.o" => [ + "providers/implementations/digests/md5_prov.c" + ], + "providers/implementations/digests/libdefault-lib-md5_sha1_prov.o" => [ + "providers/implementations/digests/md5_sha1_prov.c" + ], + "providers/implementations/digests/libdefault-lib-null_prov.o" => [ + "providers/implementations/digests/null_prov.c" + ], + "providers/implementations/digests/libdefault-lib-ripemd_prov.o" => [ + "providers/implementations/digests/ripemd_prov.c" + ], + "providers/implementations/digests/libdefault-lib-sha2_prov.o" => [ + "providers/implementations/digests/sha2_prov.c" + ], + "providers/implementations/digests/libdefault-lib-sha3_prov.o" => [ + "providers/implementations/digests/sha3_prov.c" + ], + "providers/implementations/digests/libdefault-lib-sm3_prov.o" => [ + "providers/implementations/digests/sm3_prov.c" + ], + "providers/implementations/digests/libfips-lib-sha2_prov.o" => [ + "providers/implementations/digests/sha2_prov.c" + ], + "providers/implementations/digests/libfips-lib-sha3_prov.o" => [ + "providers/implementations/digests/sha3_prov.c" + ], + "providers/implementations/digests/liblegacy-lib-md4_prov.o" => [ + "providers/implementations/digests/md4_prov.c" + ], + "providers/implementations/digests/liblegacy-lib-mdc2_prov.o" => [ + "providers/implementations/digests/mdc2_prov.c" + ], + "providers/implementations/digests/liblegacy-lib-ripemd_prov.o" => [ + "providers/implementations/digests/ripemd_prov.c" + ], + "providers/implementations/digests/liblegacy-lib-wp_prov.o" => [ + "providers/implementations/digests/wp_prov.c" + ], + "providers/implementations/encode_decode/libdefault-lib-decode_der2key.o" => [ + "providers/implementations/encode_decode/decode_der2key.c" + ], + "providers/implementations/encode_decode/libdefault-lib-decode_epki2pki.o" => [ + "providers/implementations/encode_decode/decode_epki2pki.c" + ], + "providers/implementations/encode_decode/libdefault-lib-decode_msblob2key.o" => [ + "providers/implementations/encode_decode/decode_msblob2key.c" + ], + "providers/implementations/encode_decode/libdefault-lib-decode_pem2der.o" => [ + "providers/implementations/encode_decode/decode_pem2der.c" + ], + "providers/implementations/encode_decode/libdefault-lib-decode_pvk2key.o" => [ + "providers/implementations/encode_decode/decode_pvk2key.c" + ], + "providers/implementations/encode_decode/libdefault-lib-decode_spki2typespki.o" => [ + "providers/implementations/encode_decode/decode_spki2typespki.c" + ], + "providers/implementations/encode_decode/libdefault-lib-encode_key2any.o" => [ + "providers/implementations/encode_decode/encode_key2any.c" + ], + "providers/implementations/encode_decode/libdefault-lib-encode_key2blob.o" => [ + "providers/implementations/encode_decode/encode_key2blob.c" + ], + "providers/implementations/encode_decode/libdefault-lib-encode_key2ms.o" => [ + "providers/implementations/encode_decode/encode_key2ms.c" + ], + "providers/implementations/encode_decode/libdefault-lib-encode_key2text.o" => [ + "providers/implementations/encode_decode/encode_key2text.c" + ], + "providers/implementations/encode_decode/libdefault-lib-endecoder_common.o" => [ + "providers/implementations/encode_decode/endecoder_common.c" + ], + "providers/implementations/encode_decode/libdefault-lib-ml_common_codecs.o" => [ + "providers/implementations/encode_decode/ml_common_codecs.c" + ], + "providers/implementations/encode_decode/libdefault-lib-ml_dsa_codecs.o" => [ + "providers/implementations/encode_decode/ml_dsa_codecs.c" + ], + "providers/implementations/encode_decode/libdefault-lib-ml_kem_codecs.o" => [ + "providers/implementations/encode_decode/ml_kem_codecs.c" + ], + "providers/implementations/exchange/libdefault-lib-dh_exch.o" => [ + "providers/implementations/exchange/dh_exch.c" + ], + "providers/implementations/exchange/libdefault-lib-ecdh_exch.o" => [ + "providers/implementations/exchange/ecdh_exch.c" + ], + "providers/implementations/exchange/libdefault-lib-ecx_exch.o" => [ + "providers/implementations/exchange/ecx_exch.c" + ], + "providers/implementations/exchange/libdefault-lib-kdf_exch.o" => [ + "providers/implementations/exchange/kdf_exch.c" + ], + "providers/implementations/exchange/libfips-lib-dh_exch.o" => [ + "providers/implementations/exchange/dh_exch.c" + ], + "providers/implementations/exchange/libfips-lib-ecdh_exch.o" => [ + "providers/implementations/exchange/ecdh_exch.c" + ], + "providers/implementations/exchange/libfips-lib-ecx_exch.o" => [ + "providers/implementations/exchange/ecx_exch.c" + ], + "providers/implementations/exchange/libfips-lib-kdf_exch.o" => [ + "providers/implementations/exchange/kdf_exch.c" + ], + "providers/implementations/kdfs/libdefault-lib-argon2.o" => [ + "providers/implementations/kdfs/argon2.c" + ], + "providers/implementations/kdfs/libdefault-lib-hkdf.o" => [ + "providers/implementations/kdfs/hkdf.c" + ], + "providers/implementations/kdfs/libdefault-lib-hmacdrbg_kdf.o" => [ + "providers/implementations/kdfs/hmacdrbg_kdf.c" + ], + "providers/implementations/kdfs/libdefault-lib-kbkdf.o" => [ + "providers/implementations/kdfs/kbkdf.c" + ], + "providers/implementations/kdfs/libdefault-lib-krb5kdf.o" => [ + "providers/implementations/kdfs/krb5kdf.c" + ], + "providers/implementations/kdfs/libdefault-lib-pbkdf2.o" => [ + "providers/implementations/kdfs/pbkdf2.c" + ], + "providers/implementations/kdfs/libdefault-lib-pbkdf2_fips.o" => [ + "providers/implementations/kdfs/pbkdf2_fips.c" + ], + "providers/implementations/kdfs/libdefault-lib-pkcs12kdf.o" => [ + "providers/implementations/kdfs/pkcs12kdf.c" + ], + "providers/implementations/kdfs/libdefault-lib-scrypt.o" => [ + "providers/implementations/kdfs/scrypt.c" + ], + "providers/implementations/kdfs/libdefault-lib-sshkdf.o" => [ + "providers/implementations/kdfs/sshkdf.c" + ], + "providers/implementations/kdfs/libdefault-lib-sskdf.o" => [ + "providers/implementations/kdfs/sskdf.c" + ], + "providers/implementations/kdfs/libdefault-lib-tls1_prf.o" => [ + "providers/implementations/kdfs/tls1_prf.c" + ], + "providers/implementations/kdfs/libdefault-lib-x942kdf.o" => [ + "providers/implementations/kdfs/x942kdf.c" + ], + "providers/implementations/kdfs/libfips-lib-hkdf.o" => [ + "providers/implementations/kdfs/hkdf.c" + ], + "providers/implementations/kdfs/libfips-lib-kbkdf.o" => [ + "providers/implementations/kdfs/kbkdf.c" + ], + "providers/implementations/kdfs/libfips-lib-pbkdf2.o" => [ + "providers/implementations/kdfs/pbkdf2.c" + ], + "providers/implementations/kdfs/libfips-lib-pbkdf2_fips.o" => [ + "providers/implementations/kdfs/pbkdf2_fips.c" + ], + "providers/implementations/kdfs/libfips-lib-sshkdf.o" => [ + "providers/implementations/kdfs/sshkdf.c" + ], + "providers/implementations/kdfs/libfips-lib-sskdf.o" => [ + "providers/implementations/kdfs/sskdf.c" + ], + "providers/implementations/kdfs/libfips-lib-tls1_prf.o" => [ + "providers/implementations/kdfs/tls1_prf.c" + ], + "providers/implementations/kdfs/libfips-lib-x942kdf.o" => [ + "providers/implementations/kdfs/x942kdf.c" + ], + "providers/implementations/kdfs/liblegacy-lib-pbkdf1.o" => [ + "providers/implementations/kdfs/pbkdf1.c" + ], + "providers/implementations/kdfs/liblegacy-lib-pvkkdf.o" => [ + "providers/implementations/kdfs/pvkkdf.c" + ], + "providers/implementations/kem/libdefault-lib-ec_kem.o" => [ + "providers/implementations/kem/ec_kem.c" + ], + "providers/implementations/kem/libdefault-lib-ecx_kem.o" => [ + "providers/implementations/kem/ecx_kem.c" + ], + "providers/implementations/kem/libdefault-lib-kem_util.o" => [ + "providers/implementations/kem/kem_util.c" + ], + "providers/implementations/kem/libdefault-lib-ml_kem_kem.o" => [ + "providers/implementations/kem/ml_kem_kem.c" + ], + "providers/implementations/kem/libdefault-lib-mlx_kem.o" => [ + "providers/implementations/kem/mlx_kem.c" + ], + "providers/implementations/kem/libdefault-lib-rsa_kem.o" => [ + "providers/implementations/kem/rsa_kem.c" + ], + "providers/implementations/kem/libfips-lib-ml_kem_kem.o" => [ + "providers/implementations/kem/ml_kem_kem.c" + ], + "providers/implementations/kem/libfips-lib-mlx_kem.o" => [ + "providers/implementations/kem/mlx_kem.c" + ], + "providers/implementations/kem/libfips-lib-rsa_kem.o" => [ + "providers/implementations/kem/rsa_kem.c" + ], + "providers/implementations/kem/libtemplate-lib-template_kem.o" => [ + "providers/implementations/kem/template_kem.c" + ], + "providers/implementations/keymgmt/libdefault-lib-dh_kmgmt.o" => [ + "providers/implementations/keymgmt/dh_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-dsa_kmgmt.o" => [ + "providers/implementations/keymgmt/dsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-ec_kmgmt.o" => [ + "providers/implementations/keymgmt/ec_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-ecx_kmgmt.o" => [ + "providers/implementations/keymgmt/ecx_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-kdf_legacy_kmgmt.o" => [ + "providers/implementations/keymgmt/kdf_legacy_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-mac_legacy_kmgmt.o" => [ + "providers/implementations/keymgmt/mac_legacy_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-ml_dsa_kmgmt.o" => [ + "providers/implementations/keymgmt/ml_dsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-ml_kem_kmgmt.o" => [ + "providers/implementations/keymgmt/ml_kem_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-mlx_kmgmt.o" => [ + "providers/implementations/keymgmt/mlx_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-rsa_kmgmt.o" => [ + "providers/implementations/keymgmt/rsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-slh_dsa_kmgmt.o" => [ + "providers/implementations/keymgmt/slh_dsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-dh_kmgmt.o" => [ + "providers/implementations/keymgmt/dh_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-dsa_kmgmt.o" => [ + "providers/implementations/keymgmt/dsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-ec_kmgmt.o" => [ + "providers/implementations/keymgmt/ec_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-ecx_kmgmt.o" => [ + "providers/implementations/keymgmt/ecx_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-kdf_legacy_kmgmt.o" => [ + "providers/implementations/keymgmt/kdf_legacy_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-mac_legacy_kmgmt.o" => [ + "providers/implementations/keymgmt/mac_legacy_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-ml_dsa_kmgmt.o" => [ + "providers/implementations/keymgmt/ml_dsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-ml_kem_kmgmt.o" => [ + "providers/implementations/keymgmt/ml_kem_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-mlx_kmgmt.o" => [ + "providers/implementations/keymgmt/mlx_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-rsa_kmgmt.o" => [ + "providers/implementations/keymgmt/rsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-slh_dsa_kmgmt.o" => [ + "providers/implementations/keymgmt/slh_dsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libtemplate-lib-template_kmgmt.o" => [ + "providers/implementations/keymgmt/template_kmgmt.c" + ], + "providers/implementations/macs/libdefault-lib-blake2b_mac.o" => [ + "providers/implementations/macs/blake2b_mac.c" + ], + "providers/implementations/macs/libdefault-lib-blake2s_mac.o" => [ + "providers/implementations/macs/blake2s_mac.c" + ], + "providers/implementations/macs/libdefault-lib-cmac_prov.o" => [ + "providers/implementations/macs/cmac_prov.c" + ], + "providers/implementations/macs/libdefault-lib-gmac_prov.o" => [ + "providers/implementations/macs/gmac_prov.c" + ], + "providers/implementations/macs/libdefault-lib-hmac_prov.o" => [ + "providers/implementations/macs/hmac_prov.c" + ], + "providers/implementations/macs/libdefault-lib-kmac_prov.o" => [ + "providers/implementations/macs/kmac_prov.c" + ], + "providers/implementations/macs/libdefault-lib-poly1305_prov.o" => [ + "providers/implementations/macs/poly1305_prov.c" + ], + "providers/implementations/macs/libdefault-lib-siphash_prov.o" => [ + "providers/implementations/macs/siphash_prov.c" + ], + "providers/implementations/macs/libfips-lib-cmac_prov.o" => [ + "providers/implementations/macs/cmac_prov.c" + ], + "providers/implementations/macs/libfips-lib-gmac_prov.o" => [ + "providers/implementations/macs/gmac_prov.c" + ], + "providers/implementations/macs/libfips-lib-hmac_prov.o" => [ + "providers/implementations/macs/hmac_prov.c" + ], + "providers/implementations/macs/libfips-lib-kmac_prov.o" => [ + "providers/implementations/macs/kmac_prov.c" + ], + "providers/implementations/rands/libdefault-lib-drbg.o" => [ + "providers/implementations/rands/drbg.c" + ], + "providers/implementations/rands/libdefault-lib-drbg_ctr.o" => [ + "providers/implementations/rands/drbg_ctr.c" + ], + "providers/implementations/rands/libdefault-lib-drbg_hash.o" => [ + "providers/implementations/rands/drbg_hash.c" + ], + "providers/implementations/rands/libdefault-lib-drbg_hmac.o" => [ + "providers/implementations/rands/drbg_hmac.c" + ], + "providers/implementations/rands/libdefault-lib-seed_src.o" => [ + "providers/implementations/rands/seed_src.c" + ], + "providers/implementations/rands/libdefault-lib-seed_src_jitter.o" => [ + "providers/implementations/rands/seed_src_jitter.c" + ], + "providers/implementations/rands/libdefault-lib-test_rng.o" => [ + "providers/implementations/rands/test_rng.c" + ], + "providers/implementations/rands/libfips-lib-drbg.o" => [ + "providers/implementations/rands/drbg.c" + ], + "providers/implementations/rands/libfips-lib-drbg_ctr.o" => [ + "providers/implementations/rands/drbg_ctr.c" + ], + "providers/implementations/rands/libfips-lib-drbg_hash.o" => [ + "providers/implementations/rands/drbg_hash.c" + ], + "providers/implementations/rands/libfips-lib-drbg_hmac.o" => [ + "providers/implementations/rands/drbg_hmac.c" + ], + "providers/implementations/rands/libfips-lib-fips_crng_test.o" => [ + "providers/implementations/rands/fips_crng_test.c" + ], + "providers/implementations/rands/libfips-lib-test_rng.o" => [ + "providers/implementations/rands/test_rng.c" + ], + "providers/implementations/rands/seeding/libdefault-lib-rand_cpu_x86.o" => [ + "providers/implementations/rands/seeding/rand_cpu_x86.c" + ], + "providers/implementations/rands/seeding/libdefault-lib-rand_tsc.o" => [ + "providers/implementations/rands/seeding/rand_tsc.c" + ], + "providers/implementations/rands/seeding/libdefault-lib-rand_unix.o" => [ + "providers/implementations/rands/seeding/rand_unix.c" + ], + "providers/implementations/rands/seeding/libdefault-lib-rand_win.o" => [ + "providers/implementations/rands/seeding/rand_win.c" + ], + "providers/implementations/signature/libdefault-lib-dsa_sig.o" => [ + "providers/implementations/signature/dsa_sig.c" + ], + "providers/implementations/signature/libdefault-lib-ecdsa_sig.o" => [ + "providers/implementations/signature/ecdsa_sig.c" + ], + "providers/implementations/signature/libdefault-lib-eddsa_sig.o" => [ + "providers/implementations/signature/eddsa_sig.c" + ], + "providers/implementations/signature/libdefault-lib-mac_legacy_sig.o" => [ + "providers/implementations/signature/mac_legacy_sig.c" + ], + "providers/implementations/signature/libdefault-lib-ml_dsa_sig.o" => [ + "providers/implementations/signature/ml_dsa_sig.c" + ], + "providers/implementations/signature/libdefault-lib-rsa_sig.o" => [ + "providers/implementations/signature/rsa_sig.c" + ], + "providers/implementations/signature/libdefault-lib-slh_dsa_sig.o" => [ + "providers/implementations/signature/slh_dsa_sig.c" + ], + "providers/implementations/signature/libdefault-lib-sm2_sig.o" => [ + "providers/implementations/signature/sm2_sig.c" + ], + "providers/implementations/signature/libfips-lib-dsa_sig.o" => [ + "providers/implementations/signature/dsa_sig.c" + ], + "providers/implementations/signature/libfips-lib-ecdsa_sig.o" => [ + "providers/implementations/signature/ecdsa_sig.c" + ], + "providers/implementations/signature/libfips-lib-eddsa_sig.o" => [ + "providers/implementations/signature/eddsa_sig.c" + ], + "providers/implementations/signature/libfips-lib-mac_legacy_sig.o" => [ + "providers/implementations/signature/mac_legacy_sig.c" + ], + "providers/implementations/signature/libfips-lib-ml_dsa_sig.o" => [ + "providers/implementations/signature/ml_dsa_sig.c" + ], + "providers/implementations/signature/libfips-lib-rsa_sig.o" => [ + "providers/implementations/signature/rsa_sig.c" + ], + "providers/implementations/signature/libfips-lib-slh_dsa_sig.o" => [ + "providers/implementations/signature/slh_dsa_sig.c" + ], + "providers/implementations/skeymgmt/libdefault-lib-aes_skmgmt.o" => [ + "providers/implementations/skeymgmt/aes_skmgmt.c" + ], + "providers/implementations/skeymgmt/libdefault-lib-generic.o" => [ + "providers/implementations/skeymgmt/generic.c" + ], + "providers/implementations/skeymgmt/libfips-lib-aes_skmgmt.o" => [ + "providers/implementations/skeymgmt/aes_skmgmt.c" + ], + "providers/implementations/skeymgmt/libfips-lib-generic.o" => [ + "providers/implementations/skeymgmt/generic.c" + ], + "providers/implementations/storemgmt/libdefault-lib-file_store.o" => [ + "providers/implementations/storemgmt/file_store.c" + ], + "providers/implementations/storemgmt/libdefault-lib-file_store_any2obj.o" => [ + "providers/implementations/storemgmt/file_store_any2obj.c" + ], + "providers/legacy" => [ + "providers/legacy-dso-legacyprov.o", + "providers/legacy.ld" + ], + "providers/legacy-dso-legacyprov.o" => [ + "providers/legacyprov.c" + ], + "providers/libcommon.a" => [ + "providers/common/der/libcommon-lib-der_digests_gen.o", + "providers/common/der/libcommon-lib-der_dsa_gen.o", + "providers/common/der/libcommon-lib-der_dsa_key.o", + "providers/common/der/libcommon-lib-der_dsa_sig.o", + "providers/common/der/libcommon-lib-der_ec_gen.o", + "providers/common/der/libcommon-lib-der_ec_key.o", + "providers/common/der/libcommon-lib-der_ec_sig.o", + "providers/common/der/libcommon-lib-der_ecx_gen.o", + "providers/common/der/libcommon-lib-der_ecx_key.o", + "providers/common/der/libcommon-lib-der_ml_dsa_gen.o", + "providers/common/der/libcommon-lib-der_ml_dsa_key.o", + "providers/common/der/libcommon-lib-der_rsa_gen.o", + "providers/common/der/libcommon-lib-der_rsa_key.o", + "providers/common/der/libcommon-lib-der_slh_dsa_gen.o", + "providers/common/der/libcommon-lib-der_slh_dsa_key.o", + "providers/common/der/libcommon-lib-der_wrap_gen.o", + "providers/common/libcommon-lib-provider_ctx.o", + "providers/common/libcommon-lib-provider_err.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_block.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_ccm.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_ccm_hw.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_gcm.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_gcm_hw.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_hw.o", + "providers/implementations/digests/libcommon-lib-digestcommon.o", + "ssl/record/methods/libcommon-lib-tls_pad.o" + ], + "providers/libcrypto-lib-baseprov.o" => [ + "providers/baseprov.c" + ], + "providers/libcrypto-lib-defltprov.o" => [ + "providers/defltprov.c" + ], + "providers/libcrypto-lib-nullprov.o" => [ + "providers/nullprov.c" + ], + "providers/libcrypto-lib-prov_running.o" => [ + "providers/prov_running.c" + ], + "providers/libdefault.a" => [ + "providers/common/der/libdefault-lib-der_rsa_sig.o", + "providers/common/der/libdefault-lib-der_sm2_gen.o", + "providers/common/der/libdefault-lib-der_sm2_key.o", + "providers/common/der/libdefault-lib-der_sm2_sig.o", + "providers/common/libdefault-lib-bio_prov.o", + "providers/common/libdefault-lib-capabilities.o", + "providers/common/libdefault-lib-digest_to_nid.o", + "providers/common/libdefault-lib-provider_seeding.o", + "providers/common/libdefault-lib-provider_util.o", + "providers/common/libdefault-lib-securitycheck.o", + "providers/common/libdefault-lib-securitycheck_default.o", + "providers/implementations/asymciphers/libdefault-lib-rsa_enc.o", + "providers/implementations/asymciphers/libdefault-lib-sm2_enc.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha1_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha256_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ccm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ccm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv_polyval.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ocb.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ocb_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_siv.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_siv_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_wrp.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts_fips.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_ccm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_ccm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_gcm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_gcm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_camellia.o", + "providers/implementations/ciphers/libdefault-lib-cipher_camellia_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_poly1305.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_poly1305_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_cts.o", + "providers/implementations/ciphers/libdefault-lib-cipher_null.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_ccm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_ccm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_gcm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_gcm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_xts.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_xts_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_common.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_default.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_default_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_wrap.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_wrap_hw.o", + "providers/implementations/digests/libdefault-lib-blake2_prov.o", + "providers/implementations/digests/libdefault-lib-blake2b_prov.o", + "providers/implementations/digests/libdefault-lib-blake2s_prov.o", + "providers/implementations/digests/libdefault-lib-md5_prov.o", + "providers/implementations/digests/libdefault-lib-md5_sha1_prov.o", + "providers/implementations/digests/libdefault-lib-null_prov.o", + "providers/implementations/digests/libdefault-lib-ripemd_prov.o", + "providers/implementations/digests/libdefault-lib-sha2_prov.o", + "providers/implementations/digests/libdefault-lib-sha3_prov.o", + "providers/implementations/digests/libdefault-lib-sm3_prov.o", + "providers/implementations/encode_decode/libdefault-lib-decode_der2key.o", + "providers/implementations/encode_decode/libdefault-lib-decode_epki2pki.o", + "providers/implementations/encode_decode/libdefault-lib-decode_msblob2key.o", + "providers/implementations/encode_decode/libdefault-lib-decode_pem2der.o", + "providers/implementations/encode_decode/libdefault-lib-decode_pvk2key.o", + "providers/implementations/encode_decode/libdefault-lib-decode_spki2typespki.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2any.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2blob.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2ms.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2text.o", + "providers/implementations/encode_decode/libdefault-lib-endecoder_common.o", + "providers/implementations/encode_decode/libdefault-lib-ml_common_codecs.o", + "providers/implementations/encode_decode/libdefault-lib-ml_dsa_codecs.o", + "providers/implementations/encode_decode/libdefault-lib-ml_kem_codecs.o", + "providers/implementations/exchange/libdefault-lib-dh_exch.o", + "providers/implementations/exchange/libdefault-lib-ecdh_exch.o", + "providers/implementations/exchange/libdefault-lib-ecx_exch.o", + "providers/implementations/exchange/libdefault-lib-kdf_exch.o", + "providers/implementations/kdfs/libdefault-lib-argon2.o", + "providers/implementations/kdfs/libdefault-lib-hkdf.o", + "providers/implementations/kdfs/libdefault-lib-hmacdrbg_kdf.o", + "providers/implementations/kdfs/libdefault-lib-kbkdf.o", + "providers/implementations/kdfs/libdefault-lib-krb5kdf.o", + "providers/implementations/kdfs/libdefault-lib-pbkdf2.o", + "providers/implementations/kdfs/libdefault-lib-pbkdf2_fips.o", + "providers/implementations/kdfs/libdefault-lib-pkcs12kdf.o", + "providers/implementations/kdfs/libdefault-lib-scrypt.o", + "providers/implementations/kdfs/libdefault-lib-sshkdf.o", + "providers/implementations/kdfs/libdefault-lib-sskdf.o", + "providers/implementations/kdfs/libdefault-lib-tls1_prf.o", + "providers/implementations/kdfs/libdefault-lib-x942kdf.o", + "providers/implementations/kem/libdefault-lib-ec_kem.o", + "providers/implementations/kem/libdefault-lib-ecx_kem.o", + "providers/implementations/kem/libdefault-lib-kem_util.o", + "providers/implementations/kem/libdefault-lib-ml_kem_kem.o", + "providers/implementations/kem/libdefault-lib-mlx_kem.o", + "providers/implementations/kem/libdefault-lib-rsa_kem.o", + "providers/implementations/keymgmt/libdefault-lib-dh_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-dsa_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ec_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ecx_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-kdf_legacy_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-mac_legacy_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ml_dsa_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ml_kem_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-mlx_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-rsa_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-slh_dsa_kmgmt.o", + "providers/implementations/macs/libdefault-lib-blake2b_mac.o", + "providers/implementations/macs/libdefault-lib-blake2s_mac.o", + "providers/implementations/macs/libdefault-lib-cmac_prov.o", + "providers/implementations/macs/libdefault-lib-gmac_prov.o", + "providers/implementations/macs/libdefault-lib-hmac_prov.o", + "providers/implementations/macs/libdefault-lib-kmac_prov.o", + "providers/implementations/macs/libdefault-lib-poly1305_prov.o", + "providers/implementations/macs/libdefault-lib-siphash_prov.o", + "providers/implementations/rands/libdefault-lib-drbg.o", + "providers/implementations/rands/libdefault-lib-drbg_ctr.o", + "providers/implementations/rands/libdefault-lib-drbg_hash.o", + "providers/implementations/rands/libdefault-lib-drbg_hmac.o", + "providers/implementations/rands/libdefault-lib-seed_src.o", + "providers/implementations/rands/libdefault-lib-seed_src_jitter.o", + "providers/implementations/rands/libdefault-lib-test_rng.o", + "providers/implementations/rands/seeding/libdefault-lib-rand_cpu_x86.o", + "providers/implementations/rands/seeding/libdefault-lib-rand_tsc.o", + "providers/implementations/rands/seeding/libdefault-lib-rand_unix.o", + "providers/implementations/rands/seeding/libdefault-lib-rand_win.o", + "providers/implementations/signature/libdefault-lib-dsa_sig.o", + "providers/implementations/signature/libdefault-lib-ecdsa_sig.o", + "providers/implementations/signature/libdefault-lib-eddsa_sig.o", + "providers/implementations/signature/libdefault-lib-mac_legacy_sig.o", + "providers/implementations/signature/libdefault-lib-ml_dsa_sig.o", + "providers/implementations/signature/libdefault-lib-rsa_sig.o", + "providers/implementations/signature/libdefault-lib-slh_dsa_sig.o", + "providers/implementations/signature/libdefault-lib-sm2_sig.o", + "providers/implementations/skeymgmt/libdefault-lib-aes_skmgmt.o", + "providers/implementations/skeymgmt/libdefault-lib-generic.o", + "providers/implementations/storemgmt/libdefault-lib-file_store.o", + "providers/implementations/storemgmt/libdefault-lib-file_store_any2obj.o", + "ssl/record/methods/libdefault-lib-ssl3_cbc.o" + ], + "providers/libfips.a" => [ + "crypto/aes/libfips-lib-aes-riscv64-zkn.o", + "crypto/aes/libfips-lib-aes-riscv64-zvbb-zvkg-zvkned.o", + "crypto/aes/libfips-lib-aes-riscv64-zvkb-zvkned.o", + "crypto/aes/libfips-lib-aes-riscv64-zvkned.o", + "crypto/aes/libfips-lib-aes-riscv64.o", + "crypto/aes/libfips-lib-aes_cbc.o", + "crypto/aes/libfips-lib-aes_ecb.o", + "crypto/aes/libfips-lib-aes_misc.o", + "crypto/bn/libfips-lib-bn_add.o", + "crypto/bn/libfips-lib-bn_asm.o", + "crypto/bn/libfips-lib-bn_blind.o", + "crypto/bn/libfips-lib-bn_const.o", + "crypto/bn/libfips-lib-bn_conv.o", + "crypto/bn/libfips-lib-bn_ctx.o", + "crypto/bn/libfips-lib-bn_dh.o", + "crypto/bn/libfips-lib-bn_div.o", + "crypto/bn/libfips-lib-bn_exp.o", + "crypto/bn/libfips-lib-bn_exp2.o", + "crypto/bn/libfips-lib-bn_gcd.o", + "crypto/bn/libfips-lib-bn_gf2m.o", + "crypto/bn/libfips-lib-bn_intern.o", + "crypto/bn/libfips-lib-bn_kron.o", + "crypto/bn/libfips-lib-bn_lib.o", + "crypto/bn/libfips-lib-bn_mod.o", + "crypto/bn/libfips-lib-bn_mont.o", + "crypto/bn/libfips-lib-bn_mpi.o", + "crypto/bn/libfips-lib-bn_mul.o", + "crypto/bn/libfips-lib-bn_nist.o", + "crypto/bn/libfips-lib-bn_prime.o", + "crypto/bn/libfips-lib-bn_rand.o", + "crypto/bn/libfips-lib-bn_recp.o", + "crypto/bn/libfips-lib-bn_rsa_fips186_4.o", + "crypto/bn/libfips-lib-bn_shift.o", + "crypto/bn/libfips-lib-bn_sqr.o", + "crypto/bn/libfips-lib-bn_sqrt.o", + "crypto/bn/libfips-lib-bn_word.o", + "crypto/buffer/libfips-lib-buffer.o", + "crypto/cmac/libfips-lib-cmac.o", + "crypto/des/libfips-lib-des_enc.o", + "crypto/des/libfips-lib-ecb3_enc.o", + "crypto/des/libfips-lib-fcrypt_b.o", + "crypto/des/libfips-lib-set_key.o", + "crypto/dh/libfips-lib-dh_backend.o", + "crypto/dh/libfips-lib-dh_check.o", + "crypto/dh/libfips-lib-dh_gen.o", + "crypto/dh/libfips-lib-dh_group_params.o", + "crypto/dh/libfips-lib-dh_kdf.o", + "crypto/dh/libfips-lib-dh_key.o", + "crypto/dh/libfips-lib-dh_lib.o", + "crypto/dsa/libfips-lib-dsa_backend.o", + "crypto/dsa/libfips-lib-dsa_check.o", + "crypto/dsa/libfips-lib-dsa_gen.o", + "crypto/dsa/libfips-lib-dsa_key.o", + "crypto/dsa/libfips-lib-dsa_lib.o", + "crypto/dsa/libfips-lib-dsa_ossl.o", + "crypto/dsa/libfips-lib-dsa_sign.o", + "crypto/dsa/libfips-lib-dsa_vrf.o", + "crypto/ec/curve448/arch_32/libfips-lib-f_impl32.o", + "crypto/ec/curve448/arch_64/libfips-lib-f_impl64.o", + "crypto/ec/curve448/libfips-lib-curve448.o", + "crypto/ec/curve448/libfips-lib-curve448_tables.o", + "crypto/ec/curve448/libfips-lib-eddsa.o", + "crypto/ec/curve448/libfips-lib-f_generic.o", + "crypto/ec/curve448/libfips-lib-scalar.o", + "crypto/ec/libfips-lib-curve25519.o", + "crypto/ec/libfips-lib-ec2_oct.o", + "crypto/ec/libfips-lib-ec2_smpl.o", + "crypto/ec/libfips-lib-ec_asn1.o", + "crypto/ec/libfips-lib-ec_backend.o", + "crypto/ec/libfips-lib-ec_check.o", + "crypto/ec/libfips-lib-ec_curve.o", + "crypto/ec/libfips-lib-ec_cvt.o", + "crypto/ec/libfips-lib-ec_key.o", + "crypto/ec/libfips-lib-ec_kmeth.o", + "crypto/ec/libfips-lib-ec_lib.o", + "crypto/ec/libfips-lib-ec_mult.o", + "crypto/ec/libfips-lib-ec_oct.o", + "crypto/ec/libfips-lib-ecdh_kdf.o", + "crypto/ec/libfips-lib-ecdh_ossl.o", + "crypto/ec/libfips-lib-ecdsa_ossl.o", + "crypto/ec/libfips-lib-ecdsa_sign.o", + "crypto/ec/libfips-lib-ecdsa_vrf.o", + "crypto/ec/libfips-lib-ecp_mont.o", + "crypto/ec/libfips-lib-ecp_nist.o", + "crypto/ec/libfips-lib-ecp_oct.o", + "crypto/ec/libfips-lib-ecp_smpl.o", + "crypto/ec/libfips-lib-ecx_backend.o", + "crypto/ec/libfips-lib-ecx_key.o", + "crypto/evp/libfips-lib-asymcipher.o", + "crypto/evp/libfips-lib-dh_support.o", + "crypto/evp/libfips-lib-digest.o", + "crypto/evp/libfips-lib-ec_support.o", + "crypto/evp/libfips-lib-evp_enc.o", + "crypto/evp/libfips-lib-evp_fetch.o", + "crypto/evp/libfips-lib-evp_lib.o", + "crypto/evp/libfips-lib-evp_rand.o", + "crypto/evp/libfips-lib-evp_utils.o", + "crypto/evp/libfips-lib-exchange.o", + "crypto/evp/libfips-lib-kdf_lib.o", + "crypto/evp/libfips-lib-kdf_meth.o", + "crypto/evp/libfips-lib-kem.o", + "crypto/evp/libfips-lib-keymgmt_lib.o", + "crypto/evp/libfips-lib-keymgmt_meth.o", + "crypto/evp/libfips-lib-mac_lib.o", + "crypto/evp/libfips-lib-mac_meth.o", + "crypto/evp/libfips-lib-p_lib.o", + "crypto/evp/libfips-lib-pmeth_check.o", + "crypto/evp/libfips-lib-pmeth_gn.o", + "crypto/evp/libfips-lib-pmeth_lib.o", + "crypto/evp/libfips-lib-s_lib.o", + "crypto/evp/libfips-lib-signature.o", + "crypto/evp/libfips-lib-skeymgmt_meth.o", + "crypto/ffc/libfips-lib-ffc_backend.o", + "crypto/ffc/libfips-lib-ffc_dh.o", + "crypto/ffc/libfips-lib-ffc_key_generate.o", + "crypto/ffc/libfips-lib-ffc_key_validate.o", + "crypto/ffc/libfips-lib-ffc_params.o", + "crypto/ffc/libfips-lib-ffc_params_generate.o", + "crypto/ffc/libfips-lib-ffc_params_validate.o", + "crypto/hashtable/libfips-lib-hashfunc.o", + "crypto/hashtable/libfips-lib-hashtable.o", + "crypto/hmac/libfips-lib-hmac.o", + "crypto/lhash/libfips-lib-lhash.o", + "crypto/libfips-lib-asn1_dsa.o", + "crypto/libfips-lib-bsearch.o", + "crypto/libfips-lib-context.o", + "crypto/libfips-lib-core_algorithm.o", + "crypto/libfips-lib-core_fetch.o", + "crypto/libfips-lib-core_namemap.o", + "crypto/libfips-lib-cpuid.o", + "crypto/libfips-lib-cryptlib.o", + "crypto/libfips-lib-ctype.o", + "crypto/libfips-lib-der_writer.o", + "crypto/libfips-lib-ex_data.o", + "crypto/libfips-lib-initthread.o", + "crypto/libfips-lib-o_str.o", + "crypto/libfips-lib-packet.o", + "crypto/libfips-lib-param_build.o", + "crypto/libfips-lib-param_build_set.o", + "crypto/libfips-lib-params.o", + "crypto/libfips-lib-params_dup.o", + "crypto/libfips-lib-params_from_text.o", + "crypto/libfips-lib-params_idx.o", + "crypto/libfips-lib-provider_core.o", + "crypto/libfips-lib-provider_predefined.o", + "crypto/libfips-lib-riscv64cpuid.o", + "crypto/libfips-lib-riscvcap.o", + "crypto/libfips-lib-self_test_core.o", + "crypto/libfips-lib-sparse_array.o", + "crypto/libfips-lib-threads_lib.o", + "crypto/libfips-lib-threads_none.o", + "crypto/libfips-lib-threads_pthread.o", + "crypto/libfips-lib-threads_win.o", + "crypto/libfips-lib-time.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_encoders.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_key.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_key_compress.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_matrix.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_ntt.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_params.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_sample.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_sign.o", + "crypto/ml_kem/libfips-lib-ml_kem.o", + "crypto/modes/libfips-lib-aes-gcm-riscv64-zvkb-zvkg-zvkned.o", + "crypto/modes/libfips-lib-cbc128.o", + "crypto/modes/libfips-lib-ccm128.o", + "crypto/modes/libfips-lib-cfb128.o", + "crypto/modes/libfips-lib-ctr128.o", + "crypto/modes/libfips-lib-gcm128.o", + "crypto/modes/libfips-lib-ghash-riscv64-zvkb-zvbc.o", + "crypto/modes/libfips-lib-ghash-riscv64-zvkg.o", + "crypto/modes/libfips-lib-ghash-riscv64.o", + "crypto/modes/libfips-lib-ofb128.o", + "crypto/modes/libfips-lib-wrap128.o", + "crypto/modes/libfips-lib-xts128.o", + "crypto/modes/libfips-lib-xts128gb.o", + "crypto/property/libfips-lib-defn_cache.o", + "crypto/property/libfips-lib-property.o", + "crypto/property/libfips-lib-property_parse.o", + "crypto/property/libfips-lib-property_query.o", + "crypto/property/libfips-lib-property_string.o", + "crypto/rand/libfips-lib-rand_lib.o", + "crypto/rsa/libfips-lib-rsa_acvp_test_params.o", + "crypto/rsa/libfips-lib-rsa_backend.o", + "crypto/rsa/libfips-lib-rsa_chk.o", + "crypto/rsa/libfips-lib-rsa_crpt.o", + "crypto/rsa/libfips-lib-rsa_gen.o", + "crypto/rsa/libfips-lib-rsa_lib.o", + "crypto/rsa/libfips-lib-rsa_mp_names.o", + "crypto/rsa/libfips-lib-rsa_none.o", + "crypto/rsa/libfips-lib-rsa_oaep.o", + "crypto/rsa/libfips-lib-rsa_ossl.o", + "crypto/rsa/libfips-lib-rsa_pk1.o", + "crypto/rsa/libfips-lib-rsa_pss.o", + "crypto/rsa/libfips-lib-rsa_schemes.o", + "crypto/rsa/libfips-lib-rsa_sign.o", + "crypto/rsa/libfips-lib-rsa_sp800_56b_check.o", + "crypto/rsa/libfips-lib-rsa_sp800_56b_gen.o", + "crypto/rsa/libfips-lib-rsa_x931.o", + "crypto/sha/libfips-lib-keccak1600.o", + "crypto/sha/libfips-lib-sha1dgst.o", + "crypto/sha/libfips-lib-sha256-riscv64-zvkb-zvknha_or_zvknhb.o", + "crypto/sha/libfips-lib-sha256.o", + "crypto/sha/libfips-lib-sha3.o", + "crypto/sha/libfips-lib-sha512-riscv64-zvkb-zvknhb.o", + "crypto/sha/libfips-lib-sha512.o", + "crypto/sha/libfips-lib-sha_riscv.o", + "crypto/slh_dsa/libfips-lib-slh_adrs.o", + "crypto/slh_dsa/libfips-lib-slh_dsa.o", + "crypto/slh_dsa/libfips-lib-slh_dsa_hash_ctx.o", + "crypto/slh_dsa/libfips-lib-slh_dsa_key.o", + "crypto/slh_dsa/libfips-lib-slh_fors.o", + "crypto/slh_dsa/libfips-lib-slh_hash.o", + "crypto/slh_dsa/libfips-lib-slh_hypertree.o", + "crypto/slh_dsa/libfips-lib-slh_params.o", + "crypto/slh_dsa/libfips-lib-slh_wots.o", + "crypto/slh_dsa/libfips-lib-slh_xmss.o", + "crypto/stack/libfips-lib-stack.o", + "crypto/thread/arch/libfips-lib-thread_none.o", + "crypto/thread/arch/libfips-lib-thread_posix.o", + "crypto/thread/arch/libfips-lib-thread_win.o", + "crypto/thread/libfips-lib-api.o", + "crypto/thread/libfips-lib-arch.o", + "crypto/thread/libfips-lib-internal.o", + "providers/common/der/libfips-lib-der_rsa_sig.o", + "providers/common/libfips-lib-bio_prov.o", + "providers/common/libfips-lib-capabilities.o", + "providers/common/libfips-lib-digest_to_nid.o", + "providers/common/libfips-lib-provider_seeding.o", + "providers/common/libfips-lib-provider_util.o", + "providers/common/libfips-lib-securitycheck.o", + "providers/common/libfips-lib-securitycheck_fips.o", + "providers/fips/libfips-lib-fipsindicator.o", + "providers/fips/libfips-lib-fipsprov.o", + "providers/fips/libfips-lib-self_test.o", + "providers/fips/libfips-lib-self_test_kats.o", + "providers/implementations/asymciphers/libfips-lib-rsa_enc.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha1_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha256_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ccm.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ccm_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_gcm.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_gcm_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ocb.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ocb_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_wrp.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts_fips.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_cts.o", + "providers/implementations/ciphers/libfips-lib-cipher_tdes.o", + "providers/implementations/ciphers/libfips-lib-cipher_tdes_common.o", + "providers/implementations/ciphers/libfips-lib-cipher_tdes_hw.o", + "providers/implementations/digests/libfips-lib-sha2_prov.o", + "providers/implementations/digests/libfips-lib-sha3_prov.o", + "providers/implementations/exchange/libfips-lib-dh_exch.o", + "providers/implementations/exchange/libfips-lib-ecdh_exch.o", + "providers/implementations/exchange/libfips-lib-ecx_exch.o", + "providers/implementations/exchange/libfips-lib-kdf_exch.o", + "providers/implementations/kdfs/libfips-lib-hkdf.o", + "providers/implementations/kdfs/libfips-lib-kbkdf.o", + "providers/implementations/kdfs/libfips-lib-pbkdf2.o", + "providers/implementations/kdfs/libfips-lib-pbkdf2_fips.o", + "providers/implementations/kdfs/libfips-lib-sshkdf.o", + "providers/implementations/kdfs/libfips-lib-sskdf.o", + "providers/implementations/kdfs/libfips-lib-tls1_prf.o", + "providers/implementations/kdfs/libfips-lib-x942kdf.o", + "providers/implementations/kem/libfips-lib-ml_kem_kem.o", + "providers/implementations/kem/libfips-lib-mlx_kem.o", + "providers/implementations/kem/libfips-lib-rsa_kem.o", + "providers/implementations/keymgmt/libfips-lib-dh_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-dsa_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ec_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ecx_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-kdf_legacy_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-mac_legacy_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ml_dsa_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ml_kem_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-mlx_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-rsa_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-slh_dsa_kmgmt.o", + "providers/implementations/macs/libfips-lib-cmac_prov.o", + "providers/implementations/macs/libfips-lib-gmac_prov.o", + "providers/implementations/macs/libfips-lib-hmac_prov.o", + "providers/implementations/macs/libfips-lib-kmac_prov.o", + "providers/implementations/rands/libfips-lib-drbg.o", + "providers/implementations/rands/libfips-lib-drbg_ctr.o", + "providers/implementations/rands/libfips-lib-drbg_hash.o", + "providers/implementations/rands/libfips-lib-drbg_hmac.o", + "providers/implementations/rands/libfips-lib-fips_crng_test.o", + "providers/implementations/rands/libfips-lib-test_rng.o", + "providers/implementations/signature/libfips-lib-dsa_sig.o", + "providers/implementations/signature/libfips-lib-ecdsa_sig.o", + "providers/implementations/signature/libfips-lib-eddsa_sig.o", + "providers/implementations/signature/libfips-lib-mac_legacy_sig.o", + "providers/implementations/signature/libfips-lib-ml_dsa_sig.o", + "providers/implementations/signature/libfips-lib-rsa_sig.o", + "providers/implementations/signature/libfips-lib-slh_dsa_sig.o", + "providers/implementations/skeymgmt/libfips-lib-aes_skmgmt.o", + "providers/implementations/skeymgmt/libfips-lib-generic.o", + "providers/libcommon.a", + "ssl/record/methods/libfips-lib-ssl3_cbc.o" + ], + "providers/liblegacy-lib-prov_running.o" => [ + "providers/prov_running.c" + ], + "providers/liblegacy.a" => [ + "providers/implementations/ciphers/liblegacy-lib-cipher_blowfish.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_blowfish_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_cast5.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_cast5_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_des.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_des_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_desx.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_desx_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_idea.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_idea_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc2.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc2_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hmac_md5.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hmac_md5_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_seed.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_seed_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_tdes_common.o", + "providers/implementations/digests/liblegacy-lib-md4_prov.o", + "providers/implementations/digests/liblegacy-lib-mdc2_prov.o", + "providers/implementations/digests/liblegacy-lib-ripemd_prov.o", + "providers/implementations/digests/liblegacy-lib-wp_prov.o", + "providers/implementations/kdfs/liblegacy-lib-pbkdf1.o", + "providers/implementations/kdfs/liblegacy-lib-pvkkdf.o", + "providers/liblegacy-lib-prov_running.o" + ], + "providers/libtemplate.a" => [ + "providers/implementations/kem/libtemplate-lib-template_kem.o", + "providers/implementations/keymgmt/libtemplate-lib-template_kmgmt.o" + ], + "ssl/libssl-lib-bio_ssl.o" => [ + "ssl/bio_ssl.c" + ], + "ssl/libssl-lib-d1_lib.o" => [ + "ssl/d1_lib.c" + ], + "ssl/libssl-lib-d1_msg.o" => [ + "ssl/d1_msg.c" + ], + "ssl/libssl-lib-d1_srtp.o" => [ + "ssl/d1_srtp.c" + ], + "ssl/libssl-lib-methods.o" => [ + "ssl/methods.c" + ], + "ssl/libssl-lib-pqueue.o" => [ + "ssl/pqueue.c" + ], + "ssl/libssl-lib-priority_queue.o" => [ + "ssl/priority_queue.c" + ], + "ssl/libssl-lib-s3_enc.o" => [ + "ssl/s3_enc.c" + ], + "ssl/libssl-lib-s3_lib.o" => [ + "ssl/s3_lib.c" + ], + "ssl/libssl-lib-s3_msg.o" => [ + "ssl/s3_msg.c" + ], + "ssl/libssl-lib-ssl_asn1.o" => [ + "ssl/ssl_asn1.c" + ], + "ssl/libssl-lib-ssl_cert.o" => [ + "ssl/ssl_cert.c" + ], + "ssl/libssl-lib-ssl_cert_comp.o" => [ + "ssl/ssl_cert_comp.c" + ], + "ssl/libssl-lib-ssl_ciph.o" => [ + "ssl/ssl_ciph.c" + ], + "ssl/libssl-lib-ssl_conf.o" => [ + "ssl/ssl_conf.c" + ], + "ssl/libssl-lib-ssl_err_legacy.o" => [ + "ssl/ssl_err_legacy.c" + ], + "ssl/libssl-lib-ssl_init.o" => [ + "ssl/ssl_init.c" + ], + "ssl/libssl-lib-ssl_lib.o" => [ + "ssl/ssl_lib.c" + ], + "ssl/libssl-lib-ssl_mcnf.o" => [ + "ssl/ssl_mcnf.c" + ], + "ssl/libssl-lib-ssl_rsa.o" => [ + "ssl/ssl_rsa.c" + ], + "ssl/libssl-lib-ssl_rsa_legacy.o" => [ + "ssl/ssl_rsa_legacy.c" + ], + "ssl/libssl-lib-ssl_sess.o" => [ + "ssl/ssl_sess.c" + ], + "ssl/libssl-lib-ssl_stat.o" => [ + "ssl/ssl_stat.c" + ], + "ssl/libssl-lib-ssl_txt.o" => [ + "ssl/ssl_txt.c" + ], + "ssl/libssl-lib-ssl_utst.o" => [ + "ssl/ssl_utst.c" + ], + "ssl/libssl-lib-t1_enc.o" => [ + "ssl/t1_enc.c" + ], + "ssl/libssl-lib-t1_lib.o" => [ + "ssl/t1_lib.c" + ], + "ssl/libssl-lib-t1_trce.o" => [ + "ssl/t1_trce.c" + ], + "ssl/libssl-lib-tls13_enc.o" => [ + "ssl/tls13_enc.c" + ], + "ssl/libssl-lib-tls_depr.o" => [ + "ssl/tls_depr.c" + ], + "ssl/libssl-lib-tls_srp.o" => [ + "ssl/tls_srp.c" + ], + "ssl/quic/libssl-lib-cc_newreno.o" => [ + "ssl/quic/cc_newreno.c" + ], + "ssl/quic/libssl-lib-json_enc.o" => [ + "ssl/quic/json_enc.c" + ], + "ssl/quic/libssl-lib-qlog.o" => [ + "ssl/quic/qlog.c" + ], + "ssl/quic/libssl-lib-qlog_event_helpers.o" => [ + "ssl/quic/qlog_event_helpers.c" + ], + "ssl/quic/libssl-lib-quic_ackm.o" => [ + "ssl/quic/quic_ackm.c" + ], + "ssl/quic/libssl-lib-quic_cfq.o" => [ + "ssl/quic/quic_cfq.c" + ], + "ssl/quic/libssl-lib-quic_channel.o" => [ + "ssl/quic/quic_channel.c" + ], + "ssl/quic/libssl-lib-quic_demux.o" => [ + "ssl/quic/quic_demux.c" + ], + "ssl/quic/libssl-lib-quic_engine.o" => [ + "ssl/quic/quic_engine.c" + ], + "ssl/quic/libssl-lib-quic_fc.o" => [ + "ssl/quic/quic_fc.c" + ], + "ssl/quic/libssl-lib-quic_fifd.o" => [ + "ssl/quic/quic_fifd.c" + ], + "ssl/quic/libssl-lib-quic_impl.o" => [ + "ssl/quic/quic_impl.c" + ], + "ssl/quic/libssl-lib-quic_lcidm.o" => [ + "ssl/quic/quic_lcidm.c" + ], + "ssl/quic/libssl-lib-quic_method.o" => [ + "ssl/quic/quic_method.c" + ], + "ssl/quic/libssl-lib-quic_obj.o" => [ + "ssl/quic/quic_obj.c" + ], + "ssl/quic/libssl-lib-quic_port.o" => [ + "ssl/quic/quic_port.c" + ], + "ssl/quic/libssl-lib-quic_rcidm.o" => [ + "ssl/quic/quic_rcidm.c" + ], + "ssl/quic/libssl-lib-quic_reactor.o" => [ + "ssl/quic/quic_reactor.c" + ], + "ssl/quic/libssl-lib-quic_reactor_wait_ctx.o" => [ + "ssl/quic/quic_reactor_wait_ctx.c" + ], + "ssl/quic/libssl-lib-quic_record_rx.o" => [ + "ssl/quic/quic_record_rx.c" + ], + "ssl/quic/libssl-lib-quic_record_shared.o" => [ + "ssl/quic/quic_record_shared.c" + ], + "ssl/quic/libssl-lib-quic_record_tx.o" => [ + "ssl/quic/quic_record_tx.c" + ], + "ssl/quic/libssl-lib-quic_record_util.o" => [ + "ssl/quic/quic_record_util.c" + ], + "ssl/quic/libssl-lib-quic_rstream.o" => [ + "ssl/quic/quic_rstream.c" + ], + "ssl/quic/libssl-lib-quic_rx_depack.o" => [ + "ssl/quic/quic_rx_depack.c" + ], + "ssl/quic/libssl-lib-quic_sf_list.o" => [ + "ssl/quic/quic_sf_list.c" + ], + "ssl/quic/libssl-lib-quic_srt_gen.o" => [ + "ssl/quic/quic_srt_gen.c" + ], + "ssl/quic/libssl-lib-quic_srtm.o" => [ + "ssl/quic/quic_srtm.c" + ], + "ssl/quic/libssl-lib-quic_sstream.o" => [ + "ssl/quic/quic_sstream.c" + ], + "ssl/quic/libssl-lib-quic_statm.o" => [ + "ssl/quic/quic_statm.c" + ], + "ssl/quic/libssl-lib-quic_stream_map.o" => [ + "ssl/quic/quic_stream_map.c" + ], + "ssl/quic/libssl-lib-quic_thread_assist.o" => [ + "ssl/quic/quic_thread_assist.c" + ], + "ssl/quic/libssl-lib-quic_tls.o" => [ + "ssl/quic/quic_tls.c" + ], + "ssl/quic/libssl-lib-quic_tls_api.o" => [ + "ssl/quic/quic_tls_api.c" + ], + "ssl/quic/libssl-lib-quic_trace.o" => [ + "ssl/quic/quic_trace.c" + ], + "ssl/quic/libssl-lib-quic_tserver.o" => [ + "ssl/quic/quic_tserver.c" + ], + "ssl/quic/libssl-lib-quic_txp.o" => [ + "ssl/quic/quic_txp.c" + ], + "ssl/quic/libssl-lib-quic_txpim.o" => [ + "ssl/quic/quic_txpim.c" + ], + "ssl/quic/libssl-lib-quic_types.o" => [ + "ssl/quic/quic_types.c" + ], + "ssl/quic/libssl-lib-quic_wire.o" => [ + "ssl/quic/quic_wire.c" + ], + "ssl/quic/libssl-lib-quic_wire_pkt.o" => [ + "ssl/quic/quic_wire_pkt.c" + ], + "ssl/quic/libssl-lib-uint_set.o" => [ + "ssl/quic/uint_set.c" + ], + "ssl/record/libssl-lib-rec_layer_d1.o" => [ + "ssl/record/rec_layer_d1.c" + ], + "ssl/record/libssl-lib-rec_layer_s3.o" => [ + "ssl/record/rec_layer_s3.c" + ], + "ssl/record/methods/libcommon-lib-tls_pad.o" => [ + "ssl/record/methods/tls_pad.c" + ], + "ssl/record/methods/libdefault-lib-ssl3_cbc.o" => [ + "ssl/record/methods/ssl3_cbc.c" + ], + "ssl/record/methods/libfips-lib-ssl3_cbc.o" => [ + "ssl/record/methods/ssl3_cbc.c" + ], + "ssl/record/methods/libssl-lib-dtls_meth.o" => [ + "ssl/record/methods/dtls_meth.c" + ], + "ssl/record/methods/libssl-lib-ssl3_meth.o" => [ + "ssl/record/methods/ssl3_meth.c" + ], + "ssl/record/methods/libssl-lib-tls13_meth.o" => [ + "ssl/record/methods/tls13_meth.c" + ], + "ssl/record/methods/libssl-lib-tls1_meth.o" => [ + "ssl/record/methods/tls1_meth.c" + ], + "ssl/record/methods/libssl-lib-tls_common.o" => [ + "ssl/record/methods/tls_common.c" + ], + "ssl/record/methods/libssl-lib-tls_multib.o" => [ + "ssl/record/methods/tls_multib.c" + ], + "ssl/record/methods/libssl-lib-tlsany_meth.o" => [ + "ssl/record/methods/tlsany_meth.c" + ], + "ssl/rio/libssl-lib-poll_builder.o" => [ + "ssl/rio/poll_builder.c" + ], + "ssl/rio/libssl-lib-poll_immediate.o" => [ + "ssl/rio/poll_immediate.c" + ], + "ssl/rio/libssl-lib-rio_notifier.o" => [ + "ssl/rio/rio_notifier.c" + ], + "ssl/statem/libssl-lib-extensions.o" => [ + "ssl/statem/extensions.c" + ], + "ssl/statem/libssl-lib-extensions_clnt.o" => [ + "ssl/statem/extensions_clnt.c" + ], + "ssl/statem/libssl-lib-extensions_cust.o" => [ + "ssl/statem/extensions_cust.c" + ], + "ssl/statem/libssl-lib-extensions_srvr.o" => [ + "ssl/statem/extensions_srvr.c" + ], + "ssl/statem/libssl-lib-statem.o" => [ + "ssl/statem/statem.c" + ], + "ssl/statem/libssl-lib-statem_clnt.o" => [ + "ssl/statem/statem_clnt.c" + ], + "ssl/statem/libssl-lib-statem_dtls.o" => [ + "ssl/statem/statem_dtls.c" + ], + "ssl/statem/libssl-lib-statem_lib.o" => [ + "ssl/statem/statem_lib.c" + ], + "ssl/statem/libssl-lib-statem_srvr.o" => [ + "ssl/statem/statem_srvr.c" + ], + "tools/c_rehash" => [ + "tools/c_rehash.in" + ], + "util/shlib_wrap.sh" => [ + "util/shlib_wrap.sh.in" + ], + "util/wrap.pl" => [ + "util/wrap.pl.in" + ] + }, + "targets" => [ + "build_modules_nodep" + ] +); + +# Unexported, only used by OpenSSL::Test::Utils::available_protocols() +our %available_protocols = ( + tls => [ + "ssl3", + "tls1", + "tls1_1", + "tls1_2", + "tls1_3" +], + dtls => [ + "dtls1", + "dtls1_2" +], +); + +# The following data is only used when this files is use as a script +my @makevars = ( + "AR", + "ARFLAGS", + "AS", + "ASFLAGS", + "CC", + "CFLAGS", + "CPP", + "CPPDEFINES", + "CPPFLAGS", + "CPPINCLUDES", + "CROSS_COMPILE", + "CXX", + "CXXFLAGS", + "HASHBANGPERL", + "LD", + "LDFLAGS", + "LDLIBS", + "MT", + "MTFLAGS", + "OBJCOPY", + "PERL", + "RANLIB", + "RC", + "RCFLAGS", + "RM" +); +my %disabled_info = ( + "afalgeng" => { + "macro" => "OPENSSL_NO_AFALGENG" + }, + "asan" => { + "macro" => "OPENSSL_NO_ASAN" + }, + "brotli-dynamic" => { + "macro" => "OPENSSL_NO_BROTLI_DYNAMIC" + }, + "crypto-mdebug" => { + "macro" => "OPENSSL_NO_CRYPTO_MDEBUG" + }, + "crypto-mdebug-backtrace" => { + "macro" => "OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE" + }, + "demos" => { + "macro" => "OPENSSL_NO_DEMOS" + }, + "devcryptoeng" => { + "macro" => "OPENSSL_NO_DEVCRYPTOENG" + }, + "ec_nistp_64_gcc_128" => { + "macro" => "OPENSSL_NO_EC_NISTP_64_GCC_128" + }, + "egd" => { + "macro" => "OPENSSL_NO_EGD" + }, + "external-tests" => { + "macro" => "OPENSSL_NO_EXTERNAL_TESTS" + }, + "fips-jitter" => { + "macro" => "OPENSSL_NO_FIPS_JITTER" + }, + "fuzz-afl" => { + "macro" => "OPENSSL_NO_FUZZ_AFL" + }, + "fuzz-libfuzzer" => { + "macro" => "OPENSSL_NO_FUZZ_LIBFUZZER" + }, + "h3demo" => { + "macro" => "OPENSSL_NO_H3DEMO" + }, + "hqinterop" => { + "macro" => "OPENSSL_NO_HQINTEROP" + }, + "jitter" => { + "macro" => "OPENSSL_NO_JITTER" + }, + "ktls" => { + "macro" => "OPENSSL_NO_KTLS" + }, + "loadereng" => { + "macro" => "OPENSSL_NO_LOADERENG" + }, + "md2" => { + "macro" => "OPENSSL_NO_MD2", + "skipped" => [ + "crypto/md2" + ] + }, + "msan" => { + "macro" => "OPENSSL_NO_MSAN" + }, + "pie" => { + "macro" => "OPENSSL_NO_PIE" + }, + "rc5" => { + "macro" => "OPENSSL_NO_RC5", + "skipped" => [ + "crypto/rc5" + ] + }, + "sctp" => { + "macro" => "OPENSSL_NO_SCTP" + }, + "ssl3" => { + "macro" => "OPENSSL_NO_SSL3" + }, + "ssl3-method" => { + "macro" => "OPENSSL_NO_SSL3_METHOD" + }, + "sslkeylog" => { + "macro" => "OPENSSL_NO_SSLKEYLOG" + }, + "tests" => { + "macro" => "OPENSSL_NO_TESTS" + }, + "tfo" => { + "macro" => "OPENSSL_NO_TFO" + }, + "trace" => { + "macro" => "OPENSSL_NO_TRACE" + }, + "ubsan" => { + "macro" => "OPENSSL_NO_UBSAN" + }, + "unit-test" => { + "macro" => "OPENSSL_NO_UNIT_TEST" + }, + "uplink" => { + "macro" => "OPENSSL_NO_UPLINK" + }, + "weak-ssl-ciphers" => { + "macro" => "OPENSSL_NO_WEAK_SSL_CIPHERS" + }, + "winstore" => { + "macro" => "OPENSSL_NO_WINSTORE" + }, + "zlib-dynamic" => { + "macro" => "OPENSSL_NO_ZLIB_DYNAMIC" + }, + "zstd-dynamic" => { + "macro" => "OPENSSL_NO_ZSTD_DYNAMIC" + } +); +my @user_crossable = qw( AR AS CC CXX CPP LD MT RANLIB RC ); + +# If run directly, we can give some answers, and even reconfigure +unless (caller) { + use Getopt::Long; + use File::Spec::Functions; + use File::Basename; + use File::Compare qw(compare_text); + use File::Copy; + use Pod::Usage; + + use lib '/node/deps/openssl/openssl/util/perl'; + use OpenSSL::fallback '/node/deps/openssl/openssl/external/perl/MODULES.txt'; + + my $here = dirname($0); + + if (scalar @ARGV == 0) { + # With no arguments, re-create the build file + # We do that in two steps, where the first step emits perl + # snippets. + + my $buildfile = $config{build_file}; + my $buildfile_template = "$buildfile.in"; + my @autowarntext = ( + 'WARNING: do not edit!', + "Generated by configdata.pm from " + .join(", ", @{$config{build_file_templates}}), + "via $buildfile_template" + ); + my %gendata = ( + config => \%config, + target => \%target, + disabled => \%disabled, + withargs => \%withargs, + unified_info => \%unified_info, + autowarntext => \@autowarntext, + ); + + use lib '.'; + use lib '/node/deps/openssl/openssl/Configurations'; + use gentemplate; + + open my $buildfile_template_fh, ">$buildfile_template" + or die "Trying to create $buildfile_template: $!"; + foreach (@{$config{build_file_templates}}) { + copy($_, $buildfile_template_fh) + or die "Trying to copy $_ into $buildfile_template: $!"; + } + gentemplate(output => $buildfile_template_fh, %gendata); + close $buildfile_template_fh; + print 'Created ',$buildfile_template,"\n"; + + use OpenSSL::Template; + + my $prepend = <<'_____'; +use File::Spec::Functions; +use lib '/node/deps/openssl/openssl/util/perl'; +use lib '/node/deps/openssl/openssl/Configurations'; +use lib '.'; +use platform; +_____ + + my $tmpl; + open BUILDFILE, ">$buildfile.new" + or die "Trying to create $buildfile.new: $!"; + $tmpl = OpenSSL::Template->new(TYPE => 'FILE', + SOURCE => $buildfile_template); + $tmpl->fill_in(FILENAME => $_, + OUTPUT => \*BUILDFILE, + HASH => \%gendata, + PREPEND => $prepend, + # To ensure that global variables and functions + # defined in one template stick around for the + # next, making them combinable + PACKAGE => 'OpenSSL::safe') + or die $OpenSSL::Template::ERROR; + close BUILDFILE; + rename("$buildfile.new", $buildfile) + or die "Trying to rename $buildfile.new to $buildfile: $!"; + print 'Created ',$buildfile,"\n"; + + my $configuration_h = + catfile('include', 'openssl', 'configuration.h'); + my $configuration_h_in = + catfile($config{sourcedir}, 'include', 'openssl', 'configuration.h.in'); + open CONFIGURATION_H, ">${configuration_h}.new" + or die "Trying to create ${configuration_h}.new: $!"; + $tmpl = OpenSSL::Template->new(TYPE => 'FILE', + SOURCE => $configuration_h_in); + $tmpl->fill_in(FILENAME => $_, + OUTPUT => \*CONFIGURATION_H, + HASH => \%gendata, + PREPEND => $prepend, + # To ensure that global variables and functions + # defined in one template stick around for the + # next, making them combinable + PACKAGE => 'OpenSSL::safe') + or die $OpenSSL::Template::ERROR; + close CONFIGURATION_H; + + # When using stat() on Windows, we can get it to perform better by + # avoid some data. This doesn't affect the mtime field, so we're not + # losing anything... + ${^WIN32_SLOPPY_STAT} = 1; + + my $update_configuration_h = 0; + if (-f $configuration_h) { + my $configuration_h_mtime = (stat($configuration_h))[9]; + my $configuration_h_in_mtime = (stat($configuration_h_in))[9]; + + # If configuration.h.in was updated after the last configuration.h, + # or if configuration.h.new differs configuration.h, we update + # configuration.h + if ($configuration_h_mtime < $configuration_h_in_mtime + || compare_text("${configuration_h}.new", $configuration_h) != 0) { + $update_configuration_h = 1; + } else { + # If nothing has changed, let's just drop the new one and + # pretend like nothing happened + unlink "${configuration_h}.new" + } + } else { + $update_configuration_h = 1; + } + + if ($update_configuration_h) { + rename("${configuration_h}.new", $configuration_h) + or die "Trying to rename ${configuration_h}.new to $configuration_h: $!"; + print 'Created ',$configuration_h,"\n"; + } + + exit(0); + } + + my $dump = undef; + my $cmdline = undef; + my $options = undef; + my $target = undef; + my $envvars = undef; + my $makevars = undef; + my $buildparams = undef; + my $reconf = undef; + my $verbose = undef; + my $query = undef; + my $help = undef; + my $man = undef; + GetOptions('dump|d' => \$dump, + 'command-line|c' => \$cmdline, + 'options|o' => \$options, + 'target|t' => \$target, + 'environment|e' => \$envvars, + 'make-variables|m' => \$makevars, + 'build-parameters|b' => \$buildparams, + 'reconfigure|reconf|r' => \$reconf, + 'verbose|v' => \$verbose, + 'query|q=s' => \$query, + 'help' => \$help, + 'man' => \$man) + or die "Errors in command line arguments\n"; + + # We allow extra arguments with --query. That allows constructs like + # this: + # ./configdata.pm --query 'get_sources(@ARGV)' file1 file2 file3 + if (!$query && scalar @ARGV > 0) { + print STDERR <<"_____"; +Unrecognised arguments. +For more information, do '$0 --help' +_____ + exit(2); + } + + if ($help) { + pod2usage(-exitval => 0, + -verbose => 1); + } + if ($man) { + pod2usage(-exitval => 0, + -verbose => 2); + } + if ($dump || $cmdline) { + print "\nCommand line (with current working directory = $here):\n\n"; + print ' ',join(' ', + $config{PERL}, + catfile($config{sourcedir}, 'Configure'), + @{$config{perlargv}}), "\n"; + print "\nPerl information:\n\n"; + print ' ',$config{perl_cmd},"\n"; + print ' ',$config{perl_version},' for ',$config{perl_archname},"\n"; + } + if ($dump || $options) { + my $longest = 0; + my $longest2 = 0; + foreach my $what (@disablables) { + $longest = length($what) if $longest < length($what); + $longest2 = length($disabled{$what}) + if $disabled{$what} && $longest2 < length($disabled{$what}); + } + print "\nEnabled features:\n\n"; + foreach my $what (@disablables) { + print " $what\n" unless $disabled{$what}; + } + print "\nDisabled features:\n\n"; + foreach my $what (@disablables) { + if ($disabled{$what}) { + print " $what", ' ' x ($longest - length($what) + 1), + "[$disabled{$what}]", ' ' x ($longest2 - length($disabled{$what}) + 1); + print $disabled_info{$what}->{macro} + if $disabled_info{$what}->{macro}; + print ' (skip ', + join(', ', @{$disabled_info{$what}->{skipped}}), + ')' + if $disabled_info{$what}->{skipped}; + print "\n"; + } + } + } + if ($dump || $target) { + print "\nConfig target attributes:\n\n"; + foreach (sort keys %target) { + next if $_ =~ m|^_| || $_ eq 'template'; + my $quotify = sub { + map { + if (defined $_) { + (my $x = $_) =~ s|([\\\$\@"])|\\$1|g; "\"$x\"" + } else { + "undef"; + } + } @_; + }; + print ' ', $_, ' => '; + if (ref($target{$_}) eq "ARRAY") { + print '[ ', join(', ', $quotify->(@{$target{$_}})), " ],\n"; + } else { + print $quotify->($target{$_}), ",\n" + } + } + } + if ($dump || $envvars) { + print "\nRecorded environment:\n\n"; + foreach (sort keys %{$config{perlenv}}) { + print ' ',$_,' = ',($config{perlenv}->{$_} || ''),"\n"; + } + } + if ($dump || $makevars) { + print "\nMakevars:\n\n"; + foreach my $var (@makevars) { + my $prefix = ''; + $prefix = $config{CROSS_COMPILE} + if grep { $var eq $_ } @user_crossable; + $prefix //= ''; + print ' ',$var,' ' x (16 - length $var),'= ', + (ref $config{$var} eq 'ARRAY' + ? join(' ', @{$config{$var}}) + : $prefix.$config{$var}), + "\n" + if defined $config{$var}; + } + + my @buildfile = ($config{builddir}, $config{build_file}); + unshift @buildfile, $here + unless file_name_is_absolute($config{builddir}); + my $buildfile = canonpath(catdir(@buildfile)); + print <<"_____"; + +NOTE: These variables only represent the configuration view. The build file +template may have processed these variables further, please have a look at the +build file for more exact data: + $buildfile +_____ + } + if ($dump || $buildparams) { + my @buildfile = ($config{builddir}, $config{build_file}); + unshift @buildfile, $here + unless file_name_is_absolute($config{builddir}); + print "\nbuild file:\n\n"; + print " ", canonpath(catfile(@buildfile)),"\n"; + + print "\nbuild file templates:\n\n"; + foreach (@{$config{build_file_templates}}) { + my @tmpl = ($_); + unshift @tmpl, $here + unless file_name_is_absolute($config{sourcedir}); + print ' ',canonpath(catfile(@tmpl)),"\n"; + } + } + if ($reconf) { + if ($verbose) { + print 'Reconfiguring with: ', join(' ',@{$config{perlargv}}), "\n"; + foreach (sort keys %{$config{perlenv}}) { + print ' ',$_,' = ',($config{perlenv}->{$_} || ""),"\n"; + } + } + + chdir $here; + exec $^X,catfile($config{sourcedir}, 'Configure'),'reconf'; + } + if ($query) { + use OpenSSL::Config::Query; + + my $confquery = OpenSSL::Config::Query->new(info => \%unified_info, + config => \%config); + my $result = eval "\$confquery->$query"; + + # We may need a result class with a printing function at some point. + # Until then, we assume that we get a scalar, or a list or a hash table + # with scalar values and simply print them in some orderly fashion. + if (ref $result eq 'ARRAY') { + print "$_\n" foreach @$result; + } elsif (ref $result eq 'HASH') { + print "$_ : \\\n ", join(" \\\n ", @{$result->{$_}}), "\n" + foreach sort keys %$result; + } elsif (ref $result eq 'SCALAR') { + print "$$result\n"; + } + } +} + +1; + +__END__ + +=head1 NAME + +configdata.pm - configuration data for OpenSSL builds + +=head1 SYNOPSIS + +Interactive: + + perl configdata.pm [options] + +As data bank module: + + use configdata; + +=head1 DESCRIPTION + +This module can be used in two modes, interactively and as a module containing +all the data recorded by OpenSSL's Configure script. + +When used interactively, simply run it as any perl script. +If run with no arguments, it will rebuild the build file (Makefile or +corresponding). +With at least one option, it will instead get the information you ask for, or +re-run the configuration process. +See L below for more information. + +When loaded as a module, you get a few databanks with useful information to +perform build related tasks. The databanks are: + + %config Configured things. + %target The OpenSSL config target with all inheritances + resolved. + %disabled The features that are disabled. + @disablables The list of features that can be disabled. + %withargs All data given through --with-THING options. + %unified_info All information that was computed from the build.info + files. + +=head1 OPTIONS + +=over 4 + +=item B<--help> + +Print a brief help message and exit. + +=item B<--man> + +Print the manual page and exit. + +=item B<--dump> | B<-d> + +Print all relevant configuration data. This is equivalent to B<--command-line> +B<--options> B<--target> B<--environment> B<--make-variables> +B<--build-parameters>. + +=item B<--command-line> | B<-c> + +Print the current configuration command line. + +=item B<--options> | B<-o> + +Print the features, both enabled and disabled, and display defined macro and +skipped directories where applicable. + +=item B<--target> | B<-t> + +Print the config attributes for this config target. + +=item B<--environment> | B<-e> + +Print the environment variables and their values at the time of configuration. + +=item B<--make-variables> | B<-m> + +Print the main make variables generated in the current configuration + +=item B<--build-parameters> | B<-b> + +Print the build parameters, i.e. build file and build file templates. + +=item B<--reconfigure> | B<--reconf> | B<-r> + +Re-run the configuration process. + +=item B<--verbose> | B<-v> + +Verbose output. + +=back + +=cut + +EOF diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zkn.s b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zkn.s new file mode 100644 index 000000000000..ff8a865966bc --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zkn.s @@ -0,0 +1,694 @@ +.text +.balign 16 +.globl rv64i_zkne_encrypt +.type rv64i_zkne_encrypt,@function +rv64i_zkne_encrypt: + addi sp,sp,-16 + sd x8,8(sp) + sd x9,0(sp) + + # Load input to block cipher + ld x6,0(x10) + ld x7,8(x10) + + # Load key + ld x13,0(x12) + ld x14,8(x12) + + # Load number of rounds + lwu x30,240(x12) + + # initial transformation + xor x6,x6,x13 + xor x7,x7,x14 + + # The main loop only executes the first N-1 rounds. + add x30,x30,-1 + + # Do Nr - 1 rounds (final round is special) +1: + .word 913507379 + .word 912491699 + + # Update key ptr to point to next key in schedule + add x12,x12,16 + + # Grab next key in schedule + ld x13,0(x12) + ld x14,8(x12) + xor x6,x8,x13 + xor x7,x9,x14 + + add x30,x30,-1 + bgtz x30,1b + + # final round + .word 846398515 + .word 845382835 + + # since not added 16 before + ld x13,16(x12) + ld x14,24(x12) + xor x6,x8,x13 + xor x7,x9,x14 + + sd x6,0(x11) + sd x7,8(x11) + + # Pop registers and return + ld x8,8(sp) + ld x9,0(sp) + addi sp,sp,16 + ret +.text +.balign 16 +.globl rv64i_zknd_decrypt +.type rv64i_zknd_decrypt,@function +rv64i_zknd_decrypt: + addi sp,sp,-16 + sd x8,8(sp) + sd x9,0(sp) + + # Load input to block cipher + ld x6,0(x10) + ld x7,8(x10) + + # Load number of rounds + lwu x30,240(x12) + + # Load the last key + slli x13,x30,4 + add x12,x12,x13 + ld x13,0(x12) + ld x14,8(x12) + + xor x6,x6,x13 + xor x7,x7,x14 + + # The main loop only executes the first N-1 rounds. + add x30,x30,-1 + + # Do Nr - 1 rounds (final round is special) +1: + .word 1047725107 + .word 1046709427 + + # Update key ptr to point to next key in schedule + add x12,x12,-16 + + # Grab next key in schedule + ld x13,0(x12) + ld x14,8(x12) + xor x6,x8,x13 + xor x7,x9,x14 + + add x30,x30,-1 + bgtz x30,1b + + # final round + .word 980616243 + .word 979600563 + + add x12,x12,-16 + ld x13,0(x12) + ld x14,8(x12) + xor x6,x8,x13 + xor x7,x9,x14 + + sd x6,0(x11) + sd x7,8(x11) + # Pop registers and return + ld x8,8(sp) + ld x9,0(sp) + addi sp,sp,16 + ret +.text +.balign 16 +.globl rv64i_zkne_set_encrypt_key +.type rv64i_zkne_set_encrypt_key,@function +rv64i_zkne_set_encrypt_key: + addi sp,sp,-16 + sd x8,0(sp) + # Determine number of rounds from key size in bits + li x6,128 + bne x11,x6,1f + li x7,10 # key->rounds = 10 if bits == 128 + sw x7,240(x12) # store key->rounds + ld x6,0(x10) + ld x7,8(x10) + sd x6,0(x12) + sd x7,8(x12) + .word 822318099 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 823366675 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 824415251 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 825463827 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 826512403 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 827560979 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 828609555 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 829658131 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 830706707 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 831755283 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + + j 4f +1: + li x6,192 + bne x11,x6,2f + li x7,12 # key->rounds = 12 if bits == 192 + sw x7,240(x12) # store key->rounds + ld x6,0(x10) + ld x7,8(x10) + ld x8,16(x10) + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 822351507 + .word 2120647475 + .word 2121466803 + .word 2122548275 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 823400083 + .word 2120647475 + .word 2121466803 + .word 2122548275 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 824448659 + .word 2120647475 + .word 2121466803 + .word 2122548275 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 825497235 + .word 2120647475 + .word 2121466803 + .word 2122548275 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 826545811 + .word 2120647475 + .word 2121466803 + .word 2122548275 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 827594387 + .word 2120647475 + .word 2121466803 + .word 2122548275 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 828642963 + .word 2120647475 + .word 2121466803 + .word 2122548275 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 829691539 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + + j 4f +2: + li x7,14 # key->rounds = 14 if bits == 256 + li x6,256 + beq x11,x6,3f + li a0,-2 # If bits != 128, 192, or 256, return -2 + j 5f +3: + sw x7,240(x12) # store key->rounds + ld x6,0(x10) + ld x7,8(x10) + ld x8,16(x10) + ld x13,24(x10) + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + sd x13,24(x12) + .word 822515475 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + .word 832804627 + .word 2122777651 + .word 2127824563 + sd x8,16(x12) + sd x13,24(x12) + .word 823564051 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + .word 832804627 + .word 2122777651 + .word 2127824563 + sd x8,16(x12) + sd x13,24(x12) + .word 824612627 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + .word 832804627 + .word 2122777651 + .word 2127824563 + sd x8,16(x12) + sd x13,24(x12) + .word 825661203 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + .word 832804627 + .word 2122777651 + .word 2127824563 + sd x8,16(x12) + sd x13,24(x12) + .word 826709779 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + .word 832804627 + .word 2122777651 + .word 2127824563 + sd x8,16(x12) + sd x13,24(x12) + .word 827758355 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + .word 832804627 + .word 2122777651 + .word 2127824563 + sd x8,16(x12) + sd x13,24(x12) + .word 828806931 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + +4: # return 0 + li a0,0 +5: # return a0 + ld x8,0(sp) + addi sp,sp,16 + ret +.text +.balign 16 +.globl rv64i_zknd_set_decrypt_key +.type rv64i_zknd_set_decrypt_key,@function +rv64i_zknd_set_decrypt_key: + addi sp,sp,-16 + sd x8,0(sp) + # Determine number of rounds from key size in bits + li x6,128 + bne x11,x6,1f + li x7,10 # key->rounds = 10 if bits == 128 + sw x7,240(x12) # store key->rounds + ld x6,0(x10) + ld x7,8(x10) + sd x6,0(x12) + sd x7,8(x12) + .word 822318099 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 823366675 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 824415251 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 825463827 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 826512403 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 827560979 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 828609555 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 829658131 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 830706707 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 831755283 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + + j 4f +1: + li x6,192 + bne x11,x6,2f + li x7,12 # key->rounds = 12 if bits == 192 + sw x7,240(x12) # store key->rounds + ld x6,0(x10) + ld x7,8(x10) + ld x8,16(x10) + sd x6,0(x12) + sd x7,8(x12) + .word 805574291 + sd x13,16(x12) + .word 822351507 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + .word 805508755 + sd x13,0(x12) + .word 805541523 + sd x13,8(x12) + # the reason is in ke192enc + .word 2122548275 + .word 805574291 + sd x13,16(x12) + .word 823400083 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + .word 805508755 + sd x13,0(x12) + .word 805541523 + sd x13,8(x12) + # the reason is in ke192enc + .word 2122548275 + .word 805574291 + sd x13,16(x12) + .word 824448659 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + .word 805508755 + sd x13,0(x12) + .word 805541523 + sd x13,8(x12) + # the reason is in ke192enc + .word 2122548275 + .word 805574291 + sd x13,16(x12) + .word 825497235 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + .word 805508755 + sd x13,0(x12) + .word 805541523 + sd x13,8(x12) + # the reason is in ke192enc + .word 2122548275 + .word 805574291 + sd x13,16(x12) + .word 826545811 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + .word 805508755 + sd x13,0(x12) + .word 805541523 + sd x13,8(x12) + # the reason is in ke192enc + .word 2122548275 + .word 805574291 + sd x13,16(x12) + .word 827594387 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + .word 805508755 + sd x13,0(x12) + .word 805541523 + sd x13,8(x12) + # the reason is in ke192enc + .word 2122548275 + .word 805574291 + sd x13,16(x12) + .word 828642963 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + .word 805508755 + sd x13,0(x12) + .word 805541523 + sd x13,8(x12) + # the reason is in ke192enc + .word 2122548275 + .word 805574291 + sd x13,16(x12) + .word 829691539 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + + j 4f +2: + li x7,14 # key->rounds = 14 if bits == 256 + li x6,256 + beq x11,x6,3f + li a0,-2 # If bits != 128, 192, or 256, return -2 + j 5f +3: + sw x7,240(x12) # store key->rounds + ld x6,0(x10) + ld x7,8(x10) + ld x8,16(x10) + ld x13,24(x10) + sd x6,0(x12) + sd x7,8(x12) + .word 805574419 + sd x14,16(x12) + .word 805738259 + sd x14,24(x12) + .word 822515475 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + .word 832804627 + .word 2122777651 + .word 2127824563 + .word 805508883 + sd x14,0(x12) + .word 805541651 + sd x14,8(x12) + .word 805574419 + sd x14,16(x12) + .word 805738259 + sd x14,24(x12) + .word 823564051 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + .word 832804627 + .word 2122777651 + .word 2127824563 + .word 805508883 + sd x14,0(x12) + .word 805541651 + sd x14,8(x12) + .word 805574419 + sd x14,16(x12) + .word 805738259 + sd x14,24(x12) + .word 824612627 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + .word 832804627 + .word 2122777651 + .word 2127824563 + .word 805508883 + sd x14,0(x12) + .word 805541651 + sd x14,8(x12) + .word 805574419 + sd x14,16(x12) + .word 805738259 + sd x14,24(x12) + .word 825661203 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + .word 832804627 + .word 2122777651 + .word 2127824563 + .word 805508883 + sd x14,0(x12) + .word 805541651 + sd x14,8(x12) + .word 805574419 + sd x14,16(x12) + .word 805738259 + sd x14,24(x12) + .word 826709779 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + .word 832804627 + .word 2122777651 + .word 2127824563 + .word 805508883 + sd x14,0(x12) + .word 805541651 + sd x14,8(x12) + .word 805574419 + sd x14,16(x12) + .word 805738259 + sd x14,24(x12) + .word 827758355 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + .word 832804627 + .word 2122777651 + .word 2127824563 + .word 805508883 + sd x14,0(x12) + .word 805541651 + sd x14,8(x12) + .word 805574419 + sd x14,16(x12) + .word 805738259 + sd x14,24(x12) + .word 828806931 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + # last two one dropped + +4: # return 0 + li a0,0 +5: # return a0 + ld x8,0(sp) + addi sp,sp,16 + ret diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s new file mode 100644 index 000000000000..f8a68e7c42dd --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s @@ -0,0 +1,943 @@ +.text +.p2align 3 +.globl rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt +.type rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt,@function +rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt: + # Load number of rounds + lwu t0, 240(a4) + .word 3439489111 + .word 34074119 + .word 34041479 + .word 2815667831 + addi t0, t0, -1 + addi a4, a4, 16 +1: + .word 34041479 + .word 2815503991 + addi t0, t0, -1 + addi a4, a4, 16 + bnez t0, 1b + .word 34041479 + .word 2815536759 + + + # aes block size is 16 + andi a6, a2, 15 + mv t3, a2 + beqz a6, 1f + sub a2, a2, a6 + addi t3, a2, -16 +1: + # We make the `LENGTH` become e32 length here. + srli t4, a2, 2 + srli t3, t3, 2 + + # Load number of rounds + lwu t0, 240(a3) + li t1, 14 + li t2, 10 + beq t0, t1, aes_xts_enc_256 + beq t0, t2, aes_xts_enc_128 +.size rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt,.-rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt +.p2align 3 +aes_xts_enc_128: + # load input + .word 221182167 + .word 33909767 + + li t0, 5 + # We could simplify the initialization steps if we have `block<=1`. + blt t4, t0, 1f + + # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses + # different order of coefficients. We should use`vbrev8` to reverse the + # data when we use `vgmul`. + .word 3439489111 + .word 1271144535 + .word 221179991 + .word 1577072727 + # v16: [r-IV0, r-IV0, ...] + .word 2785257591 + + # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8. + slli t0, t4, 2 + .word 218296407 + # v2: [`1`, `1`, `1`, `1`, ...] + .word 1577103703 + # v3: [`0`, `1`, `2`, `3`, ...] + .word 1376297431 + .word 227733591 + # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...] + .word 1243816535 + # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...] + .word 1244865367 + slli t0, t4, 1 + .word 219344983 + # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...] + .word 3594716247 + + # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16 + .word 221179991 + .word 1250174039 + .word 2726865015 + + # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28. + # Reverse the bits order back. + .word 1258565207 + + # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number + # in a LMUL=4 register group. + # n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) + # = (VLEN/32) + # We could use vsetvli with `e32, m1` to compute the `n` number. + .word 218133207 + li t1, 1 + sll t0, t1, t0 + .word 3447812183 + .word 1577070679 + .word 3380670551 + .word 1577238615 + .word 3447812183 + .word 1241784407 + .word 221179991 + .word 1577073239 + .word 2785258103 + + j 2f +1: + .word 3439489111 + .word 1271146583 +2: + + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + + .word 221182167 + j 1f + +.Lenc_blocks_128: + .word 221182167 + # load plaintext into v24 + .word 33909767 + # update iv + .word 2739447927 + # reverse the iv's bits order back + .word 1258565207 +1: + .word 797838423 + slli t0, a7, 2 + sub t4, t4, a7 + add a0, a0, t0 + .word 2786307191 + .word 2787191927 + .word 2788240503 + .word 2789289079 + .word 2790337655 + .word 2791386231 + .word 2792434807 + .word 2793483383 + .word 2794531959 + .word 2795580535 + .word 2796661879 + + .word 797838423 + + # store ciphertext + .word 221147223 + .word 33942567 + add a1, a1, t0 + sub t3, t3, a7 + + bnez t4, .Lenc_blocks_128 + + bnez a6, 1f + ret +1: + # slidedown second to last block + addi a7, a7, -4 + .word 3441586263 + # ciphertext + .word 1065929815 + # multiplier + .word 1057540183 + + .word 3439489111 + .word 1577848023 + + # load last block into v24 + # note: We should load the last block before store the second to last block + # for in-place operation. + .word 134770775 + .word 33885191 + + # setup `x` multiplier with byte-reversed order + # 0b00000010 => 0b01000000 (0x40) + li t0, 0x40 + .word 3439489111 + .word 1577074263 + .word 3355504727 + .word 1577242199 + + # compute IV for last block + .word 3439489111 + .word 2747836535 + .word 1258565207 + + # store second to last block + .word 201879639 + .word 33918119 + + + # xts last block + .word 3439489111 + .word 797838423 + .word 2786307191 + .word 2787191927 + .word 2788240503 + .word 2789289079 + .word 2790337655 + .word 2791386231 + .word 2792434807 + .word 2793483383 + .word 2794531959 + .word 2795580535 + .word 2796661879 + + .word 797838423 + + # store last block ciphertext + addi a1, a1, -16 + .word 33942567 + + ret +.size aes_xts_enc_128,.-aes_xts_enc_128 +.p2align 3 +aes_xts_enc_256: + # load input + .word 221182167 + .word 33909767 + + li t0, 5 + # We could simplify the initialization steps if we have `block<=1`. + blt t4, t0, 1f + + # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses + # different order of coefficients. We should use`vbrev8` to reverse the + # data when we use `vgmul`. + .word 3439489111 + .word 1271144535 + .word 221179991 + .word 1577072727 + # v16: [r-IV0, r-IV0, ...] + .word 2785257591 + + # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8. + slli t0, t4, 2 + .word 218296407 + # v2: [`1`, `1`, `1`, `1`, ...] + .word 1577103703 + # v3: [`0`, `1`, `2`, `3`, ...] + .word 1376297431 + .word 227733591 + # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...] + .word 1243816535 + # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...] + .word 1244865367 + slli t0, t4, 1 + .word 219344983 + # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...] + .word 3594716247 + + # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16 + .word 221179991 + .word 1250174039 + .word 2726865015 + + # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28. + # Reverse the bits order back. + .word 1258565207 + + # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number + # in a LMUL=4 register group. + # n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) + # = (VLEN/32) + # We could use vsetvli with `e32, m1` to compute the `n` number. + .word 218133207 + li t1, 1 + sll t0, t1, t0 + .word 3447812183 + .word 1577070679 + .word 3380670551 + .word 1577238615 + .word 3447812183 + .word 1241784407 + .word 221179991 + .word 1577073239 + .word 2785258103 + + j 2f +1: + .word 3439489111 + .word 1271146583 +2: + + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + + + .word 221182167 + j 1f + +.Lenc_blocks_256: + .word 221182167 + # load plaintext into v24 + .word 33909767 + # update iv + .word 2739447927 + # reverse the iv's bits order back + .word 1258565207 +1: + .word 797838423 + slli t0, a7, 2 + sub t4, t4, a7 + add a0, a0, t0 + .word 2786307191 + .word 2787191927 + .word 2788240503 + .word 2789289079 + .word 2790337655 + .word 2791386231 + .word 2792434807 + .word 2793483383 + .word 2794531959 + .word 2795580535 + .word 2796629111 + .word 2797677687 + .word 2798726263 + .word 2799774839 + .word 2800856183 + + .word 797838423 + + # store ciphertext + .word 221147223 + .word 33942567 + add a1, a1, t0 + sub t3, t3, a7 + + bnez t4, .Lenc_blocks_256 + + bnez a6, 1f + ret +1: + # slidedown second to last block + addi a7, a7, -4 + .word 3441586263 + # ciphertext + .word 1065929815 + # multiplier + .word 1057540183 + + .word 3439489111 + .word 1577848023 + + # load last block into v24 + # note: We should load the last block before store the second to last block + # for in-place operation. + .word 134770775 + .word 33885191 + + # setup `x` multiplier with byte-reversed order + # 0b00000010 => 0b01000000 (0x40) + li t0, 0x40 + .word 3439489111 + .word 1577074263 + .word 3355504727 + .word 1577242199 + + # compute IV for last block + .word 3439489111 + .word 2747836535 + .word 1258565207 + + # store second to last block + .word 201879639 + .word 33918119 + + + # xts last block + .word 3439489111 + .word 797838423 + .word 2786307191 + .word 2787191927 + .word 2788240503 + .word 2789289079 + .word 2790337655 + .word 2791386231 + .word 2792434807 + .word 2793483383 + .word 2794531959 + .word 2795580535 + .word 2796629111 + .word 2797677687 + .word 2798726263 + .word 2799774839 + .word 2800856183 + + .word 797838423 + + # store last block ciphertext + addi a1, a1, -16 + .word 33942567 + + ret +.size aes_xts_enc_256,.-aes_xts_enc_256 +.p2align 3 +.globl rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt +.type rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt,@function +rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt: + # Load number of rounds + lwu t0, 240(a4) + .word 3439489111 + .word 34074119 + .word 34041479 + .word 2815667831 + addi t0, t0, -1 + addi a4, a4, 16 +1: + .word 34041479 + .word 2815503991 + addi t0, t0, -1 + addi a4, a4, 16 + bnez t0, 1b + .word 34041479 + .word 2815536759 + + + # aes block size is 16 + andi a6, a2, 15 + beqz a6, 1f + sub a2, a2, a6 + addi a2, a2, -16 +1: + # We make the `LENGTH` become e32 length here. + srli t4, a2, 2 + + # Load number of rounds + lwu t0, 240(a3) + li t1, 14 + li t2, 10 + beq t0, t1, aes_xts_dec_256 + beq t0, t2, aes_xts_dec_128 +.size rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt,.-rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt +.p2align 3 +aes_xts_dec_128: + # load input + .word 221182167 + .word 33909767 + + li t0, 5 + # We could simplify the initialization steps if we have `block<=1`. + blt t4, t0, 1f + + # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses + # different order of coefficients. We should use`vbrev8` to reverse the + # data when we use `vgmul`. + .word 3439489111 + .word 1271144535 + .word 221179991 + .word 1577072727 + # v16: [r-IV0, r-IV0, ...] + .word 2785257591 + + # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8. + slli t0, t4, 2 + .word 218296407 + # v2: [`1`, `1`, `1`, `1`, ...] + .word 1577103703 + # v3: [`0`, `1`, `2`, `3`, ...] + .word 1376297431 + .word 227733591 + # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...] + .word 1243816535 + # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...] + .word 1244865367 + slli t0, t4, 1 + .word 219344983 + # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...] + .word 3594716247 + + # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16 + .word 221179991 + .word 1250174039 + .word 2726865015 + + # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28. + # Reverse the bits order back. + .word 1258565207 + + # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number + # in a LMUL=4 register group. + # n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) + # = (VLEN/32) + # We could use vsetvli with `e32, m1` to compute the `n` number. + .word 218133207 + li t1, 1 + sll t0, t1, t0 + .word 3447812183 + .word 1577070679 + .word 3380670551 + .word 1577238615 + .word 3447812183 + .word 1241784407 + .word 221179991 + .word 1577073239 + .word 2785258103 + + j 2f +1: + .word 3439489111 + .word 1271146583 +2: + + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + + beqz t4, 2f + + .word 221182167 + j 1f + +.Ldec_blocks_128: + .word 221182167 + # load ciphertext into v24 + .word 33909767 + # update iv + .word 2739447927 + # reverse the iv's bits order back + .word 1258565207 +1: + .word 797838423 + slli t0, a7, 2 + sub t4, t4, a7 + add a0, a0, t0 + .word 2796792951 + .word 2795514999 + .word 2794466423 + .word 2793417847 + .word 2792369271 + .word 2791320695 + .word 2790272119 + .word 2789223543 + .word 2788174967 + .word 2787126391 + .word 2786110583 + + .word 797838423 + + # store plaintext + .word 33942567 + add a1, a1, t0 + + bnez t4, .Ldec_blocks_128 + +2: + bnez a6, 1f + ret +1: + # load second to last block's ciphertext + .word 3439489111 + .word 33909767 + addi a0, a0, 16 + + # setup `x` multiplier with byte-reversed order + # 0b00000010 => 0b01000000 (0x40) + li t0, 0x40 + .word 3439489111 + .word 1577073239 + .word 3355504727 + .word 1577241175 + + beqz a2, 1f + # slidedown third to last block + addi a7, a7, -4 + .word 3441586263 + # multiplier + .word 1057540183 + + # compute IV for last block + .word 3439489111 + .word 2739447927 + .word 1258565207 + + # compute IV for second to last block + .word 2739447927 + .word 1258565335 + j 2f +1: + # compute IV for second to last block + .word 3439489111 + .word 2739447927 + .word 1258565335 +2: + + + ## xts second to last block + .word 3439489111 + .word 797871191 + .word 2796792951 + .word 2795514999 + .word 2794466423 + .word 2793417847 + .word 2792369271 + .word 2791320695 + .word 2790272119 + .word 2789223543 + .word 2788174967 + .word 2787126391 + .word 2786110583 + + .word 797871191 + .word 1577848023 + + # load last block ciphertext + .word 134770775 + .word 33885191 + + # store second to last block plaintext + addi t0, a1, 16 + .word 33721511 + + ## xts last block + .word 3439489111 + .word 797838423 + .word 2796792951 + .word 2795514999 + .word 2794466423 + .word 2793417847 + .word 2792369271 + .word 2791320695 + .word 2790272119 + .word 2789223543 + .word 2788174967 + .word 2787126391 + .word 2786110583 + + .word 797838423 + + # store second to last block plaintext + .word 33942567 + + ret +.size aes_xts_dec_128,.-aes_xts_dec_128 +.p2align 3 +aes_xts_dec_256: + # load input + .word 221182167 + .word 33909767 + + li t0, 5 + # We could simplify the initialization steps if we have `block<=1`. + blt t4, t0, 1f + + # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses + # different order of coefficients. We should use`vbrev8` to reverse the + # data when we use `vgmul`. + .word 3439489111 + .word 1271144535 + .word 221179991 + .word 1577072727 + # v16: [r-IV0, r-IV0, ...] + .word 2785257591 + + # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8. + slli t0, t4, 2 + .word 218296407 + # v2: [`1`, `1`, `1`, `1`, ...] + .word 1577103703 + # v3: [`0`, `1`, `2`, `3`, ...] + .word 1376297431 + .word 227733591 + # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...] + .word 1243816535 + # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...] + .word 1244865367 + slli t0, t4, 1 + .word 219344983 + # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...] + .word 3594716247 + + # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16 + .word 221179991 + .word 1250174039 + .word 2726865015 + + # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28. + # Reverse the bits order back. + .word 1258565207 + + # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number + # in a LMUL=4 register group. + # n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) + # = (VLEN/32) + # We could use vsetvli with `e32, m1` to compute the `n` number. + .word 218133207 + li t1, 1 + sll t0, t1, t0 + .word 3447812183 + .word 1577070679 + .word 3380670551 + .word 1577238615 + .word 3447812183 + .word 1241784407 + .word 221179991 + .word 1577073239 + .word 2785258103 + + j 2f +1: + .word 3439489111 + .word 1271146583 +2: + + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + + + beqz t4, 2f + + .word 221182167 + j 1f + +.Ldec_blocks_256: + .word 221182167 + # load ciphertext into v24 + .word 33909767 + # update iv + .word 2739447927 + # reverse the iv's bits order back + .word 1258565207 +1: + .word 797838423 + slli t0, a7, 2 + sub t4, t4, a7 + add a0, a0, t0 + .word 2800987255 + .word 2799709303 + .word 2798660727 + .word 2797612151 + .word 2796563575 + .word 2795514999 + .word 2794466423 + .word 2793417847 + .word 2792369271 + .word 2791320695 + .word 2790272119 + .word 2789223543 + .word 2788174967 + .word 2787126391 + .word 2786110583 + + .word 797838423 + + # store plaintext + .word 33942567 + add a1, a1, t0 + + bnez t4, .Ldec_blocks_256 + +2: + bnez a6, 1f + ret +1: + # load second to last block's ciphertext + .word 3439489111 + .word 33909767 + addi a0, a0, 16 + + # setup `x` multiplier with byte-reversed order + # 0b00000010 => 0b01000000 (0x40) + li t0, 0x40 + .word 3439489111 + .word 1577073239 + .word 3355504727 + .word 1577241175 + + beqz a2, 1f + # slidedown third to last block + addi a7, a7, -4 + .word 3441586263 + # multiplier + .word 1057540183 + + # compute IV for last block + .word 3439489111 + .word 2739447927 + .word 1258565207 + + # compute IV for second to last block + .word 2739447927 + .word 1258565335 + j 2f +1: + # compute IV for second to last block + .word 3439489111 + .word 2739447927 + .word 1258565335 +2: + + + ## xts second to last block + .word 3439489111 + .word 797871191 + .word 2800987255 + .word 2799709303 + .word 2798660727 + .word 2797612151 + .word 2796563575 + .word 2795514999 + .word 2794466423 + .word 2793417847 + .word 2792369271 + .word 2791320695 + .word 2790272119 + .word 2789223543 + .word 2788174967 + .word 2787126391 + .word 2786110583 + + .word 797871191 + .word 1577848023 + + # load last block ciphertext + .word 134770775 + .word 33885191 + + # store second to last block plaintext + addi t0, a1, 16 + .word 33721511 + + ## xts last block + .word 3439489111 + .word 797838423 + .word 2800987255 + .word 2799709303 + .word 2798660727 + .word 2797612151 + .word 2796563575 + .word 2795514999 + .word 2794466423 + .word 2793417847 + .word 2792369271 + .word 2791320695 + .word 2790272119 + .word 2789223543 + .word 2788174967 + .word 2787126391 + .word 2786110583 + + .word 797838423 + + # store second to last block plaintext + .word 33942567 + + ret +.size aes_xts_dec_256,.-aes_xts_dec_256 diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvkb-zvkned.s b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvkb-zvkned.s new file mode 100644 index 000000000000..2d6a71e355eb --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvkb-zvkned.s @@ -0,0 +1,326 @@ +.text +.p2align 3 +.globl rv64i_zvkb_zvkned_ctr32_encrypt_blocks +.type rv64i_zvkb_zvkned_ctr32_encrypt_blocks,@function +rv64i_zvkb_zvkned_ctr32_encrypt_blocks: + beqz a2, 1f + + # Load number of rounds + lwu t0, 240(a3) + li t1, 14 + li t2, 12 + li t3, 10 + + slli t5, a2, 2 + + beq t0, t1, ctr32_encrypt_blocks_256 + beq t0, t2, ctr32_encrypt_blocks_192 + beq t0, t3, ctr32_encrypt_blocks_128 + +1: + ret + +.size rv64i_zvkb_zvkned_ctr32_encrypt_blocks,.-rv64i_zvkb_zvkned_ctr32_encrypt_blocks +.p2align 3 +ctr32_encrypt_blocks_128: + # Load all 11 round keys to v1-v11 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + # Setup mask into v0 + # The mask pattern for 4*N-th elements + # mask v0: [000100010001....] + # Note: + # We could setup the mask just for the maximum element length instead of + # the VLMAX. + li t0, 0b10001000 + .word 201356247 + .word 1577238615 + # Load IV. + # v31:[IV0, IV1, IV2, big-endian count] + .word 3439489111 + .word 34041735 + # Convert the big-endian counter into little-endian. + .word 3305271383 + .word 1240772567 + # Splat the IV to v16 + .word 221212759 + .word 1577072727 + .word 2817763447 + # Prepare the ctr pattern into v20 + # v20: [x, x, x, 0, x, x, x, 1, x, x, x, 2, ...] + .word 1342712407 + # v16:[IV0, IV1, IV2, count+0, IV0, IV1, IV2, count+1, ...] + .word 86998743 + .word 17434711 + + + ##### AES body + j 2f +1: + .word 86998743 + # Increase ctr in v16. + .word 17811543 +2: + # Load plaintext into v20 + .word 33909255 + slli t0, t4, 2 + srli t6, t4, 2 + sub t5, t5, t4 + add a0, a0, t0 + # Prepare the AES ctr input into v24. + # The ctr data uses big-endian form. + .word 1577585751 + .word 1233431639 + + .word 2786307191 + .word 2787191927 + .word 2788240503 + .word 2789289079 + .word 2790337655 + .word 2791386231 + .word 2792434807 + .word 2793483383 + .word 2794531959 + .word 2795580535 + .word 2796661879 + + # ciphertext + .word 797576279 + + # Store the ciphertext. + .word 33942567 + add a1, a1, t0 + + bnez t5, 1b + + ret +.size ctr32_encrypt_blocks_128,.-ctr32_encrypt_blocks_128 +.p2align 3 +ctr32_encrypt_blocks_192: + # Load all 13 round keys to v1-v13 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + + # Setup mask into v0 + # The mask pattern for 4*N-th elements + # mask v0: [000100010001....] + # Note: + # We could setup the mask just for the maximum element length instead of + # the VLMAX. + li t0, 0b10001000 + .word 201356247 + .word 1577238615 + # Load IV. + # v31:[IV0, IV1, IV2, big-endian count] + .word 3439489111 + .word 34041735 + # Convert the big-endian counter into little-endian. + .word 3305271383 + .word 1240772567 + # Splat the IV to v16 + .word 221212759 + .word 1577072727 + .word 2817763447 + # Prepare the ctr pattern into v20 + # v20: [x, x, x, 0, x, x, x, 1, x, x, x, 2, ...] + .word 1342712407 + # v16:[IV0, IV1, IV2, count+0, IV0, IV1, IV2, count+1, ...] + .word 86998743 + .word 17434711 + + + ##### AES body + j 2f +1: + .word 86998743 + # Increase ctr in v16. + .word 17811543 +2: + # Load plaintext into v20 + .word 33909255 + slli t0, t4, 2 + srli t6, t4, 2 + sub t5, t5, t4 + add a0, a0, t0 + # Prepare the AES ctr input into v24. + # The ctr data uses big-endian form. + .word 1577585751 + .word 1233431639 + + .word 2786307191 + .word 2787191927 + .word 2788240503 + .word 2789289079 + .word 2790337655 + .word 2791386231 + .word 2792434807 + .word 2793483383 + .word 2794531959 + .word 2795580535 + .word 2796629111 + .word 2797677687 + .word 2798759031 + + # ciphertext + .word 797576279 + + # Store the ciphertext. + .word 33942567 + add a1, a1, t0 + + bnez t5, 1b + + ret +.size ctr32_encrypt_blocks_192,.-ctr32_encrypt_blocks_192 +.p2align 3 +ctr32_encrypt_blocks_256: + # Load all 15 round keys to v1-v15 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + + # Setup mask into v0 + # The mask pattern for 4*N-th elements + # mask v0: [000100010001....] + # Note: + # We could setup the mask just for the maximum element length instead of + # the VLMAX. + li t0, 0b10001000 + .word 201356247 + .word 1577238615 + # Load IV. + # v31:[IV0, IV1, IV2, big-endian count] + .word 3439489111 + .word 34041735 + # Convert the big-endian counter into little-endian. + .word 3305271383 + .word 1240772567 + # Splat the IV to v16 + .word 221212759 + .word 1577072727 + .word 2817763447 + # Prepare the ctr pattern into v20 + # v20: [x, x, x, 0, x, x, x, 1, x, x, x, 2, ...] + .word 1342712407 + # v16:[IV0, IV1, IV2, count+0, IV0, IV1, IV2, count+1, ...] + .word 86998743 + .word 17434711 + + + ##### AES body + j 2f +1: + .word 86998743 + # Increase ctr in v16. + .word 17811543 +2: + # Load plaintext into v20 + .word 33909255 + slli t0, t4, 2 + srli t6, t4, 2 + sub t5, t5, t4 + add a0, a0, t0 + # Prepare the AES ctr input into v24. + # The ctr data uses big-endian form. + .word 1577585751 + .word 1233431639 + + .word 2786307191 + .word 2787191927 + .word 2788240503 + .word 2789289079 + .word 2790337655 + .word 2791386231 + .word 2792434807 + .word 2793483383 + .word 2794531959 + .word 2795580535 + .word 2796629111 + .word 2797677687 + .word 2798726263 + .word 2799774839 + .word 2800856183 + + # ciphertext + .word 797576279 + + # Store the ciphertext. + .word 33942567 + add a1, a1, t0 + + bnez t5, 1b + + ret +.size ctr32_encrypt_blocks_256,.-ctr32_encrypt_blocks_256 diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvkned.s b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvkned.s new file mode 100644 index 000000000000..654e2242146c --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvkned.s @@ -0,0 +1,1390 @@ +.text +.p2align 3 +.globl rv64i_zvkned_cbc_encrypt +.type rv64i_zvkned_cbc_encrypt,@function +rv64i_zvkned_cbc_encrypt: + # check whether the length is a multiple of 16 and >= 16 + li t1, 16 + blt a2, t1, L_end + andi t1, a2, 15 + bnez t1, L_end + + # Load number of rounds + lwu t2, 240(a3) + + # Get proper routine for key size + li t0, 10 + beq t2, t0, L_cbc_enc_128 + + li t0, 12 + beq t2, t0, L_cbc_enc_192 + + li t0, 14 + beq t2, t0, L_cbc_enc_256 + + ret +.size rv64i_zvkned_cbc_encrypt,.-rv64i_zvkned_cbc_encrypt +.p2align 3 +L_cbc_enc_128: + # Load all 11 round keys to v1-v11 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + + # Load IV. + .word 34039815 + + .word 33909767 + .word 797445207 + j 2f + +1: + .word 33908871 + .word 797477975 + +2: + # AES body + .word 2786307191 # with round key w[ 0, 3] + .word 2787191927 # with round key w[ 4, 7] + .word 2788240503 # with round key w[ 8,11] + .word 2789289079 # with round key w[12,15] + .word 2790337655 # with round key w[16,19] + .word 2791386231 # with round key w[20,23] + .word 2792434807 # with round key w[24,27] + .word 2793483383 # with round key w[28,31] + .word 2794531959 # with round key w[32,35] + .word 2795580535 # with round key w[36,39] + .word 2796661879 # with round key w[40,43] + + + .word 33942567 + + addi a0, a0, 16 + addi a1, a1, 16 + addi a2, a2, -16 + + bnez a2, 1b + + .word 34040871 + + ret +.size L_cbc_enc_128,.-L_cbc_enc_128 +.p2align 3 +L_cbc_enc_192: + # Load all 13 round keys to v1-v13 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + + + # Load IV. + .word 34039815 + + .word 33909767 + .word 797445207 + j 2f + +1: + .word 33908871 + .word 797477975 + +2: + # AES body + .word 2786307191 # with round key w[ 0, 3] + .word 2787191927 # with round key w[ 4, 7] + .word 2788240503 # with round key w[ 8,11] + .word 2789289079 # with round key w[12,15] + .word 2790337655 # with round key w[16,19] + .word 2791386231 # with round key w[20,23] + .word 2792434807 # with round key w[24,27] + .word 2793483383 # with round key w[28,31] + .word 2794531959 # with round key w[32,35] + .word 2795580535 # with round key w[36,39] + .word 2796629111 # with round key w[40,43] + .word 2797677687 # with round key w[44,47] + .word 2798759031 # with round key w[48,51] + + + .word 33942567 + + addi a0, a0, 16 + addi a1, a1, 16 + addi a2, a2, -16 + + bnez a2, 1b + + .word 34040871 + + ret +.size L_cbc_enc_192,.-L_cbc_enc_192 +.p2align 3 +L_cbc_enc_256: + # Load all 15 round keys to v1-v15 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + + + # Load IV. + .word 34039815 + + .word 33909767 + .word 797445207 + j 2f + +1: + .word 33908871 + .word 797477975 + +2: + # AES body + .word 2786307191 # with round key w[ 0, 3] + .word 2787191927 # with round key w[ 4, 7] + .word 2788240503 # with round key w[ 8,11] + .word 2789289079 # with round key w[12,15] + .word 2790337655 # with round key w[16,19] + .word 2791386231 # with round key w[20,23] + .word 2792434807 # with round key w[24,27] + .word 2793483383 # with round key w[28,31] + .word 2794531959 # with round key w[32,35] + .word 2795580535 # with round key w[36,39] + .word 2796629111 # with round key w[40,43] + .word 2797677687 # with round key w[44,47] + .word 2798726263 # with round key w[48,51] + .word 2799774839 # with round key w[52,55] + .word 2800856183 # with round key w[56,59] + + + .word 33942567 + + addi a0, a0, 16 + addi a1, a1, 16 + addi a2, a2, -16 + + bnez a2, 1b + + .word 34040871 + + ret +.size L_cbc_enc_256,.-L_cbc_enc_256 +.p2align 3 +.globl rv64i_zvkned_cbc_decrypt +.type rv64i_zvkned_cbc_decrypt,@function +rv64i_zvkned_cbc_decrypt: + # check whether the length is a multiple of 16 and >= 16 + li t1, 16 + blt a2, t1, L_end + andi t1, a2, 15 + bnez t1, L_end + + # Load number of rounds + lwu t2, 240(a3) + + # Get proper routine for key size + li t0, 10 + beq t2, t0, L_cbc_dec_128 + + li t0, 12 + beq t2, t0, L_cbc_dec_192 + + li t0, 14 + beq t2, t0, L_cbc_dec_256 + + ret +.size rv64i_zvkned_cbc_decrypt,.-rv64i_zvkned_cbc_decrypt +.p2align 3 +L_cbc_dec_128: + # Load all 11 round keys to v1-v11 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + + # Load IV. + .word 34039815 + + .word 33909767 + .word 1577846999 + j 2f + +1: + .word 33909767 + .word 1577846999 + addi a1, a1, 16 + +2: + # AES body + .word 2796792951 # with round key w[40,43] + .word 2795514999 # with round key w[36,39] + .word 2794466423 # with round key w[32,35] + .word 2793417847 # with round key w[28,31] + .word 2792369271 # with round key w[24,27] + .word 2791320695 # with round key w[20,23] + .word 2790272119 # with round key w[16,19] + .word 2789223543 # with round key w[12,15] + .word 2788174967 # with round key w[ 8,11] + .word 2787126391 # with round key w[ 4, 7] + .word 2786110583 # with round key w[ 0, 3] + + + .word 797445207 + .word 33942567 + .word 1577617495 + + addi a2, a2, -16 + addi a0, a0, 16 + + bnez a2, 1b + + .word 34039847 + + ret +.size L_cbc_dec_128,.-L_cbc_dec_128 +.p2align 3 +L_cbc_dec_192: + # Load all 13 round keys to v1-v13 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + + + # Load IV. + .word 34039815 + + .word 33909767 + .word 1577846999 + j 2f + +1: + .word 33909767 + .word 1577846999 + addi a1, a1, 16 + +2: + # AES body + .word 2798890103 # with round key w[48,51] + .word 2797612151 # with round key w[44,47] + .word 2796563575 # with round key w[40,43] + .word 2795514999 # with round key w[36,39] + .word 2794466423 # with round key w[32,35] + .word 2793417847 # with round key w[28,31] + .word 2792369271 # with round key w[24,27] + .word 2791320695 # with round key w[20,23] + .word 2790272119 # with round key w[16,19] + .word 2789223543 # with round key w[12,15] + .word 2788174967 # with round key w[ 8,11] + .word 2787126391 # with round key w[ 4, 7] + .word 2786110583 # with round key w[ 0, 3] + + + .word 797445207 + .word 33942567 + .word 1577617495 + + addi a2, a2, -16 + addi a0, a0, 16 + + bnez a2, 1b + + .word 34039847 + + ret +.size L_cbc_dec_192,.-L_cbc_dec_192 +.p2align 3 +L_cbc_dec_256: + # Load all 15 round keys to v1-v15 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + + + # Load IV. + .word 34039815 + + .word 33909767 + .word 1577846999 + j 2f + +1: + .word 33909767 + .word 1577846999 + addi a1, a1, 16 + +2: + # AES body + .word 2800987255 # with round key w[56,59] + .word 2799709303 # with round key w[52,55] + .word 2798660727 # with round key w[48,51] + .word 2797612151 # with round key w[44,47] + .word 2796563575 # with round key w[40,43] + .word 2795514999 # with round key w[36,39] + .word 2794466423 # with round key w[32,35] + .word 2793417847 # with round key w[28,31] + .word 2792369271 # with round key w[24,27] + .word 2791320695 # with round key w[20,23] + .word 2790272119 # with round key w[16,19] + .word 2789223543 # with round key w[12,15] + .word 2788174967 # with round key w[ 8,11] + .word 2787126391 # with round key w[ 4, 7] + .word 2786110583 # with round key w[ 0, 3] + + + .word 797445207 + .word 33942567 + .word 1577617495 + + addi a2, a2, -16 + addi a0, a0, 16 + + bnez a2, 1b + + .word 34039847 + + ret +.size L_cbc_dec_256,.-L_cbc_dec_256 +.p2align 3 +.globl rv64i_zvkned_ecb_encrypt +.type rv64i_zvkned_ecb_encrypt,@function +rv64i_zvkned_ecb_encrypt: + # Make the LEN become e32 length. + srli t3, a2, 2 + + # Load number of rounds + lwu t2, 240(a3) + + # Get proper routine for key size + li t0, 10 + beq t2, t0, L_ecb_enc_128 + + li t0, 12 + beq t2, t0, L_ecb_enc_192 + + li t0, 14 + beq t2, t0, L_ecb_enc_256 + + ret +.size rv64i_zvkned_ecb_encrypt,.-rv64i_zvkned_ecb_encrypt +.p2align 3 +L_ecb_enc_128: + # Load all 11 round keys to v1-v11 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + +1: + .word 221149271 + slli t0, a6, 2 + sub t3, t3, a6 + + .word 33909767 + + # AES body + .word 2786307191 # with round key w[ 0, 3] + .word 2787191927 # with round key w[ 4, 7] + .word 2788240503 # with round key w[ 8,11] + .word 2789289079 # with round key w[12,15] + .word 2790337655 # with round key w[16,19] + .word 2791386231 # with round key w[20,23] + .word 2792434807 # with round key w[24,27] + .word 2793483383 # with round key w[28,31] + .word 2794531959 # with round key w[32,35] + .word 2795580535 # with round key w[36,39] + .word 2796661879 # with round key w[40,43] + + + .word 33942567 + + add a0, a0, t0 + add a1, a1, t0 + + bnez t3, 1b + + ret +.size L_ecb_enc_128,.-L_ecb_enc_128 +.p2align 3 +L_ecb_enc_192: + # Load all 13 round keys to v1-v13 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + + +1: + .word 221149271 + slli t0, a6, 2 + sub t3, t3, a6 + + .word 33909767 + + # AES body + .word 2786307191 # with round key w[ 0, 3] + .word 2787191927 # with round key w[ 4, 7] + .word 2788240503 # with round key w[ 8,11] + .word 2789289079 # with round key w[12,15] + .word 2790337655 # with round key w[16,19] + .word 2791386231 # with round key w[20,23] + .word 2792434807 # with round key w[24,27] + .word 2793483383 # with round key w[28,31] + .word 2794531959 # with round key w[32,35] + .word 2795580535 # with round key w[36,39] + .word 2796629111 # with round key w[40,43] + .word 2797677687 # with round key w[44,47] + .word 2798759031 # with round key w[48,51] + + + .word 33942567 + + add a0, a0, t0 + add a1, a1, t0 + + bnez t3, 1b + + ret +.size L_ecb_enc_192,.-L_ecb_enc_192 +.p2align 3 +L_ecb_enc_256: + # Load all 15 round keys to v1-v15 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + + +1: + .word 221149271 + slli t0, a6, 2 + sub t3, t3, a6 + + .word 33909767 + + # AES body + .word 2786307191 # with round key w[ 0, 3] + .word 2787191927 # with round key w[ 4, 7] + .word 2788240503 # with round key w[ 8,11] + .word 2789289079 # with round key w[12,15] + .word 2790337655 # with round key w[16,19] + .word 2791386231 # with round key w[20,23] + .word 2792434807 # with round key w[24,27] + .word 2793483383 # with round key w[28,31] + .word 2794531959 # with round key w[32,35] + .word 2795580535 # with round key w[36,39] + .word 2796629111 # with round key w[40,43] + .word 2797677687 # with round key w[44,47] + .word 2798726263 # with round key w[48,51] + .word 2799774839 # with round key w[52,55] + .word 2800856183 # with round key w[56,59] + + + .word 33942567 + + add a0, a0, t0 + add a1, a1, t0 + + bnez t3, 1b + + ret +.size L_ecb_enc_256,.-L_ecb_enc_256 +.p2align 3 +.globl rv64i_zvkned_ecb_decrypt +.type rv64i_zvkned_ecb_decrypt,@function +rv64i_zvkned_ecb_decrypt: + # Make the LEN become e32 length. + srli t3, a2, 2 + + # Load number of rounds + lwu t2, 240(a3) + + # Get proper routine for key size + li t0, 10 + beq t2, t0, L_ecb_dec_128 + + li t0, 12 + beq t2, t0, L_ecb_dec_192 + + li t0, 14 + beq t2, t0, L_ecb_dec_256 + + ret +.size rv64i_zvkned_ecb_decrypt,.-rv64i_zvkned_ecb_decrypt +.p2align 3 +L_ecb_dec_128: + # Load all 11 round keys to v1-v11 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + +1: + .word 221149271 + slli t0, a6, 2 + sub t3, t3, a6 + + .word 33909767 + + # AES body + .word 2796792951 # with round key w[40,43] + .word 2795514999 # with round key w[36,39] + .word 2794466423 # with round key w[32,35] + .word 2793417847 # with round key w[28,31] + .word 2792369271 # with round key w[24,27] + .word 2791320695 # with round key w[20,23] + .word 2790272119 # with round key w[16,19] + .word 2789223543 # with round key w[12,15] + .word 2788174967 # with round key w[ 8,11] + .word 2787126391 # with round key w[ 4, 7] + .word 2786110583 # with round key w[ 0, 3] + + + .word 33942567 + + add a0, a0, t0 + add a1, a1, t0 + + bnez t3, 1b + + ret +.size L_ecb_dec_128,.-L_ecb_dec_128 +.p2align 3 +L_ecb_dec_192: + # Load all 13 round keys to v1-v13 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + + +1: + .word 221149271 + slli t0, a6, 2 + sub t3, t3, a6 + + .word 33909767 + + # AES body + .word 2798890103 # with round key w[48,51] + .word 2797612151 # with round key w[44,47] + .word 2796563575 # with round key w[40,43] + .word 2795514999 # with round key w[36,39] + .word 2794466423 # with round key w[32,35] + .word 2793417847 # with round key w[28,31] + .word 2792369271 # with round key w[24,27] + .word 2791320695 # with round key w[20,23] + .word 2790272119 # with round key w[16,19] + .word 2789223543 # with round key w[12,15] + .word 2788174967 # with round key w[ 8,11] + .word 2787126391 # with round key w[ 4, 7] + .word 2786110583 # with round key w[ 0, 3] + + + .word 33942567 + + add a0, a0, t0 + add a1, a1, t0 + + bnez t3, 1b + + ret +.size L_ecb_dec_192,.-L_ecb_dec_192 +.p2align 3 +L_ecb_dec_256: + # Load all 15 round keys to v1-v15 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + + +1: + .word 221149271 + slli t0, a6, 2 + sub t3, t3, a6 + + .word 33909767 + + # AES body + .word 2800987255 # with round key w[56,59] + .word 2799709303 # with round key w[52,55] + .word 2798660727 # with round key w[48,51] + .word 2797612151 # with round key w[44,47] + .word 2796563575 # with round key w[40,43] + .word 2795514999 # with round key w[36,39] + .word 2794466423 # with round key w[32,35] + .word 2793417847 # with round key w[28,31] + .word 2792369271 # with round key w[24,27] + .word 2791320695 # with round key w[20,23] + .word 2790272119 # with round key w[16,19] + .word 2789223543 # with round key w[12,15] + .word 2788174967 # with round key w[ 8,11] + .word 2787126391 # with round key w[ 4, 7] + .word 2786110583 # with round key w[ 0, 3] + + + .word 33942567 + + add a0, a0, t0 + add a1, a1, t0 + + bnez t3, 1b + + ret +.size L_ecb_dec_256,.-L_ecb_dec_256 +.p2align 3 +.globl rv64i_zvkned_set_encrypt_key +.type rv64i_zvkned_set_encrypt_key,@function +rv64i_zvkned_set_encrypt_key: + # Get proper routine for key size + li t1, 256 + beq a1, t1, L_set_key_256 + li t1, 128 + beq a1, t1, L_set_key_128 + + j L_fail_m2 + +.size rv64i_zvkned_set_encrypt_key,.-rv64i_zvkned_set_encrypt_key +.p2align 3 +.globl rv64i_zvkned_set_decrypt_key +.type rv64i_zvkned_set_decrypt_key,@function +rv64i_zvkned_set_decrypt_key: + # Get proper routine for key size + li t1, 256 + beq a1, t1, L_set_key_256 + li t1, 128 + beq a1, t1, L_set_key_128 + + j L_fail_m2 + +.size rv64i_zvkned_set_decrypt_key,.-rv64i_zvkned_set_decrypt_key +.p2align 3 +L_set_key_128: + # Store the number of rounds + li t2, 10 + sw t2, 240(a2) + + .word 0xc1027057 + + # Load the key + .word 33907975 + + # Generate keys for round 2-11 into registers v11-v20. + .word 2325784055 # v11 <- rk2 (w[ 4, 7]) + .word 2326865527 # v12 <- rk3 (w[ 8,11]) + .word 2327946999 # v13 <- rk4 (w[12,15]) + .word 2329028471 # v14 <- rk5 (w[16,19]) + .word 2330109943 # v15 <- rk6 (w[20,23]) + .word 2331191415 # v16 <- rk7 (w[24,27]) + .word 2332272887 # v17 <- rk8 (w[28,31]) + .word 2333354359 # v18 <- rk9 (w[32,35]) + .word 2334435831 # v19 <- rk10 (w[36,39]) + .word 2335517303 # v20 <- rk11 (w[40,43]) + + # Store the round keys + .word 33973543 + addi a2, a2, 16 + .word 33973671 + addi a2, a2, 16 + .word 33973799 + addi a2, a2, 16 + .word 33973927 + addi a2, a2, 16 + .word 33974055 + addi a2, a2, 16 + .word 33974183 + addi a2, a2, 16 + .word 33974311 + addi a2, a2, 16 + .word 33974439 + addi a2, a2, 16 + .word 33974567 + addi a2, a2, 16 + .word 33974695 + addi a2, a2, 16 + .word 33974823 + + li a0, 1 + ret +.size L_set_key_128,.-L_set_key_128 +.p2align 3 +L_set_key_256: + # Store the number of rounds + li t2, 14 + sw t2, 240(a2) + + .word 0xc1027057 + + # Load the key + .word 33907975 + addi a0, a0, 16 + .word 33908103 + + .word 1577387607 + .word 2863736439 + .word 1577420503 + .word 2864817911 + .word 1577453399 + .word 2865899383 + .word 1577486295 + .word 2866980855 + .word 1577519191 + .word 2868062327 + .word 1577552087 + .word 2869143799 + .word 1577584983 + .word 2870225271 + .word 1577617879 + .word 2871306743 + .word 1577650775 + .word 2872388215 + .word 1577683671 + .word 2873469687 + .word 1577716567 + .word 2874551159 + .word 1577749463 + .word 2875632631 + .word 1577782359 + .word 2876714103 + + .word 33973543 + addi a2, a2, 16 + .word 33973671 + addi a2, a2, 16 + .word 33973799 + addi a2, a2, 16 + .word 33973927 + addi a2, a2, 16 + .word 33974055 + addi a2, a2, 16 + .word 33974183 + addi a2, a2, 16 + .word 33974311 + addi a2, a2, 16 + .word 33974439 + addi a2, a2, 16 + .word 33974567 + addi a2, a2, 16 + .word 33974695 + addi a2, a2, 16 + .word 33974823 + addi a2, a2, 16 + .word 33974951 + addi a2, a2, 16 + .word 33975079 + addi a2, a2, 16 + .word 33975207 + addi a2, a2, 16 + .word 33975335 + + li a0, 1 + ret +.size L_set_key_256,.-L_set_key_256 +.p2align 3 +.globl rv64i_zvkned_encrypt +.type rv64i_zvkned_encrypt,@function +rv64i_zvkned_encrypt: + # Load number of rounds + lwu t5, 240(a2) + + # Get proper routine for key size + li t6, 14 + beq t5, t6, L_enc_256 + li t6, 10 + beq t5, t6, L_enc_128 + li t6, 12 + beq t5, t6, L_enc_192 + + j L_fail_m2 +.size rv64i_zvkned_encrypt,.-rv64i_zvkned_encrypt +.p2align 3 +L_enc_128: + .word 3439489111 + + .word 33906823 + + .word 33973511 + .word 2795741431 # with round key w[ 0, 3] + addi a2, a2, 16 + .word 33973639 + .word 2796626167 # with round key w[ 4, 7] + addi a2, a2, 16 + .word 33973767 + .word 2797674743 # with round key w[ 8,11] + addi a2, a2, 16 + .word 33973895 + .word 2798723319 # with round key w[12,15] + addi a2, a2, 16 + .word 33974023 + .word 2799771895 # with round key w[16,19] + addi a2, a2, 16 + .word 33974151 + .word 2800820471 # with round key w[20,23] + addi a2, a2, 16 + .word 33974279 + .word 2801869047 # with round key w[24,27] + addi a2, a2, 16 + .word 33974407 + .word 2802917623 # with round key w[28,31] + addi a2, a2, 16 + .word 33974535 + .word 2803966199 # with round key w[32,35] + addi a2, a2, 16 + .word 33974663 + .word 2805014775 # with round key w[36,39] + addi a2, a2, 16 + .word 33974791 + .word 2806096119 # with round key w[40,43] + + .word 33939623 + + ret +.size L_enc_128,.-L_enc_128 +.p2align 3 +L_enc_192: + .word 3439489111 + + .word 33906823 + + .word 33973511 + .word 2795741431 # with round key w[ 0, 3] + addi a2, a2, 16 + .word 33973639 + .word 2796626167 + addi a2, a2, 16 + .word 33973767 + .word 2797674743 + addi a2, a2, 16 + .word 33973895 + .word 2798723319 + addi a2, a2, 16 + .word 33974023 + .word 2799771895 + addi a2, a2, 16 + .word 33974151 + .word 2800820471 + addi a2, a2, 16 + .word 33974279 + .word 2801869047 + addi a2, a2, 16 + .word 33974407 + .word 2802917623 + addi a2, a2, 16 + .word 33974535 + .word 2803966199 + addi a2, a2, 16 + .word 33974663 + .word 2805014775 + addi a2, a2, 16 + .word 33974791 + .word 2806063351 + addi a2, a2, 16 + .word 33974919 + .word 2807111927 + addi a2, a2, 16 + .word 33975047 + .word 2808193271 + + .word 33939623 + ret +.size L_enc_192,.-L_enc_192 +.p2align 3 +L_enc_256: + .word 3439489111 + + .word 33906823 + + .word 33973511 + .word 2795741431 # with round key w[ 0, 3] + addi a2, a2, 16 + .word 33973639 + .word 2796626167 + addi a2, a2, 16 + .word 33973767 + .word 2797674743 + addi a2, a2, 16 + .word 33973895 + .word 2798723319 + addi a2, a2, 16 + .word 33974023 + .word 2799771895 + addi a2, a2, 16 + .word 33974151 + .word 2800820471 + addi a2, a2, 16 + .word 33974279 + .word 2801869047 + addi a2, a2, 16 + .word 33974407 + .word 2802917623 + addi a2, a2, 16 + .word 33974535 + .word 2803966199 + addi a2, a2, 16 + .word 33974663 + .word 2805014775 + addi a2, a2, 16 + .word 33974791 + .word 2806063351 + addi a2, a2, 16 + .word 33974919 + .word 2807111927 + addi a2, a2, 16 + .word 33975047 + .word 2808160503 + addi a2, a2, 16 + .word 33975175 + .word 2809209079 + addi a2, a2, 16 + .word 33975303 + .word 2810290423 + + .word 33939623 + ret +.size L_enc_256,.-L_enc_256 +.p2align 3 +.globl rv64i_zvkned_decrypt +.type rv64i_zvkned_decrypt,@function +rv64i_zvkned_decrypt: + # Load number of rounds + lwu t5, 240(a2) + + # Get proper routine for key size + li t6, 14 + beq t5, t6, L_dec_256 + li t6, 10 + beq t5, t6, L_dec_128 + li t6, 12 + beq t5, t6, L_dec_192 + + j L_fail_m2 +.size rv64i_zvkned_decrypt,.-rv64i_zvkned_decrypt +.p2align 3 +L_dec_128: + .word 3439489111 + + .word 33906823 + + addi a2, a2, 160 + .word 33974791 + .word 2806227191 # with round key w[40,43] + addi a2, a2, -16 + .word 33974663 + .word 2804949239 # with round key w[36,39] + addi a2, a2, -16 + .word 33974535 + .word 2803900663 # with round key w[32,35] + addi a2, a2, -16 + .word 33974407 + .word 2802852087 # with round key w[28,31] + addi a2, a2, -16 + .word 33974279 + .word 2801803511 # with round key w[24,27] + addi a2, a2, -16 + .word 33974151 + .word 2800754935 # with round key w[20,23] + addi a2, a2, -16 + .word 33974023 + .word 2799706359 # with round key w[16,19] + addi a2, a2, -16 + .word 33973895 + .word 2798657783 # with round key w[12,15] + addi a2, a2, -16 + .word 33973767 + .word 2797609207 # with round key w[ 8,11] + addi a2, a2, -16 + .word 33973639 + .word 2796560631 # with round key w[ 4, 7] + addi a2, a2, -16 + .word 33973511 + .word 2795544823 # with round key w[ 0, 3] + + .word 33939623 + + ret +.size L_dec_128,.-L_dec_128 +.p2align 3 +L_dec_192: + .word 3439489111 + + .word 33906823 + + addi a2, a2, 192 + .word 33975047 + .word 2808324343 # with round key w[48,51] + addi a2, a2, -16 + .word 33974919 + .word 2807046391 # with round key w[44,47] + addi a2, a2, -16 + .word 33974791 + .word 2805997815 # with round key w[40,43] + addi a2, a2, -16 + .word 33974663 + .word 2804949239 # with round key w[36,39] + addi a2, a2, -16 + .word 33974535 + .word 2803900663 # with round key w[32,35] + addi a2, a2, -16 + .word 33974407 + .word 2802852087 # with round key w[28,31] + addi a2, a2, -16 + .word 33974279 + .word 2801803511 # with round key w[24,27] + addi a2, a2, -16 + .word 33974151 + .word 2800754935 # with round key w[20,23] + addi a2, a2, -16 + .word 33974023 + .word 2799706359 # with round key w[16,19] + addi a2, a2, -16 + .word 33973895 + .word 2798657783 # with round key w[12,15] + addi a2, a2, -16 + .word 33973767 + .word 2797609207 # with round key w[ 8,11] + addi a2, a2, -16 + .word 33973639 + .word 2796560631 # with round key w[ 4, 7] + addi a2, a2, -16 + .word 33973511 + .word 2795544823 # with round key w[ 0, 3] + + .word 33939623 + + ret +.size L_dec_192,.-L_dec_192 +.p2align 3 +L_dec_256: + .word 3439489111 + + .word 33906823 + + addi a2, a2, 224 + .word 33975303 + .word 2810421495 # with round key w[56,59] + addi a2, a2, -16 + .word 33975175 + .word 2809143543 # with round key w[52,55] + addi a2, a2, -16 + .word 33975047 + .word 2808094967 # with round key w[48,51] + addi a2, a2, -16 + .word 33974919 + .word 2807046391 # with round key w[44,47] + addi a2, a2, -16 + .word 33974791 + .word 2805997815 # with round key w[40,43] + addi a2, a2, -16 + .word 33974663 + .word 2804949239 # with round key w[36,39] + addi a2, a2, -16 + .word 33974535 + .word 2803900663 # with round key w[32,35] + addi a2, a2, -16 + .word 33974407 + .word 2802852087 # with round key w[28,31] + addi a2, a2, -16 + .word 33974279 + .word 2801803511 # with round key w[24,27] + addi a2, a2, -16 + .word 33974151 + .word 2800754935 # with round key w[20,23] + addi a2, a2, -16 + .word 33974023 + .word 2799706359 # with round key w[16,19] + addi a2, a2, -16 + .word 33973895 + .word 2798657783 # with round key w[12,15] + addi a2, a2, -16 + .word 33973767 + .word 2797609207 # with round key w[ 8,11] + addi a2, a2, -16 + .word 33973639 + .word 2796560631 # with round key w[ 4, 7] + addi a2, a2, -16 + .word 33973511 + .word 2795544823 # with round key w[ 0, 3] + + .word 33939623 + + ret +.size L_dec_256,.-L_dec_256 +L_fail_m2: + li a0, -2 + ret +.size L_fail_m2,.-L_fail_m2 + +L_end: + ret +.size L_end,.-L_end diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64.s b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64.s new file mode 100644 index 000000000000..4901849dff58 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64.s @@ -0,0 +1,1871 @@ +.text +.balign 16 +.globl AES_encrypt +.type AES_encrypt,@function +AES_encrypt: + addi sp,sp,-96 + sd x8,88(sp) + sd x9,80(sp) + sd x18,72(sp) + sd x19,64(sp) + sd x20,56(sp) + sd x21,48(sp) + sd x22,40(sp) + sd x23,32(sp) + sd x24,24(sp) + sd x25,16(sp) + sd x26,8(sp) + sd x27,0(sp) + + # Load input to block cipher + ld x6,0(x10) + ld x8,8(x10) + + + # Load key + ld x13,0(x12) + ld x15,8(x12) + + + # Load number of rounds + lwu x30,240(x12) + + # Load address of substitution table and wrap-around mask + la x31,AES_Te0 + li x5,~0xFFF + + # y = n xor k, stored in Q0-Q3 + + xor x6,x6,x13 + xor x8,x8,x15 + srli x7,x6,32 + srli x9,x8,32 + + # The main loop only executes the first N-1 rounds. + add x30,x30,-1 + + # Do Nr - 1 rounds (final round is special) + +1: + + slli x13,x6,0+2 + slli x14,x7,0+2 + slli x15,x8,0+2 + slli x16,x9,0+2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x17,0(x29) + add x29,x31,x14 + lwu x18,0(x29) + add x29,x31,x15 + lwu x19,0(x29) + add x29,x31,x16 + lwu x20,0(x29) + + add x31,x31,1024 + + srli x13,x7,8-2 + srli x14,x8,8-2 + srli x15,x9,8-2 + srli x16,x6,8-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x21,0(x29) + add x29,x31,x14 + lwu x22,0(x29) + add x29,x31,x15 + lwu x23,0(x29) + add x29,x31,x16 + lwu x24,0(x29) + + add x31,x31,1024 + + srli x13,x8,16-2 + srli x14,x9,16-2 + srli x15,x6,16-2 + srli x16,x7,16-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x25,0(x29) + add x29,x31,x14 + lwu x26,0(x29) + add x29,x31,x15 + lwu x27,0(x29) + add x29,x31,x16 + lwu x28,0(x29) + + add x31,x31,1024 + + srli x13,x9,24-2 + srli x14,x6,24-2 + srli x15,x7,24-2 + srli x16,x8,24-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x13,0(x29) + add x29,x31,x14 + lwu x14,0(x29) + add x29,x31,x15 + lwu x15,0(x29) + add x29,x31,x16 + lwu x16,0(x29) + + + # Combine table lookups + xor x17,x17,x21 + xor x18,x18,x22 + xor x19,x19,x23 + xor x20,x20,x24 + + xor x17,x17,x25 + xor x18,x18,x26 + xor x19,x19,x27 + xor x20,x20,x28 + + xor x13,x13,x17 + xor x14,x14,x18 + xor x15,x15,x19 + xor x16,x16,x20 + + # Update key ptr to point to next key in schedule + add x12,x12,16 + + # Grab next key in schedule + ld x17,0(x12) + ld x19,8(x12) + + # Round TBL back to 4k boundary + and x31,x31,x5 + + add x30,x30,-1 + + xor x6,x13,x17 + xor x8,x15,x19 + srli x18,x17,32 + xor x7,x14,x18 + srli x20,x19,32 + xor x9,x16,x20 + + bgtz x30,1b + +#================================FINAL ROUND==================================== + +# In the final round, all lookup table accesses would appear as follows: +# +# ... compute index I0 +# add I0,TBL,T0 +# lbu T0,1(I0) +# +# Instead of indexing with a 1 offset, we can add 1 to the TBL pointer, and use +# a 0 offset when indexing in the following code. This enables some instruction +# fusion opportunities. + + add x31,x31,1 + + ld x30,16(x12) + ld x12,24(x12) + + slli x13,x6,0+2 + slli x14,x7,0+2 + slli x15,x8,0+2 + slli x16,x9,0+2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lbu x17,0(x29) + add x29,x31,x14 + lbu x18,0(x29) + add x29,x31,x15 + lbu x19,0(x29) + add x29,x31,x16 + lbu x20,0(x29) + + + srli x13,x7,8-2 + srli x14,x8,8-2 + srli x15,x9,8-2 + srli x16,x6,8-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lbu x21,0(x29) + add x29,x31,x14 + lbu x22,0(x29) + add x29,x31,x15 + lbu x23,0(x29) + add x29,x31,x16 + lbu x24,0(x29) + + + srli x13,x8,16-2 + srli x14,x9,16-2 + srli x15,x6,16-2 + srli x16,x7,16-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lbu x25,0(x29) + add x29,x31,x14 + lbu x26,0(x29) + add x29,x31,x15 + lbu x27,0(x29) + add x29,x31,x16 + lbu x28,0(x29) + + + srli x13,x9,24-2 + srli x14,x6,24-2 + srli x15,x7,24-2 + srli x16,x8,24-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lbu x13,0(x29) + add x29,x31,x14 + lbu x14,0(x29) + add x29,x31,x15 + lbu x15,0(x29) + add x29,x31,x16 + lbu x16,0(x29) + + + # Combine table lookups into T0 and T2 + + slli x18,x18,32 + slli x20,x20,32 + slli x21,x21,8 + slli x22,x22,8+32 + slli x23,x23,8 + slli x24,x24,8+32 + slli x25,x25,16 + slli x26,x26,16+32 + slli x27,x27,16 + slli x28,x28,16+32 + + slli x13,x13,24 + slli x14,x14,24+32 + slli x15,x15,24 + slli x16,x16,24+32 + + xor x17,x17,x13 + xor x18,x18,x14 + xor x19,x19,x15 + xor x20,x20,x16 + + xor x21,x21,x25 + xor x22,x22,x26 + xor x23,x23,x27 + xor x24,x24,x28 + + xor x13,x17,x21 + xor x14,x18,x22 + xor x15,x19,x23 + xor x16,x20,x24 + + + xor x13,x13,x14 + # T0 = [T1 T13 T9 T5 T0 T12 T8 T4] + xor x13,x13,x30 # XOR in key + + xor x15,x15,x16 + # T2 = [T3 T15 T11 T7 T2 T14 T10 T6] + xor x15,x15,x12 # XOR in key + + sd x13,0(x11) + sd x15,8(x11) + + # Pop registers and return +2: + ld x8,88(sp) + ld x9,80(sp) + ld x18,72(sp) + ld x19,64(sp) + ld x20,56(sp) + ld x21,48(sp) + ld x22,40(sp) + ld x23,32(sp) + ld x24,24(sp) + ld x25,16(sp) + ld x26,8(sp) + ld x27,0(sp) + addi sp,sp,96 + ret +.text +.balign 16 +.globl AES_decrypt +.type AES_decrypt,@function +AES_decrypt: + addi sp,sp,-96 + sd x8,88(sp) + sd x9,80(sp) + sd x18,72(sp) + sd x19,64(sp) + sd x20,56(sp) + sd x21,48(sp) + sd x22,40(sp) + sd x23,32(sp) + sd x24,24(sp) + sd x25,16(sp) + sd x26,8(sp) + sd x27,0(sp) + + # Load input to block cipher + ld x6,0(x10) + ld x8,8(x10) + + # Load key + # Note that key is assumed in BE byte order + # (This routine was written against a key scheduling implementation that + # placed keys in BE byte order.) + ld x13,0(x12) + ld x15,8(x12) + + # Load number of rounds + lwu x30,240(x12) + + # Load address of substitution table and wrap-around mask + la x31,AES_Td0 + li x5,~0xFFF + + xor x6,x6,x13 + xor x8,x8,x15 + srli x7,x6,32 + srli x9,x8,32 + + # The main loop only executes the first N-1 rounds. + add x30,x30,-1 + + # Do Nr - 1 rounds (final round is special) +1: + + slli x13,x6,0+2 + slli x14,x7,0+2 + slli x15,x8,0+2 + slli x16,x9,0+2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x17,0(x29) + add x29,x31,x14 + lwu x18,0(x29) + add x29,x31,x15 + lwu x19,0(x29) + add x29,x31,x16 + lwu x20,0(x29) + + add x31,x31,1024 + + srli x13,x9,8-2 + srli x14,x6,8-2 + srli x15,x7,8-2 + srli x16,x8,8-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x21,0(x29) + add x29,x31,x14 + lwu x22,0(x29) + add x29,x31,x15 + lwu x23,0(x29) + add x29,x31,x16 + lwu x24,0(x29) + + add x31,x31,1024 + + srli x13,x8,16-2 + srli x14,x9,16-2 + srli x15,x6,16-2 + srli x16,x7,16-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x25,0(x29) + add x29,x31,x14 + lwu x26,0(x29) + add x29,x31,x15 + lwu x27,0(x29) + add x29,x31,x16 + lwu x28,0(x29) + + add x31,x31,1024 + + srli x13,x7,24-2 + srli x14,x8,24-2 + srli x15,x9,24-2 + srli x16,x6,24-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x13,0(x29) + add x29,x31,x14 + lwu x14,0(x29) + add x29,x31,x15 + lwu x15,0(x29) + add x29,x31,x16 + lwu x16,0(x29) + + xor x17,x17,x21 + xor x18,x18,x22 + xor x19,x19,x23 + xor x20,x20,x24 + + xor x17,x17,x25 + xor x18,x18,x26 + xor x19,x19,x27 + xor x20,x20,x28 + + xor x13,x13,x17 + xor x14,x14,x18 + xor x15,x15,x19 + xor x16,x16,x20 + + # Update key ptr to point to next key in schedule + add x12,x12,16 + + # Grab next key in schedule + ld x17,0(x12) + ld x19,8(x12) + + # Round TBL back to 4k boundary + and x31,x31,x5 + + add x30,x30,-1 + + xor x6,x13,x17 + xor x8,x15,x19 + srli x18,x17,32 + xor x7,x14,x18 + srli x20,x19,32 + xor x9,x16,x20 + + bgtz x30,1b + +#================================FINAL ROUND==================================== + + la x31,AES_Td4 + + # K0,K1 are aliases for loopcntr,KEYP + # As these registers will no longer be used after these loads, reuse them + # to store the final key in the schedule. + ld x30,16(x12) + ld x12,24(x12) + srli x14,x9,8 + srli x15,x8,16 + srli x16,x7,24 + + andi x13,x6,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + add x29,x31,x13 + lbu x17,0(x29) + add x29,x31,x14 + lbu x18,0(x29) + add x29,x31,x15 + lbu x19,0(x29) + add x29,x31,x16 + lbu x20,0(x29) + + srli x14,x6,8 + srli x15,x9,16 + srli x16,x8,24 + + andi x13,x7,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + add x29,x31,x13 + lbu x21,0(x29) + add x29,x31,x14 + lbu x22,0(x29) + add x29,x31,x15 + lbu x23,0(x29) + add x29,x31,x16 + lbu x24,0(x29) + + srli x14,x7,8 + srli x15,x6,16 + srli x16,x9,24 + + andi x13,x8,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + add x29,x31,x13 + lbu x25,0(x29) + add x29,x31,x14 + lbu x26,0(x29) + add x29,x31,x15 + lbu x27,0(x29) + add x29,x31,x16 + lbu x28,0(x29) + + srli x14,x8,8 + srli x15,x7,16 + srli x16,x6,24 + + andi x13,x9,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + add x29,x31,x13 + lbu x13,0(x29) + add x29,x31,x14 + lbu x14,0(x29) + add x29,x31,x15 + lbu x15,0(x29) + add x29,x31,x16 + lbu x16,0(x29) + + + # T0-T15 now contain the decrypted block, minus xoring with the final round + # key. We pack T0-T15 into the two 64-bit registers T0 and T4, then xor + # in the key and store. + + slli x18,x18,8 + slli x19,x19,16 + slli x20,x20,24 + slli x21,x21,32 + slli x22,x22,8+32 + slli x23,x23,16+32 + slli x24,x24,32+24 + slli x26,x26,8 + slli x27,x27,16 + slli x28,x28,24 + slli x13,x13,32 + slli x14,x14,8+32 + slli x15,x15,16+32 + slli x16,x16,24+32 + + xor x17,x17,x18 + xor x19,x19,x20 + xor x21,x21,x22 + xor x23,x23,x24 + + xor x25,x25,x26 + xor x27,x27,x28 + xor x13,x13,x14 + xor x15,x15,x16 + + xor x17,x17,x19 + xor x21,x21,x23 + xor x25,x25,x27 + xor x13,x13,x15 + + xor x17,x17,x21 + # T4 = [T11 T10 T9 T8 T7 T6 T5 T4] + xor x17,x17,x30 # xor in key + + xor x13,x13,x25 + # T0 = [T3 T2 T1 T0 T15 T14 T13 T12] + xor x13,x13,x12 # xor in key + + sd x17,0(x11) + sd x13,8(x11) + + # Pop registers and return + ld x8,88(sp) + ld x9,80(sp) + ld x18,72(sp) + ld x19,64(sp) + ld x20,56(sp) + ld x21,48(sp) + ld x22,40(sp) + ld x23,32(sp) + ld x24,24(sp) + ld x25,16(sp) + ld x26,8(sp) + ld x27,0(sp) + addi sp,sp,96 + ret +.text +.balign 16 +.globl AES_set_encrypt_key +.type AES_set_encrypt_key,@function +AES_set_encrypt_key: + addi sp,sp,-48 + sd x8,32(sp) + sd x9,24(sp) + sd x18,16(sp) + sd x19,8(sp) + sd x20,0(sp) + beqz x10,1f # if (!userKey || !key) return -1; + beqz x12,1f + j 2f +1: + li a0,-1 + ret +2: + la x9,AES_rcon + la x20,AES_Te0 + li x28,128 + li x29,192 + li x30,256 + + # Determine number of rounds from key size in bits + bne x11,x28,1f + li x13,10 # key->rounds = 10 if bits == 128 + j 3f +1: + bne x11,x29,2f + li x13,12 # key->rounds = 12 if bits == 192 + j 3f +2: + li x13,14 # key->rounds = 14 if bits == 256 + beq x11,x30,3f + li a0,-2 # If bits != 128, 192, or 256, return -2 + j 5f +3: + ld x6,0(x10) + ld x8,8(x10) + + sw x13,240(x12) + + li x19,0 # == i*4 + + srli x7,x6,32 + srli x13,x8,32 + + sd x6,0(x12) + sd x8,8(x12) + + # if bits == 128 + # jump into loop + beq x11,x28,1f + + ld x14,16(x10) + srli x15,x14,32 + sd x14,16(x12) + + # if bits == 192 + # jump into loop + beq x11,x29,2f + + ld x16,24(x10) + srli x17,x16,32 + sd x16,24(x12) + + # bits == 256 + j 3f +1: + addi x12,x12,16 +1: + + # Round TBL back to 4k boundary + srli x20,x20,12 + slli x20,x20,12 + + # Offset by 1 byte, since Te0[x] = S[x].[03, 01, 01, 02] + # So that, later on, a 0-offset lbu yields S[x].01 == S[x] + addi x20,x20,1 + srli x14,x13,8-2 + srli x15,x13,16-2 + srli x16,x13,24-2 + slli x17,x13,2-0 + + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + andi x17,x17,0x3FC + + # Index into tables Te0-Te3 (spread access across tables to help bring + # them into cache for later) + + add x18,x20,x14 + lbu x14,0(x18) + + add x20,x20,1025 # yes, 1025 + add x18,x20,x15 + lbu x15,0(x18) + + add x20,x20,1025 + add x18,x20,x16 + lbu x16,0(x18) + + add x20,x20,1022 + add x18,x20,x17 + lbu x17,0(x18) + + slli x15,x15,8 + slli x16,x16,16 + slli x17,x17,24 + + xor x14,x14,x15 + xor x16,x16,x17 + xor x14,x14,x16 + add x15,x9,x19 # rcon[i] (i increments by 4 so it can double as + # a word offset) + lwu x15,0(x15) + + addi x19,x19,4 + li x18,10*4 + + xor x6,x6,x14 + xor x6,x6,x15 + xor x7,x7,x6 + xor x8,x8,x7 + xor x13,x13,x8 + + sw x6,0(x12) + sw x7,4(x12) + sw x8,8(x12) + sw x13,12(x12) + + addi x12,x12,16 + + + bne x19,x18,1b + j 4f +2: + addi x12,x12,24 +2: + + # Round TBL back to 4k boundary + srli x20,x20,12 + slli x20,x20,12 + + # Offset by 1 byte, since Te0[x] = S[x].[03, 01, 01, 02] + # So that, later on, a 0-offset lbu yields S[x].01 == S[x] + addi x20,x20,1 + srli x16,x15,8-2 + srli x17,x15,16-2 + srli x28,x15,24-2 + slli x29,x15,2-0 + + andi x16,x16,0x3FC + andi x17,x17,0x3FC + andi x28,x28,0x3FC + andi x29,x29,0x3FC + + # Index into tables Te0-Te3 (spread access across tables to help bring + # them into cache for later) + + add x18,x20,x16 + lbu x16,0(x18) + + add x20,x20,1025 # yes, 1025 + add x18,x20,x17 + lbu x17,0(x18) + + add x20,x20,1025 + add x18,x20,x28 + lbu x28,0(x18) + + add x20,x20,1022 + add x18,x20,x29 + lbu x29,0(x18) + + slli x17,x17,8 + slli x28,x28,16 + slli x29,x29,24 + + xor x16,x16,x17 + xor x28,x28,x29 + xor x16,x16,x28 + add x17,x9,x19 # rcon[i] (i increments by 4 so it can double as + # a word offset) + lwu x17,0(x17) + + addi x19,x19,4 + li x18,8*4 + + xor x6,x6,x16 + xor x6,x6,x17 + xor x7,x7,x6 + xor x8,x8,x7 + xor x13,x13,x8 + + sw x6,0(x12) + sw x7,4(x12) + sw x8,8(x12) + sw x13,12(x12) + + beq x19,x18,4f + + xor x14,x14,x13 + xor x15,x15,x14 + sw x14,16(x12) + sw x15,20(x12) + + addi x12,x12,24 + j 2b +3: + addi x12,x12,32 +3: + + # Round TBL back to 4k boundary + srli x20,x20,12 + slli x20,x20,12 + + # Offset by 1 byte, since Te0[x] = S[x].[03, 01, 01, 02] + # So that, later on, a 0-offset lbu yields S[x].01 == S[x] + addi x20,x20,1 + srli x28,x17,8-2 + srli x29,x17,16-2 + srli x30,x17,24-2 + slli x31,x17,2-0 + + andi x28,x28,0x3FC + andi x29,x29,0x3FC + andi x30,x30,0x3FC + andi x31,x31,0x3FC + + # Index into tables Te0-Te3 (spread access across tables to help bring + # them into cache for later) + + add x18,x20,x28 + lbu x28,0(x18) + + add x20,x20,1025 # yes, 1025 + add x18,x20,x29 + lbu x29,0(x18) + + add x20,x20,1025 + add x18,x20,x30 + lbu x30,0(x18) + + add x20,x20,1022 + add x18,x20,x31 + lbu x31,0(x18) + + slli x29,x29,8 + slli x30,x30,16 + slli x31,x31,24 + + xor x28,x28,x29 + xor x30,x30,x31 + xor x28,x28,x30 + add x29,x9,x19 # rcon[i] (i increments by 4 so it can double as + # a word offset) + lwu x29,0(x29) + + addi x19,x19,4 + li x18,7*4 + + xor x6,x6,x28 + xor x6,x6,x29 + xor x7,x7,x6 + xor x8,x8,x7 + xor x13,x13,x8 + + sw x6,0(x12) + sw x7,4(x12) + sw x8,8(x12) + sw x13,12(x12) + + beq x19,x18,4f + + # Round TBL back to 4k boundary + srli x20,x20,12 + slli x20,x20,12 + + # Offset by 1 byte, since Te0[x] = S[x].[03, 01, 01, 02] + # So that, later on, a 0-offset lbu yields S[x].01 == S[x] + addi x20,x20,1 + slli x28,x13,2-0 + srli x29,x13,8-2 + srli x30,x13,16-2 + srli x31,x13,24-2 + + andi x28,x28,0x3FC + andi x29,x29,0x3FC + andi x30,x30,0x3FC + andi x31,x31,0x3FC + + # Index into tables Te0-Te3 (spread access across tables to help bring + # them into cache for later) + + add x18,x20,x28 + lbu x28,0(x18) + + add x20,x20,1025 # yes, 1025 + add x18,x20,x29 + lbu x29,0(x18) + + add x20,x20,1025 + add x18,x20,x30 + lbu x30,0(x18) + + add x20,x20,1022 + add x18,x20,x31 + lbu x31,0(x18) + + slli x29,x29,8 + slli x30,x30,16 + slli x31,x31,24 + + xor x28,x28,x29 + xor x30,x30,x31 + xor x28,x28,x30 + xor x14,x14,x28 + xor x15,x15,x14 + xor x16,x16,x15 + xor x17,x17,x16 + sw x14,16(x12) + sw x15,20(x12) + sw x16,24(x12) + sw x17,28(x12) + + addi x12,x12,32 + j 3b + +4: # return 0 + li a0,0 +5: # return a0 + ld x8,32(sp) + ld x9,24(sp) + ld x18,16(sp) + ld x19,8(sp) + ld x20,0(sp) + addi sp,sp,48 + ret +.text +.balign 16 +.globl AES_set_decrypt_key +.type AES_set_decrypt_key,@function +AES_set_decrypt_key: + # Call AES_set_encrypt_key first + addi sp,sp,-16 + sd x12,0(sp) # We need to hold onto this! + sd ra,8(sp) + jal ra,AES_set_encrypt_key + ld x12,0(sp) + ld ra,8(sp) + addi sp,sp,16 + bgez a0,1f # If error, return error + ret +1: + addi sp,sp,-48 + sd x8,40(sp) + sd x9,32(sp) + sd x18,24(sp) + sd x19,16(sp) + sd x20,8(sp) + sd x21,0(sp) + + li x13,0 + lwu x17,240(x12) + slli x14,x17,4 + # Invert order of round keys +1: + add x19,x12,x13 + ld x6,0(x19) + ld x7,8(x19) + add x18,x12,x14 + ld x8,0(x18) + ld x9,8(x18) + addi x13,x13,16 + addi x14,x14,-16 + sd x6,0(x18) + sd x7,8(x18) + sd x8,0(x19) + sd x9,8(x19) + blt x13,x14,1b + + li x20,1 + +1: + addi x12,x12,16 + lwu x6,0(x12) + lwu x7,4(x12) + lwu x8,8(x12) + lwu x9,12(x12) + + la x21,AES_Te2 + + slli x13,x6,2 + srli x14,x6,8-2 + srli x15,x6,16-2 + srli x16,x6,24-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table Te2 + + add x19,x21,x13 + lwu x13,0(x19) + + add x19,x21,x14 + lwu x14,0(x19) + + add x19,x21,x15 + lwu x15,0(x19) + + add x19,x21,x16 + lwu x16,0(x19) + + andi x13,x13,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + slli x13,x13,2 + slli x14,x14,2 + slli x15,x15,2 + slli x16,x16,2 + + la x21,AES_Td0 + + # Lookup in Td0-Td3 + + add x19,x21,x13 + lwu x13,0(x19) + + add x21,x21,1024 + add x19,x21,x14 + lwu x14,0(x19) + + add x21,x21,1024 + add x19,x21,x15 + lwu x15,0(x19) + + add x21,x21,1024 + add x19,x21,x16 + lwu x16,0(x19) + + xor x13,x13,x14 + xor x15,x15,x16 + xor x6,x13,x15 + + la x21,AES_Te2 + + slli x13,x7,2 + srli x14,x7,8-2 + srli x15,x7,16-2 + srli x16,x7,24-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table Te2 + + add x19,x21,x13 + lwu x13,0(x19) + + add x19,x21,x14 + lwu x14,0(x19) + + add x19,x21,x15 + lwu x15,0(x19) + + add x19,x21,x16 + lwu x16,0(x19) + + andi x13,x13,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + slli x13,x13,2 + slli x14,x14,2 + slli x15,x15,2 + slli x16,x16,2 + + la x21,AES_Td0 + + # Lookup in Td0-Td3 + + add x19,x21,x13 + lwu x13,0(x19) + + add x21,x21,1024 + add x19,x21,x14 + lwu x14,0(x19) + + add x21,x21,1024 + add x19,x21,x15 + lwu x15,0(x19) + + add x21,x21,1024 + add x19,x21,x16 + lwu x16,0(x19) + + xor x13,x13,x14 + xor x15,x15,x16 + xor x7,x13,x15 + + la x21,AES_Te2 + + slli x13,x8,2 + srli x14,x8,8-2 + srli x15,x8,16-2 + srli x16,x8,24-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table Te2 + + add x19,x21,x13 + lwu x13,0(x19) + + add x19,x21,x14 + lwu x14,0(x19) + + add x19,x21,x15 + lwu x15,0(x19) + + add x19,x21,x16 + lwu x16,0(x19) + + andi x13,x13,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + slli x13,x13,2 + slli x14,x14,2 + slli x15,x15,2 + slli x16,x16,2 + + la x21,AES_Td0 + + # Lookup in Td0-Td3 + + add x19,x21,x13 + lwu x13,0(x19) + + add x21,x21,1024 + add x19,x21,x14 + lwu x14,0(x19) + + add x21,x21,1024 + add x19,x21,x15 + lwu x15,0(x19) + + add x21,x21,1024 + add x19,x21,x16 + lwu x16,0(x19) + + xor x13,x13,x14 + xor x15,x15,x16 + xor x8,x13,x15 + + la x21,AES_Te2 + + slli x13,x9,2 + srli x14,x9,8-2 + srli x15,x9,16-2 + srli x16,x9,24-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table Te2 + + add x19,x21,x13 + lwu x13,0(x19) + + add x19,x21,x14 + lwu x14,0(x19) + + add x19,x21,x15 + lwu x15,0(x19) + + add x19,x21,x16 + lwu x16,0(x19) + + andi x13,x13,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + slli x13,x13,2 + slli x14,x14,2 + slli x15,x15,2 + slli x16,x16,2 + + la x21,AES_Td0 + + # Lookup in Td0-Td3 + + add x19,x21,x13 + lwu x13,0(x19) + + add x21,x21,1024 + add x19,x21,x14 + lwu x14,0(x19) + + add x21,x21,1024 + add x19,x21,x15 + lwu x15,0(x19) + + add x21,x21,1024 + add x19,x21,x16 + lwu x16,0(x19) + + xor x13,x13,x14 + xor x15,x15,x16 + xor x9,x13,x15 + sw x6,0(x12) + sw x7,4(x12) + sw x8,8(x12) + sw x9,12(x12) + addi x20,x20,1 + blt x20,x17,1b + ld x8,40(sp) + ld x9,32(sp) + ld x18,24(sp) + ld x19,16(sp) + ld x20,8(sp) + ld x21,0(sp) + addi sp,sp,48 + li a0,0 + ret + +.section .rodata +.p2align 12 +.type AES_Te0,@object +AES_Te0: +.word 0xa56363c6U, 0x847c7cf8U, 0x997777eeU, 0x8d7b7bf6U +.word 0x0df2f2ffU, 0xbd6b6bd6U, 0xb16f6fdeU, 0x54c5c591U +.word 0x50303060U, 0x03010102U, 0xa96767ceU, 0x7d2b2b56U +.word 0x19fefee7U, 0x62d7d7b5U, 0xe6abab4dU, 0x9a7676ecU +.word 0x45caca8fU, 0x9d82821fU, 0x40c9c989U, 0x877d7dfaU +.word 0x15fafaefU, 0xeb5959b2U, 0xc947478eU, 0x0bf0f0fbU +.word 0xecadad41U, 0x67d4d4b3U, 0xfda2a25fU, 0xeaafaf45U +.word 0xbf9c9c23U, 0xf7a4a453U, 0x967272e4U, 0x5bc0c09bU +.word 0xc2b7b775U, 0x1cfdfde1U, 0xae93933dU, 0x6a26264cU +.word 0x5a36366cU, 0x413f3f7eU, 0x02f7f7f5U, 0x4fcccc83U +.word 0x5c343468U, 0xf4a5a551U, 0x34e5e5d1U, 0x08f1f1f9U +.word 0x937171e2U, 0x73d8d8abU, 0x53313162U, 0x3f15152aU +.word 0x0c040408U, 0x52c7c795U, 0x65232346U, 0x5ec3c39dU +.word 0x28181830U, 0xa1969637U, 0x0f05050aU, 0xb59a9a2fU +.word 0x0907070eU, 0x36121224U, 0x9b80801bU, 0x3de2e2dfU +.word 0x26ebebcdU, 0x6927274eU, 0xcdb2b27fU, 0x9f7575eaU +.word 0x1b090912U, 0x9e83831dU, 0x742c2c58U, 0x2e1a1a34U +.word 0x2d1b1b36U, 0xb26e6edcU, 0xee5a5ab4U, 0xfba0a05bU +.word 0xf65252a4U, 0x4d3b3b76U, 0x61d6d6b7U, 0xceb3b37dU +.word 0x7b292952U, 0x3ee3e3ddU, 0x712f2f5eU, 0x97848413U +.word 0xf55353a6U, 0x68d1d1b9U, 0x00000000U, 0x2cededc1U +.word 0x60202040U, 0x1ffcfce3U, 0xc8b1b179U, 0xed5b5bb6U +.word 0xbe6a6ad4U, 0x46cbcb8dU, 0xd9bebe67U, 0x4b393972U +.word 0xde4a4a94U, 0xd44c4c98U, 0xe85858b0U, 0x4acfcf85U +.word 0x6bd0d0bbU, 0x2aefefc5U, 0xe5aaaa4fU, 0x16fbfbedU +.word 0xc5434386U, 0xd74d4d9aU, 0x55333366U, 0x94858511U +.word 0xcf45458aU, 0x10f9f9e9U, 0x06020204U, 0x817f7ffeU +.word 0xf05050a0U, 0x443c3c78U, 0xba9f9f25U, 0xe3a8a84bU +.word 0xf35151a2U, 0xfea3a35dU, 0xc0404080U, 0x8a8f8f05U +.word 0xad92923fU, 0xbc9d9d21U, 0x48383870U, 0x04f5f5f1U +.word 0xdfbcbc63U, 0xc1b6b677U, 0x75dadaafU, 0x63212142U +.word 0x30101020U, 0x1affffe5U, 0x0ef3f3fdU, 0x6dd2d2bfU +.word 0x4ccdcd81U, 0x140c0c18U, 0x35131326U, 0x2fececc3U +.word 0xe15f5fbeU, 0xa2979735U, 0xcc444488U, 0x3917172eU +.word 0x57c4c493U, 0xf2a7a755U, 0x827e7efcU, 0x473d3d7aU +.word 0xac6464c8U, 0xe75d5dbaU, 0x2b191932U, 0x957373e6U +.word 0xa06060c0U, 0x98818119U, 0xd14f4f9eU, 0x7fdcdca3U +.word 0x66222244U, 0x7e2a2a54U, 0xab90903bU, 0x8388880bU +.word 0xca46468cU, 0x29eeeec7U, 0xd3b8b86bU, 0x3c141428U +.word 0x79dedea7U, 0xe25e5ebcU, 0x1d0b0b16U, 0x76dbdbadU +.word 0x3be0e0dbU, 0x56323264U, 0x4e3a3a74U, 0x1e0a0a14U +.word 0xdb494992U, 0x0a06060cU, 0x6c242448U, 0xe45c5cb8U +.word 0x5dc2c29fU, 0x6ed3d3bdU, 0xefacac43U, 0xa66262c4U +.word 0xa8919139U, 0xa4959531U, 0x37e4e4d3U, 0x8b7979f2U +.word 0x32e7e7d5U, 0x43c8c88bU, 0x5937376eU, 0xb76d6ddaU +.word 0x8c8d8d01U, 0x64d5d5b1U, 0xd24e4e9cU, 0xe0a9a949U +.word 0xb46c6cd8U, 0xfa5656acU, 0x07f4f4f3U, 0x25eaeacfU +.word 0xaf6565caU, 0x8e7a7af4U, 0xe9aeae47U, 0x18080810U +.word 0xd5baba6fU, 0x887878f0U, 0x6f25254aU, 0x722e2e5cU +.word 0x241c1c38U, 0xf1a6a657U, 0xc7b4b473U, 0x51c6c697U +.word 0x23e8e8cbU, 0x7cdddda1U, 0x9c7474e8U, 0x211f1f3eU +.word 0xdd4b4b96U, 0xdcbdbd61U, 0x868b8b0dU, 0x858a8a0fU +.word 0x907070e0U, 0x423e3e7cU, 0xc4b5b571U, 0xaa6666ccU +.word 0xd8484890U, 0x05030306U, 0x01f6f6f7U, 0x120e0e1cU +.word 0xa36161c2U, 0x5f35356aU, 0xf95757aeU, 0xd0b9b969U +.word 0x91868617U, 0x58c1c199U, 0x271d1d3aU, 0xb99e9e27U +.word 0x38e1e1d9U, 0x13f8f8ebU, 0xb398982bU, 0x33111122U +.word 0xbb6969d2U, 0x70d9d9a9U, 0x898e8e07U, 0xa7949433U +.word 0xb69b9b2dU, 0x221e1e3cU, 0x92878715U, 0x20e9e9c9U +.word 0x49cece87U, 0xff5555aaU, 0x78282850U, 0x7adfdfa5U +.word 0x8f8c8c03U, 0xf8a1a159U, 0x80898909U, 0x170d0d1aU +.word 0xdabfbf65U, 0x31e6e6d7U, 0xc6424284U, 0xb86868d0U +.word 0xc3414182U, 0xb0999929U, 0x772d2d5aU, 0x110f0f1eU +.word 0xcbb0b07bU, 0xfc5454a8U, 0xd6bbbb6dU, 0x3a16162cU + +.type AES_Te1,@object +AES_Te1: +.word 0x6363c6a5U, 0x7c7cf884U, 0x7777ee99U, 0x7b7bf68dU +.word 0xf2f2ff0dU, 0x6b6bd6bdU, 0x6f6fdeb1U, 0xc5c59154U +.word 0x30306050U, 0x01010203U, 0x6767cea9U, 0x2b2b567dU +.word 0xfefee719U, 0xd7d7b562U, 0xabab4de6U, 0x7676ec9aU +.word 0xcaca8f45U, 0x82821f9dU, 0xc9c98940U, 0x7d7dfa87U +.word 0xfafaef15U, 0x5959b2ebU, 0x47478ec9U, 0xf0f0fb0bU +.word 0xadad41ecU, 0xd4d4b367U, 0xa2a25ffdU, 0xafaf45eaU +.word 0x9c9c23bfU, 0xa4a453f7U, 0x7272e496U, 0xc0c09b5bU +.word 0xb7b775c2U, 0xfdfde11cU, 0x93933daeU, 0x26264c6aU +.word 0x36366c5aU, 0x3f3f7e41U, 0xf7f7f502U, 0xcccc834fU +.word 0x3434685cU, 0xa5a551f4U, 0xe5e5d134U, 0xf1f1f908U +.word 0x7171e293U, 0xd8d8ab73U, 0x31316253U, 0x15152a3fU +.word 0x0404080cU, 0xc7c79552U, 0x23234665U, 0xc3c39d5eU +.word 0x18183028U, 0x969637a1U, 0x05050a0fU, 0x9a9a2fb5U +.word 0x07070e09U, 0x12122436U, 0x80801b9bU, 0xe2e2df3dU +.word 0xebebcd26U, 0x27274e69U, 0xb2b27fcdU, 0x7575ea9fU +.word 0x0909121bU, 0x83831d9eU, 0x2c2c5874U, 0x1a1a342eU +.word 0x1b1b362dU, 0x6e6edcb2U, 0x5a5ab4eeU, 0xa0a05bfbU +.word 0x5252a4f6U, 0x3b3b764dU, 0xd6d6b761U, 0xb3b37dceU +.word 0x2929527bU, 0xe3e3dd3eU, 0x2f2f5e71U, 0x84841397U +.word 0x5353a6f5U, 0xd1d1b968U, 0x00000000U, 0xededc12cU +.word 0x20204060U, 0xfcfce31fU, 0xb1b179c8U, 0x5b5bb6edU +.word 0x6a6ad4beU, 0xcbcb8d46U, 0xbebe67d9U, 0x3939724bU +.word 0x4a4a94deU, 0x4c4c98d4U, 0x5858b0e8U, 0xcfcf854aU +.word 0xd0d0bb6bU, 0xefefc52aU, 0xaaaa4fe5U, 0xfbfbed16U +.word 0x434386c5U, 0x4d4d9ad7U, 0x33336655U, 0x85851194U +.word 0x45458acfU, 0xf9f9e910U, 0x02020406U, 0x7f7ffe81U +.word 0x5050a0f0U, 0x3c3c7844U, 0x9f9f25baU, 0xa8a84be3U +.word 0x5151a2f3U, 0xa3a35dfeU, 0x404080c0U, 0x8f8f058aU +.word 0x92923fadU, 0x9d9d21bcU, 0x38387048U, 0xf5f5f104U +.word 0xbcbc63dfU, 0xb6b677c1U, 0xdadaaf75U, 0x21214263U +.word 0x10102030U, 0xffffe51aU, 0xf3f3fd0eU, 0xd2d2bf6dU +.word 0xcdcd814cU, 0x0c0c1814U, 0x13132635U, 0xececc32fU +.word 0x5f5fbee1U, 0x979735a2U, 0x444488ccU, 0x17172e39U +.word 0xc4c49357U, 0xa7a755f2U, 0x7e7efc82U, 0x3d3d7a47U +.word 0x6464c8acU, 0x5d5dbae7U, 0x1919322bU, 0x7373e695U +.word 0x6060c0a0U, 0x81811998U, 0x4f4f9ed1U, 0xdcdca37fU +.word 0x22224466U, 0x2a2a547eU, 0x90903babU, 0x88880b83U +.word 0x46468ccaU, 0xeeeec729U, 0xb8b86bd3U, 0x1414283cU +.word 0xdedea779U, 0x5e5ebce2U, 0x0b0b161dU, 0xdbdbad76U +.word 0xe0e0db3bU, 0x32326456U, 0x3a3a744eU, 0x0a0a141eU +.word 0x494992dbU, 0x06060c0aU, 0x2424486cU, 0x5c5cb8e4U +.word 0xc2c29f5dU, 0xd3d3bd6eU, 0xacac43efU, 0x6262c4a6U +.word 0x919139a8U, 0x959531a4U, 0xe4e4d337U, 0x7979f28bU +.word 0xe7e7d532U, 0xc8c88b43U, 0x37376e59U, 0x6d6ddab7U +.word 0x8d8d018cU, 0xd5d5b164U, 0x4e4e9cd2U, 0xa9a949e0U +.word 0x6c6cd8b4U, 0x5656acfaU, 0xf4f4f307U, 0xeaeacf25U +.word 0x6565caafU, 0x7a7af48eU, 0xaeae47e9U, 0x08081018U +.word 0xbaba6fd5U, 0x7878f088U, 0x25254a6fU, 0x2e2e5c72U +.word 0x1c1c3824U, 0xa6a657f1U, 0xb4b473c7U, 0xc6c69751U +.word 0xe8e8cb23U, 0xdddda17cU, 0x7474e89cU, 0x1f1f3e21U +.word 0x4b4b96ddU, 0xbdbd61dcU, 0x8b8b0d86U, 0x8a8a0f85U +.word 0x7070e090U, 0x3e3e7c42U, 0xb5b571c4U, 0x6666ccaaU +.word 0x484890d8U, 0x03030605U, 0xf6f6f701U, 0x0e0e1c12U +.word 0x6161c2a3U, 0x35356a5fU, 0x5757aef9U, 0xb9b969d0U +.word 0x86861791U, 0xc1c19958U, 0x1d1d3a27U, 0x9e9e27b9U +.word 0xe1e1d938U, 0xf8f8eb13U, 0x98982bb3U, 0x11112233U +.word 0x6969d2bbU, 0xd9d9a970U, 0x8e8e0789U, 0x949433a7U +.word 0x9b9b2db6U, 0x1e1e3c22U, 0x87871592U, 0xe9e9c920U +.word 0xcece8749U, 0x5555aaffU, 0x28285078U, 0xdfdfa57aU +.word 0x8c8c038fU, 0xa1a159f8U, 0x89890980U, 0x0d0d1a17U +.word 0xbfbf65daU, 0xe6e6d731U, 0x424284c6U, 0x6868d0b8U +.word 0x414182c3U, 0x999929b0U, 0x2d2d5a77U, 0x0f0f1e11U +.word 0xb0b07bcbU, 0x5454a8fcU, 0xbbbb6dd6U, 0x16162c3aU + +.type AES_Te2,@object +AES_Te2: +.word 0x63c6a563U, 0x7cf8847cU, 0x77ee9977U, 0x7bf68d7bU +.word 0xf2ff0df2U, 0x6bd6bd6bU, 0x6fdeb16fU, 0xc59154c5U +.word 0x30605030U, 0x01020301U, 0x67cea967U, 0x2b567d2bU +.word 0xfee719feU, 0xd7b562d7U, 0xab4de6abU, 0x76ec9a76U +.word 0xca8f45caU, 0x821f9d82U, 0xc98940c9U, 0x7dfa877dU +.word 0xfaef15faU, 0x59b2eb59U, 0x478ec947U, 0xf0fb0bf0U +.word 0xad41ecadU, 0xd4b367d4U, 0xa25ffda2U, 0xaf45eaafU +.word 0x9c23bf9cU, 0xa453f7a4U, 0x72e49672U, 0xc09b5bc0U +.word 0xb775c2b7U, 0xfde11cfdU, 0x933dae93U, 0x264c6a26U +.word 0x366c5a36U, 0x3f7e413fU, 0xf7f502f7U, 0xcc834fccU +.word 0x34685c34U, 0xa551f4a5U, 0xe5d134e5U, 0xf1f908f1U +.word 0x71e29371U, 0xd8ab73d8U, 0x31625331U, 0x152a3f15U +.word 0x04080c04U, 0xc79552c7U, 0x23466523U, 0xc39d5ec3U +.word 0x18302818U, 0x9637a196U, 0x050a0f05U, 0x9a2fb59aU +.word 0x070e0907U, 0x12243612U, 0x801b9b80U, 0xe2df3de2U +.word 0xebcd26ebU, 0x274e6927U, 0xb27fcdb2U, 0x75ea9f75U +.word 0x09121b09U, 0x831d9e83U, 0x2c58742cU, 0x1a342e1aU +.word 0x1b362d1bU, 0x6edcb26eU, 0x5ab4ee5aU, 0xa05bfba0U +.word 0x52a4f652U, 0x3b764d3bU, 0xd6b761d6U, 0xb37dceb3U +.word 0x29527b29U, 0xe3dd3ee3U, 0x2f5e712fU, 0x84139784U +.word 0x53a6f553U, 0xd1b968d1U, 0x00000000U, 0xedc12cedU +.word 0x20406020U, 0xfce31ffcU, 0xb179c8b1U, 0x5bb6ed5bU +.word 0x6ad4be6aU, 0xcb8d46cbU, 0xbe67d9beU, 0x39724b39U +.word 0x4a94de4aU, 0x4c98d44cU, 0x58b0e858U, 0xcf854acfU +.word 0xd0bb6bd0U, 0xefc52aefU, 0xaa4fe5aaU, 0xfbed16fbU +.word 0x4386c543U, 0x4d9ad74dU, 0x33665533U, 0x85119485U +.word 0x458acf45U, 0xf9e910f9U, 0x02040602U, 0x7ffe817fU +.word 0x50a0f050U, 0x3c78443cU, 0x9f25ba9fU, 0xa84be3a8U +.word 0x51a2f351U, 0xa35dfea3U, 0x4080c040U, 0x8f058a8fU +.word 0x923fad92U, 0x9d21bc9dU, 0x38704838U, 0xf5f104f5U +.word 0xbc63dfbcU, 0xb677c1b6U, 0xdaaf75daU, 0x21426321U +.word 0x10203010U, 0xffe51affU, 0xf3fd0ef3U, 0xd2bf6dd2U +.word 0xcd814ccdU, 0x0c18140cU, 0x13263513U, 0xecc32fecU +.word 0x5fbee15fU, 0x9735a297U, 0x4488cc44U, 0x172e3917U +.word 0xc49357c4U, 0xa755f2a7U, 0x7efc827eU, 0x3d7a473dU +.word 0x64c8ac64U, 0x5dbae75dU, 0x19322b19U, 0x73e69573U +.word 0x60c0a060U, 0x81199881U, 0x4f9ed14fU, 0xdca37fdcU +.word 0x22446622U, 0x2a547e2aU, 0x903bab90U, 0x880b8388U +.word 0x468cca46U, 0xeec729eeU, 0xb86bd3b8U, 0x14283c14U +.word 0xdea779deU, 0x5ebce25eU, 0x0b161d0bU, 0xdbad76dbU +.word 0xe0db3be0U, 0x32645632U, 0x3a744e3aU, 0x0a141e0aU +.word 0x4992db49U, 0x060c0a06U, 0x24486c24U, 0x5cb8e45cU +.word 0xc29f5dc2U, 0xd3bd6ed3U, 0xac43efacU, 0x62c4a662U +.word 0x9139a891U, 0x9531a495U, 0xe4d337e4U, 0x79f28b79U +.word 0xe7d532e7U, 0xc88b43c8U, 0x376e5937U, 0x6ddab76dU +.word 0x8d018c8dU, 0xd5b164d5U, 0x4e9cd24eU, 0xa949e0a9U +.word 0x6cd8b46cU, 0x56acfa56U, 0xf4f307f4U, 0xeacf25eaU +.word 0x65caaf65U, 0x7af48e7aU, 0xae47e9aeU, 0x08101808U +.word 0xba6fd5baU, 0x78f08878U, 0x254a6f25U, 0x2e5c722eU +.word 0x1c38241cU, 0xa657f1a6U, 0xb473c7b4U, 0xc69751c6U +.word 0xe8cb23e8U, 0xdda17cddU, 0x74e89c74U, 0x1f3e211fU +.word 0x4b96dd4bU, 0xbd61dcbdU, 0x8b0d868bU, 0x8a0f858aU +.word 0x70e09070U, 0x3e7c423eU, 0xb571c4b5U, 0x66ccaa66U +.word 0x4890d848U, 0x03060503U, 0xf6f701f6U, 0x0e1c120eU +.word 0x61c2a361U, 0x356a5f35U, 0x57aef957U, 0xb969d0b9U +.word 0x86179186U, 0xc19958c1U, 0x1d3a271dU, 0x9e27b99eU +.word 0xe1d938e1U, 0xf8eb13f8U, 0x982bb398U, 0x11223311U +.word 0x69d2bb69U, 0xd9a970d9U, 0x8e07898eU, 0x9433a794U +.word 0x9b2db69bU, 0x1e3c221eU, 0x87159287U, 0xe9c920e9U +.word 0xce8749ceU, 0x55aaff55U, 0x28507828U, 0xdfa57adfU +.word 0x8c038f8cU, 0xa159f8a1U, 0x89098089U, 0x0d1a170dU +.word 0xbf65dabfU, 0xe6d731e6U, 0x4284c642U, 0x68d0b868U +.word 0x4182c341U, 0x9929b099U, 0x2d5a772dU, 0x0f1e110fU +.word 0xb07bcbb0U, 0x54a8fc54U, 0xbb6dd6bbU, 0x162c3a16U + +.type AES_Te3,@object +AES_Te3: +.word 0xc6a56363U, 0xf8847c7cU, 0xee997777U, 0xf68d7b7bU +.word 0xff0df2f2U, 0xd6bd6b6bU, 0xdeb16f6fU, 0x9154c5c5U +.word 0x60503030U, 0x02030101U, 0xcea96767U, 0x567d2b2bU +.word 0xe719fefeU, 0xb562d7d7U, 0x4de6ababU, 0xec9a7676U +.word 0x8f45cacaU, 0x1f9d8282U, 0x8940c9c9U, 0xfa877d7dU +.word 0xef15fafaU, 0xb2eb5959U, 0x8ec94747U, 0xfb0bf0f0U +.word 0x41ecadadU, 0xb367d4d4U, 0x5ffda2a2U, 0x45eaafafU +.word 0x23bf9c9cU, 0x53f7a4a4U, 0xe4967272U, 0x9b5bc0c0U +.word 0x75c2b7b7U, 0xe11cfdfdU, 0x3dae9393U, 0x4c6a2626U +.word 0x6c5a3636U, 0x7e413f3fU, 0xf502f7f7U, 0x834fccccU +.word 0x685c3434U, 0x51f4a5a5U, 0xd134e5e5U, 0xf908f1f1U +.word 0xe2937171U, 0xab73d8d8U, 0x62533131U, 0x2a3f1515U +.word 0x080c0404U, 0x9552c7c7U, 0x46652323U, 0x9d5ec3c3U +.word 0x30281818U, 0x37a19696U, 0x0a0f0505U, 0x2fb59a9aU +.word 0x0e090707U, 0x24361212U, 0x1b9b8080U, 0xdf3de2e2U +.word 0xcd26ebebU, 0x4e692727U, 0x7fcdb2b2U, 0xea9f7575U +.word 0x121b0909U, 0x1d9e8383U, 0x58742c2cU, 0x342e1a1aU +.word 0x362d1b1bU, 0xdcb26e6eU, 0xb4ee5a5aU, 0x5bfba0a0U +.word 0xa4f65252U, 0x764d3b3bU, 0xb761d6d6U, 0x7dceb3b3U +.word 0x527b2929U, 0xdd3ee3e3U, 0x5e712f2fU, 0x13978484U +.word 0xa6f55353U, 0xb968d1d1U, 0x00000000U, 0xc12cededU +.word 0x40602020U, 0xe31ffcfcU, 0x79c8b1b1U, 0xb6ed5b5bU +.word 0xd4be6a6aU, 0x8d46cbcbU, 0x67d9bebeU, 0x724b3939U +.word 0x94de4a4aU, 0x98d44c4cU, 0xb0e85858U, 0x854acfcfU +.word 0xbb6bd0d0U, 0xc52aefefU, 0x4fe5aaaaU, 0xed16fbfbU +.word 0x86c54343U, 0x9ad74d4dU, 0x66553333U, 0x11948585U +.word 0x8acf4545U, 0xe910f9f9U, 0x04060202U, 0xfe817f7fU +.word 0xa0f05050U, 0x78443c3cU, 0x25ba9f9fU, 0x4be3a8a8U +.word 0xa2f35151U, 0x5dfea3a3U, 0x80c04040U, 0x058a8f8fU +.word 0x3fad9292U, 0x21bc9d9dU, 0x70483838U, 0xf104f5f5U +.word 0x63dfbcbcU, 0x77c1b6b6U, 0xaf75dadaU, 0x42632121U +.word 0x20301010U, 0xe51affffU, 0xfd0ef3f3U, 0xbf6dd2d2U +.word 0x814ccdcdU, 0x18140c0cU, 0x26351313U, 0xc32fececU +.word 0xbee15f5fU, 0x35a29797U, 0x88cc4444U, 0x2e391717U +.word 0x9357c4c4U, 0x55f2a7a7U, 0xfc827e7eU, 0x7a473d3dU +.word 0xc8ac6464U, 0xbae75d5dU, 0x322b1919U, 0xe6957373U +.word 0xc0a06060U, 0x19988181U, 0x9ed14f4fU, 0xa37fdcdcU +.word 0x44662222U, 0x547e2a2aU, 0x3bab9090U, 0x0b838888U +.word 0x8cca4646U, 0xc729eeeeU, 0x6bd3b8b8U, 0x283c1414U +.word 0xa779dedeU, 0xbce25e5eU, 0x161d0b0bU, 0xad76dbdbU +.word 0xdb3be0e0U, 0x64563232U, 0x744e3a3aU, 0x141e0a0aU +.word 0x92db4949U, 0x0c0a0606U, 0x486c2424U, 0xb8e45c5cU +.word 0x9f5dc2c2U, 0xbd6ed3d3U, 0x43efacacU, 0xc4a66262U +.word 0x39a89191U, 0x31a49595U, 0xd337e4e4U, 0xf28b7979U +.word 0xd532e7e7U, 0x8b43c8c8U, 0x6e593737U, 0xdab76d6dU +.word 0x018c8d8dU, 0xb164d5d5U, 0x9cd24e4eU, 0x49e0a9a9U +.word 0xd8b46c6cU, 0xacfa5656U, 0xf307f4f4U, 0xcf25eaeaU +.word 0xcaaf6565U, 0xf48e7a7aU, 0x47e9aeaeU, 0x10180808U +.word 0x6fd5babaU, 0xf0887878U, 0x4a6f2525U, 0x5c722e2eU +.word 0x38241c1cU, 0x57f1a6a6U, 0x73c7b4b4U, 0x9751c6c6U +.word 0xcb23e8e8U, 0xa17cddddU, 0xe89c7474U, 0x3e211f1fU +.word 0x96dd4b4bU, 0x61dcbdbdU, 0x0d868b8bU, 0x0f858a8aU +.word 0xe0907070U, 0x7c423e3eU, 0x71c4b5b5U, 0xccaa6666U +.word 0x90d84848U, 0x06050303U, 0xf701f6f6U, 0x1c120e0eU +.word 0xc2a36161U, 0x6a5f3535U, 0xaef95757U, 0x69d0b9b9U +.word 0x17918686U, 0x9958c1c1U, 0x3a271d1dU, 0x27b99e9eU +.word 0xd938e1e1U, 0xeb13f8f8U, 0x2bb39898U, 0x22331111U +.word 0xd2bb6969U, 0xa970d9d9U, 0x07898e8eU, 0x33a79494U +.word 0x2db69b9bU, 0x3c221e1eU, 0x15928787U, 0xc920e9e9U +.word 0x8749ceceU, 0xaaff5555U, 0x50782828U, 0xa57adfdfU +.word 0x038f8c8cU, 0x59f8a1a1U, 0x09808989U, 0x1a170d0dU +.word 0x65dabfbfU, 0xd731e6e6U, 0x84c64242U, 0xd0b86868U +.word 0x82c34141U, 0x29b09999U, 0x5a772d2dU, 0x1e110f0fU +.word 0x7bcbb0b0U, 0xa8fc5454U, 0x6dd6bbbbU, 0x2c3a1616U + +.p2align 12 +.type AES_Td0,@object +AES_Td0: +.word 0x50a7f451U, 0x5365417eU, 0xc3a4171aU, 0x965e273aU +.word 0xcb6bab3bU, 0xf1459d1fU, 0xab58faacU, 0x9303e34bU +.word 0x55fa3020U, 0xf66d76adU, 0x9176cc88U, 0x254c02f5U +.word 0xfcd7e54fU, 0xd7cb2ac5U, 0x80443526U, 0x8fa362b5U +.word 0x495ab1deU, 0x671bba25U, 0x980eea45U, 0xe1c0fe5dU +.word 0x02752fc3U, 0x12f04c81U, 0xa397468dU, 0xc6f9d36bU +.word 0xe75f8f03U, 0x959c9215U, 0xeb7a6dbfU, 0xda595295U +.word 0x2d83bed4U, 0xd3217458U, 0x2969e049U, 0x44c8c98eU +.word 0x6a89c275U, 0x78798ef4U, 0x6b3e5899U, 0xdd71b927U +.word 0xb64fe1beU, 0x17ad88f0U, 0x66ac20c9U, 0xb43ace7dU +.word 0x184adf63U, 0x82311ae5U, 0x60335197U, 0x457f5362U +.word 0xe07764b1U, 0x84ae6bbbU, 0x1ca081feU, 0x942b08f9U +.word 0x58684870U, 0x19fd458fU, 0x876cde94U, 0xb7f87b52U +.word 0x23d373abU, 0xe2024b72U, 0x578f1fe3U, 0x2aab5566U +.word 0x0728ebb2U, 0x03c2b52fU, 0x9a7bc586U, 0xa50837d3U +.word 0xf2872830U, 0xb2a5bf23U, 0xba6a0302U, 0x5c8216edU +.word 0x2b1ccf8aU, 0x92b479a7U, 0xf0f207f3U, 0xa1e2694eU +.word 0xcdf4da65U, 0xd5be0506U, 0x1f6234d1U, 0x8afea6c4U +.word 0x9d532e34U, 0xa055f3a2U, 0x32e18a05U, 0x75ebf6a4U +.word 0x39ec830bU, 0xaaef6040U, 0x069f715eU, 0x51106ebdU +.word 0xf98a213eU, 0x3d06dd96U, 0xae053eddU, 0x46bde64dU +.word 0xb58d5491U, 0x055dc471U, 0x6fd40604U, 0xff155060U +.word 0x24fb9819U, 0x97e9bdd6U, 0xcc434089U, 0x779ed967U +.word 0xbd42e8b0U, 0x888b8907U, 0x385b19e7U, 0xdbeec879U +.word 0x470a7ca1U, 0xe90f427cU, 0xc91e84f8U, 0x00000000U +.word 0x83868009U, 0x48ed2b32U, 0xac70111eU, 0x4e725a6cU +.word 0xfbff0efdU, 0x5638850fU, 0x1ed5ae3dU, 0x27392d36U +.word 0x64d90f0aU, 0x21a65c68U, 0xd1545b9bU, 0x3a2e3624U +.word 0xb1670a0cU, 0x0fe75793U, 0xd296eeb4U, 0x9e919b1bU +.word 0x4fc5c080U, 0xa220dc61U, 0x694b775aU, 0x161a121cU +.word 0x0aba93e2U, 0xe52aa0c0U, 0x43e0223cU, 0x1d171b12U +.word 0x0b0d090eU, 0xadc78bf2U, 0xb9a8b62dU, 0xc8a91e14U +.word 0x8519f157U, 0x4c0775afU, 0xbbdd99eeU, 0xfd607fa3U +.word 0x9f2601f7U, 0xbcf5725cU, 0xc53b6644U, 0x347efb5bU +.word 0x7629438bU, 0xdcc623cbU, 0x68fcedb6U, 0x63f1e4b8U +.word 0xcadc31d7U, 0x10856342U, 0x40229713U, 0x2011c684U +.word 0x7d244a85U, 0xf83dbbd2U, 0x1132f9aeU, 0x6da129c7U +.word 0x4b2f9e1dU, 0xf330b2dcU, 0xec52860dU, 0xd0e3c177U +.word 0x6c16b32bU, 0x99b970a9U, 0xfa489411U, 0x2264e947U +.word 0xc48cfca8U, 0x1a3ff0a0U, 0xd82c7d56U, 0xef903322U +.word 0xc74e4987U, 0xc1d138d9U, 0xfea2ca8cU, 0x360bd498U +.word 0xcf81f5a6U, 0x28de7aa5U, 0x268eb7daU, 0xa4bfad3fU +.word 0xe49d3a2cU, 0x0d927850U, 0x9bcc5f6aU, 0x62467e54U +.word 0xc2138df6U, 0xe8b8d890U, 0x5ef7392eU, 0xf5afc382U +.word 0xbe805d9fU, 0x7c93d069U, 0xa92dd56fU, 0xb31225cfU +.word 0x3b99acc8U, 0xa77d1810U, 0x6e639ce8U, 0x7bbb3bdbU +.word 0x097826cdU, 0xf418596eU, 0x01b79aecU, 0xa89a4f83U +.word 0x656e95e6U, 0x7ee6ffaaU, 0x08cfbc21U, 0xe6e815efU +.word 0xd99be7baU, 0xce366f4aU, 0xd4099feaU, 0xd67cb029U +.word 0xafb2a431U, 0x31233f2aU, 0x3094a5c6U, 0xc066a235U +.word 0x37bc4e74U, 0xa6ca82fcU, 0xb0d090e0U, 0x15d8a733U +.word 0x4a9804f1U, 0xf7daec41U, 0x0e50cd7fU, 0x2ff69117U +.word 0x8dd64d76U, 0x4db0ef43U, 0x544daaccU, 0xdf0496e4U +.word 0xe3b5d19eU, 0x1b886a4cU, 0xb81f2cc1U, 0x7f516546U +.word 0x04ea5e9dU, 0x5d358c01U, 0x737487faU, 0x2e410bfbU +.word 0x5a1d67b3U, 0x52d2db92U, 0x335610e9U, 0x1347d66dU +.word 0x8c61d79aU, 0x7a0ca137U, 0x8e14f859U, 0x893c13ebU +.word 0xee27a9ceU, 0x35c961b7U, 0xede51ce1U, 0x3cb1477aU +.word 0x59dfd29cU, 0x3f73f255U, 0x79ce1418U, 0xbf37c773U +.word 0xeacdf753U, 0x5baafd5fU, 0x146f3ddfU, 0x86db4478U +.word 0x81f3afcaU, 0x3ec468b9U, 0x2c342438U, 0x5f40a3c2U +.word 0x72c31d16U, 0x0c25e2bcU, 0x8b493c28U, 0x41950dffU +.word 0x7101a839U, 0xdeb30c08U, 0x9ce4b4d8U, 0x90c15664U +.word 0x6184cb7bU, 0x70b632d5U, 0x745c6c48U, 0x4257b8d0U + +.type AES_Td1,@object +AES_Td1: +.word 0xa7f45150U, 0x65417e53U, 0xa4171ac3U, 0x5e273a96U +.word 0x6bab3bcbU, 0x459d1ff1U, 0x58faacabU, 0x03e34b93U +.word 0xfa302055U, 0x6d76adf6U, 0x76cc8891U, 0x4c02f525U +.word 0xd7e54ffcU, 0xcb2ac5d7U, 0x44352680U, 0xa362b58fU +.word 0x5ab1de49U, 0x1bba2567U, 0x0eea4598U, 0xc0fe5de1U +.word 0x752fc302U, 0xf04c8112U, 0x97468da3U, 0xf9d36bc6U +.word 0x5f8f03e7U, 0x9c921595U, 0x7a6dbfebU, 0x595295daU +.word 0x83bed42dU, 0x217458d3U, 0x69e04929U, 0xc8c98e44U +.word 0x89c2756aU, 0x798ef478U, 0x3e58996bU, 0x71b927ddU +.word 0x4fe1beb6U, 0xad88f017U, 0xac20c966U, 0x3ace7db4U +.word 0x4adf6318U, 0x311ae582U, 0x33519760U, 0x7f536245U +.word 0x7764b1e0U, 0xae6bbb84U, 0xa081fe1cU, 0x2b08f994U +.word 0x68487058U, 0xfd458f19U, 0x6cde9487U, 0xf87b52b7U +.word 0xd373ab23U, 0x024b72e2U, 0x8f1fe357U, 0xab55662aU +.word 0x28ebb207U, 0xc2b52f03U, 0x7bc5869aU, 0x0837d3a5U +.word 0x872830f2U, 0xa5bf23b2U, 0x6a0302baU, 0x8216ed5cU +.word 0x1ccf8a2bU, 0xb479a792U, 0xf207f3f0U, 0xe2694ea1U +.word 0xf4da65cdU, 0xbe0506d5U, 0x6234d11fU, 0xfea6c48aU +.word 0x532e349dU, 0x55f3a2a0U, 0xe18a0532U, 0xebf6a475U +.word 0xec830b39U, 0xef6040aaU, 0x9f715e06U, 0x106ebd51U +.word 0x8a213ef9U, 0x06dd963dU, 0x053eddaeU, 0xbde64d46U +.word 0x8d5491b5U, 0x5dc47105U, 0xd406046fU, 0x155060ffU +.word 0xfb981924U, 0xe9bdd697U, 0x434089ccU, 0x9ed96777U +.word 0x42e8b0bdU, 0x8b890788U, 0x5b19e738U, 0xeec879dbU +.word 0x0a7ca147U, 0x0f427ce9U, 0x1e84f8c9U, 0x00000000U +.word 0x86800983U, 0xed2b3248U, 0x70111eacU, 0x725a6c4eU +.word 0xff0efdfbU, 0x38850f56U, 0xd5ae3d1eU, 0x392d3627U +.word 0xd90f0a64U, 0xa65c6821U, 0x545b9bd1U, 0x2e36243aU +.word 0x670a0cb1U, 0xe757930fU, 0x96eeb4d2U, 0x919b1b9eU +.word 0xc5c0804fU, 0x20dc61a2U, 0x4b775a69U, 0x1a121c16U +.word 0xba93e20aU, 0x2aa0c0e5U, 0xe0223c43U, 0x171b121dU +.word 0x0d090e0bU, 0xc78bf2adU, 0xa8b62db9U, 0xa91e14c8U +.word 0x19f15785U, 0x0775af4cU, 0xdd99eebbU, 0x607fa3fdU +.word 0x2601f79fU, 0xf5725cbcU, 0x3b6644c5U, 0x7efb5b34U +.word 0x29438b76U, 0xc623cbdcU, 0xfcedb668U, 0xf1e4b863U +.word 0xdc31d7caU, 0x85634210U, 0x22971340U, 0x11c68420U +.word 0x244a857dU, 0x3dbbd2f8U, 0x32f9ae11U, 0xa129c76dU +.word 0x2f9e1d4bU, 0x30b2dcf3U, 0x52860decU, 0xe3c177d0U +.word 0x16b32b6cU, 0xb970a999U, 0x489411faU, 0x64e94722U +.word 0x8cfca8c4U, 0x3ff0a01aU, 0x2c7d56d8U, 0x903322efU +.word 0x4e4987c7U, 0xd138d9c1U, 0xa2ca8cfeU, 0x0bd49836U +.word 0x81f5a6cfU, 0xde7aa528U, 0x8eb7da26U, 0xbfad3fa4U +.word 0x9d3a2ce4U, 0x9278500dU, 0xcc5f6a9bU, 0x467e5462U +.word 0x138df6c2U, 0xb8d890e8U, 0xf7392e5eU, 0xafc382f5U +.word 0x805d9fbeU, 0x93d0697cU, 0x2dd56fa9U, 0x1225cfb3U +.word 0x99acc83bU, 0x7d1810a7U, 0x639ce86eU, 0xbb3bdb7bU +.word 0x7826cd09U, 0x18596ef4U, 0xb79aec01U, 0x9a4f83a8U +.word 0x6e95e665U, 0xe6ffaa7eU, 0xcfbc2108U, 0xe815efe6U +.word 0x9be7bad9U, 0x366f4aceU, 0x099fead4U, 0x7cb029d6U +.word 0xb2a431afU, 0x233f2a31U, 0x94a5c630U, 0x66a235c0U +.word 0xbc4e7437U, 0xca82fca6U, 0xd090e0b0U, 0xd8a73315U +.word 0x9804f14aU, 0xdaec41f7U, 0x50cd7f0eU, 0xf691172fU +.word 0xd64d768dU, 0xb0ef434dU, 0x4daacc54U, 0x0496e4dfU +.word 0xb5d19ee3U, 0x886a4c1bU, 0x1f2cc1b8U, 0x5165467fU +.word 0xea5e9d04U, 0x358c015dU, 0x7487fa73U, 0x410bfb2eU +.word 0x1d67b35aU, 0xd2db9252U, 0x5610e933U, 0x47d66d13U +.word 0x61d79a8cU, 0x0ca1377aU, 0x14f8598eU, 0x3c13eb89U +.word 0x27a9ceeeU, 0xc961b735U, 0xe51ce1edU, 0xb1477a3cU +.word 0xdfd29c59U, 0x73f2553fU, 0xce141879U, 0x37c773bfU +.word 0xcdf753eaU, 0xaafd5f5bU, 0x6f3ddf14U, 0xdb447886U +.word 0xf3afca81U, 0xc468b93eU, 0x3424382cU, 0x40a3c25fU +.word 0xc31d1672U, 0x25e2bc0cU, 0x493c288bU, 0x950dff41U +.word 0x01a83971U, 0xb30c08deU, 0xe4b4d89cU, 0xc1566490U +.word 0x84cb7b61U, 0xb632d570U, 0x5c6c4874U, 0x57b8d042U + +.type AES_Td2,@object +AES_Td2: +.word 0xf45150a7U, 0x417e5365U, 0x171ac3a4U, 0x273a965eU +.word 0xab3bcb6bU, 0x9d1ff145U, 0xfaacab58U, 0xe34b9303U +.word 0x302055faU, 0x76adf66dU, 0xcc889176U, 0x02f5254cU +.word 0xe54ffcd7U, 0x2ac5d7cbU, 0x35268044U, 0x62b58fa3U +.word 0xb1de495aU, 0xba25671bU, 0xea45980eU, 0xfe5de1c0U +.word 0x2fc30275U, 0x4c8112f0U, 0x468da397U, 0xd36bc6f9U +.word 0x8f03e75fU, 0x9215959cU, 0x6dbfeb7aU, 0x5295da59U +.word 0xbed42d83U, 0x7458d321U, 0xe0492969U, 0xc98e44c8U +.word 0xc2756a89U, 0x8ef47879U, 0x58996b3eU, 0xb927dd71U +.word 0xe1beb64fU, 0x88f017adU, 0x20c966acU, 0xce7db43aU +.word 0xdf63184aU, 0x1ae58231U, 0x51976033U, 0x5362457fU +.word 0x64b1e077U, 0x6bbb84aeU, 0x81fe1ca0U, 0x08f9942bU +.word 0x48705868U, 0x458f19fdU, 0xde94876cU, 0x7b52b7f8U +.word 0x73ab23d3U, 0x4b72e202U, 0x1fe3578fU, 0x55662aabU +.word 0xebb20728U, 0xb52f03c2U, 0xc5869a7bU, 0x37d3a508U +.word 0x2830f287U, 0xbf23b2a5U, 0x0302ba6aU, 0x16ed5c82U +.word 0xcf8a2b1cU, 0x79a792b4U, 0x07f3f0f2U, 0x694ea1e2U +.word 0xda65cdf4U, 0x0506d5beU, 0x34d11f62U, 0xa6c48afeU +.word 0x2e349d53U, 0xf3a2a055U, 0x8a0532e1U, 0xf6a475ebU +.word 0x830b39ecU, 0x6040aaefU, 0x715e069fU, 0x6ebd5110U +.word 0x213ef98aU, 0xdd963d06U, 0x3eddae05U, 0xe64d46bdU +.word 0x5491b58dU, 0xc471055dU, 0x06046fd4U, 0x5060ff15U +.word 0x981924fbU, 0xbdd697e9U, 0x4089cc43U, 0xd967779eU +.word 0xe8b0bd42U, 0x8907888bU, 0x19e7385bU, 0xc879dbeeU +.word 0x7ca1470aU, 0x427ce90fU, 0x84f8c91eU, 0x00000000U +.word 0x80098386U, 0x2b3248edU, 0x111eac70U, 0x5a6c4e72U +.word 0x0efdfbffU, 0x850f5638U, 0xae3d1ed5U, 0x2d362739U +.word 0x0f0a64d9U, 0x5c6821a6U, 0x5b9bd154U, 0x36243a2eU +.word 0x0a0cb167U, 0x57930fe7U, 0xeeb4d296U, 0x9b1b9e91U +.word 0xc0804fc5U, 0xdc61a220U, 0x775a694bU, 0x121c161aU +.word 0x93e20abaU, 0xa0c0e52aU, 0x223c43e0U, 0x1b121d17U +.word 0x090e0b0dU, 0x8bf2adc7U, 0xb62db9a8U, 0x1e14c8a9U +.word 0xf1578519U, 0x75af4c07U, 0x99eebbddU, 0x7fa3fd60U +.word 0x01f79f26U, 0x725cbcf5U, 0x6644c53bU, 0xfb5b347eU +.word 0x438b7629U, 0x23cbdcc6U, 0xedb668fcU, 0xe4b863f1U +.word 0x31d7cadcU, 0x63421085U, 0x97134022U, 0xc6842011U +.word 0x4a857d24U, 0xbbd2f83dU, 0xf9ae1132U, 0x29c76da1U +.word 0x9e1d4b2fU, 0xb2dcf330U, 0x860dec52U, 0xc177d0e3U +.word 0xb32b6c16U, 0x70a999b9U, 0x9411fa48U, 0xe9472264U +.word 0xfca8c48cU, 0xf0a01a3fU, 0x7d56d82cU, 0x3322ef90U +.word 0x4987c74eU, 0x38d9c1d1U, 0xca8cfea2U, 0xd498360bU +.word 0xf5a6cf81U, 0x7aa528deU, 0xb7da268eU, 0xad3fa4bfU +.word 0x3a2ce49dU, 0x78500d92U, 0x5f6a9bccU, 0x7e546246U +.word 0x8df6c213U, 0xd890e8b8U, 0x392e5ef7U, 0xc382f5afU +.word 0x5d9fbe80U, 0xd0697c93U, 0xd56fa92dU, 0x25cfb312U +.word 0xacc83b99U, 0x1810a77dU, 0x9ce86e63U, 0x3bdb7bbbU +.word 0x26cd0978U, 0x596ef418U, 0x9aec01b7U, 0x4f83a89aU +.word 0x95e6656eU, 0xffaa7ee6U, 0xbc2108cfU, 0x15efe6e8U +.word 0xe7bad99bU, 0x6f4ace36U, 0x9fead409U, 0xb029d67cU +.word 0xa431afb2U, 0x3f2a3123U, 0xa5c63094U, 0xa235c066U +.word 0x4e7437bcU, 0x82fca6caU, 0x90e0b0d0U, 0xa73315d8U +.word 0x04f14a98U, 0xec41f7daU, 0xcd7f0e50U, 0x91172ff6U +.word 0x4d768dd6U, 0xef434db0U, 0xaacc544dU, 0x96e4df04U +.word 0xd19ee3b5U, 0x6a4c1b88U, 0x2cc1b81fU, 0x65467f51U +.word 0x5e9d04eaU, 0x8c015d35U, 0x87fa7374U, 0x0bfb2e41U +.word 0x67b35a1dU, 0xdb9252d2U, 0x10e93356U, 0xd66d1347U +.word 0xd79a8c61U, 0xa1377a0cU, 0xf8598e14U, 0x13eb893cU +.word 0xa9ceee27U, 0x61b735c9U, 0x1ce1ede5U, 0x477a3cb1U +.word 0xd29c59dfU, 0xf2553f73U, 0x141879ceU, 0xc773bf37U +.word 0xf753eacdU, 0xfd5f5baaU, 0x3ddf146fU, 0x447886dbU +.word 0xafca81f3U, 0x68b93ec4U, 0x24382c34U, 0xa3c25f40U +.word 0x1d1672c3U, 0xe2bc0c25U, 0x3c288b49U, 0x0dff4195U +.word 0xa8397101U, 0x0c08deb3U, 0xb4d89ce4U, 0x566490c1U +.word 0xcb7b6184U, 0x32d570b6U, 0x6c48745cU, 0xb8d04257U + +.type AES_Td3,@object +AES_Td3: +.word 0x5150a7f4U, 0x7e536541U, 0x1ac3a417U, 0x3a965e27U +.word 0x3bcb6babU, 0x1ff1459dU, 0xacab58faU, 0x4b9303e3U +.word 0x2055fa30U, 0xadf66d76U, 0x889176ccU, 0xf5254c02U +.word 0x4ffcd7e5U, 0xc5d7cb2aU, 0x26804435U, 0xb58fa362U +.word 0xde495ab1U, 0x25671bbaU, 0x45980eeaU, 0x5de1c0feU +.word 0xc302752fU, 0x8112f04cU, 0x8da39746U, 0x6bc6f9d3U +.word 0x03e75f8fU, 0x15959c92U, 0xbfeb7a6dU, 0x95da5952U +.word 0xd42d83beU, 0x58d32174U, 0x492969e0U, 0x8e44c8c9U +.word 0x756a89c2U, 0xf478798eU, 0x996b3e58U, 0x27dd71b9U +.word 0xbeb64fe1U, 0xf017ad88U, 0xc966ac20U, 0x7db43aceU +.word 0x63184adfU, 0xe582311aU, 0x97603351U, 0x62457f53U +.word 0xb1e07764U, 0xbb84ae6bU, 0xfe1ca081U, 0xf9942b08U +.word 0x70586848U, 0x8f19fd45U, 0x94876cdeU, 0x52b7f87bU +.word 0xab23d373U, 0x72e2024bU, 0xe3578f1fU, 0x662aab55U +.word 0xb20728ebU, 0x2f03c2b5U, 0x869a7bc5U, 0xd3a50837U +.word 0x30f28728U, 0x23b2a5bfU, 0x02ba6a03U, 0xed5c8216U +.word 0x8a2b1ccfU, 0xa792b479U, 0xf3f0f207U, 0x4ea1e269U +.word 0x65cdf4daU, 0x06d5be05U, 0xd11f6234U, 0xc48afea6U +.word 0x349d532eU, 0xa2a055f3U, 0x0532e18aU, 0xa475ebf6U +.word 0x0b39ec83U, 0x40aaef60U, 0x5e069f71U, 0xbd51106eU +.word 0x3ef98a21U, 0x963d06ddU, 0xddae053eU, 0x4d46bde6U +.word 0x91b58d54U, 0x71055dc4U, 0x046fd406U, 0x60ff1550U +.word 0x1924fb98U, 0xd697e9bdU, 0x89cc4340U, 0x67779ed9U +.word 0xb0bd42e8U, 0x07888b89U, 0xe7385b19U, 0x79dbeec8U +.word 0xa1470a7cU, 0x7ce90f42U, 0xf8c91e84U, 0x00000000U +.word 0x09838680U, 0x3248ed2bU, 0x1eac7011U, 0x6c4e725aU +.word 0xfdfbff0eU, 0x0f563885U, 0x3d1ed5aeU, 0x3627392dU +.word 0x0a64d90fU, 0x6821a65cU, 0x9bd1545bU, 0x243a2e36U +.word 0x0cb1670aU, 0x930fe757U, 0xb4d296eeU, 0x1b9e919bU +.word 0x804fc5c0U, 0x61a220dcU, 0x5a694b77U, 0x1c161a12U +.word 0xe20aba93U, 0xc0e52aa0U, 0x3c43e022U, 0x121d171bU +.word 0x0e0b0d09U, 0xf2adc78bU, 0x2db9a8b6U, 0x14c8a91eU +.word 0x578519f1U, 0xaf4c0775U, 0xeebbdd99U, 0xa3fd607fU +.word 0xf79f2601U, 0x5cbcf572U, 0x44c53b66U, 0x5b347efbU +.word 0x8b762943U, 0xcbdcc623U, 0xb668fcedU, 0xb863f1e4U +.word 0xd7cadc31U, 0x42108563U, 0x13402297U, 0x842011c6U +.word 0x857d244aU, 0xd2f83dbbU, 0xae1132f9U, 0xc76da129U +.word 0x1d4b2f9eU, 0xdcf330b2U, 0x0dec5286U, 0x77d0e3c1U +.word 0x2b6c16b3U, 0xa999b970U, 0x11fa4894U, 0x472264e9U +.word 0xa8c48cfcU, 0xa01a3ff0U, 0x56d82c7dU, 0x22ef9033U +.word 0x87c74e49U, 0xd9c1d138U, 0x8cfea2caU, 0x98360bd4U +.word 0xa6cf81f5U, 0xa528de7aU, 0xda268eb7U, 0x3fa4bfadU +.word 0x2ce49d3aU, 0x500d9278U, 0x6a9bcc5fU, 0x5462467eU +.word 0xf6c2138dU, 0x90e8b8d8U, 0x2e5ef739U, 0x82f5afc3U +.word 0x9fbe805dU, 0x697c93d0U, 0x6fa92dd5U, 0xcfb31225U +.word 0xc83b99acU, 0x10a77d18U, 0xe86e639cU, 0xdb7bbb3bU +.word 0xcd097826U, 0x6ef41859U, 0xec01b79aU, 0x83a89a4fU +.word 0xe6656e95U, 0xaa7ee6ffU, 0x2108cfbcU, 0xefe6e815U +.word 0xbad99be7U, 0x4ace366fU, 0xead4099fU, 0x29d67cb0U +.word 0x31afb2a4U, 0x2a31233fU, 0xc63094a5U, 0x35c066a2U +.word 0x7437bc4eU, 0xfca6ca82U, 0xe0b0d090U, 0x3315d8a7U +.word 0xf14a9804U, 0x41f7daecU, 0x7f0e50cdU, 0x172ff691U +.word 0x768dd64dU, 0x434db0efU, 0xcc544daaU, 0xe4df0496U +.word 0x9ee3b5d1U, 0x4c1b886aU, 0xc1b81f2cU, 0x467f5165U +.word 0x9d04ea5eU, 0x015d358cU, 0xfa737487U, 0xfb2e410bU +.word 0xb35a1d67U, 0x9252d2dbU, 0xe9335610U, 0x6d1347d6U +.word 0x9a8c61d7U, 0x377a0ca1U, 0x598e14f8U, 0xeb893c13U +.word 0xceee27a9U, 0xb735c961U, 0xe1ede51cU, 0x7a3cb147U +.word 0x9c59dfd2U, 0x553f73f2U, 0x1879ce14U, 0x73bf37c7U +.word 0x53eacdf7U, 0x5f5baafdU, 0xdf146f3dU, 0x7886db44U +.word 0xca81f3afU, 0xb93ec468U, 0x382c3424U, 0xc25f40a3U +.word 0x1672c31dU, 0xbc0c25e2U, 0x288b493cU, 0xff41950dU +.word 0x397101a8U, 0x08deb30cU, 0xd89ce4b4U, 0x6490c156U +.word 0x7b6184cbU, 0xd570b632U, 0x48745c6cU, 0xd04257b8U + +.type AES_Td4,@object +AES_Td4: +.byte 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U +.byte 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU +.byte 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U +.byte 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU +.byte 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU +.byte 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU +.byte 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U +.byte 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U +.byte 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U +.byte 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U +.byte 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU +.byte 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U +.byte 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU +.byte 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U +.byte 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U +.byte 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU +.byte 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU +.byte 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U +.byte 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U +.byte 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU +.byte 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U +.byte 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU +.byte 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U +.byte 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U +.byte 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U +.byte 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU +.byte 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU +.byte 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU +.byte 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U +.byte 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U +.byte 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U +.byte 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU + +.type AES_rcon,@object +AES_rcon: +.word 0x00000001U, 0x00000002U, 0x00000004U, 0x00000008U +.word 0x00000010U, 0x00000020U, 0x00000040U, 0x00000080U +.word 0x0000001BU, 0x00000036U diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/buildinf.h b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/buildinf.h new file mode 100644 index 000000000000..132867b95c47 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/buildinf.h @@ -0,0 +1,35 @@ +/* + * WARNING: do not edit! + * Generated by util/mkbuildinf.pl + * + * Copyright 2014-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#define PLATFORM "platform: linux64-riscv64" +#define DATE "built on: Tue Jun 30 04:15:54 2026 UTC" + +/* + * Generate compiler_flags as an array of individual characters. This is a + * workaround for the situation where CFLAGS gets too long for a C90 string + * literal + */ +static const char compiler_flags[] = { + 'c','o','m','p','i','l','e','r',':',' ','g','c','c',' ','-','f', + 'P','I','C',' ','-','p','t','h','r','e','a','d',' ','-','W','a', + ',','-','-','n','o','e','x','e','c','s','t','a','c','k',' ','-', + 'W','a','l','l',' ','-','O','3',' ','-','D','O','P','E','N','S', + 'S','L','_','U','S','E','_','N','O','D','E','L','E','T','E',' ', + '-','D','O','P','E','N','S','S','L','_','P','I','C',' ','-','D', + 'O','P','E','N','S','S','L','_','B','U','I','L','D','I','N','G', + '_','O','P','E','N','S','S','L',' ','-','D','B','R','O','T','L', + 'I',' ','-','D','Z','L','I','B',' ','-','D','Z','S','T','D',' ', + '-','D','N','D','E','B','U','G',' ','-','I','.','.','/','.','.', + '/','b','r','o','t','l','i','/','c','/','i','n','c','l','u','d', + 'e',' ','-','I','.','.','/','.','.','/','z','l','i','b',' ','-', + 'I','.','.','/','.','.','/','z','s','t','d','/','l','i','b','\0' +}; diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/chacha/chacha-riscv64-v-zbb-zvkb.s b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/chacha/chacha-riscv64-v-zbb-zvkb.s new file mode 100644 index 000000000000..6fa723a7934c --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/chacha/chacha-riscv64-v-zbb-zvkb.s @@ -0,0 +1,461 @@ +.text +.p2align 3 +.globl ChaCha20_ctr32_v_zbb_zvkb +.type ChaCha20_ctr32_v_zbb_zvkb,@function +ChaCha20_ctr32_v_zbb_zvkb: + addi sp, sp, -96 + sd s0, 0(sp) + sd s1, 8(sp) + sd s2, 16(sp) + sd s3, 24(sp) + sd s4, 32(sp) + sd s5, 40(sp) + sd s6, 48(sp) + sd s7, 56(sp) + sd s8, 64(sp) + sd s9, 72(sp) + sd s10, 80(sp) + sd s11, 88(sp) + addi sp, sp, -64 + + lw t2, 0(a4) + +.Lblock_loop: + # We will use the scalar ALU for 1 chacha block. + srli t3, a2, 6 + .word 219050839 + slli t4, t1, 6 + bltu t4, a2, 1f + # Since there is no more chacha block existed, we need to split 1 block + # from vector ALU. + addi t4, t1, -1 + .word 219083607 +1: + + #### chacha block data + # init chacha const states into v0~v3 + # "expa" little endian + li a5, 0x61707865 + .word 1577566295 + # "nd 3" little endian + li a6, 0x3320646e + .word 1577599191 + # "2-by" little endian + li a7, 0x79622d32 + .word 1577632087 + # "te k" little endian + li s0, 0x6b206574 + lw s1, 0(a3) + .word 1577337303 + + # init chacha key states into v4~v11 + lw s2, 4(a3) + .word 1577370199 + lw s3, 8(a3) + .word 1577665239 + lw s4, 12(a3) + .word 1577698135 + lw s5, 16(a3) + .word 1577731031 + lw s6, 20(a3) + .word 1577763927 + lw s7, 24(a3) + .word 1577796823 + lw s8, 28(a3) + .word 1577829719 + .word 1577862615 + + # init chacha key states into v12~v13 + lw s10, 4(a4) + .word 1376298583 + lw s11, 8(a4) + .word 46384727 + lw t0, 12(a4) + .word 1577928407 + add s9, t2, t1 + + # init chacha nonce states into v14~v15 + .word 1577961303 + .word 1577240535 + + li t3, 64 + # load the top-half of input data into v16~v23 + .word 3955615751 + + # till now in block_loop, we used: + # - v0~v15 for chacha states. + # - v16~v23 for top-half of input data. + # - v24~v31 haven't been used yet. + + # 20 round groups + li t3, 10 +.Lround_loop: + # we can use v24~v31 as temporary registers in round_loop. + addi t3, t3, -1 + # a += b; d ^= a; d <<<= 16; + .word 33685591 + add a5, a5, s1 + .word 34767063 + add a6, a6, s2 + .word 35848535 + add a7, a7, s3 + .word 36930007 + add s0, s0, s4 + .word 784336471 + xor s9, s9, a5 + .word 785417943 + xor s10, s10, a6 + .word 786499415 + xor s11, s11, a7 + .word 787580887 + xor t0, t0, s0 + .word 1388852823 + .word 1628232859 + .word 1389901527 + .word 1628265755 + .word 1390950231 + .word 1628298651 + .word 1391998935 + .word 1627574939 + + # c += d; b ^= c; b <<<= 12; + .word 42337367 + add s5, s5, s9 + .word 43418839 + add s6, s6, s10 + .word 44500311 + add s7, s7, s11 + .word 45581783 + add s8, s8, t0 + .word 776208983 + xor s1, s1, s5 + .word 777290455 + xor s2, s2, s6 + .word 778371927 + xor s3, s3, s7 + .word 779453399 + xor s4, s4, s8 + .word 1380594263 + .word 1631900827 + .word 1381642967 + .word 1632196891 + .word 1382691671 + .word 1632229787 + .word 1383740375 + .word 1632262683 + + # a += b; d ^= a; d <<<= 8; + .word 33685591 + add a5, a5, s1 + .word 34767063 + add a6, a6, s2 + .word 35848535 + add a7, a7, s3 + .word 36930007 + add s0, s0, s4 + .word 784336471 + xor s9, s9, a5 + .word 785417943 + xor s10, s10, a6 + .word 786499415 + xor s11, s11, a7 + .word 787580887 + xor t0, t0, s0 + .word 1389114967 + .word 1636621467 + .word 1390163671 + .word 1636654363 + .word 1391212375 + .word 1636687259 + .word 1392261079 + .word 1635963547 + + # c += d; b ^= c; b <<<= 7; + .word 42337367 + add s5, s5, s9 + .word 43418839 + add s6, s6, s10 + .word 44500311 + add s7, s7, s11 + .word 45581783 + add s8, s8, t0 + .word 776208983 + xor s1, s1, s5 + .word 777290455 + xor s2, s2, s6 + .word 778371927 + xor s3, s3, s7 + .word 779453399 + xor s4, s4, s8 + .word 1380758103 + .word 1637143707 + .word 1381806807 + .word 1637439771 + .word 1382855511 + .word 1637472667 + .word 1383904215 + .word 1637505563 + + + # a += b; d ^= a; d <<<= 16; + .word 36831703 + add s0, s0, s1 + .word 33718359 + add a5, a5, s2 + .word 34799831 + add a6, a6, s3 + .word 35881303 + add a7, a7, s4 + .word 786532183 + xor s11, s11, s0 + .word 787482583 + xor t0, t0, a5 + .word 784369239 + xor s9, s9, a6 + .word 785450711 + xor s10, s10, a7 + .word 1390950231 + .word 1628298651 + .word 1391998935 + .word 1627574939 + .word 1388852823 + .word 1628232859 + .word 1389901527 + .word 1628265755 + + # c += d; b ^= c; b <<<= 12; + .word 43451607 + add s6, s6, s11 + .word 44533079 + add s7, s7, t0 + .word 45483479 + add s8, s8, s9 + .word 42370135 + add s5, s5, s10 + .word 776241751 + xor s1, s1, s6 + .word 777323223 + xor s2, s2, s7 + .word 778404695 + xor s3, s3, s8 + .word 779355095 + xor s4, s4, s5 + .word 1380594263 + .word 1631900827 + .word 1381642967 + .word 1632196891 + .word 1382691671 + .word 1632229787 + .word 1383740375 + .word 1632262683 + + # a += b; d ^= a; d <<<= 8; + .word 36831703 + add s0, s0, s1 + .word 33718359 + add a5, a5, s2 + .word 34799831 + add a6, a6, s3 + .word 35881303 + add a7, a7, s4 + .word 786532183 + xor s11, s11, s0 + .word 787482583 + xor t0, t0, a5 + .word 784369239 + xor s9, s9, a6 + .word 785450711 + xor s10, s10, a7 + .word 1391212375 + .word 1636687259 + .word 1392261079 + .word 1635963547 + .word 1389114967 + .word 1636621467 + .word 1390163671 + .word 1636654363 + + # c += d; b ^= c; b <<<= 7; + .word 43451607 + add s6, s6, s11 + .word 44533079 + add s7, s7, t0 + .word 45483479 + add s8, s8, s9 + .word 42370135 + add s5, s5, s10 + .word 776241751 + xor s1, s1, s6 + .word 777323223 + xor s2, s2, s7 + .word 778404695 + xor s3, s3, s8 + .word 779355095 + xor s4, s4, s5 + .word 1380758103 + .word 1637143707 + .word 1381806807 + .word 1637439771 + .word 1382855511 + .word 1637472667 + .word 1383904215 + .word 1637505563 + + + bnez t3, .Lround_loop + + li t3, 64 + # load the bottom-half of input data into v24~v31 + addi t4, a1, 32 + .word 3956206599 + + # now, there are no free vector registers until the round_loop exits. + + # add chacha top-half initial block states + # "expa" little endian + li t3, 0x61707865 + .word 34488407 + add a5, a5, t3 + # "nd 3" little endian + li t4, 0x3320646e + .word 35569879 + add a6, a6, t4 + lw t3, 0(a3) + # "2-by" little endian + li t5, 0x79622d32 + .word 36651351 + add a7, a7, t5 + lw t4, 4(a3) + # "te k" little endian + li t6, 0x6b206574 + .word 37732823 + add s0, s0, t6 + lw t5, 8(a3) + .word 38683223 + add s1, s1, t3 + lw t6, 12(a3) + .word 39764695 + add s2, s2, t4 + .word 40846167 + add s3, s3, t5 + .word 41927639 + add s4, s4, t6 + + # xor with the top-half input + .word 788531287 + sw a5, 0(sp) + sw a6, 4(sp) + .word 789612759 + sw a7, 8(sp) + sw s0, 12(sp) + .word 790694231 + sw s1, 16(sp) + sw s2, 20(sp) + .word 791775703 + sw s3, 24(sp) + sw s4, 28(sp) + .word 792857175 + lw t3, 16(a3) + .word 793938647 + lw t4, 20(a3) + .word 795020119 + lw t5, 24(a3) + .word 796101591 + + # save the top-half of output from v16~v23 + li t6, 64 + .word 3958728743 + + # add chacha bottom-half initial block states + .word 42878039 + add s5, s5, t3 + lw t6, 28(a3) + .word 43959511 + add s6, s6, t4 + lw t3, 4(a4) + .word 45040983 + add s7, s7, t5 + lw t4, 8(a4) + .word 46122455 + add s8, s8, t6 + lw t5, 12(a4) + .word 1376297047 + add s9, s9, t2 + .word 46384727 + add s9, s9, t1 + .word 48121559 + add s10, s10, t3 + .word 49203031 + add s11, s11, t4 + .word 50284503 + add t0, t0, t5 + .word 46138967 + # xor with the bottom-half input + .word 797183063 + sw s5, 32(sp) + .word 798264535 + sw s6, 36(sp) + .word 799346007 + sw s7, 40(sp) + .word 800427479 + sw s8, 44(sp) + .word 802590423 + sw s9, 48(sp) + .word 801508951 + sw s10, 52(sp) + .word 803671895 + sw s11, 56(sp) + .word 804753367 + sw t0, 60(sp) + + # save the bottom-half of output from v24~v31 + li t3, 64 + addi t4, a0, 32 + .word 3956206631 + + # the computed vector parts: `64 * VL` + slli t3, t1, 6 + + add a1, a1, t3 + add a0, a0, t3 + sub a2, a2, t3 + add t2, t2, t1 + + # process the scalar data block + addi t2, t2, 1 + li t3, 64 + .word 197549747 + sub a2, a2, t4 + mv t5, sp +.Lscalar_data_loop: + .word 205452119 + # from this on, vector registers are grouped with lmul = 8 + .word 33915911 + .word 34539527 + .word 780665943 + .word 33883175 + add a1, a1, t1 + add a0, a0, t1 + add t5, t5, t1 + sub t4, t4, t1 + bnez t4, .Lscalar_data_loop + + bnez a2, .Lblock_loop + + addi sp, sp, 64 + ld s0, 0(sp) + ld s1, 8(sp) + ld s2, 16(sp) + ld s3, 24(sp) + ld s4, 32(sp) + ld s5, 40(sp) + ld s6, 48(sp) + ld s7, 56(sp) + ld s8, 64(sp) + ld s9, 72(sp) + ld s10, 80(sp) + ld s11, 88(sp) + addi sp, sp, 96 + + ret +.size ChaCha20_ctr32_v_zbb_zvkb,.-ChaCha20_ctr32_v_zbb_zvkb diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/chacha/chacha-riscv64-v-zbb.s b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/chacha/chacha-riscv64-v-zbb.s new file mode 100644 index 000000000000..e543c8e9ce10 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/chacha/chacha-riscv64-v-zbb.s @@ -0,0 +1,525 @@ +.text +.p2align 3 +.globl ChaCha20_ctr32_v_zbb +.type ChaCha20_ctr32_v_zbb,@function +ChaCha20_ctr32_v_zbb: + addi sp, sp, -96 + sd s0, 0(sp) + sd s1, 8(sp) + sd s2, 16(sp) + sd s3, 24(sp) + sd s4, 32(sp) + sd s5, 40(sp) + sd s6, 48(sp) + sd s7, 56(sp) + sd s8, 64(sp) + sd s9, 72(sp) + sd s10, 80(sp) + sd s11, 88(sp) + addi sp, sp, -64 + + lw t2, 0(a4) + +.Lblock_loop: + # We will use the scalar ALU for 1 chacha block. + srli t3, a2, 6 + .word 219050839 + slli t4, t1, 6 + bltu t4, a2, 1f + # Since there is no more chacha block existed, we need to split 1 block + # from vector ALU. + addi t4, t1, -1 + .word 219083607 +1: + + #### chacha block data + # init chacha const states into v0~v3 + # "expa" little endian + li a5, 0x61707865 + .word 1577566295 + # "nd 3" little endian + li a6, 0x3320646e + .word 1577599191 + # "2-by" little endian + li a7, 0x79622d32 + .word 1577632087 + # "te k" little endian + li s0, 0x6b206574 + lw s1, 0(a3) + .word 1577337303 + + # init chacha key states into v4~v11 + lw s2, 4(a3) + .word 1577370199 + lw s3, 8(a3) + .word 1577665239 + lw s4, 12(a3) + .word 1577698135 + lw s5, 16(a3) + .word 1577731031 + lw s6, 20(a3) + .word 1577763927 + lw s7, 24(a3) + .word 1577796823 + lw s8, 28(a3) + .word 1577829719 + .word 1577862615 + + # init chacha key states into v12~v13 + lw s10, 4(a4) + .word 1376298583 + lw s11, 8(a4) + .word 46384727 + lw t0, 12(a4) + .word 1577928407 + add s9, t2, t1 + + # init chacha nonce states into v14~v15 + .word 1577961303 + .word 1577240535 + + li t3, 64 + # load the top-half of input data into v16~v23 + .word 3955615751 + + # till now in block_loop, we used: + # - v0~v15 for chacha states. + # - v16~v23 for top-half of input data. + # - v24~v31 haven't been used yet. + + # 20 round groups + li t3, 10 +.Lround_loop: + # we can use v24~v31 as temporary registers in round_loop. + addi t3, t3, -1 + # a += b; d ^= a; d <<<= 16; + .word 33685591 + add a5, a5, s1 + .word 34767063 + add a6, a6, s2 + .word 35848535 + add a7, a7, s3 + .word 36930007 + add s0, s0, s4 + .word 784336471 + xor s9, s9, a5 + .word 785417943 + xor s10, s10, a6 + .word 786499415 + xor s11, s11, a7 + .word 787580887 + xor t0, t0, s0 + .word 2529705047 + .word 2530753751 + .word 2531802455 + .word 2532851159 + .word 2731030103 + .word 2732078807 + .word 2733127511 + .word 2734176215 + .word 718014039 + .word 1628232859 + .word 719095511 + .word 1628265755 + .word 720176983 + .word 1628298651 + .word 721258455 + .word 1627574939 + + # c += d; b ^= c; b <<<= 12; + .word 42337367 + add s5, s5, s9 + .word 43418839 + add s6, s6, s10 + .word 44500311 + add s7, s7, s11 + .word 45581783 + add s8, s8, t0 + .word 776208983 + xor s1, s1, s5 + .word 777290455 + xor s2, s2, s6 + .word 778371927 + xor s3, s3, s7 + .word 779453399 + xor s4, s4, s8 + .word 2521185367 + .word 2522234071 + .word 2523282775 + .word 2524331479 + .word 2722771543 + .word 2723820247 + .word 2724868951 + .word 2725917655 + .word 709624407 + .word 1631900827 + .word 710705879 + .word 1632196891 + .word 711787351 + .word 1632229787 + .word 712868823 + .word 1632262683 + + # a += b; d ^= a; d <<<= 8; + .word 33685591 + add a5, a5, s1 + .word 34767063 + add a6, a6, s2 + .word 35848535 + add a7, a7, s3 + .word 36930007 + add s0, s0, s4 + .word 784336471 + xor s9, s9, a5 + .word 785417943 + xor s10, s10, a6 + .word 786499415 + xor s11, s11, a7 + .word 787580887 + xor t0, t0, s0 + .word 2529442903 + .word 2530491607 + .word 2531540311 + .word 2532589015 + .word 2731292247 + .word 2732340951 + .word 2733389655 + .word 2734438359 + .word 718014039 + .word 1636621467 + .word 719095511 + .word 1636654363 + .word 720176983 + .word 1636687259 + .word 721258455 + .word 1635963547 + + # c += d; b ^= c; b <<<= 7; + .word 42337367 + add s5, s5, s9 + .word 43418839 + add s6, s6, s10 + .word 44500311 + add s7, s7, s11 + .word 45581783 + add s8, s8, t0 + .word 776208983 + xor s1, s1, s5 + .word 777290455 + xor s2, s2, s6 + .word 778371927 + xor s3, s3, s7 + .word 779453399 + xor s4, s4, s8 + .word 2521021527 + .word 2522070231 + .word 2523118935 + .word 2524167639 + .word 2722935383 + .word 2723984087 + .word 2725032791 + .word 2726081495 + .word 709624407 + .word 1637143707 + .word 710705879 + .word 1637439771 + .word 711787351 + .word 1637472667 + .word 712868823 + .word 1637505563 + + + # a += b; d ^= a; d <<<= 16; + .word 36831703 + add s0, s0, s1 + .word 33718359 + add a5, a5, s2 + .word 34799831 + add a6, a6, s3 + .word 35881303 + add a7, a7, s4 + .word 786532183 + xor s11, s11, s0 + .word 787482583 + xor t0, t0, a5 + .word 784369239 + xor s9, s9, a6 + .word 785450711 + xor s10, s10, a7 + .word 2531802199 + .word 2532850903 + .word 2529705303 + .word 2530754007 + .word 2733127511 + .word 2734176215 + .word 2731030103 + .word 2732078807 + .word 720111447 + .word 1628298651 + .word 721192919 + .word 1627574939 + .word 718079575 + .word 1628232859 + .word 719161047 + .word 1628265755 + + # c += d; b ^= c; b <<<= 12; + .word 43451607 + add s6, s6, s11 + .word 44533079 + add s7, s7, t0 + .word 45483479 + add s8, s8, s9 + .word 42370135 + add s5, s5, s10 + .word 776241751 + xor s1, s1, s6 + .word 777323223 + xor s2, s2, s7 + .word 778404695 + xor s3, s3, s8 + .word 779355095 + xor s4, s4, s5 + .word 2521185367 + .word 2522234071 + .word 2523282775 + .word 2524331479 + .word 2722771543 + .word 2723820247 + .word 2724868951 + .word 2725917655 + .word 709624407 + .word 1631900827 + .word 710705879 + .word 1632196891 + .word 711787351 + .word 1632229787 + .word 712868823 + .word 1632262683 + + # a += b; d ^= a; d <<<= 8; + .word 36831703 + add s0, s0, s1 + .word 33718359 + add a5, a5, s2 + .word 34799831 + add a6, a6, s3 + .word 35881303 + add a7, a7, s4 + .word 786532183 + xor s11, s11, s0 + .word 787482583 + xor t0, t0, a5 + .word 784369239 + xor s9, s9, a6 + .word 785450711 + xor s10, s10, a7 + .word 2531540055 + .word 2532588759 + .word 2529443159 + .word 2530491863 + .word 2733389655 + .word 2734438359 + .word 2731292247 + .word 2732340951 + .word 720111447 + .word 1636687259 + .word 721192919 + .word 1635963547 + .word 718079575 + .word 1636621467 + .word 719161047 + .word 1636654363 + + # c += d; b ^= c; b <<<= 7; + .word 43451607 + add s6, s6, s11 + .word 44533079 + add s7, s7, t0 + .word 45483479 + add s8, s8, s9 + .word 42370135 + add s5, s5, s10 + .word 776241751 + xor s1, s1, s6 + .word 777323223 + xor s2, s2, s7 + .word 778404695 + xor s3, s3, s8 + .word 779355095 + xor s4, s4, s5 + .word 2521021527 + .word 2522070231 + .word 2523118935 + .word 2524167639 + .word 2722935383 + .word 2723984087 + .word 2725032791 + .word 2726081495 + .word 709624407 + .word 1637143707 + .word 710705879 + .word 1637439771 + .word 711787351 + .word 1637472667 + .word 712868823 + .word 1637505563 + + + bnez t3, .Lround_loop + + li t3, 64 + # load the bottom-half of input data into v24~v31 + addi t4, a1, 32 + .word 3956206599 + + # now, there are no free vector registers until the round_loop exits. + + # add chacha top-half initial block states + # "expa" little endian + li t3, 0x61707865 + .word 34488407 + add a5, a5, t3 + # "nd 3" little endian + li t4, 0x3320646e + .word 35569879 + add a6, a6, t4 + lw t3, 0(a3) + # "2-by" little endian + li t5, 0x79622d32 + .word 36651351 + add a7, a7, t5 + lw t4, 4(a3) + # "te k" little endian + li t6, 0x6b206574 + .word 37732823 + add s0, s0, t6 + lw t5, 8(a3) + .word 38683223 + add s1, s1, t3 + lw t6, 12(a3) + .word 39764695 + add s2, s2, t4 + .word 40846167 + add s3, s3, t5 + .word 41927639 + add s4, s4, t6 + + # xor with the top-half input + .word 788531287 + sw a5, 0(sp) + sw a6, 4(sp) + .word 789612759 + sw a7, 8(sp) + sw s0, 12(sp) + .word 790694231 + sw s1, 16(sp) + sw s2, 20(sp) + .word 791775703 + sw s3, 24(sp) + sw s4, 28(sp) + .word 792857175 + lw t3, 16(a3) + .word 793938647 + lw t4, 20(a3) + .word 795020119 + lw t5, 24(a3) + .word 796101591 + + # save the top-half of output from v16~v23 + li t6, 64 + .word 3958728743 + + # add chacha bottom-half initial block states + .word 42878039 + add s5, s5, t3 + lw t6, 28(a3) + .word 43959511 + add s6, s6, t4 + lw t3, 4(a4) + .word 45040983 + add s7, s7, t5 + lw t4, 8(a4) + .word 46122455 + add s8, s8, t6 + lw t5, 12(a4) + .word 1376297047 + add s9, s9, t2 + .word 46384727 + add s9, s9, t1 + .word 48121559 + add s10, s10, t3 + .word 49203031 + add s11, s11, t4 + .word 50284503 + add t0, t0, t5 + .word 46138967 + # xor with the bottom-half input + .word 797183063 + sw s5, 32(sp) + .word 798264535 + sw s6, 36(sp) + .word 799346007 + sw s7, 40(sp) + .word 800427479 + sw s8, 44(sp) + .word 802590423 + sw s9, 48(sp) + .word 801508951 + sw s10, 52(sp) + .word 803671895 + sw s11, 56(sp) + .word 804753367 + sw t0, 60(sp) + + # save the bottom-half of output from v24~v31 + li t3, 64 + addi t4, a0, 32 + .word 3956206631 + + # the computed vector parts: `64 * VL` + slli t3, t1, 6 + + add a1, a1, t3 + add a0, a0, t3 + sub a2, a2, t3 + add t2, t2, t1 + + # process the scalar data block + addi t2, t2, 1 + li t3, 64 + .word 197549747 + sub a2, a2, t4 + mv t5, sp +.Lscalar_data_loop: + .word 205452119 + # from this on, vector registers are grouped with lmul = 8 + .word 33915911 + .word 34539527 + .word 780665943 + .word 33883175 + add a1, a1, t1 + add a0, a0, t1 + add t5, t5, t1 + sub t4, t4, t1 + bnez t4, .Lscalar_data_loop + + bnez a2, .Lblock_loop + + addi sp, sp, 64 + ld s0, 0(sp) + ld s1, 8(sp) + ld s2, 16(sp) + ld s3, 24(sp) + ld s4, 32(sp) + ld s5, 40(sp) + ld s6, 48(sp) + ld s7, 56(sp) + ld s8, 64(sp) + ld s9, 72(sp) + ld s10, 80(sp) + ld s11, 88(sp) + addi sp, sp, 96 + + ret +.size ChaCha20_ctr32_v_zbb,.-ChaCha20_ctr32_v_zbb diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s new file mode 100644 index 000000000000..6c1c5e1c7e28 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s @@ -0,0 +1,1540 @@ +.text +.p2align 3 +.globl rv64i_zvkb_zvkg_zvkned_aes_gcm_encrypt +.type rv64i_zvkb_zvkg_zvkned_aes_gcm_encrypt,@function +rv64i_zvkb_zvkg_zvkned_aes_gcm_encrypt: + srli t0, a2, 4 + beqz t0, .Lenc_end + slli t5, t0, 2 + + mv a7, t5 + + # Compute the AES-GCM full-block e32 length for `LMUL=4`. We will handle + # the multiple AES-GCM blocks at the same time within `LMUL=4` register. + # The AES-GCM's SEW is e32 and EGW is 128 bits. + # FULL_BLOCK_LEN32 = (VLEN*LMUL)/(EGW) * (EGW/SEW) = (VLEN*4)/(32*4) * 4 + # = (VLEN*4)/32 + # We could get the block_num using the VL value of `vsetvli with e32, m4`. + .word 220231767 + # If `LEN32 % FULL_BLOCK_LEN32` is not equal to zero, we could fill the + # zero padding data to make sure we could always handle FULL_BLOCK_LEN32 + # blocks for all iterations. + + ## Prepare the H^n multiplier in v16 for GCM multiplier. The `n` is the gcm + ## block number in a LMUL=4 register group. + ## n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) + ## = (VLEN/32) + ## We could use vsetvli with `e32, m1` to compute the `n` number. + .word 218133207 + + # The H is at `gcm128_context.Htable[0]`(addr(Xi)+16*2). + addi t1, a5, 32 + .word 3439489111 + .word 33779591 + + # Compute the H^n + li t1, 1 +1: + .word 2750984183 + slli t1, t1, 1 + bltu t1, t0, 1b + + .word 220754007 + .word 1577072727 + .word 2817763447 + + #### Load plaintext into v24 and handle padding. We also load the init tag + #### data into v20 and prepare the AES ctr input data into v12 and v28. + .word 1577073239 + + ## Prepare the AES ctr input data into v12. + # Setup ctr input mask. + # ctr mask : [000100010001....] + # Note: The actual vl should be `FULL_BLOCK_LEN32/4 * 2`, but we just use + # `FULL_BLOCK_LEN32` here. + .word 201879639 + li t0, 0b10001000 + .word 1577238615 + # Load IV. + .word 3439489111 + .word 34041735 + # Convert the big-endian counter into little-endian. + .word 3305271383 + .word 1240772567 + # Splat the `single block of IV` to v12 + .word 220754007 + .word 1577072215 + .word 2817762935 + # Prepare the ctr counter into v8 + # v8: [x, x, x, 0, x, x, x, 1, x, x, x, 2, ...] + .word 1342710871 + # Merge IV and ctr counter into v12. + # v12:[x, x, x, count+0, x, x, x, count+1, ...] + .word 86536279 + .word 12846679 + + li t4, 0 + # Get the SEW32 size in the first round. + # If we have the non-zero value for `LEN32&(FULL_BLOCK_LEN32-1)`, then + # we will have the leading padding zero. + addi t0, a6, -1 + and t0, t0, t5 + beqz t0, 1f + + ## with padding + sub t5, t5, t0 + sub t4, a6, t0 + # padding block size + srli t1, t4, 2 + # padding byte size + slli t2, t4, 2 + + # Adjust the ctr counter to make the counter start from `counter+0` for the + # first non-padding block. + .word 86536279 + .word 147015255 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + .word 1237626455 + + # Prepare the mask for input loading in the first round. We use + # `VL=FULL_BLOCK_LEN32` with the mask in the first round. + # Adjust input ptr. + sub a0, a0, t2 + # Adjust output ptr. + sub a1, a1, t2 + .word 211316823 + .word 1376297303 + # We don't use the pseudo instruction `vmsgeu` here. Use `vmsgtu` instead. + # The original code is: + # vmsgeu.vx v0, v2, t4 + addi t0, t4, -1 + .word 2049097815 + .word 220754007 + .word 1577073751 + # Load the input for length FULL_BLOCK_LEN32 with mask. + .word 86536279 + .word 355335 + + # Load the init `Xi` data to v20 with preceding zero padding. + # Adjust Xi ptr. + sub t0, a5, t2 + # Load for length `zero-padding-e32-length + 4`. + addi t1, t4, 4 + .word 19099735 + .word 190983 + j 2f + +1: + ## without padding + sub t5, t5, a6 + + .word 220754007 + .word 33909767 + + # Load the init Xi data to v20. + .word 3372380247 + .word 34073095 + + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 86536279 + .word 1577455191 + .word 1237626455 +2: + + + # Load number of rounds + lwu t0, 240(a3) + li t1, 14 + li t2, 12 + li t3, 10 + + beq t0, t1, aes_gcm_enc_blocks_256 + beq t0, t2, aes_gcm_enc_blocks_192 + beq t0, t3, aes_gcm_enc_blocks_128 + +.Lenc_end: + li a0, 0 + ret + +.size rv64i_zvkb_zvkg_zvkned_aes_gcm_encrypt,.-rv64i_zvkb_zvkg_zvkned_aes_gcm_encrypt +.p2align 3 +aes_gcm_enc_blocks_128: + srli t6, a6, 2 + slli t0, a6, 2 + + # Load all 11 aes round keys to v1-v11 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + # We already have the ciphertext/plaintext and ctr data for the first round. + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr result. + .word 801902167 + + bnez t4, 1f + + ## without padding + # Store ciphertext/plaintext + .word 33943079 + j 2f + + ## with padding +1: + # Store ciphertext/plaintext using mask + .word 388647 + + # Fill zero for the padding blocks + .word 154071127 + .word 1577074263 + + # We have used mask register for `INPUT_PADDING_MASK` before. We need to + # setup the ctr mask back. + # ctr mask : [000100010001....] + .word 201879639 + li t1, 0b10001000 + .word 1577271383 +2: + + + + add a0, a0, t0 + add a1, a1, t0 + + + .word 220754007 + +.Lenc_blocks_128: + # Compute the partial tags. + # The partial tags will multiply with [H^n, H^n, ..., H^n] + # [tag0, tag1, ...] = + # ([tag0, tag1, ...] + [ciphertext0, ciphertext1, ...] * [H^n, H^n, ..., H^n] + # We will skip the [H^n, H^n, ..., H^n] multiplication for the last round. + beqz t5, .Lenc_blocks_128_end + .word 3004050039 + + .word 86536279 + # Increase ctr in v12. + .word 13616727 + sub t5, t5, a6 + # Load plaintext into v24 + .word 220229719 + .word 33909767 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + add a0, a0, t0 + .word 86011991 + .word 1237626455 + + + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr ciphertext result. + .word 801902167 + + # Store ciphertext + .word 33943079 + add a1, a1, t0 + + j .Lenc_blocks_128 +.Lenc_blocks_128_end: + + # Add ciphertext into partial tag + .word 793643607 + + .word 3441586263 + # Update current ctr value to v12 + .word 13616727 + # Convert ctr to big-endian counter. + .word 1220847191 + .word 484903 + + + # The H is at `gcm128_context.Htable[0]` (addr(Xi)+16*2). + # Load H to v1 + addi t1, a5, 32 + .word 3439489111 + .word 33775751 + # Multiply H for each partial tag and XOR them together. + # Handle 1st partial tag + .word 1577713751 + .word 2719522935 + # Handle 2nd to N-th partial tags + li t1, 4 +1: + .word 3441586263 + .word 1061372503 + .word 3439489111 + .word 2987532407 + addi t1, t1, 4 + blt t1, a6, 1b + + + # Save the final tag + .word 34070567 + + # return the processed size. + slli a0, a7, 2 + ret +.size aes_gcm_enc_blocks_128,.-aes_gcm_enc_blocks_128 +.p2align 3 +aes_gcm_enc_blocks_192: + srli t6, a6, 2 + slli t0, a6, 2 + + # We run out of 32 vector registers, so we just preserve some round keys + # and load the remaining round keys inside the aes body. + # We keep the round keys for: + # 1, 2, 3, 5, 6, 7, 9, 10, 11 and 12th keys. + # The following keys will be loaded in the aes body: + # 4, 8 and 13th keys. + .word 3439489111 + # key 1 + .word 34005127 + # key 2 + addi t1, a3, 16 + .word 33775879 + # key 3 + addi t1, a3, 32 + .word 33776007 + # key 5 + addi t1, a3, 64 + .word 33776135 + # key 6 + addi t1, a3, 80 + .word 33776263 + # key 7 + addi t1, a3, 96 + .word 33776391 + # key 9 + addi t1, a3, 128 + .word 33776519 + # key 10 + addi t1, a3, 144 + .word 33776647 + # key 11 + addi t1, a3, 160 + .word 33776775 + # key 12 + addi t1, a3, 176 + .word 33776903 + + # We already have the ciphertext/plaintext and ctr data for the first round. + # Load key 4 + .word 3439489111 + addi t1, a3, 48 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2796629623 + # Load key 8 + .word 3439489111 + addi t1, a3, 112 + .word 33777031 + .word 220754007 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 13 + .word 3439489111 + addi t1, a3, 192 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr result. + .word 801902167 + + bnez t4, 1f + + ## without padding + # Store ciphertext/plaintext + .word 33943079 + j 2f + + ## with padding +1: + # Store ciphertext/plaintext using mask + .word 388647 + + # Fill zero for the padding blocks + .word 154071127 + .word 1577074263 + + # We have used mask register for `INPUT_PADDING_MASK` before. We need to + # setup the ctr mask back. + # ctr mask : [000100010001....] + .word 201879639 + li t1, 0b10001000 + .word 1577271383 +2: + + + + add a0, a0, t0 + add a1, a1, t0 + + + .word 220754007 + +.Lenc_blocks_192: + # Compute the partial tags. + # The partial tags will multiply with [H^n, H^n, ..., H^n] + # [tag0, tag1, ...] = + # ([tag0, tag1, ...] + [ciphertext0, ciphertext1, ...] * [H^n, H^n, ..., H^n] + # We will skip the [H^n, H^n, ..., H^n] multiplication for the last round. + beqz t5, .Lenc_blocks_192_end + .word 3004050039 + + .word 86536279 + # Increase ctr in v12. + .word 13616727 + sub t5, t5, a6 + # Load plaintext into v24 + .word 220229719 + .word 33909767 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + add a0, a0, t0 + .word 86011991 + .word 1237626455 + + + # Load key 4 + .word 3439489111 + addi t1, a3, 48 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2796629623 + # Load key 8 + .word 3439489111 + addi t1, a3, 112 + .word 33777031 + .word 220754007 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 13 + .word 3439489111 + addi t1, a3, 192 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr ciphertext result. + .word 801902167 + + # Store ciphertext + .word 33943079 + add a1, a1, t0 + + j .Lenc_blocks_192 +.Lenc_blocks_192_end: + + # Add ciphertext into partial tag + .word 793643607 + + .word 3441586263 + # Update current ctr value to v12 + .word 13616727 + # Convert ctr to big-endian counter. + .word 1220847191 + .word 484903 + + + # The H is at `gcm128_context.Htable[0]` (addr(Xi)+16*2). + # Load H to v1 + addi t1, a5, 32 + .word 3439489111 + .word 33775751 + # Multiply H for each partial tag and XOR them together. + # Handle 1st partial tag + .word 1577713751 + .word 2719522935 + # Handle 2nd to N-th partial tags + li t1, 4 +1: + .word 3441586263 + .word 1061372503 + .word 3439489111 + .word 2987532407 + addi t1, t1, 4 + blt t1, a6, 1b + + + # Save the final tag + .word 34070567 + + # return the processed size. + slli a0, a7, 2 + ret +.size aes_gcm_enc_blocks_192,.-aes_gcm_enc_blocks_192 +.p2align 3 +aes_gcm_enc_blocks_256: + srli t6, a6, 2 + slli t0, a6, 2 + + # We run out of 32 vector registers, so we just preserve some round keys + # and load the remaining round keys inside the aes body. + # We keep the round keys for: + # 1, 2, 4, 5, 7, 8, 10, 11, 13 and 14th keys. + # The following keys will be loaded in the aes body: + # 3, 6, 9, 12 and 15th keys. + .word 3439489111 + # key 1 + .word 34005127 + # key 2 + addi t1, a3, 16 + .word 33775879 + # key 4 + addi t1, a3, 48 + .word 33776007 + # key 5 + addi t1, a3, 64 + .word 33776135 + # key 7 + addi t1, a3, 96 + .word 33776263 + # key 8 + addi t1, a3, 112 + .word 33776391 + # key 10 + addi t1, a3, 144 + .word 33776519 + # key 11 + addi t1, a3, 160 + .word 33776647 + # key 13 + addi t1, a3, 192 + .word 33776775 + # key 14 + addi t1, a3, 208 + .word 33776903 + + # We already have the ciphertext/plaintext and ctr data for the first round. + # Load key 3 + .word 3439489111 + addi t1, a3, 32 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2796629623 + # Load key 6 + .word 3439489111 + addi t1, a3, 80 + .word 33777031 + .word 220754007 + .word 2788241015 + .word 2789289591 + .word 2796629623 + # Load key 9 + .word 3439489111 + addi t1, a3, 128 + .word 33777031 + .word 220754007 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 12 + .word 3439489111 + addi t1, a3, 176 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2796629623 + # Load key 15 + .word 3439489111 + addi t1, a3, 224 + .word 33777031 + .word 220754007 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr result. + .word 801902167 + + bnez t4, 1f + + ## without padding + # Store ciphertext/plaintext + .word 33943079 + j 2f + + ## with padding +1: + # Store ciphertext/plaintext using mask + .word 388647 + + # Fill zero for the padding blocks + .word 154071127 + .word 1577074263 + + # We have used mask register for `INPUT_PADDING_MASK` before. We need to + # setup the ctr mask back. + # ctr mask : [000100010001....] + .word 201879639 + li t1, 0b10001000 + .word 1577271383 +2: + + + + add a0, a0, t0 + add a1, a1, t0 + + + .word 220754007 + +.Lenc_blocks_256: + # Compute the partial tags. + # The partial tags will multiply with [H^n, H^n, ..., H^n] + # [tag0, tag1, ...] = + # ([tag0, tag1, ...] + [ciphertext0, ciphertext1, ...] * [H^n, H^n, ..., H^n] + # We will skip the [H^n, H^n, ..., H^n] multiplication for the last round. + beqz t5, .Lenc_blocks_256_end + .word 3004050039 + + .word 86536279 + # Increase ctr in v12. + .word 13616727 + sub t5, t5, a6 + # Load plaintext into v24 + .word 220229719 + .word 33909767 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + add a0, a0, t0 + .word 86011991 + .word 1237626455 + + + # Load key 3 + .word 3439489111 + addi t1, a3, 32 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2796629623 + # Load key 6 + .word 3439489111 + addi t1, a3, 80 + .word 33777031 + .word 220754007 + .word 2788241015 + .word 2789289591 + .word 2796629623 + # Load key 9 + .word 3439489111 + addi t1, a3, 128 + .word 33777031 + .word 220754007 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 12 + .word 3439489111 + addi t1, a3, 176 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2796629623 + # Load key 15 + .word 3439489111 + addi t1, a3, 224 + .word 33777031 + .word 220754007 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr ciphertext result. + .word 801902167 + + # Store ciphertext + .word 33943079 + add a1, a1, t0 + + j .Lenc_blocks_256 +.Lenc_blocks_256_end: + + # Add ciphertext into partial tag + .word 793643607 + + .word 3441586263 + # Update current ctr value to v12 + .word 13616727 + # Convert ctr to big-endian counter. + .word 1220847191 + .word 484903 + + + # The H is at `gcm128_context.Htable[0]` (addr(Xi)+16*2). + # Load H to v1 + addi t1, a5, 32 + .word 3439489111 + .word 33775751 + # Multiply H for each partial tag and XOR them together. + # Handle 1st partial tag + .word 1577713751 + .word 2719522935 + # Handle 2nd to N-th partial tags + li t1, 4 +1: + .word 3441586263 + .word 1061372503 + .word 3439489111 + .word 2987532407 + addi t1, t1, 4 + blt t1, a6, 1b + + + # Save the final tag + .word 34070567 + + # return the processed size. + slli a0, a7, 2 + ret +.size aes_gcm_enc_blocks_256,.-aes_gcm_enc_blocks_256 +.p2align 3 +.globl rv64i_zvkb_zvkg_zvkned_aes_gcm_decrypt +.type rv64i_zvkb_zvkg_zvkned_aes_gcm_decrypt,@function +rv64i_zvkb_zvkg_zvkned_aes_gcm_decrypt: + srli t0, a2, 4 + beqz t0, .Ldec_end + slli t5, t0, 2 + + mv a7, t5 + + # Compute the AES-GCM full-block e32 length for `LMUL=4`. We will handle + # the multiple AES-GCM blocks at the same time within `LMUL=4` register. + # The AES-GCM's SEW is e32 and EGW is 128 bits. + # FULL_BLOCK_LEN32 = (VLEN*LMUL)/(EGW) * (EGW/SEW) = (VLEN*4)/(32*4) * 4 + # = (VLEN*4)/32 + # We could get the block_num using the VL value of `vsetvli with e32, m4`. + .word 220231767 + # If `LEN32 % FULL_BLOCK_LEN32` is not equal to zero, we could fill the + # zero padding data to make sure we could always handle FULL_BLOCK_LEN32 + # blocks for all iterations. + + ## Prepare the H^n multiplier in v16 for GCM multiplier. The `n` is the gcm + ## block number in a LMUL=4 register group. + ## n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) + ## = (VLEN/32) + ## We could use vsetvli with `e32, m1` to compute the `n` number. + .word 218133207 + + # The H is at `gcm128_context.Htable[0]`(addr(Xi)+16*2). + addi t1, a5, 32 + .word 3439489111 + .word 33779591 + + # Compute the H^n + li t1, 1 +1: + .word 2750984183 + slli t1, t1, 1 + bltu t1, t0, 1b + + .word 220754007 + .word 1577072727 + .word 2817763447 + + #### Load plaintext into v24 and handle padding. We also load the init tag + #### data into v20 and prepare the AES ctr input data into v12 and v28. + .word 1577073239 + + ## Prepare the AES ctr input data into v12. + # Setup ctr input mask. + # ctr mask : [000100010001....] + # Note: The actual vl should be `FULL_BLOCK_LEN32/4 * 2`, but we just use + # `FULL_BLOCK_LEN32` here. + .word 201879639 + li t0, 0b10001000 + .word 1577238615 + # Load IV. + .word 3439489111 + .word 34041735 + # Convert the big-endian counter into little-endian. + .word 3305271383 + .word 1240772567 + # Splat the `single block of IV` to v12 + .word 220754007 + .word 1577072215 + .word 2817762935 + # Prepare the ctr counter into v8 + # v8: [x, x, x, 0, x, x, x, 1, x, x, x, 2, ...] + .word 1342710871 + # Merge IV and ctr counter into v12. + # v12:[x, x, x, count+0, x, x, x, count+1, ...] + .word 86536279 + .word 12846679 + + li t4, 0 + # Get the SEW32 size in the first round. + # If we have the non-zero value for `LEN32&(FULL_BLOCK_LEN32-1)`, then + # we will have the leading padding zero. + addi t0, a6, -1 + and t0, t0, t5 + beqz t0, 1f + + ## with padding + sub t5, t5, t0 + sub t4, a6, t0 + # padding block size + srli t1, t4, 2 + # padding byte size + slli t2, t4, 2 + + # Adjust the ctr counter to make the counter start from `counter+0` for the + # first non-padding block. + .word 86536279 + .word 147015255 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + .word 1237626455 + + # Prepare the mask for input loading in the first round. We use + # `VL=FULL_BLOCK_LEN32` with the mask in the first round. + # Adjust input ptr. + sub a0, a0, t2 + # Adjust output ptr. + sub a1, a1, t2 + .word 211316823 + .word 1376297303 + # We don't use the pseudo instruction `vmsgeu` here. Use `vmsgtu` instead. + # The original code is: + # vmsgeu.vx v0, v2, t4 + addi t0, t4, -1 + .word 2049097815 + .word 220754007 + .word 1577073751 + # Load the input for length FULL_BLOCK_LEN32 with mask. + .word 86536279 + .word 355335 + + # Load the init `Xi` data to v20 with preceding zero padding. + # Adjust Xi ptr. + sub t0, a5, t2 + # Load for length `zero-padding-e32-length + 4`. + addi t1, t4, 4 + .word 19099735 + .word 190983 + j 2f + +1: + ## without padding + sub t5, t5, a6 + + .word 220754007 + .word 33909767 + + # Load the init Xi data to v20. + .word 3372380247 + .word 34073095 + + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 86536279 + .word 1577455191 + .word 1237626455 +2: + + + # Load number of rounds + lwu t0, 240(a3) + li t1, 14 + li t2, 12 + li t3, 10 + + beq t0, t1, aes_gcm_dec_blocks_256 + beq t0, t2, aes_gcm_dec_blocks_192 + beq t0, t3, aes_gcm_dec_blocks_128 + +.Ldec_end: + li a0, 0 + ret +.size rv64i_zvkb_zvkg_zvkned_aes_gcm_decrypt,.-rv64i_zvkb_zvkg_zvkned_aes_gcm_decrypt +.p2align 3 +aes_gcm_dec_blocks_128: + srli t6, a6, 2 + slli t0, a6, 2 + + # Load all 11 aes round keys to v1-v11 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + # We already have the ciphertext/plaintext and ctr data for the first round. + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr result. + .word 801902167 + + bnez t4, 1f + + ## without padding + # Store ciphertext/plaintext + .word 33943079 + j 2f + + ## with padding +1: + # Store ciphertext/plaintext using mask + .word 388647 + + # Fill zero for the padding blocks + .word 154071127 + .word 1577074263 + + # We have used mask register for `INPUT_PADDING_MASK` before. We need to + # setup the ctr mask back. + # ctr mask : [000100010001....] + .word 201879639 + li t1, 0b10001000 + .word 1577271383 +2: + + + + add a0, a0, t0 + add a1, a1, t0 + + + .word 220754007 + +.Ldec_blocks_128: + # Compute the partial tags. + # The partial tags will multiply with [H^n, H^n, ..., H^n] + # [tag0, tag1, ...] = + # ([tag0, tag1, ...] + [ciphertext0, ciphertext1, ...] * [H^n, H^n, ..., H^n] + # We will skip the [H^n, H^n, ..., H^n] multiplication for the last round. + beqz t5, .Ldec_blocks_256_end + .word 3003918967 + + .word 86536279 + # Increase ctr in v12. + .word 13616727 + sub t5, t5, a6 + # Load plaintext into v24 + .word 220229719 + .word 33909767 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + add a0, a0, t0 + .word 86011991 + .word 1237626455 + + + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr plaintext result. + .word 801902167 + + # Store plaintext + .word 33943079 + add a1, a1, t0 + + j .Ldec_blocks_128 +.Ldec_blocks_128_end: + + # Add ciphertext into partial tag + .word 793512535 + + .word 3441586263 + # Update current ctr value to v12 + .word 13616727 + # Convert ctr to big-endian counter. + .word 1220847191 + .word 484903 + + + # The H is at `gcm128_context.Htable[0]` (addr(Xi)+16*2). + # Load H to v1 + addi t1, a5, 32 + .word 3439489111 + .word 33775751 + # Multiply H for each partial tag and XOR them together. + # Handle 1st partial tag + .word 1577713751 + .word 2719522935 + # Handle 2nd to N-th partial tags + li t1, 4 +1: + .word 3441586263 + .word 1061372503 + .word 3439489111 + .word 2987532407 + addi t1, t1, 4 + blt t1, a6, 1b + + + # Save the final tag + .word 34070567 + + # return the processed size. + slli a0, a7, 2 + ret +.size aes_gcm_dec_blocks_128,.-aes_gcm_dec_blocks_128 +.p2align 3 +aes_gcm_dec_blocks_192: + srli t6, a6, 2 + slli t0, a6, 2 + + # We run out of 32 vector registers, so we just preserve some round keys + # and load the remaining round keys inside the aes body. + # We keep the round keys for: + # 1, 2, 3, 5, 6, 7, 9, 10, 11 and 12th keys. + # The following keys will be loaded in the aes body: + # 4, 8 and 13th keys. + .word 3439489111 + # key 1 + .word 34005127 + # key 2 + addi t1, a3, 16 + .word 33775879 + # key 3 + addi t1, a3, 32 + .word 33776007 + # key 5 + addi t1, a3, 64 + .word 33776135 + # key 6 + addi t1, a3, 80 + .word 33776263 + # key 7 + addi t1, a3, 96 + .word 33776391 + # key 9 + addi t1, a3, 128 + .word 33776519 + # key 10 + addi t1, a3, 144 + .word 33776647 + # key 11 + addi t1, a3, 160 + .word 33776775 + # key 12 + addi t1, a3, 176 + .word 33776903 + + # We already have the ciphertext/plaintext and ctr data for the first round. + # Load key 4 + .word 3439489111 + addi t1, a3, 48 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2796629623 + # Load key 8 + .word 3439489111 + addi t1, a3, 112 + .word 33777031 + .word 220754007 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 13 + .word 3439489111 + addi t1, a3, 192 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr result. + .word 801902167 + + bnez t4, 1f + + ## without padding + # Store ciphertext/plaintext + .word 33943079 + j 2f + + ## with padding +1: + # Store ciphertext/plaintext using mask + .word 388647 + + # Fill zero for the padding blocks + .word 154071127 + .word 1577074263 + + # We have used mask register for `INPUT_PADDING_MASK` before. We need to + # setup the ctr mask back. + # ctr mask : [000100010001....] + .word 201879639 + li t1, 0b10001000 + .word 1577271383 +2: + + + + add a0, a0, t0 + add a1, a1, t0 + + + .word 220754007 + +.Ldec_blocks_192: + # Compute the partial tags. + # The partial tags will multiply with [H^n, H^n, ..., H^n] + # [tag0, tag1, ...] = + # ([tag0, tag1, ...] + [ciphertext0, ciphertext1, ...] * [H^n, H^n, ..., H^n] + # We will skip the [H^n, H^n, ..., H^n] multiplication for the last round. + beqz t5, .Ldec_blocks_192_end + .word 3003918967 + + .word 86536279 + # Increase ctr in v12. + .word 13616727 + sub t5, t5, a6 + # Load plaintext into v24 + .word 220229719 + .word 33909767 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + add a0, a0, t0 + .word 86011991 + .word 1237626455 + + + # Load key 4 + .word 3439489111 + addi t1, a3, 48 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2796629623 + # Load key 8 + .word 3439489111 + addi t1, a3, 112 + .word 33777031 + .word 220754007 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 13 + .word 3439489111 + addi t1, a3, 192 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr plaintext result. + .word 801902167 + + # Store plaintext + .word 33943079 + add a1, a1, t0 + + j .Ldec_blocks_192 +.Ldec_blocks_192_end: + + # Add ciphertext into partial tag + .word 793512535 + + .word 3441586263 + # Update current ctr value to v12 + .word 13616727 + # Convert ctr to big-endian counter. + .word 1220847191 + .word 484903 + + + # The H is at `gcm128_context.Htable[0]` (addr(Xi)+16*2). + # Load H to v1 + addi t1, a5, 32 + .word 3439489111 + .word 33775751 + # Multiply H for each partial tag and XOR them together. + # Handle 1st partial tag + .word 1577713751 + .word 2719522935 + # Handle 2nd to N-th partial tags + li t1, 4 +1: + .word 3441586263 + .word 1061372503 + .word 3439489111 + .word 2987532407 + addi t1, t1, 4 + blt t1, a6, 1b + + + # Save the final tag + .word 34070567 + + # return the processed size. + slli a0, a7, 2 + ret +.size aes_gcm_dec_blocks_192,.-aes_gcm_dec_blocks_192 +.p2align 3 +aes_gcm_dec_blocks_256: + srli t6, a6, 2 + slli t0, a6, 2 + + # We run out of 32 vector registers, so we just preserve some round keys + # and load the remaining round keys inside the aes body. + # We keep the round keys for: + # 1, 2, 4, 5, 7, 8, 10, 11, 13 and 14th keys. + # The following keys will be loaded in the aes body: + # 3, 6, 9, 12 and 15th keys. + .word 3439489111 + # key 1 + .word 34005127 + # key 2 + addi t1, a3, 16 + .word 33775879 + # key 4 + addi t1, a3, 48 + .word 33776007 + # key 5 + addi t1, a3, 64 + .word 33776135 + # key 7 + addi t1, a3, 96 + .word 33776263 + # key 8 + addi t1, a3, 112 + .word 33776391 + # key 10 + addi t1, a3, 144 + .word 33776519 + # key 11 + addi t1, a3, 160 + .word 33776647 + # key 13 + addi t1, a3, 192 + .word 33776775 + # key 14 + addi t1, a3, 208 + .word 33776903 + + # We already have the ciphertext/plaintext and ctr data for the first round. + # Load key 3 + .word 3439489111 + addi t1, a3, 32 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2796629623 + # Load key 6 + .word 3439489111 + addi t1, a3, 80 + .word 33777031 + .word 220754007 + .word 2788241015 + .word 2789289591 + .word 2796629623 + # Load key 9 + .word 3439489111 + addi t1, a3, 128 + .word 33777031 + .word 220754007 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 12 + .word 3439489111 + addi t1, a3, 176 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2796629623 + # Load key 15 + .word 3439489111 + addi t1, a3, 224 + .word 33777031 + .word 220754007 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr result. + .word 801902167 + + bnez t4, 1f + + ## without padding + # Store ciphertext/plaintext + .word 33943079 + j 2f + + ## with padding +1: + # Store ciphertext/plaintext using mask + .word 388647 + + # Fill zero for the padding blocks + .word 154071127 + .word 1577074263 + + # We have used mask register for `INPUT_PADDING_MASK` before. We need to + # setup the ctr mask back. + # ctr mask : [000100010001....] + .word 201879639 + li t1, 0b10001000 + .word 1577271383 +2: + + + + add a0, a0, t0 + add a1, a1, t0 + + + .word 220754007 + +.Ldec_blocks_256: + # Compute the partial tags. + # The partial tags will multiply with [H^n, H^n, ..., H^n] + # [tag0, tag1, ...] = + # ([tag0, tag1, ...] + [ciphertext0, ciphertext1, ...] * [H^n, H^n, ..., H^n] + # We will skip the [H^n, H^n, ..., H^n] multiplication for the last round. + beqz t5, .Ldec_blocks_256_end + .word 3003918967 + + .word 86536279 + # Increase ctr in v12. + .word 13616727 + sub t5, t5, a6 + # Load plaintext into v24 + .word 220229719 + .word 33909767 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + add a0, a0, t0 + .word 86011991 + .word 1237626455 + + + # Load key 3 + .word 3439489111 + addi t1, a3, 32 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2796629623 + # Load key 6 + .word 3439489111 + addi t1, a3, 80 + .word 33777031 + .word 220754007 + .word 2788241015 + .word 2789289591 + .word 2796629623 + # Load key 9 + .word 3439489111 + addi t1, a3, 128 + .word 33777031 + .word 220754007 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 12 + .word 3439489111 + addi t1, a3, 176 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2796629623 + # Load key 15 + .word 3439489111 + addi t1, a3, 224 + .word 33777031 + .word 220754007 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr plaintext result. + .word 801902167 + + # Store plaintext + .word 33943079 + add a1, a1, t0 + + j .Ldec_blocks_256 +.Ldec_blocks_256_end: + + # Add ciphertext into partial tag + .word 793512535 + + .word 3441586263 + # Update current ctr value to v12 + .word 13616727 + # Convert ctr to big-endian counter. + .word 1220847191 + .word 484903 + + + # The H is at `gcm128_context.Htable[0]` (addr(Xi)+16*2). + # Load H to v1 + addi t1, a5, 32 + .word 3439489111 + .word 33775751 + # Multiply H for each partial tag and XOR them together. + # Handle 1st partial tag + .word 1577713751 + .word 2719522935 + # Handle 2nd to N-th partial tags + li t1, 4 +1: + .word 3441586263 + .word 1061372503 + .word 3439489111 + .word 2987532407 + addi t1, t1, 4 + blt t1, a6, 1b + + + # Save the final tag + .word 34070567 + + # return the processed size. + slli a0, a7, 2 + ret +.size aes_gcm_dec_blocks_256,.-aes_gcm_dec_blocks_256 diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64-zvkb-zvbc.s b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64-zvkb-zvbc.s new file mode 100644 index 000000000000..ca549d473a4e --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64-zvkb-zvbc.s @@ -0,0 +1,268 @@ +.text +.p2align 3 +.globl gcm_init_rv64i_zvkb_zvbc +.type gcm_init_rv64i_zvkb_zvbc,@function +gcm_init_rv64i_zvkb_zvbc: + # Load/store data in reverse order. + # This is needed as a part of endianness swap. + add a1, a1, 8 + li t0, -8 + li t1, 63 + la t2, Lpolymod + + .word 0xc1817057 # vsetivli x0, 2, e64, m1, tu, mu + + .word 173404295 # vlse64.v v1, (a1), t0 + .word 33812743 # vle64.v v2, (t2) + + # Shift one left and get the carry bits. + .word 2719171031 # vsrl.vx v3, v1, t1 + .word 2517676247 # vsll.vi v1, v1, 1 + + # Use the fact that the polynomial degree is no more than 128, + # i.e. only the LSB of the upper half could be set. + # Thanks to this we don't need to do the full reduction here. + # Instead simply subtract the reduction polynomial. + # This idea was taken from x86 ghash implementation in OpenSSL. + .word 976269911 # vslideup.vi v4, v3, 1 + .word 1043378647 # vslidedown.vi v3, v3, 1 + + .word 1577136215 # vmv.v.i v0, 2 + .word 672268503 # vor.vv v1, v1, v4, v0.t + + # Need to set the mask to 3, if the carry bit is set. + .word 1577156695 # vmv.v.v v0, v3 + .word 1577071063 # vmv.v.i v3, 0 + .word 1546760663 # vmerge.vim v3, v3, 3, v0 + .word 1577156695 # vmv.v.v v0, v3 + + .word 739311831 # vxor.vv v1, v1, v2, v0.t + + .word 33910951 # vse64.v v1, (a0) + ret +.size gcm_init_rv64i_zvkb_zvbc,.-gcm_init_rv64i_zvkb_zvbc +.text +.p2align 3 +.globl gcm_gmult_rv64i_zvkb_zvbc +.type gcm_gmult_rv64i_zvkb_zvbc,@function +gcm_gmult_rv64i_zvkb_zvbc: + ld t0, (a1) + ld t1, 8(a1) + li t2, 63 + la t3, Lpolymod + ld t3, 8(t3) + + # Load/store data in reverse order. + # This is needed as a part of endianness swap. + add a0, a0, 8 + li t4, -8 + + .word 0xc1817057 # vsetivli x0, 2, e64, m1, tu, mu + + .word 198537863 # vlse64.v v5, (a0), t4 + .word 1247060695 # vrev8.v v5, v5 + + # Multiplication + + # Do two 64x64 multiplications in one go to save some time + # and simplify things. + + # A = a1a0 (t1, t0) + # B = b1b0 (v5) + # C = c1c0 (256 bit) + # c1 = a1b1 + (a0b1)h + (a1b0)h + # c0 = a0b0 + (a0b1)l + (a1b0)h + + # v1 = (a0b1)l,(a0b0)l + .word 844292311 # vclmul.vx v1, v5, t0 + # v3 = (a0b1)h,(a0b0)h + .word 911401431 # vclmulh.vx v3, v5, t0 + + # v4 = (a1b1)l,(a1b0)l + .word 844325463 # vclmul.vx v4, v5, t1 + # v2 = (a1b1)h,(a1b0)h + .word 911434071 # vclmulh.vx v2, v5, t1 + + # Is there a better way to do this? + # Would need to swap the order of elements within a vector register. + .word 976270039 # vslideup.vi v5, v3, 1 + .word 977318743 # vslideup.vi v6, v4, 1 + .word 1043378647 # vslidedown.vi v3, v3, 1 + .word 1044427351 # vslidedown.vi v4, v4, 1 + + .word 1577103447 # vmv.v.i v0, 1 + # v2 += (a0b1)h + .word 740393303 # vxor.vv v2, v2, v3, v0.t + # v2 += (a1b1)l + .word 740426071 # vxor.vv v2, v2, v4, v0.t + + .word 1577136215 # vmv.v.i v0, 2 + # v1 += (a0b0)h,0 + .word 739410135 # vxor.vv v1, v1, v5, v0.t + # v1 += (a1b0)l,0 + .word 739442903 # vxor.vv v1, v1, v6, v0.t + + # Now the 256bit product should be stored in (v2,v1) + # v1 = (a0b1)l + (a0b0)h + (a1b0)l, (a0b0)l + # v2 = (a1b1)h, (a1b0)h + (a0b1)h + (a1b1)l + + # Reduction + # Let C := A*B = c3,c2,c1,c0 = v2[1],v2[0],v1[1],v1[0] + # This is a slight variation of the Gueron's Montgomery reduction. + # The difference being the order of some operations has been changed, + # to make a better use of vclmul(h) instructions. + + # First step: + # c1 += (c0 * P)l + # vmv.v.i v0, 2 + .word 940618199 # vslideup.vi v3, v1, 1, v0.t + .word 809394647 # vclmul.vx v3, v3, t3, v0.t + .word 739344599 # vxor.vv v1, v1, v3, v0.t + + # Second step: + # D = d1,d0 is final result + # We want: + # m1 = c1 + (c1 * P)h + # m0 = (c1 * P)l + (c0 * P)h + c0 + # d1 = c3 + m1 + # d0 = c2 + m0 + + #v3 = (c1 * P)l, 0 + .word 807297495 # vclmul.vx v3, v1, t3, v0.t + #v4 = (c1 * P)h, (c0 * P)h + .word 907960919 # vclmulh.vx v4, v1, t3 + + .word 1577103447 # vmv.v.i v0, 1 + .word 1043378647 # vslidedown.vi v3, v3, 1 + + .word 772931799 # vxor.vv v1, v1, v4 + .word 739344599 # vxor.vv v1, v1, v3, v0.t + + # XOR in the upper upper part of the product + .word 773882199 # vxor.vv v2, v2, v1 + + .word 1243914583 # vrev8.v v2, v2 + .word 198537511 # vsse64.v v2, (a0), t4 + ret +.size gcm_gmult_rv64i_zvkb_zvbc,.-gcm_gmult_rv64i_zvkb_zvbc +.p2align 3 +.globl gcm_ghash_rv64i_zvkb_zvbc +.type gcm_ghash_rv64i_zvkb_zvbc,@function +gcm_ghash_rv64i_zvkb_zvbc: + ld t0, (a1) + ld t1, 8(a1) + li t2, 63 + la t3, Lpolymod + ld t3, 8(t3) + + # Load/store data in reverse order. + # This is needed as a part of endianness swap. + add a0, a0, 8 + add a2, a2, 8 + li t4, -8 + + .word 0xc1817057 # vsetivli x0, 2, e64, m1, tu, mu + + .word 198537863 # vlse64.v v5, (a0), t4 + +Lstep: + # Read input data + .word 198603655 # vle64.v v0, (a2) + add a2, a2, 16 + add a3, a3, -16 + # XOR them into Xi + .word 777224919 # vxor.vv v0, v0, v1 + + .word 1247060695 # vrev8.v v5, v5 + + # Multiplication + + # Do two 64x64 multiplications in one go to save some time + # and simplify things. + + # A = a1a0 (t1, t0) + # B = b1b0 (v5) + # C = c1c0 (256 bit) + # c1 = a1b1 + (a0b1)h + (a1b0)h + # c0 = a0b0 + (a0b1)l + (a1b0)h + + # v1 = (a0b1)l,(a0b0)l + .word 844292311 # vclmul.vx v1, v5, t0 + # v3 = (a0b1)h,(a0b0)h + .word 911401431 # vclmulh.vx v3, v5, t0 + + # v4 = (a1b1)l,(a1b0)l + .word 844325463 # vclmul.vx v4, v5, t1 + # v2 = (a1b1)h,(a1b0)h + .word 911434071 # vclmulh.vx v2, v5, t1 + + # Is there a better way to do this? + # Would need to swap the order of elements within a vector register. + .word 976270039 # vslideup.vi v5, v3, 1 + .word 977318743 # vslideup.vi v6, v4, 1 + .word 1043378647 # vslidedown.vi v3, v3, 1 + .word 1044427351 # vslidedown.vi v4, v4, 1 + + .word 1577103447 # vmv.v.i v0, 1 + # v2 += (a0b1)h + .word 740393303 # vxor.vv v2, v2, v3, v0.t + # v2 += (a1b1)l + .word 740426071 # vxor.vv v2, v2, v4, v0.t + + .word 1577136215 # vmv.v.i v0, 2 + # v1 += (a0b0)h,0 + .word 739410135 # vxor.vv v1, v1, v5, v0.t + # v1 += (a1b0)l,0 + .word 739442903 # vxor.vv v1, v1, v6, v0.t + + # Now the 256bit product should be stored in (v2,v1) + # v1 = (a0b1)l + (a0b0)h + (a1b0)l, (a0b0)l + # v2 = (a1b1)h, (a1b0)h + (a0b1)h + (a1b1)l + + # Reduction + # Let C := A*B = c3,c2,c1,c0 = v2[1],v2[0],v1[1],v1[0] + # This is a slight variation of the Gueron's Montgomery reduction. + # The difference being the order of some operations has been changed, + # to make a better use of vclmul(h) instructions. + + # First step: + # c1 += (c0 * P)l + # vmv.v.i v0, 2 + .word 940618199 # vslideup.vi v3, v1, 1, v0.t + .word 809394647 # vclmul.vx v3, v3, t3, v0.t + .word 739344599 # vxor.vv v1, v1, v3, v0.t + + # Second step: + # D = d1,d0 is final result + # We want: + # m1 = c1 + (c1 * P)h + # m0 = (c1 * P)l + (c0 * P)h + c0 + # d1 = c3 + m1 + # d0 = c2 + m0 + + #v3 = (c1 * P)l, 0 + .word 807297495 # vclmul.vx v3, v1, t3, v0.t + #v4 = (c1 * P)h, (c0 * P)h + .word 907960919 # vclmulh.vx v4, v1, t3 + + .word 1577103447 # vmv.v.i v0, 1 + .word 1043378647 # vslidedown.vi v3, v3, 1 + + .word 772931799 # vxor.vv v1, v1, v4 + .word 739344599 # vxor.vv v1, v1, v3, v0.t + + # XOR in the upper upper part of the product + .word 773882199 # vxor.vv v2, v2, v1 + + .word 1243914967 # vrev8.v v2, v2 + + bnez a3, Lstep + + .word 198537895 # vsse64.v v2, (a0), t4 + ret +.size gcm_ghash_rv64i_zvkb_zvbc,.-gcm_ghash_rv64i_zvkb_zvbc +.p2align 4 +Lpolymod: + .dword 0x0000000000000001 + .dword 0xc200000000000000 +.size Lpolymod,.-Lpolymod diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64-zvkg.s b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64-zvkg.s new file mode 100644 index 000000000000..759c7c9c9e4d --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64-zvkg.s @@ -0,0 +1,81 @@ +.text +.p2align 3 +.globl gcm_init_rv64i_zvkg +.type gcm_init_rv64i_zvkg,@function +gcm_init_rv64i_zvkg: + ld a2, 0(a1) + ld a3, 8(a1) + sb a2, 7(a0) + srli t0, a2, 8 + sb t0, 6(a0) + srli t0, a2, 16 + sb t0, 5(a0) + srli t0, a2, 24 + sb t0, 4(a0) + srli t0, a2, 32 + sb t0, 3(a0) + srli t0, a2, 40 + sb t0, 2(a0) + srli t0, a2, 48 + sb t0, 1(a0) + srli t0, a2, 56 + sb t0, 0(a0) + + sb a3, 15(a0) + srli t0, a3, 8 + sb t0, 14(a0) + srli t0, a3, 16 + sb t0, 13(a0) + srli t0, a3, 24 + sb t0, 12(a0) + srli t0, a3, 32 + sb t0, 11(a0) + srli t0, a3, 40 + sb t0, 10(a0) + srli t0, a3, 48 + sb t0, 9(a0) + srli t0, a3, 56 + sb t0, 8(a0) + + ret +.size gcm_init_rv64i_zvkg,.-gcm_init_rv64i_zvkg +.p2align 3 +.globl gcm_init_rv64i_zvkg_zvkb +.type gcm_init_rv64i_zvkg_zvkb,@function +gcm_init_rv64i_zvkg_zvkb: + .word 0xc1817057 # vsetivli x0, 2, e64, m1, ta, ma + .word 33943559 # vle64.v v0, (a1) + .word 1241817175 # vrev8.v v0, v0 + .word 33910823 # vse64.v v0, (a0) + ret +.size gcm_init_rv64i_zvkg_zvkb,.-gcm_init_rv64i_zvkg_zvkb +.p2align 3 +.globl gcm_gmult_rv64i_zvkg +.type gcm_gmult_rv64i_zvkg,@function +gcm_gmult_rv64i_zvkg: + .word 0xc1027057 + .word 33939719 + .word 33906823 + .word 2720571639 + .word 33906855 + ret +.size gcm_gmult_rv64i_zvkg,.-gcm_gmult_rv64i_zvkg +.p2align 3 +.globl gcm_ghash_rv64i_zvkg +.type gcm_ghash_rv64i_zvkg,@function +gcm_ghash_rv64i_zvkg: + .word 0xc1027057 + .word 33939719 + .word 33906823 + +Lstep: + .word 33972615 + add a2, a2, 16 + add a3, a3, -16 + .word 2988548343 + bnez a3, Lstep + + .word 33906855 + ret + +.size gcm_ghash_rv64i_zvkg,.-gcm_ghash_rv64i_zvkg diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64.s b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64.s new file mode 100644 index 000000000000..337766973685 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64.s @@ -0,0 +1,613 @@ +.text +.p2align 3 +.globl gcm_init_rv64i_zbc +.type gcm_init_rv64i_zbc,@function +gcm_init_rv64i_zbc: + ld a2,0(a1) + ld a3,8(a1) + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a2, 1 + and t1, t1, t0 + and a2, a2, t0 + srli a2, a2, 1 + or a2, t1, a2 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a2, 2 + and t1, t1, t0 + and a2, a2, t0 + srli a2, a2, 2 + or a2, t1, a2 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a2, 4 + and t1, t1, t0 + and a2, a2, t0 + srli a2, a2, 4 + or a2, t1, a2 + + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a3, 1 + and t1, t1, t0 + and a3, a3, t0 + srli a3, a3, 1 + or a3, t1, a3 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a3, 2 + and t1, t1, t0 + and a3, a3, t0 + srli a3, a3, 2 + or a3, t1, a3 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a3, 4 + and t1, t1, t0 + and a3, a3, t0 + srli a3, a3, 4 + or a3, t1, a3 + + sb a2, 7(a0) + srli t0, a2, 8 + sb t0, 6(a0) + srli t0, a2, 16 + sb t0, 5(a0) + srli t0, a2, 24 + sb t0, 4(a0) + srli t0, a2, 32 + sb t0, 3(a0) + srli t0, a2, 40 + sb t0, 2(a0) + srli t0, a2, 48 + sb t0, 1(a0) + srli t0, a2, 56 + sb t0, 0(a0) + + sb a3, 15(a0) + srli t0, a3, 8 + sb t0, 14(a0) + srli t0, a3, 16 + sb t0, 13(a0) + srli t0, a3, 24 + sb t0, 12(a0) + srli t0, a3, 32 + sb t0, 11(a0) + srli t0, a3, 40 + sb t0, 10(a0) + srli t0, a3, 48 + sb t0, 9(a0) + srli t0, a3, 56 + sb t0, 8(a0) + + ret +.size gcm_init_rv64i_zbc,.-gcm_init_rv64i_zbc +.p2align 3 +.globl gcm_init_rv64i_zbc__zbb +.type gcm_init_rv64i_zbc__zbb,@function +gcm_init_rv64i_zbc__zbb: + ld a2,0(a1) + ld a3,8(a1) + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a2, 1 + and t1, t1, t0 + and a2, a2, t0 + srli a2, a2, 1 + or a2, t1, a2 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a2, 2 + and t1, t1, t0 + and a2, a2, t0 + srli a2, a2, 2 + or a2, t1, a2 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a2, 4 + and t1, t1, t0 + and a2, a2, t0 + srli a2, a2, 4 + or a2, t1, a2 + + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a3, 1 + and t1, t1, t0 + and a3, a3, t0 + srli a3, a3, 1 + or a3, t1, a3 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a3, 2 + and t1, t1, t0 + and a3, a3, t0 + srli a3, a3, 2 + or a3, t1, a3 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a3, 4 + and t1, t1, t0 + and a3, a3, t0 + srli a3, a3, 4 + or a3, t1, a3 + + .word 1803965971 + .word 1803998867 + sd a2,0(a0) + sd a3,8(a0) + ret +.size gcm_init_rv64i_zbc__zbb,.-gcm_init_rv64i_zbc__zbb +.p2align 3 +.globl gcm_init_rv64i_zbc__zbkb +.type gcm_init_rv64i_zbc__zbkb,@function +gcm_init_rv64i_zbc__zbkb: + ld t0,0(a1) + ld t1,8(a1) + .word 1752355475 + .word 1752388371 + .word 1803735699 + .word 1803768595 + sd t0,0(a0) + sd t1,8(a0) + ret +.size gcm_init_rv64i_zbc__zbkb,.-gcm_init_rv64i_zbc__zbkb +.p2align 3 +.globl gcm_gmult_rv64i_zbc +.type gcm_gmult_rv64i_zbc,@function +gcm_gmult_rv64i_zbc: + # Load Xi and bit-reverse it + ld a4, 0(a0) + ld a5, 8(a0) + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a4, 1 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 1 + or a4, t1, a4 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a4, 2 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 2 + or a4, t1, a4 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a4, 4 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 4 + or a4, t1, a4 + + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a5, 1 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 1 + or a5, t1, a5 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a5, 2 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 2 + or a5, t1, a5 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a5, 4 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 4 + or a5, t1, a5 + + + # Load the key (already bit-reversed) + ld a6, 0(a1) + ld a7, 8(a1) + + # Load the reduction constant + la t6, Lpolymod + lbu t6, 0(t6) + + # Multiplication (without Karatsuba) + .word 186105395 + .word 186094515 + .word 186072883 + .word 186061619 + xor t2, t2, t5 + .word 185057075 + .word 185048755 + xor t2, t2, t5 + xor t1, t1, t4 + .word 185024307 + .word 185012915 + xor t1, t1, t5 + + # Reduction with clmul + .word 201211699 + .word 201203379 + xor t2, t2, t5 + xor t1, t1, t4 + .word 200523571 + .word 200515251 + xor a5, t1, t5 + xor a4, t0, t4 + + # Bit-reverse Xi back and store it + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a4, 1 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 1 + or a4, t1, a4 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a4, 2 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 2 + or a4, t1, a4 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a4, 4 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 4 + or a4, t1, a4 + + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a5, 1 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 1 + or a5, t1, a5 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a5, 2 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 2 + or a5, t1, a5 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a5, 4 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 4 + or a5, t1, a5 + + sd a4, 0(a0) + sd a5, 8(a0) + ret +.size gcm_gmult_rv64i_zbc,.-gcm_gmult_rv64i_zbc +.p2align 3 +.globl gcm_gmult_rv64i_zbc__zbkb +.type gcm_gmult_rv64i_zbc__zbkb,@function +gcm_gmult_rv64i_zbc__zbkb: + # Load Xi and bit-reverse it + ld a4, 0(a0) + ld a5, 8(a0) + .word 1752651539 + .word 1752684435 + + # Load the key (already bit-reversed) + ld a6, 0(a1) + ld a7, 8(a1) + + # Load the reduction constant + la t6, Lpolymod + lbu t6, 0(t6) + + # Multiplication (without Karatsuba) + .word 186105395 + .word 186094515 + .word 186072883 + .word 186061619 + xor t2, t2, t5 + .word 185057075 + .word 185048755 + xor t2, t2, t5 + xor t1, t1, t4 + .word 185024307 + .word 185012915 + xor t1, t1, t5 + + # Reduction with clmul + .word 201211699 + .word 201203379 + xor t2, t2, t5 + xor t1, t1, t4 + .word 200523571 + .word 200515251 + xor a5, t1, t5 + xor a4, t0, t4 + + # Bit-reverse Xi back and store it + .word 1752651539 + .word 1752684435 + sd a4, 0(a0) + sd a5, 8(a0) + ret +.size gcm_gmult_rv64i_zbc__zbkb,.-gcm_gmult_rv64i_zbc__zbkb +.p2align 3 +.globl gcm_ghash_rv64i_zbc +.type gcm_ghash_rv64i_zbc,@function +gcm_ghash_rv64i_zbc: + # Load Xi and bit-reverse it + ld a4, 0(a0) + ld a5, 8(a0) + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a4, 1 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 1 + or a4, t1, a4 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a4, 2 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 2 + or a4, t1, a4 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a4, 4 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 4 + or a4, t1, a4 + + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a5, 1 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 1 + or a5, t1, a5 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a5, 2 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 2 + or a5, t1, a5 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a5, 4 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 4 + or a5, t1, a5 + + + # Load the key (already bit-reversed) + ld a6, 0(a1) + ld a7, 8(a1) + + # Load the reduction constant + la t6, Lpolymod + lbu t6, 0(t6) + +Lstep: + # Load the input data, bit-reverse them, and XOR them with Xi + ld t4, 0(a2) + ld t5, 8(a2) + add a2, a2, 16 + add a3, a3, -16 + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, t4, 1 + and t1, t1, t0 + and t4, t4, t0 + srli t4, t4, 1 + or t4, t1, t4 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, t4, 2 + and t1, t1, t0 + and t4, t4, t0 + srli t4, t4, 2 + or t4, t1, t4 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, t4, 4 + and t1, t1, t0 + and t4, t4, t0 + srli t4, t4, 4 + or t4, t1, t4 + + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, t5, 1 + and t1, t1, t0 + and t5, t5, t0 + srli t5, t5, 1 + or t5, t1, t5 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, t5, 2 + and t1, t1, t0 + and t5, t5, t0 + srli t5, t5, 2 + or t5, t1, t5 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, t5, 4 + and t1, t1, t0 + and t5, t5, t0 + srli t5, t5, 4 + or t5, t1, t5 + + xor a4, a4, t4 + xor a5, a5, t5 + + # Multiplication (without Karatsuba) + .word 186105395 + .word 186094515 + .word 186072883 + .word 186061619 + xor t2, t2, t5 + .word 185057075 + .word 185048755 + xor t2, t2, t5 + xor t1, t1, t4 + .word 185024307 + .word 185012915 + xor t1, t1, t5 + + # Reduction with clmul + .word 201211699 + .word 201203379 + xor t2, t2, t5 + xor t1, t1, t4 + .word 200523571 + .word 200515251 + xor a5, t1, t5 + xor a4, t0, t4 + + # Iterate over all blocks + bnez a3, Lstep + + # Bit-reverse final Xi back and store it + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a4, 1 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 1 + or a4, t1, a4 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a4, 2 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 2 + or a4, t1, a4 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a4, 4 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 4 + or a4, t1, a4 + + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a5, 1 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 1 + or a5, t1, a5 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a5, 2 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 2 + or a5, t1, a5 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a5, 4 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 4 + or a5, t1, a5 + + sd a4, 0(a0) + sd a5, 8(a0) + ret +.size gcm_ghash_rv64i_zbc,.-gcm_ghash_rv64i_zbc +.p2align 3 +.globl gcm_ghash_rv64i_zbc__zbkb +.type gcm_ghash_rv64i_zbc__zbkb,@function +gcm_ghash_rv64i_zbc__zbkb: + # Load Xi and bit-reverse it + ld a4, 0(a0) + ld a5, 8(a0) + .word 1752651539 + .word 1752684435 + + # Load the key (already bit-reversed) + ld a6, 0(a1) + ld a7, 8(a1) + + # Load the reduction constant + la t6, Lpolymod + lbu t6, 0(t6) + +Lstep_zkbk: + # Load the input data, bit-reverse them, and XOR them with Xi + ld t4, 0(a2) + ld t5, 8(a2) + add a2, a2, 16 + add a3, a3, -16 + .word 1753144979 + .word 1753177875 + xor a4, a4, t4 + xor a5, a5, t5 + + # Multiplication (without Karatsuba) + .word 186105395 + .word 186094515 + .word 186072883 + .word 186061619 + xor t2, t2, t5 + .word 185057075 + .word 185048755 + xor t2, t2, t5 + xor t1, t1, t4 + .word 185024307 + .word 185012915 + xor t1, t1, t5 + + # Reduction with clmul + .word 201211699 + .word 201203379 + xor t2, t2, t5 + xor t1, t1, t4 + .word 200523571 + .word 200515251 + xor a5, t1, t5 + xor a4, t0, t4 + + # Iterate over all blocks + bnez a3, Lstep_zkbk + + # Bit-reverse final Xi back and store it + .word 1752651539 + .word 1752684435 + sd a4, 0(a0) + sd a5, 8(a0) + ret +.size gcm_ghash_rv64i_zbc__zbkb,.-gcm_ghash_rv64i_zbc__zbkb +.p2align 3 +Lbrev8_const: + .dword 0xAAAAAAAAAAAAAAAA + .dword 0xCCCCCCCCCCCCCCCC + .dword 0xF0F0F0F0F0F0F0F0 +.size Lbrev8_const,.-Lbrev8_const + +Lpolymod: + .byte 0x87 +.size Lpolymod,.-Lpolymod diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/params_idx.c b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/params_idx.c new file mode 100644 index 000000000000..e5463ca5c8e5 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/params_idx.c @@ -0,0 +1,3370 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from crypto/params_idx.c.in + * + * Copyright 2023 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ +/* clang-format off */ + +/* clang-format on */ + +#include "internal/e_os.h" +#include "internal/param_names.h" +#include + +/* Machine generated TRIE -- generated by util/perl/OpenSSL/paramnames.pm */ +/* clang-format off */ +int ossl_param_find_pidx(const char *s) +{ + switch(s[0]) { + default: + break; + case 'a': + switch(s[1]) { + default: + break; + case 'c': + if (strcmp("vp-info", s + 2) == 0) + return PIDX_KDF_PARAM_X942_ACVPINFO; + break; + case 'd': + switch(s[2]) { + default: + break; + case 'd': + if (strcmp("itional-random", s + 3) == 0) + return PIDX_SIGNATURE_PARAM_ADD_RANDOM; + break; + case '\0': + return PIDX_KDF_PARAM_ARGON2_AD; + } + break; + case 'e': + if (strcmp("ad", s + 2) == 0) + return PIDX_CIPHER_PARAM_AEAD; + break; + case 'l': + switch(s[2]) { + default: + break; + case 'g': + switch(s[3]) { + default: + break; + case '_': + if (strcmp("id_param", s + 4) == 0) + return PIDX_CIPHER_PARAM_ALGORITHM_ID_PARAMS_OLD; + break; + case 'i': + if (strcmp("d-absent", s + 4) == 0) + return PIDX_DIGEST_PARAM_ALGID_ABSENT; + break; + case 'o': + switch(s[4]) { + default: + break; + case 'r': + switch(s[5]) { + default: + break; + case 'i': + switch(s[6]) { + default: + break; + case 't': + switch(s[7]) { + default: + break; + case 'h': + switch(s[8]) { + default: + break; + case 'm': + switch(s[9]) { + default: + break; + case '-': + switch(s[10]) { + default: + break; + case 'i': + switch(s[11]) { + default: + break; + case 'd': + switch(s[12]) { + default: + break; + case '-': + if (strcmp("params", s + 13) == 0) + return PIDX_ALG_PARAM_ALGORITHM_ID_PARAMS; + break; + case '\0': + return PIDX_ALG_PARAM_ALGORITHM_ID; + } + } + } + } + } + } + } + } + } + } + break; + case 'i': + if (strcmp("as", s + 3) == 0) + return PIDX_STORE_PARAM_ALIAS; + } + break; + case '\0': + return PIDX_PKEY_PARAM_EC_A; + } + break; + case 'b': + switch(s[1]) { + default: + break; + case 'a': + if (strcmp("sis-type", s + 2) == 0) + return PIDX_PKEY_PARAM_EC_CHAR2_TYPE; + break; + case 'i': + if (strcmp("ts", s + 2) == 0) + return PIDX_PKEY_PARAM_BITS; + break; + case 'l': + switch(s[2]) { + default: + break; + case 'o': + switch(s[3]) { + default: + break; + case 'c': + switch(s[4]) { + default: + break; + case 'k': + switch(s[5]) { + default: + break; + case '-': + if (strcmp("size", s + 6) == 0) + return PIDX_MAC_PARAM_BLOCK_SIZE; + break; + case '_': + if (strcmp("padding", s + 6) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_BLOCK_PADDING; + break; + case 's': + if (strcmp("ize", s + 6) == 0) + return PIDX_DIGEST_PARAM_BLOCK_SIZE; + } + } + } + } + break; + case 'u': + if (strcmp("ildinfo", s + 2) == 0) + return PIDX_PROV_PARAM_BUILDINFO; + break; + case '\0': + return PIDX_PKEY_PARAM_EC_B; + } + break; + case 'c': + switch(s[1]) { + default: + break; + case '-': + if (strcmp("rounds", s + 2) == 0) + return PIDX_MAC_PARAM_C_ROUNDS; + break; + case 'e': + if (strcmp("kalg", s + 2) == 0) + return PIDX_KDF_PARAM_CEK_ALG; + break; + case 'i': + if (strcmp("pher", s + 2) == 0) + return PIDX_ALG_PARAM_CIPHER; + break; + case 'o': + switch(s[2]) { + default: + break; + case 'f': + if (strcmp("actor", s + 3) == 0) + return PIDX_PKEY_PARAM_EC_COFACTOR; + break; + case 'n': + switch(s[3]) { + default: + break; + case 's': + if (strcmp("tant", s + 4) == 0) + return PIDX_KDF_PARAM_CONSTANT; + break; + case 't': + if (strcmp("ext-string", s + 4) == 0) + return PIDX_SIGNATURE_PARAM_CONTEXT_STRING; + } + } + break; + case 't': + switch(s[2]) { + default: + break; + case 's': + switch(s[3]) { + default: + break; + case '_': + if (strcmp("mode", s + 4) == 0) + return PIDX_CIPHER_PARAM_CTS_MODE; + break; + case '\0': + return PIDX_CIPHER_PARAM_CTS; + } + } + break; + case 'u': + switch(s[2]) { + default: + break; + case 's': + switch(s[3]) { + default: + break; + case 't': + switch(s[4]) { + default: + break; + case 'o': + switch(s[5]) { + default: + break; + case 'm': + switch(s[6]) { + default: + break; + case '-': + if (strcmp("iv", s + 7) == 0) + return PIDX_CIPHER_PARAM_CUSTOM_IV; + break; + case '\0': + return PIDX_MAC_PARAM_CUSTOM; + } + } + } + } + } + } + break; + case 'd': + switch(s[1]) { + default: + break; + case '-': + if (strcmp("rounds", s + 2) == 0) + return PIDX_MAC_PARAM_D_ROUNDS; + break; + case 'a': + switch(s[2]) { + default: + break; + case 't': + switch(s[3]) { + default: + break; + case 'a': + switch(s[4]) { + default: + break; + case '-': + switch(s[5]) { + default: + break; + case 's': + if (strcmp("tructure", s + 6) == 0) + return PIDX_OBJECT_PARAM_DATA_STRUCTURE; + break; + case 't': + if (strcmp("ype", s + 6) == 0) + return PIDX_OBJECT_PARAM_DATA_TYPE; + } + break; + case '\0': + return PIDX_OBJECT_PARAM_DATA; + } + } + } + break; + case 'e': + switch(s[2]) { + default: + break; + case 'c': + switch(s[3]) { + default: + break; + case 'o': + if (strcmp("ded-from-explicit", s + 4) == 0) + return PIDX_PKEY_PARAM_EC_DECODED_FROM_EXPLICIT_PARAMS; + break; + case 'r': + if (strcmp("ypt-only", s + 4) == 0) + return PIDX_CIPHER_PARAM_DECRYPT_ONLY; + } + break; + case 'f': + if (strcmp("ault-digest", s + 3) == 0) + return PIDX_PKEY_PARAM_DEFAULT_DIGEST; + break; + case 's': + if (strcmp("c", s + 3) == 0) + return PIDX_OBJECT_PARAM_DESC; + break; + case 't': + if (strcmp("erministic", s + 3) == 0) + return PIDX_SIGNATURE_PARAM_DETERMINISTIC; + } + break; + case 'h': + if (strcmp("kem-ikm", s + 2) == 0) + return PIDX_PKEY_PARAM_DHKEM_IKM; + break; + case 'i': + switch(s[2]) { + default: + break; + case 'g': + switch(s[3]) { + default: + break; + case 'e': + switch(s[4]) { + default: + break; + case 's': + switch(s[5]) { + default: + break; + case 't': + switch(s[6]) { + default: + break; + case '-': + switch(s[7]) { + default: + break; + case 'c': + if (strcmp("heck", s + 8) == 0) + return PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK; + break; + case 'n': + if (strcmp("oinit", s + 8) == 0) + return PIDX_MAC_PARAM_DIGEST_NOINIT; + break; + case 'o': + if (strcmp("neshot", s + 8) == 0) + return PIDX_MAC_PARAM_DIGEST_ONESHOT; + break; + case 'p': + if (strcmp("rops", s + 8) == 0) + return PIDX_ASYM_CIPHER_PARAM_OAEP_DIGEST_PROPS; + break; + case 's': + if (strcmp("ize", s + 8) == 0) + return PIDX_PKEY_PARAM_DIGEST_SIZE; + } + break; + case '\0': + return PIDX_STORE_PARAM_DIGEST; + } + } + } + } + break; + case 's': + if (strcmp("tid", s + 3) == 0) + return PIDX_PKEY_PARAM_DIST_ID; + } + break; + case 'r': + if (strcmp("bg-no-trunc-md", s + 2) == 0) + return PIDX_PROV_PARAM_DRBG_TRUNC_DIGEST; + break; + case 's': + if (strcmp("a-sign-disabled", s + 2) == 0) + return PIDX_PROV_PARAM_DSA_SIGN_DISABLED; + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_D; + } + break; + case 'e': + switch(s[1]) { + default: + break; + case 'a': + if (strcmp("rly_clean", s + 2) == 0) + return PIDX_KDF_PARAM_EARLY_CLEAN; + break; + case 'c': + switch(s[2]) { + default: + break; + case 'd': + switch(s[3]) { + default: + break; + case 'h': + switch(s[4]) { + default: + break; + case '-': + switch(s[5]) { + default: + break; + case 'c': + switch(s[6]) { + default: + break; + case 'o': + switch(s[7]) { + default: + break; + case 'f': + switch(s[8]) { + default: + break; + case 'a': + switch(s[9]) { + default: + break; + case 'c': + switch(s[10]) { + default: + break; + case 't': + switch(s[11]) { + default: + break; + case 'o': + switch(s[12]) { + default: + break; + case 'r': + switch(s[13]) { + default: + break; + case '-': + switch(s[14]) { + default: + break; + case 'c': + if (strcmp("heck", s + 15) == 0) + return PIDX_PROV_PARAM_ECDH_COFACTOR_CHECK; + break; + case 'm': + if (strcmp("ode", s + 15) == 0) + return PIDX_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE; + } + } + } + } + } + } + } + } + } + } + } + } + } + break; + case 'm': + if (strcmp("s_check", s + 2) == 0) + return PIDX_KDF_PARAM_FIPS_EMS_CHECK; + break; + case 'n': + switch(s[2]) { + default: + break; + case 'c': + switch(s[3]) { + default: + break; + case 'o': + switch(s[4]) { + default: + break; + case 'd': + switch(s[5]) { + default: + break; + case 'e': + if (strcmp("d-pub-key", s + 6) == 0) + return PIDX_PKEY_PARAM_ENCODED_PUBLIC_KEY; + break; + case 'i': + if (strcmp("ng", s + 6) == 0) + return PIDX_PKEY_PARAM_EC_ENCODING; + } + } + break; + case 'r': + switch(s[4]) { + default: + break; + case 'y': + switch(s[5]) { + default: + break; + case 'p': + switch(s[6]) { + default: + break; + case 't': + switch(s[7]) { + default: + break; + case '-': + switch(s[8]) { + default: + break; + case 'c': + if (strcmp("heck", s + 9) == 0) + return PIDX_CIPHER_PARAM_FIPS_ENCRYPT_CHECK; + break; + case 'l': + if (strcmp("evel", s + 9) == 0) + return PIDX_ENCODER_PARAM_ENCRYPT_LEVEL; + } + } + } + } + } + } + break; + case 'g': + if (strcmp("ine", s + 3) == 0) + return PIDX_ALG_PARAM_ENGINE; + break; + case 't': + switch(s[3]) { + default: + break; + case 'r': + switch(s[4]) { + default: + break; + case 'o': + switch(s[5]) { + default: + break; + case 'p': + switch(s[6]) { + default: + break; + case 'y': + switch(s[7]) { + default: + break; + case '_': + if (strcmp("required", s + 8) == 0) + return PIDX_DRBG_PARAM_ENTROPY_REQUIRED; + break; + case '\0': + return PIDX_KDF_PARAM_HMACDRBG_ENTROPY; + } + } + } + } + } + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_E; + break; + case 'x': + if (strcmp("pect", s + 2) == 0) + return PIDX_STORE_PARAM_EXPECT; + } + break; + case 'f': + switch(s[1]) { + default: + break; + case 'i': + switch(s[2]) { + default: + break; + case 'e': + if (strcmp("ld-type", s + 3) == 0) + return PIDX_PKEY_PARAM_EC_FIELD_TYPE; + break; + case 'n': + if (strcmp("gerprint", s + 3) == 0) + return PIDX_STORE_PARAM_FINGERPRINT; + break; + case 'p': + if (strcmp("s-indicator", s + 3) == 0) + return PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR; + } + } + break; + case 'g': + switch(s[1]) { + default: + break; + case 'e': + switch(s[2]) { + default: + break; + case 'n': + switch(s[3]) { + default: + break; + case 'e': + switch(s[4]) { + default: + break; + case 'r': + switch(s[5]) { + default: + break; + case 'a': + switch(s[6]) { + default: + break; + case 't': + switch(s[7]) { + default: + break; + case 'e': + switch(s[8]) { + default: + break; + case '\0': + return PIDX_RAND_PARAM_GENERATE; + } + break; + case 'o': + if (strcmp("r", s + 8) == 0) + return PIDX_PKEY_PARAM_EC_GENERATOR; + } + } + } + } + } + } + break; + case 'i': + if (strcmp("ndex", s + 2) == 0) + return PIDX_PKEY_PARAM_FFC_GINDEX; + break; + case 'r': + switch(s[2]) { + default: + break; + case 'o': + switch(s[3]) { + default: + break; + case 'u': + switch(s[4]) { + default: + break; + case 'p': + switch(s[5]) { + default: + break; + case '-': + if (strcmp("check", s + 6) == 0) + return PIDX_PKEY_PARAM_EC_GROUP_CHECK_TYPE; + break; + case '\0': + return PIDX_PKEY_PARAM_GROUP_NAME; + } + } + } + } + break; + case '\0': + return PIDX_PKEY_PARAM_FFC_G; + } + break; + case 'h': + switch(s[1]) { + default: + break; + case 'a': + if (strcmp("s-randkey", s + 2) == 0) + return PIDX_CIPHER_PARAM_HAS_RAND_KEY; + break; + case 'i': + if (strcmp("ndex", s + 2) == 0) + return PIDX_PKEY_PARAM_FFC_H; + break; + case 'k': + switch(s[2]) { + default: + break; + case 'd': + switch(s[3]) { + default: + break; + case 'f': + switch(s[4]) { + default: + break; + case '-': + switch(s[5]) { + default: + break; + case 'd': + if (strcmp("igest-check", s + 6) == 0) + return PIDX_PROV_PARAM_HKDF_DIGEST_CHECK; + break; + case 'k': + if (strcmp("ey-check", s + 6) == 0) + return PIDX_PROV_PARAM_HKDF_KEY_CHECK; + } + } + } + } + break; + case 'm': + if (strcmp("ac-key-check", s + 2) == 0) + return PIDX_PROV_PARAM_HMAC_KEY_CHECK; + break; + case 's': + if (strcmp("_padding", s + 2) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_HS_PADDING; + } + break; + case 'i': + switch(s[1]) { + default: + break; + case 'd': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_KDF_PARAM_PKCS12_ID; + } + break; + case 'k': + if (strcmp("me", s + 2) == 0) + return PIDX_KEM_PARAM_IKME; + break; + case 'm': + if (strcmp("plicit-rejection", s + 2) == 0) + return PIDX_PKEY_PARAM_IMPLICIT_REJECTION; + break; + case 'n': + switch(s[2]) { + default: + break; + case 'c': + if (strcmp("lude-public", s + 3) == 0) + return PIDX_PKEY_PARAM_EC_INCLUDE_PUBLIC; + break; + case 'f': + if (strcmp("o", s + 3) == 0) + return PIDX_PASSPHRASE_PARAM_INFO; + break; + case 'p': + if (strcmp("ut-type", s + 3) == 0) + return PIDX_STORE_PARAM_INPUT_TYPE; + break; + case 's': + if (strcmp("tance", s + 3) == 0) + return PIDX_SIGNATURE_PARAM_INSTANCE; + } + break; + case 't': + switch(s[2]) { + default: + break; + case 'e': + switch(s[3]) { + default: + break; + case 'r': + switch(s[4]) { + default: + break; + case 'a': + if (strcmp("tion", s + 5) == 0) + return PIDX_GEN_PARAM_ITERATION; + break; + case '\0': + return PIDX_KDF_PARAM_ITER; + } + } + } + break; + case 'v': + switch(s[2]) { + default: + break; + case '-': + if (strcmp("generated", s + 3) == 0) + return PIDX_CIPHER_PARAM_AEAD_IV_GENERATED; + break; + case 'l': + if (strcmp("en", s + 3) == 0) + return PIDX_CIPHER_PARAM_IVLEN; + break; + case '\0': + return PIDX_MAC_PARAM_IV; + } + } + break; + case 'j': + switch(s[1]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_FFC_COFACTOR; + } + break; + case 'k': + switch(s[1]) { + default: + break; + case '1': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_EC_CHAR2_PP_K1; + } + break; + case '2': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_EC_CHAR2_PP_K2; + } + break; + case '3': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_EC_CHAR2_PP_K3; + } + break; + case 'a': + if (strcmp("t", s + 2) == 0) + return PIDX_SIGNATURE_PARAM_KAT; + break; + case 'b': + if (strcmp("kdf-key-check", s + 2) == 0) + return PIDX_PROV_PARAM_KBKDF_KEY_CHECK; + break; + case 'd': + switch(s[2]) { + default: + break; + case 'f': + switch(s[3]) { + default: + break; + case '-': + switch(s[4]) { + default: + break; + case 'd': + switch(s[5]) { + default: + break; + case 'i': + switch(s[6]) { + default: + break; + case 'g': + switch(s[7]) { + default: + break; + case 'e': + switch(s[8]) { + default: + break; + case 's': + switch(s[9]) { + default: + break; + case 't': + switch(s[10]) { + default: + break; + case '-': + if (strcmp("props", s + 11) == 0) + return PIDX_EXCHANGE_PARAM_KDF_DIGEST_PROPS; + break; + case '\0': + return PIDX_EXCHANGE_PARAM_KDF_DIGEST; + } + } + } + } + } + } + break; + case 'o': + if (strcmp("utlen", s + 5) == 0) + return PIDX_EXCHANGE_PARAM_KDF_OUTLEN; + break; + case 't': + if (strcmp("ype", s + 5) == 0) + return PIDX_EXCHANGE_PARAM_KDF_TYPE; + break; + case 'u': + if (strcmp("km", s + 5) == 0) + return PIDX_EXCHANGE_PARAM_KDF_UKM; + } + } + } + break; + case 'e': + switch(s[2]) { + default: + break; + case 'y': + switch(s[3]) { + default: + break; + case '-': + switch(s[4]) { + default: + break; + case 'c': + if (strcmp("heck", s + 5) == 0) + return PIDX_PKEY_PARAM_FIPS_KEY_CHECK; + break; + case 'l': + if (strcmp("ength", s + 5) == 0) + return PIDX_SKEY_PARAM_KEY_LENGTH; + } + break; + case 'b': + if (strcmp("its", s + 4) == 0) + return PIDX_CIPHER_PARAM_RC2_KEYBITS; + break; + case 'l': + if (strcmp("en", s + 4) == 0) + return PIDX_CIPHER_PARAM_KEYLEN; + break; + case '\0': + return PIDX_MAC_PARAM_KEY; + } + } + break; + case 'm': + if (strcmp("ac-key-check", s + 2) == 0) + return PIDX_PROV_PARAM_KMAC_KEY_CHECK; + } + break; + case 'l': + switch(s[1]) { + default: + break; + case 'a': + switch(s[2]) { + default: + break; + case 'b': + if (strcmp("el", s + 3) == 0) + return PIDX_KDF_PARAM_LABEL; + break; + case 'n': + if (strcmp("es", s + 3) == 0) + return PIDX_KDF_PARAM_ARGON2_LANES; + } + } + break; + case 'm': + switch(s[1]) { + default: + break; + case 'a': + switch(s[2]) { + default: + break; + case 'c': + switch(s[3]) { + default: + break; + case 'k': + if (strcmp("ey", s + 4) == 0) + return PIDX_CIPHER_PARAM_AEAD_MAC_KEY; + break; + case 'l': + if (strcmp("en", s + 4) == 0) + return PIDX_KDF_PARAM_MAC_SIZE; + break; + case '\0': + return PIDX_ALG_PARAM_MAC; + } + break; + case 'n': + if (strcmp("datory-digest", s + 3) == 0) + return PIDX_PKEY_PARAM_MANDATORY_DIGEST; + break; + case 'x': + switch(s[3]) { + default: + break; + case '-': + if (strcmp("size", s + 4) == 0) + return PIDX_PKEY_PARAM_MAX_SIZE; + break; + case '_': + switch(s[4]) { + default: + break; + case 'a': + if (strcmp("dinlen", s + 5) == 0) + return PIDX_DRBG_PARAM_MAX_ADINLEN; + break; + case 'e': + switch(s[5]) { + default: + break; + case 'a': + if (strcmp("rly_data", s + 6) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_EARLY_DATA; + break; + case 'n': + if (strcmp("tropylen", s + 6) == 0) + return PIDX_DRBG_PARAM_MAX_ENTROPYLEN; + } + break; + case 'f': + if (strcmp("rag_len", s + 5) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_FRAG_LEN; + break; + case 'n': + if (strcmp("oncelen", s + 5) == 0) + return PIDX_DRBG_PARAM_MAX_NONCELEN; + break; + case 'p': + if (strcmp("erslen", s + 5) == 0) + return PIDX_DRBG_PARAM_MAX_PERSLEN; + break; + case 'r': + if (strcmp("equest", s + 5) == 0) + return PIDX_RAND_PARAM_MAX_REQUEST; + } + break; + case 'i': + if (strcmp("um_length", s + 4) == 0) + return PIDX_DRBG_PARAM_MAX_LENGTH; + break; + case 'm': + if (strcmp("em_bytes", s + 4) == 0) + return PIDX_KDF_PARAM_SCRYPT_MAXMEM; + } + } + break; + case 'e': + switch(s[2]) { + default: + break; + case 'm': + if (strcmp("cost", s + 3) == 0) + return PIDX_KDF_PARAM_ARGON2_MEMCOST; + break; + case 's': + if (strcmp("sage-encoding", s + 3) == 0) + return PIDX_SIGNATURE_PARAM_MESSAGE_ENCODING; + } + break; + case 'g': + switch(s[2]) { + default: + break; + case 'f': + switch(s[3]) { + default: + break; + case '1': + switch(s[4]) { + default: + break; + case '-': + switch(s[5]) { + default: + break; + case 'd': + if (strcmp("igest", s + 6) == 0) + return PIDX_PKEY_PARAM_MGF1_DIGEST; + break; + case 'p': + if (strcmp("roperties", s + 6) == 0) + return PIDX_PKEY_PARAM_MGF1_PROPERTIES; + } + } + break; + case '\0': + return PIDX_PKEY_PARAM_MASKGENFUNC; + } + } + break; + case 'i': + switch(s[2]) { + default: + break; + case 'c': + if (strcmp("alg", s + 3) == 0) + return PIDX_DIGEST_PARAM_MICALG; + break; + case 'n': + switch(s[3]) { + default: + break; + case '_': + switch(s[4]) { + default: + break; + case 'e': + if (strcmp("ntropylen", s + 5) == 0) + return PIDX_DRBG_PARAM_MIN_ENTROPYLEN; + break; + case 'n': + if (strcmp("oncelen", s + 5) == 0) + return PIDX_DRBG_PARAM_MIN_NONCELEN; + } + break; + case 'i': + if (strcmp("um_length", s + 4) == 0) + return PIDX_DRBG_PARAM_MIN_LENGTH; + } + } + break; + case 'l': + switch(s[2]) { + default: + break; + case '-': + switch(s[3]) { + default: + break; + case 'd': + switch(s[4]) { + default: + break; + case 's': + switch(s[5]) { + default: + break; + case 'a': + switch(s[6]) { + default: + break; + case '.': + switch(s[7]) { + default: + break; + case 'i': + if (strcmp("nput_formats", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_DSA_INPUT_FORMATS; + break; + case 'o': + if (strcmp("utput_formats", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_DSA_OUTPUT_FORMATS; + break; + case 'p': + if (strcmp("refer_seed", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_DSA_PREFER_SEED; + break; + case 'r': + if (strcmp("etain_seed", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_DSA_RETAIN_SEED; + } + } + } + } + break; + case 'k': + switch(s[4]) { + default: + break; + case 'e': + switch(s[5]) { + default: + break; + case 'm': + switch(s[6]) { + default: + break; + case '.': + switch(s[7]) { + default: + break; + case 'i': + switch(s[8]) { + default: + break; + case 'm': + if (strcmp("port_pct_type", s + 9) == 0) + return PIDX_PKEY_PARAM_ML_KEM_IMPORT_PCT_TYPE; + break; + case 'n': + if (strcmp("put_formats", s + 9) == 0) + return PIDX_PKEY_PARAM_ML_KEM_INPUT_FORMATS; + } + break; + case 'o': + if (strcmp("utput_formats", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_KEM_OUTPUT_FORMATS; + break; + case 'p': + if (strcmp("refer_seed", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_KEM_PREFER_SEED; + break; + case 'r': + if (strcmp("etain_seed", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_KEM_RETAIN_SEED; + } + } + } + } + } + } + break; + case 'o': + switch(s[2]) { + default: + break; + case 'd': + switch(s[3]) { + default: + break; + case 'e': + switch(s[4]) { + default: + break; + case '\0': + return PIDX_LIBSSL_RECORD_LAYER_PARAM_MODE; + } + break; + case 'u': + if (strcmp("le-filename", s + 4) == 0) + return PIDX_PROV_PARAM_CORE_MODULE_FILENAME; + } + } + break; + case 'u': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_SIGNATURE_PARAM_MU; + } + break; + case '\0': + return PIDX_PKEY_PARAM_EC_CHAR2_M; + } + break; + case 'n': + switch(s[1]) { + default: + break; + case 'a': + if (strcmp("me", s + 2) == 0) + return PIDX_STORE_PARAM_ISSUER; + break; + case 'o': + switch(s[2]) { + default: + break; + case '-': + if (strcmp("short-mac", s + 3) == 0) + return PIDX_PROV_PARAM_NO_SHORT_MAC; + break; + case 'n': + switch(s[3]) { + default: + break; + case 'c': + switch(s[4]) { + default: + break; + case 'e': + switch(s[5]) { + default: + break; + case '-': + if (strcmp("type", s + 6) == 0) + return PIDX_SIGNATURE_PARAM_NONCE_TYPE; + break; + case '\0': + return PIDX_KDF_PARAM_HMACDRBG_NONCE; + } + } + } + } + break; + case 'u': + if (strcmp("m", s + 2) == 0) + return PIDX_CIPHER_PARAM_NUM; + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_N; + } + break; + case 'o': + switch(s[1]) { + default: + break; + case 'a': + if (strcmp("ep-label", s + 2) == 0) + return PIDX_ASYM_CIPHER_PARAM_OAEP_LABEL; + break; + case 'p': + switch(s[2]) { + default: + break; + case 'e': + switch(s[3]) { + default: + break; + case 'n': + if (strcmp("ssl-version", s + 4) == 0) + return PIDX_PROV_PARAM_CORE_VERSION; + break; + case 'r': + if (strcmp("ation", s + 4) == 0) + return PIDX_KEM_PARAM_OPERATION; + } + break; + case 't': + if (strcmp("ions", s + 3) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_OPTIONS; + } + break; + case 'r': + if (strcmp("der", s + 2) == 0) + return PIDX_PKEY_PARAM_EC_ORDER; + } + break; + case 'p': + switch(s[1]) { + default: + break; + case '1': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_P1; + } + break; + case '2': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_P2; + } + break; + case 'a': + switch(s[2]) { + default: + break; + case 'd': + switch(s[3]) { + default: + break; + case '-': + switch(s[4]) { + default: + break; + case 'm': + if (strcmp("ode", s + 5) == 0) + return PIDX_PKEY_PARAM_PAD_MODE; + break; + case 't': + if (strcmp("ype", s + 5) == 0) + return PIDX_DIGEST_PARAM_PAD_TYPE; + } + break; + case 'd': + if (strcmp("ing", s + 4) == 0) + return PIDX_CIPHER_PARAM_PADDING; + break; + case '\0': + return PIDX_EXCHANGE_PARAM_PAD; + } + break; + case 'r': + switch(s[3]) { + default: + break; + case 't': + switch(s[4]) { + default: + break; + case 'y': + switch(s[5]) { + default: + break; + case 'u': + if (strcmp("-info", s + 6) == 0) + return PIDX_KDF_PARAM_X942_PARTYUINFO; + break; + case 'v': + if (strcmp("-info", s + 6) == 0) + return PIDX_KDF_PARAM_X942_PARTYVINFO; + } + } + } + break; + case 's': + if (strcmp("s", s + 3) == 0) + return PIDX_KDF_PARAM_PASSWORD; + } + break; + case 'b': + switch(s[2]) { + default: + break; + case 'i': + if (strcmp("ts", s + 3) == 0) + return PIDX_PKEY_PARAM_FFC_PBITS; + break; + case 'k': + if (strcmp("df2-lower-bound-check", s + 3) == 0) + return PIDX_PROV_PARAM_PBKDF2_LOWER_BOUND_CHECK; + } + break; + case 'c': + if (strcmp("ounter", s + 2) == 0) + return PIDX_PKEY_PARAM_FFC_PCOUNTER; + break; + case 'i': + if (strcmp("peline-tag", s + 2) == 0) + return PIDX_CIPHER_PARAM_PIPELINE_AEAD_TAG; + break; + case 'k': + if (strcmp("cs5", s + 2) == 0) + return PIDX_KDF_PARAM_PKCS5; + break; + case 'o': + switch(s[2]) { + default: + break; + case 'i': + if (strcmp("nt-format", s + 3) == 0) + return PIDX_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT; + break; + case 't': + if (strcmp("ential", s + 3) == 0) + return PIDX_GEN_PARAM_POTENTIAL; + } + break; + case 'r': + switch(s[2]) { + default: + break; + case 'e': + switch(s[3]) { + default: + break; + case 'd': + if (strcmp("iction_resistance", s + 4) == 0) + return PIDX_DRBG_PARAM_PREDICTION_RESISTANCE; + break; + case 'f': + if (strcmp("ix", s + 4) == 0) + return PIDX_KDF_PARAM_PREFIX; + } + break; + case 'i': + switch(s[3]) { + default: + break; + case 'm': + if (strcmp("es", s + 4) == 0) + return PIDX_PKEY_PARAM_RSA_PRIMES; + break; + case 'v': + switch(s[4]) { + default: + break; + case '_': + if (strcmp("len", s + 5) == 0) + return PIDX_PKEY_PARAM_DH_PRIV_LEN; + break; + case '\0': + return PIDX_PKEY_PARAM_PRIV_KEY; + } + } + break; + case 'o': + switch(s[3]) { + default: + break; + case 'p': + if (strcmp("erties", s + 4) == 0) + return PIDX_STORE_PARAM_PROPERTIES; + break; + case 'v': + if (strcmp("ider-name", s + 4) == 0) + return PIDX_PROV_PARAM_CORE_PROV_NAME; + } + } + break; + case 'u': + if (strcmp("b", s + 2) == 0) + return PIDX_PKEY_PARAM_PUB_KEY; + break; + case '\0': + return PIDX_PKEY_PARAM_FFC_P; + } + break; + case 'q': + switch(s[1]) { + default: + break; + case '1': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_Q1; + } + break; + case '2': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_Q2; + } + break; + case 'b': + if (strcmp("its", s + 2) == 0) + return PIDX_PKEY_PARAM_FFC_QBITS; + break; + case '\0': + return PIDX_PKEY_PARAM_FFC_Q; + break; + case 'x': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_EC_PUB_X; + } + break; + case 'y': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_EC_PUB_Y; + } + } + break; + case 'r': + switch(s[1]) { + default: + break; + case 'a': + switch(s[2]) { + default: + break; + case 'n': + switch(s[3]) { + default: + break; + case 'd': + switch(s[4]) { + default: + break; + case 'k': + if (strcmp("ey", s + 5) == 0) + return PIDX_CIPHER_PARAM_RANDOM_KEY; + break; + case 'o': + if (strcmp("m_data", s + 5) == 0) + return PIDX_DRBG_PARAM_RANDOM_DATA; + } + } + break; + case 'w': + if (strcmp("-bytes", s + 3) == 0) + return PIDX_SKEY_PARAM_RAW_BYTES; + } + break; + case 'e': + switch(s[2]) { + default: + break; + case 'a': + switch(s[3]) { + default: + break; + case 'd': + switch(s[4]) { + default: + break; + case '_': + switch(s[5]) { + default: + break; + case 'a': + if (strcmp("head", s + 6) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_READ_AHEAD; + break; + case 'b': + if (strcmp("uffer_len", s + 6) == 0) + return PIDX_LIBSSL_RECORD_LAYER_READ_BUFFER_LEN; + } + } + } + break; + case 'f': + if (strcmp("erence", s + 3) == 0) + return PIDX_OBJECT_PARAM_REFERENCE; + break; + case 's': + switch(s[3]) { + default: + break; + case 'e': + switch(s[4]) { + default: + break; + case 'e': + switch(s[5]) { + default: + break; + case 'd': + switch(s[6]) { + default: + break; + case '_': + switch(s[7]) { + default: + break; + case 'c': + if (strcmp("ounter", s + 8) == 0) + return PIDX_DRBG_PARAM_RESEED_COUNTER; + break; + case 'r': + if (strcmp("equests", s + 8) == 0) + return PIDX_DRBG_PARAM_RESEED_REQUESTS; + break; + case 't': + switch(s[8]) { + default: + break; + case 'i': + switch(s[9]) { + default: + break; + case 'm': + switch(s[10]) { + default: + break; + case 'e': + switch(s[11]) { + default: + break; + case '_': + if (strcmp("interval", s + 12) == 0) + return PIDX_DRBG_PARAM_RESEED_TIME_INTERVAL; + break; + case '\0': + return PIDX_DRBG_PARAM_RESEED_TIME; + } + } + } + } + } + } + } + } + } + } + break; + case 'o': + if (strcmp("unds", s + 2) == 0) + return PIDX_CIPHER_PARAM_ROUNDS; + break; + case 's': + switch(s[2]) { + default: + break; + case 'a': + switch(s[3]) { + default: + break; + case '-': + switch(s[4]) { + default: + break; + case 'c': + switch(s[5]) { + default: + break; + case 'o': + switch(s[6]) { + default: + break; + case 'e': + switch(s[7]) { + default: + break; + case 'f': + switch(s[8]) { + default: + break; + case 'f': + switch(s[9]) { + default: + break; + case 'i': + switch(s[10]) { + default: + break; + case 'c': + switch(s[11]) { + default: + break; + case 'i': + switch(s[12]) { + default: + break; + case 'e': + switch(s[13]) { + default: + break; + case 'n': + switch(s[14]) { + default: + break; + case 't': + switch(s[15]) { + default: + break; + case '1': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT1; + } + break; + case '2': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT2; + } + break; + case '3': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT3; + } + break; + case '4': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT4; + } + break; + case '5': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT5; + } + break; + case '6': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT6; + } + break; + case '7': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT7; + } + break; + case '8': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT8; + } + break; + case '9': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT9; + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT; + } + } + } + } + } + } + } + } + } + } + } + break; + case 'd': + if (strcmp("erive-from-pq", s + 5) == 0) + return PIDX_PKEY_PARAM_RSA_DERIVE_FROM_PQ; + break; + case 'e': + switch(s[5]) { + default: + break; + case 'x': + switch(s[6]) { + default: + break; + case 'p': + switch(s[7]) { + default: + break; + case 'o': + switch(s[8]) { + default: + break; + case 'n': + switch(s[9]) { + default: + break; + case 'e': + switch(s[10]) { + default: + break; + case 'n': + switch(s[11]) { + default: + break; + case 't': + switch(s[12]) { + default: + break; + case '1': + switch(s[13]) { + default: + break; + case '0': + switch(s[14]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT10; + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT1; + } + break; + case '2': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT2; + } + break; + case '3': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT3; + } + break; + case '4': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT4; + } + break; + case '5': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT5; + } + break; + case '6': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT6; + } + break; + case '7': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT7; + } + break; + case '8': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT8; + } + break; + case '9': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT9; + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT; + } + } + } + } + } + } + } + } + break; + case 'f': + switch(s[5]) { + default: + break; + case 'a': + switch(s[6]) { + default: + break; + case 'c': + switch(s[7]) { + default: + break; + case 't': + switch(s[8]) { + default: + break; + case 'o': + switch(s[9]) { + default: + break; + case 'r': + switch(s[10]) { + default: + break; + case '1': + switch(s[11]) { + default: + break; + case '0': + switch(s[12]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR10; + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR1; + } + break; + case '2': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR2; + } + break; + case '3': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR3; + } + break; + case '4': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR4; + } + break; + case '5': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR5; + } + break; + case '6': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR6; + } + break; + case '7': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR7; + } + break; + case '8': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR8; + } + break; + case '9': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR9; + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR; + } + } + } + } + } + } + break; + case 'p': + switch(s[5]) { + default: + break; + case 'k': + if (strcmp("cs15-pad-disabled", s + 6) == 0) + return PIDX_PROV_PARAM_RSA_PKCS15_PAD_DISABLED; + break; + case 's': + if (strcmp("s-saltlen-check", s + 6) == 0) + return PIDX_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK; + } + break; + case 's': + if (strcmp("ign-x931-pad-disabled", s + 5) == 0) + return PIDX_PROV_PARAM_RSA_SIGN_X931_PAD_DISABLED; + } + } + } + break; + case '\0': + return PIDX_KDF_PARAM_SCRYPT_R; + } + break; + case 's': + switch(s[1]) { + default: + break; + case 'a': + switch(s[2]) { + default: + break; + case 'f': + if (strcmp("eprime-generator", s + 3) == 0) + return PIDX_PKEY_PARAM_DH_GENERATOR; + break; + case 'l': + switch(s[3]) { + default: + break; + case 't': + switch(s[4]) { + default: + break; + case 'l': + if (strcmp("en", s + 5) == 0) + return PIDX_SIGNATURE_PARAM_PSS_SALTLEN; + break; + case '\0': + return PIDX_MAC_PARAM_SALT; + } + } + break; + case 'v': + if (strcmp("e-parameters", s + 3) == 0) + return PIDX_ENCODER_PARAM_SAVE_PARAMETERS; + } + break; + case 'e': + switch(s[2]) { + default: + break; + case 'c': + switch(s[3]) { + default: + break; + case 'r': + if (strcmp("et", s + 4) == 0) + return PIDX_KDF_PARAM_SECRET; + break; + case 'u': + switch(s[4]) { + default: + break; + case 'r': + switch(s[5]) { + default: + break; + case 'i': + switch(s[6]) { + default: + break; + case 't': + switch(s[7]) { + default: + break; + case 'y': + switch(s[8]) { + default: + break; + case '-': + switch(s[9]) { + default: + break; + case 'b': + if (strcmp("its", s + 10) == 0) + return PIDX_PKEY_PARAM_SECURITY_BITS; + break; + case 'c': + if (strcmp("hecks", s + 10) == 0) + return PIDX_PROV_PARAM_SECURITY_CHECKS; + } + } + } + } + } + } + } + break; + case 'e': + if (strcmp("d", s + 3) == 0) + return PIDX_PKEY_PARAM_SLH_DSA_SEED; + break; + case 'r': + if (strcmp("ial", s + 3) == 0) + return PIDX_STORE_PARAM_SERIAL; + break; + case 's': + if (strcmp("sion_id", s + 3) == 0) + return PIDX_KDF_PARAM_SSHKDF_SESSION_ID; + } + break; + case 'i': + switch(s[2]) { + default: + break; + case 'g': + switch(s[3]) { + default: + break; + case 'n': + switch(s[4]) { + default: + break; + case '-': + switch(s[5]) { + default: + break; + case 'c': + if (strcmp("heck", s + 6) == 0) + return PIDX_PKEY_PARAM_FIPS_SIGN_CHECK; + break; + case 'x': + if (strcmp("931-pad-check", s + 6) == 0) + return PIDX_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK; + } + break; + case 'a': + switch(s[5]) { + default: + break; + case 't': + switch(s[6]) { + default: + break; + case 'u': + switch(s[7]) { + default: + break; + case 'r': + switch(s[8]) { + default: + break; + case 'e': + switch(s[9]) { + default: + break; + case '-': + if (strcmp("digest-check", s + 10) == 0) + return PIDX_PROV_PARAM_SIGNATURE_DIGEST_CHECK; + break; + case '\0': + return PIDX_SIGNATURE_PARAM_SIGNATURE; + } + } + } + } + } + } + } + break; + case 'z': + if (strcmp("e", s + 3) == 0) + return PIDX_MAC_PARAM_SIZE; + } + break; + case 'p': + if (strcmp("eed", s + 2) == 0) + return PIDX_CIPHER_PARAM_SPEED; + break; + case 's': + switch(s[2]) { + default: + break; + case 'h': + switch(s[3]) { + default: + break; + case 'k': + switch(s[4]) { + default: + break; + case 'd': + switch(s[5]) { + default: + break; + case 'f': + switch(s[6]) { + default: + break; + case '-': + switch(s[7]) { + default: + break; + case 'd': + if (strcmp("igest-check", s + 8) == 0) + return PIDX_PROV_PARAM_SSHKDF_DIGEST_CHECK; + break; + case 'k': + if (strcmp("ey-check", s + 8) == 0) + return PIDX_PROV_PARAM_SSHKDF_KEY_CHECK; + } + } + } + } + } + break; + case 'k': + switch(s[3]) { + default: + break; + case 'd': + switch(s[4]) { + default: + break; + case 'f': + switch(s[5]) { + default: + break; + case '-': + switch(s[6]) { + default: + break; + case 'd': + if (strcmp("igest-check", s + 7) == 0) + return PIDX_PROV_PARAM_SSKDF_DIGEST_CHECK; + break; + case 'k': + if (strcmp("ey-check", s + 7) == 0) + return PIDX_PROV_PARAM_SSKDF_KEY_CHECK; + } + } + } + } + break; + case 'l': + if (strcmp("3-ms", s + 3) == 0) + return PIDX_DIGEST_PARAM_SSL3_MS; + } + break; + case 't': + switch(s[2]) { + default: + break; + case '-': + switch(s[3]) { + default: + break; + case 'd': + if (strcmp("esc", s + 4) == 0) + return PIDX_PROV_PARAM_SELF_TEST_DESC; + break; + case 'p': + if (strcmp("hase", s + 4) == 0) + return PIDX_PROV_PARAM_SELF_TEST_PHASE; + break; + case 't': + if (strcmp("ype", s + 4) == 0) + return PIDX_PROV_PARAM_SELF_TEST_TYPE; + } + break; + case 'a': + switch(s[3]) { + default: + break; + case 't': + switch(s[4]) { + default: + break; + case 'e': + switch(s[5]) { + default: + break; + case '\0': + return PIDX_RAND_PARAM_STATE; + } + break; + case 'u': + if (strcmp("s", s + 5) == 0) + return PIDX_PROV_PARAM_STATUS; + } + } + break; + case 'r': + switch(s[3]) { + default: + break; + case 'e': + switch(s[4]) { + default: + break; + case 'a': + if (strcmp("m_mac", s + 5) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_STREAM_MAC; + break; + case 'n': + if (strcmp("gth", s + 5) == 0) + return PIDX_RAND_PARAM_STRENGTH; + } + } + } + break; + case 'u': + switch(s[2]) { + default: + break; + case 'b': + if (strcmp("ject", s + 3) == 0) + return PIDX_STORE_PARAM_SUBJECT; + break; + case 'p': + switch(s[3]) { + default: + break; + case 'p': + switch(s[4]) { + default: + break; + case '-': + switch(s[5]) { + default: + break; + case 'p': + switch(s[6]) { + default: + break; + case 'r': + if (strcmp("ivinfo", s + 7) == 0) + return PIDX_KDF_PARAM_X942_SUPP_PRIVINFO; + break; + case 'u': + if (strcmp("binfo", s + 7) == 0) + return PIDX_KDF_PARAM_X942_SUPP_PUBINFO; + } + } + } + } + } + } + break; + case 't': + switch(s[1]) { + default: + break; + case 'a': + switch(s[2]) { + default: + break; + case 'g': + switch(s[3]) { + default: + break; + case 'l': + if (strcmp("en", s + 4) == 0) + return PIDX_CIPHER_PARAM_AEAD_TAGLEN; + break; + case '\0': + return PIDX_CIPHER_PARAM_AEAD_TAG; + } + } + break; + case 'd': + if (strcmp("es-encrypt-disabled", s + 2) == 0) + return PIDX_PROV_PARAM_TDES_ENCRYPT_DISABLED; + break; + case 'e': + switch(s[2]) { + default: + break; + case 's': + switch(s[3]) { + default: + break; + case 't': + switch(s[4]) { + default: + break; + case '-': + if (strcmp("entropy", s + 5) == 0) + return PIDX_SIGNATURE_PARAM_TEST_ENTROPY; + break; + case '_': + switch(s[5]) { + default: + break; + case 'e': + if (strcmp("ntropy", s + 6) == 0) + return PIDX_RAND_PARAM_TEST_ENTROPY; + break; + case 'n': + if (strcmp("once", s + 6) == 0) + return PIDX_RAND_PARAM_TEST_NONCE; + } + } + } + } + break; + case 'h': + if (strcmp("reads", s + 2) == 0) + return PIDX_KDF_PARAM_THREADS; + break; + case 'l': + switch(s[2]) { + default: + break; + case 's': + switch(s[3]) { + default: + break; + case '-': + switch(s[4]) { + default: + break; + case 'c': + if (strcmp("lient-version", s + 5) == 0) + return PIDX_ASYM_CIPHER_PARAM_TLS_CLIENT_VERSION; + break; + case 'd': + if (strcmp("ata-size", s + 5) == 0) + return PIDX_MAC_PARAM_TLS_DATA_SIZE; + break; + case 'g': + switch(s[5]) { + default: + break; + case 'r': + switch(s[6]) { + default: + break; + case 'o': + switch(s[7]) { + default: + break; + case 'u': + switch(s[8]) { + default: + break; + case 'p': + switch(s[9]) { + default: + break; + case '-': + switch(s[10]) { + default: + break; + case 'a': + if (strcmp("lg", s + 11) == 0) + return PIDX_CAPABILITY_TLS_GROUP_ALG; + break; + case 'i': + switch(s[11]) { + default: + break; + case 'd': + switch(s[12]) { + default: + break; + case '\0': + return PIDX_CAPABILITY_TLS_GROUP_ID; + } + break; + case 's': + if (strcmp("-kem", s + 12) == 0) + return PIDX_CAPABILITY_TLS_GROUP_IS_KEM; + } + break; + case 'n': + switch(s[11]) { + default: + break; + case 'a': + switch(s[12]) { + default: + break; + case 'm': + switch(s[13]) { + default: + break; + case 'e': + switch(s[14]) { + default: + break; + case '-': + if (strcmp("internal", s + 15) == 0) + return PIDX_CAPABILITY_TLS_GROUP_NAME_INTERNAL; + break; + case '\0': + return PIDX_CAPABILITY_TLS_GROUP_NAME; + } + } + } + } + break; + case 's': + if (strcmp("ec-bits", s + 11) == 0) + return PIDX_CAPABILITY_TLS_GROUP_SECURITY_BITS; + } + } + } + } + } + } + break; + case 'm': + switch(s[5]) { + default: + break; + case 'a': + switch(s[6]) { + default: + break; + case 'c': + switch(s[7]) { + default: + break; + case '-': + if (strcmp("size", s + 8) == 0) + return PIDX_CIPHER_PARAM_TLS_MAC_SIZE; + break; + case '\0': + return PIDX_CIPHER_PARAM_TLS_MAC; + } + break; + case 'x': + switch(s[7]) { + default: + break; + case '-': + switch(s[8]) { + default: + break; + case 'd': + if (strcmp("tls", s + 9) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_MAX_DTLS; + break; + case 't': + if (strcmp("ls", s + 9) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_MAX_TLS; + } + } + } + break; + case 'i': + switch(s[6]) { + default: + break; + case 'n': + switch(s[7]) { + default: + break; + case '-': + switch(s[8]) { + default: + break; + case 'd': + if (strcmp("tls", s + 9) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_MIN_DTLS; + break; + case 't': + if (strcmp("ls", s + 9) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_MIN_TLS; + } + } + } + break; + case 'u': + if (strcmp("lti", s + 6) == 0) + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK; + } + break; + case 'n': + if (strcmp("egotiated-version", s + 5) == 0) + return PIDX_ASYM_CIPHER_PARAM_TLS_NEGOTIATED_VERSION; + break; + case 's': + switch(s[5]) { + default: + break; + case 'i': + switch(s[6]) { + default: + break; + case 'g': + switch(s[7]) { + default: + break; + case 'a': + switch(s[8]) { + default: + break; + case 'l': + switch(s[9]) { + default: + break; + case 'g': + switch(s[10]) { + default: + break; + case '-': + switch(s[11]) { + default: + break; + case 'c': + if (strcmp("ode-point", s + 12) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_CODE_POINT; + break; + case 'h': + switch(s[12]) { + default: + break; + case 'a': + switch(s[13]) { + default: + break; + case 's': + switch(s[14]) { + default: + break; + case 'h': + switch(s[15]) { + default: + break; + case '-': + switch(s[16]) { + default: + break; + case 'n': + if (strcmp("ame", s + 17) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_HASH_NAME; + break; + case 'o': + if (strcmp("id", s + 17) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_HASH_OID; + } + } + } + } + } + break; + case 'i': + if (strcmp("ana-name", s + 12) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_IANA_NAME; + break; + case 'k': + switch(s[12]) { + default: + break; + case 'e': + switch(s[13]) { + default: + break; + case 'y': + switch(s[14]) { + default: + break; + case 't': + switch(s[15]) { + default: + break; + case 'y': + switch(s[16]) { + default: + break; + case 'p': + switch(s[17]) { + default: + break; + case 'e': + switch(s[18]) { + default: + break; + case '-': + if (strcmp("oid", s + 19) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_KEYTYPE_OID; + break; + case '\0': + return PIDX_CAPABILITY_TLS_SIGALG_KEYTYPE; + } + } + } + } + } + } + } + break; + case 'n': + if (strcmp("ame", s + 12) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_NAME; + break; + case 'o': + if (strcmp("id", s + 12) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_OID; + break; + case 's': + switch(s[12]) { + default: + break; + case 'e': + if (strcmp("c-bits", s + 13) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_SECURITY_BITS; + break; + case 'i': + switch(s[13]) { + default: + break; + case 'g': + switch(s[14]) { + default: + break; + case '-': + switch(s[15]) { + default: + break; + case 'n': + if (strcmp("ame", s + 16) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_SIG_NAME; + break; + case 'o': + if (strcmp("id", s + 16) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_SIG_OID; + } + } + } + } + } + } + } + } + } + } + } + break; + case 'v': + if (strcmp("ersion", s + 5) == 0) + return PIDX_CIPHER_PARAM_TLS_VERSION; + } + break; + case '1': + switch(s[4]) { + default: + break; + case '-': + switch(s[5]) { + default: + break; + case 'p': + switch(s[6]) { + default: + break; + case 'r': + switch(s[7]) { + default: + break; + case 'f': + switch(s[8]) { + default: + break; + case '-': + switch(s[9]) { + default: + break; + case 'd': + if (strcmp("igest-check", s + 10) == 0) + return PIDX_PROV_PARAM_TLS1_PRF_DIGEST_CHECK; + break; + case 'e': + if (strcmp("ms-check", s + 10) == 0) + return PIDX_PROV_PARAM_TLS1_PRF_EMS_CHECK; + break; + case 'k': + if (strcmp("ey-check", s + 10) == 0) + return PIDX_PROV_PARAM_TLS1_PRF_KEY_CHECK; + } + } + } + } + } + break; + case '3': + switch(s[5]) { + default: + break; + case '-': + switch(s[6]) { + default: + break; + case 'k': + switch(s[7]) { + default: + break; + case 'd': + switch(s[8]) { + default: + break; + case 'f': + switch(s[9]) { + default: + break; + case '-': + switch(s[10]) { + default: + break; + case 'd': + if (strcmp("igest-check", s + 11) == 0) + return PIDX_PROV_PARAM_TLS13_KDF_DIGEST_CHECK; + break; + case 'k': + if (strcmp("ey-check", s + 11) == 0) + return PIDX_PROV_PARAM_TLS13_KDF_KEY_CHECK; + } + } + } + } + } + } + break; + case 'm': + switch(s[5]) { + default: + break; + case 'u': + switch(s[6]) { + default: + break; + case 'l': + switch(s[7]) { + default: + break; + case 't': + switch(s[8]) { + default: + break; + case 'i': + switch(s[9]) { + default: + break; + case '_': + switch(s[10]) { + default: + break; + case 'a': + switch(s[11]) { + default: + break; + case 'a': + switch(s[12]) { + default: + break; + case 'd': + switch(s[13]) { + default: + break; + case 'p': + if (strcmp("acklen", s + 14) == 0) + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD_PACKLEN; + break; + case '\0': + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD; + } + } + } + break; + case 'e': + switch(s[11]) { + default: + break; + case 'n': + switch(s[12]) { + default: + break; + case 'c': + switch(s[13]) { + default: + break; + case 'i': + if (strcmp("n", s + 14) == 0) + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_IN; + break; + case 'l': + if (strcmp("en", s + 14) == 0) + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_LEN; + break; + case '\0': + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC; + } + } + } + break; + case 'i': + if (strcmp("nterleave", s + 11) == 0) + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE; + break; + case 'm': + switch(s[11]) { + default: + break; + case 'a': + switch(s[12]) { + default: + break; + case 'x': + switch(s[13]) { + default: + break; + case 'b': + if (strcmp("ufsz", s + 14) == 0) + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_BUFSIZE; + break; + case 's': + if (strcmp("ndfrag", s + 14) == 0) + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_SEND_FRAGMENT; + } + } + } + } + } + } + } + } + } + } + break; + case 'a': + switch(s[4]) { + default: + break; + case 'a': + switch(s[5]) { + default: + break; + case 'd': + switch(s[6]) { + default: + break; + case 'p': + if (strcmp("ad", s + 7) == 0) + return PIDX_CIPHER_PARAM_AEAD_TLS1_AAD_PAD; + break; + case '\0': + return PIDX_CIPHER_PARAM_AEAD_TLS1_AAD; + } + } + } + break; + case 'i': + switch(s[4]) { + default: + break; + case 'v': + switch(s[5]) { + default: + break; + case 'f': + if (strcmp("ixed", s + 6) == 0) + return PIDX_CIPHER_PARAM_AEAD_TLS1_IV_FIXED; + break; + case 'g': + if (strcmp("en", s + 6) == 0) + return PIDX_CIPHER_PARAM_AEAD_TLS1_GET_IV_GEN; + break; + case 'i': + if (strcmp("nv", s + 6) == 0) + return PIDX_CIPHER_PARAM_AEAD_TLS1_SET_IV_INV; + } + } + break; + case 't': + if (strcmp("ree", s + 4) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_TLSTREE; + } + } + break; + case 'p': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_EC_CHAR2_TP_BASIS; + } + break; + case 'y': + if (strcmp("pe", s + 2) == 0) + return PIDX_PKEY_PARAM_FFC_TYPE; + } + break; + case 'u': + switch(s[1]) { + default: + break; + case 'k': + if (strcmp("m", s + 2) == 0) + return PIDX_KDF_PARAM_UKM; + break; + case 'p': + if (strcmp("dated-iv", s + 2) == 0) + return PIDX_CIPHER_PARAM_UPDATED_IV; + break; + case 's': + switch(s[2]) { + default: + break; + case 'e': + switch(s[3]) { + default: + break; + case '-': + switch(s[4]) { + default: + break; + case 'b': + if (strcmp("its", s + 5) == 0) + return PIDX_CIPHER_PARAM_USE_BITS; + break; + case 'c': + if (strcmp("ofactor-flag", s + 5) == 0) + return PIDX_PKEY_PARAM_USE_COFACTOR_FLAG; + break; + case 'k': + if (strcmp("eybits", s + 5) == 0) + return PIDX_KDF_PARAM_X942_USE_KEYBITS; + break; + case 'l': + switch(s[5]) { + default: + break; + case '\0': + return PIDX_KDF_PARAM_KBKDF_USE_L; + } + break; + case 's': + if (strcmp("eparator", s + 5) == 0) + return PIDX_KDF_PARAM_KBKDF_USE_SEPARATOR; + } + break; + case '_': + switch(s[4]) { + default: + break; + case 'd': + if (strcmp("erivation_function", s + 5) == 0) + return PIDX_DRBG_PARAM_USE_DF; + break; + case 'e': + if (strcmp("tm", s + 5) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_USE_ETM; + } + } + } + } + break; + case 'v': + switch(s[1]) { + default: + break; + case 'a': + switch(s[2]) { + default: + break; + case 'l': + switch(s[3]) { + default: + break; + case 'i': + switch(s[4]) { + default: + break; + case 'd': + switch(s[5]) { + default: + break; + case 'a': + switch(s[6]) { + default: + break; + case 't': + switch(s[7]) { + default: + break; + case 'e': + switch(s[8]) { + default: + break; + case '-': + switch(s[9]) { + default: + break; + case 'g': + switch(s[10]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_FFC_VALIDATE_G; + } + break; + case 'l': + if (strcmp("egacy", s + 10) == 0) + return PIDX_PKEY_PARAM_FFC_VALIDATE_LEGACY; + break; + case 'p': + if (strcmp("q", s + 10) == 0) + return PIDX_PKEY_PARAM_FFC_VALIDATE_PQ; + } + } + } + } + } + } + } + } + break; + case 'e': + switch(s[2]) { + default: + break; + case 'r': + switch(s[3]) { + default: + break; + case 'i': + if (strcmp("fy-message", s + 4) == 0) + return PIDX_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE; + break; + case 's': + if (strcmp("ion", s + 4) == 0) + return PIDX_PROV_PARAM_VERSION; + } + } + } + break; + case 'x': + switch(s[1]) { + default: + break; + case '9': + switch(s[2]) { + default: + break; + case '4': + if (strcmp("2kdf-key-check", s + 3) == 0) + return PIDX_PROV_PARAM_X942KDF_KEY_CHECK; + break; + case '6': + switch(s[3]) { + default: + break; + case '3': + switch(s[4]) { + default: + break; + case 'k': + switch(s[5]) { + default: + break; + case 'd': + switch(s[6]) { + default: + break; + case 'f': + switch(s[7]) { + default: + break; + case '-': + switch(s[8]) { + default: + break; + case 'd': + if (strcmp("igest-check", s + 9) == 0) + return PIDX_PROV_PARAM_X963KDF_DIGEST_CHECK; + break; + case 'k': + if (strcmp("ey-check", s + 9) == 0) + return PIDX_PROV_PARAM_X963KDF_KEY_CHECK; + } + } + } + } + } + } + } + break; + case 'c': + if (strcmp("ghash", s + 2) == 0) + return PIDX_KDF_PARAM_SSHKDF_XCGHASH; + break; + case 'o': + switch(s[2]) { + default: + break; + case 'f': + switch(s[3]) { + default: + break; + case 'l': + if (strcmp("en", s + 4) == 0) + return PIDX_DIGEST_PARAM_XOFLEN; + break; + case '\0': + return PIDX_MAC_PARAM_XOF; + } + } + break; + case 'p': + switch(s[2]) { + default: + break; + case '1': + switch(s[3]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_XP1; + } + break; + case '2': + switch(s[3]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_XP2; + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_XP; + } + break; + case 'q': + switch(s[2]) { + default: + break; + case '1': + switch(s[3]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_XQ1; + } + break; + case '2': + switch(s[3]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_XQ2; + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_XQ; + } + break; + case 't': + if (strcmp("s_standard", s + 2) == 0) + return PIDX_CIPHER_PARAM_XTS_STANDARD; + } + } + return -1; +} + +/* clang-format on */ +/* End of TRIE */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/riscv64cpuid.s b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/riscv64cpuid.s new file mode 100644 index 000000000000..cef02fbcf6d7 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/riscv64cpuid.s @@ -0,0 +1,71 @@ +################################################################################ +# int CRYPTO_memcmp(const void * in_a, const void * in_b, size_t len) +################################################################################ +.text +.balign 16 +.globl CRYPTO_memcmp +.type CRYPTO_memcmp,@function +CRYPTO_memcmp: + li t0,0 + beqz a2,2f # len == 0 +1: + lbu t1,0(a0) + lbu t2,0(a1) + addi a0,a0,1 + addi a1,a1,1 + addi a2,a2,-1 + xor t1,t1,t2 + or t0,t0,t1 + bgtz a2,1b +2: + mv a0,t0 + ret +################################################################################ +# void OPENSSL_cleanse(void *ptr, size_t len) +################################################################################ +.text +.balign 16 +.globl OPENSSL_cleanse +.type OPENSSL_cleanse,@function +OPENSSL_cleanse: + beqz a1,2f # len == 0, return + srli t0,a1,4 + bnez t0,3f # len > 15 + +1: # Store <= 15 individual bytes + sb x0,0(a0) + addi a0,a0,1 + addi a1,a1,-1 + bnez a1,1b +2: + ret + +3: # Store individual bytes until we are aligned + andi t0,a0,0x7 + beqz t0,4f + sb x0,0(a0) + addi a0,a0,1 + addi a1,a1,-1 + j 3b + +4: # Store aligned dwords + li t1,8 +4: + sd x0,0(a0) + addi a0,a0,8 + addi a1,a1,-8 + bge a1,t1,4b # if len>=8 loop + bnez a1,1b # if len<8 and len != 0, store remaining bytes + ret +################################################################################ +# size_t riscv_vlen_asm(void) +# Return VLEN (i.e. the length of a vector register in bits). +.p2align 3 +.globl riscv_vlen_asm +.type riscv_vlen_asm,@function +riscv_vlen_asm: + # 0xc22 is CSR vlenb + csrr a0, 0xc22 + slli a0, a0, 3 + ret +.size riscv_vlen_asm,.-riscv_vlen_asm diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S new file mode 100644 index 000000000000..92ea27ec9c44 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S @@ -0,0 +1,229 @@ +.text +.p2align 2 +.globl sha256_block_data_order_zvkb_zvknha_or_zvknhb +.type sha256_block_data_order_zvkb_zvknha_or_zvknhb,@function +sha256_block_data_order_zvkb_zvknha_or_zvknhb: + .word 3439489111 + + la a3, K256 # Load round constants K256 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + addi a3, a3, 16 + .word 34007047 + addi a3, a3, 16 + .word 34007175 + addi a3, a3, 16 + .word 34007303 + addi a3, a3, 16 + .word 34007431 + addi a3, a3, 16 + .word 34007559 + addi a3, a3, 16 + .word 34007687 + addi a3, a3, 16 + .word 34007815 + addi a3, a3, 16 + .word 34007943 + addi a3, a3, 16 + .word 34008071 + addi a3, a3, 16 + .word 34008199 + + + # H is stored as {a,b,c,d},{e,f,g,h}, but we need {f,e,b,a},{h,g,d,c} + # The dst vtype is e32m1 and the index vtype is e8mf4. + # We use index-load with the following index pattern at v26. + # i8 index: + # 20, 16, 4, 0 + # Instead of setting the i8 index, we could use a single 32bit + # little-endian value to cover the 4xi8 index. + # i32 value: + # 0x 00 04 10 14 + li t4, 0x00041014 + .word 3439390807 + .word 1578028375 + + addi t3, a0, 8 + + # Use index-load to get {f,e,b,a},{h,g,d,c} + .word 3439489111 + .word 128254727 + .word 128844679 + + # Setup v0 mask for the vmerge to replace the first word (idx==0) in key-scheduling. + # The AVL is 4 in SHA, so we could use a single e8(8 element masking) for masking. + .word 3422613591 + .word 1577103447 + + .word 3439489111 + +L_round_loop: + # Decrement length by 1 + add a2, a2, -1 + + # Keep the current state as we need it later: H' = H+{a',b',c',...,h'}. + .word 1577258839 + .word 1577291735 + + # Load the 512-bits of the message block in v1-v4 and perform + # an endian swap on each 4 bytes element. + .word 33939591 + .word 1242865879 + add a1, a1, 16 + .word 33939719 + .word 1243914583 + add a1, a1, 16 + .word 33939847 + .word 1244963287 + add a1, a1, 16 + .word 33939975 + .word 1246011991 + add a1, a1, 16 + + # Quad-round 0 (+0, Wt from oldest to newest in v1->v2->v3->v4) + .word 44073687 + .word 3194135543 + .word 3128075127 + .word 1546715863 + .word 3058835703 # Generate W[19:16] + + # Quad-round 1 (+1, v2->v3->v4->v1) + .word 45155031 + .word 3194135543 + .word 3128075127 + .word 1547797207 + .word 3058737527 # Generate W[23:20] + + # Quad-round 2 (+2, v3->v4->v1->v2) + .word 46236375 + .word 3194135543 + .word 3128075127 + .word 1544684247 + .word 3058770423 # Generate W[27:24] + + # Quad-round 3 (+3, v4->v1->v2->v3) + .word 47317719 + .word 3194135543 + .word 3128075127 + .word 1545634519 + .word 3058803319 # Generate W[31:28] + + # Quad-round 4 (+0, v1->v2->v3->v4) + .word 48267991 + .word 3194135543 + .word 3128075127 + .word 1546715863 + .word 3058835703 # Generate W[35:32] + + # Quad-round 5 (+1, v2->v3->v4->v1) + .word 49349335 + .word 3194135543 + .word 3128075127 + .word 1547797207 + .word 3058737527 # Generate W[39:36] + + # Quad-round 6 (+2, v3->v4->v1->v2) + .word 50430679 + .word 3194135543 + .word 3128075127 + .word 1544684247 + .word 3058770423 # Generate W[43:40] + + # Quad-round 7 (+3, v4->v1->v2->v3) + .word 51512023 + .word 3194135543 + .word 3128075127 + .word 1545634519 + .word 3058803319 # Generate W[47:44] + + # Quad-round 8 (+0, v1->v2->v3->v4) + .word 52462295 + .word 3194135543 + .word 3128075127 + .word 1546715863 + .word 3058835703 # Generate W[51:48] + + # Quad-round 9 (+1, v2->v3->v4->v1) + .word 53543639 + .word 3194135543 + .word 3128075127 + .word 1547797207 + .word 3058737527 # Generate W[55:52] + + # Quad-round 10 (+2, v3->v4->v1->v2) + .word 54624983 + .word 3194135543 + .word 3128075127 + .word 1544684247 + .word 3058770423 # Generate W[59:56] + + # Quad-round 11 (+3, v4->v1->v2->v3) + .word 55706327 + .word 3194135543 + .word 3128075127 + .word 1545634519 + .word 3058803319 # Generate W[63:60] + + # Quad-round 12 (+0, v1->v2->v3->v4) + # Note that we stop generating new message schedule words (Wt, v1-13) + # as we already generated all the words we end up consuming (i.e., W[63:60]). + .word 56656599 + .word 3194135543 + .word 3128075127 + + # Quad-round 13 (+1, v2->v3->v4->v1) + .word 57737943 + .word 3194135543 + .word 3128075127 + + # Quad-round 14 (+2, v3->v4->v1->v2) + .word 58819287 + .word 3194135543 + .word 3128075127 + + # Quad-round 15 (+3, v4->v1->v2->v3) + .word 59900631 + .word 3194135543 + .word 3128075127 + + # H' = H+{a',b',c',...,h'} + .word 65209175 + .word 66290647 + bnez a2, L_round_loop + + # Store {f,e,b,a},{h,g,d,c} back to {a,b,c,d},{e,f,g,h}. + .word 128254759 + .word 128844711 + + ret +.size sha256_block_data_order_zvkb_zvknha_or_zvknhb,.-sha256_block_data_order_zvkb_zvknha_or_zvknhb + +.p2align 2 +.type K256,@object +K256: + .word 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5 + .word 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5 + .word 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3 + .word 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174 + .word 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc + .word 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da + .word 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7 + .word 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967 + .word 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13 + .word 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85 + .word 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3 + .word 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070 + .word 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5 + .word 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3 + .word 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208 + .word 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +.size K256,.-K256 diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/sha/sha512-riscv64-zvkb-zvknhb.S b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/sha/sha512-riscv64-zvkb-zvknhb.S new file mode 100644 index 000000000000..da1817a64af5 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/sha/sha512-riscv64-zvkb-zvknhb.S @@ -0,0 +1,184 @@ +.text +.p2align 2 +.globl sha512_block_data_order_zvkb_zvknhb +.type sha512_block_data_order_zvkb_zvknhb,@function +sha512_block_data_order_zvkb_zvknhb: + .word 3448926295 + + # H is stored as {a,b,c,d},{e,f,g,h}, but we need {f,e,b,a},{h,g,d,c} + # The dst vtype is e64m2 and the index vtype is e8mf4. + # We use index-load with the following index pattern at v1. + # i8 index: + # 40, 32, 8, 0 + # Instead of setting the i8 index, we could use a single 32bit + # little-endian value to cover the 4xi8 index. + # i32 value: + # 0x 00 08 20 28 + li t4, 0x00082028 + .word 3439390807 + .word 1578025175 + + addi t3, a0, 16 + + # Use index-load to get {f,e,b,a},{h,g,d,c} + .word 3448926295 + .word 102042375 + .word 102632455 + + # Setup v0 mask for the vmerge to replace the first word (idx==0) in key-scheduling. + # The AVL is 4 in SHA, so we could use a single e8(8 element masking) for masking. + .word 3422613591 + .word 1577103447 + + .word 3448926295 + +L_round_loop: + # Load round constants K512 + la a3, K512 + + # Decrement length by 1 + addi a2, a2, -1 + + # Keep the current state as we need it later: H' = H+{a',b',c',...,h'}. + .word 1577782615 + .word 1577848407 + + # Load the 1024-bits of the message block in v10-v16 and perform the endian + # swap. + .word 33944839 + .word 1252304215 + addi a1, a1, 32 + .word 33945095 + .word 1254401623 + addi a1, a1, 32 + .word 33945351 + .word 1256499031 + addi a1, a1, 32 + .word 33945607 + .word 1258596439 + addi a1, a1, 32 + + .rept 4 + # Quad-round 0 (+0, v10->v12->v14->v16) + .word 34011655 + addi a3, a3, 32 + .word 54856023 + .word 3211340919 + .word 3146328951 + .word 1558579543 + .word 3072861559 + + # Quad-round 1 (+1, v12->v14->v16->v10) + .word 34011655 + addi a3, a3, 32 + .word 54921559 + .word 3211340919 + .word 3146328951 + .word 1560742231 + .word 3072665207 + + # Quad-round 2 (+2, v14->v16->v10->v12) + .word 34011655 + addi a3, a3, 32 + .word 54987095 + .word 3211340919 + .word 3146328951 + .word 1554516311 + .word 3072730999 + + # Quad-round 3 (+3, v16->v10->v12->v14) + .word 34011655 + addi a3, a3, 32 + .word 55052631 + .word 3211340919 + .word 3146328951 + .word 1556416855 + .word 3072796791 + .endr + + # Quad-round 16 (+0, v10->v12->v14->v16) + # Note that we stop generating new message schedule words (Wt, v10-16) + # as we already generated all the words we end up consuming (i.e., W[79:76]). + .word 34011655 + addi a3, a3, 32 + .word 54856023 + .word 3211340919 + .word 3146328951 + + # Quad-round 17 (+1, v12->v14->v16->v10) + .word 34011655 + addi a3, a3, 32 + .word 54921559 + .word 3211340919 + .word 3146328951 + + # Quad-round 18 (+2, v14->v16->v10->v12) + .word 34011655 + addi a3, a3, 32 + .word 54987095 + .word 3211340919 + .word 3146328951 + + # Quad-round 19 (+3, v16->v10->v12->v14) + .word 34011655 + # No t1 increment needed. + .word 55052631 + .word 3211340919 + .word 3146328951 + + # H' = H+{a',b',c',...,h'} + .word 61541207 + .word 63704151 + bnez a2, L_round_loop + + # Store {f,e,b,a},{h,g,d,c} back to {a,b,c,d},{e,f,g,h}. + .word 102042407 + .word 102632487 + + ret +.size sha512_block_data_order_zvkb_zvknhb,.-sha512_block_data_order_zvkb_zvknhb + +.p2align 3 +.type K512,@object +K512: + .dword 0x428a2f98d728ae22, 0x7137449123ef65cd + .dword 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc + .dword 0x3956c25bf348b538, 0x59f111f1b605d019 + .dword 0x923f82a4af194f9b, 0xab1c5ed5da6d8118 + .dword 0xd807aa98a3030242, 0x12835b0145706fbe + .dword 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2 + .dword 0x72be5d74f27b896f, 0x80deb1fe3b1696b1 + .dword 0x9bdc06a725c71235, 0xc19bf174cf692694 + .dword 0xe49b69c19ef14ad2, 0xefbe4786384f25e3 + .dword 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65 + .dword 0x2de92c6f592b0275, 0x4a7484aa6ea6e483 + .dword 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5 + .dword 0x983e5152ee66dfab, 0xa831c66d2db43210 + .dword 0xb00327c898fb213f, 0xbf597fc7beef0ee4 + .dword 0xc6e00bf33da88fc2, 0xd5a79147930aa725 + .dword 0x06ca6351e003826f, 0x142929670a0e6e70 + .dword 0x27b70a8546d22ffc, 0x2e1b21385c26c926 + .dword 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df + .dword 0x650a73548baf63de, 0x766a0abb3c77b2a8 + .dword 0x81c2c92e47edaee6, 0x92722c851482353b + .dword 0xa2bfe8a14cf10364, 0xa81a664bbc423001 + .dword 0xc24b8b70d0f89791, 0xc76c51a30654be30 + .dword 0xd192e819d6ef5218, 0xd69906245565a910 + .dword 0xf40e35855771202a, 0x106aa07032bbd1b8 + .dword 0x19a4c116b8d2d0c8, 0x1e376c085141ab53 + .dword 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8 + .dword 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb + .dword 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3 + .dword 0x748f82ee5defb2fc, 0x78a5636f43172f60 + .dword 0x84c87814a1f0ab72, 0x8cc702081a6439ec + .dword 0x90befffa23631e28, 0xa4506cebde82bde9 + .dword 0xbef9a3f7b2c67915, 0xc67178f2e372532b + .dword 0xca273eceea26619c, 0xd186b8c721c0c207 + .dword 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178 + .dword 0x06f067aa72176fba, 0x0a637dc5a2c898a6 + .dword 0x113f9804bef90dae, 0x1b710b35131c471b + .dword 0x28db77f523047d84, 0x32caab7b40c72493 + .dword 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c + .dword 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a + .dword 0x5fcb6fab3ad6faec, 0x6c44198c4a475817 +.size K512,.-K512 diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/sm3/sm3-riscv64-zvksh.S b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/sm3/sm3-riscv64-zvksh.S new file mode 100644 index 000000000000..a5457b97439c --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/sm3/sm3-riscv64-zvksh.S @@ -0,0 +1,150 @@ +.text +.text +.p2align 3 +.globl ossl_hwsm3_block_data_order_zvksh +.type ossl_hwsm3_block_data_order_zvksh,@function +ossl_hwsm3_block_data_order_zvksh: + .word 3440668759 + + # Load initial state of hash context (c->A-H). + .word 33906695 + .word 1241817175 + +L_sm3_loop: + # Copy the previous state to v2. + # It will be XOR'ed with the current state at the end of the round. + .word 1577058647 + + # Load the 64B block in 2x32B chunks. + .word 33940231 # v6 := {w7, ..., w0} + addi a1, a1, 32 + + .word 33940487 # v8 := {w15, ..., w8} + addi a1, a1, 32 + + addi a2, a2, -1 + + # As vsm3c consumes only w0, w1, w4, w5 we need to slide the input + # 2 elements down so we process elements w2, w3, w6, w7 + # This will be repeated for each odd round. + .word 1046557271 # v4 := {X, X, w7, ..., w2} + + .word 2925535351 + .word 2923470967 + + # Prepare a vector with {w11, ..., w4} + .word 1044460119 # v4 := {X, X, X, X, w7, ..., w4} + .word 981611095 # v4 := {w11, w10, w9, w8, w7, w6, w5, w4} + + .word 2923503735 + .word 1044460119 # v4 := {X, X, w11, w10, w9, w8, w7, w6} + .word 2923536503 + + .word 2927763575 + .word 1048654423 # v4 := {X, X, w15, w14, w13, w12, w11, w10} + .word 2923602039 + + .word 2189632375 # v6 := {w23, w22, w21, w20, w19, w18, w17, w16} + + # Prepare a register with {w19, w18, w17, w16, w15, w14, w13, w12} + .word 1044460119 # v4 := {X, X, X, X, w15, w14, w13, w12} + .word 979513943 # v4 := {w19, w18, w17, w16, w15, w14, w13, w12} + + .word 2923634807 + .word 1044460119 # v4 := {X, X, w19, w18, w17, w16, w15, w14} + .word 2923667575 + + .word 2925797495 + .word 1046557271 # v4 := {X, X, w23, w22, w21, w20, w19, w18} + .word 2923733111 + + .word 2187601015 # v8 := {w31, w30, w29, w28, w27, w26, w25, w24} + + # Prepare a register with {w27, w26, w25, w24, w23, w22, w21, w20} + .word 1044460119 # v4 := {X, X, X, X, w23, w22, w21, w20} + .word 981611095 # v4 := {w27, w26, w25, w24, w23, w22, w21, w20} + + .word 2923765879 + .word 1044460119 # v4 := {X, X, w27, w26, w25, w24, w23, w22} + .word 2923798647 + + .word 2928025719 + .word 1048654423 # v4 := {x, X, w31, w30, w29, w28, w27, w26} + .word 2923864183 + + .word 2189632375 # v6 := {w32, w33, w34, w35, w36, w37, w38, w39} + + # Prepare a register with {w35, w34, w33, w32, w31, w30, w29, w28} + .word 1044460119 # v4 := {X, X, X, X, w31, w30, w29, w28} + .word 979513943 # v4 := {w35, w34, w33, w32, w31, w30, w29, w28} + + .word 2923896951 + .word 1044460119 # v4 := {X, X, w35, w34, w33, w32, w31, w30} + .word 2923929719 + + .word 2926059639 + .word 1046557271 # v4 := {X, X, w39, w38, w37, w36, w35, w34} + .word 2923995255 + + .word 2187601015 # v8 := {w47, w46, w45, w44, w43, w42, w41, w40} + + # Prepare a register with {w43, w42, w41, w40, w39, w38, w37, w36} + .word 1044460119 # v4 := {X, X, X, X, w39, w38, w37, w36} + .word 981611095 # v4 := {w43, w42, w41, w40, w39, w38, w37, w36} + + .word 2924028023 + .word 1044460119 # v4 := {X, X, w43, w42, w41, w40, w39, w38} + .word 2924060791 + + .word 2928287863 + .word 1048654423 # v4 := {X, X, w47, w46, w45, w44, w43, w42} + .word 2924126327 + + .word 2189632375 # v6 := {w55, w54, w53, w52, w51, w50, w49, w48} + + # Prepare a register with {w51, w50, w49, w48, w47, w46, w45, w44} + .word 1044460119 # v4 := {X, X, X, X, w47, w46, w45, w44} + .word 979513943 # v4 := {w51, w50, w49, w48, w47, w46, w45, w44} + + .word 2924159095 + .word 1044460119 # v4 := {X, X, w51, w50, w49, w48, w47, w46} + .word 2924191863 + + .word 2926321783 + .word 1046557271 # v4 := {X, X, w55, w54, w53, w52, w51, w50} + .word 2924257399 + + .word 2187601015 # v8 := {w63, w62, w61, w60, w59, w58, w57, w56} + + # Prepare a register with {w59, w58, w57, w56, w55, w54, w53, w52} + .word 1044460119 # v4 := {X, X, X, X, w55, w54, w53, w52} + .word 981611095 # v4 := {w59, w58, w57, w56, w55, w54, w53, w52} + + .word 2924290167 + .word 1044460119 # v4 := {X, X, w59, w58, w57, w56, w55, w54} + .word 2924322935 + + .word 2928550007 + .word 1048654423 # v4 := {X, X, w63, w62, w61, w60, w59, w58} + .word 2924388471 + + .word 2189632375 # v6 := {w71, w70, w69, w68, w67, w66, w65, w64} + + # Prepare a register with {w67, w66, w65, w64, w63, w62, w61, w60} + .word 1044460119 # v4 := {X, X, X, X, w63, w62, w61, w60} + .word 979513943 # v4 := {w67, w66, w65, w64, w63, w62, w61, w60} + + .word 2924421239 + .word 1044460119 # v4 := {X, X, w67, w66, w65, w64, w63, w62} + .word 2924454007 + + # XOR in the previous state. + .word 771817559 + + bnez a2, L_sm3_loop # Check if there are any more block to process +L_sm3_end: + .word 1241817175 + .word 33906727 + ret + +.size ossl_hwsm3_block_data_order_zvksh,.-ossl_hwsm3_block_data_order_zvksh diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/crypto/sm4/sm4-riscv64-zvksed.s b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/sm4/sm4-riscv64-zvksed.s new file mode 100644 index 000000000000..c353c27e1c06 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/crypto/sm4/sm4-riscv64-zvksed.s @@ -0,0 +1,188 @@ +.text +.p2align 3 +.globl rv64i_zvksed_sm4_set_encrypt_key +.type rv64i_zvksed_sm4_set_encrypt_key,@function +rv64i_zvksed_sm4_set_encrypt_key: + .word 0xc1027057 + + # Load the user key + .word 33906823 + .word 1242865879 + + # Load the FK. + la t0, FK + .word 33743111 + + # Generate round keys. + .word 772866263 + .word 2249204215 # rk[0:3] + .word 2251334263 # rk[4:7] + .word 2252415735 # rk[8:11] + .word 2253497207 # rk[12:15] + .word 2254578679 # rk[16:19] + .word 2255660151 # rk[20:23] + .word 2256741623 # rk[24:27] + .word 2257823095 # rk[28:31] + + # Store round keys + .word 33939879 # rk[0:3] + addi a1, a1, 16 + .word 33940007 # rk[4:7] + addi a1, a1, 16 + .word 33940135 # rk[8:11] + addi a1, a1, 16 + .word 33940263 # rk[12:15] + addi a1, a1, 16 + .word 33940391 # rk[16:19] + addi a1, a1, 16 + .word 33940519 # rk[20:23] + addi a1, a1, 16 + .word 33940647 # rk[24:27] + addi a1, a1, 16 + .word 33940775 # rk[28:31] + + li a0, 1 + ret +.size rv64i_zvksed_sm4_set_encrypt_key,.-rv64i_zvksed_sm4_set_encrypt_key +.p2align 3 +.globl rv64i_zvksed_sm4_set_decrypt_key +.type rv64i_zvksed_sm4_set_decrypt_key,@function +rv64i_zvksed_sm4_set_decrypt_key: + .word 0xc1027057 + + # Load the user key + .word 33906823 + .word 1242865879 + + # Load the FK. + la t0, FK + .word 33743111 + + # Generate round keys. + .word 772866263 + .word 2249204215 # rk[0:3] + .word 2251334263 # rk[4:7] + .word 2252415735 # rk[8:11] + .word 2253497207 # rk[12:15] + .word 2254578679 # rk[16:19] + .word 2255660151 # rk[20:23] + .word 2256741623 # rk[24:27] + .word 2257823095 # rk[28:31] + + # Store round keys in reverse order + addi a1, a1, 12 + li t1, -4 + .word 174449959 # rk[31:28] + addi a1, a1, 16 + .word 174449831 # rk[27:24] + addi a1, a1, 16 + .word 174449703 # rk[23:20] + addi a1, a1, 16 + .word 174449575 # rk[19:16] + addi a1, a1, 16 + .word 174449447 # rk[15:12] + addi a1, a1, 16 + .word 174449319 # rk[11:8] + addi a1, a1, 16 + .word 174449191 # rk[7:4] + addi a1, a1, 16 + .word 174449063 # rk[3:0] + + li a0, 1 + ret +.size rv64i_zvksed_sm4_set_decrypt_key,.-rv64i_zvksed_sm4_set_decrypt_key +.p2align 3 +.globl rv64i_zvksed_sm4_encrypt +.type rv64i_zvksed_sm4_encrypt,@function +rv64i_zvksed_sm4_encrypt: + .word 0xc1027057 + + # Order of elements was adjusted in set_encrypt_key() + .word 33972487 # rk[0:3] + addi a2, a2, 16 + .word 33972615 # rk[4:7] + addi a2, a2, 16 + .word 33972743 # rk[8:11] + addi a2, a2, 16 + .word 33972871 # rk[12:15] + addi a2, a2, 16 + .word 33972999 # rk[16:19] + addi a2, a2, 16 + .word 33973127 # rk[20:23] + addi a2, a2, 16 + .word 33973255 # rk[24:27] + addi a2, a2, 16 + .word 33973383 # rk[28:31] + + # Load input data + .word 33906823 + .word 1242865879 + + # Encrypt with all keys + .word 2787647735 + .word 2788696311 + .word 2789744887 + .word 2790793463 + .word 2791842039 + .word 2792890615 + .word 2793939191 + .word 2794987767 + + # Save the ciphertext (in reverse element order) + .word 1242865879 + li t0, -4 + addi a1, a1, 12 + .word 173400231 + + ret +.size rv64i_zvksed_sm4_encrypt,.-rv64i_zvksed_sm4_encrypt +.p2align 3 +.globl rv64i_zvksed_sm4_decrypt +.type rv64i_zvksed_sm4_decrypt,@function +rv64i_zvksed_sm4_decrypt: + .word 0xc1027057 + + # Order of elements was adjusted in set_decrypt_key() + .word 33973383 # rk[31:28] + addi a2, a2, 16 + .word 33973255 # rk[27:24] + addi a2, a2, 16 + .word 33973127 # rk[23:20] + addi a2, a2, 16 + .word 33972999 # rk[19:16] + addi a2, a2, 16 + .word 33972871 # rk[15:11] + addi a2, a2, 16 + .word 33972743 # rk[11:8] + addi a2, a2, 16 + .word 33972615 # rk[7:4] + addi a2, a2, 16 + .word 33972487 # rk[3:0] + + # Load input data + .word 33906823 + .word 1242865879 + + # Encrypt with all keys + .word 2794987767 + .word 2793939191 + .word 2792890615 + .word 2791842039 + .word 2790793463 + .word 2789744887 + .word 2788696311 + .word 2787647735 + + # Save the ciphertext (in reverse element order) + .word 1242865879 + li t0, -4 + addi a1, a1, 12 + .word 173400231 + + ret +.size rv64i_zvksed_sm4_decrypt,.-rv64i_zvksed_sm4_decrypt +# Family Key (little-endian 32-bit chunks) +.p2align 3 +FK: + .word 0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC +.size FK,.-FK diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/crypto/bn_conf.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/crypto/bn_conf.h new file mode 100644 index 000000000000..2437fc9bd282 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/crypto/bn_conf.h @@ -0,0 +1,37 @@ +/* clang-format off */ +/* WARNING: do not edit! */ +/* Generated by Makefile from include/crypto/bn_conf.h.in */ +/* clang-format on */ +/* + * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_BN_CONF_H +#define OSSL_CRYPTO_BN_CONF_H +#pragma once + +/* + * The contents of this file are not used in the UEFI build, as + * both 32-bit and 64-bit builds are supported from a single run + * of the Configure script. + */ + +/* Should we define BN_DIV2W here? */ + +/* Only one for the following should be defined */ +/* clang-format off */ +#define SIXTY_FOUR_BIT_LONG + /* clang-format on */ + /* clang-format off */ +#undef SIXTY_FOUR_BIT + /* clang-format on */ + /* clang-format off */ +#undef THIRTY_TWO_BIT +/* clang-format on */ + +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/crypto/dso_conf.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/crypto/dso_conf.h new file mode 100644 index 000000000000..29edacf112c8 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/crypto/dso_conf.h @@ -0,0 +1,25 @@ +/* clang-format off */ +/* WARNING: do not edit! */ +/* Generated by Makefile from include/crypto/dso_conf.h.in */ +/* clang-format on */ +/* + * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_DSO_CONF_H +#define OSSL_CRYPTO_DSO_CONF_H +#pragma once + +/* clang-format off */ +# define DSO_DLFCN +# define HAVE_DLFCN_H +/* clang-format on */ +/* clang-format off */ +# define DSO_EXTENSION ".so" +/* clang-format on */ +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/internal/param_names.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/internal/param_names.h new file mode 100644 index 000000000000..cefb8dfa75fa --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/internal/param_names.h @@ -0,0 +1,473 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/internal/param_names.h.in + * + * Copyright 2023 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ +/* clang-format off */ + +/* clang-format on */ + +int ossl_param_find_pidx(const char *s); + +/* Parameter name definitions - generated by util/perl/OpenSSL/paramnames.pm */ +/* clang-format off */ +#define NUM_PIDX 346 + +#define PIDX_ALG_PARAM_ALGORITHM_ID 0 +#define PIDX_ALG_PARAM_ALGORITHM_ID_PARAMS 1 +#define PIDX_ALG_PARAM_CIPHER 2 +#define PIDX_ALG_PARAM_DIGEST 3 +#define PIDX_ALG_PARAM_ENGINE 4 +#define PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR 5 +#define PIDX_ALG_PARAM_MAC 6 +#define PIDX_ALG_PARAM_PROPERTIES 7 +#define PIDX_ASYM_CIPHER_PARAM_DIGEST PIDX_PKEY_PARAM_DIGEST +#define PIDX_ASYM_CIPHER_PARAM_ENGINE PIDX_PKEY_PARAM_ENGINE +#define PIDX_ASYM_CIPHER_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_ASYM_CIPHER_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK +#define PIDX_ASYM_CIPHER_PARAM_FIPS_RSA_PKCS15_PAD_DISABLED PIDX_PROV_PARAM_RSA_PKCS15_PAD_DISABLED +#define PIDX_ASYM_CIPHER_PARAM_IMPLICIT_REJECTION 8 +#define PIDX_ASYM_CIPHER_PARAM_MGF1_DIGEST PIDX_PKEY_PARAM_MGF1_DIGEST +#define PIDX_ASYM_CIPHER_PARAM_MGF1_DIGEST_PROPS PIDX_PKEY_PARAM_MGF1_PROPERTIES +#define PIDX_ASYM_CIPHER_PARAM_OAEP_DIGEST PIDX_ALG_PARAM_DIGEST +#define PIDX_ASYM_CIPHER_PARAM_OAEP_DIGEST_PROPS 9 +#define PIDX_ASYM_CIPHER_PARAM_OAEP_LABEL 10 +#define PIDX_ASYM_CIPHER_PARAM_PAD_MODE PIDX_PKEY_PARAM_PAD_MODE +#define PIDX_ASYM_CIPHER_PARAM_PROPERTIES PIDX_PKEY_PARAM_PROPERTIES +#define PIDX_ASYM_CIPHER_PARAM_TLS_CLIENT_VERSION 11 +#define PIDX_ASYM_CIPHER_PARAM_TLS_NEGOTIATED_VERSION 12 +#define PIDX_CAPABILITY_TLS_GROUP_ALG 13 +#define PIDX_CAPABILITY_TLS_GROUP_ID 14 +#define PIDX_CAPABILITY_TLS_GROUP_IS_KEM 15 +#define PIDX_CAPABILITY_TLS_GROUP_MAX_DTLS 16 +#define PIDX_CAPABILITY_TLS_GROUP_MAX_TLS 17 +#define PIDX_CAPABILITY_TLS_GROUP_MIN_DTLS 18 +#define PIDX_CAPABILITY_TLS_GROUP_MIN_TLS 19 +#define PIDX_CAPABILITY_TLS_GROUP_NAME 20 +#define PIDX_CAPABILITY_TLS_GROUP_NAME_INTERNAL 21 +#define PIDX_CAPABILITY_TLS_GROUP_SECURITY_BITS 22 +#define PIDX_CAPABILITY_TLS_SIGALG_CODE_POINT 23 +#define PIDX_CAPABILITY_TLS_SIGALG_HASH_NAME 24 +#define PIDX_CAPABILITY_TLS_SIGALG_HASH_OID 25 +#define PIDX_CAPABILITY_TLS_SIGALG_IANA_NAME 26 +#define PIDX_CAPABILITY_TLS_SIGALG_KEYTYPE 27 +#define PIDX_CAPABILITY_TLS_SIGALG_KEYTYPE_OID 28 +#define PIDX_CAPABILITY_TLS_SIGALG_MAX_DTLS 16 +#define PIDX_CAPABILITY_TLS_SIGALG_MAX_TLS 17 +#define PIDX_CAPABILITY_TLS_SIGALG_MIN_DTLS 18 +#define PIDX_CAPABILITY_TLS_SIGALG_MIN_TLS 19 +#define PIDX_CAPABILITY_TLS_SIGALG_NAME 29 +#define PIDX_CAPABILITY_TLS_SIGALG_OID 30 +#define PIDX_CAPABILITY_TLS_SIGALG_SECURITY_BITS 31 +#define PIDX_CAPABILITY_TLS_SIGALG_SIG_NAME 32 +#define PIDX_CAPABILITY_TLS_SIGALG_SIG_OID 33 +#define PIDX_CIPHER_PARAM_AEAD 34 +#define PIDX_CIPHER_PARAM_AEAD_IVLEN PIDX_CIPHER_PARAM_IVLEN +#define PIDX_CIPHER_PARAM_AEAD_IV_GENERATED 35 +#define PIDX_CIPHER_PARAM_AEAD_MAC_KEY 36 +#define PIDX_CIPHER_PARAM_AEAD_TAG 37 +#define PIDX_CIPHER_PARAM_AEAD_TAGLEN 38 +#define PIDX_CIPHER_PARAM_AEAD_TLS1_AAD 39 +#define PIDX_CIPHER_PARAM_AEAD_TLS1_AAD_PAD 40 +#define PIDX_CIPHER_PARAM_AEAD_TLS1_GET_IV_GEN 41 +#define PIDX_CIPHER_PARAM_AEAD_TLS1_IV_FIXED 42 +#define PIDX_CIPHER_PARAM_AEAD_TLS1_SET_IV_INV 43 +#define PIDX_CIPHER_PARAM_ALGORITHM_ID PIDX_ALG_PARAM_ALGORITHM_ID +#define PIDX_CIPHER_PARAM_ALGORITHM_ID_PARAMS PIDX_ALG_PARAM_ALGORITHM_ID_PARAMS +#define PIDX_CIPHER_PARAM_ALGORITHM_ID_PARAMS_OLD 44 +#define PIDX_CIPHER_PARAM_BLOCK_SIZE 45 +#define PIDX_CIPHER_PARAM_CTS 46 +#define PIDX_CIPHER_PARAM_CTS_MODE 47 +#define PIDX_CIPHER_PARAM_CUSTOM_IV 48 +#define PIDX_CIPHER_PARAM_DECRYPT_ONLY 49 +#define PIDX_CIPHER_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_CIPHER_PARAM_FIPS_ENCRYPT_CHECK 50 +#define PIDX_CIPHER_PARAM_HAS_RAND_KEY 51 +#define PIDX_CIPHER_PARAM_IV 52 +#define PIDX_CIPHER_PARAM_IVLEN 53 +#define PIDX_CIPHER_PARAM_KEYLEN 54 +#define PIDX_CIPHER_PARAM_MODE 55 +#define PIDX_CIPHER_PARAM_NUM 56 +#define PIDX_CIPHER_PARAM_PADDING 57 +#define PIDX_CIPHER_PARAM_PIPELINE_AEAD_TAG 58 +#define PIDX_CIPHER_PARAM_RANDOM_KEY 59 +#define PIDX_CIPHER_PARAM_RC2_KEYBITS 60 +#define PIDX_CIPHER_PARAM_ROUNDS 61 +#define PIDX_CIPHER_PARAM_SPEED 62 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK 63 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD 64 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD_PACKLEN 65 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC 66 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_IN 67 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_LEN 68 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE 69 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_BUFSIZE 70 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_SEND_FRAGMENT 71 +#define PIDX_CIPHER_PARAM_TLS_MAC 72 +#define PIDX_CIPHER_PARAM_TLS_MAC_SIZE 73 +#define PIDX_CIPHER_PARAM_TLS_VERSION 74 +#define PIDX_CIPHER_PARAM_UPDATED_IV 75 +#define PIDX_CIPHER_PARAM_USE_BITS 76 +#define PIDX_CIPHER_PARAM_XTS_STANDARD 77 +#define PIDX_DECODER_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES +#define PIDX_DIGEST_PARAM_ALGID_ABSENT 78 +#define PIDX_DIGEST_PARAM_BLOCK_SIZE 45 +#define PIDX_DIGEST_PARAM_MICALG 79 +#define PIDX_DIGEST_PARAM_PAD_TYPE 80 +#define PIDX_DIGEST_PARAM_SIZE 81 +#define PIDX_DIGEST_PARAM_SSL3_MS 82 +#define PIDX_DIGEST_PARAM_XOF 83 +#define PIDX_DIGEST_PARAM_XOFLEN 84 +#define PIDX_DRBG_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER +#define PIDX_DRBG_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST +#define PIDX_DRBG_PARAM_ENTROPY_REQUIRED 85 +#define PIDX_DRBG_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_DRBG_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK +#define PIDX_DRBG_PARAM_MAC PIDX_ALG_PARAM_MAC +#define PIDX_DRBG_PARAM_MAX_ADINLEN 86 +#define PIDX_DRBG_PARAM_MAX_ENTROPYLEN 87 +#define PIDX_DRBG_PARAM_MAX_LENGTH 88 +#define PIDX_DRBG_PARAM_MAX_NONCELEN 89 +#define PIDX_DRBG_PARAM_MAX_PERSLEN 90 +#define PIDX_DRBG_PARAM_MIN_ENTROPYLEN 91 +#define PIDX_DRBG_PARAM_MIN_LENGTH 92 +#define PIDX_DRBG_PARAM_MIN_NONCELEN 93 +#define PIDX_DRBG_PARAM_PREDICTION_RESISTANCE 94 +#define PIDX_DRBG_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES +#define PIDX_DRBG_PARAM_RANDOM_DATA 95 +#define PIDX_DRBG_PARAM_RESEED_COUNTER 96 +#define PIDX_DRBG_PARAM_RESEED_REQUESTS 97 +#define PIDX_DRBG_PARAM_RESEED_TIME 98 +#define PIDX_DRBG_PARAM_RESEED_TIME_INTERVAL 99 +#define PIDX_DRBG_PARAM_SIZE 81 +#define PIDX_DRBG_PARAM_USE_DF 100 +#define PIDX_ENCODER_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER +#define PIDX_ENCODER_PARAM_ENCRYPT_LEVEL 101 +#define PIDX_ENCODER_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES +#define PIDX_ENCODER_PARAM_SAVE_PARAMETERS 102 +#define PIDX_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE 103 +#define PIDX_EXCHANGE_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_EXCHANGE_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK +#define PIDX_EXCHANGE_PARAM_FIPS_ECDH_COFACTOR_CHECK PIDX_PROV_PARAM_ECDH_COFACTOR_CHECK +#define PIDX_EXCHANGE_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK +#define PIDX_EXCHANGE_PARAM_KDF_DIGEST 104 +#define PIDX_EXCHANGE_PARAM_KDF_DIGEST_PROPS 105 +#define PIDX_EXCHANGE_PARAM_KDF_OUTLEN 106 +#define PIDX_EXCHANGE_PARAM_KDF_TYPE 107 +#define PIDX_EXCHANGE_PARAM_KDF_UKM 108 +#define PIDX_EXCHANGE_PARAM_PAD 109 +#define PIDX_GEN_PARAM_ITERATION 110 +#define PIDX_GEN_PARAM_POTENTIAL 111 +#define PIDX_KDF_PARAM_ARGON2_AD 112 +#define PIDX_KDF_PARAM_ARGON2_LANES 113 +#define PIDX_KDF_PARAM_ARGON2_MEMCOST 114 +#define PIDX_KDF_PARAM_ARGON2_VERSION 115 +#define PIDX_KDF_PARAM_CEK_ALG 116 +#define PIDX_KDF_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER +#define PIDX_KDF_PARAM_CONSTANT 117 +#define PIDX_KDF_PARAM_DATA 118 +#define PIDX_KDF_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST +#define PIDX_KDF_PARAM_EARLY_CLEAN 119 +#define PIDX_KDF_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_KDF_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK +#define PIDX_KDF_PARAM_FIPS_EMS_CHECK 120 +#define PIDX_KDF_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK +#define PIDX_KDF_PARAM_HMACDRBG_ENTROPY 121 +#define PIDX_KDF_PARAM_HMACDRBG_NONCE 122 +#define PIDX_KDF_PARAM_INFO 123 +#define PIDX_KDF_PARAM_ITER 124 +#define PIDX_KDF_PARAM_KBKDF_R 125 +#define PIDX_KDF_PARAM_KBKDF_USE_L 126 +#define PIDX_KDF_PARAM_KBKDF_USE_SEPARATOR 127 +#define PIDX_KDF_PARAM_KEY 128 +#define PIDX_KDF_PARAM_LABEL 129 +#define PIDX_KDF_PARAM_MAC PIDX_ALG_PARAM_MAC +#define PIDX_KDF_PARAM_MAC_SIZE 130 +#define PIDX_KDF_PARAM_MODE 55 +#define PIDX_KDF_PARAM_PASSWORD 131 +#define PIDX_KDF_PARAM_PKCS12_ID 132 +#define PIDX_KDF_PARAM_PKCS5 133 +#define PIDX_KDF_PARAM_PREFIX 134 +#define PIDX_KDF_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES +#define PIDX_KDF_PARAM_SALT 135 +#define PIDX_KDF_PARAM_SCRYPT_MAXMEM 136 +#define PIDX_KDF_PARAM_SCRYPT_N 137 +#define PIDX_KDF_PARAM_SCRYPT_P 138 +#define PIDX_KDF_PARAM_SCRYPT_R 125 +#define PIDX_KDF_PARAM_SECRET 139 +#define PIDX_KDF_PARAM_SEED 140 +#define PIDX_KDF_PARAM_SIZE 81 +#define PIDX_KDF_PARAM_SSHKDF_SESSION_ID 141 +#define PIDX_KDF_PARAM_SSHKDF_TYPE 142 +#define PIDX_KDF_PARAM_SSHKDF_XCGHASH 143 +#define PIDX_KDF_PARAM_THREADS 144 +#define PIDX_KDF_PARAM_UKM 145 +#define PIDX_KDF_PARAM_X942_ACVPINFO 146 +#define PIDX_KDF_PARAM_X942_PARTYUINFO 147 +#define PIDX_KDF_PARAM_X942_PARTYVINFO 148 +#define PIDX_KDF_PARAM_X942_SUPP_PRIVINFO 149 +#define PIDX_KDF_PARAM_X942_SUPP_PUBINFO 150 +#define PIDX_KDF_PARAM_X942_USE_KEYBITS 151 +#define PIDX_KEM_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_KEM_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK +#define PIDX_KEM_PARAM_IKME 152 +#define PIDX_KEM_PARAM_OPERATION 153 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_BLOCK_PADDING 154 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_HS_PADDING 155 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_EARLY_DATA 156 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_FRAG_LEN 157 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MODE 55 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_OPTIONS 158 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_READ_AHEAD 159 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_STREAM_MAC 160 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_TLSTREE 161 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_USE_ETM 162 +#define PIDX_LIBSSL_RECORD_LAYER_READ_BUFFER_LEN 163 +#define PIDX_MAC_PARAM_BLOCK_SIZE 164 +#define PIDX_MAC_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER +#define PIDX_MAC_PARAM_CUSTOM 165 +#define PIDX_MAC_PARAM_C_ROUNDS 166 +#define PIDX_MAC_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST +#define PIDX_MAC_PARAM_DIGEST_NOINIT 167 +#define PIDX_MAC_PARAM_DIGEST_ONESHOT 168 +#define PIDX_MAC_PARAM_D_ROUNDS 169 +#define PIDX_MAC_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_MAC_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK +#define PIDX_MAC_PARAM_FIPS_NO_SHORT_MAC PIDX_PROV_PARAM_NO_SHORT_MAC +#define PIDX_MAC_PARAM_IV 52 +#define PIDX_MAC_PARAM_KEY 128 +#define PIDX_MAC_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES +#define PIDX_MAC_PARAM_SALT 135 +#define PIDX_MAC_PARAM_SIZE 81 +#define PIDX_MAC_PARAM_TLS_DATA_SIZE 170 +#define PIDX_MAC_PARAM_XOF 83 +#define PIDX_OBJECT_PARAM_DATA 118 +#define PIDX_OBJECT_PARAM_DATA_STRUCTURE 171 +#define PIDX_OBJECT_PARAM_DATA_TYPE 172 +#define PIDX_OBJECT_PARAM_DESC 173 +#define PIDX_OBJECT_PARAM_INPUT_TYPE 174 +#define PIDX_OBJECT_PARAM_REFERENCE 175 +#define PIDX_OBJECT_PARAM_TYPE 142 +#define PIDX_PASSPHRASE_PARAM_INFO 123 +#define PIDX_PKEY_PARAM_ALGORITHM_ID PIDX_ALG_PARAM_ALGORITHM_ID +#define PIDX_PKEY_PARAM_ALGORITHM_ID_PARAMS PIDX_ALG_PARAM_ALGORITHM_ID_PARAMS +#define PIDX_PKEY_PARAM_BITS 176 +#define PIDX_PKEY_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER +#define PIDX_PKEY_PARAM_DEFAULT_DIGEST 177 +#define PIDX_PKEY_PARAM_DHKEM_IKM 178 +#define PIDX_PKEY_PARAM_DH_GENERATOR 179 +#define PIDX_PKEY_PARAM_DH_PRIV_LEN 180 +#define PIDX_PKEY_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST +#define PIDX_PKEY_PARAM_DIGEST_SIZE 181 +#define PIDX_PKEY_PARAM_DIST_ID 182 +#define PIDX_PKEY_PARAM_EC_A 183 +#define PIDX_PKEY_PARAM_EC_B 184 +#define PIDX_PKEY_PARAM_EC_CHAR2_M 185 +#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K1 186 +#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K2 187 +#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K3 188 +#define PIDX_PKEY_PARAM_EC_CHAR2_TP_BASIS 189 +#define PIDX_PKEY_PARAM_EC_CHAR2_TYPE 190 +#define PIDX_PKEY_PARAM_EC_COFACTOR 191 +#define PIDX_PKEY_PARAM_EC_DECODED_FROM_EXPLICIT_PARAMS 192 +#define PIDX_PKEY_PARAM_EC_ENCODING 193 +#define PIDX_PKEY_PARAM_EC_FIELD_TYPE 194 +#define PIDX_PKEY_PARAM_EC_GENERATOR 195 +#define PIDX_PKEY_PARAM_EC_GROUP_CHECK_TYPE 196 +#define PIDX_PKEY_PARAM_EC_INCLUDE_PUBLIC 197 +#define PIDX_PKEY_PARAM_EC_ORDER 198 +#define PIDX_PKEY_PARAM_EC_P 138 +#define PIDX_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT 199 +#define PIDX_PKEY_PARAM_EC_PUB_X 200 +#define PIDX_PKEY_PARAM_EC_PUB_Y 201 +#define PIDX_PKEY_PARAM_EC_SEED 140 +#define PIDX_PKEY_PARAM_ENCODED_PUBLIC_KEY 202 +#define PIDX_PKEY_PARAM_ENGINE PIDX_ALG_PARAM_ENGINE +#define PIDX_PKEY_PARAM_FFC_COFACTOR 203 +#define PIDX_PKEY_PARAM_FFC_DIGEST PIDX_PKEY_PARAM_DIGEST +#define PIDX_PKEY_PARAM_FFC_DIGEST_PROPS PIDX_PKEY_PARAM_PROPERTIES +#define PIDX_PKEY_PARAM_FFC_G 204 +#define PIDX_PKEY_PARAM_FFC_GINDEX 205 +#define PIDX_PKEY_PARAM_FFC_H 206 +#define PIDX_PKEY_PARAM_FFC_P 138 +#define PIDX_PKEY_PARAM_FFC_PBITS 207 +#define PIDX_PKEY_PARAM_FFC_PCOUNTER 208 +#define PIDX_PKEY_PARAM_FFC_Q 209 +#define PIDX_PKEY_PARAM_FFC_QBITS 210 +#define PIDX_PKEY_PARAM_FFC_SEED 140 +#define PIDX_PKEY_PARAM_FFC_TYPE 142 +#define PIDX_PKEY_PARAM_FFC_VALIDATE_G 211 +#define PIDX_PKEY_PARAM_FFC_VALIDATE_LEGACY 212 +#define PIDX_PKEY_PARAM_FFC_VALIDATE_PQ 213 +#define PIDX_PKEY_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK 214 +#define PIDX_PKEY_PARAM_FIPS_KEY_CHECK 215 +#define PIDX_PKEY_PARAM_FIPS_SIGN_CHECK 216 +#define PIDX_PKEY_PARAM_GROUP_NAME 217 +#define PIDX_PKEY_PARAM_IMPLICIT_REJECTION 8 +#define PIDX_PKEY_PARAM_MANDATORY_DIGEST 218 +#define PIDX_PKEY_PARAM_MASKGENFUNC 219 +#define PIDX_PKEY_PARAM_MAX_SIZE 220 +#define PIDX_PKEY_PARAM_MGF1_DIGEST 221 +#define PIDX_PKEY_PARAM_MGF1_PROPERTIES 222 +#define PIDX_PKEY_PARAM_ML_DSA_INPUT_FORMATS 223 +#define PIDX_PKEY_PARAM_ML_DSA_OUTPUT_FORMATS 224 +#define PIDX_PKEY_PARAM_ML_DSA_PREFER_SEED 225 +#define PIDX_PKEY_PARAM_ML_DSA_RETAIN_SEED 226 +#define PIDX_PKEY_PARAM_ML_DSA_SEED 140 +#define PIDX_PKEY_PARAM_ML_KEM_IMPORT_PCT_TYPE 227 +#define PIDX_PKEY_PARAM_ML_KEM_INPUT_FORMATS 228 +#define PIDX_PKEY_PARAM_ML_KEM_OUTPUT_FORMATS 229 +#define PIDX_PKEY_PARAM_ML_KEM_PREFER_SEED 230 +#define PIDX_PKEY_PARAM_ML_KEM_RETAIN_SEED 231 +#define PIDX_PKEY_PARAM_ML_KEM_SEED 140 +#define PIDX_PKEY_PARAM_PAD_MODE 232 +#define PIDX_PKEY_PARAM_PRIV_KEY 233 +#define PIDX_PKEY_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES +#define PIDX_PKEY_PARAM_PUB_KEY 234 +#define PIDX_PKEY_PARAM_RSA_BITS PIDX_PKEY_PARAM_BITS +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT 235 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT1 236 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT2 237 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT3 238 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT4 239 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT5 240 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT6 241 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT7 242 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT8 243 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT9 244 +#define PIDX_PKEY_PARAM_RSA_D 245 +#define PIDX_PKEY_PARAM_RSA_DERIVE_FROM_PQ 246 +#define PIDX_PKEY_PARAM_RSA_DIGEST PIDX_PKEY_PARAM_DIGEST +#define PIDX_PKEY_PARAM_RSA_DIGEST_PROPS PIDX_PKEY_PARAM_PROPERTIES +#define PIDX_PKEY_PARAM_RSA_E 247 +#define PIDX_PKEY_PARAM_RSA_EXPONENT 248 +#define PIDX_PKEY_PARAM_RSA_EXPONENT1 249 +#define PIDX_PKEY_PARAM_RSA_EXPONENT10 250 +#define PIDX_PKEY_PARAM_RSA_EXPONENT2 251 +#define PIDX_PKEY_PARAM_RSA_EXPONENT3 252 +#define PIDX_PKEY_PARAM_RSA_EXPONENT4 253 +#define PIDX_PKEY_PARAM_RSA_EXPONENT5 254 +#define PIDX_PKEY_PARAM_RSA_EXPONENT6 255 +#define PIDX_PKEY_PARAM_RSA_EXPONENT7 256 +#define PIDX_PKEY_PARAM_RSA_EXPONENT8 257 +#define PIDX_PKEY_PARAM_RSA_EXPONENT9 258 +#define PIDX_PKEY_PARAM_RSA_FACTOR 259 +#define PIDX_PKEY_PARAM_RSA_FACTOR1 260 +#define PIDX_PKEY_PARAM_RSA_FACTOR10 261 +#define PIDX_PKEY_PARAM_RSA_FACTOR2 262 +#define PIDX_PKEY_PARAM_RSA_FACTOR3 263 +#define PIDX_PKEY_PARAM_RSA_FACTOR4 264 +#define PIDX_PKEY_PARAM_RSA_FACTOR5 265 +#define PIDX_PKEY_PARAM_RSA_FACTOR6 266 +#define PIDX_PKEY_PARAM_RSA_FACTOR7 267 +#define PIDX_PKEY_PARAM_RSA_FACTOR8 268 +#define PIDX_PKEY_PARAM_RSA_FACTOR9 269 +#define PIDX_PKEY_PARAM_RSA_MASKGENFUNC PIDX_PKEY_PARAM_MASKGENFUNC +#define PIDX_PKEY_PARAM_RSA_MGF1_DIGEST PIDX_PKEY_PARAM_MGF1_DIGEST +#define PIDX_PKEY_PARAM_RSA_N 137 +#define PIDX_PKEY_PARAM_RSA_PRIMES 270 +#define PIDX_PKEY_PARAM_RSA_PSS_SALTLEN 271 +#define PIDX_PKEY_PARAM_RSA_TEST_P1 272 +#define PIDX_PKEY_PARAM_RSA_TEST_P2 273 +#define PIDX_PKEY_PARAM_RSA_TEST_Q1 274 +#define PIDX_PKEY_PARAM_RSA_TEST_Q2 275 +#define PIDX_PKEY_PARAM_RSA_TEST_XP 276 +#define PIDX_PKEY_PARAM_RSA_TEST_XP1 277 +#define PIDX_PKEY_PARAM_RSA_TEST_XP2 278 +#define PIDX_PKEY_PARAM_RSA_TEST_XQ 279 +#define PIDX_PKEY_PARAM_RSA_TEST_XQ1 280 +#define PIDX_PKEY_PARAM_RSA_TEST_XQ2 281 +#define PIDX_PKEY_PARAM_SECURITY_BITS 282 +#define PIDX_PKEY_PARAM_SLH_DSA_SEED 140 +#define PIDX_PKEY_PARAM_USE_COFACTOR_ECDH PIDX_PKEY_PARAM_USE_COFACTOR_FLAG +#define PIDX_PKEY_PARAM_USE_COFACTOR_FLAG 283 +#define PIDX_PROV_PARAM_BUILDINFO 284 +#define PIDX_PROV_PARAM_CORE_MODULE_FILENAME 285 +#define PIDX_PROV_PARAM_CORE_PROV_NAME 286 +#define PIDX_PROV_PARAM_CORE_VERSION 287 +#define PIDX_PROV_PARAM_DRBG_TRUNC_DIGEST 288 +#define PIDX_PROV_PARAM_DSA_SIGN_DISABLED 289 +#define PIDX_PROV_PARAM_ECDH_COFACTOR_CHECK 290 +#define PIDX_PROV_PARAM_HKDF_DIGEST_CHECK 291 +#define PIDX_PROV_PARAM_HKDF_KEY_CHECK 292 +#define PIDX_PROV_PARAM_HMAC_KEY_CHECK 293 +#define PIDX_PROV_PARAM_KBKDF_KEY_CHECK 294 +#define PIDX_PROV_PARAM_KMAC_KEY_CHECK 295 +#define PIDX_PROV_PARAM_NAME 296 +#define PIDX_PROV_PARAM_NO_SHORT_MAC 297 +#define PIDX_PROV_PARAM_PBKDF2_LOWER_BOUND_CHECK 298 +#define PIDX_PROV_PARAM_RSA_PKCS15_PAD_DISABLED 299 +#define PIDX_PROV_PARAM_RSA_PSS_SALTLEN_CHECK 300 +#define PIDX_PROV_PARAM_RSA_SIGN_X931_PAD_DISABLED 301 +#define PIDX_PROV_PARAM_SECURITY_CHECKS 302 +#define PIDX_PROV_PARAM_SELF_TEST_DESC 303 +#define PIDX_PROV_PARAM_SELF_TEST_PHASE 304 +#define PIDX_PROV_PARAM_SELF_TEST_TYPE 305 +#define PIDX_PROV_PARAM_SIGNATURE_DIGEST_CHECK 306 +#define PIDX_PROV_PARAM_SSHKDF_DIGEST_CHECK 307 +#define PIDX_PROV_PARAM_SSHKDF_KEY_CHECK 308 +#define PIDX_PROV_PARAM_SSKDF_DIGEST_CHECK 309 +#define PIDX_PROV_PARAM_SSKDF_KEY_CHECK 310 +#define PIDX_PROV_PARAM_STATUS 311 +#define PIDX_PROV_PARAM_TDES_ENCRYPT_DISABLED 312 +#define PIDX_PROV_PARAM_TLS13_KDF_DIGEST_CHECK 313 +#define PIDX_PROV_PARAM_TLS13_KDF_KEY_CHECK 314 +#define PIDX_PROV_PARAM_TLS1_PRF_DIGEST_CHECK 315 +#define PIDX_PROV_PARAM_TLS1_PRF_EMS_CHECK 316 +#define PIDX_PROV_PARAM_TLS1_PRF_KEY_CHECK 317 +#define PIDX_PROV_PARAM_VERSION 115 +#define PIDX_PROV_PARAM_X942KDF_KEY_CHECK 318 +#define PIDX_PROV_PARAM_X963KDF_DIGEST_CHECK 319 +#define PIDX_PROV_PARAM_X963KDF_KEY_CHECK 320 +#define PIDX_RAND_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_RAND_PARAM_GENERATE 321 +#define PIDX_RAND_PARAM_MAX_REQUEST 322 +#define PIDX_RAND_PARAM_STATE 323 +#define PIDX_RAND_PARAM_STRENGTH 324 +#define PIDX_RAND_PARAM_TEST_ENTROPY 325 +#define PIDX_RAND_PARAM_TEST_NONCE 326 +#define PIDX_SIGNATURE_PARAM_ADD_RANDOM 327 +#define PIDX_SIGNATURE_PARAM_ALGORITHM_ID PIDX_PKEY_PARAM_ALGORITHM_ID +#define PIDX_SIGNATURE_PARAM_ALGORITHM_ID_PARAMS PIDX_PKEY_PARAM_ALGORITHM_ID_PARAMS +#define PIDX_SIGNATURE_PARAM_CONTEXT_STRING 328 +#define PIDX_SIGNATURE_PARAM_DETERMINISTIC 329 +#define PIDX_SIGNATURE_PARAM_DIGEST PIDX_PKEY_PARAM_DIGEST +#define PIDX_SIGNATURE_PARAM_DIGEST_SIZE PIDX_PKEY_PARAM_DIGEST_SIZE +#define PIDX_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_SIGNATURE_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK +#define PIDX_SIGNATURE_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK +#define PIDX_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK 300 +#define PIDX_SIGNATURE_PARAM_FIPS_SIGN_CHECK PIDX_PKEY_PARAM_FIPS_SIGN_CHECK +#define PIDX_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK 330 +#define PIDX_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE 331 +#define PIDX_SIGNATURE_PARAM_INSTANCE 332 +#define PIDX_SIGNATURE_PARAM_KAT 333 +#define PIDX_SIGNATURE_PARAM_MESSAGE_ENCODING 334 +#define PIDX_SIGNATURE_PARAM_MGF1_DIGEST PIDX_PKEY_PARAM_MGF1_DIGEST +#define PIDX_SIGNATURE_PARAM_MGF1_PROPERTIES PIDX_PKEY_PARAM_MGF1_PROPERTIES +#define PIDX_SIGNATURE_PARAM_MU 335 +#define PIDX_SIGNATURE_PARAM_NONCE_TYPE 336 +#define PIDX_SIGNATURE_PARAM_PAD_MODE PIDX_PKEY_PARAM_PAD_MODE +#define PIDX_SIGNATURE_PARAM_PROPERTIES PIDX_PKEY_PARAM_PROPERTIES +#define PIDX_SIGNATURE_PARAM_PSS_SALTLEN 271 +#define PIDX_SIGNATURE_PARAM_SIGNATURE 337 +#define PIDX_SIGNATURE_PARAM_TEST_ENTROPY 338 +#define PIDX_SKEY_PARAM_KEY_LENGTH 339 +#define PIDX_SKEY_PARAM_RAW_BYTES 340 +#define PIDX_STORE_PARAM_ALIAS 341 +#define PIDX_STORE_PARAM_DIGEST 3 +#define PIDX_STORE_PARAM_EXPECT 342 +#define PIDX_STORE_PARAM_FINGERPRINT 343 +#define PIDX_STORE_PARAM_INPUT_TYPE 174 +#define PIDX_STORE_PARAM_ISSUER 296 +#define PIDX_STORE_PARAM_PROPERTIES 7 +#define PIDX_STORE_PARAM_SERIAL 344 +#define PIDX_STORE_PARAM_SUBJECT 345 +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/asn1.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/asn1.h new file mode 100644 index 000000000000..3fd498b2a3e6 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/asn1.h @@ -0,0 +1,1125 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/asn1.h.in + * + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_ASN1_H +#define OPENSSL_ASN1_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_ASN1_H +#endif + +#ifndef OPENSSL_NO_STDIO +#include +#endif +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#ifdef OPENSSL_BUILD_SHLIBCRYPTO +#undef OPENSSL_EXTERN +#define OPENSSL_EXTERN OPENSSL_EXPORT +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define V_ASN1_UNIVERSAL 0x00 +#define V_ASN1_APPLICATION 0x40 +#define V_ASN1_CONTEXT_SPECIFIC 0x80 +#define V_ASN1_PRIVATE 0xc0 + +#define V_ASN1_CONSTRUCTED 0x20 +#define V_ASN1_PRIMITIVE_TAG 0x1f +#define V_ASN1_PRIMATIVE_TAG /*compat*/ V_ASN1_PRIMITIVE_TAG + +#define V_ASN1_APP_CHOOSE -2 /* let the recipient choose */ +#define V_ASN1_OTHER -3 /* used in ASN1_TYPE */ +#define V_ASN1_ANY -4 /* used in ASN1 template code */ + +#define V_ASN1_UNDEF -1 +/* ASN.1 tag values */ +#define V_ASN1_EOC 0 +#define V_ASN1_BOOLEAN 1 +#define V_ASN1_INTEGER 2 +#define V_ASN1_BIT_STRING 3 +#define V_ASN1_OCTET_STRING 4 +#define V_ASN1_NULL 5 +#define V_ASN1_OBJECT 6 +#define V_ASN1_OBJECT_DESCRIPTOR 7 +#define V_ASN1_EXTERNAL 8 +#define V_ASN1_REAL 9 +#define V_ASN1_ENUMERATED 10 +#define V_ASN1_UTF8STRING 12 +#define V_ASN1_SEQUENCE 16 +#define V_ASN1_SET 17 +#define V_ASN1_NUMERICSTRING 18 +#define V_ASN1_PRINTABLESTRING 19 +#define V_ASN1_T61STRING 20 +#define V_ASN1_TELETEXSTRING 20 /* alias */ +#define V_ASN1_VIDEOTEXSTRING 21 +#define V_ASN1_IA5STRING 22 +#define V_ASN1_UTCTIME 23 +#define V_ASN1_GENERALIZEDTIME 24 +#define V_ASN1_GRAPHICSTRING 25 +#define V_ASN1_ISO64STRING 26 +#define V_ASN1_VISIBLESTRING 26 /* alias */ +#define V_ASN1_GENERALSTRING 27 +#define V_ASN1_UNIVERSALSTRING 28 +#define V_ASN1_BMPSTRING 30 + +/* + * NB the constants below are used internally by ASN1_INTEGER + * and ASN1_ENUMERATED to indicate the sign. They are *not* on + * the wire tag values. + */ + +#define V_ASN1_NEG 0x100 +#define V_ASN1_NEG_INTEGER (2 | V_ASN1_NEG) +#define V_ASN1_NEG_ENUMERATED (10 | V_ASN1_NEG) + +/* For use with d2i_ASN1_type_bytes() */ +#define B_ASN1_NUMERICSTRING 0x0001 +#define B_ASN1_PRINTABLESTRING 0x0002 +#define B_ASN1_T61STRING 0x0004 +#define B_ASN1_TELETEXSTRING 0x0004 +#define B_ASN1_VIDEOTEXSTRING 0x0008 +#define B_ASN1_IA5STRING 0x0010 +#define B_ASN1_GRAPHICSTRING 0x0020 +#define B_ASN1_ISO64STRING 0x0040 +#define B_ASN1_VISIBLESTRING 0x0040 +#define B_ASN1_GENERALSTRING 0x0080 +#define B_ASN1_UNIVERSALSTRING 0x0100 +#define B_ASN1_OCTET_STRING 0x0200 +#define B_ASN1_BIT_STRING 0x0400 +#define B_ASN1_BMPSTRING 0x0800 +#define B_ASN1_UNKNOWN 0x1000 +#define B_ASN1_UTF8STRING 0x2000 +#define B_ASN1_UTCTIME 0x4000 +#define B_ASN1_GENERALIZEDTIME 0x8000 +#define B_ASN1_SEQUENCE 0x10000 +/* For use with ASN1_mbstring_copy() */ +#define MBSTRING_FLAG 0x1000 +#define MBSTRING_UTF8 (MBSTRING_FLAG) +#define MBSTRING_ASC (MBSTRING_FLAG | 1) +#define MBSTRING_BMP (MBSTRING_FLAG | 2) +#define MBSTRING_UNIV (MBSTRING_FLAG | 4) +#define SMIME_OLDMIME 0x400 +#define SMIME_CRLFEOL 0x800 +#define SMIME_STREAM 0x1000 + +/* Stacks for types not otherwise defined in this header */ +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_ALGOR, X509_ALGOR, X509_ALGOR) +#define sk_X509_ALGOR_num(sk) OPENSSL_sk_num(ossl_check_const_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_value(sk, idx) ((X509_ALGOR *)OPENSSL_sk_value(ossl_check_const_X509_ALGOR_sk_type(sk), (idx))) +#define sk_X509_ALGOR_new(cmp) ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_new(ossl_check_X509_ALGOR_compfunc_type(cmp))) +#define sk_X509_ALGOR_new_null() ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_new_null()) +#define sk_X509_ALGOR_new_reserve(cmp, n) ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_new_reserve(ossl_check_X509_ALGOR_compfunc_type(cmp), (n))) +#define sk_X509_ALGOR_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_ALGOR_sk_type(sk), (n)) +#define sk_X509_ALGOR_free(sk) OPENSSL_sk_free(ossl_check_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_zero(sk) OPENSSL_sk_zero(ossl_check_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_delete(sk, i) ((X509_ALGOR *)OPENSSL_sk_delete(ossl_check_X509_ALGOR_sk_type(sk), (i))) +#define sk_X509_ALGOR_delete_ptr(sk, ptr) ((X509_ALGOR *)OPENSSL_sk_delete_ptr(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr))) +#define sk_X509_ALGOR_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr)) +#define sk_X509_ALGOR_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr)) +#define sk_X509_ALGOR_pop(sk) ((X509_ALGOR *)OPENSSL_sk_pop(ossl_check_X509_ALGOR_sk_type(sk))) +#define sk_X509_ALGOR_shift(sk) ((X509_ALGOR *)OPENSSL_sk_shift(ossl_check_X509_ALGOR_sk_type(sk))) +#define sk_X509_ALGOR_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_ALGOR_sk_type(sk),ossl_check_X509_ALGOR_freefunc_type(freefunc)) +#define sk_X509_ALGOR_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr), (idx)) +#define sk_X509_ALGOR_set(sk, idx, ptr) ((X509_ALGOR *)OPENSSL_sk_set(ossl_check_X509_ALGOR_sk_type(sk), (idx), ossl_check_X509_ALGOR_type(ptr))) +#define sk_X509_ALGOR_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr)) +#define sk_X509_ALGOR_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr)) +#define sk_X509_ALGOR_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr), pnum) +#define sk_X509_ALGOR_sort(sk) OPENSSL_sk_sort(ossl_check_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_dup(sk) ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_dup(ossl_check_const_X509_ALGOR_sk_type(sk))) +#define sk_X509_ALGOR_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_copyfunc_type(copyfunc), ossl_check_X509_ALGOR_freefunc_type(freefunc))) +#define sk_X509_ALGOR_set_cmp_func(sk, cmp) ((sk_X509_ALGOR_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_compfunc_type(cmp))) + +/* clang-format on */ + +#define ASN1_STRING_FLAG_BITS_LEFT 0x08 /* Set if 0x07 has bits left value */ +/* + * This indicates that the ASN1_STRING is not a real value but just a place + * holder for the location where indefinite length constructed data should be + * inserted in the memory buffer + */ +#define ASN1_STRING_FLAG_NDEF 0x010 + +/* + * This flag is used by the CMS code to indicate that a string is not + * complete and is a place holder for content when it had all been accessed. + * The flag will be reset when content has been written to it. + */ + +#define ASN1_STRING_FLAG_CONT 0x020 +/* + * This flag is used by ASN1 code to indicate an ASN1_STRING is an MSTRING + * type. + */ +#define ASN1_STRING_FLAG_MSTRING 0x040 +/* String is embedded and only content should be freed */ +#define ASN1_STRING_FLAG_EMBED 0x080 +/* String should be parsed in RFC 5280's time format */ +#define ASN1_STRING_FLAG_X509_TIME 0x100 +/* This is the base type that holds just about everything :-) */ +struct asn1_string_st { + int length; + int type; + unsigned char *data; + /* + * The value of the following field depends on the type being held. It + * is mostly being used for BIT_STRING so if the input data has a + * non-zero 'unused bits' value, it will be handled correctly + */ + long flags; +}; + +/* + * ASN1_ENCODING structure: this is used to save the received encoding of an + * ASN1 type. This is useful to get round problems with invalid encodings + * which can break signatures. + */ + +typedef struct ASN1_ENCODING_st { + unsigned char *enc; /* DER encoding */ + long len; /* Length of encoding */ + int modified; /* set to 1 if 'enc' is invalid */ +} ASN1_ENCODING; + +/* Used with ASN1 LONG type: if a long is set to this it is omitted */ +#define ASN1_LONG_UNDEF 0x7fffffffL + +#define STABLE_FLAGS_MALLOC 0x01 +/* + * A zero passed to ASN1_STRING_TABLE_new_add for the flags is interpreted + * as "don't change" and STABLE_FLAGS_MALLOC is always set. By setting + * STABLE_FLAGS_MALLOC only we can clear the existing value. Use the alias + * STABLE_FLAGS_CLEAR to reflect this. + */ +#define STABLE_FLAGS_CLEAR STABLE_FLAGS_MALLOC +#define STABLE_NO_MASK 0x02 +#define DIRSTRING_TYPE \ + (B_ASN1_PRINTABLESTRING | B_ASN1_T61STRING | B_ASN1_BMPSTRING | B_ASN1_UTF8STRING) +#define PKCS9STRING_TYPE (DIRSTRING_TYPE | B_ASN1_IA5STRING) + +struct asn1_string_table_st { + int nid; + long minsize; + long maxsize; + unsigned long mask; + unsigned long flags; +}; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_STRING_TABLE, ASN1_STRING_TABLE, ASN1_STRING_TABLE) +#define sk_ASN1_STRING_TABLE_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_value(sk, idx) ((ASN1_STRING_TABLE *)OPENSSL_sk_value(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk), (idx))) +#define sk_ASN1_STRING_TABLE_new(cmp) ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_new(ossl_check_ASN1_STRING_TABLE_compfunc_type(cmp))) +#define sk_ASN1_STRING_TABLE_new_null() ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_new_null()) +#define sk_ASN1_STRING_TABLE_new_reserve(cmp, n) ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_STRING_TABLE_compfunc_type(cmp), (n))) +#define sk_ASN1_STRING_TABLE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_STRING_TABLE_sk_type(sk), (n)) +#define sk_ASN1_STRING_TABLE_free(sk) OPENSSL_sk_free(ossl_check_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_delete(sk, i) ((ASN1_STRING_TABLE *)OPENSSL_sk_delete(ossl_check_ASN1_STRING_TABLE_sk_type(sk), (i))) +#define sk_ASN1_STRING_TABLE_delete_ptr(sk, ptr) ((ASN1_STRING_TABLE *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr))) +#define sk_ASN1_STRING_TABLE_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr)) +#define sk_ASN1_STRING_TABLE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr)) +#define sk_ASN1_STRING_TABLE_pop(sk) ((ASN1_STRING_TABLE *)OPENSSL_sk_pop(ossl_check_ASN1_STRING_TABLE_sk_type(sk))) +#define sk_ASN1_STRING_TABLE_shift(sk) ((ASN1_STRING_TABLE *)OPENSSL_sk_shift(ossl_check_ASN1_STRING_TABLE_sk_type(sk))) +#define sk_ASN1_STRING_TABLE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_STRING_TABLE_sk_type(sk),ossl_check_ASN1_STRING_TABLE_freefunc_type(freefunc)) +#define sk_ASN1_STRING_TABLE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr), (idx)) +#define sk_ASN1_STRING_TABLE_set(sk, idx, ptr) ((ASN1_STRING_TABLE *)OPENSSL_sk_set(ossl_check_ASN1_STRING_TABLE_sk_type(sk), (idx), ossl_check_ASN1_STRING_TABLE_type(ptr))) +#define sk_ASN1_STRING_TABLE_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr)) +#define sk_ASN1_STRING_TABLE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr)) +#define sk_ASN1_STRING_TABLE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr), pnum) +#define sk_ASN1_STRING_TABLE_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_dup(sk) ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_dup(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk))) +#define sk_ASN1_STRING_TABLE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_copyfunc_type(copyfunc), ossl_check_ASN1_STRING_TABLE_freefunc_type(freefunc))) +#define sk_ASN1_STRING_TABLE_set_cmp_func(sk, cmp) ((sk_ASN1_STRING_TABLE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_compfunc_type(cmp))) + +/* clang-format on */ + +/* size limits: this stuff is taken straight from RFC2459 */ + +#define ub_name 32768 +#define ub_common_name 64 +#define ub_locality_name 128 +#define ub_state_name 128 +#define ub_organization_name 64 +#define ub_organization_unit_name 64 +#define ub_title 64 +#define ub_email_address 128 + +/* + * Declarations for template structures: for full definitions see asn1t.h + */ +typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE; +typedef struct ASN1_TLC_st ASN1_TLC; +/* This is just an opaque pointer */ +typedef struct ASN1_VALUE_st ASN1_VALUE; + +/* Declare ASN1 functions: the implement macro is in asn1t.h */ + +/* + * The mysterious 'extern' that's passed to some macros is innocuous, + * and is there to quiet pre-C99 compilers that may complain about empty + * arguments in macro calls. + */ + +#define DECLARE_ASN1_FUNCTIONS_attr(attr, type) \ + DECLARE_ASN1_FUNCTIONS_name_attr(attr, type, type) +#define DECLARE_ASN1_FUNCTIONS(type) \ + DECLARE_ASN1_FUNCTIONS_attr(extern, type) + +#define DECLARE_ASN1_ALLOC_FUNCTIONS_attr(attr, type) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name_attr(attr, type, type) +#define DECLARE_ASN1_ALLOC_FUNCTIONS(type) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_attr(extern, type) + +#define DECLARE_ASN1_FUNCTIONS_name_attr(attr, type, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name_attr(attr, type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_name_attr(attr, type, name) +#define DECLARE_ASN1_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_FUNCTIONS_name_attr(extern, type, name) + +#define DECLARE_ASN1_ENCODE_FUNCTIONS_attr(attr, type, itname, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(attr, type, name) \ + DECLARE_ASN1_ITEM_attr(attr, itname) +#define DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_attr(extern, type, itname, name) + +#define DECLARE_ASN1_ENCODE_FUNCTIONS_name_attr(attr, type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_attr(attr, type, name, name) +#define DECLARE_ASN1_ENCODE_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_name_attr(extern, type, name) + +#define DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(attr, type, name) \ + attr type *d2i_##name(type **a, const unsigned char **in, long len); \ + attr int i2d_##name(const type *a, unsigned char **out); +#define DECLARE_ASN1_ENCODE_FUNCTIONS_only(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(extern, type, name) + +#define DECLARE_ASN1_NDEF_FUNCTION_attr(attr, name) \ + attr int i2d_##name##_NDEF(const name *a, unsigned char **out); +#define DECLARE_ASN1_NDEF_FUNCTION(name) \ + DECLARE_ASN1_NDEF_FUNCTION_attr(extern, name) + +#define DECLARE_ASN1_ALLOC_FUNCTIONS_name_attr(attr, type, name) \ + attr type *name##_new(void); \ + attr void name##_free(type *a); +#define DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name_attr(extern, type, name) + +#define DECLARE_ASN1_DUP_FUNCTION_attr(attr, type) \ + DECLARE_ASN1_DUP_FUNCTION_name_attr(attr, type, type) +#define DECLARE_ASN1_DUP_FUNCTION(type) \ + DECLARE_ASN1_DUP_FUNCTION_attr(extern, type) + +#define DECLARE_ASN1_DUP_FUNCTION_name_attr(attr, type, name) \ + attr type *name##_dup(const type *a); +#define DECLARE_ASN1_DUP_FUNCTION_name(type, name) \ + DECLARE_ASN1_DUP_FUNCTION_name_attr(extern, type, name) + +#define DECLARE_ASN1_PRINT_FUNCTION_attr(attr, stname) \ + DECLARE_ASN1_PRINT_FUNCTION_fname_attr(attr, stname, stname) +#define DECLARE_ASN1_PRINT_FUNCTION(stname) \ + DECLARE_ASN1_PRINT_FUNCTION_attr(extern, stname) + +#define DECLARE_ASN1_PRINT_FUNCTION_fname_attr(attr, stname, fname) \ + attr int fname##_print_ctx(BIO *out, const stname *x, int indent, \ + const ASN1_PCTX *pctx); +#define DECLARE_ASN1_PRINT_FUNCTION_fname(stname, fname) \ + DECLARE_ASN1_PRINT_FUNCTION_fname_attr(extern, stname, fname) + +#define D2I_OF(type) type *(*)(type **, const unsigned char **, long) +#define I2D_OF(type) int (*)(const type *, unsigned char **) + +#define CHECKED_D2I_OF(type, d2i) \ + ((d2i_of_void *)(1 ? d2i : ((D2I_OF(type))0))) +#define CHECKED_I2D_OF(type, i2d) \ + ((i2d_of_void *)(1 ? i2d : ((I2D_OF(type))0))) +#define CHECKED_NEW_OF(type, xnew) \ + ((void *(*)(void))(1 ? xnew : ((type * (*)(void))0))) +#define CHECKED_PTR_OF(type, p) \ + ((void *)(1 ? p : (type *)0)) +#define CHECKED_PPTR_OF(type, p) \ + ((void **)(1 ? p : (type **)0)) + +#define TYPEDEF_D2I_OF(type) typedef type *d2i_of_##type(type **, const unsigned char **, long) +#define TYPEDEF_I2D_OF(type) typedef int i2d_of_##type(const type *, unsigned char **) +#define TYPEDEF_D2I2D_OF(type) \ + TYPEDEF_D2I_OF(type); \ + TYPEDEF_I2D_OF(type) + +typedef void *d2i_of_void(void **, const unsigned char **, long); +typedef int i2d_of_void(const void *, unsigned char **); +typedef int OSSL_i2d_of_void_ctx(const void *, unsigned char **, void *vctx); + +/*- + * The following macros and typedefs allow an ASN1_ITEM + * to be embedded in a structure and referenced. Since + * the ASN1_ITEM pointers need to be globally accessible + * (possibly from shared libraries) they may exist in + * different forms. On platforms that support it the + * ASN1_ITEM structure itself will be globally exported. + * Other platforms will export a function that returns + * an ASN1_ITEM pointer. + * + * To handle both cases transparently the macros below + * should be used instead of hard coding an ASN1_ITEM + * pointer in a structure. + * + * The structure will look like this: + * + * typedef struct SOMETHING_st { + * ... + * ASN1_ITEM_EXP *iptr; + * ... + * } SOMETHING; + * + * It would be initialised as e.g.: + * + * SOMETHING somevar = {...,ASN1_ITEM_ref(X509),...}; + * + * and the actual pointer extracted with: + * + * const ASN1_ITEM *it = ASN1_ITEM_ptr(somevar.iptr); + * + * Finally an ASN1_ITEM pointer can be extracted from an + * appropriate reference with: ASN1_ITEM_rptr(X509). This + * would be used when a function takes an ASN1_ITEM * argument. + * + */ + +/* + * Platforms that can't easily handle shared global variables are declared as + * functions returning ASN1_ITEM pointers. + */ + +/* ASN1_ITEM pointer exported type */ +typedef const ASN1_ITEM *ASN1_ITEM_EXP(void); + +/* Macro to obtain ASN1_ITEM pointer from exported type */ +#define ASN1_ITEM_ptr(iptr) (iptr()) + +/* Macro to include ASN1_ITEM pointer from base type */ +#define ASN1_ITEM_ref(iptr) (iptr##_it) + +#define ASN1_ITEM_rptr(ref) (ref##_it()) + +#define DECLARE_ASN1_ITEM_attr(attr, name) \ + attr const ASN1_ITEM *name##_it(void); +#define DECLARE_ASN1_ITEM(name) \ + DECLARE_ASN1_ITEM_attr(extern, name) + +/* Parameters used by ASN1_STRING_print_ex() */ + +/* + * These determine which characters to escape: RFC2253 special characters, + * control characters and MSB set characters + */ + +#define ASN1_STRFLGS_ESC_2253 1 +#define ASN1_STRFLGS_ESC_CTRL 2 +#define ASN1_STRFLGS_ESC_MSB 4 + +/* Lower 8 bits are reserved as an output type specifier */ +#define ASN1_DTFLGS_TYPE_MASK 0x0FUL +#define ASN1_DTFLGS_RFC822 0x00UL +#define ASN1_DTFLGS_ISO8601 0x01UL + +/* + * This flag determines how we do escaping: normally RC2253 backslash only, + * set this to use backslash and quote. + */ + +#define ASN1_STRFLGS_ESC_QUOTE 8 + +/* These three flags are internal use only. */ + +/* Character is a valid PrintableString character */ +#define CHARTYPE_PRINTABLESTRING 0x10 +/* Character needs escaping if it is the first character */ +#define CHARTYPE_FIRST_ESC_2253 0x20 +/* Character needs escaping if it is the last character */ +#define CHARTYPE_LAST_ESC_2253 0x40 + +/* + * NB the internal flags are safely reused below by flags handled at the top + * level. + */ + +/* + * If this is set we convert all character strings to UTF8 first + */ + +#define ASN1_STRFLGS_UTF8_CONVERT 0x10 + +/* + * If this is set we don't attempt to interpret content: just assume all + * strings are 1 byte per character. This will produce some pretty odd + * looking output! + */ + +#define ASN1_STRFLGS_IGNORE_TYPE 0x20 + +/* If this is set we include the string type in the output */ +#define ASN1_STRFLGS_SHOW_TYPE 0x40 + +/* + * This determines which strings to display and which to 'dump' (hex dump of + * content octets or DER encoding). We can only dump non character strings or + * everything. If we don't dump 'unknown' they are interpreted as character + * strings with 1 octet per character and are subject to the usual escaping + * options. + */ + +#define ASN1_STRFLGS_DUMP_ALL 0x80 +#define ASN1_STRFLGS_DUMP_UNKNOWN 0x100 + +/* + * These determine what 'dumping' does, we can dump the content octets or the + * DER encoding: both use the RFC2253 #XXXXX notation. + */ + +#define ASN1_STRFLGS_DUMP_DER 0x200 + +/* + * This flag specifies that RC2254 escaping shall be performed. + */ +#define ASN1_STRFLGS_ESC_2254 0x400 + +/* + * All the string flags consistent with RFC2253, escaping control characters + * isn't essential in RFC2253 but it is advisable anyway. + */ + +#define ASN1_STRFLGS_RFC2253 (ASN1_STRFLGS_ESC_2253 | ASN1_STRFLGS_ESC_CTRL | ASN1_STRFLGS_ESC_MSB | ASN1_STRFLGS_UTF8_CONVERT | ASN1_STRFLGS_DUMP_UNKNOWN | ASN1_STRFLGS_DUMP_DER) + +struct asn1_type_st { + int type; + union { + char *ptr; + ASN1_BOOLEAN boolean; + ASN1_STRING *asn1_string; + ASN1_OBJECT *object; + ASN1_INTEGER *integer; + ASN1_ENUMERATED *enumerated; + ASN1_BIT_STRING *bit_string; + ASN1_OCTET_STRING *octet_string; + ASN1_PRINTABLESTRING *printablestring; + ASN1_T61STRING *t61string; + ASN1_IA5STRING *ia5string; + ASN1_GENERALSTRING *generalstring; + ASN1_BMPSTRING *bmpstring; + ASN1_UNIVERSALSTRING *universalstring; + ASN1_UTCTIME *utctime; + ASN1_GENERALIZEDTIME *generalizedtime; + ASN1_VISIBLESTRING *visiblestring; + ASN1_UTF8STRING *utf8string; + /* + * set and sequence are left complete and still contain the set or + * sequence bytes + */ + ASN1_STRING *set; + ASN1_STRING *sequence; + ASN1_VALUE *asn1_value; + } value; +}; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_TYPE, ASN1_TYPE, ASN1_TYPE) +#define sk_ASN1_TYPE_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_value(sk, idx) ((ASN1_TYPE *)OPENSSL_sk_value(ossl_check_const_ASN1_TYPE_sk_type(sk), (idx))) +#define sk_ASN1_TYPE_new(cmp) ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_new(ossl_check_ASN1_TYPE_compfunc_type(cmp))) +#define sk_ASN1_TYPE_new_null() ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_new_null()) +#define sk_ASN1_TYPE_new_reserve(cmp, n) ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_TYPE_compfunc_type(cmp), (n))) +#define sk_ASN1_TYPE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_TYPE_sk_type(sk), (n)) +#define sk_ASN1_TYPE_free(sk) OPENSSL_sk_free(ossl_check_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_delete(sk, i) ((ASN1_TYPE *)OPENSSL_sk_delete(ossl_check_ASN1_TYPE_sk_type(sk), (i))) +#define sk_ASN1_TYPE_delete_ptr(sk, ptr) ((ASN1_TYPE *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr))) +#define sk_ASN1_TYPE_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr)) +#define sk_ASN1_TYPE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr)) +#define sk_ASN1_TYPE_pop(sk) ((ASN1_TYPE *)OPENSSL_sk_pop(ossl_check_ASN1_TYPE_sk_type(sk))) +#define sk_ASN1_TYPE_shift(sk) ((ASN1_TYPE *)OPENSSL_sk_shift(ossl_check_ASN1_TYPE_sk_type(sk))) +#define sk_ASN1_TYPE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_TYPE_sk_type(sk),ossl_check_ASN1_TYPE_freefunc_type(freefunc)) +#define sk_ASN1_TYPE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr), (idx)) +#define sk_ASN1_TYPE_set(sk, idx, ptr) ((ASN1_TYPE *)OPENSSL_sk_set(ossl_check_ASN1_TYPE_sk_type(sk), (idx), ossl_check_ASN1_TYPE_type(ptr))) +#define sk_ASN1_TYPE_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr)) +#define sk_ASN1_TYPE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr)) +#define sk_ASN1_TYPE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr), pnum) +#define sk_ASN1_TYPE_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_dup(sk) ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_dup(ossl_check_const_ASN1_TYPE_sk_type(sk))) +#define sk_ASN1_TYPE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_copyfunc_type(copyfunc), ossl_check_ASN1_TYPE_freefunc_type(freefunc))) +#define sk_ASN1_TYPE_set_cmp_func(sk, cmp) ((sk_ASN1_TYPE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(ASN1_TYPE) ASN1_SEQUENCE_ANY; + +DECLARE_ASN1_ENCODE_FUNCTIONS_name(ASN1_SEQUENCE_ANY, ASN1_SEQUENCE_ANY) +DECLARE_ASN1_ENCODE_FUNCTIONS_name(ASN1_SEQUENCE_ANY, ASN1_SET_ANY) + +/* This is used to contain a list of bit names */ +typedef struct BIT_STRING_BITNAME_st { + int bitnum; + const char *lname; + const char *sname; +} BIT_STRING_BITNAME; + +#define B_ASN1_TIME \ + B_ASN1_UTCTIME | B_ASN1_GENERALIZEDTIME + +#define B_ASN1_PRINTABLE \ + B_ASN1_NUMERICSTRING | B_ASN1_PRINTABLESTRING | B_ASN1_T61STRING | B_ASN1_IA5STRING | B_ASN1_BIT_STRING | B_ASN1_UNIVERSALSTRING | B_ASN1_BMPSTRING | B_ASN1_UTF8STRING | B_ASN1_SEQUENCE | B_ASN1_UNKNOWN + +#define B_ASN1_DIRECTORYSTRING \ + B_ASN1_PRINTABLESTRING | B_ASN1_TELETEXSTRING | B_ASN1_BMPSTRING | B_ASN1_UNIVERSALSTRING | B_ASN1_UTF8STRING + +#define B_ASN1_DISPLAYTEXT \ + B_ASN1_IA5STRING | B_ASN1_VISIBLESTRING | B_ASN1_BMPSTRING | B_ASN1_UTF8STRING + +DECLARE_ASN1_ALLOC_FUNCTIONS_name(ASN1_TYPE, ASN1_TYPE) +DECLARE_ASN1_ENCODE_FUNCTIONS(ASN1_TYPE, ASN1_ANY, ASN1_TYPE) + +int ASN1_TYPE_get(const ASN1_TYPE *a); +void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value); +int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value); +int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b); + +ASN1_TYPE *ASN1_TYPE_pack_sequence(const ASN1_ITEM *it, void *s, ASN1_TYPE **t); +void *ASN1_TYPE_unpack_sequence(const ASN1_ITEM *it, const ASN1_TYPE *t); + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_OBJECT, ASN1_OBJECT, ASN1_OBJECT) +#define sk_ASN1_OBJECT_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_value(sk, idx) ((ASN1_OBJECT *)OPENSSL_sk_value(ossl_check_const_ASN1_OBJECT_sk_type(sk), (idx))) +#define sk_ASN1_OBJECT_new(cmp) ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_new(ossl_check_ASN1_OBJECT_compfunc_type(cmp))) +#define sk_ASN1_OBJECT_new_null() ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_new_null()) +#define sk_ASN1_OBJECT_new_reserve(cmp, n) ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_OBJECT_compfunc_type(cmp), (n))) +#define sk_ASN1_OBJECT_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_OBJECT_sk_type(sk), (n)) +#define sk_ASN1_OBJECT_free(sk) OPENSSL_sk_free(ossl_check_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_delete(sk, i) ((ASN1_OBJECT *)OPENSSL_sk_delete(ossl_check_ASN1_OBJECT_sk_type(sk), (i))) +#define sk_ASN1_OBJECT_delete_ptr(sk, ptr) ((ASN1_OBJECT *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr))) +#define sk_ASN1_OBJECT_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr)) +#define sk_ASN1_OBJECT_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr)) +#define sk_ASN1_OBJECT_pop(sk) ((ASN1_OBJECT *)OPENSSL_sk_pop(ossl_check_ASN1_OBJECT_sk_type(sk))) +#define sk_ASN1_OBJECT_shift(sk) ((ASN1_OBJECT *)OPENSSL_sk_shift(ossl_check_ASN1_OBJECT_sk_type(sk))) +#define sk_ASN1_OBJECT_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_OBJECT_sk_type(sk),ossl_check_ASN1_OBJECT_freefunc_type(freefunc)) +#define sk_ASN1_OBJECT_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr), (idx)) +#define sk_ASN1_OBJECT_set(sk, idx, ptr) ((ASN1_OBJECT *)OPENSSL_sk_set(ossl_check_ASN1_OBJECT_sk_type(sk), (idx), ossl_check_ASN1_OBJECT_type(ptr))) +#define sk_ASN1_OBJECT_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr)) +#define sk_ASN1_OBJECT_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr)) +#define sk_ASN1_OBJECT_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr), pnum) +#define sk_ASN1_OBJECT_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_dup(sk) ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_dup(ossl_check_const_ASN1_OBJECT_sk_type(sk))) +#define sk_ASN1_OBJECT_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_copyfunc_type(copyfunc), ossl_check_ASN1_OBJECT_freefunc_type(freefunc))) +#define sk_ASN1_OBJECT_set_cmp_func(sk, cmp) ((sk_ASN1_OBJECT_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_FUNCTIONS(ASN1_OBJECT) + +ASN1_STRING *ASN1_STRING_new(void); +void ASN1_STRING_free(ASN1_STRING *a); +void ASN1_STRING_clear_free(ASN1_STRING *a); +int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str); +DECLARE_ASN1_DUP_FUNCTION(ASN1_STRING) +ASN1_STRING *ASN1_STRING_type_new(int type); +int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b); +/* + * Since this is used to store all sorts of things, via macros, for now, + * make its data void * + */ +int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len); +void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len); +int ASN1_STRING_length(const ASN1_STRING *x); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 void ASN1_STRING_length_set(ASN1_STRING *x, int n); +#endif +int ASN1_STRING_type(const ASN1_STRING *x); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 unsigned char *ASN1_STRING_data(ASN1_STRING *x); +#endif +const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *x); + +DECLARE_ASN1_FUNCTIONS(ASN1_BIT_STRING) +int ASN1_BIT_STRING_set(ASN1_BIT_STRING *a, unsigned char *d, int length); +int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value); +int ASN1_BIT_STRING_get_bit(const ASN1_BIT_STRING *a, int n); +int ASN1_BIT_STRING_check(const ASN1_BIT_STRING *a, + const unsigned char *flags, int flags_len); + +int ASN1_BIT_STRING_name_print(BIO *out, ASN1_BIT_STRING *bs, + BIT_STRING_BITNAME *tbl, int indent); +int ASN1_BIT_STRING_num_asc(const char *name, BIT_STRING_BITNAME *tbl); +int ASN1_BIT_STRING_set_asc(ASN1_BIT_STRING *bs, const char *name, int value, + BIT_STRING_BITNAME *tbl); + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_INTEGER, ASN1_INTEGER, ASN1_INTEGER) +#define sk_ASN1_INTEGER_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_value(sk, idx) ((ASN1_INTEGER *)OPENSSL_sk_value(ossl_check_const_ASN1_INTEGER_sk_type(sk), (idx))) +#define sk_ASN1_INTEGER_new(cmp) ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_new(ossl_check_ASN1_INTEGER_compfunc_type(cmp))) +#define sk_ASN1_INTEGER_new_null() ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_new_null()) +#define sk_ASN1_INTEGER_new_reserve(cmp, n) ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_INTEGER_compfunc_type(cmp), (n))) +#define sk_ASN1_INTEGER_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_INTEGER_sk_type(sk), (n)) +#define sk_ASN1_INTEGER_free(sk) OPENSSL_sk_free(ossl_check_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_delete(sk, i) ((ASN1_INTEGER *)OPENSSL_sk_delete(ossl_check_ASN1_INTEGER_sk_type(sk), (i))) +#define sk_ASN1_INTEGER_delete_ptr(sk, ptr) ((ASN1_INTEGER *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr))) +#define sk_ASN1_INTEGER_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr)) +#define sk_ASN1_INTEGER_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr)) +#define sk_ASN1_INTEGER_pop(sk) ((ASN1_INTEGER *)OPENSSL_sk_pop(ossl_check_ASN1_INTEGER_sk_type(sk))) +#define sk_ASN1_INTEGER_shift(sk) ((ASN1_INTEGER *)OPENSSL_sk_shift(ossl_check_ASN1_INTEGER_sk_type(sk))) +#define sk_ASN1_INTEGER_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_INTEGER_sk_type(sk),ossl_check_ASN1_INTEGER_freefunc_type(freefunc)) +#define sk_ASN1_INTEGER_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr), (idx)) +#define sk_ASN1_INTEGER_set(sk, idx, ptr) ((ASN1_INTEGER *)OPENSSL_sk_set(ossl_check_ASN1_INTEGER_sk_type(sk), (idx), ossl_check_ASN1_INTEGER_type(ptr))) +#define sk_ASN1_INTEGER_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr)) +#define sk_ASN1_INTEGER_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr)) +#define sk_ASN1_INTEGER_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr), pnum) +#define sk_ASN1_INTEGER_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_dup(sk) ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_dup(ossl_check_const_ASN1_INTEGER_sk_type(sk))) +#define sk_ASN1_INTEGER_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_copyfunc_type(copyfunc), ossl_check_ASN1_INTEGER_freefunc_type(freefunc))) +#define sk_ASN1_INTEGER_set_cmp_func(sk, cmp) ((sk_ASN1_INTEGER_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_FUNCTIONS(ASN1_INTEGER) +ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp, + long length); +DECLARE_ASN1_DUP_FUNCTION(ASN1_INTEGER) +int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y); + +DECLARE_ASN1_FUNCTIONS(ASN1_ENUMERATED) + +int ASN1_UTCTIME_check(const ASN1_UTCTIME *a); +ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t); +ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str); +int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t); + +int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *a); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s, + time_t t); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, + time_t t, int offset_day, + long offset_sec); +int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str); + +int ASN1_TIME_diff(int *pday, int *psec, + const ASN1_TIME *from, const ASN1_TIME *to); + +DECLARE_ASN1_FUNCTIONS(ASN1_OCTET_STRING) +DECLARE_ASN1_DUP_FUNCTION(ASN1_OCTET_STRING) +int ASN1_OCTET_STRING_cmp(const ASN1_OCTET_STRING *a, + const ASN1_OCTET_STRING *b); +int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *str, const unsigned char *data, + int len); + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_UTF8STRING, ASN1_UTF8STRING, ASN1_UTF8STRING) +#define sk_ASN1_UTF8STRING_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_value(sk, idx) ((ASN1_UTF8STRING *)OPENSSL_sk_value(ossl_check_const_ASN1_UTF8STRING_sk_type(sk), (idx))) +#define sk_ASN1_UTF8STRING_new(cmp) ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_new(ossl_check_ASN1_UTF8STRING_compfunc_type(cmp))) +#define sk_ASN1_UTF8STRING_new_null() ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_new_null()) +#define sk_ASN1_UTF8STRING_new_reserve(cmp, n) ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_UTF8STRING_compfunc_type(cmp), (n))) +#define sk_ASN1_UTF8STRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_UTF8STRING_sk_type(sk), (n)) +#define sk_ASN1_UTF8STRING_free(sk) OPENSSL_sk_free(ossl_check_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_delete(sk, i) ((ASN1_UTF8STRING *)OPENSSL_sk_delete(ossl_check_ASN1_UTF8STRING_sk_type(sk), (i))) +#define sk_ASN1_UTF8STRING_delete_ptr(sk, ptr) ((ASN1_UTF8STRING *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr))) +#define sk_ASN1_UTF8STRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr)) +#define sk_ASN1_UTF8STRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr)) +#define sk_ASN1_UTF8STRING_pop(sk) ((ASN1_UTF8STRING *)OPENSSL_sk_pop(ossl_check_ASN1_UTF8STRING_sk_type(sk))) +#define sk_ASN1_UTF8STRING_shift(sk) ((ASN1_UTF8STRING *)OPENSSL_sk_shift(ossl_check_ASN1_UTF8STRING_sk_type(sk))) +#define sk_ASN1_UTF8STRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_UTF8STRING_sk_type(sk),ossl_check_ASN1_UTF8STRING_freefunc_type(freefunc)) +#define sk_ASN1_UTF8STRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr), (idx)) +#define sk_ASN1_UTF8STRING_set(sk, idx, ptr) ((ASN1_UTF8STRING *)OPENSSL_sk_set(ossl_check_ASN1_UTF8STRING_sk_type(sk), (idx), ossl_check_ASN1_UTF8STRING_type(ptr))) +#define sk_ASN1_UTF8STRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr)) +#define sk_ASN1_UTF8STRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr)) +#define sk_ASN1_UTF8STRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr), pnum) +#define sk_ASN1_UTF8STRING_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_dup(sk) ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_dup(ossl_check_const_ASN1_UTF8STRING_sk_type(sk))) +#define sk_ASN1_UTF8STRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_copyfunc_type(copyfunc), ossl_check_ASN1_UTF8STRING_freefunc_type(freefunc))) +#define sk_ASN1_UTF8STRING_set_cmp_func(sk, cmp) ((sk_ASN1_UTF8STRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_FUNCTIONS(ASN1_VISIBLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UNIVERSALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTF8STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_NULL) +DECLARE_ASN1_FUNCTIONS(ASN1_BMPSTRING) + +int UTF8_getc(const unsigned char *str, int len, unsigned long *val); +int UTF8_putc(unsigned char *str, int len, unsigned long value); + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_GENERALSTRING, ASN1_GENERALSTRING, ASN1_GENERALSTRING) +#define sk_ASN1_GENERALSTRING_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_value(sk, idx) ((ASN1_GENERALSTRING *)OPENSSL_sk_value(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk), (idx))) +#define sk_ASN1_GENERALSTRING_new(cmp) ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_new(ossl_check_ASN1_GENERALSTRING_compfunc_type(cmp))) +#define sk_ASN1_GENERALSTRING_new_null() ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_new_null()) +#define sk_ASN1_GENERALSTRING_new_reserve(cmp, n) ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_GENERALSTRING_compfunc_type(cmp), (n))) +#define sk_ASN1_GENERALSTRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_GENERALSTRING_sk_type(sk), (n)) +#define sk_ASN1_GENERALSTRING_free(sk) OPENSSL_sk_free(ossl_check_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_delete(sk, i) ((ASN1_GENERALSTRING *)OPENSSL_sk_delete(ossl_check_ASN1_GENERALSTRING_sk_type(sk), (i))) +#define sk_ASN1_GENERALSTRING_delete_ptr(sk, ptr) ((ASN1_GENERALSTRING *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr))) +#define sk_ASN1_GENERALSTRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr)) +#define sk_ASN1_GENERALSTRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr)) +#define sk_ASN1_GENERALSTRING_pop(sk) ((ASN1_GENERALSTRING *)OPENSSL_sk_pop(ossl_check_ASN1_GENERALSTRING_sk_type(sk))) +#define sk_ASN1_GENERALSTRING_shift(sk) ((ASN1_GENERALSTRING *)OPENSSL_sk_shift(ossl_check_ASN1_GENERALSTRING_sk_type(sk))) +#define sk_ASN1_GENERALSTRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_GENERALSTRING_sk_type(sk),ossl_check_ASN1_GENERALSTRING_freefunc_type(freefunc)) +#define sk_ASN1_GENERALSTRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr), (idx)) +#define sk_ASN1_GENERALSTRING_set(sk, idx, ptr) ((ASN1_GENERALSTRING *)OPENSSL_sk_set(ossl_check_ASN1_GENERALSTRING_sk_type(sk), (idx), ossl_check_ASN1_GENERALSTRING_type(ptr))) +#define sk_ASN1_GENERALSTRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr)) +#define sk_ASN1_GENERALSTRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr)) +#define sk_ASN1_GENERALSTRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr), pnum) +#define sk_ASN1_GENERALSTRING_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_dup(sk) ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_dup(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk))) +#define sk_ASN1_GENERALSTRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_copyfunc_type(copyfunc), ossl_check_ASN1_GENERALSTRING_freefunc_type(freefunc))) +#define sk_ASN1_GENERALSTRING_set_cmp_func(sk, cmp) ((sk_ASN1_GENERALSTRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, ASN1_PRINTABLE) + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DIRECTORYSTRING) +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DISPLAYTEXT) +DECLARE_ASN1_FUNCTIONS(ASN1_PRINTABLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_T61STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_IA5STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTCTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALIZEDTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_TIME) + +DECLARE_ASN1_DUP_FUNCTION(ASN1_TIME) +DECLARE_ASN1_DUP_FUNCTION(ASN1_UTCTIME) +DECLARE_ASN1_DUP_FUNCTION(ASN1_GENERALIZEDTIME) + +DECLARE_ASN1_ITEM(ASN1_OCTET_STRING_NDEF) + +ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t); +ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_TIME_check(const ASN1_TIME *t); +ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(const ASN1_TIME *t, + ASN1_GENERALIZEDTIME **out); +int ASN1_TIME_set_string(ASN1_TIME *s, const char *str); +int ASN1_TIME_set_string_X509(ASN1_TIME *s, const char *str); +int ASN1_TIME_to_tm(const ASN1_TIME *s, struct tm *tm); +int ASN1_TIME_normalize(ASN1_TIME *s); +int ASN1_TIME_cmp_time_t(const ASN1_TIME *s, time_t t); +int ASN1_TIME_compare(const ASN1_TIME *a, const ASN1_TIME *b); + +int i2a_ASN1_INTEGER(BIO *bp, const ASN1_INTEGER *a); +int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size); +int i2a_ASN1_ENUMERATED(BIO *bp, const ASN1_ENUMERATED *a); +int a2i_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *bs, char *buf, int size); +int i2a_ASN1_OBJECT(BIO *bp, const ASN1_OBJECT *a); +int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size); +int i2a_ASN1_STRING(BIO *bp, const ASN1_STRING *a, int type); +int i2t_ASN1_OBJECT(char *buf, int buf_len, const ASN1_OBJECT *a); + +int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num); +ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data, int len, + const char *sn, const char *ln); + +int ASN1_INTEGER_get_int64(int64_t *pr, const ASN1_INTEGER *a); +int ASN1_INTEGER_set_int64(ASN1_INTEGER *a, int64_t r); +int ASN1_INTEGER_get_uint64(uint64_t *pr, const ASN1_INTEGER *a); +int ASN1_INTEGER_set_uint64(ASN1_INTEGER *a, uint64_t r); + +int ASN1_INTEGER_set(ASN1_INTEGER *a, long v); +long ASN1_INTEGER_get(const ASN1_INTEGER *a); +ASN1_INTEGER *BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN1_INTEGER *ai); +BIGNUM *ASN1_INTEGER_to_BN(const ASN1_INTEGER *ai, BIGNUM *bn); + +int ASN1_ENUMERATED_get_int64(int64_t *pr, const ASN1_ENUMERATED *a); +int ASN1_ENUMERATED_set_int64(ASN1_ENUMERATED *a, int64_t r); + +int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v); +long ASN1_ENUMERATED_get(const ASN1_ENUMERATED *a); +ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(const BIGNUM *bn, ASN1_ENUMERATED *ai); +BIGNUM *ASN1_ENUMERATED_to_BN(const ASN1_ENUMERATED *ai, BIGNUM *bn); + +/* General */ +/* given a string, return the correct type, max is the maximum length */ +int ASN1_PRINTABLE_type(const unsigned char *s, int max); + +unsigned long ASN1_tag2bit(int tag); + +/* SPECIALS */ +int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag, + int *pclass, long omax); +int ASN1_check_infinite_end(unsigned char **p, long len); +int ASN1_const_check_infinite_end(const unsigned char **p, long len); +void ASN1_put_object(unsigned char **pp, int constructed, int length, + int tag, int xclass); +int ASN1_put_eoc(unsigned char **pp); +int ASN1_object_size(int constructed, int length, int tag); + +/* Used to implement other functions */ +void *ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, const void *x); + +#define ASN1_dup_of(type, i2d, d2i, x) \ + ((type *)ASN1_dup(CHECKED_I2D_OF(type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(const type, x))) + +void *ASN1_item_dup(const ASN1_ITEM *it, const void *x); +int ASN1_item_sign_ex(const ASN1_ITEM *it, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + const void *data, const ASN1_OCTET_STRING *id, + EVP_PKEY *pkey, const EVP_MD *md, OSSL_LIB_CTX *libctx, + const char *propq); +int ASN1_item_verify_ex(const ASN1_ITEM *it, const X509_ALGOR *alg, + const ASN1_BIT_STRING *signature, const void *data, + const ASN1_OCTET_STRING *id, EVP_PKEY *pkey, + OSSL_LIB_CTX *libctx, const char *propq); + +/* ASN1 alloc/free macros for when a type is only used internally */ + +#define M_ASN1_new_of(type) (type *)ASN1_item_new(ASN1_ITEM_rptr(type)) +#define M_ASN1_free_of(x, type) \ + ASN1_item_free(CHECKED_PTR_OF(type, x), ASN1_ITEM_rptr(type)) + +#ifndef OPENSSL_NO_STDIO +void *ASN1_d2i_fp(void *(*xnew)(void), d2i_of_void *d2i, FILE *in, void **x); + +#define ASN1_d2i_fp_of(type, xnew, d2i, in, x) \ + ((type *)ASN1_d2i_fp(CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_fp_ex(const ASN1_ITEM *it, FILE *in, void *x, + OSSL_LIB_CTX *libctx, const char *propq); +void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x); +int ASN1_i2d_fp(i2d_of_void *i2d, FILE *out, const void *x); + +#define ASN1_i2d_fp_of(type, i2d, out, x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, const void *x); +int ASN1_STRING_print_ex_fp(FILE *fp, const ASN1_STRING *str, unsigned long flags); +#endif + +int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in); + +void *ASN1_d2i_bio(void *(*xnew)(void), d2i_of_void *d2i, BIO *in, void **x); + +#define ASN1_d2i_bio_of(type, xnew, d2i, in, x) \ + ((type *)ASN1_d2i_bio(CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_bio_ex(const ASN1_ITEM *it, BIO *in, void *pval, + OSSL_LIB_CTX *libctx, const char *propq); +void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *pval); +int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, const void *x); + +#define ASN1_i2d_bio_of(type, i2d, out, x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, const void *x); +BIO *ASN1_item_i2d_mem_bio(const ASN1_ITEM *it, const ASN1_VALUE *val); +int ASN1_UTCTIME_print(BIO *fp, const ASN1_UTCTIME *a); +int ASN1_GENERALIZEDTIME_print(BIO *fp, const ASN1_GENERALIZEDTIME *a); +int ASN1_TIME_print(BIO *bp, const ASN1_TIME *tm); +int ASN1_TIME_print_ex(BIO *bp, const ASN1_TIME *tm, unsigned long flags); +int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v); +int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, unsigned long flags); +int ASN1_buf_print(BIO *bp, const unsigned char *buf, size_t buflen, int off); +int ASN1_bn_print(BIO *bp, const char *number, const BIGNUM *num, + unsigned char *buf, int off); +int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent); +int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent, + int dump); +const char *ASN1_tag2str(int tag); + +/* Used to load and write Netscape format cert */ + +int ASN1_UNIVERSALSTRING_to_string(ASN1_UNIVERSALSTRING *s); + +int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, unsigned char *data, int len); +int ASN1_TYPE_get_octetstring(const ASN1_TYPE *a, unsigned char *data, int max_len); +int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, + unsigned char *data, int len); +int ASN1_TYPE_get_int_octetstring(const ASN1_TYPE *a, long *num, + unsigned char *data, int max_len); + +void *ASN1_item_unpack(const ASN1_STRING *oct, const ASN1_ITEM *it); +void *ASN1_item_unpack_ex(const ASN1_STRING *oct, const ASN1_ITEM *it, + OSSL_LIB_CTX *libctx, const char *propq); + +ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, + ASN1_OCTET_STRING **oct); + +void ASN1_STRING_set_default_mask(unsigned long mask); +int ASN1_STRING_set_default_mask_asc(const char *p); +unsigned long ASN1_STRING_get_default_mask(void); +int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask); +int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask, + long minsize, long maxsize); + +ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, + const unsigned char *in, int inlen, + int inform, int nid); +ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid); +int ASN1_STRING_TABLE_add(int, long, long, unsigned long, unsigned long); +void ASN1_STRING_TABLE_cleanup(void); + +/* ASN1 template functions */ + +/* Old API compatible functions */ +ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it); +ASN1_VALUE *ASN1_item_new_ex(const ASN1_ITEM *it, OSSL_LIB_CTX *libctx, + const char *propq); +void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it); +ASN1_VALUE *ASN1_item_d2i_ex(ASN1_VALUE **val, const unsigned char **in, + long len, const ASN1_ITEM *it, + OSSL_LIB_CTX *libctx, const char *propq); +ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **val, const unsigned char **in, + long len, const ASN1_ITEM *it); +int ASN1_item_i2d(const ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it); +int ASN1_item_ndef_i2d(const ASN1_VALUE *val, unsigned char **out, + const ASN1_ITEM *it); + +void ASN1_add_oid_module(void); +void ASN1_add_stable_module(void); + +ASN1_TYPE *ASN1_generate_nconf(const char *str, CONF *nconf); +ASN1_TYPE *ASN1_generate_v3(const char *str, X509V3_CTX *cnf); +int ASN1_str2mask(const char *str, unsigned long *pmask); + +/* ASN1 Print flags */ + +/* Indicate missing OPTIONAL fields */ +#define ASN1_PCTX_FLAGS_SHOW_ABSENT 0x001 +/* Mark start and end of SEQUENCE */ +#define ASN1_PCTX_FLAGS_SHOW_SEQUENCE 0x002 +/* Mark start and end of SEQUENCE/SET OF */ +#define ASN1_PCTX_FLAGS_SHOW_SSOF 0x004 +/* Show the ASN1 type of primitives */ +#define ASN1_PCTX_FLAGS_SHOW_TYPE 0x008 +/* Don't show ASN1 type of ANY */ +#define ASN1_PCTX_FLAGS_NO_ANY_TYPE 0x010 +/* Don't show ASN1 type of MSTRINGs */ +#define ASN1_PCTX_FLAGS_NO_MSTRING_TYPE 0x020 +/* Don't show field names in SEQUENCE */ +#define ASN1_PCTX_FLAGS_NO_FIELD_NAME 0x040 +/* Show structure names of each SEQUENCE field */ +#define ASN1_PCTX_FLAGS_SHOW_FIELD_STRUCT_NAME 0x080 +/* Don't show structure name even at top level */ +#define ASN1_PCTX_FLAGS_NO_STRUCT_NAME 0x100 + +int ASN1_item_print(BIO *out, const ASN1_VALUE *ifld, int indent, + const ASN1_ITEM *it, const ASN1_PCTX *pctx); +ASN1_PCTX *ASN1_PCTX_new(void); +void ASN1_PCTX_free(ASN1_PCTX *p); +unsigned long ASN1_PCTX_get_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_nm_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_nm_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_cert_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_cert_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_oid_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_oid_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_str_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_str_flags(ASN1_PCTX *p, unsigned long flags); + +ASN1_SCTX *ASN1_SCTX_new(int (*scan_cb)(ASN1_SCTX *ctx)); +void ASN1_SCTX_free(ASN1_SCTX *p); +const ASN1_ITEM *ASN1_SCTX_get_item(ASN1_SCTX *p); +const ASN1_TEMPLATE *ASN1_SCTX_get_template(ASN1_SCTX *p); +unsigned long ASN1_SCTX_get_flags(ASN1_SCTX *p); +void ASN1_SCTX_set_app_data(ASN1_SCTX *p, void *data); +void *ASN1_SCTX_get_app_data(ASN1_SCTX *p); + +const BIO_METHOD *BIO_f_asn1(void); + +/* cannot constify val because of CMS_stream() */ +BIO *BIO_new_NDEF(BIO *out, ASN1_VALUE *val, const ASN1_ITEM *it); + +int i2d_ASN1_bio_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const ASN1_ITEM *it); +int PEM_write_bio_ASN1_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const char *hdr, const ASN1_ITEM *it); +/* cannot constify val because of CMS_dataFinal() */ +int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, + int ctype_nid, int econt_nid, + STACK_OF(X509_ALGOR) *mdalgs, const ASN1_ITEM *it); +int SMIME_write_ASN1_ex(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, + int ctype_nid, int econt_nid, + STACK_OF(X509_ALGOR) *mdalgs, const ASN1_ITEM *it, + OSSL_LIB_CTX *libctx, const char *propq); +ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it); +ASN1_VALUE *SMIME_read_ASN1_ex(BIO *bio, int flags, BIO **bcont, + const ASN1_ITEM *it, ASN1_VALUE **x, + OSSL_LIB_CTX *libctx, const char *propq); +int SMIME_crlf_copy(BIO *in, BIO *out, int flags); +int SMIME_text(BIO *in, BIO *out); + +const ASN1_ITEM *ASN1_ITEM_lookup(const char *name); +const ASN1_ITEM *ASN1_ITEM_get(size_t i); + +/* Legacy compatibility */ +#define DECLARE_ASN1_FUNCTIONS_fname(type, itname, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) +#define DECLARE_ASN1_FUNCTIONS_const(type) DECLARE_ASN1_FUNCTIONS(type) +#define DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, name) +#define I2D_OF_const(type) I2D_OF(type) +#define ASN1_dup_of_const(type, i2d, d2i, x) ASN1_dup_of(type, i2d, d2i, x) +#define ASN1_i2d_fp_of_const(type, i2d, out, x) ASN1_i2d_fp_of(type, i2d, out, x) +#define ASN1_i2d_bio_of_const(type, i2d, out, x) ASN1_i2d_bio_of(type, i2d, out, x) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/asn1t.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/asn1t.h new file mode 100644 index 000000000000..dc9042c812c9 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/asn1t.h @@ -0,0 +1,935 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/asn1t.h.in + * + * Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_ASN1T_H +#define OPENSSL_ASN1T_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_ASN1T_H +#endif + +#include +#include +#include + +#ifdef OPENSSL_BUILD_SHLIBCRYPTO +#undef OPENSSL_EXTERN +#define OPENSSL_EXTERN OPENSSL_EXPORT +#endif + +/* ASN1 template defines, structures and functions */ + +#ifdef __cplusplus +extern "C" { +#endif + +/*- + * These are the possible values for the itype field of the + * ASN1_ITEM structure and determine how it is interpreted. + * + * For PRIMITIVE types the underlying type + * determines the behaviour if items is NULL. + * + * Otherwise templates must contain a single + * template and the type is treated in the + * same way as the type specified in the template. + * + * For SEQUENCE types the templates field points + * to the members, the size field is the + * structure size. + * + * For CHOICE types the templates field points + * to each possible member (typically a union) + * and the 'size' field is the offset of the + * selector. + * + * The 'funcs' field is used for application-specific + * data and functions. + * + * The EXTERN type uses a new style d2i/i2d. + * The new style should be used where possible + * because it avoids things like the d2i IMPLICIT + * hack. + * + * MSTRING is a multiple string type, it is used + * for a CHOICE of character strings where the + * actual strings all occupy an ASN1_STRING + * structure. In this case the 'utype' field + * has a special meaning, it is used as a mask + * of acceptable types using the B_ASN1 constants. + * + * NDEF_SEQUENCE is the same as SEQUENCE except + * that it will use indefinite length constructed + * encoding if requested. + * + */ + +#define ASN1_ITYPE_PRIMITIVE 0x0 +#define ASN1_ITYPE_SEQUENCE 0x1 +#define ASN1_ITYPE_CHOICE 0x2 +/* unused value 0x3 */ +#define ASN1_ITYPE_EXTERN 0x4 +#define ASN1_ITYPE_MSTRING 0x5 +#define ASN1_ITYPE_NDEF_SEQUENCE 0x6 + +/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ +#define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)((iptr)())) + +/* Macros for start and end of ASN1_ITEM definition */ + +#define ASN1_ITEM_start(itname) \ + const ASN1_ITEM *itname##_it(void) \ + { \ + static const ASN1_ITEM local_it = { + +#define static_ASN1_ITEM_start(itname) \ + static ASN1_ITEM_start(itname) + +#define ASN1_ITEM_end(itname) \ + } \ + ; \ + return &local_it; \ + } + +/* Macros to aid ASN1 template writing */ + +#define ASN1_ITEM_TEMPLATE(tname) \ + static const ASN1_TEMPLATE tname##_item_tt + +#define ASN1_ITEM_TEMPLATE_END(tname) \ + ; \ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_PRIMITIVE, \ + -1, \ + &tname##_item_tt, \ + 0, \ + NULL, \ + 0, \ + #tname ASN1_ITEM_end(tname) +#define static_ASN1_ITEM_TEMPLATE_END(tname) \ + ; \ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_PRIMITIVE, \ + -1, \ + &tname##_item_tt, \ + 0, \ + NULL, \ + 0, \ + #tname ASN1_ITEM_end(tname) + +/* This is a ASN1 type which just embeds a template */ + +/*- + * This pair helps declare a SEQUENCE. We can do: + * + * ASN1_SEQUENCE(stname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END(stname) + * + * This will produce an ASN1_ITEM called stname_it + * for a structure called stname. + * + * If you want the same structure but a different + * name then use: + * + * ASN1_SEQUENCE(itname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END_name(stname, itname) + * + * This will create an item called itname_it using + * a structure called stname. + */ + +#define ASN1_SEQUENCE(tname) \ + static const ASN1_TEMPLATE tname##_seq_tt[] + +#define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname) + +#define static_ASN1_SEQUENCE_END(stname) static_ASN1_SEQUENCE_END_name(stname, stname) + +#define ASN1_SEQUENCE_END_name(stname, tname) \ + ; \ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE, \ + V_ASN1_SEQUENCE, \ + tname##_seq_tt, \ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE), \ + NULL, \ + sizeof(stname), \ + #tname ASN1_ITEM_end(tname) + +#define static_ASN1_SEQUENCE_END_name(stname, tname) \ + ; \ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE, \ + V_ASN1_SEQUENCE, \ + tname##_seq_tt, \ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE), \ + NULL, \ + sizeof(stname), \ + #stname ASN1_ITEM_end(tname) + +#define ASN1_NDEF_SEQUENCE(tname) \ + ASN1_SEQUENCE(tname) + +#define ASN1_NDEF_SEQUENCE_cb(tname, cb) \ + ASN1_SEQUENCE_cb(tname, cb) + +#define ASN1_SEQUENCE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = { NULL, 0, 0, 0, cb, 0, NULL }; \ + ASN1_SEQUENCE(tname) + +#define ASN1_SEQUENCE_const_cb(tname, const_cb) \ + static const ASN1_AUX tname##_aux = { NULL, ASN1_AFLG_CONST_CB, 0, 0, NULL, 0, const_cb }; \ + ASN1_SEQUENCE(tname) + +#define ASN1_SEQUENCE_cb_const_cb(tname, cb, const_cb) \ + static const ASN1_AUX tname##_aux = { NULL, ASN1_AFLG_CONST_CB, 0, 0, cb, 0, const_cb }; \ + ASN1_SEQUENCE(tname) + +#define ASN1_SEQUENCE_ref(tname, cb) \ + static const ASN1_AUX tname##_aux = { NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), offsetof(tname, lock), cb, 0, NULL }; \ + ASN1_SEQUENCE(tname) + +#define ASN1_SEQUENCE_enc(tname, enc, cb) \ + static const ASN1_AUX tname##_aux = { NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc), NULL }; \ + ASN1_SEQUENCE(tname) + +#define ASN1_NDEF_SEQUENCE_END(tname) \ + ; \ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE, \ + V_ASN1_SEQUENCE, \ + tname##_seq_tt, \ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE), \ + NULL, \ + sizeof(tname), \ + #tname ASN1_ITEM_end(tname) +#define static_ASN1_NDEF_SEQUENCE_END(tname) \ + ; \ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE, \ + V_ASN1_SEQUENCE, \ + tname##_seq_tt, \ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE), \ + NULL, \ + sizeof(tname), \ + #tname ASN1_ITEM_end(tname) + +#define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +#define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) +#define static_ASN1_SEQUENCE_END_cb(stname, tname) static_ASN1_SEQUENCE_END_ref(stname, tname) + +#define ASN1_SEQUENCE_END_ref(stname, tname) \ + ; \ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE, \ + V_ASN1_SEQUENCE, \ + tname##_seq_tt, \ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE), \ + &tname##_aux, \ + sizeof(stname), \ + #tname ASN1_ITEM_end(tname) +#define static_ASN1_SEQUENCE_END_ref(stname, tname) \ + ; \ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE, \ + V_ASN1_SEQUENCE, \ + tname##_seq_tt, \ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE), \ + &tname##_aux, \ + sizeof(stname), \ + #stname ASN1_ITEM_end(tname) + +#define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \ + ; \ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE, \ + V_ASN1_SEQUENCE, \ + tname##_seq_tt, \ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE), \ + &tname##_aux, \ + sizeof(stname), \ + #stname ASN1_ITEM_end(tname) + +/*- + * This pair helps declare a CHOICE type. We can do: + * + * ASN1_CHOICE(chname) = { + * ... CHOICE options ... + * ASN1_CHOICE_END(chname) + * + * This will produce an ASN1_ITEM called chname_it + * for a structure called chname. The structure + * definition must look like this: + * typedef struct { + * int type; + * union { + * ASN1_SOMETHING *opt1; + * ASN1_SOMEOTHER *opt2; + * } value; + * } chname; + * + * the name of the selector must be 'type'. + * to use an alternative selector name use the + * ASN1_CHOICE_END_selector() version. + */ + +#define ASN1_CHOICE(tname) \ + static const ASN1_TEMPLATE tname##_ch_tt[] + +#define ASN1_CHOICE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = { NULL, 0, 0, 0, cb, 0, NULL }; \ + ASN1_CHOICE(tname) + +#define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname) + +#define static_ASN1_CHOICE_END(stname) static_ASN1_CHOICE_END_name(stname, stname) + +#define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type) + +#define static_ASN1_CHOICE_END_name(stname, tname) static_ASN1_CHOICE_END_selector(stname, tname, type) + +#define ASN1_CHOICE_END_selector(stname, tname, selname) \ + ; \ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE, \ + offsetof(stname, selname), \ + tname##_ch_tt, \ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE), \ + NULL, \ + sizeof(stname), \ + #stname ASN1_ITEM_end(tname) + +#define static_ASN1_CHOICE_END_selector(stname, tname, selname) \ + ; \ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE, \ + offsetof(stname, selname), \ + tname##_ch_tt, \ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE), \ + NULL, \ + sizeof(stname), \ + #stname ASN1_ITEM_end(tname) + +#define ASN1_CHOICE_END_cb(stname, tname, selname) \ + ; \ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE, \ + offsetof(stname, selname), \ + tname##_ch_tt, \ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE), \ + &tname##_aux, \ + sizeof(stname), \ + #stname ASN1_ITEM_end(tname) + +/* This helps with the template wrapper form of ASN1_ITEM */ + +#define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \ + (flags), (tag), 0, \ + #name, ASN1_ITEM_ref(type) \ +} + +/* These help with SEQUENCE or CHOICE components */ + +/* used to declare other types */ + +#define ASN1_EX_TYPE(flags, tag, stname, field, type) { \ + (flags), (tag), offsetof(stname, field), \ + #field, ASN1_ITEM_ref(type) \ +} + +/* implicit and explicit helper macros */ + +#define ASN1_IMP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | (ex), tag, stname, field, type) + +#define ASN1_EXP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | (ex), tag, stname, field, type) + +/* Any defined by macros: the field used is in the table itself */ + +#define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb } +#define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb } + +/* Plain simple type */ +#define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0, 0, stname, field, type) +/* Embedded simple type */ +#define ASN1_EMBED(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_EMBED, 0, stname, field, type) + +/* OPTIONAL simple type */ +#define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type) +#define ASN1_OPT_EMBED(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL | ASN1_TFLG_EMBED, 0, stname, field, type) + +/* IMPLICIT tagged simple type */ +#define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0) +#define ASN1_IMP_EMBED(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_EMBED) + +/* IMPLICIT tagged OPTIONAL simple type */ +#define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) +#define ASN1_IMP_OPT_EMBED(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL | ASN1_TFLG_EMBED) + +/* Same as above but EXPLICIT */ + +#define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0) +#define ASN1_EXP_EMBED(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_EMBED) +#define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) +#define ASN1_EXP_OPT_EMBED(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL | ASN1_TFLG_EMBED) + +/* SEQUENCE OF type */ +#define ASN1_SEQUENCE_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type) + +/* OPTIONAL SEQUENCE OF */ +#define ASN1_SEQUENCE_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Same as above but for SET OF */ + +#define ASN1_SET_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type) + +#define ASN1_SET_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF | ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */ + +#define ASN1_IMP_SET_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +#define ASN1_EXP_SET_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +#define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF | ASN1_TFLG_OPTIONAL) + +#define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF | ASN1_TFLG_OPTIONAL) + +#define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +#define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL) + +#define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +#define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL) + +/* EXPLICIT using indefinite length constructed form */ +#define ASN1_NDEF_EXP(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF) + +/* EXPLICIT OPTIONAL using indefinite length constructed form */ +#define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL | ASN1_TFLG_NDEF) + +/* Macros for the ASN1_ADB structure */ + +#define ASN1_ADB(name) \ + static const ASN1_ADB_TABLE name##_adbtbl[] + +#define ASN1_ADB_END(name, flags, field, adb_cb, def, none) \ + ; \ + static const ASN1_ITEM *name##_adb(void) \ + { \ + static const ASN1_ADB internal_adb = { \ + flags, \ + offsetof(name, field), \ + adb_cb, \ + name##_adbtbl, \ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE), \ + def, \ + none \ + }; \ + return (const ASN1_ITEM *)&internal_adb; \ + } \ + void dummy_function(void) + +#define ADB_ENTRY(val, template) { val, template } + +#define ASN1_ADB_TEMPLATE(name) \ + static const ASN1_TEMPLATE name##_tt + +/* + * This is the ASN1 template structure that defines a wrapper round the + * actual type. It determines the actual position of the field in the value + * structure, various flags such as OPTIONAL and the field name. + */ + +struct ASN1_TEMPLATE_st { + unsigned long flags; /* Various flags */ + long tag; /* tag, not used if no tagging */ + unsigned long offset; /* Offset of this field in structure */ + const char *field_name; /* Field name */ + ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */ +}; + +/* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */ + +#define ASN1_TEMPLATE_item(t) (t->item_ptr) +#define ASN1_TEMPLATE_adb(t) (t->item_ptr) + +typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE; +typedef struct ASN1_ADB_st ASN1_ADB; + +struct ASN1_ADB_st { + unsigned long flags; /* Various flags */ + unsigned long offset; /* Offset of selector field */ + int (*adb_cb)(long *psel); /* Application callback */ + const ASN1_ADB_TABLE *tbl; /* Table of possible types */ + long tblcount; /* Number of entries in tbl */ + const ASN1_TEMPLATE *default_tt; /* Type to use if no match */ + const ASN1_TEMPLATE *null_tt; /* Type to use if selector is NULL */ +}; + +struct ASN1_ADB_TABLE_st { + long value; /* NID for an object or value for an int */ + const ASN1_TEMPLATE tt; /* item for this value */ +}; + +/* template flags */ + +/* Field is optional */ +#define ASN1_TFLG_OPTIONAL (0x1) + +/* Field is a SET OF */ +#define ASN1_TFLG_SET_OF (0x1 << 1) + +/* Field is a SEQUENCE OF */ +#define ASN1_TFLG_SEQUENCE_OF (0x2 << 1) + +/* + * Special case: this refers to a SET OF that will be sorted into DER order + * when encoded *and* the corresponding STACK will be modified to match the + * new order. + */ +#define ASN1_TFLG_SET_ORDER (0x3 << 1) + +/* Mask for SET OF or SEQUENCE OF */ +#define ASN1_TFLG_SK_MASK (0x3 << 1) + +/* + * These flags mean the tag should be taken from the tag field. If EXPLICIT + * then the underlying type is used for the inner tag. + */ + +/* IMPLICIT tagging */ +#define ASN1_TFLG_IMPTAG (0x1 << 3) + +/* EXPLICIT tagging, inner tag from underlying type */ +#define ASN1_TFLG_EXPTAG (0x2 << 3) + +#define ASN1_TFLG_TAG_MASK (0x3 << 3) + +/* context specific IMPLICIT */ +#define ASN1_TFLG_IMPLICIT (ASN1_TFLG_IMPTAG | ASN1_TFLG_CONTEXT) + +/* context specific EXPLICIT */ +#define ASN1_TFLG_EXPLICIT (ASN1_TFLG_EXPTAG | ASN1_TFLG_CONTEXT) + +/* + * If tagging is in force these determine the type of tag to use. Otherwise + * the tag is determined by the underlying type. These values reflect the + * actual octet format. + */ + +/* Universal tag */ +#define ASN1_TFLG_UNIVERSAL (0x0 << 6) +/* Application tag */ +#define ASN1_TFLG_APPLICATION (0x1 << 6) +/* Context specific tag */ +#define ASN1_TFLG_CONTEXT (0x2 << 6) +/* Private tag */ +#define ASN1_TFLG_PRIVATE (0x3 << 6) + +#define ASN1_TFLG_TAG_CLASS (0x3 << 6) + +/* + * These are for ANY DEFINED BY type. In this case the 'item' field points to + * an ASN1_ADB structure which contains a table of values to decode the + * relevant type + */ + +#define ASN1_TFLG_ADB_MASK (0x3 << 8) + +#define ASN1_TFLG_ADB_OID (0x1 << 8) + +#define ASN1_TFLG_ADB_INT (0x1 << 9) + +/* + * This flag when present in a SEQUENCE OF, SET OF or EXPLICIT causes + * indefinite length constructed encoding to be used if required. + */ + +#define ASN1_TFLG_NDEF (0x1 << 11) + +/* Field is embedded and not a pointer */ +#define ASN1_TFLG_EMBED (0x1 << 12) + +/* This is the actual ASN1 item itself */ + +struct ASN1_ITEM_st { + char itype; /* The item type, primitive, SEQUENCE, CHOICE + * or extern */ + long utype; /* underlying type */ + const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains + * the contents */ + long tcount; /* Number of templates if SEQUENCE or CHOICE */ + const void *funcs; /* further data and type-specific functions */ + /* funcs can be ASN1_PRIMITIVE_FUNCS*, ASN1_EXTERN_FUNCS*, or ASN1_AUX* */ + long size; /* Structure size (usually) */ + const char *sname; /* Structure name */ +}; + +/* + * Cache for ASN1 tag and length, so we don't keep re-reading it for things + * like CHOICE + */ + +struct ASN1_TLC_st { + char valid; /* Values below are valid */ + int ret; /* return value */ + long plen; /* length */ + int ptag; /* class value */ + int pclass; /* class value */ + int hdrlen; /* header length */ +}; + +/* Typedefs for ASN1 function pointers */ +typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx); + +typedef int ASN1_ex_d2i_ex(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx, OSSL_LIB_CTX *libctx, + const char *propq); +typedef int ASN1_ex_i2d(const ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it, int tag, int aclass); +typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); +typedef int ASN1_ex_new_ex_func(ASN1_VALUE **pval, const ASN1_ITEM *it, + OSSL_LIB_CTX *libctx, const char *propq); +typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); + +typedef int ASN1_ex_print_func(BIO *out, const ASN1_VALUE **pval, + int indent, const char *fname, + const ASN1_PCTX *pctx); + +typedef int ASN1_primitive_i2c(const ASN1_VALUE **pval, unsigned char *cont, + int *putype, const ASN1_ITEM *it); +typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, + int len, int utype, char *free_cont, + const ASN1_ITEM *it); +typedef int ASN1_primitive_print(BIO *out, const ASN1_VALUE **pval, + const ASN1_ITEM *it, int indent, + const ASN1_PCTX *pctx); + +typedef struct ASN1_EXTERN_FUNCS_st { + void *app_data; + ASN1_ex_new_func *asn1_ex_new; + ASN1_ex_free_func *asn1_ex_free; + ASN1_ex_free_func *asn1_ex_clear; + ASN1_ex_d2i *asn1_ex_d2i; + ASN1_ex_i2d *asn1_ex_i2d; + ASN1_ex_print_func *asn1_ex_print; + ASN1_ex_new_ex_func *asn1_ex_new_ex; + ASN1_ex_d2i_ex *asn1_ex_d2i_ex; +} ASN1_EXTERN_FUNCS; + +typedef struct ASN1_PRIMITIVE_FUNCS_st { + void *app_data; + unsigned long flags; + ASN1_ex_new_func *prim_new; + ASN1_ex_free_func *prim_free; + ASN1_ex_free_func *prim_clear; + ASN1_primitive_c2i *prim_c2i; + ASN1_primitive_i2c *prim_i2c; + ASN1_primitive_print *prim_print; +} ASN1_PRIMITIVE_FUNCS; + +/* + * This is the ASN1_AUX structure: it handles various miscellaneous + * requirements. For example the use of reference counts and an informational + * callback. The "informational callback" is called at various points during + * the ASN1 encoding and decoding. It can be used to provide minor + * customisation of the structures used. This is most useful where the + * supplied routines *almost* do the right thing but need some extra help at + * a few points. If the callback returns zero then it is assumed a fatal + * error has occurred and the main operation should be abandoned. If major + * changes in the default behaviour are required then an external type is + * more appropriate. + * For the operations ASN1_OP_I2D_PRE, ASN1_OP_I2D_POST, ASN1_OP_PRINT_PRE, and + * ASN1_OP_PRINT_POST, meanwhile a variant of the callback with const parameter + * 'in' is provided to make clear statically that its input is not modified. If + * and only if this variant is in use the flag ASN1_AFLG_CONST_CB must be set. + */ + +typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it, + void *exarg); +typedef int ASN1_aux_const_cb(int operation, const ASN1_VALUE **in, + const ASN1_ITEM *it, void *exarg); + +typedef struct ASN1_AUX_st { + void *app_data; + int flags; + int ref_offset; /* Offset of reference value */ + int ref_lock; /* Offset of lock value */ + ASN1_aux_cb *asn1_cb; + int enc_offset; /* Offset of ASN1_ENCODING structure */ + ASN1_aux_const_cb *asn1_const_cb; /* for ASN1_OP_I2D_ and ASN1_OP_PRINT_ */ +} ASN1_AUX; + +/* For print related callbacks exarg points to this structure */ +typedef struct ASN1_PRINT_ARG_st { + BIO *out; + int indent; + const ASN1_PCTX *pctx; +} ASN1_PRINT_ARG; + +/* For streaming related callbacks exarg points to this structure */ +typedef struct ASN1_STREAM_ARG_st { + /* BIO to stream through */ + BIO *out; + /* BIO with filters appended */ + BIO *ndef_bio; + /* Streaming I/O boundary */ + unsigned char **boundary; +} ASN1_STREAM_ARG; + +/* Flags in ASN1_AUX */ + +/* Use a reference count */ +#define ASN1_AFLG_REFCOUNT 1 +/* Save the encoding of structure (useful for signatures) */ +#define ASN1_AFLG_ENCODING 2 +/* The Sequence length is invalid */ +#define ASN1_AFLG_BROKEN 4 +/* Use the new asn1_const_cb */ +#define ASN1_AFLG_CONST_CB 8 + +/* operation values for asn1_cb */ + +#define ASN1_OP_NEW_PRE 0 +#define ASN1_OP_NEW_POST 1 +#define ASN1_OP_FREE_PRE 2 +#define ASN1_OP_FREE_POST 3 +#define ASN1_OP_D2I_PRE 4 +#define ASN1_OP_D2I_POST 5 +#define ASN1_OP_I2D_PRE 6 +#define ASN1_OP_I2D_POST 7 +#define ASN1_OP_PRINT_PRE 8 +#define ASN1_OP_PRINT_POST 9 +#define ASN1_OP_STREAM_PRE 10 +#define ASN1_OP_STREAM_POST 11 +#define ASN1_OP_DETACHED_PRE 12 +#define ASN1_OP_DETACHED_POST 13 +#define ASN1_OP_DUP_PRE 14 +#define ASN1_OP_DUP_POST 15 +#define ASN1_OP_GET0_LIBCTX 16 +#define ASN1_OP_GET0_PROPQ 17 + +/* Macro to implement a primitive type */ +#define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0) +#define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_PRIMITIVE, \ + V_##vname, NULL, 0, NULL, ex, #itname ASN1_ITEM_end(itname) + +/* Macro to implement a multi string type */ +#define IMPLEMENT_ASN1_MSTRING(itname, mask) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_MSTRING, \ + mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname ASN1_ITEM_end(itname) + +#define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ + ASN1_ITEM_start(sname) \ + ASN1_ITYPE_EXTERN, \ + tag, \ + NULL, \ + 0, \ + &fptrs, \ + 0, \ + #sname ASN1_ITEM_end(sname) + +/* Macro to implement standard functions in terms of ASN1_ITEM structures */ + +#define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname) + +#define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname) + +#define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \ + IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname) + +#define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname) + +#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname) + +#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \ + pre stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + pre void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \ + stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +#define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +#define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname)); \ + } \ + int i2d_##fname(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((const ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname)); \ + } + +#define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \ + int i2d_##stname##_NDEF(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_ndef_i2d((const ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname)); \ + } + +#define IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(stname) \ + static stname *d2i_##stname(stname **a, \ + const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, \ + ASN1_ITEM_rptr(stname)); \ + } \ + static int i2d_##stname(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((const ASN1_VALUE *)a, out, \ + ASN1_ITEM_rptr(stname)); \ + } + +#define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \ + stname *stname##_dup(const stname *x) \ + { \ + return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \ + } + +#define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \ + IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname) + +#define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \ + int fname##_print_ctx(BIO *out, const stname *x, int indent, \ + const ASN1_PCTX *pctx) \ + { \ + return ASN1_item_print(out, (const ASN1_VALUE *)x, indent, \ + ASN1_ITEM_rptr(itname), pctx); \ + } + +/* external definitions for primitive types */ + +DECLARE_ASN1_ITEM(ASN1_BOOLEAN) +DECLARE_ASN1_ITEM(ASN1_TBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_FBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_SEQUENCE) +DECLARE_ASN1_ITEM(CBIGNUM) +DECLARE_ASN1_ITEM(BIGNUM) +DECLARE_ASN1_ITEM(INT32) +DECLARE_ASN1_ITEM(ZINT32) +DECLARE_ASN1_ITEM(UINT32) +DECLARE_ASN1_ITEM(ZUINT32) +DECLARE_ASN1_ITEM(INT64) +DECLARE_ASN1_ITEM(ZINT64) +DECLARE_ASN1_ITEM(UINT64) +DECLARE_ASN1_ITEM(ZUINT64) + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +/* + * LONG and ZLONG are strongly discouraged for use as stored data, as the + * underlying C type (long) differs in size depending on the architecture. + * They are designed with 32-bit longs in mind. + */ +DECLARE_ASN1_ITEM(LONG) +DECLARE_ASN1_ITEM(ZLONG) +#endif + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_VALUE, ASN1_VALUE, ASN1_VALUE) +#define sk_ASN1_VALUE_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_value(sk, idx) ((ASN1_VALUE *)OPENSSL_sk_value(ossl_check_const_ASN1_VALUE_sk_type(sk), (idx))) +#define sk_ASN1_VALUE_new(cmp) ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_new(ossl_check_ASN1_VALUE_compfunc_type(cmp))) +#define sk_ASN1_VALUE_new_null() ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_new_null()) +#define sk_ASN1_VALUE_new_reserve(cmp, n) ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_VALUE_compfunc_type(cmp), (n))) +#define sk_ASN1_VALUE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_VALUE_sk_type(sk), (n)) +#define sk_ASN1_VALUE_free(sk) OPENSSL_sk_free(ossl_check_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_delete(sk, i) ((ASN1_VALUE *)OPENSSL_sk_delete(ossl_check_ASN1_VALUE_sk_type(sk), (i))) +#define sk_ASN1_VALUE_delete_ptr(sk, ptr) ((ASN1_VALUE *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr))) +#define sk_ASN1_VALUE_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr)) +#define sk_ASN1_VALUE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr)) +#define sk_ASN1_VALUE_pop(sk) ((ASN1_VALUE *)OPENSSL_sk_pop(ossl_check_ASN1_VALUE_sk_type(sk))) +#define sk_ASN1_VALUE_shift(sk) ((ASN1_VALUE *)OPENSSL_sk_shift(ossl_check_ASN1_VALUE_sk_type(sk))) +#define sk_ASN1_VALUE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_VALUE_sk_type(sk),ossl_check_ASN1_VALUE_freefunc_type(freefunc)) +#define sk_ASN1_VALUE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr), (idx)) +#define sk_ASN1_VALUE_set(sk, idx, ptr) ((ASN1_VALUE *)OPENSSL_sk_set(ossl_check_ASN1_VALUE_sk_type(sk), (idx), ossl_check_ASN1_VALUE_type(ptr))) +#define sk_ASN1_VALUE_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr)) +#define sk_ASN1_VALUE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr)) +#define sk_ASN1_VALUE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr), pnum) +#define sk_ASN1_VALUE_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_dup(sk) ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_dup(ossl_check_const_ASN1_VALUE_sk_type(sk))) +#define sk_ASN1_VALUE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_copyfunc_type(copyfunc), ossl_check_ASN1_VALUE_freefunc_type(freefunc))) +#define sk_ASN1_VALUE_set_cmp_func(sk, cmp) ((sk_ASN1_VALUE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_compfunc_type(cmp))) + +/* clang-format on */ + +/* Functions used internally by the ASN1 code */ + +int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); +void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); + +int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx); + +int ASN1_item_ex_i2d(const ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it, int tag, int aclass); + +/* Legacy compatibility */ +#define IMPLEMENT_ASN1_FUNCTIONS_const(name) IMPLEMENT_ASN1_FUNCTIONS(name) +#define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/bio.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/bio.h new file mode 100644 index 000000000000..f87990019926 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/bio.h @@ -0,0 +1,1028 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/bio.h.in + * + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_BIO_H +#define OPENSSL_BIO_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_BIO_H +#endif + +#include + +#ifndef OPENSSL_NO_STDIO +#include +#endif +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* There are the classes of BIOs */ +#define BIO_TYPE_DESCRIPTOR 0x0100 /* socket, fd, connect or accept */ +#define BIO_TYPE_FILTER 0x0200 +#define BIO_TYPE_SOURCE_SINK 0x0400 + +/* These are the 'types' of BIOs */ +#define BIO_TYPE_NONE 0 +#define BIO_TYPE_MEM (1 | BIO_TYPE_SOURCE_SINK) +#define BIO_TYPE_FILE (2 | BIO_TYPE_SOURCE_SINK) + +#define BIO_TYPE_FD (4 | BIO_TYPE_SOURCE_SINK | BIO_TYPE_DESCRIPTOR) +#define BIO_TYPE_SOCKET (5 | BIO_TYPE_SOURCE_SINK | BIO_TYPE_DESCRIPTOR) +#define BIO_TYPE_NULL (6 | BIO_TYPE_SOURCE_SINK) +#define BIO_TYPE_SSL (7 | BIO_TYPE_FILTER) +#define BIO_TYPE_MD (8 | BIO_TYPE_FILTER) +#define BIO_TYPE_BUFFER (9 | BIO_TYPE_FILTER) +#define BIO_TYPE_CIPHER (10 | BIO_TYPE_FILTER) +#define BIO_TYPE_BASE64 (11 | BIO_TYPE_FILTER) +#define BIO_TYPE_CONNECT (12 | BIO_TYPE_SOURCE_SINK | BIO_TYPE_DESCRIPTOR) +#define BIO_TYPE_ACCEPT (13 | BIO_TYPE_SOURCE_SINK | BIO_TYPE_DESCRIPTOR) + +#define BIO_TYPE_NBIO_TEST (16 | BIO_TYPE_FILTER) /* server proxy BIO */ +#define BIO_TYPE_NULL_FILTER (17 | BIO_TYPE_FILTER) +#define BIO_TYPE_BIO (19 | BIO_TYPE_SOURCE_SINK) /* half a BIO pair */ +#define BIO_TYPE_LINEBUFFER (20 | BIO_TYPE_FILTER) +#define BIO_TYPE_DGRAM (21 | BIO_TYPE_SOURCE_SINK | BIO_TYPE_DESCRIPTOR) +#define BIO_TYPE_ASN1 (22 | BIO_TYPE_FILTER) +#define BIO_TYPE_COMP (23 | BIO_TYPE_FILTER) +#ifndef OPENSSL_NO_SCTP +#define BIO_TYPE_DGRAM_SCTP (24 | BIO_TYPE_SOURCE_SINK | BIO_TYPE_DESCRIPTOR) +#endif +#define BIO_TYPE_CORE_TO_PROV (25 | BIO_TYPE_SOURCE_SINK) +#define BIO_TYPE_DGRAM_PAIR (26 | BIO_TYPE_SOURCE_SINK) +#define BIO_TYPE_DGRAM_MEM (27 | BIO_TYPE_SOURCE_SINK) + +/* Custom type starting index returned by BIO_get_new_index() */ +#define BIO_TYPE_START 128 +/* Custom type maximum index that can be returned by BIO_get_new_index() */ +#define BIO_TYPE_MASK 0xFF + +/* + * BIO_FILENAME_READ|BIO_CLOSE to open or close on free. + * BIO_set_fp(in,stdin,BIO_NOCLOSE); + */ +#define BIO_NOCLOSE 0x00 +#define BIO_CLOSE 0x01 + +/* + * These are used in the following macros and are passed to BIO_ctrl() + */ +#define BIO_CTRL_RESET 1 /* opt - rewind/zero etc */ +#define BIO_CTRL_EOF 2 /* opt - are we at the eof */ +#define BIO_CTRL_INFO 3 /* opt - extra tit-bits */ +#define BIO_CTRL_SET 4 /* man - set the 'IO' type */ +#define BIO_CTRL_GET 5 /* man - get the 'IO' type */ +#define BIO_CTRL_PUSH 6 /* opt - internal, used to signify change */ +#define BIO_CTRL_POP 7 /* opt - internal, used to signify change */ +#define BIO_CTRL_GET_CLOSE 8 /* man - set the 'close' on free */ +#define BIO_CTRL_SET_CLOSE 9 /* man - set the 'close' on free */ +#define BIO_CTRL_PENDING 10 /* opt - is their more data buffered */ +#define BIO_CTRL_FLUSH 11 /* opt - 'flush' buffered output */ +#define BIO_CTRL_DUP 12 /* man - extra stuff for 'duped' BIO */ +#define BIO_CTRL_WPENDING 13 /* opt - number of bytes still to write */ +#define BIO_CTRL_SET_CALLBACK 14 /* opt - set callback function */ +#define BIO_CTRL_GET_CALLBACK 15 /* opt - set callback function */ + +#define BIO_CTRL_PEEK 29 /* BIO_f_buffer special */ +#define BIO_CTRL_SET_FILENAME 30 /* BIO_s_file special */ + +/* dgram BIO stuff */ +#define BIO_CTRL_DGRAM_CONNECT 31 /* BIO dgram special */ +#define BIO_CTRL_DGRAM_SET_CONNECTED 32 /* allow for an externally connected \ + * socket to be passed in */ +#define BIO_CTRL_DGRAM_SET_RECV_TIMEOUT 33 /* setsockopt, essentially */ +#define BIO_CTRL_DGRAM_GET_RECV_TIMEOUT 34 /* getsockopt, essentially */ +#define BIO_CTRL_DGRAM_SET_SEND_TIMEOUT 35 /* setsockopt, essentially */ +#define BIO_CTRL_DGRAM_GET_SEND_TIMEOUT 36 /* getsockopt, essentially */ + +#define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37 /* flag whether the last */ +#define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38 /* I/O operation timed out */ + +/* #ifdef IP_MTU_DISCOVER */ +#define BIO_CTRL_DGRAM_MTU_DISCOVER 39 /* set DF bit on egress packets */ +/* #endif */ + +#define BIO_CTRL_DGRAM_QUERY_MTU 40 /* as kernel for current MTU */ +#define BIO_CTRL_DGRAM_GET_FALLBACK_MTU 47 +#define BIO_CTRL_DGRAM_GET_MTU 41 /* get cached value for MTU */ +#define BIO_CTRL_DGRAM_SET_MTU 42 /* set cached value for MTU. \ + * want to use this if asking \ + * the kernel fails */ + +#define BIO_CTRL_DGRAM_MTU_EXCEEDED 43 /* check whether the MTU was \ + * exceed in the previous write \ + * operation */ + +#define BIO_CTRL_DGRAM_GET_PEER 46 +#define BIO_CTRL_DGRAM_SET_PEER 44 /* Destination for the data */ + +#define BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT 45 /* Next DTLS handshake timeout \ + * to adjust socket timeouts */ +#define BIO_CTRL_DGRAM_SET_DONT_FRAG 48 + +#define BIO_CTRL_DGRAM_GET_MTU_OVERHEAD 49 + +/* Deliberately outside of OPENSSL_NO_SCTP - used in bss_dgram.c */ +#define BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE 50 +#ifndef OPENSSL_NO_SCTP +/* SCTP stuff */ +#define BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY 51 +#define BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY 52 +#define BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD 53 +#define BIO_CTRL_DGRAM_SCTP_GET_SNDINFO 60 +#define BIO_CTRL_DGRAM_SCTP_SET_SNDINFO 61 +#define BIO_CTRL_DGRAM_SCTP_GET_RCVINFO 62 +#define BIO_CTRL_DGRAM_SCTP_SET_RCVINFO 63 +#define BIO_CTRL_DGRAM_SCTP_GET_PRINFO 64 +#define BIO_CTRL_DGRAM_SCTP_SET_PRINFO 65 +#define BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN 70 +#endif + +#define BIO_CTRL_DGRAM_SET_PEEK_MODE 71 + +/* + * internal BIO: + * # define BIO_CTRL_SET_KTLS_SEND 72 + * # define BIO_CTRL_SET_KTLS_SEND_CTRL_MSG 74 + * # define BIO_CTRL_CLEAR_KTLS_CTRL_MSG 75 + */ + +#define BIO_CTRL_GET_KTLS_SEND 73 +#define BIO_CTRL_GET_KTLS_RECV 76 + +#define BIO_CTRL_DGRAM_SCTP_WAIT_FOR_DRY 77 +#define BIO_CTRL_DGRAM_SCTP_MSG_WAITING 78 + +/* BIO_f_prefix controls */ +#define BIO_CTRL_SET_PREFIX 79 +#define BIO_CTRL_SET_INDENT 80 +#define BIO_CTRL_GET_INDENT 81 + +#define BIO_CTRL_DGRAM_GET_LOCAL_ADDR_CAP 82 +#define BIO_CTRL_DGRAM_GET_LOCAL_ADDR_ENABLE 83 +#define BIO_CTRL_DGRAM_SET_LOCAL_ADDR_ENABLE 84 +#define BIO_CTRL_DGRAM_GET_EFFECTIVE_CAPS 85 +#define BIO_CTRL_DGRAM_GET_CAPS 86 +#define BIO_CTRL_DGRAM_SET_CAPS 87 +#define BIO_CTRL_DGRAM_GET_NO_TRUNC 88 +#define BIO_CTRL_DGRAM_SET_NO_TRUNC 89 + +/* + * internal BIO: + * # define BIO_CTRL_SET_KTLS_TX_ZEROCOPY_SENDFILE 90 + */ + +#define BIO_CTRL_GET_RPOLL_DESCRIPTOR 91 +#define BIO_CTRL_GET_WPOLL_DESCRIPTOR 92 +#define BIO_CTRL_DGRAM_DETECT_PEER_ADDR 93 +#define BIO_CTRL_DGRAM_SET0_LOCAL_ADDR 94 + +#define BIO_DGRAM_CAP_NONE 0U +#define BIO_DGRAM_CAP_HANDLES_SRC_ADDR (1U << 0) +#define BIO_DGRAM_CAP_HANDLES_DST_ADDR (1U << 1) +#define BIO_DGRAM_CAP_PROVIDES_SRC_ADDR (1U << 2) +#define BIO_DGRAM_CAP_PROVIDES_DST_ADDR (1U << 3) + +#ifndef OPENSSL_NO_KTLS +#define BIO_get_ktls_send(b) \ + (BIO_ctrl(b, BIO_CTRL_GET_KTLS_SEND, 0, NULL) > 0) +#define BIO_get_ktls_recv(b) \ + (BIO_ctrl(b, BIO_CTRL_GET_KTLS_RECV, 0, NULL) > 0) +#else +#define BIO_get_ktls_send(b) (0) +#define BIO_get_ktls_recv(b) (0) +#endif + +/* modifiers */ +#define BIO_FP_READ 0x02 +#define BIO_FP_WRITE 0x04 +#define BIO_FP_APPEND 0x08 +#define BIO_FP_TEXT 0x10 + +#define BIO_FLAGS_READ 0x01 +#define BIO_FLAGS_WRITE 0x02 +#define BIO_FLAGS_IO_SPECIAL 0x04 +#define BIO_FLAGS_RWS (BIO_FLAGS_READ | BIO_FLAGS_WRITE | BIO_FLAGS_IO_SPECIAL) +#define BIO_FLAGS_SHOULD_RETRY 0x08 +#ifndef OPENSSL_NO_DEPRECATED_3_0 +/* This #define was replaced by an internal constant and should not be used. */ +#define BIO_FLAGS_UPLINK 0 +#endif + +#define BIO_FLAGS_BASE64_NO_NL 0x100 + +/* + * This is used with memory BIOs: + * BIO_FLAGS_MEM_RDONLY means we shouldn't free up or change the data in any way; + * BIO_FLAGS_NONCLEAR_RST means we shouldn't clear data on reset. + */ +#define BIO_FLAGS_MEM_RDONLY 0x200 +#define BIO_FLAGS_NONCLEAR_RST 0x400 +#define BIO_FLAGS_IN_EOF 0x800 + +/* the BIO FLAGS values 0x1000 to 0x8000 are reserved for internal KTLS flags */ + +typedef union bio_addr_st BIO_ADDR; +typedef struct bio_addrinfo_st BIO_ADDRINFO; + +int BIO_get_new_index(void); +void BIO_set_flags(BIO *b, int flags); +int BIO_test_flags(const BIO *b, int flags); +void BIO_clear_flags(BIO *b, int flags); + +#define BIO_get_flags(b) BIO_test_flags(b, ~(0x0)) +#define BIO_set_retry_special(b) \ + BIO_set_flags(b, (BIO_FLAGS_IO_SPECIAL | BIO_FLAGS_SHOULD_RETRY)) +#define BIO_set_retry_read(b) \ + BIO_set_flags(b, (BIO_FLAGS_READ | BIO_FLAGS_SHOULD_RETRY)) +#define BIO_set_retry_write(b) \ + BIO_set_flags(b, (BIO_FLAGS_WRITE | BIO_FLAGS_SHOULD_RETRY)) + +/* These are normally used internally in BIOs */ +#define BIO_clear_retry_flags(b) \ + BIO_clear_flags(b, (BIO_FLAGS_RWS | BIO_FLAGS_SHOULD_RETRY)) +#define BIO_get_retry_flags(b) \ + BIO_test_flags(b, (BIO_FLAGS_RWS | BIO_FLAGS_SHOULD_RETRY)) + +/* These should be used by the application to tell why we should retry */ +#define BIO_should_read(a) BIO_test_flags(a, BIO_FLAGS_READ) +#define BIO_should_write(a) BIO_test_flags(a, BIO_FLAGS_WRITE) +#define BIO_should_io_special(a) BIO_test_flags(a, BIO_FLAGS_IO_SPECIAL) +#define BIO_retry_type(a) BIO_test_flags(a, BIO_FLAGS_RWS) +#define BIO_should_retry(a) BIO_test_flags(a, BIO_FLAGS_SHOULD_RETRY) + +/* + * The next three are used in conjunction with the BIO_should_io_special() + * condition. After this returns true, BIO *BIO_get_retry_BIO(BIO *bio, int + * *reason); will walk the BIO stack and return the 'reason' for the special + * and the offending BIO. Given a BIO, BIO_get_retry_reason(bio) will return + * the code. + */ +/* + * Returned from the SSL bio when the certificate retrieval code had an error + */ +#define BIO_RR_SSL_X509_LOOKUP 0x01 +/* Returned from the connect BIO when a connect would have blocked */ +#define BIO_RR_CONNECT 0x02 +/* Returned from the accept BIO when an accept would have blocked */ +#define BIO_RR_ACCEPT 0x03 + +/* These are passed by the BIO callback */ +#define BIO_CB_FREE 0x01 +#define BIO_CB_READ 0x02 +#define BIO_CB_WRITE 0x03 +#define BIO_CB_PUTS 0x04 +#define BIO_CB_GETS 0x05 +#define BIO_CB_CTRL 0x06 +#define BIO_CB_RECVMMSG 0x07 +#define BIO_CB_SENDMMSG 0x08 + +/* + * The callback is called before and after the underling operation, The + * BIO_CB_RETURN flag indicates if it is after the call + */ +#define BIO_CB_RETURN 0x80 +#define BIO_CB_return(a) ((a) | BIO_CB_RETURN) +#define BIO_cb_pre(a) (!((a) & BIO_CB_RETURN)) +#define BIO_cb_post(a) ((a) & BIO_CB_RETURN) + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +typedef long (*BIO_callback_fn)(BIO *b, int oper, const char *argp, int argi, + long argl, long ret); +OSSL_DEPRECATEDIN_3_0 BIO_callback_fn BIO_get_callback(const BIO *b); +OSSL_DEPRECATEDIN_3_0 void BIO_set_callback(BIO *b, BIO_callback_fn callback); +OSSL_DEPRECATEDIN_3_0 long BIO_debug_callback(BIO *bio, int cmd, + const char *argp, int argi, + long argl, long ret); +#endif + +typedef long (*BIO_callback_fn_ex)(BIO *b, int oper, const char *argp, + size_t len, int argi, + long argl, int ret, size_t *processed); +BIO_callback_fn_ex BIO_get_callback_ex(const BIO *b); +void BIO_set_callback_ex(BIO *b, BIO_callback_fn_ex callback); +long BIO_debug_callback_ex(BIO *bio, int oper, const char *argp, size_t len, + int argi, long argl, int ret, size_t *processed); + +char *BIO_get_callback_arg(const BIO *b); +void BIO_set_callback_arg(BIO *b, char *arg); + +typedef struct bio_method_st BIO_METHOD; + +const char *BIO_method_name(const BIO *b); +int BIO_method_type(const BIO *b); + +typedef int BIO_info_cb(BIO *, int, int); +typedef BIO_info_cb bio_info_cb; /* backward compatibility */ + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(BIO, BIO, BIO) +#define sk_BIO_num(sk) OPENSSL_sk_num(ossl_check_const_BIO_sk_type(sk)) +#define sk_BIO_value(sk, idx) ((BIO *)OPENSSL_sk_value(ossl_check_const_BIO_sk_type(sk), (idx))) +#define sk_BIO_new(cmp) ((STACK_OF(BIO) *)OPENSSL_sk_new(ossl_check_BIO_compfunc_type(cmp))) +#define sk_BIO_new_null() ((STACK_OF(BIO) *)OPENSSL_sk_new_null()) +#define sk_BIO_new_reserve(cmp, n) ((STACK_OF(BIO) *)OPENSSL_sk_new_reserve(ossl_check_BIO_compfunc_type(cmp), (n))) +#define sk_BIO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_BIO_sk_type(sk), (n)) +#define sk_BIO_free(sk) OPENSSL_sk_free(ossl_check_BIO_sk_type(sk)) +#define sk_BIO_zero(sk) OPENSSL_sk_zero(ossl_check_BIO_sk_type(sk)) +#define sk_BIO_delete(sk, i) ((BIO *)OPENSSL_sk_delete(ossl_check_BIO_sk_type(sk), (i))) +#define sk_BIO_delete_ptr(sk, ptr) ((BIO *)OPENSSL_sk_delete_ptr(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr))) +#define sk_BIO_push(sk, ptr) OPENSSL_sk_push(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr)) +#define sk_BIO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr)) +#define sk_BIO_pop(sk) ((BIO *)OPENSSL_sk_pop(ossl_check_BIO_sk_type(sk))) +#define sk_BIO_shift(sk) ((BIO *)OPENSSL_sk_shift(ossl_check_BIO_sk_type(sk))) +#define sk_BIO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_BIO_sk_type(sk),ossl_check_BIO_freefunc_type(freefunc)) +#define sk_BIO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr), (idx)) +#define sk_BIO_set(sk, idx, ptr) ((BIO *)OPENSSL_sk_set(ossl_check_BIO_sk_type(sk), (idx), ossl_check_BIO_type(ptr))) +#define sk_BIO_find(sk, ptr) OPENSSL_sk_find(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr)) +#define sk_BIO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr)) +#define sk_BIO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr), pnum) +#define sk_BIO_sort(sk) OPENSSL_sk_sort(ossl_check_BIO_sk_type(sk)) +#define sk_BIO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_BIO_sk_type(sk)) +#define sk_BIO_dup(sk) ((STACK_OF(BIO) *)OPENSSL_sk_dup(ossl_check_const_BIO_sk_type(sk))) +#define sk_BIO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(BIO) *)OPENSSL_sk_deep_copy(ossl_check_const_BIO_sk_type(sk), ossl_check_BIO_copyfunc_type(copyfunc), ossl_check_BIO_freefunc_type(freefunc))) +#define sk_BIO_set_cmp_func(sk, cmp) ((sk_BIO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_BIO_sk_type(sk), ossl_check_BIO_compfunc_type(cmp))) + +/* clang-format on */ + +/* Prefix and suffix callback in ASN1 BIO */ +typedef int asn1_ps_func(BIO *b, unsigned char **pbuf, int *plen, + void *parg); + +typedef void (*BIO_dgram_sctp_notification_handler_fn)(BIO *b, + void *context, + void *buf); +#ifndef OPENSSL_NO_SCTP +/* SCTP parameter structs */ +struct bio_dgram_sctp_sndinfo { + uint16_t snd_sid; + uint16_t snd_flags; + uint32_t snd_ppid; + uint32_t snd_context; +}; + +struct bio_dgram_sctp_rcvinfo { + uint16_t rcv_sid; + uint16_t rcv_ssn; + uint16_t rcv_flags; + uint32_t rcv_ppid; + uint32_t rcv_tsn; + uint32_t rcv_cumtsn; + uint32_t rcv_context; +}; + +struct bio_dgram_sctp_prinfo { + uint16_t pr_policy; + uint32_t pr_value; +}; +#endif + +/* BIO_sendmmsg/BIO_recvmmsg-related definitions */ +typedef struct bio_msg_st { + void *data; + size_t data_len; + BIO_ADDR *peer, *local; + uint64_t flags; +} BIO_MSG; + +typedef struct bio_mmsg_cb_args_st { + BIO_MSG *msg; + size_t stride, num_msg; + uint64_t flags; + size_t *msgs_processed; +} BIO_MMSG_CB_ARGS; + +#define BIO_POLL_DESCRIPTOR_TYPE_NONE 0 +#define BIO_POLL_DESCRIPTOR_TYPE_SOCK_FD 1 +#define BIO_POLL_DESCRIPTOR_TYPE_SSL 2 +#define BIO_POLL_DESCRIPTOR_CUSTOM_START 8192 + +typedef struct bio_poll_descriptor_st { + uint32_t type; + union { + int fd; + void *custom; + uintptr_t custom_ui; + SSL *ssl; + } value; +} BIO_POLL_DESCRIPTOR; + +/* + * #define BIO_CONN_get_param_hostname BIO_ctrl + */ + +#define BIO_C_SET_CONNECT 100 +#define BIO_C_DO_STATE_MACHINE 101 +#define BIO_C_SET_NBIO 102 +/* # define BIO_C_SET_PROXY_PARAM 103 */ +#define BIO_C_SET_FD 104 +#define BIO_C_GET_FD 105 +#define BIO_C_SET_FILE_PTR 106 +#define BIO_C_GET_FILE_PTR 107 +#define BIO_C_SET_FILENAME 108 +#define BIO_C_SET_SSL 109 +#define BIO_C_GET_SSL 110 +#define BIO_C_SET_MD 111 +#define BIO_C_GET_MD 112 +#define BIO_C_GET_CIPHER_STATUS 113 +#define BIO_C_SET_BUF_MEM 114 +#define BIO_C_GET_BUF_MEM_PTR 115 +#define BIO_C_GET_BUFF_NUM_LINES 116 +#define BIO_C_SET_BUFF_SIZE 117 +#define BIO_C_SET_ACCEPT 118 +#define BIO_C_SSL_MODE 119 +#define BIO_C_GET_MD_CTX 120 +/* # define BIO_C_GET_PROXY_PARAM 121 */ +#define BIO_C_SET_BUFF_READ_DATA 122 /* data to read first */ +#define BIO_C_GET_CONNECT 123 +#define BIO_C_GET_ACCEPT 124 +#define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125 +#define BIO_C_GET_SSL_NUM_RENEGOTIATES 126 +#define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127 +#define BIO_C_FILE_SEEK 128 +#define BIO_C_GET_CIPHER_CTX 129 +#define BIO_C_SET_BUF_MEM_EOF_RETURN 130 /* return end of input \ + * value */ +#define BIO_C_SET_BIND_MODE 131 +#define BIO_C_GET_BIND_MODE 132 +#define BIO_C_FILE_TELL 133 +#define BIO_C_GET_SOCKS 134 +#define BIO_C_SET_SOCKS 135 + +#define BIO_C_SET_WRITE_BUF_SIZE 136 /* for BIO_s_bio */ +#define BIO_C_GET_WRITE_BUF_SIZE 137 +#define BIO_C_MAKE_BIO_PAIR 138 +#define BIO_C_DESTROY_BIO_PAIR 139 +#define BIO_C_GET_WRITE_GUARANTEE 140 +#define BIO_C_GET_READ_REQUEST 141 +#define BIO_C_SHUTDOWN_WR 142 +#define BIO_C_NREAD0 143 +#define BIO_C_NREAD 144 +#define BIO_C_NWRITE0 145 +#define BIO_C_NWRITE 146 +#define BIO_C_RESET_READ_REQUEST 147 +#define BIO_C_SET_MD_CTX 148 + +#define BIO_C_SET_PREFIX 149 +#define BIO_C_GET_PREFIX 150 +#define BIO_C_SET_SUFFIX 151 +#define BIO_C_GET_SUFFIX 152 + +#define BIO_C_SET_EX_ARG 153 +#define BIO_C_GET_EX_ARG 154 + +#define BIO_C_SET_CONNECT_MODE 155 + +#define BIO_C_SET_TFO 156 /* like BIO_C_SET_NBIO */ + +#define BIO_C_SET_SOCK_TYPE 157 +#define BIO_C_GET_SOCK_TYPE 158 +#define BIO_C_GET_DGRAM_BIO 159 + +#define BIO_set_app_data(s, arg) BIO_set_ex_data(s, 0, arg) +#define BIO_get_app_data(s) BIO_get_ex_data(s, 0) + +#define BIO_set_nbio(b, n) BIO_ctrl(b, BIO_C_SET_NBIO, (n), NULL) +#define BIO_set_tfo(b, n) BIO_ctrl(b, BIO_C_SET_TFO, (n), NULL) + +#ifndef OPENSSL_NO_SOCK +/* IP families we support, for BIO_s_connect() and BIO_s_accept() */ +/* Note: the underlying operating system may not support some of them */ +#define BIO_FAMILY_IPV4 4 +#define BIO_FAMILY_IPV6 6 +#define BIO_FAMILY_IPANY 256 + +/* BIO_s_connect() */ +#define BIO_set_conn_hostname(b, name) BIO_ctrl(b, BIO_C_SET_CONNECT, 0, \ + (char *)(name)) +#define BIO_set_conn_port(b, port) BIO_ctrl(b, BIO_C_SET_CONNECT, 1, \ + (char *)(port)) +#define BIO_set_conn_address(b, addr) BIO_ctrl(b, BIO_C_SET_CONNECT, 2, \ + (char *)(addr)) +#define BIO_set_conn_ip_family(b, f) BIO_int_ctrl(b, BIO_C_SET_CONNECT, 3, f) +#define BIO_get_conn_hostname(b) ((const char *)BIO_ptr_ctrl(b, BIO_C_GET_CONNECT, 0)) +#define BIO_get_conn_port(b) ((const char *)BIO_ptr_ctrl(b, BIO_C_GET_CONNECT, 1)) +#define BIO_get_conn_address(b) ((const BIO_ADDR *)BIO_ptr_ctrl(b, BIO_C_GET_CONNECT, 2)) +#define BIO_get_conn_ip_family(b) BIO_ctrl(b, BIO_C_GET_CONNECT, 3, NULL) +#define BIO_get_conn_mode(b) BIO_ctrl(b, BIO_C_GET_CONNECT, 4, NULL) +#define BIO_set_conn_mode(b, n) BIO_ctrl(b, BIO_C_SET_CONNECT_MODE, (n), NULL) +#define BIO_set_sock_type(b, t) BIO_ctrl(b, BIO_C_SET_SOCK_TYPE, (t), NULL) +#define BIO_get_sock_type(b) BIO_ctrl(b, BIO_C_GET_SOCK_TYPE, 0, NULL) +#define BIO_get0_dgram_bio(b, p) BIO_ctrl(b, BIO_C_GET_DGRAM_BIO, 0, (void *)(BIO **)(p)) + +/* BIO_s_accept() */ +#define BIO_set_accept_name(b, name) BIO_ctrl(b, BIO_C_SET_ACCEPT, 0, \ + (char *)(name)) +#define BIO_set_accept_port(b, port) BIO_ctrl(b, BIO_C_SET_ACCEPT, 1, \ + (char *)(port)) +#define BIO_get_accept_name(b) ((const char *)BIO_ptr_ctrl(b, BIO_C_GET_ACCEPT, 0)) +#define BIO_get_accept_port(b) ((const char *)BIO_ptr_ctrl(b, BIO_C_GET_ACCEPT, 1)) +#define BIO_get_peer_name(b) ((const char *)BIO_ptr_ctrl(b, BIO_C_GET_ACCEPT, 2)) +#define BIO_get_peer_port(b) ((const char *)BIO_ptr_ctrl(b, BIO_C_GET_ACCEPT, 3)) +/* #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) */ +#define BIO_set_nbio_accept(b, n) BIO_ctrl(b, BIO_C_SET_ACCEPT, 2, (n) ? (void *)"a" : NULL) +#define BIO_set_accept_bios(b, bio) BIO_ctrl(b, BIO_C_SET_ACCEPT, 3, \ + (char *)(bio)) +#define BIO_set_accept_ip_family(b, f) BIO_int_ctrl(b, BIO_C_SET_ACCEPT, 4, f) +#define BIO_get_accept_ip_family(b) BIO_ctrl(b, BIO_C_GET_ACCEPT, 4, NULL) +#define BIO_set_tfo_accept(b, n) BIO_ctrl(b, BIO_C_SET_ACCEPT, 5, (n) ? (void *)"a" : NULL) + +/* Aliases kept for backward compatibility */ +#define BIO_BIND_NORMAL 0 +#define BIO_BIND_REUSEADDR BIO_SOCK_REUSEADDR +#define BIO_BIND_REUSEADDR_IF_UNUSED BIO_SOCK_REUSEADDR +#define BIO_set_bind_mode(b, mode) BIO_ctrl(b, BIO_C_SET_BIND_MODE, mode, NULL) +#define BIO_get_bind_mode(b) BIO_ctrl(b, BIO_C_GET_BIND_MODE, 0, NULL) +#endif /* OPENSSL_NO_SOCK */ + +#define BIO_do_connect(b) BIO_do_handshake(b) +#define BIO_do_accept(b) BIO_do_handshake(b) + +#define BIO_do_handshake(b) BIO_ctrl(b, BIO_C_DO_STATE_MACHINE, 0, NULL) + +/* BIO_s_datagram(), BIO_s_fd(), BIO_s_socket(), BIO_s_accept() and BIO_s_connect() */ +#define BIO_set_fd(b, fd, c) BIO_int_ctrl(b, BIO_C_SET_FD, c, fd) +#define BIO_get_fd(b, c) BIO_ctrl(b, BIO_C_GET_FD, 0, (char *)(c)) + +/* BIO_s_file() */ +#define BIO_set_fp(b, fp, c) BIO_ctrl(b, BIO_C_SET_FILE_PTR, c, (char *)(fp)) +#define BIO_get_fp(b, fpp) BIO_ctrl(b, BIO_C_GET_FILE_PTR, 0, (char *)(fpp)) + +/* BIO_s_fd() and BIO_s_file() */ +#define BIO_seek(b, ofs) (int)BIO_ctrl(b, BIO_C_FILE_SEEK, ofs, NULL) +#define BIO_tell(b) (int)BIO_ctrl(b, BIO_C_FILE_TELL, 0, NULL) + +/* + * name is cast to lose const, but might be better to route through a + * function so we can do it safely + */ +#ifdef CONST_STRICT +/* + * If you are wondering why this isn't defined, its because CONST_STRICT is + * purely a compile-time kludge to allow const to be checked. + */ +int BIO_read_filename(BIO *b, const char *name); +#else +#define BIO_read_filename(b, name) (int)BIO_ctrl(b, BIO_C_SET_FILENAME, \ + BIO_CLOSE | BIO_FP_READ, (char *)(name)) +#endif +#define BIO_write_filename(b, name) (int)BIO_ctrl(b, BIO_C_SET_FILENAME, \ + BIO_CLOSE | BIO_FP_WRITE, name) +#define BIO_append_filename(b, name) (int)BIO_ctrl(b, BIO_C_SET_FILENAME, \ + BIO_CLOSE | BIO_FP_APPEND, name) +#define BIO_rw_filename(b, name) (int)BIO_ctrl(b, BIO_C_SET_FILENAME, \ + BIO_CLOSE | BIO_FP_READ | BIO_FP_WRITE, name) + +/* + * WARNING WARNING, this ups the reference count on the read bio of the SSL + * structure. This is because the ssl read BIO is now pointed to by the + * next_bio field in the bio. So when you free the BIO, make sure you are + * doing a BIO_free_all() to catch the underlying BIO. + */ +#define BIO_set_ssl(b, ssl, c) BIO_ctrl(b, BIO_C_SET_SSL, c, (char *)(ssl)) +#define BIO_get_ssl(b, sslp) BIO_ctrl(b, BIO_C_GET_SSL, 0, (char *)(sslp)) +#define BIO_set_ssl_mode(b, client) BIO_ctrl(b, BIO_C_SSL_MODE, client, NULL) +#define BIO_set_ssl_renegotiate_bytes(b, num) \ + BIO_ctrl(b, BIO_C_SET_SSL_RENEGOTIATE_BYTES, num, NULL) +#define BIO_get_num_renegotiates(b) \ + BIO_ctrl(b, BIO_C_GET_SSL_NUM_RENEGOTIATES, 0, NULL) +#define BIO_set_ssl_renegotiate_timeout(b, seconds) \ + BIO_ctrl(b, BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT, seconds, NULL) + +/* defined in evp.h */ +/* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)(md)) */ + +#define BIO_get_mem_data(b, pp) BIO_ctrl(b, BIO_CTRL_INFO, 0, (char *)(pp)) +#define BIO_set_mem_buf(b, bm, c) BIO_ctrl(b, BIO_C_SET_BUF_MEM, c, (char *)(bm)) +#define BIO_get_mem_ptr(b, pp) BIO_ctrl(b, BIO_C_GET_BUF_MEM_PTR, 0, \ + (char *)(pp)) +#define BIO_set_mem_eof_return(b, v) \ + BIO_ctrl(b, BIO_C_SET_BUF_MEM_EOF_RETURN, v, NULL) + +/* For the BIO_f_buffer() type */ +#define BIO_get_buffer_num_lines(b) BIO_ctrl(b, BIO_C_GET_BUFF_NUM_LINES, 0, NULL) +#define BIO_set_buffer_size(b, size) BIO_ctrl(b, BIO_C_SET_BUFF_SIZE, size, NULL) +#define BIO_set_read_buffer_size(b, size) BIO_int_ctrl(b, BIO_C_SET_BUFF_SIZE, size, 0) +#define BIO_set_write_buffer_size(b, size) BIO_int_ctrl(b, BIO_C_SET_BUFF_SIZE, size, 1) +#define BIO_set_buffer_read_data(b, buf, num) BIO_ctrl(b, BIO_C_SET_BUFF_READ_DATA, num, buf) + +/* Don't use the next one unless you know what you are doing :-) */ +#define BIO_dup_state(b, ret) BIO_ctrl(b, BIO_CTRL_DUP, 0, (char *)(ret)) + +#define BIO_reset(b) (int)BIO_ctrl(b, BIO_CTRL_RESET, 0, NULL) +#define BIO_eof(b) (int)BIO_ctrl(b, BIO_CTRL_EOF, 0, NULL) +#define BIO_set_close(b, c) (int)BIO_ctrl(b, BIO_CTRL_SET_CLOSE, (c), NULL) +#define BIO_get_close(b) (int)BIO_ctrl(b, BIO_CTRL_GET_CLOSE, 0, NULL) +#define BIO_pending(b) (int)BIO_ctrl(b, BIO_CTRL_PENDING, 0, NULL) +#define BIO_wpending(b) (int)BIO_ctrl(b, BIO_CTRL_WPENDING, 0, NULL) +/* ...pending macros have inappropriate return type */ +size_t BIO_ctrl_pending(BIO *b); +size_t BIO_ctrl_wpending(BIO *b); +#define BIO_flush(b) (int)BIO_ctrl(b, BIO_CTRL_FLUSH, 0, NULL) +#define BIO_get_info_callback(b, cbp) (int)BIO_ctrl(b, BIO_CTRL_GET_CALLBACK, 0, \ + cbp) +#define BIO_set_info_callback(b, cb) (int)BIO_callback_ctrl(b, BIO_CTRL_SET_CALLBACK, cb) + +/* For the BIO_f_buffer() type */ +#define BIO_buffer_get_num_lines(b) BIO_ctrl(b, BIO_CTRL_GET, 0, NULL) +#define BIO_buffer_peek(b, s, l) BIO_ctrl(b, BIO_CTRL_PEEK, (l), (s)) + +/* For BIO_s_bio() */ +#define BIO_set_write_buf_size(b, size) (int)BIO_ctrl(b, BIO_C_SET_WRITE_BUF_SIZE, size, NULL) +#define BIO_get_write_buf_size(b, size) (size_t)BIO_ctrl(b, BIO_C_GET_WRITE_BUF_SIZE, size, NULL) +#define BIO_make_bio_pair(b1, b2) (int)BIO_ctrl(b1, BIO_C_MAKE_BIO_PAIR, 0, b2) +#define BIO_destroy_bio_pair(b) (int)BIO_ctrl(b, BIO_C_DESTROY_BIO_PAIR, 0, NULL) +#define BIO_shutdown_wr(b) (int)BIO_ctrl(b, BIO_C_SHUTDOWN_WR, 0, NULL) +/* macros with inappropriate type -- but ...pending macros use int too: */ +#define BIO_get_write_guarantee(b) (int)BIO_ctrl(b, BIO_C_GET_WRITE_GUARANTEE, 0, NULL) +#define BIO_get_read_request(b) (int)BIO_ctrl(b, BIO_C_GET_READ_REQUEST, 0, NULL) +size_t BIO_ctrl_get_write_guarantee(BIO *b); +size_t BIO_ctrl_get_read_request(BIO *b); +int BIO_ctrl_reset_read_request(BIO *b); + +/* ctrl macros for dgram */ +#define BIO_ctrl_dgram_connect(b, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_CONNECT, 0, (char *)(peer)) +#define BIO_ctrl_set_connected(b, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_CONNECTED, 0, (char *)(peer)) +#define BIO_dgram_recv_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP, 0, NULL) +#define BIO_dgram_send_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP, 0, NULL) +#define BIO_dgram_get_peer(b, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_PEER, 0, (char *)(peer)) +#define BIO_dgram_set_peer(b, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, (char *)(peer)) +#define BIO_dgram_detect_peer_addr(b, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_DETECT_PEER_ADDR, 0, (char *)(peer)) +#define BIO_dgram_get_mtu_overhead(b) \ + (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU_OVERHEAD, 0, NULL) +#define BIO_dgram_get_local_addr_cap(b) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_LOCAL_ADDR_CAP, 0, NULL) +#define BIO_dgram_get_local_addr_enable(b, penable) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_LOCAL_ADDR_ENABLE, 0, (char *)(penable)) +#define BIO_dgram_set_local_addr_enable(b, enable) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_SET_LOCAL_ADDR_ENABLE, (enable), NULL) +#define BIO_dgram_get_effective_caps(b) \ + (uint32_t)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_EFFECTIVE_CAPS, 0, NULL) +#define BIO_dgram_get_caps(b) \ + (uint32_t)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_CAPS, 0, NULL) +#define BIO_dgram_set_caps(b, caps) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_SET_CAPS, (long)(caps), NULL) +#define BIO_dgram_get_no_trunc(b) \ + (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_NO_TRUNC, 0, NULL) +#define BIO_dgram_set_no_trunc(b, enable) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_SET_NO_TRUNC, (enable), NULL) +#define BIO_dgram_get_mtu(b) \ + (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU, 0, NULL) +#define BIO_dgram_set_mtu(b, mtu) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_SET_MTU, (mtu), NULL) +#define BIO_dgram_set0_local_addr(b, addr) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_SET0_LOCAL_ADDR, 0, (addr)) + +/* ctrl macros for BIO_f_prefix */ +#define BIO_set_prefix(b, p) BIO_ctrl((b), BIO_CTRL_SET_PREFIX, 0, (void *)(p)) +#define BIO_set_indent(b, i) BIO_ctrl((b), BIO_CTRL_SET_INDENT, (i), NULL) +#define BIO_get_indent(b) BIO_ctrl((b), BIO_CTRL_GET_INDENT, 0, NULL) + +#define BIO_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, l, p, newf, dupf, freef) +int BIO_set_ex_data(BIO *bio, int idx, void *data); +void *BIO_get_ex_data(const BIO *bio, int idx); +uint64_t BIO_number_read(BIO *bio); +uint64_t BIO_number_written(BIO *bio); + +/* For BIO_f_asn1() */ +int BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, + asn1_ps_func *prefix_free); +int BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, + asn1_ps_func **pprefix_free); +int BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, + asn1_ps_func *suffix_free); +int BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, + asn1_ps_func **psuffix_free); + +const BIO_METHOD *BIO_s_file(void); +BIO *BIO_new_file(const char *filename, const char *mode); +BIO *BIO_new_from_core_bio(OSSL_LIB_CTX *libctx, OSSL_CORE_BIO *corebio); +#ifndef OPENSSL_NO_STDIO +BIO *BIO_new_fp(FILE *stream, int close_flag); +#endif +BIO *BIO_new_ex(OSSL_LIB_CTX *libctx, const BIO_METHOD *method); +BIO *BIO_new(const BIO_METHOD *type); +int BIO_free(BIO *a); +void BIO_set_data(BIO *a, void *ptr); +void *BIO_get_data(BIO *a); +void BIO_set_init(BIO *a, int init); +int BIO_get_init(BIO *a); +void BIO_set_shutdown(BIO *a, int shut); +int BIO_get_shutdown(BIO *a); +void BIO_vfree(BIO *a); +int BIO_up_ref(BIO *a); +int BIO_read(BIO *b, void *data, int dlen); +int BIO_read_ex(BIO *b, void *data, size_t dlen, size_t *readbytes); +__owur int BIO_recvmmsg(BIO *b, BIO_MSG *msg, + size_t stride, size_t num_msg, uint64_t flags, + size_t *msgs_processed); +int BIO_gets(BIO *bp, char *buf, int size); +int BIO_get_line(BIO *bio, char *buf, int size); +int BIO_write(BIO *b, const void *data, int dlen); +int BIO_write_ex(BIO *b, const void *data, size_t dlen, size_t *written); +__owur int BIO_sendmmsg(BIO *b, BIO_MSG *msg, + size_t stride, size_t num_msg, uint64_t flags, + size_t *msgs_processed); +__owur int BIO_get_rpoll_descriptor(BIO *b, BIO_POLL_DESCRIPTOR *desc); +__owur int BIO_get_wpoll_descriptor(BIO *b, BIO_POLL_DESCRIPTOR *desc); +int BIO_puts(BIO *bp, const char *buf); +int BIO_indent(BIO *b, int indent, int max); +long BIO_ctrl(BIO *bp, int cmd, long larg, void *parg); +long BIO_callback_ctrl(BIO *b, int cmd, BIO_info_cb *fp); +void *BIO_ptr_ctrl(BIO *bp, int cmd, long larg); +long BIO_int_ctrl(BIO *bp, int cmd, long larg, int iarg); +BIO *BIO_push(BIO *b, BIO *append); +BIO *BIO_pop(BIO *b); +void BIO_free_all(BIO *a); +BIO *BIO_find_type(BIO *b, int bio_type); +BIO *BIO_next(BIO *b); +void BIO_set_next(BIO *b, BIO *next); +BIO *BIO_get_retry_BIO(BIO *bio, int *reason); +int BIO_get_retry_reason(BIO *bio); +void BIO_set_retry_reason(BIO *bio, int reason); +BIO *BIO_dup_chain(BIO *in); + +int BIO_nread0(BIO *bio, char **buf); +int BIO_nread(BIO *bio, char **buf, int num); +int BIO_nwrite0(BIO *bio, char **buf); +int BIO_nwrite(BIO *bio, char **buf, int num); + +const BIO_METHOD *BIO_s_mem(void); +#ifndef OPENSSL_NO_DGRAM +const BIO_METHOD *BIO_s_dgram_mem(void); +#endif +const BIO_METHOD *BIO_s_secmem(void); +BIO *BIO_new_mem_buf(const void *buf, int len); +#ifndef OPENSSL_NO_SOCK +const BIO_METHOD *BIO_s_socket(void); +const BIO_METHOD *BIO_s_connect(void); +const BIO_METHOD *BIO_s_accept(void); +#endif +const BIO_METHOD *BIO_s_fd(void); +const BIO_METHOD *BIO_s_log(void); +const BIO_METHOD *BIO_s_bio(void); +const BIO_METHOD *BIO_s_null(void); +const BIO_METHOD *BIO_f_null(void); +const BIO_METHOD *BIO_f_buffer(void); +const BIO_METHOD *BIO_f_readbuffer(void); +const BIO_METHOD *BIO_f_linebuffer(void); +const BIO_METHOD *BIO_f_nbio_test(void); +const BIO_METHOD *BIO_f_prefix(void); +const BIO_METHOD *BIO_s_core(void); +#ifndef OPENSSL_NO_DGRAM +const BIO_METHOD *BIO_s_dgram_pair(void); +const BIO_METHOD *BIO_s_datagram(void); +int BIO_dgram_non_fatal_error(int error); +BIO *BIO_new_dgram(int fd, int close_flag); +#ifndef OPENSSL_NO_SCTP +const BIO_METHOD *BIO_s_datagram_sctp(void); +BIO *BIO_new_dgram_sctp(int fd, int close_flag); +int BIO_dgram_is_sctp(BIO *bio); +int BIO_dgram_sctp_notification_cb(BIO *b, + BIO_dgram_sctp_notification_handler_fn handle_notifications, + void *context); +int BIO_dgram_sctp_wait_for_dry(BIO *b); +int BIO_dgram_sctp_msg_waiting(BIO *b); +#endif +#endif + +#ifndef OPENSSL_NO_SOCK +int BIO_sock_should_retry(int i); +int BIO_sock_non_fatal_error(int error); +int BIO_err_is_non_fatal(unsigned int errcode); +int BIO_socket_wait(int fd, int for_read, time_t max_time); +#endif +int BIO_wait(BIO *bio, time_t max_time, unsigned int nap_milliseconds); +int BIO_do_connect_retry(BIO *bio, int timeout, int nap_milliseconds); + +int BIO_fd_should_retry(int i); +int BIO_fd_non_fatal_error(int error); +int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), + void *u, const void *s, int len); +int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), + void *u, const void *s, int len, int indent); +int BIO_dump(BIO *b, const void *bytes, int len); +int BIO_dump_indent(BIO *b, const void *bytes, int len, int indent); +#ifndef OPENSSL_NO_STDIO +int BIO_dump_fp(FILE *fp, const void *s, int len); +int BIO_dump_indent_fp(FILE *fp, const void *s, int len, int indent); +#endif +int BIO_hex_string(BIO *out, int indent, int width, const void *data, + int datalen); + +#ifndef OPENSSL_NO_SOCK +BIO_ADDR *BIO_ADDR_new(void); +int BIO_ADDR_copy(BIO_ADDR *dst, const BIO_ADDR *src); +BIO_ADDR *BIO_ADDR_dup(const BIO_ADDR *ap); +int BIO_ADDR_rawmake(BIO_ADDR *ap, int family, + const void *where, size_t wherelen, unsigned short port); +void BIO_ADDR_free(BIO_ADDR *); +void BIO_ADDR_clear(BIO_ADDR *ap); +int BIO_ADDR_family(const BIO_ADDR *ap); +int BIO_ADDR_rawaddress(const BIO_ADDR *ap, void *p, size_t *l); +unsigned short BIO_ADDR_rawport(const BIO_ADDR *ap); +char *BIO_ADDR_hostname_string(const BIO_ADDR *ap, int numeric); +char *BIO_ADDR_service_string(const BIO_ADDR *ap, int numeric); +char *BIO_ADDR_path_string(const BIO_ADDR *ap); + +const BIO_ADDRINFO *BIO_ADDRINFO_next(const BIO_ADDRINFO *bai); +int BIO_ADDRINFO_family(const BIO_ADDRINFO *bai); +int BIO_ADDRINFO_socktype(const BIO_ADDRINFO *bai); +int BIO_ADDRINFO_protocol(const BIO_ADDRINFO *bai); +const BIO_ADDR *BIO_ADDRINFO_address(const BIO_ADDRINFO *bai); +void BIO_ADDRINFO_free(BIO_ADDRINFO *bai); + +enum BIO_hostserv_priorities { + BIO_PARSE_PRIO_HOST, + BIO_PARSE_PRIO_SERV +}; +int BIO_parse_hostserv(const char *hostserv, char **host, char **service, + enum BIO_hostserv_priorities hostserv_prio); +enum BIO_lookup_type { + BIO_LOOKUP_CLIENT, + BIO_LOOKUP_SERVER +}; +int BIO_lookup(const char *host, const char *service, + enum BIO_lookup_type lookup_type, + int family, int socktype, BIO_ADDRINFO **res); +int BIO_lookup_ex(const char *host, const char *service, + int lookup_type, int family, int socktype, int protocol, + BIO_ADDRINFO **res); +int BIO_sock_error(int sock); +int BIO_socket_ioctl(int fd, long type, void *arg); +int BIO_socket_nbio(int fd, int mode); +int BIO_sock_init(void); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define BIO_sock_cleanup() \ + while (0) \ + continue +#endif +int BIO_set_tcp_ndelay(int sock, int turn_on); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 struct hostent *BIO_gethostbyname(const char *name); +OSSL_DEPRECATEDIN_1_1_0 int BIO_get_port(const char *str, unsigned short *port_ptr); +OSSL_DEPRECATEDIN_1_1_0 int BIO_get_host_ip(const char *str, unsigned char *ip); +OSSL_DEPRECATEDIN_1_1_0 int BIO_get_accept_socket(char *host_port, int mode); +OSSL_DEPRECATEDIN_1_1_0 int BIO_accept(int sock, char **ip_port); +#endif + +union BIO_sock_info_u { + BIO_ADDR *addr; +}; +enum BIO_sock_info_type { + BIO_SOCK_INFO_ADDRESS +}; +int BIO_sock_info(int sock, + enum BIO_sock_info_type type, union BIO_sock_info_u *info); + +#define BIO_SOCK_REUSEADDR 0x01 +#define BIO_SOCK_V6_ONLY 0x02 +#define BIO_SOCK_KEEPALIVE 0x04 +#define BIO_SOCK_NONBLOCK 0x08 +#define BIO_SOCK_NODELAY 0x10 +#define BIO_SOCK_TFO 0x20 + +int BIO_socket(int domain, int socktype, int protocol, int options); +int BIO_connect(int sock, const BIO_ADDR *addr, int options); +int BIO_bind(int sock, const BIO_ADDR *addr, int options); +int BIO_listen(int sock, const BIO_ADDR *addr, int options); +int BIO_accept_ex(int accept_sock, BIO_ADDR *addr, int options); +int BIO_closesocket(int sock); + +BIO *BIO_new_socket(int sock, int close_flag); +BIO *BIO_new_connect(const char *host_port); +BIO *BIO_new_accept(const char *host_port); +#endif /* OPENSSL_NO_SOCK*/ + +BIO *BIO_new_fd(int fd, int close_flag); + +int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, + BIO **bio2, size_t writebuf2); +#ifndef OPENSSL_NO_DGRAM +int BIO_new_bio_dgram_pair(BIO **bio1, size_t writebuf1, + BIO **bio2, size_t writebuf2); +#endif + +/* + * If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. + * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. Size 0 uses default + * value. + */ + +void BIO_copy_next_retry(BIO *b); + +/* + * long BIO_ghbn_ctrl(int cmd,int iarg,char *parg); + */ + +#define ossl_bio__attr__(x) +#if defined(__GNUC__) && defined(__STDC_VERSION__) \ + && !defined(__MINGW32__) && !defined(__MINGW64__) \ + && !defined(__APPLE__) +/* + * Because we support the 'z' modifier, which made its appearance in C99, + * we can't use __attribute__ with pre C99 dialects. + */ +#if __STDC_VERSION__ >= 199901L +#undef ossl_bio__attr__ +#define ossl_bio__attr__ __attribute__ +#if __GNUC__ * 10 + __GNUC_MINOR__ >= 44 +#define ossl_bio__printf__ __gnu_printf__ +#else +#define ossl_bio__printf__ __printf__ +#endif +#endif +#endif +int BIO_printf(BIO *bio, const char *format, ...) + ossl_bio__attr__((__format__(ossl_bio__printf__, 2, 3))); +int BIO_vprintf(BIO *bio, const char *format, va_list args) + ossl_bio__attr__((__format__(ossl_bio__printf__, 2, 0))); +int BIO_snprintf(char *buf, size_t n, const char *format, ...) + ossl_bio__attr__((__format__(ossl_bio__printf__, 3, 4))); +int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) + ossl_bio__attr__((__format__(ossl_bio__printf__, 3, 0))); +#undef ossl_bio__attr__ +#undef ossl_bio__printf__ + +BIO_METHOD *BIO_meth_new(int type, const char *name); +void BIO_meth_free(BIO_METHOD *biom); +int BIO_meth_set_write(BIO_METHOD *biom, + int (*write)(BIO *, const char *, int)); +int BIO_meth_set_write_ex(BIO_METHOD *biom, + int (*bwrite)(BIO *, const char *, size_t, size_t *)); +int BIO_meth_set_sendmmsg(BIO_METHOD *biom, + int (*f)(BIO *, BIO_MSG *, size_t, size_t, + uint64_t, size_t *)); +int BIO_meth_set_read(BIO_METHOD *biom, + int (*read)(BIO *, char *, int)); +int BIO_meth_set_read_ex(BIO_METHOD *biom, + int (*bread)(BIO *, char *, size_t, size_t *)); +int BIO_meth_set_recvmmsg(BIO_METHOD *biom, + int (*f)(BIO *, BIO_MSG *, size_t, size_t, + uint64_t, size_t *)); +int BIO_meth_set_puts(BIO_METHOD *biom, + int (*puts)(BIO *, const char *)); +int BIO_meth_set_gets(BIO_METHOD *biom, + int (*ossl_gets)(BIO *, char *, int)); +int BIO_meth_set_ctrl(BIO_METHOD *biom, + long (*ctrl)(BIO *, int, long, void *)); +int BIO_meth_set_create(BIO_METHOD *biom, int (*create)(BIO *)); +int BIO_meth_set_destroy(BIO_METHOD *biom, int (*destroy)(BIO *)); +int BIO_meth_set_callback_ctrl(BIO_METHOD *biom, + long (*callback_ctrl)(BIO *, int, + BIO_info_cb *)); +#ifndef OPENSSL_NO_DEPRECATED_3_5 +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_write(const BIO_METHOD *biom))(BIO *, const char *, + int); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_write_ex(const BIO_METHOD *biom))(BIO *, const char *, + size_t, size_t *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_sendmmsg(const BIO_METHOD *biom))(BIO *, BIO_MSG *, + size_t, size_t, + uint64_t, size_t *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_read(const BIO_METHOD *biom))(BIO *, char *, int); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_read_ex(const BIO_METHOD *biom))(BIO *, char *, + size_t, size_t *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_recvmmsg(const BIO_METHOD *biom))(BIO *, BIO_MSG *, + size_t, size_t, + uint64_t, size_t *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_puts(const BIO_METHOD *biom))(BIO *, const char *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_gets(const BIO_METHOD *biom))(BIO *, char *, int); +OSSL_DEPRECATEDIN_3_5 long (*BIO_meth_get_ctrl(const BIO_METHOD *biom))(BIO *, int, + long, void *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_create(const BIO_METHOD *bion))(BIO *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_destroy(const BIO_METHOD *biom))(BIO *); +OSSL_DEPRECATEDIN_3_5 long (*BIO_meth_get_callback_ctrl(const BIO_METHOD *biom))(BIO *, int, + BIO_info_cb *); +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/cmp.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/cmp.h new file mode 100644 index 000000000000..af844ec8ed10 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/cmp.h @@ -0,0 +1,741 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/cmp.h.in + * + * Copyright 2007-2026 The OpenSSL Project Authors. All Rights Reserved. + * Copyright Nokia 2007-2019 + * Copyright Siemens AG 2015-2019 + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_CMP_H +#define OPENSSL_CMP_H + +#include +#ifndef OPENSSL_NO_CMP + +#include +#include +#include +#include + +/* explicit #includes not strictly needed since implied by the above: */ +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define OSSL_CMP_PVNO_2 2 +#define OSSL_CMP_PVNO_3 3 +#define OSSL_CMP_PVNO OSSL_CMP_PVNO_2 /* v2 is the default */ + +/*- + * PKIFailureInfo ::= BIT STRING { + * -- since we can fail in more than one way! + * -- More codes may be added in the future if/when required. + * badAlg (0), + * -- unrecognized or unsupported Algorithm Identifier + * badMessageCheck (1), + * -- integrity check failed (e.g., signature did not verify) + * badRequest (2), + * -- transaction not permitted or supported + * badTime (3), + * -- messageTime was not sufficiently close to the system time, + * -- as defined by local policy + * badCertId (4), + * -- no certificate could be found matching the provided criteria + * badDataFormat (5), + * -- the data submitted has the wrong format + * wrongAuthority (6), + * -- the authority indicated in the request is different from the + * -- one creating the response token + * incorrectData (7), + * -- the requester's data is incorrect (for notary services) + * missingTimeStamp (8), + * -- when the timestamp is missing but should be there + * -- (by policy) + * badPOP (9), + * -- the proof-of-possession failed + * certRevoked (10), + * -- the certificate has already been revoked + * certConfirmed (11), + * -- the certificate has already been confirmed + * wrongIntegrity (12), + * -- invalid integrity, password based instead of signature or + * -- vice versa + * badRecipientNonce (13), + * -- invalid recipient nonce, either missing or wrong value + * timeNotAvailable (14), + * -- the TSA's time source is not available + * unacceptedPolicy (15), + * -- the requested TSA policy is not supported by the TSA. + * unacceptedExtension (16), + * -- the requested extension is not supported by the TSA. + * addInfoNotAvailable (17), + * -- the additional information requested could not be + * -- understood or is not available + * badSenderNonce (18), + * -- invalid sender nonce, either missing or wrong size + * badCertTemplate (19), + * -- invalid cert. template or missing mandatory information + * signerNotTrusted (20), + * -- signer of the message unknown or not trusted + * transactionIdInUse (21), + * -- the transaction identifier is already in use + * unsupportedVersion (22), + * -- the version of the message is not supported + * notAuthorized (23), + * -- the sender was not authorized to make the preceding + * -- request or perform the preceding action + * systemUnavail (24), + * -- the request cannot be handled due to system unavailability + * systemFailure (25), + * -- the request cannot be handled due to system failure + * duplicateCertReq (26) + * -- certificate cannot be issued because a duplicate + * -- certificate already exists + * } + */ +#define OSSL_CMP_PKIFAILUREINFO_badAlg 0 +#define OSSL_CMP_PKIFAILUREINFO_badMessageCheck 1 +#define OSSL_CMP_PKIFAILUREINFO_badRequest 2 +#define OSSL_CMP_PKIFAILUREINFO_badTime 3 +#define OSSL_CMP_PKIFAILUREINFO_badCertId 4 +#define OSSL_CMP_PKIFAILUREINFO_badDataFormat 5 +#define OSSL_CMP_PKIFAILUREINFO_wrongAuthority 6 +#define OSSL_CMP_PKIFAILUREINFO_incorrectData 7 +#define OSSL_CMP_PKIFAILUREINFO_missingTimeStamp 8 +#define OSSL_CMP_PKIFAILUREINFO_badPOP 9 +#define OSSL_CMP_PKIFAILUREINFO_certRevoked 10 +#define OSSL_CMP_PKIFAILUREINFO_certConfirmed 11 +#define OSSL_CMP_PKIFAILUREINFO_wrongIntegrity 12 +#define OSSL_CMP_PKIFAILUREINFO_badRecipientNonce 13 +#define OSSL_CMP_PKIFAILUREINFO_timeNotAvailable 14 +#define OSSL_CMP_PKIFAILUREINFO_unacceptedPolicy 15 +#define OSSL_CMP_PKIFAILUREINFO_unacceptedExtension 16 +#define OSSL_CMP_PKIFAILUREINFO_addInfoNotAvailable 17 +#define OSSL_CMP_PKIFAILUREINFO_badSenderNonce 18 +#define OSSL_CMP_PKIFAILUREINFO_badCertTemplate 19 +#define OSSL_CMP_PKIFAILUREINFO_signerNotTrusted 20 +#define OSSL_CMP_PKIFAILUREINFO_transactionIdInUse 21 +#define OSSL_CMP_PKIFAILUREINFO_unsupportedVersion 22 +#define OSSL_CMP_PKIFAILUREINFO_notAuthorized 23 +#define OSSL_CMP_PKIFAILUREINFO_systemUnavail 24 +#define OSSL_CMP_PKIFAILUREINFO_systemFailure 25 +#define OSSL_CMP_PKIFAILUREINFO_duplicateCertReq 26 +#define OSSL_CMP_PKIFAILUREINFO_MAX 26 +#define OSSL_CMP_PKIFAILUREINFO_MAX_BIT_PATTERN \ + ((1 << (OSSL_CMP_PKIFAILUREINFO_MAX + 1)) - 1) +#if OSSL_CMP_PKIFAILUREINFO_MAX_BIT_PATTERN > INT_MAX +#error CMP_PKIFAILUREINFO_MAX bit pattern does not fit in type int +#endif +typedef ASN1_BIT_STRING OSSL_CMP_PKIFAILUREINFO; + +#define OSSL_CMP_CTX_FAILINFO_badAlg (1 << 0) +#define OSSL_CMP_CTX_FAILINFO_badMessageCheck (1 << 1) +#define OSSL_CMP_CTX_FAILINFO_badRequest (1 << 2) +#define OSSL_CMP_CTX_FAILINFO_badTime (1 << 3) +#define OSSL_CMP_CTX_FAILINFO_badCertId (1 << 4) +#define OSSL_CMP_CTX_FAILINFO_badDataFormat (1 << 5) +#define OSSL_CMP_CTX_FAILINFO_wrongAuthority (1 << 6) +#define OSSL_CMP_CTX_FAILINFO_incorrectData (1 << 7) +#define OSSL_CMP_CTX_FAILINFO_missingTimeStamp (1 << 8) +#define OSSL_CMP_CTX_FAILINFO_badPOP (1 << 9) +#define OSSL_CMP_CTX_FAILINFO_certRevoked (1 << 10) +#define OSSL_CMP_CTX_FAILINFO_certConfirmed (1 << 11) +#define OSSL_CMP_CTX_FAILINFO_wrongIntegrity (1 << 12) +#define OSSL_CMP_CTX_FAILINFO_badRecipientNonce (1 << 13) +#define OSSL_CMP_CTX_FAILINFO_timeNotAvailable (1 << 14) +#define OSSL_CMP_CTX_FAILINFO_unacceptedPolicy (1 << 15) +#define OSSL_CMP_CTX_FAILINFO_unacceptedExtension (1 << 16) +#define OSSL_CMP_CTX_FAILINFO_addInfoNotAvailable (1 << 17) +#define OSSL_CMP_CTX_FAILINFO_badSenderNonce (1 << 18) +#define OSSL_CMP_CTX_FAILINFO_badCertTemplate (1 << 19) +#define OSSL_CMP_CTX_FAILINFO_signerNotTrusted (1 << 20) +#define OSSL_CMP_CTX_FAILINFO_transactionIdInUse (1 << 21) +#define OSSL_CMP_CTX_FAILINFO_unsupportedVersion (1 << 22) +#define OSSL_CMP_CTX_FAILINFO_notAuthorized (1 << 23) +#define OSSL_CMP_CTX_FAILINFO_systemUnavail (1 << 24) +#define OSSL_CMP_CTX_FAILINFO_systemFailure (1 << 25) +#define OSSL_CMP_CTX_FAILINFO_duplicateCertReq (1 << 26) + +/*- + * PKIStatus ::= INTEGER { + * accepted (0), + * -- you got exactly what you asked for + * grantedWithMods (1), + * -- you got something like what you asked for; the + * -- requester is responsible for ascertaining the differences + * rejection (2), + * -- you don't get it, more information elsewhere in the message + * waiting (3), + * -- the request body part has not yet been processed; expect to + * -- hear more later (note: proper handling of this status + * -- response MAY use the polling req/rep PKIMessages specified + * -- in Section 5.3.22; alternatively, polling in the underlying + * -- transport layer MAY have some utility in this regard) + * revocationWarning (4), + * -- this message contains a warning that a revocation is + * -- imminent + * revocationNotification (5), + * -- notification that a revocation has occurred + * keyUpdateWarning (6) + * -- update already done for the oldCertId specified in + * -- CertReqMsg + * } + */ +#define OSSL_CMP_PKISTATUS_rejected_by_client -5 +#define OSSL_CMP_PKISTATUS_checking_response -4 +#define OSSL_CMP_PKISTATUS_request -3 +#define OSSL_CMP_PKISTATUS_trans -2 +#define OSSL_CMP_PKISTATUS_unspecified -1 +#define OSSL_CMP_PKISTATUS_accepted 0 +#define OSSL_CMP_PKISTATUS_grantedWithMods 1 +#define OSSL_CMP_PKISTATUS_rejection 2 +#define OSSL_CMP_PKISTATUS_waiting 3 +#define OSSL_CMP_PKISTATUS_revocationWarning 4 +#define OSSL_CMP_PKISTATUS_revocationNotification 5 +#define OSSL_CMP_PKISTATUS_keyUpdateWarning 6 +typedef ASN1_INTEGER OSSL_CMP_PKISTATUS; + +DECLARE_ASN1_ITEM(OSSL_CMP_PKISTATUS) + +#define OSSL_CMP_CERTORENCCERT_CERTIFICATE 0 +#define OSSL_CMP_CERTORENCCERT_ENCRYPTEDCERT 1 + +/* data type declarations */ +typedef struct ossl_cmp_ctx_st OSSL_CMP_CTX; +typedef struct ossl_cmp_pkiheader_st OSSL_CMP_PKIHEADER; +DECLARE_ASN1_FUNCTIONS(OSSL_CMP_PKIHEADER) +typedef struct ossl_cmp_msg_st OSSL_CMP_MSG; +DECLARE_ASN1_DUP_FUNCTION(OSSL_CMP_MSG) +DECLARE_ASN1_ENCODE_FUNCTIONS(OSSL_CMP_MSG, OSSL_CMP_MSG, OSSL_CMP_MSG) +typedef struct ossl_cmp_certstatus_st OSSL_CMP_CERTSTATUS; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_CERTSTATUS, OSSL_CMP_CERTSTATUS, OSSL_CMP_CERTSTATUS) +#define sk_OSSL_CMP_CERTSTATUS_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_value(sk, idx) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk), (idx))) +#define sk_OSSL_CMP_CERTSTATUS_new(cmp) ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_CERTSTATUS_compfunc_type(cmp))) +#define sk_OSSL_CMP_CERTSTATUS_new_null() ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_CERTSTATUS_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_CERTSTATUS_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_CERTSTATUS_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), (n)) +#define sk_OSSL_CMP_CERTSTATUS_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_delete(sk, i) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), (i))) +#define sk_OSSL_CMP_CERTSTATUS_delete_ptr(sk, ptr) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr))) +#define sk_OSSL_CMP_CERTSTATUS_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr)) +#define sk_OSSL_CMP_CERTSTATUS_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr)) +#define sk_OSSL_CMP_CERTSTATUS_pop(sk) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CERTSTATUS_shift(sk) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CERTSTATUS_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk),ossl_check_OSSL_CMP_CERTSTATUS_freefunc_type(freefunc)) +#define sk_OSSL_CMP_CERTSTATUS_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr), (idx)) +#define sk_OSSL_CMP_CERTSTATUS_set(sk, idx, ptr) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_set(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), (idx), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr))) +#define sk_OSSL_CMP_CERTSTATUS_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr)) +#define sk_OSSL_CMP_CERTSTATUS_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr)) +#define sk_OSSL_CMP_CERTSTATUS_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr), pnum) +#define sk_OSSL_CMP_CERTSTATUS_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_dup(sk) ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CERTSTATUS_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_CERTSTATUS_freefunc_type(freefunc))) +#define sk_OSSL_CMP_CERTSTATUS_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_CERTSTATUS_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_compfunc_type(cmp))) + +/* clang-format on */ +typedef struct ossl_cmp_itav_st OSSL_CMP_ITAV; +DECLARE_ASN1_DUP_FUNCTION(OSSL_CMP_ITAV) +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_ITAV, OSSL_CMP_ITAV, OSSL_CMP_ITAV) +#define sk_OSSL_CMP_ITAV_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_value(sk, idx) ((OSSL_CMP_ITAV *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk), (idx))) +#define sk_OSSL_CMP_ITAV_new(cmp) ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_ITAV_compfunc_type(cmp))) +#define sk_OSSL_CMP_ITAV_new_null() ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_ITAV_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_ITAV_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_ITAV_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_ITAV_sk_type(sk), (n)) +#define sk_OSSL_CMP_ITAV_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_delete(sk, i) ((OSSL_CMP_ITAV *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_ITAV_sk_type(sk), (i))) +#define sk_OSSL_CMP_ITAV_delete_ptr(sk, ptr) ((OSSL_CMP_ITAV *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr))) +#define sk_OSSL_CMP_ITAV_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr)) +#define sk_OSSL_CMP_ITAV_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr)) +#define sk_OSSL_CMP_ITAV_pop(sk) ((OSSL_CMP_ITAV *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_ITAV_sk_type(sk))) +#define sk_OSSL_CMP_ITAV_shift(sk) ((OSSL_CMP_ITAV *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_ITAV_sk_type(sk))) +#define sk_OSSL_CMP_ITAV_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_ITAV_sk_type(sk),ossl_check_OSSL_CMP_ITAV_freefunc_type(freefunc)) +#define sk_OSSL_CMP_ITAV_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr), (idx)) +#define sk_OSSL_CMP_ITAV_set(sk, idx, ptr) ((OSSL_CMP_ITAV *)OPENSSL_sk_set(ossl_check_OSSL_CMP_ITAV_sk_type(sk), (idx), ossl_check_OSSL_CMP_ITAV_type(ptr))) +#define sk_OSSL_CMP_ITAV_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr)) +#define sk_OSSL_CMP_ITAV_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr)) +#define sk_OSSL_CMP_ITAV_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr), pnum) +#define sk_OSSL_CMP_ITAV_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_dup(sk) ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk))) +#define sk_OSSL_CMP_ITAV_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_ITAV_freefunc_type(freefunc))) +#define sk_OSSL_CMP_ITAV_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_ITAV_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct ossl_cmp_crlstatus_st OSSL_CMP_CRLSTATUS; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_CRLSTATUS, OSSL_CMP_CRLSTATUS, OSSL_CMP_CRLSTATUS) +#define sk_OSSL_CMP_CRLSTATUS_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_CRLSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CRLSTATUS_value(sk, idx) ((OSSL_CMP_CRLSTATUS *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_CRLSTATUS_sk_type(sk), (idx))) +#define sk_OSSL_CMP_CRLSTATUS_new(cmp) ((STACK_OF(OSSL_CMP_CRLSTATUS) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_CRLSTATUS_compfunc_type(cmp))) +#define sk_OSSL_CMP_CRLSTATUS_new_null() ((STACK_OF(OSSL_CMP_CRLSTATUS) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_CRLSTATUS_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_CRLSTATUS) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_CRLSTATUS_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_CRLSTATUS_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), (n)) +#define sk_OSSL_CMP_CRLSTATUS_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CRLSTATUS_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CRLSTATUS_delete(sk, i) ((OSSL_CMP_CRLSTATUS *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), (i))) +#define sk_OSSL_CMP_CRLSTATUS_delete_ptr(sk, ptr) ((OSSL_CMP_CRLSTATUS *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr))) +#define sk_OSSL_CMP_CRLSTATUS_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr)) +#define sk_OSSL_CMP_CRLSTATUS_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr)) +#define sk_OSSL_CMP_CRLSTATUS_pop(sk) ((OSSL_CMP_CRLSTATUS *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CRLSTATUS_shift(sk) ((OSSL_CMP_CRLSTATUS *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CRLSTATUS_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk),ossl_check_OSSL_CMP_CRLSTATUS_freefunc_type(freefunc)) +#define sk_OSSL_CMP_CRLSTATUS_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr), (idx)) +#define sk_OSSL_CMP_CRLSTATUS_set(sk, idx, ptr) ((OSSL_CMP_CRLSTATUS *)OPENSSL_sk_set(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), (idx), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr))) +#define sk_OSSL_CMP_CRLSTATUS_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr)) +#define sk_OSSL_CMP_CRLSTATUS_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr)) +#define sk_OSSL_CMP_CRLSTATUS_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr), pnum) +#define sk_OSSL_CMP_CRLSTATUS_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CRLSTATUS_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_CRLSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CRLSTATUS_dup(sk) ((STACK_OF(OSSL_CMP_CRLSTATUS) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_CRLSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CRLSTATUS_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_CRLSTATUS) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_CRLSTATUS_freefunc_type(freefunc))) +#define sk_OSSL_CMP_CRLSTATUS_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_CRLSTATUS_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_compfunc_type(cmp))) + +/* clang-format on */ + +typedef OSSL_CRMF_ATTRIBUTETYPEANDVALUE OSSL_CMP_ATAV; +#define OSSL_CMP_ATAV_free OSSL_CRMF_ATTRIBUTETYPEANDVALUE_free +typedef STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) OSSL_CMP_ATAVS; +DECLARE_ASN1_FUNCTIONS(OSSL_CMP_ATAVS) +#define stack_st_OSSL_CMP_ATAV stack_st_OSSL_CRMF_ATTRIBUTETYPEANDVALUE +#define sk_OSSL_CMP_ATAV_num sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_num +#define sk_OSSL_CMP_ATAV_value sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_value +#define sk_OSSL_CMP_ATAV_push sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_push +#define sk_OSSL_CMP_ATAV_pop_free sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_pop_free + +typedef struct ossl_cmp_revrepcontent_st OSSL_CMP_REVREPCONTENT; +typedef struct ossl_cmp_pkisi_st OSSL_CMP_PKISI; +DECLARE_ASN1_FUNCTIONS(OSSL_CMP_PKISI) +DECLARE_ASN1_DUP_FUNCTION(OSSL_CMP_PKISI) +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_PKISI, OSSL_CMP_PKISI, OSSL_CMP_PKISI) +#define sk_OSSL_CMP_PKISI_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_value(sk, idx) ((OSSL_CMP_PKISI *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk), (idx))) +#define sk_OSSL_CMP_PKISI_new(cmp) ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_PKISI_compfunc_type(cmp))) +#define sk_OSSL_CMP_PKISI_new_null() ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_PKISI_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_PKISI_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_PKISI_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_PKISI_sk_type(sk), (n)) +#define sk_OSSL_CMP_PKISI_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_delete(sk, i) ((OSSL_CMP_PKISI *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_PKISI_sk_type(sk), (i))) +#define sk_OSSL_CMP_PKISI_delete_ptr(sk, ptr) ((OSSL_CMP_PKISI *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr))) +#define sk_OSSL_CMP_PKISI_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr)) +#define sk_OSSL_CMP_PKISI_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr)) +#define sk_OSSL_CMP_PKISI_pop(sk) ((OSSL_CMP_PKISI *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_PKISI_sk_type(sk))) +#define sk_OSSL_CMP_PKISI_shift(sk) ((OSSL_CMP_PKISI *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_PKISI_sk_type(sk))) +#define sk_OSSL_CMP_PKISI_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_PKISI_sk_type(sk),ossl_check_OSSL_CMP_PKISI_freefunc_type(freefunc)) +#define sk_OSSL_CMP_PKISI_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr), (idx)) +#define sk_OSSL_CMP_PKISI_set(sk, idx, ptr) ((OSSL_CMP_PKISI *)OPENSSL_sk_set(ossl_check_OSSL_CMP_PKISI_sk_type(sk), (idx), ossl_check_OSSL_CMP_PKISI_type(ptr))) +#define sk_OSSL_CMP_PKISI_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr)) +#define sk_OSSL_CMP_PKISI_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr)) +#define sk_OSSL_CMP_PKISI_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr), pnum) +#define sk_OSSL_CMP_PKISI_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_dup(sk) ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk))) +#define sk_OSSL_CMP_PKISI_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_PKISI_freefunc_type(freefunc))) +#define sk_OSSL_CMP_PKISI_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_PKISI_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_compfunc_type(cmp))) + +/* clang-format on */ +typedef struct ossl_cmp_certrepmessage_st OSSL_CMP_CERTREPMESSAGE; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_CERTREPMESSAGE, OSSL_CMP_CERTREPMESSAGE, OSSL_CMP_CERTREPMESSAGE) +#define sk_OSSL_CMP_CERTREPMESSAGE_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_value(sk, idx) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), (idx))) +#define sk_OSSL_CMP_CERTREPMESSAGE_new(cmp) ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_CERTREPMESSAGE_compfunc_type(cmp))) +#define sk_OSSL_CMP_CERTREPMESSAGE_new_null() ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_CERTREPMESSAGE_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_CERTREPMESSAGE_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_CERTREPMESSAGE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), (n)) +#define sk_OSSL_CMP_CERTREPMESSAGE_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_delete(sk, i) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), (i))) +#define sk_OSSL_CMP_CERTREPMESSAGE_delete_ptr(sk, ptr) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr))) +#define sk_OSSL_CMP_CERTREPMESSAGE_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr)) +#define sk_OSSL_CMP_CERTREPMESSAGE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr)) +#define sk_OSSL_CMP_CERTREPMESSAGE_pop(sk) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk))) +#define sk_OSSL_CMP_CERTREPMESSAGE_shift(sk) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk))) +#define sk_OSSL_CMP_CERTREPMESSAGE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk),ossl_check_OSSL_CMP_CERTREPMESSAGE_freefunc_type(freefunc)) +#define sk_OSSL_CMP_CERTREPMESSAGE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr), (idx)) +#define sk_OSSL_CMP_CERTREPMESSAGE_set(sk, idx, ptr) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_set(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), (idx), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr))) +#define sk_OSSL_CMP_CERTREPMESSAGE_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr)) +#define sk_OSSL_CMP_CERTREPMESSAGE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr)) +#define sk_OSSL_CMP_CERTREPMESSAGE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr), pnum) +#define sk_OSSL_CMP_CERTREPMESSAGE_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_dup(sk) ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk))) +#define sk_OSSL_CMP_CERTREPMESSAGE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_CERTREPMESSAGE_freefunc_type(freefunc))) +#define sk_OSSL_CMP_CERTREPMESSAGE_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_CERTREPMESSAGE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_compfunc_type(cmp))) + +/* clang-format on */ +typedef struct ossl_cmp_pollrep_st OSSL_CMP_POLLREP; +typedef STACK_OF(OSSL_CMP_POLLREP) OSSL_CMP_POLLREPCONTENT; +typedef struct ossl_cmp_certresponse_st OSSL_CMP_CERTRESPONSE; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_CERTRESPONSE, OSSL_CMP_CERTRESPONSE, OSSL_CMP_CERTRESPONSE) +#define sk_OSSL_CMP_CERTRESPONSE_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_value(sk, idx) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk), (idx))) +#define sk_OSSL_CMP_CERTRESPONSE_new(cmp) ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_CERTRESPONSE_compfunc_type(cmp))) +#define sk_OSSL_CMP_CERTRESPONSE_new_null() ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_CERTRESPONSE_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_CERTRESPONSE_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_CERTRESPONSE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), (n)) +#define sk_OSSL_CMP_CERTRESPONSE_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_delete(sk, i) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), (i))) +#define sk_OSSL_CMP_CERTRESPONSE_delete_ptr(sk, ptr) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr))) +#define sk_OSSL_CMP_CERTRESPONSE_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr)) +#define sk_OSSL_CMP_CERTRESPONSE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr)) +#define sk_OSSL_CMP_CERTRESPONSE_pop(sk) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk))) +#define sk_OSSL_CMP_CERTRESPONSE_shift(sk) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk))) +#define sk_OSSL_CMP_CERTRESPONSE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk),ossl_check_OSSL_CMP_CERTRESPONSE_freefunc_type(freefunc)) +#define sk_OSSL_CMP_CERTRESPONSE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr), (idx)) +#define sk_OSSL_CMP_CERTRESPONSE_set(sk, idx, ptr) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_set(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), (idx), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr))) +#define sk_OSSL_CMP_CERTRESPONSE_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr)) +#define sk_OSSL_CMP_CERTRESPONSE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr)) +#define sk_OSSL_CMP_CERTRESPONSE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr), pnum) +#define sk_OSSL_CMP_CERTRESPONSE_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_dup(sk) ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk))) +#define sk_OSSL_CMP_CERTRESPONSE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_CERTRESPONSE_freefunc_type(freefunc))) +#define sk_OSSL_CMP_CERTRESPONSE_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_CERTRESPONSE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_compfunc_type(cmp))) + +/* clang-format on */ +typedef STACK_OF(ASN1_UTF8STRING) OSSL_CMP_PKIFREETEXT; + +/* + * function DECLARATIONS + */ + +/* from cmp_asn.c */ +OSSL_CMP_ITAV *OSSL_CMP_ITAV_create(ASN1_OBJECT *type, ASN1_TYPE *value); +void OSSL_CMP_ITAV_set0(OSSL_CMP_ITAV *itav, ASN1_OBJECT *type, + ASN1_TYPE *value); +ASN1_OBJECT *OSSL_CMP_ITAV_get0_type(const OSSL_CMP_ITAV *itav); +ASN1_TYPE *OSSL_CMP_ITAV_get0_value(const OSSL_CMP_ITAV *itav); +int OSSL_CMP_ITAV_push0_stack_item(STACK_OF(OSSL_CMP_ITAV) **sk_p, + OSSL_CMP_ITAV *itav); +void OSSL_CMP_ITAV_free(OSSL_CMP_ITAV *itav); + +OSSL_CMP_ITAV *OSSL_CMP_ITAV_new0_certProfile(STACK_OF(ASN1_UTF8STRING) + *certProfile); +int OSSL_CMP_ITAV_get0_certProfile(const OSSL_CMP_ITAV *itav, + STACK_OF(ASN1_UTF8STRING) **out); +OSSL_CMP_ITAV *OSSL_CMP_ITAV_new_caCerts(const STACK_OF(X509) *caCerts); +int OSSL_CMP_ITAV_get0_caCerts(const OSSL_CMP_ITAV *itav, STACK_OF(X509) **out); + +OSSL_CMP_ITAV *OSSL_CMP_ITAV_new_rootCaCert(const X509 *rootCaCert); +int OSSL_CMP_ITAV_get0_rootCaCert(const OSSL_CMP_ITAV *itav, X509 **out); +OSSL_CMP_ITAV *OSSL_CMP_ITAV_new_rootCaKeyUpdate(const X509 *newWithNew, + const X509 *newWithOld, + const X509 *oldWithNew); +int OSSL_CMP_ITAV_get0_rootCaKeyUpdate(const OSSL_CMP_ITAV *itav, + X509 **newWithNew, + X509 **newWithOld, + X509 **oldWithNew); + +OSSL_CMP_CRLSTATUS *OSSL_CMP_CRLSTATUS_create(const X509_CRL *crl, + const X509 *cert, int only_DN); +OSSL_CMP_CRLSTATUS *OSSL_CMP_CRLSTATUS_new1(const DIST_POINT_NAME *dpn, + const GENERAL_NAMES *issuer, + const ASN1_TIME *thisUpdate); +int OSSL_CMP_CRLSTATUS_get0(const OSSL_CMP_CRLSTATUS *crlstatus, + DIST_POINT_NAME **dpn, GENERAL_NAMES **issuer, + ASN1_TIME **thisUpdate); +void OSSL_CMP_CRLSTATUS_free(OSSL_CMP_CRLSTATUS *crlstatus); +OSSL_CMP_ITAV +*OSSL_CMP_ITAV_new0_crlStatusList(STACK_OF(OSSL_CMP_CRLSTATUS) *crlStatusList); +int OSSL_CMP_ITAV_get0_crlStatusList(const OSSL_CMP_ITAV *itav, + STACK_OF(OSSL_CMP_CRLSTATUS) **out); +OSSL_CMP_ITAV *OSSL_CMP_ITAV_new_crls(const X509_CRL *crls); +int OSSL_CMP_ITAV_get0_crls(const OSSL_CMP_ITAV *it, STACK_OF(X509_CRL) **out); +OSSL_CMP_ITAV +*OSSL_CMP_ITAV_new0_certReqTemplate(OSSL_CRMF_CERTTEMPLATE *certTemplate, + OSSL_CMP_ATAVS *keySpec); +int OSSL_CMP_ITAV_get1_certReqTemplate(const OSSL_CMP_ITAV *itav, + OSSL_CRMF_CERTTEMPLATE **certTemplate, + OSSL_CMP_ATAVS **keySpec); + +OSSL_CMP_ATAV *OSSL_CMP_ATAV_create(ASN1_OBJECT *type, ASN1_TYPE *value); +void OSSL_CMP_ATAV_set0(OSSL_CMP_ATAV *itav, ASN1_OBJECT *type, + ASN1_TYPE *value); +ASN1_OBJECT *OSSL_CMP_ATAV_get0_type(const OSSL_CMP_ATAV *itav); +ASN1_TYPE *OSSL_CMP_ATAV_get0_value(const OSSL_CMP_ATAV *itav); +OSSL_CMP_ATAV *OSSL_CMP_ATAV_new_algId(const X509_ALGOR *alg); +X509_ALGOR *OSSL_CMP_ATAV_get0_algId(const OSSL_CMP_ATAV *atav); +OSSL_CMP_ATAV *OSSL_CMP_ATAV_new_rsaKeyLen(int len); +int OSSL_CMP_ATAV_get_rsaKeyLen(const OSSL_CMP_ATAV *atav); +int OSSL_CMP_ATAV_push1(OSSL_CMP_ATAVS **sk_p, const OSSL_CMP_ATAV *atav); + +void OSSL_CMP_MSG_free(OSSL_CMP_MSG *msg); + +/* from cmp_ctx.c */ +OSSL_CMP_CTX *OSSL_CMP_CTX_new(OSSL_LIB_CTX *libctx, const char *propq); +void OSSL_CMP_CTX_free(OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_reinit(OSSL_CMP_CTX *ctx); +OSSL_LIB_CTX *OSSL_CMP_CTX_get0_libctx(const OSSL_CMP_CTX *ctx); +const char *OSSL_CMP_CTX_get0_propq(const OSSL_CMP_CTX *ctx); +/* CMP general options: */ +#define OSSL_CMP_OPT_LOG_VERBOSITY 0 +/* CMP transfer options: */ +#define OSSL_CMP_OPT_KEEP_ALIVE 10 +#define OSSL_CMP_OPT_MSG_TIMEOUT 11 +#define OSSL_CMP_OPT_TOTAL_TIMEOUT 12 +#define OSSL_CMP_OPT_USE_TLS 13 +/* CMP request options: */ +#define OSSL_CMP_OPT_VALIDITY_DAYS 20 +#define OSSL_CMP_OPT_SUBJECTALTNAME_NODEFAULT 21 +#define OSSL_CMP_OPT_SUBJECTALTNAME_CRITICAL 22 +#define OSSL_CMP_OPT_POLICIES_CRITICAL 23 +#define OSSL_CMP_OPT_POPO_METHOD 24 +#define OSSL_CMP_OPT_IMPLICIT_CONFIRM 25 +#define OSSL_CMP_OPT_DISABLE_CONFIRM 26 +#define OSSL_CMP_OPT_REVOCATION_REASON 27 +/* CMP protection options: */ +#define OSSL_CMP_OPT_UNPROTECTED_SEND 30 +#define OSSL_CMP_OPT_UNPROTECTED_ERRORS 31 +#define OSSL_CMP_OPT_OWF_ALGNID 32 +#define OSSL_CMP_OPT_MAC_ALGNID 33 +#define OSSL_CMP_OPT_DIGEST_ALGNID 34 +#define OSSL_CMP_OPT_IGNORE_KEYUSAGE 35 +#define OSSL_CMP_OPT_PERMIT_TA_IN_EXTRACERTS_FOR_IR 36 +#define OSSL_CMP_OPT_NO_CACHE_EXTRACERTS 37 +int OSSL_CMP_CTX_set_option(OSSL_CMP_CTX *ctx, int opt, int val); +int OSSL_CMP_CTX_get_option(const OSSL_CMP_CTX *ctx, int opt); +/* CMP-specific callback for logging and outputting the error queue: */ +int OSSL_CMP_CTX_set_log_cb(OSSL_CMP_CTX *ctx, OSSL_CMP_log_cb_t cb); +#define OSSL_CMP_CTX_set_log_verbosity(ctx, level) \ + OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_LOG_VERBOSITY, level) +void OSSL_CMP_CTX_print_errors(const OSSL_CMP_CTX *ctx); +/* message transfer: */ +int OSSL_CMP_CTX_set1_serverPath(OSSL_CMP_CTX *ctx, const char *path); +int OSSL_CMP_CTX_set1_server(OSSL_CMP_CTX *ctx, const char *address); +int OSSL_CMP_CTX_set_serverPort(OSSL_CMP_CTX *ctx, int port); +int OSSL_CMP_CTX_set1_proxy(OSSL_CMP_CTX *ctx, const char *name); +int OSSL_CMP_CTX_set1_no_proxy(OSSL_CMP_CTX *ctx, const char *names); +#ifndef OPENSSL_NO_HTTP +int OSSL_CMP_CTX_set_http_cb(OSSL_CMP_CTX *ctx, OSSL_HTTP_bio_cb_t cb); +int OSSL_CMP_CTX_set_http_cb_arg(OSSL_CMP_CTX *ctx, void *arg); +void *OSSL_CMP_CTX_get_http_cb_arg(const OSSL_CMP_CTX *ctx); +#endif +typedef OSSL_CMP_MSG *(*OSSL_CMP_transfer_cb_t)(OSSL_CMP_CTX *ctx, + const OSSL_CMP_MSG *req); +int OSSL_CMP_CTX_set_transfer_cb(OSSL_CMP_CTX *ctx, OSSL_CMP_transfer_cb_t cb); +int OSSL_CMP_CTX_set_transfer_cb_arg(OSSL_CMP_CTX *ctx, void *arg); +void *OSSL_CMP_CTX_get_transfer_cb_arg(const OSSL_CMP_CTX *ctx); +/* server authentication: */ +int OSSL_CMP_CTX_set1_srvCert(OSSL_CMP_CTX *ctx, X509 *cert); +int OSSL_CMP_CTX_set1_expected_sender(OSSL_CMP_CTX *ctx, const X509_NAME *name); +int OSSL_CMP_CTX_set0_trustedStore(OSSL_CMP_CTX *ctx, X509_STORE *store); +#define OSSL_CMP_CTX_set0_trusted OSSL_CMP_CTX_set0_trustedStore +X509_STORE *OSSL_CMP_CTX_get0_trustedStore(const OSSL_CMP_CTX *ctx); +#define OSSL_CMP_CTX_get0_trusted OSSL_CMP_CTX_get0_trustedStore +int OSSL_CMP_CTX_set1_untrusted(OSSL_CMP_CTX *ctx, STACK_OF(X509) *certs); +STACK_OF(X509) *OSSL_CMP_CTX_get0_untrusted(const OSSL_CMP_CTX *ctx); +/* client authentication: */ +int OSSL_CMP_CTX_set1_cert(OSSL_CMP_CTX *ctx, X509 *cert); +int OSSL_CMP_CTX_build_cert_chain(OSSL_CMP_CTX *ctx, X509_STORE *own_trusted, + STACK_OF(X509) *candidates); +int OSSL_CMP_CTX_set1_pkey(OSSL_CMP_CTX *ctx, EVP_PKEY *pkey); +int OSSL_CMP_CTX_set1_referenceValue(OSSL_CMP_CTX *ctx, + const unsigned char *ref, int len); +int OSSL_CMP_CTX_set1_secretValue(OSSL_CMP_CTX *ctx, + const unsigned char *sec, int len); +/* CMP message header and extra certificates: */ +int OSSL_CMP_CTX_set1_recipient(OSSL_CMP_CTX *ctx, const X509_NAME *name); +int OSSL_CMP_CTX_push0_geninfo_ITAV(OSSL_CMP_CTX *ctx, OSSL_CMP_ITAV *itav); +int OSSL_CMP_CTX_reset_geninfo_ITAVs(OSSL_CMP_CTX *ctx); +STACK_OF(OSSL_CMP_ITAV) +*OSSL_CMP_CTX_get0_geninfo_ITAVs(const OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_set1_extraCertsOut(OSSL_CMP_CTX *ctx, + STACK_OF(X509) *extraCertsOut); +/* certificate template: */ +int OSSL_CMP_CTX_set0_newPkey(OSSL_CMP_CTX *ctx, int priv, EVP_PKEY *pkey); +EVP_PKEY *OSSL_CMP_CTX_get0_newPkey(const OSSL_CMP_CTX *ctx, int priv); +int OSSL_CMP_CTX_set1_issuer(OSSL_CMP_CTX *ctx, const X509_NAME *name); +int OSSL_CMP_CTX_set1_serialNumber(OSSL_CMP_CTX *ctx, const ASN1_INTEGER *sn); +int OSSL_CMP_CTX_set1_subjectName(OSSL_CMP_CTX *ctx, const X509_NAME *name); +int OSSL_CMP_CTX_push1_subjectAltName(OSSL_CMP_CTX *ctx, + const GENERAL_NAME *name); +int OSSL_CMP_CTX_set0_reqExtensions(OSSL_CMP_CTX *ctx, X509_EXTENSIONS *exts); +int OSSL_CMP_CTX_reqExtensions_have_SAN(OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_push0_policy(OSSL_CMP_CTX *ctx, POLICYINFO *pinfo); +int OSSL_CMP_CTX_set1_oldCert(OSSL_CMP_CTX *ctx, X509 *cert); +int OSSL_CMP_CTX_set1_p10CSR(OSSL_CMP_CTX *ctx, const X509_REQ *csr); +/* misc body contents: */ +int OSSL_CMP_CTX_push0_genm_ITAV(OSSL_CMP_CTX *ctx, OSSL_CMP_ITAV *itav); +/* certificate confirmation: */ +typedef int (*OSSL_CMP_certConf_cb_t)(OSSL_CMP_CTX *ctx, X509 *cert, + int fail_info, const char **txt); +int OSSL_CMP_certConf_cb(OSSL_CMP_CTX *ctx, X509 *cert, int fail_info, + const char **text); +int OSSL_CMP_CTX_set_certConf_cb(OSSL_CMP_CTX *ctx, OSSL_CMP_certConf_cb_t cb); +int OSSL_CMP_CTX_set_certConf_cb_arg(OSSL_CMP_CTX *ctx, void *arg); +void *OSSL_CMP_CTX_get_certConf_cb_arg(const OSSL_CMP_CTX *ctx); +/* result fetching: */ +int OSSL_CMP_CTX_get_status(const OSSL_CMP_CTX *ctx); +OSSL_CMP_PKIFREETEXT *OSSL_CMP_CTX_get0_statusString(const OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_get_failInfoCode(const OSSL_CMP_CTX *ctx); +#define OSSL_CMP_PKISI_BUFLEN 1024 +X509 *OSSL_CMP_CTX_get0_validatedSrvCert(const OSSL_CMP_CTX *ctx); +X509 *OSSL_CMP_CTX_get0_newCert(const OSSL_CMP_CTX *ctx); +STACK_OF(X509) *OSSL_CMP_CTX_get1_newChain(const OSSL_CMP_CTX *ctx); +STACK_OF(X509) *OSSL_CMP_CTX_get1_caPubs(const OSSL_CMP_CTX *ctx); +STACK_OF(X509) *OSSL_CMP_CTX_get1_extraCertsIn(const OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_set1_transactionID(OSSL_CMP_CTX *ctx, + const ASN1_OCTET_STRING *id); +int OSSL_CMP_CTX_set1_senderNonce(OSSL_CMP_CTX *ctx, + const ASN1_OCTET_STRING *nonce); + +/* from cmp_status.c */ +char *OSSL_CMP_CTX_snprint_PKIStatus(const OSSL_CMP_CTX *ctx, char *buf, + size_t bufsize); +char *OSSL_CMP_snprint_PKIStatusInfo(const OSSL_CMP_PKISI *statusInfo, + char *buf, size_t bufsize); +OSSL_CMP_PKISI * +OSSL_CMP_STATUSINFO_new(int status, int fail_info, const char *text); + +/* from cmp_hdr.c */ +ASN1_OCTET_STRING *OSSL_CMP_HDR_get0_transactionID(const OSSL_CMP_PKIHEADER *hdr); +ASN1_OCTET_STRING *OSSL_CMP_HDR_get0_recipNonce(const OSSL_CMP_PKIHEADER *hdr); +STACK_OF(OSSL_CMP_ITAV) +*OSSL_CMP_HDR_get0_geninfo_ITAVs(const OSSL_CMP_PKIHEADER *hdr); + +/* from cmp_msg.c */ +OSSL_CMP_PKIHEADER *OSSL_CMP_MSG_get0_header(const OSSL_CMP_MSG *msg); +int OSSL_CMP_MSG_get_bodytype(const OSSL_CMP_MSG *msg); +X509_PUBKEY *OSSL_CMP_MSG_get0_certreq_publickey(const OSSL_CMP_MSG *msg); +int OSSL_CMP_MSG_update_transactionID(OSSL_CMP_CTX *ctx, OSSL_CMP_MSG *msg); +int OSSL_CMP_MSG_update_recipNonce(OSSL_CMP_CTX *ctx, OSSL_CMP_MSG *msg); +OSSL_CRMF_MSG *OSSL_CMP_CTX_setup_CRM(OSSL_CMP_CTX *ctx, int for_KUR, int rid); +OSSL_CMP_MSG *OSSL_CMP_MSG_read(const char *file, OSSL_LIB_CTX *libctx, + const char *propq); +int OSSL_CMP_MSG_write(const char *file, const OSSL_CMP_MSG *msg); +OSSL_CMP_MSG *d2i_OSSL_CMP_MSG_bio(BIO *bio, OSSL_CMP_MSG **msg); +int i2d_OSSL_CMP_MSG_bio(BIO *bio, const OSSL_CMP_MSG *msg); + +/* from cmp_vfy.c */ +int OSSL_CMP_validate_msg(OSSL_CMP_CTX *ctx, const OSSL_CMP_MSG *msg); +int OSSL_CMP_validate_cert_path(const OSSL_CMP_CTX *ctx, + X509_STORE *trusted_store, X509 *cert); + +/* from cmp_http.c */ +#ifndef OPENSSL_NO_HTTP +OSSL_CMP_MSG *OSSL_CMP_MSG_http_perform(OSSL_CMP_CTX *ctx, + const OSSL_CMP_MSG *req); +#endif + +/* from cmp_server.c */ +typedef struct ossl_cmp_srv_ctx_st OSSL_CMP_SRV_CTX; +OSSL_CMP_MSG *OSSL_CMP_SRV_process_request(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req); +OSSL_CMP_MSG *OSSL_CMP_CTX_server_perform(OSSL_CMP_CTX *client_ctx, + const OSSL_CMP_MSG *req); +OSSL_CMP_SRV_CTX *OSSL_CMP_SRV_CTX_new(OSSL_LIB_CTX *libctx, const char *propq); +void OSSL_CMP_SRV_CTX_free(OSSL_CMP_SRV_CTX *srv_ctx); +typedef OSSL_CMP_PKISI *(*OSSL_CMP_SRV_cert_request_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, const OSSL_CMP_MSG *req, int certReqId, + const OSSL_CRMF_MSG *crm, const X509_REQ *p10cr, + X509 **certOut, STACK_OF(X509) **chainOut, STACK_OF(X509) **caPubs); +typedef OSSL_CMP_PKISI *(*OSSL_CMP_SRV_rr_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, + const X509_NAME *issuer, + const ASN1_INTEGER *serial); +typedef int (*OSSL_CMP_SRV_genm_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, + const STACK_OF(OSSL_CMP_ITAV) *in, + STACK_OF(OSSL_CMP_ITAV) **out); +typedef void (*OSSL_CMP_SRV_error_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, + const OSSL_CMP_PKISI *statusInfo, + const ASN1_INTEGER *errorCode, + const OSSL_CMP_PKIFREETEXT *errDetails); +typedef int (*OSSL_CMP_SRV_certConf_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, + int certReqId, + const ASN1_OCTET_STRING *certHash, + const OSSL_CMP_PKISI *si); +typedef int (*OSSL_CMP_SRV_pollReq_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, int certReqId, + OSSL_CMP_MSG **certReq, + int64_t *check_after); +int OSSL_CMP_SRV_CTX_init(OSSL_CMP_SRV_CTX *srv_ctx, void *custom_ctx, + OSSL_CMP_SRV_cert_request_cb_t process_cert_request, + OSSL_CMP_SRV_rr_cb_t process_rr, + OSSL_CMP_SRV_genm_cb_t process_genm, + OSSL_CMP_SRV_error_cb_t process_error, + OSSL_CMP_SRV_certConf_cb_t process_certConf, + OSSL_CMP_SRV_pollReq_cb_t process_pollReq); +typedef int (*OSSL_CMP_SRV_delayed_delivery_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req); +typedef int (*OSSL_CMP_SRV_clean_transaction_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const ASN1_OCTET_STRING *id); +int OSSL_CMP_SRV_CTX_init_trans(OSSL_CMP_SRV_CTX *srv_ctx, + OSSL_CMP_SRV_delayed_delivery_cb_t delay, + OSSL_CMP_SRV_clean_transaction_cb_t clean); +OSSL_CMP_CTX *OSSL_CMP_SRV_CTX_get0_cmp_ctx(const OSSL_CMP_SRV_CTX *srv_ctx); +void *OSSL_CMP_SRV_CTX_get0_custom_ctx(const OSSL_CMP_SRV_CTX *srv_ctx); +int OSSL_CMP_SRV_CTX_set_send_unprotected_errors(OSSL_CMP_SRV_CTX *srv_ctx, + int val); +int OSSL_CMP_SRV_CTX_set_accept_unprotected(OSSL_CMP_SRV_CTX *srv_ctx, int val); +int OSSL_CMP_SRV_CTX_set_accept_raverified(OSSL_CMP_SRV_CTX *srv_ctx, int val); +int OSSL_CMP_SRV_CTX_set_grant_implicit_confirm(OSSL_CMP_SRV_CTX *srv_ctx, + int val); + +/* from cmp_client.c */ +X509 *OSSL_CMP_exec_certreq(OSSL_CMP_CTX *ctx, int req_type, + const OSSL_CRMF_MSG *crm); +#define OSSL_CMP_IR 0 +#define OSSL_CMP_CR 2 +#define OSSL_CMP_P10CR 4 +#define OSSL_CMP_KUR 7 +#define OSSL_CMP_GENM 21 +#define OSSL_CMP_ERROR 23 +#define OSSL_CMP_exec_IR_ses(ctx) \ + OSSL_CMP_exec_certreq(ctx, OSSL_CMP_IR, NULL) +#define OSSL_CMP_exec_CR_ses(ctx) \ + OSSL_CMP_exec_certreq(ctx, OSSL_CMP_CR, NULL) +#define OSSL_CMP_exec_P10CR_ses(ctx) \ + OSSL_CMP_exec_certreq(ctx, OSSL_CMP_P10CR, NULL) +#define OSSL_CMP_exec_KUR_ses(ctx) \ + OSSL_CMP_exec_certreq(ctx, OSSL_CMP_KUR, NULL) +int OSSL_CMP_try_certreq(OSSL_CMP_CTX *ctx, int req_type, + const OSSL_CRMF_MSG *crm, int *checkAfter); +int OSSL_CMP_exec_RR_ses(OSSL_CMP_CTX *ctx); +STACK_OF(OSSL_CMP_ITAV) *OSSL_CMP_exec_GENM_ses(OSSL_CMP_CTX *ctx); + +/* from cmp_genm.c */ +int OSSL_CMP_get1_caCerts(OSSL_CMP_CTX *ctx, STACK_OF(X509) **out); +int OSSL_CMP_get1_rootCaKeyUpdate(OSSL_CMP_CTX *ctx, + const X509 *oldWithOld, X509 **newWithNew, + X509 **newWithOld, X509 **oldWithNew); +int OSSL_CMP_get1_crlUpdate(OSSL_CMP_CTX *ctx, const X509 *crlcert, + const X509_CRL *last_crl, + X509_CRL **crl); +int OSSL_CMP_get1_certReqTemplate(OSSL_CMP_CTX *ctx, + OSSL_CRMF_CERTTEMPLATE **certTemplate, + OSSL_CMP_ATAVS **keySpec); + +#ifdef __cplusplus +} +#endif +#endif /* !defined(OPENSSL_NO_CMP) */ +#endif /* !defined(OPENSSL_CMP_H) */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/cms.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/cms.h new file mode 100644 index 000000000000..e590224acae5 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/cms.h @@ -0,0 +1,515 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/cms.h.in + * + * Copyright 2008-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_CMS_H +#define OPENSSL_CMS_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_CMS_H +#endif + +#include + +#ifndef OPENSSL_NO_CMS +#include +#include +#include +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct CMS_EnvelopedData_st CMS_EnvelopedData; +typedef struct CMS_ContentInfo_st CMS_ContentInfo; +typedef struct CMS_SignerInfo_st CMS_SignerInfo; +typedef struct CMS_SignedData_st CMS_SignedData; +typedef struct CMS_CertificateChoices CMS_CertificateChoices; +typedef struct CMS_RevocationInfoChoice_st CMS_RevocationInfoChoice; +typedef struct CMS_RecipientInfo_st CMS_RecipientInfo; +typedef struct CMS_ReceiptRequest_st CMS_ReceiptRequest; +typedef struct CMS_Receipt_st CMS_Receipt; +typedef struct CMS_RecipientEncryptedKey_st CMS_RecipientEncryptedKey; +typedef struct CMS_OtherKeyAttribute_st CMS_OtherKeyAttribute; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(CMS_SignerInfo, CMS_SignerInfo, CMS_SignerInfo) +#define sk_CMS_SignerInfo_num(sk) OPENSSL_sk_num(ossl_check_const_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_value(sk, idx) ((CMS_SignerInfo *)OPENSSL_sk_value(ossl_check_const_CMS_SignerInfo_sk_type(sk), (idx))) +#define sk_CMS_SignerInfo_new(cmp) ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_new(ossl_check_CMS_SignerInfo_compfunc_type(cmp))) +#define sk_CMS_SignerInfo_new_null() ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_new_null()) +#define sk_CMS_SignerInfo_new_reserve(cmp, n) ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_new_reserve(ossl_check_CMS_SignerInfo_compfunc_type(cmp), (n))) +#define sk_CMS_SignerInfo_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CMS_SignerInfo_sk_type(sk), (n)) +#define sk_CMS_SignerInfo_free(sk) OPENSSL_sk_free(ossl_check_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_zero(sk) OPENSSL_sk_zero(ossl_check_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_delete(sk, i) ((CMS_SignerInfo *)OPENSSL_sk_delete(ossl_check_CMS_SignerInfo_sk_type(sk), (i))) +#define sk_CMS_SignerInfo_delete_ptr(sk, ptr) ((CMS_SignerInfo *)OPENSSL_sk_delete_ptr(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr))) +#define sk_CMS_SignerInfo_push(sk, ptr) OPENSSL_sk_push(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr)) +#define sk_CMS_SignerInfo_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr)) +#define sk_CMS_SignerInfo_pop(sk) ((CMS_SignerInfo *)OPENSSL_sk_pop(ossl_check_CMS_SignerInfo_sk_type(sk))) +#define sk_CMS_SignerInfo_shift(sk) ((CMS_SignerInfo *)OPENSSL_sk_shift(ossl_check_CMS_SignerInfo_sk_type(sk))) +#define sk_CMS_SignerInfo_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CMS_SignerInfo_sk_type(sk),ossl_check_CMS_SignerInfo_freefunc_type(freefunc)) +#define sk_CMS_SignerInfo_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr), (idx)) +#define sk_CMS_SignerInfo_set(sk, idx, ptr) ((CMS_SignerInfo *)OPENSSL_sk_set(ossl_check_CMS_SignerInfo_sk_type(sk), (idx), ossl_check_CMS_SignerInfo_type(ptr))) +#define sk_CMS_SignerInfo_find(sk, ptr) OPENSSL_sk_find(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr)) +#define sk_CMS_SignerInfo_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr)) +#define sk_CMS_SignerInfo_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr), pnum) +#define sk_CMS_SignerInfo_sort(sk) OPENSSL_sk_sort(ossl_check_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_dup(sk) ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_dup(ossl_check_const_CMS_SignerInfo_sk_type(sk))) +#define sk_CMS_SignerInfo_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_deep_copy(ossl_check_const_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_copyfunc_type(copyfunc), ossl_check_CMS_SignerInfo_freefunc_type(freefunc))) +#define sk_CMS_SignerInfo_set_cmp_func(sk, cmp) ((sk_CMS_SignerInfo_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(CMS_RecipientEncryptedKey, CMS_RecipientEncryptedKey, CMS_RecipientEncryptedKey) +#define sk_CMS_RecipientEncryptedKey_num(sk) OPENSSL_sk_num(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_value(sk, idx) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_value(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk), (idx))) +#define sk_CMS_RecipientEncryptedKey_new(cmp) ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_new(ossl_check_CMS_RecipientEncryptedKey_compfunc_type(cmp))) +#define sk_CMS_RecipientEncryptedKey_new_null() ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_new_null()) +#define sk_CMS_RecipientEncryptedKey_new_reserve(cmp, n) ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_new_reserve(ossl_check_CMS_RecipientEncryptedKey_compfunc_type(cmp), (n))) +#define sk_CMS_RecipientEncryptedKey_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), (n)) +#define sk_CMS_RecipientEncryptedKey_free(sk) OPENSSL_sk_free(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_zero(sk) OPENSSL_sk_zero(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_delete(sk, i) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_delete(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), (i))) +#define sk_CMS_RecipientEncryptedKey_delete_ptr(sk, ptr) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_delete_ptr(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr))) +#define sk_CMS_RecipientEncryptedKey_push(sk, ptr) OPENSSL_sk_push(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr)) +#define sk_CMS_RecipientEncryptedKey_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr)) +#define sk_CMS_RecipientEncryptedKey_pop(sk) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_pop(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk))) +#define sk_CMS_RecipientEncryptedKey_shift(sk) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_shift(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk))) +#define sk_CMS_RecipientEncryptedKey_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk),ossl_check_CMS_RecipientEncryptedKey_freefunc_type(freefunc)) +#define sk_CMS_RecipientEncryptedKey_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr), (idx)) +#define sk_CMS_RecipientEncryptedKey_set(sk, idx, ptr) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_set(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), (idx), ossl_check_CMS_RecipientEncryptedKey_type(ptr))) +#define sk_CMS_RecipientEncryptedKey_find(sk, ptr) OPENSSL_sk_find(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr)) +#define sk_CMS_RecipientEncryptedKey_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr)) +#define sk_CMS_RecipientEncryptedKey_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr), pnum) +#define sk_CMS_RecipientEncryptedKey_sort(sk) OPENSSL_sk_sort(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_dup(sk) ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_dup(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk))) +#define sk_CMS_RecipientEncryptedKey_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_deep_copy(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_copyfunc_type(copyfunc), ossl_check_CMS_RecipientEncryptedKey_freefunc_type(freefunc))) +#define sk_CMS_RecipientEncryptedKey_set_cmp_func(sk, cmp) ((sk_CMS_RecipientEncryptedKey_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(CMS_RecipientInfo, CMS_RecipientInfo, CMS_RecipientInfo) +#define sk_CMS_RecipientInfo_num(sk) OPENSSL_sk_num(ossl_check_const_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_value(sk, idx) ((CMS_RecipientInfo *)OPENSSL_sk_value(ossl_check_const_CMS_RecipientInfo_sk_type(sk), (idx))) +#define sk_CMS_RecipientInfo_new(cmp) ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_new(ossl_check_CMS_RecipientInfo_compfunc_type(cmp))) +#define sk_CMS_RecipientInfo_new_null() ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_new_null()) +#define sk_CMS_RecipientInfo_new_reserve(cmp, n) ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_new_reserve(ossl_check_CMS_RecipientInfo_compfunc_type(cmp), (n))) +#define sk_CMS_RecipientInfo_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CMS_RecipientInfo_sk_type(sk), (n)) +#define sk_CMS_RecipientInfo_free(sk) OPENSSL_sk_free(ossl_check_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_zero(sk) OPENSSL_sk_zero(ossl_check_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_delete(sk, i) ((CMS_RecipientInfo *)OPENSSL_sk_delete(ossl_check_CMS_RecipientInfo_sk_type(sk), (i))) +#define sk_CMS_RecipientInfo_delete_ptr(sk, ptr) ((CMS_RecipientInfo *)OPENSSL_sk_delete_ptr(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr))) +#define sk_CMS_RecipientInfo_push(sk, ptr) OPENSSL_sk_push(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr)) +#define sk_CMS_RecipientInfo_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr)) +#define sk_CMS_RecipientInfo_pop(sk) ((CMS_RecipientInfo *)OPENSSL_sk_pop(ossl_check_CMS_RecipientInfo_sk_type(sk))) +#define sk_CMS_RecipientInfo_shift(sk) ((CMS_RecipientInfo *)OPENSSL_sk_shift(ossl_check_CMS_RecipientInfo_sk_type(sk))) +#define sk_CMS_RecipientInfo_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CMS_RecipientInfo_sk_type(sk),ossl_check_CMS_RecipientInfo_freefunc_type(freefunc)) +#define sk_CMS_RecipientInfo_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr), (idx)) +#define sk_CMS_RecipientInfo_set(sk, idx, ptr) ((CMS_RecipientInfo *)OPENSSL_sk_set(ossl_check_CMS_RecipientInfo_sk_type(sk), (idx), ossl_check_CMS_RecipientInfo_type(ptr))) +#define sk_CMS_RecipientInfo_find(sk, ptr) OPENSSL_sk_find(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr)) +#define sk_CMS_RecipientInfo_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr)) +#define sk_CMS_RecipientInfo_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr), pnum) +#define sk_CMS_RecipientInfo_sort(sk) OPENSSL_sk_sort(ossl_check_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_dup(sk) ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_dup(ossl_check_const_CMS_RecipientInfo_sk_type(sk))) +#define sk_CMS_RecipientInfo_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_deep_copy(ossl_check_const_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_copyfunc_type(copyfunc), ossl_check_CMS_RecipientInfo_freefunc_type(freefunc))) +#define sk_CMS_RecipientInfo_set_cmp_func(sk, cmp) ((sk_CMS_RecipientInfo_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(CMS_RevocationInfoChoice, CMS_RevocationInfoChoice, CMS_RevocationInfoChoice) +#define sk_CMS_RevocationInfoChoice_num(sk) OPENSSL_sk_num(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_value(sk, idx) ((CMS_RevocationInfoChoice *)OPENSSL_sk_value(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk), (idx))) +#define sk_CMS_RevocationInfoChoice_new(cmp) ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_new(ossl_check_CMS_RevocationInfoChoice_compfunc_type(cmp))) +#define sk_CMS_RevocationInfoChoice_new_null() ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_new_null()) +#define sk_CMS_RevocationInfoChoice_new_reserve(cmp, n) ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_new_reserve(ossl_check_CMS_RevocationInfoChoice_compfunc_type(cmp), (n))) +#define sk_CMS_RevocationInfoChoice_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), (n)) +#define sk_CMS_RevocationInfoChoice_free(sk) OPENSSL_sk_free(ossl_check_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_zero(sk) OPENSSL_sk_zero(ossl_check_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_delete(sk, i) ((CMS_RevocationInfoChoice *)OPENSSL_sk_delete(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), (i))) +#define sk_CMS_RevocationInfoChoice_delete_ptr(sk, ptr) ((CMS_RevocationInfoChoice *)OPENSSL_sk_delete_ptr(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr))) +#define sk_CMS_RevocationInfoChoice_push(sk, ptr) OPENSSL_sk_push(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr)) +#define sk_CMS_RevocationInfoChoice_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr)) +#define sk_CMS_RevocationInfoChoice_pop(sk) ((CMS_RevocationInfoChoice *)OPENSSL_sk_pop(ossl_check_CMS_RevocationInfoChoice_sk_type(sk))) +#define sk_CMS_RevocationInfoChoice_shift(sk) ((CMS_RevocationInfoChoice *)OPENSSL_sk_shift(ossl_check_CMS_RevocationInfoChoice_sk_type(sk))) +#define sk_CMS_RevocationInfoChoice_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CMS_RevocationInfoChoice_sk_type(sk),ossl_check_CMS_RevocationInfoChoice_freefunc_type(freefunc)) +#define sk_CMS_RevocationInfoChoice_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr), (idx)) +#define sk_CMS_RevocationInfoChoice_set(sk, idx, ptr) ((CMS_RevocationInfoChoice *)OPENSSL_sk_set(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), (idx), ossl_check_CMS_RevocationInfoChoice_type(ptr))) +#define sk_CMS_RevocationInfoChoice_find(sk, ptr) OPENSSL_sk_find(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr)) +#define sk_CMS_RevocationInfoChoice_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr)) +#define sk_CMS_RevocationInfoChoice_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr), pnum) +#define sk_CMS_RevocationInfoChoice_sort(sk) OPENSSL_sk_sort(ossl_check_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_dup(sk) ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_dup(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk))) +#define sk_CMS_RevocationInfoChoice_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_deep_copy(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_copyfunc_type(copyfunc), ossl_check_CMS_RevocationInfoChoice_freefunc_type(freefunc))) +#define sk_CMS_RevocationInfoChoice_set_cmp_func(sk, cmp) ((sk_CMS_RevocationInfoChoice_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_ITEM(CMS_EnvelopedData) +DECLARE_ASN1_ALLOC_FUNCTIONS(CMS_SignedData) +DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo) +DECLARE_ASN1_FUNCTIONS(CMS_ReceiptRequest) +DECLARE_ASN1_PRINT_FUNCTION(CMS_ContentInfo) + +DECLARE_ASN1_DUP_FUNCTION(CMS_EnvelopedData) + +CMS_ContentInfo *CMS_ContentInfo_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +#define CMS_SIGNERINFO_ISSUER_SERIAL 0 +#define CMS_SIGNERINFO_KEYIDENTIFIER 1 + +#define CMS_RECIPINFO_NONE -1 +#define CMS_RECIPINFO_TRANS 0 +#define CMS_RECIPINFO_AGREE 1 +#define CMS_RECIPINFO_KEK 2 +#define CMS_RECIPINFO_PASS 3 +#define CMS_RECIPINFO_OTHER 4 + +/* S/MIME related flags */ + +#define CMS_TEXT 0x1 +#define CMS_NOCERTS 0x2 +#define CMS_NO_CONTENT_VERIFY 0x4 +#define CMS_NO_ATTR_VERIFY 0x8 +#define CMS_NOSIGS \ + (CMS_NO_CONTENT_VERIFY | CMS_NO_ATTR_VERIFY) +#define CMS_NOINTERN 0x10 +#define CMS_NO_SIGNER_CERT_VERIFY 0x20 +#define CMS_NOVERIFY 0x20 +#define CMS_DETACHED 0x40 +#define CMS_BINARY 0x80 +#define CMS_NOATTR 0x100 +#define CMS_NOSMIMECAP 0x200 +#define CMS_NOOLDMIMETYPE 0x400 +#define CMS_CRLFEOL 0x800 +#define CMS_STREAM 0x1000 +#define CMS_NOCRL 0x2000 +#define CMS_PARTIAL 0x4000 +#define CMS_REUSE_DIGEST 0x8000 +#define CMS_USE_KEYID 0x10000 +#define CMS_DEBUG_DECRYPT 0x20000 +#define CMS_KEY_PARAM 0x40000 +#define CMS_ASCIICRLF 0x80000 +#define CMS_CADES 0x100000 +#define CMS_USE_ORIGINATOR_KEYID 0x200000 +#define CMS_NO_SIGNING_TIME 0x400000 + +const ASN1_OBJECT *CMS_get0_type(const CMS_ContentInfo *cms); + +BIO *CMS_dataInit(CMS_ContentInfo *cms, BIO *icont); +int CMS_dataFinal(CMS_ContentInfo *cms, BIO *bio); + +ASN1_OCTET_STRING **CMS_get0_content(CMS_ContentInfo *cms); +int CMS_is_detached(CMS_ContentInfo *cms); +int CMS_set_detached(CMS_ContentInfo *cms, int detached); + +#ifdef OPENSSL_PEM_H +DECLARE_PEM_rw(CMS, CMS_ContentInfo) +#endif +int CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms); +CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms); +int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms); + +BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms); +int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags); +int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, + int flags); +CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont); +CMS_ContentInfo *SMIME_read_CMS_ex(BIO *bio, int flags, BIO **bcont, CMS_ContentInfo **ci); +int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags); + +int CMS_final(CMS_ContentInfo *cms, BIO *data, BIO *dcont, + unsigned int flags); +int CMS_final_digest(CMS_ContentInfo *cms, + const unsigned char *md, unsigned int mdlen, BIO *dcont, + unsigned int flags); + +CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, BIO *data, + unsigned int flags); +CMS_ContentInfo *CMS_sign_ex(X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, BIO *data, + unsigned int flags, OSSL_LIB_CTX *libctx, + const char *propq); + +CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, + X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, unsigned int flags); + +int CMS_data(CMS_ContentInfo *cms, BIO *out, unsigned int flags); +CMS_ContentInfo *CMS_data_create(BIO *in, unsigned int flags); +CMS_ContentInfo *CMS_data_create_ex(BIO *in, unsigned int flags, + OSSL_LIB_CTX *libctx, const char *propq); + +int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_digest_create(BIO *in, const EVP_MD *md, + unsigned int flags); +CMS_ContentInfo *CMS_digest_create_ex(BIO *in, const EVP_MD *md, + unsigned int flags, OSSL_LIB_CTX *libctx, + const char *propq); + +int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, + const unsigned char *key, size_t keylen, + BIO *dcont, BIO *out, unsigned int flags); +CMS_ContentInfo *CMS_EncryptedData_encrypt(BIO *in, const EVP_CIPHER *cipher, + const unsigned char *key, + size_t keylen, unsigned int flags); +CMS_ContentInfo *CMS_EncryptedData_encrypt_ex(BIO *in, const EVP_CIPHER *cipher, + const unsigned char *key, + size_t keylen, unsigned int flags, + OSSL_LIB_CTX *libctx, + const char *propq); + +int CMS_EncryptedData_set1_key(CMS_ContentInfo *cms, const EVP_CIPHER *ciph, + const unsigned char *key, size_t keylen); + +int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + X509_STORE *store, BIO *dcont, BIO *out, unsigned int flags); + +int CMS_verify_receipt(CMS_ContentInfo *rcms, CMS_ContentInfo *ocms, + STACK_OF(X509) *certs, + X509_STORE *store, unsigned int flags); + +STACK_OF(X509) *CMS_get0_signers(CMS_ContentInfo *cms); + +CMS_ContentInfo *CMS_encrypt(STACK_OF(X509) *certs, BIO *in, + const EVP_CIPHER *cipher, unsigned int flags); +CMS_ContentInfo *CMS_encrypt_ex(STACK_OF(X509) *certs, BIO *in, + const EVP_CIPHER *cipher, unsigned int flags, + OSSL_LIB_CTX *libctx, const char *propq); + +int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pkey, X509 *cert, + BIO *dcont, BIO *out, unsigned int flags); + +int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert); +int CMS_decrypt_set1_pkey_and_peer(CMS_ContentInfo *cms, EVP_PKEY *pk, + X509 *cert, X509 *peer); +int CMS_decrypt_set1_key(CMS_ContentInfo *cms, + unsigned char *key, size_t keylen, + const unsigned char *id, size_t idlen); +int CMS_decrypt_set1_password(CMS_ContentInfo *cms, + unsigned char *pass, ossl_ssize_t passlen); + +STACK_OF(CMS_RecipientInfo) *CMS_get0_RecipientInfos(CMS_ContentInfo *cms); +int CMS_RecipientInfo_type(CMS_RecipientInfo *ri); +EVP_PKEY_CTX *CMS_RecipientInfo_get0_pkey_ctx(CMS_RecipientInfo *ri); +CMS_ContentInfo *CMS_AuthEnvelopedData_create(const EVP_CIPHER *cipher); +CMS_ContentInfo * +CMS_AuthEnvelopedData_create_ex(const EVP_CIPHER *cipher, OSSL_LIB_CTX *libctx, + const char *propq); +CMS_ContentInfo *CMS_EnvelopedData_create(const EVP_CIPHER *cipher); +CMS_ContentInfo *CMS_EnvelopedData_create_ex(const EVP_CIPHER *cipher, + OSSL_LIB_CTX *libctx, + const char *propq); +BIO *CMS_EnvelopedData_decrypt(CMS_EnvelopedData *env, BIO *detached_data, + EVP_PKEY *pkey, X509 *cert, + ASN1_OCTET_STRING *secret, unsigned int flags, + OSSL_LIB_CTX *libctx, const char *propq); + +CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, + X509 *recip, unsigned int flags); +CMS_RecipientInfo *CMS_add1_recipient(CMS_ContentInfo *cms, X509 *recip, + EVP_PKEY *originatorPrivKey, X509 *originator, unsigned int flags); +int CMS_RecipientInfo_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pkey); +int CMS_RecipientInfo_ktri_cert_cmp(CMS_RecipientInfo *ri, X509 *cert); +int CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo *ri, + EVP_PKEY **pk, X509 **recip, + X509_ALGOR **palg); +int CMS_RecipientInfo_ktri_get0_signer_id(CMS_RecipientInfo *ri, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +CMS_RecipientInfo *CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, + unsigned char *key, size_t keylen, + unsigned char *id, size_t idlen, + ASN1_GENERALIZEDTIME *date, + ASN1_OBJECT *otherTypeId, + ASN1_TYPE *otherType); + +int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pid, + ASN1_GENERALIZEDTIME **pdate, + ASN1_OBJECT **potherid, + ASN1_TYPE **pothertype); + +int CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri, + unsigned char *key, size_t keylen); + +int CMS_RecipientInfo_kekri_id_cmp(CMS_RecipientInfo *ri, + const unsigned char *id, size_t idlen); + +int CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri, + unsigned char *pass, + ossl_ssize_t passlen); + +CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, + int iter, int wrap_nid, + int pbe_nid, + unsigned char *pass, + ossl_ssize_t passlen, + const EVP_CIPHER *kekciph); + +int CMS_RecipientInfo_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); +int CMS_RecipientInfo_encrypt(const CMS_ContentInfo *cms, CMS_RecipientInfo *ri); + +int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags); + +int CMS_set1_eContentType(CMS_ContentInfo *cms, const ASN1_OBJECT *oid); +const ASN1_OBJECT *CMS_get0_eContentType(CMS_ContentInfo *cms); + +CMS_CertificateChoices *CMS_add0_CertificateChoices(CMS_ContentInfo *cms); +int CMS_add0_cert(CMS_ContentInfo *cms, X509 *cert); +int CMS_add1_cert(CMS_ContentInfo *cms, X509 *cert); +STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms); + +CMS_RevocationInfoChoice *CMS_add0_RevocationInfoChoice(CMS_ContentInfo *cms); +int CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl); +int CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl); +STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms); + +int CMS_SignedData_init(CMS_ContentInfo *cms); +CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, + X509 *signer, EVP_PKEY *pk, const EVP_MD *md, + unsigned int flags); +EVP_PKEY_CTX *CMS_SignerInfo_get0_pkey_ctx(CMS_SignerInfo *si); +EVP_MD_CTX *CMS_SignerInfo_get0_md_ctx(CMS_SignerInfo *si); +STACK_OF(CMS_SignerInfo) *CMS_get0_SignerInfos(CMS_ContentInfo *cms); + +void CMS_SignerInfo_set1_signer_cert(CMS_SignerInfo *si, X509 *signer); +int CMS_SignerInfo_get0_signer_id(CMS_SignerInfo *si, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_SignerInfo_cert_cmp(CMS_SignerInfo *si, X509 *cert); +int CMS_set1_signers_certs(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + unsigned int flags); +void CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, + X509 **signer, X509_ALGOR **pdig, + X509_ALGOR **psig); +ASN1_OCTET_STRING *CMS_SignerInfo_get0_signature(CMS_SignerInfo *si); +int CMS_SignerInfo_sign(CMS_SignerInfo *si); +int CMS_SignerInfo_verify(CMS_SignerInfo *si); +int CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain); +BIO *CMS_SignedData_verify(CMS_SignedData *sd, BIO *detached_data, + STACK_OF(X509) *scerts, X509_STORE *store, + STACK_OF(X509) *extra, STACK_OF(X509_CRL) *crls, + unsigned int flags, + OSSL_LIB_CTX *libctx, const char *propq); + +int CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs); +int CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, + int algnid, int keysize); +int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap); + +int CMS_signed_get_attr_count(const CMS_SignerInfo *si); +int CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, const ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *CMS_signed_get_attr(const CMS_SignerInfo *si, int loc); +X509_ATTRIBUTE *CMS_signed_delete_attr(CMS_SignerInfo *si, int loc); +int CMS_signed_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); +int CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int type, + const void *bytes, int len); +int CMS_signed_add1_attr_by_NID(CMS_SignerInfo *si, + int nid, int type, + const void *bytes, int len); +int CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si, + const char *attrname, int type, + const void *bytes, int len); +void *CMS_signed_get0_data_by_OBJ(const CMS_SignerInfo *si, + const ASN1_OBJECT *oid, + int lastpos, int type); + +int CMS_unsigned_get_attr_count(const CMS_SignerInfo *si); +int CMS_unsigned_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_unsigned_get_attr_by_OBJ(const CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int lastpos); +X509_ATTRIBUTE *CMS_unsigned_get_attr(const CMS_SignerInfo *si, int loc); +X509_ATTRIBUTE *CMS_unsigned_delete_attr(CMS_SignerInfo *si, int loc); +int CMS_unsigned_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); +int CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int type, + const void *bytes, int len); +int CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo *si, + int nid, int type, + const void *bytes, int len); +int CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo *si, + const char *attrname, int type, + const void *bytes, int len); +void *CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, + int lastpos, int type); + +int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr); +CMS_ReceiptRequest *CMS_ReceiptRequest_create0( + unsigned char *id, int idlen, int allorfirst, + STACK_OF(GENERAL_NAMES) *receiptList, + STACK_OF(GENERAL_NAMES) *receiptsTo); +CMS_ReceiptRequest *CMS_ReceiptRequest_create0_ex( + unsigned char *id, int idlen, int allorfirst, + STACK_OF(GENERAL_NAMES) *receiptList, + STACK_OF(GENERAL_NAMES) *receiptsTo, + OSSL_LIB_CTX *libctx); + +int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr); +void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, + ASN1_STRING **pcid, + int *pallorfirst, + STACK_OF(GENERAL_NAMES) **plist, + STACK_OF(GENERAL_NAMES) **prto); +int CMS_RecipientInfo_kari_get0_alg(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pukm); +STACK_OF(CMS_RecipientEncryptedKey) +*CMS_RecipientInfo_kari_get0_reks(CMS_RecipientInfo *ri); + +int CMS_RecipientInfo_kari_get0_orig_id(CMS_RecipientInfo *ri, + X509_ALGOR **pubalg, + ASN1_BIT_STRING **pubkey, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +int CMS_RecipientInfo_kari_orig_id_cmp(CMS_RecipientInfo *ri, X509 *cert); + +int CMS_RecipientEncryptedKey_get0_id(CMS_RecipientEncryptedKey *rek, + ASN1_OCTET_STRING **keyid, + ASN1_GENERALIZEDTIME **tm, + CMS_OtherKeyAttribute **other, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_RecipientEncryptedKey_cert_cmp(CMS_RecipientEncryptedKey *rek, + X509 *cert); +int CMS_RecipientInfo_kari_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pk); +int CMS_RecipientInfo_kari_set0_pkey_and_peer(CMS_RecipientInfo *ri, EVP_PKEY *pk, X509 *peer); +EVP_CIPHER_CTX *CMS_RecipientInfo_kari_get0_ctx(CMS_RecipientInfo *ri); +int CMS_RecipientInfo_kari_decrypt(CMS_ContentInfo *cms, + CMS_RecipientInfo *ri, + CMS_RecipientEncryptedKey *rek); + +int CMS_SharedInfo_encode(unsigned char **pder, X509_ALGOR *kekalg, + ASN1_OCTET_STRING *ukm, int keylen); + +/* Backward compatibility for spelling errors. */ +#define CMS_R_UNKNOWN_DIGEST_ALGORITM CMS_R_UNKNOWN_DIGEST_ALGORITHM +#define CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE \ + CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE + +#ifdef __cplusplus +} +#endif +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/comp.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/comp.h new file mode 100644 index 000000000000..d47246a1a202 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/comp.h @@ -0,0 +1,101 @@ +/* + * Copyright 2015-2024 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_COMP_H +#define OPENSSL_COMP_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_COMP_H +#endif + +#include + +#include +#include +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef OPENSSL_NO_COMP + +COMP_CTX *COMP_CTX_new(COMP_METHOD *meth); +const COMP_METHOD *COMP_CTX_get_method(const COMP_CTX *ctx); +int COMP_CTX_get_type(const COMP_CTX *comp); +int COMP_get_type(const COMP_METHOD *meth); +const char *COMP_get_name(const COMP_METHOD *meth); +void COMP_CTX_free(COMP_CTX *ctx); + +int COMP_compress_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); +int COMP_expand_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); + +COMP_METHOD *COMP_zlib(void); +COMP_METHOD *COMP_zlib_oneshot(void); +COMP_METHOD *COMP_brotli(void); +COMP_METHOD *COMP_brotli_oneshot(void); +COMP_METHOD *COMP_zstd(void); +COMP_METHOD *COMP_zstd_oneshot(void); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define COMP_zlib_cleanup() \ + while (0) \ + continue +#endif + +#ifdef OPENSSL_BIO_H +const BIO_METHOD *BIO_f_zlib(void); +const BIO_METHOD *BIO_f_brotli(void); +const BIO_METHOD *BIO_f_zstd(void); +#endif + +#endif + +typedef struct ssl_comp_st SSL_COMP; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SSL_COMP, SSL_COMP, SSL_COMP) +#define sk_SSL_COMP_num(sk) OPENSSL_sk_num(ossl_check_const_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_value(sk, idx) ((SSL_COMP *)OPENSSL_sk_value(ossl_check_const_SSL_COMP_sk_type(sk), (idx))) +#define sk_SSL_COMP_new(cmp) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new(ossl_check_SSL_COMP_compfunc_type(cmp))) +#define sk_SSL_COMP_new_null() ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new_null()) +#define sk_SSL_COMP_new_reserve(cmp, n) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new_reserve(ossl_check_SSL_COMP_compfunc_type(cmp), (n))) +#define sk_SSL_COMP_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SSL_COMP_sk_type(sk), (n)) +#define sk_SSL_COMP_free(sk) OPENSSL_sk_free(ossl_check_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_zero(sk) OPENSSL_sk_zero(ossl_check_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_delete(sk, i) ((SSL_COMP *)OPENSSL_sk_delete(ossl_check_SSL_COMP_sk_type(sk), (i))) +#define sk_SSL_COMP_delete_ptr(sk, ptr) ((SSL_COMP *)OPENSSL_sk_delete_ptr(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))) +#define sk_SSL_COMP_push(sk, ptr) OPENSSL_sk_push(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)) +#define sk_SSL_COMP_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)) +#define sk_SSL_COMP_pop(sk) ((SSL_COMP *)OPENSSL_sk_pop(ossl_check_SSL_COMP_sk_type(sk))) +#define sk_SSL_COMP_shift(sk) ((SSL_COMP *)OPENSSL_sk_shift(ossl_check_SSL_COMP_sk_type(sk))) +#define sk_SSL_COMP_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SSL_COMP_sk_type(sk),ossl_check_SSL_COMP_freefunc_type(freefunc)) +#define sk_SSL_COMP_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr), (idx)) +#define sk_SSL_COMP_set(sk, idx, ptr) ((SSL_COMP *)OPENSSL_sk_set(ossl_check_SSL_COMP_sk_type(sk), (idx), ossl_check_SSL_COMP_type(ptr))) +#define sk_SSL_COMP_find(sk, ptr) OPENSSL_sk_find(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)) +#define sk_SSL_COMP_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)) +#define sk_SSL_COMP_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr), pnum) +#define sk_SSL_COMP_sort(sk) OPENSSL_sk_sort(ossl_check_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_dup(sk) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_dup(ossl_check_const_SSL_COMP_sk_type(sk))) +#define sk_SSL_COMP_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_deep_copy(ossl_check_const_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_copyfunc_type(copyfunc), ossl_check_SSL_COMP_freefunc_type(freefunc))) +#define sk_SSL_COMP_set_cmp_func(sk, cmp) ((sk_SSL_COMP_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_compfunc_type(cmp))) + +/* clang-format on */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/conf.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/conf.h new file mode 100644 index 000000000000..96b1c6803088 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/conf.h @@ -0,0 +1,219 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/conf.h.in + * + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_CONF_H +#define OPENSSL_CONF_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_CONF_H +#endif + +#include +#include +#include +#include +#include +#include +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + char *section; + char *name; + char *value; +} CONF_VALUE; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(CONF_VALUE, CONF_VALUE, CONF_VALUE) +#define sk_CONF_VALUE_num(sk) OPENSSL_sk_num(ossl_check_const_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_value(sk, idx) ((CONF_VALUE *)OPENSSL_sk_value(ossl_check_const_CONF_VALUE_sk_type(sk), (idx))) +#define sk_CONF_VALUE_new(cmp) ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_new(ossl_check_CONF_VALUE_compfunc_type(cmp))) +#define sk_CONF_VALUE_new_null() ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_new_null()) +#define sk_CONF_VALUE_new_reserve(cmp, n) ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_new_reserve(ossl_check_CONF_VALUE_compfunc_type(cmp), (n))) +#define sk_CONF_VALUE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CONF_VALUE_sk_type(sk), (n)) +#define sk_CONF_VALUE_free(sk) OPENSSL_sk_free(ossl_check_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_zero(sk) OPENSSL_sk_zero(ossl_check_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_delete(sk, i) ((CONF_VALUE *)OPENSSL_sk_delete(ossl_check_CONF_VALUE_sk_type(sk), (i))) +#define sk_CONF_VALUE_delete_ptr(sk, ptr) ((CONF_VALUE *)OPENSSL_sk_delete_ptr(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr))) +#define sk_CONF_VALUE_push(sk, ptr) OPENSSL_sk_push(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr)) +#define sk_CONF_VALUE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr)) +#define sk_CONF_VALUE_pop(sk) ((CONF_VALUE *)OPENSSL_sk_pop(ossl_check_CONF_VALUE_sk_type(sk))) +#define sk_CONF_VALUE_shift(sk) ((CONF_VALUE *)OPENSSL_sk_shift(ossl_check_CONF_VALUE_sk_type(sk))) +#define sk_CONF_VALUE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CONF_VALUE_sk_type(sk),ossl_check_CONF_VALUE_freefunc_type(freefunc)) +#define sk_CONF_VALUE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr), (idx)) +#define sk_CONF_VALUE_set(sk, idx, ptr) ((CONF_VALUE *)OPENSSL_sk_set(ossl_check_CONF_VALUE_sk_type(sk), (idx), ossl_check_CONF_VALUE_type(ptr))) +#define sk_CONF_VALUE_find(sk, ptr) OPENSSL_sk_find(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr)) +#define sk_CONF_VALUE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr)) +#define sk_CONF_VALUE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr), pnum) +#define sk_CONF_VALUE_sort(sk) OPENSSL_sk_sort(ossl_check_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_dup(sk) ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_dup(ossl_check_const_CONF_VALUE_sk_type(sk))) +#define sk_CONF_VALUE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_deep_copy(ossl_check_const_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_copyfunc_type(copyfunc), ossl_check_CONF_VALUE_freefunc_type(freefunc))) +#define sk_CONF_VALUE_set_cmp_func(sk, cmp) ((sk_CONF_VALUE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_compfunc_type(cmp))) +DEFINE_LHASH_OF_INTERNAL(CONF_VALUE); +#define lh_CONF_VALUE_new(hfn, cmp) ((LHASH_OF(CONF_VALUE) *)OPENSSL_LH_set_thunks(OPENSSL_LH_new(ossl_check_CONF_VALUE_lh_hashfunc_type(hfn), ossl_check_CONF_VALUE_lh_compfunc_type(cmp)), lh_CONF_VALUE_hash_thunk, lh_CONF_VALUE_comp_thunk, lh_CONF_VALUE_doall_thunk, lh_CONF_VALUE_doall_arg_thunk)) +#define lh_CONF_VALUE_free(lh) OPENSSL_LH_free(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_flush(lh) OPENSSL_LH_flush(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_insert(lh, ptr) ((CONF_VALUE *)OPENSSL_LH_insert(ossl_check_CONF_VALUE_lh_type(lh), ossl_check_CONF_VALUE_lh_plain_type(ptr))) +#define lh_CONF_VALUE_delete(lh, ptr) ((CONF_VALUE *)OPENSSL_LH_delete(ossl_check_CONF_VALUE_lh_type(lh), ossl_check_const_CONF_VALUE_lh_plain_type(ptr))) +#define lh_CONF_VALUE_retrieve(lh, ptr) ((CONF_VALUE *)OPENSSL_LH_retrieve(ossl_check_CONF_VALUE_lh_type(lh), ossl_check_const_CONF_VALUE_lh_plain_type(ptr))) +#define lh_CONF_VALUE_error(lh) OPENSSL_LH_error(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_num_items(lh) OPENSSL_LH_num_items(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_node_stats_bio(lh, out) OPENSSL_LH_node_stats_bio(ossl_check_const_CONF_VALUE_lh_type(lh), out) +#define lh_CONF_VALUE_node_usage_stats_bio(lh, out) OPENSSL_LH_node_usage_stats_bio(ossl_check_const_CONF_VALUE_lh_type(lh), out) +#define lh_CONF_VALUE_stats_bio(lh, out) OPENSSL_LH_stats_bio(ossl_check_const_CONF_VALUE_lh_type(lh), out) +#define lh_CONF_VALUE_get_down_load(lh) OPENSSL_LH_get_down_load(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_set_down_load(lh, dl) OPENSSL_LH_set_down_load(ossl_check_CONF_VALUE_lh_type(lh), dl) +#define lh_CONF_VALUE_doall(lh, dfn) OPENSSL_LH_doall(ossl_check_CONF_VALUE_lh_type(lh), ossl_check_CONF_VALUE_lh_doallfunc_type(dfn)) + +/* clang-format on */ + +struct conf_st; +struct conf_method_st; +typedef struct conf_method_st CONF_METHOD; + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#include +#endif + +/* Module definitions */ +typedef struct conf_imodule_st CONF_IMODULE; +typedef struct conf_module_st CONF_MODULE; + +STACK_OF(CONF_MODULE); +STACK_OF(CONF_IMODULE); + +/* DSO module function typedefs */ +typedef int conf_init_func(CONF_IMODULE *md, const CONF *cnf); +typedef void conf_finish_func(CONF_IMODULE *md); + +#define CONF_MFLAGS_IGNORE_ERRORS 0x1 +#define CONF_MFLAGS_IGNORE_RETURN_CODES 0x2 +#define CONF_MFLAGS_SILENT 0x4 +#define CONF_MFLAGS_NO_DSO 0x8 +#define CONF_MFLAGS_IGNORE_MISSING_FILE 0x10 +#define CONF_MFLAGS_DEFAULT_SECTION 0x20 + +int CONF_set_default_method(CONF_METHOD *meth); +void CONF_set_nconf(CONF *conf, LHASH_OF(CONF_VALUE) *hash); +LHASH_OF(CONF_VALUE) *CONF_load(LHASH_OF(CONF_VALUE) *conf, const char *file, + long *eline); +#ifndef OPENSSL_NO_STDIO +LHASH_OF(CONF_VALUE) *CONF_load_fp(LHASH_OF(CONF_VALUE) *conf, FILE *fp, + long *eline); +#endif +LHASH_OF(CONF_VALUE) *CONF_load_bio(LHASH_OF(CONF_VALUE) *conf, BIO *bp, + long *eline); +STACK_OF(CONF_VALUE) *CONF_get_section(LHASH_OF(CONF_VALUE) *conf, + const char *section); +char *CONF_get_string(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +long CONF_get_number(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +void CONF_free(LHASH_OF(CONF_VALUE) *conf); +#ifndef OPENSSL_NO_STDIO +int CONF_dump_fp(LHASH_OF(CONF_VALUE) *conf, FILE *out); +#endif +int CONF_dump_bio(LHASH_OF(CONF_VALUE) *conf, BIO *out); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 void OPENSSL_config(const char *config_name); +#endif + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define OPENSSL_no_config() \ + OPENSSL_init_crypto(OPENSSL_INIT_NO_LOAD_CONFIG, NULL) +#endif + +/* + * New conf code. The semantics are different from the functions above. If + * that wasn't the case, the above functions would have been replaced + */ + +CONF *NCONF_new_ex(OSSL_LIB_CTX *libctx, CONF_METHOD *meth); +OSSL_LIB_CTX *NCONF_get0_libctx(const CONF *conf); +CONF *NCONF_new(CONF_METHOD *meth); +CONF_METHOD *NCONF_default(void); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 CONF_METHOD *NCONF_WIN32(void); +#endif +void NCONF_free(CONF *conf); +void NCONF_free_data(CONF *conf); + +int NCONF_load(CONF *conf, const char *file, long *eline); +#ifndef OPENSSL_NO_STDIO +int NCONF_load_fp(CONF *conf, FILE *fp, long *eline); +#endif +int NCONF_load_bio(CONF *conf, BIO *bp, long *eline); +STACK_OF(OPENSSL_CSTRING) *NCONF_get_section_names(const CONF *conf); +STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, + const char *section); +char *NCONF_get_string(const CONF *conf, const char *group, const char *name); +int NCONF_get_number_e(const CONF *conf, const char *group, const char *name, + long *result); +#ifndef OPENSSL_NO_STDIO +int NCONF_dump_fp(const CONF *conf, FILE *out); +#endif +int NCONF_dump_bio(const CONF *conf, BIO *out); + +#define NCONF_get_number(c, g, n, r) NCONF_get_number_e(c, g, n, r) + +/* Module functions */ + +int CONF_modules_load(const CONF *cnf, const char *appname, + unsigned long flags); +int CONF_modules_load_file_ex(OSSL_LIB_CTX *libctx, const char *filename, + const char *appname, unsigned long flags); +int CONF_modules_load_file(const char *filename, const char *appname, + unsigned long flags); +void CONF_modules_unload(int all); +void CONF_modules_finish(void); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define CONF_modules_free() \ + while (0) \ + continue +#endif +int CONF_module_add(const char *name, conf_init_func *ifunc, + conf_finish_func *ffunc); + +const char *CONF_imodule_get_name(const CONF_IMODULE *md); +const char *CONF_imodule_get_value(const CONF_IMODULE *md); +void *CONF_imodule_get_usr_data(const CONF_IMODULE *md); +void CONF_imodule_set_usr_data(CONF_IMODULE *md, void *usr_data); +CONF_MODULE *CONF_imodule_get_module(const CONF_IMODULE *md); +unsigned long CONF_imodule_get_flags(const CONF_IMODULE *md); +void CONF_imodule_set_flags(CONF_IMODULE *md, unsigned long flags); +void *CONF_module_get_usr_data(CONF_MODULE *pmod); +void CONF_module_set_usr_data(CONF_MODULE *pmod, void *usr_data); + +char *CONF_get1_default_config_file(void); + +int CONF_parse_list(const char *list, int sep, int nospc, + int (*list_cb)(const char *elem, int len, void *usr), + void *arg); + +void OPENSSL_load_builtin_modules(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/configuration.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/configuration.h new file mode 100644 index 000000000000..8dc77fcbf2f7 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/configuration.h @@ -0,0 +1,190 @@ +/* + * WARNING: do not edit! + * Generated by configdata.pm from Configurations/common0.tmpl, Configurations/unix-Makefile.tmpl + * via Makefile.in + * + * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CONFIGURATION_H +#define OPENSSL_CONFIGURATION_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_ALGORITHM_DEFINES +#error OPENSSL_ALGORITHM_DEFINES no longer supported +#endif + +/* + * OpenSSL was configured with the following options: + */ + +/* clang-format off */ +# define OPENSSL_CONFIGURED_API 30500 +# ifndef OPENSSL_RAND_SEED_OS +# define OPENSSL_RAND_SEED_OS +# endif +# ifndef OPENSSL_THREADS +# define OPENSSL_THREADS +# endif +# ifndef OPENSSL_NO_AFALGENG +# define OPENSSL_NO_AFALGENG +# endif +# ifndef OPENSSL_NO_ASAN +# define OPENSSL_NO_ASAN +# endif +# ifndef OPENSSL_NO_BROTLI_DYNAMIC +# define OPENSSL_NO_BROTLI_DYNAMIC +# endif +# ifndef OPENSSL_NO_CRYPTO_MDEBUG +# define OPENSSL_NO_CRYPTO_MDEBUG +# endif +# ifndef OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE +# define OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE +# endif +# ifndef OPENSSL_NO_DEMOS +# define OPENSSL_NO_DEMOS +# endif +# ifndef OPENSSL_NO_DEVCRYPTOENG +# define OPENSSL_NO_DEVCRYPTOENG +# endif +# ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +# define OPENSSL_NO_EC_NISTP_64_GCC_128 +# endif +# ifndef OPENSSL_NO_EGD +# define OPENSSL_NO_EGD +# endif +# ifndef OPENSSL_NO_EXTERNAL_TESTS +# define OPENSSL_NO_EXTERNAL_TESTS +# endif +# ifndef OPENSSL_NO_FIPS_JITTER +# define OPENSSL_NO_FIPS_JITTER +# endif +# ifndef OPENSSL_NO_FUZZ_AFL +# define OPENSSL_NO_FUZZ_AFL +# endif +# ifndef OPENSSL_NO_FUZZ_LIBFUZZER +# define OPENSSL_NO_FUZZ_LIBFUZZER +# endif +# ifndef OPENSSL_NO_H3DEMO +# define OPENSSL_NO_H3DEMO +# endif +# ifndef OPENSSL_NO_HQINTEROP +# define OPENSSL_NO_HQINTEROP +# endif +# ifndef OPENSSL_NO_JITTER +# define OPENSSL_NO_JITTER +# endif +# ifndef OPENSSL_NO_KTLS +# define OPENSSL_NO_KTLS +# endif +# ifndef OPENSSL_NO_LOADERENG +# define OPENSSL_NO_LOADERENG +# endif +# ifndef OPENSSL_NO_MD2 +# define OPENSSL_NO_MD2 +# endif +# ifndef OPENSSL_NO_MSAN +# define OPENSSL_NO_MSAN +# endif +# ifndef OPENSSL_NO_PIE +# define OPENSSL_NO_PIE +# endif +# ifndef OPENSSL_NO_RC5 +# define OPENSSL_NO_RC5 +# endif +# ifndef OPENSSL_NO_SCTP +# define OPENSSL_NO_SCTP +# endif +# ifndef OPENSSL_NO_SSL3 +# define OPENSSL_NO_SSL3 +# endif +# ifndef OPENSSL_NO_SSL3_METHOD +# define OPENSSL_NO_SSL3_METHOD +# endif +# ifndef OPENSSL_NO_SSLKEYLOG +# define OPENSSL_NO_SSLKEYLOG +# endif +# ifndef OPENSSL_NO_TESTS +# define OPENSSL_NO_TESTS +# endif +# ifndef OPENSSL_NO_TFO +# define OPENSSL_NO_TFO +# endif +# ifndef OPENSSL_NO_TRACE +# define OPENSSL_NO_TRACE +# endif +# ifndef OPENSSL_NO_UBSAN +# define OPENSSL_NO_UBSAN +# endif +# ifndef OPENSSL_NO_UNIT_TEST +# define OPENSSL_NO_UNIT_TEST +# endif +# ifndef OPENSSL_NO_UPLINK +# define OPENSSL_NO_UPLINK +# endif +# ifndef OPENSSL_NO_WEAK_SSL_CIPHERS +# define OPENSSL_NO_WEAK_SSL_CIPHERS +# endif +# ifndef OPENSSL_NO_WINSTORE +# define OPENSSL_NO_WINSTORE +# endif +# ifndef OPENSSL_NO_ZLIB_DYNAMIC +# define OPENSSL_NO_ZLIB_DYNAMIC +# endif +# ifndef OPENSSL_NO_ZSTD_DYNAMIC +# define OPENSSL_NO_ZSTD_DYNAMIC +# endif +# ifndef OPENSSL_NO_DYNAMIC_ENGINE +# define OPENSSL_NO_DYNAMIC_ENGINE +# endif + +/* clang-format on */ + +/* Generate 80386 code? */ +/* clang-format off */ +# undef I386_ONLY +/* clang-format on */ + +/* + * The following are cipher-specific, but are part of the public API. + */ +#if !defined(OPENSSL_SYS_UEFI) + /* clang-format off */ +# undef BN_LLONG + /* clang-format on */ + /* Only one for the following should be defined */ + /* clang-format off */ +# define SIXTY_FOUR_BIT_LONG + /* clang-format on */ + /* clang-format off */ +# undef SIXTY_FOUR_BIT + /* clang-format on */ + /* clang-format off */ +# undef THIRTY_TWO_BIT +/* clang-format on */ +#endif + +/* clang-format off */ +# define RC4_INT unsigned char +/* clang-format on */ + +#if defined(OPENSSL_NO_COMP) || (defined(OPENSSL_NO_BROTLI) && defined(OPENSSL_NO_ZSTD) && defined(OPENSSL_NO_ZLIB)) +#define OPENSSL_NO_COMP_ALG +#else +#undef OPENSSL_NO_COMP_ALG +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* OPENSSL_CONFIGURATION_H */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/core_names.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/core_names.h new file mode 100644 index 000000000000..aa445e8f1de7 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/core_names.h @@ -0,0 +1,579 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/core_names.h.in + * + * Copyright 2019-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_CORE_NAMES_H +#define OPENSSL_CORE_NAMES_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/* OSSL_CIPHER_PARAM_CTS_MODE Values */ +#define OSSL_CIPHER_CTS_MODE_CS1 "CS1" +#define OSSL_CIPHER_CTS_MODE_CS2 "CS2" +#define OSSL_CIPHER_CTS_MODE_CS3 "CS3" + +/* Known CIPHER names (not a complete list) */ +#define OSSL_CIPHER_NAME_AES_128_GCM_SIV "AES-128-GCM-SIV" +#define OSSL_CIPHER_NAME_AES_192_GCM_SIV "AES-192-GCM-SIV" +#define OSSL_CIPHER_NAME_AES_256_GCM_SIV "AES-256-GCM-SIV" + +/* Known DIGEST names (not a complete list) */ +#define OSSL_DIGEST_NAME_MD5 "MD5" +#define OSSL_DIGEST_NAME_MD5_SHA1 "MD5-SHA1" +#define OSSL_DIGEST_NAME_SHA1 "SHA1" +#define OSSL_DIGEST_NAME_SHA2_224 "SHA2-224" +#define OSSL_DIGEST_NAME_SHA2_256 "SHA2-256" +#define OSSL_DIGEST_NAME_SHA2_256_192 "SHA2-256/192" +#define OSSL_DIGEST_NAME_SHA2_384 "SHA2-384" +#define OSSL_DIGEST_NAME_SHA2_512 "SHA2-512" +#define OSSL_DIGEST_NAME_SHA2_512_224 "SHA2-512/224" +#define OSSL_DIGEST_NAME_SHA2_512_256 "SHA2-512/256" +#define OSSL_DIGEST_NAME_MD2 "MD2" +#define OSSL_DIGEST_NAME_MD4 "MD4" +#define OSSL_DIGEST_NAME_MDC2 "MDC2" +#define OSSL_DIGEST_NAME_RIPEMD160 "RIPEMD160" +#define OSSL_DIGEST_NAME_SHA3_224 "SHA3-224" +#define OSSL_DIGEST_NAME_SHA3_256 "SHA3-256" +#define OSSL_DIGEST_NAME_SHA3_384 "SHA3-384" +#define OSSL_DIGEST_NAME_SHA3_512 "SHA3-512" +#define OSSL_DIGEST_NAME_KECCAK_KMAC128 "KECCAK-KMAC-128" +#define OSSL_DIGEST_NAME_KECCAK_KMAC256 "KECCAK-KMAC-256" +#define OSSL_DIGEST_NAME_SM3 "SM3" + +/* Known MAC names */ +#define OSSL_MAC_NAME_BLAKE2BMAC "BLAKE2BMAC" +#define OSSL_MAC_NAME_BLAKE2SMAC "BLAKE2SMAC" +#define OSSL_MAC_NAME_CMAC "CMAC" +#define OSSL_MAC_NAME_GMAC "GMAC" +#define OSSL_MAC_NAME_HMAC "HMAC" +#define OSSL_MAC_NAME_KMAC128 "KMAC128" +#define OSSL_MAC_NAME_KMAC256 "KMAC256" +#define OSSL_MAC_NAME_POLY1305 "POLY1305" +#define OSSL_MAC_NAME_SIPHASH "SIPHASH" + +/* Known KDF names */ +#define OSSL_KDF_NAME_HKDF "HKDF" +#define OSSL_KDF_NAME_TLS1_3_KDF "TLS13-KDF" +#define OSSL_KDF_NAME_PBKDF1 "PBKDF1" +#define OSSL_KDF_NAME_PBKDF2 "PBKDF2" +#define OSSL_KDF_NAME_SCRYPT "SCRYPT" +#define OSSL_KDF_NAME_SSHKDF "SSHKDF" +#define OSSL_KDF_NAME_SSKDF "SSKDF" +#define OSSL_KDF_NAME_TLS1_PRF "TLS1-PRF" +#define OSSL_KDF_NAME_X942KDF_ASN1 "X942KDF-ASN1" +#define OSSL_KDF_NAME_X942KDF_CONCAT "X942KDF-CONCAT" +#define OSSL_KDF_NAME_X963KDF "X963KDF" +#define OSSL_KDF_NAME_KBKDF "KBKDF" +#define OSSL_KDF_NAME_KRB5KDF "KRB5KDF" +#define OSSL_KDF_NAME_HMACDRBGKDF "HMAC-DRBG-KDF" + +/* RSA padding modes */ +#define OSSL_PKEY_RSA_PAD_MODE_NONE "none" +#define OSSL_PKEY_RSA_PAD_MODE_PKCSV15 "pkcs1" +#define OSSL_PKEY_RSA_PAD_MODE_OAEP "oaep" +#define OSSL_PKEY_RSA_PAD_MODE_X931 "x931" +#define OSSL_PKEY_RSA_PAD_MODE_PSS "pss" + +/* RSA pss padding salt length */ +#define OSSL_PKEY_RSA_PSS_SALT_LEN_DIGEST "digest" +#define OSSL_PKEY_RSA_PSS_SALT_LEN_MAX "max" +#define OSSL_PKEY_RSA_PSS_SALT_LEN_AUTO "auto" +#define OSSL_PKEY_RSA_PSS_SALT_LEN_AUTO_DIGEST_MAX "auto-digestmax" + +/* OSSL_PKEY_PARAM_EC_ENCODING values */ +#define OSSL_PKEY_EC_ENCODING_EXPLICIT "explicit" +#define OSSL_PKEY_EC_ENCODING_GROUP "named_curve" + +#define OSSL_PKEY_EC_POINT_CONVERSION_FORMAT_UNCOMPRESSED "uncompressed" +#define OSSL_PKEY_EC_POINT_CONVERSION_FORMAT_COMPRESSED "compressed" +#define OSSL_PKEY_EC_POINT_CONVERSION_FORMAT_HYBRID "hybrid" + +#define OSSL_PKEY_EC_GROUP_CHECK_DEFAULT "default" +#define OSSL_PKEY_EC_GROUP_CHECK_NAMED "named" +#define OSSL_PKEY_EC_GROUP_CHECK_NAMED_NIST "named-nist" + +/* PROV_SKEY well known key types */ +#define OSSL_SKEY_TYPE_GENERIC "GENERIC-SECRET" +#define OSSL_SKEY_TYPE_AES "AES" + +/* OSSL_KEM_PARAM_OPERATION values */ +#define OSSL_KEM_PARAM_OPERATION_RSASVE "RSASVE" +#define OSSL_KEM_PARAM_OPERATION_DHKEM "DHKEM" + +/* Provider configuration variables */ +#define OSSL_PKEY_RETAIN_SEED "pkey_retain_seed" + +/* Parameter name definitions - generated by util/perl/OpenSSL/paramnames.pm */ +/* clang-format off */ +# define OSSL_ALG_PARAM_ALGORITHM_ID "algorithm-id" +# define OSSL_ALG_PARAM_ALGORITHM_ID_PARAMS "algorithm-id-params" +# define OSSL_ALG_PARAM_CIPHER "cipher" +# define OSSL_ALG_PARAM_DIGEST "digest" +# define OSSL_ALG_PARAM_ENGINE "engine" +# define OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR "fips-indicator" +# define OSSL_ALG_PARAM_MAC "mac" +# define OSSL_ALG_PARAM_PROPERTIES "properties" +# define OSSL_ASYM_CIPHER_PARAM_DIGEST OSSL_PKEY_PARAM_DIGEST +# define OSSL_ASYM_CIPHER_PARAM_ENGINE OSSL_PKEY_PARAM_ENGINE +# define OSSL_ASYM_CIPHER_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_ASYM_CIPHER_PARAM_FIPS_KEY_CHECK OSSL_PKEY_PARAM_FIPS_KEY_CHECK +# define OSSL_ASYM_CIPHER_PARAM_FIPS_RSA_PKCS15_PAD_DISABLED OSSL_PROV_PARAM_RSA_PKCS15_PAD_DISABLED +# define OSSL_ASYM_CIPHER_PARAM_IMPLICIT_REJECTION "implicit-rejection" +# define OSSL_ASYM_CIPHER_PARAM_MGF1_DIGEST OSSL_PKEY_PARAM_MGF1_DIGEST +# define OSSL_ASYM_CIPHER_PARAM_MGF1_DIGEST_PROPS OSSL_PKEY_PARAM_MGF1_PROPERTIES +# define OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST OSSL_ALG_PARAM_DIGEST +# define OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST_PROPS "digest-props" +# define OSSL_ASYM_CIPHER_PARAM_OAEP_LABEL "oaep-label" +# define OSSL_ASYM_CIPHER_PARAM_PAD_MODE OSSL_PKEY_PARAM_PAD_MODE +# define OSSL_ASYM_CIPHER_PARAM_PROPERTIES OSSL_PKEY_PARAM_PROPERTIES +# define OSSL_ASYM_CIPHER_PARAM_TLS_CLIENT_VERSION "tls-client-version" +# define OSSL_ASYM_CIPHER_PARAM_TLS_NEGOTIATED_VERSION "tls-negotiated-version" +# define OSSL_CAPABILITY_TLS_GROUP_ALG "tls-group-alg" +# define OSSL_CAPABILITY_TLS_GROUP_ID "tls-group-id" +# define OSSL_CAPABILITY_TLS_GROUP_IS_KEM "tls-group-is-kem" +# define OSSL_CAPABILITY_TLS_GROUP_MAX_DTLS "tls-max-dtls" +# define OSSL_CAPABILITY_TLS_GROUP_MAX_TLS "tls-max-tls" +# define OSSL_CAPABILITY_TLS_GROUP_MIN_DTLS "tls-min-dtls" +# define OSSL_CAPABILITY_TLS_GROUP_MIN_TLS "tls-min-tls" +# define OSSL_CAPABILITY_TLS_GROUP_NAME "tls-group-name" +# define OSSL_CAPABILITY_TLS_GROUP_NAME_INTERNAL "tls-group-name-internal" +# define OSSL_CAPABILITY_TLS_GROUP_SECURITY_BITS "tls-group-sec-bits" +# define OSSL_CAPABILITY_TLS_SIGALG_CODE_POINT "tls-sigalg-code-point" +# define OSSL_CAPABILITY_TLS_SIGALG_HASH_NAME "tls-sigalg-hash-name" +# define OSSL_CAPABILITY_TLS_SIGALG_HASH_OID "tls-sigalg-hash-oid" +# define OSSL_CAPABILITY_TLS_SIGALG_IANA_NAME "tls-sigalg-iana-name" +# define OSSL_CAPABILITY_TLS_SIGALG_KEYTYPE "tls-sigalg-keytype" +# define OSSL_CAPABILITY_TLS_SIGALG_KEYTYPE_OID "tls-sigalg-keytype-oid" +# define OSSL_CAPABILITY_TLS_SIGALG_MAX_DTLS "tls-max-dtls" +# define OSSL_CAPABILITY_TLS_SIGALG_MAX_TLS "tls-max-tls" +# define OSSL_CAPABILITY_TLS_SIGALG_MIN_DTLS "tls-min-dtls" +# define OSSL_CAPABILITY_TLS_SIGALG_MIN_TLS "tls-min-tls" +# define OSSL_CAPABILITY_TLS_SIGALG_NAME "tls-sigalg-name" +# define OSSL_CAPABILITY_TLS_SIGALG_OID "tls-sigalg-oid" +# define OSSL_CAPABILITY_TLS_SIGALG_SECURITY_BITS "tls-sigalg-sec-bits" +# define OSSL_CAPABILITY_TLS_SIGALG_SIG_NAME "tls-sigalg-sig-name" +# define OSSL_CAPABILITY_TLS_SIGALG_SIG_OID "tls-sigalg-sig-oid" +# define OSSL_CIPHER_PARAM_AEAD "aead" +# define OSSL_CIPHER_PARAM_AEAD_IVLEN OSSL_CIPHER_PARAM_IVLEN +# define OSSL_CIPHER_PARAM_AEAD_IV_GENERATED "iv-generated" +# define OSSL_CIPHER_PARAM_AEAD_MAC_KEY "mackey" +# define OSSL_CIPHER_PARAM_AEAD_TAG "tag" +# define OSSL_CIPHER_PARAM_AEAD_TAGLEN "taglen" +# define OSSL_CIPHER_PARAM_AEAD_TLS1_AAD "tlsaad" +# define OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD "tlsaadpad" +# define OSSL_CIPHER_PARAM_AEAD_TLS1_GET_IV_GEN "tlsivgen" +# define OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED "tlsivfixed" +# define OSSL_CIPHER_PARAM_AEAD_TLS1_SET_IV_INV "tlsivinv" +# define OSSL_CIPHER_PARAM_ALGORITHM_ID OSSL_ALG_PARAM_ALGORITHM_ID +# define OSSL_CIPHER_PARAM_ALGORITHM_ID_PARAMS OSSL_ALG_PARAM_ALGORITHM_ID_PARAMS +# define OSSL_CIPHER_PARAM_ALGORITHM_ID_PARAMS_OLD "alg_id_param" +# define OSSL_CIPHER_PARAM_BLOCK_SIZE "blocksize" +# define OSSL_CIPHER_PARAM_CTS "cts" +# define OSSL_CIPHER_PARAM_CTS_MODE "cts_mode" +# define OSSL_CIPHER_PARAM_CUSTOM_IV "custom-iv" +# define OSSL_CIPHER_PARAM_DECRYPT_ONLY "decrypt-only" +# define OSSL_CIPHER_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_CIPHER_PARAM_FIPS_ENCRYPT_CHECK "encrypt-check" +# define OSSL_CIPHER_PARAM_HAS_RAND_KEY "has-randkey" +# define OSSL_CIPHER_PARAM_IV "iv" +# define OSSL_CIPHER_PARAM_IVLEN "ivlen" +# define OSSL_CIPHER_PARAM_KEYLEN "keylen" +# define OSSL_CIPHER_PARAM_MODE "mode" +# define OSSL_CIPHER_PARAM_NUM "num" +# define OSSL_CIPHER_PARAM_PADDING "padding" +# define OSSL_CIPHER_PARAM_PIPELINE_AEAD_TAG "pipeline-tag" +# define OSSL_CIPHER_PARAM_RANDOM_KEY "randkey" +# define OSSL_CIPHER_PARAM_RC2_KEYBITS "keybits" +# define OSSL_CIPHER_PARAM_ROUNDS "rounds" +# define OSSL_CIPHER_PARAM_SPEED "speed" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK "tls-multi" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD "tls1multi_aad" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD_PACKLEN "tls1multi_aadpacklen" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC "tls1multi_enc" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_IN "tls1multi_encin" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_LEN "tls1multi_enclen" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE "tls1multi_interleave" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_BUFSIZE "tls1multi_maxbufsz" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_SEND_FRAGMENT "tls1multi_maxsndfrag" +# define OSSL_CIPHER_PARAM_TLS_MAC "tls-mac" +# define OSSL_CIPHER_PARAM_TLS_MAC_SIZE "tls-mac-size" +# define OSSL_CIPHER_PARAM_TLS_VERSION "tls-version" +# define OSSL_CIPHER_PARAM_UPDATED_IV "updated-iv" +# define OSSL_CIPHER_PARAM_USE_BITS "use-bits" +# define OSSL_CIPHER_PARAM_XTS_STANDARD "xts_standard" +# define OSSL_DECODER_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +# define OSSL_DIGEST_PARAM_ALGID_ABSENT "algid-absent" +# define OSSL_DIGEST_PARAM_BLOCK_SIZE "blocksize" +# define OSSL_DIGEST_PARAM_MICALG "micalg" +# define OSSL_DIGEST_PARAM_PAD_TYPE "pad-type" +# define OSSL_DIGEST_PARAM_SIZE "size" +# define OSSL_DIGEST_PARAM_SSL3_MS "ssl3-ms" +# define OSSL_DIGEST_PARAM_XOF "xof" +# define OSSL_DIGEST_PARAM_XOFLEN "xoflen" +# define OSSL_DRBG_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER +# define OSSL_DRBG_PARAM_DIGEST OSSL_ALG_PARAM_DIGEST +# define OSSL_DRBG_PARAM_ENTROPY_REQUIRED "entropy_required" +# define OSSL_DRBG_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_DRBG_PARAM_FIPS_DIGEST_CHECK OSSL_PKEY_PARAM_FIPS_DIGEST_CHECK +# define OSSL_DRBG_PARAM_MAC OSSL_ALG_PARAM_MAC +# define OSSL_DRBG_PARAM_MAX_ADINLEN "max_adinlen" +# define OSSL_DRBG_PARAM_MAX_ENTROPYLEN "max_entropylen" +# define OSSL_DRBG_PARAM_MAX_LENGTH "maxium_length" +# define OSSL_DRBG_PARAM_MAX_NONCELEN "max_noncelen" +# define OSSL_DRBG_PARAM_MAX_PERSLEN "max_perslen" +# define OSSL_DRBG_PARAM_MIN_ENTROPYLEN "min_entropylen" +# define OSSL_DRBG_PARAM_MIN_LENGTH "minium_length" +# define OSSL_DRBG_PARAM_MIN_NONCELEN "min_noncelen" +# define OSSL_DRBG_PARAM_PREDICTION_RESISTANCE "prediction_resistance" +# define OSSL_DRBG_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +# define OSSL_DRBG_PARAM_RANDOM_DATA "random_data" +# define OSSL_DRBG_PARAM_RESEED_COUNTER "reseed_counter" +# define OSSL_DRBG_PARAM_RESEED_REQUESTS "reseed_requests" +# define OSSL_DRBG_PARAM_RESEED_TIME "reseed_time" +# define OSSL_DRBG_PARAM_RESEED_TIME_INTERVAL "reseed_time_interval" +# define OSSL_DRBG_PARAM_SIZE "size" +# define OSSL_DRBG_PARAM_USE_DF "use_derivation_function" +# define OSSL_ENCODER_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER +# define OSSL_ENCODER_PARAM_ENCRYPT_LEVEL "encrypt-level" +# define OSSL_ENCODER_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +# define OSSL_ENCODER_PARAM_SAVE_PARAMETERS "save-parameters" +# define OSSL_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE "ecdh-cofactor-mode" +# define OSSL_EXCHANGE_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_EXCHANGE_PARAM_FIPS_DIGEST_CHECK OSSL_PKEY_PARAM_FIPS_DIGEST_CHECK +# define OSSL_EXCHANGE_PARAM_FIPS_ECDH_COFACTOR_CHECK OSSL_PROV_PARAM_ECDH_COFACTOR_CHECK +# define OSSL_EXCHANGE_PARAM_FIPS_KEY_CHECK OSSL_PKEY_PARAM_FIPS_KEY_CHECK +# define OSSL_EXCHANGE_PARAM_KDF_DIGEST "kdf-digest" +# define OSSL_EXCHANGE_PARAM_KDF_DIGEST_PROPS "kdf-digest-props" +# define OSSL_EXCHANGE_PARAM_KDF_OUTLEN "kdf-outlen" +# define OSSL_EXCHANGE_PARAM_KDF_TYPE "kdf-type" +# define OSSL_EXCHANGE_PARAM_KDF_UKM "kdf-ukm" +# define OSSL_EXCHANGE_PARAM_PAD "pad" +# define OSSL_GEN_PARAM_ITERATION "iteration" +# define OSSL_GEN_PARAM_POTENTIAL "potential" +# define OSSL_KDF_PARAM_ARGON2_AD "ad" +# define OSSL_KDF_PARAM_ARGON2_LANES "lanes" +# define OSSL_KDF_PARAM_ARGON2_MEMCOST "memcost" +# define OSSL_KDF_PARAM_ARGON2_VERSION "version" +# define OSSL_KDF_PARAM_CEK_ALG "cekalg" +# define OSSL_KDF_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER +# define OSSL_KDF_PARAM_CONSTANT "constant" +# define OSSL_KDF_PARAM_DATA "data" +# define OSSL_KDF_PARAM_DIGEST OSSL_ALG_PARAM_DIGEST +# define OSSL_KDF_PARAM_EARLY_CLEAN "early_clean" +# define OSSL_KDF_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_KDF_PARAM_FIPS_DIGEST_CHECK OSSL_PKEY_PARAM_FIPS_DIGEST_CHECK +# define OSSL_KDF_PARAM_FIPS_EMS_CHECK "ems_check" +# define OSSL_KDF_PARAM_FIPS_KEY_CHECK OSSL_PKEY_PARAM_FIPS_KEY_CHECK +# define OSSL_KDF_PARAM_HMACDRBG_ENTROPY "entropy" +# define OSSL_KDF_PARAM_HMACDRBG_NONCE "nonce" +# define OSSL_KDF_PARAM_INFO "info" +# define OSSL_KDF_PARAM_ITER "iter" +# define OSSL_KDF_PARAM_KBKDF_R "r" +# define OSSL_KDF_PARAM_KBKDF_USE_L "use-l" +# define OSSL_KDF_PARAM_KBKDF_USE_SEPARATOR "use-separator" +# define OSSL_KDF_PARAM_KEY "key" +# define OSSL_KDF_PARAM_LABEL "label" +# define OSSL_KDF_PARAM_MAC OSSL_ALG_PARAM_MAC +# define OSSL_KDF_PARAM_MAC_SIZE "maclen" +# define OSSL_KDF_PARAM_MODE "mode" +# define OSSL_KDF_PARAM_PASSWORD "pass" +# define OSSL_KDF_PARAM_PKCS12_ID "id" +# define OSSL_KDF_PARAM_PKCS5 "pkcs5" +# define OSSL_KDF_PARAM_PREFIX "prefix" +# define OSSL_KDF_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +# define OSSL_KDF_PARAM_SALT "salt" +# define OSSL_KDF_PARAM_SCRYPT_MAXMEM "maxmem_bytes" +# define OSSL_KDF_PARAM_SCRYPT_N "n" +# define OSSL_KDF_PARAM_SCRYPT_P "p" +# define OSSL_KDF_PARAM_SCRYPT_R "r" +# define OSSL_KDF_PARAM_SECRET "secret" +# define OSSL_KDF_PARAM_SEED "seed" +# define OSSL_KDF_PARAM_SIZE "size" +# define OSSL_KDF_PARAM_SSHKDF_SESSION_ID "session_id" +# define OSSL_KDF_PARAM_SSHKDF_TYPE "type" +# define OSSL_KDF_PARAM_SSHKDF_XCGHASH "xcghash" +# define OSSL_KDF_PARAM_THREADS "threads" +# define OSSL_KDF_PARAM_UKM "ukm" +# define OSSL_KDF_PARAM_X942_ACVPINFO "acvp-info" +# define OSSL_KDF_PARAM_X942_PARTYUINFO "partyu-info" +# define OSSL_KDF_PARAM_X942_PARTYVINFO "partyv-info" +# define OSSL_KDF_PARAM_X942_SUPP_PRIVINFO "supp-privinfo" +# define OSSL_KDF_PARAM_X942_SUPP_PUBINFO "supp-pubinfo" +# define OSSL_KDF_PARAM_X942_USE_KEYBITS "use-keybits" +# define OSSL_KEM_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_KEM_PARAM_FIPS_KEY_CHECK OSSL_PKEY_PARAM_FIPS_KEY_CHECK +# define OSSL_KEM_PARAM_IKME "ikme" +# define OSSL_KEM_PARAM_OPERATION "operation" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_BLOCK_PADDING "block_padding" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_HS_PADDING "hs_padding" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_MAX_EARLY_DATA "max_early_data" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_MAX_FRAG_LEN "max_frag_len" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_MODE "mode" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_OPTIONS "options" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_READ_AHEAD "read_ahead" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_STREAM_MAC "stream_mac" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_TLSTREE "tlstree" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_USE_ETM "use_etm" +# define OSSL_LIBSSL_RECORD_LAYER_READ_BUFFER_LEN "read_buffer_len" +# define OSSL_MAC_PARAM_BLOCK_SIZE "block-size" +# define OSSL_MAC_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER +# define OSSL_MAC_PARAM_CUSTOM "custom" +# define OSSL_MAC_PARAM_C_ROUNDS "c-rounds" +# define OSSL_MAC_PARAM_DIGEST OSSL_ALG_PARAM_DIGEST +# define OSSL_MAC_PARAM_DIGEST_NOINIT "digest-noinit" +# define OSSL_MAC_PARAM_DIGEST_ONESHOT "digest-oneshot" +# define OSSL_MAC_PARAM_D_ROUNDS "d-rounds" +# define OSSL_MAC_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_MAC_PARAM_FIPS_KEY_CHECK OSSL_PKEY_PARAM_FIPS_KEY_CHECK +# define OSSL_MAC_PARAM_FIPS_NO_SHORT_MAC OSSL_PROV_PARAM_NO_SHORT_MAC +# define OSSL_MAC_PARAM_IV "iv" +# define OSSL_MAC_PARAM_KEY "key" +# define OSSL_MAC_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +# define OSSL_MAC_PARAM_SALT "salt" +# define OSSL_MAC_PARAM_SIZE "size" +# define OSSL_MAC_PARAM_TLS_DATA_SIZE "tls-data-size" +# define OSSL_MAC_PARAM_XOF "xof" +# define OSSL_OBJECT_PARAM_DATA "data" +# define OSSL_OBJECT_PARAM_DATA_STRUCTURE "data-structure" +# define OSSL_OBJECT_PARAM_DATA_TYPE "data-type" +# define OSSL_OBJECT_PARAM_DESC "desc" +# define OSSL_OBJECT_PARAM_INPUT_TYPE "input-type" +# define OSSL_OBJECT_PARAM_REFERENCE "reference" +# define OSSL_OBJECT_PARAM_TYPE "type" +# define OSSL_PASSPHRASE_PARAM_INFO "info" +# define OSSL_PKEY_PARAM_ALGORITHM_ID OSSL_ALG_PARAM_ALGORITHM_ID +# define OSSL_PKEY_PARAM_ALGORITHM_ID_PARAMS OSSL_ALG_PARAM_ALGORITHM_ID_PARAMS +# define OSSL_PKEY_PARAM_BITS "bits" +# define OSSL_PKEY_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER +# define OSSL_PKEY_PARAM_DEFAULT_DIGEST "default-digest" +# define OSSL_PKEY_PARAM_DHKEM_IKM "dhkem-ikm" +# define OSSL_PKEY_PARAM_DH_GENERATOR "safeprime-generator" +# define OSSL_PKEY_PARAM_DH_PRIV_LEN "priv_len" +# define OSSL_PKEY_PARAM_DIGEST OSSL_ALG_PARAM_DIGEST +# define OSSL_PKEY_PARAM_DIGEST_SIZE "digest-size" +# define OSSL_PKEY_PARAM_DIST_ID "distid" +# define OSSL_PKEY_PARAM_EC_A "a" +# define OSSL_PKEY_PARAM_EC_B "b" +# define OSSL_PKEY_PARAM_EC_CHAR2_M "m" +# define OSSL_PKEY_PARAM_EC_CHAR2_PP_K1 "k1" +# define OSSL_PKEY_PARAM_EC_CHAR2_PP_K2 "k2" +# define OSSL_PKEY_PARAM_EC_CHAR2_PP_K3 "k3" +# define OSSL_PKEY_PARAM_EC_CHAR2_TP_BASIS "tp" +# define OSSL_PKEY_PARAM_EC_CHAR2_TYPE "basis-type" +# define OSSL_PKEY_PARAM_EC_COFACTOR "cofactor" +# define OSSL_PKEY_PARAM_EC_DECODED_FROM_EXPLICIT_PARAMS "decoded-from-explicit" +# define OSSL_PKEY_PARAM_EC_ENCODING "encoding" +# define OSSL_PKEY_PARAM_EC_FIELD_TYPE "field-type" +# define OSSL_PKEY_PARAM_EC_GENERATOR "generator" +# define OSSL_PKEY_PARAM_EC_GROUP_CHECK_TYPE "group-check" +# define OSSL_PKEY_PARAM_EC_INCLUDE_PUBLIC "include-public" +# define OSSL_PKEY_PARAM_EC_ORDER "order" +# define OSSL_PKEY_PARAM_EC_P "p" +# define OSSL_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT "point-format" +# define OSSL_PKEY_PARAM_EC_PUB_X "qx" +# define OSSL_PKEY_PARAM_EC_PUB_Y "qy" +# define OSSL_PKEY_PARAM_EC_SEED "seed" +# define OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY "encoded-pub-key" +# define OSSL_PKEY_PARAM_ENGINE OSSL_ALG_PARAM_ENGINE +# define OSSL_PKEY_PARAM_FFC_COFACTOR "j" +# define OSSL_PKEY_PARAM_FFC_DIGEST OSSL_PKEY_PARAM_DIGEST +# define OSSL_PKEY_PARAM_FFC_DIGEST_PROPS OSSL_PKEY_PARAM_PROPERTIES +# define OSSL_PKEY_PARAM_FFC_G "g" +# define OSSL_PKEY_PARAM_FFC_GINDEX "gindex" +# define OSSL_PKEY_PARAM_FFC_H "hindex" +# define OSSL_PKEY_PARAM_FFC_P "p" +# define OSSL_PKEY_PARAM_FFC_PBITS "pbits" +# define OSSL_PKEY_PARAM_FFC_PCOUNTER "pcounter" +# define OSSL_PKEY_PARAM_FFC_Q "q" +# define OSSL_PKEY_PARAM_FFC_QBITS "qbits" +# define OSSL_PKEY_PARAM_FFC_SEED "seed" +# define OSSL_PKEY_PARAM_FFC_TYPE "type" +# define OSSL_PKEY_PARAM_FFC_VALIDATE_G "validate-g" +# define OSSL_PKEY_PARAM_FFC_VALIDATE_LEGACY "validate-legacy" +# define OSSL_PKEY_PARAM_FFC_VALIDATE_PQ "validate-pq" +# define OSSL_PKEY_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_PKEY_PARAM_FIPS_DIGEST_CHECK "digest-check" +# define OSSL_PKEY_PARAM_FIPS_KEY_CHECK "key-check" +# define OSSL_PKEY_PARAM_FIPS_SIGN_CHECK "sign-check" +# define OSSL_PKEY_PARAM_GROUP_NAME "group" +# define OSSL_PKEY_PARAM_IMPLICIT_REJECTION "implicit-rejection" +# define OSSL_PKEY_PARAM_MANDATORY_DIGEST "mandatory-digest" +# define OSSL_PKEY_PARAM_MASKGENFUNC "mgf" +# define OSSL_PKEY_PARAM_MAX_SIZE "max-size" +# define OSSL_PKEY_PARAM_MGF1_DIGEST "mgf1-digest" +# define OSSL_PKEY_PARAM_MGF1_PROPERTIES "mgf1-properties" +# define OSSL_PKEY_PARAM_ML_DSA_INPUT_FORMATS "ml-dsa.input_formats" +# define OSSL_PKEY_PARAM_ML_DSA_OUTPUT_FORMATS "ml-dsa.output_formats" +# define OSSL_PKEY_PARAM_ML_DSA_PREFER_SEED "ml-dsa.prefer_seed" +# define OSSL_PKEY_PARAM_ML_DSA_RETAIN_SEED "ml-dsa.retain_seed" +# define OSSL_PKEY_PARAM_ML_DSA_SEED "seed" +# define OSSL_PKEY_PARAM_ML_KEM_IMPORT_PCT_TYPE "ml-kem.import_pct_type" +# define OSSL_PKEY_PARAM_ML_KEM_INPUT_FORMATS "ml-kem.input_formats" +# define OSSL_PKEY_PARAM_ML_KEM_OUTPUT_FORMATS "ml-kem.output_formats" +# define OSSL_PKEY_PARAM_ML_KEM_PREFER_SEED "ml-kem.prefer_seed" +# define OSSL_PKEY_PARAM_ML_KEM_RETAIN_SEED "ml-kem.retain_seed" +# define OSSL_PKEY_PARAM_ML_KEM_SEED "seed" +# define OSSL_PKEY_PARAM_PAD_MODE "pad-mode" +# define OSSL_PKEY_PARAM_PRIV_KEY "priv" +# define OSSL_PKEY_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +# define OSSL_PKEY_PARAM_PUB_KEY "pub" +# define OSSL_PKEY_PARAM_RSA_BITS OSSL_PKEY_PARAM_BITS +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT "rsa-coefficient" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT1 "rsa-coefficient1" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT2 "rsa-coefficient2" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT3 "rsa-coefficient3" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT4 "rsa-coefficient4" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT5 "rsa-coefficient5" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT6 "rsa-coefficient6" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT7 "rsa-coefficient7" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT8 "rsa-coefficient8" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT9 "rsa-coefficient9" +# define OSSL_PKEY_PARAM_RSA_D "d" +# define OSSL_PKEY_PARAM_RSA_DERIVE_FROM_PQ "rsa-derive-from-pq" +# define OSSL_PKEY_PARAM_RSA_DIGEST OSSL_PKEY_PARAM_DIGEST +# define OSSL_PKEY_PARAM_RSA_DIGEST_PROPS OSSL_PKEY_PARAM_PROPERTIES +# define OSSL_PKEY_PARAM_RSA_E "e" +# define OSSL_PKEY_PARAM_RSA_EXPONENT "rsa-exponent" +# define OSSL_PKEY_PARAM_RSA_EXPONENT1 "rsa-exponent1" +# define OSSL_PKEY_PARAM_RSA_EXPONENT10 "rsa-exponent10" +# define OSSL_PKEY_PARAM_RSA_EXPONENT2 "rsa-exponent2" +# define OSSL_PKEY_PARAM_RSA_EXPONENT3 "rsa-exponent3" +# define OSSL_PKEY_PARAM_RSA_EXPONENT4 "rsa-exponent4" +# define OSSL_PKEY_PARAM_RSA_EXPONENT5 "rsa-exponent5" +# define OSSL_PKEY_PARAM_RSA_EXPONENT6 "rsa-exponent6" +# define OSSL_PKEY_PARAM_RSA_EXPONENT7 "rsa-exponent7" +# define OSSL_PKEY_PARAM_RSA_EXPONENT8 "rsa-exponent8" +# define OSSL_PKEY_PARAM_RSA_EXPONENT9 "rsa-exponent9" +# define OSSL_PKEY_PARAM_RSA_FACTOR "rsa-factor" +# define OSSL_PKEY_PARAM_RSA_FACTOR1 "rsa-factor1" +# define OSSL_PKEY_PARAM_RSA_FACTOR10 "rsa-factor10" +# define OSSL_PKEY_PARAM_RSA_FACTOR2 "rsa-factor2" +# define OSSL_PKEY_PARAM_RSA_FACTOR3 "rsa-factor3" +# define OSSL_PKEY_PARAM_RSA_FACTOR4 "rsa-factor4" +# define OSSL_PKEY_PARAM_RSA_FACTOR5 "rsa-factor5" +# define OSSL_PKEY_PARAM_RSA_FACTOR6 "rsa-factor6" +# define OSSL_PKEY_PARAM_RSA_FACTOR7 "rsa-factor7" +# define OSSL_PKEY_PARAM_RSA_FACTOR8 "rsa-factor8" +# define OSSL_PKEY_PARAM_RSA_FACTOR9 "rsa-factor9" +# define OSSL_PKEY_PARAM_RSA_MASKGENFUNC OSSL_PKEY_PARAM_MASKGENFUNC +# define OSSL_PKEY_PARAM_RSA_MGF1_DIGEST OSSL_PKEY_PARAM_MGF1_DIGEST +# define OSSL_PKEY_PARAM_RSA_N "n" +# define OSSL_PKEY_PARAM_RSA_PRIMES "primes" +# define OSSL_PKEY_PARAM_RSA_PSS_SALTLEN "saltlen" +# define OSSL_PKEY_PARAM_RSA_TEST_P1 "p1" +# define OSSL_PKEY_PARAM_RSA_TEST_P2 "p2" +# define OSSL_PKEY_PARAM_RSA_TEST_Q1 "q1" +# define OSSL_PKEY_PARAM_RSA_TEST_Q2 "q2" +# define OSSL_PKEY_PARAM_RSA_TEST_XP "xp" +# define OSSL_PKEY_PARAM_RSA_TEST_XP1 "xp1" +# define OSSL_PKEY_PARAM_RSA_TEST_XP2 "xp2" +# define OSSL_PKEY_PARAM_RSA_TEST_XQ "xq" +# define OSSL_PKEY_PARAM_RSA_TEST_XQ1 "xq1" +# define OSSL_PKEY_PARAM_RSA_TEST_XQ2 "xq2" +# define OSSL_PKEY_PARAM_SECURITY_BITS "security-bits" +# define OSSL_PKEY_PARAM_SLH_DSA_SEED "seed" +# define OSSL_PKEY_PARAM_USE_COFACTOR_ECDH OSSL_PKEY_PARAM_USE_COFACTOR_FLAG +# define OSSL_PKEY_PARAM_USE_COFACTOR_FLAG "use-cofactor-flag" +# define OSSL_PROV_PARAM_BUILDINFO "buildinfo" +# define OSSL_PROV_PARAM_CORE_MODULE_FILENAME "module-filename" +# define OSSL_PROV_PARAM_CORE_PROV_NAME "provider-name" +# define OSSL_PROV_PARAM_CORE_VERSION "openssl-version" +# define OSSL_PROV_PARAM_DRBG_TRUNC_DIGEST "drbg-no-trunc-md" +# define OSSL_PROV_PARAM_DSA_SIGN_DISABLED "dsa-sign-disabled" +# define OSSL_PROV_PARAM_ECDH_COFACTOR_CHECK "ecdh-cofactor-check" +# define OSSL_PROV_PARAM_HKDF_DIGEST_CHECK "hkdf-digest-check" +# define OSSL_PROV_PARAM_HKDF_KEY_CHECK "hkdf-key-check" +# define OSSL_PROV_PARAM_HMAC_KEY_CHECK "hmac-key-check" +# define OSSL_PROV_PARAM_KBKDF_KEY_CHECK "kbkdf-key-check" +# define OSSL_PROV_PARAM_KMAC_KEY_CHECK "kmac-key-check" +# define OSSL_PROV_PARAM_NAME "name" +# define OSSL_PROV_PARAM_NO_SHORT_MAC "no-short-mac" +# define OSSL_PROV_PARAM_PBKDF2_LOWER_BOUND_CHECK "pbkdf2-lower-bound-check" +# define OSSL_PROV_PARAM_RSA_PKCS15_PAD_DISABLED "rsa-pkcs15-pad-disabled" +# define OSSL_PROV_PARAM_RSA_PSS_SALTLEN_CHECK "rsa-pss-saltlen-check" +# define OSSL_PROV_PARAM_RSA_SIGN_X931_PAD_DISABLED "rsa-sign-x931-pad-disabled" +# define OSSL_PROV_PARAM_SECURITY_CHECKS "security-checks" +# define OSSL_PROV_PARAM_SELF_TEST_DESC "st-desc" +# define OSSL_PROV_PARAM_SELF_TEST_PHASE "st-phase" +# define OSSL_PROV_PARAM_SELF_TEST_TYPE "st-type" +# define OSSL_PROV_PARAM_SIGNATURE_DIGEST_CHECK "signature-digest-check" +# define OSSL_PROV_PARAM_SSHKDF_DIGEST_CHECK "sshkdf-digest-check" +# define OSSL_PROV_PARAM_SSHKDF_KEY_CHECK "sshkdf-key-check" +# define OSSL_PROV_PARAM_SSKDF_DIGEST_CHECK "sskdf-digest-check" +# define OSSL_PROV_PARAM_SSKDF_KEY_CHECK "sskdf-key-check" +# define OSSL_PROV_PARAM_STATUS "status" +# define OSSL_PROV_PARAM_TDES_ENCRYPT_DISABLED "tdes-encrypt-disabled" +# define OSSL_PROV_PARAM_TLS13_KDF_DIGEST_CHECK "tls13-kdf-digest-check" +# define OSSL_PROV_PARAM_TLS13_KDF_KEY_CHECK "tls13-kdf-key-check" +# define OSSL_PROV_PARAM_TLS1_PRF_DIGEST_CHECK "tls1-prf-digest-check" +# define OSSL_PROV_PARAM_TLS1_PRF_EMS_CHECK "tls1-prf-ems-check" +# define OSSL_PROV_PARAM_TLS1_PRF_KEY_CHECK "tls1-prf-key-check" +# define OSSL_PROV_PARAM_VERSION "version" +# define OSSL_PROV_PARAM_X942KDF_KEY_CHECK "x942kdf-key-check" +# define OSSL_PROV_PARAM_X963KDF_DIGEST_CHECK "x963kdf-digest-check" +# define OSSL_PROV_PARAM_X963KDF_KEY_CHECK "x963kdf-key-check" +# define OSSL_RAND_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_RAND_PARAM_GENERATE "generate" +# define OSSL_RAND_PARAM_MAX_REQUEST "max_request" +# define OSSL_RAND_PARAM_STATE "state" +# define OSSL_RAND_PARAM_STRENGTH "strength" +# define OSSL_RAND_PARAM_TEST_ENTROPY "test_entropy" +# define OSSL_RAND_PARAM_TEST_NONCE "test_nonce" +# define OSSL_SIGNATURE_PARAM_ADD_RANDOM "additional-random" +# define OSSL_SIGNATURE_PARAM_ALGORITHM_ID OSSL_PKEY_PARAM_ALGORITHM_ID +# define OSSL_SIGNATURE_PARAM_ALGORITHM_ID_PARAMS OSSL_PKEY_PARAM_ALGORITHM_ID_PARAMS +# define OSSL_SIGNATURE_PARAM_CONTEXT_STRING "context-string" +# define OSSL_SIGNATURE_PARAM_DETERMINISTIC "deterministic" +# define OSSL_SIGNATURE_PARAM_DIGEST OSSL_PKEY_PARAM_DIGEST +# define OSSL_SIGNATURE_PARAM_DIGEST_SIZE OSSL_PKEY_PARAM_DIGEST_SIZE +# define OSSL_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK OSSL_PKEY_PARAM_FIPS_DIGEST_CHECK +# define OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK OSSL_PKEY_PARAM_FIPS_KEY_CHECK +# define OSSL_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK "rsa-pss-saltlen-check" +# define OSSL_SIGNATURE_PARAM_FIPS_SIGN_CHECK OSSL_PKEY_PARAM_FIPS_SIGN_CHECK +# define OSSL_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK "sign-x931-pad-check" +# define OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE "verify-message" +# define OSSL_SIGNATURE_PARAM_INSTANCE "instance" +# define OSSL_SIGNATURE_PARAM_KAT "kat" +# define OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING "message-encoding" +# define OSSL_SIGNATURE_PARAM_MGF1_DIGEST OSSL_PKEY_PARAM_MGF1_DIGEST +# define OSSL_SIGNATURE_PARAM_MGF1_PROPERTIES OSSL_PKEY_PARAM_MGF1_PROPERTIES +# define OSSL_SIGNATURE_PARAM_MU "mu" +# define OSSL_SIGNATURE_PARAM_NONCE_TYPE "nonce-type" +# define OSSL_SIGNATURE_PARAM_PAD_MODE OSSL_PKEY_PARAM_PAD_MODE +# define OSSL_SIGNATURE_PARAM_PROPERTIES OSSL_PKEY_PARAM_PROPERTIES +# define OSSL_SIGNATURE_PARAM_PSS_SALTLEN "saltlen" +# define OSSL_SIGNATURE_PARAM_SIGNATURE "signature" +# define OSSL_SIGNATURE_PARAM_TEST_ENTROPY "test-entropy" +# define OSSL_SKEY_PARAM_KEY_LENGTH "key-length" +# define OSSL_SKEY_PARAM_RAW_BYTES "raw-bytes" +# define OSSL_STORE_PARAM_ALIAS "alias" +# define OSSL_STORE_PARAM_DIGEST "digest" +# define OSSL_STORE_PARAM_EXPECT "expect" +# define OSSL_STORE_PARAM_FINGERPRINT "fingerprint" +# define OSSL_STORE_PARAM_INPUT_TYPE "input-type" +# define OSSL_STORE_PARAM_ISSUER "name" +# define OSSL_STORE_PARAM_PROPERTIES "properties" +# define OSSL_STORE_PARAM_SERIAL "serial" +# define OSSL_STORE_PARAM_SUBJECT "subject" +/* clang-format on */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/crmf.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/crmf.h new file mode 100644 index 000000000000..8b32ffb136b6 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/crmf.h @@ -0,0 +1,279 @@ +/*- + * WARNING: do not edit! + * Generated by Makefile from include/openssl/crmf.h.in + * + * Copyright 2007-2025 The OpenSSL Project Authors. All Rights Reserved. + * Copyright Nokia 2007-2019 + * Copyright Siemens AG 2015-2019 + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + * + * CRMF (RFC 4211) implementation by M. Peylo, M. Viljanen, and D. von Oheimb. + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_CRMF_H +#define OPENSSL_CRMF_H + +#include + +#ifndef OPENSSL_NO_CRMF +#include +#include +#include +#include /* for GENERAL_NAME etc. */ +#include + +/* explicit #includes not strictly needed since implied by the above: */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define OSSL_CRMF_POPOPRIVKEY_THISMESSAGE 0 +#define OSSL_CRMF_POPOPRIVKEY_SUBSEQUENTMESSAGE 1 +#define OSSL_CRMF_POPOPRIVKEY_DHMAC 2 +#define OSSL_CRMF_POPOPRIVKEY_AGREEMAC 3 +#define OSSL_CRMF_POPOPRIVKEY_ENCRYPTEDKEY 4 + +#define OSSL_CRMF_SUBSEQUENTMESSAGE_ENCRCERT 0 +#define OSSL_CRMF_SUBSEQUENTMESSAGE_CHALLENGERESP 1 +typedef struct ossl_crmf_encryptedvalue_st OSSL_CRMF_ENCRYPTEDVALUE; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_ENCRYPTEDVALUE) + +typedef struct ossl_crmf_encryptedkey_st OSSL_CRMF_ENCRYPTEDKEY; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_ENCRYPTEDKEY) + +typedef struct ossl_crmf_msg_st OSSL_CRMF_MSG; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_MSG) +DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_MSG) +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CRMF_MSG, OSSL_CRMF_MSG, OSSL_CRMF_MSG) +#define sk_OSSL_CRMF_MSG_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_value(sk, idx) ((OSSL_CRMF_MSG *)OPENSSL_sk_value(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk), (idx))) +#define sk_OSSL_CRMF_MSG_new(cmp) ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_new(ossl_check_OSSL_CRMF_MSG_compfunc_type(cmp))) +#define sk_OSSL_CRMF_MSG_new_null() ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CRMF_MSG_new_reserve(cmp, n) ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CRMF_MSG_compfunc_type(cmp), (n))) +#define sk_OSSL_CRMF_MSG_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CRMF_MSG_sk_type(sk), (n)) +#define sk_OSSL_CRMF_MSG_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_delete(sk, i) ((OSSL_CRMF_MSG *)OPENSSL_sk_delete(ossl_check_OSSL_CRMF_MSG_sk_type(sk), (i))) +#define sk_OSSL_CRMF_MSG_delete_ptr(sk, ptr) ((OSSL_CRMF_MSG *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr))) +#define sk_OSSL_CRMF_MSG_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr)) +#define sk_OSSL_CRMF_MSG_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr)) +#define sk_OSSL_CRMF_MSG_pop(sk) ((OSSL_CRMF_MSG *)OPENSSL_sk_pop(ossl_check_OSSL_CRMF_MSG_sk_type(sk))) +#define sk_OSSL_CRMF_MSG_shift(sk) ((OSSL_CRMF_MSG *)OPENSSL_sk_shift(ossl_check_OSSL_CRMF_MSG_sk_type(sk))) +#define sk_OSSL_CRMF_MSG_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CRMF_MSG_sk_type(sk),ossl_check_OSSL_CRMF_MSG_freefunc_type(freefunc)) +#define sk_OSSL_CRMF_MSG_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr), (idx)) +#define sk_OSSL_CRMF_MSG_set(sk, idx, ptr) ((OSSL_CRMF_MSG *)OPENSSL_sk_set(ossl_check_OSSL_CRMF_MSG_sk_type(sk), (idx), ossl_check_OSSL_CRMF_MSG_type(ptr))) +#define sk_OSSL_CRMF_MSG_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr)) +#define sk_OSSL_CRMF_MSG_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr)) +#define sk_OSSL_CRMF_MSG_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr), pnum) +#define sk_OSSL_CRMF_MSG_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_dup(sk) ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk))) +#define sk_OSSL_CRMF_MSG_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_copyfunc_type(copyfunc), ossl_check_OSSL_CRMF_MSG_freefunc_type(freefunc))) +#define sk_OSSL_CRMF_MSG_set_cmp_func(sk, cmp) ((sk_OSSL_CRMF_MSG_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_compfunc_type(cmp))) + +/* clang-format on */ +typedef struct ossl_crmf_attributetypeandvalue_st OSSL_CRMF_ATTRIBUTETYPEANDVALUE; +void OSSL_CRMF_ATTRIBUTETYPEANDVALUE_free(OSSL_CRMF_ATTRIBUTETYPEANDVALUE *v); +DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CRMF_ATTRIBUTETYPEANDVALUE, OSSL_CRMF_ATTRIBUTETYPEANDVALUE, OSSL_CRMF_ATTRIBUTETYPEANDVALUE) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_value(sk, idx) ((OSSL_CRMF_ATTRIBUTETYPEANDVALUE *)OPENSSL_sk_value(ossl_check_const_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), (idx))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_new(cmp) ((STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) *)OPENSSL_sk_new(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_compfunc_type(cmp))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_new_null() ((STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_new_reserve(cmp, n) ((STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_compfunc_type(cmp), (n))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), (n)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_delete(sk, i) ((OSSL_CRMF_ATTRIBUTETYPEANDVALUE *)OPENSSL_sk_delete(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), (i))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_delete_ptr(sk, ptr) ((OSSL_CRMF_ATTRIBUTETYPEANDVALUE *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_pop(sk) ((OSSL_CRMF_ATTRIBUTETYPEANDVALUE *)OPENSSL_sk_pop(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_shift(sk) ((OSSL_CRMF_ATTRIBUTETYPEANDVALUE *)OPENSSL_sk_shift(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk),ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_freefunc_type(freefunc)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr), (idx)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_set(sk, idx, ptr) ((OSSL_CRMF_ATTRIBUTETYPEANDVALUE *)OPENSSL_sk_set(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), (idx), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr), pnum) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_dup(sk) ((STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_copyfunc_type(copyfunc), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_freefunc_type(freefunc))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_set_cmp_func(sk, cmp) ((sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct ossl_crmf_pbmparameter_st OSSL_CRMF_PBMPARAMETER; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_PBMPARAMETER) +typedef struct ossl_crmf_poposigningkey_st OSSL_CRMF_POPOSIGNINGKEY; +typedef struct ossl_crmf_certrequest_st OSSL_CRMF_CERTREQUEST; +typedef struct ossl_crmf_certid_st OSSL_CRMF_CERTID; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_CERTID) +DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_CERTID) +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CRMF_CERTID, OSSL_CRMF_CERTID, OSSL_CRMF_CERTID) +#define sk_OSSL_CRMF_CERTID_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_value(sk, idx) ((OSSL_CRMF_CERTID *)OPENSSL_sk_value(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk), (idx))) +#define sk_OSSL_CRMF_CERTID_new(cmp) ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_new(ossl_check_OSSL_CRMF_CERTID_compfunc_type(cmp))) +#define sk_OSSL_CRMF_CERTID_new_null() ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CRMF_CERTID_new_reserve(cmp, n) ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CRMF_CERTID_compfunc_type(cmp), (n))) +#define sk_OSSL_CRMF_CERTID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), (n)) +#define sk_OSSL_CRMF_CERTID_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_delete(sk, i) ((OSSL_CRMF_CERTID *)OPENSSL_sk_delete(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), (i))) +#define sk_OSSL_CRMF_CERTID_delete_ptr(sk, ptr) ((OSSL_CRMF_CERTID *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr))) +#define sk_OSSL_CRMF_CERTID_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr)) +#define sk_OSSL_CRMF_CERTID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr)) +#define sk_OSSL_CRMF_CERTID_pop(sk) ((OSSL_CRMF_CERTID *)OPENSSL_sk_pop(ossl_check_OSSL_CRMF_CERTID_sk_type(sk))) +#define sk_OSSL_CRMF_CERTID_shift(sk) ((OSSL_CRMF_CERTID *)OPENSSL_sk_shift(ossl_check_OSSL_CRMF_CERTID_sk_type(sk))) +#define sk_OSSL_CRMF_CERTID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CRMF_CERTID_sk_type(sk),ossl_check_OSSL_CRMF_CERTID_freefunc_type(freefunc)) +#define sk_OSSL_CRMF_CERTID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr), (idx)) +#define sk_OSSL_CRMF_CERTID_set(sk, idx, ptr) ((OSSL_CRMF_CERTID *)OPENSSL_sk_set(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), (idx), ossl_check_OSSL_CRMF_CERTID_type(ptr))) +#define sk_OSSL_CRMF_CERTID_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr)) +#define sk_OSSL_CRMF_CERTID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr)) +#define sk_OSSL_CRMF_CERTID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr), pnum) +#define sk_OSSL_CRMF_CERTID_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_dup(sk) ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk))) +#define sk_OSSL_CRMF_CERTID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_copyfunc_type(copyfunc), ossl_check_OSSL_CRMF_CERTID_freefunc_type(freefunc))) +#define sk_OSSL_CRMF_CERTID_set_cmp_func(sk, cmp) ((sk_OSSL_CRMF_CERTID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct ossl_crmf_pkipublicationinfo_st OSSL_CRMF_PKIPUBLICATIONINFO; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_PKIPUBLICATIONINFO) +typedef struct ossl_crmf_singlepubinfo_st OSSL_CRMF_SINGLEPUBINFO; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_SINGLEPUBINFO) +typedef struct ossl_crmf_certtemplate_st OSSL_CRMF_CERTTEMPLATE; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_CERTTEMPLATE) +DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_CERTTEMPLATE) +typedef STACK_OF(OSSL_CRMF_MSG) OSSL_CRMF_MSGS; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_MSGS) + +typedef struct ossl_crmf_optionalvalidity_st OSSL_CRMF_OPTIONALVALIDITY; + +/* crmf_pbm.c */ +OSSL_CRMF_PBMPARAMETER *OSSL_CRMF_pbmp_new(OSSL_LIB_CTX *libctx, size_t slen, + int owfnid, size_t itercnt, + int macnid); +int OSSL_CRMF_pbm_new(OSSL_LIB_CTX *libctx, const char *propq, + const OSSL_CRMF_PBMPARAMETER *pbmp, + const unsigned char *msg, size_t msglen, + const unsigned char *sec, size_t seclen, + unsigned char **mac, size_t *maclen); + +/* crmf_lib.c */ +int OSSL_CRMF_MSG_set1_regCtrl_regToken(OSSL_CRMF_MSG *msg, + const ASN1_UTF8STRING *tok); +ASN1_UTF8STRING +*OSSL_CRMF_MSG_get0_regCtrl_regToken(const OSSL_CRMF_MSG *msg); +int OSSL_CRMF_MSG_set1_regCtrl_authenticator(OSSL_CRMF_MSG *msg, + const ASN1_UTF8STRING *auth); +ASN1_UTF8STRING +*OSSL_CRMF_MSG_get0_regCtrl_authenticator(const OSSL_CRMF_MSG *msg); +int OSSL_CRMF_MSG_PKIPublicationInfo_push0_SinglePubInfo(OSSL_CRMF_PKIPUBLICATIONINFO *pi, + OSSL_CRMF_SINGLEPUBINFO *spi); +#define OSSL_CRMF_PUB_METHOD_DONTCARE 0 +#define OSSL_CRMF_PUB_METHOD_X500 1 +#define OSSL_CRMF_PUB_METHOD_WEB 2 +#define OSSL_CRMF_PUB_METHOD_LDAP 3 +int OSSL_CRMF_MSG_set0_SinglePubInfo(OSSL_CRMF_SINGLEPUBINFO *spi, + int method, GENERAL_NAME *nm); +#define OSSL_CRMF_PUB_ACTION_DONTPUBLISH 0 +#define OSSL_CRMF_PUB_ACTION_PLEASEPUBLISH 1 +int OSSL_CRMF_MSG_set_PKIPublicationInfo_action(OSSL_CRMF_PKIPUBLICATIONINFO *pi, + int action); +int OSSL_CRMF_MSG_set1_regCtrl_pkiPublicationInfo(OSSL_CRMF_MSG *msg, + const OSSL_CRMF_PKIPUBLICATIONINFO *pi); +OSSL_CRMF_PKIPUBLICATIONINFO +*OSSL_CRMF_MSG_get0_regCtrl_pkiPublicationInfo(const OSSL_CRMF_MSG *msg); +int OSSL_CRMF_MSG_set1_regCtrl_protocolEncrKey(OSSL_CRMF_MSG *msg, + const X509_PUBKEY *pubkey); +X509_PUBKEY +*OSSL_CRMF_MSG_get0_regCtrl_protocolEncrKey(const OSSL_CRMF_MSG *msg); +int OSSL_CRMF_MSG_set1_regCtrl_oldCertID(OSSL_CRMF_MSG *msg, + const OSSL_CRMF_CERTID *cid); +OSSL_CRMF_CERTID +*OSSL_CRMF_MSG_get0_regCtrl_oldCertID(const OSSL_CRMF_MSG *msg); +OSSL_CRMF_CERTID *OSSL_CRMF_CERTID_gen(const X509_NAME *issuer, + const ASN1_INTEGER *serial); + +int OSSL_CRMF_MSG_set1_regInfo_utf8Pairs(OSSL_CRMF_MSG *msg, + const ASN1_UTF8STRING *utf8pairs); +ASN1_UTF8STRING +*OSSL_CRMF_MSG_get0_regInfo_utf8Pairs(const OSSL_CRMF_MSG *msg); +int OSSL_CRMF_MSG_set1_regInfo_certReq(OSSL_CRMF_MSG *msg, + const OSSL_CRMF_CERTREQUEST *cr); +OSSL_CRMF_CERTREQUEST +*OSSL_CRMF_MSG_get0_regInfo_certReq(const OSSL_CRMF_MSG *msg); + +int OSSL_CRMF_MSG_set0_validity(OSSL_CRMF_MSG *crm, + ASN1_TIME *notBefore, ASN1_TIME *notAfter); +int OSSL_CRMF_MSG_set_certReqId(OSSL_CRMF_MSG *crm, int rid); +int OSSL_CRMF_MSG_get_certReqId(const OSSL_CRMF_MSG *crm); +int OSSL_CRMF_MSG_set0_extensions(OSSL_CRMF_MSG *crm, X509_EXTENSIONS *exts); + +int OSSL_CRMF_MSG_push0_extension(OSSL_CRMF_MSG *crm, X509_EXTENSION *ext); +#define OSSL_CRMF_POPO_NONE -1 +#define OSSL_CRMF_POPO_RAVERIFIED 0 +#define OSSL_CRMF_POPO_SIGNATURE 1 +#define OSSL_CRMF_POPO_KEYENC 2 +#define OSSL_CRMF_POPO_KEYAGREE 3 +int OSSL_CRMF_MSG_create_popo(int meth, OSSL_CRMF_MSG *crm, + EVP_PKEY *pkey, const EVP_MD *digest, + OSSL_LIB_CTX *libctx, const char *propq); +int OSSL_CRMF_MSGS_verify_popo(const OSSL_CRMF_MSGS *reqs, + int rid, int acceptRAVerified, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_CRMF_CERTTEMPLATE *OSSL_CRMF_MSG_get0_tmpl(const OSSL_CRMF_MSG *crm); +X509_PUBKEY +*OSSL_CRMF_CERTTEMPLATE_get0_publicKey(const OSSL_CRMF_CERTTEMPLATE *tmpl); +const X509_NAME *OSSL_CRMF_CERTTEMPLATE_get0_subject(const OSSL_CRMF_CERTTEMPLATE *tmpl); +const X509_NAME *OSSL_CRMF_CERTTEMPLATE_get0_issuer(const OSSL_CRMF_CERTTEMPLATE *tmpl); +const ASN1_INTEGER *OSSL_CRMF_CERTTEMPLATE_get0_serialNumber(const OSSL_CRMF_CERTTEMPLATE *tmpl); +X509_EXTENSIONS +*OSSL_CRMF_CERTTEMPLATE_get0_extensions(const OSSL_CRMF_CERTTEMPLATE *tmpl); +const X509_NAME *OSSL_CRMF_CERTID_get0_issuer(const OSSL_CRMF_CERTID *cid); +const ASN1_INTEGER *OSSL_CRMF_CERTID_get0_serialNumber(const OSSL_CRMF_CERTID *cid); +int OSSL_CRMF_CERTTEMPLATE_fill(OSSL_CRMF_CERTTEMPLATE *tmpl, + EVP_PKEY *pubkey, + const X509_NAME *subject, + const X509_NAME *issuer, + const ASN1_INTEGER *serial); +X509 *OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert(const OSSL_CRMF_ENCRYPTEDVALUE *ecert, + OSSL_LIB_CTX *libctx, const char *propq, + EVP_PKEY *pkey); +X509 *OSSL_CRMF_ENCRYPTEDKEY_get1_encCert(const OSSL_CRMF_ENCRYPTEDKEY *ecert, + OSSL_LIB_CTX *libctx, const char *propq, + EVP_PKEY *pkey, unsigned int flags); +unsigned char *OSSL_CRMF_ENCRYPTEDVALUE_decrypt(const OSSL_CRMF_ENCRYPTEDVALUE *enc, + OSSL_LIB_CTX *libctx, const char *propq, + EVP_PKEY *pkey, int *outlen); +EVP_PKEY *OSSL_CRMF_ENCRYPTEDKEY_get1_pkey(const OSSL_CRMF_ENCRYPTEDKEY *encryptedKey, + X509_STORE *ts, STACK_OF(X509) *extra, EVP_PKEY *pkey, + X509 *cert, ASN1_OCTET_STRING *secret, + OSSL_LIB_CTX *libctx, const char *propq); +int OSSL_CRMF_MSG_centralkeygen_requested(const OSSL_CRMF_MSG *crm, const X509_REQ *p10cr); +#ifndef OPENSSL_NO_CMS +OSSL_CRMF_ENCRYPTEDKEY *OSSL_CRMF_ENCRYPTEDKEY_init_envdata(CMS_EnvelopedData *envdata); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !defined(OPENSSL_NO_CRMF) */ +#endif /* !defined(OPENSSL_CRMF_H) */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/crypto.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/crypto.h new file mode 100644 index 000000000000..cce93833c2cb --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/crypto.h @@ -0,0 +1,588 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/crypto.h.in + * + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_CRYPTO_H +#define OPENSSL_CRYPTO_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_CRYPTO_H +#endif + +#include +#include + +#include + +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#include +#include +#include +#include +#include +#include + +#ifdef CHARSET_EBCDIC +#include +#endif + +/* + * Resolve problems on some operating systems with symbol names that clash + * one way or another + */ +#include + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define SSLeay OpenSSL_version_num +#define SSLeay_version OpenSSL_version +#define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER +#define SSLEAY_VERSION OPENSSL_VERSION +#define SSLEAY_CFLAGS OPENSSL_CFLAGS +#define SSLEAY_BUILT_ON OPENSSL_BUILT_ON +#define SSLEAY_PLATFORM OPENSSL_PLATFORM +#define SSLEAY_DIR OPENSSL_DIR + +/* + * Old type for allocating dynamic locks. No longer used. Use the new thread + * API instead. + */ +typedef struct { + int dummy; +} CRYPTO_dynlock; + +#endif /* OPENSSL_NO_DEPRECATED_1_1_0 */ + +typedef void CRYPTO_RWLOCK; + +CRYPTO_RWLOCK *CRYPTO_THREAD_lock_new(void); +__owur int CRYPTO_THREAD_read_lock(CRYPTO_RWLOCK *lock); +__owur int CRYPTO_THREAD_write_lock(CRYPTO_RWLOCK *lock); +int CRYPTO_THREAD_unlock(CRYPTO_RWLOCK *lock); +void CRYPTO_THREAD_lock_free(CRYPTO_RWLOCK *lock); + +int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock); +int CRYPTO_atomic_add64(uint64_t *val, uint64_t op, uint64_t *ret, + CRYPTO_RWLOCK *lock); +int CRYPTO_atomic_and(uint64_t *val, uint64_t op, uint64_t *ret, + CRYPTO_RWLOCK *lock); +int CRYPTO_atomic_or(uint64_t *val, uint64_t op, uint64_t *ret, + CRYPTO_RWLOCK *lock); +int CRYPTO_atomic_load(uint64_t *val, uint64_t *ret, CRYPTO_RWLOCK *lock); +int CRYPTO_atomic_load_int(int *val, int *ret, CRYPTO_RWLOCK *lock); +int CRYPTO_atomic_store(uint64_t *dst, uint64_t val, CRYPTO_RWLOCK *lock); + +/* No longer needed, so this is a no-op */ +#define OPENSSL_malloc_init() \ + while (0) \ + continue + +#define OPENSSL_malloc(num) \ + CRYPTO_malloc(num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_zalloc(num) \ + CRYPTO_zalloc(num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_aligned_alloc(num, alignment, freeptr) \ + CRYPTO_aligned_alloc(num, alignment, freeptr, \ + OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_realloc(addr, num) \ + CRYPTO_realloc(addr, num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_clear_realloc(addr, old_num, num) \ + CRYPTO_clear_realloc(addr, old_num, num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_clear_free(addr, num) \ + CRYPTO_clear_free(addr, num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_free(addr) \ + CRYPTO_free(addr, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_memdup(str, s) \ + CRYPTO_memdup((str), s, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_strdup(str) \ + CRYPTO_strdup(str, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_strndup(str, n) \ + CRYPTO_strndup(str, n, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_secure_malloc(num) \ + CRYPTO_secure_malloc(num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_secure_zalloc(num) \ + CRYPTO_secure_zalloc(num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_secure_free(addr) \ + CRYPTO_secure_free(addr, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_secure_clear_free(addr, num) \ + CRYPTO_secure_clear_free(addr, num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_secure_actual_size(ptr) \ + CRYPTO_secure_actual_size(ptr) + +size_t OPENSSL_strlcpy(char *dst, const char *src, size_t siz); +size_t OPENSSL_strlcat(char *dst, const char *src, size_t siz); +size_t OPENSSL_strnlen(const char *str, size_t maxlen); +int OPENSSL_strtoul(const char *str, char **endptr, int base, unsigned long *num); +int OPENSSL_buf2hexstr_ex(char *str, size_t str_n, size_t *strlength, + const unsigned char *buf, size_t buflen, + const char sep); +char *OPENSSL_buf2hexstr(const unsigned char *buf, long buflen); +int OPENSSL_hexstr2buf_ex(unsigned char *buf, size_t buf_n, size_t *buflen, + const char *str, const char sep); +unsigned char *OPENSSL_hexstr2buf(const char *str, long *buflen); +int OPENSSL_hexchar2int(unsigned char c); +int OPENSSL_strcasecmp(const char *s1, const char *s2); +int OPENSSL_strncasecmp(const char *s1, const char *s2, size_t n); + +#define OPENSSL_MALLOC_MAX_NELEMS(type) (((1U << (sizeof(int) * 8 - 1)) - 1) / sizeof(type)) + +/* + * These functions return the values of OPENSSL_VERSION_MAJOR, + * OPENSSL_VERSION_MINOR, OPENSSL_VERSION_PATCH, OPENSSL_VERSION_PRE_RELEASE + * and OPENSSL_VERSION_BUILD_METADATA, respectively. + */ +unsigned int OPENSSL_version_major(void); +unsigned int OPENSSL_version_minor(void); +unsigned int OPENSSL_version_patch(void); +const char *OPENSSL_version_pre_release(void); +const char *OPENSSL_version_build_metadata(void); + +unsigned long OpenSSL_version_num(void); +const char *OpenSSL_version(int type); +#define OPENSSL_VERSION 0 +#define OPENSSL_CFLAGS 1 +#define OPENSSL_BUILT_ON 2 +#define OPENSSL_PLATFORM 3 +#define OPENSSL_DIR 4 +#define OPENSSL_ENGINES_DIR 5 +#define OPENSSL_VERSION_STRING 6 +#define OPENSSL_FULL_VERSION_STRING 7 +#define OPENSSL_MODULES_DIR 8 +#define OPENSSL_CPU_INFO 9 +#define OPENSSL_WINCTX 10 + +const char *OPENSSL_info(int type); +/* + * The series starts at 1001 to avoid confusion with the OpenSSL_version + * types. + */ +#define OPENSSL_INFO_CONFIG_DIR 1001 +#define OPENSSL_INFO_ENGINES_DIR 1002 +#define OPENSSL_INFO_MODULES_DIR 1003 +#define OPENSSL_INFO_DSO_EXTENSION 1004 +#define OPENSSL_INFO_DIR_FILENAME_SEPARATOR 1005 +#define OPENSSL_INFO_LIST_SEPARATOR 1006 +#define OPENSSL_INFO_SEED_SOURCE 1007 +#define OPENSSL_INFO_CPU_SETTINGS 1008 +#define OPENSSL_INFO_WINDOWS_CONTEXT 1009 + +int OPENSSL_issetugid(void); + +struct crypto_ex_data_st { + OSSL_LIB_CTX *ctx; + STACK_OF(void) *sk; +}; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(void, void, void) +#define sk_void_num(sk) OPENSSL_sk_num(ossl_check_const_void_sk_type(sk)) +#define sk_void_value(sk, idx) ((void *)OPENSSL_sk_value(ossl_check_const_void_sk_type(sk), (idx))) +#define sk_void_new(cmp) ((STACK_OF(void) *)OPENSSL_sk_new(ossl_check_void_compfunc_type(cmp))) +#define sk_void_new_null() ((STACK_OF(void) *)OPENSSL_sk_new_null()) +#define sk_void_new_reserve(cmp, n) ((STACK_OF(void) *)OPENSSL_sk_new_reserve(ossl_check_void_compfunc_type(cmp), (n))) +#define sk_void_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_void_sk_type(sk), (n)) +#define sk_void_free(sk) OPENSSL_sk_free(ossl_check_void_sk_type(sk)) +#define sk_void_zero(sk) OPENSSL_sk_zero(ossl_check_void_sk_type(sk)) +#define sk_void_delete(sk, i) ((void *)OPENSSL_sk_delete(ossl_check_void_sk_type(sk), (i))) +#define sk_void_delete_ptr(sk, ptr) ((void *)OPENSSL_sk_delete_ptr(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr))) +#define sk_void_push(sk, ptr) OPENSSL_sk_push(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr)) +#define sk_void_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr)) +#define sk_void_pop(sk) ((void *)OPENSSL_sk_pop(ossl_check_void_sk_type(sk))) +#define sk_void_shift(sk) ((void *)OPENSSL_sk_shift(ossl_check_void_sk_type(sk))) +#define sk_void_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_void_sk_type(sk),ossl_check_void_freefunc_type(freefunc)) +#define sk_void_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr), (idx)) +#define sk_void_set(sk, idx, ptr) ((void *)OPENSSL_sk_set(ossl_check_void_sk_type(sk), (idx), ossl_check_void_type(ptr))) +#define sk_void_find(sk, ptr) OPENSSL_sk_find(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr)) +#define sk_void_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr)) +#define sk_void_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr), pnum) +#define sk_void_sort(sk) OPENSSL_sk_sort(ossl_check_void_sk_type(sk)) +#define sk_void_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_void_sk_type(sk)) +#define sk_void_dup(sk) ((STACK_OF(void) *)OPENSSL_sk_dup(ossl_check_const_void_sk_type(sk))) +#define sk_void_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(void) *)OPENSSL_sk_deep_copy(ossl_check_const_void_sk_type(sk), ossl_check_void_copyfunc_type(copyfunc), ossl_check_void_freefunc_type(freefunc))) +#define sk_void_set_cmp_func(sk, cmp) ((sk_void_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_void_sk_type(sk), ossl_check_void_compfunc_type(cmp))) + +/* clang-format on */ + +/* + * Per class, we have a STACK of function pointers. + */ +#define CRYPTO_EX_INDEX_SSL 0 +#define CRYPTO_EX_INDEX_SSL_CTX 1 +#define CRYPTO_EX_INDEX_SSL_SESSION 2 +#define CRYPTO_EX_INDEX_X509 3 +#define CRYPTO_EX_INDEX_X509_STORE 4 +#define CRYPTO_EX_INDEX_X509_STORE_CTX 5 +#define CRYPTO_EX_INDEX_DH 6 +#define CRYPTO_EX_INDEX_DSA 7 +#define CRYPTO_EX_INDEX_EC_KEY 8 +#define CRYPTO_EX_INDEX_RSA 9 +#define CRYPTO_EX_INDEX_ENGINE 10 +#define CRYPTO_EX_INDEX_UI 11 +#define CRYPTO_EX_INDEX_BIO 12 +#define CRYPTO_EX_INDEX_APP 13 +#define CRYPTO_EX_INDEX_UI_METHOD 14 +#define CRYPTO_EX_INDEX_RAND_DRBG 15 +#define CRYPTO_EX_INDEX_DRBG CRYPTO_EX_INDEX_RAND_DRBG +#define CRYPTO_EX_INDEX_OSSL_LIB_CTX 16 +#define CRYPTO_EX_INDEX_EVP_PKEY 17 +#define CRYPTO_EX_INDEX__COUNT 18 + +typedef void CRYPTO_EX_new(void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef void CRYPTO_EX_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, const CRYPTO_EX_DATA *from, + void **from_d, int idx, long argl, void *argp); +__owur int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp, + CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +/* No longer use an index. */ +int CRYPTO_free_ex_index(int class_index, int idx); + +/* + * Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a + * given class (invokes whatever per-class callbacks are applicable) + */ +int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to, + const CRYPTO_EX_DATA *from); + +void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); + +/* Allocate a single item in the CRYPTO_EX_DATA variable */ +int CRYPTO_alloc_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad, + int idx); + +/* + * Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular + * index (relative to the class type involved) + */ +int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val); +void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int idx); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +/* + * This function cleans up all "ex_data" state. It mustn't be called under + * potential race-conditions. + */ +#define CRYPTO_cleanup_all_ex_data() \ + while (0) \ + continue + +/* + * The old locking functions have been removed completely without compatibility + * macros. This is because the old functions either could not properly report + * errors, or the returned error values were not clearly documented. + * Replacing the locking functions with no-ops would cause race condition + * issues in the affected applications. It is far better for them to fail at + * compile time. + * On the other hand, the locking callbacks are no longer used. Consequently, + * the callback management functions can be safely replaced with no-op macros. + */ +#define CRYPTO_num_locks() (1) +#define CRYPTO_set_locking_callback(func) +#define CRYPTO_get_locking_callback() (NULL) +#define CRYPTO_set_add_lock_callback(func) +#define CRYPTO_get_add_lock_callback() (NULL) + +/* + * These defines where used in combination with the old locking callbacks, + * they are not called anymore, but old code that's not called might still + * use them. + */ +#define CRYPTO_LOCK 1 +#define CRYPTO_UNLOCK 2 +#define CRYPTO_READ 4 +#define CRYPTO_WRITE 8 + +/* This structure is no longer used */ +typedef struct crypto_threadid_st { + int dummy; +} CRYPTO_THREADID; +/* Only use CRYPTO_THREADID_set_[numeric|pointer]() within callbacks */ +#define CRYPTO_THREADID_set_numeric(id, val) +#define CRYPTO_THREADID_set_pointer(id, ptr) +#define CRYPTO_THREADID_set_callback(threadid_func) (0) +#define CRYPTO_THREADID_get_callback() (NULL) +#define CRYPTO_THREADID_current(id) +#define CRYPTO_THREADID_cmp(a, b) (-1) +#define CRYPTO_THREADID_cpy(dest, src) +#define CRYPTO_THREADID_hash(id) (0UL) + +#ifndef OPENSSL_NO_DEPRECATED_1_0_0 +#define CRYPTO_set_id_callback(func) +#define CRYPTO_get_id_callback() (NULL) +#define CRYPTO_thread_id() (0UL) +#endif /* OPENSSL_NO_DEPRECATED_1_0_0 */ + +#define CRYPTO_set_dynlock_create_callback(dyn_create_function) +#define CRYPTO_set_dynlock_lock_callback(dyn_lock_function) +#define CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function) +#define CRYPTO_get_dynlock_create_callback() (NULL) +#define CRYPTO_get_dynlock_lock_callback() (NULL) +#define CRYPTO_get_dynlock_destroy_callback() (NULL) +#endif /* OPENSSL_NO_DEPRECATED_1_1_0 */ + +typedef void *(*CRYPTO_malloc_fn)(size_t num, const char *file, int line); +typedef void *(*CRYPTO_realloc_fn)(void *addr, size_t num, const char *file, + int line); +typedef void (*CRYPTO_free_fn)(void *addr, const char *file, int line); +int CRYPTO_set_mem_functions(CRYPTO_malloc_fn malloc_fn, + CRYPTO_realloc_fn realloc_fn, + CRYPTO_free_fn free_fn); +void CRYPTO_get_mem_functions(CRYPTO_malloc_fn *malloc_fn, + CRYPTO_realloc_fn *realloc_fn, + CRYPTO_free_fn *free_fn); + +OSSL_CRYPTO_ALLOC void *CRYPTO_malloc(size_t num, const char *file, int line); +OSSL_CRYPTO_ALLOC void *CRYPTO_zalloc(size_t num, const char *file, int line); +OSSL_CRYPTO_ALLOC void *CRYPTO_aligned_alloc(size_t num, size_t align, + void **freeptr, const char *file, + int line); +void *CRYPTO_memdup(const void *str, size_t siz, const char *file, int line); +char *CRYPTO_strdup(const char *str, const char *file, int line); +char *CRYPTO_strndup(const char *str, size_t s, const char *file, int line); +void CRYPTO_free(void *ptr, const char *file, int line); +void CRYPTO_clear_free(void *ptr, size_t num, const char *file, int line); +void *CRYPTO_realloc(void *addr, size_t num, const char *file, int line); +void *CRYPTO_clear_realloc(void *addr, size_t old_num, size_t num, + const char *file, int line); + +int CRYPTO_secure_malloc_init(size_t sz, size_t minsize); +int CRYPTO_secure_malloc_done(void); +OSSL_CRYPTO_ALLOC void *CRYPTO_secure_malloc(size_t num, const char *file, int line); +OSSL_CRYPTO_ALLOC void *CRYPTO_secure_zalloc(size_t num, const char *file, int line); +void CRYPTO_secure_free(void *ptr, const char *file, int line); +void CRYPTO_secure_clear_free(void *ptr, size_t num, + const char *file, int line); +int CRYPTO_secure_allocated(const void *ptr); +int CRYPTO_secure_malloc_initialized(void); +size_t CRYPTO_secure_actual_size(void *ptr); +size_t CRYPTO_secure_used(void); + +void OPENSSL_cleanse(void *ptr, size_t len); + +#ifndef OPENSSL_NO_CRYPTO_MDEBUG +/* + * The following can be used to detect memory leaks in the library. If + * used, it turns on malloc checking + */ +#define CRYPTO_MEM_CHECK_OFF 0x0 /* Control only */ +#define CRYPTO_MEM_CHECK_ON 0x1 /* Control and mode bit */ +#define CRYPTO_MEM_CHECK_ENABLE 0x2 /* Control and mode bit */ +#define CRYPTO_MEM_CHECK_DISABLE 0x3 /* Control only */ + +/* max allowed length for value of OPENSSL_MALLOC_FAILURES env var. */ +#define CRYPTO_MEM_CHECK_MAX_FS 256 + +void CRYPTO_get_alloc_counts(int *mcount, int *rcount, int *fcount); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define OPENSSL_mem_debug_push(info) \ + CRYPTO_mem_debug_push(info, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_mem_debug_pop() \ + CRYPTO_mem_debug_pop() +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int CRYPTO_set_mem_debug(int flag); +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_ctrl(int mode); +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_debug_push(const char *info, + const char *file, int line); +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_debug_pop(void); +OSSL_DEPRECATEDIN_3_0 void CRYPTO_mem_debug_malloc(void *addr, size_t num, + int flag, + const char *file, int line); +OSSL_DEPRECATEDIN_3_0 void CRYPTO_mem_debug_realloc(void *addr1, void *addr2, + size_t num, int flag, + const char *file, int line); +OSSL_DEPRECATEDIN_3_0 void CRYPTO_mem_debug_free(void *addr, int flag, + const char *file, int line); +OSSL_DEPRECATEDIN_3_0 +int CRYPTO_mem_leaks_cb(int (*cb)(const char *str, size_t len, void *u), + void *u); +#endif +#ifndef OPENSSL_NO_STDIO +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_leaks_fp(FILE *); +#endif +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_leaks(BIO *bio); +#endif +#endif /* OPENSSL_NO_CRYPTO_MDEBUG */ + +/* die if we have to */ +ossl_noreturn void OPENSSL_die(const char *assertion, const char *file, int line); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define OpenSSLDie(f, l, a) OPENSSL_die((a), (f), (l)) +#endif +#define OPENSSL_assert(e) \ + (void)((e) ? 0 : (OPENSSL_die("assertion failed: " #e, OPENSSL_FILE, OPENSSL_LINE), 1)) + +int OPENSSL_isservice(void); + +void OPENSSL_init(void); +#ifdef OPENSSL_SYS_UNIX +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 void OPENSSL_fork_prepare(void); +OSSL_DEPRECATEDIN_3_0 void OPENSSL_fork_parent(void); +OSSL_DEPRECATEDIN_3_0 void OPENSSL_fork_child(void); +#endif +#endif + +struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result); +int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec); +int OPENSSL_gmtime_diff(int *pday, int *psec, + const struct tm *from, const struct tm *to); + +/* + * CRYPTO_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. + * It takes an amount of time dependent on |len|, but independent of the + * contents of |a| and |b|. Unlike memcmp, it cannot be used to put elements + * into a defined order as the return value when a != b is undefined, other + * than to be non-zero. + */ +int CRYPTO_memcmp(const void *in_a, const void *in_b, size_t len); + +/* Standard initialisation options */ +#define OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS 0x00000001L +#define OPENSSL_INIT_LOAD_CRYPTO_STRINGS 0x00000002L +#define OPENSSL_INIT_ADD_ALL_CIPHERS 0x00000004L +#define OPENSSL_INIT_ADD_ALL_DIGESTS 0x00000008L +#define OPENSSL_INIT_NO_ADD_ALL_CIPHERS 0x00000010L +#define OPENSSL_INIT_NO_ADD_ALL_DIGESTS 0x00000020L +#define OPENSSL_INIT_LOAD_CONFIG 0x00000040L +#define OPENSSL_INIT_NO_LOAD_CONFIG 0x00000080L +#define OPENSSL_INIT_ASYNC 0x00000100L +#define OPENSSL_INIT_ENGINE_RDRAND 0x00000200L +#define OPENSSL_INIT_ENGINE_DYNAMIC 0x00000400L +#define OPENSSL_INIT_ENGINE_OPENSSL 0x00000800L +#define OPENSSL_INIT_ENGINE_CRYPTODEV 0x00001000L +#define OPENSSL_INIT_ENGINE_CAPI 0x00002000L +#define OPENSSL_INIT_ENGINE_PADLOCK 0x00004000L +#define OPENSSL_INIT_ENGINE_AFALG 0x00008000L +/* FREE: 0x00010000L */ +#define OPENSSL_INIT_ATFORK 0x00020000L +/* OPENSSL_INIT_BASE_ONLY 0x00040000L */ +#define OPENSSL_INIT_NO_ATEXIT 0x00080000L +/* OPENSSL_INIT flag range 0x03f00000 reserved for OPENSSL_init_ssl() */ +/* FREE: 0x04000000L */ +/* FREE: 0x08000000L */ +/* FREE: 0x10000000L */ +/* FREE: 0x20000000L */ +/* FREE: 0x40000000L */ +/* FREE: 0x80000000L */ +/* Max OPENSSL_INIT flag value is 0x80000000 */ + +/* openssl and dasync not counted as builtin */ +#define OPENSSL_INIT_ENGINE_ALL_BUILTIN \ + (OPENSSL_INIT_ENGINE_RDRAND | OPENSSL_INIT_ENGINE_DYNAMIC \ + | OPENSSL_INIT_ENGINE_CRYPTODEV | OPENSSL_INIT_ENGINE_CAPI | OPENSSL_INIT_ENGINE_PADLOCK) + +/* Library initialisation functions */ +void OPENSSL_cleanup(void); +int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings); +int OPENSSL_atexit(void (*handler)(void)); +void OPENSSL_thread_stop(void); +void OPENSSL_thread_stop_ex(OSSL_LIB_CTX *ctx); + +/* Low-level control of initialization */ +OPENSSL_INIT_SETTINGS *OPENSSL_INIT_new(void); +#ifndef OPENSSL_NO_STDIO +int OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS *settings, + const char *config_filename); +void OPENSSL_INIT_set_config_file_flags(OPENSSL_INIT_SETTINGS *settings, + unsigned long flags); +int OPENSSL_INIT_set_config_appname(OPENSSL_INIT_SETTINGS *settings, + const char *config_appname); +#endif +void OPENSSL_INIT_free(OPENSSL_INIT_SETTINGS *settings); + +#if defined(OPENSSL_THREADS) && !defined(CRYPTO_TDEBUG) +#if defined(_WIN32) +#if defined(BASETYPES) || defined(_WINDEF_H) +/* application has to include in order to use this */ +typedef DWORD CRYPTO_THREAD_LOCAL; +typedef DWORD CRYPTO_THREAD_ID; + +typedef LONG CRYPTO_ONCE; +#define CRYPTO_ONCE_STATIC_INIT 0 +#endif +#else +#if defined(__TANDEM) && defined(_SPT_MODEL_) +#define SPT_THREAD_SIGNAL 1 +#define SPT_THREAD_AWARE 1 +#include +#else +#include +#endif +typedef pthread_once_t CRYPTO_ONCE; +typedef pthread_key_t CRYPTO_THREAD_LOCAL; +typedef pthread_t CRYPTO_THREAD_ID; + +#define CRYPTO_ONCE_STATIC_INIT PTHREAD_ONCE_INIT +#endif +#endif + +#if !defined(CRYPTO_ONCE_STATIC_INIT) +typedef unsigned int CRYPTO_ONCE; +typedef unsigned int CRYPTO_THREAD_LOCAL; +typedef unsigned int CRYPTO_THREAD_ID; +#define CRYPTO_ONCE_STATIC_INIT 0 +#endif + +int CRYPTO_THREAD_run_once(CRYPTO_ONCE *once, void (*init)(void)); + +int CRYPTO_THREAD_init_local(CRYPTO_THREAD_LOCAL *key, void (*cleanup)(void *)); +void *CRYPTO_THREAD_get_local(CRYPTO_THREAD_LOCAL *key); +int CRYPTO_THREAD_set_local(CRYPTO_THREAD_LOCAL *key, void *val); +int CRYPTO_THREAD_cleanup_local(CRYPTO_THREAD_LOCAL *key); + +CRYPTO_THREAD_ID CRYPTO_THREAD_get_current_id(void); +int CRYPTO_THREAD_compare_id(CRYPTO_THREAD_ID a, CRYPTO_THREAD_ID b); + +OSSL_LIB_CTX *OSSL_LIB_CTX_new(void); +OSSL_LIB_CTX *OSSL_LIB_CTX_new_from_dispatch(const OSSL_CORE_HANDLE *handle, + const OSSL_DISPATCH *in); +OSSL_LIB_CTX *OSSL_LIB_CTX_new_child(const OSSL_CORE_HANDLE *handle, + const OSSL_DISPATCH *in); +int OSSL_LIB_CTX_load_config(OSSL_LIB_CTX *ctx, const char *config_file); +void OSSL_LIB_CTX_free(OSSL_LIB_CTX *); +OSSL_LIB_CTX *OSSL_LIB_CTX_get0_global_default(void); +OSSL_LIB_CTX *OSSL_LIB_CTX_set0_default(OSSL_LIB_CTX *libctx); +int OSSL_LIB_CTX_get_conf_diagnostics(OSSL_LIB_CTX *ctx); +void OSSL_LIB_CTX_set_conf_diagnostics(OSSL_LIB_CTX *ctx, int value); + +void OSSL_sleep(uint64_t millis); + +void *OSSL_LIB_CTX_get_data(OSSL_LIB_CTX *ctx, int index); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ct.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ct.h new file mode 100644 index 000000000000..0b60803f98ca --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ct.h @@ -0,0 +1,574 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/ct.h.in + * + * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_CT_H +#define OPENSSL_CT_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_CT_H +#endif + +#include + +#ifndef OPENSSL_NO_CT +#include +#include +#include +#include +#ifdef __cplusplus +extern "C" { +#endif + +/* Minimum RSA key size, from RFC6962 */ +#define SCT_MIN_RSA_BITS 2048 + +/* All hashes are SHA256 in v1 of Certificate Transparency */ +#define CT_V1_HASHLEN SHA256_DIGEST_LENGTH + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SCT, SCT, SCT) +#define sk_SCT_num(sk) OPENSSL_sk_num(ossl_check_const_SCT_sk_type(sk)) +#define sk_SCT_value(sk, idx) ((SCT *)OPENSSL_sk_value(ossl_check_const_SCT_sk_type(sk), (idx))) +#define sk_SCT_new(cmp) ((STACK_OF(SCT) *)OPENSSL_sk_new(ossl_check_SCT_compfunc_type(cmp))) +#define sk_SCT_new_null() ((STACK_OF(SCT) *)OPENSSL_sk_new_null()) +#define sk_SCT_new_reserve(cmp, n) ((STACK_OF(SCT) *)OPENSSL_sk_new_reserve(ossl_check_SCT_compfunc_type(cmp), (n))) +#define sk_SCT_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SCT_sk_type(sk), (n)) +#define sk_SCT_free(sk) OPENSSL_sk_free(ossl_check_SCT_sk_type(sk)) +#define sk_SCT_zero(sk) OPENSSL_sk_zero(ossl_check_SCT_sk_type(sk)) +#define sk_SCT_delete(sk, i) ((SCT *)OPENSSL_sk_delete(ossl_check_SCT_sk_type(sk), (i))) +#define sk_SCT_delete_ptr(sk, ptr) ((SCT *)OPENSSL_sk_delete_ptr(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr))) +#define sk_SCT_push(sk, ptr) OPENSSL_sk_push(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr)) +#define sk_SCT_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr)) +#define sk_SCT_pop(sk) ((SCT *)OPENSSL_sk_pop(ossl_check_SCT_sk_type(sk))) +#define sk_SCT_shift(sk) ((SCT *)OPENSSL_sk_shift(ossl_check_SCT_sk_type(sk))) +#define sk_SCT_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SCT_sk_type(sk),ossl_check_SCT_freefunc_type(freefunc)) +#define sk_SCT_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr), (idx)) +#define sk_SCT_set(sk, idx, ptr) ((SCT *)OPENSSL_sk_set(ossl_check_SCT_sk_type(sk), (idx), ossl_check_SCT_type(ptr))) +#define sk_SCT_find(sk, ptr) OPENSSL_sk_find(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr)) +#define sk_SCT_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr)) +#define sk_SCT_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr), pnum) +#define sk_SCT_sort(sk) OPENSSL_sk_sort(ossl_check_SCT_sk_type(sk)) +#define sk_SCT_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SCT_sk_type(sk)) +#define sk_SCT_dup(sk) ((STACK_OF(SCT) *)OPENSSL_sk_dup(ossl_check_const_SCT_sk_type(sk))) +#define sk_SCT_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SCT) *)OPENSSL_sk_deep_copy(ossl_check_const_SCT_sk_type(sk), ossl_check_SCT_copyfunc_type(copyfunc), ossl_check_SCT_freefunc_type(freefunc))) +#define sk_SCT_set_cmp_func(sk, cmp) ((sk_SCT_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SCT_sk_type(sk), ossl_check_SCT_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(CTLOG, CTLOG, CTLOG) +#define sk_CTLOG_num(sk) OPENSSL_sk_num(ossl_check_const_CTLOG_sk_type(sk)) +#define sk_CTLOG_value(sk, idx) ((CTLOG *)OPENSSL_sk_value(ossl_check_const_CTLOG_sk_type(sk), (idx))) +#define sk_CTLOG_new(cmp) ((STACK_OF(CTLOG) *)OPENSSL_sk_new(ossl_check_CTLOG_compfunc_type(cmp))) +#define sk_CTLOG_new_null() ((STACK_OF(CTLOG) *)OPENSSL_sk_new_null()) +#define sk_CTLOG_new_reserve(cmp, n) ((STACK_OF(CTLOG) *)OPENSSL_sk_new_reserve(ossl_check_CTLOG_compfunc_type(cmp), (n))) +#define sk_CTLOG_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CTLOG_sk_type(sk), (n)) +#define sk_CTLOG_free(sk) OPENSSL_sk_free(ossl_check_CTLOG_sk_type(sk)) +#define sk_CTLOG_zero(sk) OPENSSL_sk_zero(ossl_check_CTLOG_sk_type(sk)) +#define sk_CTLOG_delete(sk, i) ((CTLOG *)OPENSSL_sk_delete(ossl_check_CTLOG_sk_type(sk), (i))) +#define sk_CTLOG_delete_ptr(sk, ptr) ((CTLOG *)OPENSSL_sk_delete_ptr(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr))) +#define sk_CTLOG_push(sk, ptr) OPENSSL_sk_push(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr)) +#define sk_CTLOG_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr)) +#define sk_CTLOG_pop(sk) ((CTLOG *)OPENSSL_sk_pop(ossl_check_CTLOG_sk_type(sk))) +#define sk_CTLOG_shift(sk) ((CTLOG *)OPENSSL_sk_shift(ossl_check_CTLOG_sk_type(sk))) +#define sk_CTLOG_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CTLOG_sk_type(sk),ossl_check_CTLOG_freefunc_type(freefunc)) +#define sk_CTLOG_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr), (idx)) +#define sk_CTLOG_set(sk, idx, ptr) ((CTLOG *)OPENSSL_sk_set(ossl_check_CTLOG_sk_type(sk), (idx), ossl_check_CTLOG_type(ptr))) +#define sk_CTLOG_find(sk, ptr) OPENSSL_sk_find(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr)) +#define sk_CTLOG_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr)) +#define sk_CTLOG_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr), pnum) +#define sk_CTLOG_sort(sk) OPENSSL_sk_sort(ossl_check_CTLOG_sk_type(sk)) +#define sk_CTLOG_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CTLOG_sk_type(sk)) +#define sk_CTLOG_dup(sk) ((STACK_OF(CTLOG) *)OPENSSL_sk_dup(ossl_check_const_CTLOG_sk_type(sk))) +#define sk_CTLOG_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CTLOG) *)OPENSSL_sk_deep_copy(ossl_check_const_CTLOG_sk_type(sk), ossl_check_CTLOG_copyfunc_type(copyfunc), ossl_check_CTLOG_freefunc_type(freefunc))) +#define sk_CTLOG_set_cmp_func(sk, cmp) ((sk_CTLOG_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_compfunc_type(cmp))) + +/* clang-format on */ + +typedef enum { + CT_LOG_ENTRY_TYPE_NOT_SET = -1, + CT_LOG_ENTRY_TYPE_X509 = 0, + CT_LOG_ENTRY_TYPE_PRECERT = 1 +} ct_log_entry_type_t; + +typedef enum { + SCT_VERSION_NOT_SET = -1, + SCT_VERSION_V1 = 0 +} sct_version_t; + +typedef enum { + SCT_SOURCE_UNKNOWN, + SCT_SOURCE_TLS_EXTENSION, + SCT_SOURCE_X509V3_EXTENSION, + SCT_SOURCE_OCSP_STAPLED_RESPONSE +} sct_source_t; + +typedef enum { + SCT_VALIDATION_STATUS_NOT_SET, + SCT_VALIDATION_STATUS_UNKNOWN_LOG, + SCT_VALIDATION_STATUS_VALID, + SCT_VALIDATION_STATUS_INVALID, + SCT_VALIDATION_STATUS_UNVERIFIED, + SCT_VALIDATION_STATUS_UNKNOWN_VERSION +} sct_validation_status_t; + +/****************************************** + * CT policy evaluation context functions * + ******************************************/ + +/* + * Creates a new, empty policy evaluation context associated with the given + * library context and property query string. + * The caller is responsible for calling CT_POLICY_EVAL_CTX_free when finished + * with the CT_POLICY_EVAL_CTX. + */ +CT_POLICY_EVAL_CTX *CT_POLICY_EVAL_CTX_new_ex(OSSL_LIB_CTX *libctx, + const char *propq); + +/* + * The same as CT_POLICY_EVAL_CTX_new_ex() but the default library + * context and property query string is used. + */ +CT_POLICY_EVAL_CTX *CT_POLICY_EVAL_CTX_new(void); + +/* Deletes a policy evaluation context and anything it owns. */ +void CT_POLICY_EVAL_CTX_free(CT_POLICY_EVAL_CTX *ctx); + +/* Gets the peer certificate that the SCTs are for */ +X509 *CT_POLICY_EVAL_CTX_get0_cert(const CT_POLICY_EVAL_CTX *ctx); + +/* + * Sets the certificate associated with the received SCTs. + * Increments the reference count of cert. + * Returns 1 on success, 0 otherwise. + */ +int CT_POLICY_EVAL_CTX_set1_cert(CT_POLICY_EVAL_CTX *ctx, X509 *cert); + +/* Gets the issuer of the aforementioned certificate */ +X509 *CT_POLICY_EVAL_CTX_get0_issuer(const CT_POLICY_EVAL_CTX *ctx); + +/* + * Sets the issuer of the certificate associated with the received SCTs. + * Increments the reference count of issuer. + * Returns 1 on success, 0 otherwise. + */ +int CT_POLICY_EVAL_CTX_set1_issuer(CT_POLICY_EVAL_CTX *ctx, X509 *issuer); + +/* Gets the CT logs that are trusted sources of SCTs */ +const CTLOG_STORE *CT_POLICY_EVAL_CTX_get0_log_store(const CT_POLICY_EVAL_CTX *ctx); + +/* Sets the log store that is in use. It must outlive the CT_POLICY_EVAL_CTX. */ +void CT_POLICY_EVAL_CTX_set_shared_CTLOG_STORE(CT_POLICY_EVAL_CTX *ctx, + CTLOG_STORE *log_store); + +/* + * Gets the time, in milliseconds since the Unix epoch, that will be used as the + * current time when checking whether an SCT was issued in the future. + * Such SCTs will fail validation, as required by RFC6962. + */ +uint64_t CT_POLICY_EVAL_CTX_get_time(const CT_POLICY_EVAL_CTX *ctx); + +/* + * Sets the time to evaluate SCTs against, in milliseconds since the Unix epoch. + * If an SCT's timestamp is after this time, it will be interpreted as having + * been issued in the future. RFC6962 states that "TLS clients MUST reject SCTs + * whose timestamp is in the future", so an SCT will not validate in this case. + */ +void CT_POLICY_EVAL_CTX_set_time(CT_POLICY_EVAL_CTX *ctx, uint64_t time_in_ms); + +/***************** + * SCT functions * + *****************/ + +/* + * Creates a new, blank SCT. + * The caller is responsible for calling SCT_free when finished with the SCT. + */ +SCT *SCT_new(void); + +/* + * Creates a new SCT from some base64-encoded strings. + * The caller is responsible for calling SCT_free when finished with the SCT. + */ +SCT *SCT_new_from_base64(unsigned char version, + const char *logid_base64, + ct_log_entry_type_t entry_type, + uint64_t timestamp, + const char *extensions_base64, + const char *signature_base64); + +/* + * Frees the SCT and the underlying data structures. + */ +void SCT_free(SCT *sct); + +/* + * Free a stack of SCTs, and the underlying SCTs themselves. + * Intended to be compatible with X509V3_EXT_FREE. + */ +void SCT_LIST_free(STACK_OF(SCT) *a); + +/* + * Returns the version of the SCT. + */ +sct_version_t SCT_get_version(const SCT *sct); + +/* + * Set the version of an SCT. + * Returns 1 on success, 0 if the version is unrecognized. + */ +__owur int SCT_set_version(SCT *sct, sct_version_t version); + +/* + * Returns the log entry type of the SCT. + */ +ct_log_entry_type_t SCT_get_log_entry_type(const SCT *sct); + +/* + * Set the log entry type of an SCT. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set_log_entry_type(SCT *sct, ct_log_entry_type_t entry_type); + +/* + * Gets the ID of the log that an SCT came from. + * Ownership of the log ID remains with the SCT. + * Returns the length of the log ID. + */ +size_t SCT_get0_log_id(const SCT *sct, unsigned char **log_id); + +/* + * Set the log ID of an SCT to point directly to the *log_id specified. + * The SCT takes ownership of the specified pointer. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set0_log_id(SCT *sct, unsigned char *log_id, size_t log_id_len); + +/* + * Set the log ID of an SCT. + * This makes a copy of the log_id. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set1_log_id(SCT *sct, const unsigned char *log_id, + size_t log_id_len); + +/* + * Returns the timestamp for the SCT (epoch time in milliseconds). + */ +uint64_t SCT_get_timestamp(const SCT *sct); + +/* + * Set the timestamp of an SCT (epoch time in milliseconds). + */ +void SCT_set_timestamp(SCT *sct, uint64_t timestamp); + +/* + * Return the NID for the signature used by the SCT. + * For CT v1, this will be either NID_sha256WithRSAEncryption or + * NID_ecdsa_with_SHA256 (or NID_undef if incorrect/unset). + */ +int SCT_get_signature_nid(const SCT *sct); + +/* + * Set the signature type of an SCT + * For CT v1, this should be either NID_sha256WithRSAEncryption or + * NID_ecdsa_with_SHA256. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set_signature_nid(SCT *sct, int nid); + +/* + * Set *ext to point to the extension data for the SCT. ext must not be NULL. + * The SCT retains ownership of this pointer. + * Returns length of the data pointed to. + */ +size_t SCT_get0_extensions(const SCT *sct, unsigned char **ext); + +/* + * Set the extensions of an SCT to point directly to the *ext specified. + * The SCT takes ownership of the specified pointer. + */ +void SCT_set0_extensions(SCT *sct, unsigned char *ext, size_t ext_len); + +/* + * Set the extensions of an SCT. + * This takes a copy of the ext. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set1_extensions(SCT *sct, const unsigned char *ext, + size_t ext_len); + +/* + * Set *sig to point to the signature for the SCT. sig must not be NULL. + * The SCT retains ownership of this pointer. + * Returns length of the data pointed to. + */ +size_t SCT_get0_signature(const SCT *sct, unsigned char **sig); + +/* + * Set the signature of an SCT to point directly to the *sig specified. + * The SCT takes ownership of the specified pointer. + */ +void SCT_set0_signature(SCT *sct, unsigned char *sig, size_t sig_len); + +/* + * Set the signature of an SCT to be a copy of the *sig specified. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set1_signature(SCT *sct, const unsigned char *sig, + size_t sig_len); + +/* + * The origin of this SCT, e.g. TLS extension, OCSP response, etc. + */ +sct_source_t SCT_get_source(const SCT *sct); + +/* + * Set the origin of this SCT, e.g. TLS extension, OCSP response, etc. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set_source(SCT *sct, sct_source_t source); + +/* + * Returns a text string describing the validation status of |sct|. + */ +const char *SCT_validation_status_string(const SCT *sct); + +/* + * Pretty-prints an |sct| to |out|. + * It will be indented by the number of spaces specified by |indent|. + * If |logs| is not NULL, it will be used to lookup the CT log that the SCT came + * from, so that the log name can be printed. + */ +void SCT_print(const SCT *sct, BIO *out, int indent, const CTLOG_STORE *logs); + +/* + * Pretty-prints an |sct_list| to |out|. + * It will be indented by the number of spaces specified by |indent|. + * SCTs will be delimited by |separator|. + * If |logs| is not NULL, it will be used to lookup the CT log that each SCT + * came from, so that the log names can be printed. + */ +void SCT_LIST_print(const STACK_OF(SCT) *sct_list, BIO *out, int indent, + const char *separator, const CTLOG_STORE *logs); + +/* + * Gets the last result of validating this SCT. + * If it has not been validated yet, returns SCT_VALIDATION_STATUS_NOT_SET. + */ +sct_validation_status_t SCT_get_validation_status(const SCT *sct); + +/* + * Validates the given SCT with the provided context. + * Sets the "validation_status" field of the SCT. + * Returns 1 if the SCT is valid and the signature verifies. + * Returns 0 if the SCT is invalid or could not be verified. + * Returns -1 if an error occurs. + */ +__owur int SCT_validate(SCT *sct, const CT_POLICY_EVAL_CTX *ctx); + +/* + * Validates the given list of SCTs with the provided context. + * Sets the "validation_status" field of each SCT. + * Returns 1 if there are no invalid SCTs and all signatures verify. + * Returns 0 if at least one SCT is invalid or could not be verified. + * Returns a negative integer if an error occurs. + */ +__owur int SCT_LIST_validate(const STACK_OF(SCT) *scts, + CT_POLICY_EVAL_CTX *ctx); + +/********************************* + * SCT parsing and serialization * + *********************************/ + +/* + * Serialize (to TLS format) a stack of SCTs and return the length. + * "a" must not be NULL. + * If "pp" is NULL, just return the length of what would have been serialized. + * If "pp" is not NULL and "*pp" is null, function will allocate a new pointer + * for data that caller is responsible for freeing (only if function returns + * successfully). + * If "pp" is NULL and "*pp" is not NULL, caller is responsible for ensuring + * that "*pp" is large enough to accept all of the serialized data. + * Returns < 0 on error, >= 0 indicating bytes written (or would have been) + * on success. + */ +__owur int i2o_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp); + +/* + * Convert TLS format SCT list to a stack of SCTs. + * If "a" or "*a" is NULL, a new stack will be created that the caller is + * responsible for freeing (by calling SCT_LIST_free). + * "**pp" and "*pp" must not be NULL. + * Upon success, "*pp" will point to after the last bytes read, and a stack + * will be returned. + * Upon failure, a NULL pointer will be returned, and the position of "*pp" is + * not defined. + */ +STACK_OF(SCT) *o2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, + size_t len); + +/* + * Serialize (to DER format) a stack of SCTs and return the length. + * "a" must not be NULL. + * If "pp" is NULL, just returns the length of what would have been serialized. + * If "pp" is not NULL and "*pp" is null, function will allocate a new pointer + * for data that caller is responsible for freeing (only if function returns + * successfully). + * If "pp" is NULL and "*pp" is not NULL, caller is responsible for ensuring + * that "*pp" is large enough to accept all of the serialized data. + * Returns < 0 on error, >= 0 indicating bytes written (or would have been) + * on success. + */ +__owur int i2d_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp); + +/* + * Parses an SCT list in DER format and returns it. + * If "a" or "*a" is NULL, a new stack will be created that the caller is + * responsible for freeing (by calling SCT_LIST_free). + * "**pp" and "*pp" must not be NULL. + * Upon success, "*pp" will point to after the last bytes read, and a stack + * will be returned. + * Upon failure, a NULL pointer will be returned, and the position of "*pp" is + * not defined. + */ +STACK_OF(SCT) *d2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, + long len); + +/* + * Serialize (to TLS format) an |sct| and write it to |out|. + * If |out| is null, no SCT will be output but the length will still be returned. + * If |out| points to a null pointer, a string will be allocated to hold the + * TLS-format SCT. It is the responsibility of the caller to free it. + * If |out| points to an allocated string, the TLS-format SCT will be written + * to it. + * The length of the SCT in TLS format will be returned. + */ +__owur int i2o_SCT(const SCT *sct, unsigned char **out); + +/* + * Parses an SCT in TLS format and returns it. + * If |psct| is not null, it will end up pointing to the parsed SCT. If it + * already points to a non-null pointer, the pointer will be free'd. + * |in| should be a pointer to a string containing the TLS-format SCT. + * |in| will be advanced to the end of the SCT if parsing succeeds. + * |len| should be the length of the SCT in |in|. + * Returns NULL if an error occurs. + * If the SCT is an unsupported version, only the SCT's 'sct' and 'sct_len' + * fields will be populated (with |in| and |len| respectively). + */ +SCT *o2i_SCT(SCT **psct, const unsigned char **in, size_t len); + +/******************** + * CT log functions * + ********************/ + +/* + * Creates a new CT log instance with the given |public_key| and |name| and + * associates it with the give library context |libctx| and property query + * string |propq|. + * Takes ownership of |public_key| but copies |name|. + * Returns NULL if malloc fails or if |public_key| cannot be converted to DER. + * Should be deleted by the caller using CTLOG_free when no longer needed. + */ +CTLOG *CTLOG_new_ex(EVP_PKEY *public_key, const char *name, OSSL_LIB_CTX *libctx, + const char *propq); + +/* + * The same as CTLOG_new_ex except that the default library context and + * property query string are used. + */ +CTLOG *CTLOG_new(EVP_PKEY *public_key, const char *name); + +/* + * Creates a new CTLOG instance with the base64-encoded SubjectPublicKeyInfo DER + * in |pkey_base64| and associated with the given library context |libctx| and + * property query string |propq|. The |name| is a string to help users identify + * this log. + * Returns 1 on success, 0 on failure. + * Should be deleted by the caller using CTLOG_free when no longer needed. + */ +int CTLOG_new_from_base64_ex(CTLOG **ct_log, const char *pkey_base64, + const char *name, OSSL_LIB_CTX *libctx, + const char *propq); + +/* + * The same as CTLOG_new_from_base64_ex() except that the default + * library context and property query string are used. + * Returns 1 on success, 0 on failure. + */ +int CTLOG_new_from_base64(CTLOG **ct_log, + const char *pkey_base64, const char *name); + +/* + * Deletes a CT log instance and its fields. + */ +void CTLOG_free(CTLOG *log); + +/* Gets the name of the CT log */ +const char *CTLOG_get0_name(const CTLOG *log); +/* Gets the ID of the CT log */ +void CTLOG_get0_log_id(const CTLOG *log, const uint8_t **log_id, + size_t *log_id_len); +/* Gets the public key of the CT log */ +EVP_PKEY *CTLOG_get0_public_key(const CTLOG *log); + +/************************** + * CT log store functions * + **************************/ + +/* + * Creates a new CT log store and associates it with the given libctx and + * property query string. + * Should be deleted by the caller using CTLOG_STORE_free when no longer needed. + */ +CTLOG_STORE *CTLOG_STORE_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +/* + * Same as CTLOG_STORE_new_ex except that the default libctx and + * property query string are used. + * Should be deleted by the caller using CTLOG_STORE_free when no longer needed. + */ +CTLOG_STORE *CTLOG_STORE_new(void); + +/* + * Deletes a CT log store and all of the CT log instances held within. + */ +void CTLOG_STORE_free(CTLOG_STORE *store); + +/* + * Finds a CT log in the store based on its log ID. + * Returns the CT log, or NULL if no match is found. + */ +const CTLOG *CTLOG_STORE_get0_log_by_id(const CTLOG_STORE *store, + const uint8_t *log_id, + size_t log_id_len); + +/* + * Loads a CT log list into a |store| from a |file|. + * Returns 1 if loading is successful, or 0 otherwise. + */ +__owur int CTLOG_STORE_load_file(CTLOG_STORE *store, const char *file); + +/* + * Loads the default CT log list into a |store|. + * Returns 1 if loading is successful, or 0 otherwise. + */ +__owur int CTLOG_STORE_load_default_file(CTLOG_STORE *store); + +#ifdef __cplusplus +} +#endif +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/err.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/err.h new file mode 100644 index 000000000000..a15ac6ac1f78 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/err.h @@ -0,0 +1,517 @@ +/* + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_ERR_H +#define OPENSSL_ERR_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_ERR_H +#endif + +#include + +#ifndef OPENSSL_NO_STDIO +#include +#include +#endif + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifndef OPENSSL_NO_FILENAMES +#define ERR_PUT_error(l, f, r, fn, ln) ERR_put_error(l, f, r, fn, ln) +#else +#define ERR_PUT_error(l, f, r, fn, ln) ERR_put_error(l, f, r, NULL, 0) +#endif +#endif + +#include +#include + +#define ERR_TXT_MALLOCED 0x01 +#define ERR_TXT_STRING 0x02 + +#if !defined(OPENSSL_NO_DEPRECATED_3_0) || defined(OSSL_FORCE_ERR_STATE) +#define ERR_FLAG_MARK 0x01 +#define ERR_FLAG_CLEAR 0x02 + +#define ERR_NUM_ERRORS 16 +struct err_state_st { + int err_flags[ERR_NUM_ERRORS]; + int err_marks[ERR_NUM_ERRORS]; + unsigned long err_buffer[ERR_NUM_ERRORS]; + char *err_data[ERR_NUM_ERRORS]; + size_t err_data_size[ERR_NUM_ERRORS]; + int err_data_flags[ERR_NUM_ERRORS]; + char *err_file[ERR_NUM_ERRORS]; + int err_line[ERR_NUM_ERRORS]; + char *err_func[ERR_NUM_ERRORS]; + int top, bottom; +}; +#endif + +/* library */ +#define ERR_LIB_NONE 1 +#define ERR_LIB_SYS 2 +#define ERR_LIB_BN 3 +#define ERR_LIB_RSA 4 +#define ERR_LIB_DH 5 +#define ERR_LIB_EVP 6 +#define ERR_LIB_BUF 7 +#define ERR_LIB_OBJ 8 +#define ERR_LIB_PEM 9 +#define ERR_LIB_DSA 10 +#define ERR_LIB_X509 11 +/* #define ERR_LIB_METH 12 */ +#define ERR_LIB_ASN1 13 +#define ERR_LIB_CONF 14 +#define ERR_LIB_CRYPTO 15 +#define ERR_LIB_EC 16 +#define ERR_LIB_SSL 20 +/* #define ERR_LIB_SSL23 21 */ +/* #define ERR_LIB_SSL2 22 */ +/* #define ERR_LIB_SSL3 23 */ +/* #define ERR_LIB_RSAREF 30 */ +/* #define ERR_LIB_PROXY 31 */ +#define ERR_LIB_BIO 32 +#define ERR_LIB_PKCS7 33 +#define ERR_LIB_X509V3 34 +#define ERR_LIB_PKCS12 35 +#define ERR_LIB_RAND 36 +#define ERR_LIB_DSO 37 +#define ERR_LIB_ENGINE 38 +#define ERR_LIB_OCSP 39 +#define ERR_LIB_UI 40 +#define ERR_LIB_COMP 41 +#define ERR_LIB_ECDSA 42 +#define ERR_LIB_ECDH 43 +#define ERR_LIB_OSSL_STORE 44 +#define ERR_LIB_FIPS 45 +#define ERR_LIB_CMS 46 +#define ERR_LIB_TS 47 +#define ERR_LIB_HMAC 48 +/* # define ERR_LIB_JPAKE 49 */ +#define ERR_LIB_CT 50 +#define ERR_LIB_ASYNC 51 +#define ERR_LIB_KDF 52 +#define ERR_LIB_SM2 53 +#define ERR_LIB_ESS 54 +#define ERR_LIB_PROP 55 +#define ERR_LIB_CRMF 56 +#define ERR_LIB_PROV 57 +#define ERR_LIB_CMP 58 +#define ERR_LIB_OSSL_ENCODER 59 +#define ERR_LIB_OSSL_DECODER 60 +#define ERR_LIB_HTTP 61 + +#define ERR_LIB_USER 128 + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define ASN1err(f, r) ERR_raise_data(ERR_LIB_ASN1, (r), NULL) +#define ASYNCerr(f, r) ERR_raise_data(ERR_LIB_ASYNC, (r), NULL) +#define BIOerr(f, r) ERR_raise_data(ERR_LIB_BIO, (r), NULL) +#define BNerr(f, r) ERR_raise_data(ERR_LIB_BN, (r), NULL) +#define BUFerr(f, r) ERR_raise_data(ERR_LIB_BUF, (r), NULL) +#define CMPerr(f, r) ERR_raise_data(ERR_LIB_CMP, (r), NULL) +#define CMSerr(f, r) ERR_raise_data(ERR_LIB_CMS, (r), NULL) +#define COMPerr(f, r) ERR_raise_data(ERR_LIB_COMP, (r), NULL) +#define CONFerr(f, r) ERR_raise_data(ERR_LIB_CONF, (r), NULL) +#define CRMFerr(f, r) ERR_raise_data(ERR_LIB_CRMF, (r), NULL) +#define CRYPTOerr(f, r) ERR_raise_data(ERR_LIB_CRYPTO, (r), NULL) +#define CTerr(f, r) ERR_raise_data(ERR_LIB_CT, (r), NULL) +#define DHerr(f, r) ERR_raise_data(ERR_LIB_DH, (r), NULL) +#define DSAerr(f, r) ERR_raise_data(ERR_LIB_DSA, (r), NULL) +#define DSOerr(f, r) ERR_raise_data(ERR_LIB_DSO, (r), NULL) +#define ECDHerr(f, r) ERR_raise_data(ERR_LIB_ECDH, (r), NULL) +#define ECDSAerr(f, r) ERR_raise_data(ERR_LIB_ECDSA, (r), NULL) +#define ECerr(f, r) ERR_raise_data(ERR_LIB_EC, (r), NULL) +#define ENGINEerr(f, r) ERR_raise_data(ERR_LIB_ENGINE, (r), NULL) +#define ESSerr(f, r) ERR_raise_data(ERR_LIB_ESS, (r), NULL) +#define EVPerr(f, r) ERR_raise_data(ERR_LIB_EVP, (r), NULL) +#define FIPSerr(f, r) ERR_raise_data(ERR_LIB_FIPS, (r), NULL) +#define HMACerr(f, r) ERR_raise_data(ERR_LIB_HMAC, (r), NULL) +#define HTTPerr(f, r) ERR_raise_data(ERR_LIB_HTTP, (r), NULL) +#define KDFerr(f, r) ERR_raise_data(ERR_LIB_KDF, (r), NULL) +#define OBJerr(f, r) ERR_raise_data(ERR_LIB_OBJ, (r), NULL) +#define OCSPerr(f, r) ERR_raise_data(ERR_LIB_OCSP, (r), NULL) +#define OSSL_STOREerr(f, r) ERR_raise_data(ERR_LIB_OSSL_STORE, (r), NULL) +#define PEMerr(f, r) ERR_raise_data(ERR_LIB_PEM, (r), NULL) +#define PKCS12err(f, r) ERR_raise_data(ERR_LIB_PKCS12, (r), NULL) +#define PKCS7err(f, r) ERR_raise_data(ERR_LIB_PKCS7, (r), NULL) +#define PROPerr(f, r) ERR_raise_data(ERR_LIB_PROP, (r), NULL) +#define PROVerr(f, r) ERR_raise_data(ERR_LIB_PROV, (r), NULL) +#define RANDerr(f, r) ERR_raise_data(ERR_LIB_RAND, (r), NULL) +#define RSAerr(f, r) ERR_raise_data(ERR_LIB_RSA, (r), NULL) +#define KDFerr(f, r) ERR_raise_data(ERR_LIB_KDF, (r), NULL) +#define SM2err(f, r) ERR_raise_data(ERR_LIB_SM2, (r), NULL) +#define SSLerr(f, r) ERR_raise_data(ERR_LIB_SSL, (r), NULL) +#define SYSerr(f, r) ERR_raise_data(ERR_LIB_SYS, (r), NULL) +#define TSerr(f, r) ERR_raise_data(ERR_LIB_TS, (r), NULL) +#define UIerr(f, r) ERR_raise_data(ERR_LIB_UI, (r), NULL) +#define X509V3err(f, r) ERR_raise_data(ERR_LIB_X509V3, (r), NULL) +#define X509err(f, r) ERR_raise_data(ERR_LIB_X509, (r), NULL) +#endif + +/*- + * The error code packs differently depending on if it records a system + * error or an OpenSSL error. + * + * A system error packs like this (we follow POSIX and only allow positive + * numbers that fit in an |int|): + * + * +-+-------------------------------------------------------------+ + * |1| system error number | + * +-+-------------------------------------------------------------+ + * + * An OpenSSL error packs like this: + * + * <---------------------------- 32 bits --------------------------> + * <--- 8 bits ---><------------------ 23 bits -----------------> + * +-+---------------+---------------------------------------------+ + * |0| library | reason | + * +-+---------------+---------------------------------------------+ + * + * A few of the reason bits are reserved as flags with special meaning: + * + * <5 bits-<>--------- 19 bits -----------------> + * +-------+-+-----------------------------------+ + * | rflags| | reason | + * +-------+-+-----------------------------------+ + * ^ + * | + * ERR_RFLAG_FATAL = ERR_R_FATAL + * + * The reason flags are part of the overall reason code for practical + * reasons, as they provide an easy way to place different types of + * reason codes in different numeric ranges. + * + * The currently known reason flags are: + * + * ERR_RFLAG_FATAL Flags that the reason code is considered fatal. + * For backward compatibility reasons, this flag + * is also the code for ERR_R_FATAL (that reason + * code served the dual purpose of flag and reason + * code in one in pre-3.0 OpenSSL). + * ERR_RFLAG_COMMON Flags that the reason code is common to all + * libraries. All ERR_R_ macros must use this flag, + * and no other _R_ macro is allowed to use it. + */ + +/* Macros to help decode recorded system errors */ +#define ERR_SYSTEM_FLAG ((unsigned int)INT_MAX + 1) +#define ERR_SYSTEM_MASK ((unsigned int)INT_MAX) + +/* + * Macros to help decode recorded OpenSSL errors + * As expressed above, RFLAGS and REASON overlap by one bit to allow + * ERR_R_FATAL to use ERR_RFLAG_FATAL as its reason code. + */ +#define ERR_LIB_OFFSET 23L +#define ERR_LIB_MASK 0xFF +#define ERR_RFLAGS_OFFSET 18L +#define ERR_RFLAGS_MASK 0x1F +#define ERR_REASON_MASK 0X7FFFFF + +/* + * Reason flags are defined pre-shifted to easily combine with the reason + * number. + */ +#define ERR_RFLAG_FATAL (0x1 << ERR_RFLAGS_OFFSET) +#define ERR_RFLAG_COMMON (0x2 << ERR_RFLAGS_OFFSET) + +#define ERR_SYSTEM_ERROR(errcode) (((errcode) & ERR_SYSTEM_FLAG) != 0) + +static ossl_unused ossl_inline int ERR_GET_LIB(unsigned long errcode) +{ + if (ERR_SYSTEM_ERROR(errcode)) + return ERR_LIB_SYS; + return (errcode >> ERR_LIB_OFFSET) & ERR_LIB_MASK; +} + +static ossl_unused ossl_inline int ERR_GET_RFLAGS(unsigned long errcode) +{ + if (ERR_SYSTEM_ERROR(errcode)) + return 0; + return errcode & (ERR_RFLAGS_MASK << ERR_RFLAGS_OFFSET); +} + +static ossl_unused ossl_inline int ERR_GET_REASON(unsigned long errcode) +{ + if (ERR_SYSTEM_ERROR(errcode)) + return errcode & ERR_SYSTEM_MASK; + return errcode & ERR_REASON_MASK; +} + +static ossl_unused ossl_inline int ERR_FATAL_ERROR(unsigned long errcode) +{ + return (ERR_GET_RFLAGS(errcode) & ERR_RFLAG_FATAL) != 0; +} + +static ossl_unused ossl_inline int ERR_COMMON_ERROR(unsigned long errcode) +{ + return (ERR_GET_RFLAGS(errcode) & ERR_RFLAG_COMMON) != 0; +} + +/* + * ERR_PACK is a helper macro to properly pack OpenSSL error codes and may + * only be used for that purpose. System errors are packed internally. + * ERR_PACK takes reason flags and reason code combined in |reason|. + * ERR_PACK ignores |func|, that parameter is just legacy from pre-3.0 OpenSSL. + */ +#define ERR_PACK(lib, func, reason) \ + ((((unsigned long)(lib) & ERR_LIB_MASK) << ERR_LIB_OFFSET) | (((unsigned long)(reason) & ERR_REASON_MASK))) + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SYS_F_FOPEN 0 +#define SYS_F_CONNECT 0 +#define SYS_F_GETSERVBYNAME 0 +#define SYS_F_SOCKET 0 +#define SYS_F_IOCTLSOCKET 0 +#define SYS_F_BIND 0 +#define SYS_F_LISTEN 0 +#define SYS_F_ACCEPT 0 +#define SYS_F_WSASTARTUP 0 +#define SYS_F_OPENDIR 0 +#define SYS_F_FREAD 0 +#define SYS_F_GETADDRINFO 0 +#define SYS_F_GETNAMEINFO 0 +#define SYS_F_SETSOCKOPT 0 +#define SYS_F_GETSOCKOPT 0 +#define SYS_F_GETSOCKNAME 0 +#define SYS_F_GETHOSTBYNAME 0 +#define SYS_F_FFLUSH 0 +#define SYS_F_OPEN 0 +#define SYS_F_CLOSE 0 +#define SYS_F_IOCTL 0 +#define SYS_F_STAT 0 +#define SYS_F_FCNTL 0 +#define SYS_F_FSTAT 0 +#define SYS_F_SENDFILE 0 +#endif + +/* + * All ERR_R_ codes must be combined with ERR_RFLAG_COMMON. + */ + +/* "we came from here" global reason codes, range 1..255 */ +#define ERR_R_SYS_LIB (ERR_LIB_SYS /* 2 */ | ERR_RFLAG_COMMON) +#define ERR_R_BN_LIB (ERR_LIB_BN /* 3 */ | ERR_RFLAG_COMMON) +#define ERR_R_RSA_LIB (ERR_LIB_RSA /* 4 */ | ERR_RFLAG_COMMON) +#define ERR_R_DH_LIB (ERR_LIB_DH /* 5 */ | ERR_RFLAG_COMMON) +#define ERR_R_EVP_LIB (ERR_LIB_EVP /* 6 */ | ERR_RFLAG_COMMON) +#define ERR_R_BUF_LIB (ERR_LIB_BUF /* 7 */ | ERR_RFLAG_COMMON) +#define ERR_R_OBJ_LIB (ERR_LIB_OBJ /* 8 */ | ERR_RFLAG_COMMON) +#define ERR_R_PEM_LIB (ERR_LIB_PEM /* 9 */ | ERR_RFLAG_COMMON) +#define ERR_R_DSA_LIB (ERR_LIB_DSA /* 10 */ | ERR_RFLAG_COMMON) +#define ERR_R_X509_LIB (ERR_LIB_X509 /* 11 */ | ERR_RFLAG_COMMON) +#define ERR_R_ASN1_LIB (ERR_LIB_ASN1 /* 13 */ | ERR_RFLAG_COMMON) +#define ERR_R_CONF_LIB (ERR_LIB_CONF /* 14 */ | ERR_RFLAG_COMMON) +#define ERR_R_CRYPTO_LIB (ERR_LIB_CRYPTO /* 15 */ | ERR_RFLAG_COMMON) +#define ERR_R_EC_LIB (ERR_LIB_EC /* 16 */ | ERR_RFLAG_COMMON) +#define ERR_R_SSL_LIB (ERR_LIB_SSL /* 20 */ | ERR_RFLAG_COMMON) +#define ERR_R_BIO_LIB (ERR_LIB_BIO /* 32 */ | ERR_RFLAG_COMMON) +#define ERR_R_PKCS7_LIB (ERR_LIB_PKCS7 /* 33 */ | ERR_RFLAG_COMMON) +#define ERR_R_X509V3_LIB (ERR_LIB_X509V3 /* 34 */ | ERR_RFLAG_COMMON) +#define ERR_R_PKCS12_LIB (ERR_LIB_PKCS12 /* 35 */ | ERR_RFLAG_COMMON) +#define ERR_R_RAND_LIB (ERR_LIB_RAND /* 36 */ | ERR_RFLAG_COMMON) +#define ERR_R_DSO_LIB (ERR_LIB_DSO /* 37 */ | ERR_RFLAG_COMMON) +#define ERR_R_ENGINE_LIB (ERR_LIB_ENGINE /* 38 */ | ERR_RFLAG_COMMON) +#define ERR_R_UI_LIB (ERR_LIB_UI /* 40 */ | ERR_RFLAG_COMMON) +#define ERR_R_ECDSA_LIB (ERR_LIB_ECDSA /* 42 */ | ERR_RFLAG_COMMON) +#define ERR_R_OSSL_STORE_LIB (ERR_LIB_OSSL_STORE /* 44 */ | ERR_RFLAG_COMMON) +#define ERR_R_CMS_LIB (ERR_LIB_CMS /* 46 */ | ERR_RFLAG_COMMON) +#define ERR_R_TS_LIB (ERR_LIB_TS /* 47 */ | ERR_RFLAG_COMMON) +#define ERR_R_CT_LIB (ERR_LIB_CT /* 50 */ | ERR_RFLAG_COMMON) +#define ERR_R_PROV_LIB (ERR_LIB_PROV /* 57 */ | ERR_RFLAG_COMMON) +#define ERR_R_ESS_LIB (ERR_LIB_ESS /* 54 */ | ERR_RFLAG_COMMON) +#define ERR_R_CMP_LIB (ERR_LIB_CMP /* 58 */ | ERR_RFLAG_COMMON) +#define ERR_R_OSSL_ENCODER_LIB (ERR_LIB_OSSL_ENCODER /* 59 */ | ERR_RFLAG_COMMON) +#define ERR_R_OSSL_DECODER_LIB (ERR_LIB_OSSL_DECODER /* 60 */ | ERR_RFLAG_COMMON) + +/* Other common error codes, range 256..2^ERR_RFLAGS_OFFSET-1 */ +#define ERR_R_FATAL (ERR_RFLAG_FATAL | ERR_RFLAG_COMMON) +#define ERR_R_MALLOC_FAILURE (256 | ERR_R_FATAL) +#define ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED (257 | ERR_R_FATAL) +#define ERR_R_PASSED_NULL_PARAMETER (258 | ERR_R_FATAL) +#define ERR_R_INTERNAL_ERROR (259 | ERR_R_FATAL) +#define ERR_R_DISABLED (260 | ERR_R_FATAL) +#define ERR_R_INIT_FAIL (261 | ERR_R_FATAL) +#define ERR_R_PASSED_INVALID_ARGUMENT (262 | ERR_RFLAG_COMMON) +#define ERR_R_OPERATION_FAIL (263 | ERR_R_FATAL) +#define ERR_R_INVALID_PROVIDER_FUNCTIONS (264 | ERR_R_FATAL) +#define ERR_R_INTERRUPTED_OR_CANCELLED (265 | ERR_RFLAG_COMMON) +#define ERR_R_NESTED_ASN1_ERROR (266 | ERR_RFLAG_COMMON) +#define ERR_R_MISSING_ASN1_EOS (267 | ERR_RFLAG_COMMON) +#define ERR_R_UNSUPPORTED (268 | ERR_RFLAG_COMMON) +#define ERR_R_FETCH_FAILED (269 | ERR_RFLAG_COMMON) +#define ERR_R_INVALID_PROPERTY_DEFINITION (270 | ERR_RFLAG_COMMON) +#define ERR_R_UNABLE_TO_GET_READ_LOCK (271 | ERR_R_FATAL) +#define ERR_R_UNABLE_TO_GET_WRITE_LOCK (272 | ERR_R_FATAL) + +typedef struct ERR_string_data_st { + unsigned long error; + const char *string; +} ERR_STRING_DATA; + +/* clang-format off */ +DEFINE_LHASH_OF_INTERNAL(ERR_STRING_DATA); +#define lh_ERR_STRING_DATA_new(hfn, cmp) ((LHASH_OF(ERR_STRING_DATA) *)OPENSSL_LH_set_thunks(OPENSSL_LH_new(ossl_check_ERR_STRING_DATA_lh_hashfunc_type(hfn), ossl_check_ERR_STRING_DATA_lh_compfunc_type(cmp)), lh_ERR_STRING_DATA_hash_thunk, lh_ERR_STRING_DATA_comp_thunk, lh_ERR_STRING_DATA_doall_thunk, lh_ERR_STRING_DATA_doall_arg_thunk)) +#define lh_ERR_STRING_DATA_free(lh) OPENSSL_LH_free(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_flush(lh) OPENSSL_LH_flush(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_insert(lh, ptr) ((ERR_STRING_DATA *)OPENSSL_LH_insert(ossl_check_ERR_STRING_DATA_lh_type(lh), ossl_check_ERR_STRING_DATA_lh_plain_type(ptr))) +#define lh_ERR_STRING_DATA_delete(lh, ptr) ((ERR_STRING_DATA *)OPENSSL_LH_delete(ossl_check_ERR_STRING_DATA_lh_type(lh), ossl_check_const_ERR_STRING_DATA_lh_plain_type(ptr))) +#define lh_ERR_STRING_DATA_retrieve(lh, ptr) ((ERR_STRING_DATA *)OPENSSL_LH_retrieve(ossl_check_ERR_STRING_DATA_lh_type(lh), ossl_check_const_ERR_STRING_DATA_lh_plain_type(ptr))) +#define lh_ERR_STRING_DATA_error(lh) OPENSSL_LH_error(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_num_items(lh) OPENSSL_LH_num_items(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_node_stats_bio(lh, out) OPENSSL_LH_node_stats_bio(ossl_check_const_ERR_STRING_DATA_lh_type(lh), out) +#define lh_ERR_STRING_DATA_node_usage_stats_bio(lh, out) OPENSSL_LH_node_usage_stats_bio(ossl_check_const_ERR_STRING_DATA_lh_type(lh), out) +#define lh_ERR_STRING_DATA_stats_bio(lh, out) OPENSSL_LH_stats_bio(ossl_check_const_ERR_STRING_DATA_lh_type(lh), out) +#define lh_ERR_STRING_DATA_get_down_load(lh) OPENSSL_LH_get_down_load(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_set_down_load(lh, dl) OPENSSL_LH_set_down_load(ossl_check_ERR_STRING_DATA_lh_type(lh), dl) +#define lh_ERR_STRING_DATA_doall(lh, dfn) OPENSSL_LH_doall(ossl_check_ERR_STRING_DATA_lh_type(lh), ossl_check_ERR_STRING_DATA_lh_doallfunc_type(dfn)) + +/* clang-format on */ + +/* 12 lines and some on an 80 column terminal */ +#define ERR_MAX_DATA_SIZE 1024 + +/* Building blocks */ +void ERR_new(void); +void ERR_set_debug(const char *file, int line, const char *func); +void ERR_set_error(int lib, int reason, const char *fmt, ...); +void ERR_vset_error(int lib, int reason, const char *fmt, va_list args); + +/* Main error raising functions */ +#define ERR_raise(lib, reason) ERR_raise_data((lib), (reason), NULL) +#define ERR_raise_data \ + (ERR_new(), \ + ERR_set_debug(OPENSSL_FILE, OPENSSL_LINE, OPENSSL_FUNC), \ + ERR_set_error) + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +/* Backward compatibility */ +#define ERR_put_error(lib, func, reason, file, line) \ + (ERR_new(), \ + ERR_set_debug((file), (line), OPENSSL_FUNC), \ + ERR_set_error((lib), (reason), NULL)) +#endif + +void ERR_set_error_data(char *data, int flags); + +unsigned long ERR_get_error(void); +unsigned long ERR_get_error_all(const char **file, int *line, + const char **func, + const char **data, int *flags); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +unsigned long ERR_get_error_line(const char **file, int *line); +OSSL_DEPRECATEDIN_3_0 +unsigned long ERR_get_error_line_data(const char **file, int *line, + const char **data, int *flags); +#endif +unsigned long ERR_peek_error(void); +unsigned long ERR_peek_error_line(const char **file, int *line); +unsigned long ERR_peek_error_func(const char **func); +unsigned long ERR_peek_error_data(const char **data, int *flags); +unsigned long ERR_peek_error_all(const char **file, int *line, + const char **func, + const char **data, int *flags); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +unsigned long ERR_peek_error_line_data(const char **file, int *line, + const char **data, int *flags); +#endif +unsigned long ERR_peek_last_error(void); +unsigned long ERR_peek_last_error_line(const char **file, int *line); +unsigned long ERR_peek_last_error_func(const char **func); +unsigned long ERR_peek_last_error_data(const char **data, int *flags); +unsigned long ERR_peek_last_error_all(const char **file, int *line, + const char **func, + const char **data, int *flags); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +unsigned long ERR_peek_last_error_line_data(const char **file, int *line, + const char **data, int *flags); +#endif + +void ERR_clear_error(void); + +char *ERR_error_string(unsigned long e, char *buf); +void ERR_error_string_n(unsigned long e, char *buf, size_t len); +const char *ERR_lib_error_string(unsigned long e); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 const char *ERR_func_error_string(unsigned long e); +#endif +const char *ERR_reason_error_string(unsigned long e); + +void ERR_print_errors_cb(int (*cb)(const char *str, size_t len, void *u), + void *u); +#ifndef OPENSSL_NO_STDIO +void ERR_print_errors_fp(FILE *fp); +#endif +void ERR_print_errors(BIO *bp); + +void ERR_add_error_data(int num, ...); +void ERR_add_error_vdata(int num, va_list args); +void ERR_add_error_txt(const char *sepr, const char *txt); +void ERR_add_error_mem_bio(const char *sep, BIO *bio); + +int ERR_load_strings(int lib, ERR_STRING_DATA *str); +int ERR_load_strings_const(const ERR_STRING_DATA *str); +int ERR_unload_strings(int lib, ERR_STRING_DATA *str); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define ERR_load_crypto_strings() \ + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL) +#define ERR_free_strings() \ + while (0) \ + continue +#endif +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 void ERR_remove_thread_state(void *); +#endif +#ifndef OPENSSL_NO_DEPRECATED_1_0_0 +OSSL_DEPRECATEDIN_1_0_0 void ERR_remove_state(unsigned long pid); +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 ERR_STATE *ERR_get_state(void); +#endif + +int ERR_get_next_error_library(void); + +int ERR_set_mark(void); +int ERR_pop_to_mark(void); +int ERR_clear_last_mark(void); +int ERR_count_to_mark(void); +int ERR_pop(void); + +ERR_STATE *OSSL_ERR_STATE_new(void); +void OSSL_ERR_STATE_save(ERR_STATE *es); +void OSSL_ERR_STATE_save_to_mark(ERR_STATE *es); +void OSSL_ERR_STATE_restore(const ERR_STATE *es); +void OSSL_ERR_STATE_free(ERR_STATE *es); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ess.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ess.h new file mode 100644 index 000000000000..82f38894763d --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ess.h @@ -0,0 +1,131 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/ess.h.in + * + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_ESS_H +#define OPENSSL_ESS_H +#pragma once + +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ESS_issuer_serial ESS_ISSUER_SERIAL; +typedef struct ESS_cert_id ESS_CERT_ID; +typedef struct ESS_signing_cert ESS_SIGNING_CERT; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ESS_CERT_ID, ESS_CERT_ID, ESS_CERT_ID) +#define sk_ESS_CERT_ID_num(sk) OPENSSL_sk_num(ossl_check_const_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_value(sk, idx) ((ESS_CERT_ID *)OPENSSL_sk_value(ossl_check_const_ESS_CERT_ID_sk_type(sk), (idx))) +#define sk_ESS_CERT_ID_new(cmp) ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_new(ossl_check_ESS_CERT_ID_compfunc_type(cmp))) +#define sk_ESS_CERT_ID_new_null() ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_new_null()) +#define sk_ESS_CERT_ID_new_reserve(cmp, n) ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_new_reserve(ossl_check_ESS_CERT_ID_compfunc_type(cmp), (n))) +#define sk_ESS_CERT_ID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ESS_CERT_ID_sk_type(sk), (n)) +#define sk_ESS_CERT_ID_free(sk) OPENSSL_sk_free(ossl_check_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_zero(sk) OPENSSL_sk_zero(ossl_check_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_delete(sk, i) ((ESS_CERT_ID *)OPENSSL_sk_delete(ossl_check_ESS_CERT_ID_sk_type(sk), (i))) +#define sk_ESS_CERT_ID_delete_ptr(sk, ptr) ((ESS_CERT_ID *)OPENSSL_sk_delete_ptr(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr))) +#define sk_ESS_CERT_ID_push(sk, ptr) OPENSSL_sk_push(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr)) +#define sk_ESS_CERT_ID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr)) +#define sk_ESS_CERT_ID_pop(sk) ((ESS_CERT_ID *)OPENSSL_sk_pop(ossl_check_ESS_CERT_ID_sk_type(sk))) +#define sk_ESS_CERT_ID_shift(sk) ((ESS_CERT_ID *)OPENSSL_sk_shift(ossl_check_ESS_CERT_ID_sk_type(sk))) +#define sk_ESS_CERT_ID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ESS_CERT_ID_sk_type(sk),ossl_check_ESS_CERT_ID_freefunc_type(freefunc)) +#define sk_ESS_CERT_ID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr), (idx)) +#define sk_ESS_CERT_ID_set(sk, idx, ptr) ((ESS_CERT_ID *)OPENSSL_sk_set(ossl_check_ESS_CERT_ID_sk_type(sk), (idx), ossl_check_ESS_CERT_ID_type(ptr))) +#define sk_ESS_CERT_ID_find(sk, ptr) OPENSSL_sk_find(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr)) +#define sk_ESS_CERT_ID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr)) +#define sk_ESS_CERT_ID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr), pnum) +#define sk_ESS_CERT_ID_sort(sk) OPENSSL_sk_sort(ossl_check_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_dup(sk) ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_dup(ossl_check_const_ESS_CERT_ID_sk_type(sk))) +#define sk_ESS_CERT_ID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_deep_copy(ossl_check_const_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_copyfunc_type(copyfunc), ossl_check_ESS_CERT_ID_freefunc_type(freefunc))) +#define sk_ESS_CERT_ID_set_cmp_func(sk, cmp) ((sk_ESS_CERT_ID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct ESS_signing_cert_v2_st ESS_SIGNING_CERT_V2; +typedef struct ESS_cert_id_v2_st ESS_CERT_ID_V2; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ESS_CERT_ID_V2, ESS_CERT_ID_V2, ESS_CERT_ID_V2) +#define sk_ESS_CERT_ID_V2_num(sk) OPENSSL_sk_num(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_value(sk, idx) ((ESS_CERT_ID_V2 *)OPENSSL_sk_value(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk), (idx))) +#define sk_ESS_CERT_ID_V2_new(cmp) ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_new(ossl_check_ESS_CERT_ID_V2_compfunc_type(cmp))) +#define sk_ESS_CERT_ID_V2_new_null() ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_new_null()) +#define sk_ESS_CERT_ID_V2_new_reserve(cmp, n) ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_new_reserve(ossl_check_ESS_CERT_ID_V2_compfunc_type(cmp), (n))) +#define sk_ESS_CERT_ID_V2_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ESS_CERT_ID_V2_sk_type(sk), (n)) +#define sk_ESS_CERT_ID_V2_free(sk) OPENSSL_sk_free(ossl_check_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_zero(sk) OPENSSL_sk_zero(ossl_check_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_delete(sk, i) ((ESS_CERT_ID_V2 *)OPENSSL_sk_delete(ossl_check_ESS_CERT_ID_V2_sk_type(sk), (i))) +#define sk_ESS_CERT_ID_V2_delete_ptr(sk, ptr) ((ESS_CERT_ID_V2 *)OPENSSL_sk_delete_ptr(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr))) +#define sk_ESS_CERT_ID_V2_push(sk, ptr) OPENSSL_sk_push(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr)) +#define sk_ESS_CERT_ID_V2_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr)) +#define sk_ESS_CERT_ID_V2_pop(sk) ((ESS_CERT_ID_V2 *)OPENSSL_sk_pop(ossl_check_ESS_CERT_ID_V2_sk_type(sk))) +#define sk_ESS_CERT_ID_V2_shift(sk) ((ESS_CERT_ID_V2 *)OPENSSL_sk_shift(ossl_check_ESS_CERT_ID_V2_sk_type(sk))) +#define sk_ESS_CERT_ID_V2_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ESS_CERT_ID_V2_sk_type(sk),ossl_check_ESS_CERT_ID_V2_freefunc_type(freefunc)) +#define sk_ESS_CERT_ID_V2_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr), (idx)) +#define sk_ESS_CERT_ID_V2_set(sk, idx, ptr) ((ESS_CERT_ID_V2 *)OPENSSL_sk_set(ossl_check_ESS_CERT_ID_V2_sk_type(sk), (idx), ossl_check_ESS_CERT_ID_V2_type(ptr))) +#define sk_ESS_CERT_ID_V2_find(sk, ptr) OPENSSL_sk_find(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr)) +#define sk_ESS_CERT_ID_V2_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr)) +#define sk_ESS_CERT_ID_V2_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr), pnum) +#define sk_ESS_CERT_ID_V2_sort(sk) OPENSSL_sk_sort(ossl_check_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_dup(sk) ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_dup(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk))) +#define sk_ESS_CERT_ID_V2_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_deep_copy(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_copyfunc_type(copyfunc), ossl_check_ESS_CERT_ID_V2_freefunc_type(freefunc))) +#define sk_ESS_CERT_ID_V2_set_cmp_func(sk, cmp) ((sk_ESS_CERT_ID_V2_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_ALLOC_FUNCTIONS(ESS_ISSUER_SERIAL) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(ESS_ISSUER_SERIAL, ESS_ISSUER_SERIAL) +DECLARE_ASN1_DUP_FUNCTION(ESS_ISSUER_SERIAL) + +DECLARE_ASN1_ALLOC_FUNCTIONS(ESS_CERT_ID) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(ESS_CERT_ID, ESS_CERT_ID) +DECLARE_ASN1_DUP_FUNCTION(ESS_CERT_ID) + +DECLARE_ASN1_FUNCTIONS(ESS_SIGNING_CERT) +DECLARE_ASN1_DUP_FUNCTION(ESS_SIGNING_CERT) + +DECLARE_ASN1_ALLOC_FUNCTIONS(ESS_CERT_ID_V2) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(ESS_CERT_ID_V2, ESS_CERT_ID_V2) +DECLARE_ASN1_DUP_FUNCTION(ESS_CERT_ID_V2) + +DECLARE_ASN1_FUNCTIONS(ESS_SIGNING_CERT_V2) +DECLARE_ASN1_DUP_FUNCTION(ESS_SIGNING_CERT_V2) + +ESS_SIGNING_CERT *OSSL_ESS_signing_cert_new_init(const X509 *signcert, + const STACK_OF(X509) *certs, + int set_issuer_serial); +ESS_SIGNING_CERT_V2 *OSSL_ESS_signing_cert_v2_new_init(const EVP_MD *hash_alg, + const X509 *signcert, + const STACK_OF(X509) *certs, + int set_issuer_serial); +int OSSL_ESS_check_signing_certs(const ESS_SIGNING_CERT *ss, + const ESS_SIGNING_CERT_V2 *ssv2, + const STACK_OF(X509) *chain, + int require_signing_cert); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/fipskey.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/fipskey.h new file mode 100644 index 000000000000..2defbe7b232a --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/fipskey.h @@ -0,0 +1,47 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/fipskey.h.in + * + * Copyright 2020-2024 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_FIPSKEY_H +#define OPENSSL_FIPSKEY_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The FIPS validation HMAC key, usable as an array initializer. + */ +/* clang-format off */ +#define FIPS_KEY_ELEMENTS \ + 0xf4, 0x55, 0x66, 0x50, 0xac, 0x31, 0xd3, 0x54, 0x61, 0x61, 0x0b, 0xac, 0x4e, 0xd8, 0x1b, 0x1a, 0x18, 0x1b, 0x2d, 0x8a, 0x43, 0xea, 0x28, 0x54, 0xcb, 0xae, 0x22, 0xca, 0x74, 0x56, 0x08, 0x13 +/* clang-format on */ + +/* + * The FIPS validation key, as a string. + */ +/* clang-format off */ +#define FIPS_KEY_STRING "f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813" +/* clang-format on */ + +/* + * The FIPS provider vendor name, as a string. + */ +/* clang-format off */ +#define FIPS_VENDOR "OpenSSL FIPS Provider" +/* clang-format on */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/lhash.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/lhash.h new file mode 100644 index 000000000000..dab9372b0b67 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/lhash.h @@ -0,0 +1,417 @@ +/* + * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +/* + * Header for dynamic hash table routines Author - Eric Young + */ + +#ifndef OPENSSL_LHASH_H +#define OPENSSL_LHASH_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_LHASH_H +#endif + +#include +#include +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct lhash_node_st OPENSSL_LH_NODE; +typedef int (*OPENSSL_LH_COMPFUNC)(const void *, const void *); +typedef int (*OPENSSL_LH_COMPFUNCTHUNK)(const void *, const void *, OPENSSL_LH_COMPFUNC cfn); +typedef unsigned long (*OPENSSL_LH_HASHFUNC)(const void *); +typedef unsigned long (*OPENSSL_LH_HASHFUNCTHUNK)(const void *, OPENSSL_LH_HASHFUNC hfn); +typedef void (*OPENSSL_LH_DOALL_FUNC)(void *); +typedef void (*OPENSSL_LH_DOALL_FUNC_THUNK)(void *, OPENSSL_LH_DOALL_FUNC doall); +typedef void (*OPENSSL_LH_DOALL_FUNCARG)(void *, void *); +typedef void (*OPENSSL_LH_DOALL_FUNCARG_THUNK)(void *, void *, OPENSSL_LH_DOALL_FUNCARG doall); +typedef struct lhash_st OPENSSL_LHASH; + +/* + * Macros for declaring and implementing type-safe wrappers for LHASH + * callbacks. This way, callbacks can be provided to LHASH structures without + * function pointer casting and the macro-defined callbacks provide + * per-variable casting before deferring to the underlying type-specific + * callbacks. NB: It is possible to place a "static" in front of both the + * DECLARE and IMPLEMENT macros if the functions are strictly internal. + */ + +/* First: "hash" functions */ +#define DECLARE_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *); +#define IMPLEMENT_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *arg) \ + { \ + const o_type *a = arg; \ + return name##_hash(a); \ + } +#define LHASH_HASH_FN(name) name##_LHASH_HASH + +/* Second: "compare" functions */ +#define DECLARE_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *, const void *); +#define IMPLEMENT_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *arg1, const void *arg2) \ + { \ + const o_type *a = arg1; \ + const o_type *b = arg2; \ + return name##_cmp(a, b); \ + } +#define LHASH_COMP_FN(name) name##_LHASH_COMP + +/* Fourth: "doall_arg" functions */ +#define DECLARE_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *, void *); +#define IMPLEMENT_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *arg1, void *arg2) \ + { \ + o_type *a = arg1; \ + a_type *b = arg2; \ + name##_doall_arg(a, b); \ + } +#define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG + +#define LH_LOAD_MULT 256 + +int OPENSSL_LH_error(OPENSSL_LHASH *lh); +OPENSSL_LHASH *OPENSSL_LH_new(OPENSSL_LH_HASHFUNC h, OPENSSL_LH_COMPFUNC c); +OPENSSL_LHASH *OPENSSL_LH_set_thunks(OPENSSL_LHASH *lh, + OPENSSL_LH_HASHFUNCTHUNK hw, + OPENSSL_LH_COMPFUNCTHUNK cw, + OPENSSL_LH_DOALL_FUNC_THUNK daw, + OPENSSL_LH_DOALL_FUNCARG_THUNK daaw); +void OPENSSL_LH_free(OPENSSL_LHASH *lh); +void OPENSSL_LH_flush(OPENSSL_LHASH *lh); +void *OPENSSL_LH_insert(OPENSSL_LHASH *lh, void *data); +void *OPENSSL_LH_delete(OPENSSL_LHASH *lh, const void *data); +void *OPENSSL_LH_retrieve(OPENSSL_LHASH *lh, const void *data); +void OPENSSL_LH_doall(OPENSSL_LHASH *lh, OPENSSL_LH_DOALL_FUNC func); +void OPENSSL_LH_doall_arg(OPENSSL_LHASH *lh, + OPENSSL_LH_DOALL_FUNCARG func, void *arg); +void OPENSSL_LH_doall_arg_thunk(OPENSSL_LHASH *lh, + OPENSSL_LH_DOALL_FUNCARG_THUNK daaw, + OPENSSL_LH_DOALL_FUNCARG fn, void *arg); + +unsigned long OPENSSL_LH_strhash(const char *c); +unsigned long OPENSSL_LH_num_items(const OPENSSL_LHASH *lh); +unsigned long OPENSSL_LH_get_down_load(const OPENSSL_LHASH *lh); +void OPENSSL_LH_set_down_load(OPENSSL_LHASH *lh, unsigned long down_load); + +#ifndef OPENSSL_NO_STDIO +#ifndef OPENSSL_NO_DEPRECATED_3_1 +OSSL_DEPRECATEDIN_3_1 void OPENSSL_LH_stats(const OPENSSL_LHASH *lh, FILE *fp); +OSSL_DEPRECATEDIN_3_1 void OPENSSL_LH_node_stats(const OPENSSL_LHASH *lh, FILE *fp); +OSSL_DEPRECATEDIN_3_1 void OPENSSL_LH_node_usage_stats(const OPENSSL_LHASH *lh, FILE *fp); +#endif +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_1 +OSSL_DEPRECATEDIN_3_1 void OPENSSL_LH_stats_bio(const OPENSSL_LHASH *lh, BIO *out); +OSSL_DEPRECATEDIN_3_1 void OPENSSL_LH_node_stats_bio(const OPENSSL_LHASH *lh, BIO *out); +OSSL_DEPRECATEDIN_3_1 void OPENSSL_LH_node_usage_stats_bio(const OPENSSL_LHASH *lh, BIO *out); +#endif + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define _LHASH OPENSSL_LHASH +#define LHASH_NODE OPENSSL_LH_NODE +#define lh_error OPENSSL_LH_error +#define lh_new OPENSSL_LH_new +#define lh_free OPENSSL_LH_free +#define lh_insert OPENSSL_LH_insert +#define lh_delete OPENSSL_LH_delete +#define lh_retrieve OPENSSL_LH_retrieve +#define lh_doall OPENSSL_LH_doall +#define lh_doall_arg OPENSSL_LH_doall_arg +#define lh_strhash OPENSSL_LH_strhash +#define lh_num_items OPENSSL_LH_num_items +#ifndef OPENSSL_NO_STDIO +#define lh_stats OPENSSL_LH_stats +#define lh_node_stats OPENSSL_LH_node_stats +#define lh_node_usage_stats OPENSSL_LH_node_usage_stats +#endif +#define lh_stats_bio OPENSSL_LH_stats_bio +#define lh_node_stats_bio OPENSSL_LH_node_stats_bio +#define lh_node_usage_stats_bio OPENSSL_LH_node_usage_stats_bio +#endif + +/* Type checking... */ + +#define LHASH_OF(type) struct lhash_st_##type + +/* Helper macro for internal use */ +#define DEFINE_LHASH_OF_INTERNAL(type) \ + LHASH_OF(type) \ + { \ + union lh_##type##_dummy { \ + void *d1; \ + unsigned long d2; \ + int d3; \ + } dummy; \ + }; \ + typedef int (*lh_##type##_compfunc)(const type *a, const type *b); \ + typedef unsigned long (*lh_##type##_hashfunc)(const type *a); \ + typedef void (*lh_##type##_doallfunc)(type * a); \ + static ossl_inline unsigned long lh_##type##_hash_thunk(const void *data, OPENSSL_LH_HASHFUNC hfn) \ + { \ + unsigned long (*hfn_conv)(const type *) = (unsigned long (*)(const type *))hfn; \ + return hfn_conv((const type *)data); \ + } \ + static ossl_inline int lh_##type##_comp_thunk(const void *da, const void *db, OPENSSL_LH_COMPFUNC cfn) \ + { \ + int (*cfn_conv)(const type *, const type *) = (int (*)(const type *, const type *))cfn; \ + return cfn_conv((const type *)da, (const type *)db); \ + } \ + static ossl_inline void lh_##type##_doall_thunk(void *node, OPENSSL_LH_DOALL_FUNC doall) \ + { \ + void (*doall_conv)(type *) = (void (*)(type *))doall; \ + doall_conv((type *)node); \ + } \ + static ossl_inline void lh_##type##_doall_arg_thunk(void *node, void *arg, OPENSSL_LH_DOALL_FUNCARG doall) \ + { \ + void (*doall_conv)(type *, void *) = (void (*)(type *, void *))doall; \ + doall_conv((type *)node, arg); \ + } \ + static ossl_unused ossl_inline type * \ + ossl_check_##type##_lh_plain_type(type *ptr) \ + { \ + return ptr; \ + } \ + static ossl_unused ossl_inline const type * \ + ossl_check_const_##type##_lh_plain_type(const type *ptr) \ + { \ + return ptr; \ + } \ + static ossl_unused ossl_inline const OPENSSL_LHASH * \ + ossl_check_const_##type##_lh_type(const LHASH_OF(type) *lh) \ + { \ + return (const OPENSSL_LHASH *)lh; \ + } \ + static ossl_unused ossl_inline OPENSSL_LHASH * \ + ossl_check_##type##_lh_type(LHASH_OF(type) *lh) \ + { \ + return (OPENSSL_LHASH *)lh; \ + } \ + static ossl_unused ossl_inline OPENSSL_LH_COMPFUNC \ + ossl_check_##type##_lh_compfunc_type(lh_##type##_compfunc cmp) \ + { \ + return (OPENSSL_LH_COMPFUNC)cmp; \ + } \ + static ossl_unused ossl_inline OPENSSL_LH_HASHFUNC \ + ossl_check_##type##_lh_hashfunc_type(lh_##type##_hashfunc hfn) \ + { \ + return (OPENSSL_LH_HASHFUNC)hfn; \ + } \ + static ossl_unused ossl_inline OPENSSL_LH_DOALL_FUNC \ + ossl_check_##type##_lh_doallfunc_type(lh_##type##_doallfunc dfn) \ + { \ + return (OPENSSL_LH_DOALL_FUNC)dfn; \ + } \ + LHASH_OF(type) + +#ifndef OPENSSL_NO_DEPRECATED_3_1 +#define DEFINE_LHASH_OF_DEPRECATED(type) \ + static ossl_unused ossl_inline void \ + lh_##type##_node_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ + { \ + OPENSSL_LH_node_stats_bio((const OPENSSL_LHASH *)lh, out); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_node_usage_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ + { \ + OPENSSL_LH_node_usage_stats_bio((const OPENSSL_LHASH *)lh, out); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ + { \ + OPENSSL_LH_stats_bio((const OPENSSL_LHASH *)lh, out); \ + } +#else +#define DEFINE_LHASH_OF_DEPRECATED(type) +#endif + +#define DEFINE_LHASH_OF_EX(type) \ + LHASH_OF(type) \ + { \ + union lh_##type##_dummy { \ + void *d1; \ + unsigned long d2; \ + int d3; \ + } dummy; \ + }; \ + static unsigned long \ + lh_##type##_hfn_thunk(const void *data, OPENSSL_LH_HASHFUNC hfn) \ + { \ + unsigned long (*hfn_conv)(const type *) = (unsigned long (*)(const type *))hfn; \ + return hfn_conv((const type *)data); \ + } \ + static int lh_##type##_cfn_thunk(const void *da, const void *db, OPENSSL_LH_COMPFUNC cfn) \ + { \ + int (*cfn_conv)(const type *, const type *) = (int (*)(const type *, const type *))cfn; \ + return cfn_conv((const type *)da, (const type *)db); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_free(LHASH_OF(type) *lh) \ + { \ + OPENSSL_LH_free((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_flush(LHASH_OF(type) *lh) \ + { \ + OPENSSL_LH_flush((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline type * \ + lh_##type##_insert(LHASH_OF(type) *lh, type *d) \ + { \ + return (type *)OPENSSL_LH_insert((OPENSSL_LHASH *)lh, d); \ + } \ + static ossl_unused ossl_inline type * \ + lh_##type##_delete(LHASH_OF(type) *lh, const type *d) \ + { \ + return (type *)OPENSSL_LH_delete((OPENSSL_LHASH *)lh, d); \ + } \ + static ossl_unused ossl_inline type * \ + lh_##type##_retrieve(LHASH_OF(type) *lh, const type *d) \ + { \ + return (type *)OPENSSL_LH_retrieve((OPENSSL_LHASH *)lh, d); \ + } \ + static ossl_unused ossl_inline int \ + lh_##type##_error(LHASH_OF(type) *lh) \ + { \ + return OPENSSL_LH_error((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline unsigned long \ + lh_##type##_num_items(LHASH_OF(type) *lh) \ + { \ + return OPENSSL_LH_num_items((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline unsigned long \ + lh_##type##_get_down_load(LHASH_OF(type) *lh) \ + { \ + return OPENSSL_LH_get_down_load((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_set_down_load(LHASH_OF(type) *lh, unsigned long dl) \ + { \ + OPENSSL_LH_set_down_load((OPENSSL_LHASH *)lh, dl); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_doall_thunk(void *node, OPENSSL_LH_DOALL_FUNC doall) \ + { \ + void (*doall_conv)(type *) = (void (*)(type *))doall; \ + doall_conv((type *)node); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_doall_arg_thunk(void *node, void *arg, OPENSSL_LH_DOALL_FUNCARG doall) \ + { \ + void (*doall_conv)(type *, void *) = (void (*)(type *, void *))doall; \ + doall_conv((type *)node, arg); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_doall(LHASH_OF(type) *lh, void (*doall)(type *)) \ + { \ + OPENSSL_LH_doall((OPENSSL_LHASH *)lh, (OPENSSL_LH_DOALL_FUNC)doall); \ + } \ + static ossl_unused ossl_inline LHASH_OF(type) * \ + lh_##type##_new(unsigned long (*hfn)(const type *), \ + int (*cfn)(const type *, const type *)) \ + { \ + return (LHASH_OF(type) *)OPENSSL_LH_set_thunks(OPENSSL_LH_new((OPENSSL_LH_HASHFUNC)hfn, (OPENSSL_LH_COMPFUNC)cfn), \ + lh_##type##_hfn_thunk, lh_##type##_cfn_thunk, \ + lh_##type##_doall_thunk, \ + lh_##type##_doall_arg_thunk); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_doall_arg(LHASH_OF(type) *lh, \ + void (*doallarg)(type *, void *), void *arg) \ + { \ + OPENSSL_LH_doall_arg((OPENSSL_LHASH *)lh, \ + (OPENSSL_LH_DOALL_FUNCARG)doallarg, arg); \ + } \ + LHASH_OF(type) + +#define DEFINE_LHASH_OF(type) \ + DEFINE_LHASH_OF_EX(type); \ + DEFINE_LHASH_OF_DEPRECATED(type) \ + LHASH_OF(type) + +#define IMPLEMENT_LHASH_DOALL_ARG_CONST(type, argtype) \ + int_implement_lhash_doall(type, argtype, const type) + +#define IMPLEMENT_LHASH_DOALL_ARG(type, argtype) \ + int_implement_lhash_doall(type, argtype, type) + +#define int_implement_lhash_doall(type, argtype, cbargtype) \ + static ossl_unused ossl_inline void \ + lh_##type##_doall_##argtype##_thunk(void *node, void *arg, OPENSSL_LH_DOALL_FUNCARG fn) \ + { \ + void (*fn_conv)(cbargtype *, argtype *) = (void (*)(cbargtype *, argtype *))fn; \ + fn_conv((cbargtype *)node, (argtype *)arg); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_doall_##argtype(LHASH_OF(type) *lh, \ + void (*fn)(cbargtype *, argtype *), \ + argtype *arg) \ + { \ + OPENSSL_LH_doall_arg_thunk((OPENSSL_LHASH *)lh, \ + lh_##type##_doall_##argtype##_thunk, \ + (OPENSSL_LH_DOALL_FUNCARG)fn, \ + (void *)arg); \ + } \ + LHASH_OF(type) + +/* clang-format off */ +DEFINE_LHASH_OF_INTERNAL(OPENSSL_STRING); +#define lh_OPENSSL_STRING_new(hfn, cmp) ((LHASH_OF(OPENSSL_STRING) *)OPENSSL_LH_set_thunks(OPENSSL_LH_new(ossl_check_OPENSSL_STRING_lh_hashfunc_type(hfn), ossl_check_OPENSSL_STRING_lh_compfunc_type(cmp)), lh_OPENSSL_STRING_hash_thunk, lh_OPENSSL_STRING_comp_thunk, lh_OPENSSL_STRING_doall_thunk, lh_OPENSSL_STRING_doall_arg_thunk)) +#define lh_OPENSSL_STRING_free(lh) OPENSSL_LH_free(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_flush(lh) OPENSSL_LH_flush(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_insert(lh, ptr) ((OPENSSL_STRING *)OPENSSL_LH_insert(ossl_check_OPENSSL_STRING_lh_type(lh), ossl_check_OPENSSL_STRING_lh_plain_type(ptr))) +#define lh_OPENSSL_STRING_delete(lh, ptr) ((OPENSSL_STRING *)OPENSSL_LH_delete(ossl_check_OPENSSL_STRING_lh_type(lh), ossl_check_const_OPENSSL_STRING_lh_plain_type(ptr))) +#define lh_OPENSSL_STRING_retrieve(lh, ptr) ((OPENSSL_STRING *)OPENSSL_LH_retrieve(ossl_check_OPENSSL_STRING_lh_type(lh), ossl_check_const_OPENSSL_STRING_lh_plain_type(ptr))) +#define lh_OPENSSL_STRING_error(lh) OPENSSL_LH_error(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_num_items(lh) OPENSSL_LH_num_items(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_node_stats_bio(lh, out) OPENSSL_LH_node_stats_bio(ossl_check_const_OPENSSL_STRING_lh_type(lh), out) +#define lh_OPENSSL_STRING_node_usage_stats_bio(lh, out) OPENSSL_LH_node_usage_stats_bio(ossl_check_const_OPENSSL_STRING_lh_type(lh), out) +#define lh_OPENSSL_STRING_stats_bio(lh, out) OPENSSL_LH_stats_bio(ossl_check_const_OPENSSL_STRING_lh_type(lh), out) +#define lh_OPENSSL_STRING_get_down_load(lh) OPENSSL_LH_get_down_load(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_set_down_load(lh, dl) OPENSSL_LH_set_down_load(ossl_check_OPENSSL_STRING_lh_type(lh), dl) +#define lh_OPENSSL_STRING_doall(lh, dfn) OPENSSL_LH_doall(ossl_check_OPENSSL_STRING_lh_type(lh), ossl_check_OPENSSL_STRING_lh_doallfunc_type(dfn)) +DEFINE_LHASH_OF_INTERNAL(OPENSSL_CSTRING); +#define lh_OPENSSL_CSTRING_new(hfn, cmp) ((LHASH_OF(OPENSSL_CSTRING) *)OPENSSL_LH_set_thunks(OPENSSL_LH_new(ossl_check_OPENSSL_CSTRING_lh_hashfunc_type(hfn), ossl_check_OPENSSL_CSTRING_lh_compfunc_type(cmp)), lh_OPENSSL_CSTRING_hash_thunk, lh_OPENSSL_CSTRING_comp_thunk, lh_OPENSSL_CSTRING_doall_thunk, lh_OPENSSL_CSTRING_doall_arg_thunk)) +#define lh_OPENSSL_CSTRING_free(lh) OPENSSL_LH_free(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_flush(lh) OPENSSL_LH_flush(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_insert(lh, ptr) ((OPENSSL_CSTRING *)OPENSSL_LH_insert(ossl_check_OPENSSL_CSTRING_lh_type(lh), ossl_check_OPENSSL_CSTRING_lh_plain_type(ptr))) +#define lh_OPENSSL_CSTRING_delete(lh, ptr) ((OPENSSL_CSTRING *)OPENSSL_LH_delete(ossl_check_OPENSSL_CSTRING_lh_type(lh), ossl_check_const_OPENSSL_CSTRING_lh_plain_type(ptr))) +#define lh_OPENSSL_CSTRING_retrieve(lh, ptr) ((OPENSSL_CSTRING *)OPENSSL_LH_retrieve(ossl_check_OPENSSL_CSTRING_lh_type(lh), ossl_check_const_OPENSSL_CSTRING_lh_plain_type(ptr))) +#define lh_OPENSSL_CSTRING_error(lh) OPENSSL_LH_error(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_num_items(lh) OPENSSL_LH_num_items(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_node_stats_bio(lh, out) OPENSSL_LH_node_stats_bio(ossl_check_const_OPENSSL_CSTRING_lh_type(lh), out) +#define lh_OPENSSL_CSTRING_node_usage_stats_bio(lh, out) OPENSSL_LH_node_usage_stats_bio(ossl_check_const_OPENSSL_CSTRING_lh_type(lh), out) +#define lh_OPENSSL_CSTRING_stats_bio(lh, out) OPENSSL_LH_stats_bio(ossl_check_const_OPENSSL_CSTRING_lh_type(lh), out) +#define lh_OPENSSL_CSTRING_get_down_load(lh) OPENSSL_LH_get_down_load(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_set_down_load(lh, dl) OPENSSL_LH_set_down_load(ossl_check_OPENSSL_CSTRING_lh_type(lh), dl) +#define lh_OPENSSL_CSTRING_doall(lh, dfn) OPENSSL_LH_doall(ossl_check_OPENSSL_CSTRING_lh_type(lh), ossl_check_OPENSSL_CSTRING_lh_doallfunc_type(dfn)) + +/* clang-format on */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ocsp.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ocsp.h new file mode 100644 index 000000000000..70a4f484d7e7 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ocsp.h @@ -0,0 +1,487 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/ocsp.h.in + * + * Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_OCSP_H +#define OPENSSL_OCSP_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_OCSP_H +#endif + +#include +#include +#include + +/* + * These definitions are outside the OPENSSL_NO_OCSP guard because although for + * historical reasons they have OCSP_* names, they can actually be used + * independently of OCSP. E.g. see RFC5280 + */ +/*- + * CRLReason ::= ENUMERATED { + * unspecified (0), + * keyCompromise (1), + * cACompromise (2), + * affiliationChanged (3), + * superseded (4), + * cessationOfOperation (5), + * certificateHold (6), + * -- value 7 is not used + * removeFromCRL (8), + * privilegeWithdrawn (9), + * aACompromise (10) } + */ +#define OCSP_REVOKED_STATUS_NOSTATUS -1 +#define OCSP_REVOKED_STATUS_UNSPECIFIED 0 +#define OCSP_REVOKED_STATUS_KEYCOMPROMISE 1 +#define OCSP_REVOKED_STATUS_CACOMPROMISE 2 +#define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED 3 +#define OCSP_REVOKED_STATUS_SUPERSEDED 4 +#define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION 5 +#define OCSP_REVOKED_STATUS_CERTIFICATEHOLD 6 +#define OCSP_REVOKED_STATUS_REMOVEFROMCRL 8 +#define OCSP_REVOKED_STATUS_PRIVILEGEWITHDRAWN 9 +#define OCSP_REVOKED_STATUS_AACOMPROMISE 10 + +#ifndef OPENSSL_NO_OCSP + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Various flags and values */ + +#define OCSP_DEFAULT_NONCE_LENGTH 16 + +#define OCSP_NOCERTS 0x1 +#define OCSP_NOINTERN 0x2 +#define OCSP_NOSIGS 0x4 +#define OCSP_NOCHAIN 0x8 +#define OCSP_NOVERIFY 0x10 +#define OCSP_NOEXPLICIT 0x20 +#define OCSP_NOCASIGN 0x40 +#define OCSP_NODELEGATED 0x80 +#define OCSP_NOCHECKS 0x100 +#define OCSP_TRUSTOTHER 0x200 +#define OCSP_RESPID_KEY 0x400 +#define OCSP_NOTIME 0x800 +#define OCSP_PARTIAL_CHAIN 0x1000 + +typedef struct ocsp_cert_id_st OCSP_CERTID; +typedef struct ocsp_one_request_st OCSP_ONEREQ; +typedef struct ocsp_req_info_st OCSP_REQINFO; +typedef struct ocsp_signature_st OCSP_SIGNATURE; +typedef struct ocsp_request_st OCSP_REQUEST; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OCSP_CERTID, OCSP_CERTID, OCSP_CERTID) +#define sk_OCSP_CERTID_num(sk) OPENSSL_sk_num(ossl_check_const_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_value(sk, idx) ((OCSP_CERTID *)OPENSSL_sk_value(ossl_check_const_OCSP_CERTID_sk_type(sk), (idx))) +#define sk_OCSP_CERTID_new(cmp) ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_new(ossl_check_OCSP_CERTID_compfunc_type(cmp))) +#define sk_OCSP_CERTID_new_null() ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_new_null()) +#define sk_OCSP_CERTID_new_reserve(cmp, n) ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_new_reserve(ossl_check_OCSP_CERTID_compfunc_type(cmp), (n))) +#define sk_OCSP_CERTID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OCSP_CERTID_sk_type(sk), (n)) +#define sk_OCSP_CERTID_free(sk) OPENSSL_sk_free(ossl_check_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_zero(sk) OPENSSL_sk_zero(ossl_check_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_delete(sk, i) ((OCSP_CERTID *)OPENSSL_sk_delete(ossl_check_OCSP_CERTID_sk_type(sk), (i))) +#define sk_OCSP_CERTID_delete_ptr(sk, ptr) ((OCSP_CERTID *)OPENSSL_sk_delete_ptr(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr))) +#define sk_OCSP_CERTID_push(sk, ptr) OPENSSL_sk_push(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr)) +#define sk_OCSP_CERTID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr)) +#define sk_OCSP_CERTID_pop(sk) ((OCSP_CERTID *)OPENSSL_sk_pop(ossl_check_OCSP_CERTID_sk_type(sk))) +#define sk_OCSP_CERTID_shift(sk) ((OCSP_CERTID *)OPENSSL_sk_shift(ossl_check_OCSP_CERTID_sk_type(sk))) +#define sk_OCSP_CERTID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OCSP_CERTID_sk_type(sk),ossl_check_OCSP_CERTID_freefunc_type(freefunc)) +#define sk_OCSP_CERTID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr), (idx)) +#define sk_OCSP_CERTID_set(sk, idx, ptr) ((OCSP_CERTID *)OPENSSL_sk_set(ossl_check_OCSP_CERTID_sk_type(sk), (idx), ossl_check_OCSP_CERTID_type(ptr))) +#define sk_OCSP_CERTID_find(sk, ptr) OPENSSL_sk_find(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr)) +#define sk_OCSP_CERTID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr)) +#define sk_OCSP_CERTID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr), pnum) +#define sk_OCSP_CERTID_sort(sk) OPENSSL_sk_sort(ossl_check_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_dup(sk) ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_dup(ossl_check_const_OCSP_CERTID_sk_type(sk))) +#define sk_OCSP_CERTID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_deep_copy(ossl_check_const_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_copyfunc_type(copyfunc), ossl_check_OCSP_CERTID_freefunc_type(freefunc))) +#define sk_OCSP_CERTID_set_cmp_func(sk, cmp) ((sk_OCSP_CERTID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(OCSP_ONEREQ, OCSP_ONEREQ, OCSP_ONEREQ) +#define sk_OCSP_ONEREQ_num(sk) OPENSSL_sk_num(ossl_check_const_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_value(sk, idx) ((OCSP_ONEREQ *)OPENSSL_sk_value(ossl_check_const_OCSP_ONEREQ_sk_type(sk), (idx))) +#define sk_OCSP_ONEREQ_new(cmp) ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_new(ossl_check_OCSP_ONEREQ_compfunc_type(cmp))) +#define sk_OCSP_ONEREQ_new_null() ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_new_null()) +#define sk_OCSP_ONEREQ_new_reserve(cmp, n) ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_new_reserve(ossl_check_OCSP_ONEREQ_compfunc_type(cmp), (n))) +#define sk_OCSP_ONEREQ_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OCSP_ONEREQ_sk_type(sk), (n)) +#define sk_OCSP_ONEREQ_free(sk) OPENSSL_sk_free(ossl_check_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_zero(sk) OPENSSL_sk_zero(ossl_check_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_delete(sk, i) ((OCSP_ONEREQ *)OPENSSL_sk_delete(ossl_check_OCSP_ONEREQ_sk_type(sk), (i))) +#define sk_OCSP_ONEREQ_delete_ptr(sk, ptr) ((OCSP_ONEREQ *)OPENSSL_sk_delete_ptr(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr))) +#define sk_OCSP_ONEREQ_push(sk, ptr) OPENSSL_sk_push(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr)) +#define sk_OCSP_ONEREQ_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr)) +#define sk_OCSP_ONEREQ_pop(sk) ((OCSP_ONEREQ *)OPENSSL_sk_pop(ossl_check_OCSP_ONEREQ_sk_type(sk))) +#define sk_OCSP_ONEREQ_shift(sk) ((OCSP_ONEREQ *)OPENSSL_sk_shift(ossl_check_OCSP_ONEREQ_sk_type(sk))) +#define sk_OCSP_ONEREQ_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OCSP_ONEREQ_sk_type(sk),ossl_check_OCSP_ONEREQ_freefunc_type(freefunc)) +#define sk_OCSP_ONEREQ_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr), (idx)) +#define sk_OCSP_ONEREQ_set(sk, idx, ptr) ((OCSP_ONEREQ *)OPENSSL_sk_set(ossl_check_OCSP_ONEREQ_sk_type(sk), (idx), ossl_check_OCSP_ONEREQ_type(ptr))) +#define sk_OCSP_ONEREQ_find(sk, ptr) OPENSSL_sk_find(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr)) +#define sk_OCSP_ONEREQ_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr)) +#define sk_OCSP_ONEREQ_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr), pnum) +#define sk_OCSP_ONEREQ_sort(sk) OPENSSL_sk_sort(ossl_check_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_dup(sk) ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_dup(ossl_check_const_OCSP_ONEREQ_sk_type(sk))) +#define sk_OCSP_ONEREQ_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_deep_copy(ossl_check_const_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_copyfunc_type(copyfunc), ossl_check_OCSP_ONEREQ_freefunc_type(freefunc))) +#define sk_OCSP_ONEREQ_set_cmp_func(sk, cmp) ((sk_OCSP_ONEREQ_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_compfunc_type(cmp))) + +/* clang-format on */ + +#define OCSP_RESPONSE_STATUS_SUCCESSFUL 0 +#define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST 1 +#define OCSP_RESPONSE_STATUS_INTERNALERROR 2 +#define OCSP_RESPONSE_STATUS_TRYLATER 3 +#define OCSP_RESPONSE_STATUS_SIGREQUIRED 5 +#define OCSP_RESPONSE_STATUS_UNAUTHORIZED 6 + +typedef struct ocsp_resp_bytes_st OCSP_RESPBYTES; + +#define V_OCSP_RESPID_NAME 0 +#define V_OCSP_RESPID_KEY 1 + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OCSP_RESPID, OCSP_RESPID, OCSP_RESPID) +#define sk_OCSP_RESPID_num(sk) OPENSSL_sk_num(ossl_check_const_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_value(sk, idx) ((OCSP_RESPID *)OPENSSL_sk_value(ossl_check_const_OCSP_RESPID_sk_type(sk), (idx))) +#define sk_OCSP_RESPID_new(cmp) ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_new(ossl_check_OCSP_RESPID_compfunc_type(cmp))) +#define sk_OCSP_RESPID_new_null() ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_new_null()) +#define sk_OCSP_RESPID_new_reserve(cmp, n) ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_new_reserve(ossl_check_OCSP_RESPID_compfunc_type(cmp), (n))) +#define sk_OCSP_RESPID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OCSP_RESPID_sk_type(sk), (n)) +#define sk_OCSP_RESPID_free(sk) OPENSSL_sk_free(ossl_check_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_zero(sk) OPENSSL_sk_zero(ossl_check_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_delete(sk, i) ((OCSP_RESPID *)OPENSSL_sk_delete(ossl_check_OCSP_RESPID_sk_type(sk), (i))) +#define sk_OCSP_RESPID_delete_ptr(sk, ptr) ((OCSP_RESPID *)OPENSSL_sk_delete_ptr(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr))) +#define sk_OCSP_RESPID_push(sk, ptr) OPENSSL_sk_push(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr)) +#define sk_OCSP_RESPID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr)) +#define sk_OCSP_RESPID_pop(sk) ((OCSP_RESPID *)OPENSSL_sk_pop(ossl_check_OCSP_RESPID_sk_type(sk))) +#define sk_OCSP_RESPID_shift(sk) ((OCSP_RESPID *)OPENSSL_sk_shift(ossl_check_OCSP_RESPID_sk_type(sk))) +#define sk_OCSP_RESPID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OCSP_RESPID_sk_type(sk),ossl_check_OCSP_RESPID_freefunc_type(freefunc)) +#define sk_OCSP_RESPID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr), (idx)) +#define sk_OCSP_RESPID_set(sk, idx, ptr) ((OCSP_RESPID *)OPENSSL_sk_set(ossl_check_OCSP_RESPID_sk_type(sk), (idx), ossl_check_OCSP_RESPID_type(ptr))) +#define sk_OCSP_RESPID_find(sk, ptr) OPENSSL_sk_find(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr)) +#define sk_OCSP_RESPID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr)) +#define sk_OCSP_RESPID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr), pnum) +#define sk_OCSP_RESPID_sort(sk) OPENSSL_sk_sort(ossl_check_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_dup(sk) ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_dup(ossl_check_const_OCSP_RESPID_sk_type(sk))) +#define sk_OCSP_RESPID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_deep_copy(ossl_check_const_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_copyfunc_type(copyfunc), ossl_check_OCSP_RESPID_freefunc_type(freefunc))) +#define sk_OCSP_RESPID_set_cmp_func(sk, cmp) ((sk_OCSP_RESPID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct ocsp_revoked_info_st OCSP_REVOKEDINFO; + +#define V_OCSP_CERTSTATUS_GOOD 0 +#define V_OCSP_CERTSTATUS_REVOKED 1 +#define V_OCSP_CERTSTATUS_UNKNOWN 2 + +typedef struct ocsp_cert_status_st OCSP_CERTSTATUS; +typedef struct ocsp_single_response_st OCSP_SINGLERESP; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OCSP_SINGLERESP, OCSP_SINGLERESP, OCSP_SINGLERESP) +#define sk_OCSP_SINGLERESP_num(sk) OPENSSL_sk_num(ossl_check_const_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_value(sk, idx) ((OCSP_SINGLERESP *)OPENSSL_sk_value(ossl_check_const_OCSP_SINGLERESP_sk_type(sk), (idx))) +#define sk_OCSP_SINGLERESP_new(cmp) ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_new(ossl_check_OCSP_SINGLERESP_compfunc_type(cmp))) +#define sk_OCSP_SINGLERESP_new_null() ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_new_null()) +#define sk_OCSP_SINGLERESP_new_reserve(cmp, n) ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_new_reserve(ossl_check_OCSP_SINGLERESP_compfunc_type(cmp), (n))) +#define sk_OCSP_SINGLERESP_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OCSP_SINGLERESP_sk_type(sk), (n)) +#define sk_OCSP_SINGLERESP_free(sk) OPENSSL_sk_free(ossl_check_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_zero(sk) OPENSSL_sk_zero(ossl_check_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_delete(sk, i) ((OCSP_SINGLERESP *)OPENSSL_sk_delete(ossl_check_OCSP_SINGLERESP_sk_type(sk), (i))) +#define sk_OCSP_SINGLERESP_delete_ptr(sk, ptr) ((OCSP_SINGLERESP *)OPENSSL_sk_delete_ptr(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr))) +#define sk_OCSP_SINGLERESP_push(sk, ptr) OPENSSL_sk_push(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr)) +#define sk_OCSP_SINGLERESP_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr)) +#define sk_OCSP_SINGLERESP_pop(sk) ((OCSP_SINGLERESP *)OPENSSL_sk_pop(ossl_check_OCSP_SINGLERESP_sk_type(sk))) +#define sk_OCSP_SINGLERESP_shift(sk) ((OCSP_SINGLERESP *)OPENSSL_sk_shift(ossl_check_OCSP_SINGLERESP_sk_type(sk))) +#define sk_OCSP_SINGLERESP_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OCSP_SINGLERESP_sk_type(sk),ossl_check_OCSP_SINGLERESP_freefunc_type(freefunc)) +#define sk_OCSP_SINGLERESP_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr), (idx)) +#define sk_OCSP_SINGLERESP_set(sk, idx, ptr) ((OCSP_SINGLERESP *)OPENSSL_sk_set(ossl_check_OCSP_SINGLERESP_sk_type(sk), (idx), ossl_check_OCSP_SINGLERESP_type(ptr))) +#define sk_OCSP_SINGLERESP_find(sk, ptr) OPENSSL_sk_find(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr)) +#define sk_OCSP_SINGLERESP_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr)) +#define sk_OCSP_SINGLERESP_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr), pnum) +#define sk_OCSP_SINGLERESP_sort(sk) OPENSSL_sk_sort(ossl_check_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_dup(sk) ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_dup(ossl_check_const_OCSP_SINGLERESP_sk_type(sk))) +#define sk_OCSP_SINGLERESP_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_deep_copy(ossl_check_const_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_copyfunc_type(copyfunc), ossl_check_OCSP_SINGLERESP_freefunc_type(freefunc))) +#define sk_OCSP_SINGLERESP_set_cmp_func(sk, cmp) ((sk_OCSP_SINGLERESP_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct ocsp_response_data_st OCSP_RESPDATA; + +typedef struct ocsp_basic_response_st OCSP_BASICRESP; + +typedef struct ocsp_crl_id_st OCSP_CRLID; +typedef struct ocsp_service_locator_st OCSP_SERVICELOC; + +#define PEM_STRING_OCSP_REQUEST "OCSP REQUEST" +#define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE" + +#define d2i_OCSP_REQUEST_bio(bp, p) ASN1_d2i_bio_of(OCSP_REQUEST, OCSP_REQUEST_new, d2i_OCSP_REQUEST, bp, p) + +#define d2i_OCSP_RESPONSE_bio(bp, p) ASN1_d2i_bio_of(OCSP_RESPONSE, OCSP_RESPONSE_new, d2i_OCSP_RESPONSE, bp, p) + +#define PEM_read_bio_OCSP_REQUEST(bp, x, cb) (OCSP_REQUEST *)PEM_ASN1_read_bio( \ + (d2i_of_void *)d2i_OCSP_REQUEST, PEM_STRING_OCSP_REQUEST, \ + bp, (char **)(x), cb, NULL) + +#define PEM_read_bio_OCSP_RESPONSE(bp, x, cb) (OCSP_RESPONSE *)PEM_ASN1_read_bio( \ + (d2i_of_void *)d2i_OCSP_RESPONSE, PEM_STRING_OCSP_RESPONSE, \ + bp, (char **)(x), cb, NULL) + +#define PEM_write_bio_OCSP_REQUEST(bp, o) \ + PEM_ASN1_write_bio((i2d_of_void *)i2d_OCSP_REQUEST, PEM_STRING_OCSP_REQUEST, \ + bp, (char *)(o), NULL, NULL, 0, NULL, NULL) + +#define PEM_write_bio_OCSP_RESPONSE(bp, o) \ + PEM_ASN1_write_bio((i2d_of_void *)i2d_OCSP_RESPONSE, PEM_STRING_OCSP_RESPONSE, \ + bp, (char *)(o), NULL, NULL, 0, NULL, NULL) + +#define i2d_OCSP_RESPONSE_bio(bp, o) ASN1_i2d_bio_of(OCSP_RESPONSE, i2d_OCSP_RESPONSE, bp, o) + +#define i2d_OCSP_REQUEST_bio(bp, o) ASN1_i2d_bio_of(OCSP_REQUEST, i2d_OCSP_REQUEST, bp, o) + +#define ASN1_BIT_STRING_digest(data, type, md, len) \ + ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING), type, data, md, len) + +#define OCSP_CERTSTATUS_dup(cs) \ + (OCSP_CERTSTATUS *)ASN1_dup((i2d_of_void *)i2d_OCSP_CERTSTATUS, \ + (d2i_of_void *)d2i_OCSP_CERTSTATUS, (char *)(cs)) + +DECLARE_ASN1_DUP_FUNCTION(OCSP_CERTID) + +OSSL_HTTP_REQ_CTX *OCSP_sendreq_new(BIO *io, const char *path, + const OCSP_REQUEST *req, int buf_size); +OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, const char *path, OCSP_REQUEST *req); + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +typedef OSSL_HTTP_REQ_CTX OCSP_REQ_CTX; +#define OCSP_REQ_CTX_new(io, buf_size) \ + OSSL_HTTP_REQ_CTX_new(io, io, buf_size) +#define OCSP_REQ_CTX_free OSSL_HTTP_REQ_CTX_free +#define OCSP_REQ_CTX_http(rctx, op, path) \ + (OSSL_HTTP_REQ_CTX_set_expected(rctx, NULL, 1 /* asn1 */, 0, 0) && OSSL_HTTP_REQ_CTX_set_request_line(rctx, strcmp(op, "POST") == 0, NULL, NULL, path)) +#define OCSP_REQ_CTX_add1_header OSSL_HTTP_REQ_CTX_add1_header +#define OCSP_REQ_CTX_i2d(r, it, req) \ + OSSL_HTTP_REQ_CTX_set1_req(r, "application/ocsp-request", it, req) +#define OCSP_REQ_CTX_set1_req(r, req) \ + OCSP_REQ_CTX_i2d(r, ASN1_ITEM_rptr(OCSP_REQUEST), (ASN1_VALUE *)(req)) +#define OCSP_REQ_CTX_nbio OSSL_HTTP_REQ_CTX_nbio +#define OCSP_REQ_CTX_nbio_d2i OSSL_HTTP_REQ_CTX_nbio_d2i +#define OCSP_sendreq_nbio(p, r) \ + OSSL_HTTP_REQ_CTX_nbio_d2i(r, (ASN1_VALUE **)(p), \ + ASN1_ITEM_rptr(OCSP_RESPONSE)) +#define OCSP_REQ_CTX_get0_mem_bio OSSL_HTTP_REQ_CTX_get0_mem_bio +#define OCSP_set_max_response_length OSSL_HTTP_REQ_CTX_set_max_response_length +#endif + +OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, const X509 *subject, + const X509 *issuer); + +OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, + const X509_NAME *issuerName, + const ASN1_BIT_STRING *issuerKey, + const ASN1_INTEGER *serialNumber); + +OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid); + +int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len); +int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len); +int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs); +int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req); + +int OCSP_request_set1_name(OCSP_REQUEST *req, const X509_NAME *nm); +int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert); + +int OCSP_request_sign(OCSP_REQUEST *req, + X509 *signer, + EVP_PKEY *key, + const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); + +int OCSP_response_status(OCSP_RESPONSE *resp); +OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp); + +const ASN1_OCTET_STRING *OCSP_resp_get0_signature(const OCSP_BASICRESP *bs); +const X509_ALGOR *OCSP_resp_get0_tbs_sigalg(const OCSP_BASICRESP *bs); +const OCSP_RESPDATA *OCSP_resp_get0_respdata(const OCSP_BASICRESP *bs); +int OCSP_resp_get0_signer(OCSP_BASICRESP *bs, X509 **signer, + STACK_OF(X509) *extra_certs); + +int OCSP_resp_count(OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); +const ASN1_GENERALIZEDTIME *OCSP_resp_get0_produced_at(const OCSP_BASICRESP *bs); +const STACK_OF(X509) *OCSP_resp_get0_certs(const OCSP_BASICRESP *bs); +int OCSP_resp_get0_id(const OCSP_BASICRESP *bs, + const ASN1_OCTET_STRING **pid, + const X509_NAME **pname); +int OCSP_resp_get1_id(const OCSP_BASICRESP *bs, + ASN1_OCTET_STRING **pid, + X509_NAME **pname); + +int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); +int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, + int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, + ASN1_GENERALIZEDTIME *nextupd, long sec, long maxsec); + +int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, + X509_STORE *store, unsigned long flags); + +#define OCSP_parse_url(url, host, port, path, ssl) \ + OSSL_HTTP_parse_url(url, ssl, NULL, host, port, NULL, path, NULL, NULL) + +int OCSP_id_issuer_cmp(const OCSP_CERTID *a, const OCSP_CERTID *b); +int OCSP_id_cmp(const OCSP_CERTID *a, const OCSP_CERTID *b); + +int OCSP_request_onereq_count(OCSP_REQUEST *req); +OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i); +OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one); +int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, + ASN1_OCTET_STRING **pikeyHash, + ASN1_INTEGER **pserial, OCSP_CERTID *cid); +int OCSP_request_is_signed(OCSP_REQUEST *req); +OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, + OCSP_CERTID *cid, + int status, int reason, + ASN1_TIME *revtime, + ASN1_TIME *thisupd, + ASN1_TIME *nextupd); +int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert); +int OCSP_basic_sign(OCSP_BASICRESP *brsp, + X509 *signer, EVP_PKEY *key, const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); +int OCSP_basic_sign_ctx(OCSP_BASICRESP *brsp, + X509 *signer, EVP_MD_CTX *ctx, + STACK_OF(X509) *certs, unsigned long flags); +int OCSP_RESPID_set_by_name(OCSP_RESPID *respid, X509 *cert); +int OCSP_RESPID_set_by_key_ex(OCSP_RESPID *respid, X509 *cert, + OSSL_LIB_CTX *libctx, const char *propq); +int OCSP_RESPID_set_by_key(OCSP_RESPID *respid, X509 *cert); +int OCSP_RESPID_match_ex(OCSP_RESPID *respid, X509 *cert, OSSL_LIB_CTX *libctx, + const char *propq); +int OCSP_RESPID_match(OCSP_RESPID *respid, X509 *cert); + +X509_EXTENSION *OCSP_crlID_new(const char *url, long *n, char *tim); + +X509_EXTENSION *OCSP_accept_responses_new(char **oids); + +X509_EXTENSION *OCSP_archive_cutoff_new(char *tim); + +X509_EXTENSION *OCSP_url_svcloc_new(const X509_NAME *issuer, const char **urls); + +int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x); +int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos); +int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, const ASN1_OBJECT *obj, + int lastpos); +int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos); +X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc); +X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc); +void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, + int *idx); +int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc); + +int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x); +int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos); +int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, const ASN1_OBJECT *obj, int lastpos); +int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos); +X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc); +X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc); +void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx); +int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc); + +int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x); +int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos); +int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, const ASN1_OBJECT *obj, + int lastpos); +int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc); +X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc); +void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, + int *idx); +int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc); + +int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x); +int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos); +int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, const ASN1_OBJECT *obj, + int lastpos); +int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc); +X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc); +void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, + int *idx); +int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc); +const OCSP_CERTID *OCSP_SINGLERESP_get0_id(const OCSP_SINGLERESP *x); + +DECLARE_ASN1_FUNCTIONS(OCSP_SINGLERESP) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTSTATUS) +DECLARE_ASN1_FUNCTIONS(OCSP_REVOKEDINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_BASICRESP) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPDATA) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPONSE) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPBYTES) +DECLARE_ASN1_FUNCTIONS(OCSP_ONEREQ) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTID) +DECLARE_ASN1_FUNCTIONS(OCSP_REQUEST) +DECLARE_ASN1_FUNCTIONS(OCSP_SIGNATURE) +DECLARE_ASN1_FUNCTIONS(OCSP_REQINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_CRLID) +DECLARE_ASN1_FUNCTIONS(OCSP_SERVICELOC) + +const char *OCSP_response_status_str(long s); +const char *OCSP_cert_status_str(long s); +const char *OCSP_crl_reason_str(long s); + +int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST *a, unsigned long flags); +int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE *o, unsigned long flags); + +int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, + X509_STORE *st, unsigned long flags); + +#ifdef __cplusplus +} +#endif +#endif /* !defined(OPENSSL_NO_OCSP) */ +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/opensslv.h new file mode 100644 index 000000000000..8e9329bcc0dd --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/opensslv.h @@ -0,0 +1,131 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/opensslv.h.in + * + * Copyright 1999-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_OPENSSLV_H +#define OPENSSL_OPENSSLV_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * SECTION 1: VERSION DATA. These will change for each release + */ + +/* + * Base version macros + * + * These macros express version number MAJOR.MINOR.PATCH exactly + */ +/* clang-format off */ +# define OPENSSL_VERSION_MAJOR 3 +/* clang-format on */ +/* clang-format off */ +# define OPENSSL_VERSION_MINOR 5 +/* clang-format on */ +/* clang-format off */ +# define OPENSSL_VERSION_PATCH 7 +/* clang-format on */ + +/* + * Additional version information + * + * These are also part of the new version scheme, but aren't part + * of the version number itself. + */ + +/* Could be: #define OPENSSL_VERSION_PRE_RELEASE "-alpha.1" */ +/* clang-format off */ +# define OPENSSL_VERSION_PRE_RELEASE "" +/* clang-format on */ +/* Could be: #define OPENSSL_VERSION_BUILD_METADATA "+fips" */ +/* Could be: #define OPENSSL_VERSION_BUILD_METADATA "+vendor.1" */ +/* clang-format off */ +# define OPENSSL_VERSION_BUILD_METADATA "" +/* clang-format on */ + +/* + * Note: The OpenSSL Project will never define OPENSSL_VERSION_BUILD_METADATA + * to be anything but the empty string. Its use is entirely reserved for + * others + */ + +/* + * Shared library version + * + * This is strictly to express ABI version, which may or may not + * be related to the API version expressed with the macros above. + * This is defined in free form. + */ +/* clang-format off */ +# define OPENSSL_SHLIB_VERSION 3 +/* clang-format on */ + +/* + * SECTION 2: USEFUL MACROS + */ + +/* For checking general API compatibility when preprocessing */ +#define OPENSSL_VERSION_PREREQ(maj, min) \ + ((OPENSSL_VERSION_MAJOR << 16) + OPENSSL_VERSION_MINOR >= ((maj) << 16) + (min)) + +/* + * Macros to get the version in easily digested string form, both the short + * "MAJOR.MINOR.PATCH" variant (where MAJOR, MINOR and PATCH are replaced + * with the values from the corresponding OPENSSL_VERSION_ macros) and the + * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and + * OPENSSL_VERSION_BUILD_METADATA_STR appended. + */ +/* clang-format off */ +# define OPENSSL_VERSION_STR "3.5.7" +/* clang-format on */ +/* clang-format off */ +# define OPENSSL_FULL_VERSION_STR "3.5.7" +/* clang-format on */ + +/* + * SECTION 3: ADDITIONAL METADATA + * + * These strings are defined separately to allow them to be parsable. + */ +/* clang-format off */ +# define OPENSSL_RELEASE_DATE "9 Jun 2026" +/* clang-format on */ + +/* + * SECTION 4: BACKWARD COMPATIBILITY + */ + +/* clang-format off */ +# define OPENSSL_VERSION_TEXT "OpenSSL 3.5.7 9 Jun 2026" +/* clang-format on */ + +/* clang-format off */ +/* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PP0L */ +# define OPENSSL_VERSION_NUMBER \ + ( (OPENSSL_VERSION_MAJOR<<28) \ + |(OPENSSL_VERSION_MINOR<<20) \ + |(OPENSSL_VERSION_PATCH<<4) \ + |0x0L ) +/* clang-format on */ + +#ifdef __cplusplus +} +#endif + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_OPENSSLV_H +#endif + +#endif /* OPENSSL_OPENSSLV_H */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/pkcs12.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/pkcs12.h new file mode 100644 index 000000000000..f7e38ace03bc --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/pkcs12.h @@ -0,0 +1,370 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/pkcs12.h.in + * + * Copyright 1999-2024 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_PKCS12_H +#define OPENSSL_PKCS12_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_PKCS12_H +#endif + +#include +#include +#include +#include +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define PKCS12_KEY_ID 1 +#define PKCS12_IV_ID 2 +#define PKCS12_MAC_ID 3 + +/* Default iteration count */ +#ifndef PKCS12_DEFAULT_ITER +#define PKCS12_DEFAULT_ITER PKCS5_DEFAULT_ITER +#endif + +#define PKCS12_MAC_KEY_LENGTH 20 + +/* The macro is expected to be used only internally. Kept for backwards compatibility. */ +#define PKCS12_SALT_LEN 8 + +/* It's not clear if these are actually needed... */ +#define PKCS12_key_gen PKCS12_key_gen_utf8 +#define PKCS12_add_friendlyname PKCS12_add_friendlyname_utf8 + +/* MS key usage constants */ + +#define KEY_EX 0x10 +#define KEY_SIG 0x80 + +typedef struct PKCS12_MAC_DATA_st PKCS12_MAC_DATA; + +typedef struct PKCS12_st PKCS12; + +typedef struct PKCS12_SAFEBAG_st PKCS12_SAFEBAG; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(PKCS12_SAFEBAG, PKCS12_SAFEBAG, PKCS12_SAFEBAG) +#define sk_PKCS12_SAFEBAG_num(sk) OPENSSL_sk_num(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_value(sk, idx) ((PKCS12_SAFEBAG *)OPENSSL_sk_value(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk), (idx))) +#define sk_PKCS12_SAFEBAG_new(cmp) ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_new(ossl_check_PKCS12_SAFEBAG_compfunc_type(cmp))) +#define sk_PKCS12_SAFEBAG_new_null() ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_new_null()) +#define sk_PKCS12_SAFEBAG_new_reserve(cmp, n) ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_new_reserve(ossl_check_PKCS12_SAFEBAG_compfunc_type(cmp), (n))) +#define sk_PKCS12_SAFEBAG_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PKCS12_SAFEBAG_sk_type(sk), (n)) +#define sk_PKCS12_SAFEBAG_free(sk) OPENSSL_sk_free(ossl_check_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_zero(sk) OPENSSL_sk_zero(ossl_check_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_delete(sk, i) ((PKCS12_SAFEBAG *)OPENSSL_sk_delete(ossl_check_PKCS12_SAFEBAG_sk_type(sk), (i))) +#define sk_PKCS12_SAFEBAG_delete_ptr(sk, ptr) ((PKCS12_SAFEBAG *)OPENSSL_sk_delete_ptr(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr))) +#define sk_PKCS12_SAFEBAG_push(sk, ptr) OPENSSL_sk_push(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr)) +#define sk_PKCS12_SAFEBAG_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr)) +#define sk_PKCS12_SAFEBAG_pop(sk) ((PKCS12_SAFEBAG *)OPENSSL_sk_pop(ossl_check_PKCS12_SAFEBAG_sk_type(sk))) +#define sk_PKCS12_SAFEBAG_shift(sk) ((PKCS12_SAFEBAG *)OPENSSL_sk_shift(ossl_check_PKCS12_SAFEBAG_sk_type(sk))) +#define sk_PKCS12_SAFEBAG_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PKCS12_SAFEBAG_sk_type(sk),ossl_check_PKCS12_SAFEBAG_freefunc_type(freefunc)) +#define sk_PKCS12_SAFEBAG_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr), (idx)) +#define sk_PKCS12_SAFEBAG_set(sk, idx, ptr) ((PKCS12_SAFEBAG *)OPENSSL_sk_set(ossl_check_PKCS12_SAFEBAG_sk_type(sk), (idx), ossl_check_PKCS12_SAFEBAG_type(ptr))) +#define sk_PKCS12_SAFEBAG_find(sk, ptr) OPENSSL_sk_find(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr)) +#define sk_PKCS12_SAFEBAG_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr)) +#define sk_PKCS12_SAFEBAG_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr), pnum) +#define sk_PKCS12_SAFEBAG_sort(sk) OPENSSL_sk_sort(ossl_check_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_dup(sk) ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_dup(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk))) +#define sk_PKCS12_SAFEBAG_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_deep_copy(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_copyfunc_type(copyfunc), ossl_check_PKCS12_SAFEBAG_freefunc_type(freefunc))) +#define sk_PKCS12_SAFEBAG_set_cmp_func(sk, cmp) ((sk_PKCS12_SAFEBAG_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct pkcs12_bag_st PKCS12_BAGS; + +#define PKCS12_ERROR 0 +#define PKCS12_OK 1 + +/* Compatibility macros */ + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 + +#define M_PKCS12_bag_type PKCS12_bag_type +#define M_PKCS12_cert_bag_type PKCS12_cert_bag_type +#define M_PKCS12_crl_bag_type PKCS12_cert_bag_type + +#define PKCS12_certbag2x509 PKCS12_SAFEBAG_get1_cert +#define PKCS12_certbag2scrl PKCS12_SAFEBAG_get1_crl +#define PKCS12_bag_type PKCS12_SAFEBAG_get_nid +#define PKCS12_cert_bag_type PKCS12_SAFEBAG_get_bag_nid +#define PKCS12_x5092certbag PKCS12_SAFEBAG_create_cert +#define PKCS12_x509crl2certbag PKCS12_SAFEBAG_create_crl +#define PKCS12_MAKE_KEYBAG PKCS12_SAFEBAG_create0_p8inf +#define PKCS12_MAKE_SHKEYBAG PKCS12_SAFEBAG_create_pkcs8_encrypt + +#endif +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 ASN1_TYPE *PKCS12_get_attr(const PKCS12_SAFEBAG *bag, + int attr_nid); +#endif + +ASN1_TYPE *PKCS8_get_attr(PKCS8_PRIV_KEY_INFO *p8, int attr_nid); +int PKCS12_mac_present(const PKCS12 *p12); +void PKCS12_get0_mac(const ASN1_OCTET_STRING **pmac, + const X509_ALGOR **pmacalg, + const ASN1_OCTET_STRING **psalt, + const ASN1_INTEGER **piter, + const PKCS12 *p12); + +const ASN1_TYPE *PKCS12_SAFEBAG_get0_attr(const PKCS12_SAFEBAG *bag, + int attr_nid); +const ASN1_OBJECT *PKCS12_SAFEBAG_get0_type(const PKCS12_SAFEBAG *bag); +int PKCS12_SAFEBAG_get_nid(const PKCS12_SAFEBAG *bag); +int PKCS12_SAFEBAG_get_bag_nid(const PKCS12_SAFEBAG *bag); +const ASN1_TYPE *PKCS12_SAFEBAG_get0_bag_obj(const PKCS12_SAFEBAG *bag); +const ASN1_OBJECT *PKCS12_SAFEBAG_get0_bag_type(const PKCS12_SAFEBAG *bag); + +X509 *PKCS12_SAFEBAG_get1_cert_ex(const PKCS12_SAFEBAG *bag, OSSL_LIB_CTX *libctx, const char *propq); +X509 *PKCS12_SAFEBAG_get1_cert(const PKCS12_SAFEBAG *bag); +X509_CRL *PKCS12_SAFEBAG_get1_crl_ex(const PKCS12_SAFEBAG *bag, OSSL_LIB_CTX *libctx, const char *propq); +X509_CRL *PKCS12_SAFEBAG_get1_crl(const PKCS12_SAFEBAG *bag); +const STACK_OF(PKCS12_SAFEBAG) * +PKCS12_SAFEBAG_get0_safes(const PKCS12_SAFEBAG *bag); +const PKCS8_PRIV_KEY_INFO *PKCS12_SAFEBAG_get0_p8inf(const PKCS12_SAFEBAG *bag); +const X509_SIG *PKCS12_SAFEBAG_get0_pkcs8(const PKCS12_SAFEBAG *bag); + +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_cert(X509 *x509); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_crl(X509_CRL *crl); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_secret(int type, int vtype, const unsigned char *value, int len); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_p8inf(PKCS8_PRIV_KEY_INFO *p8); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_pkcs8(X509_SIG *p8); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_pkcs8_encrypt(int pbe_nid, + const char *pass, + int passlen, + unsigned char *salt, + int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8inf); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_pkcs8_encrypt_ex(int pbe_nid, + const char *pass, + int passlen, + unsigned char *salt, + int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8inf, + OSSL_LIB_CTX *ctx, + const char *propq); + +PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, + int nid1, int nid2); +PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(const X509_SIG *p8, const char *pass, + int passlen); +PKCS8_PRIV_KEY_INFO *PKCS8_decrypt_ex(const X509_SIG *p8, const char *pass, + int passlen, OSSL_LIB_CTX *ctx, + const char *propq); +PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(const PKCS12_SAFEBAG *bag, + const char *pass, int passlen); +PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey_ex(const PKCS12_SAFEBAG *bag, + const char *pass, int passlen, + OSSL_LIB_CTX *ctx, + const char *propq); +X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, + const char *pass, int passlen, unsigned char *salt, + int saltlen, int iter, PKCS8_PRIV_KEY_INFO *p8); +X509_SIG *PKCS8_encrypt_ex(int pbe_nid, const EVP_CIPHER *cipher, + const char *pass, int passlen, unsigned char *salt, + int saltlen, int iter, PKCS8_PRIV_KEY_INFO *p8, + OSSL_LIB_CTX *ctx, const char *propq); +X509_SIG *PKCS8_set0_pbe(const char *pass, int passlen, + PKCS8_PRIV_KEY_INFO *p8inf, X509_ALGOR *pbe); +X509_SIG *PKCS8_set0_pbe_ex(const char *pass, int passlen, + PKCS8_PRIV_KEY_INFO *p8inf, X509_ALGOR *pbe, + OSSL_LIB_CTX *ctx, const char *propq); +PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7); +PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + STACK_OF(PKCS12_SAFEBAG) *bags); +PKCS7 *PKCS12_pack_p7encdata_ex(int pbe_nid, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + STACK_OF(PKCS12_SAFEBAG) *bags, + OSSL_LIB_CTX *ctx, const char *propq); + +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, + int passlen); + +int PKCS12_pack_authsafes(PKCS12 *p12, STACK_OF(PKCS7) *safes); +STACK_OF(PKCS7) *PKCS12_unpack_authsafes(const PKCS12 *p12); + +int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, + int namelen); +int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_friendlyname_utf8(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag, + const unsigned char *name, int namelen); +int PKCS12_add1_attr_by_NID(PKCS12_SAFEBAG *bag, int nid, int type, + const unsigned char *bytes, int len); +int PKCS12_add1_attr_by_txt(PKCS12_SAFEBAG *bag, const char *attrname, int type, + const unsigned char *bytes, int len); +int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage); +ASN1_TYPE *PKCS12_get_attr_gen(const STACK_OF(X509_ATTRIBUTE) *attrs, + int attr_nid); +char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag); +const STACK_OF(X509_ATTRIBUTE) * +PKCS12_SAFEBAG_get0_attrs(const PKCS12_SAFEBAG *bag); +void PKCS12_SAFEBAG_set0_attrs(PKCS12_SAFEBAG *bag, STACK_OF(X509_ATTRIBUTE) *attrs); +unsigned char *PKCS12_pbe_crypt(const X509_ALGOR *algor, + const char *pass, int passlen, + const unsigned char *in, int inlen, + unsigned char **data, int *datalen, + int en_de); +unsigned char *PKCS12_pbe_crypt_ex(const X509_ALGOR *algor, + const char *pass, int passlen, + const unsigned char *in, int inlen, + unsigned char **data, int *datalen, + int en_de, OSSL_LIB_CTX *libctx, + const char *propq); +void *PKCS12_item_decrypt_d2i(const X509_ALGOR *algor, const ASN1_ITEM *it, + const char *pass, int passlen, + const ASN1_OCTET_STRING *oct, int zbuf); +void *PKCS12_item_decrypt_d2i_ex(const X509_ALGOR *algor, const ASN1_ITEM *it, + const char *pass, int passlen, + const ASN1_OCTET_STRING *oct, int zbuf, + OSSL_LIB_CTX *libctx, + const char *propq); +ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt(X509_ALGOR *algor, + const ASN1_ITEM *it, + const char *pass, int passlen, + void *obj, int zbuf); +ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt_ex(X509_ALGOR *algor, + const ASN1_ITEM *it, + const char *pass, int passlen, + void *obj, int zbuf, + OSSL_LIB_CTX *ctx, + const char *propq); +PKCS12 *PKCS12_init(int mode); +PKCS12 *PKCS12_init_ex(int mode, OSSL_LIB_CTX *ctx, const char *propq); + +int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_key_gen_asc_ex(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type, + OSSL_LIB_CTX *ctx, const char *propq); +int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_key_gen_uni_ex(unsigned char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type, + OSSL_LIB_CTX *ctx, const char *propq); +int PKCS12_key_gen_utf8(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_key_gen_utf8_ex(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type, + OSSL_LIB_CTX *ctx, const char *propq); + +int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md_type, int en_de); +int PKCS12_PBE_keyivgen_ex(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md_type, int en_de, + OSSL_LIB_CTX *libctx, const char *propq); +int PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *mac, unsigned int *maclen); +int PKCS12_verify_mac(PKCS12 *p12, const char *pass, int passlen); +int PKCS12_set_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + const EVP_MD *md_type); +int PKCS12_set_pbmac1_pbkdf2(PKCS12 *p12, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + const EVP_MD *md_type, const char *prf_md_name); +int PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt, + int saltlen, const EVP_MD *md_type); +unsigned char *OPENSSL_asc2uni(const char *asc, int asclen, + unsigned char **uni, int *unilen); +char *OPENSSL_uni2asc(const unsigned char *uni, int unilen); +unsigned char *OPENSSL_utf82uni(const char *asc, int asclen, + unsigned char **uni, int *unilen); +char *OPENSSL_uni2utf8(const unsigned char *uni, int unilen); + +DECLARE_ASN1_FUNCTIONS(PKCS12) +DECLARE_ASN1_FUNCTIONS(PKCS12_MAC_DATA) +DECLARE_ASN1_FUNCTIONS(PKCS12_SAFEBAG) +DECLARE_ASN1_FUNCTIONS(PKCS12_BAGS) + +DECLARE_ASN1_ITEM(PKCS12_SAFEBAGS) +DECLARE_ASN1_ITEM(PKCS12_AUTHSAFES) + +void PKCS12_PBE_add(void); +int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, + STACK_OF(X509) **ca); +typedef int PKCS12_create_cb(PKCS12_SAFEBAG *bag, void *cbarg); +PKCS12 *PKCS12_create(const char *pass, const char *name, EVP_PKEY *pkey, + X509 *cert, STACK_OF(X509) *ca, int nid_key, int nid_cert, + int iter, int mac_iter, int keytype); +PKCS12 *PKCS12_create_ex(const char *pass, const char *name, EVP_PKEY *pkey, + X509 *cert, STACK_OF(X509) *ca, int nid_key, int nid_cert, + int iter, int mac_iter, int keytype, + OSSL_LIB_CTX *ctx, const char *propq); +PKCS12 *PKCS12_create_ex2(const char *pass, const char *name, EVP_PKEY *pkey, + X509 *cert, STACK_OF(X509) *ca, int nid_key, int nid_cert, + int iter, int mac_iter, int keytype, + OSSL_LIB_CTX *ctx, const char *propq, + PKCS12_create_cb *cb, void *cbarg); + +PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert); +PKCS12_SAFEBAG *PKCS12_add_key(STACK_OF(PKCS12_SAFEBAG) **pbags, + EVP_PKEY *key, int key_usage, int iter, + int key_nid, const char *pass); +PKCS12_SAFEBAG *PKCS12_add_key_ex(STACK_OF(PKCS12_SAFEBAG) **pbags, + EVP_PKEY *key, int key_usage, int iter, + int key_nid, const char *pass, + OSSL_LIB_CTX *ctx, const char *propq); + +PKCS12_SAFEBAG *PKCS12_add_secret(STACK_OF(PKCS12_SAFEBAG) **pbags, + int nid_type, const unsigned char *value, int len); +int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags, + int safe_nid, int iter, const char *pass); +int PKCS12_add_safe_ex(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags, + int safe_nid, int iter, const char *pass, + OSSL_LIB_CTX *ctx, const char *propq); + +PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int p7_nid); +PKCS12 *PKCS12_add_safes_ex(STACK_OF(PKCS7) *safes, int p7_nid, + OSSL_LIB_CTX *ctx, const char *propq); + +int i2d_PKCS12_bio(BIO *bp, const PKCS12 *p12); +#ifndef OPENSSL_NO_STDIO +int i2d_PKCS12_fp(FILE *fp, const PKCS12 *p12); +#endif +PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12); +#ifndef OPENSSL_NO_STDIO +PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12); +#endif +int PKCS12_newpass(PKCS12 *p12, const char *oldpass, const char *newpass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/pkcs7.h new file mode 100644 index 000000000000..b6ab21e8b423 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/pkcs7.h @@ -0,0 +1,435 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/pkcs7.h.in + * + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_PKCS7_H +#define OPENSSL_PKCS7_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_PKCS7_H +#endif + +#include +#include +#include + +#include +#include +#include +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/*- +Encryption_ID DES-CBC +Digest_ID MD5 +Digest_Encryption_ID rsaEncryption +Key_Encryption_ID rsaEncryption +*/ + +typedef struct PKCS7_CTX_st { + OSSL_LIB_CTX *libctx; + char *propq; +} PKCS7_CTX; + +typedef struct pkcs7_issuer_and_serial_st { + X509_NAME *issuer; + ASN1_INTEGER *serial; +} PKCS7_ISSUER_AND_SERIAL; + +typedef struct pkcs7_signer_info_st { + ASN1_INTEGER *version; /* version 1 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *digest_alg; + STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */ + X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */ + ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */ + STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */ + /* The private key to sign with */ + EVP_PKEY *pkey; + const PKCS7_CTX *ctx; +} PKCS7_SIGNER_INFO; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(PKCS7_SIGNER_INFO, PKCS7_SIGNER_INFO, PKCS7_SIGNER_INFO) +#define sk_PKCS7_SIGNER_INFO_num(sk) OPENSSL_sk_num(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_value(sk, idx) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_value(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk), (idx))) +#define sk_PKCS7_SIGNER_INFO_new(cmp) ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_new(ossl_check_PKCS7_SIGNER_INFO_compfunc_type(cmp))) +#define sk_PKCS7_SIGNER_INFO_new_null() ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_new_null()) +#define sk_PKCS7_SIGNER_INFO_new_reserve(cmp, n) ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_new_reserve(ossl_check_PKCS7_SIGNER_INFO_compfunc_type(cmp), (n))) +#define sk_PKCS7_SIGNER_INFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), (n)) +#define sk_PKCS7_SIGNER_INFO_free(sk) OPENSSL_sk_free(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_zero(sk) OPENSSL_sk_zero(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_delete(sk, i) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_delete(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), (i))) +#define sk_PKCS7_SIGNER_INFO_delete_ptr(sk, ptr) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_delete_ptr(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr))) +#define sk_PKCS7_SIGNER_INFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr)) +#define sk_PKCS7_SIGNER_INFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr)) +#define sk_PKCS7_SIGNER_INFO_pop(sk) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_pop(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk))) +#define sk_PKCS7_SIGNER_INFO_shift(sk) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_shift(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk))) +#define sk_PKCS7_SIGNER_INFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk),ossl_check_PKCS7_SIGNER_INFO_freefunc_type(freefunc)) +#define sk_PKCS7_SIGNER_INFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr), (idx)) +#define sk_PKCS7_SIGNER_INFO_set(sk, idx, ptr) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_set(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), (idx), ossl_check_PKCS7_SIGNER_INFO_type(ptr))) +#define sk_PKCS7_SIGNER_INFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr)) +#define sk_PKCS7_SIGNER_INFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr)) +#define sk_PKCS7_SIGNER_INFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr), pnum) +#define sk_PKCS7_SIGNER_INFO_sort(sk) OPENSSL_sk_sort(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_dup(sk) ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_dup(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk))) +#define sk_PKCS7_SIGNER_INFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_deep_copy(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_copyfunc_type(copyfunc), ossl_check_PKCS7_SIGNER_INFO_freefunc_type(freefunc))) +#define sk_PKCS7_SIGNER_INFO_set_cmp_func(sk, cmp) ((sk_PKCS7_SIGNER_INFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct pkcs7_recip_info_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *key_enc_algor; + ASN1_OCTET_STRING *enc_key; + X509 *cert; /* get the pub-key from this */ + const PKCS7_CTX *ctx; +} PKCS7_RECIP_INFO; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(PKCS7_RECIP_INFO, PKCS7_RECIP_INFO, PKCS7_RECIP_INFO) +#define sk_PKCS7_RECIP_INFO_num(sk) OPENSSL_sk_num(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_value(sk, idx) ((PKCS7_RECIP_INFO *)OPENSSL_sk_value(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk), (idx))) +#define sk_PKCS7_RECIP_INFO_new(cmp) ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_new(ossl_check_PKCS7_RECIP_INFO_compfunc_type(cmp))) +#define sk_PKCS7_RECIP_INFO_new_null() ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_new_null()) +#define sk_PKCS7_RECIP_INFO_new_reserve(cmp, n) ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_new_reserve(ossl_check_PKCS7_RECIP_INFO_compfunc_type(cmp), (n))) +#define sk_PKCS7_RECIP_INFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), (n)) +#define sk_PKCS7_RECIP_INFO_free(sk) OPENSSL_sk_free(ossl_check_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_zero(sk) OPENSSL_sk_zero(ossl_check_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_delete(sk, i) ((PKCS7_RECIP_INFO *)OPENSSL_sk_delete(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), (i))) +#define sk_PKCS7_RECIP_INFO_delete_ptr(sk, ptr) ((PKCS7_RECIP_INFO *)OPENSSL_sk_delete_ptr(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr))) +#define sk_PKCS7_RECIP_INFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr)) +#define sk_PKCS7_RECIP_INFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr)) +#define sk_PKCS7_RECIP_INFO_pop(sk) ((PKCS7_RECIP_INFO *)OPENSSL_sk_pop(ossl_check_PKCS7_RECIP_INFO_sk_type(sk))) +#define sk_PKCS7_RECIP_INFO_shift(sk) ((PKCS7_RECIP_INFO *)OPENSSL_sk_shift(ossl_check_PKCS7_RECIP_INFO_sk_type(sk))) +#define sk_PKCS7_RECIP_INFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PKCS7_RECIP_INFO_sk_type(sk),ossl_check_PKCS7_RECIP_INFO_freefunc_type(freefunc)) +#define sk_PKCS7_RECIP_INFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr), (idx)) +#define sk_PKCS7_RECIP_INFO_set(sk, idx, ptr) ((PKCS7_RECIP_INFO *)OPENSSL_sk_set(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), (idx), ossl_check_PKCS7_RECIP_INFO_type(ptr))) +#define sk_PKCS7_RECIP_INFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr)) +#define sk_PKCS7_RECIP_INFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr)) +#define sk_PKCS7_RECIP_INFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr), pnum) +#define sk_PKCS7_RECIP_INFO_sort(sk) OPENSSL_sk_sort(ossl_check_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_dup(sk) ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_dup(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk))) +#define sk_PKCS7_RECIP_INFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_deep_copy(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_copyfunc_type(copyfunc), ossl_check_PKCS7_RECIP_INFO_freefunc_type(freefunc))) +#define sk_PKCS7_RECIP_INFO_set_cmp_func(sk, cmp) ((sk_PKCS7_RECIP_INFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct pkcs7_signed_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ /* name should be 'certificates' */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ /* name should be 'crls' */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + struct pkcs7_st *contents; +} PKCS7_SIGNED; +/* + * The above structure is very very similar to PKCS7_SIGN_ENVELOPE. How about + * merging the two + */ + +typedef struct pkcs7_enc_content_st { + ASN1_OBJECT *content_type; + X509_ALGOR *algorithm; + ASN1_OCTET_STRING *enc_data; /* [ 0 ] */ + const EVP_CIPHER *cipher; + const PKCS7_CTX *ctx; +} PKCS7_ENC_CONTENT; + +typedef struct pkcs7_enveloped_st { + ASN1_INTEGER *version; /* version 0 */ + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENVELOPE; + +typedef struct pkcs7_signedandenveloped_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ /* name should be 'certificates' */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ /* name should be 'crls' */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + PKCS7_ENC_CONTENT *enc_data; + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; +} PKCS7_SIGN_ENVELOPE; + +typedef struct pkcs7_digest_st { + ASN1_INTEGER *version; /* version 0 */ + X509_ALGOR *md; /* md used */ + struct pkcs7_st *contents; + ASN1_OCTET_STRING *digest; +} PKCS7_DIGEST; + +typedef struct pkcs7_encrypted_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENCRYPT; + +typedef struct pkcs7_st { + /* + * The following is non NULL if it contains ASN1 encoding of this + * structure + */ + unsigned char *asn1; + long length; +#define PKCS7_S_HEADER 0 +#define PKCS7_S_BODY 1 +#define PKCS7_S_TAIL 2 + int state; /* used during processing */ + int detached; + ASN1_OBJECT *type; + /* content as defined by the type */ + /* + * all encryption/message digests are applied to the 'contents', leaving + * out the 'type' field. + */ + union { + char *ptr; + /* NID_pkcs7_data */ + ASN1_OCTET_STRING *data; + /* NID_pkcs7_signed */ + PKCS7_SIGNED *sign; /* field name 'signed' would clash with C keyword */ + /* NID_pkcs7_enveloped */ + PKCS7_ENVELOPE *enveloped; + /* NID_pkcs7_signedAndEnveloped */ + PKCS7_SIGN_ENVELOPE *signed_and_enveloped; + /* NID_pkcs7_digest */ + PKCS7_DIGEST *digest; + /* NID_pkcs7_encrypted */ + PKCS7_ENCRYPT *encrypted; + /* Anything else */ + ASN1_TYPE *other; + } d; + PKCS7_CTX ctx; +} PKCS7; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(PKCS7, PKCS7, PKCS7) +#define sk_PKCS7_num(sk) OPENSSL_sk_num(ossl_check_const_PKCS7_sk_type(sk)) +#define sk_PKCS7_value(sk, idx) ((PKCS7 *)OPENSSL_sk_value(ossl_check_const_PKCS7_sk_type(sk), (idx))) +#define sk_PKCS7_new(cmp) ((STACK_OF(PKCS7) *)OPENSSL_sk_new(ossl_check_PKCS7_compfunc_type(cmp))) +#define sk_PKCS7_new_null() ((STACK_OF(PKCS7) *)OPENSSL_sk_new_null()) +#define sk_PKCS7_new_reserve(cmp, n) ((STACK_OF(PKCS7) *)OPENSSL_sk_new_reserve(ossl_check_PKCS7_compfunc_type(cmp), (n))) +#define sk_PKCS7_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PKCS7_sk_type(sk), (n)) +#define sk_PKCS7_free(sk) OPENSSL_sk_free(ossl_check_PKCS7_sk_type(sk)) +#define sk_PKCS7_zero(sk) OPENSSL_sk_zero(ossl_check_PKCS7_sk_type(sk)) +#define sk_PKCS7_delete(sk, i) ((PKCS7 *)OPENSSL_sk_delete(ossl_check_PKCS7_sk_type(sk), (i))) +#define sk_PKCS7_delete_ptr(sk, ptr) ((PKCS7 *)OPENSSL_sk_delete_ptr(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr))) +#define sk_PKCS7_push(sk, ptr) OPENSSL_sk_push(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr)) +#define sk_PKCS7_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr)) +#define sk_PKCS7_pop(sk) ((PKCS7 *)OPENSSL_sk_pop(ossl_check_PKCS7_sk_type(sk))) +#define sk_PKCS7_shift(sk) ((PKCS7 *)OPENSSL_sk_shift(ossl_check_PKCS7_sk_type(sk))) +#define sk_PKCS7_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PKCS7_sk_type(sk),ossl_check_PKCS7_freefunc_type(freefunc)) +#define sk_PKCS7_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr), (idx)) +#define sk_PKCS7_set(sk, idx, ptr) ((PKCS7 *)OPENSSL_sk_set(ossl_check_PKCS7_sk_type(sk), (idx), ossl_check_PKCS7_type(ptr))) +#define sk_PKCS7_find(sk, ptr) OPENSSL_sk_find(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr)) +#define sk_PKCS7_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr)) +#define sk_PKCS7_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr), pnum) +#define sk_PKCS7_sort(sk) OPENSSL_sk_sort(ossl_check_PKCS7_sk_type(sk)) +#define sk_PKCS7_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PKCS7_sk_type(sk)) +#define sk_PKCS7_dup(sk) ((STACK_OF(PKCS7) *)OPENSSL_sk_dup(ossl_check_const_PKCS7_sk_type(sk))) +#define sk_PKCS7_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PKCS7) *)OPENSSL_sk_deep_copy(ossl_check_const_PKCS7_sk_type(sk), ossl_check_PKCS7_copyfunc_type(copyfunc), ossl_check_PKCS7_freefunc_type(freefunc))) +#define sk_PKCS7_set_cmp_func(sk, cmp) ((sk_PKCS7_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_compfunc_type(cmp))) + +/* clang-format on */ + +#define PKCS7_OP_SET_DETACHED_SIGNATURE 1 +#define PKCS7_OP_GET_DETACHED_SIGNATURE 2 + +#define PKCS7_get_signed_attributes(si) ((si)->auth_attr) +#define PKCS7_get_attributes(si) ((si)->unauth_attr) + +#define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed) +#define PKCS7_type_is_encrypted(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) +#define PKCS7_type_is_enveloped(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_enveloped) +#define PKCS7_type_is_signedAndEnveloped(a) \ + (OBJ_obj2nid((a)->type) == NID_pkcs7_signedAndEnveloped) +#define PKCS7_type_is_data(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_data) +#define PKCS7_type_is_digest(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_digest) + +#define PKCS7_set_detached(p, v) \ + PKCS7_ctrl(p, PKCS7_OP_SET_DETACHED_SIGNATURE, v, NULL) +#define PKCS7_get_detached(p) \ + PKCS7_ctrl(p, PKCS7_OP_GET_DETACHED_SIGNATURE, 0, NULL) + +#define PKCS7_is_detached(p7) (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7)) + +/* S/MIME related flags */ + +#define PKCS7_TEXT 0x1 +#define PKCS7_NOCERTS 0x2 +#define PKCS7_NOSIGS 0x4 +#define PKCS7_NOCHAIN 0x8 +#define PKCS7_NOINTERN 0x10 +#define PKCS7_NOVERIFY 0x20 +#define PKCS7_DETACHED 0x40 +#define PKCS7_BINARY 0x80 +#define PKCS7_NOATTR 0x100 +#define PKCS7_NOSMIMECAP 0x200 +#define PKCS7_NOOLDMIMETYPE 0x400 +#define PKCS7_CRLFEOL 0x800 +#define PKCS7_STREAM 0x1000 +#define PKCS7_NOCRL 0x2000 +#define PKCS7_PARTIAL 0x4000 +#define PKCS7_REUSE_DIGEST 0x8000 +#define PKCS7_NO_DUAL_CONTENT 0x10000 + +/* Flags: for compatibility with older code */ + +#define SMIME_TEXT PKCS7_TEXT +#define SMIME_NOCERTS PKCS7_NOCERTS +#define SMIME_NOSIGS PKCS7_NOSIGS +#define SMIME_NOCHAIN PKCS7_NOCHAIN +#define SMIME_NOINTERN PKCS7_NOINTERN +#define SMIME_NOVERIFY PKCS7_NOVERIFY +#define SMIME_DETACHED PKCS7_DETACHED +#define SMIME_BINARY PKCS7_BINARY +#define SMIME_NOATTR PKCS7_NOATTR + +/* CRLF ASCII canonicalisation */ +#define SMIME_ASCIICRLF 0x80000 + +DECLARE_ASN1_FUNCTIONS(PKCS7_ISSUER_AND_SERIAL) + +int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data, + const EVP_MD *type, unsigned char *md, + unsigned int *len); +#ifndef OPENSSL_NO_STDIO +PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7); +int i2d_PKCS7_fp(FILE *fp, const PKCS7 *p7); +#endif +DECLARE_ASN1_DUP_FUNCTION(PKCS7) +PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7); +int i2d_PKCS7_bio(BIO *bp, const PKCS7 *p7); +int i2d_PKCS7_bio_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); +int PEM_write_bio_PKCS7_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); + +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNER_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_RECIP_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNED) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENC_CONTENT) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGN_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_DIGEST) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENCRYPT) +DECLARE_ASN1_FUNCTIONS(PKCS7) +PKCS7 *PKCS7_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +DECLARE_ASN1_ITEM(PKCS7_ATTR_SIGN) +DECLARE_ASN1_ITEM(PKCS7_ATTR_VERIFY) + +DECLARE_ASN1_NDEF_FUNCTION(PKCS7) +DECLARE_ASN1_PRINT_FUNCTION(PKCS7) + +long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg); + +int PKCS7_type_is_other(PKCS7 *p7); +int PKCS7_set_type(PKCS7 *p7, int type); +int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other); +int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data); +int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, + const EVP_MD *dgst); +int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_INFO *si); +int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i); +int PKCS7_add_certificate(PKCS7 *p7, X509 *cert); +int PKCS7_add_crl(PKCS7 *p7, X509_CRL *crl); +int PKCS7_content_new(PKCS7 *p7, int nid); +int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, + BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si, + X509 *signer); + +BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio); +int PKCS7_dataFinal(PKCS7 *p7, BIO *bio); +BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert); + +PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, + EVP_PKEY *pkey, const EVP_MD *dgst); +X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md); +STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7); + +PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509); +void PKCS7_SIGNER_INFO_get0_algs(PKCS7_SIGNER_INFO *si, EVP_PKEY **pk, + X509_ALGOR **pdig, X509_ALGOR **psig); +void PKCS7_RECIP_INFO_get0_alg(PKCS7_RECIP_INFO *ri, X509_ALGOR **penc); +int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri); +int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509); +int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher); +int PKCS7_stream(unsigned char ***boundary, PKCS7 *p7); + +PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx); +ASN1_OCTET_STRING *PKCS7_get_octet_string(PKCS7 *p7); +ASN1_OCTET_STRING *PKCS7_digest_from_attributes(STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int type, + void *data); +int PKCS7_add_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int atrtype, + void *value); +ASN1_TYPE *PKCS7_get_attribute(const PKCS7_SIGNER_INFO *si, int nid); +ASN1_TYPE *PKCS7_get_signed_attribute(const PKCS7_SIGNER_INFO *si, int nid); +int PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); + +PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, + BIO *data, int flags); +PKCS7 *PKCS7_sign_ex(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, + BIO *data, int flags, OSSL_LIB_CTX *libctx, + const char *propq); + +PKCS7_SIGNER_INFO *PKCS7_sign_add_signer(PKCS7 *p7, + X509 *signcert, EVP_PKEY *pkey, + const EVP_MD *md, int flags); + +int PKCS7_final(PKCS7 *p7, BIO *data, int flags); +int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, + BIO *indata, BIO *out, int flags); +STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, + int flags); +PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, + int flags); +PKCS7 *PKCS7_encrypt_ex(STACK_OF(X509) *certs, BIO *in, + const EVP_CIPHER *cipher, int flags, + OSSL_LIB_CTX *libctx, const char *propq); +int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, + int flags); + +int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, + STACK_OF(X509_ALGOR) *cap); +STACK_OF(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO *si); +int PKCS7_simple_smimecap(STACK_OF(X509_ALGOR) *sk, int nid, int arg); + +int PKCS7_add_attrib_content_type(PKCS7_SIGNER_INFO *si, ASN1_OBJECT *coid); +int PKCS7_add0_attrib_signing_time(PKCS7_SIGNER_INFO *si, ASN1_TIME *t); +int PKCS7_add1_attrib_digest(PKCS7_SIGNER_INFO *si, + const unsigned char *md, int mdlen); + +int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags); +PKCS7 *SMIME_read_PKCS7_ex(BIO *bio, BIO **bcont, PKCS7 **p7); +PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont); + +BIO *BIO_new_PKCS7(BIO *out, PKCS7 *p7); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/safestack.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/safestack.h new file mode 100644 index 000000000000..084f610b5bf7 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/safestack.h @@ -0,0 +1,303 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/safestack.h.in + * + * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_SAFESTACK_H +#define OPENSSL_SAFESTACK_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_SAFESTACK_H +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define STACK_OF(type) struct stack_st_##type + +/* Helper macro for internal use */ +#define SKM_DEFINE_STACK_OF_INTERNAL(t1, t2, t3) \ + STACK_OF(t1); \ + typedef int (*sk_##t1##_compfunc)(const t3 *const *a, const t3 *const *b); \ + typedef void (*sk_##t1##_freefunc)(t3 * a); \ + typedef t3 *(*sk_##t1##_copyfunc)(const t3 *a); \ + static ossl_unused ossl_inline t2 *ossl_check_##t1##_type(t2 *ptr) \ + { \ + return ptr; \ + } \ + static ossl_unused ossl_inline const OPENSSL_STACK *ossl_check_const_##t1##_sk_type(const STACK_OF(t1) *sk) \ + { \ + return (const OPENSSL_STACK *)sk; \ + } \ + static ossl_unused ossl_inline OPENSSL_STACK *ossl_check_##t1##_sk_type(STACK_OF(t1) *sk) \ + { \ + return (OPENSSL_STACK *)sk; \ + } \ + static ossl_unused ossl_inline OPENSSL_sk_compfunc ossl_check_##t1##_compfunc_type(sk_##t1##_compfunc cmp) \ + { \ + return (OPENSSL_sk_compfunc)cmp; \ + } \ + static ossl_unused ossl_inline OPENSSL_sk_copyfunc ossl_check_##t1##_copyfunc_type(sk_##t1##_copyfunc cpy) \ + { \ + return (OPENSSL_sk_copyfunc)cpy; \ + } \ + static ossl_unused ossl_inline OPENSSL_sk_freefunc ossl_check_##t1##_freefunc_type(sk_##t1##_freefunc fr) \ + { \ + return (OPENSSL_sk_freefunc)fr; \ + } + +#define SKM_DEFINE_STACK_OF(t1, t2, t3) \ + STACK_OF(t1); \ + typedef int (*sk_##t1##_compfunc)(const t3 *const *a, const t3 *const *b); \ + typedef void (*sk_##t1##_freefunc)(t3 * a); \ + typedef t3 *(*sk_##t1##_copyfunc)(const t3 *a); \ + static ossl_unused ossl_inline int sk_##t1##_num(const STACK_OF(t1) *sk) \ + { \ + return OPENSSL_sk_num((const OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_value(const STACK_OF(t1) *sk, int idx) \ + { \ + return (t2 *)OPENSSL_sk_value((const OPENSSL_STACK *)sk, idx); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new(sk_##t1##_compfunc compare) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_new((OPENSSL_sk_compfunc)compare); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new_null(void) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_new_null(); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new_reserve(sk_##t1##_compfunc compare, int n) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_new_reserve((OPENSSL_sk_compfunc)compare, n); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_reserve(STACK_OF(t1) *sk, int n) \ + { \ + return OPENSSL_sk_reserve((OPENSSL_STACK *)sk, n); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_free(STACK_OF(t1) *sk) \ + { \ + OPENSSL_sk_free((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_zero(STACK_OF(t1) *sk) \ + { \ + OPENSSL_sk_zero((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_delete(STACK_OF(t1) *sk, int i) \ + { \ + return (t2 *)OPENSSL_sk_delete((OPENSSL_STACK *)sk, i); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_delete_ptr(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return (t2 *)OPENSSL_sk_delete_ptr((OPENSSL_STACK *)sk, \ + (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_push(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_push((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_unshift(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_unshift((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_pop(STACK_OF(t1) *sk) \ + { \ + return (t2 *)OPENSSL_sk_pop((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_shift(STACK_OF(t1) *sk) \ + { \ + return (t2 *)OPENSSL_sk_shift((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_pop_free(STACK_OF(t1) *sk, sk_##t1##_freefunc freefunc) \ + { \ + OPENSSL_sk_pop_free((OPENSSL_STACK *)sk, (OPENSSL_sk_freefunc)freefunc); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_insert(STACK_OF(t1) *sk, t2 *ptr, int idx) \ + { \ + return OPENSSL_sk_insert((OPENSSL_STACK *)sk, (const void *)ptr, idx); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_set(STACK_OF(t1) *sk, int idx, t2 *ptr) \ + { \ + return (t2 *)OPENSSL_sk_set((OPENSSL_STACK *)sk, idx, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_find(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_find((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_find_ex(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_find_ex((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_find_all(STACK_OF(t1) *sk, t2 *ptr, int *pnum) \ + { \ + return OPENSSL_sk_find_all((OPENSSL_STACK *)sk, (const void *)ptr, pnum); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_sort(STACK_OF(t1) *sk) \ + { \ + OPENSSL_sk_sort((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_is_sorted(const STACK_OF(t1) *sk) \ + { \ + return OPENSSL_sk_is_sorted((const OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_dup(const STACK_OF(t1) *sk) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_dup((const OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_deep_copy(const STACK_OF(t1) *sk, \ + sk_##t1##_copyfunc copyfunc, \ + sk_##t1##_freefunc freefunc) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_deep_copy((const OPENSSL_STACK *)sk, \ + (OPENSSL_sk_copyfunc)copyfunc, \ + (OPENSSL_sk_freefunc)freefunc); \ + } \ + static ossl_unused ossl_inline sk_##t1##_compfunc sk_##t1##_set_cmp_func(STACK_OF(t1) *sk, sk_##t1##_compfunc compare) \ + { \ + return (sk_##t1##_compfunc)OPENSSL_sk_set_cmp_func((OPENSSL_STACK *)sk, (OPENSSL_sk_compfunc)compare); \ + } + +#define DEFINE_STACK_OF(t) SKM_DEFINE_STACK_OF(t, t, t) +#define DEFINE_STACK_OF_CONST(t) SKM_DEFINE_STACK_OF(t, const t, t) +#define DEFINE_SPECIAL_STACK_OF(t1, t2) SKM_DEFINE_STACK_OF(t1, t2, t2) +#define DEFINE_SPECIAL_STACK_OF_CONST(t1, t2) \ + SKM_DEFINE_STACK_OF(t1, const t2, t2) + +/*- + * Strings are special: normally an lhash entry will point to a single + * (somewhat) mutable object. In the case of strings: + * + * a) Instead of a single char, there is an array of chars, NUL-terminated. + * b) The string may have be immutable. + * + * So, they need their own declarations. Especially important for + * type-checking tools, such as Deputy. + * + * In practice, however, it appears to be hard to have a const + * string. For now, I'm settling for dealing with the fact it is a + * string at all. + */ +typedef char *OPENSSL_STRING; +typedef const char *OPENSSL_CSTRING; + +/*- + * Confusingly, LHASH_OF(STRING) deals with char ** throughout, but + * STACK_OF(STRING) is really more like STACK_OF(char), only, as mentioned + * above, instead of a single char each entry is a NUL-terminated array of + * chars. So, we have to implement STRING specially for STACK_OF. This is + * dealt with in the autogenerated macros below. + */ +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OPENSSL_STRING, char, char) +#define sk_OPENSSL_STRING_num(sk) OPENSSL_sk_num(ossl_check_const_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_value(sk, idx) ((char *)OPENSSL_sk_value(ossl_check_const_OPENSSL_STRING_sk_type(sk), (idx))) +#define sk_OPENSSL_STRING_new(cmp) ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_new(ossl_check_OPENSSL_STRING_compfunc_type(cmp))) +#define sk_OPENSSL_STRING_new_null() ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_new_null()) +#define sk_OPENSSL_STRING_new_reserve(cmp, n) ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_new_reserve(ossl_check_OPENSSL_STRING_compfunc_type(cmp), (n))) +#define sk_OPENSSL_STRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OPENSSL_STRING_sk_type(sk), (n)) +#define sk_OPENSSL_STRING_free(sk) OPENSSL_sk_free(ossl_check_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_zero(sk) OPENSSL_sk_zero(ossl_check_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_delete(sk, i) ((char *)OPENSSL_sk_delete(ossl_check_OPENSSL_STRING_sk_type(sk), (i))) +#define sk_OPENSSL_STRING_delete_ptr(sk, ptr) ((char *)OPENSSL_sk_delete_ptr(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr))) +#define sk_OPENSSL_STRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr)) +#define sk_OPENSSL_STRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr)) +#define sk_OPENSSL_STRING_pop(sk) ((char *)OPENSSL_sk_pop(ossl_check_OPENSSL_STRING_sk_type(sk))) +#define sk_OPENSSL_STRING_shift(sk) ((char *)OPENSSL_sk_shift(ossl_check_OPENSSL_STRING_sk_type(sk))) +#define sk_OPENSSL_STRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OPENSSL_STRING_sk_type(sk),ossl_check_OPENSSL_STRING_freefunc_type(freefunc)) +#define sk_OPENSSL_STRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr), (idx)) +#define sk_OPENSSL_STRING_set(sk, idx, ptr) ((char *)OPENSSL_sk_set(ossl_check_OPENSSL_STRING_sk_type(sk), (idx), ossl_check_OPENSSL_STRING_type(ptr))) +#define sk_OPENSSL_STRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr)) +#define sk_OPENSSL_STRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr)) +#define sk_OPENSSL_STRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr), pnum) +#define sk_OPENSSL_STRING_sort(sk) OPENSSL_sk_sort(ossl_check_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_dup(sk) ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_dup(ossl_check_const_OPENSSL_STRING_sk_type(sk))) +#define sk_OPENSSL_STRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_deep_copy(ossl_check_const_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_copyfunc_type(copyfunc), ossl_check_OPENSSL_STRING_freefunc_type(freefunc))) +#define sk_OPENSSL_STRING_set_cmp_func(sk, cmp) ((sk_OPENSSL_STRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(OPENSSL_CSTRING, const char, char) +#define sk_OPENSSL_CSTRING_num(sk) OPENSSL_sk_num(ossl_check_const_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_value(sk, idx) ((const char *)OPENSSL_sk_value(ossl_check_const_OPENSSL_CSTRING_sk_type(sk), (idx))) +#define sk_OPENSSL_CSTRING_new(cmp) ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_new(ossl_check_OPENSSL_CSTRING_compfunc_type(cmp))) +#define sk_OPENSSL_CSTRING_new_null() ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_new_null()) +#define sk_OPENSSL_CSTRING_new_reserve(cmp, n) ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_new_reserve(ossl_check_OPENSSL_CSTRING_compfunc_type(cmp), (n))) +#define sk_OPENSSL_CSTRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OPENSSL_CSTRING_sk_type(sk), (n)) +#define sk_OPENSSL_CSTRING_free(sk) OPENSSL_sk_free(ossl_check_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_zero(sk) OPENSSL_sk_zero(ossl_check_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_delete(sk, i) ((const char *)OPENSSL_sk_delete(ossl_check_OPENSSL_CSTRING_sk_type(sk), (i))) +#define sk_OPENSSL_CSTRING_delete_ptr(sk, ptr) ((const char *)OPENSSL_sk_delete_ptr(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr))) +#define sk_OPENSSL_CSTRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr)) +#define sk_OPENSSL_CSTRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr)) +#define sk_OPENSSL_CSTRING_pop(sk) ((const char *)OPENSSL_sk_pop(ossl_check_OPENSSL_CSTRING_sk_type(sk))) +#define sk_OPENSSL_CSTRING_shift(sk) ((const char *)OPENSSL_sk_shift(ossl_check_OPENSSL_CSTRING_sk_type(sk))) +#define sk_OPENSSL_CSTRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OPENSSL_CSTRING_sk_type(sk),ossl_check_OPENSSL_CSTRING_freefunc_type(freefunc)) +#define sk_OPENSSL_CSTRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr), (idx)) +#define sk_OPENSSL_CSTRING_set(sk, idx, ptr) ((const char *)OPENSSL_sk_set(ossl_check_OPENSSL_CSTRING_sk_type(sk), (idx), ossl_check_OPENSSL_CSTRING_type(ptr))) +#define sk_OPENSSL_CSTRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr)) +#define sk_OPENSSL_CSTRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr)) +#define sk_OPENSSL_CSTRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr), pnum) +#define sk_OPENSSL_CSTRING_sort(sk) OPENSSL_sk_sort(ossl_check_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_dup(sk) ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_dup(ossl_check_const_OPENSSL_CSTRING_sk_type(sk))) +#define sk_OPENSSL_CSTRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_deep_copy(ossl_check_const_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_copyfunc_type(copyfunc), ossl_check_OPENSSL_CSTRING_freefunc_type(freefunc))) +#define sk_OPENSSL_CSTRING_set_cmp_func(sk, cmp) ((sk_OPENSSL_CSTRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_compfunc_type(cmp))) + +/* clang-format on */ + +#if !defined(OPENSSL_NO_DEPRECATED_3_0) +/* + * This is not used by OpenSSL. A block of bytes, NOT nul-terminated. + * These should also be distinguished from "normal" stacks. + */ +typedef void *OPENSSL_BLOCK; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OPENSSL_BLOCK, void, void) +#define sk_OPENSSL_BLOCK_num(sk) OPENSSL_sk_num(ossl_check_const_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_value(sk, idx) ((void *)OPENSSL_sk_value(ossl_check_const_OPENSSL_BLOCK_sk_type(sk), (idx))) +#define sk_OPENSSL_BLOCK_new(cmp) ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_new(ossl_check_OPENSSL_BLOCK_compfunc_type(cmp))) +#define sk_OPENSSL_BLOCK_new_null() ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_new_null()) +#define sk_OPENSSL_BLOCK_new_reserve(cmp, n) ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_new_reserve(ossl_check_OPENSSL_BLOCK_compfunc_type(cmp), (n))) +#define sk_OPENSSL_BLOCK_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OPENSSL_BLOCK_sk_type(sk), (n)) +#define sk_OPENSSL_BLOCK_free(sk) OPENSSL_sk_free(ossl_check_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_zero(sk) OPENSSL_sk_zero(ossl_check_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_delete(sk, i) ((void *)OPENSSL_sk_delete(ossl_check_OPENSSL_BLOCK_sk_type(sk), (i))) +#define sk_OPENSSL_BLOCK_delete_ptr(sk, ptr) ((void *)OPENSSL_sk_delete_ptr(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr))) +#define sk_OPENSSL_BLOCK_push(sk, ptr) OPENSSL_sk_push(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr)) +#define sk_OPENSSL_BLOCK_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr)) +#define sk_OPENSSL_BLOCK_pop(sk) ((void *)OPENSSL_sk_pop(ossl_check_OPENSSL_BLOCK_sk_type(sk))) +#define sk_OPENSSL_BLOCK_shift(sk) ((void *)OPENSSL_sk_shift(ossl_check_OPENSSL_BLOCK_sk_type(sk))) +#define sk_OPENSSL_BLOCK_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OPENSSL_BLOCK_sk_type(sk),ossl_check_OPENSSL_BLOCK_freefunc_type(freefunc)) +#define sk_OPENSSL_BLOCK_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr), (idx)) +#define sk_OPENSSL_BLOCK_set(sk, idx, ptr) ((void *)OPENSSL_sk_set(ossl_check_OPENSSL_BLOCK_sk_type(sk), (idx), ossl_check_OPENSSL_BLOCK_type(ptr))) +#define sk_OPENSSL_BLOCK_find(sk, ptr) OPENSSL_sk_find(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr)) +#define sk_OPENSSL_BLOCK_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr)) +#define sk_OPENSSL_BLOCK_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr), pnum) +#define sk_OPENSSL_BLOCK_sort(sk) OPENSSL_sk_sort(ossl_check_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_dup(sk) ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_dup(ossl_check_const_OPENSSL_BLOCK_sk_type(sk))) +#define sk_OPENSSL_BLOCK_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_deep_copy(ossl_check_const_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_copyfunc_type(copyfunc), ossl_check_OPENSSL_BLOCK_freefunc_type(freefunc))) +#define sk_OPENSSL_BLOCK_set_cmp_func(sk, cmp) ((sk_OPENSSL_BLOCK_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_compfunc_type(cmp))) + +/* clang-format on */ +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/srp.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/srp.h new file mode 100644 index 000000000000..4ef926d61fc8 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/srp.h @@ -0,0 +1,291 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/srp.h.in + * + * Copyright 2004-2021 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2004, EdelKey Project. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + * + * Originally written by Christophe Renou and Peter Sylvester, + * for the EdelKey project. + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_SRP_H +#define OPENSSL_SRP_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_SRP_H +#endif + +#include + +#ifndef OPENSSL_NO_SRP +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef OPENSSL_NO_DEPRECATED_3_0 + +typedef struct SRP_gN_cache_st { + char *b64_bn; + BIGNUM *bn; +} SRP_gN_cache; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SRP_gN_cache, SRP_gN_cache, SRP_gN_cache) +#define sk_SRP_gN_cache_num(sk) OPENSSL_sk_num(ossl_check_const_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_value(sk, idx) ((SRP_gN_cache *)OPENSSL_sk_value(ossl_check_const_SRP_gN_cache_sk_type(sk), (idx))) +#define sk_SRP_gN_cache_new(cmp) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_new(ossl_check_SRP_gN_cache_compfunc_type(cmp))) +#define sk_SRP_gN_cache_new_null() ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_new_null()) +#define sk_SRP_gN_cache_new_reserve(cmp, n) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_new_reserve(ossl_check_SRP_gN_cache_compfunc_type(cmp), (n))) +#define sk_SRP_gN_cache_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRP_gN_cache_sk_type(sk), (n)) +#define sk_SRP_gN_cache_free(sk) OPENSSL_sk_free(ossl_check_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_zero(sk) OPENSSL_sk_zero(ossl_check_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_delete(sk, i) ((SRP_gN_cache *)OPENSSL_sk_delete(ossl_check_SRP_gN_cache_sk_type(sk), (i))) +#define sk_SRP_gN_cache_delete_ptr(sk, ptr) ((SRP_gN_cache *)OPENSSL_sk_delete_ptr(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr))) +#define sk_SRP_gN_cache_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) +#define sk_SRP_gN_cache_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) +#define sk_SRP_gN_cache_pop(sk) ((SRP_gN_cache *)OPENSSL_sk_pop(ossl_check_SRP_gN_cache_sk_type(sk))) +#define sk_SRP_gN_cache_shift(sk) ((SRP_gN_cache *)OPENSSL_sk_shift(ossl_check_SRP_gN_cache_sk_type(sk))) +#define sk_SRP_gN_cache_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRP_gN_cache_sk_type(sk),ossl_check_SRP_gN_cache_freefunc_type(freefunc)) +#define sk_SRP_gN_cache_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr), (idx)) +#define sk_SRP_gN_cache_set(sk, idx, ptr) ((SRP_gN_cache *)OPENSSL_sk_set(ossl_check_SRP_gN_cache_sk_type(sk), (idx), ossl_check_SRP_gN_cache_type(ptr))) +#define sk_SRP_gN_cache_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) +#define sk_SRP_gN_cache_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) +#define sk_SRP_gN_cache_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr), pnum) +#define sk_SRP_gN_cache_sort(sk) OPENSSL_sk_sort(ossl_check_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_dup(sk) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_dup(ossl_check_const_SRP_gN_cache_sk_type(sk))) +#define sk_SRP_gN_cache_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_deep_copy(ossl_check_const_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_copyfunc_type(copyfunc), ossl_check_SRP_gN_cache_freefunc_type(freefunc))) +#define sk_SRP_gN_cache_set_cmp_func(sk, cmp) ((sk_SRP_gN_cache_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct SRP_user_pwd_st { + /* Owned by us. */ + char *id; + BIGNUM *s; + BIGNUM *v; + /* Not owned by us. */ + const BIGNUM *g; + const BIGNUM *N; + /* Owned by us. */ + char *info; +} SRP_user_pwd; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SRP_user_pwd, SRP_user_pwd, SRP_user_pwd) +#define sk_SRP_user_pwd_num(sk) OPENSSL_sk_num(ossl_check_const_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_value(sk, idx) ((SRP_user_pwd *)OPENSSL_sk_value(ossl_check_const_SRP_user_pwd_sk_type(sk), (idx))) +#define sk_SRP_user_pwd_new(cmp) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_new(ossl_check_SRP_user_pwd_compfunc_type(cmp))) +#define sk_SRP_user_pwd_new_null() ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_new_null()) +#define sk_SRP_user_pwd_new_reserve(cmp, n) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_new_reserve(ossl_check_SRP_user_pwd_compfunc_type(cmp), (n))) +#define sk_SRP_user_pwd_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRP_user_pwd_sk_type(sk), (n)) +#define sk_SRP_user_pwd_free(sk) OPENSSL_sk_free(ossl_check_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_zero(sk) OPENSSL_sk_zero(ossl_check_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_delete(sk, i) ((SRP_user_pwd *)OPENSSL_sk_delete(ossl_check_SRP_user_pwd_sk_type(sk), (i))) +#define sk_SRP_user_pwd_delete_ptr(sk, ptr) ((SRP_user_pwd *)OPENSSL_sk_delete_ptr(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr))) +#define sk_SRP_user_pwd_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) +#define sk_SRP_user_pwd_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) +#define sk_SRP_user_pwd_pop(sk) ((SRP_user_pwd *)OPENSSL_sk_pop(ossl_check_SRP_user_pwd_sk_type(sk))) +#define sk_SRP_user_pwd_shift(sk) ((SRP_user_pwd *)OPENSSL_sk_shift(ossl_check_SRP_user_pwd_sk_type(sk))) +#define sk_SRP_user_pwd_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRP_user_pwd_sk_type(sk),ossl_check_SRP_user_pwd_freefunc_type(freefunc)) +#define sk_SRP_user_pwd_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr), (idx)) +#define sk_SRP_user_pwd_set(sk, idx, ptr) ((SRP_user_pwd *)OPENSSL_sk_set(ossl_check_SRP_user_pwd_sk_type(sk), (idx), ossl_check_SRP_user_pwd_type(ptr))) +#define sk_SRP_user_pwd_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) +#define sk_SRP_user_pwd_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) +#define sk_SRP_user_pwd_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr), pnum) +#define sk_SRP_user_pwd_sort(sk) OPENSSL_sk_sort(ossl_check_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_dup(sk) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_dup(ossl_check_const_SRP_user_pwd_sk_type(sk))) +#define sk_SRP_user_pwd_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_deep_copy(ossl_check_const_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_copyfunc_type(copyfunc), ossl_check_SRP_user_pwd_freefunc_type(freefunc))) +#define sk_SRP_user_pwd_set_cmp_func(sk, cmp) ((sk_SRP_user_pwd_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_compfunc_type(cmp))) + +/* clang-format on */ + +OSSL_DEPRECATEDIN_3_0 +SRP_user_pwd *SRP_user_pwd_new(void); +OSSL_DEPRECATEDIN_3_0 +void SRP_user_pwd_free(SRP_user_pwd *user_pwd); + +OSSL_DEPRECATEDIN_3_0 +void SRP_user_pwd_set_gN(SRP_user_pwd *user_pwd, const BIGNUM *g, + const BIGNUM *N); +OSSL_DEPRECATEDIN_3_0 +int SRP_user_pwd_set1_ids(SRP_user_pwd *user_pwd, const char *id, + const char *info); +OSSL_DEPRECATEDIN_3_0 +int SRP_user_pwd_set0_sv(SRP_user_pwd *user_pwd, BIGNUM *s, BIGNUM *v); + +typedef struct SRP_VBASE_st { + STACK_OF(SRP_user_pwd) *users_pwd; + STACK_OF(SRP_gN_cache) *gN_cache; + /* to simulate a user */ + char *seed_key; + const BIGNUM *default_g; + const BIGNUM *default_N; +} SRP_VBASE; + +/* + * Internal structure storing N and g pair + */ +typedef struct SRP_gN_st { + char *id; + const BIGNUM *g; + const BIGNUM *N; +} SRP_gN; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SRP_gN, SRP_gN, SRP_gN) +#define sk_SRP_gN_num(sk) OPENSSL_sk_num(ossl_check_const_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_value(sk, idx) ((SRP_gN *)OPENSSL_sk_value(ossl_check_const_SRP_gN_sk_type(sk), (idx))) +#define sk_SRP_gN_new(cmp) ((STACK_OF(SRP_gN) *)OPENSSL_sk_new(ossl_check_SRP_gN_compfunc_type(cmp))) +#define sk_SRP_gN_new_null() ((STACK_OF(SRP_gN) *)OPENSSL_sk_new_null()) +#define sk_SRP_gN_new_reserve(cmp, n) ((STACK_OF(SRP_gN) *)OPENSSL_sk_new_reserve(ossl_check_SRP_gN_compfunc_type(cmp), (n))) +#define sk_SRP_gN_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRP_gN_sk_type(sk), (n)) +#define sk_SRP_gN_free(sk) OPENSSL_sk_free(ossl_check_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_zero(sk) OPENSSL_sk_zero(ossl_check_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_delete(sk, i) ((SRP_gN *)OPENSSL_sk_delete(ossl_check_SRP_gN_sk_type(sk), (i))) +#define sk_SRP_gN_delete_ptr(sk, ptr) ((SRP_gN *)OPENSSL_sk_delete_ptr(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr))) +#define sk_SRP_gN_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) +#define sk_SRP_gN_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) +#define sk_SRP_gN_pop(sk) ((SRP_gN *)OPENSSL_sk_pop(ossl_check_SRP_gN_sk_type(sk))) +#define sk_SRP_gN_shift(sk) ((SRP_gN *)OPENSSL_sk_shift(ossl_check_SRP_gN_sk_type(sk))) +#define sk_SRP_gN_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRP_gN_sk_type(sk),ossl_check_SRP_gN_freefunc_type(freefunc)) +#define sk_SRP_gN_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr), (idx)) +#define sk_SRP_gN_set(sk, idx, ptr) ((SRP_gN *)OPENSSL_sk_set(ossl_check_SRP_gN_sk_type(sk), (idx), ossl_check_SRP_gN_type(ptr))) +#define sk_SRP_gN_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) +#define sk_SRP_gN_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) +#define sk_SRP_gN_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr), pnum) +#define sk_SRP_gN_sort(sk) OPENSSL_sk_sort(ossl_check_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_dup(sk) ((STACK_OF(SRP_gN) *)OPENSSL_sk_dup(ossl_check_const_SRP_gN_sk_type(sk))) +#define sk_SRP_gN_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRP_gN) *)OPENSSL_sk_deep_copy(ossl_check_const_SRP_gN_sk_type(sk), ossl_check_SRP_gN_copyfunc_type(copyfunc), ossl_check_SRP_gN_freefunc_type(freefunc))) +#define sk_SRP_gN_set_cmp_func(sk, cmp) ((sk_SRP_gN_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_compfunc_type(cmp))) + +/* clang-format on */ + +OSSL_DEPRECATEDIN_3_0 +SRP_VBASE *SRP_VBASE_new(char *seed_key); +OSSL_DEPRECATEDIN_3_0 +void SRP_VBASE_free(SRP_VBASE *vb); +OSSL_DEPRECATEDIN_3_0 +int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file); + +OSSL_DEPRECATEDIN_3_0 +int SRP_VBASE_add0_user(SRP_VBASE *vb, SRP_user_pwd *user_pwd); + +/* NOTE: unlike in SRP_VBASE_get_by_user, caller owns the returned pointer.*/ +OSSL_DEPRECATEDIN_3_0 +SRP_user_pwd *SRP_VBASE_get1_by_user(SRP_VBASE *vb, char *username); + +OSSL_DEPRECATEDIN_3_0 +char *SRP_create_verifier_ex(const char *user, const char *pass, char **salt, + char **verifier, const char *N, const char *g, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +char *SRP_create_verifier(const char *user, const char *pass, char **salt, + char **verifier, const char *N, const char *g); +OSSL_DEPRECATEDIN_3_0 +int SRP_create_verifier_BN_ex(const char *user, const char *pass, BIGNUM **salt, + BIGNUM **verifier, const BIGNUM *N, + const BIGNUM *g, OSSL_LIB_CTX *libctx, + const char *propq); +OSSL_DEPRECATEDIN_3_0 +int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, + BIGNUM **verifier, const BIGNUM *N, + const BIGNUM *g); + +#define SRP_NO_ERROR 0 +#define SRP_ERR_VBASE_INCOMPLETE_FILE 1 +#define SRP_ERR_VBASE_BN_LIB 2 +#define SRP_ERR_OPEN_FILE 3 +#define SRP_ERR_MEMORY 4 + +#define DB_srptype 0 +#define DB_srpverifier 1 +#define DB_srpsalt 2 +#define DB_srpid 3 +#define DB_srpgN 4 +#define DB_srpinfo 5 +#undef DB_NUMBER +#define DB_NUMBER 6 + +#define DB_SRP_INDEX 'I' +#define DB_SRP_VALID 'V' +#define DB_SRP_REVOKED 'R' +#define DB_SRP_MODIF 'v' + +/* see srp.c */ +OSSL_DEPRECATEDIN_3_0 +char *SRP_check_known_gN_param(const BIGNUM *g, const BIGNUM *N); +OSSL_DEPRECATEDIN_3_0 +SRP_gN *SRP_get_default_gN(const char *id); + +/* server side .... */ +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_server_key(const BIGNUM *A, const BIGNUM *v, const BIGNUM *u, + const BIGNUM *b, const BIGNUM *N); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_B_ex(const BIGNUM *b, const BIGNUM *N, const BIGNUM *g, + const BIGNUM *v, OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_B(const BIGNUM *b, const BIGNUM *N, const BIGNUM *g, + const BIGNUM *v); + +OSSL_DEPRECATEDIN_3_0 +int SRP_Verify_A_mod_N(const BIGNUM *A, const BIGNUM *N); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_u_ex(const BIGNUM *A, const BIGNUM *B, const BIGNUM *N, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_u(const BIGNUM *A, const BIGNUM *B, const BIGNUM *N); + +/* client side .... */ + +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_x_ex(const BIGNUM *s, const char *user, const char *pass, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_x(const BIGNUM *s, const char *user, const char *pass); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_A(const BIGNUM *a, const BIGNUM *N, const BIGNUM *g); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_client_key_ex(const BIGNUM *N, const BIGNUM *B, const BIGNUM *g, + const BIGNUM *x, const BIGNUM *a, const BIGNUM *u, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_client_key(const BIGNUM *N, const BIGNUM *B, const BIGNUM *g, + const BIGNUM *x, const BIGNUM *a, const BIGNUM *u); +OSSL_DEPRECATEDIN_3_0 +int SRP_Verify_B_mod_N(const BIGNUM *B, const BIGNUM *N); + +#define SRP_MINIMAL_N 1024 + +#endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +/* This method ignores the configured seed and fails for an unknown user. */ +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 +SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username); +#endif + +#ifdef __cplusplus +} +#endif +#endif + +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ssl.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ssl.h new file mode 100644 index 000000000000..eaeeea7d10b4 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ssl.h @@ -0,0 +1,2940 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/ssl.h.in + * + * Copyright 1995-2026 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * Copyright 2005 Nokia. All rights reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_SSL_H +#define OPENSSL_SSL_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_SSL_H +#endif + +#include +#include +#include +#include +#include +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#include +#include +#include +#endif +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* OpenSSL version number for ASN.1 encoding of the session information */ +/*- + * Version 0 - initial version + * Version 1 - added the optional peer certificate + */ +#define SSL_SESSION_ASN1_VERSION 0x0001 + +#define SSL_MAX_SSL_SESSION_ID_LENGTH 32 +#define SSL_MAX_SID_CTX_LENGTH 32 + +#define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES (512 / 8) +#define SSL_MAX_KEY_ARG_LENGTH 8 +/* SSL_MAX_MASTER_KEY_LENGTH is defined in prov_ssl.h */ + +/* The maximum number of encrypt/decrypt pipelines we can support */ +#define SSL_MAX_PIPELINES 32 + +/* text strings for the ciphers */ + +/* These are used to specify which ciphers to use and not to use */ + +#define SSL_TXT_LOW "LOW" +#define SSL_TXT_MEDIUM "MEDIUM" +#define SSL_TXT_HIGH "HIGH" +#define SSL_TXT_FIPS "FIPS" + +#define SSL_TXT_aNULL "aNULL" +#define SSL_TXT_eNULL "eNULL" +#define SSL_TXT_NULL "NULL" + +#define SSL_TXT_kRSA "kRSA" +#define SSL_TXT_kDHr "kDHr" /* this cipher class has been removed */ +#define SSL_TXT_kDHd "kDHd" /* this cipher class has been removed */ +#define SSL_TXT_kDH "kDH" /* this cipher class has been removed */ +#define SSL_TXT_kEDH "kEDH" /* alias for kDHE */ +#define SSL_TXT_kDHE "kDHE" +#define SSL_TXT_kECDHr "kECDHr" /* this cipher class has been removed */ +#define SSL_TXT_kECDHe "kECDHe" /* this cipher class has been removed */ +#define SSL_TXT_kECDH "kECDH" /* this cipher class has been removed */ +#define SSL_TXT_kEECDH "kEECDH" /* alias for kECDHE */ +#define SSL_TXT_kECDHE "kECDHE" +#define SSL_TXT_kPSK "kPSK" +#define SSL_TXT_kRSAPSK "kRSAPSK" +#define SSL_TXT_kECDHEPSK "kECDHEPSK" +#define SSL_TXT_kDHEPSK "kDHEPSK" +#define SSL_TXT_kGOST "kGOST" +#define SSL_TXT_kGOST18 "kGOST18" +#define SSL_TXT_kSRP "kSRP" + +#define SSL_TXT_aRSA "aRSA" +#define SSL_TXT_aDSS "aDSS" +#define SSL_TXT_aDH "aDH" /* this cipher class has been removed */ +#define SSL_TXT_aECDH "aECDH" /* this cipher class has been removed */ +#define SSL_TXT_aECDSA "aECDSA" +#define SSL_TXT_aPSK "aPSK" +#define SSL_TXT_aGOST94 "aGOST94" +#define SSL_TXT_aGOST01 "aGOST01" +#define SSL_TXT_aGOST12 "aGOST12" +#define SSL_TXT_aGOST "aGOST" +#define SSL_TXT_aSRP "aSRP" + +#define SSL_TXT_DSS "DSS" +#define SSL_TXT_DH "DH" +#define SSL_TXT_DHE "DHE" /* same as "kDHE:-ADH" */ +#define SSL_TXT_EDH "EDH" /* alias for DHE */ +#define SSL_TXT_ADH "ADH" +#define SSL_TXT_RSA "RSA" +#define SSL_TXT_ECDH "ECDH" +#define SSL_TXT_EECDH "EECDH" /* alias for ECDHE" */ +#define SSL_TXT_ECDHE "ECDHE" /* same as "kECDHE:-AECDH" */ +#define SSL_TXT_AECDH "AECDH" +#define SSL_TXT_ECDSA "ECDSA" +#define SSL_TXT_PSK "PSK" +#define SSL_TXT_SRP "SRP" + +#define SSL_TXT_DES "DES" +#define SSL_TXT_3DES "3DES" +#define SSL_TXT_RC4 "RC4" +#define SSL_TXT_RC2 "RC2" +#define SSL_TXT_IDEA "IDEA" +#define SSL_TXT_SEED "SEED" +#define SSL_TXT_AES128 "AES128" +#define SSL_TXT_AES256 "AES256" +#define SSL_TXT_AES "AES" +#define SSL_TXT_AES_GCM "AESGCM" +#define SSL_TXT_AES_CCM "AESCCM" +#define SSL_TXT_AES_CCM_8 "AESCCM8" +#define SSL_TXT_CAMELLIA128 "CAMELLIA128" +#define SSL_TXT_CAMELLIA256 "CAMELLIA256" +#define SSL_TXT_CAMELLIA "CAMELLIA" +#define SSL_TXT_CHACHA20 "CHACHA20" +#define SSL_TXT_GOST "GOST89" +#define SSL_TXT_ARIA "ARIA" +#define SSL_TXT_ARIA_GCM "ARIAGCM" +#define SSL_TXT_ARIA128 "ARIA128" +#define SSL_TXT_ARIA256 "ARIA256" +#define SSL_TXT_GOST2012_GOST8912_GOST8912 "GOST2012-GOST8912-GOST8912" +#define SSL_TXT_CBC "CBC" + +#define SSL_TXT_MD5 "MD5" +#define SSL_TXT_SHA1 "SHA1" +#define SSL_TXT_SHA "SHA" /* same as "SHA1" */ +#define SSL_TXT_GOST94 "GOST94" +#define SSL_TXT_GOST89MAC "GOST89MAC" +#define SSL_TXT_GOST12 "GOST12" +#define SSL_TXT_GOST89MAC12 "GOST89MAC12" +#define SSL_TXT_SHA256 "SHA256" +#define SSL_TXT_SHA384 "SHA384" + +#define SSL_TXT_SSLV3 "SSLv3" +#define SSL_TXT_TLSV1 "TLSv1" +#define SSL_TXT_TLSV1_1 "TLSv1.1" +#define SSL_TXT_TLSV1_2 "TLSv1.2" + +#define SSL_TXT_ALL "ALL" + +/*- + * COMPLEMENTOF* definitions. These identifiers are used to (de-select) + * ciphers normally not being used. + * Example: "RC4" will activate all ciphers using RC4 including ciphers + * without authentication, which would normally disabled by DEFAULT (due + * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT" + * will make sure that it is also disabled in the specific selection. + * COMPLEMENTOF* identifiers are portable between version, as adjustments + * to the default cipher setup will also be included here. + * + * COMPLEMENTOFDEFAULT does not experience the same special treatment that + * DEFAULT gets, as only selection is being done and no sorting as needed + * for DEFAULT. + */ +#define SSL_TXT_CMPALL "COMPLEMENTOFALL" +#define SSL_TXT_CMPDEF "COMPLEMENTOFDEFAULT" + +/* + * The following cipher list is used by default. It also is substituted when + * an application-defined cipher list string starts with 'DEFAULT'. + * This applies to ciphersuites for TLSv1.2 and below. + * DEPRECATED IN 3.0.0, in favor of OSSL_default_cipher_list() + * Update both macro and function simultaneously + */ +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SSL_DEFAULT_CIPHER_LIST "ALL:!COMPLEMENTOFDEFAULT:!eNULL" +/* + * This is the default set of TLSv1.3 ciphersuites + * DEPRECATED IN 3.0.0, in favor of OSSL_default_ciphersuites() + * Update both macro and function simultaneously + */ +#define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ + "TLS_CHACHA20_POLY1305_SHA256:" \ + "TLS_AES_128_GCM_SHA256" +#endif +/* + * As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always + * starts with a reasonable order, and all we have to do for DEFAULT is + * throwing out anonymous and unencrypted ciphersuites! (The latter are not + * actually enabled by ALL, but "ALL:RSA" would enable some of them.) + */ + +/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */ +#define SSL_SENT_SHUTDOWN 1 +#define SSL_RECEIVED_SHUTDOWN 2 + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define SSL_FILETYPE_ASN1 X509_FILETYPE_ASN1 +#define SSL_FILETYPE_PEM X509_FILETYPE_PEM + +/* + * This is needed to stop compilers complaining about the 'struct ssl_st *' + * function parameters used to prototype callbacks in SSL_CTX. + */ +typedef struct ssl_st *ssl_crock_st; +typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT; +typedef struct ssl_method_st SSL_METHOD; +typedef struct ssl_cipher_st SSL_CIPHER; +typedef struct ssl_session_st SSL_SESSION; +typedef struct tls_sigalgs_st TLS_SIGALGS; +typedef struct ssl_conf_ctx_st SSL_CONF_CTX; + +STACK_OF(SSL_CIPHER); + +/* SRTP protection profiles for use with the use_srtp extension (RFC 5764)*/ +typedef struct srtp_protection_profile_st { + const char *name; + unsigned long id; +} SRTP_PROTECTION_PROFILE; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SRTP_PROTECTION_PROFILE, SRTP_PROTECTION_PROFILE, SRTP_PROTECTION_PROFILE) +#define sk_SRTP_PROTECTION_PROFILE_num(sk) OPENSSL_sk_num(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_value(sk, idx) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_value(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk), (idx))) +#define sk_SRTP_PROTECTION_PROFILE_new(cmp) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new(ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp))) +#define sk_SRTP_PROTECTION_PROFILE_new_null() ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new_null()) +#define sk_SRTP_PROTECTION_PROFILE_new_reserve(cmp, n) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new_reserve(ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp), (n))) +#define sk_SRTP_PROTECTION_PROFILE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (n)) +#define sk_SRTP_PROTECTION_PROFILE_free(sk) OPENSSL_sk_free(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_zero(sk) OPENSSL_sk_zero(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_delete(sk, i) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_delete(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (i))) +#define sk_SRTP_PROTECTION_PROFILE_delete_ptr(sk, ptr) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_delete_ptr(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))) +#define sk_SRTP_PROTECTION_PROFILE_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)) +#define sk_SRTP_PROTECTION_PROFILE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)) +#define sk_SRTP_PROTECTION_PROFILE_pop(sk) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_pop(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))) +#define sk_SRTP_PROTECTION_PROFILE_shift(sk) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_shift(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))) +#define sk_SRTP_PROTECTION_PROFILE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk),ossl_check_SRTP_PROTECTION_PROFILE_freefunc_type(freefunc)) +#define sk_SRTP_PROTECTION_PROFILE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr), (idx)) +#define sk_SRTP_PROTECTION_PROFILE_set(sk, idx, ptr) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_set(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (idx), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))) +#define sk_SRTP_PROTECTION_PROFILE_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)) +#define sk_SRTP_PROTECTION_PROFILE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)) +#define sk_SRTP_PROTECTION_PROFILE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr), pnum) +#define sk_SRTP_PROTECTION_PROFILE_sort(sk) OPENSSL_sk_sort(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_dup(sk) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_dup(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk))) +#define sk_SRTP_PROTECTION_PROFILE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_deep_copy(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_copyfunc_type(copyfunc), ossl_check_SRTP_PROTECTION_PROFILE_freefunc_type(freefunc))) +#define sk_SRTP_PROTECTION_PROFILE_set_cmp_func(sk, cmp) ((sk_SRTP_PROTECTION_PROFILE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp))) + +/* clang-format on */ + +typedef int (*tls_session_ticket_ext_cb_fn)(SSL *s, const unsigned char *data, + int len, void *arg); +typedef int (*tls_session_secret_cb_fn)(SSL *s, void *secret, int *secret_len, + STACK_OF(SSL_CIPHER) *peer_ciphers, + const SSL_CIPHER **cipher, void *arg); + +/* Extension context codes */ +/* This extension is only allowed in TLS */ +#define SSL_EXT_TLS_ONLY 0x00001 +/* This extension is only allowed in DTLS */ +#define SSL_EXT_DTLS_ONLY 0x00002 +/* Some extensions may be allowed in DTLS but we don't implement them for it */ +#define SSL_EXT_TLS_IMPLEMENTATION_ONLY 0x00004 +/* Most extensions are not defined for SSLv3 but EXT_TYPE_renegotiate is */ +#define SSL_EXT_SSL3_ALLOWED 0x00008 +/* Extension is only defined for TLS1.2 and below */ +#define SSL_EXT_TLS1_2_AND_BELOW_ONLY 0x00010 +/* Extension is only defined for TLS1.3 and above */ +#define SSL_EXT_TLS1_3_ONLY 0x00020 +/* Ignore this extension during parsing if we are resuming */ +#define SSL_EXT_IGNORE_ON_RESUMPTION 0x00040 +#define SSL_EXT_CLIENT_HELLO 0x00080 +/* Really means TLS1.2 or below */ +#define SSL_EXT_TLS1_2_SERVER_HELLO 0x00100 +#define SSL_EXT_TLS1_3_SERVER_HELLO 0x00200 +#define SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS 0x00400 +#define SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST 0x00800 +#define SSL_EXT_TLS1_3_CERTIFICATE 0x01000 +#define SSL_EXT_TLS1_3_NEW_SESSION_TICKET 0x02000 +#define SSL_EXT_TLS1_3_CERTIFICATE_REQUEST 0x04000 +#define SSL_EXT_TLS1_3_CERTIFICATE_COMPRESSION 0x08000 +/* When sending a raw public key in a certificate message */ +#define SSL_EXT_TLS1_3_RAW_PUBLIC_KEY 0x10000 + +/* Typedefs for handling custom extensions */ + +typedef int (*custom_ext_add_cb)(SSL *s, unsigned int ext_type, + const unsigned char **out, size_t *outlen, + int *al, void *add_arg); + +typedef void (*custom_ext_free_cb)(SSL *s, unsigned int ext_type, + const unsigned char *out, void *add_arg); + +typedef int (*custom_ext_parse_cb)(SSL *s, unsigned int ext_type, + const unsigned char *in, size_t inlen, + int *al, void *parse_arg); + +typedef int (*SSL_custom_ext_add_cb_ex)(SSL *s, unsigned int ext_type, + unsigned int context, + const unsigned char **out, + size_t *outlen, X509 *x, + size_t chainidx, + int *al, void *add_arg); + +typedef void (*SSL_custom_ext_free_cb_ex)(SSL *s, unsigned int ext_type, + unsigned int context, + const unsigned char *out, + void *add_arg); + +typedef int (*SSL_custom_ext_parse_cb_ex)(SSL *s, unsigned int ext_type, + unsigned int context, + const unsigned char *in, + size_t inlen, X509 *x, + size_t chainidx, + int *al, void *parse_arg); + +/* Typedef for verification callback */ +typedef int (*SSL_verify_cb)(int preverify_ok, X509_STORE_CTX *x509_ctx); + +/* Typedef for SSL async callback */ +typedef int (*SSL_async_callback_fn)(SSL *s, void *arg); + +#define SSL_OP_BIT(n) ((uint64_t)1 << (uint64_t)n) + +/* + * SSL/TLS connection options. + */ +/* Disable Extended master secret */ +#define SSL_OP_NO_EXTENDED_MASTER_SECRET SSL_OP_BIT(0) +/* Cleanse plaintext copies of data delivered to the application */ +#define SSL_OP_CLEANSE_PLAINTEXT SSL_OP_BIT(1) +/* Allow initial connection to servers that don't support RI */ +#define SSL_OP_LEGACY_SERVER_CONNECT SSL_OP_BIT(2) +/* Enable support for Kernel TLS */ +#define SSL_OP_ENABLE_KTLS SSL_OP_BIT(3) +#define SSL_OP_TLSEXT_PADDING SSL_OP_BIT(4) +#define SSL_OP_SAFARI_ECDHE_ECDSA_BUG SSL_OP_BIT(6) +#define SSL_OP_IGNORE_UNEXPECTED_EOF SSL_OP_BIT(7) +#define SSL_OP_ALLOW_CLIENT_RENEGOTIATION SSL_OP_BIT(8) +#define SSL_OP_DISABLE_TLSEXT_CA_NAMES SSL_OP_BIT(9) +/* In TLSv1.3 allow a non-(ec)dhe based kex_mode */ +#define SSL_OP_ALLOW_NO_DHE_KEX SSL_OP_BIT(10) +/* + * Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added + * in OpenSSL 0.9.6d. Usually (depending on the application protocol) + * the workaround is not needed. Unfortunately some broken SSL/TLS + * implementations cannot handle it at all, which is why we include it + * in SSL_OP_ALL. Added in 0.9.6e + */ +#define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS SSL_OP_BIT(11) +/* DTLS options */ +#define SSL_OP_NO_QUERY_MTU SSL_OP_BIT(12) +/* Turn on Cookie Exchange (on relevant for servers) */ +#define SSL_OP_COOKIE_EXCHANGE SSL_OP_BIT(13) +/* Don't use RFC4507 ticket extension */ +#define SSL_OP_NO_TICKET SSL_OP_BIT(14) +#ifndef OPENSSL_NO_DTLS1_METHOD +/* + * Use Cisco's version identifier of DTLS_BAD_VER + * (only with deprecated DTLSv1_client_method()) + */ +#define SSL_OP_CISCO_ANYCONNECT SSL_OP_BIT(15) +#endif +/* As server, disallow session resumption on renegotiation */ +#define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION SSL_OP_BIT(16) +/* Don't use compression even if supported */ +#define SSL_OP_NO_COMPRESSION SSL_OP_BIT(17) +/* Permit unsafe legacy renegotiation */ +#define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION SSL_OP_BIT(18) +/* Disable encrypt-then-mac */ +#define SSL_OP_NO_ENCRYPT_THEN_MAC SSL_OP_BIT(19) +/* + * Enable TLSv1.3 Compatibility mode. This is on by default. A future + * version of OpenSSL may have this disabled by default. + */ +#define SSL_OP_ENABLE_MIDDLEBOX_COMPAT SSL_OP_BIT(20) +/* + * Prioritize Chacha20Poly1305 when client does. + * Modifies SSL_OP_CIPHER_SERVER_PREFERENCE + */ +#define SSL_OP_PRIORITIZE_CHACHA SSL_OP_BIT(21) +/* + * Set on servers to choose the cipher according to server's preferences. + */ +#define SSL_OP_CIPHER_SERVER_PREFERENCE SSL_OP_BIT(22) +/* + * If set, a server will allow a client to issue an SSLv3.0 version + * number as latest version supported in the premaster secret, even when + * TLSv1.0 (version 3.1) was announced in the client hello. Normally + * this is forbidden to prevent version rollback attacks. + */ +#define SSL_OP_TLS_ROLLBACK_BUG SSL_OP_BIT(23) +/* + * Switches off automatic TLSv1.3 anti-replay protection for early data. + * This is a server-side option only (no effect on the client). + */ +#define SSL_OP_NO_ANTI_REPLAY SSL_OP_BIT(24) +#define SSL_OP_NO_SSLv3 SSL_OP_BIT(25) +#define SSL_OP_NO_TLSv1 SSL_OP_BIT(26) +#define SSL_OP_NO_TLSv1_2 SSL_OP_BIT(27) +#define SSL_OP_NO_TLSv1_1 SSL_OP_BIT(28) +#define SSL_OP_NO_TLSv1_3 SSL_OP_BIT(29) +#define SSL_OP_NO_DTLSv1 SSL_OP_BIT(26) +#define SSL_OP_NO_DTLSv1_2 SSL_OP_BIT(27) +/* Disallow all renegotiation */ +#define SSL_OP_NO_RENEGOTIATION SSL_OP_BIT(30) +/* + * Make server add server-hello extension from early version of + * cryptopro draft, when GOST ciphersuite is negotiated. Required for + * interoperability with CryptoPro CSP 3.x + */ +#define SSL_OP_CRYPTOPRO_TLSEXT_BUG SSL_OP_BIT(31) +/* + * Disable RFC8879 certificate compression + * SSL_OP_NO_TX_CERTIFICATE_COMPRESSION: don't send compressed certificates, + * and ignore the extension when received. + * SSL_OP_NO_RX_CERTIFICATE_COMPRESSION: don't send the extension, and + * subsequently indicating that receiving is not supported + */ +#define SSL_OP_NO_TX_CERTIFICATE_COMPRESSION SSL_OP_BIT(32) +#define SSL_OP_NO_RX_CERTIFICATE_COMPRESSION SSL_OP_BIT(33) +/* Enable KTLS TX zerocopy on Linux */ +#define SSL_OP_ENABLE_KTLS_TX_ZEROCOPY_SENDFILE SSL_OP_BIT(34) + +#define SSL_OP_PREFER_NO_DHE_KEX SSL_OP_BIT(35) + +/* + * Option "collections." + */ +#define SSL_OP_NO_SSL_MASK \ + (SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 \ + | SSL_OP_NO_TLSv1_2 | SSL_OP_NO_TLSv1_3) +#define SSL_OP_NO_DTLS_MASK \ + (SSL_OP_NO_DTLSv1 | SSL_OP_NO_DTLSv1_2) + +/* Various bug workarounds that should be rather harmless. */ +#define SSL_OP_ALL \ + (SSL_OP_CRYPTOPRO_TLSEXT_BUG | SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS \ + | SSL_OP_TLSEXT_PADDING | SSL_OP_SAFARI_ECDHE_ECDSA_BUG) + +/* + * OBSOLETE OPTIONS retained for compatibility + */ + +#define SSL_OP_MICROSOFT_SESS_ID_BUG 0x0 +#define SSL_OP_NETSCAPE_CHALLENGE_BUG 0x0 +#define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x0 +#define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x0 +#define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0x0 +#define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x0 +#define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x0 +#define SSL_OP_TLS_D5_BUG 0x0 +#define SSL_OP_TLS_BLOCK_PADDING_BUG 0x0 +#define SSL_OP_SINGLE_ECDH_USE 0x0 +#define SSL_OP_SINGLE_DH_USE 0x0 +#define SSL_OP_EPHEMERAL_RSA 0x0 +#define SSL_OP_NO_SSLv2 0x0 +#define SSL_OP_PKCS1_CHECK_1 0x0 +#define SSL_OP_PKCS1_CHECK_2 0x0 +#define SSL_OP_NETSCAPE_CA_DN_BUG 0x0 +#define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 0x0 + +/* + * Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success + * when just a single record has been written): + */ +#define SSL_MODE_ENABLE_PARTIAL_WRITE 0x00000001U +/* + * Make it possible to retry SSL_write() with changed buffer location (buffer + * contents must stay the same!); this is not the default to avoid the + * misconception that non-blocking SSL_write() behaves like non-blocking + * write(): + */ +#define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002U +/* + * Never bother the application with retries if the transport is blocking: + */ +#define SSL_MODE_AUTO_RETRY 0x00000004U +/* Don't attempt to automatically build certificate chain */ +#define SSL_MODE_NO_AUTO_CHAIN 0x00000008U +/* + * Save RAM by releasing read and write buffers when they're empty. (SSL3 and + * TLS only.) Released buffers are freed. + */ +#define SSL_MODE_RELEASE_BUFFERS 0x00000010U +/* + * Send the current time in the Random fields of the ClientHello and + * ServerHello records for compatibility with hypothetical implementations + * that require it. + */ +#define SSL_MODE_SEND_CLIENTHELLO_TIME 0x00000020U +#define SSL_MODE_SEND_SERVERHELLO_TIME 0x00000040U +/* + * Send TLS_FALLBACK_SCSV in the ClientHello. To be set only by applications + * that reconnect with a downgraded protocol version; see + * draft-ietf-tls-downgrade-scsv-00 for details. DO NOT ENABLE THIS if your + * application attempts a normal handshake. Only use this in explicit + * fallback retries, following the guidance in + * draft-ietf-tls-downgrade-scsv-00. + */ +#define SSL_MODE_SEND_FALLBACK_SCSV 0x00000080U +/* + * Support Asynchronous operation + */ +#define SSL_MODE_ASYNC 0x00000100U + +/* + * When using DTLS/SCTP, include the terminating zero in the label + * used for computing the endpoint-pair shared secret. Required for + * interoperability with implementations having this bug like these + * older version of OpenSSL: + * - OpenSSL 1.0.0 series + * - OpenSSL 1.0.1 series + * - OpenSSL 1.0.2 series + * - OpenSSL 1.1.0 series + * - OpenSSL 1.1.1 and 1.1.1a + */ +#define SSL_MODE_DTLS_SCTP_LABEL_LENGTH_BUG 0x00000400U + +/* Cert related flags */ +/* + * Many implementations ignore some aspects of the TLS standards such as + * enforcing certificate chain algorithms. When this is set we enforce them. + */ +#define SSL_CERT_FLAG_TLS_STRICT 0x00000001U + +/* Suite B modes, takes same values as certificate verify flags */ +#define SSL_CERT_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +#define SSL_CERT_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +#define SSL_CERT_FLAG_SUITEB_128_LOS 0x30000 + +/* Perform all sorts of protocol violations for testing purposes */ +#define SSL_CERT_FLAG_BROKEN_PROTOCOL 0x10000000 + +/* Flags for building certificate chains */ +/* Treat any existing certificates as untrusted CAs */ +#define SSL_BUILD_CHAIN_FLAG_UNTRUSTED 0x1 +/* Don't include root CA in chain */ +#define SSL_BUILD_CHAIN_FLAG_NO_ROOT 0x2 +/* Just check certificates already there */ +#define SSL_BUILD_CHAIN_FLAG_CHECK 0x4 +/* Ignore verification errors */ +#define SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR 0x8 +/* Clear verification errors from queue */ +#define SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR 0x10 + +/* Flags returned by SSL_check_chain */ +/* Certificate can be used with this session */ +#define CERT_PKEY_VALID 0x1 +/* Certificate can also be used for signing */ +#define CERT_PKEY_SIGN 0x2 +/* EE certificate signing algorithm OK */ +#define CERT_PKEY_EE_SIGNATURE 0x10 +/* CA signature algorithms OK */ +#define CERT_PKEY_CA_SIGNATURE 0x20 +/* EE certificate parameters OK */ +#define CERT_PKEY_EE_PARAM 0x40 +/* CA certificate parameters OK */ +#define CERT_PKEY_CA_PARAM 0x80 +/* Signing explicitly allowed as opposed to SHA1 fallback */ +#define CERT_PKEY_EXPLICIT_SIGN 0x100 +/* Client CA issuer names match (always set for server cert) */ +#define CERT_PKEY_ISSUER_NAME 0x200 +/* Cert type matches client types (always set for server cert) */ +#define CERT_PKEY_CERT_TYPE 0x400 +/* Cert chain suitable to Suite B */ +#define CERT_PKEY_SUITEB 0x800 +/* Cert pkey valid for raw public key use */ +#define CERT_PKEY_RPK 0x1000 + +#define SSL_CONF_FLAG_CMDLINE 0x1 +#define SSL_CONF_FLAG_FILE 0x2 +#define SSL_CONF_FLAG_CLIENT 0x4 +#define SSL_CONF_FLAG_SERVER 0x8 +#define SSL_CONF_FLAG_SHOW_ERRORS 0x10 +#define SSL_CONF_FLAG_CERTIFICATE 0x20 +#define SSL_CONF_FLAG_REQUIRE_PRIVATE 0x40 +/* Configuration value types */ +#define SSL_CONF_TYPE_UNKNOWN 0x0 +#define SSL_CONF_TYPE_STRING 0x1 +#define SSL_CONF_TYPE_FILE 0x2 +#define SSL_CONF_TYPE_DIR 0x3 +#define SSL_CONF_TYPE_NONE 0x4 +#define SSL_CONF_TYPE_STORE 0x5 + +/* Maximum length of the application-controlled segment of a a TLSv1.3 cookie */ +#define SSL_COOKIE_LENGTH 4096 + +/* + * Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value, they + * cannot be used to clear bits. + */ + +uint64_t SSL_CTX_get_options(const SSL_CTX *ctx); +uint64_t SSL_get_options(const SSL *s); +uint64_t SSL_CTX_clear_options(SSL_CTX *ctx, uint64_t op); +uint64_t SSL_clear_options(SSL *s, uint64_t op); +uint64_t SSL_CTX_set_options(SSL_CTX *ctx, uint64_t op); +uint64_t SSL_set_options(SSL *s, uint64_t op); + +#define SSL_CTX_set_mode(ctx, op) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_MODE, (op), NULL) +#define SSL_CTX_clear_mode(ctx, op) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_CLEAR_MODE, (op), NULL) +#define SSL_CTX_get_mode(ctx) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_MODE, 0, NULL) +#define SSL_clear_mode(ssl, op) \ + SSL_ctrl((ssl), SSL_CTRL_CLEAR_MODE, (op), NULL) +#define SSL_set_mode(ssl, op) \ + SSL_ctrl((ssl), SSL_CTRL_MODE, (op), NULL) +#define SSL_get_mode(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_MODE, 0, NULL) +#define SSL_set_mtu(ssl, mtu) \ + SSL_ctrl((ssl), SSL_CTRL_SET_MTU, (mtu), NULL) +#define DTLS_set_link_mtu(ssl, mtu) \ + SSL_ctrl((ssl), DTLS_CTRL_SET_LINK_MTU, (mtu), NULL) +#define DTLS_get_link_min_mtu(ssl) \ + SSL_ctrl((ssl), DTLS_CTRL_GET_LINK_MIN_MTU, 0, NULL) + +#define SSL_get_secure_renegotiation_support(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_GET_RI_SUPPORT, 0, NULL) + +#define SSL_CTX_set_cert_flags(ctx, op) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_CERT_FLAGS, (op), NULL) +#define SSL_set_cert_flags(s, op) \ + SSL_ctrl((s), SSL_CTRL_CERT_FLAGS, (op), NULL) +#define SSL_CTX_clear_cert_flags(ctx, op) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_CLEAR_CERT_FLAGS, (op), NULL) +#define SSL_clear_cert_flags(s, op) \ + SSL_ctrl((s), SSL_CTRL_CLEAR_CERT_FLAGS, (op), NULL) + +void SSL_CTX_set_msg_callback(SSL_CTX *ctx, + void (*cb)(int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +void SSL_set_msg_callback(SSL *ssl, + void (*cb)(int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +#define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) +#define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) + +#define SSL_get_extms_support(s) \ + SSL_ctrl((s), SSL_CTRL_GET_EXTMS_SUPPORT, 0, NULL) + +#ifndef OPENSSL_NO_SRP +/* see tls_srp.c */ +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 __owur int SSL_SRP_CTX_init(SSL *s); +OSSL_DEPRECATEDIN_3_0 __owur int SSL_CTX_SRP_CTX_init(SSL_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 int SSL_SRP_CTX_free(SSL *ctx); +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_SRP_CTX_free(SSL_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 __owur int SSL_srp_server_param_with_username(SSL *s, + int *ad); +OSSL_DEPRECATEDIN_3_0 __owur int SRP_Calc_A_param(SSL *s); +#endif +#endif + +/* 100k max cert list */ +#define SSL_MAX_CERT_LIST_DEFAULT (1024 * 100) + +#define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT (1024 * 20) + +/* + * This callback type is used inside SSL_CTX, SSL, and in the functions that + * set them. It is used to override the generation of SSL/TLS session IDs in + * a server. Return value should be zero on an error, non-zero to proceed. + * Also, callbacks should themselves check if the id they generate is unique + * otherwise the SSL handshake will fail with an error - callbacks can do + * this using the 'ssl' value they're passed by; + * SSL_has_matching_session_id(ssl, id, *id_len) The length value passed in + * is set at the maximum size the session ID can be. In SSLv3/TLSv1 it is 32 + * bytes. The callback can alter this length to be less if desired. It is + * also an error for the callback to set the size to zero. + */ +typedef int (*GEN_SESSION_CB)(SSL *ssl, unsigned char *id, + unsigned int *id_len); + +#define SSL_SESS_CACHE_OFF 0x0000 +#define SSL_SESS_CACHE_CLIENT 0x0001 +#define SSL_SESS_CACHE_SERVER 0x0002 +#define SSL_SESS_CACHE_BOTH (SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_SERVER) +#define SSL_SESS_CACHE_NO_AUTO_CLEAR 0x0080 +/* enough comments already ... see SSL_CTX_set_session_cache_mode(3) */ +#define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP 0x0100 +#define SSL_SESS_CACHE_NO_INTERNAL_STORE 0x0200 +#define SSL_SESS_CACHE_NO_INTERNAL \ + (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP | SSL_SESS_CACHE_NO_INTERNAL_STORE) +#define SSL_SESS_CACHE_UPDATE_TIME 0x0400 + +LHASH_OF(SSL_SESSION) *SSL_CTX_sessions(SSL_CTX *ctx); +#define SSL_CTX_sess_number(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_NUMBER, 0, NULL) +#define SSL_CTX_sess_connect(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_CONNECT, 0, NULL) +#define SSL_CTX_sess_connect_good(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_CONNECT_GOOD, 0, NULL) +#define SSL_CTX_sess_connect_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_CONNECT_RENEGOTIATE, 0, NULL) +#define SSL_CTX_sess_accept(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_ACCEPT, 0, NULL) +#define SSL_CTX_sess_accept_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_ACCEPT_RENEGOTIATE, 0, NULL) +#define SSL_CTX_sess_accept_good(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_ACCEPT_GOOD, 0, NULL) +#define SSL_CTX_sess_hits(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_HIT, 0, NULL) +#define SSL_CTX_sess_cb_hits(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_CB_HIT, 0, NULL) +#define SSL_CTX_sess_misses(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_MISSES, 0, NULL) +#define SSL_CTX_sess_timeouts(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_TIMEOUTS, 0, NULL) +#define SSL_CTX_sess_cache_full(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_CACHE_FULL, 0, NULL) + +void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, + int (*new_session_cb)(struct ssl_st *ssl, + SSL_SESSION *sess)); +int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx))(struct ssl_st *ssl, + SSL_SESSION *sess); +void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, + void (*remove_session_cb)(struct ssl_ctx_st + *ctx, + SSL_SESSION *sess)); +void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx))(struct ssl_ctx_st *ctx, + SSL_SESSION *sess); +void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, + SSL_SESSION *(*get_session_cb)(struct ssl_st + *ssl, + const unsigned char + *data, + int len, + int *copy)); +SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx))(struct ssl_st *ssl, + const unsigned char *data, + int len, int *copy); +void SSL_CTX_set_info_callback(SSL_CTX *ctx, + void (*cb)(const SSL *ssl, int type, int val)); +void (*SSL_CTX_get_info_callback(SSL_CTX *ctx))(const SSL *ssl, int type, + int val); +void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, + int (*client_cert_cb)(SSL *ssl, X509 **x509, + EVP_PKEY **pkey)); +int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx))(SSL *ssl, X509 **x509, + EVP_PKEY **pkey); +#ifndef OPENSSL_NO_ENGINE +__owur int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e); +#endif +void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, + int (*app_gen_cookie_cb)(SSL *ssl, + unsigned char + *cookie, + unsigned int + *cookie_len)); +void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, + int (*app_verify_cookie_cb)(SSL *ssl, + const unsigned char *cookie, + unsigned int + cookie_len)); + +void SSL_CTX_set_stateless_cookie_generate_cb( + SSL_CTX *ctx, + int (*gen_stateless_cookie_cb)(SSL *ssl, + unsigned char *cookie, + size_t *cookie_len)); +void SSL_CTX_set_stateless_cookie_verify_cb( + SSL_CTX *ctx, + int (*verify_stateless_cookie_cb)(SSL *ssl, + const unsigned char *cookie, + size_t cookie_len)); +#ifndef OPENSSL_NO_NEXTPROTONEG + +typedef int (*SSL_CTX_npn_advertised_cb_func)(SSL *ssl, + const unsigned char **out, + unsigned int *outlen, + void *arg); +void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *s, + SSL_CTX_npn_advertised_cb_func cb, + void *arg); +#define SSL_CTX_set_npn_advertised_cb SSL_CTX_set_next_protos_advertised_cb + +typedef int (*SSL_CTX_npn_select_cb_func)(SSL *s, + unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg); +void SSL_CTX_set_next_proto_select_cb(SSL_CTX *s, + SSL_CTX_npn_select_cb_func cb, + void *arg); +#define SSL_CTX_set_npn_select_cb SSL_CTX_set_next_proto_select_cb + +void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, + unsigned *len); +#define SSL_get0_npn_negotiated SSL_get0_next_proto_negotiated +#endif + +__owur int SSL_select_next_proto(unsigned char **out, unsigned char *outlen, + const unsigned char *in, unsigned int inlen, + const unsigned char *client, + unsigned int client_len); + +#define OPENSSL_NPN_UNSUPPORTED 0 +#define OPENSSL_NPN_NEGOTIATED 1 +#define OPENSSL_NPN_NO_OVERLAP 2 + +__owur int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, + unsigned int protos_len); +__owur int SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos, + unsigned int protos_len); +typedef int (*SSL_CTX_alpn_select_cb_func)(SSL *ssl, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg); +void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx, + SSL_CTX_alpn_select_cb_func cb, + void *arg); +void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data, + unsigned int *len); + +#ifndef OPENSSL_NO_PSK +/* + * the maximum length of the buffer given to callbacks containing the + * resulting identity/psk + */ +#define PSK_MAX_IDENTITY_LEN 256 +#define PSK_MAX_PSK_LEN 512 +typedef unsigned int (*SSL_psk_client_cb_func)(SSL *ssl, + const char *hint, + char *identity, + unsigned int max_identity_len, + unsigned char *psk, + unsigned int max_psk_len); +void SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, SSL_psk_client_cb_func cb); +void SSL_set_psk_client_callback(SSL *ssl, SSL_psk_client_cb_func cb); + +typedef unsigned int (*SSL_psk_server_cb_func)(SSL *ssl, + const char *identity, + unsigned char *psk, + unsigned int max_psk_len); +void SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, SSL_psk_server_cb_func cb); +void SSL_set_psk_server_callback(SSL *ssl, SSL_psk_server_cb_func cb); + +__owur int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint); +__owur int SSL_use_psk_identity_hint(SSL *s, const char *identity_hint); +const char *SSL_get_psk_identity_hint(const SSL *s); +const char *SSL_get_psk_identity(const SSL *s); +#endif + +typedef int (*SSL_psk_find_session_cb_func)(SSL *ssl, + const unsigned char *identity, + size_t identity_len, + SSL_SESSION **sess); +typedef int (*SSL_psk_use_session_cb_func)(SSL *ssl, const EVP_MD *md, + const unsigned char **id, + size_t *idlen, + SSL_SESSION **sess); + +void SSL_set_psk_find_session_callback(SSL *s, SSL_psk_find_session_cb_func cb); +void SSL_CTX_set_psk_find_session_callback(SSL_CTX *ctx, + SSL_psk_find_session_cb_func cb); +void SSL_set_psk_use_session_callback(SSL *s, SSL_psk_use_session_cb_func cb); +void SSL_CTX_set_psk_use_session_callback(SSL_CTX *ctx, + SSL_psk_use_session_cb_func cb); + +/* Register callbacks to handle custom TLS Extensions for client or server. */ + +__owur int SSL_CTX_has_client_custom_ext(const SSL_CTX *ctx, + unsigned int ext_type); + +__owur int SSL_CTX_add_client_custom_ext(SSL_CTX *ctx, + unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +__owur int SSL_CTX_add_server_custom_ext(SSL_CTX *ctx, + unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +__owur int SSL_CTX_add_custom_ext(SSL_CTX *ctx, unsigned int ext_type, + unsigned int context, + SSL_custom_ext_add_cb_ex add_cb, + SSL_custom_ext_free_cb_ex free_cb, + void *add_arg, + SSL_custom_ext_parse_cb_ex parse_cb, + void *parse_arg); + +__owur int SSL_extension_supported(unsigned int ext_type); + +#define SSL_NOTHING 1 +#define SSL_WRITING 2 +#define SSL_READING 3 +#define SSL_X509_LOOKUP 4 +#define SSL_ASYNC_PAUSED 5 +#define SSL_ASYNC_NO_JOBS 6 +#define SSL_CLIENT_HELLO_CB 7 +#define SSL_RETRY_VERIFY 8 + +/* These will only be used when doing non-blocking IO */ +#define SSL_want_nothing(s) (SSL_want(s) == SSL_NOTHING) +#define SSL_want_read(s) (SSL_want(s) == SSL_READING) +#define SSL_want_write(s) (SSL_want(s) == SSL_WRITING) +#define SSL_want_x509_lookup(s) (SSL_want(s) == SSL_X509_LOOKUP) +#define SSL_want_retry_verify(s) (SSL_want(s) == SSL_RETRY_VERIFY) +#define SSL_want_async(s) (SSL_want(s) == SSL_ASYNC_PAUSED) +#define SSL_want_async_job(s) (SSL_want(s) == SSL_ASYNC_NO_JOBS) +#define SSL_want_client_hello_cb(s) (SSL_want(s) == SSL_CLIENT_HELLO_CB) + +#define SSL_MAC_FLAG_READ_MAC_STREAM 1 +#define SSL_MAC_FLAG_WRITE_MAC_STREAM 2 +#define SSL_MAC_FLAG_READ_MAC_TLSTREE 4 +#define SSL_MAC_FLAG_WRITE_MAC_TLSTREE 8 + +/* + * A callback for logging out TLS key material. This callback should log out + * |line| followed by a newline. + */ +typedef void (*SSL_CTX_keylog_cb_func)(const SSL *ssl, const char *line); + +/* + * SSL_CTX_set_keylog_callback configures a callback to log key material. This + * is intended for debugging use with tools like Wireshark. The cb function + * should log line followed by a newline. + */ +void SSL_CTX_set_keylog_callback(SSL_CTX *ctx, SSL_CTX_keylog_cb_func cb); + +/* + * SSL_CTX_get_keylog_callback returns the callback configured by + * SSL_CTX_set_keylog_callback. + */ +SSL_CTX_keylog_cb_func SSL_CTX_get_keylog_callback(const SSL_CTX *ctx); + +int SSL_CTX_set_max_early_data(SSL_CTX *ctx, uint32_t max_early_data); +uint32_t SSL_CTX_get_max_early_data(const SSL_CTX *ctx); +int SSL_set_max_early_data(SSL *s, uint32_t max_early_data); +uint32_t SSL_get_max_early_data(const SSL *s); +int SSL_CTX_set_recv_max_early_data(SSL_CTX *ctx, uint32_t recv_max_early_data); +uint32_t SSL_CTX_get_recv_max_early_data(const SSL_CTX *ctx); +int SSL_set_recv_max_early_data(SSL *s, uint32_t recv_max_early_data); +uint32_t SSL_get_recv_max_early_data(const SSL *s); + +#ifdef __cplusplus +} +#endif + +#include +#include +#include /* This is mostly sslv3 with a few tweaks */ +#include /* Datagram TLS */ +#include /* Support for the use_srtp extension */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * These need to be after the above set of includes due to a compiler bug + * in VisualStudio 2015 + */ +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SSL_CIPHER, const SSL_CIPHER, SSL_CIPHER) +#define sk_SSL_CIPHER_num(sk) OPENSSL_sk_num(ossl_check_const_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_value(sk, idx) ((const SSL_CIPHER *)OPENSSL_sk_value(ossl_check_const_SSL_CIPHER_sk_type(sk), (idx))) +#define sk_SSL_CIPHER_new(cmp) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new(ossl_check_SSL_CIPHER_compfunc_type(cmp))) +#define sk_SSL_CIPHER_new_null() ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new_null()) +#define sk_SSL_CIPHER_new_reserve(cmp, n) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new_reserve(ossl_check_SSL_CIPHER_compfunc_type(cmp), (n))) +#define sk_SSL_CIPHER_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SSL_CIPHER_sk_type(sk), (n)) +#define sk_SSL_CIPHER_free(sk) OPENSSL_sk_free(ossl_check_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_zero(sk) OPENSSL_sk_zero(ossl_check_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_delete(sk, i) ((const SSL_CIPHER *)OPENSSL_sk_delete(ossl_check_SSL_CIPHER_sk_type(sk), (i))) +#define sk_SSL_CIPHER_delete_ptr(sk, ptr) ((const SSL_CIPHER *)OPENSSL_sk_delete_ptr(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))) +#define sk_SSL_CIPHER_push(sk, ptr) OPENSSL_sk_push(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)) +#define sk_SSL_CIPHER_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)) +#define sk_SSL_CIPHER_pop(sk) ((const SSL_CIPHER *)OPENSSL_sk_pop(ossl_check_SSL_CIPHER_sk_type(sk))) +#define sk_SSL_CIPHER_shift(sk) ((const SSL_CIPHER *)OPENSSL_sk_shift(ossl_check_SSL_CIPHER_sk_type(sk))) +#define sk_SSL_CIPHER_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SSL_CIPHER_sk_type(sk),ossl_check_SSL_CIPHER_freefunc_type(freefunc)) +#define sk_SSL_CIPHER_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr), (idx)) +#define sk_SSL_CIPHER_set(sk, idx, ptr) ((const SSL_CIPHER *)OPENSSL_sk_set(ossl_check_SSL_CIPHER_sk_type(sk), (idx), ossl_check_SSL_CIPHER_type(ptr))) +#define sk_SSL_CIPHER_find(sk, ptr) OPENSSL_sk_find(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)) +#define sk_SSL_CIPHER_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)) +#define sk_SSL_CIPHER_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr), pnum) +#define sk_SSL_CIPHER_sort(sk) OPENSSL_sk_sort(ossl_check_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_dup(sk) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_dup(ossl_check_const_SSL_CIPHER_sk_type(sk))) +#define sk_SSL_CIPHER_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_deep_copy(ossl_check_const_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_copyfunc_type(copyfunc), ossl_check_SSL_CIPHER_freefunc_type(freefunc))) +#define sk_SSL_CIPHER_set_cmp_func(sk, cmp) ((sk_SSL_CIPHER_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_compfunc_type(cmp))) + +/* clang-format on */ + +/* compatibility */ +#define SSL_set_app_data(s, arg) (SSL_set_ex_data(s, 0, (char *)(arg))) +#define SSL_get_app_data(s) (SSL_get_ex_data(s, 0)) +#define SSL_SESSION_set_app_data(s, a) (SSL_SESSION_set_ex_data(s, 0, \ + (char *)(a))) +#define SSL_SESSION_get_app_data(s) (SSL_SESSION_get_ex_data(s, 0)) +#define SSL_CTX_get_app_data(ctx) (SSL_CTX_get_ex_data(ctx, 0)) +#define SSL_CTX_set_app_data(ctx, arg) (SSL_CTX_set_ex_data(ctx, 0, \ + (char *)(arg))) +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 void SSL_set_debug(SSL *s, int debug); +#endif + +/* TLSv1.3 KeyUpdate message types */ +/* -1 used so that this is an invalid value for the on-the-wire protocol */ +#define SSL_KEY_UPDATE_NONE -1 +/* Values as defined for the on-the-wire protocol */ +#define SSL_KEY_UPDATE_NOT_REQUESTED 0 +#define SSL_KEY_UPDATE_REQUESTED 1 + +/* + * The valid handshake states (one for each type message sent and one for each + * type of message received). There are also two "special" states: + * TLS = TLS or DTLS state + * DTLS = DTLS specific state + * CR/SR = Client Read/Server Read + * CW/SW = Client Write/Server Write + * + * The "special" states are: + * TLS_ST_BEFORE = No handshake has been initiated yet + * TLS_ST_OK = A handshake has been successfully completed + */ +typedef enum { + TLS_ST_BEFORE, + TLS_ST_OK, + DTLS_ST_CR_HELLO_VERIFY_REQUEST, + TLS_ST_CR_SRVR_HELLO, + TLS_ST_CR_CERT, + TLS_ST_CR_COMP_CERT, + TLS_ST_CR_CERT_STATUS, + TLS_ST_CR_KEY_EXCH, + TLS_ST_CR_CERT_REQ, + TLS_ST_CR_SRVR_DONE, + TLS_ST_CR_SESSION_TICKET, + TLS_ST_CR_CHANGE, + TLS_ST_CR_FINISHED, + TLS_ST_CW_CLNT_HELLO, + TLS_ST_CW_CERT, + TLS_ST_CW_COMP_CERT, + TLS_ST_CW_KEY_EXCH, + TLS_ST_CW_CERT_VRFY, + TLS_ST_CW_CHANGE, + TLS_ST_CW_NEXT_PROTO, + TLS_ST_CW_FINISHED, + TLS_ST_SW_HELLO_REQ, + TLS_ST_SR_CLNT_HELLO, + DTLS_ST_SW_HELLO_VERIFY_REQUEST, + TLS_ST_SW_SRVR_HELLO, + TLS_ST_SW_CERT, + TLS_ST_SW_COMP_CERT, + TLS_ST_SW_KEY_EXCH, + TLS_ST_SW_CERT_REQ, + TLS_ST_SW_SRVR_DONE, + TLS_ST_SR_CERT, + TLS_ST_SR_COMP_CERT, + TLS_ST_SR_KEY_EXCH, + TLS_ST_SR_CERT_VRFY, + TLS_ST_SR_NEXT_PROTO, + TLS_ST_SR_CHANGE, + TLS_ST_SR_FINISHED, + TLS_ST_SW_SESSION_TICKET, + TLS_ST_SW_CERT_STATUS, + TLS_ST_SW_CHANGE, + TLS_ST_SW_FINISHED, + TLS_ST_SW_ENCRYPTED_EXTENSIONS, + TLS_ST_CR_ENCRYPTED_EXTENSIONS, + TLS_ST_CR_CERT_VRFY, + TLS_ST_SW_CERT_VRFY, + TLS_ST_CR_HELLO_REQ, + TLS_ST_SW_KEY_UPDATE, + TLS_ST_CW_KEY_UPDATE, + TLS_ST_SR_KEY_UPDATE, + TLS_ST_CR_KEY_UPDATE, + TLS_ST_EARLY_DATA, + TLS_ST_PENDING_EARLY_DATA_END, + TLS_ST_CW_END_OF_EARLY_DATA, + TLS_ST_SR_END_OF_EARLY_DATA +} OSSL_HANDSHAKE_STATE; + +/* + * Most of the following state values are no longer used and are defined to be + * the closest equivalent value in the current state machine code. Not all + * defines have an equivalent and are set to a dummy value (-1). SSL_ST_CONNECT + * and SSL_ST_ACCEPT are still in use in the definition of SSL_CB_ACCEPT_LOOP, + * SSL_CB_ACCEPT_EXIT, SSL_CB_CONNECT_LOOP and SSL_CB_CONNECT_EXIT. + */ + +#define SSL_ST_CONNECT 0x1000 +#define SSL_ST_ACCEPT 0x2000 + +#define SSL_ST_MASK 0x0FFF + +#define SSL_CB_LOOP 0x01 +#define SSL_CB_EXIT 0x02 +#define SSL_CB_READ 0x04 +#define SSL_CB_WRITE 0x08 +#define SSL_CB_ALERT 0x4000 /* used in callback */ +#define SSL_CB_READ_ALERT (SSL_CB_ALERT | SSL_CB_READ) +#define SSL_CB_WRITE_ALERT (SSL_CB_ALERT | SSL_CB_WRITE) +#define SSL_CB_ACCEPT_LOOP (SSL_ST_ACCEPT | SSL_CB_LOOP) +#define SSL_CB_ACCEPT_EXIT (SSL_ST_ACCEPT | SSL_CB_EXIT) +#define SSL_CB_CONNECT_LOOP (SSL_ST_CONNECT | SSL_CB_LOOP) +#define SSL_CB_CONNECT_EXIT (SSL_ST_CONNECT | SSL_CB_EXIT) +#define SSL_CB_HANDSHAKE_START 0x10 +#define SSL_CB_HANDSHAKE_DONE 0x20 + +/* Is the SSL_connection established? */ +#define SSL_in_connect_init(a) (SSL_in_init(a) && !SSL_is_server(a)) +#define SSL_in_accept_init(a) (SSL_in_init(a) && SSL_is_server(a)) +int SSL_in_init(const SSL *s); +int SSL_in_before(const SSL *s); +int SSL_is_init_finished(const SSL *s); + +/* + * The following 3 states are kept in ssl->rlayer.rstate when reads fail, you + * should not need these + */ +#define SSL_ST_READ_HEADER 0xF0 +#define SSL_ST_READ_BODY 0xF1 +#define SSL_ST_READ_DONE 0xF2 + +/*- + * Obtain latest Finished message + * -- that we sent (SSL_get_finished) + * -- that we expected from peer (SSL_get_peer_finished). + * Returns length (0 == no Finished so far), copies up to 'count' bytes. + */ +size_t SSL_get_finished(const SSL *s, void *buf, size_t count); +size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count); + +/* + * use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 3 options are + * 'ored' with SSL_VERIFY_PEER if they are desired + */ +#define SSL_VERIFY_NONE 0x00 +#define SSL_VERIFY_PEER 0x01 +#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 +#define SSL_VERIFY_CLIENT_ONCE 0x04 +#define SSL_VERIFY_POST_HANDSHAKE 0x08 + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define OpenSSL_add_ssl_algorithms() SSL_library_init() +#define SSLeay_add_ssl_algorithms() SSL_library_init() +#endif + +/* More backward compatibility */ +#define SSL_get_cipher(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +#define SSL_get_cipher_bits(s, np) \ + SSL_CIPHER_get_bits(SSL_get_current_cipher(s), np) +#define SSL_get_cipher_version(s) \ + SSL_CIPHER_get_version(SSL_get_current_cipher(s)) +#define SSL_get_cipher_name(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +#define SSL_get_time(a) SSL_SESSION_get_time(a) +#define SSL_set_time(a, b) SSL_SESSION_set_time((a), (b)) +#define SSL_get_timeout(a) SSL_SESSION_get_timeout(a) +#define SSL_set_timeout(a, b) SSL_SESSION_set_timeout((a), (b)) + +#define d2i_SSL_SESSION_bio(bp, s_id) ASN1_d2i_bio_of(SSL_SESSION, SSL_SESSION_new, d2i_SSL_SESSION, bp, s_id) +#define i2d_SSL_SESSION_bio(bp, s_id) ASN1_i2d_bio_of(SSL_SESSION, i2d_SSL_SESSION, bp, s_id) + +DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) +#define SSL_AD_REASON_OFFSET 1000 /* offset to get SSL_R_... value \ + * from SSL_AD_... */ +/* These alert types are for SSLv3 and TLSv1 */ +#define SSL_AD_CLOSE_NOTIFY SSL3_AD_CLOSE_NOTIFY +/* fatal */ +#define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE +/* fatal */ +#define SSL_AD_BAD_RECORD_MAC SSL3_AD_BAD_RECORD_MAC +#define SSL_AD_DECRYPTION_FAILED TLS1_AD_DECRYPTION_FAILED +#define SSL_AD_RECORD_OVERFLOW TLS1_AD_RECORD_OVERFLOW +/* fatal */ +#define SSL_AD_DECOMPRESSION_FAILURE SSL3_AD_DECOMPRESSION_FAILURE +/* fatal */ +#define SSL_AD_HANDSHAKE_FAILURE SSL3_AD_HANDSHAKE_FAILURE +/* Not for TLS */ +#define SSL_AD_NO_CERTIFICATE SSL3_AD_NO_CERTIFICATE +#define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE +#define SSL_AD_UNSUPPORTED_CERTIFICATE SSL3_AD_UNSUPPORTED_CERTIFICATE +#define SSL_AD_CERTIFICATE_REVOKED SSL3_AD_CERTIFICATE_REVOKED +#define SSL_AD_CERTIFICATE_EXPIRED SSL3_AD_CERTIFICATE_EXPIRED +#define SSL_AD_CERTIFICATE_UNKNOWN SSL3_AD_CERTIFICATE_UNKNOWN +/* fatal */ +#define SSL_AD_ILLEGAL_PARAMETER SSL3_AD_ILLEGAL_PARAMETER +/* fatal */ +#define SSL_AD_UNKNOWN_CA TLS1_AD_UNKNOWN_CA +/* fatal */ +#define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED +/* fatal */ +#define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR +#define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR +/* fatal */ +#define SSL_AD_EXPORT_RESTRICTION TLS1_AD_EXPORT_RESTRICTION +/* fatal */ +#define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION +/* fatal */ +#define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY +/* fatal */ +#define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR +#define SSL_AD_USER_CANCELLED TLS1_AD_USER_CANCELLED +#define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION +#define SSL_AD_MISSING_EXTENSION TLS13_AD_MISSING_EXTENSION +#define SSL_AD_CERTIFICATE_REQUIRED TLS13_AD_CERTIFICATE_REQUIRED +#define SSL_AD_UNSUPPORTED_EXTENSION TLS1_AD_UNSUPPORTED_EXTENSION +#define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE +#define SSL_AD_UNRECOGNIZED_NAME TLS1_AD_UNRECOGNIZED_NAME +#define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE +#define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE +/* fatal */ +#define SSL_AD_UNKNOWN_PSK_IDENTITY TLS1_AD_UNKNOWN_PSK_IDENTITY +/* fatal */ +#define SSL_AD_INAPPROPRIATE_FALLBACK TLS1_AD_INAPPROPRIATE_FALLBACK +#define SSL_AD_NO_APPLICATION_PROTOCOL TLS1_AD_NO_APPLICATION_PROTOCOL +#define SSL_ERROR_NONE 0 +#define SSL_ERROR_SSL 1 +#define SSL_ERROR_WANT_READ 2 +#define SSL_ERROR_WANT_WRITE 3 +#define SSL_ERROR_WANT_X509_LOOKUP 4 +#define SSL_ERROR_SYSCALL 5 /* look at error stack/return \ + * value/errno */ +#define SSL_ERROR_ZERO_RETURN 6 +#define SSL_ERROR_WANT_CONNECT 7 +#define SSL_ERROR_WANT_ACCEPT 8 +#define SSL_ERROR_WANT_ASYNC 9 +#define SSL_ERROR_WANT_ASYNC_JOB 10 +#define SSL_ERROR_WANT_CLIENT_HELLO_CB 11 +#define SSL_ERROR_WANT_RETRY_VERIFY 12 + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SSL_CTRL_SET_TMP_DH 3 +#define SSL_CTRL_SET_TMP_ECDH 4 +#define SSL_CTRL_SET_TMP_DH_CB 6 +#endif + +#define SSL_CTRL_GET_CLIENT_CERT_REQUEST 9 +#define SSL_CTRL_GET_NUM_RENEGOTIATIONS 10 +#define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS 11 +#define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS 12 +#define SSL_CTRL_GET_FLAGS 13 +#define SSL_CTRL_EXTRA_CHAIN_CERT 14 +#define SSL_CTRL_SET_MSG_CALLBACK 15 +#define SSL_CTRL_SET_MSG_CALLBACK_ARG 16 +/* only applies to datagram connections */ +#define SSL_CTRL_SET_MTU 17 +/* Stats */ +#define SSL_CTRL_SESS_NUMBER 20 +#define SSL_CTRL_SESS_CONNECT 21 +#define SSL_CTRL_SESS_CONNECT_GOOD 22 +#define SSL_CTRL_SESS_CONNECT_RENEGOTIATE 23 +#define SSL_CTRL_SESS_ACCEPT 24 +#define SSL_CTRL_SESS_ACCEPT_GOOD 25 +#define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE 26 +#define SSL_CTRL_SESS_HIT 27 +#define SSL_CTRL_SESS_CB_HIT 28 +#define SSL_CTRL_SESS_MISSES 29 +#define SSL_CTRL_SESS_TIMEOUTS 30 +#define SSL_CTRL_SESS_CACHE_FULL 31 +#define SSL_CTRL_MODE 33 +#define SSL_CTRL_GET_READ_AHEAD 40 +#define SSL_CTRL_SET_READ_AHEAD 41 +#define SSL_CTRL_SET_SESS_CACHE_SIZE 42 +#define SSL_CTRL_GET_SESS_CACHE_SIZE 43 +#define SSL_CTRL_SET_SESS_CACHE_MODE 44 +#define SSL_CTRL_GET_SESS_CACHE_MODE 45 +#define SSL_CTRL_GET_MAX_CERT_LIST 50 +#define SSL_CTRL_SET_MAX_CERT_LIST 51 +#define SSL_CTRL_SET_MAX_SEND_FRAGMENT 52 +/* see tls1.h for macros based on these */ +#define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB 53 +#define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG 54 +#define SSL_CTRL_SET_TLSEXT_HOSTNAME 55 +#define SSL_CTRL_SET_TLSEXT_DEBUG_CB 56 +#define SSL_CTRL_SET_TLSEXT_DEBUG_ARG 57 +#define SSL_CTRL_GET_TLSEXT_TICKET_KEYS 58 +#define SSL_CTRL_SET_TLSEXT_TICKET_KEYS 59 +/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT 60 */ +/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB 61 */ +/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG 62 */ +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB 63 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG 64 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE 65 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS 66 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS 67 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS 68 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS 69 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP 70 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP 71 +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB 72 +#endif +#define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB 75 +#define SSL_CTRL_SET_SRP_VERIFY_PARAM_CB 76 +#define SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB 77 +#define SSL_CTRL_SET_SRP_ARG 78 +#define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME 79 +#define SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH 80 +#define SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD 81 +#define DTLS_CTRL_GET_TIMEOUT 73 +#define DTLS_CTRL_HANDLE_TIMEOUT 74 +#define SSL_CTRL_GET_RI_SUPPORT 76 +#define SSL_CTRL_CLEAR_MODE 78 +#define SSL_CTRL_SET_NOT_RESUMABLE_SESS_CB 79 +#define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82 +#define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS 83 +#define SSL_CTRL_CHAIN 88 +#define SSL_CTRL_CHAIN_CERT 89 +#define SSL_CTRL_GET_GROUPS 90 +#define SSL_CTRL_SET_GROUPS 91 +#define SSL_CTRL_SET_GROUPS_LIST 92 +#define SSL_CTRL_GET_SHARED_GROUP 93 +#define SSL_CTRL_SET_SIGALGS 97 +#define SSL_CTRL_SET_SIGALGS_LIST 98 +#define SSL_CTRL_CERT_FLAGS 99 +#define SSL_CTRL_CLEAR_CERT_FLAGS 100 +#define SSL_CTRL_SET_CLIENT_SIGALGS 101 +#define SSL_CTRL_SET_CLIENT_SIGALGS_LIST 102 +#define SSL_CTRL_GET_CLIENT_CERT_TYPES 103 +#define SSL_CTRL_SET_CLIENT_CERT_TYPES 104 +#define SSL_CTRL_BUILD_CERT_CHAIN 105 +#define SSL_CTRL_SET_VERIFY_CERT_STORE 106 +#define SSL_CTRL_SET_CHAIN_CERT_STORE 107 +#define SSL_CTRL_GET_PEER_SIGNATURE_NID 108 +#define SSL_CTRL_GET_PEER_TMP_KEY 109 +#define SSL_CTRL_GET_RAW_CIPHERLIST 110 +#define SSL_CTRL_GET_EC_POINT_FORMATS 111 +#define SSL_CTRL_GET_CHAIN_CERTS 115 +#define SSL_CTRL_SELECT_CURRENT_CERT 116 +#define SSL_CTRL_SET_CURRENT_CERT 117 +#define SSL_CTRL_SET_DH_AUTO 118 +#define DTLS_CTRL_SET_LINK_MTU 120 +#define DTLS_CTRL_GET_LINK_MIN_MTU 121 +#define SSL_CTRL_GET_EXTMS_SUPPORT 122 +#define SSL_CTRL_SET_MIN_PROTO_VERSION 123 +#define SSL_CTRL_SET_MAX_PROTO_VERSION 124 +#define SSL_CTRL_SET_SPLIT_SEND_FRAGMENT 125 +#define SSL_CTRL_SET_MAX_PIPELINES 126 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE 127 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB 128 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG 129 +#define SSL_CTRL_GET_MIN_PROTO_VERSION 130 +#define SSL_CTRL_GET_MAX_PROTO_VERSION 131 +#define SSL_CTRL_GET_SIGNATURE_NID 132 +#define SSL_CTRL_GET_TMP_KEY 133 +#define SSL_CTRL_GET_NEGOTIATED_GROUP 134 +#define SSL_CTRL_GET_IANA_GROUPS 135 +#define SSL_CTRL_SET_RETRY_VERIFY 136 +#define SSL_CTRL_GET_VERIFY_CERT_STORE 137 +#define SSL_CTRL_GET_CHAIN_CERT_STORE 138 +#define SSL_CTRL_GET0_IMPLEMENTED_GROUPS 139 +#define SSL_CTRL_GET_SIGNATURE_NAME 140 +#define SSL_CTRL_GET_PEER_SIGNATURE_NAME 141 +#define SSL_CERT_SET_FIRST 1 +#define SSL_CERT_SET_NEXT 2 +#define SSL_CERT_SET_SERVER 3 +#define DTLSv1_get_timeout(ssl, arg) \ + SSL_ctrl(ssl, DTLS_CTRL_GET_TIMEOUT, 0, (void *)(arg)) +#define DTLSv1_handle_timeout(ssl) \ + SSL_ctrl(ssl, DTLS_CTRL_HANDLE_TIMEOUT, 0, NULL) +#define SSL_num_renegotiations(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_GET_NUM_RENEGOTIATIONS, 0, NULL) +#define SSL_clear_num_renegotiations(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS, 0, NULL) +#define SSL_total_renegotiations(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_GET_TOTAL_RENEGOTIATIONS, 0, NULL) +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SSL_CTX_set_tmp_dh(ctx, dh) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_TMP_DH, 0, (char *)(dh)) +#endif +#define SSL_CTX_set_dh_auto(ctx, onoff) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_DH_AUTO, onoff, NULL) +#define SSL_set_dh_auto(s, onoff) \ + SSL_ctrl(s, SSL_CTRL_SET_DH_AUTO, onoff, NULL) +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SSL_set_tmp_dh(ssl, dh) \ + SSL_ctrl(ssl, SSL_CTRL_SET_TMP_DH, 0, (char *)(dh)) +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SSL_CTX_set_tmp_ecdh(ctx, ecdh) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_TMP_ECDH, 0, (char *)(ecdh)) +#define SSL_set_tmp_ecdh(ssl, ecdh) \ + SSL_ctrl(ssl, SSL_CTRL_SET_TMP_ECDH, 0, (char *)(ecdh)) +#endif +#define SSL_CTX_add_extra_chain_cert(ctx, x509) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_EXTRA_CHAIN_CERT, 0, (char *)(x509)) +#define SSL_CTX_get_extra_chain_certs(ctx, px509) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_EXTRA_CHAIN_CERTS, 0, px509) +#define SSL_CTX_get_extra_chain_certs_only(ctx, px509) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_EXTRA_CHAIN_CERTS, 1, px509) +#define SSL_CTX_clear_extra_chain_certs(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS, 0, NULL) +#define SSL_CTX_set0_chain(ctx, sk) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_CHAIN, 0, (char *)(sk)) +#define SSL_CTX_set1_chain(ctx, sk) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_CHAIN, 1, (char *)(sk)) +#define SSL_CTX_add0_chain_cert(ctx, x509) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_CHAIN_CERT, 0, (char *)(x509)) +#define SSL_CTX_add1_chain_cert(ctx, x509) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_CHAIN_CERT, 1, (char *)(x509)) +#define SSL_CTX_get0_chain_certs(ctx, px509) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_CHAIN_CERTS, 0, px509) +#define SSL_CTX_clear_chain_certs(ctx) \ + SSL_CTX_set0_chain(ctx, NULL) +#define SSL_CTX_build_cert_chain(ctx, flags) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +#define SSL_CTX_select_current_cert(ctx, x509) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SELECT_CURRENT_CERT, 0, (char *)(x509)) +#define SSL_CTX_set_current_cert(ctx, op) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_CURRENT_CERT, op, NULL) +#define SSL_CTX_set0_verify_cert_store(ctx, st) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_VERIFY_CERT_STORE, 0, (char *)(st)) +#define SSL_CTX_set1_verify_cert_store(ctx, st) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_VERIFY_CERT_STORE, 1, (char *)(st)) +#define SSL_CTX_get0_verify_cert_store(ctx, st) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_VERIFY_CERT_STORE, 0, (char *)(st)) +#define SSL_CTX_set0_chain_cert_store(ctx, st) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_CHAIN_CERT_STORE, 0, (char *)(st)) +#define SSL_CTX_set1_chain_cert_store(ctx, st) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_CHAIN_CERT_STORE, 1, (char *)(st)) +#define SSL_CTX_get0_chain_cert_store(ctx, st) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_CHAIN_CERT_STORE, 0, (char *)(st)) +#define SSL_set0_chain(s, sk) \ + SSL_ctrl(s, SSL_CTRL_CHAIN, 0, (char *)(sk)) +#define SSL_set1_chain(s, sk) \ + SSL_ctrl(s, SSL_CTRL_CHAIN, 1, (char *)(sk)) +#define SSL_add0_chain_cert(s, x509) \ + SSL_ctrl(s, SSL_CTRL_CHAIN_CERT, 0, (char *)(x509)) +#define SSL_add1_chain_cert(s, x509) \ + SSL_ctrl(s, SSL_CTRL_CHAIN_CERT, 1, (char *)(x509)) +#define SSL_get0_chain_certs(s, px509) \ + SSL_ctrl(s, SSL_CTRL_GET_CHAIN_CERTS, 0, px509) +#define SSL_clear_chain_certs(s) \ + SSL_set0_chain(s, NULL) +#define SSL_build_cert_chain(s, flags) \ + SSL_ctrl(s, SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +#define SSL_select_current_cert(s, x509) \ + SSL_ctrl(s, SSL_CTRL_SELECT_CURRENT_CERT, 0, (char *)(x509)) +#define SSL_set_current_cert(s, op) \ + SSL_ctrl(s, SSL_CTRL_SET_CURRENT_CERT, op, NULL) +#define SSL_set0_verify_cert_store(s, st) \ + SSL_ctrl(s, SSL_CTRL_SET_VERIFY_CERT_STORE, 0, (char *)(st)) +#define SSL_set1_verify_cert_store(s, st) \ + SSL_ctrl(s, SSL_CTRL_SET_VERIFY_CERT_STORE, 1, (char *)(st)) +#define SSL_get0_verify_cert_store(s, st) \ + SSL_ctrl(s, SSL_CTRL_GET_VERIFY_CERT_STORE, 0, (char *)(st)) +#define SSL_set0_chain_cert_store(s, st) \ + SSL_ctrl(s, SSL_CTRL_SET_CHAIN_CERT_STORE, 0, (char *)(st)) +#define SSL_set1_chain_cert_store(s, st) \ + SSL_ctrl(s, SSL_CTRL_SET_CHAIN_CERT_STORE, 1, (char *)(st)) +#define SSL_get0_chain_cert_store(s, st) \ + SSL_ctrl(s, SSL_CTRL_GET_CHAIN_CERT_STORE, 0, (char *)(st)) + +#define SSL_get1_groups(s, glist) \ + SSL_ctrl(s, SSL_CTRL_GET_GROUPS, 0, (int *)(glist)) +#define SSL_get0_iana_groups(s, plst) \ + SSL_ctrl(s, SSL_CTRL_GET_IANA_GROUPS, 0, (uint16_t **)(plst)) +#define SSL_CTX_set1_groups(ctx, glist, glistlen) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_GROUPS, glistlen, (int *)(glist)) +#define SSL_CTX_set1_groups_list(ctx, s) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_GROUPS_LIST, 0, (char *)(s)) +#define SSL_CTX_get0_implemented_groups(ctx, all, out) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET0_IMPLEMENTED_GROUPS, all, \ + (STACK_OF(OPENSSL_CSTRING) *)(out)) +#define SSL_set1_groups(s, glist, glistlen) \ + SSL_ctrl(s, SSL_CTRL_SET_GROUPS, glistlen, (char *)(glist)) +#define SSL_set1_groups_list(s, str) \ + SSL_ctrl(s, SSL_CTRL_SET_GROUPS_LIST, 0, (char *)(str)) +#define SSL_get_shared_group(s, n) \ + SSL_ctrl(s, SSL_CTRL_GET_SHARED_GROUP, n, NULL) +#define SSL_get_negotiated_group(s) \ + SSL_ctrl(s, SSL_CTRL_GET_NEGOTIATED_GROUP, 0, NULL) +#define SSL_CTX_set1_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_SIGALGS, slistlen, (int *)(slist)) +#define SSL_CTX_set1_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_SIGALGS_LIST, 0, (char *)(s)) +#define SSL_set1_sigalgs(s, slist, slistlen) \ + SSL_ctrl(s, SSL_CTRL_SET_SIGALGS, slistlen, (int *)(slist)) +#define SSL_set1_sigalgs_list(s, str) \ + SSL_ctrl(s, SSL_CTRL_SET_SIGALGS_LIST, 0, (char *)(str)) +#define SSL_CTX_set1_client_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_CLIENT_SIGALGS, slistlen, (int *)(slist)) +#define SSL_CTX_set1_client_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_CLIENT_SIGALGS_LIST, 0, (char *)(s)) +#define SSL_set1_client_sigalgs(s, slist, slistlen) \ + SSL_ctrl(s, SSL_CTRL_SET_CLIENT_SIGALGS, slistlen, (int *)(slist)) +#define SSL_set1_client_sigalgs_list(s, str) \ + SSL_ctrl(s, SSL_CTRL_SET_CLIENT_SIGALGS_LIST, 0, (char *)(str)) +#define SSL_get0_certificate_types(s, clist) \ + SSL_ctrl(s, SSL_CTRL_GET_CLIENT_CERT_TYPES, 0, (char *)(clist)) +#define SSL_CTX_set1_client_certificate_types(ctx, clist, clistlen) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_CLIENT_CERT_TYPES, clistlen, \ + (char *)(clist)) +#define SSL_set1_client_certificate_types(s, clist, clistlen) \ + SSL_ctrl(s, SSL_CTRL_SET_CLIENT_CERT_TYPES, clistlen, (char *)(clist)) +#define SSL_get0_signature_name(s, str) \ + SSL_ctrl(s, SSL_CTRL_GET_SIGNATURE_NAME, 0, (1 ? (str) : (const char **)NULL)) +#define SSL_get_signature_nid(s, pn) \ + SSL_ctrl(s, SSL_CTRL_GET_SIGNATURE_NID, 0, pn) +#define SSL_get0_peer_signature_name(s, str) \ + SSL_ctrl(s, SSL_CTRL_GET_PEER_SIGNATURE_NAME, 0, (1 ? (str) : (const char **)NULL)) +#define SSL_get_peer_signature_nid(s, pn) \ + SSL_ctrl(s, SSL_CTRL_GET_PEER_SIGNATURE_NID, 0, pn) +#define SSL_get_peer_tmp_key(s, pk) \ + SSL_ctrl(s, SSL_CTRL_GET_PEER_TMP_KEY, 0, pk) +#define SSL_get_tmp_key(s, pk) \ + SSL_ctrl(s, SSL_CTRL_GET_TMP_KEY, 0, pk) +#define SSL_get0_raw_cipherlist(s, plst) \ + SSL_ctrl(s, SSL_CTRL_GET_RAW_CIPHERLIST, 0, plst) +#define SSL_get0_ec_point_formats(s, plst) \ + SSL_ctrl(s, SSL_CTRL_GET_EC_POINT_FORMATS, 0, plst) +#define SSL_CTX_set_min_proto_version(ctx, version) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL) +#define SSL_CTX_set_max_proto_version(ctx, version) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL) +#define SSL_CTX_get_min_proto_version(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL) +#define SSL_CTX_get_max_proto_version(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL) +#define SSL_set_min_proto_version(s, version) \ + SSL_ctrl(s, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL) +#define SSL_set_max_proto_version(s, version) \ + SSL_ctrl(s, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL) +#define SSL_get_min_proto_version(s) \ + SSL_ctrl(s, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL) +#define SSL_get_max_proto_version(s) \ + SSL_ctrl(s, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL) + +const char *SSL_get0_group_name(SSL *s); +const char *SSL_group_to_name(SSL *s, int id); + +/* Backwards compatibility, original 1.1.0 names */ +#define SSL_CTRL_GET_SERVER_TMP_KEY \ + SSL_CTRL_GET_PEER_TMP_KEY +#define SSL_get_server_tmp_key(s, pk) \ + SSL_get_peer_tmp_key(s, pk) + +int SSL_set0_tmp_dh_pkey(SSL *s, EVP_PKEY *dhpkey); +int SSL_CTX_set0_tmp_dh_pkey(SSL_CTX *ctx, EVP_PKEY *dhpkey); + +/* + * The following symbol names are old and obsolete. They are kept + * for compatibility reasons only and should not be used anymore. + */ +#define SSL_CTRL_GET_CURVES SSL_CTRL_GET_GROUPS +#define SSL_CTRL_SET_CURVES SSL_CTRL_SET_GROUPS +#define SSL_CTRL_SET_CURVES_LIST SSL_CTRL_SET_GROUPS_LIST +#define SSL_CTRL_GET_SHARED_CURVE SSL_CTRL_GET_SHARED_GROUP + +#define SSL_get1_curves SSL_get1_groups +#define SSL_CTX_set1_curves SSL_CTX_set1_groups +#define SSL_CTX_set1_curves_list SSL_CTX_set1_groups_list +#define SSL_set1_curves SSL_set1_groups +#define SSL_set1_curves_list SSL_set1_groups_list +#define SSL_get_shared_curve SSL_get_shared_group + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +/* Provide some compatibility macros for removed functionality. */ +#define SSL_CTX_need_tmp_RSA(ctx) 0 +#define SSL_CTX_set_tmp_rsa(ctx, rsa) 1 +#define SSL_need_tmp_RSA(ssl) 0 +#define SSL_set_tmp_rsa(ssl, rsa) 1 +#define SSL_CTX_set_ecdh_auto(dummy, onoff) ((onoff) != 0) +#define SSL_set_ecdh_auto(dummy, onoff) ((onoff) != 0) +/* + * We "pretend" to call the callback to avoid warnings about unused static + * functions. + */ +#define SSL_CTX_set_tmp_rsa_callback(ctx, cb) \ + while (0) \ + (cb)(NULL, 0, 0) +#define SSL_set_tmp_rsa_callback(ssl, cb) \ + while (0) \ + (cb)(NULL, 0, 0) +#endif +__owur const BIO_METHOD *BIO_f_ssl(void); +__owur BIO *BIO_new_ssl(SSL_CTX *ctx, int client); +__owur BIO *BIO_new_ssl_connect(SSL_CTX *ctx); +__owur BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx); +__owur int BIO_ssl_copy_session_id(BIO *to, BIO *from); +void BIO_ssl_shutdown(BIO *ssl_bio); + +__owur int SSL_CTX_set_cipher_list(SSL_CTX *, const char *str); +__owur SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth); +__owur SSL_CTX *SSL_CTX_new_ex(OSSL_LIB_CTX *libctx, const char *propq, + const SSL_METHOD *meth); +int SSL_CTX_up_ref(SSL_CTX *ctx); +void SSL_CTX_free(SSL_CTX *); +__owur long SSL_CTX_set_timeout(SSL_CTX *ctx, long t); +__owur long SSL_CTX_get_timeout(const SSL_CTX *ctx); +__owur X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *); +void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *); +void SSL_CTX_set1_cert_store(SSL_CTX *, X509_STORE *); +__owur int SSL_want(const SSL *s); +__owur int SSL_clear(SSL *s); + +#ifndef OPENSSL_NO_DEPRECATED_3_4 +OSSL_DEPRECATEDIN_3_4_FOR("not Y2038-safe, replace with SSL_CTX_flush_sessions_ex()") +void SSL_CTX_flush_sessions(SSL_CTX *ctx, long tm); +#endif +void SSL_CTX_flush_sessions_ex(SSL_CTX *ctx, time_t tm); + +__owur const SSL_CIPHER *SSL_get_current_cipher(const SSL *s); +__owur const SSL_CIPHER *SSL_get_pending_cipher(const SSL *s); +__owur int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits); +__owur const char *SSL_CIPHER_get_version(const SSL_CIPHER *c); +__owur const char *SSL_CIPHER_get_name(const SSL_CIPHER *c); +__owur const char *SSL_CIPHER_standard_name(const SSL_CIPHER *c); +__owur const char *OPENSSL_cipher_name(const char *rfc_name); +__owur uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *c); +__owur uint16_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *c); +__owur int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c); +__owur int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *c); +__owur const EVP_MD *SSL_CIPHER_get_handshake_digest(const SSL_CIPHER *c); +__owur int SSL_CIPHER_is_aead(const SSL_CIPHER *c); + +__owur int SSL_get_fd(const SSL *s); +__owur int SSL_get_rfd(const SSL *s); +__owur int SSL_get_wfd(const SSL *s); +__owur const char *SSL_get_cipher_list(const SSL *s, int n); +__owur char *SSL_get_shared_ciphers(const SSL *s, char *buf, int size); +__owur int SSL_get_read_ahead(const SSL *s); +__owur int SSL_pending(const SSL *s); +__owur int SSL_has_pending(const SSL *s); +#ifndef OPENSSL_NO_SOCK +__owur int SSL_set_fd(SSL *s, int fd); +__owur int SSL_set_rfd(SSL *s, int fd); +__owur int SSL_set_wfd(SSL *s, int fd); +#endif +void SSL_set0_rbio(SSL *s, BIO *rbio); +void SSL_set0_wbio(SSL *s, BIO *wbio); +void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio); +__owur BIO *SSL_get_rbio(const SSL *s); +__owur BIO *SSL_get_wbio(const SSL *s); +__owur int SSL_set_cipher_list(SSL *s, const char *str); +__owur int SSL_CTX_set_ciphersuites(SSL_CTX *ctx, const char *str); +__owur int SSL_set_ciphersuites(SSL *s, const char *str); +void SSL_set_read_ahead(SSL *s, int yes); +__owur int SSL_get_verify_mode(const SSL *s); +__owur int SSL_get_verify_depth(const SSL *s); +__owur SSL_verify_cb SSL_get_verify_callback(const SSL *s); +void SSL_set_verify(SSL *s, int mode, SSL_verify_cb callback); +void SSL_set_verify_depth(SSL *s, int depth); +void SSL_set_cert_cb(SSL *s, int (*cb)(SSL *ssl, void *arg), void *arg); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 __owur int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa); +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, + const unsigned char *d, long len); +#endif +__owur int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey); +__owur int SSL_use_PrivateKey_ASN1(int pk, SSL *ssl, const unsigned char *d, + long len); +__owur int SSL_use_certificate(SSL *ssl, X509 *x); +__owur int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len); +__owur int SSL_use_cert_and_key(SSL *ssl, X509 *x509, EVP_PKEY *privatekey, + STACK_OF(X509) *chain, int override); + +/* serverinfo file format versions */ +#define SSL_SERVERINFOV1 1 +#define SSL_SERVERINFOV2 2 + +/* Set serverinfo data for the current active cert. */ +__owur int SSL_CTX_use_serverinfo(SSL_CTX *ctx, const unsigned char *serverinfo, + size_t serverinfo_length); +__owur int SSL_CTX_use_serverinfo_ex(SSL_CTX *ctx, unsigned int version, + const unsigned char *serverinfo, + size_t serverinfo_length); +__owur int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file); + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type); +#endif + +__owur int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type); +__owur int SSL_use_certificate_file(SSL *ssl, const char *file, int type); + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, + int type); +#endif +__owur int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, + int type); +__owur int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, + int type); +/* PEM type */ +__owur int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); +__owur int SSL_use_certificate_chain_file(SSL *ssl, const char *file); +__owur STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); +__owur STACK_OF(X509_NAME) *SSL_load_client_CA_file_ex(const char *file, OSSL_LIB_CTX *libctx, + const char *propq); +__owur int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *file); +int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *dir); +int SSL_add_store_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *uri); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define SSL_load_error_strings() \ + OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS \ + | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, \ + NULL) +#endif + +__owur const char *SSL_state_string(const SSL *s); +__owur const char *SSL_rstate_string(const SSL *s); +__owur const char *SSL_state_string_long(const SSL *s); +__owur const char *SSL_rstate_string_long(const SSL *s); + +#ifndef OPENSSL_NO_DEPRECATED_3_4 +OSSL_DEPRECATEDIN_3_4_FOR("not Y2038-safe, replace with SSL_SESSION_get_time_ex()") +__owur long SSL_SESSION_get_time(const SSL_SESSION *s); +OSSL_DEPRECATEDIN_3_4_FOR("not Y2038-safe, replace with SSL_SESSION_set_time_ex()") +__owur long SSL_SESSION_set_time(SSL_SESSION *s, long t); +#endif +__owur long SSL_SESSION_get_timeout(const SSL_SESSION *s); +__owur long SSL_SESSION_set_timeout(SSL_SESSION *s, long t); +__owur int SSL_SESSION_get_protocol_version(const SSL_SESSION *s); +__owur int SSL_SESSION_set_protocol_version(SSL_SESSION *s, int version); + +__owur time_t SSL_SESSION_get_time_ex(const SSL_SESSION *s); +__owur time_t SSL_SESSION_set_time_ex(SSL_SESSION *s, time_t t); + +__owur const char *SSL_SESSION_get0_hostname(const SSL_SESSION *s); +__owur int SSL_SESSION_set1_hostname(SSL_SESSION *s, const char *hostname); +void SSL_SESSION_get0_alpn_selected(const SSL_SESSION *s, + const unsigned char **alpn, + size_t *len); +__owur int SSL_SESSION_set1_alpn_selected(SSL_SESSION *s, + const unsigned char *alpn, + size_t len); +__owur const SSL_CIPHER *SSL_SESSION_get0_cipher(const SSL_SESSION *s); +__owur int SSL_SESSION_set_cipher(SSL_SESSION *s, const SSL_CIPHER *cipher); +__owur int SSL_SESSION_has_ticket(const SSL_SESSION *s); +__owur unsigned long SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s); +void SSL_SESSION_get0_ticket(const SSL_SESSION *s, const unsigned char **tick, + size_t *len); +__owur uint32_t SSL_SESSION_get_max_early_data(const SSL_SESSION *s); +__owur int SSL_SESSION_set_max_early_data(SSL_SESSION *s, + uint32_t max_early_data); +__owur int SSL_copy_session_id(SSL *to, const SSL *from); +__owur X509 *SSL_SESSION_get0_peer(SSL_SESSION *s); +__owur int SSL_SESSION_set1_id_context(SSL_SESSION *s, + const unsigned char *sid_ctx, + unsigned int sid_ctx_len); +__owur int SSL_SESSION_set1_id(SSL_SESSION *s, const unsigned char *sid, + unsigned int sid_len); +__owur int SSL_SESSION_is_resumable(const SSL_SESSION *s); + +__owur SSL_SESSION *SSL_SESSION_new(void); +__owur SSL_SESSION *SSL_SESSION_dup(const SSL_SESSION *src); +const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, + unsigned int *len); +const unsigned char *SSL_SESSION_get0_id_context(const SSL_SESSION *s, + unsigned int *len); +__owur unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s); +#ifndef OPENSSL_NO_STDIO +int SSL_SESSION_print_fp(FILE *fp, const SSL_SESSION *ses); +#endif +int SSL_SESSION_print(BIO *fp, const SSL_SESSION *ses); +int SSL_SESSION_print_keylog(BIO *bp, const SSL_SESSION *x); +int SSL_SESSION_up_ref(SSL_SESSION *ses); +void SSL_SESSION_free(SSL_SESSION *ses); +__owur int i2d_SSL_SESSION(const SSL_SESSION *in, unsigned char **pp); +__owur int SSL_set_session(SSL *to, SSL_SESSION *session); +int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *session); +int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *session); +__owur int SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb); +__owur int SSL_set_generate_session_id(SSL *s, GEN_SESSION_CB cb); +__owur int SSL_has_matching_session_id(const SSL *s, + const unsigned char *id, + unsigned int id_len); +SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, + long length); +SSL_SESSION *d2i_SSL_SESSION_ex(SSL_SESSION **a, const unsigned char **pp, + long length, OSSL_LIB_CTX *libctx, + const char *propq); + +#ifdef OPENSSL_X509_H +__owur X509 *SSL_get0_peer_certificate(const SSL *s); +__owur X509 *SSL_get1_peer_certificate(const SSL *s); +/* Deprecated in 3.0.0 */ +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SSL_get_peer_certificate SSL_get1_peer_certificate +#endif +#endif + +__owur STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s); + +__owur int SSL_CTX_get_verify_mode(const SSL_CTX *ctx); +__owur int SSL_CTX_get_verify_depth(const SSL_CTX *ctx); +__owur SSL_verify_cb SSL_CTX_get_verify_callback(const SSL_CTX *ctx); +void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, SSL_verify_cb callback); +void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth); +void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, + int (*cb)(X509_STORE_CTX *, void *), + void *arg); +void SSL_CTX_set_cert_cb(SSL_CTX *c, int (*cb)(SSL *ssl, void *arg), + void *arg); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa); +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, + long len); +#endif +__owur int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); +__owur int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx, + const unsigned char *d, long len); +__owur int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x); +__owur int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, + const unsigned char *d); +__owur int SSL_CTX_use_cert_and_key(SSL_CTX *ctx, X509 *x509, EVP_PKEY *privatekey, + STACK_OF(X509) *chain, int override); + +void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb); +void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u); +pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx); +void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx); +void SSL_set_default_passwd_cb(SSL *s, pem_password_cb *cb); +void SSL_set_default_passwd_cb_userdata(SSL *s, void *u); +pem_password_cb *SSL_get_default_passwd_cb(SSL *s); +void *SSL_get_default_passwd_cb_userdata(SSL *s); + +__owur int SSL_CTX_check_private_key(const SSL_CTX *ctx); +__owur int SSL_check_private_key(const SSL *ctx); + +__owur int SSL_CTX_set_session_id_context(SSL_CTX *ctx, + const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +SSL *SSL_new(SSL_CTX *ctx); +int SSL_up_ref(SSL *s); +int SSL_is_dtls(const SSL *s); +int SSL_is_tls(const SSL *s); +int SSL_is_quic(const SSL *s); +__owur int SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +__owur int SSL_CTX_set_purpose(SSL_CTX *ctx, int purpose); +__owur int SSL_set_purpose(SSL *ssl, int purpose); +__owur int SSL_CTX_set_trust(SSL_CTX *ctx, int trust); +__owur int SSL_set_trust(SSL *ssl, int trust); + +__owur int SSL_set1_host(SSL *s, const char *host); +__owur int SSL_add1_host(SSL *s, const char *host); +__owur const char *SSL_get0_peername(SSL *s); +void SSL_set_hostflags(SSL *s, unsigned int flags); + +__owur int SSL_CTX_dane_enable(SSL_CTX *ctx); +__owur int SSL_CTX_dane_mtype_set(SSL_CTX *ctx, const EVP_MD *md, + uint8_t mtype, uint8_t ord); +__owur int SSL_dane_enable(SSL *s, const char *basedomain); +__owur int SSL_dane_tlsa_add(SSL *s, uint8_t usage, uint8_t selector, + uint8_t mtype, const unsigned char *data, size_t dlen); +__owur int SSL_get0_dane_authority(SSL *s, X509 **mcert, EVP_PKEY **mspki); +__owur int SSL_get0_dane_tlsa(SSL *s, uint8_t *usage, uint8_t *selector, + uint8_t *mtype, const unsigned char **data, + size_t *dlen); +/* + * Bridge opacity barrier between libcrypt and libssl, also needed to support + * offline testing in test/danetest.c + */ +SSL_DANE *SSL_get0_dane(SSL *ssl); +/* + * DANE flags + */ +unsigned long SSL_CTX_dane_set_flags(SSL_CTX *ctx, unsigned long flags); +unsigned long SSL_CTX_dane_clear_flags(SSL_CTX *ctx, unsigned long flags); +unsigned long SSL_dane_set_flags(SSL *ssl, unsigned long flags); +unsigned long SSL_dane_clear_flags(SSL *ssl, unsigned long flags); + +__owur int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); +__owur int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); + +__owur X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx); +__owur X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl); + +#ifndef OPENSSL_NO_SRP +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name); +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password); +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength); +OSSL_DEPRECATEDIN_3_0 +int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx, + char *(*cb)(SSL *, void *)); +OSSL_DEPRECATEDIN_3_0 +int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx, + int (*cb)(SSL *, void *)); +OSSL_DEPRECATEDIN_3_0 +int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx, + int (*cb)(SSL *, int *, void *)); +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg); + +OSSL_DEPRECATEDIN_3_0 +int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g, + BIGNUM *sa, BIGNUM *v, char *info); +OSSL_DEPRECATEDIN_3_0 +int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass, + const char *grp); + +OSSL_DEPRECATEDIN_3_0 __owur BIGNUM *SSL_get_srp_g(SSL *s); +OSSL_DEPRECATEDIN_3_0 __owur BIGNUM *SSL_get_srp_N(SSL *s); + +OSSL_DEPRECATEDIN_3_0 __owur char *SSL_get_srp_username(SSL *s); +OSSL_DEPRECATEDIN_3_0 __owur char *SSL_get_srp_userinfo(SSL *s); +#endif +#endif + +/* + * ClientHello callback and helpers. + */ + +#define SSL_CLIENT_HELLO_SUCCESS 1 +#define SSL_CLIENT_HELLO_ERROR 0 +#define SSL_CLIENT_HELLO_RETRY (-1) + +typedef int (*SSL_client_hello_cb_fn)(SSL *s, int *al, void *arg); +void SSL_CTX_set_client_hello_cb(SSL_CTX *c, SSL_client_hello_cb_fn cb, + void *arg); +typedef int (*SSL_new_pending_conn_cb_fn)(SSL_CTX *ctx, SSL *new_ssl, + void *arg); +void SSL_CTX_set_new_pending_conn_cb(SSL_CTX *c, SSL_new_pending_conn_cb_fn cb, + void *arg); + +int SSL_client_hello_isv2(SSL *s); +unsigned int SSL_client_hello_get0_legacy_version(SSL *s); +size_t SSL_client_hello_get0_random(SSL *s, const unsigned char **out); +size_t SSL_client_hello_get0_session_id(SSL *s, const unsigned char **out); +size_t SSL_client_hello_get0_ciphers(SSL *s, const unsigned char **out); +size_t SSL_client_hello_get0_compression_methods(SSL *s, + const unsigned char **out); +int SSL_client_hello_get1_extensions_present(SSL *s, int **out, size_t *outlen); +int SSL_client_hello_get_extension_order(SSL *s, uint16_t *exts, + size_t *num_exts); +int SSL_client_hello_get0_ext(SSL *s, unsigned int type, + const unsigned char **out, size_t *outlen); + +void SSL_certs_clear(SSL *s); +void SSL_free(SSL *ssl); +#ifdef OSSL_ASYNC_FD +/* + * Windows application developer has to include windows.h to use these. + */ +__owur int SSL_waiting_for_async(SSL *s); +__owur int SSL_get_all_async_fds(SSL *s, OSSL_ASYNC_FD *fds, size_t *numfds); +__owur int SSL_get_changed_async_fds(SSL *s, OSSL_ASYNC_FD *addfd, + size_t *numaddfds, OSSL_ASYNC_FD *delfd, + size_t *numdelfds); +__owur int SSL_CTX_set_async_callback(SSL_CTX *ctx, SSL_async_callback_fn callback); +__owur int SSL_CTX_set_async_callback_arg(SSL_CTX *ctx, void *arg); +__owur int SSL_set_async_callback(SSL *s, SSL_async_callback_fn callback); +__owur int SSL_set_async_callback_arg(SSL *s, void *arg); +__owur int SSL_get_async_status(SSL *s, int *status); + +#endif +__owur int SSL_accept(SSL *ssl); +__owur int SSL_stateless(SSL *s); +__owur int SSL_connect(SSL *ssl); +__owur int SSL_read(SSL *ssl, void *buf, int num); +__owur int SSL_read_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes); + +#define SSL_READ_EARLY_DATA_ERROR 0 +#define SSL_READ_EARLY_DATA_SUCCESS 1 +#define SSL_READ_EARLY_DATA_FINISH 2 + +__owur int SSL_read_early_data(SSL *s, void *buf, size_t num, + size_t *readbytes); +__owur int SSL_peek(SSL *ssl, void *buf, int num); +__owur int SSL_peek_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes); +__owur ossl_ssize_t SSL_sendfile(SSL *s, int fd, off_t offset, size_t size, + int flags); +__owur int SSL_write(SSL *ssl, const void *buf, int num); +__owur int SSL_write_ex(SSL *s, const void *buf, size_t num, size_t *written); +__owur int SSL_write_early_data(SSL *s, const void *buf, size_t num, + size_t *written); +long SSL_ctrl(SSL *ssl, int cmd, long larg, void *parg); +long SSL_callback_ctrl(SSL *, int, void (*)(void)); +long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg); +long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)(void)); + +#define SSL_WRITE_FLAG_CONCLUDE (1U << 0) + +__owur int SSL_write_ex2(SSL *s, const void *buf, size_t num, + uint64_t flags, + size_t *written); + +#define SSL_EARLY_DATA_NOT_SENT 0 +#define SSL_EARLY_DATA_REJECTED 1 +#define SSL_EARLY_DATA_ACCEPTED 2 + +__owur int SSL_get_early_data_status(const SSL *s); + +__owur int SSL_get_error(const SSL *s, int ret_code); +__owur const char *SSL_get_version(const SSL *s); +__owur int SSL_get_handshake_rtt(const SSL *s, uint64_t *rtt); + +/* This sets the 'default' SSL version that SSL_new() will create */ +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth); +#endif + +#ifndef OPENSSL_NO_SSL3_METHOD +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_method(void); /* SSLv3 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_client_method(void); +#endif +#endif + +#define SSLv23_method TLS_method +#define SSLv23_server_method TLS_server_method +#define SSLv23_client_method TLS_client_method + +/* Negotiate highest available SSL/TLS version */ +__owur const SSL_METHOD *TLS_method(void); +__owur const SSL_METHOD *TLS_server_method(void); +__owur const SSL_METHOD *TLS_client_method(void); + +#ifndef OPENSSL_NO_TLS1_METHOD +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_method(void); /* TLSv1.0 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_client_method(void); +#endif +#endif + +#ifndef OPENSSL_NO_TLS1_1_METHOD +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_method(void); /* TLSv1.1 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_client_method(void); +#endif +#endif + +#ifndef OPENSSL_NO_TLS1_2_METHOD +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_method(void); /* TLSv1.2 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_client_method(void); +#endif +#endif + +#ifndef OPENSSL_NO_DTLS1_METHOD +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_method(void); /* DTLSv1.0 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_client_method(void); +#endif +#endif + +#ifndef OPENSSL_NO_DTLS1_2_METHOD +/* DTLSv1.2 */ +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_client_method(void); +#endif +#endif + +__owur const SSL_METHOD *DTLS_method(void); /* DTLS 1.0 and 1.2 */ +__owur const SSL_METHOD *DTLS_server_method(void); /* DTLS 1.0 and 1.2 */ +__owur const SSL_METHOD *DTLS_client_method(void); /* DTLS 1.0 and 1.2 */ + +__owur size_t DTLS_get_data_mtu(const SSL *s); + +__owur STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s); +__owur STACK_OF(SSL_CIPHER) *SSL_CTX_get_ciphers(const SSL_CTX *ctx); +__owur STACK_OF(SSL_CIPHER) *SSL_get_client_ciphers(const SSL *s); +__owur STACK_OF(SSL_CIPHER) *SSL_get1_supported_ciphers(SSL *s); + +__owur int SSL_do_handshake(SSL *s); +int SSL_key_update(SSL *s, int updatetype); +int SSL_get_key_update_type(const SSL *s); +int SSL_renegotiate(SSL *s); +int SSL_renegotiate_abbreviated(SSL *s); +__owur int SSL_renegotiate_pending(const SSL *s); +int SSL_new_session_ticket(SSL *s); +int SSL_shutdown(SSL *s); +__owur int SSL_verify_client_post_handshake(SSL *s); +void SSL_CTX_set_post_handshake_auth(SSL_CTX *ctx, int val); +void SSL_set_post_handshake_auth(SSL *s, int val); + +__owur const SSL_METHOD *SSL_CTX_get_ssl_method(const SSL_CTX *ctx); +__owur const SSL_METHOD *SSL_get_ssl_method(const SSL *s); +__owur int SSL_set_ssl_method(SSL *s, const SSL_METHOD *method); +__owur const char *SSL_alert_type_string_long(int value); +__owur const char *SSL_alert_type_string(int value); +__owur const char *SSL_alert_desc_string_long(int value); +__owur const char *SSL_alert_desc_string(int value); + +void SSL_set0_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); +void SSL_CTX_set0_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); +__owur const STACK_OF(X509_NAME) *SSL_get0_CA_list(const SSL *s); +__owur const STACK_OF(X509_NAME) *SSL_CTX_get0_CA_list(const SSL_CTX *ctx); +__owur int SSL_add1_to_CA_list(SSL *ssl, const X509 *x); +__owur int SSL_CTX_add1_to_CA_list(SSL_CTX *ctx, const X509 *x); +__owur const STACK_OF(X509_NAME) *SSL_get0_peer_CA_list(const SSL *s); + +void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); +void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); +__owur STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s); +__owur STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s); +__owur int SSL_add_client_CA(SSL *ssl, X509 *x); +__owur int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x); + +void SSL_set_connect_state(SSL *s); +void SSL_set_accept_state(SSL *s); + +__owur long SSL_get_default_timeout(const SSL *s); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define SSL_library_init() OPENSSL_init_ssl(0, NULL) +#endif + +__owur char *SSL_CIPHER_description(const SSL_CIPHER *, char *buf, int size); +__owur STACK_OF(X509_NAME) *SSL_dup_CA_list(const STACK_OF(X509_NAME) *sk); + +__owur SSL *SSL_dup(SSL *ssl); + +__owur X509 *SSL_get_certificate(const SSL *ssl); +/* + * EVP_PKEY + */ +struct evp_pkey_st *SSL_get_privatekey(const SSL *ssl); + +__owur X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx); +__owur EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx); + +void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode); +__owur int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx); +void SSL_set_quiet_shutdown(SSL *ssl, int mode); +__owur int SSL_get_quiet_shutdown(const SSL *ssl); +void SSL_set_shutdown(SSL *ssl, int mode); +__owur int SSL_get_shutdown(const SSL *ssl); +__owur int SSL_version(const SSL *ssl); +__owur int SSL_client_version(const SSL *s); +__owur int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); +__owur int SSL_CTX_set_default_verify_dir(SSL_CTX *ctx); +__owur int SSL_CTX_set_default_verify_file(SSL_CTX *ctx); +__owur int SSL_CTX_set_default_verify_store(SSL_CTX *ctx); +__owur int SSL_CTX_load_verify_file(SSL_CTX *ctx, const char *CAfile); +__owur int SSL_CTX_load_verify_dir(SSL_CTX *ctx, const char *CApath); +__owur int SSL_CTX_load_verify_store(SSL_CTX *ctx, const char *CAstore); +__owur int SSL_CTX_load_verify_locations(SSL_CTX *ctx, + const char *CAfile, + const char *CApath); +#define SSL_get0_session SSL_get_session /* just peek at pointer */ +__owur SSL_SESSION *SSL_get_session(const SSL *ssl); +__owur SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */ +__owur SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl); +SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx); +void SSL_set_info_callback(SSL *ssl, + void (*cb)(const SSL *ssl, int type, int val)); +void (*SSL_get_info_callback(const SSL *ssl))(const SSL *ssl, int type, + int val); +__owur OSSL_HANDSHAKE_STATE SSL_get_state(const SSL *ssl); + +void SSL_set_verify_result(SSL *ssl, long v); +__owur long SSL_get_verify_result(const SSL *ssl); +__owur STACK_OF(X509) *SSL_get0_verified_chain(const SSL *s); + +__owur size_t SSL_get_client_random(const SSL *ssl, unsigned char *out, + size_t outlen); +__owur size_t SSL_get_server_random(const SSL *ssl, unsigned char *out, + size_t outlen); +__owur size_t SSL_SESSION_get_master_key(const SSL_SESSION *sess, + unsigned char *out, size_t outlen); +__owur int SSL_SESSION_set1_master_key(SSL_SESSION *sess, + const unsigned char *in, size_t len); +uint8_t SSL_SESSION_get_max_fragment_length(const SSL_SESSION *sess); + +#define SSL_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, l, p, newf, dupf, freef) +__owur int SSL_set_ex_data(SSL *ssl, int idx, void *data); +void *SSL_get_ex_data(const SSL *ssl, int idx); +#define SSL_SESSION_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_SESSION, l, p, newf, dupf, freef) +__owur int SSL_SESSION_set_ex_data(SSL_SESSION *ss, int idx, void *data); +void *SSL_SESSION_get_ex_data(const SSL_SESSION *ss, int idx); +#define SSL_CTX_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, l, p, newf, dupf, freef) +__owur int SSL_CTX_set_ex_data(SSL_CTX *ssl, int idx, void *data); +void *SSL_CTX_get_ex_data(const SSL_CTX *ssl, int idx); + +__owur int SSL_get_ex_data_X509_STORE_CTX_idx(void); + +#define SSL_CTX_sess_set_cache_size(ctx, t) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_SESS_CACHE_SIZE, t, NULL) +#define SSL_CTX_sess_get_cache_size(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_SESS_CACHE_SIZE, 0, NULL) +#define SSL_CTX_set_session_cache_mode(ctx, m) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_SESS_CACHE_MODE, m, NULL) +#define SSL_CTX_get_session_cache_mode(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_SESS_CACHE_MODE, 0, NULL) + +#define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx) +#define SSL_CTX_set_default_read_ahead(ctx, m) SSL_CTX_set_read_ahead(ctx, m) +#define SSL_CTX_get_read_ahead(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_READ_AHEAD, 0, NULL) +#define SSL_CTX_set_read_ahead(ctx, m) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_READ_AHEAD, m, NULL) +#define SSL_CTX_get_max_cert_list(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MAX_CERT_LIST, 0, NULL) +#define SSL_CTX_set_max_cert_list(ctx, m) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_CERT_LIST, m, NULL) +#define SSL_get_max_cert_list(ssl) \ + SSL_ctrl(ssl, SSL_CTRL_GET_MAX_CERT_LIST, 0, NULL) +#define SSL_set_max_cert_list(ssl, m) \ + SSL_ctrl(ssl, SSL_CTRL_SET_MAX_CERT_LIST, m, NULL) + +#define SSL_CTX_set_max_send_fragment(ctx, m) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_SEND_FRAGMENT, m, NULL) +#define SSL_set_max_send_fragment(ssl, m) \ + SSL_ctrl(ssl, SSL_CTRL_SET_MAX_SEND_FRAGMENT, m, NULL) +#define SSL_CTX_set_split_send_fragment(ctx, m) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_SPLIT_SEND_FRAGMENT, m, NULL) +#define SSL_set_split_send_fragment(ssl, m) \ + SSL_ctrl(ssl, SSL_CTRL_SET_SPLIT_SEND_FRAGMENT, m, NULL) +#define SSL_CTX_set_max_pipelines(ctx, m) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PIPELINES, m, NULL) +#define SSL_set_max_pipelines(ssl, m) \ + SSL_ctrl(ssl, SSL_CTRL_SET_MAX_PIPELINES, m, NULL) +#define SSL_set_retry_verify(ssl) \ + (SSL_ctrl(ssl, SSL_CTRL_SET_RETRY_VERIFY, 0, NULL) > 0) + +void SSL_CTX_set_default_read_buffer_len(SSL_CTX *ctx, size_t len); +void SSL_set_default_read_buffer_len(SSL *s, size_t len); + +#ifndef OPENSSL_NO_DH +#ifndef OPENSSL_NO_DEPRECATED_3_0 +/* NB: the |keylength| is only applicable when is_export is true */ +OSSL_DEPRECATEDIN_3_0 +void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx, + DH *(*dh)(SSL *ssl, int is_export, + int keylength)); +OSSL_DEPRECATEDIN_3_0 +void SSL_set_tmp_dh_callback(SSL *ssl, + DH *(*dh)(SSL *ssl, int is_export, + int keylength)); +#endif +#endif + +__owur const COMP_METHOD *SSL_get_current_compression(const SSL *s); +__owur const COMP_METHOD *SSL_get_current_expansion(const SSL *s); +__owur const char *SSL_COMP_get_name(const COMP_METHOD *comp); +__owur const char *SSL_COMP_get0_name(const SSL_COMP *comp); +__owur int SSL_COMP_get_id(const SSL_COMP *comp); +STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void); +__owur STACK_OF(SSL_COMP) *SSL_COMP_set0_compression_methods(STACK_OF(SSL_COMP) + *meths); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define SSL_COMP_free_compression_methods() \ + while (0) \ + continue +#endif +__owur int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm); + +const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr); +int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *c); +int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *c); +int SSL_bytes_to_cipher_list(SSL *s, const unsigned char *bytes, size_t len, + int isv2format, STACK_OF(SSL_CIPHER) **sk, + STACK_OF(SSL_CIPHER) **scsvs); + +/* TLS extensions functions */ +__owur int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len); + +__owur int SSL_set_session_ticket_ext_cb(SSL *s, + tls_session_ticket_ext_cb_fn cb, + void *arg); + +/* Pre-shared secret session resumption functions */ +__owur int SSL_set_session_secret_cb(SSL *s, + tls_session_secret_cb_fn session_secret_cb, + void *arg); + +void SSL_CTX_set_not_resumable_session_callback(SSL_CTX *ctx, + int (*cb)(SSL *ssl, + int + is_forward_secure)); + +void SSL_set_not_resumable_session_callback(SSL *ssl, + int (*cb)(SSL *ssl, + int is_forward_secure)); + +void SSL_CTX_set_record_padding_callback(SSL_CTX *ctx, + size_t (*cb)(SSL *ssl, int type, + size_t len, void *arg)); +void SSL_CTX_set_record_padding_callback_arg(SSL_CTX *ctx, void *arg); +void *SSL_CTX_get_record_padding_callback_arg(const SSL_CTX *ctx); +int SSL_CTX_set_block_padding(SSL_CTX *ctx, size_t block_size); +int SSL_CTX_set_block_padding_ex(SSL_CTX *ctx, size_t app_block_size, + size_t hs_block_size); + +int SSL_set_record_padding_callback(SSL *ssl, + size_t (*cb)(SSL *ssl, int type, + size_t len, void *arg)); +void SSL_set_record_padding_callback_arg(SSL *ssl, void *arg); +void *SSL_get_record_padding_callback_arg(const SSL *ssl); +int SSL_set_block_padding(SSL *ssl, size_t block_size); +int SSL_set_block_padding_ex(SSL *ssl, size_t app_block_size, + size_t hs_block_size); +int SSL_set_num_tickets(SSL *s, size_t num_tickets); +size_t SSL_get_num_tickets(const SSL *s); +int SSL_CTX_set_num_tickets(SSL_CTX *ctx, size_t num_tickets); +size_t SSL_CTX_get_num_tickets(const SSL_CTX *ctx); + +/* QUIC support */ +int SSL_handle_events(SSL *s); +__owur int SSL_get_event_timeout(SSL *s, struct timeval *tv, int *is_infinite); +__owur int SSL_get_rpoll_descriptor(SSL *s, BIO_POLL_DESCRIPTOR *desc); +__owur int SSL_get_wpoll_descriptor(SSL *s, BIO_POLL_DESCRIPTOR *desc); +__owur int SSL_net_read_desired(SSL *s); +__owur int SSL_net_write_desired(SSL *s); +__owur int SSL_set_blocking_mode(SSL *s, int blocking); +__owur int SSL_get_blocking_mode(SSL *s); +__owur int SSL_set1_initial_peer_addr(SSL *s, const BIO_ADDR *peer_addr); +__owur SSL *SSL_get0_connection(SSL *s); +__owur int SSL_is_connection(SSL *s); + +__owur int SSL_is_listener(SSL *ssl); +__owur SSL *SSL_get0_listener(SSL *s); +#define SSL_LISTENER_FLAG_NO_VALIDATE (1UL << 1) +__owur SSL *SSL_new_listener(SSL_CTX *ctx, uint64_t flags); +__owur SSL *SSL_new_listener_from(SSL *ssl, uint64_t flags); +__owur SSL *SSL_new_from_listener(SSL *ssl, uint64_t flags); +#define SSL_ACCEPT_CONNECTION_NO_BLOCK (1UL << 0) +__owur SSL *SSL_accept_connection(SSL *ssl, uint64_t flags); +__owur size_t SSL_get_accept_connection_queue_len(SSL *ssl); +__owur int SSL_listen(SSL *ssl); + +__owur int SSL_is_domain(SSL *s); +__owur SSL *SSL_get0_domain(SSL *s); +__owur SSL *SSL_new_domain(SSL_CTX *ctx, uint64_t flags); + +#define SSL_DOMAIN_FLAG_SINGLE_THREAD (1U << 0) +#define SSL_DOMAIN_FLAG_MULTI_THREAD (1U << 1) +#define SSL_DOMAIN_FLAG_THREAD_ASSISTED (1U << 2) +#define SSL_DOMAIN_FLAG_BLOCKING (1U << 3) +#define SSL_DOMAIN_FLAG_LEGACY_BLOCKING (1U << 4) + +__owur int SSL_CTX_set_domain_flags(SSL_CTX *ctx, uint64_t domain_flags); +__owur int SSL_CTX_get_domain_flags(const SSL_CTX *ctx, uint64_t *domain_flags); +__owur int SSL_get_domain_flags(const SSL *ssl, uint64_t *domain_flags); + +#define SSL_STREAM_TYPE_NONE 0 +#define SSL_STREAM_TYPE_READ (1U << 0) +#define SSL_STREAM_TYPE_WRITE (1U << 1) +#define SSL_STREAM_TYPE_BIDI (SSL_STREAM_TYPE_READ | SSL_STREAM_TYPE_WRITE) +__owur int SSL_get_stream_type(SSL *s); + +__owur uint64_t SSL_get_stream_id(SSL *s); +__owur int SSL_is_stream_local(SSL *s); + +#define SSL_DEFAULT_STREAM_MODE_NONE 0 +#define SSL_DEFAULT_STREAM_MODE_AUTO_BIDI 1 +#define SSL_DEFAULT_STREAM_MODE_AUTO_UNI 2 +__owur int SSL_set_default_stream_mode(SSL *s, uint32_t mode); + +#define SSL_STREAM_FLAG_UNI (1U << 0) +#define SSL_STREAM_FLAG_NO_BLOCK (1U << 1) +#define SSL_STREAM_FLAG_ADVANCE (1U << 2) +__owur SSL *SSL_new_stream(SSL *s, uint64_t flags); + +#define SSL_INCOMING_STREAM_POLICY_AUTO 0 +#define SSL_INCOMING_STREAM_POLICY_ACCEPT 1 +#define SSL_INCOMING_STREAM_POLICY_REJECT 2 +__owur int SSL_set_incoming_stream_policy(SSL *s, int policy, uint64_t aec); + +#define SSL_ACCEPT_STREAM_NO_BLOCK (1U << 0) +__owur SSL *SSL_accept_stream(SSL *s, uint64_t flags); +__owur size_t SSL_get_accept_stream_queue_len(SSL *s); + +#ifndef OPENSSL_NO_QUIC +__owur int SSL_inject_net_dgram(SSL *s, const unsigned char *buf, + size_t buf_len, + const BIO_ADDR *peer, + const BIO_ADDR *local); +#endif + +typedef struct ssl_shutdown_ex_args_st { + uint64_t quic_error_code; + const char *quic_reason; +} SSL_SHUTDOWN_EX_ARGS; + +#define SSL_SHUTDOWN_FLAG_RAPID (1U << 0) +#define SSL_SHUTDOWN_FLAG_NO_STREAM_FLUSH (1U << 1) +#define SSL_SHUTDOWN_FLAG_NO_BLOCK (1U << 2) +#define SSL_SHUTDOWN_FLAG_WAIT_PEER (1U << 3) + +__owur int SSL_shutdown_ex(SSL *ssl, uint64_t flags, + const SSL_SHUTDOWN_EX_ARGS *args, + size_t args_len); + +__owur int SSL_stream_conclude(SSL *ssl, uint64_t flags); + +typedef struct ssl_stream_reset_args_st { + uint64_t quic_error_code; +} SSL_STREAM_RESET_ARGS; + +__owur int SSL_stream_reset(SSL *ssl, + const SSL_STREAM_RESET_ARGS *args, + size_t args_len); + +#define SSL_STREAM_STATE_NONE 0 +#define SSL_STREAM_STATE_OK 1 +#define SSL_STREAM_STATE_WRONG_DIR 2 +#define SSL_STREAM_STATE_FINISHED 3 +#define SSL_STREAM_STATE_RESET_LOCAL 4 +#define SSL_STREAM_STATE_RESET_REMOTE 5 +#define SSL_STREAM_STATE_CONN_CLOSED 6 +__owur int SSL_get_stream_read_state(SSL *ssl); +__owur int SSL_get_stream_write_state(SSL *ssl); + +__owur int SSL_get_stream_read_error_code(SSL *ssl, uint64_t *app_error_code); +__owur int SSL_get_stream_write_error_code(SSL *ssl, uint64_t *app_error_code); + +#define SSL_CONN_CLOSE_FLAG_LOCAL (1U << 0) +#define SSL_CONN_CLOSE_FLAG_TRANSPORT (1U << 1) + +typedef struct ssl_conn_close_info_st { + uint64_t error_code, frame_type; + const char *reason; + size_t reason_len; + uint32_t flags; +} SSL_CONN_CLOSE_INFO; + +__owur int SSL_get_conn_close_info(SSL *ssl, + SSL_CONN_CLOSE_INFO *info, + size_t info_len); + +#define SSL_VALUE_CLASS_GENERIC 0 +#define SSL_VALUE_CLASS_FEATURE_REQUEST 1 +#define SSL_VALUE_CLASS_FEATURE_PEER_REQUEST 2 +#define SSL_VALUE_CLASS_FEATURE_NEGOTIATED 3 + +#define SSL_VALUE_NONE 0 +#define SSL_VALUE_QUIC_STREAM_BIDI_LOCAL_AVAIL 1 +#define SSL_VALUE_QUIC_STREAM_BIDI_REMOTE_AVAIL 2 +#define SSL_VALUE_QUIC_STREAM_UNI_LOCAL_AVAIL 3 +#define SSL_VALUE_QUIC_STREAM_UNI_REMOTE_AVAIL 4 +#define SSL_VALUE_QUIC_IDLE_TIMEOUT 5 +#define SSL_VALUE_EVENT_HANDLING_MODE 6 +#define SSL_VALUE_STREAM_WRITE_BUF_SIZE 7 +#define SSL_VALUE_STREAM_WRITE_BUF_USED 8 +#define SSL_VALUE_STREAM_WRITE_BUF_AVAIL 9 + +#define SSL_VALUE_EVENT_HANDLING_MODE_INHERIT 0 +#define SSL_VALUE_EVENT_HANDLING_MODE_IMPLICIT 1 +#define SSL_VALUE_EVENT_HANDLING_MODE_EXPLICIT 2 + +int SSL_get_value_uint(SSL *s, uint32_t class_, uint32_t id, uint64_t *v); +int SSL_set_value_uint(SSL *s, uint32_t class_, uint32_t id, uint64_t v); + +#define SSL_get_generic_value_uint(ssl, id, v) \ + SSL_get_value_uint((ssl), SSL_VALUE_CLASS_GENERIC, (id), (v)) +#define SSL_set_generic_value_uint(ssl, id, v) \ + SSL_set_value_uint((ssl), SSL_VALUE_CLASS_GENERIC, (id), (v)) +#define SSL_get_feature_request_uint(ssl, id, v) \ + SSL_get_value_uint((ssl), SSL_VALUE_CLASS_FEATURE_REQUEST, (id), (v)) +#define SSL_set_feature_request_uint(ssl, id, v) \ + SSL_set_value_uint((ssl), SSL_VALUE_CLASS_FEATURE_REQUEST, (id), (v)) +#define SSL_get_feature_peer_request_uint(ssl, id, v) \ + SSL_get_value_uint((ssl), SSL_VALUE_CLASS_FEATURE_PEER_REQUEST, (id), (v)) +#define SSL_get_feature_negotiated_uint(ssl, id, v) \ + SSL_get_value_uint((ssl), SSL_VALUE_CLASS_FEATURE_NEGOTIATED, (id), (v)) + +#define SSL_get_quic_stream_bidi_local_avail(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_QUIC_STREAM_BIDI_LOCAL_AVAIL, \ + (value)) +#define SSL_get_quic_stream_bidi_remote_avail(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_QUIC_STREAM_BIDI_REMOTE_AVAIL, \ + (value)) +#define SSL_get_quic_stream_uni_local_avail(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_QUIC_STREAM_UNI_LOCAL_AVAIL, \ + (value)) +#define SSL_get_quic_stream_uni_remote_avail(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_QUIC_STREAM_UNI_REMOTE_AVAIL, \ + (value)) + +#define SSL_get_event_handling_mode(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_EVENT_HANDLING_MODE, \ + (value)) +#define SSL_set_event_handling_mode(ssl, value) \ + SSL_set_generic_value_uint((ssl), SSL_VALUE_EVENT_HANDLING_MODE, \ + (value)) + +#define SSL_get_stream_write_buf_size(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_STREAM_WRITE_BUF_SIZE, \ + (value)) +#define SSL_get_stream_write_buf_used(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_STREAM_WRITE_BUF_USED, \ + (value)) +#define SSL_get_stream_write_buf_avail(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_STREAM_WRITE_BUF_AVAIL, \ + (value)) + +#define SSL_POLL_EVENT_NONE 0 + +#define SSL_POLL_EVENT_F (1U << 0) /* F (Failure) */ +#define SSL_POLL_EVENT_EL (1U << 1) /* EL (Exception on Listener) */ +#define SSL_POLL_EVENT_EC (1U << 2) /* EC (Exception on Conn) */ +#define SSL_POLL_EVENT_ECD (1U << 3) /* ECD (Exception on Conn Drained) */ +#define SSL_POLL_EVENT_ER (1U << 4) /* ER (Exception on Read) */ +#define SSL_POLL_EVENT_EW (1U << 5) /* EW (Exception on Write) */ +#define SSL_POLL_EVENT_R (1U << 6) /* R (Readable) */ +#define SSL_POLL_EVENT_W (1U << 7) /* W (Writable) */ +#define SSL_POLL_EVENT_IC (1U << 8) /* IC (Incoming Connection) */ +#define SSL_POLL_EVENT_ISB (1U << 9) /* ISB (Incoming Stream: Bidi) */ +#define SSL_POLL_EVENT_ISU (1U << 10) /* ISU (Incoming Stream: Uni) */ +#define SSL_POLL_EVENT_OSB (1U << 11) /* OSB (Outgoing Stream: Bidi) */ +#define SSL_POLL_EVENT_OSU (1U << 12) /* OSU (Outgoing Stream: Uni) */ + +#define SSL_POLL_EVENT_RW (SSL_POLL_EVENT_R | SSL_POLL_EVENT_W) +#define SSL_POLL_EVENT_RE (SSL_POLL_EVENT_R | SSL_POLL_EVENT_ER) +#define SSL_POLL_EVENT_WE (SSL_POLL_EVENT_W | SSL_POLL_EVENT_EW) +#define SSL_POLL_EVENT_RWE (SSL_POLL_EVENT_RE | SSL_POLL_EVENT_WE) +#define SSL_POLL_EVENT_E (SSL_POLL_EVENT_EL | SSL_POLL_EVENT_EC \ + | SSL_POLL_EVENT_ER | SSL_POLL_EVENT_EW) +#define SSL_POLL_EVENT_IS (SSL_POLL_EVENT_ISB | SSL_POLL_EVENT_ISU) +#define SSL_POLL_EVENT_ISE (SSL_POLL_EVENT_IS | SSL_POLL_EVENT_EC) +#define SSL_POLL_EVENT_I (SSL_POLL_EVENT_IS | SSL_POLL_EVENT_IC) +#define SSL_POLL_EVENT_OS (SSL_POLL_EVENT_OSB | SSL_POLL_EVENT_OSU) +#define SSL_POLL_EVENT_OSE (SSL_POLL_EVENT_OS | SSL_POLL_EVENT_EC) + +typedef struct ssl_poll_item_st { + BIO_POLL_DESCRIPTOR desc; + uint64_t events, revents; +} SSL_POLL_ITEM; + +#define SSL_POLL_FLAG_NO_HANDLE_EVENTS (1U << 0) + +__owur int SSL_poll(SSL_POLL_ITEM *items, + size_t num_items, + size_t stride, + const struct timeval *timeout, + uint64_t flags, + size_t *result_count); + +static ossl_inline ossl_unused BIO_POLL_DESCRIPTOR +SSL_as_poll_descriptor(SSL *s) +{ + BIO_POLL_DESCRIPTOR d; + + d.type = BIO_POLL_DESCRIPTOR_TYPE_SSL; + d.value.ssl = s; + return d; +} + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define SSL_cache_hit(s) SSL_session_reused(s) +#endif + +__owur int SSL_session_reused(const SSL *s); +__owur int SSL_is_server(const SSL *s); + +__owur SSL_CONF_CTX *SSL_CONF_CTX_new(void); +int SSL_CONF_CTX_finish(SSL_CONF_CTX *cctx); +void SSL_CONF_CTX_free(SSL_CONF_CTX *cctx); +unsigned int SSL_CONF_CTX_set_flags(SSL_CONF_CTX *cctx, unsigned int flags); +__owur unsigned int SSL_CONF_CTX_clear_flags(SSL_CONF_CTX *cctx, + unsigned int flags); +__owur int SSL_CONF_CTX_set1_prefix(SSL_CONF_CTX *cctx, const char *pre); + +void SSL_CONF_CTX_set_ssl(SSL_CONF_CTX *cctx, SSL *ssl); +void SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *cctx, SSL_CTX *ctx); + +__owur int SSL_CONF_cmd(SSL_CONF_CTX *cctx, const char *cmd, const char *value); +__owur int SSL_CONF_cmd_argv(SSL_CONF_CTX *cctx, int *pargc, char ***pargv); +__owur int SSL_CONF_cmd_value_type(SSL_CONF_CTX *cctx, const char *cmd); + +void SSL_add_ssl_module(void); +int SSL_config(SSL *s, const char *name); +int SSL_CTX_config(SSL_CTX *ctx, const char *name); + +#ifndef OPENSSL_NO_SSL_TRACE +void SSL_trace(int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); +#endif + +#ifndef OPENSSL_NO_SOCK +int DTLSv1_listen(SSL *s, BIO_ADDR *client); +#endif + +#ifndef OPENSSL_NO_CT + +/* + * A callback for verifying that the received SCTs are sufficient. + * Expected to return 1 if they are sufficient, otherwise 0. + * May return a negative integer if an error occurs. + * A connection should be aborted if the SCTs are deemed insufficient. + */ +typedef int (*ssl_ct_validation_cb)(const CT_POLICY_EVAL_CTX *ctx, + const STACK_OF(SCT) *scts, void *arg); + +/* + * Sets a |callback| that is invoked upon receipt of ServerHelloDone to validate + * the received SCTs. + * If the callback returns a non-positive result, the connection is terminated. + * Call this function before beginning a handshake. + * If a NULL |callback| is provided, SCT validation is disabled. + * |arg| is arbitrary userdata that will be passed to the callback whenever it + * is invoked. Ownership of |arg| remains with the caller. + * + * NOTE: A side-effect of setting a CT callback is that an OCSP stapled response + * will be requested. + */ +int SSL_set_ct_validation_callback(SSL *s, ssl_ct_validation_cb callback, + void *arg); +int SSL_CTX_set_ct_validation_callback(SSL_CTX *ctx, + ssl_ct_validation_cb callback, + void *arg); +#define SSL_disable_ct(s) \ + ((void)SSL_set_validation_callback((s), NULL, NULL)) +#define SSL_CTX_disable_ct(ctx) \ + ((void)SSL_CTX_set_validation_callback((ctx), NULL, NULL)) + +/* + * The validation type enumerates the available behaviours of the built-in SSL + * CT validation callback selected via SSL_enable_ct() and SSL_CTX_enable_ct(). + * The underlying callback is a static function in libssl. + */ +enum { + SSL_CT_VALIDATION_PERMISSIVE = 0, + SSL_CT_VALIDATION_STRICT +}; + +/* + * Enable CT by setting up a callback that implements one of the built-in + * validation variants. The SSL_CT_VALIDATION_PERMISSIVE variant always + * continues the handshake, the application can make appropriate decisions at + * handshake completion. The SSL_CT_VALIDATION_STRICT variant requires at + * least one valid SCT, or else handshake termination will be requested. The + * handshake may continue anyway if SSL_VERIFY_NONE is in effect. + */ +int SSL_enable_ct(SSL *s, int validation_mode); +int SSL_CTX_enable_ct(SSL_CTX *ctx, int validation_mode); + +/* + * Report whether a non-NULL callback is enabled. + */ +int SSL_ct_is_enabled(const SSL *s); +int SSL_CTX_ct_is_enabled(const SSL_CTX *ctx); + +/* Gets the SCTs received from a connection */ +const STACK_OF(SCT) *SSL_get0_peer_scts(SSL *s); + +/* + * Loads the CT log list from the default location. + * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store, + * the log information loaded from this file will be appended to the + * CTLOG_STORE. + * Returns 1 on success, 0 otherwise. + */ +int SSL_CTX_set_default_ctlog_list_file(SSL_CTX *ctx); + +/* + * Loads the CT log list from the specified file path. + * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store, + * the log information loaded from this file will be appended to the + * CTLOG_STORE. + * Returns 1 on success, 0 otherwise. + */ +int SSL_CTX_set_ctlog_list_file(SSL_CTX *ctx, const char *path); + +/* + * Sets the CT log list used by all SSL connections created from this SSL_CTX. + * Ownership of the CTLOG_STORE is transferred to the SSL_CTX. + */ +void SSL_CTX_set0_ctlog_store(SSL_CTX *ctx, CTLOG_STORE *logs); + +/* + * Gets the CT log list used by all SSL connections created from this SSL_CTX. + * This will be NULL unless one of the following functions has been called: + * - SSL_CTX_set_default_ctlog_list_file + * - SSL_CTX_set_ctlog_list_file + * - SSL_CTX_set_ctlog_store + */ +const CTLOG_STORE *SSL_CTX_get0_ctlog_store(const SSL_CTX *ctx); + +#endif /* OPENSSL_NO_CT */ + +/* What the "other" parameter contains in security callback */ +/* Mask for type */ +#define SSL_SECOP_OTHER_TYPE 0xffff0000 +#define SSL_SECOP_OTHER_NONE 0 +#define SSL_SECOP_OTHER_CIPHER (1 << 16) +#define SSL_SECOP_OTHER_CURVE (2 << 16) +#define SSL_SECOP_OTHER_DH (3 << 16) +#define SSL_SECOP_OTHER_PKEY (4 << 16) +#define SSL_SECOP_OTHER_SIGALG (5 << 16) +#define SSL_SECOP_OTHER_CERT (6 << 16) + +/* Indicated operation refers to peer key or certificate */ +#define SSL_SECOP_PEER 0x1000 + +/* Values for "op" parameter in security callback */ + +/* Called to filter ciphers */ +/* Ciphers client supports */ +#define SSL_SECOP_CIPHER_SUPPORTED (1 | SSL_SECOP_OTHER_CIPHER) +/* Cipher shared by client/server */ +#define SSL_SECOP_CIPHER_SHARED (2 | SSL_SECOP_OTHER_CIPHER) +/* Sanity check of cipher server selects */ +#define SSL_SECOP_CIPHER_CHECK (3 | SSL_SECOP_OTHER_CIPHER) +/* Curves supported by client */ +#define SSL_SECOP_CURVE_SUPPORTED (4 | SSL_SECOP_OTHER_CURVE) +/* Curves shared by client/server */ +#define SSL_SECOP_CURVE_SHARED (5 | SSL_SECOP_OTHER_CURVE) +/* Sanity check of curve server selects */ +#define SSL_SECOP_CURVE_CHECK (6 | SSL_SECOP_OTHER_CURVE) +/* Temporary DH key */ +#define SSL_SECOP_TMP_DH (7 | SSL_SECOP_OTHER_PKEY) +/* SSL/TLS version */ +#define SSL_SECOP_VERSION (9 | SSL_SECOP_OTHER_NONE) +/* Session tickets */ +#define SSL_SECOP_TICKET (10 | SSL_SECOP_OTHER_NONE) +/* Supported signature algorithms sent to peer */ +#define SSL_SECOP_SIGALG_SUPPORTED (11 | SSL_SECOP_OTHER_SIGALG) +/* Shared signature algorithm */ +#define SSL_SECOP_SIGALG_SHARED (12 | SSL_SECOP_OTHER_SIGALG) +/* Sanity check signature algorithm allowed */ +#define SSL_SECOP_SIGALG_CHECK (13 | SSL_SECOP_OTHER_SIGALG) +/* Used to get mask of supported public key signature algorithms */ +#define SSL_SECOP_SIGALG_MASK (14 | SSL_SECOP_OTHER_SIGALG) +/* Use to see if compression is allowed */ +#define SSL_SECOP_COMPRESSION (15 | SSL_SECOP_OTHER_NONE) +/* EE key in certificate */ +#define SSL_SECOP_EE_KEY (16 | SSL_SECOP_OTHER_CERT) +/* CA key in certificate */ +#define SSL_SECOP_CA_KEY (17 | SSL_SECOP_OTHER_CERT) +/* CA digest algorithm in certificate */ +#define SSL_SECOP_CA_MD (18 | SSL_SECOP_OTHER_CERT) +/* Peer EE key in certificate */ +#define SSL_SECOP_PEER_EE_KEY (SSL_SECOP_EE_KEY | SSL_SECOP_PEER) +/* Peer CA key in certificate */ +#define SSL_SECOP_PEER_CA_KEY (SSL_SECOP_CA_KEY | SSL_SECOP_PEER) +/* Peer CA digest algorithm in certificate */ +#define SSL_SECOP_PEER_CA_MD (SSL_SECOP_CA_MD | SSL_SECOP_PEER) + +void SSL_set_security_level(SSL *s, int level); +__owur int SSL_get_security_level(const SSL *s); +void SSL_set_security_callback(SSL *s, + int (*cb)(const SSL *s, const SSL_CTX *ctx, + int op, int bits, int nid, + void *other, void *ex)); +int (*SSL_get_security_callback(const SSL *s))(const SSL *s, + const SSL_CTX *ctx, int op, + int bits, int nid, void *other, + void *ex); +void SSL_set0_security_ex_data(SSL *s, void *ex); +__owur void *SSL_get0_security_ex_data(const SSL *s); + +void SSL_CTX_set_security_level(SSL_CTX *ctx, int level); +__owur int SSL_CTX_get_security_level(const SSL_CTX *ctx); +void SSL_CTX_set_security_callback(SSL_CTX *ctx, + int (*cb)(const SSL *s, const SSL_CTX *ctx, + int op, int bits, int nid, + void *other, void *ex)); +int (*SSL_CTX_get_security_callback(const SSL_CTX *ctx))(const SSL *s, + const SSL_CTX *ctx, + int op, int bits, + int nid, + void *other, + void *ex); +void SSL_CTX_set0_security_ex_data(SSL_CTX *ctx, void *ex); +__owur void *SSL_CTX_get0_security_ex_data(const SSL_CTX *ctx); + +/* OPENSSL_INIT flag 0x010000 reserved for internal use */ +#define OPENSSL_INIT_NO_LOAD_SSL_STRINGS 0x00100000L +#define OPENSSL_INIT_LOAD_SSL_STRINGS 0x00200000L + +#define OPENSSL_INIT_SSL_DEFAULT \ + (OPENSSL_INIT_LOAD_SSL_STRINGS | OPENSSL_INIT_LOAD_CRYPTO_STRINGS) + +int OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings); + +#ifndef OPENSSL_NO_UNIT_TEST +__owur const struct openssl_ssl_test_functions *SSL_test_functions(void); +#endif + +__owur int SSL_free_buffers(SSL *ssl); +__owur int SSL_alloc_buffers(SSL *ssl); + +/* Status codes passed to the decrypt session ticket callback. Some of these + * are for internal use only and are never passed to the callback. */ +typedef int SSL_TICKET_STATUS; + +/* Support for ticket appdata */ +/* fatal error, malloc failure */ +#define SSL_TICKET_FATAL_ERR_MALLOC 0 +/* fatal error, either from parsing or decrypting the ticket */ +#define SSL_TICKET_FATAL_ERR_OTHER 1 +/* No ticket present */ +#define SSL_TICKET_NONE 2 +/* Empty ticket present */ +#define SSL_TICKET_EMPTY 3 +/* the ticket couldn't be decrypted */ +#define SSL_TICKET_NO_DECRYPT 4 +/* a ticket was successfully decrypted */ +#define SSL_TICKET_SUCCESS 5 +/* same as above but the ticket needs to be renewed */ +#define SSL_TICKET_SUCCESS_RENEW 6 + +/* Return codes for the decrypt session ticket callback */ +typedef int SSL_TICKET_RETURN; + +/* An error occurred */ +#define SSL_TICKET_RETURN_ABORT 0 +/* Do not use the ticket, do not send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_IGNORE 1 +/* Do not use the ticket, send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_IGNORE_RENEW 2 +/* Use the ticket, do not send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_USE 3 +/* Use the ticket, send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_USE_RENEW 4 + +typedef int (*SSL_CTX_generate_session_ticket_fn)(SSL *s, void *arg); +typedef SSL_TICKET_RETURN (*SSL_CTX_decrypt_session_ticket_fn)(SSL *s, SSL_SESSION *ss, + const unsigned char *keyname, + size_t keyname_length, + SSL_TICKET_STATUS status, + void *arg); +int SSL_CTX_set_session_ticket_cb(SSL_CTX *ctx, + SSL_CTX_generate_session_ticket_fn gen_cb, + SSL_CTX_decrypt_session_ticket_fn dec_cb, + void *arg); +int SSL_SESSION_set1_ticket_appdata(SSL_SESSION *ss, const void *data, size_t len); +int SSL_SESSION_get0_ticket_appdata(SSL_SESSION *ss, void **data, size_t *len); + +typedef unsigned int (*DTLS_timer_cb)(SSL *s, unsigned int timer_us); + +void DTLS_set_timer_cb(SSL *s, DTLS_timer_cb cb); + +typedef int (*SSL_allow_early_data_cb_fn)(SSL *s, void *arg); +void SSL_CTX_set_allow_early_data_cb(SSL_CTX *ctx, + SSL_allow_early_data_cb_fn cb, + void *arg); +void SSL_set_allow_early_data_cb(SSL *s, + SSL_allow_early_data_cb_fn cb, + void *arg); + +/* store the default cipher strings inside the library */ +const char *OSSL_default_cipher_list(void); +const char *OSSL_default_ciphersuites(void); + +/* RFC8879 Certificate compression APIs */ + +int SSL_CTX_compress_certs(SSL_CTX *ctx, int alg); +int SSL_compress_certs(SSL *ssl, int alg); + +int SSL_CTX_set1_cert_comp_preference(SSL_CTX *ctx, int *algs, size_t len); +int SSL_set1_cert_comp_preference(SSL *ssl, int *algs, size_t len); + +int SSL_CTX_set1_compressed_cert(SSL_CTX *ctx, int algorithm, unsigned char *comp_data, + size_t comp_length, size_t orig_length); +int SSL_set1_compressed_cert(SSL *ssl, int algorithm, unsigned char *comp_data, + size_t comp_length, size_t orig_length); +size_t SSL_CTX_get1_compressed_cert(SSL_CTX *ctx, int alg, unsigned char **data, size_t *orig_len); +size_t SSL_get1_compressed_cert(SSL *ssl, int alg, unsigned char **data, size_t *orig_len); + +__owur int SSL_add_expected_rpk(SSL *s, EVP_PKEY *rpk); +__owur EVP_PKEY *SSL_get0_peer_rpk(const SSL *s); +__owur EVP_PKEY *SSL_SESSION_get0_peer_rpk(SSL_SESSION *s); +__owur int SSL_get_negotiated_client_cert_type(const SSL *s); +__owur int SSL_get_negotiated_server_cert_type(const SSL *s); + +__owur int SSL_set1_client_cert_type(SSL *s, const unsigned char *val, size_t len); +__owur int SSL_set1_server_cert_type(SSL *s, const unsigned char *val, size_t len); +__owur int SSL_CTX_set1_client_cert_type(SSL_CTX *ctx, const unsigned char *val, size_t len); +__owur int SSL_CTX_set1_server_cert_type(SSL_CTX *ctx, const unsigned char *val, size_t len); +__owur int SSL_get0_client_cert_type(const SSL *s, unsigned char **t, size_t *len); +__owur int SSL_get0_server_cert_type(const SSL *s, unsigned char **t, size_t *len); +__owur int SSL_CTX_get0_client_cert_type(const SSL_CTX *ctx, unsigned char **t, size_t *len); +__owur int SSL_CTX_get0_server_cert_type(const SSL_CTX *s, unsigned char **t, size_t *len); + +/* + * Protection level. For <= TLSv1.2 only "NONE" and "APPLICATION" are used. + */ +#define OSSL_RECORD_PROTECTION_LEVEL_NONE 0 +#define OSSL_RECORD_PROTECTION_LEVEL_EARLY 1 +#define OSSL_RECORD_PROTECTION_LEVEL_HANDSHAKE 2 +#define OSSL_RECORD_PROTECTION_LEVEL_APPLICATION 3 + +int SSL_set_quic_tls_cbs(SSL *s, const OSSL_DISPATCH *qtdis, void *arg); +int SSL_set_quic_tls_transport_params(SSL *s, + const unsigned char *params, + size_t params_len); + +int SSL_set_quic_tls_early_data_enabled(SSL *s, int enabled); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ui.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ui.h new file mode 100644 index 000000000000..901af471fd0b --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/ui.h @@ -0,0 +1,409 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/ui.h.in + * + * Copyright 2001-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_UI_H +#define OPENSSL_UI_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_UI_H +#endif + +#include + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#include +#endif +#include +#include +#include +#include + +/* For compatibility reasons, the macro OPENSSL_NO_UI is currently retained */ +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifdef OPENSSL_NO_UI_CONSOLE +#define OPENSSL_NO_UI +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * All the following functions return -1 or NULL on error and in some cases + * (UI_process()) -2 if interrupted or in some other way cancelled. When + * everything is fine, they return 0, a positive value or a non-NULL pointer, + * all depending on their purpose. + */ + +/* Creators and destructor. */ +UI *UI_new(void); +UI *UI_new_method(const UI_METHOD *method); +void UI_free(UI *ui); + +/*- + The following functions are used to add strings to be printed and prompt + strings to prompt for data. The names are UI_{add,dup}__string + and UI_{add,dup}_input_boolean. + + UI_{add,dup}__string have the following meanings: + add add a text or prompt string. The pointers given to these + functions are used verbatim, no copying is done. + dup make a copy of the text or prompt string, then add the copy + to the collection of strings in the user interface. + + The function is a name for the functionality that the given + string shall be used for. It can be one of: + input use the string as data prompt. + verify use the string as verification prompt. This + is used to verify a previous input. + info use the string for informational output. + error use the string for error output. + Honestly, there's currently no difference between info and error for the + moment. + + UI_{add,dup}_input_boolean have the same semantics for "add" and "dup", + and are typically used when one wants to prompt for a yes/no response. + + All of the functions in this group take a UI and a prompt string. + The string input and verify addition functions also take a flag argument, + a buffer for the result to end up with, a minimum input size and a maximum + input size (the result buffer MUST be large enough to be able to contain + the maximum number of characters). Additionally, the verify addition + functions takes another buffer to compare the result against. + The boolean input functions take an action description string (which should + be safe to ignore if the expected user action is obvious, for example with + a dialog box with an OK button and a Cancel button), a string of acceptable + characters to mean OK and to mean Cancel. The two last strings are checked + to make sure they don't have common characters. Additionally, the same + flag argument as for the string input is taken, as well as a result buffer. + The result buffer is required to be at least one byte long. Depending on + the answer, the first character from the OK or the Cancel character strings + will be stored in the first byte of the result buffer. No NUL will be + added, so the result is *not* a string. + + On success, the all return an index of the added information. That index + is useful when retrieving results with UI_get0_result(). */ +int UI_add_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_dup_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_add_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, + const char *test_buf); +int UI_dup_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, + const char *test_buf); +int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_add_info_string(UI *ui, const char *text); +int UI_dup_info_string(UI *ui, const char *text); +int UI_add_error_string(UI *ui, const char *text); +int UI_dup_error_string(UI *ui, const char *text); + +/* These are the possible flags. They can be or'ed together. */ +/* Use to have echoing of input */ +#define UI_INPUT_FLAG_ECHO 0x01 +/* + * Use a default password. Where that password is found is completely up to + * the application, it might for example be in the user data set with + * UI_add_user_data(). It is not recommended to have more than one input in + * each UI being marked with this flag, or the application might get + * confused. + */ +#define UI_INPUT_FLAG_DEFAULT_PWD 0x02 + +/*- + * The user of these routines may want to define flags of their own. The core + * UI won't look at those, but will pass them on to the method routines. They + * must use higher bits so they don't get confused with the UI bits above. + * UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use. A good + * example of use is this: + * + * #define MY_UI_FLAG1 (0x01 << UI_INPUT_FLAG_USER_BASE) + * + */ +#define UI_INPUT_FLAG_USER_BASE 16 + +/*- + * The following function helps construct a prompt. + * phrase_desc is a textual short description of the phrase to enter, + * for example "pass phrase", and + * object_name is the name of the object + * (which might be a card name or a file name) or NULL. + * The returned string shall always be allocated on the heap with + * OPENSSL_malloc(), and need to be free'd with OPENSSL_free(). + * + * If the ui_method doesn't contain a pointer to a user-defined prompt + * constructor, a default string is built, looking like this: + * + * "Enter {phrase_desc} for {object_name}:" + * + * So, if phrase_desc has the value "pass phrase" and object_name has + * the value "foo.key", the resulting string is: + * + * "Enter pass phrase for foo.key:" + */ +char *UI_construct_prompt(UI *ui_method, + const char *phrase_desc, const char *object_name); + +/* + * The following function is used to store a pointer to user-specific data. + * Any previous such pointer will be returned and replaced. + * + * For callback purposes, this function makes a lot more sense than using + * ex_data, since the latter requires that different parts of OpenSSL or + * applications share the same ex_data index. + * + * Note that the UI_OpenSSL() method completely ignores the user data. Other + * methods may not, however. + */ +void *UI_add_user_data(UI *ui, void *user_data); +/* + * Alternatively, this function is used to duplicate the user data. + * This uses the duplicator method function. The destroy function will + * be used to free the user data in this case. + */ +int UI_dup_user_data(UI *ui, void *user_data); +/* We need a user data retrieving function as well. */ +void *UI_get0_user_data(UI *ui); + +/* Return the result associated with a prompt given with the index i. */ +const char *UI_get0_result(UI *ui, int i); +int UI_get_result_length(UI *ui, int i); + +/* When all strings have been added, process the whole thing. */ +int UI_process(UI *ui); + +/* + * Give a user interface parameterised control commands. This can be used to + * send down an integer, a data pointer or a function pointer, as well as be + * used to get information from a UI. + */ +int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f)(void)); + +/* The commands */ +/* + * Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the + * OpenSSL error stack before printing any info or added error messages and + * before any prompting. + */ +#define UI_CTRL_PRINT_ERRORS 1 +/* + * Check if a UI_process() is possible to do again with the same instance of + * a user interface. This makes UI_ctrl() return 1 if it is redoable, and 0 + * if not. + */ +#define UI_CTRL_IS_REDOABLE 2 + +/* Some methods may use extra data */ +#define UI_set_app_data(s, arg) UI_set_ex_data(s, 0, arg) +#define UI_get_app_data(s) UI_get_ex_data(s, 0) + +#define UI_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_UI, l, p, newf, dupf, freef) +int UI_set_ex_data(UI *r, int idx, void *arg); +void *UI_get_ex_data(const UI *r, int idx); + +/* Use specific methods instead of the built-in one */ +void UI_set_default_method(const UI_METHOD *meth); +const UI_METHOD *UI_get_default_method(void); +const UI_METHOD *UI_get_method(UI *ui); +const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth); + +#ifndef OPENSSL_NO_UI_CONSOLE + +/* The method with all the built-in thingies */ +UI_METHOD *UI_OpenSSL(void); + +#endif + +/* + * NULL method. Literally does nothing, but may serve as a placeholder + * to avoid internal default. + */ +const UI_METHOD *UI_null(void); + +/* ---------- For method writers ---------- */ +/*- + A method contains a number of functions that implement the low level + of the User Interface. The functions are: + + an opener This function starts a session, maybe by opening + a channel to a tty, or by opening a window. + a writer This function is called to write a given string, + maybe to the tty, maybe as a field label in a + window. + a flusher This function is called to flush everything that + has been output so far. It can be used to actually + display a dialog box after it has been built. + a reader This function is called to read a given prompt, + maybe from the tty, maybe from a field in a + window. Note that it's called with all string + structures, not only the prompt ones, so it must + check such things itself. + a closer This function closes the session, maybe by closing + the channel to the tty, or closing the window. + + All these functions are expected to return: + + 0 on error. + 1 on success. + -1 on out-of-band events, for example if some prompting has + been canceled (by pressing Ctrl-C, for example). This is + only checked when returned by the flusher or the reader. + + The way this is used, the opener is first called, then the writer for all + strings, then the flusher, then the reader for all strings and finally the + closer. Note that if you want to prompt from a terminal or other command + line interface, the best is to have the reader also write the prompts + instead of having the writer do it. If you want to prompt from a dialog + box, the writer can be used to build up the contents of the box, and the + flusher to actually display the box and run the event loop until all data + has been given, after which the reader only grabs the given data and puts + them back into the UI strings. + + All method functions take a UI as argument. Additionally, the writer and + the reader take a UI_STRING. +*/ + +/* + * The UI_STRING type is the data structure that contains all the needed info + * about a string or a prompt, including test data for a verification prompt. + */ +typedef struct ui_string_st UI_STRING; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(UI_STRING, UI_STRING, UI_STRING) +#define sk_UI_STRING_num(sk) OPENSSL_sk_num(ossl_check_const_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_value(sk, idx) ((UI_STRING *)OPENSSL_sk_value(ossl_check_const_UI_STRING_sk_type(sk), (idx))) +#define sk_UI_STRING_new(cmp) ((STACK_OF(UI_STRING) *)OPENSSL_sk_new(ossl_check_UI_STRING_compfunc_type(cmp))) +#define sk_UI_STRING_new_null() ((STACK_OF(UI_STRING) *)OPENSSL_sk_new_null()) +#define sk_UI_STRING_new_reserve(cmp, n) ((STACK_OF(UI_STRING) *)OPENSSL_sk_new_reserve(ossl_check_UI_STRING_compfunc_type(cmp), (n))) +#define sk_UI_STRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_UI_STRING_sk_type(sk), (n)) +#define sk_UI_STRING_free(sk) OPENSSL_sk_free(ossl_check_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_zero(sk) OPENSSL_sk_zero(ossl_check_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_delete(sk, i) ((UI_STRING *)OPENSSL_sk_delete(ossl_check_UI_STRING_sk_type(sk), (i))) +#define sk_UI_STRING_delete_ptr(sk, ptr) ((UI_STRING *)OPENSSL_sk_delete_ptr(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr))) +#define sk_UI_STRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr)) +#define sk_UI_STRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr)) +#define sk_UI_STRING_pop(sk) ((UI_STRING *)OPENSSL_sk_pop(ossl_check_UI_STRING_sk_type(sk))) +#define sk_UI_STRING_shift(sk) ((UI_STRING *)OPENSSL_sk_shift(ossl_check_UI_STRING_sk_type(sk))) +#define sk_UI_STRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_UI_STRING_sk_type(sk),ossl_check_UI_STRING_freefunc_type(freefunc)) +#define sk_UI_STRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr), (idx)) +#define sk_UI_STRING_set(sk, idx, ptr) ((UI_STRING *)OPENSSL_sk_set(ossl_check_UI_STRING_sk_type(sk), (idx), ossl_check_UI_STRING_type(ptr))) +#define sk_UI_STRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr)) +#define sk_UI_STRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr)) +#define sk_UI_STRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr), pnum) +#define sk_UI_STRING_sort(sk) OPENSSL_sk_sort(ossl_check_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_dup(sk) ((STACK_OF(UI_STRING) *)OPENSSL_sk_dup(ossl_check_const_UI_STRING_sk_type(sk))) +#define sk_UI_STRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(UI_STRING) *)OPENSSL_sk_deep_copy(ossl_check_const_UI_STRING_sk_type(sk), ossl_check_UI_STRING_copyfunc_type(copyfunc), ossl_check_UI_STRING_freefunc_type(freefunc))) +#define sk_UI_STRING_set_cmp_func(sk, cmp) ((sk_UI_STRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_compfunc_type(cmp))) + +/* clang-format on */ + +/* + * The different types of strings that are currently supported. This is only + * needed by method authors. + */ +enum UI_string_types { + UIT_NONE = 0, + UIT_PROMPT, /* Prompt for a string */ + UIT_VERIFY, /* Prompt for a string and verify */ + UIT_BOOLEAN, /* Prompt for a yes/no response */ + UIT_INFO, /* Send info to the user */ + UIT_ERROR /* Send an error message to the user */ +}; + +/* Create and manipulate methods */ +UI_METHOD *UI_create_method(const char *name); +void UI_destroy_method(UI_METHOD *ui_method); +int UI_method_set_opener(UI_METHOD *method, int (*opener)(UI *ui)); +int UI_method_set_writer(UI_METHOD *method, + int (*writer)(UI *ui, UI_STRING *uis)); +int UI_method_set_flusher(UI_METHOD *method, int (*flusher)(UI *ui)); +int UI_method_set_reader(UI_METHOD *method, + int (*reader)(UI *ui, UI_STRING *uis)); +int UI_method_set_closer(UI_METHOD *method, int (*closer)(UI *ui)); +int UI_method_set_data_duplicator(UI_METHOD *method, + void *(*duplicator)(UI *ui, void *ui_data), + void (*destructor)(UI *ui, void *ui_data)); +int UI_method_set_prompt_constructor(UI_METHOD *method, + char *(*prompt_constructor)(UI *ui, + const char + *phrase_desc, + const char + *object_name)); +int UI_method_set_ex_data(UI_METHOD *method, int idx, void *data); +int (*UI_method_get_opener(const UI_METHOD *method))(UI *); +int (*UI_method_get_writer(const UI_METHOD *method))(UI *, UI_STRING *); +int (*UI_method_get_flusher(const UI_METHOD *method))(UI *); +int (*UI_method_get_reader(const UI_METHOD *method))(UI *, UI_STRING *); +int (*UI_method_get_closer(const UI_METHOD *method))(UI *); +char *(*UI_method_get_prompt_constructor(const UI_METHOD *method))(UI *, const char *, const char *); +void *(*UI_method_get_data_duplicator(const UI_METHOD *method))(UI *, void *); +void (*UI_method_get_data_destructor(const UI_METHOD *method))(UI *, void *); +const void *UI_method_get_ex_data(const UI_METHOD *method, int idx); + +/* + * The following functions are helpers for method writers to access relevant + * data from a UI_STRING. + */ + +/* Return type of the UI_STRING */ +enum UI_string_types UI_get_string_type(UI_STRING *uis); +/* Return input flags of the UI_STRING */ +int UI_get_input_flags(UI_STRING *uis); +/* Return the actual string to output (the prompt, info or error) */ +const char *UI_get0_output_string(UI_STRING *uis); +/* + * Return the optional action string to output (the boolean prompt + * instruction) + */ +const char *UI_get0_action_string(UI_STRING *uis); +/* Return the result of a prompt */ +const char *UI_get0_result_string(UI_STRING *uis); +int UI_get_result_string_length(UI_STRING *uis); +/* + * Return the string to test the result against. Only useful with verifies. + */ +const char *UI_get0_test_string(UI_STRING *uis); +/* Return the required minimum size of the result */ +int UI_get_result_minsize(UI_STRING *uis); +/* Return the required maximum size of the result */ +int UI_get_result_maxsize(UI_STRING *uis); +/* Set the result of a UI_STRING. */ +int UI_set_result(UI *ui, UI_STRING *uis, const char *result); +int UI_set_result_ex(UI *ui, UI_STRING *uis, const char *result, int len); + +/* A couple of popular utility functions */ +int UI_UTIL_read_pw_string(char *buf, int length, const char *prompt, + int verify); +int UI_UTIL_read_pw(char *buf, char *buff, int size, const char *prompt, + int verify); +UI_METHOD *UI_UTIL_wrap_read_pem_callback(pem_password_cb *cb, int rwflag); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/x509.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/x509.h new file mode 100644 index 000000000000..30681e4fb698 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/x509.h @@ -0,0 +1,1301 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/x509.h.in + * + * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_X509_H +#define OPENSSL_X509_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_X509_H +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#include +#include +#include +#endif + +#include +#include +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Needed stacks for types defined in other headers */ +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_NAME, X509_NAME, X509_NAME) +#define sk_X509_NAME_num(sk) OPENSSL_sk_num(ossl_check_const_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_value(sk, idx) ((X509_NAME *)OPENSSL_sk_value(ossl_check_const_X509_NAME_sk_type(sk), (idx))) +#define sk_X509_NAME_new(cmp) ((STACK_OF(X509_NAME) *)OPENSSL_sk_new(ossl_check_X509_NAME_compfunc_type(cmp))) +#define sk_X509_NAME_new_null() ((STACK_OF(X509_NAME) *)OPENSSL_sk_new_null()) +#define sk_X509_NAME_new_reserve(cmp, n) ((STACK_OF(X509_NAME) *)OPENSSL_sk_new_reserve(ossl_check_X509_NAME_compfunc_type(cmp), (n))) +#define sk_X509_NAME_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_NAME_sk_type(sk), (n)) +#define sk_X509_NAME_free(sk) OPENSSL_sk_free(ossl_check_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_zero(sk) OPENSSL_sk_zero(ossl_check_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_delete(sk, i) ((X509_NAME *)OPENSSL_sk_delete(ossl_check_X509_NAME_sk_type(sk), (i))) +#define sk_X509_NAME_delete_ptr(sk, ptr) ((X509_NAME *)OPENSSL_sk_delete_ptr(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr))) +#define sk_X509_NAME_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr)) +#define sk_X509_NAME_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr)) +#define sk_X509_NAME_pop(sk) ((X509_NAME *)OPENSSL_sk_pop(ossl_check_X509_NAME_sk_type(sk))) +#define sk_X509_NAME_shift(sk) ((X509_NAME *)OPENSSL_sk_shift(ossl_check_X509_NAME_sk_type(sk))) +#define sk_X509_NAME_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_NAME_sk_type(sk),ossl_check_X509_NAME_freefunc_type(freefunc)) +#define sk_X509_NAME_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr), (idx)) +#define sk_X509_NAME_set(sk, idx, ptr) ((X509_NAME *)OPENSSL_sk_set(ossl_check_X509_NAME_sk_type(sk), (idx), ossl_check_X509_NAME_type(ptr))) +#define sk_X509_NAME_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr)) +#define sk_X509_NAME_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr)) +#define sk_X509_NAME_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr), pnum) +#define sk_X509_NAME_sort(sk) OPENSSL_sk_sort(ossl_check_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_dup(sk) ((STACK_OF(X509_NAME) *)OPENSSL_sk_dup(ossl_check_const_X509_NAME_sk_type(sk))) +#define sk_X509_NAME_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_NAME) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_NAME_sk_type(sk), ossl_check_X509_NAME_copyfunc_type(copyfunc), ossl_check_X509_NAME_freefunc_type(freefunc))) +#define sk_X509_NAME_set_cmp_func(sk, cmp) ((sk_X509_NAME_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509, X509, X509) +#define sk_X509_num(sk) OPENSSL_sk_num(ossl_check_const_X509_sk_type(sk)) +#define sk_X509_value(sk, idx) ((X509 *)OPENSSL_sk_value(ossl_check_const_X509_sk_type(sk), (idx))) +#define sk_X509_new(cmp) ((STACK_OF(X509) *)OPENSSL_sk_new(ossl_check_X509_compfunc_type(cmp))) +#define sk_X509_new_null() ((STACK_OF(X509) *)OPENSSL_sk_new_null()) +#define sk_X509_new_reserve(cmp, n) ((STACK_OF(X509) *)OPENSSL_sk_new_reserve(ossl_check_X509_compfunc_type(cmp), (n))) +#define sk_X509_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_sk_type(sk), (n)) +#define sk_X509_free(sk) OPENSSL_sk_free(ossl_check_X509_sk_type(sk)) +#define sk_X509_zero(sk) OPENSSL_sk_zero(ossl_check_X509_sk_type(sk)) +#define sk_X509_delete(sk, i) ((X509 *)OPENSSL_sk_delete(ossl_check_X509_sk_type(sk), (i))) +#define sk_X509_delete_ptr(sk, ptr) ((X509 *)OPENSSL_sk_delete_ptr(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr))) +#define sk_X509_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr)) +#define sk_X509_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr)) +#define sk_X509_pop(sk) ((X509 *)OPENSSL_sk_pop(ossl_check_X509_sk_type(sk))) +#define sk_X509_shift(sk) ((X509 *)OPENSSL_sk_shift(ossl_check_X509_sk_type(sk))) +#define sk_X509_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_sk_type(sk),ossl_check_X509_freefunc_type(freefunc)) +#define sk_X509_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr), (idx)) +#define sk_X509_set(sk, idx, ptr) ((X509 *)OPENSSL_sk_set(ossl_check_X509_sk_type(sk), (idx), ossl_check_X509_type(ptr))) +#define sk_X509_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr)) +#define sk_X509_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr)) +#define sk_X509_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr), pnum) +#define sk_X509_sort(sk) OPENSSL_sk_sort(ossl_check_X509_sk_type(sk)) +#define sk_X509_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_sk_type(sk)) +#define sk_X509_dup(sk) ((STACK_OF(X509) *)OPENSSL_sk_dup(ossl_check_const_X509_sk_type(sk))) +#define sk_X509_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_sk_type(sk), ossl_check_X509_copyfunc_type(copyfunc), ossl_check_X509_freefunc_type(freefunc))) +#define sk_X509_set_cmp_func(sk, cmp) ((sk_X509_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_sk_type(sk), ossl_check_X509_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509_REVOKED, X509_REVOKED, X509_REVOKED) +#define sk_X509_REVOKED_num(sk) OPENSSL_sk_num(ossl_check_const_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_value(sk, idx) ((X509_REVOKED *)OPENSSL_sk_value(ossl_check_const_X509_REVOKED_sk_type(sk), (idx))) +#define sk_X509_REVOKED_new(cmp) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_new(ossl_check_X509_REVOKED_compfunc_type(cmp))) +#define sk_X509_REVOKED_new_null() ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_new_null()) +#define sk_X509_REVOKED_new_reserve(cmp, n) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_new_reserve(ossl_check_X509_REVOKED_compfunc_type(cmp), (n))) +#define sk_X509_REVOKED_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_REVOKED_sk_type(sk), (n)) +#define sk_X509_REVOKED_free(sk) OPENSSL_sk_free(ossl_check_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_zero(sk) OPENSSL_sk_zero(ossl_check_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_delete(sk, i) ((X509_REVOKED *)OPENSSL_sk_delete(ossl_check_X509_REVOKED_sk_type(sk), (i))) +#define sk_X509_REVOKED_delete_ptr(sk, ptr) ((X509_REVOKED *)OPENSSL_sk_delete_ptr(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr))) +#define sk_X509_REVOKED_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr)) +#define sk_X509_REVOKED_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr)) +#define sk_X509_REVOKED_pop(sk) ((X509_REVOKED *)OPENSSL_sk_pop(ossl_check_X509_REVOKED_sk_type(sk))) +#define sk_X509_REVOKED_shift(sk) ((X509_REVOKED *)OPENSSL_sk_shift(ossl_check_X509_REVOKED_sk_type(sk))) +#define sk_X509_REVOKED_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_REVOKED_sk_type(sk),ossl_check_X509_REVOKED_freefunc_type(freefunc)) +#define sk_X509_REVOKED_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr), (idx)) +#define sk_X509_REVOKED_set(sk, idx, ptr) ((X509_REVOKED *)OPENSSL_sk_set(ossl_check_X509_REVOKED_sk_type(sk), (idx), ossl_check_X509_REVOKED_type(ptr))) +#define sk_X509_REVOKED_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr)) +#define sk_X509_REVOKED_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr)) +#define sk_X509_REVOKED_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr), pnum) +#define sk_X509_REVOKED_sort(sk) OPENSSL_sk_sort(ossl_check_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_dup(sk) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_dup(ossl_check_const_X509_REVOKED_sk_type(sk))) +#define sk_X509_REVOKED_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_copyfunc_type(copyfunc), ossl_check_X509_REVOKED_freefunc_type(freefunc))) +#define sk_X509_REVOKED_set_cmp_func(sk, cmp) ((sk_X509_REVOKED_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509_CRL, X509_CRL, X509_CRL) +#define sk_X509_CRL_num(sk) OPENSSL_sk_num(ossl_check_const_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_value(sk, idx) ((X509_CRL *)OPENSSL_sk_value(ossl_check_const_X509_CRL_sk_type(sk), (idx))) +#define sk_X509_CRL_new(cmp) ((STACK_OF(X509_CRL) *)OPENSSL_sk_new(ossl_check_X509_CRL_compfunc_type(cmp))) +#define sk_X509_CRL_new_null() ((STACK_OF(X509_CRL) *)OPENSSL_sk_new_null()) +#define sk_X509_CRL_new_reserve(cmp, n) ((STACK_OF(X509_CRL) *)OPENSSL_sk_new_reserve(ossl_check_X509_CRL_compfunc_type(cmp), (n))) +#define sk_X509_CRL_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_CRL_sk_type(sk), (n)) +#define sk_X509_CRL_free(sk) OPENSSL_sk_free(ossl_check_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_zero(sk) OPENSSL_sk_zero(ossl_check_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_delete(sk, i) ((X509_CRL *)OPENSSL_sk_delete(ossl_check_X509_CRL_sk_type(sk), (i))) +#define sk_X509_CRL_delete_ptr(sk, ptr) ((X509_CRL *)OPENSSL_sk_delete_ptr(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr))) +#define sk_X509_CRL_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr)) +#define sk_X509_CRL_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr)) +#define sk_X509_CRL_pop(sk) ((X509_CRL *)OPENSSL_sk_pop(ossl_check_X509_CRL_sk_type(sk))) +#define sk_X509_CRL_shift(sk) ((X509_CRL *)OPENSSL_sk_shift(ossl_check_X509_CRL_sk_type(sk))) +#define sk_X509_CRL_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_CRL_sk_type(sk),ossl_check_X509_CRL_freefunc_type(freefunc)) +#define sk_X509_CRL_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr), (idx)) +#define sk_X509_CRL_set(sk, idx, ptr) ((X509_CRL *)OPENSSL_sk_set(ossl_check_X509_CRL_sk_type(sk), (idx), ossl_check_X509_CRL_type(ptr))) +#define sk_X509_CRL_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr)) +#define sk_X509_CRL_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr)) +#define sk_X509_CRL_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr), pnum) +#define sk_X509_CRL_sort(sk) OPENSSL_sk_sort(ossl_check_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_dup(sk) ((STACK_OF(X509_CRL) *)OPENSSL_sk_dup(ossl_check_const_X509_CRL_sk_type(sk))) +#define sk_X509_CRL_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_CRL) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_CRL_sk_type(sk), ossl_check_X509_CRL_copyfunc_type(copyfunc), ossl_check_X509_CRL_freefunc_type(freefunc))) +#define sk_X509_CRL_set_cmp_func(sk, cmp) ((sk_X509_CRL_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_compfunc_type(cmp))) + +/* clang-format on */ + +/* Flags for X509_get_signature_info() */ +/* Signature info is valid */ +#define X509_SIG_INFO_VALID 0x1 +/* Signature is suitable for TLS use */ +#define X509_SIG_INFO_TLS 0x2 + +#define X509_FILETYPE_PEM 1 +#define X509_FILETYPE_ASN1 2 +#define X509_FILETYPE_DEFAULT 3 + +/*- + * : + * The KeyUsage BITSTRING is treated as a little-endian integer, hence bit `0` + * is 0x80, while bit `7` is 0x01 (the LSB of the integer value), bit `8` is + * then the MSB of the second octet, or 0x8000. + */ +#define X509v3_KU_DIGITAL_SIGNATURE 0x0080 /* (0) */ +#define X509v3_KU_NON_REPUDIATION 0x0040 /* (1) */ +#define X509v3_KU_KEY_ENCIPHERMENT 0x0020 /* (2) */ +#define X509v3_KU_DATA_ENCIPHERMENT 0x0010 /* (3) */ +#define X509v3_KU_KEY_AGREEMENT 0x0008 /* (4) */ +#define X509v3_KU_KEY_CERT_SIGN 0x0004 /* (5) */ +#define X509v3_KU_CRL_SIGN 0x0002 /* (6) */ +#define X509v3_KU_ENCIPHER_ONLY 0x0001 /* (7) */ +#define X509v3_KU_DECIPHER_ONLY 0x8000 /* (8) */ +#ifndef OPENSSL_NO_DEPRECATED_3_4 +#define X509v3_KU_UNDEF 0xffff /* vestigial, not used */ +#endif + +struct X509_algor_st { + ASN1_OBJECT *algorithm; + ASN1_TYPE *parameter; +} /* X509_ALGOR */; + +typedef STACK_OF(X509_ALGOR) X509_ALGORS; + +typedef struct X509_val_st { + ASN1_TIME *notBefore; + ASN1_TIME *notAfter; +} X509_VAL; + +typedef struct X509_sig_st X509_SIG; + +typedef struct X509_name_entry_st X509_NAME_ENTRY; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_NAME_ENTRY, X509_NAME_ENTRY, X509_NAME_ENTRY) +#define sk_X509_NAME_ENTRY_num(sk) OPENSSL_sk_num(ossl_check_const_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_value(sk, idx) ((X509_NAME_ENTRY *)OPENSSL_sk_value(ossl_check_const_X509_NAME_ENTRY_sk_type(sk), (idx))) +#define sk_X509_NAME_ENTRY_new(cmp) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_new(ossl_check_X509_NAME_ENTRY_compfunc_type(cmp))) +#define sk_X509_NAME_ENTRY_new_null() ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_new_null()) +#define sk_X509_NAME_ENTRY_new_reserve(cmp, n) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_new_reserve(ossl_check_X509_NAME_ENTRY_compfunc_type(cmp), (n))) +#define sk_X509_NAME_ENTRY_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_NAME_ENTRY_sk_type(sk), (n)) +#define sk_X509_NAME_ENTRY_free(sk) OPENSSL_sk_free(ossl_check_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_zero(sk) OPENSSL_sk_zero(ossl_check_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_delete(sk, i) ((X509_NAME_ENTRY *)OPENSSL_sk_delete(ossl_check_X509_NAME_ENTRY_sk_type(sk), (i))) +#define sk_X509_NAME_ENTRY_delete_ptr(sk, ptr) ((X509_NAME_ENTRY *)OPENSSL_sk_delete_ptr(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr))) +#define sk_X509_NAME_ENTRY_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr)) +#define sk_X509_NAME_ENTRY_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr)) +#define sk_X509_NAME_ENTRY_pop(sk) ((X509_NAME_ENTRY *)OPENSSL_sk_pop(ossl_check_X509_NAME_ENTRY_sk_type(sk))) +#define sk_X509_NAME_ENTRY_shift(sk) ((X509_NAME_ENTRY *)OPENSSL_sk_shift(ossl_check_X509_NAME_ENTRY_sk_type(sk))) +#define sk_X509_NAME_ENTRY_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_NAME_ENTRY_sk_type(sk),ossl_check_X509_NAME_ENTRY_freefunc_type(freefunc)) +#define sk_X509_NAME_ENTRY_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr), (idx)) +#define sk_X509_NAME_ENTRY_set(sk, idx, ptr) ((X509_NAME_ENTRY *)OPENSSL_sk_set(ossl_check_X509_NAME_ENTRY_sk_type(sk), (idx), ossl_check_X509_NAME_ENTRY_type(ptr))) +#define sk_X509_NAME_ENTRY_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr)) +#define sk_X509_NAME_ENTRY_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr)) +#define sk_X509_NAME_ENTRY_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr), pnum) +#define sk_X509_NAME_ENTRY_sort(sk) OPENSSL_sk_sort(ossl_check_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_dup(sk) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_dup(ossl_check_const_X509_NAME_ENTRY_sk_type(sk))) +#define sk_X509_NAME_ENTRY_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_copyfunc_type(copyfunc), ossl_check_X509_NAME_ENTRY_freefunc_type(freefunc))) +#define sk_X509_NAME_ENTRY_set_cmp_func(sk, cmp) ((sk_X509_NAME_ENTRY_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_compfunc_type(cmp))) + +/* clang-format on */ + +#define X509_EX_V_NETSCAPE_HACK 0x8000 +#define X509_EX_V_INIT 0x0001 +typedef struct X509_extension_st X509_EXTENSION; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_EXTENSION, X509_EXTENSION, X509_EXTENSION) +#define sk_X509_EXTENSION_num(sk) OPENSSL_sk_num(ossl_check_const_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_value(sk, idx) ((X509_EXTENSION *)OPENSSL_sk_value(ossl_check_const_X509_EXTENSION_sk_type(sk), (idx))) +#define sk_X509_EXTENSION_new(cmp) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_new(ossl_check_X509_EXTENSION_compfunc_type(cmp))) +#define sk_X509_EXTENSION_new_null() ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_new_null()) +#define sk_X509_EXTENSION_new_reserve(cmp, n) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_new_reserve(ossl_check_X509_EXTENSION_compfunc_type(cmp), (n))) +#define sk_X509_EXTENSION_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_EXTENSION_sk_type(sk), (n)) +#define sk_X509_EXTENSION_free(sk) OPENSSL_sk_free(ossl_check_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_zero(sk) OPENSSL_sk_zero(ossl_check_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_delete(sk, i) ((X509_EXTENSION *)OPENSSL_sk_delete(ossl_check_X509_EXTENSION_sk_type(sk), (i))) +#define sk_X509_EXTENSION_delete_ptr(sk, ptr) ((X509_EXTENSION *)OPENSSL_sk_delete_ptr(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr))) +#define sk_X509_EXTENSION_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr)) +#define sk_X509_EXTENSION_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr)) +#define sk_X509_EXTENSION_pop(sk) ((X509_EXTENSION *)OPENSSL_sk_pop(ossl_check_X509_EXTENSION_sk_type(sk))) +#define sk_X509_EXTENSION_shift(sk) ((X509_EXTENSION *)OPENSSL_sk_shift(ossl_check_X509_EXTENSION_sk_type(sk))) +#define sk_X509_EXTENSION_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_EXTENSION_sk_type(sk),ossl_check_X509_EXTENSION_freefunc_type(freefunc)) +#define sk_X509_EXTENSION_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr), (idx)) +#define sk_X509_EXTENSION_set(sk, idx, ptr) ((X509_EXTENSION *)OPENSSL_sk_set(ossl_check_X509_EXTENSION_sk_type(sk), (idx), ossl_check_X509_EXTENSION_type(ptr))) +#define sk_X509_EXTENSION_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr)) +#define sk_X509_EXTENSION_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr)) +#define sk_X509_EXTENSION_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr), pnum) +#define sk_X509_EXTENSION_sort(sk) OPENSSL_sk_sort(ossl_check_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_dup(sk) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_dup(ossl_check_const_X509_EXTENSION_sk_type(sk))) +#define sk_X509_EXTENSION_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_copyfunc_type(copyfunc), ossl_check_X509_EXTENSION_freefunc_type(freefunc))) +#define sk_X509_EXTENSION_set_cmp_func(sk, cmp) ((sk_X509_EXTENSION_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_compfunc_type(cmp))) + +/* clang-format on */ +typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS; +typedef struct x509_attributes_st X509_ATTRIBUTE; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_ATTRIBUTE, X509_ATTRIBUTE, X509_ATTRIBUTE) +#define sk_X509_ATTRIBUTE_num(sk) OPENSSL_sk_num(ossl_check_const_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_value(sk, idx) ((X509_ATTRIBUTE *)OPENSSL_sk_value(ossl_check_const_X509_ATTRIBUTE_sk_type(sk), (idx))) +#define sk_X509_ATTRIBUTE_new(cmp) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_new(ossl_check_X509_ATTRIBUTE_compfunc_type(cmp))) +#define sk_X509_ATTRIBUTE_new_null() ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_new_null()) +#define sk_X509_ATTRIBUTE_new_reserve(cmp, n) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_new_reserve(ossl_check_X509_ATTRIBUTE_compfunc_type(cmp), (n))) +#define sk_X509_ATTRIBUTE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_ATTRIBUTE_sk_type(sk), (n)) +#define sk_X509_ATTRIBUTE_free(sk) OPENSSL_sk_free(ossl_check_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_zero(sk) OPENSSL_sk_zero(ossl_check_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_delete(sk, i) ((X509_ATTRIBUTE *)OPENSSL_sk_delete(ossl_check_X509_ATTRIBUTE_sk_type(sk), (i))) +#define sk_X509_ATTRIBUTE_delete_ptr(sk, ptr) ((X509_ATTRIBUTE *)OPENSSL_sk_delete_ptr(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr))) +#define sk_X509_ATTRIBUTE_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr)) +#define sk_X509_ATTRIBUTE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr)) +#define sk_X509_ATTRIBUTE_pop(sk) ((X509_ATTRIBUTE *)OPENSSL_sk_pop(ossl_check_X509_ATTRIBUTE_sk_type(sk))) +#define sk_X509_ATTRIBUTE_shift(sk) ((X509_ATTRIBUTE *)OPENSSL_sk_shift(ossl_check_X509_ATTRIBUTE_sk_type(sk))) +#define sk_X509_ATTRIBUTE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_ATTRIBUTE_sk_type(sk),ossl_check_X509_ATTRIBUTE_freefunc_type(freefunc)) +#define sk_X509_ATTRIBUTE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr), (idx)) +#define sk_X509_ATTRIBUTE_set(sk, idx, ptr) ((X509_ATTRIBUTE *)OPENSSL_sk_set(ossl_check_X509_ATTRIBUTE_sk_type(sk), (idx), ossl_check_X509_ATTRIBUTE_type(ptr))) +#define sk_X509_ATTRIBUTE_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr)) +#define sk_X509_ATTRIBUTE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr)) +#define sk_X509_ATTRIBUTE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr), pnum) +#define sk_X509_ATTRIBUTE_sort(sk) OPENSSL_sk_sort(ossl_check_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_dup(sk) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_dup(ossl_check_const_X509_ATTRIBUTE_sk_type(sk))) +#define sk_X509_ATTRIBUTE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_copyfunc_type(copyfunc), ossl_check_X509_ATTRIBUTE_freefunc_type(freefunc))) +#define sk_X509_ATTRIBUTE_set_cmp_func(sk, cmp) ((sk_X509_ATTRIBUTE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_compfunc_type(cmp))) + +/* clang-format on */ +typedef struct X509_req_info_st X509_REQ_INFO; +typedef struct X509_req_st X509_REQ; +typedef struct x509_cert_aux_st X509_CERT_AUX; +typedef struct x509_cinf_st X509_CINF; + +/* Flags for X509_print_ex() */ + +#define X509_FLAG_COMPAT 0 +#define X509_FLAG_NO_HEADER 1L +#define X509_FLAG_NO_VERSION (1L << 1) +#define X509_FLAG_NO_SERIAL (1L << 2) +#define X509_FLAG_NO_SIGNAME (1L << 3) +#define X509_FLAG_NO_ISSUER (1L << 4) +#define X509_FLAG_NO_VALIDITY (1L << 5) +#define X509_FLAG_NO_SUBJECT (1L << 6) +#define X509_FLAG_NO_PUBKEY (1L << 7) +#define X509_FLAG_NO_EXTENSIONS (1L << 8) +#define X509_FLAG_NO_SIGDUMP (1L << 9) +#define X509_FLAG_NO_AUX (1L << 10) +#define X509_FLAG_NO_ATTRIBUTES (1L << 11) +#define X509_FLAG_NO_IDS (1L << 12) +#define X509_FLAG_EXTENSIONS_ONLY_KID (1L << 13) + +/* Flags specific to X509_NAME_print_ex() */ + +/* The field separator information */ + +#define XN_FLAG_SEP_MASK (0xf << 16) + +#define XN_FLAG_COMPAT 0 /* Traditional; use old X509_NAME_print */ +#define XN_FLAG_SEP_COMMA_PLUS (1 << 16) /* RFC2253 ,+ */ +#define XN_FLAG_SEP_CPLUS_SPC (2 << 16) /* ,+ spaced: more readable */ +#define XN_FLAG_SEP_SPLUS_SPC (3 << 16) /* ;+ spaced */ +#define XN_FLAG_SEP_MULTILINE (4 << 16) /* One line per field */ + +#define XN_FLAG_DN_REV (1 << 20) /* Reverse DN order */ + +/* How the field name is shown */ + +#define XN_FLAG_FN_MASK (0x3 << 21) + +#define XN_FLAG_FN_SN 0 /* Object short name */ +#define XN_FLAG_FN_LN (1 << 21) /* Object long name */ +#define XN_FLAG_FN_OID (2 << 21) /* Always use OIDs */ +#define XN_FLAG_FN_NONE (3 << 21) /* No field names */ + +#define XN_FLAG_SPC_EQ (1 << 23) /* Put spaces round '=' */ + +/* + * This determines if we dump fields we don't recognise: RFC2253 requires + * this. + */ + +#define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24) + +#define XN_FLAG_FN_ALIGN (1 << 25) /* Align field names to 20 \ + * characters */ + +/* Complete set of RFC2253 flags */ + +#define XN_FLAG_RFC2253 (ASN1_STRFLGS_RFC2253 | XN_FLAG_SEP_COMMA_PLUS | XN_FLAG_DN_REV | XN_FLAG_FN_SN | XN_FLAG_DUMP_UNKNOWN_FIELDS) + +/* readable oneline form */ + +#define XN_FLAG_ONELINE (ASN1_STRFLGS_RFC2253 | ASN1_STRFLGS_ESC_QUOTE | XN_FLAG_SEP_CPLUS_SPC | XN_FLAG_SPC_EQ | XN_FLAG_FN_SN) + +/* readable multiline form */ + +#define XN_FLAG_MULTILINE (ASN1_STRFLGS_ESC_CTRL | ASN1_STRFLGS_ESC_MSB | XN_FLAG_SEP_MULTILINE | XN_FLAG_SPC_EQ | XN_FLAG_FN_LN | XN_FLAG_FN_ALIGN) + +typedef struct X509_crl_info_st X509_CRL_INFO; + +typedef struct private_key_st { + int version; + /* The PKCS#8 data types */ + X509_ALGOR *enc_algor; + ASN1_OCTET_STRING *enc_pkey; /* encrypted pub key */ + /* When decrypted, the following will not be NULL */ + EVP_PKEY *dec_pkey; + /* used to encrypt and decrypt */ + int key_length; + char *key_data; + int key_free; /* true if we should auto free key_data */ + /* expanded version of 'enc_algor' */ + EVP_CIPHER_INFO cipher; +} X509_PKEY; + +typedef struct X509_info_st { + X509 *x509; + X509_CRL *crl; + X509_PKEY *x_pkey; + EVP_CIPHER_INFO enc_cipher; + int enc_len; + char *enc_data; +} X509_INFO; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_INFO, X509_INFO, X509_INFO) +#define sk_X509_INFO_num(sk) OPENSSL_sk_num(ossl_check_const_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_value(sk, idx) ((X509_INFO *)OPENSSL_sk_value(ossl_check_const_X509_INFO_sk_type(sk), (idx))) +#define sk_X509_INFO_new(cmp) ((STACK_OF(X509_INFO) *)OPENSSL_sk_new(ossl_check_X509_INFO_compfunc_type(cmp))) +#define sk_X509_INFO_new_null() ((STACK_OF(X509_INFO) *)OPENSSL_sk_new_null()) +#define sk_X509_INFO_new_reserve(cmp, n) ((STACK_OF(X509_INFO) *)OPENSSL_sk_new_reserve(ossl_check_X509_INFO_compfunc_type(cmp), (n))) +#define sk_X509_INFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_INFO_sk_type(sk), (n)) +#define sk_X509_INFO_free(sk) OPENSSL_sk_free(ossl_check_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_zero(sk) OPENSSL_sk_zero(ossl_check_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_delete(sk, i) ((X509_INFO *)OPENSSL_sk_delete(ossl_check_X509_INFO_sk_type(sk), (i))) +#define sk_X509_INFO_delete_ptr(sk, ptr) ((X509_INFO *)OPENSSL_sk_delete_ptr(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr))) +#define sk_X509_INFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr)) +#define sk_X509_INFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr)) +#define sk_X509_INFO_pop(sk) ((X509_INFO *)OPENSSL_sk_pop(ossl_check_X509_INFO_sk_type(sk))) +#define sk_X509_INFO_shift(sk) ((X509_INFO *)OPENSSL_sk_shift(ossl_check_X509_INFO_sk_type(sk))) +#define sk_X509_INFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_INFO_sk_type(sk),ossl_check_X509_INFO_freefunc_type(freefunc)) +#define sk_X509_INFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr), (idx)) +#define sk_X509_INFO_set(sk, idx, ptr) ((X509_INFO *)OPENSSL_sk_set(ossl_check_X509_INFO_sk_type(sk), (idx), ossl_check_X509_INFO_type(ptr))) +#define sk_X509_INFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr)) +#define sk_X509_INFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr)) +#define sk_X509_INFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr), pnum) +#define sk_X509_INFO_sort(sk) OPENSSL_sk_sort(ossl_check_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_dup(sk) ((STACK_OF(X509_INFO) *)OPENSSL_sk_dup(ossl_check_const_X509_INFO_sk_type(sk))) +#define sk_X509_INFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_INFO) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_INFO_sk_type(sk), ossl_check_X509_INFO_copyfunc_type(copyfunc), ossl_check_X509_INFO_freefunc_type(freefunc))) +#define sk_X509_INFO_set_cmp_func(sk, cmp) ((sk_X509_INFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_compfunc_type(cmp))) + +/* clang-format on */ + +/* + * The next 2 structures and their 8 routines are used to manipulate Netscape's + * spki structures - useful if you are writing a CA web page + */ +typedef struct Netscape_spkac_st { + X509_PUBKEY *pubkey; + ASN1_IA5STRING *challenge; /* challenge sent in atlas >= PR2 */ +} NETSCAPE_SPKAC; + +typedef struct Netscape_spki_st { + NETSCAPE_SPKAC *spkac; /* signed public key and challenge */ + X509_ALGOR sig_algor; + ASN1_BIT_STRING *signature; +} NETSCAPE_SPKI; + +/* Netscape certificate sequence structure */ +typedef struct Netscape_certificate_sequence { + ASN1_OBJECT *type; + STACK_OF(X509) *certs; +} NETSCAPE_CERT_SEQUENCE; + +/*- Unused (and iv length is wrong) +typedef struct CBCParameter_st + { + unsigned char iv[8]; + } CBC_PARAM; +*/ + +/* Password based encryption structure */ + +typedef struct PBEPARAM_st { + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *iter; +} PBEPARAM; + +/* Password based encryption V2 structures */ + +typedef struct PBE2PARAM_st { + X509_ALGOR *keyfunc; + X509_ALGOR *encryption; +} PBE2PARAM; + +typedef struct PBKDF2PARAM_st { + /* Usually OCTET STRING but could be anything */ + ASN1_TYPE *salt; + ASN1_INTEGER *iter; + ASN1_INTEGER *keylength; + X509_ALGOR *prf; +} PBKDF2PARAM; + +typedef struct { + X509_ALGOR *keyDerivationFunc; + X509_ALGOR *messageAuthScheme; +} PBMAC1PARAM; + +#ifndef OPENSSL_NO_SCRYPT +typedef struct SCRYPT_PARAMS_st { + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *costParameter; + ASN1_INTEGER *blockSize; + ASN1_INTEGER *parallelizationParameter; + ASN1_INTEGER *keyLength; +} SCRYPT_PARAMS; +#endif + +#ifdef __cplusplus +} +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define X509_EXT_PACK_UNKNOWN 1 +#define X509_EXT_PACK_STRING 2 + +#define X509_extract_key(x) X509_get_pubkey(x) /*****/ +#define X509_REQ_extract_key(a) X509_REQ_get_pubkey(a) +#define X509_name_cmp(a, b) X509_NAME_cmp((a), (b)) + +void X509_CRL_set_default_method(const X509_CRL_METHOD *meth); +X509_CRL_METHOD *X509_CRL_METHOD_new(int (*crl_init)(X509_CRL *crl), + int (*crl_free)(X509_CRL *crl), + int (*crl_lookup)(X509_CRL *crl, + X509_REVOKED **ret, + const ASN1_INTEGER *serial, + const X509_NAME *issuer), + int (*crl_verify)(X509_CRL *crl, + EVP_PKEY *pk)); +void X509_CRL_METHOD_free(X509_CRL_METHOD *m); + +void X509_CRL_set_meth_data(X509_CRL *crl, void *dat); +void *X509_CRL_get_meth_data(X509_CRL *crl); + +const char *X509_verify_cert_error_string(long n); + +int X509_verify(X509 *a, EVP_PKEY *r); +int X509_self_signed(X509 *cert, int verify_signature); + +int X509_REQ_verify_ex(X509_REQ *a, EVP_PKEY *r, OSSL_LIB_CTX *libctx, + const char *propq); +int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r); +int X509_CRL_verify(X509_CRL *a, EVP_PKEY *r); +int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r); + +NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len); +char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *x); +EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x); +int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey); + +int NETSCAPE_SPKI_print(BIO *out, NETSCAPE_SPKI *spki); + +int X509_signature_dump(BIO *bp, const ASN1_STRING *sig, int indent); +int X509_signature_print(BIO *bp, const X509_ALGOR *alg, + const ASN1_STRING *sig); + +int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx); +int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx); +int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx); +int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md); + +int X509_pubkey_digest(const X509 *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_digest(const X509 *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +ASN1_OCTET_STRING *X509_digest_sig(const X509 *cert, + EVP_MD **md_used, int *md_is_fallback); +int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); + +X509 *X509_load_http(const char *url, BIO *bio, BIO *rbio, int timeout); +X509_CRL *X509_CRL_load_http(const char *url, BIO *bio, BIO *rbio, int timeout); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#include /* OSSL_HTTP_REQ_CTX_nbio_d2i */ +#define X509_http_nbio(rctx, pcert) \ + OSSL_HTTP_REQ_CTX_nbio_d2i(rctx, pcert, ASN1_ITEM_rptr(X509)) +#define X509_CRL_http_nbio(rctx, pcrl) \ + OSSL_HTTP_REQ_CTX_nbio_d2i(rctx, pcrl, ASN1_ITEM_rptr(X509_CRL)) +#endif + +#ifndef OPENSSL_NO_STDIO +X509 *d2i_X509_fp(FILE *fp, X509 **x509); +int i2d_X509_fp(FILE *fp, const X509 *x509); +X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl); +int i2d_X509_CRL_fp(FILE *fp, const X509_CRL *crl); +X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req); +int i2d_X509_REQ_fp(FILE *fp, const X509_REQ *req); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSAPrivateKey_fp(FILE *fp, const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSAPublicKey_fp(FILE *fp, const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSA_PUBKEY_fp(FILE *fp, const RSA *rsa); +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifndef OPENSSL_NO_DSA +OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa); +OSSL_DEPRECATEDIN_3_0 int i2d_DSA_PUBKEY_fp(FILE *fp, const DSA *dsa); +OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa); +OSSL_DEPRECATEDIN_3_0 int i2d_DSAPrivateKey_fp(FILE *fp, const DSA *dsa); +#endif +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifndef OPENSSL_NO_EC +OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey); +OSSL_DEPRECATEDIN_3_0 int i2d_EC_PUBKEY_fp(FILE *fp, const EC_KEY *eckey); +OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey); +OSSL_DEPRECATEDIN_3_0 int i2d_ECPrivateKey_fp(FILE *fp, const EC_KEY *eckey); +#endif /* OPENSSL_NO_EC */ +#endif /* OPENSSL_NO_DEPRECATED_3_0 */ +X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8); +int i2d_PKCS8_fp(FILE *fp, const X509_SIG *p8); +X509_PUBKEY *d2i_X509_PUBKEY_fp(FILE *fp, X509_PUBKEY **xpk); +int i2d_X509_PUBKEY_fp(FILE *fp, const X509_PUBKEY *xpk); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, const PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, const EVP_PKEY *key); +int i2d_PrivateKey_fp(FILE *fp, const EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_ex_fp(FILE *fp, EVP_PKEY **a, OSSL_LIB_CTX *libctx, + const char *propq); +EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a); +int i2d_PUBKEY_fp(FILE *fp, const EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_ex_fp(FILE *fp, EVP_PKEY **a, OSSL_LIB_CTX *libctx, + const char *propq); +EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a); +#endif + +X509 *d2i_X509_bio(BIO *bp, X509 **x509); +int i2d_X509_bio(BIO *bp, const X509 *x509); +X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl); +int i2d_X509_CRL_bio(BIO *bp, const X509_CRL *crl); +X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req); +int i2d_X509_REQ_bio(BIO *bp, const X509_REQ *req); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSAPrivateKey_bio(BIO *bp, const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSAPublicKey_bio(BIO *bp, const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSA_PUBKEY_bio(BIO *bp, const RSA *rsa); +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifndef OPENSSL_NO_DSA +OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa); +OSSL_DEPRECATEDIN_3_0 int i2d_DSA_PUBKEY_bio(BIO *bp, const DSA *dsa); +OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa); +OSSL_DEPRECATEDIN_3_0 int i2d_DSAPrivateKey_bio(BIO *bp, const DSA *dsa); +#endif +#endif + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifndef OPENSSL_NO_EC +OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey); +OSSL_DEPRECATEDIN_3_0 int i2d_EC_PUBKEY_bio(BIO *bp, const EC_KEY *eckey); +OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey); +OSSL_DEPRECATEDIN_3_0 int i2d_ECPrivateKey_bio(BIO *bp, const EC_KEY *eckey); +#endif /* OPENSSL_NO_EC */ +#endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8); +int i2d_PKCS8_bio(BIO *bp, const X509_SIG *p8); +X509_PUBKEY *d2i_X509_PUBKEY_bio(BIO *bp, X509_PUBKEY **xpk); +int i2d_X509_PUBKEY_bio(BIO *bp, const X509_PUBKEY *xpk); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, const PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, const EVP_PKEY *key); +int i2d_PrivateKey_bio(BIO *bp, const EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_ex_bio(BIO *bp, EVP_PKEY **a, OSSL_LIB_CTX *libctx, + const char *propq); +EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a); +int i2d_PUBKEY_bio(BIO *bp, const EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_ex_bio(BIO *bp, EVP_PKEY **a, OSSL_LIB_CTX *libctx, + const char *propq); +EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a); + +DECLARE_ASN1_DUP_FUNCTION(X509) +DECLARE_ASN1_DUP_FUNCTION(X509_ALGOR) +DECLARE_ASN1_DUP_FUNCTION(X509_ATTRIBUTE) +DECLARE_ASN1_DUP_FUNCTION(X509_CRL) +DECLARE_ASN1_DUP_FUNCTION(X509_EXTENSION) +DECLARE_ASN1_DUP_FUNCTION(X509_PUBKEY) +DECLARE_ASN1_DUP_FUNCTION(X509_REQ) +DECLARE_ASN1_DUP_FUNCTION(X509_REVOKED) +int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, + void *pval); +void X509_ALGOR_get0(const ASN1_OBJECT **paobj, int *pptype, + const void **ppval, const X509_ALGOR *algor); +void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); +int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); +int X509_ALGOR_copy(X509_ALGOR *dest, const X509_ALGOR *src); + +DECLARE_ASN1_DUP_FUNCTION(X509_NAME) +DECLARE_ASN1_DUP_FUNCTION(X509_NAME_ENTRY) + +int X509_cmp_time(const ASN1_TIME *s, time_t *t); +int X509_cmp_current_time(const ASN1_TIME *s); +int X509_cmp_timeframe(const X509_VERIFY_PARAM *vpm, + const ASN1_TIME *start, const ASN1_TIME *end); +ASN1_TIME *X509_time_adj(ASN1_TIME *s, long adj, time_t *t); +ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, + int offset_day, long offset_sec, time_t *t); +ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj); + +const char *X509_get_default_cert_area(void); +const char *X509_get_default_cert_dir(void); +const char *X509_get_default_cert_file(void); +const char *X509_get_default_cert_dir_env(void); +const char *X509_get_default_cert_file_env(void); +const char *X509_get_default_private_dir(void); + +X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +X509 *X509_REQ_to_X509(X509_REQ *r, int days, EVP_PKEY *pkey); + +DECLARE_ASN1_FUNCTIONS(X509_ALGOR) +DECLARE_ASN1_ENCODE_FUNCTIONS(X509_ALGORS, X509_ALGORS, X509_ALGORS) +DECLARE_ASN1_FUNCTIONS(X509_VAL) + +DECLARE_ASN1_FUNCTIONS(X509_PUBKEY) + +X509_PUBKEY *X509_PUBKEY_new_ex(OSSL_LIB_CTX *libctx, const char *propq); +int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey); +EVP_PKEY *X509_PUBKEY_get0(const X509_PUBKEY *key); +EVP_PKEY *X509_PUBKEY_get(const X509_PUBKEY *key); +int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain); +long X509_get_pathlen(X509 *x); +DECLARE_ASN1_ENCODE_FUNCTIONS_only(EVP_PKEY, PUBKEY) +EVP_PKEY *d2i_PUBKEY_ex(EVP_PKEY **a, const unsigned char **pp, long length, + OSSL_LIB_CTX *libctx, const char *propq); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0, RSA, RSA_PUBKEY) +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifndef OPENSSL_NO_DSA +DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0, DSA, DSA_PUBKEY) +#endif +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifndef OPENSSL_NO_EC +DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0, EC_KEY, EC_PUBKEY) +#endif +#endif + +DECLARE_ASN1_FUNCTIONS(X509_SIG) +void X509_SIG_get0(const X509_SIG *sig, const X509_ALGOR **palg, + const ASN1_OCTET_STRING **pdigest); +void X509_SIG_getm(X509_SIG *sig, X509_ALGOR **palg, + ASN1_OCTET_STRING **pdigest); + +DECLARE_ASN1_FUNCTIONS(X509_REQ_INFO) +DECLARE_ASN1_FUNCTIONS(X509_REQ) +X509_REQ *X509_REQ_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +DECLARE_ASN1_FUNCTIONS(X509_ATTRIBUTE) +X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value); + +DECLARE_ASN1_FUNCTIONS(X509_EXTENSION) +DECLARE_ASN1_ENCODE_FUNCTIONS(X509_EXTENSIONS, X509_EXTENSIONS, X509_EXTENSIONS) + +DECLARE_ASN1_FUNCTIONS(X509_NAME_ENTRY) + +DECLARE_ASN1_FUNCTIONS(X509_NAME) + +int X509_NAME_set(X509_NAME **xn, const X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(X509_CINF) +DECLARE_ASN1_FUNCTIONS(X509) +X509 *X509_new_ex(OSSL_LIB_CTX *libctx, const char *propq); +DECLARE_ASN1_FUNCTIONS(X509_CERT_AUX) + +#define X509_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509, l, p, newf, dupf, freef) +int X509_set_ex_data(X509 *r, int idx, void *arg); +void *X509_get_ex_data(const X509 *r, int idx); +DECLARE_ASN1_ENCODE_FUNCTIONS_only(X509, X509_AUX) + +int i2d_re_X509_tbs(X509 *x, unsigned char **pp); + +int X509_SIG_INFO_get(const X509_SIG_INFO *siginf, int *mdnid, int *pknid, + int *secbits, uint32_t *flags); +void X509_SIG_INFO_set(X509_SIG_INFO *siginf, int mdnid, int pknid, + int secbits, uint32_t flags); + +int X509_get_signature_info(X509 *x, int *mdnid, int *pknid, int *secbits, + uint32_t *flags); + +void X509_get0_signature(const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg, const X509 *x); +int X509_get_signature_nid(const X509 *x); + +void X509_set0_distinguishing_id(X509 *x, ASN1_OCTET_STRING *d_id); +ASN1_OCTET_STRING *X509_get0_distinguishing_id(X509 *x); +void X509_REQ_set0_distinguishing_id(X509_REQ *x, ASN1_OCTET_STRING *d_id); +ASN1_OCTET_STRING *X509_REQ_get0_distinguishing_id(X509_REQ *x); + +int X509_alias_set1(X509 *x, const unsigned char *name, int len); +int X509_keyid_set1(X509 *x, const unsigned char *id, int len); +unsigned char *X509_alias_get0(X509 *x, int *len); +unsigned char *X509_keyid_get0(X509 *x, int *len); + +DECLARE_ASN1_FUNCTIONS(X509_REVOKED) +DECLARE_ASN1_FUNCTIONS(X509_CRL_INFO) +DECLARE_ASN1_FUNCTIONS(X509_CRL) +X509_CRL *X509_CRL_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev); +int X509_CRL_get0_by_serial(X509_CRL *crl, + X509_REVOKED **ret, const ASN1_INTEGER *serial); +int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x); + +X509_PKEY *X509_PKEY_new(void); +void X509_PKEY_free(X509_PKEY *a); + +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKAC) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_CERT_SEQUENCE) + +X509_INFO *X509_INFO_new(void); +void X509_INFO_free(X509_INFO *a); +char *X509_NAME_oneline(const X509_NAME *a, char *buf, int size); + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *algor1, + ASN1_BIT_STRING *signature, char *data, EVP_PKEY *pkey); +OSSL_DEPRECATEDIN_3_0 +int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data, + unsigned char *md, unsigned int *len); +OSSL_DEPRECATEDIN_3_0 +int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, X509_ALGOR *algor2, + ASN1_BIT_STRING *signature, char *data, EVP_PKEY *pkey, + const EVP_MD *type); +#endif +int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, void *data, + unsigned char *md, unsigned int *len); +int ASN1_item_verify(const ASN1_ITEM *it, const X509_ALGOR *alg, + const ASN1_BIT_STRING *signature, const void *data, + EVP_PKEY *pkey); +int ASN1_item_verify_ctx(const ASN1_ITEM *it, const X509_ALGOR *alg, + const ASN1_BIT_STRING *signature, const void *data, + EVP_MD_CTX *ctx); +int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2, + ASN1_BIT_STRING *signature, const void *data, + EVP_PKEY *pkey, const EVP_MD *md); +int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + const void *data, EVP_MD_CTX *ctx); + +#define X509_VERSION_1 0 +#define X509_VERSION_2 1 +#define X509_VERSION_3 2 + +long X509_get_version(const X509 *x); +int X509_set_version(X509 *x, long version); +int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial); +ASN1_INTEGER *X509_get_serialNumber(X509 *x); +const ASN1_INTEGER *X509_get0_serialNumber(const X509 *x); +int X509_set_issuer_name(X509 *x, const X509_NAME *name); +X509_NAME *X509_get_issuer_name(const X509 *a); +int X509_set_subject_name(X509 *x, const X509_NAME *name); +X509_NAME *X509_get_subject_name(const X509 *a); +const ASN1_TIME *X509_get0_notBefore(const X509 *x); +ASN1_TIME *X509_getm_notBefore(const X509 *x); +int X509_set1_notBefore(X509 *x, const ASN1_TIME *tm); +const ASN1_TIME *X509_get0_notAfter(const X509 *x); +ASN1_TIME *X509_getm_notAfter(const X509 *x); +int X509_set1_notAfter(X509 *x, const ASN1_TIME *tm); +int X509_set_pubkey(X509 *x, EVP_PKEY *pkey); +int X509_up_ref(X509 *x); +int X509_get_signature_type(const X509 *x); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define X509_get_notBefore X509_getm_notBefore +#define X509_get_notAfter X509_getm_notAfter +#define X509_set_notBefore X509_set1_notBefore +#define X509_set_notAfter X509_set1_notAfter +#endif + +/* + * This one is only used so that a binary form can output, as in + * i2d_X509_PUBKEY(X509_get_X509_PUBKEY(x), &buf) + */ +X509_PUBKEY *X509_get_X509_PUBKEY(const X509 *x); +const STACK_OF(X509_EXTENSION) *X509_get0_extensions(const X509 *x); +void X509_get0_uids(const X509 *x, const ASN1_BIT_STRING **piuid, + const ASN1_BIT_STRING **psuid); +const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x); + +EVP_PKEY *X509_get0_pubkey(const X509 *x); +EVP_PKEY *X509_get_pubkey(X509 *x); +ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x); + +#define X509_REQ_VERSION_1 0 + +long X509_REQ_get_version(const X509_REQ *req); +int X509_REQ_set_version(X509_REQ *x, long version); +X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req); +int X509_REQ_set_subject_name(X509_REQ *req, const X509_NAME *name); +void X509_REQ_get0_signature(const X509_REQ *req, const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg); +void X509_REQ_set0_signature(X509_REQ *req, ASN1_BIT_STRING *psig); +int X509_REQ_set1_signature_algo(X509_REQ *req, X509_ALGOR *palg); +int X509_REQ_get_signature_nid(const X509_REQ *req); +int i2d_re_X509_REQ_tbs(X509_REQ *req, unsigned char **pp); +int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey); +EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req); +EVP_PKEY *X509_REQ_get0_pubkey(const X509_REQ *req); +X509_PUBKEY *X509_REQ_get_X509_PUBKEY(X509_REQ *req); +int X509_REQ_extension_nid(int nid); +int *X509_REQ_get_extension_nids(void); +void X509_REQ_set_extension_nids(int *nids); +STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(OSSL_FUTURE_CONST X509_REQ *req); +int X509_REQ_add_extensions_nid(X509_REQ *req, + const STACK_OF(X509_EXTENSION) *exts, int nid); +int X509_REQ_add_extensions(X509_REQ *req, const STACK_OF(X509_EXTENSION) *ext); +int X509_REQ_get_attr_count(const X509_REQ *req); +int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos); +int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, const ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc); +X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc); +int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr); +int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_NID(X509_REQ *req, + int nid, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_txt(X509_REQ *req, + const char *attrname, int type, + const unsigned char *bytes, int len); + +#define X509_CRL_VERSION_1 0 +#define X509_CRL_VERSION_2 1 + +int X509_CRL_set_version(X509_CRL *x, long version); +int X509_CRL_set_issuer_name(X509_CRL *x, const X509_NAME *name); +int X509_CRL_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_sort(X509_CRL *crl); +int X509_CRL_up_ref(X509_CRL *crl); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define X509_CRL_set_lastUpdate X509_CRL_set1_lastUpdate +#define X509_CRL_set_nextUpdate X509_CRL_set1_nextUpdate +#endif + +long X509_CRL_get_version(const X509_CRL *crl); +const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl); +const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl); +OSSL_DEPRECATEDIN_1_1_0 ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl); +#endif +X509_NAME *X509_CRL_get_issuer(const X509_CRL *crl); +const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl); +STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl); +void X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg); +int X509_CRL_get_signature_nid(const X509_CRL *crl); +int i2d_re_X509_CRL_tbs(X509_CRL *req, unsigned char **pp); + +const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(const X509_REVOKED *x); +int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial); +const ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *x); +int X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm); +const STACK_OF(X509_EXTENSION) * +X509_REVOKED_get0_extensions(const X509_REVOKED *r); + +X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer, + EVP_PKEY *skey, const EVP_MD *md, unsigned int flags); + +int X509_REQ_check_private_key(const X509_REQ *req, EVP_PKEY *pkey); + +int X509_check_private_key(const X509 *cert, const EVP_PKEY *pkey); +int X509_chain_check_suiteb(int *perror_depth, + X509 *x, STACK_OF(X509) *chain, + unsigned long flags); +int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk, unsigned long flags); +void OSSL_STACK_OF_X509_free(STACK_OF(X509) *certs); +STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain); + +int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_and_serial_hash(X509 *a); + +int X509_issuer_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_name_hash(X509 *a); + +int X509_subject_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_subject_name_hash(X509 *x); + +#ifndef OPENSSL_NO_MD5 +unsigned long X509_issuer_name_hash_old(X509 *a); +unsigned long X509_subject_name_hash_old(X509 *x); +#endif + +#define X509_ADD_FLAG_DEFAULT 0 +#define X509_ADD_FLAG_UP_REF 0x1 +#define X509_ADD_FLAG_PREPEND 0x2 +#define X509_ADD_FLAG_NO_DUP 0x4 +#define X509_ADD_FLAG_NO_SS 0x8 +int X509_add_cert(STACK_OF(X509) *sk, X509 *cert, int flags); +int X509_add_certs(STACK_OF(X509) *sk, STACK_OF(X509) *certs, int flags); + +int X509_cmp(const X509 *a, const X509 *b); +int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define X509_NAME_hash(x) X509_NAME_hash_ex(x, NULL, NULL, NULL) +OSSL_DEPRECATEDIN_3_0 int X509_certificate_type(const X509 *x, + const EVP_PKEY *pubkey); +#endif +unsigned long X509_NAME_hash_ex(const X509_NAME *x, OSSL_LIB_CTX *libctx, + const char *propq, int *ok); +unsigned long X509_NAME_hash_old(const X509_NAME *x); + +int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b); +int X509_CRL_match(const X509_CRL *a, const X509_CRL *b); +int X509_aux_print(BIO *out, X509 *x, int indent); +#ifndef OPENSSL_NO_STDIO +int X509_print_ex_fp(FILE *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); +int X509_print_fp(FILE *bp, X509 *x); +int X509_CRL_print_fp(FILE *bp, X509_CRL *x); +int X509_REQ_print_fp(FILE *bp, X509_REQ *req); +int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm, int indent, + unsigned long flags); +#endif + +int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase); +int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent, + unsigned long flags); +int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); +int X509_print(BIO *bp, X509 *x); +int X509_ocspid_print(BIO *bp, X509 *x); +int X509_CRL_print_ex(BIO *out, X509_CRL *x, unsigned long nmflag); +int X509_CRL_print(BIO *bp, X509_CRL *x); +int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, + unsigned long cflag); +int X509_REQ_print(BIO *bp, X509_REQ *req); + +int X509_NAME_entry_count(const X509_NAME *name); +int X509_NAME_get_text_by_NID(const X509_NAME *name, int nid, + char *buf, int len); +int X509_NAME_get_text_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj, + char *buf, int len); + +/* + * NOTE: you should be passing -1, not 0 as lastpos. The functions that use + * lastpos, search after that position on. + */ +int X509_NAME_get_index_by_NID(const X509_NAME *name, int nid, int lastpos); +int X509_NAME_get_index_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj, + int lastpos); +X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name, int loc); +X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc); +int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *ne, + int loc, int set); +int X509_NAME_add_entry_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len, int loc, + int set); +int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, + const unsigned char *bytes, int len, int loc, + int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, + const char *field, int type, + const unsigned char *bytes, + int len); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, + int type, + const unsigned char *bytes, + int len); +int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, + const unsigned char *bytes, int len, int loc, + int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, + int len); +int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, const ASN1_OBJECT *obj); +int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, + const unsigned char *bytes, int len); +ASN1_OBJECT *X509_NAME_ENTRY_get_object(const X509_NAME_ENTRY *ne); +ASN1_STRING *X509_NAME_ENTRY_get_data(const X509_NAME_ENTRY *ne); +int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne); + +int X509_NAME_get0_der(const X509_NAME *nm, const unsigned char **pder, + size_t *pderlen); + +int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x); +int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, + int nid, int lastpos); +int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x, + const ASN1_OBJECT *obj, int lastpos); +int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x, + int crit, int lastpos); +X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc); +X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc); +STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, + X509_EXTENSION *ex, int loc); +STACK_OF(X509_EXTENSION) *X509v3_add_extensions(STACK_OF(X509_EXTENSION) **target, + const STACK_OF(X509_EXTENSION) *exts); + +int X509_get_ext_count(const X509 *x); +int X509_get_ext_by_NID(const X509 *x, int nid, int lastpos); +int X509_get_ext_by_OBJ(const X509 *x, const ASN1_OBJECT *obj, int lastpos); +int X509_get_ext_by_critical(const X509 *x, int crit, int lastpos); +X509_EXTENSION *X509_get_ext(const X509 *x, int loc); +X509_EXTENSION *X509_delete_ext(X509 *x, int loc); +int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc); +void *X509_get_ext_d2i(const X509 *x, int nid, int *crit, int *idx); +int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_CRL_get_ext_count(const X509_CRL *x); +int X509_CRL_get_ext_by_NID(const X509_CRL *x, int nid, int lastpos); +int X509_CRL_get_ext_by_OBJ(const X509_CRL *x, const ASN1_OBJECT *obj, + int lastpos); +int X509_CRL_get_ext_by_critical(const X509_CRL *x, int crit, int lastpos); +X509_EXTENSION *X509_CRL_get_ext(const X509_CRL *x, int loc); +X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc); +int X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc); +void *X509_CRL_get_ext_d2i(const X509_CRL *x, int nid, int *crit, int *idx); +int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_REVOKED_get_ext_count(const X509_REVOKED *x); +int X509_REVOKED_get_ext_by_NID(const X509_REVOKED *x, int nid, int lastpos); +int X509_REVOKED_get_ext_by_OBJ(const X509_REVOKED *x, const ASN1_OBJECT *obj, + int lastpos); +int X509_REVOKED_get_ext_by_critical(const X509_REVOKED *x, int crit, + int lastpos); +X509_EXTENSION *X509_REVOKED_get_ext(const X509_REVOKED *x, int loc); +X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc); +int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc); +void *X509_REVOKED_get_ext_d2i(const X509_REVOKED *x, int nid, int *crit, + int *idx); +int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit, + unsigned long flags); + +X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, + int nid, int crit, + ASN1_OCTET_STRING *data); +X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex, + const ASN1_OBJECT *obj, int crit, + ASN1_OCTET_STRING *data); +int X509_EXTENSION_set_object(X509_EXTENSION *ex, const ASN1_OBJECT *obj); +int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit); +int X509_EXTENSION_set_data(X509_EXTENSION *ex, ASN1_OCTET_STRING *data); +ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *ex); +ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne); +int X509_EXTENSION_get_critical(const X509_EXTENSION *ex); + +int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x); +int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, + int lastpos); +int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, + const ASN1_OBJECT *obj, int lastpos); +X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc); +X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, + X509_ATTRIBUTE *attr); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) + **x, + const ASN1_OBJECT *obj, + int type, + const unsigned char *bytes, + int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) + **x, + int nid, int type, + const unsigned char *bytes, + int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) + **x, + const char *attrname, + int type, + const unsigned char *bytes, + int len); +void *X509at_get0_data_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *x, + const ASN1_OBJECT *obj, int lastpos, int type); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, + int atrtype, const void *data, + int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, + const ASN1_OBJECT *obj, + int atrtype, const void *data, + int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, + const char *atrname, int type, + const unsigned char *bytes, + int len); +int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj); +int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, + const void *data, int len); +void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int atrtype, + void *data); +int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr); +ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr); +ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx); + +int EVP_PKEY_get_attr_count(const EVP_PKEY *key); +int EVP_PKEY_get_attr_by_NID(const EVP_PKEY *key, int nid, int lastpos); +int EVP_PKEY_get_attr_by_OBJ(const EVP_PKEY *key, const ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *EVP_PKEY_get_attr(const EVP_PKEY *key, int loc); +X509_ATTRIBUTE *EVP_PKEY_delete_attr(EVP_PKEY *key, int loc); +int EVP_PKEY_add1_attr(EVP_PKEY *key, X509_ATTRIBUTE *attr); +int EVP_PKEY_add1_attr_by_OBJ(EVP_PKEY *key, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_NID(EVP_PKEY *key, + int nid, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_txt(EVP_PKEY *key, + const char *attrname, int type, + const unsigned char *bytes, int len); + +/* lookup a cert from a X509 STACK */ +X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk, const X509_NAME *name, + const ASN1_INTEGER *serial); +X509 *X509_find_by_subject(STACK_OF(X509) *sk, const X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(PBEPARAM) +DECLARE_ASN1_FUNCTIONS(PBE2PARAM) +DECLARE_ASN1_FUNCTIONS(PBKDF2PARAM) +DECLARE_ASN1_FUNCTIONS(PBMAC1PARAM) +#ifndef OPENSSL_NO_SCRYPT +DECLARE_ASN1_FUNCTIONS(SCRYPT_PARAMS) +#endif + +int PKCS5_pbe_set0_algor(X509_ALGOR *algor, int alg, int iter, + const unsigned char *salt, int saltlen); +int PKCS5_pbe_set0_algor_ex(X509_ALGOR *algor, int alg, int iter, + const unsigned char *salt, int saltlen, + OSSL_LIB_CTX *libctx); + +X509_ALGOR *PKCS5_pbe_set(int alg, int iter, + const unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe_set_ex(int alg, int iter, + const unsigned char *salt, int saltlen, + OSSL_LIB_CTX *libctx); + +X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe2_set_iv(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen, + unsigned char *aiv, int prf_nid); +X509_ALGOR *PKCS5_pbe2_set_iv_ex(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen, + unsigned char *aiv, int prf_nid, + OSSL_LIB_CTX *libctx); + +#ifndef OPENSSL_NO_SCRYPT +X509_ALGOR *PKCS5_pbe2_set_scrypt(const EVP_CIPHER *cipher, + const unsigned char *salt, int saltlen, + unsigned char *aiv, uint64_t N, uint64_t r, + uint64_t p); +#endif + +X509_ALGOR *PKCS5_pbkdf2_set(int iter, unsigned char *salt, int saltlen, + int prf_nid, int keylen); +X509_ALGOR *PKCS5_pbkdf2_set_ex(int iter, unsigned char *salt, int saltlen, + int prf_nid, int keylen, + OSSL_LIB_CTX *libctx); + +PBKDF2PARAM *PBMAC1_get1_pbkdf2_param(const X509_ALGOR *macalg); +/* PKCS#8 utilities */ + +DECLARE_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO) + +EVP_PKEY *EVP_PKCS82PKEY(const PKCS8_PRIV_KEY_INFO *p8); +EVP_PKEY *EVP_PKCS82PKEY_ex(const PKCS8_PRIV_KEY_INFO *p8, OSSL_LIB_CTX *libctx, + const char *propq); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(const EVP_PKEY *pkey); + +int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, + int version, int ptype, void *pval, + unsigned char *penc, int penclen); +int PKCS8_pkey_get0(const ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + const X509_ALGOR **pa, const PKCS8_PRIV_KEY_INFO *p8); + +const STACK_OF(X509_ATTRIBUTE) * +PKCS8_pkey_get0_attrs(const PKCS8_PRIV_KEY_INFO *p8); +int PKCS8_pkey_add1_attr(PKCS8_PRIV_KEY_INFO *p8, X509_ATTRIBUTE *attr); +int PKCS8_pkey_add1_attr_by_NID(PKCS8_PRIV_KEY_INFO *p8, int nid, int type, + const unsigned char *bytes, int len); +int PKCS8_pkey_add1_attr_by_OBJ(PKCS8_PRIV_KEY_INFO *p8, const ASN1_OBJECT *obj, + int type, const unsigned char *bytes, int len); + +void X509_PUBKEY_set0_public_key(X509_PUBKEY *pub, + unsigned char *penc, int penclen); +int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj, + int ptype, void *pval, + unsigned char *penc, int penclen); +int X509_PUBKEY_get0_param(ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + X509_ALGOR **pa, const X509_PUBKEY *pub); +int X509_PUBKEY_eq(const X509_PUBKEY *a, const X509_PUBKEY *b); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/x509_acert.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/x509_acert.h new file mode 100644 index 000000000000..ed45c1e9184b --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/x509_acert.h @@ -0,0 +1,312 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/x509_acert.h.in + * + * Copyright 2022-2026 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_X509_ACERT_H +#define OPENSSL_X509_ACERT_H +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct X509_acert_st X509_ACERT; +typedef struct X509_acert_info_st X509_ACERT_INFO; +typedef struct ossl_object_digest_info_st OSSL_OBJECT_DIGEST_INFO; +typedef struct ossl_issuer_serial_st OSSL_ISSUER_SERIAL; +typedef struct X509_acert_issuer_v2form_st X509_ACERT_ISSUER_V2FORM; + +DECLARE_ASN1_FUNCTIONS(X509_ACERT) +DECLARE_ASN1_DUP_FUNCTION(X509_ACERT) +DECLARE_ASN1_ITEM(X509_ACERT_INFO) +DECLARE_ASN1_ALLOC_FUNCTIONS(X509_ACERT_INFO) +DECLARE_ASN1_ALLOC_FUNCTIONS(OSSL_OBJECT_DIGEST_INFO) +DECLARE_ASN1_ALLOC_FUNCTIONS(OSSL_ISSUER_SERIAL) +DECLARE_ASN1_ALLOC_FUNCTIONS(X509_ACERT_ISSUER_V2FORM) + +#ifndef OPENSSL_NO_STDIO +X509_ACERT *d2i_X509_ACERT_fp(FILE *fp, X509_ACERT **acert); +int i2d_X509_ACERT_fp(FILE *fp, const X509_ACERT *acert); +#endif + +DECLARE_PEM_rw(X509_ACERT, X509_ACERT) + +X509_ACERT *d2i_X509_ACERT_bio(BIO *bp, X509_ACERT **acert); +int i2d_X509_ACERT_bio(BIO *bp, const X509_ACERT *acert); + +int X509_ACERT_sign(X509_ACERT *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_ACERT_sign_ctx(X509_ACERT *x, EVP_MD_CTX *ctx); +int X509_ACERT_verify(X509_ACERT *a, EVP_PKEY *r); + +#define X509_ACERT_VERSION_2 1 + +const GENERAL_NAMES *X509_ACERT_get0_holder_entityName(const X509_ACERT *x); +const OSSL_ISSUER_SERIAL *X509_ACERT_get0_holder_baseCertId(const X509_ACERT *x); +const OSSL_OBJECT_DIGEST_INFO *X509_ACERT_get0_holder_digest(const X509_ACERT *x); +const X509_NAME *X509_ACERT_get0_issuerName(const X509_ACERT *x); +long X509_ACERT_get_version(const X509_ACERT *x); +void X509_ACERT_get0_signature(const X509_ACERT *x, + const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg); +int X509_ACERT_get_signature_nid(const X509_ACERT *x); +const X509_ALGOR *X509_ACERT_get0_info_sigalg(const X509_ACERT *x); +const ASN1_INTEGER *X509_ACERT_get0_serialNumber(const X509_ACERT *x); +const ASN1_TIME *X509_ACERT_get0_notBefore(const X509_ACERT *x); +const ASN1_TIME *X509_ACERT_get0_notAfter(const X509_ACERT *x); +const ASN1_BIT_STRING *X509_ACERT_get0_issuerUID(const X509_ACERT *x); + +int X509_ACERT_print(BIO *bp, X509_ACERT *x); +int X509_ACERT_print_ex(BIO *bp, X509_ACERT *x, unsigned long nmflags, + unsigned long cflag); + +int X509_ACERT_get_attr_count(const X509_ACERT *x); +int X509_ACERT_get_attr_by_NID(const X509_ACERT *x, int nid, int lastpos); +int X509_ACERT_get_attr_by_OBJ(const X509_ACERT *x, const ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *X509_ACERT_get_attr(const X509_ACERT *x, int loc); +X509_ATTRIBUTE *X509_ACERT_delete_attr(X509_ACERT *x, int loc); + +void *X509_ACERT_get_ext_d2i(const X509_ACERT *x, int nid, int *crit, int *idx); +int X509_ACERT_add1_ext_i2d(X509_ACERT *x, int nid, void *value, int crit, + unsigned long flags); +const STACK_OF(X509_EXTENSION) *X509_ACERT_get0_extensions(const X509_ACERT *x); + +#define OSSL_OBJECT_DIGEST_INFO_PUBLIC_KEY 0 +#define OSSL_OBJECT_DIGEST_INFO_PUBLIC_KEY_CERT 1 +#define OSSL_OBJECT_DIGEST_INFO_OTHER 2 /* must not be used in RFC 5755 profile */ +int X509_ACERT_set_version(X509_ACERT *x, long version); +void X509_ACERT_set0_holder_entityName(X509_ACERT *x, GENERAL_NAMES *name); +void X509_ACERT_set0_holder_baseCertId(X509_ACERT *x, OSSL_ISSUER_SERIAL *isss); +void X509_ACERT_set0_holder_digest(X509_ACERT *x, + OSSL_OBJECT_DIGEST_INFO *dinfo); + +int X509_ACERT_add1_attr(X509_ACERT *x, X509_ATTRIBUTE *attr); +int X509_ACERT_add1_attr_by_OBJ(X509_ACERT *x, const ASN1_OBJECT *obj, + int type, const void *bytes, int len); +int X509_ACERT_add1_attr_by_NID(X509_ACERT *x, int nid, int type, + const void *bytes, int len); +int X509_ACERT_add1_attr_by_txt(X509_ACERT *x, const char *attrname, int type, + const unsigned char *bytes, int len); +int X509_ACERT_add_attr_nconf(CONF *conf, const char *section, + X509_ACERT *acert); + +int X509_ACERT_set1_issuerName(X509_ACERT *x, const X509_NAME *name); +int X509_ACERT_set1_serialNumber(X509_ACERT *x, const ASN1_INTEGER *serial); +int X509_ACERT_set1_notBefore(X509_ACERT *x, const ASN1_GENERALIZEDTIME *time); +int X509_ACERT_set1_notAfter(X509_ACERT *x, const ASN1_GENERALIZEDTIME *time); + +void OSSL_OBJECT_DIGEST_INFO_get0_digest(const OSSL_OBJECT_DIGEST_INFO *o, + int *digestedObjectType, + const X509_ALGOR **digestAlgorithm, + const ASN1_BIT_STRING **digest); + +int OSSL_OBJECT_DIGEST_INFO_set1_digest(OSSL_OBJECT_DIGEST_INFO *o, + int digestedObjectType, + X509_ALGOR *digestAlgorithm, + ASN1_BIT_STRING *digest); + +const X509_NAME *OSSL_ISSUER_SERIAL_get0_issuer(const OSSL_ISSUER_SERIAL *isss); +const ASN1_INTEGER *OSSL_ISSUER_SERIAL_get0_serial(const OSSL_ISSUER_SERIAL *isss); +const ASN1_BIT_STRING *OSSL_ISSUER_SERIAL_get0_issuerUID(const OSSL_ISSUER_SERIAL *isss); + +int OSSL_ISSUER_SERIAL_set1_issuer(OSSL_ISSUER_SERIAL *isss, + const X509_NAME *issuer); +int OSSL_ISSUER_SERIAL_set1_serial(OSSL_ISSUER_SERIAL *isss, + const ASN1_INTEGER *serial); +int OSSL_ISSUER_SERIAL_set1_issuerUID(OSSL_ISSUER_SERIAL *isss, + const ASN1_BIT_STRING *uid); + +#define OSSL_IETFAS_OCTETS 0 +#define OSSL_IETFAS_OID 1 +#define OSSL_IETFAS_STRING 2 + +typedef struct OSSL_IETF_ATTR_SYNTAX_VALUE_st OSSL_IETF_ATTR_SYNTAX_VALUE; +typedef struct OSSL_IETF_ATTR_SYNTAX_st OSSL_IETF_ATTR_SYNTAX; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_IETF_ATTR_SYNTAX_VALUE, OSSL_IETF_ATTR_SYNTAX_VALUE, OSSL_IETF_ATTR_SYNTAX_VALUE) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_value(sk, idx) ((OSSL_IETF_ATTR_SYNTAX_VALUE *)OPENSSL_sk_value(ossl_check_const_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), (idx))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_new(cmp) ((STACK_OF(OSSL_IETF_ATTR_SYNTAX_VALUE) *)OPENSSL_sk_new(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_compfunc_type(cmp))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_new_null() ((STACK_OF(OSSL_IETF_ATTR_SYNTAX_VALUE) *)OPENSSL_sk_new_null()) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_new_reserve(cmp, n) ((STACK_OF(OSSL_IETF_ATTR_SYNTAX_VALUE) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_compfunc_type(cmp), (n))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), (n)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_free(sk) OPENSSL_sk_free(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_delete(sk, i) ((OSSL_IETF_ATTR_SYNTAX_VALUE *)OPENSSL_sk_delete(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), (i))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_delete_ptr(sk, ptr) ((OSSL_IETF_ATTR_SYNTAX_VALUE *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_pop(sk) ((OSSL_IETF_ATTR_SYNTAX_VALUE *)OPENSSL_sk_pop(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_shift(sk) ((OSSL_IETF_ATTR_SYNTAX_VALUE *)OPENSSL_sk_shift(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk),ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_freefunc_type(freefunc)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr), (idx)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_set(sk, idx, ptr) ((OSSL_IETF_ATTR_SYNTAX_VALUE *)OPENSSL_sk_set(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), (idx), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr), pnum) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_dup(sk) ((STACK_OF(OSSL_IETF_ATTR_SYNTAX_VALUE) *)OPENSSL_sk_dup(ossl_check_const_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_IETF_ATTR_SYNTAX_VALUE) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_copyfunc_type(copyfunc), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_freefunc_type(freefunc))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_set_cmp_func(sk, cmp) ((sk_OSSL_IETF_ATTR_SYNTAX_VALUE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_ITEM(OSSL_IETF_ATTR_SYNTAX_VALUE) +DECLARE_ASN1_ALLOC_FUNCTIONS(OSSL_IETF_ATTR_SYNTAX_VALUE) +DECLARE_ASN1_FUNCTIONS(OSSL_IETF_ATTR_SYNTAX) + +const GENERAL_NAMES * +OSSL_IETF_ATTR_SYNTAX_get0_policyAuthority(const OSSL_IETF_ATTR_SYNTAX *a); +void OSSL_IETF_ATTR_SYNTAX_set0_policyAuthority(OSSL_IETF_ATTR_SYNTAX *a, + GENERAL_NAMES *names); + +int OSSL_IETF_ATTR_SYNTAX_get_value_num(const OSSL_IETF_ATTR_SYNTAX *a); +void *OSSL_IETF_ATTR_SYNTAX_get0_value(const OSSL_IETF_ATTR_SYNTAX *a, + int ind, int *type); +int OSSL_IETF_ATTR_SYNTAX_add1_value(OSSL_IETF_ATTR_SYNTAX *a, int type, + void *data); +int OSSL_IETF_ATTR_SYNTAX_print(BIO *bp, OSSL_IETF_ATTR_SYNTAX *a, int indent); + +struct TARGET_CERT_st { + OSSL_ISSUER_SERIAL *targetCertificate; + GENERAL_NAME *targetName; + OSSL_OBJECT_DIGEST_INFO *certDigestInfo; +}; + +typedef struct TARGET_CERT_st OSSL_TARGET_CERT; + +#define OSSL_TGT_TARGET_NAME 0 +#define OSSL_TGT_TARGET_GROUP 1 +#define OSSL_TGT_TARGET_CERT 2 + +typedef struct TARGET_st { + int type; + union { + GENERAL_NAME *targetName; + GENERAL_NAME *targetGroup; + OSSL_TARGET_CERT *targetCert; + } choice; +} OSSL_TARGET; + +typedef STACK_OF(OSSL_TARGET) OSSL_TARGETS; +typedef STACK_OF(OSSL_TARGETS) OSSL_TARGETING_INFORMATION; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_TARGET, OSSL_TARGET, OSSL_TARGET) +#define sk_OSSL_TARGET_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_TARGET_sk_type(sk)) +#define sk_OSSL_TARGET_value(sk, idx) ((OSSL_TARGET *)OPENSSL_sk_value(ossl_check_const_OSSL_TARGET_sk_type(sk), (idx))) +#define sk_OSSL_TARGET_new(cmp) ((STACK_OF(OSSL_TARGET) *)OPENSSL_sk_new(ossl_check_OSSL_TARGET_compfunc_type(cmp))) +#define sk_OSSL_TARGET_new_null() ((STACK_OF(OSSL_TARGET) *)OPENSSL_sk_new_null()) +#define sk_OSSL_TARGET_new_reserve(cmp, n) ((STACK_OF(OSSL_TARGET) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_TARGET_compfunc_type(cmp), (n))) +#define sk_OSSL_TARGET_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_TARGET_sk_type(sk), (n)) +#define sk_OSSL_TARGET_free(sk) OPENSSL_sk_free(ossl_check_OSSL_TARGET_sk_type(sk)) +#define sk_OSSL_TARGET_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_TARGET_sk_type(sk)) +#define sk_OSSL_TARGET_delete(sk, i) ((OSSL_TARGET *)OPENSSL_sk_delete(ossl_check_OSSL_TARGET_sk_type(sk), (i))) +#define sk_OSSL_TARGET_delete_ptr(sk, ptr) ((OSSL_TARGET *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_type(ptr))) +#define sk_OSSL_TARGET_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_type(ptr)) +#define sk_OSSL_TARGET_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_type(ptr)) +#define sk_OSSL_TARGET_pop(sk) ((OSSL_TARGET *)OPENSSL_sk_pop(ossl_check_OSSL_TARGET_sk_type(sk))) +#define sk_OSSL_TARGET_shift(sk) ((OSSL_TARGET *)OPENSSL_sk_shift(ossl_check_OSSL_TARGET_sk_type(sk))) +#define sk_OSSL_TARGET_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_TARGET_sk_type(sk),ossl_check_OSSL_TARGET_freefunc_type(freefunc)) +#define sk_OSSL_TARGET_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_type(ptr), (idx)) +#define sk_OSSL_TARGET_set(sk, idx, ptr) ((OSSL_TARGET *)OPENSSL_sk_set(ossl_check_OSSL_TARGET_sk_type(sk), (idx), ossl_check_OSSL_TARGET_type(ptr))) +#define sk_OSSL_TARGET_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_type(ptr)) +#define sk_OSSL_TARGET_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_type(ptr)) +#define sk_OSSL_TARGET_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_type(ptr), pnum) +#define sk_OSSL_TARGET_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_TARGET_sk_type(sk)) +#define sk_OSSL_TARGET_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_TARGET_sk_type(sk)) +#define sk_OSSL_TARGET_dup(sk) ((STACK_OF(OSSL_TARGET) *)OPENSSL_sk_dup(ossl_check_const_OSSL_TARGET_sk_type(sk))) +#define sk_OSSL_TARGET_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_TARGET) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_copyfunc_type(copyfunc), ossl_check_OSSL_TARGET_freefunc_type(freefunc))) +#define sk_OSSL_TARGET_set_cmp_func(sk, cmp) ((sk_OSSL_TARGET_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_compfunc_type(cmp))) + +/* clang-format on */ + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_TARGETS, OSSL_TARGETS, OSSL_TARGETS) +#define sk_OSSL_TARGETS_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_TARGETS_sk_type(sk)) +#define sk_OSSL_TARGETS_value(sk, idx) ((OSSL_TARGETS *)OPENSSL_sk_value(ossl_check_const_OSSL_TARGETS_sk_type(sk), (idx))) +#define sk_OSSL_TARGETS_new(cmp) ((STACK_OF(OSSL_TARGETS) *)OPENSSL_sk_new(ossl_check_OSSL_TARGETS_compfunc_type(cmp))) +#define sk_OSSL_TARGETS_new_null() ((STACK_OF(OSSL_TARGETS) *)OPENSSL_sk_new_null()) +#define sk_OSSL_TARGETS_new_reserve(cmp, n) ((STACK_OF(OSSL_TARGETS) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_TARGETS_compfunc_type(cmp), (n))) +#define sk_OSSL_TARGETS_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_TARGETS_sk_type(sk), (n)) +#define sk_OSSL_TARGETS_free(sk) OPENSSL_sk_free(ossl_check_OSSL_TARGETS_sk_type(sk)) +#define sk_OSSL_TARGETS_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_TARGETS_sk_type(sk)) +#define sk_OSSL_TARGETS_delete(sk, i) ((OSSL_TARGETS *)OPENSSL_sk_delete(ossl_check_OSSL_TARGETS_sk_type(sk), (i))) +#define sk_OSSL_TARGETS_delete_ptr(sk, ptr) ((OSSL_TARGETS *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_type(ptr))) +#define sk_OSSL_TARGETS_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_type(ptr)) +#define sk_OSSL_TARGETS_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_type(ptr)) +#define sk_OSSL_TARGETS_pop(sk) ((OSSL_TARGETS *)OPENSSL_sk_pop(ossl_check_OSSL_TARGETS_sk_type(sk))) +#define sk_OSSL_TARGETS_shift(sk) ((OSSL_TARGETS *)OPENSSL_sk_shift(ossl_check_OSSL_TARGETS_sk_type(sk))) +#define sk_OSSL_TARGETS_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_TARGETS_sk_type(sk),ossl_check_OSSL_TARGETS_freefunc_type(freefunc)) +#define sk_OSSL_TARGETS_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_type(ptr), (idx)) +#define sk_OSSL_TARGETS_set(sk, idx, ptr) ((OSSL_TARGETS *)OPENSSL_sk_set(ossl_check_OSSL_TARGETS_sk_type(sk), (idx), ossl_check_OSSL_TARGETS_type(ptr))) +#define sk_OSSL_TARGETS_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_type(ptr)) +#define sk_OSSL_TARGETS_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_type(ptr)) +#define sk_OSSL_TARGETS_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_type(ptr), pnum) +#define sk_OSSL_TARGETS_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_TARGETS_sk_type(sk)) +#define sk_OSSL_TARGETS_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_TARGETS_sk_type(sk)) +#define sk_OSSL_TARGETS_dup(sk) ((STACK_OF(OSSL_TARGETS) *)OPENSSL_sk_dup(ossl_check_const_OSSL_TARGETS_sk_type(sk))) +#define sk_OSSL_TARGETS_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_TARGETS) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_copyfunc_type(copyfunc), ossl_check_OSSL_TARGETS_freefunc_type(freefunc))) +#define sk_OSSL_TARGETS_set_cmp_func(sk, cmp) ((sk_OSSL_TARGETS_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_FUNCTIONS(OSSL_TARGET) +DECLARE_ASN1_FUNCTIONS(OSSL_TARGETS) +DECLARE_ASN1_FUNCTIONS(OSSL_TARGETING_INFORMATION) + +typedef STACK_OF(OSSL_ISSUER_SERIAL) OSSL_AUTHORITY_ATTRIBUTE_ID_SYNTAX; +DECLARE_ASN1_FUNCTIONS(OSSL_AUTHORITY_ATTRIBUTE_ID_SYNTAX) + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ISSUER_SERIAL, OSSL_ISSUER_SERIAL, OSSL_ISSUER_SERIAL) +#define sk_OSSL_ISSUER_SERIAL_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_value(sk, idx) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_value(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk), (idx))) +#define sk_OSSL_ISSUER_SERIAL_new(cmp) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_new(ossl_check_OSSL_ISSUER_SERIAL_compfunc_type(cmp))) +#define sk_OSSL_ISSUER_SERIAL_new_null() ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ISSUER_SERIAL_new_reserve(cmp, n) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ISSUER_SERIAL_compfunc_type(cmp), (n))) +#define sk_OSSL_ISSUER_SERIAL_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), (n)) +#define sk_OSSL_ISSUER_SERIAL_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_delete(sk, i) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_delete(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), (i))) +#define sk_OSSL_ISSUER_SERIAL_delete_ptr(sk, ptr) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr))) +#define sk_OSSL_ISSUER_SERIAL_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr)) +#define sk_OSSL_ISSUER_SERIAL_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr)) +#define sk_OSSL_ISSUER_SERIAL_pop(sk) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_pop(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk))) +#define sk_OSSL_ISSUER_SERIAL_shift(sk) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_shift(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk))) +#define sk_OSSL_ISSUER_SERIAL_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk),ossl_check_OSSL_ISSUER_SERIAL_freefunc_type(freefunc)) +#define sk_OSSL_ISSUER_SERIAL_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr), (idx)) +#define sk_OSSL_ISSUER_SERIAL_set(sk, idx, ptr) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_set(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), (idx), ossl_check_OSSL_ISSUER_SERIAL_type(ptr))) +#define sk_OSSL_ISSUER_SERIAL_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr)) +#define sk_OSSL_ISSUER_SERIAL_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr)) +#define sk_OSSL_ISSUER_SERIAL_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr), pnum) +#define sk_OSSL_ISSUER_SERIAL_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_dup(sk) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk))) +#define sk_OSSL_ISSUER_SERIAL_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_copyfunc_type(copyfunc), ossl_check_OSSL_ISSUER_SERIAL_freefunc_type(freefunc))) +#define sk_OSSL_ISSUER_SERIAL_set_cmp_func(sk, cmp) ((sk_OSSL_ISSUER_SERIAL_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_compfunc_type(cmp))) + +/* clang-format on */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/x509_vfy.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/x509_vfy.h new file mode 100644 index 000000000000..22e713f1ec3d --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/x509_vfy.h @@ -0,0 +1,904 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/x509_vfy.h.in + * + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_X509_VFY_H +#define OPENSSL_X509_VFY_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_X509_VFY_H +#endif + +/* + * Protect against recursion, x509.h and x509_vfy.h each include the other. + */ +#ifndef OPENSSL_X509_H +#include +#endif + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*- +SSL_CTX -> X509_STORE + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + +SSL -> X509_STORE_CTX + ->X509_STORE + +The X509_STORE holds the tables etc for verification stuff. +A X509_STORE_CTX is used while validating a single certificate. +The X509_STORE has X509_LOOKUPs for looking up certs. +The X509_STORE then calls a function to actually verify the +certificate chain. +*/ + +typedef enum { + X509_LU_NONE = 0, + X509_LU_X509, + X509_LU_CRL +} X509_LOOKUP_TYPE; + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define X509_LU_RETRY -1 +#define X509_LU_FAIL 0 +#endif + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_LOOKUP, X509_LOOKUP, X509_LOOKUP) +#define sk_X509_LOOKUP_num(sk) OPENSSL_sk_num(ossl_check_const_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_value(sk, idx) ((X509_LOOKUP *)OPENSSL_sk_value(ossl_check_const_X509_LOOKUP_sk_type(sk), (idx))) +#define sk_X509_LOOKUP_new(cmp) ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_new(ossl_check_X509_LOOKUP_compfunc_type(cmp))) +#define sk_X509_LOOKUP_new_null() ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_new_null()) +#define sk_X509_LOOKUP_new_reserve(cmp, n) ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_new_reserve(ossl_check_X509_LOOKUP_compfunc_type(cmp), (n))) +#define sk_X509_LOOKUP_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_LOOKUP_sk_type(sk), (n)) +#define sk_X509_LOOKUP_free(sk) OPENSSL_sk_free(ossl_check_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_zero(sk) OPENSSL_sk_zero(ossl_check_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_delete(sk, i) ((X509_LOOKUP *)OPENSSL_sk_delete(ossl_check_X509_LOOKUP_sk_type(sk), (i))) +#define sk_X509_LOOKUP_delete_ptr(sk, ptr) ((X509_LOOKUP *)OPENSSL_sk_delete_ptr(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr))) +#define sk_X509_LOOKUP_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr)) +#define sk_X509_LOOKUP_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr)) +#define sk_X509_LOOKUP_pop(sk) ((X509_LOOKUP *)OPENSSL_sk_pop(ossl_check_X509_LOOKUP_sk_type(sk))) +#define sk_X509_LOOKUP_shift(sk) ((X509_LOOKUP *)OPENSSL_sk_shift(ossl_check_X509_LOOKUP_sk_type(sk))) +#define sk_X509_LOOKUP_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_LOOKUP_sk_type(sk),ossl_check_X509_LOOKUP_freefunc_type(freefunc)) +#define sk_X509_LOOKUP_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr), (idx)) +#define sk_X509_LOOKUP_set(sk, idx, ptr) ((X509_LOOKUP *)OPENSSL_sk_set(ossl_check_X509_LOOKUP_sk_type(sk), (idx), ossl_check_X509_LOOKUP_type(ptr))) +#define sk_X509_LOOKUP_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr)) +#define sk_X509_LOOKUP_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr)) +#define sk_X509_LOOKUP_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr), pnum) +#define sk_X509_LOOKUP_sort(sk) OPENSSL_sk_sort(ossl_check_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_dup(sk) ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_dup(ossl_check_const_X509_LOOKUP_sk_type(sk))) +#define sk_X509_LOOKUP_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_copyfunc_type(copyfunc), ossl_check_X509_LOOKUP_freefunc_type(freefunc))) +#define sk_X509_LOOKUP_set_cmp_func(sk, cmp) ((sk_X509_LOOKUP_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509_OBJECT, X509_OBJECT, X509_OBJECT) +#define sk_X509_OBJECT_num(sk) OPENSSL_sk_num(ossl_check_const_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_value(sk, idx) ((X509_OBJECT *)OPENSSL_sk_value(ossl_check_const_X509_OBJECT_sk_type(sk), (idx))) +#define sk_X509_OBJECT_new(cmp) ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_new(ossl_check_X509_OBJECT_compfunc_type(cmp))) +#define sk_X509_OBJECT_new_null() ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_new_null()) +#define sk_X509_OBJECT_new_reserve(cmp, n) ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_new_reserve(ossl_check_X509_OBJECT_compfunc_type(cmp), (n))) +#define sk_X509_OBJECT_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_OBJECT_sk_type(sk), (n)) +#define sk_X509_OBJECT_free(sk) OPENSSL_sk_free(ossl_check_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_zero(sk) OPENSSL_sk_zero(ossl_check_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_delete(sk, i) ((X509_OBJECT *)OPENSSL_sk_delete(ossl_check_X509_OBJECT_sk_type(sk), (i))) +#define sk_X509_OBJECT_delete_ptr(sk, ptr) ((X509_OBJECT *)OPENSSL_sk_delete_ptr(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr))) +#define sk_X509_OBJECT_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr)) +#define sk_X509_OBJECT_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr)) +#define sk_X509_OBJECT_pop(sk) ((X509_OBJECT *)OPENSSL_sk_pop(ossl_check_X509_OBJECT_sk_type(sk))) +#define sk_X509_OBJECT_shift(sk) ((X509_OBJECT *)OPENSSL_sk_shift(ossl_check_X509_OBJECT_sk_type(sk))) +#define sk_X509_OBJECT_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_OBJECT_sk_type(sk),ossl_check_X509_OBJECT_freefunc_type(freefunc)) +#define sk_X509_OBJECT_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr), (idx)) +#define sk_X509_OBJECT_set(sk, idx, ptr) ((X509_OBJECT *)OPENSSL_sk_set(ossl_check_X509_OBJECT_sk_type(sk), (idx), ossl_check_X509_OBJECT_type(ptr))) +#define sk_X509_OBJECT_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr)) +#define sk_X509_OBJECT_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr)) +#define sk_X509_OBJECT_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr), pnum) +#define sk_X509_OBJECT_sort(sk) OPENSSL_sk_sort(ossl_check_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_dup(sk) ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_dup(ossl_check_const_X509_OBJECT_sk_type(sk))) +#define sk_X509_OBJECT_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_copyfunc_type(copyfunc), ossl_check_X509_OBJECT_freefunc_type(freefunc))) +#define sk_X509_OBJECT_set_cmp_func(sk, cmp) ((sk_X509_OBJECT_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509_VERIFY_PARAM, X509_VERIFY_PARAM, X509_VERIFY_PARAM) +#define sk_X509_VERIFY_PARAM_num(sk) OPENSSL_sk_num(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_value(sk, idx) ((X509_VERIFY_PARAM *)OPENSSL_sk_value(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk), (idx))) +#define sk_X509_VERIFY_PARAM_new(cmp) ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_new(ossl_check_X509_VERIFY_PARAM_compfunc_type(cmp))) +#define sk_X509_VERIFY_PARAM_new_null() ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_new_null()) +#define sk_X509_VERIFY_PARAM_new_reserve(cmp, n) ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_new_reserve(ossl_check_X509_VERIFY_PARAM_compfunc_type(cmp), (n))) +#define sk_X509_VERIFY_PARAM_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_VERIFY_PARAM_sk_type(sk), (n)) +#define sk_X509_VERIFY_PARAM_free(sk) OPENSSL_sk_free(ossl_check_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_zero(sk) OPENSSL_sk_zero(ossl_check_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_delete(sk, i) ((X509_VERIFY_PARAM *)OPENSSL_sk_delete(ossl_check_X509_VERIFY_PARAM_sk_type(sk), (i))) +#define sk_X509_VERIFY_PARAM_delete_ptr(sk, ptr) ((X509_VERIFY_PARAM *)OPENSSL_sk_delete_ptr(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr))) +#define sk_X509_VERIFY_PARAM_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr)) +#define sk_X509_VERIFY_PARAM_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr)) +#define sk_X509_VERIFY_PARAM_pop(sk) ((X509_VERIFY_PARAM *)OPENSSL_sk_pop(ossl_check_X509_VERIFY_PARAM_sk_type(sk))) +#define sk_X509_VERIFY_PARAM_shift(sk) ((X509_VERIFY_PARAM *)OPENSSL_sk_shift(ossl_check_X509_VERIFY_PARAM_sk_type(sk))) +#define sk_X509_VERIFY_PARAM_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_VERIFY_PARAM_sk_type(sk),ossl_check_X509_VERIFY_PARAM_freefunc_type(freefunc)) +#define sk_X509_VERIFY_PARAM_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr), (idx)) +#define sk_X509_VERIFY_PARAM_set(sk, idx, ptr) ((X509_VERIFY_PARAM *)OPENSSL_sk_set(ossl_check_X509_VERIFY_PARAM_sk_type(sk), (idx), ossl_check_X509_VERIFY_PARAM_type(ptr))) +#define sk_X509_VERIFY_PARAM_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr)) +#define sk_X509_VERIFY_PARAM_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr)) +#define sk_X509_VERIFY_PARAM_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr), pnum) +#define sk_X509_VERIFY_PARAM_sort(sk) OPENSSL_sk_sort(ossl_check_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_dup(sk) ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_dup(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk))) +#define sk_X509_VERIFY_PARAM_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_copyfunc_type(copyfunc), ossl_check_X509_VERIFY_PARAM_freefunc_type(freefunc))) +#define sk_X509_VERIFY_PARAM_set_cmp_func(sk, cmp) ((sk_X509_VERIFY_PARAM_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_compfunc_type(cmp))) + +/* clang-format on */ + +/* This is used for a table of trust checking functions */ +typedef struct x509_trust_st { + int trust; + int flags; + int (*check_trust)(struct x509_trust_st *, X509 *, int); + char *name; + int arg1; + void *arg2; +} X509_TRUST; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_TRUST, X509_TRUST, X509_TRUST) +#define sk_X509_TRUST_num(sk) OPENSSL_sk_num(ossl_check_const_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_value(sk, idx) ((X509_TRUST *)OPENSSL_sk_value(ossl_check_const_X509_TRUST_sk_type(sk), (idx))) +#define sk_X509_TRUST_new(cmp) ((STACK_OF(X509_TRUST) *)OPENSSL_sk_new(ossl_check_X509_TRUST_compfunc_type(cmp))) +#define sk_X509_TRUST_new_null() ((STACK_OF(X509_TRUST) *)OPENSSL_sk_new_null()) +#define sk_X509_TRUST_new_reserve(cmp, n) ((STACK_OF(X509_TRUST) *)OPENSSL_sk_new_reserve(ossl_check_X509_TRUST_compfunc_type(cmp), (n))) +#define sk_X509_TRUST_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_TRUST_sk_type(sk), (n)) +#define sk_X509_TRUST_free(sk) OPENSSL_sk_free(ossl_check_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_zero(sk) OPENSSL_sk_zero(ossl_check_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_delete(sk, i) ((X509_TRUST *)OPENSSL_sk_delete(ossl_check_X509_TRUST_sk_type(sk), (i))) +#define sk_X509_TRUST_delete_ptr(sk, ptr) ((X509_TRUST *)OPENSSL_sk_delete_ptr(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr))) +#define sk_X509_TRUST_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr)) +#define sk_X509_TRUST_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr)) +#define sk_X509_TRUST_pop(sk) ((X509_TRUST *)OPENSSL_sk_pop(ossl_check_X509_TRUST_sk_type(sk))) +#define sk_X509_TRUST_shift(sk) ((X509_TRUST *)OPENSSL_sk_shift(ossl_check_X509_TRUST_sk_type(sk))) +#define sk_X509_TRUST_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_TRUST_sk_type(sk),ossl_check_X509_TRUST_freefunc_type(freefunc)) +#define sk_X509_TRUST_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr), (idx)) +#define sk_X509_TRUST_set(sk, idx, ptr) ((X509_TRUST *)OPENSSL_sk_set(ossl_check_X509_TRUST_sk_type(sk), (idx), ossl_check_X509_TRUST_type(ptr))) +#define sk_X509_TRUST_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr)) +#define sk_X509_TRUST_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr)) +#define sk_X509_TRUST_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr), pnum) +#define sk_X509_TRUST_sort(sk) OPENSSL_sk_sort(ossl_check_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_dup(sk) ((STACK_OF(X509_TRUST) *)OPENSSL_sk_dup(ossl_check_const_X509_TRUST_sk_type(sk))) +#define sk_X509_TRUST_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_TRUST) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_copyfunc_type(copyfunc), ossl_check_X509_TRUST_freefunc_type(freefunc))) +#define sk_X509_TRUST_set_cmp_func(sk, cmp) ((sk_X509_TRUST_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_compfunc_type(cmp))) + +/* clang-format on */ + +/* standard trust ids */ +#define X509_TRUST_DEFAULT 0 /* Only valid in purpose settings */ +#define X509_TRUST_COMPAT 1 +#define X509_TRUST_SSL_CLIENT 2 +#define X509_TRUST_SSL_SERVER 3 +#define X509_TRUST_EMAIL 4 +#define X509_TRUST_OBJECT_SIGN 5 +#define X509_TRUST_OCSP_SIGN 6 +#define X509_TRUST_OCSP_REQUEST 7 +#define X509_TRUST_TSA 8 +/* Keep these up to date! */ +#define X509_TRUST_MIN 1 +#define X509_TRUST_MAX 8 + +/* trust_flags values */ +#define X509_TRUST_DYNAMIC (1U << 0) +#define X509_TRUST_DYNAMIC_NAME (1U << 1) +/* No compat trust if self-signed, preempts "DO_SS" */ +#define X509_TRUST_NO_SS_COMPAT (1U << 2) +/* Compat trust if no explicit accepted trust EKUs */ +#define X509_TRUST_DO_SS_COMPAT (1U << 3) +/* Accept "anyEKU" as a wildcard rejection OID and as a wildcard trust OID */ +#define X509_TRUST_OK_ANY_EKU (1U << 4) + +/* check_trust return codes */ +#define X509_TRUST_TRUSTED 1 +#define X509_TRUST_REJECTED 2 +#define X509_TRUST_UNTRUSTED 3 + +int X509_TRUST_set(int *t, int trust); +int X509_TRUST_get_count(void); +X509_TRUST *X509_TRUST_get0(int idx); +int X509_TRUST_get_by_id(int id); +int X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int), + const char *name, int arg1, void *arg2); +void X509_TRUST_cleanup(void); +int X509_TRUST_get_flags(const X509_TRUST *xp); +char *X509_TRUST_get0_name(const X509_TRUST *xp); +int X509_TRUST_get_trust(const X509_TRUST *xp); + +int X509_trusted(const X509 *x); +int X509_add1_trust_object(X509 *x, const ASN1_OBJECT *obj); +int X509_add1_reject_object(X509 *x, const ASN1_OBJECT *obj); +void X509_trust_clear(X509 *x); +void X509_reject_clear(X509 *x); +STACK_OF(ASN1_OBJECT) *X509_get0_trust_objects(X509 *x); +STACK_OF(ASN1_OBJECT) *X509_get0_reject_objects(X509 *x); + +int (*X509_TRUST_set_default(int (*trust)(int, X509 *, int)))(int, X509 *, + int); +int X509_check_trust(X509 *x, int id, int flags); + +int X509_verify_cert(X509_STORE_CTX *ctx); +int X509_STORE_CTX_verify(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_build_chain(X509 *target, STACK_OF(X509) *certs, + X509_STORE *store, int with_self_signed, + OSSL_LIB_CTX *libctx, const char *propq); + +int X509_STORE_set_depth(X509_STORE *store, int depth); + +typedef int (*X509_STORE_CTX_verify_cb)(int, X509_STORE_CTX *); +int X509_STORE_CTX_print_verify_cb(int ok, X509_STORE_CTX *ctx); +typedef int (*X509_STORE_CTX_verify_fn)(X509_STORE_CTX *); +typedef int (*X509_STORE_CTX_get_issuer_fn)(X509 **issuer, + X509_STORE_CTX *ctx, X509 *x); +typedef int (*X509_STORE_CTX_check_issued_fn)(X509_STORE_CTX *ctx, + X509 *x, X509 *issuer); +typedef int (*X509_STORE_CTX_check_revocation_fn)(X509_STORE_CTX *ctx); +typedef int (*X509_STORE_CTX_get_crl_fn)(X509_STORE_CTX *ctx, + X509_CRL **crl, X509 *x); +typedef int (*X509_STORE_CTX_check_crl_fn)(X509_STORE_CTX *ctx, X509_CRL *crl); +typedef int (*X509_STORE_CTX_cert_crl_fn)(X509_STORE_CTX *ctx, + X509_CRL *crl, X509 *x); +typedef int (*X509_STORE_CTX_check_policy_fn)(X509_STORE_CTX *ctx); +typedef STACK_OF(X509) + *(*X509_STORE_CTX_lookup_certs_fn)(X509_STORE_CTX *ctx, + const X509_NAME *nm); +typedef STACK_OF(X509_CRL) + *(*X509_STORE_CTX_lookup_crls_fn)(const X509_STORE_CTX *ctx, + const X509_NAME *nm); +typedef int (*X509_STORE_CTX_cleanup_fn)(X509_STORE_CTX *ctx); + +void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth); + +#define X509_STORE_CTX_set_app_data(ctx, data) \ + X509_STORE_CTX_set_ex_data(ctx, 0, data) +#define X509_STORE_CTX_get_app_data(ctx) \ + X509_STORE_CTX_get_ex_data(ctx, 0) + +#define X509_L_FILE_LOAD 1 +#define X509_L_ADD_DIR 2 +#define X509_L_ADD_STORE 3 +#define X509_L_LOAD_STORE 4 + +#define X509_LOOKUP_load_file(x, name, type) \ + X509_LOOKUP_ctrl((x), X509_L_FILE_LOAD, (name), (long)(type), NULL) + +#define X509_LOOKUP_add_dir(x, name, type) \ + X509_LOOKUP_ctrl((x), X509_L_ADD_DIR, (name), (long)(type), NULL) + +#define X509_LOOKUP_add_store(x, name) \ + X509_LOOKUP_ctrl((x), X509_L_ADD_STORE, (name), 0, NULL) + +#define X509_LOOKUP_load_store(x, name) \ + X509_LOOKUP_ctrl((x), X509_L_LOAD_STORE, (name), 0, NULL) + +#define X509_LOOKUP_load_file_ex(x, name, type, libctx, propq) \ + X509_LOOKUP_ctrl_ex((x), X509_L_FILE_LOAD, (name), (long)(type), NULL, \ + (libctx), (propq)) + +#define X509_LOOKUP_load_store_ex(x, name, libctx, propq) \ + X509_LOOKUP_ctrl_ex((x), X509_L_LOAD_STORE, (name), 0, NULL, \ + (libctx), (propq)) + +#define X509_LOOKUP_add_store_ex(x, name, libctx, propq) \ + X509_LOOKUP_ctrl_ex((x), X509_L_ADD_STORE, (name), 0, NULL, \ + (libctx), (propq)) + +#define X509_V_OK 0 +#define X509_V_ERR_UNSPECIFIED 1 +#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2 +#define X509_V_ERR_UNABLE_TO_GET_CRL 3 +#define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4 +#define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5 +#define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6 +#define X509_V_ERR_CERT_SIGNATURE_FAILURE 7 +#define X509_V_ERR_CRL_SIGNATURE_FAILURE 8 +#define X509_V_ERR_CERT_NOT_YET_VALID 9 +#define X509_V_ERR_CERT_HAS_EXPIRED 10 +#define X509_V_ERR_CRL_NOT_YET_VALID 11 +#define X509_V_ERR_CRL_HAS_EXPIRED 12 +#define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13 +#define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14 +#define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15 +#define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16 +#define X509_V_ERR_OUT_OF_MEM 17 +#define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18 +#define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19 +#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20 +#define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21 +#define X509_V_ERR_CERT_CHAIN_TOO_LONG 22 +#define X509_V_ERR_CERT_REVOKED 23 +#define X509_V_ERR_NO_ISSUER_PUBLIC_KEY 24 +#define X509_V_ERR_PATH_LENGTH_EXCEEDED 25 +#define X509_V_ERR_INVALID_PURPOSE 26 +#define X509_V_ERR_CERT_UNTRUSTED 27 +#define X509_V_ERR_CERT_REJECTED 28 + +/* These are 'informational' when looking for issuer cert */ +#define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29 +#define X509_V_ERR_AKID_SKID_MISMATCH 30 +#define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31 +#define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32 +#define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33 +#define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 +#define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35 +#define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36 +#define X509_V_ERR_INVALID_NON_CA 37 +#define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38 +#define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39 +#define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40 +#define X509_V_ERR_INVALID_EXTENSION 41 +#define X509_V_ERR_INVALID_POLICY_EXTENSION 42 +#define X509_V_ERR_NO_EXPLICIT_POLICY 43 +#define X509_V_ERR_DIFFERENT_CRL_SCOPE 44 +#define X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE 45 +#define X509_V_ERR_UNNESTED_RESOURCE 46 +#define X509_V_ERR_PERMITTED_VIOLATION 47 +#define X509_V_ERR_EXCLUDED_VIOLATION 48 +#define X509_V_ERR_SUBTREE_MINMAX 49 +/* The application is not happy */ +#define X509_V_ERR_APPLICATION_VERIFICATION 50 +#define X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE 51 +#define X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX 52 +#define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53 +#define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54 +/* Another issuer check debug option */ +#define X509_V_ERR_PATH_LOOP 55 +/* Suite B mode algorithm violation */ +#define X509_V_ERR_SUITE_B_INVALID_VERSION 56 +#define X509_V_ERR_SUITE_B_INVALID_ALGORITHM 57 +#define X509_V_ERR_SUITE_B_INVALID_CURVE 58 +#define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM 59 +#define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED 60 +#define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 61 +/* Host, email and IP check errors */ +#define X509_V_ERR_HOSTNAME_MISMATCH 62 +#define X509_V_ERR_EMAIL_MISMATCH 63 +#define X509_V_ERR_IP_ADDRESS_MISMATCH 64 +/* DANE TLSA errors */ +#define X509_V_ERR_DANE_NO_MATCH 65 +/* security level errors */ +#define X509_V_ERR_EE_KEY_TOO_SMALL 66 +#define X509_V_ERR_CA_KEY_TOO_SMALL 67 +#define X509_V_ERR_CA_MD_TOO_WEAK 68 +/* Caller error */ +#define X509_V_ERR_INVALID_CALL 69 +/* Issuer lookup error */ +#define X509_V_ERR_STORE_LOOKUP 70 +/* Certificate transparency */ +#define X509_V_ERR_NO_VALID_SCTS 71 + +#define X509_V_ERR_PROXY_SUBJECT_NAME_VIOLATION 72 +/* OCSP status errors */ +#define X509_V_ERR_OCSP_VERIFY_NEEDED 73 /* Need OCSP verification */ +#define X509_V_ERR_OCSP_VERIFY_FAILED 74 /* Couldn't verify cert through OCSP */ +#define X509_V_ERR_OCSP_CERT_UNKNOWN 75 /* Certificate wasn't recognized by the OCSP responder */ + +#define X509_V_ERR_UNSUPPORTED_SIGNATURE_ALGORITHM 76 +#define X509_V_ERR_SIGNATURE_ALGORITHM_MISMATCH 77 + +/* Errors in case a check in X509_V_FLAG_X509_STRICT mode fails */ +#define X509_V_ERR_SIGNATURE_ALGORITHM_INCONSISTENCY 78 +#define X509_V_ERR_INVALID_CA 79 +#define X509_V_ERR_PATHLEN_INVALID_FOR_NON_CA 80 +#define X509_V_ERR_PATHLEN_WITHOUT_KU_KEY_CERT_SIGN 81 +#define X509_V_ERR_KU_KEY_CERT_SIGN_INVALID_FOR_NON_CA 82 +#define X509_V_ERR_ISSUER_NAME_EMPTY 83 +#define X509_V_ERR_SUBJECT_NAME_EMPTY 84 +#define X509_V_ERR_MISSING_AUTHORITY_KEY_IDENTIFIER 85 +#define X509_V_ERR_MISSING_SUBJECT_KEY_IDENTIFIER 86 +#define X509_V_ERR_EMPTY_SUBJECT_ALT_NAME 87 +#define X509_V_ERR_EMPTY_SUBJECT_SAN_NOT_CRITICAL 88 +#define X509_V_ERR_CA_BCONS_NOT_CRITICAL 89 +#define X509_V_ERR_AUTHORITY_KEY_IDENTIFIER_CRITICAL 90 +#define X509_V_ERR_SUBJECT_KEY_IDENTIFIER_CRITICAL 91 +#define X509_V_ERR_CA_CERT_MISSING_KEY_USAGE 92 +#define X509_V_ERR_EXTENSIONS_REQUIRE_VERSION_3 93 +#define X509_V_ERR_EC_KEY_EXPLICIT_PARAMS 94 +#define X509_V_ERR_RPK_UNTRUSTED 95 + +/* Certificate verify flags */ +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define X509_V_FLAG_CB_ISSUER_CHECK 0x0 /* Deprecated */ +#endif +/* Use check time instead of current time */ +#define X509_V_FLAG_USE_CHECK_TIME 0x2 +/* Lookup CRLs */ +#define X509_V_FLAG_CRL_CHECK 0x4 +/* Lookup CRLs for whole chain */ +#define X509_V_FLAG_CRL_CHECK_ALL 0x8 +/* Ignore unhandled critical extensions */ +#define X509_V_FLAG_IGNORE_CRITICAL 0x10 +/* Disable workarounds for broken certificates */ +#define X509_V_FLAG_X509_STRICT 0x20 +/* Enable proxy certificate validation */ +#define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40 +/* Enable policy checking */ +#define X509_V_FLAG_POLICY_CHECK 0x80 +/* Policy variable require-explicit-policy */ +#define X509_V_FLAG_EXPLICIT_POLICY 0x100 +/* Policy variable inhibit-any-policy */ +#define X509_V_FLAG_INHIBIT_ANY 0x200 +/* Policy variable inhibit-policy-mapping */ +#define X509_V_FLAG_INHIBIT_MAP 0x400 +/* Notify callback that policy is OK */ +#define X509_V_FLAG_NOTIFY_POLICY 0x800 +/* Extended CRL features such as indirect CRLs, alternate CRL signing keys */ +#define X509_V_FLAG_EXTENDED_CRL_SUPPORT 0x1000 +/* Delta CRL support */ +#define X509_V_FLAG_USE_DELTAS 0x2000 +/* Check self-signed CA signature */ +#define X509_V_FLAG_CHECK_SS_SIGNATURE 0x4000 +/* Use trusted store first */ +#define X509_V_FLAG_TRUSTED_FIRST 0x8000 +/* Suite B 128 bit only mode: not normally used */ +#define X509_V_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +#define X509_V_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +#define X509_V_FLAG_SUITEB_128_LOS 0x30000 +/* Allow partial chains if at least one certificate is in trusted store */ +#define X509_V_FLAG_PARTIAL_CHAIN 0x80000 +/* + * If the initial chain is not trusted, do not attempt to build an alternative + * chain. Alternate chain checking was introduced in 1.1.0. Setting this flag + * will force the behaviour to match that of previous versions. + */ +#define X509_V_FLAG_NO_ALT_CHAINS 0x100000 +/* Do not check certificate/CRL validity against current time */ +#define X509_V_FLAG_NO_CHECK_TIME 0x200000 + +#define X509_VP_FLAG_DEFAULT 0x1 +#define X509_VP_FLAG_OVERWRITE 0x2 +#define X509_VP_FLAG_RESET_FLAGS 0x4 +#define X509_VP_FLAG_LOCKED 0x8 +#define X509_VP_FLAG_ONCE 0x10 + +/* Internal use: mask of policy related options */ +#define X509_V_FLAG_POLICY_MASK (X509_V_FLAG_POLICY_CHECK \ + | X509_V_FLAG_EXPLICIT_POLICY \ + | X509_V_FLAG_INHIBIT_ANY \ + | X509_V_FLAG_INHIBIT_MAP) + +int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, X509_LOOKUP_TYPE type, + const X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, + X509_LOOKUP_TYPE type, + const X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, + X509_OBJECT *x); +int X509_OBJECT_up_ref_count(X509_OBJECT *a); +X509_OBJECT *X509_OBJECT_new(void); +void X509_OBJECT_free(X509_OBJECT *a); +X509_LOOKUP_TYPE X509_OBJECT_get_type(const X509_OBJECT *a); +X509 *X509_OBJECT_get0_X509(const X509_OBJECT *a); +int X509_OBJECT_set1_X509(X509_OBJECT *a, X509 *obj); +X509_CRL *X509_OBJECT_get0_X509_CRL(const X509_OBJECT *a); +int X509_OBJECT_set1_X509_CRL(X509_OBJECT *a, X509_CRL *obj); +X509_STORE *X509_STORE_new(void); +void X509_STORE_free(X509_STORE *xs); +int X509_STORE_lock(X509_STORE *xs); +int X509_STORE_unlock(X509_STORE *xs); +int X509_STORE_up_ref(X509_STORE *xs); +STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(const X509_STORE *xs); +STACK_OF(X509_OBJECT) *X509_STORE_get1_objects(X509_STORE *xs); +STACK_OF(X509) *X509_STORE_get1_all_certs(X509_STORE *xs); +STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *xs, + const X509_NAME *nm); +STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls(const X509_STORE_CTX *st, + const X509_NAME *nm); +int X509_STORE_set_flags(X509_STORE *xs, unsigned long flags); +int X509_STORE_set_purpose(X509_STORE *xs, int purpose); +int X509_STORE_set_trust(X509_STORE *xs, int trust); +int X509_STORE_set1_param(X509_STORE *xs, const X509_VERIFY_PARAM *pm); +X509_VERIFY_PARAM *X509_STORE_get0_param(const X509_STORE *xs); + +void X509_STORE_set_verify(X509_STORE *xs, X509_STORE_CTX_verify_fn verify); +#define X509_STORE_set_verify_func(ctx, func) \ + X509_STORE_set_verify((ctx), (func)) +void X509_STORE_CTX_set_verify(X509_STORE_CTX *ctx, + X509_STORE_CTX_verify_fn verify); +X509_STORE_CTX_verify_fn X509_STORE_get_verify(const X509_STORE *xs); +void X509_STORE_set_verify_cb(X509_STORE *xs, + X509_STORE_CTX_verify_cb verify_cb); +#define X509_STORE_set_verify_cb_func(ctx, func) \ + X509_STORE_set_verify_cb((ctx), (func)) +X509_STORE_CTX_verify_cb X509_STORE_get_verify_cb(const X509_STORE *xs); +void X509_STORE_set_get_issuer(X509_STORE *xs, + X509_STORE_CTX_get_issuer_fn get_issuer); +X509_STORE_CTX_get_issuer_fn X509_STORE_get_get_issuer(const X509_STORE *xs); +void X509_STORE_set_check_issued(X509_STORE *xs, + X509_STORE_CTX_check_issued_fn check_issued); +X509_STORE_CTX_check_issued_fn X509_STORE_get_check_issued(const X509_STORE *s); +void X509_STORE_set_check_revocation(X509_STORE *xs, + X509_STORE_CTX_check_revocation_fn check_revocation); +X509_STORE_CTX_check_revocation_fn +X509_STORE_get_check_revocation(const X509_STORE *xs); +void X509_STORE_set_get_crl(X509_STORE *xs, + X509_STORE_CTX_get_crl_fn get_crl); +X509_STORE_CTX_get_crl_fn X509_STORE_get_get_crl(const X509_STORE *xs); +void X509_STORE_set_check_crl(X509_STORE *xs, + X509_STORE_CTX_check_crl_fn check_crl); +X509_STORE_CTX_check_crl_fn X509_STORE_get_check_crl(const X509_STORE *xs); +void X509_STORE_set_cert_crl(X509_STORE *xs, + X509_STORE_CTX_cert_crl_fn cert_crl); +X509_STORE_CTX_cert_crl_fn X509_STORE_get_cert_crl(const X509_STORE *xs); +void X509_STORE_set_check_policy(X509_STORE *xs, + X509_STORE_CTX_check_policy_fn check_policy); +X509_STORE_CTX_check_policy_fn X509_STORE_get_check_policy(const X509_STORE *s); +void X509_STORE_set_lookup_certs(X509_STORE *xs, + X509_STORE_CTX_lookup_certs_fn lookup_certs); +X509_STORE_CTX_lookup_certs_fn X509_STORE_get_lookup_certs(const X509_STORE *s); +void X509_STORE_set_lookup_crls(X509_STORE *xs, + X509_STORE_CTX_lookup_crls_fn lookup_crls); +#define X509_STORE_set_lookup_crls_cb(ctx, func) \ + X509_STORE_set_lookup_crls((ctx), (func)) +X509_STORE_CTX_lookup_crls_fn X509_STORE_get_lookup_crls(const X509_STORE *xs); +void X509_STORE_set_cleanup(X509_STORE *xs, + X509_STORE_CTX_cleanup_fn cleanup); +X509_STORE_CTX_cleanup_fn X509_STORE_get_cleanup(const X509_STORE *xs); + +#define X509_STORE_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE, l, p, newf, dupf, freef) +int X509_STORE_set_ex_data(X509_STORE *xs, int idx, void *data); +void *X509_STORE_get_ex_data(const X509_STORE *xs, int idx); + +X509_STORE_CTX *X509_STORE_CTX_new_ex(OSSL_LIB_CTX *libctx, const char *propq); +X509_STORE_CTX *X509_STORE_CTX_new(void); + +int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + +void X509_STORE_CTX_free(X509_STORE_CTX *ctx); +int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *trust_store, + X509 *target, STACK_OF(X509) *untrusted); +int X509_STORE_CTX_init_rpk(X509_STORE_CTX *ctx, X509_STORE *trust_store, + EVP_PKEY *rpk); +void X509_STORE_CTX_set0_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); +void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx); + +X509_STORE *X509_STORE_CTX_get0_store(const X509_STORE_CTX *ctx); +X509 *X509_STORE_CTX_get0_cert(const X509_STORE_CTX *ctx); +EVP_PKEY *X509_STORE_CTX_get0_rpk(const X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get0_untrusted(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set0_untrusted(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); +void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx, + X509_STORE_CTX_verify_cb verify); +X509_STORE_CTX_verify_cb X509_STORE_CTX_get_verify_cb(const X509_STORE_CTX *ctx); +X509_STORE_CTX_verify_fn X509_STORE_CTX_get_verify(const X509_STORE_CTX *ctx); +X509_STORE_CTX_get_issuer_fn X509_STORE_CTX_get_get_issuer(const X509_STORE_CTX *ctx); +X509_STORE_CTX_check_issued_fn X509_STORE_CTX_get_check_issued(const X509_STORE_CTX *ctx); +X509_STORE_CTX_check_revocation_fn X509_STORE_CTX_get_check_revocation(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_get_crl(X509_STORE_CTX *ctx, + X509_STORE_CTX_get_crl_fn get_crl); +X509_STORE_CTX_get_crl_fn X509_STORE_CTX_get_get_crl(const X509_STORE_CTX *ctx); +X509_STORE_CTX_check_crl_fn X509_STORE_CTX_get_check_crl(const X509_STORE_CTX *ctx); +X509_STORE_CTX_cert_crl_fn X509_STORE_CTX_get_cert_crl(const X509_STORE_CTX *ctx); +X509_STORE_CTX_check_policy_fn X509_STORE_CTX_get_check_policy(const X509_STORE_CTX *ctx); +X509_STORE_CTX_lookup_certs_fn X509_STORE_CTX_get_lookup_certs(const X509_STORE_CTX *ctx); +X509_STORE_CTX_lookup_crls_fn X509_STORE_CTX_get_lookup_crls(const X509_STORE_CTX *ctx); +X509_STORE_CTX_cleanup_fn X509_STORE_CTX_get_cleanup(const X509_STORE_CTX *ctx); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define X509_STORE_CTX_get_chain X509_STORE_CTX_get0_chain +#define X509_STORE_CTX_set_chain X509_STORE_CTX_set0_untrusted +#define X509_STORE_CTX_trusted_stack X509_STORE_CTX_set0_trusted_stack +#define X509_STORE_get_by_subject X509_STORE_CTX_get_by_subject +#define X509_STORE_get1_certs X509_STORE_CTX_get1_certs +#define X509_STORE_get1_crls X509_STORE_CTX_get1_crls +/* the following macro is misspelled; use X509_STORE_get1_certs instead */ +#define X509_STORE_get1_cert X509_STORE_CTX_get1_certs +/* the following macro is misspelled; use X509_STORE_get1_crls instead */ +#define X509_STORE_get1_crl X509_STORE_CTX_get1_crls +#endif + +X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *xs, X509_LOOKUP_METHOD *m); +X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void); +X509_LOOKUP_METHOD *X509_LOOKUP_file(void); +X509_LOOKUP_METHOD *X509_LOOKUP_store(void); + +typedef int (*X509_LOOKUP_ctrl_fn)(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); +typedef int (*X509_LOOKUP_ctrl_ex_fn)( + X509_LOOKUP *ctx, int cmd, const char *argc, long argl, char **ret, + OSSL_LIB_CTX *libctx, const char *propq); + +typedef int (*X509_LOOKUP_get_by_subject_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const X509_NAME *name, + X509_OBJECT *ret); +typedef int (*X509_LOOKUP_get_by_subject_ex_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const X509_NAME *name, + X509_OBJECT *ret, + OSSL_LIB_CTX *libctx, + const char *propq); +typedef int (*X509_LOOKUP_get_by_issuer_serial_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const X509_NAME *name, + const ASN1_INTEGER *serial, + X509_OBJECT *ret); +typedef int (*X509_LOOKUP_get_by_fingerprint_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const unsigned char *bytes, + int len, + X509_OBJECT *ret); +typedef int (*X509_LOOKUP_get_by_alias_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const char *str, + int len, + X509_OBJECT *ret); + +X509_LOOKUP_METHOD *X509_LOOKUP_meth_new(const char *name); +void X509_LOOKUP_meth_free(X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_new_item(X509_LOOKUP_METHOD *method, + int (*new_item)(X509_LOOKUP *ctx)); +int (*X509_LOOKUP_meth_get_new_item(const X509_LOOKUP_METHOD *method))(X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_free(X509_LOOKUP_METHOD *method, + void (*free_fn)(X509_LOOKUP *ctx)); +void (*X509_LOOKUP_meth_get_free(const X509_LOOKUP_METHOD *method))(X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_init(X509_LOOKUP_METHOD *method, + int (*init)(X509_LOOKUP *ctx)); +int (*X509_LOOKUP_meth_get_init(const X509_LOOKUP_METHOD *method))(X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_shutdown(X509_LOOKUP_METHOD *method, + int (*shutdown)(X509_LOOKUP *ctx)); +int (*X509_LOOKUP_meth_get_shutdown(const X509_LOOKUP_METHOD *method))(X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_ctrl(X509_LOOKUP_METHOD *method, + X509_LOOKUP_ctrl_fn ctrl_fn); +X509_LOOKUP_ctrl_fn X509_LOOKUP_meth_get_ctrl(const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_subject(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_subject_fn fn); +X509_LOOKUP_get_by_subject_fn X509_LOOKUP_meth_get_get_by_subject( + const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_issuer_serial(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_issuer_serial_fn fn); +X509_LOOKUP_get_by_issuer_serial_fn X509_LOOKUP_meth_get_get_by_issuer_serial( + const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_fingerprint(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_fingerprint_fn fn); +X509_LOOKUP_get_by_fingerprint_fn X509_LOOKUP_meth_get_get_by_fingerprint( + const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_alias(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_alias_fn fn); +X509_LOOKUP_get_by_alias_fn X509_LOOKUP_meth_get_get_by_alias( + const X509_LOOKUP_METHOD *method); + +int X509_STORE_add_cert(X509_STORE *xs, X509 *x); +int X509_STORE_add_crl(X509_STORE *xs, X509_CRL *x); + +int X509_STORE_CTX_get_by_subject(const X509_STORE_CTX *vs, + X509_LOOKUP_TYPE type, + const X509_NAME *name, X509_OBJECT *ret); +X509_OBJECT *X509_STORE_CTX_get_obj_by_subject(X509_STORE_CTX *vs, + X509_LOOKUP_TYPE type, + const X509_NAME *name); + +int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); +int X509_LOOKUP_ctrl_ex(X509_LOOKUP *ctx, int cmd, const char *argc, long argl, + char **ret, OSSL_LIB_CTX *libctx, const char *propq); + +int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_file_ex(X509_LOOKUP *ctx, const char *file, int type, + OSSL_LIB_CTX *libctx, const char *propq); +int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_crl_file_ex(X509_LOOKUP *ctx, const char *file, int type, + OSSL_LIB_CTX *libctx, const char *propq); + +X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method); +void X509_LOOKUP_free(X509_LOOKUP *ctx); +int X509_LOOKUP_init(X509_LOOKUP *ctx); +int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const X509_NAME *name, X509_OBJECT *ret); +int X509_LOOKUP_by_subject_ex(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const X509_NAME *name, X509_OBJECT *ret, + OSSL_LIB_CTX *libctx, const char *propq); +int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const X509_NAME *name, + const ASN1_INTEGER *serial, + X509_OBJECT *ret); +int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const unsigned char *bytes, int len, + X509_OBJECT *ret); +int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const char *str, int len, X509_OBJECT *ret); +int X509_LOOKUP_set_method_data(X509_LOOKUP *ctx, void *data); +void *X509_LOOKUP_get_method_data(const X509_LOOKUP *ctx); +X509_STORE *X509_LOOKUP_get_store(const X509_LOOKUP *ctx); +int X509_LOOKUP_shutdown(X509_LOOKUP *ctx); + +int X509_STORE_load_file(X509_STORE *xs, const char *file); +int X509_STORE_load_path(X509_STORE *xs, const char *path); +int X509_STORE_load_store(X509_STORE *xs, const char *store); +int X509_STORE_load_locations(X509_STORE *s, const char *file, const char *dir); +int X509_STORE_set_default_paths(X509_STORE *xs); + +int X509_STORE_load_file_ex(X509_STORE *xs, const char *file, + OSSL_LIB_CTX *libctx, const char *propq); +int X509_STORE_load_store_ex(X509_STORE *xs, const char *store, + OSSL_LIB_CTX *libctx, const char *propq); +int X509_STORE_load_locations_ex(X509_STORE *xs, + const char *file, const char *dir, + OSSL_LIB_CTX *libctx, const char *propq); +int X509_STORE_set_default_paths_ex(X509_STORE *xs, + OSSL_LIB_CTX *libctx, const char *propq); + +#define X509_STORE_CTX_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE_CTX, l, p, newf, dupf, freef) +int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data); +void *X509_STORE_CTX_get_ex_data(const X509_STORE_CTX *ctx, int idx); +int X509_STORE_CTX_get_error(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int s); +int X509_STORE_CTX_get_error_depth(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_error_depth(X509_STORE_CTX *ctx, int depth); +X509 *X509_STORE_CTX_get_current_cert(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_current_cert(X509_STORE_CTX *ctx, X509 *x); +X509 *X509_STORE_CTX_get0_current_issuer(const X509_STORE_CTX *ctx); +X509_CRL *X509_STORE_CTX_get0_current_crl(const X509_STORE_CTX *ctx); +X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(const X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get0_chain(const X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get1_chain(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_cert(X509_STORE_CTX *ctx, X509 *target); +void X509_STORE_CTX_set0_rpk(X509_STORE_CTX *ctx, EVP_PKEY *target); +void X509_STORE_CTX_set0_verified_chain(X509_STORE_CTX *c, STACK_OF(X509) *sk); +void X509_STORE_CTX_set0_crls(X509_STORE_CTX *ctx, STACK_OF(X509_CRL) *sk); +int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose); +int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust); +int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose, + int purpose, int trust); +void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags); +void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, + time_t t); +void X509_STORE_CTX_set_current_reasons(X509_STORE_CTX *ctx, + unsigned int current_reasons); + +X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(const X509_STORE_CTX *ctx); +int X509_STORE_CTX_get_explicit_policy(const X509_STORE_CTX *ctx); +int X509_STORE_CTX_get_num_untrusted(const X509_STORE_CTX *ctx); + +X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param); +int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name); + +/* + * Bridge opacity barrier between libcrypt and libssl, also needed to support + * offline testing in test/danetest.c + */ +void X509_STORE_CTX_set0_dane(X509_STORE_CTX *ctx, SSL_DANE *dane); +#define DANE_FLAG_NO_DANE_EE_NAMECHECKS (1L << 0) + +/* X509_VERIFY_PARAM functions */ + +X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void); +void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name); +int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +unsigned long X509_VERIFY_PARAM_get_flags(const X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose); +int X509_VERIFY_PARAM_get_purpose(const X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust); +void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth); +void X509_VERIFY_PARAM_set_auth_level(X509_VERIFY_PARAM *param, int auth_level); +time_t X509_VERIFY_PARAM_get_time(const X509_VERIFY_PARAM *param); +void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t); +int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, + ASN1_OBJECT *policy); +int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, + STACK_OF(ASN1_OBJECT) *policies); + +int X509_VERIFY_PARAM_set_inh_flags(X509_VERIFY_PARAM *param, + uint32_t flags); +uint32_t X509_VERIFY_PARAM_get_inh_flags(const X509_VERIFY_PARAM *param); + +char *X509_VERIFY_PARAM_get0_host(X509_VERIFY_PARAM *param, int idx); +int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param, + unsigned int flags); +unsigned int X509_VERIFY_PARAM_get_hostflags(const X509_VERIFY_PARAM *param); +char *X509_VERIFY_PARAM_get0_peername(const X509_VERIFY_PARAM *param); +void X509_VERIFY_PARAM_move_peername(X509_VERIFY_PARAM *, X509_VERIFY_PARAM *); +char *X509_VERIFY_PARAM_get0_email(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, + const char *email, size_t emaillen); +char *X509_VERIFY_PARAM_get1_ip_asc(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, + const unsigned char *ip, size_t iplen); +int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, + const char *ipasc); + +int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_get_auth_level(const X509_VERIFY_PARAM *param); +const char *X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param); + +int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_get_count(void); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name); +void X509_VERIFY_PARAM_table_cleanup(void); + +/* Non positive return values are errors */ +#define X509_PCY_TREE_FAILURE -2 /* Failure to satisfy explicit policy */ +#define X509_PCY_TREE_INVALID -1 /* Inconsistent or invalid extensions */ +#define X509_PCY_TREE_INTERNAL 0 /* Internal error, most likely malloc */ + +/* + * Positive return values form a bit mask, all but the first are internal to + * the library and don't appear in results from X509_policy_check(). + */ +#define X509_PCY_TREE_VALID 1 /* The policy tree is valid */ +#define X509_PCY_TREE_EMPTY 2 /* The policy tree is empty */ +#define X509_PCY_TREE_EXPLICIT 4 /* Explicit policy required */ + +int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy, + STACK_OF(X509) *certs, + STACK_OF(ASN1_OBJECT) *policy_oids, unsigned int flags); + +void X509_policy_tree_free(X509_POLICY_TREE *tree); + +int X509_policy_tree_level_count(const X509_POLICY_TREE *tree); +X509_POLICY_LEVEL *X509_policy_tree_get0_level(const X509_POLICY_TREE *tree, + int i); + +STACK_OF(X509_POLICY_NODE) +*X509_policy_tree_get0_policies(const X509_POLICY_TREE *tree); + +STACK_OF(X509_POLICY_NODE) +*X509_policy_tree_get0_user_policies(const X509_POLICY_TREE *tree); + +int X509_policy_level_node_count(X509_POLICY_LEVEL *level); + +X509_POLICY_NODE *X509_policy_level_get0_node(const X509_POLICY_LEVEL *level, + int i); + +const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node); + +STACK_OF(POLICYQUALINFO) +*X509_policy_node_get0_qualifiers(const X509_POLICY_NODE *node); +const X509_POLICY_NODE *X509_policy_node_get0_parent(const X509_POLICY_NODE *node); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/x509v3.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/x509v3.h new file mode 100644 index 000000000000..5dd402d2a913 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/openssl/x509v3.h @@ -0,0 +1,2013 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/x509v3.h.in + * + * Copyright 1999-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_X509V3_H +#define OPENSSL_X509V3_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_X509V3_H +#endif + +#include +#include +#include +#include +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward reference */ +struct v3_ext_method; +struct v3_ext_ctx; + +/* Useful typedefs */ + +typedef void *(*X509V3_EXT_NEW)(void); +typedef void (*X509V3_EXT_FREE)(void *); +typedef void *(*X509V3_EXT_D2I)(void *, const unsigned char **, long); +typedef int (*X509V3_EXT_I2D)(const void *, unsigned char **); +typedef STACK_OF(CONF_VALUE) *(*X509V3_EXT_I2V)(const struct v3_ext_method *method, void *ext, + STACK_OF(CONF_VALUE) *extlist); +typedef void *(*X509V3_EXT_V2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, + STACK_OF(CONF_VALUE) *values); +typedef char *(*X509V3_EXT_I2S)(const struct v3_ext_method *method, + void *ext); +typedef void *(*X509V3_EXT_S2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); +typedef int (*X509V3_EXT_I2R)(const struct v3_ext_method *method, void *ext, + BIO *out, int indent); +typedef void *(*X509V3_EXT_R2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); + +/* V3 extension structure */ + +struct v3_ext_method { + int ext_nid; + int ext_flags; + /* If this is set the following four fields are ignored */ + ASN1_ITEM_EXP *it; + /* Old style ASN1 calls */ + X509V3_EXT_NEW ext_new; + X509V3_EXT_FREE ext_free; + X509V3_EXT_D2I d2i; + X509V3_EXT_I2D i2d; + /* The following pair is used for string extensions */ + X509V3_EXT_I2S i2s; + X509V3_EXT_S2I s2i; + /* The following pair is used for multi-valued extensions */ + X509V3_EXT_I2V i2v; + X509V3_EXT_V2I v2i; + /* The following are used for raw extensions */ + X509V3_EXT_I2R i2r; + X509V3_EXT_R2I r2i; + void *usr_data; /* Any extension specific data */ +}; + +typedef struct X509V3_CONF_METHOD_st { + char *(*get_string)(void *db, const char *section, const char *value); + STACK_OF(CONF_VALUE) *(*get_section)(void *db, const char *section); + void (*free_string)(void *db, char *string); + void (*free_section)(void *db, STACK_OF(CONF_VALUE) *section); +} X509V3_CONF_METHOD; + +/* Context specific info for producing X509 v3 extensions*/ +struct v3_ext_ctx { +#define X509V3_CTX_TEST 0x1 +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define CTX_TEST X509V3_CTX_TEST +#endif +#define X509V3_CTX_REPLACE 0x2 + int flags; + X509 *issuer_cert; + X509 *subject_cert; + X509_REQ *subject_req; + X509_CRL *crl; + X509V3_CONF_METHOD *db_meth; + void *db; + EVP_PKEY *issuer_pkey; + /* Maybe more here */ +}; + +typedef struct v3_ext_method X509V3_EXT_METHOD; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509V3_EXT_METHOD, X509V3_EXT_METHOD, X509V3_EXT_METHOD) +#define sk_X509V3_EXT_METHOD_num(sk) OPENSSL_sk_num(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_value(sk, idx) ((X509V3_EXT_METHOD *)OPENSSL_sk_value(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk), (idx))) +#define sk_X509V3_EXT_METHOD_new(cmp) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_new(ossl_check_X509V3_EXT_METHOD_compfunc_type(cmp))) +#define sk_X509V3_EXT_METHOD_new_null() ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_new_null()) +#define sk_X509V3_EXT_METHOD_new_reserve(cmp, n) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_new_reserve(ossl_check_X509V3_EXT_METHOD_compfunc_type(cmp), (n))) +#define sk_X509V3_EXT_METHOD_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509V3_EXT_METHOD_sk_type(sk), (n)) +#define sk_X509V3_EXT_METHOD_free(sk) OPENSSL_sk_free(ossl_check_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_zero(sk) OPENSSL_sk_zero(ossl_check_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_delete(sk, i) ((X509V3_EXT_METHOD *)OPENSSL_sk_delete(ossl_check_X509V3_EXT_METHOD_sk_type(sk), (i))) +#define sk_X509V3_EXT_METHOD_delete_ptr(sk, ptr) ((X509V3_EXT_METHOD *)OPENSSL_sk_delete_ptr(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr))) +#define sk_X509V3_EXT_METHOD_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr)) +#define sk_X509V3_EXT_METHOD_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr)) +#define sk_X509V3_EXT_METHOD_pop(sk) ((X509V3_EXT_METHOD *)OPENSSL_sk_pop(ossl_check_X509V3_EXT_METHOD_sk_type(sk))) +#define sk_X509V3_EXT_METHOD_shift(sk) ((X509V3_EXT_METHOD *)OPENSSL_sk_shift(ossl_check_X509V3_EXT_METHOD_sk_type(sk))) +#define sk_X509V3_EXT_METHOD_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509V3_EXT_METHOD_sk_type(sk),ossl_check_X509V3_EXT_METHOD_freefunc_type(freefunc)) +#define sk_X509V3_EXT_METHOD_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr), (idx)) +#define sk_X509V3_EXT_METHOD_set(sk, idx, ptr) ((X509V3_EXT_METHOD *)OPENSSL_sk_set(ossl_check_X509V3_EXT_METHOD_sk_type(sk), (idx), ossl_check_X509V3_EXT_METHOD_type(ptr))) +#define sk_X509V3_EXT_METHOD_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr)) +#define sk_X509V3_EXT_METHOD_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr)) +#define sk_X509V3_EXT_METHOD_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr), pnum) +#define sk_X509V3_EXT_METHOD_sort(sk) OPENSSL_sk_sort(ossl_check_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_dup(sk) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_dup(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk))) +#define sk_X509V3_EXT_METHOD_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_deep_copy(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_copyfunc_type(copyfunc), ossl_check_X509V3_EXT_METHOD_freefunc_type(freefunc))) +#define sk_X509V3_EXT_METHOD_set_cmp_func(sk, cmp) ((sk_X509V3_EXT_METHOD_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_compfunc_type(cmp))) + +/* clang-format on */ + +/* ext_flags values */ +#define X509V3_EXT_DYNAMIC 0x1 +#define X509V3_EXT_CTX_DEP 0x2 +#define X509V3_EXT_MULTILINE 0x4 + +typedef BIT_STRING_BITNAME ENUMERATED_NAMES; + +typedef struct BASIC_CONSTRAINTS_st { + int ca; + ASN1_INTEGER *pathlen; +} BASIC_CONSTRAINTS; + +typedef struct OSSL_BASIC_ATTR_CONSTRAINTS_st { + int authority; + ASN1_INTEGER *pathlen; +} OSSL_BASIC_ATTR_CONSTRAINTS; + +typedef struct PKEY_USAGE_PERIOD_st { + ASN1_GENERALIZEDTIME *notBefore; + ASN1_GENERALIZEDTIME *notAfter; +} PKEY_USAGE_PERIOD; + +typedef struct otherName_st { + ASN1_OBJECT *type_id; + ASN1_TYPE *value; +} OTHERNAME; + +typedef struct EDIPartyName_st { + ASN1_STRING *nameAssigner; + ASN1_STRING *partyName; +} EDIPARTYNAME; + +typedef struct GENERAL_NAME_st { +#define GEN_OTHERNAME 0 +#define GEN_EMAIL 1 +#define GEN_DNS 2 +#define GEN_X400 3 +#define GEN_DIRNAME 4 +#define GEN_EDIPARTY 5 +#define GEN_URI 6 +#define GEN_IPADD 7 +#define GEN_RID 8 + int type; + union { + char *ptr; + OTHERNAME *otherName; /* otherName */ + ASN1_IA5STRING *rfc822Name; + ASN1_IA5STRING *dNSName; + ASN1_STRING *x400Address; + X509_NAME *directoryName; + EDIPARTYNAME *ediPartyName; + ASN1_IA5STRING *uniformResourceIdentifier; + ASN1_OCTET_STRING *iPAddress; + ASN1_OBJECT *registeredID; + /* Old names */ + ASN1_OCTET_STRING *ip; /* iPAddress */ + X509_NAME *dirn; /* dirn */ + ASN1_IA5STRING *ia5; /* rfc822Name, dNSName, + * uniformResourceIdentifier */ + ASN1_OBJECT *rid; /* registeredID */ + ASN1_TYPE *other; /* x400Address */ + } d; +} GENERAL_NAME; + +typedef struct ACCESS_DESCRIPTION_st { + ASN1_OBJECT *method; + GENERAL_NAME *location; +} ACCESS_DESCRIPTION; + +int GENERAL_NAME_set1_X509_NAME(GENERAL_NAME **tgt, const X509_NAME *src); + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ACCESS_DESCRIPTION, ACCESS_DESCRIPTION, ACCESS_DESCRIPTION) +#define sk_ACCESS_DESCRIPTION_num(sk) OPENSSL_sk_num(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_value(sk, idx) ((ACCESS_DESCRIPTION *)OPENSSL_sk_value(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk), (idx))) +#define sk_ACCESS_DESCRIPTION_new(cmp) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_new(ossl_check_ACCESS_DESCRIPTION_compfunc_type(cmp))) +#define sk_ACCESS_DESCRIPTION_new_null() ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_new_null()) +#define sk_ACCESS_DESCRIPTION_new_reserve(cmp, n) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_new_reserve(ossl_check_ACCESS_DESCRIPTION_compfunc_type(cmp), (n))) +#define sk_ACCESS_DESCRIPTION_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), (n)) +#define sk_ACCESS_DESCRIPTION_free(sk) OPENSSL_sk_free(ossl_check_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_zero(sk) OPENSSL_sk_zero(ossl_check_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_delete(sk, i) ((ACCESS_DESCRIPTION *)OPENSSL_sk_delete(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), (i))) +#define sk_ACCESS_DESCRIPTION_delete_ptr(sk, ptr) ((ACCESS_DESCRIPTION *)OPENSSL_sk_delete_ptr(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr))) +#define sk_ACCESS_DESCRIPTION_push(sk, ptr) OPENSSL_sk_push(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr)) +#define sk_ACCESS_DESCRIPTION_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr)) +#define sk_ACCESS_DESCRIPTION_pop(sk) ((ACCESS_DESCRIPTION *)OPENSSL_sk_pop(ossl_check_ACCESS_DESCRIPTION_sk_type(sk))) +#define sk_ACCESS_DESCRIPTION_shift(sk) ((ACCESS_DESCRIPTION *)OPENSSL_sk_shift(ossl_check_ACCESS_DESCRIPTION_sk_type(sk))) +#define sk_ACCESS_DESCRIPTION_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ACCESS_DESCRIPTION_sk_type(sk),ossl_check_ACCESS_DESCRIPTION_freefunc_type(freefunc)) +#define sk_ACCESS_DESCRIPTION_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr), (idx)) +#define sk_ACCESS_DESCRIPTION_set(sk, idx, ptr) ((ACCESS_DESCRIPTION *)OPENSSL_sk_set(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), (idx), ossl_check_ACCESS_DESCRIPTION_type(ptr))) +#define sk_ACCESS_DESCRIPTION_find(sk, ptr) OPENSSL_sk_find(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr)) +#define sk_ACCESS_DESCRIPTION_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr)) +#define sk_ACCESS_DESCRIPTION_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr), pnum) +#define sk_ACCESS_DESCRIPTION_sort(sk) OPENSSL_sk_sort(ossl_check_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_dup(sk) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_dup(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk))) +#define sk_ACCESS_DESCRIPTION_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_deep_copy(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_copyfunc_type(copyfunc), ossl_check_ACCESS_DESCRIPTION_freefunc_type(freefunc))) +#define sk_ACCESS_DESCRIPTION_set_cmp_func(sk, cmp) ((sk_ACCESS_DESCRIPTION_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(GENERAL_NAME, GENERAL_NAME, GENERAL_NAME) +#define sk_GENERAL_NAME_num(sk) OPENSSL_sk_num(ossl_check_const_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_value(sk, idx) ((GENERAL_NAME *)OPENSSL_sk_value(ossl_check_const_GENERAL_NAME_sk_type(sk), (idx))) +#define sk_GENERAL_NAME_new(cmp) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_new(ossl_check_GENERAL_NAME_compfunc_type(cmp))) +#define sk_GENERAL_NAME_new_null() ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_new_null()) +#define sk_GENERAL_NAME_new_reserve(cmp, n) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_new_reserve(ossl_check_GENERAL_NAME_compfunc_type(cmp), (n))) +#define sk_GENERAL_NAME_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_GENERAL_NAME_sk_type(sk), (n)) +#define sk_GENERAL_NAME_free(sk) OPENSSL_sk_free(ossl_check_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_zero(sk) OPENSSL_sk_zero(ossl_check_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_delete(sk, i) ((GENERAL_NAME *)OPENSSL_sk_delete(ossl_check_GENERAL_NAME_sk_type(sk), (i))) +#define sk_GENERAL_NAME_delete_ptr(sk, ptr) ((GENERAL_NAME *)OPENSSL_sk_delete_ptr(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr))) +#define sk_GENERAL_NAME_push(sk, ptr) OPENSSL_sk_push(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr)) +#define sk_GENERAL_NAME_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr)) +#define sk_GENERAL_NAME_pop(sk) ((GENERAL_NAME *)OPENSSL_sk_pop(ossl_check_GENERAL_NAME_sk_type(sk))) +#define sk_GENERAL_NAME_shift(sk) ((GENERAL_NAME *)OPENSSL_sk_shift(ossl_check_GENERAL_NAME_sk_type(sk))) +#define sk_GENERAL_NAME_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_GENERAL_NAME_sk_type(sk),ossl_check_GENERAL_NAME_freefunc_type(freefunc)) +#define sk_GENERAL_NAME_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr), (idx)) +#define sk_GENERAL_NAME_set(sk, idx, ptr) ((GENERAL_NAME *)OPENSSL_sk_set(ossl_check_GENERAL_NAME_sk_type(sk), (idx), ossl_check_GENERAL_NAME_type(ptr))) +#define sk_GENERAL_NAME_find(sk, ptr) OPENSSL_sk_find(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr)) +#define sk_GENERAL_NAME_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr)) +#define sk_GENERAL_NAME_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr), pnum) +#define sk_GENERAL_NAME_sort(sk) OPENSSL_sk_sort(ossl_check_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_dup(sk) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_dup(ossl_check_const_GENERAL_NAME_sk_type(sk))) +#define sk_GENERAL_NAME_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_deep_copy(ossl_check_const_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_copyfunc_type(copyfunc), ossl_check_GENERAL_NAME_freefunc_type(freefunc))) +#define sk_GENERAL_NAME_set_cmp_func(sk, cmp) ((sk_GENERAL_NAME_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; +typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE; +typedef STACK_OF(ASN1_INTEGER) TLS_FEATURE; +typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(GENERAL_NAMES, GENERAL_NAMES, GENERAL_NAMES) +#define sk_GENERAL_NAMES_num(sk) OPENSSL_sk_num(ossl_check_const_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_value(sk, idx) ((GENERAL_NAMES *)OPENSSL_sk_value(ossl_check_const_GENERAL_NAMES_sk_type(sk), (idx))) +#define sk_GENERAL_NAMES_new(cmp) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_new(ossl_check_GENERAL_NAMES_compfunc_type(cmp))) +#define sk_GENERAL_NAMES_new_null() ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_new_null()) +#define sk_GENERAL_NAMES_new_reserve(cmp, n) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_new_reserve(ossl_check_GENERAL_NAMES_compfunc_type(cmp), (n))) +#define sk_GENERAL_NAMES_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_GENERAL_NAMES_sk_type(sk), (n)) +#define sk_GENERAL_NAMES_free(sk) OPENSSL_sk_free(ossl_check_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_zero(sk) OPENSSL_sk_zero(ossl_check_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_delete(sk, i) ((GENERAL_NAMES *)OPENSSL_sk_delete(ossl_check_GENERAL_NAMES_sk_type(sk), (i))) +#define sk_GENERAL_NAMES_delete_ptr(sk, ptr) ((GENERAL_NAMES *)OPENSSL_sk_delete_ptr(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr))) +#define sk_GENERAL_NAMES_push(sk, ptr) OPENSSL_sk_push(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr)) +#define sk_GENERAL_NAMES_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr)) +#define sk_GENERAL_NAMES_pop(sk) ((GENERAL_NAMES *)OPENSSL_sk_pop(ossl_check_GENERAL_NAMES_sk_type(sk))) +#define sk_GENERAL_NAMES_shift(sk) ((GENERAL_NAMES *)OPENSSL_sk_shift(ossl_check_GENERAL_NAMES_sk_type(sk))) +#define sk_GENERAL_NAMES_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_GENERAL_NAMES_sk_type(sk),ossl_check_GENERAL_NAMES_freefunc_type(freefunc)) +#define sk_GENERAL_NAMES_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr), (idx)) +#define sk_GENERAL_NAMES_set(sk, idx, ptr) ((GENERAL_NAMES *)OPENSSL_sk_set(ossl_check_GENERAL_NAMES_sk_type(sk), (idx), ossl_check_GENERAL_NAMES_type(ptr))) +#define sk_GENERAL_NAMES_find(sk, ptr) OPENSSL_sk_find(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr)) +#define sk_GENERAL_NAMES_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr)) +#define sk_GENERAL_NAMES_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr), pnum) +#define sk_GENERAL_NAMES_sort(sk) OPENSSL_sk_sort(ossl_check_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_dup(sk) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_dup(ossl_check_const_GENERAL_NAMES_sk_type(sk))) +#define sk_GENERAL_NAMES_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_deep_copy(ossl_check_const_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_copyfunc_type(copyfunc), ossl_check_GENERAL_NAMES_freefunc_type(freefunc))) +#define sk_GENERAL_NAMES_set_cmp_func(sk, cmp) ((sk_GENERAL_NAMES_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct DIST_POINT_NAME_st { + int type; + union { + GENERAL_NAMES *fullname; + STACK_OF(X509_NAME_ENTRY) *relativename; + } name; + /* If relativename then this contains the full distribution point name */ + X509_NAME *dpname; +} DIST_POINT_NAME; +DECLARE_ASN1_DUP_FUNCTION(DIST_POINT_NAME) +/* All existing reasons */ +#define CRLDP_ALL_REASONS 0x807f + +#define CRL_REASON_NONE -1 +#define CRL_REASON_UNSPECIFIED 0 +#define CRL_REASON_KEY_COMPROMISE 1 +#define CRL_REASON_CA_COMPROMISE 2 +#define CRL_REASON_AFFILIATION_CHANGED 3 +#define CRL_REASON_SUPERSEDED 4 +#define CRL_REASON_CESSATION_OF_OPERATION 5 +#define CRL_REASON_CERTIFICATE_HOLD 6 +#define CRL_REASON_REMOVE_FROM_CRL 8 +#define CRL_REASON_PRIVILEGE_WITHDRAWN 9 +#define CRL_REASON_AA_COMPROMISE 10 + +struct DIST_POINT_st { + DIST_POINT_NAME *distpoint; + ASN1_BIT_STRING *reasons; + GENERAL_NAMES *CRLissuer; + int dp_reasons; +}; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(DIST_POINT, DIST_POINT, DIST_POINT) +#define sk_DIST_POINT_num(sk) OPENSSL_sk_num(ossl_check_const_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_value(sk, idx) ((DIST_POINT *)OPENSSL_sk_value(ossl_check_const_DIST_POINT_sk_type(sk), (idx))) +#define sk_DIST_POINT_new(cmp) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_new(ossl_check_DIST_POINT_compfunc_type(cmp))) +#define sk_DIST_POINT_new_null() ((STACK_OF(DIST_POINT) *)OPENSSL_sk_new_null()) +#define sk_DIST_POINT_new_reserve(cmp, n) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_new_reserve(ossl_check_DIST_POINT_compfunc_type(cmp), (n))) +#define sk_DIST_POINT_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_DIST_POINT_sk_type(sk), (n)) +#define sk_DIST_POINT_free(sk) OPENSSL_sk_free(ossl_check_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_zero(sk) OPENSSL_sk_zero(ossl_check_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_delete(sk, i) ((DIST_POINT *)OPENSSL_sk_delete(ossl_check_DIST_POINT_sk_type(sk), (i))) +#define sk_DIST_POINT_delete_ptr(sk, ptr) ((DIST_POINT *)OPENSSL_sk_delete_ptr(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr))) +#define sk_DIST_POINT_push(sk, ptr) OPENSSL_sk_push(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr)) +#define sk_DIST_POINT_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr)) +#define sk_DIST_POINT_pop(sk) ((DIST_POINT *)OPENSSL_sk_pop(ossl_check_DIST_POINT_sk_type(sk))) +#define sk_DIST_POINT_shift(sk) ((DIST_POINT *)OPENSSL_sk_shift(ossl_check_DIST_POINT_sk_type(sk))) +#define sk_DIST_POINT_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_DIST_POINT_sk_type(sk),ossl_check_DIST_POINT_freefunc_type(freefunc)) +#define sk_DIST_POINT_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr), (idx)) +#define sk_DIST_POINT_set(sk, idx, ptr) ((DIST_POINT *)OPENSSL_sk_set(ossl_check_DIST_POINT_sk_type(sk), (idx), ossl_check_DIST_POINT_type(ptr))) +#define sk_DIST_POINT_find(sk, ptr) OPENSSL_sk_find(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr)) +#define sk_DIST_POINT_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr)) +#define sk_DIST_POINT_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr), pnum) +#define sk_DIST_POINT_sort(sk) OPENSSL_sk_sort(ossl_check_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_dup(sk) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_dup(ossl_check_const_DIST_POINT_sk_type(sk))) +#define sk_DIST_POINT_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_deep_copy(ossl_check_const_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_copyfunc_type(copyfunc), ossl_check_DIST_POINT_freefunc_type(freefunc))) +#define sk_DIST_POINT_set_cmp_func(sk, cmp) ((sk_DIST_POINT_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS; + +struct AUTHORITY_KEYID_st { + ASN1_OCTET_STRING *keyid; + GENERAL_NAMES *issuer; + ASN1_INTEGER *serial; +}; + +/* Strong extranet structures */ + +typedef struct SXNET_ID_st { + ASN1_INTEGER *zone; + ASN1_OCTET_STRING *user; +} SXNETID; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SXNETID, SXNETID, SXNETID) +#define sk_SXNETID_num(sk) OPENSSL_sk_num(ossl_check_const_SXNETID_sk_type(sk)) +#define sk_SXNETID_value(sk, idx) ((SXNETID *)OPENSSL_sk_value(ossl_check_const_SXNETID_sk_type(sk), (idx))) +#define sk_SXNETID_new(cmp) ((STACK_OF(SXNETID) *)OPENSSL_sk_new(ossl_check_SXNETID_compfunc_type(cmp))) +#define sk_SXNETID_new_null() ((STACK_OF(SXNETID) *)OPENSSL_sk_new_null()) +#define sk_SXNETID_new_reserve(cmp, n) ((STACK_OF(SXNETID) *)OPENSSL_sk_new_reserve(ossl_check_SXNETID_compfunc_type(cmp), (n))) +#define sk_SXNETID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SXNETID_sk_type(sk), (n)) +#define sk_SXNETID_free(sk) OPENSSL_sk_free(ossl_check_SXNETID_sk_type(sk)) +#define sk_SXNETID_zero(sk) OPENSSL_sk_zero(ossl_check_SXNETID_sk_type(sk)) +#define sk_SXNETID_delete(sk, i) ((SXNETID *)OPENSSL_sk_delete(ossl_check_SXNETID_sk_type(sk), (i))) +#define sk_SXNETID_delete_ptr(sk, ptr) ((SXNETID *)OPENSSL_sk_delete_ptr(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr))) +#define sk_SXNETID_push(sk, ptr) OPENSSL_sk_push(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr)) +#define sk_SXNETID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr)) +#define sk_SXNETID_pop(sk) ((SXNETID *)OPENSSL_sk_pop(ossl_check_SXNETID_sk_type(sk))) +#define sk_SXNETID_shift(sk) ((SXNETID *)OPENSSL_sk_shift(ossl_check_SXNETID_sk_type(sk))) +#define sk_SXNETID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SXNETID_sk_type(sk),ossl_check_SXNETID_freefunc_type(freefunc)) +#define sk_SXNETID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr), (idx)) +#define sk_SXNETID_set(sk, idx, ptr) ((SXNETID *)OPENSSL_sk_set(ossl_check_SXNETID_sk_type(sk), (idx), ossl_check_SXNETID_type(ptr))) +#define sk_SXNETID_find(sk, ptr) OPENSSL_sk_find(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr)) +#define sk_SXNETID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr)) +#define sk_SXNETID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr), pnum) +#define sk_SXNETID_sort(sk) OPENSSL_sk_sort(ossl_check_SXNETID_sk_type(sk)) +#define sk_SXNETID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SXNETID_sk_type(sk)) +#define sk_SXNETID_dup(sk) ((STACK_OF(SXNETID) *)OPENSSL_sk_dup(ossl_check_const_SXNETID_sk_type(sk))) +#define sk_SXNETID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SXNETID) *)OPENSSL_sk_deep_copy(ossl_check_const_SXNETID_sk_type(sk), ossl_check_SXNETID_copyfunc_type(copyfunc), ossl_check_SXNETID_freefunc_type(freefunc))) +#define sk_SXNETID_set_cmp_func(sk, cmp) ((sk_SXNETID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct SXNET_st { + ASN1_INTEGER *version; + STACK_OF(SXNETID) *ids; +} SXNET; + +typedef struct ISSUER_SIGN_TOOL_st { + ASN1_UTF8STRING *signTool; + ASN1_UTF8STRING *cATool; + ASN1_UTF8STRING *signToolCert; + ASN1_UTF8STRING *cAToolCert; +} ISSUER_SIGN_TOOL; + +typedef struct NOTICEREF_st { + ASN1_STRING *organization; + STACK_OF(ASN1_INTEGER) *noticenos; +} NOTICEREF; + +typedef struct USERNOTICE_st { + NOTICEREF *noticeref; + ASN1_STRING *exptext; +} USERNOTICE; + +typedef struct POLICYQUALINFO_st { + ASN1_OBJECT *pqualid; + union { + ASN1_IA5STRING *cpsuri; + USERNOTICE *usernotice; + ASN1_TYPE *other; + } d; +} POLICYQUALINFO; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(POLICYQUALINFO, POLICYQUALINFO, POLICYQUALINFO) +#define sk_POLICYQUALINFO_num(sk) OPENSSL_sk_num(ossl_check_const_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_value(sk, idx) ((POLICYQUALINFO *)OPENSSL_sk_value(ossl_check_const_POLICYQUALINFO_sk_type(sk), (idx))) +#define sk_POLICYQUALINFO_new(cmp) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_new(ossl_check_POLICYQUALINFO_compfunc_type(cmp))) +#define sk_POLICYQUALINFO_new_null() ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_new_null()) +#define sk_POLICYQUALINFO_new_reserve(cmp, n) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_new_reserve(ossl_check_POLICYQUALINFO_compfunc_type(cmp), (n))) +#define sk_POLICYQUALINFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_POLICYQUALINFO_sk_type(sk), (n)) +#define sk_POLICYQUALINFO_free(sk) OPENSSL_sk_free(ossl_check_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_zero(sk) OPENSSL_sk_zero(ossl_check_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_delete(sk, i) ((POLICYQUALINFO *)OPENSSL_sk_delete(ossl_check_POLICYQUALINFO_sk_type(sk), (i))) +#define sk_POLICYQUALINFO_delete_ptr(sk, ptr) ((POLICYQUALINFO *)OPENSSL_sk_delete_ptr(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr))) +#define sk_POLICYQUALINFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr)) +#define sk_POLICYQUALINFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr)) +#define sk_POLICYQUALINFO_pop(sk) ((POLICYQUALINFO *)OPENSSL_sk_pop(ossl_check_POLICYQUALINFO_sk_type(sk))) +#define sk_POLICYQUALINFO_shift(sk) ((POLICYQUALINFO *)OPENSSL_sk_shift(ossl_check_POLICYQUALINFO_sk_type(sk))) +#define sk_POLICYQUALINFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_POLICYQUALINFO_sk_type(sk),ossl_check_POLICYQUALINFO_freefunc_type(freefunc)) +#define sk_POLICYQUALINFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr), (idx)) +#define sk_POLICYQUALINFO_set(sk, idx, ptr) ((POLICYQUALINFO *)OPENSSL_sk_set(ossl_check_POLICYQUALINFO_sk_type(sk), (idx), ossl_check_POLICYQUALINFO_type(ptr))) +#define sk_POLICYQUALINFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr)) +#define sk_POLICYQUALINFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr)) +#define sk_POLICYQUALINFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr), pnum) +#define sk_POLICYQUALINFO_sort(sk) OPENSSL_sk_sort(ossl_check_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_dup(sk) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_dup(ossl_check_const_POLICYQUALINFO_sk_type(sk))) +#define sk_POLICYQUALINFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_deep_copy(ossl_check_const_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_copyfunc_type(copyfunc), ossl_check_POLICYQUALINFO_freefunc_type(freefunc))) +#define sk_POLICYQUALINFO_set_cmp_func(sk, cmp) ((sk_POLICYQUALINFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct POLICYINFO_st { + ASN1_OBJECT *policyid; + STACK_OF(POLICYQUALINFO) *qualifiers; +} POLICYINFO; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(POLICYINFO, POLICYINFO, POLICYINFO) +#define sk_POLICYINFO_num(sk) OPENSSL_sk_num(ossl_check_const_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_value(sk, idx) ((POLICYINFO *)OPENSSL_sk_value(ossl_check_const_POLICYINFO_sk_type(sk), (idx))) +#define sk_POLICYINFO_new(cmp) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_new(ossl_check_POLICYINFO_compfunc_type(cmp))) +#define sk_POLICYINFO_new_null() ((STACK_OF(POLICYINFO) *)OPENSSL_sk_new_null()) +#define sk_POLICYINFO_new_reserve(cmp, n) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_new_reserve(ossl_check_POLICYINFO_compfunc_type(cmp), (n))) +#define sk_POLICYINFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_POLICYINFO_sk_type(sk), (n)) +#define sk_POLICYINFO_free(sk) OPENSSL_sk_free(ossl_check_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_zero(sk) OPENSSL_sk_zero(ossl_check_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_delete(sk, i) ((POLICYINFO *)OPENSSL_sk_delete(ossl_check_POLICYINFO_sk_type(sk), (i))) +#define sk_POLICYINFO_delete_ptr(sk, ptr) ((POLICYINFO *)OPENSSL_sk_delete_ptr(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr))) +#define sk_POLICYINFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr)) +#define sk_POLICYINFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr)) +#define sk_POLICYINFO_pop(sk) ((POLICYINFO *)OPENSSL_sk_pop(ossl_check_POLICYINFO_sk_type(sk))) +#define sk_POLICYINFO_shift(sk) ((POLICYINFO *)OPENSSL_sk_shift(ossl_check_POLICYINFO_sk_type(sk))) +#define sk_POLICYINFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_POLICYINFO_sk_type(sk),ossl_check_POLICYINFO_freefunc_type(freefunc)) +#define sk_POLICYINFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr), (idx)) +#define sk_POLICYINFO_set(sk, idx, ptr) ((POLICYINFO *)OPENSSL_sk_set(ossl_check_POLICYINFO_sk_type(sk), (idx), ossl_check_POLICYINFO_type(ptr))) +#define sk_POLICYINFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr)) +#define sk_POLICYINFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr)) +#define sk_POLICYINFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr), pnum) +#define sk_POLICYINFO_sort(sk) OPENSSL_sk_sort(ossl_check_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_dup(sk) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_dup(ossl_check_const_POLICYINFO_sk_type(sk))) +#define sk_POLICYINFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_deep_copy(ossl_check_const_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_copyfunc_type(copyfunc), ossl_check_POLICYINFO_freefunc_type(freefunc))) +#define sk_POLICYINFO_set_cmp_func(sk, cmp) ((sk_POLICYINFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES; + +typedef struct POLICY_MAPPING_st { + ASN1_OBJECT *issuerDomainPolicy; + ASN1_OBJECT *subjectDomainPolicy; +} POLICY_MAPPING; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(POLICY_MAPPING, POLICY_MAPPING, POLICY_MAPPING) +#define sk_POLICY_MAPPING_num(sk) OPENSSL_sk_num(ossl_check_const_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_value(sk, idx) ((POLICY_MAPPING *)OPENSSL_sk_value(ossl_check_const_POLICY_MAPPING_sk_type(sk), (idx))) +#define sk_POLICY_MAPPING_new(cmp) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_new(ossl_check_POLICY_MAPPING_compfunc_type(cmp))) +#define sk_POLICY_MAPPING_new_null() ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_new_null()) +#define sk_POLICY_MAPPING_new_reserve(cmp, n) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_new_reserve(ossl_check_POLICY_MAPPING_compfunc_type(cmp), (n))) +#define sk_POLICY_MAPPING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_POLICY_MAPPING_sk_type(sk), (n)) +#define sk_POLICY_MAPPING_free(sk) OPENSSL_sk_free(ossl_check_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_zero(sk) OPENSSL_sk_zero(ossl_check_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_delete(sk, i) ((POLICY_MAPPING *)OPENSSL_sk_delete(ossl_check_POLICY_MAPPING_sk_type(sk), (i))) +#define sk_POLICY_MAPPING_delete_ptr(sk, ptr) ((POLICY_MAPPING *)OPENSSL_sk_delete_ptr(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr))) +#define sk_POLICY_MAPPING_push(sk, ptr) OPENSSL_sk_push(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr)) +#define sk_POLICY_MAPPING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr)) +#define sk_POLICY_MAPPING_pop(sk) ((POLICY_MAPPING *)OPENSSL_sk_pop(ossl_check_POLICY_MAPPING_sk_type(sk))) +#define sk_POLICY_MAPPING_shift(sk) ((POLICY_MAPPING *)OPENSSL_sk_shift(ossl_check_POLICY_MAPPING_sk_type(sk))) +#define sk_POLICY_MAPPING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_POLICY_MAPPING_sk_type(sk),ossl_check_POLICY_MAPPING_freefunc_type(freefunc)) +#define sk_POLICY_MAPPING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr), (idx)) +#define sk_POLICY_MAPPING_set(sk, idx, ptr) ((POLICY_MAPPING *)OPENSSL_sk_set(ossl_check_POLICY_MAPPING_sk_type(sk), (idx), ossl_check_POLICY_MAPPING_type(ptr))) +#define sk_POLICY_MAPPING_find(sk, ptr) OPENSSL_sk_find(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr)) +#define sk_POLICY_MAPPING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr)) +#define sk_POLICY_MAPPING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr), pnum) +#define sk_POLICY_MAPPING_sort(sk) OPENSSL_sk_sort(ossl_check_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_dup(sk) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_dup(ossl_check_const_POLICY_MAPPING_sk_type(sk))) +#define sk_POLICY_MAPPING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_deep_copy(ossl_check_const_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_copyfunc_type(copyfunc), ossl_check_POLICY_MAPPING_freefunc_type(freefunc))) +#define sk_POLICY_MAPPING_set_cmp_func(sk, cmp) ((sk_POLICY_MAPPING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(POLICY_MAPPING) POLICY_MAPPINGS; + +typedef struct GENERAL_SUBTREE_st { + GENERAL_NAME *base; + ASN1_INTEGER *minimum; + ASN1_INTEGER *maximum; +} GENERAL_SUBTREE; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(GENERAL_SUBTREE, GENERAL_SUBTREE, GENERAL_SUBTREE) +#define sk_GENERAL_SUBTREE_num(sk) OPENSSL_sk_num(ossl_check_const_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_value(sk, idx) ((GENERAL_SUBTREE *)OPENSSL_sk_value(ossl_check_const_GENERAL_SUBTREE_sk_type(sk), (idx))) +#define sk_GENERAL_SUBTREE_new(cmp) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_new(ossl_check_GENERAL_SUBTREE_compfunc_type(cmp))) +#define sk_GENERAL_SUBTREE_new_null() ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_new_null()) +#define sk_GENERAL_SUBTREE_new_reserve(cmp, n) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_new_reserve(ossl_check_GENERAL_SUBTREE_compfunc_type(cmp), (n))) +#define sk_GENERAL_SUBTREE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_GENERAL_SUBTREE_sk_type(sk), (n)) +#define sk_GENERAL_SUBTREE_free(sk) OPENSSL_sk_free(ossl_check_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_zero(sk) OPENSSL_sk_zero(ossl_check_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_delete(sk, i) ((GENERAL_SUBTREE *)OPENSSL_sk_delete(ossl_check_GENERAL_SUBTREE_sk_type(sk), (i))) +#define sk_GENERAL_SUBTREE_delete_ptr(sk, ptr) ((GENERAL_SUBTREE *)OPENSSL_sk_delete_ptr(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr))) +#define sk_GENERAL_SUBTREE_push(sk, ptr) OPENSSL_sk_push(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr)) +#define sk_GENERAL_SUBTREE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr)) +#define sk_GENERAL_SUBTREE_pop(sk) ((GENERAL_SUBTREE *)OPENSSL_sk_pop(ossl_check_GENERAL_SUBTREE_sk_type(sk))) +#define sk_GENERAL_SUBTREE_shift(sk) ((GENERAL_SUBTREE *)OPENSSL_sk_shift(ossl_check_GENERAL_SUBTREE_sk_type(sk))) +#define sk_GENERAL_SUBTREE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_GENERAL_SUBTREE_sk_type(sk),ossl_check_GENERAL_SUBTREE_freefunc_type(freefunc)) +#define sk_GENERAL_SUBTREE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr), (idx)) +#define sk_GENERAL_SUBTREE_set(sk, idx, ptr) ((GENERAL_SUBTREE *)OPENSSL_sk_set(ossl_check_GENERAL_SUBTREE_sk_type(sk), (idx), ossl_check_GENERAL_SUBTREE_type(ptr))) +#define sk_GENERAL_SUBTREE_find(sk, ptr) OPENSSL_sk_find(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr)) +#define sk_GENERAL_SUBTREE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr)) +#define sk_GENERAL_SUBTREE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr), pnum) +#define sk_GENERAL_SUBTREE_sort(sk) OPENSSL_sk_sort(ossl_check_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_dup(sk) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_dup(ossl_check_const_GENERAL_SUBTREE_sk_type(sk))) +#define sk_GENERAL_SUBTREE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_deep_copy(ossl_check_const_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_copyfunc_type(copyfunc), ossl_check_GENERAL_SUBTREE_freefunc_type(freefunc))) +#define sk_GENERAL_SUBTREE_set_cmp_func(sk, cmp) ((sk_GENERAL_SUBTREE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_compfunc_type(cmp))) + +/* clang-format on */ + +struct NAME_CONSTRAINTS_st { + STACK_OF(GENERAL_SUBTREE) *permittedSubtrees; + STACK_OF(GENERAL_SUBTREE) *excludedSubtrees; +}; + +typedef struct POLICY_CONSTRAINTS_st { + ASN1_INTEGER *requireExplicitPolicy; + ASN1_INTEGER *inhibitPolicyMapping; +} POLICY_CONSTRAINTS; + +/* Proxy certificate structures, see RFC 3820 */ +typedef struct PROXY_POLICY_st { + ASN1_OBJECT *policyLanguage; + ASN1_OCTET_STRING *policy; +} PROXY_POLICY; + +typedef struct PROXY_CERT_INFO_EXTENSION_st { + ASN1_INTEGER *pcPathLengthConstraint; + PROXY_POLICY *proxyPolicy; +} PROXY_CERT_INFO_EXTENSION; + +DECLARE_ASN1_FUNCTIONS(PROXY_POLICY) +DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION) + +struct ISSUING_DIST_POINT_st { + DIST_POINT_NAME *distpoint; + int onlyuser; + int onlyCA; + ASN1_BIT_STRING *onlysomereasons; + int indirectCRL; + int onlyattr; +}; + +/* Values in idp_flags field */ +/* IDP present */ +#define IDP_PRESENT 0x1 +/* IDP values inconsistent */ +#define IDP_INVALID 0x2 +/* onlyuser true */ +#define IDP_ONLYUSER 0x4 +/* onlyCA true */ +#define IDP_ONLYCA 0x8 +/* onlyattr true */ +#define IDP_ONLYATTR 0x10 +/* indirectCRL true */ +#define IDP_INDIRECT 0x20 +/* onlysomereasons present */ +#define IDP_REASONS 0x40 + +#define X509V3_conf_err(val) ERR_add_error_data(6, \ + "section:", (val)->section, \ + ",name:", (val)->name, ",value:", (val)->value) + +#define X509V3_set_ctx_test(ctx) \ + X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, X509V3_CTX_TEST) +#define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL; + +#define EXT_BITSTRING(nid, table) { nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), \ + 0, 0, 0, 0, \ + 0, 0, \ + (X509V3_EXT_I2V)i2v_ASN1_BIT_STRING, \ + (X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, \ + NULL, NULL, \ + table } + +#define EXT_IA5STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), \ + 0, 0, 0, 0, \ + (X509V3_EXT_I2S)i2s_ASN1_IA5STRING, \ + (X509V3_EXT_S2I)s2i_ASN1_IA5STRING, \ + 0, 0, 0, 0, \ + NULL } + +#define EXT_UTF8STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_UTF8STRING), \ + 0, 0, 0, 0, \ + (X509V3_EXT_I2S)i2s_ASN1_UTF8STRING, \ + (X509V3_EXT_S2I)s2i_ASN1_UTF8STRING, \ + 0, 0, 0, 0, \ + NULL } + +/* clang-format off */ +# define EXT_END { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} +/* clang-format on */ + +/* X509_PURPOSE stuff */ + +#define EXFLAG_BCONS 0x1 +#define EXFLAG_KUSAGE 0x2 +#define EXFLAG_XKUSAGE 0x4 +#define EXFLAG_NSCERT 0x8 + +#define EXFLAG_CA 0x10 +#define EXFLAG_SI 0x20 /* self-issued, maybe not self-signed */ +#define EXFLAG_V1 0x40 +#define EXFLAG_INVALID 0x80 +/* EXFLAG_SET is set to indicate that some values have been precomputed */ +#define EXFLAG_SET 0x100 +#define EXFLAG_CRITICAL 0x200 +#define EXFLAG_PROXY 0x400 + +#define EXFLAG_INVALID_POLICY 0x800 +#define EXFLAG_FRESHEST 0x1000 +#define EXFLAG_SS 0x2000 /* cert is apparently self-signed */ + +#define EXFLAG_BCONS_CRITICAL 0x10000 +#define EXFLAG_AKID_CRITICAL 0x20000 +#define EXFLAG_SKID_CRITICAL 0x40000 +#define EXFLAG_SAN_CRITICAL 0x80000 +#define EXFLAG_NO_FINGERPRINT 0x100000 + +/* https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.3 */ +#define KU_DIGITAL_SIGNATURE X509v3_KU_DIGITAL_SIGNATURE +#define KU_NON_REPUDIATION X509v3_KU_NON_REPUDIATION +#define KU_KEY_ENCIPHERMENT X509v3_KU_KEY_ENCIPHERMENT +#define KU_DATA_ENCIPHERMENT X509v3_KU_DATA_ENCIPHERMENT +#define KU_KEY_AGREEMENT X509v3_KU_KEY_AGREEMENT +#define KU_KEY_CERT_SIGN X509v3_KU_KEY_CERT_SIGN +#define KU_CRL_SIGN X509v3_KU_CRL_SIGN +#define KU_ENCIPHER_ONLY X509v3_KU_ENCIPHER_ONLY +#define KU_DECIPHER_ONLY X509v3_KU_DECIPHER_ONLY + +#define NS_SSL_CLIENT 0x80 +#define NS_SSL_SERVER 0x40 +#define NS_SMIME 0x20 +#define NS_OBJSIGN 0x10 +#define NS_SSL_CA 0x04 +#define NS_SMIME_CA 0x02 +#define NS_OBJSIGN_CA 0x01 +#define NS_ANY_CA (NS_SSL_CA | NS_SMIME_CA | NS_OBJSIGN_CA) + +#define XKU_SSL_SERVER 0x1 +#define XKU_SSL_CLIENT 0x2 +#define XKU_SMIME 0x4 +#define XKU_CODE_SIGN 0x8 +#define XKU_SGC 0x10 /* Netscape or MS Server-Gated Crypto */ +#define XKU_OCSP_SIGN 0x20 +#define XKU_TIMESTAMP 0x40 +#define XKU_DVCS 0x80 +#define XKU_ANYEKU 0x100 + +#define X509_PURPOSE_DYNAMIC 0x1 +#define X509_PURPOSE_DYNAMIC_NAME 0x2 + +typedef struct x509_purpose_st { + int purpose; + int trust; /* Default trust ID */ + int flags; + int (*check_purpose)(const struct x509_purpose_st *, const X509 *, int); + char *name; + char *sname; + void *usr_data; +} X509_PURPOSE; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_PURPOSE, X509_PURPOSE, X509_PURPOSE) +#define sk_X509_PURPOSE_num(sk) OPENSSL_sk_num(ossl_check_const_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_value(sk, idx) ((X509_PURPOSE *)OPENSSL_sk_value(ossl_check_const_X509_PURPOSE_sk_type(sk), (idx))) +#define sk_X509_PURPOSE_new(cmp) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_new(ossl_check_X509_PURPOSE_compfunc_type(cmp))) +#define sk_X509_PURPOSE_new_null() ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_new_null()) +#define sk_X509_PURPOSE_new_reserve(cmp, n) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_new_reserve(ossl_check_X509_PURPOSE_compfunc_type(cmp), (n))) +#define sk_X509_PURPOSE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_PURPOSE_sk_type(sk), (n)) +#define sk_X509_PURPOSE_free(sk) OPENSSL_sk_free(ossl_check_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_zero(sk) OPENSSL_sk_zero(ossl_check_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_delete(sk, i) ((X509_PURPOSE *)OPENSSL_sk_delete(ossl_check_X509_PURPOSE_sk_type(sk), (i))) +#define sk_X509_PURPOSE_delete_ptr(sk, ptr) ((X509_PURPOSE *)OPENSSL_sk_delete_ptr(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr))) +#define sk_X509_PURPOSE_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr)) +#define sk_X509_PURPOSE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr)) +#define sk_X509_PURPOSE_pop(sk) ((X509_PURPOSE *)OPENSSL_sk_pop(ossl_check_X509_PURPOSE_sk_type(sk))) +#define sk_X509_PURPOSE_shift(sk) ((X509_PURPOSE *)OPENSSL_sk_shift(ossl_check_X509_PURPOSE_sk_type(sk))) +#define sk_X509_PURPOSE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_PURPOSE_sk_type(sk),ossl_check_X509_PURPOSE_freefunc_type(freefunc)) +#define sk_X509_PURPOSE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr), (idx)) +#define sk_X509_PURPOSE_set(sk, idx, ptr) ((X509_PURPOSE *)OPENSSL_sk_set(ossl_check_X509_PURPOSE_sk_type(sk), (idx), ossl_check_X509_PURPOSE_type(ptr))) +#define sk_X509_PURPOSE_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr)) +#define sk_X509_PURPOSE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr)) +#define sk_X509_PURPOSE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr), pnum) +#define sk_X509_PURPOSE_sort(sk) OPENSSL_sk_sort(ossl_check_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_dup(sk) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_dup(ossl_check_const_X509_PURPOSE_sk_type(sk))) +#define sk_X509_PURPOSE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_copyfunc_type(copyfunc), ossl_check_X509_PURPOSE_freefunc_type(freefunc))) +#define sk_X509_PURPOSE_set_cmp_func(sk, cmp) ((sk_X509_PURPOSE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_compfunc_type(cmp))) + +/* clang-format on */ + +#define X509_PURPOSE_DEFAULT_ANY 0 +#define X509_PURPOSE_SSL_CLIENT 1 +#define X509_PURPOSE_SSL_SERVER 2 +#define X509_PURPOSE_NS_SSL_SERVER 3 +#define X509_PURPOSE_SMIME_SIGN 4 +#define X509_PURPOSE_SMIME_ENCRYPT 5 +#define X509_PURPOSE_CRL_SIGN 6 +#define X509_PURPOSE_ANY 7 +#define X509_PURPOSE_OCSP_HELPER 8 +#define X509_PURPOSE_TIMESTAMP_SIGN 9 +#define X509_PURPOSE_CODE_SIGN 10 + +#define X509_PURPOSE_MIN 1 +#define X509_PURPOSE_MAX 10 + +/* Flags for X509V3_EXT_print() */ + +#define X509V3_EXT_UNKNOWN_MASK (0xfL << 16) +/* Return error for unknown extensions */ +#define X509V3_EXT_DEFAULT 0 +/* Print error for unknown extensions */ +#define X509V3_EXT_ERROR_UNKNOWN (1L << 16) +/* ASN1 parse unknown extensions */ +#define X509V3_EXT_PARSE_UNKNOWN (2L << 16) +/* BIO_dump unknown extensions */ +#define X509V3_EXT_DUMP_UNKNOWN (3L << 16) + +/* Flags for X509V3_add1_i2d */ + +#define X509V3_ADD_OP_MASK 0xfL +#define X509V3_ADD_DEFAULT 0L +#define X509V3_ADD_APPEND 1L +#define X509V3_ADD_REPLACE 2L +#define X509V3_ADD_REPLACE_EXISTING 3L +#define X509V3_ADD_KEEP_EXISTING 4L +#define X509V3_ADD_DELETE 5L +#define X509V3_ADD_SILENT 0x10 + +DECLARE_ASN1_FUNCTIONS(BASIC_CONSTRAINTS) +DECLARE_ASN1_FUNCTIONS(OSSL_BASIC_ATTR_CONSTRAINTS) + +DECLARE_ASN1_FUNCTIONS(SXNET) +DECLARE_ASN1_FUNCTIONS(SXNETID) + +DECLARE_ASN1_FUNCTIONS(ISSUER_SIGN_TOOL) + +int SXNET_add_id_asc(SXNET **psx, const char *zone, const char *user, int userlen); +int SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, const char *user, + int userlen); +int SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *izone, const char *user, + int userlen); + +ASN1_OCTET_STRING *SXNET_get_id_asc(SXNET *sx, const char *zone); +ASN1_OCTET_STRING *SXNET_get_id_ulong(SXNET *sx, unsigned long lzone); +ASN1_OCTET_STRING *SXNET_get_id_INTEGER(SXNET *sx, ASN1_INTEGER *zone); + +DECLARE_ASN1_FUNCTIONS(AUTHORITY_KEYID) + +DECLARE_ASN1_FUNCTIONS(PKEY_USAGE_PERIOD) + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAME) +DECLARE_ASN1_DUP_FUNCTION(GENERAL_NAME) +int GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b); + +ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, + STACK_OF(CONF_VALUE) *nval); +STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + ASN1_BIT_STRING *bits, + STACK_OF(CONF_VALUE) *extlist); +char *i2s_ASN1_IA5STRING(X509V3_EXT_METHOD *method, ASN1_IA5STRING *ia5); +ASN1_IA5STRING *s2i_ASN1_IA5STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, const char *str); +char *i2s_ASN1_UTF8STRING(X509V3_EXT_METHOD *method, ASN1_UTF8STRING *utf8); +ASN1_UTF8STRING *s2i_ASN1_UTF8STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, const char *str); + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, + GENERAL_NAME *gen, + STACK_OF(CONF_VALUE) *ret); +int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen); + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAMES) + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, + GENERAL_NAMES *gen, + STACK_OF(CONF_VALUE) *extlist); +GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); + +DECLARE_ASN1_FUNCTIONS(OTHERNAME) +DECLARE_ASN1_FUNCTIONS(EDIPARTYNAME) +int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b); +void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value); +void *GENERAL_NAME_get0_value(const GENERAL_NAME *a, int *ptype); +int GENERAL_NAME_set0_othername(GENERAL_NAME *gen, + ASN1_OBJECT *oid, ASN1_TYPE *value); +int GENERAL_NAME_get0_otherName(const GENERAL_NAME *gen, + ASN1_OBJECT **poid, ASN1_TYPE **pvalue); + +char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + const ASN1_OCTET_STRING *ia5); +ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, const char *str); + +DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE) +int i2a_ACCESS_DESCRIPTION(BIO *bp, const ACCESS_DESCRIPTION *a); + +DECLARE_ASN1_ALLOC_FUNCTIONS(TLS_FEATURE) + +DECLARE_ASN1_FUNCTIONS(CERTIFICATEPOLICIES) +DECLARE_ASN1_FUNCTIONS(POLICYINFO) +DECLARE_ASN1_FUNCTIONS(POLICYQUALINFO) +DECLARE_ASN1_FUNCTIONS(USERNOTICE) +DECLARE_ASN1_FUNCTIONS(NOTICEREF) + +DECLARE_ASN1_FUNCTIONS(CRL_DIST_POINTS) +DECLARE_ASN1_FUNCTIONS(DIST_POINT) +DECLARE_ASN1_FUNCTIONS(DIST_POINT_NAME) +DECLARE_ASN1_FUNCTIONS(ISSUING_DIST_POINT) + +int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn, const X509_NAME *iname); + +int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc); +int NAME_CONSTRAINTS_check_CN(X509 *x, NAME_CONSTRAINTS *nc); + +DECLARE_ASN1_FUNCTIONS(ACCESS_DESCRIPTION) +DECLARE_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS) + +DECLARE_ASN1_ITEM(POLICY_MAPPING) +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_MAPPING) +DECLARE_ASN1_ITEM(POLICY_MAPPINGS) + +DECLARE_ASN1_ITEM(GENERAL_SUBTREE) +DECLARE_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE) + +DECLARE_ASN1_ITEM(NAME_CONSTRAINTS) +DECLARE_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) + +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_CONSTRAINTS) +DECLARE_ASN1_ITEM(POLICY_CONSTRAINTS) + +GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, int gen_type, + const char *value, int is_nc); + +#ifdef OPENSSL_CONF_H +GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf); +GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf, + int is_nc); + +void X509V3_conf_free(CONF_VALUE *val); + +X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid, + const char *value); +X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, const char *name, + const char *value); +int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, const char *section, + STACK_OF(X509_EXTENSION) **sk); +int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, + X509 *cert); +int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, + X509_REQ *req); +int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, + X509_CRL *crl); + +X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, + X509V3_CTX *ctx, int ext_nid, + const char *value); +X509_EXTENSION *X509V3_EXT_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *name, const char *value); +int X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *section, X509 *cert); +int X509V3_EXT_REQ_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *section, X509_REQ *req); +int X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *section, X509_CRL *crl); + +int X509V3_add_value_bool_nf(const char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_get_value_bool(const CONF_VALUE *value, int *asn1_bool); +int X509V3_get_value_int(const CONF_VALUE *value, ASN1_INTEGER **aint); +void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf); +void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH_OF(CONF_VALUE) *lhash); +#endif + +char *X509V3_get_string(X509V3_CTX *ctx, const char *name, const char *section); +STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, const char *section); +void X509V3_string_free(X509V3_CTX *ctx, char *str); +void X509V3_section_free(X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section); +void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject, + X509_REQ *req, X509_CRL *crl, int flags); +/* For API backward compatibility, this is separate from X509V3_set_ctx(): */ +int X509V3_set_issuer_pkey(X509V3_CTX *ctx, EVP_PKEY *pkey); + +int X509V3_add_value(const char *name, const char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_uchar(const char *name, const unsigned char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_bool(const char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_int(const char *name, const ASN1_INTEGER *aint, + STACK_OF(CONF_VALUE) **extlist); +char *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, const ASN1_INTEGER *aint); +ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, const char *value); +char *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, const ASN1_ENUMERATED *aint); +char *i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *meth, + const ASN1_ENUMERATED *aint); +int X509V3_EXT_add(X509V3_EXT_METHOD *ext); +int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist); +int X509V3_EXT_add_alias(int nid_to, int nid_from); +void X509V3_EXT_cleanup(void); + +const X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *ext); +const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid); +int X509V3_add_standard_extensions(void); +STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line); +void *X509V3_EXT_d2i(X509_EXTENSION *ext); +void *X509V3_get_d2i(const STACK_OF(X509_EXTENSION) *x, int nid, int *crit, + int *idx); + +X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc); +int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, + int crit, unsigned long flags); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +/* The new declarations are in crypto.h, but the old ones were here. */ +#define hex_to_string OPENSSL_buf2hexstr +#define string_to_hex OPENSSL_hexstr2buf +#endif + +void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent, + int ml); +int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag, + int indent); +#ifndef OPENSSL_NO_STDIO +int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent); +#endif +int X509V3_extensions_print(BIO *out, const char *title, + const STACK_OF(X509_EXTENSION) *exts, + unsigned long flag, int indent); + +int X509_check_ca(X509 *x); +int X509_check_purpose(X509 *x, int id, int ca); +int X509_supported_extension(X509_EXTENSION *ex); +int X509_check_issued(X509 *issuer, X509 *subject); +int X509_check_akid(const X509 *issuer, const AUTHORITY_KEYID *akid); +void X509_set_proxy_flag(X509 *x); +void X509_set_proxy_pathlen(X509 *x, long l); +long X509_get_proxy_pathlen(X509 *x); + +uint32_t X509_get_extension_flags(X509 *x); +uint32_t X509_get_key_usage(X509 *x); +uint32_t X509_get_extended_key_usage(X509 *x); +const ASN1_OCTET_STRING *X509_get0_subject_key_id(X509 *x); +const ASN1_OCTET_STRING *X509_get0_authority_key_id(X509 *x); +const GENERAL_NAMES *X509_get0_authority_issuer(X509 *x); +const ASN1_INTEGER *X509_get0_authority_serial(X509 *x); + +int X509_PURPOSE_get_count(void); +int X509_PURPOSE_get_unused_id(OSSL_LIB_CTX *libctx); +int X509_PURPOSE_get_by_sname(const char *sname); +int X509_PURPOSE_get_by_id(int id); +int X509_PURPOSE_add(int id, int trust, int flags, + int (*ck)(const X509_PURPOSE *, const X509 *, int), + const char *name, const char *sname, void *arg); +void X509_PURPOSE_cleanup(void); + +X509_PURPOSE *X509_PURPOSE_get0(int idx); +int X509_PURPOSE_get_id(const X509_PURPOSE *); +char *X509_PURPOSE_get0_name(const X509_PURPOSE *xp); +char *X509_PURPOSE_get0_sname(const X509_PURPOSE *xp); +int X509_PURPOSE_get_trust(const X509_PURPOSE *xp); +int X509_PURPOSE_set(int *p, int purpose); + +STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x); +STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x); +void X509_email_free(STACK_OF(OPENSSL_STRING) *sk); +STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x); + +/* Flags for X509_check_* functions */ + +/* + * Always check subject name for host match even if subject alt names present + */ +#define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT 0x1 +/* Disable wildcard matching for dnsName fields and common name. */ +#define X509_CHECK_FLAG_NO_WILDCARDS 0x2 +/* Wildcards must not match a partial label. */ +#define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0x4 +/* Allow (non-partial) wildcards to match multiple labels. */ +#define X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS 0x8 +/* Constraint verifier subdomain patterns to match a single labels. */ +#define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0x10 +/* Never check the subject CN */ +#define X509_CHECK_FLAG_NEVER_CHECK_SUBJECT 0x20 +/* + * Match reference identifiers starting with "." to any sub-domain. + * This is a non-public flag, turned on implicitly when the subject + * reference identity is a DNS name. + */ +#define _X509_CHECK_FLAG_DOT_SUBDOMAINS 0x8000 + +int X509_check_host(X509 *x, const char *chk, size_t chklen, + unsigned int flags, char **peername); +int X509_check_email(X509 *x, const char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags); + +ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc); +ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc); +int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE) *dn_sk, + unsigned long chtype); + +void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent); +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_POLICY_NODE, X509_POLICY_NODE, X509_POLICY_NODE) +#define sk_X509_POLICY_NODE_num(sk) OPENSSL_sk_num(ossl_check_const_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_value(sk, idx) ((X509_POLICY_NODE *)OPENSSL_sk_value(ossl_check_const_X509_POLICY_NODE_sk_type(sk), (idx))) +#define sk_X509_POLICY_NODE_new(cmp) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_new(ossl_check_X509_POLICY_NODE_compfunc_type(cmp))) +#define sk_X509_POLICY_NODE_new_null() ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_new_null()) +#define sk_X509_POLICY_NODE_new_reserve(cmp, n) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_new_reserve(ossl_check_X509_POLICY_NODE_compfunc_type(cmp), (n))) +#define sk_X509_POLICY_NODE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_POLICY_NODE_sk_type(sk), (n)) +#define sk_X509_POLICY_NODE_free(sk) OPENSSL_sk_free(ossl_check_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_zero(sk) OPENSSL_sk_zero(ossl_check_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_delete(sk, i) ((X509_POLICY_NODE *)OPENSSL_sk_delete(ossl_check_X509_POLICY_NODE_sk_type(sk), (i))) +#define sk_X509_POLICY_NODE_delete_ptr(sk, ptr) ((X509_POLICY_NODE *)OPENSSL_sk_delete_ptr(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr))) +#define sk_X509_POLICY_NODE_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr)) +#define sk_X509_POLICY_NODE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr)) +#define sk_X509_POLICY_NODE_pop(sk) ((X509_POLICY_NODE *)OPENSSL_sk_pop(ossl_check_X509_POLICY_NODE_sk_type(sk))) +#define sk_X509_POLICY_NODE_shift(sk) ((X509_POLICY_NODE *)OPENSSL_sk_shift(ossl_check_X509_POLICY_NODE_sk_type(sk))) +#define sk_X509_POLICY_NODE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_POLICY_NODE_sk_type(sk),ossl_check_X509_POLICY_NODE_freefunc_type(freefunc)) +#define sk_X509_POLICY_NODE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr), (idx)) +#define sk_X509_POLICY_NODE_set(sk, idx, ptr) ((X509_POLICY_NODE *)OPENSSL_sk_set(ossl_check_X509_POLICY_NODE_sk_type(sk), (idx), ossl_check_X509_POLICY_NODE_type(ptr))) +#define sk_X509_POLICY_NODE_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr)) +#define sk_X509_POLICY_NODE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr)) +#define sk_X509_POLICY_NODE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr), pnum) +#define sk_X509_POLICY_NODE_sort(sk) OPENSSL_sk_sort(ossl_check_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_dup(sk) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_dup(ossl_check_const_X509_POLICY_NODE_sk_type(sk))) +#define sk_X509_POLICY_NODE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_copyfunc_type(copyfunc), ossl_check_X509_POLICY_NODE_freefunc_type(freefunc))) +#define sk_X509_POLICY_NODE_set_cmp_func(sk, cmp) ((sk_X509_POLICY_NODE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_compfunc_type(cmp))) + +/* clang-format on */ + +#ifndef OPENSSL_NO_RFC3779 +typedef struct ASRange_st { + ASN1_INTEGER *min, *max; +} ASRange; + +#define ASIdOrRange_id 0 +#define ASIdOrRange_range 1 + +typedef struct ASIdOrRange_st { + int type; + union { + ASN1_INTEGER *id; + ASRange *range; + } u; +} ASIdOrRange; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASIdOrRange, ASIdOrRange, ASIdOrRange) +#define sk_ASIdOrRange_num(sk) OPENSSL_sk_num(ossl_check_const_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_value(sk, idx) ((ASIdOrRange *)OPENSSL_sk_value(ossl_check_const_ASIdOrRange_sk_type(sk), (idx))) +#define sk_ASIdOrRange_new(cmp) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_new(ossl_check_ASIdOrRange_compfunc_type(cmp))) +#define sk_ASIdOrRange_new_null() ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_new_null()) +#define sk_ASIdOrRange_new_reserve(cmp, n) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_new_reserve(ossl_check_ASIdOrRange_compfunc_type(cmp), (n))) +#define sk_ASIdOrRange_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASIdOrRange_sk_type(sk), (n)) +#define sk_ASIdOrRange_free(sk) OPENSSL_sk_free(ossl_check_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_zero(sk) OPENSSL_sk_zero(ossl_check_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_delete(sk, i) ((ASIdOrRange *)OPENSSL_sk_delete(ossl_check_ASIdOrRange_sk_type(sk), (i))) +#define sk_ASIdOrRange_delete_ptr(sk, ptr) ((ASIdOrRange *)OPENSSL_sk_delete_ptr(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr))) +#define sk_ASIdOrRange_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr)) +#define sk_ASIdOrRange_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr)) +#define sk_ASIdOrRange_pop(sk) ((ASIdOrRange *)OPENSSL_sk_pop(ossl_check_ASIdOrRange_sk_type(sk))) +#define sk_ASIdOrRange_shift(sk) ((ASIdOrRange *)OPENSSL_sk_shift(ossl_check_ASIdOrRange_sk_type(sk))) +#define sk_ASIdOrRange_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASIdOrRange_sk_type(sk),ossl_check_ASIdOrRange_freefunc_type(freefunc)) +#define sk_ASIdOrRange_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr), (idx)) +#define sk_ASIdOrRange_set(sk, idx, ptr) ((ASIdOrRange *)OPENSSL_sk_set(ossl_check_ASIdOrRange_sk_type(sk), (idx), ossl_check_ASIdOrRange_type(ptr))) +#define sk_ASIdOrRange_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr)) +#define sk_ASIdOrRange_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr)) +#define sk_ASIdOrRange_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr), pnum) +#define sk_ASIdOrRange_sort(sk) OPENSSL_sk_sort(ossl_check_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_dup(sk) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_dup(ossl_check_const_ASIdOrRange_sk_type(sk))) +#define sk_ASIdOrRange_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_deep_copy(ossl_check_const_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_copyfunc_type(copyfunc), ossl_check_ASIdOrRange_freefunc_type(freefunc))) +#define sk_ASIdOrRange_set_cmp_func(sk, cmp) ((sk_ASIdOrRange_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(ASIdOrRange) ASIdOrRanges; + +#define ASIdentifierChoice_inherit 0 +#define ASIdentifierChoice_asIdsOrRanges 1 + +typedef struct ASIdentifierChoice_st { + int type; + union { + ASN1_NULL *inherit; + ASIdOrRanges *asIdsOrRanges; + } u; +} ASIdentifierChoice; + +typedef struct ASIdentifiers_st { + ASIdentifierChoice *asnum, *rdi; +} ASIdentifiers; + +DECLARE_ASN1_FUNCTIONS(ASRange) +DECLARE_ASN1_FUNCTIONS(ASIdOrRange) +DECLARE_ASN1_FUNCTIONS(ASIdentifierChoice) +DECLARE_ASN1_FUNCTIONS(ASIdentifiers) + +typedef struct IPAddressRange_st { + ASN1_BIT_STRING *min, *max; +} IPAddressRange; + +#define IPAddressOrRange_addressPrefix 0 +#define IPAddressOrRange_addressRange 1 + +typedef struct IPAddressOrRange_st { + int type; + union { + ASN1_BIT_STRING *addressPrefix; + IPAddressRange *addressRange; + } u; +} IPAddressOrRange; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(IPAddressOrRange, IPAddressOrRange, IPAddressOrRange) +#define sk_IPAddressOrRange_num(sk) OPENSSL_sk_num(ossl_check_const_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_value(sk, idx) ((IPAddressOrRange *)OPENSSL_sk_value(ossl_check_const_IPAddressOrRange_sk_type(sk), (idx))) +#define sk_IPAddressOrRange_new(cmp) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_new(ossl_check_IPAddressOrRange_compfunc_type(cmp))) +#define sk_IPAddressOrRange_new_null() ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_new_null()) +#define sk_IPAddressOrRange_new_reserve(cmp, n) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_new_reserve(ossl_check_IPAddressOrRange_compfunc_type(cmp), (n))) +#define sk_IPAddressOrRange_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_IPAddressOrRange_sk_type(sk), (n)) +#define sk_IPAddressOrRange_free(sk) OPENSSL_sk_free(ossl_check_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_zero(sk) OPENSSL_sk_zero(ossl_check_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_delete(sk, i) ((IPAddressOrRange *)OPENSSL_sk_delete(ossl_check_IPAddressOrRange_sk_type(sk), (i))) +#define sk_IPAddressOrRange_delete_ptr(sk, ptr) ((IPAddressOrRange *)OPENSSL_sk_delete_ptr(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr))) +#define sk_IPAddressOrRange_push(sk, ptr) OPENSSL_sk_push(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr)) +#define sk_IPAddressOrRange_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr)) +#define sk_IPAddressOrRange_pop(sk) ((IPAddressOrRange *)OPENSSL_sk_pop(ossl_check_IPAddressOrRange_sk_type(sk))) +#define sk_IPAddressOrRange_shift(sk) ((IPAddressOrRange *)OPENSSL_sk_shift(ossl_check_IPAddressOrRange_sk_type(sk))) +#define sk_IPAddressOrRange_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_IPAddressOrRange_sk_type(sk),ossl_check_IPAddressOrRange_freefunc_type(freefunc)) +#define sk_IPAddressOrRange_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr), (idx)) +#define sk_IPAddressOrRange_set(sk, idx, ptr) ((IPAddressOrRange *)OPENSSL_sk_set(ossl_check_IPAddressOrRange_sk_type(sk), (idx), ossl_check_IPAddressOrRange_type(ptr))) +#define sk_IPAddressOrRange_find(sk, ptr) OPENSSL_sk_find(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr)) +#define sk_IPAddressOrRange_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr)) +#define sk_IPAddressOrRange_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr), pnum) +#define sk_IPAddressOrRange_sort(sk) OPENSSL_sk_sort(ossl_check_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_dup(sk) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_dup(ossl_check_const_IPAddressOrRange_sk_type(sk))) +#define sk_IPAddressOrRange_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_deep_copy(ossl_check_const_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_copyfunc_type(copyfunc), ossl_check_IPAddressOrRange_freefunc_type(freefunc))) +#define sk_IPAddressOrRange_set_cmp_func(sk, cmp) ((sk_IPAddressOrRange_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(IPAddressOrRange) IPAddressOrRanges; + +#define IPAddressChoice_inherit 0 +#define IPAddressChoice_addressesOrRanges 1 + +typedef struct IPAddressChoice_st { + int type; + union { + ASN1_NULL *inherit; + IPAddressOrRanges *addressesOrRanges; + } u; +} IPAddressChoice; + +typedef struct IPAddressFamily_st { + ASN1_OCTET_STRING *addressFamily; + IPAddressChoice *ipAddressChoice; +} IPAddressFamily; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(IPAddressFamily, IPAddressFamily, IPAddressFamily) +#define sk_IPAddressFamily_num(sk) OPENSSL_sk_num(ossl_check_const_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_value(sk, idx) ((IPAddressFamily *)OPENSSL_sk_value(ossl_check_const_IPAddressFamily_sk_type(sk), (idx))) +#define sk_IPAddressFamily_new(cmp) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_new(ossl_check_IPAddressFamily_compfunc_type(cmp))) +#define sk_IPAddressFamily_new_null() ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_new_null()) +#define sk_IPAddressFamily_new_reserve(cmp, n) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_new_reserve(ossl_check_IPAddressFamily_compfunc_type(cmp), (n))) +#define sk_IPAddressFamily_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_IPAddressFamily_sk_type(sk), (n)) +#define sk_IPAddressFamily_free(sk) OPENSSL_sk_free(ossl_check_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_zero(sk) OPENSSL_sk_zero(ossl_check_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_delete(sk, i) ((IPAddressFamily *)OPENSSL_sk_delete(ossl_check_IPAddressFamily_sk_type(sk), (i))) +#define sk_IPAddressFamily_delete_ptr(sk, ptr) ((IPAddressFamily *)OPENSSL_sk_delete_ptr(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr))) +#define sk_IPAddressFamily_push(sk, ptr) OPENSSL_sk_push(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr)) +#define sk_IPAddressFamily_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr)) +#define sk_IPAddressFamily_pop(sk) ((IPAddressFamily *)OPENSSL_sk_pop(ossl_check_IPAddressFamily_sk_type(sk))) +#define sk_IPAddressFamily_shift(sk) ((IPAddressFamily *)OPENSSL_sk_shift(ossl_check_IPAddressFamily_sk_type(sk))) +#define sk_IPAddressFamily_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_IPAddressFamily_sk_type(sk),ossl_check_IPAddressFamily_freefunc_type(freefunc)) +#define sk_IPAddressFamily_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr), (idx)) +#define sk_IPAddressFamily_set(sk, idx, ptr) ((IPAddressFamily *)OPENSSL_sk_set(ossl_check_IPAddressFamily_sk_type(sk), (idx), ossl_check_IPAddressFamily_type(ptr))) +#define sk_IPAddressFamily_find(sk, ptr) OPENSSL_sk_find(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr)) +#define sk_IPAddressFamily_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr)) +#define sk_IPAddressFamily_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr), pnum) +#define sk_IPAddressFamily_sort(sk) OPENSSL_sk_sort(ossl_check_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_dup(sk) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_dup(ossl_check_const_IPAddressFamily_sk_type(sk))) +#define sk_IPAddressFamily_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_deep_copy(ossl_check_const_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_copyfunc_type(copyfunc), ossl_check_IPAddressFamily_freefunc_type(freefunc))) +#define sk_IPAddressFamily_set_cmp_func(sk, cmp) ((sk_IPAddressFamily_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(IPAddressFamily) IPAddrBlocks; + +DECLARE_ASN1_FUNCTIONS(IPAddressRange) +DECLARE_ASN1_FUNCTIONS(IPAddressOrRange) +DECLARE_ASN1_FUNCTIONS(IPAddressChoice) +DECLARE_ASN1_FUNCTIONS(IPAddressFamily) + +/* + * API tag for elements of the ASIdentifer SEQUENCE. + */ +#define V3_ASID_ASNUM 0 +#define V3_ASID_RDI 1 + +/* + * AFI values, assigned by IANA. It'd be nice to make the AFI + * handling code totally generic, but there are too many little things + * that would need to be defined for other address families for it to + * be worth the trouble. + */ +#define IANA_AFI_IPV4 1 +#define IANA_AFI_IPV6 2 + +/* + * Utilities to construct and extract values from RFC3779 extensions, + * since some of the encodings (particularly for IP address prefixes + * and ranges) are a bit tedious to work with directly. + */ +int X509v3_asid_add_inherit(ASIdentifiers *asid, int which); +int X509v3_asid_add_id_or_range(ASIdentifiers *asid, int which, + ASN1_INTEGER *min, ASN1_INTEGER *max); +int X509v3_addr_add_inherit(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi); +int X509v3_addr_add_prefix(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *a, const int prefixlen); +int X509v3_addr_add_range(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *min, unsigned char *max); +unsigned X509v3_addr_get_afi(const IPAddressFamily *f); +int X509v3_addr_get_range(IPAddressOrRange *aor, const unsigned afi, + unsigned char *min, unsigned char *max, + const int length); + +/* + * Canonical forms. + */ +int X509v3_asid_is_canonical(ASIdentifiers *asid); +int X509v3_addr_is_canonical(IPAddrBlocks *addr); +int X509v3_asid_canonize(ASIdentifiers *asid); +int X509v3_addr_canonize(IPAddrBlocks *addr); + +/* + * Tests for inheritance and containment. + */ +int X509v3_asid_inherits(ASIdentifiers *asid); +int X509v3_addr_inherits(IPAddrBlocks *addr); +int X509v3_asid_subset(ASIdentifiers *a, ASIdentifiers *b); +int X509v3_addr_subset(IPAddrBlocks *a, IPAddrBlocks *b); + +/* + * Check whether RFC 3779 extensions nest properly in chains. + */ +int X509v3_asid_validate_path(X509_STORE_CTX *); +int X509v3_addr_validate_path(X509_STORE_CTX *); +int X509v3_asid_validate_resource_set(STACK_OF(X509) *chain, + ASIdentifiers *ext, + int allow_inheritance); +int X509v3_addr_validate_resource_set(STACK_OF(X509) *chain, + IPAddrBlocks *ext, int allow_inheritance); + +#endif /* OPENSSL_NO_RFC3779 */ + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_STRING, ASN1_STRING, ASN1_STRING) +#define sk_ASN1_STRING_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_value(sk, idx) ((ASN1_STRING *)OPENSSL_sk_value(ossl_check_const_ASN1_STRING_sk_type(sk), (idx))) +#define sk_ASN1_STRING_new(cmp) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_new(ossl_check_ASN1_STRING_compfunc_type(cmp))) +#define sk_ASN1_STRING_new_null() ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_new_null()) +#define sk_ASN1_STRING_new_reserve(cmp, n) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_STRING_compfunc_type(cmp), (n))) +#define sk_ASN1_STRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_STRING_sk_type(sk), (n)) +#define sk_ASN1_STRING_free(sk) OPENSSL_sk_free(ossl_check_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_delete(sk, i) ((ASN1_STRING *)OPENSSL_sk_delete(ossl_check_ASN1_STRING_sk_type(sk), (i))) +#define sk_ASN1_STRING_delete_ptr(sk, ptr) ((ASN1_STRING *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr))) +#define sk_ASN1_STRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr)) +#define sk_ASN1_STRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr)) +#define sk_ASN1_STRING_pop(sk) ((ASN1_STRING *)OPENSSL_sk_pop(ossl_check_ASN1_STRING_sk_type(sk))) +#define sk_ASN1_STRING_shift(sk) ((ASN1_STRING *)OPENSSL_sk_shift(ossl_check_ASN1_STRING_sk_type(sk))) +#define sk_ASN1_STRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_STRING_sk_type(sk),ossl_check_ASN1_STRING_freefunc_type(freefunc)) +#define sk_ASN1_STRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr), (idx)) +#define sk_ASN1_STRING_set(sk, idx, ptr) ((ASN1_STRING *)OPENSSL_sk_set(ossl_check_ASN1_STRING_sk_type(sk), (idx), ossl_check_ASN1_STRING_type(ptr))) +#define sk_ASN1_STRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr)) +#define sk_ASN1_STRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr)) +#define sk_ASN1_STRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr), pnum) +#define sk_ASN1_STRING_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_dup(sk) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_dup(ossl_check_const_ASN1_STRING_sk_type(sk))) +#define sk_ASN1_STRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_copyfunc_type(copyfunc), ossl_check_ASN1_STRING_freefunc_type(freefunc))) +#define sk_ASN1_STRING_set_cmp_func(sk, cmp) ((sk_ASN1_STRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_compfunc_type(cmp))) + +/* clang-format on */ + +/* + * Admission Syntax + */ +typedef struct NamingAuthority_st NAMING_AUTHORITY; +typedef struct ProfessionInfo_st PROFESSION_INFO; +typedef struct Admissions_st ADMISSIONS; +typedef struct AdmissionSyntax_st ADMISSION_SYNTAX; +DECLARE_ASN1_FUNCTIONS(NAMING_AUTHORITY) +DECLARE_ASN1_FUNCTIONS(PROFESSION_INFO) +DECLARE_ASN1_FUNCTIONS(ADMISSIONS) +DECLARE_ASN1_FUNCTIONS(ADMISSION_SYNTAX) +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(PROFESSION_INFO, PROFESSION_INFO, PROFESSION_INFO) +#define sk_PROFESSION_INFO_num(sk) OPENSSL_sk_num(ossl_check_const_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_value(sk, idx) ((PROFESSION_INFO *)OPENSSL_sk_value(ossl_check_const_PROFESSION_INFO_sk_type(sk), (idx))) +#define sk_PROFESSION_INFO_new(cmp) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_new(ossl_check_PROFESSION_INFO_compfunc_type(cmp))) +#define sk_PROFESSION_INFO_new_null() ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_new_null()) +#define sk_PROFESSION_INFO_new_reserve(cmp, n) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_new_reserve(ossl_check_PROFESSION_INFO_compfunc_type(cmp), (n))) +#define sk_PROFESSION_INFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PROFESSION_INFO_sk_type(sk), (n)) +#define sk_PROFESSION_INFO_free(sk) OPENSSL_sk_free(ossl_check_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_zero(sk) OPENSSL_sk_zero(ossl_check_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_delete(sk, i) ((PROFESSION_INFO *)OPENSSL_sk_delete(ossl_check_PROFESSION_INFO_sk_type(sk), (i))) +#define sk_PROFESSION_INFO_delete_ptr(sk, ptr) ((PROFESSION_INFO *)OPENSSL_sk_delete_ptr(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr))) +#define sk_PROFESSION_INFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr)) +#define sk_PROFESSION_INFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr)) +#define sk_PROFESSION_INFO_pop(sk) ((PROFESSION_INFO *)OPENSSL_sk_pop(ossl_check_PROFESSION_INFO_sk_type(sk))) +#define sk_PROFESSION_INFO_shift(sk) ((PROFESSION_INFO *)OPENSSL_sk_shift(ossl_check_PROFESSION_INFO_sk_type(sk))) +#define sk_PROFESSION_INFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PROFESSION_INFO_sk_type(sk),ossl_check_PROFESSION_INFO_freefunc_type(freefunc)) +#define sk_PROFESSION_INFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr), (idx)) +#define sk_PROFESSION_INFO_set(sk, idx, ptr) ((PROFESSION_INFO *)OPENSSL_sk_set(ossl_check_PROFESSION_INFO_sk_type(sk), (idx), ossl_check_PROFESSION_INFO_type(ptr))) +#define sk_PROFESSION_INFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr)) +#define sk_PROFESSION_INFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr)) +#define sk_PROFESSION_INFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr), pnum) +#define sk_PROFESSION_INFO_sort(sk) OPENSSL_sk_sort(ossl_check_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_dup(sk) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_dup(ossl_check_const_PROFESSION_INFO_sk_type(sk))) +#define sk_PROFESSION_INFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_deep_copy(ossl_check_const_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_copyfunc_type(copyfunc), ossl_check_PROFESSION_INFO_freefunc_type(freefunc))) +#define sk_PROFESSION_INFO_set_cmp_func(sk, cmp) ((sk_PROFESSION_INFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(ADMISSIONS, ADMISSIONS, ADMISSIONS) +#define sk_ADMISSIONS_num(sk) OPENSSL_sk_num(ossl_check_const_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_value(sk, idx) ((ADMISSIONS *)OPENSSL_sk_value(ossl_check_const_ADMISSIONS_sk_type(sk), (idx))) +#define sk_ADMISSIONS_new(cmp) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_new(ossl_check_ADMISSIONS_compfunc_type(cmp))) +#define sk_ADMISSIONS_new_null() ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_new_null()) +#define sk_ADMISSIONS_new_reserve(cmp, n) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_new_reserve(ossl_check_ADMISSIONS_compfunc_type(cmp), (n))) +#define sk_ADMISSIONS_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ADMISSIONS_sk_type(sk), (n)) +#define sk_ADMISSIONS_free(sk) OPENSSL_sk_free(ossl_check_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_zero(sk) OPENSSL_sk_zero(ossl_check_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_delete(sk, i) ((ADMISSIONS *)OPENSSL_sk_delete(ossl_check_ADMISSIONS_sk_type(sk), (i))) +#define sk_ADMISSIONS_delete_ptr(sk, ptr) ((ADMISSIONS *)OPENSSL_sk_delete_ptr(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr))) +#define sk_ADMISSIONS_push(sk, ptr) OPENSSL_sk_push(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr)) +#define sk_ADMISSIONS_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr)) +#define sk_ADMISSIONS_pop(sk) ((ADMISSIONS *)OPENSSL_sk_pop(ossl_check_ADMISSIONS_sk_type(sk))) +#define sk_ADMISSIONS_shift(sk) ((ADMISSIONS *)OPENSSL_sk_shift(ossl_check_ADMISSIONS_sk_type(sk))) +#define sk_ADMISSIONS_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ADMISSIONS_sk_type(sk),ossl_check_ADMISSIONS_freefunc_type(freefunc)) +#define sk_ADMISSIONS_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr), (idx)) +#define sk_ADMISSIONS_set(sk, idx, ptr) ((ADMISSIONS *)OPENSSL_sk_set(ossl_check_ADMISSIONS_sk_type(sk), (idx), ossl_check_ADMISSIONS_type(ptr))) +#define sk_ADMISSIONS_find(sk, ptr) OPENSSL_sk_find(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr)) +#define sk_ADMISSIONS_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr)) +#define sk_ADMISSIONS_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr), pnum) +#define sk_ADMISSIONS_sort(sk) OPENSSL_sk_sort(ossl_check_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_dup(sk) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_dup(ossl_check_const_ADMISSIONS_sk_type(sk))) +#define sk_ADMISSIONS_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_deep_copy(ossl_check_const_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_copyfunc_type(copyfunc), ossl_check_ADMISSIONS_freefunc_type(freefunc))) +#define sk_ADMISSIONS_set_cmp_func(sk, cmp) ((sk_ADMISSIONS_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_compfunc_type(cmp))) + +/* clang-format on */ +typedef STACK_OF(PROFESSION_INFO) PROFESSION_INFOS; + +const ASN1_OBJECT *NAMING_AUTHORITY_get0_authorityId( + const NAMING_AUTHORITY *n); +const ASN1_IA5STRING *NAMING_AUTHORITY_get0_authorityURL( + const NAMING_AUTHORITY *n); +const ASN1_STRING *NAMING_AUTHORITY_get0_authorityText( + const NAMING_AUTHORITY *n); +void NAMING_AUTHORITY_set0_authorityId(NAMING_AUTHORITY *n, + ASN1_OBJECT *namingAuthorityId); +void NAMING_AUTHORITY_set0_authorityURL(NAMING_AUTHORITY *n, + ASN1_IA5STRING *namingAuthorityUrl); +void NAMING_AUTHORITY_set0_authorityText(NAMING_AUTHORITY *n, + ASN1_STRING *namingAuthorityText); + +const GENERAL_NAME *ADMISSION_SYNTAX_get0_admissionAuthority( + const ADMISSION_SYNTAX *as); +void ADMISSION_SYNTAX_set0_admissionAuthority( + ADMISSION_SYNTAX *as, GENERAL_NAME *aa); +const STACK_OF(ADMISSIONS) *ADMISSION_SYNTAX_get0_contentsOfAdmissions( + const ADMISSION_SYNTAX *as); +void ADMISSION_SYNTAX_set0_contentsOfAdmissions( + ADMISSION_SYNTAX *as, STACK_OF(ADMISSIONS) *a); +const GENERAL_NAME *ADMISSIONS_get0_admissionAuthority(const ADMISSIONS *a); +void ADMISSIONS_set0_admissionAuthority(ADMISSIONS *a, GENERAL_NAME *aa); +const NAMING_AUTHORITY *ADMISSIONS_get0_namingAuthority(const ADMISSIONS *a); +void ADMISSIONS_set0_namingAuthority(ADMISSIONS *a, NAMING_AUTHORITY *na); +const PROFESSION_INFOS *ADMISSIONS_get0_professionInfos(const ADMISSIONS *a); +void ADMISSIONS_set0_professionInfos(ADMISSIONS *a, PROFESSION_INFOS *pi); +const ASN1_OCTET_STRING *PROFESSION_INFO_get0_addProfessionInfo( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_addProfessionInfo( + PROFESSION_INFO *pi, ASN1_OCTET_STRING *aos); +const NAMING_AUTHORITY *PROFESSION_INFO_get0_namingAuthority( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_namingAuthority( + PROFESSION_INFO *pi, NAMING_AUTHORITY *na); +const STACK_OF(ASN1_STRING) *PROFESSION_INFO_get0_professionItems( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_professionItems( + PROFESSION_INFO *pi, STACK_OF(ASN1_STRING) *as); +const STACK_OF(ASN1_OBJECT) *PROFESSION_INFO_get0_professionOIDs( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_professionOIDs( + PROFESSION_INFO *pi, STACK_OF(ASN1_OBJECT) *po); +const ASN1_PRINTABLESTRING *PROFESSION_INFO_get0_registrationNumber( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_registrationNumber( + PROFESSION_INFO *pi, ASN1_PRINTABLESTRING *rn); + +int OSSL_GENERAL_NAMES_print(BIO *out, GENERAL_NAMES *gens, int indent); + +typedef STACK_OF(X509_ATTRIBUTE) OSSL_ATTRIBUTES_SYNTAX; +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTES_SYNTAX) + +typedef STACK_OF(USERNOTICE) OSSL_USER_NOTICE_SYNTAX; +DECLARE_ASN1_FUNCTIONS(OSSL_USER_NOTICE_SYNTAX) + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(USERNOTICE, USERNOTICE, USERNOTICE) +#define sk_USERNOTICE_num(sk) OPENSSL_sk_num(ossl_check_const_USERNOTICE_sk_type(sk)) +#define sk_USERNOTICE_value(sk, idx) ((USERNOTICE *)OPENSSL_sk_value(ossl_check_const_USERNOTICE_sk_type(sk), (idx))) +#define sk_USERNOTICE_new(cmp) ((STACK_OF(USERNOTICE) *)OPENSSL_sk_new(ossl_check_USERNOTICE_compfunc_type(cmp))) +#define sk_USERNOTICE_new_null() ((STACK_OF(USERNOTICE) *)OPENSSL_sk_new_null()) +#define sk_USERNOTICE_new_reserve(cmp, n) ((STACK_OF(USERNOTICE) *)OPENSSL_sk_new_reserve(ossl_check_USERNOTICE_compfunc_type(cmp), (n))) +#define sk_USERNOTICE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_USERNOTICE_sk_type(sk), (n)) +#define sk_USERNOTICE_free(sk) OPENSSL_sk_free(ossl_check_USERNOTICE_sk_type(sk)) +#define sk_USERNOTICE_zero(sk) OPENSSL_sk_zero(ossl_check_USERNOTICE_sk_type(sk)) +#define sk_USERNOTICE_delete(sk, i) ((USERNOTICE *)OPENSSL_sk_delete(ossl_check_USERNOTICE_sk_type(sk), (i))) +#define sk_USERNOTICE_delete_ptr(sk, ptr) ((USERNOTICE *)OPENSSL_sk_delete_ptr(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_type(ptr))) +#define sk_USERNOTICE_push(sk, ptr) OPENSSL_sk_push(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_type(ptr)) +#define sk_USERNOTICE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_type(ptr)) +#define sk_USERNOTICE_pop(sk) ((USERNOTICE *)OPENSSL_sk_pop(ossl_check_USERNOTICE_sk_type(sk))) +#define sk_USERNOTICE_shift(sk) ((USERNOTICE *)OPENSSL_sk_shift(ossl_check_USERNOTICE_sk_type(sk))) +#define sk_USERNOTICE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_USERNOTICE_sk_type(sk),ossl_check_USERNOTICE_freefunc_type(freefunc)) +#define sk_USERNOTICE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_type(ptr), (idx)) +#define sk_USERNOTICE_set(sk, idx, ptr) ((USERNOTICE *)OPENSSL_sk_set(ossl_check_USERNOTICE_sk_type(sk), (idx), ossl_check_USERNOTICE_type(ptr))) +#define sk_USERNOTICE_find(sk, ptr) OPENSSL_sk_find(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_type(ptr)) +#define sk_USERNOTICE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_type(ptr)) +#define sk_USERNOTICE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_type(ptr), pnum) +#define sk_USERNOTICE_sort(sk) OPENSSL_sk_sort(ossl_check_USERNOTICE_sk_type(sk)) +#define sk_USERNOTICE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_USERNOTICE_sk_type(sk)) +#define sk_USERNOTICE_dup(sk) ((STACK_OF(USERNOTICE) *)OPENSSL_sk_dup(ossl_check_const_USERNOTICE_sk_type(sk))) +#define sk_USERNOTICE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(USERNOTICE) *)OPENSSL_sk_deep_copy(ossl_check_const_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_copyfunc_type(copyfunc), ossl_check_USERNOTICE_freefunc_type(freefunc))) +#define sk_USERNOTICE_set_cmp_func(sk, cmp) ((sk_USERNOTICE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct OSSL_ROLE_SPEC_CERT_ID_st { + GENERAL_NAME *roleName; + GENERAL_NAME *roleCertIssuer; + ASN1_INTEGER *roleCertSerialNumber; + GENERAL_NAMES *roleCertLocator; +} OSSL_ROLE_SPEC_CERT_ID; + +DECLARE_ASN1_FUNCTIONS(OSSL_ROLE_SPEC_CERT_ID) + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ROLE_SPEC_CERT_ID, OSSL_ROLE_SPEC_CERT_ID, OSSL_ROLE_SPEC_CERT_ID) +#define sk_OSSL_ROLE_SPEC_CERT_ID_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_value(sk, idx) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_value(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (idx))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_new(cmp) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_new(ossl_check_OSSL_ROLE_SPEC_CERT_ID_compfunc_type(cmp))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_new_null() ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ROLE_SPEC_CERT_ID_new_reserve(cmp, n) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ROLE_SPEC_CERT_ID_compfunc_type(cmp), (n))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (n)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_delete(sk, i) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_delete(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (i))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_delete_ptr(sk, ptr) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_pop(sk) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_pop(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_shift(sk) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_shift(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk),ossl_check_OSSL_ROLE_SPEC_CERT_ID_freefunc_type(freefunc)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr), (idx)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_set(sk, idx, ptr) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_set(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (idx), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr), pnum) +#define sk_OSSL_ROLE_SPEC_CERT_ID_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_dup(sk) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_copyfunc_type(copyfunc), ossl_check_OSSL_ROLE_SPEC_CERT_ID_freefunc_type(freefunc))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_set_cmp_func(sk, cmp) ((sk_OSSL_ROLE_SPEC_CERT_ID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(OSSL_ROLE_SPEC_CERT_ID) OSSL_ROLE_SPEC_CERT_ID_SYNTAX; + +DECLARE_ASN1_FUNCTIONS(OSSL_ROLE_SPEC_CERT_ID_SYNTAX) +typedef struct OSSL_HASH_st { + X509_ALGOR *algorithmIdentifier; + ASN1_BIT_STRING *hashValue; +} OSSL_HASH; + +typedef struct OSSL_INFO_SYNTAX_POINTER_st { + GENERAL_NAMES *name; + OSSL_HASH *hash; +} OSSL_INFO_SYNTAX_POINTER; + +#define OSSL_INFO_SYNTAX_TYPE_CONTENT 0 +#define OSSL_INFO_SYNTAX_TYPE_POINTER 1 + +typedef struct OSSL_INFO_SYNTAX_st { + int type; + union { + ASN1_STRING *content; + OSSL_INFO_SYNTAX_POINTER *pointer; + } choice; +} OSSL_INFO_SYNTAX; + +typedef struct OSSL_PRIVILEGE_POLICY_ID_st { + ASN1_OBJECT *privilegePolicy; + OSSL_INFO_SYNTAX *privPolSyntax; +} OSSL_PRIVILEGE_POLICY_ID; + +typedef struct OSSL_ATTRIBUTE_DESCRIPTOR_st { + ASN1_OBJECT *identifier; + ASN1_STRING *attributeSyntax; + ASN1_UTF8STRING *name; + ASN1_UTF8STRING *description; + OSSL_PRIVILEGE_POLICY_ID *dominationRule; +} OSSL_ATTRIBUTE_DESCRIPTOR; + +DECLARE_ASN1_FUNCTIONS(OSSL_HASH) +DECLARE_ASN1_FUNCTIONS(OSSL_INFO_SYNTAX) +DECLARE_ASN1_FUNCTIONS(OSSL_INFO_SYNTAX_POINTER) +DECLARE_ASN1_FUNCTIONS(OSSL_PRIVILEGE_POLICY_ID) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_DESCRIPTOR) + +typedef struct OSSL_TIME_SPEC_ABSOLUTE_st { + ASN1_GENERALIZEDTIME *startTime; + ASN1_GENERALIZEDTIME *endTime; +} OSSL_TIME_SPEC_ABSOLUTE; + +typedef struct OSSL_DAY_TIME_st { + ASN1_INTEGER *hour; + ASN1_INTEGER *minute; + ASN1_INTEGER *second; +} OSSL_DAY_TIME; + +typedef struct OSSL_DAY_TIME_BAND_st { + OSSL_DAY_TIME *startDayTime; + OSSL_DAY_TIME *endDayTime; +} OSSL_DAY_TIME_BAND; + +#define OSSL_NAMED_DAY_TYPE_INT 0 +#define OSSL_NAMED_DAY_TYPE_BIT 1 +#define OSSL_NAMED_DAY_INT_SUN 1 +#define OSSL_NAMED_DAY_INT_MON 2 +#define OSSL_NAMED_DAY_INT_TUE 3 +#define OSSL_NAMED_DAY_INT_WED 4 +#define OSSL_NAMED_DAY_INT_THU 5 +#define OSSL_NAMED_DAY_INT_FRI 6 +#define OSSL_NAMED_DAY_INT_SAT 7 +#define OSSL_NAMED_DAY_BIT_SUN 0 +#define OSSL_NAMED_DAY_BIT_MON 1 +#define OSSL_NAMED_DAY_BIT_TUE 2 +#define OSSL_NAMED_DAY_BIT_WED 3 +#define OSSL_NAMED_DAY_BIT_THU 4 +#define OSSL_NAMED_DAY_BIT_FRI 5 +#define OSSL_NAMED_DAY_BIT_SAT 6 + +typedef struct OSSL_NAMED_DAY_st { + int type; + union { + ASN1_INTEGER *intNamedDays; + ASN1_BIT_STRING *bitNamedDays; + } choice; +} OSSL_NAMED_DAY; + +#define OSSL_TIME_SPEC_X_DAY_OF_FIRST 0 +#define OSSL_TIME_SPEC_X_DAY_OF_SECOND 1 +#define OSSL_TIME_SPEC_X_DAY_OF_THIRD 2 +#define OSSL_TIME_SPEC_X_DAY_OF_FOURTH 3 +#define OSSL_TIME_SPEC_X_DAY_OF_FIFTH 4 + +typedef struct OSSL_TIME_SPEC_X_DAY_OF_st { + int type; + union { + OSSL_NAMED_DAY *first; + OSSL_NAMED_DAY *second; + OSSL_NAMED_DAY *third; + OSSL_NAMED_DAY *fourth; + OSSL_NAMED_DAY *fifth; + } choice; +} OSSL_TIME_SPEC_X_DAY_OF; + +#define OSSL_TIME_SPEC_DAY_TYPE_INT 0 +#define OSSL_TIME_SPEC_DAY_TYPE_BIT 1 +#define OSSL_TIME_SPEC_DAY_TYPE_DAY_OF 2 +#define OSSL_TIME_SPEC_DAY_BIT_SUN 0 +#define OSSL_TIME_SPEC_DAY_BIT_MON 1 +#define OSSL_TIME_SPEC_DAY_BIT_TUE 2 +#define OSSL_TIME_SPEC_DAY_BIT_WED 3 +#define OSSL_TIME_SPEC_DAY_BIT_THU 4 +#define OSSL_TIME_SPEC_DAY_BIT_FRI 5 +#define OSSL_TIME_SPEC_DAY_BIT_SAT 6 +#define OSSL_TIME_SPEC_DAY_INT_SUN 1 +#define OSSL_TIME_SPEC_DAY_INT_MON 2 +#define OSSL_TIME_SPEC_DAY_INT_TUE 3 +#define OSSL_TIME_SPEC_DAY_INT_WED 4 +#define OSSL_TIME_SPEC_DAY_INT_THU 5 +#define OSSL_TIME_SPEC_DAY_INT_FRI 6 +#define OSSL_TIME_SPEC_DAY_INT_SAT 7 + +typedef struct OSSL_TIME_SPEC_DAY_st { + int type; + union { + STACK_OF(ASN1_INTEGER) *intDay; + ASN1_BIT_STRING *bitDay; + OSSL_TIME_SPEC_X_DAY_OF *dayOf; + } choice; +} OSSL_TIME_SPEC_DAY; + +#define OSSL_TIME_SPEC_WEEKS_TYPE_ALL 0 +#define OSSL_TIME_SPEC_WEEKS_TYPE_INT 1 +#define OSSL_TIME_SPEC_WEEKS_TYPE_BIT 2 +#define OSSL_TIME_SPEC_BIT_WEEKS_1 0 +#define OSSL_TIME_SPEC_BIT_WEEKS_2 1 +#define OSSL_TIME_SPEC_BIT_WEEKS_3 2 +#define OSSL_TIME_SPEC_BIT_WEEKS_4 3 +#define OSSL_TIME_SPEC_BIT_WEEKS_5 4 + +typedef struct OSSL_TIME_SPEC_WEEKS_st { + int type; + union { + ASN1_NULL *allWeeks; + STACK_OF(ASN1_INTEGER) *intWeek; + ASN1_BIT_STRING *bitWeek; + } choice; +} OSSL_TIME_SPEC_WEEKS; + +#define OSSL_TIME_SPEC_MONTH_TYPE_ALL 0 +#define OSSL_TIME_SPEC_MONTH_TYPE_INT 1 +#define OSSL_TIME_SPEC_MONTH_TYPE_BIT 2 +#define OSSL_TIME_SPEC_INT_MONTH_JAN 1 +#define OSSL_TIME_SPEC_INT_MONTH_FEB 2 +#define OSSL_TIME_SPEC_INT_MONTH_MAR 3 +#define OSSL_TIME_SPEC_INT_MONTH_APR 4 +#define OSSL_TIME_SPEC_INT_MONTH_MAY 5 +#define OSSL_TIME_SPEC_INT_MONTH_JUN 6 +#define OSSL_TIME_SPEC_INT_MONTH_JUL 7 +#define OSSL_TIME_SPEC_INT_MONTH_AUG 8 +#define OSSL_TIME_SPEC_INT_MONTH_SEP 9 +#define OSSL_TIME_SPEC_INT_MONTH_OCT 10 +#define OSSL_TIME_SPEC_INT_MONTH_NOV 11 +#define OSSL_TIME_SPEC_INT_MONTH_DEC 12 +#define OSSL_TIME_SPEC_BIT_MONTH_JAN 0 +#define OSSL_TIME_SPEC_BIT_MONTH_FEB 1 +#define OSSL_TIME_SPEC_BIT_MONTH_MAR 2 +#define OSSL_TIME_SPEC_BIT_MONTH_APR 3 +#define OSSL_TIME_SPEC_BIT_MONTH_MAY 4 +#define OSSL_TIME_SPEC_BIT_MONTH_JUN 5 +#define OSSL_TIME_SPEC_BIT_MONTH_JUL 6 +#define OSSL_TIME_SPEC_BIT_MONTH_AUG 7 +#define OSSL_TIME_SPEC_BIT_MONTH_SEP 8 +#define OSSL_TIME_SPEC_BIT_MONTH_OCT 9 +#define OSSL_TIME_SPEC_BIT_MONTH_NOV 10 +#define OSSL_TIME_SPEC_BIT_MONTH_DEC 11 + +typedef struct OSSL_TIME_SPEC_MONTH_st { + int type; + union { + ASN1_NULL *allMonths; + STACK_OF(ASN1_INTEGER) *intMonth; + ASN1_BIT_STRING *bitMonth; + } choice; +} OSSL_TIME_SPEC_MONTH; + +typedef struct OSSL_TIME_PERIOD_st { + STACK_OF(OSSL_DAY_TIME_BAND) *timesOfDay; + OSSL_TIME_SPEC_DAY *days; + OSSL_TIME_SPEC_WEEKS *weeks; + OSSL_TIME_SPEC_MONTH *months; + STACK_OF(ASN1_INTEGER) *years; +} OSSL_TIME_PERIOD; + +#define OSSL_TIME_SPEC_TIME_TYPE_ABSOLUTE 0 +#define OSSL_TIME_SPEC_TIME_TYPE_PERIODIC 1 + +typedef struct OSSL_TIME_SPEC_TIME_st { + int type; + union { + OSSL_TIME_SPEC_ABSOLUTE *absolute; + STACK_OF(OSSL_TIME_PERIOD) *periodic; + } choice; +} OSSL_TIME_SPEC_TIME; + +typedef struct OSSL_TIME_SPEC_st { + OSSL_TIME_SPEC_TIME *time; + ASN1_BOOLEAN notThisTime; + ASN1_INTEGER *timeZone; +} OSSL_TIME_SPEC; + +DECLARE_ASN1_FUNCTIONS(OSSL_DAY_TIME) +DECLARE_ASN1_FUNCTIONS(OSSL_DAY_TIME_BAND) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_DAY) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_WEEKS) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_MONTH) +DECLARE_ASN1_FUNCTIONS(OSSL_NAMED_DAY) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_X_DAY_OF) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_ABSOLUTE) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_TIME) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_PERIOD) + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_TIME_PERIOD, OSSL_TIME_PERIOD, OSSL_TIME_PERIOD) +#define sk_OSSL_TIME_PERIOD_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_value(sk, idx) ((OSSL_TIME_PERIOD *)OPENSSL_sk_value(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk), (idx))) +#define sk_OSSL_TIME_PERIOD_new(cmp) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_new(ossl_check_OSSL_TIME_PERIOD_compfunc_type(cmp))) +#define sk_OSSL_TIME_PERIOD_new_null() ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_new_null()) +#define sk_OSSL_TIME_PERIOD_new_reserve(cmp, n) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_TIME_PERIOD_compfunc_type(cmp), (n))) +#define sk_OSSL_TIME_PERIOD_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), (n)) +#define sk_OSSL_TIME_PERIOD_free(sk) OPENSSL_sk_free(ossl_check_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_delete(sk, i) ((OSSL_TIME_PERIOD *)OPENSSL_sk_delete(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), (i))) +#define sk_OSSL_TIME_PERIOD_delete_ptr(sk, ptr) ((OSSL_TIME_PERIOD *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr))) +#define sk_OSSL_TIME_PERIOD_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr)) +#define sk_OSSL_TIME_PERIOD_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr)) +#define sk_OSSL_TIME_PERIOD_pop(sk) ((OSSL_TIME_PERIOD *)OPENSSL_sk_pop(ossl_check_OSSL_TIME_PERIOD_sk_type(sk))) +#define sk_OSSL_TIME_PERIOD_shift(sk) ((OSSL_TIME_PERIOD *)OPENSSL_sk_shift(ossl_check_OSSL_TIME_PERIOD_sk_type(sk))) +#define sk_OSSL_TIME_PERIOD_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_TIME_PERIOD_sk_type(sk),ossl_check_OSSL_TIME_PERIOD_freefunc_type(freefunc)) +#define sk_OSSL_TIME_PERIOD_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr), (idx)) +#define sk_OSSL_TIME_PERIOD_set(sk, idx, ptr) ((OSSL_TIME_PERIOD *)OPENSSL_sk_set(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), (idx), ossl_check_OSSL_TIME_PERIOD_type(ptr))) +#define sk_OSSL_TIME_PERIOD_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr)) +#define sk_OSSL_TIME_PERIOD_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr)) +#define sk_OSSL_TIME_PERIOD_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr), pnum) +#define sk_OSSL_TIME_PERIOD_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_dup(sk) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_dup(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk))) +#define sk_OSSL_TIME_PERIOD_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_copyfunc_type(copyfunc), ossl_check_OSSL_TIME_PERIOD_freefunc_type(freefunc))) +#define sk_OSSL_TIME_PERIOD_set_cmp_func(sk, cmp) ((sk_OSSL_TIME_PERIOD_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_compfunc_type(cmp))) + +/* clang-format on */ + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_DAY_TIME_BAND, OSSL_DAY_TIME_BAND, OSSL_DAY_TIME_BAND) +#define sk_OSSL_DAY_TIME_BAND_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_value(sk, idx) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_value(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk), (idx))) +#define sk_OSSL_DAY_TIME_BAND_new(cmp) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_new(ossl_check_OSSL_DAY_TIME_BAND_compfunc_type(cmp))) +#define sk_OSSL_DAY_TIME_BAND_new_null() ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_new_null()) +#define sk_OSSL_DAY_TIME_BAND_new_reserve(cmp, n) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_DAY_TIME_BAND_compfunc_type(cmp), (n))) +#define sk_OSSL_DAY_TIME_BAND_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), (n)) +#define sk_OSSL_DAY_TIME_BAND_free(sk) OPENSSL_sk_free(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_delete(sk, i) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_delete(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), (i))) +#define sk_OSSL_DAY_TIME_BAND_delete_ptr(sk, ptr) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr))) +#define sk_OSSL_DAY_TIME_BAND_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr)) +#define sk_OSSL_DAY_TIME_BAND_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr)) +#define sk_OSSL_DAY_TIME_BAND_pop(sk) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_pop(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk))) +#define sk_OSSL_DAY_TIME_BAND_shift(sk) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_shift(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk))) +#define sk_OSSL_DAY_TIME_BAND_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk),ossl_check_OSSL_DAY_TIME_BAND_freefunc_type(freefunc)) +#define sk_OSSL_DAY_TIME_BAND_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr), (idx)) +#define sk_OSSL_DAY_TIME_BAND_set(sk, idx, ptr) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_set(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), (idx), ossl_check_OSSL_DAY_TIME_BAND_type(ptr))) +#define sk_OSSL_DAY_TIME_BAND_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr)) +#define sk_OSSL_DAY_TIME_BAND_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr)) +#define sk_OSSL_DAY_TIME_BAND_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr), pnum) +#define sk_OSSL_DAY_TIME_BAND_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_dup(sk) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_dup(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk))) +#define sk_OSSL_DAY_TIME_BAND_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_copyfunc_type(copyfunc), ossl_check_OSSL_DAY_TIME_BAND_freefunc_type(freefunc))) +#define sk_OSSL_DAY_TIME_BAND_set_cmp_func(sk, cmp) ((sk_OSSL_DAY_TIME_BAND_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_compfunc_type(cmp))) + +/* clang-format on */ + +/* Attribute Type and Value */ +typedef struct atav_st { + ASN1_OBJECT *type; + ASN1_TYPE *value; +} OSSL_ATAV; + +typedef struct ATTRIBUTE_TYPE_MAPPING_st { + ASN1_OBJECT *local; + ASN1_OBJECT *remote; +} OSSL_ATTRIBUTE_TYPE_MAPPING; + +typedef struct ATTRIBUTE_VALUE_MAPPING_st { + OSSL_ATAV *local; + OSSL_ATAV *remote; +} OSSL_ATTRIBUTE_VALUE_MAPPING; + +#define OSSL_ATTR_MAP_TYPE 0 +#define OSSL_ATTR_MAP_VALUE 1 + +typedef struct ATTRIBUTE_MAPPING_st { + int type; + union { + OSSL_ATTRIBUTE_TYPE_MAPPING *typeMappings; + OSSL_ATTRIBUTE_VALUE_MAPPING *typeValueMappings; + } choice; +} OSSL_ATTRIBUTE_MAPPING; + +typedef STACK_OF(OSSL_ATTRIBUTE_MAPPING) OSSL_ATTRIBUTE_MAPPINGS; +DECLARE_ASN1_FUNCTIONS(OSSL_ATAV) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_TYPE_MAPPING) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_VALUE_MAPPING) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_MAPPING) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_MAPPINGS) + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ATTRIBUTE_MAPPING, OSSL_ATTRIBUTE_MAPPING, OSSL_ATTRIBUTE_MAPPING) +#define sk_OSSL_ATTRIBUTE_MAPPING_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_value(sk, idx) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_value(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (idx))) +#define sk_OSSL_ATTRIBUTE_MAPPING_new(cmp) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_new(ossl_check_OSSL_ATTRIBUTE_MAPPING_compfunc_type(cmp))) +#define sk_OSSL_ATTRIBUTE_MAPPING_new_null() ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ATTRIBUTE_MAPPING_new_reserve(cmp, n) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ATTRIBUTE_MAPPING_compfunc_type(cmp), (n))) +#define sk_OSSL_ATTRIBUTE_MAPPING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (n)) +#define sk_OSSL_ATTRIBUTE_MAPPING_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_delete(sk, i) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_delete(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (i))) +#define sk_OSSL_ATTRIBUTE_MAPPING_delete_ptr(sk, ptr) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr))) +#define sk_OSSL_ATTRIBUTE_MAPPING_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr)) +#define sk_OSSL_ATTRIBUTE_MAPPING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr)) +#define sk_OSSL_ATTRIBUTE_MAPPING_pop(sk) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_pop(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk))) +#define sk_OSSL_ATTRIBUTE_MAPPING_shift(sk) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_shift(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk))) +#define sk_OSSL_ATTRIBUTE_MAPPING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk),ossl_check_OSSL_ATTRIBUTE_MAPPING_freefunc_type(freefunc)) +#define sk_OSSL_ATTRIBUTE_MAPPING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr), (idx)) +#define sk_OSSL_ATTRIBUTE_MAPPING_set(sk, idx, ptr) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_set(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (idx), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr))) +#define sk_OSSL_ATTRIBUTE_MAPPING_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr)) +#define sk_OSSL_ATTRIBUTE_MAPPING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr)) +#define sk_OSSL_ATTRIBUTE_MAPPING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr), pnum) +#define sk_OSSL_ATTRIBUTE_MAPPING_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_dup(sk) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk))) +#define sk_OSSL_ATTRIBUTE_MAPPING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_copyfunc_type(copyfunc), ossl_check_OSSL_ATTRIBUTE_MAPPING_freefunc_type(freefunc))) +#define sk_OSSL_ATTRIBUTE_MAPPING_set_cmp_func(sk, cmp) ((sk_OSSL_ATTRIBUTE_MAPPING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_compfunc_type(cmp))) + +/* clang-format on */ + +#define OSSL_AAA_ATTRIBUTE_TYPE 0 +#define OSSL_AAA_ATTRIBUTE_VALUES 1 + +typedef struct ALLOWED_ATTRIBUTES_CHOICE_st { + int type; + union { + ASN1_OBJECT *attributeType; + X509_ATTRIBUTE *attributeTypeandValues; + } choice; +} OSSL_ALLOWED_ATTRIBUTES_CHOICE; + +typedef struct ALLOWED_ATTRIBUTES_ITEM_st { + STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *attributes; + GENERAL_NAME *holderDomain; +} OSSL_ALLOWED_ATTRIBUTES_ITEM; + +typedef STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) OSSL_ALLOWED_ATTRIBUTES_SYNTAX; + +DECLARE_ASN1_FUNCTIONS(OSSL_ALLOWED_ATTRIBUTES_CHOICE) +DECLARE_ASN1_FUNCTIONS(OSSL_ALLOWED_ATTRIBUTES_ITEM) +DECLARE_ASN1_FUNCTIONS(OSSL_ALLOWED_ATTRIBUTES_SYNTAX) + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ALLOWED_ATTRIBUTES_CHOICE, OSSL_ALLOWED_ATTRIBUTES_CHOICE, OSSL_ALLOWED_ATTRIBUTES_CHOICE) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_value(sk, idx) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_value(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (idx))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_new(cmp) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_new(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc_type(cmp))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_new_null() ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_new_reserve(cmp, n) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc_type(cmp), (n))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (n)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_delete(sk, i) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_delete(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (i))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_delete_ptr(sk, ptr) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_pop(sk) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_pop(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_shift(sk) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_shift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk),ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_freefunc_type(freefunc)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr), (idx)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_set(sk, idx, ptr) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_set(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (idx), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr), pnum) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_dup(sk) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_copyfunc_type(copyfunc), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_freefunc_type(freefunc))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_set_cmp_func(sk, cmp) ((sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc_type(cmp))) + +/* clang-format on */ + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ALLOWED_ATTRIBUTES_ITEM, OSSL_ALLOWED_ATTRIBUTES_ITEM, OSSL_ALLOWED_ATTRIBUTES_ITEM) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_value(sk, idx) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_value(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (idx))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_new(cmp) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_new(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc_type(cmp))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_new_null() ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_new_reserve(cmp, n) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc_type(cmp), (n))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (n)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_delete(sk, i) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_delete(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (i))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_delete_ptr(sk, ptr) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_pop(sk) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_pop(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_shift(sk) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_shift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk),ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_freefunc_type(freefunc)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr), (idx)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_set(sk, idx, ptr) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_set(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (idx), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr), pnum) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_dup(sk) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_copyfunc_type(copyfunc), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_freefunc_type(freefunc))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_set_cmp_func(sk, cmp) ((sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct AA_DIST_POINT_st { + DIST_POINT_NAME *distpoint; + ASN1_BIT_STRING *reasons; + int dp_reasons; + ASN1_BOOLEAN indirectCRL; + ASN1_BOOLEAN containsUserAttributeCerts; + ASN1_BOOLEAN containsAACerts; + ASN1_BOOLEAN containsSOAPublicKeyCerts; +} OSSL_AA_DIST_POINT; + +DECLARE_ASN1_FUNCTIONS(OSSL_AA_DIST_POINT) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/include/progs.h b/deps/openssl/config/archs/linux64-riscv64/asm/include/progs.h new file mode 100644 index 000000000000..2214340fa813 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/include/progs.h @@ -0,0 +1,125 @@ +/* + * WARNING: do not edit! + * Generated by apps/progs.pl + * + * Copyright 1995-2026 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "function.h" + +extern int asn1parse_main(int argc, char *argv[]); +extern int ca_main(int argc, char *argv[]); +extern int ciphers_main(int argc, char *argv[]); +extern int cmp_main(int argc, char *argv[]); +extern int cms_main(int argc, char *argv[]); +extern int crl_main(int argc, char *argv[]); +extern int crl2pkcs7_main(int argc, char *argv[]); +extern int dgst_main(int argc, char *argv[]); +extern int dhparam_main(int argc, char *argv[]); +extern int dsa_main(int argc, char *argv[]); +extern int dsaparam_main(int argc, char *argv[]); +extern int ec_main(int argc, char *argv[]); +extern int ecparam_main(int argc, char *argv[]); +extern int enc_main(int argc, char *argv[]); +extern int engine_main(int argc, char *argv[]); +extern int errstr_main(int argc, char *argv[]); +extern int fipsinstall_main(int argc, char *argv[]); +extern int gendsa_main(int argc, char *argv[]); +extern int genpkey_main(int argc, char *argv[]); +extern int genrsa_main(int argc, char *argv[]); +extern int help_main(int argc, char *argv[]); +extern int info_main(int argc, char *argv[]); +extern int kdf_main(int argc, char *argv[]); +extern int list_main(int argc, char *argv[]); +extern int mac_main(int argc, char *argv[]); +extern int nseq_main(int argc, char *argv[]); +extern int ocsp_main(int argc, char *argv[]); +extern int passwd_main(int argc, char *argv[]); +extern int pkcs12_main(int argc, char *argv[]); +extern int pkcs7_main(int argc, char *argv[]); +extern int pkcs8_main(int argc, char *argv[]); +extern int pkey_main(int argc, char *argv[]); +extern int pkeyparam_main(int argc, char *argv[]); +extern int pkeyutl_main(int argc, char *argv[]); +extern int prime_main(int argc, char *argv[]); +extern int rand_main(int argc, char *argv[]); +extern int rehash_main(int argc, char *argv[]); +extern int req_main(int argc, char *argv[]); +extern int rsa_main(int argc, char *argv[]); +extern int rsautl_main(int argc, char *argv[]); +extern int s_client_main(int argc, char *argv[]); +extern int s_server_main(int argc, char *argv[]); +extern int s_time_main(int argc, char *argv[]); +extern int sess_id_main(int argc, char *argv[]); +extern int skeyutl_main(int argc, char *argv[]); +extern int smime_main(int argc, char *argv[]); +extern int speed_main(int argc, char *argv[]); +extern int spkac_main(int argc, char *argv[]); +extern int srp_main(int argc, char *argv[]); +extern int storeutl_main(int argc, char *argv[]); +extern int ts_main(int argc, char *argv[]); +extern int verify_main(int argc, char *argv[]); +extern int version_main(int argc, char *argv[]); +extern int x509_main(int argc, char *argv[]); + +extern const OPTIONS asn1parse_options[]; +extern const OPTIONS ca_options[]; +extern const OPTIONS ciphers_options[]; +extern const OPTIONS cmp_options[]; +extern const OPTIONS cms_options[]; +extern const OPTIONS crl_options[]; +extern const OPTIONS crl2pkcs7_options[]; +extern const OPTIONS dgst_options[]; +extern const OPTIONS dhparam_options[]; +extern const OPTIONS dsa_options[]; +extern const OPTIONS dsaparam_options[]; +extern const OPTIONS ec_options[]; +extern const OPTIONS ecparam_options[]; +extern const OPTIONS enc_options[]; +extern const OPTIONS engine_options[]; +extern const OPTIONS errstr_options[]; +extern const OPTIONS fipsinstall_options[]; +extern const OPTIONS gendsa_options[]; +extern const OPTIONS genpkey_options[]; +extern const OPTIONS genrsa_options[]; +extern const OPTIONS help_options[]; +extern const OPTIONS info_options[]; +extern const OPTIONS kdf_options[]; +extern const OPTIONS list_options[]; +extern const OPTIONS mac_options[]; +extern const OPTIONS nseq_options[]; +extern const OPTIONS ocsp_options[]; +extern const OPTIONS passwd_options[]; +extern const OPTIONS pkcs12_options[]; +extern const OPTIONS pkcs7_options[]; +extern const OPTIONS pkcs8_options[]; +extern const OPTIONS pkey_options[]; +extern const OPTIONS pkeyparam_options[]; +extern const OPTIONS pkeyutl_options[]; +extern const OPTIONS prime_options[]; +extern const OPTIONS rand_options[]; +extern const OPTIONS rehash_options[]; +extern const OPTIONS req_options[]; +extern const OPTIONS rsa_options[]; +extern const OPTIONS rsautl_options[]; +extern const OPTIONS s_client_options[]; +extern const OPTIONS s_server_options[]; +extern const OPTIONS s_time_options[]; +extern const OPTIONS sess_id_options[]; +extern const OPTIONS skeyutl_options[]; +extern const OPTIONS smime_options[]; +extern const OPTIONS speed_options[]; +extern const OPTIONS spkac_options[]; +extern const OPTIONS srp_options[]; +extern const OPTIONS storeutl_options[]; +extern const OPTIONS ts_options[]; +extern const OPTIONS verify_options[]; +extern const OPTIONS version_options[]; +extern const OPTIONS x509_options[]; + +extern FUNCTION functions[]; diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/openssl-cl.gypi b/deps/openssl/config/archs/linux64-riscv64/asm/openssl-cl.gypi new file mode 100644 index 000000000000..fce000ec02a5 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/openssl-cl.gypi @@ -0,0 +1,116 @@ +{ + 'variables': { + 'openssl_defines_linux64-riscv64': [ + 'NDEBUG', + 'OPENSSL_USE_NODELETE', + 'OPENSSL_BUILDING_OPENSSL', + 'BROTLI', + 'ZLIB', + 'ZSTD', + 'AES_ASM', + 'GHASH_ASM', + 'INCLUDE_C_CHACHA20', + 'INCLUDE_C_SHA256', + 'INCLUDE_C_SHA512', + 'OPENSSL_CPUID_OBJ', + 'OPENSSL_SM3_ASM', + 'SHA256_ASM', + 'SHA512_ASM', + 'SM4_ASM', + 'OPENSSL_PIC', + ], + 'openssl_cflags_linux64-riscv64': [ + '-Wa,--noexecstack', + '-Wall -O3', + '-pthread', + '-Wall -O3', + ], + 'openssl_ex_libs_linux64-riscv64': [ + '-lm -ldl -pthread', + ], + 'openssl_cli_srcs_linux64-riscv64': [ + 'openssl/apps/lib/cmp_mock_srv.c', + 'openssl/apps/asn1parse.c', + 'openssl/apps/ca.c', + 'openssl/apps/ciphers.c', + 'openssl/apps/cmp.c', + 'openssl/apps/cms.c', + 'openssl/apps/crl.c', + 'openssl/apps/crl2pkcs7.c', + 'openssl/apps/dgst.c', + 'openssl/apps/dhparam.c', + 'openssl/apps/dsa.c', + 'openssl/apps/dsaparam.c', + 'openssl/apps/ec.c', + 'openssl/apps/ecparam.c', + 'openssl/apps/enc.c', + 'openssl/apps/engine.c', + 'openssl/apps/errstr.c', + 'openssl/apps/fipsinstall.c', + 'openssl/apps/gendsa.c', + 'openssl/apps/genpkey.c', + 'openssl/apps/genrsa.c', + 'openssl/apps/info.c', + 'openssl/apps/kdf.c', + 'openssl/apps/list.c', + 'openssl/apps/mac.c', + 'openssl/apps/nseq.c', + 'openssl/apps/ocsp.c', + 'openssl/apps/openssl.c', + 'openssl/apps/passwd.c', + 'openssl/apps/pkcs12.c', + 'openssl/apps/pkcs7.c', + 'openssl/apps/pkcs8.c', + 'openssl/apps/pkey.c', + 'openssl/apps/pkeyparam.c', + 'openssl/apps/pkeyutl.c', + 'openssl/apps/prime.c', + './config/archs/linux64-riscv64/asm/apps/progs.c', + 'openssl/apps/rand.c', + 'openssl/apps/rehash.c', + 'openssl/apps/req.c', + 'openssl/apps/rsa.c', + 'openssl/apps/rsautl.c', + 'openssl/apps/s_client.c', + 'openssl/apps/s_server.c', + 'openssl/apps/s_time.c', + 'openssl/apps/sess_id.c', + 'openssl/apps/skeyutl.c', + 'openssl/apps/smime.c', + 'openssl/apps/speed.c', + 'openssl/apps/spkac.c', + 'openssl/apps/srp.c', + 'openssl/apps/storeutl.c', + 'openssl/apps/ts.c', + 'openssl/apps/verify.c', + 'openssl/apps/version.c', + 'openssl/apps/x509.c', + 'openssl/apps/lib/app_libctx.c', + 'openssl/apps/lib/app_params.c', + 'openssl/apps/lib/app_provider.c', + 'openssl/apps/lib/app_rand.c', + 'openssl/apps/lib/app_x509.c', + 'openssl/apps/lib/apps.c', + 'openssl/apps/lib/apps_opt_printf.c', + 'openssl/apps/lib/apps_ui.c', + 'openssl/apps/lib/columns.c', + 'openssl/apps/lib/engine.c', + 'openssl/apps/lib/engine_loader.c', + 'openssl/apps/lib/fmt.c', + 'openssl/apps/lib/http_server.c', + 'openssl/apps/lib/log.c', + 'openssl/apps/lib/names.c', + 'openssl/apps/lib/opt.c', + 'openssl/apps/lib/s_cb.c', + 'openssl/apps/lib/s_socket.c', + 'openssl/apps/lib/tlssrp_depr.c', + ], + }, + 'defines': ['<@(openssl_defines_linux64-riscv64)'], + 'include_dirs': [ + './include', + ], + 'cflags' : ['<@(openssl_cflags_linux64-riscv64)'], + 'libraries': ['<@(openssl_ex_libs_linux64-riscv64)'], + 'sources': ['<@(openssl_cli_srcs_linux64-riscv64)'], +} diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/openssl-fips.gypi b/deps/openssl/config/archs/linux64-riscv64/asm/openssl-fips.gypi new file mode 100644 index 000000000000..b519976463aa --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/openssl-fips.gypi @@ -0,0 +1,393 @@ +{ + 'variables': { + 'openssl_sources': [ + 'openssl/crypto/aes/aes_cbc.c', + 'openssl/crypto/aes/aes_ecb.c', + 'openssl/crypto/aes/aes_misc.c', + 'openssl/crypto/bn/bn_add.c', + 'openssl/crypto/bn/bn_asm.c', + 'openssl/crypto/bn/bn_blind.c', + 'openssl/crypto/bn/bn_const.c', + 'openssl/crypto/bn/bn_conv.c', + 'openssl/crypto/bn/bn_ctx.c', + 'openssl/crypto/bn/bn_dh.c', + 'openssl/crypto/bn/bn_div.c', + 'openssl/crypto/bn/bn_exp.c', + 'openssl/crypto/bn/bn_exp2.c', + 'openssl/crypto/bn/bn_gcd.c', + 'openssl/crypto/bn/bn_gf2m.c', + 'openssl/crypto/bn/bn_intern.c', + 'openssl/crypto/bn/bn_kron.c', + 'openssl/crypto/bn/bn_lib.c', + 'openssl/crypto/bn/bn_mod.c', + 'openssl/crypto/bn/bn_mont.c', + 'openssl/crypto/bn/bn_mpi.c', + 'openssl/crypto/bn/bn_mul.c', + 'openssl/crypto/bn/bn_nist.c', + 'openssl/crypto/bn/bn_prime.c', + 'openssl/crypto/bn/bn_rand.c', + 'openssl/crypto/bn/bn_recp.c', + 'openssl/crypto/bn/bn_rsa_fips186_4.c', + 'openssl/crypto/bn/bn_shift.c', + 'openssl/crypto/bn/bn_sqr.c', + 'openssl/crypto/bn/bn_sqrt.c', + 'openssl/crypto/bn/bn_word.c', + 'openssl/crypto/buffer/buffer.c', + 'openssl/crypto/cmac/cmac.c', + 'openssl/crypto/des/des_enc.c', + 'openssl/crypto/des/ecb3_enc.c', + 'openssl/crypto/des/fcrypt_b.c', + 'openssl/crypto/des/set_key.c', + 'openssl/crypto/dh/dh_backend.c', + 'openssl/crypto/dh/dh_check.c', + 'openssl/crypto/dh/dh_gen.c', + 'openssl/crypto/dh/dh_group_params.c', + 'openssl/crypto/dh/dh_kdf.c', + 'openssl/crypto/dh/dh_key.c', + 'openssl/crypto/dh/dh_lib.c', + 'openssl/crypto/dsa/dsa_backend.c', + 'openssl/crypto/dsa/dsa_check.c', + 'openssl/crypto/dsa/dsa_gen.c', + 'openssl/crypto/dsa/dsa_key.c', + 'openssl/crypto/dsa/dsa_lib.c', + 'openssl/crypto/dsa/dsa_ossl.c', + 'openssl/crypto/dsa/dsa_sign.c', + 'openssl/crypto/dsa/dsa_vrf.c', + 'openssl/crypto/ec/curve448/arch_32/f_impl32.c', + 'openssl/crypto/ec/curve448/arch_64/f_impl64.c', + 'openssl/crypto/ec/curve448/curve448.c', + 'openssl/crypto/ec/curve448/curve448_tables.c', + 'openssl/crypto/ec/curve448/eddsa.c', + 'openssl/crypto/ec/curve448/f_generic.c', + 'openssl/crypto/ec/curve448/scalar.c', + 'openssl/crypto/ec/curve25519.c', + 'openssl/crypto/ec/ec2_oct.c', + 'openssl/crypto/ec/ec2_smpl.c', + 'openssl/crypto/ec/ec_asn1.c', + 'openssl/crypto/ec/ec_backend.c', + 'openssl/crypto/ec/ec_check.c', + 'openssl/crypto/ec/ec_curve.c', + 'openssl/crypto/ec/ec_cvt.c', + 'openssl/crypto/ec/ec_key.c', + 'openssl/crypto/ec/ec_kmeth.c', + 'openssl/crypto/ec/ec_lib.c', + 'openssl/crypto/ec/ec_mult.c', + 'openssl/crypto/ec/ec_oct.c', + 'openssl/crypto/ec/ecdh_kdf.c', + 'openssl/crypto/ec/ecdh_ossl.c', + 'openssl/crypto/ec/ecdsa_ossl.c', + 'openssl/crypto/ec/ecdsa_sign.c', + 'openssl/crypto/ec/ecdsa_vrf.c', + 'openssl/crypto/ec/ecp_mont.c', + 'openssl/crypto/ec/ecp_nist.c', + 'openssl/crypto/ec/ecp_oct.c', + 'openssl/crypto/ec/ecp_smpl.c', + 'openssl/crypto/ec/ecx_backend.c', + 'openssl/crypto/ec/ecx_key.c', + 'openssl/crypto/evp/asymcipher.c', + 'openssl/crypto/evp/dh_support.c', + 'openssl/crypto/evp/digest.c', + 'openssl/crypto/evp/ec_support.c', + 'openssl/crypto/evp/evp_enc.c', + 'openssl/crypto/evp/evp_fetch.c', + 'openssl/crypto/evp/evp_lib.c', + 'openssl/crypto/evp/evp_rand.c', + 'openssl/crypto/evp/evp_utils.c', + 'openssl/crypto/evp/exchange.c', + 'openssl/crypto/evp/kdf_lib.c', + 'openssl/crypto/evp/kdf_meth.c', + 'openssl/crypto/evp/kem.c', + 'openssl/crypto/evp/keymgmt_lib.c', + 'openssl/crypto/evp/keymgmt_meth.c', + 'openssl/crypto/evp/mac_lib.c', + 'openssl/crypto/evp/mac_meth.c', + 'openssl/crypto/evp/p_lib.c', + 'openssl/crypto/evp/pmeth_check.c', + 'openssl/crypto/evp/pmeth_gn.c', + 'openssl/crypto/evp/pmeth_lib.c', + 'openssl/crypto/evp/s_lib.c', + 'openssl/crypto/evp/signature.c', + 'openssl/crypto/evp/skeymgmt_meth.c', + 'openssl/crypto/ffc/ffc_backend.c', + 'openssl/crypto/ffc/ffc_dh.c', + 'openssl/crypto/ffc/ffc_key_generate.c', + 'openssl/crypto/ffc/ffc_key_validate.c', + 'openssl/crypto/ffc/ffc_params.c', + 'openssl/crypto/ffc/ffc_params_generate.c', + 'openssl/crypto/ffc/ffc_params_validate.c', + 'openssl/crypto/hashtable/hashfunc.c', + 'openssl/crypto/hashtable/hashtable.c', + 'openssl/crypto/hmac/hmac.c', + 'openssl/crypto/lhash/lhash.c', + 'openssl/crypto/asn1_dsa.c', + 'openssl/crypto/bsearch.c', + 'openssl/crypto/context.c', + 'openssl/crypto/core_algorithm.c', + 'openssl/crypto/core_fetch.c', + 'openssl/crypto/core_namemap.c', + 'openssl/crypto/cpuid.c', + 'openssl/crypto/cryptlib.c', + 'openssl/crypto/ctype.c', + 'openssl/crypto/der_writer.c', + 'openssl/crypto/ex_data.c', + 'openssl/crypto/initthread.c', + 'openssl/crypto/o_str.c', + 'openssl/crypto/packet.c', + 'openssl/crypto/param_build.c', + 'openssl/crypto/param_build_set.c', + 'openssl/crypto/params.c', + 'openssl/crypto/params_dup.c', + 'openssl/crypto/params_from_text.c', + 'openssl/crypto/provider_core.c', + 'openssl/crypto/provider_predefined.c', + 'openssl/crypto/riscvcap.c', + 'openssl/crypto/self_test_core.c', + 'openssl/crypto/sparse_array.c', + 'openssl/crypto/threads_lib.c', + 'openssl/crypto/threads_none.c', + 'openssl/crypto/threads_pthread.c', + 'openssl/crypto/threads_win.c', + 'openssl/crypto/time.c', + 'openssl/crypto/ml_dsa/ml_dsa_encoders.c', + 'openssl/crypto/ml_dsa/ml_dsa_key.c', + 'openssl/crypto/ml_dsa/ml_dsa_key_compress.c', + 'openssl/crypto/ml_dsa/ml_dsa_matrix.c', + 'openssl/crypto/ml_dsa/ml_dsa_ntt.c', + 'openssl/crypto/ml_dsa/ml_dsa_params.c', + 'openssl/crypto/ml_dsa/ml_dsa_sample.c', + 'openssl/crypto/ml_dsa/ml_dsa_sign.c', + 'openssl/crypto/ml_kem/ml_kem.c', + 'openssl/crypto/modes/cbc128.c', + 'openssl/crypto/modes/ccm128.c', + 'openssl/crypto/modes/cfb128.c', + 'openssl/crypto/modes/ctr128.c', + 'openssl/crypto/modes/gcm128.c', + 'openssl/crypto/modes/ofb128.c', + 'openssl/crypto/modes/wrap128.c', + 'openssl/crypto/modes/xts128.c', + 'openssl/crypto/modes/xts128gb.c', + 'openssl/crypto/property/defn_cache.c', + 'openssl/crypto/property/property.c', + 'openssl/crypto/property/property_parse.c', + 'openssl/crypto/property/property_query.c', + 'openssl/crypto/property/property_string.c', + 'openssl/crypto/rand/rand_lib.c', + 'openssl/crypto/rsa/rsa_acvp_test_params.c', + 'openssl/crypto/rsa/rsa_backend.c', + 'openssl/crypto/rsa/rsa_chk.c', + 'openssl/crypto/rsa/rsa_crpt.c', + 'openssl/crypto/rsa/rsa_gen.c', + 'openssl/crypto/rsa/rsa_lib.c', + 'openssl/crypto/rsa/rsa_mp_names.c', + 'openssl/crypto/rsa/rsa_none.c', + 'openssl/crypto/rsa/rsa_oaep.c', + 'openssl/crypto/rsa/rsa_ossl.c', + 'openssl/crypto/rsa/rsa_pk1.c', + 'openssl/crypto/rsa/rsa_pss.c', + 'openssl/crypto/rsa/rsa_schemes.c', + 'openssl/crypto/rsa/rsa_sign.c', + 'openssl/crypto/rsa/rsa_sp800_56b_check.c', + 'openssl/crypto/rsa/rsa_sp800_56b_gen.c', + 'openssl/crypto/rsa/rsa_x931.c', + 'openssl/crypto/sha/keccak1600.c', + 'openssl/crypto/sha/sha1dgst.c', + 'openssl/crypto/sha/sha256.c', + 'openssl/crypto/sha/sha3.c', + 'openssl/crypto/sha/sha512.c', + 'openssl/crypto/sha/sha_riscv.c', + 'openssl/crypto/slh_dsa/slh_adrs.c', + 'openssl/crypto/slh_dsa/slh_dsa.c', + 'openssl/crypto/slh_dsa/slh_dsa_hash_ctx.c', + 'openssl/crypto/slh_dsa/slh_dsa_key.c', + 'openssl/crypto/slh_dsa/slh_fors.c', + 'openssl/crypto/slh_dsa/slh_hash.c', + 'openssl/crypto/slh_dsa/slh_hypertree.c', + 'openssl/crypto/slh_dsa/slh_params.c', + 'openssl/crypto/slh_dsa/slh_wots.c', + 'openssl/crypto/slh_dsa/slh_xmss.c', + 'openssl/crypto/stack/stack.c', + 'openssl/crypto/thread/arch/thread_none.c', + 'openssl/crypto/thread/arch/thread_posix.c', + 'openssl/crypto/thread/arch/thread_win.c', + 'openssl/crypto/thread/api.c', + 'openssl/crypto/thread/arch.c', + 'openssl/crypto/thread/internal.c', + 'openssl/providers/common/der/der_rsa_sig.c', + 'openssl/providers/common/bio_prov.c', + 'openssl/providers/common/capabilities.c', + 'openssl/providers/common/digest_to_nid.c', + 'openssl/providers/common/provider_seeding.c', + 'openssl/providers/common/provider_util.c', + 'openssl/providers/common/securitycheck.c', + 'openssl/providers/common/securitycheck_fips.c', + 'openssl/providers/fips/fipsindicator.c', + 'openssl/providers/fips/fipsprov.c', + 'openssl/providers/fips/self_test.c', + 'openssl/providers/fips/self_test_kats.c', + 'openssl/providers/implementations/asymciphers/rsa_enc.c', + 'openssl/providers/implementations/ciphers/cipher_aes.c', + 'openssl/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha.c', + 'openssl/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha1_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha256_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ccm.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ccm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_gcm.c', + 'openssl/providers/implementations/ciphers/cipher_aes_gcm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ocb.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ocb_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_wrp.c', + 'openssl/providers/implementations/ciphers/cipher_aes_xts.c', + 'openssl/providers/implementations/ciphers/cipher_aes_xts_fips.c', + 'openssl/providers/implementations/ciphers/cipher_aes_xts_hw.c', + 'openssl/providers/implementations/ciphers/cipher_cts.c', + 'openssl/providers/implementations/ciphers/cipher_tdes.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_common.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_hw.c', + 'openssl/providers/implementations/digests/sha2_prov.c', + 'openssl/providers/implementations/digests/sha3_prov.c', + 'openssl/providers/implementations/exchange/dh_exch.c', + 'openssl/providers/implementations/exchange/ecdh_exch.c', + 'openssl/providers/implementations/exchange/ecx_exch.c', + 'openssl/providers/implementations/exchange/kdf_exch.c', + 'openssl/providers/implementations/kdfs/hkdf.c', + 'openssl/providers/implementations/kdfs/kbkdf.c', + 'openssl/providers/implementations/kdfs/pbkdf2.c', + 'openssl/providers/implementations/kdfs/pbkdf2_fips.c', + 'openssl/providers/implementations/kdfs/sshkdf.c', + 'openssl/providers/implementations/kdfs/sskdf.c', + 'openssl/providers/implementations/kdfs/tls1_prf.c', + 'openssl/providers/implementations/kdfs/x942kdf.c', + 'openssl/providers/implementations/kem/ml_kem_kem.c', + 'openssl/providers/implementations/kem/mlx_kem.c', + 'openssl/providers/implementations/kem/rsa_kem.c', + 'openssl/providers/implementations/keymgmt/dh_kmgmt.c', + 'openssl/providers/implementations/keymgmt/dsa_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ec_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ecx_kmgmt.c', + 'openssl/providers/implementations/keymgmt/kdf_legacy_kmgmt.c', + 'openssl/providers/implementations/keymgmt/mac_legacy_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ml_dsa_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ml_kem_kmgmt.c', + 'openssl/providers/implementations/keymgmt/mlx_kmgmt.c', + 'openssl/providers/implementations/keymgmt/rsa_kmgmt.c', + 'openssl/providers/implementations/keymgmt/slh_dsa_kmgmt.c', + 'openssl/providers/implementations/macs/cmac_prov.c', + 'openssl/providers/implementations/macs/gmac_prov.c', + 'openssl/providers/implementations/macs/hmac_prov.c', + 'openssl/providers/implementations/macs/kmac_prov.c', + 'openssl/providers/implementations/rands/drbg.c', + 'openssl/providers/implementations/rands/drbg_ctr.c', + 'openssl/providers/implementations/rands/drbg_hash.c', + 'openssl/providers/implementations/rands/drbg_hmac.c', + 'openssl/providers/implementations/rands/fips_crng_test.c', + 'openssl/providers/implementations/rands/test_rng.c', + 'openssl/providers/implementations/signature/dsa_sig.c', + 'openssl/providers/implementations/signature/ecdsa_sig.c', + 'openssl/providers/implementations/signature/eddsa_sig.c', + 'openssl/providers/implementations/signature/mac_legacy_sig.c', + 'openssl/providers/implementations/signature/ml_dsa_sig.c', + 'openssl/providers/implementations/signature/rsa_sig.c', + 'openssl/providers/implementations/signature/slh_dsa_sig.c', + 'openssl/providers/implementations/skeymgmt/aes_skmgmt.c', + 'openssl/providers/implementations/skeymgmt/generic.c', + 'openssl/ssl/record/methods/ssl3_cbc.c', + 'openssl/providers/common/der/der_dsa_key.c', + 'openssl/providers/common/der/der_dsa_sig.c', + 'openssl/providers/common/der/der_ec_key.c', + 'openssl/providers/common/der/der_ec_sig.c', + 'openssl/providers/common/der/der_ecx_key.c', + 'openssl/providers/common/der/der_ml_dsa_key.c', + 'openssl/providers/common/der/der_rsa_key.c', + 'openssl/providers/common/der/der_slh_dsa_key.c', + 'openssl/providers/common/provider_ctx.c', + 'openssl/providers/common/provider_err.c', + 'openssl/providers/implementations/ciphers/ciphercommon.c', + 'openssl/providers/implementations/ciphers/ciphercommon_block.c', + 'openssl/providers/implementations/ciphers/ciphercommon_ccm.c', + 'openssl/providers/implementations/ciphers/ciphercommon_ccm_hw.c', + 'openssl/providers/implementations/ciphers/ciphercommon_gcm.c', + 'openssl/providers/implementations/ciphers/ciphercommon_gcm_hw.c', + 'openssl/providers/implementations/ciphers/ciphercommon_hw.c', + 'openssl/providers/implementations/digests/digestcommon.c', + 'openssl/ssl/record/methods/tls_pad.c', + 'openssl/providers/fips/fips_entry.c', + + ], + 'openssl_sources_linux64-riscv64': [ + './config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zkn.s', + './config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s', + './config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvkb-zvkned.s', + './config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvkned.s', + './config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64.s', + './config/archs/linux64-riscv64/asm/crypto/chacha/chacha-riscv64-v-zbb-zvkb.s', + './config/archs/linux64-riscv64/asm/crypto/chacha/chacha-riscv64-v-zbb.s', + './config/archs/linux64-riscv64/asm/crypto/params_idx.c', + './config/archs/linux64-riscv64/asm/crypto/riscv64cpuid.s', + './config/archs/linux64-riscv64/asm/crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s', + './config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64-zvkb-zvbc.s', + './config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64-zvkg.s', + './config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64.s', + './config/archs/linux64-riscv64/asm/crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S', + './config/archs/linux64-riscv64/asm/crypto/sha/sha512-riscv64-zvkb-zvknhb.S', + './config/archs/linux64-riscv64/asm/crypto/sm3/sm3-riscv64-zvksh.S', + './config/archs/linux64-riscv64/asm/crypto/sm4/sm4-riscv64-zvksed.s', + './config/archs/linux64-riscv64/asm/providers/common/der/der_sm2_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_digests_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_dsa_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_ec_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_ecx_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_ml_dsa_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_rsa_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_slh_dsa_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_wrap_gen.c', + './config/archs/linux64-riscv64/asm/providers/legacy.ld', + './config/archs/linux64-riscv64/asm/providers/fips.ld', + + ], + 'openssl_defines_linux64-riscv64': [ + 'NDEBUG', + 'OPENSSL_USE_NODELETE', + 'OPENSSL_BUILDING_OPENSSL', + 'BROTLI', + 'ZLIB', + 'ZSTD', + 'AES_ASM', + 'FIPS_MODULE', + 'GHASH_ASM', + 'INCLUDE_C_SHA256', + 'INCLUDE_C_SHA512', + 'OPENSSL_CPUID_OBJ', + 'SHA256_ASM', + 'SHA512_ASM', + 'SM4_ASM', + 'FIPS_MODULE', + ], + 'openssl_cflags_linux64-riscv64': [ + '-Wa,--noexecstack', + '-Wall -O3', + '-pthread', + '-Wall -O3', + ], + 'openssl_ex_libs_linux64-riscv64': [ + '-lm -ldl -pthread', + ], + 'linker_script': '<(PRODUCT_DIR)/../../deps/openssl/config/archs/linux64-riscv64/asm/providers/fips.ld' + }, + 'include_dirs': [ + '.', + './include', + './crypto', + './crypto/include/internal', + './providers/common/include', + ], + 'defines': ['<@(openssl_defines_linux64-riscv64)'], + 'cflags': ['<@(openssl_cflags_linux64-riscv64)'], + 'libraries': ['<@(openssl_ex_libs_linux64-riscv64)'], + 'ldflags': ['-Wl,--version-script=<@(linker_script)'], + 'sources': ['<@(openssl_sources)', '<@(openssl_sources_linux64-riscv64)'], + 'direct_dependent_settings': { + 'include_dirs': ['./include', '.'], + 'defines': ['<@(openssl_defines_linux64-riscv64)'], + }, +} diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/openssl.gypi b/deps/openssl/config/archs/linux64-riscv64/asm/openssl.gypi new file mode 100644 index 000000000000..966cbebc680a --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/openssl.gypi @@ -0,0 +1,1196 @@ +{ + 'variables': { + 'openssl_sources': [ + 'openssl/ssl/bio_ssl.c', + 'openssl/ssl/d1_lib.c', + 'openssl/ssl/d1_msg.c', + 'openssl/ssl/d1_srtp.c', + 'openssl/ssl/methods.c', + 'openssl/ssl/pqueue.c', + 'openssl/ssl/priority_queue.c', + 'openssl/ssl/s3_enc.c', + 'openssl/ssl/s3_lib.c', + 'openssl/ssl/s3_msg.c', + 'openssl/ssl/ssl_asn1.c', + 'openssl/ssl/ssl_cert.c', + 'openssl/ssl/ssl_cert_comp.c', + 'openssl/ssl/ssl_ciph.c', + 'openssl/ssl/ssl_conf.c', + 'openssl/ssl/ssl_err_legacy.c', + 'openssl/ssl/ssl_init.c', + 'openssl/ssl/ssl_lib.c', + 'openssl/ssl/ssl_mcnf.c', + 'openssl/ssl/ssl_rsa.c', + 'openssl/ssl/ssl_rsa_legacy.c', + 'openssl/ssl/ssl_sess.c', + 'openssl/ssl/ssl_stat.c', + 'openssl/ssl/ssl_txt.c', + 'openssl/ssl/ssl_utst.c', + 'openssl/ssl/t1_enc.c', + 'openssl/ssl/t1_lib.c', + 'openssl/ssl/t1_trce.c', + 'openssl/ssl/tls13_enc.c', + 'openssl/ssl/tls_depr.c', + 'openssl/ssl/tls_srp.c', + 'openssl/ssl/quic/cc_newreno.c', + 'openssl/ssl/quic/json_enc.c', + 'openssl/ssl/quic/qlog.c', + 'openssl/ssl/quic/qlog_event_helpers.c', + 'openssl/ssl/quic/quic_ackm.c', + 'openssl/ssl/quic/quic_cfq.c', + 'openssl/ssl/quic/quic_channel.c', + 'openssl/ssl/quic/quic_demux.c', + 'openssl/ssl/quic/quic_engine.c', + 'openssl/ssl/quic/quic_fc.c', + 'openssl/ssl/quic/quic_fifd.c', + 'openssl/ssl/quic/quic_impl.c', + 'openssl/ssl/quic/quic_lcidm.c', + 'openssl/ssl/quic/quic_method.c', + 'openssl/ssl/quic/quic_obj.c', + 'openssl/ssl/quic/quic_port.c', + 'openssl/ssl/quic/quic_rcidm.c', + 'openssl/ssl/quic/quic_reactor.c', + 'openssl/ssl/quic/quic_reactor_wait_ctx.c', + 'openssl/ssl/quic/quic_record_rx.c', + 'openssl/ssl/quic/quic_record_shared.c', + 'openssl/ssl/quic/quic_record_tx.c', + 'openssl/ssl/quic/quic_record_util.c', + 'openssl/ssl/quic/quic_rstream.c', + 'openssl/ssl/quic/quic_rx_depack.c', + 'openssl/ssl/quic/quic_sf_list.c', + 'openssl/ssl/quic/quic_srt_gen.c', + 'openssl/ssl/quic/quic_srtm.c', + 'openssl/ssl/quic/quic_sstream.c', + 'openssl/ssl/quic/quic_statm.c', + 'openssl/ssl/quic/quic_stream_map.c', + 'openssl/ssl/quic/quic_thread_assist.c', + 'openssl/ssl/quic/quic_tls.c', + 'openssl/ssl/quic/quic_tls_api.c', + 'openssl/ssl/quic/quic_trace.c', + 'openssl/ssl/quic/quic_tserver.c', + 'openssl/ssl/quic/quic_txp.c', + 'openssl/ssl/quic/quic_txpim.c', + 'openssl/ssl/quic/quic_types.c', + 'openssl/ssl/quic/quic_wire.c', + 'openssl/ssl/quic/quic_wire_pkt.c', + 'openssl/ssl/quic/uint_set.c', + 'openssl/ssl/record/rec_layer_d1.c', + 'openssl/ssl/record/rec_layer_s3.c', + 'openssl/ssl/record/methods/dtls_meth.c', + 'openssl/ssl/record/methods/ssl3_meth.c', + 'openssl/ssl/record/methods/tls13_meth.c', + 'openssl/ssl/record/methods/tls1_meth.c', + 'openssl/ssl/record/methods/tls_common.c', + 'openssl/ssl/record/methods/tls_multib.c', + 'openssl/ssl/record/methods/tlsany_meth.c', + 'openssl/ssl/rio/poll_builder.c', + 'openssl/ssl/rio/poll_immediate.c', + 'openssl/ssl/rio/rio_notifier.c', + 'openssl/ssl/statem/extensions.c', + 'openssl/ssl/statem/extensions_clnt.c', + 'openssl/ssl/statem/extensions_cust.c', + 'openssl/ssl/statem/extensions_srvr.c', + 'openssl/ssl/statem/statem.c', + 'openssl/ssl/statem/statem_clnt.c', + 'openssl/ssl/statem/statem_dtls.c', + 'openssl/ssl/statem/statem_lib.c', + 'openssl/ssl/statem/statem_srvr.c', + 'openssl/crypto/aes/aes_cbc.c', + 'openssl/crypto/aes/aes_cfb.c', + 'openssl/crypto/aes/aes_ecb.c', + 'openssl/crypto/aes/aes_ige.c', + 'openssl/crypto/aes/aes_misc.c', + 'openssl/crypto/aes/aes_ofb.c', + 'openssl/crypto/aes/aes_wrap.c', + 'openssl/crypto/aria/aria.c', + 'openssl/crypto/asn1/a_bitstr.c', + 'openssl/crypto/asn1/a_d2i_fp.c', + 'openssl/crypto/asn1/a_digest.c', + 'openssl/crypto/asn1/a_dup.c', + 'openssl/crypto/asn1/a_gentm.c', + 'openssl/crypto/asn1/a_i2d_fp.c', + 'openssl/crypto/asn1/a_int.c', + 'openssl/crypto/asn1/a_mbstr.c', + 'openssl/crypto/asn1/a_object.c', + 'openssl/crypto/asn1/a_octet.c', + 'openssl/crypto/asn1/a_print.c', + 'openssl/crypto/asn1/a_sign.c', + 'openssl/crypto/asn1/a_strex.c', + 'openssl/crypto/asn1/a_strnid.c', + 'openssl/crypto/asn1/a_time.c', + 'openssl/crypto/asn1/a_type.c', + 'openssl/crypto/asn1/a_utctm.c', + 'openssl/crypto/asn1/a_utf8.c', + 'openssl/crypto/asn1/a_verify.c', + 'openssl/crypto/asn1/ameth_lib.c', + 'openssl/crypto/asn1/asn1_err.c', + 'openssl/crypto/asn1/asn1_gen.c', + 'openssl/crypto/asn1/asn1_item_list.c', + 'openssl/crypto/asn1/asn1_lib.c', + 'openssl/crypto/asn1/asn1_parse.c', + 'openssl/crypto/asn1/asn_mime.c', + 'openssl/crypto/asn1/asn_moid.c', + 'openssl/crypto/asn1/asn_mstbl.c', + 'openssl/crypto/asn1/asn_pack.c', + 'openssl/crypto/asn1/bio_asn1.c', + 'openssl/crypto/asn1/bio_ndef.c', + 'openssl/crypto/asn1/d2i_param.c', + 'openssl/crypto/asn1/d2i_pr.c', + 'openssl/crypto/asn1/d2i_pu.c', + 'openssl/crypto/asn1/evp_asn1.c', + 'openssl/crypto/asn1/f_int.c', + 'openssl/crypto/asn1/f_string.c', + 'openssl/crypto/asn1/i2d_evp.c', + 'openssl/crypto/asn1/n_pkey.c', + 'openssl/crypto/asn1/nsseq.c', + 'openssl/crypto/asn1/p5_pbe.c', + 'openssl/crypto/asn1/p5_pbev2.c', + 'openssl/crypto/asn1/p5_scrypt.c', + 'openssl/crypto/asn1/p8_pkey.c', + 'openssl/crypto/asn1/t_bitst.c', + 'openssl/crypto/asn1/t_pkey.c', + 'openssl/crypto/asn1/t_spki.c', + 'openssl/crypto/asn1/tasn_dec.c', + 'openssl/crypto/asn1/tasn_enc.c', + 'openssl/crypto/asn1/tasn_fre.c', + 'openssl/crypto/asn1/tasn_new.c', + 'openssl/crypto/asn1/tasn_prn.c', + 'openssl/crypto/asn1/tasn_scn.c', + 'openssl/crypto/asn1/tasn_typ.c', + 'openssl/crypto/asn1/tasn_utl.c', + 'openssl/crypto/asn1/x_algor.c', + 'openssl/crypto/asn1/x_bignum.c', + 'openssl/crypto/asn1/x_info.c', + 'openssl/crypto/asn1/x_int64.c', + 'openssl/crypto/asn1/x_long.c', + 'openssl/crypto/asn1/x_pkey.c', + 'openssl/crypto/asn1/x_sig.c', + 'openssl/crypto/asn1/x_spki.c', + 'openssl/crypto/asn1/x_val.c', + 'openssl/crypto/async/arch/async_null.c', + 'openssl/crypto/async/arch/async_posix.c', + 'openssl/crypto/async/arch/async_win.c', + 'openssl/crypto/async/async.c', + 'openssl/crypto/async/async_err.c', + 'openssl/crypto/async/async_wait.c', + 'openssl/crypto/bf/bf_cfb64.c', + 'openssl/crypto/bf/bf_ecb.c', + 'openssl/crypto/bf/bf_enc.c', + 'openssl/crypto/bf/bf_ofb64.c', + 'openssl/crypto/bf/bf_skey.c', + 'openssl/crypto/bio/bf_buff.c', + 'openssl/crypto/bio/bf_lbuf.c', + 'openssl/crypto/bio/bf_nbio.c', + 'openssl/crypto/bio/bf_null.c', + 'openssl/crypto/bio/bf_prefix.c', + 'openssl/crypto/bio/bf_readbuff.c', + 'openssl/crypto/bio/bio_addr.c', + 'openssl/crypto/bio/bio_cb.c', + 'openssl/crypto/bio/bio_dump.c', + 'openssl/crypto/bio/bio_err.c', + 'openssl/crypto/bio/bio_lib.c', + 'openssl/crypto/bio/bio_meth.c', + 'openssl/crypto/bio/bio_print.c', + 'openssl/crypto/bio/bio_sock.c', + 'openssl/crypto/bio/bio_sock2.c', + 'openssl/crypto/bio/bss_acpt.c', + 'openssl/crypto/bio/bss_bio.c', + 'openssl/crypto/bio/bss_conn.c', + 'openssl/crypto/bio/bss_core.c', + 'openssl/crypto/bio/bss_dgram.c', + 'openssl/crypto/bio/bss_dgram_pair.c', + 'openssl/crypto/bio/bss_fd.c', + 'openssl/crypto/bio/bss_file.c', + 'openssl/crypto/bio/bss_log.c', + 'openssl/crypto/bio/bss_mem.c', + 'openssl/crypto/bio/bss_null.c', + 'openssl/crypto/bio/bss_sock.c', + 'openssl/crypto/bio/ossl_core_bio.c', + 'openssl/crypto/bn/bn_add.c', + 'openssl/crypto/bn/bn_asm.c', + 'openssl/crypto/bn/bn_blind.c', + 'openssl/crypto/bn/bn_const.c', + 'openssl/crypto/bn/bn_conv.c', + 'openssl/crypto/bn/bn_ctx.c', + 'openssl/crypto/bn/bn_depr.c', + 'openssl/crypto/bn/bn_dh.c', + 'openssl/crypto/bn/bn_div.c', + 'openssl/crypto/bn/bn_err.c', + 'openssl/crypto/bn/bn_exp.c', + 'openssl/crypto/bn/bn_exp2.c', + 'openssl/crypto/bn/bn_gcd.c', + 'openssl/crypto/bn/bn_gf2m.c', + 'openssl/crypto/bn/bn_intern.c', + 'openssl/crypto/bn/bn_kron.c', + 'openssl/crypto/bn/bn_lib.c', + 'openssl/crypto/bn/bn_mod.c', + 'openssl/crypto/bn/bn_mont.c', + 'openssl/crypto/bn/bn_mpi.c', + 'openssl/crypto/bn/bn_mul.c', + 'openssl/crypto/bn/bn_nist.c', + 'openssl/crypto/bn/bn_prime.c', + 'openssl/crypto/bn/bn_print.c', + 'openssl/crypto/bn/bn_rand.c', + 'openssl/crypto/bn/bn_recp.c', + 'openssl/crypto/bn/bn_rsa_fips186_4.c', + 'openssl/crypto/bn/bn_shift.c', + 'openssl/crypto/bn/bn_sqr.c', + 'openssl/crypto/bn/bn_sqrt.c', + 'openssl/crypto/bn/bn_srp.c', + 'openssl/crypto/bn/bn_word.c', + 'openssl/crypto/bn/bn_x931p.c', + 'openssl/crypto/buffer/buf_err.c', + 'openssl/crypto/buffer/buffer.c', + 'openssl/crypto/camellia/camellia.c', + 'openssl/crypto/camellia/cmll_cbc.c', + 'openssl/crypto/camellia/cmll_cfb.c', + 'openssl/crypto/camellia/cmll_ctr.c', + 'openssl/crypto/camellia/cmll_ecb.c', + 'openssl/crypto/camellia/cmll_misc.c', + 'openssl/crypto/camellia/cmll_ofb.c', + 'openssl/crypto/cast/c_cfb64.c', + 'openssl/crypto/cast/c_ecb.c', + 'openssl/crypto/cast/c_enc.c', + 'openssl/crypto/cast/c_ofb64.c', + 'openssl/crypto/cast/c_skey.c', + 'openssl/crypto/chacha/chacha_enc.c', + 'openssl/crypto/chacha/chacha_riscv.c', + 'openssl/crypto/cmac/cmac.c', + 'openssl/crypto/cmp/cmp_asn.c', + 'openssl/crypto/cmp/cmp_client.c', + 'openssl/crypto/cmp/cmp_ctx.c', + 'openssl/crypto/cmp/cmp_err.c', + 'openssl/crypto/cmp/cmp_genm.c', + 'openssl/crypto/cmp/cmp_hdr.c', + 'openssl/crypto/cmp/cmp_http.c', + 'openssl/crypto/cmp/cmp_msg.c', + 'openssl/crypto/cmp/cmp_protect.c', + 'openssl/crypto/cmp/cmp_server.c', + 'openssl/crypto/cmp/cmp_status.c', + 'openssl/crypto/cmp/cmp_util.c', + 'openssl/crypto/cmp/cmp_vfy.c', + 'openssl/crypto/cms/cms_asn1.c', + 'openssl/crypto/cms/cms_att.c', + 'openssl/crypto/cms/cms_cd.c', + 'openssl/crypto/cms/cms_dd.c', + 'openssl/crypto/cms/cms_dh.c', + 'openssl/crypto/cms/cms_ec.c', + 'openssl/crypto/cms/cms_enc.c', + 'openssl/crypto/cms/cms_env.c', + 'openssl/crypto/cms/cms_err.c', + 'openssl/crypto/cms/cms_ess.c', + 'openssl/crypto/cms/cms_io.c', + 'openssl/crypto/cms/cms_kari.c', + 'openssl/crypto/cms/cms_lib.c', + 'openssl/crypto/cms/cms_pwri.c', + 'openssl/crypto/cms/cms_rsa.c', + 'openssl/crypto/cms/cms_sd.c', + 'openssl/crypto/cms/cms_smime.c', + 'openssl/crypto/comp/c_brotli.c', + 'openssl/crypto/comp/c_zlib.c', + 'openssl/crypto/comp/c_zstd.c', + 'openssl/crypto/comp/comp_err.c', + 'openssl/crypto/comp/comp_lib.c', + 'openssl/crypto/conf/conf_api.c', + 'openssl/crypto/conf/conf_def.c', + 'openssl/crypto/conf/conf_err.c', + 'openssl/crypto/conf/conf_lib.c', + 'openssl/crypto/conf/conf_mall.c', + 'openssl/crypto/conf/conf_mod.c', + 'openssl/crypto/conf/conf_sap.c', + 'openssl/crypto/conf/conf_ssl.c', + 'openssl/crypto/crmf/crmf_asn.c', + 'openssl/crypto/crmf/crmf_err.c', + 'openssl/crypto/crmf/crmf_lib.c', + 'openssl/crypto/crmf/crmf_pbm.c', + 'openssl/crypto/ct/ct_b64.c', + 'openssl/crypto/ct/ct_err.c', + 'openssl/crypto/ct/ct_log.c', + 'openssl/crypto/ct/ct_oct.c', + 'openssl/crypto/ct/ct_policy.c', + 'openssl/crypto/ct/ct_prn.c', + 'openssl/crypto/ct/ct_sct.c', + 'openssl/crypto/ct/ct_sct_ctx.c', + 'openssl/crypto/ct/ct_vfy.c', + 'openssl/crypto/ct/ct_x509v3.c', + 'openssl/crypto/des/cbc_cksm.c', + 'openssl/crypto/des/cbc_enc.c', + 'openssl/crypto/des/cfb64ede.c', + 'openssl/crypto/des/cfb64enc.c', + 'openssl/crypto/des/cfb_enc.c', + 'openssl/crypto/des/des_enc.c', + 'openssl/crypto/des/ecb3_enc.c', + 'openssl/crypto/des/ecb_enc.c', + 'openssl/crypto/des/fcrypt.c', + 'openssl/crypto/des/fcrypt_b.c', + 'openssl/crypto/des/ofb64ede.c', + 'openssl/crypto/des/ofb64enc.c', + 'openssl/crypto/des/ofb_enc.c', + 'openssl/crypto/des/pcbc_enc.c', + 'openssl/crypto/des/qud_cksm.c', + 'openssl/crypto/des/rand_key.c', + 'openssl/crypto/des/set_key.c', + 'openssl/crypto/des/str2key.c', + 'openssl/crypto/des/xcbc_enc.c', + 'openssl/crypto/dh/dh_ameth.c', + 'openssl/crypto/dh/dh_asn1.c', + 'openssl/crypto/dh/dh_backend.c', + 'openssl/crypto/dh/dh_check.c', + 'openssl/crypto/dh/dh_depr.c', + 'openssl/crypto/dh/dh_err.c', + 'openssl/crypto/dh/dh_gen.c', + 'openssl/crypto/dh/dh_group_params.c', + 'openssl/crypto/dh/dh_kdf.c', + 'openssl/crypto/dh/dh_key.c', + 'openssl/crypto/dh/dh_lib.c', + 'openssl/crypto/dh/dh_meth.c', + 'openssl/crypto/dh/dh_pmeth.c', + 'openssl/crypto/dh/dh_prn.c', + 'openssl/crypto/dh/dh_rfc5114.c', + 'openssl/crypto/dsa/dsa_ameth.c', + 'openssl/crypto/dsa/dsa_asn1.c', + 'openssl/crypto/dsa/dsa_backend.c', + 'openssl/crypto/dsa/dsa_check.c', + 'openssl/crypto/dsa/dsa_depr.c', + 'openssl/crypto/dsa/dsa_err.c', + 'openssl/crypto/dsa/dsa_gen.c', + 'openssl/crypto/dsa/dsa_key.c', + 'openssl/crypto/dsa/dsa_lib.c', + 'openssl/crypto/dsa/dsa_meth.c', + 'openssl/crypto/dsa/dsa_ossl.c', + 'openssl/crypto/dsa/dsa_pmeth.c', + 'openssl/crypto/dsa/dsa_prn.c', + 'openssl/crypto/dsa/dsa_sign.c', + 'openssl/crypto/dsa/dsa_vrf.c', + 'openssl/crypto/dso/dso_dl.c', + 'openssl/crypto/dso/dso_dlfcn.c', + 'openssl/crypto/dso/dso_err.c', + 'openssl/crypto/dso/dso_lib.c', + 'openssl/crypto/dso/dso_openssl.c', + 'openssl/crypto/dso/dso_vms.c', + 'openssl/crypto/dso/dso_win32.c', + 'openssl/crypto/ec/curve448/arch_32/f_impl32.c', + 'openssl/crypto/ec/curve448/arch_64/f_impl64.c', + 'openssl/crypto/ec/curve448/curve448.c', + 'openssl/crypto/ec/curve448/curve448_tables.c', + 'openssl/crypto/ec/curve448/eddsa.c', + 'openssl/crypto/ec/curve448/f_generic.c', + 'openssl/crypto/ec/curve448/scalar.c', + 'openssl/crypto/ec/curve25519.c', + 'openssl/crypto/ec/ec2_oct.c', + 'openssl/crypto/ec/ec2_smpl.c', + 'openssl/crypto/ec/ec_ameth.c', + 'openssl/crypto/ec/ec_asn1.c', + 'openssl/crypto/ec/ec_backend.c', + 'openssl/crypto/ec/ec_check.c', + 'openssl/crypto/ec/ec_curve.c', + 'openssl/crypto/ec/ec_cvt.c', + 'openssl/crypto/ec/ec_deprecated.c', + 'openssl/crypto/ec/ec_err.c', + 'openssl/crypto/ec/ec_key.c', + 'openssl/crypto/ec/ec_kmeth.c', + 'openssl/crypto/ec/ec_lib.c', + 'openssl/crypto/ec/ec_mult.c', + 'openssl/crypto/ec/ec_oct.c', + 'openssl/crypto/ec/ec_pmeth.c', + 'openssl/crypto/ec/ec_print.c', + 'openssl/crypto/ec/ecdh_kdf.c', + 'openssl/crypto/ec/ecdh_ossl.c', + 'openssl/crypto/ec/ecdsa_ossl.c', + 'openssl/crypto/ec/ecdsa_sign.c', + 'openssl/crypto/ec/ecdsa_vrf.c', + 'openssl/crypto/ec/eck_prn.c', + 'openssl/crypto/ec/ecp_mont.c', + 'openssl/crypto/ec/ecp_nist.c', + 'openssl/crypto/ec/ecp_oct.c', + 'openssl/crypto/ec/ecp_smpl.c', + 'openssl/crypto/ec/ecx_backend.c', + 'openssl/crypto/ec/ecx_key.c', + 'openssl/crypto/ec/ecx_meth.c', + 'openssl/crypto/encode_decode/decoder_err.c', + 'openssl/crypto/encode_decode/decoder_lib.c', + 'openssl/crypto/encode_decode/decoder_meth.c', + 'openssl/crypto/encode_decode/decoder_pkey.c', + 'openssl/crypto/encode_decode/encoder_err.c', + 'openssl/crypto/encode_decode/encoder_lib.c', + 'openssl/crypto/encode_decode/encoder_meth.c', + 'openssl/crypto/encode_decode/encoder_pkey.c', + 'openssl/crypto/engine/eng_all.c', + 'openssl/crypto/engine/eng_cnf.c', + 'openssl/crypto/engine/eng_ctrl.c', + 'openssl/crypto/engine/eng_dyn.c', + 'openssl/crypto/engine/eng_err.c', + 'openssl/crypto/engine/eng_fat.c', + 'openssl/crypto/engine/eng_init.c', + 'openssl/crypto/engine/eng_lib.c', + 'openssl/crypto/engine/eng_list.c', + 'openssl/crypto/engine/eng_openssl.c', + 'openssl/crypto/engine/eng_pkey.c', + 'openssl/crypto/engine/eng_rdrand.c', + 'openssl/crypto/engine/eng_table.c', + 'openssl/crypto/engine/tb_asnmth.c', + 'openssl/crypto/engine/tb_cipher.c', + 'openssl/crypto/engine/tb_dh.c', + 'openssl/crypto/engine/tb_digest.c', + 'openssl/crypto/engine/tb_dsa.c', + 'openssl/crypto/engine/tb_eckey.c', + 'openssl/crypto/engine/tb_pkmeth.c', + 'openssl/crypto/engine/tb_rand.c', + 'openssl/crypto/engine/tb_rsa.c', + 'openssl/crypto/err/err.c', + 'openssl/crypto/err/err_all.c', + 'openssl/crypto/err/err_all_legacy.c', + 'openssl/crypto/err/err_blocks.c', + 'openssl/crypto/err/err_mark.c', + 'openssl/crypto/err/err_prn.c', + 'openssl/crypto/err/err_save.c', + 'openssl/crypto/ess/ess_asn1.c', + 'openssl/crypto/ess/ess_err.c', + 'openssl/crypto/ess/ess_lib.c', + 'openssl/crypto/evp/asymcipher.c', + 'openssl/crypto/evp/bio_b64.c', + 'openssl/crypto/evp/bio_enc.c', + 'openssl/crypto/evp/bio_md.c', + 'openssl/crypto/evp/bio_ok.c', + 'openssl/crypto/evp/c_allc.c', + 'openssl/crypto/evp/c_alld.c', + 'openssl/crypto/evp/cmeth_lib.c', + 'openssl/crypto/evp/ctrl_params_translate.c', + 'openssl/crypto/evp/dh_ctrl.c', + 'openssl/crypto/evp/dh_support.c', + 'openssl/crypto/evp/digest.c', + 'openssl/crypto/evp/dsa_ctrl.c', + 'openssl/crypto/evp/e_aes.c', + 'openssl/crypto/evp/e_aes_cbc_hmac_sha1.c', + 'openssl/crypto/evp/e_aes_cbc_hmac_sha256.c', + 'openssl/crypto/evp/e_aria.c', + 'openssl/crypto/evp/e_bf.c', + 'openssl/crypto/evp/e_camellia.c', + 'openssl/crypto/evp/e_cast.c', + 'openssl/crypto/evp/e_chacha20_poly1305.c', + 'openssl/crypto/evp/e_des.c', + 'openssl/crypto/evp/e_des3.c', + 'openssl/crypto/evp/e_idea.c', + 'openssl/crypto/evp/e_null.c', + 'openssl/crypto/evp/e_old.c', + 'openssl/crypto/evp/e_rc2.c', + 'openssl/crypto/evp/e_rc4.c', + 'openssl/crypto/evp/e_rc4_hmac_md5.c', + 'openssl/crypto/evp/e_rc5.c', + 'openssl/crypto/evp/e_seed.c', + 'openssl/crypto/evp/e_sm4.c', + 'openssl/crypto/evp/e_xcbc_d.c', + 'openssl/crypto/evp/ec_ctrl.c', + 'openssl/crypto/evp/ec_support.c', + 'openssl/crypto/evp/encode.c', + 'openssl/crypto/evp/evp_cnf.c', + 'openssl/crypto/evp/evp_enc.c', + 'openssl/crypto/evp/evp_err.c', + 'openssl/crypto/evp/evp_fetch.c', + 'openssl/crypto/evp/evp_key.c', + 'openssl/crypto/evp/evp_lib.c', + 'openssl/crypto/evp/evp_pbe.c', + 'openssl/crypto/evp/evp_pkey.c', + 'openssl/crypto/evp/evp_rand.c', + 'openssl/crypto/evp/evp_utils.c', + 'openssl/crypto/evp/exchange.c', + 'openssl/crypto/evp/kdf_lib.c', + 'openssl/crypto/evp/kdf_meth.c', + 'openssl/crypto/evp/kem.c', + 'openssl/crypto/evp/keymgmt_lib.c', + 'openssl/crypto/evp/keymgmt_meth.c', + 'openssl/crypto/evp/legacy_blake2.c', + 'openssl/crypto/evp/legacy_md4.c', + 'openssl/crypto/evp/legacy_md5.c', + 'openssl/crypto/evp/legacy_md5_sha1.c', + 'openssl/crypto/evp/legacy_mdc2.c', + 'openssl/crypto/evp/legacy_ripemd.c', + 'openssl/crypto/evp/legacy_sha.c', + 'openssl/crypto/evp/legacy_wp.c', + 'openssl/crypto/evp/m_null.c', + 'openssl/crypto/evp/m_sigver.c', + 'openssl/crypto/evp/mac_lib.c', + 'openssl/crypto/evp/mac_meth.c', + 'openssl/crypto/evp/names.c', + 'openssl/crypto/evp/p5_crpt.c', + 'openssl/crypto/evp/p5_crpt2.c', + 'openssl/crypto/evp/p_dec.c', + 'openssl/crypto/evp/p_enc.c', + 'openssl/crypto/evp/p_legacy.c', + 'openssl/crypto/evp/p_lib.c', + 'openssl/crypto/evp/p_open.c', + 'openssl/crypto/evp/p_seal.c', + 'openssl/crypto/evp/p_sign.c', + 'openssl/crypto/evp/p_verify.c', + 'openssl/crypto/evp/pbe_scrypt.c', + 'openssl/crypto/evp/pmeth_check.c', + 'openssl/crypto/evp/pmeth_gn.c', + 'openssl/crypto/evp/pmeth_lib.c', + 'openssl/crypto/evp/s_lib.c', + 'openssl/crypto/evp/signature.c', + 'openssl/crypto/evp/skeymgmt_meth.c', + 'openssl/crypto/ffc/ffc_backend.c', + 'openssl/crypto/ffc/ffc_dh.c', + 'openssl/crypto/ffc/ffc_key_generate.c', + 'openssl/crypto/ffc/ffc_key_validate.c', + 'openssl/crypto/ffc/ffc_params.c', + 'openssl/crypto/ffc/ffc_params_generate.c', + 'openssl/crypto/ffc/ffc_params_validate.c', + 'openssl/crypto/hashtable/hashfunc.c', + 'openssl/crypto/hashtable/hashtable.c', + 'openssl/crypto/hmac/hmac.c', + 'openssl/crypto/hpke/hpke.c', + 'openssl/crypto/hpke/hpke_util.c', + 'openssl/crypto/http/http_client.c', + 'openssl/crypto/http/http_err.c', + 'openssl/crypto/http/http_lib.c', + 'openssl/crypto/idea/i_cbc.c', + 'openssl/crypto/idea/i_cfb64.c', + 'openssl/crypto/idea/i_ecb.c', + 'openssl/crypto/idea/i_ofb64.c', + 'openssl/crypto/idea/i_skey.c', + 'openssl/crypto/kdf/kdf_err.c', + 'openssl/crypto/lhash/lh_stats.c', + 'openssl/crypto/lhash/lhash.c', + 'openssl/crypto/asn1_dsa.c', + 'openssl/crypto/bsearch.c', + 'openssl/crypto/comp_methods.c', + 'openssl/crypto/context.c', + 'openssl/crypto/core_algorithm.c', + 'openssl/crypto/core_fetch.c', + 'openssl/crypto/core_namemap.c', + 'openssl/crypto/cpt_err.c', + 'openssl/crypto/cpuid.c', + 'openssl/crypto/cryptlib.c', + 'openssl/crypto/ctype.c', + 'openssl/crypto/cversion.c', + 'openssl/crypto/defaults.c', + 'openssl/crypto/der_writer.c', + 'openssl/crypto/deterministic_nonce.c', + 'openssl/crypto/ebcdic.c', + 'openssl/crypto/ex_data.c', + 'openssl/crypto/getenv.c', + 'openssl/crypto/indicator_core.c', + 'openssl/crypto/info.c', + 'openssl/crypto/init.c', + 'openssl/crypto/initthread.c', + 'openssl/crypto/mem.c', + 'openssl/crypto/mem_sec.c', + 'openssl/crypto/o_dir.c', + 'openssl/crypto/o_fopen.c', + 'openssl/crypto/o_init.c', + 'openssl/crypto/o_str.c', + 'openssl/crypto/o_time.c', + 'openssl/crypto/packet.c', + 'openssl/crypto/param_build.c', + 'openssl/crypto/param_build_set.c', + 'openssl/crypto/params.c', + 'openssl/crypto/params_dup.c', + 'openssl/crypto/params_from_text.c', + 'openssl/crypto/passphrase.c', + 'openssl/crypto/provider.c', + 'openssl/crypto/provider_child.c', + 'openssl/crypto/provider_conf.c', + 'openssl/crypto/provider_core.c', + 'openssl/crypto/provider_predefined.c', + 'openssl/crypto/punycode.c', + 'openssl/crypto/quic_vlint.c', + 'openssl/crypto/riscvcap.c', + 'openssl/crypto/self_test_core.c', + 'openssl/crypto/sleep.c', + 'openssl/crypto/sparse_array.c', + 'openssl/crypto/ssl_err.c', + 'openssl/crypto/threads_lib.c', + 'openssl/crypto/threads_none.c', + 'openssl/crypto/threads_pthread.c', + 'openssl/crypto/threads_win.c', + 'openssl/crypto/time.c', + 'openssl/crypto/trace.c', + 'openssl/crypto/uid.c', + 'openssl/crypto/md4/md4_dgst.c', + 'openssl/crypto/md4/md4_one.c', + 'openssl/crypto/md5/md5_dgst.c', + 'openssl/crypto/md5/md5_one.c', + 'openssl/crypto/md5/md5_sha1.c', + 'openssl/crypto/mdc2/mdc2_one.c', + 'openssl/crypto/mdc2/mdc2dgst.c', + 'openssl/crypto/ml_dsa/ml_dsa_encoders.c', + 'openssl/crypto/ml_dsa/ml_dsa_key.c', + 'openssl/crypto/ml_dsa/ml_dsa_key_compress.c', + 'openssl/crypto/ml_dsa/ml_dsa_matrix.c', + 'openssl/crypto/ml_dsa/ml_dsa_ntt.c', + 'openssl/crypto/ml_dsa/ml_dsa_params.c', + 'openssl/crypto/ml_dsa/ml_dsa_sample.c', + 'openssl/crypto/ml_dsa/ml_dsa_sign.c', + 'openssl/crypto/ml_kem/ml_kem.c', + 'openssl/crypto/modes/cbc128.c', + 'openssl/crypto/modes/ccm128.c', + 'openssl/crypto/modes/cfb128.c', + 'openssl/crypto/modes/ctr128.c', + 'openssl/crypto/modes/cts128.c', + 'openssl/crypto/modes/gcm128.c', + 'openssl/crypto/modes/ocb128.c', + 'openssl/crypto/modes/ofb128.c', + 'openssl/crypto/modes/siv128.c', + 'openssl/crypto/modes/wrap128.c', + 'openssl/crypto/modes/xts128.c', + 'openssl/crypto/modes/xts128gb.c', + 'openssl/crypto/objects/o_names.c', + 'openssl/crypto/objects/obj_dat.c', + 'openssl/crypto/objects/obj_err.c', + 'openssl/crypto/objects/obj_lib.c', + 'openssl/crypto/objects/obj_xref.c', + 'openssl/crypto/ocsp/ocsp_asn.c', + 'openssl/crypto/ocsp/ocsp_cl.c', + 'openssl/crypto/ocsp/ocsp_err.c', + 'openssl/crypto/ocsp/ocsp_ext.c', + 'openssl/crypto/ocsp/ocsp_http.c', + 'openssl/crypto/ocsp/ocsp_lib.c', + 'openssl/crypto/ocsp/ocsp_prn.c', + 'openssl/crypto/ocsp/ocsp_srv.c', + 'openssl/crypto/ocsp/ocsp_vfy.c', + 'openssl/crypto/ocsp/v3_ocsp.c', + 'openssl/crypto/pem/pem_all.c', + 'openssl/crypto/pem/pem_err.c', + 'openssl/crypto/pem/pem_info.c', + 'openssl/crypto/pem/pem_lib.c', + 'openssl/crypto/pem/pem_oth.c', + 'openssl/crypto/pem/pem_pk8.c', + 'openssl/crypto/pem/pem_pkey.c', + 'openssl/crypto/pem/pem_sign.c', + 'openssl/crypto/pem/pem_x509.c', + 'openssl/crypto/pem/pem_xaux.c', + 'openssl/crypto/pem/pvkfmt.c', + 'openssl/crypto/pkcs12/p12_add.c', + 'openssl/crypto/pkcs12/p12_asn.c', + 'openssl/crypto/pkcs12/p12_attr.c', + 'openssl/crypto/pkcs12/p12_crpt.c', + 'openssl/crypto/pkcs12/p12_crt.c', + 'openssl/crypto/pkcs12/p12_decr.c', + 'openssl/crypto/pkcs12/p12_init.c', + 'openssl/crypto/pkcs12/p12_key.c', + 'openssl/crypto/pkcs12/p12_kiss.c', + 'openssl/crypto/pkcs12/p12_mutl.c', + 'openssl/crypto/pkcs12/p12_npas.c', + 'openssl/crypto/pkcs12/p12_p8d.c', + 'openssl/crypto/pkcs12/p12_p8e.c', + 'openssl/crypto/pkcs12/p12_sbag.c', + 'openssl/crypto/pkcs12/p12_utl.c', + 'openssl/crypto/pkcs12/pk12err.c', + 'openssl/crypto/pkcs7/bio_pk7.c', + 'openssl/crypto/pkcs7/pk7_asn1.c', + 'openssl/crypto/pkcs7/pk7_attr.c', + 'openssl/crypto/pkcs7/pk7_doit.c', + 'openssl/crypto/pkcs7/pk7_lib.c', + 'openssl/crypto/pkcs7/pk7_mime.c', + 'openssl/crypto/pkcs7/pk7_smime.c', + 'openssl/crypto/pkcs7/pkcs7err.c', + 'openssl/crypto/poly1305/poly1305.c', + 'openssl/crypto/property/defn_cache.c', + 'openssl/crypto/property/property.c', + 'openssl/crypto/property/property_err.c', + 'openssl/crypto/property/property_parse.c', + 'openssl/crypto/property/property_query.c', + 'openssl/crypto/property/property_string.c', + 'openssl/crypto/rand/prov_seed.c', + 'openssl/crypto/rand/rand_deprecated.c', + 'openssl/crypto/rand/rand_err.c', + 'openssl/crypto/rand/rand_lib.c', + 'openssl/crypto/rand/rand_meth.c', + 'openssl/crypto/rand/rand_pool.c', + 'openssl/crypto/rand/rand_uniform.c', + 'openssl/crypto/rand/randfile.c', + 'openssl/crypto/rc2/rc2_cbc.c', + 'openssl/crypto/rc2/rc2_ecb.c', + 'openssl/crypto/rc2/rc2_skey.c', + 'openssl/crypto/rc2/rc2cfb64.c', + 'openssl/crypto/rc2/rc2ofb64.c', + 'openssl/crypto/rc4/rc4_enc.c', + 'openssl/crypto/rc4/rc4_skey.c', + 'openssl/crypto/ripemd/rmd_dgst.c', + 'openssl/crypto/ripemd/rmd_one.c', + 'openssl/crypto/rsa/rsa_ameth.c', + 'openssl/crypto/rsa/rsa_asn1.c', + 'openssl/crypto/rsa/rsa_backend.c', + 'openssl/crypto/rsa/rsa_chk.c', + 'openssl/crypto/rsa/rsa_crpt.c', + 'openssl/crypto/rsa/rsa_depr.c', + 'openssl/crypto/rsa/rsa_err.c', + 'openssl/crypto/rsa/rsa_gen.c', + 'openssl/crypto/rsa/rsa_lib.c', + 'openssl/crypto/rsa/rsa_meth.c', + 'openssl/crypto/rsa/rsa_mp.c', + 'openssl/crypto/rsa/rsa_mp_names.c', + 'openssl/crypto/rsa/rsa_none.c', + 'openssl/crypto/rsa/rsa_oaep.c', + 'openssl/crypto/rsa/rsa_ossl.c', + 'openssl/crypto/rsa/rsa_pk1.c', + 'openssl/crypto/rsa/rsa_pmeth.c', + 'openssl/crypto/rsa/rsa_prn.c', + 'openssl/crypto/rsa/rsa_pss.c', + 'openssl/crypto/rsa/rsa_saos.c', + 'openssl/crypto/rsa/rsa_schemes.c', + 'openssl/crypto/rsa/rsa_sign.c', + 'openssl/crypto/rsa/rsa_sp800_56b_check.c', + 'openssl/crypto/rsa/rsa_sp800_56b_gen.c', + 'openssl/crypto/rsa/rsa_x931.c', + 'openssl/crypto/rsa/rsa_x931g.c', + 'openssl/crypto/seed/seed.c', + 'openssl/crypto/seed/seed_cbc.c', + 'openssl/crypto/seed/seed_cfb.c', + 'openssl/crypto/seed/seed_ecb.c', + 'openssl/crypto/seed/seed_ofb.c', + 'openssl/crypto/sha/keccak1600.c', + 'openssl/crypto/sha/sha1_one.c', + 'openssl/crypto/sha/sha1dgst.c', + 'openssl/crypto/sha/sha256.c', + 'openssl/crypto/sha/sha3.c', + 'openssl/crypto/sha/sha512.c', + 'openssl/crypto/sha/sha_riscv.c', + 'openssl/crypto/siphash/siphash.c', + 'openssl/crypto/slh_dsa/slh_adrs.c', + 'openssl/crypto/slh_dsa/slh_dsa.c', + 'openssl/crypto/slh_dsa/slh_dsa_hash_ctx.c', + 'openssl/crypto/slh_dsa/slh_dsa_key.c', + 'openssl/crypto/slh_dsa/slh_fors.c', + 'openssl/crypto/slh_dsa/slh_hash.c', + 'openssl/crypto/slh_dsa/slh_hypertree.c', + 'openssl/crypto/slh_dsa/slh_params.c', + 'openssl/crypto/slh_dsa/slh_wots.c', + 'openssl/crypto/slh_dsa/slh_xmss.c', + 'openssl/crypto/sm2/sm2_crypt.c', + 'openssl/crypto/sm2/sm2_err.c', + 'openssl/crypto/sm2/sm2_key.c', + 'openssl/crypto/sm2/sm2_sign.c', + 'openssl/crypto/sm3/legacy_sm3.c', + 'openssl/crypto/sm3/sm3.c', + 'openssl/crypto/sm3/sm3_riscv.c', + 'openssl/crypto/sm4/sm4.c', + 'openssl/crypto/srp/srp_lib.c', + 'openssl/crypto/srp/srp_vfy.c', + 'openssl/crypto/stack/stack.c', + 'openssl/crypto/store/store_err.c', + 'openssl/crypto/store/store_init.c', + 'openssl/crypto/store/store_lib.c', + 'openssl/crypto/store/store_meth.c', + 'openssl/crypto/store/store_register.c', + 'openssl/crypto/store/store_result.c', + 'openssl/crypto/store/store_strings.c', + 'openssl/crypto/thread/arch/thread_none.c', + 'openssl/crypto/thread/arch/thread_posix.c', + 'openssl/crypto/thread/arch/thread_win.c', + 'openssl/crypto/thread/api.c', + 'openssl/crypto/thread/arch.c', + 'openssl/crypto/thread/internal.c', + 'openssl/crypto/ts/ts_asn1.c', + 'openssl/crypto/ts/ts_conf.c', + 'openssl/crypto/ts/ts_err.c', + 'openssl/crypto/ts/ts_lib.c', + 'openssl/crypto/ts/ts_req_print.c', + 'openssl/crypto/ts/ts_req_utils.c', + 'openssl/crypto/ts/ts_rsp_print.c', + 'openssl/crypto/ts/ts_rsp_sign.c', + 'openssl/crypto/ts/ts_rsp_utils.c', + 'openssl/crypto/ts/ts_rsp_verify.c', + 'openssl/crypto/ts/ts_verify_ctx.c', + 'openssl/crypto/txt_db/txt_db.c', + 'openssl/crypto/ui/ui_err.c', + 'openssl/crypto/ui/ui_lib.c', + 'openssl/crypto/ui/ui_null.c', + 'openssl/crypto/ui/ui_openssl.c', + 'openssl/crypto/ui/ui_util.c', + 'openssl/crypto/whrlpool/wp_block.c', + 'openssl/crypto/whrlpool/wp_dgst.c', + 'openssl/crypto/x509/by_dir.c', + 'openssl/crypto/x509/by_file.c', + 'openssl/crypto/x509/by_store.c', + 'openssl/crypto/x509/pcy_cache.c', + 'openssl/crypto/x509/pcy_data.c', + 'openssl/crypto/x509/pcy_lib.c', + 'openssl/crypto/x509/pcy_map.c', + 'openssl/crypto/x509/pcy_node.c', + 'openssl/crypto/x509/pcy_tree.c', + 'openssl/crypto/x509/t_acert.c', + 'openssl/crypto/x509/t_crl.c', + 'openssl/crypto/x509/t_req.c', + 'openssl/crypto/x509/t_x509.c', + 'openssl/crypto/x509/v3_aaa.c', + 'openssl/crypto/x509/v3_ac_tgt.c', + 'openssl/crypto/x509/v3_addr.c', + 'openssl/crypto/x509/v3_admis.c', + 'openssl/crypto/x509/v3_akeya.c', + 'openssl/crypto/x509/v3_akid.c', + 'openssl/crypto/x509/v3_asid.c', + 'openssl/crypto/x509/v3_attrdesc.c', + 'openssl/crypto/x509/v3_attrmap.c', + 'openssl/crypto/x509/v3_audit_id.c', + 'openssl/crypto/x509/v3_authattid.c', + 'openssl/crypto/x509/v3_battcons.c', + 'openssl/crypto/x509/v3_bcons.c', + 'openssl/crypto/x509/v3_bitst.c', + 'openssl/crypto/x509/v3_conf.c', + 'openssl/crypto/x509/v3_cpols.c', + 'openssl/crypto/x509/v3_crld.c', + 'openssl/crypto/x509/v3_enum.c', + 'openssl/crypto/x509/v3_extku.c', + 'openssl/crypto/x509/v3_genn.c', + 'openssl/crypto/x509/v3_group_ac.c', + 'openssl/crypto/x509/v3_ia5.c', + 'openssl/crypto/x509/v3_ind_iss.c', + 'openssl/crypto/x509/v3_info.c', + 'openssl/crypto/x509/v3_int.c', + 'openssl/crypto/x509/v3_iobo.c', + 'openssl/crypto/x509/v3_ist.c', + 'openssl/crypto/x509/v3_lib.c', + 'openssl/crypto/x509/v3_ncons.c', + 'openssl/crypto/x509/v3_no_ass.c', + 'openssl/crypto/x509/v3_no_rev_avail.c', + 'openssl/crypto/x509/v3_pci.c', + 'openssl/crypto/x509/v3_pcia.c', + 'openssl/crypto/x509/v3_pcons.c', + 'openssl/crypto/x509/v3_pku.c', + 'openssl/crypto/x509/v3_pmaps.c', + 'openssl/crypto/x509/v3_prn.c', + 'openssl/crypto/x509/v3_purp.c', + 'openssl/crypto/x509/v3_rolespec.c', + 'openssl/crypto/x509/v3_san.c', + 'openssl/crypto/x509/v3_sda.c', + 'openssl/crypto/x509/v3_single_use.c', + 'openssl/crypto/x509/v3_skid.c', + 'openssl/crypto/x509/v3_soa_id.c', + 'openssl/crypto/x509/v3_sxnet.c', + 'openssl/crypto/x509/v3_timespec.c', + 'openssl/crypto/x509/v3_tlsf.c', + 'openssl/crypto/x509/v3_usernotice.c', + 'openssl/crypto/x509/v3_utf8.c', + 'openssl/crypto/x509/v3_utl.c', + 'openssl/crypto/x509/v3err.c', + 'openssl/crypto/x509/x509_acert.c', + 'openssl/crypto/x509/x509_att.c', + 'openssl/crypto/x509/x509_cmp.c', + 'openssl/crypto/x509/x509_d2.c', + 'openssl/crypto/x509/x509_def.c', + 'openssl/crypto/x509/x509_err.c', + 'openssl/crypto/x509/x509_ext.c', + 'openssl/crypto/x509/x509_lu.c', + 'openssl/crypto/x509/x509_meth.c', + 'openssl/crypto/x509/x509_obj.c', + 'openssl/crypto/x509/x509_r2x.c', + 'openssl/crypto/x509/x509_req.c', + 'openssl/crypto/x509/x509_set.c', + 'openssl/crypto/x509/x509_trust.c', + 'openssl/crypto/x509/x509_txt.c', + 'openssl/crypto/x509/x509_v3.c', + 'openssl/crypto/x509/x509_vfy.c', + 'openssl/crypto/x509/x509_vpm.c', + 'openssl/crypto/x509/x509aset.c', + 'openssl/crypto/x509/x509cset.c', + 'openssl/crypto/x509/x509name.c', + 'openssl/crypto/x509/x509rset.c', + 'openssl/crypto/x509/x509spki.c', + 'openssl/crypto/x509/x509type.c', + 'openssl/crypto/x509/x_all.c', + 'openssl/crypto/x509/x_attrib.c', + 'openssl/crypto/x509/x_crl.c', + 'openssl/crypto/x509/x_exten.c', + 'openssl/crypto/x509/x_ietfatt.c', + 'openssl/crypto/x509/x_name.c', + 'openssl/crypto/x509/x_pubkey.c', + 'openssl/crypto/x509/x_req.c', + 'openssl/crypto/x509/x_x509.c', + 'openssl/crypto/x509/x_x509a.c', + 'openssl/engines/e_capi.c', + 'openssl/engines/e_padlock.c', + 'openssl/providers/baseprov.c', + 'openssl/providers/defltprov.c', + 'openssl/providers/nullprov.c', + 'openssl/providers/prov_running.c', + 'openssl/providers/common/der/der_rsa_sig.c', + 'openssl/providers/common/der/der_sm2_key.c', + 'openssl/providers/common/der/der_sm2_sig.c', + 'openssl/providers/common/bio_prov.c', + 'openssl/providers/common/capabilities.c', + 'openssl/providers/common/digest_to_nid.c', + 'openssl/providers/common/provider_seeding.c', + 'openssl/providers/common/provider_util.c', + 'openssl/providers/common/securitycheck.c', + 'openssl/providers/common/securitycheck_default.c', + 'openssl/providers/implementations/asymciphers/rsa_enc.c', + 'openssl/providers/implementations/asymciphers/sm2_enc.c', + 'openssl/providers/implementations/ciphers/cipher_aes.c', + 'openssl/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha.c', + 'openssl/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha1_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha256_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ccm.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ccm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_gcm.c', + 'openssl/providers/implementations/ciphers/cipher_aes_gcm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_gcm_siv.c', + 'openssl/providers/implementations/ciphers/cipher_aes_gcm_siv_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_gcm_siv_polyval.c', + 'openssl/providers/implementations/ciphers/cipher_aes_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ocb.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ocb_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_siv.c', + 'openssl/providers/implementations/ciphers/cipher_aes_siv_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_wrp.c', + 'openssl/providers/implementations/ciphers/cipher_aes_xts.c', + 'openssl/providers/implementations/ciphers/cipher_aes_xts_fips.c', + 'openssl/providers/implementations/ciphers/cipher_aes_xts_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aria.c', + 'openssl/providers/implementations/ciphers/cipher_aria_ccm.c', + 'openssl/providers/implementations/ciphers/cipher_aria_ccm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aria_gcm.c', + 'openssl/providers/implementations/ciphers/cipher_aria_gcm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aria_hw.c', + 'openssl/providers/implementations/ciphers/cipher_camellia.c', + 'openssl/providers/implementations/ciphers/cipher_camellia_hw.c', + 'openssl/providers/implementations/ciphers/cipher_chacha20.c', + 'openssl/providers/implementations/ciphers/cipher_chacha20_hw.c', + 'openssl/providers/implementations/ciphers/cipher_chacha20_poly1305.c', + 'openssl/providers/implementations/ciphers/cipher_chacha20_poly1305_hw.c', + 'openssl/providers/implementations/ciphers/cipher_cts.c', + 'openssl/providers/implementations/ciphers/cipher_null.c', + 'openssl/providers/implementations/ciphers/cipher_sm4.c', + 'openssl/providers/implementations/ciphers/cipher_sm4_ccm.c', + 'openssl/providers/implementations/ciphers/cipher_sm4_ccm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_sm4_gcm.c', + 'openssl/providers/implementations/ciphers/cipher_sm4_gcm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_sm4_hw.c', + 'openssl/providers/implementations/ciphers/cipher_sm4_xts.c', + 'openssl/providers/implementations/ciphers/cipher_sm4_xts_hw.c', + 'openssl/providers/implementations/ciphers/cipher_tdes.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_common.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_default.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_default_hw.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_hw.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_wrap.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_wrap_hw.c', + 'openssl/providers/implementations/digests/blake2_prov.c', + 'openssl/providers/implementations/digests/blake2b_prov.c', + 'openssl/providers/implementations/digests/blake2s_prov.c', + 'openssl/providers/implementations/digests/md5_prov.c', + 'openssl/providers/implementations/digests/md5_sha1_prov.c', + 'openssl/providers/implementations/digests/null_prov.c', + 'openssl/providers/implementations/digests/ripemd_prov.c', + 'openssl/providers/implementations/digests/sha2_prov.c', + 'openssl/providers/implementations/digests/sha3_prov.c', + 'openssl/providers/implementations/digests/sm3_prov.c', + 'openssl/providers/implementations/encode_decode/decode_der2key.c', + 'openssl/providers/implementations/encode_decode/decode_epki2pki.c', + 'openssl/providers/implementations/encode_decode/decode_msblob2key.c', + 'openssl/providers/implementations/encode_decode/decode_pem2der.c', + 'openssl/providers/implementations/encode_decode/decode_pvk2key.c', + 'openssl/providers/implementations/encode_decode/decode_spki2typespki.c', + 'openssl/providers/implementations/encode_decode/encode_key2any.c', + 'openssl/providers/implementations/encode_decode/encode_key2blob.c', + 'openssl/providers/implementations/encode_decode/encode_key2ms.c', + 'openssl/providers/implementations/encode_decode/encode_key2text.c', + 'openssl/providers/implementations/encode_decode/endecoder_common.c', + 'openssl/providers/implementations/encode_decode/ml_common_codecs.c', + 'openssl/providers/implementations/encode_decode/ml_dsa_codecs.c', + 'openssl/providers/implementations/encode_decode/ml_kem_codecs.c', + 'openssl/providers/implementations/exchange/dh_exch.c', + 'openssl/providers/implementations/exchange/ecdh_exch.c', + 'openssl/providers/implementations/exchange/ecx_exch.c', + 'openssl/providers/implementations/exchange/kdf_exch.c', + 'openssl/providers/implementations/kdfs/argon2.c', + 'openssl/providers/implementations/kdfs/hkdf.c', + 'openssl/providers/implementations/kdfs/hmacdrbg_kdf.c', + 'openssl/providers/implementations/kdfs/kbkdf.c', + 'openssl/providers/implementations/kdfs/krb5kdf.c', + 'openssl/providers/implementations/kdfs/pbkdf2.c', + 'openssl/providers/implementations/kdfs/pbkdf2_fips.c', + 'openssl/providers/implementations/kdfs/pkcs12kdf.c', + 'openssl/providers/implementations/kdfs/scrypt.c', + 'openssl/providers/implementations/kdfs/sshkdf.c', + 'openssl/providers/implementations/kdfs/sskdf.c', + 'openssl/providers/implementations/kdfs/tls1_prf.c', + 'openssl/providers/implementations/kdfs/x942kdf.c', + 'openssl/providers/implementations/kem/ec_kem.c', + 'openssl/providers/implementations/kem/ecx_kem.c', + 'openssl/providers/implementations/kem/kem_util.c', + 'openssl/providers/implementations/kem/ml_kem_kem.c', + 'openssl/providers/implementations/kem/mlx_kem.c', + 'openssl/providers/implementations/kem/rsa_kem.c', + 'openssl/providers/implementations/keymgmt/dh_kmgmt.c', + 'openssl/providers/implementations/keymgmt/dsa_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ec_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ecx_kmgmt.c', + 'openssl/providers/implementations/keymgmt/kdf_legacy_kmgmt.c', + 'openssl/providers/implementations/keymgmt/mac_legacy_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ml_dsa_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ml_kem_kmgmt.c', + 'openssl/providers/implementations/keymgmt/mlx_kmgmt.c', + 'openssl/providers/implementations/keymgmt/rsa_kmgmt.c', + 'openssl/providers/implementations/keymgmt/slh_dsa_kmgmt.c', + 'openssl/providers/implementations/macs/blake2b_mac.c', + 'openssl/providers/implementations/macs/blake2s_mac.c', + 'openssl/providers/implementations/macs/cmac_prov.c', + 'openssl/providers/implementations/macs/gmac_prov.c', + 'openssl/providers/implementations/macs/hmac_prov.c', + 'openssl/providers/implementations/macs/kmac_prov.c', + 'openssl/providers/implementations/macs/poly1305_prov.c', + 'openssl/providers/implementations/macs/siphash_prov.c', + 'openssl/providers/implementations/rands/drbg.c', + 'openssl/providers/implementations/rands/drbg_ctr.c', + 'openssl/providers/implementations/rands/drbg_hash.c', + 'openssl/providers/implementations/rands/drbg_hmac.c', + 'openssl/providers/implementations/rands/seed_src.c', + 'openssl/providers/implementations/rands/seed_src_jitter.c', + 'openssl/providers/implementations/rands/test_rng.c', + 'openssl/providers/implementations/rands/seeding/rand_cpu_x86.c', + 'openssl/providers/implementations/rands/seeding/rand_tsc.c', + 'openssl/providers/implementations/rands/seeding/rand_unix.c', + 'openssl/providers/implementations/rands/seeding/rand_win.c', + 'openssl/providers/implementations/signature/dsa_sig.c', + 'openssl/providers/implementations/signature/ecdsa_sig.c', + 'openssl/providers/implementations/signature/eddsa_sig.c', + 'openssl/providers/implementations/signature/mac_legacy_sig.c', + 'openssl/providers/implementations/signature/ml_dsa_sig.c', + 'openssl/providers/implementations/signature/rsa_sig.c', + 'openssl/providers/implementations/signature/slh_dsa_sig.c', + 'openssl/providers/implementations/signature/sm2_sig.c', + 'openssl/providers/implementations/skeymgmt/aes_skmgmt.c', + 'openssl/providers/implementations/skeymgmt/generic.c', + 'openssl/providers/implementations/storemgmt/file_store.c', + 'openssl/providers/implementations/storemgmt/file_store_any2obj.c', + 'openssl/ssl/record/methods/ssl3_cbc.c', + 'openssl/providers/common/der/der_dsa_key.c', + 'openssl/providers/common/der/der_dsa_sig.c', + 'openssl/providers/common/der/der_ec_key.c', + 'openssl/providers/common/der/der_ec_sig.c', + 'openssl/providers/common/der/der_ecx_key.c', + 'openssl/providers/common/der/der_ml_dsa_key.c', + 'openssl/providers/common/der/der_rsa_key.c', + 'openssl/providers/common/der/der_slh_dsa_key.c', + 'openssl/providers/common/provider_ctx.c', + 'openssl/providers/common/provider_err.c', + 'openssl/providers/implementations/ciphers/ciphercommon.c', + 'openssl/providers/implementations/ciphers/ciphercommon_block.c', + 'openssl/providers/implementations/ciphers/ciphercommon_ccm.c', + 'openssl/providers/implementations/ciphers/ciphercommon_ccm_hw.c', + 'openssl/providers/implementations/ciphers/ciphercommon_gcm.c', + 'openssl/providers/implementations/ciphers/ciphercommon_gcm_hw.c', + 'openssl/providers/implementations/ciphers/ciphercommon_hw.c', + 'openssl/providers/implementations/digests/digestcommon.c', + 'openssl/ssl/record/methods/tls_pad.c', + 'openssl/providers/implementations/ciphers/cipher_blowfish.c', + 'openssl/providers/implementations/ciphers/cipher_blowfish_hw.c', + 'openssl/providers/implementations/ciphers/cipher_cast5.c', + 'openssl/providers/implementations/ciphers/cipher_cast5_hw.c', + 'openssl/providers/implementations/ciphers/cipher_des.c', + 'openssl/providers/implementations/ciphers/cipher_des_hw.c', + 'openssl/providers/implementations/ciphers/cipher_desx.c', + 'openssl/providers/implementations/ciphers/cipher_desx_hw.c', + 'openssl/providers/implementations/ciphers/cipher_idea.c', + 'openssl/providers/implementations/ciphers/cipher_idea_hw.c', + 'openssl/providers/implementations/ciphers/cipher_rc2.c', + 'openssl/providers/implementations/ciphers/cipher_rc2_hw.c', + 'openssl/providers/implementations/ciphers/cipher_rc4.c', + 'openssl/providers/implementations/ciphers/cipher_rc4_hmac_md5.c', + 'openssl/providers/implementations/ciphers/cipher_rc4_hmac_md5_hw.c', + 'openssl/providers/implementations/ciphers/cipher_rc4_hw.c', + 'openssl/providers/implementations/ciphers/cipher_seed.c', + 'openssl/providers/implementations/ciphers/cipher_seed_hw.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_common.c', + 'openssl/providers/implementations/digests/md4_prov.c', + 'openssl/providers/implementations/digests/mdc2_prov.c', + 'openssl/providers/implementations/digests/ripemd_prov.c', + 'openssl/providers/implementations/digests/wp_prov.c', + 'openssl/providers/implementations/kdfs/pbkdf1.c', + 'openssl/providers/implementations/kdfs/pvkkdf.c', + 'openssl/providers/prov_running.c', + 'openssl/providers/legacyprov.c', + ], + 'openssl_sources_linux64-riscv64': [ + './config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zkn.s', + './config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s', + './config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvkb-zvkned.s', + './config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64-zvkned.s', + './config/archs/linux64-riscv64/asm/crypto/aes/aes-riscv64.s', + './config/archs/linux64-riscv64/asm/crypto/chacha/chacha-riscv64-v-zbb-zvkb.s', + './config/archs/linux64-riscv64/asm/crypto/chacha/chacha-riscv64-v-zbb.s', + './config/archs/linux64-riscv64/asm/crypto/params_idx.c', + './config/archs/linux64-riscv64/asm/crypto/riscv64cpuid.s', + './config/archs/linux64-riscv64/asm/crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s', + './config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64-zvkb-zvbc.s', + './config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64-zvkg.s', + './config/archs/linux64-riscv64/asm/crypto/modes/ghash-riscv64.s', + './config/archs/linux64-riscv64/asm/crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S', + './config/archs/linux64-riscv64/asm/crypto/sha/sha512-riscv64-zvkb-zvknhb.S', + './config/archs/linux64-riscv64/asm/crypto/sm3/sm3-riscv64-zvksh.S', + './config/archs/linux64-riscv64/asm/crypto/sm4/sm4-riscv64-zvksed.s', + './config/archs/linux64-riscv64/asm/providers/common/der/der_sm2_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_digests_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_dsa_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_ec_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_ecx_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_ml_dsa_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_rsa_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_slh_dsa_gen.c', + './config/archs/linux64-riscv64/asm/providers/common/der/der_wrap_gen.c', + './config/archs/linux64-riscv64/asm/providers/legacy.ld', + './config/archs/linux64-riscv64/asm/providers/fips.ld', + ], + 'openssl_defines_linux64-riscv64': [ + 'NDEBUG', + 'OPENSSL_USE_NODELETE', + 'OPENSSL_BUILDING_OPENSSL', + 'BROTLI', + 'ZLIB', + 'ZSTD', + 'AES_ASM', + 'GHASH_ASM', + 'INCLUDE_C_CHACHA20', + 'INCLUDE_C_SHA256', + 'INCLUDE_C_SHA512', + 'OPENSSL_CPUID_OBJ', + 'OPENSSL_SM3_ASM', + 'SHA256_ASM', + 'SHA512_ASM', + 'SM4_ASM', + 'OPENSSL_PIC', + ], + 'openssl_defines_exported_linux64-riscv64': [ + 'NDEBUG', + 'OPENSSL_USE_NODELETE', + 'OPENSSL_BUILDING_OPENSSL', + 'AES_ASM', + 'GHASH_ASM', + 'INCLUDE_C_CHACHA20', + 'INCLUDE_C_SHA256', + 'INCLUDE_C_SHA512', + 'OPENSSL_CPUID_OBJ', + 'OPENSSL_SM3_ASM', + 'SHA256_ASM', + 'SHA512_ASM', + 'SM4_ASM', + 'OPENSSL_PIC', + ], + 'openssl_cflags_linux64-riscv64': [ + '-Wa,--noexecstack', + '-Wall -O3', + '-pthread', + '-Wall -O3', + ], + 'openssl_ex_libs_linux64-riscv64': [ + '-lm -ldl -pthread', + ], + }, + 'include_dirs': [ + '.', + './include', + './crypto', + './crypto/include/internal', + './providers/common/include', + ], + 'defines': ['<@(openssl_defines_linux64-riscv64)'], + 'cflags' : ['<@(openssl_cflags_linux64-riscv64)'], + 'libraries': ['<@(openssl_ex_libs_linux64-riscv64)'], + 'sources': ['<@(openssl_sources)', '<@(openssl_sources_linux64-riscv64)'], + 'direct_dependent_settings': { + 'include_dirs': ['./include', '.'], + 'defines': ['<@(openssl_defines_exported_linux64-riscv64)'], + }, +} diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_digests_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_digests_gen.c new file mode 100644 index 000000000000..340f5148298d --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_digests_gen.c @@ -0,0 +1,162 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_digests_gen.c.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_digests.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * sigAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 3 } + */ +const unsigned char ossl_der_oid_sigAlgs[DER_OID_SZ_sigAlgs] = { + DER_OID_V_sigAlgs +}; + +/* + * id-sha1 OBJECT IDENTIFIER ::= { iso(1) + * identified-organization(3) oiw(14) + * secsig(3) algorithms(2) 26 } + */ +const unsigned char ossl_der_oid_id_sha1[DER_OID_SZ_id_sha1] = { + DER_OID_V_id_sha1 +}; + +/* + * id-md2 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } + */ +const unsigned char ossl_der_oid_id_md2[DER_OID_SZ_id_md2] = { + DER_OID_V_id_md2 +}; + +/* + * id-md5 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } + */ +const unsigned char ossl_der_oid_id_md5[DER_OID_SZ_id_md5] = { + DER_OID_V_id_md5 +}; + +/* + * id-sha256 OBJECT IDENTIFIER ::= { hashAlgs 1 } + */ +const unsigned char ossl_der_oid_id_sha256[DER_OID_SZ_id_sha256] = { + DER_OID_V_id_sha256 +}; + +/* + * id-sha384 OBJECT IDENTIFIER ::= { hashAlgs 2 } + */ +const unsigned char ossl_der_oid_id_sha384[DER_OID_SZ_id_sha384] = { + DER_OID_V_id_sha384 +}; + +/* + * id-sha512 OBJECT IDENTIFIER ::= { hashAlgs 3 } + */ +const unsigned char ossl_der_oid_id_sha512[DER_OID_SZ_id_sha512] = { + DER_OID_V_id_sha512 +}; + +/* + * id-sha224 OBJECT IDENTIFIER ::= { hashAlgs 4 } + */ +const unsigned char ossl_der_oid_id_sha224[DER_OID_SZ_id_sha224] = { + DER_OID_V_id_sha224 +}; + +/* + * id-sha512-224 OBJECT IDENTIFIER ::= { hashAlgs 5 } + */ +const unsigned char ossl_der_oid_id_sha512_224[DER_OID_SZ_id_sha512_224] = { + DER_OID_V_id_sha512_224 +}; + +/* + * id-sha512-256 OBJECT IDENTIFIER ::= { hashAlgs 6 } + */ +const unsigned char ossl_der_oid_id_sha512_256[DER_OID_SZ_id_sha512_256] = { + DER_OID_V_id_sha512_256 +}; + +/* + * id-sha3-224 OBJECT IDENTIFIER ::= { hashAlgs 7 } + */ +const unsigned char ossl_der_oid_id_sha3_224[DER_OID_SZ_id_sha3_224] = { + DER_OID_V_id_sha3_224 +}; + +/* + * id-sha3-256 OBJECT IDENTIFIER ::= { hashAlgs 8 } + */ +const unsigned char ossl_der_oid_id_sha3_256[DER_OID_SZ_id_sha3_256] = { + DER_OID_V_id_sha3_256 +}; + +/* + * id-sha3-384 OBJECT IDENTIFIER ::= { hashAlgs 9 } + */ +const unsigned char ossl_der_oid_id_sha3_384[DER_OID_SZ_id_sha3_384] = { + DER_OID_V_id_sha3_384 +}; + +/* + * id-sha3-512 OBJECT IDENTIFIER ::= { hashAlgs 10 } + */ +const unsigned char ossl_der_oid_id_sha3_512[DER_OID_SZ_id_sha3_512] = { + DER_OID_V_id_sha3_512 +}; + +/* + * id-shake128 OBJECT IDENTIFIER ::= { hashAlgs 11 } + */ +const unsigned char ossl_der_oid_id_shake128[DER_OID_SZ_id_shake128] = { + DER_OID_V_id_shake128 +}; + +/* + * id-shake256 OBJECT IDENTIFIER ::= { hashAlgs 12 } + */ +const unsigned char ossl_der_oid_id_shake256[DER_OID_SZ_id_shake256] = { + DER_OID_V_id_shake256 +}; + +/* + * id-shake128-len OBJECT IDENTIFIER ::= { hashAlgs 17 } + */ +const unsigned char ossl_der_oid_id_shake128_len[DER_OID_SZ_id_shake128_len] = { + DER_OID_V_id_shake128_len +}; + +/* + * id-shake256-len OBJECT IDENTIFIER ::= { hashAlgs 18 } + */ +const unsigned char ossl_der_oid_id_shake256_len[DER_OID_SZ_id_shake256_len] = { + DER_OID_V_id_shake256_len +}; + +/* + * id-KMACWithSHAKE128 OBJECT IDENTIFIER ::={hashAlgs 19} + */ +const unsigned char ossl_der_oid_id_KMACWithSHAKE128[DER_OID_SZ_id_KMACWithSHAKE128] = { + DER_OID_V_id_KMACWithSHAKE128 +}; + +/* + * id-KMACWithSHAKE256 OBJECT IDENTIFIER ::={ hashAlgs 20} + */ +const unsigned char ossl_der_oid_id_KMACWithSHAKE256[DER_OID_SZ_id_KMACWithSHAKE256] = { + DER_OID_V_id_KMACWithSHAKE256 +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_dsa_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_dsa_gen.c new file mode 100644 index 000000000000..025981560501 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_dsa_gen.c @@ -0,0 +1,96 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_dsa_gen.c.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * DSA low level APIs are deprecated for public use, but still ok for + * internal use. + */ +#include "internal/deprecated.h" + +#include "prov/der_dsa.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-dsa OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) x9-57(10040) x9algorithm(4) 1 } + */ +const unsigned char ossl_der_oid_id_dsa[DER_OID_SZ_id_dsa] = { + DER_OID_V_id_dsa +}; + +/* + * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) x9-57 (10040) x9algorithm(4) 3 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha1[DER_OID_SZ_id_dsa_with_sha1] = { + DER_OID_V_id_dsa_with_sha1 +}; + +/* + * id-dsa-with-sha224 OBJECT IDENTIFIER ::= { sigAlgs 1 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha224[DER_OID_SZ_id_dsa_with_sha224] = { + DER_OID_V_id_dsa_with_sha224 +}; + +/* + * id-dsa-with-sha256 OBJECT IDENTIFIER ::= { sigAlgs 2 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha256[DER_OID_SZ_id_dsa_with_sha256] = { + DER_OID_V_id_dsa_with_sha256 +}; + +/* + * id-dsa-with-sha384 OBJECT IDENTIFIER ::= { sigAlgs 3 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha384[DER_OID_SZ_id_dsa_with_sha384] = { + DER_OID_V_id_dsa_with_sha384 +}; + +/* + * id-dsa-with-sha512 OBJECT IDENTIFIER ::= { sigAlgs 4 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha512[DER_OID_SZ_id_dsa_with_sha512] = { + DER_OID_V_id_dsa_with_sha512 +}; + +/* + * id-dsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 5 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha3_224[DER_OID_SZ_id_dsa_with_sha3_224] = { + DER_OID_V_id_dsa_with_sha3_224 +}; + +/* + * id-dsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 6 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha3_256[DER_OID_SZ_id_dsa_with_sha3_256] = { + DER_OID_V_id_dsa_with_sha3_256 +}; + +/* + * id-dsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 7 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha3_384[DER_OID_SZ_id_dsa_with_sha3_384] = { + DER_OID_V_id_dsa_with_sha3_384 +}; + +/* + * id-dsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 8 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha3_512[DER_OID_SZ_id_dsa_with_sha3_512] = { + DER_OID_V_id_dsa_with_sha3_512 +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_ec_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_ec_gen.c new file mode 100644 index 000000000000..49ce209ec40a --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_ec_gen.c @@ -0,0 +1,281 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_ec_gen.c.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_ec.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { id-ecSigType 1 } + */ +const unsigned char ossl_der_oid_ecdsa_with_SHA1[DER_OID_SZ_ecdsa_with_SHA1] = { + DER_OID_V_ecdsa_with_SHA1 +}; + +/* + * id-ecPublicKey OBJECT IDENTIFIER ::= { id-publicKeyType 1 } + */ +const unsigned char ossl_der_oid_id_ecPublicKey[DER_OID_SZ_id_ecPublicKey] = { + DER_OID_V_id_ecPublicKey +}; + +/* + * c2pnb163v1 OBJECT IDENTIFIER ::= { c-TwoCurve 1 } + */ +const unsigned char ossl_der_oid_c2pnb163v1[DER_OID_SZ_c2pnb163v1] = { + DER_OID_V_c2pnb163v1 +}; + +/* + * c2pnb163v2 OBJECT IDENTIFIER ::= { c-TwoCurve 2 } + */ +const unsigned char ossl_der_oid_c2pnb163v2[DER_OID_SZ_c2pnb163v2] = { + DER_OID_V_c2pnb163v2 +}; + +/* + * c2pnb163v3 OBJECT IDENTIFIER ::= { c-TwoCurve 3 } + */ +const unsigned char ossl_der_oid_c2pnb163v3[DER_OID_SZ_c2pnb163v3] = { + DER_OID_V_c2pnb163v3 +}; + +/* + * c2pnb176w1 OBJECT IDENTIFIER ::= { c-TwoCurve 4 } + */ +const unsigned char ossl_der_oid_c2pnb176w1[DER_OID_SZ_c2pnb176w1] = { + DER_OID_V_c2pnb176w1 +}; + +/* + * c2tnb191v1 OBJECT IDENTIFIER ::= { c-TwoCurve 5 } + */ +const unsigned char ossl_der_oid_c2tnb191v1[DER_OID_SZ_c2tnb191v1] = { + DER_OID_V_c2tnb191v1 +}; + +/* + * c2tnb191v2 OBJECT IDENTIFIER ::= { c-TwoCurve 6 } + */ +const unsigned char ossl_der_oid_c2tnb191v2[DER_OID_SZ_c2tnb191v2] = { + DER_OID_V_c2tnb191v2 +}; + +/* + * c2tnb191v3 OBJECT IDENTIFIER ::= { c-TwoCurve 7 } + */ +const unsigned char ossl_der_oid_c2tnb191v3[DER_OID_SZ_c2tnb191v3] = { + DER_OID_V_c2tnb191v3 +}; + +/* + * c2onb191v4 OBJECT IDENTIFIER ::= { c-TwoCurve 8 } + */ +const unsigned char ossl_der_oid_c2onb191v4[DER_OID_SZ_c2onb191v4] = { + DER_OID_V_c2onb191v4 +}; + +/* + * c2onb191v5 OBJECT IDENTIFIER ::= { c-TwoCurve 9 } + */ +const unsigned char ossl_der_oid_c2onb191v5[DER_OID_SZ_c2onb191v5] = { + DER_OID_V_c2onb191v5 +}; + +/* + * c2pnb208w1 OBJECT IDENTIFIER ::= { c-TwoCurve 10 } + */ +const unsigned char ossl_der_oid_c2pnb208w1[DER_OID_SZ_c2pnb208w1] = { + DER_OID_V_c2pnb208w1 +}; + +/* + * c2tnb239v1 OBJECT IDENTIFIER ::= { c-TwoCurve 11 } + */ +const unsigned char ossl_der_oid_c2tnb239v1[DER_OID_SZ_c2tnb239v1] = { + DER_OID_V_c2tnb239v1 +}; + +/* + * c2tnb239v2 OBJECT IDENTIFIER ::= { c-TwoCurve 12 } + */ +const unsigned char ossl_der_oid_c2tnb239v2[DER_OID_SZ_c2tnb239v2] = { + DER_OID_V_c2tnb239v2 +}; + +/* + * c2tnb239v3 OBJECT IDENTIFIER ::= { c-TwoCurve 13 } + */ +const unsigned char ossl_der_oid_c2tnb239v3[DER_OID_SZ_c2tnb239v3] = { + DER_OID_V_c2tnb239v3 +}; + +/* + * c2onb239v4 OBJECT IDENTIFIER ::= { c-TwoCurve 14 } + */ +const unsigned char ossl_der_oid_c2onb239v4[DER_OID_SZ_c2onb239v4] = { + DER_OID_V_c2onb239v4 +}; + +/* + * c2onb239v5 OBJECT IDENTIFIER ::= { c-TwoCurve 15 } + */ +const unsigned char ossl_der_oid_c2onb239v5[DER_OID_SZ_c2onb239v5] = { + DER_OID_V_c2onb239v5 +}; + +/* + * c2pnb272w1 OBJECT IDENTIFIER ::= { c-TwoCurve 16 } + */ +const unsigned char ossl_der_oid_c2pnb272w1[DER_OID_SZ_c2pnb272w1] = { + DER_OID_V_c2pnb272w1 +}; + +/* + * c2pnb304w1 OBJECT IDENTIFIER ::= { c-TwoCurve 17 } + */ +const unsigned char ossl_der_oid_c2pnb304w1[DER_OID_SZ_c2pnb304w1] = { + DER_OID_V_c2pnb304w1 +}; + +/* + * c2tnb359v1 OBJECT IDENTIFIER ::= { c-TwoCurve 18 } + */ +const unsigned char ossl_der_oid_c2tnb359v1[DER_OID_SZ_c2tnb359v1] = { + DER_OID_V_c2tnb359v1 +}; + +/* + * c2pnb368w1 OBJECT IDENTIFIER ::= { c-TwoCurve 19 } + */ +const unsigned char ossl_der_oid_c2pnb368w1[DER_OID_SZ_c2pnb368w1] = { + DER_OID_V_c2pnb368w1 +}; + +/* + * c2tnb431r1 OBJECT IDENTIFIER ::= { c-TwoCurve 20 } + */ +const unsigned char ossl_der_oid_c2tnb431r1[DER_OID_SZ_c2tnb431r1] = { + DER_OID_V_c2tnb431r1 +}; + +/* + * prime192v1 OBJECT IDENTIFIER ::= { primeCurve 1 } + */ +const unsigned char ossl_der_oid_prime192v1[DER_OID_SZ_prime192v1] = { + DER_OID_V_prime192v1 +}; + +/* + * prime192v2 OBJECT IDENTIFIER ::= { primeCurve 2 } + */ +const unsigned char ossl_der_oid_prime192v2[DER_OID_SZ_prime192v2] = { + DER_OID_V_prime192v2 +}; + +/* + * prime192v3 OBJECT IDENTIFIER ::= { primeCurve 3 } + */ +const unsigned char ossl_der_oid_prime192v3[DER_OID_SZ_prime192v3] = { + DER_OID_V_prime192v3 +}; + +/* + * prime239v1 OBJECT IDENTIFIER ::= { primeCurve 4 } + */ +const unsigned char ossl_der_oid_prime239v1[DER_OID_SZ_prime239v1] = { + DER_OID_V_prime239v1 +}; + +/* + * prime239v2 OBJECT IDENTIFIER ::= { primeCurve 5 } + */ +const unsigned char ossl_der_oid_prime239v2[DER_OID_SZ_prime239v2] = { + DER_OID_V_prime239v2 +}; + +/* + * prime239v3 OBJECT IDENTIFIER ::= { primeCurve 6 } + */ +const unsigned char ossl_der_oid_prime239v3[DER_OID_SZ_prime239v3] = { + DER_OID_V_prime239v3 +}; + +/* + * prime256v1 OBJECT IDENTIFIER ::= { primeCurve 7 } + */ +const unsigned char ossl_der_oid_prime256v1[DER_OID_SZ_prime256v1] = { + DER_OID_V_prime256v1 +}; + +/* + * ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 1 } + */ +const unsigned char ossl_der_oid_ecdsa_with_SHA224[DER_OID_SZ_ecdsa_with_SHA224] = { + DER_OID_V_ecdsa_with_SHA224 +}; + +/* + * ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } + */ +const unsigned char ossl_der_oid_ecdsa_with_SHA256[DER_OID_SZ_ecdsa_with_SHA256] = { + DER_OID_V_ecdsa_with_SHA256 +}; + +/* + * ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } + */ +const unsigned char ossl_der_oid_ecdsa_with_SHA384[DER_OID_SZ_ecdsa_with_SHA384] = { + DER_OID_V_ecdsa_with_SHA384 +}; + +/* + * ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } + */ +const unsigned char ossl_der_oid_ecdsa_with_SHA512[DER_OID_SZ_ecdsa_with_SHA512] = { + DER_OID_V_ecdsa_with_SHA512 +}; + +/* + * id-ecdsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 9 } + */ +const unsigned char ossl_der_oid_id_ecdsa_with_sha3_224[DER_OID_SZ_id_ecdsa_with_sha3_224] = { + DER_OID_V_id_ecdsa_with_sha3_224 +}; + +/* + * id-ecdsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 10 } + */ +const unsigned char ossl_der_oid_id_ecdsa_with_sha3_256[DER_OID_SZ_id_ecdsa_with_sha3_256] = { + DER_OID_V_id_ecdsa_with_sha3_256 +}; + +/* + * id-ecdsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 11 } + */ +const unsigned char ossl_der_oid_id_ecdsa_with_sha3_384[DER_OID_SZ_id_ecdsa_with_sha3_384] = { + DER_OID_V_id_ecdsa_with_sha3_384 +}; + +/* + * id-ecdsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 12 } + */ +const unsigned char ossl_der_oid_id_ecdsa_with_sha3_512[DER_OID_SZ_id_ecdsa_with_sha3_512] = { + DER_OID_V_id_ecdsa_with_sha3_512 +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_ecx_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_ecx_gen.c new file mode 100644 index 000000000000..64d73e3fc525 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_ecx_gen.c @@ -0,0 +1,46 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_ecx_gen.c.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_ecx.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-X25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 110 } + */ +const unsigned char ossl_der_oid_id_X25519[DER_OID_SZ_id_X25519] = { + DER_OID_V_id_X25519 +}; + +/* + * id-X448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 111 } + */ +const unsigned char ossl_der_oid_id_X448[DER_OID_SZ_id_X448] = { + DER_OID_V_id_X448 +}; + +/* + * id-Ed25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 112 } + */ +const unsigned char ossl_der_oid_id_Ed25519[DER_OID_SZ_id_Ed25519] = { + DER_OID_V_id_Ed25519 +}; + +/* + * id-Ed448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 113 } + */ +const unsigned char ossl_der_oid_id_Ed448[DER_OID_SZ_id_Ed448] = { + DER_OID_V_id_Ed448 +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_ml_dsa_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_ml_dsa_gen.c new file mode 100644 index 000000000000..69f4e8521231 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_ml_dsa_gen.c @@ -0,0 +1,39 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_ml_dsa_gen.c.in + * + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_ml_dsa.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-ml-dsa-44 OBJECT IDENTIFIER ::= { sigAlgs 17 } + */ +const unsigned char ossl_der_oid_id_ml_dsa_44[DER_OID_SZ_id_ml_dsa_44] = { + DER_OID_V_id_ml_dsa_44 +}; + +/* + * id-ml-dsa-65 OBJECT IDENTIFIER ::= { sigAlgs 18 } + */ +const unsigned char ossl_der_oid_id_ml_dsa_65[DER_OID_SZ_id_ml_dsa_65] = { + DER_OID_V_id_ml_dsa_65 +}; + +/* + * id-ml-dsa-87 OBJECT IDENTIFIER ::= { sigAlgs 19 } + */ +const unsigned char ossl_der_oid_id_ml_dsa_87[DER_OID_SZ_id_ml_dsa_87] = { + DER_OID_V_id_ml_dsa_87 +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_rsa_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_rsa_gen.c new file mode 100644 index 000000000000..911b6e58936f --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_rsa_gen.c @@ -0,0 +1,176 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_rsa_gen.c.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_rsa.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * hashAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 2 } + */ +const unsigned char ossl_der_oid_hashAlgs[DER_OID_SZ_hashAlgs] = { + DER_OID_V_hashAlgs +}; + +/* + * rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } + */ +const unsigned char ossl_der_oid_rsaEncryption[DER_OID_SZ_rsaEncryption] = { + DER_OID_V_rsaEncryption +}; + +/* + * id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 } + */ +const unsigned char ossl_der_oid_id_RSAES_OAEP[DER_OID_SZ_id_RSAES_OAEP] = { + DER_OID_V_id_RSAES_OAEP +}; + +/* + * id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 } + */ +const unsigned char ossl_der_oid_id_pSpecified[DER_OID_SZ_id_pSpecified] = { + DER_OID_V_id_pSpecified +}; + +/* + * id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } + */ +const unsigned char ossl_der_oid_id_RSASSA_PSS[DER_OID_SZ_id_RSASSA_PSS] = { + DER_OID_V_id_RSASSA_PSS +}; + +/* + * md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } + */ +const unsigned char ossl_der_oid_md2WithRSAEncryption[DER_OID_SZ_md2WithRSAEncryption] = { + DER_OID_V_md2WithRSAEncryption +}; + +/* + * md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } + */ +const unsigned char ossl_der_oid_md5WithRSAEncryption[DER_OID_SZ_md5WithRSAEncryption] = { + DER_OID_V_md5WithRSAEncryption +}; + +/* + * sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } + */ +const unsigned char ossl_der_oid_sha1WithRSAEncryption[DER_OID_SZ_sha1WithRSAEncryption] = { + DER_OID_V_sha1WithRSAEncryption +}; + +/* + * sha224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 14 } + */ +const unsigned char ossl_der_oid_sha224WithRSAEncryption[DER_OID_SZ_sha224WithRSAEncryption] = { + DER_OID_V_sha224WithRSAEncryption +}; + +/* + * sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } + */ +const unsigned char ossl_der_oid_sha256WithRSAEncryption[DER_OID_SZ_sha256WithRSAEncryption] = { + DER_OID_V_sha256WithRSAEncryption +}; + +/* + * sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } + */ +const unsigned char ossl_der_oid_sha384WithRSAEncryption[DER_OID_SZ_sha384WithRSAEncryption] = { + DER_OID_V_sha384WithRSAEncryption +}; + +/* + * sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } + */ +const unsigned char ossl_der_oid_sha512WithRSAEncryption[DER_OID_SZ_sha512WithRSAEncryption] = { + DER_OID_V_sha512WithRSAEncryption +}; + +/* + * sha512-224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 15 } + */ +const unsigned char ossl_der_oid_sha512_224WithRSAEncryption[DER_OID_SZ_sha512_224WithRSAEncryption] = { + DER_OID_V_sha512_224WithRSAEncryption +}; + +/* + * sha512-256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 16 } + */ +const unsigned char ossl_der_oid_sha512_256WithRSAEncryption[DER_OID_SZ_sha512_256WithRSAEncryption] = { + DER_OID_V_sha512_256WithRSAEncryption +}; + +/* + * id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 } + */ +const unsigned char ossl_der_oid_id_mgf1[DER_OID_SZ_id_mgf1] = { + DER_OID_V_id_mgf1 +}; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 13 } + */ +const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_224[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224] = { + DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_224 +}; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 14 } + */ +const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_256[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256] = { + DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_256 +}; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 15 } + */ +const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_384[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384] = { + DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_384 +}; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 16 } + */ +const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_512[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512] = { + DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_512 +}; + +/* + * md4WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 3 } + */ +const unsigned char ossl_der_oid_md4WithRSAEncryption[DER_OID_SZ_md4WithRSAEncryption] = { + DER_OID_V_md4WithRSAEncryption +}; + +/* + * ripemd160WithRSAEncryption OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) teletrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) 2 + * } + */ +const unsigned char ossl_der_oid_ripemd160WithRSAEncryption[DER_OID_SZ_ripemd160WithRSAEncryption] = { + DER_OID_V_ripemd160WithRSAEncryption +}; + +/* + * mdc2WithRSASignature OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) mdc2WithRSASignature(14) + * } + */ +const unsigned char ossl_der_oid_mdc2WithRSASignature[DER_OID_SZ_mdc2WithRSASignature] = { + DER_OID_V_mdc2WithRSASignature +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_slh_dsa_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_slh_dsa_gen.c new file mode 100644 index 000000000000..81adc3b65869 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_slh_dsa_gen.c @@ -0,0 +1,102 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_slh_dsa_gen.c.in + * + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_slh_dsa.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-slh-dsa-sha2-128s OBJECT IDENTIFIER ::= { sigAlgs 20 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_128s[DER_OID_SZ_id_slh_dsa_sha2_128s] = { + DER_OID_V_id_slh_dsa_sha2_128s +}; + +/* + * id-slh-dsa-sha2-128f OBJECT IDENTIFIER ::= { sigAlgs 21 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_128f[DER_OID_SZ_id_slh_dsa_sha2_128f] = { + DER_OID_V_id_slh_dsa_sha2_128f +}; + +/* + * id-slh-dsa-sha2-192s OBJECT IDENTIFIER ::= { sigAlgs 22 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_192s[DER_OID_SZ_id_slh_dsa_sha2_192s] = { + DER_OID_V_id_slh_dsa_sha2_192s +}; + +/* + * id-slh-dsa-sha2-192f OBJECT IDENTIFIER ::= { sigAlgs 23 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_192f[DER_OID_SZ_id_slh_dsa_sha2_192f] = { + DER_OID_V_id_slh_dsa_sha2_192f +}; + +/* + * id-slh-dsa-sha2-256s OBJECT IDENTIFIER ::= { sigAlgs 24 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_256s[DER_OID_SZ_id_slh_dsa_sha2_256s] = { + DER_OID_V_id_slh_dsa_sha2_256s +}; + +/* + * id-slh-dsa-sha2-256f OBJECT IDENTIFIER ::= { sigAlgs 25 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_256f[DER_OID_SZ_id_slh_dsa_sha2_256f] = { + DER_OID_V_id_slh_dsa_sha2_256f +}; + +/* + * id-slh-dsa-shake-128s OBJECT IDENTIFIER ::= { sigAlgs 26 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_128s[DER_OID_SZ_id_slh_dsa_shake_128s] = { + DER_OID_V_id_slh_dsa_shake_128s +}; + +/* + * id-slh-dsa-shake-128f OBJECT IDENTIFIER ::= { sigAlgs 27 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_128f[DER_OID_SZ_id_slh_dsa_shake_128f] = { + DER_OID_V_id_slh_dsa_shake_128f +}; + +/* + * id-slh-dsa-shake-192s OBJECT IDENTIFIER ::= { sigAlgs 28 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_192s[DER_OID_SZ_id_slh_dsa_shake_192s] = { + DER_OID_V_id_slh_dsa_shake_192s +}; + +/* + * id-slh-dsa-shake-192f OBJECT IDENTIFIER ::= { sigAlgs 29 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_192f[DER_OID_SZ_id_slh_dsa_shake_192f] = { + DER_OID_V_id_slh_dsa_shake_192f +}; + +/* + * id-slh-dsa-shake-256s OBJECT IDENTIFIER ::= { sigAlgs 30 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_256s[DER_OID_SZ_id_slh_dsa_shake_256s] = { + DER_OID_V_id_slh_dsa_shake_256s +}; + +/* + * id-slh-dsa-shake-256f OBJECT IDENTIFIER ::= { sigAlgs 31 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_256f[DER_OID_SZ_id_slh_dsa_shake_256f] = { + DER_OID_V_id_slh_dsa_shake_256f +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_sm2_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_sm2_gen.c new file mode 100644 index 000000000000..6488058af2d2 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_sm2_gen.c @@ -0,0 +1,32 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_sm2_gen.c.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_sm2.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * sm2-with-SM3 OBJECT IDENTIFIER ::= { sm-scheme 501 } + */ +const unsigned char ossl_der_oid_sm2_with_SM3[DER_OID_SZ_sm2_with_SM3] = { + DER_OID_V_sm2_with_SM3 +}; + +/* + * curveSM2 OBJECT IDENTIFIER ::= { sm-scheme 301 } + */ +const unsigned char ossl_der_oid_curveSM2[DER_OID_SZ_curveSM2] = { + DER_OID_V_curveSM2 +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_wrap_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_wrap_gen.c new file mode 100644 index 000000000000..def5c3524185 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/der/der_wrap_gen.c @@ -0,0 +1,48 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_wrap_gen.c.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_wrap.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-alg-CMS3DESwrap OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) alg(3) 6 + * } + */ +const unsigned char ossl_der_oid_id_alg_CMS3DESwrap[DER_OID_SZ_id_alg_CMS3DESwrap] = { + DER_OID_V_id_alg_CMS3DESwrap +}; + +/* + * id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } + */ +const unsigned char ossl_der_oid_id_aes128_wrap[DER_OID_SZ_id_aes128_wrap] = { + DER_OID_V_id_aes128_wrap +}; + +/* + * id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } + */ +const unsigned char ossl_der_oid_id_aes192_wrap[DER_OID_SZ_id_aes192_wrap] = { + DER_OID_V_id_aes192_wrap +}; + +/* + * id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } + */ +const unsigned char ossl_der_oid_id_aes256_wrap[DER_OID_SZ_id_aes256_wrap] = { + DER_OID_V_id_aes256_wrap +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_digests.h b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_digests.h new file mode 100644 index 000000000000..c6531033f279 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_digests.h @@ -0,0 +1,162 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_digests.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/der.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * sigAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 3 } + */ +#define DER_OID_V_sigAlgs DER_P_OBJECT, 8, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03 +#define DER_OID_SZ_sigAlgs 10 +extern const unsigned char ossl_der_oid_sigAlgs[DER_OID_SZ_sigAlgs]; + +/* + * id-sha1 OBJECT IDENTIFIER ::= { iso(1) + * identified-organization(3) oiw(14) + * secsig(3) algorithms(2) 26 } + */ +#define DER_OID_V_id_sha1 DER_P_OBJECT, 5, 0x2B, 0x0E, 0x03, 0x02, 0x1A +#define DER_OID_SZ_id_sha1 7 +extern const unsigned char ossl_der_oid_id_sha1[DER_OID_SZ_id_sha1]; + +/* + * id-md2 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } + */ +#define DER_OID_V_id_md2 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x02 +#define DER_OID_SZ_id_md2 10 +extern const unsigned char ossl_der_oid_id_md2[DER_OID_SZ_id_md2]; + +/* + * id-md5 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } + */ +#define DER_OID_V_id_md5 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x05 +#define DER_OID_SZ_id_md5 10 +extern const unsigned char ossl_der_oid_id_md5[DER_OID_SZ_id_md5]; + +/* + * id-sha256 OBJECT IDENTIFIER ::= { hashAlgs 1 } + */ +#define DER_OID_V_id_sha256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01 +#define DER_OID_SZ_id_sha256 11 +extern const unsigned char ossl_der_oid_id_sha256[DER_OID_SZ_id_sha256]; + +/* + * id-sha384 OBJECT IDENTIFIER ::= { hashAlgs 2 } + */ +#define DER_OID_V_id_sha384 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02 +#define DER_OID_SZ_id_sha384 11 +extern const unsigned char ossl_der_oid_id_sha384[DER_OID_SZ_id_sha384]; + +/* + * id-sha512 OBJECT IDENTIFIER ::= { hashAlgs 3 } + */ +#define DER_OID_V_id_sha512 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03 +#define DER_OID_SZ_id_sha512 11 +extern const unsigned char ossl_der_oid_id_sha512[DER_OID_SZ_id_sha512]; + +/* + * id-sha224 OBJECT IDENTIFIER ::= { hashAlgs 4 } + */ +#define DER_OID_V_id_sha224 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04 +#define DER_OID_SZ_id_sha224 11 +extern const unsigned char ossl_der_oid_id_sha224[DER_OID_SZ_id_sha224]; + +/* + * id-sha512-224 OBJECT IDENTIFIER ::= { hashAlgs 5 } + */ +#define DER_OID_V_id_sha512_224 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x05 +#define DER_OID_SZ_id_sha512_224 11 +extern const unsigned char ossl_der_oid_id_sha512_224[DER_OID_SZ_id_sha512_224]; + +/* + * id-sha512-256 OBJECT IDENTIFIER ::= { hashAlgs 6 } + */ +#define DER_OID_V_id_sha512_256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x06 +#define DER_OID_SZ_id_sha512_256 11 +extern const unsigned char ossl_der_oid_id_sha512_256[DER_OID_SZ_id_sha512_256]; + +/* + * id-sha3-224 OBJECT IDENTIFIER ::= { hashAlgs 7 } + */ +#define DER_OID_V_id_sha3_224 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x07 +#define DER_OID_SZ_id_sha3_224 11 +extern const unsigned char ossl_der_oid_id_sha3_224[DER_OID_SZ_id_sha3_224]; + +/* + * id-sha3-256 OBJECT IDENTIFIER ::= { hashAlgs 8 } + */ +#define DER_OID_V_id_sha3_256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x08 +#define DER_OID_SZ_id_sha3_256 11 +extern const unsigned char ossl_der_oid_id_sha3_256[DER_OID_SZ_id_sha3_256]; + +/* + * id-sha3-384 OBJECT IDENTIFIER ::= { hashAlgs 9 } + */ +#define DER_OID_V_id_sha3_384 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x09 +#define DER_OID_SZ_id_sha3_384 11 +extern const unsigned char ossl_der_oid_id_sha3_384[DER_OID_SZ_id_sha3_384]; + +/* + * id-sha3-512 OBJECT IDENTIFIER ::= { hashAlgs 10 } + */ +#define DER_OID_V_id_sha3_512 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0A +#define DER_OID_SZ_id_sha3_512 11 +extern const unsigned char ossl_der_oid_id_sha3_512[DER_OID_SZ_id_sha3_512]; + +/* + * id-shake128 OBJECT IDENTIFIER ::= { hashAlgs 11 } + */ +#define DER_OID_V_id_shake128 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0B +#define DER_OID_SZ_id_shake128 11 +extern const unsigned char ossl_der_oid_id_shake128[DER_OID_SZ_id_shake128]; + +/* + * id-shake256 OBJECT IDENTIFIER ::= { hashAlgs 12 } + */ +#define DER_OID_V_id_shake256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0C +#define DER_OID_SZ_id_shake256 11 +extern const unsigned char ossl_der_oid_id_shake256[DER_OID_SZ_id_shake256]; + +/* + * id-shake128-len OBJECT IDENTIFIER ::= { hashAlgs 17 } + */ +#define DER_OID_V_id_shake128_len DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x11 +#define DER_OID_SZ_id_shake128_len 11 +extern const unsigned char ossl_der_oid_id_shake128_len[DER_OID_SZ_id_shake128_len]; + +/* + * id-shake256-len OBJECT IDENTIFIER ::= { hashAlgs 18 } + */ +#define DER_OID_V_id_shake256_len DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x12 +#define DER_OID_SZ_id_shake256_len 11 +extern const unsigned char ossl_der_oid_id_shake256_len[DER_OID_SZ_id_shake256_len]; + +/* + * id-KMACWithSHAKE128 OBJECT IDENTIFIER ::={hashAlgs 19} + */ +#define DER_OID_V_id_KMACWithSHAKE128 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x13 +#define DER_OID_SZ_id_KMACWithSHAKE128 11 +extern const unsigned char ossl_der_oid_id_KMACWithSHAKE128[DER_OID_SZ_id_KMACWithSHAKE128]; + +/* + * id-KMACWithSHAKE256 OBJECT IDENTIFIER ::={ hashAlgs 20} + */ +#define DER_OID_V_id_KMACWithSHAKE256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x14 +#define DER_OID_SZ_id_KMACWithSHAKE256 11 +extern const unsigned char ossl_der_oid_id_KMACWithSHAKE256[DER_OID_SZ_id_KMACWithSHAKE256]; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_dsa.h b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_dsa.h new file mode 100644 index 000000000000..3dcd57ebec43 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_dsa.h @@ -0,0 +1,96 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_dsa.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/der.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-dsa OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) x9-57(10040) x9algorithm(4) 1 } + */ +#define DER_OID_V_id_dsa DER_P_OBJECT, 7, 0x2A, 0x86, 0x48, 0xCE, 0x38, 0x04, 0x01 +#define DER_OID_SZ_id_dsa 9 +extern const unsigned char ossl_der_oid_id_dsa[DER_OID_SZ_id_dsa]; + +/* + * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) x9-57 (10040) x9algorithm(4) 3 } + */ +#define DER_OID_V_id_dsa_with_sha1 DER_P_OBJECT, 7, 0x2A, 0x86, 0x48, 0xCE, 0x38, 0x04, 0x03 +#define DER_OID_SZ_id_dsa_with_sha1 9 +extern const unsigned char ossl_der_oid_id_dsa_with_sha1[DER_OID_SZ_id_dsa_with_sha1]; + +/* + * id-dsa-with-sha224 OBJECT IDENTIFIER ::= { sigAlgs 1 } + */ +#define DER_OID_V_id_dsa_with_sha224 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x01 +#define DER_OID_SZ_id_dsa_with_sha224 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha224[DER_OID_SZ_id_dsa_with_sha224]; + +/* + * id-dsa-with-sha256 OBJECT IDENTIFIER ::= { sigAlgs 2 } + */ +#define DER_OID_V_id_dsa_with_sha256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x02 +#define DER_OID_SZ_id_dsa_with_sha256 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha256[DER_OID_SZ_id_dsa_with_sha256]; + +/* + * id-dsa-with-sha384 OBJECT IDENTIFIER ::= { sigAlgs 3 } + */ +#define DER_OID_V_id_dsa_with_sha384 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x03 +#define DER_OID_SZ_id_dsa_with_sha384 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha384[DER_OID_SZ_id_dsa_with_sha384]; + +/* + * id-dsa-with-sha512 OBJECT IDENTIFIER ::= { sigAlgs 4 } + */ +#define DER_OID_V_id_dsa_with_sha512 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x04 +#define DER_OID_SZ_id_dsa_with_sha512 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha512[DER_OID_SZ_id_dsa_with_sha512]; + +/* + * id-dsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 5 } + */ +#define DER_OID_V_id_dsa_with_sha3_224 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x05 +#define DER_OID_SZ_id_dsa_with_sha3_224 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha3_224[DER_OID_SZ_id_dsa_with_sha3_224]; + +/* + * id-dsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 6 } + */ +#define DER_OID_V_id_dsa_with_sha3_256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x06 +#define DER_OID_SZ_id_dsa_with_sha3_256 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha3_256[DER_OID_SZ_id_dsa_with_sha3_256]; + +/* + * id-dsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 7 } + */ +#define DER_OID_V_id_dsa_with_sha3_384 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x07 +#define DER_OID_SZ_id_dsa_with_sha3_384 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha3_384[DER_OID_SZ_id_dsa_with_sha3_384]; + +/* + * id-dsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 8 } + */ +#define DER_OID_V_id_dsa_with_sha3_512 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x08 +#define DER_OID_SZ_id_dsa_with_sha3_512 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha3_512[DER_OID_SZ_id_dsa_with_sha3_512]; + +/* clang-format on */ + +/* Subject Public Key Info */ +int ossl_DER_w_algorithmIdentifier_DSA(WPACKET *pkt, int tag, DSA *dsa); +/* Signature */ +int ossl_DER_w_algorithmIdentifier_DSA_with_MD(WPACKET *pkt, int tag, + DSA *dsa, int mdnid); diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_ec.h b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_ec.h new file mode 100644 index 000000000000..059c77d38ea7 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_ec.h @@ -0,0 +1,288 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_ec.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "crypto/ec.h" +#include "internal/der.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { id-ecSigType 1 } + */ +#define DER_OID_V_ecdsa_with_SHA1 DER_P_OBJECT, 7, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x01 +#define DER_OID_SZ_ecdsa_with_SHA1 9 +extern const unsigned char ossl_der_oid_ecdsa_with_SHA1[DER_OID_SZ_ecdsa_with_SHA1]; + +/* + * id-ecPublicKey OBJECT IDENTIFIER ::= { id-publicKeyType 1 } + */ +#define DER_OID_V_id_ecPublicKey DER_P_OBJECT, 7, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01 +#define DER_OID_SZ_id_ecPublicKey 9 +extern const unsigned char ossl_der_oid_id_ecPublicKey[DER_OID_SZ_id_ecPublicKey]; + +/* + * c2pnb163v1 OBJECT IDENTIFIER ::= { c-TwoCurve 1 } + */ +#define DER_OID_V_c2pnb163v1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x01 +#define DER_OID_SZ_c2pnb163v1 10 +extern const unsigned char ossl_der_oid_c2pnb163v1[DER_OID_SZ_c2pnb163v1]; + +/* + * c2pnb163v2 OBJECT IDENTIFIER ::= { c-TwoCurve 2 } + */ +#define DER_OID_V_c2pnb163v2 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x02 +#define DER_OID_SZ_c2pnb163v2 10 +extern const unsigned char ossl_der_oid_c2pnb163v2[DER_OID_SZ_c2pnb163v2]; + +/* + * c2pnb163v3 OBJECT IDENTIFIER ::= { c-TwoCurve 3 } + */ +#define DER_OID_V_c2pnb163v3 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x03 +#define DER_OID_SZ_c2pnb163v3 10 +extern const unsigned char ossl_der_oid_c2pnb163v3[DER_OID_SZ_c2pnb163v3]; + +/* + * c2pnb176w1 OBJECT IDENTIFIER ::= { c-TwoCurve 4 } + */ +#define DER_OID_V_c2pnb176w1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x04 +#define DER_OID_SZ_c2pnb176w1 10 +extern const unsigned char ossl_der_oid_c2pnb176w1[DER_OID_SZ_c2pnb176w1]; + +/* + * c2tnb191v1 OBJECT IDENTIFIER ::= { c-TwoCurve 5 } + */ +#define DER_OID_V_c2tnb191v1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x05 +#define DER_OID_SZ_c2tnb191v1 10 +extern const unsigned char ossl_der_oid_c2tnb191v1[DER_OID_SZ_c2tnb191v1]; + +/* + * c2tnb191v2 OBJECT IDENTIFIER ::= { c-TwoCurve 6 } + */ +#define DER_OID_V_c2tnb191v2 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x06 +#define DER_OID_SZ_c2tnb191v2 10 +extern const unsigned char ossl_der_oid_c2tnb191v2[DER_OID_SZ_c2tnb191v2]; + +/* + * c2tnb191v3 OBJECT IDENTIFIER ::= { c-TwoCurve 7 } + */ +#define DER_OID_V_c2tnb191v3 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x07 +#define DER_OID_SZ_c2tnb191v3 10 +extern const unsigned char ossl_der_oid_c2tnb191v3[DER_OID_SZ_c2tnb191v3]; + +/* + * c2onb191v4 OBJECT IDENTIFIER ::= { c-TwoCurve 8 } + */ +#define DER_OID_V_c2onb191v4 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x08 +#define DER_OID_SZ_c2onb191v4 10 +extern const unsigned char ossl_der_oid_c2onb191v4[DER_OID_SZ_c2onb191v4]; + +/* + * c2onb191v5 OBJECT IDENTIFIER ::= { c-TwoCurve 9 } + */ +#define DER_OID_V_c2onb191v5 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x09 +#define DER_OID_SZ_c2onb191v5 10 +extern const unsigned char ossl_der_oid_c2onb191v5[DER_OID_SZ_c2onb191v5]; + +/* + * c2pnb208w1 OBJECT IDENTIFIER ::= { c-TwoCurve 10 } + */ +#define DER_OID_V_c2pnb208w1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x0A +#define DER_OID_SZ_c2pnb208w1 10 +extern const unsigned char ossl_der_oid_c2pnb208w1[DER_OID_SZ_c2pnb208w1]; + +/* + * c2tnb239v1 OBJECT IDENTIFIER ::= { c-TwoCurve 11 } + */ +#define DER_OID_V_c2tnb239v1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x0B +#define DER_OID_SZ_c2tnb239v1 10 +extern const unsigned char ossl_der_oid_c2tnb239v1[DER_OID_SZ_c2tnb239v1]; + +/* + * c2tnb239v2 OBJECT IDENTIFIER ::= { c-TwoCurve 12 } + */ +#define DER_OID_V_c2tnb239v2 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x0C +#define DER_OID_SZ_c2tnb239v2 10 +extern const unsigned char ossl_der_oid_c2tnb239v2[DER_OID_SZ_c2tnb239v2]; + +/* + * c2tnb239v3 OBJECT IDENTIFIER ::= { c-TwoCurve 13 } + */ +#define DER_OID_V_c2tnb239v3 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x0D +#define DER_OID_SZ_c2tnb239v3 10 +extern const unsigned char ossl_der_oid_c2tnb239v3[DER_OID_SZ_c2tnb239v3]; + +/* + * c2onb239v4 OBJECT IDENTIFIER ::= { c-TwoCurve 14 } + */ +#define DER_OID_V_c2onb239v4 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x0E +#define DER_OID_SZ_c2onb239v4 10 +extern const unsigned char ossl_der_oid_c2onb239v4[DER_OID_SZ_c2onb239v4]; + +/* + * c2onb239v5 OBJECT IDENTIFIER ::= { c-TwoCurve 15 } + */ +#define DER_OID_V_c2onb239v5 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x0F +#define DER_OID_SZ_c2onb239v5 10 +extern const unsigned char ossl_der_oid_c2onb239v5[DER_OID_SZ_c2onb239v5]; + +/* + * c2pnb272w1 OBJECT IDENTIFIER ::= { c-TwoCurve 16 } + */ +#define DER_OID_V_c2pnb272w1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x10 +#define DER_OID_SZ_c2pnb272w1 10 +extern const unsigned char ossl_der_oid_c2pnb272w1[DER_OID_SZ_c2pnb272w1]; + +/* + * c2pnb304w1 OBJECT IDENTIFIER ::= { c-TwoCurve 17 } + */ +#define DER_OID_V_c2pnb304w1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x11 +#define DER_OID_SZ_c2pnb304w1 10 +extern const unsigned char ossl_der_oid_c2pnb304w1[DER_OID_SZ_c2pnb304w1]; + +/* + * c2tnb359v1 OBJECT IDENTIFIER ::= { c-TwoCurve 18 } + */ +#define DER_OID_V_c2tnb359v1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x12 +#define DER_OID_SZ_c2tnb359v1 10 +extern const unsigned char ossl_der_oid_c2tnb359v1[DER_OID_SZ_c2tnb359v1]; + +/* + * c2pnb368w1 OBJECT IDENTIFIER ::= { c-TwoCurve 19 } + */ +#define DER_OID_V_c2pnb368w1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x13 +#define DER_OID_SZ_c2pnb368w1 10 +extern const unsigned char ossl_der_oid_c2pnb368w1[DER_OID_SZ_c2pnb368w1]; + +/* + * c2tnb431r1 OBJECT IDENTIFIER ::= { c-TwoCurve 20 } + */ +#define DER_OID_V_c2tnb431r1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x14 +#define DER_OID_SZ_c2tnb431r1 10 +extern const unsigned char ossl_der_oid_c2tnb431r1[DER_OID_SZ_c2tnb431r1]; + +/* + * prime192v1 OBJECT IDENTIFIER ::= { primeCurve 1 } + */ +#define DER_OID_V_prime192v1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x01 +#define DER_OID_SZ_prime192v1 10 +extern const unsigned char ossl_der_oid_prime192v1[DER_OID_SZ_prime192v1]; + +/* + * prime192v2 OBJECT IDENTIFIER ::= { primeCurve 2 } + */ +#define DER_OID_V_prime192v2 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x02 +#define DER_OID_SZ_prime192v2 10 +extern const unsigned char ossl_der_oid_prime192v2[DER_OID_SZ_prime192v2]; + +/* + * prime192v3 OBJECT IDENTIFIER ::= { primeCurve 3 } + */ +#define DER_OID_V_prime192v3 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x03 +#define DER_OID_SZ_prime192v3 10 +extern const unsigned char ossl_der_oid_prime192v3[DER_OID_SZ_prime192v3]; + +/* + * prime239v1 OBJECT IDENTIFIER ::= { primeCurve 4 } + */ +#define DER_OID_V_prime239v1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x04 +#define DER_OID_SZ_prime239v1 10 +extern const unsigned char ossl_der_oid_prime239v1[DER_OID_SZ_prime239v1]; + +/* + * prime239v2 OBJECT IDENTIFIER ::= { primeCurve 5 } + */ +#define DER_OID_V_prime239v2 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x05 +#define DER_OID_SZ_prime239v2 10 +extern const unsigned char ossl_der_oid_prime239v2[DER_OID_SZ_prime239v2]; + +/* + * prime239v3 OBJECT IDENTIFIER ::= { primeCurve 6 } + */ +#define DER_OID_V_prime239v3 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x06 +#define DER_OID_SZ_prime239v3 10 +extern const unsigned char ossl_der_oid_prime239v3[DER_OID_SZ_prime239v3]; + +/* + * prime256v1 OBJECT IDENTIFIER ::= { primeCurve 7 } + */ +#define DER_OID_V_prime256v1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07 +#define DER_OID_SZ_prime256v1 10 +extern const unsigned char ossl_der_oid_prime256v1[DER_OID_SZ_prime256v1]; + +/* + * ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 1 } + */ +#define DER_OID_V_ecdsa_with_SHA224 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x01 +#define DER_OID_SZ_ecdsa_with_SHA224 10 +extern const unsigned char ossl_der_oid_ecdsa_with_SHA224[DER_OID_SZ_ecdsa_with_SHA224]; + +/* + * ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } + */ +#define DER_OID_V_ecdsa_with_SHA256 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02 +#define DER_OID_SZ_ecdsa_with_SHA256 10 +extern const unsigned char ossl_der_oid_ecdsa_with_SHA256[DER_OID_SZ_ecdsa_with_SHA256]; + +/* + * ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } + */ +#define DER_OID_V_ecdsa_with_SHA384 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x03 +#define DER_OID_SZ_ecdsa_with_SHA384 10 +extern const unsigned char ossl_der_oid_ecdsa_with_SHA384[DER_OID_SZ_ecdsa_with_SHA384]; + +/* + * ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } + */ +#define DER_OID_V_ecdsa_with_SHA512 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x04 +#define DER_OID_SZ_ecdsa_with_SHA512 10 +extern const unsigned char ossl_der_oid_ecdsa_with_SHA512[DER_OID_SZ_ecdsa_with_SHA512]; + +/* + * id-ecdsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 9 } + */ +#define DER_OID_V_id_ecdsa_with_sha3_224 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x09 +#define DER_OID_SZ_id_ecdsa_with_sha3_224 11 +extern const unsigned char ossl_der_oid_id_ecdsa_with_sha3_224[DER_OID_SZ_id_ecdsa_with_sha3_224]; + +/* + * id-ecdsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 10 } + */ +#define DER_OID_V_id_ecdsa_with_sha3_256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x0A +#define DER_OID_SZ_id_ecdsa_with_sha3_256 11 +extern const unsigned char ossl_der_oid_id_ecdsa_with_sha3_256[DER_OID_SZ_id_ecdsa_with_sha3_256]; + +/* + * id-ecdsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 11 } + */ +#define DER_OID_V_id_ecdsa_with_sha3_384 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x0B +#define DER_OID_SZ_id_ecdsa_with_sha3_384 11 +extern const unsigned char ossl_der_oid_id_ecdsa_with_sha3_384[DER_OID_SZ_id_ecdsa_with_sha3_384]; + +/* + * id-ecdsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 12 } + */ +#define DER_OID_V_id_ecdsa_with_sha3_512 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x0C +#define DER_OID_SZ_id_ecdsa_with_sha3_512 11 +extern const unsigned char ossl_der_oid_id_ecdsa_with_sha3_512[DER_OID_SZ_id_ecdsa_with_sha3_512]; + +/* clang-format on */ + +/* Subject Public Key Info */ +int ossl_DER_w_algorithmIdentifier_EC(WPACKET *pkt, int cont, EC_KEY *ec); +/* Signature */ +int ossl_DER_w_algorithmIdentifier_ECDSA_with_MD(WPACKET *pkt, int cont, + EC_KEY *ec, int mdnid); diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_ecx.h b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_ecx.h new file mode 100644 index 000000000000..80e15fad803d --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_ecx.h @@ -0,0 +1,52 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_ecx.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/der.h" +#include "crypto/ecx.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-X25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 110 } + */ +#define DER_OID_V_id_X25519 DER_P_OBJECT, 3, 0x2B, 0x65, 0x6E +#define DER_OID_SZ_id_X25519 5 +extern const unsigned char ossl_der_oid_id_X25519[DER_OID_SZ_id_X25519]; + +/* + * id-X448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 111 } + */ +#define DER_OID_V_id_X448 DER_P_OBJECT, 3, 0x2B, 0x65, 0x6F +#define DER_OID_SZ_id_X448 5 +extern const unsigned char ossl_der_oid_id_X448[DER_OID_SZ_id_X448]; + +/* + * id-Ed25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 112 } + */ +#define DER_OID_V_id_Ed25519 DER_P_OBJECT, 3, 0x2B, 0x65, 0x70 +#define DER_OID_SZ_id_Ed25519 5 +extern const unsigned char ossl_der_oid_id_Ed25519[DER_OID_SZ_id_Ed25519]; + +/* + * id-Ed448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 113 } + */ +#define DER_OID_V_id_Ed448 DER_P_OBJECT, 3, 0x2B, 0x65, 0x71 +#define DER_OID_SZ_id_Ed448 5 +extern const unsigned char ossl_der_oid_id_Ed448[DER_OID_SZ_id_Ed448]; + +/* clang-format on */ + +int ossl_DER_w_algorithmIdentifier_ED25519(WPACKET *pkt, int cont, ECX_KEY *ec); +int ossl_DER_w_algorithmIdentifier_ED448(WPACKET *pkt, int cont, ECX_KEY *ec); +int ossl_DER_w_algorithmIdentifier_X25519(WPACKET *pkt, int cont, ECX_KEY *ec); +int ossl_DER_w_algorithmIdentifier_X448(WPACKET *pkt, int cont, ECX_KEY *ec); diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_ml_dsa.h b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_ml_dsa.h new file mode 100644 index 000000000000..a6c4c87d7824 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_ml_dsa.h @@ -0,0 +1,42 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_ml_dsa.h.in + * + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/der.h" +#include "crypto/ml_dsa.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-ml-dsa-44 OBJECT IDENTIFIER ::= { sigAlgs 17 } + */ +#define DER_OID_V_id_ml_dsa_44 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x11 +#define DER_OID_SZ_id_ml_dsa_44 11 +extern const unsigned char ossl_der_oid_id_ml_dsa_44[DER_OID_SZ_id_ml_dsa_44]; + +/* + * id-ml-dsa-65 OBJECT IDENTIFIER ::= { sigAlgs 18 } + */ +#define DER_OID_V_id_ml_dsa_65 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x12 +#define DER_OID_SZ_id_ml_dsa_65 11 +extern const unsigned char ossl_der_oid_id_ml_dsa_65[DER_OID_SZ_id_ml_dsa_65]; + +/* + * id-ml-dsa-87 OBJECT IDENTIFIER ::= { sigAlgs 19 } + */ +#define DER_OID_V_id_ml_dsa_87 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x13 +#define DER_OID_SZ_id_ml_dsa_87 11 +extern const unsigned char ossl_der_oid_id_ml_dsa_87[DER_OID_SZ_id_ml_dsa_87]; + +/* clang-format on */ + +int ossl_DER_w_algorithmIdentifier_ML_DSA(WPACKET *pkt, int tag, ML_DSA_KEY *key); diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_rsa.h b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_rsa.h new file mode 100644 index 000000000000..9c374ceb2b0e --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_rsa.h @@ -0,0 +1,189 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_rsa.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "crypto/rsa.h" +#include "internal/der.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * hashAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 2 } + */ +#define DER_OID_V_hashAlgs DER_P_OBJECT, 8, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02 +#define DER_OID_SZ_hashAlgs 10 +extern const unsigned char ossl_der_oid_hashAlgs[DER_OID_SZ_hashAlgs]; + +/* + * rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } + */ +#define DER_OID_V_rsaEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01 +#define DER_OID_SZ_rsaEncryption 11 +extern const unsigned char ossl_der_oid_rsaEncryption[DER_OID_SZ_rsaEncryption]; + +/* + * id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 } + */ +#define DER_OID_V_id_RSAES_OAEP DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x07 +#define DER_OID_SZ_id_RSAES_OAEP 11 +extern const unsigned char ossl_der_oid_id_RSAES_OAEP[DER_OID_SZ_id_RSAES_OAEP]; + +/* + * id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 } + */ +#define DER_OID_V_id_pSpecified DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x09 +#define DER_OID_SZ_id_pSpecified 11 +extern const unsigned char ossl_der_oid_id_pSpecified[DER_OID_SZ_id_pSpecified]; + +/* + * id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } + */ +#define DER_OID_V_id_RSASSA_PSS DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0A +#define DER_OID_SZ_id_RSASSA_PSS 11 +extern const unsigned char ossl_der_oid_id_RSASSA_PSS[DER_OID_SZ_id_RSASSA_PSS]; + +/* + * md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } + */ +#define DER_OID_V_md2WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x02 +#define DER_OID_SZ_md2WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_md2WithRSAEncryption[DER_OID_SZ_md2WithRSAEncryption]; + +/* + * md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } + */ +#define DER_OID_V_md5WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x04 +#define DER_OID_SZ_md5WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_md5WithRSAEncryption[DER_OID_SZ_md5WithRSAEncryption]; + +/* + * sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } + */ +#define DER_OID_V_sha1WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05 +#define DER_OID_SZ_sha1WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_sha1WithRSAEncryption[DER_OID_SZ_sha1WithRSAEncryption]; + +/* + * sha224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 14 } + */ +#define DER_OID_V_sha224WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0E +#define DER_OID_SZ_sha224WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_sha224WithRSAEncryption[DER_OID_SZ_sha224WithRSAEncryption]; + +/* + * sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } + */ +#define DER_OID_V_sha256WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B +#define DER_OID_SZ_sha256WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_sha256WithRSAEncryption[DER_OID_SZ_sha256WithRSAEncryption]; + +/* + * sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } + */ +#define DER_OID_V_sha384WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0C +#define DER_OID_SZ_sha384WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_sha384WithRSAEncryption[DER_OID_SZ_sha384WithRSAEncryption]; + +/* + * sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } + */ +#define DER_OID_V_sha512WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0D +#define DER_OID_SZ_sha512WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_sha512WithRSAEncryption[DER_OID_SZ_sha512WithRSAEncryption]; + +/* + * sha512-224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 15 } + */ +#define DER_OID_V_sha512_224WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0F +#define DER_OID_SZ_sha512_224WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_sha512_224WithRSAEncryption[DER_OID_SZ_sha512_224WithRSAEncryption]; + +/* + * sha512-256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 16 } + */ +#define DER_OID_V_sha512_256WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x10 +#define DER_OID_SZ_sha512_256WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_sha512_256WithRSAEncryption[DER_OID_SZ_sha512_256WithRSAEncryption]; + +/* + * id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 } + */ +#define DER_OID_V_id_mgf1 DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x08 +#define DER_OID_SZ_id_mgf1 11 +extern const unsigned char ossl_der_oid_id_mgf1[DER_OID_SZ_id_mgf1]; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 13 } + */ +#define DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_224 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x0D +#define DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224 11 +extern const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_224[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224]; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 14 } + */ +#define DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x0E +#define DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256 11 +extern const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_256[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256]; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 15 } + */ +#define DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_384 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x0F +#define DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384 11 +extern const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_384[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384]; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 16 } + */ +#define DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_512 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x10 +#define DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512 11 +extern const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_512[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512]; + +/* + * md4WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 3 } + */ +#define DER_OID_V_md4WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x03 +#define DER_OID_SZ_md4WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_md4WithRSAEncryption[DER_OID_SZ_md4WithRSAEncryption]; + +/* + * ripemd160WithRSAEncryption OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) teletrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) 2 + * } + */ +#define DER_OID_V_ripemd160WithRSAEncryption DER_P_OBJECT, 6, 0x2B, 0x24, 0x03, 0x03, 0x01, 0x02 +#define DER_OID_SZ_ripemd160WithRSAEncryption 8 +extern const unsigned char ossl_der_oid_ripemd160WithRSAEncryption[DER_OID_SZ_ripemd160WithRSAEncryption]; + +/* + * mdc2WithRSASignature OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) mdc2WithRSASignature(14) + * } + */ +#define DER_OID_V_mdc2WithRSASignature DER_P_OBJECT, 5, 0x2B, 0x0E, 0x03, 0x02, 0x0E +#define DER_OID_SZ_mdc2WithRSASignature 7 +extern const unsigned char ossl_der_oid_mdc2WithRSASignature[DER_OID_SZ_mdc2WithRSASignature]; + +/* clang-format on */ + +/* PSS parameters */ +int ossl_DER_w_RSASSA_PSS_params(WPACKET *pkt, int tag, + const RSA_PSS_PARAMS_30 *pss); +/* Subject Public Key Info */ +int ossl_DER_w_algorithmIdentifier_RSA(WPACKET *pkt, int tag, RSA *rsa); +int ossl_DER_w_algorithmIdentifier_RSA_PSS(WPACKET *pkt, int tag, + int rsa_type, + const RSA_PSS_PARAMS_30 *pss); +/* Signature */ +int ossl_DER_w_algorithmIdentifier_MDWithRSAEncryption(WPACKET *pkt, int tag, + int mdnid); diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_slh_dsa.h b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_slh_dsa.h new file mode 100644 index 000000000000..eaf1ab14fd00 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_slh_dsa.h @@ -0,0 +1,105 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_slh_dsa.h.in + * + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/der.h" +#include "crypto/slh_dsa.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-slh-dsa-sha2-128s OBJECT IDENTIFIER ::= { sigAlgs 20 } + */ +#define DER_OID_V_id_slh_dsa_sha2_128s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x14 +#define DER_OID_SZ_id_slh_dsa_sha2_128s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_128s[DER_OID_SZ_id_slh_dsa_sha2_128s]; + +/* + * id-slh-dsa-sha2-128f OBJECT IDENTIFIER ::= { sigAlgs 21 } + */ +#define DER_OID_V_id_slh_dsa_sha2_128f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x15 +#define DER_OID_SZ_id_slh_dsa_sha2_128f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_128f[DER_OID_SZ_id_slh_dsa_sha2_128f]; + +/* + * id-slh-dsa-sha2-192s OBJECT IDENTIFIER ::= { sigAlgs 22 } + */ +#define DER_OID_V_id_slh_dsa_sha2_192s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x16 +#define DER_OID_SZ_id_slh_dsa_sha2_192s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_192s[DER_OID_SZ_id_slh_dsa_sha2_192s]; + +/* + * id-slh-dsa-sha2-192f OBJECT IDENTIFIER ::= { sigAlgs 23 } + */ +#define DER_OID_V_id_slh_dsa_sha2_192f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x17 +#define DER_OID_SZ_id_slh_dsa_sha2_192f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_192f[DER_OID_SZ_id_slh_dsa_sha2_192f]; + +/* + * id-slh-dsa-sha2-256s OBJECT IDENTIFIER ::= { sigAlgs 24 } + */ +#define DER_OID_V_id_slh_dsa_sha2_256s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x18 +#define DER_OID_SZ_id_slh_dsa_sha2_256s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_256s[DER_OID_SZ_id_slh_dsa_sha2_256s]; + +/* + * id-slh-dsa-sha2-256f OBJECT IDENTIFIER ::= { sigAlgs 25 } + */ +#define DER_OID_V_id_slh_dsa_sha2_256f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x19 +#define DER_OID_SZ_id_slh_dsa_sha2_256f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_256f[DER_OID_SZ_id_slh_dsa_sha2_256f]; + +/* + * id-slh-dsa-shake-128s OBJECT IDENTIFIER ::= { sigAlgs 26 } + */ +#define DER_OID_V_id_slh_dsa_shake_128s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1A +#define DER_OID_SZ_id_slh_dsa_shake_128s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_128s[DER_OID_SZ_id_slh_dsa_shake_128s]; + +/* + * id-slh-dsa-shake-128f OBJECT IDENTIFIER ::= { sigAlgs 27 } + */ +#define DER_OID_V_id_slh_dsa_shake_128f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1B +#define DER_OID_SZ_id_slh_dsa_shake_128f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_128f[DER_OID_SZ_id_slh_dsa_shake_128f]; + +/* + * id-slh-dsa-shake-192s OBJECT IDENTIFIER ::= { sigAlgs 28 } + */ +#define DER_OID_V_id_slh_dsa_shake_192s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1C +#define DER_OID_SZ_id_slh_dsa_shake_192s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_192s[DER_OID_SZ_id_slh_dsa_shake_192s]; + +/* + * id-slh-dsa-shake-192f OBJECT IDENTIFIER ::= { sigAlgs 29 } + */ +#define DER_OID_V_id_slh_dsa_shake_192f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1D +#define DER_OID_SZ_id_slh_dsa_shake_192f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_192f[DER_OID_SZ_id_slh_dsa_shake_192f]; + +/* + * id-slh-dsa-shake-256s OBJECT IDENTIFIER ::= { sigAlgs 30 } + */ +#define DER_OID_V_id_slh_dsa_shake_256s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1E +#define DER_OID_SZ_id_slh_dsa_shake_256s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_256s[DER_OID_SZ_id_slh_dsa_shake_256s]; + +/* + * id-slh-dsa-shake-256f OBJECT IDENTIFIER ::= { sigAlgs 31 } + */ +#define DER_OID_V_id_slh_dsa_shake_256f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1F +#define DER_OID_SZ_id_slh_dsa_shake_256f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_256f[DER_OID_SZ_id_slh_dsa_shake_256f]; + +/* clang-format on */ + +int ossl_DER_w_algorithmIdentifier_SLH_DSA(WPACKET *pkt, int tag, SLH_DSA_KEY *key); diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_sm2.h b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_sm2.h new file mode 100644 index 000000000000..a6ab7b7166d3 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_sm2.h @@ -0,0 +1,39 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_sm2.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "crypto/ec.h" +#include "internal/der.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * sm2-with-SM3 OBJECT IDENTIFIER ::= { sm-scheme 501 } + */ +#define DER_OID_V_sm2_with_SM3 DER_P_OBJECT, 8, 0x2A, 0x81, 0x1C, 0xCF, 0x55, 0x01, 0x83, 0x75 +#define DER_OID_SZ_sm2_with_SM3 10 +extern const unsigned char ossl_der_oid_sm2_with_SM3[DER_OID_SZ_sm2_with_SM3]; + +/* + * curveSM2 OBJECT IDENTIFIER ::= { sm-scheme 301 } + */ +#define DER_OID_V_curveSM2 DER_P_OBJECT, 8, 0x2A, 0x81, 0x1C, 0xCF, 0x55, 0x01, 0x82, 0x2D +#define DER_OID_SZ_curveSM2 10 +extern const unsigned char ossl_der_oid_curveSM2[DER_OID_SZ_curveSM2]; + +/* clang-format on */ + +/* Subject Public Key Info */ +int ossl_DER_w_algorithmIdentifier_SM2(WPACKET *pkt, int cont, EC_KEY *ec); +/* Signature */ +int ossl_DER_w_algorithmIdentifier_SM2_with_MD(WPACKET *pkt, int cont, + EC_KEY *ec, int mdnid); diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_wrap.h b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_wrap.h new file mode 100644 index 000000000000..56d4777bb3d2 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/common/include/prov/der_wrap.h @@ -0,0 +1,48 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_wrap.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/der.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-alg-CMS3DESwrap OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) alg(3) 6 + * } + */ +#define DER_OID_V_id_alg_CMS3DESwrap DER_P_OBJECT, 11, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x10, 0x03, 0x06 +#define DER_OID_SZ_id_alg_CMS3DESwrap 13 +extern const unsigned char ossl_der_oid_id_alg_CMS3DESwrap[DER_OID_SZ_id_alg_CMS3DESwrap]; + +/* + * id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } + */ +#define DER_OID_V_id_aes128_wrap DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x05 +#define DER_OID_SZ_id_aes128_wrap 11 +extern const unsigned char ossl_der_oid_id_aes128_wrap[DER_OID_SZ_id_aes128_wrap]; + +/* + * id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } + */ +#define DER_OID_V_id_aes192_wrap DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x19 +#define DER_OID_SZ_id_aes192_wrap 11 +extern const unsigned char ossl_der_oid_id_aes192_wrap[DER_OID_SZ_id_aes192_wrap]; + +/* + * id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } + */ +#define DER_OID_V_id_aes256_wrap DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2D +#define DER_OID_SZ_id_aes256_wrap 11 +extern const unsigned char ossl_der_oid_id_aes256_wrap[DER_OID_SZ_id_aes256_wrap]; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/fips.ld b/deps/openssl/config/archs/linux64-riscv64/asm/providers/fips.ld new file mode 100644 index 000000000000..1debaaa7ff65 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/fips.ld @@ -0,0 +1,5 @@ +{ + global: + OSSL_provider_init; + local: *; +}; diff --git a/deps/openssl/config/archs/linux64-riscv64/asm/providers/legacy.ld b/deps/openssl/config/archs/linux64-riscv64/asm/providers/legacy.ld new file mode 100644 index 000000000000..1debaaa7ff65 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm/providers/legacy.ld @@ -0,0 +1,5 @@ +{ + global: + OSSL_provider_init; + local: *; +}; diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/apps/progs.c b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/apps/progs.c new file mode 100644 index 000000000000..317acf5bc8b2 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/apps/progs.c @@ -0,0 +1,404 @@ +/* + * WARNING: do not edit! + * Generated by apps/progs.pl + * + * Copyright 1995-2026 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "progs.h" + +FUNCTION functions[] = { + {FT_general, "asn1parse", asn1parse_main, asn1parse_options, NULL, NULL}, + {FT_general, "ca", ca_main, ca_options, NULL, NULL}, +#ifndef OPENSSL_NO_SOCK + {FT_general, "ciphers", ciphers_main, ciphers_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_CMP + {FT_general, "cmp", cmp_main, cmp_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_CMS + {FT_general, "cms", cms_main, cms_options, NULL, NULL}, +#endif + {FT_general, "crl", crl_main, crl_options, NULL, NULL}, + {FT_general, "crl2pkcs7", crl2pkcs7_main, crl2pkcs7_options, NULL, NULL}, + {FT_general, "dgst", dgst_main, dgst_options, NULL, NULL}, +#ifndef OPENSSL_NO_DH + {FT_general, "dhparam", dhparam_main, dhparam_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_DSA + {FT_general, "dsa", dsa_main, dsa_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_DSA + {FT_general, "dsaparam", dsaparam_main, dsaparam_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_EC + {FT_general, "ec", ec_main, ec_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_EC + {FT_general, "ecparam", ecparam_main, ecparam_options, NULL, NULL}, +#endif + {FT_general, "enc", enc_main, enc_options, NULL, NULL}, +#ifndef OPENSSL_NO_ENGINE + {FT_general, "engine", engine_main, engine_options, NULL, NULL}, +#endif + {FT_general, "errstr", errstr_main, errstr_options, NULL, NULL}, + {FT_general, "fipsinstall", fipsinstall_main, fipsinstall_options, NULL, NULL}, +#ifndef OPENSSL_NO_DSA + {FT_general, "gendsa", gendsa_main, gendsa_options, NULL, NULL}, +#endif + {FT_general, "genpkey", genpkey_main, genpkey_options, NULL, NULL}, +#ifndef OPENSSL_NO_RSA + {FT_general, "genrsa", genrsa_main, genrsa_options, NULL, NULL}, +#endif + {FT_general, "help", help_main, help_options, NULL, NULL}, + {FT_general, "info", info_main, info_options, NULL, NULL}, + {FT_general, "kdf", kdf_main, kdf_options, NULL, NULL}, + {FT_general, "list", list_main, list_options, NULL, NULL}, + {FT_general, "mac", mac_main, mac_options, NULL, NULL}, + {FT_general, "nseq", nseq_main, nseq_options, NULL, NULL}, +#ifndef OPENSSL_NO_OCSP + {FT_general, "ocsp", ocsp_main, ocsp_options, NULL, NULL}, +#endif + {FT_general, "passwd", passwd_main, passwd_options, NULL, NULL}, + {FT_general, "pkcs12", pkcs12_main, pkcs12_options, NULL, NULL}, + {FT_general, "pkcs7", pkcs7_main, pkcs7_options, NULL, NULL}, + {FT_general, "pkcs8", pkcs8_main, pkcs8_options, NULL, NULL}, + {FT_general, "pkey", pkey_main, pkey_options, NULL, NULL}, + {FT_general, "pkeyparam", pkeyparam_main, pkeyparam_options, NULL, NULL}, + {FT_general, "pkeyutl", pkeyutl_main, pkeyutl_options, NULL, NULL}, + {FT_general, "prime", prime_main, prime_options, NULL, NULL}, + {FT_general, "rand", rand_main, rand_options, NULL, NULL}, + {FT_general, "rehash", rehash_main, rehash_options, NULL, NULL}, + {FT_general, "req", req_main, req_options, NULL, NULL}, + {FT_general, "rsa", rsa_main, rsa_options, NULL, NULL}, +#if !defined(OPENSSL_NO_DEPRECATED_3_0) && !defined(OPENSSL_NO_RSA) + {FT_general, "rsautl", rsautl_main, rsautl_options, "pkeyutl", "3.0"}, +#endif +#ifndef OPENSSL_NO_SOCK + {FT_general, "s_client", s_client_main, s_client_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_SOCK + {FT_general, "s_server", s_server_main, s_server_options, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_SOCK + {FT_general, "s_time", s_time_main, s_time_options, NULL, NULL}, +#endif + {FT_general, "sess_id", sess_id_main, sess_id_options, NULL, NULL}, + {FT_general, "skeyutl", skeyutl_main, skeyutl_options, NULL, NULL}, + {FT_general, "smime", smime_main, smime_options, NULL, NULL}, + {FT_general, "speed", speed_main, speed_options, NULL, NULL}, + {FT_general, "spkac", spkac_main, spkac_options, NULL, NULL}, +#ifndef OPENSSL_NO_SRP + {FT_general, "srp", srp_main, srp_options, NULL, NULL}, +#endif + {FT_general, "storeutl", storeutl_main, storeutl_options, NULL, NULL}, +#ifndef OPENSSL_NO_TS + {FT_general, "ts", ts_main, ts_options, NULL, NULL}, +#endif + {FT_general, "verify", verify_main, verify_options, NULL, NULL}, + {FT_general, "version", version_main, version_options, NULL, NULL}, + {FT_general, "x509", x509_main, x509_options, NULL, NULL}, +#ifndef OPENSSL_NO_MD2 + {FT_md, "md2", dgst_main, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_MD4 + {FT_md, "md4", dgst_main, NULL, NULL}, +#endif + {FT_md, "md5", dgst_main, NULL, NULL}, + {FT_md, "sha1", dgst_main, NULL, NULL}, + {FT_md, "sha224", dgst_main, NULL, NULL}, + {FT_md, "sha256", dgst_main, NULL, NULL}, + {FT_md, "sha384", dgst_main, NULL, NULL}, + {FT_md, "sha512", dgst_main, NULL, NULL}, + {FT_md, "sha512-224", dgst_main, NULL, NULL}, + {FT_md, "sha512-256", dgst_main, NULL, NULL}, + {FT_md, "sha3-224", dgst_main, NULL, NULL}, + {FT_md, "sha3-256", dgst_main, NULL, NULL}, + {FT_md, "sha3-384", dgst_main, NULL, NULL}, + {FT_md, "sha3-512", dgst_main, NULL, NULL}, + {FT_md, "shake128", dgst_main, NULL, NULL}, + {FT_md, "shake256", dgst_main, NULL, NULL}, +#ifndef OPENSSL_NO_MDC2 + {FT_md, "mdc2", dgst_main, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_RMD160 + {FT_md, "rmd160", dgst_main, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_BLAKE2 + {FT_md, "blake2b512", dgst_main, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_BLAKE2 + {FT_md, "blake2s256", dgst_main, NULL, NULL}, +#endif +#ifndef OPENSSL_NO_SM3 + {FT_md, "sm3", dgst_main, NULL, NULL}, +#endif + {FT_cipher, "aes-128-cbc", enc_main, enc_options, NULL}, + {FT_cipher, "aes-128-ecb", enc_main, enc_options, NULL}, + {FT_cipher, "aes-192-cbc", enc_main, enc_options, NULL}, + {FT_cipher, "aes-192-ecb", enc_main, enc_options, NULL}, + {FT_cipher, "aes-256-cbc", enc_main, enc_options, NULL}, + {FT_cipher, "aes-256-ecb", enc_main, enc_options, NULL}, +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-128-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-128-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-128-ctr", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-128-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-128-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-128-cfb1", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-128-cfb8", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-192-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-192-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-192-ctr", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-192-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-192-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-192-cfb1", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-192-cfb8", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-256-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-256-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-256-ctr", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-256-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-256-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-256-cfb1", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ARIA + {FT_cipher, "aria-256-cfb8", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAMELLIA + {FT_cipher, "camellia-128-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAMELLIA + {FT_cipher, "camellia-128-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAMELLIA + {FT_cipher, "camellia-192-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAMELLIA + {FT_cipher, "camellia-192-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAMELLIA + {FT_cipher, "camellia-256-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAMELLIA + {FT_cipher, "camellia-256-ecb", enc_main, enc_options, NULL}, +#endif + {FT_cipher, "base64", enc_main, enc_options, NULL}, +#ifndef OPENSSL_NO_ZLIB + {FT_cipher, "zlib", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_BROTLI + {FT_cipher, "brotli", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_ZSTD + {FT_cipher, "zstd", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des3", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "desx", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_IDEA + {FT_cipher, "idea", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SEED + {FT_cipher, "seed", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC4 + {FT_cipher, "rc4", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC4 + {FT_cipher, "rc4-40", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC2 + {FT_cipher, "rc2", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_BF + {FT_cipher, "bf", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAST + {FT_cipher, "cast", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC5 + {FT_cipher, "rc5", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede3", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede3-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede3-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_DES + {FT_cipher, "des-ede3-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_IDEA + {FT_cipher, "idea-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_IDEA + {FT_cipher, "idea-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_IDEA + {FT_cipher, "idea-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_IDEA + {FT_cipher, "idea-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SEED + {FT_cipher, "seed-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SEED + {FT_cipher, "seed-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SEED + {FT_cipher, "seed-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SEED + {FT_cipher, "seed-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC2 + {FT_cipher, "rc2-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC2 + {FT_cipher, "rc2-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC2 + {FT_cipher, "rc2-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC2 + {FT_cipher, "rc2-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC2 + {FT_cipher, "rc2-64-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC2 + {FT_cipher, "rc2-40-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_BF + {FT_cipher, "bf-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_BF + {FT_cipher, "bf-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_BF + {FT_cipher, "bf-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_BF + {FT_cipher, "bf-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAST + {FT_cipher, "cast5-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAST + {FT_cipher, "cast5-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAST + {FT_cipher, "cast5-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAST + {FT_cipher, "cast5-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_CAST + {FT_cipher, "cast-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC5 + {FT_cipher, "rc5-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC5 + {FT_cipher, "rc5-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC5 + {FT_cipher, "rc5-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_RC5 + {FT_cipher, "rc5-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SM4 + {FT_cipher, "sm4-cbc", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SM4 + {FT_cipher, "sm4-ecb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SM4 + {FT_cipher, "sm4-cfb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SM4 + {FT_cipher, "sm4-ofb", enc_main, enc_options, NULL}, +#endif +#ifndef OPENSSL_NO_SM4 + {FT_cipher, "sm4-ctr", enc_main, enc_options, NULL}, +#endif + {0, NULL, NULL, NULL, NULL} +}; diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/configdata.pm b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/configdata.pm new file mode 100644 index 000000000000..0063924e8a2a --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/configdata.pm @@ -0,0 +1,25808 @@ +#! /usr/bin/env perl +# -*- mode: perl -*- + +package configdata; + +use strict; +use warnings; + +use Exporter; +our @ISA = qw(Exporter); +our @EXPORT = qw( + %config %target %disabled %withargs %unified_info + @disablables @disablables_int +); + +our %config = ( + "AR" => "ar", + "ARFLAGS" => [ + "qc" + ], + "AS" => "as", + "ASFLAGS" => [], + "CC" => "../config/fake_gcc.pl", + "CFLAGS" => [ + "-Wall -O3" + ], + "CPPDEFINES" => [], + "CPPFLAGS" => [], + "CPPINCLUDES" => [], + "CXX" => "g++", + "CXXFLAGS" => [ + "-Wall -O3" + ], + "FIPSKEY" => "f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813", + "FIPS_VENDOR" => "OpenSSL FIPS Provider", + "HASHBANGPERL" => "/usr/bin/env perl", + "LD" => "ld", + "LDFLAGS" => [], + "LDLIBS" => [], + "OBJCOPY" => "objcopy", + "PERL" => "/usr/bin/perl", + "RANLIB" => "ranlib", + "RC" => "windres", + "RCFLAGS" => [], + "api" => "30500", + "b32" => "0", + "b64" => "0", + "b64l" => "1", + "bn_ll" => "0", + "build_file" => "Makefile", + "build_file_templates" => [ + "Configurations/common0.tmpl", + "Configurations/unix-Makefile.tmpl" + ], + "build_infos" => [ + "./build.info", + "crypto/build.info", + "ssl/build.info", + "apps/build.info", + "util/build.info", + "tools/build.info", + "fuzz/build.info", + "providers/build.info", + "doc/build.info", + "engines/build.info", + "exporters/build.info", + "crypto/objects/build.info", + "crypto/buffer/build.info", + "crypto/bio/build.info", + "crypto/stack/build.info", + "crypto/lhash/build.info", + "crypto/hashtable/build.info", + "crypto/rand/build.info", + "crypto/evp/build.info", + "crypto/asn1/build.info", + "crypto/pem/build.info", + "crypto/x509/build.info", + "crypto/conf/build.info", + "crypto/txt_db/build.info", + "crypto/pkcs7/build.info", + "crypto/pkcs12/build.info", + "crypto/ui/build.info", + "crypto/kdf/build.info", + "crypto/store/build.info", + "crypto/property/build.info", + "crypto/md4/build.info", + "crypto/md5/build.info", + "crypto/sha/build.info", + "crypto/mdc2/build.info", + "crypto/ml_kem/build.info", + "crypto/hmac/build.info", + "crypto/ripemd/build.info", + "crypto/whrlpool/build.info", + "crypto/poly1305/build.info", + "crypto/siphash/build.info", + "crypto/sm3/build.info", + "crypto/des/build.info", + "crypto/aes/build.info", + "crypto/rc2/build.info", + "crypto/rc4/build.info", + "crypto/idea/build.info", + "crypto/aria/build.info", + "crypto/bf/build.info", + "crypto/cast/build.info", + "crypto/camellia/build.info", + "crypto/seed/build.info", + "crypto/sm4/build.info", + "crypto/chacha/build.info", + "crypto/modes/build.info", + "crypto/bn/build.info", + "crypto/ec/build.info", + "crypto/rsa/build.info", + "crypto/dsa/build.info", + "crypto/dh/build.info", + "crypto/sm2/build.info", + "crypto/dso/build.info", + "crypto/engine/build.info", + "crypto/err/build.info", + "crypto/comp/build.info", + "crypto/http/build.info", + "crypto/ocsp/build.info", + "crypto/cms/build.info", + "crypto/ts/build.info", + "crypto/srp/build.info", + "crypto/cmac/build.info", + "crypto/ct/build.info", + "crypto/async/build.info", + "crypto/ess/build.info", + "crypto/crmf/build.info", + "crypto/cmp/build.info", + "crypto/encode_decode/build.info", + "crypto/ffc/build.info", + "crypto/hpke/build.info", + "crypto/thread/build.info", + "crypto/ml_dsa/build.info", + "crypto/slh_dsa/build.info", + "ssl/record/build.info", + "ssl/rio/build.info", + "ssl/quic/build.info", + "apps/lib/build.info", + "providers/common/build.info", + "providers/implementations/build.info", + "providers/fips/build.info", + "doc/man1/build.info", + "ssl/record/methods/build.info", + "providers/common/der/build.info", + "providers/implementations/digests/build.info", + "providers/implementations/ciphers/build.info", + "providers/implementations/rands/build.info", + "providers/implementations/macs/build.info", + "providers/implementations/kdfs/build.info", + "providers/implementations/exchange/build.info", + "providers/implementations/keymgmt/build.info", + "providers/implementations/signature/build.info", + "providers/implementations/asymciphers/build.info", + "providers/implementations/encode_decode/build.info", + "providers/implementations/storemgmt/build.info", + "providers/implementations/kem/build.info", + "providers/implementations/skeymgmt/build.info", + "providers/implementations/rands/seeding/build.info" + ], + "build_metadata" => "", + "build_type" => "release", + "builddir" => ".", + "cflags" => [ + "-Wa,--noexecstack" + ], + "conf_files" => [ + "Configurations/00-base-templates.conf", + "Configurations/10-main.conf" + ], + "cppflags" => [], + "cxxflags" => [], + "defines" => [ + "NDEBUG" + ], + "dynamic_engines" => "0", + "ex_libs" => [], + "full_version" => "3.5.7", + "includes" => [], + "lflags" => [], + "lib_defines" => [ + "OPENSSL_PIC" + ], + "libdir" => "", + "major" => "3", + "makedep_scheme" => "gcc", + "minor" => "5", + "openssl_api_defines" => [ + "OPENSSL_CONFIGURED_API=30500" + ], + "openssl_feature_defines" => [ + "OPENSSL_RAND_SEED_OS", + "OPENSSL_THREADS", + "OPENSSL_NO_AFALGENG", + "OPENSSL_NO_ASAN", + "OPENSSL_NO_BROTLI_DYNAMIC", + "OPENSSL_NO_CRYPTO_MDEBUG", + "OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE", + "OPENSSL_NO_DEMOS", + "OPENSSL_NO_DEVCRYPTOENG", + "OPENSSL_NO_EC_NISTP_64_GCC_128", + "OPENSSL_NO_EGD", + "OPENSSL_NO_EXTERNAL_TESTS", + "OPENSSL_NO_FIPS_JITTER", + "OPENSSL_NO_FUZZ_AFL", + "OPENSSL_NO_FUZZ_LIBFUZZER", + "OPENSSL_NO_H3DEMO", + "OPENSSL_NO_HQINTEROP", + "OPENSSL_NO_JITTER", + "OPENSSL_NO_KTLS", + "OPENSSL_NO_LOADERENG", + "OPENSSL_NO_MD2", + "OPENSSL_NO_MSAN", + "OPENSSL_NO_PIE", + "OPENSSL_NO_RC5", + "OPENSSL_NO_SCTP", + "OPENSSL_NO_SSL3", + "OPENSSL_NO_SSL3_METHOD", + "OPENSSL_NO_SSLKEYLOG", + "OPENSSL_NO_TESTS", + "OPENSSL_NO_TFO", + "OPENSSL_NO_TRACE", + "OPENSSL_NO_UBSAN", + "OPENSSL_NO_UNIT_TEST", + "OPENSSL_NO_UPLINK", + "OPENSSL_NO_WEAK_SSL_CIPHERS", + "OPENSSL_NO_WINSTORE", + "OPENSSL_NO_ZLIB_DYNAMIC", + "OPENSSL_NO_ZSTD_DYNAMIC", + "OPENSSL_NO_DYNAMIC_ENGINE" + ], + "openssl_other_defines" => [ + "OPENSSL_NO_KTLS" + ], + "openssl_sys_defines" => [], + "openssldir" => "", + "options" => "enable-ssl-trace enable-fips enable-zlib --with-zlib-include=../../zlib enable-brotli --with-brotli-include=../../brotli/c/include enable-zstd --with-zstd-include=../../zstd/lib no-afalgeng no-asan no-brotli-dynamic no-buildtest-c++ no-crypto-mdebug no-crypto-mdebug-backtrace no-demos no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fips-jitter no-fuzz-afl no-fuzz-libfuzzer no-h3demo no-hqinterop no-jitter no-ktls no-loadereng no-md2 no-msan no-pie no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-sslkeylog no-tests no-tfo no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-winstore no-zlib-dynamic no-zstd-dynamic", + "patch" => "7", + "perl_archname" => "x86_64-linux-thread-multi", + "perl_cmd" => "/usr/bin/perl", + "perl_version" => "5.42.2", + "perlargv" => [ + "no-tests", + "no-shared", + "no-afalgeng", + "enable-ssl-trace", + "enable-fips", + "zlib", + "--with-zlib-include=../../zlib", + "enable-brotli", + "--with-brotli-include=../../brotli/c/include", + "enable-zstd", + "--with-zstd-include=../../zstd/lib", + "linux64-riscv64" + ], + "perlenv" => { + "AR" => "ar", + "ARFLAGS" => undef, + "AS" => "as", + "ASFLAGS" => undef, + "BUILDFILE" => undef, + "CC" => "../config/fake_gcc.pl", + "CFLAGS" => undef, + "CPP" => undef, + "CPPDEFINES" => undef, + "CPPFLAGS" => undef, + "CPPINCLUDES" => undef, + "CROSS_COMPILE" => undef, + "CXX" => "g++", + "CXXFLAGS" => undef, + "HASHBANGPERL" => undef, + "LD" => "ld", + "LDFLAGS" => undef, + "LDLIBS" => undef, + "MT" => undef, + "MTFLAGS" => undef, + "OBJCOPY" => "objcopy", + "OPENSSL_LOCAL_CONFIG_DIR" => undef, + "PERL" => undef, + "RANLIB" => "ranlib", + "RC" => undef, + "RCFLAGS" => undef, + "RM" => undef, + "WINDRES" => undef, + "__CNF_CFLAGS" => undef, + "__CNF_CPPDEFINES" => undef, + "__CNF_CPPFLAGS" => undef, + "__CNF_CPPINCLUDES" => undef, + "__CNF_CXXFLAGS" => undef, + "__CNF_LDFLAGS" => undef, + "__CNF_LDLIBS" => undef + }, + "prefix" => "", + "prerelease" => "", + "processor" => "", + "rc4_int" => "unsigned char", + "release_date" => "9 Jun 2026", + "shlib_version" => "3", + "sourcedir" => ".", + "target" => "linux64-riscv64", + "version" => "3.5.7" +); +our %target = ( + "AR" => "ar", + "ARFLAGS" => "qc", + "CC" => "gcc", + "CFLAGS" => "-Wall -O3", + "CXX" => "g++", + "CXXFLAGS" => "-Wall -O3", + "HASHBANGPERL" => "/usr/bin/env perl", + "OBJCOPY" => "objcopy", + "RANLIB" => "ranlib", + "RC" => "windres", + "_conf_fname_int" => [ + "Configurations/00-base-templates.conf", + "Configurations/00-base-templates.conf", + "Configurations/10-main.conf", + "Configurations/10-main.conf", + "Configurations/10-main.conf", + "Configurations/shared-info.pl" + ], + "asm_arch" => "riscv64", + "bin_cflags" => "", + "bin_lflags" => "", + "bn_ops" => "SIXTY_FOUR_BIT_LONG RC4_CHAR", + "build_file" => "Makefile", + "build_scheme" => [ + "unified", + "unix" + ], + "cflags" => "-pthread", + "cppflags" => "", + "cxxflags" => "-std=c++11 -pthread", + "defines" => [ + "OPENSSL_BUILDING_OPENSSL", + "BROTLI", + "ZLIB", + "ZSTD" + ], + "disable" => [], + "dso_ldflags" => "-Wl,-z,defs", + "dso_scheme" => "dlfcn", + "enable" => [ + "afalgeng" + ], + "ex_libs" => "-lz -lbrotlienc -lbrotlidec -lbrotlicommon -lm -lzstd -ldl -pthread", + "includes" => [ + "../../brotli/c/include", + "../../zlib", + "../../zstd/lib" + ], + "lflags" => "", + "lib_cflags" => "", + "lib_cppflags" => "-DOPENSSL_USE_NODELETE", + "lib_defines" => [], + "module_cflags" => "-fPIC", + "module_cxxflags" => undef, + "module_ldflags" => "-Wl,-znodelete -shared -Wl,-Bsymbolic", + "perl_platform" => "Unix", + "perlasm_scheme" => "linux64", + "shared_cflag" => "-fPIC", + "shared_defflag" => "-Wl,--version-script=", + "shared_defines" => [], + "shared_ldflag" => "-Wl,-znodelete -shared -Wl,-Bsymbolic", + "shared_rcflag" => "", + "shared_sonameflag" => "-Wl,-soname=", + "shared_target" => "linux-shared", + "template" => "1", + "thread_defines" => [], + "thread_scheme" => "pthreads", + "unistd" => "" +); +our @disablables = ( + "acvp-tests", + "afalgeng", + "apps", + "argon2", + "aria", + "asan", + "asm", + "async", + "atexit", + "autoalginit", + "autoerrinit", + "autoload-config", + "bf", + "blake2", + "brotli", + "brotli-dynamic", + "buildtest-c++", + "bulk", + "cached-fetch", + "camellia", + "capieng", + "winstore", + "cast", + "chacha", + "cmac", + "cmp", + "cms", + "comp", + "crypto-mdebug", + "ct", + "default-thread-pool", + "demos", + "h3demo", + "hqinterop", + "deprecated", + "des", + "devcryptoeng", + "dgram", + "dh", + "docs", + "dsa", + "dso", + "dtls", + "dynamic-engine", + "ec", + "ec2m", + "ec_nistp_64_gcc_128", + "ecdh", + "ecdsa", + "ecx", + "egd", + "engine", + "err", + "external-tests", + "filenames", + "fips", + "fips-securitychecks", + "fips-post", + "fips-jitter", + "fuzz-afl", + "fuzz-libfuzzer", + "gost", + "http", + "idea", + "integrity-only-ciphers", + "jitter", + "ktls", + "legacy", + "loadereng", + "makedepend", + "md2", + "md4", + "mdc2", + "ml-dsa", + "ml-kem", + "module", + "msan", + "multiblock", + "nextprotoneg", + "ocb", + "ocsp", + "padlockeng", + "pic", + "pie", + "pinshared", + "poly1305", + "posix-io", + "psk", + "quic", + "unstable-qlog", + "rc2", + "rc4", + "rc5", + "rdrand", + "rfc3779", + "rmd160", + "scrypt", + "sctp", + "secure-memory", + "seed", + "shared", + "siphash", + "siv", + "slh-dsa", + "sm2", + "sm2-precomp", + "sm3", + "sm4", + "sock", + "srp", + "srtp", + "sse2", + "ssl", + "ssl-trace", + "static-engine", + "stdio", + "sslkeylog", + "tests", + "tfo", + "thread-pool", + "threads", + "tls", + "tls-deprecated-ec", + "trace", + "ts", + "ubsan", + "ui-console", + "unit-test", + "uplink", + "weak-ssl-ciphers", + "whirlpool", + "zlib", + "zlib-dynamic", + "zstd", + "zstd-dynamic", + "ssl3", + "ssl3-method", + "tls1", + "tls1-method", + "tls1_1", + "tls1_1-method", + "tls1_2", + "tls1_2-method", + "tls1_3", + "dtls1", + "dtls1-method", + "dtls1_2", + "dtls1_2-method" +); +our @disablables_int = ( + "crmf" +); +our %disabled = ( + "afalgeng" => "option", + "asan" => "default", + "brotli-dynamic" => "default", + "buildtest-c++" => "default", + "crypto-mdebug" => "default", + "crypto-mdebug-backtrace" => "default", + "demos" => "default", + "devcryptoeng" => "default", + "dynamic-engine" => "cascade", + "ec_nistp_64_gcc_128" => "default", + "egd" => "default", + "external-tests" => "default", + "fips-jitter" => "default", + "fuzz-afl" => "default", + "fuzz-libfuzzer" => "default", + "h3demo" => "default", + "hqinterop" => "default", + "jitter" => "default", + "ktls" => "default", + "loadereng" => "cascade", + "md2" => "default", + "msan" => "default", + "pie" => "default", + "rc5" => "default", + "sctp" => "default", + "shared" => "option", + "ssl3" => "default", + "ssl3-method" => "default", + "sslkeylog" => "default", + "tests" => "option", + "tfo" => "default", + "trace" => "default", + "ubsan" => "default", + "unit-test" => "default", + "uplink" => "no uplink_arch", + "weak-ssl-ciphers" => "default", + "winstore" => "not-windows", + "zlib-dynamic" => "default", + "zstd-dynamic" => "default" +); +our %withargs = ( + "brotli_include" => "../../brotli/c/include", + "zlib_include" => "../../zlib", + "zstd_include" => "../../zstd/lib" +); +our %unified_info = ( + "attributes" => { + "depends" => { + "doc/man1/openssl-asn1parse.pod" => { + "doc/man1/openssl-asn1parse.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-ca.pod" => { + "doc/man1/openssl-ca.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-ciphers.pod" => { + "doc/man1/openssl-ciphers.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-cmds.pod" => { + "doc/man1/openssl-cmds.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-cmp.pod" => { + "doc/man1/openssl-cmp.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-cms.pod" => { + "doc/man1/openssl-cms.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-crl.pod" => { + "doc/man1/openssl-crl.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-crl2pkcs7.pod" => { + "doc/man1/openssl-crl2pkcs7.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-dgst.pod" => { + "doc/man1/openssl-dgst.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-dhparam.pod" => { + "doc/man1/openssl-dhparam.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-dsa.pod" => { + "doc/man1/openssl-dsa.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-dsaparam.pod" => { + "doc/man1/openssl-dsaparam.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-ec.pod" => { + "doc/man1/openssl-ec.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-ecparam.pod" => { + "doc/man1/openssl-ecparam.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-enc.pod" => { + "doc/man1/openssl-enc.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-engine.pod" => { + "doc/man1/openssl-engine.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-errstr.pod" => { + "doc/man1/openssl-errstr.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-fipsinstall.pod" => { + "doc/man1/openssl-fipsinstall.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-gendsa.pod" => { + "doc/man1/openssl-gendsa.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-genpkey.pod" => { + "doc/man1/openssl-genpkey.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-genrsa.pod" => { + "doc/man1/openssl-genrsa.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-info.pod" => { + "doc/man1/openssl-info.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-kdf.pod" => { + "doc/man1/openssl-kdf.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-list.pod" => { + "doc/man1/openssl-list.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-mac.pod" => { + "doc/man1/openssl-mac.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-nseq.pod" => { + "doc/man1/openssl-nseq.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-ocsp.pod" => { + "doc/man1/openssl-ocsp.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-passwd.pod" => { + "doc/man1/openssl-passwd.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-pkcs12.pod" => { + "doc/man1/openssl-pkcs12.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-pkcs7.pod" => { + "doc/man1/openssl-pkcs7.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-pkcs8.pod" => { + "doc/man1/openssl-pkcs8.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-pkey.pod" => { + "doc/man1/openssl-pkey.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-pkeyparam.pod" => { + "doc/man1/openssl-pkeyparam.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-pkeyutl.pod" => { + "doc/man1/openssl-pkeyutl.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-prime.pod" => { + "doc/man1/openssl-prime.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-rand.pod" => { + "doc/man1/openssl-rand.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-rehash.pod" => { + "doc/man1/openssl-rehash.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-req.pod" => { + "doc/man1/openssl-req.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-rsa.pod" => { + "doc/man1/openssl-rsa.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-rsautl.pod" => { + "doc/man1/openssl-rsautl.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-s_client.pod" => { + "doc/man1/openssl-s_client.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-s_server.pod" => { + "doc/man1/openssl-s_server.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-s_time.pod" => { + "doc/man1/openssl-s_time.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-sess_id.pod" => { + "doc/man1/openssl-sess_id.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-skeyutl.pod" => { + "doc/man1/openssl-skeyutl.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-smime.pod" => { + "doc/man1/openssl-smime.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-speed.pod" => { + "doc/man1/openssl-speed.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-spkac.pod" => { + "doc/man1/openssl-spkac.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-srp.pod" => { + "doc/man1/openssl-srp.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-storeutl.pod" => { + "doc/man1/openssl-storeutl.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-ts.pod" => { + "doc/man1/openssl-ts.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-verify.pod" => { + "doc/man1/openssl-verify.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-version.pod" => { + "doc/man1/openssl-version.pod.in" => { + "pod" => "1" + } + }, + "doc/man1/openssl-x509.pod" => { + "doc/man1/openssl-x509.pod.in" => { + "pod" => "1" + } + }, + "doc/man7/openssl_user_macros.pod" => { + "doc/man7/openssl_user_macros.pod.in" => { + "pod" => "1" + } + }, + "providers/libcommon.a" => { + "libcrypto" => { + "weak" => "1" + } + } + }, + "generate" => { + "exporters/OpenSSLConfig.cmake" => { + "exporter" => "cmake" + }, + "exporters/OpenSSLConfigVersion.cmake" => { + "exporter" => "cmake" + }, + "exporters/libcrypto.pc" => { + "exporter" => "pkg-config" + }, + "exporters/libssl.pc" => { + "exporter" => "pkg-config" + }, + "exporters/openssl.pc" => { + "exporter" => "pkg-config" + }, + "include/openssl/configuration.h" => { + "skip" => "1" + } + }, + "libraries" => { + "apps/libapps.a" => { + "noinst" => "1" + }, + "providers/libcommon.a" => { + "noinst" => "1" + }, + "providers/libdefault.a" => { + "noinst" => "1" + }, + "providers/libfips.a" => { + "noinst" => "1" + }, + "providers/liblegacy.a" => { + "noinst" => "1" + }, + "providers/libtemplate.a" => { + "noinst" => "1" + } + }, + "modules" => { + "providers/fips" => { + "fips" => "1" + } + }, + "scripts" => { + "apps/CA.pl" => { + "misc" => "1" + }, + "apps/tsget.pl" => { + "linkname" => "tsget", + "misc" => "1" + }, + "util/shlib_wrap.sh" => { + "noinst" => "1" + }, + "util/wrap.pl" => { + "noinst" => "1" + } + }, + "sources" => { + "apps/openssl" => { + "apps/openssl-bin-progs.o" => { + "nocheck" => "1" + } + }, + "apps/openssl-bin-progs.o" => { + "apps/progs.c" => { + "nocheck" => "1" + } + }, + "apps/progs.o" => {} + } + }, + "defines" => { + "libcrypto" => [ + "AES_ASM", + "GHASH_ASM", + "INCLUDE_C_CHACHA20", + "INCLUDE_C_SHA256", + "INCLUDE_C_SHA512", + "OPENSSL_CPUID_OBJ", + "OPENSSL_SM3_ASM", + "SHA256_ASM", + "SHA512_ASM", + "SM4_ASM" + ], + "providers/fips" => [ + "FIPS_MODULE" + ], + "providers/libcommon.a" => [ + "OPENSSL_CPUID_OBJ" + ], + "providers/libdefault.a" => [ + "AES_ASM", + "GHASH_ASM", + "INCLUDE_C_SHA256", + "INCLUDE_C_SHA512", + "OPENSSL_CPUID_OBJ", + "SHA256_ASM", + "SHA512_ASM", + "SM4_ASM" + ], + "providers/libfips.a" => [ + "AES_ASM", + "FIPS_MODULE", + "GHASH_ASM", + "INCLUDE_C_SHA256", + "INCLUDE_C_SHA512", + "OPENSSL_CPUID_OBJ", + "SHA256_ASM", + "SHA512_ASM", + "SM4_ASM" + ] + }, + "depends" => { + "" => [ + "OpenSSLConfigVersion.cmake", + "crypto/params_idx.c", + "exporters/OpenSSLConfigVersion.cmake", + "exporters/openssl.pc", + "include/crypto/bn_conf.h", + "include/crypto/dso_conf.h", + "include/internal/param_names.h", + "include/openssl/asn1.h", + "include/openssl/asn1t.h", + "include/openssl/bio.h", + "include/openssl/cmp.h", + "include/openssl/cms.h", + "include/openssl/comp.h", + "include/openssl/conf.h", + "include/openssl/core_names.h", + "include/openssl/crmf.h", + "include/openssl/crypto.h", + "include/openssl/ct.h", + "include/openssl/err.h", + "include/openssl/ess.h", + "include/openssl/fipskey.h", + "include/openssl/lhash.h", + "include/openssl/ocsp.h", + "include/openssl/opensslv.h", + "include/openssl/pkcs12.h", + "include/openssl/pkcs7.h", + "include/openssl/safestack.h", + "include/openssl/srp.h", + "include/openssl/ssl.h", + "include/openssl/ui.h", + "include/openssl/x509.h", + "include/openssl/x509_acert.h", + "include/openssl/x509_vfy.h", + "include/openssl/x509v3.h", + "openssl.pc" + ], + "OpenSSLConfig.cmake" => [ + "builddata.pm" + ], + "OpenSSLConfigVersion.cmake" => [ + "OpenSSLConfig.cmake", + "builddata.pm" + ], + "apps/lib/openssl-bin-cmp_mock_srv.o" => [ + "apps/progs.h" + ], + "apps/openssl" => [ + "apps/libapps.a", + "libssl" + ], + "apps/openssl-bin-asn1parse.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-ca.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-ciphers.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-cmp.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-cms.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-crl.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-crl2pkcs7.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-dgst.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-dhparam.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-dsa.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-dsaparam.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-ec.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-ecparam.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-enc.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-engine.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-errstr.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-fipsinstall.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-gendsa.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-genpkey.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-genrsa.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-info.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-kdf.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-list.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-mac.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-nseq.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-ocsp.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-openssl.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-passwd.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-pkcs12.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-pkcs7.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-pkcs8.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-pkey.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-pkeyparam.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-pkeyutl.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-prime.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-progs.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-rand.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-rehash.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-req.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-rsa.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-rsautl.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-s_client.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-s_server.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-s_time.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-sess_id.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-skeyutl.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-smime.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-speed.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-spkac.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-srp.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-storeutl.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-ts.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-verify.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-version.o" => [ + "apps/progs.h" + ], + "apps/openssl-bin-x509.o" => [ + "apps/progs.h" + ], + "apps/progs.c" => [ + "configdata.pm" + ], + "apps/progs.h" => [ + "apps/progs.c" + ], + "build_modules_nodep" => [ + "providers/fipsmodule.cnf" + ], + "crypto/aes/aes-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/aes/aesni-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/aes/aest4-sparcv9.S" => [ + "crypto/perlasm/sparcv9_modes.pl" + ], + "crypto/aes/vpaes-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/bf/bf-586.S" => [ + "crypto/perlasm/cbc.pl", + "crypto/perlasm/x86asm.pl" + ], + "crypto/bn/bn-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/bn/co-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/bn/x86-gf2m.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/bn/x86-mont.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/camellia/cmll-x86.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/camellia/cmllt4-sparcv9.S" => [ + "crypto/perlasm/sparcv9_modes.pl" + ], + "crypto/cast/cast-586.S" => [ + "crypto/perlasm/cbc.pl", + "crypto/perlasm/x86asm.pl" + ], + "crypto/des/crypt586.S" => [ + "crypto/perlasm/cbc.pl", + "crypto/perlasm/x86asm.pl" + ], + "crypto/des/des-586.S" => [ + "crypto/perlasm/cbc.pl", + "crypto/perlasm/x86asm.pl" + ], + "crypto/libcrypto-lib-cversion.o" => [ + "crypto/buildinf.h" + ], + "crypto/libcrypto-lib-info.o" => [ + "crypto/buildinf.h" + ], + "crypto/params_idx.c" => [ + "util/perl|OpenSSL/paramnames.pm" + ], + "crypto/rc4/rc4-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/ripemd/rmd-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/sha/sha1-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/sha/sha256-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/sha/sha512-586.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/whrlpool/wp-mmx.S" => [ + "crypto/perlasm/x86asm.pl" + ], + "crypto/x86cpuid.s" => [ + "crypto/perlasm/x86asm.pl" + ], + "doc/html/man1/CA.pl.html" => [ + "doc/man1/CA.pl.pod" + ], + "doc/html/man1/openssl-asn1parse.html" => [ + "doc/man1/openssl-asn1parse.pod" + ], + "doc/html/man1/openssl-ca.html" => [ + "doc/man1/openssl-ca.pod" + ], + "doc/html/man1/openssl-ciphers.html" => [ + "doc/man1/openssl-ciphers.pod" + ], + "doc/html/man1/openssl-cmds.html" => [ + "doc/man1/openssl-cmds.pod" + ], + "doc/html/man1/openssl-cmp.html" => [ + "doc/man1/openssl-cmp.pod" + ], + "doc/html/man1/openssl-cms.html" => [ + "doc/man1/openssl-cms.pod" + ], + "doc/html/man1/openssl-crl.html" => [ + "doc/man1/openssl-crl.pod" + ], + "doc/html/man1/openssl-crl2pkcs7.html" => [ + "doc/man1/openssl-crl2pkcs7.pod" + ], + "doc/html/man1/openssl-dgst.html" => [ + "doc/man1/openssl-dgst.pod" + ], + "doc/html/man1/openssl-dhparam.html" => [ + "doc/man1/openssl-dhparam.pod" + ], + "doc/html/man1/openssl-dsa.html" => [ + "doc/man1/openssl-dsa.pod" + ], + "doc/html/man1/openssl-dsaparam.html" => [ + "doc/man1/openssl-dsaparam.pod" + ], + "doc/html/man1/openssl-ec.html" => [ + "doc/man1/openssl-ec.pod" + ], + "doc/html/man1/openssl-ecparam.html" => [ + "doc/man1/openssl-ecparam.pod" + ], + "doc/html/man1/openssl-enc.html" => [ + "doc/man1/openssl-enc.pod" + ], + "doc/html/man1/openssl-engine.html" => [ + "doc/man1/openssl-engine.pod" + ], + "doc/html/man1/openssl-errstr.html" => [ + "doc/man1/openssl-errstr.pod" + ], + "doc/html/man1/openssl-fipsinstall.html" => [ + "doc/man1/openssl-fipsinstall.pod" + ], + "doc/html/man1/openssl-format-options.html" => [ + "doc/man1/openssl-format-options.pod" + ], + "doc/html/man1/openssl-gendsa.html" => [ + "doc/man1/openssl-gendsa.pod" + ], + "doc/html/man1/openssl-genpkey.html" => [ + "doc/man1/openssl-genpkey.pod" + ], + "doc/html/man1/openssl-genrsa.html" => [ + "doc/man1/openssl-genrsa.pod" + ], + "doc/html/man1/openssl-info.html" => [ + "doc/man1/openssl-info.pod" + ], + "doc/html/man1/openssl-kdf.html" => [ + "doc/man1/openssl-kdf.pod" + ], + "doc/html/man1/openssl-list.html" => [ + "doc/man1/openssl-list.pod" + ], + "doc/html/man1/openssl-mac.html" => [ + "doc/man1/openssl-mac.pod" + ], + "doc/html/man1/openssl-namedisplay-options.html" => [ + "doc/man1/openssl-namedisplay-options.pod" + ], + "doc/html/man1/openssl-nseq.html" => [ + "doc/man1/openssl-nseq.pod" + ], + "doc/html/man1/openssl-ocsp.html" => [ + "doc/man1/openssl-ocsp.pod" + ], + "doc/html/man1/openssl-passphrase-options.html" => [ + "doc/man1/openssl-passphrase-options.pod" + ], + "doc/html/man1/openssl-passwd.html" => [ + "doc/man1/openssl-passwd.pod" + ], + "doc/html/man1/openssl-pkcs12.html" => [ + "doc/man1/openssl-pkcs12.pod" + ], + "doc/html/man1/openssl-pkcs7.html" => [ + "doc/man1/openssl-pkcs7.pod" + ], + "doc/html/man1/openssl-pkcs8.html" => [ + "doc/man1/openssl-pkcs8.pod" + ], + "doc/html/man1/openssl-pkey.html" => [ + "doc/man1/openssl-pkey.pod" + ], + "doc/html/man1/openssl-pkeyparam.html" => [ + "doc/man1/openssl-pkeyparam.pod" + ], + "doc/html/man1/openssl-pkeyutl.html" => [ + "doc/man1/openssl-pkeyutl.pod" + ], + "doc/html/man1/openssl-prime.html" => [ + "doc/man1/openssl-prime.pod" + ], + "doc/html/man1/openssl-rand.html" => [ + "doc/man1/openssl-rand.pod" + ], + "doc/html/man1/openssl-rehash.html" => [ + "doc/man1/openssl-rehash.pod" + ], + "doc/html/man1/openssl-req.html" => [ + "doc/man1/openssl-req.pod" + ], + "doc/html/man1/openssl-rsa.html" => [ + "doc/man1/openssl-rsa.pod" + ], + "doc/html/man1/openssl-rsautl.html" => [ + "doc/man1/openssl-rsautl.pod" + ], + "doc/html/man1/openssl-s_client.html" => [ + "doc/man1/openssl-s_client.pod" + ], + "doc/html/man1/openssl-s_server.html" => [ + "doc/man1/openssl-s_server.pod" + ], + "doc/html/man1/openssl-s_time.html" => [ + "doc/man1/openssl-s_time.pod" + ], + "doc/html/man1/openssl-sess_id.html" => [ + "doc/man1/openssl-sess_id.pod" + ], + "doc/html/man1/openssl-skeyutl.html" => [ + "doc/man1/openssl-skeyutl.pod" + ], + "doc/html/man1/openssl-smime.html" => [ + "doc/man1/openssl-smime.pod" + ], + "doc/html/man1/openssl-speed.html" => [ + "doc/man1/openssl-speed.pod" + ], + "doc/html/man1/openssl-spkac.html" => [ + "doc/man1/openssl-spkac.pod" + ], + "doc/html/man1/openssl-srp.html" => [ + "doc/man1/openssl-srp.pod" + ], + "doc/html/man1/openssl-storeutl.html" => [ + "doc/man1/openssl-storeutl.pod" + ], + "doc/html/man1/openssl-ts.html" => [ + "doc/man1/openssl-ts.pod" + ], + "doc/html/man1/openssl-verification-options.html" => [ + "doc/man1/openssl-verification-options.pod" + ], + "doc/html/man1/openssl-verify.html" => [ + "doc/man1/openssl-verify.pod" + ], + "doc/html/man1/openssl-version.html" => [ + "doc/man1/openssl-version.pod" + ], + "doc/html/man1/openssl-x509.html" => [ + "doc/man1/openssl-x509.pod" + ], + "doc/html/man1/openssl.html" => [ + "doc/man1/openssl.pod" + ], + "doc/html/man1/tsget.html" => [ + "doc/man1/tsget.pod" + ], + "doc/html/man3/ADMISSIONS.html" => [ + "doc/man3/ADMISSIONS.pod" + ], + "doc/html/man3/ASN1_EXTERN_FUNCS.html" => [ + "doc/man3/ASN1_EXTERN_FUNCS.pod" + ], + "doc/html/man3/ASN1_INTEGER_get_int64.html" => [ + "doc/man3/ASN1_INTEGER_get_int64.pod" + ], + "doc/html/man3/ASN1_INTEGER_new.html" => [ + "doc/man3/ASN1_INTEGER_new.pod" + ], + "doc/html/man3/ASN1_ITEM_lookup.html" => [ + "doc/man3/ASN1_ITEM_lookup.pod" + ], + "doc/html/man3/ASN1_OBJECT_new.html" => [ + "doc/man3/ASN1_OBJECT_new.pod" + ], + "doc/html/man3/ASN1_STRING_TABLE_add.html" => [ + "doc/man3/ASN1_STRING_TABLE_add.pod" + ], + "doc/html/man3/ASN1_STRING_length.html" => [ + "doc/man3/ASN1_STRING_length.pod" + ], + "doc/html/man3/ASN1_STRING_new.html" => [ + "doc/man3/ASN1_STRING_new.pod" + ], + "doc/html/man3/ASN1_STRING_print_ex.html" => [ + "doc/man3/ASN1_STRING_print_ex.pod" + ], + "doc/html/man3/ASN1_TIME_set.html" => [ + "doc/man3/ASN1_TIME_set.pod" + ], + "doc/html/man3/ASN1_TYPE_get.html" => [ + "doc/man3/ASN1_TYPE_get.pod" + ], + "doc/html/man3/ASN1_aux_cb.html" => [ + "doc/man3/ASN1_aux_cb.pod" + ], + "doc/html/man3/ASN1_generate_nconf.html" => [ + "doc/man3/ASN1_generate_nconf.pod" + ], + "doc/html/man3/ASN1_item_d2i_bio.html" => [ + "doc/man3/ASN1_item_d2i_bio.pod" + ], + "doc/html/man3/ASN1_item_new.html" => [ + "doc/man3/ASN1_item_new.pod" + ], + "doc/html/man3/ASN1_item_sign.html" => [ + "doc/man3/ASN1_item_sign.pod" + ], + "doc/html/man3/ASYNC_WAIT_CTX_new.html" => [ + "doc/man3/ASYNC_WAIT_CTX_new.pod" + ], + "doc/html/man3/ASYNC_start_job.html" => [ + "doc/man3/ASYNC_start_job.pod" + ], + "doc/html/man3/BF_encrypt.html" => [ + "doc/man3/BF_encrypt.pod" + ], + "doc/html/man3/BIO_ADDR.html" => [ + "doc/man3/BIO_ADDR.pod" + ], + "doc/html/man3/BIO_ADDRINFO.html" => [ + "doc/man3/BIO_ADDRINFO.pod" + ], + "doc/html/man3/BIO_connect.html" => [ + "doc/man3/BIO_connect.pod" + ], + "doc/html/man3/BIO_ctrl.html" => [ + "doc/man3/BIO_ctrl.pod" + ], + "doc/html/man3/BIO_f_base64.html" => [ + "doc/man3/BIO_f_base64.pod" + ], + "doc/html/man3/BIO_f_buffer.html" => [ + "doc/man3/BIO_f_buffer.pod" + ], + "doc/html/man3/BIO_f_cipher.html" => [ + "doc/man3/BIO_f_cipher.pod" + ], + "doc/html/man3/BIO_f_md.html" => [ + "doc/man3/BIO_f_md.pod" + ], + "doc/html/man3/BIO_f_null.html" => [ + "doc/man3/BIO_f_null.pod" + ], + "doc/html/man3/BIO_f_prefix.html" => [ + "doc/man3/BIO_f_prefix.pod" + ], + "doc/html/man3/BIO_f_readbuffer.html" => [ + "doc/man3/BIO_f_readbuffer.pod" + ], + "doc/html/man3/BIO_f_ssl.html" => [ + "doc/man3/BIO_f_ssl.pod" + ], + "doc/html/man3/BIO_find_type.html" => [ + "doc/man3/BIO_find_type.pod" + ], + "doc/html/man3/BIO_get_data.html" => [ + "doc/man3/BIO_get_data.pod" + ], + "doc/html/man3/BIO_get_ex_new_index.html" => [ + "doc/man3/BIO_get_ex_new_index.pod" + ], + "doc/html/man3/BIO_get_rpoll_descriptor.html" => [ + "doc/man3/BIO_get_rpoll_descriptor.pod" + ], + "doc/html/man3/BIO_meth_new.html" => [ + "doc/man3/BIO_meth_new.pod" + ], + "doc/html/man3/BIO_new.html" => [ + "doc/man3/BIO_new.pod" + ], + "doc/html/man3/BIO_new_CMS.html" => [ + "doc/man3/BIO_new_CMS.pod" + ], + "doc/html/man3/BIO_parse_hostserv.html" => [ + "doc/man3/BIO_parse_hostserv.pod" + ], + "doc/html/man3/BIO_printf.html" => [ + "doc/man3/BIO_printf.pod" + ], + "doc/html/man3/BIO_push.html" => [ + "doc/man3/BIO_push.pod" + ], + "doc/html/man3/BIO_read.html" => [ + "doc/man3/BIO_read.pod" + ], + "doc/html/man3/BIO_s_accept.html" => [ + "doc/man3/BIO_s_accept.pod" + ], + "doc/html/man3/BIO_s_bio.html" => [ + "doc/man3/BIO_s_bio.pod" + ], + "doc/html/man3/BIO_s_connect.html" => [ + "doc/man3/BIO_s_connect.pod" + ], + "doc/html/man3/BIO_s_core.html" => [ + "doc/man3/BIO_s_core.pod" + ], + "doc/html/man3/BIO_s_datagram.html" => [ + "doc/man3/BIO_s_datagram.pod" + ], + "doc/html/man3/BIO_s_dgram_pair.html" => [ + "doc/man3/BIO_s_dgram_pair.pod" + ], + "doc/html/man3/BIO_s_fd.html" => [ + "doc/man3/BIO_s_fd.pod" + ], + "doc/html/man3/BIO_s_file.html" => [ + "doc/man3/BIO_s_file.pod" + ], + "doc/html/man3/BIO_s_mem.html" => [ + "doc/man3/BIO_s_mem.pod" + ], + "doc/html/man3/BIO_s_null.html" => [ + "doc/man3/BIO_s_null.pod" + ], + "doc/html/man3/BIO_s_socket.html" => [ + "doc/man3/BIO_s_socket.pod" + ], + "doc/html/man3/BIO_sendmmsg.html" => [ + "doc/man3/BIO_sendmmsg.pod" + ], + "doc/html/man3/BIO_set_callback.html" => [ + "doc/man3/BIO_set_callback.pod" + ], + "doc/html/man3/BIO_set_flags.html" => [ + "doc/man3/BIO_set_flags.pod" + ], + "doc/html/man3/BIO_should_retry.html" => [ + "doc/man3/BIO_should_retry.pod" + ], + "doc/html/man3/BIO_socket_wait.html" => [ + "doc/man3/BIO_socket_wait.pod" + ], + "doc/html/man3/BN_BLINDING_new.html" => [ + "doc/man3/BN_BLINDING_new.pod" + ], + "doc/html/man3/BN_CTX_new.html" => [ + "doc/man3/BN_CTX_new.pod" + ], + "doc/html/man3/BN_CTX_start.html" => [ + "doc/man3/BN_CTX_start.pod" + ], + "doc/html/man3/BN_add.html" => [ + "doc/man3/BN_add.pod" + ], + "doc/html/man3/BN_add_word.html" => [ + "doc/man3/BN_add_word.pod" + ], + "doc/html/man3/BN_bn2bin.html" => [ + "doc/man3/BN_bn2bin.pod" + ], + "doc/html/man3/BN_cmp.html" => [ + "doc/man3/BN_cmp.pod" + ], + "doc/html/man3/BN_copy.html" => [ + "doc/man3/BN_copy.pod" + ], + "doc/html/man3/BN_generate_prime.html" => [ + "doc/man3/BN_generate_prime.pod" + ], + "doc/html/man3/BN_mod_exp_mont.html" => [ + "doc/man3/BN_mod_exp_mont.pod" + ], + "doc/html/man3/BN_mod_inverse.html" => [ + "doc/man3/BN_mod_inverse.pod" + ], + "doc/html/man3/BN_mod_mul_montgomery.html" => [ + "doc/man3/BN_mod_mul_montgomery.pod" + ], + "doc/html/man3/BN_mod_mul_reciprocal.html" => [ + "doc/man3/BN_mod_mul_reciprocal.pod" + ], + "doc/html/man3/BN_new.html" => [ + "doc/man3/BN_new.pod" + ], + "doc/html/man3/BN_num_bytes.html" => [ + "doc/man3/BN_num_bytes.pod" + ], + "doc/html/man3/BN_rand.html" => [ + "doc/man3/BN_rand.pod" + ], + "doc/html/man3/BN_security_bits.html" => [ + "doc/man3/BN_security_bits.pod" + ], + "doc/html/man3/BN_set_bit.html" => [ + "doc/man3/BN_set_bit.pod" + ], + "doc/html/man3/BN_swap.html" => [ + "doc/man3/BN_swap.pod" + ], + "doc/html/man3/BN_zero.html" => [ + "doc/man3/BN_zero.pod" + ], + "doc/html/man3/BUF_MEM_new.html" => [ + "doc/man3/BUF_MEM_new.pod" + ], + "doc/html/man3/CMAC_CTX.html" => [ + "doc/man3/CMAC_CTX.pod" + ], + "doc/html/man3/CMS_EncryptedData_decrypt.html" => [ + "doc/man3/CMS_EncryptedData_decrypt.pod" + ], + "doc/html/man3/CMS_EncryptedData_encrypt.html" => [ + "doc/man3/CMS_EncryptedData_encrypt.pod" + ], + "doc/html/man3/CMS_EncryptedData_set1_key.html" => [ + "doc/man3/CMS_EncryptedData_set1_key.pod" + ], + "doc/html/man3/CMS_EnvelopedData_create.html" => [ + "doc/man3/CMS_EnvelopedData_create.pod" + ], + "doc/html/man3/CMS_add0_cert.html" => [ + "doc/man3/CMS_add0_cert.pod" + ], + "doc/html/man3/CMS_add1_recipient_cert.html" => [ + "doc/man3/CMS_add1_recipient_cert.pod" + ], + "doc/html/man3/CMS_add1_signer.html" => [ + "doc/man3/CMS_add1_signer.pod" + ], + "doc/html/man3/CMS_compress.html" => [ + "doc/man3/CMS_compress.pod" + ], + "doc/html/man3/CMS_data_create.html" => [ + "doc/man3/CMS_data_create.pod" + ], + "doc/html/man3/CMS_decrypt.html" => [ + "doc/man3/CMS_decrypt.pod" + ], + "doc/html/man3/CMS_digest_create.html" => [ + "doc/man3/CMS_digest_create.pod" + ], + "doc/html/man3/CMS_encrypt.html" => [ + "doc/man3/CMS_encrypt.pod" + ], + "doc/html/man3/CMS_final.html" => [ + "doc/man3/CMS_final.pod" + ], + "doc/html/man3/CMS_get0_RecipientInfos.html" => [ + "doc/man3/CMS_get0_RecipientInfos.pod" + ], + "doc/html/man3/CMS_get0_SignerInfos.html" => [ + "doc/man3/CMS_get0_SignerInfos.pod" + ], + "doc/html/man3/CMS_get0_type.html" => [ + "doc/man3/CMS_get0_type.pod" + ], + "doc/html/man3/CMS_get1_ReceiptRequest.html" => [ + "doc/man3/CMS_get1_ReceiptRequest.pod" + ], + "doc/html/man3/CMS_sign.html" => [ + "doc/man3/CMS_sign.pod" + ], + "doc/html/man3/CMS_sign_receipt.html" => [ + "doc/man3/CMS_sign_receipt.pod" + ], + "doc/html/man3/CMS_signed_get_attr.html" => [ + "doc/man3/CMS_signed_get_attr.pod" + ], + "doc/html/man3/CMS_uncompress.html" => [ + "doc/man3/CMS_uncompress.pod" + ], + "doc/html/man3/CMS_verify.html" => [ + "doc/man3/CMS_verify.pod" + ], + "doc/html/man3/CMS_verify_receipt.html" => [ + "doc/man3/CMS_verify_receipt.pod" + ], + "doc/html/man3/COMP_CTX_new.html" => [ + "doc/man3/COMP_CTX_new.pod" + ], + "doc/html/man3/CONF_modules_free.html" => [ + "doc/man3/CONF_modules_free.pod" + ], + "doc/html/man3/CONF_modules_load_file.html" => [ + "doc/man3/CONF_modules_load_file.pod" + ], + "doc/html/man3/CRYPTO_THREAD_run_once.html" => [ + "doc/man3/CRYPTO_THREAD_run_once.pod" + ], + "doc/html/man3/CRYPTO_get_ex_new_index.html" => [ + "doc/man3/CRYPTO_get_ex_new_index.pod" + ], + "doc/html/man3/CRYPTO_memcmp.html" => [ + "doc/man3/CRYPTO_memcmp.pod" + ], + "doc/html/man3/CTLOG_STORE_get0_log_by_id.html" => [ + "doc/man3/CTLOG_STORE_get0_log_by_id.pod" + ], + "doc/html/man3/CTLOG_STORE_new.html" => [ + "doc/man3/CTLOG_STORE_new.pod" + ], + "doc/html/man3/CTLOG_new.html" => [ + "doc/man3/CTLOG_new.pod" + ], + "doc/html/man3/CT_POLICY_EVAL_CTX_new.html" => [ + "doc/man3/CT_POLICY_EVAL_CTX_new.pod" + ], + "doc/html/man3/DEFINE_STACK_OF.html" => [ + "doc/man3/DEFINE_STACK_OF.pod" + ], + "doc/html/man3/DES_random_key.html" => [ + "doc/man3/DES_random_key.pod" + ], + "doc/html/man3/DH_generate_key.html" => [ + "doc/man3/DH_generate_key.pod" + ], + "doc/html/man3/DH_generate_parameters.html" => [ + "doc/man3/DH_generate_parameters.pod" + ], + "doc/html/man3/DH_get0_pqg.html" => [ + "doc/man3/DH_get0_pqg.pod" + ], + "doc/html/man3/DH_get_1024_160.html" => [ + "doc/man3/DH_get_1024_160.pod" + ], + "doc/html/man3/DH_meth_new.html" => [ + "doc/man3/DH_meth_new.pod" + ], + "doc/html/man3/DH_new.html" => [ + "doc/man3/DH_new.pod" + ], + "doc/html/man3/DH_new_by_nid.html" => [ + "doc/man3/DH_new_by_nid.pod" + ], + "doc/html/man3/DH_set_method.html" => [ + "doc/man3/DH_set_method.pod" + ], + "doc/html/man3/DH_size.html" => [ + "doc/man3/DH_size.pod" + ], + "doc/html/man3/DSA_SIG_new.html" => [ + "doc/man3/DSA_SIG_new.pod" + ], + "doc/html/man3/DSA_do_sign.html" => [ + "doc/man3/DSA_do_sign.pod" + ], + "doc/html/man3/DSA_dup_DH.html" => [ + "doc/man3/DSA_dup_DH.pod" + ], + "doc/html/man3/DSA_generate_key.html" => [ + "doc/man3/DSA_generate_key.pod" + ], + "doc/html/man3/DSA_generate_parameters.html" => [ + "doc/man3/DSA_generate_parameters.pod" + ], + "doc/html/man3/DSA_get0_pqg.html" => [ + "doc/man3/DSA_get0_pqg.pod" + ], + "doc/html/man3/DSA_meth_new.html" => [ + "doc/man3/DSA_meth_new.pod" + ], + "doc/html/man3/DSA_new.html" => [ + "doc/man3/DSA_new.pod" + ], + "doc/html/man3/DSA_set_method.html" => [ + "doc/man3/DSA_set_method.pod" + ], + "doc/html/man3/DSA_sign.html" => [ + "doc/man3/DSA_sign.pod" + ], + "doc/html/man3/DSA_size.html" => [ + "doc/man3/DSA_size.pod" + ], + "doc/html/man3/DTLS_get_data_mtu.html" => [ + "doc/man3/DTLS_get_data_mtu.pod" + ], + "doc/html/man3/DTLS_set_timer_cb.html" => [ + "doc/man3/DTLS_set_timer_cb.pod" + ], + "doc/html/man3/DTLSv1_get_timeout.html" => [ + "doc/man3/DTLSv1_get_timeout.pod" + ], + "doc/html/man3/DTLSv1_handle_timeout.html" => [ + "doc/man3/DTLSv1_handle_timeout.pod" + ], + "doc/html/man3/DTLSv1_listen.html" => [ + "doc/man3/DTLSv1_listen.pod" + ], + "doc/html/man3/ECDSA_SIG_new.html" => [ + "doc/man3/ECDSA_SIG_new.pod" + ], + "doc/html/man3/ECDSA_sign.html" => [ + "doc/man3/ECDSA_sign.pod" + ], + "doc/html/man3/ECPKParameters_print.html" => [ + "doc/man3/ECPKParameters_print.pod" + ], + "doc/html/man3/EC_GFp_simple_method.html" => [ + "doc/man3/EC_GFp_simple_method.pod" + ], + "doc/html/man3/EC_GROUP_copy.html" => [ + "doc/man3/EC_GROUP_copy.pod" + ], + "doc/html/man3/EC_GROUP_new.html" => [ + "doc/man3/EC_GROUP_new.pod" + ], + "doc/html/man3/EC_KEY_get_enc_flags.html" => [ + "doc/man3/EC_KEY_get_enc_flags.pod" + ], + "doc/html/man3/EC_KEY_new.html" => [ + "doc/man3/EC_KEY_new.pod" + ], + "doc/html/man3/EC_POINT_add.html" => [ + "doc/man3/EC_POINT_add.pod" + ], + "doc/html/man3/EC_POINT_new.html" => [ + "doc/man3/EC_POINT_new.pod" + ], + "doc/html/man3/ENGINE_add.html" => [ + "doc/man3/ENGINE_add.pod" + ], + "doc/html/man3/ERR_GET_LIB.html" => [ + "doc/man3/ERR_GET_LIB.pod" + ], + "doc/html/man3/ERR_clear_error.html" => [ + "doc/man3/ERR_clear_error.pod" + ], + "doc/html/man3/ERR_error_string.html" => [ + "doc/man3/ERR_error_string.pod" + ], + "doc/html/man3/ERR_get_error.html" => [ + "doc/man3/ERR_get_error.pod" + ], + "doc/html/man3/ERR_load_crypto_strings.html" => [ + "doc/man3/ERR_load_crypto_strings.pod" + ], + "doc/html/man3/ERR_load_strings.html" => [ + "doc/man3/ERR_load_strings.pod" + ], + "doc/html/man3/ERR_new.html" => [ + "doc/man3/ERR_new.pod" + ], + "doc/html/man3/ERR_print_errors.html" => [ + "doc/man3/ERR_print_errors.pod" + ], + "doc/html/man3/ERR_put_error.html" => [ + "doc/man3/ERR_put_error.pod" + ], + "doc/html/man3/ERR_remove_state.html" => [ + "doc/man3/ERR_remove_state.pod" + ], + "doc/html/man3/ERR_set_mark.html" => [ + "doc/man3/ERR_set_mark.pod" + ], + "doc/html/man3/EVP_ASYM_CIPHER_free.html" => [ + "doc/man3/EVP_ASYM_CIPHER_free.pod" + ], + "doc/html/man3/EVP_BytesToKey.html" => [ + "doc/man3/EVP_BytesToKey.pod" + ], + "doc/html/man3/EVP_CIPHER_CTX_get_app_data.html" => [ + "doc/man3/EVP_CIPHER_CTX_get_app_data.pod" + ], + "doc/html/man3/EVP_CIPHER_CTX_get_cipher_data.html" => [ + "doc/man3/EVP_CIPHER_CTX_get_cipher_data.pod" + ], + "doc/html/man3/EVP_CIPHER_CTX_get_original_iv.html" => [ + "doc/man3/EVP_CIPHER_CTX_get_original_iv.pod" + ], + "doc/html/man3/EVP_CIPHER_meth_new.html" => [ + "doc/man3/EVP_CIPHER_meth_new.pod" + ], + "doc/html/man3/EVP_DigestInit.html" => [ + "doc/man3/EVP_DigestInit.pod" + ], + "doc/html/man3/EVP_DigestSignInit.html" => [ + "doc/man3/EVP_DigestSignInit.pod" + ], + "doc/html/man3/EVP_DigestVerifyInit.html" => [ + "doc/man3/EVP_DigestVerifyInit.pod" + ], + "doc/html/man3/EVP_EncodeInit.html" => [ + "doc/man3/EVP_EncodeInit.pod" + ], + "doc/html/man3/EVP_EncryptInit.html" => [ + "doc/man3/EVP_EncryptInit.pod" + ], + "doc/html/man3/EVP_KDF.html" => [ + "doc/man3/EVP_KDF.pod" + ], + "doc/html/man3/EVP_KEM_free.html" => [ + "doc/man3/EVP_KEM_free.pod" + ], + "doc/html/man3/EVP_KEYEXCH_free.html" => [ + "doc/man3/EVP_KEYEXCH_free.pod" + ], + "doc/html/man3/EVP_KEYMGMT.html" => [ + "doc/man3/EVP_KEYMGMT.pod" + ], + "doc/html/man3/EVP_MAC.html" => [ + "doc/man3/EVP_MAC.pod" + ], + "doc/html/man3/EVP_MD_meth_new.html" => [ + "doc/man3/EVP_MD_meth_new.pod" + ], + "doc/html/man3/EVP_OpenInit.html" => [ + "doc/man3/EVP_OpenInit.pod" + ], + "doc/html/man3/EVP_PBE_CipherInit.html" => [ + "doc/man3/EVP_PBE_CipherInit.pod" + ], + "doc/html/man3/EVP_PKEY2PKCS8.html" => [ + "doc/man3/EVP_PKEY2PKCS8.pod" + ], + "doc/html/man3/EVP_PKEY_ASN1_METHOD.html" => [ + "doc/man3/EVP_PKEY_ASN1_METHOD.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_ctrl.html" => [ + "doc/man3/EVP_PKEY_CTX_ctrl.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_get0_libctx.html" => [ + "doc/man3/EVP_PKEY_CTX_get0_libctx.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_get0_pkey.html" => [ + "doc/man3/EVP_PKEY_CTX_get0_pkey.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_get_algor.html" => [ + "doc/man3/EVP_PKEY_CTX_get_algor.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_new.html" => [ + "doc/man3/EVP_PKEY_CTX_new.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set1_pbe_pass.html" => [ + "doc/man3/EVP_PKEY_CTX_set1_pbe_pass.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_hkdf_md.html" => [ + "doc/man3/EVP_PKEY_CTX_set_hkdf_md.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_params.html" => [ + "doc/man3/EVP_PKEY_CTX_set_params.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.html" => [ + "doc/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_scrypt_N.html" => [ + "doc/man3/EVP_PKEY_CTX_set_scrypt_N.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_tls1_prf_md.html" => [ + "doc/man3/EVP_PKEY_CTX_set_tls1_prf_md.pod" + ], + "doc/html/man3/EVP_PKEY_asn1_get_count.html" => [ + "doc/man3/EVP_PKEY_asn1_get_count.pod" + ], + "doc/html/man3/EVP_PKEY_check.html" => [ + "doc/man3/EVP_PKEY_check.pod" + ], + "doc/html/man3/EVP_PKEY_copy_parameters.html" => [ + "doc/man3/EVP_PKEY_copy_parameters.pod" + ], + "doc/html/man3/EVP_PKEY_decapsulate.html" => [ + "doc/man3/EVP_PKEY_decapsulate.pod" + ], + "doc/html/man3/EVP_PKEY_decrypt.html" => [ + "doc/man3/EVP_PKEY_decrypt.pod" + ], + "doc/html/man3/EVP_PKEY_derive.html" => [ + "doc/man3/EVP_PKEY_derive.pod" + ], + "doc/html/man3/EVP_PKEY_digestsign_supports_digest.html" => [ + "doc/man3/EVP_PKEY_digestsign_supports_digest.pod" + ], + "doc/html/man3/EVP_PKEY_encapsulate.html" => [ + "doc/man3/EVP_PKEY_encapsulate.pod" + ], + "doc/html/man3/EVP_PKEY_encrypt.html" => [ + "doc/man3/EVP_PKEY_encrypt.pod" + ], + "doc/html/man3/EVP_PKEY_fromdata.html" => [ + "doc/man3/EVP_PKEY_fromdata.pod" + ], + "doc/html/man3/EVP_PKEY_get_attr.html" => [ + "doc/man3/EVP_PKEY_get_attr.pod" + ], + "doc/html/man3/EVP_PKEY_get_default_digest_nid.html" => [ + "doc/man3/EVP_PKEY_get_default_digest_nid.pod" + ], + "doc/html/man3/EVP_PKEY_get_field_type.html" => [ + "doc/man3/EVP_PKEY_get_field_type.pod" + ], + "doc/html/man3/EVP_PKEY_get_group_name.html" => [ + "doc/man3/EVP_PKEY_get_group_name.pod" + ], + "doc/html/man3/EVP_PKEY_get_size.html" => [ + "doc/man3/EVP_PKEY_get_size.pod" + ], + "doc/html/man3/EVP_PKEY_gettable_params.html" => [ + "doc/man3/EVP_PKEY_gettable_params.pod" + ], + "doc/html/man3/EVP_PKEY_is_a.html" => [ + "doc/man3/EVP_PKEY_is_a.pod" + ], + "doc/html/man3/EVP_PKEY_keygen.html" => [ + "doc/man3/EVP_PKEY_keygen.pod" + ], + "doc/html/man3/EVP_PKEY_meth_get_count.html" => [ + "doc/man3/EVP_PKEY_meth_get_count.pod" + ], + "doc/html/man3/EVP_PKEY_meth_new.html" => [ + "doc/man3/EVP_PKEY_meth_new.pod" + ], + "doc/html/man3/EVP_PKEY_new.html" => [ + "doc/man3/EVP_PKEY_new.pod" + ], + "doc/html/man3/EVP_PKEY_print_private.html" => [ + "doc/man3/EVP_PKEY_print_private.pod" + ], + "doc/html/man3/EVP_PKEY_set1_RSA.html" => [ + "doc/man3/EVP_PKEY_set1_RSA.pod" + ], + "doc/html/man3/EVP_PKEY_set1_encoded_public_key.html" => [ + "doc/man3/EVP_PKEY_set1_encoded_public_key.pod" + ], + "doc/html/man3/EVP_PKEY_set_type.html" => [ + "doc/man3/EVP_PKEY_set_type.pod" + ], + "doc/html/man3/EVP_PKEY_settable_params.html" => [ + "doc/man3/EVP_PKEY_settable_params.pod" + ], + "doc/html/man3/EVP_PKEY_sign.html" => [ + "doc/man3/EVP_PKEY_sign.pod" + ], + "doc/html/man3/EVP_PKEY_todata.html" => [ + "doc/man3/EVP_PKEY_todata.pod" + ], + "doc/html/man3/EVP_PKEY_verify.html" => [ + "doc/man3/EVP_PKEY_verify.pod" + ], + "doc/html/man3/EVP_PKEY_verify_recover.html" => [ + "doc/man3/EVP_PKEY_verify_recover.pod" + ], + "doc/html/man3/EVP_RAND.html" => [ + "doc/man3/EVP_RAND.pod" + ], + "doc/html/man3/EVP_SIGNATURE.html" => [ + "doc/man3/EVP_SIGNATURE.pod" + ], + "doc/html/man3/EVP_SKEY.html" => [ + "doc/man3/EVP_SKEY.pod" + ], + "doc/html/man3/EVP_SKEYMGMT.html" => [ + "doc/man3/EVP_SKEYMGMT.pod" + ], + "doc/html/man3/EVP_SealInit.html" => [ + "doc/man3/EVP_SealInit.pod" + ], + "doc/html/man3/EVP_SignInit.html" => [ + "doc/man3/EVP_SignInit.pod" + ], + "doc/html/man3/EVP_VerifyInit.html" => [ + "doc/man3/EVP_VerifyInit.pod" + ], + "doc/html/man3/EVP_aes_128_gcm.html" => [ + "doc/man3/EVP_aes_128_gcm.pod" + ], + "doc/html/man3/EVP_aria_128_gcm.html" => [ + "doc/man3/EVP_aria_128_gcm.pod" + ], + "doc/html/man3/EVP_bf_cbc.html" => [ + "doc/man3/EVP_bf_cbc.pod" + ], + "doc/html/man3/EVP_blake2b512.html" => [ + "doc/man3/EVP_blake2b512.pod" + ], + "doc/html/man3/EVP_camellia_128_ecb.html" => [ + "doc/man3/EVP_camellia_128_ecb.pod" + ], + "doc/html/man3/EVP_cast5_cbc.html" => [ + "doc/man3/EVP_cast5_cbc.pod" + ], + "doc/html/man3/EVP_chacha20.html" => [ + "doc/man3/EVP_chacha20.pod" + ], + "doc/html/man3/EVP_des_cbc.html" => [ + "doc/man3/EVP_des_cbc.pod" + ], + "doc/html/man3/EVP_desx_cbc.html" => [ + "doc/man3/EVP_desx_cbc.pod" + ], + "doc/html/man3/EVP_idea_cbc.html" => [ + "doc/man3/EVP_idea_cbc.pod" + ], + "doc/html/man3/EVP_md2.html" => [ + "doc/man3/EVP_md2.pod" + ], + "doc/html/man3/EVP_md4.html" => [ + "doc/man3/EVP_md4.pod" + ], + "doc/html/man3/EVP_md5.html" => [ + "doc/man3/EVP_md5.pod" + ], + "doc/html/man3/EVP_mdc2.html" => [ + "doc/man3/EVP_mdc2.pod" + ], + "doc/html/man3/EVP_rc2_cbc.html" => [ + "doc/man3/EVP_rc2_cbc.pod" + ], + "doc/html/man3/EVP_rc4.html" => [ + "doc/man3/EVP_rc4.pod" + ], + "doc/html/man3/EVP_rc5_32_12_16_cbc.html" => [ + "doc/man3/EVP_rc5_32_12_16_cbc.pod" + ], + "doc/html/man3/EVP_ripemd160.html" => [ + "doc/man3/EVP_ripemd160.pod" + ], + "doc/html/man3/EVP_seed_cbc.html" => [ + "doc/man3/EVP_seed_cbc.pod" + ], + "doc/html/man3/EVP_set_default_properties.html" => [ + "doc/man3/EVP_set_default_properties.pod" + ], + "doc/html/man3/EVP_sha1.html" => [ + "doc/man3/EVP_sha1.pod" + ], + "doc/html/man3/EVP_sha224.html" => [ + "doc/man3/EVP_sha224.pod" + ], + "doc/html/man3/EVP_sha3_224.html" => [ + "doc/man3/EVP_sha3_224.pod" + ], + "doc/html/man3/EVP_sm3.html" => [ + "doc/man3/EVP_sm3.pod" + ], + "doc/html/man3/EVP_sm4_cbc.html" => [ + "doc/man3/EVP_sm4_cbc.pod" + ], + "doc/html/man3/EVP_whirlpool.html" => [ + "doc/man3/EVP_whirlpool.pod" + ], + "doc/html/man3/GENERAL_NAME.html" => [ + "doc/man3/GENERAL_NAME.pod" + ], + "doc/html/man3/HMAC.html" => [ + "doc/man3/HMAC.pod" + ], + "doc/html/man3/MD5.html" => [ + "doc/man3/MD5.pod" + ], + "doc/html/man3/MDC2_Init.html" => [ + "doc/man3/MDC2_Init.pod" + ], + "doc/html/man3/NCONF_new_ex.html" => [ + "doc/man3/NCONF_new_ex.pod" + ], + "doc/html/man3/OBJ_nid2obj.html" => [ + "doc/man3/OBJ_nid2obj.pod" + ], + "doc/html/man3/OCSP_REQUEST_new.html" => [ + "doc/man3/OCSP_REQUEST_new.pod" + ], + "doc/html/man3/OCSP_cert_to_id.html" => [ + "doc/man3/OCSP_cert_to_id.pod" + ], + "doc/html/man3/OCSP_request_add1_nonce.html" => [ + "doc/man3/OCSP_request_add1_nonce.pod" + ], + "doc/html/man3/OCSP_resp_find_status.html" => [ + "doc/man3/OCSP_resp_find_status.pod" + ], + "doc/html/man3/OCSP_response_status.html" => [ + "doc/man3/OCSP_response_status.pod" + ], + "doc/html/man3/OCSP_sendreq_new.html" => [ + "doc/man3/OCSP_sendreq_new.pod" + ], + "doc/html/man3/OPENSSL_Applink.html" => [ + "doc/man3/OPENSSL_Applink.pod" + ], + "doc/html/man3/OPENSSL_FILE.html" => [ + "doc/man3/OPENSSL_FILE.pod" + ], + "doc/html/man3/OPENSSL_LH_COMPFUNC.html" => [ + "doc/man3/OPENSSL_LH_COMPFUNC.pod" + ], + "doc/html/man3/OPENSSL_LH_stats.html" => [ + "doc/man3/OPENSSL_LH_stats.pod" + ], + "doc/html/man3/OPENSSL_config.html" => [ + "doc/man3/OPENSSL_config.pod" + ], + "doc/html/man3/OPENSSL_fork_prepare.html" => [ + "doc/man3/OPENSSL_fork_prepare.pod" + ], + "doc/html/man3/OPENSSL_gmtime.html" => [ + "doc/man3/OPENSSL_gmtime.pod" + ], + "doc/html/man3/OPENSSL_hexchar2int.html" => [ + "doc/man3/OPENSSL_hexchar2int.pod" + ], + "doc/html/man3/OPENSSL_ia32cap.html" => [ + "doc/man3/OPENSSL_ia32cap.pod" + ], + "doc/html/man3/OPENSSL_init_crypto.html" => [ + "doc/man3/OPENSSL_init_crypto.pod" + ], + "doc/html/man3/OPENSSL_init_ssl.html" => [ + "doc/man3/OPENSSL_init_ssl.pod" + ], + "doc/html/man3/OPENSSL_instrument_bus.html" => [ + "doc/man3/OPENSSL_instrument_bus.pod" + ], + "doc/html/man3/OPENSSL_load_builtin_modules.html" => [ + "doc/man3/OPENSSL_load_builtin_modules.pod" + ], + "doc/html/man3/OPENSSL_load_u16_le.html" => [ + "doc/man3/OPENSSL_load_u16_le.pod" + ], + "doc/html/man3/OPENSSL_malloc.html" => [ + "doc/man3/OPENSSL_malloc.pod" + ], + "doc/html/man3/OPENSSL_ppccap.html" => [ + "doc/man3/OPENSSL_ppccap.pod" + ], + "doc/html/man3/OPENSSL_riscvcap.html" => [ + "doc/man3/OPENSSL_riscvcap.pod" + ], + "doc/html/man3/OPENSSL_s390xcap.html" => [ + "doc/man3/OPENSSL_s390xcap.pod" + ], + "doc/html/man3/OPENSSL_secure_malloc.html" => [ + "doc/man3/OPENSSL_secure_malloc.pod" + ], + "doc/html/man3/OPENSSL_strcasecmp.html" => [ + "doc/man3/OPENSSL_strcasecmp.pod" + ], + "doc/html/man3/OSSL_ALGORITHM.html" => [ + "doc/man3/OSSL_ALGORITHM.pod" + ], + "doc/html/man3/OSSL_CALLBACK.html" => [ + "doc/man3/OSSL_CALLBACK.pod" + ], + "doc/html/man3/OSSL_CMP_ATAV_set0.html" => [ + "doc/man3/OSSL_CMP_ATAV_set0.pod" + ], + "doc/html/man3/OSSL_CMP_CTX_new.html" => [ + "doc/man3/OSSL_CMP_CTX_new.pod" + ], + "doc/html/man3/OSSL_CMP_HDR_get0_transactionID.html" => [ + "doc/man3/OSSL_CMP_HDR_get0_transactionID.pod" + ], + "doc/html/man3/OSSL_CMP_ITAV_new_caCerts.html" => [ + "doc/man3/OSSL_CMP_ITAV_new_caCerts.pod" + ], + "doc/html/man3/OSSL_CMP_ITAV_set0.html" => [ + "doc/man3/OSSL_CMP_ITAV_set0.pod" + ], + "doc/html/man3/OSSL_CMP_MSG_get0_header.html" => [ + "doc/man3/OSSL_CMP_MSG_get0_header.pod" + ], + "doc/html/man3/OSSL_CMP_MSG_http_perform.html" => [ + "doc/man3/OSSL_CMP_MSG_http_perform.pod" + ], + "doc/html/man3/OSSL_CMP_SRV_CTX_new.html" => [ + "doc/man3/OSSL_CMP_SRV_CTX_new.pod" + ], + "doc/html/man3/OSSL_CMP_STATUSINFO_new.html" => [ + "doc/man3/OSSL_CMP_STATUSINFO_new.pod" + ], + "doc/html/man3/OSSL_CMP_exec_certreq.html" => [ + "doc/man3/OSSL_CMP_exec_certreq.pod" + ], + "doc/html/man3/OSSL_CMP_log_open.html" => [ + "doc/man3/OSSL_CMP_log_open.pod" + ], + "doc/html/man3/OSSL_CMP_validate_msg.html" => [ + "doc/man3/OSSL_CMP_validate_msg.pod" + ], + "doc/html/man3/OSSL_CORE_MAKE_FUNC.html" => [ + "doc/man3/OSSL_CORE_MAKE_FUNC.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_get0_tmpl.html" => [ + "doc/man3/OSSL_CRMF_MSG_get0_tmpl.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_set0_validity.html" => [ + "doc/man3/OSSL_CRMF_MSG_set0_validity.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.html" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.html" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.pod" + ], + "doc/html/man3/OSSL_CRMF_pbmp_new.html" => [ + "doc/man3/OSSL_CRMF_pbmp_new.pod" + ], + "doc/html/man3/OSSL_DECODER.html" => [ + "doc/man3/OSSL_DECODER.pod" + ], + "doc/html/man3/OSSL_DECODER_CTX.html" => [ + "doc/man3/OSSL_DECODER_CTX.pod" + ], + "doc/html/man3/OSSL_DECODER_CTX_new_for_pkey.html" => [ + "doc/man3/OSSL_DECODER_CTX_new_for_pkey.pod" + ], + "doc/html/man3/OSSL_DECODER_from_bio.html" => [ + "doc/man3/OSSL_DECODER_from_bio.pod" + ], + "doc/html/man3/OSSL_DISPATCH.html" => [ + "doc/man3/OSSL_DISPATCH.pod" + ], + "doc/html/man3/OSSL_ENCODER.html" => [ + "doc/man3/OSSL_ENCODER.pod" + ], + "doc/html/man3/OSSL_ENCODER_CTX.html" => [ + "doc/man3/OSSL_ENCODER_CTX.pod" + ], + "doc/html/man3/OSSL_ENCODER_CTX_new_for_pkey.html" => [ + "doc/man3/OSSL_ENCODER_CTX_new_for_pkey.pod" + ], + "doc/html/man3/OSSL_ENCODER_to_bio.html" => [ + "doc/man3/OSSL_ENCODER_to_bio.pod" + ], + "doc/html/man3/OSSL_ERR_STATE_save.html" => [ + "doc/man3/OSSL_ERR_STATE_save.pod" + ], + "doc/html/man3/OSSL_ESS_check_signing_certs.html" => [ + "doc/man3/OSSL_ESS_check_signing_certs.pod" + ], + "doc/html/man3/OSSL_GENERAL_NAMES_print.html" => [ + "doc/man3/OSSL_GENERAL_NAMES_print.pod" + ], + "doc/html/man3/OSSL_HPKE_CTX_new.html" => [ + "doc/man3/OSSL_HPKE_CTX_new.pod" + ], + "doc/html/man3/OSSL_HTTP_REQ_CTX.html" => [ + "doc/man3/OSSL_HTTP_REQ_CTX.pod" + ], + "doc/html/man3/OSSL_HTTP_parse_url.html" => [ + "doc/man3/OSSL_HTTP_parse_url.pod" + ], + "doc/html/man3/OSSL_HTTP_transfer.html" => [ + "doc/man3/OSSL_HTTP_transfer.pod" + ], + "doc/html/man3/OSSL_IETF_ATTR_SYNTAX.html" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX.pod" + ], + "doc/html/man3/OSSL_IETF_ATTR_SYNTAX_print.html" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX_print.pod" + ], + "doc/html/man3/OSSL_INDICATOR_set_callback.html" => [ + "doc/man3/OSSL_INDICATOR_set_callback.pod" + ], + "doc/html/man3/OSSL_ITEM.html" => [ + "doc/man3/OSSL_ITEM.pod" + ], + "doc/html/man3/OSSL_LIB_CTX.html" => [ + "doc/man3/OSSL_LIB_CTX.pod" + ], + "doc/html/man3/OSSL_LIB_CTX_set_conf_diagnostics.html" => [ + "doc/man3/OSSL_LIB_CTX_set_conf_diagnostics.pod" + ], + "doc/html/man3/OSSL_PARAM.html" => [ + "doc/man3/OSSL_PARAM.pod" + ], + "doc/html/man3/OSSL_PARAM_BLD.html" => [ + "doc/man3/OSSL_PARAM_BLD.pod" + ], + "doc/html/man3/OSSL_PARAM_allocate_from_text.html" => [ + "doc/man3/OSSL_PARAM_allocate_from_text.pod" + ], + "doc/html/man3/OSSL_PARAM_dup.html" => [ + "doc/man3/OSSL_PARAM_dup.pod" + ], + "doc/html/man3/OSSL_PARAM_int.html" => [ + "doc/man3/OSSL_PARAM_int.pod" + ], + "doc/html/man3/OSSL_PARAM_print_to_bio.html" => [ + "doc/man3/OSSL_PARAM_print_to_bio.pod" + ], + "doc/html/man3/OSSL_PROVIDER.html" => [ + "doc/man3/OSSL_PROVIDER.pod" + ], + "doc/html/man3/OSSL_QUIC_client_method.html" => [ + "doc/man3/OSSL_QUIC_client_method.pod" + ], + "doc/html/man3/OSSL_SELF_TEST_new.html" => [ + "doc/man3/OSSL_SELF_TEST_new.pod" + ], + "doc/html/man3/OSSL_SELF_TEST_set_callback.html" => [ + "doc/man3/OSSL_SELF_TEST_set_callback.pod" + ], + "doc/html/man3/OSSL_STORE_INFO.html" => [ + "doc/man3/OSSL_STORE_INFO.pod" + ], + "doc/html/man3/OSSL_STORE_LOADER.html" => [ + "doc/man3/OSSL_STORE_LOADER.pod" + ], + "doc/html/man3/OSSL_STORE_SEARCH.html" => [ + "doc/man3/OSSL_STORE_SEARCH.pod" + ], + "doc/html/man3/OSSL_STORE_attach.html" => [ + "doc/man3/OSSL_STORE_attach.pod" + ], + "doc/html/man3/OSSL_STORE_expect.html" => [ + "doc/man3/OSSL_STORE_expect.pod" + ], + "doc/html/man3/OSSL_STORE_open.html" => [ + "doc/man3/OSSL_STORE_open.pod" + ], + "doc/html/man3/OSSL_sleep.html" => [ + "doc/man3/OSSL_sleep.pod" + ], + "doc/html/man3/OSSL_trace_enabled.html" => [ + "doc/man3/OSSL_trace_enabled.pod" + ], + "doc/html/man3/OSSL_trace_get_category_num.html" => [ + "doc/man3/OSSL_trace_get_category_num.pod" + ], + "doc/html/man3/OSSL_trace_set_channel.html" => [ + "doc/man3/OSSL_trace_set_channel.pod" + ], + "doc/html/man3/OpenSSL_add_all_algorithms.html" => [ + "doc/man3/OpenSSL_add_all_algorithms.pod" + ], + "doc/html/man3/OpenSSL_version.html" => [ + "doc/man3/OpenSSL_version.pod" + ], + "doc/html/man3/PBMAC1_get1_pbkdf2_param.html" => [ + "doc/man3/PBMAC1_get1_pbkdf2_param.pod" + ], + "doc/html/man3/PEM_X509_INFO_read_bio_ex.html" => [ + "doc/man3/PEM_X509_INFO_read_bio_ex.pod" + ], + "doc/html/man3/PEM_bytes_read_bio.html" => [ + "doc/man3/PEM_bytes_read_bio.pod" + ], + "doc/html/man3/PEM_read.html" => [ + "doc/man3/PEM_read.pod" + ], + "doc/html/man3/PEM_read_CMS.html" => [ + "doc/man3/PEM_read_CMS.pod" + ], + "doc/html/man3/PEM_read_bio_PrivateKey.html" => [ + "doc/man3/PEM_read_bio_PrivateKey.pod" + ], + "doc/html/man3/PEM_read_bio_ex.html" => [ + "doc/man3/PEM_read_bio_ex.pod" + ], + "doc/html/man3/PEM_write_bio_CMS_stream.html" => [ + "doc/man3/PEM_write_bio_CMS_stream.pod" + ], + "doc/html/man3/PEM_write_bio_PKCS7_stream.html" => [ + "doc/man3/PEM_write_bio_PKCS7_stream.pod" + ], + "doc/html/man3/PKCS12_PBE_keyivgen.html" => [ + "doc/man3/PKCS12_PBE_keyivgen.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_create_cert.html" => [ + "doc/man3/PKCS12_SAFEBAG_create_cert.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_get0_attrs.html" => [ + "doc/man3/PKCS12_SAFEBAG_get0_attrs.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_get1_cert.html" => [ + "doc/man3/PKCS12_SAFEBAG_get1_cert.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_set0_attrs.html" => [ + "doc/man3/PKCS12_SAFEBAG_set0_attrs.pod" + ], + "doc/html/man3/PKCS12_add1_attr_by_NID.html" => [ + "doc/man3/PKCS12_add1_attr_by_NID.pod" + ], + "doc/html/man3/PKCS12_add_CSPName_asc.html" => [ + "doc/man3/PKCS12_add_CSPName_asc.pod" + ], + "doc/html/man3/PKCS12_add_cert.html" => [ + "doc/man3/PKCS12_add_cert.pod" + ], + "doc/html/man3/PKCS12_add_friendlyname_asc.html" => [ + "doc/man3/PKCS12_add_friendlyname_asc.pod" + ], + "doc/html/man3/PKCS12_add_localkeyid.html" => [ + "doc/man3/PKCS12_add_localkeyid.pod" + ], + "doc/html/man3/PKCS12_add_safe.html" => [ + "doc/man3/PKCS12_add_safe.pod" + ], + "doc/html/man3/PKCS12_create.html" => [ + "doc/man3/PKCS12_create.pod" + ], + "doc/html/man3/PKCS12_decrypt_skey.html" => [ + "doc/man3/PKCS12_decrypt_skey.pod" + ], + "doc/html/man3/PKCS12_gen_mac.html" => [ + "doc/man3/PKCS12_gen_mac.pod" + ], + "doc/html/man3/PKCS12_get_friendlyname.html" => [ + "doc/man3/PKCS12_get_friendlyname.pod" + ], + "doc/html/man3/PKCS12_init.html" => [ + "doc/man3/PKCS12_init.pod" + ], + "doc/html/man3/PKCS12_item_decrypt_d2i.html" => [ + "doc/man3/PKCS12_item_decrypt_d2i.pod" + ], + "doc/html/man3/PKCS12_key_gen_utf8_ex.html" => [ + "doc/man3/PKCS12_key_gen_utf8_ex.pod" + ], + "doc/html/man3/PKCS12_newpass.html" => [ + "doc/man3/PKCS12_newpass.pod" + ], + "doc/html/man3/PKCS12_pack_p7encdata.html" => [ + "doc/man3/PKCS12_pack_p7encdata.pod" + ], + "doc/html/man3/PKCS12_parse.html" => [ + "doc/man3/PKCS12_parse.pod" + ], + "doc/html/man3/PKCS5_PBE_keyivgen.html" => [ + "doc/man3/PKCS5_PBE_keyivgen.pod" + ], + "doc/html/man3/PKCS5_PBKDF2_HMAC.html" => [ + "doc/man3/PKCS5_PBKDF2_HMAC.pod" + ], + "doc/html/man3/PKCS7_decrypt.html" => [ + "doc/man3/PKCS7_decrypt.pod" + ], + "doc/html/man3/PKCS7_encrypt.html" => [ + "doc/man3/PKCS7_encrypt.pod" + ], + "doc/html/man3/PKCS7_get_octet_string.html" => [ + "doc/man3/PKCS7_get_octet_string.pod" + ], + "doc/html/man3/PKCS7_sign.html" => [ + "doc/man3/PKCS7_sign.pod" + ], + "doc/html/man3/PKCS7_sign_add_signer.html" => [ + "doc/man3/PKCS7_sign_add_signer.pod" + ], + "doc/html/man3/PKCS7_type_is_other.html" => [ + "doc/man3/PKCS7_type_is_other.pod" + ], + "doc/html/man3/PKCS7_verify.html" => [ + "doc/man3/PKCS7_verify.pod" + ], + "doc/html/man3/PKCS8_encrypt.html" => [ + "doc/man3/PKCS8_encrypt.pod" + ], + "doc/html/man3/PKCS8_pkey_add1_attr.html" => [ + "doc/man3/PKCS8_pkey_add1_attr.pod" + ], + "doc/html/man3/RAND_add.html" => [ + "doc/man3/RAND_add.pod" + ], + "doc/html/man3/RAND_bytes.html" => [ + "doc/man3/RAND_bytes.pod" + ], + "doc/html/man3/RAND_cleanup.html" => [ + "doc/man3/RAND_cleanup.pod" + ], + "doc/html/man3/RAND_egd.html" => [ + "doc/man3/RAND_egd.pod" + ], + "doc/html/man3/RAND_get0_primary.html" => [ + "doc/man3/RAND_get0_primary.pod" + ], + "doc/html/man3/RAND_load_file.html" => [ + "doc/man3/RAND_load_file.pod" + ], + "doc/html/man3/RAND_set_DRBG_type.html" => [ + "doc/man3/RAND_set_DRBG_type.pod" + ], + "doc/html/man3/RAND_set_rand_method.html" => [ + "doc/man3/RAND_set_rand_method.pod" + ], + "doc/html/man3/RC4_set_key.html" => [ + "doc/man3/RC4_set_key.pod" + ], + "doc/html/man3/RIPEMD160_Init.html" => [ + "doc/man3/RIPEMD160_Init.pod" + ], + "doc/html/man3/RSA_blinding_on.html" => [ + "doc/man3/RSA_blinding_on.pod" + ], + "doc/html/man3/RSA_check_key.html" => [ + "doc/man3/RSA_check_key.pod" + ], + "doc/html/man3/RSA_generate_key.html" => [ + "doc/man3/RSA_generate_key.pod" + ], + "doc/html/man3/RSA_get0_key.html" => [ + "doc/man3/RSA_get0_key.pod" + ], + "doc/html/man3/RSA_meth_new.html" => [ + "doc/man3/RSA_meth_new.pod" + ], + "doc/html/man3/RSA_new.html" => [ + "doc/man3/RSA_new.pod" + ], + "doc/html/man3/RSA_padding_add_PKCS1_type_1.html" => [ + "doc/man3/RSA_padding_add_PKCS1_type_1.pod" + ], + "doc/html/man3/RSA_print.html" => [ + "doc/man3/RSA_print.pod" + ], + "doc/html/man3/RSA_private_encrypt.html" => [ + "doc/man3/RSA_private_encrypt.pod" + ], + "doc/html/man3/RSA_public_encrypt.html" => [ + "doc/man3/RSA_public_encrypt.pod" + ], + "doc/html/man3/RSA_set_method.html" => [ + "doc/man3/RSA_set_method.pod" + ], + "doc/html/man3/RSA_sign.html" => [ + "doc/man3/RSA_sign.pod" + ], + "doc/html/man3/RSA_sign_ASN1_OCTET_STRING.html" => [ + "doc/man3/RSA_sign_ASN1_OCTET_STRING.pod" + ], + "doc/html/man3/RSA_size.html" => [ + "doc/man3/RSA_size.pod" + ], + "doc/html/man3/SCT_new.html" => [ + "doc/man3/SCT_new.pod" + ], + "doc/html/man3/SCT_print.html" => [ + "doc/man3/SCT_print.pod" + ], + "doc/html/man3/SCT_validate.html" => [ + "doc/man3/SCT_validate.pod" + ], + "doc/html/man3/SHA256_Init.html" => [ + "doc/man3/SHA256_Init.pod" + ], + "doc/html/man3/SMIME_read_ASN1.html" => [ + "doc/man3/SMIME_read_ASN1.pod" + ], + "doc/html/man3/SMIME_read_CMS.html" => [ + "doc/man3/SMIME_read_CMS.pod" + ], + "doc/html/man3/SMIME_read_PKCS7.html" => [ + "doc/man3/SMIME_read_PKCS7.pod" + ], + "doc/html/man3/SMIME_write_ASN1.html" => [ + "doc/man3/SMIME_write_ASN1.pod" + ], + "doc/html/man3/SMIME_write_CMS.html" => [ + "doc/man3/SMIME_write_CMS.pod" + ], + "doc/html/man3/SMIME_write_PKCS7.html" => [ + "doc/man3/SMIME_write_PKCS7.pod" + ], + "doc/html/man3/SRP_Calc_B.html" => [ + "doc/man3/SRP_Calc_B.pod" + ], + "doc/html/man3/SRP_VBASE_new.html" => [ + "doc/man3/SRP_VBASE_new.pod" + ], + "doc/html/man3/SRP_create_verifier.html" => [ + "doc/man3/SRP_create_verifier.pod" + ], + "doc/html/man3/SRP_user_pwd_new.html" => [ + "doc/man3/SRP_user_pwd_new.pod" + ], + "doc/html/man3/SSL_CIPHER_get_name.html" => [ + "doc/man3/SSL_CIPHER_get_name.pod" + ], + "doc/html/man3/SSL_COMP_add_compression_method.html" => [ + "doc/man3/SSL_COMP_add_compression_method.pod" + ], + "doc/html/man3/SSL_CONF_CTX_new.html" => [ + "doc/man3/SSL_CONF_CTX_new.pod" + ], + "doc/html/man3/SSL_CONF_CTX_set1_prefix.html" => [ + "doc/man3/SSL_CONF_CTX_set1_prefix.pod" + ], + "doc/html/man3/SSL_CONF_CTX_set_flags.html" => [ + "doc/man3/SSL_CONF_CTX_set_flags.pod" + ], + "doc/html/man3/SSL_CONF_CTX_set_ssl_ctx.html" => [ + "doc/man3/SSL_CONF_CTX_set_ssl_ctx.pod" + ], + "doc/html/man3/SSL_CONF_cmd.html" => [ + "doc/man3/SSL_CONF_cmd.pod" + ], + "doc/html/man3/SSL_CONF_cmd_argv.html" => [ + "doc/man3/SSL_CONF_cmd_argv.pod" + ], + "doc/html/man3/SSL_CTX_add1_chain_cert.html" => [ + "doc/man3/SSL_CTX_add1_chain_cert.pod" + ], + "doc/html/man3/SSL_CTX_add_extra_chain_cert.html" => [ + "doc/man3/SSL_CTX_add_extra_chain_cert.pod" + ], + "doc/html/man3/SSL_CTX_add_session.html" => [ + "doc/man3/SSL_CTX_add_session.pod" + ], + "doc/html/man3/SSL_CTX_config.html" => [ + "doc/man3/SSL_CTX_config.pod" + ], + "doc/html/man3/SSL_CTX_ctrl.html" => [ + "doc/man3/SSL_CTX_ctrl.pod" + ], + "doc/html/man3/SSL_CTX_dane_enable.html" => [ + "doc/man3/SSL_CTX_dane_enable.pod" + ], + "doc/html/man3/SSL_CTX_flush_sessions.html" => [ + "doc/man3/SSL_CTX_flush_sessions.pod" + ], + "doc/html/man3/SSL_CTX_free.html" => [ + "doc/man3/SSL_CTX_free.pod" + ], + "doc/html/man3/SSL_CTX_get0_param.html" => [ + "doc/man3/SSL_CTX_get0_param.pod" + ], + "doc/html/man3/SSL_CTX_get_verify_mode.html" => [ + "doc/man3/SSL_CTX_get_verify_mode.pod" + ], + "doc/html/man3/SSL_CTX_has_client_custom_ext.html" => [ + "doc/man3/SSL_CTX_has_client_custom_ext.pod" + ], + "doc/html/man3/SSL_CTX_load_verify_locations.html" => [ + "doc/man3/SSL_CTX_load_verify_locations.pod" + ], + "doc/html/man3/SSL_CTX_new.html" => [ + "doc/man3/SSL_CTX_new.pod" + ], + "doc/html/man3/SSL_CTX_sess_number.html" => [ + "doc/man3/SSL_CTX_sess_number.pod" + ], + "doc/html/man3/SSL_CTX_sess_set_cache_size.html" => [ + "doc/man3/SSL_CTX_sess_set_cache_size.pod" + ], + "doc/html/man3/SSL_CTX_sess_set_get_cb.html" => [ + "doc/man3/SSL_CTX_sess_set_get_cb.pod" + ], + "doc/html/man3/SSL_CTX_sessions.html" => [ + "doc/man3/SSL_CTX_sessions.pod" + ], + "doc/html/man3/SSL_CTX_set0_CA_list.html" => [ + "doc/man3/SSL_CTX_set0_CA_list.pod" + ], + "doc/html/man3/SSL_CTX_set1_cert_comp_preference.html" => [ + "doc/man3/SSL_CTX_set1_cert_comp_preference.pod" + ], + "doc/html/man3/SSL_CTX_set1_curves.html" => [ + "doc/man3/SSL_CTX_set1_curves.pod" + ], + "doc/html/man3/SSL_CTX_set1_sigalgs.html" => [ + "doc/man3/SSL_CTX_set1_sigalgs.pod" + ], + "doc/html/man3/SSL_CTX_set1_verify_cert_store.html" => [ + "doc/man3/SSL_CTX_set1_verify_cert_store.pod" + ], + "doc/html/man3/SSL_CTX_set_alpn_select_cb.html" => [ + "doc/man3/SSL_CTX_set_alpn_select_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_cert_cb.html" => [ + "doc/man3/SSL_CTX_set_cert_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_cert_store.html" => [ + "doc/man3/SSL_CTX_set_cert_store.pod" + ], + "doc/html/man3/SSL_CTX_set_cert_verify_callback.html" => [ + "doc/man3/SSL_CTX_set_cert_verify_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_cipher_list.html" => [ + "doc/man3/SSL_CTX_set_cipher_list.pod" + ], + "doc/html/man3/SSL_CTX_set_client_cert_cb.html" => [ + "doc/man3/SSL_CTX_set_client_cert_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_client_hello_cb.html" => [ + "doc/man3/SSL_CTX_set_client_hello_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_ct_validation_callback.html" => [ + "doc/man3/SSL_CTX_set_ct_validation_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_ctlog_list_file.html" => [ + "doc/man3/SSL_CTX_set_ctlog_list_file.pod" + ], + "doc/html/man3/SSL_CTX_set_default_passwd_cb.html" => [ + "doc/man3/SSL_CTX_set_default_passwd_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_domain_flags.html" => [ + "doc/man3/SSL_CTX_set_domain_flags.pod" + ], + "doc/html/man3/SSL_CTX_set_generate_session_id.html" => [ + "doc/man3/SSL_CTX_set_generate_session_id.pod" + ], + "doc/html/man3/SSL_CTX_set_info_callback.html" => [ + "doc/man3/SSL_CTX_set_info_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_keylog_callback.html" => [ + "doc/man3/SSL_CTX_set_keylog_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_max_cert_list.html" => [ + "doc/man3/SSL_CTX_set_max_cert_list.pod" + ], + "doc/html/man3/SSL_CTX_set_min_proto_version.html" => [ + "doc/man3/SSL_CTX_set_min_proto_version.pod" + ], + "doc/html/man3/SSL_CTX_set_mode.html" => [ + "doc/man3/SSL_CTX_set_mode.pod" + ], + "doc/html/man3/SSL_CTX_set_msg_callback.html" => [ + "doc/man3/SSL_CTX_set_msg_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_new_pending_conn_cb.html" => [ + "doc/man3/SSL_CTX_set_new_pending_conn_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_num_tickets.html" => [ + "doc/man3/SSL_CTX_set_num_tickets.pod" + ], + "doc/html/man3/SSL_CTX_set_options.html" => [ + "doc/man3/SSL_CTX_set_options.pod" + ], + "doc/html/man3/SSL_CTX_set_psk_client_callback.html" => [ + "doc/man3/SSL_CTX_set_psk_client_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_quiet_shutdown.html" => [ + "doc/man3/SSL_CTX_set_quiet_shutdown.pod" + ], + "doc/html/man3/SSL_CTX_set_read_ahead.html" => [ + "doc/man3/SSL_CTX_set_read_ahead.pod" + ], + "doc/html/man3/SSL_CTX_set_record_padding_callback.html" => [ + "doc/man3/SSL_CTX_set_record_padding_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_security_level.html" => [ + "doc/man3/SSL_CTX_set_security_level.pod" + ], + "doc/html/man3/SSL_CTX_set_session_cache_mode.html" => [ + "doc/man3/SSL_CTX_set_session_cache_mode.pod" + ], + "doc/html/man3/SSL_CTX_set_session_id_context.html" => [ + "doc/man3/SSL_CTX_set_session_id_context.pod" + ], + "doc/html/man3/SSL_CTX_set_session_ticket_cb.html" => [ + "doc/man3/SSL_CTX_set_session_ticket_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_split_send_fragment.html" => [ + "doc/man3/SSL_CTX_set_split_send_fragment.pod" + ], + "doc/html/man3/SSL_CTX_set_srp_password.html" => [ + "doc/man3/SSL_CTX_set_srp_password.pod" + ], + "doc/html/man3/SSL_CTX_set_ssl_version.html" => [ + "doc/man3/SSL_CTX_set_ssl_version.pod" + ], + "doc/html/man3/SSL_CTX_set_stateless_cookie_generate_cb.html" => [ + "doc/man3/SSL_CTX_set_stateless_cookie_generate_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_timeout.html" => [ + "doc/man3/SSL_CTX_set_timeout.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_servername_callback.html" => [ + "doc/man3/SSL_CTX_set_tlsext_servername_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_status_cb.html" => [ + "doc/man3/SSL_CTX_set_tlsext_status_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_ticket_key_cb.html" => [ + "doc/man3/SSL_CTX_set_tlsext_ticket_key_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_use_srtp.html" => [ + "doc/man3/SSL_CTX_set_tlsext_use_srtp.pod" + ], + "doc/html/man3/SSL_CTX_set_tmp_dh_callback.html" => [ + "doc/man3/SSL_CTX_set_tmp_dh_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_tmp_ecdh.html" => [ + "doc/man3/SSL_CTX_set_tmp_ecdh.pod" + ], + "doc/html/man3/SSL_CTX_set_verify.html" => [ + "doc/man3/SSL_CTX_set_verify.pod" + ], + "doc/html/man3/SSL_CTX_use_certificate.html" => [ + "doc/man3/SSL_CTX_use_certificate.pod" + ], + "doc/html/man3/SSL_CTX_use_psk_identity_hint.html" => [ + "doc/man3/SSL_CTX_use_psk_identity_hint.pod" + ], + "doc/html/man3/SSL_CTX_use_serverinfo.html" => [ + "doc/man3/SSL_CTX_use_serverinfo.pod" + ], + "doc/html/man3/SSL_SESSION_free.html" => [ + "doc/man3/SSL_SESSION_free.pod" + ], + "doc/html/man3/SSL_SESSION_get0_cipher.html" => [ + "doc/man3/SSL_SESSION_get0_cipher.pod" + ], + "doc/html/man3/SSL_SESSION_get0_hostname.html" => [ + "doc/man3/SSL_SESSION_get0_hostname.pod" + ], + "doc/html/man3/SSL_SESSION_get0_id_context.html" => [ + "doc/man3/SSL_SESSION_get0_id_context.pod" + ], + "doc/html/man3/SSL_SESSION_get0_peer.html" => [ + "doc/man3/SSL_SESSION_get0_peer.pod" + ], + "doc/html/man3/SSL_SESSION_get_compress_id.html" => [ + "doc/man3/SSL_SESSION_get_compress_id.pod" + ], + "doc/html/man3/SSL_SESSION_get_protocol_version.html" => [ + "doc/man3/SSL_SESSION_get_protocol_version.pod" + ], + "doc/html/man3/SSL_SESSION_get_time.html" => [ + "doc/man3/SSL_SESSION_get_time.pod" + ], + "doc/html/man3/SSL_SESSION_has_ticket.html" => [ + "doc/man3/SSL_SESSION_has_ticket.pod" + ], + "doc/html/man3/SSL_SESSION_is_resumable.html" => [ + "doc/man3/SSL_SESSION_is_resumable.pod" + ], + "doc/html/man3/SSL_SESSION_print.html" => [ + "doc/man3/SSL_SESSION_print.pod" + ], + "doc/html/man3/SSL_SESSION_set1_id.html" => [ + "doc/man3/SSL_SESSION_set1_id.pod" + ], + "doc/html/man3/SSL_accept.html" => [ + "doc/man3/SSL_accept.pod" + ], + "doc/html/man3/SSL_accept_stream.html" => [ + "doc/man3/SSL_accept_stream.pod" + ], + "doc/html/man3/SSL_alert_type_string.html" => [ + "doc/man3/SSL_alert_type_string.pod" + ], + "doc/html/man3/SSL_alloc_buffers.html" => [ + "doc/man3/SSL_alloc_buffers.pod" + ], + "doc/html/man3/SSL_check_chain.html" => [ + "doc/man3/SSL_check_chain.pod" + ], + "doc/html/man3/SSL_clear.html" => [ + "doc/man3/SSL_clear.pod" + ], + "doc/html/man3/SSL_connect.html" => [ + "doc/man3/SSL_connect.pod" + ], + "doc/html/man3/SSL_do_handshake.html" => [ + "doc/man3/SSL_do_handshake.pod" + ], + "doc/html/man3/SSL_export_keying_material.html" => [ + "doc/man3/SSL_export_keying_material.pod" + ], + "doc/html/man3/SSL_extension_supported.html" => [ + "doc/man3/SSL_extension_supported.pod" + ], + "doc/html/man3/SSL_free.html" => [ + "doc/man3/SSL_free.pod" + ], + "doc/html/man3/SSL_get0_connection.html" => [ + "doc/man3/SSL_get0_connection.pod" + ], + "doc/html/man3/SSL_get0_group_name.html" => [ + "doc/man3/SSL_get0_group_name.pod" + ], + "doc/html/man3/SSL_get0_peer_rpk.html" => [ + "doc/man3/SSL_get0_peer_rpk.pod" + ], + "doc/html/man3/SSL_get0_peer_scts.html" => [ + "doc/man3/SSL_get0_peer_scts.pod" + ], + "doc/html/man3/SSL_get1_builtin_sigalgs.html" => [ + "doc/man3/SSL_get1_builtin_sigalgs.pod" + ], + "doc/html/man3/SSL_get_SSL_CTX.html" => [ + "doc/man3/SSL_get_SSL_CTX.pod" + ], + "doc/html/man3/SSL_get_all_async_fds.html" => [ + "doc/man3/SSL_get_all_async_fds.pod" + ], + "doc/html/man3/SSL_get_certificate.html" => [ + "doc/man3/SSL_get_certificate.pod" + ], + "doc/html/man3/SSL_get_ciphers.html" => [ + "doc/man3/SSL_get_ciphers.pod" + ], + "doc/html/man3/SSL_get_client_random.html" => [ + "doc/man3/SSL_get_client_random.pod" + ], + "doc/html/man3/SSL_get_conn_close_info.html" => [ + "doc/man3/SSL_get_conn_close_info.pod" + ], + "doc/html/man3/SSL_get_current_cipher.html" => [ + "doc/man3/SSL_get_current_cipher.pod" + ], + "doc/html/man3/SSL_get_default_timeout.html" => [ + "doc/man3/SSL_get_default_timeout.pod" + ], + "doc/html/man3/SSL_get_error.html" => [ + "doc/man3/SSL_get_error.pod" + ], + "doc/html/man3/SSL_get_event_timeout.html" => [ + "doc/man3/SSL_get_event_timeout.pod" + ], + "doc/html/man3/SSL_get_extms_support.html" => [ + "doc/man3/SSL_get_extms_support.pod" + ], + "doc/html/man3/SSL_get_fd.html" => [ + "doc/man3/SSL_get_fd.pod" + ], + "doc/html/man3/SSL_get_handshake_rtt.html" => [ + "doc/man3/SSL_get_handshake_rtt.pod" + ], + "doc/html/man3/SSL_get_peer_cert_chain.html" => [ + "doc/man3/SSL_get_peer_cert_chain.pod" + ], + "doc/html/man3/SSL_get_peer_certificate.html" => [ + "doc/man3/SSL_get_peer_certificate.pod" + ], + "doc/html/man3/SSL_get_peer_signature_nid.html" => [ + "doc/man3/SSL_get_peer_signature_nid.pod" + ], + "doc/html/man3/SSL_get_peer_tmp_key.html" => [ + "doc/man3/SSL_get_peer_tmp_key.pod" + ], + "doc/html/man3/SSL_get_psk_identity.html" => [ + "doc/man3/SSL_get_psk_identity.pod" + ], + "doc/html/man3/SSL_get_rbio.html" => [ + "doc/man3/SSL_get_rbio.pod" + ], + "doc/html/man3/SSL_get_rpoll_descriptor.html" => [ + "doc/man3/SSL_get_rpoll_descriptor.pod" + ], + "doc/html/man3/SSL_get_session.html" => [ + "doc/man3/SSL_get_session.pod" + ], + "doc/html/man3/SSL_get_shared_sigalgs.html" => [ + "doc/man3/SSL_get_shared_sigalgs.pod" + ], + "doc/html/man3/SSL_get_stream_id.html" => [ + "doc/man3/SSL_get_stream_id.pod" + ], + "doc/html/man3/SSL_get_stream_read_state.html" => [ + "doc/man3/SSL_get_stream_read_state.pod" + ], + "doc/html/man3/SSL_get_value_uint.html" => [ + "doc/man3/SSL_get_value_uint.pod" + ], + "doc/html/man3/SSL_get_verify_result.html" => [ + "doc/man3/SSL_get_verify_result.pod" + ], + "doc/html/man3/SSL_get_version.html" => [ + "doc/man3/SSL_get_version.pod" + ], + "doc/html/man3/SSL_group_to_name.html" => [ + "doc/man3/SSL_group_to_name.pod" + ], + "doc/html/man3/SSL_handle_events.html" => [ + "doc/man3/SSL_handle_events.pod" + ], + "doc/html/man3/SSL_in_init.html" => [ + "doc/man3/SSL_in_init.pod" + ], + "doc/html/man3/SSL_inject_net_dgram.html" => [ + "doc/man3/SSL_inject_net_dgram.pod" + ], + "doc/html/man3/SSL_key_update.html" => [ + "doc/man3/SSL_key_update.pod" + ], + "doc/html/man3/SSL_library_init.html" => [ + "doc/man3/SSL_library_init.pod" + ], + "doc/html/man3/SSL_load_client_CA_file.html" => [ + "doc/man3/SSL_load_client_CA_file.pod" + ], + "doc/html/man3/SSL_new.html" => [ + "doc/man3/SSL_new.pod" + ], + "doc/html/man3/SSL_new_domain.html" => [ + "doc/man3/SSL_new_domain.pod" + ], + "doc/html/man3/SSL_new_listener.html" => [ + "doc/man3/SSL_new_listener.pod" + ], + "doc/html/man3/SSL_new_stream.html" => [ + "doc/man3/SSL_new_stream.pod" + ], + "doc/html/man3/SSL_pending.html" => [ + "doc/man3/SSL_pending.pod" + ], + "doc/html/man3/SSL_poll.html" => [ + "doc/man3/SSL_poll.pod" + ], + "doc/html/man3/SSL_read.html" => [ + "doc/man3/SSL_read.pod" + ], + "doc/html/man3/SSL_read_early_data.html" => [ + "doc/man3/SSL_read_early_data.pod" + ], + "doc/html/man3/SSL_rstate_string.html" => [ + "doc/man3/SSL_rstate_string.pod" + ], + "doc/html/man3/SSL_session_reused.html" => [ + "doc/man3/SSL_session_reused.pod" + ], + "doc/html/man3/SSL_set1_host.html" => [ + "doc/man3/SSL_set1_host.pod" + ], + "doc/html/man3/SSL_set1_initial_peer_addr.html" => [ + "doc/man3/SSL_set1_initial_peer_addr.pod" + ], + "doc/html/man3/SSL_set1_server_cert_type.html" => [ + "doc/man3/SSL_set1_server_cert_type.pod" + ], + "doc/html/man3/SSL_set_async_callback.html" => [ + "doc/man3/SSL_set_async_callback.pod" + ], + "doc/html/man3/SSL_set_bio.html" => [ + "doc/man3/SSL_set_bio.pod" + ], + "doc/html/man3/SSL_set_blocking_mode.html" => [ + "doc/man3/SSL_set_blocking_mode.pod" + ], + "doc/html/man3/SSL_set_connect_state.html" => [ + "doc/man3/SSL_set_connect_state.pod" + ], + "doc/html/man3/SSL_set_default_stream_mode.html" => [ + "doc/man3/SSL_set_default_stream_mode.pod" + ], + "doc/html/man3/SSL_set_fd.html" => [ + "doc/man3/SSL_set_fd.pod" + ], + "doc/html/man3/SSL_set_incoming_stream_policy.html" => [ + "doc/man3/SSL_set_incoming_stream_policy.pod" + ], + "doc/html/man3/SSL_set_quic_tls_cbs.html" => [ + "doc/man3/SSL_set_quic_tls_cbs.pod" + ], + "doc/html/man3/SSL_set_retry_verify.html" => [ + "doc/man3/SSL_set_retry_verify.pod" + ], + "doc/html/man3/SSL_set_session.html" => [ + "doc/man3/SSL_set_session.pod" + ], + "doc/html/man3/SSL_set_session_secret_cb.html" => [ + "doc/man3/SSL_set_session_secret_cb.pod" + ], + "doc/html/man3/SSL_set_shutdown.html" => [ + "doc/man3/SSL_set_shutdown.pod" + ], + "doc/html/man3/SSL_set_verify_result.html" => [ + "doc/man3/SSL_set_verify_result.pod" + ], + "doc/html/man3/SSL_shutdown.html" => [ + "doc/man3/SSL_shutdown.pod" + ], + "doc/html/man3/SSL_state_string.html" => [ + "doc/man3/SSL_state_string.pod" + ], + "doc/html/man3/SSL_stream_conclude.html" => [ + "doc/man3/SSL_stream_conclude.pod" + ], + "doc/html/man3/SSL_stream_reset.html" => [ + "doc/man3/SSL_stream_reset.pod" + ], + "doc/html/man3/SSL_want.html" => [ + "doc/man3/SSL_want.pod" + ], + "doc/html/man3/SSL_write.html" => [ + "doc/man3/SSL_write.pod" + ], + "doc/html/man3/TS_RESP_CTX_new.html" => [ + "doc/man3/TS_RESP_CTX_new.pod" + ], + "doc/html/man3/TS_VERIFY_CTX.html" => [ + "doc/man3/TS_VERIFY_CTX.pod" + ], + "doc/html/man3/UI_STRING.html" => [ + "doc/man3/UI_STRING.pod" + ], + "doc/html/man3/UI_UTIL_read_pw.html" => [ + "doc/man3/UI_UTIL_read_pw.pod" + ], + "doc/html/man3/UI_create_method.html" => [ + "doc/man3/UI_create_method.pod" + ], + "doc/html/man3/UI_new.html" => [ + "doc/man3/UI_new.pod" + ], + "doc/html/man3/X509V3_EXT_print.html" => [ + "doc/man3/X509V3_EXT_print.pod" + ], + "doc/html/man3/X509V3_get_d2i.html" => [ + "doc/man3/X509V3_get_d2i.pod" + ], + "doc/html/man3/X509V3_set_ctx.html" => [ + "doc/man3/X509V3_set_ctx.pod" + ], + "doc/html/man3/X509_ACERT_add1_attr.html" => [ + "doc/man3/X509_ACERT_add1_attr.pod" + ], + "doc/html/man3/X509_ACERT_add_attr_nconf.html" => [ + "doc/man3/X509_ACERT_add_attr_nconf.pod" + ], + "doc/html/man3/X509_ACERT_get0_holder_baseCertId.html" => [ + "doc/man3/X509_ACERT_get0_holder_baseCertId.pod" + ], + "doc/html/man3/X509_ACERT_get_attr.html" => [ + "doc/man3/X509_ACERT_get_attr.pod" + ], + "doc/html/man3/X509_ACERT_print_ex.html" => [ + "doc/man3/X509_ACERT_print_ex.pod" + ], + "doc/html/man3/X509_ALGOR_dup.html" => [ + "doc/man3/X509_ALGOR_dup.pod" + ], + "doc/html/man3/X509_ATTRIBUTE.html" => [ + "doc/man3/X509_ATTRIBUTE.pod" + ], + "doc/html/man3/X509_CRL_get0_by_serial.html" => [ + "doc/man3/X509_CRL_get0_by_serial.pod" + ], + "doc/html/man3/X509_EXTENSION_set_object.html" => [ + "doc/man3/X509_EXTENSION_set_object.pod" + ], + "doc/html/man3/X509_LOOKUP.html" => [ + "doc/man3/X509_LOOKUP.pod" + ], + "doc/html/man3/X509_LOOKUP_hash_dir.html" => [ + "doc/man3/X509_LOOKUP_hash_dir.pod" + ], + "doc/html/man3/X509_LOOKUP_meth_new.html" => [ + "doc/man3/X509_LOOKUP_meth_new.pod" + ], + "doc/html/man3/X509_NAME_ENTRY_get_object.html" => [ + "doc/man3/X509_NAME_ENTRY_get_object.pod" + ], + "doc/html/man3/X509_NAME_add_entry_by_txt.html" => [ + "doc/man3/X509_NAME_add_entry_by_txt.pod" + ], + "doc/html/man3/X509_NAME_get0_der.html" => [ + "doc/man3/X509_NAME_get0_der.pod" + ], + "doc/html/man3/X509_NAME_get_index_by_NID.html" => [ + "doc/man3/X509_NAME_get_index_by_NID.pod" + ], + "doc/html/man3/X509_NAME_print_ex.html" => [ + "doc/man3/X509_NAME_print_ex.pod" + ], + "doc/html/man3/X509_PUBKEY_new.html" => [ + "doc/man3/X509_PUBKEY_new.pod" + ], + "doc/html/man3/X509_REQ_get_attr.html" => [ + "doc/man3/X509_REQ_get_attr.pod" + ], + "doc/html/man3/X509_REQ_get_extensions.html" => [ + "doc/man3/X509_REQ_get_extensions.pod" + ], + "doc/html/man3/X509_SIG_get0.html" => [ + "doc/man3/X509_SIG_get0.pod" + ], + "doc/html/man3/X509_STORE_CTX_get_by_subject.html" => [ + "doc/man3/X509_STORE_CTX_get_by_subject.pod" + ], + "doc/html/man3/X509_STORE_CTX_get_error.html" => [ + "doc/man3/X509_STORE_CTX_get_error.pod" + ], + "doc/html/man3/X509_STORE_CTX_new.html" => [ + "doc/man3/X509_STORE_CTX_new.pod" + ], + "doc/html/man3/X509_STORE_CTX_set_verify_cb.html" => [ + "doc/man3/X509_STORE_CTX_set_verify_cb.pod" + ], + "doc/html/man3/X509_STORE_add_cert.html" => [ + "doc/man3/X509_STORE_add_cert.pod" + ], + "doc/html/man3/X509_STORE_get0_param.html" => [ + "doc/man3/X509_STORE_get0_param.pod" + ], + "doc/html/man3/X509_STORE_new.html" => [ + "doc/man3/X509_STORE_new.pod" + ], + "doc/html/man3/X509_STORE_set_verify_cb_func.html" => [ + "doc/man3/X509_STORE_set_verify_cb_func.pod" + ], + "doc/html/man3/X509_VERIFY_PARAM_set_flags.html" => [ + "doc/man3/X509_VERIFY_PARAM_set_flags.pod" + ], + "doc/html/man3/X509_add_cert.html" => [ + "doc/man3/X509_add_cert.pod" + ], + "doc/html/man3/X509_check_ca.html" => [ + "doc/man3/X509_check_ca.pod" + ], + "doc/html/man3/X509_check_host.html" => [ + "doc/man3/X509_check_host.pod" + ], + "doc/html/man3/X509_check_issued.html" => [ + "doc/man3/X509_check_issued.pod" + ], + "doc/html/man3/X509_check_private_key.html" => [ + "doc/man3/X509_check_private_key.pod" + ], + "doc/html/man3/X509_check_purpose.html" => [ + "doc/man3/X509_check_purpose.pod" + ], + "doc/html/man3/X509_cmp.html" => [ + "doc/man3/X509_cmp.pod" + ], + "doc/html/man3/X509_cmp_time.html" => [ + "doc/man3/X509_cmp_time.pod" + ], + "doc/html/man3/X509_digest.html" => [ + "doc/man3/X509_digest.pod" + ], + "doc/html/man3/X509_dup.html" => [ + "doc/man3/X509_dup.pod" + ], + "doc/html/man3/X509_get0_distinguishing_id.html" => [ + "doc/man3/X509_get0_distinguishing_id.pod" + ], + "doc/html/man3/X509_get0_notBefore.html" => [ + "doc/man3/X509_get0_notBefore.pod" + ], + "doc/html/man3/X509_get0_signature.html" => [ + "doc/man3/X509_get0_signature.pod" + ], + "doc/html/man3/X509_get0_uids.html" => [ + "doc/man3/X509_get0_uids.pod" + ], + "doc/html/man3/X509_get_default_cert_file.html" => [ + "doc/man3/X509_get_default_cert_file.pod" + ], + "doc/html/man3/X509_get_extension_flags.html" => [ + "doc/man3/X509_get_extension_flags.pod" + ], + "doc/html/man3/X509_get_pubkey.html" => [ + "doc/man3/X509_get_pubkey.pod" + ], + "doc/html/man3/X509_get_serialNumber.html" => [ + "doc/man3/X509_get_serialNumber.pod" + ], + "doc/html/man3/X509_get_subject_name.html" => [ + "doc/man3/X509_get_subject_name.pod" + ], + "doc/html/man3/X509_get_version.html" => [ + "doc/man3/X509_get_version.pod" + ], + "doc/html/man3/X509_load_http.html" => [ + "doc/man3/X509_load_http.pod" + ], + "doc/html/man3/X509_new.html" => [ + "doc/man3/X509_new.pod" + ], + "doc/html/man3/X509_sign.html" => [ + "doc/man3/X509_sign.pod" + ], + "doc/html/man3/X509_verify.html" => [ + "doc/man3/X509_verify.pod" + ], + "doc/html/man3/X509_verify_cert.html" => [ + "doc/man3/X509_verify_cert.pod" + ], + "doc/html/man3/X509v3_get_ext_by_NID.html" => [ + "doc/man3/X509v3_get_ext_by_NID.pod" + ], + "doc/html/man3/b2i_PVK_bio_ex.html" => [ + "doc/man3/b2i_PVK_bio_ex.pod" + ], + "doc/html/man3/d2i_PKCS8PrivateKey_bio.html" => [ + "doc/man3/d2i_PKCS8PrivateKey_bio.pod" + ], + "doc/html/man3/d2i_PrivateKey.html" => [ + "doc/man3/d2i_PrivateKey.pod" + ], + "doc/html/man3/d2i_RSAPrivateKey.html" => [ + "doc/man3/d2i_RSAPrivateKey.pod" + ], + "doc/html/man3/d2i_SSL_SESSION.html" => [ + "doc/man3/d2i_SSL_SESSION.pod" + ], + "doc/html/man3/d2i_X509.html" => [ + "doc/man3/d2i_X509.pod" + ], + "doc/html/man3/i2d_CMS_bio_stream.html" => [ + "doc/man3/i2d_CMS_bio_stream.pod" + ], + "doc/html/man3/i2d_PKCS7_bio_stream.html" => [ + "doc/man3/i2d_PKCS7_bio_stream.pod" + ], + "doc/html/man3/i2d_re_X509_tbs.html" => [ + "doc/man3/i2d_re_X509_tbs.pod" + ], + "doc/html/man3/o2i_SCT_LIST.html" => [ + "doc/man3/o2i_SCT_LIST.pod" + ], + "doc/html/man3/s2i_ASN1_IA5STRING.html" => [ + "doc/man3/s2i_ASN1_IA5STRING.pod" + ], + "doc/html/man5/config.html" => [ + "doc/man5/config.pod" + ], + "doc/html/man5/fips_config.html" => [ + "doc/man5/fips_config.pod" + ], + "doc/html/man5/x509v3_config.html" => [ + "doc/man5/x509v3_config.pod" + ], + "doc/html/man7/EVP_ASYM_CIPHER-RSA.html" => [ + "doc/man7/EVP_ASYM_CIPHER-RSA.pod" + ], + "doc/html/man7/EVP_ASYM_CIPHER-SM2.html" => [ + "doc/man7/EVP_ASYM_CIPHER-SM2.pod" + ], + "doc/html/man7/EVP_CIPHER-AES.html" => [ + "doc/man7/EVP_CIPHER-AES.pod" + ], + "doc/html/man7/EVP_CIPHER-ARIA.html" => [ + "doc/man7/EVP_CIPHER-ARIA.pod" + ], + "doc/html/man7/EVP_CIPHER-BLOWFISH.html" => [ + "doc/man7/EVP_CIPHER-BLOWFISH.pod" + ], + "doc/html/man7/EVP_CIPHER-CAMELLIA.html" => [ + "doc/man7/EVP_CIPHER-CAMELLIA.pod" + ], + "doc/html/man7/EVP_CIPHER-CAST.html" => [ + "doc/man7/EVP_CIPHER-CAST.pod" + ], + "doc/html/man7/EVP_CIPHER-CHACHA.html" => [ + "doc/man7/EVP_CIPHER-CHACHA.pod" + ], + "doc/html/man7/EVP_CIPHER-DES.html" => [ + "doc/man7/EVP_CIPHER-DES.pod" + ], + "doc/html/man7/EVP_CIPHER-IDEA.html" => [ + "doc/man7/EVP_CIPHER-IDEA.pod" + ], + "doc/html/man7/EVP_CIPHER-NULL.html" => [ + "doc/man7/EVP_CIPHER-NULL.pod" + ], + "doc/html/man7/EVP_CIPHER-RC2.html" => [ + "doc/man7/EVP_CIPHER-RC2.pod" + ], + "doc/html/man7/EVP_CIPHER-RC4.html" => [ + "doc/man7/EVP_CIPHER-RC4.pod" + ], + "doc/html/man7/EVP_CIPHER-RC5.html" => [ + "doc/man7/EVP_CIPHER-RC5.pod" + ], + "doc/html/man7/EVP_CIPHER-SEED.html" => [ + "doc/man7/EVP_CIPHER-SEED.pod" + ], + "doc/html/man7/EVP_CIPHER-SM4.html" => [ + "doc/man7/EVP_CIPHER-SM4.pod" + ], + "doc/html/man7/EVP_KDF-ARGON2.html" => [ + "doc/man7/EVP_KDF-ARGON2.pod" + ], + "doc/html/man7/EVP_KDF-HKDF.html" => [ + "doc/man7/EVP_KDF-HKDF.pod" + ], + "doc/html/man7/EVP_KDF-HMAC-DRBG.html" => [ + "doc/man7/EVP_KDF-HMAC-DRBG.pod" + ], + "doc/html/man7/EVP_KDF-KB.html" => [ + "doc/man7/EVP_KDF-KB.pod" + ], + "doc/html/man7/EVP_KDF-KRB5KDF.html" => [ + "doc/man7/EVP_KDF-KRB5KDF.pod" + ], + "doc/html/man7/EVP_KDF-PBKDF1.html" => [ + "doc/man7/EVP_KDF-PBKDF1.pod" + ], + "doc/html/man7/EVP_KDF-PBKDF2.html" => [ + "doc/man7/EVP_KDF-PBKDF2.pod" + ], + "doc/html/man7/EVP_KDF-PKCS12KDF.html" => [ + "doc/man7/EVP_KDF-PKCS12KDF.pod" + ], + "doc/html/man7/EVP_KDF-PVKKDF.html" => [ + "doc/man7/EVP_KDF-PVKKDF.pod" + ], + "doc/html/man7/EVP_KDF-SCRYPT.html" => [ + "doc/man7/EVP_KDF-SCRYPT.pod" + ], + "doc/html/man7/EVP_KDF-SS.html" => [ + "doc/man7/EVP_KDF-SS.pod" + ], + "doc/html/man7/EVP_KDF-SSHKDF.html" => [ + "doc/man7/EVP_KDF-SSHKDF.pod" + ], + "doc/html/man7/EVP_KDF-TLS13_KDF.html" => [ + "doc/man7/EVP_KDF-TLS13_KDF.pod" + ], + "doc/html/man7/EVP_KDF-TLS1_PRF.html" => [ + "doc/man7/EVP_KDF-TLS1_PRF.pod" + ], + "doc/html/man7/EVP_KDF-X942-ASN1.html" => [ + "doc/man7/EVP_KDF-X942-ASN1.pod" + ], + "doc/html/man7/EVP_KDF-X942-CONCAT.html" => [ + "doc/man7/EVP_KDF-X942-CONCAT.pod" + ], + "doc/html/man7/EVP_KDF-X963.html" => [ + "doc/man7/EVP_KDF-X963.pod" + ], + "doc/html/man7/EVP_KEM-EC.html" => [ + "doc/man7/EVP_KEM-EC.pod" + ], + "doc/html/man7/EVP_KEM-ML-KEM.html" => [ + "doc/man7/EVP_KEM-ML-KEM.pod" + ], + "doc/html/man7/EVP_KEM-RSA.html" => [ + "doc/man7/EVP_KEM-RSA.pod" + ], + "doc/html/man7/EVP_KEM-X25519.html" => [ + "doc/man7/EVP_KEM-X25519.pod" + ], + "doc/html/man7/EVP_KEYEXCH-DH.html" => [ + "doc/man7/EVP_KEYEXCH-DH.pod" + ], + "doc/html/man7/EVP_KEYEXCH-ECDH.html" => [ + "doc/man7/EVP_KEYEXCH-ECDH.pod" + ], + "doc/html/man7/EVP_KEYEXCH-X25519.html" => [ + "doc/man7/EVP_KEYEXCH-X25519.pod" + ], + "doc/html/man7/EVP_MAC-BLAKE2.html" => [ + "doc/man7/EVP_MAC-BLAKE2.pod" + ], + "doc/html/man7/EVP_MAC-CMAC.html" => [ + "doc/man7/EVP_MAC-CMAC.pod" + ], + "doc/html/man7/EVP_MAC-GMAC.html" => [ + "doc/man7/EVP_MAC-GMAC.pod" + ], + "doc/html/man7/EVP_MAC-HMAC.html" => [ + "doc/man7/EVP_MAC-HMAC.pod" + ], + "doc/html/man7/EVP_MAC-KMAC.html" => [ + "doc/man7/EVP_MAC-KMAC.pod" + ], + "doc/html/man7/EVP_MAC-Poly1305.html" => [ + "doc/man7/EVP_MAC-Poly1305.pod" + ], + "doc/html/man7/EVP_MAC-Siphash.html" => [ + "doc/man7/EVP_MAC-Siphash.pod" + ], + "doc/html/man7/EVP_MD-BLAKE2.html" => [ + "doc/man7/EVP_MD-BLAKE2.pod" + ], + "doc/html/man7/EVP_MD-KECCAK.html" => [ + "doc/man7/EVP_MD-KECCAK.pod" + ], + "doc/html/man7/EVP_MD-MD2.html" => [ + "doc/man7/EVP_MD-MD2.pod" + ], + "doc/html/man7/EVP_MD-MD4.html" => [ + "doc/man7/EVP_MD-MD4.pod" + ], + "doc/html/man7/EVP_MD-MD5-SHA1.html" => [ + "doc/man7/EVP_MD-MD5-SHA1.pod" + ], + "doc/html/man7/EVP_MD-MD5.html" => [ + "doc/man7/EVP_MD-MD5.pod" + ], + "doc/html/man7/EVP_MD-MDC2.html" => [ + "doc/man7/EVP_MD-MDC2.pod" + ], + "doc/html/man7/EVP_MD-NULL.html" => [ + "doc/man7/EVP_MD-NULL.pod" + ], + "doc/html/man7/EVP_MD-RIPEMD160.html" => [ + "doc/man7/EVP_MD-RIPEMD160.pod" + ], + "doc/html/man7/EVP_MD-SHA1.html" => [ + "doc/man7/EVP_MD-SHA1.pod" + ], + "doc/html/man7/EVP_MD-SHA2.html" => [ + "doc/man7/EVP_MD-SHA2.pod" + ], + "doc/html/man7/EVP_MD-SHA3.html" => [ + "doc/man7/EVP_MD-SHA3.pod" + ], + "doc/html/man7/EVP_MD-SHAKE.html" => [ + "doc/man7/EVP_MD-SHAKE.pod" + ], + "doc/html/man7/EVP_MD-SM3.html" => [ + "doc/man7/EVP_MD-SM3.pod" + ], + "doc/html/man7/EVP_MD-WHIRLPOOL.html" => [ + "doc/man7/EVP_MD-WHIRLPOOL.pod" + ], + "doc/html/man7/EVP_MD-common.html" => [ + "doc/man7/EVP_MD-common.pod" + ], + "doc/html/man7/EVP_PKEY-DH.html" => [ + "doc/man7/EVP_PKEY-DH.pod" + ], + "doc/html/man7/EVP_PKEY-DSA.html" => [ + "doc/man7/EVP_PKEY-DSA.pod" + ], + "doc/html/man7/EVP_PKEY-EC.html" => [ + "doc/man7/EVP_PKEY-EC.pod" + ], + "doc/html/man7/EVP_PKEY-FFC.html" => [ + "doc/man7/EVP_PKEY-FFC.pod" + ], + "doc/html/man7/EVP_PKEY-HMAC.html" => [ + "doc/man7/EVP_PKEY-HMAC.pod" + ], + "doc/html/man7/EVP_PKEY-ML-DSA.html" => [ + "doc/man7/EVP_PKEY-ML-DSA.pod" + ], + "doc/html/man7/EVP_PKEY-ML-KEM.html" => [ + "doc/man7/EVP_PKEY-ML-KEM.pod" + ], + "doc/html/man7/EVP_PKEY-RSA.html" => [ + "doc/man7/EVP_PKEY-RSA.pod" + ], + "doc/html/man7/EVP_PKEY-SLH-DSA.html" => [ + "doc/man7/EVP_PKEY-SLH-DSA.pod" + ], + "doc/html/man7/EVP_PKEY-SM2.html" => [ + "doc/man7/EVP_PKEY-SM2.pod" + ], + "doc/html/man7/EVP_PKEY-X25519.html" => [ + "doc/man7/EVP_PKEY-X25519.pod" + ], + "doc/html/man7/EVP_RAND-CRNG-TEST.html" => [ + "doc/man7/EVP_RAND-CRNG-TEST.pod" + ], + "doc/html/man7/EVP_RAND-CTR-DRBG.html" => [ + "doc/man7/EVP_RAND-CTR-DRBG.pod" + ], + "doc/html/man7/EVP_RAND-HASH-DRBG.html" => [ + "doc/man7/EVP_RAND-HASH-DRBG.pod" + ], + "doc/html/man7/EVP_RAND-HMAC-DRBG.html" => [ + "doc/man7/EVP_RAND-HMAC-DRBG.pod" + ], + "doc/html/man7/EVP_RAND-JITTER.html" => [ + "doc/man7/EVP_RAND-JITTER.pod" + ], + "doc/html/man7/EVP_RAND-SEED-SRC.html" => [ + "doc/man7/EVP_RAND-SEED-SRC.pod" + ], + "doc/html/man7/EVP_RAND-TEST-RAND.html" => [ + "doc/man7/EVP_RAND-TEST-RAND.pod" + ], + "doc/html/man7/EVP_RAND.html" => [ + "doc/man7/EVP_RAND.pod" + ], + "doc/html/man7/EVP_SIGNATURE-DSA.html" => [ + "doc/man7/EVP_SIGNATURE-DSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-ECDSA.html" => [ + "doc/man7/EVP_SIGNATURE-ECDSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-ED25519.html" => [ + "doc/man7/EVP_SIGNATURE-ED25519.pod" + ], + "doc/html/man7/EVP_SIGNATURE-HMAC.html" => [ + "doc/man7/EVP_SIGNATURE-HMAC.pod" + ], + "doc/html/man7/EVP_SIGNATURE-ML-DSA.html" => [ + "doc/man7/EVP_SIGNATURE-ML-DSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-RSA.html" => [ + "doc/man7/EVP_SIGNATURE-RSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-SLH-DSA.html" => [ + "doc/man7/EVP_SIGNATURE-SLH-DSA.pod" + ], + "doc/html/man7/OSSL_PROVIDER-FIPS.html" => [ + "doc/man7/OSSL_PROVIDER-FIPS.pod" + ], + "doc/html/man7/OSSL_PROVIDER-base.html" => [ + "doc/man7/OSSL_PROVIDER-base.pod" + ], + "doc/html/man7/OSSL_PROVIDER-default.html" => [ + "doc/man7/OSSL_PROVIDER-default.pod" + ], + "doc/html/man7/OSSL_PROVIDER-legacy.html" => [ + "doc/man7/OSSL_PROVIDER-legacy.pod" + ], + "doc/html/man7/OSSL_PROVIDER-null.html" => [ + "doc/man7/OSSL_PROVIDER-null.pod" + ], + "doc/html/man7/OSSL_STORE-winstore.html" => [ + "doc/man7/OSSL_STORE-winstore.pod" + ], + "doc/html/man7/RAND.html" => [ + "doc/man7/RAND.pod" + ], + "doc/html/man7/RSA-PSS.html" => [ + "doc/man7/RSA-PSS.pod" + ], + "doc/html/man7/X25519.html" => [ + "doc/man7/X25519.pod" + ], + "doc/html/man7/bio.html" => [ + "doc/man7/bio.pod" + ], + "doc/html/man7/ct.html" => [ + "doc/man7/ct.pod" + ], + "doc/html/man7/des_modes.html" => [ + "doc/man7/des_modes.pod" + ], + "doc/html/man7/evp.html" => [ + "doc/man7/evp.pod" + ], + "doc/html/man7/fips_module.html" => [ + "doc/man7/fips_module.pod" + ], + "doc/html/man7/life_cycle-cipher.html" => [ + "doc/man7/life_cycle-cipher.pod" + ], + "doc/html/man7/life_cycle-digest.html" => [ + "doc/man7/life_cycle-digest.pod" + ], + "doc/html/man7/life_cycle-kdf.html" => [ + "doc/man7/life_cycle-kdf.pod" + ], + "doc/html/man7/life_cycle-mac.html" => [ + "doc/man7/life_cycle-mac.pod" + ], + "doc/html/man7/life_cycle-pkey.html" => [ + "doc/man7/life_cycle-pkey.pod" + ], + "doc/html/man7/life_cycle-rand.html" => [ + "doc/man7/life_cycle-rand.pod" + ], + "doc/html/man7/openssl-core.h.html" => [ + "doc/man7/openssl-core.h.pod" + ], + "doc/html/man7/openssl-core_dispatch.h.html" => [ + "doc/man7/openssl-core_dispatch.h.pod" + ], + "doc/html/man7/openssl-core_names.h.html" => [ + "doc/man7/openssl-core_names.h.pod" + ], + "doc/html/man7/openssl-env.html" => [ + "doc/man7/openssl-env.pod" + ], + "doc/html/man7/openssl-glossary.html" => [ + "doc/man7/openssl-glossary.pod" + ], + "doc/html/man7/openssl-qlog.html" => [ + "doc/man7/openssl-qlog.pod" + ], + "doc/html/man7/openssl-quic-concurrency.html" => [ + "doc/man7/openssl-quic-concurrency.pod" + ], + "doc/html/man7/openssl-quic.html" => [ + "doc/man7/openssl-quic.pod" + ], + "doc/html/man7/openssl-threads.html" => [ + "doc/man7/openssl-threads.pod" + ], + "doc/html/man7/openssl_user_macros.html" => [ + "doc/man7/openssl_user_macros.pod" + ], + "doc/html/man7/ossl-guide-introduction.html" => [ + "doc/man7/ossl-guide-introduction.pod" + ], + "doc/html/man7/ossl-guide-libcrypto-introduction.html" => [ + "doc/man7/ossl-guide-libcrypto-introduction.pod" + ], + "doc/html/man7/ossl-guide-libraries-introduction.html" => [ + "doc/man7/ossl-guide-libraries-introduction.pod" + ], + "doc/html/man7/ossl-guide-libssl-introduction.html" => [ + "doc/man7/ossl-guide-libssl-introduction.pod" + ], + "doc/html/man7/ossl-guide-migration.html" => [ + "doc/man7/ossl-guide-migration.pod" + ], + "doc/html/man7/ossl-guide-quic-client-block.html" => [ + "doc/man7/ossl-guide-quic-client-block.pod" + ], + "doc/html/man7/ossl-guide-quic-client-non-block.html" => [ + "doc/man7/ossl-guide-quic-client-non-block.pod" + ], + "doc/html/man7/ossl-guide-quic-introduction.html" => [ + "doc/man7/ossl-guide-quic-introduction.pod" + ], + "doc/html/man7/ossl-guide-quic-multi-stream.html" => [ + "doc/man7/ossl-guide-quic-multi-stream.pod" + ], + "doc/html/man7/ossl-guide-quic-server-block.html" => [ + "doc/man7/ossl-guide-quic-server-block.pod" + ], + "doc/html/man7/ossl-guide-quic-server-non-block.html" => [ + "doc/man7/ossl-guide-quic-server-non-block.pod" + ], + "doc/html/man7/ossl-guide-tls-client-block.html" => [ + "doc/man7/ossl-guide-tls-client-block.pod" + ], + "doc/html/man7/ossl-guide-tls-client-non-block.html" => [ + "doc/man7/ossl-guide-tls-client-non-block.pod" + ], + "doc/html/man7/ossl-guide-tls-introduction.html" => [ + "doc/man7/ossl-guide-tls-introduction.pod" + ], + "doc/html/man7/ossl-guide-tls-server-block.html" => [ + "doc/man7/ossl-guide-tls-server-block.pod" + ], + "doc/html/man7/ossl_store-file.html" => [ + "doc/man7/ossl_store-file.pod" + ], + "doc/html/man7/ossl_store.html" => [ + "doc/man7/ossl_store.pod" + ], + "doc/html/man7/passphrase-encoding.html" => [ + "doc/man7/passphrase-encoding.pod" + ], + "doc/html/man7/property.html" => [ + "doc/man7/property.pod" + ], + "doc/html/man7/provider-asym_cipher.html" => [ + "doc/man7/provider-asym_cipher.pod" + ], + "doc/html/man7/provider-base.html" => [ + "doc/man7/provider-base.pod" + ], + "doc/html/man7/provider-cipher.html" => [ + "doc/man7/provider-cipher.pod" + ], + "doc/html/man7/provider-decoder.html" => [ + "doc/man7/provider-decoder.pod" + ], + "doc/html/man7/provider-digest.html" => [ + "doc/man7/provider-digest.pod" + ], + "doc/html/man7/provider-encoder.html" => [ + "doc/man7/provider-encoder.pod" + ], + "doc/html/man7/provider-kdf.html" => [ + "doc/man7/provider-kdf.pod" + ], + "doc/html/man7/provider-kem.html" => [ + "doc/man7/provider-kem.pod" + ], + "doc/html/man7/provider-keyexch.html" => [ + "doc/man7/provider-keyexch.pod" + ], + "doc/html/man7/provider-keymgmt.html" => [ + "doc/man7/provider-keymgmt.pod" + ], + "doc/html/man7/provider-mac.html" => [ + "doc/man7/provider-mac.pod" + ], + "doc/html/man7/provider-object.html" => [ + "doc/man7/provider-object.pod" + ], + "doc/html/man7/provider-rand.html" => [ + "doc/man7/provider-rand.pod" + ], + "doc/html/man7/provider-signature.html" => [ + "doc/man7/provider-signature.pod" + ], + "doc/html/man7/provider-skeymgmt.html" => [ + "doc/man7/provider-skeymgmt.pod" + ], + "doc/html/man7/provider-storemgmt.html" => [ + "doc/man7/provider-storemgmt.pod" + ], + "doc/html/man7/provider.html" => [ + "doc/man7/provider.pod" + ], + "doc/html/man7/proxy-certificates.html" => [ + "doc/man7/proxy-certificates.pod" + ], + "doc/html/man7/x509.html" => [ + "doc/man7/x509.pod" + ], + "doc/man/man1/CA.pl.1" => [ + "doc/man1/CA.pl.pod" + ], + "doc/man/man1/openssl-asn1parse.1" => [ + "doc/man1/openssl-asn1parse.pod" + ], + "doc/man/man1/openssl-ca.1" => [ + "doc/man1/openssl-ca.pod" + ], + "doc/man/man1/openssl-ciphers.1" => [ + "doc/man1/openssl-ciphers.pod" + ], + "doc/man/man1/openssl-cmds.1" => [ + "doc/man1/openssl-cmds.pod" + ], + "doc/man/man1/openssl-cmp.1" => [ + "doc/man1/openssl-cmp.pod" + ], + "doc/man/man1/openssl-cms.1" => [ + "doc/man1/openssl-cms.pod" + ], + "doc/man/man1/openssl-crl.1" => [ + "doc/man1/openssl-crl.pod" + ], + "doc/man/man1/openssl-crl2pkcs7.1" => [ + "doc/man1/openssl-crl2pkcs7.pod" + ], + "doc/man/man1/openssl-dgst.1" => [ + "doc/man1/openssl-dgst.pod" + ], + "doc/man/man1/openssl-dhparam.1" => [ + "doc/man1/openssl-dhparam.pod" + ], + "doc/man/man1/openssl-dsa.1" => [ + "doc/man1/openssl-dsa.pod" + ], + "doc/man/man1/openssl-dsaparam.1" => [ + "doc/man1/openssl-dsaparam.pod" + ], + "doc/man/man1/openssl-ec.1" => [ + "doc/man1/openssl-ec.pod" + ], + "doc/man/man1/openssl-ecparam.1" => [ + "doc/man1/openssl-ecparam.pod" + ], + "doc/man/man1/openssl-enc.1" => [ + "doc/man1/openssl-enc.pod" + ], + "doc/man/man1/openssl-engine.1" => [ + "doc/man1/openssl-engine.pod" + ], + "doc/man/man1/openssl-errstr.1" => [ + "doc/man1/openssl-errstr.pod" + ], + "doc/man/man1/openssl-fipsinstall.1" => [ + "doc/man1/openssl-fipsinstall.pod" + ], + "doc/man/man1/openssl-format-options.1" => [ + "doc/man1/openssl-format-options.pod" + ], + "doc/man/man1/openssl-gendsa.1" => [ + "doc/man1/openssl-gendsa.pod" + ], + "doc/man/man1/openssl-genpkey.1" => [ + "doc/man1/openssl-genpkey.pod" + ], + "doc/man/man1/openssl-genrsa.1" => [ + "doc/man1/openssl-genrsa.pod" + ], + "doc/man/man1/openssl-info.1" => [ + "doc/man1/openssl-info.pod" + ], + "doc/man/man1/openssl-kdf.1" => [ + "doc/man1/openssl-kdf.pod" + ], + "doc/man/man1/openssl-list.1" => [ + "doc/man1/openssl-list.pod" + ], + "doc/man/man1/openssl-mac.1" => [ + "doc/man1/openssl-mac.pod" + ], + "doc/man/man1/openssl-namedisplay-options.1" => [ + "doc/man1/openssl-namedisplay-options.pod" + ], + "doc/man/man1/openssl-nseq.1" => [ + "doc/man1/openssl-nseq.pod" + ], + "doc/man/man1/openssl-ocsp.1" => [ + "doc/man1/openssl-ocsp.pod" + ], + "doc/man/man1/openssl-passphrase-options.1" => [ + "doc/man1/openssl-passphrase-options.pod" + ], + "doc/man/man1/openssl-passwd.1" => [ + "doc/man1/openssl-passwd.pod" + ], + "doc/man/man1/openssl-pkcs12.1" => [ + "doc/man1/openssl-pkcs12.pod" + ], + "doc/man/man1/openssl-pkcs7.1" => [ + "doc/man1/openssl-pkcs7.pod" + ], + "doc/man/man1/openssl-pkcs8.1" => [ + "doc/man1/openssl-pkcs8.pod" + ], + "doc/man/man1/openssl-pkey.1" => [ + "doc/man1/openssl-pkey.pod" + ], + "doc/man/man1/openssl-pkeyparam.1" => [ + "doc/man1/openssl-pkeyparam.pod" + ], + "doc/man/man1/openssl-pkeyutl.1" => [ + "doc/man1/openssl-pkeyutl.pod" + ], + "doc/man/man1/openssl-prime.1" => [ + "doc/man1/openssl-prime.pod" + ], + "doc/man/man1/openssl-rand.1" => [ + "doc/man1/openssl-rand.pod" + ], + "doc/man/man1/openssl-rehash.1" => [ + "doc/man1/openssl-rehash.pod" + ], + "doc/man/man1/openssl-req.1" => [ + "doc/man1/openssl-req.pod" + ], + "doc/man/man1/openssl-rsa.1" => [ + "doc/man1/openssl-rsa.pod" + ], + "doc/man/man1/openssl-rsautl.1" => [ + "doc/man1/openssl-rsautl.pod" + ], + "doc/man/man1/openssl-s_client.1" => [ + "doc/man1/openssl-s_client.pod" + ], + "doc/man/man1/openssl-s_server.1" => [ + "doc/man1/openssl-s_server.pod" + ], + "doc/man/man1/openssl-s_time.1" => [ + "doc/man1/openssl-s_time.pod" + ], + "doc/man/man1/openssl-sess_id.1" => [ + "doc/man1/openssl-sess_id.pod" + ], + "doc/man/man1/openssl-skeyutl.1" => [ + "doc/man1/openssl-skeyutl.pod" + ], + "doc/man/man1/openssl-smime.1" => [ + "doc/man1/openssl-smime.pod" + ], + "doc/man/man1/openssl-speed.1" => [ + "doc/man1/openssl-speed.pod" + ], + "doc/man/man1/openssl-spkac.1" => [ + "doc/man1/openssl-spkac.pod" + ], + "doc/man/man1/openssl-srp.1" => [ + "doc/man1/openssl-srp.pod" + ], + "doc/man/man1/openssl-storeutl.1" => [ + "doc/man1/openssl-storeutl.pod" + ], + "doc/man/man1/openssl-ts.1" => [ + "doc/man1/openssl-ts.pod" + ], + "doc/man/man1/openssl-verification-options.1" => [ + "doc/man1/openssl-verification-options.pod" + ], + "doc/man/man1/openssl-verify.1" => [ + "doc/man1/openssl-verify.pod" + ], + "doc/man/man1/openssl-version.1" => [ + "doc/man1/openssl-version.pod" + ], + "doc/man/man1/openssl-x509.1" => [ + "doc/man1/openssl-x509.pod" + ], + "doc/man/man1/openssl.1" => [ + "doc/man1/openssl.pod" + ], + "doc/man/man1/tsget.1" => [ + "doc/man1/tsget.pod" + ], + "doc/man/man3/ADMISSIONS.3" => [ + "doc/man3/ADMISSIONS.pod" + ], + "doc/man/man3/ASN1_EXTERN_FUNCS.3" => [ + "doc/man3/ASN1_EXTERN_FUNCS.pod" + ], + "doc/man/man3/ASN1_INTEGER_get_int64.3" => [ + "doc/man3/ASN1_INTEGER_get_int64.pod" + ], + "doc/man/man3/ASN1_INTEGER_new.3" => [ + "doc/man3/ASN1_INTEGER_new.pod" + ], + "doc/man/man3/ASN1_ITEM_lookup.3" => [ + "doc/man3/ASN1_ITEM_lookup.pod" + ], + "doc/man/man3/ASN1_OBJECT_new.3" => [ + "doc/man3/ASN1_OBJECT_new.pod" + ], + "doc/man/man3/ASN1_STRING_TABLE_add.3" => [ + "doc/man3/ASN1_STRING_TABLE_add.pod" + ], + "doc/man/man3/ASN1_STRING_length.3" => [ + "doc/man3/ASN1_STRING_length.pod" + ], + "doc/man/man3/ASN1_STRING_new.3" => [ + "doc/man3/ASN1_STRING_new.pod" + ], + "doc/man/man3/ASN1_STRING_print_ex.3" => [ + "doc/man3/ASN1_STRING_print_ex.pod" + ], + "doc/man/man3/ASN1_TIME_set.3" => [ + "doc/man3/ASN1_TIME_set.pod" + ], + "doc/man/man3/ASN1_TYPE_get.3" => [ + "doc/man3/ASN1_TYPE_get.pod" + ], + "doc/man/man3/ASN1_aux_cb.3" => [ + "doc/man3/ASN1_aux_cb.pod" + ], + "doc/man/man3/ASN1_generate_nconf.3" => [ + "doc/man3/ASN1_generate_nconf.pod" + ], + "doc/man/man3/ASN1_item_d2i_bio.3" => [ + "doc/man3/ASN1_item_d2i_bio.pod" + ], + "doc/man/man3/ASN1_item_new.3" => [ + "doc/man3/ASN1_item_new.pod" + ], + "doc/man/man3/ASN1_item_sign.3" => [ + "doc/man3/ASN1_item_sign.pod" + ], + "doc/man/man3/ASYNC_WAIT_CTX_new.3" => [ + "doc/man3/ASYNC_WAIT_CTX_new.pod" + ], + "doc/man/man3/ASYNC_start_job.3" => [ + "doc/man3/ASYNC_start_job.pod" + ], + "doc/man/man3/BF_encrypt.3" => [ + "doc/man3/BF_encrypt.pod" + ], + "doc/man/man3/BIO_ADDR.3" => [ + "doc/man3/BIO_ADDR.pod" + ], + "doc/man/man3/BIO_ADDRINFO.3" => [ + "doc/man3/BIO_ADDRINFO.pod" + ], + "doc/man/man3/BIO_connect.3" => [ + "doc/man3/BIO_connect.pod" + ], + "doc/man/man3/BIO_ctrl.3" => [ + "doc/man3/BIO_ctrl.pod" + ], + "doc/man/man3/BIO_f_base64.3" => [ + "doc/man3/BIO_f_base64.pod" + ], + "doc/man/man3/BIO_f_buffer.3" => [ + "doc/man3/BIO_f_buffer.pod" + ], + "doc/man/man3/BIO_f_cipher.3" => [ + "doc/man3/BIO_f_cipher.pod" + ], + "doc/man/man3/BIO_f_md.3" => [ + "doc/man3/BIO_f_md.pod" + ], + "doc/man/man3/BIO_f_null.3" => [ + "doc/man3/BIO_f_null.pod" + ], + "doc/man/man3/BIO_f_prefix.3" => [ + "doc/man3/BIO_f_prefix.pod" + ], + "doc/man/man3/BIO_f_readbuffer.3" => [ + "doc/man3/BIO_f_readbuffer.pod" + ], + "doc/man/man3/BIO_f_ssl.3" => [ + "doc/man3/BIO_f_ssl.pod" + ], + "doc/man/man3/BIO_find_type.3" => [ + "doc/man3/BIO_find_type.pod" + ], + "doc/man/man3/BIO_get_data.3" => [ + "doc/man3/BIO_get_data.pod" + ], + "doc/man/man3/BIO_get_ex_new_index.3" => [ + "doc/man3/BIO_get_ex_new_index.pod" + ], + "doc/man/man3/BIO_get_rpoll_descriptor.3" => [ + "doc/man3/BIO_get_rpoll_descriptor.pod" + ], + "doc/man/man3/BIO_meth_new.3" => [ + "doc/man3/BIO_meth_new.pod" + ], + "doc/man/man3/BIO_new.3" => [ + "doc/man3/BIO_new.pod" + ], + "doc/man/man3/BIO_new_CMS.3" => [ + "doc/man3/BIO_new_CMS.pod" + ], + "doc/man/man3/BIO_parse_hostserv.3" => [ + "doc/man3/BIO_parse_hostserv.pod" + ], + "doc/man/man3/BIO_printf.3" => [ + "doc/man3/BIO_printf.pod" + ], + "doc/man/man3/BIO_push.3" => [ + "doc/man3/BIO_push.pod" + ], + "doc/man/man3/BIO_read.3" => [ + "doc/man3/BIO_read.pod" + ], + "doc/man/man3/BIO_s_accept.3" => [ + "doc/man3/BIO_s_accept.pod" + ], + "doc/man/man3/BIO_s_bio.3" => [ + "doc/man3/BIO_s_bio.pod" + ], + "doc/man/man3/BIO_s_connect.3" => [ + "doc/man3/BIO_s_connect.pod" + ], + "doc/man/man3/BIO_s_core.3" => [ + "doc/man3/BIO_s_core.pod" + ], + "doc/man/man3/BIO_s_datagram.3" => [ + "doc/man3/BIO_s_datagram.pod" + ], + "doc/man/man3/BIO_s_dgram_pair.3" => [ + "doc/man3/BIO_s_dgram_pair.pod" + ], + "doc/man/man3/BIO_s_fd.3" => [ + "doc/man3/BIO_s_fd.pod" + ], + "doc/man/man3/BIO_s_file.3" => [ + "doc/man3/BIO_s_file.pod" + ], + "doc/man/man3/BIO_s_mem.3" => [ + "doc/man3/BIO_s_mem.pod" + ], + "doc/man/man3/BIO_s_null.3" => [ + "doc/man3/BIO_s_null.pod" + ], + "doc/man/man3/BIO_s_socket.3" => [ + "doc/man3/BIO_s_socket.pod" + ], + "doc/man/man3/BIO_sendmmsg.3" => [ + "doc/man3/BIO_sendmmsg.pod" + ], + "doc/man/man3/BIO_set_callback.3" => [ + "doc/man3/BIO_set_callback.pod" + ], + "doc/man/man3/BIO_set_flags.3" => [ + "doc/man3/BIO_set_flags.pod" + ], + "doc/man/man3/BIO_should_retry.3" => [ + "doc/man3/BIO_should_retry.pod" + ], + "doc/man/man3/BIO_socket_wait.3" => [ + "doc/man3/BIO_socket_wait.pod" + ], + "doc/man/man3/BN_BLINDING_new.3" => [ + "doc/man3/BN_BLINDING_new.pod" + ], + "doc/man/man3/BN_CTX_new.3" => [ + "doc/man3/BN_CTX_new.pod" + ], + "doc/man/man3/BN_CTX_start.3" => [ + "doc/man3/BN_CTX_start.pod" + ], + "doc/man/man3/BN_add.3" => [ + "doc/man3/BN_add.pod" + ], + "doc/man/man3/BN_add_word.3" => [ + "doc/man3/BN_add_word.pod" + ], + "doc/man/man3/BN_bn2bin.3" => [ + "doc/man3/BN_bn2bin.pod" + ], + "doc/man/man3/BN_cmp.3" => [ + "doc/man3/BN_cmp.pod" + ], + "doc/man/man3/BN_copy.3" => [ + "doc/man3/BN_copy.pod" + ], + "doc/man/man3/BN_generate_prime.3" => [ + "doc/man3/BN_generate_prime.pod" + ], + "doc/man/man3/BN_mod_exp_mont.3" => [ + "doc/man3/BN_mod_exp_mont.pod" + ], + "doc/man/man3/BN_mod_inverse.3" => [ + "doc/man3/BN_mod_inverse.pod" + ], + "doc/man/man3/BN_mod_mul_montgomery.3" => [ + "doc/man3/BN_mod_mul_montgomery.pod" + ], + "doc/man/man3/BN_mod_mul_reciprocal.3" => [ + "doc/man3/BN_mod_mul_reciprocal.pod" + ], + "doc/man/man3/BN_new.3" => [ + "doc/man3/BN_new.pod" + ], + "doc/man/man3/BN_num_bytes.3" => [ + "doc/man3/BN_num_bytes.pod" + ], + "doc/man/man3/BN_rand.3" => [ + "doc/man3/BN_rand.pod" + ], + "doc/man/man3/BN_security_bits.3" => [ + "doc/man3/BN_security_bits.pod" + ], + "doc/man/man3/BN_set_bit.3" => [ + "doc/man3/BN_set_bit.pod" + ], + "doc/man/man3/BN_swap.3" => [ + "doc/man3/BN_swap.pod" + ], + "doc/man/man3/BN_zero.3" => [ + "doc/man3/BN_zero.pod" + ], + "doc/man/man3/BUF_MEM_new.3" => [ + "doc/man3/BUF_MEM_new.pod" + ], + "doc/man/man3/CMAC_CTX.3" => [ + "doc/man3/CMAC_CTX.pod" + ], + "doc/man/man3/CMS_EncryptedData_decrypt.3" => [ + "doc/man3/CMS_EncryptedData_decrypt.pod" + ], + "doc/man/man3/CMS_EncryptedData_encrypt.3" => [ + "doc/man3/CMS_EncryptedData_encrypt.pod" + ], + "doc/man/man3/CMS_EncryptedData_set1_key.3" => [ + "doc/man3/CMS_EncryptedData_set1_key.pod" + ], + "doc/man/man3/CMS_EnvelopedData_create.3" => [ + "doc/man3/CMS_EnvelopedData_create.pod" + ], + "doc/man/man3/CMS_add0_cert.3" => [ + "doc/man3/CMS_add0_cert.pod" + ], + "doc/man/man3/CMS_add1_recipient_cert.3" => [ + "doc/man3/CMS_add1_recipient_cert.pod" + ], + "doc/man/man3/CMS_add1_signer.3" => [ + "doc/man3/CMS_add1_signer.pod" + ], + "doc/man/man3/CMS_compress.3" => [ + "doc/man3/CMS_compress.pod" + ], + "doc/man/man3/CMS_data_create.3" => [ + "doc/man3/CMS_data_create.pod" + ], + "doc/man/man3/CMS_decrypt.3" => [ + "doc/man3/CMS_decrypt.pod" + ], + "doc/man/man3/CMS_digest_create.3" => [ + "doc/man3/CMS_digest_create.pod" + ], + "doc/man/man3/CMS_encrypt.3" => [ + "doc/man3/CMS_encrypt.pod" + ], + "doc/man/man3/CMS_final.3" => [ + "doc/man3/CMS_final.pod" + ], + "doc/man/man3/CMS_get0_RecipientInfos.3" => [ + "doc/man3/CMS_get0_RecipientInfos.pod" + ], + "doc/man/man3/CMS_get0_SignerInfos.3" => [ + "doc/man3/CMS_get0_SignerInfos.pod" + ], + "doc/man/man3/CMS_get0_type.3" => [ + "doc/man3/CMS_get0_type.pod" + ], + "doc/man/man3/CMS_get1_ReceiptRequest.3" => [ + "doc/man3/CMS_get1_ReceiptRequest.pod" + ], + "doc/man/man3/CMS_sign.3" => [ + "doc/man3/CMS_sign.pod" + ], + "doc/man/man3/CMS_sign_receipt.3" => [ + "doc/man3/CMS_sign_receipt.pod" + ], + "doc/man/man3/CMS_signed_get_attr.3" => [ + "doc/man3/CMS_signed_get_attr.pod" + ], + "doc/man/man3/CMS_uncompress.3" => [ + "doc/man3/CMS_uncompress.pod" + ], + "doc/man/man3/CMS_verify.3" => [ + "doc/man3/CMS_verify.pod" + ], + "doc/man/man3/CMS_verify_receipt.3" => [ + "doc/man3/CMS_verify_receipt.pod" + ], + "doc/man/man3/COMP_CTX_new.3" => [ + "doc/man3/COMP_CTX_new.pod" + ], + "doc/man/man3/CONF_modules_free.3" => [ + "doc/man3/CONF_modules_free.pod" + ], + "doc/man/man3/CONF_modules_load_file.3" => [ + "doc/man3/CONF_modules_load_file.pod" + ], + "doc/man/man3/CRYPTO_THREAD_run_once.3" => [ + "doc/man3/CRYPTO_THREAD_run_once.pod" + ], + "doc/man/man3/CRYPTO_get_ex_new_index.3" => [ + "doc/man3/CRYPTO_get_ex_new_index.pod" + ], + "doc/man/man3/CRYPTO_memcmp.3" => [ + "doc/man3/CRYPTO_memcmp.pod" + ], + "doc/man/man3/CTLOG_STORE_get0_log_by_id.3" => [ + "doc/man3/CTLOG_STORE_get0_log_by_id.pod" + ], + "doc/man/man3/CTLOG_STORE_new.3" => [ + "doc/man3/CTLOG_STORE_new.pod" + ], + "doc/man/man3/CTLOG_new.3" => [ + "doc/man3/CTLOG_new.pod" + ], + "doc/man/man3/CT_POLICY_EVAL_CTX_new.3" => [ + "doc/man3/CT_POLICY_EVAL_CTX_new.pod" + ], + "doc/man/man3/DEFINE_STACK_OF.3" => [ + "doc/man3/DEFINE_STACK_OF.pod" + ], + "doc/man/man3/DES_random_key.3" => [ + "doc/man3/DES_random_key.pod" + ], + "doc/man/man3/DH_generate_key.3" => [ + "doc/man3/DH_generate_key.pod" + ], + "doc/man/man3/DH_generate_parameters.3" => [ + "doc/man3/DH_generate_parameters.pod" + ], + "doc/man/man3/DH_get0_pqg.3" => [ + "doc/man3/DH_get0_pqg.pod" + ], + "doc/man/man3/DH_get_1024_160.3" => [ + "doc/man3/DH_get_1024_160.pod" + ], + "doc/man/man3/DH_meth_new.3" => [ + "doc/man3/DH_meth_new.pod" + ], + "doc/man/man3/DH_new.3" => [ + "doc/man3/DH_new.pod" + ], + "doc/man/man3/DH_new_by_nid.3" => [ + "doc/man3/DH_new_by_nid.pod" + ], + "doc/man/man3/DH_set_method.3" => [ + "doc/man3/DH_set_method.pod" + ], + "doc/man/man3/DH_size.3" => [ + "doc/man3/DH_size.pod" + ], + "doc/man/man3/DSA_SIG_new.3" => [ + "doc/man3/DSA_SIG_new.pod" + ], + "doc/man/man3/DSA_do_sign.3" => [ + "doc/man3/DSA_do_sign.pod" + ], + "doc/man/man3/DSA_dup_DH.3" => [ + "doc/man3/DSA_dup_DH.pod" + ], + "doc/man/man3/DSA_generate_key.3" => [ + "doc/man3/DSA_generate_key.pod" + ], + "doc/man/man3/DSA_generate_parameters.3" => [ + "doc/man3/DSA_generate_parameters.pod" + ], + "doc/man/man3/DSA_get0_pqg.3" => [ + "doc/man3/DSA_get0_pqg.pod" + ], + "doc/man/man3/DSA_meth_new.3" => [ + "doc/man3/DSA_meth_new.pod" + ], + "doc/man/man3/DSA_new.3" => [ + "doc/man3/DSA_new.pod" + ], + "doc/man/man3/DSA_set_method.3" => [ + "doc/man3/DSA_set_method.pod" + ], + "doc/man/man3/DSA_sign.3" => [ + "doc/man3/DSA_sign.pod" + ], + "doc/man/man3/DSA_size.3" => [ + "doc/man3/DSA_size.pod" + ], + "doc/man/man3/DTLS_get_data_mtu.3" => [ + "doc/man3/DTLS_get_data_mtu.pod" + ], + "doc/man/man3/DTLS_set_timer_cb.3" => [ + "doc/man3/DTLS_set_timer_cb.pod" + ], + "doc/man/man3/DTLSv1_get_timeout.3" => [ + "doc/man3/DTLSv1_get_timeout.pod" + ], + "doc/man/man3/DTLSv1_handle_timeout.3" => [ + "doc/man3/DTLSv1_handle_timeout.pod" + ], + "doc/man/man3/DTLSv1_listen.3" => [ + "doc/man3/DTLSv1_listen.pod" + ], + "doc/man/man3/ECDSA_SIG_new.3" => [ + "doc/man3/ECDSA_SIG_new.pod" + ], + "doc/man/man3/ECDSA_sign.3" => [ + "doc/man3/ECDSA_sign.pod" + ], + "doc/man/man3/ECPKParameters_print.3" => [ + "doc/man3/ECPKParameters_print.pod" + ], + "doc/man/man3/EC_GFp_simple_method.3" => [ + "doc/man3/EC_GFp_simple_method.pod" + ], + "doc/man/man3/EC_GROUP_copy.3" => [ + "doc/man3/EC_GROUP_copy.pod" + ], + "doc/man/man3/EC_GROUP_new.3" => [ + "doc/man3/EC_GROUP_new.pod" + ], + "doc/man/man3/EC_KEY_get_enc_flags.3" => [ + "doc/man3/EC_KEY_get_enc_flags.pod" + ], + "doc/man/man3/EC_KEY_new.3" => [ + "doc/man3/EC_KEY_new.pod" + ], + "doc/man/man3/EC_POINT_add.3" => [ + "doc/man3/EC_POINT_add.pod" + ], + "doc/man/man3/EC_POINT_new.3" => [ + "doc/man3/EC_POINT_new.pod" + ], + "doc/man/man3/ENGINE_add.3" => [ + "doc/man3/ENGINE_add.pod" + ], + "doc/man/man3/ERR_GET_LIB.3" => [ + "doc/man3/ERR_GET_LIB.pod" + ], + "doc/man/man3/ERR_clear_error.3" => [ + "doc/man3/ERR_clear_error.pod" + ], + "doc/man/man3/ERR_error_string.3" => [ + "doc/man3/ERR_error_string.pod" + ], + "doc/man/man3/ERR_get_error.3" => [ + "doc/man3/ERR_get_error.pod" + ], + "doc/man/man3/ERR_load_crypto_strings.3" => [ + "doc/man3/ERR_load_crypto_strings.pod" + ], + "doc/man/man3/ERR_load_strings.3" => [ + "doc/man3/ERR_load_strings.pod" + ], + "doc/man/man3/ERR_new.3" => [ + "doc/man3/ERR_new.pod" + ], + "doc/man/man3/ERR_print_errors.3" => [ + "doc/man3/ERR_print_errors.pod" + ], + "doc/man/man3/ERR_put_error.3" => [ + "doc/man3/ERR_put_error.pod" + ], + "doc/man/man3/ERR_remove_state.3" => [ + "doc/man3/ERR_remove_state.pod" + ], + "doc/man/man3/ERR_set_mark.3" => [ + "doc/man3/ERR_set_mark.pod" + ], + "doc/man/man3/EVP_ASYM_CIPHER_free.3" => [ + "doc/man3/EVP_ASYM_CIPHER_free.pod" + ], + "doc/man/man3/EVP_BytesToKey.3" => [ + "doc/man3/EVP_BytesToKey.pod" + ], + "doc/man/man3/EVP_CIPHER_CTX_get_app_data.3" => [ + "doc/man3/EVP_CIPHER_CTX_get_app_data.pod" + ], + "doc/man/man3/EVP_CIPHER_CTX_get_cipher_data.3" => [ + "doc/man3/EVP_CIPHER_CTX_get_cipher_data.pod" + ], + "doc/man/man3/EVP_CIPHER_CTX_get_original_iv.3" => [ + "doc/man3/EVP_CIPHER_CTX_get_original_iv.pod" + ], + "doc/man/man3/EVP_CIPHER_meth_new.3" => [ + "doc/man3/EVP_CIPHER_meth_new.pod" + ], + "doc/man/man3/EVP_DigestInit.3" => [ + "doc/man3/EVP_DigestInit.pod" + ], + "doc/man/man3/EVP_DigestSignInit.3" => [ + "doc/man3/EVP_DigestSignInit.pod" + ], + "doc/man/man3/EVP_DigestVerifyInit.3" => [ + "doc/man3/EVP_DigestVerifyInit.pod" + ], + "doc/man/man3/EVP_EncodeInit.3" => [ + "doc/man3/EVP_EncodeInit.pod" + ], + "doc/man/man3/EVP_EncryptInit.3" => [ + "doc/man3/EVP_EncryptInit.pod" + ], + "doc/man/man3/EVP_KDF.3" => [ + "doc/man3/EVP_KDF.pod" + ], + "doc/man/man3/EVP_KEM_free.3" => [ + "doc/man3/EVP_KEM_free.pod" + ], + "doc/man/man3/EVP_KEYEXCH_free.3" => [ + "doc/man3/EVP_KEYEXCH_free.pod" + ], + "doc/man/man3/EVP_KEYMGMT.3" => [ + "doc/man3/EVP_KEYMGMT.pod" + ], + "doc/man/man3/EVP_MAC.3" => [ + "doc/man3/EVP_MAC.pod" + ], + "doc/man/man3/EVP_MD_meth_new.3" => [ + "doc/man3/EVP_MD_meth_new.pod" + ], + "doc/man/man3/EVP_OpenInit.3" => [ + "doc/man3/EVP_OpenInit.pod" + ], + "doc/man/man3/EVP_PBE_CipherInit.3" => [ + "doc/man3/EVP_PBE_CipherInit.pod" + ], + "doc/man/man3/EVP_PKEY2PKCS8.3" => [ + "doc/man3/EVP_PKEY2PKCS8.pod" + ], + "doc/man/man3/EVP_PKEY_ASN1_METHOD.3" => [ + "doc/man3/EVP_PKEY_ASN1_METHOD.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_ctrl.3" => [ + "doc/man3/EVP_PKEY_CTX_ctrl.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_get0_libctx.3" => [ + "doc/man3/EVP_PKEY_CTX_get0_libctx.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_get0_pkey.3" => [ + "doc/man3/EVP_PKEY_CTX_get0_pkey.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_get_algor.3" => [ + "doc/man3/EVP_PKEY_CTX_get_algor.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_new.3" => [ + "doc/man3/EVP_PKEY_CTX_new.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set1_pbe_pass.3" => [ + "doc/man3/EVP_PKEY_CTX_set1_pbe_pass.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_hkdf_md.3" => [ + "doc/man3/EVP_PKEY_CTX_set_hkdf_md.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_params.3" => [ + "doc/man3/EVP_PKEY_CTX_set_params.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.3" => [ + "doc/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_scrypt_N.3" => [ + "doc/man3/EVP_PKEY_CTX_set_scrypt_N.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_tls1_prf_md.3" => [ + "doc/man3/EVP_PKEY_CTX_set_tls1_prf_md.pod" + ], + "doc/man/man3/EVP_PKEY_asn1_get_count.3" => [ + "doc/man3/EVP_PKEY_asn1_get_count.pod" + ], + "doc/man/man3/EVP_PKEY_check.3" => [ + "doc/man3/EVP_PKEY_check.pod" + ], + "doc/man/man3/EVP_PKEY_copy_parameters.3" => [ + "doc/man3/EVP_PKEY_copy_parameters.pod" + ], + "doc/man/man3/EVP_PKEY_decapsulate.3" => [ + "doc/man3/EVP_PKEY_decapsulate.pod" + ], + "doc/man/man3/EVP_PKEY_decrypt.3" => [ + "doc/man3/EVP_PKEY_decrypt.pod" + ], + "doc/man/man3/EVP_PKEY_derive.3" => [ + "doc/man3/EVP_PKEY_derive.pod" + ], + "doc/man/man3/EVP_PKEY_digestsign_supports_digest.3" => [ + "doc/man3/EVP_PKEY_digestsign_supports_digest.pod" + ], + "doc/man/man3/EVP_PKEY_encapsulate.3" => [ + "doc/man3/EVP_PKEY_encapsulate.pod" + ], + "doc/man/man3/EVP_PKEY_encrypt.3" => [ + "doc/man3/EVP_PKEY_encrypt.pod" + ], + "doc/man/man3/EVP_PKEY_fromdata.3" => [ + "doc/man3/EVP_PKEY_fromdata.pod" + ], + "doc/man/man3/EVP_PKEY_get_attr.3" => [ + "doc/man3/EVP_PKEY_get_attr.pod" + ], + "doc/man/man3/EVP_PKEY_get_default_digest_nid.3" => [ + "doc/man3/EVP_PKEY_get_default_digest_nid.pod" + ], + "doc/man/man3/EVP_PKEY_get_field_type.3" => [ + "doc/man3/EVP_PKEY_get_field_type.pod" + ], + "doc/man/man3/EVP_PKEY_get_group_name.3" => [ + "doc/man3/EVP_PKEY_get_group_name.pod" + ], + "doc/man/man3/EVP_PKEY_get_size.3" => [ + "doc/man3/EVP_PKEY_get_size.pod" + ], + "doc/man/man3/EVP_PKEY_gettable_params.3" => [ + "doc/man3/EVP_PKEY_gettable_params.pod" + ], + "doc/man/man3/EVP_PKEY_is_a.3" => [ + "doc/man3/EVP_PKEY_is_a.pod" + ], + "doc/man/man3/EVP_PKEY_keygen.3" => [ + "doc/man3/EVP_PKEY_keygen.pod" + ], + "doc/man/man3/EVP_PKEY_meth_get_count.3" => [ + "doc/man3/EVP_PKEY_meth_get_count.pod" + ], + "doc/man/man3/EVP_PKEY_meth_new.3" => [ + "doc/man3/EVP_PKEY_meth_new.pod" + ], + "doc/man/man3/EVP_PKEY_new.3" => [ + "doc/man3/EVP_PKEY_new.pod" + ], + "doc/man/man3/EVP_PKEY_print_private.3" => [ + "doc/man3/EVP_PKEY_print_private.pod" + ], + "doc/man/man3/EVP_PKEY_set1_RSA.3" => [ + "doc/man3/EVP_PKEY_set1_RSA.pod" + ], + "doc/man/man3/EVP_PKEY_set1_encoded_public_key.3" => [ + "doc/man3/EVP_PKEY_set1_encoded_public_key.pod" + ], + "doc/man/man3/EVP_PKEY_set_type.3" => [ + "doc/man3/EVP_PKEY_set_type.pod" + ], + "doc/man/man3/EVP_PKEY_settable_params.3" => [ + "doc/man3/EVP_PKEY_settable_params.pod" + ], + "doc/man/man3/EVP_PKEY_sign.3" => [ + "doc/man3/EVP_PKEY_sign.pod" + ], + "doc/man/man3/EVP_PKEY_todata.3" => [ + "doc/man3/EVP_PKEY_todata.pod" + ], + "doc/man/man3/EVP_PKEY_verify.3" => [ + "doc/man3/EVP_PKEY_verify.pod" + ], + "doc/man/man3/EVP_PKEY_verify_recover.3" => [ + "doc/man3/EVP_PKEY_verify_recover.pod" + ], + "doc/man/man3/EVP_RAND.3" => [ + "doc/man3/EVP_RAND.pod" + ], + "doc/man/man3/EVP_SIGNATURE.3" => [ + "doc/man3/EVP_SIGNATURE.pod" + ], + "doc/man/man3/EVP_SKEY.3" => [ + "doc/man3/EVP_SKEY.pod" + ], + "doc/man/man3/EVP_SKEYMGMT.3" => [ + "doc/man3/EVP_SKEYMGMT.pod" + ], + "doc/man/man3/EVP_SealInit.3" => [ + "doc/man3/EVP_SealInit.pod" + ], + "doc/man/man3/EVP_SignInit.3" => [ + "doc/man3/EVP_SignInit.pod" + ], + "doc/man/man3/EVP_VerifyInit.3" => [ + "doc/man3/EVP_VerifyInit.pod" + ], + "doc/man/man3/EVP_aes_128_gcm.3" => [ + "doc/man3/EVP_aes_128_gcm.pod" + ], + "doc/man/man3/EVP_aria_128_gcm.3" => [ + "doc/man3/EVP_aria_128_gcm.pod" + ], + "doc/man/man3/EVP_bf_cbc.3" => [ + "doc/man3/EVP_bf_cbc.pod" + ], + "doc/man/man3/EVP_blake2b512.3" => [ + "doc/man3/EVP_blake2b512.pod" + ], + "doc/man/man3/EVP_camellia_128_ecb.3" => [ + "doc/man3/EVP_camellia_128_ecb.pod" + ], + "doc/man/man3/EVP_cast5_cbc.3" => [ + "doc/man3/EVP_cast5_cbc.pod" + ], + "doc/man/man3/EVP_chacha20.3" => [ + "doc/man3/EVP_chacha20.pod" + ], + "doc/man/man3/EVP_des_cbc.3" => [ + "doc/man3/EVP_des_cbc.pod" + ], + "doc/man/man3/EVP_desx_cbc.3" => [ + "doc/man3/EVP_desx_cbc.pod" + ], + "doc/man/man3/EVP_idea_cbc.3" => [ + "doc/man3/EVP_idea_cbc.pod" + ], + "doc/man/man3/EVP_md2.3" => [ + "doc/man3/EVP_md2.pod" + ], + "doc/man/man3/EVP_md4.3" => [ + "doc/man3/EVP_md4.pod" + ], + "doc/man/man3/EVP_md5.3" => [ + "doc/man3/EVP_md5.pod" + ], + "doc/man/man3/EVP_mdc2.3" => [ + "doc/man3/EVP_mdc2.pod" + ], + "doc/man/man3/EVP_rc2_cbc.3" => [ + "doc/man3/EVP_rc2_cbc.pod" + ], + "doc/man/man3/EVP_rc4.3" => [ + "doc/man3/EVP_rc4.pod" + ], + "doc/man/man3/EVP_rc5_32_12_16_cbc.3" => [ + "doc/man3/EVP_rc5_32_12_16_cbc.pod" + ], + "doc/man/man3/EVP_ripemd160.3" => [ + "doc/man3/EVP_ripemd160.pod" + ], + "doc/man/man3/EVP_seed_cbc.3" => [ + "doc/man3/EVP_seed_cbc.pod" + ], + "doc/man/man3/EVP_set_default_properties.3" => [ + "doc/man3/EVP_set_default_properties.pod" + ], + "doc/man/man3/EVP_sha1.3" => [ + "doc/man3/EVP_sha1.pod" + ], + "doc/man/man3/EVP_sha224.3" => [ + "doc/man3/EVP_sha224.pod" + ], + "doc/man/man3/EVP_sha3_224.3" => [ + "doc/man3/EVP_sha3_224.pod" + ], + "doc/man/man3/EVP_sm3.3" => [ + "doc/man3/EVP_sm3.pod" + ], + "doc/man/man3/EVP_sm4_cbc.3" => [ + "doc/man3/EVP_sm4_cbc.pod" + ], + "doc/man/man3/EVP_whirlpool.3" => [ + "doc/man3/EVP_whirlpool.pod" + ], + "doc/man/man3/GENERAL_NAME.3" => [ + "doc/man3/GENERAL_NAME.pod" + ], + "doc/man/man3/HMAC.3" => [ + "doc/man3/HMAC.pod" + ], + "doc/man/man3/MD5.3" => [ + "doc/man3/MD5.pod" + ], + "doc/man/man3/MDC2_Init.3" => [ + "doc/man3/MDC2_Init.pod" + ], + "doc/man/man3/NCONF_new_ex.3" => [ + "doc/man3/NCONF_new_ex.pod" + ], + "doc/man/man3/OBJ_nid2obj.3" => [ + "doc/man3/OBJ_nid2obj.pod" + ], + "doc/man/man3/OCSP_REQUEST_new.3" => [ + "doc/man3/OCSP_REQUEST_new.pod" + ], + "doc/man/man3/OCSP_cert_to_id.3" => [ + "doc/man3/OCSP_cert_to_id.pod" + ], + "doc/man/man3/OCSP_request_add1_nonce.3" => [ + "doc/man3/OCSP_request_add1_nonce.pod" + ], + "doc/man/man3/OCSP_resp_find_status.3" => [ + "doc/man3/OCSP_resp_find_status.pod" + ], + "doc/man/man3/OCSP_response_status.3" => [ + "doc/man3/OCSP_response_status.pod" + ], + "doc/man/man3/OCSP_sendreq_new.3" => [ + "doc/man3/OCSP_sendreq_new.pod" + ], + "doc/man/man3/OPENSSL_Applink.3" => [ + "doc/man3/OPENSSL_Applink.pod" + ], + "doc/man/man3/OPENSSL_FILE.3" => [ + "doc/man3/OPENSSL_FILE.pod" + ], + "doc/man/man3/OPENSSL_LH_COMPFUNC.3" => [ + "doc/man3/OPENSSL_LH_COMPFUNC.pod" + ], + "doc/man/man3/OPENSSL_LH_stats.3" => [ + "doc/man3/OPENSSL_LH_stats.pod" + ], + "doc/man/man3/OPENSSL_config.3" => [ + "doc/man3/OPENSSL_config.pod" + ], + "doc/man/man3/OPENSSL_fork_prepare.3" => [ + "doc/man3/OPENSSL_fork_prepare.pod" + ], + "doc/man/man3/OPENSSL_gmtime.3" => [ + "doc/man3/OPENSSL_gmtime.pod" + ], + "doc/man/man3/OPENSSL_hexchar2int.3" => [ + "doc/man3/OPENSSL_hexchar2int.pod" + ], + "doc/man/man3/OPENSSL_ia32cap.3" => [ + "doc/man3/OPENSSL_ia32cap.pod" + ], + "doc/man/man3/OPENSSL_init_crypto.3" => [ + "doc/man3/OPENSSL_init_crypto.pod" + ], + "doc/man/man3/OPENSSL_init_ssl.3" => [ + "doc/man3/OPENSSL_init_ssl.pod" + ], + "doc/man/man3/OPENSSL_instrument_bus.3" => [ + "doc/man3/OPENSSL_instrument_bus.pod" + ], + "doc/man/man3/OPENSSL_load_builtin_modules.3" => [ + "doc/man3/OPENSSL_load_builtin_modules.pod" + ], + "doc/man/man3/OPENSSL_load_u16_le.3" => [ + "doc/man3/OPENSSL_load_u16_le.pod" + ], + "doc/man/man3/OPENSSL_malloc.3" => [ + "doc/man3/OPENSSL_malloc.pod" + ], + "doc/man/man3/OPENSSL_ppccap.3" => [ + "doc/man3/OPENSSL_ppccap.pod" + ], + "doc/man/man3/OPENSSL_riscvcap.3" => [ + "doc/man3/OPENSSL_riscvcap.pod" + ], + "doc/man/man3/OPENSSL_s390xcap.3" => [ + "doc/man3/OPENSSL_s390xcap.pod" + ], + "doc/man/man3/OPENSSL_secure_malloc.3" => [ + "doc/man3/OPENSSL_secure_malloc.pod" + ], + "doc/man/man3/OPENSSL_strcasecmp.3" => [ + "doc/man3/OPENSSL_strcasecmp.pod" + ], + "doc/man/man3/OSSL_ALGORITHM.3" => [ + "doc/man3/OSSL_ALGORITHM.pod" + ], + "doc/man/man3/OSSL_CALLBACK.3" => [ + "doc/man3/OSSL_CALLBACK.pod" + ], + "doc/man/man3/OSSL_CMP_ATAV_set0.3" => [ + "doc/man3/OSSL_CMP_ATAV_set0.pod" + ], + "doc/man/man3/OSSL_CMP_CTX_new.3" => [ + "doc/man3/OSSL_CMP_CTX_new.pod" + ], + "doc/man/man3/OSSL_CMP_HDR_get0_transactionID.3" => [ + "doc/man3/OSSL_CMP_HDR_get0_transactionID.pod" + ], + "doc/man/man3/OSSL_CMP_ITAV_new_caCerts.3" => [ + "doc/man3/OSSL_CMP_ITAV_new_caCerts.pod" + ], + "doc/man/man3/OSSL_CMP_ITAV_set0.3" => [ + "doc/man3/OSSL_CMP_ITAV_set0.pod" + ], + "doc/man/man3/OSSL_CMP_MSG_get0_header.3" => [ + "doc/man3/OSSL_CMP_MSG_get0_header.pod" + ], + "doc/man/man3/OSSL_CMP_MSG_http_perform.3" => [ + "doc/man3/OSSL_CMP_MSG_http_perform.pod" + ], + "doc/man/man3/OSSL_CMP_SRV_CTX_new.3" => [ + "doc/man3/OSSL_CMP_SRV_CTX_new.pod" + ], + "doc/man/man3/OSSL_CMP_STATUSINFO_new.3" => [ + "doc/man3/OSSL_CMP_STATUSINFO_new.pod" + ], + "doc/man/man3/OSSL_CMP_exec_certreq.3" => [ + "doc/man3/OSSL_CMP_exec_certreq.pod" + ], + "doc/man/man3/OSSL_CMP_log_open.3" => [ + "doc/man3/OSSL_CMP_log_open.pod" + ], + "doc/man/man3/OSSL_CMP_validate_msg.3" => [ + "doc/man3/OSSL_CMP_validate_msg.pod" + ], + "doc/man/man3/OSSL_CORE_MAKE_FUNC.3" => [ + "doc/man3/OSSL_CORE_MAKE_FUNC.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_get0_tmpl.3" => [ + "doc/man3/OSSL_CRMF_MSG_get0_tmpl.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_set0_validity.3" => [ + "doc/man3/OSSL_CRMF_MSG_set0_validity.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.3" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.3" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.pod" + ], + "doc/man/man3/OSSL_CRMF_pbmp_new.3" => [ + "doc/man3/OSSL_CRMF_pbmp_new.pod" + ], + "doc/man/man3/OSSL_DECODER.3" => [ + "doc/man3/OSSL_DECODER.pod" + ], + "doc/man/man3/OSSL_DECODER_CTX.3" => [ + "doc/man3/OSSL_DECODER_CTX.pod" + ], + "doc/man/man3/OSSL_DECODER_CTX_new_for_pkey.3" => [ + "doc/man3/OSSL_DECODER_CTX_new_for_pkey.pod" + ], + "doc/man/man3/OSSL_DECODER_from_bio.3" => [ + "doc/man3/OSSL_DECODER_from_bio.pod" + ], + "doc/man/man3/OSSL_DISPATCH.3" => [ + "doc/man3/OSSL_DISPATCH.pod" + ], + "doc/man/man3/OSSL_ENCODER.3" => [ + "doc/man3/OSSL_ENCODER.pod" + ], + "doc/man/man3/OSSL_ENCODER_CTX.3" => [ + "doc/man3/OSSL_ENCODER_CTX.pod" + ], + "doc/man/man3/OSSL_ENCODER_CTX_new_for_pkey.3" => [ + "doc/man3/OSSL_ENCODER_CTX_new_for_pkey.pod" + ], + "doc/man/man3/OSSL_ENCODER_to_bio.3" => [ + "doc/man3/OSSL_ENCODER_to_bio.pod" + ], + "doc/man/man3/OSSL_ERR_STATE_save.3" => [ + "doc/man3/OSSL_ERR_STATE_save.pod" + ], + "doc/man/man3/OSSL_ESS_check_signing_certs.3" => [ + "doc/man3/OSSL_ESS_check_signing_certs.pod" + ], + "doc/man/man3/OSSL_GENERAL_NAMES_print.3" => [ + "doc/man3/OSSL_GENERAL_NAMES_print.pod" + ], + "doc/man/man3/OSSL_HPKE_CTX_new.3" => [ + "doc/man3/OSSL_HPKE_CTX_new.pod" + ], + "doc/man/man3/OSSL_HTTP_REQ_CTX.3" => [ + "doc/man3/OSSL_HTTP_REQ_CTX.pod" + ], + "doc/man/man3/OSSL_HTTP_parse_url.3" => [ + "doc/man3/OSSL_HTTP_parse_url.pod" + ], + "doc/man/man3/OSSL_HTTP_transfer.3" => [ + "doc/man3/OSSL_HTTP_transfer.pod" + ], + "doc/man/man3/OSSL_IETF_ATTR_SYNTAX.3" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX.pod" + ], + "doc/man/man3/OSSL_IETF_ATTR_SYNTAX_print.3" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX_print.pod" + ], + "doc/man/man3/OSSL_INDICATOR_set_callback.3" => [ + "doc/man3/OSSL_INDICATOR_set_callback.pod" + ], + "doc/man/man3/OSSL_ITEM.3" => [ + "doc/man3/OSSL_ITEM.pod" + ], + "doc/man/man3/OSSL_LIB_CTX.3" => [ + "doc/man3/OSSL_LIB_CTX.pod" + ], + "doc/man/man3/OSSL_LIB_CTX_set_conf_diagnostics.3" => [ + "doc/man3/OSSL_LIB_CTX_set_conf_diagnostics.pod" + ], + "doc/man/man3/OSSL_PARAM.3" => [ + "doc/man3/OSSL_PARAM.pod" + ], + "doc/man/man3/OSSL_PARAM_BLD.3" => [ + "doc/man3/OSSL_PARAM_BLD.pod" + ], + "doc/man/man3/OSSL_PARAM_allocate_from_text.3" => [ + "doc/man3/OSSL_PARAM_allocate_from_text.pod" + ], + "doc/man/man3/OSSL_PARAM_dup.3" => [ + "doc/man3/OSSL_PARAM_dup.pod" + ], + "doc/man/man3/OSSL_PARAM_int.3" => [ + "doc/man3/OSSL_PARAM_int.pod" + ], + "doc/man/man3/OSSL_PARAM_print_to_bio.3" => [ + "doc/man3/OSSL_PARAM_print_to_bio.pod" + ], + "doc/man/man3/OSSL_PROVIDER.3" => [ + "doc/man3/OSSL_PROVIDER.pod" + ], + "doc/man/man3/OSSL_QUIC_client_method.3" => [ + "doc/man3/OSSL_QUIC_client_method.pod" + ], + "doc/man/man3/OSSL_SELF_TEST_new.3" => [ + "doc/man3/OSSL_SELF_TEST_new.pod" + ], + "doc/man/man3/OSSL_SELF_TEST_set_callback.3" => [ + "doc/man3/OSSL_SELF_TEST_set_callback.pod" + ], + "doc/man/man3/OSSL_STORE_INFO.3" => [ + "doc/man3/OSSL_STORE_INFO.pod" + ], + "doc/man/man3/OSSL_STORE_LOADER.3" => [ + "doc/man3/OSSL_STORE_LOADER.pod" + ], + "doc/man/man3/OSSL_STORE_SEARCH.3" => [ + "doc/man3/OSSL_STORE_SEARCH.pod" + ], + "doc/man/man3/OSSL_STORE_attach.3" => [ + "doc/man3/OSSL_STORE_attach.pod" + ], + "doc/man/man3/OSSL_STORE_expect.3" => [ + "doc/man3/OSSL_STORE_expect.pod" + ], + "doc/man/man3/OSSL_STORE_open.3" => [ + "doc/man3/OSSL_STORE_open.pod" + ], + "doc/man/man3/OSSL_sleep.3" => [ + "doc/man3/OSSL_sleep.pod" + ], + "doc/man/man3/OSSL_trace_enabled.3" => [ + "doc/man3/OSSL_trace_enabled.pod" + ], + "doc/man/man3/OSSL_trace_get_category_num.3" => [ + "doc/man3/OSSL_trace_get_category_num.pod" + ], + "doc/man/man3/OSSL_trace_set_channel.3" => [ + "doc/man3/OSSL_trace_set_channel.pod" + ], + "doc/man/man3/OpenSSL_add_all_algorithms.3" => [ + "doc/man3/OpenSSL_add_all_algorithms.pod" + ], + "doc/man/man3/OpenSSL_version.3" => [ + "doc/man3/OpenSSL_version.pod" + ], + "doc/man/man3/PBMAC1_get1_pbkdf2_param.3" => [ + "doc/man3/PBMAC1_get1_pbkdf2_param.pod" + ], + "doc/man/man3/PEM_X509_INFO_read_bio_ex.3" => [ + "doc/man3/PEM_X509_INFO_read_bio_ex.pod" + ], + "doc/man/man3/PEM_bytes_read_bio.3" => [ + "doc/man3/PEM_bytes_read_bio.pod" + ], + "doc/man/man3/PEM_read.3" => [ + "doc/man3/PEM_read.pod" + ], + "doc/man/man3/PEM_read_CMS.3" => [ + "doc/man3/PEM_read_CMS.pod" + ], + "doc/man/man3/PEM_read_bio_PrivateKey.3" => [ + "doc/man3/PEM_read_bio_PrivateKey.pod" + ], + "doc/man/man3/PEM_read_bio_ex.3" => [ + "doc/man3/PEM_read_bio_ex.pod" + ], + "doc/man/man3/PEM_write_bio_CMS_stream.3" => [ + "doc/man3/PEM_write_bio_CMS_stream.pod" + ], + "doc/man/man3/PEM_write_bio_PKCS7_stream.3" => [ + "doc/man3/PEM_write_bio_PKCS7_stream.pod" + ], + "doc/man/man3/PKCS12_PBE_keyivgen.3" => [ + "doc/man3/PKCS12_PBE_keyivgen.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_create_cert.3" => [ + "doc/man3/PKCS12_SAFEBAG_create_cert.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_get0_attrs.3" => [ + "doc/man3/PKCS12_SAFEBAG_get0_attrs.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_get1_cert.3" => [ + "doc/man3/PKCS12_SAFEBAG_get1_cert.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_set0_attrs.3" => [ + "doc/man3/PKCS12_SAFEBAG_set0_attrs.pod" + ], + "doc/man/man3/PKCS12_add1_attr_by_NID.3" => [ + "doc/man3/PKCS12_add1_attr_by_NID.pod" + ], + "doc/man/man3/PKCS12_add_CSPName_asc.3" => [ + "doc/man3/PKCS12_add_CSPName_asc.pod" + ], + "doc/man/man3/PKCS12_add_cert.3" => [ + "doc/man3/PKCS12_add_cert.pod" + ], + "doc/man/man3/PKCS12_add_friendlyname_asc.3" => [ + "doc/man3/PKCS12_add_friendlyname_asc.pod" + ], + "doc/man/man3/PKCS12_add_localkeyid.3" => [ + "doc/man3/PKCS12_add_localkeyid.pod" + ], + "doc/man/man3/PKCS12_add_safe.3" => [ + "doc/man3/PKCS12_add_safe.pod" + ], + "doc/man/man3/PKCS12_create.3" => [ + "doc/man3/PKCS12_create.pod" + ], + "doc/man/man3/PKCS12_decrypt_skey.3" => [ + "doc/man3/PKCS12_decrypt_skey.pod" + ], + "doc/man/man3/PKCS12_gen_mac.3" => [ + "doc/man3/PKCS12_gen_mac.pod" + ], + "doc/man/man3/PKCS12_get_friendlyname.3" => [ + "doc/man3/PKCS12_get_friendlyname.pod" + ], + "doc/man/man3/PKCS12_init.3" => [ + "doc/man3/PKCS12_init.pod" + ], + "doc/man/man3/PKCS12_item_decrypt_d2i.3" => [ + "doc/man3/PKCS12_item_decrypt_d2i.pod" + ], + "doc/man/man3/PKCS12_key_gen_utf8_ex.3" => [ + "doc/man3/PKCS12_key_gen_utf8_ex.pod" + ], + "doc/man/man3/PKCS12_newpass.3" => [ + "doc/man3/PKCS12_newpass.pod" + ], + "doc/man/man3/PKCS12_pack_p7encdata.3" => [ + "doc/man3/PKCS12_pack_p7encdata.pod" + ], + "doc/man/man3/PKCS12_parse.3" => [ + "doc/man3/PKCS12_parse.pod" + ], + "doc/man/man3/PKCS5_PBE_keyivgen.3" => [ + "doc/man3/PKCS5_PBE_keyivgen.pod" + ], + "doc/man/man3/PKCS5_PBKDF2_HMAC.3" => [ + "doc/man3/PKCS5_PBKDF2_HMAC.pod" + ], + "doc/man/man3/PKCS7_decrypt.3" => [ + "doc/man3/PKCS7_decrypt.pod" + ], + "doc/man/man3/PKCS7_encrypt.3" => [ + "doc/man3/PKCS7_encrypt.pod" + ], + "doc/man/man3/PKCS7_get_octet_string.3" => [ + "doc/man3/PKCS7_get_octet_string.pod" + ], + "doc/man/man3/PKCS7_sign.3" => [ + "doc/man3/PKCS7_sign.pod" + ], + "doc/man/man3/PKCS7_sign_add_signer.3" => [ + "doc/man3/PKCS7_sign_add_signer.pod" + ], + "doc/man/man3/PKCS7_type_is_other.3" => [ + "doc/man3/PKCS7_type_is_other.pod" + ], + "doc/man/man3/PKCS7_verify.3" => [ + "doc/man3/PKCS7_verify.pod" + ], + "doc/man/man3/PKCS8_encrypt.3" => [ + "doc/man3/PKCS8_encrypt.pod" + ], + "doc/man/man3/PKCS8_pkey_add1_attr.3" => [ + "doc/man3/PKCS8_pkey_add1_attr.pod" + ], + "doc/man/man3/RAND_add.3" => [ + "doc/man3/RAND_add.pod" + ], + "doc/man/man3/RAND_bytes.3" => [ + "doc/man3/RAND_bytes.pod" + ], + "doc/man/man3/RAND_cleanup.3" => [ + "doc/man3/RAND_cleanup.pod" + ], + "doc/man/man3/RAND_egd.3" => [ + "doc/man3/RAND_egd.pod" + ], + "doc/man/man3/RAND_get0_primary.3" => [ + "doc/man3/RAND_get0_primary.pod" + ], + "doc/man/man3/RAND_load_file.3" => [ + "doc/man3/RAND_load_file.pod" + ], + "doc/man/man3/RAND_set_DRBG_type.3" => [ + "doc/man3/RAND_set_DRBG_type.pod" + ], + "doc/man/man3/RAND_set_rand_method.3" => [ + "doc/man3/RAND_set_rand_method.pod" + ], + "doc/man/man3/RC4_set_key.3" => [ + "doc/man3/RC4_set_key.pod" + ], + "doc/man/man3/RIPEMD160_Init.3" => [ + "doc/man3/RIPEMD160_Init.pod" + ], + "doc/man/man3/RSA_blinding_on.3" => [ + "doc/man3/RSA_blinding_on.pod" + ], + "doc/man/man3/RSA_check_key.3" => [ + "doc/man3/RSA_check_key.pod" + ], + "doc/man/man3/RSA_generate_key.3" => [ + "doc/man3/RSA_generate_key.pod" + ], + "doc/man/man3/RSA_get0_key.3" => [ + "doc/man3/RSA_get0_key.pod" + ], + "doc/man/man3/RSA_meth_new.3" => [ + "doc/man3/RSA_meth_new.pod" + ], + "doc/man/man3/RSA_new.3" => [ + "doc/man3/RSA_new.pod" + ], + "doc/man/man3/RSA_padding_add_PKCS1_type_1.3" => [ + "doc/man3/RSA_padding_add_PKCS1_type_1.pod" + ], + "doc/man/man3/RSA_print.3" => [ + "doc/man3/RSA_print.pod" + ], + "doc/man/man3/RSA_private_encrypt.3" => [ + "doc/man3/RSA_private_encrypt.pod" + ], + "doc/man/man3/RSA_public_encrypt.3" => [ + "doc/man3/RSA_public_encrypt.pod" + ], + "doc/man/man3/RSA_set_method.3" => [ + "doc/man3/RSA_set_method.pod" + ], + "doc/man/man3/RSA_sign.3" => [ + "doc/man3/RSA_sign.pod" + ], + "doc/man/man3/RSA_sign_ASN1_OCTET_STRING.3" => [ + "doc/man3/RSA_sign_ASN1_OCTET_STRING.pod" + ], + "doc/man/man3/RSA_size.3" => [ + "doc/man3/RSA_size.pod" + ], + "doc/man/man3/SCT_new.3" => [ + "doc/man3/SCT_new.pod" + ], + "doc/man/man3/SCT_print.3" => [ + "doc/man3/SCT_print.pod" + ], + "doc/man/man3/SCT_validate.3" => [ + "doc/man3/SCT_validate.pod" + ], + "doc/man/man3/SHA256_Init.3" => [ + "doc/man3/SHA256_Init.pod" + ], + "doc/man/man3/SMIME_read_ASN1.3" => [ + "doc/man3/SMIME_read_ASN1.pod" + ], + "doc/man/man3/SMIME_read_CMS.3" => [ + "doc/man3/SMIME_read_CMS.pod" + ], + "doc/man/man3/SMIME_read_PKCS7.3" => [ + "doc/man3/SMIME_read_PKCS7.pod" + ], + "doc/man/man3/SMIME_write_ASN1.3" => [ + "doc/man3/SMIME_write_ASN1.pod" + ], + "doc/man/man3/SMIME_write_CMS.3" => [ + "doc/man3/SMIME_write_CMS.pod" + ], + "doc/man/man3/SMIME_write_PKCS7.3" => [ + "doc/man3/SMIME_write_PKCS7.pod" + ], + "doc/man/man3/SRP_Calc_B.3" => [ + "doc/man3/SRP_Calc_B.pod" + ], + "doc/man/man3/SRP_VBASE_new.3" => [ + "doc/man3/SRP_VBASE_new.pod" + ], + "doc/man/man3/SRP_create_verifier.3" => [ + "doc/man3/SRP_create_verifier.pod" + ], + "doc/man/man3/SRP_user_pwd_new.3" => [ + "doc/man3/SRP_user_pwd_new.pod" + ], + "doc/man/man3/SSL_CIPHER_get_name.3" => [ + "doc/man3/SSL_CIPHER_get_name.pod" + ], + "doc/man/man3/SSL_COMP_add_compression_method.3" => [ + "doc/man3/SSL_COMP_add_compression_method.pod" + ], + "doc/man/man3/SSL_CONF_CTX_new.3" => [ + "doc/man3/SSL_CONF_CTX_new.pod" + ], + "doc/man/man3/SSL_CONF_CTX_set1_prefix.3" => [ + "doc/man3/SSL_CONF_CTX_set1_prefix.pod" + ], + "doc/man/man3/SSL_CONF_CTX_set_flags.3" => [ + "doc/man3/SSL_CONF_CTX_set_flags.pod" + ], + "doc/man/man3/SSL_CONF_CTX_set_ssl_ctx.3" => [ + "doc/man3/SSL_CONF_CTX_set_ssl_ctx.pod" + ], + "doc/man/man3/SSL_CONF_cmd.3" => [ + "doc/man3/SSL_CONF_cmd.pod" + ], + "doc/man/man3/SSL_CONF_cmd_argv.3" => [ + "doc/man3/SSL_CONF_cmd_argv.pod" + ], + "doc/man/man3/SSL_CTX_add1_chain_cert.3" => [ + "doc/man3/SSL_CTX_add1_chain_cert.pod" + ], + "doc/man/man3/SSL_CTX_add_extra_chain_cert.3" => [ + "doc/man3/SSL_CTX_add_extra_chain_cert.pod" + ], + "doc/man/man3/SSL_CTX_add_session.3" => [ + "doc/man3/SSL_CTX_add_session.pod" + ], + "doc/man/man3/SSL_CTX_config.3" => [ + "doc/man3/SSL_CTX_config.pod" + ], + "doc/man/man3/SSL_CTX_ctrl.3" => [ + "doc/man3/SSL_CTX_ctrl.pod" + ], + "doc/man/man3/SSL_CTX_dane_enable.3" => [ + "doc/man3/SSL_CTX_dane_enable.pod" + ], + "doc/man/man3/SSL_CTX_flush_sessions.3" => [ + "doc/man3/SSL_CTX_flush_sessions.pod" + ], + "doc/man/man3/SSL_CTX_free.3" => [ + "doc/man3/SSL_CTX_free.pod" + ], + "doc/man/man3/SSL_CTX_get0_param.3" => [ + "doc/man3/SSL_CTX_get0_param.pod" + ], + "doc/man/man3/SSL_CTX_get_verify_mode.3" => [ + "doc/man3/SSL_CTX_get_verify_mode.pod" + ], + "doc/man/man3/SSL_CTX_has_client_custom_ext.3" => [ + "doc/man3/SSL_CTX_has_client_custom_ext.pod" + ], + "doc/man/man3/SSL_CTX_load_verify_locations.3" => [ + "doc/man3/SSL_CTX_load_verify_locations.pod" + ], + "doc/man/man3/SSL_CTX_new.3" => [ + "doc/man3/SSL_CTX_new.pod" + ], + "doc/man/man3/SSL_CTX_sess_number.3" => [ + "doc/man3/SSL_CTX_sess_number.pod" + ], + "doc/man/man3/SSL_CTX_sess_set_cache_size.3" => [ + "doc/man3/SSL_CTX_sess_set_cache_size.pod" + ], + "doc/man/man3/SSL_CTX_sess_set_get_cb.3" => [ + "doc/man3/SSL_CTX_sess_set_get_cb.pod" + ], + "doc/man/man3/SSL_CTX_sessions.3" => [ + "doc/man3/SSL_CTX_sessions.pod" + ], + "doc/man/man3/SSL_CTX_set0_CA_list.3" => [ + "doc/man3/SSL_CTX_set0_CA_list.pod" + ], + "doc/man/man3/SSL_CTX_set1_cert_comp_preference.3" => [ + "doc/man3/SSL_CTX_set1_cert_comp_preference.pod" + ], + "doc/man/man3/SSL_CTX_set1_curves.3" => [ + "doc/man3/SSL_CTX_set1_curves.pod" + ], + "doc/man/man3/SSL_CTX_set1_sigalgs.3" => [ + "doc/man3/SSL_CTX_set1_sigalgs.pod" + ], + "doc/man/man3/SSL_CTX_set1_verify_cert_store.3" => [ + "doc/man3/SSL_CTX_set1_verify_cert_store.pod" + ], + "doc/man/man3/SSL_CTX_set_alpn_select_cb.3" => [ + "doc/man3/SSL_CTX_set_alpn_select_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_cert_cb.3" => [ + "doc/man3/SSL_CTX_set_cert_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_cert_store.3" => [ + "doc/man3/SSL_CTX_set_cert_store.pod" + ], + "doc/man/man3/SSL_CTX_set_cert_verify_callback.3" => [ + "doc/man3/SSL_CTX_set_cert_verify_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_cipher_list.3" => [ + "doc/man3/SSL_CTX_set_cipher_list.pod" + ], + "doc/man/man3/SSL_CTX_set_client_cert_cb.3" => [ + "doc/man3/SSL_CTX_set_client_cert_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_client_hello_cb.3" => [ + "doc/man3/SSL_CTX_set_client_hello_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_ct_validation_callback.3" => [ + "doc/man3/SSL_CTX_set_ct_validation_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_ctlog_list_file.3" => [ + "doc/man3/SSL_CTX_set_ctlog_list_file.pod" + ], + "doc/man/man3/SSL_CTX_set_default_passwd_cb.3" => [ + "doc/man3/SSL_CTX_set_default_passwd_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_domain_flags.3" => [ + "doc/man3/SSL_CTX_set_domain_flags.pod" + ], + "doc/man/man3/SSL_CTX_set_generate_session_id.3" => [ + "doc/man3/SSL_CTX_set_generate_session_id.pod" + ], + "doc/man/man3/SSL_CTX_set_info_callback.3" => [ + "doc/man3/SSL_CTX_set_info_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_keylog_callback.3" => [ + "doc/man3/SSL_CTX_set_keylog_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_max_cert_list.3" => [ + "doc/man3/SSL_CTX_set_max_cert_list.pod" + ], + "doc/man/man3/SSL_CTX_set_min_proto_version.3" => [ + "doc/man3/SSL_CTX_set_min_proto_version.pod" + ], + "doc/man/man3/SSL_CTX_set_mode.3" => [ + "doc/man3/SSL_CTX_set_mode.pod" + ], + "doc/man/man3/SSL_CTX_set_msg_callback.3" => [ + "doc/man3/SSL_CTX_set_msg_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_new_pending_conn_cb.3" => [ + "doc/man3/SSL_CTX_set_new_pending_conn_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_num_tickets.3" => [ + "doc/man3/SSL_CTX_set_num_tickets.pod" + ], + "doc/man/man3/SSL_CTX_set_options.3" => [ + "doc/man3/SSL_CTX_set_options.pod" + ], + "doc/man/man3/SSL_CTX_set_psk_client_callback.3" => [ + "doc/man3/SSL_CTX_set_psk_client_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_quiet_shutdown.3" => [ + "doc/man3/SSL_CTX_set_quiet_shutdown.pod" + ], + "doc/man/man3/SSL_CTX_set_read_ahead.3" => [ + "doc/man3/SSL_CTX_set_read_ahead.pod" + ], + "doc/man/man3/SSL_CTX_set_record_padding_callback.3" => [ + "doc/man3/SSL_CTX_set_record_padding_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_security_level.3" => [ + "doc/man3/SSL_CTX_set_security_level.pod" + ], + "doc/man/man3/SSL_CTX_set_session_cache_mode.3" => [ + "doc/man3/SSL_CTX_set_session_cache_mode.pod" + ], + "doc/man/man3/SSL_CTX_set_session_id_context.3" => [ + "doc/man3/SSL_CTX_set_session_id_context.pod" + ], + "doc/man/man3/SSL_CTX_set_session_ticket_cb.3" => [ + "doc/man3/SSL_CTX_set_session_ticket_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_split_send_fragment.3" => [ + "doc/man3/SSL_CTX_set_split_send_fragment.pod" + ], + "doc/man/man3/SSL_CTX_set_srp_password.3" => [ + "doc/man3/SSL_CTX_set_srp_password.pod" + ], + "doc/man/man3/SSL_CTX_set_ssl_version.3" => [ + "doc/man3/SSL_CTX_set_ssl_version.pod" + ], + "doc/man/man3/SSL_CTX_set_stateless_cookie_generate_cb.3" => [ + "doc/man3/SSL_CTX_set_stateless_cookie_generate_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_timeout.3" => [ + "doc/man3/SSL_CTX_set_timeout.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_servername_callback.3" => [ + "doc/man3/SSL_CTX_set_tlsext_servername_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_status_cb.3" => [ + "doc/man3/SSL_CTX_set_tlsext_status_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_ticket_key_cb.3" => [ + "doc/man3/SSL_CTX_set_tlsext_ticket_key_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_use_srtp.3" => [ + "doc/man3/SSL_CTX_set_tlsext_use_srtp.pod" + ], + "doc/man/man3/SSL_CTX_set_tmp_dh_callback.3" => [ + "doc/man3/SSL_CTX_set_tmp_dh_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_tmp_ecdh.3" => [ + "doc/man3/SSL_CTX_set_tmp_ecdh.pod" + ], + "doc/man/man3/SSL_CTX_set_verify.3" => [ + "doc/man3/SSL_CTX_set_verify.pod" + ], + "doc/man/man3/SSL_CTX_use_certificate.3" => [ + "doc/man3/SSL_CTX_use_certificate.pod" + ], + "doc/man/man3/SSL_CTX_use_psk_identity_hint.3" => [ + "doc/man3/SSL_CTX_use_psk_identity_hint.pod" + ], + "doc/man/man3/SSL_CTX_use_serverinfo.3" => [ + "doc/man3/SSL_CTX_use_serverinfo.pod" + ], + "doc/man/man3/SSL_SESSION_free.3" => [ + "doc/man3/SSL_SESSION_free.pod" + ], + "doc/man/man3/SSL_SESSION_get0_cipher.3" => [ + "doc/man3/SSL_SESSION_get0_cipher.pod" + ], + "doc/man/man3/SSL_SESSION_get0_hostname.3" => [ + "doc/man3/SSL_SESSION_get0_hostname.pod" + ], + "doc/man/man3/SSL_SESSION_get0_id_context.3" => [ + "doc/man3/SSL_SESSION_get0_id_context.pod" + ], + "doc/man/man3/SSL_SESSION_get0_peer.3" => [ + "doc/man3/SSL_SESSION_get0_peer.pod" + ], + "doc/man/man3/SSL_SESSION_get_compress_id.3" => [ + "doc/man3/SSL_SESSION_get_compress_id.pod" + ], + "doc/man/man3/SSL_SESSION_get_protocol_version.3" => [ + "doc/man3/SSL_SESSION_get_protocol_version.pod" + ], + "doc/man/man3/SSL_SESSION_get_time.3" => [ + "doc/man3/SSL_SESSION_get_time.pod" + ], + "doc/man/man3/SSL_SESSION_has_ticket.3" => [ + "doc/man3/SSL_SESSION_has_ticket.pod" + ], + "doc/man/man3/SSL_SESSION_is_resumable.3" => [ + "doc/man3/SSL_SESSION_is_resumable.pod" + ], + "doc/man/man3/SSL_SESSION_print.3" => [ + "doc/man3/SSL_SESSION_print.pod" + ], + "doc/man/man3/SSL_SESSION_set1_id.3" => [ + "doc/man3/SSL_SESSION_set1_id.pod" + ], + "doc/man/man3/SSL_accept.3" => [ + "doc/man3/SSL_accept.pod" + ], + "doc/man/man3/SSL_accept_stream.3" => [ + "doc/man3/SSL_accept_stream.pod" + ], + "doc/man/man3/SSL_alert_type_string.3" => [ + "doc/man3/SSL_alert_type_string.pod" + ], + "doc/man/man3/SSL_alloc_buffers.3" => [ + "doc/man3/SSL_alloc_buffers.pod" + ], + "doc/man/man3/SSL_check_chain.3" => [ + "doc/man3/SSL_check_chain.pod" + ], + "doc/man/man3/SSL_clear.3" => [ + "doc/man3/SSL_clear.pod" + ], + "doc/man/man3/SSL_connect.3" => [ + "doc/man3/SSL_connect.pod" + ], + "doc/man/man3/SSL_do_handshake.3" => [ + "doc/man3/SSL_do_handshake.pod" + ], + "doc/man/man3/SSL_export_keying_material.3" => [ + "doc/man3/SSL_export_keying_material.pod" + ], + "doc/man/man3/SSL_extension_supported.3" => [ + "doc/man3/SSL_extension_supported.pod" + ], + "doc/man/man3/SSL_free.3" => [ + "doc/man3/SSL_free.pod" + ], + "doc/man/man3/SSL_get0_connection.3" => [ + "doc/man3/SSL_get0_connection.pod" + ], + "doc/man/man3/SSL_get0_group_name.3" => [ + "doc/man3/SSL_get0_group_name.pod" + ], + "doc/man/man3/SSL_get0_peer_rpk.3" => [ + "doc/man3/SSL_get0_peer_rpk.pod" + ], + "doc/man/man3/SSL_get0_peer_scts.3" => [ + "doc/man3/SSL_get0_peer_scts.pod" + ], + "doc/man/man3/SSL_get1_builtin_sigalgs.3" => [ + "doc/man3/SSL_get1_builtin_sigalgs.pod" + ], + "doc/man/man3/SSL_get_SSL_CTX.3" => [ + "doc/man3/SSL_get_SSL_CTX.pod" + ], + "doc/man/man3/SSL_get_all_async_fds.3" => [ + "doc/man3/SSL_get_all_async_fds.pod" + ], + "doc/man/man3/SSL_get_certificate.3" => [ + "doc/man3/SSL_get_certificate.pod" + ], + "doc/man/man3/SSL_get_ciphers.3" => [ + "doc/man3/SSL_get_ciphers.pod" + ], + "doc/man/man3/SSL_get_client_random.3" => [ + "doc/man3/SSL_get_client_random.pod" + ], + "doc/man/man3/SSL_get_conn_close_info.3" => [ + "doc/man3/SSL_get_conn_close_info.pod" + ], + "doc/man/man3/SSL_get_current_cipher.3" => [ + "doc/man3/SSL_get_current_cipher.pod" + ], + "doc/man/man3/SSL_get_default_timeout.3" => [ + "doc/man3/SSL_get_default_timeout.pod" + ], + "doc/man/man3/SSL_get_error.3" => [ + "doc/man3/SSL_get_error.pod" + ], + "doc/man/man3/SSL_get_event_timeout.3" => [ + "doc/man3/SSL_get_event_timeout.pod" + ], + "doc/man/man3/SSL_get_extms_support.3" => [ + "doc/man3/SSL_get_extms_support.pod" + ], + "doc/man/man3/SSL_get_fd.3" => [ + "doc/man3/SSL_get_fd.pod" + ], + "doc/man/man3/SSL_get_handshake_rtt.3" => [ + "doc/man3/SSL_get_handshake_rtt.pod" + ], + "doc/man/man3/SSL_get_peer_cert_chain.3" => [ + "doc/man3/SSL_get_peer_cert_chain.pod" + ], + "doc/man/man3/SSL_get_peer_certificate.3" => [ + "doc/man3/SSL_get_peer_certificate.pod" + ], + "doc/man/man3/SSL_get_peer_signature_nid.3" => [ + "doc/man3/SSL_get_peer_signature_nid.pod" + ], + "doc/man/man3/SSL_get_peer_tmp_key.3" => [ + "doc/man3/SSL_get_peer_tmp_key.pod" + ], + "doc/man/man3/SSL_get_psk_identity.3" => [ + "doc/man3/SSL_get_psk_identity.pod" + ], + "doc/man/man3/SSL_get_rbio.3" => [ + "doc/man3/SSL_get_rbio.pod" + ], + "doc/man/man3/SSL_get_rpoll_descriptor.3" => [ + "doc/man3/SSL_get_rpoll_descriptor.pod" + ], + "doc/man/man3/SSL_get_session.3" => [ + "doc/man3/SSL_get_session.pod" + ], + "doc/man/man3/SSL_get_shared_sigalgs.3" => [ + "doc/man3/SSL_get_shared_sigalgs.pod" + ], + "doc/man/man3/SSL_get_stream_id.3" => [ + "doc/man3/SSL_get_stream_id.pod" + ], + "doc/man/man3/SSL_get_stream_read_state.3" => [ + "doc/man3/SSL_get_stream_read_state.pod" + ], + "doc/man/man3/SSL_get_value_uint.3" => [ + "doc/man3/SSL_get_value_uint.pod" + ], + "doc/man/man3/SSL_get_verify_result.3" => [ + "doc/man3/SSL_get_verify_result.pod" + ], + "doc/man/man3/SSL_get_version.3" => [ + "doc/man3/SSL_get_version.pod" + ], + "doc/man/man3/SSL_group_to_name.3" => [ + "doc/man3/SSL_group_to_name.pod" + ], + "doc/man/man3/SSL_handle_events.3" => [ + "doc/man3/SSL_handle_events.pod" + ], + "doc/man/man3/SSL_in_init.3" => [ + "doc/man3/SSL_in_init.pod" + ], + "doc/man/man3/SSL_inject_net_dgram.3" => [ + "doc/man3/SSL_inject_net_dgram.pod" + ], + "doc/man/man3/SSL_key_update.3" => [ + "doc/man3/SSL_key_update.pod" + ], + "doc/man/man3/SSL_library_init.3" => [ + "doc/man3/SSL_library_init.pod" + ], + "doc/man/man3/SSL_load_client_CA_file.3" => [ + "doc/man3/SSL_load_client_CA_file.pod" + ], + "doc/man/man3/SSL_new.3" => [ + "doc/man3/SSL_new.pod" + ], + "doc/man/man3/SSL_new_domain.3" => [ + "doc/man3/SSL_new_domain.pod" + ], + "doc/man/man3/SSL_new_listener.3" => [ + "doc/man3/SSL_new_listener.pod" + ], + "doc/man/man3/SSL_new_stream.3" => [ + "doc/man3/SSL_new_stream.pod" + ], + "doc/man/man3/SSL_pending.3" => [ + "doc/man3/SSL_pending.pod" + ], + "doc/man/man3/SSL_poll.3" => [ + "doc/man3/SSL_poll.pod" + ], + "doc/man/man3/SSL_read.3" => [ + "doc/man3/SSL_read.pod" + ], + "doc/man/man3/SSL_read_early_data.3" => [ + "doc/man3/SSL_read_early_data.pod" + ], + "doc/man/man3/SSL_rstate_string.3" => [ + "doc/man3/SSL_rstate_string.pod" + ], + "doc/man/man3/SSL_session_reused.3" => [ + "doc/man3/SSL_session_reused.pod" + ], + "doc/man/man3/SSL_set1_host.3" => [ + "doc/man3/SSL_set1_host.pod" + ], + "doc/man/man3/SSL_set1_initial_peer_addr.3" => [ + "doc/man3/SSL_set1_initial_peer_addr.pod" + ], + "doc/man/man3/SSL_set1_server_cert_type.3" => [ + "doc/man3/SSL_set1_server_cert_type.pod" + ], + "doc/man/man3/SSL_set_async_callback.3" => [ + "doc/man3/SSL_set_async_callback.pod" + ], + "doc/man/man3/SSL_set_bio.3" => [ + "doc/man3/SSL_set_bio.pod" + ], + "doc/man/man3/SSL_set_blocking_mode.3" => [ + "doc/man3/SSL_set_blocking_mode.pod" + ], + "doc/man/man3/SSL_set_connect_state.3" => [ + "doc/man3/SSL_set_connect_state.pod" + ], + "doc/man/man3/SSL_set_default_stream_mode.3" => [ + "doc/man3/SSL_set_default_stream_mode.pod" + ], + "doc/man/man3/SSL_set_fd.3" => [ + "doc/man3/SSL_set_fd.pod" + ], + "doc/man/man3/SSL_set_incoming_stream_policy.3" => [ + "doc/man3/SSL_set_incoming_stream_policy.pod" + ], + "doc/man/man3/SSL_set_quic_tls_cbs.3" => [ + "doc/man3/SSL_set_quic_tls_cbs.pod" + ], + "doc/man/man3/SSL_set_retry_verify.3" => [ + "doc/man3/SSL_set_retry_verify.pod" + ], + "doc/man/man3/SSL_set_session.3" => [ + "doc/man3/SSL_set_session.pod" + ], + "doc/man/man3/SSL_set_session_secret_cb.3" => [ + "doc/man3/SSL_set_session_secret_cb.pod" + ], + "doc/man/man3/SSL_set_shutdown.3" => [ + "doc/man3/SSL_set_shutdown.pod" + ], + "doc/man/man3/SSL_set_verify_result.3" => [ + "doc/man3/SSL_set_verify_result.pod" + ], + "doc/man/man3/SSL_shutdown.3" => [ + "doc/man3/SSL_shutdown.pod" + ], + "doc/man/man3/SSL_state_string.3" => [ + "doc/man3/SSL_state_string.pod" + ], + "doc/man/man3/SSL_stream_conclude.3" => [ + "doc/man3/SSL_stream_conclude.pod" + ], + "doc/man/man3/SSL_stream_reset.3" => [ + "doc/man3/SSL_stream_reset.pod" + ], + "doc/man/man3/SSL_want.3" => [ + "doc/man3/SSL_want.pod" + ], + "doc/man/man3/SSL_write.3" => [ + "doc/man3/SSL_write.pod" + ], + "doc/man/man3/TS_RESP_CTX_new.3" => [ + "doc/man3/TS_RESP_CTX_new.pod" + ], + "doc/man/man3/TS_VERIFY_CTX.3" => [ + "doc/man3/TS_VERIFY_CTX.pod" + ], + "doc/man/man3/UI_STRING.3" => [ + "doc/man3/UI_STRING.pod" + ], + "doc/man/man3/UI_UTIL_read_pw.3" => [ + "doc/man3/UI_UTIL_read_pw.pod" + ], + "doc/man/man3/UI_create_method.3" => [ + "doc/man3/UI_create_method.pod" + ], + "doc/man/man3/UI_new.3" => [ + "doc/man3/UI_new.pod" + ], + "doc/man/man3/X509V3_EXT_print.3" => [ + "doc/man3/X509V3_EXT_print.pod" + ], + "doc/man/man3/X509V3_get_d2i.3" => [ + "doc/man3/X509V3_get_d2i.pod" + ], + "doc/man/man3/X509V3_set_ctx.3" => [ + "doc/man3/X509V3_set_ctx.pod" + ], + "doc/man/man3/X509_ACERT_add1_attr.3" => [ + "doc/man3/X509_ACERT_add1_attr.pod" + ], + "doc/man/man3/X509_ACERT_add_attr_nconf.3" => [ + "doc/man3/X509_ACERT_add_attr_nconf.pod" + ], + "doc/man/man3/X509_ACERT_get0_holder_baseCertId.3" => [ + "doc/man3/X509_ACERT_get0_holder_baseCertId.pod" + ], + "doc/man/man3/X509_ACERT_get_attr.3" => [ + "doc/man3/X509_ACERT_get_attr.pod" + ], + "doc/man/man3/X509_ACERT_print_ex.3" => [ + "doc/man3/X509_ACERT_print_ex.pod" + ], + "doc/man/man3/X509_ALGOR_dup.3" => [ + "doc/man3/X509_ALGOR_dup.pod" + ], + "doc/man/man3/X509_ATTRIBUTE.3" => [ + "doc/man3/X509_ATTRIBUTE.pod" + ], + "doc/man/man3/X509_CRL_get0_by_serial.3" => [ + "doc/man3/X509_CRL_get0_by_serial.pod" + ], + "doc/man/man3/X509_EXTENSION_set_object.3" => [ + "doc/man3/X509_EXTENSION_set_object.pod" + ], + "doc/man/man3/X509_LOOKUP.3" => [ + "doc/man3/X509_LOOKUP.pod" + ], + "doc/man/man3/X509_LOOKUP_hash_dir.3" => [ + "doc/man3/X509_LOOKUP_hash_dir.pod" + ], + "doc/man/man3/X509_LOOKUP_meth_new.3" => [ + "doc/man3/X509_LOOKUP_meth_new.pod" + ], + "doc/man/man3/X509_NAME_ENTRY_get_object.3" => [ + "doc/man3/X509_NAME_ENTRY_get_object.pod" + ], + "doc/man/man3/X509_NAME_add_entry_by_txt.3" => [ + "doc/man3/X509_NAME_add_entry_by_txt.pod" + ], + "doc/man/man3/X509_NAME_get0_der.3" => [ + "doc/man3/X509_NAME_get0_der.pod" + ], + "doc/man/man3/X509_NAME_get_index_by_NID.3" => [ + "doc/man3/X509_NAME_get_index_by_NID.pod" + ], + "doc/man/man3/X509_NAME_print_ex.3" => [ + "doc/man3/X509_NAME_print_ex.pod" + ], + "doc/man/man3/X509_PUBKEY_new.3" => [ + "doc/man3/X509_PUBKEY_new.pod" + ], + "doc/man/man3/X509_REQ_get_attr.3" => [ + "doc/man3/X509_REQ_get_attr.pod" + ], + "doc/man/man3/X509_REQ_get_extensions.3" => [ + "doc/man3/X509_REQ_get_extensions.pod" + ], + "doc/man/man3/X509_SIG_get0.3" => [ + "doc/man3/X509_SIG_get0.pod" + ], + "doc/man/man3/X509_STORE_CTX_get_by_subject.3" => [ + "doc/man3/X509_STORE_CTX_get_by_subject.pod" + ], + "doc/man/man3/X509_STORE_CTX_get_error.3" => [ + "doc/man3/X509_STORE_CTX_get_error.pod" + ], + "doc/man/man3/X509_STORE_CTX_new.3" => [ + "doc/man3/X509_STORE_CTX_new.pod" + ], + "doc/man/man3/X509_STORE_CTX_set_verify_cb.3" => [ + "doc/man3/X509_STORE_CTX_set_verify_cb.pod" + ], + "doc/man/man3/X509_STORE_add_cert.3" => [ + "doc/man3/X509_STORE_add_cert.pod" + ], + "doc/man/man3/X509_STORE_get0_param.3" => [ + "doc/man3/X509_STORE_get0_param.pod" + ], + "doc/man/man3/X509_STORE_new.3" => [ + "doc/man3/X509_STORE_new.pod" + ], + "doc/man/man3/X509_STORE_set_verify_cb_func.3" => [ + "doc/man3/X509_STORE_set_verify_cb_func.pod" + ], + "doc/man/man3/X509_VERIFY_PARAM_set_flags.3" => [ + "doc/man3/X509_VERIFY_PARAM_set_flags.pod" + ], + "doc/man/man3/X509_add_cert.3" => [ + "doc/man3/X509_add_cert.pod" + ], + "doc/man/man3/X509_check_ca.3" => [ + "doc/man3/X509_check_ca.pod" + ], + "doc/man/man3/X509_check_host.3" => [ + "doc/man3/X509_check_host.pod" + ], + "doc/man/man3/X509_check_issued.3" => [ + "doc/man3/X509_check_issued.pod" + ], + "doc/man/man3/X509_check_private_key.3" => [ + "doc/man3/X509_check_private_key.pod" + ], + "doc/man/man3/X509_check_purpose.3" => [ + "doc/man3/X509_check_purpose.pod" + ], + "doc/man/man3/X509_cmp.3" => [ + "doc/man3/X509_cmp.pod" + ], + "doc/man/man3/X509_cmp_time.3" => [ + "doc/man3/X509_cmp_time.pod" + ], + "doc/man/man3/X509_digest.3" => [ + "doc/man3/X509_digest.pod" + ], + "doc/man/man3/X509_dup.3" => [ + "doc/man3/X509_dup.pod" + ], + "doc/man/man3/X509_get0_distinguishing_id.3" => [ + "doc/man3/X509_get0_distinguishing_id.pod" + ], + "doc/man/man3/X509_get0_notBefore.3" => [ + "doc/man3/X509_get0_notBefore.pod" + ], + "doc/man/man3/X509_get0_signature.3" => [ + "doc/man3/X509_get0_signature.pod" + ], + "doc/man/man3/X509_get0_uids.3" => [ + "doc/man3/X509_get0_uids.pod" + ], + "doc/man/man3/X509_get_default_cert_file.3" => [ + "doc/man3/X509_get_default_cert_file.pod" + ], + "doc/man/man3/X509_get_extension_flags.3" => [ + "doc/man3/X509_get_extension_flags.pod" + ], + "doc/man/man3/X509_get_pubkey.3" => [ + "doc/man3/X509_get_pubkey.pod" + ], + "doc/man/man3/X509_get_serialNumber.3" => [ + "doc/man3/X509_get_serialNumber.pod" + ], + "doc/man/man3/X509_get_subject_name.3" => [ + "doc/man3/X509_get_subject_name.pod" + ], + "doc/man/man3/X509_get_version.3" => [ + "doc/man3/X509_get_version.pod" + ], + "doc/man/man3/X509_load_http.3" => [ + "doc/man3/X509_load_http.pod" + ], + "doc/man/man3/X509_new.3" => [ + "doc/man3/X509_new.pod" + ], + "doc/man/man3/X509_sign.3" => [ + "doc/man3/X509_sign.pod" + ], + "doc/man/man3/X509_verify.3" => [ + "doc/man3/X509_verify.pod" + ], + "doc/man/man3/X509_verify_cert.3" => [ + "doc/man3/X509_verify_cert.pod" + ], + "doc/man/man3/X509v3_get_ext_by_NID.3" => [ + "doc/man3/X509v3_get_ext_by_NID.pod" + ], + "doc/man/man3/b2i_PVK_bio_ex.3" => [ + "doc/man3/b2i_PVK_bio_ex.pod" + ], + "doc/man/man3/d2i_PKCS8PrivateKey_bio.3" => [ + "doc/man3/d2i_PKCS8PrivateKey_bio.pod" + ], + "doc/man/man3/d2i_PrivateKey.3" => [ + "doc/man3/d2i_PrivateKey.pod" + ], + "doc/man/man3/d2i_RSAPrivateKey.3" => [ + "doc/man3/d2i_RSAPrivateKey.pod" + ], + "doc/man/man3/d2i_SSL_SESSION.3" => [ + "doc/man3/d2i_SSL_SESSION.pod" + ], + "doc/man/man3/d2i_X509.3" => [ + "doc/man3/d2i_X509.pod" + ], + "doc/man/man3/i2d_CMS_bio_stream.3" => [ + "doc/man3/i2d_CMS_bio_stream.pod" + ], + "doc/man/man3/i2d_PKCS7_bio_stream.3" => [ + "doc/man3/i2d_PKCS7_bio_stream.pod" + ], + "doc/man/man3/i2d_re_X509_tbs.3" => [ + "doc/man3/i2d_re_X509_tbs.pod" + ], + "doc/man/man3/o2i_SCT_LIST.3" => [ + "doc/man3/o2i_SCT_LIST.pod" + ], + "doc/man/man3/s2i_ASN1_IA5STRING.3" => [ + "doc/man3/s2i_ASN1_IA5STRING.pod" + ], + "doc/man/man5/config.5" => [ + "doc/man5/config.pod" + ], + "doc/man/man5/fips_config.5" => [ + "doc/man5/fips_config.pod" + ], + "doc/man/man5/x509v3_config.5" => [ + "doc/man5/x509v3_config.pod" + ], + "doc/man/man7/EVP_ASYM_CIPHER-RSA.7" => [ + "doc/man7/EVP_ASYM_CIPHER-RSA.pod" + ], + "doc/man/man7/EVP_ASYM_CIPHER-SM2.7" => [ + "doc/man7/EVP_ASYM_CIPHER-SM2.pod" + ], + "doc/man/man7/EVP_CIPHER-AES.7" => [ + "doc/man7/EVP_CIPHER-AES.pod" + ], + "doc/man/man7/EVP_CIPHER-ARIA.7" => [ + "doc/man7/EVP_CIPHER-ARIA.pod" + ], + "doc/man/man7/EVP_CIPHER-BLOWFISH.7" => [ + "doc/man7/EVP_CIPHER-BLOWFISH.pod" + ], + "doc/man/man7/EVP_CIPHER-CAMELLIA.7" => [ + "doc/man7/EVP_CIPHER-CAMELLIA.pod" + ], + "doc/man/man7/EVP_CIPHER-CAST.7" => [ + "doc/man7/EVP_CIPHER-CAST.pod" + ], + "doc/man/man7/EVP_CIPHER-CHACHA.7" => [ + "doc/man7/EVP_CIPHER-CHACHA.pod" + ], + "doc/man/man7/EVP_CIPHER-DES.7" => [ + "doc/man7/EVP_CIPHER-DES.pod" + ], + "doc/man/man7/EVP_CIPHER-IDEA.7" => [ + "doc/man7/EVP_CIPHER-IDEA.pod" + ], + "doc/man/man7/EVP_CIPHER-NULL.7" => [ + "doc/man7/EVP_CIPHER-NULL.pod" + ], + "doc/man/man7/EVP_CIPHER-RC2.7" => [ + "doc/man7/EVP_CIPHER-RC2.pod" + ], + "doc/man/man7/EVP_CIPHER-RC4.7" => [ + "doc/man7/EVP_CIPHER-RC4.pod" + ], + "doc/man/man7/EVP_CIPHER-RC5.7" => [ + "doc/man7/EVP_CIPHER-RC5.pod" + ], + "doc/man/man7/EVP_CIPHER-SEED.7" => [ + "doc/man7/EVP_CIPHER-SEED.pod" + ], + "doc/man/man7/EVP_CIPHER-SM4.7" => [ + "doc/man7/EVP_CIPHER-SM4.pod" + ], + "doc/man/man7/EVP_KDF-ARGON2.7" => [ + "doc/man7/EVP_KDF-ARGON2.pod" + ], + "doc/man/man7/EVP_KDF-HKDF.7" => [ + "doc/man7/EVP_KDF-HKDF.pod" + ], + "doc/man/man7/EVP_KDF-HMAC-DRBG.7" => [ + "doc/man7/EVP_KDF-HMAC-DRBG.pod" + ], + "doc/man/man7/EVP_KDF-KB.7" => [ + "doc/man7/EVP_KDF-KB.pod" + ], + "doc/man/man7/EVP_KDF-KRB5KDF.7" => [ + "doc/man7/EVP_KDF-KRB5KDF.pod" + ], + "doc/man/man7/EVP_KDF-PBKDF1.7" => [ + "doc/man7/EVP_KDF-PBKDF1.pod" + ], + "doc/man/man7/EVP_KDF-PBKDF2.7" => [ + "doc/man7/EVP_KDF-PBKDF2.pod" + ], + "doc/man/man7/EVP_KDF-PKCS12KDF.7" => [ + "doc/man7/EVP_KDF-PKCS12KDF.pod" + ], + "doc/man/man7/EVP_KDF-PVKKDF.7" => [ + "doc/man7/EVP_KDF-PVKKDF.pod" + ], + "doc/man/man7/EVP_KDF-SCRYPT.7" => [ + "doc/man7/EVP_KDF-SCRYPT.pod" + ], + "doc/man/man7/EVP_KDF-SS.7" => [ + "doc/man7/EVP_KDF-SS.pod" + ], + "doc/man/man7/EVP_KDF-SSHKDF.7" => [ + "doc/man7/EVP_KDF-SSHKDF.pod" + ], + "doc/man/man7/EVP_KDF-TLS13_KDF.7" => [ + "doc/man7/EVP_KDF-TLS13_KDF.pod" + ], + "doc/man/man7/EVP_KDF-TLS1_PRF.7" => [ + "doc/man7/EVP_KDF-TLS1_PRF.pod" + ], + "doc/man/man7/EVP_KDF-X942-ASN1.7" => [ + "doc/man7/EVP_KDF-X942-ASN1.pod" + ], + "doc/man/man7/EVP_KDF-X942-CONCAT.7" => [ + "doc/man7/EVP_KDF-X942-CONCAT.pod" + ], + "doc/man/man7/EVP_KDF-X963.7" => [ + "doc/man7/EVP_KDF-X963.pod" + ], + "doc/man/man7/EVP_KEM-EC.7" => [ + "doc/man7/EVP_KEM-EC.pod" + ], + "doc/man/man7/EVP_KEM-ML-KEM.7" => [ + "doc/man7/EVP_KEM-ML-KEM.pod" + ], + "doc/man/man7/EVP_KEM-RSA.7" => [ + "doc/man7/EVP_KEM-RSA.pod" + ], + "doc/man/man7/EVP_KEM-X25519.7" => [ + "doc/man7/EVP_KEM-X25519.pod" + ], + "doc/man/man7/EVP_KEYEXCH-DH.7" => [ + "doc/man7/EVP_KEYEXCH-DH.pod" + ], + "doc/man/man7/EVP_KEYEXCH-ECDH.7" => [ + "doc/man7/EVP_KEYEXCH-ECDH.pod" + ], + "doc/man/man7/EVP_KEYEXCH-X25519.7" => [ + "doc/man7/EVP_KEYEXCH-X25519.pod" + ], + "doc/man/man7/EVP_MAC-BLAKE2.7" => [ + "doc/man7/EVP_MAC-BLAKE2.pod" + ], + "doc/man/man7/EVP_MAC-CMAC.7" => [ + "doc/man7/EVP_MAC-CMAC.pod" + ], + "doc/man/man7/EVP_MAC-GMAC.7" => [ + "doc/man7/EVP_MAC-GMAC.pod" + ], + "doc/man/man7/EVP_MAC-HMAC.7" => [ + "doc/man7/EVP_MAC-HMAC.pod" + ], + "doc/man/man7/EVP_MAC-KMAC.7" => [ + "doc/man7/EVP_MAC-KMAC.pod" + ], + "doc/man/man7/EVP_MAC-Poly1305.7" => [ + "doc/man7/EVP_MAC-Poly1305.pod" + ], + "doc/man/man7/EVP_MAC-Siphash.7" => [ + "doc/man7/EVP_MAC-Siphash.pod" + ], + "doc/man/man7/EVP_MD-BLAKE2.7" => [ + "doc/man7/EVP_MD-BLAKE2.pod" + ], + "doc/man/man7/EVP_MD-KECCAK.7" => [ + "doc/man7/EVP_MD-KECCAK.pod" + ], + "doc/man/man7/EVP_MD-MD2.7" => [ + "doc/man7/EVP_MD-MD2.pod" + ], + "doc/man/man7/EVP_MD-MD4.7" => [ + "doc/man7/EVP_MD-MD4.pod" + ], + "doc/man/man7/EVP_MD-MD5-SHA1.7" => [ + "doc/man7/EVP_MD-MD5-SHA1.pod" + ], + "doc/man/man7/EVP_MD-MD5.7" => [ + "doc/man7/EVP_MD-MD5.pod" + ], + "doc/man/man7/EVP_MD-MDC2.7" => [ + "doc/man7/EVP_MD-MDC2.pod" + ], + "doc/man/man7/EVP_MD-NULL.7" => [ + "doc/man7/EVP_MD-NULL.pod" + ], + "doc/man/man7/EVP_MD-RIPEMD160.7" => [ + "doc/man7/EVP_MD-RIPEMD160.pod" + ], + "doc/man/man7/EVP_MD-SHA1.7" => [ + "doc/man7/EVP_MD-SHA1.pod" + ], + "doc/man/man7/EVP_MD-SHA2.7" => [ + "doc/man7/EVP_MD-SHA2.pod" + ], + "doc/man/man7/EVP_MD-SHA3.7" => [ + "doc/man7/EVP_MD-SHA3.pod" + ], + "doc/man/man7/EVP_MD-SHAKE.7" => [ + "doc/man7/EVP_MD-SHAKE.pod" + ], + "doc/man/man7/EVP_MD-SM3.7" => [ + "doc/man7/EVP_MD-SM3.pod" + ], + "doc/man/man7/EVP_MD-WHIRLPOOL.7" => [ + "doc/man7/EVP_MD-WHIRLPOOL.pod" + ], + "doc/man/man7/EVP_MD-common.7" => [ + "doc/man7/EVP_MD-common.pod" + ], + "doc/man/man7/EVP_PKEY-DH.7" => [ + "doc/man7/EVP_PKEY-DH.pod" + ], + "doc/man/man7/EVP_PKEY-DSA.7" => [ + "doc/man7/EVP_PKEY-DSA.pod" + ], + "doc/man/man7/EVP_PKEY-EC.7" => [ + "doc/man7/EVP_PKEY-EC.pod" + ], + "doc/man/man7/EVP_PKEY-FFC.7" => [ + "doc/man7/EVP_PKEY-FFC.pod" + ], + "doc/man/man7/EVP_PKEY-HMAC.7" => [ + "doc/man7/EVP_PKEY-HMAC.pod" + ], + "doc/man/man7/EVP_PKEY-ML-DSA.7" => [ + "doc/man7/EVP_PKEY-ML-DSA.pod" + ], + "doc/man/man7/EVP_PKEY-ML-KEM.7" => [ + "doc/man7/EVP_PKEY-ML-KEM.pod" + ], + "doc/man/man7/EVP_PKEY-RSA.7" => [ + "doc/man7/EVP_PKEY-RSA.pod" + ], + "doc/man/man7/EVP_PKEY-SLH-DSA.7" => [ + "doc/man7/EVP_PKEY-SLH-DSA.pod" + ], + "doc/man/man7/EVP_PKEY-SM2.7" => [ + "doc/man7/EVP_PKEY-SM2.pod" + ], + "doc/man/man7/EVP_PKEY-X25519.7" => [ + "doc/man7/EVP_PKEY-X25519.pod" + ], + "doc/man/man7/EVP_RAND-CRNG-TEST.7" => [ + "doc/man7/EVP_RAND-CRNG-TEST.pod" + ], + "doc/man/man7/EVP_RAND-CTR-DRBG.7" => [ + "doc/man7/EVP_RAND-CTR-DRBG.pod" + ], + "doc/man/man7/EVP_RAND-HASH-DRBG.7" => [ + "doc/man7/EVP_RAND-HASH-DRBG.pod" + ], + "doc/man/man7/EVP_RAND-HMAC-DRBG.7" => [ + "doc/man7/EVP_RAND-HMAC-DRBG.pod" + ], + "doc/man/man7/EVP_RAND-JITTER.7" => [ + "doc/man7/EVP_RAND-JITTER.pod" + ], + "doc/man/man7/EVP_RAND-SEED-SRC.7" => [ + "doc/man7/EVP_RAND-SEED-SRC.pod" + ], + "doc/man/man7/EVP_RAND-TEST-RAND.7" => [ + "doc/man7/EVP_RAND-TEST-RAND.pod" + ], + "doc/man/man7/EVP_RAND.7" => [ + "doc/man7/EVP_RAND.pod" + ], + "doc/man/man7/EVP_SIGNATURE-DSA.7" => [ + "doc/man7/EVP_SIGNATURE-DSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-ECDSA.7" => [ + "doc/man7/EVP_SIGNATURE-ECDSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-ED25519.7" => [ + "doc/man7/EVP_SIGNATURE-ED25519.pod" + ], + "doc/man/man7/EVP_SIGNATURE-HMAC.7" => [ + "doc/man7/EVP_SIGNATURE-HMAC.pod" + ], + "doc/man/man7/EVP_SIGNATURE-ML-DSA.7" => [ + "doc/man7/EVP_SIGNATURE-ML-DSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-RSA.7" => [ + "doc/man7/EVP_SIGNATURE-RSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-SLH-DSA.7" => [ + "doc/man7/EVP_SIGNATURE-SLH-DSA.pod" + ], + "doc/man/man7/OSSL_PROVIDER-FIPS.7" => [ + "doc/man7/OSSL_PROVIDER-FIPS.pod" + ], + "doc/man/man7/OSSL_PROVIDER-base.7" => [ + "doc/man7/OSSL_PROVIDER-base.pod" + ], + "doc/man/man7/OSSL_PROVIDER-default.7" => [ + "doc/man7/OSSL_PROVIDER-default.pod" + ], + "doc/man/man7/OSSL_PROVIDER-legacy.7" => [ + "doc/man7/OSSL_PROVIDER-legacy.pod" + ], + "doc/man/man7/OSSL_PROVIDER-null.7" => [ + "doc/man7/OSSL_PROVIDER-null.pod" + ], + "doc/man/man7/OSSL_STORE-winstore.7" => [ + "doc/man7/OSSL_STORE-winstore.pod" + ], + "doc/man/man7/RAND.7" => [ + "doc/man7/RAND.pod" + ], + "doc/man/man7/RSA-PSS.7" => [ + "doc/man7/RSA-PSS.pod" + ], + "doc/man/man7/X25519.7" => [ + "doc/man7/X25519.pod" + ], + "doc/man/man7/bio.7" => [ + "doc/man7/bio.pod" + ], + "doc/man/man7/ct.7" => [ + "doc/man7/ct.pod" + ], + "doc/man/man7/des_modes.7" => [ + "doc/man7/des_modes.pod" + ], + "doc/man/man7/evp.7" => [ + "doc/man7/evp.pod" + ], + "doc/man/man7/fips_module.7" => [ + "doc/man7/fips_module.pod" + ], + "doc/man/man7/life_cycle-cipher.7" => [ + "doc/man7/life_cycle-cipher.pod" + ], + "doc/man/man7/life_cycle-digest.7" => [ + "doc/man7/life_cycle-digest.pod" + ], + "doc/man/man7/life_cycle-kdf.7" => [ + "doc/man7/life_cycle-kdf.pod" + ], + "doc/man/man7/life_cycle-mac.7" => [ + "doc/man7/life_cycle-mac.pod" + ], + "doc/man/man7/life_cycle-pkey.7" => [ + "doc/man7/life_cycle-pkey.pod" + ], + "doc/man/man7/life_cycle-rand.7" => [ + "doc/man7/life_cycle-rand.pod" + ], + "doc/man/man7/openssl-core.h.7" => [ + "doc/man7/openssl-core.h.pod" + ], + "doc/man/man7/openssl-core_dispatch.h.7" => [ + "doc/man7/openssl-core_dispatch.h.pod" + ], + "doc/man/man7/openssl-core_names.h.7" => [ + "doc/man7/openssl-core_names.h.pod" + ], + "doc/man/man7/openssl-env.7" => [ + "doc/man7/openssl-env.pod" + ], + "doc/man/man7/openssl-glossary.7" => [ + "doc/man7/openssl-glossary.pod" + ], + "doc/man/man7/openssl-qlog.7" => [ + "doc/man7/openssl-qlog.pod" + ], + "doc/man/man7/openssl-quic-concurrency.7" => [ + "doc/man7/openssl-quic-concurrency.pod" + ], + "doc/man/man7/openssl-quic.7" => [ + "doc/man7/openssl-quic.pod" + ], + "doc/man/man7/openssl-threads.7" => [ + "doc/man7/openssl-threads.pod" + ], + "doc/man/man7/openssl_user_macros.7" => [ + "doc/man7/openssl_user_macros.pod" + ], + "doc/man/man7/ossl-guide-introduction.7" => [ + "doc/man7/ossl-guide-introduction.pod" + ], + "doc/man/man7/ossl-guide-libcrypto-introduction.7" => [ + "doc/man7/ossl-guide-libcrypto-introduction.pod" + ], + "doc/man/man7/ossl-guide-libraries-introduction.7" => [ + "doc/man7/ossl-guide-libraries-introduction.pod" + ], + "doc/man/man7/ossl-guide-libssl-introduction.7" => [ + "doc/man7/ossl-guide-libssl-introduction.pod" + ], + "doc/man/man7/ossl-guide-migration.7" => [ + "doc/man7/ossl-guide-migration.pod" + ], + "doc/man/man7/ossl-guide-quic-client-block.7" => [ + "doc/man7/ossl-guide-quic-client-block.pod" + ], + "doc/man/man7/ossl-guide-quic-client-non-block.7" => [ + "doc/man7/ossl-guide-quic-client-non-block.pod" + ], + "doc/man/man7/ossl-guide-quic-introduction.7" => [ + "doc/man7/ossl-guide-quic-introduction.pod" + ], + "doc/man/man7/ossl-guide-quic-multi-stream.7" => [ + "doc/man7/ossl-guide-quic-multi-stream.pod" + ], + "doc/man/man7/ossl-guide-quic-server-block.7" => [ + "doc/man7/ossl-guide-quic-server-block.pod" + ], + "doc/man/man7/ossl-guide-quic-server-non-block.7" => [ + "doc/man7/ossl-guide-quic-server-non-block.pod" + ], + "doc/man/man7/ossl-guide-tls-client-block.7" => [ + "doc/man7/ossl-guide-tls-client-block.pod" + ], + "doc/man/man7/ossl-guide-tls-client-non-block.7" => [ + "doc/man7/ossl-guide-tls-client-non-block.pod" + ], + "doc/man/man7/ossl-guide-tls-introduction.7" => [ + "doc/man7/ossl-guide-tls-introduction.pod" + ], + "doc/man/man7/ossl-guide-tls-server-block.7" => [ + "doc/man7/ossl-guide-tls-server-block.pod" + ], + "doc/man/man7/ossl_store-file.7" => [ + "doc/man7/ossl_store-file.pod" + ], + "doc/man/man7/ossl_store.7" => [ + "doc/man7/ossl_store.pod" + ], + "doc/man/man7/passphrase-encoding.7" => [ + "doc/man7/passphrase-encoding.pod" + ], + "doc/man/man7/property.7" => [ + "doc/man7/property.pod" + ], + "doc/man/man7/provider-asym_cipher.7" => [ + "doc/man7/provider-asym_cipher.pod" + ], + "doc/man/man7/provider-base.7" => [ + "doc/man7/provider-base.pod" + ], + "doc/man/man7/provider-cipher.7" => [ + "doc/man7/provider-cipher.pod" + ], + "doc/man/man7/provider-decoder.7" => [ + "doc/man7/provider-decoder.pod" + ], + "doc/man/man7/provider-digest.7" => [ + "doc/man7/provider-digest.pod" + ], + "doc/man/man7/provider-encoder.7" => [ + "doc/man7/provider-encoder.pod" + ], + "doc/man/man7/provider-kdf.7" => [ + "doc/man7/provider-kdf.pod" + ], + "doc/man/man7/provider-kem.7" => [ + "doc/man7/provider-kem.pod" + ], + "doc/man/man7/provider-keyexch.7" => [ + "doc/man7/provider-keyexch.pod" + ], + "doc/man/man7/provider-keymgmt.7" => [ + "doc/man7/provider-keymgmt.pod" + ], + "doc/man/man7/provider-mac.7" => [ + "doc/man7/provider-mac.pod" + ], + "doc/man/man7/provider-object.7" => [ + "doc/man7/provider-object.pod" + ], + "doc/man/man7/provider-rand.7" => [ + "doc/man7/provider-rand.pod" + ], + "doc/man/man7/provider-signature.7" => [ + "doc/man7/provider-signature.pod" + ], + "doc/man/man7/provider-skeymgmt.7" => [ + "doc/man7/provider-skeymgmt.pod" + ], + "doc/man/man7/provider-storemgmt.7" => [ + "doc/man7/provider-storemgmt.pod" + ], + "doc/man/man7/provider.7" => [ + "doc/man7/provider.pod" + ], + "doc/man/man7/proxy-certificates.7" => [ + "doc/man7/proxy-certificates.pod" + ], + "doc/man/man7/x509.7" => [ + "doc/man7/x509.pod" + ], + "doc/man1/openssl-asn1parse.pod" => [ + "doc/man1/openssl-asn1parse.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-ca.pod" => [ + "doc/man1/openssl-ca.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-ciphers.pod" => [ + "doc/man1/openssl-ciphers.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-cmds.pod" => [ + "doc/man1/openssl-cmds.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-cmp.pod" => [ + "doc/man1/openssl-cmp.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-cms.pod" => [ + "doc/man1/openssl-cms.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-crl.pod" => [ + "doc/man1/openssl-crl.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-crl2pkcs7.pod" => [ + "doc/man1/openssl-crl2pkcs7.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-dgst.pod" => [ + "doc/man1/openssl-dgst.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-dhparam.pod" => [ + "doc/man1/openssl-dhparam.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-dsa.pod" => [ + "doc/man1/openssl-dsa.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-dsaparam.pod" => [ + "doc/man1/openssl-dsaparam.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-ec.pod" => [ + "doc/man1/openssl-ec.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-ecparam.pod" => [ + "doc/man1/openssl-ecparam.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-enc.pod" => [ + "doc/man1/openssl-enc.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-engine.pod" => [ + "doc/man1/openssl-engine.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-errstr.pod" => [ + "doc/man1/openssl-errstr.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-fipsinstall.pod" => [ + "doc/man1/openssl-fipsinstall.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-gendsa.pod" => [ + "doc/man1/openssl-gendsa.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-genpkey.pod" => [ + "doc/man1/openssl-genpkey.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-genrsa.pod" => [ + "doc/man1/openssl-genrsa.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-info.pod" => [ + "doc/man1/openssl-info.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-kdf.pod" => [ + "doc/man1/openssl-kdf.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-list.pod" => [ + "doc/man1/openssl-list.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-mac.pod" => [ + "doc/man1/openssl-mac.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-nseq.pod" => [ + "doc/man1/openssl-nseq.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-ocsp.pod" => [ + "doc/man1/openssl-ocsp.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-passwd.pod" => [ + "doc/man1/openssl-passwd.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-pkcs12.pod" => [ + "doc/man1/openssl-pkcs12.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-pkcs7.pod" => [ + "doc/man1/openssl-pkcs7.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-pkcs8.pod" => [ + "doc/man1/openssl-pkcs8.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-pkey.pod" => [ + "doc/man1/openssl-pkey.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-pkeyparam.pod" => [ + "doc/man1/openssl-pkeyparam.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-pkeyutl.pod" => [ + "doc/man1/openssl-pkeyutl.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-prime.pod" => [ + "doc/man1/openssl-prime.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-rand.pod" => [ + "doc/man1/openssl-rand.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-rehash.pod" => [ + "doc/man1/openssl-rehash.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-req.pod" => [ + "doc/man1/openssl-req.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-rsa.pod" => [ + "doc/man1/openssl-rsa.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-rsautl.pod" => [ + "doc/man1/openssl-rsautl.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-s_client.pod" => [ + "doc/man1/openssl-s_client.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-s_server.pod" => [ + "doc/man1/openssl-s_server.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-s_time.pod" => [ + "doc/man1/openssl-s_time.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-sess_id.pod" => [ + "doc/man1/openssl-sess_id.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-skeyutl.pod" => [ + "doc/man1/openssl-skeyutl.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-smime.pod" => [ + "doc/man1/openssl-smime.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-speed.pod" => [ + "doc/man1/openssl-speed.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-spkac.pod" => [ + "doc/man1/openssl-spkac.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-srp.pod" => [ + "doc/man1/openssl-srp.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-storeutl.pod" => [ + "doc/man1/openssl-storeutl.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-ts.pod" => [ + "doc/man1/openssl-ts.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-verify.pod" => [ + "doc/man1/openssl-verify.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-version.pod" => [ + "doc/man1/openssl-version.pod.in", + "doc/perlvars.pm" + ], + "doc/man1/openssl-x509.pod" => [ + "doc/man1/openssl-x509.pod.in", + "doc/perlvars.pm" + ], + "doc/man7/openssl_user_macros.pod" => [ + "doc/man7/openssl_user_macros.pod.in" + ], + "exporters/OpenSSLConfig.cmake" => [ + "installdata.pm" + ], + "exporters/OpenSSLConfigVersion.cmake" => [ + "exporters/OpenSSLConfig.cmake", + "installdata.pm" + ], + "exporters/libcrypto.pc" => [ + "installdata.pm" + ], + "exporters/libssl.pc" => [ + "installdata.pm" + ], + "exporters/openssl.pc" => [ + "exporters/libcrypto.pc", + "exporters/libssl.pc", + "installdata.pm" + ], + "include/internal/param_names.h" => [ + "util/perl|OpenSSL/paramnames.pm" + ], + "include/openssl/core_names.h" => [ + "util/perl|OpenSSL/paramnames.pm" + ], + "libcrypto.ld" => [ + "configdata.pm", + "util/perl/OpenSSL/Ordinals.pm" + ], + "libcrypto.pc" => [ + "builddata.pm" + ], + "libssl" => [ + "libcrypto" + ], + "libssl.ld" => [ + "configdata.pm", + "util/perl/OpenSSL/Ordinals.pm" + ], + "libssl.pc" => [ + "builddata.pm" + ], + "openssl.pc" => [ + "builddata.pm", + "libcrypto.pc", + "libssl.pc" + ], + "providers/common/der/der_digests_gen.c" => [ + "providers/common/der/DIGESTS.asn1", + "providers/common/der/NIST.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_dsa_gen.c" => [ + "providers/common/der/DSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_ec_gen.c" => [ + "providers/common/der/EC.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_ecx_gen.c" => [ + "providers/common/der/ECX.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_ml_dsa_gen.c" => [ + "providers/common/der/ML_DSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_rsa_gen.c" => [ + "providers/common/der/NIST.asn1", + "providers/common/der/RSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_slh_dsa_gen.c" => [ + "providers/common/der/SLH_DSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_sm2_gen.c" => [ + "providers/common/der/SM2.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/der/der_wrap_gen.c" => [ + "providers/common/der/oids_to_c.pm", + "providers/common/der/wrap.asn1" + ], + "providers/common/der/libcommon-lib-der_digests_gen.o" => [ + "providers/common/include/prov/der_digests.h" + ], + "providers/common/der/libcommon-lib-der_dsa_gen.o" => [ + "providers/common/include/prov/der_dsa.h" + ], + "providers/common/der/libcommon-lib-der_dsa_key.o" => [ + "providers/common/include/prov/der_digests.h", + "providers/common/include/prov/der_dsa.h" + ], + "providers/common/der/libcommon-lib-der_dsa_sig.o" => [ + "providers/common/include/prov/der_digests.h", + "providers/common/include/prov/der_dsa.h" + ], + "providers/common/der/libcommon-lib-der_ec_gen.o" => [ + "providers/common/include/prov/der_ec.h" + ], + "providers/common/der/libcommon-lib-der_ec_key.o" => [ + "providers/common/include/prov/der_digests.h", + "providers/common/include/prov/der_ec.h" + ], + "providers/common/der/libcommon-lib-der_ec_sig.o" => [ + "providers/common/include/prov/der_digests.h", + "providers/common/include/prov/der_ec.h" + ], + "providers/common/der/libcommon-lib-der_ecx_gen.o" => [ + "providers/common/include/prov/der_ecx.h" + ], + "providers/common/der/libcommon-lib-der_ecx_key.o" => [ + "providers/common/include/prov/der_ecx.h" + ], + "providers/common/der/libcommon-lib-der_ml_dsa_gen.o" => [ + "providers/common/include/prov/der_ml_dsa.h" + ], + "providers/common/der/libcommon-lib-der_ml_dsa_key.o" => [ + "providers/common/include/prov/der_ml_dsa.h" + ], + "providers/common/der/libcommon-lib-der_rsa_gen.o" => [ + "providers/common/include/prov/der_rsa.h" + ], + "providers/common/der/libcommon-lib-der_rsa_key.o" => [ + "providers/common/include/prov/der_digests.h", + "providers/common/include/prov/der_rsa.h" + ], + "providers/common/der/libcommon-lib-der_slh_dsa_gen.o" => [ + "providers/common/include/prov/der_slh_dsa.h" + ], + "providers/common/der/libcommon-lib-der_slh_dsa_key.o" => [ + "providers/common/include/prov/der_slh_dsa.h" + ], + "providers/common/der/libcommon-lib-der_wrap_gen.o" => [ + "providers/common/include/prov/der_wrap.h" + ], + "providers/common/der/libdefault-lib-der_rsa_sig.o" => [ + "providers/common/include/prov/der_digests.h", + "providers/common/include/prov/der_rsa.h" + ], + "providers/common/der/libdefault-lib-der_sm2_gen.o" => [ + "providers/common/include/prov/der_sm2.h" + ], + "providers/common/der/libdefault-lib-der_sm2_key.o" => [ + "providers/common/include/prov/der_ec.h", + "providers/common/include/prov/der_sm2.h" + ], + "providers/common/der/libdefault-lib-der_sm2_sig.o" => [ + "providers/common/include/prov/der_ec.h", + "providers/common/include/prov/der_sm2.h" + ], + "providers/common/der/libfips-lib-der_rsa_sig.o" => [ + "providers/common/include/prov/der_digests.h", + "providers/common/include/prov/der_rsa.h" + ], + "providers/common/include/prov/der_digests.h" => [ + "providers/common/der/DIGESTS.asn1", + "providers/common/der/NIST.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_dsa.h" => [ + "providers/common/der/DSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_ec.h" => [ + "providers/common/der/EC.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_ecx.h" => [ + "providers/common/der/ECX.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_ml_dsa.h" => [ + "providers/common/der/ML_DSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_rsa.h" => [ + "providers/common/der/NIST.asn1", + "providers/common/der/RSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_slh_dsa.h" => [ + "providers/common/der/SLH_DSA.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_sm2.h" => [ + "providers/common/der/SM2.asn1", + "providers/common/der/oids_to_c.pm" + ], + "providers/common/include/prov/der_wrap.h" => [ + "providers/common/der/oids_to_c.pm", + "providers/common/der/wrap.asn1" + ], + "providers/fips" => [ + "providers/libfips.a" + ], + "providers/fipsmodule.cnf" => [ + "providers/fips" + ], + "providers/implementations/encode_decode/libdefault-lib-encode_key2any.o" => [ + "providers/common/include/prov/der_rsa.h" + ], + "providers/implementations/kdfs/libdefault-lib-x942kdf.o" => [ + "providers/common/include/prov/der_wrap.h" + ], + "providers/implementations/kdfs/libfips-lib-x942kdf.o" => [ + "providers/common/include/prov/der_wrap.h" + ], + "providers/implementations/signature/libdefault-lib-dsa_sig.o" => [ + "providers/common/include/prov/der_dsa.h" + ], + "providers/implementations/signature/libdefault-lib-ecdsa_sig.o" => [ + "providers/common/include/prov/der_ec.h" + ], + "providers/implementations/signature/libdefault-lib-eddsa_sig.o" => [ + "providers/common/include/prov/der_ecx.h" + ], + "providers/implementations/signature/libdefault-lib-ml_dsa_sig.o" => [ + "providers/common/include/prov/der_ml_dsa.h" + ], + "providers/implementations/signature/libdefault-lib-rsa_sig.o" => [ + "providers/common/include/prov/der_rsa.h" + ], + "providers/implementations/signature/libdefault-lib-slh_dsa_sig.o" => [ + "providers/common/include/prov/der_slh_dsa.h" + ], + "providers/implementations/signature/libdefault-lib-sm2_sig.o" => [ + "providers/common/include/prov/der_sm2.h" + ], + "providers/implementations/signature/libfips-lib-dsa_sig.o" => [ + "providers/common/include/prov/der_dsa.h" + ], + "providers/implementations/signature/libfips-lib-ecdsa_sig.o" => [ + "providers/common/include/prov/der_ec.h" + ], + "providers/implementations/signature/libfips-lib-eddsa_sig.o" => [ + "providers/common/include/prov/der_ecx.h" + ], + "providers/implementations/signature/libfips-lib-ml_dsa_sig.o" => [ + "providers/common/include/prov/der_ml_dsa.h" + ], + "providers/implementations/signature/libfips-lib-rsa_sig.o" => [ + "providers/common/include/prov/der_rsa.h" + ], + "providers/implementations/signature/libfips-lib-slh_dsa_sig.o" => [ + "providers/common/include/prov/der_slh_dsa.h" + ], + "providers/legacy" => [ + "libcrypto", + "providers/liblegacy.a" + ], + "providers/libcommon.a" => [ + "libcrypto" + ], + "providers/libdefault.a" => [ + "providers/libcommon.a" + ], + "providers/liblegacy.a" => [ + "providers/libcommon.a" + ], + "util/wrap.pl" => [ + "configdata.pm" + ] + }, + "dirinfo" => { + "apps" => { + "products" => { + "bin" => [ + "apps/openssl" + ], + "script" => [ + "apps/CA.pl", + "apps/tsget.pl" + ] + } + }, + "apps/lib" => { + "deps" => [ + "apps/lib/openssl-bin-cmp_mock_srv.o", + "apps/lib/libapps-lib-app_libctx.o", + "apps/lib/libapps-lib-app_params.o", + "apps/lib/libapps-lib-app_provider.o", + "apps/lib/libapps-lib-app_rand.o", + "apps/lib/libapps-lib-app_x509.o", + "apps/lib/libapps-lib-apps.o", + "apps/lib/libapps-lib-apps_opt_printf.o", + "apps/lib/libapps-lib-apps_ui.o", + "apps/lib/libapps-lib-columns.o", + "apps/lib/libapps-lib-engine.o", + "apps/lib/libapps-lib-engine_loader.o", + "apps/lib/libapps-lib-fmt.o", + "apps/lib/libapps-lib-http_server.o", + "apps/lib/libapps-lib-log.o", + "apps/lib/libapps-lib-names.o", + "apps/lib/libapps-lib-opt.o", + "apps/lib/libapps-lib-s_cb.o", + "apps/lib/libapps-lib-s_socket.o", + "apps/lib/libapps-lib-tlssrp_depr.o" + ], + "products" => { + "bin" => [ + "apps/openssl" + ], + "lib" => [ + "apps/libapps.a" + ] + } + }, + "crypto" => { + "deps" => [ + "crypto/libcrypto-lib-asn1_dsa.o", + "crypto/libcrypto-lib-bsearch.o", + "crypto/libcrypto-lib-comp_methods.o", + "crypto/libcrypto-lib-context.o", + "crypto/libcrypto-lib-core_algorithm.o", + "crypto/libcrypto-lib-core_fetch.o", + "crypto/libcrypto-lib-core_namemap.o", + "crypto/libcrypto-lib-cpt_err.o", + "crypto/libcrypto-lib-cpuid.o", + "crypto/libcrypto-lib-cryptlib.o", + "crypto/libcrypto-lib-ctype.o", + "crypto/libcrypto-lib-cversion.o", + "crypto/libcrypto-lib-defaults.o", + "crypto/libcrypto-lib-der_writer.o", + "crypto/libcrypto-lib-deterministic_nonce.o", + "crypto/libcrypto-lib-ebcdic.o", + "crypto/libcrypto-lib-ex_data.o", + "crypto/libcrypto-lib-getenv.o", + "crypto/libcrypto-lib-indicator_core.o", + "crypto/libcrypto-lib-info.o", + "crypto/libcrypto-lib-init.o", + "crypto/libcrypto-lib-initthread.o", + "crypto/libcrypto-lib-mem.o", + "crypto/libcrypto-lib-mem_sec.o", + "crypto/libcrypto-lib-o_dir.o", + "crypto/libcrypto-lib-o_fopen.o", + "crypto/libcrypto-lib-o_init.o", + "crypto/libcrypto-lib-o_str.o", + "crypto/libcrypto-lib-o_time.o", + "crypto/libcrypto-lib-packet.o", + "crypto/libcrypto-lib-param_build.o", + "crypto/libcrypto-lib-param_build_set.o", + "crypto/libcrypto-lib-params.o", + "crypto/libcrypto-lib-params_dup.o", + "crypto/libcrypto-lib-params_from_text.o", + "crypto/libcrypto-lib-params_idx.o", + "crypto/libcrypto-lib-passphrase.o", + "crypto/libcrypto-lib-provider.o", + "crypto/libcrypto-lib-provider_child.o", + "crypto/libcrypto-lib-provider_conf.o", + "crypto/libcrypto-lib-provider_core.o", + "crypto/libcrypto-lib-provider_predefined.o", + "crypto/libcrypto-lib-punycode.o", + "crypto/libcrypto-lib-quic_vlint.o", + "crypto/libcrypto-lib-riscv64cpuid.o", + "crypto/libcrypto-lib-riscvcap.o", + "crypto/libcrypto-lib-self_test_core.o", + "crypto/libcrypto-lib-sleep.o", + "crypto/libcrypto-lib-sparse_array.o", + "crypto/libcrypto-lib-ssl_err.o", + "crypto/libcrypto-lib-threads_lib.o", + "crypto/libcrypto-lib-threads_none.o", + "crypto/libcrypto-lib-threads_pthread.o", + "crypto/libcrypto-lib-threads_win.o", + "crypto/libcrypto-lib-time.o", + "crypto/libcrypto-lib-trace.o", + "crypto/libcrypto-lib-uid.o", + "crypto/libfips-lib-asn1_dsa.o", + "crypto/libfips-lib-bsearch.o", + "crypto/libfips-lib-context.o", + "crypto/libfips-lib-core_algorithm.o", + "crypto/libfips-lib-core_fetch.o", + "crypto/libfips-lib-core_namemap.o", + "crypto/libfips-lib-cpuid.o", + "crypto/libfips-lib-cryptlib.o", + "crypto/libfips-lib-ctype.o", + "crypto/libfips-lib-der_writer.o", + "crypto/libfips-lib-ex_data.o", + "crypto/libfips-lib-initthread.o", + "crypto/libfips-lib-o_str.o", + "crypto/libfips-lib-packet.o", + "crypto/libfips-lib-param_build.o", + "crypto/libfips-lib-param_build_set.o", + "crypto/libfips-lib-params.o", + "crypto/libfips-lib-params_dup.o", + "crypto/libfips-lib-params_from_text.o", + "crypto/libfips-lib-params_idx.o", + "crypto/libfips-lib-provider_core.o", + "crypto/libfips-lib-provider_predefined.o", + "crypto/libfips-lib-riscv64cpuid.o", + "crypto/libfips-lib-riscvcap.o", + "crypto/libfips-lib-self_test_core.o", + "crypto/libfips-lib-sparse_array.o", + "crypto/libfips-lib-threads_lib.o", + "crypto/libfips-lib-threads_none.o", + "crypto/libfips-lib-threads_pthread.o", + "crypto/libfips-lib-threads_win.o", + "crypto/libfips-lib-time.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/aes" => { + "deps" => [ + "crypto/aes/libcrypto-lib-aes-riscv64-zkn.o", + "crypto/aes/libcrypto-lib-aes-riscv64-zvbb-zvkg-zvkned.o", + "crypto/aes/libcrypto-lib-aes-riscv64-zvkb-zvkned.o", + "crypto/aes/libcrypto-lib-aes-riscv64-zvkned.o", + "crypto/aes/libcrypto-lib-aes-riscv64.o", + "crypto/aes/libcrypto-lib-aes_cbc.o", + "crypto/aes/libcrypto-lib-aes_cfb.o", + "crypto/aes/libcrypto-lib-aes_ecb.o", + "crypto/aes/libcrypto-lib-aes_ige.o", + "crypto/aes/libcrypto-lib-aes_misc.o", + "crypto/aes/libcrypto-lib-aes_ofb.o", + "crypto/aes/libcrypto-lib-aes_wrap.o", + "crypto/aes/libfips-lib-aes-riscv64-zkn.o", + "crypto/aes/libfips-lib-aes-riscv64-zvbb-zvkg-zvkned.o", + "crypto/aes/libfips-lib-aes-riscv64-zvkb-zvkned.o", + "crypto/aes/libfips-lib-aes-riscv64-zvkned.o", + "crypto/aes/libfips-lib-aes-riscv64.o", + "crypto/aes/libfips-lib-aes_cbc.o", + "crypto/aes/libfips-lib-aes_ecb.o", + "crypto/aes/libfips-lib-aes_misc.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/aria" => { + "deps" => [ + "crypto/aria/libcrypto-lib-aria.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/asn1" => { + "deps" => [ + "crypto/asn1/libcrypto-lib-a_bitstr.o", + "crypto/asn1/libcrypto-lib-a_d2i_fp.o", + "crypto/asn1/libcrypto-lib-a_digest.o", + "crypto/asn1/libcrypto-lib-a_dup.o", + "crypto/asn1/libcrypto-lib-a_gentm.o", + "crypto/asn1/libcrypto-lib-a_i2d_fp.o", + "crypto/asn1/libcrypto-lib-a_int.o", + "crypto/asn1/libcrypto-lib-a_mbstr.o", + "crypto/asn1/libcrypto-lib-a_object.o", + "crypto/asn1/libcrypto-lib-a_octet.o", + "crypto/asn1/libcrypto-lib-a_print.o", + "crypto/asn1/libcrypto-lib-a_sign.o", + "crypto/asn1/libcrypto-lib-a_strex.o", + "crypto/asn1/libcrypto-lib-a_strnid.o", + "crypto/asn1/libcrypto-lib-a_time.o", + "crypto/asn1/libcrypto-lib-a_type.o", + "crypto/asn1/libcrypto-lib-a_utctm.o", + "crypto/asn1/libcrypto-lib-a_utf8.o", + "crypto/asn1/libcrypto-lib-a_verify.o", + "crypto/asn1/libcrypto-lib-ameth_lib.o", + "crypto/asn1/libcrypto-lib-asn1_err.o", + "crypto/asn1/libcrypto-lib-asn1_gen.o", + "crypto/asn1/libcrypto-lib-asn1_item_list.o", + "crypto/asn1/libcrypto-lib-asn1_lib.o", + "crypto/asn1/libcrypto-lib-asn1_parse.o", + "crypto/asn1/libcrypto-lib-asn_mime.o", + "crypto/asn1/libcrypto-lib-asn_moid.o", + "crypto/asn1/libcrypto-lib-asn_mstbl.o", + "crypto/asn1/libcrypto-lib-asn_pack.o", + "crypto/asn1/libcrypto-lib-bio_asn1.o", + "crypto/asn1/libcrypto-lib-bio_ndef.o", + "crypto/asn1/libcrypto-lib-d2i_param.o", + "crypto/asn1/libcrypto-lib-d2i_pr.o", + "crypto/asn1/libcrypto-lib-d2i_pu.o", + "crypto/asn1/libcrypto-lib-evp_asn1.o", + "crypto/asn1/libcrypto-lib-f_int.o", + "crypto/asn1/libcrypto-lib-f_string.o", + "crypto/asn1/libcrypto-lib-i2d_evp.o", + "crypto/asn1/libcrypto-lib-n_pkey.o", + "crypto/asn1/libcrypto-lib-nsseq.o", + "crypto/asn1/libcrypto-lib-p5_pbe.o", + "crypto/asn1/libcrypto-lib-p5_pbev2.o", + "crypto/asn1/libcrypto-lib-p5_scrypt.o", + "crypto/asn1/libcrypto-lib-p8_pkey.o", + "crypto/asn1/libcrypto-lib-t_bitst.o", + "crypto/asn1/libcrypto-lib-t_pkey.o", + "crypto/asn1/libcrypto-lib-t_spki.o", + "crypto/asn1/libcrypto-lib-tasn_dec.o", + "crypto/asn1/libcrypto-lib-tasn_enc.o", + "crypto/asn1/libcrypto-lib-tasn_fre.o", + "crypto/asn1/libcrypto-lib-tasn_new.o", + "crypto/asn1/libcrypto-lib-tasn_prn.o", + "crypto/asn1/libcrypto-lib-tasn_scn.o", + "crypto/asn1/libcrypto-lib-tasn_typ.o", + "crypto/asn1/libcrypto-lib-tasn_utl.o", + "crypto/asn1/libcrypto-lib-x_algor.o", + "crypto/asn1/libcrypto-lib-x_bignum.o", + "crypto/asn1/libcrypto-lib-x_info.o", + "crypto/asn1/libcrypto-lib-x_int64.o", + "crypto/asn1/libcrypto-lib-x_long.o", + "crypto/asn1/libcrypto-lib-x_pkey.o", + "crypto/asn1/libcrypto-lib-x_sig.o", + "crypto/asn1/libcrypto-lib-x_spki.o", + "crypto/asn1/libcrypto-lib-x_val.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/async" => { + "deps" => [ + "crypto/async/libcrypto-lib-async.o", + "crypto/async/libcrypto-lib-async_err.o", + "crypto/async/libcrypto-lib-async_wait.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/async/arch" => { + "deps" => [ + "crypto/async/arch/libcrypto-lib-async_null.o", + "crypto/async/arch/libcrypto-lib-async_posix.o", + "crypto/async/arch/libcrypto-lib-async_win.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/bf" => { + "deps" => [ + "crypto/bf/libcrypto-lib-bf_cfb64.o", + "crypto/bf/libcrypto-lib-bf_ecb.o", + "crypto/bf/libcrypto-lib-bf_enc.o", + "crypto/bf/libcrypto-lib-bf_ofb64.o", + "crypto/bf/libcrypto-lib-bf_skey.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/bio" => { + "deps" => [ + "crypto/bio/libcrypto-lib-bf_buff.o", + "crypto/bio/libcrypto-lib-bf_lbuf.o", + "crypto/bio/libcrypto-lib-bf_nbio.o", + "crypto/bio/libcrypto-lib-bf_null.o", + "crypto/bio/libcrypto-lib-bf_prefix.o", + "crypto/bio/libcrypto-lib-bf_readbuff.o", + "crypto/bio/libcrypto-lib-bio_addr.o", + "crypto/bio/libcrypto-lib-bio_cb.o", + "crypto/bio/libcrypto-lib-bio_dump.o", + "crypto/bio/libcrypto-lib-bio_err.o", + "crypto/bio/libcrypto-lib-bio_lib.o", + "crypto/bio/libcrypto-lib-bio_meth.o", + "crypto/bio/libcrypto-lib-bio_print.o", + "crypto/bio/libcrypto-lib-bio_sock.o", + "crypto/bio/libcrypto-lib-bio_sock2.o", + "crypto/bio/libcrypto-lib-bss_acpt.o", + "crypto/bio/libcrypto-lib-bss_bio.o", + "crypto/bio/libcrypto-lib-bss_conn.o", + "crypto/bio/libcrypto-lib-bss_core.o", + "crypto/bio/libcrypto-lib-bss_dgram.o", + "crypto/bio/libcrypto-lib-bss_dgram_pair.o", + "crypto/bio/libcrypto-lib-bss_fd.o", + "crypto/bio/libcrypto-lib-bss_file.o", + "crypto/bio/libcrypto-lib-bss_log.o", + "crypto/bio/libcrypto-lib-bss_mem.o", + "crypto/bio/libcrypto-lib-bss_null.o", + "crypto/bio/libcrypto-lib-bss_sock.o", + "crypto/bio/libcrypto-lib-ossl_core_bio.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/bn" => { + "deps" => [ + "crypto/bn/libcrypto-lib-bn_add.o", + "crypto/bn/libcrypto-lib-bn_asm.o", + "crypto/bn/libcrypto-lib-bn_blind.o", + "crypto/bn/libcrypto-lib-bn_const.o", + "crypto/bn/libcrypto-lib-bn_conv.o", + "crypto/bn/libcrypto-lib-bn_ctx.o", + "crypto/bn/libcrypto-lib-bn_depr.o", + "crypto/bn/libcrypto-lib-bn_dh.o", + "crypto/bn/libcrypto-lib-bn_div.o", + "crypto/bn/libcrypto-lib-bn_err.o", + "crypto/bn/libcrypto-lib-bn_exp.o", + "crypto/bn/libcrypto-lib-bn_exp2.o", + "crypto/bn/libcrypto-lib-bn_gcd.o", + "crypto/bn/libcrypto-lib-bn_gf2m.o", + "crypto/bn/libcrypto-lib-bn_intern.o", + "crypto/bn/libcrypto-lib-bn_kron.o", + "crypto/bn/libcrypto-lib-bn_lib.o", + "crypto/bn/libcrypto-lib-bn_mod.o", + "crypto/bn/libcrypto-lib-bn_mont.o", + "crypto/bn/libcrypto-lib-bn_mpi.o", + "crypto/bn/libcrypto-lib-bn_mul.o", + "crypto/bn/libcrypto-lib-bn_nist.o", + "crypto/bn/libcrypto-lib-bn_prime.o", + "crypto/bn/libcrypto-lib-bn_print.o", + "crypto/bn/libcrypto-lib-bn_rand.o", + "crypto/bn/libcrypto-lib-bn_recp.o", + "crypto/bn/libcrypto-lib-bn_rsa_fips186_4.o", + "crypto/bn/libcrypto-lib-bn_shift.o", + "crypto/bn/libcrypto-lib-bn_sqr.o", + "crypto/bn/libcrypto-lib-bn_sqrt.o", + "crypto/bn/libcrypto-lib-bn_srp.o", + "crypto/bn/libcrypto-lib-bn_word.o", + "crypto/bn/libcrypto-lib-bn_x931p.o", + "crypto/bn/libfips-lib-bn_add.o", + "crypto/bn/libfips-lib-bn_asm.o", + "crypto/bn/libfips-lib-bn_blind.o", + "crypto/bn/libfips-lib-bn_const.o", + "crypto/bn/libfips-lib-bn_conv.o", + "crypto/bn/libfips-lib-bn_ctx.o", + "crypto/bn/libfips-lib-bn_dh.o", + "crypto/bn/libfips-lib-bn_div.o", + "crypto/bn/libfips-lib-bn_exp.o", + "crypto/bn/libfips-lib-bn_exp2.o", + "crypto/bn/libfips-lib-bn_gcd.o", + "crypto/bn/libfips-lib-bn_gf2m.o", + "crypto/bn/libfips-lib-bn_intern.o", + "crypto/bn/libfips-lib-bn_kron.o", + "crypto/bn/libfips-lib-bn_lib.o", + "crypto/bn/libfips-lib-bn_mod.o", + "crypto/bn/libfips-lib-bn_mont.o", + "crypto/bn/libfips-lib-bn_mpi.o", + "crypto/bn/libfips-lib-bn_mul.o", + "crypto/bn/libfips-lib-bn_nist.o", + "crypto/bn/libfips-lib-bn_prime.o", + "crypto/bn/libfips-lib-bn_rand.o", + "crypto/bn/libfips-lib-bn_recp.o", + "crypto/bn/libfips-lib-bn_rsa_fips186_4.o", + "crypto/bn/libfips-lib-bn_shift.o", + "crypto/bn/libfips-lib-bn_sqr.o", + "crypto/bn/libfips-lib-bn_sqrt.o", + "crypto/bn/libfips-lib-bn_word.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/buffer" => { + "deps" => [ + "crypto/buffer/libcrypto-lib-buf_err.o", + "crypto/buffer/libcrypto-lib-buffer.o", + "crypto/buffer/libfips-lib-buffer.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/camellia" => { + "deps" => [ + "crypto/camellia/libcrypto-lib-camellia.o", + "crypto/camellia/libcrypto-lib-cmll_cbc.o", + "crypto/camellia/libcrypto-lib-cmll_cfb.o", + "crypto/camellia/libcrypto-lib-cmll_ctr.o", + "crypto/camellia/libcrypto-lib-cmll_ecb.o", + "crypto/camellia/libcrypto-lib-cmll_misc.o", + "crypto/camellia/libcrypto-lib-cmll_ofb.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/cast" => { + "deps" => [ + "crypto/cast/libcrypto-lib-c_cfb64.o", + "crypto/cast/libcrypto-lib-c_ecb.o", + "crypto/cast/libcrypto-lib-c_enc.o", + "crypto/cast/libcrypto-lib-c_ofb64.o", + "crypto/cast/libcrypto-lib-c_skey.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/chacha" => { + "deps" => [ + "crypto/chacha/libcrypto-lib-chacha-riscv64-v-zbb-zvkb.o", + "crypto/chacha/libcrypto-lib-chacha-riscv64-v-zbb.o", + "crypto/chacha/libcrypto-lib-chacha_enc.o", + "crypto/chacha/libcrypto-lib-chacha_riscv.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/cmac" => { + "deps" => [ + "crypto/cmac/libcrypto-lib-cmac.o", + "crypto/cmac/libfips-lib-cmac.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/cmp" => { + "deps" => [ + "crypto/cmp/libcrypto-lib-cmp_asn.o", + "crypto/cmp/libcrypto-lib-cmp_client.o", + "crypto/cmp/libcrypto-lib-cmp_ctx.o", + "crypto/cmp/libcrypto-lib-cmp_err.o", + "crypto/cmp/libcrypto-lib-cmp_genm.o", + "crypto/cmp/libcrypto-lib-cmp_hdr.o", + "crypto/cmp/libcrypto-lib-cmp_http.o", + "crypto/cmp/libcrypto-lib-cmp_msg.o", + "crypto/cmp/libcrypto-lib-cmp_protect.o", + "crypto/cmp/libcrypto-lib-cmp_server.o", + "crypto/cmp/libcrypto-lib-cmp_status.o", + "crypto/cmp/libcrypto-lib-cmp_util.o", + "crypto/cmp/libcrypto-lib-cmp_vfy.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/cms" => { + "deps" => [ + "crypto/cms/libcrypto-lib-cms_asn1.o", + "crypto/cms/libcrypto-lib-cms_att.o", + "crypto/cms/libcrypto-lib-cms_cd.o", + "crypto/cms/libcrypto-lib-cms_dd.o", + "crypto/cms/libcrypto-lib-cms_dh.o", + "crypto/cms/libcrypto-lib-cms_ec.o", + "crypto/cms/libcrypto-lib-cms_enc.o", + "crypto/cms/libcrypto-lib-cms_env.o", + "crypto/cms/libcrypto-lib-cms_err.o", + "crypto/cms/libcrypto-lib-cms_ess.o", + "crypto/cms/libcrypto-lib-cms_io.o", + "crypto/cms/libcrypto-lib-cms_kari.o", + "crypto/cms/libcrypto-lib-cms_lib.o", + "crypto/cms/libcrypto-lib-cms_pwri.o", + "crypto/cms/libcrypto-lib-cms_rsa.o", + "crypto/cms/libcrypto-lib-cms_sd.o", + "crypto/cms/libcrypto-lib-cms_smime.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/comp" => { + "deps" => [ + "crypto/comp/libcrypto-lib-c_brotli.o", + "crypto/comp/libcrypto-lib-c_zlib.o", + "crypto/comp/libcrypto-lib-c_zstd.o", + "crypto/comp/libcrypto-lib-comp_err.o", + "crypto/comp/libcrypto-lib-comp_lib.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/conf" => { + "deps" => [ + "crypto/conf/libcrypto-lib-conf_api.o", + "crypto/conf/libcrypto-lib-conf_def.o", + "crypto/conf/libcrypto-lib-conf_err.o", + "crypto/conf/libcrypto-lib-conf_lib.o", + "crypto/conf/libcrypto-lib-conf_mall.o", + "crypto/conf/libcrypto-lib-conf_mod.o", + "crypto/conf/libcrypto-lib-conf_sap.o", + "crypto/conf/libcrypto-lib-conf_ssl.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/crmf" => { + "deps" => [ + "crypto/crmf/libcrypto-lib-crmf_asn.o", + "crypto/crmf/libcrypto-lib-crmf_err.o", + "crypto/crmf/libcrypto-lib-crmf_lib.o", + "crypto/crmf/libcrypto-lib-crmf_pbm.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/ct" => { + "deps" => [ + "crypto/ct/libcrypto-lib-ct_b64.o", + "crypto/ct/libcrypto-lib-ct_err.o", + "crypto/ct/libcrypto-lib-ct_log.o", + "crypto/ct/libcrypto-lib-ct_oct.o", + "crypto/ct/libcrypto-lib-ct_policy.o", + "crypto/ct/libcrypto-lib-ct_prn.o", + "crypto/ct/libcrypto-lib-ct_sct.o", + "crypto/ct/libcrypto-lib-ct_sct_ctx.o", + "crypto/ct/libcrypto-lib-ct_vfy.o", + "crypto/ct/libcrypto-lib-ct_x509v3.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/des" => { + "deps" => [ + "crypto/des/libcrypto-lib-cbc_cksm.o", + "crypto/des/libcrypto-lib-cbc_enc.o", + "crypto/des/libcrypto-lib-cfb64ede.o", + "crypto/des/libcrypto-lib-cfb64enc.o", + "crypto/des/libcrypto-lib-cfb_enc.o", + "crypto/des/libcrypto-lib-des_enc.o", + "crypto/des/libcrypto-lib-ecb3_enc.o", + "crypto/des/libcrypto-lib-ecb_enc.o", + "crypto/des/libcrypto-lib-fcrypt.o", + "crypto/des/libcrypto-lib-fcrypt_b.o", + "crypto/des/libcrypto-lib-ofb64ede.o", + "crypto/des/libcrypto-lib-ofb64enc.o", + "crypto/des/libcrypto-lib-ofb_enc.o", + "crypto/des/libcrypto-lib-pcbc_enc.o", + "crypto/des/libcrypto-lib-qud_cksm.o", + "crypto/des/libcrypto-lib-rand_key.o", + "crypto/des/libcrypto-lib-set_key.o", + "crypto/des/libcrypto-lib-str2key.o", + "crypto/des/libcrypto-lib-xcbc_enc.o", + "crypto/des/libfips-lib-des_enc.o", + "crypto/des/libfips-lib-ecb3_enc.o", + "crypto/des/libfips-lib-fcrypt_b.o", + "crypto/des/libfips-lib-set_key.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/dh" => { + "deps" => [ + "crypto/dh/libcrypto-lib-dh_ameth.o", + "crypto/dh/libcrypto-lib-dh_asn1.o", + "crypto/dh/libcrypto-lib-dh_backend.o", + "crypto/dh/libcrypto-lib-dh_check.o", + "crypto/dh/libcrypto-lib-dh_depr.o", + "crypto/dh/libcrypto-lib-dh_err.o", + "crypto/dh/libcrypto-lib-dh_gen.o", + "crypto/dh/libcrypto-lib-dh_group_params.o", + "crypto/dh/libcrypto-lib-dh_kdf.o", + "crypto/dh/libcrypto-lib-dh_key.o", + "crypto/dh/libcrypto-lib-dh_lib.o", + "crypto/dh/libcrypto-lib-dh_meth.o", + "crypto/dh/libcrypto-lib-dh_pmeth.o", + "crypto/dh/libcrypto-lib-dh_prn.o", + "crypto/dh/libcrypto-lib-dh_rfc5114.o", + "crypto/dh/libfips-lib-dh_backend.o", + "crypto/dh/libfips-lib-dh_check.o", + "crypto/dh/libfips-lib-dh_gen.o", + "crypto/dh/libfips-lib-dh_group_params.o", + "crypto/dh/libfips-lib-dh_kdf.o", + "crypto/dh/libfips-lib-dh_key.o", + "crypto/dh/libfips-lib-dh_lib.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/dsa" => { + "deps" => [ + "crypto/dsa/libcrypto-lib-dsa_ameth.o", + "crypto/dsa/libcrypto-lib-dsa_asn1.o", + "crypto/dsa/libcrypto-lib-dsa_backend.o", + "crypto/dsa/libcrypto-lib-dsa_check.o", + "crypto/dsa/libcrypto-lib-dsa_depr.o", + "crypto/dsa/libcrypto-lib-dsa_err.o", + "crypto/dsa/libcrypto-lib-dsa_gen.o", + "crypto/dsa/libcrypto-lib-dsa_key.o", + "crypto/dsa/libcrypto-lib-dsa_lib.o", + "crypto/dsa/libcrypto-lib-dsa_meth.o", + "crypto/dsa/libcrypto-lib-dsa_ossl.o", + "crypto/dsa/libcrypto-lib-dsa_pmeth.o", + "crypto/dsa/libcrypto-lib-dsa_prn.o", + "crypto/dsa/libcrypto-lib-dsa_sign.o", + "crypto/dsa/libcrypto-lib-dsa_vrf.o", + "crypto/dsa/libfips-lib-dsa_backend.o", + "crypto/dsa/libfips-lib-dsa_check.o", + "crypto/dsa/libfips-lib-dsa_gen.o", + "crypto/dsa/libfips-lib-dsa_key.o", + "crypto/dsa/libfips-lib-dsa_lib.o", + "crypto/dsa/libfips-lib-dsa_ossl.o", + "crypto/dsa/libfips-lib-dsa_sign.o", + "crypto/dsa/libfips-lib-dsa_vrf.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/dso" => { + "deps" => [ + "crypto/dso/libcrypto-lib-dso_dl.o", + "crypto/dso/libcrypto-lib-dso_dlfcn.o", + "crypto/dso/libcrypto-lib-dso_err.o", + "crypto/dso/libcrypto-lib-dso_lib.o", + "crypto/dso/libcrypto-lib-dso_openssl.o", + "crypto/dso/libcrypto-lib-dso_vms.o", + "crypto/dso/libcrypto-lib-dso_win32.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/ec" => { + "deps" => [ + "crypto/ec/libcrypto-lib-curve25519.o", + "crypto/ec/libcrypto-lib-ec2_oct.o", + "crypto/ec/libcrypto-lib-ec2_smpl.o", + "crypto/ec/libcrypto-lib-ec_ameth.o", + "crypto/ec/libcrypto-lib-ec_asn1.o", + "crypto/ec/libcrypto-lib-ec_backend.o", + "crypto/ec/libcrypto-lib-ec_check.o", + "crypto/ec/libcrypto-lib-ec_curve.o", + "crypto/ec/libcrypto-lib-ec_cvt.o", + "crypto/ec/libcrypto-lib-ec_deprecated.o", + "crypto/ec/libcrypto-lib-ec_err.o", + "crypto/ec/libcrypto-lib-ec_key.o", + "crypto/ec/libcrypto-lib-ec_kmeth.o", + "crypto/ec/libcrypto-lib-ec_lib.o", + "crypto/ec/libcrypto-lib-ec_mult.o", + "crypto/ec/libcrypto-lib-ec_oct.o", + "crypto/ec/libcrypto-lib-ec_pmeth.o", + "crypto/ec/libcrypto-lib-ec_print.o", + "crypto/ec/libcrypto-lib-ecdh_kdf.o", + "crypto/ec/libcrypto-lib-ecdh_ossl.o", + "crypto/ec/libcrypto-lib-ecdsa_ossl.o", + "crypto/ec/libcrypto-lib-ecdsa_sign.o", + "crypto/ec/libcrypto-lib-ecdsa_vrf.o", + "crypto/ec/libcrypto-lib-eck_prn.o", + "crypto/ec/libcrypto-lib-ecp_mont.o", + "crypto/ec/libcrypto-lib-ecp_nist.o", + "crypto/ec/libcrypto-lib-ecp_oct.o", + "crypto/ec/libcrypto-lib-ecp_smpl.o", + "crypto/ec/libcrypto-lib-ecx_backend.o", + "crypto/ec/libcrypto-lib-ecx_key.o", + "crypto/ec/libcrypto-lib-ecx_meth.o", + "crypto/ec/libfips-lib-curve25519.o", + "crypto/ec/libfips-lib-ec2_oct.o", + "crypto/ec/libfips-lib-ec2_smpl.o", + "crypto/ec/libfips-lib-ec_asn1.o", + "crypto/ec/libfips-lib-ec_backend.o", + "crypto/ec/libfips-lib-ec_check.o", + "crypto/ec/libfips-lib-ec_curve.o", + "crypto/ec/libfips-lib-ec_cvt.o", + "crypto/ec/libfips-lib-ec_key.o", + "crypto/ec/libfips-lib-ec_kmeth.o", + "crypto/ec/libfips-lib-ec_lib.o", + "crypto/ec/libfips-lib-ec_mult.o", + "crypto/ec/libfips-lib-ec_oct.o", + "crypto/ec/libfips-lib-ecdh_kdf.o", + "crypto/ec/libfips-lib-ecdh_ossl.o", + "crypto/ec/libfips-lib-ecdsa_ossl.o", + "crypto/ec/libfips-lib-ecdsa_sign.o", + "crypto/ec/libfips-lib-ecdsa_vrf.o", + "crypto/ec/libfips-lib-ecp_mont.o", + "crypto/ec/libfips-lib-ecp_nist.o", + "crypto/ec/libfips-lib-ecp_oct.o", + "crypto/ec/libfips-lib-ecp_smpl.o", + "crypto/ec/libfips-lib-ecx_backend.o", + "crypto/ec/libfips-lib-ecx_key.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/ec/curve448" => { + "deps" => [ + "crypto/ec/curve448/libcrypto-lib-curve448.o", + "crypto/ec/curve448/libcrypto-lib-curve448_tables.o", + "crypto/ec/curve448/libcrypto-lib-eddsa.o", + "crypto/ec/curve448/libcrypto-lib-f_generic.o", + "crypto/ec/curve448/libcrypto-lib-scalar.o", + "crypto/ec/curve448/libfips-lib-curve448.o", + "crypto/ec/curve448/libfips-lib-curve448_tables.o", + "crypto/ec/curve448/libfips-lib-eddsa.o", + "crypto/ec/curve448/libfips-lib-f_generic.o", + "crypto/ec/curve448/libfips-lib-scalar.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/ec/curve448/arch_32" => { + "deps" => [ + "crypto/ec/curve448/arch_32/libcrypto-lib-f_impl32.o", + "crypto/ec/curve448/arch_32/libfips-lib-f_impl32.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/ec/curve448/arch_64" => { + "deps" => [ + "crypto/ec/curve448/arch_64/libcrypto-lib-f_impl64.o", + "crypto/ec/curve448/arch_64/libfips-lib-f_impl64.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/encode_decode" => { + "deps" => [ + "crypto/encode_decode/libcrypto-lib-decoder_err.o", + "crypto/encode_decode/libcrypto-lib-decoder_lib.o", + "crypto/encode_decode/libcrypto-lib-decoder_meth.o", + "crypto/encode_decode/libcrypto-lib-decoder_pkey.o", + "crypto/encode_decode/libcrypto-lib-encoder_err.o", + "crypto/encode_decode/libcrypto-lib-encoder_lib.o", + "crypto/encode_decode/libcrypto-lib-encoder_meth.o", + "crypto/encode_decode/libcrypto-lib-encoder_pkey.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/engine" => { + "deps" => [ + "crypto/engine/libcrypto-lib-eng_all.o", + "crypto/engine/libcrypto-lib-eng_cnf.o", + "crypto/engine/libcrypto-lib-eng_ctrl.o", + "crypto/engine/libcrypto-lib-eng_dyn.o", + "crypto/engine/libcrypto-lib-eng_err.o", + "crypto/engine/libcrypto-lib-eng_fat.o", + "crypto/engine/libcrypto-lib-eng_init.o", + "crypto/engine/libcrypto-lib-eng_lib.o", + "crypto/engine/libcrypto-lib-eng_list.o", + "crypto/engine/libcrypto-lib-eng_openssl.o", + "crypto/engine/libcrypto-lib-eng_pkey.o", + "crypto/engine/libcrypto-lib-eng_rdrand.o", + "crypto/engine/libcrypto-lib-eng_table.o", + "crypto/engine/libcrypto-lib-tb_asnmth.o", + "crypto/engine/libcrypto-lib-tb_cipher.o", + "crypto/engine/libcrypto-lib-tb_dh.o", + "crypto/engine/libcrypto-lib-tb_digest.o", + "crypto/engine/libcrypto-lib-tb_dsa.o", + "crypto/engine/libcrypto-lib-tb_eckey.o", + "crypto/engine/libcrypto-lib-tb_pkmeth.o", + "crypto/engine/libcrypto-lib-tb_rand.o", + "crypto/engine/libcrypto-lib-tb_rsa.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/err" => { + "deps" => [ + "crypto/err/libcrypto-lib-err.o", + "crypto/err/libcrypto-lib-err_all.o", + "crypto/err/libcrypto-lib-err_all_legacy.o", + "crypto/err/libcrypto-lib-err_blocks.o", + "crypto/err/libcrypto-lib-err_mark.o", + "crypto/err/libcrypto-lib-err_prn.o", + "crypto/err/libcrypto-lib-err_save.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/ess" => { + "deps" => [ + "crypto/ess/libcrypto-lib-ess_asn1.o", + "crypto/ess/libcrypto-lib-ess_err.o", + "crypto/ess/libcrypto-lib-ess_lib.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/evp" => { + "deps" => [ + "crypto/evp/libcrypto-lib-asymcipher.o", + "crypto/evp/libcrypto-lib-bio_b64.o", + "crypto/evp/libcrypto-lib-bio_enc.o", + "crypto/evp/libcrypto-lib-bio_md.o", + "crypto/evp/libcrypto-lib-bio_ok.o", + "crypto/evp/libcrypto-lib-c_allc.o", + "crypto/evp/libcrypto-lib-c_alld.o", + "crypto/evp/libcrypto-lib-cmeth_lib.o", + "crypto/evp/libcrypto-lib-ctrl_params_translate.o", + "crypto/evp/libcrypto-lib-dh_ctrl.o", + "crypto/evp/libcrypto-lib-dh_support.o", + "crypto/evp/libcrypto-lib-digest.o", + "crypto/evp/libcrypto-lib-dsa_ctrl.o", + "crypto/evp/libcrypto-lib-e_aes.o", + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha1.o", + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha256.o", + "crypto/evp/libcrypto-lib-e_aria.o", + "crypto/evp/libcrypto-lib-e_bf.o", + "crypto/evp/libcrypto-lib-e_camellia.o", + "crypto/evp/libcrypto-lib-e_cast.o", + "crypto/evp/libcrypto-lib-e_chacha20_poly1305.o", + "crypto/evp/libcrypto-lib-e_des.o", + "crypto/evp/libcrypto-lib-e_des3.o", + "crypto/evp/libcrypto-lib-e_idea.o", + "crypto/evp/libcrypto-lib-e_null.o", + "crypto/evp/libcrypto-lib-e_old.o", + "crypto/evp/libcrypto-lib-e_rc2.o", + "crypto/evp/libcrypto-lib-e_rc4.o", + "crypto/evp/libcrypto-lib-e_rc4_hmac_md5.o", + "crypto/evp/libcrypto-lib-e_rc5.o", + "crypto/evp/libcrypto-lib-e_seed.o", + "crypto/evp/libcrypto-lib-e_sm4.o", + "crypto/evp/libcrypto-lib-e_xcbc_d.o", + "crypto/evp/libcrypto-lib-ec_ctrl.o", + "crypto/evp/libcrypto-lib-ec_support.o", + "crypto/evp/libcrypto-lib-encode.o", + "crypto/evp/libcrypto-lib-evp_cnf.o", + "crypto/evp/libcrypto-lib-evp_enc.o", + "crypto/evp/libcrypto-lib-evp_err.o", + "crypto/evp/libcrypto-lib-evp_fetch.o", + "crypto/evp/libcrypto-lib-evp_key.o", + "crypto/evp/libcrypto-lib-evp_lib.o", + "crypto/evp/libcrypto-lib-evp_pbe.o", + "crypto/evp/libcrypto-lib-evp_pkey.o", + "crypto/evp/libcrypto-lib-evp_rand.o", + "crypto/evp/libcrypto-lib-evp_utils.o", + "crypto/evp/libcrypto-lib-exchange.o", + "crypto/evp/libcrypto-lib-kdf_lib.o", + "crypto/evp/libcrypto-lib-kdf_meth.o", + "crypto/evp/libcrypto-lib-kem.o", + "crypto/evp/libcrypto-lib-keymgmt_lib.o", + "crypto/evp/libcrypto-lib-keymgmt_meth.o", + "crypto/evp/libcrypto-lib-legacy_blake2.o", + "crypto/evp/libcrypto-lib-legacy_md4.o", + "crypto/evp/libcrypto-lib-legacy_md5.o", + "crypto/evp/libcrypto-lib-legacy_md5_sha1.o", + "crypto/evp/libcrypto-lib-legacy_mdc2.o", + "crypto/evp/libcrypto-lib-legacy_ripemd.o", + "crypto/evp/libcrypto-lib-legacy_sha.o", + "crypto/evp/libcrypto-lib-legacy_wp.o", + "crypto/evp/libcrypto-lib-m_null.o", + "crypto/evp/libcrypto-lib-m_sigver.o", + "crypto/evp/libcrypto-lib-mac_lib.o", + "crypto/evp/libcrypto-lib-mac_meth.o", + "crypto/evp/libcrypto-lib-names.o", + "crypto/evp/libcrypto-lib-p5_crpt.o", + "crypto/evp/libcrypto-lib-p5_crpt2.o", + "crypto/evp/libcrypto-lib-p_dec.o", + "crypto/evp/libcrypto-lib-p_enc.o", + "crypto/evp/libcrypto-lib-p_legacy.o", + "crypto/evp/libcrypto-lib-p_lib.o", + "crypto/evp/libcrypto-lib-p_open.o", + "crypto/evp/libcrypto-lib-p_seal.o", + "crypto/evp/libcrypto-lib-p_sign.o", + "crypto/evp/libcrypto-lib-p_verify.o", + "crypto/evp/libcrypto-lib-pbe_scrypt.o", + "crypto/evp/libcrypto-lib-pmeth_check.o", + "crypto/evp/libcrypto-lib-pmeth_gn.o", + "crypto/evp/libcrypto-lib-pmeth_lib.o", + "crypto/evp/libcrypto-lib-s_lib.o", + "crypto/evp/libcrypto-lib-signature.o", + "crypto/evp/libcrypto-lib-skeymgmt_meth.o", + "crypto/evp/libfips-lib-asymcipher.o", + "crypto/evp/libfips-lib-dh_support.o", + "crypto/evp/libfips-lib-digest.o", + "crypto/evp/libfips-lib-ec_support.o", + "crypto/evp/libfips-lib-evp_enc.o", + "crypto/evp/libfips-lib-evp_fetch.o", + "crypto/evp/libfips-lib-evp_lib.o", + "crypto/evp/libfips-lib-evp_rand.o", + "crypto/evp/libfips-lib-evp_utils.o", + "crypto/evp/libfips-lib-exchange.o", + "crypto/evp/libfips-lib-kdf_lib.o", + "crypto/evp/libfips-lib-kdf_meth.o", + "crypto/evp/libfips-lib-kem.o", + "crypto/evp/libfips-lib-keymgmt_lib.o", + "crypto/evp/libfips-lib-keymgmt_meth.o", + "crypto/evp/libfips-lib-mac_lib.o", + "crypto/evp/libfips-lib-mac_meth.o", + "crypto/evp/libfips-lib-p_lib.o", + "crypto/evp/libfips-lib-pmeth_check.o", + "crypto/evp/libfips-lib-pmeth_gn.o", + "crypto/evp/libfips-lib-pmeth_lib.o", + "crypto/evp/libfips-lib-s_lib.o", + "crypto/evp/libfips-lib-signature.o", + "crypto/evp/libfips-lib-skeymgmt_meth.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/ffc" => { + "deps" => [ + "crypto/ffc/libcrypto-lib-ffc_backend.o", + "crypto/ffc/libcrypto-lib-ffc_dh.o", + "crypto/ffc/libcrypto-lib-ffc_key_generate.o", + "crypto/ffc/libcrypto-lib-ffc_key_validate.o", + "crypto/ffc/libcrypto-lib-ffc_params.o", + "crypto/ffc/libcrypto-lib-ffc_params_generate.o", + "crypto/ffc/libcrypto-lib-ffc_params_validate.o", + "crypto/ffc/libfips-lib-ffc_backend.o", + "crypto/ffc/libfips-lib-ffc_dh.o", + "crypto/ffc/libfips-lib-ffc_key_generate.o", + "crypto/ffc/libfips-lib-ffc_key_validate.o", + "crypto/ffc/libfips-lib-ffc_params.o", + "crypto/ffc/libfips-lib-ffc_params_generate.o", + "crypto/ffc/libfips-lib-ffc_params_validate.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/hashtable" => { + "deps" => [ + "crypto/hashtable/libcrypto-lib-hashfunc.o", + "crypto/hashtable/libcrypto-lib-hashtable.o", + "crypto/hashtable/libfips-lib-hashfunc.o", + "crypto/hashtable/libfips-lib-hashtable.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/hmac" => { + "deps" => [ + "crypto/hmac/libcrypto-lib-hmac.o", + "crypto/hmac/libfips-lib-hmac.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/hpke" => { + "deps" => [ + "crypto/hpke/libcrypto-lib-hpke.o", + "crypto/hpke/libcrypto-lib-hpke_util.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/http" => { + "deps" => [ + "crypto/http/libcrypto-lib-http_client.o", + "crypto/http/libcrypto-lib-http_err.o", + "crypto/http/libcrypto-lib-http_lib.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/idea" => { + "deps" => [ + "crypto/idea/libcrypto-lib-i_cbc.o", + "crypto/idea/libcrypto-lib-i_cfb64.o", + "crypto/idea/libcrypto-lib-i_ecb.o", + "crypto/idea/libcrypto-lib-i_ofb64.o", + "crypto/idea/libcrypto-lib-i_skey.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/kdf" => { + "deps" => [ + "crypto/kdf/libcrypto-lib-kdf_err.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/lhash" => { + "deps" => [ + "crypto/lhash/libcrypto-lib-lh_stats.o", + "crypto/lhash/libcrypto-lib-lhash.o", + "crypto/lhash/libfips-lib-lhash.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/md4" => { + "deps" => [ + "crypto/md4/libcrypto-lib-md4_dgst.o", + "crypto/md4/libcrypto-lib-md4_one.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/md5" => { + "deps" => [ + "crypto/md5/libcrypto-lib-md5_dgst.o", + "crypto/md5/libcrypto-lib-md5_one.o", + "crypto/md5/libcrypto-lib-md5_sha1.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/mdc2" => { + "deps" => [ + "crypto/mdc2/libcrypto-lib-mdc2_one.o", + "crypto/mdc2/libcrypto-lib-mdc2dgst.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/ml_dsa" => { + "deps" => [ + "crypto/ml_dsa/libcrypto-lib-ml_dsa_encoders.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_key.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_key_compress.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_matrix.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_ntt.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_params.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_sample.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_sign.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_encoders.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_key.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_key_compress.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_matrix.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_ntt.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_params.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_sample.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_sign.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/ml_kem" => { + "deps" => [ + "crypto/ml_kem/libcrypto-lib-ml_kem.o", + "crypto/ml_kem/libfips-lib-ml_kem.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/modes" => { + "deps" => [ + "crypto/modes/libcrypto-lib-aes-gcm-riscv64-zvkb-zvkg-zvkned.o", + "crypto/modes/libcrypto-lib-cbc128.o", + "crypto/modes/libcrypto-lib-ccm128.o", + "crypto/modes/libcrypto-lib-cfb128.o", + "crypto/modes/libcrypto-lib-ctr128.o", + "crypto/modes/libcrypto-lib-cts128.o", + "crypto/modes/libcrypto-lib-gcm128.o", + "crypto/modes/libcrypto-lib-ghash-riscv64-zvkb-zvbc.o", + "crypto/modes/libcrypto-lib-ghash-riscv64-zvkg.o", + "crypto/modes/libcrypto-lib-ghash-riscv64.o", + "crypto/modes/libcrypto-lib-ocb128.o", + "crypto/modes/libcrypto-lib-ofb128.o", + "crypto/modes/libcrypto-lib-siv128.o", + "crypto/modes/libcrypto-lib-wrap128.o", + "crypto/modes/libcrypto-lib-xts128.o", + "crypto/modes/libcrypto-lib-xts128gb.o", + "crypto/modes/libfips-lib-aes-gcm-riscv64-zvkb-zvkg-zvkned.o", + "crypto/modes/libfips-lib-cbc128.o", + "crypto/modes/libfips-lib-ccm128.o", + "crypto/modes/libfips-lib-cfb128.o", + "crypto/modes/libfips-lib-ctr128.o", + "crypto/modes/libfips-lib-gcm128.o", + "crypto/modes/libfips-lib-ghash-riscv64-zvkb-zvbc.o", + "crypto/modes/libfips-lib-ghash-riscv64-zvkg.o", + "crypto/modes/libfips-lib-ghash-riscv64.o", + "crypto/modes/libfips-lib-ofb128.o", + "crypto/modes/libfips-lib-wrap128.o", + "crypto/modes/libfips-lib-xts128.o", + "crypto/modes/libfips-lib-xts128gb.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/objects" => { + "deps" => [ + "crypto/objects/libcrypto-lib-o_names.o", + "crypto/objects/libcrypto-lib-obj_dat.o", + "crypto/objects/libcrypto-lib-obj_err.o", + "crypto/objects/libcrypto-lib-obj_lib.o", + "crypto/objects/libcrypto-lib-obj_xref.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/ocsp" => { + "deps" => [ + "crypto/ocsp/libcrypto-lib-ocsp_asn.o", + "crypto/ocsp/libcrypto-lib-ocsp_cl.o", + "crypto/ocsp/libcrypto-lib-ocsp_err.o", + "crypto/ocsp/libcrypto-lib-ocsp_ext.o", + "crypto/ocsp/libcrypto-lib-ocsp_http.o", + "crypto/ocsp/libcrypto-lib-ocsp_lib.o", + "crypto/ocsp/libcrypto-lib-ocsp_prn.o", + "crypto/ocsp/libcrypto-lib-ocsp_srv.o", + "crypto/ocsp/libcrypto-lib-ocsp_vfy.o", + "crypto/ocsp/libcrypto-lib-v3_ocsp.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/pem" => { + "deps" => [ + "crypto/pem/libcrypto-lib-pem_all.o", + "crypto/pem/libcrypto-lib-pem_err.o", + "crypto/pem/libcrypto-lib-pem_info.o", + "crypto/pem/libcrypto-lib-pem_lib.o", + "crypto/pem/libcrypto-lib-pem_oth.o", + "crypto/pem/libcrypto-lib-pem_pk8.o", + "crypto/pem/libcrypto-lib-pem_pkey.o", + "crypto/pem/libcrypto-lib-pem_sign.o", + "crypto/pem/libcrypto-lib-pem_x509.o", + "crypto/pem/libcrypto-lib-pem_xaux.o", + "crypto/pem/libcrypto-lib-pvkfmt.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/pkcs12" => { + "deps" => [ + "crypto/pkcs12/libcrypto-lib-p12_add.o", + "crypto/pkcs12/libcrypto-lib-p12_asn.o", + "crypto/pkcs12/libcrypto-lib-p12_attr.o", + "crypto/pkcs12/libcrypto-lib-p12_crpt.o", + "crypto/pkcs12/libcrypto-lib-p12_crt.o", + "crypto/pkcs12/libcrypto-lib-p12_decr.o", + "crypto/pkcs12/libcrypto-lib-p12_init.o", + "crypto/pkcs12/libcrypto-lib-p12_key.o", + "crypto/pkcs12/libcrypto-lib-p12_kiss.o", + "crypto/pkcs12/libcrypto-lib-p12_mutl.o", + "crypto/pkcs12/libcrypto-lib-p12_npas.o", + "crypto/pkcs12/libcrypto-lib-p12_p8d.o", + "crypto/pkcs12/libcrypto-lib-p12_p8e.o", + "crypto/pkcs12/libcrypto-lib-p12_sbag.o", + "crypto/pkcs12/libcrypto-lib-p12_utl.o", + "crypto/pkcs12/libcrypto-lib-pk12err.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/pkcs7" => { + "deps" => [ + "crypto/pkcs7/libcrypto-lib-bio_pk7.o", + "crypto/pkcs7/libcrypto-lib-pk7_asn1.o", + "crypto/pkcs7/libcrypto-lib-pk7_attr.o", + "crypto/pkcs7/libcrypto-lib-pk7_doit.o", + "crypto/pkcs7/libcrypto-lib-pk7_lib.o", + "crypto/pkcs7/libcrypto-lib-pk7_mime.o", + "crypto/pkcs7/libcrypto-lib-pk7_smime.o", + "crypto/pkcs7/libcrypto-lib-pkcs7err.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/poly1305" => { + "deps" => [ + "crypto/poly1305/libcrypto-lib-poly1305.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/property" => { + "deps" => [ + "crypto/property/libcrypto-lib-defn_cache.o", + "crypto/property/libcrypto-lib-property.o", + "crypto/property/libcrypto-lib-property_err.o", + "crypto/property/libcrypto-lib-property_parse.o", + "crypto/property/libcrypto-lib-property_query.o", + "crypto/property/libcrypto-lib-property_string.o", + "crypto/property/libfips-lib-defn_cache.o", + "crypto/property/libfips-lib-property.o", + "crypto/property/libfips-lib-property_parse.o", + "crypto/property/libfips-lib-property_query.o", + "crypto/property/libfips-lib-property_string.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/rand" => { + "deps" => [ + "crypto/rand/libcrypto-lib-prov_seed.o", + "crypto/rand/libcrypto-lib-rand_deprecated.o", + "crypto/rand/libcrypto-lib-rand_err.o", + "crypto/rand/libcrypto-lib-rand_lib.o", + "crypto/rand/libcrypto-lib-rand_meth.o", + "crypto/rand/libcrypto-lib-rand_pool.o", + "crypto/rand/libcrypto-lib-rand_uniform.o", + "crypto/rand/libcrypto-lib-randfile.o", + "crypto/rand/libfips-lib-rand_lib.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/rc2" => { + "deps" => [ + "crypto/rc2/libcrypto-lib-rc2_cbc.o", + "crypto/rc2/libcrypto-lib-rc2_ecb.o", + "crypto/rc2/libcrypto-lib-rc2_skey.o", + "crypto/rc2/libcrypto-lib-rc2cfb64.o", + "crypto/rc2/libcrypto-lib-rc2ofb64.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/rc4" => { + "deps" => [ + "crypto/rc4/libcrypto-lib-rc4_enc.o", + "crypto/rc4/libcrypto-lib-rc4_skey.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/ripemd" => { + "deps" => [ + "crypto/ripemd/libcrypto-lib-rmd_dgst.o", + "crypto/ripemd/libcrypto-lib-rmd_one.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/rsa" => { + "deps" => [ + "crypto/rsa/libcrypto-lib-rsa_ameth.o", + "crypto/rsa/libcrypto-lib-rsa_asn1.o", + "crypto/rsa/libcrypto-lib-rsa_backend.o", + "crypto/rsa/libcrypto-lib-rsa_chk.o", + "crypto/rsa/libcrypto-lib-rsa_crpt.o", + "crypto/rsa/libcrypto-lib-rsa_depr.o", + "crypto/rsa/libcrypto-lib-rsa_err.o", + "crypto/rsa/libcrypto-lib-rsa_gen.o", + "crypto/rsa/libcrypto-lib-rsa_lib.o", + "crypto/rsa/libcrypto-lib-rsa_meth.o", + "crypto/rsa/libcrypto-lib-rsa_mp.o", + "crypto/rsa/libcrypto-lib-rsa_mp_names.o", + "crypto/rsa/libcrypto-lib-rsa_none.o", + "crypto/rsa/libcrypto-lib-rsa_oaep.o", + "crypto/rsa/libcrypto-lib-rsa_ossl.o", + "crypto/rsa/libcrypto-lib-rsa_pk1.o", + "crypto/rsa/libcrypto-lib-rsa_pmeth.o", + "crypto/rsa/libcrypto-lib-rsa_prn.o", + "crypto/rsa/libcrypto-lib-rsa_pss.o", + "crypto/rsa/libcrypto-lib-rsa_saos.o", + "crypto/rsa/libcrypto-lib-rsa_schemes.o", + "crypto/rsa/libcrypto-lib-rsa_sign.o", + "crypto/rsa/libcrypto-lib-rsa_sp800_56b_check.o", + "crypto/rsa/libcrypto-lib-rsa_sp800_56b_gen.o", + "crypto/rsa/libcrypto-lib-rsa_x931.o", + "crypto/rsa/libcrypto-lib-rsa_x931g.o", + "crypto/rsa/libfips-lib-rsa_acvp_test_params.o", + "crypto/rsa/libfips-lib-rsa_backend.o", + "crypto/rsa/libfips-lib-rsa_chk.o", + "crypto/rsa/libfips-lib-rsa_crpt.o", + "crypto/rsa/libfips-lib-rsa_gen.o", + "crypto/rsa/libfips-lib-rsa_lib.o", + "crypto/rsa/libfips-lib-rsa_mp_names.o", + "crypto/rsa/libfips-lib-rsa_none.o", + "crypto/rsa/libfips-lib-rsa_oaep.o", + "crypto/rsa/libfips-lib-rsa_ossl.o", + "crypto/rsa/libfips-lib-rsa_pk1.o", + "crypto/rsa/libfips-lib-rsa_pss.o", + "crypto/rsa/libfips-lib-rsa_schemes.o", + "crypto/rsa/libfips-lib-rsa_sign.o", + "crypto/rsa/libfips-lib-rsa_sp800_56b_check.o", + "crypto/rsa/libfips-lib-rsa_sp800_56b_gen.o", + "crypto/rsa/libfips-lib-rsa_x931.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/seed" => { + "deps" => [ + "crypto/seed/libcrypto-lib-seed.o", + "crypto/seed/libcrypto-lib-seed_cbc.o", + "crypto/seed/libcrypto-lib-seed_cfb.o", + "crypto/seed/libcrypto-lib-seed_ecb.o", + "crypto/seed/libcrypto-lib-seed_ofb.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/sha" => { + "deps" => [ + "crypto/sha/libcrypto-lib-keccak1600.o", + "crypto/sha/libcrypto-lib-sha1_one.o", + "crypto/sha/libcrypto-lib-sha1dgst.o", + "crypto/sha/libcrypto-lib-sha256-riscv64-zvkb-zvknha_or_zvknhb.o", + "crypto/sha/libcrypto-lib-sha256.o", + "crypto/sha/libcrypto-lib-sha3.o", + "crypto/sha/libcrypto-lib-sha512-riscv64-zvkb-zvknhb.o", + "crypto/sha/libcrypto-lib-sha512.o", + "crypto/sha/libcrypto-lib-sha_riscv.o", + "crypto/sha/libfips-lib-keccak1600.o", + "crypto/sha/libfips-lib-sha1dgst.o", + "crypto/sha/libfips-lib-sha256-riscv64-zvkb-zvknha_or_zvknhb.o", + "crypto/sha/libfips-lib-sha256.o", + "crypto/sha/libfips-lib-sha3.o", + "crypto/sha/libfips-lib-sha512-riscv64-zvkb-zvknhb.o", + "crypto/sha/libfips-lib-sha512.o", + "crypto/sha/libfips-lib-sha_riscv.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/siphash" => { + "deps" => [ + "crypto/siphash/libcrypto-lib-siphash.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/slh_dsa" => { + "deps" => [ + "crypto/slh_dsa/libcrypto-lib-slh_adrs.o", + "crypto/slh_dsa/libcrypto-lib-slh_dsa.o", + "crypto/slh_dsa/libcrypto-lib-slh_dsa_hash_ctx.o", + "crypto/slh_dsa/libcrypto-lib-slh_dsa_key.o", + "crypto/slh_dsa/libcrypto-lib-slh_fors.o", + "crypto/slh_dsa/libcrypto-lib-slh_hash.o", + "crypto/slh_dsa/libcrypto-lib-slh_hypertree.o", + "crypto/slh_dsa/libcrypto-lib-slh_params.o", + "crypto/slh_dsa/libcrypto-lib-slh_wots.o", + "crypto/slh_dsa/libcrypto-lib-slh_xmss.o", + "crypto/slh_dsa/libfips-lib-slh_adrs.o", + "crypto/slh_dsa/libfips-lib-slh_dsa.o", + "crypto/slh_dsa/libfips-lib-slh_dsa_hash_ctx.o", + "crypto/slh_dsa/libfips-lib-slh_dsa_key.o", + "crypto/slh_dsa/libfips-lib-slh_fors.o", + "crypto/slh_dsa/libfips-lib-slh_hash.o", + "crypto/slh_dsa/libfips-lib-slh_hypertree.o", + "crypto/slh_dsa/libfips-lib-slh_params.o", + "crypto/slh_dsa/libfips-lib-slh_wots.o", + "crypto/slh_dsa/libfips-lib-slh_xmss.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/sm2" => { + "deps" => [ + "crypto/sm2/libcrypto-lib-sm2_crypt.o", + "crypto/sm2/libcrypto-lib-sm2_err.o", + "crypto/sm2/libcrypto-lib-sm2_key.o", + "crypto/sm2/libcrypto-lib-sm2_sign.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/sm3" => { + "deps" => [ + "crypto/sm3/libcrypto-lib-legacy_sm3.o", + "crypto/sm3/libcrypto-lib-sm3-riscv64-zvksh.o", + "crypto/sm3/libcrypto-lib-sm3.o", + "crypto/sm3/libcrypto-lib-sm3_riscv.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/sm4" => { + "deps" => [ + "crypto/sm4/libcrypto-lib-sm4-riscv64-zvksed.o", + "crypto/sm4/libcrypto-lib-sm4.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/srp" => { + "deps" => [ + "crypto/srp/libcrypto-lib-srp_lib.o", + "crypto/srp/libcrypto-lib-srp_vfy.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/stack" => { + "deps" => [ + "crypto/stack/libcrypto-lib-stack.o", + "crypto/stack/libfips-lib-stack.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/store" => { + "deps" => [ + "crypto/store/libcrypto-lib-store_err.o", + "crypto/store/libcrypto-lib-store_init.o", + "crypto/store/libcrypto-lib-store_lib.o", + "crypto/store/libcrypto-lib-store_meth.o", + "crypto/store/libcrypto-lib-store_register.o", + "crypto/store/libcrypto-lib-store_result.o", + "crypto/store/libcrypto-lib-store_strings.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/thread" => { + "deps" => [ + "crypto/thread/libcrypto-lib-api.o", + "crypto/thread/libcrypto-lib-arch.o", + "crypto/thread/libcrypto-lib-internal.o", + "crypto/thread/libfips-lib-api.o", + "crypto/thread/libfips-lib-arch.o", + "crypto/thread/libfips-lib-internal.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/thread/arch" => { + "deps" => [ + "crypto/thread/arch/libcrypto-lib-thread_none.o", + "crypto/thread/arch/libcrypto-lib-thread_posix.o", + "crypto/thread/arch/libcrypto-lib-thread_win.o", + "crypto/thread/arch/libfips-lib-thread_none.o", + "crypto/thread/arch/libfips-lib-thread_posix.o", + "crypto/thread/arch/libfips-lib-thread_win.o" + ], + "products" => { + "lib" => [ + "libcrypto", + "providers/libfips.a" + ] + } + }, + "crypto/ts" => { + "deps" => [ + "crypto/ts/libcrypto-lib-ts_asn1.o", + "crypto/ts/libcrypto-lib-ts_conf.o", + "crypto/ts/libcrypto-lib-ts_err.o", + "crypto/ts/libcrypto-lib-ts_lib.o", + "crypto/ts/libcrypto-lib-ts_req_print.o", + "crypto/ts/libcrypto-lib-ts_req_utils.o", + "crypto/ts/libcrypto-lib-ts_rsp_print.o", + "crypto/ts/libcrypto-lib-ts_rsp_sign.o", + "crypto/ts/libcrypto-lib-ts_rsp_utils.o", + "crypto/ts/libcrypto-lib-ts_rsp_verify.o", + "crypto/ts/libcrypto-lib-ts_verify_ctx.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/txt_db" => { + "deps" => [ + "crypto/txt_db/libcrypto-lib-txt_db.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/ui" => { + "deps" => [ + "crypto/ui/libcrypto-lib-ui_err.o", + "crypto/ui/libcrypto-lib-ui_lib.o", + "crypto/ui/libcrypto-lib-ui_null.o", + "crypto/ui/libcrypto-lib-ui_openssl.o", + "crypto/ui/libcrypto-lib-ui_util.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/whrlpool" => { + "deps" => [ + "crypto/whrlpool/libcrypto-lib-wp_block.o", + "crypto/whrlpool/libcrypto-lib-wp_dgst.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "crypto/x509" => { + "deps" => [ + "crypto/x509/libcrypto-lib-by_dir.o", + "crypto/x509/libcrypto-lib-by_file.o", + "crypto/x509/libcrypto-lib-by_store.o", + "crypto/x509/libcrypto-lib-pcy_cache.o", + "crypto/x509/libcrypto-lib-pcy_data.o", + "crypto/x509/libcrypto-lib-pcy_lib.o", + "crypto/x509/libcrypto-lib-pcy_map.o", + "crypto/x509/libcrypto-lib-pcy_node.o", + "crypto/x509/libcrypto-lib-pcy_tree.o", + "crypto/x509/libcrypto-lib-t_acert.o", + "crypto/x509/libcrypto-lib-t_crl.o", + "crypto/x509/libcrypto-lib-t_req.o", + "crypto/x509/libcrypto-lib-t_x509.o", + "crypto/x509/libcrypto-lib-v3_aaa.o", + "crypto/x509/libcrypto-lib-v3_ac_tgt.o", + "crypto/x509/libcrypto-lib-v3_addr.o", + "crypto/x509/libcrypto-lib-v3_admis.o", + "crypto/x509/libcrypto-lib-v3_akeya.o", + "crypto/x509/libcrypto-lib-v3_akid.o", + "crypto/x509/libcrypto-lib-v3_asid.o", + "crypto/x509/libcrypto-lib-v3_attrdesc.o", + "crypto/x509/libcrypto-lib-v3_attrmap.o", + "crypto/x509/libcrypto-lib-v3_audit_id.o", + "crypto/x509/libcrypto-lib-v3_authattid.o", + "crypto/x509/libcrypto-lib-v3_battcons.o", + "crypto/x509/libcrypto-lib-v3_bcons.o", + "crypto/x509/libcrypto-lib-v3_bitst.o", + "crypto/x509/libcrypto-lib-v3_conf.o", + "crypto/x509/libcrypto-lib-v3_cpols.o", + "crypto/x509/libcrypto-lib-v3_crld.o", + "crypto/x509/libcrypto-lib-v3_enum.o", + "crypto/x509/libcrypto-lib-v3_extku.o", + "crypto/x509/libcrypto-lib-v3_genn.o", + "crypto/x509/libcrypto-lib-v3_group_ac.o", + "crypto/x509/libcrypto-lib-v3_ia5.o", + "crypto/x509/libcrypto-lib-v3_ind_iss.o", + "crypto/x509/libcrypto-lib-v3_info.o", + "crypto/x509/libcrypto-lib-v3_int.o", + "crypto/x509/libcrypto-lib-v3_iobo.o", + "crypto/x509/libcrypto-lib-v3_ist.o", + "crypto/x509/libcrypto-lib-v3_lib.o", + "crypto/x509/libcrypto-lib-v3_ncons.o", + "crypto/x509/libcrypto-lib-v3_no_ass.o", + "crypto/x509/libcrypto-lib-v3_no_rev_avail.o", + "crypto/x509/libcrypto-lib-v3_pci.o", + "crypto/x509/libcrypto-lib-v3_pcia.o", + "crypto/x509/libcrypto-lib-v3_pcons.o", + "crypto/x509/libcrypto-lib-v3_pku.o", + "crypto/x509/libcrypto-lib-v3_pmaps.o", + "crypto/x509/libcrypto-lib-v3_prn.o", + "crypto/x509/libcrypto-lib-v3_purp.o", + "crypto/x509/libcrypto-lib-v3_rolespec.o", + "crypto/x509/libcrypto-lib-v3_san.o", + "crypto/x509/libcrypto-lib-v3_sda.o", + "crypto/x509/libcrypto-lib-v3_single_use.o", + "crypto/x509/libcrypto-lib-v3_skid.o", + "crypto/x509/libcrypto-lib-v3_soa_id.o", + "crypto/x509/libcrypto-lib-v3_sxnet.o", + "crypto/x509/libcrypto-lib-v3_timespec.o", + "crypto/x509/libcrypto-lib-v3_tlsf.o", + "crypto/x509/libcrypto-lib-v3_usernotice.o", + "crypto/x509/libcrypto-lib-v3_utf8.o", + "crypto/x509/libcrypto-lib-v3_utl.o", + "crypto/x509/libcrypto-lib-v3err.o", + "crypto/x509/libcrypto-lib-x509_acert.o", + "crypto/x509/libcrypto-lib-x509_att.o", + "crypto/x509/libcrypto-lib-x509_cmp.o", + "crypto/x509/libcrypto-lib-x509_d2.o", + "crypto/x509/libcrypto-lib-x509_def.o", + "crypto/x509/libcrypto-lib-x509_err.o", + "crypto/x509/libcrypto-lib-x509_ext.o", + "crypto/x509/libcrypto-lib-x509_lu.o", + "crypto/x509/libcrypto-lib-x509_meth.o", + "crypto/x509/libcrypto-lib-x509_obj.o", + "crypto/x509/libcrypto-lib-x509_r2x.o", + "crypto/x509/libcrypto-lib-x509_req.o", + "crypto/x509/libcrypto-lib-x509_set.o", + "crypto/x509/libcrypto-lib-x509_trust.o", + "crypto/x509/libcrypto-lib-x509_txt.o", + "crypto/x509/libcrypto-lib-x509_v3.o", + "crypto/x509/libcrypto-lib-x509_vfy.o", + "crypto/x509/libcrypto-lib-x509_vpm.o", + "crypto/x509/libcrypto-lib-x509aset.o", + "crypto/x509/libcrypto-lib-x509cset.o", + "crypto/x509/libcrypto-lib-x509name.o", + "crypto/x509/libcrypto-lib-x509rset.o", + "crypto/x509/libcrypto-lib-x509spki.o", + "crypto/x509/libcrypto-lib-x509type.o", + "crypto/x509/libcrypto-lib-x_all.o", + "crypto/x509/libcrypto-lib-x_attrib.o", + "crypto/x509/libcrypto-lib-x_crl.o", + "crypto/x509/libcrypto-lib-x_exten.o", + "crypto/x509/libcrypto-lib-x_ietfatt.o", + "crypto/x509/libcrypto-lib-x_name.o", + "crypto/x509/libcrypto-lib-x_pubkey.o", + "crypto/x509/libcrypto-lib-x_req.o", + "crypto/x509/libcrypto-lib-x_x509.o", + "crypto/x509/libcrypto-lib-x_x509a.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "engines" => { + "deps" => [ + "engines/libcrypto-lib-e_capi.o", + "engines/libcrypto-lib-e_padlock.o" + ], + "products" => { + "lib" => [ + "libcrypto" + ] + } + }, + "providers" => { + "deps" => [ + "providers/libcrypto-lib-baseprov.o", + "providers/libcrypto-lib-defltprov.o", + "providers/libcrypto-lib-nullprov.o", + "providers/libcrypto-lib-prov_running.o", + "providers/libdefault.a" + ], + "products" => { + "dso" => [ + "providers/fips", + "providers/legacy" + ], + "lib" => [ + "libcrypto", + "providers/libfips.a", + "providers/liblegacy.a" + ] + } + }, + "providers/common" => { + "deps" => [ + "providers/common/libcommon-lib-provider_ctx.o", + "providers/common/libcommon-lib-provider_err.o", + "providers/common/libdefault-lib-bio_prov.o", + "providers/common/libdefault-lib-capabilities.o", + "providers/common/libdefault-lib-digest_to_nid.o", + "providers/common/libdefault-lib-provider_seeding.o", + "providers/common/libdefault-lib-provider_util.o", + "providers/common/libdefault-lib-securitycheck.o", + "providers/common/libdefault-lib-securitycheck_default.o", + "providers/common/libfips-lib-bio_prov.o", + "providers/common/libfips-lib-capabilities.o", + "providers/common/libfips-lib-digest_to_nid.o", + "providers/common/libfips-lib-provider_seeding.o", + "providers/common/libfips-lib-provider_util.o", + "providers/common/libfips-lib-securitycheck.o", + "providers/common/libfips-lib-securitycheck_fips.o" + ], + "products" => { + "lib" => [ + "providers/libcommon.a", + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/common/der" => { + "deps" => [ + "providers/common/der/libcommon-lib-der_digests_gen.o", + "providers/common/der/libcommon-lib-der_dsa_gen.o", + "providers/common/der/libcommon-lib-der_dsa_key.o", + "providers/common/der/libcommon-lib-der_dsa_sig.o", + "providers/common/der/libcommon-lib-der_ec_gen.o", + "providers/common/der/libcommon-lib-der_ec_key.o", + "providers/common/der/libcommon-lib-der_ec_sig.o", + "providers/common/der/libcommon-lib-der_ecx_gen.o", + "providers/common/der/libcommon-lib-der_ecx_key.o", + "providers/common/der/libcommon-lib-der_ml_dsa_gen.o", + "providers/common/der/libcommon-lib-der_ml_dsa_key.o", + "providers/common/der/libcommon-lib-der_rsa_gen.o", + "providers/common/der/libcommon-lib-der_rsa_key.o", + "providers/common/der/libcommon-lib-der_slh_dsa_gen.o", + "providers/common/der/libcommon-lib-der_slh_dsa_key.o", + "providers/common/der/libcommon-lib-der_wrap_gen.o", + "providers/common/der/libdefault-lib-der_rsa_sig.o", + "providers/common/der/libdefault-lib-der_sm2_gen.o", + "providers/common/der/libdefault-lib-der_sm2_key.o", + "providers/common/der/libdefault-lib-der_sm2_sig.o", + "providers/common/der/libfips-lib-der_rsa_sig.o" + ], + "products" => { + "lib" => [ + "providers/libcommon.a", + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/fips" => { + "deps" => [ + "providers/fips/fips-dso-fips_entry.o", + "providers/fips/libfips-lib-fipsindicator.o", + "providers/fips/libfips-lib-fipsprov.o", + "providers/fips/libfips-lib-self_test.o", + "providers/fips/libfips-lib-self_test_kats.o" + ], + "products" => { + "dso" => [ + "providers/fips" + ], + "lib" => [ + "providers/libfips.a" + ] + } + }, + "providers/implementations/asymciphers" => { + "deps" => [ + "providers/implementations/asymciphers/libdefault-lib-rsa_enc.o", + "providers/implementations/asymciphers/libdefault-lib-sm2_enc.o", + "providers/implementations/asymciphers/libfips-lib-rsa_enc.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/implementations/ciphers" => { + "deps" => [ + "providers/implementations/ciphers/libcommon-lib-ciphercommon.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_block.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_ccm.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_ccm_hw.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_gcm.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_gcm_hw.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha1_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha256_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ccm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ccm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv_polyval.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ocb.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ocb_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_siv.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_siv_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_wrp.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts_fips.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_ccm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_ccm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_gcm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_gcm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_camellia.o", + "providers/implementations/ciphers/libdefault-lib-cipher_camellia_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_poly1305.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_poly1305_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_cts.o", + "providers/implementations/ciphers/libdefault-lib-cipher_null.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_ccm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_ccm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_gcm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_gcm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_xts.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_xts_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_common.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_default.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_default_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_wrap.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_wrap_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha1_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha256_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ccm.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ccm_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_gcm.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_gcm_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ocb.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ocb_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_wrp.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts_fips.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_cts.o", + "providers/implementations/ciphers/libfips-lib-cipher_tdes.o", + "providers/implementations/ciphers/libfips-lib-cipher_tdes_common.o", + "providers/implementations/ciphers/libfips-lib-cipher_tdes_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_blowfish.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_blowfish_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_cast5.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_cast5_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_des.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_des_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_desx.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_desx_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_idea.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_idea_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc2.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc2_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hmac_md5.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hmac_md5_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_seed.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_seed_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_tdes_common.o" + ], + "products" => { + "lib" => [ + "providers/libcommon.a", + "providers/libdefault.a", + "providers/libfips.a", + "providers/liblegacy.a" + ] + } + }, + "providers/implementations/digests" => { + "deps" => [ + "providers/implementations/digests/libcommon-lib-digestcommon.o", + "providers/implementations/digests/libdefault-lib-blake2_prov.o", + "providers/implementations/digests/libdefault-lib-blake2b_prov.o", + "providers/implementations/digests/libdefault-lib-blake2s_prov.o", + "providers/implementations/digests/libdefault-lib-md5_prov.o", + "providers/implementations/digests/libdefault-lib-md5_sha1_prov.o", + "providers/implementations/digests/libdefault-lib-null_prov.o", + "providers/implementations/digests/libdefault-lib-ripemd_prov.o", + "providers/implementations/digests/libdefault-lib-sha2_prov.o", + "providers/implementations/digests/libdefault-lib-sha3_prov.o", + "providers/implementations/digests/libdefault-lib-sm3_prov.o", + "providers/implementations/digests/libfips-lib-sha2_prov.o", + "providers/implementations/digests/libfips-lib-sha3_prov.o", + "providers/implementations/digests/liblegacy-lib-md4_prov.o", + "providers/implementations/digests/liblegacy-lib-mdc2_prov.o", + "providers/implementations/digests/liblegacy-lib-ripemd_prov.o", + "providers/implementations/digests/liblegacy-lib-wp_prov.o" + ], + "products" => { + "lib" => [ + "providers/libcommon.a", + "providers/libdefault.a", + "providers/libfips.a", + "providers/liblegacy.a" + ] + } + }, + "providers/implementations/encode_decode" => { + "deps" => [ + "providers/implementations/encode_decode/libdefault-lib-decode_der2key.o", + "providers/implementations/encode_decode/libdefault-lib-decode_epki2pki.o", + "providers/implementations/encode_decode/libdefault-lib-decode_msblob2key.o", + "providers/implementations/encode_decode/libdefault-lib-decode_pem2der.o", + "providers/implementations/encode_decode/libdefault-lib-decode_pvk2key.o", + "providers/implementations/encode_decode/libdefault-lib-decode_spki2typespki.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2any.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2blob.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2ms.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2text.o", + "providers/implementations/encode_decode/libdefault-lib-endecoder_common.o", + "providers/implementations/encode_decode/libdefault-lib-ml_common_codecs.o", + "providers/implementations/encode_decode/libdefault-lib-ml_dsa_codecs.o", + "providers/implementations/encode_decode/libdefault-lib-ml_kem_codecs.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a" + ] + } + }, + "providers/implementations/exchange" => { + "deps" => [ + "providers/implementations/exchange/libdefault-lib-dh_exch.o", + "providers/implementations/exchange/libdefault-lib-ecdh_exch.o", + "providers/implementations/exchange/libdefault-lib-ecx_exch.o", + "providers/implementations/exchange/libdefault-lib-kdf_exch.o", + "providers/implementations/exchange/libfips-lib-dh_exch.o", + "providers/implementations/exchange/libfips-lib-ecdh_exch.o", + "providers/implementations/exchange/libfips-lib-ecx_exch.o", + "providers/implementations/exchange/libfips-lib-kdf_exch.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/implementations/kdfs" => { + "deps" => [ + "providers/implementations/kdfs/libdefault-lib-argon2.o", + "providers/implementations/kdfs/libdefault-lib-hkdf.o", + "providers/implementations/kdfs/libdefault-lib-hmacdrbg_kdf.o", + "providers/implementations/kdfs/libdefault-lib-kbkdf.o", + "providers/implementations/kdfs/libdefault-lib-krb5kdf.o", + "providers/implementations/kdfs/libdefault-lib-pbkdf2.o", + "providers/implementations/kdfs/libdefault-lib-pbkdf2_fips.o", + "providers/implementations/kdfs/libdefault-lib-pkcs12kdf.o", + "providers/implementations/kdfs/libdefault-lib-scrypt.o", + "providers/implementations/kdfs/libdefault-lib-sshkdf.o", + "providers/implementations/kdfs/libdefault-lib-sskdf.o", + "providers/implementations/kdfs/libdefault-lib-tls1_prf.o", + "providers/implementations/kdfs/libdefault-lib-x942kdf.o", + "providers/implementations/kdfs/libfips-lib-hkdf.o", + "providers/implementations/kdfs/libfips-lib-kbkdf.o", + "providers/implementations/kdfs/libfips-lib-pbkdf2.o", + "providers/implementations/kdfs/libfips-lib-pbkdf2_fips.o", + "providers/implementations/kdfs/libfips-lib-sshkdf.o", + "providers/implementations/kdfs/libfips-lib-sskdf.o", + "providers/implementations/kdfs/libfips-lib-tls1_prf.o", + "providers/implementations/kdfs/libfips-lib-x942kdf.o", + "providers/implementations/kdfs/liblegacy-lib-pbkdf1.o", + "providers/implementations/kdfs/liblegacy-lib-pvkkdf.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a", + "providers/liblegacy.a" + ] + } + }, + "providers/implementations/kem" => { + "deps" => [ + "providers/implementations/kem/libdefault-lib-ec_kem.o", + "providers/implementations/kem/libdefault-lib-ecx_kem.o", + "providers/implementations/kem/libdefault-lib-kem_util.o", + "providers/implementations/kem/libdefault-lib-ml_kem_kem.o", + "providers/implementations/kem/libdefault-lib-mlx_kem.o", + "providers/implementations/kem/libdefault-lib-rsa_kem.o", + "providers/implementations/kem/libfips-lib-ml_kem_kem.o", + "providers/implementations/kem/libfips-lib-mlx_kem.o", + "providers/implementations/kem/libfips-lib-rsa_kem.o", + "providers/implementations/kem/libtemplate-lib-template_kem.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a", + "providers/libtemplate.a" + ] + } + }, + "providers/implementations/keymgmt" => { + "deps" => [ + "providers/implementations/keymgmt/libdefault-lib-dh_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-dsa_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ec_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ecx_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-kdf_legacy_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-mac_legacy_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ml_dsa_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ml_kem_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-mlx_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-rsa_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-slh_dsa_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-dh_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-dsa_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ec_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ecx_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-kdf_legacy_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-mac_legacy_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ml_dsa_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ml_kem_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-mlx_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-rsa_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-slh_dsa_kmgmt.o", + "providers/implementations/keymgmt/libtemplate-lib-template_kmgmt.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a", + "providers/libtemplate.a" + ] + } + }, + "providers/implementations/macs" => { + "deps" => [ + "providers/implementations/macs/libdefault-lib-blake2b_mac.o", + "providers/implementations/macs/libdefault-lib-blake2s_mac.o", + "providers/implementations/macs/libdefault-lib-cmac_prov.o", + "providers/implementations/macs/libdefault-lib-gmac_prov.o", + "providers/implementations/macs/libdefault-lib-hmac_prov.o", + "providers/implementations/macs/libdefault-lib-kmac_prov.o", + "providers/implementations/macs/libdefault-lib-poly1305_prov.o", + "providers/implementations/macs/libdefault-lib-siphash_prov.o", + "providers/implementations/macs/libfips-lib-cmac_prov.o", + "providers/implementations/macs/libfips-lib-gmac_prov.o", + "providers/implementations/macs/libfips-lib-hmac_prov.o", + "providers/implementations/macs/libfips-lib-kmac_prov.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/implementations/rands" => { + "deps" => [ + "providers/implementations/rands/libdefault-lib-drbg.o", + "providers/implementations/rands/libdefault-lib-drbg_ctr.o", + "providers/implementations/rands/libdefault-lib-drbg_hash.o", + "providers/implementations/rands/libdefault-lib-drbg_hmac.o", + "providers/implementations/rands/libdefault-lib-seed_src.o", + "providers/implementations/rands/libdefault-lib-seed_src_jitter.o", + "providers/implementations/rands/libdefault-lib-test_rng.o", + "providers/implementations/rands/libfips-lib-drbg.o", + "providers/implementations/rands/libfips-lib-drbg_ctr.o", + "providers/implementations/rands/libfips-lib-drbg_hash.o", + "providers/implementations/rands/libfips-lib-drbg_hmac.o", + "providers/implementations/rands/libfips-lib-fips_crng_test.o", + "providers/implementations/rands/libfips-lib-test_rng.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/implementations/rands/seeding" => { + "deps" => [ + "providers/implementations/rands/seeding/libdefault-lib-rand_cpu_x86.o", + "providers/implementations/rands/seeding/libdefault-lib-rand_tsc.o", + "providers/implementations/rands/seeding/libdefault-lib-rand_unix.o", + "providers/implementations/rands/seeding/libdefault-lib-rand_win.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a" + ] + } + }, + "providers/implementations/signature" => { + "deps" => [ + "providers/implementations/signature/libdefault-lib-dsa_sig.o", + "providers/implementations/signature/libdefault-lib-ecdsa_sig.o", + "providers/implementations/signature/libdefault-lib-eddsa_sig.o", + "providers/implementations/signature/libdefault-lib-mac_legacy_sig.o", + "providers/implementations/signature/libdefault-lib-ml_dsa_sig.o", + "providers/implementations/signature/libdefault-lib-rsa_sig.o", + "providers/implementations/signature/libdefault-lib-slh_dsa_sig.o", + "providers/implementations/signature/libdefault-lib-sm2_sig.o", + "providers/implementations/signature/libfips-lib-dsa_sig.o", + "providers/implementations/signature/libfips-lib-ecdsa_sig.o", + "providers/implementations/signature/libfips-lib-eddsa_sig.o", + "providers/implementations/signature/libfips-lib-mac_legacy_sig.o", + "providers/implementations/signature/libfips-lib-ml_dsa_sig.o", + "providers/implementations/signature/libfips-lib-rsa_sig.o", + "providers/implementations/signature/libfips-lib-slh_dsa_sig.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/implementations/skeymgmt" => { + "deps" => [ + "providers/implementations/skeymgmt/libdefault-lib-aes_skmgmt.o", + "providers/implementations/skeymgmt/libdefault-lib-generic.o", + "providers/implementations/skeymgmt/libfips-lib-aes_skmgmt.o", + "providers/implementations/skeymgmt/libfips-lib-generic.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "providers/implementations/storemgmt" => { + "deps" => [ + "providers/implementations/storemgmt/libdefault-lib-file_store.o", + "providers/implementations/storemgmt/libdefault-lib-file_store_any2obj.o" + ], + "products" => { + "lib" => [ + "providers/libdefault.a" + ] + } + }, + "ssl" => { + "deps" => [ + "ssl/libssl-lib-bio_ssl.o", + "ssl/libssl-lib-d1_lib.o", + "ssl/libssl-lib-d1_msg.o", + "ssl/libssl-lib-d1_srtp.o", + "ssl/libssl-lib-methods.o", + "ssl/libssl-lib-pqueue.o", + "ssl/libssl-lib-priority_queue.o", + "ssl/libssl-lib-s3_enc.o", + "ssl/libssl-lib-s3_lib.o", + "ssl/libssl-lib-s3_msg.o", + "ssl/libssl-lib-ssl_asn1.o", + "ssl/libssl-lib-ssl_cert.o", + "ssl/libssl-lib-ssl_cert_comp.o", + "ssl/libssl-lib-ssl_ciph.o", + "ssl/libssl-lib-ssl_conf.o", + "ssl/libssl-lib-ssl_err_legacy.o", + "ssl/libssl-lib-ssl_init.o", + "ssl/libssl-lib-ssl_lib.o", + "ssl/libssl-lib-ssl_mcnf.o", + "ssl/libssl-lib-ssl_rsa.o", + "ssl/libssl-lib-ssl_rsa_legacy.o", + "ssl/libssl-lib-ssl_sess.o", + "ssl/libssl-lib-ssl_stat.o", + "ssl/libssl-lib-ssl_txt.o", + "ssl/libssl-lib-ssl_utst.o", + "ssl/libssl-lib-t1_enc.o", + "ssl/libssl-lib-t1_lib.o", + "ssl/libssl-lib-t1_trce.o", + "ssl/libssl-lib-tls13_enc.o", + "ssl/libssl-lib-tls_depr.o", + "ssl/libssl-lib-tls_srp.o" + ], + "products" => { + "lib" => [ + "libssl" + ] + } + }, + "ssl/quic" => { + "deps" => [ + "ssl/quic/libssl-lib-cc_newreno.o", + "ssl/quic/libssl-lib-json_enc.o", + "ssl/quic/libssl-lib-qlog.o", + "ssl/quic/libssl-lib-qlog_event_helpers.o", + "ssl/quic/libssl-lib-quic_ackm.o", + "ssl/quic/libssl-lib-quic_cfq.o", + "ssl/quic/libssl-lib-quic_channel.o", + "ssl/quic/libssl-lib-quic_demux.o", + "ssl/quic/libssl-lib-quic_engine.o", + "ssl/quic/libssl-lib-quic_fc.o", + "ssl/quic/libssl-lib-quic_fifd.o", + "ssl/quic/libssl-lib-quic_impl.o", + "ssl/quic/libssl-lib-quic_lcidm.o", + "ssl/quic/libssl-lib-quic_method.o", + "ssl/quic/libssl-lib-quic_obj.o", + "ssl/quic/libssl-lib-quic_port.o", + "ssl/quic/libssl-lib-quic_rcidm.o", + "ssl/quic/libssl-lib-quic_reactor.o", + "ssl/quic/libssl-lib-quic_reactor_wait_ctx.o", + "ssl/quic/libssl-lib-quic_record_rx.o", + "ssl/quic/libssl-lib-quic_record_shared.o", + "ssl/quic/libssl-lib-quic_record_tx.o", + "ssl/quic/libssl-lib-quic_record_util.o", + "ssl/quic/libssl-lib-quic_rstream.o", + "ssl/quic/libssl-lib-quic_rx_depack.o", + "ssl/quic/libssl-lib-quic_sf_list.o", + "ssl/quic/libssl-lib-quic_srt_gen.o", + "ssl/quic/libssl-lib-quic_srtm.o", + "ssl/quic/libssl-lib-quic_sstream.o", + "ssl/quic/libssl-lib-quic_statm.o", + "ssl/quic/libssl-lib-quic_stream_map.o", + "ssl/quic/libssl-lib-quic_thread_assist.o", + "ssl/quic/libssl-lib-quic_tls.o", + "ssl/quic/libssl-lib-quic_tls_api.o", + "ssl/quic/libssl-lib-quic_trace.o", + "ssl/quic/libssl-lib-quic_tserver.o", + "ssl/quic/libssl-lib-quic_txp.o", + "ssl/quic/libssl-lib-quic_txpim.o", + "ssl/quic/libssl-lib-quic_types.o", + "ssl/quic/libssl-lib-quic_wire.o", + "ssl/quic/libssl-lib-quic_wire_pkt.o", + "ssl/quic/libssl-lib-uint_set.o" + ], + "products" => { + "lib" => [ + "libssl" + ] + } + }, + "ssl/record" => { + "deps" => [ + "ssl/record/libssl-lib-rec_layer_d1.o", + "ssl/record/libssl-lib-rec_layer_s3.o" + ], + "products" => { + "lib" => [ + "libssl" + ] + } + }, + "ssl/record/methods" => { + "deps" => [ + "ssl/record/methods/libssl-lib-dtls_meth.o", + "ssl/record/methods/libssl-lib-ssl3_meth.o", + "ssl/record/methods/libssl-lib-tls13_meth.o", + "ssl/record/methods/libssl-lib-tls1_meth.o", + "ssl/record/methods/libssl-lib-tls_common.o", + "ssl/record/methods/libssl-lib-tls_multib.o", + "ssl/record/methods/libssl-lib-tlsany_meth.o", + "ssl/record/methods/libcommon-lib-tls_pad.o", + "ssl/record/methods/libdefault-lib-ssl3_cbc.o", + "ssl/record/methods/libfips-lib-ssl3_cbc.o" + ], + "products" => { + "lib" => [ + "libssl", + "providers/libcommon.a", + "providers/libdefault.a", + "providers/libfips.a" + ] + } + }, + "ssl/rio" => { + "deps" => [ + "ssl/rio/libssl-lib-poll_builder.o", + "ssl/rio/libssl-lib-poll_immediate.o", + "ssl/rio/libssl-lib-rio_notifier.o" + ], + "products" => { + "lib" => [ + "libssl" + ] + } + }, + "ssl/statem" => { + "deps" => [ + "ssl/statem/libssl-lib-extensions.o", + "ssl/statem/libssl-lib-extensions_clnt.o", + "ssl/statem/libssl-lib-extensions_cust.o", + "ssl/statem/libssl-lib-extensions_srvr.o", + "ssl/statem/libssl-lib-statem.o", + "ssl/statem/libssl-lib-statem_clnt.o", + "ssl/statem/libssl-lib-statem_dtls.o", + "ssl/statem/libssl-lib-statem_lib.o", + "ssl/statem/libssl-lib-statem_srvr.o" + ], + "products" => { + "lib" => [ + "libssl" + ] + } + }, + "tools" => { + "products" => { + "script" => [ + "tools/c_rehash" + ] + } + }, + "util" => { + "products" => { + "script" => [ + "util/shlib_wrap.sh", + "util/wrap.pl" + ] + } + } + }, + "generate" => { + "OpenSSLConfig.cmake" => [ + "exporters/cmake/OpenSSLConfig.cmake.in" + ], + "OpenSSLConfigVersion.cmake" => [ + "exporters/cmake/OpenSSLConfigVersion.cmake.in" + ], + "apps/progs.c" => [ + "apps/progs.pl", + "\"-C\"", + "\$(APPS_OPENSSL)" + ], + "apps/progs.h" => [ + "apps/progs.pl", + "\"-H\"", + "\$(APPS_OPENSSL)" + ], + "builddata.pm" => [ + "util/mkinstallvars.pl", + "COMMENT=\"This", + "file", + "should", + "be", + "used", + "when", + "building", + "against", + "this", + "OpenSSL", + "build,", + "and", + "should", + "never", + "be", + "installed\"", + "PREFIX=.", + "BINDIR=apps", + "APPLINKDIR=ms", + "LIBDIR=", + "INCLUDEDIR=include", + "\"INCLUDEDIR=\$(SRCDIR)/include\"", + "ENGINESDIR=engines", + "MODULESDIR=providers", + "\"VERSION=\$(VERSION)\"", + "\"LDLIBS=\$(LIB_EX_LIBS)\"" + ], + "crypto/aes/aes-586.S" => [ + "crypto/aes/asm/aes-586.pl" + ], + "crypto/aes/aes-armv4.S" => [ + "crypto/aes/asm/aes-armv4.pl" + ], + "crypto/aes/aes-c64xplus.S" => [ + "crypto/aes/asm/aes-c64xplus.pl" + ], + "crypto/aes/aes-ia64.s" => [ + "crypto/aes/asm/aes-ia64.S" + ], + "crypto/aes/aes-mips.S" => [ + "crypto/aes/asm/aes-mips.pl" + ], + "crypto/aes/aes-parisc.s" => [ + "crypto/aes/asm/aes-parisc.pl" + ], + "crypto/aes/aes-ppc.s" => [ + "crypto/aes/asm/aes-ppc.pl" + ], + "crypto/aes/aes-riscv32-zkn.s" => [ + "crypto/aes/asm/aes-riscv32-zkn.pl" + ], + "crypto/aes/aes-riscv64-zkn.s" => [ + "crypto/aes/asm/aes-riscv64-zkn.pl" + ], + "crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s" => [ + "crypto/aes/asm/aes-riscv64-zvbb-zvkg-zvkned.pl" + ], + "crypto/aes/aes-riscv64-zvkb-zvkned.s" => [ + "crypto/aes/asm/aes-riscv64-zvkb-zvkned.pl" + ], + "crypto/aes/aes-riscv64-zvkned.s" => [ + "crypto/aes/asm/aes-riscv64-zvkned.pl" + ], + "crypto/aes/aes-riscv64.s" => [ + "crypto/aes/asm/aes-riscv64.pl" + ], + "crypto/aes/aes-s390x.S" => [ + "crypto/aes/asm/aes-s390x.pl" + ], + "crypto/aes/aes-sparcv9.S" => [ + "crypto/aes/asm/aes-sparcv9.pl" + ], + "crypto/aes/aes-x86_64.s" => [ + "crypto/aes/asm/aes-x86_64.pl" + ], + "crypto/aes/aesfx-sparcv9.S" => [ + "crypto/aes/asm/aesfx-sparcv9.pl" + ], + "crypto/aes/aesni-mb-x86_64.s" => [ + "crypto/aes/asm/aesni-mb-x86_64.pl" + ], + "crypto/aes/aesni-sha1-x86_64.s" => [ + "crypto/aes/asm/aesni-sha1-x86_64.pl" + ], + "crypto/aes/aesni-sha256-x86_64.s" => [ + "crypto/aes/asm/aesni-sha256-x86_64.pl" + ], + "crypto/aes/aesni-x86.S" => [ + "crypto/aes/asm/aesni-x86.pl" + ], + "crypto/aes/aesni-x86_64.s" => [ + "crypto/aes/asm/aesni-x86_64.pl" + ], + "crypto/aes/aesni-xts-avx512.s" => [ + "crypto/aes/asm/aesni-xts-avx512.pl" + ], + "crypto/aes/aesp8-ppc.s" => [ + "crypto/aes/asm/aesp8-ppc.pl" + ], + "crypto/aes/aest4-sparcv9.S" => [ + "crypto/aes/asm/aest4-sparcv9.pl" + ], + "crypto/aes/aesv8-armx.S" => [ + "crypto/aes/asm/aesv8-armx.pl" + ], + "crypto/aes/bsaes-armv7.S" => [ + "crypto/aes/asm/bsaes-armv7.pl" + ], + "crypto/aes/bsaes-armv8.S" => [ + "crypto/aes/asm/bsaes-armv8.pl" + ], + "crypto/aes/bsaes-x86_64.s" => [ + "crypto/aes/asm/bsaes-x86_64.pl" + ], + "crypto/aes/vpaes-armv8.S" => [ + "crypto/aes/asm/vpaes-armv8.pl" + ], + "crypto/aes/vpaes-loongarch64.S" => [ + "crypto/aes/asm/vpaes-loongarch64.pl" + ], + "crypto/aes/vpaes-ppc.s" => [ + "crypto/aes/asm/vpaes-ppc.pl" + ], + "crypto/aes/vpaes-x86.S" => [ + "crypto/aes/asm/vpaes-x86.pl" + ], + "crypto/aes/vpaes-x86_64.s" => [ + "crypto/aes/asm/vpaes-x86_64.pl" + ], + "crypto/alphacpuid.s" => [ + "crypto/alphacpuid.pl" + ], + "crypto/arm64cpuid.S" => [ + "crypto/arm64cpuid.pl" + ], + "crypto/armv4cpuid.S" => [ + "crypto/armv4cpuid.pl" + ], + "crypto/bf/bf-586.S" => [ + "crypto/bf/asm/bf-586.pl" + ], + "crypto/bn/alpha-mont.S" => [ + "crypto/bn/asm/alpha-mont.pl" + ], + "crypto/bn/armv4-gf2m.S" => [ + "crypto/bn/asm/armv4-gf2m.pl" + ], + "crypto/bn/armv4-mont.S" => [ + "crypto/bn/asm/armv4-mont.pl" + ], + "crypto/bn/armv8-mont.S" => [ + "crypto/bn/asm/armv8-mont.pl" + ], + "crypto/bn/bn-586.S" => [ + "crypto/bn/asm/bn-586.pl" + ], + "crypto/bn/bn-ia64.s" => [ + "crypto/bn/asm/ia64.S" + ], + "crypto/bn/bn-mips.S" => [ + "crypto/bn/asm/mips.pl" + ], + "crypto/bn/bn-ppc.s" => [ + "crypto/bn/asm/ppc.pl" + ], + "crypto/bn/co-586.S" => [ + "crypto/bn/asm/co-586.pl" + ], + "crypto/bn/ia64-mont.s" => [ + "crypto/bn/asm/ia64-mont.pl" + ], + "crypto/bn/mips-mont.S" => [ + "crypto/bn/asm/mips-mont.pl" + ], + "crypto/bn/parisc-mont.s" => [ + "crypto/bn/asm/parisc-mont.pl" + ], + "crypto/bn/ppc-mont.s" => [ + "crypto/bn/asm/ppc-mont.pl" + ], + "crypto/bn/ppc64-mont-fixed.s" => [ + "crypto/bn/asm/ppc64-mont-fixed.pl" + ], + "crypto/bn/ppc64-mont.s" => [ + "crypto/bn/asm/ppc64-mont.pl" + ], + "crypto/bn/rsaz-2k-avx512.s" => [ + "crypto/bn/asm/rsaz-2k-avx512.pl" + ], + "crypto/bn/rsaz-2k-avxifma.s" => [ + "crypto/bn/asm/rsaz-2k-avxifma.pl" + ], + "crypto/bn/rsaz-3k-avx512.s" => [ + "crypto/bn/asm/rsaz-3k-avx512.pl" + ], + "crypto/bn/rsaz-3k-avxifma.s" => [ + "crypto/bn/asm/rsaz-3k-avxifma.pl" + ], + "crypto/bn/rsaz-4k-avx512.s" => [ + "crypto/bn/asm/rsaz-4k-avx512.pl" + ], + "crypto/bn/rsaz-4k-avxifma.s" => [ + "crypto/bn/asm/rsaz-4k-avxifma.pl" + ], + "crypto/bn/rsaz-avx2.s" => [ + "crypto/bn/asm/rsaz-avx2.pl" + ], + "crypto/bn/rsaz-x86_64.s" => [ + "crypto/bn/asm/rsaz-x86_64.pl" + ], + "crypto/bn/s390x-gf2m.s" => [ + "crypto/bn/asm/s390x-gf2m.pl" + ], + "crypto/bn/s390x-mont.S" => [ + "crypto/bn/asm/s390x-mont.pl" + ], + "crypto/bn/sparct4-mont.S" => [ + "crypto/bn/asm/sparct4-mont.pl" + ], + "crypto/bn/sparcv9-gf2m.S" => [ + "crypto/bn/asm/sparcv9-gf2m.pl" + ], + "crypto/bn/sparcv9-mont.S" => [ + "crypto/bn/asm/sparcv9-mont.pl" + ], + "crypto/bn/sparcv9a-mont.S" => [ + "crypto/bn/asm/sparcv9a-mont.pl" + ], + "crypto/bn/vis3-mont.S" => [ + "crypto/bn/asm/vis3-mont.pl" + ], + "crypto/bn/x86-gf2m.S" => [ + "crypto/bn/asm/x86-gf2m.pl" + ], + "crypto/bn/x86-mont.S" => [ + "crypto/bn/asm/x86-mont.pl" + ], + "crypto/bn/x86_64-gf2m.s" => [ + "crypto/bn/asm/x86_64-gf2m.pl" + ], + "crypto/bn/x86_64-mont.s" => [ + "crypto/bn/asm/x86_64-mont.pl" + ], + "crypto/bn/x86_64-mont5.s" => [ + "crypto/bn/asm/x86_64-mont5.pl" + ], + "crypto/buildinf.h" => [ + "util/mkbuildinf.pl", + "\"\$(CC)", + "\$(LIB_CFLAGS)", + "\$(CPPFLAGS_Q)\"", + "\"\$(PLATFORM)\"" + ], + "crypto/camellia/cmll-x86.S" => [ + "crypto/camellia/asm/cmll-x86.pl" + ], + "crypto/camellia/cmll-x86_64.s" => [ + "crypto/camellia/asm/cmll-x86_64.pl" + ], + "crypto/camellia/cmllt4-sparcv9.S" => [ + "crypto/camellia/asm/cmllt4-sparcv9.pl" + ], + "crypto/cast/cast-586.S" => [ + "crypto/cast/asm/cast-586.pl" + ], + "crypto/chacha/chacha-armv4.S" => [ + "crypto/chacha/asm/chacha-armv4.pl" + ], + "crypto/chacha/chacha-armv8-sve.S" => [ + "crypto/chacha/asm/chacha-armv8-sve.pl" + ], + "crypto/chacha/chacha-armv8.S" => [ + "crypto/chacha/asm/chacha-armv8.pl" + ], + "crypto/chacha/chacha-c64xplus.S" => [ + "crypto/chacha/asm/chacha-c64xplus.pl" + ], + "crypto/chacha/chacha-ia64.S" => [ + "crypto/chacha/asm/chacha-ia64.pl" + ], + "crypto/chacha/chacha-ia64.s" => [ + "crypto/chacha/chacha-ia64.S" + ], + "crypto/chacha/chacha-loongarch64.S" => [ + "crypto/chacha/asm/chacha-loongarch64.pl" + ], + "crypto/chacha/chacha-ppc.s" => [ + "crypto/chacha/asm/chacha-ppc.pl" + ], + "crypto/chacha/chacha-riscv64-v-zbb-zvkb.s" => [ + "crypto/chacha/asm/chacha-riscv64-v-zbb.pl", + "zvkb" + ], + "crypto/chacha/chacha-riscv64-v-zbb.s" => [ + "crypto/chacha/asm/chacha-riscv64-v-zbb.pl" + ], + "crypto/chacha/chacha-s390x.S" => [ + "crypto/chacha/asm/chacha-s390x.pl" + ], + "crypto/chacha/chacha-x86.S" => [ + "crypto/chacha/asm/chacha-x86.pl" + ], + "crypto/chacha/chacha-x86_64.s" => [ + "crypto/chacha/asm/chacha-x86_64.pl" + ], + "crypto/chacha/chachap10-ppc.s" => [ + "crypto/chacha/asm/chachap10-ppc.pl" + ], + "crypto/des/crypt586.S" => [ + "crypto/des/asm/crypt586.pl" + ], + "crypto/des/des-586.S" => [ + "crypto/des/asm/des-586.pl" + ], + "crypto/des/des_enc-sparc.S" => [ + "crypto/des/asm/des_enc.m4" + ], + "crypto/des/dest4-sparcv9.S" => [ + "crypto/des/asm/dest4-sparcv9.pl" + ], + "crypto/ec/ecp_nistp384-ppc64.s" => [ + "crypto/ec/asm/ecp_nistp384-ppc64.pl" + ], + "crypto/ec/ecp_nistp521-ppc64.s" => [ + "crypto/ec/asm/ecp_nistp521-ppc64.pl" + ], + "crypto/ec/ecp_nistz256-armv4.S" => [ + "crypto/ec/asm/ecp_nistz256-armv4.pl" + ], + "crypto/ec/ecp_nistz256-armv8.S" => [ + "crypto/ec/asm/ecp_nistz256-armv8.pl" + ], + "crypto/ec/ecp_nistz256-avx2.s" => [ + "crypto/ec/asm/ecp_nistz256-avx2.pl" + ], + "crypto/ec/ecp_nistz256-ppc64.s" => [ + "crypto/ec/asm/ecp_nistz256-ppc64.pl" + ], + "crypto/ec/ecp_nistz256-sparcv9.S" => [ + "crypto/ec/asm/ecp_nistz256-sparcv9.pl" + ], + "crypto/ec/ecp_nistz256-x86.S" => [ + "crypto/ec/asm/ecp_nistz256-x86.pl" + ], + "crypto/ec/ecp_nistz256-x86_64.s" => [ + "crypto/ec/asm/ecp_nistz256-x86_64.pl" + ], + "crypto/ec/ecp_sm2p256-armv8.S" => [ + "crypto/ec/asm/ecp_sm2p256-armv8.pl" + ], + "crypto/ec/x25519-ppc64.s" => [ + "crypto/ec/asm/x25519-ppc64.pl" + ], + "crypto/ec/x25519-x86_64.s" => [ + "crypto/ec/asm/x25519-x86_64.pl" + ], + "crypto/ia64cpuid.s" => [ + "crypto/ia64cpuid.S" + ], + "crypto/loongarch64cpuid.s" => [ + "crypto/loongarch64cpuid.pl" + ], + "crypto/md5/md5-586.S" => [ + "crypto/md5/asm/md5-586.pl" + ], + "crypto/md5/md5-aarch64.S" => [ + "crypto/md5/asm/md5-aarch64.pl" + ], + "crypto/md5/md5-loongarch64.S" => [ + "crypto/md5/asm/md5-loongarch64.pl" + ], + "crypto/md5/md5-sparcv9.S" => [ + "crypto/md5/asm/md5-sparcv9.pl" + ], + "crypto/md5/md5-x86_64.s" => [ + "crypto/md5/asm/md5-x86_64.pl" + ], + "crypto/modes/aes-gcm-armv8-unroll8_64.S" => [ + "crypto/modes/asm/aes-gcm-armv8-unroll8_64.pl" + ], + "crypto/modes/aes-gcm-armv8_64.S" => [ + "crypto/modes/asm/aes-gcm-armv8_64.pl" + ], + "crypto/modes/aes-gcm-avx512.s" => [ + "crypto/modes/asm/aes-gcm-avx512.pl" + ], + "crypto/modes/aes-gcm-ppc.s" => [ + "crypto/modes/asm/aes-gcm-ppc.pl" + ], + "crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s" => [ + "crypto/modes/asm/aes-gcm-riscv64-zvkb-zvkg-zvkned.pl" + ], + "crypto/modes/aesni-gcm-x86_64.s" => [ + "crypto/modes/asm/aesni-gcm-x86_64.pl" + ], + "crypto/modes/ghash-alpha.S" => [ + "crypto/modes/asm/ghash-alpha.pl" + ], + "crypto/modes/ghash-armv4.S" => [ + "crypto/modes/asm/ghash-armv4.pl" + ], + "crypto/modes/ghash-c64xplus.S" => [ + "crypto/modes/asm/ghash-c64xplus.pl" + ], + "crypto/modes/ghash-ia64.s" => [ + "crypto/modes/asm/ghash-ia64.pl" + ], + "crypto/modes/ghash-parisc.s" => [ + "crypto/modes/asm/ghash-parisc.pl" + ], + "crypto/modes/ghash-riscv64-zvkb-zvbc.s" => [ + "crypto/modes/asm/ghash-riscv64-zvkb-zvbc.pl" + ], + "crypto/modes/ghash-riscv64-zvkg.s" => [ + "crypto/modes/asm/ghash-riscv64-zvkg.pl" + ], + "crypto/modes/ghash-riscv64.s" => [ + "crypto/modes/asm/ghash-riscv64.pl" + ], + "crypto/modes/ghash-s390x.S" => [ + "crypto/modes/asm/ghash-s390x.pl" + ], + "crypto/modes/ghash-sparcv9.S" => [ + "crypto/modes/asm/ghash-sparcv9.pl" + ], + "crypto/modes/ghash-x86.S" => [ + "crypto/modes/asm/ghash-x86.pl" + ], + "crypto/modes/ghash-x86_64.s" => [ + "crypto/modes/asm/ghash-x86_64.pl" + ], + "crypto/modes/ghashp8-ppc.s" => [ + "crypto/modes/asm/ghashp8-ppc.pl" + ], + "crypto/modes/ghashv8-armx.S" => [ + "crypto/modes/asm/ghashv8-armx.pl" + ], + "crypto/params_idx.c" => [ + "crypto/params_idx.c.in" + ], + "crypto/pariscid.s" => [ + "crypto/pariscid.pl" + ], + "crypto/poly1305/poly1305-armv4.S" => [ + "crypto/poly1305/asm/poly1305-armv4.pl" + ], + "crypto/poly1305/poly1305-armv8.S" => [ + "crypto/poly1305/asm/poly1305-armv8.pl" + ], + "crypto/poly1305/poly1305-c64xplus.S" => [ + "crypto/poly1305/asm/poly1305-c64xplus.pl" + ], + "crypto/poly1305/poly1305-ia64.s" => [ + "crypto/poly1305/asm/poly1305-ia64.S" + ], + "crypto/poly1305/poly1305-mips.S" => [ + "crypto/poly1305/asm/poly1305-mips.pl" + ], + "crypto/poly1305/poly1305-ppc.s" => [ + "crypto/poly1305/asm/poly1305-ppc.pl" + ], + "crypto/poly1305/poly1305-ppcfp.s" => [ + "crypto/poly1305/asm/poly1305-ppcfp.pl" + ], + "crypto/poly1305/poly1305-s390x.S" => [ + "crypto/poly1305/asm/poly1305-s390x.pl" + ], + "crypto/poly1305/poly1305-sparcv9.S" => [ + "crypto/poly1305/asm/poly1305-sparcv9.pl" + ], + "crypto/poly1305/poly1305-x86.S" => [ + "crypto/poly1305/asm/poly1305-x86.pl" + ], + "crypto/poly1305/poly1305-x86_64.s" => [ + "crypto/poly1305/asm/poly1305-x86_64.pl" + ], + "crypto/ppccpuid.s" => [ + "crypto/ppccpuid.pl" + ], + "crypto/rc4/rc4-586.S" => [ + "crypto/rc4/asm/rc4-586.pl" + ], + "crypto/rc4/rc4-c64xplus.s" => [ + "crypto/rc4/asm/rc4-c64xplus.pl" + ], + "crypto/rc4/rc4-md5-x86_64.s" => [ + "crypto/rc4/asm/rc4-md5-x86_64.pl" + ], + "crypto/rc4/rc4-parisc.s" => [ + "crypto/rc4/asm/rc4-parisc.pl" + ], + "crypto/rc4/rc4-s390x.s" => [ + "crypto/rc4/asm/rc4-s390x.pl" + ], + "crypto/rc4/rc4-x86_64.s" => [ + "crypto/rc4/asm/rc4-x86_64.pl" + ], + "crypto/ripemd/rmd-586.S" => [ + "crypto/ripemd/asm/rmd-586.pl" + ], + "crypto/riscv32cpuid.s" => [ + "crypto/riscv32cpuid.pl" + ], + "crypto/riscv64cpuid.s" => [ + "crypto/riscv64cpuid.pl" + ], + "crypto/s390xcpuid.S" => [ + "crypto/s390xcpuid.pl" + ], + "crypto/sha/keccak1600-armv4.S" => [ + "crypto/sha/asm/keccak1600-armv4.pl" + ], + "crypto/sha/keccak1600-armv8.S" => [ + "crypto/sha/asm/keccak1600-armv8.pl" + ], + "crypto/sha/keccak1600-avx2.S" => [ + "crypto/sha/asm/keccak1600-avx2.pl" + ], + "crypto/sha/keccak1600-avx512.S" => [ + "crypto/sha/asm/keccak1600-avx512.pl" + ], + "crypto/sha/keccak1600-avx512vl.S" => [ + "crypto/sha/asm/keccak1600-avx512vl.pl" + ], + "crypto/sha/keccak1600-c64x.S" => [ + "crypto/sha/asm/keccak1600-c64x.pl" + ], + "crypto/sha/keccak1600-mmx.S" => [ + "crypto/sha/asm/keccak1600-mmx.pl" + ], + "crypto/sha/keccak1600-ppc64.s" => [ + "crypto/sha/asm/keccak1600-ppc64.pl" + ], + "crypto/sha/keccak1600-s390x.S" => [ + "crypto/sha/asm/keccak1600-s390x.pl" + ], + "crypto/sha/keccak1600-x86_64.s" => [ + "crypto/sha/asm/keccak1600-x86_64.pl" + ], + "crypto/sha/keccak1600p8-ppc.S" => [ + "crypto/sha/asm/keccak1600p8-ppc.pl" + ], + "crypto/sha/sha1-586.S" => [ + "crypto/sha/asm/sha1-586.pl" + ], + "crypto/sha/sha1-alpha.S" => [ + "crypto/sha/asm/sha1-alpha.pl" + ], + "crypto/sha/sha1-armv4-large.S" => [ + "crypto/sha/asm/sha1-armv4-large.pl" + ], + "crypto/sha/sha1-armv8.S" => [ + "crypto/sha/asm/sha1-armv8.pl" + ], + "crypto/sha/sha1-c64xplus.S" => [ + "crypto/sha/asm/sha1-c64xplus.pl" + ], + "crypto/sha/sha1-ia64.s" => [ + "crypto/sha/asm/sha1-ia64.pl" + ], + "crypto/sha/sha1-mb-x86_64.s" => [ + "crypto/sha/asm/sha1-mb-x86_64.pl" + ], + "crypto/sha/sha1-mips.S" => [ + "crypto/sha/asm/sha1-mips.pl" + ], + "crypto/sha/sha1-parisc.s" => [ + "crypto/sha/asm/sha1-parisc.pl" + ], + "crypto/sha/sha1-ppc.s" => [ + "crypto/sha/asm/sha1-ppc.pl" + ], + "crypto/sha/sha1-s390x.S" => [ + "crypto/sha/asm/sha1-s390x.pl" + ], + "crypto/sha/sha1-sparcv9.S" => [ + "crypto/sha/asm/sha1-sparcv9.pl" + ], + "crypto/sha/sha1-sparcv9a.S" => [ + "crypto/sha/asm/sha1-sparcv9a.pl" + ], + "crypto/sha/sha1-thumb.S" => [ + "crypto/sha/asm/sha1-thumb.pl" + ], + "crypto/sha/sha1-x86_64.s" => [ + "crypto/sha/asm/sha1-x86_64.pl" + ], + "crypto/sha/sha256-586.S" => [ + "crypto/sha/asm/sha256-586.pl" + ], + "crypto/sha/sha256-armv4.S" => [ + "crypto/sha/asm/sha256-armv4.pl" + ], + "crypto/sha/sha256-armv8.S" => [ + "crypto/sha/asm/sha512-armv8.pl" + ], + "crypto/sha/sha256-c64xplus.S" => [ + "crypto/sha/asm/sha256-c64xplus.pl" + ], + "crypto/sha/sha256-ia64.s" => [ + "crypto/sha/asm/sha512-ia64.pl" + ], + "crypto/sha/sha256-mb-x86_64.s" => [ + "crypto/sha/asm/sha256-mb-x86_64.pl" + ], + "crypto/sha/sha256-mips.S" => [ + "crypto/sha/asm/sha512-mips.pl" + ], + "crypto/sha/sha256-parisc.s" => [ + "crypto/sha/asm/sha512-parisc.pl" + ], + "crypto/sha/sha256-ppc.s" => [ + "crypto/sha/asm/sha512-ppc.pl" + ], + "crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S" => [ + "crypto/sha/asm/sha256-riscv64-zvkb-zvknha_or_zvknhb.pl" + ], + "crypto/sha/sha256-s390x.S" => [ + "crypto/sha/asm/sha512-s390x.pl" + ], + "crypto/sha/sha256-sparcv9.S" => [ + "crypto/sha/asm/sha512-sparcv9.pl" + ], + "crypto/sha/sha256-x86_64.s" => [ + "crypto/sha/asm/sha512-x86_64.pl" + ], + "crypto/sha/sha256p8-ppc.s" => [ + "crypto/sha/asm/sha512p8-ppc.pl" + ], + "crypto/sha/sha512-586.S" => [ + "crypto/sha/asm/sha512-586.pl" + ], + "crypto/sha/sha512-armv4.S" => [ + "crypto/sha/asm/sha512-armv4.pl" + ], + "crypto/sha/sha512-armv8.S" => [ + "crypto/sha/asm/sha512-armv8.pl" + ], + "crypto/sha/sha512-c64xplus.S" => [ + "crypto/sha/asm/sha512-c64xplus.pl" + ], + "crypto/sha/sha512-ia64.s" => [ + "crypto/sha/asm/sha512-ia64.pl" + ], + "crypto/sha/sha512-mips.S" => [ + "crypto/sha/asm/sha512-mips.pl" + ], + "crypto/sha/sha512-parisc.s" => [ + "crypto/sha/asm/sha512-parisc.pl" + ], + "crypto/sha/sha512-ppc.s" => [ + "crypto/sha/asm/sha512-ppc.pl" + ], + "crypto/sha/sha512-riscv64-zvkb-zvknhb.S" => [ + "crypto/sha/asm/sha512-riscv64-zvkb-zvknhb.pl" + ], + "crypto/sha/sha512-s390x.S" => [ + "crypto/sha/asm/sha512-s390x.pl" + ], + "crypto/sha/sha512-sparcv9.S" => [ + "crypto/sha/asm/sha512-sparcv9.pl" + ], + "crypto/sha/sha512-x86_64.s" => [ + "crypto/sha/asm/sha512-x86_64.pl" + ], + "crypto/sha/sha512p8-ppc.s" => [ + "crypto/sha/asm/sha512p8-ppc.pl" + ], + "crypto/sm3/sm3-armv8.S" => [ + "crypto/sm3/asm/sm3-armv8.pl" + ], + "crypto/sm3/sm3-riscv64-zvksh.S" => [ + "crypto/sm3/asm/sm3-riscv64-zvksh.pl" + ], + "crypto/sm4/sm4-armv8.S" => [ + "crypto/sm4/asm/sm4-armv8.pl" + ], + "crypto/sm4/sm4-riscv64-zvksed.s" => [ + "crypto/sm4/asm/sm4-riscv64-zvksed.pl" + ], + "crypto/sm4/vpsm4-armv8.S" => [ + "crypto/sm4/asm/vpsm4-armv8.pl" + ], + "crypto/sm4/vpsm4_ex-armv8.S" => [ + "crypto/sm4/asm/vpsm4_ex-armv8.pl" + ], + "crypto/uplink-ia64.s" => [ + "ms/uplink-ia64.pl" + ], + "crypto/uplink-x86.S" => [ + "ms/uplink-x86.pl" + ], + "crypto/uplink-x86_64.s" => [ + "ms/uplink-x86_64.pl" + ], + "crypto/whrlpool/wp-mmx.S" => [ + "crypto/whrlpool/asm/wp-mmx.pl" + ], + "crypto/whrlpool/wp-x86_64.s" => [ + "crypto/whrlpool/asm/wp-x86_64.pl" + ], + "crypto/x86_64cpuid.s" => [ + "crypto/x86_64cpuid.pl" + ], + "crypto/x86cpuid.S" => [ + "crypto/x86cpuid.pl" + ], + "doc/html/man1/CA.pl.html" => [ + "doc/man1/CA.pl.pod" + ], + "doc/html/man1/openssl-asn1parse.html" => [ + "doc/man1/openssl-asn1parse.pod" + ], + "doc/html/man1/openssl-ca.html" => [ + "doc/man1/openssl-ca.pod" + ], + "doc/html/man1/openssl-ciphers.html" => [ + "doc/man1/openssl-ciphers.pod" + ], + "doc/html/man1/openssl-cmds.html" => [ + "doc/man1/openssl-cmds.pod" + ], + "doc/html/man1/openssl-cmp.html" => [ + "doc/man1/openssl-cmp.pod" + ], + "doc/html/man1/openssl-cms.html" => [ + "doc/man1/openssl-cms.pod" + ], + "doc/html/man1/openssl-crl.html" => [ + "doc/man1/openssl-crl.pod" + ], + "doc/html/man1/openssl-crl2pkcs7.html" => [ + "doc/man1/openssl-crl2pkcs7.pod" + ], + "doc/html/man1/openssl-dgst.html" => [ + "doc/man1/openssl-dgst.pod" + ], + "doc/html/man1/openssl-dhparam.html" => [ + "doc/man1/openssl-dhparam.pod" + ], + "doc/html/man1/openssl-dsa.html" => [ + "doc/man1/openssl-dsa.pod" + ], + "doc/html/man1/openssl-dsaparam.html" => [ + "doc/man1/openssl-dsaparam.pod" + ], + "doc/html/man1/openssl-ec.html" => [ + "doc/man1/openssl-ec.pod" + ], + "doc/html/man1/openssl-ecparam.html" => [ + "doc/man1/openssl-ecparam.pod" + ], + "doc/html/man1/openssl-enc.html" => [ + "doc/man1/openssl-enc.pod" + ], + "doc/html/man1/openssl-engine.html" => [ + "doc/man1/openssl-engine.pod" + ], + "doc/html/man1/openssl-errstr.html" => [ + "doc/man1/openssl-errstr.pod" + ], + "doc/html/man1/openssl-fipsinstall.html" => [ + "doc/man1/openssl-fipsinstall.pod" + ], + "doc/html/man1/openssl-format-options.html" => [ + "doc/man1/openssl-format-options.pod" + ], + "doc/html/man1/openssl-gendsa.html" => [ + "doc/man1/openssl-gendsa.pod" + ], + "doc/html/man1/openssl-genpkey.html" => [ + "doc/man1/openssl-genpkey.pod" + ], + "doc/html/man1/openssl-genrsa.html" => [ + "doc/man1/openssl-genrsa.pod" + ], + "doc/html/man1/openssl-info.html" => [ + "doc/man1/openssl-info.pod" + ], + "doc/html/man1/openssl-kdf.html" => [ + "doc/man1/openssl-kdf.pod" + ], + "doc/html/man1/openssl-list.html" => [ + "doc/man1/openssl-list.pod" + ], + "doc/html/man1/openssl-mac.html" => [ + "doc/man1/openssl-mac.pod" + ], + "doc/html/man1/openssl-namedisplay-options.html" => [ + "doc/man1/openssl-namedisplay-options.pod" + ], + "doc/html/man1/openssl-nseq.html" => [ + "doc/man1/openssl-nseq.pod" + ], + "doc/html/man1/openssl-ocsp.html" => [ + "doc/man1/openssl-ocsp.pod" + ], + "doc/html/man1/openssl-passphrase-options.html" => [ + "doc/man1/openssl-passphrase-options.pod" + ], + "doc/html/man1/openssl-passwd.html" => [ + "doc/man1/openssl-passwd.pod" + ], + "doc/html/man1/openssl-pkcs12.html" => [ + "doc/man1/openssl-pkcs12.pod" + ], + "doc/html/man1/openssl-pkcs7.html" => [ + "doc/man1/openssl-pkcs7.pod" + ], + "doc/html/man1/openssl-pkcs8.html" => [ + "doc/man1/openssl-pkcs8.pod" + ], + "doc/html/man1/openssl-pkey.html" => [ + "doc/man1/openssl-pkey.pod" + ], + "doc/html/man1/openssl-pkeyparam.html" => [ + "doc/man1/openssl-pkeyparam.pod" + ], + "doc/html/man1/openssl-pkeyutl.html" => [ + "doc/man1/openssl-pkeyutl.pod" + ], + "doc/html/man1/openssl-prime.html" => [ + "doc/man1/openssl-prime.pod" + ], + "doc/html/man1/openssl-rand.html" => [ + "doc/man1/openssl-rand.pod" + ], + "doc/html/man1/openssl-rehash.html" => [ + "doc/man1/openssl-rehash.pod" + ], + "doc/html/man1/openssl-req.html" => [ + "doc/man1/openssl-req.pod" + ], + "doc/html/man1/openssl-rsa.html" => [ + "doc/man1/openssl-rsa.pod" + ], + "doc/html/man1/openssl-rsautl.html" => [ + "doc/man1/openssl-rsautl.pod" + ], + "doc/html/man1/openssl-s_client.html" => [ + "doc/man1/openssl-s_client.pod" + ], + "doc/html/man1/openssl-s_server.html" => [ + "doc/man1/openssl-s_server.pod" + ], + "doc/html/man1/openssl-s_time.html" => [ + "doc/man1/openssl-s_time.pod" + ], + "doc/html/man1/openssl-sess_id.html" => [ + "doc/man1/openssl-sess_id.pod" + ], + "doc/html/man1/openssl-skeyutl.html" => [ + "doc/man1/openssl-skeyutl.pod" + ], + "doc/html/man1/openssl-smime.html" => [ + "doc/man1/openssl-smime.pod" + ], + "doc/html/man1/openssl-speed.html" => [ + "doc/man1/openssl-speed.pod" + ], + "doc/html/man1/openssl-spkac.html" => [ + "doc/man1/openssl-spkac.pod" + ], + "doc/html/man1/openssl-srp.html" => [ + "doc/man1/openssl-srp.pod" + ], + "doc/html/man1/openssl-storeutl.html" => [ + "doc/man1/openssl-storeutl.pod" + ], + "doc/html/man1/openssl-ts.html" => [ + "doc/man1/openssl-ts.pod" + ], + "doc/html/man1/openssl-verification-options.html" => [ + "doc/man1/openssl-verification-options.pod" + ], + "doc/html/man1/openssl-verify.html" => [ + "doc/man1/openssl-verify.pod" + ], + "doc/html/man1/openssl-version.html" => [ + "doc/man1/openssl-version.pod" + ], + "doc/html/man1/openssl-x509.html" => [ + "doc/man1/openssl-x509.pod" + ], + "doc/html/man1/openssl.html" => [ + "doc/man1/openssl.pod" + ], + "doc/html/man1/tsget.html" => [ + "doc/man1/tsget.pod" + ], + "doc/html/man3/ADMISSIONS.html" => [ + "doc/man3/ADMISSIONS.pod" + ], + "doc/html/man3/ASN1_EXTERN_FUNCS.html" => [ + "doc/man3/ASN1_EXTERN_FUNCS.pod" + ], + "doc/html/man3/ASN1_INTEGER_get_int64.html" => [ + "doc/man3/ASN1_INTEGER_get_int64.pod" + ], + "doc/html/man3/ASN1_INTEGER_new.html" => [ + "doc/man3/ASN1_INTEGER_new.pod" + ], + "doc/html/man3/ASN1_ITEM_lookup.html" => [ + "doc/man3/ASN1_ITEM_lookup.pod" + ], + "doc/html/man3/ASN1_OBJECT_new.html" => [ + "doc/man3/ASN1_OBJECT_new.pod" + ], + "doc/html/man3/ASN1_STRING_TABLE_add.html" => [ + "doc/man3/ASN1_STRING_TABLE_add.pod" + ], + "doc/html/man3/ASN1_STRING_length.html" => [ + "doc/man3/ASN1_STRING_length.pod" + ], + "doc/html/man3/ASN1_STRING_new.html" => [ + "doc/man3/ASN1_STRING_new.pod" + ], + "doc/html/man3/ASN1_STRING_print_ex.html" => [ + "doc/man3/ASN1_STRING_print_ex.pod" + ], + "doc/html/man3/ASN1_TIME_set.html" => [ + "doc/man3/ASN1_TIME_set.pod" + ], + "doc/html/man3/ASN1_TYPE_get.html" => [ + "doc/man3/ASN1_TYPE_get.pod" + ], + "doc/html/man3/ASN1_aux_cb.html" => [ + "doc/man3/ASN1_aux_cb.pod" + ], + "doc/html/man3/ASN1_generate_nconf.html" => [ + "doc/man3/ASN1_generate_nconf.pod" + ], + "doc/html/man3/ASN1_item_d2i_bio.html" => [ + "doc/man3/ASN1_item_d2i_bio.pod" + ], + "doc/html/man3/ASN1_item_new.html" => [ + "doc/man3/ASN1_item_new.pod" + ], + "doc/html/man3/ASN1_item_sign.html" => [ + "doc/man3/ASN1_item_sign.pod" + ], + "doc/html/man3/ASYNC_WAIT_CTX_new.html" => [ + "doc/man3/ASYNC_WAIT_CTX_new.pod" + ], + "doc/html/man3/ASYNC_start_job.html" => [ + "doc/man3/ASYNC_start_job.pod" + ], + "doc/html/man3/BF_encrypt.html" => [ + "doc/man3/BF_encrypt.pod" + ], + "doc/html/man3/BIO_ADDR.html" => [ + "doc/man3/BIO_ADDR.pod" + ], + "doc/html/man3/BIO_ADDRINFO.html" => [ + "doc/man3/BIO_ADDRINFO.pod" + ], + "doc/html/man3/BIO_connect.html" => [ + "doc/man3/BIO_connect.pod" + ], + "doc/html/man3/BIO_ctrl.html" => [ + "doc/man3/BIO_ctrl.pod" + ], + "doc/html/man3/BIO_f_base64.html" => [ + "doc/man3/BIO_f_base64.pod" + ], + "doc/html/man3/BIO_f_buffer.html" => [ + "doc/man3/BIO_f_buffer.pod" + ], + "doc/html/man3/BIO_f_cipher.html" => [ + "doc/man3/BIO_f_cipher.pod" + ], + "doc/html/man3/BIO_f_md.html" => [ + "doc/man3/BIO_f_md.pod" + ], + "doc/html/man3/BIO_f_null.html" => [ + "doc/man3/BIO_f_null.pod" + ], + "doc/html/man3/BIO_f_prefix.html" => [ + "doc/man3/BIO_f_prefix.pod" + ], + "doc/html/man3/BIO_f_readbuffer.html" => [ + "doc/man3/BIO_f_readbuffer.pod" + ], + "doc/html/man3/BIO_f_ssl.html" => [ + "doc/man3/BIO_f_ssl.pod" + ], + "doc/html/man3/BIO_find_type.html" => [ + "doc/man3/BIO_find_type.pod" + ], + "doc/html/man3/BIO_get_data.html" => [ + "doc/man3/BIO_get_data.pod" + ], + "doc/html/man3/BIO_get_ex_new_index.html" => [ + "doc/man3/BIO_get_ex_new_index.pod" + ], + "doc/html/man3/BIO_get_rpoll_descriptor.html" => [ + "doc/man3/BIO_get_rpoll_descriptor.pod" + ], + "doc/html/man3/BIO_meth_new.html" => [ + "doc/man3/BIO_meth_new.pod" + ], + "doc/html/man3/BIO_new.html" => [ + "doc/man3/BIO_new.pod" + ], + "doc/html/man3/BIO_new_CMS.html" => [ + "doc/man3/BIO_new_CMS.pod" + ], + "doc/html/man3/BIO_parse_hostserv.html" => [ + "doc/man3/BIO_parse_hostserv.pod" + ], + "doc/html/man3/BIO_printf.html" => [ + "doc/man3/BIO_printf.pod" + ], + "doc/html/man3/BIO_push.html" => [ + "doc/man3/BIO_push.pod" + ], + "doc/html/man3/BIO_read.html" => [ + "doc/man3/BIO_read.pod" + ], + "doc/html/man3/BIO_s_accept.html" => [ + "doc/man3/BIO_s_accept.pod" + ], + "doc/html/man3/BIO_s_bio.html" => [ + "doc/man3/BIO_s_bio.pod" + ], + "doc/html/man3/BIO_s_connect.html" => [ + "doc/man3/BIO_s_connect.pod" + ], + "doc/html/man3/BIO_s_core.html" => [ + "doc/man3/BIO_s_core.pod" + ], + "doc/html/man3/BIO_s_datagram.html" => [ + "doc/man3/BIO_s_datagram.pod" + ], + "doc/html/man3/BIO_s_dgram_pair.html" => [ + "doc/man3/BIO_s_dgram_pair.pod" + ], + "doc/html/man3/BIO_s_fd.html" => [ + "doc/man3/BIO_s_fd.pod" + ], + "doc/html/man3/BIO_s_file.html" => [ + "doc/man3/BIO_s_file.pod" + ], + "doc/html/man3/BIO_s_mem.html" => [ + "doc/man3/BIO_s_mem.pod" + ], + "doc/html/man3/BIO_s_null.html" => [ + "doc/man3/BIO_s_null.pod" + ], + "doc/html/man3/BIO_s_socket.html" => [ + "doc/man3/BIO_s_socket.pod" + ], + "doc/html/man3/BIO_sendmmsg.html" => [ + "doc/man3/BIO_sendmmsg.pod" + ], + "doc/html/man3/BIO_set_callback.html" => [ + "doc/man3/BIO_set_callback.pod" + ], + "doc/html/man3/BIO_set_flags.html" => [ + "doc/man3/BIO_set_flags.pod" + ], + "doc/html/man3/BIO_should_retry.html" => [ + "doc/man3/BIO_should_retry.pod" + ], + "doc/html/man3/BIO_socket_wait.html" => [ + "doc/man3/BIO_socket_wait.pod" + ], + "doc/html/man3/BN_BLINDING_new.html" => [ + "doc/man3/BN_BLINDING_new.pod" + ], + "doc/html/man3/BN_CTX_new.html" => [ + "doc/man3/BN_CTX_new.pod" + ], + "doc/html/man3/BN_CTX_start.html" => [ + "doc/man3/BN_CTX_start.pod" + ], + "doc/html/man3/BN_add.html" => [ + "doc/man3/BN_add.pod" + ], + "doc/html/man3/BN_add_word.html" => [ + "doc/man3/BN_add_word.pod" + ], + "doc/html/man3/BN_bn2bin.html" => [ + "doc/man3/BN_bn2bin.pod" + ], + "doc/html/man3/BN_cmp.html" => [ + "doc/man3/BN_cmp.pod" + ], + "doc/html/man3/BN_copy.html" => [ + "doc/man3/BN_copy.pod" + ], + "doc/html/man3/BN_generate_prime.html" => [ + "doc/man3/BN_generate_prime.pod" + ], + "doc/html/man3/BN_mod_exp_mont.html" => [ + "doc/man3/BN_mod_exp_mont.pod" + ], + "doc/html/man3/BN_mod_inverse.html" => [ + "doc/man3/BN_mod_inverse.pod" + ], + "doc/html/man3/BN_mod_mul_montgomery.html" => [ + "doc/man3/BN_mod_mul_montgomery.pod" + ], + "doc/html/man3/BN_mod_mul_reciprocal.html" => [ + "doc/man3/BN_mod_mul_reciprocal.pod" + ], + "doc/html/man3/BN_new.html" => [ + "doc/man3/BN_new.pod" + ], + "doc/html/man3/BN_num_bytes.html" => [ + "doc/man3/BN_num_bytes.pod" + ], + "doc/html/man3/BN_rand.html" => [ + "doc/man3/BN_rand.pod" + ], + "doc/html/man3/BN_security_bits.html" => [ + "doc/man3/BN_security_bits.pod" + ], + "doc/html/man3/BN_set_bit.html" => [ + "doc/man3/BN_set_bit.pod" + ], + "doc/html/man3/BN_swap.html" => [ + "doc/man3/BN_swap.pod" + ], + "doc/html/man3/BN_zero.html" => [ + "doc/man3/BN_zero.pod" + ], + "doc/html/man3/BUF_MEM_new.html" => [ + "doc/man3/BUF_MEM_new.pod" + ], + "doc/html/man3/CMAC_CTX.html" => [ + "doc/man3/CMAC_CTX.pod" + ], + "doc/html/man3/CMS_EncryptedData_decrypt.html" => [ + "doc/man3/CMS_EncryptedData_decrypt.pod" + ], + "doc/html/man3/CMS_EncryptedData_encrypt.html" => [ + "doc/man3/CMS_EncryptedData_encrypt.pod" + ], + "doc/html/man3/CMS_EncryptedData_set1_key.html" => [ + "doc/man3/CMS_EncryptedData_set1_key.pod" + ], + "doc/html/man3/CMS_EnvelopedData_create.html" => [ + "doc/man3/CMS_EnvelopedData_create.pod" + ], + "doc/html/man3/CMS_add0_cert.html" => [ + "doc/man3/CMS_add0_cert.pod" + ], + "doc/html/man3/CMS_add1_recipient_cert.html" => [ + "doc/man3/CMS_add1_recipient_cert.pod" + ], + "doc/html/man3/CMS_add1_signer.html" => [ + "doc/man3/CMS_add1_signer.pod" + ], + "doc/html/man3/CMS_compress.html" => [ + "doc/man3/CMS_compress.pod" + ], + "doc/html/man3/CMS_data_create.html" => [ + "doc/man3/CMS_data_create.pod" + ], + "doc/html/man3/CMS_decrypt.html" => [ + "doc/man3/CMS_decrypt.pod" + ], + "doc/html/man3/CMS_digest_create.html" => [ + "doc/man3/CMS_digest_create.pod" + ], + "doc/html/man3/CMS_encrypt.html" => [ + "doc/man3/CMS_encrypt.pod" + ], + "doc/html/man3/CMS_final.html" => [ + "doc/man3/CMS_final.pod" + ], + "doc/html/man3/CMS_get0_RecipientInfos.html" => [ + "doc/man3/CMS_get0_RecipientInfos.pod" + ], + "doc/html/man3/CMS_get0_SignerInfos.html" => [ + "doc/man3/CMS_get0_SignerInfos.pod" + ], + "doc/html/man3/CMS_get0_type.html" => [ + "doc/man3/CMS_get0_type.pod" + ], + "doc/html/man3/CMS_get1_ReceiptRequest.html" => [ + "doc/man3/CMS_get1_ReceiptRequest.pod" + ], + "doc/html/man3/CMS_sign.html" => [ + "doc/man3/CMS_sign.pod" + ], + "doc/html/man3/CMS_sign_receipt.html" => [ + "doc/man3/CMS_sign_receipt.pod" + ], + "doc/html/man3/CMS_signed_get_attr.html" => [ + "doc/man3/CMS_signed_get_attr.pod" + ], + "doc/html/man3/CMS_uncompress.html" => [ + "doc/man3/CMS_uncompress.pod" + ], + "doc/html/man3/CMS_verify.html" => [ + "doc/man3/CMS_verify.pod" + ], + "doc/html/man3/CMS_verify_receipt.html" => [ + "doc/man3/CMS_verify_receipt.pod" + ], + "doc/html/man3/COMP_CTX_new.html" => [ + "doc/man3/COMP_CTX_new.pod" + ], + "doc/html/man3/CONF_modules_free.html" => [ + "doc/man3/CONF_modules_free.pod" + ], + "doc/html/man3/CONF_modules_load_file.html" => [ + "doc/man3/CONF_modules_load_file.pod" + ], + "doc/html/man3/CRYPTO_THREAD_run_once.html" => [ + "doc/man3/CRYPTO_THREAD_run_once.pod" + ], + "doc/html/man3/CRYPTO_get_ex_new_index.html" => [ + "doc/man3/CRYPTO_get_ex_new_index.pod" + ], + "doc/html/man3/CRYPTO_memcmp.html" => [ + "doc/man3/CRYPTO_memcmp.pod" + ], + "doc/html/man3/CTLOG_STORE_get0_log_by_id.html" => [ + "doc/man3/CTLOG_STORE_get0_log_by_id.pod" + ], + "doc/html/man3/CTLOG_STORE_new.html" => [ + "doc/man3/CTLOG_STORE_new.pod" + ], + "doc/html/man3/CTLOG_new.html" => [ + "doc/man3/CTLOG_new.pod" + ], + "doc/html/man3/CT_POLICY_EVAL_CTX_new.html" => [ + "doc/man3/CT_POLICY_EVAL_CTX_new.pod" + ], + "doc/html/man3/DEFINE_STACK_OF.html" => [ + "doc/man3/DEFINE_STACK_OF.pod" + ], + "doc/html/man3/DES_random_key.html" => [ + "doc/man3/DES_random_key.pod" + ], + "doc/html/man3/DH_generate_key.html" => [ + "doc/man3/DH_generate_key.pod" + ], + "doc/html/man3/DH_generate_parameters.html" => [ + "doc/man3/DH_generate_parameters.pod" + ], + "doc/html/man3/DH_get0_pqg.html" => [ + "doc/man3/DH_get0_pqg.pod" + ], + "doc/html/man3/DH_get_1024_160.html" => [ + "doc/man3/DH_get_1024_160.pod" + ], + "doc/html/man3/DH_meth_new.html" => [ + "doc/man3/DH_meth_new.pod" + ], + "doc/html/man3/DH_new.html" => [ + "doc/man3/DH_new.pod" + ], + "doc/html/man3/DH_new_by_nid.html" => [ + "doc/man3/DH_new_by_nid.pod" + ], + "doc/html/man3/DH_set_method.html" => [ + "doc/man3/DH_set_method.pod" + ], + "doc/html/man3/DH_size.html" => [ + "doc/man3/DH_size.pod" + ], + "doc/html/man3/DSA_SIG_new.html" => [ + "doc/man3/DSA_SIG_new.pod" + ], + "doc/html/man3/DSA_do_sign.html" => [ + "doc/man3/DSA_do_sign.pod" + ], + "doc/html/man3/DSA_dup_DH.html" => [ + "doc/man3/DSA_dup_DH.pod" + ], + "doc/html/man3/DSA_generate_key.html" => [ + "doc/man3/DSA_generate_key.pod" + ], + "doc/html/man3/DSA_generate_parameters.html" => [ + "doc/man3/DSA_generate_parameters.pod" + ], + "doc/html/man3/DSA_get0_pqg.html" => [ + "doc/man3/DSA_get0_pqg.pod" + ], + "doc/html/man3/DSA_meth_new.html" => [ + "doc/man3/DSA_meth_new.pod" + ], + "doc/html/man3/DSA_new.html" => [ + "doc/man3/DSA_new.pod" + ], + "doc/html/man3/DSA_set_method.html" => [ + "doc/man3/DSA_set_method.pod" + ], + "doc/html/man3/DSA_sign.html" => [ + "doc/man3/DSA_sign.pod" + ], + "doc/html/man3/DSA_size.html" => [ + "doc/man3/DSA_size.pod" + ], + "doc/html/man3/DTLS_get_data_mtu.html" => [ + "doc/man3/DTLS_get_data_mtu.pod" + ], + "doc/html/man3/DTLS_set_timer_cb.html" => [ + "doc/man3/DTLS_set_timer_cb.pod" + ], + "doc/html/man3/DTLSv1_get_timeout.html" => [ + "doc/man3/DTLSv1_get_timeout.pod" + ], + "doc/html/man3/DTLSv1_handle_timeout.html" => [ + "doc/man3/DTLSv1_handle_timeout.pod" + ], + "doc/html/man3/DTLSv1_listen.html" => [ + "doc/man3/DTLSv1_listen.pod" + ], + "doc/html/man3/ECDSA_SIG_new.html" => [ + "doc/man3/ECDSA_SIG_new.pod" + ], + "doc/html/man3/ECDSA_sign.html" => [ + "doc/man3/ECDSA_sign.pod" + ], + "doc/html/man3/ECPKParameters_print.html" => [ + "doc/man3/ECPKParameters_print.pod" + ], + "doc/html/man3/EC_GFp_simple_method.html" => [ + "doc/man3/EC_GFp_simple_method.pod" + ], + "doc/html/man3/EC_GROUP_copy.html" => [ + "doc/man3/EC_GROUP_copy.pod" + ], + "doc/html/man3/EC_GROUP_new.html" => [ + "doc/man3/EC_GROUP_new.pod" + ], + "doc/html/man3/EC_KEY_get_enc_flags.html" => [ + "doc/man3/EC_KEY_get_enc_flags.pod" + ], + "doc/html/man3/EC_KEY_new.html" => [ + "doc/man3/EC_KEY_new.pod" + ], + "doc/html/man3/EC_POINT_add.html" => [ + "doc/man3/EC_POINT_add.pod" + ], + "doc/html/man3/EC_POINT_new.html" => [ + "doc/man3/EC_POINT_new.pod" + ], + "doc/html/man3/ENGINE_add.html" => [ + "doc/man3/ENGINE_add.pod" + ], + "doc/html/man3/ERR_GET_LIB.html" => [ + "doc/man3/ERR_GET_LIB.pod" + ], + "doc/html/man3/ERR_clear_error.html" => [ + "doc/man3/ERR_clear_error.pod" + ], + "doc/html/man3/ERR_error_string.html" => [ + "doc/man3/ERR_error_string.pod" + ], + "doc/html/man3/ERR_get_error.html" => [ + "doc/man3/ERR_get_error.pod" + ], + "doc/html/man3/ERR_load_crypto_strings.html" => [ + "doc/man3/ERR_load_crypto_strings.pod" + ], + "doc/html/man3/ERR_load_strings.html" => [ + "doc/man3/ERR_load_strings.pod" + ], + "doc/html/man3/ERR_new.html" => [ + "doc/man3/ERR_new.pod" + ], + "doc/html/man3/ERR_print_errors.html" => [ + "doc/man3/ERR_print_errors.pod" + ], + "doc/html/man3/ERR_put_error.html" => [ + "doc/man3/ERR_put_error.pod" + ], + "doc/html/man3/ERR_remove_state.html" => [ + "doc/man3/ERR_remove_state.pod" + ], + "doc/html/man3/ERR_set_mark.html" => [ + "doc/man3/ERR_set_mark.pod" + ], + "doc/html/man3/EVP_ASYM_CIPHER_free.html" => [ + "doc/man3/EVP_ASYM_CIPHER_free.pod" + ], + "doc/html/man3/EVP_BytesToKey.html" => [ + "doc/man3/EVP_BytesToKey.pod" + ], + "doc/html/man3/EVP_CIPHER_CTX_get_app_data.html" => [ + "doc/man3/EVP_CIPHER_CTX_get_app_data.pod" + ], + "doc/html/man3/EVP_CIPHER_CTX_get_cipher_data.html" => [ + "doc/man3/EVP_CIPHER_CTX_get_cipher_data.pod" + ], + "doc/html/man3/EVP_CIPHER_CTX_get_original_iv.html" => [ + "doc/man3/EVP_CIPHER_CTX_get_original_iv.pod" + ], + "doc/html/man3/EVP_CIPHER_meth_new.html" => [ + "doc/man3/EVP_CIPHER_meth_new.pod" + ], + "doc/html/man3/EVP_DigestInit.html" => [ + "doc/man3/EVP_DigestInit.pod" + ], + "doc/html/man3/EVP_DigestSignInit.html" => [ + "doc/man3/EVP_DigestSignInit.pod" + ], + "doc/html/man3/EVP_DigestVerifyInit.html" => [ + "doc/man3/EVP_DigestVerifyInit.pod" + ], + "doc/html/man3/EVP_EncodeInit.html" => [ + "doc/man3/EVP_EncodeInit.pod" + ], + "doc/html/man3/EVP_EncryptInit.html" => [ + "doc/man3/EVP_EncryptInit.pod" + ], + "doc/html/man3/EVP_KDF.html" => [ + "doc/man3/EVP_KDF.pod" + ], + "doc/html/man3/EVP_KEM_free.html" => [ + "doc/man3/EVP_KEM_free.pod" + ], + "doc/html/man3/EVP_KEYEXCH_free.html" => [ + "doc/man3/EVP_KEYEXCH_free.pod" + ], + "doc/html/man3/EVP_KEYMGMT.html" => [ + "doc/man3/EVP_KEYMGMT.pod" + ], + "doc/html/man3/EVP_MAC.html" => [ + "doc/man3/EVP_MAC.pod" + ], + "doc/html/man3/EVP_MD_meth_new.html" => [ + "doc/man3/EVP_MD_meth_new.pod" + ], + "doc/html/man3/EVP_OpenInit.html" => [ + "doc/man3/EVP_OpenInit.pod" + ], + "doc/html/man3/EVP_PBE_CipherInit.html" => [ + "doc/man3/EVP_PBE_CipherInit.pod" + ], + "doc/html/man3/EVP_PKEY2PKCS8.html" => [ + "doc/man3/EVP_PKEY2PKCS8.pod" + ], + "doc/html/man3/EVP_PKEY_ASN1_METHOD.html" => [ + "doc/man3/EVP_PKEY_ASN1_METHOD.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_ctrl.html" => [ + "doc/man3/EVP_PKEY_CTX_ctrl.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_get0_libctx.html" => [ + "doc/man3/EVP_PKEY_CTX_get0_libctx.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_get0_pkey.html" => [ + "doc/man3/EVP_PKEY_CTX_get0_pkey.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_get_algor.html" => [ + "doc/man3/EVP_PKEY_CTX_get_algor.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_new.html" => [ + "doc/man3/EVP_PKEY_CTX_new.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set1_pbe_pass.html" => [ + "doc/man3/EVP_PKEY_CTX_set1_pbe_pass.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_hkdf_md.html" => [ + "doc/man3/EVP_PKEY_CTX_set_hkdf_md.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_params.html" => [ + "doc/man3/EVP_PKEY_CTX_set_params.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.html" => [ + "doc/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_scrypt_N.html" => [ + "doc/man3/EVP_PKEY_CTX_set_scrypt_N.pod" + ], + "doc/html/man3/EVP_PKEY_CTX_set_tls1_prf_md.html" => [ + "doc/man3/EVP_PKEY_CTX_set_tls1_prf_md.pod" + ], + "doc/html/man3/EVP_PKEY_asn1_get_count.html" => [ + "doc/man3/EVP_PKEY_asn1_get_count.pod" + ], + "doc/html/man3/EVP_PKEY_check.html" => [ + "doc/man3/EVP_PKEY_check.pod" + ], + "doc/html/man3/EVP_PKEY_copy_parameters.html" => [ + "doc/man3/EVP_PKEY_copy_parameters.pod" + ], + "doc/html/man3/EVP_PKEY_decapsulate.html" => [ + "doc/man3/EVP_PKEY_decapsulate.pod" + ], + "doc/html/man3/EVP_PKEY_decrypt.html" => [ + "doc/man3/EVP_PKEY_decrypt.pod" + ], + "doc/html/man3/EVP_PKEY_derive.html" => [ + "doc/man3/EVP_PKEY_derive.pod" + ], + "doc/html/man3/EVP_PKEY_digestsign_supports_digest.html" => [ + "doc/man3/EVP_PKEY_digestsign_supports_digest.pod" + ], + "doc/html/man3/EVP_PKEY_encapsulate.html" => [ + "doc/man3/EVP_PKEY_encapsulate.pod" + ], + "doc/html/man3/EVP_PKEY_encrypt.html" => [ + "doc/man3/EVP_PKEY_encrypt.pod" + ], + "doc/html/man3/EVP_PKEY_fromdata.html" => [ + "doc/man3/EVP_PKEY_fromdata.pod" + ], + "doc/html/man3/EVP_PKEY_get_attr.html" => [ + "doc/man3/EVP_PKEY_get_attr.pod" + ], + "doc/html/man3/EVP_PKEY_get_default_digest_nid.html" => [ + "doc/man3/EVP_PKEY_get_default_digest_nid.pod" + ], + "doc/html/man3/EVP_PKEY_get_field_type.html" => [ + "doc/man3/EVP_PKEY_get_field_type.pod" + ], + "doc/html/man3/EVP_PKEY_get_group_name.html" => [ + "doc/man3/EVP_PKEY_get_group_name.pod" + ], + "doc/html/man3/EVP_PKEY_get_size.html" => [ + "doc/man3/EVP_PKEY_get_size.pod" + ], + "doc/html/man3/EVP_PKEY_gettable_params.html" => [ + "doc/man3/EVP_PKEY_gettable_params.pod" + ], + "doc/html/man3/EVP_PKEY_is_a.html" => [ + "doc/man3/EVP_PKEY_is_a.pod" + ], + "doc/html/man3/EVP_PKEY_keygen.html" => [ + "doc/man3/EVP_PKEY_keygen.pod" + ], + "doc/html/man3/EVP_PKEY_meth_get_count.html" => [ + "doc/man3/EVP_PKEY_meth_get_count.pod" + ], + "doc/html/man3/EVP_PKEY_meth_new.html" => [ + "doc/man3/EVP_PKEY_meth_new.pod" + ], + "doc/html/man3/EVP_PKEY_new.html" => [ + "doc/man3/EVP_PKEY_new.pod" + ], + "doc/html/man3/EVP_PKEY_print_private.html" => [ + "doc/man3/EVP_PKEY_print_private.pod" + ], + "doc/html/man3/EVP_PKEY_set1_RSA.html" => [ + "doc/man3/EVP_PKEY_set1_RSA.pod" + ], + "doc/html/man3/EVP_PKEY_set1_encoded_public_key.html" => [ + "doc/man3/EVP_PKEY_set1_encoded_public_key.pod" + ], + "doc/html/man3/EVP_PKEY_set_type.html" => [ + "doc/man3/EVP_PKEY_set_type.pod" + ], + "doc/html/man3/EVP_PKEY_settable_params.html" => [ + "doc/man3/EVP_PKEY_settable_params.pod" + ], + "doc/html/man3/EVP_PKEY_sign.html" => [ + "doc/man3/EVP_PKEY_sign.pod" + ], + "doc/html/man3/EVP_PKEY_todata.html" => [ + "doc/man3/EVP_PKEY_todata.pod" + ], + "doc/html/man3/EVP_PKEY_verify.html" => [ + "doc/man3/EVP_PKEY_verify.pod" + ], + "doc/html/man3/EVP_PKEY_verify_recover.html" => [ + "doc/man3/EVP_PKEY_verify_recover.pod" + ], + "doc/html/man3/EVP_RAND.html" => [ + "doc/man3/EVP_RAND.pod" + ], + "doc/html/man3/EVP_SIGNATURE.html" => [ + "doc/man3/EVP_SIGNATURE.pod" + ], + "doc/html/man3/EVP_SKEY.html" => [ + "doc/man3/EVP_SKEY.pod" + ], + "doc/html/man3/EVP_SKEYMGMT.html" => [ + "doc/man3/EVP_SKEYMGMT.pod" + ], + "doc/html/man3/EVP_SealInit.html" => [ + "doc/man3/EVP_SealInit.pod" + ], + "doc/html/man3/EVP_SignInit.html" => [ + "doc/man3/EVP_SignInit.pod" + ], + "doc/html/man3/EVP_VerifyInit.html" => [ + "doc/man3/EVP_VerifyInit.pod" + ], + "doc/html/man3/EVP_aes_128_gcm.html" => [ + "doc/man3/EVP_aes_128_gcm.pod" + ], + "doc/html/man3/EVP_aria_128_gcm.html" => [ + "doc/man3/EVP_aria_128_gcm.pod" + ], + "doc/html/man3/EVP_bf_cbc.html" => [ + "doc/man3/EVP_bf_cbc.pod" + ], + "doc/html/man3/EVP_blake2b512.html" => [ + "doc/man3/EVP_blake2b512.pod" + ], + "doc/html/man3/EVP_camellia_128_ecb.html" => [ + "doc/man3/EVP_camellia_128_ecb.pod" + ], + "doc/html/man3/EVP_cast5_cbc.html" => [ + "doc/man3/EVP_cast5_cbc.pod" + ], + "doc/html/man3/EVP_chacha20.html" => [ + "doc/man3/EVP_chacha20.pod" + ], + "doc/html/man3/EVP_des_cbc.html" => [ + "doc/man3/EVP_des_cbc.pod" + ], + "doc/html/man3/EVP_desx_cbc.html" => [ + "doc/man3/EVP_desx_cbc.pod" + ], + "doc/html/man3/EVP_idea_cbc.html" => [ + "doc/man3/EVP_idea_cbc.pod" + ], + "doc/html/man3/EVP_md2.html" => [ + "doc/man3/EVP_md2.pod" + ], + "doc/html/man3/EVP_md4.html" => [ + "doc/man3/EVP_md4.pod" + ], + "doc/html/man3/EVP_md5.html" => [ + "doc/man3/EVP_md5.pod" + ], + "doc/html/man3/EVP_mdc2.html" => [ + "doc/man3/EVP_mdc2.pod" + ], + "doc/html/man3/EVP_rc2_cbc.html" => [ + "doc/man3/EVP_rc2_cbc.pod" + ], + "doc/html/man3/EVP_rc4.html" => [ + "doc/man3/EVP_rc4.pod" + ], + "doc/html/man3/EVP_rc5_32_12_16_cbc.html" => [ + "doc/man3/EVP_rc5_32_12_16_cbc.pod" + ], + "doc/html/man3/EVP_ripemd160.html" => [ + "doc/man3/EVP_ripemd160.pod" + ], + "doc/html/man3/EVP_seed_cbc.html" => [ + "doc/man3/EVP_seed_cbc.pod" + ], + "doc/html/man3/EVP_set_default_properties.html" => [ + "doc/man3/EVP_set_default_properties.pod" + ], + "doc/html/man3/EVP_sha1.html" => [ + "doc/man3/EVP_sha1.pod" + ], + "doc/html/man3/EVP_sha224.html" => [ + "doc/man3/EVP_sha224.pod" + ], + "doc/html/man3/EVP_sha3_224.html" => [ + "doc/man3/EVP_sha3_224.pod" + ], + "doc/html/man3/EVP_sm3.html" => [ + "doc/man3/EVP_sm3.pod" + ], + "doc/html/man3/EVP_sm4_cbc.html" => [ + "doc/man3/EVP_sm4_cbc.pod" + ], + "doc/html/man3/EVP_whirlpool.html" => [ + "doc/man3/EVP_whirlpool.pod" + ], + "doc/html/man3/GENERAL_NAME.html" => [ + "doc/man3/GENERAL_NAME.pod" + ], + "doc/html/man3/HMAC.html" => [ + "doc/man3/HMAC.pod" + ], + "doc/html/man3/MD5.html" => [ + "doc/man3/MD5.pod" + ], + "doc/html/man3/MDC2_Init.html" => [ + "doc/man3/MDC2_Init.pod" + ], + "doc/html/man3/NCONF_new_ex.html" => [ + "doc/man3/NCONF_new_ex.pod" + ], + "doc/html/man3/OBJ_nid2obj.html" => [ + "doc/man3/OBJ_nid2obj.pod" + ], + "doc/html/man3/OCSP_REQUEST_new.html" => [ + "doc/man3/OCSP_REQUEST_new.pod" + ], + "doc/html/man3/OCSP_cert_to_id.html" => [ + "doc/man3/OCSP_cert_to_id.pod" + ], + "doc/html/man3/OCSP_request_add1_nonce.html" => [ + "doc/man3/OCSP_request_add1_nonce.pod" + ], + "doc/html/man3/OCSP_resp_find_status.html" => [ + "doc/man3/OCSP_resp_find_status.pod" + ], + "doc/html/man3/OCSP_response_status.html" => [ + "doc/man3/OCSP_response_status.pod" + ], + "doc/html/man3/OCSP_sendreq_new.html" => [ + "doc/man3/OCSP_sendreq_new.pod" + ], + "doc/html/man3/OPENSSL_Applink.html" => [ + "doc/man3/OPENSSL_Applink.pod" + ], + "doc/html/man3/OPENSSL_FILE.html" => [ + "doc/man3/OPENSSL_FILE.pod" + ], + "doc/html/man3/OPENSSL_LH_COMPFUNC.html" => [ + "doc/man3/OPENSSL_LH_COMPFUNC.pod" + ], + "doc/html/man3/OPENSSL_LH_stats.html" => [ + "doc/man3/OPENSSL_LH_stats.pod" + ], + "doc/html/man3/OPENSSL_config.html" => [ + "doc/man3/OPENSSL_config.pod" + ], + "doc/html/man3/OPENSSL_fork_prepare.html" => [ + "doc/man3/OPENSSL_fork_prepare.pod" + ], + "doc/html/man3/OPENSSL_gmtime.html" => [ + "doc/man3/OPENSSL_gmtime.pod" + ], + "doc/html/man3/OPENSSL_hexchar2int.html" => [ + "doc/man3/OPENSSL_hexchar2int.pod" + ], + "doc/html/man3/OPENSSL_ia32cap.html" => [ + "doc/man3/OPENSSL_ia32cap.pod" + ], + "doc/html/man3/OPENSSL_init_crypto.html" => [ + "doc/man3/OPENSSL_init_crypto.pod" + ], + "doc/html/man3/OPENSSL_init_ssl.html" => [ + "doc/man3/OPENSSL_init_ssl.pod" + ], + "doc/html/man3/OPENSSL_instrument_bus.html" => [ + "doc/man3/OPENSSL_instrument_bus.pod" + ], + "doc/html/man3/OPENSSL_load_builtin_modules.html" => [ + "doc/man3/OPENSSL_load_builtin_modules.pod" + ], + "doc/html/man3/OPENSSL_load_u16_le.html" => [ + "doc/man3/OPENSSL_load_u16_le.pod" + ], + "doc/html/man3/OPENSSL_malloc.html" => [ + "doc/man3/OPENSSL_malloc.pod" + ], + "doc/html/man3/OPENSSL_ppccap.html" => [ + "doc/man3/OPENSSL_ppccap.pod" + ], + "doc/html/man3/OPENSSL_riscvcap.html" => [ + "doc/man3/OPENSSL_riscvcap.pod" + ], + "doc/html/man3/OPENSSL_s390xcap.html" => [ + "doc/man3/OPENSSL_s390xcap.pod" + ], + "doc/html/man3/OPENSSL_secure_malloc.html" => [ + "doc/man3/OPENSSL_secure_malloc.pod" + ], + "doc/html/man3/OPENSSL_strcasecmp.html" => [ + "doc/man3/OPENSSL_strcasecmp.pod" + ], + "doc/html/man3/OSSL_ALGORITHM.html" => [ + "doc/man3/OSSL_ALGORITHM.pod" + ], + "doc/html/man3/OSSL_CALLBACK.html" => [ + "doc/man3/OSSL_CALLBACK.pod" + ], + "doc/html/man3/OSSL_CMP_ATAV_set0.html" => [ + "doc/man3/OSSL_CMP_ATAV_set0.pod" + ], + "doc/html/man3/OSSL_CMP_CTX_new.html" => [ + "doc/man3/OSSL_CMP_CTX_new.pod" + ], + "doc/html/man3/OSSL_CMP_HDR_get0_transactionID.html" => [ + "doc/man3/OSSL_CMP_HDR_get0_transactionID.pod" + ], + "doc/html/man3/OSSL_CMP_ITAV_new_caCerts.html" => [ + "doc/man3/OSSL_CMP_ITAV_new_caCerts.pod" + ], + "doc/html/man3/OSSL_CMP_ITAV_set0.html" => [ + "doc/man3/OSSL_CMP_ITAV_set0.pod" + ], + "doc/html/man3/OSSL_CMP_MSG_get0_header.html" => [ + "doc/man3/OSSL_CMP_MSG_get0_header.pod" + ], + "doc/html/man3/OSSL_CMP_MSG_http_perform.html" => [ + "doc/man3/OSSL_CMP_MSG_http_perform.pod" + ], + "doc/html/man3/OSSL_CMP_SRV_CTX_new.html" => [ + "doc/man3/OSSL_CMP_SRV_CTX_new.pod" + ], + "doc/html/man3/OSSL_CMP_STATUSINFO_new.html" => [ + "doc/man3/OSSL_CMP_STATUSINFO_new.pod" + ], + "doc/html/man3/OSSL_CMP_exec_certreq.html" => [ + "doc/man3/OSSL_CMP_exec_certreq.pod" + ], + "doc/html/man3/OSSL_CMP_log_open.html" => [ + "doc/man3/OSSL_CMP_log_open.pod" + ], + "doc/html/man3/OSSL_CMP_validate_msg.html" => [ + "doc/man3/OSSL_CMP_validate_msg.pod" + ], + "doc/html/man3/OSSL_CORE_MAKE_FUNC.html" => [ + "doc/man3/OSSL_CORE_MAKE_FUNC.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_get0_tmpl.html" => [ + "doc/man3/OSSL_CRMF_MSG_get0_tmpl.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_set0_validity.html" => [ + "doc/man3/OSSL_CRMF_MSG_set0_validity.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.html" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.pod" + ], + "doc/html/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.html" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.pod" + ], + "doc/html/man3/OSSL_CRMF_pbmp_new.html" => [ + "doc/man3/OSSL_CRMF_pbmp_new.pod" + ], + "doc/html/man3/OSSL_DECODER.html" => [ + "doc/man3/OSSL_DECODER.pod" + ], + "doc/html/man3/OSSL_DECODER_CTX.html" => [ + "doc/man3/OSSL_DECODER_CTX.pod" + ], + "doc/html/man3/OSSL_DECODER_CTX_new_for_pkey.html" => [ + "doc/man3/OSSL_DECODER_CTX_new_for_pkey.pod" + ], + "doc/html/man3/OSSL_DECODER_from_bio.html" => [ + "doc/man3/OSSL_DECODER_from_bio.pod" + ], + "doc/html/man3/OSSL_DISPATCH.html" => [ + "doc/man3/OSSL_DISPATCH.pod" + ], + "doc/html/man3/OSSL_ENCODER.html" => [ + "doc/man3/OSSL_ENCODER.pod" + ], + "doc/html/man3/OSSL_ENCODER_CTX.html" => [ + "doc/man3/OSSL_ENCODER_CTX.pod" + ], + "doc/html/man3/OSSL_ENCODER_CTX_new_for_pkey.html" => [ + "doc/man3/OSSL_ENCODER_CTX_new_for_pkey.pod" + ], + "doc/html/man3/OSSL_ENCODER_to_bio.html" => [ + "doc/man3/OSSL_ENCODER_to_bio.pod" + ], + "doc/html/man3/OSSL_ERR_STATE_save.html" => [ + "doc/man3/OSSL_ERR_STATE_save.pod" + ], + "doc/html/man3/OSSL_ESS_check_signing_certs.html" => [ + "doc/man3/OSSL_ESS_check_signing_certs.pod" + ], + "doc/html/man3/OSSL_GENERAL_NAMES_print.html" => [ + "doc/man3/OSSL_GENERAL_NAMES_print.pod" + ], + "doc/html/man3/OSSL_HPKE_CTX_new.html" => [ + "doc/man3/OSSL_HPKE_CTX_new.pod" + ], + "doc/html/man3/OSSL_HTTP_REQ_CTX.html" => [ + "doc/man3/OSSL_HTTP_REQ_CTX.pod" + ], + "doc/html/man3/OSSL_HTTP_parse_url.html" => [ + "doc/man3/OSSL_HTTP_parse_url.pod" + ], + "doc/html/man3/OSSL_HTTP_transfer.html" => [ + "doc/man3/OSSL_HTTP_transfer.pod" + ], + "doc/html/man3/OSSL_IETF_ATTR_SYNTAX.html" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX.pod" + ], + "doc/html/man3/OSSL_IETF_ATTR_SYNTAX_print.html" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX_print.pod" + ], + "doc/html/man3/OSSL_INDICATOR_set_callback.html" => [ + "doc/man3/OSSL_INDICATOR_set_callback.pod" + ], + "doc/html/man3/OSSL_ITEM.html" => [ + "doc/man3/OSSL_ITEM.pod" + ], + "doc/html/man3/OSSL_LIB_CTX.html" => [ + "doc/man3/OSSL_LIB_CTX.pod" + ], + "doc/html/man3/OSSL_LIB_CTX_set_conf_diagnostics.html" => [ + "doc/man3/OSSL_LIB_CTX_set_conf_diagnostics.pod" + ], + "doc/html/man3/OSSL_PARAM.html" => [ + "doc/man3/OSSL_PARAM.pod" + ], + "doc/html/man3/OSSL_PARAM_BLD.html" => [ + "doc/man3/OSSL_PARAM_BLD.pod" + ], + "doc/html/man3/OSSL_PARAM_allocate_from_text.html" => [ + "doc/man3/OSSL_PARAM_allocate_from_text.pod" + ], + "doc/html/man3/OSSL_PARAM_dup.html" => [ + "doc/man3/OSSL_PARAM_dup.pod" + ], + "doc/html/man3/OSSL_PARAM_int.html" => [ + "doc/man3/OSSL_PARAM_int.pod" + ], + "doc/html/man3/OSSL_PARAM_print_to_bio.html" => [ + "doc/man3/OSSL_PARAM_print_to_bio.pod" + ], + "doc/html/man3/OSSL_PROVIDER.html" => [ + "doc/man3/OSSL_PROVIDER.pod" + ], + "doc/html/man3/OSSL_QUIC_client_method.html" => [ + "doc/man3/OSSL_QUIC_client_method.pod" + ], + "doc/html/man3/OSSL_SELF_TEST_new.html" => [ + "doc/man3/OSSL_SELF_TEST_new.pod" + ], + "doc/html/man3/OSSL_SELF_TEST_set_callback.html" => [ + "doc/man3/OSSL_SELF_TEST_set_callback.pod" + ], + "doc/html/man3/OSSL_STORE_INFO.html" => [ + "doc/man3/OSSL_STORE_INFO.pod" + ], + "doc/html/man3/OSSL_STORE_LOADER.html" => [ + "doc/man3/OSSL_STORE_LOADER.pod" + ], + "doc/html/man3/OSSL_STORE_SEARCH.html" => [ + "doc/man3/OSSL_STORE_SEARCH.pod" + ], + "doc/html/man3/OSSL_STORE_attach.html" => [ + "doc/man3/OSSL_STORE_attach.pod" + ], + "doc/html/man3/OSSL_STORE_expect.html" => [ + "doc/man3/OSSL_STORE_expect.pod" + ], + "doc/html/man3/OSSL_STORE_open.html" => [ + "doc/man3/OSSL_STORE_open.pod" + ], + "doc/html/man3/OSSL_sleep.html" => [ + "doc/man3/OSSL_sleep.pod" + ], + "doc/html/man3/OSSL_trace_enabled.html" => [ + "doc/man3/OSSL_trace_enabled.pod" + ], + "doc/html/man3/OSSL_trace_get_category_num.html" => [ + "doc/man3/OSSL_trace_get_category_num.pod" + ], + "doc/html/man3/OSSL_trace_set_channel.html" => [ + "doc/man3/OSSL_trace_set_channel.pod" + ], + "doc/html/man3/OpenSSL_add_all_algorithms.html" => [ + "doc/man3/OpenSSL_add_all_algorithms.pod" + ], + "doc/html/man3/OpenSSL_version.html" => [ + "doc/man3/OpenSSL_version.pod" + ], + "doc/html/man3/PBMAC1_get1_pbkdf2_param.html" => [ + "doc/man3/PBMAC1_get1_pbkdf2_param.pod" + ], + "doc/html/man3/PEM_X509_INFO_read_bio_ex.html" => [ + "doc/man3/PEM_X509_INFO_read_bio_ex.pod" + ], + "doc/html/man3/PEM_bytes_read_bio.html" => [ + "doc/man3/PEM_bytes_read_bio.pod" + ], + "doc/html/man3/PEM_read.html" => [ + "doc/man3/PEM_read.pod" + ], + "doc/html/man3/PEM_read_CMS.html" => [ + "doc/man3/PEM_read_CMS.pod" + ], + "doc/html/man3/PEM_read_bio_PrivateKey.html" => [ + "doc/man3/PEM_read_bio_PrivateKey.pod" + ], + "doc/html/man3/PEM_read_bio_ex.html" => [ + "doc/man3/PEM_read_bio_ex.pod" + ], + "doc/html/man3/PEM_write_bio_CMS_stream.html" => [ + "doc/man3/PEM_write_bio_CMS_stream.pod" + ], + "doc/html/man3/PEM_write_bio_PKCS7_stream.html" => [ + "doc/man3/PEM_write_bio_PKCS7_stream.pod" + ], + "doc/html/man3/PKCS12_PBE_keyivgen.html" => [ + "doc/man3/PKCS12_PBE_keyivgen.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_create_cert.html" => [ + "doc/man3/PKCS12_SAFEBAG_create_cert.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_get0_attrs.html" => [ + "doc/man3/PKCS12_SAFEBAG_get0_attrs.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_get1_cert.html" => [ + "doc/man3/PKCS12_SAFEBAG_get1_cert.pod" + ], + "doc/html/man3/PKCS12_SAFEBAG_set0_attrs.html" => [ + "doc/man3/PKCS12_SAFEBAG_set0_attrs.pod" + ], + "doc/html/man3/PKCS12_add1_attr_by_NID.html" => [ + "doc/man3/PKCS12_add1_attr_by_NID.pod" + ], + "doc/html/man3/PKCS12_add_CSPName_asc.html" => [ + "doc/man3/PKCS12_add_CSPName_asc.pod" + ], + "doc/html/man3/PKCS12_add_cert.html" => [ + "doc/man3/PKCS12_add_cert.pod" + ], + "doc/html/man3/PKCS12_add_friendlyname_asc.html" => [ + "doc/man3/PKCS12_add_friendlyname_asc.pod" + ], + "doc/html/man3/PKCS12_add_localkeyid.html" => [ + "doc/man3/PKCS12_add_localkeyid.pod" + ], + "doc/html/man3/PKCS12_add_safe.html" => [ + "doc/man3/PKCS12_add_safe.pod" + ], + "doc/html/man3/PKCS12_create.html" => [ + "doc/man3/PKCS12_create.pod" + ], + "doc/html/man3/PKCS12_decrypt_skey.html" => [ + "doc/man3/PKCS12_decrypt_skey.pod" + ], + "doc/html/man3/PKCS12_gen_mac.html" => [ + "doc/man3/PKCS12_gen_mac.pod" + ], + "doc/html/man3/PKCS12_get_friendlyname.html" => [ + "doc/man3/PKCS12_get_friendlyname.pod" + ], + "doc/html/man3/PKCS12_init.html" => [ + "doc/man3/PKCS12_init.pod" + ], + "doc/html/man3/PKCS12_item_decrypt_d2i.html" => [ + "doc/man3/PKCS12_item_decrypt_d2i.pod" + ], + "doc/html/man3/PKCS12_key_gen_utf8_ex.html" => [ + "doc/man3/PKCS12_key_gen_utf8_ex.pod" + ], + "doc/html/man3/PKCS12_newpass.html" => [ + "doc/man3/PKCS12_newpass.pod" + ], + "doc/html/man3/PKCS12_pack_p7encdata.html" => [ + "doc/man3/PKCS12_pack_p7encdata.pod" + ], + "doc/html/man3/PKCS12_parse.html" => [ + "doc/man3/PKCS12_parse.pod" + ], + "doc/html/man3/PKCS5_PBE_keyivgen.html" => [ + "doc/man3/PKCS5_PBE_keyivgen.pod" + ], + "doc/html/man3/PKCS5_PBKDF2_HMAC.html" => [ + "doc/man3/PKCS5_PBKDF2_HMAC.pod" + ], + "doc/html/man3/PKCS7_decrypt.html" => [ + "doc/man3/PKCS7_decrypt.pod" + ], + "doc/html/man3/PKCS7_encrypt.html" => [ + "doc/man3/PKCS7_encrypt.pod" + ], + "doc/html/man3/PKCS7_get_octet_string.html" => [ + "doc/man3/PKCS7_get_octet_string.pod" + ], + "doc/html/man3/PKCS7_sign.html" => [ + "doc/man3/PKCS7_sign.pod" + ], + "doc/html/man3/PKCS7_sign_add_signer.html" => [ + "doc/man3/PKCS7_sign_add_signer.pod" + ], + "doc/html/man3/PKCS7_type_is_other.html" => [ + "doc/man3/PKCS7_type_is_other.pod" + ], + "doc/html/man3/PKCS7_verify.html" => [ + "doc/man3/PKCS7_verify.pod" + ], + "doc/html/man3/PKCS8_encrypt.html" => [ + "doc/man3/PKCS8_encrypt.pod" + ], + "doc/html/man3/PKCS8_pkey_add1_attr.html" => [ + "doc/man3/PKCS8_pkey_add1_attr.pod" + ], + "doc/html/man3/RAND_add.html" => [ + "doc/man3/RAND_add.pod" + ], + "doc/html/man3/RAND_bytes.html" => [ + "doc/man3/RAND_bytes.pod" + ], + "doc/html/man3/RAND_cleanup.html" => [ + "doc/man3/RAND_cleanup.pod" + ], + "doc/html/man3/RAND_egd.html" => [ + "doc/man3/RAND_egd.pod" + ], + "doc/html/man3/RAND_get0_primary.html" => [ + "doc/man3/RAND_get0_primary.pod" + ], + "doc/html/man3/RAND_load_file.html" => [ + "doc/man3/RAND_load_file.pod" + ], + "doc/html/man3/RAND_set_DRBG_type.html" => [ + "doc/man3/RAND_set_DRBG_type.pod" + ], + "doc/html/man3/RAND_set_rand_method.html" => [ + "doc/man3/RAND_set_rand_method.pod" + ], + "doc/html/man3/RC4_set_key.html" => [ + "doc/man3/RC4_set_key.pod" + ], + "doc/html/man3/RIPEMD160_Init.html" => [ + "doc/man3/RIPEMD160_Init.pod" + ], + "doc/html/man3/RSA_blinding_on.html" => [ + "doc/man3/RSA_blinding_on.pod" + ], + "doc/html/man3/RSA_check_key.html" => [ + "doc/man3/RSA_check_key.pod" + ], + "doc/html/man3/RSA_generate_key.html" => [ + "doc/man3/RSA_generate_key.pod" + ], + "doc/html/man3/RSA_get0_key.html" => [ + "doc/man3/RSA_get0_key.pod" + ], + "doc/html/man3/RSA_meth_new.html" => [ + "doc/man3/RSA_meth_new.pod" + ], + "doc/html/man3/RSA_new.html" => [ + "doc/man3/RSA_new.pod" + ], + "doc/html/man3/RSA_padding_add_PKCS1_type_1.html" => [ + "doc/man3/RSA_padding_add_PKCS1_type_1.pod" + ], + "doc/html/man3/RSA_print.html" => [ + "doc/man3/RSA_print.pod" + ], + "doc/html/man3/RSA_private_encrypt.html" => [ + "doc/man3/RSA_private_encrypt.pod" + ], + "doc/html/man3/RSA_public_encrypt.html" => [ + "doc/man3/RSA_public_encrypt.pod" + ], + "doc/html/man3/RSA_set_method.html" => [ + "doc/man3/RSA_set_method.pod" + ], + "doc/html/man3/RSA_sign.html" => [ + "doc/man3/RSA_sign.pod" + ], + "doc/html/man3/RSA_sign_ASN1_OCTET_STRING.html" => [ + "doc/man3/RSA_sign_ASN1_OCTET_STRING.pod" + ], + "doc/html/man3/RSA_size.html" => [ + "doc/man3/RSA_size.pod" + ], + "doc/html/man3/SCT_new.html" => [ + "doc/man3/SCT_new.pod" + ], + "doc/html/man3/SCT_print.html" => [ + "doc/man3/SCT_print.pod" + ], + "doc/html/man3/SCT_validate.html" => [ + "doc/man3/SCT_validate.pod" + ], + "doc/html/man3/SHA256_Init.html" => [ + "doc/man3/SHA256_Init.pod" + ], + "doc/html/man3/SMIME_read_ASN1.html" => [ + "doc/man3/SMIME_read_ASN1.pod" + ], + "doc/html/man3/SMIME_read_CMS.html" => [ + "doc/man3/SMIME_read_CMS.pod" + ], + "doc/html/man3/SMIME_read_PKCS7.html" => [ + "doc/man3/SMIME_read_PKCS7.pod" + ], + "doc/html/man3/SMIME_write_ASN1.html" => [ + "doc/man3/SMIME_write_ASN1.pod" + ], + "doc/html/man3/SMIME_write_CMS.html" => [ + "doc/man3/SMIME_write_CMS.pod" + ], + "doc/html/man3/SMIME_write_PKCS7.html" => [ + "doc/man3/SMIME_write_PKCS7.pod" + ], + "doc/html/man3/SRP_Calc_B.html" => [ + "doc/man3/SRP_Calc_B.pod" + ], + "doc/html/man3/SRP_VBASE_new.html" => [ + "doc/man3/SRP_VBASE_new.pod" + ], + "doc/html/man3/SRP_create_verifier.html" => [ + "doc/man3/SRP_create_verifier.pod" + ], + "doc/html/man3/SRP_user_pwd_new.html" => [ + "doc/man3/SRP_user_pwd_new.pod" + ], + "doc/html/man3/SSL_CIPHER_get_name.html" => [ + "doc/man3/SSL_CIPHER_get_name.pod" + ], + "doc/html/man3/SSL_COMP_add_compression_method.html" => [ + "doc/man3/SSL_COMP_add_compression_method.pod" + ], + "doc/html/man3/SSL_CONF_CTX_new.html" => [ + "doc/man3/SSL_CONF_CTX_new.pod" + ], + "doc/html/man3/SSL_CONF_CTX_set1_prefix.html" => [ + "doc/man3/SSL_CONF_CTX_set1_prefix.pod" + ], + "doc/html/man3/SSL_CONF_CTX_set_flags.html" => [ + "doc/man3/SSL_CONF_CTX_set_flags.pod" + ], + "doc/html/man3/SSL_CONF_CTX_set_ssl_ctx.html" => [ + "doc/man3/SSL_CONF_CTX_set_ssl_ctx.pod" + ], + "doc/html/man3/SSL_CONF_cmd.html" => [ + "doc/man3/SSL_CONF_cmd.pod" + ], + "doc/html/man3/SSL_CONF_cmd_argv.html" => [ + "doc/man3/SSL_CONF_cmd_argv.pod" + ], + "doc/html/man3/SSL_CTX_add1_chain_cert.html" => [ + "doc/man3/SSL_CTX_add1_chain_cert.pod" + ], + "doc/html/man3/SSL_CTX_add_extra_chain_cert.html" => [ + "doc/man3/SSL_CTX_add_extra_chain_cert.pod" + ], + "doc/html/man3/SSL_CTX_add_session.html" => [ + "doc/man3/SSL_CTX_add_session.pod" + ], + "doc/html/man3/SSL_CTX_config.html" => [ + "doc/man3/SSL_CTX_config.pod" + ], + "doc/html/man3/SSL_CTX_ctrl.html" => [ + "doc/man3/SSL_CTX_ctrl.pod" + ], + "doc/html/man3/SSL_CTX_dane_enable.html" => [ + "doc/man3/SSL_CTX_dane_enable.pod" + ], + "doc/html/man3/SSL_CTX_flush_sessions.html" => [ + "doc/man3/SSL_CTX_flush_sessions.pod" + ], + "doc/html/man3/SSL_CTX_free.html" => [ + "doc/man3/SSL_CTX_free.pod" + ], + "doc/html/man3/SSL_CTX_get0_param.html" => [ + "doc/man3/SSL_CTX_get0_param.pod" + ], + "doc/html/man3/SSL_CTX_get_verify_mode.html" => [ + "doc/man3/SSL_CTX_get_verify_mode.pod" + ], + "doc/html/man3/SSL_CTX_has_client_custom_ext.html" => [ + "doc/man3/SSL_CTX_has_client_custom_ext.pod" + ], + "doc/html/man3/SSL_CTX_load_verify_locations.html" => [ + "doc/man3/SSL_CTX_load_verify_locations.pod" + ], + "doc/html/man3/SSL_CTX_new.html" => [ + "doc/man3/SSL_CTX_new.pod" + ], + "doc/html/man3/SSL_CTX_sess_number.html" => [ + "doc/man3/SSL_CTX_sess_number.pod" + ], + "doc/html/man3/SSL_CTX_sess_set_cache_size.html" => [ + "doc/man3/SSL_CTX_sess_set_cache_size.pod" + ], + "doc/html/man3/SSL_CTX_sess_set_get_cb.html" => [ + "doc/man3/SSL_CTX_sess_set_get_cb.pod" + ], + "doc/html/man3/SSL_CTX_sessions.html" => [ + "doc/man3/SSL_CTX_sessions.pod" + ], + "doc/html/man3/SSL_CTX_set0_CA_list.html" => [ + "doc/man3/SSL_CTX_set0_CA_list.pod" + ], + "doc/html/man3/SSL_CTX_set1_cert_comp_preference.html" => [ + "doc/man3/SSL_CTX_set1_cert_comp_preference.pod" + ], + "doc/html/man3/SSL_CTX_set1_curves.html" => [ + "doc/man3/SSL_CTX_set1_curves.pod" + ], + "doc/html/man3/SSL_CTX_set1_sigalgs.html" => [ + "doc/man3/SSL_CTX_set1_sigalgs.pod" + ], + "doc/html/man3/SSL_CTX_set1_verify_cert_store.html" => [ + "doc/man3/SSL_CTX_set1_verify_cert_store.pod" + ], + "doc/html/man3/SSL_CTX_set_alpn_select_cb.html" => [ + "doc/man3/SSL_CTX_set_alpn_select_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_cert_cb.html" => [ + "doc/man3/SSL_CTX_set_cert_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_cert_store.html" => [ + "doc/man3/SSL_CTX_set_cert_store.pod" + ], + "doc/html/man3/SSL_CTX_set_cert_verify_callback.html" => [ + "doc/man3/SSL_CTX_set_cert_verify_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_cipher_list.html" => [ + "doc/man3/SSL_CTX_set_cipher_list.pod" + ], + "doc/html/man3/SSL_CTX_set_client_cert_cb.html" => [ + "doc/man3/SSL_CTX_set_client_cert_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_client_hello_cb.html" => [ + "doc/man3/SSL_CTX_set_client_hello_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_ct_validation_callback.html" => [ + "doc/man3/SSL_CTX_set_ct_validation_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_ctlog_list_file.html" => [ + "doc/man3/SSL_CTX_set_ctlog_list_file.pod" + ], + "doc/html/man3/SSL_CTX_set_default_passwd_cb.html" => [ + "doc/man3/SSL_CTX_set_default_passwd_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_domain_flags.html" => [ + "doc/man3/SSL_CTX_set_domain_flags.pod" + ], + "doc/html/man3/SSL_CTX_set_generate_session_id.html" => [ + "doc/man3/SSL_CTX_set_generate_session_id.pod" + ], + "doc/html/man3/SSL_CTX_set_info_callback.html" => [ + "doc/man3/SSL_CTX_set_info_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_keylog_callback.html" => [ + "doc/man3/SSL_CTX_set_keylog_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_max_cert_list.html" => [ + "doc/man3/SSL_CTX_set_max_cert_list.pod" + ], + "doc/html/man3/SSL_CTX_set_min_proto_version.html" => [ + "doc/man3/SSL_CTX_set_min_proto_version.pod" + ], + "doc/html/man3/SSL_CTX_set_mode.html" => [ + "doc/man3/SSL_CTX_set_mode.pod" + ], + "doc/html/man3/SSL_CTX_set_msg_callback.html" => [ + "doc/man3/SSL_CTX_set_msg_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_new_pending_conn_cb.html" => [ + "doc/man3/SSL_CTX_set_new_pending_conn_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_num_tickets.html" => [ + "doc/man3/SSL_CTX_set_num_tickets.pod" + ], + "doc/html/man3/SSL_CTX_set_options.html" => [ + "doc/man3/SSL_CTX_set_options.pod" + ], + "doc/html/man3/SSL_CTX_set_psk_client_callback.html" => [ + "doc/man3/SSL_CTX_set_psk_client_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_quiet_shutdown.html" => [ + "doc/man3/SSL_CTX_set_quiet_shutdown.pod" + ], + "doc/html/man3/SSL_CTX_set_read_ahead.html" => [ + "doc/man3/SSL_CTX_set_read_ahead.pod" + ], + "doc/html/man3/SSL_CTX_set_record_padding_callback.html" => [ + "doc/man3/SSL_CTX_set_record_padding_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_security_level.html" => [ + "doc/man3/SSL_CTX_set_security_level.pod" + ], + "doc/html/man3/SSL_CTX_set_session_cache_mode.html" => [ + "doc/man3/SSL_CTX_set_session_cache_mode.pod" + ], + "doc/html/man3/SSL_CTX_set_session_id_context.html" => [ + "doc/man3/SSL_CTX_set_session_id_context.pod" + ], + "doc/html/man3/SSL_CTX_set_session_ticket_cb.html" => [ + "doc/man3/SSL_CTX_set_session_ticket_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_split_send_fragment.html" => [ + "doc/man3/SSL_CTX_set_split_send_fragment.pod" + ], + "doc/html/man3/SSL_CTX_set_srp_password.html" => [ + "doc/man3/SSL_CTX_set_srp_password.pod" + ], + "doc/html/man3/SSL_CTX_set_ssl_version.html" => [ + "doc/man3/SSL_CTX_set_ssl_version.pod" + ], + "doc/html/man3/SSL_CTX_set_stateless_cookie_generate_cb.html" => [ + "doc/man3/SSL_CTX_set_stateless_cookie_generate_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_timeout.html" => [ + "doc/man3/SSL_CTX_set_timeout.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_servername_callback.html" => [ + "doc/man3/SSL_CTX_set_tlsext_servername_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_status_cb.html" => [ + "doc/man3/SSL_CTX_set_tlsext_status_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_ticket_key_cb.html" => [ + "doc/man3/SSL_CTX_set_tlsext_ticket_key_cb.pod" + ], + "doc/html/man3/SSL_CTX_set_tlsext_use_srtp.html" => [ + "doc/man3/SSL_CTX_set_tlsext_use_srtp.pod" + ], + "doc/html/man3/SSL_CTX_set_tmp_dh_callback.html" => [ + "doc/man3/SSL_CTX_set_tmp_dh_callback.pod" + ], + "doc/html/man3/SSL_CTX_set_tmp_ecdh.html" => [ + "doc/man3/SSL_CTX_set_tmp_ecdh.pod" + ], + "doc/html/man3/SSL_CTX_set_verify.html" => [ + "doc/man3/SSL_CTX_set_verify.pod" + ], + "doc/html/man3/SSL_CTX_use_certificate.html" => [ + "doc/man3/SSL_CTX_use_certificate.pod" + ], + "doc/html/man3/SSL_CTX_use_psk_identity_hint.html" => [ + "doc/man3/SSL_CTX_use_psk_identity_hint.pod" + ], + "doc/html/man3/SSL_CTX_use_serverinfo.html" => [ + "doc/man3/SSL_CTX_use_serverinfo.pod" + ], + "doc/html/man3/SSL_SESSION_free.html" => [ + "doc/man3/SSL_SESSION_free.pod" + ], + "doc/html/man3/SSL_SESSION_get0_cipher.html" => [ + "doc/man3/SSL_SESSION_get0_cipher.pod" + ], + "doc/html/man3/SSL_SESSION_get0_hostname.html" => [ + "doc/man3/SSL_SESSION_get0_hostname.pod" + ], + "doc/html/man3/SSL_SESSION_get0_id_context.html" => [ + "doc/man3/SSL_SESSION_get0_id_context.pod" + ], + "doc/html/man3/SSL_SESSION_get0_peer.html" => [ + "doc/man3/SSL_SESSION_get0_peer.pod" + ], + "doc/html/man3/SSL_SESSION_get_compress_id.html" => [ + "doc/man3/SSL_SESSION_get_compress_id.pod" + ], + "doc/html/man3/SSL_SESSION_get_protocol_version.html" => [ + "doc/man3/SSL_SESSION_get_protocol_version.pod" + ], + "doc/html/man3/SSL_SESSION_get_time.html" => [ + "doc/man3/SSL_SESSION_get_time.pod" + ], + "doc/html/man3/SSL_SESSION_has_ticket.html" => [ + "doc/man3/SSL_SESSION_has_ticket.pod" + ], + "doc/html/man3/SSL_SESSION_is_resumable.html" => [ + "doc/man3/SSL_SESSION_is_resumable.pod" + ], + "doc/html/man3/SSL_SESSION_print.html" => [ + "doc/man3/SSL_SESSION_print.pod" + ], + "doc/html/man3/SSL_SESSION_set1_id.html" => [ + "doc/man3/SSL_SESSION_set1_id.pod" + ], + "doc/html/man3/SSL_accept.html" => [ + "doc/man3/SSL_accept.pod" + ], + "doc/html/man3/SSL_accept_stream.html" => [ + "doc/man3/SSL_accept_stream.pod" + ], + "doc/html/man3/SSL_alert_type_string.html" => [ + "doc/man3/SSL_alert_type_string.pod" + ], + "doc/html/man3/SSL_alloc_buffers.html" => [ + "doc/man3/SSL_alloc_buffers.pod" + ], + "doc/html/man3/SSL_check_chain.html" => [ + "doc/man3/SSL_check_chain.pod" + ], + "doc/html/man3/SSL_clear.html" => [ + "doc/man3/SSL_clear.pod" + ], + "doc/html/man3/SSL_connect.html" => [ + "doc/man3/SSL_connect.pod" + ], + "doc/html/man3/SSL_do_handshake.html" => [ + "doc/man3/SSL_do_handshake.pod" + ], + "doc/html/man3/SSL_export_keying_material.html" => [ + "doc/man3/SSL_export_keying_material.pod" + ], + "doc/html/man3/SSL_extension_supported.html" => [ + "doc/man3/SSL_extension_supported.pod" + ], + "doc/html/man3/SSL_free.html" => [ + "doc/man3/SSL_free.pod" + ], + "doc/html/man3/SSL_get0_connection.html" => [ + "doc/man3/SSL_get0_connection.pod" + ], + "doc/html/man3/SSL_get0_group_name.html" => [ + "doc/man3/SSL_get0_group_name.pod" + ], + "doc/html/man3/SSL_get0_peer_rpk.html" => [ + "doc/man3/SSL_get0_peer_rpk.pod" + ], + "doc/html/man3/SSL_get0_peer_scts.html" => [ + "doc/man3/SSL_get0_peer_scts.pod" + ], + "doc/html/man3/SSL_get1_builtin_sigalgs.html" => [ + "doc/man3/SSL_get1_builtin_sigalgs.pod" + ], + "doc/html/man3/SSL_get_SSL_CTX.html" => [ + "doc/man3/SSL_get_SSL_CTX.pod" + ], + "doc/html/man3/SSL_get_all_async_fds.html" => [ + "doc/man3/SSL_get_all_async_fds.pod" + ], + "doc/html/man3/SSL_get_certificate.html" => [ + "doc/man3/SSL_get_certificate.pod" + ], + "doc/html/man3/SSL_get_ciphers.html" => [ + "doc/man3/SSL_get_ciphers.pod" + ], + "doc/html/man3/SSL_get_client_random.html" => [ + "doc/man3/SSL_get_client_random.pod" + ], + "doc/html/man3/SSL_get_conn_close_info.html" => [ + "doc/man3/SSL_get_conn_close_info.pod" + ], + "doc/html/man3/SSL_get_current_cipher.html" => [ + "doc/man3/SSL_get_current_cipher.pod" + ], + "doc/html/man3/SSL_get_default_timeout.html" => [ + "doc/man3/SSL_get_default_timeout.pod" + ], + "doc/html/man3/SSL_get_error.html" => [ + "doc/man3/SSL_get_error.pod" + ], + "doc/html/man3/SSL_get_event_timeout.html" => [ + "doc/man3/SSL_get_event_timeout.pod" + ], + "doc/html/man3/SSL_get_extms_support.html" => [ + "doc/man3/SSL_get_extms_support.pod" + ], + "doc/html/man3/SSL_get_fd.html" => [ + "doc/man3/SSL_get_fd.pod" + ], + "doc/html/man3/SSL_get_handshake_rtt.html" => [ + "doc/man3/SSL_get_handshake_rtt.pod" + ], + "doc/html/man3/SSL_get_peer_cert_chain.html" => [ + "doc/man3/SSL_get_peer_cert_chain.pod" + ], + "doc/html/man3/SSL_get_peer_certificate.html" => [ + "doc/man3/SSL_get_peer_certificate.pod" + ], + "doc/html/man3/SSL_get_peer_signature_nid.html" => [ + "doc/man3/SSL_get_peer_signature_nid.pod" + ], + "doc/html/man3/SSL_get_peer_tmp_key.html" => [ + "doc/man3/SSL_get_peer_tmp_key.pod" + ], + "doc/html/man3/SSL_get_psk_identity.html" => [ + "doc/man3/SSL_get_psk_identity.pod" + ], + "doc/html/man3/SSL_get_rbio.html" => [ + "doc/man3/SSL_get_rbio.pod" + ], + "doc/html/man3/SSL_get_rpoll_descriptor.html" => [ + "doc/man3/SSL_get_rpoll_descriptor.pod" + ], + "doc/html/man3/SSL_get_session.html" => [ + "doc/man3/SSL_get_session.pod" + ], + "doc/html/man3/SSL_get_shared_sigalgs.html" => [ + "doc/man3/SSL_get_shared_sigalgs.pod" + ], + "doc/html/man3/SSL_get_stream_id.html" => [ + "doc/man3/SSL_get_stream_id.pod" + ], + "doc/html/man3/SSL_get_stream_read_state.html" => [ + "doc/man3/SSL_get_stream_read_state.pod" + ], + "doc/html/man3/SSL_get_value_uint.html" => [ + "doc/man3/SSL_get_value_uint.pod" + ], + "doc/html/man3/SSL_get_verify_result.html" => [ + "doc/man3/SSL_get_verify_result.pod" + ], + "doc/html/man3/SSL_get_version.html" => [ + "doc/man3/SSL_get_version.pod" + ], + "doc/html/man3/SSL_group_to_name.html" => [ + "doc/man3/SSL_group_to_name.pod" + ], + "doc/html/man3/SSL_handle_events.html" => [ + "doc/man3/SSL_handle_events.pod" + ], + "doc/html/man3/SSL_in_init.html" => [ + "doc/man3/SSL_in_init.pod" + ], + "doc/html/man3/SSL_inject_net_dgram.html" => [ + "doc/man3/SSL_inject_net_dgram.pod" + ], + "doc/html/man3/SSL_key_update.html" => [ + "doc/man3/SSL_key_update.pod" + ], + "doc/html/man3/SSL_library_init.html" => [ + "doc/man3/SSL_library_init.pod" + ], + "doc/html/man3/SSL_load_client_CA_file.html" => [ + "doc/man3/SSL_load_client_CA_file.pod" + ], + "doc/html/man3/SSL_new.html" => [ + "doc/man3/SSL_new.pod" + ], + "doc/html/man3/SSL_new_domain.html" => [ + "doc/man3/SSL_new_domain.pod" + ], + "doc/html/man3/SSL_new_listener.html" => [ + "doc/man3/SSL_new_listener.pod" + ], + "doc/html/man3/SSL_new_stream.html" => [ + "doc/man3/SSL_new_stream.pod" + ], + "doc/html/man3/SSL_pending.html" => [ + "doc/man3/SSL_pending.pod" + ], + "doc/html/man3/SSL_poll.html" => [ + "doc/man3/SSL_poll.pod" + ], + "doc/html/man3/SSL_read.html" => [ + "doc/man3/SSL_read.pod" + ], + "doc/html/man3/SSL_read_early_data.html" => [ + "doc/man3/SSL_read_early_data.pod" + ], + "doc/html/man3/SSL_rstate_string.html" => [ + "doc/man3/SSL_rstate_string.pod" + ], + "doc/html/man3/SSL_session_reused.html" => [ + "doc/man3/SSL_session_reused.pod" + ], + "doc/html/man3/SSL_set1_host.html" => [ + "doc/man3/SSL_set1_host.pod" + ], + "doc/html/man3/SSL_set1_initial_peer_addr.html" => [ + "doc/man3/SSL_set1_initial_peer_addr.pod" + ], + "doc/html/man3/SSL_set1_server_cert_type.html" => [ + "doc/man3/SSL_set1_server_cert_type.pod" + ], + "doc/html/man3/SSL_set_async_callback.html" => [ + "doc/man3/SSL_set_async_callback.pod" + ], + "doc/html/man3/SSL_set_bio.html" => [ + "doc/man3/SSL_set_bio.pod" + ], + "doc/html/man3/SSL_set_blocking_mode.html" => [ + "doc/man3/SSL_set_blocking_mode.pod" + ], + "doc/html/man3/SSL_set_connect_state.html" => [ + "doc/man3/SSL_set_connect_state.pod" + ], + "doc/html/man3/SSL_set_default_stream_mode.html" => [ + "doc/man3/SSL_set_default_stream_mode.pod" + ], + "doc/html/man3/SSL_set_fd.html" => [ + "doc/man3/SSL_set_fd.pod" + ], + "doc/html/man3/SSL_set_incoming_stream_policy.html" => [ + "doc/man3/SSL_set_incoming_stream_policy.pod" + ], + "doc/html/man3/SSL_set_quic_tls_cbs.html" => [ + "doc/man3/SSL_set_quic_tls_cbs.pod" + ], + "doc/html/man3/SSL_set_retry_verify.html" => [ + "doc/man3/SSL_set_retry_verify.pod" + ], + "doc/html/man3/SSL_set_session.html" => [ + "doc/man3/SSL_set_session.pod" + ], + "doc/html/man3/SSL_set_session_secret_cb.html" => [ + "doc/man3/SSL_set_session_secret_cb.pod" + ], + "doc/html/man3/SSL_set_shutdown.html" => [ + "doc/man3/SSL_set_shutdown.pod" + ], + "doc/html/man3/SSL_set_verify_result.html" => [ + "doc/man3/SSL_set_verify_result.pod" + ], + "doc/html/man3/SSL_shutdown.html" => [ + "doc/man3/SSL_shutdown.pod" + ], + "doc/html/man3/SSL_state_string.html" => [ + "doc/man3/SSL_state_string.pod" + ], + "doc/html/man3/SSL_stream_conclude.html" => [ + "doc/man3/SSL_stream_conclude.pod" + ], + "doc/html/man3/SSL_stream_reset.html" => [ + "doc/man3/SSL_stream_reset.pod" + ], + "doc/html/man3/SSL_want.html" => [ + "doc/man3/SSL_want.pod" + ], + "doc/html/man3/SSL_write.html" => [ + "doc/man3/SSL_write.pod" + ], + "doc/html/man3/TS_RESP_CTX_new.html" => [ + "doc/man3/TS_RESP_CTX_new.pod" + ], + "doc/html/man3/TS_VERIFY_CTX.html" => [ + "doc/man3/TS_VERIFY_CTX.pod" + ], + "doc/html/man3/UI_STRING.html" => [ + "doc/man3/UI_STRING.pod" + ], + "doc/html/man3/UI_UTIL_read_pw.html" => [ + "doc/man3/UI_UTIL_read_pw.pod" + ], + "doc/html/man3/UI_create_method.html" => [ + "doc/man3/UI_create_method.pod" + ], + "doc/html/man3/UI_new.html" => [ + "doc/man3/UI_new.pod" + ], + "doc/html/man3/X509V3_EXT_print.html" => [ + "doc/man3/X509V3_EXT_print.pod" + ], + "doc/html/man3/X509V3_get_d2i.html" => [ + "doc/man3/X509V3_get_d2i.pod" + ], + "doc/html/man3/X509V3_set_ctx.html" => [ + "doc/man3/X509V3_set_ctx.pod" + ], + "doc/html/man3/X509_ACERT_add1_attr.html" => [ + "doc/man3/X509_ACERT_add1_attr.pod" + ], + "doc/html/man3/X509_ACERT_add_attr_nconf.html" => [ + "doc/man3/X509_ACERT_add_attr_nconf.pod" + ], + "doc/html/man3/X509_ACERT_get0_holder_baseCertId.html" => [ + "doc/man3/X509_ACERT_get0_holder_baseCertId.pod" + ], + "doc/html/man3/X509_ACERT_get_attr.html" => [ + "doc/man3/X509_ACERT_get_attr.pod" + ], + "doc/html/man3/X509_ACERT_print_ex.html" => [ + "doc/man3/X509_ACERT_print_ex.pod" + ], + "doc/html/man3/X509_ALGOR_dup.html" => [ + "doc/man3/X509_ALGOR_dup.pod" + ], + "doc/html/man3/X509_ATTRIBUTE.html" => [ + "doc/man3/X509_ATTRIBUTE.pod" + ], + "doc/html/man3/X509_CRL_get0_by_serial.html" => [ + "doc/man3/X509_CRL_get0_by_serial.pod" + ], + "doc/html/man3/X509_EXTENSION_set_object.html" => [ + "doc/man3/X509_EXTENSION_set_object.pod" + ], + "doc/html/man3/X509_LOOKUP.html" => [ + "doc/man3/X509_LOOKUP.pod" + ], + "doc/html/man3/X509_LOOKUP_hash_dir.html" => [ + "doc/man3/X509_LOOKUP_hash_dir.pod" + ], + "doc/html/man3/X509_LOOKUP_meth_new.html" => [ + "doc/man3/X509_LOOKUP_meth_new.pod" + ], + "doc/html/man3/X509_NAME_ENTRY_get_object.html" => [ + "doc/man3/X509_NAME_ENTRY_get_object.pod" + ], + "doc/html/man3/X509_NAME_add_entry_by_txt.html" => [ + "doc/man3/X509_NAME_add_entry_by_txt.pod" + ], + "doc/html/man3/X509_NAME_get0_der.html" => [ + "doc/man3/X509_NAME_get0_der.pod" + ], + "doc/html/man3/X509_NAME_get_index_by_NID.html" => [ + "doc/man3/X509_NAME_get_index_by_NID.pod" + ], + "doc/html/man3/X509_NAME_print_ex.html" => [ + "doc/man3/X509_NAME_print_ex.pod" + ], + "doc/html/man3/X509_PUBKEY_new.html" => [ + "doc/man3/X509_PUBKEY_new.pod" + ], + "doc/html/man3/X509_REQ_get_attr.html" => [ + "doc/man3/X509_REQ_get_attr.pod" + ], + "doc/html/man3/X509_REQ_get_extensions.html" => [ + "doc/man3/X509_REQ_get_extensions.pod" + ], + "doc/html/man3/X509_SIG_get0.html" => [ + "doc/man3/X509_SIG_get0.pod" + ], + "doc/html/man3/X509_STORE_CTX_get_by_subject.html" => [ + "doc/man3/X509_STORE_CTX_get_by_subject.pod" + ], + "doc/html/man3/X509_STORE_CTX_get_error.html" => [ + "doc/man3/X509_STORE_CTX_get_error.pod" + ], + "doc/html/man3/X509_STORE_CTX_new.html" => [ + "doc/man3/X509_STORE_CTX_new.pod" + ], + "doc/html/man3/X509_STORE_CTX_set_verify_cb.html" => [ + "doc/man3/X509_STORE_CTX_set_verify_cb.pod" + ], + "doc/html/man3/X509_STORE_add_cert.html" => [ + "doc/man3/X509_STORE_add_cert.pod" + ], + "doc/html/man3/X509_STORE_get0_param.html" => [ + "doc/man3/X509_STORE_get0_param.pod" + ], + "doc/html/man3/X509_STORE_new.html" => [ + "doc/man3/X509_STORE_new.pod" + ], + "doc/html/man3/X509_STORE_set_verify_cb_func.html" => [ + "doc/man3/X509_STORE_set_verify_cb_func.pod" + ], + "doc/html/man3/X509_VERIFY_PARAM_set_flags.html" => [ + "doc/man3/X509_VERIFY_PARAM_set_flags.pod" + ], + "doc/html/man3/X509_add_cert.html" => [ + "doc/man3/X509_add_cert.pod" + ], + "doc/html/man3/X509_check_ca.html" => [ + "doc/man3/X509_check_ca.pod" + ], + "doc/html/man3/X509_check_host.html" => [ + "doc/man3/X509_check_host.pod" + ], + "doc/html/man3/X509_check_issued.html" => [ + "doc/man3/X509_check_issued.pod" + ], + "doc/html/man3/X509_check_private_key.html" => [ + "doc/man3/X509_check_private_key.pod" + ], + "doc/html/man3/X509_check_purpose.html" => [ + "doc/man3/X509_check_purpose.pod" + ], + "doc/html/man3/X509_cmp.html" => [ + "doc/man3/X509_cmp.pod" + ], + "doc/html/man3/X509_cmp_time.html" => [ + "doc/man3/X509_cmp_time.pod" + ], + "doc/html/man3/X509_digest.html" => [ + "doc/man3/X509_digest.pod" + ], + "doc/html/man3/X509_dup.html" => [ + "doc/man3/X509_dup.pod" + ], + "doc/html/man3/X509_get0_distinguishing_id.html" => [ + "doc/man3/X509_get0_distinguishing_id.pod" + ], + "doc/html/man3/X509_get0_notBefore.html" => [ + "doc/man3/X509_get0_notBefore.pod" + ], + "doc/html/man3/X509_get0_signature.html" => [ + "doc/man3/X509_get0_signature.pod" + ], + "doc/html/man3/X509_get0_uids.html" => [ + "doc/man3/X509_get0_uids.pod" + ], + "doc/html/man3/X509_get_default_cert_file.html" => [ + "doc/man3/X509_get_default_cert_file.pod" + ], + "doc/html/man3/X509_get_extension_flags.html" => [ + "doc/man3/X509_get_extension_flags.pod" + ], + "doc/html/man3/X509_get_pubkey.html" => [ + "doc/man3/X509_get_pubkey.pod" + ], + "doc/html/man3/X509_get_serialNumber.html" => [ + "doc/man3/X509_get_serialNumber.pod" + ], + "doc/html/man3/X509_get_subject_name.html" => [ + "doc/man3/X509_get_subject_name.pod" + ], + "doc/html/man3/X509_get_version.html" => [ + "doc/man3/X509_get_version.pod" + ], + "doc/html/man3/X509_load_http.html" => [ + "doc/man3/X509_load_http.pod" + ], + "doc/html/man3/X509_new.html" => [ + "doc/man3/X509_new.pod" + ], + "doc/html/man3/X509_sign.html" => [ + "doc/man3/X509_sign.pod" + ], + "doc/html/man3/X509_verify.html" => [ + "doc/man3/X509_verify.pod" + ], + "doc/html/man3/X509_verify_cert.html" => [ + "doc/man3/X509_verify_cert.pod" + ], + "doc/html/man3/X509v3_get_ext_by_NID.html" => [ + "doc/man3/X509v3_get_ext_by_NID.pod" + ], + "doc/html/man3/b2i_PVK_bio_ex.html" => [ + "doc/man3/b2i_PVK_bio_ex.pod" + ], + "doc/html/man3/d2i_PKCS8PrivateKey_bio.html" => [ + "doc/man3/d2i_PKCS8PrivateKey_bio.pod" + ], + "doc/html/man3/d2i_PrivateKey.html" => [ + "doc/man3/d2i_PrivateKey.pod" + ], + "doc/html/man3/d2i_RSAPrivateKey.html" => [ + "doc/man3/d2i_RSAPrivateKey.pod" + ], + "doc/html/man3/d2i_SSL_SESSION.html" => [ + "doc/man3/d2i_SSL_SESSION.pod" + ], + "doc/html/man3/d2i_X509.html" => [ + "doc/man3/d2i_X509.pod" + ], + "doc/html/man3/i2d_CMS_bio_stream.html" => [ + "doc/man3/i2d_CMS_bio_stream.pod" + ], + "doc/html/man3/i2d_PKCS7_bio_stream.html" => [ + "doc/man3/i2d_PKCS7_bio_stream.pod" + ], + "doc/html/man3/i2d_re_X509_tbs.html" => [ + "doc/man3/i2d_re_X509_tbs.pod" + ], + "doc/html/man3/o2i_SCT_LIST.html" => [ + "doc/man3/o2i_SCT_LIST.pod" + ], + "doc/html/man3/s2i_ASN1_IA5STRING.html" => [ + "doc/man3/s2i_ASN1_IA5STRING.pod" + ], + "doc/html/man5/config.html" => [ + "doc/man5/config.pod" + ], + "doc/html/man5/fips_config.html" => [ + "doc/man5/fips_config.pod" + ], + "doc/html/man5/x509v3_config.html" => [ + "doc/man5/x509v3_config.pod" + ], + "doc/html/man7/EVP_ASYM_CIPHER-RSA.html" => [ + "doc/man7/EVP_ASYM_CIPHER-RSA.pod" + ], + "doc/html/man7/EVP_ASYM_CIPHER-SM2.html" => [ + "doc/man7/EVP_ASYM_CIPHER-SM2.pod" + ], + "doc/html/man7/EVP_CIPHER-AES.html" => [ + "doc/man7/EVP_CIPHER-AES.pod" + ], + "doc/html/man7/EVP_CIPHER-ARIA.html" => [ + "doc/man7/EVP_CIPHER-ARIA.pod" + ], + "doc/html/man7/EVP_CIPHER-BLOWFISH.html" => [ + "doc/man7/EVP_CIPHER-BLOWFISH.pod" + ], + "doc/html/man7/EVP_CIPHER-CAMELLIA.html" => [ + "doc/man7/EVP_CIPHER-CAMELLIA.pod" + ], + "doc/html/man7/EVP_CIPHER-CAST.html" => [ + "doc/man7/EVP_CIPHER-CAST.pod" + ], + "doc/html/man7/EVP_CIPHER-CHACHA.html" => [ + "doc/man7/EVP_CIPHER-CHACHA.pod" + ], + "doc/html/man7/EVP_CIPHER-DES.html" => [ + "doc/man7/EVP_CIPHER-DES.pod" + ], + "doc/html/man7/EVP_CIPHER-IDEA.html" => [ + "doc/man7/EVP_CIPHER-IDEA.pod" + ], + "doc/html/man7/EVP_CIPHER-NULL.html" => [ + "doc/man7/EVP_CIPHER-NULL.pod" + ], + "doc/html/man7/EVP_CIPHER-RC2.html" => [ + "doc/man7/EVP_CIPHER-RC2.pod" + ], + "doc/html/man7/EVP_CIPHER-RC4.html" => [ + "doc/man7/EVP_CIPHER-RC4.pod" + ], + "doc/html/man7/EVP_CIPHER-RC5.html" => [ + "doc/man7/EVP_CIPHER-RC5.pod" + ], + "doc/html/man7/EVP_CIPHER-SEED.html" => [ + "doc/man7/EVP_CIPHER-SEED.pod" + ], + "doc/html/man7/EVP_CIPHER-SM4.html" => [ + "doc/man7/EVP_CIPHER-SM4.pod" + ], + "doc/html/man7/EVP_KDF-ARGON2.html" => [ + "doc/man7/EVP_KDF-ARGON2.pod" + ], + "doc/html/man7/EVP_KDF-HKDF.html" => [ + "doc/man7/EVP_KDF-HKDF.pod" + ], + "doc/html/man7/EVP_KDF-HMAC-DRBG.html" => [ + "doc/man7/EVP_KDF-HMAC-DRBG.pod" + ], + "doc/html/man7/EVP_KDF-KB.html" => [ + "doc/man7/EVP_KDF-KB.pod" + ], + "doc/html/man7/EVP_KDF-KRB5KDF.html" => [ + "doc/man7/EVP_KDF-KRB5KDF.pod" + ], + "doc/html/man7/EVP_KDF-PBKDF1.html" => [ + "doc/man7/EVP_KDF-PBKDF1.pod" + ], + "doc/html/man7/EVP_KDF-PBKDF2.html" => [ + "doc/man7/EVP_KDF-PBKDF2.pod" + ], + "doc/html/man7/EVP_KDF-PKCS12KDF.html" => [ + "doc/man7/EVP_KDF-PKCS12KDF.pod" + ], + "doc/html/man7/EVP_KDF-PVKKDF.html" => [ + "doc/man7/EVP_KDF-PVKKDF.pod" + ], + "doc/html/man7/EVP_KDF-SCRYPT.html" => [ + "doc/man7/EVP_KDF-SCRYPT.pod" + ], + "doc/html/man7/EVP_KDF-SS.html" => [ + "doc/man7/EVP_KDF-SS.pod" + ], + "doc/html/man7/EVP_KDF-SSHKDF.html" => [ + "doc/man7/EVP_KDF-SSHKDF.pod" + ], + "doc/html/man7/EVP_KDF-TLS13_KDF.html" => [ + "doc/man7/EVP_KDF-TLS13_KDF.pod" + ], + "doc/html/man7/EVP_KDF-TLS1_PRF.html" => [ + "doc/man7/EVP_KDF-TLS1_PRF.pod" + ], + "doc/html/man7/EVP_KDF-X942-ASN1.html" => [ + "doc/man7/EVP_KDF-X942-ASN1.pod" + ], + "doc/html/man7/EVP_KDF-X942-CONCAT.html" => [ + "doc/man7/EVP_KDF-X942-CONCAT.pod" + ], + "doc/html/man7/EVP_KDF-X963.html" => [ + "doc/man7/EVP_KDF-X963.pod" + ], + "doc/html/man7/EVP_KEM-EC.html" => [ + "doc/man7/EVP_KEM-EC.pod" + ], + "doc/html/man7/EVP_KEM-ML-KEM.html" => [ + "doc/man7/EVP_KEM-ML-KEM.pod" + ], + "doc/html/man7/EVP_KEM-RSA.html" => [ + "doc/man7/EVP_KEM-RSA.pod" + ], + "doc/html/man7/EVP_KEM-X25519.html" => [ + "doc/man7/EVP_KEM-X25519.pod" + ], + "doc/html/man7/EVP_KEYEXCH-DH.html" => [ + "doc/man7/EVP_KEYEXCH-DH.pod" + ], + "doc/html/man7/EVP_KEYEXCH-ECDH.html" => [ + "doc/man7/EVP_KEYEXCH-ECDH.pod" + ], + "doc/html/man7/EVP_KEYEXCH-X25519.html" => [ + "doc/man7/EVP_KEYEXCH-X25519.pod" + ], + "doc/html/man7/EVP_MAC-BLAKE2.html" => [ + "doc/man7/EVP_MAC-BLAKE2.pod" + ], + "doc/html/man7/EVP_MAC-CMAC.html" => [ + "doc/man7/EVP_MAC-CMAC.pod" + ], + "doc/html/man7/EVP_MAC-GMAC.html" => [ + "doc/man7/EVP_MAC-GMAC.pod" + ], + "doc/html/man7/EVP_MAC-HMAC.html" => [ + "doc/man7/EVP_MAC-HMAC.pod" + ], + "doc/html/man7/EVP_MAC-KMAC.html" => [ + "doc/man7/EVP_MAC-KMAC.pod" + ], + "doc/html/man7/EVP_MAC-Poly1305.html" => [ + "doc/man7/EVP_MAC-Poly1305.pod" + ], + "doc/html/man7/EVP_MAC-Siphash.html" => [ + "doc/man7/EVP_MAC-Siphash.pod" + ], + "doc/html/man7/EVP_MD-BLAKE2.html" => [ + "doc/man7/EVP_MD-BLAKE2.pod" + ], + "doc/html/man7/EVP_MD-KECCAK.html" => [ + "doc/man7/EVP_MD-KECCAK.pod" + ], + "doc/html/man7/EVP_MD-MD2.html" => [ + "doc/man7/EVP_MD-MD2.pod" + ], + "doc/html/man7/EVP_MD-MD4.html" => [ + "doc/man7/EVP_MD-MD4.pod" + ], + "doc/html/man7/EVP_MD-MD5-SHA1.html" => [ + "doc/man7/EVP_MD-MD5-SHA1.pod" + ], + "doc/html/man7/EVP_MD-MD5.html" => [ + "doc/man7/EVP_MD-MD5.pod" + ], + "doc/html/man7/EVP_MD-MDC2.html" => [ + "doc/man7/EVP_MD-MDC2.pod" + ], + "doc/html/man7/EVP_MD-NULL.html" => [ + "doc/man7/EVP_MD-NULL.pod" + ], + "doc/html/man7/EVP_MD-RIPEMD160.html" => [ + "doc/man7/EVP_MD-RIPEMD160.pod" + ], + "doc/html/man7/EVP_MD-SHA1.html" => [ + "doc/man7/EVP_MD-SHA1.pod" + ], + "doc/html/man7/EVP_MD-SHA2.html" => [ + "doc/man7/EVP_MD-SHA2.pod" + ], + "doc/html/man7/EVP_MD-SHA3.html" => [ + "doc/man7/EVP_MD-SHA3.pod" + ], + "doc/html/man7/EVP_MD-SHAKE.html" => [ + "doc/man7/EVP_MD-SHAKE.pod" + ], + "doc/html/man7/EVP_MD-SM3.html" => [ + "doc/man7/EVP_MD-SM3.pod" + ], + "doc/html/man7/EVP_MD-WHIRLPOOL.html" => [ + "doc/man7/EVP_MD-WHIRLPOOL.pod" + ], + "doc/html/man7/EVP_MD-common.html" => [ + "doc/man7/EVP_MD-common.pod" + ], + "doc/html/man7/EVP_PKEY-DH.html" => [ + "doc/man7/EVP_PKEY-DH.pod" + ], + "doc/html/man7/EVP_PKEY-DSA.html" => [ + "doc/man7/EVP_PKEY-DSA.pod" + ], + "doc/html/man7/EVP_PKEY-EC.html" => [ + "doc/man7/EVP_PKEY-EC.pod" + ], + "doc/html/man7/EVP_PKEY-FFC.html" => [ + "doc/man7/EVP_PKEY-FFC.pod" + ], + "doc/html/man7/EVP_PKEY-HMAC.html" => [ + "doc/man7/EVP_PKEY-HMAC.pod" + ], + "doc/html/man7/EVP_PKEY-ML-DSA.html" => [ + "doc/man7/EVP_PKEY-ML-DSA.pod" + ], + "doc/html/man7/EVP_PKEY-ML-KEM.html" => [ + "doc/man7/EVP_PKEY-ML-KEM.pod" + ], + "doc/html/man7/EVP_PKEY-RSA.html" => [ + "doc/man7/EVP_PKEY-RSA.pod" + ], + "doc/html/man7/EVP_PKEY-SLH-DSA.html" => [ + "doc/man7/EVP_PKEY-SLH-DSA.pod" + ], + "doc/html/man7/EVP_PKEY-SM2.html" => [ + "doc/man7/EVP_PKEY-SM2.pod" + ], + "doc/html/man7/EVP_PKEY-X25519.html" => [ + "doc/man7/EVP_PKEY-X25519.pod" + ], + "doc/html/man7/EVP_RAND-CRNG-TEST.html" => [ + "doc/man7/EVP_RAND-CRNG-TEST.pod" + ], + "doc/html/man7/EVP_RAND-CTR-DRBG.html" => [ + "doc/man7/EVP_RAND-CTR-DRBG.pod" + ], + "doc/html/man7/EVP_RAND-HASH-DRBG.html" => [ + "doc/man7/EVP_RAND-HASH-DRBG.pod" + ], + "doc/html/man7/EVP_RAND-HMAC-DRBG.html" => [ + "doc/man7/EVP_RAND-HMAC-DRBG.pod" + ], + "doc/html/man7/EVP_RAND-JITTER.html" => [ + "doc/man7/EVP_RAND-JITTER.pod" + ], + "doc/html/man7/EVP_RAND-SEED-SRC.html" => [ + "doc/man7/EVP_RAND-SEED-SRC.pod" + ], + "doc/html/man7/EVP_RAND-TEST-RAND.html" => [ + "doc/man7/EVP_RAND-TEST-RAND.pod" + ], + "doc/html/man7/EVP_RAND.html" => [ + "doc/man7/EVP_RAND.pod" + ], + "doc/html/man7/EVP_SIGNATURE-DSA.html" => [ + "doc/man7/EVP_SIGNATURE-DSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-ECDSA.html" => [ + "doc/man7/EVP_SIGNATURE-ECDSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-ED25519.html" => [ + "doc/man7/EVP_SIGNATURE-ED25519.pod" + ], + "doc/html/man7/EVP_SIGNATURE-HMAC.html" => [ + "doc/man7/EVP_SIGNATURE-HMAC.pod" + ], + "doc/html/man7/EVP_SIGNATURE-ML-DSA.html" => [ + "doc/man7/EVP_SIGNATURE-ML-DSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-RSA.html" => [ + "doc/man7/EVP_SIGNATURE-RSA.pod" + ], + "doc/html/man7/EVP_SIGNATURE-SLH-DSA.html" => [ + "doc/man7/EVP_SIGNATURE-SLH-DSA.pod" + ], + "doc/html/man7/OSSL_PROVIDER-FIPS.html" => [ + "doc/man7/OSSL_PROVIDER-FIPS.pod" + ], + "doc/html/man7/OSSL_PROVIDER-base.html" => [ + "doc/man7/OSSL_PROVIDER-base.pod" + ], + "doc/html/man7/OSSL_PROVIDER-default.html" => [ + "doc/man7/OSSL_PROVIDER-default.pod" + ], + "doc/html/man7/OSSL_PROVIDER-legacy.html" => [ + "doc/man7/OSSL_PROVIDER-legacy.pod" + ], + "doc/html/man7/OSSL_PROVIDER-null.html" => [ + "doc/man7/OSSL_PROVIDER-null.pod" + ], + "doc/html/man7/OSSL_STORE-winstore.html" => [ + "doc/man7/OSSL_STORE-winstore.pod" + ], + "doc/html/man7/RAND.html" => [ + "doc/man7/RAND.pod" + ], + "doc/html/man7/RSA-PSS.html" => [ + "doc/man7/RSA-PSS.pod" + ], + "doc/html/man7/X25519.html" => [ + "doc/man7/X25519.pod" + ], + "doc/html/man7/bio.html" => [ + "doc/man7/bio.pod" + ], + "doc/html/man7/ct.html" => [ + "doc/man7/ct.pod" + ], + "doc/html/man7/des_modes.html" => [ + "doc/man7/des_modes.pod" + ], + "doc/html/man7/evp.html" => [ + "doc/man7/evp.pod" + ], + "doc/html/man7/fips_module.html" => [ + "doc/man7/fips_module.pod" + ], + "doc/html/man7/life_cycle-cipher.html" => [ + "doc/man7/life_cycle-cipher.pod" + ], + "doc/html/man7/life_cycle-digest.html" => [ + "doc/man7/life_cycle-digest.pod" + ], + "doc/html/man7/life_cycle-kdf.html" => [ + "doc/man7/life_cycle-kdf.pod" + ], + "doc/html/man7/life_cycle-mac.html" => [ + "doc/man7/life_cycle-mac.pod" + ], + "doc/html/man7/life_cycle-pkey.html" => [ + "doc/man7/life_cycle-pkey.pod" + ], + "doc/html/man7/life_cycle-rand.html" => [ + "doc/man7/life_cycle-rand.pod" + ], + "doc/html/man7/openssl-core.h.html" => [ + "doc/man7/openssl-core.h.pod" + ], + "doc/html/man7/openssl-core_dispatch.h.html" => [ + "doc/man7/openssl-core_dispatch.h.pod" + ], + "doc/html/man7/openssl-core_names.h.html" => [ + "doc/man7/openssl-core_names.h.pod" + ], + "doc/html/man7/openssl-env.html" => [ + "doc/man7/openssl-env.pod" + ], + "doc/html/man7/openssl-glossary.html" => [ + "doc/man7/openssl-glossary.pod" + ], + "doc/html/man7/openssl-qlog.html" => [ + "doc/man7/openssl-qlog.pod" + ], + "doc/html/man7/openssl-quic-concurrency.html" => [ + "doc/man7/openssl-quic-concurrency.pod" + ], + "doc/html/man7/openssl-quic.html" => [ + "doc/man7/openssl-quic.pod" + ], + "doc/html/man7/openssl-threads.html" => [ + "doc/man7/openssl-threads.pod" + ], + "doc/html/man7/openssl_user_macros.html" => [ + "doc/man7/openssl_user_macros.pod" + ], + "doc/html/man7/ossl-guide-introduction.html" => [ + "doc/man7/ossl-guide-introduction.pod" + ], + "doc/html/man7/ossl-guide-libcrypto-introduction.html" => [ + "doc/man7/ossl-guide-libcrypto-introduction.pod" + ], + "doc/html/man7/ossl-guide-libraries-introduction.html" => [ + "doc/man7/ossl-guide-libraries-introduction.pod" + ], + "doc/html/man7/ossl-guide-libssl-introduction.html" => [ + "doc/man7/ossl-guide-libssl-introduction.pod" + ], + "doc/html/man7/ossl-guide-migration.html" => [ + "doc/man7/ossl-guide-migration.pod" + ], + "doc/html/man7/ossl-guide-quic-client-block.html" => [ + "doc/man7/ossl-guide-quic-client-block.pod" + ], + "doc/html/man7/ossl-guide-quic-client-non-block.html" => [ + "doc/man7/ossl-guide-quic-client-non-block.pod" + ], + "doc/html/man7/ossl-guide-quic-introduction.html" => [ + "doc/man7/ossl-guide-quic-introduction.pod" + ], + "doc/html/man7/ossl-guide-quic-multi-stream.html" => [ + "doc/man7/ossl-guide-quic-multi-stream.pod" + ], + "doc/html/man7/ossl-guide-quic-server-block.html" => [ + "doc/man7/ossl-guide-quic-server-block.pod" + ], + "doc/html/man7/ossl-guide-quic-server-non-block.html" => [ + "doc/man7/ossl-guide-quic-server-non-block.pod" + ], + "doc/html/man7/ossl-guide-tls-client-block.html" => [ + "doc/man7/ossl-guide-tls-client-block.pod" + ], + "doc/html/man7/ossl-guide-tls-client-non-block.html" => [ + "doc/man7/ossl-guide-tls-client-non-block.pod" + ], + "doc/html/man7/ossl-guide-tls-introduction.html" => [ + "doc/man7/ossl-guide-tls-introduction.pod" + ], + "doc/html/man7/ossl-guide-tls-server-block.html" => [ + "doc/man7/ossl-guide-tls-server-block.pod" + ], + "doc/html/man7/ossl_store-file.html" => [ + "doc/man7/ossl_store-file.pod" + ], + "doc/html/man7/ossl_store.html" => [ + "doc/man7/ossl_store.pod" + ], + "doc/html/man7/passphrase-encoding.html" => [ + "doc/man7/passphrase-encoding.pod" + ], + "doc/html/man7/property.html" => [ + "doc/man7/property.pod" + ], + "doc/html/man7/provider-asym_cipher.html" => [ + "doc/man7/provider-asym_cipher.pod" + ], + "doc/html/man7/provider-base.html" => [ + "doc/man7/provider-base.pod" + ], + "doc/html/man7/provider-cipher.html" => [ + "doc/man7/provider-cipher.pod" + ], + "doc/html/man7/provider-decoder.html" => [ + "doc/man7/provider-decoder.pod" + ], + "doc/html/man7/provider-digest.html" => [ + "doc/man7/provider-digest.pod" + ], + "doc/html/man7/provider-encoder.html" => [ + "doc/man7/provider-encoder.pod" + ], + "doc/html/man7/provider-kdf.html" => [ + "doc/man7/provider-kdf.pod" + ], + "doc/html/man7/provider-kem.html" => [ + "doc/man7/provider-kem.pod" + ], + "doc/html/man7/provider-keyexch.html" => [ + "doc/man7/provider-keyexch.pod" + ], + "doc/html/man7/provider-keymgmt.html" => [ + "doc/man7/provider-keymgmt.pod" + ], + "doc/html/man7/provider-mac.html" => [ + "doc/man7/provider-mac.pod" + ], + "doc/html/man7/provider-object.html" => [ + "doc/man7/provider-object.pod" + ], + "doc/html/man7/provider-rand.html" => [ + "doc/man7/provider-rand.pod" + ], + "doc/html/man7/provider-signature.html" => [ + "doc/man7/provider-signature.pod" + ], + "doc/html/man7/provider-skeymgmt.html" => [ + "doc/man7/provider-skeymgmt.pod" + ], + "doc/html/man7/provider-storemgmt.html" => [ + "doc/man7/provider-storemgmt.pod" + ], + "doc/html/man7/provider.html" => [ + "doc/man7/provider.pod" + ], + "doc/html/man7/proxy-certificates.html" => [ + "doc/man7/proxy-certificates.pod" + ], + "doc/html/man7/x509.html" => [ + "doc/man7/x509.pod" + ], + "doc/man/man1/CA.pl.1" => [ + "doc/man1/CA.pl.pod" + ], + "doc/man/man1/openssl-asn1parse.1" => [ + "doc/man1/openssl-asn1parse.pod" + ], + "doc/man/man1/openssl-ca.1" => [ + "doc/man1/openssl-ca.pod" + ], + "doc/man/man1/openssl-ciphers.1" => [ + "doc/man1/openssl-ciphers.pod" + ], + "doc/man/man1/openssl-cmds.1" => [ + "doc/man1/openssl-cmds.pod" + ], + "doc/man/man1/openssl-cmp.1" => [ + "doc/man1/openssl-cmp.pod" + ], + "doc/man/man1/openssl-cms.1" => [ + "doc/man1/openssl-cms.pod" + ], + "doc/man/man1/openssl-crl.1" => [ + "doc/man1/openssl-crl.pod" + ], + "doc/man/man1/openssl-crl2pkcs7.1" => [ + "doc/man1/openssl-crl2pkcs7.pod" + ], + "doc/man/man1/openssl-dgst.1" => [ + "doc/man1/openssl-dgst.pod" + ], + "doc/man/man1/openssl-dhparam.1" => [ + "doc/man1/openssl-dhparam.pod" + ], + "doc/man/man1/openssl-dsa.1" => [ + "doc/man1/openssl-dsa.pod" + ], + "doc/man/man1/openssl-dsaparam.1" => [ + "doc/man1/openssl-dsaparam.pod" + ], + "doc/man/man1/openssl-ec.1" => [ + "doc/man1/openssl-ec.pod" + ], + "doc/man/man1/openssl-ecparam.1" => [ + "doc/man1/openssl-ecparam.pod" + ], + "doc/man/man1/openssl-enc.1" => [ + "doc/man1/openssl-enc.pod" + ], + "doc/man/man1/openssl-engine.1" => [ + "doc/man1/openssl-engine.pod" + ], + "doc/man/man1/openssl-errstr.1" => [ + "doc/man1/openssl-errstr.pod" + ], + "doc/man/man1/openssl-fipsinstall.1" => [ + "doc/man1/openssl-fipsinstall.pod" + ], + "doc/man/man1/openssl-format-options.1" => [ + "doc/man1/openssl-format-options.pod" + ], + "doc/man/man1/openssl-gendsa.1" => [ + "doc/man1/openssl-gendsa.pod" + ], + "doc/man/man1/openssl-genpkey.1" => [ + "doc/man1/openssl-genpkey.pod" + ], + "doc/man/man1/openssl-genrsa.1" => [ + "doc/man1/openssl-genrsa.pod" + ], + "doc/man/man1/openssl-info.1" => [ + "doc/man1/openssl-info.pod" + ], + "doc/man/man1/openssl-kdf.1" => [ + "doc/man1/openssl-kdf.pod" + ], + "doc/man/man1/openssl-list.1" => [ + "doc/man1/openssl-list.pod" + ], + "doc/man/man1/openssl-mac.1" => [ + "doc/man1/openssl-mac.pod" + ], + "doc/man/man1/openssl-namedisplay-options.1" => [ + "doc/man1/openssl-namedisplay-options.pod" + ], + "doc/man/man1/openssl-nseq.1" => [ + "doc/man1/openssl-nseq.pod" + ], + "doc/man/man1/openssl-ocsp.1" => [ + "doc/man1/openssl-ocsp.pod" + ], + "doc/man/man1/openssl-passphrase-options.1" => [ + "doc/man1/openssl-passphrase-options.pod" + ], + "doc/man/man1/openssl-passwd.1" => [ + "doc/man1/openssl-passwd.pod" + ], + "doc/man/man1/openssl-pkcs12.1" => [ + "doc/man1/openssl-pkcs12.pod" + ], + "doc/man/man1/openssl-pkcs7.1" => [ + "doc/man1/openssl-pkcs7.pod" + ], + "doc/man/man1/openssl-pkcs8.1" => [ + "doc/man1/openssl-pkcs8.pod" + ], + "doc/man/man1/openssl-pkey.1" => [ + "doc/man1/openssl-pkey.pod" + ], + "doc/man/man1/openssl-pkeyparam.1" => [ + "doc/man1/openssl-pkeyparam.pod" + ], + "doc/man/man1/openssl-pkeyutl.1" => [ + "doc/man1/openssl-pkeyutl.pod" + ], + "doc/man/man1/openssl-prime.1" => [ + "doc/man1/openssl-prime.pod" + ], + "doc/man/man1/openssl-rand.1" => [ + "doc/man1/openssl-rand.pod" + ], + "doc/man/man1/openssl-rehash.1" => [ + "doc/man1/openssl-rehash.pod" + ], + "doc/man/man1/openssl-req.1" => [ + "doc/man1/openssl-req.pod" + ], + "doc/man/man1/openssl-rsa.1" => [ + "doc/man1/openssl-rsa.pod" + ], + "doc/man/man1/openssl-rsautl.1" => [ + "doc/man1/openssl-rsautl.pod" + ], + "doc/man/man1/openssl-s_client.1" => [ + "doc/man1/openssl-s_client.pod" + ], + "doc/man/man1/openssl-s_server.1" => [ + "doc/man1/openssl-s_server.pod" + ], + "doc/man/man1/openssl-s_time.1" => [ + "doc/man1/openssl-s_time.pod" + ], + "doc/man/man1/openssl-sess_id.1" => [ + "doc/man1/openssl-sess_id.pod" + ], + "doc/man/man1/openssl-skeyutl.1" => [ + "doc/man1/openssl-skeyutl.pod" + ], + "doc/man/man1/openssl-smime.1" => [ + "doc/man1/openssl-smime.pod" + ], + "doc/man/man1/openssl-speed.1" => [ + "doc/man1/openssl-speed.pod" + ], + "doc/man/man1/openssl-spkac.1" => [ + "doc/man1/openssl-spkac.pod" + ], + "doc/man/man1/openssl-srp.1" => [ + "doc/man1/openssl-srp.pod" + ], + "doc/man/man1/openssl-storeutl.1" => [ + "doc/man1/openssl-storeutl.pod" + ], + "doc/man/man1/openssl-ts.1" => [ + "doc/man1/openssl-ts.pod" + ], + "doc/man/man1/openssl-verification-options.1" => [ + "doc/man1/openssl-verification-options.pod" + ], + "doc/man/man1/openssl-verify.1" => [ + "doc/man1/openssl-verify.pod" + ], + "doc/man/man1/openssl-version.1" => [ + "doc/man1/openssl-version.pod" + ], + "doc/man/man1/openssl-x509.1" => [ + "doc/man1/openssl-x509.pod" + ], + "doc/man/man1/openssl.1" => [ + "doc/man1/openssl.pod" + ], + "doc/man/man1/tsget.1" => [ + "doc/man1/tsget.pod" + ], + "doc/man/man3/ADMISSIONS.3" => [ + "doc/man3/ADMISSIONS.pod" + ], + "doc/man/man3/ASN1_EXTERN_FUNCS.3" => [ + "doc/man3/ASN1_EXTERN_FUNCS.pod" + ], + "doc/man/man3/ASN1_INTEGER_get_int64.3" => [ + "doc/man3/ASN1_INTEGER_get_int64.pod" + ], + "doc/man/man3/ASN1_INTEGER_new.3" => [ + "doc/man3/ASN1_INTEGER_new.pod" + ], + "doc/man/man3/ASN1_ITEM_lookup.3" => [ + "doc/man3/ASN1_ITEM_lookup.pod" + ], + "doc/man/man3/ASN1_OBJECT_new.3" => [ + "doc/man3/ASN1_OBJECT_new.pod" + ], + "doc/man/man3/ASN1_STRING_TABLE_add.3" => [ + "doc/man3/ASN1_STRING_TABLE_add.pod" + ], + "doc/man/man3/ASN1_STRING_length.3" => [ + "doc/man3/ASN1_STRING_length.pod" + ], + "doc/man/man3/ASN1_STRING_new.3" => [ + "doc/man3/ASN1_STRING_new.pod" + ], + "doc/man/man3/ASN1_STRING_print_ex.3" => [ + "doc/man3/ASN1_STRING_print_ex.pod" + ], + "doc/man/man3/ASN1_TIME_set.3" => [ + "doc/man3/ASN1_TIME_set.pod" + ], + "doc/man/man3/ASN1_TYPE_get.3" => [ + "doc/man3/ASN1_TYPE_get.pod" + ], + "doc/man/man3/ASN1_aux_cb.3" => [ + "doc/man3/ASN1_aux_cb.pod" + ], + "doc/man/man3/ASN1_generate_nconf.3" => [ + "doc/man3/ASN1_generate_nconf.pod" + ], + "doc/man/man3/ASN1_item_d2i_bio.3" => [ + "doc/man3/ASN1_item_d2i_bio.pod" + ], + "doc/man/man3/ASN1_item_new.3" => [ + "doc/man3/ASN1_item_new.pod" + ], + "doc/man/man3/ASN1_item_sign.3" => [ + "doc/man3/ASN1_item_sign.pod" + ], + "doc/man/man3/ASYNC_WAIT_CTX_new.3" => [ + "doc/man3/ASYNC_WAIT_CTX_new.pod" + ], + "doc/man/man3/ASYNC_start_job.3" => [ + "doc/man3/ASYNC_start_job.pod" + ], + "doc/man/man3/BF_encrypt.3" => [ + "doc/man3/BF_encrypt.pod" + ], + "doc/man/man3/BIO_ADDR.3" => [ + "doc/man3/BIO_ADDR.pod" + ], + "doc/man/man3/BIO_ADDRINFO.3" => [ + "doc/man3/BIO_ADDRINFO.pod" + ], + "doc/man/man3/BIO_connect.3" => [ + "doc/man3/BIO_connect.pod" + ], + "doc/man/man3/BIO_ctrl.3" => [ + "doc/man3/BIO_ctrl.pod" + ], + "doc/man/man3/BIO_f_base64.3" => [ + "doc/man3/BIO_f_base64.pod" + ], + "doc/man/man3/BIO_f_buffer.3" => [ + "doc/man3/BIO_f_buffer.pod" + ], + "doc/man/man3/BIO_f_cipher.3" => [ + "doc/man3/BIO_f_cipher.pod" + ], + "doc/man/man3/BIO_f_md.3" => [ + "doc/man3/BIO_f_md.pod" + ], + "doc/man/man3/BIO_f_null.3" => [ + "doc/man3/BIO_f_null.pod" + ], + "doc/man/man3/BIO_f_prefix.3" => [ + "doc/man3/BIO_f_prefix.pod" + ], + "doc/man/man3/BIO_f_readbuffer.3" => [ + "doc/man3/BIO_f_readbuffer.pod" + ], + "doc/man/man3/BIO_f_ssl.3" => [ + "doc/man3/BIO_f_ssl.pod" + ], + "doc/man/man3/BIO_find_type.3" => [ + "doc/man3/BIO_find_type.pod" + ], + "doc/man/man3/BIO_get_data.3" => [ + "doc/man3/BIO_get_data.pod" + ], + "doc/man/man3/BIO_get_ex_new_index.3" => [ + "doc/man3/BIO_get_ex_new_index.pod" + ], + "doc/man/man3/BIO_get_rpoll_descriptor.3" => [ + "doc/man3/BIO_get_rpoll_descriptor.pod" + ], + "doc/man/man3/BIO_meth_new.3" => [ + "doc/man3/BIO_meth_new.pod" + ], + "doc/man/man3/BIO_new.3" => [ + "doc/man3/BIO_new.pod" + ], + "doc/man/man3/BIO_new_CMS.3" => [ + "doc/man3/BIO_new_CMS.pod" + ], + "doc/man/man3/BIO_parse_hostserv.3" => [ + "doc/man3/BIO_parse_hostserv.pod" + ], + "doc/man/man3/BIO_printf.3" => [ + "doc/man3/BIO_printf.pod" + ], + "doc/man/man3/BIO_push.3" => [ + "doc/man3/BIO_push.pod" + ], + "doc/man/man3/BIO_read.3" => [ + "doc/man3/BIO_read.pod" + ], + "doc/man/man3/BIO_s_accept.3" => [ + "doc/man3/BIO_s_accept.pod" + ], + "doc/man/man3/BIO_s_bio.3" => [ + "doc/man3/BIO_s_bio.pod" + ], + "doc/man/man3/BIO_s_connect.3" => [ + "doc/man3/BIO_s_connect.pod" + ], + "doc/man/man3/BIO_s_core.3" => [ + "doc/man3/BIO_s_core.pod" + ], + "doc/man/man3/BIO_s_datagram.3" => [ + "doc/man3/BIO_s_datagram.pod" + ], + "doc/man/man3/BIO_s_dgram_pair.3" => [ + "doc/man3/BIO_s_dgram_pair.pod" + ], + "doc/man/man3/BIO_s_fd.3" => [ + "doc/man3/BIO_s_fd.pod" + ], + "doc/man/man3/BIO_s_file.3" => [ + "doc/man3/BIO_s_file.pod" + ], + "doc/man/man3/BIO_s_mem.3" => [ + "doc/man3/BIO_s_mem.pod" + ], + "doc/man/man3/BIO_s_null.3" => [ + "doc/man3/BIO_s_null.pod" + ], + "doc/man/man3/BIO_s_socket.3" => [ + "doc/man3/BIO_s_socket.pod" + ], + "doc/man/man3/BIO_sendmmsg.3" => [ + "doc/man3/BIO_sendmmsg.pod" + ], + "doc/man/man3/BIO_set_callback.3" => [ + "doc/man3/BIO_set_callback.pod" + ], + "doc/man/man3/BIO_set_flags.3" => [ + "doc/man3/BIO_set_flags.pod" + ], + "doc/man/man3/BIO_should_retry.3" => [ + "doc/man3/BIO_should_retry.pod" + ], + "doc/man/man3/BIO_socket_wait.3" => [ + "doc/man3/BIO_socket_wait.pod" + ], + "doc/man/man3/BN_BLINDING_new.3" => [ + "doc/man3/BN_BLINDING_new.pod" + ], + "doc/man/man3/BN_CTX_new.3" => [ + "doc/man3/BN_CTX_new.pod" + ], + "doc/man/man3/BN_CTX_start.3" => [ + "doc/man3/BN_CTX_start.pod" + ], + "doc/man/man3/BN_add.3" => [ + "doc/man3/BN_add.pod" + ], + "doc/man/man3/BN_add_word.3" => [ + "doc/man3/BN_add_word.pod" + ], + "doc/man/man3/BN_bn2bin.3" => [ + "doc/man3/BN_bn2bin.pod" + ], + "doc/man/man3/BN_cmp.3" => [ + "doc/man3/BN_cmp.pod" + ], + "doc/man/man3/BN_copy.3" => [ + "doc/man3/BN_copy.pod" + ], + "doc/man/man3/BN_generate_prime.3" => [ + "doc/man3/BN_generate_prime.pod" + ], + "doc/man/man3/BN_mod_exp_mont.3" => [ + "doc/man3/BN_mod_exp_mont.pod" + ], + "doc/man/man3/BN_mod_inverse.3" => [ + "doc/man3/BN_mod_inverse.pod" + ], + "doc/man/man3/BN_mod_mul_montgomery.3" => [ + "doc/man3/BN_mod_mul_montgomery.pod" + ], + "doc/man/man3/BN_mod_mul_reciprocal.3" => [ + "doc/man3/BN_mod_mul_reciprocal.pod" + ], + "doc/man/man3/BN_new.3" => [ + "doc/man3/BN_new.pod" + ], + "doc/man/man3/BN_num_bytes.3" => [ + "doc/man3/BN_num_bytes.pod" + ], + "doc/man/man3/BN_rand.3" => [ + "doc/man3/BN_rand.pod" + ], + "doc/man/man3/BN_security_bits.3" => [ + "doc/man3/BN_security_bits.pod" + ], + "doc/man/man3/BN_set_bit.3" => [ + "doc/man3/BN_set_bit.pod" + ], + "doc/man/man3/BN_swap.3" => [ + "doc/man3/BN_swap.pod" + ], + "doc/man/man3/BN_zero.3" => [ + "doc/man3/BN_zero.pod" + ], + "doc/man/man3/BUF_MEM_new.3" => [ + "doc/man3/BUF_MEM_new.pod" + ], + "doc/man/man3/CMAC_CTX.3" => [ + "doc/man3/CMAC_CTX.pod" + ], + "doc/man/man3/CMS_EncryptedData_decrypt.3" => [ + "doc/man3/CMS_EncryptedData_decrypt.pod" + ], + "doc/man/man3/CMS_EncryptedData_encrypt.3" => [ + "doc/man3/CMS_EncryptedData_encrypt.pod" + ], + "doc/man/man3/CMS_EncryptedData_set1_key.3" => [ + "doc/man3/CMS_EncryptedData_set1_key.pod" + ], + "doc/man/man3/CMS_EnvelopedData_create.3" => [ + "doc/man3/CMS_EnvelopedData_create.pod" + ], + "doc/man/man3/CMS_add0_cert.3" => [ + "doc/man3/CMS_add0_cert.pod" + ], + "doc/man/man3/CMS_add1_recipient_cert.3" => [ + "doc/man3/CMS_add1_recipient_cert.pod" + ], + "doc/man/man3/CMS_add1_signer.3" => [ + "doc/man3/CMS_add1_signer.pod" + ], + "doc/man/man3/CMS_compress.3" => [ + "doc/man3/CMS_compress.pod" + ], + "doc/man/man3/CMS_data_create.3" => [ + "doc/man3/CMS_data_create.pod" + ], + "doc/man/man3/CMS_decrypt.3" => [ + "doc/man3/CMS_decrypt.pod" + ], + "doc/man/man3/CMS_digest_create.3" => [ + "doc/man3/CMS_digest_create.pod" + ], + "doc/man/man3/CMS_encrypt.3" => [ + "doc/man3/CMS_encrypt.pod" + ], + "doc/man/man3/CMS_final.3" => [ + "doc/man3/CMS_final.pod" + ], + "doc/man/man3/CMS_get0_RecipientInfos.3" => [ + "doc/man3/CMS_get0_RecipientInfos.pod" + ], + "doc/man/man3/CMS_get0_SignerInfos.3" => [ + "doc/man3/CMS_get0_SignerInfos.pod" + ], + "doc/man/man3/CMS_get0_type.3" => [ + "doc/man3/CMS_get0_type.pod" + ], + "doc/man/man3/CMS_get1_ReceiptRequest.3" => [ + "doc/man3/CMS_get1_ReceiptRequest.pod" + ], + "doc/man/man3/CMS_sign.3" => [ + "doc/man3/CMS_sign.pod" + ], + "doc/man/man3/CMS_sign_receipt.3" => [ + "doc/man3/CMS_sign_receipt.pod" + ], + "doc/man/man3/CMS_signed_get_attr.3" => [ + "doc/man3/CMS_signed_get_attr.pod" + ], + "doc/man/man3/CMS_uncompress.3" => [ + "doc/man3/CMS_uncompress.pod" + ], + "doc/man/man3/CMS_verify.3" => [ + "doc/man3/CMS_verify.pod" + ], + "doc/man/man3/CMS_verify_receipt.3" => [ + "doc/man3/CMS_verify_receipt.pod" + ], + "doc/man/man3/COMP_CTX_new.3" => [ + "doc/man3/COMP_CTX_new.pod" + ], + "doc/man/man3/CONF_modules_free.3" => [ + "doc/man3/CONF_modules_free.pod" + ], + "doc/man/man3/CONF_modules_load_file.3" => [ + "doc/man3/CONF_modules_load_file.pod" + ], + "doc/man/man3/CRYPTO_THREAD_run_once.3" => [ + "doc/man3/CRYPTO_THREAD_run_once.pod" + ], + "doc/man/man3/CRYPTO_get_ex_new_index.3" => [ + "doc/man3/CRYPTO_get_ex_new_index.pod" + ], + "doc/man/man3/CRYPTO_memcmp.3" => [ + "doc/man3/CRYPTO_memcmp.pod" + ], + "doc/man/man3/CTLOG_STORE_get0_log_by_id.3" => [ + "doc/man3/CTLOG_STORE_get0_log_by_id.pod" + ], + "doc/man/man3/CTLOG_STORE_new.3" => [ + "doc/man3/CTLOG_STORE_new.pod" + ], + "doc/man/man3/CTLOG_new.3" => [ + "doc/man3/CTLOG_new.pod" + ], + "doc/man/man3/CT_POLICY_EVAL_CTX_new.3" => [ + "doc/man3/CT_POLICY_EVAL_CTX_new.pod" + ], + "doc/man/man3/DEFINE_STACK_OF.3" => [ + "doc/man3/DEFINE_STACK_OF.pod" + ], + "doc/man/man3/DES_random_key.3" => [ + "doc/man3/DES_random_key.pod" + ], + "doc/man/man3/DH_generate_key.3" => [ + "doc/man3/DH_generate_key.pod" + ], + "doc/man/man3/DH_generate_parameters.3" => [ + "doc/man3/DH_generate_parameters.pod" + ], + "doc/man/man3/DH_get0_pqg.3" => [ + "doc/man3/DH_get0_pqg.pod" + ], + "doc/man/man3/DH_get_1024_160.3" => [ + "doc/man3/DH_get_1024_160.pod" + ], + "doc/man/man3/DH_meth_new.3" => [ + "doc/man3/DH_meth_new.pod" + ], + "doc/man/man3/DH_new.3" => [ + "doc/man3/DH_new.pod" + ], + "doc/man/man3/DH_new_by_nid.3" => [ + "doc/man3/DH_new_by_nid.pod" + ], + "doc/man/man3/DH_set_method.3" => [ + "doc/man3/DH_set_method.pod" + ], + "doc/man/man3/DH_size.3" => [ + "doc/man3/DH_size.pod" + ], + "doc/man/man3/DSA_SIG_new.3" => [ + "doc/man3/DSA_SIG_new.pod" + ], + "doc/man/man3/DSA_do_sign.3" => [ + "doc/man3/DSA_do_sign.pod" + ], + "doc/man/man3/DSA_dup_DH.3" => [ + "doc/man3/DSA_dup_DH.pod" + ], + "doc/man/man3/DSA_generate_key.3" => [ + "doc/man3/DSA_generate_key.pod" + ], + "doc/man/man3/DSA_generate_parameters.3" => [ + "doc/man3/DSA_generate_parameters.pod" + ], + "doc/man/man3/DSA_get0_pqg.3" => [ + "doc/man3/DSA_get0_pqg.pod" + ], + "doc/man/man3/DSA_meth_new.3" => [ + "doc/man3/DSA_meth_new.pod" + ], + "doc/man/man3/DSA_new.3" => [ + "doc/man3/DSA_new.pod" + ], + "doc/man/man3/DSA_set_method.3" => [ + "doc/man3/DSA_set_method.pod" + ], + "doc/man/man3/DSA_sign.3" => [ + "doc/man3/DSA_sign.pod" + ], + "doc/man/man3/DSA_size.3" => [ + "doc/man3/DSA_size.pod" + ], + "doc/man/man3/DTLS_get_data_mtu.3" => [ + "doc/man3/DTLS_get_data_mtu.pod" + ], + "doc/man/man3/DTLS_set_timer_cb.3" => [ + "doc/man3/DTLS_set_timer_cb.pod" + ], + "doc/man/man3/DTLSv1_get_timeout.3" => [ + "doc/man3/DTLSv1_get_timeout.pod" + ], + "doc/man/man3/DTLSv1_handle_timeout.3" => [ + "doc/man3/DTLSv1_handle_timeout.pod" + ], + "doc/man/man3/DTLSv1_listen.3" => [ + "doc/man3/DTLSv1_listen.pod" + ], + "doc/man/man3/ECDSA_SIG_new.3" => [ + "doc/man3/ECDSA_SIG_new.pod" + ], + "doc/man/man3/ECDSA_sign.3" => [ + "doc/man3/ECDSA_sign.pod" + ], + "doc/man/man3/ECPKParameters_print.3" => [ + "doc/man3/ECPKParameters_print.pod" + ], + "doc/man/man3/EC_GFp_simple_method.3" => [ + "doc/man3/EC_GFp_simple_method.pod" + ], + "doc/man/man3/EC_GROUP_copy.3" => [ + "doc/man3/EC_GROUP_copy.pod" + ], + "doc/man/man3/EC_GROUP_new.3" => [ + "doc/man3/EC_GROUP_new.pod" + ], + "doc/man/man3/EC_KEY_get_enc_flags.3" => [ + "doc/man3/EC_KEY_get_enc_flags.pod" + ], + "doc/man/man3/EC_KEY_new.3" => [ + "doc/man3/EC_KEY_new.pod" + ], + "doc/man/man3/EC_POINT_add.3" => [ + "doc/man3/EC_POINT_add.pod" + ], + "doc/man/man3/EC_POINT_new.3" => [ + "doc/man3/EC_POINT_new.pod" + ], + "doc/man/man3/ENGINE_add.3" => [ + "doc/man3/ENGINE_add.pod" + ], + "doc/man/man3/ERR_GET_LIB.3" => [ + "doc/man3/ERR_GET_LIB.pod" + ], + "doc/man/man3/ERR_clear_error.3" => [ + "doc/man3/ERR_clear_error.pod" + ], + "doc/man/man3/ERR_error_string.3" => [ + "doc/man3/ERR_error_string.pod" + ], + "doc/man/man3/ERR_get_error.3" => [ + "doc/man3/ERR_get_error.pod" + ], + "doc/man/man3/ERR_load_crypto_strings.3" => [ + "doc/man3/ERR_load_crypto_strings.pod" + ], + "doc/man/man3/ERR_load_strings.3" => [ + "doc/man3/ERR_load_strings.pod" + ], + "doc/man/man3/ERR_new.3" => [ + "doc/man3/ERR_new.pod" + ], + "doc/man/man3/ERR_print_errors.3" => [ + "doc/man3/ERR_print_errors.pod" + ], + "doc/man/man3/ERR_put_error.3" => [ + "doc/man3/ERR_put_error.pod" + ], + "doc/man/man3/ERR_remove_state.3" => [ + "doc/man3/ERR_remove_state.pod" + ], + "doc/man/man3/ERR_set_mark.3" => [ + "doc/man3/ERR_set_mark.pod" + ], + "doc/man/man3/EVP_ASYM_CIPHER_free.3" => [ + "doc/man3/EVP_ASYM_CIPHER_free.pod" + ], + "doc/man/man3/EVP_BytesToKey.3" => [ + "doc/man3/EVP_BytesToKey.pod" + ], + "doc/man/man3/EVP_CIPHER_CTX_get_app_data.3" => [ + "doc/man3/EVP_CIPHER_CTX_get_app_data.pod" + ], + "doc/man/man3/EVP_CIPHER_CTX_get_cipher_data.3" => [ + "doc/man3/EVP_CIPHER_CTX_get_cipher_data.pod" + ], + "doc/man/man3/EVP_CIPHER_CTX_get_original_iv.3" => [ + "doc/man3/EVP_CIPHER_CTX_get_original_iv.pod" + ], + "doc/man/man3/EVP_CIPHER_meth_new.3" => [ + "doc/man3/EVP_CIPHER_meth_new.pod" + ], + "doc/man/man3/EVP_DigestInit.3" => [ + "doc/man3/EVP_DigestInit.pod" + ], + "doc/man/man3/EVP_DigestSignInit.3" => [ + "doc/man3/EVP_DigestSignInit.pod" + ], + "doc/man/man3/EVP_DigestVerifyInit.3" => [ + "doc/man3/EVP_DigestVerifyInit.pod" + ], + "doc/man/man3/EVP_EncodeInit.3" => [ + "doc/man3/EVP_EncodeInit.pod" + ], + "doc/man/man3/EVP_EncryptInit.3" => [ + "doc/man3/EVP_EncryptInit.pod" + ], + "doc/man/man3/EVP_KDF.3" => [ + "doc/man3/EVP_KDF.pod" + ], + "doc/man/man3/EVP_KEM_free.3" => [ + "doc/man3/EVP_KEM_free.pod" + ], + "doc/man/man3/EVP_KEYEXCH_free.3" => [ + "doc/man3/EVP_KEYEXCH_free.pod" + ], + "doc/man/man3/EVP_KEYMGMT.3" => [ + "doc/man3/EVP_KEYMGMT.pod" + ], + "doc/man/man3/EVP_MAC.3" => [ + "doc/man3/EVP_MAC.pod" + ], + "doc/man/man3/EVP_MD_meth_new.3" => [ + "doc/man3/EVP_MD_meth_new.pod" + ], + "doc/man/man3/EVP_OpenInit.3" => [ + "doc/man3/EVP_OpenInit.pod" + ], + "doc/man/man3/EVP_PBE_CipherInit.3" => [ + "doc/man3/EVP_PBE_CipherInit.pod" + ], + "doc/man/man3/EVP_PKEY2PKCS8.3" => [ + "doc/man3/EVP_PKEY2PKCS8.pod" + ], + "doc/man/man3/EVP_PKEY_ASN1_METHOD.3" => [ + "doc/man3/EVP_PKEY_ASN1_METHOD.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_ctrl.3" => [ + "doc/man3/EVP_PKEY_CTX_ctrl.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_get0_libctx.3" => [ + "doc/man3/EVP_PKEY_CTX_get0_libctx.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_get0_pkey.3" => [ + "doc/man3/EVP_PKEY_CTX_get0_pkey.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_get_algor.3" => [ + "doc/man3/EVP_PKEY_CTX_get_algor.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_new.3" => [ + "doc/man3/EVP_PKEY_CTX_new.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set1_pbe_pass.3" => [ + "doc/man3/EVP_PKEY_CTX_set1_pbe_pass.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_hkdf_md.3" => [ + "doc/man3/EVP_PKEY_CTX_set_hkdf_md.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_params.3" => [ + "doc/man3/EVP_PKEY_CTX_set_params.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.3" => [ + "doc/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_scrypt_N.3" => [ + "doc/man3/EVP_PKEY_CTX_set_scrypt_N.pod" + ], + "doc/man/man3/EVP_PKEY_CTX_set_tls1_prf_md.3" => [ + "doc/man3/EVP_PKEY_CTX_set_tls1_prf_md.pod" + ], + "doc/man/man3/EVP_PKEY_asn1_get_count.3" => [ + "doc/man3/EVP_PKEY_asn1_get_count.pod" + ], + "doc/man/man3/EVP_PKEY_check.3" => [ + "doc/man3/EVP_PKEY_check.pod" + ], + "doc/man/man3/EVP_PKEY_copy_parameters.3" => [ + "doc/man3/EVP_PKEY_copy_parameters.pod" + ], + "doc/man/man3/EVP_PKEY_decapsulate.3" => [ + "doc/man3/EVP_PKEY_decapsulate.pod" + ], + "doc/man/man3/EVP_PKEY_decrypt.3" => [ + "doc/man3/EVP_PKEY_decrypt.pod" + ], + "doc/man/man3/EVP_PKEY_derive.3" => [ + "doc/man3/EVP_PKEY_derive.pod" + ], + "doc/man/man3/EVP_PKEY_digestsign_supports_digest.3" => [ + "doc/man3/EVP_PKEY_digestsign_supports_digest.pod" + ], + "doc/man/man3/EVP_PKEY_encapsulate.3" => [ + "doc/man3/EVP_PKEY_encapsulate.pod" + ], + "doc/man/man3/EVP_PKEY_encrypt.3" => [ + "doc/man3/EVP_PKEY_encrypt.pod" + ], + "doc/man/man3/EVP_PKEY_fromdata.3" => [ + "doc/man3/EVP_PKEY_fromdata.pod" + ], + "doc/man/man3/EVP_PKEY_get_attr.3" => [ + "doc/man3/EVP_PKEY_get_attr.pod" + ], + "doc/man/man3/EVP_PKEY_get_default_digest_nid.3" => [ + "doc/man3/EVP_PKEY_get_default_digest_nid.pod" + ], + "doc/man/man3/EVP_PKEY_get_field_type.3" => [ + "doc/man3/EVP_PKEY_get_field_type.pod" + ], + "doc/man/man3/EVP_PKEY_get_group_name.3" => [ + "doc/man3/EVP_PKEY_get_group_name.pod" + ], + "doc/man/man3/EVP_PKEY_get_size.3" => [ + "doc/man3/EVP_PKEY_get_size.pod" + ], + "doc/man/man3/EVP_PKEY_gettable_params.3" => [ + "doc/man3/EVP_PKEY_gettable_params.pod" + ], + "doc/man/man3/EVP_PKEY_is_a.3" => [ + "doc/man3/EVP_PKEY_is_a.pod" + ], + "doc/man/man3/EVP_PKEY_keygen.3" => [ + "doc/man3/EVP_PKEY_keygen.pod" + ], + "doc/man/man3/EVP_PKEY_meth_get_count.3" => [ + "doc/man3/EVP_PKEY_meth_get_count.pod" + ], + "doc/man/man3/EVP_PKEY_meth_new.3" => [ + "doc/man3/EVP_PKEY_meth_new.pod" + ], + "doc/man/man3/EVP_PKEY_new.3" => [ + "doc/man3/EVP_PKEY_new.pod" + ], + "doc/man/man3/EVP_PKEY_print_private.3" => [ + "doc/man3/EVP_PKEY_print_private.pod" + ], + "doc/man/man3/EVP_PKEY_set1_RSA.3" => [ + "doc/man3/EVP_PKEY_set1_RSA.pod" + ], + "doc/man/man3/EVP_PKEY_set1_encoded_public_key.3" => [ + "doc/man3/EVP_PKEY_set1_encoded_public_key.pod" + ], + "doc/man/man3/EVP_PKEY_set_type.3" => [ + "doc/man3/EVP_PKEY_set_type.pod" + ], + "doc/man/man3/EVP_PKEY_settable_params.3" => [ + "doc/man3/EVP_PKEY_settable_params.pod" + ], + "doc/man/man3/EVP_PKEY_sign.3" => [ + "doc/man3/EVP_PKEY_sign.pod" + ], + "doc/man/man3/EVP_PKEY_todata.3" => [ + "doc/man3/EVP_PKEY_todata.pod" + ], + "doc/man/man3/EVP_PKEY_verify.3" => [ + "doc/man3/EVP_PKEY_verify.pod" + ], + "doc/man/man3/EVP_PKEY_verify_recover.3" => [ + "doc/man3/EVP_PKEY_verify_recover.pod" + ], + "doc/man/man3/EVP_RAND.3" => [ + "doc/man3/EVP_RAND.pod" + ], + "doc/man/man3/EVP_SIGNATURE.3" => [ + "doc/man3/EVP_SIGNATURE.pod" + ], + "doc/man/man3/EVP_SKEY.3" => [ + "doc/man3/EVP_SKEY.pod" + ], + "doc/man/man3/EVP_SKEYMGMT.3" => [ + "doc/man3/EVP_SKEYMGMT.pod" + ], + "doc/man/man3/EVP_SealInit.3" => [ + "doc/man3/EVP_SealInit.pod" + ], + "doc/man/man3/EVP_SignInit.3" => [ + "doc/man3/EVP_SignInit.pod" + ], + "doc/man/man3/EVP_VerifyInit.3" => [ + "doc/man3/EVP_VerifyInit.pod" + ], + "doc/man/man3/EVP_aes_128_gcm.3" => [ + "doc/man3/EVP_aes_128_gcm.pod" + ], + "doc/man/man3/EVP_aria_128_gcm.3" => [ + "doc/man3/EVP_aria_128_gcm.pod" + ], + "doc/man/man3/EVP_bf_cbc.3" => [ + "doc/man3/EVP_bf_cbc.pod" + ], + "doc/man/man3/EVP_blake2b512.3" => [ + "doc/man3/EVP_blake2b512.pod" + ], + "doc/man/man3/EVP_camellia_128_ecb.3" => [ + "doc/man3/EVP_camellia_128_ecb.pod" + ], + "doc/man/man3/EVP_cast5_cbc.3" => [ + "doc/man3/EVP_cast5_cbc.pod" + ], + "doc/man/man3/EVP_chacha20.3" => [ + "doc/man3/EVP_chacha20.pod" + ], + "doc/man/man3/EVP_des_cbc.3" => [ + "doc/man3/EVP_des_cbc.pod" + ], + "doc/man/man3/EVP_desx_cbc.3" => [ + "doc/man3/EVP_desx_cbc.pod" + ], + "doc/man/man3/EVP_idea_cbc.3" => [ + "doc/man3/EVP_idea_cbc.pod" + ], + "doc/man/man3/EVP_md2.3" => [ + "doc/man3/EVP_md2.pod" + ], + "doc/man/man3/EVP_md4.3" => [ + "doc/man3/EVP_md4.pod" + ], + "doc/man/man3/EVP_md5.3" => [ + "doc/man3/EVP_md5.pod" + ], + "doc/man/man3/EVP_mdc2.3" => [ + "doc/man3/EVP_mdc2.pod" + ], + "doc/man/man3/EVP_rc2_cbc.3" => [ + "doc/man3/EVP_rc2_cbc.pod" + ], + "doc/man/man3/EVP_rc4.3" => [ + "doc/man3/EVP_rc4.pod" + ], + "doc/man/man3/EVP_rc5_32_12_16_cbc.3" => [ + "doc/man3/EVP_rc5_32_12_16_cbc.pod" + ], + "doc/man/man3/EVP_ripemd160.3" => [ + "doc/man3/EVP_ripemd160.pod" + ], + "doc/man/man3/EVP_seed_cbc.3" => [ + "doc/man3/EVP_seed_cbc.pod" + ], + "doc/man/man3/EVP_set_default_properties.3" => [ + "doc/man3/EVP_set_default_properties.pod" + ], + "doc/man/man3/EVP_sha1.3" => [ + "doc/man3/EVP_sha1.pod" + ], + "doc/man/man3/EVP_sha224.3" => [ + "doc/man3/EVP_sha224.pod" + ], + "doc/man/man3/EVP_sha3_224.3" => [ + "doc/man3/EVP_sha3_224.pod" + ], + "doc/man/man3/EVP_sm3.3" => [ + "doc/man3/EVP_sm3.pod" + ], + "doc/man/man3/EVP_sm4_cbc.3" => [ + "doc/man3/EVP_sm4_cbc.pod" + ], + "doc/man/man3/EVP_whirlpool.3" => [ + "doc/man3/EVP_whirlpool.pod" + ], + "doc/man/man3/GENERAL_NAME.3" => [ + "doc/man3/GENERAL_NAME.pod" + ], + "doc/man/man3/HMAC.3" => [ + "doc/man3/HMAC.pod" + ], + "doc/man/man3/MD5.3" => [ + "doc/man3/MD5.pod" + ], + "doc/man/man3/MDC2_Init.3" => [ + "doc/man3/MDC2_Init.pod" + ], + "doc/man/man3/NCONF_new_ex.3" => [ + "doc/man3/NCONF_new_ex.pod" + ], + "doc/man/man3/OBJ_nid2obj.3" => [ + "doc/man3/OBJ_nid2obj.pod" + ], + "doc/man/man3/OCSP_REQUEST_new.3" => [ + "doc/man3/OCSP_REQUEST_new.pod" + ], + "doc/man/man3/OCSP_cert_to_id.3" => [ + "doc/man3/OCSP_cert_to_id.pod" + ], + "doc/man/man3/OCSP_request_add1_nonce.3" => [ + "doc/man3/OCSP_request_add1_nonce.pod" + ], + "doc/man/man3/OCSP_resp_find_status.3" => [ + "doc/man3/OCSP_resp_find_status.pod" + ], + "doc/man/man3/OCSP_response_status.3" => [ + "doc/man3/OCSP_response_status.pod" + ], + "doc/man/man3/OCSP_sendreq_new.3" => [ + "doc/man3/OCSP_sendreq_new.pod" + ], + "doc/man/man3/OPENSSL_Applink.3" => [ + "doc/man3/OPENSSL_Applink.pod" + ], + "doc/man/man3/OPENSSL_FILE.3" => [ + "doc/man3/OPENSSL_FILE.pod" + ], + "doc/man/man3/OPENSSL_LH_COMPFUNC.3" => [ + "doc/man3/OPENSSL_LH_COMPFUNC.pod" + ], + "doc/man/man3/OPENSSL_LH_stats.3" => [ + "doc/man3/OPENSSL_LH_stats.pod" + ], + "doc/man/man3/OPENSSL_config.3" => [ + "doc/man3/OPENSSL_config.pod" + ], + "doc/man/man3/OPENSSL_fork_prepare.3" => [ + "doc/man3/OPENSSL_fork_prepare.pod" + ], + "doc/man/man3/OPENSSL_gmtime.3" => [ + "doc/man3/OPENSSL_gmtime.pod" + ], + "doc/man/man3/OPENSSL_hexchar2int.3" => [ + "doc/man3/OPENSSL_hexchar2int.pod" + ], + "doc/man/man3/OPENSSL_ia32cap.3" => [ + "doc/man3/OPENSSL_ia32cap.pod" + ], + "doc/man/man3/OPENSSL_init_crypto.3" => [ + "doc/man3/OPENSSL_init_crypto.pod" + ], + "doc/man/man3/OPENSSL_init_ssl.3" => [ + "doc/man3/OPENSSL_init_ssl.pod" + ], + "doc/man/man3/OPENSSL_instrument_bus.3" => [ + "doc/man3/OPENSSL_instrument_bus.pod" + ], + "doc/man/man3/OPENSSL_load_builtin_modules.3" => [ + "doc/man3/OPENSSL_load_builtin_modules.pod" + ], + "doc/man/man3/OPENSSL_load_u16_le.3" => [ + "doc/man3/OPENSSL_load_u16_le.pod" + ], + "doc/man/man3/OPENSSL_malloc.3" => [ + "doc/man3/OPENSSL_malloc.pod" + ], + "doc/man/man3/OPENSSL_ppccap.3" => [ + "doc/man3/OPENSSL_ppccap.pod" + ], + "doc/man/man3/OPENSSL_riscvcap.3" => [ + "doc/man3/OPENSSL_riscvcap.pod" + ], + "doc/man/man3/OPENSSL_s390xcap.3" => [ + "doc/man3/OPENSSL_s390xcap.pod" + ], + "doc/man/man3/OPENSSL_secure_malloc.3" => [ + "doc/man3/OPENSSL_secure_malloc.pod" + ], + "doc/man/man3/OPENSSL_strcasecmp.3" => [ + "doc/man3/OPENSSL_strcasecmp.pod" + ], + "doc/man/man3/OSSL_ALGORITHM.3" => [ + "doc/man3/OSSL_ALGORITHM.pod" + ], + "doc/man/man3/OSSL_CALLBACK.3" => [ + "doc/man3/OSSL_CALLBACK.pod" + ], + "doc/man/man3/OSSL_CMP_ATAV_set0.3" => [ + "doc/man3/OSSL_CMP_ATAV_set0.pod" + ], + "doc/man/man3/OSSL_CMP_CTX_new.3" => [ + "doc/man3/OSSL_CMP_CTX_new.pod" + ], + "doc/man/man3/OSSL_CMP_HDR_get0_transactionID.3" => [ + "doc/man3/OSSL_CMP_HDR_get0_transactionID.pod" + ], + "doc/man/man3/OSSL_CMP_ITAV_new_caCerts.3" => [ + "doc/man3/OSSL_CMP_ITAV_new_caCerts.pod" + ], + "doc/man/man3/OSSL_CMP_ITAV_set0.3" => [ + "doc/man3/OSSL_CMP_ITAV_set0.pod" + ], + "doc/man/man3/OSSL_CMP_MSG_get0_header.3" => [ + "doc/man3/OSSL_CMP_MSG_get0_header.pod" + ], + "doc/man/man3/OSSL_CMP_MSG_http_perform.3" => [ + "doc/man3/OSSL_CMP_MSG_http_perform.pod" + ], + "doc/man/man3/OSSL_CMP_SRV_CTX_new.3" => [ + "doc/man3/OSSL_CMP_SRV_CTX_new.pod" + ], + "doc/man/man3/OSSL_CMP_STATUSINFO_new.3" => [ + "doc/man3/OSSL_CMP_STATUSINFO_new.pod" + ], + "doc/man/man3/OSSL_CMP_exec_certreq.3" => [ + "doc/man3/OSSL_CMP_exec_certreq.pod" + ], + "doc/man/man3/OSSL_CMP_log_open.3" => [ + "doc/man3/OSSL_CMP_log_open.pod" + ], + "doc/man/man3/OSSL_CMP_validate_msg.3" => [ + "doc/man3/OSSL_CMP_validate_msg.pod" + ], + "doc/man/man3/OSSL_CORE_MAKE_FUNC.3" => [ + "doc/man3/OSSL_CORE_MAKE_FUNC.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_get0_tmpl.3" => [ + "doc/man3/OSSL_CRMF_MSG_get0_tmpl.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_set0_validity.3" => [ + "doc/man3/OSSL_CRMF_MSG_set0_validity.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.3" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.pod" + ], + "doc/man/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.3" => [ + "doc/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.pod" + ], + "doc/man/man3/OSSL_CRMF_pbmp_new.3" => [ + "doc/man3/OSSL_CRMF_pbmp_new.pod" + ], + "doc/man/man3/OSSL_DECODER.3" => [ + "doc/man3/OSSL_DECODER.pod" + ], + "doc/man/man3/OSSL_DECODER_CTX.3" => [ + "doc/man3/OSSL_DECODER_CTX.pod" + ], + "doc/man/man3/OSSL_DECODER_CTX_new_for_pkey.3" => [ + "doc/man3/OSSL_DECODER_CTX_new_for_pkey.pod" + ], + "doc/man/man3/OSSL_DECODER_from_bio.3" => [ + "doc/man3/OSSL_DECODER_from_bio.pod" + ], + "doc/man/man3/OSSL_DISPATCH.3" => [ + "doc/man3/OSSL_DISPATCH.pod" + ], + "doc/man/man3/OSSL_ENCODER.3" => [ + "doc/man3/OSSL_ENCODER.pod" + ], + "doc/man/man3/OSSL_ENCODER_CTX.3" => [ + "doc/man3/OSSL_ENCODER_CTX.pod" + ], + "doc/man/man3/OSSL_ENCODER_CTX_new_for_pkey.3" => [ + "doc/man3/OSSL_ENCODER_CTX_new_for_pkey.pod" + ], + "doc/man/man3/OSSL_ENCODER_to_bio.3" => [ + "doc/man3/OSSL_ENCODER_to_bio.pod" + ], + "doc/man/man3/OSSL_ERR_STATE_save.3" => [ + "doc/man3/OSSL_ERR_STATE_save.pod" + ], + "doc/man/man3/OSSL_ESS_check_signing_certs.3" => [ + "doc/man3/OSSL_ESS_check_signing_certs.pod" + ], + "doc/man/man3/OSSL_GENERAL_NAMES_print.3" => [ + "doc/man3/OSSL_GENERAL_NAMES_print.pod" + ], + "doc/man/man3/OSSL_HPKE_CTX_new.3" => [ + "doc/man3/OSSL_HPKE_CTX_new.pod" + ], + "doc/man/man3/OSSL_HTTP_REQ_CTX.3" => [ + "doc/man3/OSSL_HTTP_REQ_CTX.pod" + ], + "doc/man/man3/OSSL_HTTP_parse_url.3" => [ + "doc/man3/OSSL_HTTP_parse_url.pod" + ], + "doc/man/man3/OSSL_HTTP_transfer.3" => [ + "doc/man3/OSSL_HTTP_transfer.pod" + ], + "doc/man/man3/OSSL_IETF_ATTR_SYNTAX.3" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX.pod" + ], + "doc/man/man3/OSSL_IETF_ATTR_SYNTAX_print.3" => [ + "doc/man3/OSSL_IETF_ATTR_SYNTAX_print.pod" + ], + "doc/man/man3/OSSL_INDICATOR_set_callback.3" => [ + "doc/man3/OSSL_INDICATOR_set_callback.pod" + ], + "doc/man/man3/OSSL_ITEM.3" => [ + "doc/man3/OSSL_ITEM.pod" + ], + "doc/man/man3/OSSL_LIB_CTX.3" => [ + "doc/man3/OSSL_LIB_CTX.pod" + ], + "doc/man/man3/OSSL_LIB_CTX_set_conf_diagnostics.3" => [ + "doc/man3/OSSL_LIB_CTX_set_conf_diagnostics.pod" + ], + "doc/man/man3/OSSL_PARAM.3" => [ + "doc/man3/OSSL_PARAM.pod" + ], + "doc/man/man3/OSSL_PARAM_BLD.3" => [ + "doc/man3/OSSL_PARAM_BLD.pod" + ], + "doc/man/man3/OSSL_PARAM_allocate_from_text.3" => [ + "doc/man3/OSSL_PARAM_allocate_from_text.pod" + ], + "doc/man/man3/OSSL_PARAM_dup.3" => [ + "doc/man3/OSSL_PARAM_dup.pod" + ], + "doc/man/man3/OSSL_PARAM_int.3" => [ + "doc/man3/OSSL_PARAM_int.pod" + ], + "doc/man/man3/OSSL_PARAM_print_to_bio.3" => [ + "doc/man3/OSSL_PARAM_print_to_bio.pod" + ], + "doc/man/man3/OSSL_PROVIDER.3" => [ + "doc/man3/OSSL_PROVIDER.pod" + ], + "doc/man/man3/OSSL_QUIC_client_method.3" => [ + "doc/man3/OSSL_QUIC_client_method.pod" + ], + "doc/man/man3/OSSL_SELF_TEST_new.3" => [ + "doc/man3/OSSL_SELF_TEST_new.pod" + ], + "doc/man/man3/OSSL_SELF_TEST_set_callback.3" => [ + "doc/man3/OSSL_SELF_TEST_set_callback.pod" + ], + "doc/man/man3/OSSL_STORE_INFO.3" => [ + "doc/man3/OSSL_STORE_INFO.pod" + ], + "doc/man/man3/OSSL_STORE_LOADER.3" => [ + "doc/man3/OSSL_STORE_LOADER.pod" + ], + "doc/man/man3/OSSL_STORE_SEARCH.3" => [ + "doc/man3/OSSL_STORE_SEARCH.pod" + ], + "doc/man/man3/OSSL_STORE_attach.3" => [ + "doc/man3/OSSL_STORE_attach.pod" + ], + "doc/man/man3/OSSL_STORE_expect.3" => [ + "doc/man3/OSSL_STORE_expect.pod" + ], + "doc/man/man3/OSSL_STORE_open.3" => [ + "doc/man3/OSSL_STORE_open.pod" + ], + "doc/man/man3/OSSL_sleep.3" => [ + "doc/man3/OSSL_sleep.pod" + ], + "doc/man/man3/OSSL_trace_enabled.3" => [ + "doc/man3/OSSL_trace_enabled.pod" + ], + "doc/man/man3/OSSL_trace_get_category_num.3" => [ + "doc/man3/OSSL_trace_get_category_num.pod" + ], + "doc/man/man3/OSSL_trace_set_channel.3" => [ + "doc/man3/OSSL_trace_set_channel.pod" + ], + "doc/man/man3/OpenSSL_add_all_algorithms.3" => [ + "doc/man3/OpenSSL_add_all_algorithms.pod" + ], + "doc/man/man3/OpenSSL_version.3" => [ + "doc/man3/OpenSSL_version.pod" + ], + "doc/man/man3/PBMAC1_get1_pbkdf2_param.3" => [ + "doc/man3/PBMAC1_get1_pbkdf2_param.pod" + ], + "doc/man/man3/PEM_X509_INFO_read_bio_ex.3" => [ + "doc/man3/PEM_X509_INFO_read_bio_ex.pod" + ], + "doc/man/man3/PEM_bytes_read_bio.3" => [ + "doc/man3/PEM_bytes_read_bio.pod" + ], + "doc/man/man3/PEM_read.3" => [ + "doc/man3/PEM_read.pod" + ], + "doc/man/man3/PEM_read_CMS.3" => [ + "doc/man3/PEM_read_CMS.pod" + ], + "doc/man/man3/PEM_read_bio_PrivateKey.3" => [ + "doc/man3/PEM_read_bio_PrivateKey.pod" + ], + "doc/man/man3/PEM_read_bio_ex.3" => [ + "doc/man3/PEM_read_bio_ex.pod" + ], + "doc/man/man3/PEM_write_bio_CMS_stream.3" => [ + "doc/man3/PEM_write_bio_CMS_stream.pod" + ], + "doc/man/man3/PEM_write_bio_PKCS7_stream.3" => [ + "doc/man3/PEM_write_bio_PKCS7_stream.pod" + ], + "doc/man/man3/PKCS12_PBE_keyivgen.3" => [ + "doc/man3/PKCS12_PBE_keyivgen.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_create_cert.3" => [ + "doc/man3/PKCS12_SAFEBAG_create_cert.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_get0_attrs.3" => [ + "doc/man3/PKCS12_SAFEBAG_get0_attrs.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_get1_cert.3" => [ + "doc/man3/PKCS12_SAFEBAG_get1_cert.pod" + ], + "doc/man/man3/PKCS12_SAFEBAG_set0_attrs.3" => [ + "doc/man3/PKCS12_SAFEBAG_set0_attrs.pod" + ], + "doc/man/man3/PKCS12_add1_attr_by_NID.3" => [ + "doc/man3/PKCS12_add1_attr_by_NID.pod" + ], + "doc/man/man3/PKCS12_add_CSPName_asc.3" => [ + "doc/man3/PKCS12_add_CSPName_asc.pod" + ], + "doc/man/man3/PKCS12_add_cert.3" => [ + "doc/man3/PKCS12_add_cert.pod" + ], + "doc/man/man3/PKCS12_add_friendlyname_asc.3" => [ + "doc/man3/PKCS12_add_friendlyname_asc.pod" + ], + "doc/man/man3/PKCS12_add_localkeyid.3" => [ + "doc/man3/PKCS12_add_localkeyid.pod" + ], + "doc/man/man3/PKCS12_add_safe.3" => [ + "doc/man3/PKCS12_add_safe.pod" + ], + "doc/man/man3/PKCS12_create.3" => [ + "doc/man3/PKCS12_create.pod" + ], + "doc/man/man3/PKCS12_decrypt_skey.3" => [ + "doc/man3/PKCS12_decrypt_skey.pod" + ], + "doc/man/man3/PKCS12_gen_mac.3" => [ + "doc/man3/PKCS12_gen_mac.pod" + ], + "doc/man/man3/PKCS12_get_friendlyname.3" => [ + "doc/man3/PKCS12_get_friendlyname.pod" + ], + "doc/man/man3/PKCS12_init.3" => [ + "doc/man3/PKCS12_init.pod" + ], + "doc/man/man3/PKCS12_item_decrypt_d2i.3" => [ + "doc/man3/PKCS12_item_decrypt_d2i.pod" + ], + "doc/man/man3/PKCS12_key_gen_utf8_ex.3" => [ + "doc/man3/PKCS12_key_gen_utf8_ex.pod" + ], + "doc/man/man3/PKCS12_newpass.3" => [ + "doc/man3/PKCS12_newpass.pod" + ], + "doc/man/man3/PKCS12_pack_p7encdata.3" => [ + "doc/man3/PKCS12_pack_p7encdata.pod" + ], + "doc/man/man3/PKCS12_parse.3" => [ + "doc/man3/PKCS12_parse.pod" + ], + "doc/man/man3/PKCS5_PBE_keyivgen.3" => [ + "doc/man3/PKCS5_PBE_keyivgen.pod" + ], + "doc/man/man3/PKCS5_PBKDF2_HMAC.3" => [ + "doc/man3/PKCS5_PBKDF2_HMAC.pod" + ], + "doc/man/man3/PKCS7_decrypt.3" => [ + "doc/man3/PKCS7_decrypt.pod" + ], + "doc/man/man3/PKCS7_encrypt.3" => [ + "doc/man3/PKCS7_encrypt.pod" + ], + "doc/man/man3/PKCS7_get_octet_string.3" => [ + "doc/man3/PKCS7_get_octet_string.pod" + ], + "doc/man/man3/PKCS7_sign.3" => [ + "doc/man3/PKCS7_sign.pod" + ], + "doc/man/man3/PKCS7_sign_add_signer.3" => [ + "doc/man3/PKCS7_sign_add_signer.pod" + ], + "doc/man/man3/PKCS7_type_is_other.3" => [ + "doc/man3/PKCS7_type_is_other.pod" + ], + "doc/man/man3/PKCS7_verify.3" => [ + "doc/man3/PKCS7_verify.pod" + ], + "doc/man/man3/PKCS8_encrypt.3" => [ + "doc/man3/PKCS8_encrypt.pod" + ], + "doc/man/man3/PKCS8_pkey_add1_attr.3" => [ + "doc/man3/PKCS8_pkey_add1_attr.pod" + ], + "doc/man/man3/RAND_add.3" => [ + "doc/man3/RAND_add.pod" + ], + "doc/man/man3/RAND_bytes.3" => [ + "doc/man3/RAND_bytes.pod" + ], + "doc/man/man3/RAND_cleanup.3" => [ + "doc/man3/RAND_cleanup.pod" + ], + "doc/man/man3/RAND_egd.3" => [ + "doc/man3/RAND_egd.pod" + ], + "doc/man/man3/RAND_get0_primary.3" => [ + "doc/man3/RAND_get0_primary.pod" + ], + "doc/man/man3/RAND_load_file.3" => [ + "doc/man3/RAND_load_file.pod" + ], + "doc/man/man3/RAND_set_DRBG_type.3" => [ + "doc/man3/RAND_set_DRBG_type.pod" + ], + "doc/man/man3/RAND_set_rand_method.3" => [ + "doc/man3/RAND_set_rand_method.pod" + ], + "doc/man/man3/RC4_set_key.3" => [ + "doc/man3/RC4_set_key.pod" + ], + "doc/man/man3/RIPEMD160_Init.3" => [ + "doc/man3/RIPEMD160_Init.pod" + ], + "doc/man/man3/RSA_blinding_on.3" => [ + "doc/man3/RSA_blinding_on.pod" + ], + "doc/man/man3/RSA_check_key.3" => [ + "doc/man3/RSA_check_key.pod" + ], + "doc/man/man3/RSA_generate_key.3" => [ + "doc/man3/RSA_generate_key.pod" + ], + "doc/man/man3/RSA_get0_key.3" => [ + "doc/man3/RSA_get0_key.pod" + ], + "doc/man/man3/RSA_meth_new.3" => [ + "doc/man3/RSA_meth_new.pod" + ], + "doc/man/man3/RSA_new.3" => [ + "doc/man3/RSA_new.pod" + ], + "doc/man/man3/RSA_padding_add_PKCS1_type_1.3" => [ + "doc/man3/RSA_padding_add_PKCS1_type_1.pod" + ], + "doc/man/man3/RSA_print.3" => [ + "doc/man3/RSA_print.pod" + ], + "doc/man/man3/RSA_private_encrypt.3" => [ + "doc/man3/RSA_private_encrypt.pod" + ], + "doc/man/man3/RSA_public_encrypt.3" => [ + "doc/man3/RSA_public_encrypt.pod" + ], + "doc/man/man3/RSA_set_method.3" => [ + "doc/man3/RSA_set_method.pod" + ], + "doc/man/man3/RSA_sign.3" => [ + "doc/man3/RSA_sign.pod" + ], + "doc/man/man3/RSA_sign_ASN1_OCTET_STRING.3" => [ + "doc/man3/RSA_sign_ASN1_OCTET_STRING.pod" + ], + "doc/man/man3/RSA_size.3" => [ + "doc/man3/RSA_size.pod" + ], + "doc/man/man3/SCT_new.3" => [ + "doc/man3/SCT_new.pod" + ], + "doc/man/man3/SCT_print.3" => [ + "doc/man3/SCT_print.pod" + ], + "doc/man/man3/SCT_validate.3" => [ + "doc/man3/SCT_validate.pod" + ], + "doc/man/man3/SHA256_Init.3" => [ + "doc/man3/SHA256_Init.pod" + ], + "doc/man/man3/SMIME_read_ASN1.3" => [ + "doc/man3/SMIME_read_ASN1.pod" + ], + "doc/man/man3/SMIME_read_CMS.3" => [ + "doc/man3/SMIME_read_CMS.pod" + ], + "doc/man/man3/SMIME_read_PKCS7.3" => [ + "doc/man3/SMIME_read_PKCS7.pod" + ], + "doc/man/man3/SMIME_write_ASN1.3" => [ + "doc/man3/SMIME_write_ASN1.pod" + ], + "doc/man/man3/SMIME_write_CMS.3" => [ + "doc/man3/SMIME_write_CMS.pod" + ], + "doc/man/man3/SMIME_write_PKCS7.3" => [ + "doc/man3/SMIME_write_PKCS7.pod" + ], + "doc/man/man3/SRP_Calc_B.3" => [ + "doc/man3/SRP_Calc_B.pod" + ], + "doc/man/man3/SRP_VBASE_new.3" => [ + "doc/man3/SRP_VBASE_new.pod" + ], + "doc/man/man3/SRP_create_verifier.3" => [ + "doc/man3/SRP_create_verifier.pod" + ], + "doc/man/man3/SRP_user_pwd_new.3" => [ + "doc/man3/SRP_user_pwd_new.pod" + ], + "doc/man/man3/SSL_CIPHER_get_name.3" => [ + "doc/man3/SSL_CIPHER_get_name.pod" + ], + "doc/man/man3/SSL_COMP_add_compression_method.3" => [ + "doc/man3/SSL_COMP_add_compression_method.pod" + ], + "doc/man/man3/SSL_CONF_CTX_new.3" => [ + "doc/man3/SSL_CONF_CTX_new.pod" + ], + "doc/man/man3/SSL_CONF_CTX_set1_prefix.3" => [ + "doc/man3/SSL_CONF_CTX_set1_prefix.pod" + ], + "doc/man/man3/SSL_CONF_CTX_set_flags.3" => [ + "doc/man3/SSL_CONF_CTX_set_flags.pod" + ], + "doc/man/man3/SSL_CONF_CTX_set_ssl_ctx.3" => [ + "doc/man3/SSL_CONF_CTX_set_ssl_ctx.pod" + ], + "doc/man/man3/SSL_CONF_cmd.3" => [ + "doc/man3/SSL_CONF_cmd.pod" + ], + "doc/man/man3/SSL_CONF_cmd_argv.3" => [ + "doc/man3/SSL_CONF_cmd_argv.pod" + ], + "doc/man/man3/SSL_CTX_add1_chain_cert.3" => [ + "doc/man3/SSL_CTX_add1_chain_cert.pod" + ], + "doc/man/man3/SSL_CTX_add_extra_chain_cert.3" => [ + "doc/man3/SSL_CTX_add_extra_chain_cert.pod" + ], + "doc/man/man3/SSL_CTX_add_session.3" => [ + "doc/man3/SSL_CTX_add_session.pod" + ], + "doc/man/man3/SSL_CTX_config.3" => [ + "doc/man3/SSL_CTX_config.pod" + ], + "doc/man/man3/SSL_CTX_ctrl.3" => [ + "doc/man3/SSL_CTX_ctrl.pod" + ], + "doc/man/man3/SSL_CTX_dane_enable.3" => [ + "doc/man3/SSL_CTX_dane_enable.pod" + ], + "doc/man/man3/SSL_CTX_flush_sessions.3" => [ + "doc/man3/SSL_CTX_flush_sessions.pod" + ], + "doc/man/man3/SSL_CTX_free.3" => [ + "doc/man3/SSL_CTX_free.pod" + ], + "doc/man/man3/SSL_CTX_get0_param.3" => [ + "doc/man3/SSL_CTX_get0_param.pod" + ], + "doc/man/man3/SSL_CTX_get_verify_mode.3" => [ + "doc/man3/SSL_CTX_get_verify_mode.pod" + ], + "doc/man/man3/SSL_CTX_has_client_custom_ext.3" => [ + "doc/man3/SSL_CTX_has_client_custom_ext.pod" + ], + "doc/man/man3/SSL_CTX_load_verify_locations.3" => [ + "doc/man3/SSL_CTX_load_verify_locations.pod" + ], + "doc/man/man3/SSL_CTX_new.3" => [ + "doc/man3/SSL_CTX_new.pod" + ], + "doc/man/man3/SSL_CTX_sess_number.3" => [ + "doc/man3/SSL_CTX_sess_number.pod" + ], + "doc/man/man3/SSL_CTX_sess_set_cache_size.3" => [ + "doc/man3/SSL_CTX_sess_set_cache_size.pod" + ], + "doc/man/man3/SSL_CTX_sess_set_get_cb.3" => [ + "doc/man3/SSL_CTX_sess_set_get_cb.pod" + ], + "doc/man/man3/SSL_CTX_sessions.3" => [ + "doc/man3/SSL_CTX_sessions.pod" + ], + "doc/man/man3/SSL_CTX_set0_CA_list.3" => [ + "doc/man3/SSL_CTX_set0_CA_list.pod" + ], + "doc/man/man3/SSL_CTX_set1_cert_comp_preference.3" => [ + "doc/man3/SSL_CTX_set1_cert_comp_preference.pod" + ], + "doc/man/man3/SSL_CTX_set1_curves.3" => [ + "doc/man3/SSL_CTX_set1_curves.pod" + ], + "doc/man/man3/SSL_CTX_set1_sigalgs.3" => [ + "doc/man3/SSL_CTX_set1_sigalgs.pod" + ], + "doc/man/man3/SSL_CTX_set1_verify_cert_store.3" => [ + "doc/man3/SSL_CTX_set1_verify_cert_store.pod" + ], + "doc/man/man3/SSL_CTX_set_alpn_select_cb.3" => [ + "doc/man3/SSL_CTX_set_alpn_select_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_cert_cb.3" => [ + "doc/man3/SSL_CTX_set_cert_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_cert_store.3" => [ + "doc/man3/SSL_CTX_set_cert_store.pod" + ], + "doc/man/man3/SSL_CTX_set_cert_verify_callback.3" => [ + "doc/man3/SSL_CTX_set_cert_verify_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_cipher_list.3" => [ + "doc/man3/SSL_CTX_set_cipher_list.pod" + ], + "doc/man/man3/SSL_CTX_set_client_cert_cb.3" => [ + "doc/man3/SSL_CTX_set_client_cert_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_client_hello_cb.3" => [ + "doc/man3/SSL_CTX_set_client_hello_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_ct_validation_callback.3" => [ + "doc/man3/SSL_CTX_set_ct_validation_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_ctlog_list_file.3" => [ + "doc/man3/SSL_CTX_set_ctlog_list_file.pod" + ], + "doc/man/man3/SSL_CTX_set_default_passwd_cb.3" => [ + "doc/man3/SSL_CTX_set_default_passwd_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_domain_flags.3" => [ + "doc/man3/SSL_CTX_set_domain_flags.pod" + ], + "doc/man/man3/SSL_CTX_set_generate_session_id.3" => [ + "doc/man3/SSL_CTX_set_generate_session_id.pod" + ], + "doc/man/man3/SSL_CTX_set_info_callback.3" => [ + "doc/man3/SSL_CTX_set_info_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_keylog_callback.3" => [ + "doc/man3/SSL_CTX_set_keylog_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_max_cert_list.3" => [ + "doc/man3/SSL_CTX_set_max_cert_list.pod" + ], + "doc/man/man3/SSL_CTX_set_min_proto_version.3" => [ + "doc/man3/SSL_CTX_set_min_proto_version.pod" + ], + "doc/man/man3/SSL_CTX_set_mode.3" => [ + "doc/man3/SSL_CTX_set_mode.pod" + ], + "doc/man/man3/SSL_CTX_set_msg_callback.3" => [ + "doc/man3/SSL_CTX_set_msg_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_new_pending_conn_cb.3" => [ + "doc/man3/SSL_CTX_set_new_pending_conn_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_num_tickets.3" => [ + "doc/man3/SSL_CTX_set_num_tickets.pod" + ], + "doc/man/man3/SSL_CTX_set_options.3" => [ + "doc/man3/SSL_CTX_set_options.pod" + ], + "doc/man/man3/SSL_CTX_set_psk_client_callback.3" => [ + "doc/man3/SSL_CTX_set_psk_client_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_quiet_shutdown.3" => [ + "doc/man3/SSL_CTX_set_quiet_shutdown.pod" + ], + "doc/man/man3/SSL_CTX_set_read_ahead.3" => [ + "doc/man3/SSL_CTX_set_read_ahead.pod" + ], + "doc/man/man3/SSL_CTX_set_record_padding_callback.3" => [ + "doc/man3/SSL_CTX_set_record_padding_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_security_level.3" => [ + "doc/man3/SSL_CTX_set_security_level.pod" + ], + "doc/man/man3/SSL_CTX_set_session_cache_mode.3" => [ + "doc/man3/SSL_CTX_set_session_cache_mode.pod" + ], + "doc/man/man3/SSL_CTX_set_session_id_context.3" => [ + "doc/man3/SSL_CTX_set_session_id_context.pod" + ], + "doc/man/man3/SSL_CTX_set_session_ticket_cb.3" => [ + "doc/man3/SSL_CTX_set_session_ticket_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_split_send_fragment.3" => [ + "doc/man3/SSL_CTX_set_split_send_fragment.pod" + ], + "doc/man/man3/SSL_CTX_set_srp_password.3" => [ + "doc/man3/SSL_CTX_set_srp_password.pod" + ], + "doc/man/man3/SSL_CTX_set_ssl_version.3" => [ + "doc/man3/SSL_CTX_set_ssl_version.pod" + ], + "doc/man/man3/SSL_CTX_set_stateless_cookie_generate_cb.3" => [ + "doc/man3/SSL_CTX_set_stateless_cookie_generate_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_timeout.3" => [ + "doc/man3/SSL_CTX_set_timeout.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_servername_callback.3" => [ + "doc/man3/SSL_CTX_set_tlsext_servername_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_status_cb.3" => [ + "doc/man3/SSL_CTX_set_tlsext_status_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_ticket_key_cb.3" => [ + "doc/man3/SSL_CTX_set_tlsext_ticket_key_cb.pod" + ], + "doc/man/man3/SSL_CTX_set_tlsext_use_srtp.3" => [ + "doc/man3/SSL_CTX_set_tlsext_use_srtp.pod" + ], + "doc/man/man3/SSL_CTX_set_tmp_dh_callback.3" => [ + "doc/man3/SSL_CTX_set_tmp_dh_callback.pod" + ], + "doc/man/man3/SSL_CTX_set_tmp_ecdh.3" => [ + "doc/man3/SSL_CTX_set_tmp_ecdh.pod" + ], + "doc/man/man3/SSL_CTX_set_verify.3" => [ + "doc/man3/SSL_CTX_set_verify.pod" + ], + "doc/man/man3/SSL_CTX_use_certificate.3" => [ + "doc/man3/SSL_CTX_use_certificate.pod" + ], + "doc/man/man3/SSL_CTX_use_psk_identity_hint.3" => [ + "doc/man3/SSL_CTX_use_psk_identity_hint.pod" + ], + "doc/man/man3/SSL_CTX_use_serverinfo.3" => [ + "doc/man3/SSL_CTX_use_serverinfo.pod" + ], + "doc/man/man3/SSL_SESSION_free.3" => [ + "doc/man3/SSL_SESSION_free.pod" + ], + "doc/man/man3/SSL_SESSION_get0_cipher.3" => [ + "doc/man3/SSL_SESSION_get0_cipher.pod" + ], + "doc/man/man3/SSL_SESSION_get0_hostname.3" => [ + "doc/man3/SSL_SESSION_get0_hostname.pod" + ], + "doc/man/man3/SSL_SESSION_get0_id_context.3" => [ + "doc/man3/SSL_SESSION_get0_id_context.pod" + ], + "doc/man/man3/SSL_SESSION_get0_peer.3" => [ + "doc/man3/SSL_SESSION_get0_peer.pod" + ], + "doc/man/man3/SSL_SESSION_get_compress_id.3" => [ + "doc/man3/SSL_SESSION_get_compress_id.pod" + ], + "doc/man/man3/SSL_SESSION_get_protocol_version.3" => [ + "doc/man3/SSL_SESSION_get_protocol_version.pod" + ], + "doc/man/man3/SSL_SESSION_get_time.3" => [ + "doc/man3/SSL_SESSION_get_time.pod" + ], + "doc/man/man3/SSL_SESSION_has_ticket.3" => [ + "doc/man3/SSL_SESSION_has_ticket.pod" + ], + "doc/man/man3/SSL_SESSION_is_resumable.3" => [ + "doc/man3/SSL_SESSION_is_resumable.pod" + ], + "doc/man/man3/SSL_SESSION_print.3" => [ + "doc/man3/SSL_SESSION_print.pod" + ], + "doc/man/man3/SSL_SESSION_set1_id.3" => [ + "doc/man3/SSL_SESSION_set1_id.pod" + ], + "doc/man/man3/SSL_accept.3" => [ + "doc/man3/SSL_accept.pod" + ], + "doc/man/man3/SSL_accept_stream.3" => [ + "doc/man3/SSL_accept_stream.pod" + ], + "doc/man/man3/SSL_alert_type_string.3" => [ + "doc/man3/SSL_alert_type_string.pod" + ], + "doc/man/man3/SSL_alloc_buffers.3" => [ + "doc/man3/SSL_alloc_buffers.pod" + ], + "doc/man/man3/SSL_check_chain.3" => [ + "doc/man3/SSL_check_chain.pod" + ], + "doc/man/man3/SSL_clear.3" => [ + "doc/man3/SSL_clear.pod" + ], + "doc/man/man3/SSL_connect.3" => [ + "doc/man3/SSL_connect.pod" + ], + "doc/man/man3/SSL_do_handshake.3" => [ + "doc/man3/SSL_do_handshake.pod" + ], + "doc/man/man3/SSL_export_keying_material.3" => [ + "doc/man3/SSL_export_keying_material.pod" + ], + "doc/man/man3/SSL_extension_supported.3" => [ + "doc/man3/SSL_extension_supported.pod" + ], + "doc/man/man3/SSL_free.3" => [ + "doc/man3/SSL_free.pod" + ], + "doc/man/man3/SSL_get0_connection.3" => [ + "doc/man3/SSL_get0_connection.pod" + ], + "doc/man/man3/SSL_get0_group_name.3" => [ + "doc/man3/SSL_get0_group_name.pod" + ], + "doc/man/man3/SSL_get0_peer_rpk.3" => [ + "doc/man3/SSL_get0_peer_rpk.pod" + ], + "doc/man/man3/SSL_get0_peer_scts.3" => [ + "doc/man3/SSL_get0_peer_scts.pod" + ], + "doc/man/man3/SSL_get1_builtin_sigalgs.3" => [ + "doc/man3/SSL_get1_builtin_sigalgs.pod" + ], + "doc/man/man3/SSL_get_SSL_CTX.3" => [ + "doc/man3/SSL_get_SSL_CTX.pod" + ], + "doc/man/man3/SSL_get_all_async_fds.3" => [ + "doc/man3/SSL_get_all_async_fds.pod" + ], + "doc/man/man3/SSL_get_certificate.3" => [ + "doc/man3/SSL_get_certificate.pod" + ], + "doc/man/man3/SSL_get_ciphers.3" => [ + "doc/man3/SSL_get_ciphers.pod" + ], + "doc/man/man3/SSL_get_client_random.3" => [ + "doc/man3/SSL_get_client_random.pod" + ], + "doc/man/man3/SSL_get_conn_close_info.3" => [ + "doc/man3/SSL_get_conn_close_info.pod" + ], + "doc/man/man3/SSL_get_current_cipher.3" => [ + "doc/man3/SSL_get_current_cipher.pod" + ], + "doc/man/man3/SSL_get_default_timeout.3" => [ + "doc/man3/SSL_get_default_timeout.pod" + ], + "doc/man/man3/SSL_get_error.3" => [ + "doc/man3/SSL_get_error.pod" + ], + "doc/man/man3/SSL_get_event_timeout.3" => [ + "doc/man3/SSL_get_event_timeout.pod" + ], + "doc/man/man3/SSL_get_extms_support.3" => [ + "doc/man3/SSL_get_extms_support.pod" + ], + "doc/man/man3/SSL_get_fd.3" => [ + "doc/man3/SSL_get_fd.pod" + ], + "doc/man/man3/SSL_get_handshake_rtt.3" => [ + "doc/man3/SSL_get_handshake_rtt.pod" + ], + "doc/man/man3/SSL_get_peer_cert_chain.3" => [ + "doc/man3/SSL_get_peer_cert_chain.pod" + ], + "doc/man/man3/SSL_get_peer_certificate.3" => [ + "doc/man3/SSL_get_peer_certificate.pod" + ], + "doc/man/man3/SSL_get_peer_signature_nid.3" => [ + "doc/man3/SSL_get_peer_signature_nid.pod" + ], + "doc/man/man3/SSL_get_peer_tmp_key.3" => [ + "doc/man3/SSL_get_peer_tmp_key.pod" + ], + "doc/man/man3/SSL_get_psk_identity.3" => [ + "doc/man3/SSL_get_psk_identity.pod" + ], + "doc/man/man3/SSL_get_rbio.3" => [ + "doc/man3/SSL_get_rbio.pod" + ], + "doc/man/man3/SSL_get_rpoll_descriptor.3" => [ + "doc/man3/SSL_get_rpoll_descriptor.pod" + ], + "doc/man/man3/SSL_get_session.3" => [ + "doc/man3/SSL_get_session.pod" + ], + "doc/man/man3/SSL_get_shared_sigalgs.3" => [ + "doc/man3/SSL_get_shared_sigalgs.pod" + ], + "doc/man/man3/SSL_get_stream_id.3" => [ + "doc/man3/SSL_get_stream_id.pod" + ], + "doc/man/man3/SSL_get_stream_read_state.3" => [ + "doc/man3/SSL_get_stream_read_state.pod" + ], + "doc/man/man3/SSL_get_value_uint.3" => [ + "doc/man3/SSL_get_value_uint.pod" + ], + "doc/man/man3/SSL_get_verify_result.3" => [ + "doc/man3/SSL_get_verify_result.pod" + ], + "doc/man/man3/SSL_get_version.3" => [ + "doc/man3/SSL_get_version.pod" + ], + "doc/man/man3/SSL_group_to_name.3" => [ + "doc/man3/SSL_group_to_name.pod" + ], + "doc/man/man3/SSL_handle_events.3" => [ + "doc/man3/SSL_handle_events.pod" + ], + "doc/man/man3/SSL_in_init.3" => [ + "doc/man3/SSL_in_init.pod" + ], + "doc/man/man3/SSL_inject_net_dgram.3" => [ + "doc/man3/SSL_inject_net_dgram.pod" + ], + "doc/man/man3/SSL_key_update.3" => [ + "doc/man3/SSL_key_update.pod" + ], + "doc/man/man3/SSL_library_init.3" => [ + "doc/man3/SSL_library_init.pod" + ], + "doc/man/man3/SSL_load_client_CA_file.3" => [ + "doc/man3/SSL_load_client_CA_file.pod" + ], + "doc/man/man3/SSL_new.3" => [ + "doc/man3/SSL_new.pod" + ], + "doc/man/man3/SSL_new_domain.3" => [ + "doc/man3/SSL_new_domain.pod" + ], + "doc/man/man3/SSL_new_listener.3" => [ + "doc/man3/SSL_new_listener.pod" + ], + "doc/man/man3/SSL_new_stream.3" => [ + "doc/man3/SSL_new_stream.pod" + ], + "doc/man/man3/SSL_pending.3" => [ + "doc/man3/SSL_pending.pod" + ], + "doc/man/man3/SSL_poll.3" => [ + "doc/man3/SSL_poll.pod" + ], + "doc/man/man3/SSL_read.3" => [ + "doc/man3/SSL_read.pod" + ], + "doc/man/man3/SSL_read_early_data.3" => [ + "doc/man3/SSL_read_early_data.pod" + ], + "doc/man/man3/SSL_rstate_string.3" => [ + "doc/man3/SSL_rstate_string.pod" + ], + "doc/man/man3/SSL_session_reused.3" => [ + "doc/man3/SSL_session_reused.pod" + ], + "doc/man/man3/SSL_set1_host.3" => [ + "doc/man3/SSL_set1_host.pod" + ], + "doc/man/man3/SSL_set1_initial_peer_addr.3" => [ + "doc/man3/SSL_set1_initial_peer_addr.pod" + ], + "doc/man/man3/SSL_set1_server_cert_type.3" => [ + "doc/man3/SSL_set1_server_cert_type.pod" + ], + "doc/man/man3/SSL_set_async_callback.3" => [ + "doc/man3/SSL_set_async_callback.pod" + ], + "doc/man/man3/SSL_set_bio.3" => [ + "doc/man3/SSL_set_bio.pod" + ], + "doc/man/man3/SSL_set_blocking_mode.3" => [ + "doc/man3/SSL_set_blocking_mode.pod" + ], + "doc/man/man3/SSL_set_connect_state.3" => [ + "doc/man3/SSL_set_connect_state.pod" + ], + "doc/man/man3/SSL_set_default_stream_mode.3" => [ + "doc/man3/SSL_set_default_stream_mode.pod" + ], + "doc/man/man3/SSL_set_fd.3" => [ + "doc/man3/SSL_set_fd.pod" + ], + "doc/man/man3/SSL_set_incoming_stream_policy.3" => [ + "doc/man3/SSL_set_incoming_stream_policy.pod" + ], + "doc/man/man3/SSL_set_quic_tls_cbs.3" => [ + "doc/man3/SSL_set_quic_tls_cbs.pod" + ], + "doc/man/man3/SSL_set_retry_verify.3" => [ + "doc/man3/SSL_set_retry_verify.pod" + ], + "doc/man/man3/SSL_set_session.3" => [ + "doc/man3/SSL_set_session.pod" + ], + "doc/man/man3/SSL_set_session_secret_cb.3" => [ + "doc/man3/SSL_set_session_secret_cb.pod" + ], + "doc/man/man3/SSL_set_shutdown.3" => [ + "doc/man3/SSL_set_shutdown.pod" + ], + "doc/man/man3/SSL_set_verify_result.3" => [ + "doc/man3/SSL_set_verify_result.pod" + ], + "doc/man/man3/SSL_shutdown.3" => [ + "doc/man3/SSL_shutdown.pod" + ], + "doc/man/man3/SSL_state_string.3" => [ + "doc/man3/SSL_state_string.pod" + ], + "doc/man/man3/SSL_stream_conclude.3" => [ + "doc/man3/SSL_stream_conclude.pod" + ], + "doc/man/man3/SSL_stream_reset.3" => [ + "doc/man3/SSL_stream_reset.pod" + ], + "doc/man/man3/SSL_want.3" => [ + "doc/man3/SSL_want.pod" + ], + "doc/man/man3/SSL_write.3" => [ + "doc/man3/SSL_write.pod" + ], + "doc/man/man3/TS_RESP_CTX_new.3" => [ + "doc/man3/TS_RESP_CTX_new.pod" + ], + "doc/man/man3/TS_VERIFY_CTX.3" => [ + "doc/man3/TS_VERIFY_CTX.pod" + ], + "doc/man/man3/UI_STRING.3" => [ + "doc/man3/UI_STRING.pod" + ], + "doc/man/man3/UI_UTIL_read_pw.3" => [ + "doc/man3/UI_UTIL_read_pw.pod" + ], + "doc/man/man3/UI_create_method.3" => [ + "doc/man3/UI_create_method.pod" + ], + "doc/man/man3/UI_new.3" => [ + "doc/man3/UI_new.pod" + ], + "doc/man/man3/X509V3_EXT_print.3" => [ + "doc/man3/X509V3_EXT_print.pod" + ], + "doc/man/man3/X509V3_get_d2i.3" => [ + "doc/man3/X509V3_get_d2i.pod" + ], + "doc/man/man3/X509V3_set_ctx.3" => [ + "doc/man3/X509V3_set_ctx.pod" + ], + "doc/man/man3/X509_ACERT_add1_attr.3" => [ + "doc/man3/X509_ACERT_add1_attr.pod" + ], + "doc/man/man3/X509_ACERT_add_attr_nconf.3" => [ + "doc/man3/X509_ACERT_add_attr_nconf.pod" + ], + "doc/man/man3/X509_ACERT_get0_holder_baseCertId.3" => [ + "doc/man3/X509_ACERT_get0_holder_baseCertId.pod" + ], + "doc/man/man3/X509_ACERT_get_attr.3" => [ + "doc/man3/X509_ACERT_get_attr.pod" + ], + "doc/man/man3/X509_ACERT_print_ex.3" => [ + "doc/man3/X509_ACERT_print_ex.pod" + ], + "doc/man/man3/X509_ALGOR_dup.3" => [ + "doc/man3/X509_ALGOR_dup.pod" + ], + "doc/man/man3/X509_ATTRIBUTE.3" => [ + "doc/man3/X509_ATTRIBUTE.pod" + ], + "doc/man/man3/X509_CRL_get0_by_serial.3" => [ + "doc/man3/X509_CRL_get0_by_serial.pod" + ], + "doc/man/man3/X509_EXTENSION_set_object.3" => [ + "doc/man3/X509_EXTENSION_set_object.pod" + ], + "doc/man/man3/X509_LOOKUP.3" => [ + "doc/man3/X509_LOOKUP.pod" + ], + "doc/man/man3/X509_LOOKUP_hash_dir.3" => [ + "doc/man3/X509_LOOKUP_hash_dir.pod" + ], + "doc/man/man3/X509_LOOKUP_meth_new.3" => [ + "doc/man3/X509_LOOKUP_meth_new.pod" + ], + "doc/man/man3/X509_NAME_ENTRY_get_object.3" => [ + "doc/man3/X509_NAME_ENTRY_get_object.pod" + ], + "doc/man/man3/X509_NAME_add_entry_by_txt.3" => [ + "doc/man3/X509_NAME_add_entry_by_txt.pod" + ], + "doc/man/man3/X509_NAME_get0_der.3" => [ + "doc/man3/X509_NAME_get0_der.pod" + ], + "doc/man/man3/X509_NAME_get_index_by_NID.3" => [ + "doc/man3/X509_NAME_get_index_by_NID.pod" + ], + "doc/man/man3/X509_NAME_print_ex.3" => [ + "doc/man3/X509_NAME_print_ex.pod" + ], + "doc/man/man3/X509_PUBKEY_new.3" => [ + "doc/man3/X509_PUBKEY_new.pod" + ], + "doc/man/man3/X509_REQ_get_attr.3" => [ + "doc/man3/X509_REQ_get_attr.pod" + ], + "doc/man/man3/X509_REQ_get_extensions.3" => [ + "doc/man3/X509_REQ_get_extensions.pod" + ], + "doc/man/man3/X509_SIG_get0.3" => [ + "doc/man3/X509_SIG_get0.pod" + ], + "doc/man/man3/X509_STORE_CTX_get_by_subject.3" => [ + "doc/man3/X509_STORE_CTX_get_by_subject.pod" + ], + "doc/man/man3/X509_STORE_CTX_get_error.3" => [ + "doc/man3/X509_STORE_CTX_get_error.pod" + ], + "doc/man/man3/X509_STORE_CTX_new.3" => [ + "doc/man3/X509_STORE_CTX_new.pod" + ], + "doc/man/man3/X509_STORE_CTX_set_verify_cb.3" => [ + "doc/man3/X509_STORE_CTX_set_verify_cb.pod" + ], + "doc/man/man3/X509_STORE_add_cert.3" => [ + "doc/man3/X509_STORE_add_cert.pod" + ], + "doc/man/man3/X509_STORE_get0_param.3" => [ + "doc/man3/X509_STORE_get0_param.pod" + ], + "doc/man/man3/X509_STORE_new.3" => [ + "doc/man3/X509_STORE_new.pod" + ], + "doc/man/man3/X509_STORE_set_verify_cb_func.3" => [ + "doc/man3/X509_STORE_set_verify_cb_func.pod" + ], + "doc/man/man3/X509_VERIFY_PARAM_set_flags.3" => [ + "doc/man3/X509_VERIFY_PARAM_set_flags.pod" + ], + "doc/man/man3/X509_add_cert.3" => [ + "doc/man3/X509_add_cert.pod" + ], + "doc/man/man3/X509_check_ca.3" => [ + "doc/man3/X509_check_ca.pod" + ], + "doc/man/man3/X509_check_host.3" => [ + "doc/man3/X509_check_host.pod" + ], + "doc/man/man3/X509_check_issued.3" => [ + "doc/man3/X509_check_issued.pod" + ], + "doc/man/man3/X509_check_private_key.3" => [ + "doc/man3/X509_check_private_key.pod" + ], + "doc/man/man3/X509_check_purpose.3" => [ + "doc/man3/X509_check_purpose.pod" + ], + "doc/man/man3/X509_cmp.3" => [ + "doc/man3/X509_cmp.pod" + ], + "doc/man/man3/X509_cmp_time.3" => [ + "doc/man3/X509_cmp_time.pod" + ], + "doc/man/man3/X509_digest.3" => [ + "doc/man3/X509_digest.pod" + ], + "doc/man/man3/X509_dup.3" => [ + "doc/man3/X509_dup.pod" + ], + "doc/man/man3/X509_get0_distinguishing_id.3" => [ + "doc/man3/X509_get0_distinguishing_id.pod" + ], + "doc/man/man3/X509_get0_notBefore.3" => [ + "doc/man3/X509_get0_notBefore.pod" + ], + "doc/man/man3/X509_get0_signature.3" => [ + "doc/man3/X509_get0_signature.pod" + ], + "doc/man/man3/X509_get0_uids.3" => [ + "doc/man3/X509_get0_uids.pod" + ], + "doc/man/man3/X509_get_default_cert_file.3" => [ + "doc/man3/X509_get_default_cert_file.pod" + ], + "doc/man/man3/X509_get_extension_flags.3" => [ + "doc/man3/X509_get_extension_flags.pod" + ], + "doc/man/man3/X509_get_pubkey.3" => [ + "doc/man3/X509_get_pubkey.pod" + ], + "doc/man/man3/X509_get_serialNumber.3" => [ + "doc/man3/X509_get_serialNumber.pod" + ], + "doc/man/man3/X509_get_subject_name.3" => [ + "doc/man3/X509_get_subject_name.pod" + ], + "doc/man/man3/X509_get_version.3" => [ + "doc/man3/X509_get_version.pod" + ], + "doc/man/man3/X509_load_http.3" => [ + "doc/man3/X509_load_http.pod" + ], + "doc/man/man3/X509_new.3" => [ + "doc/man3/X509_new.pod" + ], + "doc/man/man3/X509_sign.3" => [ + "doc/man3/X509_sign.pod" + ], + "doc/man/man3/X509_verify.3" => [ + "doc/man3/X509_verify.pod" + ], + "doc/man/man3/X509_verify_cert.3" => [ + "doc/man3/X509_verify_cert.pod" + ], + "doc/man/man3/X509v3_get_ext_by_NID.3" => [ + "doc/man3/X509v3_get_ext_by_NID.pod" + ], + "doc/man/man3/b2i_PVK_bio_ex.3" => [ + "doc/man3/b2i_PVK_bio_ex.pod" + ], + "doc/man/man3/d2i_PKCS8PrivateKey_bio.3" => [ + "doc/man3/d2i_PKCS8PrivateKey_bio.pod" + ], + "doc/man/man3/d2i_PrivateKey.3" => [ + "doc/man3/d2i_PrivateKey.pod" + ], + "doc/man/man3/d2i_RSAPrivateKey.3" => [ + "doc/man3/d2i_RSAPrivateKey.pod" + ], + "doc/man/man3/d2i_SSL_SESSION.3" => [ + "doc/man3/d2i_SSL_SESSION.pod" + ], + "doc/man/man3/d2i_X509.3" => [ + "doc/man3/d2i_X509.pod" + ], + "doc/man/man3/i2d_CMS_bio_stream.3" => [ + "doc/man3/i2d_CMS_bio_stream.pod" + ], + "doc/man/man3/i2d_PKCS7_bio_stream.3" => [ + "doc/man3/i2d_PKCS7_bio_stream.pod" + ], + "doc/man/man3/i2d_re_X509_tbs.3" => [ + "doc/man3/i2d_re_X509_tbs.pod" + ], + "doc/man/man3/o2i_SCT_LIST.3" => [ + "doc/man3/o2i_SCT_LIST.pod" + ], + "doc/man/man3/s2i_ASN1_IA5STRING.3" => [ + "doc/man3/s2i_ASN1_IA5STRING.pod" + ], + "doc/man/man5/config.5" => [ + "doc/man5/config.pod" + ], + "doc/man/man5/fips_config.5" => [ + "doc/man5/fips_config.pod" + ], + "doc/man/man5/x509v3_config.5" => [ + "doc/man5/x509v3_config.pod" + ], + "doc/man/man7/EVP_ASYM_CIPHER-RSA.7" => [ + "doc/man7/EVP_ASYM_CIPHER-RSA.pod" + ], + "doc/man/man7/EVP_ASYM_CIPHER-SM2.7" => [ + "doc/man7/EVP_ASYM_CIPHER-SM2.pod" + ], + "doc/man/man7/EVP_CIPHER-AES.7" => [ + "doc/man7/EVP_CIPHER-AES.pod" + ], + "doc/man/man7/EVP_CIPHER-ARIA.7" => [ + "doc/man7/EVP_CIPHER-ARIA.pod" + ], + "doc/man/man7/EVP_CIPHER-BLOWFISH.7" => [ + "doc/man7/EVP_CIPHER-BLOWFISH.pod" + ], + "doc/man/man7/EVP_CIPHER-CAMELLIA.7" => [ + "doc/man7/EVP_CIPHER-CAMELLIA.pod" + ], + "doc/man/man7/EVP_CIPHER-CAST.7" => [ + "doc/man7/EVP_CIPHER-CAST.pod" + ], + "doc/man/man7/EVP_CIPHER-CHACHA.7" => [ + "doc/man7/EVP_CIPHER-CHACHA.pod" + ], + "doc/man/man7/EVP_CIPHER-DES.7" => [ + "doc/man7/EVP_CIPHER-DES.pod" + ], + "doc/man/man7/EVP_CIPHER-IDEA.7" => [ + "doc/man7/EVP_CIPHER-IDEA.pod" + ], + "doc/man/man7/EVP_CIPHER-NULL.7" => [ + "doc/man7/EVP_CIPHER-NULL.pod" + ], + "doc/man/man7/EVP_CIPHER-RC2.7" => [ + "doc/man7/EVP_CIPHER-RC2.pod" + ], + "doc/man/man7/EVP_CIPHER-RC4.7" => [ + "doc/man7/EVP_CIPHER-RC4.pod" + ], + "doc/man/man7/EVP_CIPHER-RC5.7" => [ + "doc/man7/EVP_CIPHER-RC5.pod" + ], + "doc/man/man7/EVP_CIPHER-SEED.7" => [ + "doc/man7/EVP_CIPHER-SEED.pod" + ], + "doc/man/man7/EVP_CIPHER-SM4.7" => [ + "doc/man7/EVP_CIPHER-SM4.pod" + ], + "doc/man/man7/EVP_KDF-ARGON2.7" => [ + "doc/man7/EVP_KDF-ARGON2.pod" + ], + "doc/man/man7/EVP_KDF-HKDF.7" => [ + "doc/man7/EVP_KDF-HKDF.pod" + ], + "doc/man/man7/EVP_KDF-HMAC-DRBG.7" => [ + "doc/man7/EVP_KDF-HMAC-DRBG.pod" + ], + "doc/man/man7/EVP_KDF-KB.7" => [ + "doc/man7/EVP_KDF-KB.pod" + ], + "doc/man/man7/EVP_KDF-KRB5KDF.7" => [ + "doc/man7/EVP_KDF-KRB5KDF.pod" + ], + "doc/man/man7/EVP_KDF-PBKDF1.7" => [ + "doc/man7/EVP_KDF-PBKDF1.pod" + ], + "doc/man/man7/EVP_KDF-PBKDF2.7" => [ + "doc/man7/EVP_KDF-PBKDF2.pod" + ], + "doc/man/man7/EVP_KDF-PKCS12KDF.7" => [ + "doc/man7/EVP_KDF-PKCS12KDF.pod" + ], + "doc/man/man7/EVP_KDF-PVKKDF.7" => [ + "doc/man7/EVP_KDF-PVKKDF.pod" + ], + "doc/man/man7/EVP_KDF-SCRYPT.7" => [ + "doc/man7/EVP_KDF-SCRYPT.pod" + ], + "doc/man/man7/EVP_KDF-SS.7" => [ + "doc/man7/EVP_KDF-SS.pod" + ], + "doc/man/man7/EVP_KDF-SSHKDF.7" => [ + "doc/man7/EVP_KDF-SSHKDF.pod" + ], + "doc/man/man7/EVP_KDF-TLS13_KDF.7" => [ + "doc/man7/EVP_KDF-TLS13_KDF.pod" + ], + "doc/man/man7/EVP_KDF-TLS1_PRF.7" => [ + "doc/man7/EVP_KDF-TLS1_PRF.pod" + ], + "doc/man/man7/EVP_KDF-X942-ASN1.7" => [ + "doc/man7/EVP_KDF-X942-ASN1.pod" + ], + "doc/man/man7/EVP_KDF-X942-CONCAT.7" => [ + "doc/man7/EVP_KDF-X942-CONCAT.pod" + ], + "doc/man/man7/EVP_KDF-X963.7" => [ + "doc/man7/EVP_KDF-X963.pod" + ], + "doc/man/man7/EVP_KEM-EC.7" => [ + "doc/man7/EVP_KEM-EC.pod" + ], + "doc/man/man7/EVP_KEM-ML-KEM.7" => [ + "doc/man7/EVP_KEM-ML-KEM.pod" + ], + "doc/man/man7/EVP_KEM-RSA.7" => [ + "doc/man7/EVP_KEM-RSA.pod" + ], + "doc/man/man7/EVP_KEM-X25519.7" => [ + "doc/man7/EVP_KEM-X25519.pod" + ], + "doc/man/man7/EVP_KEYEXCH-DH.7" => [ + "doc/man7/EVP_KEYEXCH-DH.pod" + ], + "doc/man/man7/EVP_KEYEXCH-ECDH.7" => [ + "doc/man7/EVP_KEYEXCH-ECDH.pod" + ], + "doc/man/man7/EVP_KEYEXCH-X25519.7" => [ + "doc/man7/EVP_KEYEXCH-X25519.pod" + ], + "doc/man/man7/EVP_MAC-BLAKE2.7" => [ + "doc/man7/EVP_MAC-BLAKE2.pod" + ], + "doc/man/man7/EVP_MAC-CMAC.7" => [ + "doc/man7/EVP_MAC-CMAC.pod" + ], + "doc/man/man7/EVP_MAC-GMAC.7" => [ + "doc/man7/EVP_MAC-GMAC.pod" + ], + "doc/man/man7/EVP_MAC-HMAC.7" => [ + "doc/man7/EVP_MAC-HMAC.pod" + ], + "doc/man/man7/EVP_MAC-KMAC.7" => [ + "doc/man7/EVP_MAC-KMAC.pod" + ], + "doc/man/man7/EVP_MAC-Poly1305.7" => [ + "doc/man7/EVP_MAC-Poly1305.pod" + ], + "doc/man/man7/EVP_MAC-Siphash.7" => [ + "doc/man7/EVP_MAC-Siphash.pod" + ], + "doc/man/man7/EVP_MD-BLAKE2.7" => [ + "doc/man7/EVP_MD-BLAKE2.pod" + ], + "doc/man/man7/EVP_MD-KECCAK.7" => [ + "doc/man7/EVP_MD-KECCAK.pod" + ], + "doc/man/man7/EVP_MD-MD2.7" => [ + "doc/man7/EVP_MD-MD2.pod" + ], + "doc/man/man7/EVP_MD-MD4.7" => [ + "doc/man7/EVP_MD-MD4.pod" + ], + "doc/man/man7/EVP_MD-MD5-SHA1.7" => [ + "doc/man7/EVP_MD-MD5-SHA1.pod" + ], + "doc/man/man7/EVP_MD-MD5.7" => [ + "doc/man7/EVP_MD-MD5.pod" + ], + "doc/man/man7/EVP_MD-MDC2.7" => [ + "doc/man7/EVP_MD-MDC2.pod" + ], + "doc/man/man7/EVP_MD-NULL.7" => [ + "doc/man7/EVP_MD-NULL.pod" + ], + "doc/man/man7/EVP_MD-RIPEMD160.7" => [ + "doc/man7/EVP_MD-RIPEMD160.pod" + ], + "doc/man/man7/EVP_MD-SHA1.7" => [ + "doc/man7/EVP_MD-SHA1.pod" + ], + "doc/man/man7/EVP_MD-SHA2.7" => [ + "doc/man7/EVP_MD-SHA2.pod" + ], + "doc/man/man7/EVP_MD-SHA3.7" => [ + "doc/man7/EVP_MD-SHA3.pod" + ], + "doc/man/man7/EVP_MD-SHAKE.7" => [ + "doc/man7/EVP_MD-SHAKE.pod" + ], + "doc/man/man7/EVP_MD-SM3.7" => [ + "doc/man7/EVP_MD-SM3.pod" + ], + "doc/man/man7/EVP_MD-WHIRLPOOL.7" => [ + "doc/man7/EVP_MD-WHIRLPOOL.pod" + ], + "doc/man/man7/EVP_MD-common.7" => [ + "doc/man7/EVP_MD-common.pod" + ], + "doc/man/man7/EVP_PKEY-DH.7" => [ + "doc/man7/EVP_PKEY-DH.pod" + ], + "doc/man/man7/EVP_PKEY-DSA.7" => [ + "doc/man7/EVP_PKEY-DSA.pod" + ], + "doc/man/man7/EVP_PKEY-EC.7" => [ + "doc/man7/EVP_PKEY-EC.pod" + ], + "doc/man/man7/EVP_PKEY-FFC.7" => [ + "doc/man7/EVP_PKEY-FFC.pod" + ], + "doc/man/man7/EVP_PKEY-HMAC.7" => [ + "doc/man7/EVP_PKEY-HMAC.pod" + ], + "doc/man/man7/EVP_PKEY-ML-DSA.7" => [ + "doc/man7/EVP_PKEY-ML-DSA.pod" + ], + "doc/man/man7/EVP_PKEY-ML-KEM.7" => [ + "doc/man7/EVP_PKEY-ML-KEM.pod" + ], + "doc/man/man7/EVP_PKEY-RSA.7" => [ + "doc/man7/EVP_PKEY-RSA.pod" + ], + "doc/man/man7/EVP_PKEY-SLH-DSA.7" => [ + "doc/man7/EVP_PKEY-SLH-DSA.pod" + ], + "doc/man/man7/EVP_PKEY-SM2.7" => [ + "doc/man7/EVP_PKEY-SM2.pod" + ], + "doc/man/man7/EVP_PKEY-X25519.7" => [ + "doc/man7/EVP_PKEY-X25519.pod" + ], + "doc/man/man7/EVP_RAND-CRNG-TEST.7" => [ + "doc/man7/EVP_RAND-CRNG-TEST.pod" + ], + "doc/man/man7/EVP_RAND-CTR-DRBG.7" => [ + "doc/man7/EVP_RAND-CTR-DRBG.pod" + ], + "doc/man/man7/EVP_RAND-HASH-DRBG.7" => [ + "doc/man7/EVP_RAND-HASH-DRBG.pod" + ], + "doc/man/man7/EVP_RAND-HMAC-DRBG.7" => [ + "doc/man7/EVP_RAND-HMAC-DRBG.pod" + ], + "doc/man/man7/EVP_RAND-JITTER.7" => [ + "doc/man7/EVP_RAND-JITTER.pod" + ], + "doc/man/man7/EVP_RAND-SEED-SRC.7" => [ + "doc/man7/EVP_RAND-SEED-SRC.pod" + ], + "doc/man/man7/EVP_RAND-TEST-RAND.7" => [ + "doc/man7/EVP_RAND-TEST-RAND.pod" + ], + "doc/man/man7/EVP_RAND.7" => [ + "doc/man7/EVP_RAND.pod" + ], + "doc/man/man7/EVP_SIGNATURE-DSA.7" => [ + "doc/man7/EVP_SIGNATURE-DSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-ECDSA.7" => [ + "doc/man7/EVP_SIGNATURE-ECDSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-ED25519.7" => [ + "doc/man7/EVP_SIGNATURE-ED25519.pod" + ], + "doc/man/man7/EVP_SIGNATURE-HMAC.7" => [ + "doc/man7/EVP_SIGNATURE-HMAC.pod" + ], + "doc/man/man7/EVP_SIGNATURE-ML-DSA.7" => [ + "doc/man7/EVP_SIGNATURE-ML-DSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-RSA.7" => [ + "doc/man7/EVP_SIGNATURE-RSA.pod" + ], + "doc/man/man7/EVP_SIGNATURE-SLH-DSA.7" => [ + "doc/man7/EVP_SIGNATURE-SLH-DSA.pod" + ], + "doc/man/man7/OSSL_PROVIDER-FIPS.7" => [ + "doc/man7/OSSL_PROVIDER-FIPS.pod" + ], + "doc/man/man7/OSSL_PROVIDER-base.7" => [ + "doc/man7/OSSL_PROVIDER-base.pod" + ], + "doc/man/man7/OSSL_PROVIDER-default.7" => [ + "doc/man7/OSSL_PROVIDER-default.pod" + ], + "doc/man/man7/OSSL_PROVIDER-legacy.7" => [ + "doc/man7/OSSL_PROVIDER-legacy.pod" + ], + "doc/man/man7/OSSL_PROVIDER-null.7" => [ + "doc/man7/OSSL_PROVIDER-null.pod" + ], + "doc/man/man7/OSSL_STORE-winstore.7" => [ + "doc/man7/OSSL_STORE-winstore.pod" + ], + "doc/man/man7/RAND.7" => [ + "doc/man7/RAND.pod" + ], + "doc/man/man7/RSA-PSS.7" => [ + "doc/man7/RSA-PSS.pod" + ], + "doc/man/man7/X25519.7" => [ + "doc/man7/X25519.pod" + ], + "doc/man/man7/bio.7" => [ + "doc/man7/bio.pod" + ], + "doc/man/man7/ct.7" => [ + "doc/man7/ct.pod" + ], + "doc/man/man7/des_modes.7" => [ + "doc/man7/des_modes.pod" + ], + "doc/man/man7/evp.7" => [ + "doc/man7/evp.pod" + ], + "doc/man/man7/fips_module.7" => [ + "doc/man7/fips_module.pod" + ], + "doc/man/man7/life_cycle-cipher.7" => [ + "doc/man7/life_cycle-cipher.pod" + ], + "doc/man/man7/life_cycle-digest.7" => [ + "doc/man7/life_cycle-digest.pod" + ], + "doc/man/man7/life_cycle-kdf.7" => [ + "doc/man7/life_cycle-kdf.pod" + ], + "doc/man/man7/life_cycle-mac.7" => [ + "doc/man7/life_cycle-mac.pod" + ], + "doc/man/man7/life_cycle-pkey.7" => [ + "doc/man7/life_cycle-pkey.pod" + ], + "doc/man/man7/life_cycle-rand.7" => [ + "doc/man7/life_cycle-rand.pod" + ], + "doc/man/man7/openssl-core.h.7" => [ + "doc/man7/openssl-core.h.pod" + ], + "doc/man/man7/openssl-core_dispatch.h.7" => [ + "doc/man7/openssl-core_dispatch.h.pod" + ], + "doc/man/man7/openssl-core_names.h.7" => [ + "doc/man7/openssl-core_names.h.pod" + ], + "doc/man/man7/openssl-env.7" => [ + "doc/man7/openssl-env.pod" + ], + "doc/man/man7/openssl-glossary.7" => [ + "doc/man7/openssl-glossary.pod" + ], + "doc/man/man7/openssl-qlog.7" => [ + "doc/man7/openssl-qlog.pod" + ], + "doc/man/man7/openssl-quic-concurrency.7" => [ + "doc/man7/openssl-quic-concurrency.pod" + ], + "doc/man/man7/openssl-quic.7" => [ + "doc/man7/openssl-quic.pod" + ], + "doc/man/man7/openssl-threads.7" => [ + "doc/man7/openssl-threads.pod" + ], + "doc/man/man7/openssl_user_macros.7" => [ + "doc/man7/openssl_user_macros.pod" + ], + "doc/man/man7/ossl-guide-introduction.7" => [ + "doc/man7/ossl-guide-introduction.pod" + ], + "doc/man/man7/ossl-guide-libcrypto-introduction.7" => [ + "doc/man7/ossl-guide-libcrypto-introduction.pod" + ], + "doc/man/man7/ossl-guide-libraries-introduction.7" => [ + "doc/man7/ossl-guide-libraries-introduction.pod" + ], + "doc/man/man7/ossl-guide-libssl-introduction.7" => [ + "doc/man7/ossl-guide-libssl-introduction.pod" + ], + "doc/man/man7/ossl-guide-migration.7" => [ + "doc/man7/ossl-guide-migration.pod" + ], + "doc/man/man7/ossl-guide-quic-client-block.7" => [ + "doc/man7/ossl-guide-quic-client-block.pod" + ], + "doc/man/man7/ossl-guide-quic-client-non-block.7" => [ + "doc/man7/ossl-guide-quic-client-non-block.pod" + ], + "doc/man/man7/ossl-guide-quic-introduction.7" => [ + "doc/man7/ossl-guide-quic-introduction.pod" + ], + "doc/man/man7/ossl-guide-quic-multi-stream.7" => [ + "doc/man7/ossl-guide-quic-multi-stream.pod" + ], + "doc/man/man7/ossl-guide-quic-server-block.7" => [ + "doc/man7/ossl-guide-quic-server-block.pod" + ], + "doc/man/man7/ossl-guide-quic-server-non-block.7" => [ + "doc/man7/ossl-guide-quic-server-non-block.pod" + ], + "doc/man/man7/ossl-guide-tls-client-block.7" => [ + "doc/man7/ossl-guide-tls-client-block.pod" + ], + "doc/man/man7/ossl-guide-tls-client-non-block.7" => [ + "doc/man7/ossl-guide-tls-client-non-block.pod" + ], + "doc/man/man7/ossl-guide-tls-introduction.7" => [ + "doc/man7/ossl-guide-tls-introduction.pod" + ], + "doc/man/man7/ossl-guide-tls-server-block.7" => [ + "doc/man7/ossl-guide-tls-server-block.pod" + ], + "doc/man/man7/ossl_store-file.7" => [ + "doc/man7/ossl_store-file.pod" + ], + "doc/man/man7/ossl_store.7" => [ + "doc/man7/ossl_store.pod" + ], + "doc/man/man7/passphrase-encoding.7" => [ + "doc/man7/passphrase-encoding.pod" + ], + "doc/man/man7/property.7" => [ + "doc/man7/property.pod" + ], + "doc/man/man7/provider-asym_cipher.7" => [ + "doc/man7/provider-asym_cipher.pod" + ], + "doc/man/man7/provider-base.7" => [ + "doc/man7/provider-base.pod" + ], + "doc/man/man7/provider-cipher.7" => [ + "doc/man7/provider-cipher.pod" + ], + "doc/man/man7/provider-decoder.7" => [ + "doc/man7/provider-decoder.pod" + ], + "doc/man/man7/provider-digest.7" => [ + "doc/man7/provider-digest.pod" + ], + "doc/man/man7/provider-encoder.7" => [ + "doc/man7/provider-encoder.pod" + ], + "doc/man/man7/provider-kdf.7" => [ + "doc/man7/provider-kdf.pod" + ], + "doc/man/man7/provider-kem.7" => [ + "doc/man7/provider-kem.pod" + ], + "doc/man/man7/provider-keyexch.7" => [ + "doc/man7/provider-keyexch.pod" + ], + "doc/man/man7/provider-keymgmt.7" => [ + "doc/man7/provider-keymgmt.pod" + ], + "doc/man/man7/provider-mac.7" => [ + "doc/man7/provider-mac.pod" + ], + "doc/man/man7/provider-object.7" => [ + "doc/man7/provider-object.pod" + ], + "doc/man/man7/provider-rand.7" => [ + "doc/man7/provider-rand.pod" + ], + "doc/man/man7/provider-signature.7" => [ + "doc/man7/provider-signature.pod" + ], + "doc/man/man7/provider-skeymgmt.7" => [ + "doc/man7/provider-skeymgmt.pod" + ], + "doc/man/man7/provider-storemgmt.7" => [ + "doc/man7/provider-storemgmt.pod" + ], + "doc/man/man7/provider.7" => [ + "doc/man7/provider.pod" + ], + "doc/man/man7/proxy-certificates.7" => [ + "doc/man7/proxy-certificates.pod" + ], + "doc/man/man7/x509.7" => [ + "doc/man7/x509.pod" + ], + "doc/man1/openssl-asn1parse.pod" => [ + "doc/man1/openssl-asn1parse.pod.in" + ], + "doc/man1/openssl-ca.pod" => [ + "doc/man1/openssl-ca.pod.in" + ], + "doc/man1/openssl-ciphers.pod" => [ + "doc/man1/openssl-ciphers.pod.in" + ], + "doc/man1/openssl-cmds.pod" => [ + "doc/man1/openssl-cmds.pod.in" + ], + "doc/man1/openssl-cmp.pod" => [ + "doc/man1/openssl-cmp.pod.in" + ], + "doc/man1/openssl-cms.pod" => [ + "doc/man1/openssl-cms.pod.in" + ], + "doc/man1/openssl-crl.pod" => [ + "doc/man1/openssl-crl.pod.in" + ], + "doc/man1/openssl-crl2pkcs7.pod" => [ + "doc/man1/openssl-crl2pkcs7.pod.in" + ], + "doc/man1/openssl-dgst.pod" => [ + "doc/man1/openssl-dgst.pod.in" + ], + "doc/man1/openssl-dhparam.pod" => [ + "doc/man1/openssl-dhparam.pod.in" + ], + "doc/man1/openssl-dsa.pod" => [ + "doc/man1/openssl-dsa.pod.in" + ], + "doc/man1/openssl-dsaparam.pod" => [ + "doc/man1/openssl-dsaparam.pod.in" + ], + "doc/man1/openssl-ec.pod" => [ + "doc/man1/openssl-ec.pod.in" + ], + "doc/man1/openssl-ecparam.pod" => [ + "doc/man1/openssl-ecparam.pod.in" + ], + "doc/man1/openssl-enc.pod" => [ + "doc/man1/openssl-enc.pod.in" + ], + "doc/man1/openssl-engine.pod" => [ + "doc/man1/openssl-engine.pod.in" + ], + "doc/man1/openssl-errstr.pod" => [ + "doc/man1/openssl-errstr.pod.in" + ], + "doc/man1/openssl-fipsinstall.pod" => [ + "doc/man1/openssl-fipsinstall.pod.in" + ], + "doc/man1/openssl-gendsa.pod" => [ + "doc/man1/openssl-gendsa.pod.in" + ], + "doc/man1/openssl-genpkey.pod" => [ + "doc/man1/openssl-genpkey.pod.in" + ], + "doc/man1/openssl-genrsa.pod" => [ + "doc/man1/openssl-genrsa.pod.in" + ], + "doc/man1/openssl-info.pod" => [ + "doc/man1/openssl-info.pod.in" + ], + "doc/man1/openssl-kdf.pod" => [ + "doc/man1/openssl-kdf.pod.in" + ], + "doc/man1/openssl-list.pod" => [ + "doc/man1/openssl-list.pod.in" + ], + "doc/man1/openssl-mac.pod" => [ + "doc/man1/openssl-mac.pod.in" + ], + "doc/man1/openssl-nseq.pod" => [ + "doc/man1/openssl-nseq.pod.in" + ], + "doc/man1/openssl-ocsp.pod" => [ + "doc/man1/openssl-ocsp.pod.in" + ], + "doc/man1/openssl-passwd.pod" => [ + "doc/man1/openssl-passwd.pod.in" + ], + "doc/man1/openssl-pkcs12.pod" => [ + "doc/man1/openssl-pkcs12.pod.in" + ], + "doc/man1/openssl-pkcs7.pod" => [ + "doc/man1/openssl-pkcs7.pod.in" + ], + "doc/man1/openssl-pkcs8.pod" => [ + "doc/man1/openssl-pkcs8.pod.in" + ], + "doc/man1/openssl-pkey.pod" => [ + "doc/man1/openssl-pkey.pod.in" + ], + "doc/man1/openssl-pkeyparam.pod" => [ + "doc/man1/openssl-pkeyparam.pod.in" + ], + "doc/man1/openssl-pkeyutl.pod" => [ + "doc/man1/openssl-pkeyutl.pod.in" + ], + "doc/man1/openssl-prime.pod" => [ + "doc/man1/openssl-prime.pod.in" + ], + "doc/man1/openssl-rand.pod" => [ + "doc/man1/openssl-rand.pod.in" + ], + "doc/man1/openssl-rehash.pod" => [ + "doc/man1/openssl-rehash.pod.in" + ], + "doc/man1/openssl-req.pod" => [ + "doc/man1/openssl-req.pod.in" + ], + "doc/man1/openssl-rsa.pod" => [ + "doc/man1/openssl-rsa.pod.in" + ], + "doc/man1/openssl-rsautl.pod" => [ + "doc/man1/openssl-rsautl.pod.in" + ], + "doc/man1/openssl-s_client.pod" => [ + "doc/man1/openssl-s_client.pod.in" + ], + "doc/man1/openssl-s_server.pod" => [ + "doc/man1/openssl-s_server.pod.in" + ], + "doc/man1/openssl-s_time.pod" => [ + "doc/man1/openssl-s_time.pod.in" + ], + "doc/man1/openssl-sess_id.pod" => [ + "doc/man1/openssl-sess_id.pod.in" + ], + "doc/man1/openssl-skeyutl.pod" => [ + "doc/man1/openssl-skeyutl.pod.in" + ], + "doc/man1/openssl-smime.pod" => [ + "doc/man1/openssl-smime.pod.in" + ], + "doc/man1/openssl-speed.pod" => [ + "doc/man1/openssl-speed.pod.in" + ], + "doc/man1/openssl-spkac.pod" => [ + "doc/man1/openssl-spkac.pod.in" + ], + "doc/man1/openssl-srp.pod" => [ + "doc/man1/openssl-srp.pod.in" + ], + "doc/man1/openssl-storeutl.pod" => [ + "doc/man1/openssl-storeutl.pod.in" + ], + "doc/man1/openssl-ts.pod" => [ + "doc/man1/openssl-ts.pod.in" + ], + "doc/man1/openssl-verify.pod" => [ + "doc/man1/openssl-verify.pod.in" + ], + "doc/man1/openssl-version.pod" => [ + "doc/man1/openssl-version.pod.in" + ], + "doc/man1/openssl-x509.pod" => [ + "doc/man1/openssl-x509.pod.in" + ], + "doc/man7/openssl_user_macros.pod" => [ + "doc/man7/openssl_user_macros.pod.in" + ], + "engines/e_padlock-x86.S" => [ + "engines/asm/e_padlock-x86.pl" + ], + "engines/e_padlock-x86_64.s" => [ + "engines/asm/e_padlock-x86_64.pl" + ], + "exporters/OpenSSLConfig.cmake" => [ + "exporters/cmake/OpenSSLConfig.cmake.in" + ], + "exporters/OpenSSLConfigVersion.cmake" => [ + "exporters/cmake/OpenSSLConfigVersion.cmake.in" + ], + "exporters/libcrypto.pc" => [ + "exporters/pkg-config/libcrypto.pc.in" + ], + "exporters/libssl.pc" => [ + "exporters/pkg-config/libssl.pc.in" + ], + "exporters/openssl.pc" => [ + "exporters/pkg-config/openssl.pc.in" + ], + "include/crypto/bn_conf.h" => [ + "include/crypto/bn_conf.h.in" + ], + "include/crypto/dso_conf.h" => [ + "include/crypto/dso_conf.h.in" + ], + "include/internal/param_names.h" => [ + "include/internal/param_names.h.in" + ], + "include/openssl/asn1.h" => [ + "include/openssl/asn1.h.in" + ], + "include/openssl/asn1t.h" => [ + "include/openssl/asn1t.h.in" + ], + "include/openssl/bio.h" => [ + "include/openssl/bio.h.in" + ], + "include/openssl/cmp.h" => [ + "include/openssl/cmp.h.in" + ], + "include/openssl/cms.h" => [ + "include/openssl/cms.h.in" + ], + "include/openssl/comp.h" => [ + "include/openssl/comp.h.in" + ], + "include/openssl/conf.h" => [ + "include/openssl/conf.h.in" + ], + "include/openssl/configuration.h" => [ + "include/openssl/configuration.h.in" + ], + "include/openssl/core_names.h" => [ + "include/openssl/core_names.h.in" + ], + "include/openssl/crmf.h" => [ + "include/openssl/crmf.h.in" + ], + "include/openssl/crypto.h" => [ + "include/openssl/crypto.h.in" + ], + "include/openssl/ct.h" => [ + "include/openssl/ct.h.in" + ], + "include/openssl/err.h" => [ + "include/openssl/err.h.in" + ], + "include/openssl/ess.h" => [ + "include/openssl/ess.h.in" + ], + "include/openssl/fipskey.h" => [ + "include/openssl/fipskey.h.in" + ], + "include/openssl/lhash.h" => [ + "include/openssl/lhash.h.in" + ], + "include/openssl/ocsp.h" => [ + "include/openssl/ocsp.h.in" + ], + "include/openssl/opensslv.h" => [ + "include/openssl/opensslv.h.in" + ], + "include/openssl/pkcs12.h" => [ + "include/openssl/pkcs12.h.in" + ], + "include/openssl/pkcs7.h" => [ + "include/openssl/pkcs7.h.in" + ], + "include/openssl/safestack.h" => [ + "include/openssl/safestack.h.in" + ], + "include/openssl/srp.h" => [ + "include/openssl/srp.h.in" + ], + "include/openssl/ssl.h" => [ + "include/openssl/ssl.h.in" + ], + "include/openssl/ui.h" => [ + "include/openssl/ui.h.in" + ], + "include/openssl/x509.h" => [ + "include/openssl/x509.h.in" + ], + "include/openssl/x509_acert.h" => [ + "include/openssl/x509_acert.h.in" + ], + "include/openssl/x509_vfy.h" => [ + "include/openssl/x509_vfy.h.in" + ], + "include/openssl/x509v3.h" => [ + "include/openssl/x509v3.h.in" + ], + "installdata.pm" => [ + "util/mkinstallvars.pl", + "\"PREFIX=\$(INSTALLTOP)\"", + "BINDIR=bin", + "\"LIBDIR=\$(LIBDIR)\"", + "\"libdir=\$(libdir)\"", + "INCLUDEDIR=include", + "APPLINKDIR=include/openssl", + "\"ENGINESDIR=\$(ENGINESDIR)\"", + "\"MODULESDIR=\$(MODULESDIR)\"", + "\"PKGCONFIGDIR=\$(PKGCONFIGDIR)\"", + "\"CMAKECONFIGDIR=\$(CMAKECONFIGDIR)\"", + "\"LDLIBS=\$(LIB_EX_LIBS)\"", + "\"VERSION=\$(VERSION)\"" + ], + "libcrypto.ld" => [ + "util/libcrypto.num", + "libcrypto" + ], + "libcrypto.pc" => [ + "exporters/pkg-config/libcrypto.pc.in" + ], + "libssl.ld" => [ + "util/libssl.num", + "libssl" + ], + "libssl.pc" => [ + "exporters/pkg-config/libssl.pc.in" + ], + "openssl.pc" => [ + "exporters/pkg-config/openssl.pc.in" + ], + "providers/common/der/der_digests_gen.c" => [ + "providers/common/der/der_digests_gen.c.in" + ], + "providers/common/der/der_dsa_gen.c" => [ + "providers/common/der/der_dsa_gen.c.in" + ], + "providers/common/der/der_ec_gen.c" => [ + "providers/common/der/der_ec_gen.c.in" + ], + "providers/common/der/der_ecx_gen.c" => [ + "providers/common/der/der_ecx_gen.c.in" + ], + "providers/common/der/der_ml_dsa_gen.c" => [ + "providers/common/der/der_ml_dsa_gen.c.in" + ], + "providers/common/der/der_rsa_gen.c" => [ + "providers/common/der/der_rsa_gen.c.in" + ], + "providers/common/der/der_slh_dsa_gen.c" => [ + "providers/common/der/der_slh_dsa_gen.c.in" + ], + "providers/common/der/der_sm2_gen.c" => [ + "providers/common/der/der_sm2_gen.c.in" + ], + "providers/common/der/der_wrap_gen.c" => [ + "providers/common/der/der_wrap_gen.c.in" + ], + "providers/common/include/prov/der_digests.h" => [ + "providers/common/include/prov/der_digests.h.in" + ], + "providers/common/include/prov/der_dsa.h" => [ + "providers/common/include/prov/der_dsa.h.in" + ], + "providers/common/include/prov/der_ec.h" => [ + "providers/common/include/prov/der_ec.h.in" + ], + "providers/common/include/prov/der_ecx.h" => [ + "providers/common/include/prov/der_ecx.h.in" + ], + "providers/common/include/prov/der_ml_dsa.h" => [ + "providers/common/include/prov/der_ml_dsa.h.in" + ], + "providers/common/include/prov/der_rsa.h" => [ + "providers/common/include/prov/der_rsa.h.in" + ], + "providers/common/include/prov/der_slh_dsa.h" => [ + "providers/common/include/prov/der_slh_dsa.h.in" + ], + "providers/common/include/prov/der_sm2.h" => [ + "providers/common/include/prov/der_sm2.h.in" + ], + "providers/common/include/prov/der_wrap.h" => [ + "providers/common/include/prov/der_wrap.h.in" + ], + "providers/fips.ld" => [ + "util/providers.num" + ], + "providers/fipsmodule.cnf" => [ + "util/mk-fipsmodule-cnf.pl", + "-module", + "\$(FIPSMODULE)", + "-section_name", + "fips_sect", + "-key", + "\$(FIPSKEY)" + ], + "providers/legacy.ld" => [ + "util/providers.num" + ] + }, + "htmldocs" => { + "man1" => [ + "doc/html/man1/CA.pl.html", + "doc/html/man1/openssl-asn1parse.html", + "doc/html/man1/openssl-ca.html", + "doc/html/man1/openssl-ciphers.html", + "doc/html/man1/openssl-cmds.html", + "doc/html/man1/openssl-cmp.html", + "doc/html/man1/openssl-cms.html", + "doc/html/man1/openssl-crl.html", + "doc/html/man1/openssl-crl2pkcs7.html", + "doc/html/man1/openssl-dgst.html", + "doc/html/man1/openssl-dhparam.html", + "doc/html/man1/openssl-dsa.html", + "doc/html/man1/openssl-dsaparam.html", + "doc/html/man1/openssl-ec.html", + "doc/html/man1/openssl-ecparam.html", + "doc/html/man1/openssl-enc.html", + "doc/html/man1/openssl-engine.html", + "doc/html/man1/openssl-errstr.html", + "doc/html/man1/openssl-fipsinstall.html", + "doc/html/man1/openssl-format-options.html", + "doc/html/man1/openssl-gendsa.html", + "doc/html/man1/openssl-genpkey.html", + "doc/html/man1/openssl-genrsa.html", + "doc/html/man1/openssl-info.html", + "doc/html/man1/openssl-kdf.html", + "doc/html/man1/openssl-list.html", + "doc/html/man1/openssl-mac.html", + "doc/html/man1/openssl-namedisplay-options.html", + "doc/html/man1/openssl-nseq.html", + "doc/html/man1/openssl-ocsp.html", + "doc/html/man1/openssl-passphrase-options.html", + "doc/html/man1/openssl-passwd.html", + "doc/html/man1/openssl-pkcs12.html", + "doc/html/man1/openssl-pkcs7.html", + "doc/html/man1/openssl-pkcs8.html", + "doc/html/man1/openssl-pkey.html", + "doc/html/man1/openssl-pkeyparam.html", + "doc/html/man1/openssl-pkeyutl.html", + "doc/html/man1/openssl-prime.html", + "doc/html/man1/openssl-rand.html", + "doc/html/man1/openssl-rehash.html", + "doc/html/man1/openssl-req.html", + "doc/html/man1/openssl-rsa.html", + "doc/html/man1/openssl-rsautl.html", + "doc/html/man1/openssl-s_client.html", + "doc/html/man1/openssl-s_server.html", + "doc/html/man1/openssl-s_time.html", + "doc/html/man1/openssl-sess_id.html", + "doc/html/man1/openssl-skeyutl.html", + "doc/html/man1/openssl-smime.html", + "doc/html/man1/openssl-speed.html", + "doc/html/man1/openssl-spkac.html", + "doc/html/man1/openssl-srp.html", + "doc/html/man1/openssl-storeutl.html", + "doc/html/man1/openssl-ts.html", + "doc/html/man1/openssl-verification-options.html", + "doc/html/man1/openssl-verify.html", + "doc/html/man1/openssl-version.html", + "doc/html/man1/openssl-x509.html", + "doc/html/man1/openssl.html", + "doc/html/man1/tsget.html" + ], + "man3" => [ + "doc/html/man3/ADMISSIONS.html", + "doc/html/man3/ASN1_EXTERN_FUNCS.html", + "doc/html/man3/ASN1_INTEGER_get_int64.html", + "doc/html/man3/ASN1_INTEGER_new.html", + "doc/html/man3/ASN1_ITEM_lookup.html", + "doc/html/man3/ASN1_OBJECT_new.html", + "doc/html/man3/ASN1_STRING_TABLE_add.html", + "doc/html/man3/ASN1_STRING_length.html", + "doc/html/man3/ASN1_STRING_new.html", + "doc/html/man3/ASN1_STRING_print_ex.html", + "doc/html/man3/ASN1_TIME_set.html", + "doc/html/man3/ASN1_TYPE_get.html", + "doc/html/man3/ASN1_aux_cb.html", + "doc/html/man3/ASN1_generate_nconf.html", + "doc/html/man3/ASN1_item_d2i_bio.html", + "doc/html/man3/ASN1_item_new.html", + "doc/html/man3/ASN1_item_sign.html", + "doc/html/man3/ASYNC_WAIT_CTX_new.html", + "doc/html/man3/ASYNC_start_job.html", + "doc/html/man3/BF_encrypt.html", + "doc/html/man3/BIO_ADDR.html", + "doc/html/man3/BIO_ADDRINFO.html", + "doc/html/man3/BIO_connect.html", + "doc/html/man3/BIO_ctrl.html", + "doc/html/man3/BIO_f_base64.html", + "doc/html/man3/BIO_f_buffer.html", + "doc/html/man3/BIO_f_cipher.html", + "doc/html/man3/BIO_f_md.html", + "doc/html/man3/BIO_f_null.html", + "doc/html/man3/BIO_f_prefix.html", + "doc/html/man3/BIO_f_readbuffer.html", + "doc/html/man3/BIO_f_ssl.html", + "doc/html/man3/BIO_find_type.html", + "doc/html/man3/BIO_get_data.html", + "doc/html/man3/BIO_get_ex_new_index.html", + "doc/html/man3/BIO_get_rpoll_descriptor.html", + "doc/html/man3/BIO_meth_new.html", + "doc/html/man3/BIO_new.html", + "doc/html/man3/BIO_new_CMS.html", + "doc/html/man3/BIO_parse_hostserv.html", + "doc/html/man3/BIO_printf.html", + "doc/html/man3/BIO_push.html", + "doc/html/man3/BIO_read.html", + "doc/html/man3/BIO_s_accept.html", + "doc/html/man3/BIO_s_bio.html", + "doc/html/man3/BIO_s_connect.html", + "doc/html/man3/BIO_s_core.html", + "doc/html/man3/BIO_s_datagram.html", + "doc/html/man3/BIO_s_dgram_pair.html", + "doc/html/man3/BIO_s_fd.html", + "doc/html/man3/BIO_s_file.html", + "doc/html/man3/BIO_s_mem.html", + "doc/html/man3/BIO_s_null.html", + "doc/html/man3/BIO_s_socket.html", + "doc/html/man3/BIO_sendmmsg.html", + "doc/html/man3/BIO_set_callback.html", + "doc/html/man3/BIO_set_flags.html", + "doc/html/man3/BIO_should_retry.html", + "doc/html/man3/BIO_socket_wait.html", + "doc/html/man3/BN_BLINDING_new.html", + "doc/html/man3/BN_CTX_new.html", + "doc/html/man3/BN_CTX_start.html", + "doc/html/man3/BN_add.html", + "doc/html/man3/BN_add_word.html", + "doc/html/man3/BN_bn2bin.html", + "doc/html/man3/BN_cmp.html", + "doc/html/man3/BN_copy.html", + "doc/html/man3/BN_generate_prime.html", + "doc/html/man3/BN_mod_exp_mont.html", + "doc/html/man3/BN_mod_inverse.html", + "doc/html/man3/BN_mod_mul_montgomery.html", + "doc/html/man3/BN_mod_mul_reciprocal.html", + "doc/html/man3/BN_new.html", + "doc/html/man3/BN_num_bytes.html", + "doc/html/man3/BN_rand.html", + "doc/html/man3/BN_security_bits.html", + "doc/html/man3/BN_set_bit.html", + "doc/html/man3/BN_swap.html", + "doc/html/man3/BN_zero.html", + "doc/html/man3/BUF_MEM_new.html", + "doc/html/man3/CMAC_CTX.html", + "doc/html/man3/CMS_EncryptedData_decrypt.html", + "doc/html/man3/CMS_EncryptedData_encrypt.html", + "doc/html/man3/CMS_EncryptedData_set1_key.html", + "doc/html/man3/CMS_EnvelopedData_create.html", + "doc/html/man3/CMS_add0_cert.html", + "doc/html/man3/CMS_add1_recipient_cert.html", + "doc/html/man3/CMS_add1_signer.html", + "doc/html/man3/CMS_compress.html", + "doc/html/man3/CMS_data_create.html", + "doc/html/man3/CMS_decrypt.html", + "doc/html/man3/CMS_digest_create.html", + "doc/html/man3/CMS_encrypt.html", + "doc/html/man3/CMS_final.html", + "doc/html/man3/CMS_get0_RecipientInfos.html", + "doc/html/man3/CMS_get0_SignerInfos.html", + "doc/html/man3/CMS_get0_type.html", + "doc/html/man3/CMS_get1_ReceiptRequest.html", + "doc/html/man3/CMS_sign.html", + "doc/html/man3/CMS_sign_receipt.html", + "doc/html/man3/CMS_signed_get_attr.html", + "doc/html/man3/CMS_uncompress.html", + "doc/html/man3/CMS_verify.html", + "doc/html/man3/CMS_verify_receipt.html", + "doc/html/man3/COMP_CTX_new.html", + "doc/html/man3/CONF_modules_free.html", + "doc/html/man3/CONF_modules_load_file.html", + "doc/html/man3/CRYPTO_THREAD_run_once.html", + "doc/html/man3/CRYPTO_get_ex_new_index.html", + "doc/html/man3/CRYPTO_memcmp.html", + "doc/html/man3/CTLOG_STORE_get0_log_by_id.html", + "doc/html/man3/CTLOG_STORE_new.html", + "doc/html/man3/CTLOG_new.html", + "doc/html/man3/CT_POLICY_EVAL_CTX_new.html", + "doc/html/man3/DEFINE_STACK_OF.html", + "doc/html/man3/DES_random_key.html", + "doc/html/man3/DH_generate_key.html", + "doc/html/man3/DH_generate_parameters.html", + "doc/html/man3/DH_get0_pqg.html", + "doc/html/man3/DH_get_1024_160.html", + "doc/html/man3/DH_meth_new.html", + "doc/html/man3/DH_new.html", + "doc/html/man3/DH_new_by_nid.html", + "doc/html/man3/DH_set_method.html", + "doc/html/man3/DH_size.html", + "doc/html/man3/DSA_SIG_new.html", + "doc/html/man3/DSA_do_sign.html", + "doc/html/man3/DSA_dup_DH.html", + "doc/html/man3/DSA_generate_key.html", + "doc/html/man3/DSA_generate_parameters.html", + "doc/html/man3/DSA_get0_pqg.html", + "doc/html/man3/DSA_meth_new.html", + "doc/html/man3/DSA_new.html", + "doc/html/man3/DSA_set_method.html", + "doc/html/man3/DSA_sign.html", + "doc/html/man3/DSA_size.html", + "doc/html/man3/DTLS_get_data_mtu.html", + "doc/html/man3/DTLS_set_timer_cb.html", + "doc/html/man3/DTLSv1_get_timeout.html", + "doc/html/man3/DTLSv1_handle_timeout.html", + "doc/html/man3/DTLSv1_listen.html", + "doc/html/man3/ECDSA_SIG_new.html", + "doc/html/man3/ECDSA_sign.html", + "doc/html/man3/ECPKParameters_print.html", + "doc/html/man3/EC_GFp_simple_method.html", + "doc/html/man3/EC_GROUP_copy.html", + "doc/html/man3/EC_GROUP_new.html", + "doc/html/man3/EC_KEY_get_enc_flags.html", + "doc/html/man3/EC_KEY_new.html", + "doc/html/man3/EC_POINT_add.html", + "doc/html/man3/EC_POINT_new.html", + "doc/html/man3/ENGINE_add.html", + "doc/html/man3/ERR_GET_LIB.html", + "doc/html/man3/ERR_clear_error.html", + "doc/html/man3/ERR_error_string.html", + "doc/html/man3/ERR_get_error.html", + "doc/html/man3/ERR_load_crypto_strings.html", + "doc/html/man3/ERR_load_strings.html", + "doc/html/man3/ERR_new.html", + "doc/html/man3/ERR_print_errors.html", + "doc/html/man3/ERR_put_error.html", + "doc/html/man3/ERR_remove_state.html", + "doc/html/man3/ERR_set_mark.html", + "doc/html/man3/EVP_ASYM_CIPHER_free.html", + "doc/html/man3/EVP_BytesToKey.html", + "doc/html/man3/EVP_CIPHER_CTX_get_app_data.html", + "doc/html/man3/EVP_CIPHER_CTX_get_cipher_data.html", + "doc/html/man3/EVP_CIPHER_CTX_get_original_iv.html", + "doc/html/man3/EVP_CIPHER_meth_new.html", + "doc/html/man3/EVP_DigestInit.html", + "doc/html/man3/EVP_DigestSignInit.html", + "doc/html/man3/EVP_DigestVerifyInit.html", + "doc/html/man3/EVP_EncodeInit.html", + "doc/html/man3/EVP_EncryptInit.html", + "doc/html/man3/EVP_KDF.html", + "doc/html/man3/EVP_KEM_free.html", + "doc/html/man3/EVP_KEYEXCH_free.html", + "doc/html/man3/EVP_KEYMGMT.html", + "doc/html/man3/EVP_MAC.html", + "doc/html/man3/EVP_MD_meth_new.html", + "doc/html/man3/EVP_OpenInit.html", + "doc/html/man3/EVP_PBE_CipherInit.html", + "doc/html/man3/EVP_PKEY2PKCS8.html", + "doc/html/man3/EVP_PKEY_ASN1_METHOD.html", + "doc/html/man3/EVP_PKEY_CTX_ctrl.html", + "doc/html/man3/EVP_PKEY_CTX_get0_libctx.html", + "doc/html/man3/EVP_PKEY_CTX_get0_pkey.html", + "doc/html/man3/EVP_PKEY_CTX_get_algor.html", + "doc/html/man3/EVP_PKEY_CTX_new.html", + "doc/html/man3/EVP_PKEY_CTX_set1_pbe_pass.html", + "doc/html/man3/EVP_PKEY_CTX_set_hkdf_md.html", + "doc/html/man3/EVP_PKEY_CTX_set_params.html", + "doc/html/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.html", + "doc/html/man3/EVP_PKEY_CTX_set_scrypt_N.html", + "doc/html/man3/EVP_PKEY_CTX_set_tls1_prf_md.html", + "doc/html/man3/EVP_PKEY_asn1_get_count.html", + "doc/html/man3/EVP_PKEY_check.html", + "doc/html/man3/EVP_PKEY_copy_parameters.html", + "doc/html/man3/EVP_PKEY_decapsulate.html", + "doc/html/man3/EVP_PKEY_decrypt.html", + "doc/html/man3/EVP_PKEY_derive.html", + "doc/html/man3/EVP_PKEY_digestsign_supports_digest.html", + "doc/html/man3/EVP_PKEY_encapsulate.html", + "doc/html/man3/EVP_PKEY_encrypt.html", + "doc/html/man3/EVP_PKEY_fromdata.html", + "doc/html/man3/EVP_PKEY_get_attr.html", + "doc/html/man3/EVP_PKEY_get_default_digest_nid.html", + "doc/html/man3/EVP_PKEY_get_field_type.html", + "doc/html/man3/EVP_PKEY_get_group_name.html", + "doc/html/man3/EVP_PKEY_get_size.html", + "doc/html/man3/EVP_PKEY_gettable_params.html", + "doc/html/man3/EVP_PKEY_is_a.html", + "doc/html/man3/EVP_PKEY_keygen.html", + "doc/html/man3/EVP_PKEY_meth_get_count.html", + "doc/html/man3/EVP_PKEY_meth_new.html", + "doc/html/man3/EVP_PKEY_new.html", + "doc/html/man3/EVP_PKEY_print_private.html", + "doc/html/man3/EVP_PKEY_set1_RSA.html", + "doc/html/man3/EVP_PKEY_set1_encoded_public_key.html", + "doc/html/man3/EVP_PKEY_set_type.html", + "doc/html/man3/EVP_PKEY_settable_params.html", + "doc/html/man3/EVP_PKEY_sign.html", + "doc/html/man3/EVP_PKEY_todata.html", + "doc/html/man3/EVP_PKEY_verify.html", + "doc/html/man3/EVP_PKEY_verify_recover.html", + "doc/html/man3/EVP_RAND.html", + "doc/html/man3/EVP_SIGNATURE.html", + "doc/html/man3/EVP_SKEY.html", + "doc/html/man3/EVP_SKEYMGMT.html", + "doc/html/man3/EVP_SealInit.html", + "doc/html/man3/EVP_SignInit.html", + "doc/html/man3/EVP_VerifyInit.html", + "doc/html/man3/EVP_aes_128_gcm.html", + "doc/html/man3/EVP_aria_128_gcm.html", + "doc/html/man3/EVP_bf_cbc.html", + "doc/html/man3/EVP_blake2b512.html", + "doc/html/man3/EVP_camellia_128_ecb.html", + "doc/html/man3/EVP_cast5_cbc.html", + "doc/html/man3/EVP_chacha20.html", + "doc/html/man3/EVP_des_cbc.html", + "doc/html/man3/EVP_desx_cbc.html", + "doc/html/man3/EVP_idea_cbc.html", + "doc/html/man3/EVP_md2.html", + "doc/html/man3/EVP_md4.html", + "doc/html/man3/EVP_md5.html", + "doc/html/man3/EVP_mdc2.html", + "doc/html/man3/EVP_rc2_cbc.html", + "doc/html/man3/EVP_rc4.html", + "doc/html/man3/EVP_rc5_32_12_16_cbc.html", + "doc/html/man3/EVP_ripemd160.html", + "doc/html/man3/EVP_seed_cbc.html", + "doc/html/man3/EVP_set_default_properties.html", + "doc/html/man3/EVP_sha1.html", + "doc/html/man3/EVP_sha224.html", + "doc/html/man3/EVP_sha3_224.html", + "doc/html/man3/EVP_sm3.html", + "doc/html/man3/EVP_sm4_cbc.html", + "doc/html/man3/EVP_whirlpool.html", + "doc/html/man3/GENERAL_NAME.html", + "doc/html/man3/HMAC.html", + "doc/html/man3/MD5.html", + "doc/html/man3/MDC2_Init.html", + "doc/html/man3/NCONF_new_ex.html", + "doc/html/man3/OBJ_nid2obj.html", + "doc/html/man3/OCSP_REQUEST_new.html", + "doc/html/man3/OCSP_cert_to_id.html", + "doc/html/man3/OCSP_request_add1_nonce.html", + "doc/html/man3/OCSP_resp_find_status.html", + "doc/html/man3/OCSP_response_status.html", + "doc/html/man3/OCSP_sendreq_new.html", + "doc/html/man3/OPENSSL_Applink.html", + "doc/html/man3/OPENSSL_FILE.html", + "doc/html/man3/OPENSSL_LH_COMPFUNC.html", + "doc/html/man3/OPENSSL_LH_stats.html", + "doc/html/man3/OPENSSL_config.html", + "doc/html/man3/OPENSSL_fork_prepare.html", + "doc/html/man3/OPENSSL_gmtime.html", + "doc/html/man3/OPENSSL_hexchar2int.html", + "doc/html/man3/OPENSSL_ia32cap.html", + "doc/html/man3/OPENSSL_init_crypto.html", + "doc/html/man3/OPENSSL_init_ssl.html", + "doc/html/man3/OPENSSL_instrument_bus.html", + "doc/html/man3/OPENSSL_load_builtin_modules.html", + "doc/html/man3/OPENSSL_load_u16_le.html", + "doc/html/man3/OPENSSL_malloc.html", + "doc/html/man3/OPENSSL_ppccap.html", + "doc/html/man3/OPENSSL_riscvcap.html", + "doc/html/man3/OPENSSL_s390xcap.html", + "doc/html/man3/OPENSSL_secure_malloc.html", + "doc/html/man3/OPENSSL_strcasecmp.html", + "doc/html/man3/OSSL_ALGORITHM.html", + "doc/html/man3/OSSL_CALLBACK.html", + "doc/html/man3/OSSL_CMP_ATAV_set0.html", + "doc/html/man3/OSSL_CMP_CTX_new.html", + "doc/html/man3/OSSL_CMP_HDR_get0_transactionID.html", + "doc/html/man3/OSSL_CMP_ITAV_new_caCerts.html", + "doc/html/man3/OSSL_CMP_ITAV_set0.html", + "doc/html/man3/OSSL_CMP_MSG_get0_header.html", + "doc/html/man3/OSSL_CMP_MSG_http_perform.html", + "doc/html/man3/OSSL_CMP_SRV_CTX_new.html", + "doc/html/man3/OSSL_CMP_STATUSINFO_new.html", + "doc/html/man3/OSSL_CMP_exec_certreq.html", + "doc/html/man3/OSSL_CMP_log_open.html", + "doc/html/man3/OSSL_CMP_validate_msg.html", + "doc/html/man3/OSSL_CORE_MAKE_FUNC.html", + "doc/html/man3/OSSL_CRMF_MSG_get0_tmpl.html", + "doc/html/man3/OSSL_CRMF_MSG_set0_validity.html", + "doc/html/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.html", + "doc/html/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.html", + "doc/html/man3/OSSL_CRMF_pbmp_new.html", + "doc/html/man3/OSSL_DECODER.html", + "doc/html/man3/OSSL_DECODER_CTX.html", + "doc/html/man3/OSSL_DECODER_CTX_new_for_pkey.html", + "doc/html/man3/OSSL_DECODER_from_bio.html", + "doc/html/man3/OSSL_DISPATCH.html", + "doc/html/man3/OSSL_ENCODER.html", + "doc/html/man3/OSSL_ENCODER_CTX.html", + "doc/html/man3/OSSL_ENCODER_CTX_new_for_pkey.html", + "doc/html/man3/OSSL_ENCODER_to_bio.html", + "doc/html/man3/OSSL_ERR_STATE_save.html", + "doc/html/man3/OSSL_ESS_check_signing_certs.html", + "doc/html/man3/OSSL_GENERAL_NAMES_print.html", + "doc/html/man3/OSSL_HPKE_CTX_new.html", + "doc/html/man3/OSSL_HTTP_REQ_CTX.html", + "doc/html/man3/OSSL_HTTP_parse_url.html", + "doc/html/man3/OSSL_HTTP_transfer.html", + "doc/html/man3/OSSL_IETF_ATTR_SYNTAX.html", + "doc/html/man3/OSSL_IETF_ATTR_SYNTAX_print.html", + "doc/html/man3/OSSL_INDICATOR_set_callback.html", + "doc/html/man3/OSSL_ITEM.html", + "doc/html/man3/OSSL_LIB_CTX.html", + "doc/html/man3/OSSL_LIB_CTX_set_conf_diagnostics.html", + "doc/html/man3/OSSL_PARAM.html", + "doc/html/man3/OSSL_PARAM_BLD.html", + "doc/html/man3/OSSL_PARAM_allocate_from_text.html", + "doc/html/man3/OSSL_PARAM_dup.html", + "doc/html/man3/OSSL_PARAM_int.html", + "doc/html/man3/OSSL_PARAM_print_to_bio.html", + "doc/html/man3/OSSL_PROVIDER.html", + "doc/html/man3/OSSL_QUIC_client_method.html", + "doc/html/man3/OSSL_SELF_TEST_new.html", + "doc/html/man3/OSSL_SELF_TEST_set_callback.html", + "doc/html/man3/OSSL_STORE_INFO.html", + "doc/html/man3/OSSL_STORE_LOADER.html", + "doc/html/man3/OSSL_STORE_SEARCH.html", + "doc/html/man3/OSSL_STORE_attach.html", + "doc/html/man3/OSSL_STORE_expect.html", + "doc/html/man3/OSSL_STORE_open.html", + "doc/html/man3/OSSL_sleep.html", + "doc/html/man3/OSSL_trace_enabled.html", + "doc/html/man3/OSSL_trace_get_category_num.html", + "doc/html/man3/OSSL_trace_set_channel.html", + "doc/html/man3/OpenSSL_add_all_algorithms.html", + "doc/html/man3/OpenSSL_version.html", + "doc/html/man3/PBMAC1_get1_pbkdf2_param.html", + "doc/html/man3/PEM_X509_INFO_read_bio_ex.html", + "doc/html/man3/PEM_bytes_read_bio.html", + "doc/html/man3/PEM_read.html", + "doc/html/man3/PEM_read_CMS.html", + "doc/html/man3/PEM_read_bio_PrivateKey.html", + "doc/html/man3/PEM_read_bio_ex.html", + "doc/html/man3/PEM_write_bio_CMS_stream.html", + "doc/html/man3/PEM_write_bio_PKCS7_stream.html", + "doc/html/man3/PKCS12_PBE_keyivgen.html", + "doc/html/man3/PKCS12_SAFEBAG_create_cert.html", + "doc/html/man3/PKCS12_SAFEBAG_get0_attrs.html", + "doc/html/man3/PKCS12_SAFEBAG_get1_cert.html", + "doc/html/man3/PKCS12_SAFEBAG_set0_attrs.html", + "doc/html/man3/PKCS12_add1_attr_by_NID.html", + "doc/html/man3/PKCS12_add_CSPName_asc.html", + "doc/html/man3/PKCS12_add_cert.html", + "doc/html/man3/PKCS12_add_friendlyname_asc.html", + "doc/html/man3/PKCS12_add_localkeyid.html", + "doc/html/man3/PKCS12_add_safe.html", + "doc/html/man3/PKCS12_create.html", + "doc/html/man3/PKCS12_decrypt_skey.html", + "doc/html/man3/PKCS12_gen_mac.html", + "doc/html/man3/PKCS12_get_friendlyname.html", + "doc/html/man3/PKCS12_init.html", + "doc/html/man3/PKCS12_item_decrypt_d2i.html", + "doc/html/man3/PKCS12_key_gen_utf8_ex.html", + "doc/html/man3/PKCS12_newpass.html", + "doc/html/man3/PKCS12_pack_p7encdata.html", + "doc/html/man3/PKCS12_parse.html", + "doc/html/man3/PKCS5_PBE_keyivgen.html", + "doc/html/man3/PKCS5_PBKDF2_HMAC.html", + "doc/html/man3/PKCS7_decrypt.html", + "doc/html/man3/PKCS7_encrypt.html", + "doc/html/man3/PKCS7_get_octet_string.html", + "doc/html/man3/PKCS7_sign.html", + "doc/html/man3/PKCS7_sign_add_signer.html", + "doc/html/man3/PKCS7_type_is_other.html", + "doc/html/man3/PKCS7_verify.html", + "doc/html/man3/PKCS8_encrypt.html", + "doc/html/man3/PKCS8_pkey_add1_attr.html", + "doc/html/man3/RAND_add.html", + "doc/html/man3/RAND_bytes.html", + "doc/html/man3/RAND_cleanup.html", + "doc/html/man3/RAND_egd.html", + "doc/html/man3/RAND_get0_primary.html", + "doc/html/man3/RAND_load_file.html", + "doc/html/man3/RAND_set_DRBG_type.html", + "doc/html/man3/RAND_set_rand_method.html", + "doc/html/man3/RC4_set_key.html", + "doc/html/man3/RIPEMD160_Init.html", + "doc/html/man3/RSA_blinding_on.html", + "doc/html/man3/RSA_check_key.html", + "doc/html/man3/RSA_generate_key.html", + "doc/html/man3/RSA_get0_key.html", + "doc/html/man3/RSA_meth_new.html", + "doc/html/man3/RSA_new.html", + "doc/html/man3/RSA_padding_add_PKCS1_type_1.html", + "doc/html/man3/RSA_print.html", + "doc/html/man3/RSA_private_encrypt.html", + "doc/html/man3/RSA_public_encrypt.html", + "doc/html/man3/RSA_set_method.html", + "doc/html/man3/RSA_sign.html", + "doc/html/man3/RSA_sign_ASN1_OCTET_STRING.html", + "doc/html/man3/RSA_size.html", + "doc/html/man3/SCT_new.html", + "doc/html/man3/SCT_print.html", + "doc/html/man3/SCT_validate.html", + "doc/html/man3/SHA256_Init.html", + "doc/html/man3/SMIME_read_ASN1.html", + "doc/html/man3/SMIME_read_CMS.html", + "doc/html/man3/SMIME_read_PKCS7.html", + "doc/html/man3/SMIME_write_ASN1.html", + "doc/html/man3/SMIME_write_CMS.html", + "doc/html/man3/SMIME_write_PKCS7.html", + "doc/html/man3/SRP_Calc_B.html", + "doc/html/man3/SRP_VBASE_new.html", + "doc/html/man3/SRP_create_verifier.html", + "doc/html/man3/SRP_user_pwd_new.html", + "doc/html/man3/SSL_CIPHER_get_name.html", + "doc/html/man3/SSL_COMP_add_compression_method.html", + "doc/html/man3/SSL_CONF_CTX_new.html", + "doc/html/man3/SSL_CONF_CTX_set1_prefix.html", + "doc/html/man3/SSL_CONF_CTX_set_flags.html", + "doc/html/man3/SSL_CONF_CTX_set_ssl_ctx.html", + "doc/html/man3/SSL_CONF_cmd.html", + "doc/html/man3/SSL_CONF_cmd_argv.html", + "doc/html/man3/SSL_CTX_add1_chain_cert.html", + "doc/html/man3/SSL_CTX_add_extra_chain_cert.html", + "doc/html/man3/SSL_CTX_add_session.html", + "doc/html/man3/SSL_CTX_config.html", + "doc/html/man3/SSL_CTX_ctrl.html", + "doc/html/man3/SSL_CTX_dane_enable.html", + "doc/html/man3/SSL_CTX_flush_sessions.html", + "doc/html/man3/SSL_CTX_free.html", + "doc/html/man3/SSL_CTX_get0_param.html", + "doc/html/man3/SSL_CTX_get_verify_mode.html", + "doc/html/man3/SSL_CTX_has_client_custom_ext.html", + "doc/html/man3/SSL_CTX_load_verify_locations.html", + "doc/html/man3/SSL_CTX_new.html", + "doc/html/man3/SSL_CTX_sess_number.html", + "doc/html/man3/SSL_CTX_sess_set_cache_size.html", + "doc/html/man3/SSL_CTX_sess_set_get_cb.html", + "doc/html/man3/SSL_CTX_sessions.html", + "doc/html/man3/SSL_CTX_set0_CA_list.html", + "doc/html/man3/SSL_CTX_set1_cert_comp_preference.html", + "doc/html/man3/SSL_CTX_set1_curves.html", + "doc/html/man3/SSL_CTX_set1_sigalgs.html", + "doc/html/man3/SSL_CTX_set1_verify_cert_store.html", + "doc/html/man3/SSL_CTX_set_alpn_select_cb.html", + "doc/html/man3/SSL_CTX_set_cert_cb.html", + "doc/html/man3/SSL_CTX_set_cert_store.html", + "doc/html/man3/SSL_CTX_set_cert_verify_callback.html", + "doc/html/man3/SSL_CTX_set_cipher_list.html", + "doc/html/man3/SSL_CTX_set_client_cert_cb.html", + "doc/html/man3/SSL_CTX_set_client_hello_cb.html", + "doc/html/man3/SSL_CTX_set_ct_validation_callback.html", + "doc/html/man3/SSL_CTX_set_ctlog_list_file.html", + "doc/html/man3/SSL_CTX_set_default_passwd_cb.html", + "doc/html/man3/SSL_CTX_set_domain_flags.html", + "doc/html/man3/SSL_CTX_set_generate_session_id.html", + "doc/html/man3/SSL_CTX_set_info_callback.html", + "doc/html/man3/SSL_CTX_set_keylog_callback.html", + "doc/html/man3/SSL_CTX_set_max_cert_list.html", + "doc/html/man3/SSL_CTX_set_min_proto_version.html", + "doc/html/man3/SSL_CTX_set_mode.html", + "doc/html/man3/SSL_CTX_set_msg_callback.html", + "doc/html/man3/SSL_CTX_set_new_pending_conn_cb.html", + "doc/html/man3/SSL_CTX_set_num_tickets.html", + "doc/html/man3/SSL_CTX_set_options.html", + "doc/html/man3/SSL_CTX_set_psk_client_callback.html", + "doc/html/man3/SSL_CTX_set_quiet_shutdown.html", + "doc/html/man3/SSL_CTX_set_read_ahead.html", + "doc/html/man3/SSL_CTX_set_record_padding_callback.html", + "doc/html/man3/SSL_CTX_set_security_level.html", + "doc/html/man3/SSL_CTX_set_session_cache_mode.html", + "doc/html/man3/SSL_CTX_set_session_id_context.html", + "doc/html/man3/SSL_CTX_set_session_ticket_cb.html", + "doc/html/man3/SSL_CTX_set_split_send_fragment.html", + "doc/html/man3/SSL_CTX_set_srp_password.html", + "doc/html/man3/SSL_CTX_set_ssl_version.html", + "doc/html/man3/SSL_CTX_set_stateless_cookie_generate_cb.html", + "doc/html/man3/SSL_CTX_set_timeout.html", + "doc/html/man3/SSL_CTX_set_tlsext_servername_callback.html", + "doc/html/man3/SSL_CTX_set_tlsext_status_cb.html", + "doc/html/man3/SSL_CTX_set_tlsext_ticket_key_cb.html", + "doc/html/man3/SSL_CTX_set_tlsext_use_srtp.html", + "doc/html/man3/SSL_CTX_set_tmp_dh_callback.html", + "doc/html/man3/SSL_CTX_set_tmp_ecdh.html", + "doc/html/man3/SSL_CTX_set_verify.html", + "doc/html/man3/SSL_CTX_use_certificate.html", + "doc/html/man3/SSL_CTX_use_psk_identity_hint.html", + "doc/html/man3/SSL_CTX_use_serverinfo.html", + "doc/html/man3/SSL_SESSION_free.html", + "doc/html/man3/SSL_SESSION_get0_cipher.html", + "doc/html/man3/SSL_SESSION_get0_hostname.html", + "doc/html/man3/SSL_SESSION_get0_id_context.html", + "doc/html/man3/SSL_SESSION_get0_peer.html", + "doc/html/man3/SSL_SESSION_get_compress_id.html", + "doc/html/man3/SSL_SESSION_get_protocol_version.html", + "doc/html/man3/SSL_SESSION_get_time.html", + "doc/html/man3/SSL_SESSION_has_ticket.html", + "doc/html/man3/SSL_SESSION_is_resumable.html", + "doc/html/man3/SSL_SESSION_print.html", + "doc/html/man3/SSL_SESSION_set1_id.html", + "doc/html/man3/SSL_accept.html", + "doc/html/man3/SSL_accept_stream.html", + "doc/html/man3/SSL_alert_type_string.html", + "doc/html/man3/SSL_alloc_buffers.html", + "doc/html/man3/SSL_check_chain.html", + "doc/html/man3/SSL_clear.html", + "doc/html/man3/SSL_connect.html", + "doc/html/man3/SSL_do_handshake.html", + "doc/html/man3/SSL_export_keying_material.html", + "doc/html/man3/SSL_extension_supported.html", + "doc/html/man3/SSL_free.html", + "doc/html/man3/SSL_get0_connection.html", + "doc/html/man3/SSL_get0_group_name.html", + "doc/html/man3/SSL_get0_peer_rpk.html", + "doc/html/man3/SSL_get0_peer_scts.html", + "doc/html/man3/SSL_get1_builtin_sigalgs.html", + "doc/html/man3/SSL_get_SSL_CTX.html", + "doc/html/man3/SSL_get_all_async_fds.html", + "doc/html/man3/SSL_get_certificate.html", + "doc/html/man3/SSL_get_ciphers.html", + "doc/html/man3/SSL_get_client_random.html", + "doc/html/man3/SSL_get_conn_close_info.html", + "doc/html/man3/SSL_get_current_cipher.html", + "doc/html/man3/SSL_get_default_timeout.html", + "doc/html/man3/SSL_get_error.html", + "doc/html/man3/SSL_get_event_timeout.html", + "doc/html/man3/SSL_get_extms_support.html", + "doc/html/man3/SSL_get_fd.html", + "doc/html/man3/SSL_get_handshake_rtt.html", + "doc/html/man3/SSL_get_peer_cert_chain.html", + "doc/html/man3/SSL_get_peer_certificate.html", + "doc/html/man3/SSL_get_peer_signature_nid.html", + "doc/html/man3/SSL_get_peer_tmp_key.html", + "doc/html/man3/SSL_get_psk_identity.html", + "doc/html/man3/SSL_get_rbio.html", + "doc/html/man3/SSL_get_rpoll_descriptor.html", + "doc/html/man3/SSL_get_session.html", + "doc/html/man3/SSL_get_shared_sigalgs.html", + "doc/html/man3/SSL_get_stream_id.html", + "doc/html/man3/SSL_get_stream_read_state.html", + "doc/html/man3/SSL_get_value_uint.html", + "doc/html/man3/SSL_get_verify_result.html", + "doc/html/man3/SSL_get_version.html", + "doc/html/man3/SSL_group_to_name.html", + "doc/html/man3/SSL_handle_events.html", + "doc/html/man3/SSL_in_init.html", + "doc/html/man3/SSL_inject_net_dgram.html", + "doc/html/man3/SSL_key_update.html", + "doc/html/man3/SSL_library_init.html", + "doc/html/man3/SSL_load_client_CA_file.html", + "doc/html/man3/SSL_new.html", + "doc/html/man3/SSL_new_domain.html", + "doc/html/man3/SSL_new_listener.html", + "doc/html/man3/SSL_new_stream.html", + "doc/html/man3/SSL_pending.html", + "doc/html/man3/SSL_poll.html", + "doc/html/man3/SSL_read.html", + "doc/html/man3/SSL_read_early_data.html", + "doc/html/man3/SSL_rstate_string.html", + "doc/html/man3/SSL_session_reused.html", + "doc/html/man3/SSL_set1_host.html", + "doc/html/man3/SSL_set1_initial_peer_addr.html", + "doc/html/man3/SSL_set1_server_cert_type.html", + "doc/html/man3/SSL_set_async_callback.html", + "doc/html/man3/SSL_set_bio.html", + "doc/html/man3/SSL_set_blocking_mode.html", + "doc/html/man3/SSL_set_connect_state.html", + "doc/html/man3/SSL_set_default_stream_mode.html", + "doc/html/man3/SSL_set_fd.html", + "doc/html/man3/SSL_set_incoming_stream_policy.html", + "doc/html/man3/SSL_set_quic_tls_cbs.html", + "doc/html/man3/SSL_set_retry_verify.html", + "doc/html/man3/SSL_set_session.html", + "doc/html/man3/SSL_set_session_secret_cb.html", + "doc/html/man3/SSL_set_shutdown.html", + "doc/html/man3/SSL_set_verify_result.html", + "doc/html/man3/SSL_shutdown.html", + "doc/html/man3/SSL_state_string.html", + "doc/html/man3/SSL_stream_conclude.html", + "doc/html/man3/SSL_stream_reset.html", + "doc/html/man3/SSL_want.html", + "doc/html/man3/SSL_write.html", + "doc/html/man3/TS_RESP_CTX_new.html", + "doc/html/man3/TS_VERIFY_CTX.html", + "doc/html/man3/UI_STRING.html", + "doc/html/man3/UI_UTIL_read_pw.html", + "doc/html/man3/UI_create_method.html", + "doc/html/man3/UI_new.html", + "doc/html/man3/X509V3_EXT_print.html", + "doc/html/man3/X509V3_get_d2i.html", + "doc/html/man3/X509V3_set_ctx.html", + "doc/html/man3/X509_ACERT_add1_attr.html", + "doc/html/man3/X509_ACERT_add_attr_nconf.html", + "doc/html/man3/X509_ACERT_get0_holder_baseCertId.html", + "doc/html/man3/X509_ACERT_get_attr.html", + "doc/html/man3/X509_ACERT_print_ex.html", + "doc/html/man3/X509_ALGOR_dup.html", + "doc/html/man3/X509_ATTRIBUTE.html", + "doc/html/man3/X509_CRL_get0_by_serial.html", + "doc/html/man3/X509_EXTENSION_set_object.html", + "doc/html/man3/X509_LOOKUP.html", + "doc/html/man3/X509_LOOKUP_hash_dir.html", + "doc/html/man3/X509_LOOKUP_meth_new.html", + "doc/html/man3/X509_NAME_ENTRY_get_object.html", + "doc/html/man3/X509_NAME_add_entry_by_txt.html", + "doc/html/man3/X509_NAME_get0_der.html", + "doc/html/man3/X509_NAME_get_index_by_NID.html", + "doc/html/man3/X509_NAME_print_ex.html", + "doc/html/man3/X509_PUBKEY_new.html", + "doc/html/man3/X509_REQ_get_attr.html", + "doc/html/man3/X509_REQ_get_extensions.html", + "doc/html/man3/X509_SIG_get0.html", + "doc/html/man3/X509_STORE_CTX_get_by_subject.html", + "doc/html/man3/X509_STORE_CTX_get_error.html", + "doc/html/man3/X509_STORE_CTX_new.html", + "doc/html/man3/X509_STORE_CTX_set_verify_cb.html", + "doc/html/man3/X509_STORE_add_cert.html", + "doc/html/man3/X509_STORE_get0_param.html", + "doc/html/man3/X509_STORE_new.html", + "doc/html/man3/X509_STORE_set_verify_cb_func.html", + "doc/html/man3/X509_VERIFY_PARAM_set_flags.html", + "doc/html/man3/X509_add_cert.html", + "doc/html/man3/X509_check_ca.html", + "doc/html/man3/X509_check_host.html", + "doc/html/man3/X509_check_issued.html", + "doc/html/man3/X509_check_private_key.html", + "doc/html/man3/X509_check_purpose.html", + "doc/html/man3/X509_cmp.html", + "doc/html/man3/X509_cmp_time.html", + "doc/html/man3/X509_digest.html", + "doc/html/man3/X509_dup.html", + "doc/html/man3/X509_get0_distinguishing_id.html", + "doc/html/man3/X509_get0_notBefore.html", + "doc/html/man3/X509_get0_signature.html", + "doc/html/man3/X509_get0_uids.html", + "doc/html/man3/X509_get_default_cert_file.html", + "doc/html/man3/X509_get_extension_flags.html", + "doc/html/man3/X509_get_pubkey.html", + "doc/html/man3/X509_get_serialNumber.html", + "doc/html/man3/X509_get_subject_name.html", + "doc/html/man3/X509_get_version.html", + "doc/html/man3/X509_load_http.html", + "doc/html/man3/X509_new.html", + "doc/html/man3/X509_sign.html", + "doc/html/man3/X509_verify.html", + "doc/html/man3/X509_verify_cert.html", + "doc/html/man3/X509v3_get_ext_by_NID.html", + "doc/html/man3/b2i_PVK_bio_ex.html", + "doc/html/man3/d2i_PKCS8PrivateKey_bio.html", + "doc/html/man3/d2i_PrivateKey.html", + "doc/html/man3/d2i_RSAPrivateKey.html", + "doc/html/man3/d2i_SSL_SESSION.html", + "doc/html/man3/d2i_X509.html", + "doc/html/man3/i2d_CMS_bio_stream.html", + "doc/html/man3/i2d_PKCS7_bio_stream.html", + "doc/html/man3/i2d_re_X509_tbs.html", + "doc/html/man3/o2i_SCT_LIST.html", + "doc/html/man3/s2i_ASN1_IA5STRING.html" + ], + "man5" => [ + "doc/html/man5/config.html", + "doc/html/man5/fips_config.html", + "doc/html/man5/x509v3_config.html" + ], + "man7" => [ + "doc/html/man7/EVP_ASYM_CIPHER-RSA.html", + "doc/html/man7/EVP_ASYM_CIPHER-SM2.html", + "doc/html/man7/EVP_CIPHER-AES.html", + "doc/html/man7/EVP_CIPHER-ARIA.html", + "doc/html/man7/EVP_CIPHER-BLOWFISH.html", + "doc/html/man7/EVP_CIPHER-CAMELLIA.html", + "doc/html/man7/EVP_CIPHER-CAST.html", + "doc/html/man7/EVP_CIPHER-CHACHA.html", + "doc/html/man7/EVP_CIPHER-DES.html", + "doc/html/man7/EVP_CIPHER-IDEA.html", + "doc/html/man7/EVP_CIPHER-NULL.html", + "doc/html/man7/EVP_CIPHER-RC2.html", + "doc/html/man7/EVP_CIPHER-RC4.html", + "doc/html/man7/EVP_CIPHER-RC5.html", + "doc/html/man7/EVP_CIPHER-SEED.html", + "doc/html/man7/EVP_CIPHER-SM4.html", + "doc/html/man7/EVP_KDF-ARGON2.html", + "doc/html/man7/EVP_KDF-HKDF.html", + "doc/html/man7/EVP_KDF-HMAC-DRBG.html", + "doc/html/man7/EVP_KDF-KB.html", + "doc/html/man7/EVP_KDF-KRB5KDF.html", + "doc/html/man7/EVP_KDF-PBKDF1.html", + "doc/html/man7/EVP_KDF-PBKDF2.html", + "doc/html/man7/EVP_KDF-PKCS12KDF.html", + "doc/html/man7/EVP_KDF-PVKKDF.html", + "doc/html/man7/EVP_KDF-SCRYPT.html", + "doc/html/man7/EVP_KDF-SS.html", + "doc/html/man7/EVP_KDF-SSHKDF.html", + "doc/html/man7/EVP_KDF-TLS13_KDF.html", + "doc/html/man7/EVP_KDF-TLS1_PRF.html", + "doc/html/man7/EVP_KDF-X942-ASN1.html", + "doc/html/man7/EVP_KDF-X942-CONCAT.html", + "doc/html/man7/EVP_KDF-X963.html", + "doc/html/man7/EVP_KEM-EC.html", + "doc/html/man7/EVP_KEM-ML-KEM.html", + "doc/html/man7/EVP_KEM-RSA.html", + "doc/html/man7/EVP_KEM-X25519.html", + "doc/html/man7/EVP_KEYEXCH-DH.html", + "doc/html/man7/EVP_KEYEXCH-ECDH.html", + "doc/html/man7/EVP_KEYEXCH-X25519.html", + "doc/html/man7/EVP_MAC-BLAKE2.html", + "doc/html/man7/EVP_MAC-CMAC.html", + "doc/html/man7/EVP_MAC-GMAC.html", + "doc/html/man7/EVP_MAC-HMAC.html", + "doc/html/man7/EVP_MAC-KMAC.html", + "doc/html/man7/EVP_MAC-Poly1305.html", + "doc/html/man7/EVP_MAC-Siphash.html", + "doc/html/man7/EVP_MD-BLAKE2.html", + "doc/html/man7/EVP_MD-KECCAK.html", + "doc/html/man7/EVP_MD-MD2.html", + "doc/html/man7/EVP_MD-MD4.html", + "doc/html/man7/EVP_MD-MD5-SHA1.html", + "doc/html/man7/EVP_MD-MD5.html", + "doc/html/man7/EVP_MD-MDC2.html", + "doc/html/man7/EVP_MD-NULL.html", + "doc/html/man7/EVP_MD-RIPEMD160.html", + "doc/html/man7/EVP_MD-SHA1.html", + "doc/html/man7/EVP_MD-SHA2.html", + "doc/html/man7/EVP_MD-SHA3.html", + "doc/html/man7/EVP_MD-SHAKE.html", + "doc/html/man7/EVP_MD-SM3.html", + "doc/html/man7/EVP_MD-WHIRLPOOL.html", + "doc/html/man7/EVP_MD-common.html", + "doc/html/man7/EVP_PKEY-DH.html", + "doc/html/man7/EVP_PKEY-DSA.html", + "doc/html/man7/EVP_PKEY-EC.html", + "doc/html/man7/EVP_PKEY-FFC.html", + "doc/html/man7/EVP_PKEY-HMAC.html", + "doc/html/man7/EVP_PKEY-ML-DSA.html", + "doc/html/man7/EVP_PKEY-ML-KEM.html", + "doc/html/man7/EVP_PKEY-RSA.html", + "doc/html/man7/EVP_PKEY-SLH-DSA.html", + "doc/html/man7/EVP_PKEY-SM2.html", + "doc/html/man7/EVP_PKEY-X25519.html", + "doc/html/man7/EVP_RAND-CRNG-TEST.html", + "doc/html/man7/EVP_RAND-CTR-DRBG.html", + "doc/html/man7/EVP_RAND-HASH-DRBG.html", + "doc/html/man7/EVP_RAND-HMAC-DRBG.html", + "doc/html/man7/EVP_RAND-JITTER.html", + "doc/html/man7/EVP_RAND-SEED-SRC.html", + "doc/html/man7/EVP_RAND-TEST-RAND.html", + "doc/html/man7/EVP_RAND.html", + "doc/html/man7/EVP_SIGNATURE-DSA.html", + "doc/html/man7/EVP_SIGNATURE-ECDSA.html", + "doc/html/man7/EVP_SIGNATURE-ED25519.html", + "doc/html/man7/EVP_SIGNATURE-HMAC.html", + "doc/html/man7/EVP_SIGNATURE-ML-DSA.html", + "doc/html/man7/EVP_SIGNATURE-RSA.html", + "doc/html/man7/EVP_SIGNATURE-SLH-DSA.html", + "doc/html/man7/OSSL_PROVIDER-FIPS.html", + "doc/html/man7/OSSL_PROVIDER-base.html", + "doc/html/man7/OSSL_PROVIDER-default.html", + "doc/html/man7/OSSL_PROVIDER-legacy.html", + "doc/html/man7/OSSL_PROVIDER-null.html", + "doc/html/man7/OSSL_STORE-winstore.html", + "doc/html/man7/RAND.html", + "doc/html/man7/RSA-PSS.html", + "doc/html/man7/X25519.html", + "doc/html/man7/bio.html", + "doc/html/man7/ct.html", + "doc/html/man7/des_modes.html", + "doc/html/man7/evp.html", + "doc/html/man7/fips_module.html", + "doc/html/man7/life_cycle-cipher.html", + "doc/html/man7/life_cycle-digest.html", + "doc/html/man7/life_cycle-kdf.html", + "doc/html/man7/life_cycle-mac.html", + "doc/html/man7/life_cycle-pkey.html", + "doc/html/man7/life_cycle-rand.html", + "doc/html/man7/openssl-core.h.html", + "doc/html/man7/openssl-core_dispatch.h.html", + "doc/html/man7/openssl-core_names.h.html", + "doc/html/man7/openssl-env.html", + "doc/html/man7/openssl-glossary.html", + "doc/html/man7/openssl-qlog.html", + "doc/html/man7/openssl-quic-concurrency.html", + "doc/html/man7/openssl-quic.html", + "doc/html/man7/openssl-threads.html", + "doc/html/man7/openssl_user_macros.html", + "doc/html/man7/ossl-guide-introduction.html", + "doc/html/man7/ossl-guide-libcrypto-introduction.html", + "doc/html/man7/ossl-guide-libraries-introduction.html", + "doc/html/man7/ossl-guide-libssl-introduction.html", + "doc/html/man7/ossl-guide-migration.html", + "doc/html/man7/ossl-guide-quic-client-block.html", + "doc/html/man7/ossl-guide-quic-client-non-block.html", + "doc/html/man7/ossl-guide-quic-introduction.html", + "doc/html/man7/ossl-guide-quic-multi-stream.html", + "doc/html/man7/ossl-guide-quic-server-block.html", + "doc/html/man7/ossl-guide-quic-server-non-block.html", + "doc/html/man7/ossl-guide-tls-client-block.html", + "doc/html/man7/ossl-guide-tls-client-non-block.html", + "doc/html/man7/ossl-guide-tls-introduction.html", + "doc/html/man7/ossl-guide-tls-server-block.html", + "doc/html/man7/ossl_store-file.html", + "doc/html/man7/ossl_store.html", + "doc/html/man7/passphrase-encoding.html", + "doc/html/man7/property.html", + "doc/html/man7/provider-asym_cipher.html", + "doc/html/man7/provider-base.html", + "doc/html/man7/provider-cipher.html", + "doc/html/man7/provider-decoder.html", + "doc/html/man7/provider-digest.html", + "doc/html/man7/provider-encoder.html", + "doc/html/man7/provider-kdf.html", + "doc/html/man7/provider-kem.html", + "doc/html/man7/provider-keyexch.html", + "doc/html/man7/provider-keymgmt.html", + "doc/html/man7/provider-mac.html", + "doc/html/man7/provider-object.html", + "doc/html/man7/provider-rand.html", + "doc/html/man7/provider-signature.html", + "doc/html/man7/provider-skeymgmt.html", + "doc/html/man7/provider-storemgmt.html", + "doc/html/man7/provider.html", + "doc/html/man7/proxy-certificates.html", + "doc/html/man7/x509.html" + ] + }, + "imagedocs" => { + "man7" => [ + "doc/man7/img/cipher.png", + "doc/man7/img/digest.png", + "doc/man7/img/kdf.png", + "doc/man7/img/mac.png", + "doc/man7/img/pkey.png", + "doc/man7/img/rand.png" + ] + }, + "includes" => { + "OpenSSLConfig.cmake" => [ + "." + ], + "OpenSSLConfigVersion.cmake" => [ + "." + ], + "apps/asn1parse.o" => [ + "apps" + ], + "apps/ca.o" => [ + "apps" + ], + "apps/ciphers.o" => [ + "apps" + ], + "apps/cmp.o" => [ + "apps" + ], + "apps/cms.o" => [ + "apps" + ], + "apps/crl.o" => [ + "apps" + ], + "apps/crl2pkcs7.o" => [ + "apps" + ], + "apps/dgst.o" => [ + "apps" + ], + "apps/dhparam.o" => [ + "apps" + ], + "apps/dsa.o" => [ + "apps" + ], + "apps/dsaparam.o" => [ + "apps" + ], + "apps/ec.o" => [ + "apps" + ], + "apps/ecparam.o" => [ + "apps" + ], + "apps/enc.o" => [ + "apps" + ], + "apps/engine.o" => [ + "apps" + ], + "apps/errstr.o" => [ + "apps" + ], + "apps/fipsinstall.o" => [ + "apps" + ], + "apps/gendsa.o" => [ + "apps" + ], + "apps/genpkey.o" => [ + "apps" + ], + "apps/genrsa.o" => [ + "apps" + ], + "apps/info.o" => [ + "apps" + ], + "apps/kdf.o" => [ + "apps" + ], + "apps/lib/cmp_mock_srv.o" => [ + "apps" + ], + "apps/lib/openssl-bin-cmp_mock_srv.o" => [ + "apps" + ], + "apps/libapps.a" => [ + ".", + "include", + "apps/include" + ], + "apps/list.o" => [ + "apps" + ], + "apps/mac.o" => [ + "apps" + ], + "apps/nseq.o" => [ + "apps" + ], + "apps/ocsp.o" => [ + "apps" + ], + "apps/openssl" => [ + ".", + "include", + "apps/include" + ], + "apps/openssl-bin-asn1parse.o" => [ + "apps" + ], + "apps/openssl-bin-ca.o" => [ + "apps" + ], + "apps/openssl-bin-ciphers.o" => [ + "apps" + ], + "apps/openssl-bin-cmp.o" => [ + "apps" + ], + "apps/openssl-bin-cms.o" => [ + "apps" + ], + "apps/openssl-bin-crl.o" => [ + "apps" + ], + "apps/openssl-bin-crl2pkcs7.o" => [ + "apps" + ], + "apps/openssl-bin-dgst.o" => [ + "apps" + ], + "apps/openssl-bin-dhparam.o" => [ + "apps" + ], + "apps/openssl-bin-dsa.o" => [ + "apps" + ], + "apps/openssl-bin-dsaparam.o" => [ + "apps" + ], + "apps/openssl-bin-ec.o" => [ + "apps" + ], + "apps/openssl-bin-ecparam.o" => [ + "apps" + ], + "apps/openssl-bin-enc.o" => [ + "apps" + ], + "apps/openssl-bin-engine.o" => [ + "apps" + ], + "apps/openssl-bin-errstr.o" => [ + "apps" + ], + "apps/openssl-bin-fipsinstall.o" => [ + "apps" + ], + "apps/openssl-bin-gendsa.o" => [ + "apps" + ], + "apps/openssl-bin-genpkey.o" => [ + "apps" + ], + "apps/openssl-bin-genrsa.o" => [ + "apps" + ], + "apps/openssl-bin-info.o" => [ + "apps" + ], + "apps/openssl-bin-kdf.o" => [ + "apps" + ], + "apps/openssl-bin-list.o" => [ + "apps" + ], + "apps/openssl-bin-mac.o" => [ + "apps" + ], + "apps/openssl-bin-nseq.o" => [ + "apps" + ], + "apps/openssl-bin-ocsp.o" => [ + "apps" + ], + "apps/openssl-bin-openssl.o" => [ + "apps" + ], + "apps/openssl-bin-passwd.o" => [ + "apps" + ], + "apps/openssl-bin-pkcs12.o" => [ + "apps" + ], + "apps/openssl-bin-pkcs7.o" => [ + "apps" + ], + "apps/openssl-bin-pkcs8.o" => [ + "apps" + ], + "apps/openssl-bin-pkey.o" => [ + "apps" + ], + "apps/openssl-bin-pkeyparam.o" => [ + "apps" + ], + "apps/openssl-bin-pkeyutl.o" => [ + "apps" + ], + "apps/openssl-bin-prime.o" => [ + "apps" + ], + "apps/openssl-bin-progs.o" => [ + "apps" + ], + "apps/openssl-bin-rand.o" => [ + "apps" + ], + "apps/openssl-bin-rehash.o" => [ + "apps" + ], + "apps/openssl-bin-req.o" => [ + "apps" + ], + "apps/openssl-bin-rsa.o" => [ + "apps" + ], + "apps/openssl-bin-rsautl.o" => [ + "apps" + ], + "apps/openssl-bin-s_client.o" => [ + "apps" + ], + "apps/openssl-bin-s_server.o" => [ + "apps" + ], + "apps/openssl-bin-s_time.o" => [ + "apps" + ], + "apps/openssl-bin-sess_id.o" => [ + "apps" + ], + "apps/openssl-bin-skeyutl.o" => [ + "apps" + ], + "apps/openssl-bin-smime.o" => [ + "apps" + ], + "apps/openssl-bin-speed.o" => [ + "apps" + ], + "apps/openssl-bin-spkac.o" => [ + "apps" + ], + "apps/openssl-bin-srp.o" => [ + "apps" + ], + "apps/openssl-bin-storeutl.o" => [ + "apps" + ], + "apps/openssl-bin-ts.o" => [ + "apps" + ], + "apps/openssl-bin-verify.o" => [ + "apps" + ], + "apps/openssl-bin-version.o" => [ + "apps" + ], + "apps/openssl-bin-x509.o" => [ + "apps" + ], + "apps/openssl.o" => [ + "apps" + ], + "apps/passwd.o" => [ + "apps" + ], + "apps/pkcs12.o" => [ + "apps" + ], + "apps/pkcs7.o" => [ + "apps" + ], + "apps/pkcs8.o" => [ + "apps" + ], + "apps/pkey.o" => [ + "apps" + ], + "apps/pkeyparam.o" => [ + "apps" + ], + "apps/pkeyutl.o" => [ + "apps" + ], + "apps/prime.o" => [ + "apps" + ], + "apps/progs.c" => [ + "." + ], + "apps/progs.o" => [ + "apps" + ], + "apps/rand.o" => [ + "apps" + ], + "apps/rehash.o" => [ + "apps" + ], + "apps/req.o" => [ + "apps" + ], + "apps/rsa.o" => [ + "apps" + ], + "apps/rsautl.o" => [ + "apps" + ], + "apps/s_client.o" => [ + "apps" + ], + "apps/s_server.o" => [ + "apps" + ], + "apps/s_time.o" => [ + "apps" + ], + "apps/sess_id.o" => [ + "apps" + ], + "apps/skeyutl.o" => [ + "apps" + ], + "apps/smime.o" => [ + "apps" + ], + "apps/speed.o" => [ + "apps" + ], + "apps/spkac.o" => [ + "apps" + ], + "apps/srp.o" => [ + "apps" + ], + "apps/storeutl.o" => [ + "apps" + ], + "apps/ts.o" => [ + "apps" + ], + "apps/verify.o" => [ + "apps" + ], + "apps/version.o" => [ + "apps" + ], + "apps/x509.o" => [ + "apps" + ], + "crypto/aes/aes-armv4.o" => [ + "crypto" + ], + "crypto/aes/aes-mips.o" => [ + "crypto" + ], + "crypto/aes/aes-s390x.o" => [ + "crypto" + ], + "crypto/aes/aes-sparcv9.o" => [ + "crypto" + ], + "crypto/aes/aesfx-sparcv9.o" => [ + "crypto" + ], + "crypto/aes/aest4-sparcv9.o" => [ + "crypto" + ], + "crypto/aes/aesv8-armx.o" => [ + "crypto" + ], + "crypto/aes/bsaes-armv7.o" => [ + "crypto" + ], + "crypto/aes/vpaes-armv8.o" => [ + "crypto" + ], + "crypto/aes/vpaes-loongarch64.o" => [ + "crypto" + ], + "crypto/arm64cpuid.o" => [ + "crypto" + ], + "crypto/armv4cpuid.o" => [ + "crypto" + ], + "crypto/bn/armv4-gf2m.o" => [ + "crypto" + ], + "crypto/bn/armv4-mont.o" => [ + "crypto" + ], + "crypto/bn/armv8-mont.o" => [ + "crypto" + ], + "crypto/bn/bn-mips.o" => [ + "crypto" + ], + "crypto/bn/bn_exp.o" => [ + "crypto" + ], + "crypto/bn/libcrypto-lib-bn_exp.o" => [ + "crypto" + ], + "crypto/bn/libfips-lib-bn_exp.o" => [ + "crypto" + ], + "crypto/bn/mips-mont.o" => [ + "crypto" + ], + "crypto/bn/sparct4-mont.o" => [ + "crypto" + ], + "crypto/bn/sparcv9-gf2m.o" => [ + "crypto" + ], + "crypto/bn/sparcv9-mont.o" => [ + "crypto" + ], + "crypto/bn/sparcv9a-mont.o" => [ + "crypto" + ], + "crypto/bn/vis3-mont.o" => [ + "crypto" + ], + "crypto/camellia/cmllt4-sparcv9.o" => [ + "crypto" + ], + "crypto/chacha/chacha-armv4.o" => [ + "crypto" + ], + "crypto/chacha/chacha-armv8-sve.o" => [ + "crypto" + ], + "crypto/chacha/chacha-armv8.o" => [ + "crypto" + ], + "crypto/chacha/chacha-loongarch64.o" => [ + "crypto" + ], + "crypto/chacha/chacha-s390x.o" => [ + "crypto" + ], + "crypto/cpuid.o" => [ + "." + ], + "crypto/cversion.o" => [ + "crypto" + ], + "crypto/des/dest4-sparcv9.o" => [ + "crypto" + ], + "crypto/ec/ecp_nistz256-armv4.o" => [ + "crypto" + ], + "crypto/ec/ecp_nistz256-armv8.o" => [ + "crypto" + ], + "crypto/ec/ecp_nistz256-sparcv9.o" => [ + "crypto" + ], + "crypto/ec/ecp_s390x_nistp.o" => [ + "crypto" + ], + "crypto/ec/ecp_sm2p256-armv8.o" => [ + "crypto" + ], + "crypto/ec/ecx_key.o" => [ + "crypto" + ], + "crypto/ec/ecx_meth.o" => [ + "crypto" + ], + "crypto/ec/ecx_s390x.o" => [ + "crypto" + ], + "crypto/ec/libcrypto-lib-ecx_key.o" => [ + "crypto" + ], + "crypto/ec/libcrypto-lib-ecx_meth.o" => [ + "crypto" + ], + "crypto/ec/libfips-lib-ecx_key.o" => [ + "crypto" + ], + "crypto/evp/e_aes.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/evp/e_aes_cbc_hmac_sha1.o" => [ + "crypto/modes" + ], + "crypto/evp/e_aes_cbc_hmac_sha256.o" => [ + "crypto/modes" + ], + "crypto/evp/e_aria.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/evp/e_camellia.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/evp/e_des.o" => [ + "crypto" + ], + "crypto/evp/e_des3.o" => [ + "crypto" + ], + "crypto/evp/e_sm4.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/evp/libcrypto-lib-e_aes.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha1.o" => [ + "crypto/modes" + ], + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha256.o" => [ + "crypto/modes" + ], + "crypto/evp/libcrypto-lib-e_aria.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/evp/libcrypto-lib-e_camellia.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/evp/libcrypto-lib-e_des.o" => [ + "crypto" + ], + "crypto/evp/libcrypto-lib-e_des3.o" => [ + "crypto" + ], + "crypto/evp/libcrypto-lib-e_sm4.o" => [ + "crypto", + "crypto/modes" + ], + "crypto/info.o" => [ + "crypto" + ], + "crypto/libcrypto-lib-cpuid.o" => [ + "." + ], + "crypto/libcrypto-lib-cversion.o" => [ + "crypto" + ], + "crypto/libcrypto-lib-info.o" => [ + "crypto" + ], + "crypto/libfips-lib-cpuid.o" => [ + "." + ], + "crypto/md5/md5-aarch64.o" => [ + "crypto" + ], + "crypto/md5/md5-loongarch64.o" => [ + "crypto" + ], + "crypto/md5/md5-sparcv9.o" => [ + "crypto" + ], + "crypto/modes/aes-gcm-armv8-unroll8_64.o" => [ + "crypto" + ], + "crypto/modes/aes-gcm-armv8_64.o" => [ + "crypto" + ], + "crypto/modes/gcm128.o" => [ + "crypto" + ], + "crypto/modes/ghash-armv4.o" => [ + "crypto" + ], + "crypto/modes/ghash-s390x.o" => [ + "crypto" + ], + "crypto/modes/ghash-sparcv9.o" => [ + "crypto" + ], + "crypto/modes/ghashv8-armx.o" => [ + "crypto" + ], + "crypto/modes/libcrypto-lib-gcm128.o" => [ + "crypto" + ], + "crypto/modes/libfips-lib-gcm128.o" => [ + "crypto" + ], + "crypto/params_idx.c" => [ + "util/perl" + ], + "crypto/poly1305/poly1305-armv4.o" => [ + "crypto" + ], + "crypto/poly1305/poly1305-armv8.o" => [ + "crypto" + ], + "crypto/poly1305/poly1305-mips.o" => [ + "crypto" + ], + "crypto/poly1305/poly1305-s390x.o" => [ + "crypto" + ], + "crypto/poly1305/poly1305-sparcv9.o" => [ + "crypto" + ], + "crypto/s390xcpuid.o" => [ + "crypto" + ], + "crypto/sha/keccak1600-armv4.o" => [ + "crypto" + ], + "crypto/sha/keccak1600-armv8.o" => [ + "crypto" + ], + "crypto/sha/sha1-armv4-large.o" => [ + "crypto" + ], + "crypto/sha/sha1-armv8.o" => [ + "crypto" + ], + "crypto/sha/sha1-mips.o" => [ + "crypto" + ], + "crypto/sha/sha1-s390x.o" => [ + "crypto" + ], + "crypto/sha/sha1-sparcv9.o" => [ + "crypto" + ], + "crypto/sha/sha256-armv4.o" => [ + "crypto" + ], + "crypto/sha/sha256-armv8.o" => [ + "crypto" + ], + "crypto/sha/sha256-mips.o" => [ + "crypto" + ], + "crypto/sha/sha256-s390x.o" => [ + "crypto" + ], + "crypto/sha/sha256-sparcv9.o" => [ + "crypto" + ], + "crypto/sha/sha512-armv4.o" => [ + "crypto" + ], + "crypto/sha/sha512-armv8.o" => [ + "crypto" + ], + "crypto/sha/sha512-mips.o" => [ + "crypto" + ], + "crypto/sha/sha512-s390x.o" => [ + "crypto" + ], + "crypto/sha/sha512-sparcv9.o" => [ + "crypto" + ], + "crypto/sm3/sm3-armv8.o" => [ + "crypto" + ], + "crypto/sm4/sm4-armv8.o" => [ + "crypto" + ], + "crypto/sm4/vpsm4-armv8.o" => [ + "crypto" + ], + "crypto/sm4/vpsm4_ex-armv8.o" => [ + "crypto" + ], + "doc/man1/openssl-asn1parse.pod" => [ + "doc" + ], + "doc/man1/openssl-ca.pod" => [ + "doc" + ], + "doc/man1/openssl-ciphers.pod" => [ + "doc" + ], + "doc/man1/openssl-cmds.pod" => [ + "doc" + ], + "doc/man1/openssl-cmp.pod" => [ + "doc" + ], + "doc/man1/openssl-cms.pod" => [ + "doc" + ], + "doc/man1/openssl-crl.pod" => [ + "doc" + ], + "doc/man1/openssl-crl2pkcs7.pod" => [ + "doc" + ], + "doc/man1/openssl-dgst.pod" => [ + "doc" + ], + "doc/man1/openssl-dhparam.pod" => [ + "doc" + ], + "doc/man1/openssl-dsa.pod" => [ + "doc" + ], + "doc/man1/openssl-dsaparam.pod" => [ + "doc" + ], + "doc/man1/openssl-ec.pod" => [ + "doc" + ], + "doc/man1/openssl-ecparam.pod" => [ + "doc" + ], + "doc/man1/openssl-enc.pod" => [ + "doc" + ], + "doc/man1/openssl-engine.pod" => [ + "doc" + ], + "doc/man1/openssl-errstr.pod" => [ + "doc" + ], + "doc/man1/openssl-fipsinstall.pod" => [ + "doc" + ], + "doc/man1/openssl-gendsa.pod" => [ + "doc" + ], + "doc/man1/openssl-genpkey.pod" => [ + "doc" + ], + "doc/man1/openssl-genrsa.pod" => [ + "doc" + ], + "doc/man1/openssl-info.pod" => [ + "doc" + ], + "doc/man1/openssl-kdf.pod" => [ + "doc" + ], + "doc/man1/openssl-list.pod" => [ + "doc" + ], + "doc/man1/openssl-mac.pod" => [ + "doc" + ], + "doc/man1/openssl-nseq.pod" => [ + "doc" + ], + "doc/man1/openssl-ocsp.pod" => [ + "doc" + ], + "doc/man1/openssl-passwd.pod" => [ + "doc" + ], + "doc/man1/openssl-pkcs12.pod" => [ + "doc" + ], + "doc/man1/openssl-pkcs7.pod" => [ + "doc" + ], + "doc/man1/openssl-pkcs8.pod" => [ + "doc" + ], + "doc/man1/openssl-pkey.pod" => [ + "doc" + ], + "doc/man1/openssl-pkeyparam.pod" => [ + "doc" + ], + "doc/man1/openssl-pkeyutl.pod" => [ + "doc" + ], + "doc/man1/openssl-prime.pod" => [ + "doc" + ], + "doc/man1/openssl-rand.pod" => [ + "doc" + ], + "doc/man1/openssl-rehash.pod" => [ + "doc" + ], + "doc/man1/openssl-req.pod" => [ + "doc" + ], + "doc/man1/openssl-rsa.pod" => [ + "doc" + ], + "doc/man1/openssl-rsautl.pod" => [ + "doc" + ], + "doc/man1/openssl-s_client.pod" => [ + "doc" + ], + "doc/man1/openssl-s_server.pod" => [ + "doc" + ], + "doc/man1/openssl-s_time.pod" => [ + "doc" + ], + "doc/man1/openssl-sess_id.pod" => [ + "doc" + ], + "doc/man1/openssl-skeyutl.pod" => [ + "doc" + ], + "doc/man1/openssl-smime.pod" => [ + "doc" + ], + "doc/man1/openssl-speed.pod" => [ + "doc" + ], + "doc/man1/openssl-spkac.pod" => [ + "doc" + ], + "doc/man1/openssl-srp.pod" => [ + "doc" + ], + "doc/man1/openssl-storeutl.pod" => [ + "doc" + ], + "doc/man1/openssl-ts.pod" => [ + "doc" + ], + "doc/man1/openssl-verify.pod" => [ + "doc" + ], + "doc/man1/openssl-version.pod" => [ + "doc" + ], + "doc/man1/openssl-x509.pod" => [ + "doc" + ], + "exporters/OpenSSLConfig.cmake" => [ + "." + ], + "exporters/OpenSSLConfigVersion.cmake" => [ + "." + ], + "exporters/libcrypto.pc" => [ + "." + ], + "exporters/libssl.pc" => [ + "." + ], + "exporters/openssl.pc" => [ + "." + ], + "include/internal/param_names.h" => [ + "util/perl" + ], + "include/openssl/core_names.h" => [ + "util/perl" + ], + "libcrypto" => [ + ".", + "include", + "providers/common/include", + "providers/implementations/include" + ], + "libcrypto.ld" => [ + ".", + "util/perl/OpenSSL" + ], + "libcrypto.pc" => [ + "." + ], + "libssl" => [ + ".", + "include" + ], + "libssl.ld" => [ + ".", + "util/perl/OpenSSL" + ], + "libssl.pc" => [ + "." + ], + "openssl.pc" => [ + "." + ], + "providers/common/der/der_digests_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_digests_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_dsa_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_dsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_dsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_ec_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_ec_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_ec_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_ec_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_ecx_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_ecx_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_ecx_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_ml_dsa_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_ml_dsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_ml_dsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_rsa_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_rsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_rsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_rsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_slh_dsa_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_slh_dsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_slh_dsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_sm2_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_sm2_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_sm2_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_sm2_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/der_wrap_gen.c" => [ + "providers/common/der" + ], + "providers/common/der/der_wrap_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_digests_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_dsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_dsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_ec_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_ec_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_ec_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_ecx_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_ecx_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_ml_dsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_ml_dsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_rsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_rsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_slh_dsa_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_slh_dsa_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libcommon-lib-der_wrap_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libdefault-lib-der_rsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libdefault-lib-der_sm2_gen.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libdefault-lib-der_sm2_key.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libdefault-lib-der_sm2_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/der/libfips-lib-der_rsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/common/include/prov/der_digests.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_dsa.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_ec.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_ecx.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_ml_dsa.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_rsa.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_slh_dsa.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_sm2.h" => [ + "providers/common/der" + ], + "providers/common/include/prov/der_wrap.h" => [ + "providers/common/der" + ], + "providers/fips" => [ + "include" + ], + "providers/implementations/encode_decode/encode_key2any.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/encode_decode/libdefault-lib-encode_key2any.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/kdfs/libdefault-lib-x942kdf.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/kdfs/libfips-lib-x942kdf.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/kdfs/x942kdf.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/ecdsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/eddsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libdefault-lib-dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libdefault-lib-ecdsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libdefault-lib-eddsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libdefault-lib-ml_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libdefault-lib-rsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libdefault-lib-slh_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libdefault-lib-sm2_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libfips-lib-dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libfips-lib-ecdsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libfips-lib-eddsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libfips-lib-ml_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libfips-lib-rsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/libfips-lib-slh_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/ml_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/rsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/slh_dsa_sig.o" => [ + "providers/common/include/prov" + ], + "providers/implementations/signature/sm2_sig.o" => [ + "providers/common/include/prov" + ], + "providers/legacy" => [ + "include", + "providers/implementations/include", + "providers/common/include" + ], + "providers/libcommon.a" => [ + "crypto", + "include", + "providers/implementations/include", + "providers/common/include", + "providers/fips/include" + ], + "providers/libdefault.a" => [ + ".", + "crypto", + "include", + "providers/implementations/include", + "providers/common/include", + "providers/fips/include" + ], + "providers/libfips.a" => [ + ".", + "crypto", + "include", + "providers/implementations/include", + "providers/common/include", + "providers/fips/include" + ], + "providers/liblegacy.a" => [ + ".", + "crypto", + "include", + "providers/implementations/include", + "providers/common/include", + "providers/fips/include" + ], + "providers/libtemplate.a" => [ + "crypto", + "include", + "providers/implementations/include", + "providers/common/include", + "providers/fips/include" + ], + "util/wrap.pl" => [ + "." + ] + }, + "ldadd" => {}, + "libraries" => [ + "apps/libapps.a", + "libcrypto", + "libssl", + "providers/libcommon.a", + "providers/libdefault.a", + "providers/libfips.a", + "providers/liblegacy.a", + "providers/libtemplate.a" + ], + "mandocs" => { + "man1" => [ + "doc/man/man1/CA.pl.1", + "doc/man/man1/openssl-asn1parse.1", + "doc/man/man1/openssl-ca.1", + "doc/man/man1/openssl-ciphers.1", + "doc/man/man1/openssl-cmds.1", + "doc/man/man1/openssl-cmp.1", + "doc/man/man1/openssl-cms.1", + "doc/man/man1/openssl-crl.1", + "doc/man/man1/openssl-crl2pkcs7.1", + "doc/man/man1/openssl-dgst.1", + "doc/man/man1/openssl-dhparam.1", + "doc/man/man1/openssl-dsa.1", + "doc/man/man1/openssl-dsaparam.1", + "doc/man/man1/openssl-ec.1", + "doc/man/man1/openssl-ecparam.1", + "doc/man/man1/openssl-enc.1", + "doc/man/man1/openssl-engine.1", + "doc/man/man1/openssl-errstr.1", + "doc/man/man1/openssl-fipsinstall.1", + "doc/man/man1/openssl-format-options.1", + "doc/man/man1/openssl-gendsa.1", + "doc/man/man1/openssl-genpkey.1", + "doc/man/man1/openssl-genrsa.1", + "doc/man/man1/openssl-info.1", + "doc/man/man1/openssl-kdf.1", + "doc/man/man1/openssl-list.1", + "doc/man/man1/openssl-mac.1", + "doc/man/man1/openssl-namedisplay-options.1", + "doc/man/man1/openssl-nseq.1", + "doc/man/man1/openssl-ocsp.1", + "doc/man/man1/openssl-passphrase-options.1", + "doc/man/man1/openssl-passwd.1", + "doc/man/man1/openssl-pkcs12.1", + "doc/man/man1/openssl-pkcs7.1", + "doc/man/man1/openssl-pkcs8.1", + "doc/man/man1/openssl-pkey.1", + "doc/man/man1/openssl-pkeyparam.1", + "doc/man/man1/openssl-pkeyutl.1", + "doc/man/man1/openssl-prime.1", + "doc/man/man1/openssl-rand.1", + "doc/man/man1/openssl-rehash.1", + "doc/man/man1/openssl-req.1", + "doc/man/man1/openssl-rsa.1", + "doc/man/man1/openssl-rsautl.1", + "doc/man/man1/openssl-s_client.1", + "doc/man/man1/openssl-s_server.1", + "doc/man/man1/openssl-s_time.1", + "doc/man/man1/openssl-sess_id.1", + "doc/man/man1/openssl-skeyutl.1", + "doc/man/man1/openssl-smime.1", + "doc/man/man1/openssl-speed.1", + "doc/man/man1/openssl-spkac.1", + "doc/man/man1/openssl-srp.1", + "doc/man/man1/openssl-storeutl.1", + "doc/man/man1/openssl-ts.1", + "doc/man/man1/openssl-verification-options.1", + "doc/man/man1/openssl-verify.1", + "doc/man/man1/openssl-version.1", + "doc/man/man1/openssl-x509.1", + "doc/man/man1/openssl.1", + "doc/man/man1/tsget.1" + ], + "man3" => [ + "doc/man/man3/ADMISSIONS.3", + "doc/man/man3/ASN1_EXTERN_FUNCS.3", + "doc/man/man3/ASN1_INTEGER_get_int64.3", + "doc/man/man3/ASN1_INTEGER_new.3", + "doc/man/man3/ASN1_ITEM_lookup.3", + "doc/man/man3/ASN1_OBJECT_new.3", + "doc/man/man3/ASN1_STRING_TABLE_add.3", + "doc/man/man3/ASN1_STRING_length.3", + "doc/man/man3/ASN1_STRING_new.3", + "doc/man/man3/ASN1_STRING_print_ex.3", + "doc/man/man3/ASN1_TIME_set.3", + "doc/man/man3/ASN1_TYPE_get.3", + "doc/man/man3/ASN1_aux_cb.3", + "doc/man/man3/ASN1_generate_nconf.3", + "doc/man/man3/ASN1_item_d2i_bio.3", + "doc/man/man3/ASN1_item_new.3", + "doc/man/man3/ASN1_item_sign.3", + "doc/man/man3/ASYNC_WAIT_CTX_new.3", + "doc/man/man3/ASYNC_start_job.3", + "doc/man/man3/BF_encrypt.3", + "doc/man/man3/BIO_ADDR.3", + "doc/man/man3/BIO_ADDRINFO.3", + "doc/man/man3/BIO_connect.3", + "doc/man/man3/BIO_ctrl.3", + "doc/man/man3/BIO_f_base64.3", + "doc/man/man3/BIO_f_buffer.3", + "doc/man/man3/BIO_f_cipher.3", + "doc/man/man3/BIO_f_md.3", + "doc/man/man3/BIO_f_null.3", + "doc/man/man3/BIO_f_prefix.3", + "doc/man/man3/BIO_f_readbuffer.3", + "doc/man/man3/BIO_f_ssl.3", + "doc/man/man3/BIO_find_type.3", + "doc/man/man3/BIO_get_data.3", + "doc/man/man3/BIO_get_ex_new_index.3", + "doc/man/man3/BIO_get_rpoll_descriptor.3", + "doc/man/man3/BIO_meth_new.3", + "doc/man/man3/BIO_new.3", + "doc/man/man3/BIO_new_CMS.3", + "doc/man/man3/BIO_parse_hostserv.3", + "doc/man/man3/BIO_printf.3", + "doc/man/man3/BIO_push.3", + "doc/man/man3/BIO_read.3", + "doc/man/man3/BIO_s_accept.3", + "doc/man/man3/BIO_s_bio.3", + "doc/man/man3/BIO_s_connect.3", + "doc/man/man3/BIO_s_core.3", + "doc/man/man3/BIO_s_datagram.3", + "doc/man/man3/BIO_s_dgram_pair.3", + "doc/man/man3/BIO_s_fd.3", + "doc/man/man3/BIO_s_file.3", + "doc/man/man3/BIO_s_mem.3", + "doc/man/man3/BIO_s_null.3", + "doc/man/man3/BIO_s_socket.3", + "doc/man/man3/BIO_sendmmsg.3", + "doc/man/man3/BIO_set_callback.3", + "doc/man/man3/BIO_set_flags.3", + "doc/man/man3/BIO_should_retry.3", + "doc/man/man3/BIO_socket_wait.3", + "doc/man/man3/BN_BLINDING_new.3", + "doc/man/man3/BN_CTX_new.3", + "doc/man/man3/BN_CTX_start.3", + "doc/man/man3/BN_add.3", + "doc/man/man3/BN_add_word.3", + "doc/man/man3/BN_bn2bin.3", + "doc/man/man3/BN_cmp.3", + "doc/man/man3/BN_copy.3", + "doc/man/man3/BN_generate_prime.3", + "doc/man/man3/BN_mod_exp_mont.3", + "doc/man/man3/BN_mod_inverse.3", + "doc/man/man3/BN_mod_mul_montgomery.3", + "doc/man/man3/BN_mod_mul_reciprocal.3", + "doc/man/man3/BN_new.3", + "doc/man/man3/BN_num_bytes.3", + "doc/man/man3/BN_rand.3", + "doc/man/man3/BN_security_bits.3", + "doc/man/man3/BN_set_bit.3", + "doc/man/man3/BN_swap.3", + "doc/man/man3/BN_zero.3", + "doc/man/man3/BUF_MEM_new.3", + "doc/man/man3/CMAC_CTX.3", + "doc/man/man3/CMS_EncryptedData_decrypt.3", + "doc/man/man3/CMS_EncryptedData_encrypt.3", + "doc/man/man3/CMS_EncryptedData_set1_key.3", + "doc/man/man3/CMS_EnvelopedData_create.3", + "doc/man/man3/CMS_add0_cert.3", + "doc/man/man3/CMS_add1_recipient_cert.3", + "doc/man/man3/CMS_add1_signer.3", + "doc/man/man3/CMS_compress.3", + "doc/man/man3/CMS_data_create.3", + "doc/man/man3/CMS_decrypt.3", + "doc/man/man3/CMS_digest_create.3", + "doc/man/man3/CMS_encrypt.3", + "doc/man/man3/CMS_final.3", + "doc/man/man3/CMS_get0_RecipientInfos.3", + "doc/man/man3/CMS_get0_SignerInfos.3", + "doc/man/man3/CMS_get0_type.3", + "doc/man/man3/CMS_get1_ReceiptRequest.3", + "doc/man/man3/CMS_sign.3", + "doc/man/man3/CMS_sign_receipt.3", + "doc/man/man3/CMS_signed_get_attr.3", + "doc/man/man3/CMS_uncompress.3", + "doc/man/man3/CMS_verify.3", + "doc/man/man3/CMS_verify_receipt.3", + "doc/man/man3/COMP_CTX_new.3", + "doc/man/man3/CONF_modules_free.3", + "doc/man/man3/CONF_modules_load_file.3", + "doc/man/man3/CRYPTO_THREAD_run_once.3", + "doc/man/man3/CRYPTO_get_ex_new_index.3", + "doc/man/man3/CRYPTO_memcmp.3", + "doc/man/man3/CTLOG_STORE_get0_log_by_id.3", + "doc/man/man3/CTLOG_STORE_new.3", + "doc/man/man3/CTLOG_new.3", + "doc/man/man3/CT_POLICY_EVAL_CTX_new.3", + "doc/man/man3/DEFINE_STACK_OF.3", + "doc/man/man3/DES_random_key.3", + "doc/man/man3/DH_generate_key.3", + "doc/man/man3/DH_generate_parameters.3", + "doc/man/man3/DH_get0_pqg.3", + "doc/man/man3/DH_get_1024_160.3", + "doc/man/man3/DH_meth_new.3", + "doc/man/man3/DH_new.3", + "doc/man/man3/DH_new_by_nid.3", + "doc/man/man3/DH_set_method.3", + "doc/man/man3/DH_size.3", + "doc/man/man3/DSA_SIG_new.3", + "doc/man/man3/DSA_do_sign.3", + "doc/man/man3/DSA_dup_DH.3", + "doc/man/man3/DSA_generate_key.3", + "doc/man/man3/DSA_generate_parameters.3", + "doc/man/man3/DSA_get0_pqg.3", + "doc/man/man3/DSA_meth_new.3", + "doc/man/man3/DSA_new.3", + "doc/man/man3/DSA_set_method.3", + "doc/man/man3/DSA_sign.3", + "doc/man/man3/DSA_size.3", + "doc/man/man3/DTLS_get_data_mtu.3", + "doc/man/man3/DTLS_set_timer_cb.3", + "doc/man/man3/DTLSv1_get_timeout.3", + "doc/man/man3/DTLSv1_handle_timeout.3", + "doc/man/man3/DTLSv1_listen.3", + "doc/man/man3/ECDSA_SIG_new.3", + "doc/man/man3/ECDSA_sign.3", + "doc/man/man3/ECPKParameters_print.3", + "doc/man/man3/EC_GFp_simple_method.3", + "doc/man/man3/EC_GROUP_copy.3", + "doc/man/man3/EC_GROUP_new.3", + "doc/man/man3/EC_KEY_get_enc_flags.3", + "doc/man/man3/EC_KEY_new.3", + "doc/man/man3/EC_POINT_add.3", + "doc/man/man3/EC_POINT_new.3", + "doc/man/man3/ENGINE_add.3", + "doc/man/man3/ERR_GET_LIB.3", + "doc/man/man3/ERR_clear_error.3", + "doc/man/man3/ERR_error_string.3", + "doc/man/man3/ERR_get_error.3", + "doc/man/man3/ERR_load_crypto_strings.3", + "doc/man/man3/ERR_load_strings.3", + "doc/man/man3/ERR_new.3", + "doc/man/man3/ERR_print_errors.3", + "doc/man/man3/ERR_put_error.3", + "doc/man/man3/ERR_remove_state.3", + "doc/man/man3/ERR_set_mark.3", + "doc/man/man3/EVP_ASYM_CIPHER_free.3", + "doc/man/man3/EVP_BytesToKey.3", + "doc/man/man3/EVP_CIPHER_CTX_get_app_data.3", + "doc/man/man3/EVP_CIPHER_CTX_get_cipher_data.3", + "doc/man/man3/EVP_CIPHER_CTX_get_original_iv.3", + "doc/man/man3/EVP_CIPHER_meth_new.3", + "doc/man/man3/EVP_DigestInit.3", + "doc/man/man3/EVP_DigestSignInit.3", + "doc/man/man3/EVP_DigestVerifyInit.3", + "doc/man/man3/EVP_EncodeInit.3", + "doc/man/man3/EVP_EncryptInit.3", + "doc/man/man3/EVP_KDF.3", + "doc/man/man3/EVP_KEM_free.3", + "doc/man/man3/EVP_KEYEXCH_free.3", + "doc/man/man3/EVP_KEYMGMT.3", + "doc/man/man3/EVP_MAC.3", + "doc/man/man3/EVP_MD_meth_new.3", + "doc/man/man3/EVP_OpenInit.3", + "doc/man/man3/EVP_PBE_CipherInit.3", + "doc/man/man3/EVP_PKEY2PKCS8.3", + "doc/man/man3/EVP_PKEY_ASN1_METHOD.3", + "doc/man/man3/EVP_PKEY_CTX_ctrl.3", + "doc/man/man3/EVP_PKEY_CTX_get0_libctx.3", + "doc/man/man3/EVP_PKEY_CTX_get0_pkey.3", + "doc/man/man3/EVP_PKEY_CTX_get_algor.3", + "doc/man/man3/EVP_PKEY_CTX_new.3", + "doc/man/man3/EVP_PKEY_CTX_set1_pbe_pass.3", + "doc/man/man3/EVP_PKEY_CTX_set_hkdf_md.3", + "doc/man/man3/EVP_PKEY_CTX_set_params.3", + "doc/man/man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.3", + "doc/man/man3/EVP_PKEY_CTX_set_scrypt_N.3", + "doc/man/man3/EVP_PKEY_CTX_set_tls1_prf_md.3", + "doc/man/man3/EVP_PKEY_asn1_get_count.3", + "doc/man/man3/EVP_PKEY_check.3", + "doc/man/man3/EVP_PKEY_copy_parameters.3", + "doc/man/man3/EVP_PKEY_decapsulate.3", + "doc/man/man3/EVP_PKEY_decrypt.3", + "doc/man/man3/EVP_PKEY_derive.3", + "doc/man/man3/EVP_PKEY_digestsign_supports_digest.3", + "doc/man/man3/EVP_PKEY_encapsulate.3", + "doc/man/man3/EVP_PKEY_encrypt.3", + "doc/man/man3/EVP_PKEY_fromdata.3", + "doc/man/man3/EVP_PKEY_get_attr.3", + "doc/man/man3/EVP_PKEY_get_default_digest_nid.3", + "doc/man/man3/EVP_PKEY_get_field_type.3", + "doc/man/man3/EVP_PKEY_get_group_name.3", + "doc/man/man3/EVP_PKEY_get_size.3", + "doc/man/man3/EVP_PKEY_gettable_params.3", + "doc/man/man3/EVP_PKEY_is_a.3", + "doc/man/man3/EVP_PKEY_keygen.3", + "doc/man/man3/EVP_PKEY_meth_get_count.3", + "doc/man/man3/EVP_PKEY_meth_new.3", + "doc/man/man3/EVP_PKEY_new.3", + "doc/man/man3/EVP_PKEY_print_private.3", + "doc/man/man3/EVP_PKEY_set1_RSA.3", + "doc/man/man3/EVP_PKEY_set1_encoded_public_key.3", + "doc/man/man3/EVP_PKEY_set_type.3", + "doc/man/man3/EVP_PKEY_settable_params.3", + "doc/man/man3/EVP_PKEY_sign.3", + "doc/man/man3/EVP_PKEY_todata.3", + "doc/man/man3/EVP_PKEY_verify.3", + "doc/man/man3/EVP_PKEY_verify_recover.3", + "doc/man/man3/EVP_RAND.3", + "doc/man/man3/EVP_SIGNATURE.3", + "doc/man/man3/EVP_SKEY.3", + "doc/man/man3/EVP_SKEYMGMT.3", + "doc/man/man3/EVP_SealInit.3", + "doc/man/man3/EVP_SignInit.3", + "doc/man/man3/EVP_VerifyInit.3", + "doc/man/man3/EVP_aes_128_gcm.3", + "doc/man/man3/EVP_aria_128_gcm.3", + "doc/man/man3/EVP_bf_cbc.3", + "doc/man/man3/EVP_blake2b512.3", + "doc/man/man3/EVP_camellia_128_ecb.3", + "doc/man/man3/EVP_cast5_cbc.3", + "doc/man/man3/EVP_chacha20.3", + "doc/man/man3/EVP_des_cbc.3", + "doc/man/man3/EVP_desx_cbc.3", + "doc/man/man3/EVP_idea_cbc.3", + "doc/man/man3/EVP_md2.3", + "doc/man/man3/EVP_md4.3", + "doc/man/man3/EVP_md5.3", + "doc/man/man3/EVP_mdc2.3", + "doc/man/man3/EVP_rc2_cbc.3", + "doc/man/man3/EVP_rc4.3", + "doc/man/man3/EVP_rc5_32_12_16_cbc.3", + "doc/man/man3/EVP_ripemd160.3", + "doc/man/man3/EVP_seed_cbc.3", + "doc/man/man3/EVP_set_default_properties.3", + "doc/man/man3/EVP_sha1.3", + "doc/man/man3/EVP_sha224.3", + "doc/man/man3/EVP_sha3_224.3", + "doc/man/man3/EVP_sm3.3", + "doc/man/man3/EVP_sm4_cbc.3", + "doc/man/man3/EVP_whirlpool.3", + "doc/man/man3/GENERAL_NAME.3", + "doc/man/man3/HMAC.3", + "doc/man/man3/MD5.3", + "doc/man/man3/MDC2_Init.3", + "doc/man/man3/NCONF_new_ex.3", + "doc/man/man3/OBJ_nid2obj.3", + "doc/man/man3/OCSP_REQUEST_new.3", + "doc/man/man3/OCSP_cert_to_id.3", + "doc/man/man3/OCSP_request_add1_nonce.3", + "doc/man/man3/OCSP_resp_find_status.3", + "doc/man/man3/OCSP_response_status.3", + "doc/man/man3/OCSP_sendreq_new.3", + "doc/man/man3/OPENSSL_Applink.3", + "doc/man/man3/OPENSSL_FILE.3", + "doc/man/man3/OPENSSL_LH_COMPFUNC.3", + "doc/man/man3/OPENSSL_LH_stats.3", + "doc/man/man3/OPENSSL_config.3", + "doc/man/man3/OPENSSL_fork_prepare.3", + "doc/man/man3/OPENSSL_gmtime.3", + "doc/man/man3/OPENSSL_hexchar2int.3", + "doc/man/man3/OPENSSL_ia32cap.3", + "doc/man/man3/OPENSSL_init_crypto.3", + "doc/man/man3/OPENSSL_init_ssl.3", + "doc/man/man3/OPENSSL_instrument_bus.3", + "doc/man/man3/OPENSSL_load_builtin_modules.3", + "doc/man/man3/OPENSSL_load_u16_le.3", + "doc/man/man3/OPENSSL_malloc.3", + "doc/man/man3/OPENSSL_ppccap.3", + "doc/man/man3/OPENSSL_riscvcap.3", + "doc/man/man3/OPENSSL_s390xcap.3", + "doc/man/man3/OPENSSL_secure_malloc.3", + "doc/man/man3/OPENSSL_strcasecmp.3", + "doc/man/man3/OSSL_ALGORITHM.3", + "doc/man/man3/OSSL_CALLBACK.3", + "doc/man/man3/OSSL_CMP_ATAV_set0.3", + "doc/man/man3/OSSL_CMP_CTX_new.3", + "doc/man/man3/OSSL_CMP_HDR_get0_transactionID.3", + "doc/man/man3/OSSL_CMP_ITAV_new_caCerts.3", + "doc/man/man3/OSSL_CMP_ITAV_set0.3", + "doc/man/man3/OSSL_CMP_MSG_get0_header.3", + "doc/man/man3/OSSL_CMP_MSG_http_perform.3", + "doc/man/man3/OSSL_CMP_SRV_CTX_new.3", + "doc/man/man3/OSSL_CMP_STATUSINFO_new.3", + "doc/man/man3/OSSL_CMP_exec_certreq.3", + "doc/man/man3/OSSL_CMP_log_open.3", + "doc/man/man3/OSSL_CMP_validate_msg.3", + "doc/man/man3/OSSL_CORE_MAKE_FUNC.3", + "doc/man/man3/OSSL_CRMF_MSG_get0_tmpl.3", + "doc/man/man3/OSSL_CRMF_MSG_set0_validity.3", + "doc/man/man3/OSSL_CRMF_MSG_set1_regCtrl_regToken.3", + "doc/man/man3/OSSL_CRMF_MSG_set1_regInfo_certReq.3", + "doc/man/man3/OSSL_CRMF_pbmp_new.3", + "doc/man/man3/OSSL_DECODER.3", + "doc/man/man3/OSSL_DECODER_CTX.3", + "doc/man/man3/OSSL_DECODER_CTX_new_for_pkey.3", + "doc/man/man3/OSSL_DECODER_from_bio.3", + "doc/man/man3/OSSL_DISPATCH.3", + "doc/man/man3/OSSL_ENCODER.3", + "doc/man/man3/OSSL_ENCODER_CTX.3", + "doc/man/man3/OSSL_ENCODER_CTX_new_for_pkey.3", + "doc/man/man3/OSSL_ENCODER_to_bio.3", + "doc/man/man3/OSSL_ERR_STATE_save.3", + "doc/man/man3/OSSL_ESS_check_signing_certs.3", + "doc/man/man3/OSSL_GENERAL_NAMES_print.3", + "doc/man/man3/OSSL_HPKE_CTX_new.3", + "doc/man/man3/OSSL_HTTP_REQ_CTX.3", + "doc/man/man3/OSSL_HTTP_parse_url.3", + "doc/man/man3/OSSL_HTTP_transfer.3", + "doc/man/man3/OSSL_IETF_ATTR_SYNTAX.3", + "doc/man/man3/OSSL_IETF_ATTR_SYNTAX_print.3", + "doc/man/man3/OSSL_INDICATOR_set_callback.3", + "doc/man/man3/OSSL_ITEM.3", + "doc/man/man3/OSSL_LIB_CTX.3", + "doc/man/man3/OSSL_LIB_CTX_set_conf_diagnostics.3", + "doc/man/man3/OSSL_PARAM.3", + "doc/man/man3/OSSL_PARAM_BLD.3", + "doc/man/man3/OSSL_PARAM_allocate_from_text.3", + "doc/man/man3/OSSL_PARAM_dup.3", + "doc/man/man3/OSSL_PARAM_int.3", + "doc/man/man3/OSSL_PARAM_print_to_bio.3", + "doc/man/man3/OSSL_PROVIDER.3", + "doc/man/man3/OSSL_QUIC_client_method.3", + "doc/man/man3/OSSL_SELF_TEST_new.3", + "doc/man/man3/OSSL_SELF_TEST_set_callback.3", + "doc/man/man3/OSSL_STORE_INFO.3", + "doc/man/man3/OSSL_STORE_LOADER.3", + "doc/man/man3/OSSL_STORE_SEARCH.3", + "doc/man/man3/OSSL_STORE_attach.3", + "doc/man/man3/OSSL_STORE_expect.3", + "doc/man/man3/OSSL_STORE_open.3", + "doc/man/man3/OSSL_sleep.3", + "doc/man/man3/OSSL_trace_enabled.3", + "doc/man/man3/OSSL_trace_get_category_num.3", + "doc/man/man3/OSSL_trace_set_channel.3", + "doc/man/man3/OpenSSL_add_all_algorithms.3", + "doc/man/man3/OpenSSL_version.3", + "doc/man/man3/PBMAC1_get1_pbkdf2_param.3", + "doc/man/man3/PEM_X509_INFO_read_bio_ex.3", + "doc/man/man3/PEM_bytes_read_bio.3", + "doc/man/man3/PEM_read.3", + "doc/man/man3/PEM_read_CMS.3", + "doc/man/man3/PEM_read_bio_PrivateKey.3", + "doc/man/man3/PEM_read_bio_ex.3", + "doc/man/man3/PEM_write_bio_CMS_stream.3", + "doc/man/man3/PEM_write_bio_PKCS7_stream.3", + "doc/man/man3/PKCS12_PBE_keyivgen.3", + "doc/man/man3/PKCS12_SAFEBAG_create_cert.3", + "doc/man/man3/PKCS12_SAFEBAG_get0_attrs.3", + "doc/man/man3/PKCS12_SAFEBAG_get1_cert.3", + "doc/man/man3/PKCS12_SAFEBAG_set0_attrs.3", + "doc/man/man3/PKCS12_add1_attr_by_NID.3", + "doc/man/man3/PKCS12_add_CSPName_asc.3", + "doc/man/man3/PKCS12_add_cert.3", + "doc/man/man3/PKCS12_add_friendlyname_asc.3", + "doc/man/man3/PKCS12_add_localkeyid.3", + "doc/man/man3/PKCS12_add_safe.3", + "doc/man/man3/PKCS12_create.3", + "doc/man/man3/PKCS12_decrypt_skey.3", + "doc/man/man3/PKCS12_gen_mac.3", + "doc/man/man3/PKCS12_get_friendlyname.3", + "doc/man/man3/PKCS12_init.3", + "doc/man/man3/PKCS12_item_decrypt_d2i.3", + "doc/man/man3/PKCS12_key_gen_utf8_ex.3", + "doc/man/man3/PKCS12_newpass.3", + "doc/man/man3/PKCS12_pack_p7encdata.3", + "doc/man/man3/PKCS12_parse.3", + "doc/man/man3/PKCS5_PBE_keyivgen.3", + "doc/man/man3/PKCS5_PBKDF2_HMAC.3", + "doc/man/man3/PKCS7_decrypt.3", + "doc/man/man3/PKCS7_encrypt.3", + "doc/man/man3/PKCS7_get_octet_string.3", + "doc/man/man3/PKCS7_sign.3", + "doc/man/man3/PKCS7_sign_add_signer.3", + "doc/man/man3/PKCS7_type_is_other.3", + "doc/man/man3/PKCS7_verify.3", + "doc/man/man3/PKCS8_encrypt.3", + "doc/man/man3/PKCS8_pkey_add1_attr.3", + "doc/man/man3/RAND_add.3", + "doc/man/man3/RAND_bytes.3", + "doc/man/man3/RAND_cleanup.3", + "doc/man/man3/RAND_egd.3", + "doc/man/man3/RAND_get0_primary.3", + "doc/man/man3/RAND_load_file.3", + "doc/man/man3/RAND_set_DRBG_type.3", + "doc/man/man3/RAND_set_rand_method.3", + "doc/man/man3/RC4_set_key.3", + "doc/man/man3/RIPEMD160_Init.3", + "doc/man/man3/RSA_blinding_on.3", + "doc/man/man3/RSA_check_key.3", + "doc/man/man3/RSA_generate_key.3", + "doc/man/man3/RSA_get0_key.3", + "doc/man/man3/RSA_meth_new.3", + "doc/man/man3/RSA_new.3", + "doc/man/man3/RSA_padding_add_PKCS1_type_1.3", + "doc/man/man3/RSA_print.3", + "doc/man/man3/RSA_private_encrypt.3", + "doc/man/man3/RSA_public_encrypt.3", + "doc/man/man3/RSA_set_method.3", + "doc/man/man3/RSA_sign.3", + "doc/man/man3/RSA_sign_ASN1_OCTET_STRING.3", + "doc/man/man3/RSA_size.3", + "doc/man/man3/SCT_new.3", + "doc/man/man3/SCT_print.3", + "doc/man/man3/SCT_validate.3", + "doc/man/man3/SHA256_Init.3", + "doc/man/man3/SMIME_read_ASN1.3", + "doc/man/man3/SMIME_read_CMS.3", + "doc/man/man3/SMIME_read_PKCS7.3", + "doc/man/man3/SMIME_write_ASN1.3", + "doc/man/man3/SMIME_write_CMS.3", + "doc/man/man3/SMIME_write_PKCS7.3", + "doc/man/man3/SRP_Calc_B.3", + "doc/man/man3/SRP_VBASE_new.3", + "doc/man/man3/SRP_create_verifier.3", + "doc/man/man3/SRP_user_pwd_new.3", + "doc/man/man3/SSL_CIPHER_get_name.3", + "doc/man/man3/SSL_COMP_add_compression_method.3", + "doc/man/man3/SSL_CONF_CTX_new.3", + "doc/man/man3/SSL_CONF_CTX_set1_prefix.3", + "doc/man/man3/SSL_CONF_CTX_set_flags.3", + "doc/man/man3/SSL_CONF_CTX_set_ssl_ctx.3", + "doc/man/man3/SSL_CONF_cmd.3", + "doc/man/man3/SSL_CONF_cmd_argv.3", + "doc/man/man3/SSL_CTX_add1_chain_cert.3", + "doc/man/man3/SSL_CTX_add_extra_chain_cert.3", + "doc/man/man3/SSL_CTX_add_session.3", + "doc/man/man3/SSL_CTX_config.3", + "doc/man/man3/SSL_CTX_ctrl.3", + "doc/man/man3/SSL_CTX_dane_enable.3", + "doc/man/man3/SSL_CTX_flush_sessions.3", + "doc/man/man3/SSL_CTX_free.3", + "doc/man/man3/SSL_CTX_get0_param.3", + "doc/man/man3/SSL_CTX_get_verify_mode.3", + "doc/man/man3/SSL_CTX_has_client_custom_ext.3", + "doc/man/man3/SSL_CTX_load_verify_locations.3", + "doc/man/man3/SSL_CTX_new.3", + "doc/man/man3/SSL_CTX_sess_number.3", + "doc/man/man3/SSL_CTX_sess_set_cache_size.3", + "doc/man/man3/SSL_CTX_sess_set_get_cb.3", + "doc/man/man3/SSL_CTX_sessions.3", + "doc/man/man3/SSL_CTX_set0_CA_list.3", + "doc/man/man3/SSL_CTX_set1_cert_comp_preference.3", + "doc/man/man3/SSL_CTX_set1_curves.3", + "doc/man/man3/SSL_CTX_set1_sigalgs.3", + "doc/man/man3/SSL_CTX_set1_verify_cert_store.3", + "doc/man/man3/SSL_CTX_set_alpn_select_cb.3", + "doc/man/man3/SSL_CTX_set_cert_cb.3", + "doc/man/man3/SSL_CTX_set_cert_store.3", + "doc/man/man3/SSL_CTX_set_cert_verify_callback.3", + "doc/man/man3/SSL_CTX_set_cipher_list.3", + "doc/man/man3/SSL_CTX_set_client_cert_cb.3", + "doc/man/man3/SSL_CTX_set_client_hello_cb.3", + "doc/man/man3/SSL_CTX_set_ct_validation_callback.3", + "doc/man/man3/SSL_CTX_set_ctlog_list_file.3", + "doc/man/man3/SSL_CTX_set_default_passwd_cb.3", + "doc/man/man3/SSL_CTX_set_domain_flags.3", + "doc/man/man3/SSL_CTX_set_generate_session_id.3", + "doc/man/man3/SSL_CTX_set_info_callback.3", + "doc/man/man3/SSL_CTX_set_keylog_callback.3", + "doc/man/man3/SSL_CTX_set_max_cert_list.3", + "doc/man/man3/SSL_CTX_set_min_proto_version.3", + "doc/man/man3/SSL_CTX_set_mode.3", + "doc/man/man3/SSL_CTX_set_msg_callback.3", + "doc/man/man3/SSL_CTX_set_new_pending_conn_cb.3", + "doc/man/man3/SSL_CTX_set_num_tickets.3", + "doc/man/man3/SSL_CTX_set_options.3", + "doc/man/man3/SSL_CTX_set_psk_client_callback.3", + "doc/man/man3/SSL_CTX_set_quiet_shutdown.3", + "doc/man/man3/SSL_CTX_set_read_ahead.3", + "doc/man/man3/SSL_CTX_set_record_padding_callback.3", + "doc/man/man3/SSL_CTX_set_security_level.3", + "doc/man/man3/SSL_CTX_set_session_cache_mode.3", + "doc/man/man3/SSL_CTX_set_session_id_context.3", + "doc/man/man3/SSL_CTX_set_session_ticket_cb.3", + "doc/man/man3/SSL_CTX_set_split_send_fragment.3", + "doc/man/man3/SSL_CTX_set_srp_password.3", + "doc/man/man3/SSL_CTX_set_ssl_version.3", + "doc/man/man3/SSL_CTX_set_stateless_cookie_generate_cb.3", + "doc/man/man3/SSL_CTX_set_timeout.3", + "doc/man/man3/SSL_CTX_set_tlsext_servername_callback.3", + "doc/man/man3/SSL_CTX_set_tlsext_status_cb.3", + "doc/man/man3/SSL_CTX_set_tlsext_ticket_key_cb.3", + "doc/man/man3/SSL_CTX_set_tlsext_use_srtp.3", + "doc/man/man3/SSL_CTX_set_tmp_dh_callback.3", + "doc/man/man3/SSL_CTX_set_tmp_ecdh.3", + "doc/man/man3/SSL_CTX_set_verify.3", + "doc/man/man3/SSL_CTX_use_certificate.3", + "doc/man/man3/SSL_CTX_use_psk_identity_hint.3", + "doc/man/man3/SSL_CTX_use_serverinfo.3", + "doc/man/man3/SSL_SESSION_free.3", + "doc/man/man3/SSL_SESSION_get0_cipher.3", + "doc/man/man3/SSL_SESSION_get0_hostname.3", + "doc/man/man3/SSL_SESSION_get0_id_context.3", + "doc/man/man3/SSL_SESSION_get0_peer.3", + "doc/man/man3/SSL_SESSION_get_compress_id.3", + "doc/man/man3/SSL_SESSION_get_protocol_version.3", + "doc/man/man3/SSL_SESSION_get_time.3", + "doc/man/man3/SSL_SESSION_has_ticket.3", + "doc/man/man3/SSL_SESSION_is_resumable.3", + "doc/man/man3/SSL_SESSION_print.3", + "doc/man/man3/SSL_SESSION_set1_id.3", + "doc/man/man3/SSL_accept.3", + "doc/man/man3/SSL_accept_stream.3", + "doc/man/man3/SSL_alert_type_string.3", + "doc/man/man3/SSL_alloc_buffers.3", + "doc/man/man3/SSL_check_chain.3", + "doc/man/man3/SSL_clear.3", + "doc/man/man3/SSL_connect.3", + "doc/man/man3/SSL_do_handshake.3", + "doc/man/man3/SSL_export_keying_material.3", + "doc/man/man3/SSL_extension_supported.3", + "doc/man/man3/SSL_free.3", + "doc/man/man3/SSL_get0_connection.3", + "doc/man/man3/SSL_get0_group_name.3", + "doc/man/man3/SSL_get0_peer_rpk.3", + "doc/man/man3/SSL_get0_peer_scts.3", + "doc/man/man3/SSL_get1_builtin_sigalgs.3", + "doc/man/man3/SSL_get_SSL_CTX.3", + "doc/man/man3/SSL_get_all_async_fds.3", + "doc/man/man3/SSL_get_certificate.3", + "doc/man/man3/SSL_get_ciphers.3", + "doc/man/man3/SSL_get_client_random.3", + "doc/man/man3/SSL_get_conn_close_info.3", + "doc/man/man3/SSL_get_current_cipher.3", + "doc/man/man3/SSL_get_default_timeout.3", + "doc/man/man3/SSL_get_error.3", + "doc/man/man3/SSL_get_event_timeout.3", + "doc/man/man3/SSL_get_extms_support.3", + "doc/man/man3/SSL_get_fd.3", + "doc/man/man3/SSL_get_handshake_rtt.3", + "doc/man/man3/SSL_get_peer_cert_chain.3", + "doc/man/man3/SSL_get_peer_certificate.3", + "doc/man/man3/SSL_get_peer_signature_nid.3", + "doc/man/man3/SSL_get_peer_tmp_key.3", + "doc/man/man3/SSL_get_psk_identity.3", + "doc/man/man3/SSL_get_rbio.3", + "doc/man/man3/SSL_get_rpoll_descriptor.3", + "doc/man/man3/SSL_get_session.3", + "doc/man/man3/SSL_get_shared_sigalgs.3", + "doc/man/man3/SSL_get_stream_id.3", + "doc/man/man3/SSL_get_stream_read_state.3", + "doc/man/man3/SSL_get_value_uint.3", + "doc/man/man3/SSL_get_verify_result.3", + "doc/man/man3/SSL_get_version.3", + "doc/man/man3/SSL_group_to_name.3", + "doc/man/man3/SSL_handle_events.3", + "doc/man/man3/SSL_in_init.3", + "doc/man/man3/SSL_inject_net_dgram.3", + "doc/man/man3/SSL_key_update.3", + "doc/man/man3/SSL_library_init.3", + "doc/man/man3/SSL_load_client_CA_file.3", + "doc/man/man3/SSL_new.3", + "doc/man/man3/SSL_new_domain.3", + "doc/man/man3/SSL_new_listener.3", + "doc/man/man3/SSL_new_stream.3", + "doc/man/man3/SSL_pending.3", + "doc/man/man3/SSL_poll.3", + "doc/man/man3/SSL_read.3", + "doc/man/man3/SSL_read_early_data.3", + "doc/man/man3/SSL_rstate_string.3", + "doc/man/man3/SSL_session_reused.3", + "doc/man/man3/SSL_set1_host.3", + "doc/man/man3/SSL_set1_initial_peer_addr.3", + "doc/man/man3/SSL_set1_server_cert_type.3", + "doc/man/man3/SSL_set_async_callback.3", + "doc/man/man3/SSL_set_bio.3", + "doc/man/man3/SSL_set_blocking_mode.3", + "doc/man/man3/SSL_set_connect_state.3", + "doc/man/man3/SSL_set_default_stream_mode.3", + "doc/man/man3/SSL_set_fd.3", + "doc/man/man3/SSL_set_incoming_stream_policy.3", + "doc/man/man3/SSL_set_quic_tls_cbs.3", + "doc/man/man3/SSL_set_retry_verify.3", + "doc/man/man3/SSL_set_session.3", + "doc/man/man3/SSL_set_session_secret_cb.3", + "doc/man/man3/SSL_set_shutdown.3", + "doc/man/man3/SSL_set_verify_result.3", + "doc/man/man3/SSL_shutdown.3", + "doc/man/man3/SSL_state_string.3", + "doc/man/man3/SSL_stream_conclude.3", + "doc/man/man3/SSL_stream_reset.3", + "doc/man/man3/SSL_want.3", + "doc/man/man3/SSL_write.3", + "doc/man/man3/TS_RESP_CTX_new.3", + "doc/man/man3/TS_VERIFY_CTX.3", + "doc/man/man3/UI_STRING.3", + "doc/man/man3/UI_UTIL_read_pw.3", + "doc/man/man3/UI_create_method.3", + "doc/man/man3/UI_new.3", + "doc/man/man3/X509V3_EXT_print.3", + "doc/man/man3/X509V3_get_d2i.3", + "doc/man/man3/X509V3_set_ctx.3", + "doc/man/man3/X509_ACERT_add1_attr.3", + "doc/man/man3/X509_ACERT_add_attr_nconf.3", + "doc/man/man3/X509_ACERT_get0_holder_baseCertId.3", + "doc/man/man3/X509_ACERT_get_attr.3", + "doc/man/man3/X509_ACERT_print_ex.3", + "doc/man/man3/X509_ALGOR_dup.3", + "doc/man/man3/X509_ATTRIBUTE.3", + "doc/man/man3/X509_CRL_get0_by_serial.3", + "doc/man/man3/X509_EXTENSION_set_object.3", + "doc/man/man3/X509_LOOKUP.3", + "doc/man/man3/X509_LOOKUP_hash_dir.3", + "doc/man/man3/X509_LOOKUP_meth_new.3", + "doc/man/man3/X509_NAME_ENTRY_get_object.3", + "doc/man/man3/X509_NAME_add_entry_by_txt.3", + "doc/man/man3/X509_NAME_get0_der.3", + "doc/man/man3/X509_NAME_get_index_by_NID.3", + "doc/man/man3/X509_NAME_print_ex.3", + "doc/man/man3/X509_PUBKEY_new.3", + "doc/man/man3/X509_REQ_get_attr.3", + "doc/man/man3/X509_REQ_get_extensions.3", + "doc/man/man3/X509_SIG_get0.3", + "doc/man/man3/X509_STORE_CTX_get_by_subject.3", + "doc/man/man3/X509_STORE_CTX_get_error.3", + "doc/man/man3/X509_STORE_CTX_new.3", + "doc/man/man3/X509_STORE_CTX_set_verify_cb.3", + "doc/man/man3/X509_STORE_add_cert.3", + "doc/man/man3/X509_STORE_get0_param.3", + "doc/man/man3/X509_STORE_new.3", + "doc/man/man3/X509_STORE_set_verify_cb_func.3", + "doc/man/man3/X509_VERIFY_PARAM_set_flags.3", + "doc/man/man3/X509_add_cert.3", + "doc/man/man3/X509_check_ca.3", + "doc/man/man3/X509_check_host.3", + "doc/man/man3/X509_check_issued.3", + "doc/man/man3/X509_check_private_key.3", + "doc/man/man3/X509_check_purpose.3", + "doc/man/man3/X509_cmp.3", + "doc/man/man3/X509_cmp_time.3", + "doc/man/man3/X509_digest.3", + "doc/man/man3/X509_dup.3", + "doc/man/man3/X509_get0_distinguishing_id.3", + "doc/man/man3/X509_get0_notBefore.3", + "doc/man/man3/X509_get0_signature.3", + "doc/man/man3/X509_get0_uids.3", + "doc/man/man3/X509_get_default_cert_file.3", + "doc/man/man3/X509_get_extension_flags.3", + "doc/man/man3/X509_get_pubkey.3", + "doc/man/man3/X509_get_serialNumber.3", + "doc/man/man3/X509_get_subject_name.3", + "doc/man/man3/X509_get_version.3", + "doc/man/man3/X509_load_http.3", + "doc/man/man3/X509_new.3", + "doc/man/man3/X509_sign.3", + "doc/man/man3/X509_verify.3", + "doc/man/man3/X509_verify_cert.3", + "doc/man/man3/X509v3_get_ext_by_NID.3", + "doc/man/man3/b2i_PVK_bio_ex.3", + "doc/man/man3/d2i_PKCS8PrivateKey_bio.3", + "doc/man/man3/d2i_PrivateKey.3", + "doc/man/man3/d2i_RSAPrivateKey.3", + "doc/man/man3/d2i_SSL_SESSION.3", + "doc/man/man3/d2i_X509.3", + "doc/man/man3/i2d_CMS_bio_stream.3", + "doc/man/man3/i2d_PKCS7_bio_stream.3", + "doc/man/man3/i2d_re_X509_tbs.3", + "doc/man/man3/o2i_SCT_LIST.3", + "doc/man/man3/s2i_ASN1_IA5STRING.3" + ], + "man5" => [ + "doc/man/man5/config.5", + "doc/man/man5/fips_config.5", + "doc/man/man5/x509v3_config.5" + ], + "man7" => [ + "doc/man/man7/EVP_ASYM_CIPHER-RSA.7", + "doc/man/man7/EVP_ASYM_CIPHER-SM2.7", + "doc/man/man7/EVP_CIPHER-AES.7", + "doc/man/man7/EVP_CIPHER-ARIA.7", + "doc/man/man7/EVP_CIPHER-BLOWFISH.7", + "doc/man/man7/EVP_CIPHER-CAMELLIA.7", + "doc/man/man7/EVP_CIPHER-CAST.7", + "doc/man/man7/EVP_CIPHER-CHACHA.7", + "doc/man/man7/EVP_CIPHER-DES.7", + "doc/man/man7/EVP_CIPHER-IDEA.7", + "doc/man/man7/EVP_CIPHER-NULL.7", + "doc/man/man7/EVP_CIPHER-RC2.7", + "doc/man/man7/EVP_CIPHER-RC4.7", + "doc/man/man7/EVP_CIPHER-RC5.7", + "doc/man/man7/EVP_CIPHER-SEED.7", + "doc/man/man7/EVP_CIPHER-SM4.7", + "doc/man/man7/EVP_KDF-ARGON2.7", + "doc/man/man7/EVP_KDF-HKDF.7", + "doc/man/man7/EVP_KDF-HMAC-DRBG.7", + "doc/man/man7/EVP_KDF-KB.7", + "doc/man/man7/EVP_KDF-KRB5KDF.7", + "doc/man/man7/EVP_KDF-PBKDF1.7", + "doc/man/man7/EVP_KDF-PBKDF2.7", + "doc/man/man7/EVP_KDF-PKCS12KDF.7", + "doc/man/man7/EVP_KDF-PVKKDF.7", + "doc/man/man7/EVP_KDF-SCRYPT.7", + "doc/man/man7/EVP_KDF-SS.7", + "doc/man/man7/EVP_KDF-SSHKDF.7", + "doc/man/man7/EVP_KDF-TLS13_KDF.7", + "doc/man/man7/EVP_KDF-TLS1_PRF.7", + "doc/man/man7/EVP_KDF-X942-ASN1.7", + "doc/man/man7/EVP_KDF-X942-CONCAT.7", + "doc/man/man7/EVP_KDF-X963.7", + "doc/man/man7/EVP_KEM-EC.7", + "doc/man/man7/EVP_KEM-ML-KEM.7", + "doc/man/man7/EVP_KEM-RSA.7", + "doc/man/man7/EVP_KEM-X25519.7", + "doc/man/man7/EVP_KEYEXCH-DH.7", + "doc/man/man7/EVP_KEYEXCH-ECDH.7", + "doc/man/man7/EVP_KEYEXCH-X25519.7", + "doc/man/man7/EVP_MAC-BLAKE2.7", + "doc/man/man7/EVP_MAC-CMAC.7", + "doc/man/man7/EVP_MAC-GMAC.7", + "doc/man/man7/EVP_MAC-HMAC.7", + "doc/man/man7/EVP_MAC-KMAC.7", + "doc/man/man7/EVP_MAC-Poly1305.7", + "doc/man/man7/EVP_MAC-Siphash.7", + "doc/man/man7/EVP_MD-BLAKE2.7", + "doc/man/man7/EVP_MD-KECCAK.7", + "doc/man/man7/EVP_MD-MD2.7", + "doc/man/man7/EVP_MD-MD4.7", + "doc/man/man7/EVP_MD-MD5-SHA1.7", + "doc/man/man7/EVP_MD-MD5.7", + "doc/man/man7/EVP_MD-MDC2.7", + "doc/man/man7/EVP_MD-NULL.7", + "doc/man/man7/EVP_MD-RIPEMD160.7", + "doc/man/man7/EVP_MD-SHA1.7", + "doc/man/man7/EVP_MD-SHA2.7", + "doc/man/man7/EVP_MD-SHA3.7", + "doc/man/man7/EVP_MD-SHAKE.7", + "doc/man/man7/EVP_MD-SM3.7", + "doc/man/man7/EVP_MD-WHIRLPOOL.7", + "doc/man/man7/EVP_MD-common.7", + "doc/man/man7/EVP_PKEY-DH.7", + "doc/man/man7/EVP_PKEY-DSA.7", + "doc/man/man7/EVP_PKEY-EC.7", + "doc/man/man7/EVP_PKEY-FFC.7", + "doc/man/man7/EVP_PKEY-HMAC.7", + "doc/man/man7/EVP_PKEY-ML-DSA.7", + "doc/man/man7/EVP_PKEY-ML-KEM.7", + "doc/man/man7/EVP_PKEY-RSA.7", + "doc/man/man7/EVP_PKEY-SLH-DSA.7", + "doc/man/man7/EVP_PKEY-SM2.7", + "doc/man/man7/EVP_PKEY-X25519.7", + "doc/man/man7/EVP_RAND-CRNG-TEST.7", + "doc/man/man7/EVP_RAND-CTR-DRBG.7", + "doc/man/man7/EVP_RAND-HASH-DRBG.7", + "doc/man/man7/EVP_RAND-HMAC-DRBG.7", + "doc/man/man7/EVP_RAND-JITTER.7", + "doc/man/man7/EVP_RAND-SEED-SRC.7", + "doc/man/man7/EVP_RAND-TEST-RAND.7", + "doc/man/man7/EVP_RAND.7", + "doc/man/man7/EVP_SIGNATURE-DSA.7", + "doc/man/man7/EVP_SIGNATURE-ECDSA.7", + "doc/man/man7/EVP_SIGNATURE-ED25519.7", + "doc/man/man7/EVP_SIGNATURE-HMAC.7", + "doc/man/man7/EVP_SIGNATURE-ML-DSA.7", + "doc/man/man7/EVP_SIGNATURE-RSA.7", + "doc/man/man7/EVP_SIGNATURE-SLH-DSA.7", + "doc/man/man7/OSSL_PROVIDER-FIPS.7", + "doc/man/man7/OSSL_PROVIDER-base.7", + "doc/man/man7/OSSL_PROVIDER-default.7", + "doc/man/man7/OSSL_PROVIDER-legacy.7", + "doc/man/man7/OSSL_PROVIDER-null.7", + "doc/man/man7/OSSL_STORE-winstore.7", + "doc/man/man7/RAND.7", + "doc/man/man7/RSA-PSS.7", + "doc/man/man7/X25519.7", + "doc/man/man7/bio.7", + "doc/man/man7/ct.7", + "doc/man/man7/des_modes.7", + "doc/man/man7/evp.7", + "doc/man/man7/fips_module.7", + "doc/man/man7/life_cycle-cipher.7", + "doc/man/man7/life_cycle-digest.7", + "doc/man/man7/life_cycle-kdf.7", + "doc/man/man7/life_cycle-mac.7", + "doc/man/man7/life_cycle-pkey.7", + "doc/man/man7/life_cycle-rand.7", + "doc/man/man7/openssl-core.h.7", + "doc/man/man7/openssl-core_dispatch.h.7", + "doc/man/man7/openssl-core_names.h.7", + "doc/man/man7/openssl-env.7", + "doc/man/man7/openssl-glossary.7", + "doc/man/man7/openssl-qlog.7", + "doc/man/man7/openssl-quic-concurrency.7", + "doc/man/man7/openssl-quic.7", + "doc/man/man7/openssl-threads.7", + "doc/man/man7/openssl_user_macros.7", + "doc/man/man7/ossl-guide-introduction.7", + "doc/man/man7/ossl-guide-libcrypto-introduction.7", + "doc/man/man7/ossl-guide-libraries-introduction.7", + "doc/man/man7/ossl-guide-libssl-introduction.7", + "doc/man/man7/ossl-guide-migration.7", + "doc/man/man7/ossl-guide-quic-client-block.7", + "doc/man/man7/ossl-guide-quic-client-non-block.7", + "doc/man/man7/ossl-guide-quic-introduction.7", + "doc/man/man7/ossl-guide-quic-multi-stream.7", + "doc/man/man7/ossl-guide-quic-server-block.7", + "doc/man/man7/ossl-guide-quic-server-non-block.7", + "doc/man/man7/ossl-guide-tls-client-block.7", + "doc/man/man7/ossl-guide-tls-client-non-block.7", + "doc/man/man7/ossl-guide-tls-introduction.7", + "doc/man/man7/ossl-guide-tls-server-block.7", + "doc/man/man7/ossl_store-file.7", + "doc/man/man7/ossl_store.7", + "doc/man/man7/passphrase-encoding.7", + "doc/man/man7/property.7", + "doc/man/man7/provider-asym_cipher.7", + "doc/man/man7/provider-base.7", + "doc/man/man7/provider-cipher.7", + "doc/man/man7/provider-decoder.7", + "doc/man/man7/provider-digest.7", + "doc/man/man7/provider-encoder.7", + "doc/man/man7/provider-kdf.7", + "doc/man/man7/provider-kem.7", + "doc/man/man7/provider-keyexch.7", + "doc/man/man7/provider-keymgmt.7", + "doc/man/man7/provider-mac.7", + "doc/man/man7/provider-object.7", + "doc/man/man7/provider-rand.7", + "doc/man/man7/provider-signature.7", + "doc/man/man7/provider-skeymgmt.7", + "doc/man/man7/provider-storemgmt.7", + "doc/man/man7/provider.7", + "doc/man/man7/proxy-certificates.7", + "doc/man/man7/x509.7" + ] + }, + "modules" => [ + "providers/fips", + "providers/legacy" + ], + "programs" => [ + "apps/openssl" + ], + "scripts" => [ + "apps/CA.pl", + "apps/tsget.pl", + "tools/c_rehash", + "util/shlib_wrap.sh", + "util/wrap.pl" + ], + "shared_sources" => {}, + "sources" => { + "apps/CA.pl" => [ + "apps/CA.pl.in" + ], + "apps/lib/libapps-lib-app_libctx.o" => [ + "apps/lib/app_libctx.c" + ], + "apps/lib/libapps-lib-app_params.o" => [ + "apps/lib/app_params.c" + ], + "apps/lib/libapps-lib-app_provider.o" => [ + "apps/lib/app_provider.c" + ], + "apps/lib/libapps-lib-app_rand.o" => [ + "apps/lib/app_rand.c" + ], + "apps/lib/libapps-lib-app_x509.o" => [ + "apps/lib/app_x509.c" + ], + "apps/lib/libapps-lib-apps.o" => [ + "apps/lib/apps.c" + ], + "apps/lib/libapps-lib-apps_opt_printf.o" => [ + "apps/lib/apps_opt_printf.c" + ], + "apps/lib/libapps-lib-apps_ui.o" => [ + "apps/lib/apps_ui.c" + ], + "apps/lib/libapps-lib-columns.o" => [ + "apps/lib/columns.c" + ], + "apps/lib/libapps-lib-engine.o" => [ + "apps/lib/engine.c" + ], + "apps/lib/libapps-lib-engine_loader.o" => [ + "apps/lib/engine_loader.c" + ], + "apps/lib/libapps-lib-fmt.o" => [ + "apps/lib/fmt.c" + ], + "apps/lib/libapps-lib-http_server.o" => [ + "apps/lib/http_server.c" + ], + "apps/lib/libapps-lib-log.o" => [ + "apps/lib/log.c" + ], + "apps/lib/libapps-lib-names.o" => [ + "apps/lib/names.c" + ], + "apps/lib/libapps-lib-opt.o" => [ + "apps/lib/opt.c" + ], + "apps/lib/libapps-lib-s_cb.o" => [ + "apps/lib/s_cb.c" + ], + "apps/lib/libapps-lib-s_socket.o" => [ + "apps/lib/s_socket.c" + ], + "apps/lib/libapps-lib-tlssrp_depr.o" => [ + "apps/lib/tlssrp_depr.c" + ], + "apps/lib/openssl-bin-cmp_mock_srv.o" => [ + "apps/lib/cmp_mock_srv.c" + ], + "apps/libapps.a" => [ + "apps/lib/libapps-lib-app_libctx.o", + "apps/lib/libapps-lib-app_params.o", + "apps/lib/libapps-lib-app_provider.o", + "apps/lib/libapps-lib-app_rand.o", + "apps/lib/libapps-lib-app_x509.o", + "apps/lib/libapps-lib-apps.o", + "apps/lib/libapps-lib-apps_opt_printf.o", + "apps/lib/libapps-lib-apps_ui.o", + "apps/lib/libapps-lib-columns.o", + "apps/lib/libapps-lib-engine.o", + "apps/lib/libapps-lib-engine_loader.o", + "apps/lib/libapps-lib-fmt.o", + "apps/lib/libapps-lib-http_server.o", + "apps/lib/libapps-lib-log.o", + "apps/lib/libapps-lib-names.o", + "apps/lib/libapps-lib-opt.o", + "apps/lib/libapps-lib-s_cb.o", + "apps/lib/libapps-lib-s_socket.o", + "apps/lib/libapps-lib-tlssrp_depr.o" + ], + "apps/openssl" => [ + "apps/lib/openssl-bin-cmp_mock_srv.o", + "apps/openssl-bin-asn1parse.o", + "apps/openssl-bin-ca.o", + "apps/openssl-bin-ciphers.o", + "apps/openssl-bin-cmp.o", + "apps/openssl-bin-cms.o", + "apps/openssl-bin-crl.o", + "apps/openssl-bin-crl2pkcs7.o", + "apps/openssl-bin-dgst.o", + "apps/openssl-bin-dhparam.o", + "apps/openssl-bin-dsa.o", + "apps/openssl-bin-dsaparam.o", + "apps/openssl-bin-ec.o", + "apps/openssl-bin-ecparam.o", + "apps/openssl-bin-enc.o", + "apps/openssl-bin-engine.o", + "apps/openssl-bin-errstr.o", + "apps/openssl-bin-fipsinstall.o", + "apps/openssl-bin-gendsa.o", + "apps/openssl-bin-genpkey.o", + "apps/openssl-bin-genrsa.o", + "apps/openssl-bin-info.o", + "apps/openssl-bin-kdf.o", + "apps/openssl-bin-list.o", + "apps/openssl-bin-mac.o", + "apps/openssl-bin-nseq.o", + "apps/openssl-bin-ocsp.o", + "apps/openssl-bin-openssl.o", + "apps/openssl-bin-passwd.o", + "apps/openssl-bin-pkcs12.o", + "apps/openssl-bin-pkcs7.o", + "apps/openssl-bin-pkcs8.o", + "apps/openssl-bin-pkey.o", + "apps/openssl-bin-pkeyparam.o", + "apps/openssl-bin-pkeyutl.o", + "apps/openssl-bin-prime.o", + "apps/openssl-bin-progs.o", + "apps/openssl-bin-rand.o", + "apps/openssl-bin-rehash.o", + "apps/openssl-bin-req.o", + "apps/openssl-bin-rsa.o", + "apps/openssl-bin-rsautl.o", + "apps/openssl-bin-s_client.o", + "apps/openssl-bin-s_server.o", + "apps/openssl-bin-s_time.o", + "apps/openssl-bin-sess_id.o", + "apps/openssl-bin-skeyutl.o", + "apps/openssl-bin-smime.o", + "apps/openssl-bin-speed.o", + "apps/openssl-bin-spkac.o", + "apps/openssl-bin-srp.o", + "apps/openssl-bin-storeutl.o", + "apps/openssl-bin-ts.o", + "apps/openssl-bin-verify.o", + "apps/openssl-bin-version.o", + "apps/openssl-bin-x509.o" + ], + "apps/openssl-bin-asn1parse.o" => [ + "apps/asn1parse.c" + ], + "apps/openssl-bin-ca.o" => [ + "apps/ca.c" + ], + "apps/openssl-bin-ciphers.o" => [ + "apps/ciphers.c" + ], + "apps/openssl-bin-cmp.o" => [ + "apps/cmp.c" + ], + "apps/openssl-bin-cms.o" => [ + "apps/cms.c" + ], + "apps/openssl-bin-crl.o" => [ + "apps/crl.c" + ], + "apps/openssl-bin-crl2pkcs7.o" => [ + "apps/crl2pkcs7.c" + ], + "apps/openssl-bin-dgst.o" => [ + "apps/dgst.c" + ], + "apps/openssl-bin-dhparam.o" => [ + "apps/dhparam.c" + ], + "apps/openssl-bin-dsa.o" => [ + "apps/dsa.c" + ], + "apps/openssl-bin-dsaparam.o" => [ + "apps/dsaparam.c" + ], + "apps/openssl-bin-ec.o" => [ + "apps/ec.c" + ], + "apps/openssl-bin-ecparam.o" => [ + "apps/ecparam.c" + ], + "apps/openssl-bin-enc.o" => [ + "apps/enc.c" + ], + "apps/openssl-bin-engine.o" => [ + "apps/engine.c" + ], + "apps/openssl-bin-errstr.o" => [ + "apps/errstr.c" + ], + "apps/openssl-bin-fipsinstall.o" => [ + "apps/fipsinstall.c" + ], + "apps/openssl-bin-gendsa.o" => [ + "apps/gendsa.c" + ], + "apps/openssl-bin-genpkey.o" => [ + "apps/genpkey.c" + ], + "apps/openssl-bin-genrsa.o" => [ + "apps/genrsa.c" + ], + "apps/openssl-bin-info.o" => [ + "apps/info.c" + ], + "apps/openssl-bin-kdf.o" => [ + "apps/kdf.c" + ], + "apps/openssl-bin-list.o" => [ + "apps/list.c" + ], + "apps/openssl-bin-mac.o" => [ + "apps/mac.c" + ], + "apps/openssl-bin-nseq.o" => [ + "apps/nseq.c" + ], + "apps/openssl-bin-ocsp.o" => [ + "apps/ocsp.c" + ], + "apps/openssl-bin-openssl.o" => [ + "apps/openssl.c" + ], + "apps/openssl-bin-passwd.o" => [ + "apps/passwd.c" + ], + "apps/openssl-bin-pkcs12.o" => [ + "apps/pkcs12.c" + ], + "apps/openssl-bin-pkcs7.o" => [ + "apps/pkcs7.c" + ], + "apps/openssl-bin-pkcs8.o" => [ + "apps/pkcs8.c" + ], + "apps/openssl-bin-pkey.o" => [ + "apps/pkey.c" + ], + "apps/openssl-bin-pkeyparam.o" => [ + "apps/pkeyparam.c" + ], + "apps/openssl-bin-pkeyutl.o" => [ + "apps/pkeyutl.c" + ], + "apps/openssl-bin-prime.o" => [ + "apps/prime.c" + ], + "apps/openssl-bin-progs.o" => [ + "apps/progs.c" + ], + "apps/openssl-bin-rand.o" => [ + "apps/rand.c" + ], + "apps/openssl-bin-rehash.o" => [ + "apps/rehash.c" + ], + "apps/openssl-bin-req.o" => [ + "apps/req.c" + ], + "apps/openssl-bin-rsa.o" => [ + "apps/rsa.c" + ], + "apps/openssl-bin-rsautl.o" => [ + "apps/rsautl.c" + ], + "apps/openssl-bin-s_client.o" => [ + "apps/s_client.c" + ], + "apps/openssl-bin-s_server.o" => [ + "apps/s_server.c" + ], + "apps/openssl-bin-s_time.o" => [ + "apps/s_time.c" + ], + "apps/openssl-bin-sess_id.o" => [ + "apps/sess_id.c" + ], + "apps/openssl-bin-skeyutl.o" => [ + "apps/skeyutl.c" + ], + "apps/openssl-bin-smime.o" => [ + "apps/smime.c" + ], + "apps/openssl-bin-speed.o" => [ + "apps/speed.c" + ], + "apps/openssl-bin-spkac.o" => [ + "apps/spkac.c" + ], + "apps/openssl-bin-srp.o" => [ + "apps/srp.c" + ], + "apps/openssl-bin-storeutl.o" => [ + "apps/storeutl.c" + ], + "apps/openssl-bin-ts.o" => [ + "apps/ts.c" + ], + "apps/openssl-bin-verify.o" => [ + "apps/verify.c" + ], + "apps/openssl-bin-version.o" => [ + "apps/version.c" + ], + "apps/openssl-bin-x509.o" => [ + "apps/x509.c" + ], + "apps/tsget.pl" => [ + "apps/tsget.in" + ], + "crypto/aes/libcrypto-lib-aes-riscv64-zkn.o" => [ + "crypto/aes/aes-riscv64-zkn.s" + ], + "crypto/aes/libcrypto-lib-aes-riscv64-zvbb-zvkg-zvkned.o" => [ + "crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s" + ], + "crypto/aes/libcrypto-lib-aes-riscv64-zvkb-zvkned.o" => [ + "crypto/aes/aes-riscv64-zvkb-zvkned.s" + ], + "crypto/aes/libcrypto-lib-aes-riscv64-zvkned.o" => [ + "crypto/aes/aes-riscv64-zvkned.s" + ], + "crypto/aes/libcrypto-lib-aes-riscv64.o" => [ + "crypto/aes/aes-riscv64.s" + ], + "crypto/aes/libcrypto-lib-aes_cbc.o" => [ + "crypto/aes/aes_cbc.c" + ], + "crypto/aes/libcrypto-lib-aes_cfb.o" => [ + "crypto/aes/aes_cfb.c" + ], + "crypto/aes/libcrypto-lib-aes_ecb.o" => [ + "crypto/aes/aes_ecb.c" + ], + "crypto/aes/libcrypto-lib-aes_ige.o" => [ + "crypto/aes/aes_ige.c" + ], + "crypto/aes/libcrypto-lib-aes_misc.o" => [ + "crypto/aes/aes_misc.c" + ], + "crypto/aes/libcrypto-lib-aes_ofb.o" => [ + "crypto/aes/aes_ofb.c" + ], + "crypto/aes/libcrypto-lib-aes_wrap.o" => [ + "crypto/aes/aes_wrap.c" + ], + "crypto/aes/libfips-lib-aes-riscv64-zkn.o" => [ + "crypto/aes/aes-riscv64-zkn.s" + ], + "crypto/aes/libfips-lib-aes-riscv64-zvbb-zvkg-zvkned.o" => [ + "crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s" + ], + "crypto/aes/libfips-lib-aes-riscv64-zvkb-zvkned.o" => [ + "crypto/aes/aes-riscv64-zvkb-zvkned.s" + ], + "crypto/aes/libfips-lib-aes-riscv64-zvkned.o" => [ + "crypto/aes/aes-riscv64-zvkned.s" + ], + "crypto/aes/libfips-lib-aes-riscv64.o" => [ + "crypto/aes/aes-riscv64.s" + ], + "crypto/aes/libfips-lib-aes_cbc.o" => [ + "crypto/aes/aes_cbc.c" + ], + "crypto/aes/libfips-lib-aes_ecb.o" => [ + "crypto/aes/aes_ecb.c" + ], + "crypto/aes/libfips-lib-aes_misc.o" => [ + "crypto/aes/aes_misc.c" + ], + "crypto/aria/libcrypto-lib-aria.o" => [ + "crypto/aria/aria.c" + ], + "crypto/asn1/libcrypto-lib-a_bitstr.o" => [ + "crypto/asn1/a_bitstr.c" + ], + "crypto/asn1/libcrypto-lib-a_d2i_fp.o" => [ + "crypto/asn1/a_d2i_fp.c" + ], + "crypto/asn1/libcrypto-lib-a_digest.o" => [ + "crypto/asn1/a_digest.c" + ], + "crypto/asn1/libcrypto-lib-a_dup.o" => [ + "crypto/asn1/a_dup.c" + ], + "crypto/asn1/libcrypto-lib-a_gentm.o" => [ + "crypto/asn1/a_gentm.c" + ], + "crypto/asn1/libcrypto-lib-a_i2d_fp.o" => [ + "crypto/asn1/a_i2d_fp.c" + ], + "crypto/asn1/libcrypto-lib-a_int.o" => [ + "crypto/asn1/a_int.c" + ], + "crypto/asn1/libcrypto-lib-a_mbstr.o" => [ + "crypto/asn1/a_mbstr.c" + ], + "crypto/asn1/libcrypto-lib-a_object.o" => [ + "crypto/asn1/a_object.c" + ], + "crypto/asn1/libcrypto-lib-a_octet.o" => [ + "crypto/asn1/a_octet.c" + ], + "crypto/asn1/libcrypto-lib-a_print.o" => [ + "crypto/asn1/a_print.c" + ], + "crypto/asn1/libcrypto-lib-a_sign.o" => [ + "crypto/asn1/a_sign.c" + ], + "crypto/asn1/libcrypto-lib-a_strex.o" => [ + "crypto/asn1/a_strex.c" + ], + "crypto/asn1/libcrypto-lib-a_strnid.o" => [ + "crypto/asn1/a_strnid.c" + ], + "crypto/asn1/libcrypto-lib-a_time.o" => [ + "crypto/asn1/a_time.c" + ], + "crypto/asn1/libcrypto-lib-a_type.o" => [ + "crypto/asn1/a_type.c" + ], + "crypto/asn1/libcrypto-lib-a_utctm.o" => [ + "crypto/asn1/a_utctm.c" + ], + "crypto/asn1/libcrypto-lib-a_utf8.o" => [ + "crypto/asn1/a_utf8.c" + ], + "crypto/asn1/libcrypto-lib-a_verify.o" => [ + "crypto/asn1/a_verify.c" + ], + "crypto/asn1/libcrypto-lib-ameth_lib.o" => [ + "crypto/asn1/ameth_lib.c" + ], + "crypto/asn1/libcrypto-lib-asn1_err.o" => [ + "crypto/asn1/asn1_err.c" + ], + "crypto/asn1/libcrypto-lib-asn1_gen.o" => [ + "crypto/asn1/asn1_gen.c" + ], + "crypto/asn1/libcrypto-lib-asn1_item_list.o" => [ + "crypto/asn1/asn1_item_list.c" + ], + "crypto/asn1/libcrypto-lib-asn1_lib.o" => [ + "crypto/asn1/asn1_lib.c" + ], + "crypto/asn1/libcrypto-lib-asn1_parse.o" => [ + "crypto/asn1/asn1_parse.c" + ], + "crypto/asn1/libcrypto-lib-asn_mime.o" => [ + "crypto/asn1/asn_mime.c" + ], + "crypto/asn1/libcrypto-lib-asn_moid.o" => [ + "crypto/asn1/asn_moid.c" + ], + "crypto/asn1/libcrypto-lib-asn_mstbl.o" => [ + "crypto/asn1/asn_mstbl.c" + ], + "crypto/asn1/libcrypto-lib-asn_pack.o" => [ + "crypto/asn1/asn_pack.c" + ], + "crypto/asn1/libcrypto-lib-bio_asn1.o" => [ + "crypto/asn1/bio_asn1.c" + ], + "crypto/asn1/libcrypto-lib-bio_ndef.o" => [ + "crypto/asn1/bio_ndef.c" + ], + "crypto/asn1/libcrypto-lib-d2i_param.o" => [ + "crypto/asn1/d2i_param.c" + ], + "crypto/asn1/libcrypto-lib-d2i_pr.o" => [ + "crypto/asn1/d2i_pr.c" + ], + "crypto/asn1/libcrypto-lib-d2i_pu.o" => [ + "crypto/asn1/d2i_pu.c" + ], + "crypto/asn1/libcrypto-lib-evp_asn1.o" => [ + "crypto/asn1/evp_asn1.c" + ], + "crypto/asn1/libcrypto-lib-f_int.o" => [ + "crypto/asn1/f_int.c" + ], + "crypto/asn1/libcrypto-lib-f_string.o" => [ + "crypto/asn1/f_string.c" + ], + "crypto/asn1/libcrypto-lib-i2d_evp.o" => [ + "crypto/asn1/i2d_evp.c" + ], + "crypto/asn1/libcrypto-lib-n_pkey.o" => [ + "crypto/asn1/n_pkey.c" + ], + "crypto/asn1/libcrypto-lib-nsseq.o" => [ + "crypto/asn1/nsseq.c" + ], + "crypto/asn1/libcrypto-lib-p5_pbe.o" => [ + "crypto/asn1/p5_pbe.c" + ], + "crypto/asn1/libcrypto-lib-p5_pbev2.o" => [ + "crypto/asn1/p5_pbev2.c" + ], + "crypto/asn1/libcrypto-lib-p5_scrypt.o" => [ + "crypto/asn1/p5_scrypt.c" + ], + "crypto/asn1/libcrypto-lib-p8_pkey.o" => [ + "crypto/asn1/p8_pkey.c" + ], + "crypto/asn1/libcrypto-lib-t_bitst.o" => [ + "crypto/asn1/t_bitst.c" + ], + "crypto/asn1/libcrypto-lib-t_pkey.o" => [ + "crypto/asn1/t_pkey.c" + ], + "crypto/asn1/libcrypto-lib-t_spki.o" => [ + "crypto/asn1/t_spki.c" + ], + "crypto/asn1/libcrypto-lib-tasn_dec.o" => [ + "crypto/asn1/tasn_dec.c" + ], + "crypto/asn1/libcrypto-lib-tasn_enc.o" => [ + "crypto/asn1/tasn_enc.c" + ], + "crypto/asn1/libcrypto-lib-tasn_fre.o" => [ + "crypto/asn1/tasn_fre.c" + ], + "crypto/asn1/libcrypto-lib-tasn_new.o" => [ + "crypto/asn1/tasn_new.c" + ], + "crypto/asn1/libcrypto-lib-tasn_prn.o" => [ + "crypto/asn1/tasn_prn.c" + ], + "crypto/asn1/libcrypto-lib-tasn_scn.o" => [ + "crypto/asn1/tasn_scn.c" + ], + "crypto/asn1/libcrypto-lib-tasn_typ.o" => [ + "crypto/asn1/tasn_typ.c" + ], + "crypto/asn1/libcrypto-lib-tasn_utl.o" => [ + "crypto/asn1/tasn_utl.c" + ], + "crypto/asn1/libcrypto-lib-x_algor.o" => [ + "crypto/asn1/x_algor.c" + ], + "crypto/asn1/libcrypto-lib-x_bignum.o" => [ + "crypto/asn1/x_bignum.c" + ], + "crypto/asn1/libcrypto-lib-x_info.o" => [ + "crypto/asn1/x_info.c" + ], + "crypto/asn1/libcrypto-lib-x_int64.o" => [ + "crypto/asn1/x_int64.c" + ], + "crypto/asn1/libcrypto-lib-x_long.o" => [ + "crypto/asn1/x_long.c" + ], + "crypto/asn1/libcrypto-lib-x_pkey.o" => [ + "crypto/asn1/x_pkey.c" + ], + "crypto/asn1/libcrypto-lib-x_sig.o" => [ + "crypto/asn1/x_sig.c" + ], + "crypto/asn1/libcrypto-lib-x_spki.o" => [ + "crypto/asn1/x_spki.c" + ], + "crypto/asn1/libcrypto-lib-x_val.o" => [ + "crypto/asn1/x_val.c" + ], + "crypto/async/arch/libcrypto-lib-async_null.o" => [ + "crypto/async/arch/async_null.c" + ], + "crypto/async/arch/libcrypto-lib-async_posix.o" => [ + "crypto/async/arch/async_posix.c" + ], + "crypto/async/arch/libcrypto-lib-async_win.o" => [ + "crypto/async/arch/async_win.c" + ], + "crypto/async/libcrypto-lib-async.o" => [ + "crypto/async/async.c" + ], + "crypto/async/libcrypto-lib-async_err.o" => [ + "crypto/async/async_err.c" + ], + "crypto/async/libcrypto-lib-async_wait.o" => [ + "crypto/async/async_wait.c" + ], + "crypto/bf/libcrypto-lib-bf_cfb64.o" => [ + "crypto/bf/bf_cfb64.c" + ], + "crypto/bf/libcrypto-lib-bf_ecb.o" => [ + "crypto/bf/bf_ecb.c" + ], + "crypto/bf/libcrypto-lib-bf_enc.o" => [ + "crypto/bf/bf_enc.c" + ], + "crypto/bf/libcrypto-lib-bf_ofb64.o" => [ + "crypto/bf/bf_ofb64.c" + ], + "crypto/bf/libcrypto-lib-bf_skey.o" => [ + "crypto/bf/bf_skey.c" + ], + "crypto/bio/libcrypto-lib-bf_buff.o" => [ + "crypto/bio/bf_buff.c" + ], + "crypto/bio/libcrypto-lib-bf_lbuf.o" => [ + "crypto/bio/bf_lbuf.c" + ], + "crypto/bio/libcrypto-lib-bf_nbio.o" => [ + "crypto/bio/bf_nbio.c" + ], + "crypto/bio/libcrypto-lib-bf_null.o" => [ + "crypto/bio/bf_null.c" + ], + "crypto/bio/libcrypto-lib-bf_prefix.o" => [ + "crypto/bio/bf_prefix.c" + ], + "crypto/bio/libcrypto-lib-bf_readbuff.o" => [ + "crypto/bio/bf_readbuff.c" + ], + "crypto/bio/libcrypto-lib-bio_addr.o" => [ + "crypto/bio/bio_addr.c" + ], + "crypto/bio/libcrypto-lib-bio_cb.o" => [ + "crypto/bio/bio_cb.c" + ], + "crypto/bio/libcrypto-lib-bio_dump.o" => [ + "crypto/bio/bio_dump.c" + ], + "crypto/bio/libcrypto-lib-bio_err.o" => [ + "crypto/bio/bio_err.c" + ], + "crypto/bio/libcrypto-lib-bio_lib.o" => [ + "crypto/bio/bio_lib.c" + ], + "crypto/bio/libcrypto-lib-bio_meth.o" => [ + "crypto/bio/bio_meth.c" + ], + "crypto/bio/libcrypto-lib-bio_print.o" => [ + "crypto/bio/bio_print.c" + ], + "crypto/bio/libcrypto-lib-bio_sock.o" => [ + "crypto/bio/bio_sock.c" + ], + "crypto/bio/libcrypto-lib-bio_sock2.o" => [ + "crypto/bio/bio_sock2.c" + ], + "crypto/bio/libcrypto-lib-bss_acpt.o" => [ + "crypto/bio/bss_acpt.c" + ], + "crypto/bio/libcrypto-lib-bss_bio.o" => [ + "crypto/bio/bss_bio.c" + ], + "crypto/bio/libcrypto-lib-bss_conn.o" => [ + "crypto/bio/bss_conn.c" + ], + "crypto/bio/libcrypto-lib-bss_core.o" => [ + "crypto/bio/bss_core.c" + ], + "crypto/bio/libcrypto-lib-bss_dgram.o" => [ + "crypto/bio/bss_dgram.c" + ], + "crypto/bio/libcrypto-lib-bss_dgram_pair.o" => [ + "crypto/bio/bss_dgram_pair.c" + ], + "crypto/bio/libcrypto-lib-bss_fd.o" => [ + "crypto/bio/bss_fd.c" + ], + "crypto/bio/libcrypto-lib-bss_file.o" => [ + "crypto/bio/bss_file.c" + ], + "crypto/bio/libcrypto-lib-bss_log.o" => [ + "crypto/bio/bss_log.c" + ], + "crypto/bio/libcrypto-lib-bss_mem.o" => [ + "crypto/bio/bss_mem.c" + ], + "crypto/bio/libcrypto-lib-bss_null.o" => [ + "crypto/bio/bss_null.c" + ], + "crypto/bio/libcrypto-lib-bss_sock.o" => [ + "crypto/bio/bss_sock.c" + ], + "crypto/bio/libcrypto-lib-ossl_core_bio.o" => [ + "crypto/bio/ossl_core_bio.c" + ], + "crypto/bn/libcrypto-lib-bn_add.o" => [ + "crypto/bn/bn_add.c" + ], + "crypto/bn/libcrypto-lib-bn_asm.o" => [ + "crypto/bn/bn_asm.c" + ], + "crypto/bn/libcrypto-lib-bn_blind.o" => [ + "crypto/bn/bn_blind.c" + ], + "crypto/bn/libcrypto-lib-bn_const.o" => [ + "crypto/bn/bn_const.c" + ], + "crypto/bn/libcrypto-lib-bn_conv.o" => [ + "crypto/bn/bn_conv.c" + ], + "crypto/bn/libcrypto-lib-bn_ctx.o" => [ + "crypto/bn/bn_ctx.c" + ], + "crypto/bn/libcrypto-lib-bn_depr.o" => [ + "crypto/bn/bn_depr.c" + ], + "crypto/bn/libcrypto-lib-bn_dh.o" => [ + "crypto/bn/bn_dh.c" + ], + "crypto/bn/libcrypto-lib-bn_div.o" => [ + "crypto/bn/bn_div.c" + ], + "crypto/bn/libcrypto-lib-bn_err.o" => [ + "crypto/bn/bn_err.c" + ], + "crypto/bn/libcrypto-lib-bn_exp.o" => [ + "crypto/bn/bn_exp.c" + ], + "crypto/bn/libcrypto-lib-bn_exp2.o" => [ + "crypto/bn/bn_exp2.c" + ], + "crypto/bn/libcrypto-lib-bn_gcd.o" => [ + "crypto/bn/bn_gcd.c" + ], + "crypto/bn/libcrypto-lib-bn_gf2m.o" => [ + "crypto/bn/bn_gf2m.c" + ], + "crypto/bn/libcrypto-lib-bn_intern.o" => [ + "crypto/bn/bn_intern.c" + ], + "crypto/bn/libcrypto-lib-bn_kron.o" => [ + "crypto/bn/bn_kron.c" + ], + "crypto/bn/libcrypto-lib-bn_lib.o" => [ + "crypto/bn/bn_lib.c" + ], + "crypto/bn/libcrypto-lib-bn_mod.o" => [ + "crypto/bn/bn_mod.c" + ], + "crypto/bn/libcrypto-lib-bn_mont.o" => [ + "crypto/bn/bn_mont.c" + ], + "crypto/bn/libcrypto-lib-bn_mpi.o" => [ + "crypto/bn/bn_mpi.c" + ], + "crypto/bn/libcrypto-lib-bn_mul.o" => [ + "crypto/bn/bn_mul.c" + ], + "crypto/bn/libcrypto-lib-bn_nist.o" => [ + "crypto/bn/bn_nist.c" + ], + "crypto/bn/libcrypto-lib-bn_prime.o" => [ + "crypto/bn/bn_prime.c" + ], + "crypto/bn/libcrypto-lib-bn_print.o" => [ + "crypto/bn/bn_print.c" + ], + "crypto/bn/libcrypto-lib-bn_rand.o" => [ + "crypto/bn/bn_rand.c" + ], + "crypto/bn/libcrypto-lib-bn_recp.o" => [ + "crypto/bn/bn_recp.c" + ], + "crypto/bn/libcrypto-lib-bn_rsa_fips186_4.o" => [ + "crypto/bn/bn_rsa_fips186_4.c" + ], + "crypto/bn/libcrypto-lib-bn_shift.o" => [ + "crypto/bn/bn_shift.c" + ], + "crypto/bn/libcrypto-lib-bn_sqr.o" => [ + "crypto/bn/bn_sqr.c" + ], + "crypto/bn/libcrypto-lib-bn_sqrt.o" => [ + "crypto/bn/bn_sqrt.c" + ], + "crypto/bn/libcrypto-lib-bn_srp.o" => [ + "crypto/bn/bn_srp.c" + ], + "crypto/bn/libcrypto-lib-bn_word.o" => [ + "crypto/bn/bn_word.c" + ], + "crypto/bn/libcrypto-lib-bn_x931p.o" => [ + "crypto/bn/bn_x931p.c" + ], + "crypto/bn/libfips-lib-bn_add.o" => [ + "crypto/bn/bn_add.c" + ], + "crypto/bn/libfips-lib-bn_asm.o" => [ + "crypto/bn/bn_asm.c" + ], + "crypto/bn/libfips-lib-bn_blind.o" => [ + "crypto/bn/bn_blind.c" + ], + "crypto/bn/libfips-lib-bn_const.o" => [ + "crypto/bn/bn_const.c" + ], + "crypto/bn/libfips-lib-bn_conv.o" => [ + "crypto/bn/bn_conv.c" + ], + "crypto/bn/libfips-lib-bn_ctx.o" => [ + "crypto/bn/bn_ctx.c" + ], + "crypto/bn/libfips-lib-bn_dh.o" => [ + "crypto/bn/bn_dh.c" + ], + "crypto/bn/libfips-lib-bn_div.o" => [ + "crypto/bn/bn_div.c" + ], + "crypto/bn/libfips-lib-bn_exp.o" => [ + "crypto/bn/bn_exp.c" + ], + "crypto/bn/libfips-lib-bn_exp2.o" => [ + "crypto/bn/bn_exp2.c" + ], + "crypto/bn/libfips-lib-bn_gcd.o" => [ + "crypto/bn/bn_gcd.c" + ], + "crypto/bn/libfips-lib-bn_gf2m.o" => [ + "crypto/bn/bn_gf2m.c" + ], + "crypto/bn/libfips-lib-bn_intern.o" => [ + "crypto/bn/bn_intern.c" + ], + "crypto/bn/libfips-lib-bn_kron.o" => [ + "crypto/bn/bn_kron.c" + ], + "crypto/bn/libfips-lib-bn_lib.o" => [ + "crypto/bn/bn_lib.c" + ], + "crypto/bn/libfips-lib-bn_mod.o" => [ + "crypto/bn/bn_mod.c" + ], + "crypto/bn/libfips-lib-bn_mont.o" => [ + "crypto/bn/bn_mont.c" + ], + "crypto/bn/libfips-lib-bn_mpi.o" => [ + "crypto/bn/bn_mpi.c" + ], + "crypto/bn/libfips-lib-bn_mul.o" => [ + "crypto/bn/bn_mul.c" + ], + "crypto/bn/libfips-lib-bn_nist.o" => [ + "crypto/bn/bn_nist.c" + ], + "crypto/bn/libfips-lib-bn_prime.o" => [ + "crypto/bn/bn_prime.c" + ], + "crypto/bn/libfips-lib-bn_rand.o" => [ + "crypto/bn/bn_rand.c" + ], + "crypto/bn/libfips-lib-bn_recp.o" => [ + "crypto/bn/bn_recp.c" + ], + "crypto/bn/libfips-lib-bn_rsa_fips186_4.o" => [ + "crypto/bn/bn_rsa_fips186_4.c" + ], + "crypto/bn/libfips-lib-bn_shift.o" => [ + "crypto/bn/bn_shift.c" + ], + "crypto/bn/libfips-lib-bn_sqr.o" => [ + "crypto/bn/bn_sqr.c" + ], + "crypto/bn/libfips-lib-bn_sqrt.o" => [ + "crypto/bn/bn_sqrt.c" + ], + "crypto/bn/libfips-lib-bn_word.o" => [ + "crypto/bn/bn_word.c" + ], + "crypto/buffer/libcrypto-lib-buf_err.o" => [ + "crypto/buffer/buf_err.c" + ], + "crypto/buffer/libcrypto-lib-buffer.o" => [ + "crypto/buffer/buffer.c" + ], + "crypto/buffer/libfips-lib-buffer.o" => [ + "crypto/buffer/buffer.c" + ], + "crypto/camellia/libcrypto-lib-camellia.o" => [ + "crypto/camellia/camellia.c" + ], + "crypto/camellia/libcrypto-lib-cmll_cbc.o" => [ + "crypto/camellia/cmll_cbc.c" + ], + "crypto/camellia/libcrypto-lib-cmll_cfb.o" => [ + "crypto/camellia/cmll_cfb.c" + ], + "crypto/camellia/libcrypto-lib-cmll_ctr.o" => [ + "crypto/camellia/cmll_ctr.c" + ], + "crypto/camellia/libcrypto-lib-cmll_ecb.o" => [ + "crypto/camellia/cmll_ecb.c" + ], + "crypto/camellia/libcrypto-lib-cmll_misc.o" => [ + "crypto/camellia/cmll_misc.c" + ], + "crypto/camellia/libcrypto-lib-cmll_ofb.o" => [ + "crypto/camellia/cmll_ofb.c" + ], + "crypto/cast/libcrypto-lib-c_cfb64.o" => [ + "crypto/cast/c_cfb64.c" + ], + "crypto/cast/libcrypto-lib-c_ecb.o" => [ + "crypto/cast/c_ecb.c" + ], + "crypto/cast/libcrypto-lib-c_enc.o" => [ + "crypto/cast/c_enc.c" + ], + "crypto/cast/libcrypto-lib-c_ofb64.o" => [ + "crypto/cast/c_ofb64.c" + ], + "crypto/cast/libcrypto-lib-c_skey.o" => [ + "crypto/cast/c_skey.c" + ], + "crypto/chacha/libcrypto-lib-chacha-riscv64-v-zbb-zvkb.o" => [ + "crypto/chacha/chacha-riscv64-v-zbb-zvkb.s" + ], + "crypto/chacha/libcrypto-lib-chacha-riscv64-v-zbb.o" => [ + "crypto/chacha/chacha-riscv64-v-zbb.s" + ], + "crypto/chacha/libcrypto-lib-chacha_enc.o" => [ + "crypto/chacha/chacha_enc.c" + ], + "crypto/chacha/libcrypto-lib-chacha_riscv.o" => [ + "crypto/chacha/chacha_riscv.c" + ], + "crypto/cmac/libcrypto-lib-cmac.o" => [ + "crypto/cmac/cmac.c" + ], + "crypto/cmac/libfips-lib-cmac.o" => [ + "crypto/cmac/cmac.c" + ], + "crypto/cmp/libcrypto-lib-cmp_asn.o" => [ + "crypto/cmp/cmp_asn.c" + ], + "crypto/cmp/libcrypto-lib-cmp_client.o" => [ + "crypto/cmp/cmp_client.c" + ], + "crypto/cmp/libcrypto-lib-cmp_ctx.o" => [ + "crypto/cmp/cmp_ctx.c" + ], + "crypto/cmp/libcrypto-lib-cmp_err.o" => [ + "crypto/cmp/cmp_err.c" + ], + "crypto/cmp/libcrypto-lib-cmp_genm.o" => [ + "crypto/cmp/cmp_genm.c" + ], + "crypto/cmp/libcrypto-lib-cmp_hdr.o" => [ + "crypto/cmp/cmp_hdr.c" + ], + "crypto/cmp/libcrypto-lib-cmp_http.o" => [ + "crypto/cmp/cmp_http.c" + ], + "crypto/cmp/libcrypto-lib-cmp_msg.o" => [ + "crypto/cmp/cmp_msg.c" + ], + "crypto/cmp/libcrypto-lib-cmp_protect.o" => [ + "crypto/cmp/cmp_protect.c" + ], + "crypto/cmp/libcrypto-lib-cmp_server.o" => [ + "crypto/cmp/cmp_server.c" + ], + "crypto/cmp/libcrypto-lib-cmp_status.o" => [ + "crypto/cmp/cmp_status.c" + ], + "crypto/cmp/libcrypto-lib-cmp_util.o" => [ + "crypto/cmp/cmp_util.c" + ], + "crypto/cmp/libcrypto-lib-cmp_vfy.o" => [ + "crypto/cmp/cmp_vfy.c" + ], + "crypto/cms/libcrypto-lib-cms_asn1.o" => [ + "crypto/cms/cms_asn1.c" + ], + "crypto/cms/libcrypto-lib-cms_att.o" => [ + "crypto/cms/cms_att.c" + ], + "crypto/cms/libcrypto-lib-cms_cd.o" => [ + "crypto/cms/cms_cd.c" + ], + "crypto/cms/libcrypto-lib-cms_dd.o" => [ + "crypto/cms/cms_dd.c" + ], + "crypto/cms/libcrypto-lib-cms_dh.o" => [ + "crypto/cms/cms_dh.c" + ], + "crypto/cms/libcrypto-lib-cms_ec.o" => [ + "crypto/cms/cms_ec.c" + ], + "crypto/cms/libcrypto-lib-cms_enc.o" => [ + "crypto/cms/cms_enc.c" + ], + "crypto/cms/libcrypto-lib-cms_env.o" => [ + "crypto/cms/cms_env.c" + ], + "crypto/cms/libcrypto-lib-cms_err.o" => [ + "crypto/cms/cms_err.c" + ], + "crypto/cms/libcrypto-lib-cms_ess.o" => [ + "crypto/cms/cms_ess.c" + ], + "crypto/cms/libcrypto-lib-cms_io.o" => [ + "crypto/cms/cms_io.c" + ], + "crypto/cms/libcrypto-lib-cms_kari.o" => [ + "crypto/cms/cms_kari.c" + ], + "crypto/cms/libcrypto-lib-cms_lib.o" => [ + "crypto/cms/cms_lib.c" + ], + "crypto/cms/libcrypto-lib-cms_pwri.o" => [ + "crypto/cms/cms_pwri.c" + ], + "crypto/cms/libcrypto-lib-cms_rsa.o" => [ + "crypto/cms/cms_rsa.c" + ], + "crypto/cms/libcrypto-lib-cms_sd.o" => [ + "crypto/cms/cms_sd.c" + ], + "crypto/cms/libcrypto-lib-cms_smime.o" => [ + "crypto/cms/cms_smime.c" + ], + "crypto/comp/libcrypto-lib-c_brotli.o" => [ + "crypto/comp/c_brotli.c" + ], + "crypto/comp/libcrypto-lib-c_zlib.o" => [ + "crypto/comp/c_zlib.c" + ], + "crypto/comp/libcrypto-lib-c_zstd.o" => [ + "crypto/comp/c_zstd.c" + ], + "crypto/comp/libcrypto-lib-comp_err.o" => [ + "crypto/comp/comp_err.c" + ], + "crypto/comp/libcrypto-lib-comp_lib.o" => [ + "crypto/comp/comp_lib.c" + ], + "crypto/conf/libcrypto-lib-conf_api.o" => [ + "crypto/conf/conf_api.c" + ], + "crypto/conf/libcrypto-lib-conf_def.o" => [ + "crypto/conf/conf_def.c" + ], + "crypto/conf/libcrypto-lib-conf_err.o" => [ + "crypto/conf/conf_err.c" + ], + "crypto/conf/libcrypto-lib-conf_lib.o" => [ + "crypto/conf/conf_lib.c" + ], + "crypto/conf/libcrypto-lib-conf_mall.o" => [ + "crypto/conf/conf_mall.c" + ], + "crypto/conf/libcrypto-lib-conf_mod.o" => [ + "crypto/conf/conf_mod.c" + ], + "crypto/conf/libcrypto-lib-conf_sap.o" => [ + "crypto/conf/conf_sap.c" + ], + "crypto/conf/libcrypto-lib-conf_ssl.o" => [ + "crypto/conf/conf_ssl.c" + ], + "crypto/crmf/libcrypto-lib-crmf_asn.o" => [ + "crypto/crmf/crmf_asn.c" + ], + "crypto/crmf/libcrypto-lib-crmf_err.o" => [ + "crypto/crmf/crmf_err.c" + ], + "crypto/crmf/libcrypto-lib-crmf_lib.o" => [ + "crypto/crmf/crmf_lib.c" + ], + "crypto/crmf/libcrypto-lib-crmf_pbm.o" => [ + "crypto/crmf/crmf_pbm.c" + ], + "crypto/ct/libcrypto-lib-ct_b64.o" => [ + "crypto/ct/ct_b64.c" + ], + "crypto/ct/libcrypto-lib-ct_err.o" => [ + "crypto/ct/ct_err.c" + ], + "crypto/ct/libcrypto-lib-ct_log.o" => [ + "crypto/ct/ct_log.c" + ], + "crypto/ct/libcrypto-lib-ct_oct.o" => [ + "crypto/ct/ct_oct.c" + ], + "crypto/ct/libcrypto-lib-ct_policy.o" => [ + "crypto/ct/ct_policy.c" + ], + "crypto/ct/libcrypto-lib-ct_prn.o" => [ + "crypto/ct/ct_prn.c" + ], + "crypto/ct/libcrypto-lib-ct_sct.o" => [ + "crypto/ct/ct_sct.c" + ], + "crypto/ct/libcrypto-lib-ct_sct_ctx.o" => [ + "crypto/ct/ct_sct_ctx.c" + ], + "crypto/ct/libcrypto-lib-ct_vfy.o" => [ + "crypto/ct/ct_vfy.c" + ], + "crypto/ct/libcrypto-lib-ct_x509v3.o" => [ + "crypto/ct/ct_x509v3.c" + ], + "crypto/des/libcrypto-lib-cbc_cksm.o" => [ + "crypto/des/cbc_cksm.c" + ], + "crypto/des/libcrypto-lib-cbc_enc.o" => [ + "crypto/des/cbc_enc.c" + ], + "crypto/des/libcrypto-lib-cfb64ede.o" => [ + "crypto/des/cfb64ede.c" + ], + "crypto/des/libcrypto-lib-cfb64enc.o" => [ + "crypto/des/cfb64enc.c" + ], + "crypto/des/libcrypto-lib-cfb_enc.o" => [ + "crypto/des/cfb_enc.c" + ], + "crypto/des/libcrypto-lib-des_enc.o" => [ + "crypto/des/des_enc.c" + ], + "crypto/des/libcrypto-lib-ecb3_enc.o" => [ + "crypto/des/ecb3_enc.c" + ], + "crypto/des/libcrypto-lib-ecb_enc.o" => [ + "crypto/des/ecb_enc.c" + ], + "crypto/des/libcrypto-lib-fcrypt.o" => [ + "crypto/des/fcrypt.c" + ], + "crypto/des/libcrypto-lib-fcrypt_b.o" => [ + "crypto/des/fcrypt_b.c" + ], + "crypto/des/libcrypto-lib-ofb64ede.o" => [ + "crypto/des/ofb64ede.c" + ], + "crypto/des/libcrypto-lib-ofb64enc.o" => [ + "crypto/des/ofb64enc.c" + ], + "crypto/des/libcrypto-lib-ofb_enc.o" => [ + "crypto/des/ofb_enc.c" + ], + "crypto/des/libcrypto-lib-pcbc_enc.o" => [ + "crypto/des/pcbc_enc.c" + ], + "crypto/des/libcrypto-lib-qud_cksm.o" => [ + "crypto/des/qud_cksm.c" + ], + "crypto/des/libcrypto-lib-rand_key.o" => [ + "crypto/des/rand_key.c" + ], + "crypto/des/libcrypto-lib-set_key.o" => [ + "crypto/des/set_key.c" + ], + "crypto/des/libcrypto-lib-str2key.o" => [ + "crypto/des/str2key.c" + ], + "crypto/des/libcrypto-lib-xcbc_enc.o" => [ + "crypto/des/xcbc_enc.c" + ], + "crypto/des/libfips-lib-des_enc.o" => [ + "crypto/des/des_enc.c" + ], + "crypto/des/libfips-lib-ecb3_enc.o" => [ + "crypto/des/ecb3_enc.c" + ], + "crypto/des/libfips-lib-fcrypt_b.o" => [ + "crypto/des/fcrypt_b.c" + ], + "crypto/des/libfips-lib-set_key.o" => [ + "crypto/des/set_key.c" + ], + "crypto/dh/libcrypto-lib-dh_ameth.o" => [ + "crypto/dh/dh_ameth.c" + ], + "crypto/dh/libcrypto-lib-dh_asn1.o" => [ + "crypto/dh/dh_asn1.c" + ], + "crypto/dh/libcrypto-lib-dh_backend.o" => [ + "crypto/dh/dh_backend.c" + ], + "crypto/dh/libcrypto-lib-dh_check.o" => [ + "crypto/dh/dh_check.c" + ], + "crypto/dh/libcrypto-lib-dh_depr.o" => [ + "crypto/dh/dh_depr.c" + ], + "crypto/dh/libcrypto-lib-dh_err.o" => [ + "crypto/dh/dh_err.c" + ], + "crypto/dh/libcrypto-lib-dh_gen.o" => [ + "crypto/dh/dh_gen.c" + ], + "crypto/dh/libcrypto-lib-dh_group_params.o" => [ + "crypto/dh/dh_group_params.c" + ], + "crypto/dh/libcrypto-lib-dh_kdf.o" => [ + "crypto/dh/dh_kdf.c" + ], + "crypto/dh/libcrypto-lib-dh_key.o" => [ + "crypto/dh/dh_key.c" + ], + "crypto/dh/libcrypto-lib-dh_lib.o" => [ + "crypto/dh/dh_lib.c" + ], + "crypto/dh/libcrypto-lib-dh_meth.o" => [ + "crypto/dh/dh_meth.c" + ], + "crypto/dh/libcrypto-lib-dh_pmeth.o" => [ + "crypto/dh/dh_pmeth.c" + ], + "crypto/dh/libcrypto-lib-dh_prn.o" => [ + "crypto/dh/dh_prn.c" + ], + "crypto/dh/libcrypto-lib-dh_rfc5114.o" => [ + "crypto/dh/dh_rfc5114.c" + ], + "crypto/dh/libfips-lib-dh_backend.o" => [ + "crypto/dh/dh_backend.c" + ], + "crypto/dh/libfips-lib-dh_check.o" => [ + "crypto/dh/dh_check.c" + ], + "crypto/dh/libfips-lib-dh_gen.o" => [ + "crypto/dh/dh_gen.c" + ], + "crypto/dh/libfips-lib-dh_group_params.o" => [ + "crypto/dh/dh_group_params.c" + ], + "crypto/dh/libfips-lib-dh_kdf.o" => [ + "crypto/dh/dh_kdf.c" + ], + "crypto/dh/libfips-lib-dh_key.o" => [ + "crypto/dh/dh_key.c" + ], + "crypto/dh/libfips-lib-dh_lib.o" => [ + "crypto/dh/dh_lib.c" + ], + "crypto/dsa/libcrypto-lib-dsa_ameth.o" => [ + "crypto/dsa/dsa_ameth.c" + ], + "crypto/dsa/libcrypto-lib-dsa_asn1.o" => [ + "crypto/dsa/dsa_asn1.c" + ], + "crypto/dsa/libcrypto-lib-dsa_backend.o" => [ + "crypto/dsa/dsa_backend.c" + ], + "crypto/dsa/libcrypto-lib-dsa_check.o" => [ + "crypto/dsa/dsa_check.c" + ], + "crypto/dsa/libcrypto-lib-dsa_depr.o" => [ + "crypto/dsa/dsa_depr.c" + ], + "crypto/dsa/libcrypto-lib-dsa_err.o" => [ + "crypto/dsa/dsa_err.c" + ], + "crypto/dsa/libcrypto-lib-dsa_gen.o" => [ + "crypto/dsa/dsa_gen.c" + ], + "crypto/dsa/libcrypto-lib-dsa_key.o" => [ + "crypto/dsa/dsa_key.c" + ], + "crypto/dsa/libcrypto-lib-dsa_lib.o" => [ + "crypto/dsa/dsa_lib.c" + ], + "crypto/dsa/libcrypto-lib-dsa_meth.o" => [ + "crypto/dsa/dsa_meth.c" + ], + "crypto/dsa/libcrypto-lib-dsa_ossl.o" => [ + "crypto/dsa/dsa_ossl.c" + ], + "crypto/dsa/libcrypto-lib-dsa_pmeth.o" => [ + "crypto/dsa/dsa_pmeth.c" + ], + "crypto/dsa/libcrypto-lib-dsa_prn.o" => [ + "crypto/dsa/dsa_prn.c" + ], + "crypto/dsa/libcrypto-lib-dsa_sign.o" => [ + "crypto/dsa/dsa_sign.c" + ], + "crypto/dsa/libcrypto-lib-dsa_vrf.o" => [ + "crypto/dsa/dsa_vrf.c" + ], + "crypto/dsa/libfips-lib-dsa_backend.o" => [ + "crypto/dsa/dsa_backend.c" + ], + "crypto/dsa/libfips-lib-dsa_check.o" => [ + "crypto/dsa/dsa_check.c" + ], + "crypto/dsa/libfips-lib-dsa_gen.o" => [ + "crypto/dsa/dsa_gen.c" + ], + "crypto/dsa/libfips-lib-dsa_key.o" => [ + "crypto/dsa/dsa_key.c" + ], + "crypto/dsa/libfips-lib-dsa_lib.o" => [ + "crypto/dsa/dsa_lib.c" + ], + "crypto/dsa/libfips-lib-dsa_ossl.o" => [ + "crypto/dsa/dsa_ossl.c" + ], + "crypto/dsa/libfips-lib-dsa_sign.o" => [ + "crypto/dsa/dsa_sign.c" + ], + "crypto/dsa/libfips-lib-dsa_vrf.o" => [ + "crypto/dsa/dsa_vrf.c" + ], + "crypto/dso/libcrypto-lib-dso_dl.o" => [ + "crypto/dso/dso_dl.c" + ], + "crypto/dso/libcrypto-lib-dso_dlfcn.o" => [ + "crypto/dso/dso_dlfcn.c" + ], + "crypto/dso/libcrypto-lib-dso_err.o" => [ + "crypto/dso/dso_err.c" + ], + "crypto/dso/libcrypto-lib-dso_lib.o" => [ + "crypto/dso/dso_lib.c" + ], + "crypto/dso/libcrypto-lib-dso_openssl.o" => [ + "crypto/dso/dso_openssl.c" + ], + "crypto/dso/libcrypto-lib-dso_vms.o" => [ + "crypto/dso/dso_vms.c" + ], + "crypto/dso/libcrypto-lib-dso_win32.o" => [ + "crypto/dso/dso_win32.c" + ], + "crypto/ec/curve448/arch_32/libcrypto-lib-f_impl32.o" => [ + "crypto/ec/curve448/arch_32/f_impl32.c" + ], + "crypto/ec/curve448/arch_32/libfips-lib-f_impl32.o" => [ + "crypto/ec/curve448/arch_32/f_impl32.c" + ], + "crypto/ec/curve448/arch_64/libcrypto-lib-f_impl64.o" => [ + "crypto/ec/curve448/arch_64/f_impl64.c" + ], + "crypto/ec/curve448/arch_64/libfips-lib-f_impl64.o" => [ + "crypto/ec/curve448/arch_64/f_impl64.c" + ], + "crypto/ec/curve448/libcrypto-lib-curve448.o" => [ + "crypto/ec/curve448/curve448.c" + ], + "crypto/ec/curve448/libcrypto-lib-curve448_tables.o" => [ + "crypto/ec/curve448/curve448_tables.c" + ], + "crypto/ec/curve448/libcrypto-lib-eddsa.o" => [ + "crypto/ec/curve448/eddsa.c" + ], + "crypto/ec/curve448/libcrypto-lib-f_generic.o" => [ + "crypto/ec/curve448/f_generic.c" + ], + "crypto/ec/curve448/libcrypto-lib-scalar.o" => [ + "crypto/ec/curve448/scalar.c" + ], + "crypto/ec/curve448/libfips-lib-curve448.o" => [ + "crypto/ec/curve448/curve448.c" + ], + "crypto/ec/curve448/libfips-lib-curve448_tables.o" => [ + "crypto/ec/curve448/curve448_tables.c" + ], + "crypto/ec/curve448/libfips-lib-eddsa.o" => [ + "crypto/ec/curve448/eddsa.c" + ], + "crypto/ec/curve448/libfips-lib-f_generic.o" => [ + "crypto/ec/curve448/f_generic.c" + ], + "crypto/ec/curve448/libfips-lib-scalar.o" => [ + "crypto/ec/curve448/scalar.c" + ], + "crypto/ec/libcrypto-lib-curve25519.o" => [ + "crypto/ec/curve25519.c" + ], + "crypto/ec/libcrypto-lib-ec2_oct.o" => [ + "crypto/ec/ec2_oct.c" + ], + "crypto/ec/libcrypto-lib-ec2_smpl.o" => [ + "crypto/ec/ec2_smpl.c" + ], + "crypto/ec/libcrypto-lib-ec_ameth.o" => [ + "crypto/ec/ec_ameth.c" + ], + "crypto/ec/libcrypto-lib-ec_asn1.o" => [ + "crypto/ec/ec_asn1.c" + ], + "crypto/ec/libcrypto-lib-ec_backend.o" => [ + "crypto/ec/ec_backend.c" + ], + "crypto/ec/libcrypto-lib-ec_check.o" => [ + "crypto/ec/ec_check.c" + ], + "crypto/ec/libcrypto-lib-ec_curve.o" => [ + "crypto/ec/ec_curve.c" + ], + "crypto/ec/libcrypto-lib-ec_cvt.o" => [ + "crypto/ec/ec_cvt.c" + ], + "crypto/ec/libcrypto-lib-ec_deprecated.o" => [ + "crypto/ec/ec_deprecated.c" + ], + "crypto/ec/libcrypto-lib-ec_err.o" => [ + "crypto/ec/ec_err.c" + ], + "crypto/ec/libcrypto-lib-ec_key.o" => [ + "crypto/ec/ec_key.c" + ], + "crypto/ec/libcrypto-lib-ec_kmeth.o" => [ + "crypto/ec/ec_kmeth.c" + ], + "crypto/ec/libcrypto-lib-ec_lib.o" => [ + "crypto/ec/ec_lib.c" + ], + "crypto/ec/libcrypto-lib-ec_mult.o" => [ + "crypto/ec/ec_mult.c" + ], + "crypto/ec/libcrypto-lib-ec_oct.o" => [ + "crypto/ec/ec_oct.c" + ], + "crypto/ec/libcrypto-lib-ec_pmeth.o" => [ + "crypto/ec/ec_pmeth.c" + ], + "crypto/ec/libcrypto-lib-ec_print.o" => [ + "crypto/ec/ec_print.c" + ], + "crypto/ec/libcrypto-lib-ecdh_kdf.o" => [ + "crypto/ec/ecdh_kdf.c" + ], + "crypto/ec/libcrypto-lib-ecdh_ossl.o" => [ + "crypto/ec/ecdh_ossl.c" + ], + "crypto/ec/libcrypto-lib-ecdsa_ossl.o" => [ + "crypto/ec/ecdsa_ossl.c" + ], + "crypto/ec/libcrypto-lib-ecdsa_sign.o" => [ + "crypto/ec/ecdsa_sign.c" + ], + "crypto/ec/libcrypto-lib-ecdsa_vrf.o" => [ + "crypto/ec/ecdsa_vrf.c" + ], + "crypto/ec/libcrypto-lib-eck_prn.o" => [ + "crypto/ec/eck_prn.c" + ], + "crypto/ec/libcrypto-lib-ecp_mont.o" => [ + "crypto/ec/ecp_mont.c" + ], + "crypto/ec/libcrypto-lib-ecp_nist.o" => [ + "crypto/ec/ecp_nist.c" + ], + "crypto/ec/libcrypto-lib-ecp_oct.o" => [ + "crypto/ec/ecp_oct.c" + ], + "crypto/ec/libcrypto-lib-ecp_smpl.o" => [ + "crypto/ec/ecp_smpl.c" + ], + "crypto/ec/libcrypto-lib-ecx_backend.o" => [ + "crypto/ec/ecx_backend.c" + ], + "crypto/ec/libcrypto-lib-ecx_key.o" => [ + "crypto/ec/ecx_key.c" + ], + "crypto/ec/libcrypto-lib-ecx_meth.o" => [ + "crypto/ec/ecx_meth.c" + ], + "crypto/ec/libfips-lib-curve25519.o" => [ + "crypto/ec/curve25519.c" + ], + "crypto/ec/libfips-lib-ec2_oct.o" => [ + "crypto/ec/ec2_oct.c" + ], + "crypto/ec/libfips-lib-ec2_smpl.o" => [ + "crypto/ec/ec2_smpl.c" + ], + "crypto/ec/libfips-lib-ec_asn1.o" => [ + "crypto/ec/ec_asn1.c" + ], + "crypto/ec/libfips-lib-ec_backend.o" => [ + "crypto/ec/ec_backend.c" + ], + "crypto/ec/libfips-lib-ec_check.o" => [ + "crypto/ec/ec_check.c" + ], + "crypto/ec/libfips-lib-ec_curve.o" => [ + "crypto/ec/ec_curve.c" + ], + "crypto/ec/libfips-lib-ec_cvt.o" => [ + "crypto/ec/ec_cvt.c" + ], + "crypto/ec/libfips-lib-ec_key.o" => [ + "crypto/ec/ec_key.c" + ], + "crypto/ec/libfips-lib-ec_kmeth.o" => [ + "crypto/ec/ec_kmeth.c" + ], + "crypto/ec/libfips-lib-ec_lib.o" => [ + "crypto/ec/ec_lib.c" + ], + "crypto/ec/libfips-lib-ec_mult.o" => [ + "crypto/ec/ec_mult.c" + ], + "crypto/ec/libfips-lib-ec_oct.o" => [ + "crypto/ec/ec_oct.c" + ], + "crypto/ec/libfips-lib-ecdh_kdf.o" => [ + "crypto/ec/ecdh_kdf.c" + ], + "crypto/ec/libfips-lib-ecdh_ossl.o" => [ + "crypto/ec/ecdh_ossl.c" + ], + "crypto/ec/libfips-lib-ecdsa_ossl.o" => [ + "crypto/ec/ecdsa_ossl.c" + ], + "crypto/ec/libfips-lib-ecdsa_sign.o" => [ + "crypto/ec/ecdsa_sign.c" + ], + "crypto/ec/libfips-lib-ecdsa_vrf.o" => [ + "crypto/ec/ecdsa_vrf.c" + ], + "crypto/ec/libfips-lib-ecp_mont.o" => [ + "crypto/ec/ecp_mont.c" + ], + "crypto/ec/libfips-lib-ecp_nist.o" => [ + "crypto/ec/ecp_nist.c" + ], + "crypto/ec/libfips-lib-ecp_oct.o" => [ + "crypto/ec/ecp_oct.c" + ], + "crypto/ec/libfips-lib-ecp_smpl.o" => [ + "crypto/ec/ecp_smpl.c" + ], + "crypto/ec/libfips-lib-ecx_backend.o" => [ + "crypto/ec/ecx_backend.c" + ], + "crypto/ec/libfips-lib-ecx_key.o" => [ + "crypto/ec/ecx_key.c" + ], + "crypto/encode_decode/libcrypto-lib-decoder_err.o" => [ + "crypto/encode_decode/decoder_err.c" + ], + "crypto/encode_decode/libcrypto-lib-decoder_lib.o" => [ + "crypto/encode_decode/decoder_lib.c" + ], + "crypto/encode_decode/libcrypto-lib-decoder_meth.o" => [ + "crypto/encode_decode/decoder_meth.c" + ], + "crypto/encode_decode/libcrypto-lib-decoder_pkey.o" => [ + "crypto/encode_decode/decoder_pkey.c" + ], + "crypto/encode_decode/libcrypto-lib-encoder_err.o" => [ + "crypto/encode_decode/encoder_err.c" + ], + "crypto/encode_decode/libcrypto-lib-encoder_lib.o" => [ + "crypto/encode_decode/encoder_lib.c" + ], + "crypto/encode_decode/libcrypto-lib-encoder_meth.o" => [ + "crypto/encode_decode/encoder_meth.c" + ], + "crypto/encode_decode/libcrypto-lib-encoder_pkey.o" => [ + "crypto/encode_decode/encoder_pkey.c" + ], + "crypto/engine/libcrypto-lib-eng_all.o" => [ + "crypto/engine/eng_all.c" + ], + "crypto/engine/libcrypto-lib-eng_cnf.o" => [ + "crypto/engine/eng_cnf.c" + ], + "crypto/engine/libcrypto-lib-eng_ctrl.o" => [ + "crypto/engine/eng_ctrl.c" + ], + "crypto/engine/libcrypto-lib-eng_dyn.o" => [ + "crypto/engine/eng_dyn.c" + ], + "crypto/engine/libcrypto-lib-eng_err.o" => [ + "crypto/engine/eng_err.c" + ], + "crypto/engine/libcrypto-lib-eng_fat.o" => [ + "crypto/engine/eng_fat.c" + ], + "crypto/engine/libcrypto-lib-eng_init.o" => [ + "crypto/engine/eng_init.c" + ], + "crypto/engine/libcrypto-lib-eng_lib.o" => [ + "crypto/engine/eng_lib.c" + ], + "crypto/engine/libcrypto-lib-eng_list.o" => [ + "crypto/engine/eng_list.c" + ], + "crypto/engine/libcrypto-lib-eng_openssl.o" => [ + "crypto/engine/eng_openssl.c" + ], + "crypto/engine/libcrypto-lib-eng_pkey.o" => [ + "crypto/engine/eng_pkey.c" + ], + "crypto/engine/libcrypto-lib-eng_rdrand.o" => [ + "crypto/engine/eng_rdrand.c" + ], + "crypto/engine/libcrypto-lib-eng_table.o" => [ + "crypto/engine/eng_table.c" + ], + "crypto/engine/libcrypto-lib-tb_asnmth.o" => [ + "crypto/engine/tb_asnmth.c" + ], + "crypto/engine/libcrypto-lib-tb_cipher.o" => [ + "crypto/engine/tb_cipher.c" + ], + "crypto/engine/libcrypto-lib-tb_dh.o" => [ + "crypto/engine/tb_dh.c" + ], + "crypto/engine/libcrypto-lib-tb_digest.o" => [ + "crypto/engine/tb_digest.c" + ], + "crypto/engine/libcrypto-lib-tb_dsa.o" => [ + "crypto/engine/tb_dsa.c" + ], + "crypto/engine/libcrypto-lib-tb_eckey.o" => [ + "crypto/engine/tb_eckey.c" + ], + "crypto/engine/libcrypto-lib-tb_pkmeth.o" => [ + "crypto/engine/tb_pkmeth.c" + ], + "crypto/engine/libcrypto-lib-tb_rand.o" => [ + "crypto/engine/tb_rand.c" + ], + "crypto/engine/libcrypto-lib-tb_rsa.o" => [ + "crypto/engine/tb_rsa.c" + ], + "crypto/err/libcrypto-lib-err.o" => [ + "crypto/err/err.c" + ], + "crypto/err/libcrypto-lib-err_all.o" => [ + "crypto/err/err_all.c" + ], + "crypto/err/libcrypto-lib-err_all_legacy.o" => [ + "crypto/err/err_all_legacy.c" + ], + "crypto/err/libcrypto-lib-err_blocks.o" => [ + "crypto/err/err_blocks.c" + ], + "crypto/err/libcrypto-lib-err_mark.o" => [ + "crypto/err/err_mark.c" + ], + "crypto/err/libcrypto-lib-err_prn.o" => [ + "crypto/err/err_prn.c" + ], + "crypto/err/libcrypto-lib-err_save.o" => [ + "crypto/err/err_save.c" + ], + "crypto/ess/libcrypto-lib-ess_asn1.o" => [ + "crypto/ess/ess_asn1.c" + ], + "crypto/ess/libcrypto-lib-ess_err.o" => [ + "crypto/ess/ess_err.c" + ], + "crypto/ess/libcrypto-lib-ess_lib.o" => [ + "crypto/ess/ess_lib.c" + ], + "crypto/evp/libcrypto-lib-asymcipher.o" => [ + "crypto/evp/asymcipher.c" + ], + "crypto/evp/libcrypto-lib-bio_b64.o" => [ + "crypto/evp/bio_b64.c" + ], + "crypto/evp/libcrypto-lib-bio_enc.o" => [ + "crypto/evp/bio_enc.c" + ], + "crypto/evp/libcrypto-lib-bio_md.o" => [ + "crypto/evp/bio_md.c" + ], + "crypto/evp/libcrypto-lib-bio_ok.o" => [ + "crypto/evp/bio_ok.c" + ], + "crypto/evp/libcrypto-lib-c_allc.o" => [ + "crypto/evp/c_allc.c" + ], + "crypto/evp/libcrypto-lib-c_alld.o" => [ + "crypto/evp/c_alld.c" + ], + "crypto/evp/libcrypto-lib-cmeth_lib.o" => [ + "crypto/evp/cmeth_lib.c" + ], + "crypto/evp/libcrypto-lib-ctrl_params_translate.o" => [ + "crypto/evp/ctrl_params_translate.c" + ], + "crypto/evp/libcrypto-lib-dh_ctrl.o" => [ + "crypto/evp/dh_ctrl.c" + ], + "crypto/evp/libcrypto-lib-dh_support.o" => [ + "crypto/evp/dh_support.c" + ], + "crypto/evp/libcrypto-lib-digest.o" => [ + "crypto/evp/digest.c" + ], + "crypto/evp/libcrypto-lib-dsa_ctrl.o" => [ + "crypto/evp/dsa_ctrl.c" + ], + "crypto/evp/libcrypto-lib-e_aes.o" => [ + "crypto/evp/e_aes.c" + ], + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha1.o" => [ + "crypto/evp/e_aes_cbc_hmac_sha1.c" + ], + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha256.o" => [ + "crypto/evp/e_aes_cbc_hmac_sha256.c" + ], + "crypto/evp/libcrypto-lib-e_aria.o" => [ + "crypto/evp/e_aria.c" + ], + "crypto/evp/libcrypto-lib-e_bf.o" => [ + "crypto/evp/e_bf.c" + ], + "crypto/evp/libcrypto-lib-e_camellia.o" => [ + "crypto/evp/e_camellia.c" + ], + "crypto/evp/libcrypto-lib-e_cast.o" => [ + "crypto/evp/e_cast.c" + ], + "crypto/evp/libcrypto-lib-e_chacha20_poly1305.o" => [ + "crypto/evp/e_chacha20_poly1305.c" + ], + "crypto/evp/libcrypto-lib-e_des.o" => [ + "crypto/evp/e_des.c" + ], + "crypto/evp/libcrypto-lib-e_des3.o" => [ + "crypto/evp/e_des3.c" + ], + "crypto/evp/libcrypto-lib-e_idea.o" => [ + "crypto/evp/e_idea.c" + ], + "crypto/evp/libcrypto-lib-e_null.o" => [ + "crypto/evp/e_null.c" + ], + "crypto/evp/libcrypto-lib-e_old.o" => [ + "crypto/evp/e_old.c" + ], + "crypto/evp/libcrypto-lib-e_rc2.o" => [ + "crypto/evp/e_rc2.c" + ], + "crypto/evp/libcrypto-lib-e_rc4.o" => [ + "crypto/evp/e_rc4.c" + ], + "crypto/evp/libcrypto-lib-e_rc4_hmac_md5.o" => [ + "crypto/evp/e_rc4_hmac_md5.c" + ], + "crypto/evp/libcrypto-lib-e_rc5.o" => [ + "crypto/evp/e_rc5.c" + ], + "crypto/evp/libcrypto-lib-e_seed.o" => [ + "crypto/evp/e_seed.c" + ], + "crypto/evp/libcrypto-lib-e_sm4.o" => [ + "crypto/evp/e_sm4.c" + ], + "crypto/evp/libcrypto-lib-e_xcbc_d.o" => [ + "crypto/evp/e_xcbc_d.c" + ], + "crypto/evp/libcrypto-lib-ec_ctrl.o" => [ + "crypto/evp/ec_ctrl.c" + ], + "crypto/evp/libcrypto-lib-ec_support.o" => [ + "crypto/evp/ec_support.c" + ], + "crypto/evp/libcrypto-lib-encode.o" => [ + "crypto/evp/encode.c" + ], + "crypto/evp/libcrypto-lib-evp_cnf.o" => [ + "crypto/evp/evp_cnf.c" + ], + "crypto/evp/libcrypto-lib-evp_enc.o" => [ + "crypto/evp/evp_enc.c" + ], + "crypto/evp/libcrypto-lib-evp_err.o" => [ + "crypto/evp/evp_err.c" + ], + "crypto/evp/libcrypto-lib-evp_fetch.o" => [ + "crypto/evp/evp_fetch.c" + ], + "crypto/evp/libcrypto-lib-evp_key.o" => [ + "crypto/evp/evp_key.c" + ], + "crypto/evp/libcrypto-lib-evp_lib.o" => [ + "crypto/evp/evp_lib.c" + ], + "crypto/evp/libcrypto-lib-evp_pbe.o" => [ + "crypto/evp/evp_pbe.c" + ], + "crypto/evp/libcrypto-lib-evp_pkey.o" => [ + "crypto/evp/evp_pkey.c" + ], + "crypto/evp/libcrypto-lib-evp_rand.o" => [ + "crypto/evp/evp_rand.c" + ], + "crypto/evp/libcrypto-lib-evp_utils.o" => [ + "crypto/evp/evp_utils.c" + ], + "crypto/evp/libcrypto-lib-exchange.o" => [ + "crypto/evp/exchange.c" + ], + "crypto/evp/libcrypto-lib-kdf_lib.o" => [ + "crypto/evp/kdf_lib.c" + ], + "crypto/evp/libcrypto-lib-kdf_meth.o" => [ + "crypto/evp/kdf_meth.c" + ], + "crypto/evp/libcrypto-lib-kem.o" => [ + "crypto/evp/kem.c" + ], + "crypto/evp/libcrypto-lib-keymgmt_lib.o" => [ + "crypto/evp/keymgmt_lib.c" + ], + "crypto/evp/libcrypto-lib-keymgmt_meth.o" => [ + "crypto/evp/keymgmt_meth.c" + ], + "crypto/evp/libcrypto-lib-legacy_blake2.o" => [ + "crypto/evp/legacy_blake2.c" + ], + "crypto/evp/libcrypto-lib-legacy_md4.o" => [ + "crypto/evp/legacy_md4.c" + ], + "crypto/evp/libcrypto-lib-legacy_md5.o" => [ + "crypto/evp/legacy_md5.c" + ], + "crypto/evp/libcrypto-lib-legacy_md5_sha1.o" => [ + "crypto/evp/legacy_md5_sha1.c" + ], + "crypto/evp/libcrypto-lib-legacy_mdc2.o" => [ + "crypto/evp/legacy_mdc2.c" + ], + "crypto/evp/libcrypto-lib-legacy_ripemd.o" => [ + "crypto/evp/legacy_ripemd.c" + ], + "crypto/evp/libcrypto-lib-legacy_sha.o" => [ + "crypto/evp/legacy_sha.c" + ], + "crypto/evp/libcrypto-lib-legacy_wp.o" => [ + "crypto/evp/legacy_wp.c" + ], + "crypto/evp/libcrypto-lib-m_null.o" => [ + "crypto/evp/m_null.c" + ], + "crypto/evp/libcrypto-lib-m_sigver.o" => [ + "crypto/evp/m_sigver.c" + ], + "crypto/evp/libcrypto-lib-mac_lib.o" => [ + "crypto/evp/mac_lib.c" + ], + "crypto/evp/libcrypto-lib-mac_meth.o" => [ + "crypto/evp/mac_meth.c" + ], + "crypto/evp/libcrypto-lib-names.o" => [ + "crypto/evp/names.c" + ], + "crypto/evp/libcrypto-lib-p5_crpt.o" => [ + "crypto/evp/p5_crpt.c" + ], + "crypto/evp/libcrypto-lib-p5_crpt2.o" => [ + "crypto/evp/p5_crpt2.c" + ], + "crypto/evp/libcrypto-lib-p_dec.o" => [ + "crypto/evp/p_dec.c" + ], + "crypto/evp/libcrypto-lib-p_enc.o" => [ + "crypto/evp/p_enc.c" + ], + "crypto/evp/libcrypto-lib-p_legacy.o" => [ + "crypto/evp/p_legacy.c" + ], + "crypto/evp/libcrypto-lib-p_lib.o" => [ + "crypto/evp/p_lib.c" + ], + "crypto/evp/libcrypto-lib-p_open.o" => [ + "crypto/evp/p_open.c" + ], + "crypto/evp/libcrypto-lib-p_seal.o" => [ + "crypto/evp/p_seal.c" + ], + "crypto/evp/libcrypto-lib-p_sign.o" => [ + "crypto/evp/p_sign.c" + ], + "crypto/evp/libcrypto-lib-p_verify.o" => [ + "crypto/evp/p_verify.c" + ], + "crypto/evp/libcrypto-lib-pbe_scrypt.o" => [ + "crypto/evp/pbe_scrypt.c" + ], + "crypto/evp/libcrypto-lib-pmeth_check.o" => [ + "crypto/evp/pmeth_check.c" + ], + "crypto/evp/libcrypto-lib-pmeth_gn.o" => [ + "crypto/evp/pmeth_gn.c" + ], + "crypto/evp/libcrypto-lib-pmeth_lib.o" => [ + "crypto/evp/pmeth_lib.c" + ], + "crypto/evp/libcrypto-lib-s_lib.o" => [ + "crypto/evp/s_lib.c" + ], + "crypto/evp/libcrypto-lib-signature.o" => [ + "crypto/evp/signature.c" + ], + "crypto/evp/libcrypto-lib-skeymgmt_meth.o" => [ + "crypto/evp/skeymgmt_meth.c" + ], + "crypto/evp/libfips-lib-asymcipher.o" => [ + "crypto/evp/asymcipher.c" + ], + "crypto/evp/libfips-lib-dh_support.o" => [ + "crypto/evp/dh_support.c" + ], + "crypto/evp/libfips-lib-digest.o" => [ + "crypto/evp/digest.c" + ], + "crypto/evp/libfips-lib-ec_support.o" => [ + "crypto/evp/ec_support.c" + ], + "crypto/evp/libfips-lib-evp_enc.o" => [ + "crypto/evp/evp_enc.c" + ], + "crypto/evp/libfips-lib-evp_fetch.o" => [ + "crypto/evp/evp_fetch.c" + ], + "crypto/evp/libfips-lib-evp_lib.o" => [ + "crypto/evp/evp_lib.c" + ], + "crypto/evp/libfips-lib-evp_rand.o" => [ + "crypto/evp/evp_rand.c" + ], + "crypto/evp/libfips-lib-evp_utils.o" => [ + "crypto/evp/evp_utils.c" + ], + "crypto/evp/libfips-lib-exchange.o" => [ + "crypto/evp/exchange.c" + ], + "crypto/evp/libfips-lib-kdf_lib.o" => [ + "crypto/evp/kdf_lib.c" + ], + "crypto/evp/libfips-lib-kdf_meth.o" => [ + "crypto/evp/kdf_meth.c" + ], + "crypto/evp/libfips-lib-kem.o" => [ + "crypto/evp/kem.c" + ], + "crypto/evp/libfips-lib-keymgmt_lib.o" => [ + "crypto/evp/keymgmt_lib.c" + ], + "crypto/evp/libfips-lib-keymgmt_meth.o" => [ + "crypto/evp/keymgmt_meth.c" + ], + "crypto/evp/libfips-lib-mac_lib.o" => [ + "crypto/evp/mac_lib.c" + ], + "crypto/evp/libfips-lib-mac_meth.o" => [ + "crypto/evp/mac_meth.c" + ], + "crypto/evp/libfips-lib-p_lib.o" => [ + "crypto/evp/p_lib.c" + ], + "crypto/evp/libfips-lib-pmeth_check.o" => [ + "crypto/evp/pmeth_check.c" + ], + "crypto/evp/libfips-lib-pmeth_gn.o" => [ + "crypto/evp/pmeth_gn.c" + ], + "crypto/evp/libfips-lib-pmeth_lib.o" => [ + "crypto/evp/pmeth_lib.c" + ], + "crypto/evp/libfips-lib-s_lib.o" => [ + "crypto/evp/s_lib.c" + ], + "crypto/evp/libfips-lib-signature.o" => [ + "crypto/evp/signature.c" + ], + "crypto/evp/libfips-lib-skeymgmt_meth.o" => [ + "crypto/evp/skeymgmt_meth.c" + ], + "crypto/ffc/libcrypto-lib-ffc_backend.o" => [ + "crypto/ffc/ffc_backend.c" + ], + "crypto/ffc/libcrypto-lib-ffc_dh.o" => [ + "crypto/ffc/ffc_dh.c" + ], + "crypto/ffc/libcrypto-lib-ffc_key_generate.o" => [ + "crypto/ffc/ffc_key_generate.c" + ], + "crypto/ffc/libcrypto-lib-ffc_key_validate.o" => [ + "crypto/ffc/ffc_key_validate.c" + ], + "crypto/ffc/libcrypto-lib-ffc_params.o" => [ + "crypto/ffc/ffc_params.c" + ], + "crypto/ffc/libcrypto-lib-ffc_params_generate.o" => [ + "crypto/ffc/ffc_params_generate.c" + ], + "crypto/ffc/libcrypto-lib-ffc_params_validate.o" => [ + "crypto/ffc/ffc_params_validate.c" + ], + "crypto/ffc/libfips-lib-ffc_backend.o" => [ + "crypto/ffc/ffc_backend.c" + ], + "crypto/ffc/libfips-lib-ffc_dh.o" => [ + "crypto/ffc/ffc_dh.c" + ], + "crypto/ffc/libfips-lib-ffc_key_generate.o" => [ + "crypto/ffc/ffc_key_generate.c" + ], + "crypto/ffc/libfips-lib-ffc_key_validate.o" => [ + "crypto/ffc/ffc_key_validate.c" + ], + "crypto/ffc/libfips-lib-ffc_params.o" => [ + "crypto/ffc/ffc_params.c" + ], + "crypto/ffc/libfips-lib-ffc_params_generate.o" => [ + "crypto/ffc/ffc_params_generate.c" + ], + "crypto/ffc/libfips-lib-ffc_params_validate.o" => [ + "crypto/ffc/ffc_params_validate.c" + ], + "crypto/hashtable/libcrypto-lib-hashfunc.o" => [ + "crypto/hashtable/hashfunc.c" + ], + "crypto/hashtable/libcrypto-lib-hashtable.o" => [ + "crypto/hashtable/hashtable.c" + ], + "crypto/hashtable/libfips-lib-hashfunc.o" => [ + "crypto/hashtable/hashfunc.c" + ], + "crypto/hashtable/libfips-lib-hashtable.o" => [ + "crypto/hashtable/hashtable.c" + ], + "crypto/hmac/libcrypto-lib-hmac.o" => [ + "crypto/hmac/hmac.c" + ], + "crypto/hmac/libfips-lib-hmac.o" => [ + "crypto/hmac/hmac.c" + ], + "crypto/hpke/libcrypto-lib-hpke.o" => [ + "crypto/hpke/hpke.c" + ], + "crypto/hpke/libcrypto-lib-hpke_util.o" => [ + "crypto/hpke/hpke_util.c" + ], + "crypto/http/libcrypto-lib-http_client.o" => [ + "crypto/http/http_client.c" + ], + "crypto/http/libcrypto-lib-http_err.o" => [ + "crypto/http/http_err.c" + ], + "crypto/http/libcrypto-lib-http_lib.o" => [ + "crypto/http/http_lib.c" + ], + "crypto/idea/libcrypto-lib-i_cbc.o" => [ + "crypto/idea/i_cbc.c" + ], + "crypto/idea/libcrypto-lib-i_cfb64.o" => [ + "crypto/idea/i_cfb64.c" + ], + "crypto/idea/libcrypto-lib-i_ecb.o" => [ + "crypto/idea/i_ecb.c" + ], + "crypto/idea/libcrypto-lib-i_ofb64.o" => [ + "crypto/idea/i_ofb64.c" + ], + "crypto/idea/libcrypto-lib-i_skey.o" => [ + "crypto/idea/i_skey.c" + ], + "crypto/kdf/libcrypto-lib-kdf_err.o" => [ + "crypto/kdf/kdf_err.c" + ], + "crypto/lhash/libcrypto-lib-lh_stats.o" => [ + "crypto/lhash/lh_stats.c" + ], + "crypto/lhash/libcrypto-lib-lhash.o" => [ + "crypto/lhash/lhash.c" + ], + "crypto/lhash/libfips-lib-lhash.o" => [ + "crypto/lhash/lhash.c" + ], + "crypto/libcrypto-lib-asn1_dsa.o" => [ + "crypto/asn1_dsa.c" + ], + "crypto/libcrypto-lib-bsearch.o" => [ + "crypto/bsearch.c" + ], + "crypto/libcrypto-lib-comp_methods.o" => [ + "crypto/comp_methods.c" + ], + "crypto/libcrypto-lib-context.o" => [ + "crypto/context.c" + ], + "crypto/libcrypto-lib-core_algorithm.o" => [ + "crypto/core_algorithm.c" + ], + "crypto/libcrypto-lib-core_fetch.o" => [ + "crypto/core_fetch.c" + ], + "crypto/libcrypto-lib-core_namemap.o" => [ + "crypto/core_namemap.c" + ], + "crypto/libcrypto-lib-cpt_err.o" => [ + "crypto/cpt_err.c" + ], + "crypto/libcrypto-lib-cpuid.o" => [ + "crypto/cpuid.c" + ], + "crypto/libcrypto-lib-cryptlib.o" => [ + "crypto/cryptlib.c" + ], + "crypto/libcrypto-lib-ctype.o" => [ + "crypto/ctype.c" + ], + "crypto/libcrypto-lib-cversion.o" => [ + "crypto/cversion.c" + ], + "crypto/libcrypto-lib-defaults.o" => [ + "crypto/defaults.c" + ], + "crypto/libcrypto-lib-der_writer.o" => [ + "crypto/der_writer.c" + ], + "crypto/libcrypto-lib-deterministic_nonce.o" => [ + "crypto/deterministic_nonce.c" + ], + "crypto/libcrypto-lib-ebcdic.o" => [ + "crypto/ebcdic.c" + ], + "crypto/libcrypto-lib-ex_data.o" => [ + "crypto/ex_data.c" + ], + "crypto/libcrypto-lib-getenv.o" => [ + "crypto/getenv.c" + ], + "crypto/libcrypto-lib-indicator_core.o" => [ + "crypto/indicator_core.c" + ], + "crypto/libcrypto-lib-info.o" => [ + "crypto/info.c" + ], + "crypto/libcrypto-lib-init.o" => [ + "crypto/init.c" + ], + "crypto/libcrypto-lib-initthread.o" => [ + "crypto/initthread.c" + ], + "crypto/libcrypto-lib-mem.o" => [ + "crypto/mem.c" + ], + "crypto/libcrypto-lib-mem_sec.o" => [ + "crypto/mem_sec.c" + ], + "crypto/libcrypto-lib-o_dir.o" => [ + "crypto/o_dir.c" + ], + "crypto/libcrypto-lib-o_fopen.o" => [ + "crypto/o_fopen.c" + ], + "crypto/libcrypto-lib-o_init.o" => [ + "crypto/o_init.c" + ], + "crypto/libcrypto-lib-o_str.o" => [ + "crypto/o_str.c" + ], + "crypto/libcrypto-lib-o_time.o" => [ + "crypto/o_time.c" + ], + "crypto/libcrypto-lib-packet.o" => [ + "crypto/packet.c" + ], + "crypto/libcrypto-lib-param_build.o" => [ + "crypto/param_build.c" + ], + "crypto/libcrypto-lib-param_build_set.o" => [ + "crypto/param_build_set.c" + ], + "crypto/libcrypto-lib-params.o" => [ + "crypto/params.c" + ], + "crypto/libcrypto-lib-params_dup.o" => [ + "crypto/params_dup.c" + ], + "crypto/libcrypto-lib-params_from_text.o" => [ + "crypto/params_from_text.c" + ], + "crypto/libcrypto-lib-params_idx.o" => [ + "crypto/params_idx.c" + ], + "crypto/libcrypto-lib-passphrase.o" => [ + "crypto/passphrase.c" + ], + "crypto/libcrypto-lib-provider.o" => [ + "crypto/provider.c" + ], + "crypto/libcrypto-lib-provider_child.o" => [ + "crypto/provider_child.c" + ], + "crypto/libcrypto-lib-provider_conf.o" => [ + "crypto/provider_conf.c" + ], + "crypto/libcrypto-lib-provider_core.o" => [ + "crypto/provider_core.c" + ], + "crypto/libcrypto-lib-provider_predefined.o" => [ + "crypto/provider_predefined.c" + ], + "crypto/libcrypto-lib-punycode.o" => [ + "crypto/punycode.c" + ], + "crypto/libcrypto-lib-quic_vlint.o" => [ + "crypto/quic_vlint.c" + ], + "crypto/libcrypto-lib-riscv64cpuid.o" => [ + "crypto/riscv64cpuid.s" + ], + "crypto/libcrypto-lib-riscvcap.o" => [ + "crypto/riscvcap.c" + ], + "crypto/libcrypto-lib-self_test_core.o" => [ + "crypto/self_test_core.c" + ], + "crypto/libcrypto-lib-sleep.o" => [ + "crypto/sleep.c" + ], + "crypto/libcrypto-lib-sparse_array.o" => [ + "crypto/sparse_array.c" + ], + "crypto/libcrypto-lib-ssl_err.o" => [ + "crypto/ssl_err.c" + ], + "crypto/libcrypto-lib-threads_lib.o" => [ + "crypto/threads_lib.c" + ], + "crypto/libcrypto-lib-threads_none.o" => [ + "crypto/threads_none.c" + ], + "crypto/libcrypto-lib-threads_pthread.o" => [ + "crypto/threads_pthread.c" + ], + "crypto/libcrypto-lib-threads_win.o" => [ + "crypto/threads_win.c" + ], + "crypto/libcrypto-lib-time.o" => [ + "crypto/time.c" + ], + "crypto/libcrypto-lib-trace.o" => [ + "crypto/trace.c" + ], + "crypto/libcrypto-lib-uid.o" => [ + "crypto/uid.c" + ], + "crypto/libfips-lib-asn1_dsa.o" => [ + "crypto/asn1_dsa.c" + ], + "crypto/libfips-lib-bsearch.o" => [ + "crypto/bsearch.c" + ], + "crypto/libfips-lib-context.o" => [ + "crypto/context.c" + ], + "crypto/libfips-lib-core_algorithm.o" => [ + "crypto/core_algorithm.c" + ], + "crypto/libfips-lib-core_fetch.o" => [ + "crypto/core_fetch.c" + ], + "crypto/libfips-lib-core_namemap.o" => [ + "crypto/core_namemap.c" + ], + "crypto/libfips-lib-cpuid.o" => [ + "crypto/cpuid.c" + ], + "crypto/libfips-lib-cryptlib.o" => [ + "crypto/cryptlib.c" + ], + "crypto/libfips-lib-ctype.o" => [ + "crypto/ctype.c" + ], + "crypto/libfips-lib-der_writer.o" => [ + "crypto/der_writer.c" + ], + "crypto/libfips-lib-ex_data.o" => [ + "crypto/ex_data.c" + ], + "crypto/libfips-lib-initthread.o" => [ + "crypto/initthread.c" + ], + "crypto/libfips-lib-o_str.o" => [ + "crypto/o_str.c" + ], + "crypto/libfips-lib-packet.o" => [ + "crypto/packet.c" + ], + "crypto/libfips-lib-param_build.o" => [ + "crypto/param_build.c" + ], + "crypto/libfips-lib-param_build_set.o" => [ + "crypto/param_build_set.c" + ], + "crypto/libfips-lib-params.o" => [ + "crypto/params.c" + ], + "crypto/libfips-lib-params_dup.o" => [ + "crypto/params_dup.c" + ], + "crypto/libfips-lib-params_from_text.o" => [ + "crypto/params_from_text.c" + ], + "crypto/libfips-lib-params_idx.o" => [ + "crypto/params_idx.c" + ], + "crypto/libfips-lib-provider_core.o" => [ + "crypto/provider_core.c" + ], + "crypto/libfips-lib-provider_predefined.o" => [ + "crypto/provider_predefined.c" + ], + "crypto/libfips-lib-riscv64cpuid.o" => [ + "crypto/riscv64cpuid.s" + ], + "crypto/libfips-lib-riscvcap.o" => [ + "crypto/riscvcap.c" + ], + "crypto/libfips-lib-self_test_core.o" => [ + "crypto/self_test_core.c" + ], + "crypto/libfips-lib-sparse_array.o" => [ + "crypto/sparse_array.c" + ], + "crypto/libfips-lib-threads_lib.o" => [ + "crypto/threads_lib.c" + ], + "crypto/libfips-lib-threads_none.o" => [ + "crypto/threads_none.c" + ], + "crypto/libfips-lib-threads_pthread.o" => [ + "crypto/threads_pthread.c" + ], + "crypto/libfips-lib-threads_win.o" => [ + "crypto/threads_win.c" + ], + "crypto/libfips-lib-time.o" => [ + "crypto/time.c" + ], + "crypto/md4/libcrypto-lib-md4_dgst.o" => [ + "crypto/md4/md4_dgst.c" + ], + "crypto/md4/libcrypto-lib-md4_one.o" => [ + "crypto/md4/md4_one.c" + ], + "crypto/md5/libcrypto-lib-md5_dgst.o" => [ + "crypto/md5/md5_dgst.c" + ], + "crypto/md5/libcrypto-lib-md5_one.o" => [ + "crypto/md5/md5_one.c" + ], + "crypto/md5/libcrypto-lib-md5_sha1.o" => [ + "crypto/md5/md5_sha1.c" + ], + "crypto/mdc2/libcrypto-lib-mdc2_one.o" => [ + "crypto/mdc2/mdc2_one.c" + ], + "crypto/mdc2/libcrypto-lib-mdc2dgst.o" => [ + "crypto/mdc2/mdc2dgst.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_encoders.o" => [ + "crypto/ml_dsa/ml_dsa_encoders.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_key.o" => [ + "crypto/ml_dsa/ml_dsa_key.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_key_compress.o" => [ + "crypto/ml_dsa/ml_dsa_key_compress.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_matrix.o" => [ + "crypto/ml_dsa/ml_dsa_matrix.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_ntt.o" => [ + "crypto/ml_dsa/ml_dsa_ntt.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_params.o" => [ + "crypto/ml_dsa/ml_dsa_params.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_sample.o" => [ + "crypto/ml_dsa/ml_dsa_sample.c" + ], + "crypto/ml_dsa/libcrypto-lib-ml_dsa_sign.o" => [ + "crypto/ml_dsa/ml_dsa_sign.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_encoders.o" => [ + "crypto/ml_dsa/ml_dsa_encoders.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_key.o" => [ + "crypto/ml_dsa/ml_dsa_key.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_key_compress.o" => [ + "crypto/ml_dsa/ml_dsa_key_compress.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_matrix.o" => [ + "crypto/ml_dsa/ml_dsa_matrix.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_ntt.o" => [ + "crypto/ml_dsa/ml_dsa_ntt.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_params.o" => [ + "crypto/ml_dsa/ml_dsa_params.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_sample.o" => [ + "crypto/ml_dsa/ml_dsa_sample.c" + ], + "crypto/ml_dsa/libfips-lib-ml_dsa_sign.o" => [ + "crypto/ml_dsa/ml_dsa_sign.c" + ], + "crypto/ml_kem/libcrypto-lib-ml_kem.o" => [ + "crypto/ml_kem/ml_kem.c" + ], + "crypto/ml_kem/libfips-lib-ml_kem.o" => [ + "crypto/ml_kem/ml_kem.c" + ], + "crypto/modes/libcrypto-lib-aes-gcm-riscv64-zvkb-zvkg-zvkned.o" => [ + "crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s" + ], + "crypto/modes/libcrypto-lib-cbc128.o" => [ + "crypto/modes/cbc128.c" + ], + "crypto/modes/libcrypto-lib-ccm128.o" => [ + "crypto/modes/ccm128.c" + ], + "crypto/modes/libcrypto-lib-cfb128.o" => [ + "crypto/modes/cfb128.c" + ], + "crypto/modes/libcrypto-lib-ctr128.o" => [ + "crypto/modes/ctr128.c" + ], + "crypto/modes/libcrypto-lib-cts128.o" => [ + "crypto/modes/cts128.c" + ], + "crypto/modes/libcrypto-lib-gcm128.o" => [ + "crypto/modes/gcm128.c" + ], + "crypto/modes/libcrypto-lib-ghash-riscv64-zvkb-zvbc.o" => [ + "crypto/modes/ghash-riscv64-zvkb-zvbc.s" + ], + "crypto/modes/libcrypto-lib-ghash-riscv64-zvkg.o" => [ + "crypto/modes/ghash-riscv64-zvkg.s" + ], + "crypto/modes/libcrypto-lib-ghash-riscv64.o" => [ + "crypto/modes/ghash-riscv64.s" + ], + "crypto/modes/libcrypto-lib-ocb128.o" => [ + "crypto/modes/ocb128.c" + ], + "crypto/modes/libcrypto-lib-ofb128.o" => [ + "crypto/modes/ofb128.c" + ], + "crypto/modes/libcrypto-lib-siv128.o" => [ + "crypto/modes/siv128.c" + ], + "crypto/modes/libcrypto-lib-wrap128.o" => [ + "crypto/modes/wrap128.c" + ], + "crypto/modes/libcrypto-lib-xts128.o" => [ + "crypto/modes/xts128.c" + ], + "crypto/modes/libcrypto-lib-xts128gb.o" => [ + "crypto/modes/xts128gb.c" + ], + "crypto/modes/libfips-lib-aes-gcm-riscv64-zvkb-zvkg-zvkned.o" => [ + "crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s" + ], + "crypto/modes/libfips-lib-cbc128.o" => [ + "crypto/modes/cbc128.c" + ], + "crypto/modes/libfips-lib-ccm128.o" => [ + "crypto/modes/ccm128.c" + ], + "crypto/modes/libfips-lib-cfb128.o" => [ + "crypto/modes/cfb128.c" + ], + "crypto/modes/libfips-lib-ctr128.o" => [ + "crypto/modes/ctr128.c" + ], + "crypto/modes/libfips-lib-gcm128.o" => [ + "crypto/modes/gcm128.c" + ], + "crypto/modes/libfips-lib-ghash-riscv64-zvkb-zvbc.o" => [ + "crypto/modes/ghash-riscv64-zvkb-zvbc.s" + ], + "crypto/modes/libfips-lib-ghash-riscv64-zvkg.o" => [ + "crypto/modes/ghash-riscv64-zvkg.s" + ], + "crypto/modes/libfips-lib-ghash-riscv64.o" => [ + "crypto/modes/ghash-riscv64.s" + ], + "crypto/modes/libfips-lib-ofb128.o" => [ + "crypto/modes/ofb128.c" + ], + "crypto/modes/libfips-lib-wrap128.o" => [ + "crypto/modes/wrap128.c" + ], + "crypto/modes/libfips-lib-xts128.o" => [ + "crypto/modes/xts128.c" + ], + "crypto/modes/libfips-lib-xts128gb.o" => [ + "crypto/modes/xts128gb.c" + ], + "crypto/objects/libcrypto-lib-o_names.o" => [ + "crypto/objects/o_names.c" + ], + "crypto/objects/libcrypto-lib-obj_dat.o" => [ + "crypto/objects/obj_dat.c" + ], + "crypto/objects/libcrypto-lib-obj_err.o" => [ + "crypto/objects/obj_err.c" + ], + "crypto/objects/libcrypto-lib-obj_lib.o" => [ + "crypto/objects/obj_lib.c" + ], + "crypto/objects/libcrypto-lib-obj_xref.o" => [ + "crypto/objects/obj_xref.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_asn.o" => [ + "crypto/ocsp/ocsp_asn.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_cl.o" => [ + "crypto/ocsp/ocsp_cl.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_err.o" => [ + "crypto/ocsp/ocsp_err.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_ext.o" => [ + "crypto/ocsp/ocsp_ext.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_http.o" => [ + "crypto/ocsp/ocsp_http.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_lib.o" => [ + "crypto/ocsp/ocsp_lib.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_prn.o" => [ + "crypto/ocsp/ocsp_prn.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_srv.o" => [ + "crypto/ocsp/ocsp_srv.c" + ], + "crypto/ocsp/libcrypto-lib-ocsp_vfy.o" => [ + "crypto/ocsp/ocsp_vfy.c" + ], + "crypto/ocsp/libcrypto-lib-v3_ocsp.o" => [ + "crypto/ocsp/v3_ocsp.c" + ], + "crypto/pem/libcrypto-lib-pem_all.o" => [ + "crypto/pem/pem_all.c" + ], + "crypto/pem/libcrypto-lib-pem_err.o" => [ + "crypto/pem/pem_err.c" + ], + "crypto/pem/libcrypto-lib-pem_info.o" => [ + "crypto/pem/pem_info.c" + ], + "crypto/pem/libcrypto-lib-pem_lib.o" => [ + "crypto/pem/pem_lib.c" + ], + "crypto/pem/libcrypto-lib-pem_oth.o" => [ + "crypto/pem/pem_oth.c" + ], + "crypto/pem/libcrypto-lib-pem_pk8.o" => [ + "crypto/pem/pem_pk8.c" + ], + "crypto/pem/libcrypto-lib-pem_pkey.o" => [ + "crypto/pem/pem_pkey.c" + ], + "crypto/pem/libcrypto-lib-pem_sign.o" => [ + "crypto/pem/pem_sign.c" + ], + "crypto/pem/libcrypto-lib-pem_x509.o" => [ + "crypto/pem/pem_x509.c" + ], + "crypto/pem/libcrypto-lib-pem_xaux.o" => [ + "crypto/pem/pem_xaux.c" + ], + "crypto/pem/libcrypto-lib-pvkfmt.o" => [ + "crypto/pem/pvkfmt.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_add.o" => [ + "crypto/pkcs12/p12_add.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_asn.o" => [ + "crypto/pkcs12/p12_asn.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_attr.o" => [ + "crypto/pkcs12/p12_attr.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_crpt.o" => [ + "crypto/pkcs12/p12_crpt.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_crt.o" => [ + "crypto/pkcs12/p12_crt.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_decr.o" => [ + "crypto/pkcs12/p12_decr.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_init.o" => [ + "crypto/pkcs12/p12_init.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_key.o" => [ + "crypto/pkcs12/p12_key.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_kiss.o" => [ + "crypto/pkcs12/p12_kiss.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_mutl.o" => [ + "crypto/pkcs12/p12_mutl.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_npas.o" => [ + "crypto/pkcs12/p12_npas.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_p8d.o" => [ + "crypto/pkcs12/p12_p8d.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_p8e.o" => [ + "crypto/pkcs12/p12_p8e.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_sbag.o" => [ + "crypto/pkcs12/p12_sbag.c" + ], + "crypto/pkcs12/libcrypto-lib-p12_utl.o" => [ + "crypto/pkcs12/p12_utl.c" + ], + "crypto/pkcs12/libcrypto-lib-pk12err.o" => [ + "crypto/pkcs12/pk12err.c" + ], + "crypto/pkcs7/libcrypto-lib-bio_pk7.o" => [ + "crypto/pkcs7/bio_pk7.c" + ], + "crypto/pkcs7/libcrypto-lib-pk7_asn1.o" => [ + "crypto/pkcs7/pk7_asn1.c" + ], + "crypto/pkcs7/libcrypto-lib-pk7_attr.o" => [ + "crypto/pkcs7/pk7_attr.c" + ], + "crypto/pkcs7/libcrypto-lib-pk7_doit.o" => [ + "crypto/pkcs7/pk7_doit.c" + ], + "crypto/pkcs7/libcrypto-lib-pk7_lib.o" => [ + "crypto/pkcs7/pk7_lib.c" + ], + "crypto/pkcs7/libcrypto-lib-pk7_mime.o" => [ + "crypto/pkcs7/pk7_mime.c" + ], + "crypto/pkcs7/libcrypto-lib-pk7_smime.o" => [ + "crypto/pkcs7/pk7_smime.c" + ], + "crypto/pkcs7/libcrypto-lib-pkcs7err.o" => [ + "crypto/pkcs7/pkcs7err.c" + ], + "crypto/poly1305/libcrypto-lib-poly1305.o" => [ + "crypto/poly1305/poly1305.c" + ], + "crypto/property/libcrypto-lib-defn_cache.o" => [ + "crypto/property/defn_cache.c" + ], + "crypto/property/libcrypto-lib-property.o" => [ + "crypto/property/property.c" + ], + "crypto/property/libcrypto-lib-property_err.o" => [ + "crypto/property/property_err.c" + ], + "crypto/property/libcrypto-lib-property_parse.o" => [ + "crypto/property/property_parse.c" + ], + "crypto/property/libcrypto-lib-property_query.o" => [ + "crypto/property/property_query.c" + ], + "crypto/property/libcrypto-lib-property_string.o" => [ + "crypto/property/property_string.c" + ], + "crypto/property/libfips-lib-defn_cache.o" => [ + "crypto/property/defn_cache.c" + ], + "crypto/property/libfips-lib-property.o" => [ + "crypto/property/property.c" + ], + "crypto/property/libfips-lib-property_parse.o" => [ + "crypto/property/property_parse.c" + ], + "crypto/property/libfips-lib-property_query.o" => [ + "crypto/property/property_query.c" + ], + "crypto/property/libfips-lib-property_string.o" => [ + "crypto/property/property_string.c" + ], + "crypto/rand/libcrypto-lib-prov_seed.o" => [ + "crypto/rand/prov_seed.c" + ], + "crypto/rand/libcrypto-lib-rand_deprecated.o" => [ + "crypto/rand/rand_deprecated.c" + ], + "crypto/rand/libcrypto-lib-rand_err.o" => [ + "crypto/rand/rand_err.c" + ], + "crypto/rand/libcrypto-lib-rand_lib.o" => [ + "crypto/rand/rand_lib.c" + ], + "crypto/rand/libcrypto-lib-rand_meth.o" => [ + "crypto/rand/rand_meth.c" + ], + "crypto/rand/libcrypto-lib-rand_pool.o" => [ + "crypto/rand/rand_pool.c" + ], + "crypto/rand/libcrypto-lib-rand_uniform.o" => [ + "crypto/rand/rand_uniform.c" + ], + "crypto/rand/libcrypto-lib-randfile.o" => [ + "crypto/rand/randfile.c" + ], + "crypto/rand/libfips-lib-rand_lib.o" => [ + "crypto/rand/rand_lib.c" + ], + "crypto/rc2/libcrypto-lib-rc2_cbc.o" => [ + "crypto/rc2/rc2_cbc.c" + ], + "crypto/rc2/libcrypto-lib-rc2_ecb.o" => [ + "crypto/rc2/rc2_ecb.c" + ], + "crypto/rc2/libcrypto-lib-rc2_skey.o" => [ + "crypto/rc2/rc2_skey.c" + ], + "crypto/rc2/libcrypto-lib-rc2cfb64.o" => [ + "crypto/rc2/rc2cfb64.c" + ], + "crypto/rc2/libcrypto-lib-rc2ofb64.o" => [ + "crypto/rc2/rc2ofb64.c" + ], + "crypto/rc4/libcrypto-lib-rc4_enc.o" => [ + "crypto/rc4/rc4_enc.c" + ], + "crypto/rc4/libcrypto-lib-rc4_skey.o" => [ + "crypto/rc4/rc4_skey.c" + ], + "crypto/ripemd/libcrypto-lib-rmd_dgst.o" => [ + "crypto/ripemd/rmd_dgst.c" + ], + "crypto/ripemd/libcrypto-lib-rmd_one.o" => [ + "crypto/ripemd/rmd_one.c" + ], + "crypto/rsa/libcrypto-lib-rsa_ameth.o" => [ + "crypto/rsa/rsa_ameth.c" + ], + "crypto/rsa/libcrypto-lib-rsa_asn1.o" => [ + "crypto/rsa/rsa_asn1.c" + ], + "crypto/rsa/libcrypto-lib-rsa_backend.o" => [ + "crypto/rsa/rsa_backend.c" + ], + "crypto/rsa/libcrypto-lib-rsa_chk.o" => [ + "crypto/rsa/rsa_chk.c" + ], + "crypto/rsa/libcrypto-lib-rsa_crpt.o" => [ + "crypto/rsa/rsa_crpt.c" + ], + "crypto/rsa/libcrypto-lib-rsa_depr.o" => [ + "crypto/rsa/rsa_depr.c" + ], + "crypto/rsa/libcrypto-lib-rsa_err.o" => [ + "crypto/rsa/rsa_err.c" + ], + "crypto/rsa/libcrypto-lib-rsa_gen.o" => [ + "crypto/rsa/rsa_gen.c" + ], + "crypto/rsa/libcrypto-lib-rsa_lib.o" => [ + "crypto/rsa/rsa_lib.c" + ], + "crypto/rsa/libcrypto-lib-rsa_meth.o" => [ + "crypto/rsa/rsa_meth.c" + ], + "crypto/rsa/libcrypto-lib-rsa_mp.o" => [ + "crypto/rsa/rsa_mp.c" + ], + "crypto/rsa/libcrypto-lib-rsa_mp_names.o" => [ + "crypto/rsa/rsa_mp_names.c" + ], + "crypto/rsa/libcrypto-lib-rsa_none.o" => [ + "crypto/rsa/rsa_none.c" + ], + "crypto/rsa/libcrypto-lib-rsa_oaep.o" => [ + "crypto/rsa/rsa_oaep.c" + ], + "crypto/rsa/libcrypto-lib-rsa_ossl.o" => [ + "crypto/rsa/rsa_ossl.c" + ], + "crypto/rsa/libcrypto-lib-rsa_pk1.o" => [ + "crypto/rsa/rsa_pk1.c" + ], + "crypto/rsa/libcrypto-lib-rsa_pmeth.o" => [ + "crypto/rsa/rsa_pmeth.c" + ], + "crypto/rsa/libcrypto-lib-rsa_prn.o" => [ + "crypto/rsa/rsa_prn.c" + ], + "crypto/rsa/libcrypto-lib-rsa_pss.o" => [ + "crypto/rsa/rsa_pss.c" + ], + "crypto/rsa/libcrypto-lib-rsa_saos.o" => [ + "crypto/rsa/rsa_saos.c" + ], + "crypto/rsa/libcrypto-lib-rsa_schemes.o" => [ + "crypto/rsa/rsa_schemes.c" + ], + "crypto/rsa/libcrypto-lib-rsa_sign.o" => [ + "crypto/rsa/rsa_sign.c" + ], + "crypto/rsa/libcrypto-lib-rsa_sp800_56b_check.o" => [ + "crypto/rsa/rsa_sp800_56b_check.c" + ], + "crypto/rsa/libcrypto-lib-rsa_sp800_56b_gen.o" => [ + "crypto/rsa/rsa_sp800_56b_gen.c" + ], + "crypto/rsa/libcrypto-lib-rsa_x931.o" => [ + "crypto/rsa/rsa_x931.c" + ], + "crypto/rsa/libcrypto-lib-rsa_x931g.o" => [ + "crypto/rsa/rsa_x931g.c" + ], + "crypto/rsa/libfips-lib-rsa_acvp_test_params.o" => [ + "crypto/rsa/rsa_acvp_test_params.c" + ], + "crypto/rsa/libfips-lib-rsa_backend.o" => [ + "crypto/rsa/rsa_backend.c" + ], + "crypto/rsa/libfips-lib-rsa_chk.o" => [ + "crypto/rsa/rsa_chk.c" + ], + "crypto/rsa/libfips-lib-rsa_crpt.o" => [ + "crypto/rsa/rsa_crpt.c" + ], + "crypto/rsa/libfips-lib-rsa_gen.o" => [ + "crypto/rsa/rsa_gen.c" + ], + "crypto/rsa/libfips-lib-rsa_lib.o" => [ + "crypto/rsa/rsa_lib.c" + ], + "crypto/rsa/libfips-lib-rsa_mp_names.o" => [ + "crypto/rsa/rsa_mp_names.c" + ], + "crypto/rsa/libfips-lib-rsa_none.o" => [ + "crypto/rsa/rsa_none.c" + ], + "crypto/rsa/libfips-lib-rsa_oaep.o" => [ + "crypto/rsa/rsa_oaep.c" + ], + "crypto/rsa/libfips-lib-rsa_ossl.o" => [ + "crypto/rsa/rsa_ossl.c" + ], + "crypto/rsa/libfips-lib-rsa_pk1.o" => [ + "crypto/rsa/rsa_pk1.c" + ], + "crypto/rsa/libfips-lib-rsa_pss.o" => [ + "crypto/rsa/rsa_pss.c" + ], + "crypto/rsa/libfips-lib-rsa_schemes.o" => [ + "crypto/rsa/rsa_schemes.c" + ], + "crypto/rsa/libfips-lib-rsa_sign.o" => [ + "crypto/rsa/rsa_sign.c" + ], + "crypto/rsa/libfips-lib-rsa_sp800_56b_check.o" => [ + "crypto/rsa/rsa_sp800_56b_check.c" + ], + "crypto/rsa/libfips-lib-rsa_sp800_56b_gen.o" => [ + "crypto/rsa/rsa_sp800_56b_gen.c" + ], + "crypto/rsa/libfips-lib-rsa_x931.o" => [ + "crypto/rsa/rsa_x931.c" + ], + "crypto/seed/libcrypto-lib-seed.o" => [ + "crypto/seed/seed.c" + ], + "crypto/seed/libcrypto-lib-seed_cbc.o" => [ + "crypto/seed/seed_cbc.c" + ], + "crypto/seed/libcrypto-lib-seed_cfb.o" => [ + "crypto/seed/seed_cfb.c" + ], + "crypto/seed/libcrypto-lib-seed_ecb.o" => [ + "crypto/seed/seed_ecb.c" + ], + "crypto/seed/libcrypto-lib-seed_ofb.o" => [ + "crypto/seed/seed_ofb.c" + ], + "crypto/sha/libcrypto-lib-keccak1600.o" => [ + "crypto/sha/keccak1600.c" + ], + "crypto/sha/libcrypto-lib-sha1_one.o" => [ + "crypto/sha/sha1_one.c" + ], + "crypto/sha/libcrypto-lib-sha1dgst.o" => [ + "crypto/sha/sha1dgst.c" + ], + "crypto/sha/libcrypto-lib-sha256-riscv64-zvkb-zvknha_or_zvknhb.o" => [ + "crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S" + ], + "crypto/sha/libcrypto-lib-sha256.o" => [ + "crypto/sha/sha256.c" + ], + "crypto/sha/libcrypto-lib-sha3.o" => [ + "crypto/sha/sha3.c" + ], + "crypto/sha/libcrypto-lib-sha512-riscv64-zvkb-zvknhb.o" => [ + "crypto/sha/sha512-riscv64-zvkb-zvknhb.S" + ], + "crypto/sha/libcrypto-lib-sha512.o" => [ + "crypto/sha/sha512.c" + ], + "crypto/sha/libcrypto-lib-sha_riscv.o" => [ + "crypto/sha/sha_riscv.c" + ], + "crypto/sha/libfips-lib-keccak1600.o" => [ + "crypto/sha/keccak1600.c" + ], + "crypto/sha/libfips-lib-sha1dgst.o" => [ + "crypto/sha/sha1dgst.c" + ], + "crypto/sha/libfips-lib-sha256-riscv64-zvkb-zvknha_or_zvknhb.o" => [ + "crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S" + ], + "crypto/sha/libfips-lib-sha256.o" => [ + "crypto/sha/sha256.c" + ], + "crypto/sha/libfips-lib-sha3.o" => [ + "crypto/sha/sha3.c" + ], + "crypto/sha/libfips-lib-sha512-riscv64-zvkb-zvknhb.o" => [ + "crypto/sha/sha512-riscv64-zvkb-zvknhb.S" + ], + "crypto/sha/libfips-lib-sha512.o" => [ + "crypto/sha/sha512.c" + ], + "crypto/sha/libfips-lib-sha_riscv.o" => [ + "crypto/sha/sha_riscv.c" + ], + "crypto/siphash/libcrypto-lib-siphash.o" => [ + "crypto/siphash/siphash.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_adrs.o" => [ + "crypto/slh_dsa/slh_adrs.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_dsa.o" => [ + "crypto/slh_dsa/slh_dsa.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_dsa_hash_ctx.o" => [ + "crypto/slh_dsa/slh_dsa_hash_ctx.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_dsa_key.o" => [ + "crypto/slh_dsa/slh_dsa_key.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_fors.o" => [ + "crypto/slh_dsa/slh_fors.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_hash.o" => [ + "crypto/slh_dsa/slh_hash.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_hypertree.o" => [ + "crypto/slh_dsa/slh_hypertree.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_params.o" => [ + "crypto/slh_dsa/slh_params.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_wots.o" => [ + "crypto/slh_dsa/slh_wots.c" + ], + "crypto/slh_dsa/libcrypto-lib-slh_xmss.o" => [ + "crypto/slh_dsa/slh_xmss.c" + ], + "crypto/slh_dsa/libfips-lib-slh_adrs.o" => [ + "crypto/slh_dsa/slh_adrs.c" + ], + "crypto/slh_dsa/libfips-lib-slh_dsa.o" => [ + "crypto/slh_dsa/slh_dsa.c" + ], + "crypto/slh_dsa/libfips-lib-slh_dsa_hash_ctx.o" => [ + "crypto/slh_dsa/slh_dsa_hash_ctx.c" + ], + "crypto/slh_dsa/libfips-lib-slh_dsa_key.o" => [ + "crypto/slh_dsa/slh_dsa_key.c" + ], + "crypto/slh_dsa/libfips-lib-slh_fors.o" => [ + "crypto/slh_dsa/slh_fors.c" + ], + "crypto/slh_dsa/libfips-lib-slh_hash.o" => [ + "crypto/slh_dsa/slh_hash.c" + ], + "crypto/slh_dsa/libfips-lib-slh_hypertree.o" => [ + "crypto/slh_dsa/slh_hypertree.c" + ], + "crypto/slh_dsa/libfips-lib-slh_params.o" => [ + "crypto/slh_dsa/slh_params.c" + ], + "crypto/slh_dsa/libfips-lib-slh_wots.o" => [ + "crypto/slh_dsa/slh_wots.c" + ], + "crypto/slh_dsa/libfips-lib-slh_xmss.o" => [ + "crypto/slh_dsa/slh_xmss.c" + ], + "crypto/sm2/libcrypto-lib-sm2_crypt.o" => [ + "crypto/sm2/sm2_crypt.c" + ], + "crypto/sm2/libcrypto-lib-sm2_err.o" => [ + "crypto/sm2/sm2_err.c" + ], + "crypto/sm2/libcrypto-lib-sm2_key.o" => [ + "crypto/sm2/sm2_key.c" + ], + "crypto/sm2/libcrypto-lib-sm2_sign.o" => [ + "crypto/sm2/sm2_sign.c" + ], + "crypto/sm3/libcrypto-lib-legacy_sm3.o" => [ + "crypto/sm3/legacy_sm3.c" + ], + "crypto/sm3/libcrypto-lib-sm3-riscv64-zvksh.o" => [ + "crypto/sm3/sm3-riscv64-zvksh.S" + ], + "crypto/sm3/libcrypto-lib-sm3.o" => [ + "crypto/sm3/sm3.c" + ], + "crypto/sm3/libcrypto-lib-sm3_riscv.o" => [ + "crypto/sm3/sm3_riscv.c" + ], + "crypto/sm4/libcrypto-lib-sm4-riscv64-zvksed.o" => [ + "crypto/sm4/sm4-riscv64-zvksed.s" + ], + "crypto/sm4/libcrypto-lib-sm4.o" => [ + "crypto/sm4/sm4.c" + ], + "crypto/srp/libcrypto-lib-srp_lib.o" => [ + "crypto/srp/srp_lib.c" + ], + "crypto/srp/libcrypto-lib-srp_vfy.o" => [ + "crypto/srp/srp_vfy.c" + ], + "crypto/stack/libcrypto-lib-stack.o" => [ + "crypto/stack/stack.c" + ], + "crypto/stack/libfips-lib-stack.o" => [ + "crypto/stack/stack.c" + ], + "crypto/store/libcrypto-lib-store_err.o" => [ + "crypto/store/store_err.c" + ], + "crypto/store/libcrypto-lib-store_init.o" => [ + "crypto/store/store_init.c" + ], + "crypto/store/libcrypto-lib-store_lib.o" => [ + "crypto/store/store_lib.c" + ], + "crypto/store/libcrypto-lib-store_meth.o" => [ + "crypto/store/store_meth.c" + ], + "crypto/store/libcrypto-lib-store_register.o" => [ + "crypto/store/store_register.c" + ], + "crypto/store/libcrypto-lib-store_result.o" => [ + "crypto/store/store_result.c" + ], + "crypto/store/libcrypto-lib-store_strings.o" => [ + "crypto/store/store_strings.c" + ], + "crypto/thread/arch/libcrypto-lib-thread_none.o" => [ + "crypto/thread/arch/thread_none.c" + ], + "crypto/thread/arch/libcrypto-lib-thread_posix.o" => [ + "crypto/thread/arch/thread_posix.c" + ], + "crypto/thread/arch/libcrypto-lib-thread_win.o" => [ + "crypto/thread/arch/thread_win.c" + ], + "crypto/thread/arch/libfips-lib-thread_none.o" => [ + "crypto/thread/arch/thread_none.c" + ], + "crypto/thread/arch/libfips-lib-thread_posix.o" => [ + "crypto/thread/arch/thread_posix.c" + ], + "crypto/thread/arch/libfips-lib-thread_win.o" => [ + "crypto/thread/arch/thread_win.c" + ], + "crypto/thread/libcrypto-lib-api.o" => [ + "crypto/thread/api.c" + ], + "crypto/thread/libcrypto-lib-arch.o" => [ + "crypto/thread/arch.c" + ], + "crypto/thread/libcrypto-lib-internal.o" => [ + "crypto/thread/internal.c" + ], + "crypto/thread/libfips-lib-api.o" => [ + "crypto/thread/api.c" + ], + "crypto/thread/libfips-lib-arch.o" => [ + "crypto/thread/arch.c" + ], + "crypto/thread/libfips-lib-internal.o" => [ + "crypto/thread/internal.c" + ], + "crypto/ts/libcrypto-lib-ts_asn1.o" => [ + "crypto/ts/ts_asn1.c" + ], + "crypto/ts/libcrypto-lib-ts_conf.o" => [ + "crypto/ts/ts_conf.c" + ], + "crypto/ts/libcrypto-lib-ts_err.o" => [ + "crypto/ts/ts_err.c" + ], + "crypto/ts/libcrypto-lib-ts_lib.o" => [ + "crypto/ts/ts_lib.c" + ], + "crypto/ts/libcrypto-lib-ts_req_print.o" => [ + "crypto/ts/ts_req_print.c" + ], + "crypto/ts/libcrypto-lib-ts_req_utils.o" => [ + "crypto/ts/ts_req_utils.c" + ], + "crypto/ts/libcrypto-lib-ts_rsp_print.o" => [ + "crypto/ts/ts_rsp_print.c" + ], + "crypto/ts/libcrypto-lib-ts_rsp_sign.o" => [ + "crypto/ts/ts_rsp_sign.c" + ], + "crypto/ts/libcrypto-lib-ts_rsp_utils.o" => [ + "crypto/ts/ts_rsp_utils.c" + ], + "crypto/ts/libcrypto-lib-ts_rsp_verify.o" => [ + "crypto/ts/ts_rsp_verify.c" + ], + "crypto/ts/libcrypto-lib-ts_verify_ctx.o" => [ + "crypto/ts/ts_verify_ctx.c" + ], + "crypto/txt_db/libcrypto-lib-txt_db.o" => [ + "crypto/txt_db/txt_db.c" + ], + "crypto/ui/libcrypto-lib-ui_err.o" => [ + "crypto/ui/ui_err.c" + ], + "crypto/ui/libcrypto-lib-ui_lib.o" => [ + "crypto/ui/ui_lib.c" + ], + "crypto/ui/libcrypto-lib-ui_null.o" => [ + "crypto/ui/ui_null.c" + ], + "crypto/ui/libcrypto-lib-ui_openssl.o" => [ + "crypto/ui/ui_openssl.c" + ], + "crypto/ui/libcrypto-lib-ui_util.o" => [ + "crypto/ui/ui_util.c" + ], + "crypto/whrlpool/libcrypto-lib-wp_block.o" => [ + "crypto/whrlpool/wp_block.c" + ], + "crypto/whrlpool/libcrypto-lib-wp_dgst.o" => [ + "crypto/whrlpool/wp_dgst.c" + ], + "crypto/x509/libcrypto-lib-by_dir.o" => [ + "crypto/x509/by_dir.c" + ], + "crypto/x509/libcrypto-lib-by_file.o" => [ + "crypto/x509/by_file.c" + ], + "crypto/x509/libcrypto-lib-by_store.o" => [ + "crypto/x509/by_store.c" + ], + "crypto/x509/libcrypto-lib-pcy_cache.o" => [ + "crypto/x509/pcy_cache.c" + ], + "crypto/x509/libcrypto-lib-pcy_data.o" => [ + "crypto/x509/pcy_data.c" + ], + "crypto/x509/libcrypto-lib-pcy_lib.o" => [ + "crypto/x509/pcy_lib.c" + ], + "crypto/x509/libcrypto-lib-pcy_map.o" => [ + "crypto/x509/pcy_map.c" + ], + "crypto/x509/libcrypto-lib-pcy_node.o" => [ + "crypto/x509/pcy_node.c" + ], + "crypto/x509/libcrypto-lib-pcy_tree.o" => [ + "crypto/x509/pcy_tree.c" + ], + "crypto/x509/libcrypto-lib-t_acert.o" => [ + "crypto/x509/t_acert.c" + ], + "crypto/x509/libcrypto-lib-t_crl.o" => [ + "crypto/x509/t_crl.c" + ], + "crypto/x509/libcrypto-lib-t_req.o" => [ + "crypto/x509/t_req.c" + ], + "crypto/x509/libcrypto-lib-t_x509.o" => [ + "crypto/x509/t_x509.c" + ], + "crypto/x509/libcrypto-lib-v3_aaa.o" => [ + "crypto/x509/v3_aaa.c" + ], + "crypto/x509/libcrypto-lib-v3_ac_tgt.o" => [ + "crypto/x509/v3_ac_tgt.c" + ], + "crypto/x509/libcrypto-lib-v3_addr.o" => [ + "crypto/x509/v3_addr.c" + ], + "crypto/x509/libcrypto-lib-v3_admis.o" => [ + "crypto/x509/v3_admis.c" + ], + "crypto/x509/libcrypto-lib-v3_akeya.o" => [ + "crypto/x509/v3_akeya.c" + ], + "crypto/x509/libcrypto-lib-v3_akid.o" => [ + "crypto/x509/v3_akid.c" + ], + "crypto/x509/libcrypto-lib-v3_asid.o" => [ + "crypto/x509/v3_asid.c" + ], + "crypto/x509/libcrypto-lib-v3_attrdesc.o" => [ + "crypto/x509/v3_attrdesc.c" + ], + "crypto/x509/libcrypto-lib-v3_attrmap.o" => [ + "crypto/x509/v3_attrmap.c" + ], + "crypto/x509/libcrypto-lib-v3_audit_id.o" => [ + "crypto/x509/v3_audit_id.c" + ], + "crypto/x509/libcrypto-lib-v3_authattid.o" => [ + "crypto/x509/v3_authattid.c" + ], + "crypto/x509/libcrypto-lib-v3_battcons.o" => [ + "crypto/x509/v3_battcons.c" + ], + "crypto/x509/libcrypto-lib-v3_bcons.o" => [ + "crypto/x509/v3_bcons.c" + ], + "crypto/x509/libcrypto-lib-v3_bitst.o" => [ + "crypto/x509/v3_bitst.c" + ], + "crypto/x509/libcrypto-lib-v3_conf.o" => [ + "crypto/x509/v3_conf.c" + ], + "crypto/x509/libcrypto-lib-v3_cpols.o" => [ + "crypto/x509/v3_cpols.c" + ], + "crypto/x509/libcrypto-lib-v3_crld.o" => [ + "crypto/x509/v3_crld.c" + ], + "crypto/x509/libcrypto-lib-v3_enum.o" => [ + "crypto/x509/v3_enum.c" + ], + "crypto/x509/libcrypto-lib-v3_extku.o" => [ + "crypto/x509/v3_extku.c" + ], + "crypto/x509/libcrypto-lib-v3_genn.o" => [ + "crypto/x509/v3_genn.c" + ], + "crypto/x509/libcrypto-lib-v3_group_ac.o" => [ + "crypto/x509/v3_group_ac.c" + ], + "crypto/x509/libcrypto-lib-v3_ia5.o" => [ + "crypto/x509/v3_ia5.c" + ], + "crypto/x509/libcrypto-lib-v3_ind_iss.o" => [ + "crypto/x509/v3_ind_iss.c" + ], + "crypto/x509/libcrypto-lib-v3_info.o" => [ + "crypto/x509/v3_info.c" + ], + "crypto/x509/libcrypto-lib-v3_int.o" => [ + "crypto/x509/v3_int.c" + ], + "crypto/x509/libcrypto-lib-v3_iobo.o" => [ + "crypto/x509/v3_iobo.c" + ], + "crypto/x509/libcrypto-lib-v3_ist.o" => [ + "crypto/x509/v3_ist.c" + ], + "crypto/x509/libcrypto-lib-v3_lib.o" => [ + "crypto/x509/v3_lib.c" + ], + "crypto/x509/libcrypto-lib-v3_ncons.o" => [ + "crypto/x509/v3_ncons.c" + ], + "crypto/x509/libcrypto-lib-v3_no_ass.o" => [ + "crypto/x509/v3_no_ass.c" + ], + "crypto/x509/libcrypto-lib-v3_no_rev_avail.o" => [ + "crypto/x509/v3_no_rev_avail.c" + ], + "crypto/x509/libcrypto-lib-v3_pci.o" => [ + "crypto/x509/v3_pci.c" + ], + "crypto/x509/libcrypto-lib-v3_pcia.o" => [ + "crypto/x509/v3_pcia.c" + ], + "crypto/x509/libcrypto-lib-v3_pcons.o" => [ + "crypto/x509/v3_pcons.c" + ], + "crypto/x509/libcrypto-lib-v3_pku.o" => [ + "crypto/x509/v3_pku.c" + ], + "crypto/x509/libcrypto-lib-v3_pmaps.o" => [ + "crypto/x509/v3_pmaps.c" + ], + "crypto/x509/libcrypto-lib-v3_prn.o" => [ + "crypto/x509/v3_prn.c" + ], + "crypto/x509/libcrypto-lib-v3_purp.o" => [ + "crypto/x509/v3_purp.c" + ], + "crypto/x509/libcrypto-lib-v3_rolespec.o" => [ + "crypto/x509/v3_rolespec.c" + ], + "crypto/x509/libcrypto-lib-v3_san.o" => [ + "crypto/x509/v3_san.c" + ], + "crypto/x509/libcrypto-lib-v3_sda.o" => [ + "crypto/x509/v3_sda.c" + ], + "crypto/x509/libcrypto-lib-v3_single_use.o" => [ + "crypto/x509/v3_single_use.c" + ], + "crypto/x509/libcrypto-lib-v3_skid.o" => [ + "crypto/x509/v3_skid.c" + ], + "crypto/x509/libcrypto-lib-v3_soa_id.o" => [ + "crypto/x509/v3_soa_id.c" + ], + "crypto/x509/libcrypto-lib-v3_sxnet.o" => [ + "crypto/x509/v3_sxnet.c" + ], + "crypto/x509/libcrypto-lib-v3_timespec.o" => [ + "crypto/x509/v3_timespec.c" + ], + "crypto/x509/libcrypto-lib-v3_tlsf.o" => [ + "crypto/x509/v3_tlsf.c" + ], + "crypto/x509/libcrypto-lib-v3_usernotice.o" => [ + "crypto/x509/v3_usernotice.c" + ], + "crypto/x509/libcrypto-lib-v3_utf8.o" => [ + "crypto/x509/v3_utf8.c" + ], + "crypto/x509/libcrypto-lib-v3_utl.o" => [ + "crypto/x509/v3_utl.c" + ], + "crypto/x509/libcrypto-lib-v3err.o" => [ + "crypto/x509/v3err.c" + ], + "crypto/x509/libcrypto-lib-x509_acert.o" => [ + "crypto/x509/x509_acert.c" + ], + "crypto/x509/libcrypto-lib-x509_att.o" => [ + "crypto/x509/x509_att.c" + ], + "crypto/x509/libcrypto-lib-x509_cmp.o" => [ + "crypto/x509/x509_cmp.c" + ], + "crypto/x509/libcrypto-lib-x509_d2.o" => [ + "crypto/x509/x509_d2.c" + ], + "crypto/x509/libcrypto-lib-x509_def.o" => [ + "crypto/x509/x509_def.c" + ], + "crypto/x509/libcrypto-lib-x509_err.o" => [ + "crypto/x509/x509_err.c" + ], + "crypto/x509/libcrypto-lib-x509_ext.o" => [ + "crypto/x509/x509_ext.c" + ], + "crypto/x509/libcrypto-lib-x509_lu.o" => [ + "crypto/x509/x509_lu.c" + ], + "crypto/x509/libcrypto-lib-x509_meth.o" => [ + "crypto/x509/x509_meth.c" + ], + "crypto/x509/libcrypto-lib-x509_obj.o" => [ + "crypto/x509/x509_obj.c" + ], + "crypto/x509/libcrypto-lib-x509_r2x.o" => [ + "crypto/x509/x509_r2x.c" + ], + "crypto/x509/libcrypto-lib-x509_req.o" => [ + "crypto/x509/x509_req.c" + ], + "crypto/x509/libcrypto-lib-x509_set.o" => [ + "crypto/x509/x509_set.c" + ], + "crypto/x509/libcrypto-lib-x509_trust.o" => [ + "crypto/x509/x509_trust.c" + ], + "crypto/x509/libcrypto-lib-x509_txt.o" => [ + "crypto/x509/x509_txt.c" + ], + "crypto/x509/libcrypto-lib-x509_v3.o" => [ + "crypto/x509/x509_v3.c" + ], + "crypto/x509/libcrypto-lib-x509_vfy.o" => [ + "crypto/x509/x509_vfy.c" + ], + "crypto/x509/libcrypto-lib-x509_vpm.o" => [ + "crypto/x509/x509_vpm.c" + ], + "crypto/x509/libcrypto-lib-x509aset.o" => [ + "crypto/x509/x509aset.c" + ], + "crypto/x509/libcrypto-lib-x509cset.o" => [ + "crypto/x509/x509cset.c" + ], + "crypto/x509/libcrypto-lib-x509name.o" => [ + "crypto/x509/x509name.c" + ], + "crypto/x509/libcrypto-lib-x509rset.o" => [ + "crypto/x509/x509rset.c" + ], + "crypto/x509/libcrypto-lib-x509spki.o" => [ + "crypto/x509/x509spki.c" + ], + "crypto/x509/libcrypto-lib-x509type.o" => [ + "crypto/x509/x509type.c" + ], + "crypto/x509/libcrypto-lib-x_all.o" => [ + "crypto/x509/x_all.c" + ], + "crypto/x509/libcrypto-lib-x_attrib.o" => [ + "crypto/x509/x_attrib.c" + ], + "crypto/x509/libcrypto-lib-x_crl.o" => [ + "crypto/x509/x_crl.c" + ], + "crypto/x509/libcrypto-lib-x_exten.o" => [ + "crypto/x509/x_exten.c" + ], + "crypto/x509/libcrypto-lib-x_ietfatt.o" => [ + "crypto/x509/x_ietfatt.c" + ], + "crypto/x509/libcrypto-lib-x_name.o" => [ + "crypto/x509/x_name.c" + ], + "crypto/x509/libcrypto-lib-x_pubkey.o" => [ + "crypto/x509/x_pubkey.c" + ], + "crypto/x509/libcrypto-lib-x_req.o" => [ + "crypto/x509/x_req.c" + ], + "crypto/x509/libcrypto-lib-x_x509.o" => [ + "crypto/x509/x_x509.c" + ], + "crypto/x509/libcrypto-lib-x_x509a.o" => [ + "crypto/x509/x_x509a.c" + ], + "engines/libcrypto-lib-e_capi.o" => [ + "engines/e_capi.c" + ], + "engines/libcrypto-lib-e_padlock.o" => [ + "engines/e_padlock.c" + ], + "libcrypto" => [ + "crypto/aes/libcrypto-lib-aes-riscv64-zkn.o", + "crypto/aes/libcrypto-lib-aes-riscv64-zvbb-zvkg-zvkned.o", + "crypto/aes/libcrypto-lib-aes-riscv64-zvkb-zvkned.o", + "crypto/aes/libcrypto-lib-aes-riscv64-zvkned.o", + "crypto/aes/libcrypto-lib-aes-riscv64.o", + "crypto/aes/libcrypto-lib-aes_cbc.o", + "crypto/aes/libcrypto-lib-aes_cfb.o", + "crypto/aes/libcrypto-lib-aes_ecb.o", + "crypto/aes/libcrypto-lib-aes_ige.o", + "crypto/aes/libcrypto-lib-aes_misc.o", + "crypto/aes/libcrypto-lib-aes_ofb.o", + "crypto/aes/libcrypto-lib-aes_wrap.o", + "crypto/aria/libcrypto-lib-aria.o", + "crypto/asn1/libcrypto-lib-a_bitstr.o", + "crypto/asn1/libcrypto-lib-a_d2i_fp.o", + "crypto/asn1/libcrypto-lib-a_digest.o", + "crypto/asn1/libcrypto-lib-a_dup.o", + "crypto/asn1/libcrypto-lib-a_gentm.o", + "crypto/asn1/libcrypto-lib-a_i2d_fp.o", + "crypto/asn1/libcrypto-lib-a_int.o", + "crypto/asn1/libcrypto-lib-a_mbstr.o", + "crypto/asn1/libcrypto-lib-a_object.o", + "crypto/asn1/libcrypto-lib-a_octet.o", + "crypto/asn1/libcrypto-lib-a_print.o", + "crypto/asn1/libcrypto-lib-a_sign.o", + "crypto/asn1/libcrypto-lib-a_strex.o", + "crypto/asn1/libcrypto-lib-a_strnid.o", + "crypto/asn1/libcrypto-lib-a_time.o", + "crypto/asn1/libcrypto-lib-a_type.o", + "crypto/asn1/libcrypto-lib-a_utctm.o", + "crypto/asn1/libcrypto-lib-a_utf8.o", + "crypto/asn1/libcrypto-lib-a_verify.o", + "crypto/asn1/libcrypto-lib-ameth_lib.o", + "crypto/asn1/libcrypto-lib-asn1_err.o", + "crypto/asn1/libcrypto-lib-asn1_gen.o", + "crypto/asn1/libcrypto-lib-asn1_item_list.o", + "crypto/asn1/libcrypto-lib-asn1_lib.o", + "crypto/asn1/libcrypto-lib-asn1_parse.o", + "crypto/asn1/libcrypto-lib-asn_mime.o", + "crypto/asn1/libcrypto-lib-asn_moid.o", + "crypto/asn1/libcrypto-lib-asn_mstbl.o", + "crypto/asn1/libcrypto-lib-asn_pack.o", + "crypto/asn1/libcrypto-lib-bio_asn1.o", + "crypto/asn1/libcrypto-lib-bio_ndef.o", + "crypto/asn1/libcrypto-lib-d2i_param.o", + "crypto/asn1/libcrypto-lib-d2i_pr.o", + "crypto/asn1/libcrypto-lib-d2i_pu.o", + "crypto/asn1/libcrypto-lib-evp_asn1.o", + "crypto/asn1/libcrypto-lib-f_int.o", + "crypto/asn1/libcrypto-lib-f_string.o", + "crypto/asn1/libcrypto-lib-i2d_evp.o", + "crypto/asn1/libcrypto-lib-n_pkey.o", + "crypto/asn1/libcrypto-lib-nsseq.o", + "crypto/asn1/libcrypto-lib-p5_pbe.o", + "crypto/asn1/libcrypto-lib-p5_pbev2.o", + "crypto/asn1/libcrypto-lib-p5_scrypt.o", + "crypto/asn1/libcrypto-lib-p8_pkey.o", + "crypto/asn1/libcrypto-lib-t_bitst.o", + "crypto/asn1/libcrypto-lib-t_pkey.o", + "crypto/asn1/libcrypto-lib-t_spki.o", + "crypto/asn1/libcrypto-lib-tasn_dec.o", + "crypto/asn1/libcrypto-lib-tasn_enc.o", + "crypto/asn1/libcrypto-lib-tasn_fre.o", + "crypto/asn1/libcrypto-lib-tasn_new.o", + "crypto/asn1/libcrypto-lib-tasn_prn.o", + "crypto/asn1/libcrypto-lib-tasn_scn.o", + "crypto/asn1/libcrypto-lib-tasn_typ.o", + "crypto/asn1/libcrypto-lib-tasn_utl.o", + "crypto/asn1/libcrypto-lib-x_algor.o", + "crypto/asn1/libcrypto-lib-x_bignum.o", + "crypto/asn1/libcrypto-lib-x_info.o", + "crypto/asn1/libcrypto-lib-x_int64.o", + "crypto/asn1/libcrypto-lib-x_long.o", + "crypto/asn1/libcrypto-lib-x_pkey.o", + "crypto/asn1/libcrypto-lib-x_sig.o", + "crypto/asn1/libcrypto-lib-x_spki.o", + "crypto/asn1/libcrypto-lib-x_val.o", + "crypto/async/arch/libcrypto-lib-async_null.o", + "crypto/async/arch/libcrypto-lib-async_posix.o", + "crypto/async/arch/libcrypto-lib-async_win.o", + "crypto/async/libcrypto-lib-async.o", + "crypto/async/libcrypto-lib-async_err.o", + "crypto/async/libcrypto-lib-async_wait.o", + "crypto/bf/libcrypto-lib-bf_cfb64.o", + "crypto/bf/libcrypto-lib-bf_ecb.o", + "crypto/bf/libcrypto-lib-bf_enc.o", + "crypto/bf/libcrypto-lib-bf_ofb64.o", + "crypto/bf/libcrypto-lib-bf_skey.o", + "crypto/bio/libcrypto-lib-bf_buff.o", + "crypto/bio/libcrypto-lib-bf_lbuf.o", + "crypto/bio/libcrypto-lib-bf_nbio.o", + "crypto/bio/libcrypto-lib-bf_null.o", + "crypto/bio/libcrypto-lib-bf_prefix.o", + "crypto/bio/libcrypto-lib-bf_readbuff.o", + "crypto/bio/libcrypto-lib-bio_addr.o", + "crypto/bio/libcrypto-lib-bio_cb.o", + "crypto/bio/libcrypto-lib-bio_dump.o", + "crypto/bio/libcrypto-lib-bio_err.o", + "crypto/bio/libcrypto-lib-bio_lib.o", + "crypto/bio/libcrypto-lib-bio_meth.o", + "crypto/bio/libcrypto-lib-bio_print.o", + "crypto/bio/libcrypto-lib-bio_sock.o", + "crypto/bio/libcrypto-lib-bio_sock2.o", + "crypto/bio/libcrypto-lib-bss_acpt.o", + "crypto/bio/libcrypto-lib-bss_bio.o", + "crypto/bio/libcrypto-lib-bss_conn.o", + "crypto/bio/libcrypto-lib-bss_core.o", + "crypto/bio/libcrypto-lib-bss_dgram.o", + "crypto/bio/libcrypto-lib-bss_dgram_pair.o", + "crypto/bio/libcrypto-lib-bss_fd.o", + "crypto/bio/libcrypto-lib-bss_file.o", + "crypto/bio/libcrypto-lib-bss_log.o", + "crypto/bio/libcrypto-lib-bss_mem.o", + "crypto/bio/libcrypto-lib-bss_null.o", + "crypto/bio/libcrypto-lib-bss_sock.o", + "crypto/bio/libcrypto-lib-ossl_core_bio.o", + "crypto/bn/libcrypto-lib-bn_add.o", + "crypto/bn/libcrypto-lib-bn_asm.o", + "crypto/bn/libcrypto-lib-bn_blind.o", + "crypto/bn/libcrypto-lib-bn_const.o", + "crypto/bn/libcrypto-lib-bn_conv.o", + "crypto/bn/libcrypto-lib-bn_ctx.o", + "crypto/bn/libcrypto-lib-bn_depr.o", + "crypto/bn/libcrypto-lib-bn_dh.o", + "crypto/bn/libcrypto-lib-bn_div.o", + "crypto/bn/libcrypto-lib-bn_err.o", + "crypto/bn/libcrypto-lib-bn_exp.o", + "crypto/bn/libcrypto-lib-bn_exp2.o", + "crypto/bn/libcrypto-lib-bn_gcd.o", + "crypto/bn/libcrypto-lib-bn_gf2m.o", + "crypto/bn/libcrypto-lib-bn_intern.o", + "crypto/bn/libcrypto-lib-bn_kron.o", + "crypto/bn/libcrypto-lib-bn_lib.o", + "crypto/bn/libcrypto-lib-bn_mod.o", + "crypto/bn/libcrypto-lib-bn_mont.o", + "crypto/bn/libcrypto-lib-bn_mpi.o", + "crypto/bn/libcrypto-lib-bn_mul.o", + "crypto/bn/libcrypto-lib-bn_nist.o", + "crypto/bn/libcrypto-lib-bn_prime.o", + "crypto/bn/libcrypto-lib-bn_print.o", + "crypto/bn/libcrypto-lib-bn_rand.o", + "crypto/bn/libcrypto-lib-bn_recp.o", + "crypto/bn/libcrypto-lib-bn_rsa_fips186_4.o", + "crypto/bn/libcrypto-lib-bn_shift.o", + "crypto/bn/libcrypto-lib-bn_sqr.o", + "crypto/bn/libcrypto-lib-bn_sqrt.o", + "crypto/bn/libcrypto-lib-bn_srp.o", + "crypto/bn/libcrypto-lib-bn_word.o", + "crypto/bn/libcrypto-lib-bn_x931p.o", + "crypto/buffer/libcrypto-lib-buf_err.o", + "crypto/buffer/libcrypto-lib-buffer.o", + "crypto/camellia/libcrypto-lib-camellia.o", + "crypto/camellia/libcrypto-lib-cmll_cbc.o", + "crypto/camellia/libcrypto-lib-cmll_cfb.o", + "crypto/camellia/libcrypto-lib-cmll_ctr.o", + "crypto/camellia/libcrypto-lib-cmll_ecb.o", + "crypto/camellia/libcrypto-lib-cmll_misc.o", + "crypto/camellia/libcrypto-lib-cmll_ofb.o", + "crypto/cast/libcrypto-lib-c_cfb64.o", + "crypto/cast/libcrypto-lib-c_ecb.o", + "crypto/cast/libcrypto-lib-c_enc.o", + "crypto/cast/libcrypto-lib-c_ofb64.o", + "crypto/cast/libcrypto-lib-c_skey.o", + "crypto/chacha/libcrypto-lib-chacha-riscv64-v-zbb-zvkb.o", + "crypto/chacha/libcrypto-lib-chacha-riscv64-v-zbb.o", + "crypto/chacha/libcrypto-lib-chacha_enc.o", + "crypto/chacha/libcrypto-lib-chacha_riscv.o", + "crypto/cmac/libcrypto-lib-cmac.o", + "crypto/cmp/libcrypto-lib-cmp_asn.o", + "crypto/cmp/libcrypto-lib-cmp_client.o", + "crypto/cmp/libcrypto-lib-cmp_ctx.o", + "crypto/cmp/libcrypto-lib-cmp_err.o", + "crypto/cmp/libcrypto-lib-cmp_genm.o", + "crypto/cmp/libcrypto-lib-cmp_hdr.o", + "crypto/cmp/libcrypto-lib-cmp_http.o", + "crypto/cmp/libcrypto-lib-cmp_msg.o", + "crypto/cmp/libcrypto-lib-cmp_protect.o", + "crypto/cmp/libcrypto-lib-cmp_server.o", + "crypto/cmp/libcrypto-lib-cmp_status.o", + "crypto/cmp/libcrypto-lib-cmp_util.o", + "crypto/cmp/libcrypto-lib-cmp_vfy.o", + "crypto/cms/libcrypto-lib-cms_asn1.o", + "crypto/cms/libcrypto-lib-cms_att.o", + "crypto/cms/libcrypto-lib-cms_cd.o", + "crypto/cms/libcrypto-lib-cms_dd.o", + "crypto/cms/libcrypto-lib-cms_dh.o", + "crypto/cms/libcrypto-lib-cms_ec.o", + "crypto/cms/libcrypto-lib-cms_enc.o", + "crypto/cms/libcrypto-lib-cms_env.o", + "crypto/cms/libcrypto-lib-cms_err.o", + "crypto/cms/libcrypto-lib-cms_ess.o", + "crypto/cms/libcrypto-lib-cms_io.o", + "crypto/cms/libcrypto-lib-cms_kari.o", + "crypto/cms/libcrypto-lib-cms_lib.o", + "crypto/cms/libcrypto-lib-cms_pwri.o", + "crypto/cms/libcrypto-lib-cms_rsa.o", + "crypto/cms/libcrypto-lib-cms_sd.o", + "crypto/cms/libcrypto-lib-cms_smime.o", + "crypto/comp/libcrypto-lib-c_brotli.o", + "crypto/comp/libcrypto-lib-c_zlib.o", + "crypto/comp/libcrypto-lib-c_zstd.o", + "crypto/comp/libcrypto-lib-comp_err.o", + "crypto/comp/libcrypto-lib-comp_lib.o", + "crypto/conf/libcrypto-lib-conf_api.o", + "crypto/conf/libcrypto-lib-conf_def.o", + "crypto/conf/libcrypto-lib-conf_err.o", + "crypto/conf/libcrypto-lib-conf_lib.o", + "crypto/conf/libcrypto-lib-conf_mall.o", + "crypto/conf/libcrypto-lib-conf_mod.o", + "crypto/conf/libcrypto-lib-conf_sap.o", + "crypto/conf/libcrypto-lib-conf_ssl.o", + "crypto/crmf/libcrypto-lib-crmf_asn.o", + "crypto/crmf/libcrypto-lib-crmf_err.o", + "crypto/crmf/libcrypto-lib-crmf_lib.o", + "crypto/crmf/libcrypto-lib-crmf_pbm.o", + "crypto/ct/libcrypto-lib-ct_b64.o", + "crypto/ct/libcrypto-lib-ct_err.o", + "crypto/ct/libcrypto-lib-ct_log.o", + "crypto/ct/libcrypto-lib-ct_oct.o", + "crypto/ct/libcrypto-lib-ct_policy.o", + "crypto/ct/libcrypto-lib-ct_prn.o", + "crypto/ct/libcrypto-lib-ct_sct.o", + "crypto/ct/libcrypto-lib-ct_sct_ctx.o", + "crypto/ct/libcrypto-lib-ct_vfy.o", + "crypto/ct/libcrypto-lib-ct_x509v3.o", + "crypto/des/libcrypto-lib-cbc_cksm.o", + "crypto/des/libcrypto-lib-cbc_enc.o", + "crypto/des/libcrypto-lib-cfb64ede.o", + "crypto/des/libcrypto-lib-cfb64enc.o", + "crypto/des/libcrypto-lib-cfb_enc.o", + "crypto/des/libcrypto-lib-des_enc.o", + "crypto/des/libcrypto-lib-ecb3_enc.o", + "crypto/des/libcrypto-lib-ecb_enc.o", + "crypto/des/libcrypto-lib-fcrypt.o", + "crypto/des/libcrypto-lib-fcrypt_b.o", + "crypto/des/libcrypto-lib-ofb64ede.o", + "crypto/des/libcrypto-lib-ofb64enc.o", + "crypto/des/libcrypto-lib-ofb_enc.o", + "crypto/des/libcrypto-lib-pcbc_enc.o", + "crypto/des/libcrypto-lib-qud_cksm.o", + "crypto/des/libcrypto-lib-rand_key.o", + "crypto/des/libcrypto-lib-set_key.o", + "crypto/des/libcrypto-lib-str2key.o", + "crypto/des/libcrypto-lib-xcbc_enc.o", + "crypto/dh/libcrypto-lib-dh_ameth.o", + "crypto/dh/libcrypto-lib-dh_asn1.o", + "crypto/dh/libcrypto-lib-dh_backend.o", + "crypto/dh/libcrypto-lib-dh_check.o", + "crypto/dh/libcrypto-lib-dh_depr.o", + "crypto/dh/libcrypto-lib-dh_err.o", + "crypto/dh/libcrypto-lib-dh_gen.o", + "crypto/dh/libcrypto-lib-dh_group_params.o", + "crypto/dh/libcrypto-lib-dh_kdf.o", + "crypto/dh/libcrypto-lib-dh_key.o", + "crypto/dh/libcrypto-lib-dh_lib.o", + "crypto/dh/libcrypto-lib-dh_meth.o", + "crypto/dh/libcrypto-lib-dh_pmeth.o", + "crypto/dh/libcrypto-lib-dh_prn.o", + "crypto/dh/libcrypto-lib-dh_rfc5114.o", + "crypto/dsa/libcrypto-lib-dsa_ameth.o", + "crypto/dsa/libcrypto-lib-dsa_asn1.o", + "crypto/dsa/libcrypto-lib-dsa_backend.o", + "crypto/dsa/libcrypto-lib-dsa_check.o", + "crypto/dsa/libcrypto-lib-dsa_depr.o", + "crypto/dsa/libcrypto-lib-dsa_err.o", + "crypto/dsa/libcrypto-lib-dsa_gen.o", + "crypto/dsa/libcrypto-lib-dsa_key.o", + "crypto/dsa/libcrypto-lib-dsa_lib.o", + "crypto/dsa/libcrypto-lib-dsa_meth.o", + "crypto/dsa/libcrypto-lib-dsa_ossl.o", + "crypto/dsa/libcrypto-lib-dsa_pmeth.o", + "crypto/dsa/libcrypto-lib-dsa_prn.o", + "crypto/dsa/libcrypto-lib-dsa_sign.o", + "crypto/dsa/libcrypto-lib-dsa_vrf.o", + "crypto/dso/libcrypto-lib-dso_dl.o", + "crypto/dso/libcrypto-lib-dso_dlfcn.o", + "crypto/dso/libcrypto-lib-dso_err.o", + "crypto/dso/libcrypto-lib-dso_lib.o", + "crypto/dso/libcrypto-lib-dso_openssl.o", + "crypto/dso/libcrypto-lib-dso_vms.o", + "crypto/dso/libcrypto-lib-dso_win32.o", + "crypto/ec/curve448/arch_32/libcrypto-lib-f_impl32.o", + "crypto/ec/curve448/arch_64/libcrypto-lib-f_impl64.o", + "crypto/ec/curve448/libcrypto-lib-curve448.o", + "crypto/ec/curve448/libcrypto-lib-curve448_tables.o", + "crypto/ec/curve448/libcrypto-lib-eddsa.o", + "crypto/ec/curve448/libcrypto-lib-f_generic.o", + "crypto/ec/curve448/libcrypto-lib-scalar.o", + "crypto/ec/libcrypto-lib-curve25519.o", + "crypto/ec/libcrypto-lib-ec2_oct.o", + "crypto/ec/libcrypto-lib-ec2_smpl.o", + "crypto/ec/libcrypto-lib-ec_ameth.o", + "crypto/ec/libcrypto-lib-ec_asn1.o", + "crypto/ec/libcrypto-lib-ec_backend.o", + "crypto/ec/libcrypto-lib-ec_check.o", + "crypto/ec/libcrypto-lib-ec_curve.o", + "crypto/ec/libcrypto-lib-ec_cvt.o", + "crypto/ec/libcrypto-lib-ec_deprecated.o", + "crypto/ec/libcrypto-lib-ec_err.o", + "crypto/ec/libcrypto-lib-ec_key.o", + "crypto/ec/libcrypto-lib-ec_kmeth.o", + "crypto/ec/libcrypto-lib-ec_lib.o", + "crypto/ec/libcrypto-lib-ec_mult.o", + "crypto/ec/libcrypto-lib-ec_oct.o", + "crypto/ec/libcrypto-lib-ec_pmeth.o", + "crypto/ec/libcrypto-lib-ec_print.o", + "crypto/ec/libcrypto-lib-ecdh_kdf.o", + "crypto/ec/libcrypto-lib-ecdh_ossl.o", + "crypto/ec/libcrypto-lib-ecdsa_ossl.o", + "crypto/ec/libcrypto-lib-ecdsa_sign.o", + "crypto/ec/libcrypto-lib-ecdsa_vrf.o", + "crypto/ec/libcrypto-lib-eck_prn.o", + "crypto/ec/libcrypto-lib-ecp_mont.o", + "crypto/ec/libcrypto-lib-ecp_nist.o", + "crypto/ec/libcrypto-lib-ecp_oct.o", + "crypto/ec/libcrypto-lib-ecp_smpl.o", + "crypto/ec/libcrypto-lib-ecx_backend.o", + "crypto/ec/libcrypto-lib-ecx_key.o", + "crypto/ec/libcrypto-lib-ecx_meth.o", + "crypto/encode_decode/libcrypto-lib-decoder_err.o", + "crypto/encode_decode/libcrypto-lib-decoder_lib.o", + "crypto/encode_decode/libcrypto-lib-decoder_meth.o", + "crypto/encode_decode/libcrypto-lib-decoder_pkey.o", + "crypto/encode_decode/libcrypto-lib-encoder_err.o", + "crypto/encode_decode/libcrypto-lib-encoder_lib.o", + "crypto/encode_decode/libcrypto-lib-encoder_meth.o", + "crypto/encode_decode/libcrypto-lib-encoder_pkey.o", + "crypto/engine/libcrypto-lib-eng_all.o", + "crypto/engine/libcrypto-lib-eng_cnf.o", + "crypto/engine/libcrypto-lib-eng_ctrl.o", + "crypto/engine/libcrypto-lib-eng_dyn.o", + "crypto/engine/libcrypto-lib-eng_err.o", + "crypto/engine/libcrypto-lib-eng_fat.o", + "crypto/engine/libcrypto-lib-eng_init.o", + "crypto/engine/libcrypto-lib-eng_lib.o", + "crypto/engine/libcrypto-lib-eng_list.o", + "crypto/engine/libcrypto-lib-eng_openssl.o", + "crypto/engine/libcrypto-lib-eng_pkey.o", + "crypto/engine/libcrypto-lib-eng_rdrand.o", + "crypto/engine/libcrypto-lib-eng_table.o", + "crypto/engine/libcrypto-lib-tb_asnmth.o", + "crypto/engine/libcrypto-lib-tb_cipher.o", + "crypto/engine/libcrypto-lib-tb_dh.o", + "crypto/engine/libcrypto-lib-tb_digest.o", + "crypto/engine/libcrypto-lib-tb_dsa.o", + "crypto/engine/libcrypto-lib-tb_eckey.o", + "crypto/engine/libcrypto-lib-tb_pkmeth.o", + "crypto/engine/libcrypto-lib-tb_rand.o", + "crypto/engine/libcrypto-lib-tb_rsa.o", + "crypto/err/libcrypto-lib-err.o", + "crypto/err/libcrypto-lib-err_all.o", + "crypto/err/libcrypto-lib-err_all_legacy.o", + "crypto/err/libcrypto-lib-err_blocks.o", + "crypto/err/libcrypto-lib-err_mark.o", + "crypto/err/libcrypto-lib-err_prn.o", + "crypto/err/libcrypto-lib-err_save.o", + "crypto/ess/libcrypto-lib-ess_asn1.o", + "crypto/ess/libcrypto-lib-ess_err.o", + "crypto/ess/libcrypto-lib-ess_lib.o", + "crypto/evp/libcrypto-lib-asymcipher.o", + "crypto/evp/libcrypto-lib-bio_b64.o", + "crypto/evp/libcrypto-lib-bio_enc.o", + "crypto/evp/libcrypto-lib-bio_md.o", + "crypto/evp/libcrypto-lib-bio_ok.o", + "crypto/evp/libcrypto-lib-c_allc.o", + "crypto/evp/libcrypto-lib-c_alld.o", + "crypto/evp/libcrypto-lib-cmeth_lib.o", + "crypto/evp/libcrypto-lib-ctrl_params_translate.o", + "crypto/evp/libcrypto-lib-dh_ctrl.o", + "crypto/evp/libcrypto-lib-dh_support.o", + "crypto/evp/libcrypto-lib-digest.o", + "crypto/evp/libcrypto-lib-dsa_ctrl.o", + "crypto/evp/libcrypto-lib-e_aes.o", + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha1.o", + "crypto/evp/libcrypto-lib-e_aes_cbc_hmac_sha256.o", + "crypto/evp/libcrypto-lib-e_aria.o", + "crypto/evp/libcrypto-lib-e_bf.o", + "crypto/evp/libcrypto-lib-e_camellia.o", + "crypto/evp/libcrypto-lib-e_cast.o", + "crypto/evp/libcrypto-lib-e_chacha20_poly1305.o", + "crypto/evp/libcrypto-lib-e_des.o", + "crypto/evp/libcrypto-lib-e_des3.o", + "crypto/evp/libcrypto-lib-e_idea.o", + "crypto/evp/libcrypto-lib-e_null.o", + "crypto/evp/libcrypto-lib-e_old.o", + "crypto/evp/libcrypto-lib-e_rc2.o", + "crypto/evp/libcrypto-lib-e_rc4.o", + "crypto/evp/libcrypto-lib-e_rc4_hmac_md5.o", + "crypto/evp/libcrypto-lib-e_rc5.o", + "crypto/evp/libcrypto-lib-e_seed.o", + "crypto/evp/libcrypto-lib-e_sm4.o", + "crypto/evp/libcrypto-lib-e_xcbc_d.o", + "crypto/evp/libcrypto-lib-ec_ctrl.o", + "crypto/evp/libcrypto-lib-ec_support.o", + "crypto/evp/libcrypto-lib-encode.o", + "crypto/evp/libcrypto-lib-evp_cnf.o", + "crypto/evp/libcrypto-lib-evp_enc.o", + "crypto/evp/libcrypto-lib-evp_err.o", + "crypto/evp/libcrypto-lib-evp_fetch.o", + "crypto/evp/libcrypto-lib-evp_key.o", + "crypto/evp/libcrypto-lib-evp_lib.o", + "crypto/evp/libcrypto-lib-evp_pbe.o", + "crypto/evp/libcrypto-lib-evp_pkey.o", + "crypto/evp/libcrypto-lib-evp_rand.o", + "crypto/evp/libcrypto-lib-evp_utils.o", + "crypto/evp/libcrypto-lib-exchange.o", + "crypto/evp/libcrypto-lib-kdf_lib.o", + "crypto/evp/libcrypto-lib-kdf_meth.o", + "crypto/evp/libcrypto-lib-kem.o", + "crypto/evp/libcrypto-lib-keymgmt_lib.o", + "crypto/evp/libcrypto-lib-keymgmt_meth.o", + "crypto/evp/libcrypto-lib-legacy_blake2.o", + "crypto/evp/libcrypto-lib-legacy_md4.o", + "crypto/evp/libcrypto-lib-legacy_md5.o", + "crypto/evp/libcrypto-lib-legacy_md5_sha1.o", + "crypto/evp/libcrypto-lib-legacy_mdc2.o", + "crypto/evp/libcrypto-lib-legacy_ripemd.o", + "crypto/evp/libcrypto-lib-legacy_sha.o", + "crypto/evp/libcrypto-lib-legacy_wp.o", + "crypto/evp/libcrypto-lib-m_null.o", + "crypto/evp/libcrypto-lib-m_sigver.o", + "crypto/evp/libcrypto-lib-mac_lib.o", + "crypto/evp/libcrypto-lib-mac_meth.o", + "crypto/evp/libcrypto-lib-names.o", + "crypto/evp/libcrypto-lib-p5_crpt.o", + "crypto/evp/libcrypto-lib-p5_crpt2.o", + "crypto/evp/libcrypto-lib-p_dec.o", + "crypto/evp/libcrypto-lib-p_enc.o", + "crypto/evp/libcrypto-lib-p_legacy.o", + "crypto/evp/libcrypto-lib-p_lib.o", + "crypto/evp/libcrypto-lib-p_open.o", + "crypto/evp/libcrypto-lib-p_seal.o", + "crypto/evp/libcrypto-lib-p_sign.o", + "crypto/evp/libcrypto-lib-p_verify.o", + "crypto/evp/libcrypto-lib-pbe_scrypt.o", + "crypto/evp/libcrypto-lib-pmeth_check.o", + "crypto/evp/libcrypto-lib-pmeth_gn.o", + "crypto/evp/libcrypto-lib-pmeth_lib.o", + "crypto/evp/libcrypto-lib-s_lib.o", + "crypto/evp/libcrypto-lib-signature.o", + "crypto/evp/libcrypto-lib-skeymgmt_meth.o", + "crypto/ffc/libcrypto-lib-ffc_backend.o", + "crypto/ffc/libcrypto-lib-ffc_dh.o", + "crypto/ffc/libcrypto-lib-ffc_key_generate.o", + "crypto/ffc/libcrypto-lib-ffc_key_validate.o", + "crypto/ffc/libcrypto-lib-ffc_params.o", + "crypto/ffc/libcrypto-lib-ffc_params_generate.o", + "crypto/ffc/libcrypto-lib-ffc_params_validate.o", + "crypto/hashtable/libcrypto-lib-hashfunc.o", + "crypto/hashtable/libcrypto-lib-hashtable.o", + "crypto/hmac/libcrypto-lib-hmac.o", + "crypto/hpke/libcrypto-lib-hpke.o", + "crypto/hpke/libcrypto-lib-hpke_util.o", + "crypto/http/libcrypto-lib-http_client.o", + "crypto/http/libcrypto-lib-http_err.o", + "crypto/http/libcrypto-lib-http_lib.o", + "crypto/idea/libcrypto-lib-i_cbc.o", + "crypto/idea/libcrypto-lib-i_cfb64.o", + "crypto/idea/libcrypto-lib-i_ecb.o", + "crypto/idea/libcrypto-lib-i_ofb64.o", + "crypto/idea/libcrypto-lib-i_skey.o", + "crypto/kdf/libcrypto-lib-kdf_err.o", + "crypto/lhash/libcrypto-lib-lh_stats.o", + "crypto/lhash/libcrypto-lib-lhash.o", + "crypto/libcrypto-lib-asn1_dsa.o", + "crypto/libcrypto-lib-bsearch.o", + "crypto/libcrypto-lib-comp_methods.o", + "crypto/libcrypto-lib-context.o", + "crypto/libcrypto-lib-core_algorithm.o", + "crypto/libcrypto-lib-core_fetch.o", + "crypto/libcrypto-lib-core_namemap.o", + "crypto/libcrypto-lib-cpt_err.o", + "crypto/libcrypto-lib-cpuid.o", + "crypto/libcrypto-lib-cryptlib.o", + "crypto/libcrypto-lib-ctype.o", + "crypto/libcrypto-lib-cversion.o", + "crypto/libcrypto-lib-defaults.o", + "crypto/libcrypto-lib-der_writer.o", + "crypto/libcrypto-lib-deterministic_nonce.o", + "crypto/libcrypto-lib-ebcdic.o", + "crypto/libcrypto-lib-ex_data.o", + "crypto/libcrypto-lib-getenv.o", + "crypto/libcrypto-lib-indicator_core.o", + "crypto/libcrypto-lib-info.o", + "crypto/libcrypto-lib-init.o", + "crypto/libcrypto-lib-initthread.o", + "crypto/libcrypto-lib-mem.o", + "crypto/libcrypto-lib-mem_sec.o", + "crypto/libcrypto-lib-o_dir.o", + "crypto/libcrypto-lib-o_fopen.o", + "crypto/libcrypto-lib-o_init.o", + "crypto/libcrypto-lib-o_str.o", + "crypto/libcrypto-lib-o_time.o", + "crypto/libcrypto-lib-packet.o", + "crypto/libcrypto-lib-param_build.o", + "crypto/libcrypto-lib-param_build_set.o", + "crypto/libcrypto-lib-params.o", + "crypto/libcrypto-lib-params_dup.o", + "crypto/libcrypto-lib-params_from_text.o", + "crypto/libcrypto-lib-params_idx.o", + "crypto/libcrypto-lib-passphrase.o", + "crypto/libcrypto-lib-provider.o", + "crypto/libcrypto-lib-provider_child.o", + "crypto/libcrypto-lib-provider_conf.o", + "crypto/libcrypto-lib-provider_core.o", + "crypto/libcrypto-lib-provider_predefined.o", + "crypto/libcrypto-lib-punycode.o", + "crypto/libcrypto-lib-quic_vlint.o", + "crypto/libcrypto-lib-riscv64cpuid.o", + "crypto/libcrypto-lib-riscvcap.o", + "crypto/libcrypto-lib-self_test_core.o", + "crypto/libcrypto-lib-sleep.o", + "crypto/libcrypto-lib-sparse_array.o", + "crypto/libcrypto-lib-ssl_err.o", + "crypto/libcrypto-lib-threads_lib.o", + "crypto/libcrypto-lib-threads_none.o", + "crypto/libcrypto-lib-threads_pthread.o", + "crypto/libcrypto-lib-threads_win.o", + "crypto/libcrypto-lib-time.o", + "crypto/libcrypto-lib-trace.o", + "crypto/libcrypto-lib-uid.o", + "crypto/md4/libcrypto-lib-md4_dgst.o", + "crypto/md4/libcrypto-lib-md4_one.o", + "crypto/md5/libcrypto-lib-md5_dgst.o", + "crypto/md5/libcrypto-lib-md5_one.o", + "crypto/md5/libcrypto-lib-md5_sha1.o", + "crypto/mdc2/libcrypto-lib-mdc2_one.o", + "crypto/mdc2/libcrypto-lib-mdc2dgst.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_encoders.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_key.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_key_compress.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_matrix.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_ntt.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_params.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_sample.o", + "crypto/ml_dsa/libcrypto-lib-ml_dsa_sign.o", + "crypto/ml_kem/libcrypto-lib-ml_kem.o", + "crypto/modes/libcrypto-lib-aes-gcm-riscv64-zvkb-zvkg-zvkned.o", + "crypto/modes/libcrypto-lib-cbc128.o", + "crypto/modes/libcrypto-lib-ccm128.o", + "crypto/modes/libcrypto-lib-cfb128.o", + "crypto/modes/libcrypto-lib-ctr128.o", + "crypto/modes/libcrypto-lib-cts128.o", + "crypto/modes/libcrypto-lib-gcm128.o", + "crypto/modes/libcrypto-lib-ghash-riscv64-zvkb-zvbc.o", + "crypto/modes/libcrypto-lib-ghash-riscv64-zvkg.o", + "crypto/modes/libcrypto-lib-ghash-riscv64.o", + "crypto/modes/libcrypto-lib-ocb128.o", + "crypto/modes/libcrypto-lib-ofb128.o", + "crypto/modes/libcrypto-lib-siv128.o", + "crypto/modes/libcrypto-lib-wrap128.o", + "crypto/modes/libcrypto-lib-xts128.o", + "crypto/modes/libcrypto-lib-xts128gb.o", + "crypto/objects/libcrypto-lib-o_names.o", + "crypto/objects/libcrypto-lib-obj_dat.o", + "crypto/objects/libcrypto-lib-obj_err.o", + "crypto/objects/libcrypto-lib-obj_lib.o", + "crypto/objects/libcrypto-lib-obj_xref.o", + "crypto/ocsp/libcrypto-lib-ocsp_asn.o", + "crypto/ocsp/libcrypto-lib-ocsp_cl.o", + "crypto/ocsp/libcrypto-lib-ocsp_err.o", + "crypto/ocsp/libcrypto-lib-ocsp_ext.o", + "crypto/ocsp/libcrypto-lib-ocsp_http.o", + "crypto/ocsp/libcrypto-lib-ocsp_lib.o", + "crypto/ocsp/libcrypto-lib-ocsp_prn.o", + "crypto/ocsp/libcrypto-lib-ocsp_srv.o", + "crypto/ocsp/libcrypto-lib-ocsp_vfy.o", + "crypto/ocsp/libcrypto-lib-v3_ocsp.o", + "crypto/pem/libcrypto-lib-pem_all.o", + "crypto/pem/libcrypto-lib-pem_err.o", + "crypto/pem/libcrypto-lib-pem_info.o", + "crypto/pem/libcrypto-lib-pem_lib.o", + "crypto/pem/libcrypto-lib-pem_oth.o", + "crypto/pem/libcrypto-lib-pem_pk8.o", + "crypto/pem/libcrypto-lib-pem_pkey.o", + "crypto/pem/libcrypto-lib-pem_sign.o", + "crypto/pem/libcrypto-lib-pem_x509.o", + "crypto/pem/libcrypto-lib-pem_xaux.o", + "crypto/pem/libcrypto-lib-pvkfmt.o", + "crypto/pkcs12/libcrypto-lib-p12_add.o", + "crypto/pkcs12/libcrypto-lib-p12_asn.o", + "crypto/pkcs12/libcrypto-lib-p12_attr.o", + "crypto/pkcs12/libcrypto-lib-p12_crpt.o", + "crypto/pkcs12/libcrypto-lib-p12_crt.o", + "crypto/pkcs12/libcrypto-lib-p12_decr.o", + "crypto/pkcs12/libcrypto-lib-p12_init.o", + "crypto/pkcs12/libcrypto-lib-p12_key.o", + "crypto/pkcs12/libcrypto-lib-p12_kiss.o", + "crypto/pkcs12/libcrypto-lib-p12_mutl.o", + "crypto/pkcs12/libcrypto-lib-p12_npas.o", + "crypto/pkcs12/libcrypto-lib-p12_p8d.o", + "crypto/pkcs12/libcrypto-lib-p12_p8e.o", + "crypto/pkcs12/libcrypto-lib-p12_sbag.o", + "crypto/pkcs12/libcrypto-lib-p12_utl.o", + "crypto/pkcs12/libcrypto-lib-pk12err.o", + "crypto/pkcs7/libcrypto-lib-bio_pk7.o", + "crypto/pkcs7/libcrypto-lib-pk7_asn1.o", + "crypto/pkcs7/libcrypto-lib-pk7_attr.o", + "crypto/pkcs7/libcrypto-lib-pk7_doit.o", + "crypto/pkcs7/libcrypto-lib-pk7_lib.o", + "crypto/pkcs7/libcrypto-lib-pk7_mime.o", + "crypto/pkcs7/libcrypto-lib-pk7_smime.o", + "crypto/pkcs7/libcrypto-lib-pkcs7err.o", + "crypto/poly1305/libcrypto-lib-poly1305.o", + "crypto/property/libcrypto-lib-defn_cache.o", + "crypto/property/libcrypto-lib-property.o", + "crypto/property/libcrypto-lib-property_err.o", + "crypto/property/libcrypto-lib-property_parse.o", + "crypto/property/libcrypto-lib-property_query.o", + "crypto/property/libcrypto-lib-property_string.o", + "crypto/rand/libcrypto-lib-prov_seed.o", + "crypto/rand/libcrypto-lib-rand_deprecated.o", + "crypto/rand/libcrypto-lib-rand_err.o", + "crypto/rand/libcrypto-lib-rand_lib.o", + "crypto/rand/libcrypto-lib-rand_meth.o", + "crypto/rand/libcrypto-lib-rand_pool.o", + "crypto/rand/libcrypto-lib-rand_uniform.o", + "crypto/rand/libcrypto-lib-randfile.o", + "crypto/rc2/libcrypto-lib-rc2_cbc.o", + "crypto/rc2/libcrypto-lib-rc2_ecb.o", + "crypto/rc2/libcrypto-lib-rc2_skey.o", + "crypto/rc2/libcrypto-lib-rc2cfb64.o", + "crypto/rc2/libcrypto-lib-rc2ofb64.o", + "crypto/rc4/libcrypto-lib-rc4_enc.o", + "crypto/rc4/libcrypto-lib-rc4_skey.o", + "crypto/ripemd/libcrypto-lib-rmd_dgst.o", + "crypto/ripemd/libcrypto-lib-rmd_one.o", + "crypto/rsa/libcrypto-lib-rsa_ameth.o", + "crypto/rsa/libcrypto-lib-rsa_asn1.o", + "crypto/rsa/libcrypto-lib-rsa_backend.o", + "crypto/rsa/libcrypto-lib-rsa_chk.o", + "crypto/rsa/libcrypto-lib-rsa_crpt.o", + "crypto/rsa/libcrypto-lib-rsa_depr.o", + "crypto/rsa/libcrypto-lib-rsa_err.o", + "crypto/rsa/libcrypto-lib-rsa_gen.o", + "crypto/rsa/libcrypto-lib-rsa_lib.o", + "crypto/rsa/libcrypto-lib-rsa_meth.o", + "crypto/rsa/libcrypto-lib-rsa_mp.o", + "crypto/rsa/libcrypto-lib-rsa_mp_names.o", + "crypto/rsa/libcrypto-lib-rsa_none.o", + "crypto/rsa/libcrypto-lib-rsa_oaep.o", + "crypto/rsa/libcrypto-lib-rsa_ossl.o", + "crypto/rsa/libcrypto-lib-rsa_pk1.o", + "crypto/rsa/libcrypto-lib-rsa_pmeth.o", + "crypto/rsa/libcrypto-lib-rsa_prn.o", + "crypto/rsa/libcrypto-lib-rsa_pss.o", + "crypto/rsa/libcrypto-lib-rsa_saos.o", + "crypto/rsa/libcrypto-lib-rsa_schemes.o", + "crypto/rsa/libcrypto-lib-rsa_sign.o", + "crypto/rsa/libcrypto-lib-rsa_sp800_56b_check.o", + "crypto/rsa/libcrypto-lib-rsa_sp800_56b_gen.o", + "crypto/rsa/libcrypto-lib-rsa_x931.o", + "crypto/rsa/libcrypto-lib-rsa_x931g.o", + "crypto/seed/libcrypto-lib-seed.o", + "crypto/seed/libcrypto-lib-seed_cbc.o", + "crypto/seed/libcrypto-lib-seed_cfb.o", + "crypto/seed/libcrypto-lib-seed_ecb.o", + "crypto/seed/libcrypto-lib-seed_ofb.o", + "crypto/sha/libcrypto-lib-keccak1600.o", + "crypto/sha/libcrypto-lib-sha1_one.o", + "crypto/sha/libcrypto-lib-sha1dgst.o", + "crypto/sha/libcrypto-lib-sha256-riscv64-zvkb-zvknha_or_zvknhb.o", + "crypto/sha/libcrypto-lib-sha256.o", + "crypto/sha/libcrypto-lib-sha3.o", + "crypto/sha/libcrypto-lib-sha512-riscv64-zvkb-zvknhb.o", + "crypto/sha/libcrypto-lib-sha512.o", + "crypto/sha/libcrypto-lib-sha_riscv.o", + "crypto/siphash/libcrypto-lib-siphash.o", + "crypto/slh_dsa/libcrypto-lib-slh_adrs.o", + "crypto/slh_dsa/libcrypto-lib-slh_dsa.o", + "crypto/slh_dsa/libcrypto-lib-slh_dsa_hash_ctx.o", + "crypto/slh_dsa/libcrypto-lib-slh_dsa_key.o", + "crypto/slh_dsa/libcrypto-lib-slh_fors.o", + "crypto/slh_dsa/libcrypto-lib-slh_hash.o", + "crypto/slh_dsa/libcrypto-lib-slh_hypertree.o", + "crypto/slh_dsa/libcrypto-lib-slh_params.o", + "crypto/slh_dsa/libcrypto-lib-slh_wots.o", + "crypto/slh_dsa/libcrypto-lib-slh_xmss.o", + "crypto/sm2/libcrypto-lib-sm2_crypt.o", + "crypto/sm2/libcrypto-lib-sm2_err.o", + "crypto/sm2/libcrypto-lib-sm2_key.o", + "crypto/sm2/libcrypto-lib-sm2_sign.o", + "crypto/sm3/libcrypto-lib-legacy_sm3.o", + "crypto/sm3/libcrypto-lib-sm3-riscv64-zvksh.o", + "crypto/sm3/libcrypto-lib-sm3.o", + "crypto/sm3/libcrypto-lib-sm3_riscv.o", + "crypto/sm4/libcrypto-lib-sm4-riscv64-zvksed.o", + "crypto/sm4/libcrypto-lib-sm4.o", + "crypto/srp/libcrypto-lib-srp_lib.o", + "crypto/srp/libcrypto-lib-srp_vfy.o", + "crypto/stack/libcrypto-lib-stack.o", + "crypto/store/libcrypto-lib-store_err.o", + "crypto/store/libcrypto-lib-store_init.o", + "crypto/store/libcrypto-lib-store_lib.o", + "crypto/store/libcrypto-lib-store_meth.o", + "crypto/store/libcrypto-lib-store_register.o", + "crypto/store/libcrypto-lib-store_result.o", + "crypto/store/libcrypto-lib-store_strings.o", + "crypto/thread/arch/libcrypto-lib-thread_none.o", + "crypto/thread/arch/libcrypto-lib-thread_posix.o", + "crypto/thread/arch/libcrypto-lib-thread_win.o", + "crypto/thread/libcrypto-lib-api.o", + "crypto/thread/libcrypto-lib-arch.o", + "crypto/thread/libcrypto-lib-internal.o", + "crypto/ts/libcrypto-lib-ts_asn1.o", + "crypto/ts/libcrypto-lib-ts_conf.o", + "crypto/ts/libcrypto-lib-ts_err.o", + "crypto/ts/libcrypto-lib-ts_lib.o", + "crypto/ts/libcrypto-lib-ts_req_print.o", + "crypto/ts/libcrypto-lib-ts_req_utils.o", + "crypto/ts/libcrypto-lib-ts_rsp_print.o", + "crypto/ts/libcrypto-lib-ts_rsp_sign.o", + "crypto/ts/libcrypto-lib-ts_rsp_utils.o", + "crypto/ts/libcrypto-lib-ts_rsp_verify.o", + "crypto/ts/libcrypto-lib-ts_verify_ctx.o", + "crypto/txt_db/libcrypto-lib-txt_db.o", + "crypto/ui/libcrypto-lib-ui_err.o", + "crypto/ui/libcrypto-lib-ui_lib.o", + "crypto/ui/libcrypto-lib-ui_null.o", + "crypto/ui/libcrypto-lib-ui_openssl.o", + "crypto/ui/libcrypto-lib-ui_util.o", + "crypto/whrlpool/libcrypto-lib-wp_block.o", + "crypto/whrlpool/libcrypto-lib-wp_dgst.o", + "crypto/x509/libcrypto-lib-by_dir.o", + "crypto/x509/libcrypto-lib-by_file.o", + "crypto/x509/libcrypto-lib-by_store.o", + "crypto/x509/libcrypto-lib-pcy_cache.o", + "crypto/x509/libcrypto-lib-pcy_data.o", + "crypto/x509/libcrypto-lib-pcy_lib.o", + "crypto/x509/libcrypto-lib-pcy_map.o", + "crypto/x509/libcrypto-lib-pcy_node.o", + "crypto/x509/libcrypto-lib-pcy_tree.o", + "crypto/x509/libcrypto-lib-t_acert.o", + "crypto/x509/libcrypto-lib-t_crl.o", + "crypto/x509/libcrypto-lib-t_req.o", + "crypto/x509/libcrypto-lib-t_x509.o", + "crypto/x509/libcrypto-lib-v3_aaa.o", + "crypto/x509/libcrypto-lib-v3_ac_tgt.o", + "crypto/x509/libcrypto-lib-v3_addr.o", + "crypto/x509/libcrypto-lib-v3_admis.o", + "crypto/x509/libcrypto-lib-v3_akeya.o", + "crypto/x509/libcrypto-lib-v3_akid.o", + "crypto/x509/libcrypto-lib-v3_asid.o", + "crypto/x509/libcrypto-lib-v3_attrdesc.o", + "crypto/x509/libcrypto-lib-v3_attrmap.o", + "crypto/x509/libcrypto-lib-v3_audit_id.o", + "crypto/x509/libcrypto-lib-v3_authattid.o", + "crypto/x509/libcrypto-lib-v3_battcons.o", + "crypto/x509/libcrypto-lib-v3_bcons.o", + "crypto/x509/libcrypto-lib-v3_bitst.o", + "crypto/x509/libcrypto-lib-v3_conf.o", + "crypto/x509/libcrypto-lib-v3_cpols.o", + "crypto/x509/libcrypto-lib-v3_crld.o", + "crypto/x509/libcrypto-lib-v3_enum.o", + "crypto/x509/libcrypto-lib-v3_extku.o", + "crypto/x509/libcrypto-lib-v3_genn.o", + "crypto/x509/libcrypto-lib-v3_group_ac.o", + "crypto/x509/libcrypto-lib-v3_ia5.o", + "crypto/x509/libcrypto-lib-v3_ind_iss.o", + "crypto/x509/libcrypto-lib-v3_info.o", + "crypto/x509/libcrypto-lib-v3_int.o", + "crypto/x509/libcrypto-lib-v3_iobo.o", + "crypto/x509/libcrypto-lib-v3_ist.o", + "crypto/x509/libcrypto-lib-v3_lib.o", + "crypto/x509/libcrypto-lib-v3_ncons.o", + "crypto/x509/libcrypto-lib-v3_no_ass.o", + "crypto/x509/libcrypto-lib-v3_no_rev_avail.o", + "crypto/x509/libcrypto-lib-v3_pci.o", + "crypto/x509/libcrypto-lib-v3_pcia.o", + "crypto/x509/libcrypto-lib-v3_pcons.o", + "crypto/x509/libcrypto-lib-v3_pku.o", + "crypto/x509/libcrypto-lib-v3_pmaps.o", + "crypto/x509/libcrypto-lib-v3_prn.o", + "crypto/x509/libcrypto-lib-v3_purp.o", + "crypto/x509/libcrypto-lib-v3_rolespec.o", + "crypto/x509/libcrypto-lib-v3_san.o", + "crypto/x509/libcrypto-lib-v3_sda.o", + "crypto/x509/libcrypto-lib-v3_single_use.o", + "crypto/x509/libcrypto-lib-v3_skid.o", + "crypto/x509/libcrypto-lib-v3_soa_id.o", + "crypto/x509/libcrypto-lib-v3_sxnet.o", + "crypto/x509/libcrypto-lib-v3_timespec.o", + "crypto/x509/libcrypto-lib-v3_tlsf.o", + "crypto/x509/libcrypto-lib-v3_usernotice.o", + "crypto/x509/libcrypto-lib-v3_utf8.o", + "crypto/x509/libcrypto-lib-v3_utl.o", + "crypto/x509/libcrypto-lib-v3err.o", + "crypto/x509/libcrypto-lib-x509_acert.o", + "crypto/x509/libcrypto-lib-x509_att.o", + "crypto/x509/libcrypto-lib-x509_cmp.o", + "crypto/x509/libcrypto-lib-x509_d2.o", + "crypto/x509/libcrypto-lib-x509_def.o", + "crypto/x509/libcrypto-lib-x509_err.o", + "crypto/x509/libcrypto-lib-x509_ext.o", + "crypto/x509/libcrypto-lib-x509_lu.o", + "crypto/x509/libcrypto-lib-x509_meth.o", + "crypto/x509/libcrypto-lib-x509_obj.o", + "crypto/x509/libcrypto-lib-x509_r2x.o", + "crypto/x509/libcrypto-lib-x509_req.o", + "crypto/x509/libcrypto-lib-x509_set.o", + "crypto/x509/libcrypto-lib-x509_trust.o", + "crypto/x509/libcrypto-lib-x509_txt.o", + "crypto/x509/libcrypto-lib-x509_v3.o", + "crypto/x509/libcrypto-lib-x509_vfy.o", + "crypto/x509/libcrypto-lib-x509_vpm.o", + "crypto/x509/libcrypto-lib-x509aset.o", + "crypto/x509/libcrypto-lib-x509cset.o", + "crypto/x509/libcrypto-lib-x509name.o", + "crypto/x509/libcrypto-lib-x509rset.o", + "crypto/x509/libcrypto-lib-x509spki.o", + "crypto/x509/libcrypto-lib-x509type.o", + "crypto/x509/libcrypto-lib-x_all.o", + "crypto/x509/libcrypto-lib-x_attrib.o", + "crypto/x509/libcrypto-lib-x_crl.o", + "crypto/x509/libcrypto-lib-x_exten.o", + "crypto/x509/libcrypto-lib-x_ietfatt.o", + "crypto/x509/libcrypto-lib-x_name.o", + "crypto/x509/libcrypto-lib-x_pubkey.o", + "crypto/x509/libcrypto-lib-x_req.o", + "crypto/x509/libcrypto-lib-x_x509.o", + "crypto/x509/libcrypto-lib-x_x509a.o", + "engines/libcrypto-lib-e_capi.o", + "engines/libcrypto-lib-e_padlock.o", + "providers/libcrypto-lib-baseprov.o", + "providers/libcrypto-lib-defltprov.o", + "providers/libcrypto-lib-nullprov.o", + "providers/libcrypto-lib-prov_running.o", + "providers/libdefault.a" + ], + "libssl" => [ + "ssl/libssl-lib-bio_ssl.o", + "ssl/libssl-lib-d1_lib.o", + "ssl/libssl-lib-d1_msg.o", + "ssl/libssl-lib-d1_srtp.o", + "ssl/libssl-lib-methods.o", + "ssl/libssl-lib-pqueue.o", + "ssl/libssl-lib-priority_queue.o", + "ssl/libssl-lib-s3_enc.o", + "ssl/libssl-lib-s3_lib.o", + "ssl/libssl-lib-s3_msg.o", + "ssl/libssl-lib-ssl_asn1.o", + "ssl/libssl-lib-ssl_cert.o", + "ssl/libssl-lib-ssl_cert_comp.o", + "ssl/libssl-lib-ssl_ciph.o", + "ssl/libssl-lib-ssl_conf.o", + "ssl/libssl-lib-ssl_err_legacy.o", + "ssl/libssl-lib-ssl_init.o", + "ssl/libssl-lib-ssl_lib.o", + "ssl/libssl-lib-ssl_mcnf.o", + "ssl/libssl-lib-ssl_rsa.o", + "ssl/libssl-lib-ssl_rsa_legacy.o", + "ssl/libssl-lib-ssl_sess.o", + "ssl/libssl-lib-ssl_stat.o", + "ssl/libssl-lib-ssl_txt.o", + "ssl/libssl-lib-ssl_utst.o", + "ssl/libssl-lib-t1_enc.o", + "ssl/libssl-lib-t1_lib.o", + "ssl/libssl-lib-t1_trce.o", + "ssl/libssl-lib-tls13_enc.o", + "ssl/libssl-lib-tls_depr.o", + "ssl/libssl-lib-tls_srp.o", + "ssl/quic/libssl-lib-cc_newreno.o", + "ssl/quic/libssl-lib-json_enc.o", + "ssl/quic/libssl-lib-qlog.o", + "ssl/quic/libssl-lib-qlog_event_helpers.o", + "ssl/quic/libssl-lib-quic_ackm.o", + "ssl/quic/libssl-lib-quic_cfq.o", + "ssl/quic/libssl-lib-quic_channel.o", + "ssl/quic/libssl-lib-quic_demux.o", + "ssl/quic/libssl-lib-quic_engine.o", + "ssl/quic/libssl-lib-quic_fc.o", + "ssl/quic/libssl-lib-quic_fifd.o", + "ssl/quic/libssl-lib-quic_impl.o", + "ssl/quic/libssl-lib-quic_lcidm.o", + "ssl/quic/libssl-lib-quic_method.o", + "ssl/quic/libssl-lib-quic_obj.o", + "ssl/quic/libssl-lib-quic_port.o", + "ssl/quic/libssl-lib-quic_rcidm.o", + "ssl/quic/libssl-lib-quic_reactor.o", + "ssl/quic/libssl-lib-quic_reactor_wait_ctx.o", + "ssl/quic/libssl-lib-quic_record_rx.o", + "ssl/quic/libssl-lib-quic_record_shared.o", + "ssl/quic/libssl-lib-quic_record_tx.o", + "ssl/quic/libssl-lib-quic_record_util.o", + "ssl/quic/libssl-lib-quic_rstream.o", + "ssl/quic/libssl-lib-quic_rx_depack.o", + "ssl/quic/libssl-lib-quic_sf_list.o", + "ssl/quic/libssl-lib-quic_srt_gen.o", + "ssl/quic/libssl-lib-quic_srtm.o", + "ssl/quic/libssl-lib-quic_sstream.o", + "ssl/quic/libssl-lib-quic_statm.o", + "ssl/quic/libssl-lib-quic_stream_map.o", + "ssl/quic/libssl-lib-quic_thread_assist.o", + "ssl/quic/libssl-lib-quic_tls.o", + "ssl/quic/libssl-lib-quic_tls_api.o", + "ssl/quic/libssl-lib-quic_trace.o", + "ssl/quic/libssl-lib-quic_tserver.o", + "ssl/quic/libssl-lib-quic_txp.o", + "ssl/quic/libssl-lib-quic_txpim.o", + "ssl/quic/libssl-lib-quic_types.o", + "ssl/quic/libssl-lib-quic_wire.o", + "ssl/quic/libssl-lib-quic_wire_pkt.o", + "ssl/quic/libssl-lib-uint_set.o", + "ssl/record/libssl-lib-rec_layer_d1.o", + "ssl/record/libssl-lib-rec_layer_s3.o", + "ssl/record/methods/libssl-lib-dtls_meth.o", + "ssl/record/methods/libssl-lib-ssl3_meth.o", + "ssl/record/methods/libssl-lib-tls13_meth.o", + "ssl/record/methods/libssl-lib-tls1_meth.o", + "ssl/record/methods/libssl-lib-tls_common.o", + "ssl/record/methods/libssl-lib-tls_multib.o", + "ssl/record/methods/libssl-lib-tlsany_meth.o", + "ssl/rio/libssl-lib-poll_builder.o", + "ssl/rio/libssl-lib-poll_immediate.o", + "ssl/rio/libssl-lib-rio_notifier.o", + "ssl/statem/libssl-lib-extensions.o", + "ssl/statem/libssl-lib-extensions_clnt.o", + "ssl/statem/libssl-lib-extensions_cust.o", + "ssl/statem/libssl-lib-extensions_srvr.o", + "ssl/statem/libssl-lib-statem.o", + "ssl/statem/libssl-lib-statem_clnt.o", + "ssl/statem/libssl-lib-statem_dtls.o", + "ssl/statem/libssl-lib-statem_lib.o", + "ssl/statem/libssl-lib-statem_srvr.o" + ], + "providers/common/der/libcommon-lib-der_digests_gen.o" => [ + "providers/common/der/der_digests_gen.c" + ], + "providers/common/der/libcommon-lib-der_dsa_gen.o" => [ + "providers/common/der/der_dsa_gen.c" + ], + "providers/common/der/libcommon-lib-der_dsa_key.o" => [ + "providers/common/der/der_dsa_key.c" + ], + "providers/common/der/libcommon-lib-der_dsa_sig.o" => [ + "providers/common/der/der_dsa_sig.c" + ], + "providers/common/der/libcommon-lib-der_ec_gen.o" => [ + "providers/common/der/der_ec_gen.c" + ], + "providers/common/der/libcommon-lib-der_ec_key.o" => [ + "providers/common/der/der_ec_key.c" + ], + "providers/common/der/libcommon-lib-der_ec_sig.o" => [ + "providers/common/der/der_ec_sig.c" + ], + "providers/common/der/libcommon-lib-der_ecx_gen.o" => [ + "providers/common/der/der_ecx_gen.c" + ], + "providers/common/der/libcommon-lib-der_ecx_key.o" => [ + "providers/common/der/der_ecx_key.c" + ], + "providers/common/der/libcommon-lib-der_ml_dsa_gen.o" => [ + "providers/common/der/der_ml_dsa_gen.c" + ], + "providers/common/der/libcommon-lib-der_ml_dsa_key.o" => [ + "providers/common/der/der_ml_dsa_key.c" + ], + "providers/common/der/libcommon-lib-der_rsa_gen.o" => [ + "providers/common/der/der_rsa_gen.c" + ], + "providers/common/der/libcommon-lib-der_rsa_key.o" => [ + "providers/common/der/der_rsa_key.c" + ], + "providers/common/der/libcommon-lib-der_slh_dsa_gen.o" => [ + "providers/common/der/der_slh_dsa_gen.c" + ], + "providers/common/der/libcommon-lib-der_slh_dsa_key.o" => [ + "providers/common/der/der_slh_dsa_key.c" + ], + "providers/common/der/libcommon-lib-der_wrap_gen.o" => [ + "providers/common/der/der_wrap_gen.c" + ], + "providers/common/der/libdefault-lib-der_rsa_sig.o" => [ + "providers/common/der/der_rsa_sig.c" + ], + "providers/common/der/libdefault-lib-der_sm2_gen.o" => [ + "providers/common/der/der_sm2_gen.c" + ], + "providers/common/der/libdefault-lib-der_sm2_key.o" => [ + "providers/common/der/der_sm2_key.c" + ], + "providers/common/der/libdefault-lib-der_sm2_sig.o" => [ + "providers/common/der/der_sm2_sig.c" + ], + "providers/common/der/libfips-lib-der_rsa_sig.o" => [ + "providers/common/der/der_rsa_sig.c" + ], + "providers/common/libcommon-lib-provider_ctx.o" => [ + "providers/common/provider_ctx.c" + ], + "providers/common/libcommon-lib-provider_err.o" => [ + "providers/common/provider_err.c" + ], + "providers/common/libdefault-lib-bio_prov.o" => [ + "providers/common/bio_prov.c" + ], + "providers/common/libdefault-lib-capabilities.o" => [ + "providers/common/capabilities.c" + ], + "providers/common/libdefault-lib-digest_to_nid.o" => [ + "providers/common/digest_to_nid.c" + ], + "providers/common/libdefault-lib-provider_seeding.o" => [ + "providers/common/provider_seeding.c" + ], + "providers/common/libdefault-lib-provider_util.o" => [ + "providers/common/provider_util.c" + ], + "providers/common/libdefault-lib-securitycheck.o" => [ + "providers/common/securitycheck.c" + ], + "providers/common/libdefault-lib-securitycheck_default.o" => [ + "providers/common/securitycheck_default.c" + ], + "providers/common/libfips-lib-bio_prov.o" => [ + "providers/common/bio_prov.c" + ], + "providers/common/libfips-lib-capabilities.o" => [ + "providers/common/capabilities.c" + ], + "providers/common/libfips-lib-digest_to_nid.o" => [ + "providers/common/digest_to_nid.c" + ], + "providers/common/libfips-lib-provider_seeding.o" => [ + "providers/common/provider_seeding.c" + ], + "providers/common/libfips-lib-provider_util.o" => [ + "providers/common/provider_util.c" + ], + "providers/common/libfips-lib-securitycheck.o" => [ + "providers/common/securitycheck.c" + ], + "providers/common/libfips-lib-securitycheck_fips.o" => [ + "providers/common/securitycheck_fips.c" + ], + "providers/fips" => [ + "providers/fips.ld", + "providers/fips/fips-dso-fips_entry.o" + ], + "providers/fips/fips-dso-fips_entry.o" => [ + "providers/fips/fips_entry.c" + ], + "providers/fips/libfips-lib-fipsindicator.o" => [ + "providers/fips/fipsindicator.c" + ], + "providers/fips/libfips-lib-fipsprov.o" => [ + "providers/fips/fipsprov.c" + ], + "providers/fips/libfips-lib-self_test.o" => [ + "providers/fips/self_test.c" + ], + "providers/fips/libfips-lib-self_test_kats.o" => [ + "providers/fips/self_test_kats.c" + ], + "providers/implementations/asymciphers/libdefault-lib-rsa_enc.o" => [ + "providers/implementations/asymciphers/rsa_enc.c" + ], + "providers/implementations/asymciphers/libdefault-lib-sm2_enc.o" => [ + "providers/implementations/asymciphers/sm2_enc.c" + ], + "providers/implementations/asymciphers/libfips-lib-rsa_enc.o" => [ + "providers/implementations/asymciphers/rsa_enc.c" + ], + "providers/implementations/ciphers/libcommon-lib-ciphercommon.o" => [ + "providers/implementations/ciphers/ciphercommon.c" + ], + "providers/implementations/ciphers/libcommon-lib-ciphercommon_block.o" => [ + "providers/implementations/ciphers/ciphercommon_block.c" + ], + "providers/implementations/ciphers/libcommon-lib-ciphercommon_ccm.o" => [ + "providers/implementations/ciphers/ciphercommon_ccm.c" + ], + "providers/implementations/ciphers/libcommon-lib-ciphercommon_ccm_hw.o" => [ + "providers/implementations/ciphers/ciphercommon_ccm_hw.c" + ], + "providers/implementations/ciphers/libcommon-lib-ciphercommon_gcm.o" => [ + "providers/implementations/ciphers/ciphercommon_gcm.c" + ], + "providers/implementations/ciphers/libcommon-lib-ciphercommon_gcm_hw.o" => [ + "providers/implementations/ciphers/ciphercommon_gcm_hw.c" + ], + "providers/implementations/ciphers/libcommon-lib-ciphercommon_hw.o" => [ + "providers/implementations/ciphers/ciphercommon_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes.o" => [ + "providers/implementations/ciphers/cipher_aes.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha.o" => [ + "providers/implementations/ciphers/cipher_aes_cbc_hmac_sha.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha1_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_cbc_hmac_sha1_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha256_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_cbc_hmac_sha256_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ccm.o" => [ + "providers/implementations/ciphers/cipher_aes_ccm.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ccm_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_ccm_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm.o" => [ + "providers/implementations/ciphers/cipher_aes_gcm.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_gcm_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv.o" => [ + "providers/implementations/ciphers/cipher_aes_gcm_siv.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_gcm_siv_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv_polyval.o" => [ + "providers/implementations/ciphers/cipher_aes_gcm_siv_polyval.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ocb.o" => [ + "providers/implementations/ciphers/cipher_aes_ocb.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ocb_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_ocb_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_siv.o" => [ + "providers/implementations/ciphers/cipher_aes_siv.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_siv_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_siv_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_wrp.o" => [ + "providers/implementations/ciphers/cipher_aes_wrp.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts.o" => [ + "providers/implementations/ciphers/cipher_aes_xts.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts_fips.o" => [ + "providers/implementations/ciphers/cipher_aes_xts_fips.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_xts_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aria.o" => [ + "providers/implementations/ciphers/cipher_aria.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aria_ccm.o" => [ + "providers/implementations/ciphers/cipher_aria_ccm.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aria_ccm_hw.o" => [ + "providers/implementations/ciphers/cipher_aria_ccm_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aria_gcm.o" => [ + "providers/implementations/ciphers/cipher_aria_gcm.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aria_gcm_hw.o" => [ + "providers/implementations/ciphers/cipher_aria_gcm_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_aria_hw.o" => [ + "providers/implementations/ciphers/cipher_aria_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_camellia.o" => [ + "providers/implementations/ciphers/cipher_camellia.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_camellia_hw.o" => [ + "providers/implementations/ciphers/cipher_camellia_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20.o" => [ + "providers/implementations/ciphers/cipher_chacha20.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_hw.o" => [ + "providers/implementations/ciphers/cipher_chacha20_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_poly1305.o" => [ + "providers/implementations/ciphers/cipher_chacha20_poly1305.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_poly1305_hw.o" => [ + "providers/implementations/ciphers/cipher_chacha20_poly1305_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_cts.o" => [ + "providers/implementations/ciphers/cipher_cts.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_null.o" => [ + "providers/implementations/ciphers/cipher_null.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4.o" => [ + "providers/implementations/ciphers/cipher_sm4.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_ccm.o" => [ + "providers/implementations/ciphers/cipher_sm4_ccm.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_ccm_hw.o" => [ + "providers/implementations/ciphers/cipher_sm4_ccm_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_gcm.o" => [ + "providers/implementations/ciphers/cipher_sm4_gcm.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_gcm_hw.o" => [ + "providers/implementations/ciphers/cipher_sm4_gcm_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_hw.o" => [ + "providers/implementations/ciphers/cipher_sm4_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_xts.o" => [ + "providers/implementations/ciphers/cipher_sm4_xts.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_xts_hw.o" => [ + "providers/implementations/ciphers/cipher_sm4_xts_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_tdes.o" => [ + "providers/implementations/ciphers/cipher_tdes.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_common.o" => [ + "providers/implementations/ciphers/cipher_tdes_common.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_default.o" => [ + "providers/implementations/ciphers/cipher_tdes_default.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_default_hw.o" => [ + "providers/implementations/ciphers/cipher_tdes_default_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_hw.o" => [ + "providers/implementations/ciphers/cipher_tdes_hw.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_wrap.o" => [ + "providers/implementations/ciphers/cipher_tdes_wrap.c" + ], + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_wrap_hw.o" => [ + "providers/implementations/ciphers/cipher_tdes_wrap_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes.o" => [ + "providers/implementations/ciphers/cipher_aes.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha.o" => [ + "providers/implementations/ciphers/cipher_aes_cbc_hmac_sha.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha1_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_cbc_hmac_sha1_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha256_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_cbc_hmac_sha256_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_ccm.o" => [ + "providers/implementations/ciphers/cipher_aes_ccm.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_ccm_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_ccm_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_gcm.o" => [ + "providers/implementations/ciphers/cipher_aes_gcm.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_gcm_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_gcm_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_ocb.o" => [ + "providers/implementations/ciphers/cipher_aes_ocb.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_ocb_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_ocb_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_wrp.o" => [ + "providers/implementations/ciphers/cipher_aes_wrp.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts.o" => [ + "providers/implementations/ciphers/cipher_aes_xts.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts_fips.o" => [ + "providers/implementations/ciphers/cipher_aes_xts_fips.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts_hw.o" => [ + "providers/implementations/ciphers/cipher_aes_xts_hw.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_cts.o" => [ + "providers/implementations/ciphers/cipher_cts.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_tdes.o" => [ + "providers/implementations/ciphers/cipher_tdes.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_tdes_common.o" => [ + "providers/implementations/ciphers/cipher_tdes_common.c" + ], + "providers/implementations/ciphers/libfips-lib-cipher_tdes_hw.o" => [ + "providers/implementations/ciphers/cipher_tdes_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_blowfish.o" => [ + "providers/implementations/ciphers/cipher_blowfish.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_blowfish_hw.o" => [ + "providers/implementations/ciphers/cipher_blowfish_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_cast5.o" => [ + "providers/implementations/ciphers/cipher_cast5.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_cast5_hw.o" => [ + "providers/implementations/ciphers/cipher_cast5_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_des.o" => [ + "providers/implementations/ciphers/cipher_des.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_des_hw.o" => [ + "providers/implementations/ciphers/cipher_des_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_desx.o" => [ + "providers/implementations/ciphers/cipher_desx.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_desx_hw.o" => [ + "providers/implementations/ciphers/cipher_desx_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_idea.o" => [ + "providers/implementations/ciphers/cipher_idea.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_idea_hw.o" => [ + "providers/implementations/ciphers/cipher_idea_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_rc2.o" => [ + "providers/implementations/ciphers/cipher_rc2.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_rc2_hw.o" => [ + "providers/implementations/ciphers/cipher_rc2_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4.o" => [ + "providers/implementations/ciphers/cipher_rc4.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hmac_md5.o" => [ + "providers/implementations/ciphers/cipher_rc4_hmac_md5.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hmac_md5_hw.o" => [ + "providers/implementations/ciphers/cipher_rc4_hmac_md5_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hw.o" => [ + "providers/implementations/ciphers/cipher_rc4_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_seed.o" => [ + "providers/implementations/ciphers/cipher_seed.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_seed_hw.o" => [ + "providers/implementations/ciphers/cipher_seed_hw.c" + ], + "providers/implementations/ciphers/liblegacy-lib-cipher_tdes_common.o" => [ + "providers/implementations/ciphers/cipher_tdes_common.c" + ], + "providers/implementations/digests/libcommon-lib-digestcommon.o" => [ + "providers/implementations/digests/digestcommon.c" + ], + "providers/implementations/digests/libdefault-lib-blake2_prov.o" => [ + "providers/implementations/digests/blake2_prov.c" + ], + "providers/implementations/digests/libdefault-lib-blake2b_prov.o" => [ + "providers/implementations/digests/blake2b_prov.c" + ], + "providers/implementations/digests/libdefault-lib-blake2s_prov.o" => [ + "providers/implementations/digests/blake2s_prov.c" + ], + "providers/implementations/digests/libdefault-lib-md5_prov.o" => [ + "providers/implementations/digests/md5_prov.c" + ], + "providers/implementations/digests/libdefault-lib-md5_sha1_prov.o" => [ + "providers/implementations/digests/md5_sha1_prov.c" + ], + "providers/implementations/digests/libdefault-lib-null_prov.o" => [ + "providers/implementations/digests/null_prov.c" + ], + "providers/implementations/digests/libdefault-lib-ripemd_prov.o" => [ + "providers/implementations/digests/ripemd_prov.c" + ], + "providers/implementations/digests/libdefault-lib-sha2_prov.o" => [ + "providers/implementations/digests/sha2_prov.c" + ], + "providers/implementations/digests/libdefault-lib-sha3_prov.o" => [ + "providers/implementations/digests/sha3_prov.c" + ], + "providers/implementations/digests/libdefault-lib-sm3_prov.o" => [ + "providers/implementations/digests/sm3_prov.c" + ], + "providers/implementations/digests/libfips-lib-sha2_prov.o" => [ + "providers/implementations/digests/sha2_prov.c" + ], + "providers/implementations/digests/libfips-lib-sha3_prov.o" => [ + "providers/implementations/digests/sha3_prov.c" + ], + "providers/implementations/digests/liblegacy-lib-md4_prov.o" => [ + "providers/implementations/digests/md4_prov.c" + ], + "providers/implementations/digests/liblegacy-lib-mdc2_prov.o" => [ + "providers/implementations/digests/mdc2_prov.c" + ], + "providers/implementations/digests/liblegacy-lib-ripemd_prov.o" => [ + "providers/implementations/digests/ripemd_prov.c" + ], + "providers/implementations/digests/liblegacy-lib-wp_prov.o" => [ + "providers/implementations/digests/wp_prov.c" + ], + "providers/implementations/encode_decode/libdefault-lib-decode_der2key.o" => [ + "providers/implementations/encode_decode/decode_der2key.c" + ], + "providers/implementations/encode_decode/libdefault-lib-decode_epki2pki.o" => [ + "providers/implementations/encode_decode/decode_epki2pki.c" + ], + "providers/implementations/encode_decode/libdefault-lib-decode_msblob2key.o" => [ + "providers/implementations/encode_decode/decode_msblob2key.c" + ], + "providers/implementations/encode_decode/libdefault-lib-decode_pem2der.o" => [ + "providers/implementations/encode_decode/decode_pem2der.c" + ], + "providers/implementations/encode_decode/libdefault-lib-decode_pvk2key.o" => [ + "providers/implementations/encode_decode/decode_pvk2key.c" + ], + "providers/implementations/encode_decode/libdefault-lib-decode_spki2typespki.o" => [ + "providers/implementations/encode_decode/decode_spki2typespki.c" + ], + "providers/implementations/encode_decode/libdefault-lib-encode_key2any.o" => [ + "providers/implementations/encode_decode/encode_key2any.c" + ], + "providers/implementations/encode_decode/libdefault-lib-encode_key2blob.o" => [ + "providers/implementations/encode_decode/encode_key2blob.c" + ], + "providers/implementations/encode_decode/libdefault-lib-encode_key2ms.o" => [ + "providers/implementations/encode_decode/encode_key2ms.c" + ], + "providers/implementations/encode_decode/libdefault-lib-encode_key2text.o" => [ + "providers/implementations/encode_decode/encode_key2text.c" + ], + "providers/implementations/encode_decode/libdefault-lib-endecoder_common.o" => [ + "providers/implementations/encode_decode/endecoder_common.c" + ], + "providers/implementations/encode_decode/libdefault-lib-ml_common_codecs.o" => [ + "providers/implementations/encode_decode/ml_common_codecs.c" + ], + "providers/implementations/encode_decode/libdefault-lib-ml_dsa_codecs.o" => [ + "providers/implementations/encode_decode/ml_dsa_codecs.c" + ], + "providers/implementations/encode_decode/libdefault-lib-ml_kem_codecs.o" => [ + "providers/implementations/encode_decode/ml_kem_codecs.c" + ], + "providers/implementations/exchange/libdefault-lib-dh_exch.o" => [ + "providers/implementations/exchange/dh_exch.c" + ], + "providers/implementations/exchange/libdefault-lib-ecdh_exch.o" => [ + "providers/implementations/exchange/ecdh_exch.c" + ], + "providers/implementations/exchange/libdefault-lib-ecx_exch.o" => [ + "providers/implementations/exchange/ecx_exch.c" + ], + "providers/implementations/exchange/libdefault-lib-kdf_exch.o" => [ + "providers/implementations/exchange/kdf_exch.c" + ], + "providers/implementations/exchange/libfips-lib-dh_exch.o" => [ + "providers/implementations/exchange/dh_exch.c" + ], + "providers/implementations/exchange/libfips-lib-ecdh_exch.o" => [ + "providers/implementations/exchange/ecdh_exch.c" + ], + "providers/implementations/exchange/libfips-lib-ecx_exch.o" => [ + "providers/implementations/exchange/ecx_exch.c" + ], + "providers/implementations/exchange/libfips-lib-kdf_exch.o" => [ + "providers/implementations/exchange/kdf_exch.c" + ], + "providers/implementations/kdfs/libdefault-lib-argon2.o" => [ + "providers/implementations/kdfs/argon2.c" + ], + "providers/implementations/kdfs/libdefault-lib-hkdf.o" => [ + "providers/implementations/kdfs/hkdf.c" + ], + "providers/implementations/kdfs/libdefault-lib-hmacdrbg_kdf.o" => [ + "providers/implementations/kdfs/hmacdrbg_kdf.c" + ], + "providers/implementations/kdfs/libdefault-lib-kbkdf.o" => [ + "providers/implementations/kdfs/kbkdf.c" + ], + "providers/implementations/kdfs/libdefault-lib-krb5kdf.o" => [ + "providers/implementations/kdfs/krb5kdf.c" + ], + "providers/implementations/kdfs/libdefault-lib-pbkdf2.o" => [ + "providers/implementations/kdfs/pbkdf2.c" + ], + "providers/implementations/kdfs/libdefault-lib-pbkdf2_fips.o" => [ + "providers/implementations/kdfs/pbkdf2_fips.c" + ], + "providers/implementations/kdfs/libdefault-lib-pkcs12kdf.o" => [ + "providers/implementations/kdfs/pkcs12kdf.c" + ], + "providers/implementations/kdfs/libdefault-lib-scrypt.o" => [ + "providers/implementations/kdfs/scrypt.c" + ], + "providers/implementations/kdfs/libdefault-lib-sshkdf.o" => [ + "providers/implementations/kdfs/sshkdf.c" + ], + "providers/implementations/kdfs/libdefault-lib-sskdf.o" => [ + "providers/implementations/kdfs/sskdf.c" + ], + "providers/implementations/kdfs/libdefault-lib-tls1_prf.o" => [ + "providers/implementations/kdfs/tls1_prf.c" + ], + "providers/implementations/kdfs/libdefault-lib-x942kdf.o" => [ + "providers/implementations/kdfs/x942kdf.c" + ], + "providers/implementations/kdfs/libfips-lib-hkdf.o" => [ + "providers/implementations/kdfs/hkdf.c" + ], + "providers/implementations/kdfs/libfips-lib-kbkdf.o" => [ + "providers/implementations/kdfs/kbkdf.c" + ], + "providers/implementations/kdfs/libfips-lib-pbkdf2.o" => [ + "providers/implementations/kdfs/pbkdf2.c" + ], + "providers/implementations/kdfs/libfips-lib-pbkdf2_fips.o" => [ + "providers/implementations/kdfs/pbkdf2_fips.c" + ], + "providers/implementations/kdfs/libfips-lib-sshkdf.o" => [ + "providers/implementations/kdfs/sshkdf.c" + ], + "providers/implementations/kdfs/libfips-lib-sskdf.o" => [ + "providers/implementations/kdfs/sskdf.c" + ], + "providers/implementations/kdfs/libfips-lib-tls1_prf.o" => [ + "providers/implementations/kdfs/tls1_prf.c" + ], + "providers/implementations/kdfs/libfips-lib-x942kdf.o" => [ + "providers/implementations/kdfs/x942kdf.c" + ], + "providers/implementations/kdfs/liblegacy-lib-pbkdf1.o" => [ + "providers/implementations/kdfs/pbkdf1.c" + ], + "providers/implementations/kdfs/liblegacy-lib-pvkkdf.o" => [ + "providers/implementations/kdfs/pvkkdf.c" + ], + "providers/implementations/kem/libdefault-lib-ec_kem.o" => [ + "providers/implementations/kem/ec_kem.c" + ], + "providers/implementations/kem/libdefault-lib-ecx_kem.o" => [ + "providers/implementations/kem/ecx_kem.c" + ], + "providers/implementations/kem/libdefault-lib-kem_util.o" => [ + "providers/implementations/kem/kem_util.c" + ], + "providers/implementations/kem/libdefault-lib-ml_kem_kem.o" => [ + "providers/implementations/kem/ml_kem_kem.c" + ], + "providers/implementations/kem/libdefault-lib-mlx_kem.o" => [ + "providers/implementations/kem/mlx_kem.c" + ], + "providers/implementations/kem/libdefault-lib-rsa_kem.o" => [ + "providers/implementations/kem/rsa_kem.c" + ], + "providers/implementations/kem/libfips-lib-ml_kem_kem.o" => [ + "providers/implementations/kem/ml_kem_kem.c" + ], + "providers/implementations/kem/libfips-lib-mlx_kem.o" => [ + "providers/implementations/kem/mlx_kem.c" + ], + "providers/implementations/kem/libfips-lib-rsa_kem.o" => [ + "providers/implementations/kem/rsa_kem.c" + ], + "providers/implementations/kem/libtemplate-lib-template_kem.o" => [ + "providers/implementations/kem/template_kem.c" + ], + "providers/implementations/keymgmt/libdefault-lib-dh_kmgmt.o" => [ + "providers/implementations/keymgmt/dh_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-dsa_kmgmt.o" => [ + "providers/implementations/keymgmt/dsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-ec_kmgmt.o" => [ + "providers/implementations/keymgmt/ec_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-ecx_kmgmt.o" => [ + "providers/implementations/keymgmt/ecx_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-kdf_legacy_kmgmt.o" => [ + "providers/implementations/keymgmt/kdf_legacy_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-mac_legacy_kmgmt.o" => [ + "providers/implementations/keymgmt/mac_legacy_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-ml_dsa_kmgmt.o" => [ + "providers/implementations/keymgmt/ml_dsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-ml_kem_kmgmt.o" => [ + "providers/implementations/keymgmt/ml_kem_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-mlx_kmgmt.o" => [ + "providers/implementations/keymgmt/mlx_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-rsa_kmgmt.o" => [ + "providers/implementations/keymgmt/rsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libdefault-lib-slh_dsa_kmgmt.o" => [ + "providers/implementations/keymgmt/slh_dsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-dh_kmgmt.o" => [ + "providers/implementations/keymgmt/dh_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-dsa_kmgmt.o" => [ + "providers/implementations/keymgmt/dsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-ec_kmgmt.o" => [ + "providers/implementations/keymgmt/ec_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-ecx_kmgmt.o" => [ + "providers/implementations/keymgmt/ecx_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-kdf_legacy_kmgmt.o" => [ + "providers/implementations/keymgmt/kdf_legacy_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-mac_legacy_kmgmt.o" => [ + "providers/implementations/keymgmt/mac_legacy_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-ml_dsa_kmgmt.o" => [ + "providers/implementations/keymgmt/ml_dsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-ml_kem_kmgmt.o" => [ + "providers/implementations/keymgmt/ml_kem_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-mlx_kmgmt.o" => [ + "providers/implementations/keymgmt/mlx_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-rsa_kmgmt.o" => [ + "providers/implementations/keymgmt/rsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libfips-lib-slh_dsa_kmgmt.o" => [ + "providers/implementations/keymgmt/slh_dsa_kmgmt.c" + ], + "providers/implementations/keymgmt/libtemplate-lib-template_kmgmt.o" => [ + "providers/implementations/keymgmt/template_kmgmt.c" + ], + "providers/implementations/macs/libdefault-lib-blake2b_mac.o" => [ + "providers/implementations/macs/blake2b_mac.c" + ], + "providers/implementations/macs/libdefault-lib-blake2s_mac.o" => [ + "providers/implementations/macs/blake2s_mac.c" + ], + "providers/implementations/macs/libdefault-lib-cmac_prov.o" => [ + "providers/implementations/macs/cmac_prov.c" + ], + "providers/implementations/macs/libdefault-lib-gmac_prov.o" => [ + "providers/implementations/macs/gmac_prov.c" + ], + "providers/implementations/macs/libdefault-lib-hmac_prov.o" => [ + "providers/implementations/macs/hmac_prov.c" + ], + "providers/implementations/macs/libdefault-lib-kmac_prov.o" => [ + "providers/implementations/macs/kmac_prov.c" + ], + "providers/implementations/macs/libdefault-lib-poly1305_prov.o" => [ + "providers/implementations/macs/poly1305_prov.c" + ], + "providers/implementations/macs/libdefault-lib-siphash_prov.o" => [ + "providers/implementations/macs/siphash_prov.c" + ], + "providers/implementations/macs/libfips-lib-cmac_prov.o" => [ + "providers/implementations/macs/cmac_prov.c" + ], + "providers/implementations/macs/libfips-lib-gmac_prov.o" => [ + "providers/implementations/macs/gmac_prov.c" + ], + "providers/implementations/macs/libfips-lib-hmac_prov.o" => [ + "providers/implementations/macs/hmac_prov.c" + ], + "providers/implementations/macs/libfips-lib-kmac_prov.o" => [ + "providers/implementations/macs/kmac_prov.c" + ], + "providers/implementations/rands/libdefault-lib-drbg.o" => [ + "providers/implementations/rands/drbg.c" + ], + "providers/implementations/rands/libdefault-lib-drbg_ctr.o" => [ + "providers/implementations/rands/drbg_ctr.c" + ], + "providers/implementations/rands/libdefault-lib-drbg_hash.o" => [ + "providers/implementations/rands/drbg_hash.c" + ], + "providers/implementations/rands/libdefault-lib-drbg_hmac.o" => [ + "providers/implementations/rands/drbg_hmac.c" + ], + "providers/implementations/rands/libdefault-lib-seed_src.o" => [ + "providers/implementations/rands/seed_src.c" + ], + "providers/implementations/rands/libdefault-lib-seed_src_jitter.o" => [ + "providers/implementations/rands/seed_src_jitter.c" + ], + "providers/implementations/rands/libdefault-lib-test_rng.o" => [ + "providers/implementations/rands/test_rng.c" + ], + "providers/implementations/rands/libfips-lib-drbg.o" => [ + "providers/implementations/rands/drbg.c" + ], + "providers/implementations/rands/libfips-lib-drbg_ctr.o" => [ + "providers/implementations/rands/drbg_ctr.c" + ], + "providers/implementations/rands/libfips-lib-drbg_hash.o" => [ + "providers/implementations/rands/drbg_hash.c" + ], + "providers/implementations/rands/libfips-lib-drbg_hmac.o" => [ + "providers/implementations/rands/drbg_hmac.c" + ], + "providers/implementations/rands/libfips-lib-fips_crng_test.o" => [ + "providers/implementations/rands/fips_crng_test.c" + ], + "providers/implementations/rands/libfips-lib-test_rng.o" => [ + "providers/implementations/rands/test_rng.c" + ], + "providers/implementations/rands/seeding/libdefault-lib-rand_cpu_x86.o" => [ + "providers/implementations/rands/seeding/rand_cpu_x86.c" + ], + "providers/implementations/rands/seeding/libdefault-lib-rand_tsc.o" => [ + "providers/implementations/rands/seeding/rand_tsc.c" + ], + "providers/implementations/rands/seeding/libdefault-lib-rand_unix.o" => [ + "providers/implementations/rands/seeding/rand_unix.c" + ], + "providers/implementations/rands/seeding/libdefault-lib-rand_win.o" => [ + "providers/implementations/rands/seeding/rand_win.c" + ], + "providers/implementations/signature/libdefault-lib-dsa_sig.o" => [ + "providers/implementations/signature/dsa_sig.c" + ], + "providers/implementations/signature/libdefault-lib-ecdsa_sig.o" => [ + "providers/implementations/signature/ecdsa_sig.c" + ], + "providers/implementations/signature/libdefault-lib-eddsa_sig.o" => [ + "providers/implementations/signature/eddsa_sig.c" + ], + "providers/implementations/signature/libdefault-lib-mac_legacy_sig.o" => [ + "providers/implementations/signature/mac_legacy_sig.c" + ], + "providers/implementations/signature/libdefault-lib-ml_dsa_sig.o" => [ + "providers/implementations/signature/ml_dsa_sig.c" + ], + "providers/implementations/signature/libdefault-lib-rsa_sig.o" => [ + "providers/implementations/signature/rsa_sig.c" + ], + "providers/implementations/signature/libdefault-lib-slh_dsa_sig.o" => [ + "providers/implementations/signature/slh_dsa_sig.c" + ], + "providers/implementations/signature/libdefault-lib-sm2_sig.o" => [ + "providers/implementations/signature/sm2_sig.c" + ], + "providers/implementations/signature/libfips-lib-dsa_sig.o" => [ + "providers/implementations/signature/dsa_sig.c" + ], + "providers/implementations/signature/libfips-lib-ecdsa_sig.o" => [ + "providers/implementations/signature/ecdsa_sig.c" + ], + "providers/implementations/signature/libfips-lib-eddsa_sig.o" => [ + "providers/implementations/signature/eddsa_sig.c" + ], + "providers/implementations/signature/libfips-lib-mac_legacy_sig.o" => [ + "providers/implementations/signature/mac_legacy_sig.c" + ], + "providers/implementations/signature/libfips-lib-ml_dsa_sig.o" => [ + "providers/implementations/signature/ml_dsa_sig.c" + ], + "providers/implementations/signature/libfips-lib-rsa_sig.o" => [ + "providers/implementations/signature/rsa_sig.c" + ], + "providers/implementations/signature/libfips-lib-slh_dsa_sig.o" => [ + "providers/implementations/signature/slh_dsa_sig.c" + ], + "providers/implementations/skeymgmt/libdefault-lib-aes_skmgmt.o" => [ + "providers/implementations/skeymgmt/aes_skmgmt.c" + ], + "providers/implementations/skeymgmt/libdefault-lib-generic.o" => [ + "providers/implementations/skeymgmt/generic.c" + ], + "providers/implementations/skeymgmt/libfips-lib-aes_skmgmt.o" => [ + "providers/implementations/skeymgmt/aes_skmgmt.c" + ], + "providers/implementations/skeymgmt/libfips-lib-generic.o" => [ + "providers/implementations/skeymgmt/generic.c" + ], + "providers/implementations/storemgmt/libdefault-lib-file_store.o" => [ + "providers/implementations/storemgmt/file_store.c" + ], + "providers/implementations/storemgmt/libdefault-lib-file_store_any2obj.o" => [ + "providers/implementations/storemgmt/file_store_any2obj.c" + ], + "providers/legacy" => [ + "providers/legacy-dso-legacyprov.o", + "providers/legacy.ld" + ], + "providers/legacy-dso-legacyprov.o" => [ + "providers/legacyprov.c" + ], + "providers/libcommon.a" => [ + "providers/common/der/libcommon-lib-der_digests_gen.o", + "providers/common/der/libcommon-lib-der_dsa_gen.o", + "providers/common/der/libcommon-lib-der_dsa_key.o", + "providers/common/der/libcommon-lib-der_dsa_sig.o", + "providers/common/der/libcommon-lib-der_ec_gen.o", + "providers/common/der/libcommon-lib-der_ec_key.o", + "providers/common/der/libcommon-lib-der_ec_sig.o", + "providers/common/der/libcommon-lib-der_ecx_gen.o", + "providers/common/der/libcommon-lib-der_ecx_key.o", + "providers/common/der/libcommon-lib-der_ml_dsa_gen.o", + "providers/common/der/libcommon-lib-der_ml_dsa_key.o", + "providers/common/der/libcommon-lib-der_rsa_gen.o", + "providers/common/der/libcommon-lib-der_rsa_key.o", + "providers/common/der/libcommon-lib-der_slh_dsa_gen.o", + "providers/common/der/libcommon-lib-der_slh_dsa_key.o", + "providers/common/der/libcommon-lib-der_wrap_gen.o", + "providers/common/libcommon-lib-provider_ctx.o", + "providers/common/libcommon-lib-provider_err.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_block.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_ccm.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_ccm_hw.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_gcm.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_gcm_hw.o", + "providers/implementations/ciphers/libcommon-lib-ciphercommon_hw.o", + "providers/implementations/digests/libcommon-lib-digestcommon.o", + "ssl/record/methods/libcommon-lib-tls_pad.o" + ], + "providers/libcrypto-lib-baseprov.o" => [ + "providers/baseprov.c" + ], + "providers/libcrypto-lib-defltprov.o" => [ + "providers/defltprov.c" + ], + "providers/libcrypto-lib-nullprov.o" => [ + "providers/nullprov.c" + ], + "providers/libcrypto-lib-prov_running.o" => [ + "providers/prov_running.c" + ], + "providers/libdefault.a" => [ + "providers/common/der/libdefault-lib-der_rsa_sig.o", + "providers/common/der/libdefault-lib-der_sm2_gen.o", + "providers/common/der/libdefault-lib-der_sm2_key.o", + "providers/common/der/libdefault-lib-der_sm2_sig.o", + "providers/common/libdefault-lib-bio_prov.o", + "providers/common/libdefault-lib-capabilities.o", + "providers/common/libdefault-lib-digest_to_nid.o", + "providers/common/libdefault-lib-provider_seeding.o", + "providers/common/libdefault-lib-provider_util.o", + "providers/common/libdefault-lib-securitycheck.o", + "providers/common/libdefault-lib-securitycheck_default.o", + "providers/implementations/asymciphers/libdefault-lib-rsa_enc.o", + "providers/implementations/asymciphers/libdefault-lib-sm2_enc.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha1_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_cbc_hmac_sha256_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ccm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ccm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_gcm_siv_polyval.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ocb.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_ocb_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_siv.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_siv_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_wrp.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts_fips.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aes_xts_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_ccm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_ccm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_gcm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_gcm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_aria_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_camellia.o", + "providers/implementations/ciphers/libdefault-lib-cipher_camellia_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_poly1305.o", + "providers/implementations/ciphers/libdefault-lib-cipher_chacha20_poly1305_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_cts.o", + "providers/implementations/ciphers/libdefault-lib-cipher_null.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_ccm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_ccm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_gcm.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_gcm_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_xts.o", + "providers/implementations/ciphers/libdefault-lib-cipher_sm4_xts_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_common.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_default.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_default_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_hw.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_wrap.o", + "providers/implementations/ciphers/libdefault-lib-cipher_tdes_wrap_hw.o", + "providers/implementations/digests/libdefault-lib-blake2_prov.o", + "providers/implementations/digests/libdefault-lib-blake2b_prov.o", + "providers/implementations/digests/libdefault-lib-blake2s_prov.o", + "providers/implementations/digests/libdefault-lib-md5_prov.o", + "providers/implementations/digests/libdefault-lib-md5_sha1_prov.o", + "providers/implementations/digests/libdefault-lib-null_prov.o", + "providers/implementations/digests/libdefault-lib-ripemd_prov.o", + "providers/implementations/digests/libdefault-lib-sha2_prov.o", + "providers/implementations/digests/libdefault-lib-sha3_prov.o", + "providers/implementations/digests/libdefault-lib-sm3_prov.o", + "providers/implementations/encode_decode/libdefault-lib-decode_der2key.o", + "providers/implementations/encode_decode/libdefault-lib-decode_epki2pki.o", + "providers/implementations/encode_decode/libdefault-lib-decode_msblob2key.o", + "providers/implementations/encode_decode/libdefault-lib-decode_pem2der.o", + "providers/implementations/encode_decode/libdefault-lib-decode_pvk2key.o", + "providers/implementations/encode_decode/libdefault-lib-decode_spki2typespki.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2any.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2blob.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2ms.o", + "providers/implementations/encode_decode/libdefault-lib-encode_key2text.o", + "providers/implementations/encode_decode/libdefault-lib-endecoder_common.o", + "providers/implementations/encode_decode/libdefault-lib-ml_common_codecs.o", + "providers/implementations/encode_decode/libdefault-lib-ml_dsa_codecs.o", + "providers/implementations/encode_decode/libdefault-lib-ml_kem_codecs.o", + "providers/implementations/exchange/libdefault-lib-dh_exch.o", + "providers/implementations/exchange/libdefault-lib-ecdh_exch.o", + "providers/implementations/exchange/libdefault-lib-ecx_exch.o", + "providers/implementations/exchange/libdefault-lib-kdf_exch.o", + "providers/implementations/kdfs/libdefault-lib-argon2.o", + "providers/implementations/kdfs/libdefault-lib-hkdf.o", + "providers/implementations/kdfs/libdefault-lib-hmacdrbg_kdf.o", + "providers/implementations/kdfs/libdefault-lib-kbkdf.o", + "providers/implementations/kdfs/libdefault-lib-krb5kdf.o", + "providers/implementations/kdfs/libdefault-lib-pbkdf2.o", + "providers/implementations/kdfs/libdefault-lib-pbkdf2_fips.o", + "providers/implementations/kdfs/libdefault-lib-pkcs12kdf.o", + "providers/implementations/kdfs/libdefault-lib-scrypt.o", + "providers/implementations/kdfs/libdefault-lib-sshkdf.o", + "providers/implementations/kdfs/libdefault-lib-sskdf.o", + "providers/implementations/kdfs/libdefault-lib-tls1_prf.o", + "providers/implementations/kdfs/libdefault-lib-x942kdf.o", + "providers/implementations/kem/libdefault-lib-ec_kem.o", + "providers/implementations/kem/libdefault-lib-ecx_kem.o", + "providers/implementations/kem/libdefault-lib-kem_util.o", + "providers/implementations/kem/libdefault-lib-ml_kem_kem.o", + "providers/implementations/kem/libdefault-lib-mlx_kem.o", + "providers/implementations/kem/libdefault-lib-rsa_kem.o", + "providers/implementations/keymgmt/libdefault-lib-dh_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-dsa_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ec_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ecx_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-kdf_legacy_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-mac_legacy_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ml_dsa_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-ml_kem_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-mlx_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-rsa_kmgmt.o", + "providers/implementations/keymgmt/libdefault-lib-slh_dsa_kmgmt.o", + "providers/implementations/macs/libdefault-lib-blake2b_mac.o", + "providers/implementations/macs/libdefault-lib-blake2s_mac.o", + "providers/implementations/macs/libdefault-lib-cmac_prov.o", + "providers/implementations/macs/libdefault-lib-gmac_prov.o", + "providers/implementations/macs/libdefault-lib-hmac_prov.o", + "providers/implementations/macs/libdefault-lib-kmac_prov.o", + "providers/implementations/macs/libdefault-lib-poly1305_prov.o", + "providers/implementations/macs/libdefault-lib-siphash_prov.o", + "providers/implementations/rands/libdefault-lib-drbg.o", + "providers/implementations/rands/libdefault-lib-drbg_ctr.o", + "providers/implementations/rands/libdefault-lib-drbg_hash.o", + "providers/implementations/rands/libdefault-lib-drbg_hmac.o", + "providers/implementations/rands/libdefault-lib-seed_src.o", + "providers/implementations/rands/libdefault-lib-seed_src_jitter.o", + "providers/implementations/rands/libdefault-lib-test_rng.o", + "providers/implementations/rands/seeding/libdefault-lib-rand_cpu_x86.o", + "providers/implementations/rands/seeding/libdefault-lib-rand_tsc.o", + "providers/implementations/rands/seeding/libdefault-lib-rand_unix.o", + "providers/implementations/rands/seeding/libdefault-lib-rand_win.o", + "providers/implementations/signature/libdefault-lib-dsa_sig.o", + "providers/implementations/signature/libdefault-lib-ecdsa_sig.o", + "providers/implementations/signature/libdefault-lib-eddsa_sig.o", + "providers/implementations/signature/libdefault-lib-mac_legacy_sig.o", + "providers/implementations/signature/libdefault-lib-ml_dsa_sig.o", + "providers/implementations/signature/libdefault-lib-rsa_sig.o", + "providers/implementations/signature/libdefault-lib-slh_dsa_sig.o", + "providers/implementations/signature/libdefault-lib-sm2_sig.o", + "providers/implementations/skeymgmt/libdefault-lib-aes_skmgmt.o", + "providers/implementations/skeymgmt/libdefault-lib-generic.o", + "providers/implementations/storemgmt/libdefault-lib-file_store.o", + "providers/implementations/storemgmt/libdefault-lib-file_store_any2obj.o", + "ssl/record/methods/libdefault-lib-ssl3_cbc.o" + ], + "providers/libfips.a" => [ + "crypto/aes/libfips-lib-aes-riscv64-zkn.o", + "crypto/aes/libfips-lib-aes-riscv64-zvbb-zvkg-zvkned.o", + "crypto/aes/libfips-lib-aes-riscv64-zvkb-zvkned.o", + "crypto/aes/libfips-lib-aes-riscv64-zvkned.o", + "crypto/aes/libfips-lib-aes-riscv64.o", + "crypto/aes/libfips-lib-aes_cbc.o", + "crypto/aes/libfips-lib-aes_ecb.o", + "crypto/aes/libfips-lib-aes_misc.o", + "crypto/bn/libfips-lib-bn_add.o", + "crypto/bn/libfips-lib-bn_asm.o", + "crypto/bn/libfips-lib-bn_blind.o", + "crypto/bn/libfips-lib-bn_const.o", + "crypto/bn/libfips-lib-bn_conv.o", + "crypto/bn/libfips-lib-bn_ctx.o", + "crypto/bn/libfips-lib-bn_dh.o", + "crypto/bn/libfips-lib-bn_div.o", + "crypto/bn/libfips-lib-bn_exp.o", + "crypto/bn/libfips-lib-bn_exp2.o", + "crypto/bn/libfips-lib-bn_gcd.o", + "crypto/bn/libfips-lib-bn_gf2m.o", + "crypto/bn/libfips-lib-bn_intern.o", + "crypto/bn/libfips-lib-bn_kron.o", + "crypto/bn/libfips-lib-bn_lib.o", + "crypto/bn/libfips-lib-bn_mod.o", + "crypto/bn/libfips-lib-bn_mont.o", + "crypto/bn/libfips-lib-bn_mpi.o", + "crypto/bn/libfips-lib-bn_mul.o", + "crypto/bn/libfips-lib-bn_nist.o", + "crypto/bn/libfips-lib-bn_prime.o", + "crypto/bn/libfips-lib-bn_rand.o", + "crypto/bn/libfips-lib-bn_recp.o", + "crypto/bn/libfips-lib-bn_rsa_fips186_4.o", + "crypto/bn/libfips-lib-bn_shift.o", + "crypto/bn/libfips-lib-bn_sqr.o", + "crypto/bn/libfips-lib-bn_sqrt.o", + "crypto/bn/libfips-lib-bn_word.o", + "crypto/buffer/libfips-lib-buffer.o", + "crypto/cmac/libfips-lib-cmac.o", + "crypto/des/libfips-lib-des_enc.o", + "crypto/des/libfips-lib-ecb3_enc.o", + "crypto/des/libfips-lib-fcrypt_b.o", + "crypto/des/libfips-lib-set_key.o", + "crypto/dh/libfips-lib-dh_backend.o", + "crypto/dh/libfips-lib-dh_check.o", + "crypto/dh/libfips-lib-dh_gen.o", + "crypto/dh/libfips-lib-dh_group_params.o", + "crypto/dh/libfips-lib-dh_kdf.o", + "crypto/dh/libfips-lib-dh_key.o", + "crypto/dh/libfips-lib-dh_lib.o", + "crypto/dsa/libfips-lib-dsa_backend.o", + "crypto/dsa/libfips-lib-dsa_check.o", + "crypto/dsa/libfips-lib-dsa_gen.o", + "crypto/dsa/libfips-lib-dsa_key.o", + "crypto/dsa/libfips-lib-dsa_lib.o", + "crypto/dsa/libfips-lib-dsa_ossl.o", + "crypto/dsa/libfips-lib-dsa_sign.o", + "crypto/dsa/libfips-lib-dsa_vrf.o", + "crypto/ec/curve448/arch_32/libfips-lib-f_impl32.o", + "crypto/ec/curve448/arch_64/libfips-lib-f_impl64.o", + "crypto/ec/curve448/libfips-lib-curve448.o", + "crypto/ec/curve448/libfips-lib-curve448_tables.o", + "crypto/ec/curve448/libfips-lib-eddsa.o", + "crypto/ec/curve448/libfips-lib-f_generic.o", + "crypto/ec/curve448/libfips-lib-scalar.o", + "crypto/ec/libfips-lib-curve25519.o", + "crypto/ec/libfips-lib-ec2_oct.o", + "crypto/ec/libfips-lib-ec2_smpl.o", + "crypto/ec/libfips-lib-ec_asn1.o", + "crypto/ec/libfips-lib-ec_backend.o", + "crypto/ec/libfips-lib-ec_check.o", + "crypto/ec/libfips-lib-ec_curve.o", + "crypto/ec/libfips-lib-ec_cvt.o", + "crypto/ec/libfips-lib-ec_key.o", + "crypto/ec/libfips-lib-ec_kmeth.o", + "crypto/ec/libfips-lib-ec_lib.o", + "crypto/ec/libfips-lib-ec_mult.o", + "crypto/ec/libfips-lib-ec_oct.o", + "crypto/ec/libfips-lib-ecdh_kdf.o", + "crypto/ec/libfips-lib-ecdh_ossl.o", + "crypto/ec/libfips-lib-ecdsa_ossl.o", + "crypto/ec/libfips-lib-ecdsa_sign.o", + "crypto/ec/libfips-lib-ecdsa_vrf.o", + "crypto/ec/libfips-lib-ecp_mont.o", + "crypto/ec/libfips-lib-ecp_nist.o", + "crypto/ec/libfips-lib-ecp_oct.o", + "crypto/ec/libfips-lib-ecp_smpl.o", + "crypto/ec/libfips-lib-ecx_backend.o", + "crypto/ec/libfips-lib-ecx_key.o", + "crypto/evp/libfips-lib-asymcipher.o", + "crypto/evp/libfips-lib-dh_support.o", + "crypto/evp/libfips-lib-digest.o", + "crypto/evp/libfips-lib-ec_support.o", + "crypto/evp/libfips-lib-evp_enc.o", + "crypto/evp/libfips-lib-evp_fetch.o", + "crypto/evp/libfips-lib-evp_lib.o", + "crypto/evp/libfips-lib-evp_rand.o", + "crypto/evp/libfips-lib-evp_utils.o", + "crypto/evp/libfips-lib-exchange.o", + "crypto/evp/libfips-lib-kdf_lib.o", + "crypto/evp/libfips-lib-kdf_meth.o", + "crypto/evp/libfips-lib-kem.o", + "crypto/evp/libfips-lib-keymgmt_lib.o", + "crypto/evp/libfips-lib-keymgmt_meth.o", + "crypto/evp/libfips-lib-mac_lib.o", + "crypto/evp/libfips-lib-mac_meth.o", + "crypto/evp/libfips-lib-p_lib.o", + "crypto/evp/libfips-lib-pmeth_check.o", + "crypto/evp/libfips-lib-pmeth_gn.o", + "crypto/evp/libfips-lib-pmeth_lib.o", + "crypto/evp/libfips-lib-s_lib.o", + "crypto/evp/libfips-lib-signature.o", + "crypto/evp/libfips-lib-skeymgmt_meth.o", + "crypto/ffc/libfips-lib-ffc_backend.o", + "crypto/ffc/libfips-lib-ffc_dh.o", + "crypto/ffc/libfips-lib-ffc_key_generate.o", + "crypto/ffc/libfips-lib-ffc_key_validate.o", + "crypto/ffc/libfips-lib-ffc_params.o", + "crypto/ffc/libfips-lib-ffc_params_generate.o", + "crypto/ffc/libfips-lib-ffc_params_validate.o", + "crypto/hashtable/libfips-lib-hashfunc.o", + "crypto/hashtable/libfips-lib-hashtable.o", + "crypto/hmac/libfips-lib-hmac.o", + "crypto/lhash/libfips-lib-lhash.o", + "crypto/libfips-lib-asn1_dsa.o", + "crypto/libfips-lib-bsearch.o", + "crypto/libfips-lib-context.o", + "crypto/libfips-lib-core_algorithm.o", + "crypto/libfips-lib-core_fetch.o", + "crypto/libfips-lib-core_namemap.o", + "crypto/libfips-lib-cpuid.o", + "crypto/libfips-lib-cryptlib.o", + "crypto/libfips-lib-ctype.o", + "crypto/libfips-lib-der_writer.o", + "crypto/libfips-lib-ex_data.o", + "crypto/libfips-lib-initthread.o", + "crypto/libfips-lib-o_str.o", + "crypto/libfips-lib-packet.o", + "crypto/libfips-lib-param_build.o", + "crypto/libfips-lib-param_build_set.o", + "crypto/libfips-lib-params.o", + "crypto/libfips-lib-params_dup.o", + "crypto/libfips-lib-params_from_text.o", + "crypto/libfips-lib-params_idx.o", + "crypto/libfips-lib-provider_core.o", + "crypto/libfips-lib-provider_predefined.o", + "crypto/libfips-lib-riscv64cpuid.o", + "crypto/libfips-lib-riscvcap.o", + "crypto/libfips-lib-self_test_core.o", + "crypto/libfips-lib-sparse_array.o", + "crypto/libfips-lib-threads_lib.o", + "crypto/libfips-lib-threads_none.o", + "crypto/libfips-lib-threads_pthread.o", + "crypto/libfips-lib-threads_win.o", + "crypto/libfips-lib-time.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_encoders.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_key.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_key_compress.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_matrix.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_ntt.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_params.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_sample.o", + "crypto/ml_dsa/libfips-lib-ml_dsa_sign.o", + "crypto/ml_kem/libfips-lib-ml_kem.o", + "crypto/modes/libfips-lib-aes-gcm-riscv64-zvkb-zvkg-zvkned.o", + "crypto/modes/libfips-lib-cbc128.o", + "crypto/modes/libfips-lib-ccm128.o", + "crypto/modes/libfips-lib-cfb128.o", + "crypto/modes/libfips-lib-ctr128.o", + "crypto/modes/libfips-lib-gcm128.o", + "crypto/modes/libfips-lib-ghash-riscv64-zvkb-zvbc.o", + "crypto/modes/libfips-lib-ghash-riscv64-zvkg.o", + "crypto/modes/libfips-lib-ghash-riscv64.o", + "crypto/modes/libfips-lib-ofb128.o", + "crypto/modes/libfips-lib-wrap128.o", + "crypto/modes/libfips-lib-xts128.o", + "crypto/modes/libfips-lib-xts128gb.o", + "crypto/property/libfips-lib-defn_cache.o", + "crypto/property/libfips-lib-property.o", + "crypto/property/libfips-lib-property_parse.o", + "crypto/property/libfips-lib-property_query.o", + "crypto/property/libfips-lib-property_string.o", + "crypto/rand/libfips-lib-rand_lib.o", + "crypto/rsa/libfips-lib-rsa_acvp_test_params.o", + "crypto/rsa/libfips-lib-rsa_backend.o", + "crypto/rsa/libfips-lib-rsa_chk.o", + "crypto/rsa/libfips-lib-rsa_crpt.o", + "crypto/rsa/libfips-lib-rsa_gen.o", + "crypto/rsa/libfips-lib-rsa_lib.o", + "crypto/rsa/libfips-lib-rsa_mp_names.o", + "crypto/rsa/libfips-lib-rsa_none.o", + "crypto/rsa/libfips-lib-rsa_oaep.o", + "crypto/rsa/libfips-lib-rsa_ossl.o", + "crypto/rsa/libfips-lib-rsa_pk1.o", + "crypto/rsa/libfips-lib-rsa_pss.o", + "crypto/rsa/libfips-lib-rsa_schemes.o", + "crypto/rsa/libfips-lib-rsa_sign.o", + "crypto/rsa/libfips-lib-rsa_sp800_56b_check.o", + "crypto/rsa/libfips-lib-rsa_sp800_56b_gen.o", + "crypto/rsa/libfips-lib-rsa_x931.o", + "crypto/sha/libfips-lib-keccak1600.o", + "crypto/sha/libfips-lib-sha1dgst.o", + "crypto/sha/libfips-lib-sha256-riscv64-zvkb-zvknha_or_zvknhb.o", + "crypto/sha/libfips-lib-sha256.o", + "crypto/sha/libfips-lib-sha3.o", + "crypto/sha/libfips-lib-sha512-riscv64-zvkb-zvknhb.o", + "crypto/sha/libfips-lib-sha512.o", + "crypto/sha/libfips-lib-sha_riscv.o", + "crypto/slh_dsa/libfips-lib-slh_adrs.o", + "crypto/slh_dsa/libfips-lib-slh_dsa.o", + "crypto/slh_dsa/libfips-lib-slh_dsa_hash_ctx.o", + "crypto/slh_dsa/libfips-lib-slh_dsa_key.o", + "crypto/slh_dsa/libfips-lib-slh_fors.o", + "crypto/slh_dsa/libfips-lib-slh_hash.o", + "crypto/slh_dsa/libfips-lib-slh_hypertree.o", + "crypto/slh_dsa/libfips-lib-slh_params.o", + "crypto/slh_dsa/libfips-lib-slh_wots.o", + "crypto/slh_dsa/libfips-lib-slh_xmss.o", + "crypto/stack/libfips-lib-stack.o", + "crypto/thread/arch/libfips-lib-thread_none.o", + "crypto/thread/arch/libfips-lib-thread_posix.o", + "crypto/thread/arch/libfips-lib-thread_win.o", + "crypto/thread/libfips-lib-api.o", + "crypto/thread/libfips-lib-arch.o", + "crypto/thread/libfips-lib-internal.o", + "providers/common/der/libfips-lib-der_rsa_sig.o", + "providers/common/libfips-lib-bio_prov.o", + "providers/common/libfips-lib-capabilities.o", + "providers/common/libfips-lib-digest_to_nid.o", + "providers/common/libfips-lib-provider_seeding.o", + "providers/common/libfips-lib-provider_util.o", + "providers/common/libfips-lib-securitycheck.o", + "providers/common/libfips-lib-securitycheck_fips.o", + "providers/fips/libfips-lib-fipsindicator.o", + "providers/fips/libfips-lib-fipsprov.o", + "providers/fips/libfips-lib-self_test.o", + "providers/fips/libfips-lib-self_test_kats.o", + "providers/implementations/asymciphers/libfips-lib-rsa_enc.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha1_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_cbc_hmac_sha256_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ccm.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ccm_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_gcm.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_gcm_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ocb.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_ocb_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_wrp.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts_fips.o", + "providers/implementations/ciphers/libfips-lib-cipher_aes_xts_hw.o", + "providers/implementations/ciphers/libfips-lib-cipher_cts.o", + "providers/implementations/ciphers/libfips-lib-cipher_tdes.o", + "providers/implementations/ciphers/libfips-lib-cipher_tdes_common.o", + "providers/implementations/ciphers/libfips-lib-cipher_tdes_hw.o", + "providers/implementations/digests/libfips-lib-sha2_prov.o", + "providers/implementations/digests/libfips-lib-sha3_prov.o", + "providers/implementations/exchange/libfips-lib-dh_exch.o", + "providers/implementations/exchange/libfips-lib-ecdh_exch.o", + "providers/implementations/exchange/libfips-lib-ecx_exch.o", + "providers/implementations/exchange/libfips-lib-kdf_exch.o", + "providers/implementations/kdfs/libfips-lib-hkdf.o", + "providers/implementations/kdfs/libfips-lib-kbkdf.o", + "providers/implementations/kdfs/libfips-lib-pbkdf2.o", + "providers/implementations/kdfs/libfips-lib-pbkdf2_fips.o", + "providers/implementations/kdfs/libfips-lib-sshkdf.o", + "providers/implementations/kdfs/libfips-lib-sskdf.o", + "providers/implementations/kdfs/libfips-lib-tls1_prf.o", + "providers/implementations/kdfs/libfips-lib-x942kdf.o", + "providers/implementations/kem/libfips-lib-ml_kem_kem.o", + "providers/implementations/kem/libfips-lib-mlx_kem.o", + "providers/implementations/kem/libfips-lib-rsa_kem.o", + "providers/implementations/keymgmt/libfips-lib-dh_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-dsa_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ec_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ecx_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-kdf_legacy_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-mac_legacy_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ml_dsa_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-ml_kem_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-mlx_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-rsa_kmgmt.o", + "providers/implementations/keymgmt/libfips-lib-slh_dsa_kmgmt.o", + "providers/implementations/macs/libfips-lib-cmac_prov.o", + "providers/implementations/macs/libfips-lib-gmac_prov.o", + "providers/implementations/macs/libfips-lib-hmac_prov.o", + "providers/implementations/macs/libfips-lib-kmac_prov.o", + "providers/implementations/rands/libfips-lib-drbg.o", + "providers/implementations/rands/libfips-lib-drbg_ctr.o", + "providers/implementations/rands/libfips-lib-drbg_hash.o", + "providers/implementations/rands/libfips-lib-drbg_hmac.o", + "providers/implementations/rands/libfips-lib-fips_crng_test.o", + "providers/implementations/rands/libfips-lib-test_rng.o", + "providers/implementations/signature/libfips-lib-dsa_sig.o", + "providers/implementations/signature/libfips-lib-ecdsa_sig.o", + "providers/implementations/signature/libfips-lib-eddsa_sig.o", + "providers/implementations/signature/libfips-lib-mac_legacy_sig.o", + "providers/implementations/signature/libfips-lib-ml_dsa_sig.o", + "providers/implementations/signature/libfips-lib-rsa_sig.o", + "providers/implementations/signature/libfips-lib-slh_dsa_sig.o", + "providers/implementations/skeymgmt/libfips-lib-aes_skmgmt.o", + "providers/implementations/skeymgmt/libfips-lib-generic.o", + "providers/libcommon.a", + "ssl/record/methods/libfips-lib-ssl3_cbc.o" + ], + "providers/liblegacy-lib-prov_running.o" => [ + "providers/prov_running.c" + ], + "providers/liblegacy.a" => [ + "providers/implementations/ciphers/liblegacy-lib-cipher_blowfish.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_blowfish_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_cast5.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_cast5_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_des.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_des_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_desx.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_desx_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_idea.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_idea_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc2.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc2_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hmac_md5.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hmac_md5_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_rc4_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_seed.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_seed_hw.o", + "providers/implementations/ciphers/liblegacy-lib-cipher_tdes_common.o", + "providers/implementations/digests/liblegacy-lib-md4_prov.o", + "providers/implementations/digests/liblegacy-lib-mdc2_prov.o", + "providers/implementations/digests/liblegacy-lib-ripemd_prov.o", + "providers/implementations/digests/liblegacy-lib-wp_prov.o", + "providers/implementations/kdfs/liblegacy-lib-pbkdf1.o", + "providers/implementations/kdfs/liblegacy-lib-pvkkdf.o", + "providers/liblegacy-lib-prov_running.o" + ], + "providers/libtemplate.a" => [ + "providers/implementations/kem/libtemplate-lib-template_kem.o", + "providers/implementations/keymgmt/libtemplate-lib-template_kmgmt.o" + ], + "ssl/libssl-lib-bio_ssl.o" => [ + "ssl/bio_ssl.c" + ], + "ssl/libssl-lib-d1_lib.o" => [ + "ssl/d1_lib.c" + ], + "ssl/libssl-lib-d1_msg.o" => [ + "ssl/d1_msg.c" + ], + "ssl/libssl-lib-d1_srtp.o" => [ + "ssl/d1_srtp.c" + ], + "ssl/libssl-lib-methods.o" => [ + "ssl/methods.c" + ], + "ssl/libssl-lib-pqueue.o" => [ + "ssl/pqueue.c" + ], + "ssl/libssl-lib-priority_queue.o" => [ + "ssl/priority_queue.c" + ], + "ssl/libssl-lib-s3_enc.o" => [ + "ssl/s3_enc.c" + ], + "ssl/libssl-lib-s3_lib.o" => [ + "ssl/s3_lib.c" + ], + "ssl/libssl-lib-s3_msg.o" => [ + "ssl/s3_msg.c" + ], + "ssl/libssl-lib-ssl_asn1.o" => [ + "ssl/ssl_asn1.c" + ], + "ssl/libssl-lib-ssl_cert.o" => [ + "ssl/ssl_cert.c" + ], + "ssl/libssl-lib-ssl_cert_comp.o" => [ + "ssl/ssl_cert_comp.c" + ], + "ssl/libssl-lib-ssl_ciph.o" => [ + "ssl/ssl_ciph.c" + ], + "ssl/libssl-lib-ssl_conf.o" => [ + "ssl/ssl_conf.c" + ], + "ssl/libssl-lib-ssl_err_legacy.o" => [ + "ssl/ssl_err_legacy.c" + ], + "ssl/libssl-lib-ssl_init.o" => [ + "ssl/ssl_init.c" + ], + "ssl/libssl-lib-ssl_lib.o" => [ + "ssl/ssl_lib.c" + ], + "ssl/libssl-lib-ssl_mcnf.o" => [ + "ssl/ssl_mcnf.c" + ], + "ssl/libssl-lib-ssl_rsa.o" => [ + "ssl/ssl_rsa.c" + ], + "ssl/libssl-lib-ssl_rsa_legacy.o" => [ + "ssl/ssl_rsa_legacy.c" + ], + "ssl/libssl-lib-ssl_sess.o" => [ + "ssl/ssl_sess.c" + ], + "ssl/libssl-lib-ssl_stat.o" => [ + "ssl/ssl_stat.c" + ], + "ssl/libssl-lib-ssl_txt.o" => [ + "ssl/ssl_txt.c" + ], + "ssl/libssl-lib-ssl_utst.o" => [ + "ssl/ssl_utst.c" + ], + "ssl/libssl-lib-t1_enc.o" => [ + "ssl/t1_enc.c" + ], + "ssl/libssl-lib-t1_lib.o" => [ + "ssl/t1_lib.c" + ], + "ssl/libssl-lib-t1_trce.o" => [ + "ssl/t1_trce.c" + ], + "ssl/libssl-lib-tls13_enc.o" => [ + "ssl/tls13_enc.c" + ], + "ssl/libssl-lib-tls_depr.o" => [ + "ssl/tls_depr.c" + ], + "ssl/libssl-lib-tls_srp.o" => [ + "ssl/tls_srp.c" + ], + "ssl/quic/libssl-lib-cc_newreno.o" => [ + "ssl/quic/cc_newreno.c" + ], + "ssl/quic/libssl-lib-json_enc.o" => [ + "ssl/quic/json_enc.c" + ], + "ssl/quic/libssl-lib-qlog.o" => [ + "ssl/quic/qlog.c" + ], + "ssl/quic/libssl-lib-qlog_event_helpers.o" => [ + "ssl/quic/qlog_event_helpers.c" + ], + "ssl/quic/libssl-lib-quic_ackm.o" => [ + "ssl/quic/quic_ackm.c" + ], + "ssl/quic/libssl-lib-quic_cfq.o" => [ + "ssl/quic/quic_cfq.c" + ], + "ssl/quic/libssl-lib-quic_channel.o" => [ + "ssl/quic/quic_channel.c" + ], + "ssl/quic/libssl-lib-quic_demux.o" => [ + "ssl/quic/quic_demux.c" + ], + "ssl/quic/libssl-lib-quic_engine.o" => [ + "ssl/quic/quic_engine.c" + ], + "ssl/quic/libssl-lib-quic_fc.o" => [ + "ssl/quic/quic_fc.c" + ], + "ssl/quic/libssl-lib-quic_fifd.o" => [ + "ssl/quic/quic_fifd.c" + ], + "ssl/quic/libssl-lib-quic_impl.o" => [ + "ssl/quic/quic_impl.c" + ], + "ssl/quic/libssl-lib-quic_lcidm.o" => [ + "ssl/quic/quic_lcidm.c" + ], + "ssl/quic/libssl-lib-quic_method.o" => [ + "ssl/quic/quic_method.c" + ], + "ssl/quic/libssl-lib-quic_obj.o" => [ + "ssl/quic/quic_obj.c" + ], + "ssl/quic/libssl-lib-quic_port.o" => [ + "ssl/quic/quic_port.c" + ], + "ssl/quic/libssl-lib-quic_rcidm.o" => [ + "ssl/quic/quic_rcidm.c" + ], + "ssl/quic/libssl-lib-quic_reactor.o" => [ + "ssl/quic/quic_reactor.c" + ], + "ssl/quic/libssl-lib-quic_reactor_wait_ctx.o" => [ + "ssl/quic/quic_reactor_wait_ctx.c" + ], + "ssl/quic/libssl-lib-quic_record_rx.o" => [ + "ssl/quic/quic_record_rx.c" + ], + "ssl/quic/libssl-lib-quic_record_shared.o" => [ + "ssl/quic/quic_record_shared.c" + ], + "ssl/quic/libssl-lib-quic_record_tx.o" => [ + "ssl/quic/quic_record_tx.c" + ], + "ssl/quic/libssl-lib-quic_record_util.o" => [ + "ssl/quic/quic_record_util.c" + ], + "ssl/quic/libssl-lib-quic_rstream.o" => [ + "ssl/quic/quic_rstream.c" + ], + "ssl/quic/libssl-lib-quic_rx_depack.o" => [ + "ssl/quic/quic_rx_depack.c" + ], + "ssl/quic/libssl-lib-quic_sf_list.o" => [ + "ssl/quic/quic_sf_list.c" + ], + "ssl/quic/libssl-lib-quic_srt_gen.o" => [ + "ssl/quic/quic_srt_gen.c" + ], + "ssl/quic/libssl-lib-quic_srtm.o" => [ + "ssl/quic/quic_srtm.c" + ], + "ssl/quic/libssl-lib-quic_sstream.o" => [ + "ssl/quic/quic_sstream.c" + ], + "ssl/quic/libssl-lib-quic_statm.o" => [ + "ssl/quic/quic_statm.c" + ], + "ssl/quic/libssl-lib-quic_stream_map.o" => [ + "ssl/quic/quic_stream_map.c" + ], + "ssl/quic/libssl-lib-quic_thread_assist.o" => [ + "ssl/quic/quic_thread_assist.c" + ], + "ssl/quic/libssl-lib-quic_tls.o" => [ + "ssl/quic/quic_tls.c" + ], + "ssl/quic/libssl-lib-quic_tls_api.o" => [ + "ssl/quic/quic_tls_api.c" + ], + "ssl/quic/libssl-lib-quic_trace.o" => [ + "ssl/quic/quic_trace.c" + ], + "ssl/quic/libssl-lib-quic_tserver.o" => [ + "ssl/quic/quic_tserver.c" + ], + "ssl/quic/libssl-lib-quic_txp.o" => [ + "ssl/quic/quic_txp.c" + ], + "ssl/quic/libssl-lib-quic_txpim.o" => [ + "ssl/quic/quic_txpim.c" + ], + "ssl/quic/libssl-lib-quic_types.o" => [ + "ssl/quic/quic_types.c" + ], + "ssl/quic/libssl-lib-quic_wire.o" => [ + "ssl/quic/quic_wire.c" + ], + "ssl/quic/libssl-lib-quic_wire_pkt.o" => [ + "ssl/quic/quic_wire_pkt.c" + ], + "ssl/quic/libssl-lib-uint_set.o" => [ + "ssl/quic/uint_set.c" + ], + "ssl/record/libssl-lib-rec_layer_d1.o" => [ + "ssl/record/rec_layer_d1.c" + ], + "ssl/record/libssl-lib-rec_layer_s3.o" => [ + "ssl/record/rec_layer_s3.c" + ], + "ssl/record/methods/libcommon-lib-tls_pad.o" => [ + "ssl/record/methods/tls_pad.c" + ], + "ssl/record/methods/libdefault-lib-ssl3_cbc.o" => [ + "ssl/record/methods/ssl3_cbc.c" + ], + "ssl/record/methods/libfips-lib-ssl3_cbc.o" => [ + "ssl/record/methods/ssl3_cbc.c" + ], + "ssl/record/methods/libssl-lib-dtls_meth.o" => [ + "ssl/record/methods/dtls_meth.c" + ], + "ssl/record/methods/libssl-lib-ssl3_meth.o" => [ + "ssl/record/methods/ssl3_meth.c" + ], + "ssl/record/methods/libssl-lib-tls13_meth.o" => [ + "ssl/record/methods/tls13_meth.c" + ], + "ssl/record/methods/libssl-lib-tls1_meth.o" => [ + "ssl/record/methods/tls1_meth.c" + ], + "ssl/record/methods/libssl-lib-tls_common.o" => [ + "ssl/record/methods/tls_common.c" + ], + "ssl/record/methods/libssl-lib-tls_multib.o" => [ + "ssl/record/methods/tls_multib.c" + ], + "ssl/record/methods/libssl-lib-tlsany_meth.o" => [ + "ssl/record/methods/tlsany_meth.c" + ], + "ssl/rio/libssl-lib-poll_builder.o" => [ + "ssl/rio/poll_builder.c" + ], + "ssl/rio/libssl-lib-poll_immediate.o" => [ + "ssl/rio/poll_immediate.c" + ], + "ssl/rio/libssl-lib-rio_notifier.o" => [ + "ssl/rio/rio_notifier.c" + ], + "ssl/statem/libssl-lib-extensions.o" => [ + "ssl/statem/extensions.c" + ], + "ssl/statem/libssl-lib-extensions_clnt.o" => [ + "ssl/statem/extensions_clnt.c" + ], + "ssl/statem/libssl-lib-extensions_cust.o" => [ + "ssl/statem/extensions_cust.c" + ], + "ssl/statem/libssl-lib-extensions_srvr.o" => [ + "ssl/statem/extensions_srvr.c" + ], + "ssl/statem/libssl-lib-statem.o" => [ + "ssl/statem/statem.c" + ], + "ssl/statem/libssl-lib-statem_clnt.o" => [ + "ssl/statem/statem_clnt.c" + ], + "ssl/statem/libssl-lib-statem_dtls.o" => [ + "ssl/statem/statem_dtls.c" + ], + "ssl/statem/libssl-lib-statem_lib.o" => [ + "ssl/statem/statem_lib.c" + ], + "ssl/statem/libssl-lib-statem_srvr.o" => [ + "ssl/statem/statem_srvr.c" + ], + "tools/c_rehash" => [ + "tools/c_rehash.in" + ], + "util/shlib_wrap.sh" => [ + "util/shlib_wrap.sh.in" + ], + "util/wrap.pl" => [ + "util/wrap.pl.in" + ] + }, + "targets" => [ + "build_modules_nodep" + ] +); + +# Unexported, only used by OpenSSL::Test::Utils::available_protocols() +our %available_protocols = ( + tls => [ + "ssl3", + "tls1", + "tls1_1", + "tls1_2", + "tls1_3" +], + dtls => [ + "dtls1", + "dtls1_2" +], +); + +# The following data is only used when this files is use as a script +my @makevars = ( + "AR", + "ARFLAGS", + "AS", + "ASFLAGS", + "CC", + "CFLAGS", + "CPP", + "CPPDEFINES", + "CPPFLAGS", + "CPPINCLUDES", + "CROSS_COMPILE", + "CXX", + "CXXFLAGS", + "HASHBANGPERL", + "LD", + "LDFLAGS", + "LDLIBS", + "MT", + "MTFLAGS", + "OBJCOPY", + "PERL", + "RANLIB", + "RC", + "RCFLAGS", + "RM" +); +my %disabled_info = ( + "afalgeng" => { + "macro" => "OPENSSL_NO_AFALGENG" + }, + "asan" => { + "macro" => "OPENSSL_NO_ASAN" + }, + "brotli-dynamic" => { + "macro" => "OPENSSL_NO_BROTLI_DYNAMIC" + }, + "crypto-mdebug" => { + "macro" => "OPENSSL_NO_CRYPTO_MDEBUG" + }, + "crypto-mdebug-backtrace" => { + "macro" => "OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE" + }, + "demos" => { + "macro" => "OPENSSL_NO_DEMOS" + }, + "devcryptoeng" => { + "macro" => "OPENSSL_NO_DEVCRYPTOENG" + }, + "ec_nistp_64_gcc_128" => { + "macro" => "OPENSSL_NO_EC_NISTP_64_GCC_128" + }, + "egd" => { + "macro" => "OPENSSL_NO_EGD" + }, + "external-tests" => { + "macro" => "OPENSSL_NO_EXTERNAL_TESTS" + }, + "fips-jitter" => { + "macro" => "OPENSSL_NO_FIPS_JITTER" + }, + "fuzz-afl" => { + "macro" => "OPENSSL_NO_FUZZ_AFL" + }, + "fuzz-libfuzzer" => { + "macro" => "OPENSSL_NO_FUZZ_LIBFUZZER" + }, + "h3demo" => { + "macro" => "OPENSSL_NO_H3DEMO" + }, + "hqinterop" => { + "macro" => "OPENSSL_NO_HQINTEROP" + }, + "jitter" => { + "macro" => "OPENSSL_NO_JITTER" + }, + "ktls" => { + "macro" => "OPENSSL_NO_KTLS" + }, + "loadereng" => { + "macro" => "OPENSSL_NO_LOADERENG" + }, + "md2" => { + "macro" => "OPENSSL_NO_MD2", + "skipped" => [ + "crypto/md2" + ] + }, + "msan" => { + "macro" => "OPENSSL_NO_MSAN" + }, + "pie" => { + "macro" => "OPENSSL_NO_PIE" + }, + "rc5" => { + "macro" => "OPENSSL_NO_RC5", + "skipped" => [ + "crypto/rc5" + ] + }, + "sctp" => { + "macro" => "OPENSSL_NO_SCTP" + }, + "ssl3" => { + "macro" => "OPENSSL_NO_SSL3" + }, + "ssl3-method" => { + "macro" => "OPENSSL_NO_SSL3_METHOD" + }, + "sslkeylog" => { + "macro" => "OPENSSL_NO_SSLKEYLOG" + }, + "tests" => { + "macro" => "OPENSSL_NO_TESTS" + }, + "tfo" => { + "macro" => "OPENSSL_NO_TFO" + }, + "trace" => { + "macro" => "OPENSSL_NO_TRACE" + }, + "ubsan" => { + "macro" => "OPENSSL_NO_UBSAN" + }, + "unit-test" => { + "macro" => "OPENSSL_NO_UNIT_TEST" + }, + "uplink" => { + "macro" => "OPENSSL_NO_UPLINK" + }, + "weak-ssl-ciphers" => { + "macro" => "OPENSSL_NO_WEAK_SSL_CIPHERS" + }, + "winstore" => { + "macro" => "OPENSSL_NO_WINSTORE" + }, + "zlib-dynamic" => { + "macro" => "OPENSSL_NO_ZLIB_DYNAMIC" + }, + "zstd-dynamic" => { + "macro" => "OPENSSL_NO_ZSTD_DYNAMIC" + } +); +my @user_crossable = qw( AR AS CC CXX CPP LD MT RANLIB RC ); + +# If run directly, we can give some answers, and even reconfigure +unless (caller) { + use Getopt::Long; + use File::Spec::Functions; + use File::Basename; + use File::Compare qw(compare_text); + use File::Copy; + use Pod::Usage; + + use lib '/node/deps/openssl/openssl/util/perl'; + use OpenSSL::fallback '/node/deps/openssl/openssl/external/perl/MODULES.txt'; + + my $here = dirname($0); + + if (scalar @ARGV == 0) { + # With no arguments, re-create the build file + # We do that in two steps, where the first step emits perl + # snippets. + + my $buildfile = $config{build_file}; + my $buildfile_template = "$buildfile.in"; + my @autowarntext = ( + 'WARNING: do not edit!', + "Generated by configdata.pm from " + .join(", ", @{$config{build_file_templates}}), + "via $buildfile_template" + ); + my %gendata = ( + config => \%config, + target => \%target, + disabled => \%disabled, + withargs => \%withargs, + unified_info => \%unified_info, + autowarntext => \@autowarntext, + ); + + use lib '.'; + use lib '/node/deps/openssl/openssl/Configurations'; + use gentemplate; + + open my $buildfile_template_fh, ">$buildfile_template" + or die "Trying to create $buildfile_template: $!"; + foreach (@{$config{build_file_templates}}) { + copy($_, $buildfile_template_fh) + or die "Trying to copy $_ into $buildfile_template: $!"; + } + gentemplate(output => $buildfile_template_fh, %gendata); + close $buildfile_template_fh; + print 'Created ',$buildfile_template,"\n"; + + use OpenSSL::Template; + + my $prepend = <<'_____'; +use File::Spec::Functions; +use lib '/node/deps/openssl/openssl/util/perl'; +use lib '/node/deps/openssl/openssl/Configurations'; +use lib '.'; +use platform; +_____ + + my $tmpl; + open BUILDFILE, ">$buildfile.new" + or die "Trying to create $buildfile.new: $!"; + $tmpl = OpenSSL::Template->new(TYPE => 'FILE', + SOURCE => $buildfile_template); + $tmpl->fill_in(FILENAME => $_, + OUTPUT => \*BUILDFILE, + HASH => \%gendata, + PREPEND => $prepend, + # To ensure that global variables and functions + # defined in one template stick around for the + # next, making them combinable + PACKAGE => 'OpenSSL::safe') + or die $OpenSSL::Template::ERROR; + close BUILDFILE; + rename("$buildfile.new", $buildfile) + or die "Trying to rename $buildfile.new to $buildfile: $!"; + print 'Created ',$buildfile,"\n"; + + my $configuration_h = + catfile('include', 'openssl', 'configuration.h'); + my $configuration_h_in = + catfile($config{sourcedir}, 'include', 'openssl', 'configuration.h.in'); + open CONFIGURATION_H, ">${configuration_h}.new" + or die "Trying to create ${configuration_h}.new: $!"; + $tmpl = OpenSSL::Template->new(TYPE => 'FILE', + SOURCE => $configuration_h_in); + $tmpl->fill_in(FILENAME => $_, + OUTPUT => \*CONFIGURATION_H, + HASH => \%gendata, + PREPEND => $prepend, + # To ensure that global variables and functions + # defined in one template stick around for the + # next, making them combinable + PACKAGE => 'OpenSSL::safe') + or die $OpenSSL::Template::ERROR; + close CONFIGURATION_H; + + # When using stat() on Windows, we can get it to perform better by + # avoid some data. This doesn't affect the mtime field, so we're not + # losing anything... + ${^WIN32_SLOPPY_STAT} = 1; + + my $update_configuration_h = 0; + if (-f $configuration_h) { + my $configuration_h_mtime = (stat($configuration_h))[9]; + my $configuration_h_in_mtime = (stat($configuration_h_in))[9]; + + # If configuration.h.in was updated after the last configuration.h, + # or if configuration.h.new differs configuration.h, we update + # configuration.h + if ($configuration_h_mtime < $configuration_h_in_mtime + || compare_text("${configuration_h}.new", $configuration_h) != 0) { + $update_configuration_h = 1; + } else { + # If nothing has changed, let's just drop the new one and + # pretend like nothing happened + unlink "${configuration_h}.new" + } + } else { + $update_configuration_h = 1; + } + + if ($update_configuration_h) { + rename("${configuration_h}.new", $configuration_h) + or die "Trying to rename ${configuration_h}.new to $configuration_h: $!"; + print 'Created ',$configuration_h,"\n"; + } + + exit(0); + } + + my $dump = undef; + my $cmdline = undef; + my $options = undef; + my $target = undef; + my $envvars = undef; + my $makevars = undef; + my $buildparams = undef; + my $reconf = undef; + my $verbose = undef; + my $query = undef; + my $help = undef; + my $man = undef; + GetOptions('dump|d' => \$dump, + 'command-line|c' => \$cmdline, + 'options|o' => \$options, + 'target|t' => \$target, + 'environment|e' => \$envvars, + 'make-variables|m' => \$makevars, + 'build-parameters|b' => \$buildparams, + 'reconfigure|reconf|r' => \$reconf, + 'verbose|v' => \$verbose, + 'query|q=s' => \$query, + 'help' => \$help, + 'man' => \$man) + or die "Errors in command line arguments\n"; + + # We allow extra arguments with --query. That allows constructs like + # this: + # ./configdata.pm --query 'get_sources(@ARGV)' file1 file2 file3 + if (!$query && scalar @ARGV > 0) { + print STDERR <<"_____"; +Unrecognised arguments. +For more information, do '$0 --help' +_____ + exit(2); + } + + if ($help) { + pod2usage(-exitval => 0, + -verbose => 1); + } + if ($man) { + pod2usage(-exitval => 0, + -verbose => 2); + } + if ($dump || $cmdline) { + print "\nCommand line (with current working directory = $here):\n\n"; + print ' ',join(' ', + $config{PERL}, + catfile($config{sourcedir}, 'Configure'), + @{$config{perlargv}}), "\n"; + print "\nPerl information:\n\n"; + print ' ',$config{perl_cmd},"\n"; + print ' ',$config{perl_version},' for ',$config{perl_archname},"\n"; + } + if ($dump || $options) { + my $longest = 0; + my $longest2 = 0; + foreach my $what (@disablables) { + $longest = length($what) if $longest < length($what); + $longest2 = length($disabled{$what}) + if $disabled{$what} && $longest2 < length($disabled{$what}); + } + print "\nEnabled features:\n\n"; + foreach my $what (@disablables) { + print " $what\n" unless $disabled{$what}; + } + print "\nDisabled features:\n\n"; + foreach my $what (@disablables) { + if ($disabled{$what}) { + print " $what", ' ' x ($longest - length($what) + 1), + "[$disabled{$what}]", ' ' x ($longest2 - length($disabled{$what}) + 1); + print $disabled_info{$what}->{macro} + if $disabled_info{$what}->{macro}; + print ' (skip ', + join(', ', @{$disabled_info{$what}->{skipped}}), + ')' + if $disabled_info{$what}->{skipped}; + print "\n"; + } + } + } + if ($dump || $target) { + print "\nConfig target attributes:\n\n"; + foreach (sort keys %target) { + next if $_ =~ m|^_| || $_ eq 'template'; + my $quotify = sub { + map { + if (defined $_) { + (my $x = $_) =~ s|([\\\$\@"])|\\$1|g; "\"$x\"" + } else { + "undef"; + } + } @_; + }; + print ' ', $_, ' => '; + if (ref($target{$_}) eq "ARRAY") { + print '[ ', join(', ', $quotify->(@{$target{$_}})), " ],\n"; + } else { + print $quotify->($target{$_}), ",\n" + } + } + } + if ($dump || $envvars) { + print "\nRecorded environment:\n\n"; + foreach (sort keys %{$config{perlenv}}) { + print ' ',$_,' = ',($config{perlenv}->{$_} || ''),"\n"; + } + } + if ($dump || $makevars) { + print "\nMakevars:\n\n"; + foreach my $var (@makevars) { + my $prefix = ''; + $prefix = $config{CROSS_COMPILE} + if grep { $var eq $_ } @user_crossable; + $prefix //= ''; + print ' ',$var,' ' x (16 - length $var),'= ', + (ref $config{$var} eq 'ARRAY' + ? join(' ', @{$config{$var}}) + : $prefix.$config{$var}), + "\n" + if defined $config{$var}; + } + + my @buildfile = ($config{builddir}, $config{build_file}); + unshift @buildfile, $here + unless file_name_is_absolute($config{builddir}); + my $buildfile = canonpath(catdir(@buildfile)); + print <<"_____"; + +NOTE: These variables only represent the configuration view. The build file +template may have processed these variables further, please have a look at the +build file for more exact data: + $buildfile +_____ + } + if ($dump || $buildparams) { + my @buildfile = ($config{builddir}, $config{build_file}); + unshift @buildfile, $here + unless file_name_is_absolute($config{builddir}); + print "\nbuild file:\n\n"; + print " ", canonpath(catfile(@buildfile)),"\n"; + + print "\nbuild file templates:\n\n"; + foreach (@{$config{build_file_templates}}) { + my @tmpl = ($_); + unshift @tmpl, $here + unless file_name_is_absolute($config{sourcedir}); + print ' ',canonpath(catfile(@tmpl)),"\n"; + } + } + if ($reconf) { + if ($verbose) { + print 'Reconfiguring with: ', join(' ',@{$config{perlargv}}), "\n"; + foreach (sort keys %{$config{perlenv}}) { + print ' ',$_,' = ',($config{perlenv}->{$_} || ""),"\n"; + } + } + + chdir $here; + exec $^X,catfile($config{sourcedir}, 'Configure'),'reconf'; + } + if ($query) { + use OpenSSL::Config::Query; + + my $confquery = OpenSSL::Config::Query->new(info => \%unified_info, + config => \%config); + my $result = eval "\$confquery->$query"; + + # We may need a result class with a printing function at some point. + # Until then, we assume that we get a scalar, or a list or a hash table + # with scalar values and simply print them in some orderly fashion. + if (ref $result eq 'ARRAY') { + print "$_\n" foreach @$result; + } elsif (ref $result eq 'HASH') { + print "$_ : \\\n ", join(" \\\n ", @{$result->{$_}}), "\n" + foreach sort keys %$result; + } elsif (ref $result eq 'SCALAR') { + print "$$result\n"; + } + } +} + +1; + +__END__ + +=head1 NAME + +configdata.pm - configuration data for OpenSSL builds + +=head1 SYNOPSIS + +Interactive: + + perl configdata.pm [options] + +As data bank module: + + use configdata; + +=head1 DESCRIPTION + +This module can be used in two modes, interactively and as a module containing +all the data recorded by OpenSSL's Configure script. + +When used interactively, simply run it as any perl script. +If run with no arguments, it will rebuild the build file (Makefile or +corresponding). +With at least one option, it will instead get the information you ask for, or +re-run the configuration process. +See L below for more information. + +When loaded as a module, you get a few databanks with useful information to +perform build related tasks. The databanks are: + + %config Configured things. + %target The OpenSSL config target with all inheritances + resolved. + %disabled The features that are disabled. + @disablables The list of features that can be disabled. + %withargs All data given through --with-THING options. + %unified_info All information that was computed from the build.info + files. + +=head1 OPTIONS + +=over 4 + +=item B<--help> + +Print a brief help message and exit. + +=item B<--man> + +Print the manual page and exit. + +=item B<--dump> | B<-d> + +Print all relevant configuration data. This is equivalent to B<--command-line> +B<--options> B<--target> B<--environment> B<--make-variables> +B<--build-parameters>. + +=item B<--command-line> | B<-c> + +Print the current configuration command line. + +=item B<--options> | B<-o> + +Print the features, both enabled and disabled, and display defined macro and +skipped directories where applicable. + +=item B<--target> | B<-t> + +Print the config attributes for this config target. + +=item B<--environment> | B<-e> + +Print the environment variables and their values at the time of configuration. + +=item B<--make-variables> | B<-m> + +Print the main make variables generated in the current configuration + +=item B<--build-parameters> | B<-b> + +Print the build parameters, i.e. build file and build file templates. + +=item B<--reconfigure> | B<--reconf> | B<-r> + +Re-run the configuration process. + +=item B<--verbose> | B<-v> + +Verbose output. + +=back + +=cut + +EOF diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zkn.s b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zkn.s new file mode 100644 index 000000000000..ff8a865966bc --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zkn.s @@ -0,0 +1,694 @@ +.text +.balign 16 +.globl rv64i_zkne_encrypt +.type rv64i_zkne_encrypt,@function +rv64i_zkne_encrypt: + addi sp,sp,-16 + sd x8,8(sp) + sd x9,0(sp) + + # Load input to block cipher + ld x6,0(x10) + ld x7,8(x10) + + # Load key + ld x13,0(x12) + ld x14,8(x12) + + # Load number of rounds + lwu x30,240(x12) + + # initial transformation + xor x6,x6,x13 + xor x7,x7,x14 + + # The main loop only executes the first N-1 rounds. + add x30,x30,-1 + + # Do Nr - 1 rounds (final round is special) +1: + .word 913507379 + .word 912491699 + + # Update key ptr to point to next key in schedule + add x12,x12,16 + + # Grab next key in schedule + ld x13,0(x12) + ld x14,8(x12) + xor x6,x8,x13 + xor x7,x9,x14 + + add x30,x30,-1 + bgtz x30,1b + + # final round + .word 846398515 + .word 845382835 + + # since not added 16 before + ld x13,16(x12) + ld x14,24(x12) + xor x6,x8,x13 + xor x7,x9,x14 + + sd x6,0(x11) + sd x7,8(x11) + + # Pop registers and return + ld x8,8(sp) + ld x9,0(sp) + addi sp,sp,16 + ret +.text +.balign 16 +.globl rv64i_zknd_decrypt +.type rv64i_zknd_decrypt,@function +rv64i_zknd_decrypt: + addi sp,sp,-16 + sd x8,8(sp) + sd x9,0(sp) + + # Load input to block cipher + ld x6,0(x10) + ld x7,8(x10) + + # Load number of rounds + lwu x30,240(x12) + + # Load the last key + slli x13,x30,4 + add x12,x12,x13 + ld x13,0(x12) + ld x14,8(x12) + + xor x6,x6,x13 + xor x7,x7,x14 + + # The main loop only executes the first N-1 rounds. + add x30,x30,-1 + + # Do Nr - 1 rounds (final round is special) +1: + .word 1047725107 + .word 1046709427 + + # Update key ptr to point to next key in schedule + add x12,x12,-16 + + # Grab next key in schedule + ld x13,0(x12) + ld x14,8(x12) + xor x6,x8,x13 + xor x7,x9,x14 + + add x30,x30,-1 + bgtz x30,1b + + # final round + .word 980616243 + .word 979600563 + + add x12,x12,-16 + ld x13,0(x12) + ld x14,8(x12) + xor x6,x8,x13 + xor x7,x9,x14 + + sd x6,0(x11) + sd x7,8(x11) + # Pop registers and return + ld x8,8(sp) + ld x9,0(sp) + addi sp,sp,16 + ret +.text +.balign 16 +.globl rv64i_zkne_set_encrypt_key +.type rv64i_zkne_set_encrypt_key,@function +rv64i_zkne_set_encrypt_key: + addi sp,sp,-16 + sd x8,0(sp) + # Determine number of rounds from key size in bits + li x6,128 + bne x11,x6,1f + li x7,10 # key->rounds = 10 if bits == 128 + sw x7,240(x12) # store key->rounds + ld x6,0(x10) + ld x7,8(x10) + sd x6,0(x12) + sd x7,8(x12) + .word 822318099 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 823366675 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 824415251 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 825463827 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 826512403 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 827560979 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 828609555 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 829658131 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 830706707 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + .word 831755283 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + + j 4f +1: + li x6,192 + bne x11,x6,2f + li x7,12 # key->rounds = 12 if bits == 192 + sw x7,240(x12) # store key->rounds + ld x6,0(x10) + ld x7,8(x10) + ld x8,16(x10) + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 822351507 + .word 2120647475 + .word 2121466803 + .word 2122548275 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 823400083 + .word 2120647475 + .word 2121466803 + .word 2122548275 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 824448659 + .word 2120647475 + .word 2121466803 + .word 2122548275 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 825497235 + .word 2120647475 + .word 2121466803 + .word 2122548275 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 826545811 + .word 2120647475 + .word 2121466803 + .word 2122548275 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 827594387 + .word 2120647475 + .word 2121466803 + .word 2122548275 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 828642963 + .word 2120647475 + .word 2121466803 + .word 2122548275 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + .word 829691539 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + + j 4f +2: + li x7,14 # key->rounds = 14 if bits == 256 + li x6,256 + beq x11,x6,3f + li a0,-2 # If bits != 128, 192, or 256, return -2 + j 5f +3: + sw x7,240(x12) # store key->rounds + ld x6,0(x10) + ld x7,8(x10) + ld x8,16(x10) + ld x13,24(x10) + sd x6,0(x12) + sd x7,8(x12) + sd x8,16(x12) + sd x13,24(x12) + .word 822515475 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + .word 832804627 + .word 2122777651 + .word 2127824563 + sd x8,16(x12) + sd x13,24(x12) + .word 823564051 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + .word 832804627 + .word 2122777651 + .word 2127824563 + sd x8,16(x12) + sd x13,24(x12) + .word 824612627 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + .word 832804627 + .word 2122777651 + .word 2127824563 + sd x8,16(x12) + sd x13,24(x12) + .word 825661203 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + .word 832804627 + .word 2122777651 + .word 2127824563 + sd x8,16(x12) + sd x13,24(x12) + .word 826709779 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + .word 832804627 + .word 2122777651 + .word 2127824563 + sd x8,16(x12) + sd x13,24(x12) + .word 827758355 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + .word 832804627 + .word 2122777651 + .word 2127824563 + sd x8,16(x12) + sd x13,24(x12) + .word 828806931 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + +4: # return 0 + li a0,0 +5: # return a0 + ld x8,0(sp) + addi sp,sp,16 + ret +.text +.balign 16 +.globl rv64i_zknd_set_decrypt_key +.type rv64i_zknd_set_decrypt_key,@function +rv64i_zknd_set_decrypt_key: + addi sp,sp,-16 + sd x8,0(sp) + # Determine number of rounds from key size in bits + li x6,128 + bne x11,x6,1f + li x7,10 # key->rounds = 10 if bits == 128 + sw x7,240(x12) # store key->rounds + ld x6,0(x10) + ld x7,8(x10) + sd x6,0(x12) + sd x7,8(x12) + .word 822318099 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 823366675 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 824415251 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 825463827 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 826512403 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 827560979 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 828609555 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 829658131 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 830706707 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + .word 805508115 + sd x8,0(x12) + .word 805540883 + sd x8,8(x12) + .word 831755283 + .word 2120483635 + .word 2121466803 + add x12,x12,16 + sd x6,0(x12) + sd x7,8(x12) + + j 4f +1: + li x6,192 + bne x11,x6,2f + li x7,12 # key->rounds = 12 if bits == 192 + sw x7,240(x12) # store key->rounds + ld x6,0(x10) + ld x7,8(x10) + ld x8,16(x10) + sd x6,0(x12) + sd x7,8(x12) + .word 805574291 + sd x13,16(x12) + .word 822351507 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + .word 805508755 + sd x13,0(x12) + .word 805541523 + sd x13,8(x12) + # the reason is in ke192enc + .word 2122548275 + .word 805574291 + sd x13,16(x12) + .word 823400083 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + .word 805508755 + sd x13,0(x12) + .word 805541523 + sd x13,8(x12) + # the reason is in ke192enc + .word 2122548275 + .word 805574291 + sd x13,16(x12) + .word 824448659 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + .word 805508755 + sd x13,0(x12) + .word 805541523 + sd x13,8(x12) + # the reason is in ke192enc + .word 2122548275 + .word 805574291 + sd x13,16(x12) + .word 825497235 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + .word 805508755 + sd x13,0(x12) + .word 805541523 + sd x13,8(x12) + # the reason is in ke192enc + .word 2122548275 + .word 805574291 + sd x13,16(x12) + .word 826545811 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + .word 805508755 + sd x13,0(x12) + .word 805541523 + sd x13,8(x12) + # the reason is in ke192enc + .word 2122548275 + .word 805574291 + sd x13,16(x12) + .word 827594387 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + .word 805508755 + sd x13,0(x12) + .word 805541523 + sd x13,8(x12) + # the reason is in ke192enc + .word 2122548275 + .word 805574291 + sd x13,16(x12) + .word 828642963 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + .word 805508755 + sd x13,0(x12) + .word 805541523 + sd x13,8(x12) + # the reason is in ke192enc + .word 2122548275 + .word 805574291 + sd x13,16(x12) + .word 829691539 + .word 2120647475 + .word 2121466803 + add x12,x12,24 + sd x6,0(x12) + sd x7,8(x12) + + j 4f +2: + li x7,14 # key->rounds = 14 if bits == 256 + li x6,256 + beq x11,x6,3f + li a0,-2 # If bits != 128, 192, or 256, return -2 + j 5f +3: + sw x7,240(x12) # store key->rounds + ld x6,0(x10) + ld x7,8(x10) + ld x8,16(x10) + ld x13,24(x10) + sd x6,0(x12) + sd x7,8(x12) + .word 805574419 + sd x14,16(x12) + .word 805738259 + sd x14,24(x12) + .word 822515475 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + .word 832804627 + .word 2122777651 + .word 2127824563 + .word 805508883 + sd x14,0(x12) + .word 805541651 + sd x14,8(x12) + .word 805574419 + sd x14,16(x12) + .word 805738259 + sd x14,24(x12) + .word 823564051 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + .word 832804627 + .word 2122777651 + .word 2127824563 + .word 805508883 + sd x14,0(x12) + .word 805541651 + sd x14,8(x12) + .word 805574419 + sd x14,16(x12) + .word 805738259 + sd x14,24(x12) + .word 824612627 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + .word 832804627 + .word 2122777651 + .word 2127824563 + .word 805508883 + sd x14,0(x12) + .word 805541651 + sd x14,8(x12) + .word 805574419 + sd x14,16(x12) + .word 805738259 + sd x14,24(x12) + .word 825661203 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + .word 832804627 + .word 2122777651 + .word 2127824563 + .word 805508883 + sd x14,0(x12) + .word 805541651 + sd x14,8(x12) + .word 805574419 + sd x14,16(x12) + .word 805738259 + sd x14,24(x12) + .word 826709779 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + .word 832804627 + .word 2122777651 + .word 2127824563 + .word 805508883 + sd x14,0(x12) + .word 805541651 + sd x14,8(x12) + .word 805574419 + sd x14,16(x12) + .word 805738259 + sd x14,24(x12) + .word 827758355 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + .word 832804627 + .word 2122777651 + .word 2127824563 + .word 805508883 + sd x14,0(x12) + .word 805541651 + sd x14,8(x12) + .word 805574419 + sd x14,16(x12) + .word 805738259 + sd x14,24(x12) + .word 828806931 + .word 2120680243 + .word 2121466803 + add x12,x12,32 + sd x6,0(x12) + sd x7,8(x12) + # last two one dropped + +4: # return 0 + li a0,0 +5: # return a0 + ld x8,0(sp) + addi sp,sp,16 + ret diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s new file mode 100644 index 000000000000..f8a68e7c42dd --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s @@ -0,0 +1,943 @@ +.text +.p2align 3 +.globl rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt +.type rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt,@function +rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt: + # Load number of rounds + lwu t0, 240(a4) + .word 3439489111 + .word 34074119 + .word 34041479 + .word 2815667831 + addi t0, t0, -1 + addi a4, a4, 16 +1: + .word 34041479 + .word 2815503991 + addi t0, t0, -1 + addi a4, a4, 16 + bnez t0, 1b + .word 34041479 + .word 2815536759 + + + # aes block size is 16 + andi a6, a2, 15 + mv t3, a2 + beqz a6, 1f + sub a2, a2, a6 + addi t3, a2, -16 +1: + # We make the `LENGTH` become e32 length here. + srli t4, a2, 2 + srli t3, t3, 2 + + # Load number of rounds + lwu t0, 240(a3) + li t1, 14 + li t2, 10 + beq t0, t1, aes_xts_enc_256 + beq t0, t2, aes_xts_enc_128 +.size rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt,.-rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt +.p2align 3 +aes_xts_enc_128: + # load input + .word 221182167 + .word 33909767 + + li t0, 5 + # We could simplify the initialization steps if we have `block<=1`. + blt t4, t0, 1f + + # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses + # different order of coefficients. We should use`vbrev8` to reverse the + # data when we use `vgmul`. + .word 3439489111 + .word 1271144535 + .word 221179991 + .word 1577072727 + # v16: [r-IV0, r-IV0, ...] + .word 2785257591 + + # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8. + slli t0, t4, 2 + .word 218296407 + # v2: [`1`, `1`, `1`, `1`, ...] + .word 1577103703 + # v3: [`0`, `1`, `2`, `3`, ...] + .word 1376297431 + .word 227733591 + # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...] + .word 1243816535 + # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...] + .word 1244865367 + slli t0, t4, 1 + .word 219344983 + # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...] + .word 3594716247 + + # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16 + .word 221179991 + .word 1250174039 + .word 2726865015 + + # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28. + # Reverse the bits order back. + .word 1258565207 + + # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number + # in a LMUL=4 register group. + # n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) + # = (VLEN/32) + # We could use vsetvli with `e32, m1` to compute the `n` number. + .word 218133207 + li t1, 1 + sll t0, t1, t0 + .word 3447812183 + .word 1577070679 + .word 3380670551 + .word 1577238615 + .word 3447812183 + .word 1241784407 + .word 221179991 + .word 1577073239 + .word 2785258103 + + j 2f +1: + .word 3439489111 + .word 1271146583 +2: + + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + + .word 221182167 + j 1f + +.Lenc_blocks_128: + .word 221182167 + # load plaintext into v24 + .word 33909767 + # update iv + .word 2739447927 + # reverse the iv's bits order back + .word 1258565207 +1: + .word 797838423 + slli t0, a7, 2 + sub t4, t4, a7 + add a0, a0, t0 + .word 2786307191 + .word 2787191927 + .word 2788240503 + .word 2789289079 + .word 2790337655 + .word 2791386231 + .word 2792434807 + .word 2793483383 + .word 2794531959 + .word 2795580535 + .word 2796661879 + + .word 797838423 + + # store ciphertext + .word 221147223 + .word 33942567 + add a1, a1, t0 + sub t3, t3, a7 + + bnez t4, .Lenc_blocks_128 + + bnez a6, 1f + ret +1: + # slidedown second to last block + addi a7, a7, -4 + .word 3441586263 + # ciphertext + .word 1065929815 + # multiplier + .word 1057540183 + + .word 3439489111 + .word 1577848023 + + # load last block into v24 + # note: We should load the last block before store the second to last block + # for in-place operation. + .word 134770775 + .word 33885191 + + # setup `x` multiplier with byte-reversed order + # 0b00000010 => 0b01000000 (0x40) + li t0, 0x40 + .word 3439489111 + .word 1577074263 + .word 3355504727 + .word 1577242199 + + # compute IV for last block + .word 3439489111 + .word 2747836535 + .word 1258565207 + + # store second to last block + .word 201879639 + .word 33918119 + + + # xts last block + .word 3439489111 + .word 797838423 + .word 2786307191 + .word 2787191927 + .word 2788240503 + .word 2789289079 + .word 2790337655 + .word 2791386231 + .word 2792434807 + .word 2793483383 + .word 2794531959 + .word 2795580535 + .word 2796661879 + + .word 797838423 + + # store last block ciphertext + addi a1, a1, -16 + .word 33942567 + + ret +.size aes_xts_enc_128,.-aes_xts_enc_128 +.p2align 3 +aes_xts_enc_256: + # load input + .word 221182167 + .word 33909767 + + li t0, 5 + # We could simplify the initialization steps if we have `block<=1`. + blt t4, t0, 1f + + # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses + # different order of coefficients. We should use`vbrev8` to reverse the + # data when we use `vgmul`. + .word 3439489111 + .word 1271144535 + .word 221179991 + .word 1577072727 + # v16: [r-IV0, r-IV0, ...] + .word 2785257591 + + # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8. + slli t0, t4, 2 + .word 218296407 + # v2: [`1`, `1`, `1`, `1`, ...] + .word 1577103703 + # v3: [`0`, `1`, `2`, `3`, ...] + .word 1376297431 + .word 227733591 + # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...] + .word 1243816535 + # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...] + .word 1244865367 + slli t0, t4, 1 + .word 219344983 + # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...] + .word 3594716247 + + # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16 + .word 221179991 + .word 1250174039 + .word 2726865015 + + # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28. + # Reverse the bits order back. + .word 1258565207 + + # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number + # in a LMUL=4 register group. + # n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) + # = (VLEN/32) + # We could use vsetvli with `e32, m1` to compute the `n` number. + .word 218133207 + li t1, 1 + sll t0, t1, t0 + .word 3447812183 + .word 1577070679 + .word 3380670551 + .word 1577238615 + .word 3447812183 + .word 1241784407 + .word 221179991 + .word 1577073239 + .word 2785258103 + + j 2f +1: + .word 3439489111 + .word 1271146583 +2: + + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + + + .word 221182167 + j 1f + +.Lenc_blocks_256: + .word 221182167 + # load plaintext into v24 + .word 33909767 + # update iv + .word 2739447927 + # reverse the iv's bits order back + .word 1258565207 +1: + .word 797838423 + slli t0, a7, 2 + sub t4, t4, a7 + add a0, a0, t0 + .word 2786307191 + .word 2787191927 + .word 2788240503 + .word 2789289079 + .word 2790337655 + .word 2791386231 + .word 2792434807 + .word 2793483383 + .word 2794531959 + .word 2795580535 + .word 2796629111 + .word 2797677687 + .word 2798726263 + .word 2799774839 + .word 2800856183 + + .word 797838423 + + # store ciphertext + .word 221147223 + .word 33942567 + add a1, a1, t0 + sub t3, t3, a7 + + bnez t4, .Lenc_blocks_256 + + bnez a6, 1f + ret +1: + # slidedown second to last block + addi a7, a7, -4 + .word 3441586263 + # ciphertext + .word 1065929815 + # multiplier + .word 1057540183 + + .word 3439489111 + .word 1577848023 + + # load last block into v24 + # note: We should load the last block before store the second to last block + # for in-place operation. + .word 134770775 + .word 33885191 + + # setup `x` multiplier with byte-reversed order + # 0b00000010 => 0b01000000 (0x40) + li t0, 0x40 + .word 3439489111 + .word 1577074263 + .word 3355504727 + .word 1577242199 + + # compute IV for last block + .word 3439489111 + .word 2747836535 + .word 1258565207 + + # store second to last block + .word 201879639 + .word 33918119 + + + # xts last block + .word 3439489111 + .word 797838423 + .word 2786307191 + .word 2787191927 + .word 2788240503 + .word 2789289079 + .word 2790337655 + .word 2791386231 + .word 2792434807 + .word 2793483383 + .word 2794531959 + .word 2795580535 + .word 2796629111 + .word 2797677687 + .word 2798726263 + .word 2799774839 + .word 2800856183 + + .word 797838423 + + # store last block ciphertext + addi a1, a1, -16 + .word 33942567 + + ret +.size aes_xts_enc_256,.-aes_xts_enc_256 +.p2align 3 +.globl rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt +.type rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt,@function +rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt: + # Load number of rounds + lwu t0, 240(a4) + .word 3439489111 + .word 34074119 + .word 34041479 + .word 2815667831 + addi t0, t0, -1 + addi a4, a4, 16 +1: + .word 34041479 + .word 2815503991 + addi t0, t0, -1 + addi a4, a4, 16 + bnez t0, 1b + .word 34041479 + .word 2815536759 + + + # aes block size is 16 + andi a6, a2, 15 + beqz a6, 1f + sub a2, a2, a6 + addi a2, a2, -16 +1: + # We make the `LENGTH` become e32 length here. + srli t4, a2, 2 + + # Load number of rounds + lwu t0, 240(a3) + li t1, 14 + li t2, 10 + beq t0, t1, aes_xts_dec_256 + beq t0, t2, aes_xts_dec_128 +.size rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt,.-rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt +.p2align 3 +aes_xts_dec_128: + # load input + .word 221182167 + .word 33909767 + + li t0, 5 + # We could simplify the initialization steps if we have `block<=1`. + blt t4, t0, 1f + + # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses + # different order of coefficients. We should use`vbrev8` to reverse the + # data when we use `vgmul`. + .word 3439489111 + .word 1271144535 + .word 221179991 + .word 1577072727 + # v16: [r-IV0, r-IV0, ...] + .word 2785257591 + + # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8. + slli t0, t4, 2 + .word 218296407 + # v2: [`1`, `1`, `1`, `1`, ...] + .word 1577103703 + # v3: [`0`, `1`, `2`, `3`, ...] + .word 1376297431 + .word 227733591 + # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...] + .word 1243816535 + # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...] + .word 1244865367 + slli t0, t4, 1 + .word 219344983 + # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...] + .word 3594716247 + + # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16 + .word 221179991 + .word 1250174039 + .word 2726865015 + + # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28. + # Reverse the bits order back. + .word 1258565207 + + # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number + # in a LMUL=4 register group. + # n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) + # = (VLEN/32) + # We could use vsetvli with `e32, m1` to compute the `n` number. + .word 218133207 + li t1, 1 + sll t0, t1, t0 + .word 3447812183 + .word 1577070679 + .word 3380670551 + .word 1577238615 + .word 3447812183 + .word 1241784407 + .word 221179991 + .word 1577073239 + .word 2785258103 + + j 2f +1: + .word 3439489111 + .word 1271146583 +2: + + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + + beqz t4, 2f + + .word 221182167 + j 1f + +.Ldec_blocks_128: + .word 221182167 + # load ciphertext into v24 + .word 33909767 + # update iv + .word 2739447927 + # reverse the iv's bits order back + .word 1258565207 +1: + .word 797838423 + slli t0, a7, 2 + sub t4, t4, a7 + add a0, a0, t0 + .word 2796792951 + .word 2795514999 + .word 2794466423 + .word 2793417847 + .word 2792369271 + .word 2791320695 + .word 2790272119 + .word 2789223543 + .word 2788174967 + .word 2787126391 + .word 2786110583 + + .word 797838423 + + # store plaintext + .word 33942567 + add a1, a1, t0 + + bnez t4, .Ldec_blocks_128 + +2: + bnez a6, 1f + ret +1: + # load second to last block's ciphertext + .word 3439489111 + .word 33909767 + addi a0, a0, 16 + + # setup `x` multiplier with byte-reversed order + # 0b00000010 => 0b01000000 (0x40) + li t0, 0x40 + .word 3439489111 + .word 1577073239 + .word 3355504727 + .word 1577241175 + + beqz a2, 1f + # slidedown third to last block + addi a7, a7, -4 + .word 3441586263 + # multiplier + .word 1057540183 + + # compute IV for last block + .word 3439489111 + .word 2739447927 + .word 1258565207 + + # compute IV for second to last block + .word 2739447927 + .word 1258565335 + j 2f +1: + # compute IV for second to last block + .word 3439489111 + .word 2739447927 + .word 1258565335 +2: + + + ## xts second to last block + .word 3439489111 + .word 797871191 + .word 2796792951 + .word 2795514999 + .word 2794466423 + .word 2793417847 + .word 2792369271 + .word 2791320695 + .word 2790272119 + .word 2789223543 + .word 2788174967 + .word 2787126391 + .word 2786110583 + + .word 797871191 + .word 1577848023 + + # load last block ciphertext + .word 134770775 + .word 33885191 + + # store second to last block plaintext + addi t0, a1, 16 + .word 33721511 + + ## xts last block + .word 3439489111 + .word 797838423 + .word 2796792951 + .word 2795514999 + .word 2794466423 + .word 2793417847 + .word 2792369271 + .word 2791320695 + .word 2790272119 + .word 2789223543 + .word 2788174967 + .word 2787126391 + .word 2786110583 + + .word 797838423 + + # store second to last block plaintext + .word 33942567 + + ret +.size aes_xts_dec_128,.-aes_xts_dec_128 +.p2align 3 +aes_xts_dec_256: + # load input + .word 221182167 + .word 33909767 + + li t0, 5 + # We could simplify the initialization steps if we have `block<=1`. + blt t4, t0, 1f + + # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses + # different order of coefficients. We should use`vbrev8` to reverse the + # data when we use `vgmul`. + .word 3439489111 + .word 1271144535 + .word 221179991 + .word 1577072727 + # v16: [r-IV0, r-IV0, ...] + .word 2785257591 + + # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8. + slli t0, t4, 2 + .word 218296407 + # v2: [`1`, `1`, `1`, `1`, ...] + .word 1577103703 + # v3: [`0`, `1`, `2`, `3`, ...] + .word 1376297431 + .word 227733591 + # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...] + .word 1243816535 + # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...] + .word 1244865367 + slli t0, t4, 1 + .word 219344983 + # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...] + .word 3594716247 + + # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16 + .word 221179991 + .word 1250174039 + .word 2726865015 + + # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28. + # Reverse the bits order back. + .word 1258565207 + + # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number + # in a LMUL=4 register group. + # n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) + # = (VLEN/32) + # We could use vsetvli with `e32, m1` to compute the `n` number. + .word 218133207 + li t1, 1 + sll t0, t1, t0 + .word 3447812183 + .word 1577070679 + .word 3380670551 + .word 1577238615 + .word 3447812183 + .word 1241784407 + .word 221179991 + .word 1577073239 + .word 2785258103 + + j 2f +1: + .word 3439489111 + .word 1271146583 +2: + + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + + + beqz t4, 2f + + .word 221182167 + j 1f + +.Ldec_blocks_256: + .word 221182167 + # load ciphertext into v24 + .word 33909767 + # update iv + .word 2739447927 + # reverse the iv's bits order back + .word 1258565207 +1: + .word 797838423 + slli t0, a7, 2 + sub t4, t4, a7 + add a0, a0, t0 + .word 2800987255 + .word 2799709303 + .word 2798660727 + .word 2797612151 + .word 2796563575 + .word 2795514999 + .word 2794466423 + .word 2793417847 + .word 2792369271 + .word 2791320695 + .word 2790272119 + .word 2789223543 + .word 2788174967 + .word 2787126391 + .word 2786110583 + + .word 797838423 + + # store plaintext + .word 33942567 + add a1, a1, t0 + + bnez t4, .Ldec_blocks_256 + +2: + bnez a6, 1f + ret +1: + # load second to last block's ciphertext + .word 3439489111 + .word 33909767 + addi a0, a0, 16 + + # setup `x` multiplier with byte-reversed order + # 0b00000010 => 0b01000000 (0x40) + li t0, 0x40 + .word 3439489111 + .word 1577073239 + .word 3355504727 + .word 1577241175 + + beqz a2, 1f + # slidedown third to last block + addi a7, a7, -4 + .word 3441586263 + # multiplier + .word 1057540183 + + # compute IV for last block + .word 3439489111 + .word 2739447927 + .word 1258565207 + + # compute IV for second to last block + .word 2739447927 + .word 1258565335 + j 2f +1: + # compute IV for second to last block + .word 3439489111 + .word 2739447927 + .word 1258565335 +2: + + + ## xts second to last block + .word 3439489111 + .word 797871191 + .word 2800987255 + .word 2799709303 + .word 2798660727 + .word 2797612151 + .word 2796563575 + .word 2795514999 + .word 2794466423 + .word 2793417847 + .word 2792369271 + .word 2791320695 + .word 2790272119 + .word 2789223543 + .word 2788174967 + .word 2787126391 + .word 2786110583 + + .word 797871191 + .word 1577848023 + + # load last block ciphertext + .word 134770775 + .word 33885191 + + # store second to last block plaintext + addi t0, a1, 16 + .word 33721511 + + ## xts last block + .word 3439489111 + .word 797838423 + .word 2800987255 + .word 2799709303 + .word 2798660727 + .word 2797612151 + .word 2796563575 + .word 2795514999 + .word 2794466423 + .word 2793417847 + .word 2792369271 + .word 2791320695 + .word 2790272119 + .word 2789223543 + .word 2788174967 + .word 2787126391 + .word 2786110583 + + .word 797838423 + + # store second to last block plaintext + .word 33942567 + + ret +.size aes_xts_dec_256,.-aes_xts_dec_256 diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvkb-zvkned.s b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvkb-zvkned.s new file mode 100644 index 000000000000..2d6a71e355eb --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvkb-zvkned.s @@ -0,0 +1,326 @@ +.text +.p2align 3 +.globl rv64i_zvkb_zvkned_ctr32_encrypt_blocks +.type rv64i_zvkb_zvkned_ctr32_encrypt_blocks,@function +rv64i_zvkb_zvkned_ctr32_encrypt_blocks: + beqz a2, 1f + + # Load number of rounds + lwu t0, 240(a3) + li t1, 14 + li t2, 12 + li t3, 10 + + slli t5, a2, 2 + + beq t0, t1, ctr32_encrypt_blocks_256 + beq t0, t2, ctr32_encrypt_blocks_192 + beq t0, t3, ctr32_encrypt_blocks_128 + +1: + ret + +.size rv64i_zvkb_zvkned_ctr32_encrypt_blocks,.-rv64i_zvkb_zvkned_ctr32_encrypt_blocks +.p2align 3 +ctr32_encrypt_blocks_128: + # Load all 11 round keys to v1-v11 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + # Setup mask into v0 + # The mask pattern for 4*N-th elements + # mask v0: [000100010001....] + # Note: + # We could setup the mask just for the maximum element length instead of + # the VLMAX. + li t0, 0b10001000 + .word 201356247 + .word 1577238615 + # Load IV. + # v31:[IV0, IV1, IV2, big-endian count] + .word 3439489111 + .word 34041735 + # Convert the big-endian counter into little-endian. + .word 3305271383 + .word 1240772567 + # Splat the IV to v16 + .word 221212759 + .word 1577072727 + .word 2817763447 + # Prepare the ctr pattern into v20 + # v20: [x, x, x, 0, x, x, x, 1, x, x, x, 2, ...] + .word 1342712407 + # v16:[IV0, IV1, IV2, count+0, IV0, IV1, IV2, count+1, ...] + .word 86998743 + .word 17434711 + + + ##### AES body + j 2f +1: + .word 86998743 + # Increase ctr in v16. + .word 17811543 +2: + # Load plaintext into v20 + .word 33909255 + slli t0, t4, 2 + srli t6, t4, 2 + sub t5, t5, t4 + add a0, a0, t0 + # Prepare the AES ctr input into v24. + # The ctr data uses big-endian form. + .word 1577585751 + .word 1233431639 + + .word 2786307191 + .word 2787191927 + .word 2788240503 + .word 2789289079 + .word 2790337655 + .word 2791386231 + .word 2792434807 + .word 2793483383 + .word 2794531959 + .word 2795580535 + .word 2796661879 + + # ciphertext + .word 797576279 + + # Store the ciphertext. + .word 33942567 + add a1, a1, t0 + + bnez t5, 1b + + ret +.size ctr32_encrypt_blocks_128,.-ctr32_encrypt_blocks_128 +.p2align 3 +ctr32_encrypt_blocks_192: + # Load all 13 round keys to v1-v13 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + + # Setup mask into v0 + # The mask pattern for 4*N-th elements + # mask v0: [000100010001....] + # Note: + # We could setup the mask just for the maximum element length instead of + # the VLMAX. + li t0, 0b10001000 + .word 201356247 + .word 1577238615 + # Load IV. + # v31:[IV0, IV1, IV2, big-endian count] + .word 3439489111 + .word 34041735 + # Convert the big-endian counter into little-endian. + .word 3305271383 + .word 1240772567 + # Splat the IV to v16 + .word 221212759 + .word 1577072727 + .word 2817763447 + # Prepare the ctr pattern into v20 + # v20: [x, x, x, 0, x, x, x, 1, x, x, x, 2, ...] + .word 1342712407 + # v16:[IV0, IV1, IV2, count+0, IV0, IV1, IV2, count+1, ...] + .word 86998743 + .word 17434711 + + + ##### AES body + j 2f +1: + .word 86998743 + # Increase ctr in v16. + .word 17811543 +2: + # Load plaintext into v20 + .word 33909255 + slli t0, t4, 2 + srli t6, t4, 2 + sub t5, t5, t4 + add a0, a0, t0 + # Prepare the AES ctr input into v24. + # The ctr data uses big-endian form. + .word 1577585751 + .word 1233431639 + + .word 2786307191 + .word 2787191927 + .word 2788240503 + .word 2789289079 + .word 2790337655 + .word 2791386231 + .word 2792434807 + .word 2793483383 + .word 2794531959 + .word 2795580535 + .word 2796629111 + .word 2797677687 + .word 2798759031 + + # ciphertext + .word 797576279 + + # Store the ciphertext. + .word 33942567 + add a1, a1, t0 + + bnez t5, 1b + + ret +.size ctr32_encrypt_blocks_192,.-ctr32_encrypt_blocks_192 +.p2align 3 +ctr32_encrypt_blocks_256: + # Load all 15 round keys to v1-v15 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + + # Setup mask into v0 + # The mask pattern for 4*N-th elements + # mask v0: [000100010001....] + # Note: + # We could setup the mask just for the maximum element length instead of + # the VLMAX. + li t0, 0b10001000 + .word 201356247 + .word 1577238615 + # Load IV. + # v31:[IV0, IV1, IV2, big-endian count] + .word 3439489111 + .word 34041735 + # Convert the big-endian counter into little-endian. + .word 3305271383 + .word 1240772567 + # Splat the IV to v16 + .word 221212759 + .word 1577072727 + .word 2817763447 + # Prepare the ctr pattern into v20 + # v20: [x, x, x, 0, x, x, x, 1, x, x, x, 2, ...] + .word 1342712407 + # v16:[IV0, IV1, IV2, count+0, IV0, IV1, IV2, count+1, ...] + .word 86998743 + .word 17434711 + + + ##### AES body + j 2f +1: + .word 86998743 + # Increase ctr in v16. + .word 17811543 +2: + # Load plaintext into v20 + .word 33909255 + slli t0, t4, 2 + srli t6, t4, 2 + sub t5, t5, t4 + add a0, a0, t0 + # Prepare the AES ctr input into v24. + # The ctr data uses big-endian form. + .word 1577585751 + .word 1233431639 + + .word 2786307191 + .word 2787191927 + .word 2788240503 + .word 2789289079 + .word 2790337655 + .word 2791386231 + .word 2792434807 + .word 2793483383 + .word 2794531959 + .word 2795580535 + .word 2796629111 + .word 2797677687 + .word 2798726263 + .word 2799774839 + .word 2800856183 + + # ciphertext + .word 797576279 + + # Store the ciphertext. + .word 33942567 + add a1, a1, t0 + + bnez t5, 1b + + ret +.size ctr32_encrypt_blocks_256,.-ctr32_encrypt_blocks_256 diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvkned.s b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvkned.s new file mode 100644 index 000000000000..654e2242146c --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvkned.s @@ -0,0 +1,1390 @@ +.text +.p2align 3 +.globl rv64i_zvkned_cbc_encrypt +.type rv64i_zvkned_cbc_encrypt,@function +rv64i_zvkned_cbc_encrypt: + # check whether the length is a multiple of 16 and >= 16 + li t1, 16 + blt a2, t1, L_end + andi t1, a2, 15 + bnez t1, L_end + + # Load number of rounds + lwu t2, 240(a3) + + # Get proper routine for key size + li t0, 10 + beq t2, t0, L_cbc_enc_128 + + li t0, 12 + beq t2, t0, L_cbc_enc_192 + + li t0, 14 + beq t2, t0, L_cbc_enc_256 + + ret +.size rv64i_zvkned_cbc_encrypt,.-rv64i_zvkned_cbc_encrypt +.p2align 3 +L_cbc_enc_128: + # Load all 11 round keys to v1-v11 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + + # Load IV. + .word 34039815 + + .word 33909767 + .word 797445207 + j 2f + +1: + .word 33908871 + .word 797477975 + +2: + # AES body + .word 2786307191 # with round key w[ 0, 3] + .word 2787191927 # with round key w[ 4, 7] + .word 2788240503 # with round key w[ 8,11] + .word 2789289079 # with round key w[12,15] + .word 2790337655 # with round key w[16,19] + .word 2791386231 # with round key w[20,23] + .word 2792434807 # with round key w[24,27] + .word 2793483383 # with round key w[28,31] + .word 2794531959 # with round key w[32,35] + .word 2795580535 # with round key w[36,39] + .word 2796661879 # with round key w[40,43] + + + .word 33942567 + + addi a0, a0, 16 + addi a1, a1, 16 + addi a2, a2, -16 + + bnez a2, 1b + + .word 34040871 + + ret +.size L_cbc_enc_128,.-L_cbc_enc_128 +.p2align 3 +L_cbc_enc_192: + # Load all 13 round keys to v1-v13 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + + + # Load IV. + .word 34039815 + + .word 33909767 + .word 797445207 + j 2f + +1: + .word 33908871 + .word 797477975 + +2: + # AES body + .word 2786307191 # with round key w[ 0, 3] + .word 2787191927 # with round key w[ 4, 7] + .word 2788240503 # with round key w[ 8,11] + .word 2789289079 # with round key w[12,15] + .word 2790337655 # with round key w[16,19] + .word 2791386231 # with round key w[20,23] + .word 2792434807 # with round key w[24,27] + .word 2793483383 # with round key w[28,31] + .word 2794531959 # with round key w[32,35] + .word 2795580535 # with round key w[36,39] + .word 2796629111 # with round key w[40,43] + .word 2797677687 # with round key w[44,47] + .word 2798759031 # with round key w[48,51] + + + .word 33942567 + + addi a0, a0, 16 + addi a1, a1, 16 + addi a2, a2, -16 + + bnez a2, 1b + + .word 34040871 + + ret +.size L_cbc_enc_192,.-L_cbc_enc_192 +.p2align 3 +L_cbc_enc_256: + # Load all 15 round keys to v1-v15 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + + + # Load IV. + .word 34039815 + + .word 33909767 + .word 797445207 + j 2f + +1: + .word 33908871 + .word 797477975 + +2: + # AES body + .word 2786307191 # with round key w[ 0, 3] + .word 2787191927 # with round key w[ 4, 7] + .word 2788240503 # with round key w[ 8,11] + .word 2789289079 # with round key w[12,15] + .word 2790337655 # with round key w[16,19] + .word 2791386231 # with round key w[20,23] + .word 2792434807 # with round key w[24,27] + .word 2793483383 # with round key w[28,31] + .word 2794531959 # with round key w[32,35] + .word 2795580535 # with round key w[36,39] + .word 2796629111 # with round key w[40,43] + .word 2797677687 # with round key w[44,47] + .word 2798726263 # with round key w[48,51] + .word 2799774839 # with round key w[52,55] + .word 2800856183 # with round key w[56,59] + + + .word 33942567 + + addi a0, a0, 16 + addi a1, a1, 16 + addi a2, a2, -16 + + bnez a2, 1b + + .word 34040871 + + ret +.size L_cbc_enc_256,.-L_cbc_enc_256 +.p2align 3 +.globl rv64i_zvkned_cbc_decrypt +.type rv64i_zvkned_cbc_decrypt,@function +rv64i_zvkned_cbc_decrypt: + # check whether the length is a multiple of 16 and >= 16 + li t1, 16 + blt a2, t1, L_end + andi t1, a2, 15 + bnez t1, L_end + + # Load number of rounds + lwu t2, 240(a3) + + # Get proper routine for key size + li t0, 10 + beq t2, t0, L_cbc_dec_128 + + li t0, 12 + beq t2, t0, L_cbc_dec_192 + + li t0, 14 + beq t2, t0, L_cbc_dec_256 + + ret +.size rv64i_zvkned_cbc_decrypt,.-rv64i_zvkned_cbc_decrypt +.p2align 3 +L_cbc_dec_128: + # Load all 11 round keys to v1-v11 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + + # Load IV. + .word 34039815 + + .word 33909767 + .word 1577846999 + j 2f + +1: + .word 33909767 + .word 1577846999 + addi a1, a1, 16 + +2: + # AES body + .word 2796792951 # with round key w[40,43] + .word 2795514999 # with round key w[36,39] + .word 2794466423 # with round key w[32,35] + .word 2793417847 # with round key w[28,31] + .word 2792369271 # with round key w[24,27] + .word 2791320695 # with round key w[20,23] + .word 2790272119 # with round key w[16,19] + .word 2789223543 # with round key w[12,15] + .word 2788174967 # with round key w[ 8,11] + .word 2787126391 # with round key w[ 4, 7] + .word 2786110583 # with round key w[ 0, 3] + + + .word 797445207 + .word 33942567 + .word 1577617495 + + addi a2, a2, -16 + addi a0, a0, 16 + + bnez a2, 1b + + .word 34039847 + + ret +.size L_cbc_dec_128,.-L_cbc_dec_128 +.p2align 3 +L_cbc_dec_192: + # Load all 13 round keys to v1-v13 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + + + # Load IV. + .word 34039815 + + .word 33909767 + .word 1577846999 + j 2f + +1: + .word 33909767 + .word 1577846999 + addi a1, a1, 16 + +2: + # AES body + .word 2798890103 # with round key w[48,51] + .word 2797612151 # with round key w[44,47] + .word 2796563575 # with round key w[40,43] + .word 2795514999 # with round key w[36,39] + .word 2794466423 # with round key w[32,35] + .word 2793417847 # with round key w[28,31] + .word 2792369271 # with round key w[24,27] + .word 2791320695 # with round key w[20,23] + .word 2790272119 # with round key w[16,19] + .word 2789223543 # with round key w[12,15] + .word 2788174967 # with round key w[ 8,11] + .word 2787126391 # with round key w[ 4, 7] + .word 2786110583 # with round key w[ 0, 3] + + + .word 797445207 + .word 33942567 + .word 1577617495 + + addi a2, a2, -16 + addi a0, a0, 16 + + bnez a2, 1b + + .word 34039847 + + ret +.size L_cbc_dec_192,.-L_cbc_dec_192 +.p2align 3 +L_cbc_dec_256: + # Load all 15 round keys to v1-v15 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + + + # Load IV. + .word 34039815 + + .word 33909767 + .word 1577846999 + j 2f + +1: + .word 33909767 + .word 1577846999 + addi a1, a1, 16 + +2: + # AES body + .word 2800987255 # with round key w[56,59] + .word 2799709303 # with round key w[52,55] + .word 2798660727 # with round key w[48,51] + .word 2797612151 # with round key w[44,47] + .word 2796563575 # with round key w[40,43] + .word 2795514999 # with round key w[36,39] + .word 2794466423 # with round key w[32,35] + .word 2793417847 # with round key w[28,31] + .word 2792369271 # with round key w[24,27] + .word 2791320695 # with round key w[20,23] + .word 2790272119 # with round key w[16,19] + .word 2789223543 # with round key w[12,15] + .word 2788174967 # with round key w[ 8,11] + .word 2787126391 # with round key w[ 4, 7] + .word 2786110583 # with round key w[ 0, 3] + + + .word 797445207 + .word 33942567 + .word 1577617495 + + addi a2, a2, -16 + addi a0, a0, 16 + + bnez a2, 1b + + .word 34039847 + + ret +.size L_cbc_dec_256,.-L_cbc_dec_256 +.p2align 3 +.globl rv64i_zvkned_ecb_encrypt +.type rv64i_zvkned_ecb_encrypt,@function +rv64i_zvkned_ecb_encrypt: + # Make the LEN become e32 length. + srli t3, a2, 2 + + # Load number of rounds + lwu t2, 240(a3) + + # Get proper routine for key size + li t0, 10 + beq t2, t0, L_ecb_enc_128 + + li t0, 12 + beq t2, t0, L_ecb_enc_192 + + li t0, 14 + beq t2, t0, L_ecb_enc_256 + + ret +.size rv64i_zvkned_ecb_encrypt,.-rv64i_zvkned_ecb_encrypt +.p2align 3 +L_ecb_enc_128: + # Load all 11 round keys to v1-v11 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + +1: + .word 221149271 + slli t0, a6, 2 + sub t3, t3, a6 + + .word 33909767 + + # AES body + .word 2786307191 # with round key w[ 0, 3] + .word 2787191927 # with round key w[ 4, 7] + .word 2788240503 # with round key w[ 8,11] + .word 2789289079 # with round key w[12,15] + .word 2790337655 # with round key w[16,19] + .word 2791386231 # with round key w[20,23] + .word 2792434807 # with round key w[24,27] + .word 2793483383 # with round key w[28,31] + .word 2794531959 # with round key w[32,35] + .word 2795580535 # with round key w[36,39] + .word 2796661879 # with round key w[40,43] + + + .word 33942567 + + add a0, a0, t0 + add a1, a1, t0 + + bnez t3, 1b + + ret +.size L_ecb_enc_128,.-L_ecb_enc_128 +.p2align 3 +L_ecb_enc_192: + # Load all 13 round keys to v1-v13 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + + +1: + .word 221149271 + slli t0, a6, 2 + sub t3, t3, a6 + + .word 33909767 + + # AES body + .word 2786307191 # with round key w[ 0, 3] + .word 2787191927 # with round key w[ 4, 7] + .word 2788240503 # with round key w[ 8,11] + .word 2789289079 # with round key w[12,15] + .word 2790337655 # with round key w[16,19] + .word 2791386231 # with round key w[20,23] + .word 2792434807 # with round key w[24,27] + .word 2793483383 # with round key w[28,31] + .word 2794531959 # with round key w[32,35] + .word 2795580535 # with round key w[36,39] + .word 2796629111 # with round key w[40,43] + .word 2797677687 # with round key w[44,47] + .word 2798759031 # with round key w[48,51] + + + .word 33942567 + + add a0, a0, t0 + add a1, a1, t0 + + bnez t3, 1b + + ret +.size L_ecb_enc_192,.-L_ecb_enc_192 +.p2align 3 +L_ecb_enc_256: + # Load all 15 round keys to v1-v15 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + + +1: + .word 221149271 + slli t0, a6, 2 + sub t3, t3, a6 + + .word 33909767 + + # AES body + .word 2786307191 # with round key w[ 0, 3] + .word 2787191927 # with round key w[ 4, 7] + .word 2788240503 # with round key w[ 8,11] + .word 2789289079 # with round key w[12,15] + .word 2790337655 # with round key w[16,19] + .word 2791386231 # with round key w[20,23] + .word 2792434807 # with round key w[24,27] + .word 2793483383 # with round key w[28,31] + .word 2794531959 # with round key w[32,35] + .word 2795580535 # with round key w[36,39] + .word 2796629111 # with round key w[40,43] + .word 2797677687 # with round key w[44,47] + .word 2798726263 # with round key w[48,51] + .word 2799774839 # with round key w[52,55] + .word 2800856183 # with round key w[56,59] + + + .word 33942567 + + add a0, a0, t0 + add a1, a1, t0 + + bnez t3, 1b + + ret +.size L_ecb_enc_256,.-L_ecb_enc_256 +.p2align 3 +.globl rv64i_zvkned_ecb_decrypt +.type rv64i_zvkned_ecb_decrypt,@function +rv64i_zvkned_ecb_decrypt: + # Make the LEN become e32 length. + srli t3, a2, 2 + + # Load number of rounds + lwu t2, 240(a3) + + # Get proper routine for key size + li t0, 10 + beq t2, t0, L_ecb_dec_128 + + li t0, 12 + beq t2, t0, L_ecb_dec_192 + + li t0, 14 + beq t2, t0, L_ecb_dec_256 + + ret +.size rv64i_zvkned_ecb_decrypt,.-rv64i_zvkned_ecb_decrypt +.p2align 3 +L_ecb_dec_128: + # Load all 11 round keys to v1-v11 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + +1: + .word 221149271 + slli t0, a6, 2 + sub t3, t3, a6 + + .word 33909767 + + # AES body + .word 2796792951 # with round key w[40,43] + .word 2795514999 # with round key w[36,39] + .word 2794466423 # with round key w[32,35] + .word 2793417847 # with round key w[28,31] + .word 2792369271 # with round key w[24,27] + .word 2791320695 # with round key w[20,23] + .word 2790272119 # with round key w[16,19] + .word 2789223543 # with round key w[12,15] + .word 2788174967 # with round key w[ 8,11] + .word 2787126391 # with round key w[ 4, 7] + .word 2786110583 # with round key w[ 0, 3] + + + .word 33942567 + + add a0, a0, t0 + add a1, a1, t0 + + bnez t3, 1b + + ret +.size L_ecb_dec_128,.-L_ecb_dec_128 +.p2align 3 +L_ecb_dec_192: + # Load all 13 round keys to v1-v13 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + + +1: + .word 221149271 + slli t0, a6, 2 + sub t3, t3, a6 + + .word 33909767 + + # AES body + .word 2798890103 # with round key w[48,51] + .word 2797612151 # with round key w[44,47] + .word 2796563575 # with round key w[40,43] + .word 2795514999 # with round key w[36,39] + .word 2794466423 # with round key w[32,35] + .word 2793417847 # with round key w[28,31] + .word 2792369271 # with round key w[24,27] + .word 2791320695 # with round key w[20,23] + .word 2790272119 # with round key w[16,19] + .word 2789223543 # with round key w[12,15] + .word 2788174967 # with round key w[ 8,11] + .word 2787126391 # with round key w[ 4, 7] + .word 2786110583 # with round key w[ 0, 3] + + + .word 33942567 + + add a0, a0, t0 + add a1, a1, t0 + + bnez t3, 1b + + ret +.size L_ecb_dec_192,.-L_ecb_dec_192 +.p2align 3 +L_ecb_dec_256: + # Load all 15 round keys to v1-v15 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + + +1: + .word 221149271 + slli t0, a6, 2 + sub t3, t3, a6 + + .word 33909767 + + # AES body + .word 2800987255 # with round key w[56,59] + .word 2799709303 # with round key w[52,55] + .word 2798660727 # with round key w[48,51] + .word 2797612151 # with round key w[44,47] + .word 2796563575 # with round key w[40,43] + .word 2795514999 # with round key w[36,39] + .word 2794466423 # with round key w[32,35] + .word 2793417847 # with round key w[28,31] + .word 2792369271 # with round key w[24,27] + .word 2791320695 # with round key w[20,23] + .word 2790272119 # with round key w[16,19] + .word 2789223543 # with round key w[12,15] + .word 2788174967 # with round key w[ 8,11] + .word 2787126391 # with round key w[ 4, 7] + .word 2786110583 # with round key w[ 0, 3] + + + .word 33942567 + + add a0, a0, t0 + add a1, a1, t0 + + bnez t3, 1b + + ret +.size L_ecb_dec_256,.-L_ecb_dec_256 +.p2align 3 +.globl rv64i_zvkned_set_encrypt_key +.type rv64i_zvkned_set_encrypt_key,@function +rv64i_zvkned_set_encrypt_key: + # Get proper routine for key size + li t1, 256 + beq a1, t1, L_set_key_256 + li t1, 128 + beq a1, t1, L_set_key_128 + + j L_fail_m2 + +.size rv64i_zvkned_set_encrypt_key,.-rv64i_zvkned_set_encrypt_key +.p2align 3 +.globl rv64i_zvkned_set_decrypt_key +.type rv64i_zvkned_set_decrypt_key,@function +rv64i_zvkned_set_decrypt_key: + # Get proper routine for key size + li t1, 256 + beq a1, t1, L_set_key_256 + li t1, 128 + beq a1, t1, L_set_key_128 + + j L_fail_m2 + +.size rv64i_zvkned_set_decrypt_key,.-rv64i_zvkned_set_decrypt_key +.p2align 3 +L_set_key_128: + # Store the number of rounds + li t2, 10 + sw t2, 240(a2) + + .word 0xc1027057 + + # Load the key + .word 33907975 + + # Generate keys for round 2-11 into registers v11-v20. + .word 2325784055 # v11 <- rk2 (w[ 4, 7]) + .word 2326865527 # v12 <- rk3 (w[ 8,11]) + .word 2327946999 # v13 <- rk4 (w[12,15]) + .word 2329028471 # v14 <- rk5 (w[16,19]) + .word 2330109943 # v15 <- rk6 (w[20,23]) + .word 2331191415 # v16 <- rk7 (w[24,27]) + .word 2332272887 # v17 <- rk8 (w[28,31]) + .word 2333354359 # v18 <- rk9 (w[32,35]) + .word 2334435831 # v19 <- rk10 (w[36,39]) + .word 2335517303 # v20 <- rk11 (w[40,43]) + + # Store the round keys + .word 33973543 + addi a2, a2, 16 + .word 33973671 + addi a2, a2, 16 + .word 33973799 + addi a2, a2, 16 + .word 33973927 + addi a2, a2, 16 + .word 33974055 + addi a2, a2, 16 + .word 33974183 + addi a2, a2, 16 + .word 33974311 + addi a2, a2, 16 + .word 33974439 + addi a2, a2, 16 + .word 33974567 + addi a2, a2, 16 + .word 33974695 + addi a2, a2, 16 + .word 33974823 + + li a0, 1 + ret +.size L_set_key_128,.-L_set_key_128 +.p2align 3 +L_set_key_256: + # Store the number of rounds + li t2, 14 + sw t2, 240(a2) + + .word 0xc1027057 + + # Load the key + .word 33907975 + addi a0, a0, 16 + .word 33908103 + + .word 1577387607 + .word 2863736439 + .word 1577420503 + .word 2864817911 + .word 1577453399 + .word 2865899383 + .word 1577486295 + .word 2866980855 + .word 1577519191 + .word 2868062327 + .word 1577552087 + .word 2869143799 + .word 1577584983 + .word 2870225271 + .word 1577617879 + .word 2871306743 + .word 1577650775 + .word 2872388215 + .word 1577683671 + .word 2873469687 + .word 1577716567 + .word 2874551159 + .word 1577749463 + .word 2875632631 + .word 1577782359 + .word 2876714103 + + .word 33973543 + addi a2, a2, 16 + .word 33973671 + addi a2, a2, 16 + .word 33973799 + addi a2, a2, 16 + .word 33973927 + addi a2, a2, 16 + .word 33974055 + addi a2, a2, 16 + .word 33974183 + addi a2, a2, 16 + .word 33974311 + addi a2, a2, 16 + .word 33974439 + addi a2, a2, 16 + .word 33974567 + addi a2, a2, 16 + .word 33974695 + addi a2, a2, 16 + .word 33974823 + addi a2, a2, 16 + .word 33974951 + addi a2, a2, 16 + .word 33975079 + addi a2, a2, 16 + .word 33975207 + addi a2, a2, 16 + .word 33975335 + + li a0, 1 + ret +.size L_set_key_256,.-L_set_key_256 +.p2align 3 +.globl rv64i_zvkned_encrypt +.type rv64i_zvkned_encrypt,@function +rv64i_zvkned_encrypt: + # Load number of rounds + lwu t5, 240(a2) + + # Get proper routine for key size + li t6, 14 + beq t5, t6, L_enc_256 + li t6, 10 + beq t5, t6, L_enc_128 + li t6, 12 + beq t5, t6, L_enc_192 + + j L_fail_m2 +.size rv64i_zvkned_encrypt,.-rv64i_zvkned_encrypt +.p2align 3 +L_enc_128: + .word 3439489111 + + .word 33906823 + + .word 33973511 + .word 2795741431 # with round key w[ 0, 3] + addi a2, a2, 16 + .word 33973639 + .word 2796626167 # with round key w[ 4, 7] + addi a2, a2, 16 + .word 33973767 + .word 2797674743 # with round key w[ 8,11] + addi a2, a2, 16 + .word 33973895 + .word 2798723319 # with round key w[12,15] + addi a2, a2, 16 + .word 33974023 + .word 2799771895 # with round key w[16,19] + addi a2, a2, 16 + .word 33974151 + .word 2800820471 # with round key w[20,23] + addi a2, a2, 16 + .word 33974279 + .word 2801869047 # with round key w[24,27] + addi a2, a2, 16 + .word 33974407 + .word 2802917623 # with round key w[28,31] + addi a2, a2, 16 + .word 33974535 + .word 2803966199 # with round key w[32,35] + addi a2, a2, 16 + .word 33974663 + .word 2805014775 # with round key w[36,39] + addi a2, a2, 16 + .word 33974791 + .word 2806096119 # with round key w[40,43] + + .word 33939623 + + ret +.size L_enc_128,.-L_enc_128 +.p2align 3 +L_enc_192: + .word 3439489111 + + .word 33906823 + + .word 33973511 + .word 2795741431 # with round key w[ 0, 3] + addi a2, a2, 16 + .word 33973639 + .word 2796626167 + addi a2, a2, 16 + .word 33973767 + .word 2797674743 + addi a2, a2, 16 + .word 33973895 + .word 2798723319 + addi a2, a2, 16 + .word 33974023 + .word 2799771895 + addi a2, a2, 16 + .word 33974151 + .word 2800820471 + addi a2, a2, 16 + .word 33974279 + .word 2801869047 + addi a2, a2, 16 + .word 33974407 + .word 2802917623 + addi a2, a2, 16 + .word 33974535 + .word 2803966199 + addi a2, a2, 16 + .word 33974663 + .word 2805014775 + addi a2, a2, 16 + .word 33974791 + .word 2806063351 + addi a2, a2, 16 + .word 33974919 + .word 2807111927 + addi a2, a2, 16 + .word 33975047 + .word 2808193271 + + .word 33939623 + ret +.size L_enc_192,.-L_enc_192 +.p2align 3 +L_enc_256: + .word 3439489111 + + .word 33906823 + + .word 33973511 + .word 2795741431 # with round key w[ 0, 3] + addi a2, a2, 16 + .word 33973639 + .word 2796626167 + addi a2, a2, 16 + .word 33973767 + .word 2797674743 + addi a2, a2, 16 + .word 33973895 + .word 2798723319 + addi a2, a2, 16 + .word 33974023 + .word 2799771895 + addi a2, a2, 16 + .word 33974151 + .word 2800820471 + addi a2, a2, 16 + .word 33974279 + .word 2801869047 + addi a2, a2, 16 + .word 33974407 + .word 2802917623 + addi a2, a2, 16 + .word 33974535 + .word 2803966199 + addi a2, a2, 16 + .word 33974663 + .word 2805014775 + addi a2, a2, 16 + .word 33974791 + .word 2806063351 + addi a2, a2, 16 + .word 33974919 + .word 2807111927 + addi a2, a2, 16 + .word 33975047 + .word 2808160503 + addi a2, a2, 16 + .word 33975175 + .word 2809209079 + addi a2, a2, 16 + .word 33975303 + .word 2810290423 + + .word 33939623 + ret +.size L_enc_256,.-L_enc_256 +.p2align 3 +.globl rv64i_zvkned_decrypt +.type rv64i_zvkned_decrypt,@function +rv64i_zvkned_decrypt: + # Load number of rounds + lwu t5, 240(a2) + + # Get proper routine for key size + li t6, 14 + beq t5, t6, L_dec_256 + li t6, 10 + beq t5, t6, L_dec_128 + li t6, 12 + beq t5, t6, L_dec_192 + + j L_fail_m2 +.size rv64i_zvkned_decrypt,.-rv64i_zvkned_decrypt +.p2align 3 +L_dec_128: + .word 3439489111 + + .word 33906823 + + addi a2, a2, 160 + .word 33974791 + .word 2806227191 # with round key w[40,43] + addi a2, a2, -16 + .word 33974663 + .word 2804949239 # with round key w[36,39] + addi a2, a2, -16 + .word 33974535 + .word 2803900663 # with round key w[32,35] + addi a2, a2, -16 + .word 33974407 + .word 2802852087 # with round key w[28,31] + addi a2, a2, -16 + .word 33974279 + .word 2801803511 # with round key w[24,27] + addi a2, a2, -16 + .word 33974151 + .word 2800754935 # with round key w[20,23] + addi a2, a2, -16 + .word 33974023 + .word 2799706359 # with round key w[16,19] + addi a2, a2, -16 + .word 33973895 + .word 2798657783 # with round key w[12,15] + addi a2, a2, -16 + .word 33973767 + .word 2797609207 # with round key w[ 8,11] + addi a2, a2, -16 + .word 33973639 + .word 2796560631 # with round key w[ 4, 7] + addi a2, a2, -16 + .word 33973511 + .word 2795544823 # with round key w[ 0, 3] + + .word 33939623 + + ret +.size L_dec_128,.-L_dec_128 +.p2align 3 +L_dec_192: + .word 3439489111 + + .word 33906823 + + addi a2, a2, 192 + .word 33975047 + .word 2808324343 # with round key w[48,51] + addi a2, a2, -16 + .word 33974919 + .word 2807046391 # with round key w[44,47] + addi a2, a2, -16 + .word 33974791 + .word 2805997815 # with round key w[40,43] + addi a2, a2, -16 + .word 33974663 + .word 2804949239 # with round key w[36,39] + addi a2, a2, -16 + .word 33974535 + .word 2803900663 # with round key w[32,35] + addi a2, a2, -16 + .word 33974407 + .word 2802852087 # with round key w[28,31] + addi a2, a2, -16 + .word 33974279 + .word 2801803511 # with round key w[24,27] + addi a2, a2, -16 + .word 33974151 + .word 2800754935 # with round key w[20,23] + addi a2, a2, -16 + .word 33974023 + .word 2799706359 # with round key w[16,19] + addi a2, a2, -16 + .word 33973895 + .word 2798657783 # with round key w[12,15] + addi a2, a2, -16 + .word 33973767 + .word 2797609207 # with round key w[ 8,11] + addi a2, a2, -16 + .word 33973639 + .word 2796560631 # with round key w[ 4, 7] + addi a2, a2, -16 + .word 33973511 + .word 2795544823 # with round key w[ 0, 3] + + .word 33939623 + + ret +.size L_dec_192,.-L_dec_192 +.p2align 3 +L_dec_256: + .word 3439489111 + + .word 33906823 + + addi a2, a2, 224 + .word 33975303 + .word 2810421495 # with round key w[56,59] + addi a2, a2, -16 + .word 33975175 + .word 2809143543 # with round key w[52,55] + addi a2, a2, -16 + .word 33975047 + .word 2808094967 # with round key w[48,51] + addi a2, a2, -16 + .word 33974919 + .word 2807046391 # with round key w[44,47] + addi a2, a2, -16 + .word 33974791 + .word 2805997815 # with round key w[40,43] + addi a2, a2, -16 + .word 33974663 + .word 2804949239 # with round key w[36,39] + addi a2, a2, -16 + .word 33974535 + .word 2803900663 # with round key w[32,35] + addi a2, a2, -16 + .word 33974407 + .word 2802852087 # with round key w[28,31] + addi a2, a2, -16 + .word 33974279 + .word 2801803511 # with round key w[24,27] + addi a2, a2, -16 + .word 33974151 + .word 2800754935 # with round key w[20,23] + addi a2, a2, -16 + .word 33974023 + .word 2799706359 # with round key w[16,19] + addi a2, a2, -16 + .word 33973895 + .word 2798657783 # with round key w[12,15] + addi a2, a2, -16 + .word 33973767 + .word 2797609207 # with round key w[ 8,11] + addi a2, a2, -16 + .word 33973639 + .word 2796560631 # with round key w[ 4, 7] + addi a2, a2, -16 + .word 33973511 + .word 2795544823 # with round key w[ 0, 3] + + .word 33939623 + + ret +.size L_dec_256,.-L_dec_256 +L_fail_m2: + li a0, -2 + ret +.size L_fail_m2,.-L_fail_m2 + +L_end: + ret +.size L_end,.-L_end diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64.s b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64.s new file mode 100644 index 000000000000..4901849dff58 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64.s @@ -0,0 +1,1871 @@ +.text +.balign 16 +.globl AES_encrypt +.type AES_encrypt,@function +AES_encrypt: + addi sp,sp,-96 + sd x8,88(sp) + sd x9,80(sp) + sd x18,72(sp) + sd x19,64(sp) + sd x20,56(sp) + sd x21,48(sp) + sd x22,40(sp) + sd x23,32(sp) + sd x24,24(sp) + sd x25,16(sp) + sd x26,8(sp) + sd x27,0(sp) + + # Load input to block cipher + ld x6,0(x10) + ld x8,8(x10) + + + # Load key + ld x13,0(x12) + ld x15,8(x12) + + + # Load number of rounds + lwu x30,240(x12) + + # Load address of substitution table and wrap-around mask + la x31,AES_Te0 + li x5,~0xFFF + + # y = n xor k, stored in Q0-Q3 + + xor x6,x6,x13 + xor x8,x8,x15 + srli x7,x6,32 + srli x9,x8,32 + + # The main loop only executes the first N-1 rounds. + add x30,x30,-1 + + # Do Nr - 1 rounds (final round is special) + +1: + + slli x13,x6,0+2 + slli x14,x7,0+2 + slli x15,x8,0+2 + slli x16,x9,0+2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x17,0(x29) + add x29,x31,x14 + lwu x18,0(x29) + add x29,x31,x15 + lwu x19,0(x29) + add x29,x31,x16 + lwu x20,0(x29) + + add x31,x31,1024 + + srli x13,x7,8-2 + srli x14,x8,8-2 + srli x15,x9,8-2 + srli x16,x6,8-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x21,0(x29) + add x29,x31,x14 + lwu x22,0(x29) + add x29,x31,x15 + lwu x23,0(x29) + add x29,x31,x16 + lwu x24,0(x29) + + add x31,x31,1024 + + srli x13,x8,16-2 + srli x14,x9,16-2 + srli x15,x6,16-2 + srli x16,x7,16-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x25,0(x29) + add x29,x31,x14 + lwu x26,0(x29) + add x29,x31,x15 + lwu x27,0(x29) + add x29,x31,x16 + lwu x28,0(x29) + + add x31,x31,1024 + + srli x13,x9,24-2 + srli x14,x6,24-2 + srli x15,x7,24-2 + srli x16,x8,24-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x13,0(x29) + add x29,x31,x14 + lwu x14,0(x29) + add x29,x31,x15 + lwu x15,0(x29) + add x29,x31,x16 + lwu x16,0(x29) + + + # Combine table lookups + xor x17,x17,x21 + xor x18,x18,x22 + xor x19,x19,x23 + xor x20,x20,x24 + + xor x17,x17,x25 + xor x18,x18,x26 + xor x19,x19,x27 + xor x20,x20,x28 + + xor x13,x13,x17 + xor x14,x14,x18 + xor x15,x15,x19 + xor x16,x16,x20 + + # Update key ptr to point to next key in schedule + add x12,x12,16 + + # Grab next key in schedule + ld x17,0(x12) + ld x19,8(x12) + + # Round TBL back to 4k boundary + and x31,x31,x5 + + add x30,x30,-1 + + xor x6,x13,x17 + xor x8,x15,x19 + srli x18,x17,32 + xor x7,x14,x18 + srli x20,x19,32 + xor x9,x16,x20 + + bgtz x30,1b + +#================================FINAL ROUND==================================== + +# In the final round, all lookup table accesses would appear as follows: +# +# ... compute index I0 +# add I0,TBL,T0 +# lbu T0,1(I0) +# +# Instead of indexing with a 1 offset, we can add 1 to the TBL pointer, and use +# a 0 offset when indexing in the following code. This enables some instruction +# fusion opportunities. + + add x31,x31,1 + + ld x30,16(x12) + ld x12,24(x12) + + slli x13,x6,0+2 + slli x14,x7,0+2 + slli x15,x8,0+2 + slli x16,x9,0+2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lbu x17,0(x29) + add x29,x31,x14 + lbu x18,0(x29) + add x29,x31,x15 + lbu x19,0(x29) + add x29,x31,x16 + lbu x20,0(x29) + + + srli x13,x7,8-2 + srli x14,x8,8-2 + srli x15,x9,8-2 + srli x16,x6,8-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lbu x21,0(x29) + add x29,x31,x14 + lbu x22,0(x29) + add x29,x31,x15 + lbu x23,0(x29) + add x29,x31,x16 + lbu x24,0(x29) + + + srli x13,x8,16-2 + srli x14,x9,16-2 + srli x15,x6,16-2 + srli x16,x7,16-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lbu x25,0(x29) + add x29,x31,x14 + lbu x26,0(x29) + add x29,x31,x15 + lbu x27,0(x29) + add x29,x31,x16 + lbu x28,0(x29) + + + srli x13,x9,24-2 + srli x14,x6,24-2 + srli x15,x7,24-2 + srli x16,x8,24-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lbu x13,0(x29) + add x29,x31,x14 + lbu x14,0(x29) + add x29,x31,x15 + lbu x15,0(x29) + add x29,x31,x16 + lbu x16,0(x29) + + + # Combine table lookups into T0 and T2 + + slli x18,x18,32 + slli x20,x20,32 + slli x21,x21,8 + slli x22,x22,8+32 + slli x23,x23,8 + slli x24,x24,8+32 + slli x25,x25,16 + slli x26,x26,16+32 + slli x27,x27,16 + slli x28,x28,16+32 + + slli x13,x13,24 + slli x14,x14,24+32 + slli x15,x15,24 + slli x16,x16,24+32 + + xor x17,x17,x13 + xor x18,x18,x14 + xor x19,x19,x15 + xor x20,x20,x16 + + xor x21,x21,x25 + xor x22,x22,x26 + xor x23,x23,x27 + xor x24,x24,x28 + + xor x13,x17,x21 + xor x14,x18,x22 + xor x15,x19,x23 + xor x16,x20,x24 + + + xor x13,x13,x14 + # T0 = [T1 T13 T9 T5 T0 T12 T8 T4] + xor x13,x13,x30 # XOR in key + + xor x15,x15,x16 + # T2 = [T3 T15 T11 T7 T2 T14 T10 T6] + xor x15,x15,x12 # XOR in key + + sd x13,0(x11) + sd x15,8(x11) + + # Pop registers and return +2: + ld x8,88(sp) + ld x9,80(sp) + ld x18,72(sp) + ld x19,64(sp) + ld x20,56(sp) + ld x21,48(sp) + ld x22,40(sp) + ld x23,32(sp) + ld x24,24(sp) + ld x25,16(sp) + ld x26,8(sp) + ld x27,0(sp) + addi sp,sp,96 + ret +.text +.balign 16 +.globl AES_decrypt +.type AES_decrypt,@function +AES_decrypt: + addi sp,sp,-96 + sd x8,88(sp) + sd x9,80(sp) + sd x18,72(sp) + sd x19,64(sp) + sd x20,56(sp) + sd x21,48(sp) + sd x22,40(sp) + sd x23,32(sp) + sd x24,24(sp) + sd x25,16(sp) + sd x26,8(sp) + sd x27,0(sp) + + # Load input to block cipher + ld x6,0(x10) + ld x8,8(x10) + + # Load key + # Note that key is assumed in BE byte order + # (This routine was written against a key scheduling implementation that + # placed keys in BE byte order.) + ld x13,0(x12) + ld x15,8(x12) + + # Load number of rounds + lwu x30,240(x12) + + # Load address of substitution table and wrap-around mask + la x31,AES_Td0 + li x5,~0xFFF + + xor x6,x6,x13 + xor x8,x8,x15 + srli x7,x6,32 + srli x9,x8,32 + + # The main loop only executes the first N-1 rounds. + add x30,x30,-1 + + # Do Nr - 1 rounds (final round is special) +1: + + slli x13,x6,0+2 + slli x14,x7,0+2 + slli x15,x8,0+2 + slli x16,x9,0+2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x17,0(x29) + add x29,x31,x14 + lwu x18,0(x29) + add x29,x31,x15 + lwu x19,0(x29) + add x29,x31,x16 + lwu x20,0(x29) + + add x31,x31,1024 + + srli x13,x9,8-2 + srli x14,x6,8-2 + srli x15,x7,8-2 + srli x16,x8,8-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x21,0(x29) + add x29,x31,x14 + lwu x22,0(x29) + add x29,x31,x15 + lwu x23,0(x29) + add x29,x31,x16 + lwu x24,0(x29) + + add x31,x31,1024 + + srli x13,x8,16-2 + srli x14,x9,16-2 + srli x15,x6,16-2 + srli x16,x7,16-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x25,0(x29) + add x29,x31,x14 + lwu x26,0(x29) + add x29,x31,x15 + lwu x27,0(x29) + add x29,x31,x16 + lwu x28,0(x29) + + add x31,x31,1024 + + srli x13,x7,24-2 + srli x14,x8,24-2 + srli x15,x9,24-2 + srli x16,x6,24-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table. + add x29,x31,x13 + lwu x13,0(x29) + add x29,x31,x14 + lwu x14,0(x29) + add x29,x31,x15 + lwu x15,0(x29) + add x29,x31,x16 + lwu x16,0(x29) + + xor x17,x17,x21 + xor x18,x18,x22 + xor x19,x19,x23 + xor x20,x20,x24 + + xor x17,x17,x25 + xor x18,x18,x26 + xor x19,x19,x27 + xor x20,x20,x28 + + xor x13,x13,x17 + xor x14,x14,x18 + xor x15,x15,x19 + xor x16,x16,x20 + + # Update key ptr to point to next key in schedule + add x12,x12,16 + + # Grab next key in schedule + ld x17,0(x12) + ld x19,8(x12) + + # Round TBL back to 4k boundary + and x31,x31,x5 + + add x30,x30,-1 + + xor x6,x13,x17 + xor x8,x15,x19 + srli x18,x17,32 + xor x7,x14,x18 + srli x20,x19,32 + xor x9,x16,x20 + + bgtz x30,1b + +#================================FINAL ROUND==================================== + + la x31,AES_Td4 + + # K0,K1 are aliases for loopcntr,KEYP + # As these registers will no longer be used after these loads, reuse them + # to store the final key in the schedule. + ld x30,16(x12) + ld x12,24(x12) + srli x14,x9,8 + srli x15,x8,16 + srli x16,x7,24 + + andi x13,x6,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + add x29,x31,x13 + lbu x17,0(x29) + add x29,x31,x14 + lbu x18,0(x29) + add x29,x31,x15 + lbu x19,0(x29) + add x29,x31,x16 + lbu x20,0(x29) + + srli x14,x6,8 + srli x15,x9,16 + srli x16,x8,24 + + andi x13,x7,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + add x29,x31,x13 + lbu x21,0(x29) + add x29,x31,x14 + lbu x22,0(x29) + add x29,x31,x15 + lbu x23,0(x29) + add x29,x31,x16 + lbu x24,0(x29) + + srli x14,x7,8 + srli x15,x6,16 + srli x16,x9,24 + + andi x13,x8,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + add x29,x31,x13 + lbu x25,0(x29) + add x29,x31,x14 + lbu x26,0(x29) + add x29,x31,x15 + lbu x27,0(x29) + add x29,x31,x16 + lbu x28,0(x29) + + srli x14,x8,8 + srli x15,x7,16 + srli x16,x6,24 + + andi x13,x9,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + add x29,x31,x13 + lbu x13,0(x29) + add x29,x31,x14 + lbu x14,0(x29) + add x29,x31,x15 + lbu x15,0(x29) + add x29,x31,x16 + lbu x16,0(x29) + + + # T0-T15 now contain the decrypted block, minus xoring with the final round + # key. We pack T0-T15 into the two 64-bit registers T0 and T4, then xor + # in the key and store. + + slli x18,x18,8 + slli x19,x19,16 + slli x20,x20,24 + slli x21,x21,32 + slli x22,x22,8+32 + slli x23,x23,16+32 + slli x24,x24,32+24 + slli x26,x26,8 + slli x27,x27,16 + slli x28,x28,24 + slli x13,x13,32 + slli x14,x14,8+32 + slli x15,x15,16+32 + slli x16,x16,24+32 + + xor x17,x17,x18 + xor x19,x19,x20 + xor x21,x21,x22 + xor x23,x23,x24 + + xor x25,x25,x26 + xor x27,x27,x28 + xor x13,x13,x14 + xor x15,x15,x16 + + xor x17,x17,x19 + xor x21,x21,x23 + xor x25,x25,x27 + xor x13,x13,x15 + + xor x17,x17,x21 + # T4 = [T11 T10 T9 T8 T7 T6 T5 T4] + xor x17,x17,x30 # xor in key + + xor x13,x13,x25 + # T0 = [T3 T2 T1 T0 T15 T14 T13 T12] + xor x13,x13,x12 # xor in key + + sd x17,0(x11) + sd x13,8(x11) + + # Pop registers and return + ld x8,88(sp) + ld x9,80(sp) + ld x18,72(sp) + ld x19,64(sp) + ld x20,56(sp) + ld x21,48(sp) + ld x22,40(sp) + ld x23,32(sp) + ld x24,24(sp) + ld x25,16(sp) + ld x26,8(sp) + ld x27,0(sp) + addi sp,sp,96 + ret +.text +.balign 16 +.globl AES_set_encrypt_key +.type AES_set_encrypt_key,@function +AES_set_encrypt_key: + addi sp,sp,-48 + sd x8,32(sp) + sd x9,24(sp) + sd x18,16(sp) + sd x19,8(sp) + sd x20,0(sp) + beqz x10,1f # if (!userKey || !key) return -1; + beqz x12,1f + j 2f +1: + li a0,-1 + ret +2: + la x9,AES_rcon + la x20,AES_Te0 + li x28,128 + li x29,192 + li x30,256 + + # Determine number of rounds from key size in bits + bne x11,x28,1f + li x13,10 # key->rounds = 10 if bits == 128 + j 3f +1: + bne x11,x29,2f + li x13,12 # key->rounds = 12 if bits == 192 + j 3f +2: + li x13,14 # key->rounds = 14 if bits == 256 + beq x11,x30,3f + li a0,-2 # If bits != 128, 192, or 256, return -2 + j 5f +3: + ld x6,0(x10) + ld x8,8(x10) + + sw x13,240(x12) + + li x19,0 # == i*4 + + srli x7,x6,32 + srli x13,x8,32 + + sd x6,0(x12) + sd x8,8(x12) + + # if bits == 128 + # jump into loop + beq x11,x28,1f + + ld x14,16(x10) + srli x15,x14,32 + sd x14,16(x12) + + # if bits == 192 + # jump into loop + beq x11,x29,2f + + ld x16,24(x10) + srli x17,x16,32 + sd x16,24(x12) + + # bits == 256 + j 3f +1: + addi x12,x12,16 +1: + + # Round TBL back to 4k boundary + srli x20,x20,12 + slli x20,x20,12 + + # Offset by 1 byte, since Te0[x] = S[x].[03, 01, 01, 02] + # So that, later on, a 0-offset lbu yields S[x].01 == S[x] + addi x20,x20,1 + srli x14,x13,8-2 + srli x15,x13,16-2 + srli x16,x13,24-2 + slli x17,x13,2-0 + + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + andi x17,x17,0x3FC + + # Index into tables Te0-Te3 (spread access across tables to help bring + # them into cache for later) + + add x18,x20,x14 + lbu x14,0(x18) + + add x20,x20,1025 # yes, 1025 + add x18,x20,x15 + lbu x15,0(x18) + + add x20,x20,1025 + add x18,x20,x16 + lbu x16,0(x18) + + add x20,x20,1022 + add x18,x20,x17 + lbu x17,0(x18) + + slli x15,x15,8 + slli x16,x16,16 + slli x17,x17,24 + + xor x14,x14,x15 + xor x16,x16,x17 + xor x14,x14,x16 + add x15,x9,x19 # rcon[i] (i increments by 4 so it can double as + # a word offset) + lwu x15,0(x15) + + addi x19,x19,4 + li x18,10*4 + + xor x6,x6,x14 + xor x6,x6,x15 + xor x7,x7,x6 + xor x8,x8,x7 + xor x13,x13,x8 + + sw x6,0(x12) + sw x7,4(x12) + sw x8,8(x12) + sw x13,12(x12) + + addi x12,x12,16 + + + bne x19,x18,1b + j 4f +2: + addi x12,x12,24 +2: + + # Round TBL back to 4k boundary + srli x20,x20,12 + slli x20,x20,12 + + # Offset by 1 byte, since Te0[x] = S[x].[03, 01, 01, 02] + # So that, later on, a 0-offset lbu yields S[x].01 == S[x] + addi x20,x20,1 + srli x16,x15,8-2 + srli x17,x15,16-2 + srli x28,x15,24-2 + slli x29,x15,2-0 + + andi x16,x16,0x3FC + andi x17,x17,0x3FC + andi x28,x28,0x3FC + andi x29,x29,0x3FC + + # Index into tables Te0-Te3 (spread access across tables to help bring + # them into cache for later) + + add x18,x20,x16 + lbu x16,0(x18) + + add x20,x20,1025 # yes, 1025 + add x18,x20,x17 + lbu x17,0(x18) + + add x20,x20,1025 + add x18,x20,x28 + lbu x28,0(x18) + + add x20,x20,1022 + add x18,x20,x29 + lbu x29,0(x18) + + slli x17,x17,8 + slli x28,x28,16 + slli x29,x29,24 + + xor x16,x16,x17 + xor x28,x28,x29 + xor x16,x16,x28 + add x17,x9,x19 # rcon[i] (i increments by 4 so it can double as + # a word offset) + lwu x17,0(x17) + + addi x19,x19,4 + li x18,8*4 + + xor x6,x6,x16 + xor x6,x6,x17 + xor x7,x7,x6 + xor x8,x8,x7 + xor x13,x13,x8 + + sw x6,0(x12) + sw x7,4(x12) + sw x8,8(x12) + sw x13,12(x12) + + beq x19,x18,4f + + xor x14,x14,x13 + xor x15,x15,x14 + sw x14,16(x12) + sw x15,20(x12) + + addi x12,x12,24 + j 2b +3: + addi x12,x12,32 +3: + + # Round TBL back to 4k boundary + srli x20,x20,12 + slli x20,x20,12 + + # Offset by 1 byte, since Te0[x] = S[x].[03, 01, 01, 02] + # So that, later on, a 0-offset lbu yields S[x].01 == S[x] + addi x20,x20,1 + srli x28,x17,8-2 + srli x29,x17,16-2 + srli x30,x17,24-2 + slli x31,x17,2-0 + + andi x28,x28,0x3FC + andi x29,x29,0x3FC + andi x30,x30,0x3FC + andi x31,x31,0x3FC + + # Index into tables Te0-Te3 (spread access across tables to help bring + # them into cache for later) + + add x18,x20,x28 + lbu x28,0(x18) + + add x20,x20,1025 # yes, 1025 + add x18,x20,x29 + lbu x29,0(x18) + + add x20,x20,1025 + add x18,x20,x30 + lbu x30,0(x18) + + add x20,x20,1022 + add x18,x20,x31 + lbu x31,0(x18) + + slli x29,x29,8 + slli x30,x30,16 + slli x31,x31,24 + + xor x28,x28,x29 + xor x30,x30,x31 + xor x28,x28,x30 + add x29,x9,x19 # rcon[i] (i increments by 4 so it can double as + # a word offset) + lwu x29,0(x29) + + addi x19,x19,4 + li x18,7*4 + + xor x6,x6,x28 + xor x6,x6,x29 + xor x7,x7,x6 + xor x8,x8,x7 + xor x13,x13,x8 + + sw x6,0(x12) + sw x7,4(x12) + sw x8,8(x12) + sw x13,12(x12) + + beq x19,x18,4f + + # Round TBL back to 4k boundary + srli x20,x20,12 + slli x20,x20,12 + + # Offset by 1 byte, since Te0[x] = S[x].[03, 01, 01, 02] + # So that, later on, a 0-offset lbu yields S[x].01 == S[x] + addi x20,x20,1 + slli x28,x13,2-0 + srli x29,x13,8-2 + srli x30,x13,16-2 + srli x31,x13,24-2 + + andi x28,x28,0x3FC + andi x29,x29,0x3FC + andi x30,x30,0x3FC + andi x31,x31,0x3FC + + # Index into tables Te0-Te3 (spread access across tables to help bring + # them into cache for later) + + add x18,x20,x28 + lbu x28,0(x18) + + add x20,x20,1025 # yes, 1025 + add x18,x20,x29 + lbu x29,0(x18) + + add x20,x20,1025 + add x18,x20,x30 + lbu x30,0(x18) + + add x20,x20,1022 + add x18,x20,x31 + lbu x31,0(x18) + + slli x29,x29,8 + slli x30,x30,16 + slli x31,x31,24 + + xor x28,x28,x29 + xor x30,x30,x31 + xor x28,x28,x30 + xor x14,x14,x28 + xor x15,x15,x14 + xor x16,x16,x15 + xor x17,x17,x16 + sw x14,16(x12) + sw x15,20(x12) + sw x16,24(x12) + sw x17,28(x12) + + addi x12,x12,32 + j 3b + +4: # return 0 + li a0,0 +5: # return a0 + ld x8,32(sp) + ld x9,24(sp) + ld x18,16(sp) + ld x19,8(sp) + ld x20,0(sp) + addi sp,sp,48 + ret +.text +.balign 16 +.globl AES_set_decrypt_key +.type AES_set_decrypt_key,@function +AES_set_decrypt_key: + # Call AES_set_encrypt_key first + addi sp,sp,-16 + sd x12,0(sp) # We need to hold onto this! + sd ra,8(sp) + jal ra,AES_set_encrypt_key + ld x12,0(sp) + ld ra,8(sp) + addi sp,sp,16 + bgez a0,1f # If error, return error + ret +1: + addi sp,sp,-48 + sd x8,40(sp) + sd x9,32(sp) + sd x18,24(sp) + sd x19,16(sp) + sd x20,8(sp) + sd x21,0(sp) + + li x13,0 + lwu x17,240(x12) + slli x14,x17,4 + # Invert order of round keys +1: + add x19,x12,x13 + ld x6,0(x19) + ld x7,8(x19) + add x18,x12,x14 + ld x8,0(x18) + ld x9,8(x18) + addi x13,x13,16 + addi x14,x14,-16 + sd x6,0(x18) + sd x7,8(x18) + sd x8,0(x19) + sd x9,8(x19) + blt x13,x14,1b + + li x20,1 + +1: + addi x12,x12,16 + lwu x6,0(x12) + lwu x7,4(x12) + lwu x8,8(x12) + lwu x9,12(x12) + + la x21,AES_Te2 + + slli x13,x6,2 + srli x14,x6,8-2 + srli x15,x6,16-2 + srli x16,x6,24-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table Te2 + + add x19,x21,x13 + lwu x13,0(x19) + + add x19,x21,x14 + lwu x14,0(x19) + + add x19,x21,x15 + lwu x15,0(x19) + + add x19,x21,x16 + lwu x16,0(x19) + + andi x13,x13,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + slli x13,x13,2 + slli x14,x14,2 + slli x15,x15,2 + slli x16,x16,2 + + la x21,AES_Td0 + + # Lookup in Td0-Td3 + + add x19,x21,x13 + lwu x13,0(x19) + + add x21,x21,1024 + add x19,x21,x14 + lwu x14,0(x19) + + add x21,x21,1024 + add x19,x21,x15 + lwu x15,0(x19) + + add x21,x21,1024 + add x19,x21,x16 + lwu x16,0(x19) + + xor x13,x13,x14 + xor x15,x15,x16 + xor x6,x13,x15 + + la x21,AES_Te2 + + slli x13,x7,2 + srli x14,x7,8-2 + srli x15,x7,16-2 + srli x16,x7,24-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table Te2 + + add x19,x21,x13 + lwu x13,0(x19) + + add x19,x21,x14 + lwu x14,0(x19) + + add x19,x21,x15 + lwu x15,0(x19) + + add x19,x21,x16 + lwu x16,0(x19) + + andi x13,x13,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + slli x13,x13,2 + slli x14,x14,2 + slli x15,x15,2 + slli x16,x16,2 + + la x21,AES_Td0 + + # Lookup in Td0-Td3 + + add x19,x21,x13 + lwu x13,0(x19) + + add x21,x21,1024 + add x19,x21,x14 + lwu x14,0(x19) + + add x21,x21,1024 + add x19,x21,x15 + lwu x15,0(x19) + + add x21,x21,1024 + add x19,x21,x16 + lwu x16,0(x19) + + xor x13,x13,x14 + xor x15,x15,x16 + xor x7,x13,x15 + + la x21,AES_Te2 + + slli x13,x8,2 + srli x14,x8,8-2 + srli x15,x8,16-2 + srli x16,x8,24-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table Te2 + + add x19,x21,x13 + lwu x13,0(x19) + + add x19,x21,x14 + lwu x14,0(x19) + + add x19,x21,x15 + lwu x15,0(x19) + + add x19,x21,x16 + lwu x16,0(x19) + + andi x13,x13,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + slli x13,x13,2 + slli x14,x14,2 + slli x15,x15,2 + slli x16,x16,2 + + la x21,AES_Td0 + + # Lookup in Td0-Td3 + + add x19,x21,x13 + lwu x13,0(x19) + + add x21,x21,1024 + add x19,x21,x14 + lwu x14,0(x19) + + add x21,x21,1024 + add x19,x21,x15 + lwu x15,0(x19) + + add x21,x21,1024 + add x19,x21,x16 + lwu x16,0(x19) + + xor x13,x13,x14 + xor x15,x15,x16 + xor x8,x13,x15 + + la x21,AES_Te2 + + slli x13,x9,2 + srli x14,x9,8-2 + srli x15,x9,16-2 + srli x16,x9,24-2 + + andi x13,x13,0x3FC + andi x14,x14,0x3FC + andi x15,x15,0x3FC + andi x16,x16,0x3FC + + # Index into table Te2 + + add x19,x21,x13 + lwu x13,0(x19) + + add x19,x21,x14 + lwu x14,0(x19) + + add x19,x21,x15 + lwu x15,0(x19) + + add x19,x21,x16 + lwu x16,0(x19) + + andi x13,x13,0xFF + andi x14,x14,0xFF + andi x15,x15,0xFF + andi x16,x16,0xFF + + slli x13,x13,2 + slli x14,x14,2 + slli x15,x15,2 + slli x16,x16,2 + + la x21,AES_Td0 + + # Lookup in Td0-Td3 + + add x19,x21,x13 + lwu x13,0(x19) + + add x21,x21,1024 + add x19,x21,x14 + lwu x14,0(x19) + + add x21,x21,1024 + add x19,x21,x15 + lwu x15,0(x19) + + add x21,x21,1024 + add x19,x21,x16 + lwu x16,0(x19) + + xor x13,x13,x14 + xor x15,x15,x16 + xor x9,x13,x15 + sw x6,0(x12) + sw x7,4(x12) + sw x8,8(x12) + sw x9,12(x12) + addi x20,x20,1 + blt x20,x17,1b + ld x8,40(sp) + ld x9,32(sp) + ld x18,24(sp) + ld x19,16(sp) + ld x20,8(sp) + ld x21,0(sp) + addi sp,sp,48 + li a0,0 + ret + +.section .rodata +.p2align 12 +.type AES_Te0,@object +AES_Te0: +.word 0xa56363c6U, 0x847c7cf8U, 0x997777eeU, 0x8d7b7bf6U +.word 0x0df2f2ffU, 0xbd6b6bd6U, 0xb16f6fdeU, 0x54c5c591U +.word 0x50303060U, 0x03010102U, 0xa96767ceU, 0x7d2b2b56U +.word 0x19fefee7U, 0x62d7d7b5U, 0xe6abab4dU, 0x9a7676ecU +.word 0x45caca8fU, 0x9d82821fU, 0x40c9c989U, 0x877d7dfaU +.word 0x15fafaefU, 0xeb5959b2U, 0xc947478eU, 0x0bf0f0fbU +.word 0xecadad41U, 0x67d4d4b3U, 0xfda2a25fU, 0xeaafaf45U +.word 0xbf9c9c23U, 0xf7a4a453U, 0x967272e4U, 0x5bc0c09bU +.word 0xc2b7b775U, 0x1cfdfde1U, 0xae93933dU, 0x6a26264cU +.word 0x5a36366cU, 0x413f3f7eU, 0x02f7f7f5U, 0x4fcccc83U +.word 0x5c343468U, 0xf4a5a551U, 0x34e5e5d1U, 0x08f1f1f9U +.word 0x937171e2U, 0x73d8d8abU, 0x53313162U, 0x3f15152aU +.word 0x0c040408U, 0x52c7c795U, 0x65232346U, 0x5ec3c39dU +.word 0x28181830U, 0xa1969637U, 0x0f05050aU, 0xb59a9a2fU +.word 0x0907070eU, 0x36121224U, 0x9b80801bU, 0x3de2e2dfU +.word 0x26ebebcdU, 0x6927274eU, 0xcdb2b27fU, 0x9f7575eaU +.word 0x1b090912U, 0x9e83831dU, 0x742c2c58U, 0x2e1a1a34U +.word 0x2d1b1b36U, 0xb26e6edcU, 0xee5a5ab4U, 0xfba0a05bU +.word 0xf65252a4U, 0x4d3b3b76U, 0x61d6d6b7U, 0xceb3b37dU +.word 0x7b292952U, 0x3ee3e3ddU, 0x712f2f5eU, 0x97848413U +.word 0xf55353a6U, 0x68d1d1b9U, 0x00000000U, 0x2cededc1U +.word 0x60202040U, 0x1ffcfce3U, 0xc8b1b179U, 0xed5b5bb6U +.word 0xbe6a6ad4U, 0x46cbcb8dU, 0xd9bebe67U, 0x4b393972U +.word 0xde4a4a94U, 0xd44c4c98U, 0xe85858b0U, 0x4acfcf85U +.word 0x6bd0d0bbU, 0x2aefefc5U, 0xe5aaaa4fU, 0x16fbfbedU +.word 0xc5434386U, 0xd74d4d9aU, 0x55333366U, 0x94858511U +.word 0xcf45458aU, 0x10f9f9e9U, 0x06020204U, 0x817f7ffeU +.word 0xf05050a0U, 0x443c3c78U, 0xba9f9f25U, 0xe3a8a84bU +.word 0xf35151a2U, 0xfea3a35dU, 0xc0404080U, 0x8a8f8f05U +.word 0xad92923fU, 0xbc9d9d21U, 0x48383870U, 0x04f5f5f1U +.word 0xdfbcbc63U, 0xc1b6b677U, 0x75dadaafU, 0x63212142U +.word 0x30101020U, 0x1affffe5U, 0x0ef3f3fdU, 0x6dd2d2bfU +.word 0x4ccdcd81U, 0x140c0c18U, 0x35131326U, 0x2fececc3U +.word 0xe15f5fbeU, 0xa2979735U, 0xcc444488U, 0x3917172eU +.word 0x57c4c493U, 0xf2a7a755U, 0x827e7efcU, 0x473d3d7aU +.word 0xac6464c8U, 0xe75d5dbaU, 0x2b191932U, 0x957373e6U +.word 0xa06060c0U, 0x98818119U, 0xd14f4f9eU, 0x7fdcdca3U +.word 0x66222244U, 0x7e2a2a54U, 0xab90903bU, 0x8388880bU +.word 0xca46468cU, 0x29eeeec7U, 0xd3b8b86bU, 0x3c141428U +.word 0x79dedea7U, 0xe25e5ebcU, 0x1d0b0b16U, 0x76dbdbadU +.word 0x3be0e0dbU, 0x56323264U, 0x4e3a3a74U, 0x1e0a0a14U +.word 0xdb494992U, 0x0a06060cU, 0x6c242448U, 0xe45c5cb8U +.word 0x5dc2c29fU, 0x6ed3d3bdU, 0xefacac43U, 0xa66262c4U +.word 0xa8919139U, 0xa4959531U, 0x37e4e4d3U, 0x8b7979f2U +.word 0x32e7e7d5U, 0x43c8c88bU, 0x5937376eU, 0xb76d6ddaU +.word 0x8c8d8d01U, 0x64d5d5b1U, 0xd24e4e9cU, 0xe0a9a949U +.word 0xb46c6cd8U, 0xfa5656acU, 0x07f4f4f3U, 0x25eaeacfU +.word 0xaf6565caU, 0x8e7a7af4U, 0xe9aeae47U, 0x18080810U +.word 0xd5baba6fU, 0x887878f0U, 0x6f25254aU, 0x722e2e5cU +.word 0x241c1c38U, 0xf1a6a657U, 0xc7b4b473U, 0x51c6c697U +.word 0x23e8e8cbU, 0x7cdddda1U, 0x9c7474e8U, 0x211f1f3eU +.word 0xdd4b4b96U, 0xdcbdbd61U, 0x868b8b0dU, 0x858a8a0fU +.word 0x907070e0U, 0x423e3e7cU, 0xc4b5b571U, 0xaa6666ccU +.word 0xd8484890U, 0x05030306U, 0x01f6f6f7U, 0x120e0e1cU +.word 0xa36161c2U, 0x5f35356aU, 0xf95757aeU, 0xd0b9b969U +.word 0x91868617U, 0x58c1c199U, 0x271d1d3aU, 0xb99e9e27U +.word 0x38e1e1d9U, 0x13f8f8ebU, 0xb398982bU, 0x33111122U +.word 0xbb6969d2U, 0x70d9d9a9U, 0x898e8e07U, 0xa7949433U +.word 0xb69b9b2dU, 0x221e1e3cU, 0x92878715U, 0x20e9e9c9U +.word 0x49cece87U, 0xff5555aaU, 0x78282850U, 0x7adfdfa5U +.word 0x8f8c8c03U, 0xf8a1a159U, 0x80898909U, 0x170d0d1aU +.word 0xdabfbf65U, 0x31e6e6d7U, 0xc6424284U, 0xb86868d0U +.word 0xc3414182U, 0xb0999929U, 0x772d2d5aU, 0x110f0f1eU +.word 0xcbb0b07bU, 0xfc5454a8U, 0xd6bbbb6dU, 0x3a16162cU + +.type AES_Te1,@object +AES_Te1: +.word 0x6363c6a5U, 0x7c7cf884U, 0x7777ee99U, 0x7b7bf68dU +.word 0xf2f2ff0dU, 0x6b6bd6bdU, 0x6f6fdeb1U, 0xc5c59154U +.word 0x30306050U, 0x01010203U, 0x6767cea9U, 0x2b2b567dU +.word 0xfefee719U, 0xd7d7b562U, 0xabab4de6U, 0x7676ec9aU +.word 0xcaca8f45U, 0x82821f9dU, 0xc9c98940U, 0x7d7dfa87U +.word 0xfafaef15U, 0x5959b2ebU, 0x47478ec9U, 0xf0f0fb0bU +.word 0xadad41ecU, 0xd4d4b367U, 0xa2a25ffdU, 0xafaf45eaU +.word 0x9c9c23bfU, 0xa4a453f7U, 0x7272e496U, 0xc0c09b5bU +.word 0xb7b775c2U, 0xfdfde11cU, 0x93933daeU, 0x26264c6aU +.word 0x36366c5aU, 0x3f3f7e41U, 0xf7f7f502U, 0xcccc834fU +.word 0x3434685cU, 0xa5a551f4U, 0xe5e5d134U, 0xf1f1f908U +.word 0x7171e293U, 0xd8d8ab73U, 0x31316253U, 0x15152a3fU +.word 0x0404080cU, 0xc7c79552U, 0x23234665U, 0xc3c39d5eU +.word 0x18183028U, 0x969637a1U, 0x05050a0fU, 0x9a9a2fb5U +.word 0x07070e09U, 0x12122436U, 0x80801b9bU, 0xe2e2df3dU +.word 0xebebcd26U, 0x27274e69U, 0xb2b27fcdU, 0x7575ea9fU +.word 0x0909121bU, 0x83831d9eU, 0x2c2c5874U, 0x1a1a342eU +.word 0x1b1b362dU, 0x6e6edcb2U, 0x5a5ab4eeU, 0xa0a05bfbU +.word 0x5252a4f6U, 0x3b3b764dU, 0xd6d6b761U, 0xb3b37dceU +.word 0x2929527bU, 0xe3e3dd3eU, 0x2f2f5e71U, 0x84841397U +.word 0x5353a6f5U, 0xd1d1b968U, 0x00000000U, 0xededc12cU +.word 0x20204060U, 0xfcfce31fU, 0xb1b179c8U, 0x5b5bb6edU +.word 0x6a6ad4beU, 0xcbcb8d46U, 0xbebe67d9U, 0x3939724bU +.word 0x4a4a94deU, 0x4c4c98d4U, 0x5858b0e8U, 0xcfcf854aU +.word 0xd0d0bb6bU, 0xefefc52aU, 0xaaaa4fe5U, 0xfbfbed16U +.word 0x434386c5U, 0x4d4d9ad7U, 0x33336655U, 0x85851194U +.word 0x45458acfU, 0xf9f9e910U, 0x02020406U, 0x7f7ffe81U +.word 0x5050a0f0U, 0x3c3c7844U, 0x9f9f25baU, 0xa8a84be3U +.word 0x5151a2f3U, 0xa3a35dfeU, 0x404080c0U, 0x8f8f058aU +.word 0x92923fadU, 0x9d9d21bcU, 0x38387048U, 0xf5f5f104U +.word 0xbcbc63dfU, 0xb6b677c1U, 0xdadaaf75U, 0x21214263U +.word 0x10102030U, 0xffffe51aU, 0xf3f3fd0eU, 0xd2d2bf6dU +.word 0xcdcd814cU, 0x0c0c1814U, 0x13132635U, 0xececc32fU +.word 0x5f5fbee1U, 0x979735a2U, 0x444488ccU, 0x17172e39U +.word 0xc4c49357U, 0xa7a755f2U, 0x7e7efc82U, 0x3d3d7a47U +.word 0x6464c8acU, 0x5d5dbae7U, 0x1919322bU, 0x7373e695U +.word 0x6060c0a0U, 0x81811998U, 0x4f4f9ed1U, 0xdcdca37fU +.word 0x22224466U, 0x2a2a547eU, 0x90903babU, 0x88880b83U +.word 0x46468ccaU, 0xeeeec729U, 0xb8b86bd3U, 0x1414283cU +.word 0xdedea779U, 0x5e5ebce2U, 0x0b0b161dU, 0xdbdbad76U +.word 0xe0e0db3bU, 0x32326456U, 0x3a3a744eU, 0x0a0a141eU +.word 0x494992dbU, 0x06060c0aU, 0x2424486cU, 0x5c5cb8e4U +.word 0xc2c29f5dU, 0xd3d3bd6eU, 0xacac43efU, 0x6262c4a6U +.word 0x919139a8U, 0x959531a4U, 0xe4e4d337U, 0x7979f28bU +.word 0xe7e7d532U, 0xc8c88b43U, 0x37376e59U, 0x6d6ddab7U +.word 0x8d8d018cU, 0xd5d5b164U, 0x4e4e9cd2U, 0xa9a949e0U +.word 0x6c6cd8b4U, 0x5656acfaU, 0xf4f4f307U, 0xeaeacf25U +.word 0x6565caafU, 0x7a7af48eU, 0xaeae47e9U, 0x08081018U +.word 0xbaba6fd5U, 0x7878f088U, 0x25254a6fU, 0x2e2e5c72U +.word 0x1c1c3824U, 0xa6a657f1U, 0xb4b473c7U, 0xc6c69751U +.word 0xe8e8cb23U, 0xdddda17cU, 0x7474e89cU, 0x1f1f3e21U +.word 0x4b4b96ddU, 0xbdbd61dcU, 0x8b8b0d86U, 0x8a8a0f85U +.word 0x7070e090U, 0x3e3e7c42U, 0xb5b571c4U, 0x6666ccaaU +.word 0x484890d8U, 0x03030605U, 0xf6f6f701U, 0x0e0e1c12U +.word 0x6161c2a3U, 0x35356a5fU, 0x5757aef9U, 0xb9b969d0U +.word 0x86861791U, 0xc1c19958U, 0x1d1d3a27U, 0x9e9e27b9U +.word 0xe1e1d938U, 0xf8f8eb13U, 0x98982bb3U, 0x11112233U +.word 0x6969d2bbU, 0xd9d9a970U, 0x8e8e0789U, 0x949433a7U +.word 0x9b9b2db6U, 0x1e1e3c22U, 0x87871592U, 0xe9e9c920U +.word 0xcece8749U, 0x5555aaffU, 0x28285078U, 0xdfdfa57aU +.word 0x8c8c038fU, 0xa1a159f8U, 0x89890980U, 0x0d0d1a17U +.word 0xbfbf65daU, 0xe6e6d731U, 0x424284c6U, 0x6868d0b8U +.word 0x414182c3U, 0x999929b0U, 0x2d2d5a77U, 0x0f0f1e11U +.word 0xb0b07bcbU, 0x5454a8fcU, 0xbbbb6dd6U, 0x16162c3aU + +.type AES_Te2,@object +AES_Te2: +.word 0x63c6a563U, 0x7cf8847cU, 0x77ee9977U, 0x7bf68d7bU +.word 0xf2ff0df2U, 0x6bd6bd6bU, 0x6fdeb16fU, 0xc59154c5U +.word 0x30605030U, 0x01020301U, 0x67cea967U, 0x2b567d2bU +.word 0xfee719feU, 0xd7b562d7U, 0xab4de6abU, 0x76ec9a76U +.word 0xca8f45caU, 0x821f9d82U, 0xc98940c9U, 0x7dfa877dU +.word 0xfaef15faU, 0x59b2eb59U, 0x478ec947U, 0xf0fb0bf0U +.word 0xad41ecadU, 0xd4b367d4U, 0xa25ffda2U, 0xaf45eaafU +.word 0x9c23bf9cU, 0xa453f7a4U, 0x72e49672U, 0xc09b5bc0U +.word 0xb775c2b7U, 0xfde11cfdU, 0x933dae93U, 0x264c6a26U +.word 0x366c5a36U, 0x3f7e413fU, 0xf7f502f7U, 0xcc834fccU +.word 0x34685c34U, 0xa551f4a5U, 0xe5d134e5U, 0xf1f908f1U +.word 0x71e29371U, 0xd8ab73d8U, 0x31625331U, 0x152a3f15U +.word 0x04080c04U, 0xc79552c7U, 0x23466523U, 0xc39d5ec3U +.word 0x18302818U, 0x9637a196U, 0x050a0f05U, 0x9a2fb59aU +.word 0x070e0907U, 0x12243612U, 0x801b9b80U, 0xe2df3de2U +.word 0xebcd26ebU, 0x274e6927U, 0xb27fcdb2U, 0x75ea9f75U +.word 0x09121b09U, 0x831d9e83U, 0x2c58742cU, 0x1a342e1aU +.word 0x1b362d1bU, 0x6edcb26eU, 0x5ab4ee5aU, 0xa05bfba0U +.word 0x52a4f652U, 0x3b764d3bU, 0xd6b761d6U, 0xb37dceb3U +.word 0x29527b29U, 0xe3dd3ee3U, 0x2f5e712fU, 0x84139784U +.word 0x53a6f553U, 0xd1b968d1U, 0x00000000U, 0xedc12cedU +.word 0x20406020U, 0xfce31ffcU, 0xb179c8b1U, 0x5bb6ed5bU +.word 0x6ad4be6aU, 0xcb8d46cbU, 0xbe67d9beU, 0x39724b39U +.word 0x4a94de4aU, 0x4c98d44cU, 0x58b0e858U, 0xcf854acfU +.word 0xd0bb6bd0U, 0xefc52aefU, 0xaa4fe5aaU, 0xfbed16fbU +.word 0x4386c543U, 0x4d9ad74dU, 0x33665533U, 0x85119485U +.word 0x458acf45U, 0xf9e910f9U, 0x02040602U, 0x7ffe817fU +.word 0x50a0f050U, 0x3c78443cU, 0x9f25ba9fU, 0xa84be3a8U +.word 0x51a2f351U, 0xa35dfea3U, 0x4080c040U, 0x8f058a8fU +.word 0x923fad92U, 0x9d21bc9dU, 0x38704838U, 0xf5f104f5U +.word 0xbc63dfbcU, 0xb677c1b6U, 0xdaaf75daU, 0x21426321U +.word 0x10203010U, 0xffe51affU, 0xf3fd0ef3U, 0xd2bf6dd2U +.word 0xcd814ccdU, 0x0c18140cU, 0x13263513U, 0xecc32fecU +.word 0x5fbee15fU, 0x9735a297U, 0x4488cc44U, 0x172e3917U +.word 0xc49357c4U, 0xa755f2a7U, 0x7efc827eU, 0x3d7a473dU +.word 0x64c8ac64U, 0x5dbae75dU, 0x19322b19U, 0x73e69573U +.word 0x60c0a060U, 0x81199881U, 0x4f9ed14fU, 0xdca37fdcU +.word 0x22446622U, 0x2a547e2aU, 0x903bab90U, 0x880b8388U +.word 0x468cca46U, 0xeec729eeU, 0xb86bd3b8U, 0x14283c14U +.word 0xdea779deU, 0x5ebce25eU, 0x0b161d0bU, 0xdbad76dbU +.word 0xe0db3be0U, 0x32645632U, 0x3a744e3aU, 0x0a141e0aU +.word 0x4992db49U, 0x060c0a06U, 0x24486c24U, 0x5cb8e45cU +.word 0xc29f5dc2U, 0xd3bd6ed3U, 0xac43efacU, 0x62c4a662U +.word 0x9139a891U, 0x9531a495U, 0xe4d337e4U, 0x79f28b79U +.word 0xe7d532e7U, 0xc88b43c8U, 0x376e5937U, 0x6ddab76dU +.word 0x8d018c8dU, 0xd5b164d5U, 0x4e9cd24eU, 0xa949e0a9U +.word 0x6cd8b46cU, 0x56acfa56U, 0xf4f307f4U, 0xeacf25eaU +.word 0x65caaf65U, 0x7af48e7aU, 0xae47e9aeU, 0x08101808U +.word 0xba6fd5baU, 0x78f08878U, 0x254a6f25U, 0x2e5c722eU +.word 0x1c38241cU, 0xa657f1a6U, 0xb473c7b4U, 0xc69751c6U +.word 0xe8cb23e8U, 0xdda17cddU, 0x74e89c74U, 0x1f3e211fU +.word 0x4b96dd4bU, 0xbd61dcbdU, 0x8b0d868bU, 0x8a0f858aU +.word 0x70e09070U, 0x3e7c423eU, 0xb571c4b5U, 0x66ccaa66U +.word 0x4890d848U, 0x03060503U, 0xf6f701f6U, 0x0e1c120eU +.word 0x61c2a361U, 0x356a5f35U, 0x57aef957U, 0xb969d0b9U +.word 0x86179186U, 0xc19958c1U, 0x1d3a271dU, 0x9e27b99eU +.word 0xe1d938e1U, 0xf8eb13f8U, 0x982bb398U, 0x11223311U +.word 0x69d2bb69U, 0xd9a970d9U, 0x8e07898eU, 0x9433a794U +.word 0x9b2db69bU, 0x1e3c221eU, 0x87159287U, 0xe9c920e9U +.word 0xce8749ceU, 0x55aaff55U, 0x28507828U, 0xdfa57adfU +.word 0x8c038f8cU, 0xa159f8a1U, 0x89098089U, 0x0d1a170dU +.word 0xbf65dabfU, 0xe6d731e6U, 0x4284c642U, 0x68d0b868U +.word 0x4182c341U, 0x9929b099U, 0x2d5a772dU, 0x0f1e110fU +.word 0xb07bcbb0U, 0x54a8fc54U, 0xbb6dd6bbU, 0x162c3a16U + +.type AES_Te3,@object +AES_Te3: +.word 0xc6a56363U, 0xf8847c7cU, 0xee997777U, 0xf68d7b7bU +.word 0xff0df2f2U, 0xd6bd6b6bU, 0xdeb16f6fU, 0x9154c5c5U +.word 0x60503030U, 0x02030101U, 0xcea96767U, 0x567d2b2bU +.word 0xe719fefeU, 0xb562d7d7U, 0x4de6ababU, 0xec9a7676U +.word 0x8f45cacaU, 0x1f9d8282U, 0x8940c9c9U, 0xfa877d7dU +.word 0xef15fafaU, 0xb2eb5959U, 0x8ec94747U, 0xfb0bf0f0U +.word 0x41ecadadU, 0xb367d4d4U, 0x5ffda2a2U, 0x45eaafafU +.word 0x23bf9c9cU, 0x53f7a4a4U, 0xe4967272U, 0x9b5bc0c0U +.word 0x75c2b7b7U, 0xe11cfdfdU, 0x3dae9393U, 0x4c6a2626U +.word 0x6c5a3636U, 0x7e413f3fU, 0xf502f7f7U, 0x834fccccU +.word 0x685c3434U, 0x51f4a5a5U, 0xd134e5e5U, 0xf908f1f1U +.word 0xe2937171U, 0xab73d8d8U, 0x62533131U, 0x2a3f1515U +.word 0x080c0404U, 0x9552c7c7U, 0x46652323U, 0x9d5ec3c3U +.word 0x30281818U, 0x37a19696U, 0x0a0f0505U, 0x2fb59a9aU +.word 0x0e090707U, 0x24361212U, 0x1b9b8080U, 0xdf3de2e2U +.word 0xcd26ebebU, 0x4e692727U, 0x7fcdb2b2U, 0xea9f7575U +.word 0x121b0909U, 0x1d9e8383U, 0x58742c2cU, 0x342e1a1aU +.word 0x362d1b1bU, 0xdcb26e6eU, 0xb4ee5a5aU, 0x5bfba0a0U +.word 0xa4f65252U, 0x764d3b3bU, 0xb761d6d6U, 0x7dceb3b3U +.word 0x527b2929U, 0xdd3ee3e3U, 0x5e712f2fU, 0x13978484U +.word 0xa6f55353U, 0xb968d1d1U, 0x00000000U, 0xc12cededU +.word 0x40602020U, 0xe31ffcfcU, 0x79c8b1b1U, 0xb6ed5b5bU +.word 0xd4be6a6aU, 0x8d46cbcbU, 0x67d9bebeU, 0x724b3939U +.word 0x94de4a4aU, 0x98d44c4cU, 0xb0e85858U, 0x854acfcfU +.word 0xbb6bd0d0U, 0xc52aefefU, 0x4fe5aaaaU, 0xed16fbfbU +.word 0x86c54343U, 0x9ad74d4dU, 0x66553333U, 0x11948585U +.word 0x8acf4545U, 0xe910f9f9U, 0x04060202U, 0xfe817f7fU +.word 0xa0f05050U, 0x78443c3cU, 0x25ba9f9fU, 0x4be3a8a8U +.word 0xa2f35151U, 0x5dfea3a3U, 0x80c04040U, 0x058a8f8fU +.word 0x3fad9292U, 0x21bc9d9dU, 0x70483838U, 0xf104f5f5U +.word 0x63dfbcbcU, 0x77c1b6b6U, 0xaf75dadaU, 0x42632121U +.word 0x20301010U, 0xe51affffU, 0xfd0ef3f3U, 0xbf6dd2d2U +.word 0x814ccdcdU, 0x18140c0cU, 0x26351313U, 0xc32fececU +.word 0xbee15f5fU, 0x35a29797U, 0x88cc4444U, 0x2e391717U +.word 0x9357c4c4U, 0x55f2a7a7U, 0xfc827e7eU, 0x7a473d3dU +.word 0xc8ac6464U, 0xbae75d5dU, 0x322b1919U, 0xe6957373U +.word 0xc0a06060U, 0x19988181U, 0x9ed14f4fU, 0xa37fdcdcU +.word 0x44662222U, 0x547e2a2aU, 0x3bab9090U, 0x0b838888U +.word 0x8cca4646U, 0xc729eeeeU, 0x6bd3b8b8U, 0x283c1414U +.word 0xa779dedeU, 0xbce25e5eU, 0x161d0b0bU, 0xad76dbdbU +.word 0xdb3be0e0U, 0x64563232U, 0x744e3a3aU, 0x141e0a0aU +.word 0x92db4949U, 0x0c0a0606U, 0x486c2424U, 0xb8e45c5cU +.word 0x9f5dc2c2U, 0xbd6ed3d3U, 0x43efacacU, 0xc4a66262U +.word 0x39a89191U, 0x31a49595U, 0xd337e4e4U, 0xf28b7979U +.word 0xd532e7e7U, 0x8b43c8c8U, 0x6e593737U, 0xdab76d6dU +.word 0x018c8d8dU, 0xb164d5d5U, 0x9cd24e4eU, 0x49e0a9a9U +.word 0xd8b46c6cU, 0xacfa5656U, 0xf307f4f4U, 0xcf25eaeaU +.word 0xcaaf6565U, 0xf48e7a7aU, 0x47e9aeaeU, 0x10180808U +.word 0x6fd5babaU, 0xf0887878U, 0x4a6f2525U, 0x5c722e2eU +.word 0x38241c1cU, 0x57f1a6a6U, 0x73c7b4b4U, 0x9751c6c6U +.word 0xcb23e8e8U, 0xa17cddddU, 0xe89c7474U, 0x3e211f1fU +.word 0x96dd4b4bU, 0x61dcbdbdU, 0x0d868b8bU, 0x0f858a8aU +.word 0xe0907070U, 0x7c423e3eU, 0x71c4b5b5U, 0xccaa6666U +.word 0x90d84848U, 0x06050303U, 0xf701f6f6U, 0x1c120e0eU +.word 0xc2a36161U, 0x6a5f3535U, 0xaef95757U, 0x69d0b9b9U +.word 0x17918686U, 0x9958c1c1U, 0x3a271d1dU, 0x27b99e9eU +.word 0xd938e1e1U, 0xeb13f8f8U, 0x2bb39898U, 0x22331111U +.word 0xd2bb6969U, 0xa970d9d9U, 0x07898e8eU, 0x33a79494U +.word 0x2db69b9bU, 0x3c221e1eU, 0x15928787U, 0xc920e9e9U +.word 0x8749ceceU, 0xaaff5555U, 0x50782828U, 0xa57adfdfU +.word 0x038f8c8cU, 0x59f8a1a1U, 0x09808989U, 0x1a170d0dU +.word 0x65dabfbfU, 0xd731e6e6U, 0x84c64242U, 0xd0b86868U +.word 0x82c34141U, 0x29b09999U, 0x5a772d2dU, 0x1e110f0fU +.word 0x7bcbb0b0U, 0xa8fc5454U, 0x6dd6bbbbU, 0x2c3a1616U + +.p2align 12 +.type AES_Td0,@object +AES_Td0: +.word 0x50a7f451U, 0x5365417eU, 0xc3a4171aU, 0x965e273aU +.word 0xcb6bab3bU, 0xf1459d1fU, 0xab58faacU, 0x9303e34bU +.word 0x55fa3020U, 0xf66d76adU, 0x9176cc88U, 0x254c02f5U +.word 0xfcd7e54fU, 0xd7cb2ac5U, 0x80443526U, 0x8fa362b5U +.word 0x495ab1deU, 0x671bba25U, 0x980eea45U, 0xe1c0fe5dU +.word 0x02752fc3U, 0x12f04c81U, 0xa397468dU, 0xc6f9d36bU +.word 0xe75f8f03U, 0x959c9215U, 0xeb7a6dbfU, 0xda595295U +.word 0x2d83bed4U, 0xd3217458U, 0x2969e049U, 0x44c8c98eU +.word 0x6a89c275U, 0x78798ef4U, 0x6b3e5899U, 0xdd71b927U +.word 0xb64fe1beU, 0x17ad88f0U, 0x66ac20c9U, 0xb43ace7dU +.word 0x184adf63U, 0x82311ae5U, 0x60335197U, 0x457f5362U +.word 0xe07764b1U, 0x84ae6bbbU, 0x1ca081feU, 0x942b08f9U +.word 0x58684870U, 0x19fd458fU, 0x876cde94U, 0xb7f87b52U +.word 0x23d373abU, 0xe2024b72U, 0x578f1fe3U, 0x2aab5566U +.word 0x0728ebb2U, 0x03c2b52fU, 0x9a7bc586U, 0xa50837d3U +.word 0xf2872830U, 0xb2a5bf23U, 0xba6a0302U, 0x5c8216edU +.word 0x2b1ccf8aU, 0x92b479a7U, 0xf0f207f3U, 0xa1e2694eU +.word 0xcdf4da65U, 0xd5be0506U, 0x1f6234d1U, 0x8afea6c4U +.word 0x9d532e34U, 0xa055f3a2U, 0x32e18a05U, 0x75ebf6a4U +.word 0x39ec830bU, 0xaaef6040U, 0x069f715eU, 0x51106ebdU +.word 0xf98a213eU, 0x3d06dd96U, 0xae053eddU, 0x46bde64dU +.word 0xb58d5491U, 0x055dc471U, 0x6fd40604U, 0xff155060U +.word 0x24fb9819U, 0x97e9bdd6U, 0xcc434089U, 0x779ed967U +.word 0xbd42e8b0U, 0x888b8907U, 0x385b19e7U, 0xdbeec879U +.word 0x470a7ca1U, 0xe90f427cU, 0xc91e84f8U, 0x00000000U +.word 0x83868009U, 0x48ed2b32U, 0xac70111eU, 0x4e725a6cU +.word 0xfbff0efdU, 0x5638850fU, 0x1ed5ae3dU, 0x27392d36U +.word 0x64d90f0aU, 0x21a65c68U, 0xd1545b9bU, 0x3a2e3624U +.word 0xb1670a0cU, 0x0fe75793U, 0xd296eeb4U, 0x9e919b1bU +.word 0x4fc5c080U, 0xa220dc61U, 0x694b775aU, 0x161a121cU +.word 0x0aba93e2U, 0xe52aa0c0U, 0x43e0223cU, 0x1d171b12U +.word 0x0b0d090eU, 0xadc78bf2U, 0xb9a8b62dU, 0xc8a91e14U +.word 0x8519f157U, 0x4c0775afU, 0xbbdd99eeU, 0xfd607fa3U +.word 0x9f2601f7U, 0xbcf5725cU, 0xc53b6644U, 0x347efb5bU +.word 0x7629438bU, 0xdcc623cbU, 0x68fcedb6U, 0x63f1e4b8U +.word 0xcadc31d7U, 0x10856342U, 0x40229713U, 0x2011c684U +.word 0x7d244a85U, 0xf83dbbd2U, 0x1132f9aeU, 0x6da129c7U +.word 0x4b2f9e1dU, 0xf330b2dcU, 0xec52860dU, 0xd0e3c177U +.word 0x6c16b32bU, 0x99b970a9U, 0xfa489411U, 0x2264e947U +.word 0xc48cfca8U, 0x1a3ff0a0U, 0xd82c7d56U, 0xef903322U +.word 0xc74e4987U, 0xc1d138d9U, 0xfea2ca8cU, 0x360bd498U +.word 0xcf81f5a6U, 0x28de7aa5U, 0x268eb7daU, 0xa4bfad3fU +.word 0xe49d3a2cU, 0x0d927850U, 0x9bcc5f6aU, 0x62467e54U +.word 0xc2138df6U, 0xe8b8d890U, 0x5ef7392eU, 0xf5afc382U +.word 0xbe805d9fU, 0x7c93d069U, 0xa92dd56fU, 0xb31225cfU +.word 0x3b99acc8U, 0xa77d1810U, 0x6e639ce8U, 0x7bbb3bdbU +.word 0x097826cdU, 0xf418596eU, 0x01b79aecU, 0xa89a4f83U +.word 0x656e95e6U, 0x7ee6ffaaU, 0x08cfbc21U, 0xe6e815efU +.word 0xd99be7baU, 0xce366f4aU, 0xd4099feaU, 0xd67cb029U +.word 0xafb2a431U, 0x31233f2aU, 0x3094a5c6U, 0xc066a235U +.word 0x37bc4e74U, 0xa6ca82fcU, 0xb0d090e0U, 0x15d8a733U +.word 0x4a9804f1U, 0xf7daec41U, 0x0e50cd7fU, 0x2ff69117U +.word 0x8dd64d76U, 0x4db0ef43U, 0x544daaccU, 0xdf0496e4U +.word 0xe3b5d19eU, 0x1b886a4cU, 0xb81f2cc1U, 0x7f516546U +.word 0x04ea5e9dU, 0x5d358c01U, 0x737487faU, 0x2e410bfbU +.word 0x5a1d67b3U, 0x52d2db92U, 0x335610e9U, 0x1347d66dU +.word 0x8c61d79aU, 0x7a0ca137U, 0x8e14f859U, 0x893c13ebU +.word 0xee27a9ceU, 0x35c961b7U, 0xede51ce1U, 0x3cb1477aU +.word 0x59dfd29cU, 0x3f73f255U, 0x79ce1418U, 0xbf37c773U +.word 0xeacdf753U, 0x5baafd5fU, 0x146f3ddfU, 0x86db4478U +.word 0x81f3afcaU, 0x3ec468b9U, 0x2c342438U, 0x5f40a3c2U +.word 0x72c31d16U, 0x0c25e2bcU, 0x8b493c28U, 0x41950dffU +.word 0x7101a839U, 0xdeb30c08U, 0x9ce4b4d8U, 0x90c15664U +.word 0x6184cb7bU, 0x70b632d5U, 0x745c6c48U, 0x4257b8d0U + +.type AES_Td1,@object +AES_Td1: +.word 0xa7f45150U, 0x65417e53U, 0xa4171ac3U, 0x5e273a96U +.word 0x6bab3bcbU, 0x459d1ff1U, 0x58faacabU, 0x03e34b93U +.word 0xfa302055U, 0x6d76adf6U, 0x76cc8891U, 0x4c02f525U +.word 0xd7e54ffcU, 0xcb2ac5d7U, 0x44352680U, 0xa362b58fU +.word 0x5ab1de49U, 0x1bba2567U, 0x0eea4598U, 0xc0fe5de1U +.word 0x752fc302U, 0xf04c8112U, 0x97468da3U, 0xf9d36bc6U +.word 0x5f8f03e7U, 0x9c921595U, 0x7a6dbfebU, 0x595295daU +.word 0x83bed42dU, 0x217458d3U, 0x69e04929U, 0xc8c98e44U +.word 0x89c2756aU, 0x798ef478U, 0x3e58996bU, 0x71b927ddU +.word 0x4fe1beb6U, 0xad88f017U, 0xac20c966U, 0x3ace7db4U +.word 0x4adf6318U, 0x311ae582U, 0x33519760U, 0x7f536245U +.word 0x7764b1e0U, 0xae6bbb84U, 0xa081fe1cU, 0x2b08f994U +.word 0x68487058U, 0xfd458f19U, 0x6cde9487U, 0xf87b52b7U +.word 0xd373ab23U, 0x024b72e2U, 0x8f1fe357U, 0xab55662aU +.word 0x28ebb207U, 0xc2b52f03U, 0x7bc5869aU, 0x0837d3a5U +.word 0x872830f2U, 0xa5bf23b2U, 0x6a0302baU, 0x8216ed5cU +.word 0x1ccf8a2bU, 0xb479a792U, 0xf207f3f0U, 0xe2694ea1U +.word 0xf4da65cdU, 0xbe0506d5U, 0x6234d11fU, 0xfea6c48aU +.word 0x532e349dU, 0x55f3a2a0U, 0xe18a0532U, 0xebf6a475U +.word 0xec830b39U, 0xef6040aaU, 0x9f715e06U, 0x106ebd51U +.word 0x8a213ef9U, 0x06dd963dU, 0x053eddaeU, 0xbde64d46U +.word 0x8d5491b5U, 0x5dc47105U, 0xd406046fU, 0x155060ffU +.word 0xfb981924U, 0xe9bdd697U, 0x434089ccU, 0x9ed96777U +.word 0x42e8b0bdU, 0x8b890788U, 0x5b19e738U, 0xeec879dbU +.word 0x0a7ca147U, 0x0f427ce9U, 0x1e84f8c9U, 0x00000000U +.word 0x86800983U, 0xed2b3248U, 0x70111eacU, 0x725a6c4eU +.word 0xff0efdfbU, 0x38850f56U, 0xd5ae3d1eU, 0x392d3627U +.word 0xd90f0a64U, 0xa65c6821U, 0x545b9bd1U, 0x2e36243aU +.word 0x670a0cb1U, 0xe757930fU, 0x96eeb4d2U, 0x919b1b9eU +.word 0xc5c0804fU, 0x20dc61a2U, 0x4b775a69U, 0x1a121c16U +.word 0xba93e20aU, 0x2aa0c0e5U, 0xe0223c43U, 0x171b121dU +.word 0x0d090e0bU, 0xc78bf2adU, 0xa8b62db9U, 0xa91e14c8U +.word 0x19f15785U, 0x0775af4cU, 0xdd99eebbU, 0x607fa3fdU +.word 0x2601f79fU, 0xf5725cbcU, 0x3b6644c5U, 0x7efb5b34U +.word 0x29438b76U, 0xc623cbdcU, 0xfcedb668U, 0xf1e4b863U +.word 0xdc31d7caU, 0x85634210U, 0x22971340U, 0x11c68420U +.word 0x244a857dU, 0x3dbbd2f8U, 0x32f9ae11U, 0xa129c76dU +.word 0x2f9e1d4bU, 0x30b2dcf3U, 0x52860decU, 0xe3c177d0U +.word 0x16b32b6cU, 0xb970a999U, 0x489411faU, 0x64e94722U +.word 0x8cfca8c4U, 0x3ff0a01aU, 0x2c7d56d8U, 0x903322efU +.word 0x4e4987c7U, 0xd138d9c1U, 0xa2ca8cfeU, 0x0bd49836U +.word 0x81f5a6cfU, 0xde7aa528U, 0x8eb7da26U, 0xbfad3fa4U +.word 0x9d3a2ce4U, 0x9278500dU, 0xcc5f6a9bU, 0x467e5462U +.word 0x138df6c2U, 0xb8d890e8U, 0xf7392e5eU, 0xafc382f5U +.word 0x805d9fbeU, 0x93d0697cU, 0x2dd56fa9U, 0x1225cfb3U +.word 0x99acc83bU, 0x7d1810a7U, 0x639ce86eU, 0xbb3bdb7bU +.word 0x7826cd09U, 0x18596ef4U, 0xb79aec01U, 0x9a4f83a8U +.word 0x6e95e665U, 0xe6ffaa7eU, 0xcfbc2108U, 0xe815efe6U +.word 0x9be7bad9U, 0x366f4aceU, 0x099fead4U, 0x7cb029d6U +.word 0xb2a431afU, 0x233f2a31U, 0x94a5c630U, 0x66a235c0U +.word 0xbc4e7437U, 0xca82fca6U, 0xd090e0b0U, 0xd8a73315U +.word 0x9804f14aU, 0xdaec41f7U, 0x50cd7f0eU, 0xf691172fU +.word 0xd64d768dU, 0xb0ef434dU, 0x4daacc54U, 0x0496e4dfU +.word 0xb5d19ee3U, 0x886a4c1bU, 0x1f2cc1b8U, 0x5165467fU +.word 0xea5e9d04U, 0x358c015dU, 0x7487fa73U, 0x410bfb2eU +.word 0x1d67b35aU, 0xd2db9252U, 0x5610e933U, 0x47d66d13U +.word 0x61d79a8cU, 0x0ca1377aU, 0x14f8598eU, 0x3c13eb89U +.word 0x27a9ceeeU, 0xc961b735U, 0xe51ce1edU, 0xb1477a3cU +.word 0xdfd29c59U, 0x73f2553fU, 0xce141879U, 0x37c773bfU +.word 0xcdf753eaU, 0xaafd5f5bU, 0x6f3ddf14U, 0xdb447886U +.word 0xf3afca81U, 0xc468b93eU, 0x3424382cU, 0x40a3c25fU +.word 0xc31d1672U, 0x25e2bc0cU, 0x493c288bU, 0x950dff41U +.word 0x01a83971U, 0xb30c08deU, 0xe4b4d89cU, 0xc1566490U +.word 0x84cb7b61U, 0xb632d570U, 0x5c6c4874U, 0x57b8d042U + +.type AES_Td2,@object +AES_Td2: +.word 0xf45150a7U, 0x417e5365U, 0x171ac3a4U, 0x273a965eU +.word 0xab3bcb6bU, 0x9d1ff145U, 0xfaacab58U, 0xe34b9303U +.word 0x302055faU, 0x76adf66dU, 0xcc889176U, 0x02f5254cU +.word 0xe54ffcd7U, 0x2ac5d7cbU, 0x35268044U, 0x62b58fa3U +.word 0xb1de495aU, 0xba25671bU, 0xea45980eU, 0xfe5de1c0U +.word 0x2fc30275U, 0x4c8112f0U, 0x468da397U, 0xd36bc6f9U +.word 0x8f03e75fU, 0x9215959cU, 0x6dbfeb7aU, 0x5295da59U +.word 0xbed42d83U, 0x7458d321U, 0xe0492969U, 0xc98e44c8U +.word 0xc2756a89U, 0x8ef47879U, 0x58996b3eU, 0xb927dd71U +.word 0xe1beb64fU, 0x88f017adU, 0x20c966acU, 0xce7db43aU +.word 0xdf63184aU, 0x1ae58231U, 0x51976033U, 0x5362457fU +.word 0x64b1e077U, 0x6bbb84aeU, 0x81fe1ca0U, 0x08f9942bU +.word 0x48705868U, 0x458f19fdU, 0xde94876cU, 0x7b52b7f8U +.word 0x73ab23d3U, 0x4b72e202U, 0x1fe3578fU, 0x55662aabU +.word 0xebb20728U, 0xb52f03c2U, 0xc5869a7bU, 0x37d3a508U +.word 0x2830f287U, 0xbf23b2a5U, 0x0302ba6aU, 0x16ed5c82U +.word 0xcf8a2b1cU, 0x79a792b4U, 0x07f3f0f2U, 0x694ea1e2U +.word 0xda65cdf4U, 0x0506d5beU, 0x34d11f62U, 0xa6c48afeU +.word 0x2e349d53U, 0xf3a2a055U, 0x8a0532e1U, 0xf6a475ebU +.word 0x830b39ecU, 0x6040aaefU, 0x715e069fU, 0x6ebd5110U +.word 0x213ef98aU, 0xdd963d06U, 0x3eddae05U, 0xe64d46bdU +.word 0x5491b58dU, 0xc471055dU, 0x06046fd4U, 0x5060ff15U +.word 0x981924fbU, 0xbdd697e9U, 0x4089cc43U, 0xd967779eU +.word 0xe8b0bd42U, 0x8907888bU, 0x19e7385bU, 0xc879dbeeU +.word 0x7ca1470aU, 0x427ce90fU, 0x84f8c91eU, 0x00000000U +.word 0x80098386U, 0x2b3248edU, 0x111eac70U, 0x5a6c4e72U +.word 0x0efdfbffU, 0x850f5638U, 0xae3d1ed5U, 0x2d362739U +.word 0x0f0a64d9U, 0x5c6821a6U, 0x5b9bd154U, 0x36243a2eU +.word 0x0a0cb167U, 0x57930fe7U, 0xeeb4d296U, 0x9b1b9e91U +.word 0xc0804fc5U, 0xdc61a220U, 0x775a694bU, 0x121c161aU +.word 0x93e20abaU, 0xa0c0e52aU, 0x223c43e0U, 0x1b121d17U +.word 0x090e0b0dU, 0x8bf2adc7U, 0xb62db9a8U, 0x1e14c8a9U +.word 0xf1578519U, 0x75af4c07U, 0x99eebbddU, 0x7fa3fd60U +.word 0x01f79f26U, 0x725cbcf5U, 0x6644c53bU, 0xfb5b347eU +.word 0x438b7629U, 0x23cbdcc6U, 0xedb668fcU, 0xe4b863f1U +.word 0x31d7cadcU, 0x63421085U, 0x97134022U, 0xc6842011U +.word 0x4a857d24U, 0xbbd2f83dU, 0xf9ae1132U, 0x29c76da1U +.word 0x9e1d4b2fU, 0xb2dcf330U, 0x860dec52U, 0xc177d0e3U +.word 0xb32b6c16U, 0x70a999b9U, 0x9411fa48U, 0xe9472264U +.word 0xfca8c48cU, 0xf0a01a3fU, 0x7d56d82cU, 0x3322ef90U +.word 0x4987c74eU, 0x38d9c1d1U, 0xca8cfea2U, 0xd498360bU +.word 0xf5a6cf81U, 0x7aa528deU, 0xb7da268eU, 0xad3fa4bfU +.word 0x3a2ce49dU, 0x78500d92U, 0x5f6a9bccU, 0x7e546246U +.word 0x8df6c213U, 0xd890e8b8U, 0x392e5ef7U, 0xc382f5afU +.word 0x5d9fbe80U, 0xd0697c93U, 0xd56fa92dU, 0x25cfb312U +.word 0xacc83b99U, 0x1810a77dU, 0x9ce86e63U, 0x3bdb7bbbU +.word 0x26cd0978U, 0x596ef418U, 0x9aec01b7U, 0x4f83a89aU +.word 0x95e6656eU, 0xffaa7ee6U, 0xbc2108cfU, 0x15efe6e8U +.word 0xe7bad99bU, 0x6f4ace36U, 0x9fead409U, 0xb029d67cU +.word 0xa431afb2U, 0x3f2a3123U, 0xa5c63094U, 0xa235c066U +.word 0x4e7437bcU, 0x82fca6caU, 0x90e0b0d0U, 0xa73315d8U +.word 0x04f14a98U, 0xec41f7daU, 0xcd7f0e50U, 0x91172ff6U +.word 0x4d768dd6U, 0xef434db0U, 0xaacc544dU, 0x96e4df04U +.word 0xd19ee3b5U, 0x6a4c1b88U, 0x2cc1b81fU, 0x65467f51U +.word 0x5e9d04eaU, 0x8c015d35U, 0x87fa7374U, 0x0bfb2e41U +.word 0x67b35a1dU, 0xdb9252d2U, 0x10e93356U, 0xd66d1347U +.word 0xd79a8c61U, 0xa1377a0cU, 0xf8598e14U, 0x13eb893cU +.word 0xa9ceee27U, 0x61b735c9U, 0x1ce1ede5U, 0x477a3cb1U +.word 0xd29c59dfU, 0xf2553f73U, 0x141879ceU, 0xc773bf37U +.word 0xf753eacdU, 0xfd5f5baaU, 0x3ddf146fU, 0x447886dbU +.word 0xafca81f3U, 0x68b93ec4U, 0x24382c34U, 0xa3c25f40U +.word 0x1d1672c3U, 0xe2bc0c25U, 0x3c288b49U, 0x0dff4195U +.word 0xa8397101U, 0x0c08deb3U, 0xb4d89ce4U, 0x566490c1U +.word 0xcb7b6184U, 0x32d570b6U, 0x6c48745cU, 0xb8d04257U + +.type AES_Td3,@object +AES_Td3: +.word 0x5150a7f4U, 0x7e536541U, 0x1ac3a417U, 0x3a965e27U +.word 0x3bcb6babU, 0x1ff1459dU, 0xacab58faU, 0x4b9303e3U +.word 0x2055fa30U, 0xadf66d76U, 0x889176ccU, 0xf5254c02U +.word 0x4ffcd7e5U, 0xc5d7cb2aU, 0x26804435U, 0xb58fa362U +.word 0xde495ab1U, 0x25671bbaU, 0x45980eeaU, 0x5de1c0feU +.word 0xc302752fU, 0x8112f04cU, 0x8da39746U, 0x6bc6f9d3U +.word 0x03e75f8fU, 0x15959c92U, 0xbfeb7a6dU, 0x95da5952U +.word 0xd42d83beU, 0x58d32174U, 0x492969e0U, 0x8e44c8c9U +.word 0x756a89c2U, 0xf478798eU, 0x996b3e58U, 0x27dd71b9U +.word 0xbeb64fe1U, 0xf017ad88U, 0xc966ac20U, 0x7db43aceU +.word 0x63184adfU, 0xe582311aU, 0x97603351U, 0x62457f53U +.word 0xb1e07764U, 0xbb84ae6bU, 0xfe1ca081U, 0xf9942b08U +.word 0x70586848U, 0x8f19fd45U, 0x94876cdeU, 0x52b7f87bU +.word 0xab23d373U, 0x72e2024bU, 0xe3578f1fU, 0x662aab55U +.word 0xb20728ebU, 0x2f03c2b5U, 0x869a7bc5U, 0xd3a50837U +.word 0x30f28728U, 0x23b2a5bfU, 0x02ba6a03U, 0xed5c8216U +.word 0x8a2b1ccfU, 0xa792b479U, 0xf3f0f207U, 0x4ea1e269U +.word 0x65cdf4daU, 0x06d5be05U, 0xd11f6234U, 0xc48afea6U +.word 0x349d532eU, 0xa2a055f3U, 0x0532e18aU, 0xa475ebf6U +.word 0x0b39ec83U, 0x40aaef60U, 0x5e069f71U, 0xbd51106eU +.word 0x3ef98a21U, 0x963d06ddU, 0xddae053eU, 0x4d46bde6U +.word 0x91b58d54U, 0x71055dc4U, 0x046fd406U, 0x60ff1550U +.word 0x1924fb98U, 0xd697e9bdU, 0x89cc4340U, 0x67779ed9U +.word 0xb0bd42e8U, 0x07888b89U, 0xe7385b19U, 0x79dbeec8U +.word 0xa1470a7cU, 0x7ce90f42U, 0xf8c91e84U, 0x00000000U +.word 0x09838680U, 0x3248ed2bU, 0x1eac7011U, 0x6c4e725aU +.word 0xfdfbff0eU, 0x0f563885U, 0x3d1ed5aeU, 0x3627392dU +.word 0x0a64d90fU, 0x6821a65cU, 0x9bd1545bU, 0x243a2e36U +.word 0x0cb1670aU, 0x930fe757U, 0xb4d296eeU, 0x1b9e919bU +.word 0x804fc5c0U, 0x61a220dcU, 0x5a694b77U, 0x1c161a12U +.word 0xe20aba93U, 0xc0e52aa0U, 0x3c43e022U, 0x121d171bU +.word 0x0e0b0d09U, 0xf2adc78bU, 0x2db9a8b6U, 0x14c8a91eU +.word 0x578519f1U, 0xaf4c0775U, 0xeebbdd99U, 0xa3fd607fU +.word 0xf79f2601U, 0x5cbcf572U, 0x44c53b66U, 0x5b347efbU +.word 0x8b762943U, 0xcbdcc623U, 0xb668fcedU, 0xb863f1e4U +.word 0xd7cadc31U, 0x42108563U, 0x13402297U, 0x842011c6U +.word 0x857d244aU, 0xd2f83dbbU, 0xae1132f9U, 0xc76da129U +.word 0x1d4b2f9eU, 0xdcf330b2U, 0x0dec5286U, 0x77d0e3c1U +.word 0x2b6c16b3U, 0xa999b970U, 0x11fa4894U, 0x472264e9U +.word 0xa8c48cfcU, 0xa01a3ff0U, 0x56d82c7dU, 0x22ef9033U +.word 0x87c74e49U, 0xd9c1d138U, 0x8cfea2caU, 0x98360bd4U +.word 0xa6cf81f5U, 0xa528de7aU, 0xda268eb7U, 0x3fa4bfadU +.word 0x2ce49d3aU, 0x500d9278U, 0x6a9bcc5fU, 0x5462467eU +.word 0xf6c2138dU, 0x90e8b8d8U, 0x2e5ef739U, 0x82f5afc3U +.word 0x9fbe805dU, 0x697c93d0U, 0x6fa92dd5U, 0xcfb31225U +.word 0xc83b99acU, 0x10a77d18U, 0xe86e639cU, 0xdb7bbb3bU +.word 0xcd097826U, 0x6ef41859U, 0xec01b79aU, 0x83a89a4fU +.word 0xe6656e95U, 0xaa7ee6ffU, 0x2108cfbcU, 0xefe6e815U +.word 0xbad99be7U, 0x4ace366fU, 0xead4099fU, 0x29d67cb0U +.word 0x31afb2a4U, 0x2a31233fU, 0xc63094a5U, 0x35c066a2U +.word 0x7437bc4eU, 0xfca6ca82U, 0xe0b0d090U, 0x3315d8a7U +.word 0xf14a9804U, 0x41f7daecU, 0x7f0e50cdU, 0x172ff691U +.word 0x768dd64dU, 0x434db0efU, 0xcc544daaU, 0xe4df0496U +.word 0x9ee3b5d1U, 0x4c1b886aU, 0xc1b81f2cU, 0x467f5165U +.word 0x9d04ea5eU, 0x015d358cU, 0xfa737487U, 0xfb2e410bU +.word 0xb35a1d67U, 0x9252d2dbU, 0xe9335610U, 0x6d1347d6U +.word 0x9a8c61d7U, 0x377a0ca1U, 0x598e14f8U, 0xeb893c13U +.word 0xceee27a9U, 0xb735c961U, 0xe1ede51cU, 0x7a3cb147U +.word 0x9c59dfd2U, 0x553f73f2U, 0x1879ce14U, 0x73bf37c7U +.word 0x53eacdf7U, 0x5f5baafdU, 0xdf146f3dU, 0x7886db44U +.word 0xca81f3afU, 0xb93ec468U, 0x382c3424U, 0xc25f40a3U +.word 0x1672c31dU, 0xbc0c25e2U, 0x288b493cU, 0xff41950dU +.word 0x397101a8U, 0x08deb30cU, 0xd89ce4b4U, 0x6490c156U +.word 0x7b6184cbU, 0xd570b632U, 0x48745c6cU, 0xd04257b8U + +.type AES_Td4,@object +AES_Td4: +.byte 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U +.byte 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU +.byte 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U +.byte 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU +.byte 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU +.byte 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU +.byte 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U +.byte 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U +.byte 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U +.byte 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U +.byte 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU +.byte 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U +.byte 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU +.byte 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U +.byte 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U +.byte 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU +.byte 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU +.byte 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U +.byte 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U +.byte 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU +.byte 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U +.byte 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU +.byte 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U +.byte 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U +.byte 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U +.byte 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU +.byte 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU +.byte 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU +.byte 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U +.byte 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U +.byte 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U +.byte 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU + +.type AES_rcon,@object +AES_rcon: +.word 0x00000001U, 0x00000002U, 0x00000004U, 0x00000008U +.word 0x00000010U, 0x00000020U, 0x00000040U, 0x00000080U +.word 0x0000001BU, 0x00000036U diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/buildinf.h new file mode 100644 index 000000000000..017783059eb5 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/buildinf.h @@ -0,0 +1,37 @@ +/* + * WARNING: do not edit! + * Generated by util/mkbuildinf.pl + * + * Copyright 2014-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#define PLATFORM "platform: linux64-riscv64" +#define DATE "built on: Tue Jun 30 04:16:04 2026 UTC" + +/* + * Generate compiler_flags as an array of individual characters. This is a + * workaround for the situation where CFLAGS gets too long for a C90 string + * literal + */ +static const char compiler_flags[] = { + 'c','o','m','p','i','l','e','r',':',' ','.','.','/','c','o','n', + 'f','i','g','/','f','a','k','e','_','g','c','c','.','p','l',' ', + '-','f','P','I','C',' ','-','p','t','h','r','e','a','d',' ','-', + 'W','a',',','-','-','n','o','e','x','e','c','s','t','a','c','k', + ' ','-','W','a','l','l',' ','-','O','3',' ','-','D','O','P','E', + 'N','S','S','L','_','U','S','E','_','N','O','D','E','L','E','T', + 'E',' ','-','D','O','P','E','N','S','S','L','_','P','I','C',' ', + '-','D','O','P','E','N','S','S','L','_','B','U','I','L','D','I', + 'N','G','_','O','P','E','N','S','S','L',' ','-','D','B','R','O', + 'T','L','I',' ','-','D','Z','L','I','B',' ','-','D','Z','S','T', + 'D',' ','-','D','N','D','E','B','U','G',' ','-','I','.','.','/', + '.','.','/','b','r','o','t','l','i','/','c','/','i','n','c','l', + 'u','d','e',' ','-','I','.','.','/','.','.','/','z','l','i','b', + ' ','-','I','.','.','/','.','.','/','z','s','t','d','/','l','i', + 'b','\0' +}; diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/chacha/chacha-riscv64-v-zbb-zvkb.s b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/chacha/chacha-riscv64-v-zbb-zvkb.s new file mode 100644 index 000000000000..6fa723a7934c --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/chacha/chacha-riscv64-v-zbb-zvkb.s @@ -0,0 +1,461 @@ +.text +.p2align 3 +.globl ChaCha20_ctr32_v_zbb_zvkb +.type ChaCha20_ctr32_v_zbb_zvkb,@function +ChaCha20_ctr32_v_zbb_zvkb: + addi sp, sp, -96 + sd s0, 0(sp) + sd s1, 8(sp) + sd s2, 16(sp) + sd s3, 24(sp) + sd s4, 32(sp) + sd s5, 40(sp) + sd s6, 48(sp) + sd s7, 56(sp) + sd s8, 64(sp) + sd s9, 72(sp) + sd s10, 80(sp) + sd s11, 88(sp) + addi sp, sp, -64 + + lw t2, 0(a4) + +.Lblock_loop: + # We will use the scalar ALU for 1 chacha block. + srli t3, a2, 6 + .word 219050839 + slli t4, t1, 6 + bltu t4, a2, 1f + # Since there is no more chacha block existed, we need to split 1 block + # from vector ALU. + addi t4, t1, -1 + .word 219083607 +1: + + #### chacha block data + # init chacha const states into v0~v3 + # "expa" little endian + li a5, 0x61707865 + .word 1577566295 + # "nd 3" little endian + li a6, 0x3320646e + .word 1577599191 + # "2-by" little endian + li a7, 0x79622d32 + .word 1577632087 + # "te k" little endian + li s0, 0x6b206574 + lw s1, 0(a3) + .word 1577337303 + + # init chacha key states into v4~v11 + lw s2, 4(a3) + .word 1577370199 + lw s3, 8(a3) + .word 1577665239 + lw s4, 12(a3) + .word 1577698135 + lw s5, 16(a3) + .word 1577731031 + lw s6, 20(a3) + .word 1577763927 + lw s7, 24(a3) + .word 1577796823 + lw s8, 28(a3) + .word 1577829719 + .word 1577862615 + + # init chacha key states into v12~v13 + lw s10, 4(a4) + .word 1376298583 + lw s11, 8(a4) + .word 46384727 + lw t0, 12(a4) + .word 1577928407 + add s9, t2, t1 + + # init chacha nonce states into v14~v15 + .word 1577961303 + .word 1577240535 + + li t3, 64 + # load the top-half of input data into v16~v23 + .word 3955615751 + + # till now in block_loop, we used: + # - v0~v15 for chacha states. + # - v16~v23 for top-half of input data. + # - v24~v31 haven't been used yet. + + # 20 round groups + li t3, 10 +.Lround_loop: + # we can use v24~v31 as temporary registers in round_loop. + addi t3, t3, -1 + # a += b; d ^= a; d <<<= 16; + .word 33685591 + add a5, a5, s1 + .word 34767063 + add a6, a6, s2 + .word 35848535 + add a7, a7, s3 + .word 36930007 + add s0, s0, s4 + .word 784336471 + xor s9, s9, a5 + .word 785417943 + xor s10, s10, a6 + .word 786499415 + xor s11, s11, a7 + .word 787580887 + xor t0, t0, s0 + .word 1388852823 + .word 1628232859 + .word 1389901527 + .word 1628265755 + .word 1390950231 + .word 1628298651 + .word 1391998935 + .word 1627574939 + + # c += d; b ^= c; b <<<= 12; + .word 42337367 + add s5, s5, s9 + .word 43418839 + add s6, s6, s10 + .word 44500311 + add s7, s7, s11 + .word 45581783 + add s8, s8, t0 + .word 776208983 + xor s1, s1, s5 + .word 777290455 + xor s2, s2, s6 + .word 778371927 + xor s3, s3, s7 + .word 779453399 + xor s4, s4, s8 + .word 1380594263 + .word 1631900827 + .word 1381642967 + .word 1632196891 + .word 1382691671 + .word 1632229787 + .word 1383740375 + .word 1632262683 + + # a += b; d ^= a; d <<<= 8; + .word 33685591 + add a5, a5, s1 + .word 34767063 + add a6, a6, s2 + .word 35848535 + add a7, a7, s3 + .word 36930007 + add s0, s0, s4 + .word 784336471 + xor s9, s9, a5 + .word 785417943 + xor s10, s10, a6 + .word 786499415 + xor s11, s11, a7 + .word 787580887 + xor t0, t0, s0 + .word 1389114967 + .word 1636621467 + .word 1390163671 + .word 1636654363 + .word 1391212375 + .word 1636687259 + .word 1392261079 + .word 1635963547 + + # c += d; b ^= c; b <<<= 7; + .word 42337367 + add s5, s5, s9 + .word 43418839 + add s6, s6, s10 + .word 44500311 + add s7, s7, s11 + .word 45581783 + add s8, s8, t0 + .word 776208983 + xor s1, s1, s5 + .word 777290455 + xor s2, s2, s6 + .word 778371927 + xor s3, s3, s7 + .word 779453399 + xor s4, s4, s8 + .word 1380758103 + .word 1637143707 + .word 1381806807 + .word 1637439771 + .word 1382855511 + .word 1637472667 + .word 1383904215 + .word 1637505563 + + + # a += b; d ^= a; d <<<= 16; + .word 36831703 + add s0, s0, s1 + .word 33718359 + add a5, a5, s2 + .word 34799831 + add a6, a6, s3 + .word 35881303 + add a7, a7, s4 + .word 786532183 + xor s11, s11, s0 + .word 787482583 + xor t0, t0, a5 + .word 784369239 + xor s9, s9, a6 + .word 785450711 + xor s10, s10, a7 + .word 1390950231 + .word 1628298651 + .word 1391998935 + .word 1627574939 + .word 1388852823 + .word 1628232859 + .word 1389901527 + .word 1628265755 + + # c += d; b ^= c; b <<<= 12; + .word 43451607 + add s6, s6, s11 + .word 44533079 + add s7, s7, t0 + .word 45483479 + add s8, s8, s9 + .word 42370135 + add s5, s5, s10 + .word 776241751 + xor s1, s1, s6 + .word 777323223 + xor s2, s2, s7 + .word 778404695 + xor s3, s3, s8 + .word 779355095 + xor s4, s4, s5 + .word 1380594263 + .word 1631900827 + .word 1381642967 + .word 1632196891 + .word 1382691671 + .word 1632229787 + .word 1383740375 + .word 1632262683 + + # a += b; d ^= a; d <<<= 8; + .word 36831703 + add s0, s0, s1 + .word 33718359 + add a5, a5, s2 + .word 34799831 + add a6, a6, s3 + .word 35881303 + add a7, a7, s4 + .word 786532183 + xor s11, s11, s0 + .word 787482583 + xor t0, t0, a5 + .word 784369239 + xor s9, s9, a6 + .word 785450711 + xor s10, s10, a7 + .word 1391212375 + .word 1636687259 + .word 1392261079 + .word 1635963547 + .word 1389114967 + .word 1636621467 + .word 1390163671 + .word 1636654363 + + # c += d; b ^= c; b <<<= 7; + .word 43451607 + add s6, s6, s11 + .word 44533079 + add s7, s7, t0 + .word 45483479 + add s8, s8, s9 + .word 42370135 + add s5, s5, s10 + .word 776241751 + xor s1, s1, s6 + .word 777323223 + xor s2, s2, s7 + .word 778404695 + xor s3, s3, s8 + .word 779355095 + xor s4, s4, s5 + .word 1380758103 + .word 1637143707 + .word 1381806807 + .word 1637439771 + .word 1382855511 + .word 1637472667 + .word 1383904215 + .word 1637505563 + + + bnez t3, .Lround_loop + + li t3, 64 + # load the bottom-half of input data into v24~v31 + addi t4, a1, 32 + .word 3956206599 + + # now, there are no free vector registers until the round_loop exits. + + # add chacha top-half initial block states + # "expa" little endian + li t3, 0x61707865 + .word 34488407 + add a5, a5, t3 + # "nd 3" little endian + li t4, 0x3320646e + .word 35569879 + add a6, a6, t4 + lw t3, 0(a3) + # "2-by" little endian + li t5, 0x79622d32 + .word 36651351 + add a7, a7, t5 + lw t4, 4(a3) + # "te k" little endian + li t6, 0x6b206574 + .word 37732823 + add s0, s0, t6 + lw t5, 8(a3) + .word 38683223 + add s1, s1, t3 + lw t6, 12(a3) + .word 39764695 + add s2, s2, t4 + .word 40846167 + add s3, s3, t5 + .word 41927639 + add s4, s4, t6 + + # xor with the top-half input + .word 788531287 + sw a5, 0(sp) + sw a6, 4(sp) + .word 789612759 + sw a7, 8(sp) + sw s0, 12(sp) + .word 790694231 + sw s1, 16(sp) + sw s2, 20(sp) + .word 791775703 + sw s3, 24(sp) + sw s4, 28(sp) + .word 792857175 + lw t3, 16(a3) + .word 793938647 + lw t4, 20(a3) + .word 795020119 + lw t5, 24(a3) + .word 796101591 + + # save the top-half of output from v16~v23 + li t6, 64 + .word 3958728743 + + # add chacha bottom-half initial block states + .word 42878039 + add s5, s5, t3 + lw t6, 28(a3) + .word 43959511 + add s6, s6, t4 + lw t3, 4(a4) + .word 45040983 + add s7, s7, t5 + lw t4, 8(a4) + .word 46122455 + add s8, s8, t6 + lw t5, 12(a4) + .word 1376297047 + add s9, s9, t2 + .word 46384727 + add s9, s9, t1 + .word 48121559 + add s10, s10, t3 + .word 49203031 + add s11, s11, t4 + .word 50284503 + add t0, t0, t5 + .word 46138967 + # xor with the bottom-half input + .word 797183063 + sw s5, 32(sp) + .word 798264535 + sw s6, 36(sp) + .word 799346007 + sw s7, 40(sp) + .word 800427479 + sw s8, 44(sp) + .word 802590423 + sw s9, 48(sp) + .word 801508951 + sw s10, 52(sp) + .word 803671895 + sw s11, 56(sp) + .word 804753367 + sw t0, 60(sp) + + # save the bottom-half of output from v24~v31 + li t3, 64 + addi t4, a0, 32 + .word 3956206631 + + # the computed vector parts: `64 * VL` + slli t3, t1, 6 + + add a1, a1, t3 + add a0, a0, t3 + sub a2, a2, t3 + add t2, t2, t1 + + # process the scalar data block + addi t2, t2, 1 + li t3, 64 + .word 197549747 + sub a2, a2, t4 + mv t5, sp +.Lscalar_data_loop: + .word 205452119 + # from this on, vector registers are grouped with lmul = 8 + .word 33915911 + .word 34539527 + .word 780665943 + .word 33883175 + add a1, a1, t1 + add a0, a0, t1 + add t5, t5, t1 + sub t4, t4, t1 + bnez t4, .Lscalar_data_loop + + bnez a2, .Lblock_loop + + addi sp, sp, 64 + ld s0, 0(sp) + ld s1, 8(sp) + ld s2, 16(sp) + ld s3, 24(sp) + ld s4, 32(sp) + ld s5, 40(sp) + ld s6, 48(sp) + ld s7, 56(sp) + ld s8, 64(sp) + ld s9, 72(sp) + ld s10, 80(sp) + ld s11, 88(sp) + addi sp, sp, 96 + + ret +.size ChaCha20_ctr32_v_zbb_zvkb,.-ChaCha20_ctr32_v_zbb_zvkb diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/chacha/chacha-riscv64-v-zbb.s b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/chacha/chacha-riscv64-v-zbb.s new file mode 100644 index 000000000000..e543c8e9ce10 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/chacha/chacha-riscv64-v-zbb.s @@ -0,0 +1,525 @@ +.text +.p2align 3 +.globl ChaCha20_ctr32_v_zbb +.type ChaCha20_ctr32_v_zbb,@function +ChaCha20_ctr32_v_zbb: + addi sp, sp, -96 + sd s0, 0(sp) + sd s1, 8(sp) + sd s2, 16(sp) + sd s3, 24(sp) + sd s4, 32(sp) + sd s5, 40(sp) + sd s6, 48(sp) + sd s7, 56(sp) + sd s8, 64(sp) + sd s9, 72(sp) + sd s10, 80(sp) + sd s11, 88(sp) + addi sp, sp, -64 + + lw t2, 0(a4) + +.Lblock_loop: + # We will use the scalar ALU for 1 chacha block. + srli t3, a2, 6 + .word 219050839 + slli t4, t1, 6 + bltu t4, a2, 1f + # Since there is no more chacha block existed, we need to split 1 block + # from vector ALU. + addi t4, t1, -1 + .word 219083607 +1: + + #### chacha block data + # init chacha const states into v0~v3 + # "expa" little endian + li a5, 0x61707865 + .word 1577566295 + # "nd 3" little endian + li a6, 0x3320646e + .word 1577599191 + # "2-by" little endian + li a7, 0x79622d32 + .word 1577632087 + # "te k" little endian + li s0, 0x6b206574 + lw s1, 0(a3) + .word 1577337303 + + # init chacha key states into v4~v11 + lw s2, 4(a3) + .word 1577370199 + lw s3, 8(a3) + .word 1577665239 + lw s4, 12(a3) + .word 1577698135 + lw s5, 16(a3) + .word 1577731031 + lw s6, 20(a3) + .word 1577763927 + lw s7, 24(a3) + .word 1577796823 + lw s8, 28(a3) + .word 1577829719 + .word 1577862615 + + # init chacha key states into v12~v13 + lw s10, 4(a4) + .word 1376298583 + lw s11, 8(a4) + .word 46384727 + lw t0, 12(a4) + .word 1577928407 + add s9, t2, t1 + + # init chacha nonce states into v14~v15 + .word 1577961303 + .word 1577240535 + + li t3, 64 + # load the top-half of input data into v16~v23 + .word 3955615751 + + # till now in block_loop, we used: + # - v0~v15 for chacha states. + # - v16~v23 for top-half of input data. + # - v24~v31 haven't been used yet. + + # 20 round groups + li t3, 10 +.Lround_loop: + # we can use v24~v31 as temporary registers in round_loop. + addi t3, t3, -1 + # a += b; d ^= a; d <<<= 16; + .word 33685591 + add a5, a5, s1 + .word 34767063 + add a6, a6, s2 + .word 35848535 + add a7, a7, s3 + .word 36930007 + add s0, s0, s4 + .word 784336471 + xor s9, s9, a5 + .word 785417943 + xor s10, s10, a6 + .word 786499415 + xor s11, s11, a7 + .word 787580887 + xor t0, t0, s0 + .word 2529705047 + .word 2530753751 + .word 2531802455 + .word 2532851159 + .word 2731030103 + .word 2732078807 + .word 2733127511 + .word 2734176215 + .word 718014039 + .word 1628232859 + .word 719095511 + .word 1628265755 + .word 720176983 + .word 1628298651 + .word 721258455 + .word 1627574939 + + # c += d; b ^= c; b <<<= 12; + .word 42337367 + add s5, s5, s9 + .word 43418839 + add s6, s6, s10 + .word 44500311 + add s7, s7, s11 + .word 45581783 + add s8, s8, t0 + .word 776208983 + xor s1, s1, s5 + .word 777290455 + xor s2, s2, s6 + .word 778371927 + xor s3, s3, s7 + .word 779453399 + xor s4, s4, s8 + .word 2521185367 + .word 2522234071 + .word 2523282775 + .word 2524331479 + .word 2722771543 + .word 2723820247 + .word 2724868951 + .word 2725917655 + .word 709624407 + .word 1631900827 + .word 710705879 + .word 1632196891 + .word 711787351 + .word 1632229787 + .word 712868823 + .word 1632262683 + + # a += b; d ^= a; d <<<= 8; + .word 33685591 + add a5, a5, s1 + .word 34767063 + add a6, a6, s2 + .word 35848535 + add a7, a7, s3 + .word 36930007 + add s0, s0, s4 + .word 784336471 + xor s9, s9, a5 + .word 785417943 + xor s10, s10, a6 + .word 786499415 + xor s11, s11, a7 + .word 787580887 + xor t0, t0, s0 + .word 2529442903 + .word 2530491607 + .word 2531540311 + .word 2532589015 + .word 2731292247 + .word 2732340951 + .word 2733389655 + .word 2734438359 + .word 718014039 + .word 1636621467 + .word 719095511 + .word 1636654363 + .word 720176983 + .word 1636687259 + .word 721258455 + .word 1635963547 + + # c += d; b ^= c; b <<<= 7; + .word 42337367 + add s5, s5, s9 + .word 43418839 + add s6, s6, s10 + .word 44500311 + add s7, s7, s11 + .word 45581783 + add s8, s8, t0 + .word 776208983 + xor s1, s1, s5 + .word 777290455 + xor s2, s2, s6 + .word 778371927 + xor s3, s3, s7 + .word 779453399 + xor s4, s4, s8 + .word 2521021527 + .word 2522070231 + .word 2523118935 + .word 2524167639 + .word 2722935383 + .word 2723984087 + .word 2725032791 + .word 2726081495 + .word 709624407 + .word 1637143707 + .word 710705879 + .word 1637439771 + .word 711787351 + .word 1637472667 + .word 712868823 + .word 1637505563 + + + # a += b; d ^= a; d <<<= 16; + .word 36831703 + add s0, s0, s1 + .word 33718359 + add a5, a5, s2 + .word 34799831 + add a6, a6, s3 + .word 35881303 + add a7, a7, s4 + .word 786532183 + xor s11, s11, s0 + .word 787482583 + xor t0, t0, a5 + .word 784369239 + xor s9, s9, a6 + .word 785450711 + xor s10, s10, a7 + .word 2531802199 + .word 2532850903 + .word 2529705303 + .word 2530754007 + .word 2733127511 + .word 2734176215 + .word 2731030103 + .word 2732078807 + .word 720111447 + .word 1628298651 + .word 721192919 + .word 1627574939 + .word 718079575 + .word 1628232859 + .word 719161047 + .word 1628265755 + + # c += d; b ^= c; b <<<= 12; + .word 43451607 + add s6, s6, s11 + .word 44533079 + add s7, s7, t0 + .word 45483479 + add s8, s8, s9 + .word 42370135 + add s5, s5, s10 + .word 776241751 + xor s1, s1, s6 + .word 777323223 + xor s2, s2, s7 + .word 778404695 + xor s3, s3, s8 + .word 779355095 + xor s4, s4, s5 + .word 2521185367 + .word 2522234071 + .word 2523282775 + .word 2524331479 + .word 2722771543 + .word 2723820247 + .word 2724868951 + .word 2725917655 + .word 709624407 + .word 1631900827 + .word 710705879 + .word 1632196891 + .word 711787351 + .word 1632229787 + .word 712868823 + .word 1632262683 + + # a += b; d ^= a; d <<<= 8; + .word 36831703 + add s0, s0, s1 + .word 33718359 + add a5, a5, s2 + .word 34799831 + add a6, a6, s3 + .word 35881303 + add a7, a7, s4 + .word 786532183 + xor s11, s11, s0 + .word 787482583 + xor t0, t0, a5 + .word 784369239 + xor s9, s9, a6 + .word 785450711 + xor s10, s10, a7 + .word 2531540055 + .word 2532588759 + .word 2529443159 + .word 2530491863 + .word 2733389655 + .word 2734438359 + .word 2731292247 + .word 2732340951 + .word 720111447 + .word 1636687259 + .word 721192919 + .word 1635963547 + .word 718079575 + .word 1636621467 + .word 719161047 + .word 1636654363 + + # c += d; b ^= c; b <<<= 7; + .word 43451607 + add s6, s6, s11 + .word 44533079 + add s7, s7, t0 + .word 45483479 + add s8, s8, s9 + .word 42370135 + add s5, s5, s10 + .word 776241751 + xor s1, s1, s6 + .word 777323223 + xor s2, s2, s7 + .word 778404695 + xor s3, s3, s8 + .word 779355095 + xor s4, s4, s5 + .word 2521021527 + .word 2522070231 + .word 2523118935 + .word 2524167639 + .word 2722935383 + .word 2723984087 + .word 2725032791 + .word 2726081495 + .word 709624407 + .word 1637143707 + .word 710705879 + .word 1637439771 + .word 711787351 + .word 1637472667 + .word 712868823 + .word 1637505563 + + + bnez t3, .Lround_loop + + li t3, 64 + # load the bottom-half of input data into v24~v31 + addi t4, a1, 32 + .word 3956206599 + + # now, there are no free vector registers until the round_loop exits. + + # add chacha top-half initial block states + # "expa" little endian + li t3, 0x61707865 + .word 34488407 + add a5, a5, t3 + # "nd 3" little endian + li t4, 0x3320646e + .word 35569879 + add a6, a6, t4 + lw t3, 0(a3) + # "2-by" little endian + li t5, 0x79622d32 + .word 36651351 + add a7, a7, t5 + lw t4, 4(a3) + # "te k" little endian + li t6, 0x6b206574 + .word 37732823 + add s0, s0, t6 + lw t5, 8(a3) + .word 38683223 + add s1, s1, t3 + lw t6, 12(a3) + .word 39764695 + add s2, s2, t4 + .word 40846167 + add s3, s3, t5 + .word 41927639 + add s4, s4, t6 + + # xor with the top-half input + .word 788531287 + sw a5, 0(sp) + sw a6, 4(sp) + .word 789612759 + sw a7, 8(sp) + sw s0, 12(sp) + .word 790694231 + sw s1, 16(sp) + sw s2, 20(sp) + .word 791775703 + sw s3, 24(sp) + sw s4, 28(sp) + .word 792857175 + lw t3, 16(a3) + .word 793938647 + lw t4, 20(a3) + .word 795020119 + lw t5, 24(a3) + .word 796101591 + + # save the top-half of output from v16~v23 + li t6, 64 + .word 3958728743 + + # add chacha bottom-half initial block states + .word 42878039 + add s5, s5, t3 + lw t6, 28(a3) + .word 43959511 + add s6, s6, t4 + lw t3, 4(a4) + .word 45040983 + add s7, s7, t5 + lw t4, 8(a4) + .word 46122455 + add s8, s8, t6 + lw t5, 12(a4) + .word 1376297047 + add s9, s9, t2 + .word 46384727 + add s9, s9, t1 + .word 48121559 + add s10, s10, t3 + .word 49203031 + add s11, s11, t4 + .word 50284503 + add t0, t0, t5 + .word 46138967 + # xor with the bottom-half input + .word 797183063 + sw s5, 32(sp) + .word 798264535 + sw s6, 36(sp) + .word 799346007 + sw s7, 40(sp) + .word 800427479 + sw s8, 44(sp) + .word 802590423 + sw s9, 48(sp) + .word 801508951 + sw s10, 52(sp) + .word 803671895 + sw s11, 56(sp) + .word 804753367 + sw t0, 60(sp) + + # save the bottom-half of output from v24~v31 + li t3, 64 + addi t4, a0, 32 + .word 3956206631 + + # the computed vector parts: `64 * VL` + slli t3, t1, 6 + + add a1, a1, t3 + add a0, a0, t3 + sub a2, a2, t3 + add t2, t2, t1 + + # process the scalar data block + addi t2, t2, 1 + li t3, 64 + .word 197549747 + sub a2, a2, t4 + mv t5, sp +.Lscalar_data_loop: + .word 205452119 + # from this on, vector registers are grouped with lmul = 8 + .word 33915911 + .word 34539527 + .word 780665943 + .word 33883175 + add a1, a1, t1 + add a0, a0, t1 + add t5, t5, t1 + sub t4, t4, t1 + bnez t4, .Lscalar_data_loop + + bnez a2, .Lblock_loop + + addi sp, sp, 64 + ld s0, 0(sp) + ld s1, 8(sp) + ld s2, 16(sp) + ld s3, 24(sp) + ld s4, 32(sp) + ld s5, 40(sp) + ld s6, 48(sp) + ld s7, 56(sp) + ld s8, 64(sp) + ld s9, 72(sp) + ld s10, 80(sp) + ld s11, 88(sp) + addi sp, sp, 96 + + ret +.size ChaCha20_ctr32_v_zbb,.-ChaCha20_ctr32_v_zbb diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s new file mode 100644 index 000000000000..6c1c5e1c7e28 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s @@ -0,0 +1,1540 @@ +.text +.p2align 3 +.globl rv64i_zvkb_zvkg_zvkned_aes_gcm_encrypt +.type rv64i_zvkb_zvkg_zvkned_aes_gcm_encrypt,@function +rv64i_zvkb_zvkg_zvkned_aes_gcm_encrypt: + srli t0, a2, 4 + beqz t0, .Lenc_end + slli t5, t0, 2 + + mv a7, t5 + + # Compute the AES-GCM full-block e32 length for `LMUL=4`. We will handle + # the multiple AES-GCM blocks at the same time within `LMUL=4` register. + # The AES-GCM's SEW is e32 and EGW is 128 bits. + # FULL_BLOCK_LEN32 = (VLEN*LMUL)/(EGW) * (EGW/SEW) = (VLEN*4)/(32*4) * 4 + # = (VLEN*4)/32 + # We could get the block_num using the VL value of `vsetvli with e32, m4`. + .word 220231767 + # If `LEN32 % FULL_BLOCK_LEN32` is not equal to zero, we could fill the + # zero padding data to make sure we could always handle FULL_BLOCK_LEN32 + # blocks for all iterations. + + ## Prepare the H^n multiplier in v16 for GCM multiplier. The `n` is the gcm + ## block number in a LMUL=4 register group. + ## n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) + ## = (VLEN/32) + ## We could use vsetvli with `e32, m1` to compute the `n` number. + .word 218133207 + + # The H is at `gcm128_context.Htable[0]`(addr(Xi)+16*2). + addi t1, a5, 32 + .word 3439489111 + .word 33779591 + + # Compute the H^n + li t1, 1 +1: + .word 2750984183 + slli t1, t1, 1 + bltu t1, t0, 1b + + .word 220754007 + .word 1577072727 + .word 2817763447 + + #### Load plaintext into v24 and handle padding. We also load the init tag + #### data into v20 and prepare the AES ctr input data into v12 and v28. + .word 1577073239 + + ## Prepare the AES ctr input data into v12. + # Setup ctr input mask. + # ctr mask : [000100010001....] + # Note: The actual vl should be `FULL_BLOCK_LEN32/4 * 2`, but we just use + # `FULL_BLOCK_LEN32` here. + .word 201879639 + li t0, 0b10001000 + .word 1577238615 + # Load IV. + .word 3439489111 + .word 34041735 + # Convert the big-endian counter into little-endian. + .word 3305271383 + .word 1240772567 + # Splat the `single block of IV` to v12 + .word 220754007 + .word 1577072215 + .word 2817762935 + # Prepare the ctr counter into v8 + # v8: [x, x, x, 0, x, x, x, 1, x, x, x, 2, ...] + .word 1342710871 + # Merge IV and ctr counter into v12. + # v12:[x, x, x, count+0, x, x, x, count+1, ...] + .word 86536279 + .word 12846679 + + li t4, 0 + # Get the SEW32 size in the first round. + # If we have the non-zero value for `LEN32&(FULL_BLOCK_LEN32-1)`, then + # we will have the leading padding zero. + addi t0, a6, -1 + and t0, t0, t5 + beqz t0, 1f + + ## with padding + sub t5, t5, t0 + sub t4, a6, t0 + # padding block size + srli t1, t4, 2 + # padding byte size + slli t2, t4, 2 + + # Adjust the ctr counter to make the counter start from `counter+0` for the + # first non-padding block. + .word 86536279 + .word 147015255 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + .word 1237626455 + + # Prepare the mask for input loading in the first round. We use + # `VL=FULL_BLOCK_LEN32` with the mask in the first round. + # Adjust input ptr. + sub a0, a0, t2 + # Adjust output ptr. + sub a1, a1, t2 + .word 211316823 + .word 1376297303 + # We don't use the pseudo instruction `vmsgeu` here. Use `vmsgtu` instead. + # The original code is: + # vmsgeu.vx v0, v2, t4 + addi t0, t4, -1 + .word 2049097815 + .word 220754007 + .word 1577073751 + # Load the input for length FULL_BLOCK_LEN32 with mask. + .word 86536279 + .word 355335 + + # Load the init `Xi` data to v20 with preceding zero padding. + # Adjust Xi ptr. + sub t0, a5, t2 + # Load for length `zero-padding-e32-length + 4`. + addi t1, t4, 4 + .word 19099735 + .word 190983 + j 2f + +1: + ## without padding + sub t5, t5, a6 + + .word 220754007 + .word 33909767 + + # Load the init Xi data to v20. + .word 3372380247 + .word 34073095 + + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 86536279 + .word 1577455191 + .word 1237626455 +2: + + + # Load number of rounds + lwu t0, 240(a3) + li t1, 14 + li t2, 12 + li t3, 10 + + beq t0, t1, aes_gcm_enc_blocks_256 + beq t0, t2, aes_gcm_enc_blocks_192 + beq t0, t3, aes_gcm_enc_blocks_128 + +.Lenc_end: + li a0, 0 + ret + +.size rv64i_zvkb_zvkg_zvkned_aes_gcm_encrypt,.-rv64i_zvkb_zvkg_zvkned_aes_gcm_encrypt +.p2align 3 +aes_gcm_enc_blocks_128: + srli t6, a6, 2 + slli t0, a6, 2 + + # Load all 11 aes round keys to v1-v11 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + # We already have the ciphertext/plaintext and ctr data for the first round. + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr result. + .word 801902167 + + bnez t4, 1f + + ## without padding + # Store ciphertext/plaintext + .word 33943079 + j 2f + + ## with padding +1: + # Store ciphertext/plaintext using mask + .word 388647 + + # Fill zero for the padding blocks + .word 154071127 + .word 1577074263 + + # We have used mask register for `INPUT_PADDING_MASK` before. We need to + # setup the ctr mask back. + # ctr mask : [000100010001....] + .word 201879639 + li t1, 0b10001000 + .word 1577271383 +2: + + + + add a0, a0, t0 + add a1, a1, t0 + + + .word 220754007 + +.Lenc_blocks_128: + # Compute the partial tags. + # The partial tags will multiply with [H^n, H^n, ..., H^n] + # [tag0, tag1, ...] = + # ([tag0, tag1, ...] + [ciphertext0, ciphertext1, ...] * [H^n, H^n, ..., H^n] + # We will skip the [H^n, H^n, ..., H^n] multiplication for the last round. + beqz t5, .Lenc_blocks_128_end + .word 3004050039 + + .word 86536279 + # Increase ctr in v12. + .word 13616727 + sub t5, t5, a6 + # Load plaintext into v24 + .word 220229719 + .word 33909767 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + add a0, a0, t0 + .word 86011991 + .word 1237626455 + + + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr ciphertext result. + .word 801902167 + + # Store ciphertext + .word 33943079 + add a1, a1, t0 + + j .Lenc_blocks_128 +.Lenc_blocks_128_end: + + # Add ciphertext into partial tag + .word 793643607 + + .word 3441586263 + # Update current ctr value to v12 + .word 13616727 + # Convert ctr to big-endian counter. + .word 1220847191 + .word 484903 + + + # The H is at `gcm128_context.Htable[0]` (addr(Xi)+16*2). + # Load H to v1 + addi t1, a5, 32 + .word 3439489111 + .word 33775751 + # Multiply H for each partial tag and XOR them together. + # Handle 1st partial tag + .word 1577713751 + .word 2719522935 + # Handle 2nd to N-th partial tags + li t1, 4 +1: + .word 3441586263 + .word 1061372503 + .word 3439489111 + .word 2987532407 + addi t1, t1, 4 + blt t1, a6, 1b + + + # Save the final tag + .word 34070567 + + # return the processed size. + slli a0, a7, 2 + ret +.size aes_gcm_enc_blocks_128,.-aes_gcm_enc_blocks_128 +.p2align 3 +aes_gcm_enc_blocks_192: + srli t6, a6, 2 + slli t0, a6, 2 + + # We run out of 32 vector registers, so we just preserve some round keys + # and load the remaining round keys inside the aes body. + # We keep the round keys for: + # 1, 2, 3, 5, 6, 7, 9, 10, 11 and 12th keys. + # The following keys will be loaded in the aes body: + # 4, 8 and 13th keys. + .word 3439489111 + # key 1 + .word 34005127 + # key 2 + addi t1, a3, 16 + .word 33775879 + # key 3 + addi t1, a3, 32 + .word 33776007 + # key 5 + addi t1, a3, 64 + .word 33776135 + # key 6 + addi t1, a3, 80 + .word 33776263 + # key 7 + addi t1, a3, 96 + .word 33776391 + # key 9 + addi t1, a3, 128 + .word 33776519 + # key 10 + addi t1, a3, 144 + .word 33776647 + # key 11 + addi t1, a3, 160 + .word 33776775 + # key 12 + addi t1, a3, 176 + .word 33776903 + + # We already have the ciphertext/plaintext and ctr data for the first round. + # Load key 4 + .word 3439489111 + addi t1, a3, 48 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2796629623 + # Load key 8 + .word 3439489111 + addi t1, a3, 112 + .word 33777031 + .word 220754007 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 13 + .word 3439489111 + addi t1, a3, 192 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr result. + .word 801902167 + + bnez t4, 1f + + ## without padding + # Store ciphertext/plaintext + .word 33943079 + j 2f + + ## with padding +1: + # Store ciphertext/plaintext using mask + .word 388647 + + # Fill zero for the padding blocks + .word 154071127 + .word 1577074263 + + # We have used mask register for `INPUT_PADDING_MASK` before. We need to + # setup the ctr mask back. + # ctr mask : [000100010001....] + .word 201879639 + li t1, 0b10001000 + .word 1577271383 +2: + + + + add a0, a0, t0 + add a1, a1, t0 + + + .word 220754007 + +.Lenc_blocks_192: + # Compute the partial tags. + # The partial tags will multiply with [H^n, H^n, ..., H^n] + # [tag0, tag1, ...] = + # ([tag0, tag1, ...] + [ciphertext0, ciphertext1, ...] * [H^n, H^n, ..., H^n] + # We will skip the [H^n, H^n, ..., H^n] multiplication for the last round. + beqz t5, .Lenc_blocks_192_end + .word 3004050039 + + .word 86536279 + # Increase ctr in v12. + .word 13616727 + sub t5, t5, a6 + # Load plaintext into v24 + .word 220229719 + .word 33909767 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + add a0, a0, t0 + .word 86011991 + .word 1237626455 + + + # Load key 4 + .word 3439489111 + addi t1, a3, 48 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2796629623 + # Load key 8 + .word 3439489111 + addi t1, a3, 112 + .word 33777031 + .word 220754007 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 13 + .word 3439489111 + addi t1, a3, 192 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr ciphertext result. + .word 801902167 + + # Store ciphertext + .word 33943079 + add a1, a1, t0 + + j .Lenc_blocks_192 +.Lenc_blocks_192_end: + + # Add ciphertext into partial tag + .word 793643607 + + .word 3441586263 + # Update current ctr value to v12 + .word 13616727 + # Convert ctr to big-endian counter. + .word 1220847191 + .word 484903 + + + # The H is at `gcm128_context.Htable[0]` (addr(Xi)+16*2). + # Load H to v1 + addi t1, a5, 32 + .word 3439489111 + .word 33775751 + # Multiply H for each partial tag and XOR them together. + # Handle 1st partial tag + .word 1577713751 + .word 2719522935 + # Handle 2nd to N-th partial tags + li t1, 4 +1: + .word 3441586263 + .word 1061372503 + .word 3439489111 + .word 2987532407 + addi t1, t1, 4 + blt t1, a6, 1b + + + # Save the final tag + .word 34070567 + + # return the processed size. + slli a0, a7, 2 + ret +.size aes_gcm_enc_blocks_192,.-aes_gcm_enc_blocks_192 +.p2align 3 +aes_gcm_enc_blocks_256: + srli t6, a6, 2 + slli t0, a6, 2 + + # We run out of 32 vector registers, so we just preserve some round keys + # and load the remaining round keys inside the aes body. + # We keep the round keys for: + # 1, 2, 4, 5, 7, 8, 10, 11, 13 and 14th keys. + # The following keys will be loaded in the aes body: + # 3, 6, 9, 12 and 15th keys. + .word 3439489111 + # key 1 + .word 34005127 + # key 2 + addi t1, a3, 16 + .word 33775879 + # key 4 + addi t1, a3, 48 + .word 33776007 + # key 5 + addi t1, a3, 64 + .word 33776135 + # key 7 + addi t1, a3, 96 + .word 33776263 + # key 8 + addi t1, a3, 112 + .word 33776391 + # key 10 + addi t1, a3, 144 + .word 33776519 + # key 11 + addi t1, a3, 160 + .word 33776647 + # key 13 + addi t1, a3, 192 + .word 33776775 + # key 14 + addi t1, a3, 208 + .word 33776903 + + # We already have the ciphertext/plaintext and ctr data for the first round. + # Load key 3 + .word 3439489111 + addi t1, a3, 32 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2796629623 + # Load key 6 + .word 3439489111 + addi t1, a3, 80 + .word 33777031 + .word 220754007 + .word 2788241015 + .word 2789289591 + .word 2796629623 + # Load key 9 + .word 3439489111 + addi t1, a3, 128 + .word 33777031 + .word 220754007 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 12 + .word 3439489111 + addi t1, a3, 176 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2796629623 + # Load key 15 + .word 3439489111 + addi t1, a3, 224 + .word 33777031 + .word 220754007 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr result. + .word 801902167 + + bnez t4, 1f + + ## without padding + # Store ciphertext/plaintext + .word 33943079 + j 2f + + ## with padding +1: + # Store ciphertext/plaintext using mask + .word 388647 + + # Fill zero for the padding blocks + .word 154071127 + .word 1577074263 + + # We have used mask register for `INPUT_PADDING_MASK` before. We need to + # setup the ctr mask back. + # ctr mask : [000100010001....] + .word 201879639 + li t1, 0b10001000 + .word 1577271383 +2: + + + + add a0, a0, t0 + add a1, a1, t0 + + + .word 220754007 + +.Lenc_blocks_256: + # Compute the partial tags. + # The partial tags will multiply with [H^n, H^n, ..., H^n] + # [tag0, tag1, ...] = + # ([tag0, tag1, ...] + [ciphertext0, ciphertext1, ...] * [H^n, H^n, ..., H^n] + # We will skip the [H^n, H^n, ..., H^n] multiplication for the last round. + beqz t5, .Lenc_blocks_256_end + .word 3004050039 + + .word 86536279 + # Increase ctr in v12. + .word 13616727 + sub t5, t5, a6 + # Load plaintext into v24 + .word 220229719 + .word 33909767 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + add a0, a0, t0 + .word 86011991 + .word 1237626455 + + + # Load key 3 + .word 3439489111 + addi t1, a3, 32 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2796629623 + # Load key 6 + .word 3439489111 + addi t1, a3, 80 + .word 33777031 + .word 220754007 + .word 2788241015 + .word 2789289591 + .word 2796629623 + # Load key 9 + .word 3439489111 + addi t1, a3, 128 + .word 33777031 + .word 220754007 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 12 + .word 3439489111 + addi t1, a3, 176 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2796629623 + # Load key 15 + .word 3439489111 + addi t1, a3, 224 + .word 33777031 + .word 220754007 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr ciphertext result. + .word 801902167 + + # Store ciphertext + .word 33943079 + add a1, a1, t0 + + j .Lenc_blocks_256 +.Lenc_blocks_256_end: + + # Add ciphertext into partial tag + .word 793643607 + + .word 3441586263 + # Update current ctr value to v12 + .word 13616727 + # Convert ctr to big-endian counter. + .word 1220847191 + .word 484903 + + + # The H is at `gcm128_context.Htable[0]` (addr(Xi)+16*2). + # Load H to v1 + addi t1, a5, 32 + .word 3439489111 + .word 33775751 + # Multiply H for each partial tag and XOR them together. + # Handle 1st partial tag + .word 1577713751 + .word 2719522935 + # Handle 2nd to N-th partial tags + li t1, 4 +1: + .word 3441586263 + .word 1061372503 + .word 3439489111 + .word 2987532407 + addi t1, t1, 4 + blt t1, a6, 1b + + + # Save the final tag + .word 34070567 + + # return the processed size. + slli a0, a7, 2 + ret +.size aes_gcm_enc_blocks_256,.-aes_gcm_enc_blocks_256 +.p2align 3 +.globl rv64i_zvkb_zvkg_zvkned_aes_gcm_decrypt +.type rv64i_zvkb_zvkg_zvkned_aes_gcm_decrypt,@function +rv64i_zvkb_zvkg_zvkned_aes_gcm_decrypt: + srli t0, a2, 4 + beqz t0, .Ldec_end + slli t5, t0, 2 + + mv a7, t5 + + # Compute the AES-GCM full-block e32 length for `LMUL=4`. We will handle + # the multiple AES-GCM blocks at the same time within `LMUL=4` register. + # The AES-GCM's SEW is e32 and EGW is 128 bits. + # FULL_BLOCK_LEN32 = (VLEN*LMUL)/(EGW) * (EGW/SEW) = (VLEN*4)/(32*4) * 4 + # = (VLEN*4)/32 + # We could get the block_num using the VL value of `vsetvli with e32, m4`. + .word 220231767 + # If `LEN32 % FULL_BLOCK_LEN32` is not equal to zero, we could fill the + # zero padding data to make sure we could always handle FULL_BLOCK_LEN32 + # blocks for all iterations. + + ## Prepare the H^n multiplier in v16 for GCM multiplier. The `n` is the gcm + ## block number in a LMUL=4 register group. + ## n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4)) + ## = (VLEN/32) + ## We could use vsetvli with `e32, m1` to compute the `n` number. + .word 218133207 + + # The H is at `gcm128_context.Htable[0]`(addr(Xi)+16*2). + addi t1, a5, 32 + .word 3439489111 + .word 33779591 + + # Compute the H^n + li t1, 1 +1: + .word 2750984183 + slli t1, t1, 1 + bltu t1, t0, 1b + + .word 220754007 + .word 1577072727 + .word 2817763447 + + #### Load plaintext into v24 and handle padding. We also load the init tag + #### data into v20 and prepare the AES ctr input data into v12 and v28. + .word 1577073239 + + ## Prepare the AES ctr input data into v12. + # Setup ctr input mask. + # ctr mask : [000100010001....] + # Note: The actual vl should be `FULL_BLOCK_LEN32/4 * 2`, but we just use + # `FULL_BLOCK_LEN32` here. + .word 201879639 + li t0, 0b10001000 + .word 1577238615 + # Load IV. + .word 3439489111 + .word 34041735 + # Convert the big-endian counter into little-endian. + .word 3305271383 + .word 1240772567 + # Splat the `single block of IV` to v12 + .word 220754007 + .word 1577072215 + .word 2817762935 + # Prepare the ctr counter into v8 + # v8: [x, x, x, 0, x, x, x, 1, x, x, x, 2, ...] + .word 1342710871 + # Merge IV and ctr counter into v12. + # v12:[x, x, x, count+0, x, x, x, count+1, ...] + .word 86536279 + .word 12846679 + + li t4, 0 + # Get the SEW32 size in the first round. + # If we have the non-zero value for `LEN32&(FULL_BLOCK_LEN32-1)`, then + # we will have the leading padding zero. + addi t0, a6, -1 + and t0, t0, t5 + beqz t0, 1f + + ## with padding + sub t5, t5, t0 + sub t4, a6, t0 + # padding block size + srli t1, t4, 2 + # padding byte size + slli t2, t4, 2 + + # Adjust the ctr counter to make the counter start from `counter+0` for the + # first non-padding block. + .word 86536279 + .word 147015255 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + .word 1237626455 + + # Prepare the mask for input loading in the first round. We use + # `VL=FULL_BLOCK_LEN32` with the mask in the first round. + # Adjust input ptr. + sub a0, a0, t2 + # Adjust output ptr. + sub a1, a1, t2 + .word 211316823 + .word 1376297303 + # We don't use the pseudo instruction `vmsgeu` here. Use `vmsgtu` instead. + # The original code is: + # vmsgeu.vx v0, v2, t4 + addi t0, t4, -1 + .word 2049097815 + .word 220754007 + .word 1577073751 + # Load the input for length FULL_BLOCK_LEN32 with mask. + .word 86536279 + .word 355335 + + # Load the init `Xi` data to v20 with preceding zero padding. + # Adjust Xi ptr. + sub t0, a5, t2 + # Load for length `zero-padding-e32-length + 4`. + addi t1, t4, 4 + .word 19099735 + .word 190983 + j 2f + +1: + ## without padding + sub t5, t5, a6 + + .word 220754007 + .word 33909767 + + # Load the init Xi data to v20. + .word 3372380247 + .word 34073095 + + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 86536279 + .word 1577455191 + .word 1237626455 +2: + + + # Load number of rounds + lwu t0, 240(a3) + li t1, 14 + li t2, 12 + li t3, 10 + + beq t0, t1, aes_gcm_dec_blocks_256 + beq t0, t2, aes_gcm_dec_blocks_192 + beq t0, t3, aes_gcm_dec_blocks_128 + +.Ldec_end: + li a0, 0 + ret +.size rv64i_zvkb_zvkg_zvkned_aes_gcm_decrypt,.-rv64i_zvkb_zvkg_zvkned_aes_gcm_decrypt +.p2align 3 +aes_gcm_dec_blocks_128: + srli t6, a6, 2 + slli t0, a6, 2 + + # Load all 11 aes round keys to v1-v11 registers. + .word 3439489111 + .word 34005127 + addi a3, a3, 16 + .word 34005255 + addi a3, a3, 16 + .word 34005383 + addi a3, a3, 16 + .word 34005511 + addi a3, a3, 16 + .word 34005639 + addi a3, a3, 16 + .word 34005767 + addi a3, a3, 16 + .word 34005895 + addi a3, a3, 16 + .word 34006023 + addi a3, a3, 16 + .word 34006151 + addi a3, a3, 16 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + + # We already have the ciphertext/plaintext and ctr data for the first round. + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr result. + .word 801902167 + + bnez t4, 1f + + ## without padding + # Store ciphertext/plaintext + .word 33943079 + j 2f + + ## with padding +1: + # Store ciphertext/plaintext using mask + .word 388647 + + # Fill zero for the padding blocks + .word 154071127 + .word 1577074263 + + # We have used mask register for `INPUT_PADDING_MASK` before. We need to + # setup the ctr mask back. + # ctr mask : [000100010001....] + .word 201879639 + li t1, 0b10001000 + .word 1577271383 +2: + + + + add a0, a0, t0 + add a1, a1, t0 + + + .word 220754007 + +.Ldec_blocks_128: + # Compute the partial tags. + # The partial tags will multiply with [H^n, H^n, ..., H^n] + # [tag0, tag1, ...] = + # ([tag0, tag1, ...] + [ciphertext0, ciphertext1, ...] * [H^n, H^n, ..., H^n] + # We will skip the [H^n, H^n, ..., H^n] multiplication for the last round. + beqz t5, .Ldec_blocks_256_end + .word 3003918967 + + .word 86536279 + # Increase ctr in v12. + .word 13616727 + sub t5, t5, a6 + # Load plaintext into v24 + .word 220229719 + .word 33909767 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + add a0, a0, t0 + .word 86011991 + .word 1237626455 + + + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr plaintext result. + .word 801902167 + + # Store plaintext + .word 33943079 + add a1, a1, t0 + + j .Ldec_blocks_128 +.Ldec_blocks_128_end: + + # Add ciphertext into partial tag + .word 793512535 + + .word 3441586263 + # Update current ctr value to v12 + .word 13616727 + # Convert ctr to big-endian counter. + .word 1220847191 + .word 484903 + + + # The H is at `gcm128_context.Htable[0]` (addr(Xi)+16*2). + # Load H to v1 + addi t1, a5, 32 + .word 3439489111 + .word 33775751 + # Multiply H for each partial tag and XOR them together. + # Handle 1st partial tag + .word 1577713751 + .word 2719522935 + # Handle 2nd to N-th partial tags + li t1, 4 +1: + .word 3441586263 + .word 1061372503 + .word 3439489111 + .word 2987532407 + addi t1, t1, 4 + blt t1, a6, 1b + + + # Save the final tag + .word 34070567 + + # return the processed size. + slli a0, a7, 2 + ret +.size aes_gcm_dec_blocks_128,.-aes_gcm_dec_blocks_128 +.p2align 3 +aes_gcm_dec_blocks_192: + srli t6, a6, 2 + slli t0, a6, 2 + + # We run out of 32 vector registers, so we just preserve some round keys + # and load the remaining round keys inside the aes body. + # We keep the round keys for: + # 1, 2, 3, 5, 6, 7, 9, 10, 11 and 12th keys. + # The following keys will be loaded in the aes body: + # 4, 8 and 13th keys. + .word 3439489111 + # key 1 + .word 34005127 + # key 2 + addi t1, a3, 16 + .word 33775879 + # key 3 + addi t1, a3, 32 + .word 33776007 + # key 5 + addi t1, a3, 64 + .word 33776135 + # key 6 + addi t1, a3, 80 + .word 33776263 + # key 7 + addi t1, a3, 96 + .word 33776391 + # key 9 + addi t1, a3, 128 + .word 33776519 + # key 10 + addi t1, a3, 144 + .word 33776647 + # key 11 + addi t1, a3, 160 + .word 33776775 + # key 12 + addi t1, a3, 176 + .word 33776903 + + # We already have the ciphertext/plaintext and ctr data for the first round. + # Load key 4 + .word 3439489111 + addi t1, a3, 48 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2796629623 + # Load key 8 + .word 3439489111 + addi t1, a3, 112 + .word 33777031 + .word 220754007 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 13 + .word 3439489111 + addi t1, a3, 192 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr result. + .word 801902167 + + bnez t4, 1f + + ## without padding + # Store ciphertext/plaintext + .word 33943079 + j 2f + + ## with padding +1: + # Store ciphertext/plaintext using mask + .word 388647 + + # Fill zero for the padding blocks + .word 154071127 + .word 1577074263 + + # We have used mask register for `INPUT_PADDING_MASK` before. We need to + # setup the ctr mask back. + # ctr mask : [000100010001....] + .word 201879639 + li t1, 0b10001000 + .word 1577271383 +2: + + + + add a0, a0, t0 + add a1, a1, t0 + + + .word 220754007 + +.Ldec_blocks_192: + # Compute the partial tags. + # The partial tags will multiply with [H^n, H^n, ..., H^n] + # [tag0, tag1, ...] = + # ([tag0, tag1, ...] + [ciphertext0, ciphertext1, ...] * [H^n, H^n, ..., H^n] + # We will skip the [H^n, H^n, ..., H^n] multiplication for the last round. + beqz t5, .Ldec_blocks_192_end + .word 3003918967 + + .word 86536279 + # Increase ctr in v12. + .word 13616727 + sub t5, t5, a6 + # Load plaintext into v24 + .word 220229719 + .word 33909767 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + add a0, a0, t0 + .word 86011991 + .word 1237626455 + + + # Load key 4 + .word 3439489111 + addi t1, a3, 48 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2788241015 + .word 2796629623 + # Load key 8 + .word 3439489111 + addi t1, a3, 112 + .word 33777031 + .word 220754007 + .word 2789289591 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 13 + .word 3439489111 + addi t1, a3, 192 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr plaintext result. + .word 801902167 + + # Store plaintext + .word 33943079 + add a1, a1, t0 + + j .Ldec_blocks_192 +.Ldec_blocks_192_end: + + # Add ciphertext into partial tag + .word 793512535 + + .word 3441586263 + # Update current ctr value to v12 + .word 13616727 + # Convert ctr to big-endian counter. + .word 1220847191 + .word 484903 + + + # The H is at `gcm128_context.Htable[0]` (addr(Xi)+16*2). + # Load H to v1 + addi t1, a5, 32 + .word 3439489111 + .word 33775751 + # Multiply H for each partial tag and XOR them together. + # Handle 1st partial tag + .word 1577713751 + .word 2719522935 + # Handle 2nd to N-th partial tags + li t1, 4 +1: + .word 3441586263 + .word 1061372503 + .word 3439489111 + .word 2987532407 + addi t1, t1, 4 + blt t1, a6, 1b + + + # Save the final tag + .word 34070567 + + # return the processed size. + slli a0, a7, 2 + ret +.size aes_gcm_dec_blocks_192,.-aes_gcm_dec_blocks_192 +.p2align 3 +aes_gcm_dec_blocks_256: + srli t6, a6, 2 + slli t0, a6, 2 + + # We run out of 32 vector registers, so we just preserve some round keys + # and load the remaining round keys inside the aes body. + # We keep the round keys for: + # 1, 2, 4, 5, 7, 8, 10, 11, 13 and 14th keys. + # The following keys will be loaded in the aes body: + # 3, 6, 9, 12 and 15th keys. + .word 3439489111 + # key 1 + .word 34005127 + # key 2 + addi t1, a3, 16 + .word 33775879 + # key 4 + addi t1, a3, 48 + .word 33776007 + # key 5 + addi t1, a3, 64 + .word 33776135 + # key 7 + addi t1, a3, 96 + .word 33776263 + # key 8 + addi t1, a3, 112 + .word 33776391 + # key 10 + addi t1, a3, 144 + .word 33776519 + # key 11 + addi t1, a3, 160 + .word 33776647 + # key 13 + addi t1, a3, 192 + .word 33776775 + # key 14 + addi t1, a3, 208 + .word 33776903 + + # We already have the ciphertext/plaintext and ctr data for the first round. + # Load key 3 + .word 3439489111 + addi t1, a3, 32 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2796629623 + # Load key 6 + .word 3439489111 + addi t1, a3, 80 + .word 33777031 + .word 220754007 + .word 2788241015 + .word 2789289591 + .word 2796629623 + # Load key 9 + .word 3439489111 + addi t1, a3, 128 + .word 33777031 + .word 220754007 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 12 + .word 3439489111 + addi t1, a3, 176 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2796629623 + # Load key 15 + .word 3439489111 + addi t1, a3, 224 + .word 33777031 + .word 220754007 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr result. + .word 801902167 + + bnez t4, 1f + + ## without padding + # Store ciphertext/plaintext + .word 33943079 + j 2f + + ## with padding +1: + # Store ciphertext/plaintext using mask + .word 388647 + + # Fill zero for the padding blocks + .word 154071127 + .word 1577074263 + + # We have used mask register for `INPUT_PADDING_MASK` before. We need to + # setup the ctr mask back. + # ctr mask : [000100010001....] + .word 201879639 + li t1, 0b10001000 + .word 1577271383 +2: + + + + add a0, a0, t0 + add a1, a1, t0 + + + .word 220754007 + +.Ldec_blocks_256: + # Compute the partial tags. + # The partial tags will multiply with [H^n, H^n, ..., H^n] + # [tag0, tag1, ...] = + # ([tag0, tag1, ...] + [ciphertext0, ciphertext1, ...] * [H^n, H^n, ..., H^n] + # We will skip the [H^n, H^n, ..., H^n] multiplication for the last round. + beqz t5, .Ldec_blocks_256_end + .word 3003918967 + + .word 86536279 + # Increase ctr in v12. + .word 13616727 + sub t5, t5, a6 + # Load plaintext into v24 + .word 220229719 + .word 33909767 + # Prepare the AES ctr input into v28. + # The ctr data uses big-endian form. + .word 1577455191 + add a0, a0, t0 + .word 86011991 + .word 1237626455 + + + # Load key 3 + .word 3439489111 + addi t1, a3, 32 + .word 33777031 + .word 220754007 + .word 2786307703 + .word 2787192439 + .word 2796629623 + # Load key 6 + .word 3439489111 + addi t1, a3, 80 + .word 33777031 + .word 220754007 + .word 2788241015 + .word 2789289591 + .word 2796629623 + # Load key 9 + .word 3439489111 + addi t1, a3, 128 + .word 33777031 + .word 220754007 + .word 2790338167 + .word 2791386743 + .word 2796629623 + # Load key 12 + .word 3439489111 + addi t1, a3, 176 + .word 33777031 + .word 220754007 + .word 2792435319 + .word 2793483895 + .word 2796629623 + # Load key 15 + .word 3439489111 + addi t1, a3, 224 + .word 33777031 + .word 220754007 + .word 2794532471 + .word 2795581047 + .word 2796662391 + + + # Compute AES ctr plaintext result. + .word 801902167 + + # Store plaintext + .word 33943079 + add a1, a1, t0 + + j .Ldec_blocks_256 +.Ldec_blocks_256_end: + + # Add ciphertext into partial tag + .word 793512535 + + .word 3441586263 + # Update current ctr value to v12 + .word 13616727 + # Convert ctr to big-endian counter. + .word 1220847191 + .word 484903 + + + # The H is at `gcm128_context.Htable[0]` (addr(Xi)+16*2). + # Load H to v1 + addi t1, a5, 32 + .word 3439489111 + .word 33775751 + # Multiply H for each partial tag and XOR them together. + # Handle 1st partial tag + .word 1577713751 + .word 2719522935 + # Handle 2nd to N-th partial tags + li t1, 4 +1: + .word 3441586263 + .word 1061372503 + .word 3439489111 + .word 2987532407 + addi t1, t1, 4 + blt t1, a6, 1b + + + # Save the final tag + .word 34070567 + + # return the processed size. + slli a0, a7, 2 + ret +.size aes_gcm_dec_blocks_256,.-aes_gcm_dec_blocks_256 diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64-zvkb-zvbc.s b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64-zvkb-zvbc.s new file mode 100644 index 000000000000..ca549d473a4e --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64-zvkb-zvbc.s @@ -0,0 +1,268 @@ +.text +.p2align 3 +.globl gcm_init_rv64i_zvkb_zvbc +.type gcm_init_rv64i_zvkb_zvbc,@function +gcm_init_rv64i_zvkb_zvbc: + # Load/store data in reverse order. + # This is needed as a part of endianness swap. + add a1, a1, 8 + li t0, -8 + li t1, 63 + la t2, Lpolymod + + .word 0xc1817057 # vsetivli x0, 2, e64, m1, tu, mu + + .word 173404295 # vlse64.v v1, (a1), t0 + .word 33812743 # vle64.v v2, (t2) + + # Shift one left and get the carry bits. + .word 2719171031 # vsrl.vx v3, v1, t1 + .word 2517676247 # vsll.vi v1, v1, 1 + + # Use the fact that the polynomial degree is no more than 128, + # i.e. only the LSB of the upper half could be set. + # Thanks to this we don't need to do the full reduction here. + # Instead simply subtract the reduction polynomial. + # This idea was taken from x86 ghash implementation in OpenSSL. + .word 976269911 # vslideup.vi v4, v3, 1 + .word 1043378647 # vslidedown.vi v3, v3, 1 + + .word 1577136215 # vmv.v.i v0, 2 + .word 672268503 # vor.vv v1, v1, v4, v0.t + + # Need to set the mask to 3, if the carry bit is set. + .word 1577156695 # vmv.v.v v0, v3 + .word 1577071063 # vmv.v.i v3, 0 + .word 1546760663 # vmerge.vim v3, v3, 3, v0 + .word 1577156695 # vmv.v.v v0, v3 + + .word 739311831 # vxor.vv v1, v1, v2, v0.t + + .word 33910951 # vse64.v v1, (a0) + ret +.size gcm_init_rv64i_zvkb_zvbc,.-gcm_init_rv64i_zvkb_zvbc +.text +.p2align 3 +.globl gcm_gmult_rv64i_zvkb_zvbc +.type gcm_gmult_rv64i_zvkb_zvbc,@function +gcm_gmult_rv64i_zvkb_zvbc: + ld t0, (a1) + ld t1, 8(a1) + li t2, 63 + la t3, Lpolymod + ld t3, 8(t3) + + # Load/store data in reverse order. + # This is needed as a part of endianness swap. + add a0, a0, 8 + li t4, -8 + + .word 0xc1817057 # vsetivli x0, 2, e64, m1, tu, mu + + .word 198537863 # vlse64.v v5, (a0), t4 + .word 1247060695 # vrev8.v v5, v5 + + # Multiplication + + # Do two 64x64 multiplications in one go to save some time + # and simplify things. + + # A = a1a0 (t1, t0) + # B = b1b0 (v5) + # C = c1c0 (256 bit) + # c1 = a1b1 + (a0b1)h + (a1b0)h + # c0 = a0b0 + (a0b1)l + (a1b0)h + + # v1 = (a0b1)l,(a0b0)l + .word 844292311 # vclmul.vx v1, v5, t0 + # v3 = (a0b1)h,(a0b0)h + .word 911401431 # vclmulh.vx v3, v5, t0 + + # v4 = (a1b1)l,(a1b0)l + .word 844325463 # vclmul.vx v4, v5, t1 + # v2 = (a1b1)h,(a1b0)h + .word 911434071 # vclmulh.vx v2, v5, t1 + + # Is there a better way to do this? + # Would need to swap the order of elements within a vector register. + .word 976270039 # vslideup.vi v5, v3, 1 + .word 977318743 # vslideup.vi v6, v4, 1 + .word 1043378647 # vslidedown.vi v3, v3, 1 + .word 1044427351 # vslidedown.vi v4, v4, 1 + + .word 1577103447 # vmv.v.i v0, 1 + # v2 += (a0b1)h + .word 740393303 # vxor.vv v2, v2, v3, v0.t + # v2 += (a1b1)l + .word 740426071 # vxor.vv v2, v2, v4, v0.t + + .word 1577136215 # vmv.v.i v0, 2 + # v1 += (a0b0)h,0 + .word 739410135 # vxor.vv v1, v1, v5, v0.t + # v1 += (a1b0)l,0 + .word 739442903 # vxor.vv v1, v1, v6, v0.t + + # Now the 256bit product should be stored in (v2,v1) + # v1 = (a0b1)l + (a0b0)h + (a1b0)l, (a0b0)l + # v2 = (a1b1)h, (a1b0)h + (a0b1)h + (a1b1)l + + # Reduction + # Let C := A*B = c3,c2,c1,c0 = v2[1],v2[0],v1[1],v1[0] + # This is a slight variation of the Gueron's Montgomery reduction. + # The difference being the order of some operations has been changed, + # to make a better use of vclmul(h) instructions. + + # First step: + # c1 += (c0 * P)l + # vmv.v.i v0, 2 + .word 940618199 # vslideup.vi v3, v1, 1, v0.t + .word 809394647 # vclmul.vx v3, v3, t3, v0.t + .word 739344599 # vxor.vv v1, v1, v3, v0.t + + # Second step: + # D = d1,d0 is final result + # We want: + # m1 = c1 + (c1 * P)h + # m0 = (c1 * P)l + (c0 * P)h + c0 + # d1 = c3 + m1 + # d0 = c2 + m0 + + #v3 = (c1 * P)l, 0 + .word 807297495 # vclmul.vx v3, v1, t3, v0.t + #v4 = (c1 * P)h, (c0 * P)h + .word 907960919 # vclmulh.vx v4, v1, t3 + + .word 1577103447 # vmv.v.i v0, 1 + .word 1043378647 # vslidedown.vi v3, v3, 1 + + .word 772931799 # vxor.vv v1, v1, v4 + .word 739344599 # vxor.vv v1, v1, v3, v0.t + + # XOR in the upper upper part of the product + .word 773882199 # vxor.vv v2, v2, v1 + + .word 1243914583 # vrev8.v v2, v2 + .word 198537511 # vsse64.v v2, (a0), t4 + ret +.size gcm_gmult_rv64i_zvkb_zvbc,.-gcm_gmult_rv64i_zvkb_zvbc +.p2align 3 +.globl gcm_ghash_rv64i_zvkb_zvbc +.type gcm_ghash_rv64i_zvkb_zvbc,@function +gcm_ghash_rv64i_zvkb_zvbc: + ld t0, (a1) + ld t1, 8(a1) + li t2, 63 + la t3, Lpolymod + ld t3, 8(t3) + + # Load/store data in reverse order. + # This is needed as a part of endianness swap. + add a0, a0, 8 + add a2, a2, 8 + li t4, -8 + + .word 0xc1817057 # vsetivli x0, 2, e64, m1, tu, mu + + .word 198537863 # vlse64.v v5, (a0), t4 + +Lstep: + # Read input data + .word 198603655 # vle64.v v0, (a2) + add a2, a2, 16 + add a3, a3, -16 + # XOR them into Xi + .word 777224919 # vxor.vv v0, v0, v1 + + .word 1247060695 # vrev8.v v5, v5 + + # Multiplication + + # Do two 64x64 multiplications in one go to save some time + # and simplify things. + + # A = a1a0 (t1, t0) + # B = b1b0 (v5) + # C = c1c0 (256 bit) + # c1 = a1b1 + (a0b1)h + (a1b0)h + # c0 = a0b0 + (a0b1)l + (a1b0)h + + # v1 = (a0b1)l,(a0b0)l + .word 844292311 # vclmul.vx v1, v5, t0 + # v3 = (a0b1)h,(a0b0)h + .word 911401431 # vclmulh.vx v3, v5, t0 + + # v4 = (a1b1)l,(a1b0)l + .word 844325463 # vclmul.vx v4, v5, t1 + # v2 = (a1b1)h,(a1b0)h + .word 911434071 # vclmulh.vx v2, v5, t1 + + # Is there a better way to do this? + # Would need to swap the order of elements within a vector register. + .word 976270039 # vslideup.vi v5, v3, 1 + .word 977318743 # vslideup.vi v6, v4, 1 + .word 1043378647 # vslidedown.vi v3, v3, 1 + .word 1044427351 # vslidedown.vi v4, v4, 1 + + .word 1577103447 # vmv.v.i v0, 1 + # v2 += (a0b1)h + .word 740393303 # vxor.vv v2, v2, v3, v0.t + # v2 += (a1b1)l + .word 740426071 # vxor.vv v2, v2, v4, v0.t + + .word 1577136215 # vmv.v.i v0, 2 + # v1 += (a0b0)h,0 + .word 739410135 # vxor.vv v1, v1, v5, v0.t + # v1 += (a1b0)l,0 + .word 739442903 # vxor.vv v1, v1, v6, v0.t + + # Now the 256bit product should be stored in (v2,v1) + # v1 = (a0b1)l + (a0b0)h + (a1b0)l, (a0b0)l + # v2 = (a1b1)h, (a1b0)h + (a0b1)h + (a1b1)l + + # Reduction + # Let C := A*B = c3,c2,c1,c0 = v2[1],v2[0],v1[1],v1[0] + # This is a slight variation of the Gueron's Montgomery reduction. + # The difference being the order of some operations has been changed, + # to make a better use of vclmul(h) instructions. + + # First step: + # c1 += (c0 * P)l + # vmv.v.i v0, 2 + .word 940618199 # vslideup.vi v3, v1, 1, v0.t + .word 809394647 # vclmul.vx v3, v3, t3, v0.t + .word 739344599 # vxor.vv v1, v1, v3, v0.t + + # Second step: + # D = d1,d0 is final result + # We want: + # m1 = c1 + (c1 * P)h + # m0 = (c1 * P)l + (c0 * P)h + c0 + # d1 = c3 + m1 + # d0 = c2 + m0 + + #v3 = (c1 * P)l, 0 + .word 807297495 # vclmul.vx v3, v1, t3, v0.t + #v4 = (c1 * P)h, (c0 * P)h + .word 907960919 # vclmulh.vx v4, v1, t3 + + .word 1577103447 # vmv.v.i v0, 1 + .word 1043378647 # vslidedown.vi v3, v3, 1 + + .word 772931799 # vxor.vv v1, v1, v4 + .word 739344599 # vxor.vv v1, v1, v3, v0.t + + # XOR in the upper upper part of the product + .word 773882199 # vxor.vv v2, v2, v1 + + .word 1243914967 # vrev8.v v2, v2 + + bnez a3, Lstep + + .word 198537895 # vsse64.v v2, (a0), t4 + ret +.size gcm_ghash_rv64i_zvkb_zvbc,.-gcm_ghash_rv64i_zvkb_zvbc +.p2align 4 +Lpolymod: + .dword 0x0000000000000001 + .dword 0xc200000000000000 +.size Lpolymod,.-Lpolymod diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64-zvkg.s b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64-zvkg.s new file mode 100644 index 000000000000..759c7c9c9e4d --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64-zvkg.s @@ -0,0 +1,81 @@ +.text +.p2align 3 +.globl gcm_init_rv64i_zvkg +.type gcm_init_rv64i_zvkg,@function +gcm_init_rv64i_zvkg: + ld a2, 0(a1) + ld a3, 8(a1) + sb a2, 7(a0) + srli t0, a2, 8 + sb t0, 6(a0) + srli t0, a2, 16 + sb t0, 5(a0) + srli t0, a2, 24 + sb t0, 4(a0) + srli t0, a2, 32 + sb t0, 3(a0) + srli t0, a2, 40 + sb t0, 2(a0) + srli t0, a2, 48 + sb t0, 1(a0) + srli t0, a2, 56 + sb t0, 0(a0) + + sb a3, 15(a0) + srli t0, a3, 8 + sb t0, 14(a0) + srli t0, a3, 16 + sb t0, 13(a0) + srli t0, a3, 24 + sb t0, 12(a0) + srli t0, a3, 32 + sb t0, 11(a0) + srli t0, a3, 40 + sb t0, 10(a0) + srli t0, a3, 48 + sb t0, 9(a0) + srli t0, a3, 56 + sb t0, 8(a0) + + ret +.size gcm_init_rv64i_zvkg,.-gcm_init_rv64i_zvkg +.p2align 3 +.globl gcm_init_rv64i_zvkg_zvkb +.type gcm_init_rv64i_zvkg_zvkb,@function +gcm_init_rv64i_zvkg_zvkb: + .word 0xc1817057 # vsetivli x0, 2, e64, m1, ta, ma + .word 33943559 # vle64.v v0, (a1) + .word 1241817175 # vrev8.v v0, v0 + .word 33910823 # vse64.v v0, (a0) + ret +.size gcm_init_rv64i_zvkg_zvkb,.-gcm_init_rv64i_zvkg_zvkb +.p2align 3 +.globl gcm_gmult_rv64i_zvkg +.type gcm_gmult_rv64i_zvkg,@function +gcm_gmult_rv64i_zvkg: + .word 0xc1027057 + .word 33939719 + .word 33906823 + .word 2720571639 + .word 33906855 + ret +.size gcm_gmult_rv64i_zvkg,.-gcm_gmult_rv64i_zvkg +.p2align 3 +.globl gcm_ghash_rv64i_zvkg +.type gcm_ghash_rv64i_zvkg,@function +gcm_ghash_rv64i_zvkg: + .word 0xc1027057 + .word 33939719 + .word 33906823 + +Lstep: + .word 33972615 + add a2, a2, 16 + add a3, a3, -16 + .word 2988548343 + bnez a3, Lstep + + .word 33906855 + ret + +.size gcm_ghash_rv64i_zvkg,.-gcm_ghash_rv64i_zvkg diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64.s b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64.s new file mode 100644 index 000000000000..337766973685 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64.s @@ -0,0 +1,613 @@ +.text +.p2align 3 +.globl gcm_init_rv64i_zbc +.type gcm_init_rv64i_zbc,@function +gcm_init_rv64i_zbc: + ld a2,0(a1) + ld a3,8(a1) + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a2, 1 + and t1, t1, t0 + and a2, a2, t0 + srli a2, a2, 1 + or a2, t1, a2 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a2, 2 + and t1, t1, t0 + and a2, a2, t0 + srli a2, a2, 2 + or a2, t1, a2 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a2, 4 + and t1, t1, t0 + and a2, a2, t0 + srli a2, a2, 4 + or a2, t1, a2 + + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a3, 1 + and t1, t1, t0 + and a3, a3, t0 + srli a3, a3, 1 + or a3, t1, a3 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a3, 2 + and t1, t1, t0 + and a3, a3, t0 + srli a3, a3, 2 + or a3, t1, a3 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a3, 4 + and t1, t1, t0 + and a3, a3, t0 + srli a3, a3, 4 + or a3, t1, a3 + + sb a2, 7(a0) + srli t0, a2, 8 + sb t0, 6(a0) + srli t0, a2, 16 + sb t0, 5(a0) + srli t0, a2, 24 + sb t0, 4(a0) + srli t0, a2, 32 + sb t0, 3(a0) + srli t0, a2, 40 + sb t0, 2(a0) + srli t0, a2, 48 + sb t0, 1(a0) + srli t0, a2, 56 + sb t0, 0(a0) + + sb a3, 15(a0) + srli t0, a3, 8 + sb t0, 14(a0) + srli t0, a3, 16 + sb t0, 13(a0) + srli t0, a3, 24 + sb t0, 12(a0) + srli t0, a3, 32 + sb t0, 11(a0) + srli t0, a3, 40 + sb t0, 10(a0) + srli t0, a3, 48 + sb t0, 9(a0) + srli t0, a3, 56 + sb t0, 8(a0) + + ret +.size gcm_init_rv64i_zbc,.-gcm_init_rv64i_zbc +.p2align 3 +.globl gcm_init_rv64i_zbc__zbb +.type gcm_init_rv64i_zbc__zbb,@function +gcm_init_rv64i_zbc__zbb: + ld a2,0(a1) + ld a3,8(a1) + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a2, 1 + and t1, t1, t0 + and a2, a2, t0 + srli a2, a2, 1 + or a2, t1, a2 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a2, 2 + and t1, t1, t0 + and a2, a2, t0 + srli a2, a2, 2 + or a2, t1, a2 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a2, 4 + and t1, t1, t0 + and a2, a2, t0 + srli a2, a2, 4 + or a2, t1, a2 + + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a3, 1 + and t1, t1, t0 + and a3, a3, t0 + srli a3, a3, 1 + or a3, t1, a3 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a3, 2 + and t1, t1, t0 + and a3, a3, t0 + srli a3, a3, 2 + or a3, t1, a3 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a3, 4 + and t1, t1, t0 + and a3, a3, t0 + srli a3, a3, 4 + or a3, t1, a3 + + .word 1803965971 + .word 1803998867 + sd a2,0(a0) + sd a3,8(a0) + ret +.size gcm_init_rv64i_zbc__zbb,.-gcm_init_rv64i_zbc__zbb +.p2align 3 +.globl gcm_init_rv64i_zbc__zbkb +.type gcm_init_rv64i_zbc__zbkb,@function +gcm_init_rv64i_zbc__zbkb: + ld t0,0(a1) + ld t1,8(a1) + .word 1752355475 + .word 1752388371 + .word 1803735699 + .word 1803768595 + sd t0,0(a0) + sd t1,8(a0) + ret +.size gcm_init_rv64i_zbc__zbkb,.-gcm_init_rv64i_zbc__zbkb +.p2align 3 +.globl gcm_gmult_rv64i_zbc +.type gcm_gmult_rv64i_zbc,@function +gcm_gmult_rv64i_zbc: + # Load Xi and bit-reverse it + ld a4, 0(a0) + ld a5, 8(a0) + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a4, 1 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 1 + or a4, t1, a4 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a4, 2 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 2 + or a4, t1, a4 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a4, 4 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 4 + or a4, t1, a4 + + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a5, 1 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 1 + or a5, t1, a5 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a5, 2 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 2 + or a5, t1, a5 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a5, 4 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 4 + or a5, t1, a5 + + + # Load the key (already bit-reversed) + ld a6, 0(a1) + ld a7, 8(a1) + + # Load the reduction constant + la t6, Lpolymod + lbu t6, 0(t6) + + # Multiplication (without Karatsuba) + .word 186105395 + .word 186094515 + .word 186072883 + .word 186061619 + xor t2, t2, t5 + .word 185057075 + .word 185048755 + xor t2, t2, t5 + xor t1, t1, t4 + .word 185024307 + .word 185012915 + xor t1, t1, t5 + + # Reduction with clmul + .word 201211699 + .word 201203379 + xor t2, t2, t5 + xor t1, t1, t4 + .word 200523571 + .word 200515251 + xor a5, t1, t5 + xor a4, t0, t4 + + # Bit-reverse Xi back and store it + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a4, 1 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 1 + or a4, t1, a4 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a4, 2 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 2 + or a4, t1, a4 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a4, 4 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 4 + or a4, t1, a4 + + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a5, 1 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 1 + or a5, t1, a5 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a5, 2 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 2 + or a5, t1, a5 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a5, 4 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 4 + or a5, t1, a5 + + sd a4, 0(a0) + sd a5, 8(a0) + ret +.size gcm_gmult_rv64i_zbc,.-gcm_gmult_rv64i_zbc +.p2align 3 +.globl gcm_gmult_rv64i_zbc__zbkb +.type gcm_gmult_rv64i_zbc__zbkb,@function +gcm_gmult_rv64i_zbc__zbkb: + # Load Xi and bit-reverse it + ld a4, 0(a0) + ld a5, 8(a0) + .word 1752651539 + .word 1752684435 + + # Load the key (already bit-reversed) + ld a6, 0(a1) + ld a7, 8(a1) + + # Load the reduction constant + la t6, Lpolymod + lbu t6, 0(t6) + + # Multiplication (without Karatsuba) + .word 186105395 + .word 186094515 + .word 186072883 + .word 186061619 + xor t2, t2, t5 + .word 185057075 + .word 185048755 + xor t2, t2, t5 + xor t1, t1, t4 + .word 185024307 + .word 185012915 + xor t1, t1, t5 + + # Reduction with clmul + .word 201211699 + .word 201203379 + xor t2, t2, t5 + xor t1, t1, t4 + .word 200523571 + .word 200515251 + xor a5, t1, t5 + xor a4, t0, t4 + + # Bit-reverse Xi back and store it + .word 1752651539 + .word 1752684435 + sd a4, 0(a0) + sd a5, 8(a0) + ret +.size gcm_gmult_rv64i_zbc__zbkb,.-gcm_gmult_rv64i_zbc__zbkb +.p2align 3 +.globl gcm_ghash_rv64i_zbc +.type gcm_ghash_rv64i_zbc,@function +gcm_ghash_rv64i_zbc: + # Load Xi and bit-reverse it + ld a4, 0(a0) + ld a5, 8(a0) + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a4, 1 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 1 + or a4, t1, a4 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a4, 2 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 2 + or a4, t1, a4 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a4, 4 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 4 + or a4, t1, a4 + + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a5, 1 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 1 + or a5, t1, a5 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a5, 2 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 2 + or a5, t1, a5 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a5, 4 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 4 + or a5, t1, a5 + + + # Load the key (already bit-reversed) + ld a6, 0(a1) + ld a7, 8(a1) + + # Load the reduction constant + la t6, Lpolymod + lbu t6, 0(t6) + +Lstep: + # Load the input data, bit-reverse them, and XOR them with Xi + ld t4, 0(a2) + ld t5, 8(a2) + add a2, a2, 16 + add a3, a3, -16 + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, t4, 1 + and t1, t1, t0 + and t4, t4, t0 + srli t4, t4, 1 + or t4, t1, t4 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, t4, 2 + and t1, t1, t0 + and t4, t4, t0 + srli t4, t4, 2 + or t4, t1, t4 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, t4, 4 + and t1, t1, t0 + and t4, t4, t0 + srli t4, t4, 4 + or t4, t1, t4 + + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, t5, 1 + and t1, t1, t0 + and t5, t5, t0 + srli t5, t5, 1 + or t5, t1, t5 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, t5, 2 + and t1, t1, t0 + and t5, t5, t0 + srli t5, t5, 2 + or t5, t1, t5 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, t5, 4 + and t1, t1, t0 + and t5, t5, t0 + srli t5, t5, 4 + or t5, t1, t5 + + xor a4, a4, t4 + xor a5, a5, t5 + + # Multiplication (without Karatsuba) + .word 186105395 + .word 186094515 + .word 186072883 + .word 186061619 + xor t2, t2, t5 + .word 185057075 + .word 185048755 + xor t2, t2, t5 + xor t1, t1, t4 + .word 185024307 + .word 185012915 + xor t1, t1, t5 + + # Reduction with clmul + .word 201211699 + .word 201203379 + xor t2, t2, t5 + xor t1, t1, t4 + .word 200523571 + .word 200515251 + xor a5, t1, t5 + xor a4, t0, t4 + + # Iterate over all blocks + bnez a3, Lstep + + # Bit-reverse final Xi back and store it + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a4, 1 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 1 + or a4, t1, a4 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a4, 2 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 2 + or a4, t1, a4 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a4, 4 + and t1, t1, t0 + and a4, a4, t0 + srli a4, a4, 4 + or a4, t1, a4 + + la t2, Lbrev8_const + + ld t0, 0(t2) # 0xAAAAAAAAAAAAAAAA + slli t1, a5, 1 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 1 + or a5, t1, a5 + + ld t0, 8(t2) # 0xCCCCCCCCCCCCCCCC + slli t1, a5, 2 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 2 + or a5, t1, a5 + + ld t0, 16(t2) # 0xF0F0F0F0F0F0F0F0 + slli t1, a5, 4 + and t1, t1, t0 + and a5, a5, t0 + srli a5, a5, 4 + or a5, t1, a5 + + sd a4, 0(a0) + sd a5, 8(a0) + ret +.size gcm_ghash_rv64i_zbc,.-gcm_ghash_rv64i_zbc +.p2align 3 +.globl gcm_ghash_rv64i_zbc__zbkb +.type gcm_ghash_rv64i_zbc__zbkb,@function +gcm_ghash_rv64i_zbc__zbkb: + # Load Xi and bit-reverse it + ld a4, 0(a0) + ld a5, 8(a0) + .word 1752651539 + .word 1752684435 + + # Load the key (already bit-reversed) + ld a6, 0(a1) + ld a7, 8(a1) + + # Load the reduction constant + la t6, Lpolymod + lbu t6, 0(t6) + +Lstep_zkbk: + # Load the input data, bit-reverse them, and XOR them with Xi + ld t4, 0(a2) + ld t5, 8(a2) + add a2, a2, 16 + add a3, a3, -16 + .word 1753144979 + .word 1753177875 + xor a4, a4, t4 + xor a5, a5, t5 + + # Multiplication (without Karatsuba) + .word 186105395 + .word 186094515 + .word 186072883 + .word 186061619 + xor t2, t2, t5 + .word 185057075 + .word 185048755 + xor t2, t2, t5 + xor t1, t1, t4 + .word 185024307 + .word 185012915 + xor t1, t1, t5 + + # Reduction with clmul + .word 201211699 + .word 201203379 + xor t2, t2, t5 + xor t1, t1, t4 + .word 200523571 + .word 200515251 + xor a5, t1, t5 + xor a4, t0, t4 + + # Iterate over all blocks + bnez a3, Lstep_zkbk + + # Bit-reverse final Xi back and store it + .word 1752651539 + .word 1752684435 + sd a4, 0(a0) + sd a5, 8(a0) + ret +.size gcm_ghash_rv64i_zbc__zbkb,.-gcm_ghash_rv64i_zbc__zbkb +.p2align 3 +Lbrev8_const: + .dword 0xAAAAAAAAAAAAAAAA + .dword 0xCCCCCCCCCCCCCCCC + .dword 0xF0F0F0F0F0F0F0F0 +.size Lbrev8_const,.-Lbrev8_const + +Lpolymod: + .byte 0x87 +.size Lpolymod,.-Lpolymod diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/params_idx.c b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/params_idx.c new file mode 100644 index 000000000000..e5463ca5c8e5 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/params_idx.c @@ -0,0 +1,3370 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from crypto/params_idx.c.in + * + * Copyright 2023 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ +/* clang-format off */ + +/* clang-format on */ + +#include "internal/e_os.h" +#include "internal/param_names.h" +#include + +/* Machine generated TRIE -- generated by util/perl/OpenSSL/paramnames.pm */ +/* clang-format off */ +int ossl_param_find_pidx(const char *s) +{ + switch(s[0]) { + default: + break; + case 'a': + switch(s[1]) { + default: + break; + case 'c': + if (strcmp("vp-info", s + 2) == 0) + return PIDX_KDF_PARAM_X942_ACVPINFO; + break; + case 'd': + switch(s[2]) { + default: + break; + case 'd': + if (strcmp("itional-random", s + 3) == 0) + return PIDX_SIGNATURE_PARAM_ADD_RANDOM; + break; + case '\0': + return PIDX_KDF_PARAM_ARGON2_AD; + } + break; + case 'e': + if (strcmp("ad", s + 2) == 0) + return PIDX_CIPHER_PARAM_AEAD; + break; + case 'l': + switch(s[2]) { + default: + break; + case 'g': + switch(s[3]) { + default: + break; + case '_': + if (strcmp("id_param", s + 4) == 0) + return PIDX_CIPHER_PARAM_ALGORITHM_ID_PARAMS_OLD; + break; + case 'i': + if (strcmp("d-absent", s + 4) == 0) + return PIDX_DIGEST_PARAM_ALGID_ABSENT; + break; + case 'o': + switch(s[4]) { + default: + break; + case 'r': + switch(s[5]) { + default: + break; + case 'i': + switch(s[6]) { + default: + break; + case 't': + switch(s[7]) { + default: + break; + case 'h': + switch(s[8]) { + default: + break; + case 'm': + switch(s[9]) { + default: + break; + case '-': + switch(s[10]) { + default: + break; + case 'i': + switch(s[11]) { + default: + break; + case 'd': + switch(s[12]) { + default: + break; + case '-': + if (strcmp("params", s + 13) == 0) + return PIDX_ALG_PARAM_ALGORITHM_ID_PARAMS; + break; + case '\0': + return PIDX_ALG_PARAM_ALGORITHM_ID; + } + } + } + } + } + } + } + } + } + } + break; + case 'i': + if (strcmp("as", s + 3) == 0) + return PIDX_STORE_PARAM_ALIAS; + } + break; + case '\0': + return PIDX_PKEY_PARAM_EC_A; + } + break; + case 'b': + switch(s[1]) { + default: + break; + case 'a': + if (strcmp("sis-type", s + 2) == 0) + return PIDX_PKEY_PARAM_EC_CHAR2_TYPE; + break; + case 'i': + if (strcmp("ts", s + 2) == 0) + return PIDX_PKEY_PARAM_BITS; + break; + case 'l': + switch(s[2]) { + default: + break; + case 'o': + switch(s[3]) { + default: + break; + case 'c': + switch(s[4]) { + default: + break; + case 'k': + switch(s[5]) { + default: + break; + case '-': + if (strcmp("size", s + 6) == 0) + return PIDX_MAC_PARAM_BLOCK_SIZE; + break; + case '_': + if (strcmp("padding", s + 6) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_BLOCK_PADDING; + break; + case 's': + if (strcmp("ize", s + 6) == 0) + return PIDX_DIGEST_PARAM_BLOCK_SIZE; + } + } + } + } + break; + case 'u': + if (strcmp("ildinfo", s + 2) == 0) + return PIDX_PROV_PARAM_BUILDINFO; + break; + case '\0': + return PIDX_PKEY_PARAM_EC_B; + } + break; + case 'c': + switch(s[1]) { + default: + break; + case '-': + if (strcmp("rounds", s + 2) == 0) + return PIDX_MAC_PARAM_C_ROUNDS; + break; + case 'e': + if (strcmp("kalg", s + 2) == 0) + return PIDX_KDF_PARAM_CEK_ALG; + break; + case 'i': + if (strcmp("pher", s + 2) == 0) + return PIDX_ALG_PARAM_CIPHER; + break; + case 'o': + switch(s[2]) { + default: + break; + case 'f': + if (strcmp("actor", s + 3) == 0) + return PIDX_PKEY_PARAM_EC_COFACTOR; + break; + case 'n': + switch(s[3]) { + default: + break; + case 's': + if (strcmp("tant", s + 4) == 0) + return PIDX_KDF_PARAM_CONSTANT; + break; + case 't': + if (strcmp("ext-string", s + 4) == 0) + return PIDX_SIGNATURE_PARAM_CONTEXT_STRING; + } + } + break; + case 't': + switch(s[2]) { + default: + break; + case 's': + switch(s[3]) { + default: + break; + case '_': + if (strcmp("mode", s + 4) == 0) + return PIDX_CIPHER_PARAM_CTS_MODE; + break; + case '\0': + return PIDX_CIPHER_PARAM_CTS; + } + } + break; + case 'u': + switch(s[2]) { + default: + break; + case 's': + switch(s[3]) { + default: + break; + case 't': + switch(s[4]) { + default: + break; + case 'o': + switch(s[5]) { + default: + break; + case 'm': + switch(s[6]) { + default: + break; + case '-': + if (strcmp("iv", s + 7) == 0) + return PIDX_CIPHER_PARAM_CUSTOM_IV; + break; + case '\0': + return PIDX_MAC_PARAM_CUSTOM; + } + } + } + } + } + } + break; + case 'd': + switch(s[1]) { + default: + break; + case '-': + if (strcmp("rounds", s + 2) == 0) + return PIDX_MAC_PARAM_D_ROUNDS; + break; + case 'a': + switch(s[2]) { + default: + break; + case 't': + switch(s[3]) { + default: + break; + case 'a': + switch(s[4]) { + default: + break; + case '-': + switch(s[5]) { + default: + break; + case 's': + if (strcmp("tructure", s + 6) == 0) + return PIDX_OBJECT_PARAM_DATA_STRUCTURE; + break; + case 't': + if (strcmp("ype", s + 6) == 0) + return PIDX_OBJECT_PARAM_DATA_TYPE; + } + break; + case '\0': + return PIDX_OBJECT_PARAM_DATA; + } + } + } + break; + case 'e': + switch(s[2]) { + default: + break; + case 'c': + switch(s[3]) { + default: + break; + case 'o': + if (strcmp("ded-from-explicit", s + 4) == 0) + return PIDX_PKEY_PARAM_EC_DECODED_FROM_EXPLICIT_PARAMS; + break; + case 'r': + if (strcmp("ypt-only", s + 4) == 0) + return PIDX_CIPHER_PARAM_DECRYPT_ONLY; + } + break; + case 'f': + if (strcmp("ault-digest", s + 3) == 0) + return PIDX_PKEY_PARAM_DEFAULT_DIGEST; + break; + case 's': + if (strcmp("c", s + 3) == 0) + return PIDX_OBJECT_PARAM_DESC; + break; + case 't': + if (strcmp("erministic", s + 3) == 0) + return PIDX_SIGNATURE_PARAM_DETERMINISTIC; + } + break; + case 'h': + if (strcmp("kem-ikm", s + 2) == 0) + return PIDX_PKEY_PARAM_DHKEM_IKM; + break; + case 'i': + switch(s[2]) { + default: + break; + case 'g': + switch(s[3]) { + default: + break; + case 'e': + switch(s[4]) { + default: + break; + case 's': + switch(s[5]) { + default: + break; + case 't': + switch(s[6]) { + default: + break; + case '-': + switch(s[7]) { + default: + break; + case 'c': + if (strcmp("heck", s + 8) == 0) + return PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK; + break; + case 'n': + if (strcmp("oinit", s + 8) == 0) + return PIDX_MAC_PARAM_DIGEST_NOINIT; + break; + case 'o': + if (strcmp("neshot", s + 8) == 0) + return PIDX_MAC_PARAM_DIGEST_ONESHOT; + break; + case 'p': + if (strcmp("rops", s + 8) == 0) + return PIDX_ASYM_CIPHER_PARAM_OAEP_DIGEST_PROPS; + break; + case 's': + if (strcmp("ize", s + 8) == 0) + return PIDX_PKEY_PARAM_DIGEST_SIZE; + } + break; + case '\0': + return PIDX_STORE_PARAM_DIGEST; + } + } + } + } + break; + case 's': + if (strcmp("tid", s + 3) == 0) + return PIDX_PKEY_PARAM_DIST_ID; + } + break; + case 'r': + if (strcmp("bg-no-trunc-md", s + 2) == 0) + return PIDX_PROV_PARAM_DRBG_TRUNC_DIGEST; + break; + case 's': + if (strcmp("a-sign-disabled", s + 2) == 0) + return PIDX_PROV_PARAM_DSA_SIGN_DISABLED; + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_D; + } + break; + case 'e': + switch(s[1]) { + default: + break; + case 'a': + if (strcmp("rly_clean", s + 2) == 0) + return PIDX_KDF_PARAM_EARLY_CLEAN; + break; + case 'c': + switch(s[2]) { + default: + break; + case 'd': + switch(s[3]) { + default: + break; + case 'h': + switch(s[4]) { + default: + break; + case '-': + switch(s[5]) { + default: + break; + case 'c': + switch(s[6]) { + default: + break; + case 'o': + switch(s[7]) { + default: + break; + case 'f': + switch(s[8]) { + default: + break; + case 'a': + switch(s[9]) { + default: + break; + case 'c': + switch(s[10]) { + default: + break; + case 't': + switch(s[11]) { + default: + break; + case 'o': + switch(s[12]) { + default: + break; + case 'r': + switch(s[13]) { + default: + break; + case '-': + switch(s[14]) { + default: + break; + case 'c': + if (strcmp("heck", s + 15) == 0) + return PIDX_PROV_PARAM_ECDH_COFACTOR_CHECK; + break; + case 'm': + if (strcmp("ode", s + 15) == 0) + return PIDX_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE; + } + } + } + } + } + } + } + } + } + } + } + } + } + break; + case 'm': + if (strcmp("s_check", s + 2) == 0) + return PIDX_KDF_PARAM_FIPS_EMS_CHECK; + break; + case 'n': + switch(s[2]) { + default: + break; + case 'c': + switch(s[3]) { + default: + break; + case 'o': + switch(s[4]) { + default: + break; + case 'd': + switch(s[5]) { + default: + break; + case 'e': + if (strcmp("d-pub-key", s + 6) == 0) + return PIDX_PKEY_PARAM_ENCODED_PUBLIC_KEY; + break; + case 'i': + if (strcmp("ng", s + 6) == 0) + return PIDX_PKEY_PARAM_EC_ENCODING; + } + } + break; + case 'r': + switch(s[4]) { + default: + break; + case 'y': + switch(s[5]) { + default: + break; + case 'p': + switch(s[6]) { + default: + break; + case 't': + switch(s[7]) { + default: + break; + case '-': + switch(s[8]) { + default: + break; + case 'c': + if (strcmp("heck", s + 9) == 0) + return PIDX_CIPHER_PARAM_FIPS_ENCRYPT_CHECK; + break; + case 'l': + if (strcmp("evel", s + 9) == 0) + return PIDX_ENCODER_PARAM_ENCRYPT_LEVEL; + } + } + } + } + } + } + break; + case 'g': + if (strcmp("ine", s + 3) == 0) + return PIDX_ALG_PARAM_ENGINE; + break; + case 't': + switch(s[3]) { + default: + break; + case 'r': + switch(s[4]) { + default: + break; + case 'o': + switch(s[5]) { + default: + break; + case 'p': + switch(s[6]) { + default: + break; + case 'y': + switch(s[7]) { + default: + break; + case '_': + if (strcmp("required", s + 8) == 0) + return PIDX_DRBG_PARAM_ENTROPY_REQUIRED; + break; + case '\0': + return PIDX_KDF_PARAM_HMACDRBG_ENTROPY; + } + } + } + } + } + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_E; + break; + case 'x': + if (strcmp("pect", s + 2) == 0) + return PIDX_STORE_PARAM_EXPECT; + } + break; + case 'f': + switch(s[1]) { + default: + break; + case 'i': + switch(s[2]) { + default: + break; + case 'e': + if (strcmp("ld-type", s + 3) == 0) + return PIDX_PKEY_PARAM_EC_FIELD_TYPE; + break; + case 'n': + if (strcmp("gerprint", s + 3) == 0) + return PIDX_STORE_PARAM_FINGERPRINT; + break; + case 'p': + if (strcmp("s-indicator", s + 3) == 0) + return PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR; + } + } + break; + case 'g': + switch(s[1]) { + default: + break; + case 'e': + switch(s[2]) { + default: + break; + case 'n': + switch(s[3]) { + default: + break; + case 'e': + switch(s[4]) { + default: + break; + case 'r': + switch(s[5]) { + default: + break; + case 'a': + switch(s[6]) { + default: + break; + case 't': + switch(s[7]) { + default: + break; + case 'e': + switch(s[8]) { + default: + break; + case '\0': + return PIDX_RAND_PARAM_GENERATE; + } + break; + case 'o': + if (strcmp("r", s + 8) == 0) + return PIDX_PKEY_PARAM_EC_GENERATOR; + } + } + } + } + } + } + break; + case 'i': + if (strcmp("ndex", s + 2) == 0) + return PIDX_PKEY_PARAM_FFC_GINDEX; + break; + case 'r': + switch(s[2]) { + default: + break; + case 'o': + switch(s[3]) { + default: + break; + case 'u': + switch(s[4]) { + default: + break; + case 'p': + switch(s[5]) { + default: + break; + case '-': + if (strcmp("check", s + 6) == 0) + return PIDX_PKEY_PARAM_EC_GROUP_CHECK_TYPE; + break; + case '\0': + return PIDX_PKEY_PARAM_GROUP_NAME; + } + } + } + } + break; + case '\0': + return PIDX_PKEY_PARAM_FFC_G; + } + break; + case 'h': + switch(s[1]) { + default: + break; + case 'a': + if (strcmp("s-randkey", s + 2) == 0) + return PIDX_CIPHER_PARAM_HAS_RAND_KEY; + break; + case 'i': + if (strcmp("ndex", s + 2) == 0) + return PIDX_PKEY_PARAM_FFC_H; + break; + case 'k': + switch(s[2]) { + default: + break; + case 'd': + switch(s[3]) { + default: + break; + case 'f': + switch(s[4]) { + default: + break; + case '-': + switch(s[5]) { + default: + break; + case 'd': + if (strcmp("igest-check", s + 6) == 0) + return PIDX_PROV_PARAM_HKDF_DIGEST_CHECK; + break; + case 'k': + if (strcmp("ey-check", s + 6) == 0) + return PIDX_PROV_PARAM_HKDF_KEY_CHECK; + } + } + } + } + break; + case 'm': + if (strcmp("ac-key-check", s + 2) == 0) + return PIDX_PROV_PARAM_HMAC_KEY_CHECK; + break; + case 's': + if (strcmp("_padding", s + 2) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_HS_PADDING; + } + break; + case 'i': + switch(s[1]) { + default: + break; + case 'd': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_KDF_PARAM_PKCS12_ID; + } + break; + case 'k': + if (strcmp("me", s + 2) == 0) + return PIDX_KEM_PARAM_IKME; + break; + case 'm': + if (strcmp("plicit-rejection", s + 2) == 0) + return PIDX_PKEY_PARAM_IMPLICIT_REJECTION; + break; + case 'n': + switch(s[2]) { + default: + break; + case 'c': + if (strcmp("lude-public", s + 3) == 0) + return PIDX_PKEY_PARAM_EC_INCLUDE_PUBLIC; + break; + case 'f': + if (strcmp("o", s + 3) == 0) + return PIDX_PASSPHRASE_PARAM_INFO; + break; + case 'p': + if (strcmp("ut-type", s + 3) == 0) + return PIDX_STORE_PARAM_INPUT_TYPE; + break; + case 's': + if (strcmp("tance", s + 3) == 0) + return PIDX_SIGNATURE_PARAM_INSTANCE; + } + break; + case 't': + switch(s[2]) { + default: + break; + case 'e': + switch(s[3]) { + default: + break; + case 'r': + switch(s[4]) { + default: + break; + case 'a': + if (strcmp("tion", s + 5) == 0) + return PIDX_GEN_PARAM_ITERATION; + break; + case '\0': + return PIDX_KDF_PARAM_ITER; + } + } + } + break; + case 'v': + switch(s[2]) { + default: + break; + case '-': + if (strcmp("generated", s + 3) == 0) + return PIDX_CIPHER_PARAM_AEAD_IV_GENERATED; + break; + case 'l': + if (strcmp("en", s + 3) == 0) + return PIDX_CIPHER_PARAM_IVLEN; + break; + case '\0': + return PIDX_MAC_PARAM_IV; + } + } + break; + case 'j': + switch(s[1]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_FFC_COFACTOR; + } + break; + case 'k': + switch(s[1]) { + default: + break; + case '1': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_EC_CHAR2_PP_K1; + } + break; + case '2': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_EC_CHAR2_PP_K2; + } + break; + case '3': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_EC_CHAR2_PP_K3; + } + break; + case 'a': + if (strcmp("t", s + 2) == 0) + return PIDX_SIGNATURE_PARAM_KAT; + break; + case 'b': + if (strcmp("kdf-key-check", s + 2) == 0) + return PIDX_PROV_PARAM_KBKDF_KEY_CHECK; + break; + case 'd': + switch(s[2]) { + default: + break; + case 'f': + switch(s[3]) { + default: + break; + case '-': + switch(s[4]) { + default: + break; + case 'd': + switch(s[5]) { + default: + break; + case 'i': + switch(s[6]) { + default: + break; + case 'g': + switch(s[7]) { + default: + break; + case 'e': + switch(s[8]) { + default: + break; + case 's': + switch(s[9]) { + default: + break; + case 't': + switch(s[10]) { + default: + break; + case '-': + if (strcmp("props", s + 11) == 0) + return PIDX_EXCHANGE_PARAM_KDF_DIGEST_PROPS; + break; + case '\0': + return PIDX_EXCHANGE_PARAM_KDF_DIGEST; + } + } + } + } + } + } + break; + case 'o': + if (strcmp("utlen", s + 5) == 0) + return PIDX_EXCHANGE_PARAM_KDF_OUTLEN; + break; + case 't': + if (strcmp("ype", s + 5) == 0) + return PIDX_EXCHANGE_PARAM_KDF_TYPE; + break; + case 'u': + if (strcmp("km", s + 5) == 0) + return PIDX_EXCHANGE_PARAM_KDF_UKM; + } + } + } + break; + case 'e': + switch(s[2]) { + default: + break; + case 'y': + switch(s[3]) { + default: + break; + case '-': + switch(s[4]) { + default: + break; + case 'c': + if (strcmp("heck", s + 5) == 0) + return PIDX_PKEY_PARAM_FIPS_KEY_CHECK; + break; + case 'l': + if (strcmp("ength", s + 5) == 0) + return PIDX_SKEY_PARAM_KEY_LENGTH; + } + break; + case 'b': + if (strcmp("its", s + 4) == 0) + return PIDX_CIPHER_PARAM_RC2_KEYBITS; + break; + case 'l': + if (strcmp("en", s + 4) == 0) + return PIDX_CIPHER_PARAM_KEYLEN; + break; + case '\0': + return PIDX_MAC_PARAM_KEY; + } + } + break; + case 'm': + if (strcmp("ac-key-check", s + 2) == 0) + return PIDX_PROV_PARAM_KMAC_KEY_CHECK; + } + break; + case 'l': + switch(s[1]) { + default: + break; + case 'a': + switch(s[2]) { + default: + break; + case 'b': + if (strcmp("el", s + 3) == 0) + return PIDX_KDF_PARAM_LABEL; + break; + case 'n': + if (strcmp("es", s + 3) == 0) + return PIDX_KDF_PARAM_ARGON2_LANES; + } + } + break; + case 'm': + switch(s[1]) { + default: + break; + case 'a': + switch(s[2]) { + default: + break; + case 'c': + switch(s[3]) { + default: + break; + case 'k': + if (strcmp("ey", s + 4) == 0) + return PIDX_CIPHER_PARAM_AEAD_MAC_KEY; + break; + case 'l': + if (strcmp("en", s + 4) == 0) + return PIDX_KDF_PARAM_MAC_SIZE; + break; + case '\0': + return PIDX_ALG_PARAM_MAC; + } + break; + case 'n': + if (strcmp("datory-digest", s + 3) == 0) + return PIDX_PKEY_PARAM_MANDATORY_DIGEST; + break; + case 'x': + switch(s[3]) { + default: + break; + case '-': + if (strcmp("size", s + 4) == 0) + return PIDX_PKEY_PARAM_MAX_SIZE; + break; + case '_': + switch(s[4]) { + default: + break; + case 'a': + if (strcmp("dinlen", s + 5) == 0) + return PIDX_DRBG_PARAM_MAX_ADINLEN; + break; + case 'e': + switch(s[5]) { + default: + break; + case 'a': + if (strcmp("rly_data", s + 6) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_EARLY_DATA; + break; + case 'n': + if (strcmp("tropylen", s + 6) == 0) + return PIDX_DRBG_PARAM_MAX_ENTROPYLEN; + } + break; + case 'f': + if (strcmp("rag_len", s + 5) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_FRAG_LEN; + break; + case 'n': + if (strcmp("oncelen", s + 5) == 0) + return PIDX_DRBG_PARAM_MAX_NONCELEN; + break; + case 'p': + if (strcmp("erslen", s + 5) == 0) + return PIDX_DRBG_PARAM_MAX_PERSLEN; + break; + case 'r': + if (strcmp("equest", s + 5) == 0) + return PIDX_RAND_PARAM_MAX_REQUEST; + } + break; + case 'i': + if (strcmp("um_length", s + 4) == 0) + return PIDX_DRBG_PARAM_MAX_LENGTH; + break; + case 'm': + if (strcmp("em_bytes", s + 4) == 0) + return PIDX_KDF_PARAM_SCRYPT_MAXMEM; + } + } + break; + case 'e': + switch(s[2]) { + default: + break; + case 'm': + if (strcmp("cost", s + 3) == 0) + return PIDX_KDF_PARAM_ARGON2_MEMCOST; + break; + case 's': + if (strcmp("sage-encoding", s + 3) == 0) + return PIDX_SIGNATURE_PARAM_MESSAGE_ENCODING; + } + break; + case 'g': + switch(s[2]) { + default: + break; + case 'f': + switch(s[3]) { + default: + break; + case '1': + switch(s[4]) { + default: + break; + case '-': + switch(s[5]) { + default: + break; + case 'd': + if (strcmp("igest", s + 6) == 0) + return PIDX_PKEY_PARAM_MGF1_DIGEST; + break; + case 'p': + if (strcmp("roperties", s + 6) == 0) + return PIDX_PKEY_PARAM_MGF1_PROPERTIES; + } + } + break; + case '\0': + return PIDX_PKEY_PARAM_MASKGENFUNC; + } + } + break; + case 'i': + switch(s[2]) { + default: + break; + case 'c': + if (strcmp("alg", s + 3) == 0) + return PIDX_DIGEST_PARAM_MICALG; + break; + case 'n': + switch(s[3]) { + default: + break; + case '_': + switch(s[4]) { + default: + break; + case 'e': + if (strcmp("ntropylen", s + 5) == 0) + return PIDX_DRBG_PARAM_MIN_ENTROPYLEN; + break; + case 'n': + if (strcmp("oncelen", s + 5) == 0) + return PIDX_DRBG_PARAM_MIN_NONCELEN; + } + break; + case 'i': + if (strcmp("um_length", s + 4) == 0) + return PIDX_DRBG_PARAM_MIN_LENGTH; + } + } + break; + case 'l': + switch(s[2]) { + default: + break; + case '-': + switch(s[3]) { + default: + break; + case 'd': + switch(s[4]) { + default: + break; + case 's': + switch(s[5]) { + default: + break; + case 'a': + switch(s[6]) { + default: + break; + case '.': + switch(s[7]) { + default: + break; + case 'i': + if (strcmp("nput_formats", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_DSA_INPUT_FORMATS; + break; + case 'o': + if (strcmp("utput_formats", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_DSA_OUTPUT_FORMATS; + break; + case 'p': + if (strcmp("refer_seed", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_DSA_PREFER_SEED; + break; + case 'r': + if (strcmp("etain_seed", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_DSA_RETAIN_SEED; + } + } + } + } + break; + case 'k': + switch(s[4]) { + default: + break; + case 'e': + switch(s[5]) { + default: + break; + case 'm': + switch(s[6]) { + default: + break; + case '.': + switch(s[7]) { + default: + break; + case 'i': + switch(s[8]) { + default: + break; + case 'm': + if (strcmp("port_pct_type", s + 9) == 0) + return PIDX_PKEY_PARAM_ML_KEM_IMPORT_PCT_TYPE; + break; + case 'n': + if (strcmp("put_formats", s + 9) == 0) + return PIDX_PKEY_PARAM_ML_KEM_INPUT_FORMATS; + } + break; + case 'o': + if (strcmp("utput_formats", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_KEM_OUTPUT_FORMATS; + break; + case 'p': + if (strcmp("refer_seed", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_KEM_PREFER_SEED; + break; + case 'r': + if (strcmp("etain_seed", s + 8) == 0) + return PIDX_PKEY_PARAM_ML_KEM_RETAIN_SEED; + } + } + } + } + } + } + break; + case 'o': + switch(s[2]) { + default: + break; + case 'd': + switch(s[3]) { + default: + break; + case 'e': + switch(s[4]) { + default: + break; + case '\0': + return PIDX_LIBSSL_RECORD_LAYER_PARAM_MODE; + } + break; + case 'u': + if (strcmp("le-filename", s + 4) == 0) + return PIDX_PROV_PARAM_CORE_MODULE_FILENAME; + } + } + break; + case 'u': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_SIGNATURE_PARAM_MU; + } + break; + case '\0': + return PIDX_PKEY_PARAM_EC_CHAR2_M; + } + break; + case 'n': + switch(s[1]) { + default: + break; + case 'a': + if (strcmp("me", s + 2) == 0) + return PIDX_STORE_PARAM_ISSUER; + break; + case 'o': + switch(s[2]) { + default: + break; + case '-': + if (strcmp("short-mac", s + 3) == 0) + return PIDX_PROV_PARAM_NO_SHORT_MAC; + break; + case 'n': + switch(s[3]) { + default: + break; + case 'c': + switch(s[4]) { + default: + break; + case 'e': + switch(s[5]) { + default: + break; + case '-': + if (strcmp("type", s + 6) == 0) + return PIDX_SIGNATURE_PARAM_NONCE_TYPE; + break; + case '\0': + return PIDX_KDF_PARAM_HMACDRBG_NONCE; + } + } + } + } + break; + case 'u': + if (strcmp("m", s + 2) == 0) + return PIDX_CIPHER_PARAM_NUM; + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_N; + } + break; + case 'o': + switch(s[1]) { + default: + break; + case 'a': + if (strcmp("ep-label", s + 2) == 0) + return PIDX_ASYM_CIPHER_PARAM_OAEP_LABEL; + break; + case 'p': + switch(s[2]) { + default: + break; + case 'e': + switch(s[3]) { + default: + break; + case 'n': + if (strcmp("ssl-version", s + 4) == 0) + return PIDX_PROV_PARAM_CORE_VERSION; + break; + case 'r': + if (strcmp("ation", s + 4) == 0) + return PIDX_KEM_PARAM_OPERATION; + } + break; + case 't': + if (strcmp("ions", s + 3) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_OPTIONS; + } + break; + case 'r': + if (strcmp("der", s + 2) == 0) + return PIDX_PKEY_PARAM_EC_ORDER; + } + break; + case 'p': + switch(s[1]) { + default: + break; + case '1': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_P1; + } + break; + case '2': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_P2; + } + break; + case 'a': + switch(s[2]) { + default: + break; + case 'd': + switch(s[3]) { + default: + break; + case '-': + switch(s[4]) { + default: + break; + case 'm': + if (strcmp("ode", s + 5) == 0) + return PIDX_PKEY_PARAM_PAD_MODE; + break; + case 't': + if (strcmp("ype", s + 5) == 0) + return PIDX_DIGEST_PARAM_PAD_TYPE; + } + break; + case 'd': + if (strcmp("ing", s + 4) == 0) + return PIDX_CIPHER_PARAM_PADDING; + break; + case '\0': + return PIDX_EXCHANGE_PARAM_PAD; + } + break; + case 'r': + switch(s[3]) { + default: + break; + case 't': + switch(s[4]) { + default: + break; + case 'y': + switch(s[5]) { + default: + break; + case 'u': + if (strcmp("-info", s + 6) == 0) + return PIDX_KDF_PARAM_X942_PARTYUINFO; + break; + case 'v': + if (strcmp("-info", s + 6) == 0) + return PIDX_KDF_PARAM_X942_PARTYVINFO; + } + } + } + break; + case 's': + if (strcmp("s", s + 3) == 0) + return PIDX_KDF_PARAM_PASSWORD; + } + break; + case 'b': + switch(s[2]) { + default: + break; + case 'i': + if (strcmp("ts", s + 3) == 0) + return PIDX_PKEY_PARAM_FFC_PBITS; + break; + case 'k': + if (strcmp("df2-lower-bound-check", s + 3) == 0) + return PIDX_PROV_PARAM_PBKDF2_LOWER_BOUND_CHECK; + } + break; + case 'c': + if (strcmp("ounter", s + 2) == 0) + return PIDX_PKEY_PARAM_FFC_PCOUNTER; + break; + case 'i': + if (strcmp("peline-tag", s + 2) == 0) + return PIDX_CIPHER_PARAM_PIPELINE_AEAD_TAG; + break; + case 'k': + if (strcmp("cs5", s + 2) == 0) + return PIDX_KDF_PARAM_PKCS5; + break; + case 'o': + switch(s[2]) { + default: + break; + case 'i': + if (strcmp("nt-format", s + 3) == 0) + return PIDX_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT; + break; + case 't': + if (strcmp("ential", s + 3) == 0) + return PIDX_GEN_PARAM_POTENTIAL; + } + break; + case 'r': + switch(s[2]) { + default: + break; + case 'e': + switch(s[3]) { + default: + break; + case 'd': + if (strcmp("iction_resistance", s + 4) == 0) + return PIDX_DRBG_PARAM_PREDICTION_RESISTANCE; + break; + case 'f': + if (strcmp("ix", s + 4) == 0) + return PIDX_KDF_PARAM_PREFIX; + } + break; + case 'i': + switch(s[3]) { + default: + break; + case 'm': + if (strcmp("es", s + 4) == 0) + return PIDX_PKEY_PARAM_RSA_PRIMES; + break; + case 'v': + switch(s[4]) { + default: + break; + case '_': + if (strcmp("len", s + 5) == 0) + return PIDX_PKEY_PARAM_DH_PRIV_LEN; + break; + case '\0': + return PIDX_PKEY_PARAM_PRIV_KEY; + } + } + break; + case 'o': + switch(s[3]) { + default: + break; + case 'p': + if (strcmp("erties", s + 4) == 0) + return PIDX_STORE_PARAM_PROPERTIES; + break; + case 'v': + if (strcmp("ider-name", s + 4) == 0) + return PIDX_PROV_PARAM_CORE_PROV_NAME; + } + } + break; + case 'u': + if (strcmp("b", s + 2) == 0) + return PIDX_PKEY_PARAM_PUB_KEY; + break; + case '\0': + return PIDX_PKEY_PARAM_FFC_P; + } + break; + case 'q': + switch(s[1]) { + default: + break; + case '1': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_Q1; + } + break; + case '2': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_Q2; + } + break; + case 'b': + if (strcmp("its", s + 2) == 0) + return PIDX_PKEY_PARAM_FFC_QBITS; + break; + case '\0': + return PIDX_PKEY_PARAM_FFC_Q; + break; + case 'x': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_EC_PUB_X; + } + break; + case 'y': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_EC_PUB_Y; + } + } + break; + case 'r': + switch(s[1]) { + default: + break; + case 'a': + switch(s[2]) { + default: + break; + case 'n': + switch(s[3]) { + default: + break; + case 'd': + switch(s[4]) { + default: + break; + case 'k': + if (strcmp("ey", s + 5) == 0) + return PIDX_CIPHER_PARAM_RANDOM_KEY; + break; + case 'o': + if (strcmp("m_data", s + 5) == 0) + return PIDX_DRBG_PARAM_RANDOM_DATA; + } + } + break; + case 'w': + if (strcmp("-bytes", s + 3) == 0) + return PIDX_SKEY_PARAM_RAW_BYTES; + } + break; + case 'e': + switch(s[2]) { + default: + break; + case 'a': + switch(s[3]) { + default: + break; + case 'd': + switch(s[4]) { + default: + break; + case '_': + switch(s[5]) { + default: + break; + case 'a': + if (strcmp("head", s + 6) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_READ_AHEAD; + break; + case 'b': + if (strcmp("uffer_len", s + 6) == 0) + return PIDX_LIBSSL_RECORD_LAYER_READ_BUFFER_LEN; + } + } + } + break; + case 'f': + if (strcmp("erence", s + 3) == 0) + return PIDX_OBJECT_PARAM_REFERENCE; + break; + case 's': + switch(s[3]) { + default: + break; + case 'e': + switch(s[4]) { + default: + break; + case 'e': + switch(s[5]) { + default: + break; + case 'd': + switch(s[6]) { + default: + break; + case '_': + switch(s[7]) { + default: + break; + case 'c': + if (strcmp("ounter", s + 8) == 0) + return PIDX_DRBG_PARAM_RESEED_COUNTER; + break; + case 'r': + if (strcmp("equests", s + 8) == 0) + return PIDX_DRBG_PARAM_RESEED_REQUESTS; + break; + case 't': + switch(s[8]) { + default: + break; + case 'i': + switch(s[9]) { + default: + break; + case 'm': + switch(s[10]) { + default: + break; + case 'e': + switch(s[11]) { + default: + break; + case '_': + if (strcmp("interval", s + 12) == 0) + return PIDX_DRBG_PARAM_RESEED_TIME_INTERVAL; + break; + case '\0': + return PIDX_DRBG_PARAM_RESEED_TIME; + } + } + } + } + } + } + } + } + } + } + break; + case 'o': + if (strcmp("unds", s + 2) == 0) + return PIDX_CIPHER_PARAM_ROUNDS; + break; + case 's': + switch(s[2]) { + default: + break; + case 'a': + switch(s[3]) { + default: + break; + case '-': + switch(s[4]) { + default: + break; + case 'c': + switch(s[5]) { + default: + break; + case 'o': + switch(s[6]) { + default: + break; + case 'e': + switch(s[7]) { + default: + break; + case 'f': + switch(s[8]) { + default: + break; + case 'f': + switch(s[9]) { + default: + break; + case 'i': + switch(s[10]) { + default: + break; + case 'c': + switch(s[11]) { + default: + break; + case 'i': + switch(s[12]) { + default: + break; + case 'e': + switch(s[13]) { + default: + break; + case 'n': + switch(s[14]) { + default: + break; + case 't': + switch(s[15]) { + default: + break; + case '1': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT1; + } + break; + case '2': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT2; + } + break; + case '3': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT3; + } + break; + case '4': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT4; + } + break; + case '5': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT5; + } + break; + case '6': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT6; + } + break; + case '7': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT7; + } + break; + case '8': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT8; + } + break; + case '9': + switch(s[16]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT9; + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_COEFFICIENT; + } + } + } + } + } + } + } + } + } + } + } + break; + case 'd': + if (strcmp("erive-from-pq", s + 5) == 0) + return PIDX_PKEY_PARAM_RSA_DERIVE_FROM_PQ; + break; + case 'e': + switch(s[5]) { + default: + break; + case 'x': + switch(s[6]) { + default: + break; + case 'p': + switch(s[7]) { + default: + break; + case 'o': + switch(s[8]) { + default: + break; + case 'n': + switch(s[9]) { + default: + break; + case 'e': + switch(s[10]) { + default: + break; + case 'n': + switch(s[11]) { + default: + break; + case 't': + switch(s[12]) { + default: + break; + case '1': + switch(s[13]) { + default: + break; + case '0': + switch(s[14]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT10; + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT1; + } + break; + case '2': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT2; + } + break; + case '3': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT3; + } + break; + case '4': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT4; + } + break; + case '5': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT5; + } + break; + case '6': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT6; + } + break; + case '7': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT7; + } + break; + case '8': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT8; + } + break; + case '9': + switch(s[13]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT9; + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_EXPONENT; + } + } + } + } + } + } + } + } + break; + case 'f': + switch(s[5]) { + default: + break; + case 'a': + switch(s[6]) { + default: + break; + case 'c': + switch(s[7]) { + default: + break; + case 't': + switch(s[8]) { + default: + break; + case 'o': + switch(s[9]) { + default: + break; + case 'r': + switch(s[10]) { + default: + break; + case '1': + switch(s[11]) { + default: + break; + case '0': + switch(s[12]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR10; + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR1; + } + break; + case '2': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR2; + } + break; + case '3': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR3; + } + break; + case '4': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR4; + } + break; + case '5': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR5; + } + break; + case '6': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR6; + } + break; + case '7': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR7; + } + break; + case '8': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR8; + } + break; + case '9': + switch(s[11]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR9; + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_FACTOR; + } + } + } + } + } + } + break; + case 'p': + switch(s[5]) { + default: + break; + case 'k': + if (strcmp("cs15-pad-disabled", s + 6) == 0) + return PIDX_PROV_PARAM_RSA_PKCS15_PAD_DISABLED; + break; + case 's': + if (strcmp("s-saltlen-check", s + 6) == 0) + return PIDX_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK; + } + break; + case 's': + if (strcmp("ign-x931-pad-disabled", s + 5) == 0) + return PIDX_PROV_PARAM_RSA_SIGN_X931_PAD_DISABLED; + } + } + } + break; + case '\0': + return PIDX_KDF_PARAM_SCRYPT_R; + } + break; + case 's': + switch(s[1]) { + default: + break; + case 'a': + switch(s[2]) { + default: + break; + case 'f': + if (strcmp("eprime-generator", s + 3) == 0) + return PIDX_PKEY_PARAM_DH_GENERATOR; + break; + case 'l': + switch(s[3]) { + default: + break; + case 't': + switch(s[4]) { + default: + break; + case 'l': + if (strcmp("en", s + 5) == 0) + return PIDX_SIGNATURE_PARAM_PSS_SALTLEN; + break; + case '\0': + return PIDX_MAC_PARAM_SALT; + } + } + break; + case 'v': + if (strcmp("e-parameters", s + 3) == 0) + return PIDX_ENCODER_PARAM_SAVE_PARAMETERS; + } + break; + case 'e': + switch(s[2]) { + default: + break; + case 'c': + switch(s[3]) { + default: + break; + case 'r': + if (strcmp("et", s + 4) == 0) + return PIDX_KDF_PARAM_SECRET; + break; + case 'u': + switch(s[4]) { + default: + break; + case 'r': + switch(s[5]) { + default: + break; + case 'i': + switch(s[6]) { + default: + break; + case 't': + switch(s[7]) { + default: + break; + case 'y': + switch(s[8]) { + default: + break; + case '-': + switch(s[9]) { + default: + break; + case 'b': + if (strcmp("its", s + 10) == 0) + return PIDX_PKEY_PARAM_SECURITY_BITS; + break; + case 'c': + if (strcmp("hecks", s + 10) == 0) + return PIDX_PROV_PARAM_SECURITY_CHECKS; + } + } + } + } + } + } + } + break; + case 'e': + if (strcmp("d", s + 3) == 0) + return PIDX_PKEY_PARAM_SLH_DSA_SEED; + break; + case 'r': + if (strcmp("ial", s + 3) == 0) + return PIDX_STORE_PARAM_SERIAL; + break; + case 's': + if (strcmp("sion_id", s + 3) == 0) + return PIDX_KDF_PARAM_SSHKDF_SESSION_ID; + } + break; + case 'i': + switch(s[2]) { + default: + break; + case 'g': + switch(s[3]) { + default: + break; + case 'n': + switch(s[4]) { + default: + break; + case '-': + switch(s[5]) { + default: + break; + case 'c': + if (strcmp("heck", s + 6) == 0) + return PIDX_PKEY_PARAM_FIPS_SIGN_CHECK; + break; + case 'x': + if (strcmp("931-pad-check", s + 6) == 0) + return PIDX_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK; + } + break; + case 'a': + switch(s[5]) { + default: + break; + case 't': + switch(s[6]) { + default: + break; + case 'u': + switch(s[7]) { + default: + break; + case 'r': + switch(s[8]) { + default: + break; + case 'e': + switch(s[9]) { + default: + break; + case '-': + if (strcmp("digest-check", s + 10) == 0) + return PIDX_PROV_PARAM_SIGNATURE_DIGEST_CHECK; + break; + case '\0': + return PIDX_SIGNATURE_PARAM_SIGNATURE; + } + } + } + } + } + } + } + break; + case 'z': + if (strcmp("e", s + 3) == 0) + return PIDX_MAC_PARAM_SIZE; + } + break; + case 'p': + if (strcmp("eed", s + 2) == 0) + return PIDX_CIPHER_PARAM_SPEED; + break; + case 's': + switch(s[2]) { + default: + break; + case 'h': + switch(s[3]) { + default: + break; + case 'k': + switch(s[4]) { + default: + break; + case 'd': + switch(s[5]) { + default: + break; + case 'f': + switch(s[6]) { + default: + break; + case '-': + switch(s[7]) { + default: + break; + case 'd': + if (strcmp("igest-check", s + 8) == 0) + return PIDX_PROV_PARAM_SSHKDF_DIGEST_CHECK; + break; + case 'k': + if (strcmp("ey-check", s + 8) == 0) + return PIDX_PROV_PARAM_SSHKDF_KEY_CHECK; + } + } + } + } + } + break; + case 'k': + switch(s[3]) { + default: + break; + case 'd': + switch(s[4]) { + default: + break; + case 'f': + switch(s[5]) { + default: + break; + case '-': + switch(s[6]) { + default: + break; + case 'd': + if (strcmp("igest-check", s + 7) == 0) + return PIDX_PROV_PARAM_SSKDF_DIGEST_CHECK; + break; + case 'k': + if (strcmp("ey-check", s + 7) == 0) + return PIDX_PROV_PARAM_SSKDF_KEY_CHECK; + } + } + } + } + break; + case 'l': + if (strcmp("3-ms", s + 3) == 0) + return PIDX_DIGEST_PARAM_SSL3_MS; + } + break; + case 't': + switch(s[2]) { + default: + break; + case '-': + switch(s[3]) { + default: + break; + case 'd': + if (strcmp("esc", s + 4) == 0) + return PIDX_PROV_PARAM_SELF_TEST_DESC; + break; + case 'p': + if (strcmp("hase", s + 4) == 0) + return PIDX_PROV_PARAM_SELF_TEST_PHASE; + break; + case 't': + if (strcmp("ype", s + 4) == 0) + return PIDX_PROV_PARAM_SELF_TEST_TYPE; + } + break; + case 'a': + switch(s[3]) { + default: + break; + case 't': + switch(s[4]) { + default: + break; + case 'e': + switch(s[5]) { + default: + break; + case '\0': + return PIDX_RAND_PARAM_STATE; + } + break; + case 'u': + if (strcmp("s", s + 5) == 0) + return PIDX_PROV_PARAM_STATUS; + } + } + break; + case 'r': + switch(s[3]) { + default: + break; + case 'e': + switch(s[4]) { + default: + break; + case 'a': + if (strcmp("m_mac", s + 5) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_STREAM_MAC; + break; + case 'n': + if (strcmp("gth", s + 5) == 0) + return PIDX_RAND_PARAM_STRENGTH; + } + } + } + break; + case 'u': + switch(s[2]) { + default: + break; + case 'b': + if (strcmp("ject", s + 3) == 0) + return PIDX_STORE_PARAM_SUBJECT; + break; + case 'p': + switch(s[3]) { + default: + break; + case 'p': + switch(s[4]) { + default: + break; + case '-': + switch(s[5]) { + default: + break; + case 'p': + switch(s[6]) { + default: + break; + case 'r': + if (strcmp("ivinfo", s + 7) == 0) + return PIDX_KDF_PARAM_X942_SUPP_PRIVINFO; + break; + case 'u': + if (strcmp("binfo", s + 7) == 0) + return PIDX_KDF_PARAM_X942_SUPP_PUBINFO; + } + } + } + } + } + } + break; + case 't': + switch(s[1]) { + default: + break; + case 'a': + switch(s[2]) { + default: + break; + case 'g': + switch(s[3]) { + default: + break; + case 'l': + if (strcmp("en", s + 4) == 0) + return PIDX_CIPHER_PARAM_AEAD_TAGLEN; + break; + case '\0': + return PIDX_CIPHER_PARAM_AEAD_TAG; + } + } + break; + case 'd': + if (strcmp("es-encrypt-disabled", s + 2) == 0) + return PIDX_PROV_PARAM_TDES_ENCRYPT_DISABLED; + break; + case 'e': + switch(s[2]) { + default: + break; + case 's': + switch(s[3]) { + default: + break; + case 't': + switch(s[4]) { + default: + break; + case '-': + if (strcmp("entropy", s + 5) == 0) + return PIDX_SIGNATURE_PARAM_TEST_ENTROPY; + break; + case '_': + switch(s[5]) { + default: + break; + case 'e': + if (strcmp("ntropy", s + 6) == 0) + return PIDX_RAND_PARAM_TEST_ENTROPY; + break; + case 'n': + if (strcmp("once", s + 6) == 0) + return PIDX_RAND_PARAM_TEST_NONCE; + } + } + } + } + break; + case 'h': + if (strcmp("reads", s + 2) == 0) + return PIDX_KDF_PARAM_THREADS; + break; + case 'l': + switch(s[2]) { + default: + break; + case 's': + switch(s[3]) { + default: + break; + case '-': + switch(s[4]) { + default: + break; + case 'c': + if (strcmp("lient-version", s + 5) == 0) + return PIDX_ASYM_CIPHER_PARAM_TLS_CLIENT_VERSION; + break; + case 'd': + if (strcmp("ata-size", s + 5) == 0) + return PIDX_MAC_PARAM_TLS_DATA_SIZE; + break; + case 'g': + switch(s[5]) { + default: + break; + case 'r': + switch(s[6]) { + default: + break; + case 'o': + switch(s[7]) { + default: + break; + case 'u': + switch(s[8]) { + default: + break; + case 'p': + switch(s[9]) { + default: + break; + case '-': + switch(s[10]) { + default: + break; + case 'a': + if (strcmp("lg", s + 11) == 0) + return PIDX_CAPABILITY_TLS_GROUP_ALG; + break; + case 'i': + switch(s[11]) { + default: + break; + case 'd': + switch(s[12]) { + default: + break; + case '\0': + return PIDX_CAPABILITY_TLS_GROUP_ID; + } + break; + case 's': + if (strcmp("-kem", s + 12) == 0) + return PIDX_CAPABILITY_TLS_GROUP_IS_KEM; + } + break; + case 'n': + switch(s[11]) { + default: + break; + case 'a': + switch(s[12]) { + default: + break; + case 'm': + switch(s[13]) { + default: + break; + case 'e': + switch(s[14]) { + default: + break; + case '-': + if (strcmp("internal", s + 15) == 0) + return PIDX_CAPABILITY_TLS_GROUP_NAME_INTERNAL; + break; + case '\0': + return PIDX_CAPABILITY_TLS_GROUP_NAME; + } + } + } + } + break; + case 's': + if (strcmp("ec-bits", s + 11) == 0) + return PIDX_CAPABILITY_TLS_GROUP_SECURITY_BITS; + } + } + } + } + } + } + break; + case 'm': + switch(s[5]) { + default: + break; + case 'a': + switch(s[6]) { + default: + break; + case 'c': + switch(s[7]) { + default: + break; + case '-': + if (strcmp("size", s + 8) == 0) + return PIDX_CIPHER_PARAM_TLS_MAC_SIZE; + break; + case '\0': + return PIDX_CIPHER_PARAM_TLS_MAC; + } + break; + case 'x': + switch(s[7]) { + default: + break; + case '-': + switch(s[8]) { + default: + break; + case 'd': + if (strcmp("tls", s + 9) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_MAX_DTLS; + break; + case 't': + if (strcmp("ls", s + 9) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_MAX_TLS; + } + } + } + break; + case 'i': + switch(s[6]) { + default: + break; + case 'n': + switch(s[7]) { + default: + break; + case '-': + switch(s[8]) { + default: + break; + case 'd': + if (strcmp("tls", s + 9) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_MIN_DTLS; + break; + case 't': + if (strcmp("ls", s + 9) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_MIN_TLS; + } + } + } + break; + case 'u': + if (strcmp("lti", s + 6) == 0) + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK; + } + break; + case 'n': + if (strcmp("egotiated-version", s + 5) == 0) + return PIDX_ASYM_CIPHER_PARAM_TLS_NEGOTIATED_VERSION; + break; + case 's': + switch(s[5]) { + default: + break; + case 'i': + switch(s[6]) { + default: + break; + case 'g': + switch(s[7]) { + default: + break; + case 'a': + switch(s[8]) { + default: + break; + case 'l': + switch(s[9]) { + default: + break; + case 'g': + switch(s[10]) { + default: + break; + case '-': + switch(s[11]) { + default: + break; + case 'c': + if (strcmp("ode-point", s + 12) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_CODE_POINT; + break; + case 'h': + switch(s[12]) { + default: + break; + case 'a': + switch(s[13]) { + default: + break; + case 's': + switch(s[14]) { + default: + break; + case 'h': + switch(s[15]) { + default: + break; + case '-': + switch(s[16]) { + default: + break; + case 'n': + if (strcmp("ame", s + 17) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_HASH_NAME; + break; + case 'o': + if (strcmp("id", s + 17) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_HASH_OID; + } + } + } + } + } + break; + case 'i': + if (strcmp("ana-name", s + 12) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_IANA_NAME; + break; + case 'k': + switch(s[12]) { + default: + break; + case 'e': + switch(s[13]) { + default: + break; + case 'y': + switch(s[14]) { + default: + break; + case 't': + switch(s[15]) { + default: + break; + case 'y': + switch(s[16]) { + default: + break; + case 'p': + switch(s[17]) { + default: + break; + case 'e': + switch(s[18]) { + default: + break; + case '-': + if (strcmp("oid", s + 19) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_KEYTYPE_OID; + break; + case '\0': + return PIDX_CAPABILITY_TLS_SIGALG_KEYTYPE; + } + } + } + } + } + } + } + break; + case 'n': + if (strcmp("ame", s + 12) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_NAME; + break; + case 'o': + if (strcmp("id", s + 12) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_OID; + break; + case 's': + switch(s[12]) { + default: + break; + case 'e': + if (strcmp("c-bits", s + 13) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_SECURITY_BITS; + break; + case 'i': + switch(s[13]) { + default: + break; + case 'g': + switch(s[14]) { + default: + break; + case '-': + switch(s[15]) { + default: + break; + case 'n': + if (strcmp("ame", s + 16) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_SIG_NAME; + break; + case 'o': + if (strcmp("id", s + 16) == 0) + return PIDX_CAPABILITY_TLS_SIGALG_SIG_OID; + } + } + } + } + } + } + } + } + } + } + } + break; + case 'v': + if (strcmp("ersion", s + 5) == 0) + return PIDX_CIPHER_PARAM_TLS_VERSION; + } + break; + case '1': + switch(s[4]) { + default: + break; + case '-': + switch(s[5]) { + default: + break; + case 'p': + switch(s[6]) { + default: + break; + case 'r': + switch(s[7]) { + default: + break; + case 'f': + switch(s[8]) { + default: + break; + case '-': + switch(s[9]) { + default: + break; + case 'd': + if (strcmp("igest-check", s + 10) == 0) + return PIDX_PROV_PARAM_TLS1_PRF_DIGEST_CHECK; + break; + case 'e': + if (strcmp("ms-check", s + 10) == 0) + return PIDX_PROV_PARAM_TLS1_PRF_EMS_CHECK; + break; + case 'k': + if (strcmp("ey-check", s + 10) == 0) + return PIDX_PROV_PARAM_TLS1_PRF_KEY_CHECK; + } + } + } + } + } + break; + case '3': + switch(s[5]) { + default: + break; + case '-': + switch(s[6]) { + default: + break; + case 'k': + switch(s[7]) { + default: + break; + case 'd': + switch(s[8]) { + default: + break; + case 'f': + switch(s[9]) { + default: + break; + case '-': + switch(s[10]) { + default: + break; + case 'd': + if (strcmp("igest-check", s + 11) == 0) + return PIDX_PROV_PARAM_TLS13_KDF_DIGEST_CHECK; + break; + case 'k': + if (strcmp("ey-check", s + 11) == 0) + return PIDX_PROV_PARAM_TLS13_KDF_KEY_CHECK; + } + } + } + } + } + } + break; + case 'm': + switch(s[5]) { + default: + break; + case 'u': + switch(s[6]) { + default: + break; + case 'l': + switch(s[7]) { + default: + break; + case 't': + switch(s[8]) { + default: + break; + case 'i': + switch(s[9]) { + default: + break; + case '_': + switch(s[10]) { + default: + break; + case 'a': + switch(s[11]) { + default: + break; + case 'a': + switch(s[12]) { + default: + break; + case 'd': + switch(s[13]) { + default: + break; + case 'p': + if (strcmp("acklen", s + 14) == 0) + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD_PACKLEN; + break; + case '\0': + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD; + } + } + } + break; + case 'e': + switch(s[11]) { + default: + break; + case 'n': + switch(s[12]) { + default: + break; + case 'c': + switch(s[13]) { + default: + break; + case 'i': + if (strcmp("n", s + 14) == 0) + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_IN; + break; + case 'l': + if (strcmp("en", s + 14) == 0) + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_LEN; + break; + case '\0': + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC; + } + } + } + break; + case 'i': + if (strcmp("nterleave", s + 11) == 0) + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE; + break; + case 'm': + switch(s[11]) { + default: + break; + case 'a': + switch(s[12]) { + default: + break; + case 'x': + switch(s[13]) { + default: + break; + case 'b': + if (strcmp("ufsz", s + 14) == 0) + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_BUFSIZE; + break; + case 's': + if (strcmp("ndfrag", s + 14) == 0) + return PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_SEND_FRAGMENT; + } + } + } + } + } + } + } + } + } + } + break; + case 'a': + switch(s[4]) { + default: + break; + case 'a': + switch(s[5]) { + default: + break; + case 'd': + switch(s[6]) { + default: + break; + case 'p': + if (strcmp("ad", s + 7) == 0) + return PIDX_CIPHER_PARAM_AEAD_TLS1_AAD_PAD; + break; + case '\0': + return PIDX_CIPHER_PARAM_AEAD_TLS1_AAD; + } + } + } + break; + case 'i': + switch(s[4]) { + default: + break; + case 'v': + switch(s[5]) { + default: + break; + case 'f': + if (strcmp("ixed", s + 6) == 0) + return PIDX_CIPHER_PARAM_AEAD_TLS1_IV_FIXED; + break; + case 'g': + if (strcmp("en", s + 6) == 0) + return PIDX_CIPHER_PARAM_AEAD_TLS1_GET_IV_GEN; + break; + case 'i': + if (strcmp("nv", s + 6) == 0) + return PIDX_CIPHER_PARAM_AEAD_TLS1_SET_IV_INV; + } + } + break; + case 't': + if (strcmp("ree", s + 4) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_TLSTREE; + } + } + break; + case 'p': + switch(s[2]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_EC_CHAR2_TP_BASIS; + } + break; + case 'y': + if (strcmp("pe", s + 2) == 0) + return PIDX_PKEY_PARAM_FFC_TYPE; + } + break; + case 'u': + switch(s[1]) { + default: + break; + case 'k': + if (strcmp("m", s + 2) == 0) + return PIDX_KDF_PARAM_UKM; + break; + case 'p': + if (strcmp("dated-iv", s + 2) == 0) + return PIDX_CIPHER_PARAM_UPDATED_IV; + break; + case 's': + switch(s[2]) { + default: + break; + case 'e': + switch(s[3]) { + default: + break; + case '-': + switch(s[4]) { + default: + break; + case 'b': + if (strcmp("its", s + 5) == 0) + return PIDX_CIPHER_PARAM_USE_BITS; + break; + case 'c': + if (strcmp("ofactor-flag", s + 5) == 0) + return PIDX_PKEY_PARAM_USE_COFACTOR_FLAG; + break; + case 'k': + if (strcmp("eybits", s + 5) == 0) + return PIDX_KDF_PARAM_X942_USE_KEYBITS; + break; + case 'l': + switch(s[5]) { + default: + break; + case '\0': + return PIDX_KDF_PARAM_KBKDF_USE_L; + } + break; + case 's': + if (strcmp("eparator", s + 5) == 0) + return PIDX_KDF_PARAM_KBKDF_USE_SEPARATOR; + } + break; + case '_': + switch(s[4]) { + default: + break; + case 'd': + if (strcmp("erivation_function", s + 5) == 0) + return PIDX_DRBG_PARAM_USE_DF; + break; + case 'e': + if (strcmp("tm", s + 5) == 0) + return PIDX_LIBSSL_RECORD_LAYER_PARAM_USE_ETM; + } + } + } + } + break; + case 'v': + switch(s[1]) { + default: + break; + case 'a': + switch(s[2]) { + default: + break; + case 'l': + switch(s[3]) { + default: + break; + case 'i': + switch(s[4]) { + default: + break; + case 'd': + switch(s[5]) { + default: + break; + case 'a': + switch(s[6]) { + default: + break; + case 't': + switch(s[7]) { + default: + break; + case 'e': + switch(s[8]) { + default: + break; + case '-': + switch(s[9]) { + default: + break; + case 'g': + switch(s[10]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_FFC_VALIDATE_G; + } + break; + case 'l': + if (strcmp("egacy", s + 10) == 0) + return PIDX_PKEY_PARAM_FFC_VALIDATE_LEGACY; + break; + case 'p': + if (strcmp("q", s + 10) == 0) + return PIDX_PKEY_PARAM_FFC_VALIDATE_PQ; + } + } + } + } + } + } + } + } + break; + case 'e': + switch(s[2]) { + default: + break; + case 'r': + switch(s[3]) { + default: + break; + case 'i': + if (strcmp("fy-message", s + 4) == 0) + return PIDX_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE; + break; + case 's': + if (strcmp("ion", s + 4) == 0) + return PIDX_PROV_PARAM_VERSION; + } + } + } + break; + case 'x': + switch(s[1]) { + default: + break; + case '9': + switch(s[2]) { + default: + break; + case '4': + if (strcmp("2kdf-key-check", s + 3) == 0) + return PIDX_PROV_PARAM_X942KDF_KEY_CHECK; + break; + case '6': + switch(s[3]) { + default: + break; + case '3': + switch(s[4]) { + default: + break; + case 'k': + switch(s[5]) { + default: + break; + case 'd': + switch(s[6]) { + default: + break; + case 'f': + switch(s[7]) { + default: + break; + case '-': + switch(s[8]) { + default: + break; + case 'd': + if (strcmp("igest-check", s + 9) == 0) + return PIDX_PROV_PARAM_X963KDF_DIGEST_CHECK; + break; + case 'k': + if (strcmp("ey-check", s + 9) == 0) + return PIDX_PROV_PARAM_X963KDF_KEY_CHECK; + } + } + } + } + } + } + } + break; + case 'c': + if (strcmp("ghash", s + 2) == 0) + return PIDX_KDF_PARAM_SSHKDF_XCGHASH; + break; + case 'o': + switch(s[2]) { + default: + break; + case 'f': + switch(s[3]) { + default: + break; + case 'l': + if (strcmp("en", s + 4) == 0) + return PIDX_DIGEST_PARAM_XOFLEN; + break; + case '\0': + return PIDX_MAC_PARAM_XOF; + } + } + break; + case 'p': + switch(s[2]) { + default: + break; + case '1': + switch(s[3]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_XP1; + } + break; + case '2': + switch(s[3]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_XP2; + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_XP; + } + break; + case 'q': + switch(s[2]) { + default: + break; + case '1': + switch(s[3]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_XQ1; + } + break; + case '2': + switch(s[3]) { + default: + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_XQ2; + } + break; + case '\0': + return PIDX_PKEY_PARAM_RSA_TEST_XQ; + } + break; + case 't': + if (strcmp("s_standard", s + 2) == 0) + return PIDX_CIPHER_PARAM_XTS_STANDARD; + } + } + return -1; +} + +/* clang-format on */ +/* End of TRIE */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/riscv64cpuid.s b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/riscv64cpuid.s new file mode 100644 index 000000000000..cef02fbcf6d7 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/riscv64cpuid.s @@ -0,0 +1,71 @@ +################################################################################ +# int CRYPTO_memcmp(const void * in_a, const void * in_b, size_t len) +################################################################################ +.text +.balign 16 +.globl CRYPTO_memcmp +.type CRYPTO_memcmp,@function +CRYPTO_memcmp: + li t0,0 + beqz a2,2f # len == 0 +1: + lbu t1,0(a0) + lbu t2,0(a1) + addi a0,a0,1 + addi a1,a1,1 + addi a2,a2,-1 + xor t1,t1,t2 + or t0,t0,t1 + bgtz a2,1b +2: + mv a0,t0 + ret +################################################################################ +# void OPENSSL_cleanse(void *ptr, size_t len) +################################################################################ +.text +.balign 16 +.globl OPENSSL_cleanse +.type OPENSSL_cleanse,@function +OPENSSL_cleanse: + beqz a1,2f # len == 0, return + srli t0,a1,4 + bnez t0,3f # len > 15 + +1: # Store <= 15 individual bytes + sb x0,0(a0) + addi a0,a0,1 + addi a1,a1,-1 + bnez a1,1b +2: + ret + +3: # Store individual bytes until we are aligned + andi t0,a0,0x7 + beqz t0,4f + sb x0,0(a0) + addi a0,a0,1 + addi a1,a1,-1 + j 3b + +4: # Store aligned dwords + li t1,8 +4: + sd x0,0(a0) + addi a0,a0,8 + addi a1,a1,-8 + bge a1,t1,4b # if len>=8 loop + bnez a1,1b # if len<8 and len != 0, store remaining bytes + ret +################################################################################ +# size_t riscv_vlen_asm(void) +# Return VLEN (i.e. the length of a vector register in bits). +.p2align 3 +.globl riscv_vlen_asm +.type riscv_vlen_asm,@function +riscv_vlen_asm: + # 0xc22 is CSR vlenb + csrr a0, 0xc22 + slli a0, a0, 3 + ret +.size riscv_vlen_asm,.-riscv_vlen_asm diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S new file mode 100644 index 000000000000..92ea27ec9c44 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S @@ -0,0 +1,229 @@ +.text +.p2align 2 +.globl sha256_block_data_order_zvkb_zvknha_or_zvknhb +.type sha256_block_data_order_zvkb_zvknha_or_zvknhb,@function +sha256_block_data_order_zvkb_zvknha_or_zvknhb: + .word 3439489111 + + la a3, K256 # Load round constants K256 + .word 34006279 + addi a3, a3, 16 + .word 34006407 + addi a3, a3, 16 + .word 34006535 + addi a3, a3, 16 + .word 34006663 + addi a3, a3, 16 + .word 34006791 + addi a3, a3, 16 + .word 34006919 + addi a3, a3, 16 + .word 34007047 + addi a3, a3, 16 + .word 34007175 + addi a3, a3, 16 + .word 34007303 + addi a3, a3, 16 + .word 34007431 + addi a3, a3, 16 + .word 34007559 + addi a3, a3, 16 + .word 34007687 + addi a3, a3, 16 + .word 34007815 + addi a3, a3, 16 + .word 34007943 + addi a3, a3, 16 + .word 34008071 + addi a3, a3, 16 + .word 34008199 + + + # H is stored as {a,b,c,d},{e,f,g,h}, but we need {f,e,b,a},{h,g,d,c} + # The dst vtype is e32m1 and the index vtype is e8mf4. + # We use index-load with the following index pattern at v26. + # i8 index: + # 20, 16, 4, 0 + # Instead of setting the i8 index, we could use a single 32bit + # little-endian value to cover the 4xi8 index. + # i32 value: + # 0x 00 04 10 14 + li t4, 0x00041014 + .word 3439390807 + .word 1578028375 + + addi t3, a0, 8 + + # Use index-load to get {f,e,b,a},{h,g,d,c} + .word 3439489111 + .word 128254727 + .word 128844679 + + # Setup v0 mask for the vmerge to replace the first word (idx==0) in key-scheduling. + # The AVL is 4 in SHA, so we could use a single e8(8 element masking) for masking. + .word 3422613591 + .word 1577103447 + + .word 3439489111 + +L_round_loop: + # Decrement length by 1 + add a2, a2, -1 + + # Keep the current state as we need it later: H' = H+{a',b',c',...,h'}. + .word 1577258839 + .word 1577291735 + + # Load the 512-bits of the message block in v1-v4 and perform + # an endian swap on each 4 bytes element. + .word 33939591 + .word 1242865879 + add a1, a1, 16 + .word 33939719 + .word 1243914583 + add a1, a1, 16 + .word 33939847 + .word 1244963287 + add a1, a1, 16 + .word 33939975 + .word 1246011991 + add a1, a1, 16 + + # Quad-round 0 (+0, Wt from oldest to newest in v1->v2->v3->v4) + .word 44073687 + .word 3194135543 + .word 3128075127 + .word 1546715863 + .word 3058835703 # Generate W[19:16] + + # Quad-round 1 (+1, v2->v3->v4->v1) + .word 45155031 + .word 3194135543 + .word 3128075127 + .word 1547797207 + .word 3058737527 # Generate W[23:20] + + # Quad-round 2 (+2, v3->v4->v1->v2) + .word 46236375 + .word 3194135543 + .word 3128075127 + .word 1544684247 + .word 3058770423 # Generate W[27:24] + + # Quad-round 3 (+3, v4->v1->v2->v3) + .word 47317719 + .word 3194135543 + .word 3128075127 + .word 1545634519 + .word 3058803319 # Generate W[31:28] + + # Quad-round 4 (+0, v1->v2->v3->v4) + .word 48267991 + .word 3194135543 + .word 3128075127 + .word 1546715863 + .word 3058835703 # Generate W[35:32] + + # Quad-round 5 (+1, v2->v3->v4->v1) + .word 49349335 + .word 3194135543 + .word 3128075127 + .word 1547797207 + .word 3058737527 # Generate W[39:36] + + # Quad-round 6 (+2, v3->v4->v1->v2) + .word 50430679 + .word 3194135543 + .word 3128075127 + .word 1544684247 + .word 3058770423 # Generate W[43:40] + + # Quad-round 7 (+3, v4->v1->v2->v3) + .word 51512023 + .word 3194135543 + .word 3128075127 + .word 1545634519 + .word 3058803319 # Generate W[47:44] + + # Quad-round 8 (+0, v1->v2->v3->v4) + .word 52462295 + .word 3194135543 + .word 3128075127 + .word 1546715863 + .word 3058835703 # Generate W[51:48] + + # Quad-round 9 (+1, v2->v3->v4->v1) + .word 53543639 + .word 3194135543 + .word 3128075127 + .word 1547797207 + .word 3058737527 # Generate W[55:52] + + # Quad-round 10 (+2, v3->v4->v1->v2) + .word 54624983 + .word 3194135543 + .word 3128075127 + .word 1544684247 + .word 3058770423 # Generate W[59:56] + + # Quad-round 11 (+3, v4->v1->v2->v3) + .word 55706327 + .word 3194135543 + .word 3128075127 + .word 1545634519 + .word 3058803319 # Generate W[63:60] + + # Quad-round 12 (+0, v1->v2->v3->v4) + # Note that we stop generating new message schedule words (Wt, v1-13) + # as we already generated all the words we end up consuming (i.e., W[63:60]). + .word 56656599 + .word 3194135543 + .word 3128075127 + + # Quad-round 13 (+1, v2->v3->v4->v1) + .word 57737943 + .word 3194135543 + .word 3128075127 + + # Quad-round 14 (+2, v3->v4->v1->v2) + .word 58819287 + .word 3194135543 + .word 3128075127 + + # Quad-round 15 (+3, v4->v1->v2->v3) + .word 59900631 + .word 3194135543 + .word 3128075127 + + # H' = H+{a',b',c',...,h'} + .word 65209175 + .word 66290647 + bnez a2, L_round_loop + + # Store {f,e,b,a},{h,g,d,c} back to {a,b,c,d},{e,f,g,h}. + .word 128254759 + .word 128844711 + + ret +.size sha256_block_data_order_zvkb_zvknha_or_zvknhb,.-sha256_block_data_order_zvkb_zvknha_or_zvknhb + +.p2align 2 +.type K256,@object +K256: + .word 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5 + .word 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5 + .word 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3 + .word 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174 + .word 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc + .word 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da + .word 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7 + .word 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967 + .word 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13 + .word 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85 + .word 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3 + .word 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070 + .word 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5 + .word 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3 + .word 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208 + .word 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +.size K256,.-K256 diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/sha/sha512-riscv64-zvkb-zvknhb.S b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/sha/sha512-riscv64-zvkb-zvknhb.S new file mode 100644 index 000000000000..da1817a64af5 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/sha/sha512-riscv64-zvkb-zvknhb.S @@ -0,0 +1,184 @@ +.text +.p2align 2 +.globl sha512_block_data_order_zvkb_zvknhb +.type sha512_block_data_order_zvkb_zvknhb,@function +sha512_block_data_order_zvkb_zvknhb: + .word 3448926295 + + # H is stored as {a,b,c,d},{e,f,g,h}, but we need {f,e,b,a},{h,g,d,c} + # The dst vtype is e64m2 and the index vtype is e8mf4. + # We use index-load with the following index pattern at v1. + # i8 index: + # 40, 32, 8, 0 + # Instead of setting the i8 index, we could use a single 32bit + # little-endian value to cover the 4xi8 index. + # i32 value: + # 0x 00 08 20 28 + li t4, 0x00082028 + .word 3439390807 + .word 1578025175 + + addi t3, a0, 16 + + # Use index-load to get {f,e,b,a},{h,g,d,c} + .word 3448926295 + .word 102042375 + .word 102632455 + + # Setup v0 mask for the vmerge to replace the first word (idx==0) in key-scheduling. + # The AVL is 4 in SHA, so we could use a single e8(8 element masking) for masking. + .word 3422613591 + .word 1577103447 + + .word 3448926295 + +L_round_loop: + # Load round constants K512 + la a3, K512 + + # Decrement length by 1 + addi a2, a2, -1 + + # Keep the current state as we need it later: H' = H+{a',b',c',...,h'}. + .word 1577782615 + .word 1577848407 + + # Load the 1024-bits of the message block in v10-v16 and perform the endian + # swap. + .word 33944839 + .word 1252304215 + addi a1, a1, 32 + .word 33945095 + .word 1254401623 + addi a1, a1, 32 + .word 33945351 + .word 1256499031 + addi a1, a1, 32 + .word 33945607 + .word 1258596439 + addi a1, a1, 32 + + .rept 4 + # Quad-round 0 (+0, v10->v12->v14->v16) + .word 34011655 + addi a3, a3, 32 + .word 54856023 + .word 3211340919 + .word 3146328951 + .word 1558579543 + .word 3072861559 + + # Quad-round 1 (+1, v12->v14->v16->v10) + .word 34011655 + addi a3, a3, 32 + .word 54921559 + .word 3211340919 + .word 3146328951 + .word 1560742231 + .word 3072665207 + + # Quad-round 2 (+2, v14->v16->v10->v12) + .word 34011655 + addi a3, a3, 32 + .word 54987095 + .word 3211340919 + .word 3146328951 + .word 1554516311 + .word 3072730999 + + # Quad-round 3 (+3, v16->v10->v12->v14) + .word 34011655 + addi a3, a3, 32 + .word 55052631 + .word 3211340919 + .word 3146328951 + .word 1556416855 + .word 3072796791 + .endr + + # Quad-round 16 (+0, v10->v12->v14->v16) + # Note that we stop generating new message schedule words (Wt, v10-16) + # as we already generated all the words we end up consuming (i.e., W[79:76]). + .word 34011655 + addi a3, a3, 32 + .word 54856023 + .word 3211340919 + .word 3146328951 + + # Quad-round 17 (+1, v12->v14->v16->v10) + .word 34011655 + addi a3, a3, 32 + .word 54921559 + .word 3211340919 + .word 3146328951 + + # Quad-round 18 (+2, v14->v16->v10->v12) + .word 34011655 + addi a3, a3, 32 + .word 54987095 + .word 3211340919 + .word 3146328951 + + # Quad-round 19 (+3, v16->v10->v12->v14) + .word 34011655 + # No t1 increment needed. + .word 55052631 + .word 3211340919 + .word 3146328951 + + # H' = H+{a',b',c',...,h'} + .word 61541207 + .word 63704151 + bnez a2, L_round_loop + + # Store {f,e,b,a},{h,g,d,c} back to {a,b,c,d},{e,f,g,h}. + .word 102042407 + .word 102632487 + + ret +.size sha512_block_data_order_zvkb_zvknhb,.-sha512_block_data_order_zvkb_zvknhb + +.p2align 3 +.type K512,@object +K512: + .dword 0x428a2f98d728ae22, 0x7137449123ef65cd + .dword 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc + .dword 0x3956c25bf348b538, 0x59f111f1b605d019 + .dword 0x923f82a4af194f9b, 0xab1c5ed5da6d8118 + .dword 0xd807aa98a3030242, 0x12835b0145706fbe + .dword 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2 + .dword 0x72be5d74f27b896f, 0x80deb1fe3b1696b1 + .dword 0x9bdc06a725c71235, 0xc19bf174cf692694 + .dword 0xe49b69c19ef14ad2, 0xefbe4786384f25e3 + .dword 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65 + .dword 0x2de92c6f592b0275, 0x4a7484aa6ea6e483 + .dword 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5 + .dword 0x983e5152ee66dfab, 0xa831c66d2db43210 + .dword 0xb00327c898fb213f, 0xbf597fc7beef0ee4 + .dword 0xc6e00bf33da88fc2, 0xd5a79147930aa725 + .dword 0x06ca6351e003826f, 0x142929670a0e6e70 + .dword 0x27b70a8546d22ffc, 0x2e1b21385c26c926 + .dword 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df + .dword 0x650a73548baf63de, 0x766a0abb3c77b2a8 + .dword 0x81c2c92e47edaee6, 0x92722c851482353b + .dword 0xa2bfe8a14cf10364, 0xa81a664bbc423001 + .dword 0xc24b8b70d0f89791, 0xc76c51a30654be30 + .dword 0xd192e819d6ef5218, 0xd69906245565a910 + .dword 0xf40e35855771202a, 0x106aa07032bbd1b8 + .dword 0x19a4c116b8d2d0c8, 0x1e376c085141ab53 + .dword 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8 + .dword 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb + .dword 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3 + .dword 0x748f82ee5defb2fc, 0x78a5636f43172f60 + .dword 0x84c87814a1f0ab72, 0x8cc702081a6439ec + .dword 0x90befffa23631e28, 0xa4506cebde82bde9 + .dword 0xbef9a3f7b2c67915, 0xc67178f2e372532b + .dword 0xca273eceea26619c, 0xd186b8c721c0c207 + .dword 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178 + .dword 0x06f067aa72176fba, 0x0a637dc5a2c898a6 + .dword 0x113f9804bef90dae, 0x1b710b35131c471b + .dword 0x28db77f523047d84, 0x32caab7b40c72493 + .dword 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c + .dword 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a + .dword 0x5fcb6fab3ad6faec, 0x6c44198c4a475817 +.size K512,.-K512 diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/sm3/sm3-riscv64-zvksh.S b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/sm3/sm3-riscv64-zvksh.S new file mode 100644 index 000000000000..a5457b97439c --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/sm3/sm3-riscv64-zvksh.S @@ -0,0 +1,150 @@ +.text +.text +.p2align 3 +.globl ossl_hwsm3_block_data_order_zvksh +.type ossl_hwsm3_block_data_order_zvksh,@function +ossl_hwsm3_block_data_order_zvksh: + .word 3440668759 + + # Load initial state of hash context (c->A-H). + .word 33906695 + .word 1241817175 + +L_sm3_loop: + # Copy the previous state to v2. + # It will be XOR'ed with the current state at the end of the round. + .word 1577058647 + + # Load the 64B block in 2x32B chunks. + .word 33940231 # v6 := {w7, ..., w0} + addi a1, a1, 32 + + .word 33940487 # v8 := {w15, ..., w8} + addi a1, a1, 32 + + addi a2, a2, -1 + + # As vsm3c consumes only w0, w1, w4, w5 we need to slide the input + # 2 elements down so we process elements w2, w3, w6, w7 + # This will be repeated for each odd round. + .word 1046557271 # v4 := {X, X, w7, ..., w2} + + .word 2925535351 + .word 2923470967 + + # Prepare a vector with {w11, ..., w4} + .word 1044460119 # v4 := {X, X, X, X, w7, ..., w4} + .word 981611095 # v4 := {w11, w10, w9, w8, w7, w6, w5, w4} + + .word 2923503735 + .word 1044460119 # v4 := {X, X, w11, w10, w9, w8, w7, w6} + .word 2923536503 + + .word 2927763575 + .word 1048654423 # v4 := {X, X, w15, w14, w13, w12, w11, w10} + .word 2923602039 + + .word 2189632375 # v6 := {w23, w22, w21, w20, w19, w18, w17, w16} + + # Prepare a register with {w19, w18, w17, w16, w15, w14, w13, w12} + .word 1044460119 # v4 := {X, X, X, X, w15, w14, w13, w12} + .word 979513943 # v4 := {w19, w18, w17, w16, w15, w14, w13, w12} + + .word 2923634807 + .word 1044460119 # v4 := {X, X, w19, w18, w17, w16, w15, w14} + .word 2923667575 + + .word 2925797495 + .word 1046557271 # v4 := {X, X, w23, w22, w21, w20, w19, w18} + .word 2923733111 + + .word 2187601015 # v8 := {w31, w30, w29, w28, w27, w26, w25, w24} + + # Prepare a register with {w27, w26, w25, w24, w23, w22, w21, w20} + .word 1044460119 # v4 := {X, X, X, X, w23, w22, w21, w20} + .word 981611095 # v4 := {w27, w26, w25, w24, w23, w22, w21, w20} + + .word 2923765879 + .word 1044460119 # v4 := {X, X, w27, w26, w25, w24, w23, w22} + .word 2923798647 + + .word 2928025719 + .word 1048654423 # v4 := {x, X, w31, w30, w29, w28, w27, w26} + .word 2923864183 + + .word 2189632375 # v6 := {w32, w33, w34, w35, w36, w37, w38, w39} + + # Prepare a register with {w35, w34, w33, w32, w31, w30, w29, w28} + .word 1044460119 # v4 := {X, X, X, X, w31, w30, w29, w28} + .word 979513943 # v4 := {w35, w34, w33, w32, w31, w30, w29, w28} + + .word 2923896951 + .word 1044460119 # v4 := {X, X, w35, w34, w33, w32, w31, w30} + .word 2923929719 + + .word 2926059639 + .word 1046557271 # v4 := {X, X, w39, w38, w37, w36, w35, w34} + .word 2923995255 + + .word 2187601015 # v8 := {w47, w46, w45, w44, w43, w42, w41, w40} + + # Prepare a register with {w43, w42, w41, w40, w39, w38, w37, w36} + .word 1044460119 # v4 := {X, X, X, X, w39, w38, w37, w36} + .word 981611095 # v4 := {w43, w42, w41, w40, w39, w38, w37, w36} + + .word 2924028023 + .word 1044460119 # v4 := {X, X, w43, w42, w41, w40, w39, w38} + .word 2924060791 + + .word 2928287863 + .word 1048654423 # v4 := {X, X, w47, w46, w45, w44, w43, w42} + .word 2924126327 + + .word 2189632375 # v6 := {w55, w54, w53, w52, w51, w50, w49, w48} + + # Prepare a register with {w51, w50, w49, w48, w47, w46, w45, w44} + .word 1044460119 # v4 := {X, X, X, X, w47, w46, w45, w44} + .word 979513943 # v4 := {w51, w50, w49, w48, w47, w46, w45, w44} + + .word 2924159095 + .word 1044460119 # v4 := {X, X, w51, w50, w49, w48, w47, w46} + .word 2924191863 + + .word 2926321783 + .word 1046557271 # v4 := {X, X, w55, w54, w53, w52, w51, w50} + .word 2924257399 + + .word 2187601015 # v8 := {w63, w62, w61, w60, w59, w58, w57, w56} + + # Prepare a register with {w59, w58, w57, w56, w55, w54, w53, w52} + .word 1044460119 # v4 := {X, X, X, X, w55, w54, w53, w52} + .word 981611095 # v4 := {w59, w58, w57, w56, w55, w54, w53, w52} + + .word 2924290167 + .word 1044460119 # v4 := {X, X, w59, w58, w57, w56, w55, w54} + .word 2924322935 + + .word 2928550007 + .word 1048654423 # v4 := {X, X, w63, w62, w61, w60, w59, w58} + .word 2924388471 + + .word 2189632375 # v6 := {w71, w70, w69, w68, w67, w66, w65, w64} + + # Prepare a register with {w67, w66, w65, w64, w63, w62, w61, w60} + .word 1044460119 # v4 := {X, X, X, X, w63, w62, w61, w60} + .word 979513943 # v4 := {w67, w66, w65, w64, w63, w62, w61, w60} + + .word 2924421239 + .word 1044460119 # v4 := {X, X, w67, w66, w65, w64, w63, w62} + .word 2924454007 + + # XOR in the previous state. + .word 771817559 + + bnez a2, L_sm3_loop # Check if there are any more block to process +L_sm3_end: + .word 1241817175 + .word 33906727 + ret + +.size ossl_hwsm3_block_data_order_zvksh,.-ossl_hwsm3_block_data_order_zvksh diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/sm4/sm4-riscv64-zvksed.s b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/sm4/sm4-riscv64-zvksed.s new file mode 100644 index 000000000000..c353c27e1c06 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/crypto/sm4/sm4-riscv64-zvksed.s @@ -0,0 +1,188 @@ +.text +.p2align 3 +.globl rv64i_zvksed_sm4_set_encrypt_key +.type rv64i_zvksed_sm4_set_encrypt_key,@function +rv64i_zvksed_sm4_set_encrypt_key: + .word 0xc1027057 + + # Load the user key + .word 33906823 + .word 1242865879 + + # Load the FK. + la t0, FK + .word 33743111 + + # Generate round keys. + .word 772866263 + .word 2249204215 # rk[0:3] + .word 2251334263 # rk[4:7] + .word 2252415735 # rk[8:11] + .word 2253497207 # rk[12:15] + .word 2254578679 # rk[16:19] + .word 2255660151 # rk[20:23] + .word 2256741623 # rk[24:27] + .word 2257823095 # rk[28:31] + + # Store round keys + .word 33939879 # rk[0:3] + addi a1, a1, 16 + .word 33940007 # rk[4:7] + addi a1, a1, 16 + .word 33940135 # rk[8:11] + addi a1, a1, 16 + .word 33940263 # rk[12:15] + addi a1, a1, 16 + .word 33940391 # rk[16:19] + addi a1, a1, 16 + .word 33940519 # rk[20:23] + addi a1, a1, 16 + .word 33940647 # rk[24:27] + addi a1, a1, 16 + .word 33940775 # rk[28:31] + + li a0, 1 + ret +.size rv64i_zvksed_sm4_set_encrypt_key,.-rv64i_zvksed_sm4_set_encrypt_key +.p2align 3 +.globl rv64i_zvksed_sm4_set_decrypt_key +.type rv64i_zvksed_sm4_set_decrypt_key,@function +rv64i_zvksed_sm4_set_decrypt_key: + .word 0xc1027057 + + # Load the user key + .word 33906823 + .word 1242865879 + + # Load the FK. + la t0, FK + .word 33743111 + + # Generate round keys. + .word 772866263 + .word 2249204215 # rk[0:3] + .word 2251334263 # rk[4:7] + .word 2252415735 # rk[8:11] + .word 2253497207 # rk[12:15] + .word 2254578679 # rk[16:19] + .word 2255660151 # rk[20:23] + .word 2256741623 # rk[24:27] + .word 2257823095 # rk[28:31] + + # Store round keys in reverse order + addi a1, a1, 12 + li t1, -4 + .word 174449959 # rk[31:28] + addi a1, a1, 16 + .word 174449831 # rk[27:24] + addi a1, a1, 16 + .word 174449703 # rk[23:20] + addi a1, a1, 16 + .word 174449575 # rk[19:16] + addi a1, a1, 16 + .word 174449447 # rk[15:12] + addi a1, a1, 16 + .word 174449319 # rk[11:8] + addi a1, a1, 16 + .word 174449191 # rk[7:4] + addi a1, a1, 16 + .word 174449063 # rk[3:0] + + li a0, 1 + ret +.size rv64i_zvksed_sm4_set_decrypt_key,.-rv64i_zvksed_sm4_set_decrypt_key +.p2align 3 +.globl rv64i_zvksed_sm4_encrypt +.type rv64i_zvksed_sm4_encrypt,@function +rv64i_zvksed_sm4_encrypt: + .word 0xc1027057 + + # Order of elements was adjusted in set_encrypt_key() + .word 33972487 # rk[0:3] + addi a2, a2, 16 + .word 33972615 # rk[4:7] + addi a2, a2, 16 + .word 33972743 # rk[8:11] + addi a2, a2, 16 + .word 33972871 # rk[12:15] + addi a2, a2, 16 + .word 33972999 # rk[16:19] + addi a2, a2, 16 + .word 33973127 # rk[20:23] + addi a2, a2, 16 + .word 33973255 # rk[24:27] + addi a2, a2, 16 + .word 33973383 # rk[28:31] + + # Load input data + .word 33906823 + .word 1242865879 + + # Encrypt with all keys + .word 2787647735 + .word 2788696311 + .word 2789744887 + .word 2790793463 + .word 2791842039 + .word 2792890615 + .word 2793939191 + .word 2794987767 + + # Save the ciphertext (in reverse element order) + .word 1242865879 + li t0, -4 + addi a1, a1, 12 + .word 173400231 + + ret +.size rv64i_zvksed_sm4_encrypt,.-rv64i_zvksed_sm4_encrypt +.p2align 3 +.globl rv64i_zvksed_sm4_decrypt +.type rv64i_zvksed_sm4_decrypt,@function +rv64i_zvksed_sm4_decrypt: + .word 0xc1027057 + + # Order of elements was adjusted in set_decrypt_key() + .word 33973383 # rk[31:28] + addi a2, a2, 16 + .word 33973255 # rk[27:24] + addi a2, a2, 16 + .word 33973127 # rk[23:20] + addi a2, a2, 16 + .word 33972999 # rk[19:16] + addi a2, a2, 16 + .word 33972871 # rk[15:11] + addi a2, a2, 16 + .word 33972743 # rk[11:8] + addi a2, a2, 16 + .word 33972615 # rk[7:4] + addi a2, a2, 16 + .word 33972487 # rk[3:0] + + # Load input data + .word 33906823 + .word 1242865879 + + # Encrypt with all keys + .word 2794987767 + .word 2793939191 + .word 2792890615 + .word 2791842039 + .word 2790793463 + .word 2789744887 + .word 2788696311 + .word 2787647735 + + # Save the ciphertext (in reverse element order) + .word 1242865879 + li t0, -4 + addi a1, a1, 12 + .word 173400231 + + ret +.size rv64i_zvksed_sm4_decrypt,.-rv64i_zvksed_sm4_decrypt +# Family Key (little-endian 32-bit chunks) +.p2align 3 +FK: + .word 0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC +.size FK,.-FK diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/crypto/bn_conf.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/crypto/bn_conf.h new file mode 100644 index 000000000000..2437fc9bd282 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/crypto/bn_conf.h @@ -0,0 +1,37 @@ +/* clang-format off */ +/* WARNING: do not edit! */ +/* Generated by Makefile from include/crypto/bn_conf.h.in */ +/* clang-format on */ +/* + * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_BN_CONF_H +#define OSSL_CRYPTO_BN_CONF_H +#pragma once + +/* + * The contents of this file are not used in the UEFI build, as + * both 32-bit and 64-bit builds are supported from a single run + * of the Configure script. + */ + +/* Should we define BN_DIV2W here? */ + +/* Only one for the following should be defined */ +/* clang-format off */ +#define SIXTY_FOUR_BIT_LONG + /* clang-format on */ + /* clang-format off */ +#undef SIXTY_FOUR_BIT + /* clang-format on */ + /* clang-format off */ +#undef THIRTY_TWO_BIT +/* clang-format on */ + +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/crypto/dso_conf.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/crypto/dso_conf.h new file mode 100644 index 000000000000..29edacf112c8 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/crypto/dso_conf.h @@ -0,0 +1,25 @@ +/* clang-format off */ +/* WARNING: do not edit! */ +/* Generated by Makefile from include/crypto/dso_conf.h.in */ +/* clang-format on */ +/* + * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OSSL_CRYPTO_DSO_CONF_H +#define OSSL_CRYPTO_DSO_CONF_H +#pragma once + +/* clang-format off */ +# define DSO_DLFCN +# define HAVE_DLFCN_H +/* clang-format on */ +/* clang-format off */ +# define DSO_EXTENSION ".so" +/* clang-format on */ +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/internal/param_names.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/internal/param_names.h new file mode 100644 index 000000000000..cefb8dfa75fa --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/internal/param_names.h @@ -0,0 +1,473 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/internal/param_names.h.in + * + * Copyright 2023 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ +/* clang-format off */ + +/* clang-format on */ + +int ossl_param_find_pidx(const char *s); + +/* Parameter name definitions - generated by util/perl/OpenSSL/paramnames.pm */ +/* clang-format off */ +#define NUM_PIDX 346 + +#define PIDX_ALG_PARAM_ALGORITHM_ID 0 +#define PIDX_ALG_PARAM_ALGORITHM_ID_PARAMS 1 +#define PIDX_ALG_PARAM_CIPHER 2 +#define PIDX_ALG_PARAM_DIGEST 3 +#define PIDX_ALG_PARAM_ENGINE 4 +#define PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR 5 +#define PIDX_ALG_PARAM_MAC 6 +#define PIDX_ALG_PARAM_PROPERTIES 7 +#define PIDX_ASYM_CIPHER_PARAM_DIGEST PIDX_PKEY_PARAM_DIGEST +#define PIDX_ASYM_CIPHER_PARAM_ENGINE PIDX_PKEY_PARAM_ENGINE +#define PIDX_ASYM_CIPHER_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_ASYM_CIPHER_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK +#define PIDX_ASYM_CIPHER_PARAM_FIPS_RSA_PKCS15_PAD_DISABLED PIDX_PROV_PARAM_RSA_PKCS15_PAD_DISABLED +#define PIDX_ASYM_CIPHER_PARAM_IMPLICIT_REJECTION 8 +#define PIDX_ASYM_CIPHER_PARAM_MGF1_DIGEST PIDX_PKEY_PARAM_MGF1_DIGEST +#define PIDX_ASYM_CIPHER_PARAM_MGF1_DIGEST_PROPS PIDX_PKEY_PARAM_MGF1_PROPERTIES +#define PIDX_ASYM_CIPHER_PARAM_OAEP_DIGEST PIDX_ALG_PARAM_DIGEST +#define PIDX_ASYM_CIPHER_PARAM_OAEP_DIGEST_PROPS 9 +#define PIDX_ASYM_CIPHER_PARAM_OAEP_LABEL 10 +#define PIDX_ASYM_CIPHER_PARAM_PAD_MODE PIDX_PKEY_PARAM_PAD_MODE +#define PIDX_ASYM_CIPHER_PARAM_PROPERTIES PIDX_PKEY_PARAM_PROPERTIES +#define PIDX_ASYM_CIPHER_PARAM_TLS_CLIENT_VERSION 11 +#define PIDX_ASYM_CIPHER_PARAM_TLS_NEGOTIATED_VERSION 12 +#define PIDX_CAPABILITY_TLS_GROUP_ALG 13 +#define PIDX_CAPABILITY_TLS_GROUP_ID 14 +#define PIDX_CAPABILITY_TLS_GROUP_IS_KEM 15 +#define PIDX_CAPABILITY_TLS_GROUP_MAX_DTLS 16 +#define PIDX_CAPABILITY_TLS_GROUP_MAX_TLS 17 +#define PIDX_CAPABILITY_TLS_GROUP_MIN_DTLS 18 +#define PIDX_CAPABILITY_TLS_GROUP_MIN_TLS 19 +#define PIDX_CAPABILITY_TLS_GROUP_NAME 20 +#define PIDX_CAPABILITY_TLS_GROUP_NAME_INTERNAL 21 +#define PIDX_CAPABILITY_TLS_GROUP_SECURITY_BITS 22 +#define PIDX_CAPABILITY_TLS_SIGALG_CODE_POINT 23 +#define PIDX_CAPABILITY_TLS_SIGALG_HASH_NAME 24 +#define PIDX_CAPABILITY_TLS_SIGALG_HASH_OID 25 +#define PIDX_CAPABILITY_TLS_SIGALG_IANA_NAME 26 +#define PIDX_CAPABILITY_TLS_SIGALG_KEYTYPE 27 +#define PIDX_CAPABILITY_TLS_SIGALG_KEYTYPE_OID 28 +#define PIDX_CAPABILITY_TLS_SIGALG_MAX_DTLS 16 +#define PIDX_CAPABILITY_TLS_SIGALG_MAX_TLS 17 +#define PIDX_CAPABILITY_TLS_SIGALG_MIN_DTLS 18 +#define PIDX_CAPABILITY_TLS_SIGALG_MIN_TLS 19 +#define PIDX_CAPABILITY_TLS_SIGALG_NAME 29 +#define PIDX_CAPABILITY_TLS_SIGALG_OID 30 +#define PIDX_CAPABILITY_TLS_SIGALG_SECURITY_BITS 31 +#define PIDX_CAPABILITY_TLS_SIGALG_SIG_NAME 32 +#define PIDX_CAPABILITY_TLS_SIGALG_SIG_OID 33 +#define PIDX_CIPHER_PARAM_AEAD 34 +#define PIDX_CIPHER_PARAM_AEAD_IVLEN PIDX_CIPHER_PARAM_IVLEN +#define PIDX_CIPHER_PARAM_AEAD_IV_GENERATED 35 +#define PIDX_CIPHER_PARAM_AEAD_MAC_KEY 36 +#define PIDX_CIPHER_PARAM_AEAD_TAG 37 +#define PIDX_CIPHER_PARAM_AEAD_TAGLEN 38 +#define PIDX_CIPHER_PARAM_AEAD_TLS1_AAD 39 +#define PIDX_CIPHER_PARAM_AEAD_TLS1_AAD_PAD 40 +#define PIDX_CIPHER_PARAM_AEAD_TLS1_GET_IV_GEN 41 +#define PIDX_CIPHER_PARAM_AEAD_TLS1_IV_FIXED 42 +#define PIDX_CIPHER_PARAM_AEAD_TLS1_SET_IV_INV 43 +#define PIDX_CIPHER_PARAM_ALGORITHM_ID PIDX_ALG_PARAM_ALGORITHM_ID +#define PIDX_CIPHER_PARAM_ALGORITHM_ID_PARAMS PIDX_ALG_PARAM_ALGORITHM_ID_PARAMS +#define PIDX_CIPHER_PARAM_ALGORITHM_ID_PARAMS_OLD 44 +#define PIDX_CIPHER_PARAM_BLOCK_SIZE 45 +#define PIDX_CIPHER_PARAM_CTS 46 +#define PIDX_CIPHER_PARAM_CTS_MODE 47 +#define PIDX_CIPHER_PARAM_CUSTOM_IV 48 +#define PIDX_CIPHER_PARAM_DECRYPT_ONLY 49 +#define PIDX_CIPHER_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_CIPHER_PARAM_FIPS_ENCRYPT_CHECK 50 +#define PIDX_CIPHER_PARAM_HAS_RAND_KEY 51 +#define PIDX_CIPHER_PARAM_IV 52 +#define PIDX_CIPHER_PARAM_IVLEN 53 +#define PIDX_CIPHER_PARAM_KEYLEN 54 +#define PIDX_CIPHER_PARAM_MODE 55 +#define PIDX_CIPHER_PARAM_NUM 56 +#define PIDX_CIPHER_PARAM_PADDING 57 +#define PIDX_CIPHER_PARAM_PIPELINE_AEAD_TAG 58 +#define PIDX_CIPHER_PARAM_RANDOM_KEY 59 +#define PIDX_CIPHER_PARAM_RC2_KEYBITS 60 +#define PIDX_CIPHER_PARAM_ROUNDS 61 +#define PIDX_CIPHER_PARAM_SPEED 62 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK 63 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD 64 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD_PACKLEN 65 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC 66 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_IN 67 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_LEN 68 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE 69 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_BUFSIZE 70 +#define PIDX_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_SEND_FRAGMENT 71 +#define PIDX_CIPHER_PARAM_TLS_MAC 72 +#define PIDX_CIPHER_PARAM_TLS_MAC_SIZE 73 +#define PIDX_CIPHER_PARAM_TLS_VERSION 74 +#define PIDX_CIPHER_PARAM_UPDATED_IV 75 +#define PIDX_CIPHER_PARAM_USE_BITS 76 +#define PIDX_CIPHER_PARAM_XTS_STANDARD 77 +#define PIDX_DECODER_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES +#define PIDX_DIGEST_PARAM_ALGID_ABSENT 78 +#define PIDX_DIGEST_PARAM_BLOCK_SIZE 45 +#define PIDX_DIGEST_PARAM_MICALG 79 +#define PIDX_DIGEST_PARAM_PAD_TYPE 80 +#define PIDX_DIGEST_PARAM_SIZE 81 +#define PIDX_DIGEST_PARAM_SSL3_MS 82 +#define PIDX_DIGEST_PARAM_XOF 83 +#define PIDX_DIGEST_PARAM_XOFLEN 84 +#define PIDX_DRBG_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER +#define PIDX_DRBG_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST +#define PIDX_DRBG_PARAM_ENTROPY_REQUIRED 85 +#define PIDX_DRBG_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_DRBG_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK +#define PIDX_DRBG_PARAM_MAC PIDX_ALG_PARAM_MAC +#define PIDX_DRBG_PARAM_MAX_ADINLEN 86 +#define PIDX_DRBG_PARAM_MAX_ENTROPYLEN 87 +#define PIDX_DRBG_PARAM_MAX_LENGTH 88 +#define PIDX_DRBG_PARAM_MAX_NONCELEN 89 +#define PIDX_DRBG_PARAM_MAX_PERSLEN 90 +#define PIDX_DRBG_PARAM_MIN_ENTROPYLEN 91 +#define PIDX_DRBG_PARAM_MIN_LENGTH 92 +#define PIDX_DRBG_PARAM_MIN_NONCELEN 93 +#define PIDX_DRBG_PARAM_PREDICTION_RESISTANCE 94 +#define PIDX_DRBG_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES +#define PIDX_DRBG_PARAM_RANDOM_DATA 95 +#define PIDX_DRBG_PARAM_RESEED_COUNTER 96 +#define PIDX_DRBG_PARAM_RESEED_REQUESTS 97 +#define PIDX_DRBG_PARAM_RESEED_TIME 98 +#define PIDX_DRBG_PARAM_RESEED_TIME_INTERVAL 99 +#define PIDX_DRBG_PARAM_SIZE 81 +#define PIDX_DRBG_PARAM_USE_DF 100 +#define PIDX_ENCODER_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER +#define PIDX_ENCODER_PARAM_ENCRYPT_LEVEL 101 +#define PIDX_ENCODER_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES +#define PIDX_ENCODER_PARAM_SAVE_PARAMETERS 102 +#define PIDX_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE 103 +#define PIDX_EXCHANGE_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_EXCHANGE_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK +#define PIDX_EXCHANGE_PARAM_FIPS_ECDH_COFACTOR_CHECK PIDX_PROV_PARAM_ECDH_COFACTOR_CHECK +#define PIDX_EXCHANGE_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK +#define PIDX_EXCHANGE_PARAM_KDF_DIGEST 104 +#define PIDX_EXCHANGE_PARAM_KDF_DIGEST_PROPS 105 +#define PIDX_EXCHANGE_PARAM_KDF_OUTLEN 106 +#define PIDX_EXCHANGE_PARAM_KDF_TYPE 107 +#define PIDX_EXCHANGE_PARAM_KDF_UKM 108 +#define PIDX_EXCHANGE_PARAM_PAD 109 +#define PIDX_GEN_PARAM_ITERATION 110 +#define PIDX_GEN_PARAM_POTENTIAL 111 +#define PIDX_KDF_PARAM_ARGON2_AD 112 +#define PIDX_KDF_PARAM_ARGON2_LANES 113 +#define PIDX_KDF_PARAM_ARGON2_MEMCOST 114 +#define PIDX_KDF_PARAM_ARGON2_VERSION 115 +#define PIDX_KDF_PARAM_CEK_ALG 116 +#define PIDX_KDF_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER +#define PIDX_KDF_PARAM_CONSTANT 117 +#define PIDX_KDF_PARAM_DATA 118 +#define PIDX_KDF_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST +#define PIDX_KDF_PARAM_EARLY_CLEAN 119 +#define PIDX_KDF_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_KDF_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK +#define PIDX_KDF_PARAM_FIPS_EMS_CHECK 120 +#define PIDX_KDF_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK +#define PIDX_KDF_PARAM_HMACDRBG_ENTROPY 121 +#define PIDX_KDF_PARAM_HMACDRBG_NONCE 122 +#define PIDX_KDF_PARAM_INFO 123 +#define PIDX_KDF_PARAM_ITER 124 +#define PIDX_KDF_PARAM_KBKDF_R 125 +#define PIDX_KDF_PARAM_KBKDF_USE_L 126 +#define PIDX_KDF_PARAM_KBKDF_USE_SEPARATOR 127 +#define PIDX_KDF_PARAM_KEY 128 +#define PIDX_KDF_PARAM_LABEL 129 +#define PIDX_KDF_PARAM_MAC PIDX_ALG_PARAM_MAC +#define PIDX_KDF_PARAM_MAC_SIZE 130 +#define PIDX_KDF_PARAM_MODE 55 +#define PIDX_KDF_PARAM_PASSWORD 131 +#define PIDX_KDF_PARAM_PKCS12_ID 132 +#define PIDX_KDF_PARAM_PKCS5 133 +#define PIDX_KDF_PARAM_PREFIX 134 +#define PIDX_KDF_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES +#define PIDX_KDF_PARAM_SALT 135 +#define PIDX_KDF_PARAM_SCRYPT_MAXMEM 136 +#define PIDX_KDF_PARAM_SCRYPT_N 137 +#define PIDX_KDF_PARAM_SCRYPT_P 138 +#define PIDX_KDF_PARAM_SCRYPT_R 125 +#define PIDX_KDF_PARAM_SECRET 139 +#define PIDX_KDF_PARAM_SEED 140 +#define PIDX_KDF_PARAM_SIZE 81 +#define PIDX_KDF_PARAM_SSHKDF_SESSION_ID 141 +#define PIDX_KDF_PARAM_SSHKDF_TYPE 142 +#define PIDX_KDF_PARAM_SSHKDF_XCGHASH 143 +#define PIDX_KDF_PARAM_THREADS 144 +#define PIDX_KDF_PARAM_UKM 145 +#define PIDX_KDF_PARAM_X942_ACVPINFO 146 +#define PIDX_KDF_PARAM_X942_PARTYUINFO 147 +#define PIDX_KDF_PARAM_X942_PARTYVINFO 148 +#define PIDX_KDF_PARAM_X942_SUPP_PRIVINFO 149 +#define PIDX_KDF_PARAM_X942_SUPP_PUBINFO 150 +#define PIDX_KDF_PARAM_X942_USE_KEYBITS 151 +#define PIDX_KEM_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_KEM_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK +#define PIDX_KEM_PARAM_IKME 152 +#define PIDX_KEM_PARAM_OPERATION 153 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_BLOCK_PADDING 154 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_HS_PADDING 155 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_EARLY_DATA 156 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MAX_FRAG_LEN 157 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_MODE 55 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_OPTIONS 158 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_READ_AHEAD 159 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_STREAM_MAC 160 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_TLSTREE 161 +#define PIDX_LIBSSL_RECORD_LAYER_PARAM_USE_ETM 162 +#define PIDX_LIBSSL_RECORD_LAYER_READ_BUFFER_LEN 163 +#define PIDX_MAC_PARAM_BLOCK_SIZE 164 +#define PIDX_MAC_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER +#define PIDX_MAC_PARAM_CUSTOM 165 +#define PIDX_MAC_PARAM_C_ROUNDS 166 +#define PIDX_MAC_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST +#define PIDX_MAC_PARAM_DIGEST_NOINIT 167 +#define PIDX_MAC_PARAM_DIGEST_ONESHOT 168 +#define PIDX_MAC_PARAM_D_ROUNDS 169 +#define PIDX_MAC_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_MAC_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK +#define PIDX_MAC_PARAM_FIPS_NO_SHORT_MAC PIDX_PROV_PARAM_NO_SHORT_MAC +#define PIDX_MAC_PARAM_IV 52 +#define PIDX_MAC_PARAM_KEY 128 +#define PIDX_MAC_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES +#define PIDX_MAC_PARAM_SALT 135 +#define PIDX_MAC_PARAM_SIZE 81 +#define PIDX_MAC_PARAM_TLS_DATA_SIZE 170 +#define PIDX_MAC_PARAM_XOF 83 +#define PIDX_OBJECT_PARAM_DATA 118 +#define PIDX_OBJECT_PARAM_DATA_STRUCTURE 171 +#define PIDX_OBJECT_PARAM_DATA_TYPE 172 +#define PIDX_OBJECT_PARAM_DESC 173 +#define PIDX_OBJECT_PARAM_INPUT_TYPE 174 +#define PIDX_OBJECT_PARAM_REFERENCE 175 +#define PIDX_OBJECT_PARAM_TYPE 142 +#define PIDX_PASSPHRASE_PARAM_INFO 123 +#define PIDX_PKEY_PARAM_ALGORITHM_ID PIDX_ALG_PARAM_ALGORITHM_ID +#define PIDX_PKEY_PARAM_ALGORITHM_ID_PARAMS PIDX_ALG_PARAM_ALGORITHM_ID_PARAMS +#define PIDX_PKEY_PARAM_BITS 176 +#define PIDX_PKEY_PARAM_CIPHER PIDX_ALG_PARAM_CIPHER +#define PIDX_PKEY_PARAM_DEFAULT_DIGEST 177 +#define PIDX_PKEY_PARAM_DHKEM_IKM 178 +#define PIDX_PKEY_PARAM_DH_GENERATOR 179 +#define PIDX_PKEY_PARAM_DH_PRIV_LEN 180 +#define PIDX_PKEY_PARAM_DIGEST PIDX_ALG_PARAM_DIGEST +#define PIDX_PKEY_PARAM_DIGEST_SIZE 181 +#define PIDX_PKEY_PARAM_DIST_ID 182 +#define PIDX_PKEY_PARAM_EC_A 183 +#define PIDX_PKEY_PARAM_EC_B 184 +#define PIDX_PKEY_PARAM_EC_CHAR2_M 185 +#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K1 186 +#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K2 187 +#define PIDX_PKEY_PARAM_EC_CHAR2_PP_K3 188 +#define PIDX_PKEY_PARAM_EC_CHAR2_TP_BASIS 189 +#define PIDX_PKEY_PARAM_EC_CHAR2_TYPE 190 +#define PIDX_PKEY_PARAM_EC_COFACTOR 191 +#define PIDX_PKEY_PARAM_EC_DECODED_FROM_EXPLICIT_PARAMS 192 +#define PIDX_PKEY_PARAM_EC_ENCODING 193 +#define PIDX_PKEY_PARAM_EC_FIELD_TYPE 194 +#define PIDX_PKEY_PARAM_EC_GENERATOR 195 +#define PIDX_PKEY_PARAM_EC_GROUP_CHECK_TYPE 196 +#define PIDX_PKEY_PARAM_EC_INCLUDE_PUBLIC 197 +#define PIDX_PKEY_PARAM_EC_ORDER 198 +#define PIDX_PKEY_PARAM_EC_P 138 +#define PIDX_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT 199 +#define PIDX_PKEY_PARAM_EC_PUB_X 200 +#define PIDX_PKEY_PARAM_EC_PUB_Y 201 +#define PIDX_PKEY_PARAM_EC_SEED 140 +#define PIDX_PKEY_PARAM_ENCODED_PUBLIC_KEY 202 +#define PIDX_PKEY_PARAM_ENGINE PIDX_ALG_PARAM_ENGINE +#define PIDX_PKEY_PARAM_FFC_COFACTOR 203 +#define PIDX_PKEY_PARAM_FFC_DIGEST PIDX_PKEY_PARAM_DIGEST +#define PIDX_PKEY_PARAM_FFC_DIGEST_PROPS PIDX_PKEY_PARAM_PROPERTIES +#define PIDX_PKEY_PARAM_FFC_G 204 +#define PIDX_PKEY_PARAM_FFC_GINDEX 205 +#define PIDX_PKEY_PARAM_FFC_H 206 +#define PIDX_PKEY_PARAM_FFC_P 138 +#define PIDX_PKEY_PARAM_FFC_PBITS 207 +#define PIDX_PKEY_PARAM_FFC_PCOUNTER 208 +#define PIDX_PKEY_PARAM_FFC_Q 209 +#define PIDX_PKEY_PARAM_FFC_QBITS 210 +#define PIDX_PKEY_PARAM_FFC_SEED 140 +#define PIDX_PKEY_PARAM_FFC_TYPE 142 +#define PIDX_PKEY_PARAM_FFC_VALIDATE_G 211 +#define PIDX_PKEY_PARAM_FFC_VALIDATE_LEGACY 212 +#define PIDX_PKEY_PARAM_FFC_VALIDATE_PQ 213 +#define PIDX_PKEY_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK 214 +#define PIDX_PKEY_PARAM_FIPS_KEY_CHECK 215 +#define PIDX_PKEY_PARAM_FIPS_SIGN_CHECK 216 +#define PIDX_PKEY_PARAM_GROUP_NAME 217 +#define PIDX_PKEY_PARAM_IMPLICIT_REJECTION 8 +#define PIDX_PKEY_PARAM_MANDATORY_DIGEST 218 +#define PIDX_PKEY_PARAM_MASKGENFUNC 219 +#define PIDX_PKEY_PARAM_MAX_SIZE 220 +#define PIDX_PKEY_PARAM_MGF1_DIGEST 221 +#define PIDX_PKEY_PARAM_MGF1_PROPERTIES 222 +#define PIDX_PKEY_PARAM_ML_DSA_INPUT_FORMATS 223 +#define PIDX_PKEY_PARAM_ML_DSA_OUTPUT_FORMATS 224 +#define PIDX_PKEY_PARAM_ML_DSA_PREFER_SEED 225 +#define PIDX_PKEY_PARAM_ML_DSA_RETAIN_SEED 226 +#define PIDX_PKEY_PARAM_ML_DSA_SEED 140 +#define PIDX_PKEY_PARAM_ML_KEM_IMPORT_PCT_TYPE 227 +#define PIDX_PKEY_PARAM_ML_KEM_INPUT_FORMATS 228 +#define PIDX_PKEY_PARAM_ML_KEM_OUTPUT_FORMATS 229 +#define PIDX_PKEY_PARAM_ML_KEM_PREFER_SEED 230 +#define PIDX_PKEY_PARAM_ML_KEM_RETAIN_SEED 231 +#define PIDX_PKEY_PARAM_ML_KEM_SEED 140 +#define PIDX_PKEY_PARAM_PAD_MODE 232 +#define PIDX_PKEY_PARAM_PRIV_KEY 233 +#define PIDX_PKEY_PARAM_PROPERTIES PIDX_ALG_PARAM_PROPERTIES +#define PIDX_PKEY_PARAM_PUB_KEY 234 +#define PIDX_PKEY_PARAM_RSA_BITS PIDX_PKEY_PARAM_BITS +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT 235 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT1 236 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT2 237 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT3 238 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT4 239 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT5 240 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT6 241 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT7 242 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT8 243 +#define PIDX_PKEY_PARAM_RSA_COEFFICIENT9 244 +#define PIDX_PKEY_PARAM_RSA_D 245 +#define PIDX_PKEY_PARAM_RSA_DERIVE_FROM_PQ 246 +#define PIDX_PKEY_PARAM_RSA_DIGEST PIDX_PKEY_PARAM_DIGEST +#define PIDX_PKEY_PARAM_RSA_DIGEST_PROPS PIDX_PKEY_PARAM_PROPERTIES +#define PIDX_PKEY_PARAM_RSA_E 247 +#define PIDX_PKEY_PARAM_RSA_EXPONENT 248 +#define PIDX_PKEY_PARAM_RSA_EXPONENT1 249 +#define PIDX_PKEY_PARAM_RSA_EXPONENT10 250 +#define PIDX_PKEY_PARAM_RSA_EXPONENT2 251 +#define PIDX_PKEY_PARAM_RSA_EXPONENT3 252 +#define PIDX_PKEY_PARAM_RSA_EXPONENT4 253 +#define PIDX_PKEY_PARAM_RSA_EXPONENT5 254 +#define PIDX_PKEY_PARAM_RSA_EXPONENT6 255 +#define PIDX_PKEY_PARAM_RSA_EXPONENT7 256 +#define PIDX_PKEY_PARAM_RSA_EXPONENT8 257 +#define PIDX_PKEY_PARAM_RSA_EXPONENT9 258 +#define PIDX_PKEY_PARAM_RSA_FACTOR 259 +#define PIDX_PKEY_PARAM_RSA_FACTOR1 260 +#define PIDX_PKEY_PARAM_RSA_FACTOR10 261 +#define PIDX_PKEY_PARAM_RSA_FACTOR2 262 +#define PIDX_PKEY_PARAM_RSA_FACTOR3 263 +#define PIDX_PKEY_PARAM_RSA_FACTOR4 264 +#define PIDX_PKEY_PARAM_RSA_FACTOR5 265 +#define PIDX_PKEY_PARAM_RSA_FACTOR6 266 +#define PIDX_PKEY_PARAM_RSA_FACTOR7 267 +#define PIDX_PKEY_PARAM_RSA_FACTOR8 268 +#define PIDX_PKEY_PARAM_RSA_FACTOR9 269 +#define PIDX_PKEY_PARAM_RSA_MASKGENFUNC PIDX_PKEY_PARAM_MASKGENFUNC +#define PIDX_PKEY_PARAM_RSA_MGF1_DIGEST PIDX_PKEY_PARAM_MGF1_DIGEST +#define PIDX_PKEY_PARAM_RSA_N 137 +#define PIDX_PKEY_PARAM_RSA_PRIMES 270 +#define PIDX_PKEY_PARAM_RSA_PSS_SALTLEN 271 +#define PIDX_PKEY_PARAM_RSA_TEST_P1 272 +#define PIDX_PKEY_PARAM_RSA_TEST_P2 273 +#define PIDX_PKEY_PARAM_RSA_TEST_Q1 274 +#define PIDX_PKEY_PARAM_RSA_TEST_Q2 275 +#define PIDX_PKEY_PARAM_RSA_TEST_XP 276 +#define PIDX_PKEY_PARAM_RSA_TEST_XP1 277 +#define PIDX_PKEY_PARAM_RSA_TEST_XP2 278 +#define PIDX_PKEY_PARAM_RSA_TEST_XQ 279 +#define PIDX_PKEY_PARAM_RSA_TEST_XQ1 280 +#define PIDX_PKEY_PARAM_RSA_TEST_XQ2 281 +#define PIDX_PKEY_PARAM_SECURITY_BITS 282 +#define PIDX_PKEY_PARAM_SLH_DSA_SEED 140 +#define PIDX_PKEY_PARAM_USE_COFACTOR_ECDH PIDX_PKEY_PARAM_USE_COFACTOR_FLAG +#define PIDX_PKEY_PARAM_USE_COFACTOR_FLAG 283 +#define PIDX_PROV_PARAM_BUILDINFO 284 +#define PIDX_PROV_PARAM_CORE_MODULE_FILENAME 285 +#define PIDX_PROV_PARAM_CORE_PROV_NAME 286 +#define PIDX_PROV_PARAM_CORE_VERSION 287 +#define PIDX_PROV_PARAM_DRBG_TRUNC_DIGEST 288 +#define PIDX_PROV_PARAM_DSA_SIGN_DISABLED 289 +#define PIDX_PROV_PARAM_ECDH_COFACTOR_CHECK 290 +#define PIDX_PROV_PARAM_HKDF_DIGEST_CHECK 291 +#define PIDX_PROV_PARAM_HKDF_KEY_CHECK 292 +#define PIDX_PROV_PARAM_HMAC_KEY_CHECK 293 +#define PIDX_PROV_PARAM_KBKDF_KEY_CHECK 294 +#define PIDX_PROV_PARAM_KMAC_KEY_CHECK 295 +#define PIDX_PROV_PARAM_NAME 296 +#define PIDX_PROV_PARAM_NO_SHORT_MAC 297 +#define PIDX_PROV_PARAM_PBKDF2_LOWER_BOUND_CHECK 298 +#define PIDX_PROV_PARAM_RSA_PKCS15_PAD_DISABLED 299 +#define PIDX_PROV_PARAM_RSA_PSS_SALTLEN_CHECK 300 +#define PIDX_PROV_PARAM_RSA_SIGN_X931_PAD_DISABLED 301 +#define PIDX_PROV_PARAM_SECURITY_CHECKS 302 +#define PIDX_PROV_PARAM_SELF_TEST_DESC 303 +#define PIDX_PROV_PARAM_SELF_TEST_PHASE 304 +#define PIDX_PROV_PARAM_SELF_TEST_TYPE 305 +#define PIDX_PROV_PARAM_SIGNATURE_DIGEST_CHECK 306 +#define PIDX_PROV_PARAM_SSHKDF_DIGEST_CHECK 307 +#define PIDX_PROV_PARAM_SSHKDF_KEY_CHECK 308 +#define PIDX_PROV_PARAM_SSKDF_DIGEST_CHECK 309 +#define PIDX_PROV_PARAM_SSKDF_KEY_CHECK 310 +#define PIDX_PROV_PARAM_STATUS 311 +#define PIDX_PROV_PARAM_TDES_ENCRYPT_DISABLED 312 +#define PIDX_PROV_PARAM_TLS13_KDF_DIGEST_CHECK 313 +#define PIDX_PROV_PARAM_TLS13_KDF_KEY_CHECK 314 +#define PIDX_PROV_PARAM_TLS1_PRF_DIGEST_CHECK 315 +#define PIDX_PROV_PARAM_TLS1_PRF_EMS_CHECK 316 +#define PIDX_PROV_PARAM_TLS1_PRF_KEY_CHECK 317 +#define PIDX_PROV_PARAM_VERSION 115 +#define PIDX_PROV_PARAM_X942KDF_KEY_CHECK 318 +#define PIDX_PROV_PARAM_X963KDF_DIGEST_CHECK 319 +#define PIDX_PROV_PARAM_X963KDF_KEY_CHECK 320 +#define PIDX_RAND_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_RAND_PARAM_GENERATE 321 +#define PIDX_RAND_PARAM_MAX_REQUEST 322 +#define PIDX_RAND_PARAM_STATE 323 +#define PIDX_RAND_PARAM_STRENGTH 324 +#define PIDX_RAND_PARAM_TEST_ENTROPY 325 +#define PIDX_RAND_PARAM_TEST_NONCE 326 +#define PIDX_SIGNATURE_PARAM_ADD_RANDOM 327 +#define PIDX_SIGNATURE_PARAM_ALGORITHM_ID PIDX_PKEY_PARAM_ALGORITHM_ID +#define PIDX_SIGNATURE_PARAM_ALGORITHM_ID_PARAMS PIDX_PKEY_PARAM_ALGORITHM_ID_PARAMS +#define PIDX_SIGNATURE_PARAM_CONTEXT_STRING 328 +#define PIDX_SIGNATURE_PARAM_DETERMINISTIC 329 +#define PIDX_SIGNATURE_PARAM_DIGEST PIDX_PKEY_PARAM_DIGEST +#define PIDX_SIGNATURE_PARAM_DIGEST_SIZE PIDX_PKEY_PARAM_DIGEST_SIZE +#define PIDX_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR PIDX_ALG_PARAM_FIPS_APPROVED_INDICATOR +#define PIDX_SIGNATURE_PARAM_FIPS_DIGEST_CHECK PIDX_PKEY_PARAM_FIPS_DIGEST_CHECK +#define PIDX_SIGNATURE_PARAM_FIPS_KEY_CHECK PIDX_PKEY_PARAM_FIPS_KEY_CHECK +#define PIDX_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK 300 +#define PIDX_SIGNATURE_PARAM_FIPS_SIGN_CHECK PIDX_PKEY_PARAM_FIPS_SIGN_CHECK +#define PIDX_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK 330 +#define PIDX_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE 331 +#define PIDX_SIGNATURE_PARAM_INSTANCE 332 +#define PIDX_SIGNATURE_PARAM_KAT 333 +#define PIDX_SIGNATURE_PARAM_MESSAGE_ENCODING 334 +#define PIDX_SIGNATURE_PARAM_MGF1_DIGEST PIDX_PKEY_PARAM_MGF1_DIGEST +#define PIDX_SIGNATURE_PARAM_MGF1_PROPERTIES PIDX_PKEY_PARAM_MGF1_PROPERTIES +#define PIDX_SIGNATURE_PARAM_MU 335 +#define PIDX_SIGNATURE_PARAM_NONCE_TYPE 336 +#define PIDX_SIGNATURE_PARAM_PAD_MODE PIDX_PKEY_PARAM_PAD_MODE +#define PIDX_SIGNATURE_PARAM_PROPERTIES PIDX_PKEY_PARAM_PROPERTIES +#define PIDX_SIGNATURE_PARAM_PSS_SALTLEN 271 +#define PIDX_SIGNATURE_PARAM_SIGNATURE 337 +#define PIDX_SIGNATURE_PARAM_TEST_ENTROPY 338 +#define PIDX_SKEY_PARAM_KEY_LENGTH 339 +#define PIDX_SKEY_PARAM_RAW_BYTES 340 +#define PIDX_STORE_PARAM_ALIAS 341 +#define PIDX_STORE_PARAM_DIGEST 3 +#define PIDX_STORE_PARAM_EXPECT 342 +#define PIDX_STORE_PARAM_FINGERPRINT 343 +#define PIDX_STORE_PARAM_INPUT_TYPE 174 +#define PIDX_STORE_PARAM_ISSUER 296 +#define PIDX_STORE_PARAM_PROPERTIES 7 +#define PIDX_STORE_PARAM_SERIAL 344 +#define PIDX_STORE_PARAM_SUBJECT 345 +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/asn1.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/asn1.h new file mode 100644 index 000000000000..3fd498b2a3e6 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/asn1.h @@ -0,0 +1,1125 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/asn1.h.in + * + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_ASN1_H +#define OPENSSL_ASN1_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_ASN1_H +#endif + +#ifndef OPENSSL_NO_STDIO +#include +#endif +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#ifdef OPENSSL_BUILD_SHLIBCRYPTO +#undef OPENSSL_EXTERN +#define OPENSSL_EXTERN OPENSSL_EXPORT +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define V_ASN1_UNIVERSAL 0x00 +#define V_ASN1_APPLICATION 0x40 +#define V_ASN1_CONTEXT_SPECIFIC 0x80 +#define V_ASN1_PRIVATE 0xc0 + +#define V_ASN1_CONSTRUCTED 0x20 +#define V_ASN1_PRIMITIVE_TAG 0x1f +#define V_ASN1_PRIMATIVE_TAG /*compat*/ V_ASN1_PRIMITIVE_TAG + +#define V_ASN1_APP_CHOOSE -2 /* let the recipient choose */ +#define V_ASN1_OTHER -3 /* used in ASN1_TYPE */ +#define V_ASN1_ANY -4 /* used in ASN1 template code */ + +#define V_ASN1_UNDEF -1 +/* ASN.1 tag values */ +#define V_ASN1_EOC 0 +#define V_ASN1_BOOLEAN 1 +#define V_ASN1_INTEGER 2 +#define V_ASN1_BIT_STRING 3 +#define V_ASN1_OCTET_STRING 4 +#define V_ASN1_NULL 5 +#define V_ASN1_OBJECT 6 +#define V_ASN1_OBJECT_DESCRIPTOR 7 +#define V_ASN1_EXTERNAL 8 +#define V_ASN1_REAL 9 +#define V_ASN1_ENUMERATED 10 +#define V_ASN1_UTF8STRING 12 +#define V_ASN1_SEQUENCE 16 +#define V_ASN1_SET 17 +#define V_ASN1_NUMERICSTRING 18 +#define V_ASN1_PRINTABLESTRING 19 +#define V_ASN1_T61STRING 20 +#define V_ASN1_TELETEXSTRING 20 /* alias */ +#define V_ASN1_VIDEOTEXSTRING 21 +#define V_ASN1_IA5STRING 22 +#define V_ASN1_UTCTIME 23 +#define V_ASN1_GENERALIZEDTIME 24 +#define V_ASN1_GRAPHICSTRING 25 +#define V_ASN1_ISO64STRING 26 +#define V_ASN1_VISIBLESTRING 26 /* alias */ +#define V_ASN1_GENERALSTRING 27 +#define V_ASN1_UNIVERSALSTRING 28 +#define V_ASN1_BMPSTRING 30 + +/* + * NB the constants below are used internally by ASN1_INTEGER + * and ASN1_ENUMERATED to indicate the sign. They are *not* on + * the wire tag values. + */ + +#define V_ASN1_NEG 0x100 +#define V_ASN1_NEG_INTEGER (2 | V_ASN1_NEG) +#define V_ASN1_NEG_ENUMERATED (10 | V_ASN1_NEG) + +/* For use with d2i_ASN1_type_bytes() */ +#define B_ASN1_NUMERICSTRING 0x0001 +#define B_ASN1_PRINTABLESTRING 0x0002 +#define B_ASN1_T61STRING 0x0004 +#define B_ASN1_TELETEXSTRING 0x0004 +#define B_ASN1_VIDEOTEXSTRING 0x0008 +#define B_ASN1_IA5STRING 0x0010 +#define B_ASN1_GRAPHICSTRING 0x0020 +#define B_ASN1_ISO64STRING 0x0040 +#define B_ASN1_VISIBLESTRING 0x0040 +#define B_ASN1_GENERALSTRING 0x0080 +#define B_ASN1_UNIVERSALSTRING 0x0100 +#define B_ASN1_OCTET_STRING 0x0200 +#define B_ASN1_BIT_STRING 0x0400 +#define B_ASN1_BMPSTRING 0x0800 +#define B_ASN1_UNKNOWN 0x1000 +#define B_ASN1_UTF8STRING 0x2000 +#define B_ASN1_UTCTIME 0x4000 +#define B_ASN1_GENERALIZEDTIME 0x8000 +#define B_ASN1_SEQUENCE 0x10000 +/* For use with ASN1_mbstring_copy() */ +#define MBSTRING_FLAG 0x1000 +#define MBSTRING_UTF8 (MBSTRING_FLAG) +#define MBSTRING_ASC (MBSTRING_FLAG | 1) +#define MBSTRING_BMP (MBSTRING_FLAG | 2) +#define MBSTRING_UNIV (MBSTRING_FLAG | 4) +#define SMIME_OLDMIME 0x400 +#define SMIME_CRLFEOL 0x800 +#define SMIME_STREAM 0x1000 + +/* Stacks for types not otherwise defined in this header */ +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_ALGOR, X509_ALGOR, X509_ALGOR) +#define sk_X509_ALGOR_num(sk) OPENSSL_sk_num(ossl_check_const_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_value(sk, idx) ((X509_ALGOR *)OPENSSL_sk_value(ossl_check_const_X509_ALGOR_sk_type(sk), (idx))) +#define sk_X509_ALGOR_new(cmp) ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_new(ossl_check_X509_ALGOR_compfunc_type(cmp))) +#define sk_X509_ALGOR_new_null() ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_new_null()) +#define sk_X509_ALGOR_new_reserve(cmp, n) ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_new_reserve(ossl_check_X509_ALGOR_compfunc_type(cmp), (n))) +#define sk_X509_ALGOR_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_ALGOR_sk_type(sk), (n)) +#define sk_X509_ALGOR_free(sk) OPENSSL_sk_free(ossl_check_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_zero(sk) OPENSSL_sk_zero(ossl_check_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_delete(sk, i) ((X509_ALGOR *)OPENSSL_sk_delete(ossl_check_X509_ALGOR_sk_type(sk), (i))) +#define sk_X509_ALGOR_delete_ptr(sk, ptr) ((X509_ALGOR *)OPENSSL_sk_delete_ptr(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr))) +#define sk_X509_ALGOR_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr)) +#define sk_X509_ALGOR_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr)) +#define sk_X509_ALGOR_pop(sk) ((X509_ALGOR *)OPENSSL_sk_pop(ossl_check_X509_ALGOR_sk_type(sk))) +#define sk_X509_ALGOR_shift(sk) ((X509_ALGOR *)OPENSSL_sk_shift(ossl_check_X509_ALGOR_sk_type(sk))) +#define sk_X509_ALGOR_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_ALGOR_sk_type(sk),ossl_check_X509_ALGOR_freefunc_type(freefunc)) +#define sk_X509_ALGOR_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr), (idx)) +#define sk_X509_ALGOR_set(sk, idx, ptr) ((X509_ALGOR *)OPENSSL_sk_set(ossl_check_X509_ALGOR_sk_type(sk), (idx), ossl_check_X509_ALGOR_type(ptr))) +#define sk_X509_ALGOR_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr)) +#define sk_X509_ALGOR_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr)) +#define sk_X509_ALGOR_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_type(ptr), pnum) +#define sk_X509_ALGOR_sort(sk) OPENSSL_sk_sort(ossl_check_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_ALGOR_sk_type(sk)) +#define sk_X509_ALGOR_dup(sk) ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_dup(ossl_check_const_X509_ALGOR_sk_type(sk))) +#define sk_X509_ALGOR_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_ALGOR) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_copyfunc_type(copyfunc), ossl_check_X509_ALGOR_freefunc_type(freefunc))) +#define sk_X509_ALGOR_set_cmp_func(sk, cmp) ((sk_X509_ALGOR_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_ALGOR_sk_type(sk), ossl_check_X509_ALGOR_compfunc_type(cmp))) + +/* clang-format on */ + +#define ASN1_STRING_FLAG_BITS_LEFT 0x08 /* Set if 0x07 has bits left value */ +/* + * This indicates that the ASN1_STRING is not a real value but just a place + * holder for the location where indefinite length constructed data should be + * inserted in the memory buffer + */ +#define ASN1_STRING_FLAG_NDEF 0x010 + +/* + * This flag is used by the CMS code to indicate that a string is not + * complete and is a place holder for content when it had all been accessed. + * The flag will be reset when content has been written to it. + */ + +#define ASN1_STRING_FLAG_CONT 0x020 +/* + * This flag is used by ASN1 code to indicate an ASN1_STRING is an MSTRING + * type. + */ +#define ASN1_STRING_FLAG_MSTRING 0x040 +/* String is embedded and only content should be freed */ +#define ASN1_STRING_FLAG_EMBED 0x080 +/* String should be parsed in RFC 5280's time format */ +#define ASN1_STRING_FLAG_X509_TIME 0x100 +/* This is the base type that holds just about everything :-) */ +struct asn1_string_st { + int length; + int type; + unsigned char *data; + /* + * The value of the following field depends on the type being held. It + * is mostly being used for BIT_STRING so if the input data has a + * non-zero 'unused bits' value, it will be handled correctly + */ + long flags; +}; + +/* + * ASN1_ENCODING structure: this is used to save the received encoding of an + * ASN1 type. This is useful to get round problems with invalid encodings + * which can break signatures. + */ + +typedef struct ASN1_ENCODING_st { + unsigned char *enc; /* DER encoding */ + long len; /* Length of encoding */ + int modified; /* set to 1 if 'enc' is invalid */ +} ASN1_ENCODING; + +/* Used with ASN1 LONG type: if a long is set to this it is omitted */ +#define ASN1_LONG_UNDEF 0x7fffffffL + +#define STABLE_FLAGS_MALLOC 0x01 +/* + * A zero passed to ASN1_STRING_TABLE_new_add for the flags is interpreted + * as "don't change" and STABLE_FLAGS_MALLOC is always set. By setting + * STABLE_FLAGS_MALLOC only we can clear the existing value. Use the alias + * STABLE_FLAGS_CLEAR to reflect this. + */ +#define STABLE_FLAGS_CLEAR STABLE_FLAGS_MALLOC +#define STABLE_NO_MASK 0x02 +#define DIRSTRING_TYPE \ + (B_ASN1_PRINTABLESTRING | B_ASN1_T61STRING | B_ASN1_BMPSTRING | B_ASN1_UTF8STRING) +#define PKCS9STRING_TYPE (DIRSTRING_TYPE | B_ASN1_IA5STRING) + +struct asn1_string_table_st { + int nid; + long minsize; + long maxsize; + unsigned long mask; + unsigned long flags; +}; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_STRING_TABLE, ASN1_STRING_TABLE, ASN1_STRING_TABLE) +#define sk_ASN1_STRING_TABLE_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_value(sk, idx) ((ASN1_STRING_TABLE *)OPENSSL_sk_value(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk), (idx))) +#define sk_ASN1_STRING_TABLE_new(cmp) ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_new(ossl_check_ASN1_STRING_TABLE_compfunc_type(cmp))) +#define sk_ASN1_STRING_TABLE_new_null() ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_new_null()) +#define sk_ASN1_STRING_TABLE_new_reserve(cmp, n) ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_STRING_TABLE_compfunc_type(cmp), (n))) +#define sk_ASN1_STRING_TABLE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_STRING_TABLE_sk_type(sk), (n)) +#define sk_ASN1_STRING_TABLE_free(sk) OPENSSL_sk_free(ossl_check_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_delete(sk, i) ((ASN1_STRING_TABLE *)OPENSSL_sk_delete(ossl_check_ASN1_STRING_TABLE_sk_type(sk), (i))) +#define sk_ASN1_STRING_TABLE_delete_ptr(sk, ptr) ((ASN1_STRING_TABLE *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr))) +#define sk_ASN1_STRING_TABLE_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr)) +#define sk_ASN1_STRING_TABLE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr)) +#define sk_ASN1_STRING_TABLE_pop(sk) ((ASN1_STRING_TABLE *)OPENSSL_sk_pop(ossl_check_ASN1_STRING_TABLE_sk_type(sk))) +#define sk_ASN1_STRING_TABLE_shift(sk) ((ASN1_STRING_TABLE *)OPENSSL_sk_shift(ossl_check_ASN1_STRING_TABLE_sk_type(sk))) +#define sk_ASN1_STRING_TABLE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_STRING_TABLE_sk_type(sk),ossl_check_ASN1_STRING_TABLE_freefunc_type(freefunc)) +#define sk_ASN1_STRING_TABLE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr), (idx)) +#define sk_ASN1_STRING_TABLE_set(sk, idx, ptr) ((ASN1_STRING_TABLE *)OPENSSL_sk_set(ossl_check_ASN1_STRING_TABLE_sk_type(sk), (idx), ossl_check_ASN1_STRING_TABLE_type(ptr))) +#define sk_ASN1_STRING_TABLE_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr)) +#define sk_ASN1_STRING_TABLE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr)) +#define sk_ASN1_STRING_TABLE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_type(ptr), pnum) +#define sk_ASN1_STRING_TABLE_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk)) +#define sk_ASN1_STRING_TABLE_dup(sk) ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_dup(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk))) +#define sk_ASN1_STRING_TABLE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_STRING_TABLE) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_copyfunc_type(copyfunc), ossl_check_ASN1_STRING_TABLE_freefunc_type(freefunc))) +#define sk_ASN1_STRING_TABLE_set_cmp_func(sk, cmp) ((sk_ASN1_STRING_TABLE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_STRING_TABLE_sk_type(sk), ossl_check_ASN1_STRING_TABLE_compfunc_type(cmp))) + +/* clang-format on */ + +/* size limits: this stuff is taken straight from RFC2459 */ + +#define ub_name 32768 +#define ub_common_name 64 +#define ub_locality_name 128 +#define ub_state_name 128 +#define ub_organization_name 64 +#define ub_organization_unit_name 64 +#define ub_title 64 +#define ub_email_address 128 + +/* + * Declarations for template structures: for full definitions see asn1t.h + */ +typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE; +typedef struct ASN1_TLC_st ASN1_TLC; +/* This is just an opaque pointer */ +typedef struct ASN1_VALUE_st ASN1_VALUE; + +/* Declare ASN1 functions: the implement macro is in asn1t.h */ + +/* + * The mysterious 'extern' that's passed to some macros is innocuous, + * and is there to quiet pre-C99 compilers that may complain about empty + * arguments in macro calls. + */ + +#define DECLARE_ASN1_FUNCTIONS_attr(attr, type) \ + DECLARE_ASN1_FUNCTIONS_name_attr(attr, type, type) +#define DECLARE_ASN1_FUNCTIONS(type) \ + DECLARE_ASN1_FUNCTIONS_attr(extern, type) + +#define DECLARE_ASN1_ALLOC_FUNCTIONS_attr(attr, type) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name_attr(attr, type, type) +#define DECLARE_ASN1_ALLOC_FUNCTIONS(type) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_attr(extern, type) + +#define DECLARE_ASN1_FUNCTIONS_name_attr(attr, type, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name_attr(attr, type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_name_attr(attr, type, name) +#define DECLARE_ASN1_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_FUNCTIONS_name_attr(extern, type, name) + +#define DECLARE_ASN1_ENCODE_FUNCTIONS_attr(attr, type, itname, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(attr, type, name) \ + DECLARE_ASN1_ITEM_attr(attr, itname) +#define DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_attr(extern, type, itname, name) + +#define DECLARE_ASN1_ENCODE_FUNCTIONS_name_attr(attr, type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_attr(attr, type, name, name) +#define DECLARE_ASN1_ENCODE_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_name_attr(extern, type, name) + +#define DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(attr, type, name) \ + attr type *d2i_##name(type **a, const unsigned char **in, long len); \ + attr int i2d_##name(const type *a, unsigned char **out); +#define DECLARE_ASN1_ENCODE_FUNCTIONS_only(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(extern, type, name) + +#define DECLARE_ASN1_NDEF_FUNCTION_attr(attr, name) \ + attr int i2d_##name##_NDEF(const name *a, unsigned char **out); +#define DECLARE_ASN1_NDEF_FUNCTION(name) \ + DECLARE_ASN1_NDEF_FUNCTION_attr(extern, name) + +#define DECLARE_ASN1_ALLOC_FUNCTIONS_name_attr(attr, type, name) \ + attr type *name##_new(void); \ + attr void name##_free(type *a); +#define DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name_attr(extern, type, name) + +#define DECLARE_ASN1_DUP_FUNCTION_attr(attr, type) \ + DECLARE_ASN1_DUP_FUNCTION_name_attr(attr, type, type) +#define DECLARE_ASN1_DUP_FUNCTION(type) \ + DECLARE_ASN1_DUP_FUNCTION_attr(extern, type) + +#define DECLARE_ASN1_DUP_FUNCTION_name_attr(attr, type, name) \ + attr type *name##_dup(const type *a); +#define DECLARE_ASN1_DUP_FUNCTION_name(type, name) \ + DECLARE_ASN1_DUP_FUNCTION_name_attr(extern, type, name) + +#define DECLARE_ASN1_PRINT_FUNCTION_attr(attr, stname) \ + DECLARE_ASN1_PRINT_FUNCTION_fname_attr(attr, stname, stname) +#define DECLARE_ASN1_PRINT_FUNCTION(stname) \ + DECLARE_ASN1_PRINT_FUNCTION_attr(extern, stname) + +#define DECLARE_ASN1_PRINT_FUNCTION_fname_attr(attr, stname, fname) \ + attr int fname##_print_ctx(BIO *out, const stname *x, int indent, \ + const ASN1_PCTX *pctx); +#define DECLARE_ASN1_PRINT_FUNCTION_fname(stname, fname) \ + DECLARE_ASN1_PRINT_FUNCTION_fname_attr(extern, stname, fname) + +#define D2I_OF(type) type *(*)(type **, const unsigned char **, long) +#define I2D_OF(type) int (*)(const type *, unsigned char **) + +#define CHECKED_D2I_OF(type, d2i) \ + ((d2i_of_void *)(1 ? d2i : ((D2I_OF(type))0))) +#define CHECKED_I2D_OF(type, i2d) \ + ((i2d_of_void *)(1 ? i2d : ((I2D_OF(type))0))) +#define CHECKED_NEW_OF(type, xnew) \ + ((void *(*)(void))(1 ? xnew : ((type * (*)(void))0))) +#define CHECKED_PTR_OF(type, p) \ + ((void *)(1 ? p : (type *)0)) +#define CHECKED_PPTR_OF(type, p) \ + ((void **)(1 ? p : (type **)0)) + +#define TYPEDEF_D2I_OF(type) typedef type *d2i_of_##type(type **, const unsigned char **, long) +#define TYPEDEF_I2D_OF(type) typedef int i2d_of_##type(const type *, unsigned char **) +#define TYPEDEF_D2I2D_OF(type) \ + TYPEDEF_D2I_OF(type); \ + TYPEDEF_I2D_OF(type) + +typedef void *d2i_of_void(void **, const unsigned char **, long); +typedef int i2d_of_void(const void *, unsigned char **); +typedef int OSSL_i2d_of_void_ctx(const void *, unsigned char **, void *vctx); + +/*- + * The following macros and typedefs allow an ASN1_ITEM + * to be embedded in a structure and referenced. Since + * the ASN1_ITEM pointers need to be globally accessible + * (possibly from shared libraries) they may exist in + * different forms. On platforms that support it the + * ASN1_ITEM structure itself will be globally exported. + * Other platforms will export a function that returns + * an ASN1_ITEM pointer. + * + * To handle both cases transparently the macros below + * should be used instead of hard coding an ASN1_ITEM + * pointer in a structure. + * + * The structure will look like this: + * + * typedef struct SOMETHING_st { + * ... + * ASN1_ITEM_EXP *iptr; + * ... + * } SOMETHING; + * + * It would be initialised as e.g.: + * + * SOMETHING somevar = {...,ASN1_ITEM_ref(X509),...}; + * + * and the actual pointer extracted with: + * + * const ASN1_ITEM *it = ASN1_ITEM_ptr(somevar.iptr); + * + * Finally an ASN1_ITEM pointer can be extracted from an + * appropriate reference with: ASN1_ITEM_rptr(X509). This + * would be used when a function takes an ASN1_ITEM * argument. + * + */ + +/* + * Platforms that can't easily handle shared global variables are declared as + * functions returning ASN1_ITEM pointers. + */ + +/* ASN1_ITEM pointer exported type */ +typedef const ASN1_ITEM *ASN1_ITEM_EXP(void); + +/* Macro to obtain ASN1_ITEM pointer from exported type */ +#define ASN1_ITEM_ptr(iptr) (iptr()) + +/* Macro to include ASN1_ITEM pointer from base type */ +#define ASN1_ITEM_ref(iptr) (iptr##_it) + +#define ASN1_ITEM_rptr(ref) (ref##_it()) + +#define DECLARE_ASN1_ITEM_attr(attr, name) \ + attr const ASN1_ITEM *name##_it(void); +#define DECLARE_ASN1_ITEM(name) \ + DECLARE_ASN1_ITEM_attr(extern, name) + +/* Parameters used by ASN1_STRING_print_ex() */ + +/* + * These determine which characters to escape: RFC2253 special characters, + * control characters and MSB set characters + */ + +#define ASN1_STRFLGS_ESC_2253 1 +#define ASN1_STRFLGS_ESC_CTRL 2 +#define ASN1_STRFLGS_ESC_MSB 4 + +/* Lower 8 bits are reserved as an output type specifier */ +#define ASN1_DTFLGS_TYPE_MASK 0x0FUL +#define ASN1_DTFLGS_RFC822 0x00UL +#define ASN1_DTFLGS_ISO8601 0x01UL + +/* + * This flag determines how we do escaping: normally RC2253 backslash only, + * set this to use backslash and quote. + */ + +#define ASN1_STRFLGS_ESC_QUOTE 8 + +/* These three flags are internal use only. */ + +/* Character is a valid PrintableString character */ +#define CHARTYPE_PRINTABLESTRING 0x10 +/* Character needs escaping if it is the first character */ +#define CHARTYPE_FIRST_ESC_2253 0x20 +/* Character needs escaping if it is the last character */ +#define CHARTYPE_LAST_ESC_2253 0x40 + +/* + * NB the internal flags are safely reused below by flags handled at the top + * level. + */ + +/* + * If this is set we convert all character strings to UTF8 first + */ + +#define ASN1_STRFLGS_UTF8_CONVERT 0x10 + +/* + * If this is set we don't attempt to interpret content: just assume all + * strings are 1 byte per character. This will produce some pretty odd + * looking output! + */ + +#define ASN1_STRFLGS_IGNORE_TYPE 0x20 + +/* If this is set we include the string type in the output */ +#define ASN1_STRFLGS_SHOW_TYPE 0x40 + +/* + * This determines which strings to display and which to 'dump' (hex dump of + * content octets or DER encoding). We can only dump non character strings or + * everything. If we don't dump 'unknown' they are interpreted as character + * strings with 1 octet per character and are subject to the usual escaping + * options. + */ + +#define ASN1_STRFLGS_DUMP_ALL 0x80 +#define ASN1_STRFLGS_DUMP_UNKNOWN 0x100 + +/* + * These determine what 'dumping' does, we can dump the content octets or the + * DER encoding: both use the RFC2253 #XXXXX notation. + */ + +#define ASN1_STRFLGS_DUMP_DER 0x200 + +/* + * This flag specifies that RC2254 escaping shall be performed. + */ +#define ASN1_STRFLGS_ESC_2254 0x400 + +/* + * All the string flags consistent with RFC2253, escaping control characters + * isn't essential in RFC2253 but it is advisable anyway. + */ + +#define ASN1_STRFLGS_RFC2253 (ASN1_STRFLGS_ESC_2253 | ASN1_STRFLGS_ESC_CTRL | ASN1_STRFLGS_ESC_MSB | ASN1_STRFLGS_UTF8_CONVERT | ASN1_STRFLGS_DUMP_UNKNOWN | ASN1_STRFLGS_DUMP_DER) + +struct asn1_type_st { + int type; + union { + char *ptr; + ASN1_BOOLEAN boolean; + ASN1_STRING *asn1_string; + ASN1_OBJECT *object; + ASN1_INTEGER *integer; + ASN1_ENUMERATED *enumerated; + ASN1_BIT_STRING *bit_string; + ASN1_OCTET_STRING *octet_string; + ASN1_PRINTABLESTRING *printablestring; + ASN1_T61STRING *t61string; + ASN1_IA5STRING *ia5string; + ASN1_GENERALSTRING *generalstring; + ASN1_BMPSTRING *bmpstring; + ASN1_UNIVERSALSTRING *universalstring; + ASN1_UTCTIME *utctime; + ASN1_GENERALIZEDTIME *generalizedtime; + ASN1_VISIBLESTRING *visiblestring; + ASN1_UTF8STRING *utf8string; + /* + * set and sequence are left complete and still contain the set or + * sequence bytes + */ + ASN1_STRING *set; + ASN1_STRING *sequence; + ASN1_VALUE *asn1_value; + } value; +}; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_TYPE, ASN1_TYPE, ASN1_TYPE) +#define sk_ASN1_TYPE_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_value(sk, idx) ((ASN1_TYPE *)OPENSSL_sk_value(ossl_check_const_ASN1_TYPE_sk_type(sk), (idx))) +#define sk_ASN1_TYPE_new(cmp) ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_new(ossl_check_ASN1_TYPE_compfunc_type(cmp))) +#define sk_ASN1_TYPE_new_null() ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_new_null()) +#define sk_ASN1_TYPE_new_reserve(cmp, n) ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_TYPE_compfunc_type(cmp), (n))) +#define sk_ASN1_TYPE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_TYPE_sk_type(sk), (n)) +#define sk_ASN1_TYPE_free(sk) OPENSSL_sk_free(ossl_check_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_delete(sk, i) ((ASN1_TYPE *)OPENSSL_sk_delete(ossl_check_ASN1_TYPE_sk_type(sk), (i))) +#define sk_ASN1_TYPE_delete_ptr(sk, ptr) ((ASN1_TYPE *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr))) +#define sk_ASN1_TYPE_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr)) +#define sk_ASN1_TYPE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr)) +#define sk_ASN1_TYPE_pop(sk) ((ASN1_TYPE *)OPENSSL_sk_pop(ossl_check_ASN1_TYPE_sk_type(sk))) +#define sk_ASN1_TYPE_shift(sk) ((ASN1_TYPE *)OPENSSL_sk_shift(ossl_check_ASN1_TYPE_sk_type(sk))) +#define sk_ASN1_TYPE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_TYPE_sk_type(sk),ossl_check_ASN1_TYPE_freefunc_type(freefunc)) +#define sk_ASN1_TYPE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr), (idx)) +#define sk_ASN1_TYPE_set(sk, idx, ptr) ((ASN1_TYPE *)OPENSSL_sk_set(ossl_check_ASN1_TYPE_sk_type(sk), (idx), ossl_check_ASN1_TYPE_type(ptr))) +#define sk_ASN1_TYPE_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr)) +#define sk_ASN1_TYPE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr)) +#define sk_ASN1_TYPE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_type(ptr), pnum) +#define sk_ASN1_TYPE_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_TYPE_sk_type(sk)) +#define sk_ASN1_TYPE_dup(sk) ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_dup(ossl_check_const_ASN1_TYPE_sk_type(sk))) +#define sk_ASN1_TYPE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_TYPE) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_copyfunc_type(copyfunc), ossl_check_ASN1_TYPE_freefunc_type(freefunc))) +#define sk_ASN1_TYPE_set_cmp_func(sk, cmp) ((sk_ASN1_TYPE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_TYPE_sk_type(sk), ossl_check_ASN1_TYPE_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(ASN1_TYPE) ASN1_SEQUENCE_ANY; + +DECLARE_ASN1_ENCODE_FUNCTIONS_name(ASN1_SEQUENCE_ANY, ASN1_SEQUENCE_ANY) +DECLARE_ASN1_ENCODE_FUNCTIONS_name(ASN1_SEQUENCE_ANY, ASN1_SET_ANY) + +/* This is used to contain a list of bit names */ +typedef struct BIT_STRING_BITNAME_st { + int bitnum; + const char *lname; + const char *sname; +} BIT_STRING_BITNAME; + +#define B_ASN1_TIME \ + B_ASN1_UTCTIME | B_ASN1_GENERALIZEDTIME + +#define B_ASN1_PRINTABLE \ + B_ASN1_NUMERICSTRING | B_ASN1_PRINTABLESTRING | B_ASN1_T61STRING | B_ASN1_IA5STRING | B_ASN1_BIT_STRING | B_ASN1_UNIVERSALSTRING | B_ASN1_BMPSTRING | B_ASN1_UTF8STRING | B_ASN1_SEQUENCE | B_ASN1_UNKNOWN + +#define B_ASN1_DIRECTORYSTRING \ + B_ASN1_PRINTABLESTRING | B_ASN1_TELETEXSTRING | B_ASN1_BMPSTRING | B_ASN1_UNIVERSALSTRING | B_ASN1_UTF8STRING + +#define B_ASN1_DISPLAYTEXT \ + B_ASN1_IA5STRING | B_ASN1_VISIBLESTRING | B_ASN1_BMPSTRING | B_ASN1_UTF8STRING + +DECLARE_ASN1_ALLOC_FUNCTIONS_name(ASN1_TYPE, ASN1_TYPE) +DECLARE_ASN1_ENCODE_FUNCTIONS(ASN1_TYPE, ASN1_ANY, ASN1_TYPE) + +int ASN1_TYPE_get(const ASN1_TYPE *a); +void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value); +int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value); +int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b); + +ASN1_TYPE *ASN1_TYPE_pack_sequence(const ASN1_ITEM *it, void *s, ASN1_TYPE **t); +void *ASN1_TYPE_unpack_sequence(const ASN1_ITEM *it, const ASN1_TYPE *t); + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_OBJECT, ASN1_OBJECT, ASN1_OBJECT) +#define sk_ASN1_OBJECT_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_value(sk, idx) ((ASN1_OBJECT *)OPENSSL_sk_value(ossl_check_const_ASN1_OBJECT_sk_type(sk), (idx))) +#define sk_ASN1_OBJECT_new(cmp) ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_new(ossl_check_ASN1_OBJECT_compfunc_type(cmp))) +#define sk_ASN1_OBJECT_new_null() ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_new_null()) +#define sk_ASN1_OBJECT_new_reserve(cmp, n) ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_OBJECT_compfunc_type(cmp), (n))) +#define sk_ASN1_OBJECT_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_OBJECT_sk_type(sk), (n)) +#define sk_ASN1_OBJECT_free(sk) OPENSSL_sk_free(ossl_check_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_delete(sk, i) ((ASN1_OBJECT *)OPENSSL_sk_delete(ossl_check_ASN1_OBJECT_sk_type(sk), (i))) +#define sk_ASN1_OBJECT_delete_ptr(sk, ptr) ((ASN1_OBJECT *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr))) +#define sk_ASN1_OBJECT_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr)) +#define sk_ASN1_OBJECT_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr)) +#define sk_ASN1_OBJECT_pop(sk) ((ASN1_OBJECT *)OPENSSL_sk_pop(ossl_check_ASN1_OBJECT_sk_type(sk))) +#define sk_ASN1_OBJECT_shift(sk) ((ASN1_OBJECT *)OPENSSL_sk_shift(ossl_check_ASN1_OBJECT_sk_type(sk))) +#define sk_ASN1_OBJECT_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_OBJECT_sk_type(sk),ossl_check_ASN1_OBJECT_freefunc_type(freefunc)) +#define sk_ASN1_OBJECT_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr), (idx)) +#define sk_ASN1_OBJECT_set(sk, idx, ptr) ((ASN1_OBJECT *)OPENSSL_sk_set(ossl_check_ASN1_OBJECT_sk_type(sk), (idx), ossl_check_ASN1_OBJECT_type(ptr))) +#define sk_ASN1_OBJECT_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr)) +#define sk_ASN1_OBJECT_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr)) +#define sk_ASN1_OBJECT_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_type(ptr), pnum) +#define sk_ASN1_OBJECT_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_OBJECT_sk_type(sk)) +#define sk_ASN1_OBJECT_dup(sk) ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_dup(ossl_check_const_ASN1_OBJECT_sk_type(sk))) +#define sk_ASN1_OBJECT_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_OBJECT) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_copyfunc_type(copyfunc), ossl_check_ASN1_OBJECT_freefunc_type(freefunc))) +#define sk_ASN1_OBJECT_set_cmp_func(sk, cmp) ((sk_ASN1_OBJECT_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_OBJECT_sk_type(sk), ossl_check_ASN1_OBJECT_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_FUNCTIONS(ASN1_OBJECT) + +ASN1_STRING *ASN1_STRING_new(void); +void ASN1_STRING_free(ASN1_STRING *a); +void ASN1_STRING_clear_free(ASN1_STRING *a); +int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str); +DECLARE_ASN1_DUP_FUNCTION(ASN1_STRING) +ASN1_STRING *ASN1_STRING_type_new(int type); +int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b); +/* + * Since this is used to store all sorts of things, via macros, for now, + * make its data void * + */ +int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len); +void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len); +int ASN1_STRING_length(const ASN1_STRING *x); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 void ASN1_STRING_length_set(ASN1_STRING *x, int n); +#endif +int ASN1_STRING_type(const ASN1_STRING *x); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 unsigned char *ASN1_STRING_data(ASN1_STRING *x); +#endif +const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *x); + +DECLARE_ASN1_FUNCTIONS(ASN1_BIT_STRING) +int ASN1_BIT_STRING_set(ASN1_BIT_STRING *a, unsigned char *d, int length); +int ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value); +int ASN1_BIT_STRING_get_bit(const ASN1_BIT_STRING *a, int n); +int ASN1_BIT_STRING_check(const ASN1_BIT_STRING *a, + const unsigned char *flags, int flags_len); + +int ASN1_BIT_STRING_name_print(BIO *out, ASN1_BIT_STRING *bs, + BIT_STRING_BITNAME *tbl, int indent); +int ASN1_BIT_STRING_num_asc(const char *name, BIT_STRING_BITNAME *tbl); +int ASN1_BIT_STRING_set_asc(ASN1_BIT_STRING *bs, const char *name, int value, + BIT_STRING_BITNAME *tbl); + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_INTEGER, ASN1_INTEGER, ASN1_INTEGER) +#define sk_ASN1_INTEGER_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_value(sk, idx) ((ASN1_INTEGER *)OPENSSL_sk_value(ossl_check_const_ASN1_INTEGER_sk_type(sk), (idx))) +#define sk_ASN1_INTEGER_new(cmp) ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_new(ossl_check_ASN1_INTEGER_compfunc_type(cmp))) +#define sk_ASN1_INTEGER_new_null() ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_new_null()) +#define sk_ASN1_INTEGER_new_reserve(cmp, n) ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_INTEGER_compfunc_type(cmp), (n))) +#define sk_ASN1_INTEGER_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_INTEGER_sk_type(sk), (n)) +#define sk_ASN1_INTEGER_free(sk) OPENSSL_sk_free(ossl_check_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_delete(sk, i) ((ASN1_INTEGER *)OPENSSL_sk_delete(ossl_check_ASN1_INTEGER_sk_type(sk), (i))) +#define sk_ASN1_INTEGER_delete_ptr(sk, ptr) ((ASN1_INTEGER *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr))) +#define sk_ASN1_INTEGER_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr)) +#define sk_ASN1_INTEGER_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr)) +#define sk_ASN1_INTEGER_pop(sk) ((ASN1_INTEGER *)OPENSSL_sk_pop(ossl_check_ASN1_INTEGER_sk_type(sk))) +#define sk_ASN1_INTEGER_shift(sk) ((ASN1_INTEGER *)OPENSSL_sk_shift(ossl_check_ASN1_INTEGER_sk_type(sk))) +#define sk_ASN1_INTEGER_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_INTEGER_sk_type(sk),ossl_check_ASN1_INTEGER_freefunc_type(freefunc)) +#define sk_ASN1_INTEGER_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr), (idx)) +#define sk_ASN1_INTEGER_set(sk, idx, ptr) ((ASN1_INTEGER *)OPENSSL_sk_set(ossl_check_ASN1_INTEGER_sk_type(sk), (idx), ossl_check_ASN1_INTEGER_type(ptr))) +#define sk_ASN1_INTEGER_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr)) +#define sk_ASN1_INTEGER_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr)) +#define sk_ASN1_INTEGER_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_type(ptr), pnum) +#define sk_ASN1_INTEGER_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_INTEGER_sk_type(sk)) +#define sk_ASN1_INTEGER_dup(sk) ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_dup(ossl_check_const_ASN1_INTEGER_sk_type(sk))) +#define sk_ASN1_INTEGER_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_INTEGER) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_copyfunc_type(copyfunc), ossl_check_ASN1_INTEGER_freefunc_type(freefunc))) +#define sk_ASN1_INTEGER_set_cmp_func(sk, cmp) ((sk_ASN1_INTEGER_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_INTEGER_sk_type(sk), ossl_check_ASN1_INTEGER_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_FUNCTIONS(ASN1_INTEGER) +ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp, + long length); +DECLARE_ASN1_DUP_FUNCTION(ASN1_INTEGER) +int ASN1_INTEGER_cmp(const ASN1_INTEGER *x, const ASN1_INTEGER *y); + +DECLARE_ASN1_FUNCTIONS(ASN1_ENUMERATED) + +int ASN1_UTCTIME_check(const ASN1_UTCTIME *a); +ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t); +ASN1_UTCTIME *ASN1_UTCTIME_adj(ASN1_UTCTIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str); +int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t); + +int ASN1_GENERALIZEDTIME_check(const ASN1_GENERALIZEDTIME *a); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s, + time_t t); +ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_adj(ASN1_GENERALIZEDTIME *s, + time_t t, int offset_day, + long offset_sec); +int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str); + +int ASN1_TIME_diff(int *pday, int *psec, + const ASN1_TIME *from, const ASN1_TIME *to); + +DECLARE_ASN1_FUNCTIONS(ASN1_OCTET_STRING) +DECLARE_ASN1_DUP_FUNCTION(ASN1_OCTET_STRING) +int ASN1_OCTET_STRING_cmp(const ASN1_OCTET_STRING *a, + const ASN1_OCTET_STRING *b); +int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *str, const unsigned char *data, + int len); + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_UTF8STRING, ASN1_UTF8STRING, ASN1_UTF8STRING) +#define sk_ASN1_UTF8STRING_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_value(sk, idx) ((ASN1_UTF8STRING *)OPENSSL_sk_value(ossl_check_const_ASN1_UTF8STRING_sk_type(sk), (idx))) +#define sk_ASN1_UTF8STRING_new(cmp) ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_new(ossl_check_ASN1_UTF8STRING_compfunc_type(cmp))) +#define sk_ASN1_UTF8STRING_new_null() ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_new_null()) +#define sk_ASN1_UTF8STRING_new_reserve(cmp, n) ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_UTF8STRING_compfunc_type(cmp), (n))) +#define sk_ASN1_UTF8STRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_UTF8STRING_sk_type(sk), (n)) +#define sk_ASN1_UTF8STRING_free(sk) OPENSSL_sk_free(ossl_check_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_delete(sk, i) ((ASN1_UTF8STRING *)OPENSSL_sk_delete(ossl_check_ASN1_UTF8STRING_sk_type(sk), (i))) +#define sk_ASN1_UTF8STRING_delete_ptr(sk, ptr) ((ASN1_UTF8STRING *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr))) +#define sk_ASN1_UTF8STRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr)) +#define sk_ASN1_UTF8STRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr)) +#define sk_ASN1_UTF8STRING_pop(sk) ((ASN1_UTF8STRING *)OPENSSL_sk_pop(ossl_check_ASN1_UTF8STRING_sk_type(sk))) +#define sk_ASN1_UTF8STRING_shift(sk) ((ASN1_UTF8STRING *)OPENSSL_sk_shift(ossl_check_ASN1_UTF8STRING_sk_type(sk))) +#define sk_ASN1_UTF8STRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_UTF8STRING_sk_type(sk),ossl_check_ASN1_UTF8STRING_freefunc_type(freefunc)) +#define sk_ASN1_UTF8STRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr), (idx)) +#define sk_ASN1_UTF8STRING_set(sk, idx, ptr) ((ASN1_UTF8STRING *)OPENSSL_sk_set(ossl_check_ASN1_UTF8STRING_sk_type(sk), (idx), ossl_check_ASN1_UTF8STRING_type(ptr))) +#define sk_ASN1_UTF8STRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr)) +#define sk_ASN1_UTF8STRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr)) +#define sk_ASN1_UTF8STRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_type(ptr), pnum) +#define sk_ASN1_UTF8STRING_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_UTF8STRING_sk_type(sk)) +#define sk_ASN1_UTF8STRING_dup(sk) ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_dup(ossl_check_const_ASN1_UTF8STRING_sk_type(sk))) +#define sk_ASN1_UTF8STRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_UTF8STRING) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_copyfunc_type(copyfunc), ossl_check_ASN1_UTF8STRING_freefunc_type(freefunc))) +#define sk_ASN1_UTF8STRING_set_cmp_func(sk, cmp) ((sk_ASN1_UTF8STRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_UTF8STRING_sk_type(sk), ossl_check_ASN1_UTF8STRING_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_FUNCTIONS(ASN1_VISIBLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UNIVERSALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTF8STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_NULL) +DECLARE_ASN1_FUNCTIONS(ASN1_BMPSTRING) + +int UTF8_getc(const unsigned char *str, int len, unsigned long *val); +int UTF8_putc(unsigned char *str, int len, unsigned long value); + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_GENERALSTRING, ASN1_GENERALSTRING, ASN1_GENERALSTRING) +#define sk_ASN1_GENERALSTRING_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_value(sk, idx) ((ASN1_GENERALSTRING *)OPENSSL_sk_value(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk), (idx))) +#define sk_ASN1_GENERALSTRING_new(cmp) ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_new(ossl_check_ASN1_GENERALSTRING_compfunc_type(cmp))) +#define sk_ASN1_GENERALSTRING_new_null() ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_new_null()) +#define sk_ASN1_GENERALSTRING_new_reserve(cmp, n) ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_GENERALSTRING_compfunc_type(cmp), (n))) +#define sk_ASN1_GENERALSTRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_GENERALSTRING_sk_type(sk), (n)) +#define sk_ASN1_GENERALSTRING_free(sk) OPENSSL_sk_free(ossl_check_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_delete(sk, i) ((ASN1_GENERALSTRING *)OPENSSL_sk_delete(ossl_check_ASN1_GENERALSTRING_sk_type(sk), (i))) +#define sk_ASN1_GENERALSTRING_delete_ptr(sk, ptr) ((ASN1_GENERALSTRING *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr))) +#define sk_ASN1_GENERALSTRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr)) +#define sk_ASN1_GENERALSTRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr)) +#define sk_ASN1_GENERALSTRING_pop(sk) ((ASN1_GENERALSTRING *)OPENSSL_sk_pop(ossl_check_ASN1_GENERALSTRING_sk_type(sk))) +#define sk_ASN1_GENERALSTRING_shift(sk) ((ASN1_GENERALSTRING *)OPENSSL_sk_shift(ossl_check_ASN1_GENERALSTRING_sk_type(sk))) +#define sk_ASN1_GENERALSTRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_GENERALSTRING_sk_type(sk),ossl_check_ASN1_GENERALSTRING_freefunc_type(freefunc)) +#define sk_ASN1_GENERALSTRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr), (idx)) +#define sk_ASN1_GENERALSTRING_set(sk, idx, ptr) ((ASN1_GENERALSTRING *)OPENSSL_sk_set(ossl_check_ASN1_GENERALSTRING_sk_type(sk), (idx), ossl_check_ASN1_GENERALSTRING_type(ptr))) +#define sk_ASN1_GENERALSTRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr)) +#define sk_ASN1_GENERALSTRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr)) +#define sk_ASN1_GENERALSTRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_type(ptr), pnum) +#define sk_ASN1_GENERALSTRING_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk)) +#define sk_ASN1_GENERALSTRING_dup(sk) ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_dup(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk))) +#define sk_ASN1_GENERALSTRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_GENERALSTRING) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_copyfunc_type(copyfunc), ossl_check_ASN1_GENERALSTRING_freefunc_type(freefunc))) +#define sk_ASN1_GENERALSTRING_set_cmp_func(sk, cmp) ((sk_ASN1_GENERALSTRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_GENERALSTRING_sk_type(sk), ossl_check_ASN1_GENERALSTRING_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, ASN1_PRINTABLE) + +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DIRECTORYSTRING) +DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DISPLAYTEXT) +DECLARE_ASN1_FUNCTIONS(ASN1_PRINTABLESTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_T61STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_IA5STRING) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALSTRING) +DECLARE_ASN1_FUNCTIONS(ASN1_UTCTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_GENERALIZEDTIME) +DECLARE_ASN1_FUNCTIONS(ASN1_TIME) + +DECLARE_ASN1_DUP_FUNCTION(ASN1_TIME) +DECLARE_ASN1_DUP_FUNCTION(ASN1_UTCTIME) +DECLARE_ASN1_DUP_FUNCTION(ASN1_GENERALIZEDTIME) + +DECLARE_ASN1_ITEM(ASN1_OCTET_STRING_NDEF) + +ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t); +ASN1_TIME *ASN1_TIME_adj(ASN1_TIME *s, time_t t, + int offset_day, long offset_sec); +int ASN1_TIME_check(const ASN1_TIME *t); +ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(const ASN1_TIME *t, + ASN1_GENERALIZEDTIME **out); +int ASN1_TIME_set_string(ASN1_TIME *s, const char *str); +int ASN1_TIME_set_string_X509(ASN1_TIME *s, const char *str); +int ASN1_TIME_to_tm(const ASN1_TIME *s, struct tm *tm); +int ASN1_TIME_normalize(ASN1_TIME *s); +int ASN1_TIME_cmp_time_t(const ASN1_TIME *s, time_t t); +int ASN1_TIME_compare(const ASN1_TIME *a, const ASN1_TIME *b); + +int i2a_ASN1_INTEGER(BIO *bp, const ASN1_INTEGER *a); +int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size); +int i2a_ASN1_ENUMERATED(BIO *bp, const ASN1_ENUMERATED *a); +int a2i_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *bs, char *buf, int size); +int i2a_ASN1_OBJECT(BIO *bp, const ASN1_OBJECT *a); +int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size); +int i2a_ASN1_STRING(BIO *bp, const ASN1_STRING *a, int type); +int i2t_ASN1_OBJECT(char *buf, int buf_len, const ASN1_OBJECT *a); + +int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num); +ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data, int len, + const char *sn, const char *ln); + +int ASN1_INTEGER_get_int64(int64_t *pr, const ASN1_INTEGER *a); +int ASN1_INTEGER_set_int64(ASN1_INTEGER *a, int64_t r); +int ASN1_INTEGER_get_uint64(uint64_t *pr, const ASN1_INTEGER *a); +int ASN1_INTEGER_set_uint64(ASN1_INTEGER *a, uint64_t r); + +int ASN1_INTEGER_set(ASN1_INTEGER *a, long v); +long ASN1_INTEGER_get(const ASN1_INTEGER *a); +ASN1_INTEGER *BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN1_INTEGER *ai); +BIGNUM *ASN1_INTEGER_to_BN(const ASN1_INTEGER *ai, BIGNUM *bn); + +int ASN1_ENUMERATED_get_int64(int64_t *pr, const ASN1_ENUMERATED *a); +int ASN1_ENUMERATED_set_int64(ASN1_ENUMERATED *a, int64_t r); + +int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v); +long ASN1_ENUMERATED_get(const ASN1_ENUMERATED *a); +ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(const BIGNUM *bn, ASN1_ENUMERATED *ai); +BIGNUM *ASN1_ENUMERATED_to_BN(const ASN1_ENUMERATED *ai, BIGNUM *bn); + +/* General */ +/* given a string, return the correct type, max is the maximum length */ +int ASN1_PRINTABLE_type(const unsigned char *s, int max); + +unsigned long ASN1_tag2bit(int tag); + +/* SPECIALS */ +int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag, + int *pclass, long omax); +int ASN1_check_infinite_end(unsigned char **p, long len); +int ASN1_const_check_infinite_end(const unsigned char **p, long len); +void ASN1_put_object(unsigned char **pp, int constructed, int length, + int tag, int xclass); +int ASN1_put_eoc(unsigned char **pp); +int ASN1_object_size(int constructed, int length, int tag); + +/* Used to implement other functions */ +void *ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, const void *x); + +#define ASN1_dup_of(type, i2d, d2i, x) \ + ((type *)ASN1_dup(CHECKED_I2D_OF(type, i2d), \ + CHECKED_D2I_OF(type, d2i), \ + CHECKED_PTR_OF(const type, x))) + +void *ASN1_item_dup(const ASN1_ITEM *it, const void *x); +int ASN1_item_sign_ex(const ASN1_ITEM *it, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + const void *data, const ASN1_OCTET_STRING *id, + EVP_PKEY *pkey, const EVP_MD *md, OSSL_LIB_CTX *libctx, + const char *propq); +int ASN1_item_verify_ex(const ASN1_ITEM *it, const X509_ALGOR *alg, + const ASN1_BIT_STRING *signature, const void *data, + const ASN1_OCTET_STRING *id, EVP_PKEY *pkey, + OSSL_LIB_CTX *libctx, const char *propq); + +/* ASN1 alloc/free macros for when a type is only used internally */ + +#define M_ASN1_new_of(type) (type *)ASN1_item_new(ASN1_ITEM_rptr(type)) +#define M_ASN1_free_of(x, type) \ + ASN1_item_free(CHECKED_PTR_OF(type, x), ASN1_ITEM_rptr(type)) + +#ifndef OPENSSL_NO_STDIO +void *ASN1_d2i_fp(void *(*xnew)(void), d2i_of_void *d2i, FILE *in, void **x); + +#define ASN1_d2i_fp_of(type, xnew, d2i, in, x) \ + ((type *)ASN1_d2i_fp(CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_fp_ex(const ASN1_ITEM *it, FILE *in, void *x, + OSSL_LIB_CTX *libctx, const char *propq); +void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x); +int ASN1_i2d_fp(i2d_of_void *i2d, FILE *out, const void *x); + +#define ASN1_i2d_fp_of(type, i2d, out, x) \ + (ASN1_i2d_fp(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, const void *x); +int ASN1_STRING_print_ex_fp(FILE *fp, const ASN1_STRING *str, unsigned long flags); +#endif + +int ASN1_STRING_to_UTF8(unsigned char **out, const ASN1_STRING *in); + +void *ASN1_d2i_bio(void *(*xnew)(void), d2i_of_void *d2i, BIO *in, void **x); + +#define ASN1_d2i_bio_of(type, xnew, d2i, in, x) \ + ((type *)ASN1_d2i_bio(CHECKED_NEW_OF(type, xnew), \ + CHECKED_D2I_OF(type, d2i), \ + in, \ + CHECKED_PPTR_OF(type, x))) + +void *ASN1_item_d2i_bio_ex(const ASN1_ITEM *it, BIO *in, void *pval, + OSSL_LIB_CTX *libctx, const char *propq); +void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *pval); +int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, const void *x); + +#define ASN1_i2d_bio_of(type, i2d, out, x) \ + (ASN1_i2d_bio(CHECKED_I2D_OF(type, i2d), \ + out, \ + CHECKED_PTR_OF(const type, x))) + +int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, const void *x); +BIO *ASN1_item_i2d_mem_bio(const ASN1_ITEM *it, const ASN1_VALUE *val); +int ASN1_UTCTIME_print(BIO *fp, const ASN1_UTCTIME *a); +int ASN1_GENERALIZEDTIME_print(BIO *fp, const ASN1_GENERALIZEDTIME *a); +int ASN1_TIME_print(BIO *bp, const ASN1_TIME *tm); +int ASN1_TIME_print_ex(BIO *bp, const ASN1_TIME *tm, unsigned long flags); +int ASN1_STRING_print(BIO *bp, const ASN1_STRING *v); +int ASN1_STRING_print_ex(BIO *out, const ASN1_STRING *str, unsigned long flags); +int ASN1_buf_print(BIO *bp, const unsigned char *buf, size_t buflen, int off); +int ASN1_bn_print(BIO *bp, const char *number, const BIGNUM *num, + unsigned char *buf, int off); +int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent); +int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent, + int dump); +const char *ASN1_tag2str(int tag); + +/* Used to load and write Netscape format cert */ + +int ASN1_UNIVERSALSTRING_to_string(ASN1_UNIVERSALSTRING *s); + +int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, unsigned char *data, int len); +int ASN1_TYPE_get_octetstring(const ASN1_TYPE *a, unsigned char *data, int max_len); +int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, + unsigned char *data, int len); +int ASN1_TYPE_get_int_octetstring(const ASN1_TYPE *a, long *num, + unsigned char *data, int max_len); + +void *ASN1_item_unpack(const ASN1_STRING *oct, const ASN1_ITEM *it); +void *ASN1_item_unpack_ex(const ASN1_STRING *oct, const ASN1_ITEM *it, + OSSL_LIB_CTX *libctx, const char *propq); + +ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, + ASN1_OCTET_STRING **oct); + +void ASN1_STRING_set_default_mask(unsigned long mask); +int ASN1_STRING_set_default_mask_asc(const char *p); +unsigned long ASN1_STRING_get_default_mask(void); +int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask); +int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len, + int inform, unsigned long mask, + long minsize, long maxsize); + +ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, + const unsigned char *in, int inlen, + int inform, int nid); +ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid); +int ASN1_STRING_TABLE_add(int, long, long, unsigned long, unsigned long); +void ASN1_STRING_TABLE_cleanup(void); + +/* ASN1 template functions */ + +/* Old API compatible functions */ +ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it); +ASN1_VALUE *ASN1_item_new_ex(const ASN1_ITEM *it, OSSL_LIB_CTX *libctx, + const char *propq); +void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it); +ASN1_VALUE *ASN1_item_d2i_ex(ASN1_VALUE **val, const unsigned char **in, + long len, const ASN1_ITEM *it, + OSSL_LIB_CTX *libctx, const char *propq); +ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **val, const unsigned char **in, + long len, const ASN1_ITEM *it); +int ASN1_item_i2d(const ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it); +int ASN1_item_ndef_i2d(const ASN1_VALUE *val, unsigned char **out, + const ASN1_ITEM *it); + +void ASN1_add_oid_module(void); +void ASN1_add_stable_module(void); + +ASN1_TYPE *ASN1_generate_nconf(const char *str, CONF *nconf); +ASN1_TYPE *ASN1_generate_v3(const char *str, X509V3_CTX *cnf); +int ASN1_str2mask(const char *str, unsigned long *pmask); + +/* ASN1 Print flags */ + +/* Indicate missing OPTIONAL fields */ +#define ASN1_PCTX_FLAGS_SHOW_ABSENT 0x001 +/* Mark start and end of SEQUENCE */ +#define ASN1_PCTX_FLAGS_SHOW_SEQUENCE 0x002 +/* Mark start and end of SEQUENCE/SET OF */ +#define ASN1_PCTX_FLAGS_SHOW_SSOF 0x004 +/* Show the ASN1 type of primitives */ +#define ASN1_PCTX_FLAGS_SHOW_TYPE 0x008 +/* Don't show ASN1 type of ANY */ +#define ASN1_PCTX_FLAGS_NO_ANY_TYPE 0x010 +/* Don't show ASN1 type of MSTRINGs */ +#define ASN1_PCTX_FLAGS_NO_MSTRING_TYPE 0x020 +/* Don't show field names in SEQUENCE */ +#define ASN1_PCTX_FLAGS_NO_FIELD_NAME 0x040 +/* Show structure names of each SEQUENCE field */ +#define ASN1_PCTX_FLAGS_SHOW_FIELD_STRUCT_NAME 0x080 +/* Don't show structure name even at top level */ +#define ASN1_PCTX_FLAGS_NO_STRUCT_NAME 0x100 + +int ASN1_item_print(BIO *out, const ASN1_VALUE *ifld, int indent, + const ASN1_ITEM *it, const ASN1_PCTX *pctx); +ASN1_PCTX *ASN1_PCTX_new(void); +void ASN1_PCTX_free(ASN1_PCTX *p); +unsigned long ASN1_PCTX_get_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_nm_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_nm_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_cert_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_cert_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_oid_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_oid_flags(ASN1_PCTX *p, unsigned long flags); +unsigned long ASN1_PCTX_get_str_flags(const ASN1_PCTX *p); +void ASN1_PCTX_set_str_flags(ASN1_PCTX *p, unsigned long flags); + +ASN1_SCTX *ASN1_SCTX_new(int (*scan_cb)(ASN1_SCTX *ctx)); +void ASN1_SCTX_free(ASN1_SCTX *p); +const ASN1_ITEM *ASN1_SCTX_get_item(ASN1_SCTX *p); +const ASN1_TEMPLATE *ASN1_SCTX_get_template(ASN1_SCTX *p); +unsigned long ASN1_SCTX_get_flags(ASN1_SCTX *p); +void ASN1_SCTX_set_app_data(ASN1_SCTX *p, void *data); +void *ASN1_SCTX_get_app_data(ASN1_SCTX *p); + +const BIO_METHOD *BIO_f_asn1(void); + +/* cannot constify val because of CMS_stream() */ +BIO *BIO_new_NDEF(BIO *out, ASN1_VALUE *val, const ASN1_ITEM *it); + +int i2d_ASN1_bio_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const ASN1_ITEM *it); +int PEM_write_bio_ASN1_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags, + const char *hdr, const ASN1_ITEM *it); +/* cannot constify val because of CMS_dataFinal() */ +int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, + int ctype_nid, int econt_nid, + STACK_OF(X509_ALGOR) *mdalgs, const ASN1_ITEM *it); +int SMIME_write_ASN1_ex(BIO *bio, ASN1_VALUE *val, BIO *data, int flags, + int ctype_nid, int econt_nid, + STACK_OF(X509_ALGOR) *mdalgs, const ASN1_ITEM *it, + OSSL_LIB_CTX *libctx, const char *propq); +ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it); +ASN1_VALUE *SMIME_read_ASN1_ex(BIO *bio, int flags, BIO **bcont, + const ASN1_ITEM *it, ASN1_VALUE **x, + OSSL_LIB_CTX *libctx, const char *propq); +int SMIME_crlf_copy(BIO *in, BIO *out, int flags); +int SMIME_text(BIO *in, BIO *out); + +const ASN1_ITEM *ASN1_ITEM_lookup(const char *name); +const ASN1_ITEM *ASN1_ITEM_get(size_t i); + +/* Legacy compatibility */ +#define DECLARE_ASN1_FUNCTIONS_fname(type, itname, name) \ + DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) +#define DECLARE_ASN1_FUNCTIONS_const(type) DECLARE_ASN1_FUNCTIONS(type) +#define DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \ + DECLARE_ASN1_ENCODE_FUNCTIONS(type, name) +#define I2D_OF_const(type) I2D_OF(type) +#define ASN1_dup_of_const(type, i2d, d2i, x) ASN1_dup_of(type, i2d, d2i, x) +#define ASN1_i2d_fp_of_const(type, i2d, out, x) ASN1_i2d_fp_of(type, i2d, out, x) +#define ASN1_i2d_bio_of_const(type, i2d, out, x) ASN1_i2d_bio_of(type, i2d, out, x) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/asn1t.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/asn1t.h new file mode 100644 index 000000000000..dc9042c812c9 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/asn1t.h @@ -0,0 +1,935 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/asn1t.h.in + * + * Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_ASN1T_H +#define OPENSSL_ASN1T_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_ASN1T_H +#endif + +#include +#include +#include + +#ifdef OPENSSL_BUILD_SHLIBCRYPTO +#undef OPENSSL_EXTERN +#define OPENSSL_EXTERN OPENSSL_EXPORT +#endif + +/* ASN1 template defines, structures and functions */ + +#ifdef __cplusplus +extern "C" { +#endif + +/*- + * These are the possible values for the itype field of the + * ASN1_ITEM structure and determine how it is interpreted. + * + * For PRIMITIVE types the underlying type + * determines the behaviour if items is NULL. + * + * Otherwise templates must contain a single + * template and the type is treated in the + * same way as the type specified in the template. + * + * For SEQUENCE types the templates field points + * to the members, the size field is the + * structure size. + * + * For CHOICE types the templates field points + * to each possible member (typically a union) + * and the 'size' field is the offset of the + * selector. + * + * The 'funcs' field is used for application-specific + * data and functions. + * + * The EXTERN type uses a new style d2i/i2d. + * The new style should be used where possible + * because it avoids things like the d2i IMPLICIT + * hack. + * + * MSTRING is a multiple string type, it is used + * for a CHOICE of character strings where the + * actual strings all occupy an ASN1_STRING + * structure. In this case the 'utype' field + * has a special meaning, it is used as a mask + * of acceptable types using the B_ASN1 constants. + * + * NDEF_SEQUENCE is the same as SEQUENCE except + * that it will use indefinite length constructed + * encoding if requested. + * + */ + +#define ASN1_ITYPE_PRIMITIVE 0x0 +#define ASN1_ITYPE_SEQUENCE 0x1 +#define ASN1_ITYPE_CHOICE 0x2 +/* unused value 0x3 */ +#define ASN1_ITYPE_EXTERN 0x4 +#define ASN1_ITYPE_MSTRING 0x5 +#define ASN1_ITYPE_NDEF_SEQUENCE 0x6 + +/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */ +#define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)((iptr)())) + +/* Macros for start and end of ASN1_ITEM definition */ + +#define ASN1_ITEM_start(itname) \ + const ASN1_ITEM *itname##_it(void) \ + { \ + static const ASN1_ITEM local_it = { + +#define static_ASN1_ITEM_start(itname) \ + static ASN1_ITEM_start(itname) + +#define ASN1_ITEM_end(itname) \ + } \ + ; \ + return &local_it; \ + } + +/* Macros to aid ASN1 template writing */ + +#define ASN1_ITEM_TEMPLATE(tname) \ + static const ASN1_TEMPLATE tname##_item_tt + +#define ASN1_ITEM_TEMPLATE_END(tname) \ + ; \ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_PRIMITIVE, \ + -1, \ + &tname##_item_tt, \ + 0, \ + NULL, \ + 0, \ + #tname ASN1_ITEM_end(tname) +#define static_ASN1_ITEM_TEMPLATE_END(tname) \ + ; \ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_PRIMITIVE, \ + -1, \ + &tname##_item_tt, \ + 0, \ + NULL, \ + 0, \ + #tname ASN1_ITEM_end(tname) + +/* This is a ASN1 type which just embeds a template */ + +/*- + * This pair helps declare a SEQUENCE. We can do: + * + * ASN1_SEQUENCE(stname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END(stname) + * + * This will produce an ASN1_ITEM called stname_it + * for a structure called stname. + * + * If you want the same structure but a different + * name then use: + * + * ASN1_SEQUENCE(itname) = { + * ... SEQUENCE components ... + * } ASN1_SEQUENCE_END_name(stname, itname) + * + * This will create an item called itname_it using + * a structure called stname. + */ + +#define ASN1_SEQUENCE(tname) \ + static const ASN1_TEMPLATE tname##_seq_tt[] + +#define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname) + +#define static_ASN1_SEQUENCE_END(stname) static_ASN1_SEQUENCE_END_name(stname, stname) + +#define ASN1_SEQUENCE_END_name(stname, tname) \ + ; \ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE, \ + V_ASN1_SEQUENCE, \ + tname##_seq_tt, \ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE), \ + NULL, \ + sizeof(stname), \ + #tname ASN1_ITEM_end(tname) + +#define static_ASN1_SEQUENCE_END_name(stname, tname) \ + ; \ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE, \ + V_ASN1_SEQUENCE, \ + tname##_seq_tt, \ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE), \ + NULL, \ + sizeof(stname), \ + #stname ASN1_ITEM_end(tname) + +#define ASN1_NDEF_SEQUENCE(tname) \ + ASN1_SEQUENCE(tname) + +#define ASN1_NDEF_SEQUENCE_cb(tname, cb) \ + ASN1_SEQUENCE_cb(tname, cb) + +#define ASN1_SEQUENCE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = { NULL, 0, 0, 0, cb, 0, NULL }; \ + ASN1_SEQUENCE(tname) + +#define ASN1_SEQUENCE_const_cb(tname, const_cb) \ + static const ASN1_AUX tname##_aux = { NULL, ASN1_AFLG_CONST_CB, 0, 0, NULL, 0, const_cb }; \ + ASN1_SEQUENCE(tname) + +#define ASN1_SEQUENCE_cb_const_cb(tname, cb, const_cb) \ + static const ASN1_AUX tname##_aux = { NULL, ASN1_AFLG_CONST_CB, 0, 0, cb, 0, const_cb }; \ + ASN1_SEQUENCE(tname) + +#define ASN1_SEQUENCE_ref(tname, cb) \ + static const ASN1_AUX tname##_aux = { NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), offsetof(tname, lock), cb, 0, NULL }; \ + ASN1_SEQUENCE(tname) + +#define ASN1_SEQUENCE_enc(tname, enc, cb) \ + static const ASN1_AUX tname##_aux = { NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc), NULL }; \ + ASN1_SEQUENCE(tname) + +#define ASN1_NDEF_SEQUENCE_END(tname) \ + ; \ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE, \ + V_ASN1_SEQUENCE, \ + tname##_seq_tt, \ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE), \ + NULL, \ + sizeof(tname), \ + #tname ASN1_ITEM_end(tname) +#define static_ASN1_NDEF_SEQUENCE_END(tname) \ + ; \ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE, \ + V_ASN1_SEQUENCE, \ + tname##_seq_tt, \ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE), \ + NULL, \ + sizeof(tname), \ + #tname ASN1_ITEM_end(tname) + +#define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) + +#define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname) +#define static_ASN1_SEQUENCE_END_cb(stname, tname) static_ASN1_SEQUENCE_END_ref(stname, tname) + +#define ASN1_SEQUENCE_END_ref(stname, tname) \ + ; \ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE, \ + V_ASN1_SEQUENCE, \ + tname##_seq_tt, \ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE), \ + &tname##_aux, \ + sizeof(stname), \ + #tname ASN1_ITEM_end(tname) +#define static_ASN1_SEQUENCE_END_ref(stname, tname) \ + ; \ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_SEQUENCE, \ + V_ASN1_SEQUENCE, \ + tname##_seq_tt, \ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE), \ + &tname##_aux, \ + sizeof(stname), \ + #stname ASN1_ITEM_end(tname) + +#define ASN1_NDEF_SEQUENCE_END_cb(stname, tname) \ + ; \ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_NDEF_SEQUENCE, \ + V_ASN1_SEQUENCE, \ + tname##_seq_tt, \ + sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE), \ + &tname##_aux, \ + sizeof(stname), \ + #stname ASN1_ITEM_end(tname) + +/*- + * This pair helps declare a CHOICE type. We can do: + * + * ASN1_CHOICE(chname) = { + * ... CHOICE options ... + * ASN1_CHOICE_END(chname) + * + * This will produce an ASN1_ITEM called chname_it + * for a structure called chname. The structure + * definition must look like this: + * typedef struct { + * int type; + * union { + * ASN1_SOMETHING *opt1; + * ASN1_SOMEOTHER *opt2; + * } value; + * } chname; + * + * the name of the selector must be 'type'. + * to use an alternative selector name use the + * ASN1_CHOICE_END_selector() version. + */ + +#define ASN1_CHOICE(tname) \ + static const ASN1_TEMPLATE tname##_ch_tt[] + +#define ASN1_CHOICE_cb(tname, cb) \ + static const ASN1_AUX tname##_aux = { NULL, 0, 0, 0, cb, 0, NULL }; \ + ASN1_CHOICE(tname) + +#define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname) + +#define static_ASN1_CHOICE_END(stname) static_ASN1_CHOICE_END_name(stname, stname) + +#define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type) + +#define static_ASN1_CHOICE_END_name(stname, tname) static_ASN1_CHOICE_END_selector(stname, tname, type) + +#define ASN1_CHOICE_END_selector(stname, tname, selname) \ + ; \ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE, \ + offsetof(stname, selname), \ + tname##_ch_tt, \ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE), \ + NULL, \ + sizeof(stname), \ + #stname ASN1_ITEM_end(tname) + +#define static_ASN1_CHOICE_END_selector(stname, tname, selname) \ + ; \ + static_ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE, \ + offsetof(stname, selname), \ + tname##_ch_tt, \ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE), \ + NULL, \ + sizeof(stname), \ + #stname ASN1_ITEM_end(tname) + +#define ASN1_CHOICE_END_cb(stname, tname, selname) \ + ; \ + ASN1_ITEM_start(tname) \ + ASN1_ITYPE_CHOICE, \ + offsetof(stname, selname), \ + tname##_ch_tt, \ + sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE), \ + &tname##_aux, \ + sizeof(stname), \ + #stname ASN1_ITEM_end(tname) + +/* This helps with the template wrapper form of ASN1_ITEM */ + +#define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \ + (flags), (tag), 0, \ + #name, ASN1_ITEM_ref(type) \ +} + +/* These help with SEQUENCE or CHOICE components */ + +/* used to declare other types */ + +#define ASN1_EX_TYPE(flags, tag, stname, field, type) { \ + (flags), (tag), offsetof(stname, field), \ + #field, ASN1_ITEM_ref(type) \ +} + +/* implicit and explicit helper macros */ + +#define ASN1_IMP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | (ex), tag, stname, field, type) + +#define ASN1_EXP_EX(stname, field, type, tag, ex) \ + ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | (ex), tag, stname, field, type) + +/* Any defined by macros: the field used is in the table itself */ + +#define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb } +#define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb } + +/* Plain simple type */ +#define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0, 0, stname, field, type) +/* Embedded simple type */ +#define ASN1_EMBED(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_EMBED, 0, stname, field, type) + +/* OPTIONAL simple type */ +#define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type) +#define ASN1_OPT_EMBED(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL | ASN1_TFLG_EMBED, 0, stname, field, type) + +/* IMPLICIT tagged simple type */ +#define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0) +#define ASN1_IMP_EMBED(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_EMBED) + +/* IMPLICIT tagged OPTIONAL simple type */ +#define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) +#define ASN1_IMP_OPT_EMBED(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL | ASN1_TFLG_EMBED) + +/* Same as above but EXPLICIT */ + +#define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0) +#define ASN1_EXP_EMBED(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_EMBED) +#define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL) +#define ASN1_EXP_OPT_EMBED(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL | ASN1_TFLG_EMBED) + +/* SEQUENCE OF type */ +#define ASN1_SEQUENCE_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type) + +/* OPTIONAL SEQUENCE OF */ +#define ASN1_SEQUENCE_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Same as above but for SET OF */ + +#define ASN1_SET_OF(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type) + +#define ASN1_SET_OF_OPT(stname, field, type) \ + ASN1_EX_TYPE(ASN1_TFLG_SET_OF | ASN1_TFLG_OPTIONAL, 0, stname, field, type) + +/* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */ + +#define ASN1_IMP_SET_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +#define ASN1_EXP_SET_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF) + +#define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF | ASN1_TFLG_OPTIONAL) + +#define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF | ASN1_TFLG_OPTIONAL) + +#define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +#define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL) + +#define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF) + +#define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_OPTIONAL) + +/* EXPLICIT using indefinite length constructed form */ +#define ASN1_NDEF_EXP(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF) + +/* EXPLICIT OPTIONAL using indefinite length constructed form */ +#define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \ + ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL | ASN1_TFLG_NDEF) + +/* Macros for the ASN1_ADB structure */ + +#define ASN1_ADB(name) \ + static const ASN1_ADB_TABLE name##_adbtbl[] + +#define ASN1_ADB_END(name, flags, field, adb_cb, def, none) \ + ; \ + static const ASN1_ITEM *name##_adb(void) \ + { \ + static const ASN1_ADB internal_adb = { \ + flags, \ + offsetof(name, field), \ + adb_cb, \ + name##_adbtbl, \ + sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE), \ + def, \ + none \ + }; \ + return (const ASN1_ITEM *)&internal_adb; \ + } \ + void dummy_function(void) + +#define ADB_ENTRY(val, template) { val, template } + +#define ASN1_ADB_TEMPLATE(name) \ + static const ASN1_TEMPLATE name##_tt + +/* + * This is the ASN1 template structure that defines a wrapper round the + * actual type. It determines the actual position of the field in the value + * structure, various flags such as OPTIONAL and the field name. + */ + +struct ASN1_TEMPLATE_st { + unsigned long flags; /* Various flags */ + long tag; /* tag, not used if no tagging */ + unsigned long offset; /* Offset of this field in structure */ + const char *field_name; /* Field name */ + ASN1_ITEM_EXP *item; /* Relevant ASN1_ITEM or ASN1_ADB */ +}; + +/* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */ + +#define ASN1_TEMPLATE_item(t) (t->item_ptr) +#define ASN1_TEMPLATE_adb(t) (t->item_ptr) + +typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE; +typedef struct ASN1_ADB_st ASN1_ADB; + +struct ASN1_ADB_st { + unsigned long flags; /* Various flags */ + unsigned long offset; /* Offset of selector field */ + int (*adb_cb)(long *psel); /* Application callback */ + const ASN1_ADB_TABLE *tbl; /* Table of possible types */ + long tblcount; /* Number of entries in tbl */ + const ASN1_TEMPLATE *default_tt; /* Type to use if no match */ + const ASN1_TEMPLATE *null_tt; /* Type to use if selector is NULL */ +}; + +struct ASN1_ADB_TABLE_st { + long value; /* NID for an object or value for an int */ + const ASN1_TEMPLATE tt; /* item for this value */ +}; + +/* template flags */ + +/* Field is optional */ +#define ASN1_TFLG_OPTIONAL (0x1) + +/* Field is a SET OF */ +#define ASN1_TFLG_SET_OF (0x1 << 1) + +/* Field is a SEQUENCE OF */ +#define ASN1_TFLG_SEQUENCE_OF (0x2 << 1) + +/* + * Special case: this refers to a SET OF that will be sorted into DER order + * when encoded *and* the corresponding STACK will be modified to match the + * new order. + */ +#define ASN1_TFLG_SET_ORDER (0x3 << 1) + +/* Mask for SET OF or SEQUENCE OF */ +#define ASN1_TFLG_SK_MASK (0x3 << 1) + +/* + * These flags mean the tag should be taken from the tag field. If EXPLICIT + * then the underlying type is used for the inner tag. + */ + +/* IMPLICIT tagging */ +#define ASN1_TFLG_IMPTAG (0x1 << 3) + +/* EXPLICIT tagging, inner tag from underlying type */ +#define ASN1_TFLG_EXPTAG (0x2 << 3) + +#define ASN1_TFLG_TAG_MASK (0x3 << 3) + +/* context specific IMPLICIT */ +#define ASN1_TFLG_IMPLICIT (ASN1_TFLG_IMPTAG | ASN1_TFLG_CONTEXT) + +/* context specific EXPLICIT */ +#define ASN1_TFLG_EXPLICIT (ASN1_TFLG_EXPTAG | ASN1_TFLG_CONTEXT) + +/* + * If tagging is in force these determine the type of tag to use. Otherwise + * the tag is determined by the underlying type. These values reflect the + * actual octet format. + */ + +/* Universal tag */ +#define ASN1_TFLG_UNIVERSAL (0x0 << 6) +/* Application tag */ +#define ASN1_TFLG_APPLICATION (0x1 << 6) +/* Context specific tag */ +#define ASN1_TFLG_CONTEXT (0x2 << 6) +/* Private tag */ +#define ASN1_TFLG_PRIVATE (0x3 << 6) + +#define ASN1_TFLG_TAG_CLASS (0x3 << 6) + +/* + * These are for ANY DEFINED BY type. In this case the 'item' field points to + * an ASN1_ADB structure which contains a table of values to decode the + * relevant type + */ + +#define ASN1_TFLG_ADB_MASK (0x3 << 8) + +#define ASN1_TFLG_ADB_OID (0x1 << 8) + +#define ASN1_TFLG_ADB_INT (0x1 << 9) + +/* + * This flag when present in a SEQUENCE OF, SET OF or EXPLICIT causes + * indefinite length constructed encoding to be used if required. + */ + +#define ASN1_TFLG_NDEF (0x1 << 11) + +/* Field is embedded and not a pointer */ +#define ASN1_TFLG_EMBED (0x1 << 12) + +/* This is the actual ASN1 item itself */ + +struct ASN1_ITEM_st { + char itype; /* The item type, primitive, SEQUENCE, CHOICE + * or extern */ + long utype; /* underlying type */ + const ASN1_TEMPLATE *templates; /* If SEQUENCE or CHOICE this contains + * the contents */ + long tcount; /* Number of templates if SEQUENCE or CHOICE */ + const void *funcs; /* further data and type-specific functions */ + /* funcs can be ASN1_PRIMITIVE_FUNCS*, ASN1_EXTERN_FUNCS*, or ASN1_AUX* */ + long size; /* Structure size (usually) */ + const char *sname; /* Structure name */ +}; + +/* + * Cache for ASN1 tag and length, so we don't keep re-reading it for things + * like CHOICE + */ + +struct ASN1_TLC_st { + char valid; /* Values below are valid */ + int ret; /* return value */ + long plen; /* length */ + int ptag; /* class value */ + int pclass; /* class value */ + int hdrlen; /* header length */ +}; + +/* Typedefs for ASN1 function pointers */ +typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx); + +typedef int ASN1_ex_d2i_ex(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx, OSSL_LIB_CTX *libctx, + const char *propq); +typedef int ASN1_ex_i2d(const ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it, int tag, int aclass); +typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it); +typedef int ASN1_ex_new_ex_func(ASN1_VALUE **pval, const ASN1_ITEM *it, + OSSL_LIB_CTX *libctx, const char *propq); +typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it); + +typedef int ASN1_ex_print_func(BIO *out, const ASN1_VALUE **pval, + int indent, const char *fname, + const ASN1_PCTX *pctx); + +typedef int ASN1_primitive_i2c(const ASN1_VALUE **pval, unsigned char *cont, + int *putype, const ASN1_ITEM *it); +typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, + int len, int utype, char *free_cont, + const ASN1_ITEM *it); +typedef int ASN1_primitive_print(BIO *out, const ASN1_VALUE **pval, + const ASN1_ITEM *it, int indent, + const ASN1_PCTX *pctx); + +typedef struct ASN1_EXTERN_FUNCS_st { + void *app_data; + ASN1_ex_new_func *asn1_ex_new; + ASN1_ex_free_func *asn1_ex_free; + ASN1_ex_free_func *asn1_ex_clear; + ASN1_ex_d2i *asn1_ex_d2i; + ASN1_ex_i2d *asn1_ex_i2d; + ASN1_ex_print_func *asn1_ex_print; + ASN1_ex_new_ex_func *asn1_ex_new_ex; + ASN1_ex_d2i_ex *asn1_ex_d2i_ex; +} ASN1_EXTERN_FUNCS; + +typedef struct ASN1_PRIMITIVE_FUNCS_st { + void *app_data; + unsigned long flags; + ASN1_ex_new_func *prim_new; + ASN1_ex_free_func *prim_free; + ASN1_ex_free_func *prim_clear; + ASN1_primitive_c2i *prim_c2i; + ASN1_primitive_i2c *prim_i2c; + ASN1_primitive_print *prim_print; +} ASN1_PRIMITIVE_FUNCS; + +/* + * This is the ASN1_AUX structure: it handles various miscellaneous + * requirements. For example the use of reference counts and an informational + * callback. The "informational callback" is called at various points during + * the ASN1 encoding and decoding. It can be used to provide minor + * customisation of the structures used. This is most useful where the + * supplied routines *almost* do the right thing but need some extra help at + * a few points. If the callback returns zero then it is assumed a fatal + * error has occurred and the main operation should be abandoned. If major + * changes in the default behaviour are required then an external type is + * more appropriate. + * For the operations ASN1_OP_I2D_PRE, ASN1_OP_I2D_POST, ASN1_OP_PRINT_PRE, and + * ASN1_OP_PRINT_POST, meanwhile a variant of the callback with const parameter + * 'in' is provided to make clear statically that its input is not modified. If + * and only if this variant is in use the flag ASN1_AFLG_CONST_CB must be set. + */ + +typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it, + void *exarg); +typedef int ASN1_aux_const_cb(int operation, const ASN1_VALUE **in, + const ASN1_ITEM *it, void *exarg); + +typedef struct ASN1_AUX_st { + void *app_data; + int flags; + int ref_offset; /* Offset of reference value */ + int ref_lock; /* Offset of lock value */ + ASN1_aux_cb *asn1_cb; + int enc_offset; /* Offset of ASN1_ENCODING structure */ + ASN1_aux_const_cb *asn1_const_cb; /* for ASN1_OP_I2D_ and ASN1_OP_PRINT_ */ +} ASN1_AUX; + +/* For print related callbacks exarg points to this structure */ +typedef struct ASN1_PRINT_ARG_st { + BIO *out; + int indent; + const ASN1_PCTX *pctx; +} ASN1_PRINT_ARG; + +/* For streaming related callbacks exarg points to this structure */ +typedef struct ASN1_STREAM_ARG_st { + /* BIO to stream through */ + BIO *out; + /* BIO with filters appended */ + BIO *ndef_bio; + /* Streaming I/O boundary */ + unsigned char **boundary; +} ASN1_STREAM_ARG; + +/* Flags in ASN1_AUX */ + +/* Use a reference count */ +#define ASN1_AFLG_REFCOUNT 1 +/* Save the encoding of structure (useful for signatures) */ +#define ASN1_AFLG_ENCODING 2 +/* The Sequence length is invalid */ +#define ASN1_AFLG_BROKEN 4 +/* Use the new asn1_const_cb */ +#define ASN1_AFLG_CONST_CB 8 + +/* operation values for asn1_cb */ + +#define ASN1_OP_NEW_PRE 0 +#define ASN1_OP_NEW_POST 1 +#define ASN1_OP_FREE_PRE 2 +#define ASN1_OP_FREE_POST 3 +#define ASN1_OP_D2I_PRE 4 +#define ASN1_OP_D2I_POST 5 +#define ASN1_OP_I2D_PRE 6 +#define ASN1_OP_I2D_POST 7 +#define ASN1_OP_PRINT_PRE 8 +#define ASN1_OP_PRINT_POST 9 +#define ASN1_OP_STREAM_PRE 10 +#define ASN1_OP_STREAM_POST 11 +#define ASN1_OP_DETACHED_PRE 12 +#define ASN1_OP_DETACHED_POST 13 +#define ASN1_OP_DUP_PRE 14 +#define ASN1_OP_DUP_POST 15 +#define ASN1_OP_GET0_LIBCTX 16 +#define ASN1_OP_GET0_PROPQ 17 + +/* Macro to implement a primitive type */ +#define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0) +#define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_PRIMITIVE, \ + V_##vname, NULL, 0, NULL, ex, #itname ASN1_ITEM_end(itname) + +/* Macro to implement a multi string type */ +#define IMPLEMENT_ASN1_MSTRING(itname, mask) \ + ASN1_ITEM_start(itname) \ + ASN1_ITYPE_MSTRING, \ + mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname ASN1_ITEM_end(itname) + +#define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \ + ASN1_ITEM_start(sname) \ + ASN1_ITYPE_EXTERN, \ + tag, \ + NULL, \ + 0, \ + &fptrs, \ + 0, \ + #sname ASN1_ITEM_end(sname) + +/* Macro to implement standard functions in terms of ASN1_ITEM structures */ + +#define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname) + +#define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname) + +#define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \ + IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname) + +#define IMPLEMENT_STATIC_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(static, stname, stname, stname) + +#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname) + +#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_pfname(pre, stname, itname, fname) \ + pre stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + pre void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \ + stname *fname##_new(void) \ + { \ + return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \ + } \ + void fname##_free(stname *a) \ + { \ + ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \ + } + +#define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) + +#define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \ + stname *d2i_##fname(stname **a, const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname)); \ + } \ + int i2d_##fname(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((const ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname)); \ + } + +#define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \ + int i2d_##stname##_NDEF(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_ndef_i2d((const ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname)); \ + } + +#define IMPLEMENT_STATIC_ASN1_ENCODE_FUNCTIONS(stname) \ + static stname *d2i_##stname(stname **a, \ + const unsigned char **in, long len) \ + { \ + return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, \ + ASN1_ITEM_rptr(stname)); \ + } \ + static int i2d_##stname(const stname *a, unsigned char **out) \ + { \ + return ASN1_item_i2d((const ASN1_VALUE *)a, out, \ + ASN1_ITEM_rptr(stname)); \ + } + +#define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \ + stname *stname##_dup(const stname *x) \ + { \ + return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \ + } + +#define IMPLEMENT_ASN1_PRINT_FUNCTION(stname) \ + IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, stname, stname) + +#define IMPLEMENT_ASN1_PRINT_FUNCTION_fname(stname, itname, fname) \ + int fname##_print_ctx(BIO *out, const stname *x, int indent, \ + const ASN1_PCTX *pctx) \ + { \ + return ASN1_item_print(out, (const ASN1_VALUE *)x, indent, \ + ASN1_ITEM_rptr(itname), pctx); \ + } + +/* external definitions for primitive types */ + +DECLARE_ASN1_ITEM(ASN1_BOOLEAN) +DECLARE_ASN1_ITEM(ASN1_TBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_FBOOLEAN) +DECLARE_ASN1_ITEM(ASN1_SEQUENCE) +DECLARE_ASN1_ITEM(CBIGNUM) +DECLARE_ASN1_ITEM(BIGNUM) +DECLARE_ASN1_ITEM(INT32) +DECLARE_ASN1_ITEM(ZINT32) +DECLARE_ASN1_ITEM(UINT32) +DECLARE_ASN1_ITEM(ZUINT32) +DECLARE_ASN1_ITEM(INT64) +DECLARE_ASN1_ITEM(ZINT64) +DECLARE_ASN1_ITEM(UINT64) +DECLARE_ASN1_ITEM(ZUINT64) + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +/* + * LONG and ZLONG are strongly discouraged for use as stored data, as the + * underlying C type (long) differs in size depending on the architecture. + * They are designed with 32-bit longs in mind. + */ +DECLARE_ASN1_ITEM(LONG) +DECLARE_ASN1_ITEM(ZLONG) +#endif + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_VALUE, ASN1_VALUE, ASN1_VALUE) +#define sk_ASN1_VALUE_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_value(sk, idx) ((ASN1_VALUE *)OPENSSL_sk_value(ossl_check_const_ASN1_VALUE_sk_type(sk), (idx))) +#define sk_ASN1_VALUE_new(cmp) ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_new(ossl_check_ASN1_VALUE_compfunc_type(cmp))) +#define sk_ASN1_VALUE_new_null() ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_new_null()) +#define sk_ASN1_VALUE_new_reserve(cmp, n) ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_VALUE_compfunc_type(cmp), (n))) +#define sk_ASN1_VALUE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_VALUE_sk_type(sk), (n)) +#define sk_ASN1_VALUE_free(sk) OPENSSL_sk_free(ossl_check_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_delete(sk, i) ((ASN1_VALUE *)OPENSSL_sk_delete(ossl_check_ASN1_VALUE_sk_type(sk), (i))) +#define sk_ASN1_VALUE_delete_ptr(sk, ptr) ((ASN1_VALUE *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr))) +#define sk_ASN1_VALUE_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr)) +#define sk_ASN1_VALUE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr)) +#define sk_ASN1_VALUE_pop(sk) ((ASN1_VALUE *)OPENSSL_sk_pop(ossl_check_ASN1_VALUE_sk_type(sk))) +#define sk_ASN1_VALUE_shift(sk) ((ASN1_VALUE *)OPENSSL_sk_shift(ossl_check_ASN1_VALUE_sk_type(sk))) +#define sk_ASN1_VALUE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_VALUE_sk_type(sk),ossl_check_ASN1_VALUE_freefunc_type(freefunc)) +#define sk_ASN1_VALUE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr), (idx)) +#define sk_ASN1_VALUE_set(sk, idx, ptr) ((ASN1_VALUE *)OPENSSL_sk_set(ossl_check_ASN1_VALUE_sk_type(sk), (idx), ossl_check_ASN1_VALUE_type(ptr))) +#define sk_ASN1_VALUE_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr)) +#define sk_ASN1_VALUE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr)) +#define sk_ASN1_VALUE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_type(ptr), pnum) +#define sk_ASN1_VALUE_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_VALUE_sk_type(sk)) +#define sk_ASN1_VALUE_dup(sk) ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_dup(ossl_check_const_ASN1_VALUE_sk_type(sk))) +#define sk_ASN1_VALUE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_VALUE) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_copyfunc_type(copyfunc), ossl_check_ASN1_VALUE_freefunc_type(freefunc))) +#define sk_ASN1_VALUE_set_cmp_func(sk, cmp) ((sk_ASN1_VALUE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_VALUE_sk_type(sk), ossl_check_ASN1_VALUE_compfunc_type(cmp))) + +/* clang-format on */ + +/* Functions used internally by the ASN1 code */ + +int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it); +void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it); + +int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, + const ASN1_ITEM *it, int tag, int aclass, char opt, + ASN1_TLC *ctx); + +int ASN1_item_ex_i2d(const ASN1_VALUE **pval, unsigned char **out, + const ASN1_ITEM *it, int tag, int aclass); + +/* Legacy compatibility */ +#define IMPLEMENT_ASN1_FUNCTIONS_const(name) IMPLEMENT_ASN1_FUNCTIONS(name) +#define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \ + IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/bio.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/bio.h new file mode 100644 index 000000000000..f87990019926 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/bio.h @@ -0,0 +1,1028 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/bio.h.in + * + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_BIO_H +#define OPENSSL_BIO_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_BIO_H +#endif + +#include + +#ifndef OPENSSL_NO_STDIO +#include +#endif +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* There are the classes of BIOs */ +#define BIO_TYPE_DESCRIPTOR 0x0100 /* socket, fd, connect or accept */ +#define BIO_TYPE_FILTER 0x0200 +#define BIO_TYPE_SOURCE_SINK 0x0400 + +/* These are the 'types' of BIOs */ +#define BIO_TYPE_NONE 0 +#define BIO_TYPE_MEM (1 | BIO_TYPE_SOURCE_SINK) +#define BIO_TYPE_FILE (2 | BIO_TYPE_SOURCE_SINK) + +#define BIO_TYPE_FD (4 | BIO_TYPE_SOURCE_SINK | BIO_TYPE_DESCRIPTOR) +#define BIO_TYPE_SOCKET (5 | BIO_TYPE_SOURCE_SINK | BIO_TYPE_DESCRIPTOR) +#define BIO_TYPE_NULL (6 | BIO_TYPE_SOURCE_SINK) +#define BIO_TYPE_SSL (7 | BIO_TYPE_FILTER) +#define BIO_TYPE_MD (8 | BIO_TYPE_FILTER) +#define BIO_TYPE_BUFFER (9 | BIO_TYPE_FILTER) +#define BIO_TYPE_CIPHER (10 | BIO_TYPE_FILTER) +#define BIO_TYPE_BASE64 (11 | BIO_TYPE_FILTER) +#define BIO_TYPE_CONNECT (12 | BIO_TYPE_SOURCE_SINK | BIO_TYPE_DESCRIPTOR) +#define BIO_TYPE_ACCEPT (13 | BIO_TYPE_SOURCE_SINK | BIO_TYPE_DESCRIPTOR) + +#define BIO_TYPE_NBIO_TEST (16 | BIO_TYPE_FILTER) /* server proxy BIO */ +#define BIO_TYPE_NULL_FILTER (17 | BIO_TYPE_FILTER) +#define BIO_TYPE_BIO (19 | BIO_TYPE_SOURCE_SINK) /* half a BIO pair */ +#define BIO_TYPE_LINEBUFFER (20 | BIO_TYPE_FILTER) +#define BIO_TYPE_DGRAM (21 | BIO_TYPE_SOURCE_SINK | BIO_TYPE_DESCRIPTOR) +#define BIO_TYPE_ASN1 (22 | BIO_TYPE_FILTER) +#define BIO_TYPE_COMP (23 | BIO_TYPE_FILTER) +#ifndef OPENSSL_NO_SCTP +#define BIO_TYPE_DGRAM_SCTP (24 | BIO_TYPE_SOURCE_SINK | BIO_TYPE_DESCRIPTOR) +#endif +#define BIO_TYPE_CORE_TO_PROV (25 | BIO_TYPE_SOURCE_SINK) +#define BIO_TYPE_DGRAM_PAIR (26 | BIO_TYPE_SOURCE_SINK) +#define BIO_TYPE_DGRAM_MEM (27 | BIO_TYPE_SOURCE_SINK) + +/* Custom type starting index returned by BIO_get_new_index() */ +#define BIO_TYPE_START 128 +/* Custom type maximum index that can be returned by BIO_get_new_index() */ +#define BIO_TYPE_MASK 0xFF + +/* + * BIO_FILENAME_READ|BIO_CLOSE to open or close on free. + * BIO_set_fp(in,stdin,BIO_NOCLOSE); + */ +#define BIO_NOCLOSE 0x00 +#define BIO_CLOSE 0x01 + +/* + * These are used in the following macros and are passed to BIO_ctrl() + */ +#define BIO_CTRL_RESET 1 /* opt - rewind/zero etc */ +#define BIO_CTRL_EOF 2 /* opt - are we at the eof */ +#define BIO_CTRL_INFO 3 /* opt - extra tit-bits */ +#define BIO_CTRL_SET 4 /* man - set the 'IO' type */ +#define BIO_CTRL_GET 5 /* man - get the 'IO' type */ +#define BIO_CTRL_PUSH 6 /* opt - internal, used to signify change */ +#define BIO_CTRL_POP 7 /* opt - internal, used to signify change */ +#define BIO_CTRL_GET_CLOSE 8 /* man - set the 'close' on free */ +#define BIO_CTRL_SET_CLOSE 9 /* man - set the 'close' on free */ +#define BIO_CTRL_PENDING 10 /* opt - is their more data buffered */ +#define BIO_CTRL_FLUSH 11 /* opt - 'flush' buffered output */ +#define BIO_CTRL_DUP 12 /* man - extra stuff for 'duped' BIO */ +#define BIO_CTRL_WPENDING 13 /* opt - number of bytes still to write */ +#define BIO_CTRL_SET_CALLBACK 14 /* opt - set callback function */ +#define BIO_CTRL_GET_CALLBACK 15 /* opt - set callback function */ + +#define BIO_CTRL_PEEK 29 /* BIO_f_buffer special */ +#define BIO_CTRL_SET_FILENAME 30 /* BIO_s_file special */ + +/* dgram BIO stuff */ +#define BIO_CTRL_DGRAM_CONNECT 31 /* BIO dgram special */ +#define BIO_CTRL_DGRAM_SET_CONNECTED 32 /* allow for an externally connected \ + * socket to be passed in */ +#define BIO_CTRL_DGRAM_SET_RECV_TIMEOUT 33 /* setsockopt, essentially */ +#define BIO_CTRL_DGRAM_GET_RECV_TIMEOUT 34 /* getsockopt, essentially */ +#define BIO_CTRL_DGRAM_SET_SEND_TIMEOUT 35 /* setsockopt, essentially */ +#define BIO_CTRL_DGRAM_GET_SEND_TIMEOUT 36 /* getsockopt, essentially */ + +#define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37 /* flag whether the last */ +#define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38 /* I/O operation timed out */ + +/* #ifdef IP_MTU_DISCOVER */ +#define BIO_CTRL_DGRAM_MTU_DISCOVER 39 /* set DF bit on egress packets */ +/* #endif */ + +#define BIO_CTRL_DGRAM_QUERY_MTU 40 /* as kernel for current MTU */ +#define BIO_CTRL_DGRAM_GET_FALLBACK_MTU 47 +#define BIO_CTRL_DGRAM_GET_MTU 41 /* get cached value for MTU */ +#define BIO_CTRL_DGRAM_SET_MTU 42 /* set cached value for MTU. \ + * want to use this if asking \ + * the kernel fails */ + +#define BIO_CTRL_DGRAM_MTU_EXCEEDED 43 /* check whether the MTU was \ + * exceed in the previous write \ + * operation */ + +#define BIO_CTRL_DGRAM_GET_PEER 46 +#define BIO_CTRL_DGRAM_SET_PEER 44 /* Destination for the data */ + +#define BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT 45 /* Next DTLS handshake timeout \ + * to adjust socket timeouts */ +#define BIO_CTRL_DGRAM_SET_DONT_FRAG 48 + +#define BIO_CTRL_DGRAM_GET_MTU_OVERHEAD 49 + +/* Deliberately outside of OPENSSL_NO_SCTP - used in bss_dgram.c */ +#define BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE 50 +#ifndef OPENSSL_NO_SCTP +/* SCTP stuff */ +#define BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY 51 +#define BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY 52 +#define BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD 53 +#define BIO_CTRL_DGRAM_SCTP_GET_SNDINFO 60 +#define BIO_CTRL_DGRAM_SCTP_SET_SNDINFO 61 +#define BIO_CTRL_DGRAM_SCTP_GET_RCVINFO 62 +#define BIO_CTRL_DGRAM_SCTP_SET_RCVINFO 63 +#define BIO_CTRL_DGRAM_SCTP_GET_PRINFO 64 +#define BIO_CTRL_DGRAM_SCTP_SET_PRINFO 65 +#define BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN 70 +#endif + +#define BIO_CTRL_DGRAM_SET_PEEK_MODE 71 + +/* + * internal BIO: + * # define BIO_CTRL_SET_KTLS_SEND 72 + * # define BIO_CTRL_SET_KTLS_SEND_CTRL_MSG 74 + * # define BIO_CTRL_CLEAR_KTLS_CTRL_MSG 75 + */ + +#define BIO_CTRL_GET_KTLS_SEND 73 +#define BIO_CTRL_GET_KTLS_RECV 76 + +#define BIO_CTRL_DGRAM_SCTP_WAIT_FOR_DRY 77 +#define BIO_CTRL_DGRAM_SCTP_MSG_WAITING 78 + +/* BIO_f_prefix controls */ +#define BIO_CTRL_SET_PREFIX 79 +#define BIO_CTRL_SET_INDENT 80 +#define BIO_CTRL_GET_INDENT 81 + +#define BIO_CTRL_DGRAM_GET_LOCAL_ADDR_CAP 82 +#define BIO_CTRL_DGRAM_GET_LOCAL_ADDR_ENABLE 83 +#define BIO_CTRL_DGRAM_SET_LOCAL_ADDR_ENABLE 84 +#define BIO_CTRL_DGRAM_GET_EFFECTIVE_CAPS 85 +#define BIO_CTRL_DGRAM_GET_CAPS 86 +#define BIO_CTRL_DGRAM_SET_CAPS 87 +#define BIO_CTRL_DGRAM_GET_NO_TRUNC 88 +#define BIO_CTRL_DGRAM_SET_NO_TRUNC 89 + +/* + * internal BIO: + * # define BIO_CTRL_SET_KTLS_TX_ZEROCOPY_SENDFILE 90 + */ + +#define BIO_CTRL_GET_RPOLL_DESCRIPTOR 91 +#define BIO_CTRL_GET_WPOLL_DESCRIPTOR 92 +#define BIO_CTRL_DGRAM_DETECT_PEER_ADDR 93 +#define BIO_CTRL_DGRAM_SET0_LOCAL_ADDR 94 + +#define BIO_DGRAM_CAP_NONE 0U +#define BIO_DGRAM_CAP_HANDLES_SRC_ADDR (1U << 0) +#define BIO_DGRAM_CAP_HANDLES_DST_ADDR (1U << 1) +#define BIO_DGRAM_CAP_PROVIDES_SRC_ADDR (1U << 2) +#define BIO_DGRAM_CAP_PROVIDES_DST_ADDR (1U << 3) + +#ifndef OPENSSL_NO_KTLS +#define BIO_get_ktls_send(b) \ + (BIO_ctrl(b, BIO_CTRL_GET_KTLS_SEND, 0, NULL) > 0) +#define BIO_get_ktls_recv(b) \ + (BIO_ctrl(b, BIO_CTRL_GET_KTLS_RECV, 0, NULL) > 0) +#else +#define BIO_get_ktls_send(b) (0) +#define BIO_get_ktls_recv(b) (0) +#endif + +/* modifiers */ +#define BIO_FP_READ 0x02 +#define BIO_FP_WRITE 0x04 +#define BIO_FP_APPEND 0x08 +#define BIO_FP_TEXT 0x10 + +#define BIO_FLAGS_READ 0x01 +#define BIO_FLAGS_WRITE 0x02 +#define BIO_FLAGS_IO_SPECIAL 0x04 +#define BIO_FLAGS_RWS (BIO_FLAGS_READ | BIO_FLAGS_WRITE | BIO_FLAGS_IO_SPECIAL) +#define BIO_FLAGS_SHOULD_RETRY 0x08 +#ifndef OPENSSL_NO_DEPRECATED_3_0 +/* This #define was replaced by an internal constant and should not be used. */ +#define BIO_FLAGS_UPLINK 0 +#endif + +#define BIO_FLAGS_BASE64_NO_NL 0x100 + +/* + * This is used with memory BIOs: + * BIO_FLAGS_MEM_RDONLY means we shouldn't free up or change the data in any way; + * BIO_FLAGS_NONCLEAR_RST means we shouldn't clear data on reset. + */ +#define BIO_FLAGS_MEM_RDONLY 0x200 +#define BIO_FLAGS_NONCLEAR_RST 0x400 +#define BIO_FLAGS_IN_EOF 0x800 + +/* the BIO FLAGS values 0x1000 to 0x8000 are reserved for internal KTLS flags */ + +typedef union bio_addr_st BIO_ADDR; +typedef struct bio_addrinfo_st BIO_ADDRINFO; + +int BIO_get_new_index(void); +void BIO_set_flags(BIO *b, int flags); +int BIO_test_flags(const BIO *b, int flags); +void BIO_clear_flags(BIO *b, int flags); + +#define BIO_get_flags(b) BIO_test_flags(b, ~(0x0)) +#define BIO_set_retry_special(b) \ + BIO_set_flags(b, (BIO_FLAGS_IO_SPECIAL | BIO_FLAGS_SHOULD_RETRY)) +#define BIO_set_retry_read(b) \ + BIO_set_flags(b, (BIO_FLAGS_READ | BIO_FLAGS_SHOULD_RETRY)) +#define BIO_set_retry_write(b) \ + BIO_set_flags(b, (BIO_FLAGS_WRITE | BIO_FLAGS_SHOULD_RETRY)) + +/* These are normally used internally in BIOs */ +#define BIO_clear_retry_flags(b) \ + BIO_clear_flags(b, (BIO_FLAGS_RWS | BIO_FLAGS_SHOULD_RETRY)) +#define BIO_get_retry_flags(b) \ + BIO_test_flags(b, (BIO_FLAGS_RWS | BIO_FLAGS_SHOULD_RETRY)) + +/* These should be used by the application to tell why we should retry */ +#define BIO_should_read(a) BIO_test_flags(a, BIO_FLAGS_READ) +#define BIO_should_write(a) BIO_test_flags(a, BIO_FLAGS_WRITE) +#define BIO_should_io_special(a) BIO_test_flags(a, BIO_FLAGS_IO_SPECIAL) +#define BIO_retry_type(a) BIO_test_flags(a, BIO_FLAGS_RWS) +#define BIO_should_retry(a) BIO_test_flags(a, BIO_FLAGS_SHOULD_RETRY) + +/* + * The next three are used in conjunction with the BIO_should_io_special() + * condition. After this returns true, BIO *BIO_get_retry_BIO(BIO *bio, int + * *reason); will walk the BIO stack and return the 'reason' for the special + * and the offending BIO. Given a BIO, BIO_get_retry_reason(bio) will return + * the code. + */ +/* + * Returned from the SSL bio when the certificate retrieval code had an error + */ +#define BIO_RR_SSL_X509_LOOKUP 0x01 +/* Returned from the connect BIO when a connect would have blocked */ +#define BIO_RR_CONNECT 0x02 +/* Returned from the accept BIO when an accept would have blocked */ +#define BIO_RR_ACCEPT 0x03 + +/* These are passed by the BIO callback */ +#define BIO_CB_FREE 0x01 +#define BIO_CB_READ 0x02 +#define BIO_CB_WRITE 0x03 +#define BIO_CB_PUTS 0x04 +#define BIO_CB_GETS 0x05 +#define BIO_CB_CTRL 0x06 +#define BIO_CB_RECVMMSG 0x07 +#define BIO_CB_SENDMMSG 0x08 + +/* + * The callback is called before and after the underling operation, The + * BIO_CB_RETURN flag indicates if it is after the call + */ +#define BIO_CB_RETURN 0x80 +#define BIO_CB_return(a) ((a) | BIO_CB_RETURN) +#define BIO_cb_pre(a) (!((a) & BIO_CB_RETURN)) +#define BIO_cb_post(a) ((a) & BIO_CB_RETURN) + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +typedef long (*BIO_callback_fn)(BIO *b, int oper, const char *argp, int argi, + long argl, long ret); +OSSL_DEPRECATEDIN_3_0 BIO_callback_fn BIO_get_callback(const BIO *b); +OSSL_DEPRECATEDIN_3_0 void BIO_set_callback(BIO *b, BIO_callback_fn callback); +OSSL_DEPRECATEDIN_3_0 long BIO_debug_callback(BIO *bio, int cmd, + const char *argp, int argi, + long argl, long ret); +#endif + +typedef long (*BIO_callback_fn_ex)(BIO *b, int oper, const char *argp, + size_t len, int argi, + long argl, int ret, size_t *processed); +BIO_callback_fn_ex BIO_get_callback_ex(const BIO *b); +void BIO_set_callback_ex(BIO *b, BIO_callback_fn_ex callback); +long BIO_debug_callback_ex(BIO *bio, int oper, const char *argp, size_t len, + int argi, long argl, int ret, size_t *processed); + +char *BIO_get_callback_arg(const BIO *b); +void BIO_set_callback_arg(BIO *b, char *arg); + +typedef struct bio_method_st BIO_METHOD; + +const char *BIO_method_name(const BIO *b); +int BIO_method_type(const BIO *b); + +typedef int BIO_info_cb(BIO *, int, int); +typedef BIO_info_cb bio_info_cb; /* backward compatibility */ + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(BIO, BIO, BIO) +#define sk_BIO_num(sk) OPENSSL_sk_num(ossl_check_const_BIO_sk_type(sk)) +#define sk_BIO_value(sk, idx) ((BIO *)OPENSSL_sk_value(ossl_check_const_BIO_sk_type(sk), (idx))) +#define sk_BIO_new(cmp) ((STACK_OF(BIO) *)OPENSSL_sk_new(ossl_check_BIO_compfunc_type(cmp))) +#define sk_BIO_new_null() ((STACK_OF(BIO) *)OPENSSL_sk_new_null()) +#define sk_BIO_new_reserve(cmp, n) ((STACK_OF(BIO) *)OPENSSL_sk_new_reserve(ossl_check_BIO_compfunc_type(cmp), (n))) +#define sk_BIO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_BIO_sk_type(sk), (n)) +#define sk_BIO_free(sk) OPENSSL_sk_free(ossl_check_BIO_sk_type(sk)) +#define sk_BIO_zero(sk) OPENSSL_sk_zero(ossl_check_BIO_sk_type(sk)) +#define sk_BIO_delete(sk, i) ((BIO *)OPENSSL_sk_delete(ossl_check_BIO_sk_type(sk), (i))) +#define sk_BIO_delete_ptr(sk, ptr) ((BIO *)OPENSSL_sk_delete_ptr(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr))) +#define sk_BIO_push(sk, ptr) OPENSSL_sk_push(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr)) +#define sk_BIO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr)) +#define sk_BIO_pop(sk) ((BIO *)OPENSSL_sk_pop(ossl_check_BIO_sk_type(sk))) +#define sk_BIO_shift(sk) ((BIO *)OPENSSL_sk_shift(ossl_check_BIO_sk_type(sk))) +#define sk_BIO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_BIO_sk_type(sk),ossl_check_BIO_freefunc_type(freefunc)) +#define sk_BIO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr), (idx)) +#define sk_BIO_set(sk, idx, ptr) ((BIO *)OPENSSL_sk_set(ossl_check_BIO_sk_type(sk), (idx), ossl_check_BIO_type(ptr))) +#define sk_BIO_find(sk, ptr) OPENSSL_sk_find(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr)) +#define sk_BIO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr)) +#define sk_BIO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_BIO_sk_type(sk), ossl_check_BIO_type(ptr), pnum) +#define sk_BIO_sort(sk) OPENSSL_sk_sort(ossl_check_BIO_sk_type(sk)) +#define sk_BIO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_BIO_sk_type(sk)) +#define sk_BIO_dup(sk) ((STACK_OF(BIO) *)OPENSSL_sk_dup(ossl_check_const_BIO_sk_type(sk))) +#define sk_BIO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(BIO) *)OPENSSL_sk_deep_copy(ossl_check_const_BIO_sk_type(sk), ossl_check_BIO_copyfunc_type(copyfunc), ossl_check_BIO_freefunc_type(freefunc))) +#define sk_BIO_set_cmp_func(sk, cmp) ((sk_BIO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_BIO_sk_type(sk), ossl_check_BIO_compfunc_type(cmp))) + +/* clang-format on */ + +/* Prefix and suffix callback in ASN1 BIO */ +typedef int asn1_ps_func(BIO *b, unsigned char **pbuf, int *plen, + void *parg); + +typedef void (*BIO_dgram_sctp_notification_handler_fn)(BIO *b, + void *context, + void *buf); +#ifndef OPENSSL_NO_SCTP +/* SCTP parameter structs */ +struct bio_dgram_sctp_sndinfo { + uint16_t snd_sid; + uint16_t snd_flags; + uint32_t snd_ppid; + uint32_t snd_context; +}; + +struct bio_dgram_sctp_rcvinfo { + uint16_t rcv_sid; + uint16_t rcv_ssn; + uint16_t rcv_flags; + uint32_t rcv_ppid; + uint32_t rcv_tsn; + uint32_t rcv_cumtsn; + uint32_t rcv_context; +}; + +struct bio_dgram_sctp_prinfo { + uint16_t pr_policy; + uint32_t pr_value; +}; +#endif + +/* BIO_sendmmsg/BIO_recvmmsg-related definitions */ +typedef struct bio_msg_st { + void *data; + size_t data_len; + BIO_ADDR *peer, *local; + uint64_t flags; +} BIO_MSG; + +typedef struct bio_mmsg_cb_args_st { + BIO_MSG *msg; + size_t stride, num_msg; + uint64_t flags; + size_t *msgs_processed; +} BIO_MMSG_CB_ARGS; + +#define BIO_POLL_DESCRIPTOR_TYPE_NONE 0 +#define BIO_POLL_DESCRIPTOR_TYPE_SOCK_FD 1 +#define BIO_POLL_DESCRIPTOR_TYPE_SSL 2 +#define BIO_POLL_DESCRIPTOR_CUSTOM_START 8192 + +typedef struct bio_poll_descriptor_st { + uint32_t type; + union { + int fd; + void *custom; + uintptr_t custom_ui; + SSL *ssl; + } value; +} BIO_POLL_DESCRIPTOR; + +/* + * #define BIO_CONN_get_param_hostname BIO_ctrl + */ + +#define BIO_C_SET_CONNECT 100 +#define BIO_C_DO_STATE_MACHINE 101 +#define BIO_C_SET_NBIO 102 +/* # define BIO_C_SET_PROXY_PARAM 103 */ +#define BIO_C_SET_FD 104 +#define BIO_C_GET_FD 105 +#define BIO_C_SET_FILE_PTR 106 +#define BIO_C_GET_FILE_PTR 107 +#define BIO_C_SET_FILENAME 108 +#define BIO_C_SET_SSL 109 +#define BIO_C_GET_SSL 110 +#define BIO_C_SET_MD 111 +#define BIO_C_GET_MD 112 +#define BIO_C_GET_CIPHER_STATUS 113 +#define BIO_C_SET_BUF_MEM 114 +#define BIO_C_GET_BUF_MEM_PTR 115 +#define BIO_C_GET_BUFF_NUM_LINES 116 +#define BIO_C_SET_BUFF_SIZE 117 +#define BIO_C_SET_ACCEPT 118 +#define BIO_C_SSL_MODE 119 +#define BIO_C_GET_MD_CTX 120 +/* # define BIO_C_GET_PROXY_PARAM 121 */ +#define BIO_C_SET_BUFF_READ_DATA 122 /* data to read first */ +#define BIO_C_GET_CONNECT 123 +#define BIO_C_GET_ACCEPT 124 +#define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125 +#define BIO_C_GET_SSL_NUM_RENEGOTIATES 126 +#define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127 +#define BIO_C_FILE_SEEK 128 +#define BIO_C_GET_CIPHER_CTX 129 +#define BIO_C_SET_BUF_MEM_EOF_RETURN 130 /* return end of input \ + * value */ +#define BIO_C_SET_BIND_MODE 131 +#define BIO_C_GET_BIND_MODE 132 +#define BIO_C_FILE_TELL 133 +#define BIO_C_GET_SOCKS 134 +#define BIO_C_SET_SOCKS 135 + +#define BIO_C_SET_WRITE_BUF_SIZE 136 /* for BIO_s_bio */ +#define BIO_C_GET_WRITE_BUF_SIZE 137 +#define BIO_C_MAKE_BIO_PAIR 138 +#define BIO_C_DESTROY_BIO_PAIR 139 +#define BIO_C_GET_WRITE_GUARANTEE 140 +#define BIO_C_GET_READ_REQUEST 141 +#define BIO_C_SHUTDOWN_WR 142 +#define BIO_C_NREAD0 143 +#define BIO_C_NREAD 144 +#define BIO_C_NWRITE0 145 +#define BIO_C_NWRITE 146 +#define BIO_C_RESET_READ_REQUEST 147 +#define BIO_C_SET_MD_CTX 148 + +#define BIO_C_SET_PREFIX 149 +#define BIO_C_GET_PREFIX 150 +#define BIO_C_SET_SUFFIX 151 +#define BIO_C_GET_SUFFIX 152 + +#define BIO_C_SET_EX_ARG 153 +#define BIO_C_GET_EX_ARG 154 + +#define BIO_C_SET_CONNECT_MODE 155 + +#define BIO_C_SET_TFO 156 /* like BIO_C_SET_NBIO */ + +#define BIO_C_SET_SOCK_TYPE 157 +#define BIO_C_GET_SOCK_TYPE 158 +#define BIO_C_GET_DGRAM_BIO 159 + +#define BIO_set_app_data(s, arg) BIO_set_ex_data(s, 0, arg) +#define BIO_get_app_data(s) BIO_get_ex_data(s, 0) + +#define BIO_set_nbio(b, n) BIO_ctrl(b, BIO_C_SET_NBIO, (n), NULL) +#define BIO_set_tfo(b, n) BIO_ctrl(b, BIO_C_SET_TFO, (n), NULL) + +#ifndef OPENSSL_NO_SOCK +/* IP families we support, for BIO_s_connect() and BIO_s_accept() */ +/* Note: the underlying operating system may not support some of them */ +#define BIO_FAMILY_IPV4 4 +#define BIO_FAMILY_IPV6 6 +#define BIO_FAMILY_IPANY 256 + +/* BIO_s_connect() */ +#define BIO_set_conn_hostname(b, name) BIO_ctrl(b, BIO_C_SET_CONNECT, 0, \ + (char *)(name)) +#define BIO_set_conn_port(b, port) BIO_ctrl(b, BIO_C_SET_CONNECT, 1, \ + (char *)(port)) +#define BIO_set_conn_address(b, addr) BIO_ctrl(b, BIO_C_SET_CONNECT, 2, \ + (char *)(addr)) +#define BIO_set_conn_ip_family(b, f) BIO_int_ctrl(b, BIO_C_SET_CONNECT, 3, f) +#define BIO_get_conn_hostname(b) ((const char *)BIO_ptr_ctrl(b, BIO_C_GET_CONNECT, 0)) +#define BIO_get_conn_port(b) ((const char *)BIO_ptr_ctrl(b, BIO_C_GET_CONNECT, 1)) +#define BIO_get_conn_address(b) ((const BIO_ADDR *)BIO_ptr_ctrl(b, BIO_C_GET_CONNECT, 2)) +#define BIO_get_conn_ip_family(b) BIO_ctrl(b, BIO_C_GET_CONNECT, 3, NULL) +#define BIO_get_conn_mode(b) BIO_ctrl(b, BIO_C_GET_CONNECT, 4, NULL) +#define BIO_set_conn_mode(b, n) BIO_ctrl(b, BIO_C_SET_CONNECT_MODE, (n), NULL) +#define BIO_set_sock_type(b, t) BIO_ctrl(b, BIO_C_SET_SOCK_TYPE, (t), NULL) +#define BIO_get_sock_type(b) BIO_ctrl(b, BIO_C_GET_SOCK_TYPE, 0, NULL) +#define BIO_get0_dgram_bio(b, p) BIO_ctrl(b, BIO_C_GET_DGRAM_BIO, 0, (void *)(BIO **)(p)) + +/* BIO_s_accept() */ +#define BIO_set_accept_name(b, name) BIO_ctrl(b, BIO_C_SET_ACCEPT, 0, \ + (char *)(name)) +#define BIO_set_accept_port(b, port) BIO_ctrl(b, BIO_C_SET_ACCEPT, 1, \ + (char *)(port)) +#define BIO_get_accept_name(b) ((const char *)BIO_ptr_ctrl(b, BIO_C_GET_ACCEPT, 0)) +#define BIO_get_accept_port(b) ((const char *)BIO_ptr_ctrl(b, BIO_C_GET_ACCEPT, 1)) +#define BIO_get_peer_name(b) ((const char *)BIO_ptr_ctrl(b, BIO_C_GET_ACCEPT, 2)) +#define BIO_get_peer_port(b) ((const char *)BIO_ptr_ctrl(b, BIO_C_GET_ACCEPT, 3)) +/* #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) */ +#define BIO_set_nbio_accept(b, n) BIO_ctrl(b, BIO_C_SET_ACCEPT, 2, (n) ? (void *)"a" : NULL) +#define BIO_set_accept_bios(b, bio) BIO_ctrl(b, BIO_C_SET_ACCEPT, 3, \ + (char *)(bio)) +#define BIO_set_accept_ip_family(b, f) BIO_int_ctrl(b, BIO_C_SET_ACCEPT, 4, f) +#define BIO_get_accept_ip_family(b) BIO_ctrl(b, BIO_C_GET_ACCEPT, 4, NULL) +#define BIO_set_tfo_accept(b, n) BIO_ctrl(b, BIO_C_SET_ACCEPT, 5, (n) ? (void *)"a" : NULL) + +/* Aliases kept for backward compatibility */ +#define BIO_BIND_NORMAL 0 +#define BIO_BIND_REUSEADDR BIO_SOCK_REUSEADDR +#define BIO_BIND_REUSEADDR_IF_UNUSED BIO_SOCK_REUSEADDR +#define BIO_set_bind_mode(b, mode) BIO_ctrl(b, BIO_C_SET_BIND_MODE, mode, NULL) +#define BIO_get_bind_mode(b) BIO_ctrl(b, BIO_C_GET_BIND_MODE, 0, NULL) +#endif /* OPENSSL_NO_SOCK */ + +#define BIO_do_connect(b) BIO_do_handshake(b) +#define BIO_do_accept(b) BIO_do_handshake(b) + +#define BIO_do_handshake(b) BIO_ctrl(b, BIO_C_DO_STATE_MACHINE, 0, NULL) + +/* BIO_s_datagram(), BIO_s_fd(), BIO_s_socket(), BIO_s_accept() and BIO_s_connect() */ +#define BIO_set_fd(b, fd, c) BIO_int_ctrl(b, BIO_C_SET_FD, c, fd) +#define BIO_get_fd(b, c) BIO_ctrl(b, BIO_C_GET_FD, 0, (char *)(c)) + +/* BIO_s_file() */ +#define BIO_set_fp(b, fp, c) BIO_ctrl(b, BIO_C_SET_FILE_PTR, c, (char *)(fp)) +#define BIO_get_fp(b, fpp) BIO_ctrl(b, BIO_C_GET_FILE_PTR, 0, (char *)(fpp)) + +/* BIO_s_fd() and BIO_s_file() */ +#define BIO_seek(b, ofs) (int)BIO_ctrl(b, BIO_C_FILE_SEEK, ofs, NULL) +#define BIO_tell(b) (int)BIO_ctrl(b, BIO_C_FILE_TELL, 0, NULL) + +/* + * name is cast to lose const, but might be better to route through a + * function so we can do it safely + */ +#ifdef CONST_STRICT +/* + * If you are wondering why this isn't defined, its because CONST_STRICT is + * purely a compile-time kludge to allow const to be checked. + */ +int BIO_read_filename(BIO *b, const char *name); +#else +#define BIO_read_filename(b, name) (int)BIO_ctrl(b, BIO_C_SET_FILENAME, \ + BIO_CLOSE | BIO_FP_READ, (char *)(name)) +#endif +#define BIO_write_filename(b, name) (int)BIO_ctrl(b, BIO_C_SET_FILENAME, \ + BIO_CLOSE | BIO_FP_WRITE, name) +#define BIO_append_filename(b, name) (int)BIO_ctrl(b, BIO_C_SET_FILENAME, \ + BIO_CLOSE | BIO_FP_APPEND, name) +#define BIO_rw_filename(b, name) (int)BIO_ctrl(b, BIO_C_SET_FILENAME, \ + BIO_CLOSE | BIO_FP_READ | BIO_FP_WRITE, name) + +/* + * WARNING WARNING, this ups the reference count on the read bio of the SSL + * structure. This is because the ssl read BIO is now pointed to by the + * next_bio field in the bio. So when you free the BIO, make sure you are + * doing a BIO_free_all() to catch the underlying BIO. + */ +#define BIO_set_ssl(b, ssl, c) BIO_ctrl(b, BIO_C_SET_SSL, c, (char *)(ssl)) +#define BIO_get_ssl(b, sslp) BIO_ctrl(b, BIO_C_GET_SSL, 0, (char *)(sslp)) +#define BIO_set_ssl_mode(b, client) BIO_ctrl(b, BIO_C_SSL_MODE, client, NULL) +#define BIO_set_ssl_renegotiate_bytes(b, num) \ + BIO_ctrl(b, BIO_C_SET_SSL_RENEGOTIATE_BYTES, num, NULL) +#define BIO_get_num_renegotiates(b) \ + BIO_ctrl(b, BIO_C_GET_SSL_NUM_RENEGOTIATES, 0, NULL) +#define BIO_set_ssl_renegotiate_timeout(b, seconds) \ + BIO_ctrl(b, BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT, seconds, NULL) + +/* defined in evp.h */ +/* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)(md)) */ + +#define BIO_get_mem_data(b, pp) BIO_ctrl(b, BIO_CTRL_INFO, 0, (char *)(pp)) +#define BIO_set_mem_buf(b, bm, c) BIO_ctrl(b, BIO_C_SET_BUF_MEM, c, (char *)(bm)) +#define BIO_get_mem_ptr(b, pp) BIO_ctrl(b, BIO_C_GET_BUF_MEM_PTR, 0, \ + (char *)(pp)) +#define BIO_set_mem_eof_return(b, v) \ + BIO_ctrl(b, BIO_C_SET_BUF_MEM_EOF_RETURN, v, NULL) + +/* For the BIO_f_buffer() type */ +#define BIO_get_buffer_num_lines(b) BIO_ctrl(b, BIO_C_GET_BUFF_NUM_LINES, 0, NULL) +#define BIO_set_buffer_size(b, size) BIO_ctrl(b, BIO_C_SET_BUFF_SIZE, size, NULL) +#define BIO_set_read_buffer_size(b, size) BIO_int_ctrl(b, BIO_C_SET_BUFF_SIZE, size, 0) +#define BIO_set_write_buffer_size(b, size) BIO_int_ctrl(b, BIO_C_SET_BUFF_SIZE, size, 1) +#define BIO_set_buffer_read_data(b, buf, num) BIO_ctrl(b, BIO_C_SET_BUFF_READ_DATA, num, buf) + +/* Don't use the next one unless you know what you are doing :-) */ +#define BIO_dup_state(b, ret) BIO_ctrl(b, BIO_CTRL_DUP, 0, (char *)(ret)) + +#define BIO_reset(b) (int)BIO_ctrl(b, BIO_CTRL_RESET, 0, NULL) +#define BIO_eof(b) (int)BIO_ctrl(b, BIO_CTRL_EOF, 0, NULL) +#define BIO_set_close(b, c) (int)BIO_ctrl(b, BIO_CTRL_SET_CLOSE, (c), NULL) +#define BIO_get_close(b) (int)BIO_ctrl(b, BIO_CTRL_GET_CLOSE, 0, NULL) +#define BIO_pending(b) (int)BIO_ctrl(b, BIO_CTRL_PENDING, 0, NULL) +#define BIO_wpending(b) (int)BIO_ctrl(b, BIO_CTRL_WPENDING, 0, NULL) +/* ...pending macros have inappropriate return type */ +size_t BIO_ctrl_pending(BIO *b); +size_t BIO_ctrl_wpending(BIO *b); +#define BIO_flush(b) (int)BIO_ctrl(b, BIO_CTRL_FLUSH, 0, NULL) +#define BIO_get_info_callback(b, cbp) (int)BIO_ctrl(b, BIO_CTRL_GET_CALLBACK, 0, \ + cbp) +#define BIO_set_info_callback(b, cb) (int)BIO_callback_ctrl(b, BIO_CTRL_SET_CALLBACK, cb) + +/* For the BIO_f_buffer() type */ +#define BIO_buffer_get_num_lines(b) BIO_ctrl(b, BIO_CTRL_GET, 0, NULL) +#define BIO_buffer_peek(b, s, l) BIO_ctrl(b, BIO_CTRL_PEEK, (l), (s)) + +/* For BIO_s_bio() */ +#define BIO_set_write_buf_size(b, size) (int)BIO_ctrl(b, BIO_C_SET_WRITE_BUF_SIZE, size, NULL) +#define BIO_get_write_buf_size(b, size) (size_t)BIO_ctrl(b, BIO_C_GET_WRITE_BUF_SIZE, size, NULL) +#define BIO_make_bio_pair(b1, b2) (int)BIO_ctrl(b1, BIO_C_MAKE_BIO_PAIR, 0, b2) +#define BIO_destroy_bio_pair(b) (int)BIO_ctrl(b, BIO_C_DESTROY_BIO_PAIR, 0, NULL) +#define BIO_shutdown_wr(b) (int)BIO_ctrl(b, BIO_C_SHUTDOWN_WR, 0, NULL) +/* macros with inappropriate type -- but ...pending macros use int too: */ +#define BIO_get_write_guarantee(b) (int)BIO_ctrl(b, BIO_C_GET_WRITE_GUARANTEE, 0, NULL) +#define BIO_get_read_request(b) (int)BIO_ctrl(b, BIO_C_GET_READ_REQUEST, 0, NULL) +size_t BIO_ctrl_get_write_guarantee(BIO *b); +size_t BIO_ctrl_get_read_request(BIO *b); +int BIO_ctrl_reset_read_request(BIO *b); + +/* ctrl macros for dgram */ +#define BIO_ctrl_dgram_connect(b, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_CONNECT, 0, (char *)(peer)) +#define BIO_ctrl_set_connected(b, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_CONNECTED, 0, (char *)(peer)) +#define BIO_dgram_recv_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP, 0, NULL) +#define BIO_dgram_send_timedout(b) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP, 0, NULL) +#define BIO_dgram_get_peer(b, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_PEER, 0, (char *)(peer)) +#define BIO_dgram_set_peer(b, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, (char *)(peer)) +#define BIO_dgram_detect_peer_addr(b, peer) \ + (int)BIO_ctrl(b, BIO_CTRL_DGRAM_DETECT_PEER_ADDR, 0, (char *)(peer)) +#define BIO_dgram_get_mtu_overhead(b) \ + (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU_OVERHEAD, 0, NULL) +#define BIO_dgram_get_local_addr_cap(b) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_LOCAL_ADDR_CAP, 0, NULL) +#define BIO_dgram_get_local_addr_enable(b, penable) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_LOCAL_ADDR_ENABLE, 0, (char *)(penable)) +#define BIO_dgram_set_local_addr_enable(b, enable) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_SET_LOCAL_ADDR_ENABLE, (enable), NULL) +#define BIO_dgram_get_effective_caps(b) \ + (uint32_t)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_EFFECTIVE_CAPS, 0, NULL) +#define BIO_dgram_get_caps(b) \ + (uint32_t)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_CAPS, 0, NULL) +#define BIO_dgram_set_caps(b, caps) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_SET_CAPS, (long)(caps), NULL) +#define BIO_dgram_get_no_trunc(b) \ + (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_NO_TRUNC, 0, NULL) +#define BIO_dgram_set_no_trunc(b, enable) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_SET_NO_TRUNC, (enable), NULL) +#define BIO_dgram_get_mtu(b) \ + (unsigned int)BIO_ctrl((b), BIO_CTRL_DGRAM_GET_MTU, 0, NULL) +#define BIO_dgram_set_mtu(b, mtu) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_SET_MTU, (mtu), NULL) +#define BIO_dgram_set0_local_addr(b, addr) \ + (int)BIO_ctrl((b), BIO_CTRL_DGRAM_SET0_LOCAL_ADDR, 0, (addr)) + +/* ctrl macros for BIO_f_prefix */ +#define BIO_set_prefix(b, p) BIO_ctrl((b), BIO_CTRL_SET_PREFIX, 0, (void *)(p)) +#define BIO_set_indent(b, i) BIO_ctrl((b), BIO_CTRL_SET_INDENT, (i), NULL) +#define BIO_get_indent(b) BIO_ctrl((b), BIO_CTRL_GET_INDENT, 0, NULL) + +#define BIO_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, l, p, newf, dupf, freef) +int BIO_set_ex_data(BIO *bio, int idx, void *data); +void *BIO_get_ex_data(const BIO *bio, int idx); +uint64_t BIO_number_read(BIO *bio); +uint64_t BIO_number_written(BIO *bio); + +/* For BIO_f_asn1() */ +int BIO_asn1_set_prefix(BIO *b, asn1_ps_func *prefix, + asn1_ps_func *prefix_free); +int BIO_asn1_get_prefix(BIO *b, asn1_ps_func **pprefix, + asn1_ps_func **pprefix_free); +int BIO_asn1_set_suffix(BIO *b, asn1_ps_func *suffix, + asn1_ps_func *suffix_free); +int BIO_asn1_get_suffix(BIO *b, asn1_ps_func **psuffix, + asn1_ps_func **psuffix_free); + +const BIO_METHOD *BIO_s_file(void); +BIO *BIO_new_file(const char *filename, const char *mode); +BIO *BIO_new_from_core_bio(OSSL_LIB_CTX *libctx, OSSL_CORE_BIO *corebio); +#ifndef OPENSSL_NO_STDIO +BIO *BIO_new_fp(FILE *stream, int close_flag); +#endif +BIO *BIO_new_ex(OSSL_LIB_CTX *libctx, const BIO_METHOD *method); +BIO *BIO_new(const BIO_METHOD *type); +int BIO_free(BIO *a); +void BIO_set_data(BIO *a, void *ptr); +void *BIO_get_data(BIO *a); +void BIO_set_init(BIO *a, int init); +int BIO_get_init(BIO *a); +void BIO_set_shutdown(BIO *a, int shut); +int BIO_get_shutdown(BIO *a); +void BIO_vfree(BIO *a); +int BIO_up_ref(BIO *a); +int BIO_read(BIO *b, void *data, int dlen); +int BIO_read_ex(BIO *b, void *data, size_t dlen, size_t *readbytes); +__owur int BIO_recvmmsg(BIO *b, BIO_MSG *msg, + size_t stride, size_t num_msg, uint64_t flags, + size_t *msgs_processed); +int BIO_gets(BIO *bp, char *buf, int size); +int BIO_get_line(BIO *bio, char *buf, int size); +int BIO_write(BIO *b, const void *data, int dlen); +int BIO_write_ex(BIO *b, const void *data, size_t dlen, size_t *written); +__owur int BIO_sendmmsg(BIO *b, BIO_MSG *msg, + size_t stride, size_t num_msg, uint64_t flags, + size_t *msgs_processed); +__owur int BIO_get_rpoll_descriptor(BIO *b, BIO_POLL_DESCRIPTOR *desc); +__owur int BIO_get_wpoll_descriptor(BIO *b, BIO_POLL_DESCRIPTOR *desc); +int BIO_puts(BIO *bp, const char *buf); +int BIO_indent(BIO *b, int indent, int max); +long BIO_ctrl(BIO *bp, int cmd, long larg, void *parg); +long BIO_callback_ctrl(BIO *b, int cmd, BIO_info_cb *fp); +void *BIO_ptr_ctrl(BIO *bp, int cmd, long larg); +long BIO_int_ctrl(BIO *bp, int cmd, long larg, int iarg); +BIO *BIO_push(BIO *b, BIO *append); +BIO *BIO_pop(BIO *b); +void BIO_free_all(BIO *a); +BIO *BIO_find_type(BIO *b, int bio_type); +BIO *BIO_next(BIO *b); +void BIO_set_next(BIO *b, BIO *next); +BIO *BIO_get_retry_BIO(BIO *bio, int *reason); +int BIO_get_retry_reason(BIO *bio); +void BIO_set_retry_reason(BIO *bio, int reason); +BIO *BIO_dup_chain(BIO *in); + +int BIO_nread0(BIO *bio, char **buf); +int BIO_nread(BIO *bio, char **buf, int num); +int BIO_nwrite0(BIO *bio, char **buf); +int BIO_nwrite(BIO *bio, char **buf, int num); + +const BIO_METHOD *BIO_s_mem(void); +#ifndef OPENSSL_NO_DGRAM +const BIO_METHOD *BIO_s_dgram_mem(void); +#endif +const BIO_METHOD *BIO_s_secmem(void); +BIO *BIO_new_mem_buf(const void *buf, int len); +#ifndef OPENSSL_NO_SOCK +const BIO_METHOD *BIO_s_socket(void); +const BIO_METHOD *BIO_s_connect(void); +const BIO_METHOD *BIO_s_accept(void); +#endif +const BIO_METHOD *BIO_s_fd(void); +const BIO_METHOD *BIO_s_log(void); +const BIO_METHOD *BIO_s_bio(void); +const BIO_METHOD *BIO_s_null(void); +const BIO_METHOD *BIO_f_null(void); +const BIO_METHOD *BIO_f_buffer(void); +const BIO_METHOD *BIO_f_readbuffer(void); +const BIO_METHOD *BIO_f_linebuffer(void); +const BIO_METHOD *BIO_f_nbio_test(void); +const BIO_METHOD *BIO_f_prefix(void); +const BIO_METHOD *BIO_s_core(void); +#ifndef OPENSSL_NO_DGRAM +const BIO_METHOD *BIO_s_dgram_pair(void); +const BIO_METHOD *BIO_s_datagram(void); +int BIO_dgram_non_fatal_error(int error); +BIO *BIO_new_dgram(int fd, int close_flag); +#ifndef OPENSSL_NO_SCTP +const BIO_METHOD *BIO_s_datagram_sctp(void); +BIO *BIO_new_dgram_sctp(int fd, int close_flag); +int BIO_dgram_is_sctp(BIO *bio); +int BIO_dgram_sctp_notification_cb(BIO *b, + BIO_dgram_sctp_notification_handler_fn handle_notifications, + void *context); +int BIO_dgram_sctp_wait_for_dry(BIO *b); +int BIO_dgram_sctp_msg_waiting(BIO *b); +#endif +#endif + +#ifndef OPENSSL_NO_SOCK +int BIO_sock_should_retry(int i); +int BIO_sock_non_fatal_error(int error); +int BIO_err_is_non_fatal(unsigned int errcode); +int BIO_socket_wait(int fd, int for_read, time_t max_time); +#endif +int BIO_wait(BIO *bio, time_t max_time, unsigned int nap_milliseconds); +int BIO_do_connect_retry(BIO *bio, int timeout, int nap_milliseconds); + +int BIO_fd_should_retry(int i); +int BIO_fd_non_fatal_error(int error); +int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), + void *u, const void *s, int len); +int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), + void *u, const void *s, int len, int indent); +int BIO_dump(BIO *b, const void *bytes, int len); +int BIO_dump_indent(BIO *b, const void *bytes, int len, int indent); +#ifndef OPENSSL_NO_STDIO +int BIO_dump_fp(FILE *fp, const void *s, int len); +int BIO_dump_indent_fp(FILE *fp, const void *s, int len, int indent); +#endif +int BIO_hex_string(BIO *out, int indent, int width, const void *data, + int datalen); + +#ifndef OPENSSL_NO_SOCK +BIO_ADDR *BIO_ADDR_new(void); +int BIO_ADDR_copy(BIO_ADDR *dst, const BIO_ADDR *src); +BIO_ADDR *BIO_ADDR_dup(const BIO_ADDR *ap); +int BIO_ADDR_rawmake(BIO_ADDR *ap, int family, + const void *where, size_t wherelen, unsigned short port); +void BIO_ADDR_free(BIO_ADDR *); +void BIO_ADDR_clear(BIO_ADDR *ap); +int BIO_ADDR_family(const BIO_ADDR *ap); +int BIO_ADDR_rawaddress(const BIO_ADDR *ap, void *p, size_t *l); +unsigned short BIO_ADDR_rawport(const BIO_ADDR *ap); +char *BIO_ADDR_hostname_string(const BIO_ADDR *ap, int numeric); +char *BIO_ADDR_service_string(const BIO_ADDR *ap, int numeric); +char *BIO_ADDR_path_string(const BIO_ADDR *ap); + +const BIO_ADDRINFO *BIO_ADDRINFO_next(const BIO_ADDRINFO *bai); +int BIO_ADDRINFO_family(const BIO_ADDRINFO *bai); +int BIO_ADDRINFO_socktype(const BIO_ADDRINFO *bai); +int BIO_ADDRINFO_protocol(const BIO_ADDRINFO *bai); +const BIO_ADDR *BIO_ADDRINFO_address(const BIO_ADDRINFO *bai); +void BIO_ADDRINFO_free(BIO_ADDRINFO *bai); + +enum BIO_hostserv_priorities { + BIO_PARSE_PRIO_HOST, + BIO_PARSE_PRIO_SERV +}; +int BIO_parse_hostserv(const char *hostserv, char **host, char **service, + enum BIO_hostserv_priorities hostserv_prio); +enum BIO_lookup_type { + BIO_LOOKUP_CLIENT, + BIO_LOOKUP_SERVER +}; +int BIO_lookup(const char *host, const char *service, + enum BIO_lookup_type lookup_type, + int family, int socktype, BIO_ADDRINFO **res); +int BIO_lookup_ex(const char *host, const char *service, + int lookup_type, int family, int socktype, int protocol, + BIO_ADDRINFO **res); +int BIO_sock_error(int sock); +int BIO_socket_ioctl(int fd, long type, void *arg); +int BIO_socket_nbio(int fd, int mode); +int BIO_sock_init(void); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define BIO_sock_cleanup() \ + while (0) \ + continue +#endif +int BIO_set_tcp_ndelay(int sock, int turn_on); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 struct hostent *BIO_gethostbyname(const char *name); +OSSL_DEPRECATEDIN_1_1_0 int BIO_get_port(const char *str, unsigned short *port_ptr); +OSSL_DEPRECATEDIN_1_1_0 int BIO_get_host_ip(const char *str, unsigned char *ip); +OSSL_DEPRECATEDIN_1_1_0 int BIO_get_accept_socket(char *host_port, int mode); +OSSL_DEPRECATEDIN_1_1_0 int BIO_accept(int sock, char **ip_port); +#endif + +union BIO_sock_info_u { + BIO_ADDR *addr; +}; +enum BIO_sock_info_type { + BIO_SOCK_INFO_ADDRESS +}; +int BIO_sock_info(int sock, + enum BIO_sock_info_type type, union BIO_sock_info_u *info); + +#define BIO_SOCK_REUSEADDR 0x01 +#define BIO_SOCK_V6_ONLY 0x02 +#define BIO_SOCK_KEEPALIVE 0x04 +#define BIO_SOCK_NONBLOCK 0x08 +#define BIO_SOCK_NODELAY 0x10 +#define BIO_SOCK_TFO 0x20 + +int BIO_socket(int domain, int socktype, int protocol, int options); +int BIO_connect(int sock, const BIO_ADDR *addr, int options); +int BIO_bind(int sock, const BIO_ADDR *addr, int options); +int BIO_listen(int sock, const BIO_ADDR *addr, int options); +int BIO_accept_ex(int accept_sock, BIO_ADDR *addr, int options); +int BIO_closesocket(int sock); + +BIO *BIO_new_socket(int sock, int close_flag); +BIO *BIO_new_connect(const char *host_port); +BIO *BIO_new_accept(const char *host_port); +#endif /* OPENSSL_NO_SOCK*/ + +BIO *BIO_new_fd(int fd, int close_flag); + +int BIO_new_bio_pair(BIO **bio1, size_t writebuf1, + BIO **bio2, size_t writebuf2); +#ifndef OPENSSL_NO_DGRAM +int BIO_new_bio_dgram_pair(BIO **bio1, size_t writebuf1, + BIO **bio2, size_t writebuf2); +#endif + +/* + * If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints. + * Otherwise returns 0 and sets *bio1 and *bio2 to NULL. Size 0 uses default + * value. + */ + +void BIO_copy_next_retry(BIO *b); + +/* + * long BIO_ghbn_ctrl(int cmd,int iarg,char *parg); + */ + +#define ossl_bio__attr__(x) +#if defined(__GNUC__) && defined(__STDC_VERSION__) \ + && !defined(__MINGW32__) && !defined(__MINGW64__) \ + && !defined(__APPLE__) +/* + * Because we support the 'z' modifier, which made its appearance in C99, + * we can't use __attribute__ with pre C99 dialects. + */ +#if __STDC_VERSION__ >= 199901L +#undef ossl_bio__attr__ +#define ossl_bio__attr__ __attribute__ +#if __GNUC__ * 10 + __GNUC_MINOR__ >= 44 +#define ossl_bio__printf__ __gnu_printf__ +#else +#define ossl_bio__printf__ __printf__ +#endif +#endif +#endif +int BIO_printf(BIO *bio, const char *format, ...) + ossl_bio__attr__((__format__(ossl_bio__printf__, 2, 3))); +int BIO_vprintf(BIO *bio, const char *format, va_list args) + ossl_bio__attr__((__format__(ossl_bio__printf__, 2, 0))); +int BIO_snprintf(char *buf, size_t n, const char *format, ...) + ossl_bio__attr__((__format__(ossl_bio__printf__, 3, 4))); +int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args) + ossl_bio__attr__((__format__(ossl_bio__printf__, 3, 0))); +#undef ossl_bio__attr__ +#undef ossl_bio__printf__ + +BIO_METHOD *BIO_meth_new(int type, const char *name); +void BIO_meth_free(BIO_METHOD *biom); +int BIO_meth_set_write(BIO_METHOD *biom, + int (*write)(BIO *, const char *, int)); +int BIO_meth_set_write_ex(BIO_METHOD *biom, + int (*bwrite)(BIO *, const char *, size_t, size_t *)); +int BIO_meth_set_sendmmsg(BIO_METHOD *biom, + int (*f)(BIO *, BIO_MSG *, size_t, size_t, + uint64_t, size_t *)); +int BIO_meth_set_read(BIO_METHOD *biom, + int (*read)(BIO *, char *, int)); +int BIO_meth_set_read_ex(BIO_METHOD *biom, + int (*bread)(BIO *, char *, size_t, size_t *)); +int BIO_meth_set_recvmmsg(BIO_METHOD *biom, + int (*f)(BIO *, BIO_MSG *, size_t, size_t, + uint64_t, size_t *)); +int BIO_meth_set_puts(BIO_METHOD *biom, + int (*puts)(BIO *, const char *)); +int BIO_meth_set_gets(BIO_METHOD *biom, + int (*ossl_gets)(BIO *, char *, int)); +int BIO_meth_set_ctrl(BIO_METHOD *biom, + long (*ctrl)(BIO *, int, long, void *)); +int BIO_meth_set_create(BIO_METHOD *biom, int (*create)(BIO *)); +int BIO_meth_set_destroy(BIO_METHOD *biom, int (*destroy)(BIO *)); +int BIO_meth_set_callback_ctrl(BIO_METHOD *biom, + long (*callback_ctrl)(BIO *, int, + BIO_info_cb *)); +#ifndef OPENSSL_NO_DEPRECATED_3_5 +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_write(const BIO_METHOD *biom))(BIO *, const char *, + int); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_write_ex(const BIO_METHOD *biom))(BIO *, const char *, + size_t, size_t *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_sendmmsg(const BIO_METHOD *biom))(BIO *, BIO_MSG *, + size_t, size_t, + uint64_t, size_t *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_read(const BIO_METHOD *biom))(BIO *, char *, int); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_read_ex(const BIO_METHOD *biom))(BIO *, char *, + size_t, size_t *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_recvmmsg(const BIO_METHOD *biom))(BIO *, BIO_MSG *, + size_t, size_t, + uint64_t, size_t *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_puts(const BIO_METHOD *biom))(BIO *, const char *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_gets(const BIO_METHOD *biom))(BIO *, char *, int); +OSSL_DEPRECATEDIN_3_5 long (*BIO_meth_get_ctrl(const BIO_METHOD *biom))(BIO *, int, + long, void *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_create(const BIO_METHOD *bion))(BIO *); +OSSL_DEPRECATEDIN_3_5 int (*BIO_meth_get_destroy(const BIO_METHOD *biom))(BIO *); +OSSL_DEPRECATEDIN_3_5 long (*BIO_meth_get_callback_ctrl(const BIO_METHOD *biom))(BIO *, int, + BIO_info_cb *); +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/cmp.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/cmp.h new file mode 100644 index 000000000000..af844ec8ed10 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/cmp.h @@ -0,0 +1,741 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/cmp.h.in + * + * Copyright 2007-2026 The OpenSSL Project Authors. All Rights Reserved. + * Copyright Nokia 2007-2019 + * Copyright Siemens AG 2015-2019 + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_CMP_H +#define OPENSSL_CMP_H + +#include +#ifndef OPENSSL_NO_CMP + +#include +#include +#include +#include + +/* explicit #includes not strictly needed since implied by the above: */ +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define OSSL_CMP_PVNO_2 2 +#define OSSL_CMP_PVNO_3 3 +#define OSSL_CMP_PVNO OSSL_CMP_PVNO_2 /* v2 is the default */ + +/*- + * PKIFailureInfo ::= BIT STRING { + * -- since we can fail in more than one way! + * -- More codes may be added in the future if/when required. + * badAlg (0), + * -- unrecognized or unsupported Algorithm Identifier + * badMessageCheck (1), + * -- integrity check failed (e.g., signature did not verify) + * badRequest (2), + * -- transaction not permitted or supported + * badTime (3), + * -- messageTime was not sufficiently close to the system time, + * -- as defined by local policy + * badCertId (4), + * -- no certificate could be found matching the provided criteria + * badDataFormat (5), + * -- the data submitted has the wrong format + * wrongAuthority (6), + * -- the authority indicated in the request is different from the + * -- one creating the response token + * incorrectData (7), + * -- the requester's data is incorrect (for notary services) + * missingTimeStamp (8), + * -- when the timestamp is missing but should be there + * -- (by policy) + * badPOP (9), + * -- the proof-of-possession failed + * certRevoked (10), + * -- the certificate has already been revoked + * certConfirmed (11), + * -- the certificate has already been confirmed + * wrongIntegrity (12), + * -- invalid integrity, password based instead of signature or + * -- vice versa + * badRecipientNonce (13), + * -- invalid recipient nonce, either missing or wrong value + * timeNotAvailable (14), + * -- the TSA's time source is not available + * unacceptedPolicy (15), + * -- the requested TSA policy is not supported by the TSA. + * unacceptedExtension (16), + * -- the requested extension is not supported by the TSA. + * addInfoNotAvailable (17), + * -- the additional information requested could not be + * -- understood or is not available + * badSenderNonce (18), + * -- invalid sender nonce, either missing or wrong size + * badCertTemplate (19), + * -- invalid cert. template or missing mandatory information + * signerNotTrusted (20), + * -- signer of the message unknown or not trusted + * transactionIdInUse (21), + * -- the transaction identifier is already in use + * unsupportedVersion (22), + * -- the version of the message is not supported + * notAuthorized (23), + * -- the sender was not authorized to make the preceding + * -- request or perform the preceding action + * systemUnavail (24), + * -- the request cannot be handled due to system unavailability + * systemFailure (25), + * -- the request cannot be handled due to system failure + * duplicateCertReq (26) + * -- certificate cannot be issued because a duplicate + * -- certificate already exists + * } + */ +#define OSSL_CMP_PKIFAILUREINFO_badAlg 0 +#define OSSL_CMP_PKIFAILUREINFO_badMessageCheck 1 +#define OSSL_CMP_PKIFAILUREINFO_badRequest 2 +#define OSSL_CMP_PKIFAILUREINFO_badTime 3 +#define OSSL_CMP_PKIFAILUREINFO_badCertId 4 +#define OSSL_CMP_PKIFAILUREINFO_badDataFormat 5 +#define OSSL_CMP_PKIFAILUREINFO_wrongAuthority 6 +#define OSSL_CMP_PKIFAILUREINFO_incorrectData 7 +#define OSSL_CMP_PKIFAILUREINFO_missingTimeStamp 8 +#define OSSL_CMP_PKIFAILUREINFO_badPOP 9 +#define OSSL_CMP_PKIFAILUREINFO_certRevoked 10 +#define OSSL_CMP_PKIFAILUREINFO_certConfirmed 11 +#define OSSL_CMP_PKIFAILUREINFO_wrongIntegrity 12 +#define OSSL_CMP_PKIFAILUREINFO_badRecipientNonce 13 +#define OSSL_CMP_PKIFAILUREINFO_timeNotAvailable 14 +#define OSSL_CMP_PKIFAILUREINFO_unacceptedPolicy 15 +#define OSSL_CMP_PKIFAILUREINFO_unacceptedExtension 16 +#define OSSL_CMP_PKIFAILUREINFO_addInfoNotAvailable 17 +#define OSSL_CMP_PKIFAILUREINFO_badSenderNonce 18 +#define OSSL_CMP_PKIFAILUREINFO_badCertTemplate 19 +#define OSSL_CMP_PKIFAILUREINFO_signerNotTrusted 20 +#define OSSL_CMP_PKIFAILUREINFO_transactionIdInUse 21 +#define OSSL_CMP_PKIFAILUREINFO_unsupportedVersion 22 +#define OSSL_CMP_PKIFAILUREINFO_notAuthorized 23 +#define OSSL_CMP_PKIFAILUREINFO_systemUnavail 24 +#define OSSL_CMP_PKIFAILUREINFO_systemFailure 25 +#define OSSL_CMP_PKIFAILUREINFO_duplicateCertReq 26 +#define OSSL_CMP_PKIFAILUREINFO_MAX 26 +#define OSSL_CMP_PKIFAILUREINFO_MAX_BIT_PATTERN \ + ((1 << (OSSL_CMP_PKIFAILUREINFO_MAX + 1)) - 1) +#if OSSL_CMP_PKIFAILUREINFO_MAX_BIT_PATTERN > INT_MAX +#error CMP_PKIFAILUREINFO_MAX bit pattern does not fit in type int +#endif +typedef ASN1_BIT_STRING OSSL_CMP_PKIFAILUREINFO; + +#define OSSL_CMP_CTX_FAILINFO_badAlg (1 << 0) +#define OSSL_CMP_CTX_FAILINFO_badMessageCheck (1 << 1) +#define OSSL_CMP_CTX_FAILINFO_badRequest (1 << 2) +#define OSSL_CMP_CTX_FAILINFO_badTime (1 << 3) +#define OSSL_CMP_CTX_FAILINFO_badCertId (1 << 4) +#define OSSL_CMP_CTX_FAILINFO_badDataFormat (1 << 5) +#define OSSL_CMP_CTX_FAILINFO_wrongAuthority (1 << 6) +#define OSSL_CMP_CTX_FAILINFO_incorrectData (1 << 7) +#define OSSL_CMP_CTX_FAILINFO_missingTimeStamp (1 << 8) +#define OSSL_CMP_CTX_FAILINFO_badPOP (1 << 9) +#define OSSL_CMP_CTX_FAILINFO_certRevoked (1 << 10) +#define OSSL_CMP_CTX_FAILINFO_certConfirmed (1 << 11) +#define OSSL_CMP_CTX_FAILINFO_wrongIntegrity (1 << 12) +#define OSSL_CMP_CTX_FAILINFO_badRecipientNonce (1 << 13) +#define OSSL_CMP_CTX_FAILINFO_timeNotAvailable (1 << 14) +#define OSSL_CMP_CTX_FAILINFO_unacceptedPolicy (1 << 15) +#define OSSL_CMP_CTX_FAILINFO_unacceptedExtension (1 << 16) +#define OSSL_CMP_CTX_FAILINFO_addInfoNotAvailable (1 << 17) +#define OSSL_CMP_CTX_FAILINFO_badSenderNonce (1 << 18) +#define OSSL_CMP_CTX_FAILINFO_badCertTemplate (1 << 19) +#define OSSL_CMP_CTX_FAILINFO_signerNotTrusted (1 << 20) +#define OSSL_CMP_CTX_FAILINFO_transactionIdInUse (1 << 21) +#define OSSL_CMP_CTX_FAILINFO_unsupportedVersion (1 << 22) +#define OSSL_CMP_CTX_FAILINFO_notAuthorized (1 << 23) +#define OSSL_CMP_CTX_FAILINFO_systemUnavail (1 << 24) +#define OSSL_CMP_CTX_FAILINFO_systemFailure (1 << 25) +#define OSSL_CMP_CTX_FAILINFO_duplicateCertReq (1 << 26) + +/*- + * PKIStatus ::= INTEGER { + * accepted (0), + * -- you got exactly what you asked for + * grantedWithMods (1), + * -- you got something like what you asked for; the + * -- requester is responsible for ascertaining the differences + * rejection (2), + * -- you don't get it, more information elsewhere in the message + * waiting (3), + * -- the request body part has not yet been processed; expect to + * -- hear more later (note: proper handling of this status + * -- response MAY use the polling req/rep PKIMessages specified + * -- in Section 5.3.22; alternatively, polling in the underlying + * -- transport layer MAY have some utility in this regard) + * revocationWarning (4), + * -- this message contains a warning that a revocation is + * -- imminent + * revocationNotification (5), + * -- notification that a revocation has occurred + * keyUpdateWarning (6) + * -- update already done for the oldCertId specified in + * -- CertReqMsg + * } + */ +#define OSSL_CMP_PKISTATUS_rejected_by_client -5 +#define OSSL_CMP_PKISTATUS_checking_response -4 +#define OSSL_CMP_PKISTATUS_request -3 +#define OSSL_CMP_PKISTATUS_trans -2 +#define OSSL_CMP_PKISTATUS_unspecified -1 +#define OSSL_CMP_PKISTATUS_accepted 0 +#define OSSL_CMP_PKISTATUS_grantedWithMods 1 +#define OSSL_CMP_PKISTATUS_rejection 2 +#define OSSL_CMP_PKISTATUS_waiting 3 +#define OSSL_CMP_PKISTATUS_revocationWarning 4 +#define OSSL_CMP_PKISTATUS_revocationNotification 5 +#define OSSL_CMP_PKISTATUS_keyUpdateWarning 6 +typedef ASN1_INTEGER OSSL_CMP_PKISTATUS; + +DECLARE_ASN1_ITEM(OSSL_CMP_PKISTATUS) + +#define OSSL_CMP_CERTORENCCERT_CERTIFICATE 0 +#define OSSL_CMP_CERTORENCCERT_ENCRYPTEDCERT 1 + +/* data type declarations */ +typedef struct ossl_cmp_ctx_st OSSL_CMP_CTX; +typedef struct ossl_cmp_pkiheader_st OSSL_CMP_PKIHEADER; +DECLARE_ASN1_FUNCTIONS(OSSL_CMP_PKIHEADER) +typedef struct ossl_cmp_msg_st OSSL_CMP_MSG; +DECLARE_ASN1_DUP_FUNCTION(OSSL_CMP_MSG) +DECLARE_ASN1_ENCODE_FUNCTIONS(OSSL_CMP_MSG, OSSL_CMP_MSG, OSSL_CMP_MSG) +typedef struct ossl_cmp_certstatus_st OSSL_CMP_CERTSTATUS; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_CERTSTATUS, OSSL_CMP_CERTSTATUS, OSSL_CMP_CERTSTATUS) +#define sk_OSSL_CMP_CERTSTATUS_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_value(sk, idx) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk), (idx))) +#define sk_OSSL_CMP_CERTSTATUS_new(cmp) ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_CERTSTATUS_compfunc_type(cmp))) +#define sk_OSSL_CMP_CERTSTATUS_new_null() ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_CERTSTATUS_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_CERTSTATUS_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_CERTSTATUS_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), (n)) +#define sk_OSSL_CMP_CERTSTATUS_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_delete(sk, i) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), (i))) +#define sk_OSSL_CMP_CERTSTATUS_delete_ptr(sk, ptr) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr))) +#define sk_OSSL_CMP_CERTSTATUS_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr)) +#define sk_OSSL_CMP_CERTSTATUS_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr)) +#define sk_OSSL_CMP_CERTSTATUS_pop(sk) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CERTSTATUS_shift(sk) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CERTSTATUS_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk),ossl_check_OSSL_CMP_CERTSTATUS_freefunc_type(freefunc)) +#define sk_OSSL_CMP_CERTSTATUS_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr), (idx)) +#define sk_OSSL_CMP_CERTSTATUS_set(sk, idx, ptr) ((OSSL_CMP_CERTSTATUS *)OPENSSL_sk_set(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), (idx), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr))) +#define sk_OSSL_CMP_CERTSTATUS_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr)) +#define sk_OSSL_CMP_CERTSTATUS_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr)) +#define sk_OSSL_CMP_CERTSTATUS_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_type(ptr), pnum) +#define sk_OSSL_CMP_CERTSTATUS_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CERTSTATUS_dup(sk) ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CERTSTATUS_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_CERTSTATUS) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_CERTSTATUS_freefunc_type(freefunc))) +#define sk_OSSL_CMP_CERTSTATUS_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_CERTSTATUS_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_CERTSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CERTSTATUS_compfunc_type(cmp))) + +/* clang-format on */ +typedef struct ossl_cmp_itav_st OSSL_CMP_ITAV; +DECLARE_ASN1_DUP_FUNCTION(OSSL_CMP_ITAV) +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_ITAV, OSSL_CMP_ITAV, OSSL_CMP_ITAV) +#define sk_OSSL_CMP_ITAV_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_value(sk, idx) ((OSSL_CMP_ITAV *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk), (idx))) +#define sk_OSSL_CMP_ITAV_new(cmp) ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_ITAV_compfunc_type(cmp))) +#define sk_OSSL_CMP_ITAV_new_null() ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_ITAV_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_ITAV_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_ITAV_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_ITAV_sk_type(sk), (n)) +#define sk_OSSL_CMP_ITAV_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_delete(sk, i) ((OSSL_CMP_ITAV *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_ITAV_sk_type(sk), (i))) +#define sk_OSSL_CMP_ITAV_delete_ptr(sk, ptr) ((OSSL_CMP_ITAV *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr))) +#define sk_OSSL_CMP_ITAV_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr)) +#define sk_OSSL_CMP_ITAV_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr)) +#define sk_OSSL_CMP_ITAV_pop(sk) ((OSSL_CMP_ITAV *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_ITAV_sk_type(sk))) +#define sk_OSSL_CMP_ITAV_shift(sk) ((OSSL_CMP_ITAV *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_ITAV_sk_type(sk))) +#define sk_OSSL_CMP_ITAV_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_ITAV_sk_type(sk),ossl_check_OSSL_CMP_ITAV_freefunc_type(freefunc)) +#define sk_OSSL_CMP_ITAV_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr), (idx)) +#define sk_OSSL_CMP_ITAV_set(sk, idx, ptr) ((OSSL_CMP_ITAV *)OPENSSL_sk_set(ossl_check_OSSL_CMP_ITAV_sk_type(sk), (idx), ossl_check_OSSL_CMP_ITAV_type(ptr))) +#define sk_OSSL_CMP_ITAV_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr)) +#define sk_OSSL_CMP_ITAV_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr)) +#define sk_OSSL_CMP_ITAV_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_type(ptr), pnum) +#define sk_OSSL_CMP_ITAV_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk)) +#define sk_OSSL_CMP_ITAV_dup(sk) ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk))) +#define sk_OSSL_CMP_ITAV_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_ITAV) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_ITAV_freefunc_type(freefunc))) +#define sk_OSSL_CMP_ITAV_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_ITAV_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_ITAV_sk_type(sk), ossl_check_OSSL_CMP_ITAV_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct ossl_cmp_crlstatus_st OSSL_CMP_CRLSTATUS; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_CRLSTATUS, OSSL_CMP_CRLSTATUS, OSSL_CMP_CRLSTATUS) +#define sk_OSSL_CMP_CRLSTATUS_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_CRLSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CRLSTATUS_value(sk, idx) ((OSSL_CMP_CRLSTATUS *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_CRLSTATUS_sk_type(sk), (idx))) +#define sk_OSSL_CMP_CRLSTATUS_new(cmp) ((STACK_OF(OSSL_CMP_CRLSTATUS) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_CRLSTATUS_compfunc_type(cmp))) +#define sk_OSSL_CMP_CRLSTATUS_new_null() ((STACK_OF(OSSL_CMP_CRLSTATUS) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_CRLSTATUS_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_CRLSTATUS) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_CRLSTATUS_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_CRLSTATUS_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), (n)) +#define sk_OSSL_CMP_CRLSTATUS_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CRLSTATUS_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CRLSTATUS_delete(sk, i) ((OSSL_CMP_CRLSTATUS *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), (i))) +#define sk_OSSL_CMP_CRLSTATUS_delete_ptr(sk, ptr) ((OSSL_CMP_CRLSTATUS *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr))) +#define sk_OSSL_CMP_CRLSTATUS_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr)) +#define sk_OSSL_CMP_CRLSTATUS_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr)) +#define sk_OSSL_CMP_CRLSTATUS_pop(sk) ((OSSL_CMP_CRLSTATUS *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CRLSTATUS_shift(sk) ((OSSL_CMP_CRLSTATUS *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CRLSTATUS_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk),ossl_check_OSSL_CMP_CRLSTATUS_freefunc_type(freefunc)) +#define sk_OSSL_CMP_CRLSTATUS_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr), (idx)) +#define sk_OSSL_CMP_CRLSTATUS_set(sk, idx, ptr) ((OSSL_CMP_CRLSTATUS *)OPENSSL_sk_set(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), (idx), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr))) +#define sk_OSSL_CMP_CRLSTATUS_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr)) +#define sk_OSSL_CMP_CRLSTATUS_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr)) +#define sk_OSSL_CMP_CRLSTATUS_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_type(ptr), pnum) +#define sk_OSSL_CMP_CRLSTATUS_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CRLSTATUS_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_CRLSTATUS_sk_type(sk)) +#define sk_OSSL_CMP_CRLSTATUS_dup(sk) ((STACK_OF(OSSL_CMP_CRLSTATUS) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_CRLSTATUS_sk_type(sk))) +#define sk_OSSL_CMP_CRLSTATUS_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_CRLSTATUS) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_CRLSTATUS_freefunc_type(freefunc))) +#define sk_OSSL_CMP_CRLSTATUS_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_CRLSTATUS_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_CRLSTATUS_sk_type(sk), ossl_check_OSSL_CMP_CRLSTATUS_compfunc_type(cmp))) + +/* clang-format on */ + +typedef OSSL_CRMF_ATTRIBUTETYPEANDVALUE OSSL_CMP_ATAV; +#define OSSL_CMP_ATAV_free OSSL_CRMF_ATTRIBUTETYPEANDVALUE_free +typedef STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) OSSL_CMP_ATAVS; +DECLARE_ASN1_FUNCTIONS(OSSL_CMP_ATAVS) +#define stack_st_OSSL_CMP_ATAV stack_st_OSSL_CRMF_ATTRIBUTETYPEANDVALUE +#define sk_OSSL_CMP_ATAV_num sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_num +#define sk_OSSL_CMP_ATAV_value sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_value +#define sk_OSSL_CMP_ATAV_push sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_push +#define sk_OSSL_CMP_ATAV_pop_free sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_pop_free + +typedef struct ossl_cmp_revrepcontent_st OSSL_CMP_REVREPCONTENT; +typedef struct ossl_cmp_pkisi_st OSSL_CMP_PKISI; +DECLARE_ASN1_FUNCTIONS(OSSL_CMP_PKISI) +DECLARE_ASN1_DUP_FUNCTION(OSSL_CMP_PKISI) +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_PKISI, OSSL_CMP_PKISI, OSSL_CMP_PKISI) +#define sk_OSSL_CMP_PKISI_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_value(sk, idx) ((OSSL_CMP_PKISI *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk), (idx))) +#define sk_OSSL_CMP_PKISI_new(cmp) ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_PKISI_compfunc_type(cmp))) +#define sk_OSSL_CMP_PKISI_new_null() ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_PKISI_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_PKISI_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_PKISI_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_PKISI_sk_type(sk), (n)) +#define sk_OSSL_CMP_PKISI_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_delete(sk, i) ((OSSL_CMP_PKISI *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_PKISI_sk_type(sk), (i))) +#define sk_OSSL_CMP_PKISI_delete_ptr(sk, ptr) ((OSSL_CMP_PKISI *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr))) +#define sk_OSSL_CMP_PKISI_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr)) +#define sk_OSSL_CMP_PKISI_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr)) +#define sk_OSSL_CMP_PKISI_pop(sk) ((OSSL_CMP_PKISI *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_PKISI_sk_type(sk))) +#define sk_OSSL_CMP_PKISI_shift(sk) ((OSSL_CMP_PKISI *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_PKISI_sk_type(sk))) +#define sk_OSSL_CMP_PKISI_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_PKISI_sk_type(sk),ossl_check_OSSL_CMP_PKISI_freefunc_type(freefunc)) +#define sk_OSSL_CMP_PKISI_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr), (idx)) +#define sk_OSSL_CMP_PKISI_set(sk, idx, ptr) ((OSSL_CMP_PKISI *)OPENSSL_sk_set(ossl_check_OSSL_CMP_PKISI_sk_type(sk), (idx), ossl_check_OSSL_CMP_PKISI_type(ptr))) +#define sk_OSSL_CMP_PKISI_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr)) +#define sk_OSSL_CMP_PKISI_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr)) +#define sk_OSSL_CMP_PKISI_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_type(ptr), pnum) +#define sk_OSSL_CMP_PKISI_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk)) +#define sk_OSSL_CMP_PKISI_dup(sk) ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk))) +#define sk_OSSL_CMP_PKISI_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_PKISI) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_PKISI_freefunc_type(freefunc))) +#define sk_OSSL_CMP_PKISI_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_PKISI_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_PKISI_sk_type(sk), ossl_check_OSSL_CMP_PKISI_compfunc_type(cmp))) + +/* clang-format on */ +typedef struct ossl_cmp_certrepmessage_st OSSL_CMP_CERTREPMESSAGE; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_CERTREPMESSAGE, OSSL_CMP_CERTREPMESSAGE, OSSL_CMP_CERTREPMESSAGE) +#define sk_OSSL_CMP_CERTREPMESSAGE_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_value(sk, idx) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), (idx))) +#define sk_OSSL_CMP_CERTREPMESSAGE_new(cmp) ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_CERTREPMESSAGE_compfunc_type(cmp))) +#define sk_OSSL_CMP_CERTREPMESSAGE_new_null() ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_CERTREPMESSAGE_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_CERTREPMESSAGE_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_CERTREPMESSAGE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), (n)) +#define sk_OSSL_CMP_CERTREPMESSAGE_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_delete(sk, i) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), (i))) +#define sk_OSSL_CMP_CERTREPMESSAGE_delete_ptr(sk, ptr) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr))) +#define sk_OSSL_CMP_CERTREPMESSAGE_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr)) +#define sk_OSSL_CMP_CERTREPMESSAGE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr)) +#define sk_OSSL_CMP_CERTREPMESSAGE_pop(sk) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk))) +#define sk_OSSL_CMP_CERTREPMESSAGE_shift(sk) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk))) +#define sk_OSSL_CMP_CERTREPMESSAGE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk),ossl_check_OSSL_CMP_CERTREPMESSAGE_freefunc_type(freefunc)) +#define sk_OSSL_CMP_CERTREPMESSAGE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr), (idx)) +#define sk_OSSL_CMP_CERTREPMESSAGE_set(sk, idx, ptr) ((OSSL_CMP_CERTREPMESSAGE *)OPENSSL_sk_set(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), (idx), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr))) +#define sk_OSSL_CMP_CERTREPMESSAGE_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr)) +#define sk_OSSL_CMP_CERTREPMESSAGE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr)) +#define sk_OSSL_CMP_CERTREPMESSAGE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_type(ptr), pnum) +#define sk_OSSL_CMP_CERTREPMESSAGE_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk)) +#define sk_OSSL_CMP_CERTREPMESSAGE_dup(sk) ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk))) +#define sk_OSSL_CMP_CERTREPMESSAGE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_CERTREPMESSAGE) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_CERTREPMESSAGE_freefunc_type(freefunc))) +#define sk_OSSL_CMP_CERTREPMESSAGE_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_CERTREPMESSAGE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_CERTREPMESSAGE_sk_type(sk), ossl_check_OSSL_CMP_CERTREPMESSAGE_compfunc_type(cmp))) + +/* clang-format on */ +typedef struct ossl_cmp_pollrep_st OSSL_CMP_POLLREP; +typedef STACK_OF(OSSL_CMP_POLLREP) OSSL_CMP_POLLREPCONTENT; +typedef struct ossl_cmp_certresponse_st OSSL_CMP_CERTRESPONSE; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CMP_CERTRESPONSE, OSSL_CMP_CERTRESPONSE, OSSL_CMP_CERTRESPONSE) +#define sk_OSSL_CMP_CERTRESPONSE_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_value(sk, idx) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_value(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk), (idx))) +#define sk_OSSL_CMP_CERTRESPONSE_new(cmp) ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_new(ossl_check_OSSL_CMP_CERTRESPONSE_compfunc_type(cmp))) +#define sk_OSSL_CMP_CERTRESPONSE_new_null() ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CMP_CERTRESPONSE_new_reserve(cmp, n) ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CMP_CERTRESPONSE_compfunc_type(cmp), (n))) +#define sk_OSSL_CMP_CERTRESPONSE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), (n)) +#define sk_OSSL_CMP_CERTRESPONSE_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_delete(sk, i) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_delete(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), (i))) +#define sk_OSSL_CMP_CERTRESPONSE_delete_ptr(sk, ptr) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr))) +#define sk_OSSL_CMP_CERTRESPONSE_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr)) +#define sk_OSSL_CMP_CERTRESPONSE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr)) +#define sk_OSSL_CMP_CERTRESPONSE_pop(sk) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_pop(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk))) +#define sk_OSSL_CMP_CERTRESPONSE_shift(sk) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_shift(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk))) +#define sk_OSSL_CMP_CERTRESPONSE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk),ossl_check_OSSL_CMP_CERTRESPONSE_freefunc_type(freefunc)) +#define sk_OSSL_CMP_CERTRESPONSE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr), (idx)) +#define sk_OSSL_CMP_CERTRESPONSE_set(sk, idx, ptr) ((OSSL_CMP_CERTRESPONSE *)OPENSSL_sk_set(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), (idx), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr))) +#define sk_OSSL_CMP_CERTRESPONSE_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr)) +#define sk_OSSL_CMP_CERTRESPONSE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr)) +#define sk_OSSL_CMP_CERTRESPONSE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_type(ptr), pnum) +#define sk_OSSL_CMP_CERTRESPONSE_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk)) +#define sk_OSSL_CMP_CERTRESPONSE_dup(sk) ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk))) +#define sk_OSSL_CMP_CERTRESPONSE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CMP_CERTRESPONSE) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_copyfunc_type(copyfunc), ossl_check_OSSL_CMP_CERTRESPONSE_freefunc_type(freefunc))) +#define sk_OSSL_CMP_CERTRESPONSE_set_cmp_func(sk, cmp) ((sk_OSSL_CMP_CERTRESPONSE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CMP_CERTRESPONSE_sk_type(sk), ossl_check_OSSL_CMP_CERTRESPONSE_compfunc_type(cmp))) + +/* clang-format on */ +typedef STACK_OF(ASN1_UTF8STRING) OSSL_CMP_PKIFREETEXT; + +/* + * function DECLARATIONS + */ + +/* from cmp_asn.c */ +OSSL_CMP_ITAV *OSSL_CMP_ITAV_create(ASN1_OBJECT *type, ASN1_TYPE *value); +void OSSL_CMP_ITAV_set0(OSSL_CMP_ITAV *itav, ASN1_OBJECT *type, + ASN1_TYPE *value); +ASN1_OBJECT *OSSL_CMP_ITAV_get0_type(const OSSL_CMP_ITAV *itav); +ASN1_TYPE *OSSL_CMP_ITAV_get0_value(const OSSL_CMP_ITAV *itav); +int OSSL_CMP_ITAV_push0_stack_item(STACK_OF(OSSL_CMP_ITAV) **sk_p, + OSSL_CMP_ITAV *itav); +void OSSL_CMP_ITAV_free(OSSL_CMP_ITAV *itav); + +OSSL_CMP_ITAV *OSSL_CMP_ITAV_new0_certProfile(STACK_OF(ASN1_UTF8STRING) + *certProfile); +int OSSL_CMP_ITAV_get0_certProfile(const OSSL_CMP_ITAV *itav, + STACK_OF(ASN1_UTF8STRING) **out); +OSSL_CMP_ITAV *OSSL_CMP_ITAV_new_caCerts(const STACK_OF(X509) *caCerts); +int OSSL_CMP_ITAV_get0_caCerts(const OSSL_CMP_ITAV *itav, STACK_OF(X509) **out); + +OSSL_CMP_ITAV *OSSL_CMP_ITAV_new_rootCaCert(const X509 *rootCaCert); +int OSSL_CMP_ITAV_get0_rootCaCert(const OSSL_CMP_ITAV *itav, X509 **out); +OSSL_CMP_ITAV *OSSL_CMP_ITAV_new_rootCaKeyUpdate(const X509 *newWithNew, + const X509 *newWithOld, + const X509 *oldWithNew); +int OSSL_CMP_ITAV_get0_rootCaKeyUpdate(const OSSL_CMP_ITAV *itav, + X509 **newWithNew, + X509 **newWithOld, + X509 **oldWithNew); + +OSSL_CMP_CRLSTATUS *OSSL_CMP_CRLSTATUS_create(const X509_CRL *crl, + const X509 *cert, int only_DN); +OSSL_CMP_CRLSTATUS *OSSL_CMP_CRLSTATUS_new1(const DIST_POINT_NAME *dpn, + const GENERAL_NAMES *issuer, + const ASN1_TIME *thisUpdate); +int OSSL_CMP_CRLSTATUS_get0(const OSSL_CMP_CRLSTATUS *crlstatus, + DIST_POINT_NAME **dpn, GENERAL_NAMES **issuer, + ASN1_TIME **thisUpdate); +void OSSL_CMP_CRLSTATUS_free(OSSL_CMP_CRLSTATUS *crlstatus); +OSSL_CMP_ITAV +*OSSL_CMP_ITAV_new0_crlStatusList(STACK_OF(OSSL_CMP_CRLSTATUS) *crlStatusList); +int OSSL_CMP_ITAV_get0_crlStatusList(const OSSL_CMP_ITAV *itav, + STACK_OF(OSSL_CMP_CRLSTATUS) **out); +OSSL_CMP_ITAV *OSSL_CMP_ITAV_new_crls(const X509_CRL *crls); +int OSSL_CMP_ITAV_get0_crls(const OSSL_CMP_ITAV *it, STACK_OF(X509_CRL) **out); +OSSL_CMP_ITAV +*OSSL_CMP_ITAV_new0_certReqTemplate(OSSL_CRMF_CERTTEMPLATE *certTemplate, + OSSL_CMP_ATAVS *keySpec); +int OSSL_CMP_ITAV_get1_certReqTemplate(const OSSL_CMP_ITAV *itav, + OSSL_CRMF_CERTTEMPLATE **certTemplate, + OSSL_CMP_ATAVS **keySpec); + +OSSL_CMP_ATAV *OSSL_CMP_ATAV_create(ASN1_OBJECT *type, ASN1_TYPE *value); +void OSSL_CMP_ATAV_set0(OSSL_CMP_ATAV *itav, ASN1_OBJECT *type, + ASN1_TYPE *value); +ASN1_OBJECT *OSSL_CMP_ATAV_get0_type(const OSSL_CMP_ATAV *itav); +ASN1_TYPE *OSSL_CMP_ATAV_get0_value(const OSSL_CMP_ATAV *itav); +OSSL_CMP_ATAV *OSSL_CMP_ATAV_new_algId(const X509_ALGOR *alg); +X509_ALGOR *OSSL_CMP_ATAV_get0_algId(const OSSL_CMP_ATAV *atav); +OSSL_CMP_ATAV *OSSL_CMP_ATAV_new_rsaKeyLen(int len); +int OSSL_CMP_ATAV_get_rsaKeyLen(const OSSL_CMP_ATAV *atav); +int OSSL_CMP_ATAV_push1(OSSL_CMP_ATAVS **sk_p, const OSSL_CMP_ATAV *atav); + +void OSSL_CMP_MSG_free(OSSL_CMP_MSG *msg); + +/* from cmp_ctx.c */ +OSSL_CMP_CTX *OSSL_CMP_CTX_new(OSSL_LIB_CTX *libctx, const char *propq); +void OSSL_CMP_CTX_free(OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_reinit(OSSL_CMP_CTX *ctx); +OSSL_LIB_CTX *OSSL_CMP_CTX_get0_libctx(const OSSL_CMP_CTX *ctx); +const char *OSSL_CMP_CTX_get0_propq(const OSSL_CMP_CTX *ctx); +/* CMP general options: */ +#define OSSL_CMP_OPT_LOG_VERBOSITY 0 +/* CMP transfer options: */ +#define OSSL_CMP_OPT_KEEP_ALIVE 10 +#define OSSL_CMP_OPT_MSG_TIMEOUT 11 +#define OSSL_CMP_OPT_TOTAL_TIMEOUT 12 +#define OSSL_CMP_OPT_USE_TLS 13 +/* CMP request options: */ +#define OSSL_CMP_OPT_VALIDITY_DAYS 20 +#define OSSL_CMP_OPT_SUBJECTALTNAME_NODEFAULT 21 +#define OSSL_CMP_OPT_SUBJECTALTNAME_CRITICAL 22 +#define OSSL_CMP_OPT_POLICIES_CRITICAL 23 +#define OSSL_CMP_OPT_POPO_METHOD 24 +#define OSSL_CMP_OPT_IMPLICIT_CONFIRM 25 +#define OSSL_CMP_OPT_DISABLE_CONFIRM 26 +#define OSSL_CMP_OPT_REVOCATION_REASON 27 +/* CMP protection options: */ +#define OSSL_CMP_OPT_UNPROTECTED_SEND 30 +#define OSSL_CMP_OPT_UNPROTECTED_ERRORS 31 +#define OSSL_CMP_OPT_OWF_ALGNID 32 +#define OSSL_CMP_OPT_MAC_ALGNID 33 +#define OSSL_CMP_OPT_DIGEST_ALGNID 34 +#define OSSL_CMP_OPT_IGNORE_KEYUSAGE 35 +#define OSSL_CMP_OPT_PERMIT_TA_IN_EXTRACERTS_FOR_IR 36 +#define OSSL_CMP_OPT_NO_CACHE_EXTRACERTS 37 +int OSSL_CMP_CTX_set_option(OSSL_CMP_CTX *ctx, int opt, int val); +int OSSL_CMP_CTX_get_option(const OSSL_CMP_CTX *ctx, int opt); +/* CMP-specific callback for logging and outputting the error queue: */ +int OSSL_CMP_CTX_set_log_cb(OSSL_CMP_CTX *ctx, OSSL_CMP_log_cb_t cb); +#define OSSL_CMP_CTX_set_log_verbosity(ctx, level) \ + OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_LOG_VERBOSITY, level) +void OSSL_CMP_CTX_print_errors(const OSSL_CMP_CTX *ctx); +/* message transfer: */ +int OSSL_CMP_CTX_set1_serverPath(OSSL_CMP_CTX *ctx, const char *path); +int OSSL_CMP_CTX_set1_server(OSSL_CMP_CTX *ctx, const char *address); +int OSSL_CMP_CTX_set_serverPort(OSSL_CMP_CTX *ctx, int port); +int OSSL_CMP_CTX_set1_proxy(OSSL_CMP_CTX *ctx, const char *name); +int OSSL_CMP_CTX_set1_no_proxy(OSSL_CMP_CTX *ctx, const char *names); +#ifndef OPENSSL_NO_HTTP +int OSSL_CMP_CTX_set_http_cb(OSSL_CMP_CTX *ctx, OSSL_HTTP_bio_cb_t cb); +int OSSL_CMP_CTX_set_http_cb_arg(OSSL_CMP_CTX *ctx, void *arg); +void *OSSL_CMP_CTX_get_http_cb_arg(const OSSL_CMP_CTX *ctx); +#endif +typedef OSSL_CMP_MSG *(*OSSL_CMP_transfer_cb_t)(OSSL_CMP_CTX *ctx, + const OSSL_CMP_MSG *req); +int OSSL_CMP_CTX_set_transfer_cb(OSSL_CMP_CTX *ctx, OSSL_CMP_transfer_cb_t cb); +int OSSL_CMP_CTX_set_transfer_cb_arg(OSSL_CMP_CTX *ctx, void *arg); +void *OSSL_CMP_CTX_get_transfer_cb_arg(const OSSL_CMP_CTX *ctx); +/* server authentication: */ +int OSSL_CMP_CTX_set1_srvCert(OSSL_CMP_CTX *ctx, X509 *cert); +int OSSL_CMP_CTX_set1_expected_sender(OSSL_CMP_CTX *ctx, const X509_NAME *name); +int OSSL_CMP_CTX_set0_trustedStore(OSSL_CMP_CTX *ctx, X509_STORE *store); +#define OSSL_CMP_CTX_set0_trusted OSSL_CMP_CTX_set0_trustedStore +X509_STORE *OSSL_CMP_CTX_get0_trustedStore(const OSSL_CMP_CTX *ctx); +#define OSSL_CMP_CTX_get0_trusted OSSL_CMP_CTX_get0_trustedStore +int OSSL_CMP_CTX_set1_untrusted(OSSL_CMP_CTX *ctx, STACK_OF(X509) *certs); +STACK_OF(X509) *OSSL_CMP_CTX_get0_untrusted(const OSSL_CMP_CTX *ctx); +/* client authentication: */ +int OSSL_CMP_CTX_set1_cert(OSSL_CMP_CTX *ctx, X509 *cert); +int OSSL_CMP_CTX_build_cert_chain(OSSL_CMP_CTX *ctx, X509_STORE *own_trusted, + STACK_OF(X509) *candidates); +int OSSL_CMP_CTX_set1_pkey(OSSL_CMP_CTX *ctx, EVP_PKEY *pkey); +int OSSL_CMP_CTX_set1_referenceValue(OSSL_CMP_CTX *ctx, + const unsigned char *ref, int len); +int OSSL_CMP_CTX_set1_secretValue(OSSL_CMP_CTX *ctx, + const unsigned char *sec, int len); +/* CMP message header and extra certificates: */ +int OSSL_CMP_CTX_set1_recipient(OSSL_CMP_CTX *ctx, const X509_NAME *name); +int OSSL_CMP_CTX_push0_geninfo_ITAV(OSSL_CMP_CTX *ctx, OSSL_CMP_ITAV *itav); +int OSSL_CMP_CTX_reset_geninfo_ITAVs(OSSL_CMP_CTX *ctx); +STACK_OF(OSSL_CMP_ITAV) +*OSSL_CMP_CTX_get0_geninfo_ITAVs(const OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_set1_extraCertsOut(OSSL_CMP_CTX *ctx, + STACK_OF(X509) *extraCertsOut); +/* certificate template: */ +int OSSL_CMP_CTX_set0_newPkey(OSSL_CMP_CTX *ctx, int priv, EVP_PKEY *pkey); +EVP_PKEY *OSSL_CMP_CTX_get0_newPkey(const OSSL_CMP_CTX *ctx, int priv); +int OSSL_CMP_CTX_set1_issuer(OSSL_CMP_CTX *ctx, const X509_NAME *name); +int OSSL_CMP_CTX_set1_serialNumber(OSSL_CMP_CTX *ctx, const ASN1_INTEGER *sn); +int OSSL_CMP_CTX_set1_subjectName(OSSL_CMP_CTX *ctx, const X509_NAME *name); +int OSSL_CMP_CTX_push1_subjectAltName(OSSL_CMP_CTX *ctx, + const GENERAL_NAME *name); +int OSSL_CMP_CTX_set0_reqExtensions(OSSL_CMP_CTX *ctx, X509_EXTENSIONS *exts); +int OSSL_CMP_CTX_reqExtensions_have_SAN(OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_push0_policy(OSSL_CMP_CTX *ctx, POLICYINFO *pinfo); +int OSSL_CMP_CTX_set1_oldCert(OSSL_CMP_CTX *ctx, X509 *cert); +int OSSL_CMP_CTX_set1_p10CSR(OSSL_CMP_CTX *ctx, const X509_REQ *csr); +/* misc body contents: */ +int OSSL_CMP_CTX_push0_genm_ITAV(OSSL_CMP_CTX *ctx, OSSL_CMP_ITAV *itav); +/* certificate confirmation: */ +typedef int (*OSSL_CMP_certConf_cb_t)(OSSL_CMP_CTX *ctx, X509 *cert, + int fail_info, const char **txt); +int OSSL_CMP_certConf_cb(OSSL_CMP_CTX *ctx, X509 *cert, int fail_info, + const char **text); +int OSSL_CMP_CTX_set_certConf_cb(OSSL_CMP_CTX *ctx, OSSL_CMP_certConf_cb_t cb); +int OSSL_CMP_CTX_set_certConf_cb_arg(OSSL_CMP_CTX *ctx, void *arg); +void *OSSL_CMP_CTX_get_certConf_cb_arg(const OSSL_CMP_CTX *ctx); +/* result fetching: */ +int OSSL_CMP_CTX_get_status(const OSSL_CMP_CTX *ctx); +OSSL_CMP_PKIFREETEXT *OSSL_CMP_CTX_get0_statusString(const OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_get_failInfoCode(const OSSL_CMP_CTX *ctx); +#define OSSL_CMP_PKISI_BUFLEN 1024 +X509 *OSSL_CMP_CTX_get0_validatedSrvCert(const OSSL_CMP_CTX *ctx); +X509 *OSSL_CMP_CTX_get0_newCert(const OSSL_CMP_CTX *ctx); +STACK_OF(X509) *OSSL_CMP_CTX_get1_newChain(const OSSL_CMP_CTX *ctx); +STACK_OF(X509) *OSSL_CMP_CTX_get1_caPubs(const OSSL_CMP_CTX *ctx); +STACK_OF(X509) *OSSL_CMP_CTX_get1_extraCertsIn(const OSSL_CMP_CTX *ctx); +int OSSL_CMP_CTX_set1_transactionID(OSSL_CMP_CTX *ctx, + const ASN1_OCTET_STRING *id); +int OSSL_CMP_CTX_set1_senderNonce(OSSL_CMP_CTX *ctx, + const ASN1_OCTET_STRING *nonce); + +/* from cmp_status.c */ +char *OSSL_CMP_CTX_snprint_PKIStatus(const OSSL_CMP_CTX *ctx, char *buf, + size_t bufsize); +char *OSSL_CMP_snprint_PKIStatusInfo(const OSSL_CMP_PKISI *statusInfo, + char *buf, size_t bufsize); +OSSL_CMP_PKISI * +OSSL_CMP_STATUSINFO_new(int status, int fail_info, const char *text); + +/* from cmp_hdr.c */ +ASN1_OCTET_STRING *OSSL_CMP_HDR_get0_transactionID(const OSSL_CMP_PKIHEADER *hdr); +ASN1_OCTET_STRING *OSSL_CMP_HDR_get0_recipNonce(const OSSL_CMP_PKIHEADER *hdr); +STACK_OF(OSSL_CMP_ITAV) +*OSSL_CMP_HDR_get0_geninfo_ITAVs(const OSSL_CMP_PKIHEADER *hdr); + +/* from cmp_msg.c */ +OSSL_CMP_PKIHEADER *OSSL_CMP_MSG_get0_header(const OSSL_CMP_MSG *msg); +int OSSL_CMP_MSG_get_bodytype(const OSSL_CMP_MSG *msg); +X509_PUBKEY *OSSL_CMP_MSG_get0_certreq_publickey(const OSSL_CMP_MSG *msg); +int OSSL_CMP_MSG_update_transactionID(OSSL_CMP_CTX *ctx, OSSL_CMP_MSG *msg); +int OSSL_CMP_MSG_update_recipNonce(OSSL_CMP_CTX *ctx, OSSL_CMP_MSG *msg); +OSSL_CRMF_MSG *OSSL_CMP_CTX_setup_CRM(OSSL_CMP_CTX *ctx, int for_KUR, int rid); +OSSL_CMP_MSG *OSSL_CMP_MSG_read(const char *file, OSSL_LIB_CTX *libctx, + const char *propq); +int OSSL_CMP_MSG_write(const char *file, const OSSL_CMP_MSG *msg); +OSSL_CMP_MSG *d2i_OSSL_CMP_MSG_bio(BIO *bio, OSSL_CMP_MSG **msg); +int i2d_OSSL_CMP_MSG_bio(BIO *bio, const OSSL_CMP_MSG *msg); + +/* from cmp_vfy.c */ +int OSSL_CMP_validate_msg(OSSL_CMP_CTX *ctx, const OSSL_CMP_MSG *msg); +int OSSL_CMP_validate_cert_path(const OSSL_CMP_CTX *ctx, + X509_STORE *trusted_store, X509 *cert); + +/* from cmp_http.c */ +#ifndef OPENSSL_NO_HTTP +OSSL_CMP_MSG *OSSL_CMP_MSG_http_perform(OSSL_CMP_CTX *ctx, + const OSSL_CMP_MSG *req); +#endif + +/* from cmp_server.c */ +typedef struct ossl_cmp_srv_ctx_st OSSL_CMP_SRV_CTX; +OSSL_CMP_MSG *OSSL_CMP_SRV_process_request(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req); +OSSL_CMP_MSG *OSSL_CMP_CTX_server_perform(OSSL_CMP_CTX *client_ctx, + const OSSL_CMP_MSG *req); +OSSL_CMP_SRV_CTX *OSSL_CMP_SRV_CTX_new(OSSL_LIB_CTX *libctx, const char *propq); +void OSSL_CMP_SRV_CTX_free(OSSL_CMP_SRV_CTX *srv_ctx); +typedef OSSL_CMP_PKISI *(*OSSL_CMP_SRV_cert_request_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, const OSSL_CMP_MSG *req, int certReqId, + const OSSL_CRMF_MSG *crm, const X509_REQ *p10cr, + X509 **certOut, STACK_OF(X509) **chainOut, STACK_OF(X509) **caPubs); +typedef OSSL_CMP_PKISI *(*OSSL_CMP_SRV_rr_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, + const X509_NAME *issuer, + const ASN1_INTEGER *serial); +typedef int (*OSSL_CMP_SRV_genm_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, + const STACK_OF(OSSL_CMP_ITAV) *in, + STACK_OF(OSSL_CMP_ITAV) **out); +typedef void (*OSSL_CMP_SRV_error_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, + const OSSL_CMP_PKISI *statusInfo, + const ASN1_INTEGER *errorCode, + const OSSL_CMP_PKIFREETEXT *errDetails); +typedef int (*OSSL_CMP_SRV_certConf_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, + int certReqId, + const ASN1_OCTET_STRING *certHash, + const OSSL_CMP_PKISI *si); +typedef int (*OSSL_CMP_SRV_pollReq_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req, int certReqId, + OSSL_CMP_MSG **certReq, + int64_t *check_after); +int OSSL_CMP_SRV_CTX_init(OSSL_CMP_SRV_CTX *srv_ctx, void *custom_ctx, + OSSL_CMP_SRV_cert_request_cb_t process_cert_request, + OSSL_CMP_SRV_rr_cb_t process_rr, + OSSL_CMP_SRV_genm_cb_t process_genm, + OSSL_CMP_SRV_error_cb_t process_error, + OSSL_CMP_SRV_certConf_cb_t process_certConf, + OSSL_CMP_SRV_pollReq_cb_t process_pollReq); +typedef int (*OSSL_CMP_SRV_delayed_delivery_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const OSSL_CMP_MSG *req); +typedef int (*OSSL_CMP_SRV_clean_transaction_cb_t)(OSSL_CMP_SRV_CTX *srv_ctx, + const ASN1_OCTET_STRING *id); +int OSSL_CMP_SRV_CTX_init_trans(OSSL_CMP_SRV_CTX *srv_ctx, + OSSL_CMP_SRV_delayed_delivery_cb_t delay, + OSSL_CMP_SRV_clean_transaction_cb_t clean); +OSSL_CMP_CTX *OSSL_CMP_SRV_CTX_get0_cmp_ctx(const OSSL_CMP_SRV_CTX *srv_ctx); +void *OSSL_CMP_SRV_CTX_get0_custom_ctx(const OSSL_CMP_SRV_CTX *srv_ctx); +int OSSL_CMP_SRV_CTX_set_send_unprotected_errors(OSSL_CMP_SRV_CTX *srv_ctx, + int val); +int OSSL_CMP_SRV_CTX_set_accept_unprotected(OSSL_CMP_SRV_CTX *srv_ctx, int val); +int OSSL_CMP_SRV_CTX_set_accept_raverified(OSSL_CMP_SRV_CTX *srv_ctx, int val); +int OSSL_CMP_SRV_CTX_set_grant_implicit_confirm(OSSL_CMP_SRV_CTX *srv_ctx, + int val); + +/* from cmp_client.c */ +X509 *OSSL_CMP_exec_certreq(OSSL_CMP_CTX *ctx, int req_type, + const OSSL_CRMF_MSG *crm); +#define OSSL_CMP_IR 0 +#define OSSL_CMP_CR 2 +#define OSSL_CMP_P10CR 4 +#define OSSL_CMP_KUR 7 +#define OSSL_CMP_GENM 21 +#define OSSL_CMP_ERROR 23 +#define OSSL_CMP_exec_IR_ses(ctx) \ + OSSL_CMP_exec_certreq(ctx, OSSL_CMP_IR, NULL) +#define OSSL_CMP_exec_CR_ses(ctx) \ + OSSL_CMP_exec_certreq(ctx, OSSL_CMP_CR, NULL) +#define OSSL_CMP_exec_P10CR_ses(ctx) \ + OSSL_CMP_exec_certreq(ctx, OSSL_CMP_P10CR, NULL) +#define OSSL_CMP_exec_KUR_ses(ctx) \ + OSSL_CMP_exec_certreq(ctx, OSSL_CMP_KUR, NULL) +int OSSL_CMP_try_certreq(OSSL_CMP_CTX *ctx, int req_type, + const OSSL_CRMF_MSG *crm, int *checkAfter); +int OSSL_CMP_exec_RR_ses(OSSL_CMP_CTX *ctx); +STACK_OF(OSSL_CMP_ITAV) *OSSL_CMP_exec_GENM_ses(OSSL_CMP_CTX *ctx); + +/* from cmp_genm.c */ +int OSSL_CMP_get1_caCerts(OSSL_CMP_CTX *ctx, STACK_OF(X509) **out); +int OSSL_CMP_get1_rootCaKeyUpdate(OSSL_CMP_CTX *ctx, + const X509 *oldWithOld, X509 **newWithNew, + X509 **newWithOld, X509 **oldWithNew); +int OSSL_CMP_get1_crlUpdate(OSSL_CMP_CTX *ctx, const X509 *crlcert, + const X509_CRL *last_crl, + X509_CRL **crl); +int OSSL_CMP_get1_certReqTemplate(OSSL_CMP_CTX *ctx, + OSSL_CRMF_CERTTEMPLATE **certTemplate, + OSSL_CMP_ATAVS **keySpec); + +#ifdef __cplusplus +} +#endif +#endif /* !defined(OPENSSL_NO_CMP) */ +#endif /* !defined(OPENSSL_CMP_H) */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/cms.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/cms.h new file mode 100644 index 000000000000..e590224acae5 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/cms.h @@ -0,0 +1,515 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/cms.h.in + * + * Copyright 2008-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_CMS_H +#define OPENSSL_CMS_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_CMS_H +#endif + +#include + +#ifndef OPENSSL_NO_CMS +#include +#include +#include +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct CMS_EnvelopedData_st CMS_EnvelopedData; +typedef struct CMS_ContentInfo_st CMS_ContentInfo; +typedef struct CMS_SignerInfo_st CMS_SignerInfo; +typedef struct CMS_SignedData_st CMS_SignedData; +typedef struct CMS_CertificateChoices CMS_CertificateChoices; +typedef struct CMS_RevocationInfoChoice_st CMS_RevocationInfoChoice; +typedef struct CMS_RecipientInfo_st CMS_RecipientInfo; +typedef struct CMS_ReceiptRequest_st CMS_ReceiptRequest; +typedef struct CMS_Receipt_st CMS_Receipt; +typedef struct CMS_RecipientEncryptedKey_st CMS_RecipientEncryptedKey; +typedef struct CMS_OtherKeyAttribute_st CMS_OtherKeyAttribute; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(CMS_SignerInfo, CMS_SignerInfo, CMS_SignerInfo) +#define sk_CMS_SignerInfo_num(sk) OPENSSL_sk_num(ossl_check_const_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_value(sk, idx) ((CMS_SignerInfo *)OPENSSL_sk_value(ossl_check_const_CMS_SignerInfo_sk_type(sk), (idx))) +#define sk_CMS_SignerInfo_new(cmp) ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_new(ossl_check_CMS_SignerInfo_compfunc_type(cmp))) +#define sk_CMS_SignerInfo_new_null() ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_new_null()) +#define sk_CMS_SignerInfo_new_reserve(cmp, n) ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_new_reserve(ossl_check_CMS_SignerInfo_compfunc_type(cmp), (n))) +#define sk_CMS_SignerInfo_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CMS_SignerInfo_sk_type(sk), (n)) +#define sk_CMS_SignerInfo_free(sk) OPENSSL_sk_free(ossl_check_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_zero(sk) OPENSSL_sk_zero(ossl_check_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_delete(sk, i) ((CMS_SignerInfo *)OPENSSL_sk_delete(ossl_check_CMS_SignerInfo_sk_type(sk), (i))) +#define sk_CMS_SignerInfo_delete_ptr(sk, ptr) ((CMS_SignerInfo *)OPENSSL_sk_delete_ptr(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr))) +#define sk_CMS_SignerInfo_push(sk, ptr) OPENSSL_sk_push(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr)) +#define sk_CMS_SignerInfo_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr)) +#define sk_CMS_SignerInfo_pop(sk) ((CMS_SignerInfo *)OPENSSL_sk_pop(ossl_check_CMS_SignerInfo_sk_type(sk))) +#define sk_CMS_SignerInfo_shift(sk) ((CMS_SignerInfo *)OPENSSL_sk_shift(ossl_check_CMS_SignerInfo_sk_type(sk))) +#define sk_CMS_SignerInfo_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CMS_SignerInfo_sk_type(sk),ossl_check_CMS_SignerInfo_freefunc_type(freefunc)) +#define sk_CMS_SignerInfo_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr), (idx)) +#define sk_CMS_SignerInfo_set(sk, idx, ptr) ((CMS_SignerInfo *)OPENSSL_sk_set(ossl_check_CMS_SignerInfo_sk_type(sk), (idx), ossl_check_CMS_SignerInfo_type(ptr))) +#define sk_CMS_SignerInfo_find(sk, ptr) OPENSSL_sk_find(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr)) +#define sk_CMS_SignerInfo_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr)) +#define sk_CMS_SignerInfo_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_type(ptr), pnum) +#define sk_CMS_SignerInfo_sort(sk) OPENSSL_sk_sort(ossl_check_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CMS_SignerInfo_sk_type(sk)) +#define sk_CMS_SignerInfo_dup(sk) ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_dup(ossl_check_const_CMS_SignerInfo_sk_type(sk))) +#define sk_CMS_SignerInfo_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CMS_SignerInfo) *)OPENSSL_sk_deep_copy(ossl_check_const_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_copyfunc_type(copyfunc), ossl_check_CMS_SignerInfo_freefunc_type(freefunc))) +#define sk_CMS_SignerInfo_set_cmp_func(sk, cmp) ((sk_CMS_SignerInfo_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CMS_SignerInfo_sk_type(sk), ossl_check_CMS_SignerInfo_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(CMS_RecipientEncryptedKey, CMS_RecipientEncryptedKey, CMS_RecipientEncryptedKey) +#define sk_CMS_RecipientEncryptedKey_num(sk) OPENSSL_sk_num(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_value(sk, idx) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_value(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk), (idx))) +#define sk_CMS_RecipientEncryptedKey_new(cmp) ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_new(ossl_check_CMS_RecipientEncryptedKey_compfunc_type(cmp))) +#define sk_CMS_RecipientEncryptedKey_new_null() ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_new_null()) +#define sk_CMS_RecipientEncryptedKey_new_reserve(cmp, n) ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_new_reserve(ossl_check_CMS_RecipientEncryptedKey_compfunc_type(cmp), (n))) +#define sk_CMS_RecipientEncryptedKey_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), (n)) +#define sk_CMS_RecipientEncryptedKey_free(sk) OPENSSL_sk_free(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_zero(sk) OPENSSL_sk_zero(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_delete(sk, i) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_delete(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), (i))) +#define sk_CMS_RecipientEncryptedKey_delete_ptr(sk, ptr) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_delete_ptr(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr))) +#define sk_CMS_RecipientEncryptedKey_push(sk, ptr) OPENSSL_sk_push(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr)) +#define sk_CMS_RecipientEncryptedKey_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr)) +#define sk_CMS_RecipientEncryptedKey_pop(sk) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_pop(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk))) +#define sk_CMS_RecipientEncryptedKey_shift(sk) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_shift(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk))) +#define sk_CMS_RecipientEncryptedKey_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk),ossl_check_CMS_RecipientEncryptedKey_freefunc_type(freefunc)) +#define sk_CMS_RecipientEncryptedKey_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr), (idx)) +#define sk_CMS_RecipientEncryptedKey_set(sk, idx, ptr) ((CMS_RecipientEncryptedKey *)OPENSSL_sk_set(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), (idx), ossl_check_CMS_RecipientEncryptedKey_type(ptr))) +#define sk_CMS_RecipientEncryptedKey_find(sk, ptr) OPENSSL_sk_find(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr)) +#define sk_CMS_RecipientEncryptedKey_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr)) +#define sk_CMS_RecipientEncryptedKey_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_type(ptr), pnum) +#define sk_CMS_RecipientEncryptedKey_sort(sk) OPENSSL_sk_sort(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk)) +#define sk_CMS_RecipientEncryptedKey_dup(sk) ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_dup(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk))) +#define sk_CMS_RecipientEncryptedKey_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CMS_RecipientEncryptedKey) *)OPENSSL_sk_deep_copy(ossl_check_const_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_copyfunc_type(copyfunc), ossl_check_CMS_RecipientEncryptedKey_freefunc_type(freefunc))) +#define sk_CMS_RecipientEncryptedKey_set_cmp_func(sk, cmp) ((sk_CMS_RecipientEncryptedKey_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CMS_RecipientEncryptedKey_sk_type(sk), ossl_check_CMS_RecipientEncryptedKey_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(CMS_RecipientInfo, CMS_RecipientInfo, CMS_RecipientInfo) +#define sk_CMS_RecipientInfo_num(sk) OPENSSL_sk_num(ossl_check_const_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_value(sk, idx) ((CMS_RecipientInfo *)OPENSSL_sk_value(ossl_check_const_CMS_RecipientInfo_sk_type(sk), (idx))) +#define sk_CMS_RecipientInfo_new(cmp) ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_new(ossl_check_CMS_RecipientInfo_compfunc_type(cmp))) +#define sk_CMS_RecipientInfo_new_null() ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_new_null()) +#define sk_CMS_RecipientInfo_new_reserve(cmp, n) ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_new_reserve(ossl_check_CMS_RecipientInfo_compfunc_type(cmp), (n))) +#define sk_CMS_RecipientInfo_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CMS_RecipientInfo_sk_type(sk), (n)) +#define sk_CMS_RecipientInfo_free(sk) OPENSSL_sk_free(ossl_check_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_zero(sk) OPENSSL_sk_zero(ossl_check_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_delete(sk, i) ((CMS_RecipientInfo *)OPENSSL_sk_delete(ossl_check_CMS_RecipientInfo_sk_type(sk), (i))) +#define sk_CMS_RecipientInfo_delete_ptr(sk, ptr) ((CMS_RecipientInfo *)OPENSSL_sk_delete_ptr(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr))) +#define sk_CMS_RecipientInfo_push(sk, ptr) OPENSSL_sk_push(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr)) +#define sk_CMS_RecipientInfo_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr)) +#define sk_CMS_RecipientInfo_pop(sk) ((CMS_RecipientInfo *)OPENSSL_sk_pop(ossl_check_CMS_RecipientInfo_sk_type(sk))) +#define sk_CMS_RecipientInfo_shift(sk) ((CMS_RecipientInfo *)OPENSSL_sk_shift(ossl_check_CMS_RecipientInfo_sk_type(sk))) +#define sk_CMS_RecipientInfo_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CMS_RecipientInfo_sk_type(sk),ossl_check_CMS_RecipientInfo_freefunc_type(freefunc)) +#define sk_CMS_RecipientInfo_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr), (idx)) +#define sk_CMS_RecipientInfo_set(sk, idx, ptr) ((CMS_RecipientInfo *)OPENSSL_sk_set(ossl_check_CMS_RecipientInfo_sk_type(sk), (idx), ossl_check_CMS_RecipientInfo_type(ptr))) +#define sk_CMS_RecipientInfo_find(sk, ptr) OPENSSL_sk_find(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr)) +#define sk_CMS_RecipientInfo_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr)) +#define sk_CMS_RecipientInfo_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_type(ptr), pnum) +#define sk_CMS_RecipientInfo_sort(sk) OPENSSL_sk_sort(ossl_check_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CMS_RecipientInfo_sk_type(sk)) +#define sk_CMS_RecipientInfo_dup(sk) ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_dup(ossl_check_const_CMS_RecipientInfo_sk_type(sk))) +#define sk_CMS_RecipientInfo_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CMS_RecipientInfo) *)OPENSSL_sk_deep_copy(ossl_check_const_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_copyfunc_type(copyfunc), ossl_check_CMS_RecipientInfo_freefunc_type(freefunc))) +#define sk_CMS_RecipientInfo_set_cmp_func(sk, cmp) ((sk_CMS_RecipientInfo_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CMS_RecipientInfo_sk_type(sk), ossl_check_CMS_RecipientInfo_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(CMS_RevocationInfoChoice, CMS_RevocationInfoChoice, CMS_RevocationInfoChoice) +#define sk_CMS_RevocationInfoChoice_num(sk) OPENSSL_sk_num(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_value(sk, idx) ((CMS_RevocationInfoChoice *)OPENSSL_sk_value(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk), (idx))) +#define sk_CMS_RevocationInfoChoice_new(cmp) ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_new(ossl_check_CMS_RevocationInfoChoice_compfunc_type(cmp))) +#define sk_CMS_RevocationInfoChoice_new_null() ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_new_null()) +#define sk_CMS_RevocationInfoChoice_new_reserve(cmp, n) ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_new_reserve(ossl_check_CMS_RevocationInfoChoice_compfunc_type(cmp), (n))) +#define sk_CMS_RevocationInfoChoice_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), (n)) +#define sk_CMS_RevocationInfoChoice_free(sk) OPENSSL_sk_free(ossl_check_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_zero(sk) OPENSSL_sk_zero(ossl_check_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_delete(sk, i) ((CMS_RevocationInfoChoice *)OPENSSL_sk_delete(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), (i))) +#define sk_CMS_RevocationInfoChoice_delete_ptr(sk, ptr) ((CMS_RevocationInfoChoice *)OPENSSL_sk_delete_ptr(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr))) +#define sk_CMS_RevocationInfoChoice_push(sk, ptr) OPENSSL_sk_push(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr)) +#define sk_CMS_RevocationInfoChoice_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr)) +#define sk_CMS_RevocationInfoChoice_pop(sk) ((CMS_RevocationInfoChoice *)OPENSSL_sk_pop(ossl_check_CMS_RevocationInfoChoice_sk_type(sk))) +#define sk_CMS_RevocationInfoChoice_shift(sk) ((CMS_RevocationInfoChoice *)OPENSSL_sk_shift(ossl_check_CMS_RevocationInfoChoice_sk_type(sk))) +#define sk_CMS_RevocationInfoChoice_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CMS_RevocationInfoChoice_sk_type(sk),ossl_check_CMS_RevocationInfoChoice_freefunc_type(freefunc)) +#define sk_CMS_RevocationInfoChoice_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr), (idx)) +#define sk_CMS_RevocationInfoChoice_set(sk, idx, ptr) ((CMS_RevocationInfoChoice *)OPENSSL_sk_set(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), (idx), ossl_check_CMS_RevocationInfoChoice_type(ptr))) +#define sk_CMS_RevocationInfoChoice_find(sk, ptr) OPENSSL_sk_find(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr)) +#define sk_CMS_RevocationInfoChoice_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr)) +#define sk_CMS_RevocationInfoChoice_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_type(ptr), pnum) +#define sk_CMS_RevocationInfoChoice_sort(sk) OPENSSL_sk_sort(ossl_check_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk)) +#define sk_CMS_RevocationInfoChoice_dup(sk) ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_dup(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk))) +#define sk_CMS_RevocationInfoChoice_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CMS_RevocationInfoChoice) *)OPENSSL_sk_deep_copy(ossl_check_const_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_copyfunc_type(copyfunc), ossl_check_CMS_RevocationInfoChoice_freefunc_type(freefunc))) +#define sk_CMS_RevocationInfoChoice_set_cmp_func(sk, cmp) ((sk_CMS_RevocationInfoChoice_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CMS_RevocationInfoChoice_sk_type(sk), ossl_check_CMS_RevocationInfoChoice_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_ITEM(CMS_EnvelopedData) +DECLARE_ASN1_ALLOC_FUNCTIONS(CMS_SignedData) +DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo) +DECLARE_ASN1_FUNCTIONS(CMS_ReceiptRequest) +DECLARE_ASN1_PRINT_FUNCTION(CMS_ContentInfo) + +DECLARE_ASN1_DUP_FUNCTION(CMS_EnvelopedData) + +CMS_ContentInfo *CMS_ContentInfo_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +#define CMS_SIGNERINFO_ISSUER_SERIAL 0 +#define CMS_SIGNERINFO_KEYIDENTIFIER 1 + +#define CMS_RECIPINFO_NONE -1 +#define CMS_RECIPINFO_TRANS 0 +#define CMS_RECIPINFO_AGREE 1 +#define CMS_RECIPINFO_KEK 2 +#define CMS_RECIPINFO_PASS 3 +#define CMS_RECIPINFO_OTHER 4 + +/* S/MIME related flags */ + +#define CMS_TEXT 0x1 +#define CMS_NOCERTS 0x2 +#define CMS_NO_CONTENT_VERIFY 0x4 +#define CMS_NO_ATTR_VERIFY 0x8 +#define CMS_NOSIGS \ + (CMS_NO_CONTENT_VERIFY | CMS_NO_ATTR_VERIFY) +#define CMS_NOINTERN 0x10 +#define CMS_NO_SIGNER_CERT_VERIFY 0x20 +#define CMS_NOVERIFY 0x20 +#define CMS_DETACHED 0x40 +#define CMS_BINARY 0x80 +#define CMS_NOATTR 0x100 +#define CMS_NOSMIMECAP 0x200 +#define CMS_NOOLDMIMETYPE 0x400 +#define CMS_CRLFEOL 0x800 +#define CMS_STREAM 0x1000 +#define CMS_NOCRL 0x2000 +#define CMS_PARTIAL 0x4000 +#define CMS_REUSE_DIGEST 0x8000 +#define CMS_USE_KEYID 0x10000 +#define CMS_DEBUG_DECRYPT 0x20000 +#define CMS_KEY_PARAM 0x40000 +#define CMS_ASCIICRLF 0x80000 +#define CMS_CADES 0x100000 +#define CMS_USE_ORIGINATOR_KEYID 0x200000 +#define CMS_NO_SIGNING_TIME 0x400000 + +const ASN1_OBJECT *CMS_get0_type(const CMS_ContentInfo *cms); + +BIO *CMS_dataInit(CMS_ContentInfo *cms, BIO *icont); +int CMS_dataFinal(CMS_ContentInfo *cms, BIO *bio); + +ASN1_OCTET_STRING **CMS_get0_content(CMS_ContentInfo *cms); +int CMS_is_detached(CMS_ContentInfo *cms); +int CMS_set_detached(CMS_ContentInfo *cms, int detached); + +#ifdef OPENSSL_PEM_H +DECLARE_PEM_rw(CMS, CMS_ContentInfo) +#endif +int CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms); +CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms); +int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms); + +BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms); +int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags); +int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, + int flags); +CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont); +CMS_ContentInfo *SMIME_read_CMS_ex(BIO *bio, int flags, BIO **bcont, CMS_ContentInfo **ci); +int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags); + +int CMS_final(CMS_ContentInfo *cms, BIO *data, BIO *dcont, + unsigned int flags); +int CMS_final_digest(CMS_ContentInfo *cms, + const unsigned char *md, unsigned int mdlen, BIO *dcont, + unsigned int flags); + +CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, BIO *data, + unsigned int flags); +CMS_ContentInfo *CMS_sign_ex(X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, BIO *data, + unsigned int flags, OSSL_LIB_CTX *libctx, + const char *propq); + +CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, + X509 *signcert, EVP_PKEY *pkey, + STACK_OF(X509) *certs, unsigned int flags); + +int CMS_data(CMS_ContentInfo *cms, BIO *out, unsigned int flags); +CMS_ContentInfo *CMS_data_create(BIO *in, unsigned int flags); +CMS_ContentInfo *CMS_data_create_ex(BIO *in, unsigned int flags, + OSSL_LIB_CTX *libctx, const char *propq); + +int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_digest_create(BIO *in, const EVP_MD *md, + unsigned int flags); +CMS_ContentInfo *CMS_digest_create_ex(BIO *in, const EVP_MD *md, + unsigned int flags, OSSL_LIB_CTX *libctx, + const char *propq); + +int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, + const unsigned char *key, size_t keylen, + BIO *dcont, BIO *out, unsigned int flags); +CMS_ContentInfo *CMS_EncryptedData_encrypt(BIO *in, const EVP_CIPHER *cipher, + const unsigned char *key, + size_t keylen, unsigned int flags); +CMS_ContentInfo *CMS_EncryptedData_encrypt_ex(BIO *in, const EVP_CIPHER *cipher, + const unsigned char *key, + size_t keylen, unsigned int flags, + OSSL_LIB_CTX *libctx, + const char *propq); + +int CMS_EncryptedData_set1_key(CMS_ContentInfo *cms, const EVP_CIPHER *ciph, + const unsigned char *key, size_t keylen); + +int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + X509_STORE *store, BIO *dcont, BIO *out, unsigned int flags); + +int CMS_verify_receipt(CMS_ContentInfo *rcms, CMS_ContentInfo *ocms, + STACK_OF(X509) *certs, + X509_STORE *store, unsigned int flags); + +STACK_OF(X509) *CMS_get0_signers(CMS_ContentInfo *cms); + +CMS_ContentInfo *CMS_encrypt(STACK_OF(X509) *certs, BIO *in, + const EVP_CIPHER *cipher, unsigned int flags); +CMS_ContentInfo *CMS_encrypt_ex(STACK_OF(X509) *certs, BIO *in, + const EVP_CIPHER *cipher, unsigned int flags, + OSSL_LIB_CTX *libctx, const char *propq); + +int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pkey, X509 *cert, + BIO *dcont, BIO *out, unsigned int flags); + +int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert); +int CMS_decrypt_set1_pkey_and_peer(CMS_ContentInfo *cms, EVP_PKEY *pk, + X509 *cert, X509 *peer); +int CMS_decrypt_set1_key(CMS_ContentInfo *cms, + unsigned char *key, size_t keylen, + const unsigned char *id, size_t idlen); +int CMS_decrypt_set1_password(CMS_ContentInfo *cms, + unsigned char *pass, ossl_ssize_t passlen); + +STACK_OF(CMS_RecipientInfo) *CMS_get0_RecipientInfos(CMS_ContentInfo *cms); +int CMS_RecipientInfo_type(CMS_RecipientInfo *ri); +EVP_PKEY_CTX *CMS_RecipientInfo_get0_pkey_ctx(CMS_RecipientInfo *ri); +CMS_ContentInfo *CMS_AuthEnvelopedData_create(const EVP_CIPHER *cipher); +CMS_ContentInfo * +CMS_AuthEnvelopedData_create_ex(const EVP_CIPHER *cipher, OSSL_LIB_CTX *libctx, + const char *propq); +CMS_ContentInfo *CMS_EnvelopedData_create(const EVP_CIPHER *cipher); +CMS_ContentInfo *CMS_EnvelopedData_create_ex(const EVP_CIPHER *cipher, + OSSL_LIB_CTX *libctx, + const char *propq); +BIO *CMS_EnvelopedData_decrypt(CMS_EnvelopedData *env, BIO *detached_data, + EVP_PKEY *pkey, X509 *cert, + ASN1_OCTET_STRING *secret, unsigned int flags, + OSSL_LIB_CTX *libctx, const char *propq); + +CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, + X509 *recip, unsigned int flags); +CMS_RecipientInfo *CMS_add1_recipient(CMS_ContentInfo *cms, X509 *recip, + EVP_PKEY *originatorPrivKey, X509 *originator, unsigned int flags); +int CMS_RecipientInfo_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pkey); +int CMS_RecipientInfo_ktri_cert_cmp(CMS_RecipientInfo *ri, X509 *cert); +int CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo *ri, + EVP_PKEY **pk, X509 **recip, + X509_ALGOR **palg); +int CMS_RecipientInfo_ktri_get0_signer_id(CMS_RecipientInfo *ri, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +CMS_RecipientInfo *CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, + unsigned char *key, size_t keylen, + unsigned char *id, size_t idlen, + ASN1_GENERALIZEDTIME *date, + ASN1_OBJECT *otherTypeId, + ASN1_TYPE *otherType); + +int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pid, + ASN1_GENERALIZEDTIME **pdate, + ASN1_OBJECT **potherid, + ASN1_TYPE **pothertype); + +int CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri, + unsigned char *key, size_t keylen); + +int CMS_RecipientInfo_kekri_id_cmp(CMS_RecipientInfo *ri, + const unsigned char *id, size_t idlen); + +int CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri, + unsigned char *pass, + ossl_ssize_t passlen); + +CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, + int iter, int wrap_nid, + int pbe_nid, + unsigned char *pass, + ossl_ssize_t passlen, + const EVP_CIPHER *kekciph); + +int CMS_RecipientInfo_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); +int CMS_RecipientInfo_encrypt(const CMS_ContentInfo *cms, CMS_RecipientInfo *ri); + +int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, + unsigned int flags); +CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags); + +int CMS_set1_eContentType(CMS_ContentInfo *cms, const ASN1_OBJECT *oid); +const ASN1_OBJECT *CMS_get0_eContentType(CMS_ContentInfo *cms); + +CMS_CertificateChoices *CMS_add0_CertificateChoices(CMS_ContentInfo *cms); +int CMS_add0_cert(CMS_ContentInfo *cms, X509 *cert); +int CMS_add1_cert(CMS_ContentInfo *cms, X509 *cert); +STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms); + +CMS_RevocationInfoChoice *CMS_add0_RevocationInfoChoice(CMS_ContentInfo *cms); +int CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl); +int CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl); +STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms); + +int CMS_SignedData_init(CMS_ContentInfo *cms); +CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, + X509 *signer, EVP_PKEY *pk, const EVP_MD *md, + unsigned int flags); +EVP_PKEY_CTX *CMS_SignerInfo_get0_pkey_ctx(CMS_SignerInfo *si); +EVP_MD_CTX *CMS_SignerInfo_get0_md_ctx(CMS_SignerInfo *si); +STACK_OF(CMS_SignerInfo) *CMS_get0_SignerInfos(CMS_ContentInfo *cms); + +void CMS_SignerInfo_set1_signer_cert(CMS_SignerInfo *si, X509 *signer); +int CMS_SignerInfo_get0_signer_id(CMS_SignerInfo *si, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_SignerInfo_cert_cmp(CMS_SignerInfo *si, X509 *cert); +int CMS_set1_signers_certs(CMS_ContentInfo *cms, STACK_OF(X509) *certs, + unsigned int flags); +void CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, + X509 **signer, X509_ALGOR **pdig, + X509_ALGOR **psig); +ASN1_OCTET_STRING *CMS_SignerInfo_get0_signature(CMS_SignerInfo *si); +int CMS_SignerInfo_sign(CMS_SignerInfo *si); +int CMS_SignerInfo_verify(CMS_SignerInfo *si); +int CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain); +BIO *CMS_SignedData_verify(CMS_SignedData *sd, BIO *detached_data, + STACK_OF(X509) *scerts, X509_STORE *store, + STACK_OF(X509) *extra, STACK_OF(X509_CRL) *crls, + unsigned int flags, + OSSL_LIB_CTX *libctx, const char *propq); + +int CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs); +int CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, + int algnid, int keysize); +int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap); + +int CMS_signed_get_attr_count(const CMS_SignerInfo *si); +int CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, const ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *CMS_signed_get_attr(const CMS_SignerInfo *si, int loc); +X509_ATTRIBUTE *CMS_signed_delete_attr(CMS_SignerInfo *si, int loc); +int CMS_signed_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); +int CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int type, + const void *bytes, int len); +int CMS_signed_add1_attr_by_NID(CMS_SignerInfo *si, + int nid, int type, + const void *bytes, int len); +int CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si, + const char *attrname, int type, + const void *bytes, int len); +void *CMS_signed_get0_data_by_OBJ(const CMS_SignerInfo *si, + const ASN1_OBJECT *oid, + int lastpos, int type); + +int CMS_unsigned_get_attr_count(const CMS_SignerInfo *si); +int CMS_unsigned_get_attr_by_NID(const CMS_SignerInfo *si, int nid, + int lastpos); +int CMS_unsigned_get_attr_by_OBJ(const CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int lastpos); +X509_ATTRIBUTE *CMS_unsigned_get_attr(const CMS_SignerInfo *si, int loc); +X509_ATTRIBUTE *CMS_unsigned_delete_attr(CMS_SignerInfo *si, int loc); +int CMS_unsigned_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); +int CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo *si, + const ASN1_OBJECT *obj, int type, + const void *bytes, int len); +int CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo *si, + int nid, int type, + const void *bytes, int len); +int CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo *si, + const char *attrname, int type, + const void *bytes, int len); +void *CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, + int lastpos, int type); + +int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr); +CMS_ReceiptRequest *CMS_ReceiptRequest_create0( + unsigned char *id, int idlen, int allorfirst, + STACK_OF(GENERAL_NAMES) *receiptList, + STACK_OF(GENERAL_NAMES) *receiptsTo); +CMS_ReceiptRequest *CMS_ReceiptRequest_create0_ex( + unsigned char *id, int idlen, int allorfirst, + STACK_OF(GENERAL_NAMES) *receiptList, + STACK_OF(GENERAL_NAMES) *receiptsTo, + OSSL_LIB_CTX *libctx); + +int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr); +void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, + ASN1_STRING **pcid, + int *pallorfirst, + STACK_OF(GENERAL_NAMES) **plist, + STACK_OF(GENERAL_NAMES) **prto); +int CMS_RecipientInfo_kari_get0_alg(CMS_RecipientInfo *ri, + X509_ALGOR **palg, + ASN1_OCTET_STRING **pukm); +STACK_OF(CMS_RecipientEncryptedKey) +*CMS_RecipientInfo_kari_get0_reks(CMS_RecipientInfo *ri); + +int CMS_RecipientInfo_kari_get0_orig_id(CMS_RecipientInfo *ri, + X509_ALGOR **pubalg, + ASN1_BIT_STRING **pubkey, + ASN1_OCTET_STRING **keyid, + X509_NAME **issuer, + ASN1_INTEGER **sno); + +int CMS_RecipientInfo_kari_orig_id_cmp(CMS_RecipientInfo *ri, X509 *cert); + +int CMS_RecipientEncryptedKey_get0_id(CMS_RecipientEncryptedKey *rek, + ASN1_OCTET_STRING **keyid, + ASN1_GENERALIZEDTIME **tm, + CMS_OtherKeyAttribute **other, + X509_NAME **issuer, ASN1_INTEGER **sno); +int CMS_RecipientEncryptedKey_cert_cmp(CMS_RecipientEncryptedKey *rek, + X509 *cert); +int CMS_RecipientInfo_kari_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pk); +int CMS_RecipientInfo_kari_set0_pkey_and_peer(CMS_RecipientInfo *ri, EVP_PKEY *pk, X509 *peer); +EVP_CIPHER_CTX *CMS_RecipientInfo_kari_get0_ctx(CMS_RecipientInfo *ri); +int CMS_RecipientInfo_kari_decrypt(CMS_ContentInfo *cms, + CMS_RecipientInfo *ri, + CMS_RecipientEncryptedKey *rek); + +int CMS_SharedInfo_encode(unsigned char **pder, X509_ALGOR *kekalg, + ASN1_OCTET_STRING *ukm, int keylen); + +/* Backward compatibility for spelling errors. */ +#define CMS_R_UNKNOWN_DIGEST_ALGORITM CMS_R_UNKNOWN_DIGEST_ALGORITHM +#define CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE \ + CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE + +#ifdef __cplusplus +} +#endif +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/comp.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/comp.h new file mode 100644 index 000000000000..d47246a1a202 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/comp.h @@ -0,0 +1,101 @@ +/* + * Copyright 2015-2024 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_COMP_H +#define OPENSSL_COMP_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_COMP_H +#endif + +#include + +#include +#include +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef OPENSSL_NO_COMP + +COMP_CTX *COMP_CTX_new(COMP_METHOD *meth); +const COMP_METHOD *COMP_CTX_get_method(const COMP_CTX *ctx); +int COMP_CTX_get_type(const COMP_CTX *comp); +int COMP_get_type(const COMP_METHOD *meth); +const char *COMP_get_name(const COMP_METHOD *meth); +void COMP_CTX_free(COMP_CTX *ctx); + +int COMP_compress_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); +int COMP_expand_block(COMP_CTX *ctx, unsigned char *out, int olen, + unsigned char *in, int ilen); + +COMP_METHOD *COMP_zlib(void); +COMP_METHOD *COMP_zlib_oneshot(void); +COMP_METHOD *COMP_brotli(void); +COMP_METHOD *COMP_brotli_oneshot(void); +COMP_METHOD *COMP_zstd(void); +COMP_METHOD *COMP_zstd_oneshot(void); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define COMP_zlib_cleanup() \ + while (0) \ + continue +#endif + +#ifdef OPENSSL_BIO_H +const BIO_METHOD *BIO_f_zlib(void); +const BIO_METHOD *BIO_f_brotli(void); +const BIO_METHOD *BIO_f_zstd(void); +#endif + +#endif + +typedef struct ssl_comp_st SSL_COMP; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SSL_COMP, SSL_COMP, SSL_COMP) +#define sk_SSL_COMP_num(sk) OPENSSL_sk_num(ossl_check_const_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_value(sk, idx) ((SSL_COMP *)OPENSSL_sk_value(ossl_check_const_SSL_COMP_sk_type(sk), (idx))) +#define sk_SSL_COMP_new(cmp) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new(ossl_check_SSL_COMP_compfunc_type(cmp))) +#define sk_SSL_COMP_new_null() ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new_null()) +#define sk_SSL_COMP_new_reserve(cmp, n) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_new_reserve(ossl_check_SSL_COMP_compfunc_type(cmp), (n))) +#define sk_SSL_COMP_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SSL_COMP_sk_type(sk), (n)) +#define sk_SSL_COMP_free(sk) OPENSSL_sk_free(ossl_check_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_zero(sk) OPENSSL_sk_zero(ossl_check_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_delete(sk, i) ((SSL_COMP *)OPENSSL_sk_delete(ossl_check_SSL_COMP_sk_type(sk), (i))) +#define sk_SSL_COMP_delete_ptr(sk, ptr) ((SSL_COMP *)OPENSSL_sk_delete_ptr(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr))) +#define sk_SSL_COMP_push(sk, ptr) OPENSSL_sk_push(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)) +#define sk_SSL_COMP_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)) +#define sk_SSL_COMP_pop(sk) ((SSL_COMP *)OPENSSL_sk_pop(ossl_check_SSL_COMP_sk_type(sk))) +#define sk_SSL_COMP_shift(sk) ((SSL_COMP *)OPENSSL_sk_shift(ossl_check_SSL_COMP_sk_type(sk))) +#define sk_SSL_COMP_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SSL_COMP_sk_type(sk),ossl_check_SSL_COMP_freefunc_type(freefunc)) +#define sk_SSL_COMP_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr), (idx)) +#define sk_SSL_COMP_set(sk, idx, ptr) ((SSL_COMP *)OPENSSL_sk_set(ossl_check_SSL_COMP_sk_type(sk), (idx), ossl_check_SSL_COMP_type(ptr))) +#define sk_SSL_COMP_find(sk, ptr) OPENSSL_sk_find(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)) +#define sk_SSL_COMP_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr)) +#define sk_SSL_COMP_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_type(ptr), pnum) +#define sk_SSL_COMP_sort(sk) OPENSSL_sk_sort(ossl_check_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SSL_COMP_sk_type(sk)) +#define sk_SSL_COMP_dup(sk) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_dup(ossl_check_const_SSL_COMP_sk_type(sk))) +#define sk_SSL_COMP_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SSL_COMP) *)OPENSSL_sk_deep_copy(ossl_check_const_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_copyfunc_type(copyfunc), ossl_check_SSL_COMP_freefunc_type(freefunc))) +#define sk_SSL_COMP_set_cmp_func(sk, cmp) ((sk_SSL_COMP_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SSL_COMP_sk_type(sk), ossl_check_SSL_COMP_compfunc_type(cmp))) + +/* clang-format on */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/conf.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/conf.h new file mode 100644 index 000000000000..96b1c6803088 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/conf.h @@ -0,0 +1,219 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/conf.h.in + * + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_CONF_H +#define OPENSSL_CONF_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_CONF_H +#endif + +#include +#include +#include +#include +#include +#include +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + char *section; + char *name; + char *value; +} CONF_VALUE; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(CONF_VALUE, CONF_VALUE, CONF_VALUE) +#define sk_CONF_VALUE_num(sk) OPENSSL_sk_num(ossl_check_const_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_value(sk, idx) ((CONF_VALUE *)OPENSSL_sk_value(ossl_check_const_CONF_VALUE_sk_type(sk), (idx))) +#define sk_CONF_VALUE_new(cmp) ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_new(ossl_check_CONF_VALUE_compfunc_type(cmp))) +#define sk_CONF_VALUE_new_null() ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_new_null()) +#define sk_CONF_VALUE_new_reserve(cmp, n) ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_new_reserve(ossl_check_CONF_VALUE_compfunc_type(cmp), (n))) +#define sk_CONF_VALUE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CONF_VALUE_sk_type(sk), (n)) +#define sk_CONF_VALUE_free(sk) OPENSSL_sk_free(ossl_check_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_zero(sk) OPENSSL_sk_zero(ossl_check_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_delete(sk, i) ((CONF_VALUE *)OPENSSL_sk_delete(ossl_check_CONF_VALUE_sk_type(sk), (i))) +#define sk_CONF_VALUE_delete_ptr(sk, ptr) ((CONF_VALUE *)OPENSSL_sk_delete_ptr(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr))) +#define sk_CONF_VALUE_push(sk, ptr) OPENSSL_sk_push(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr)) +#define sk_CONF_VALUE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr)) +#define sk_CONF_VALUE_pop(sk) ((CONF_VALUE *)OPENSSL_sk_pop(ossl_check_CONF_VALUE_sk_type(sk))) +#define sk_CONF_VALUE_shift(sk) ((CONF_VALUE *)OPENSSL_sk_shift(ossl_check_CONF_VALUE_sk_type(sk))) +#define sk_CONF_VALUE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CONF_VALUE_sk_type(sk),ossl_check_CONF_VALUE_freefunc_type(freefunc)) +#define sk_CONF_VALUE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr), (idx)) +#define sk_CONF_VALUE_set(sk, idx, ptr) ((CONF_VALUE *)OPENSSL_sk_set(ossl_check_CONF_VALUE_sk_type(sk), (idx), ossl_check_CONF_VALUE_type(ptr))) +#define sk_CONF_VALUE_find(sk, ptr) OPENSSL_sk_find(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr)) +#define sk_CONF_VALUE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr)) +#define sk_CONF_VALUE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_type(ptr), pnum) +#define sk_CONF_VALUE_sort(sk) OPENSSL_sk_sort(ossl_check_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CONF_VALUE_sk_type(sk)) +#define sk_CONF_VALUE_dup(sk) ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_dup(ossl_check_const_CONF_VALUE_sk_type(sk))) +#define sk_CONF_VALUE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CONF_VALUE) *)OPENSSL_sk_deep_copy(ossl_check_const_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_copyfunc_type(copyfunc), ossl_check_CONF_VALUE_freefunc_type(freefunc))) +#define sk_CONF_VALUE_set_cmp_func(sk, cmp) ((sk_CONF_VALUE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CONF_VALUE_sk_type(sk), ossl_check_CONF_VALUE_compfunc_type(cmp))) +DEFINE_LHASH_OF_INTERNAL(CONF_VALUE); +#define lh_CONF_VALUE_new(hfn, cmp) ((LHASH_OF(CONF_VALUE) *)OPENSSL_LH_set_thunks(OPENSSL_LH_new(ossl_check_CONF_VALUE_lh_hashfunc_type(hfn), ossl_check_CONF_VALUE_lh_compfunc_type(cmp)), lh_CONF_VALUE_hash_thunk, lh_CONF_VALUE_comp_thunk, lh_CONF_VALUE_doall_thunk, lh_CONF_VALUE_doall_arg_thunk)) +#define lh_CONF_VALUE_free(lh) OPENSSL_LH_free(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_flush(lh) OPENSSL_LH_flush(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_insert(lh, ptr) ((CONF_VALUE *)OPENSSL_LH_insert(ossl_check_CONF_VALUE_lh_type(lh), ossl_check_CONF_VALUE_lh_plain_type(ptr))) +#define lh_CONF_VALUE_delete(lh, ptr) ((CONF_VALUE *)OPENSSL_LH_delete(ossl_check_CONF_VALUE_lh_type(lh), ossl_check_const_CONF_VALUE_lh_plain_type(ptr))) +#define lh_CONF_VALUE_retrieve(lh, ptr) ((CONF_VALUE *)OPENSSL_LH_retrieve(ossl_check_CONF_VALUE_lh_type(lh), ossl_check_const_CONF_VALUE_lh_plain_type(ptr))) +#define lh_CONF_VALUE_error(lh) OPENSSL_LH_error(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_num_items(lh) OPENSSL_LH_num_items(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_node_stats_bio(lh, out) OPENSSL_LH_node_stats_bio(ossl_check_const_CONF_VALUE_lh_type(lh), out) +#define lh_CONF_VALUE_node_usage_stats_bio(lh, out) OPENSSL_LH_node_usage_stats_bio(ossl_check_const_CONF_VALUE_lh_type(lh), out) +#define lh_CONF_VALUE_stats_bio(lh, out) OPENSSL_LH_stats_bio(ossl_check_const_CONF_VALUE_lh_type(lh), out) +#define lh_CONF_VALUE_get_down_load(lh) OPENSSL_LH_get_down_load(ossl_check_CONF_VALUE_lh_type(lh)) +#define lh_CONF_VALUE_set_down_load(lh, dl) OPENSSL_LH_set_down_load(ossl_check_CONF_VALUE_lh_type(lh), dl) +#define lh_CONF_VALUE_doall(lh, dfn) OPENSSL_LH_doall(ossl_check_CONF_VALUE_lh_type(lh), ossl_check_CONF_VALUE_lh_doallfunc_type(dfn)) + +/* clang-format on */ + +struct conf_st; +struct conf_method_st; +typedef struct conf_method_st CONF_METHOD; + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#include +#endif + +/* Module definitions */ +typedef struct conf_imodule_st CONF_IMODULE; +typedef struct conf_module_st CONF_MODULE; + +STACK_OF(CONF_MODULE); +STACK_OF(CONF_IMODULE); + +/* DSO module function typedefs */ +typedef int conf_init_func(CONF_IMODULE *md, const CONF *cnf); +typedef void conf_finish_func(CONF_IMODULE *md); + +#define CONF_MFLAGS_IGNORE_ERRORS 0x1 +#define CONF_MFLAGS_IGNORE_RETURN_CODES 0x2 +#define CONF_MFLAGS_SILENT 0x4 +#define CONF_MFLAGS_NO_DSO 0x8 +#define CONF_MFLAGS_IGNORE_MISSING_FILE 0x10 +#define CONF_MFLAGS_DEFAULT_SECTION 0x20 + +int CONF_set_default_method(CONF_METHOD *meth); +void CONF_set_nconf(CONF *conf, LHASH_OF(CONF_VALUE) *hash); +LHASH_OF(CONF_VALUE) *CONF_load(LHASH_OF(CONF_VALUE) *conf, const char *file, + long *eline); +#ifndef OPENSSL_NO_STDIO +LHASH_OF(CONF_VALUE) *CONF_load_fp(LHASH_OF(CONF_VALUE) *conf, FILE *fp, + long *eline); +#endif +LHASH_OF(CONF_VALUE) *CONF_load_bio(LHASH_OF(CONF_VALUE) *conf, BIO *bp, + long *eline); +STACK_OF(CONF_VALUE) *CONF_get_section(LHASH_OF(CONF_VALUE) *conf, + const char *section); +char *CONF_get_string(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +long CONF_get_number(LHASH_OF(CONF_VALUE) *conf, const char *group, + const char *name); +void CONF_free(LHASH_OF(CONF_VALUE) *conf); +#ifndef OPENSSL_NO_STDIO +int CONF_dump_fp(LHASH_OF(CONF_VALUE) *conf, FILE *out); +#endif +int CONF_dump_bio(LHASH_OF(CONF_VALUE) *conf, BIO *out); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 void OPENSSL_config(const char *config_name); +#endif + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define OPENSSL_no_config() \ + OPENSSL_init_crypto(OPENSSL_INIT_NO_LOAD_CONFIG, NULL) +#endif + +/* + * New conf code. The semantics are different from the functions above. If + * that wasn't the case, the above functions would have been replaced + */ + +CONF *NCONF_new_ex(OSSL_LIB_CTX *libctx, CONF_METHOD *meth); +OSSL_LIB_CTX *NCONF_get0_libctx(const CONF *conf); +CONF *NCONF_new(CONF_METHOD *meth); +CONF_METHOD *NCONF_default(void); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 CONF_METHOD *NCONF_WIN32(void); +#endif +void NCONF_free(CONF *conf); +void NCONF_free_data(CONF *conf); + +int NCONF_load(CONF *conf, const char *file, long *eline); +#ifndef OPENSSL_NO_STDIO +int NCONF_load_fp(CONF *conf, FILE *fp, long *eline); +#endif +int NCONF_load_bio(CONF *conf, BIO *bp, long *eline); +STACK_OF(OPENSSL_CSTRING) *NCONF_get_section_names(const CONF *conf); +STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, + const char *section); +char *NCONF_get_string(const CONF *conf, const char *group, const char *name); +int NCONF_get_number_e(const CONF *conf, const char *group, const char *name, + long *result); +#ifndef OPENSSL_NO_STDIO +int NCONF_dump_fp(const CONF *conf, FILE *out); +#endif +int NCONF_dump_bio(const CONF *conf, BIO *out); + +#define NCONF_get_number(c, g, n, r) NCONF_get_number_e(c, g, n, r) + +/* Module functions */ + +int CONF_modules_load(const CONF *cnf, const char *appname, + unsigned long flags); +int CONF_modules_load_file_ex(OSSL_LIB_CTX *libctx, const char *filename, + const char *appname, unsigned long flags); +int CONF_modules_load_file(const char *filename, const char *appname, + unsigned long flags); +void CONF_modules_unload(int all); +void CONF_modules_finish(void); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define CONF_modules_free() \ + while (0) \ + continue +#endif +int CONF_module_add(const char *name, conf_init_func *ifunc, + conf_finish_func *ffunc); + +const char *CONF_imodule_get_name(const CONF_IMODULE *md); +const char *CONF_imodule_get_value(const CONF_IMODULE *md); +void *CONF_imodule_get_usr_data(const CONF_IMODULE *md); +void CONF_imodule_set_usr_data(CONF_IMODULE *md, void *usr_data); +CONF_MODULE *CONF_imodule_get_module(const CONF_IMODULE *md); +unsigned long CONF_imodule_get_flags(const CONF_IMODULE *md); +void CONF_imodule_set_flags(CONF_IMODULE *md, unsigned long flags); +void *CONF_module_get_usr_data(CONF_MODULE *pmod); +void CONF_module_set_usr_data(CONF_MODULE *pmod, void *usr_data); + +char *CONF_get1_default_config_file(void); + +int CONF_parse_list(const char *list, int sep, int nospc, + int (*list_cb)(const char *elem, int len, void *usr), + void *arg); + +void OPENSSL_load_builtin_modules(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/configuration.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/configuration.h new file mode 100644 index 000000000000..8dc77fcbf2f7 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/configuration.h @@ -0,0 +1,190 @@ +/* + * WARNING: do not edit! + * Generated by configdata.pm from Configurations/common0.tmpl, Configurations/unix-Makefile.tmpl + * via Makefile.in + * + * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_CONFIGURATION_H +#define OPENSSL_CONFIGURATION_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef OPENSSL_ALGORITHM_DEFINES +#error OPENSSL_ALGORITHM_DEFINES no longer supported +#endif + +/* + * OpenSSL was configured with the following options: + */ + +/* clang-format off */ +# define OPENSSL_CONFIGURED_API 30500 +# ifndef OPENSSL_RAND_SEED_OS +# define OPENSSL_RAND_SEED_OS +# endif +# ifndef OPENSSL_THREADS +# define OPENSSL_THREADS +# endif +# ifndef OPENSSL_NO_AFALGENG +# define OPENSSL_NO_AFALGENG +# endif +# ifndef OPENSSL_NO_ASAN +# define OPENSSL_NO_ASAN +# endif +# ifndef OPENSSL_NO_BROTLI_DYNAMIC +# define OPENSSL_NO_BROTLI_DYNAMIC +# endif +# ifndef OPENSSL_NO_CRYPTO_MDEBUG +# define OPENSSL_NO_CRYPTO_MDEBUG +# endif +# ifndef OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE +# define OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE +# endif +# ifndef OPENSSL_NO_DEMOS +# define OPENSSL_NO_DEMOS +# endif +# ifndef OPENSSL_NO_DEVCRYPTOENG +# define OPENSSL_NO_DEVCRYPTOENG +# endif +# ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 +# define OPENSSL_NO_EC_NISTP_64_GCC_128 +# endif +# ifndef OPENSSL_NO_EGD +# define OPENSSL_NO_EGD +# endif +# ifndef OPENSSL_NO_EXTERNAL_TESTS +# define OPENSSL_NO_EXTERNAL_TESTS +# endif +# ifndef OPENSSL_NO_FIPS_JITTER +# define OPENSSL_NO_FIPS_JITTER +# endif +# ifndef OPENSSL_NO_FUZZ_AFL +# define OPENSSL_NO_FUZZ_AFL +# endif +# ifndef OPENSSL_NO_FUZZ_LIBFUZZER +# define OPENSSL_NO_FUZZ_LIBFUZZER +# endif +# ifndef OPENSSL_NO_H3DEMO +# define OPENSSL_NO_H3DEMO +# endif +# ifndef OPENSSL_NO_HQINTEROP +# define OPENSSL_NO_HQINTEROP +# endif +# ifndef OPENSSL_NO_JITTER +# define OPENSSL_NO_JITTER +# endif +# ifndef OPENSSL_NO_KTLS +# define OPENSSL_NO_KTLS +# endif +# ifndef OPENSSL_NO_LOADERENG +# define OPENSSL_NO_LOADERENG +# endif +# ifndef OPENSSL_NO_MD2 +# define OPENSSL_NO_MD2 +# endif +# ifndef OPENSSL_NO_MSAN +# define OPENSSL_NO_MSAN +# endif +# ifndef OPENSSL_NO_PIE +# define OPENSSL_NO_PIE +# endif +# ifndef OPENSSL_NO_RC5 +# define OPENSSL_NO_RC5 +# endif +# ifndef OPENSSL_NO_SCTP +# define OPENSSL_NO_SCTP +# endif +# ifndef OPENSSL_NO_SSL3 +# define OPENSSL_NO_SSL3 +# endif +# ifndef OPENSSL_NO_SSL3_METHOD +# define OPENSSL_NO_SSL3_METHOD +# endif +# ifndef OPENSSL_NO_SSLKEYLOG +# define OPENSSL_NO_SSLKEYLOG +# endif +# ifndef OPENSSL_NO_TESTS +# define OPENSSL_NO_TESTS +# endif +# ifndef OPENSSL_NO_TFO +# define OPENSSL_NO_TFO +# endif +# ifndef OPENSSL_NO_TRACE +# define OPENSSL_NO_TRACE +# endif +# ifndef OPENSSL_NO_UBSAN +# define OPENSSL_NO_UBSAN +# endif +# ifndef OPENSSL_NO_UNIT_TEST +# define OPENSSL_NO_UNIT_TEST +# endif +# ifndef OPENSSL_NO_UPLINK +# define OPENSSL_NO_UPLINK +# endif +# ifndef OPENSSL_NO_WEAK_SSL_CIPHERS +# define OPENSSL_NO_WEAK_SSL_CIPHERS +# endif +# ifndef OPENSSL_NO_WINSTORE +# define OPENSSL_NO_WINSTORE +# endif +# ifndef OPENSSL_NO_ZLIB_DYNAMIC +# define OPENSSL_NO_ZLIB_DYNAMIC +# endif +# ifndef OPENSSL_NO_ZSTD_DYNAMIC +# define OPENSSL_NO_ZSTD_DYNAMIC +# endif +# ifndef OPENSSL_NO_DYNAMIC_ENGINE +# define OPENSSL_NO_DYNAMIC_ENGINE +# endif + +/* clang-format on */ + +/* Generate 80386 code? */ +/* clang-format off */ +# undef I386_ONLY +/* clang-format on */ + +/* + * The following are cipher-specific, but are part of the public API. + */ +#if !defined(OPENSSL_SYS_UEFI) + /* clang-format off */ +# undef BN_LLONG + /* clang-format on */ + /* Only one for the following should be defined */ + /* clang-format off */ +# define SIXTY_FOUR_BIT_LONG + /* clang-format on */ + /* clang-format off */ +# undef SIXTY_FOUR_BIT + /* clang-format on */ + /* clang-format off */ +# undef THIRTY_TWO_BIT +/* clang-format on */ +#endif + +/* clang-format off */ +# define RC4_INT unsigned char +/* clang-format on */ + +#if defined(OPENSSL_NO_COMP) || (defined(OPENSSL_NO_BROTLI) && defined(OPENSSL_NO_ZSTD) && defined(OPENSSL_NO_ZLIB)) +#define OPENSSL_NO_COMP_ALG +#else +#undef OPENSSL_NO_COMP_ALG +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* OPENSSL_CONFIGURATION_H */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/core_names.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/core_names.h new file mode 100644 index 000000000000..aa445e8f1de7 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/core_names.h @@ -0,0 +1,579 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/core_names.h.in + * + * Copyright 2019-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_CORE_NAMES_H +#define OPENSSL_CORE_NAMES_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/* OSSL_CIPHER_PARAM_CTS_MODE Values */ +#define OSSL_CIPHER_CTS_MODE_CS1 "CS1" +#define OSSL_CIPHER_CTS_MODE_CS2 "CS2" +#define OSSL_CIPHER_CTS_MODE_CS3 "CS3" + +/* Known CIPHER names (not a complete list) */ +#define OSSL_CIPHER_NAME_AES_128_GCM_SIV "AES-128-GCM-SIV" +#define OSSL_CIPHER_NAME_AES_192_GCM_SIV "AES-192-GCM-SIV" +#define OSSL_CIPHER_NAME_AES_256_GCM_SIV "AES-256-GCM-SIV" + +/* Known DIGEST names (not a complete list) */ +#define OSSL_DIGEST_NAME_MD5 "MD5" +#define OSSL_DIGEST_NAME_MD5_SHA1 "MD5-SHA1" +#define OSSL_DIGEST_NAME_SHA1 "SHA1" +#define OSSL_DIGEST_NAME_SHA2_224 "SHA2-224" +#define OSSL_DIGEST_NAME_SHA2_256 "SHA2-256" +#define OSSL_DIGEST_NAME_SHA2_256_192 "SHA2-256/192" +#define OSSL_DIGEST_NAME_SHA2_384 "SHA2-384" +#define OSSL_DIGEST_NAME_SHA2_512 "SHA2-512" +#define OSSL_DIGEST_NAME_SHA2_512_224 "SHA2-512/224" +#define OSSL_DIGEST_NAME_SHA2_512_256 "SHA2-512/256" +#define OSSL_DIGEST_NAME_MD2 "MD2" +#define OSSL_DIGEST_NAME_MD4 "MD4" +#define OSSL_DIGEST_NAME_MDC2 "MDC2" +#define OSSL_DIGEST_NAME_RIPEMD160 "RIPEMD160" +#define OSSL_DIGEST_NAME_SHA3_224 "SHA3-224" +#define OSSL_DIGEST_NAME_SHA3_256 "SHA3-256" +#define OSSL_DIGEST_NAME_SHA3_384 "SHA3-384" +#define OSSL_DIGEST_NAME_SHA3_512 "SHA3-512" +#define OSSL_DIGEST_NAME_KECCAK_KMAC128 "KECCAK-KMAC-128" +#define OSSL_DIGEST_NAME_KECCAK_KMAC256 "KECCAK-KMAC-256" +#define OSSL_DIGEST_NAME_SM3 "SM3" + +/* Known MAC names */ +#define OSSL_MAC_NAME_BLAKE2BMAC "BLAKE2BMAC" +#define OSSL_MAC_NAME_BLAKE2SMAC "BLAKE2SMAC" +#define OSSL_MAC_NAME_CMAC "CMAC" +#define OSSL_MAC_NAME_GMAC "GMAC" +#define OSSL_MAC_NAME_HMAC "HMAC" +#define OSSL_MAC_NAME_KMAC128 "KMAC128" +#define OSSL_MAC_NAME_KMAC256 "KMAC256" +#define OSSL_MAC_NAME_POLY1305 "POLY1305" +#define OSSL_MAC_NAME_SIPHASH "SIPHASH" + +/* Known KDF names */ +#define OSSL_KDF_NAME_HKDF "HKDF" +#define OSSL_KDF_NAME_TLS1_3_KDF "TLS13-KDF" +#define OSSL_KDF_NAME_PBKDF1 "PBKDF1" +#define OSSL_KDF_NAME_PBKDF2 "PBKDF2" +#define OSSL_KDF_NAME_SCRYPT "SCRYPT" +#define OSSL_KDF_NAME_SSHKDF "SSHKDF" +#define OSSL_KDF_NAME_SSKDF "SSKDF" +#define OSSL_KDF_NAME_TLS1_PRF "TLS1-PRF" +#define OSSL_KDF_NAME_X942KDF_ASN1 "X942KDF-ASN1" +#define OSSL_KDF_NAME_X942KDF_CONCAT "X942KDF-CONCAT" +#define OSSL_KDF_NAME_X963KDF "X963KDF" +#define OSSL_KDF_NAME_KBKDF "KBKDF" +#define OSSL_KDF_NAME_KRB5KDF "KRB5KDF" +#define OSSL_KDF_NAME_HMACDRBGKDF "HMAC-DRBG-KDF" + +/* RSA padding modes */ +#define OSSL_PKEY_RSA_PAD_MODE_NONE "none" +#define OSSL_PKEY_RSA_PAD_MODE_PKCSV15 "pkcs1" +#define OSSL_PKEY_RSA_PAD_MODE_OAEP "oaep" +#define OSSL_PKEY_RSA_PAD_MODE_X931 "x931" +#define OSSL_PKEY_RSA_PAD_MODE_PSS "pss" + +/* RSA pss padding salt length */ +#define OSSL_PKEY_RSA_PSS_SALT_LEN_DIGEST "digest" +#define OSSL_PKEY_RSA_PSS_SALT_LEN_MAX "max" +#define OSSL_PKEY_RSA_PSS_SALT_LEN_AUTO "auto" +#define OSSL_PKEY_RSA_PSS_SALT_LEN_AUTO_DIGEST_MAX "auto-digestmax" + +/* OSSL_PKEY_PARAM_EC_ENCODING values */ +#define OSSL_PKEY_EC_ENCODING_EXPLICIT "explicit" +#define OSSL_PKEY_EC_ENCODING_GROUP "named_curve" + +#define OSSL_PKEY_EC_POINT_CONVERSION_FORMAT_UNCOMPRESSED "uncompressed" +#define OSSL_PKEY_EC_POINT_CONVERSION_FORMAT_COMPRESSED "compressed" +#define OSSL_PKEY_EC_POINT_CONVERSION_FORMAT_HYBRID "hybrid" + +#define OSSL_PKEY_EC_GROUP_CHECK_DEFAULT "default" +#define OSSL_PKEY_EC_GROUP_CHECK_NAMED "named" +#define OSSL_PKEY_EC_GROUP_CHECK_NAMED_NIST "named-nist" + +/* PROV_SKEY well known key types */ +#define OSSL_SKEY_TYPE_GENERIC "GENERIC-SECRET" +#define OSSL_SKEY_TYPE_AES "AES" + +/* OSSL_KEM_PARAM_OPERATION values */ +#define OSSL_KEM_PARAM_OPERATION_RSASVE "RSASVE" +#define OSSL_KEM_PARAM_OPERATION_DHKEM "DHKEM" + +/* Provider configuration variables */ +#define OSSL_PKEY_RETAIN_SEED "pkey_retain_seed" + +/* Parameter name definitions - generated by util/perl/OpenSSL/paramnames.pm */ +/* clang-format off */ +# define OSSL_ALG_PARAM_ALGORITHM_ID "algorithm-id" +# define OSSL_ALG_PARAM_ALGORITHM_ID_PARAMS "algorithm-id-params" +# define OSSL_ALG_PARAM_CIPHER "cipher" +# define OSSL_ALG_PARAM_DIGEST "digest" +# define OSSL_ALG_PARAM_ENGINE "engine" +# define OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR "fips-indicator" +# define OSSL_ALG_PARAM_MAC "mac" +# define OSSL_ALG_PARAM_PROPERTIES "properties" +# define OSSL_ASYM_CIPHER_PARAM_DIGEST OSSL_PKEY_PARAM_DIGEST +# define OSSL_ASYM_CIPHER_PARAM_ENGINE OSSL_PKEY_PARAM_ENGINE +# define OSSL_ASYM_CIPHER_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_ASYM_CIPHER_PARAM_FIPS_KEY_CHECK OSSL_PKEY_PARAM_FIPS_KEY_CHECK +# define OSSL_ASYM_CIPHER_PARAM_FIPS_RSA_PKCS15_PAD_DISABLED OSSL_PROV_PARAM_RSA_PKCS15_PAD_DISABLED +# define OSSL_ASYM_CIPHER_PARAM_IMPLICIT_REJECTION "implicit-rejection" +# define OSSL_ASYM_CIPHER_PARAM_MGF1_DIGEST OSSL_PKEY_PARAM_MGF1_DIGEST +# define OSSL_ASYM_CIPHER_PARAM_MGF1_DIGEST_PROPS OSSL_PKEY_PARAM_MGF1_PROPERTIES +# define OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST OSSL_ALG_PARAM_DIGEST +# define OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST_PROPS "digest-props" +# define OSSL_ASYM_CIPHER_PARAM_OAEP_LABEL "oaep-label" +# define OSSL_ASYM_CIPHER_PARAM_PAD_MODE OSSL_PKEY_PARAM_PAD_MODE +# define OSSL_ASYM_CIPHER_PARAM_PROPERTIES OSSL_PKEY_PARAM_PROPERTIES +# define OSSL_ASYM_CIPHER_PARAM_TLS_CLIENT_VERSION "tls-client-version" +# define OSSL_ASYM_CIPHER_PARAM_TLS_NEGOTIATED_VERSION "tls-negotiated-version" +# define OSSL_CAPABILITY_TLS_GROUP_ALG "tls-group-alg" +# define OSSL_CAPABILITY_TLS_GROUP_ID "tls-group-id" +# define OSSL_CAPABILITY_TLS_GROUP_IS_KEM "tls-group-is-kem" +# define OSSL_CAPABILITY_TLS_GROUP_MAX_DTLS "tls-max-dtls" +# define OSSL_CAPABILITY_TLS_GROUP_MAX_TLS "tls-max-tls" +# define OSSL_CAPABILITY_TLS_GROUP_MIN_DTLS "tls-min-dtls" +# define OSSL_CAPABILITY_TLS_GROUP_MIN_TLS "tls-min-tls" +# define OSSL_CAPABILITY_TLS_GROUP_NAME "tls-group-name" +# define OSSL_CAPABILITY_TLS_GROUP_NAME_INTERNAL "tls-group-name-internal" +# define OSSL_CAPABILITY_TLS_GROUP_SECURITY_BITS "tls-group-sec-bits" +# define OSSL_CAPABILITY_TLS_SIGALG_CODE_POINT "tls-sigalg-code-point" +# define OSSL_CAPABILITY_TLS_SIGALG_HASH_NAME "tls-sigalg-hash-name" +# define OSSL_CAPABILITY_TLS_SIGALG_HASH_OID "tls-sigalg-hash-oid" +# define OSSL_CAPABILITY_TLS_SIGALG_IANA_NAME "tls-sigalg-iana-name" +# define OSSL_CAPABILITY_TLS_SIGALG_KEYTYPE "tls-sigalg-keytype" +# define OSSL_CAPABILITY_TLS_SIGALG_KEYTYPE_OID "tls-sigalg-keytype-oid" +# define OSSL_CAPABILITY_TLS_SIGALG_MAX_DTLS "tls-max-dtls" +# define OSSL_CAPABILITY_TLS_SIGALG_MAX_TLS "tls-max-tls" +# define OSSL_CAPABILITY_TLS_SIGALG_MIN_DTLS "tls-min-dtls" +# define OSSL_CAPABILITY_TLS_SIGALG_MIN_TLS "tls-min-tls" +# define OSSL_CAPABILITY_TLS_SIGALG_NAME "tls-sigalg-name" +# define OSSL_CAPABILITY_TLS_SIGALG_OID "tls-sigalg-oid" +# define OSSL_CAPABILITY_TLS_SIGALG_SECURITY_BITS "tls-sigalg-sec-bits" +# define OSSL_CAPABILITY_TLS_SIGALG_SIG_NAME "tls-sigalg-sig-name" +# define OSSL_CAPABILITY_TLS_SIGALG_SIG_OID "tls-sigalg-sig-oid" +# define OSSL_CIPHER_PARAM_AEAD "aead" +# define OSSL_CIPHER_PARAM_AEAD_IVLEN OSSL_CIPHER_PARAM_IVLEN +# define OSSL_CIPHER_PARAM_AEAD_IV_GENERATED "iv-generated" +# define OSSL_CIPHER_PARAM_AEAD_MAC_KEY "mackey" +# define OSSL_CIPHER_PARAM_AEAD_TAG "tag" +# define OSSL_CIPHER_PARAM_AEAD_TAGLEN "taglen" +# define OSSL_CIPHER_PARAM_AEAD_TLS1_AAD "tlsaad" +# define OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD "tlsaadpad" +# define OSSL_CIPHER_PARAM_AEAD_TLS1_GET_IV_GEN "tlsivgen" +# define OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED "tlsivfixed" +# define OSSL_CIPHER_PARAM_AEAD_TLS1_SET_IV_INV "tlsivinv" +# define OSSL_CIPHER_PARAM_ALGORITHM_ID OSSL_ALG_PARAM_ALGORITHM_ID +# define OSSL_CIPHER_PARAM_ALGORITHM_ID_PARAMS OSSL_ALG_PARAM_ALGORITHM_ID_PARAMS +# define OSSL_CIPHER_PARAM_ALGORITHM_ID_PARAMS_OLD "alg_id_param" +# define OSSL_CIPHER_PARAM_BLOCK_SIZE "blocksize" +# define OSSL_CIPHER_PARAM_CTS "cts" +# define OSSL_CIPHER_PARAM_CTS_MODE "cts_mode" +# define OSSL_CIPHER_PARAM_CUSTOM_IV "custom-iv" +# define OSSL_CIPHER_PARAM_DECRYPT_ONLY "decrypt-only" +# define OSSL_CIPHER_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_CIPHER_PARAM_FIPS_ENCRYPT_CHECK "encrypt-check" +# define OSSL_CIPHER_PARAM_HAS_RAND_KEY "has-randkey" +# define OSSL_CIPHER_PARAM_IV "iv" +# define OSSL_CIPHER_PARAM_IVLEN "ivlen" +# define OSSL_CIPHER_PARAM_KEYLEN "keylen" +# define OSSL_CIPHER_PARAM_MODE "mode" +# define OSSL_CIPHER_PARAM_NUM "num" +# define OSSL_CIPHER_PARAM_PADDING "padding" +# define OSSL_CIPHER_PARAM_PIPELINE_AEAD_TAG "pipeline-tag" +# define OSSL_CIPHER_PARAM_RANDOM_KEY "randkey" +# define OSSL_CIPHER_PARAM_RC2_KEYBITS "keybits" +# define OSSL_CIPHER_PARAM_ROUNDS "rounds" +# define OSSL_CIPHER_PARAM_SPEED "speed" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK "tls-multi" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD "tls1multi_aad" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD_PACKLEN "tls1multi_aadpacklen" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC "tls1multi_enc" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_IN "tls1multi_encin" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_LEN "tls1multi_enclen" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE "tls1multi_interleave" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_BUFSIZE "tls1multi_maxbufsz" +# define OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_SEND_FRAGMENT "tls1multi_maxsndfrag" +# define OSSL_CIPHER_PARAM_TLS_MAC "tls-mac" +# define OSSL_CIPHER_PARAM_TLS_MAC_SIZE "tls-mac-size" +# define OSSL_CIPHER_PARAM_TLS_VERSION "tls-version" +# define OSSL_CIPHER_PARAM_UPDATED_IV "updated-iv" +# define OSSL_CIPHER_PARAM_USE_BITS "use-bits" +# define OSSL_CIPHER_PARAM_XTS_STANDARD "xts_standard" +# define OSSL_DECODER_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +# define OSSL_DIGEST_PARAM_ALGID_ABSENT "algid-absent" +# define OSSL_DIGEST_PARAM_BLOCK_SIZE "blocksize" +# define OSSL_DIGEST_PARAM_MICALG "micalg" +# define OSSL_DIGEST_PARAM_PAD_TYPE "pad-type" +# define OSSL_DIGEST_PARAM_SIZE "size" +# define OSSL_DIGEST_PARAM_SSL3_MS "ssl3-ms" +# define OSSL_DIGEST_PARAM_XOF "xof" +# define OSSL_DIGEST_PARAM_XOFLEN "xoflen" +# define OSSL_DRBG_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER +# define OSSL_DRBG_PARAM_DIGEST OSSL_ALG_PARAM_DIGEST +# define OSSL_DRBG_PARAM_ENTROPY_REQUIRED "entropy_required" +# define OSSL_DRBG_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_DRBG_PARAM_FIPS_DIGEST_CHECK OSSL_PKEY_PARAM_FIPS_DIGEST_CHECK +# define OSSL_DRBG_PARAM_MAC OSSL_ALG_PARAM_MAC +# define OSSL_DRBG_PARAM_MAX_ADINLEN "max_adinlen" +# define OSSL_DRBG_PARAM_MAX_ENTROPYLEN "max_entropylen" +# define OSSL_DRBG_PARAM_MAX_LENGTH "maxium_length" +# define OSSL_DRBG_PARAM_MAX_NONCELEN "max_noncelen" +# define OSSL_DRBG_PARAM_MAX_PERSLEN "max_perslen" +# define OSSL_DRBG_PARAM_MIN_ENTROPYLEN "min_entropylen" +# define OSSL_DRBG_PARAM_MIN_LENGTH "minium_length" +# define OSSL_DRBG_PARAM_MIN_NONCELEN "min_noncelen" +# define OSSL_DRBG_PARAM_PREDICTION_RESISTANCE "prediction_resistance" +# define OSSL_DRBG_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +# define OSSL_DRBG_PARAM_RANDOM_DATA "random_data" +# define OSSL_DRBG_PARAM_RESEED_COUNTER "reseed_counter" +# define OSSL_DRBG_PARAM_RESEED_REQUESTS "reseed_requests" +# define OSSL_DRBG_PARAM_RESEED_TIME "reseed_time" +# define OSSL_DRBG_PARAM_RESEED_TIME_INTERVAL "reseed_time_interval" +# define OSSL_DRBG_PARAM_SIZE "size" +# define OSSL_DRBG_PARAM_USE_DF "use_derivation_function" +# define OSSL_ENCODER_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER +# define OSSL_ENCODER_PARAM_ENCRYPT_LEVEL "encrypt-level" +# define OSSL_ENCODER_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +# define OSSL_ENCODER_PARAM_SAVE_PARAMETERS "save-parameters" +# define OSSL_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE "ecdh-cofactor-mode" +# define OSSL_EXCHANGE_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_EXCHANGE_PARAM_FIPS_DIGEST_CHECK OSSL_PKEY_PARAM_FIPS_DIGEST_CHECK +# define OSSL_EXCHANGE_PARAM_FIPS_ECDH_COFACTOR_CHECK OSSL_PROV_PARAM_ECDH_COFACTOR_CHECK +# define OSSL_EXCHANGE_PARAM_FIPS_KEY_CHECK OSSL_PKEY_PARAM_FIPS_KEY_CHECK +# define OSSL_EXCHANGE_PARAM_KDF_DIGEST "kdf-digest" +# define OSSL_EXCHANGE_PARAM_KDF_DIGEST_PROPS "kdf-digest-props" +# define OSSL_EXCHANGE_PARAM_KDF_OUTLEN "kdf-outlen" +# define OSSL_EXCHANGE_PARAM_KDF_TYPE "kdf-type" +# define OSSL_EXCHANGE_PARAM_KDF_UKM "kdf-ukm" +# define OSSL_EXCHANGE_PARAM_PAD "pad" +# define OSSL_GEN_PARAM_ITERATION "iteration" +# define OSSL_GEN_PARAM_POTENTIAL "potential" +# define OSSL_KDF_PARAM_ARGON2_AD "ad" +# define OSSL_KDF_PARAM_ARGON2_LANES "lanes" +# define OSSL_KDF_PARAM_ARGON2_MEMCOST "memcost" +# define OSSL_KDF_PARAM_ARGON2_VERSION "version" +# define OSSL_KDF_PARAM_CEK_ALG "cekalg" +# define OSSL_KDF_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER +# define OSSL_KDF_PARAM_CONSTANT "constant" +# define OSSL_KDF_PARAM_DATA "data" +# define OSSL_KDF_PARAM_DIGEST OSSL_ALG_PARAM_DIGEST +# define OSSL_KDF_PARAM_EARLY_CLEAN "early_clean" +# define OSSL_KDF_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_KDF_PARAM_FIPS_DIGEST_CHECK OSSL_PKEY_PARAM_FIPS_DIGEST_CHECK +# define OSSL_KDF_PARAM_FIPS_EMS_CHECK "ems_check" +# define OSSL_KDF_PARAM_FIPS_KEY_CHECK OSSL_PKEY_PARAM_FIPS_KEY_CHECK +# define OSSL_KDF_PARAM_HMACDRBG_ENTROPY "entropy" +# define OSSL_KDF_PARAM_HMACDRBG_NONCE "nonce" +# define OSSL_KDF_PARAM_INFO "info" +# define OSSL_KDF_PARAM_ITER "iter" +# define OSSL_KDF_PARAM_KBKDF_R "r" +# define OSSL_KDF_PARAM_KBKDF_USE_L "use-l" +# define OSSL_KDF_PARAM_KBKDF_USE_SEPARATOR "use-separator" +# define OSSL_KDF_PARAM_KEY "key" +# define OSSL_KDF_PARAM_LABEL "label" +# define OSSL_KDF_PARAM_MAC OSSL_ALG_PARAM_MAC +# define OSSL_KDF_PARAM_MAC_SIZE "maclen" +# define OSSL_KDF_PARAM_MODE "mode" +# define OSSL_KDF_PARAM_PASSWORD "pass" +# define OSSL_KDF_PARAM_PKCS12_ID "id" +# define OSSL_KDF_PARAM_PKCS5 "pkcs5" +# define OSSL_KDF_PARAM_PREFIX "prefix" +# define OSSL_KDF_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +# define OSSL_KDF_PARAM_SALT "salt" +# define OSSL_KDF_PARAM_SCRYPT_MAXMEM "maxmem_bytes" +# define OSSL_KDF_PARAM_SCRYPT_N "n" +# define OSSL_KDF_PARAM_SCRYPT_P "p" +# define OSSL_KDF_PARAM_SCRYPT_R "r" +# define OSSL_KDF_PARAM_SECRET "secret" +# define OSSL_KDF_PARAM_SEED "seed" +# define OSSL_KDF_PARAM_SIZE "size" +# define OSSL_KDF_PARAM_SSHKDF_SESSION_ID "session_id" +# define OSSL_KDF_PARAM_SSHKDF_TYPE "type" +# define OSSL_KDF_PARAM_SSHKDF_XCGHASH "xcghash" +# define OSSL_KDF_PARAM_THREADS "threads" +# define OSSL_KDF_PARAM_UKM "ukm" +# define OSSL_KDF_PARAM_X942_ACVPINFO "acvp-info" +# define OSSL_KDF_PARAM_X942_PARTYUINFO "partyu-info" +# define OSSL_KDF_PARAM_X942_PARTYVINFO "partyv-info" +# define OSSL_KDF_PARAM_X942_SUPP_PRIVINFO "supp-privinfo" +# define OSSL_KDF_PARAM_X942_SUPP_PUBINFO "supp-pubinfo" +# define OSSL_KDF_PARAM_X942_USE_KEYBITS "use-keybits" +# define OSSL_KEM_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_KEM_PARAM_FIPS_KEY_CHECK OSSL_PKEY_PARAM_FIPS_KEY_CHECK +# define OSSL_KEM_PARAM_IKME "ikme" +# define OSSL_KEM_PARAM_OPERATION "operation" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_BLOCK_PADDING "block_padding" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_HS_PADDING "hs_padding" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_MAX_EARLY_DATA "max_early_data" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_MAX_FRAG_LEN "max_frag_len" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_MODE "mode" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_OPTIONS "options" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_READ_AHEAD "read_ahead" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_STREAM_MAC "stream_mac" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_TLSTREE "tlstree" +# define OSSL_LIBSSL_RECORD_LAYER_PARAM_USE_ETM "use_etm" +# define OSSL_LIBSSL_RECORD_LAYER_READ_BUFFER_LEN "read_buffer_len" +# define OSSL_MAC_PARAM_BLOCK_SIZE "block-size" +# define OSSL_MAC_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER +# define OSSL_MAC_PARAM_CUSTOM "custom" +# define OSSL_MAC_PARAM_C_ROUNDS "c-rounds" +# define OSSL_MAC_PARAM_DIGEST OSSL_ALG_PARAM_DIGEST +# define OSSL_MAC_PARAM_DIGEST_NOINIT "digest-noinit" +# define OSSL_MAC_PARAM_DIGEST_ONESHOT "digest-oneshot" +# define OSSL_MAC_PARAM_D_ROUNDS "d-rounds" +# define OSSL_MAC_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_MAC_PARAM_FIPS_KEY_CHECK OSSL_PKEY_PARAM_FIPS_KEY_CHECK +# define OSSL_MAC_PARAM_FIPS_NO_SHORT_MAC OSSL_PROV_PARAM_NO_SHORT_MAC +# define OSSL_MAC_PARAM_IV "iv" +# define OSSL_MAC_PARAM_KEY "key" +# define OSSL_MAC_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +# define OSSL_MAC_PARAM_SALT "salt" +# define OSSL_MAC_PARAM_SIZE "size" +# define OSSL_MAC_PARAM_TLS_DATA_SIZE "tls-data-size" +# define OSSL_MAC_PARAM_XOF "xof" +# define OSSL_OBJECT_PARAM_DATA "data" +# define OSSL_OBJECT_PARAM_DATA_STRUCTURE "data-structure" +# define OSSL_OBJECT_PARAM_DATA_TYPE "data-type" +# define OSSL_OBJECT_PARAM_DESC "desc" +# define OSSL_OBJECT_PARAM_INPUT_TYPE "input-type" +# define OSSL_OBJECT_PARAM_REFERENCE "reference" +# define OSSL_OBJECT_PARAM_TYPE "type" +# define OSSL_PASSPHRASE_PARAM_INFO "info" +# define OSSL_PKEY_PARAM_ALGORITHM_ID OSSL_ALG_PARAM_ALGORITHM_ID +# define OSSL_PKEY_PARAM_ALGORITHM_ID_PARAMS OSSL_ALG_PARAM_ALGORITHM_ID_PARAMS +# define OSSL_PKEY_PARAM_BITS "bits" +# define OSSL_PKEY_PARAM_CIPHER OSSL_ALG_PARAM_CIPHER +# define OSSL_PKEY_PARAM_DEFAULT_DIGEST "default-digest" +# define OSSL_PKEY_PARAM_DHKEM_IKM "dhkem-ikm" +# define OSSL_PKEY_PARAM_DH_GENERATOR "safeprime-generator" +# define OSSL_PKEY_PARAM_DH_PRIV_LEN "priv_len" +# define OSSL_PKEY_PARAM_DIGEST OSSL_ALG_PARAM_DIGEST +# define OSSL_PKEY_PARAM_DIGEST_SIZE "digest-size" +# define OSSL_PKEY_PARAM_DIST_ID "distid" +# define OSSL_PKEY_PARAM_EC_A "a" +# define OSSL_PKEY_PARAM_EC_B "b" +# define OSSL_PKEY_PARAM_EC_CHAR2_M "m" +# define OSSL_PKEY_PARAM_EC_CHAR2_PP_K1 "k1" +# define OSSL_PKEY_PARAM_EC_CHAR2_PP_K2 "k2" +# define OSSL_PKEY_PARAM_EC_CHAR2_PP_K3 "k3" +# define OSSL_PKEY_PARAM_EC_CHAR2_TP_BASIS "tp" +# define OSSL_PKEY_PARAM_EC_CHAR2_TYPE "basis-type" +# define OSSL_PKEY_PARAM_EC_COFACTOR "cofactor" +# define OSSL_PKEY_PARAM_EC_DECODED_FROM_EXPLICIT_PARAMS "decoded-from-explicit" +# define OSSL_PKEY_PARAM_EC_ENCODING "encoding" +# define OSSL_PKEY_PARAM_EC_FIELD_TYPE "field-type" +# define OSSL_PKEY_PARAM_EC_GENERATOR "generator" +# define OSSL_PKEY_PARAM_EC_GROUP_CHECK_TYPE "group-check" +# define OSSL_PKEY_PARAM_EC_INCLUDE_PUBLIC "include-public" +# define OSSL_PKEY_PARAM_EC_ORDER "order" +# define OSSL_PKEY_PARAM_EC_P "p" +# define OSSL_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT "point-format" +# define OSSL_PKEY_PARAM_EC_PUB_X "qx" +# define OSSL_PKEY_PARAM_EC_PUB_Y "qy" +# define OSSL_PKEY_PARAM_EC_SEED "seed" +# define OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY "encoded-pub-key" +# define OSSL_PKEY_PARAM_ENGINE OSSL_ALG_PARAM_ENGINE +# define OSSL_PKEY_PARAM_FFC_COFACTOR "j" +# define OSSL_PKEY_PARAM_FFC_DIGEST OSSL_PKEY_PARAM_DIGEST +# define OSSL_PKEY_PARAM_FFC_DIGEST_PROPS OSSL_PKEY_PARAM_PROPERTIES +# define OSSL_PKEY_PARAM_FFC_G "g" +# define OSSL_PKEY_PARAM_FFC_GINDEX "gindex" +# define OSSL_PKEY_PARAM_FFC_H "hindex" +# define OSSL_PKEY_PARAM_FFC_P "p" +# define OSSL_PKEY_PARAM_FFC_PBITS "pbits" +# define OSSL_PKEY_PARAM_FFC_PCOUNTER "pcounter" +# define OSSL_PKEY_PARAM_FFC_Q "q" +# define OSSL_PKEY_PARAM_FFC_QBITS "qbits" +# define OSSL_PKEY_PARAM_FFC_SEED "seed" +# define OSSL_PKEY_PARAM_FFC_TYPE "type" +# define OSSL_PKEY_PARAM_FFC_VALIDATE_G "validate-g" +# define OSSL_PKEY_PARAM_FFC_VALIDATE_LEGACY "validate-legacy" +# define OSSL_PKEY_PARAM_FFC_VALIDATE_PQ "validate-pq" +# define OSSL_PKEY_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_PKEY_PARAM_FIPS_DIGEST_CHECK "digest-check" +# define OSSL_PKEY_PARAM_FIPS_KEY_CHECK "key-check" +# define OSSL_PKEY_PARAM_FIPS_SIGN_CHECK "sign-check" +# define OSSL_PKEY_PARAM_GROUP_NAME "group" +# define OSSL_PKEY_PARAM_IMPLICIT_REJECTION "implicit-rejection" +# define OSSL_PKEY_PARAM_MANDATORY_DIGEST "mandatory-digest" +# define OSSL_PKEY_PARAM_MASKGENFUNC "mgf" +# define OSSL_PKEY_PARAM_MAX_SIZE "max-size" +# define OSSL_PKEY_PARAM_MGF1_DIGEST "mgf1-digest" +# define OSSL_PKEY_PARAM_MGF1_PROPERTIES "mgf1-properties" +# define OSSL_PKEY_PARAM_ML_DSA_INPUT_FORMATS "ml-dsa.input_formats" +# define OSSL_PKEY_PARAM_ML_DSA_OUTPUT_FORMATS "ml-dsa.output_formats" +# define OSSL_PKEY_PARAM_ML_DSA_PREFER_SEED "ml-dsa.prefer_seed" +# define OSSL_PKEY_PARAM_ML_DSA_RETAIN_SEED "ml-dsa.retain_seed" +# define OSSL_PKEY_PARAM_ML_DSA_SEED "seed" +# define OSSL_PKEY_PARAM_ML_KEM_IMPORT_PCT_TYPE "ml-kem.import_pct_type" +# define OSSL_PKEY_PARAM_ML_KEM_INPUT_FORMATS "ml-kem.input_formats" +# define OSSL_PKEY_PARAM_ML_KEM_OUTPUT_FORMATS "ml-kem.output_formats" +# define OSSL_PKEY_PARAM_ML_KEM_PREFER_SEED "ml-kem.prefer_seed" +# define OSSL_PKEY_PARAM_ML_KEM_RETAIN_SEED "ml-kem.retain_seed" +# define OSSL_PKEY_PARAM_ML_KEM_SEED "seed" +# define OSSL_PKEY_PARAM_PAD_MODE "pad-mode" +# define OSSL_PKEY_PARAM_PRIV_KEY "priv" +# define OSSL_PKEY_PARAM_PROPERTIES OSSL_ALG_PARAM_PROPERTIES +# define OSSL_PKEY_PARAM_PUB_KEY "pub" +# define OSSL_PKEY_PARAM_RSA_BITS OSSL_PKEY_PARAM_BITS +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT "rsa-coefficient" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT1 "rsa-coefficient1" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT2 "rsa-coefficient2" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT3 "rsa-coefficient3" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT4 "rsa-coefficient4" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT5 "rsa-coefficient5" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT6 "rsa-coefficient6" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT7 "rsa-coefficient7" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT8 "rsa-coefficient8" +# define OSSL_PKEY_PARAM_RSA_COEFFICIENT9 "rsa-coefficient9" +# define OSSL_PKEY_PARAM_RSA_D "d" +# define OSSL_PKEY_PARAM_RSA_DERIVE_FROM_PQ "rsa-derive-from-pq" +# define OSSL_PKEY_PARAM_RSA_DIGEST OSSL_PKEY_PARAM_DIGEST +# define OSSL_PKEY_PARAM_RSA_DIGEST_PROPS OSSL_PKEY_PARAM_PROPERTIES +# define OSSL_PKEY_PARAM_RSA_E "e" +# define OSSL_PKEY_PARAM_RSA_EXPONENT "rsa-exponent" +# define OSSL_PKEY_PARAM_RSA_EXPONENT1 "rsa-exponent1" +# define OSSL_PKEY_PARAM_RSA_EXPONENT10 "rsa-exponent10" +# define OSSL_PKEY_PARAM_RSA_EXPONENT2 "rsa-exponent2" +# define OSSL_PKEY_PARAM_RSA_EXPONENT3 "rsa-exponent3" +# define OSSL_PKEY_PARAM_RSA_EXPONENT4 "rsa-exponent4" +# define OSSL_PKEY_PARAM_RSA_EXPONENT5 "rsa-exponent5" +# define OSSL_PKEY_PARAM_RSA_EXPONENT6 "rsa-exponent6" +# define OSSL_PKEY_PARAM_RSA_EXPONENT7 "rsa-exponent7" +# define OSSL_PKEY_PARAM_RSA_EXPONENT8 "rsa-exponent8" +# define OSSL_PKEY_PARAM_RSA_EXPONENT9 "rsa-exponent9" +# define OSSL_PKEY_PARAM_RSA_FACTOR "rsa-factor" +# define OSSL_PKEY_PARAM_RSA_FACTOR1 "rsa-factor1" +# define OSSL_PKEY_PARAM_RSA_FACTOR10 "rsa-factor10" +# define OSSL_PKEY_PARAM_RSA_FACTOR2 "rsa-factor2" +# define OSSL_PKEY_PARAM_RSA_FACTOR3 "rsa-factor3" +# define OSSL_PKEY_PARAM_RSA_FACTOR4 "rsa-factor4" +# define OSSL_PKEY_PARAM_RSA_FACTOR5 "rsa-factor5" +# define OSSL_PKEY_PARAM_RSA_FACTOR6 "rsa-factor6" +# define OSSL_PKEY_PARAM_RSA_FACTOR7 "rsa-factor7" +# define OSSL_PKEY_PARAM_RSA_FACTOR8 "rsa-factor8" +# define OSSL_PKEY_PARAM_RSA_FACTOR9 "rsa-factor9" +# define OSSL_PKEY_PARAM_RSA_MASKGENFUNC OSSL_PKEY_PARAM_MASKGENFUNC +# define OSSL_PKEY_PARAM_RSA_MGF1_DIGEST OSSL_PKEY_PARAM_MGF1_DIGEST +# define OSSL_PKEY_PARAM_RSA_N "n" +# define OSSL_PKEY_PARAM_RSA_PRIMES "primes" +# define OSSL_PKEY_PARAM_RSA_PSS_SALTLEN "saltlen" +# define OSSL_PKEY_PARAM_RSA_TEST_P1 "p1" +# define OSSL_PKEY_PARAM_RSA_TEST_P2 "p2" +# define OSSL_PKEY_PARAM_RSA_TEST_Q1 "q1" +# define OSSL_PKEY_PARAM_RSA_TEST_Q2 "q2" +# define OSSL_PKEY_PARAM_RSA_TEST_XP "xp" +# define OSSL_PKEY_PARAM_RSA_TEST_XP1 "xp1" +# define OSSL_PKEY_PARAM_RSA_TEST_XP2 "xp2" +# define OSSL_PKEY_PARAM_RSA_TEST_XQ "xq" +# define OSSL_PKEY_PARAM_RSA_TEST_XQ1 "xq1" +# define OSSL_PKEY_PARAM_RSA_TEST_XQ2 "xq2" +# define OSSL_PKEY_PARAM_SECURITY_BITS "security-bits" +# define OSSL_PKEY_PARAM_SLH_DSA_SEED "seed" +# define OSSL_PKEY_PARAM_USE_COFACTOR_ECDH OSSL_PKEY_PARAM_USE_COFACTOR_FLAG +# define OSSL_PKEY_PARAM_USE_COFACTOR_FLAG "use-cofactor-flag" +# define OSSL_PROV_PARAM_BUILDINFO "buildinfo" +# define OSSL_PROV_PARAM_CORE_MODULE_FILENAME "module-filename" +# define OSSL_PROV_PARAM_CORE_PROV_NAME "provider-name" +# define OSSL_PROV_PARAM_CORE_VERSION "openssl-version" +# define OSSL_PROV_PARAM_DRBG_TRUNC_DIGEST "drbg-no-trunc-md" +# define OSSL_PROV_PARAM_DSA_SIGN_DISABLED "dsa-sign-disabled" +# define OSSL_PROV_PARAM_ECDH_COFACTOR_CHECK "ecdh-cofactor-check" +# define OSSL_PROV_PARAM_HKDF_DIGEST_CHECK "hkdf-digest-check" +# define OSSL_PROV_PARAM_HKDF_KEY_CHECK "hkdf-key-check" +# define OSSL_PROV_PARAM_HMAC_KEY_CHECK "hmac-key-check" +# define OSSL_PROV_PARAM_KBKDF_KEY_CHECK "kbkdf-key-check" +# define OSSL_PROV_PARAM_KMAC_KEY_CHECK "kmac-key-check" +# define OSSL_PROV_PARAM_NAME "name" +# define OSSL_PROV_PARAM_NO_SHORT_MAC "no-short-mac" +# define OSSL_PROV_PARAM_PBKDF2_LOWER_BOUND_CHECK "pbkdf2-lower-bound-check" +# define OSSL_PROV_PARAM_RSA_PKCS15_PAD_DISABLED "rsa-pkcs15-pad-disabled" +# define OSSL_PROV_PARAM_RSA_PSS_SALTLEN_CHECK "rsa-pss-saltlen-check" +# define OSSL_PROV_PARAM_RSA_SIGN_X931_PAD_DISABLED "rsa-sign-x931-pad-disabled" +# define OSSL_PROV_PARAM_SECURITY_CHECKS "security-checks" +# define OSSL_PROV_PARAM_SELF_TEST_DESC "st-desc" +# define OSSL_PROV_PARAM_SELF_TEST_PHASE "st-phase" +# define OSSL_PROV_PARAM_SELF_TEST_TYPE "st-type" +# define OSSL_PROV_PARAM_SIGNATURE_DIGEST_CHECK "signature-digest-check" +# define OSSL_PROV_PARAM_SSHKDF_DIGEST_CHECK "sshkdf-digest-check" +# define OSSL_PROV_PARAM_SSHKDF_KEY_CHECK "sshkdf-key-check" +# define OSSL_PROV_PARAM_SSKDF_DIGEST_CHECK "sskdf-digest-check" +# define OSSL_PROV_PARAM_SSKDF_KEY_CHECK "sskdf-key-check" +# define OSSL_PROV_PARAM_STATUS "status" +# define OSSL_PROV_PARAM_TDES_ENCRYPT_DISABLED "tdes-encrypt-disabled" +# define OSSL_PROV_PARAM_TLS13_KDF_DIGEST_CHECK "tls13-kdf-digest-check" +# define OSSL_PROV_PARAM_TLS13_KDF_KEY_CHECK "tls13-kdf-key-check" +# define OSSL_PROV_PARAM_TLS1_PRF_DIGEST_CHECK "tls1-prf-digest-check" +# define OSSL_PROV_PARAM_TLS1_PRF_EMS_CHECK "tls1-prf-ems-check" +# define OSSL_PROV_PARAM_TLS1_PRF_KEY_CHECK "tls1-prf-key-check" +# define OSSL_PROV_PARAM_VERSION "version" +# define OSSL_PROV_PARAM_X942KDF_KEY_CHECK "x942kdf-key-check" +# define OSSL_PROV_PARAM_X963KDF_DIGEST_CHECK "x963kdf-digest-check" +# define OSSL_PROV_PARAM_X963KDF_KEY_CHECK "x963kdf-key-check" +# define OSSL_RAND_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_RAND_PARAM_GENERATE "generate" +# define OSSL_RAND_PARAM_MAX_REQUEST "max_request" +# define OSSL_RAND_PARAM_STATE "state" +# define OSSL_RAND_PARAM_STRENGTH "strength" +# define OSSL_RAND_PARAM_TEST_ENTROPY "test_entropy" +# define OSSL_RAND_PARAM_TEST_NONCE "test_nonce" +# define OSSL_SIGNATURE_PARAM_ADD_RANDOM "additional-random" +# define OSSL_SIGNATURE_PARAM_ALGORITHM_ID OSSL_PKEY_PARAM_ALGORITHM_ID +# define OSSL_SIGNATURE_PARAM_ALGORITHM_ID_PARAMS OSSL_PKEY_PARAM_ALGORITHM_ID_PARAMS +# define OSSL_SIGNATURE_PARAM_CONTEXT_STRING "context-string" +# define OSSL_SIGNATURE_PARAM_DETERMINISTIC "deterministic" +# define OSSL_SIGNATURE_PARAM_DIGEST OSSL_PKEY_PARAM_DIGEST +# define OSSL_SIGNATURE_PARAM_DIGEST_SIZE OSSL_PKEY_PARAM_DIGEST_SIZE +# define OSSL_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR +# define OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK OSSL_PKEY_PARAM_FIPS_DIGEST_CHECK +# define OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK OSSL_PKEY_PARAM_FIPS_KEY_CHECK +# define OSSL_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK "rsa-pss-saltlen-check" +# define OSSL_SIGNATURE_PARAM_FIPS_SIGN_CHECK OSSL_PKEY_PARAM_FIPS_SIGN_CHECK +# define OSSL_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK "sign-x931-pad-check" +# define OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE "verify-message" +# define OSSL_SIGNATURE_PARAM_INSTANCE "instance" +# define OSSL_SIGNATURE_PARAM_KAT "kat" +# define OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING "message-encoding" +# define OSSL_SIGNATURE_PARAM_MGF1_DIGEST OSSL_PKEY_PARAM_MGF1_DIGEST +# define OSSL_SIGNATURE_PARAM_MGF1_PROPERTIES OSSL_PKEY_PARAM_MGF1_PROPERTIES +# define OSSL_SIGNATURE_PARAM_MU "mu" +# define OSSL_SIGNATURE_PARAM_NONCE_TYPE "nonce-type" +# define OSSL_SIGNATURE_PARAM_PAD_MODE OSSL_PKEY_PARAM_PAD_MODE +# define OSSL_SIGNATURE_PARAM_PROPERTIES OSSL_PKEY_PARAM_PROPERTIES +# define OSSL_SIGNATURE_PARAM_PSS_SALTLEN "saltlen" +# define OSSL_SIGNATURE_PARAM_SIGNATURE "signature" +# define OSSL_SIGNATURE_PARAM_TEST_ENTROPY "test-entropy" +# define OSSL_SKEY_PARAM_KEY_LENGTH "key-length" +# define OSSL_SKEY_PARAM_RAW_BYTES "raw-bytes" +# define OSSL_STORE_PARAM_ALIAS "alias" +# define OSSL_STORE_PARAM_DIGEST "digest" +# define OSSL_STORE_PARAM_EXPECT "expect" +# define OSSL_STORE_PARAM_FINGERPRINT "fingerprint" +# define OSSL_STORE_PARAM_INPUT_TYPE "input-type" +# define OSSL_STORE_PARAM_ISSUER "name" +# define OSSL_STORE_PARAM_PROPERTIES "properties" +# define OSSL_STORE_PARAM_SERIAL "serial" +# define OSSL_STORE_PARAM_SUBJECT "subject" +/* clang-format on */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/crmf.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/crmf.h new file mode 100644 index 000000000000..8b32ffb136b6 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/crmf.h @@ -0,0 +1,279 @@ +/*- + * WARNING: do not edit! + * Generated by Makefile from include/openssl/crmf.h.in + * + * Copyright 2007-2025 The OpenSSL Project Authors. All Rights Reserved. + * Copyright Nokia 2007-2019 + * Copyright Siemens AG 2015-2019 + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + * + * CRMF (RFC 4211) implementation by M. Peylo, M. Viljanen, and D. von Oheimb. + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_CRMF_H +#define OPENSSL_CRMF_H + +#include + +#ifndef OPENSSL_NO_CRMF +#include +#include +#include +#include /* for GENERAL_NAME etc. */ +#include + +/* explicit #includes not strictly needed since implied by the above: */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define OSSL_CRMF_POPOPRIVKEY_THISMESSAGE 0 +#define OSSL_CRMF_POPOPRIVKEY_SUBSEQUENTMESSAGE 1 +#define OSSL_CRMF_POPOPRIVKEY_DHMAC 2 +#define OSSL_CRMF_POPOPRIVKEY_AGREEMAC 3 +#define OSSL_CRMF_POPOPRIVKEY_ENCRYPTEDKEY 4 + +#define OSSL_CRMF_SUBSEQUENTMESSAGE_ENCRCERT 0 +#define OSSL_CRMF_SUBSEQUENTMESSAGE_CHALLENGERESP 1 +typedef struct ossl_crmf_encryptedvalue_st OSSL_CRMF_ENCRYPTEDVALUE; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_ENCRYPTEDVALUE) + +typedef struct ossl_crmf_encryptedkey_st OSSL_CRMF_ENCRYPTEDKEY; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_ENCRYPTEDKEY) + +typedef struct ossl_crmf_msg_st OSSL_CRMF_MSG; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_MSG) +DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_MSG) +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CRMF_MSG, OSSL_CRMF_MSG, OSSL_CRMF_MSG) +#define sk_OSSL_CRMF_MSG_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_value(sk, idx) ((OSSL_CRMF_MSG *)OPENSSL_sk_value(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk), (idx))) +#define sk_OSSL_CRMF_MSG_new(cmp) ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_new(ossl_check_OSSL_CRMF_MSG_compfunc_type(cmp))) +#define sk_OSSL_CRMF_MSG_new_null() ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CRMF_MSG_new_reserve(cmp, n) ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CRMF_MSG_compfunc_type(cmp), (n))) +#define sk_OSSL_CRMF_MSG_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CRMF_MSG_sk_type(sk), (n)) +#define sk_OSSL_CRMF_MSG_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_delete(sk, i) ((OSSL_CRMF_MSG *)OPENSSL_sk_delete(ossl_check_OSSL_CRMF_MSG_sk_type(sk), (i))) +#define sk_OSSL_CRMF_MSG_delete_ptr(sk, ptr) ((OSSL_CRMF_MSG *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr))) +#define sk_OSSL_CRMF_MSG_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr)) +#define sk_OSSL_CRMF_MSG_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr)) +#define sk_OSSL_CRMF_MSG_pop(sk) ((OSSL_CRMF_MSG *)OPENSSL_sk_pop(ossl_check_OSSL_CRMF_MSG_sk_type(sk))) +#define sk_OSSL_CRMF_MSG_shift(sk) ((OSSL_CRMF_MSG *)OPENSSL_sk_shift(ossl_check_OSSL_CRMF_MSG_sk_type(sk))) +#define sk_OSSL_CRMF_MSG_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CRMF_MSG_sk_type(sk),ossl_check_OSSL_CRMF_MSG_freefunc_type(freefunc)) +#define sk_OSSL_CRMF_MSG_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr), (idx)) +#define sk_OSSL_CRMF_MSG_set(sk, idx, ptr) ((OSSL_CRMF_MSG *)OPENSSL_sk_set(ossl_check_OSSL_CRMF_MSG_sk_type(sk), (idx), ossl_check_OSSL_CRMF_MSG_type(ptr))) +#define sk_OSSL_CRMF_MSG_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr)) +#define sk_OSSL_CRMF_MSG_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr)) +#define sk_OSSL_CRMF_MSG_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_type(ptr), pnum) +#define sk_OSSL_CRMF_MSG_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk)) +#define sk_OSSL_CRMF_MSG_dup(sk) ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk))) +#define sk_OSSL_CRMF_MSG_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CRMF_MSG) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_copyfunc_type(copyfunc), ossl_check_OSSL_CRMF_MSG_freefunc_type(freefunc))) +#define sk_OSSL_CRMF_MSG_set_cmp_func(sk, cmp) ((sk_OSSL_CRMF_MSG_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CRMF_MSG_sk_type(sk), ossl_check_OSSL_CRMF_MSG_compfunc_type(cmp))) + +/* clang-format on */ +typedef struct ossl_crmf_attributetypeandvalue_st OSSL_CRMF_ATTRIBUTETYPEANDVALUE; +void OSSL_CRMF_ATTRIBUTETYPEANDVALUE_free(OSSL_CRMF_ATTRIBUTETYPEANDVALUE *v); +DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CRMF_ATTRIBUTETYPEANDVALUE, OSSL_CRMF_ATTRIBUTETYPEANDVALUE, OSSL_CRMF_ATTRIBUTETYPEANDVALUE) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_value(sk, idx) ((OSSL_CRMF_ATTRIBUTETYPEANDVALUE *)OPENSSL_sk_value(ossl_check_const_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), (idx))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_new(cmp) ((STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) *)OPENSSL_sk_new(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_compfunc_type(cmp))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_new_null() ((STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_new_reserve(cmp, n) ((STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_compfunc_type(cmp), (n))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), (n)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_delete(sk, i) ((OSSL_CRMF_ATTRIBUTETYPEANDVALUE *)OPENSSL_sk_delete(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), (i))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_delete_ptr(sk, ptr) ((OSSL_CRMF_ATTRIBUTETYPEANDVALUE *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_pop(sk) ((OSSL_CRMF_ATTRIBUTETYPEANDVALUE *)OPENSSL_sk_pop(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_shift(sk) ((OSSL_CRMF_ATTRIBUTETYPEANDVALUE *)OPENSSL_sk_shift(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk),ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_freefunc_type(freefunc)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr), (idx)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_set(sk, idx, ptr) ((OSSL_CRMF_ATTRIBUTETYPEANDVALUE *)OPENSSL_sk_set(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), (idx), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_type(ptr), pnum) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk)) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_dup(sk) ((STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_copyfunc_type(copyfunc), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_freefunc_type(freefunc))) +#define sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_set_cmp_func(sk, cmp) ((sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_sk_type(sk), ossl_check_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct ossl_crmf_pbmparameter_st OSSL_CRMF_PBMPARAMETER; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_PBMPARAMETER) +typedef struct ossl_crmf_poposigningkey_st OSSL_CRMF_POPOSIGNINGKEY; +typedef struct ossl_crmf_certrequest_st OSSL_CRMF_CERTREQUEST; +typedef struct ossl_crmf_certid_st OSSL_CRMF_CERTID; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_CERTID) +DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_CERTID) +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_CRMF_CERTID, OSSL_CRMF_CERTID, OSSL_CRMF_CERTID) +#define sk_OSSL_CRMF_CERTID_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_value(sk, idx) ((OSSL_CRMF_CERTID *)OPENSSL_sk_value(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk), (idx))) +#define sk_OSSL_CRMF_CERTID_new(cmp) ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_new(ossl_check_OSSL_CRMF_CERTID_compfunc_type(cmp))) +#define sk_OSSL_CRMF_CERTID_new_null() ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_new_null()) +#define sk_OSSL_CRMF_CERTID_new_reserve(cmp, n) ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_CRMF_CERTID_compfunc_type(cmp), (n))) +#define sk_OSSL_CRMF_CERTID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), (n)) +#define sk_OSSL_CRMF_CERTID_free(sk) OPENSSL_sk_free(ossl_check_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_delete(sk, i) ((OSSL_CRMF_CERTID *)OPENSSL_sk_delete(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), (i))) +#define sk_OSSL_CRMF_CERTID_delete_ptr(sk, ptr) ((OSSL_CRMF_CERTID *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr))) +#define sk_OSSL_CRMF_CERTID_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr)) +#define sk_OSSL_CRMF_CERTID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr)) +#define sk_OSSL_CRMF_CERTID_pop(sk) ((OSSL_CRMF_CERTID *)OPENSSL_sk_pop(ossl_check_OSSL_CRMF_CERTID_sk_type(sk))) +#define sk_OSSL_CRMF_CERTID_shift(sk) ((OSSL_CRMF_CERTID *)OPENSSL_sk_shift(ossl_check_OSSL_CRMF_CERTID_sk_type(sk))) +#define sk_OSSL_CRMF_CERTID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_CRMF_CERTID_sk_type(sk),ossl_check_OSSL_CRMF_CERTID_freefunc_type(freefunc)) +#define sk_OSSL_CRMF_CERTID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr), (idx)) +#define sk_OSSL_CRMF_CERTID_set(sk, idx, ptr) ((OSSL_CRMF_CERTID *)OPENSSL_sk_set(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), (idx), ossl_check_OSSL_CRMF_CERTID_type(ptr))) +#define sk_OSSL_CRMF_CERTID_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr)) +#define sk_OSSL_CRMF_CERTID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr)) +#define sk_OSSL_CRMF_CERTID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_type(ptr), pnum) +#define sk_OSSL_CRMF_CERTID_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk)) +#define sk_OSSL_CRMF_CERTID_dup(sk) ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_dup(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk))) +#define sk_OSSL_CRMF_CERTID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_CRMF_CERTID) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_copyfunc_type(copyfunc), ossl_check_OSSL_CRMF_CERTID_freefunc_type(freefunc))) +#define sk_OSSL_CRMF_CERTID_set_cmp_func(sk, cmp) ((sk_OSSL_CRMF_CERTID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_CRMF_CERTID_sk_type(sk), ossl_check_OSSL_CRMF_CERTID_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct ossl_crmf_pkipublicationinfo_st OSSL_CRMF_PKIPUBLICATIONINFO; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_PKIPUBLICATIONINFO) +typedef struct ossl_crmf_singlepubinfo_st OSSL_CRMF_SINGLEPUBINFO; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_SINGLEPUBINFO) +typedef struct ossl_crmf_certtemplate_st OSSL_CRMF_CERTTEMPLATE; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_CERTTEMPLATE) +DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_CERTTEMPLATE) +typedef STACK_OF(OSSL_CRMF_MSG) OSSL_CRMF_MSGS; +DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_MSGS) + +typedef struct ossl_crmf_optionalvalidity_st OSSL_CRMF_OPTIONALVALIDITY; + +/* crmf_pbm.c */ +OSSL_CRMF_PBMPARAMETER *OSSL_CRMF_pbmp_new(OSSL_LIB_CTX *libctx, size_t slen, + int owfnid, size_t itercnt, + int macnid); +int OSSL_CRMF_pbm_new(OSSL_LIB_CTX *libctx, const char *propq, + const OSSL_CRMF_PBMPARAMETER *pbmp, + const unsigned char *msg, size_t msglen, + const unsigned char *sec, size_t seclen, + unsigned char **mac, size_t *maclen); + +/* crmf_lib.c */ +int OSSL_CRMF_MSG_set1_regCtrl_regToken(OSSL_CRMF_MSG *msg, + const ASN1_UTF8STRING *tok); +ASN1_UTF8STRING +*OSSL_CRMF_MSG_get0_regCtrl_regToken(const OSSL_CRMF_MSG *msg); +int OSSL_CRMF_MSG_set1_regCtrl_authenticator(OSSL_CRMF_MSG *msg, + const ASN1_UTF8STRING *auth); +ASN1_UTF8STRING +*OSSL_CRMF_MSG_get0_regCtrl_authenticator(const OSSL_CRMF_MSG *msg); +int OSSL_CRMF_MSG_PKIPublicationInfo_push0_SinglePubInfo(OSSL_CRMF_PKIPUBLICATIONINFO *pi, + OSSL_CRMF_SINGLEPUBINFO *spi); +#define OSSL_CRMF_PUB_METHOD_DONTCARE 0 +#define OSSL_CRMF_PUB_METHOD_X500 1 +#define OSSL_CRMF_PUB_METHOD_WEB 2 +#define OSSL_CRMF_PUB_METHOD_LDAP 3 +int OSSL_CRMF_MSG_set0_SinglePubInfo(OSSL_CRMF_SINGLEPUBINFO *spi, + int method, GENERAL_NAME *nm); +#define OSSL_CRMF_PUB_ACTION_DONTPUBLISH 0 +#define OSSL_CRMF_PUB_ACTION_PLEASEPUBLISH 1 +int OSSL_CRMF_MSG_set_PKIPublicationInfo_action(OSSL_CRMF_PKIPUBLICATIONINFO *pi, + int action); +int OSSL_CRMF_MSG_set1_regCtrl_pkiPublicationInfo(OSSL_CRMF_MSG *msg, + const OSSL_CRMF_PKIPUBLICATIONINFO *pi); +OSSL_CRMF_PKIPUBLICATIONINFO +*OSSL_CRMF_MSG_get0_regCtrl_pkiPublicationInfo(const OSSL_CRMF_MSG *msg); +int OSSL_CRMF_MSG_set1_regCtrl_protocolEncrKey(OSSL_CRMF_MSG *msg, + const X509_PUBKEY *pubkey); +X509_PUBKEY +*OSSL_CRMF_MSG_get0_regCtrl_protocolEncrKey(const OSSL_CRMF_MSG *msg); +int OSSL_CRMF_MSG_set1_regCtrl_oldCertID(OSSL_CRMF_MSG *msg, + const OSSL_CRMF_CERTID *cid); +OSSL_CRMF_CERTID +*OSSL_CRMF_MSG_get0_regCtrl_oldCertID(const OSSL_CRMF_MSG *msg); +OSSL_CRMF_CERTID *OSSL_CRMF_CERTID_gen(const X509_NAME *issuer, + const ASN1_INTEGER *serial); + +int OSSL_CRMF_MSG_set1_regInfo_utf8Pairs(OSSL_CRMF_MSG *msg, + const ASN1_UTF8STRING *utf8pairs); +ASN1_UTF8STRING +*OSSL_CRMF_MSG_get0_regInfo_utf8Pairs(const OSSL_CRMF_MSG *msg); +int OSSL_CRMF_MSG_set1_regInfo_certReq(OSSL_CRMF_MSG *msg, + const OSSL_CRMF_CERTREQUEST *cr); +OSSL_CRMF_CERTREQUEST +*OSSL_CRMF_MSG_get0_regInfo_certReq(const OSSL_CRMF_MSG *msg); + +int OSSL_CRMF_MSG_set0_validity(OSSL_CRMF_MSG *crm, + ASN1_TIME *notBefore, ASN1_TIME *notAfter); +int OSSL_CRMF_MSG_set_certReqId(OSSL_CRMF_MSG *crm, int rid); +int OSSL_CRMF_MSG_get_certReqId(const OSSL_CRMF_MSG *crm); +int OSSL_CRMF_MSG_set0_extensions(OSSL_CRMF_MSG *crm, X509_EXTENSIONS *exts); + +int OSSL_CRMF_MSG_push0_extension(OSSL_CRMF_MSG *crm, X509_EXTENSION *ext); +#define OSSL_CRMF_POPO_NONE -1 +#define OSSL_CRMF_POPO_RAVERIFIED 0 +#define OSSL_CRMF_POPO_SIGNATURE 1 +#define OSSL_CRMF_POPO_KEYENC 2 +#define OSSL_CRMF_POPO_KEYAGREE 3 +int OSSL_CRMF_MSG_create_popo(int meth, OSSL_CRMF_MSG *crm, + EVP_PKEY *pkey, const EVP_MD *digest, + OSSL_LIB_CTX *libctx, const char *propq); +int OSSL_CRMF_MSGS_verify_popo(const OSSL_CRMF_MSGS *reqs, + int rid, int acceptRAVerified, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_CRMF_CERTTEMPLATE *OSSL_CRMF_MSG_get0_tmpl(const OSSL_CRMF_MSG *crm); +X509_PUBKEY +*OSSL_CRMF_CERTTEMPLATE_get0_publicKey(const OSSL_CRMF_CERTTEMPLATE *tmpl); +const X509_NAME *OSSL_CRMF_CERTTEMPLATE_get0_subject(const OSSL_CRMF_CERTTEMPLATE *tmpl); +const X509_NAME *OSSL_CRMF_CERTTEMPLATE_get0_issuer(const OSSL_CRMF_CERTTEMPLATE *tmpl); +const ASN1_INTEGER *OSSL_CRMF_CERTTEMPLATE_get0_serialNumber(const OSSL_CRMF_CERTTEMPLATE *tmpl); +X509_EXTENSIONS +*OSSL_CRMF_CERTTEMPLATE_get0_extensions(const OSSL_CRMF_CERTTEMPLATE *tmpl); +const X509_NAME *OSSL_CRMF_CERTID_get0_issuer(const OSSL_CRMF_CERTID *cid); +const ASN1_INTEGER *OSSL_CRMF_CERTID_get0_serialNumber(const OSSL_CRMF_CERTID *cid); +int OSSL_CRMF_CERTTEMPLATE_fill(OSSL_CRMF_CERTTEMPLATE *tmpl, + EVP_PKEY *pubkey, + const X509_NAME *subject, + const X509_NAME *issuer, + const ASN1_INTEGER *serial); +X509 *OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert(const OSSL_CRMF_ENCRYPTEDVALUE *ecert, + OSSL_LIB_CTX *libctx, const char *propq, + EVP_PKEY *pkey); +X509 *OSSL_CRMF_ENCRYPTEDKEY_get1_encCert(const OSSL_CRMF_ENCRYPTEDKEY *ecert, + OSSL_LIB_CTX *libctx, const char *propq, + EVP_PKEY *pkey, unsigned int flags); +unsigned char *OSSL_CRMF_ENCRYPTEDVALUE_decrypt(const OSSL_CRMF_ENCRYPTEDVALUE *enc, + OSSL_LIB_CTX *libctx, const char *propq, + EVP_PKEY *pkey, int *outlen); +EVP_PKEY *OSSL_CRMF_ENCRYPTEDKEY_get1_pkey(const OSSL_CRMF_ENCRYPTEDKEY *encryptedKey, + X509_STORE *ts, STACK_OF(X509) *extra, EVP_PKEY *pkey, + X509 *cert, ASN1_OCTET_STRING *secret, + OSSL_LIB_CTX *libctx, const char *propq); +int OSSL_CRMF_MSG_centralkeygen_requested(const OSSL_CRMF_MSG *crm, const X509_REQ *p10cr); +#ifndef OPENSSL_NO_CMS +OSSL_CRMF_ENCRYPTEDKEY *OSSL_CRMF_ENCRYPTEDKEY_init_envdata(CMS_EnvelopedData *envdata); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !defined(OPENSSL_NO_CRMF) */ +#endif /* !defined(OPENSSL_CRMF_H) */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/crypto.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/crypto.h new file mode 100644 index 000000000000..cce93833c2cb --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/crypto.h @@ -0,0 +1,588 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/crypto.h.in + * + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_CRYPTO_H +#define OPENSSL_CRYPTO_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_CRYPTO_H +#endif + +#include +#include + +#include + +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#include +#include +#include +#include +#include +#include + +#ifdef CHARSET_EBCDIC +#include +#endif + +/* + * Resolve problems on some operating systems with symbol names that clash + * one way or another + */ +#include + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define SSLeay OpenSSL_version_num +#define SSLeay_version OpenSSL_version +#define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER +#define SSLEAY_VERSION OPENSSL_VERSION +#define SSLEAY_CFLAGS OPENSSL_CFLAGS +#define SSLEAY_BUILT_ON OPENSSL_BUILT_ON +#define SSLEAY_PLATFORM OPENSSL_PLATFORM +#define SSLEAY_DIR OPENSSL_DIR + +/* + * Old type for allocating dynamic locks. No longer used. Use the new thread + * API instead. + */ +typedef struct { + int dummy; +} CRYPTO_dynlock; + +#endif /* OPENSSL_NO_DEPRECATED_1_1_0 */ + +typedef void CRYPTO_RWLOCK; + +CRYPTO_RWLOCK *CRYPTO_THREAD_lock_new(void); +__owur int CRYPTO_THREAD_read_lock(CRYPTO_RWLOCK *lock); +__owur int CRYPTO_THREAD_write_lock(CRYPTO_RWLOCK *lock); +int CRYPTO_THREAD_unlock(CRYPTO_RWLOCK *lock); +void CRYPTO_THREAD_lock_free(CRYPTO_RWLOCK *lock); + +int CRYPTO_atomic_add(int *val, int amount, int *ret, CRYPTO_RWLOCK *lock); +int CRYPTO_atomic_add64(uint64_t *val, uint64_t op, uint64_t *ret, + CRYPTO_RWLOCK *lock); +int CRYPTO_atomic_and(uint64_t *val, uint64_t op, uint64_t *ret, + CRYPTO_RWLOCK *lock); +int CRYPTO_atomic_or(uint64_t *val, uint64_t op, uint64_t *ret, + CRYPTO_RWLOCK *lock); +int CRYPTO_atomic_load(uint64_t *val, uint64_t *ret, CRYPTO_RWLOCK *lock); +int CRYPTO_atomic_load_int(int *val, int *ret, CRYPTO_RWLOCK *lock); +int CRYPTO_atomic_store(uint64_t *dst, uint64_t val, CRYPTO_RWLOCK *lock); + +/* No longer needed, so this is a no-op */ +#define OPENSSL_malloc_init() \ + while (0) \ + continue + +#define OPENSSL_malloc(num) \ + CRYPTO_malloc(num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_zalloc(num) \ + CRYPTO_zalloc(num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_aligned_alloc(num, alignment, freeptr) \ + CRYPTO_aligned_alloc(num, alignment, freeptr, \ + OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_realloc(addr, num) \ + CRYPTO_realloc(addr, num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_clear_realloc(addr, old_num, num) \ + CRYPTO_clear_realloc(addr, old_num, num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_clear_free(addr, num) \ + CRYPTO_clear_free(addr, num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_free(addr) \ + CRYPTO_free(addr, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_memdup(str, s) \ + CRYPTO_memdup((str), s, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_strdup(str) \ + CRYPTO_strdup(str, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_strndup(str, n) \ + CRYPTO_strndup(str, n, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_secure_malloc(num) \ + CRYPTO_secure_malloc(num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_secure_zalloc(num) \ + CRYPTO_secure_zalloc(num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_secure_free(addr) \ + CRYPTO_secure_free(addr, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_secure_clear_free(addr, num) \ + CRYPTO_secure_clear_free(addr, num, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_secure_actual_size(ptr) \ + CRYPTO_secure_actual_size(ptr) + +size_t OPENSSL_strlcpy(char *dst, const char *src, size_t siz); +size_t OPENSSL_strlcat(char *dst, const char *src, size_t siz); +size_t OPENSSL_strnlen(const char *str, size_t maxlen); +int OPENSSL_strtoul(const char *str, char **endptr, int base, unsigned long *num); +int OPENSSL_buf2hexstr_ex(char *str, size_t str_n, size_t *strlength, + const unsigned char *buf, size_t buflen, + const char sep); +char *OPENSSL_buf2hexstr(const unsigned char *buf, long buflen); +int OPENSSL_hexstr2buf_ex(unsigned char *buf, size_t buf_n, size_t *buflen, + const char *str, const char sep); +unsigned char *OPENSSL_hexstr2buf(const char *str, long *buflen); +int OPENSSL_hexchar2int(unsigned char c); +int OPENSSL_strcasecmp(const char *s1, const char *s2); +int OPENSSL_strncasecmp(const char *s1, const char *s2, size_t n); + +#define OPENSSL_MALLOC_MAX_NELEMS(type) (((1U << (sizeof(int) * 8 - 1)) - 1) / sizeof(type)) + +/* + * These functions return the values of OPENSSL_VERSION_MAJOR, + * OPENSSL_VERSION_MINOR, OPENSSL_VERSION_PATCH, OPENSSL_VERSION_PRE_RELEASE + * and OPENSSL_VERSION_BUILD_METADATA, respectively. + */ +unsigned int OPENSSL_version_major(void); +unsigned int OPENSSL_version_minor(void); +unsigned int OPENSSL_version_patch(void); +const char *OPENSSL_version_pre_release(void); +const char *OPENSSL_version_build_metadata(void); + +unsigned long OpenSSL_version_num(void); +const char *OpenSSL_version(int type); +#define OPENSSL_VERSION 0 +#define OPENSSL_CFLAGS 1 +#define OPENSSL_BUILT_ON 2 +#define OPENSSL_PLATFORM 3 +#define OPENSSL_DIR 4 +#define OPENSSL_ENGINES_DIR 5 +#define OPENSSL_VERSION_STRING 6 +#define OPENSSL_FULL_VERSION_STRING 7 +#define OPENSSL_MODULES_DIR 8 +#define OPENSSL_CPU_INFO 9 +#define OPENSSL_WINCTX 10 + +const char *OPENSSL_info(int type); +/* + * The series starts at 1001 to avoid confusion with the OpenSSL_version + * types. + */ +#define OPENSSL_INFO_CONFIG_DIR 1001 +#define OPENSSL_INFO_ENGINES_DIR 1002 +#define OPENSSL_INFO_MODULES_DIR 1003 +#define OPENSSL_INFO_DSO_EXTENSION 1004 +#define OPENSSL_INFO_DIR_FILENAME_SEPARATOR 1005 +#define OPENSSL_INFO_LIST_SEPARATOR 1006 +#define OPENSSL_INFO_SEED_SOURCE 1007 +#define OPENSSL_INFO_CPU_SETTINGS 1008 +#define OPENSSL_INFO_WINDOWS_CONTEXT 1009 + +int OPENSSL_issetugid(void); + +struct crypto_ex_data_st { + OSSL_LIB_CTX *ctx; + STACK_OF(void) *sk; +}; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(void, void, void) +#define sk_void_num(sk) OPENSSL_sk_num(ossl_check_const_void_sk_type(sk)) +#define sk_void_value(sk, idx) ((void *)OPENSSL_sk_value(ossl_check_const_void_sk_type(sk), (idx))) +#define sk_void_new(cmp) ((STACK_OF(void) *)OPENSSL_sk_new(ossl_check_void_compfunc_type(cmp))) +#define sk_void_new_null() ((STACK_OF(void) *)OPENSSL_sk_new_null()) +#define sk_void_new_reserve(cmp, n) ((STACK_OF(void) *)OPENSSL_sk_new_reserve(ossl_check_void_compfunc_type(cmp), (n))) +#define sk_void_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_void_sk_type(sk), (n)) +#define sk_void_free(sk) OPENSSL_sk_free(ossl_check_void_sk_type(sk)) +#define sk_void_zero(sk) OPENSSL_sk_zero(ossl_check_void_sk_type(sk)) +#define sk_void_delete(sk, i) ((void *)OPENSSL_sk_delete(ossl_check_void_sk_type(sk), (i))) +#define sk_void_delete_ptr(sk, ptr) ((void *)OPENSSL_sk_delete_ptr(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr))) +#define sk_void_push(sk, ptr) OPENSSL_sk_push(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr)) +#define sk_void_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr)) +#define sk_void_pop(sk) ((void *)OPENSSL_sk_pop(ossl_check_void_sk_type(sk))) +#define sk_void_shift(sk) ((void *)OPENSSL_sk_shift(ossl_check_void_sk_type(sk))) +#define sk_void_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_void_sk_type(sk),ossl_check_void_freefunc_type(freefunc)) +#define sk_void_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr), (idx)) +#define sk_void_set(sk, idx, ptr) ((void *)OPENSSL_sk_set(ossl_check_void_sk_type(sk), (idx), ossl_check_void_type(ptr))) +#define sk_void_find(sk, ptr) OPENSSL_sk_find(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr)) +#define sk_void_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr)) +#define sk_void_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_void_sk_type(sk), ossl_check_void_type(ptr), pnum) +#define sk_void_sort(sk) OPENSSL_sk_sort(ossl_check_void_sk_type(sk)) +#define sk_void_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_void_sk_type(sk)) +#define sk_void_dup(sk) ((STACK_OF(void) *)OPENSSL_sk_dup(ossl_check_const_void_sk_type(sk))) +#define sk_void_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(void) *)OPENSSL_sk_deep_copy(ossl_check_const_void_sk_type(sk), ossl_check_void_copyfunc_type(copyfunc), ossl_check_void_freefunc_type(freefunc))) +#define sk_void_set_cmp_func(sk, cmp) ((sk_void_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_void_sk_type(sk), ossl_check_void_compfunc_type(cmp))) + +/* clang-format on */ + +/* + * Per class, we have a STACK of function pointers. + */ +#define CRYPTO_EX_INDEX_SSL 0 +#define CRYPTO_EX_INDEX_SSL_CTX 1 +#define CRYPTO_EX_INDEX_SSL_SESSION 2 +#define CRYPTO_EX_INDEX_X509 3 +#define CRYPTO_EX_INDEX_X509_STORE 4 +#define CRYPTO_EX_INDEX_X509_STORE_CTX 5 +#define CRYPTO_EX_INDEX_DH 6 +#define CRYPTO_EX_INDEX_DSA 7 +#define CRYPTO_EX_INDEX_EC_KEY 8 +#define CRYPTO_EX_INDEX_RSA 9 +#define CRYPTO_EX_INDEX_ENGINE 10 +#define CRYPTO_EX_INDEX_UI 11 +#define CRYPTO_EX_INDEX_BIO 12 +#define CRYPTO_EX_INDEX_APP 13 +#define CRYPTO_EX_INDEX_UI_METHOD 14 +#define CRYPTO_EX_INDEX_RAND_DRBG 15 +#define CRYPTO_EX_INDEX_DRBG CRYPTO_EX_INDEX_RAND_DRBG +#define CRYPTO_EX_INDEX_OSSL_LIB_CTX 16 +#define CRYPTO_EX_INDEX_EVP_PKEY 17 +#define CRYPTO_EX_INDEX__COUNT 18 + +typedef void CRYPTO_EX_new(void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef void CRYPTO_EX_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +typedef int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, const CRYPTO_EX_DATA *from, + void **from_d, int idx, long argl, void *argp); +__owur int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp, + CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +/* No longer use an index. */ +int CRYPTO_free_ex_index(int class_index, int idx); + +/* + * Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a + * given class (invokes whatever per-class callbacks are applicable) + */ +int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); +int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to, + const CRYPTO_EX_DATA *from); + +void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); + +/* Allocate a single item in the CRYPTO_EX_DATA variable */ +int CRYPTO_alloc_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad, + int idx); + +/* + * Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular + * index (relative to the class type involved) + */ +int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val); +void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int idx); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +/* + * This function cleans up all "ex_data" state. It mustn't be called under + * potential race-conditions. + */ +#define CRYPTO_cleanup_all_ex_data() \ + while (0) \ + continue + +/* + * The old locking functions have been removed completely without compatibility + * macros. This is because the old functions either could not properly report + * errors, or the returned error values were not clearly documented. + * Replacing the locking functions with no-ops would cause race condition + * issues in the affected applications. It is far better for them to fail at + * compile time. + * On the other hand, the locking callbacks are no longer used. Consequently, + * the callback management functions can be safely replaced with no-op macros. + */ +#define CRYPTO_num_locks() (1) +#define CRYPTO_set_locking_callback(func) +#define CRYPTO_get_locking_callback() (NULL) +#define CRYPTO_set_add_lock_callback(func) +#define CRYPTO_get_add_lock_callback() (NULL) + +/* + * These defines where used in combination with the old locking callbacks, + * they are not called anymore, but old code that's not called might still + * use them. + */ +#define CRYPTO_LOCK 1 +#define CRYPTO_UNLOCK 2 +#define CRYPTO_READ 4 +#define CRYPTO_WRITE 8 + +/* This structure is no longer used */ +typedef struct crypto_threadid_st { + int dummy; +} CRYPTO_THREADID; +/* Only use CRYPTO_THREADID_set_[numeric|pointer]() within callbacks */ +#define CRYPTO_THREADID_set_numeric(id, val) +#define CRYPTO_THREADID_set_pointer(id, ptr) +#define CRYPTO_THREADID_set_callback(threadid_func) (0) +#define CRYPTO_THREADID_get_callback() (NULL) +#define CRYPTO_THREADID_current(id) +#define CRYPTO_THREADID_cmp(a, b) (-1) +#define CRYPTO_THREADID_cpy(dest, src) +#define CRYPTO_THREADID_hash(id) (0UL) + +#ifndef OPENSSL_NO_DEPRECATED_1_0_0 +#define CRYPTO_set_id_callback(func) +#define CRYPTO_get_id_callback() (NULL) +#define CRYPTO_thread_id() (0UL) +#endif /* OPENSSL_NO_DEPRECATED_1_0_0 */ + +#define CRYPTO_set_dynlock_create_callback(dyn_create_function) +#define CRYPTO_set_dynlock_lock_callback(dyn_lock_function) +#define CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function) +#define CRYPTO_get_dynlock_create_callback() (NULL) +#define CRYPTO_get_dynlock_lock_callback() (NULL) +#define CRYPTO_get_dynlock_destroy_callback() (NULL) +#endif /* OPENSSL_NO_DEPRECATED_1_1_0 */ + +typedef void *(*CRYPTO_malloc_fn)(size_t num, const char *file, int line); +typedef void *(*CRYPTO_realloc_fn)(void *addr, size_t num, const char *file, + int line); +typedef void (*CRYPTO_free_fn)(void *addr, const char *file, int line); +int CRYPTO_set_mem_functions(CRYPTO_malloc_fn malloc_fn, + CRYPTO_realloc_fn realloc_fn, + CRYPTO_free_fn free_fn); +void CRYPTO_get_mem_functions(CRYPTO_malloc_fn *malloc_fn, + CRYPTO_realloc_fn *realloc_fn, + CRYPTO_free_fn *free_fn); + +OSSL_CRYPTO_ALLOC void *CRYPTO_malloc(size_t num, const char *file, int line); +OSSL_CRYPTO_ALLOC void *CRYPTO_zalloc(size_t num, const char *file, int line); +OSSL_CRYPTO_ALLOC void *CRYPTO_aligned_alloc(size_t num, size_t align, + void **freeptr, const char *file, + int line); +void *CRYPTO_memdup(const void *str, size_t siz, const char *file, int line); +char *CRYPTO_strdup(const char *str, const char *file, int line); +char *CRYPTO_strndup(const char *str, size_t s, const char *file, int line); +void CRYPTO_free(void *ptr, const char *file, int line); +void CRYPTO_clear_free(void *ptr, size_t num, const char *file, int line); +void *CRYPTO_realloc(void *addr, size_t num, const char *file, int line); +void *CRYPTO_clear_realloc(void *addr, size_t old_num, size_t num, + const char *file, int line); + +int CRYPTO_secure_malloc_init(size_t sz, size_t minsize); +int CRYPTO_secure_malloc_done(void); +OSSL_CRYPTO_ALLOC void *CRYPTO_secure_malloc(size_t num, const char *file, int line); +OSSL_CRYPTO_ALLOC void *CRYPTO_secure_zalloc(size_t num, const char *file, int line); +void CRYPTO_secure_free(void *ptr, const char *file, int line); +void CRYPTO_secure_clear_free(void *ptr, size_t num, + const char *file, int line); +int CRYPTO_secure_allocated(const void *ptr); +int CRYPTO_secure_malloc_initialized(void); +size_t CRYPTO_secure_actual_size(void *ptr); +size_t CRYPTO_secure_used(void); + +void OPENSSL_cleanse(void *ptr, size_t len); + +#ifndef OPENSSL_NO_CRYPTO_MDEBUG +/* + * The following can be used to detect memory leaks in the library. If + * used, it turns on malloc checking + */ +#define CRYPTO_MEM_CHECK_OFF 0x0 /* Control only */ +#define CRYPTO_MEM_CHECK_ON 0x1 /* Control and mode bit */ +#define CRYPTO_MEM_CHECK_ENABLE 0x2 /* Control and mode bit */ +#define CRYPTO_MEM_CHECK_DISABLE 0x3 /* Control only */ + +/* max allowed length for value of OPENSSL_MALLOC_FAILURES env var. */ +#define CRYPTO_MEM_CHECK_MAX_FS 256 + +void CRYPTO_get_alloc_counts(int *mcount, int *rcount, int *fcount); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define OPENSSL_mem_debug_push(info) \ + CRYPTO_mem_debug_push(info, OPENSSL_FILE, OPENSSL_LINE) +#define OPENSSL_mem_debug_pop() \ + CRYPTO_mem_debug_pop() +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int CRYPTO_set_mem_debug(int flag); +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_ctrl(int mode); +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_debug_push(const char *info, + const char *file, int line); +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_debug_pop(void); +OSSL_DEPRECATEDIN_3_0 void CRYPTO_mem_debug_malloc(void *addr, size_t num, + int flag, + const char *file, int line); +OSSL_DEPRECATEDIN_3_0 void CRYPTO_mem_debug_realloc(void *addr1, void *addr2, + size_t num, int flag, + const char *file, int line); +OSSL_DEPRECATEDIN_3_0 void CRYPTO_mem_debug_free(void *addr, int flag, + const char *file, int line); +OSSL_DEPRECATEDIN_3_0 +int CRYPTO_mem_leaks_cb(int (*cb)(const char *str, size_t len, void *u), + void *u); +#endif +#ifndef OPENSSL_NO_STDIO +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_leaks_fp(FILE *); +#endif +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int CRYPTO_mem_leaks(BIO *bio); +#endif +#endif /* OPENSSL_NO_CRYPTO_MDEBUG */ + +/* die if we have to */ +ossl_noreturn void OPENSSL_die(const char *assertion, const char *file, int line); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define OpenSSLDie(f, l, a) OPENSSL_die((a), (f), (l)) +#endif +#define OPENSSL_assert(e) \ + (void)((e) ? 0 : (OPENSSL_die("assertion failed: " #e, OPENSSL_FILE, OPENSSL_LINE), 1)) + +int OPENSSL_isservice(void); + +void OPENSSL_init(void); +#ifdef OPENSSL_SYS_UNIX +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 void OPENSSL_fork_prepare(void); +OSSL_DEPRECATEDIN_3_0 void OPENSSL_fork_parent(void); +OSSL_DEPRECATEDIN_3_0 void OPENSSL_fork_child(void); +#endif +#endif + +struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result); +int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec); +int OPENSSL_gmtime_diff(int *pday, int *psec, + const struct tm *from, const struct tm *to); + +/* + * CRYPTO_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. + * It takes an amount of time dependent on |len|, but independent of the + * contents of |a| and |b|. Unlike memcmp, it cannot be used to put elements + * into a defined order as the return value when a != b is undefined, other + * than to be non-zero. + */ +int CRYPTO_memcmp(const void *in_a, const void *in_b, size_t len); + +/* Standard initialisation options */ +#define OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS 0x00000001L +#define OPENSSL_INIT_LOAD_CRYPTO_STRINGS 0x00000002L +#define OPENSSL_INIT_ADD_ALL_CIPHERS 0x00000004L +#define OPENSSL_INIT_ADD_ALL_DIGESTS 0x00000008L +#define OPENSSL_INIT_NO_ADD_ALL_CIPHERS 0x00000010L +#define OPENSSL_INIT_NO_ADD_ALL_DIGESTS 0x00000020L +#define OPENSSL_INIT_LOAD_CONFIG 0x00000040L +#define OPENSSL_INIT_NO_LOAD_CONFIG 0x00000080L +#define OPENSSL_INIT_ASYNC 0x00000100L +#define OPENSSL_INIT_ENGINE_RDRAND 0x00000200L +#define OPENSSL_INIT_ENGINE_DYNAMIC 0x00000400L +#define OPENSSL_INIT_ENGINE_OPENSSL 0x00000800L +#define OPENSSL_INIT_ENGINE_CRYPTODEV 0x00001000L +#define OPENSSL_INIT_ENGINE_CAPI 0x00002000L +#define OPENSSL_INIT_ENGINE_PADLOCK 0x00004000L +#define OPENSSL_INIT_ENGINE_AFALG 0x00008000L +/* FREE: 0x00010000L */ +#define OPENSSL_INIT_ATFORK 0x00020000L +/* OPENSSL_INIT_BASE_ONLY 0x00040000L */ +#define OPENSSL_INIT_NO_ATEXIT 0x00080000L +/* OPENSSL_INIT flag range 0x03f00000 reserved for OPENSSL_init_ssl() */ +/* FREE: 0x04000000L */ +/* FREE: 0x08000000L */ +/* FREE: 0x10000000L */ +/* FREE: 0x20000000L */ +/* FREE: 0x40000000L */ +/* FREE: 0x80000000L */ +/* Max OPENSSL_INIT flag value is 0x80000000 */ + +/* openssl and dasync not counted as builtin */ +#define OPENSSL_INIT_ENGINE_ALL_BUILTIN \ + (OPENSSL_INIT_ENGINE_RDRAND | OPENSSL_INIT_ENGINE_DYNAMIC \ + | OPENSSL_INIT_ENGINE_CRYPTODEV | OPENSSL_INIT_ENGINE_CAPI | OPENSSL_INIT_ENGINE_PADLOCK) + +/* Library initialisation functions */ +void OPENSSL_cleanup(void); +int OPENSSL_init_crypto(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings); +int OPENSSL_atexit(void (*handler)(void)); +void OPENSSL_thread_stop(void); +void OPENSSL_thread_stop_ex(OSSL_LIB_CTX *ctx); + +/* Low-level control of initialization */ +OPENSSL_INIT_SETTINGS *OPENSSL_INIT_new(void); +#ifndef OPENSSL_NO_STDIO +int OPENSSL_INIT_set_config_filename(OPENSSL_INIT_SETTINGS *settings, + const char *config_filename); +void OPENSSL_INIT_set_config_file_flags(OPENSSL_INIT_SETTINGS *settings, + unsigned long flags); +int OPENSSL_INIT_set_config_appname(OPENSSL_INIT_SETTINGS *settings, + const char *config_appname); +#endif +void OPENSSL_INIT_free(OPENSSL_INIT_SETTINGS *settings); + +#if defined(OPENSSL_THREADS) && !defined(CRYPTO_TDEBUG) +#if defined(_WIN32) +#if defined(BASETYPES) || defined(_WINDEF_H) +/* application has to include in order to use this */ +typedef DWORD CRYPTO_THREAD_LOCAL; +typedef DWORD CRYPTO_THREAD_ID; + +typedef LONG CRYPTO_ONCE; +#define CRYPTO_ONCE_STATIC_INIT 0 +#endif +#else +#if defined(__TANDEM) && defined(_SPT_MODEL_) +#define SPT_THREAD_SIGNAL 1 +#define SPT_THREAD_AWARE 1 +#include +#else +#include +#endif +typedef pthread_once_t CRYPTO_ONCE; +typedef pthread_key_t CRYPTO_THREAD_LOCAL; +typedef pthread_t CRYPTO_THREAD_ID; + +#define CRYPTO_ONCE_STATIC_INIT PTHREAD_ONCE_INIT +#endif +#endif + +#if !defined(CRYPTO_ONCE_STATIC_INIT) +typedef unsigned int CRYPTO_ONCE; +typedef unsigned int CRYPTO_THREAD_LOCAL; +typedef unsigned int CRYPTO_THREAD_ID; +#define CRYPTO_ONCE_STATIC_INIT 0 +#endif + +int CRYPTO_THREAD_run_once(CRYPTO_ONCE *once, void (*init)(void)); + +int CRYPTO_THREAD_init_local(CRYPTO_THREAD_LOCAL *key, void (*cleanup)(void *)); +void *CRYPTO_THREAD_get_local(CRYPTO_THREAD_LOCAL *key); +int CRYPTO_THREAD_set_local(CRYPTO_THREAD_LOCAL *key, void *val); +int CRYPTO_THREAD_cleanup_local(CRYPTO_THREAD_LOCAL *key); + +CRYPTO_THREAD_ID CRYPTO_THREAD_get_current_id(void); +int CRYPTO_THREAD_compare_id(CRYPTO_THREAD_ID a, CRYPTO_THREAD_ID b); + +OSSL_LIB_CTX *OSSL_LIB_CTX_new(void); +OSSL_LIB_CTX *OSSL_LIB_CTX_new_from_dispatch(const OSSL_CORE_HANDLE *handle, + const OSSL_DISPATCH *in); +OSSL_LIB_CTX *OSSL_LIB_CTX_new_child(const OSSL_CORE_HANDLE *handle, + const OSSL_DISPATCH *in); +int OSSL_LIB_CTX_load_config(OSSL_LIB_CTX *ctx, const char *config_file); +void OSSL_LIB_CTX_free(OSSL_LIB_CTX *); +OSSL_LIB_CTX *OSSL_LIB_CTX_get0_global_default(void); +OSSL_LIB_CTX *OSSL_LIB_CTX_set0_default(OSSL_LIB_CTX *libctx); +int OSSL_LIB_CTX_get_conf_diagnostics(OSSL_LIB_CTX *ctx); +void OSSL_LIB_CTX_set_conf_diagnostics(OSSL_LIB_CTX *ctx, int value); + +void OSSL_sleep(uint64_t millis); + +void *OSSL_LIB_CTX_get_data(OSSL_LIB_CTX *ctx, int index); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ct.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ct.h new file mode 100644 index 000000000000..0b60803f98ca --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ct.h @@ -0,0 +1,574 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/ct.h.in + * + * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_CT_H +#define OPENSSL_CT_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_CT_H +#endif + +#include + +#ifndef OPENSSL_NO_CT +#include +#include +#include +#include +#ifdef __cplusplus +extern "C" { +#endif + +/* Minimum RSA key size, from RFC6962 */ +#define SCT_MIN_RSA_BITS 2048 + +/* All hashes are SHA256 in v1 of Certificate Transparency */ +#define CT_V1_HASHLEN SHA256_DIGEST_LENGTH + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SCT, SCT, SCT) +#define sk_SCT_num(sk) OPENSSL_sk_num(ossl_check_const_SCT_sk_type(sk)) +#define sk_SCT_value(sk, idx) ((SCT *)OPENSSL_sk_value(ossl_check_const_SCT_sk_type(sk), (idx))) +#define sk_SCT_new(cmp) ((STACK_OF(SCT) *)OPENSSL_sk_new(ossl_check_SCT_compfunc_type(cmp))) +#define sk_SCT_new_null() ((STACK_OF(SCT) *)OPENSSL_sk_new_null()) +#define sk_SCT_new_reserve(cmp, n) ((STACK_OF(SCT) *)OPENSSL_sk_new_reserve(ossl_check_SCT_compfunc_type(cmp), (n))) +#define sk_SCT_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SCT_sk_type(sk), (n)) +#define sk_SCT_free(sk) OPENSSL_sk_free(ossl_check_SCT_sk_type(sk)) +#define sk_SCT_zero(sk) OPENSSL_sk_zero(ossl_check_SCT_sk_type(sk)) +#define sk_SCT_delete(sk, i) ((SCT *)OPENSSL_sk_delete(ossl_check_SCT_sk_type(sk), (i))) +#define sk_SCT_delete_ptr(sk, ptr) ((SCT *)OPENSSL_sk_delete_ptr(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr))) +#define sk_SCT_push(sk, ptr) OPENSSL_sk_push(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr)) +#define sk_SCT_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr)) +#define sk_SCT_pop(sk) ((SCT *)OPENSSL_sk_pop(ossl_check_SCT_sk_type(sk))) +#define sk_SCT_shift(sk) ((SCT *)OPENSSL_sk_shift(ossl_check_SCT_sk_type(sk))) +#define sk_SCT_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SCT_sk_type(sk),ossl_check_SCT_freefunc_type(freefunc)) +#define sk_SCT_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr), (idx)) +#define sk_SCT_set(sk, idx, ptr) ((SCT *)OPENSSL_sk_set(ossl_check_SCT_sk_type(sk), (idx), ossl_check_SCT_type(ptr))) +#define sk_SCT_find(sk, ptr) OPENSSL_sk_find(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr)) +#define sk_SCT_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr)) +#define sk_SCT_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SCT_sk_type(sk), ossl_check_SCT_type(ptr), pnum) +#define sk_SCT_sort(sk) OPENSSL_sk_sort(ossl_check_SCT_sk_type(sk)) +#define sk_SCT_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SCT_sk_type(sk)) +#define sk_SCT_dup(sk) ((STACK_OF(SCT) *)OPENSSL_sk_dup(ossl_check_const_SCT_sk_type(sk))) +#define sk_SCT_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SCT) *)OPENSSL_sk_deep_copy(ossl_check_const_SCT_sk_type(sk), ossl_check_SCT_copyfunc_type(copyfunc), ossl_check_SCT_freefunc_type(freefunc))) +#define sk_SCT_set_cmp_func(sk, cmp) ((sk_SCT_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SCT_sk_type(sk), ossl_check_SCT_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(CTLOG, CTLOG, CTLOG) +#define sk_CTLOG_num(sk) OPENSSL_sk_num(ossl_check_const_CTLOG_sk_type(sk)) +#define sk_CTLOG_value(sk, idx) ((CTLOG *)OPENSSL_sk_value(ossl_check_const_CTLOG_sk_type(sk), (idx))) +#define sk_CTLOG_new(cmp) ((STACK_OF(CTLOG) *)OPENSSL_sk_new(ossl_check_CTLOG_compfunc_type(cmp))) +#define sk_CTLOG_new_null() ((STACK_OF(CTLOG) *)OPENSSL_sk_new_null()) +#define sk_CTLOG_new_reserve(cmp, n) ((STACK_OF(CTLOG) *)OPENSSL_sk_new_reserve(ossl_check_CTLOG_compfunc_type(cmp), (n))) +#define sk_CTLOG_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_CTLOG_sk_type(sk), (n)) +#define sk_CTLOG_free(sk) OPENSSL_sk_free(ossl_check_CTLOG_sk_type(sk)) +#define sk_CTLOG_zero(sk) OPENSSL_sk_zero(ossl_check_CTLOG_sk_type(sk)) +#define sk_CTLOG_delete(sk, i) ((CTLOG *)OPENSSL_sk_delete(ossl_check_CTLOG_sk_type(sk), (i))) +#define sk_CTLOG_delete_ptr(sk, ptr) ((CTLOG *)OPENSSL_sk_delete_ptr(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr))) +#define sk_CTLOG_push(sk, ptr) OPENSSL_sk_push(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr)) +#define sk_CTLOG_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr)) +#define sk_CTLOG_pop(sk) ((CTLOG *)OPENSSL_sk_pop(ossl_check_CTLOG_sk_type(sk))) +#define sk_CTLOG_shift(sk) ((CTLOG *)OPENSSL_sk_shift(ossl_check_CTLOG_sk_type(sk))) +#define sk_CTLOG_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_CTLOG_sk_type(sk),ossl_check_CTLOG_freefunc_type(freefunc)) +#define sk_CTLOG_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr), (idx)) +#define sk_CTLOG_set(sk, idx, ptr) ((CTLOG *)OPENSSL_sk_set(ossl_check_CTLOG_sk_type(sk), (idx), ossl_check_CTLOG_type(ptr))) +#define sk_CTLOG_find(sk, ptr) OPENSSL_sk_find(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr)) +#define sk_CTLOG_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr)) +#define sk_CTLOG_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_type(ptr), pnum) +#define sk_CTLOG_sort(sk) OPENSSL_sk_sort(ossl_check_CTLOG_sk_type(sk)) +#define sk_CTLOG_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_CTLOG_sk_type(sk)) +#define sk_CTLOG_dup(sk) ((STACK_OF(CTLOG) *)OPENSSL_sk_dup(ossl_check_const_CTLOG_sk_type(sk))) +#define sk_CTLOG_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(CTLOG) *)OPENSSL_sk_deep_copy(ossl_check_const_CTLOG_sk_type(sk), ossl_check_CTLOG_copyfunc_type(copyfunc), ossl_check_CTLOG_freefunc_type(freefunc))) +#define sk_CTLOG_set_cmp_func(sk, cmp) ((sk_CTLOG_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_CTLOG_sk_type(sk), ossl_check_CTLOG_compfunc_type(cmp))) + +/* clang-format on */ + +typedef enum { + CT_LOG_ENTRY_TYPE_NOT_SET = -1, + CT_LOG_ENTRY_TYPE_X509 = 0, + CT_LOG_ENTRY_TYPE_PRECERT = 1 +} ct_log_entry_type_t; + +typedef enum { + SCT_VERSION_NOT_SET = -1, + SCT_VERSION_V1 = 0 +} sct_version_t; + +typedef enum { + SCT_SOURCE_UNKNOWN, + SCT_SOURCE_TLS_EXTENSION, + SCT_SOURCE_X509V3_EXTENSION, + SCT_SOURCE_OCSP_STAPLED_RESPONSE +} sct_source_t; + +typedef enum { + SCT_VALIDATION_STATUS_NOT_SET, + SCT_VALIDATION_STATUS_UNKNOWN_LOG, + SCT_VALIDATION_STATUS_VALID, + SCT_VALIDATION_STATUS_INVALID, + SCT_VALIDATION_STATUS_UNVERIFIED, + SCT_VALIDATION_STATUS_UNKNOWN_VERSION +} sct_validation_status_t; + +/****************************************** + * CT policy evaluation context functions * + ******************************************/ + +/* + * Creates a new, empty policy evaluation context associated with the given + * library context and property query string. + * The caller is responsible for calling CT_POLICY_EVAL_CTX_free when finished + * with the CT_POLICY_EVAL_CTX. + */ +CT_POLICY_EVAL_CTX *CT_POLICY_EVAL_CTX_new_ex(OSSL_LIB_CTX *libctx, + const char *propq); + +/* + * The same as CT_POLICY_EVAL_CTX_new_ex() but the default library + * context and property query string is used. + */ +CT_POLICY_EVAL_CTX *CT_POLICY_EVAL_CTX_new(void); + +/* Deletes a policy evaluation context and anything it owns. */ +void CT_POLICY_EVAL_CTX_free(CT_POLICY_EVAL_CTX *ctx); + +/* Gets the peer certificate that the SCTs are for */ +X509 *CT_POLICY_EVAL_CTX_get0_cert(const CT_POLICY_EVAL_CTX *ctx); + +/* + * Sets the certificate associated with the received SCTs. + * Increments the reference count of cert. + * Returns 1 on success, 0 otherwise. + */ +int CT_POLICY_EVAL_CTX_set1_cert(CT_POLICY_EVAL_CTX *ctx, X509 *cert); + +/* Gets the issuer of the aforementioned certificate */ +X509 *CT_POLICY_EVAL_CTX_get0_issuer(const CT_POLICY_EVAL_CTX *ctx); + +/* + * Sets the issuer of the certificate associated with the received SCTs. + * Increments the reference count of issuer. + * Returns 1 on success, 0 otherwise. + */ +int CT_POLICY_EVAL_CTX_set1_issuer(CT_POLICY_EVAL_CTX *ctx, X509 *issuer); + +/* Gets the CT logs that are trusted sources of SCTs */ +const CTLOG_STORE *CT_POLICY_EVAL_CTX_get0_log_store(const CT_POLICY_EVAL_CTX *ctx); + +/* Sets the log store that is in use. It must outlive the CT_POLICY_EVAL_CTX. */ +void CT_POLICY_EVAL_CTX_set_shared_CTLOG_STORE(CT_POLICY_EVAL_CTX *ctx, + CTLOG_STORE *log_store); + +/* + * Gets the time, in milliseconds since the Unix epoch, that will be used as the + * current time when checking whether an SCT was issued in the future. + * Such SCTs will fail validation, as required by RFC6962. + */ +uint64_t CT_POLICY_EVAL_CTX_get_time(const CT_POLICY_EVAL_CTX *ctx); + +/* + * Sets the time to evaluate SCTs against, in milliseconds since the Unix epoch. + * If an SCT's timestamp is after this time, it will be interpreted as having + * been issued in the future. RFC6962 states that "TLS clients MUST reject SCTs + * whose timestamp is in the future", so an SCT will not validate in this case. + */ +void CT_POLICY_EVAL_CTX_set_time(CT_POLICY_EVAL_CTX *ctx, uint64_t time_in_ms); + +/***************** + * SCT functions * + *****************/ + +/* + * Creates a new, blank SCT. + * The caller is responsible for calling SCT_free when finished with the SCT. + */ +SCT *SCT_new(void); + +/* + * Creates a new SCT from some base64-encoded strings. + * The caller is responsible for calling SCT_free when finished with the SCT. + */ +SCT *SCT_new_from_base64(unsigned char version, + const char *logid_base64, + ct_log_entry_type_t entry_type, + uint64_t timestamp, + const char *extensions_base64, + const char *signature_base64); + +/* + * Frees the SCT and the underlying data structures. + */ +void SCT_free(SCT *sct); + +/* + * Free a stack of SCTs, and the underlying SCTs themselves. + * Intended to be compatible with X509V3_EXT_FREE. + */ +void SCT_LIST_free(STACK_OF(SCT) *a); + +/* + * Returns the version of the SCT. + */ +sct_version_t SCT_get_version(const SCT *sct); + +/* + * Set the version of an SCT. + * Returns 1 on success, 0 if the version is unrecognized. + */ +__owur int SCT_set_version(SCT *sct, sct_version_t version); + +/* + * Returns the log entry type of the SCT. + */ +ct_log_entry_type_t SCT_get_log_entry_type(const SCT *sct); + +/* + * Set the log entry type of an SCT. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set_log_entry_type(SCT *sct, ct_log_entry_type_t entry_type); + +/* + * Gets the ID of the log that an SCT came from. + * Ownership of the log ID remains with the SCT. + * Returns the length of the log ID. + */ +size_t SCT_get0_log_id(const SCT *sct, unsigned char **log_id); + +/* + * Set the log ID of an SCT to point directly to the *log_id specified. + * The SCT takes ownership of the specified pointer. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set0_log_id(SCT *sct, unsigned char *log_id, size_t log_id_len); + +/* + * Set the log ID of an SCT. + * This makes a copy of the log_id. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set1_log_id(SCT *sct, const unsigned char *log_id, + size_t log_id_len); + +/* + * Returns the timestamp for the SCT (epoch time in milliseconds). + */ +uint64_t SCT_get_timestamp(const SCT *sct); + +/* + * Set the timestamp of an SCT (epoch time in milliseconds). + */ +void SCT_set_timestamp(SCT *sct, uint64_t timestamp); + +/* + * Return the NID for the signature used by the SCT. + * For CT v1, this will be either NID_sha256WithRSAEncryption or + * NID_ecdsa_with_SHA256 (or NID_undef if incorrect/unset). + */ +int SCT_get_signature_nid(const SCT *sct); + +/* + * Set the signature type of an SCT + * For CT v1, this should be either NID_sha256WithRSAEncryption or + * NID_ecdsa_with_SHA256. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set_signature_nid(SCT *sct, int nid); + +/* + * Set *ext to point to the extension data for the SCT. ext must not be NULL. + * The SCT retains ownership of this pointer. + * Returns length of the data pointed to. + */ +size_t SCT_get0_extensions(const SCT *sct, unsigned char **ext); + +/* + * Set the extensions of an SCT to point directly to the *ext specified. + * The SCT takes ownership of the specified pointer. + */ +void SCT_set0_extensions(SCT *sct, unsigned char *ext, size_t ext_len); + +/* + * Set the extensions of an SCT. + * This takes a copy of the ext. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set1_extensions(SCT *sct, const unsigned char *ext, + size_t ext_len); + +/* + * Set *sig to point to the signature for the SCT. sig must not be NULL. + * The SCT retains ownership of this pointer. + * Returns length of the data pointed to. + */ +size_t SCT_get0_signature(const SCT *sct, unsigned char **sig); + +/* + * Set the signature of an SCT to point directly to the *sig specified. + * The SCT takes ownership of the specified pointer. + */ +void SCT_set0_signature(SCT *sct, unsigned char *sig, size_t sig_len); + +/* + * Set the signature of an SCT to be a copy of the *sig specified. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set1_signature(SCT *sct, const unsigned char *sig, + size_t sig_len); + +/* + * The origin of this SCT, e.g. TLS extension, OCSP response, etc. + */ +sct_source_t SCT_get_source(const SCT *sct); + +/* + * Set the origin of this SCT, e.g. TLS extension, OCSP response, etc. + * Returns 1 on success, 0 otherwise. + */ +__owur int SCT_set_source(SCT *sct, sct_source_t source); + +/* + * Returns a text string describing the validation status of |sct|. + */ +const char *SCT_validation_status_string(const SCT *sct); + +/* + * Pretty-prints an |sct| to |out|. + * It will be indented by the number of spaces specified by |indent|. + * If |logs| is not NULL, it will be used to lookup the CT log that the SCT came + * from, so that the log name can be printed. + */ +void SCT_print(const SCT *sct, BIO *out, int indent, const CTLOG_STORE *logs); + +/* + * Pretty-prints an |sct_list| to |out|. + * It will be indented by the number of spaces specified by |indent|. + * SCTs will be delimited by |separator|. + * If |logs| is not NULL, it will be used to lookup the CT log that each SCT + * came from, so that the log names can be printed. + */ +void SCT_LIST_print(const STACK_OF(SCT) *sct_list, BIO *out, int indent, + const char *separator, const CTLOG_STORE *logs); + +/* + * Gets the last result of validating this SCT. + * If it has not been validated yet, returns SCT_VALIDATION_STATUS_NOT_SET. + */ +sct_validation_status_t SCT_get_validation_status(const SCT *sct); + +/* + * Validates the given SCT with the provided context. + * Sets the "validation_status" field of the SCT. + * Returns 1 if the SCT is valid and the signature verifies. + * Returns 0 if the SCT is invalid or could not be verified. + * Returns -1 if an error occurs. + */ +__owur int SCT_validate(SCT *sct, const CT_POLICY_EVAL_CTX *ctx); + +/* + * Validates the given list of SCTs with the provided context. + * Sets the "validation_status" field of each SCT. + * Returns 1 if there are no invalid SCTs and all signatures verify. + * Returns 0 if at least one SCT is invalid or could not be verified. + * Returns a negative integer if an error occurs. + */ +__owur int SCT_LIST_validate(const STACK_OF(SCT) *scts, + CT_POLICY_EVAL_CTX *ctx); + +/********************************* + * SCT parsing and serialization * + *********************************/ + +/* + * Serialize (to TLS format) a stack of SCTs and return the length. + * "a" must not be NULL. + * If "pp" is NULL, just return the length of what would have been serialized. + * If "pp" is not NULL and "*pp" is null, function will allocate a new pointer + * for data that caller is responsible for freeing (only if function returns + * successfully). + * If "pp" is NULL and "*pp" is not NULL, caller is responsible for ensuring + * that "*pp" is large enough to accept all of the serialized data. + * Returns < 0 on error, >= 0 indicating bytes written (or would have been) + * on success. + */ +__owur int i2o_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp); + +/* + * Convert TLS format SCT list to a stack of SCTs. + * If "a" or "*a" is NULL, a new stack will be created that the caller is + * responsible for freeing (by calling SCT_LIST_free). + * "**pp" and "*pp" must not be NULL. + * Upon success, "*pp" will point to after the last bytes read, and a stack + * will be returned. + * Upon failure, a NULL pointer will be returned, and the position of "*pp" is + * not defined. + */ +STACK_OF(SCT) *o2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, + size_t len); + +/* + * Serialize (to DER format) a stack of SCTs and return the length. + * "a" must not be NULL. + * If "pp" is NULL, just returns the length of what would have been serialized. + * If "pp" is not NULL and "*pp" is null, function will allocate a new pointer + * for data that caller is responsible for freeing (only if function returns + * successfully). + * If "pp" is NULL and "*pp" is not NULL, caller is responsible for ensuring + * that "*pp" is large enough to accept all of the serialized data. + * Returns < 0 on error, >= 0 indicating bytes written (or would have been) + * on success. + */ +__owur int i2d_SCT_LIST(const STACK_OF(SCT) *a, unsigned char **pp); + +/* + * Parses an SCT list in DER format and returns it. + * If "a" or "*a" is NULL, a new stack will be created that the caller is + * responsible for freeing (by calling SCT_LIST_free). + * "**pp" and "*pp" must not be NULL. + * Upon success, "*pp" will point to after the last bytes read, and a stack + * will be returned. + * Upon failure, a NULL pointer will be returned, and the position of "*pp" is + * not defined. + */ +STACK_OF(SCT) *d2i_SCT_LIST(STACK_OF(SCT) **a, const unsigned char **pp, + long len); + +/* + * Serialize (to TLS format) an |sct| and write it to |out|. + * If |out| is null, no SCT will be output but the length will still be returned. + * If |out| points to a null pointer, a string will be allocated to hold the + * TLS-format SCT. It is the responsibility of the caller to free it. + * If |out| points to an allocated string, the TLS-format SCT will be written + * to it. + * The length of the SCT in TLS format will be returned. + */ +__owur int i2o_SCT(const SCT *sct, unsigned char **out); + +/* + * Parses an SCT in TLS format and returns it. + * If |psct| is not null, it will end up pointing to the parsed SCT. If it + * already points to a non-null pointer, the pointer will be free'd. + * |in| should be a pointer to a string containing the TLS-format SCT. + * |in| will be advanced to the end of the SCT if parsing succeeds. + * |len| should be the length of the SCT in |in|. + * Returns NULL if an error occurs. + * If the SCT is an unsupported version, only the SCT's 'sct' and 'sct_len' + * fields will be populated (with |in| and |len| respectively). + */ +SCT *o2i_SCT(SCT **psct, const unsigned char **in, size_t len); + +/******************** + * CT log functions * + ********************/ + +/* + * Creates a new CT log instance with the given |public_key| and |name| and + * associates it with the give library context |libctx| and property query + * string |propq|. + * Takes ownership of |public_key| but copies |name|. + * Returns NULL if malloc fails or if |public_key| cannot be converted to DER. + * Should be deleted by the caller using CTLOG_free when no longer needed. + */ +CTLOG *CTLOG_new_ex(EVP_PKEY *public_key, const char *name, OSSL_LIB_CTX *libctx, + const char *propq); + +/* + * The same as CTLOG_new_ex except that the default library context and + * property query string are used. + */ +CTLOG *CTLOG_new(EVP_PKEY *public_key, const char *name); + +/* + * Creates a new CTLOG instance with the base64-encoded SubjectPublicKeyInfo DER + * in |pkey_base64| and associated with the given library context |libctx| and + * property query string |propq|. The |name| is a string to help users identify + * this log. + * Returns 1 on success, 0 on failure. + * Should be deleted by the caller using CTLOG_free when no longer needed. + */ +int CTLOG_new_from_base64_ex(CTLOG **ct_log, const char *pkey_base64, + const char *name, OSSL_LIB_CTX *libctx, + const char *propq); + +/* + * The same as CTLOG_new_from_base64_ex() except that the default + * library context and property query string are used. + * Returns 1 on success, 0 on failure. + */ +int CTLOG_new_from_base64(CTLOG **ct_log, + const char *pkey_base64, const char *name); + +/* + * Deletes a CT log instance and its fields. + */ +void CTLOG_free(CTLOG *log); + +/* Gets the name of the CT log */ +const char *CTLOG_get0_name(const CTLOG *log); +/* Gets the ID of the CT log */ +void CTLOG_get0_log_id(const CTLOG *log, const uint8_t **log_id, + size_t *log_id_len); +/* Gets the public key of the CT log */ +EVP_PKEY *CTLOG_get0_public_key(const CTLOG *log); + +/************************** + * CT log store functions * + **************************/ + +/* + * Creates a new CT log store and associates it with the given libctx and + * property query string. + * Should be deleted by the caller using CTLOG_STORE_free when no longer needed. + */ +CTLOG_STORE *CTLOG_STORE_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +/* + * Same as CTLOG_STORE_new_ex except that the default libctx and + * property query string are used. + * Should be deleted by the caller using CTLOG_STORE_free when no longer needed. + */ +CTLOG_STORE *CTLOG_STORE_new(void); + +/* + * Deletes a CT log store and all of the CT log instances held within. + */ +void CTLOG_STORE_free(CTLOG_STORE *store); + +/* + * Finds a CT log in the store based on its log ID. + * Returns the CT log, or NULL if no match is found. + */ +const CTLOG *CTLOG_STORE_get0_log_by_id(const CTLOG_STORE *store, + const uint8_t *log_id, + size_t log_id_len); + +/* + * Loads a CT log list into a |store| from a |file|. + * Returns 1 if loading is successful, or 0 otherwise. + */ +__owur int CTLOG_STORE_load_file(CTLOG_STORE *store, const char *file); + +/* + * Loads the default CT log list into a |store|. + * Returns 1 if loading is successful, or 0 otherwise. + */ +__owur int CTLOG_STORE_load_default_file(CTLOG_STORE *store); + +#ifdef __cplusplus +} +#endif +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/err.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/err.h new file mode 100644 index 000000000000..a15ac6ac1f78 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/err.h @@ -0,0 +1,517 @@ +/* + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_ERR_H +#define OPENSSL_ERR_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_ERR_H +#endif + +#include + +#ifndef OPENSSL_NO_STDIO +#include +#include +#endif + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifndef OPENSSL_NO_FILENAMES +#define ERR_PUT_error(l, f, r, fn, ln) ERR_put_error(l, f, r, fn, ln) +#else +#define ERR_PUT_error(l, f, r, fn, ln) ERR_put_error(l, f, r, NULL, 0) +#endif +#endif + +#include +#include + +#define ERR_TXT_MALLOCED 0x01 +#define ERR_TXT_STRING 0x02 + +#if !defined(OPENSSL_NO_DEPRECATED_3_0) || defined(OSSL_FORCE_ERR_STATE) +#define ERR_FLAG_MARK 0x01 +#define ERR_FLAG_CLEAR 0x02 + +#define ERR_NUM_ERRORS 16 +struct err_state_st { + int err_flags[ERR_NUM_ERRORS]; + int err_marks[ERR_NUM_ERRORS]; + unsigned long err_buffer[ERR_NUM_ERRORS]; + char *err_data[ERR_NUM_ERRORS]; + size_t err_data_size[ERR_NUM_ERRORS]; + int err_data_flags[ERR_NUM_ERRORS]; + char *err_file[ERR_NUM_ERRORS]; + int err_line[ERR_NUM_ERRORS]; + char *err_func[ERR_NUM_ERRORS]; + int top, bottom; +}; +#endif + +/* library */ +#define ERR_LIB_NONE 1 +#define ERR_LIB_SYS 2 +#define ERR_LIB_BN 3 +#define ERR_LIB_RSA 4 +#define ERR_LIB_DH 5 +#define ERR_LIB_EVP 6 +#define ERR_LIB_BUF 7 +#define ERR_LIB_OBJ 8 +#define ERR_LIB_PEM 9 +#define ERR_LIB_DSA 10 +#define ERR_LIB_X509 11 +/* #define ERR_LIB_METH 12 */ +#define ERR_LIB_ASN1 13 +#define ERR_LIB_CONF 14 +#define ERR_LIB_CRYPTO 15 +#define ERR_LIB_EC 16 +#define ERR_LIB_SSL 20 +/* #define ERR_LIB_SSL23 21 */ +/* #define ERR_LIB_SSL2 22 */ +/* #define ERR_LIB_SSL3 23 */ +/* #define ERR_LIB_RSAREF 30 */ +/* #define ERR_LIB_PROXY 31 */ +#define ERR_LIB_BIO 32 +#define ERR_LIB_PKCS7 33 +#define ERR_LIB_X509V3 34 +#define ERR_LIB_PKCS12 35 +#define ERR_LIB_RAND 36 +#define ERR_LIB_DSO 37 +#define ERR_LIB_ENGINE 38 +#define ERR_LIB_OCSP 39 +#define ERR_LIB_UI 40 +#define ERR_LIB_COMP 41 +#define ERR_LIB_ECDSA 42 +#define ERR_LIB_ECDH 43 +#define ERR_LIB_OSSL_STORE 44 +#define ERR_LIB_FIPS 45 +#define ERR_LIB_CMS 46 +#define ERR_LIB_TS 47 +#define ERR_LIB_HMAC 48 +/* # define ERR_LIB_JPAKE 49 */ +#define ERR_LIB_CT 50 +#define ERR_LIB_ASYNC 51 +#define ERR_LIB_KDF 52 +#define ERR_LIB_SM2 53 +#define ERR_LIB_ESS 54 +#define ERR_LIB_PROP 55 +#define ERR_LIB_CRMF 56 +#define ERR_LIB_PROV 57 +#define ERR_LIB_CMP 58 +#define ERR_LIB_OSSL_ENCODER 59 +#define ERR_LIB_OSSL_DECODER 60 +#define ERR_LIB_HTTP 61 + +#define ERR_LIB_USER 128 + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define ASN1err(f, r) ERR_raise_data(ERR_LIB_ASN1, (r), NULL) +#define ASYNCerr(f, r) ERR_raise_data(ERR_LIB_ASYNC, (r), NULL) +#define BIOerr(f, r) ERR_raise_data(ERR_LIB_BIO, (r), NULL) +#define BNerr(f, r) ERR_raise_data(ERR_LIB_BN, (r), NULL) +#define BUFerr(f, r) ERR_raise_data(ERR_LIB_BUF, (r), NULL) +#define CMPerr(f, r) ERR_raise_data(ERR_LIB_CMP, (r), NULL) +#define CMSerr(f, r) ERR_raise_data(ERR_LIB_CMS, (r), NULL) +#define COMPerr(f, r) ERR_raise_data(ERR_LIB_COMP, (r), NULL) +#define CONFerr(f, r) ERR_raise_data(ERR_LIB_CONF, (r), NULL) +#define CRMFerr(f, r) ERR_raise_data(ERR_LIB_CRMF, (r), NULL) +#define CRYPTOerr(f, r) ERR_raise_data(ERR_LIB_CRYPTO, (r), NULL) +#define CTerr(f, r) ERR_raise_data(ERR_LIB_CT, (r), NULL) +#define DHerr(f, r) ERR_raise_data(ERR_LIB_DH, (r), NULL) +#define DSAerr(f, r) ERR_raise_data(ERR_LIB_DSA, (r), NULL) +#define DSOerr(f, r) ERR_raise_data(ERR_LIB_DSO, (r), NULL) +#define ECDHerr(f, r) ERR_raise_data(ERR_LIB_ECDH, (r), NULL) +#define ECDSAerr(f, r) ERR_raise_data(ERR_LIB_ECDSA, (r), NULL) +#define ECerr(f, r) ERR_raise_data(ERR_LIB_EC, (r), NULL) +#define ENGINEerr(f, r) ERR_raise_data(ERR_LIB_ENGINE, (r), NULL) +#define ESSerr(f, r) ERR_raise_data(ERR_LIB_ESS, (r), NULL) +#define EVPerr(f, r) ERR_raise_data(ERR_LIB_EVP, (r), NULL) +#define FIPSerr(f, r) ERR_raise_data(ERR_LIB_FIPS, (r), NULL) +#define HMACerr(f, r) ERR_raise_data(ERR_LIB_HMAC, (r), NULL) +#define HTTPerr(f, r) ERR_raise_data(ERR_LIB_HTTP, (r), NULL) +#define KDFerr(f, r) ERR_raise_data(ERR_LIB_KDF, (r), NULL) +#define OBJerr(f, r) ERR_raise_data(ERR_LIB_OBJ, (r), NULL) +#define OCSPerr(f, r) ERR_raise_data(ERR_LIB_OCSP, (r), NULL) +#define OSSL_STOREerr(f, r) ERR_raise_data(ERR_LIB_OSSL_STORE, (r), NULL) +#define PEMerr(f, r) ERR_raise_data(ERR_LIB_PEM, (r), NULL) +#define PKCS12err(f, r) ERR_raise_data(ERR_LIB_PKCS12, (r), NULL) +#define PKCS7err(f, r) ERR_raise_data(ERR_LIB_PKCS7, (r), NULL) +#define PROPerr(f, r) ERR_raise_data(ERR_LIB_PROP, (r), NULL) +#define PROVerr(f, r) ERR_raise_data(ERR_LIB_PROV, (r), NULL) +#define RANDerr(f, r) ERR_raise_data(ERR_LIB_RAND, (r), NULL) +#define RSAerr(f, r) ERR_raise_data(ERR_LIB_RSA, (r), NULL) +#define KDFerr(f, r) ERR_raise_data(ERR_LIB_KDF, (r), NULL) +#define SM2err(f, r) ERR_raise_data(ERR_LIB_SM2, (r), NULL) +#define SSLerr(f, r) ERR_raise_data(ERR_LIB_SSL, (r), NULL) +#define SYSerr(f, r) ERR_raise_data(ERR_LIB_SYS, (r), NULL) +#define TSerr(f, r) ERR_raise_data(ERR_LIB_TS, (r), NULL) +#define UIerr(f, r) ERR_raise_data(ERR_LIB_UI, (r), NULL) +#define X509V3err(f, r) ERR_raise_data(ERR_LIB_X509V3, (r), NULL) +#define X509err(f, r) ERR_raise_data(ERR_LIB_X509, (r), NULL) +#endif + +/*- + * The error code packs differently depending on if it records a system + * error or an OpenSSL error. + * + * A system error packs like this (we follow POSIX and only allow positive + * numbers that fit in an |int|): + * + * +-+-------------------------------------------------------------+ + * |1| system error number | + * +-+-------------------------------------------------------------+ + * + * An OpenSSL error packs like this: + * + * <---------------------------- 32 bits --------------------------> + * <--- 8 bits ---><------------------ 23 bits -----------------> + * +-+---------------+---------------------------------------------+ + * |0| library | reason | + * +-+---------------+---------------------------------------------+ + * + * A few of the reason bits are reserved as flags with special meaning: + * + * <5 bits-<>--------- 19 bits -----------------> + * +-------+-+-----------------------------------+ + * | rflags| | reason | + * +-------+-+-----------------------------------+ + * ^ + * | + * ERR_RFLAG_FATAL = ERR_R_FATAL + * + * The reason flags are part of the overall reason code for practical + * reasons, as they provide an easy way to place different types of + * reason codes in different numeric ranges. + * + * The currently known reason flags are: + * + * ERR_RFLAG_FATAL Flags that the reason code is considered fatal. + * For backward compatibility reasons, this flag + * is also the code for ERR_R_FATAL (that reason + * code served the dual purpose of flag and reason + * code in one in pre-3.0 OpenSSL). + * ERR_RFLAG_COMMON Flags that the reason code is common to all + * libraries. All ERR_R_ macros must use this flag, + * and no other _R_ macro is allowed to use it. + */ + +/* Macros to help decode recorded system errors */ +#define ERR_SYSTEM_FLAG ((unsigned int)INT_MAX + 1) +#define ERR_SYSTEM_MASK ((unsigned int)INT_MAX) + +/* + * Macros to help decode recorded OpenSSL errors + * As expressed above, RFLAGS and REASON overlap by one bit to allow + * ERR_R_FATAL to use ERR_RFLAG_FATAL as its reason code. + */ +#define ERR_LIB_OFFSET 23L +#define ERR_LIB_MASK 0xFF +#define ERR_RFLAGS_OFFSET 18L +#define ERR_RFLAGS_MASK 0x1F +#define ERR_REASON_MASK 0X7FFFFF + +/* + * Reason flags are defined pre-shifted to easily combine with the reason + * number. + */ +#define ERR_RFLAG_FATAL (0x1 << ERR_RFLAGS_OFFSET) +#define ERR_RFLAG_COMMON (0x2 << ERR_RFLAGS_OFFSET) + +#define ERR_SYSTEM_ERROR(errcode) (((errcode) & ERR_SYSTEM_FLAG) != 0) + +static ossl_unused ossl_inline int ERR_GET_LIB(unsigned long errcode) +{ + if (ERR_SYSTEM_ERROR(errcode)) + return ERR_LIB_SYS; + return (errcode >> ERR_LIB_OFFSET) & ERR_LIB_MASK; +} + +static ossl_unused ossl_inline int ERR_GET_RFLAGS(unsigned long errcode) +{ + if (ERR_SYSTEM_ERROR(errcode)) + return 0; + return errcode & (ERR_RFLAGS_MASK << ERR_RFLAGS_OFFSET); +} + +static ossl_unused ossl_inline int ERR_GET_REASON(unsigned long errcode) +{ + if (ERR_SYSTEM_ERROR(errcode)) + return errcode & ERR_SYSTEM_MASK; + return errcode & ERR_REASON_MASK; +} + +static ossl_unused ossl_inline int ERR_FATAL_ERROR(unsigned long errcode) +{ + return (ERR_GET_RFLAGS(errcode) & ERR_RFLAG_FATAL) != 0; +} + +static ossl_unused ossl_inline int ERR_COMMON_ERROR(unsigned long errcode) +{ + return (ERR_GET_RFLAGS(errcode) & ERR_RFLAG_COMMON) != 0; +} + +/* + * ERR_PACK is a helper macro to properly pack OpenSSL error codes and may + * only be used for that purpose. System errors are packed internally. + * ERR_PACK takes reason flags and reason code combined in |reason|. + * ERR_PACK ignores |func|, that parameter is just legacy from pre-3.0 OpenSSL. + */ +#define ERR_PACK(lib, func, reason) \ + ((((unsigned long)(lib) & ERR_LIB_MASK) << ERR_LIB_OFFSET) | (((unsigned long)(reason) & ERR_REASON_MASK))) + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SYS_F_FOPEN 0 +#define SYS_F_CONNECT 0 +#define SYS_F_GETSERVBYNAME 0 +#define SYS_F_SOCKET 0 +#define SYS_F_IOCTLSOCKET 0 +#define SYS_F_BIND 0 +#define SYS_F_LISTEN 0 +#define SYS_F_ACCEPT 0 +#define SYS_F_WSASTARTUP 0 +#define SYS_F_OPENDIR 0 +#define SYS_F_FREAD 0 +#define SYS_F_GETADDRINFO 0 +#define SYS_F_GETNAMEINFO 0 +#define SYS_F_SETSOCKOPT 0 +#define SYS_F_GETSOCKOPT 0 +#define SYS_F_GETSOCKNAME 0 +#define SYS_F_GETHOSTBYNAME 0 +#define SYS_F_FFLUSH 0 +#define SYS_F_OPEN 0 +#define SYS_F_CLOSE 0 +#define SYS_F_IOCTL 0 +#define SYS_F_STAT 0 +#define SYS_F_FCNTL 0 +#define SYS_F_FSTAT 0 +#define SYS_F_SENDFILE 0 +#endif + +/* + * All ERR_R_ codes must be combined with ERR_RFLAG_COMMON. + */ + +/* "we came from here" global reason codes, range 1..255 */ +#define ERR_R_SYS_LIB (ERR_LIB_SYS /* 2 */ | ERR_RFLAG_COMMON) +#define ERR_R_BN_LIB (ERR_LIB_BN /* 3 */ | ERR_RFLAG_COMMON) +#define ERR_R_RSA_LIB (ERR_LIB_RSA /* 4 */ | ERR_RFLAG_COMMON) +#define ERR_R_DH_LIB (ERR_LIB_DH /* 5 */ | ERR_RFLAG_COMMON) +#define ERR_R_EVP_LIB (ERR_LIB_EVP /* 6 */ | ERR_RFLAG_COMMON) +#define ERR_R_BUF_LIB (ERR_LIB_BUF /* 7 */ | ERR_RFLAG_COMMON) +#define ERR_R_OBJ_LIB (ERR_LIB_OBJ /* 8 */ | ERR_RFLAG_COMMON) +#define ERR_R_PEM_LIB (ERR_LIB_PEM /* 9 */ | ERR_RFLAG_COMMON) +#define ERR_R_DSA_LIB (ERR_LIB_DSA /* 10 */ | ERR_RFLAG_COMMON) +#define ERR_R_X509_LIB (ERR_LIB_X509 /* 11 */ | ERR_RFLAG_COMMON) +#define ERR_R_ASN1_LIB (ERR_LIB_ASN1 /* 13 */ | ERR_RFLAG_COMMON) +#define ERR_R_CONF_LIB (ERR_LIB_CONF /* 14 */ | ERR_RFLAG_COMMON) +#define ERR_R_CRYPTO_LIB (ERR_LIB_CRYPTO /* 15 */ | ERR_RFLAG_COMMON) +#define ERR_R_EC_LIB (ERR_LIB_EC /* 16 */ | ERR_RFLAG_COMMON) +#define ERR_R_SSL_LIB (ERR_LIB_SSL /* 20 */ | ERR_RFLAG_COMMON) +#define ERR_R_BIO_LIB (ERR_LIB_BIO /* 32 */ | ERR_RFLAG_COMMON) +#define ERR_R_PKCS7_LIB (ERR_LIB_PKCS7 /* 33 */ | ERR_RFLAG_COMMON) +#define ERR_R_X509V3_LIB (ERR_LIB_X509V3 /* 34 */ | ERR_RFLAG_COMMON) +#define ERR_R_PKCS12_LIB (ERR_LIB_PKCS12 /* 35 */ | ERR_RFLAG_COMMON) +#define ERR_R_RAND_LIB (ERR_LIB_RAND /* 36 */ | ERR_RFLAG_COMMON) +#define ERR_R_DSO_LIB (ERR_LIB_DSO /* 37 */ | ERR_RFLAG_COMMON) +#define ERR_R_ENGINE_LIB (ERR_LIB_ENGINE /* 38 */ | ERR_RFLAG_COMMON) +#define ERR_R_UI_LIB (ERR_LIB_UI /* 40 */ | ERR_RFLAG_COMMON) +#define ERR_R_ECDSA_LIB (ERR_LIB_ECDSA /* 42 */ | ERR_RFLAG_COMMON) +#define ERR_R_OSSL_STORE_LIB (ERR_LIB_OSSL_STORE /* 44 */ | ERR_RFLAG_COMMON) +#define ERR_R_CMS_LIB (ERR_LIB_CMS /* 46 */ | ERR_RFLAG_COMMON) +#define ERR_R_TS_LIB (ERR_LIB_TS /* 47 */ | ERR_RFLAG_COMMON) +#define ERR_R_CT_LIB (ERR_LIB_CT /* 50 */ | ERR_RFLAG_COMMON) +#define ERR_R_PROV_LIB (ERR_LIB_PROV /* 57 */ | ERR_RFLAG_COMMON) +#define ERR_R_ESS_LIB (ERR_LIB_ESS /* 54 */ | ERR_RFLAG_COMMON) +#define ERR_R_CMP_LIB (ERR_LIB_CMP /* 58 */ | ERR_RFLAG_COMMON) +#define ERR_R_OSSL_ENCODER_LIB (ERR_LIB_OSSL_ENCODER /* 59 */ | ERR_RFLAG_COMMON) +#define ERR_R_OSSL_DECODER_LIB (ERR_LIB_OSSL_DECODER /* 60 */ | ERR_RFLAG_COMMON) + +/* Other common error codes, range 256..2^ERR_RFLAGS_OFFSET-1 */ +#define ERR_R_FATAL (ERR_RFLAG_FATAL | ERR_RFLAG_COMMON) +#define ERR_R_MALLOC_FAILURE (256 | ERR_R_FATAL) +#define ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED (257 | ERR_R_FATAL) +#define ERR_R_PASSED_NULL_PARAMETER (258 | ERR_R_FATAL) +#define ERR_R_INTERNAL_ERROR (259 | ERR_R_FATAL) +#define ERR_R_DISABLED (260 | ERR_R_FATAL) +#define ERR_R_INIT_FAIL (261 | ERR_R_FATAL) +#define ERR_R_PASSED_INVALID_ARGUMENT (262 | ERR_RFLAG_COMMON) +#define ERR_R_OPERATION_FAIL (263 | ERR_R_FATAL) +#define ERR_R_INVALID_PROVIDER_FUNCTIONS (264 | ERR_R_FATAL) +#define ERR_R_INTERRUPTED_OR_CANCELLED (265 | ERR_RFLAG_COMMON) +#define ERR_R_NESTED_ASN1_ERROR (266 | ERR_RFLAG_COMMON) +#define ERR_R_MISSING_ASN1_EOS (267 | ERR_RFLAG_COMMON) +#define ERR_R_UNSUPPORTED (268 | ERR_RFLAG_COMMON) +#define ERR_R_FETCH_FAILED (269 | ERR_RFLAG_COMMON) +#define ERR_R_INVALID_PROPERTY_DEFINITION (270 | ERR_RFLAG_COMMON) +#define ERR_R_UNABLE_TO_GET_READ_LOCK (271 | ERR_R_FATAL) +#define ERR_R_UNABLE_TO_GET_WRITE_LOCK (272 | ERR_R_FATAL) + +typedef struct ERR_string_data_st { + unsigned long error; + const char *string; +} ERR_STRING_DATA; + +/* clang-format off */ +DEFINE_LHASH_OF_INTERNAL(ERR_STRING_DATA); +#define lh_ERR_STRING_DATA_new(hfn, cmp) ((LHASH_OF(ERR_STRING_DATA) *)OPENSSL_LH_set_thunks(OPENSSL_LH_new(ossl_check_ERR_STRING_DATA_lh_hashfunc_type(hfn), ossl_check_ERR_STRING_DATA_lh_compfunc_type(cmp)), lh_ERR_STRING_DATA_hash_thunk, lh_ERR_STRING_DATA_comp_thunk, lh_ERR_STRING_DATA_doall_thunk, lh_ERR_STRING_DATA_doall_arg_thunk)) +#define lh_ERR_STRING_DATA_free(lh) OPENSSL_LH_free(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_flush(lh) OPENSSL_LH_flush(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_insert(lh, ptr) ((ERR_STRING_DATA *)OPENSSL_LH_insert(ossl_check_ERR_STRING_DATA_lh_type(lh), ossl_check_ERR_STRING_DATA_lh_plain_type(ptr))) +#define lh_ERR_STRING_DATA_delete(lh, ptr) ((ERR_STRING_DATA *)OPENSSL_LH_delete(ossl_check_ERR_STRING_DATA_lh_type(lh), ossl_check_const_ERR_STRING_DATA_lh_plain_type(ptr))) +#define lh_ERR_STRING_DATA_retrieve(lh, ptr) ((ERR_STRING_DATA *)OPENSSL_LH_retrieve(ossl_check_ERR_STRING_DATA_lh_type(lh), ossl_check_const_ERR_STRING_DATA_lh_plain_type(ptr))) +#define lh_ERR_STRING_DATA_error(lh) OPENSSL_LH_error(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_num_items(lh) OPENSSL_LH_num_items(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_node_stats_bio(lh, out) OPENSSL_LH_node_stats_bio(ossl_check_const_ERR_STRING_DATA_lh_type(lh), out) +#define lh_ERR_STRING_DATA_node_usage_stats_bio(lh, out) OPENSSL_LH_node_usage_stats_bio(ossl_check_const_ERR_STRING_DATA_lh_type(lh), out) +#define lh_ERR_STRING_DATA_stats_bio(lh, out) OPENSSL_LH_stats_bio(ossl_check_const_ERR_STRING_DATA_lh_type(lh), out) +#define lh_ERR_STRING_DATA_get_down_load(lh) OPENSSL_LH_get_down_load(ossl_check_ERR_STRING_DATA_lh_type(lh)) +#define lh_ERR_STRING_DATA_set_down_load(lh, dl) OPENSSL_LH_set_down_load(ossl_check_ERR_STRING_DATA_lh_type(lh), dl) +#define lh_ERR_STRING_DATA_doall(lh, dfn) OPENSSL_LH_doall(ossl_check_ERR_STRING_DATA_lh_type(lh), ossl_check_ERR_STRING_DATA_lh_doallfunc_type(dfn)) + +/* clang-format on */ + +/* 12 lines and some on an 80 column terminal */ +#define ERR_MAX_DATA_SIZE 1024 + +/* Building blocks */ +void ERR_new(void); +void ERR_set_debug(const char *file, int line, const char *func); +void ERR_set_error(int lib, int reason, const char *fmt, ...); +void ERR_vset_error(int lib, int reason, const char *fmt, va_list args); + +/* Main error raising functions */ +#define ERR_raise(lib, reason) ERR_raise_data((lib), (reason), NULL) +#define ERR_raise_data \ + (ERR_new(), \ + ERR_set_debug(OPENSSL_FILE, OPENSSL_LINE, OPENSSL_FUNC), \ + ERR_set_error) + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +/* Backward compatibility */ +#define ERR_put_error(lib, func, reason, file, line) \ + (ERR_new(), \ + ERR_set_debug((file), (line), OPENSSL_FUNC), \ + ERR_set_error((lib), (reason), NULL)) +#endif + +void ERR_set_error_data(char *data, int flags); + +unsigned long ERR_get_error(void); +unsigned long ERR_get_error_all(const char **file, int *line, + const char **func, + const char **data, int *flags); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +unsigned long ERR_get_error_line(const char **file, int *line); +OSSL_DEPRECATEDIN_3_0 +unsigned long ERR_get_error_line_data(const char **file, int *line, + const char **data, int *flags); +#endif +unsigned long ERR_peek_error(void); +unsigned long ERR_peek_error_line(const char **file, int *line); +unsigned long ERR_peek_error_func(const char **func); +unsigned long ERR_peek_error_data(const char **data, int *flags); +unsigned long ERR_peek_error_all(const char **file, int *line, + const char **func, + const char **data, int *flags); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +unsigned long ERR_peek_error_line_data(const char **file, int *line, + const char **data, int *flags); +#endif +unsigned long ERR_peek_last_error(void); +unsigned long ERR_peek_last_error_line(const char **file, int *line); +unsigned long ERR_peek_last_error_func(const char **func); +unsigned long ERR_peek_last_error_data(const char **data, int *flags); +unsigned long ERR_peek_last_error_all(const char **file, int *line, + const char **func, + const char **data, int *flags); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +unsigned long ERR_peek_last_error_line_data(const char **file, int *line, + const char **data, int *flags); +#endif + +void ERR_clear_error(void); + +char *ERR_error_string(unsigned long e, char *buf); +void ERR_error_string_n(unsigned long e, char *buf, size_t len); +const char *ERR_lib_error_string(unsigned long e); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 const char *ERR_func_error_string(unsigned long e); +#endif +const char *ERR_reason_error_string(unsigned long e); + +void ERR_print_errors_cb(int (*cb)(const char *str, size_t len, void *u), + void *u); +#ifndef OPENSSL_NO_STDIO +void ERR_print_errors_fp(FILE *fp); +#endif +void ERR_print_errors(BIO *bp); + +void ERR_add_error_data(int num, ...); +void ERR_add_error_vdata(int num, va_list args); +void ERR_add_error_txt(const char *sepr, const char *txt); +void ERR_add_error_mem_bio(const char *sep, BIO *bio); + +int ERR_load_strings(int lib, ERR_STRING_DATA *str); +int ERR_load_strings_const(const ERR_STRING_DATA *str); +int ERR_unload_strings(int lib, ERR_STRING_DATA *str); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define ERR_load_crypto_strings() \ + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL) +#define ERR_free_strings() \ + while (0) \ + continue +#endif +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 void ERR_remove_thread_state(void *); +#endif +#ifndef OPENSSL_NO_DEPRECATED_1_0_0 +OSSL_DEPRECATEDIN_1_0_0 void ERR_remove_state(unsigned long pid); +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 ERR_STATE *ERR_get_state(void); +#endif + +int ERR_get_next_error_library(void); + +int ERR_set_mark(void); +int ERR_pop_to_mark(void); +int ERR_clear_last_mark(void); +int ERR_count_to_mark(void); +int ERR_pop(void); + +ERR_STATE *OSSL_ERR_STATE_new(void); +void OSSL_ERR_STATE_save(ERR_STATE *es); +void OSSL_ERR_STATE_save_to_mark(ERR_STATE *es); +void OSSL_ERR_STATE_restore(const ERR_STATE *es); +void OSSL_ERR_STATE_free(ERR_STATE *es); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ess.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ess.h new file mode 100644 index 000000000000..82f38894763d --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ess.h @@ -0,0 +1,131 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/ess.h.in + * + * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_ESS_H +#define OPENSSL_ESS_H +#pragma once + +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ESS_issuer_serial ESS_ISSUER_SERIAL; +typedef struct ESS_cert_id ESS_CERT_ID; +typedef struct ESS_signing_cert ESS_SIGNING_CERT; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ESS_CERT_ID, ESS_CERT_ID, ESS_CERT_ID) +#define sk_ESS_CERT_ID_num(sk) OPENSSL_sk_num(ossl_check_const_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_value(sk, idx) ((ESS_CERT_ID *)OPENSSL_sk_value(ossl_check_const_ESS_CERT_ID_sk_type(sk), (idx))) +#define sk_ESS_CERT_ID_new(cmp) ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_new(ossl_check_ESS_CERT_ID_compfunc_type(cmp))) +#define sk_ESS_CERT_ID_new_null() ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_new_null()) +#define sk_ESS_CERT_ID_new_reserve(cmp, n) ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_new_reserve(ossl_check_ESS_CERT_ID_compfunc_type(cmp), (n))) +#define sk_ESS_CERT_ID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ESS_CERT_ID_sk_type(sk), (n)) +#define sk_ESS_CERT_ID_free(sk) OPENSSL_sk_free(ossl_check_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_zero(sk) OPENSSL_sk_zero(ossl_check_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_delete(sk, i) ((ESS_CERT_ID *)OPENSSL_sk_delete(ossl_check_ESS_CERT_ID_sk_type(sk), (i))) +#define sk_ESS_CERT_ID_delete_ptr(sk, ptr) ((ESS_CERT_ID *)OPENSSL_sk_delete_ptr(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr))) +#define sk_ESS_CERT_ID_push(sk, ptr) OPENSSL_sk_push(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr)) +#define sk_ESS_CERT_ID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr)) +#define sk_ESS_CERT_ID_pop(sk) ((ESS_CERT_ID *)OPENSSL_sk_pop(ossl_check_ESS_CERT_ID_sk_type(sk))) +#define sk_ESS_CERT_ID_shift(sk) ((ESS_CERT_ID *)OPENSSL_sk_shift(ossl_check_ESS_CERT_ID_sk_type(sk))) +#define sk_ESS_CERT_ID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ESS_CERT_ID_sk_type(sk),ossl_check_ESS_CERT_ID_freefunc_type(freefunc)) +#define sk_ESS_CERT_ID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr), (idx)) +#define sk_ESS_CERT_ID_set(sk, idx, ptr) ((ESS_CERT_ID *)OPENSSL_sk_set(ossl_check_ESS_CERT_ID_sk_type(sk), (idx), ossl_check_ESS_CERT_ID_type(ptr))) +#define sk_ESS_CERT_ID_find(sk, ptr) OPENSSL_sk_find(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr)) +#define sk_ESS_CERT_ID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr)) +#define sk_ESS_CERT_ID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_type(ptr), pnum) +#define sk_ESS_CERT_ID_sort(sk) OPENSSL_sk_sort(ossl_check_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ESS_CERT_ID_sk_type(sk)) +#define sk_ESS_CERT_ID_dup(sk) ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_dup(ossl_check_const_ESS_CERT_ID_sk_type(sk))) +#define sk_ESS_CERT_ID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ESS_CERT_ID) *)OPENSSL_sk_deep_copy(ossl_check_const_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_copyfunc_type(copyfunc), ossl_check_ESS_CERT_ID_freefunc_type(freefunc))) +#define sk_ESS_CERT_ID_set_cmp_func(sk, cmp) ((sk_ESS_CERT_ID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ESS_CERT_ID_sk_type(sk), ossl_check_ESS_CERT_ID_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct ESS_signing_cert_v2_st ESS_SIGNING_CERT_V2; +typedef struct ESS_cert_id_v2_st ESS_CERT_ID_V2; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ESS_CERT_ID_V2, ESS_CERT_ID_V2, ESS_CERT_ID_V2) +#define sk_ESS_CERT_ID_V2_num(sk) OPENSSL_sk_num(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_value(sk, idx) ((ESS_CERT_ID_V2 *)OPENSSL_sk_value(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk), (idx))) +#define sk_ESS_CERT_ID_V2_new(cmp) ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_new(ossl_check_ESS_CERT_ID_V2_compfunc_type(cmp))) +#define sk_ESS_CERT_ID_V2_new_null() ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_new_null()) +#define sk_ESS_CERT_ID_V2_new_reserve(cmp, n) ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_new_reserve(ossl_check_ESS_CERT_ID_V2_compfunc_type(cmp), (n))) +#define sk_ESS_CERT_ID_V2_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ESS_CERT_ID_V2_sk_type(sk), (n)) +#define sk_ESS_CERT_ID_V2_free(sk) OPENSSL_sk_free(ossl_check_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_zero(sk) OPENSSL_sk_zero(ossl_check_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_delete(sk, i) ((ESS_CERT_ID_V2 *)OPENSSL_sk_delete(ossl_check_ESS_CERT_ID_V2_sk_type(sk), (i))) +#define sk_ESS_CERT_ID_V2_delete_ptr(sk, ptr) ((ESS_CERT_ID_V2 *)OPENSSL_sk_delete_ptr(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr))) +#define sk_ESS_CERT_ID_V2_push(sk, ptr) OPENSSL_sk_push(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr)) +#define sk_ESS_CERT_ID_V2_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr)) +#define sk_ESS_CERT_ID_V2_pop(sk) ((ESS_CERT_ID_V2 *)OPENSSL_sk_pop(ossl_check_ESS_CERT_ID_V2_sk_type(sk))) +#define sk_ESS_CERT_ID_V2_shift(sk) ((ESS_CERT_ID_V2 *)OPENSSL_sk_shift(ossl_check_ESS_CERT_ID_V2_sk_type(sk))) +#define sk_ESS_CERT_ID_V2_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ESS_CERT_ID_V2_sk_type(sk),ossl_check_ESS_CERT_ID_V2_freefunc_type(freefunc)) +#define sk_ESS_CERT_ID_V2_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr), (idx)) +#define sk_ESS_CERT_ID_V2_set(sk, idx, ptr) ((ESS_CERT_ID_V2 *)OPENSSL_sk_set(ossl_check_ESS_CERT_ID_V2_sk_type(sk), (idx), ossl_check_ESS_CERT_ID_V2_type(ptr))) +#define sk_ESS_CERT_ID_V2_find(sk, ptr) OPENSSL_sk_find(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr)) +#define sk_ESS_CERT_ID_V2_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr)) +#define sk_ESS_CERT_ID_V2_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_type(ptr), pnum) +#define sk_ESS_CERT_ID_V2_sort(sk) OPENSSL_sk_sort(ossl_check_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk)) +#define sk_ESS_CERT_ID_V2_dup(sk) ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_dup(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk))) +#define sk_ESS_CERT_ID_V2_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ESS_CERT_ID_V2) *)OPENSSL_sk_deep_copy(ossl_check_const_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_copyfunc_type(copyfunc), ossl_check_ESS_CERT_ID_V2_freefunc_type(freefunc))) +#define sk_ESS_CERT_ID_V2_set_cmp_func(sk, cmp) ((sk_ESS_CERT_ID_V2_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ESS_CERT_ID_V2_sk_type(sk), ossl_check_ESS_CERT_ID_V2_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_ALLOC_FUNCTIONS(ESS_ISSUER_SERIAL) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(ESS_ISSUER_SERIAL, ESS_ISSUER_SERIAL) +DECLARE_ASN1_DUP_FUNCTION(ESS_ISSUER_SERIAL) + +DECLARE_ASN1_ALLOC_FUNCTIONS(ESS_CERT_ID) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(ESS_CERT_ID, ESS_CERT_ID) +DECLARE_ASN1_DUP_FUNCTION(ESS_CERT_ID) + +DECLARE_ASN1_FUNCTIONS(ESS_SIGNING_CERT) +DECLARE_ASN1_DUP_FUNCTION(ESS_SIGNING_CERT) + +DECLARE_ASN1_ALLOC_FUNCTIONS(ESS_CERT_ID_V2) +DECLARE_ASN1_ENCODE_FUNCTIONS_only(ESS_CERT_ID_V2, ESS_CERT_ID_V2) +DECLARE_ASN1_DUP_FUNCTION(ESS_CERT_ID_V2) + +DECLARE_ASN1_FUNCTIONS(ESS_SIGNING_CERT_V2) +DECLARE_ASN1_DUP_FUNCTION(ESS_SIGNING_CERT_V2) + +ESS_SIGNING_CERT *OSSL_ESS_signing_cert_new_init(const X509 *signcert, + const STACK_OF(X509) *certs, + int set_issuer_serial); +ESS_SIGNING_CERT_V2 *OSSL_ESS_signing_cert_v2_new_init(const EVP_MD *hash_alg, + const X509 *signcert, + const STACK_OF(X509) *certs, + int set_issuer_serial); +int OSSL_ESS_check_signing_certs(const ESS_SIGNING_CERT *ss, + const ESS_SIGNING_CERT_V2 *ssv2, + const STACK_OF(X509) *chain, + int require_signing_cert); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/fipskey.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/fipskey.h new file mode 100644 index 000000000000..2defbe7b232a --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/fipskey.h @@ -0,0 +1,47 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/fipskey.h.in + * + * Copyright 2020-2024 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_FIPSKEY_H +#define OPENSSL_FIPSKEY_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The FIPS validation HMAC key, usable as an array initializer. + */ +/* clang-format off */ +#define FIPS_KEY_ELEMENTS \ + 0xf4, 0x55, 0x66, 0x50, 0xac, 0x31, 0xd3, 0x54, 0x61, 0x61, 0x0b, 0xac, 0x4e, 0xd8, 0x1b, 0x1a, 0x18, 0x1b, 0x2d, 0x8a, 0x43, 0xea, 0x28, 0x54, 0xcb, 0xae, 0x22, 0xca, 0x74, 0x56, 0x08, 0x13 +/* clang-format on */ + +/* + * The FIPS validation key, as a string. + */ +/* clang-format off */ +#define FIPS_KEY_STRING "f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813" +/* clang-format on */ + +/* + * The FIPS provider vendor name, as a string. + */ +/* clang-format off */ +#define FIPS_VENDOR "OpenSSL FIPS Provider" +/* clang-format on */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/lhash.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/lhash.h new file mode 100644 index 000000000000..dab9372b0b67 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/lhash.h @@ -0,0 +1,417 @@ +/* + * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +/* + * Header for dynamic hash table routines Author - Eric Young + */ + +#ifndef OPENSSL_LHASH_H +#define OPENSSL_LHASH_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_LHASH_H +#endif + +#include +#include +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct lhash_node_st OPENSSL_LH_NODE; +typedef int (*OPENSSL_LH_COMPFUNC)(const void *, const void *); +typedef int (*OPENSSL_LH_COMPFUNCTHUNK)(const void *, const void *, OPENSSL_LH_COMPFUNC cfn); +typedef unsigned long (*OPENSSL_LH_HASHFUNC)(const void *); +typedef unsigned long (*OPENSSL_LH_HASHFUNCTHUNK)(const void *, OPENSSL_LH_HASHFUNC hfn); +typedef void (*OPENSSL_LH_DOALL_FUNC)(void *); +typedef void (*OPENSSL_LH_DOALL_FUNC_THUNK)(void *, OPENSSL_LH_DOALL_FUNC doall); +typedef void (*OPENSSL_LH_DOALL_FUNCARG)(void *, void *); +typedef void (*OPENSSL_LH_DOALL_FUNCARG_THUNK)(void *, void *, OPENSSL_LH_DOALL_FUNCARG doall); +typedef struct lhash_st OPENSSL_LHASH; + +/* + * Macros for declaring and implementing type-safe wrappers for LHASH + * callbacks. This way, callbacks can be provided to LHASH structures without + * function pointer casting and the macro-defined callbacks provide + * per-variable casting before deferring to the underlying type-specific + * callbacks. NB: It is possible to place a "static" in front of both the + * DECLARE and IMPLEMENT macros if the functions are strictly internal. + */ + +/* First: "hash" functions */ +#define DECLARE_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *); +#define IMPLEMENT_LHASH_HASH_FN(name, o_type) \ + unsigned long name##_LHASH_HASH(const void *arg) \ + { \ + const o_type *a = arg; \ + return name##_hash(a); \ + } +#define LHASH_HASH_FN(name) name##_LHASH_HASH + +/* Second: "compare" functions */ +#define DECLARE_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *, const void *); +#define IMPLEMENT_LHASH_COMP_FN(name, o_type) \ + int name##_LHASH_COMP(const void *arg1, const void *arg2) \ + { \ + const o_type *a = arg1; \ + const o_type *b = arg2; \ + return name##_cmp(a, b); \ + } +#define LHASH_COMP_FN(name) name##_LHASH_COMP + +/* Fourth: "doall_arg" functions */ +#define DECLARE_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *, void *); +#define IMPLEMENT_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ + void name##_LHASH_DOALL_ARG(void *arg1, void *arg2) \ + { \ + o_type *a = arg1; \ + a_type *b = arg2; \ + name##_doall_arg(a, b); \ + } +#define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG + +#define LH_LOAD_MULT 256 + +int OPENSSL_LH_error(OPENSSL_LHASH *lh); +OPENSSL_LHASH *OPENSSL_LH_new(OPENSSL_LH_HASHFUNC h, OPENSSL_LH_COMPFUNC c); +OPENSSL_LHASH *OPENSSL_LH_set_thunks(OPENSSL_LHASH *lh, + OPENSSL_LH_HASHFUNCTHUNK hw, + OPENSSL_LH_COMPFUNCTHUNK cw, + OPENSSL_LH_DOALL_FUNC_THUNK daw, + OPENSSL_LH_DOALL_FUNCARG_THUNK daaw); +void OPENSSL_LH_free(OPENSSL_LHASH *lh); +void OPENSSL_LH_flush(OPENSSL_LHASH *lh); +void *OPENSSL_LH_insert(OPENSSL_LHASH *lh, void *data); +void *OPENSSL_LH_delete(OPENSSL_LHASH *lh, const void *data); +void *OPENSSL_LH_retrieve(OPENSSL_LHASH *lh, const void *data); +void OPENSSL_LH_doall(OPENSSL_LHASH *lh, OPENSSL_LH_DOALL_FUNC func); +void OPENSSL_LH_doall_arg(OPENSSL_LHASH *lh, + OPENSSL_LH_DOALL_FUNCARG func, void *arg); +void OPENSSL_LH_doall_arg_thunk(OPENSSL_LHASH *lh, + OPENSSL_LH_DOALL_FUNCARG_THUNK daaw, + OPENSSL_LH_DOALL_FUNCARG fn, void *arg); + +unsigned long OPENSSL_LH_strhash(const char *c); +unsigned long OPENSSL_LH_num_items(const OPENSSL_LHASH *lh); +unsigned long OPENSSL_LH_get_down_load(const OPENSSL_LHASH *lh); +void OPENSSL_LH_set_down_load(OPENSSL_LHASH *lh, unsigned long down_load); + +#ifndef OPENSSL_NO_STDIO +#ifndef OPENSSL_NO_DEPRECATED_3_1 +OSSL_DEPRECATEDIN_3_1 void OPENSSL_LH_stats(const OPENSSL_LHASH *lh, FILE *fp); +OSSL_DEPRECATEDIN_3_1 void OPENSSL_LH_node_stats(const OPENSSL_LHASH *lh, FILE *fp); +OSSL_DEPRECATEDIN_3_1 void OPENSSL_LH_node_usage_stats(const OPENSSL_LHASH *lh, FILE *fp); +#endif +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_1 +OSSL_DEPRECATEDIN_3_1 void OPENSSL_LH_stats_bio(const OPENSSL_LHASH *lh, BIO *out); +OSSL_DEPRECATEDIN_3_1 void OPENSSL_LH_node_stats_bio(const OPENSSL_LHASH *lh, BIO *out); +OSSL_DEPRECATEDIN_3_1 void OPENSSL_LH_node_usage_stats_bio(const OPENSSL_LHASH *lh, BIO *out); +#endif + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define _LHASH OPENSSL_LHASH +#define LHASH_NODE OPENSSL_LH_NODE +#define lh_error OPENSSL_LH_error +#define lh_new OPENSSL_LH_new +#define lh_free OPENSSL_LH_free +#define lh_insert OPENSSL_LH_insert +#define lh_delete OPENSSL_LH_delete +#define lh_retrieve OPENSSL_LH_retrieve +#define lh_doall OPENSSL_LH_doall +#define lh_doall_arg OPENSSL_LH_doall_arg +#define lh_strhash OPENSSL_LH_strhash +#define lh_num_items OPENSSL_LH_num_items +#ifndef OPENSSL_NO_STDIO +#define lh_stats OPENSSL_LH_stats +#define lh_node_stats OPENSSL_LH_node_stats +#define lh_node_usage_stats OPENSSL_LH_node_usage_stats +#endif +#define lh_stats_bio OPENSSL_LH_stats_bio +#define lh_node_stats_bio OPENSSL_LH_node_stats_bio +#define lh_node_usage_stats_bio OPENSSL_LH_node_usage_stats_bio +#endif + +/* Type checking... */ + +#define LHASH_OF(type) struct lhash_st_##type + +/* Helper macro for internal use */ +#define DEFINE_LHASH_OF_INTERNAL(type) \ + LHASH_OF(type) \ + { \ + union lh_##type##_dummy { \ + void *d1; \ + unsigned long d2; \ + int d3; \ + } dummy; \ + }; \ + typedef int (*lh_##type##_compfunc)(const type *a, const type *b); \ + typedef unsigned long (*lh_##type##_hashfunc)(const type *a); \ + typedef void (*lh_##type##_doallfunc)(type * a); \ + static ossl_inline unsigned long lh_##type##_hash_thunk(const void *data, OPENSSL_LH_HASHFUNC hfn) \ + { \ + unsigned long (*hfn_conv)(const type *) = (unsigned long (*)(const type *))hfn; \ + return hfn_conv((const type *)data); \ + } \ + static ossl_inline int lh_##type##_comp_thunk(const void *da, const void *db, OPENSSL_LH_COMPFUNC cfn) \ + { \ + int (*cfn_conv)(const type *, const type *) = (int (*)(const type *, const type *))cfn; \ + return cfn_conv((const type *)da, (const type *)db); \ + } \ + static ossl_inline void lh_##type##_doall_thunk(void *node, OPENSSL_LH_DOALL_FUNC doall) \ + { \ + void (*doall_conv)(type *) = (void (*)(type *))doall; \ + doall_conv((type *)node); \ + } \ + static ossl_inline void lh_##type##_doall_arg_thunk(void *node, void *arg, OPENSSL_LH_DOALL_FUNCARG doall) \ + { \ + void (*doall_conv)(type *, void *) = (void (*)(type *, void *))doall; \ + doall_conv((type *)node, arg); \ + } \ + static ossl_unused ossl_inline type * \ + ossl_check_##type##_lh_plain_type(type *ptr) \ + { \ + return ptr; \ + } \ + static ossl_unused ossl_inline const type * \ + ossl_check_const_##type##_lh_plain_type(const type *ptr) \ + { \ + return ptr; \ + } \ + static ossl_unused ossl_inline const OPENSSL_LHASH * \ + ossl_check_const_##type##_lh_type(const LHASH_OF(type) *lh) \ + { \ + return (const OPENSSL_LHASH *)lh; \ + } \ + static ossl_unused ossl_inline OPENSSL_LHASH * \ + ossl_check_##type##_lh_type(LHASH_OF(type) *lh) \ + { \ + return (OPENSSL_LHASH *)lh; \ + } \ + static ossl_unused ossl_inline OPENSSL_LH_COMPFUNC \ + ossl_check_##type##_lh_compfunc_type(lh_##type##_compfunc cmp) \ + { \ + return (OPENSSL_LH_COMPFUNC)cmp; \ + } \ + static ossl_unused ossl_inline OPENSSL_LH_HASHFUNC \ + ossl_check_##type##_lh_hashfunc_type(lh_##type##_hashfunc hfn) \ + { \ + return (OPENSSL_LH_HASHFUNC)hfn; \ + } \ + static ossl_unused ossl_inline OPENSSL_LH_DOALL_FUNC \ + ossl_check_##type##_lh_doallfunc_type(lh_##type##_doallfunc dfn) \ + { \ + return (OPENSSL_LH_DOALL_FUNC)dfn; \ + } \ + LHASH_OF(type) + +#ifndef OPENSSL_NO_DEPRECATED_3_1 +#define DEFINE_LHASH_OF_DEPRECATED(type) \ + static ossl_unused ossl_inline void \ + lh_##type##_node_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ + { \ + OPENSSL_LH_node_stats_bio((const OPENSSL_LHASH *)lh, out); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_node_usage_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ + { \ + OPENSSL_LH_node_usage_stats_bio((const OPENSSL_LHASH *)lh, out); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ + { \ + OPENSSL_LH_stats_bio((const OPENSSL_LHASH *)lh, out); \ + } +#else +#define DEFINE_LHASH_OF_DEPRECATED(type) +#endif + +#define DEFINE_LHASH_OF_EX(type) \ + LHASH_OF(type) \ + { \ + union lh_##type##_dummy { \ + void *d1; \ + unsigned long d2; \ + int d3; \ + } dummy; \ + }; \ + static unsigned long \ + lh_##type##_hfn_thunk(const void *data, OPENSSL_LH_HASHFUNC hfn) \ + { \ + unsigned long (*hfn_conv)(const type *) = (unsigned long (*)(const type *))hfn; \ + return hfn_conv((const type *)data); \ + } \ + static int lh_##type##_cfn_thunk(const void *da, const void *db, OPENSSL_LH_COMPFUNC cfn) \ + { \ + int (*cfn_conv)(const type *, const type *) = (int (*)(const type *, const type *))cfn; \ + return cfn_conv((const type *)da, (const type *)db); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_free(LHASH_OF(type) *lh) \ + { \ + OPENSSL_LH_free((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_flush(LHASH_OF(type) *lh) \ + { \ + OPENSSL_LH_flush((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline type * \ + lh_##type##_insert(LHASH_OF(type) *lh, type *d) \ + { \ + return (type *)OPENSSL_LH_insert((OPENSSL_LHASH *)lh, d); \ + } \ + static ossl_unused ossl_inline type * \ + lh_##type##_delete(LHASH_OF(type) *lh, const type *d) \ + { \ + return (type *)OPENSSL_LH_delete((OPENSSL_LHASH *)lh, d); \ + } \ + static ossl_unused ossl_inline type * \ + lh_##type##_retrieve(LHASH_OF(type) *lh, const type *d) \ + { \ + return (type *)OPENSSL_LH_retrieve((OPENSSL_LHASH *)lh, d); \ + } \ + static ossl_unused ossl_inline int \ + lh_##type##_error(LHASH_OF(type) *lh) \ + { \ + return OPENSSL_LH_error((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline unsigned long \ + lh_##type##_num_items(LHASH_OF(type) *lh) \ + { \ + return OPENSSL_LH_num_items((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline unsigned long \ + lh_##type##_get_down_load(LHASH_OF(type) *lh) \ + { \ + return OPENSSL_LH_get_down_load((OPENSSL_LHASH *)lh); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_set_down_load(LHASH_OF(type) *lh, unsigned long dl) \ + { \ + OPENSSL_LH_set_down_load((OPENSSL_LHASH *)lh, dl); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_doall_thunk(void *node, OPENSSL_LH_DOALL_FUNC doall) \ + { \ + void (*doall_conv)(type *) = (void (*)(type *))doall; \ + doall_conv((type *)node); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_doall_arg_thunk(void *node, void *arg, OPENSSL_LH_DOALL_FUNCARG doall) \ + { \ + void (*doall_conv)(type *, void *) = (void (*)(type *, void *))doall; \ + doall_conv((type *)node, arg); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_doall(LHASH_OF(type) *lh, void (*doall)(type *)) \ + { \ + OPENSSL_LH_doall((OPENSSL_LHASH *)lh, (OPENSSL_LH_DOALL_FUNC)doall); \ + } \ + static ossl_unused ossl_inline LHASH_OF(type) * \ + lh_##type##_new(unsigned long (*hfn)(const type *), \ + int (*cfn)(const type *, const type *)) \ + { \ + return (LHASH_OF(type) *)OPENSSL_LH_set_thunks(OPENSSL_LH_new((OPENSSL_LH_HASHFUNC)hfn, (OPENSSL_LH_COMPFUNC)cfn), \ + lh_##type##_hfn_thunk, lh_##type##_cfn_thunk, \ + lh_##type##_doall_thunk, \ + lh_##type##_doall_arg_thunk); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_doall_arg(LHASH_OF(type) *lh, \ + void (*doallarg)(type *, void *), void *arg) \ + { \ + OPENSSL_LH_doall_arg((OPENSSL_LHASH *)lh, \ + (OPENSSL_LH_DOALL_FUNCARG)doallarg, arg); \ + } \ + LHASH_OF(type) + +#define DEFINE_LHASH_OF(type) \ + DEFINE_LHASH_OF_EX(type); \ + DEFINE_LHASH_OF_DEPRECATED(type) \ + LHASH_OF(type) + +#define IMPLEMENT_LHASH_DOALL_ARG_CONST(type, argtype) \ + int_implement_lhash_doall(type, argtype, const type) + +#define IMPLEMENT_LHASH_DOALL_ARG(type, argtype) \ + int_implement_lhash_doall(type, argtype, type) + +#define int_implement_lhash_doall(type, argtype, cbargtype) \ + static ossl_unused ossl_inline void \ + lh_##type##_doall_##argtype##_thunk(void *node, void *arg, OPENSSL_LH_DOALL_FUNCARG fn) \ + { \ + void (*fn_conv)(cbargtype *, argtype *) = (void (*)(cbargtype *, argtype *))fn; \ + fn_conv((cbargtype *)node, (argtype *)arg); \ + } \ + static ossl_unused ossl_inline void \ + lh_##type##_doall_##argtype(LHASH_OF(type) *lh, \ + void (*fn)(cbargtype *, argtype *), \ + argtype *arg) \ + { \ + OPENSSL_LH_doall_arg_thunk((OPENSSL_LHASH *)lh, \ + lh_##type##_doall_##argtype##_thunk, \ + (OPENSSL_LH_DOALL_FUNCARG)fn, \ + (void *)arg); \ + } \ + LHASH_OF(type) + +/* clang-format off */ +DEFINE_LHASH_OF_INTERNAL(OPENSSL_STRING); +#define lh_OPENSSL_STRING_new(hfn, cmp) ((LHASH_OF(OPENSSL_STRING) *)OPENSSL_LH_set_thunks(OPENSSL_LH_new(ossl_check_OPENSSL_STRING_lh_hashfunc_type(hfn), ossl_check_OPENSSL_STRING_lh_compfunc_type(cmp)), lh_OPENSSL_STRING_hash_thunk, lh_OPENSSL_STRING_comp_thunk, lh_OPENSSL_STRING_doall_thunk, lh_OPENSSL_STRING_doall_arg_thunk)) +#define lh_OPENSSL_STRING_free(lh) OPENSSL_LH_free(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_flush(lh) OPENSSL_LH_flush(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_insert(lh, ptr) ((OPENSSL_STRING *)OPENSSL_LH_insert(ossl_check_OPENSSL_STRING_lh_type(lh), ossl_check_OPENSSL_STRING_lh_plain_type(ptr))) +#define lh_OPENSSL_STRING_delete(lh, ptr) ((OPENSSL_STRING *)OPENSSL_LH_delete(ossl_check_OPENSSL_STRING_lh_type(lh), ossl_check_const_OPENSSL_STRING_lh_plain_type(ptr))) +#define lh_OPENSSL_STRING_retrieve(lh, ptr) ((OPENSSL_STRING *)OPENSSL_LH_retrieve(ossl_check_OPENSSL_STRING_lh_type(lh), ossl_check_const_OPENSSL_STRING_lh_plain_type(ptr))) +#define lh_OPENSSL_STRING_error(lh) OPENSSL_LH_error(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_num_items(lh) OPENSSL_LH_num_items(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_node_stats_bio(lh, out) OPENSSL_LH_node_stats_bio(ossl_check_const_OPENSSL_STRING_lh_type(lh), out) +#define lh_OPENSSL_STRING_node_usage_stats_bio(lh, out) OPENSSL_LH_node_usage_stats_bio(ossl_check_const_OPENSSL_STRING_lh_type(lh), out) +#define lh_OPENSSL_STRING_stats_bio(lh, out) OPENSSL_LH_stats_bio(ossl_check_const_OPENSSL_STRING_lh_type(lh), out) +#define lh_OPENSSL_STRING_get_down_load(lh) OPENSSL_LH_get_down_load(ossl_check_OPENSSL_STRING_lh_type(lh)) +#define lh_OPENSSL_STRING_set_down_load(lh, dl) OPENSSL_LH_set_down_load(ossl_check_OPENSSL_STRING_lh_type(lh), dl) +#define lh_OPENSSL_STRING_doall(lh, dfn) OPENSSL_LH_doall(ossl_check_OPENSSL_STRING_lh_type(lh), ossl_check_OPENSSL_STRING_lh_doallfunc_type(dfn)) +DEFINE_LHASH_OF_INTERNAL(OPENSSL_CSTRING); +#define lh_OPENSSL_CSTRING_new(hfn, cmp) ((LHASH_OF(OPENSSL_CSTRING) *)OPENSSL_LH_set_thunks(OPENSSL_LH_new(ossl_check_OPENSSL_CSTRING_lh_hashfunc_type(hfn), ossl_check_OPENSSL_CSTRING_lh_compfunc_type(cmp)), lh_OPENSSL_CSTRING_hash_thunk, lh_OPENSSL_CSTRING_comp_thunk, lh_OPENSSL_CSTRING_doall_thunk, lh_OPENSSL_CSTRING_doall_arg_thunk)) +#define lh_OPENSSL_CSTRING_free(lh) OPENSSL_LH_free(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_flush(lh) OPENSSL_LH_flush(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_insert(lh, ptr) ((OPENSSL_CSTRING *)OPENSSL_LH_insert(ossl_check_OPENSSL_CSTRING_lh_type(lh), ossl_check_OPENSSL_CSTRING_lh_plain_type(ptr))) +#define lh_OPENSSL_CSTRING_delete(lh, ptr) ((OPENSSL_CSTRING *)OPENSSL_LH_delete(ossl_check_OPENSSL_CSTRING_lh_type(lh), ossl_check_const_OPENSSL_CSTRING_lh_plain_type(ptr))) +#define lh_OPENSSL_CSTRING_retrieve(lh, ptr) ((OPENSSL_CSTRING *)OPENSSL_LH_retrieve(ossl_check_OPENSSL_CSTRING_lh_type(lh), ossl_check_const_OPENSSL_CSTRING_lh_plain_type(ptr))) +#define lh_OPENSSL_CSTRING_error(lh) OPENSSL_LH_error(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_num_items(lh) OPENSSL_LH_num_items(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_node_stats_bio(lh, out) OPENSSL_LH_node_stats_bio(ossl_check_const_OPENSSL_CSTRING_lh_type(lh), out) +#define lh_OPENSSL_CSTRING_node_usage_stats_bio(lh, out) OPENSSL_LH_node_usage_stats_bio(ossl_check_const_OPENSSL_CSTRING_lh_type(lh), out) +#define lh_OPENSSL_CSTRING_stats_bio(lh, out) OPENSSL_LH_stats_bio(ossl_check_const_OPENSSL_CSTRING_lh_type(lh), out) +#define lh_OPENSSL_CSTRING_get_down_load(lh) OPENSSL_LH_get_down_load(ossl_check_OPENSSL_CSTRING_lh_type(lh)) +#define lh_OPENSSL_CSTRING_set_down_load(lh, dl) OPENSSL_LH_set_down_load(ossl_check_OPENSSL_CSTRING_lh_type(lh), dl) +#define lh_OPENSSL_CSTRING_doall(lh, dfn) OPENSSL_LH_doall(ossl_check_OPENSSL_CSTRING_lh_type(lh), ossl_check_OPENSSL_CSTRING_lh_doallfunc_type(dfn)) + +/* clang-format on */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ocsp.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ocsp.h new file mode 100644 index 000000000000..70a4f484d7e7 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ocsp.h @@ -0,0 +1,487 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/ocsp.h.in + * + * Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_OCSP_H +#define OPENSSL_OCSP_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_OCSP_H +#endif + +#include +#include +#include + +/* + * These definitions are outside the OPENSSL_NO_OCSP guard because although for + * historical reasons they have OCSP_* names, they can actually be used + * independently of OCSP. E.g. see RFC5280 + */ +/*- + * CRLReason ::= ENUMERATED { + * unspecified (0), + * keyCompromise (1), + * cACompromise (2), + * affiliationChanged (3), + * superseded (4), + * cessationOfOperation (5), + * certificateHold (6), + * -- value 7 is not used + * removeFromCRL (8), + * privilegeWithdrawn (9), + * aACompromise (10) } + */ +#define OCSP_REVOKED_STATUS_NOSTATUS -1 +#define OCSP_REVOKED_STATUS_UNSPECIFIED 0 +#define OCSP_REVOKED_STATUS_KEYCOMPROMISE 1 +#define OCSP_REVOKED_STATUS_CACOMPROMISE 2 +#define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED 3 +#define OCSP_REVOKED_STATUS_SUPERSEDED 4 +#define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION 5 +#define OCSP_REVOKED_STATUS_CERTIFICATEHOLD 6 +#define OCSP_REVOKED_STATUS_REMOVEFROMCRL 8 +#define OCSP_REVOKED_STATUS_PRIVILEGEWITHDRAWN 9 +#define OCSP_REVOKED_STATUS_AACOMPROMISE 10 + +#ifndef OPENSSL_NO_OCSP + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Various flags and values */ + +#define OCSP_DEFAULT_NONCE_LENGTH 16 + +#define OCSP_NOCERTS 0x1 +#define OCSP_NOINTERN 0x2 +#define OCSP_NOSIGS 0x4 +#define OCSP_NOCHAIN 0x8 +#define OCSP_NOVERIFY 0x10 +#define OCSP_NOEXPLICIT 0x20 +#define OCSP_NOCASIGN 0x40 +#define OCSP_NODELEGATED 0x80 +#define OCSP_NOCHECKS 0x100 +#define OCSP_TRUSTOTHER 0x200 +#define OCSP_RESPID_KEY 0x400 +#define OCSP_NOTIME 0x800 +#define OCSP_PARTIAL_CHAIN 0x1000 + +typedef struct ocsp_cert_id_st OCSP_CERTID; +typedef struct ocsp_one_request_st OCSP_ONEREQ; +typedef struct ocsp_req_info_st OCSP_REQINFO; +typedef struct ocsp_signature_st OCSP_SIGNATURE; +typedef struct ocsp_request_st OCSP_REQUEST; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OCSP_CERTID, OCSP_CERTID, OCSP_CERTID) +#define sk_OCSP_CERTID_num(sk) OPENSSL_sk_num(ossl_check_const_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_value(sk, idx) ((OCSP_CERTID *)OPENSSL_sk_value(ossl_check_const_OCSP_CERTID_sk_type(sk), (idx))) +#define sk_OCSP_CERTID_new(cmp) ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_new(ossl_check_OCSP_CERTID_compfunc_type(cmp))) +#define sk_OCSP_CERTID_new_null() ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_new_null()) +#define sk_OCSP_CERTID_new_reserve(cmp, n) ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_new_reserve(ossl_check_OCSP_CERTID_compfunc_type(cmp), (n))) +#define sk_OCSP_CERTID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OCSP_CERTID_sk_type(sk), (n)) +#define sk_OCSP_CERTID_free(sk) OPENSSL_sk_free(ossl_check_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_zero(sk) OPENSSL_sk_zero(ossl_check_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_delete(sk, i) ((OCSP_CERTID *)OPENSSL_sk_delete(ossl_check_OCSP_CERTID_sk_type(sk), (i))) +#define sk_OCSP_CERTID_delete_ptr(sk, ptr) ((OCSP_CERTID *)OPENSSL_sk_delete_ptr(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr))) +#define sk_OCSP_CERTID_push(sk, ptr) OPENSSL_sk_push(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr)) +#define sk_OCSP_CERTID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr)) +#define sk_OCSP_CERTID_pop(sk) ((OCSP_CERTID *)OPENSSL_sk_pop(ossl_check_OCSP_CERTID_sk_type(sk))) +#define sk_OCSP_CERTID_shift(sk) ((OCSP_CERTID *)OPENSSL_sk_shift(ossl_check_OCSP_CERTID_sk_type(sk))) +#define sk_OCSP_CERTID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OCSP_CERTID_sk_type(sk),ossl_check_OCSP_CERTID_freefunc_type(freefunc)) +#define sk_OCSP_CERTID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr), (idx)) +#define sk_OCSP_CERTID_set(sk, idx, ptr) ((OCSP_CERTID *)OPENSSL_sk_set(ossl_check_OCSP_CERTID_sk_type(sk), (idx), ossl_check_OCSP_CERTID_type(ptr))) +#define sk_OCSP_CERTID_find(sk, ptr) OPENSSL_sk_find(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr)) +#define sk_OCSP_CERTID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr)) +#define sk_OCSP_CERTID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_type(ptr), pnum) +#define sk_OCSP_CERTID_sort(sk) OPENSSL_sk_sort(ossl_check_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OCSP_CERTID_sk_type(sk)) +#define sk_OCSP_CERTID_dup(sk) ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_dup(ossl_check_const_OCSP_CERTID_sk_type(sk))) +#define sk_OCSP_CERTID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OCSP_CERTID) *)OPENSSL_sk_deep_copy(ossl_check_const_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_copyfunc_type(copyfunc), ossl_check_OCSP_CERTID_freefunc_type(freefunc))) +#define sk_OCSP_CERTID_set_cmp_func(sk, cmp) ((sk_OCSP_CERTID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OCSP_CERTID_sk_type(sk), ossl_check_OCSP_CERTID_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(OCSP_ONEREQ, OCSP_ONEREQ, OCSP_ONEREQ) +#define sk_OCSP_ONEREQ_num(sk) OPENSSL_sk_num(ossl_check_const_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_value(sk, idx) ((OCSP_ONEREQ *)OPENSSL_sk_value(ossl_check_const_OCSP_ONEREQ_sk_type(sk), (idx))) +#define sk_OCSP_ONEREQ_new(cmp) ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_new(ossl_check_OCSP_ONEREQ_compfunc_type(cmp))) +#define sk_OCSP_ONEREQ_new_null() ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_new_null()) +#define sk_OCSP_ONEREQ_new_reserve(cmp, n) ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_new_reserve(ossl_check_OCSP_ONEREQ_compfunc_type(cmp), (n))) +#define sk_OCSP_ONEREQ_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OCSP_ONEREQ_sk_type(sk), (n)) +#define sk_OCSP_ONEREQ_free(sk) OPENSSL_sk_free(ossl_check_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_zero(sk) OPENSSL_sk_zero(ossl_check_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_delete(sk, i) ((OCSP_ONEREQ *)OPENSSL_sk_delete(ossl_check_OCSP_ONEREQ_sk_type(sk), (i))) +#define sk_OCSP_ONEREQ_delete_ptr(sk, ptr) ((OCSP_ONEREQ *)OPENSSL_sk_delete_ptr(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr))) +#define sk_OCSP_ONEREQ_push(sk, ptr) OPENSSL_sk_push(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr)) +#define sk_OCSP_ONEREQ_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr)) +#define sk_OCSP_ONEREQ_pop(sk) ((OCSP_ONEREQ *)OPENSSL_sk_pop(ossl_check_OCSP_ONEREQ_sk_type(sk))) +#define sk_OCSP_ONEREQ_shift(sk) ((OCSP_ONEREQ *)OPENSSL_sk_shift(ossl_check_OCSP_ONEREQ_sk_type(sk))) +#define sk_OCSP_ONEREQ_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OCSP_ONEREQ_sk_type(sk),ossl_check_OCSP_ONEREQ_freefunc_type(freefunc)) +#define sk_OCSP_ONEREQ_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr), (idx)) +#define sk_OCSP_ONEREQ_set(sk, idx, ptr) ((OCSP_ONEREQ *)OPENSSL_sk_set(ossl_check_OCSP_ONEREQ_sk_type(sk), (idx), ossl_check_OCSP_ONEREQ_type(ptr))) +#define sk_OCSP_ONEREQ_find(sk, ptr) OPENSSL_sk_find(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr)) +#define sk_OCSP_ONEREQ_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr)) +#define sk_OCSP_ONEREQ_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_type(ptr), pnum) +#define sk_OCSP_ONEREQ_sort(sk) OPENSSL_sk_sort(ossl_check_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OCSP_ONEREQ_sk_type(sk)) +#define sk_OCSP_ONEREQ_dup(sk) ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_dup(ossl_check_const_OCSP_ONEREQ_sk_type(sk))) +#define sk_OCSP_ONEREQ_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OCSP_ONEREQ) *)OPENSSL_sk_deep_copy(ossl_check_const_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_copyfunc_type(copyfunc), ossl_check_OCSP_ONEREQ_freefunc_type(freefunc))) +#define sk_OCSP_ONEREQ_set_cmp_func(sk, cmp) ((sk_OCSP_ONEREQ_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OCSP_ONEREQ_sk_type(sk), ossl_check_OCSP_ONEREQ_compfunc_type(cmp))) + +/* clang-format on */ + +#define OCSP_RESPONSE_STATUS_SUCCESSFUL 0 +#define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST 1 +#define OCSP_RESPONSE_STATUS_INTERNALERROR 2 +#define OCSP_RESPONSE_STATUS_TRYLATER 3 +#define OCSP_RESPONSE_STATUS_SIGREQUIRED 5 +#define OCSP_RESPONSE_STATUS_UNAUTHORIZED 6 + +typedef struct ocsp_resp_bytes_st OCSP_RESPBYTES; + +#define V_OCSP_RESPID_NAME 0 +#define V_OCSP_RESPID_KEY 1 + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OCSP_RESPID, OCSP_RESPID, OCSP_RESPID) +#define sk_OCSP_RESPID_num(sk) OPENSSL_sk_num(ossl_check_const_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_value(sk, idx) ((OCSP_RESPID *)OPENSSL_sk_value(ossl_check_const_OCSP_RESPID_sk_type(sk), (idx))) +#define sk_OCSP_RESPID_new(cmp) ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_new(ossl_check_OCSP_RESPID_compfunc_type(cmp))) +#define sk_OCSP_RESPID_new_null() ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_new_null()) +#define sk_OCSP_RESPID_new_reserve(cmp, n) ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_new_reserve(ossl_check_OCSP_RESPID_compfunc_type(cmp), (n))) +#define sk_OCSP_RESPID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OCSP_RESPID_sk_type(sk), (n)) +#define sk_OCSP_RESPID_free(sk) OPENSSL_sk_free(ossl_check_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_zero(sk) OPENSSL_sk_zero(ossl_check_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_delete(sk, i) ((OCSP_RESPID *)OPENSSL_sk_delete(ossl_check_OCSP_RESPID_sk_type(sk), (i))) +#define sk_OCSP_RESPID_delete_ptr(sk, ptr) ((OCSP_RESPID *)OPENSSL_sk_delete_ptr(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr))) +#define sk_OCSP_RESPID_push(sk, ptr) OPENSSL_sk_push(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr)) +#define sk_OCSP_RESPID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr)) +#define sk_OCSP_RESPID_pop(sk) ((OCSP_RESPID *)OPENSSL_sk_pop(ossl_check_OCSP_RESPID_sk_type(sk))) +#define sk_OCSP_RESPID_shift(sk) ((OCSP_RESPID *)OPENSSL_sk_shift(ossl_check_OCSP_RESPID_sk_type(sk))) +#define sk_OCSP_RESPID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OCSP_RESPID_sk_type(sk),ossl_check_OCSP_RESPID_freefunc_type(freefunc)) +#define sk_OCSP_RESPID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr), (idx)) +#define sk_OCSP_RESPID_set(sk, idx, ptr) ((OCSP_RESPID *)OPENSSL_sk_set(ossl_check_OCSP_RESPID_sk_type(sk), (idx), ossl_check_OCSP_RESPID_type(ptr))) +#define sk_OCSP_RESPID_find(sk, ptr) OPENSSL_sk_find(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr)) +#define sk_OCSP_RESPID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr)) +#define sk_OCSP_RESPID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_type(ptr), pnum) +#define sk_OCSP_RESPID_sort(sk) OPENSSL_sk_sort(ossl_check_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OCSP_RESPID_sk_type(sk)) +#define sk_OCSP_RESPID_dup(sk) ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_dup(ossl_check_const_OCSP_RESPID_sk_type(sk))) +#define sk_OCSP_RESPID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OCSP_RESPID) *)OPENSSL_sk_deep_copy(ossl_check_const_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_copyfunc_type(copyfunc), ossl_check_OCSP_RESPID_freefunc_type(freefunc))) +#define sk_OCSP_RESPID_set_cmp_func(sk, cmp) ((sk_OCSP_RESPID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OCSP_RESPID_sk_type(sk), ossl_check_OCSP_RESPID_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct ocsp_revoked_info_st OCSP_REVOKEDINFO; + +#define V_OCSP_CERTSTATUS_GOOD 0 +#define V_OCSP_CERTSTATUS_REVOKED 1 +#define V_OCSP_CERTSTATUS_UNKNOWN 2 + +typedef struct ocsp_cert_status_st OCSP_CERTSTATUS; +typedef struct ocsp_single_response_st OCSP_SINGLERESP; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OCSP_SINGLERESP, OCSP_SINGLERESP, OCSP_SINGLERESP) +#define sk_OCSP_SINGLERESP_num(sk) OPENSSL_sk_num(ossl_check_const_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_value(sk, idx) ((OCSP_SINGLERESP *)OPENSSL_sk_value(ossl_check_const_OCSP_SINGLERESP_sk_type(sk), (idx))) +#define sk_OCSP_SINGLERESP_new(cmp) ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_new(ossl_check_OCSP_SINGLERESP_compfunc_type(cmp))) +#define sk_OCSP_SINGLERESP_new_null() ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_new_null()) +#define sk_OCSP_SINGLERESP_new_reserve(cmp, n) ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_new_reserve(ossl_check_OCSP_SINGLERESP_compfunc_type(cmp), (n))) +#define sk_OCSP_SINGLERESP_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OCSP_SINGLERESP_sk_type(sk), (n)) +#define sk_OCSP_SINGLERESP_free(sk) OPENSSL_sk_free(ossl_check_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_zero(sk) OPENSSL_sk_zero(ossl_check_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_delete(sk, i) ((OCSP_SINGLERESP *)OPENSSL_sk_delete(ossl_check_OCSP_SINGLERESP_sk_type(sk), (i))) +#define sk_OCSP_SINGLERESP_delete_ptr(sk, ptr) ((OCSP_SINGLERESP *)OPENSSL_sk_delete_ptr(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr))) +#define sk_OCSP_SINGLERESP_push(sk, ptr) OPENSSL_sk_push(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr)) +#define sk_OCSP_SINGLERESP_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr)) +#define sk_OCSP_SINGLERESP_pop(sk) ((OCSP_SINGLERESP *)OPENSSL_sk_pop(ossl_check_OCSP_SINGLERESP_sk_type(sk))) +#define sk_OCSP_SINGLERESP_shift(sk) ((OCSP_SINGLERESP *)OPENSSL_sk_shift(ossl_check_OCSP_SINGLERESP_sk_type(sk))) +#define sk_OCSP_SINGLERESP_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OCSP_SINGLERESP_sk_type(sk),ossl_check_OCSP_SINGLERESP_freefunc_type(freefunc)) +#define sk_OCSP_SINGLERESP_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr), (idx)) +#define sk_OCSP_SINGLERESP_set(sk, idx, ptr) ((OCSP_SINGLERESP *)OPENSSL_sk_set(ossl_check_OCSP_SINGLERESP_sk_type(sk), (idx), ossl_check_OCSP_SINGLERESP_type(ptr))) +#define sk_OCSP_SINGLERESP_find(sk, ptr) OPENSSL_sk_find(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr)) +#define sk_OCSP_SINGLERESP_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr)) +#define sk_OCSP_SINGLERESP_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_type(ptr), pnum) +#define sk_OCSP_SINGLERESP_sort(sk) OPENSSL_sk_sort(ossl_check_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OCSP_SINGLERESP_sk_type(sk)) +#define sk_OCSP_SINGLERESP_dup(sk) ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_dup(ossl_check_const_OCSP_SINGLERESP_sk_type(sk))) +#define sk_OCSP_SINGLERESP_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OCSP_SINGLERESP) *)OPENSSL_sk_deep_copy(ossl_check_const_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_copyfunc_type(copyfunc), ossl_check_OCSP_SINGLERESP_freefunc_type(freefunc))) +#define sk_OCSP_SINGLERESP_set_cmp_func(sk, cmp) ((sk_OCSP_SINGLERESP_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OCSP_SINGLERESP_sk_type(sk), ossl_check_OCSP_SINGLERESP_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct ocsp_response_data_st OCSP_RESPDATA; + +typedef struct ocsp_basic_response_st OCSP_BASICRESP; + +typedef struct ocsp_crl_id_st OCSP_CRLID; +typedef struct ocsp_service_locator_st OCSP_SERVICELOC; + +#define PEM_STRING_OCSP_REQUEST "OCSP REQUEST" +#define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE" + +#define d2i_OCSP_REQUEST_bio(bp, p) ASN1_d2i_bio_of(OCSP_REQUEST, OCSP_REQUEST_new, d2i_OCSP_REQUEST, bp, p) + +#define d2i_OCSP_RESPONSE_bio(bp, p) ASN1_d2i_bio_of(OCSP_RESPONSE, OCSP_RESPONSE_new, d2i_OCSP_RESPONSE, bp, p) + +#define PEM_read_bio_OCSP_REQUEST(bp, x, cb) (OCSP_REQUEST *)PEM_ASN1_read_bio( \ + (d2i_of_void *)d2i_OCSP_REQUEST, PEM_STRING_OCSP_REQUEST, \ + bp, (char **)(x), cb, NULL) + +#define PEM_read_bio_OCSP_RESPONSE(bp, x, cb) (OCSP_RESPONSE *)PEM_ASN1_read_bio( \ + (d2i_of_void *)d2i_OCSP_RESPONSE, PEM_STRING_OCSP_RESPONSE, \ + bp, (char **)(x), cb, NULL) + +#define PEM_write_bio_OCSP_REQUEST(bp, o) \ + PEM_ASN1_write_bio((i2d_of_void *)i2d_OCSP_REQUEST, PEM_STRING_OCSP_REQUEST, \ + bp, (char *)(o), NULL, NULL, 0, NULL, NULL) + +#define PEM_write_bio_OCSP_RESPONSE(bp, o) \ + PEM_ASN1_write_bio((i2d_of_void *)i2d_OCSP_RESPONSE, PEM_STRING_OCSP_RESPONSE, \ + bp, (char *)(o), NULL, NULL, 0, NULL, NULL) + +#define i2d_OCSP_RESPONSE_bio(bp, o) ASN1_i2d_bio_of(OCSP_RESPONSE, i2d_OCSP_RESPONSE, bp, o) + +#define i2d_OCSP_REQUEST_bio(bp, o) ASN1_i2d_bio_of(OCSP_REQUEST, i2d_OCSP_REQUEST, bp, o) + +#define ASN1_BIT_STRING_digest(data, type, md, len) \ + ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING), type, data, md, len) + +#define OCSP_CERTSTATUS_dup(cs) \ + (OCSP_CERTSTATUS *)ASN1_dup((i2d_of_void *)i2d_OCSP_CERTSTATUS, \ + (d2i_of_void *)d2i_OCSP_CERTSTATUS, (char *)(cs)) + +DECLARE_ASN1_DUP_FUNCTION(OCSP_CERTID) + +OSSL_HTTP_REQ_CTX *OCSP_sendreq_new(BIO *io, const char *path, + const OCSP_REQUEST *req, int buf_size); +OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, const char *path, OCSP_REQUEST *req); + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +typedef OSSL_HTTP_REQ_CTX OCSP_REQ_CTX; +#define OCSP_REQ_CTX_new(io, buf_size) \ + OSSL_HTTP_REQ_CTX_new(io, io, buf_size) +#define OCSP_REQ_CTX_free OSSL_HTTP_REQ_CTX_free +#define OCSP_REQ_CTX_http(rctx, op, path) \ + (OSSL_HTTP_REQ_CTX_set_expected(rctx, NULL, 1 /* asn1 */, 0, 0) && OSSL_HTTP_REQ_CTX_set_request_line(rctx, strcmp(op, "POST") == 0, NULL, NULL, path)) +#define OCSP_REQ_CTX_add1_header OSSL_HTTP_REQ_CTX_add1_header +#define OCSP_REQ_CTX_i2d(r, it, req) \ + OSSL_HTTP_REQ_CTX_set1_req(r, "application/ocsp-request", it, req) +#define OCSP_REQ_CTX_set1_req(r, req) \ + OCSP_REQ_CTX_i2d(r, ASN1_ITEM_rptr(OCSP_REQUEST), (ASN1_VALUE *)(req)) +#define OCSP_REQ_CTX_nbio OSSL_HTTP_REQ_CTX_nbio +#define OCSP_REQ_CTX_nbio_d2i OSSL_HTTP_REQ_CTX_nbio_d2i +#define OCSP_sendreq_nbio(p, r) \ + OSSL_HTTP_REQ_CTX_nbio_d2i(r, (ASN1_VALUE **)(p), \ + ASN1_ITEM_rptr(OCSP_RESPONSE)) +#define OCSP_REQ_CTX_get0_mem_bio OSSL_HTTP_REQ_CTX_get0_mem_bio +#define OCSP_set_max_response_length OSSL_HTTP_REQ_CTX_set_max_response_length +#endif + +OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, const X509 *subject, + const X509 *issuer); + +OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, + const X509_NAME *issuerName, + const ASN1_BIT_STRING *issuerKey, + const ASN1_INTEGER *serialNumber); + +OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid); + +int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len); +int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len); +int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs); +int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req); + +int OCSP_request_set1_name(OCSP_REQUEST *req, const X509_NAME *nm); +int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert); + +int OCSP_request_sign(OCSP_REQUEST *req, + X509 *signer, + EVP_PKEY *key, + const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); + +int OCSP_response_status(OCSP_RESPONSE *resp); +OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp); + +const ASN1_OCTET_STRING *OCSP_resp_get0_signature(const OCSP_BASICRESP *bs); +const X509_ALGOR *OCSP_resp_get0_tbs_sigalg(const OCSP_BASICRESP *bs); +const OCSP_RESPDATA *OCSP_resp_get0_respdata(const OCSP_BASICRESP *bs); +int OCSP_resp_get0_signer(OCSP_BASICRESP *bs, X509 **signer, + STACK_OF(X509) *extra_certs); + +int OCSP_resp_count(OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx); +const ASN1_GENERALIZEDTIME *OCSP_resp_get0_produced_at(const OCSP_BASICRESP *bs); +const STACK_OF(X509) *OCSP_resp_get0_certs(const OCSP_BASICRESP *bs); +int OCSP_resp_get0_id(const OCSP_BASICRESP *bs, + const ASN1_OCTET_STRING **pid, + const X509_NAME **pname); +int OCSP_resp_get1_id(const OCSP_BASICRESP *bs, + ASN1_OCTET_STRING **pid, + X509_NAME **pname); + +int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last); +int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status, + int *reason, + ASN1_GENERALIZEDTIME **revtime, + ASN1_GENERALIZEDTIME **thisupd, + ASN1_GENERALIZEDTIME **nextupd); +int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd, + ASN1_GENERALIZEDTIME *nextupd, long sec, long maxsec); + +int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, + X509_STORE *store, unsigned long flags); + +#define OCSP_parse_url(url, host, port, path, ssl) \ + OSSL_HTTP_parse_url(url, ssl, NULL, host, port, NULL, path, NULL, NULL) + +int OCSP_id_issuer_cmp(const OCSP_CERTID *a, const OCSP_CERTID *b); +int OCSP_id_cmp(const OCSP_CERTID *a, const OCSP_CERTID *b); + +int OCSP_request_onereq_count(OCSP_REQUEST *req); +OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i); +OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one); +int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd, + ASN1_OCTET_STRING **pikeyHash, + ASN1_INTEGER **pserial, OCSP_CERTID *cid); +int OCSP_request_is_signed(OCSP_REQUEST *req); +OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs); +OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp, + OCSP_CERTID *cid, + int status, int reason, + ASN1_TIME *revtime, + ASN1_TIME *thisupd, + ASN1_TIME *nextupd); +int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert); +int OCSP_basic_sign(OCSP_BASICRESP *brsp, + X509 *signer, EVP_PKEY *key, const EVP_MD *dgst, + STACK_OF(X509) *certs, unsigned long flags); +int OCSP_basic_sign_ctx(OCSP_BASICRESP *brsp, + X509 *signer, EVP_MD_CTX *ctx, + STACK_OF(X509) *certs, unsigned long flags); +int OCSP_RESPID_set_by_name(OCSP_RESPID *respid, X509 *cert); +int OCSP_RESPID_set_by_key_ex(OCSP_RESPID *respid, X509 *cert, + OSSL_LIB_CTX *libctx, const char *propq); +int OCSP_RESPID_set_by_key(OCSP_RESPID *respid, X509 *cert); +int OCSP_RESPID_match_ex(OCSP_RESPID *respid, X509 *cert, OSSL_LIB_CTX *libctx, + const char *propq); +int OCSP_RESPID_match(OCSP_RESPID *respid, X509 *cert); + +X509_EXTENSION *OCSP_crlID_new(const char *url, long *n, char *tim); + +X509_EXTENSION *OCSP_accept_responses_new(char **oids); + +X509_EXTENSION *OCSP_archive_cutoff_new(char *tim); + +X509_EXTENSION *OCSP_url_svcloc_new(const X509_NAME *issuer, const char **urls); + +int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x); +int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos); +int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, const ASN1_OBJECT *obj, + int lastpos); +int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos); +X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc); +X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc); +void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, + int *idx); +int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc); + +int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x); +int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos); +int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, const ASN1_OBJECT *obj, int lastpos); +int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos); +X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc); +X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc); +void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx); +int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit, + unsigned long flags); +int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc); + +int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x); +int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos); +int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, const ASN1_OBJECT *obj, + int lastpos); +int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc); +X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc); +void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, + int *idx); +int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc); + +int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x); +int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos); +int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, const ASN1_OBJECT *obj, + int lastpos); +int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, + int lastpos); +X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc); +X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc); +void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, + int *idx); +int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, + int crit, unsigned long flags); +int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc); +const OCSP_CERTID *OCSP_SINGLERESP_get0_id(const OCSP_SINGLERESP *x); + +DECLARE_ASN1_FUNCTIONS(OCSP_SINGLERESP) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTSTATUS) +DECLARE_ASN1_FUNCTIONS(OCSP_REVOKEDINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_BASICRESP) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPDATA) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPID) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPONSE) +DECLARE_ASN1_FUNCTIONS(OCSP_RESPBYTES) +DECLARE_ASN1_FUNCTIONS(OCSP_ONEREQ) +DECLARE_ASN1_FUNCTIONS(OCSP_CERTID) +DECLARE_ASN1_FUNCTIONS(OCSP_REQUEST) +DECLARE_ASN1_FUNCTIONS(OCSP_SIGNATURE) +DECLARE_ASN1_FUNCTIONS(OCSP_REQINFO) +DECLARE_ASN1_FUNCTIONS(OCSP_CRLID) +DECLARE_ASN1_FUNCTIONS(OCSP_SERVICELOC) + +const char *OCSP_response_status_str(long s); +const char *OCSP_cert_status_str(long s); +const char *OCSP_crl_reason_str(long s); + +int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST *a, unsigned long flags); +int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE *o, unsigned long flags); + +int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs, + X509_STORE *st, unsigned long flags); + +#ifdef __cplusplus +} +#endif +#endif /* !defined(OPENSSL_NO_OCSP) */ +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/opensslv.h new file mode 100644 index 000000000000..8e9329bcc0dd --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/opensslv.h @@ -0,0 +1,131 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/opensslv.h.in + * + * Copyright 1999-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef OPENSSL_OPENSSLV_H +#define OPENSSL_OPENSSLV_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * SECTION 1: VERSION DATA. These will change for each release + */ + +/* + * Base version macros + * + * These macros express version number MAJOR.MINOR.PATCH exactly + */ +/* clang-format off */ +# define OPENSSL_VERSION_MAJOR 3 +/* clang-format on */ +/* clang-format off */ +# define OPENSSL_VERSION_MINOR 5 +/* clang-format on */ +/* clang-format off */ +# define OPENSSL_VERSION_PATCH 7 +/* clang-format on */ + +/* + * Additional version information + * + * These are also part of the new version scheme, but aren't part + * of the version number itself. + */ + +/* Could be: #define OPENSSL_VERSION_PRE_RELEASE "-alpha.1" */ +/* clang-format off */ +# define OPENSSL_VERSION_PRE_RELEASE "" +/* clang-format on */ +/* Could be: #define OPENSSL_VERSION_BUILD_METADATA "+fips" */ +/* Could be: #define OPENSSL_VERSION_BUILD_METADATA "+vendor.1" */ +/* clang-format off */ +# define OPENSSL_VERSION_BUILD_METADATA "" +/* clang-format on */ + +/* + * Note: The OpenSSL Project will never define OPENSSL_VERSION_BUILD_METADATA + * to be anything but the empty string. Its use is entirely reserved for + * others + */ + +/* + * Shared library version + * + * This is strictly to express ABI version, which may or may not + * be related to the API version expressed with the macros above. + * This is defined in free form. + */ +/* clang-format off */ +# define OPENSSL_SHLIB_VERSION 3 +/* clang-format on */ + +/* + * SECTION 2: USEFUL MACROS + */ + +/* For checking general API compatibility when preprocessing */ +#define OPENSSL_VERSION_PREREQ(maj, min) \ + ((OPENSSL_VERSION_MAJOR << 16) + OPENSSL_VERSION_MINOR >= ((maj) << 16) + (min)) + +/* + * Macros to get the version in easily digested string form, both the short + * "MAJOR.MINOR.PATCH" variant (where MAJOR, MINOR and PATCH are replaced + * with the values from the corresponding OPENSSL_VERSION_ macros) and the + * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and + * OPENSSL_VERSION_BUILD_METADATA_STR appended. + */ +/* clang-format off */ +# define OPENSSL_VERSION_STR "3.5.7" +/* clang-format on */ +/* clang-format off */ +# define OPENSSL_FULL_VERSION_STR "3.5.7" +/* clang-format on */ + +/* + * SECTION 3: ADDITIONAL METADATA + * + * These strings are defined separately to allow them to be parsable. + */ +/* clang-format off */ +# define OPENSSL_RELEASE_DATE "9 Jun 2026" +/* clang-format on */ + +/* + * SECTION 4: BACKWARD COMPATIBILITY + */ + +/* clang-format off */ +# define OPENSSL_VERSION_TEXT "OpenSSL 3.5.7 9 Jun 2026" +/* clang-format on */ + +/* clang-format off */ +/* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PP0L */ +# define OPENSSL_VERSION_NUMBER \ + ( (OPENSSL_VERSION_MAJOR<<28) \ + |(OPENSSL_VERSION_MINOR<<20) \ + |(OPENSSL_VERSION_PATCH<<4) \ + |0x0L ) +/* clang-format on */ + +#ifdef __cplusplus +} +#endif + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_OPENSSLV_H +#endif + +#endif /* OPENSSL_OPENSSLV_H */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/pkcs12.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/pkcs12.h new file mode 100644 index 000000000000..f7e38ace03bc --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/pkcs12.h @@ -0,0 +1,370 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/pkcs12.h.in + * + * Copyright 1999-2024 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_PKCS12_H +#define OPENSSL_PKCS12_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_PKCS12_H +#endif + +#include +#include +#include +#include +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define PKCS12_KEY_ID 1 +#define PKCS12_IV_ID 2 +#define PKCS12_MAC_ID 3 + +/* Default iteration count */ +#ifndef PKCS12_DEFAULT_ITER +#define PKCS12_DEFAULT_ITER PKCS5_DEFAULT_ITER +#endif + +#define PKCS12_MAC_KEY_LENGTH 20 + +/* The macro is expected to be used only internally. Kept for backwards compatibility. */ +#define PKCS12_SALT_LEN 8 + +/* It's not clear if these are actually needed... */ +#define PKCS12_key_gen PKCS12_key_gen_utf8 +#define PKCS12_add_friendlyname PKCS12_add_friendlyname_utf8 + +/* MS key usage constants */ + +#define KEY_EX 0x10 +#define KEY_SIG 0x80 + +typedef struct PKCS12_MAC_DATA_st PKCS12_MAC_DATA; + +typedef struct PKCS12_st PKCS12; + +typedef struct PKCS12_SAFEBAG_st PKCS12_SAFEBAG; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(PKCS12_SAFEBAG, PKCS12_SAFEBAG, PKCS12_SAFEBAG) +#define sk_PKCS12_SAFEBAG_num(sk) OPENSSL_sk_num(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_value(sk, idx) ((PKCS12_SAFEBAG *)OPENSSL_sk_value(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk), (idx))) +#define sk_PKCS12_SAFEBAG_new(cmp) ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_new(ossl_check_PKCS12_SAFEBAG_compfunc_type(cmp))) +#define sk_PKCS12_SAFEBAG_new_null() ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_new_null()) +#define sk_PKCS12_SAFEBAG_new_reserve(cmp, n) ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_new_reserve(ossl_check_PKCS12_SAFEBAG_compfunc_type(cmp), (n))) +#define sk_PKCS12_SAFEBAG_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PKCS12_SAFEBAG_sk_type(sk), (n)) +#define sk_PKCS12_SAFEBAG_free(sk) OPENSSL_sk_free(ossl_check_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_zero(sk) OPENSSL_sk_zero(ossl_check_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_delete(sk, i) ((PKCS12_SAFEBAG *)OPENSSL_sk_delete(ossl_check_PKCS12_SAFEBAG_sk_type(sk), (i))) +#define sk_PKCS12_SAFEBAG_delete_ptr(sk, ptr) ((PKCS12_SAFEBAG *)OPENSSL_sk_delete_ptr(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr))) +#define sk_PKCS12_SAFEBAG_push(sk, ptr) OPENSSL_sk_push(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr)) +#define sk_PKCS12_SAFEBAG_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr)) +#define sk_PKCS12_SAFEBAG_pop(sk) ((PKCS12_SAFEBAG *)OPENSSL_sk_pop(ossl_check_PKCS12_SAFEBAG_sk_type(sk))) +#define sk_PKCS12_SAFEBAG_shift(sk) ((PKCS12_SAFEBAG *)OPENSSL_sk_shift(ossl_check_PKCS12_SAFEBAG_sk_type(sk))) +#define sk_PKCS12_SAFEBAG_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PKCS12_SAFEBAG_sk_type(sk),ossl_check_PKCS12_SAFEBAG_freefunc_type(freefunc)) +#define sk_PKCS12_SAFEBAG_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr), (idx)) +#define sk_PKCS12_SAFEBAG_set(sk, idx, ptr) ((PKCS12_SAFEBAG *)OPENSSL_sk_set(ossl_check_PKCS12_SAFEBAG_sk_type(sk), (idx), ossl_check_PKCS12_SAFEBAG_type(ptr))) +#define sk_PKCS12_SAFEBAG_find(sk, ptr) OPENSSL_sk_find(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr)) +#define sk_PKCS12_SAFEBAG_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr)) +#define sk_PKCS12_SAFEBAG_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_type(ptr), pnum) +#define sk_PKCS12_SAFEBAG_sort(sk) OPENSSL_sk_sort(ossl_check_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk)) +#define sk_PKCS12_SAFEBAG_dup(sk) ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_dup(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk))) +#define sk_PKCS12_SAFEBAG_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PKCS12_SAFEBAG) *)OPENSSL_sk_deep_copy(ossl_check_const_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_copyfunc_type(copyfunc), ossl_check_PKCS12_SAFEBAG_freefunc_type(freefunc))) +#define sk_PKCS12_SAFEBAG_set_cmp_func(sk, cmp) ((sk_PKCS12_SAFEBAG_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PKCS12_SAFEBAG_sk_type(sk), ossl_check_PKCS12_SAFEBAG_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct pkcs12_bag_st PKCS12_BAGS; + +#define PKCS12_ERROR 0 +#define PKCS12_OK 1 + +/* Compatibility macros */ + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 + +#define M_PKCS12_bag_type PKCS12_bag_type +#define M_PKCS12_cert_bag_type PKCS12_cert_bag_type +#define M_PKCS12_crl_bag_type PKCS12_cert_bag_type + +#define PKCS12_certbag2x509 PKCS12_SAFEBAG_get1_cert +#define PKCS12_certbag2scrl PKCS12_SAFEBAG_get1_crl +#define PKCS12_bag_type PKCS12_SAFEBAG_get_nid +#define PKCS12_cert_bag_type PKCS12_SAFEBAG_get_bag_nid +#define PKCS12_x5092certbag PKCS12_SAFEBAG_create_cert +#define PKCS12_x509crl2certbag PKCS12_SAFEBAG_create_crl +#define PKCS12_MAKE_KEYBAG PKCS12_SAFEBAG_create0_p8inf +#define PKCS12_MAKE_SHKEYBAG PKCS12_SAFEBAG_create_pkcs8_encrypt + +#endif +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 ASN1_TYPE *PKCS12_get_attr(const PKCS12_SAFEBAG *bag, + int attr_nid); +#endif + +ASN1_TYPE *PKCS8_get_attr(PKCS8_PRIV_KEY_INFO *p8, int attr_nid); +int PKCS12_mac_present(const PKCS12 *p12); +void PKCS12_get0_mac(const ASN1_OCTET_STRING **pmac, + const X509_ALGOR **pmacalg, + const ASN1_OCTET_STRING **psalt, + const ASN1_INTEGER **piter, + const PKCS12 *p12); + +const ASN1_TYPE *PKCS12_SAFEBAG_get0_attr(const PKCS12_SAFEBAG *bag, + int attr_nid); +const ASN1_OBJECT *PKCS12_SAFEBAG_get0_type(const PKCS12_SAFEBAG *bag); +int PKCS12_SAFEBAG_get_nid(const PKCS12_SAFEBAG *bag); +int PKCS12_SAFEBAG_get_bag_nid(const PKCS12_SAFEBAG *bag); +const ASN1_TYPE *PKCS12_SAFEBAG_get0_bag_obj(const PKCS12_SAFEBAG *bag); +const ASN1_OBJECT *PKCS12_SAFEBAG_get0_bag_type(const PKCS12_SAFEBAG *bag); + +X509 *PKCS12_SAFEBAG_get1_cert_ex(const PKCS12_SAFEBAG *bag, OSSL_LIB_CTX *libctx, const char *propq); +X509 *PKCS12_SAFEBAG_get1_cert(const PKCS12_SAFEBAG *bag); +X509_CRL *PKCS12_SAFEBAG_get1_crl_ex(const PKCS12_SAFEBAG *bag, OSSL_LIB_CTX *libctx, const char *propq); +X509_CRL *PKCS12_SAFEBAG_get1_crl(const PKCS12_SAFEBAG *bag); +const STACK_OF(PKCS12_SAFEBAG) * +PKCS12_SAFEBAG_get0_safes(const PKCS12_SAFEBAG *bag); +const PKCS8_PRIV_KEY_INFO *PKCS12_SAFEBAG_get0_p8inf(const PKCS12_SAFEBAG *bag); +const X509_SIG *PKCS12_SAFEBAG_get0_pkcs8(const PKCS12_SAFEBAG *bag); + +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_cert(X509 *x509); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_crl(X509_CRL *crl); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_secret(int type, int vtype, const unsigned char *value, int len); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_p8inf(PKCS8_PRIV_KEY_INFO *p8); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_pkcs8(X509_SIG *p8); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_pkcs8_encrypt(int pbe_nid, + const char *pass, + int passlen, + unsigned char *salt, + int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8inf); +PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_pkcs8_encrypt_ex(int pbe_nid, + const char *pass, + int passlen, + unsigned char *salt, + int saltlen, int iter, + PKCS8_PRIV_KEY_INFO *p8inf, + OSSL_LIB_CTX *ctx, + const char *propq); + +PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, + int nid1, int nid2); +PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(const X509_SIG *p8, const char *pass, + int passlen); +PKCS8_PRIV_KEY_INFO *PKCS8_decrypt_ex(const X509_SIG *p8, const char *pass, + int passlen, OSSL_LIB_CTX *ctx, + const char *propq); +PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(const PKCS12_SAFEBAG *bag, + const char *pass, int passlen); +PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey_ex(const PKCS12_SAFEBAG *bag, + const char *pass, int passlen, + OSSL_LIB_CTX *ctx, + const char *propq); +X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, + const char *pass, int passlen, unsigned char *salt, + int saltlen, int iter, PKCS8_PRIV_KEY_INFO *p8); +X509_SIG *PKCS8_encrypt_ex(int pbe_nid, const EVP_CIPHER *cipher, + const char *pass, int passlen, unsigned char *salt, + int saltlen, int iter, PKCS8_PRIV_KEY_INFO *p8, + OSSL_LIB_CTX *ctx, const char *propq); +X509_SIG *PKCS8_set0_pbe(const char *pass, int passlen, + PKCS8_PRIV_KEY_INFO *p8inf, X509_ALGOR *pbe); +X509_SIG *PKCS8_set0_pbe_ex(const char *pass, int passlen, + PKCS8_PRIV_KEY_INFO *p8inf, X509_ALGOR *pbe, + OSSL_LIB_CTX *ctx, const char *propq); +PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk); +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7); +PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + STACK_OF(PKCS12_SAFEBAG) *bags); +PKCS7 *PKCS12_pack_p7encdata_ex(int pbe_nid, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + STACK_OF(PKCS12_SAFEBAG) *bags, + OSSL_LIB_CTX *ctx, const char *propq); + +STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, + int passlen); + +int PKCS12_pack_authsafes(PKCS12 *p12, STACK_OF(PKCS7) *safes); +STACK_OF(PKCS7) *PKCS12_unpack_authsafes(const PKCS12 *p12); + +int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, + int namelen); +int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_friendlyname_utf8(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name, + int namelen); +int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag, + const unsigned char *name, int namelen); +int PKCS12_add1_attr_by_NID(PKCS12_SAFEBAG *bag, int nid, int type, + const unsigned char *bytes, int len); +int PKCS12_add1_attr_by_txt(PKCS12_SAFEBAG *bag, const char *attrname, int type, + const unsigned char *bytes, int len); +int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage); +ASN1_TYPE *PKCS12_get_attr_gen(const STACK_OF(X509_ATTRIBUTE) *attrs, + int attr_nid); +char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag); +const STACK_OF(X509_ATTRIBUTE) * +PKCS12_SAFEBAG_get0_attrs(const PKCS12_SAFEBAG *bag); +void PKCS12_SAFEBAG_set0_attrs(PKCS12_SAFEBAG *bag, STACK_OF(X509_ATTRIBUTE) *attrs); +unsigned char *PKCS12_pbe_crypt(const X509_ALGOR *algor, + const char *pass, int passlen, + const unsigned char *in, int inlen, + unsigned char **data, int *datalen, + int en_de); +unsigned char *PKCS12_pbe_crypt_ex(const X509_ALGOR *algor, + const char *pass, int passlen, + const unsigned char *in, int inlen, + unsigned char **data, int *datalen, + int en_de, OSSL_LIB_CTX *libctx, + const char *propq); +void *PKCS12_item_decrypt_d2i(const X509_ALGOR *algor, const ASN1_ITEM *it, + const char *pass, int passlen, + const ASN1_OCTET_STRING *oct, int zbuf); +void *PKCS12_item_decrypt_d2i_ex(const X509_ALGOR *algor, const ASN1_ITEM *it, + const char *pass, int passlen, + const ASN1_OCTET_STRING *oct, int zbuf, + OSSL_LIB_CTX *libctx, + const char *propq); +ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt(X509_ALGOR *algor, + const ASN1_ITEM *it, + const char *pass, int passlen, + void *obj, int zbuf); +ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt_ex(X509_ALGOR *algor, + const ASN1_ITEM *it, + const char *pass, int passlen, + void *obj, int zbuf, + OSSL_LIB_CTX *ctx, + const char *propq); +PKCS12 *PKCS12_init(int mode); +PKCS12 *PKCS12_init_ex(int mode, OSSL_LIB_CTX *ctx, const char *propq); + +int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_key_gen_asc_ex(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type, + OSSL_LIB_CTX *ctx, const char *propq); +int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_key_gen_uni_ex(unsigned char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type, + OSSL_LIB_CTX *ctx, const char *propq); +int PKCS12_key_gen_utf8(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type); +int PKCS12_key_gen_utf8_ex(const char *pass, int passlen, unsigned char *salt, + int saltlen, int id, int iter, int n, + unsigned char *out, const EVP_MD *md_type, + OSSL_LIB_CTX *ctx, const char *propq); + +int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md_type, int en_de); +int PKCS12_PBE_keyivgen_ex(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, + ASN1_TYPE *param, const EVP_CIPHER *cipher, + const EVP_MD *md_type, int en_de, + OSSL_LIB_CTX *libctx, const char *propq); +int PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *mac, unsigned int *maclen); +int PKCS12_verify_mac(PKCS12 *p12, const char *pass, int passlen); +int PKCS12_set_mac(PKCS12 *p12, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + const EVP_MD *md_type); +int PKCS12_set_pbmac1_pbkdf2(PKCS12 *p12, const char *pass, int passlen, + unsigned char *salt, int saltlen, int iter, + const EVP_MD *md_type, const char *prf_md_name); +int PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt, + int saltlen, const EVP_MD *md_type); +unsigned char *OPENSSL_asc2uni(const char *asc, int asclen, + unsigned char **uni, int *unilen); +char *OPENSSL_uni2asc(const unsigned char *uni, int unilen); +unsigned char *OPENSSL_utf82uni(const char *asc, int asclen, + unsigned char **uni, int *unilen); +char *OPENSSL_uni2utf8(const unsigned char *uni, int unilen); + +DECLARE_ASN1_FUNCTIONS(PKCS12) +DECLARE_ASN1_FUNCTIONS(PKCS12_MAC_DATA) +DECLARE_ASN1_FUNCTIONS(PKCS12_SAFEBAG) +DECLARE_ASN1_FUNCTIONS(PKCS12_BAGS) + +DECLARE_ASN1_ITEM(PKCS12_SAFEBAGS) +DECLARE_ASN1_ITEM(PKCS12_AUTHSAFES) + +void PKCS12_PBE_add(void); +int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, + STACK_OF(X509) **ca); +typedef int PKCS12_create_cb(PKCS12_SAFEBAG *bag, void *cbarg); +PKCS12 *PKCS12_create(const char *pass, const char *name, EVP_PKEY *pkey, + X509 *cert, STACK_OF(X509) *ca, int nid_key, int nid_cert, + int iter, int mac_iter, int keytype); +PKCS12 *PKCS12_create_ex(const char *pass, const char *name, EVP_PKEY *pkey, + X509 *cert, STACK_OF(X509) *ca, int nid_key, int nid_cert, + int iter, int mac_iter, int keytype, + OSSL_LIB_CTX *ctx, const char *propq); +PKCS12 *PKCS12_create_ex2(const char *pass, const char *name, EVP_PKEY *pkey, + X509 *cert, STACK_OF(X509) *ca, int nid_key, int nid_cert, + int iter, int mac_iter, int keytype, + OSSL_LIB_CTX *ctx, const char *propq, + PKCS12_create_cb *cb, void *cbarg); + +PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert); +PKCS12_SAFEBAG *PKCS12_add_key(STACK_OF(PKCS12_SAFEBAG) **pbags, + EVP_PKEY *key, int key_usage, int iter, + int key_nid, const char *pass); +PKCS12_SAFEBAG *PKCS12_add_key_ex(STACK_OF(PKCS12_SAFEBAG) **pbags, + EVP_PKEY *key, int key_usage, int iter, + int key_nid, const char *pass, + OSSL_LIB_CTX *ctx, const char *propq); + +PKCS12_SAFEBAG *PKCS12_add_secret(STACK_OF(PKCS12_SAFEBAG) **pbags, + int nid_type, const unsigned char *value, int len); +int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags, + int safe_nid, int iter, const char *pass); +int PKCS12_add_safe_ex(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags, + int safe_nid, int iter, const char *pass, + OSSL_LIB_CTX *ctx, const char *propq); + +PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int p7_nid); +PKCS12 *PKCS12_add_safes_ex(STACK_OF(PKCS7) *safes, int p7_nid, + OSSL_LIB_CTX *ctx, const char *propq); + +int i2d_PKCS12_bio(BIO *bp, const PKCS12 *p12); +#ifndef OPENSSL_NO_STDIO +int i2d_PKCS12_fp(FILE *fp, const PKCS12 *p12); +#endif +PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12); +#ifndef OPENSSL_NO_STDIO +PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12); +#endif +int PKCS12_newpass(PKCS12 *p12, const char *oldpass, const char *newpass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/pkcs7.h new file mode 100644 index 000000000000..b6ab21e8b423 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/pkcs7.h @@ -0,0 +1,435 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/pkcs7.h.in + * + * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_PKCS7_H +#define OPENSSL_PKCS7_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_PKCS7_H +#endif + +#include +#include +#include + +#include +#include +#include +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/*- +Encryption_ID DES-CBC +Digest_ID MD5 +Digest_Encryption_ID rsaEncryption +Key_Encryption_ID rsaEncryption +*/ + +typedef struct PKCS7_CTX_st { + OSSL_LIB_CTX *libctx; + char *propq; +} PKCS7_CTX; + +typedef struct pkcs7_issuer_and_serial_st { + X509_NAME *issuer; + ASN1_INTEGER *serial; +} PKCS7_ISSUER_AND_SERIAL; + +typedef struct pkcs7_signer_info_st { + ASN1_INTEGER *version; /* version 1 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *digest_alg; + STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */ + X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */ + ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */ + STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */ + /* The private key to sign with */ + EVP_PKEY *pkey; + const PKCS7_CTX *ctx; +} PKCS7_SIGNER_INFO; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(PKCS7_SIGNER_INFO, PKCS7_SIGNER_INFO, PKCS7_SIGNER_INFO) +#define sk_PKCS7_SIGNER_INFO_num(sk) OPENSSL_sk_num(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_value(sk, idx) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_value(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk), (idx))) +#define sk_PKCS7_SIGNER_INFO_new(cmp) ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_new(ossl_check_PKCS7_SIGNER_INFO_compfunc_type(cmp))) +#define sk_PKCS7_SIGNER_INFO_new_null() ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_new_null()) +#define sk_PKCS7_SIGNER_INFO_new_reserve(cmp, n) ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_new_reserve(ossl_check_PKCS7_SIGNER_INFO_compfunc_type(cmp), (n))) +#define sk_PKCS7_SIGNER_INFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), (n)) +#define sk_PKCS7_SIGNER_INFO_free(sk) OPENSSL_sk_free(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_zero(sk) OPENSSL_sk_zero(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_delete(sk, i) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_delete(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), (i))) +#define sk_PKCS7_SIGNER_INFO_delete_ptr(sk, ptr) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_delete_ptr(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr))) +#define sk_PKCS7_SIGNER_INFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr)) +#define sk_PKCS7_SIGNER_INFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr)) +#define sk_PKCS7_SIGNER_INFO_pop(sk) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_pop(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk))) +#define sk_PKCS7_SIGNER_INFO_shift(sk) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_shift(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk))) +#define sk_PKCS7_SIGNER_INFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk),ossl_check_PKCS7_SIGNER_INFO_freefunc_type(freefunc)) +#define sk_PKCS7_SIGNER_INFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr), (idx)) +#define sk_PKCS7_SIGNER_INFO_set(sk, idx, ptr) ((PKCS7_SIGNER_INFO *)OPENSSL_sk_set(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), (idx), ossl_check_PKCS7_SIGNER_INFO_type(ptr))) +#define sk_PKCS7_SIGNER_INFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr)) +#define sk_PKCS7_SIGNER_INFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr)) +#define sk_PKCS7_SIGNER_INFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_type(ptr), pnum) +#define sk_PKCS7_SIGNER_INFO_sort(sk) OPENSSL_sk_sort(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk)) +#define sk_PKCS7_SIGNER_INFO_dup(sk) ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_dup(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk))) +#define sk_PKCS7_SIGNER_INFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PKCS7_SIGNER_INFO) *)OPENSSL_sk_deep_copy(ossl_check_const_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_copyfunc_type(copyfunc), ossl_check_PKCS7_SIGNER_INFO_freefunc_type(freefunc))) +#define sk_PKCS7_SIGNER_INFO_set_cmp_func(sk, cmp) ((sk_PKCS7_SIGNER_INFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PKCS7_SIGNER_INFO_sk_type(sk), ossl_check_PKCS7_SIGNER_INFO_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct pkcs7_recip_info_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; + X509_ALGOR *key_enc_algor; + ASN1_OCTET_STRING *enc_key; + X509 *cert; /* get the pub-key from this */ + const PKCS7_CTX *ctx; +} PKCS7_RECIP_INFO; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(PKCS7_RECIP_INFO, PKCS7_RECIP_INFO, PKCS7_RECIP_INFO) +#define sk_PKCS7_RECIP_INFO_num(sk) OPENSSL_sk_num(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_value(sk, idx) ((PKCS7_RECIP_INFO *)OPENSSL_sk_value(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk), (idx))) +#define sk_PKCS7_RECIP_INFO_new(cmp) ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_new(ossl_check_PKCS7_RECIP_INFO_compfunc_type(cmp))) +#define sk_PKCS7_RECIP_INFO_new_null() ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_new_null()) +#define sk_PKCS7_RECIP_INFO_new_reserve(cmp, n) ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_new_reserve(ossl_check_PKCS7_RECIP_INFO_compfunc_type(cmp), (n))) +#define sk_PKCS7_RECIP_INFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), (n)) +#define sk_PKCS7_RECIP_INFO_free(sk) OPENSSL_sk_free(ossl_check_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_zero(sk) OPENSSL_sk_zero(ossl_check_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_delete(sk, i) ((PKCS7_RECIP_INFO *)OPENSSL_sk_delete(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), (i))) +#define sk_PKCS7_RECIP_INFO_delete_ptr(sk, ptr) ((PKCS7_RECIP_INFO *)OPENSSL_sk_delete_ptr(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr))) +#define sk_PKCS7_RECIP_INFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr)) +#define sk_PKCS7_RECIP_INFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr)) +#define sk_PKCS7_RECIP_INFO_pop(sk) ((PKCS7_RECIP_INFO *)OPENSSL_sk_pop(ossl_check_PKCS7_RECIP_INFO_sk_type(sk))) +#define sk_PKCS7_RECIP_INFO_shift(sk) ((PKCS7_RECIP_INFO *)OPENSSL_sk_shift(ossl_check_PKCS7_RECIP_INFO_sk_type(sk))) +#define sk_PKCS7_RECIP_INFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PKCS7_RECIP_INFO_sk_type(sk),ossl_check_PKCS7_RECIP_INFO_freefunc_type(freefunc)) +#define sk_PKCS7_RECIP_INFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr), (idx)) +#define sk_PKCS7_RECIP_INFO_set(sk, idx, ptr) ((PKCS7_RECIP_INFO *)OPENSSL_sk_set(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), (idx), ossl_check_PKCS7_RECIP_INFO_type(ptr))) +#define sk_PKCS7_RECIP_INFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr)) +#define sk_PKCS7_RECIP_INFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr)) +#define sk_PKCS7_RECIP_INFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_type(ptr), pnum) +#define sk_PKCS7_RECIP_INFO_sort(sk) OPENSSL_sk_sort(ossl_check_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk)) +#define sk_PKCS7_RECIP_INFO_dup(sk) ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_dup(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk))) +#define sk_PKCS7_RECIP_INFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PKCS7_RECIP_INFO) *)OPENSSL_sk_deep_copy(ossl_check_const_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_copyfunc_type(copyfunc), ossl_check_PKCS7_RECIP_INFO_freefunc_type(freefunc))) +#define sk_PKCS7_RECIP_INFO_set_cmp_func(sk, cmp) ((sk_PKCS7_RECIP_INFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PKCS7_RECIP_INFO_sk_type(sk), ossl_check_PKCS7_RECIP_INFO_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct pkcs7_signed_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ /* name should be 'certificates' */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ /* name should be 'crls' */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + struct pkcs7_st *contents; +} PKCS7_SIGNED; +/* + * The above structure is very very similar to PKCS7_SIGN_ENVELOPE. How about + * merging the two + */ + +typedef struct pkcs7_enc_content_st { + ASN1_OBJECT *content_type; + X509_ALGOR *algorithm; + ASN1_OCTET_STRING *enc_data; /* [ 0 ] */ + const EVP_CIPHER *cipher; + const PKCS7_CTX *ctx; +} PKCS7_ENC_CONTENT; + +typedef struct pkcs7_enveloped_st { + ASN1_INTEGER *version; /* version 0 */ + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENVELOPE; + +typedef struct pkcs7_signedandenveloped_st { + ASN1_INTEGER *version; /* version 1 */ + STACK_OF(X509_ALGOR) *md_algs; /* md used */ + STACK_OF(X509) *cert; /* [ 0 ] */ /* name should be 'certificates' */ + STACK_OF(X509_CRL) *crl; /* [ 1 ] */ /* name should be 'crls' */ + STACK_OF(PKCS7_SIGNER_INFO) *signer_info; + PKCS7_ENC_CONTENT *enc_data; + STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; +} PKCS7_SIGN_ENVELOPE; + +typedef struct pkcs7_digest_st { + ASN1_INTEGER *version; /* version 0 */ + X509_ALGOR *md; /* md used */ + struct pkcs7_st *contents; + ASN1_OCTET_STRING *digest; +} PKCS7_DIGEST; + +typedef struct pkcs7_encrypted_st { + ASN1_INTEGER *version; /* version 0 */ + PKCS7_ENC_CONTENT *enc_data; +} PKCS7_ENCRYPT; + +typedef struct pkcs7_st { + /* + * The following is non NULL if it contains ASN1 encoding of this + * structure + */ + unsigned char *asn1; + long length; +#define PKCS7_S_HEADER 0 +#define PKCS7_S_BODY 1 +#define PKCS7_S_TAIL 2 + int state; /* used during processing */ + int detached; + ASN1_OBJECT *type; + /* content as defined by the type */ + /* + * all encryption/message digests are applied to the 'contents', leaving + * out the 'type' field. + */ + union { + char *ptr; + /* NID_pkcs7_data */ + ASN1_OCTET_STRING *data; + /* NID_pkcs7_signed */ + PKCS7_SIGNED *sign; /* field name 'signed' would clash with C keyword */ + /* NID_pkcs7_enveloped */ + PKCS7_ENVELOPE *enveloped; + /* NID_pkcs7_signedAndEnveloped */ + PKCS7_SIGN_ENVELOPE *signed_and_enveloped; + /* NID_pkcs7_digest */ + PKCS7_DIGEST *digest; + /* NID_pkcs7_encrypted */ + PKCS7_ENCRYPT *encrypted; + /* Anything else */ + ASN1_TYPE *other; + } d; + PKCS7_CTX ctx; +} PKCS7; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(PKCS7, PKCS7, PKCS7) +#define sk_PKCS7_num(sk) OPENSSL_sk_num(ossl_check_const_PKCS7_sk_type(sk)) +#define sk_PKCS7_value(sk, idx) ((PKCS7 *)OPENSSL_sk_value(ossl_check_const_PKCS7_sk_type(sk), (idx))) +#define sk_PKCS7_new(cmp) ((STACK_OF(PKCS7) *)OPENSSL_sk_new(ossl_check_PKCS7_compfunc_type(cmp))) +#define sk_PKCS7_new_null() ((STACK_OF(PKCS7) *)OPENSSL_sk_new_null()) +#define sk_PKCS7_new_reserve(cmp, n) ((STACK_OF(PKCS7) *)OPENSSL_sk_new_reserve(ossl_check_PKCS7_compfunc_type(cmp), (n))) +#define sk_PKCS7_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PKCS7_sk_type(sk), (n)) +#define sk_PKCS7_free(sk) OPENSSL_sk_free(ossl_check_PKCS7_sk_type(sk)) +#define sk_PKCS7_zero(sk) OPENSSL_sk_zero(ossl_check_PKCS7_sk_type(sk)) +#define sk_PKCS7_delete(sk, i) ((PKCS7 *)OPENSSL_sk_delete(ossl_check_PKCS7_sk_type(sk), (i))) +#define sk_PKCS7_delete_ptr(sk, ptr) ((PKCS7 *)OPENSSL_sk_delete_ptr(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr))) +#define sk_PKCS7_push(sk, ptr) OPENSSL_sk_push(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr)) +#define sk_PKCS7_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr)) +#define sk_PKCS7_pop(sk) ((PKCS7 *)OPENSSL_sk_pop(ossl_check_PKCS7_sk_type(sk))) +#define sk_PKCS7_shift(sk) ((PKCS7 *)OPENSSL_sk_shift(ossl_check_PKCS7_sk_type(sk))) +#define sk_PKCS7_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PKCS7_sk_type(sk),ossl_check_PKCS7_freefunc_type(freefunc)) +#define sk_PKCS7_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr), (idx)) +#define sk_PKCS7_set(sk, idx, ptr) ((PKCS7 *)OPENSSL_sk_set(ossl_check_PKCS7_sk_type(sk), (idx), ossl_check_PKCS7_type(ptr))) +#define sk_PKCS7_find(sk, ptr) OPENSSL_sk_find(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr)) +#define sk_PKCS7_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr)) +#define sk_PKCS7_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_type(ptr), pnum) +#define sk_PKCS7_sort(sk) OPENSSL_sk_sort(ossl_check_PKCS7_sk_type(sk)) +#define sk_PKCS7_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PKCS7_sk_type(sk)) +#define sk_PKCS7_dup(sk) ((STACK_OF(PKCS7) *)OPENSSL_sk_dup(ossl_check_const_PKCS7_sk_type(sk))) +#define sk_PKCS7_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PKCS7) *)OPENSSL_sk_deep_copy(ossl_check_const_PKCS7_sk_type(sk), ossl_check_PKCS7_copyfunc_type(copyfunc), ossl_check_PKCS7_freefunc_type(freefunc))) +#define sk_PKCS7_set_cmp_func(sk, cmp) ((sk_PKCS7_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PKCS7_sk_type(sk), ossl_check_PKCS7_compfunc_type(cmp))) + +/* clang-format on */ + +#define PKCS7_OP_SET_DETACHED_SIGNATURE 1 +#define PKCS7_OP_GET_DETACHED_SIGNATURE 2 + +#define PKCS7_get_signed_attributes(si) ((si)->auth_attr) +#define PKCS7_get_attributes(si) ((si)->unauth_attr) + +#define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed) +#define PKCS7_type_is_encrypted(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) +#define PKCS7_type_is_enveloped(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_enveloped) +#define PKCS7_type_is_signedAndEnveloped(a) \ + (OBJ_obj2nid((a)->type) == NID_pkcs7_signedAndEnveloped) +#define PKCS7_type_is_data(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_data) +#define PKCS7_type_is_digest(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_digest) + +#define PKCS7_set_detached(p, v) \ + PKCS7_ctrl(p, PKCS7_OP_SET_DETACHED_SIGNATURE, v, NULL) +#define PKCS7_get_detached(p) \ + PKCS7_ctrl(p, PKCS7_OP_GET_DETACHED_SIGNATURE, 0, NULL) + +#define PKCS7_is_detached(p7) (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7)) + +/* S/MIME related flags */ + +#define PKCS7_TEXT 0x1 +#define PKCS7_NOCERTS 0x2 +#define PKCS7_NOSIGS 0x4 +#define PKCS7_NOCHAIN 0x8 +#define PKCS7_NOINTERN 0x10 +#define PKCS7_NOVERIFY 0x20 +#define PKCS7_DETACHED 0x40 +#define PKCS7_BINARY 0x80 +#define PKCS7_NOATTR 0x100 +#define PKCS7_NOSMIMECAP 0x200 +#define PKCS7_NOOLDMIMETYPE 0x400 +#define PKCS7_CRLFEOL 0x800 +#define PKCS7_STREAM 0x1000 +#define PKCS7_NOCRL 0x2000 +#define PKCS7_PARTIAL 0x4000 +#define PKCS7_REUSE_DIGEST 0x8000 +#define PKCS7_NO_DUAL_CONTENT 0x10000 + +/* Flags: for compatibility with older code */ + +#define SMIME_TEXT PKCS7_TEXT +#define SMIME_NOCERTS PKCS7_NOCERTS +#define SMIME_NOSIGS PKCS7_NOSIGS +#define SMIME_NOCHAIN PKCS7_NOCHAIN +#define SMIME_NOINTERN PKCS7_NOINTERN +#define SMIME_NOVERIFY PKCS7_NOVERIFY +#define SMIME_DETACHED PKCS7_DETACHED +#define SMIME_BINARY PKCS7_BINARY +#define SMIME_NOATTR PKCS7_NOATTR + +/* CRLF ASCII canonicalisation */ +#define SMIME_ASCIICRLF 0x80000 + +DECLARE_ASN1_FUNCTIONS(PKCS7_ISSUER_AND_SERIAL) + +int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data, + const EVP_MD *type, unsigned char *md, + unsigned int *len); +#ifndef OPENSSL_NO_STDIO +PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7); +int i2d_PKCS7_fp(FILE *fp, const PKCS7 *p7); +#endif +DECLARE_ASN1_DUP_FUNCTION(PKCS7) +PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7); +int i2d_PKCS7_bio(BIO *bp, const PKCS7 *p7); +int i2d_PKCS7_bio_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); +int PEM_write_bio_PKCS7_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); + +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNER_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_RECIP_INFO) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNED) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENC_CONTENT) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_SIGN_ENVELOPE) +DECLARE_ASN1_FUNCTIONS(PKCS7_DIGEST) +DECLARE_ASN1_FUNCTIONS(PKCS7_ENCRYPT) +DECLARE_ASN1_FUNCTIONS(PKCS7) +PKCS7 *PKCS7_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +DECLARE_ASN1_ITEM(PKCS7_ATTR_SIGN) +DECLARE_ASN1_ITEM(PKCS7_ATTR_VERIFY) + +DECLARE_ASN1_NDEF_FUNCTION(PKCS7) +DECLARE_ASN1_PRINT_FUNCTION(PKCS7) + +long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg); + +int PKCS7_type_is_other(PKCS7 *p7); +int PKCS7_set_type(PKCS7 *p7, int type); +int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other); +int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data); +int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, + const EVP_MD *dgst); +int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_INFO *si); +int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i); +int PKCS7_add_certificate(PKCS7 *p7, X509 *cert); +int PKCS7_add_crl(PKCS7 *p7, X509_CRL *crl); +int PKCS7_content_new(PKCS7 *p7, int nid); +int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, + BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si, + X509 *signer); + +BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio); +int PKCS7_dataFinal(PKCS7 *p7, BIO *bio); +BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert); + +PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, + EVP_PKEY *pkey, const EVP_MD *dgst); +X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si); +int PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md); +STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7); + +PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509); +void PKCS7_SIGNER_INFO_get0_algs(PKCS7_SIGNER_INFO *si, EVP_PKEY **pk, + X509_ALGOR **pdig, X509_ALGOR **psig); +void PKCS7_RECIP_INFO_get0_alg(PKCS7_RECIP_INFO *ri, X509_ALGOR **penc); +int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri); +int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509); +int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher); +int PKCS7_stream(unsigned char ***boundary, PKCS7 *p7); + +PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx); +ASN1_OCTET_STRING *PKCS7_get_octet_string(PKCS7 *p7); +ASN1_OCTET_STRING *PKCS7_digest_from_attributes(STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int type, + void *data); +int PKCS7_add_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int atrtype, + void *value); +ASN1_TYPE *PKCS7_get_attribute(const PKCS7_SIGNER_INFO *si, int nid); +ASN1_TYPE *PKCS7_get_signed_attribute(const PKCS7_SIGNER_INFO *si, int nid); +int PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); +int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si, + STACK_OF(X509_ATTRIBUTE) *sk); + +PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, + BIO *data, int flags); +PKCS7 *PKCS7_sign_ex(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, + BIO *data, int flags, OSSL_LIB_CTX *libctx, + const char *propq); + +PKCS7_SIGNER_INFO *PKCS7_sign_add_signer(PKCS7 *p7, + X509 *signcert, EVP_PKEY *pkey, + const EVP_MD *md, int flags); + +int PKCS7_final(PKCS7 *p7, BIO *data, int flags); +int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, + BIO *indata, BIO *out, int flags); +STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, + int flags); +PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, + int flags); +PKCS7 *PKCS7_encrypt_ex(STACK_OF(X509) *certs, BIO *in, + const EVP_CIPHER *cipher, int flags, + OSSL_LIB_CTX *libctx, const char *propq); +int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, + int flags); + +int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, + STACK_OF(X509_ALGOR) *cap); +STACK_OF(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO *si); +int PKCS7_simple_smimecap(STACK_OF(X509_ALGOR) *sk, int nid, int arg); + +int PKCS7_add_attrib_content_type(PKCS7_SIGNER_INFO *si, ASN1_OBJECT *coid); +int PKCS7_add0_attrib_signing_time(PKCS7_SIGNER_INFO *si, ASN1_TIME *t); +int PKCS7_add1_attrib_digest(PKCS7_SIGNER_INFO *si, + const unsigned char *md, int mdlen); + +int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags); +PKCS7 *SMIME_read_PKCS7_ex(BIO *bio, BIO **bcont, PKCS7 **p7); +PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont); + +BIO *BIO_new_PKCS7(BIO *out, PKCS7 *p7); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/safestack.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/safestack.h new file mode 100644 index 000000000000..084f610b5bf7 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/safestack.h @@ -0,0 +1,303 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/safestack.h.in + * + * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_SAFESTACK_H +#define OPENSSL_SAFESTACK_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_SAFESTACK_H +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define STACK_OF(type) struct stack_st_##type + +/* Helper macro for internal use */ +#define SKM_DEFINE_STACK_OF_INTERNAL(t1, t2, t3) \ + STACK_OF(t1); \ + typedef int (*sk_##t1##_compfunc)(const t3 *const *a, const t3 *const *b); \ + typedef void (*sk_##t1##_freefunc)(t3 * a); \ + typedef t3 *(*sk_##t1##_copyfunc)(const t3 *a); \ + static ossl_unused ossl_inline t2 *ossl_check_##t1##_type(t2 *ptr) \ + { \ + return ptr; \ + } \ + static ossl_unused ossl_inline const OPENSSL_STACK *ossl_check_const_##t1##_sk_type(const STACK_OF(t1) *sk) \ + { \ + return (const OPENSSL_STACK *)sk; \ + } \ + static ossl_unused ossl_inline OPENSSL_STACK *ossl_check_##t1##_sk_type(STACK_OF(t1) *sk) \ + { \ + return (OPENSSL_STACK *)sk; \ + } \ + static ossl_unused ossl_inline OPENSSL_sk_compfunc ossl_check_##t1##_compfunc_type(sk_##t1##_compfunc cmp) \ + { \ + return (OPENSSL_sk_compfunc)cmp; \ + } \ + static ossl_unused ossl_inline OPENSSL_sk_copyfunc ossl_check_##t1##_copyfunc_type(sk_##t1##_copyfunc cpy) \ + { \ + return (OPENSSL_sk_copyfunc)cpy; \ + } \ + static ossl_unused ossl_inline OPENSSL_sk_freefunc ossl_check_##t1##_freefunc_type(sk_##t1##_freefunc fr) \ + { \ + return (OPENSSL_sk_freefunc)fr; \ + } + +#define SKM_DEFINE_STACK_OF(t1, t2, t3) \ + STACK_OF(t1); \ + typedef int (*sk_##t1##_compfunc)(const t3 *const *a, const t3 *const *b); \ + typedef void (*sk_##t1##_freefunc)(t3 * a); \ + typedef t3 *(*sk_##t1##_copyfunc)(const t3 *a); \ + static ossl_unused ossl_inline int sk_##t1##_num(const STACK_OF(t1) *sk) \ + { \ + return OPENSSL_sk_num((const OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_value(const STACK_OF(t1) *sk, int idx) \ + { \ + return (t2 *)OPENSSL_sk_value((const OPENSSL_STACK *)sk, idx); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new(sk_##t1##_compfunc compare) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_new((OPENSSL_sk_compfunc)compare); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new_null(void) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_new_null(); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_new_reserve(sk_##t1##_compfunc compare, int n) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_new_reserve((OPENSSL_sk_compfunc)compare, n); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_reserve(STACK_OF(t1) *sk, int n) \ + { \ + return OPENSSL_sk_reserve((OPENSSL_STACK *)sk, n); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_free(STACK_OF(t1) *sk) \ + { \ + OPENSSL_sk_free((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_zero(STACK_OF(t1) *sk) \ + { \ + OPENSSL_sk_zero((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_delete(STACK_OF(t1) *sk, int i) \ + { \ + return (t2 *)OPENSSL_sk_delete((OPENSSL_STACK *)sk, i); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_delete_ptr(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return (t2 *)OPENSSL_sk_delete_ptr((OPENSSL_STACK *)sk, \ + (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_push(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_push((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_unshift(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_unshift((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_pop(STACK_OF(t1) *sk) \ + { \ + return (t2 *)OPENSSL_sk_pop((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_shift(STACK_OF(t1) *sk) \ + { \ + return (t2 *)OPENSSL_sk_shift((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_pop_free(STACK_OF(t1) *sk, sk_##t1##_freefunc freefunc) \ + { \ + OPENSSL_sk_pop_free((OPENSSL_STACK *)sk, (OPENSSL_sk_freefunc)freefunc); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_insert(STACK_OF(t1) *sk, t2 *ptr, int idx) \ + { \ + return OPENSSL_sk_insert((OPENSSL_STACK *)sk, (const void *)ptr, idx); \ + } \ + static ossl_unused ossl_inline t2 *sk_##t1##_set(STACK_OF(t1) *sk, int idx, t2 *ptr) \ + { \ + return (t2 *)OPENSSL_sk_set((OPENSSL_STACK *)sk, idx, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_find(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_find((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_find_ex(STACK_OF(t1) *sk, t2 *ptr) \ + { \ + return OPENSSL_sk_find_ex((OPENSSL_STACK *)sk, (const void *)ptr); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_find_all(STACK_OF(t1) *sk, t2 *ptr, int *pnum) \ + { \ + return OPENSSL_sk_find_all((OPENSSL_STACK *)sk, (const void *)ptr, pnum); \ + } \ + static ossl_unused ossl_inline void sk_##t1##_sort(STACK_OF(t1) *sk) \ + { \ + OPENSSL_sk_sort((OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline int sk_##t1##_is_sorted(const STACK_OF(t1) *sk) \ + { \ + return OPENSSL_sk_is_sorted((const OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_dup(const STACK_OF(t1) *sk) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_dup((const OPENSSL_STACK *)sk); \ + } \ + static ossl_unused ossl_inline STACK_OF(t1) *sk_##t1##_deep_copy(const STACK_OF(t1) *sk, \ + sk_##t1##_copyfunc copyfunc, \ + sk_##t1##_freefunc freefunc) \ + { \ + return (STACK_OF(t1) *)OPENSSL_sk_deep_copy((const OPENSSL_STACK *)sk, \ + (OPENSSL_sk_copyfunc)copyfunc, \ + (OPENSSL_sk_freefunc)freefunc); \ + } \ + static ossl_unused ossl_inline sk_##t1##_compfunc sk_##t1##_set_cmp_func(STACK_OF(t1) *sk, sk_##t1##_compfunc compare) \ + { \ + return (sk_##t1##_compfunc)OPENSSL_sk_set_cmp_func((OPENSSL_STACK *)sk, (OPENSSL_sk_compfunc)compare); \ + } + +#define DEFINE_STACK_OF(t) SKM_DEFINE_STACK_OF(t, t, t) +#define DEFINE_STACK_OF_CONST(t) SKM_DEFINE_STACK_OF(t, const t, t) +#define DEFINE_SPECIAL_STACK_OF(t1, t2) SKM_DEFINE_STACK_OF(t1, t2, t2) +#define DEFINE_SPECIAL_STACK_OF_CONST(t1, t2) \ + SKM_DEFINE_STACK_OF(t1, const t2, t2) + +/*- + * Strings are special: normally an lhash entry will point to a single + * (somewhat) mutable object. In the case of strings: + * + * a) Instead of a single char, there is an array of chars, NUL-terminated. + * b) The string may have be immutable. + * + * So, they need their own declarations. Especially important for + * type-checking tools, such as Deputy. + * + * In practice, however, it appears to be hard to have a const + * string. For now, I'm settling for dealing with the fact it is a + * string at all. + */ +typedef char *OPENSSL_STRING; +typedef const char *OPENSSL_CSTRING; + +/*- + * Confusingly, LHASH_OF(STRING) deals with char ** throughout, but + * STACK_OF(STRING) is really more like STACK_OF(char), only, as mentioned + * above, instead of a single char each entry is a NUL-terminated array of + * chars. So, we have to implement STRING specially for STACK_OF. This is + * dealt with in the autogenerated macros below. + */ +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OPENSSL_STRING, char, char) +#define sk_OPENSSL_STRING_num(sk) OPENSSL_sk_num(ossl_check_const_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_value(sk, idx) ((char *)OPENSSL_sk_value(ossl_check_const_OPENSSL_STRING_sk_type(sk), (idx))) +#define sk_OPENSSL_STRING_new(cmp) ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_new(ossl_check_OPENSSL_STRING_compfunc_type(cmp))) +#define sk_OPENSSL_STRING_new_null() ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_new_null()) +#define sk_OPENSSL_STRING_new_reserve(cmp, n) ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_new_reserve(ossl_check_OPENSSL_STRING_compfunc_type(cmp), (n))) +#define sk_OPENSSL_STRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OPENSSL_STRING_sk_type(sk), (n)) +#define sk_OPENSSL_STRING_free(sk) OPENSSL_sk_free(ossl_check_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_zero(sk) OPENSSL_sk_zero(ossl_check_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_delete(sk, i) ((char *)OPENSSL_sk_delete(ossl_check_OPENSSL_STRING_sk_type(sk), (i))) +#define sk_OPENSSL_STRING_delete_ptr(sk, ptr) ((char *)OPENSSL_sk_delete_ptr(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr))) +#define sk_OPENSSL_STRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr)) +#define sk_OPENSSL_STRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr)) +#define sk_OPENSSL_STRING_pop(sk) ((char *)OPENSSL_sk_pop(ossl_check_OPENSSL_STRING_sk_type(sk))) +#define sk_OPENSSL_STRING_shift(sk) ((char *)OPENSSL_sk_shift(ossl_check_OPENSSL_STRING_sk_type(sk))) +#define sk_OPENSSL_STRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OPENSSL_STRING_sk_type(sk),ossl_check_OPENSSL_STRING_freefunc_type(freefunc)) +#define sk_OPENSSL_STRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr), (idx)) +#define sk_OPENSSL_STRING_set(sk, idx, ptr) ((char *)OPENSSL_sk_set(ossl_check_OPENSSL_STRING_sk_type(sk), (idx), ossl_check_OPENSSL_STRING_type(ptr))) +#define sk_OPENSSL_STRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr)) +#define sk_OPENSSL_STRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr)) +#define sk_OPENSSL_STRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_type(ptr), pnum) +#define sk_OPENSSL_STRING_sort(sk) OPENSSL_sk_sort(ossl_check_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OPENSSL_STRING_sk_type(sk)) +#define sk_OPENSSL_STRING_dup(sk) ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_dup(ossl_check_const_OPENSSL_STRING_sk_type(sk))) +#define sk_OPENSSL_STRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OPENSSL_STRING) *)OPENSSL_sk_deep_copy(ossl_check_const_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_copyfunc_type(copyfunc), ossl_check_OPENSSL_STRING_freefunc_type(freefunc))) +#define sk_OPENSSL_STRING_set_cmp_func(sk, cmp) ((sk_OPENSSL_STRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OPENSSL_STRING_sk_type(sk), ossl_check_OPENSSL_STRING_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(OPENSSL_CSTRING, const char, char) +#define sk_OPENSSL_CSTRING_num(sk) OPENSSL_sk_num(ossl_check_const_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_value(sk, idx) ((const char *)OPENSSL_sk_value(ossl_check_const_OPENSSL_CSTRING_sk_type(sk), (idx))) +#define sk_OPENSSL_CSTRING_new(cmp) ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_new(ossl_check_OPENSSL_CSTRING_compfunc_type(cmp))) +#define sk_OPENSSL_CSTRING_new_null() ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_new_null()) +#define sk_OPENSSL_CSTRING_new_reserve(cmp, n) ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_new_reserve(ossl_check_OPENSSL_CSTRING_compfunc_type(cmp), (n))) +#define sk_OPENSSL_CSTRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OPENSSL_CSTRING_sk_type(sk), (n)) +#define sk_OPENSSL_CSTRING_free(sk) OPENSSL_sk_free(ossl_check_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_zero(sk) OPENSSL_sk_zero(ossl_check_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_delete(sk, i) ((const char *)OPENSSL_sk_delete(ossl_check_OPENSSL_CSTRING_sk_type(sk), (i))) +#define sk_OPENSSL_CSTRING_delete_ptr(sk, ptr) ((const char *)OPENSSL_sk_delete_ptr(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr))) +#define sk_OPENSSL_CSTRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr)) +#define sk_OPENSSL_CSTRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr)) +#define sk_OPENSSL_CSTRING_pop(sk) ((const char *)OPENSSL_sk_pop(ossl_check_OPENSSL_CSTRING_sk_type(sk))) +#define sk_OPENSSL_CSTRING_shift(sk) ((const char *)OPENSSL_sk_shift(ossl_check_OPENSSL_CSTRING_sk_type(sk))) +#define sk_OPENSSL_CSTRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OPENSSL_CSTRING_sk_type(sk),ossl_check_OPENSSL_CSTRING_freefunc_type(freefunc)) +#define sk_OPENSSL_CSTRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr), (idx)) +#define sk_OPENSSL_CSTRING_set(sk, idx, ptr) ((const char *)OPENSSL_sk_set(ossl_check_OPENSSL_CSTRING_sk_type(sk), (idx), ossl_check_OPENSSL_CSTRING_type(ptr))) +#define sk_OPENSSL_CSTRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr)) +#define sk_OPENSSL_CSTRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr)) +#define sk_OPENSSL_CSTRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_type(ptr), pnum) +#define sk_OPENSSL_CSTRING_sort(sk) OPENSSL_sk_sort(ossl_check_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OPENSSL_CSTRING_sk_type(sk)) +#define sk_OPENSSL_CSTRING_dup(sk) ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_dup(ossl_check_const_OPENSSL_CSTRING_sk_type(sk))) +#define sk_OPENSSL_CSTRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OPENSSL_CSTRING) *)OPENSSL_sk_deep_copy(ossl_check_const_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_copyfunc_type(copyfunc), ossl_check_OPENSSL_CSTRING_freefunc_type(freefunc))) +#define sk_OPENSSL_CSTRING_set_cmp_func(sk, cmp) ((sk_OPENSSL_CSTRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OPENSSL_CSTRING_sk_type(sk), ossl_check_OPENSSL_CSTRING_compfunc_type(cmp))) + +/* clang-format on */ + +#if !defined(OPENSSL_NO_DEPRECATED_3_0) +/* + * This is not used by OpenSSL. A block of bytes, NOT nul-terminated. + * These should also be distinguished from "normal" stacks. + */ +typedef void *OPENSSL_BLOCK; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OPENSSL_BLOCK, void, void) +#define sk_OPENSSL_BLOCK_num(sk) OPENSSL_sk_num(ossl_check_const_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_value(sk, idx) ((void *)OPENSSL_sk_value(ossl_check_const_OPENSSL_BLOCK_sk_type(sk), (idx))) +#define sk_OPENSSL_BLOCK_new(cmp) ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_new(ossl_check_OPENSSL_BLOCK_compfunc_type(cmp))) +#define sk_OPENSSL_BLOCK_new_null() ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_new_null()) +#define sk_OPENSSL_BLOCK_new_reserve(cmp, n) ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_new_reserve(ossl_check_OPENSSL_BLOCK_compfunc_type(cmp), (n))) +#define sk_OPENSSL_BLOCK_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OPENSSL_BLOCK_sk_type(sk), (n)) +#define sk_OPENSSL_BLOCK_free(sk) OPENSSL_sk_free(ossl_check_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_zero(sk) OPENSSL_sk_zero(ossl_check_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_delete(sk, i) ((void *)OPENSSL_sk_delete(ossl_check_OPENSSL_BLOCK_sk_type(sk), (i))) +#define sk_OPENSSL_BLOCK_delete_ptr(sk, ptr) ((void *)OPENSSL_sk_delete_ptr(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr))) +#define sk_OPENSSL_BLOCK_push(sk, ptr) OPENSSL_sk_push(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr)) +#define sk_OPENSSL_BLOCK_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr)) +#define sk_OPENSSL_BLOCK_pop(sk) ((void *)OPENSSL_sk_pop(ossl_check_OPENSSL_BLOCK_sk_type(sk))) +#define sk_OPENSSL_BLOCK_shift(sk) ((void *)OPENSSL_sk_shift(ossl_check_OPENSSL_BLOCK_sk_type(sk))) +#define sk_OPENSSL_BLOCK_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OPENSSL_BLOCK_sk_type(sk),ossl_check_OPENSSL_BLOCK_freefunc_type(freefunc)) +#define sk_OPENSSL_BLOCK_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr), (idx)) +#define sk_OPENSSL_BLOCK_set(sk, idx, ptr) ((void *)OPENSSL_sk_set(ossl_check_OPENSSL_BLOCK_sk_type(sk), (idx), ossl_check_OPENSSL_BLOCK_type(ptr))) +#define sk_OPENSSL_BLOCK_find(sk, ptr) OPENSSL_sk_find(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr)) +#define sk_OPENSSL_BLOCK_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr)) +#define sk_OPENSSL_BLOCK_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_type(ptr), pnum) +#define sk_OPENSSL_BLOCK_sort(sk) OPENSSL_sk_sort(ossl_check_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OPENSSL_BLOCK_sk_type(sk)) +#define sk_OPENSSL_BLOCK_dup(sk) ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_dup(ossl_check_const_OPENSSL_BLOCK_sk_type(sk))) +#define sk_OPENSSL_BLOCK_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OPENSSL_BLOCK) *)OPENSSL_sk_deep_copy(ossl_check_const_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_copyfunc_type(copyfunc), ossl_check_OPENSSL_BLOCK_freefunc_type(freefunc))) +#define sk_OPENSSL_BLOCK_set_cmp_func(sk, cmp) ((sk_OPENSSL_BLOCK_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OPENSSL_BLOCK_sk_type(sk), ossl_check_OPENSSL_BLOCK_compfunc_type(cmp))) + +/* clang-format on */ +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/srp.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/srp.h new file mode 100644 index 000000000000..4ef926d61fc8 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/srp.h @@ -0,0 +1,291 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/srp.h.in + * + * Copyright 2004-2021 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2004, EdelKey Project. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + * + * Originally written by Christophe Renou and Peter Sylvester, + * for the EdelKey project. + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_SRP_H +#define OPENSSL_SRP_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_SRP_H +#endif + +#include + +#ifndef OPENSSL_NO_SRP +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef OPENSSL_NO_DEPRECATED_3_0 + +typedef struct SRP_gN_cache_st { + char *b64_bn; + BIGNUM *bn; +} SRP_gN_cache; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SRP_gN_cache, SRP_gN_cache, SRP_gN_cache) +#define sk_SRP_gN_cache_num(sk) OPENSSL_sk_num(ossl_check_const_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_value(sk, idx) ((SRP_gN_cache *)OPENSSL_sk_value(ossl_check_const_SRP_gN_cache_sk_type(sk), (idx))) +#define sk_SRP_gN_cache_new(cmp) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_new(ossl_check_SRP_gN_cache_compfunc_type(cmp))) +#define sk_SRP_gN_cache_new_null() ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_new_null()) +#define sk_SRP_gN_cache_new_reserve(cmp, n) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_new_reserve(ossl_check_SRP_gN_cache_compfunc_type(cmp), (n))) +#define sk_SRP_gN_cache_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRP_gN_cache_sk_type(sk), (n)) +#define sk_SRP_gN_cache_free(sk) OPENSSL_sk_free(ossl_check_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_zero(sk) OPENSSL_sk_zero(ossl_check_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_delete(sk, i) ((SRP_gN_cache *)OPENSSL_sk_delete(ossl_check_SRP_gN_cache_sk_type(sk), (i))) +#define sk_SRP_gN_cache_delete_ptr(sk, ptr) ((SRP_gN_cache *)OPENSSL_sk_delete_ptr(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr))) +#define sk_SRP_gN_cache_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) +#define sk_SRP_gN_cache_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) +#define sk_SRP_gN_cache_pop(sk) ((SRP_gN_cache *)OPENSSL_sk_pop(ossl_check_SRP_gN_cache_sk_type(sk))) +#define sk_SRP_gN_cache_shift(sk) ((SRP_gN_cache *)OPENSSL_sk_shift(ossl_check_SRP_gN_cache_sk_type(sk))) +#define sk_SRP_gN_cache_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRP_gN_cache_sk_type(sk),ossl_check_SRP_gN_cache_freefunc_type(freefunc)) +#define sk_SRP_gN_cache_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr), (idx)) +#define sk_SRP_gN_cache_set(sk, idx, ptr) ((SRP_gN_cache *)OPENSSL_sk_set(ossl_check_SRP_gN_cache_sk_type(sk), (idx), ossl_check_SRP_gN_cache_type(ptr))) +#define sk_SRP_gN_cache_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) +#define sk_SRP_gN_cache_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr)) +#define sk_SRP_gN_cache_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_type(ptr), pnum) +#define sk_SRP_gN_cache_sort(sk) OPENSSL_sk_sort(ossl_check_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRP_gN_cache_sk_type(sk)) +#define sk_SRP_gN_cache_dup(sk) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_dup(ossl_check_const_SRP_gN_cache_sk_type(sk))) +#define sk_SRP_gN_cache_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRP_gN_cache) *)OPENSSL_sk_deep_copy(ossl_check_const_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_copyfunc_type(copyfunc), ossl_check_SRP_gN_cache_freefunc_type(freefunc))) +#define sk_SRP_gN_cache_set_cmp_func(sk, cmp) ((sk_SRP_gN_cache_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRP_gN_cache_sk_type(sk), ossl_check_SRP_gN_cache_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct SRP_user_pwd_st { + /* Owned by us. */ + char *id; + BIGNUM *s; + BIGNUM *v; + /* Not owned by us. */ + const BIGNUM *g; + const BIGNUM *N; + /* Owned by us. */ + char *info; +} SRP_user_pwd; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SRP_user_pwd, SRP_user_pwd, SRP_user_pwd) +#define sk_SRP_user_pwd_num(sk) OPENSSL_sk_num(ossl_check_const_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_value(sk, idx) ((SRP_user_pwd *)OPENSSL_sk_value(ossl_check_const_SRP_user_pwd_sk_type(sk), (idx))) +#define sk_SRP_user_pwd_new(cmp) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_new(ossl_check_SRP_user_pwd_compfunc_type(cmp))) +#define sk_SRP_user_pwd_new_null() ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_new_null()) +#define sk_SRP_user_pwd_new_reserve(cmp, n) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_new_reserve(ossl_check_SRP_user_pwd_compfunc_type(cmp), (n))) +#define sk_SRP_user_pwd_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRP_user_pwd_sk_type(sk), (n)) +#define sk_SRP_user_pwd_free(sk) OPENSSL_sk_free(ossl_check_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_zero(sk) OPENSSL_sk_zero(ossl_check_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_delete(sk, i) ((SRP_user_pwd *)OPENSSL_sk_delete(ossl_check_SRP_user_pwd_sk_type(sk), (i))) +#define sk_SRP_user_pwd_delete_ptr(sk, ptr) ((SRP_user_pwd *)OPENSSL_sk_delete_ptr(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr))) +#define sk_SRP_user_pwd_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) +#define sk_SRP_user_pwd_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) +#define sk_SRP_user_pwd_pop(sk) ((SRP_user_pwd *)OPENSSL_sk_pop(ossl_check_SRP_user_pwd_sk_type(sk))) +#define sk_SRP_user_pwd_shift(sk) ((SRP_user_pwd *)OPENSSL_sk_shift(ossl_check_SRP_user_pwd_sk_type(sk))) +#define sk_SRP_user_pwd_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRP_user_pwd_sk_type(sk),ossl_check_SRP_user_pwd_freefunc_type(freefunc)) +#define sk_SRP_user_pwd_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr), (idx)) +#define sk_SRP_user_pwd_set(sk, idx, ptr) ((SRP_user_pwd *)OPENSSL_sk_set(ossl_check_SRP_user_pwd_sk_type(sk), (idx), ossl_check_SRP_user_pwd_type(ptr))) +#define sk_SRP_user_pwd_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) +#define sk_SRP_user_pwd_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr)) +#define sk_SRP_user_pwd_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_type(ptr), pnum) +#define sk_SRP_user_pwd_sort(sk) OPENSSL_sk_sort(ossl_check_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRP_user_pwd_sk_type(sk)) +#define sk_SRP_user_pwd_dup(sk) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_dup(ossl_check_const_SRP_user_pwd_sk_type(sk))) +#define sk_SRP_user_pwd_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRP_user_pwd) *)OPENSSL_sk_deep_copy(ossl_check_const_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_copyfunc_type(copyfunc), ossl_check_SRP_user_pwd_freefunc_type(freefunc))) +#define sk_SRP_user_pwd_set_cmp_func(sk, cmp) ((sk_SRP_user_pwd_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRP_user_pwd_sk_type(sk), ossl_check_SRP_user_pwd_compfunc_type(cmp))) + +/* clang-format on */ + +OSSL_DEPRECATEDIN_3_0 +SRP_user_pwd *SRP_user_pwd_new(void); +OSSL_DEPRECATEDIN_3_0 +void SRP_user_pwd_free(SRP_user_pwd *user_pwd); + +OSSL_DEPRECATEDIN_3_0 +void SRP_user_pwd_set_gN(SRP_user_pwd *user_pwd, const BIGNUM *g, + const BIGNUM *N); +OSSL_DEPRECATEDIN_3_0 +int SRP_user_pwd_set1_ids(SRP_user_pwd *user_pwd, const char *id, + const char *info); +OSSL_DEPRECATEDIN_3_0 +int SRP_user_pwd_set0_sv(SRP_user_pwd *user_pwd, BIGNUM *s, BIGNUM *v); + +typedef struct SRP_VBASE_st { + STACK_OF(SRP_user_pwd) *users_pwd; + STACK_OF(SRP_gN_cache) *gN_cache; + /* to simulate a user */ + char *seed_key; + const BIGNUM *default_g; + const BIGNUM *default_N; +} SRP_VBASE; + +/* + * Internal structure storing N and g pair + */ +typedef struct SRP_gN_st { + char *id; + const BIGNUM *g; + const BIGNUM *N; +} SRP_gN; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SRP_gN, SRP_gN, SRP_gN) +#define sk_SRP_gN_num(sk) OPENSSL_sk_num(ossl_check_const_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_value(sk, idx) ((SRP_gN *)OPENSSL_sk_value(ossl_check_const_SRP_gN_sk_type(sk), (idx))) +#define sk_SRP_gN_new(cmp) ((STACK_OF(SRP_gN) *)OPENSSL_sk_new(ossl_check_SRP_gN_compfunc_type(cmp))) +#define sk_SRP_gN_new_null() ((STACK_OF(SRP_gN) *)OPENSSL_sk_new_null()) +#define sk_SRP_gN_new_reserve(cmp, n) ((STACK_OF(SRP_gN) *)OPENSSL_sk_new_reserve(ossl_check_SRP_gN_compfunc_type(cmp), (n))) +#define sk_SRP_gN_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRP_gN_sk_type(sk), (n)) +#define sk_SRP_gN_free(sk) OPENSSL_sk_free(ossl_check_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_zero(sk) OPENSSL_sk_zero(ossl_check_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_delete(sk, i) ((SRP_gN *)OPENSSL_sk_delete(ossl_check_SRP_gN_sk_type(sk), (i))) +#define sk_SRP_gN_delete_ptr(sk, ptr) ((SRP_gN *)OPENSSL_sk_delete_ptr(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr))) +#define sk_SRP_gN_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) +#define sk_SRP_gN_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) +#define sk_SRP_gN_pop(sk) ((SRP_gN *)OPENSSL_sk_pop(ossl_check_SRP_gN_sk_type(sk))) +#define sk_SRP_gN_shift(sk) ((SRP_gN *)OPENSSL_sk_shift(ossl_check_SRP_gN_sk_type(sk))) +#define sk_SRP_gN_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRP_gN_sk_type(sk),ossl_check_SRP_gN_freefunc_type(freefunc)) +#define sk_SRP_gN_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr), (idx)) +#define sk_SRP_gN_set(sk, idx, ptr) ((SRP_gN *)OPENSSL_sk_set(ossl_check_SRP_gN_sk_type(sk), (idx), ossl_check_SRP_gN_type(ptr))) +#define sk_SRP_gN_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) +#define sk_SRP_gN_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr)) +#define sk_SRP_gN_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_type(ptr), pnum) +#define sk_SRP_gN_sort(sk) OPENSSL_sk_sort(ossl_check_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRP_gN_sk_type(sk)) +#define sk_SRP_gN_dup(sk) ((STACK_OF(SRP_gN) *)OPENSSL_sk_dup(ossl_check_const_SRP_gN_sk_type(sk))) +#define sk_SRP_gN_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRP_gN) *)OPENSSL_sk_deep_copy(ossl_check_const_SRP_gN_sk_type(sk), ossl_check_SRP_gN_copyfunc_type(copyfunc), ossl_check_SRP_gN_freefunc_type(freefunc))) +#define sk_SRP_gN_set_cmp_func(sk, cmp) ((sk_SRP_gN_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRP_gN_sk_type(sk), ossl_check_SRP_gN_compfunc_type(cmp))) + +/* clang-format on */ + +OSSL_DEPRECATEDIN_3_0 +SRP_VBASE *SRP_VBASE_new(char *seed_key); +OSSL_DEPRECATEDIN_3_0 +void SRP_VBASE_free(SRP_VBASE *vb); +OSSL_DEPRECATEDIN_3_0 +int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file); + +OSSL_DEPRECATEDIN_3_0 +int SRP_VBASE_add0_user(SRP_VBASE *vb, SRP_user_pwd *user_pwd); + +/* NOTE: unlike in SRP_VBASE_get_by_user, caller owns the returned pointer.*/ +OSSL_DEPRECATEDIN_3_0 +SRP_user_pwd *SRP_VBASE_get1_by_user(SRP_VBASE *vb, char *username); + +OSSL_DEPRECATEDIN_3_0 +char *SRP_create_verifier_ex(const char *user, const char *pass, char **salt, + char **verifier, const char *N, const char *g, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +char *SRP_create_verifier(const char *user, const char *pass, char **salt, + char **verifier, const char *N, const char *g); +OSSL_DEPRECATEDIN_3_0 +int SRP_create_verifier_BN_ex(const char *user, const char *pass, BIGNUM **salt, + BIGNUM **verifier, const BIGNUM *N, + const BIGNUM *g, OSSL_LIB_CTX *libctx, + const char *propq); +OSSL_DEPRECATEDIN_3_0 +int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, + BIGNUM **verifier, const BIGNUM *N, + const BIGNUM *g); + +#define SRP_NO_ERROR 0 +#define SRP_ERR_VBASE_INCOMPLETE_FILE 1 +#define SRP_ERR_VBASE_BN_LIB 2 +#define SRP_ERR_OPEN_FILE 3 +#define SRP_ERR_MEMORY 4 + +#define DB_srptype 0 +#define DB_srpverifier 1 +#define DB_srpsalt 2 +#define DB_srpid 3 +#define DB_srpgN 4 +#define DB_srpinfo 5 +#undef DB_NUMBER +#define DB_NUMBER 6 + +#define DB_SRP_INDEX 'I' +#define DB_SRP_VALID 'V' +#define DB_SRP_REVOKED 'R' +#define DB_SRP_MODIF 'v' + +/* see srp.c */ +OSSL_DEPRECATEDIN_3_0 +char *SRP_check_known_gN_param(const BIGNUM *g, const BIGNUM *N); +OSSL_DEPRECATEDIN_3_0 +SRP_gN *SRP_get_default_gN(const char *id); + +/* server side .... */ +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_server_key(const BIGNUM *A, const BIGNUM *v, const BIGNUM *u, + const BIGNUM *b, const BIGNUM *N); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_B_ex(const BIGNUM *b, const BIGNUM *N, const BIGNUM *g, + const BIGNUM *v, OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_B(const BIGNUM *b, const BIGNUM *N, const BIGNUM *g, + const BIGNUM *v); + +OSSL_DEPRECATEDIN_3_0 +int SRP_Verify_A_mod_N(const BIGNUM *A, const BIGNUM *N); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_u_ex(const BIGNUM *A, const BIGNUM *B, const BIGNUM *N, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_u(const BIGNUM *A, const BIGNUM *B, const BIGNUM *N); + +/* client side .... */ + +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_x_ex(const BIGNUM *s, const char *user, const char *pass, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_x(const BIGNUM *s, const char *user, const char *pass); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_A(const BIGNUM *a, const BIGNUM *N, const BIGNUM *g); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_client_key_ex(const BIGNUM *N, const BIGNUM *B, const BIGNUM *g, + const BIGNUM *x, const BIGNUM *a, const BIGNUM *u, + OSSL_LIB_CTX *libctx, const char *propq); +OSSL_DEPRECATEDIN_3_0 +BIGNUM *SRP_Calc_client_key(const BIGNUM *N, const BIGNUM *B, const BIGNUM *g, + const BIGNUM *x, const BIGNUM *a, const BIGNUM *u); +OSSL_DEPRECATEDIN_3_0 +int SRP_Verify_B_mod_N(const BIGNUM *B, const BIGNUM *N); + +#define SRP_MINIMAL_N 1024 + +#endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +/* This method ignores the configured seed and fails for an unknown user. */ +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 +SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username); +#endif + +#ifdef __cplusplus +} +#endif +#endif + +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ssl.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ssl.h new file mode 100644 index 000000000000..eaeeea7d10b4 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ssl.h @@ -0,0 +1,2940 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/ssl.h.in + * + * Copyright 1995-2026 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * Copyright 2005 Nokia. All rights reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_SSL_H +#define OPENSSL_SSL_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_SSL_H +#endif + +#include +#include +#include +#include +#include +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#include +#include +#include +#endif +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* OpenSSL version number for ASN.1 encoding of the session information */ +/*- + * Version 0 - initial version + * Version 1 - added the optional peer certificate + */ +#define SSL_SESSION_ASN1_VERSION 0x0001 + +#define SSL_MAX_SSL_SESSION_ID_LENGTH 32 +#define SSL_MAX_SID_CTX_LENGTH 32 + +#define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES (512 / 8) +#define SSL_MAX_KEY_ARG_LENGTH 8 +/* SSL_MAX_MASTER_KEY_LENGTH is defined in prov_ssl.h */ + +/* The maximum number of encrypt/decrypt pipelines we can support */ +#define SSL_MAX_PIPELINES 32 + +/* text strings for the ciphers */ + +/* These are used to specify which ciphers to use and not to use */ + +#define SSL_TXT_LOW "LOW" +#define SSL_TXT_MEDIUM "MEDIUM" +#define SSL_TXT_HIGH "HIGH" +#define SSL_TXT_FIPS "FIPS" + +#define SSL_TXT_aNULL "aNULL" +#define SSL_TXT_eNULL "eNULL" +#define SSL_TXT_NULL "NULL" + +#define SSL_TXT_kRSA "kRSA" +#define SSL_TXT_kDHr "kDHr" /* this cipher class has been removed */ +#define SSL_TXT_kDHd "kDHd" /* this cipher class has been removed */ +#define SSL_TXT_kDH "kDH" /* this cipher class has been removed */ +#define SSL_TXT_kEDH "kEDH" /* alias for kDHE */ +#define SSL_TXT_kDHE "kDHE" +#define SSL_TXT_kECDHr "kECDHr" /* this cipher class has been removed */ +#define SSL_TXT_kECDHe "kECDHe" /* this cipher class has been removed */ +#define SSL_TXT_kECDH "kECDH" /* this cipher class has been removed */ +#define SSL_TXT_kEECDH "kEECDH" /* alias for kECDHE */ +#define SSL_TXT_kECDHE "kECDHE" +#define SSL_TXT_kPSK "kPSK" +#define SSL_TXT_kRSAPSK "kRSAPSK" +#define SSL_TXT_kECDHEPSK "kECDHEPSK" +#define SSL_TXT_kDHEPSK "kDHEPSK" +#define SSL_TXT_kGOST "kGOST" +#define SSL_TXT_kGOST18 "kGOST18" +#define SSL_TXT_kSRP "kSRP" + +#define SSL_TXT_aRSA "aRSA" +#define SSL_TXT_aDSS "aDSS" +#define SSL_TXT_aDH "aDH" /* this cipher class has been removed */ +#define SSL_TXT_aECDH "aECDH" /* this cipher class has been removed */ +#define SSL_TXT_aECDSA "aECDSA" +#define SSL_TXT_aPSK "aPSK" +#define SSL_TXT_aGOST94 "aGOST94" +#define SSL_TXT_aGOST01 "aGOST01" +#define SSL_TXT_aGOST12 "aGOST12" +#define SSL_TXT_aGOST "aGOST" +#define SSL_TXT_aSRP "aSRP" + +#define SSL_TXT_DSS "DSS" +#define SSL_TXT_DH "DH" +#define SSL_TXT_DHE "DHE" /* same as "kDHE:-ADH" */ +#define SSL_TXT_EDH "EDH" /* alias for DHE */ +#define SSL_TXT_ADH "ADH" +#define SSL_TXT_RSA "RSA" +#define SSL_TXT_ECDH "ECDH" +#define SSL_TXT_EECDH "EECDH" /* alias for ECDHE" */ +#define SSL_TXT_ECDHE "ECDHE" /* same as "kECDHE:-AECDH" */ +#define SSL_TXT_AECDH "AECDH" +#define SSL_TXT_ECDSA "ECDSA" +#define SSL_TXT_PSK "PSK" +#define SSL_TXT_SRP "SRP" + +#define SSL_TXT_DES "DES" +#define SSL_TXT_3DES "3DES" +#define SSL_TXT_RC4 "RC4" +#define SSL_TXT_RC2 "RC2" +#define SSL_TXT_IDEA "IDEA" +#define SSL_TXT_SEED "SEED" +#define SSL_TXT_AES128 "AES128" +#define SSL_TXT_AES256 "AES256" +#define SSL_TXT_AES "AES" +#define SSL_TXT_AES_GCM "AESGCM" +#define SSL_TXT_AES_CCM "AESCCM" +#define SSL_TXT_AES_CCM_8 "AESCCM8" +#define SSL_TXT_CAMELLIA128 "CAMELLIA128" +#define SSL_TXT_CAMELLIA256 "CAMELLIA256" +#define SSL_TXT_CAMELLIA "CAMELLIA" +#define SSL_TXT_CHACHA20 "CHACHA20" +#define SSL_TXT_GOST "GOST89" +#define SSL_TXT_ARIA "ARIA" +#define SSL_TXT_ARIA_GCM "ARIAGCM" +#define SSL_TXT_ARIA128 "ARIA128" +#define SSL_TXT_ARIA256 "ARIA256" +#define SSL_TXT_GOST2012_GOST8912_GOST8912 "GOST2012-GOST8912-GOST8912" +#define SSL_TXT_CBC "CBC" + +#define SSL_TXT_MD5 "MD5" +#define SSL_TXT_SHA1 "SHA1" +#define SSL_TXT_SHA "SHA" /* same as "SHA1" */ +#define SSL_TXT_GOST94 "GOST94" +#define SSL_TXT_GOST89MAC "GOST89MAC" +#define SSL_TXT_GOST12 "GOST12" +#define SSL_TXT_GOST89MAC12 "GOST89MAC12" +#define SSL_TXT_SHA256 "SHA256" +#define SSL_TXT_SHA384 "SHA384" + +#define SSL_TXT_SSLV3 "SSLv3" +#define SSL_TXT_TLSV1 "TLSv1" +#define SSL_TXT_TLSV1_1 "TLSv1.1" +#define SSL_TXT_TLSV1_2 "TLSv1.2" + +#define SSL_TXT_ALL "ALL" + +/*- + * COMPLEMENTOF* definitions. These identifiers are used to (de-select) + * ciphers normally not being used. + * Example: "RC4" will activate all ciphers using RC4 including ciphers + * without authentication, which would normally disabled by DEFAULT (due + * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT" + * will make sure that it is also disabled in the specific selection. + * COMPLEMENTOF* identifiers are portable between version, as adjustments + * to the default cipher setup will also be included here. + * + * COMPLEMENTOFDEFAULT does not experience the same special treatment that + * DEFAULT gets, as only selection is being done and no sorting as needed + * for DEFAULT. + */ +#define SSL_TXT_CMPALL "COMPLEMENTOFALL" +#define SSL_TXT_CMPDEF "COMPLEMENTOFDEFAULT" + +/* + * The following cipher list is used by default. It also is substituted when + * an application-defined cipher list string starts with 'DEFAULT'. + * This applies to ciphersuites for TLSv1.2 and below. + * DEPRECATED IN 3.0.0, in favor of OSSL_default_cipher_list() + * Update both macro and function simultaneously + */ +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SSL_DEFAULT_CIPHER_LIST "ALL:!COMPLEMENTOFDEFAULT:!eNULL" +/* + * This is the default set of TLSv1.3 ciphersuites + * DEPRECATED IN 3.0.0, in favor of OSSL_default_ciphersuites() + * Update both macro and function simultaneously + */ +#define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ + "TLS_CHACHA20_POLY1305_SHA256:" \ + "TLS_AES_128_GCM_SHA256" +#endif +/* + * As of OpenSSL 1.0.0, ssl_create_cipher_list() in ssl/ssl_ciph.c always + * starts with a reasonable order, and all we have to do for DEFAULT is + * throwing out anonymous and unencrypted ciphersuites! (The latter are not + * actually enabled by ALL, but "ALL:RSA" would enable some of them.) + */ + +/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */ +#define SSL_SENT_SHUTDOWN 1 +#define SSL_RECEIVED_SHUTDOWN 2 + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define SSL_FILETYPE_ASN1 X509_FILETYPE_ASN1 +#define SSL_FILETYPE_PEM X509_FILETYPE_PEM + +/* + * This is needed to stop compilers complaining about the 'struct ssl_st *' + * function parameters used to prototype callbacks in SSL_CTX. + */ +typedef struct ssl_st *ssl_crock_st; +typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT; +typedef struct ssl_method_st SSL_METHOD; +typedef struct ssl_cipher_st SSL_CIPHER; +typedef struct ssl_session_st SSL_SESSION; +typedef struct tls_sigalgs_st TLS_SIGALGS; +typedef struct ssl_conf_ctx_st SSL_CONF_CTX; + +STACK_OF(SSL_CIPHER); + +/* SRTP protection profiles for use with the use_srtp extension (RFC 5764)*/ +typedef struct srtp_protection_profile_st { + const char *name; + unsigned long id; +} SRTP_PROTECTION_PROFILE; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SRTP_PROTECTION_PROFILE, SRTP_PROTECTION_PROFILE, SRTP_PROTECTION_PROFILE) +#define sk_SRTP_PROTECTION_PROFILE_num(sk) OPENSSL_sk_num(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_value(sk, idx) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_value(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk), (idx))) +#define sk_SRTP_PROTECTION_PROFILE_new(cmp) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new(ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp))) +#define sk_SRTP_PROTECTION_PROFILE_new_null() ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new_null()) +#define sk_SRTP_PROTECTION_PROFILE_new_reserve(cmp, n) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_new_reserve(ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp), (n))) +#define sk_SRTP_PROTECTION_PROFILE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (n)) +#define sk_SRTP_PROTECTION_PROFILE_free(sk) OPENSSL_sk_free(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_zero(sk) OPENSSL_sk_zero(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_delete(sk, i) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_delete(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (i))) +#define sk_SRTP_PROTECTION_PROFILE_delete_ptr(sk, ptr) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_delete_ptr(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))) +#define sk_SRTP_PROTECTION_PROFILE_push(sk, ptr) OPENSSL_sk_push(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)) +#define sk_SRTP_PROTECTION_PROFILE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)) +#define sk_SRTP_PROTECTION_PROFILE_pop(sk) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_pop(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))) +#define sk_SRTP_PROTECTION_PROFILE_shift(sk) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_shift(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk))) +#define sk_SRTP_PROTECTION_PROFILE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk),ossl_check_SRTP_PROTECTION_PROFILE_freefunc_type(freefunc)) +#define sk_SRTP_PROTECTION_PROFILE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr), (idx)) +#define sk_SRTP_PROTECTION_PROFILE_set(sk, idx, ptr) ((SRTP_PROTECTION_PROFILE *)OPENSSL_sk_set(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), (idx), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr))) +#define sk_SRTP_PROTECTION_PROFILE_find(sk, ptr) OPENSSL_sk_find(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)) +#define sk_SRTP_PROTECTION_PROFILE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr)) +#define sk_SRTP_PROTECTION_PROFILE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_type(ptr), pnum) +#define sk_SRTP_PROTECTION_PROFILE_sort(sk) OPENSSL_sk_sort(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk)) +#define sk_SRTP_PROTECTION_PROFILE_dup(sk) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_dup(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk))) +#define sk_SRTP_PROTECTION_PROFILE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SRTP_PROTECTION_PROFILE) *)OPENSSL_sk_deep_copy(ossl_check_const_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_copyfunc_type(copyfunc), ossl_check_SRTP_PROTECTION_PROFILE_freefunc_type(freefunc))) +#define sk_SRTP_PROTECTION_PROFILE_set_cmp_func(sk, cmp) ((sk_SRTP_PROTECTION_PROFILE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SRTP_PROTECTION_PROFILE_sk_type(sk), ossl_check_SRTP_PROTECTION_PROFILE_compfunc_type(cmp))) + +/* clang-format on */ + +typedef int (*tls_session_ticket_ext_cb_fn)(SSL *s, const unsigned char *data, + int len, void *arg); +typedef int (*tls_session_secret_cb_fn)(SSL *s, void *secret, int *secret_len, + STACK_OF(SSL_CIPHER) *peer_ciphers, + const SSL_CIPHER **cipher, void *arg); + +/* Extension context codes */ +/* This extension is only allowed in TLS */ +#define SSL_EXT_TLS_ONLY 0x00001 +/* This extension is only allowed in DTLS */ +#define SSL_EXT_DTLS_ONLY 0x00002 +/* Some extensions may be allowed in DTLS but we don't implement them for it */ +#define SSL_EXT_TLS_IMPLEMENTATION_ONLY 0x00004 +/* Most extensions are not defined for SSLv3 but EXT_TYPE_renegotiate is */ +#define SSL_EXT_SSL3_ALLOWED 0x00008 +/* Extension is only defined for TLS1.2 and below */ +#define SSL_EXT_TLS1_2_AND_BELOW_ONLY 0x00010 +/* Extension is only defined for TLS1.3 and above */ +#define SSL_EXT_TLS1_3_ONLY 0x00020 +/* Ignore this extension during parsing if we are resuming */ +#define SSL_EXT_IGNORE_ON_RESUMPTION 0x00040 +#define SSL_EXT_CLIENT_HELLO 0x00080 +/* Really means TLS1.2 or below */ +#define SSL_EXT_TLS1_2_SERVER_HELLO 0x00100 +#define SSL_EXT_TLS1_3_SERVER_HELLO 0x00200 +#define SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS 0x00400 +#define SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST 0x00800 +#define SSL_EXT_TLS1_3_CERTIFICATE 0x01000 +#define SSL_EXT_TLS1_3_NEW_SESSION_TICKET 0x02000 +#define SSL_EXT_TLS1_3_CERTIFICATE_REQUEST 0x04000 +#define SSL_EXT_TLS1_3_CERTIFICATE_COMPRESSION 0x08000 +/* When sending a raw public key in a certificate message */ +#define SSL_EXT_TLS1_3_RAW_PUBLIC_KEY 0x10000 + +/* Typedefs for handling custom extensions */ + +typedef int (*custom_ext_add_cb)(SSL *s, unsigned int ext_type, + const unsigned char **out, size_t *outlen, + int *al, void *add_arg); + +typedef void (*custom_ext_free_cb)(SSL *s, unsigned int ext_type, + const unsigned char *out, void *add_arg); + +typedef int (*custom_ext_parse_cb)(SSL *s, unsigned int ext_type, + const unsigned char *in, size_t inlen, + int *al, void *parse_arg); + +typedef int (*SSL_custom_ext_add_cb_ex)(SSL *s, unsigned int ext_type, + unsigned int context, + const unsigned char **out, + size_t *outlen, X509 *x, + size_t chainidx, + int *al, void *add_arg); + +typedef void (*SSL_custom_ext_free_cb_ex)(SSL *s, unsigned int ext_type, + unsigned int context, + const unsigned char *out, + void *add_arg); + +typedef int (*SSL_custom_ext_parse_cb_ex)(SSL *s, unsigned int ext_type, + unsigned int context, + const unsigned char *in, + size_t inlen, X509 *x, + size_t chainidx, + int *al, void *parse_arg); + +/* Typedef for verification callback */ +typedef int (*SSL_verify_cb)(int preverify_ok, X509_STORE_CTX *x509_ctx); + +/* Typedef for SSL async callback */ +typedef int (*SSL_async_callback_fn)(SSL *s, void *arg); + +#define SSL_OP_BIT(n) ((uint64_t)1 << (uint64_t)n) + +/* + * SSL/TLS connection options. + */ +/* Disable Extended master secret */ +#define SSL_OP_NO_EXTENDED_MASTER_SECRET SSL_OP_BIT(0) +/* Cleanse plaintext copies of data delivered to the application */ +#define SSL_OP_CLEANSE_PLAINTEXT SSL_OP_BIT(1) +/* Allow initial connection to servers that don't support RI */ +#define SSL_OP_LEGACY_SERVER_CONNECT SSL_OP_BIT(2) +/* Enable support for Kernel TLS */ +#define SSL_OP_ENABLE_KTLS SSL_OP_BIT(3) +#define SSL_OP_TLSEXT_PADDING SSL_OP_BIT(4) +#define SSL_OP_SAFARI_ECDHE_ECDSA_BUG SSL_OP_BIT(6) +#define SSL_OP_IGNORE_UNEXPECTED_EOF SSL_OP_BIT(7) +#define SSL_OP_ALLOW_CLIENT_RENEGOTIATION SSL_OP_BIT(8) +#define SSL_OP_DISABLE_TLSEXT_CA_NAMES SSL_OP_BIT(9) +/* In TLSv1.3 allow a non-(ec)dhe based kex_mode */ +#define SSL_OP_ALLOW_NO_DHE_KEX SSL_OP_BIT(10) +/* + * Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added + * in OpenSSL 0.9.6d. Usually (depending on the application protocol) + * the workaround is not needed. Unfortunately some broken SSL/TLS + * implementations cannot handle it at all, which is why we include it + * in SSL_OP_ALL. Added in 0.9.6e + */ +#define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS SSL_OP_BIT(11) +/* DTLS options */ +#define SSL_OP_NO_QUERY_MTU SSL_OP_BIT(12) +/* Turn on Cookie Exchange (on relevant for servers) */ +#define SSL_OP_COOKIE_EXCHANGE SSL_OP_BIT(13) +/* Don't use RFC4507 ticket extension */ +#define SSL_OP_NO_TICKET SSL_OP_BIT(14) +#ifndef OPENSSL_NO_DTLS1_METHOD +/* + * Use Cisco's version identifier of DTLS_BAD_VER + * (only with deprecated DTLSv1_client_method()) + */ +#define SSL_OP_CISCO_ANYCONNECT SSL_OP_BIT(15) +#endif +/* As server, disallow session resumption on renegotiation */ +#define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION SSL_OP_BIT(16) +/* Don't use compression even if supported */ +#define SSL_OP_NO_COMPRESSION SSL_OP_BIT(17) +/* Permit unsafe legacy renegotiation */ +#define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION SSL_OP_BIT(18) +/* Disable encrypt-then-mac */ +#define SSL_OP_NO_ENCRYPT_THEN_MAC SSL_OP_BIT(19) +/* + * Enable TLSv1.3 Compatibility mode. This is on by default. A future + * version of OpenSSL may have this disabled by default. + */ +#define SSL_OP_ENABLE_MIDDLEBOX_COMPAT SSL_OP_BIT(20) +/* + * Prioritize Chacha20Poly1305 when client does. + * Modifies SSL_OP_CIPHER_SERVER_PREFERENCE + */ +#define SSL_OP_PRIORITIZE_CHACHA SSL_OP_BIT(21) +/* + * Set on servers to choose the cipher according to server's preferences. + */ +#define SSL_OP_CIPHER_SERVER_PREFERENCE SSL_OP_BIT(22) +/* + * If set, a server will allow a client to issue an SSLv3.0 version + * number as latest version supported in the premaster secret, even when + * TLSv1.0 (version 3.1) was announced in the client hello. Normally + * this is forbidden to prevent version rollback attacks. + */ +#define SSL_OP_TLS_ROLLBACK_BUG SSL_OP_BIT(23) +/* + * Switches off automatic TLSv1.3 anti-replay protection for early data. + * This is a server-side option only (no effect on the client). + */ +#define SSL_OP_NO_ANTI_REPLAY SSL_OP_BIT(24) +#define SSL_OP_NO_SSLv3 SSL_OP_BIT(25) +#define SSL_OP_NO_TLSv1 SSL_OP_BIT(26) +#define SSL_OP_NO_TLSv1_2 SSL_OP_BIT(27) +#define SSL_OP_NO_TLSv1_1 SSL_OP_BIT(28) +#define SSL_OP_NO_TLSv1_3 SSL_OP_BIT(29) +#define SSL_OP_NO_DTLSv1 SSL_OP_BIT(26) +#define SSL_OP_NO_DTLSv1_2 SSL_OP_BIT(27) +/* Disallow all renegotiation */ +#define SSL_OP_NO_RENEGOTIATION SSL_OP_BIT(30) +/* + * Make server add server-hello extension from early version of + * cryptopro draft, when GOST ciphersuite is negotiated. Required for + * interoperability with CryptoPro CSP 3.x + */ +#define SSL_OP_CRYPTOPRO_TLSEXT_BUG SSL_OP_BIT(31) +/* + * Disable RFC8879 certificate compression + * SSL_OP_NO_TX_CERTIFICATE_COMPRESSION: don't send compressed certificates, + * and ignore the extension when received. + * SSL_OP_NO_RX_CERTIFICATE_COMPRESSION: don't send the extension, and + * subsequently indicating that receiving is not supported + */ +#define SSL_OP_NO_TX_CERTIFICATE_COMPRESSION SSL_OP_BIT(32) +#define SSL_OP_NO_RX_CERTIFICATE_COMPRESSION SSL_OP_BIT(33) +/* Enable KTLS TX zerocopy on Linux */ +#define SSL_OP_ENABLE_KTLS_TX_ZEROCOPY_SENDFILE SSL_OP_BIT(34) + +#define SSL_OP_PREFER_NO_DHE_KEX SSL_OP_BIT(35) + +/* + * Option "collections." + */ +#define SSL_OP_NO_SSL_MASK \ + (SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 \ + | SSL_OP_NO_TLSv1_2 | SSL_OP_NO_TLSv1_3) +#define SSL_OP_NO_DTLS_MASK \ + (SSL_OP_NO_DTLSv1 | SSL_OP_NO_DTLSv1_2) + +/* Various bug workarounds that should be rather harmless. */ +#define SSL_OP_ALL \ + (SSL_OP_CRYPTOPRO_TLSEXT_BUG | SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS \ + | SSL_OP_TLSEXT_PADDING | SSL_OP_SAFARI_ECDHE_ECDSA_BUG) + +/* + * OBSOLETE OPTIONS retained for compatibility + */ + +#define SSL_OP_MICROSOFT_SESS_ID_BUG 0x0 +#define SSL_OP_NETSCAPE_CHALLENGE_BUG 0x0 +#define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x0 +#define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x0 +#define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0x0 +#define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x0 +#define SSL_OP_SSLEAY_080_CLIENT_DH_BUG 0x0 +#define SSL_OP_TLS_D5_BUG 0x0 +#define SSL_OP_TLS_BLOCK_PADDING_BUG 0x0 +#define SSL_OP_SINGLE_ECDH_USE 0x0 +#define SSL_OP_SINGLE_DH_USE 0x0 +#define SSL_OP_EPHEMERAL_RSA 0x0 +#define SSL_OP_NO_SSLv2 0x0 +#define SSL_OP_PKCS1_CHECK_1 0x0 +#define SSL_OP_PKCS1_CHECK_2 0x0 +#define SSL_OP_NETSCAPE_CA_DN_BUG 0x0 +#define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG 0x0 + +/* + * Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success + * when just a single record has been written): + */ +#define SSL_MODE_ENABLE_PARTIAL_WRITE 0x00000001U +/* + * Make it possible to retry SSL_write() with changed buffer location (buffer + * contents must stay the same!); this is not the default to avoid the + * misconception that non-blocking SSL_write() behaves like non-blocking + * write(): + */ +#define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002U +/* + * Never bother the application with retries if the transport is blocking: + */ +#define SSL_MODE_AUTO_RETRY 0x00000004U +/* Don't attempt to automatically build certificate chain */ +#define SSL_MODE_NO_AUTO_CHAIN 0x00000008U +/* + * Save RAM by releasing read and write buffers when they're empty. (SSL3 and + * TLS only.) Released buffers are freed. + */ +#define SSL_MODE_RELEASE_BUFFERS 0x00000010U +/* + * Send the current time in the Random fields of the ClientHello and + * ServerHello records for compatibility with hypothetical implementations + * that require it. + */ +#define SSL_MODE_SEND_CLIENTHELLO_TIME 0x00000020U +#define SSL_MODE_SEND_SERVERHELLO_TIME 0x00000040U +/* + * Send TLS_FALLBACK_SCSV in the ClientHello. To be set only by applications + * that reconnect with a downgraded protocol version; see + * draft-ietf-tls-downgrade-scsv-00 for details. DO NOT ENABLE THIS if your + * application attempts a normal handshake. Only use this in explicit + * fallback retries, following the guidance in + * draft-ietf-tls-downgrade-scsv-00. + */ +#define SSL_MODE_SEND_FALLBACK_SCSV 0x00000080U +/* + * Support Asynchronous operation + */ +#define SSL_MODE_ASYNC 0x00000100U + +/* + * When using DTLS/SCTP, include the terminating zero in the label + * used for computing the endpoint-pair shared secret. Required for + * interoperability with implementations having this bug like these + * older version of OpenSSL: + * - OpenSSL 1.0.0 series + * - OpenSSL 1.0.1 series + * - OpenSSL 1.0.2 series + * - OpenSSL 1.1.0 series + * - OpenSSL 1.1.1 and 1.1.1a + */ +#define SSL_MODE_DTLS_SCTP_LABEL_LENGTH_BUG 0x00000400U + +/* Cert related flags */ +/* + * Many implementations ignore some aspects of the TLS standards such as + * enforcing certificate chain algorithms. When this is set we enforce them. + */ +#define SSL_CERT_FLAG_TLS_STRICT 0x00000001U + +/* Suite B modes, takes same values as certificate verify flags */ +#define SSL_CERT_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +#define SSL_CERT_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +#define SSL_CERT_FLAG_SUITEB_128_LOS 0x30000 + +/* Perform all sorts of protocol violations for testing purposes */ +#define SSL_CERT_FLAG_BROKEN_PROTOCOL 0x10000000 + +/* Flags for building certificate chains */ +/* Treat any existing certificates as untrusted CAs */ +#define SSL_BUILD_CHAIN_FLAG_UNTRUSTED 0x1 +/* Don't include root CA in chain */ +#define SSL_BUILD_CHAIN_FLAG_NO_ROOT 0x2 +/* Just check certificates already there */ +#define SSL_BUILD_CHAIN_FLAG_CHECK 0x4 +/* Ignore verification errors */ +#define SSL_BUILD_CHAIN_FLAG_IGNORE_ERROR 0x8 +/* Clear verification errors from queue */ +#define SSL_BUILD_CHAIN_FLAG_CLEAR_ERROR 0x10 + +/* Flags returned by SSL_check_chain */ +/* Certificate can be used with this session */ +#define CERT_PKEY_VALID 0x1 +/* Certificate can also be used for signing */ +#define CERT_PKEY_SIGN 0x2 +/* EE certificate signing algorithm OK */ +#define CERT_PKEY_EE_SIGNATURE 0x10 +/* CA signature algorithms OK */ +#define CERT_PKEY_CA_SIGNATURE 0x20 +/* EE certificate parameters OK */ +#define CERT_PKEY_EE_PARAM 0x40 +/* CA certificate parameters OK */ +#define CERT_PKEY_CA_PARAM 0x80 +/* Signing explicitly allowed as opposed to SHA1 fallback */ +#define CERT_PKEY_EXPLICIT_SIGN 0x100 +/* Client CA issuer names match (always set for server cert) */ +#define CERT_PKEY_ISSUER_NAME 0x200 +/* Cert type matches client types (always set for server cert) */ +#define CERT_PKEY_CERT_TYPE 0x400 +/* Cert chain suitable to Suite B */ +#define CERT_PKEY_SUITEB 0x800 +/* Cert pkey valid for raw public key use */ +#define CERT_PKEY_RPK 0x1000 + +#define SSL_CONF_FLAG_CMDLINE 0x1 +#define SSL_CONF_FLAG_FILE 0x2 +#define SSL_CONF_FLAG_CLIENT 0x4 +#define SSL_CONF_FLAG_SERVER 0x8 +#define SSL_CONF_FLAG_SHOW_ERRORS 0x10 +#define SSL_CONF_FLAG_CERTIFICATE 0x20 +#define SSL_CONF_FLAG_REQUIRE_PRIVATE 0x40 +/* Configuration value types */ +#define SSL_CONF_TYPE_UNKNOWN 0x0 +#define SSL_CONF_TYPE_STRING 0x1 +#define SSL_CONF_TYPE_FILE 0x2 +#define SSL_CONF_TYPE_DIR 0x3 +#define SSL_CONF_TYPE_NONE 0x4 +#define SSL_CONF_TYPE_STORE 0x5 + +/* Maximum length of the application-controlled segment of a a TLSv1.3 cookie */ +#define SSL_COOKIE_LENGTH 4096 + +/* + * Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value, they + * cannot be used to clear bits. + */ + +uint64_t SSL_CTX_get_options(const SSL_CTX *ctx); +uint64_t SSL_get_options(const SSL *s); +uint64_t SSL_CTX_clear_options(SSL_CTX *ctx, uint64_t op); +uint64_t SSL_clear_options(SSL *s, uint64_t op); +uint64_t SSL_CTX_set_options(SSL_CTX *ctx, uint64_t op); +uint64_t SSL_set_options(SSL *s, uint64_t op); + +#define SSL_CTX_set_mode(ctx, op) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_MODE, (op), NULL) +#define SSL_CTX_clear_mode(ctx, op) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_CLEAR_MODE, (op), NULL) +#define SSL_CTX_get_mode(ctx) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_MODE, 0, NULL) +#define SSL_clear_mode(ssl, op) \ + SSL_ctrl((ssl), SSL_CTRL_CLEAR_MODE, (op), NULL) +#define SSL_set_mode(ssl, op) \ + SSL_ctrl((ssl), SSL_CTRL_MODE, (op), NULL) +#define SSL_get_mode(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_MODE, 0, NULL) +#define SSL_set_mtu(ssl, mtu) \ + SSL_ctrl((ssl), SSL_CTRL_SET_MTU, (mtu), NULL) +#define DTLS_set_link_mtu(ssl, mtu) \ + SSL_ctrl((ssl), DTLS_CTRL_SET_LINK_MTU, (mtu), NULL) +#define DTLS_get_link_min_mtu(ssl) \ + SSL_ctrl((ssl), DTLS_CTRL_GET_LINK_MIN_MTU, 0, NULL) + +#define SSL_get_secure_renegotiation_support(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_GET_RI_SUPPORT, 0, NULL) + +#define SSL_CTX_set_cert_flags(ctx, op) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_CERT_FLAGS, (op), NULL) +#define SSL_set_cert_flags(s, op) \ + SSL_ctrl((s), SSL_CTRL_CERT_FLAGS, (op), NULL) +#define SSL_CTX_clear_cert_flags(ctx, op) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_CLEAR_CERT_FLAGS, (op), NULL) +#define SSL_clear_cert_flags(s, op) \ + SSL_ctrl((s), SSL_CTRL_CLEAR_CERT_FLAGS, (op), NULL) + +void SSL_CTX_set_msg_callback(SSL_CTX *ctx, + void (*cb)(int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +void SSL_set_msg_callback(SSL *ssl, + void (*cb)(int write_p, int version, + int content_type, const void *buf, + size_t len, SSL *ssl, void *arg)); +#define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) +#define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg)) + +#define SSL_get_extms_support(s) \ + SSL_ctrl((s), SSL_CTRL_GET_EXTMS_SUPPORT, 0, NULL) + +#ifndef OPENSSL_NO_SRP +/* see tls_srp.c */ +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 __owur int SSL_SRP_CTX_init(SSL *s); +OSSL_DEPRECATEDIN_3_0 __owur int SSL_CTX_SRP_CTX_init(SSL_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 int SSL_SRP_CTX_free(SSL *ctx); +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_SRP_CTX_free(SSL_CTX *ctx); +OSSL_DEPRECATEDIN_3_0 __owur int SSL_srp_server_param_with_username(SSL *s, + int *ad); +OSSL_DEPRECATEDIN_3_0 __owur int SRP_Calc_A_param(SSL *s); +#endif +#endif + +/* 100k max cert list */ +#define SSL_MAX_CERT_LIST_DEFAULT (1024 * 100) + +#define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT (1024 * 20) + +/* + * This callback type is used inside SSL_CTX, SSL, and in the functions that + * set them. It is used to override the generation of SSL/TLS session IDs in + * a server. Return value should be zero on an error, non-zero to proceed. + * Also, callbacks should themselves check if the id they generate is unique + * otherwise the SSL handshake will fail with an error - callbacks can do + * this using the 'ssl' value they're passed by; + * SSL_has_matching_session_id(ssl, id, *id_len) The length value passed in + * is set at the maximum size the session ID can be. In SSLv3/TLSv1 it is 32 + * bytes. The callback can alter this length to be less if desired. It is + * also an error for the callback to set the size to zero. + */ +typedef int (*GEN_SESSION_CB)(SSL *ssl, unsigned char *id, + unsigned int *id_len); + +#define SSL_SESS_CACHE_OFF 0x0000 +#define SSL_SESS_CACHE_CLIENT 0x0001 +#define SSL_SESS_CACHE_SERVER 0x0002 +#define SSL_SESS_CACHE_BOTH (SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_SERVER) +#define SSL_SESS_CACHE_NO_AUTO_CLEAR 0x0080 +/* enough comments already ... see SSL_CTX_set_session_cache_mode(3) */ +#define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP 0x0100 +#define SSL_SESS_CACHE_NO_INTERNAL_STORE 0x0200 +#define SSL_SESS_CACHE_NO_INTERNAL \ + (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP | SSL_SESS_CACHE_NO_INTERNAL_STORE) +#define SSL_SESS_CACHE_UPDATE_TIME 0x0400 + +LHASH_OF(SSL_SESSION) *SSL_CTX_sessions(SSL_CTX *ctx); +#define SSL_CTX_sess_number(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_NUMBER, 0, NULL) +#define SSL_CTX_sess_connect(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_CONNECT, 0, NULL) +#define SSL_CTX_sess_connect_good(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_CONNECT_GOOD, 0, NULL) +#define SSL_CTX_sess_connect_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_CONNECT_RENEGOTIATE, 0, NULL) +#define SSL_CTX_sess_accept(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_ACCEPT, 0, NULL) +#define SSL_CTX_sess_accept_renegotiate(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_ACCEPT_RENEGOTIATE, 0, NULL) +#define SSL_CTX_sess_accept_good(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_ACCEPT_GOOD, 0, NULL) +#define SSL_CTX_sess_hits(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_HIT, 0, NULL) +#define SSL_CTX_sess_cb_hits(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_CB_HIT, 0, NULL) +#define SSL_CTX_sess_misses(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_MISSES, 0, NULL) +#define SSL_CTX_sess_timeouts(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_TIMEOUTS, 0, NULL) +#define SSL_CTX_sess_cache_full(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SESS_CACHE_FULL, 0, NULL) + +void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, + int (*new_session_cb)(struct ssl_st *ssl, + SSL_SESSION *sess)); +int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx))(struct ssl_st *ssl, + SSL_SESSION *sess); +void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, + void (*remove_session_cb)(struct ssl_ctx_st + *ctx, + SSL_SESSION *sess)); +void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx))(struct ssl_ctx_st *ctx, + SSL_SESSION *sess); +void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, + SSL_SESSION *(*get_session_cb)(struct ssl_st + *ssl, + const unsigned char + *data, + int len, + int *copy)); +SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx))(struct ssl_st *ssl, + const unsigned char *data, + int len, int *copy); +void SSL_CTX_set_info_callback(SSL_CTX *ctx, + void (*cb)(const SSL *ssl, int type, int val)); +void (*SSL_CTX_get_info_callback(SSL_CTX *ctx))(const SSL *ssl, int type, + int val); +void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, + int (*client_cert_cb)(SSL *ssl, X509 **x509, + EVP_PKEY **pkey)); +int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx))(SSL *ssl, X509 **x509, + EVP_PKEY **pkey); +#ifndef OPENSSL_NO_ENGINE +__owur int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e); +#endif +void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, + int (*app_gen_cookie_cb)(SSL *ssl, + unsigned char + *cookie, + unsigned int + *cookie_len)); +void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, + int (*app_verify_cookie_cb)(SSL *ssl, + const unsigned char *cookie, + unsigned int + cookie_len)); + +void SSL_CTX_set_stateless_cookie_generate_cb( + SSL_CTX *ctx, + int (*gen_stateless_cookie_cb)(SSL *ssl, + unsigned char *cookie, + size_t *cookie_len)); +void SSL_CTX_set_stateless_cookie_verify_cb( + SSL_CTX *ctx, + int (*verify_stateless_cookie_cb)(SSL *ssl, + const unsigned char *cookie, + size_t cookie_len)); +#ifndef OPENSSL_NO_NEXTPROTONEG + +typedef int (*SSL_CTX_npn_advertised_cb_func)(SSL *ssl, + const unsigned char **out, + unsigned int *outlen, + void *arg); +void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *s, + SSL_CTX_npn_advertised_cb_func cb, + void *arg); +#define SSL_CTX_set_npn_advertised_cb SSL_CTX_set_next_protos_advertised_cb + +typedef int (*SSL_CTX_npn_select_cb_func)(SSL *s, + unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg); +void SSL_CTX_set_next_proto_select_cb(SSL_CTX *s, + SSL_CTX_npn_select_cb_func cb, + void *arg); +#define SSL_CTX_set_npn_select_cb SSL_CTX_set_next_proto_select_cb + +void SSL_get0_next_proto_negotiated(const SSL *s, const unsigned char **data, + unsigned *len); +#define SSL_get0_npn_negotiated SSL_get0_next_proto_negotiated +#endif + +__owur int SSL_select_next_proto(unsigned char **out, unsigned char *outlen, + const unsigned char *in, unsigned int inlen, + const unsigned char *client, + unsigned int client_len); + +#define OPENSSL_NPN_UNSUPPORTED 0 +#define OPENSSL_NPN_NEGOTIATED 1 +#define OPENSSL_NPN_NO_OVERLAP 2 + +__owur int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, + unsigned int protos_len); +__owur int SSL_set_alpn_protos(SSL *ssl, const unsigned char *protos, + unsigned int protos_len); +typedef int (*SSL_CTX_alpn_select_cb_func)(SSL *ssl, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg); +void SSL_CTX_set_alpn_select_cb(SSL_CTX *ctx, + SSL_CTX_alpn_select_cb_func cb, + void *arg); +void SSL_get0_alpn_selected(const SSL *ssl, const unsigned char **data, + unsigned int *len); + +#ifndef OPENSSL_NO_PSK +/* + * the maximum length of the buffer given to callbacks containing the + * resulting identity/psk + */ +#define PSK_MAX_IDENTITY_LEN 256 +#define PSK_MAX_PSK_LEN 512 +typedef unsigned int (*SSL_psk_client_cb_func)(SSL *ssl, + const char *hint, + char *identity, + unsigned int max_identity_len, + unsigned char *psk, + unsigned int max_psk_len); +void SSL_CTX_set_psk_client_callback(SSL_CTX *ctx, SSL_psk_client_cb_func cb); +void SSL_set_psk_client_callback(SSL *ssl, SSL_psk_client_cb_func cb); + +typedef unsigned int (*SSL_psk_server_cb_func)(SSL *ssl, + const char *identity, + unsigned char *psk, + unsigned int max_psk_len); +void SSL_CTX_set_psk_server_callback(SSL_CTX *ctx, SSL_psk_server_cb_func cb); +void SSL_set_psk_server_callback(SSL *ssl, SSL_psk_server_cb_func cb); + +__owur int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint); +__owur int SSL_use_psk_identity_hint(SSL *s, const char *identity_hint); +const char *SSL_get_psk_identity_hint(const SSL *s); +const char *SSL_get_psk_identity(const SSL *s); +#endif + +typedef int (*SSL_psk_find_session_cb_func)(SSL *ssl, + const unsigned char *identity, + size_t identity_len, + SSL_SESSION **sess); +typedef int (*SSL_psk_use_session_cb_func)(SSL *ssl, const EVP_MD *md, + const unsigned char **id, + size_t *idlen, + SSL_SESSION **sess); + +void SSL_set_psk_find_session_callback(SSL *s, SSL_psk_find_session_cb_func cb); +void SSL_CTX_set_psk_find_session_callback(SSL_CTX *ctx, + SSL_psk_find_session_cb_func cb); +void SSL_set_psk_use_session_callback(SSL *s, SSL_psk_use_session_cb_func cb); +void SSL_CTX_set_psk_use_session_callback(SSL_CTX *ctx, + SSL_psk_use_session_cb_func cb); + +/* Register callbacks to handle custom TLS Extensions for client or server. */ + +__owur int SSL_CTX_has_client_custom_ext(const SSL_CTX *ctx, + unsigned int ext_type); + +__owur int SSL_CTX_add_client_custom_ext(SSL_CTX *ctx, + unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +__owur int SSL_CTX_add_server_custom_ext(SSL_CTX *ctx, + unsigned int ext_type, + custom_ext_add_cb add_cb, + custom_ext_free_cb free_cb, + void *add_arg, + custom_ext_parse_cb parse_cb, + void *parse_arg); + +__owur int SSL_CTX_add_custom_ext(SSL_CTX *ctx, unsigned int ext_type, + unsigned int context, + SSL_custom_ext_add_cb_ex add_cb, + SSL_custom_ext_free_cb_ex free_cb, + void *add_arg, + SSL_custom_ext_parse_cb_ex parse_cb, + void *parse_arg); + +__owur int SSL_extension_supported(unsigned int ext_type); + +#define SSL_NOTHING 1 +#define SSL_WRITING 2 +#define SSL_READING 3 +#define SSL_X509_LOOKUP 4 +#define SSL_ASYNC_PAUSED 5 +#define SSL_ASYNC_NO_JOBS 6 +#define SSL_CLIENT_HELLO_CB 7 +#define SSL_RETRY_VERIFY 8 + +/* These will only be used when doing non-blocking IO */ +#define SSL_want_nothing(s) (SSL_want(s) == SSL_NOTHING) +#define SSL_want_read(s) (SSL_want(s) == SSL_READING) +#define SSL_want_write(s) (SSL_want(s) == SSL_WRITING) +#define SSL_want_x509_lookup(s) (SSL_want(s) == SSL_X509_LOOKUP) +#define SSL_want_retry_verify(s) (SSL_want(s) == SSL_RETRY_VERIFY) +#define SSL_want_async(s) (SSL_want(s) == SSL_ASYNC_PAUSED) +#define SSL_want_async_job(s) (SSL_want(s) == SSL_ASYNC_NO_JOBS) +#define SSL_want_client_hello_cb(s) (SSL_want(s) == SSL_CLIENT_HELLO_CB) + +#define SSL_MAC_FLAG_READ_MAC_STREAM 1 +#define SSL_MAC_FLAG_WRITE_MAC_STREAM 2 +#define SSL_MAC_FLAG_READ_MAC_TLSTREE 4 +#define SSL_MAC_FLAG_WRITE_MAC_TLSTREE 8 + +/* + * A callback for logging out TLS key material. This callback should log out + * |line| followed by a newline. + */ +typedef void (*SSL_CTX_keylog_cb_func)(const SSL *ssl, const char *line); + +/* + * SSL_CTX_set_keylog_callback configures a callback to log key material. This + * is intended for debugging use with tools like Wireshark. The cb function + * should log line followed by a newline. + */ +void SSL_CTX_set_keylog_callback(SSL_CTX *ctx, SSL_CTX_keylog_cb_func cb); + +/* + * SSL_CTX_get_keylog_callback returns the callback configured by + * SSL_CTX_set_keylog_callback. + */ +SSL_CTX_keylog_cb_func SSL_CTX_get_keylog_callback(const SSL_CTX *ctx); + +int SSL_CTX_set_max_early_data(SSL_CTX *ctx, uint32_t max_early_data); +uint32_t SSL_CTX_get_max_early_data(const SSL_CTX *ctx); +int SSL_set_max_early_data(SSL *s, uint32_t max_early_data); +uint32_t SSL_get_max_early_data(const SSL *s); +int SSL_CTX_set_recv_max_early_data(SSL_CTX *ctx, uint32_t recv_max_early_data); +uint32_t SSL_CTX_get_recv_max_early_data(const SSL_CTX *ctx); +int SSL_set_recv_max_early_data(SSL *s, uint32_t recv_max_early_data); +uint32_t SSL_get_recv_max_early_data(const SSL *s); + +#ifdef __cplusplus +} +#endif + +#include +#include +#include /* This is mostly sslv3 with a few tweaks */ +#include /* Datagram TLS */ +#include /* Support for the use_srtp extension */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * These need to be after the above set of includes due to a compiler bug + * in VisualStudio 2015 + */ +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SSL_CIPHER, const SSL_CIPHER, SSL_CIPHER) +#define sk_SSL_CIPHER_num(sk) OPENSSL_sk_num(ossl_check_const_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_value(sk, idx) ((const SSL_CIPHER *)OPENSSL_sk_value(ossl_check_const_SSL_CIPHER_sk_type(sk), (idx))) +#define sk_SSL_CIPHER_new(cmp) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new(ossl_check_SSL_CIPHER_compfunc_type(cmp))) +#define sk_SSL_CIPHER_new_null() ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new_null()) +#define sk_SSL_CIPHER_new_reserve(cmp, n) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_new_reserve(ossl_check_SSL_CIPHER_compfunc_type(cmp), (n))) +#define sk_SSL_CIPHER_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SSL_CIPHER_sk_type(sk), (n)) +#define sk_SSL_CIPHER_free(sk) OPENSSL_sk_free(ossl_check_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_zero(sk) OPENSSL_sk_zero(ossl_check_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_delete(sk, i) ((const SSL_CIPHER *)OPENSSL_sk_delete(ossl_check_SSL_CIPHER_sk_type(sk), (i))) +#define sk_SSL_CIPHER_delete_ptr(sk, ptr) ((const SSL_CIPHER *)OPENSSL_sk_delete_ptr(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr))) +#define sk_SSL_CIPHER_push(sk, ptr) OPENSSL_sk_push(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)) +#define sk_SSL_CIPHER_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)) +#define sk_SSL_CIPHER_pop(sk) ((const SSL_CIPHER *)OPENSSL_sk_pop(ossl_check_SSL_CIPHER_sk_type(sk))) +#define sk_SSL_CIPHER_shift(sk) ((const SSL_CIPHER *)OPENSSL_sk_shift(ossl_check_SSL_CIPHER_sk_type(sk))) +#define sk_SSL_CIPHER_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SSL_CIPHER_sk_type(sk),ossl_check_SSL_CIPHER_freefunc_type(freefunc)) +#define sk_SSL_CIPHER_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr), (idx)) +#define sk_SSL_CIPHER_set(sk, idx, ptr) ((const SSL_CIPHER *)OPENSSL_sk_set(ossl_check_SSL_CIPHER_sk_type(sk), (idx), ossl_check_SSL_CIPHER_type(ptr))) +#define sk_SSL_CIPHER_find(sk, ptr) OPENSSL_sk_find(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)) +#define sk_SSL_CIPHER_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr)) +#define sk_SSL_CIPHER_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_type(ptr), pnum) +#define sk_SSL_CIPHER_sort(sk) OPENSSL_sk_sort(ossl_check_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SSL_CIPHER_sk_type(sk)) +#define sk_SSL_CIPHER_dup(sk) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_dup(ossl_check_const_SSL_CIPHER_sk_type(sk))) +#define sk_SSL_CIPHER_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SSL_CIPHER) *)OPENSSL_sk_deep_copy(ossl_check_const_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_copyfunc_type(copyfunc), ossl_check_SSL_CIPHER_freefunc_type(freefunc))) +#define sk_SSL_CIPHER_set_cmp_func(sk, cmp) ((sk_SSL_CIPHER_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SSL_CIPHER_sk_type(sk), ossl_check_SSL_CIPHER_compfunc_type(cmp))) + +/* clang-format on */ + +/* compatibility */ +#define SSL_set_app_data(s, arg) (SSL_set_ex_data(s, 0, (char *)(arg))) +#define SSL_get_app_data(s) (SSL_get_ex_data(s, 0)) +#define SSL_SESSION_set_app_data(s, a) (SSL_SESSION_set_ex_data(s, 0, \ + (char *)(a))) +#define SSL_SESSION_get_app_data(s) (SSL_SESSION_get_ex_data(s, 0)) +#define SSL_CTX_get_app_data(ctx) (SSL_CTX_get_ex_data(ctx, 0)) +#define SSL_CTX_set_app_data(ctx, arg) (SSL_CTX_set_ex_data(ctx, 0, \ + (char *)(arg))) +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 void SSL_set_debug(SSL *s, int debug); +#endif + +/* TLSv1.3 KeyUpdate message types */ +/* -1 used so that this is an invalid value for the on-the-wire protocol */ +#define SSL_KEY_UPDATE_NONE -1 +/* Values as defined for the on-the-wire protocol */ +#define SSL_KEY_UPDATE_NOT_REQUESTED 0 +#define SSL_KEY_UPDATE_REQUESTED 1 + +/* + * The valid handshake states (one for each type message sent and one for each + * type of message received). There are also two "special" states: + * TLS = TLS or DTLS state + * DTLS = DTLS specific state + * CR/SR = Client Read/Server Read + * CW/SW = Client Write/Server Write + * + * The "special" states are: + * TLS_ST_BEFORE = No handshake has been initiated yet + * TLS_ST_OK = A handshake has been successfully completed + */ +typedef enum { + TLS_ST_BEFORE, + TLS_ST_OK, + DTLS_ST_CR_HELLO_VERIFY_REQUEST, + TLS_ST_CR_SRVR_HELLO, + TLS_ST_CR_CERT, + TLS_ST_CR_COMP_CERT, + TLS_ST_CR_CERT_STATUS, + TLS_ST_CR_KEY_EXCH, + TLS_ST_CR_CERT_REQ, + TLS_ST_CR_SRVR_DONE, + TLS_ST_CR_SESSION_TICKET, + TLS_ST_CR_CHANGE, + TLS_ST_CR_FINISHED, + TLS_ST_CW_CLNT_HELLO, + TLS_ST_CW_CERT, + TLS_ST_CW_COMP_CERT, + TLS_ST_CW_KEY_EXCH, + TLS_ST_CW_CERT_VRFY, + TLS_ST_CW_CHANGE, + TLS_ST_CW_NEXT_PROTO, + TLS_ST_CW_FINISHED, + TLS_ST_SW_HELLO_REQ, + TLS_ST_SR_CLNT_HELLO, + DTLS_ST_SW_HELLO_VERIFY_REQUEST, + TLS_ST_SW_SRVR_HELLO, + TLS_ST_SW_CERT, + TLS_ST_SW_COMP_CERT, + TLS_ST_SW_KEY_EXCH, + TLS_ST_SW_CERT_REQ, + TLS_ST_SW_SRVR_DONE, + TLS_ST_SR_CERT, + TLS_ST_SR_COMP_CERT, + TLS_ST_SR_KEY_EXCH, + TLS_ST_SR_CERT_VRFY, + TLS_ST_SR_NEXT_PROTO, + TLS_ST_SR_CHANGE, + TLS_ST_SR_FINISHED, + TLS_ST_SW_SESSION_TICKET, + TLS_ST_SW_CERT_STATUS, + TLS_ST_SW_CHANGE, + TLS_ST_SW_FINISHED, + TLS_ST_SW_ENCRYPTED_EXTENSIONS, + TLS_ST_CR_ENCRYPTED_EXTENSIONS, + TLS_ST_CR_CERT_VRFY, + TLS_ST_SW_CERT_VRFY, + TLS_ST_CR_HELLO_REQ, + TLS_ST_SW_KEY_UPDATE, + TLS_ST_CW_KEY_UPDATE, + TLS_ST_SR_KEY_UPDATE, + TLS_ST_CR_KEY_UPDATE, + TLS_ST_EARLY_DATA, + TLS_ST_PENDING_EARLY_DATA_END, + TLS_ST_CW_END_OF_EARLY_DATA, + TLS_ST_SR_END_OF_EARLY_DATA +} OSSL_HANDSHAKE_STATE; + +/* + * Most of the following state values are no longer used and are defined to be + * the closest equivalent value in the current state machine code. Not all + * defines have an equivalent and are set to a dummy value (-1). SSL_ST_CONNECT + * and SSL_ST_ACCEPT are still in use in the definition of SSL_CB_ACCEPT_LOOP, + * SSL_CB_ACCEPT_EXIT, SSL_CB_CONNECT_LOOP and SSL_CB_CONNECT_EXIT. + */ + +#define SSL_ST_CONNECT 0x1000 +#define SSL_ST_ACCEPT 0x2000 + +#define SSL_ST_MASK 0x0FFF + +#define SSL_CB_LOOP 0x01 +#define SSL_CB_EXIT 0x02 +#define SSL_CB_READ 0x04 +#define SSL_CB_WRITE 0x08 +#define SSL_CB_ALERT 0x4000 /* used in callback */ +#define SSL_CB_READ_ALERT (SSL_CB_ALERT | SSL_CB_READ) +#define SSL_CB_WRITE_ALERT (SSL_CB_ALERT | SSL_CB_WRITE) +#define SSL_CB_ACCEPT_LOOP (SSL_ST_ACCEPT | SSL_CB_LOOP) +#define SSL_CB_ACCEPT_EXIT (SSL_ST_ACCEPT | SSL_CB_EXIT) +#define SSL_CB_CONNECT_LOOP (SSL_ST_CONNECT | SSL_CB_LOOP) +#define SSL_CB_CONNECT_EXIT (SSL_ST_CONNECT | SSL_CB_EXIT) +#define SSL_CB_HANDSHAKE_START 0x10 +#define SSL_CB_HANDSHAKE_DONE 0x20 + +/* Is the SSL_connection established? */ +#define SSL_in_connect_init(a) (SSL_in_init(a) && !SSL_is_server(a)) +#define SSL_in_accept_init(a) (SSL_in_init(a) && SSL_is_server(a)) +int SSL_in_init(const SSL *s); +int SSL_in_before(const SSL *s); +int SSL_is_init_finished(const SSL *s); + +/* + * The following 3 states are kept in ssl->rlayer.rstate when reads fail, you + * should not need these + */ +#define SSL_ST_READ_HEADER 0xF0 +#define SSL_ST_READ_BODY 0xF1 +#define SSL_ST_READ_DONE 0xF2 + +/*- + * Obtain latest Finished message + * -- that we sent (SSL_get_finished) + * -- that we expected from peer (SSL_get_peer_finished). + * Returns length (0 == no Finished so far), copies up to 'count' bytes. + */ +size_t SSL_get_finished(const SSL *s, void *buf, size_t count); +size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count); + +/* + * use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 3 options are + * 'ored' with SSL_VERIFY_PEER if they are desired + */ +#define SSL_VERIFY_NONE 0x00 +#define SSL_VERIFY_PEER 0x01 +#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 +#define SSL_VERIFY_CLIENT_ONCE 0x04 +#define SSL_VERIFY_POST_HANDSHAKE 0x08 + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define OpenSSL_add_ssl_algorithms() SSL_library_init() +#define SSLeay_add_ssl_algorithms() SSL_library_init() +#endif + +/* More backward compatibility */ +#define SSL_get_cipher(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +#define SSL_get_cipher_bits(s, np) \ + SSL_CIPHER_get_bits(SSL_get_current_cipher(s), np) +#define SSL_get_cipher_version(s) \ + SSL_CIPHER_get_version(SSL_get_current_cipher(s)) +#define SSL_get_cipher_name(s) \ + SSL_CIPHER_get_name(SSL_get_current_cipher(s)) +#define SSL_get_time(a) SSL_SESSION_get_time(a) +#define SSL_set_time(a, b) SSL_SESSION_set_time((a), (b)) +#define SSL_get_timeout(a) SSL_SESSION_get_timeout(a) +#define SSL_set_timeout(a, b) SSL_SESSION_set_timeout((a), (b)) + +#define d2i_SSL_SESSION_bio(bp, s_id) ASN1_d2i_bio_of(SSL_SESSION, SSL_SESSION_new, d2i_SSL_SESSION, bp, s_id) +#define i2d_SSL_SESSION_bio(bp, s_id) ASN1_i2d_bio_of(SSL_SESSION, i2d_SSL_SESSION, bp, s_id) + +DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) +#define SSL_AD_REASON_OFFSET 1000 /* offset to get SSL_R_... value \ + * from SSL_AD_... */ +/* These alert types are for SSLv3 and TLSv1 */ +#define SSL_AD_CLOSE_NOTIFY SSL3_AD_CLOSE_NOTIFY +/* fatal */ +#define SSL_AD_UNEXPECTED_MESSAGE SSL3_AD_UNEXPECTED_MESSAGE +/* fatal */ +#define SSL_AD_BAD_RECORD_MAC SSL3_AD_BAD_RECORD_MAC +#define SSL_AD_DECRYPTION_FAILED TLS1_AD_DECRYPTION_FAILED +#define SSL_AD_RECORD_OVERFLOW TLS1_AD_RECORD_OVERFLOW +/* fatal */ +#define SSL_AD_DECOMPRESSION_FAILURE SSL3_AD_DECOMPRESSION_FAILURE +/* fatal */ +#define SSL_AD_HANDSHAKE_FAILURE SSL3_AD_HANDSHAKE_FAILURE +/* Not for TLS */ +#define SSL_AD_NO_CERTIFICATE SSL3_AD_NO_CERTIFICATE +#define SSL_AD_BAD_CERTIFICATE SSL3_AD_BAD_CERTIFICATE +#define SSL_AD_UNSUPPORTED_CERTIFICATE SSL3_AD_UNSUPPORTED_CERTIFICATE +#define SSL_AD_CERTIFICATE_REVOKED SSL3_AD_CERTIFICATE_REVOKED +#define SSL_AD_CERTIFICATE_EXPIRED SSL3_AD_CERTIFICATE_EXPIRED +#define SSL_AD_CERTIFICATE_UNKNOWN SSL3_AD_CERTIFICATE_UNKNOWN +/* fatal */ +#define SSL_AD_ILLEGAL_PARAMETER SSL3_AD_ILLEGAL_PARAMETER +/* fatal */ +#define SSL_AD_UNKNOWN_CA TLS1_AD_UNKNOWN_CA +/* fatal */ +#define SSL_AD_ACCESS_DENIED TLS1_AD_ACCESS_DENIED +/* fatal */ +#define SSL_AD_DECODE_ERROR TLS1_AD_DECODE_ERROR +#define SSL_AD_DECRYPT_ERROR TLS1_AD_DECRYPT_ERROR +/* fatal */ +#define SSL_AD_EXPORT_RESTRICTION TLS1_AD_EXPORT_RESTRICTION +/* fatal */ +#define SSL_AD_PROTOCOL_VERSION TLS1_AD_PROTOCOL_VERSION +/* fatal */ +#define SSL_AD_INSUFFICIENT_SECURITY TLS1_AD_INSUFFICIENT_SECURITY +/* fatal */ +#define SSL_AD_INTERNAL_ERROR TLS1_AD_INTERNAL_ERROR +#define SSL_AD_USER_CANCELLED TLS1_AD_USER_CANCELLED +#define SSL_AD_NO_RENEGOTIATION TLS1_AD_NO_RENEGOTIATION +#define SSL_AD_MISSING_EXTENSION TLS13_AD_MISSING_EXTENSION +#define SSL_AD_CERTIFICATE_REQUIRED TLS13_AD_CERTIFICATE_REQUIRED +#define SSL_AD_UNSUPPORTED_EXTENSION TLS1_AD_UNSUPPORTED_EXTENSION +#define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE +#define SSL_AD_UNRECOGNIZED_NAME TLS1_AD_UNRECOGNIZED_NAME +#define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE +#define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE +/* fatal */ +#define SSL_AD_UNKNOWN_PSK_IDENTITY TLS1_AD_UNKNOWN_PSK_IDENTITY +/* fatal */ +#define SSL_AD_INAPPROPRIATE_FALLBACK TLS1_AD_INAPPROPRIATE_FALLBACK +#define SSL_AD_NO_APPLICATION_PROTOCOL TLS1_AD_NO_APPLICATION_PROTOCOL +#define SSL_ERROR_NONE 0 +#define SSL_ERROR_SSL 1 +#define SSL_ERROR_WANT_READ 2 +#define SSL_ERROR_WANT_WRITE 3 +#define SSL_ERROR_WANT_X509_LOOKUP 4 +#define SSL_ERROR_SYSCALL 5 /* look at error stack/return \ + * value/errno */ +#define SSL_ERROR_ZERO_RETURN 6 +#define SSL_ERROR_WANT_CONNECT 7 +#define SSL_ERROR_WANT_ACCEPT 8 +#define SSL_ERROR_WANT_ASYNC 9 +#define SSL_ERROR_WANT_ASYNC_JOB 10 +#define SSL_ERROR_WANT_CLIENT_HELLO_CB 11 +#define SSL_ERROR_WANT_RETRY_VERIFY 12 + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SSL_CTRL_SET_TMP_DH 3 +#define SSL_CTRL_SET_TMP_ECDH 4 +#define SSL_CTRL_SET_TMP_DH_CB 6 +#endif + +#define SSL_CTRL_GET_CLIENT_CERT_REQUEST 9 +#define SSL_CTRL_GET_NUM_RENEGOTIATIONS 10 +#define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS 11 +#define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS 12 +#define SSL_CTRL_GET_FLAGS 13 +#define SSL_CTRL_EXTRA_CHAIN_CERT 14 +#define SSL_CTRL_SET_MSG_CALLBACK 15 +#define SSL_CTRL_SET_MSG_CALLBACK_ARG 16 +/* only applies to datagram connections */ +#define SSL_CTRL_SET_MTU 17 +/* Stats */ +#define SSL_CTRL_SESS_NUMBER 20 +#define SSL_CTRL_SESS_CONNECT 21 +#define SSL_CTRL_SESS_CONNECT_GOOD 22 +#define SSL_CTRL_SESS_CONNECT_RENEGOTIATE 23 +#define SSL_CTRL_SESS_ACCEPT 24 +#define SSL_CTRL_SESS_ACCEPT_GOOD 25 +#define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE 26 +#define SSL_CTRL_SESS_HIT 27 +#define SSL_CTRL_SESS_CB_HIT 28 +#define SSL_CTRL_SESS_MISSES 29 +#define SSL_CTRL_SESS_TIMEOUTS 30 +#define SSL_CTRL_SESS_CACHE_FULL 31 +#define SSL_CTRL_MODE 33 +#define SSL_CTRL_GET_READ_AHEAD 40 +#define SSL_CTRL_SET_READ_AHEAD 41 +#define SSL_CTRL_SET_SESS_CACHE_SIZE 42 +#define SSL_CTRL_GET_SESS_CACHE_SIZE 43 +#define SSL_CTRL_SET_SESS_CACHE_MODE 44 +#define SSL_CTRL_GET_SESS_CACHE_MODE 45 +#define SSL_CTRL_GET_MAX_CERT_LIST 50 +#define SSL_CTRL_SET_MAX_CERT_LIST 51 +#define SSL_CTRL_SET_MAX_SEND_FRAGMENT 52 +/* see tls1.h for macros based on these */ +#define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB 53 +#define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG 54 +#define SSL_CTRL_SET_TLSEXT_HOSTNAME 55 +#define SSL_CTRL_SET_TLSEXT_DEBUG_CB 56 +#define SSL_CTRL_SET_TLSEXT_DEBUG_ARG 57 +#define SSL_CTRL_GET_TLSEXT_TICKET_KEYS 58 +#define SSL_CTRL_SET_TLSEXT_TICKET_KEYS 59 +/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT 60 */ +/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB 61 */ +/*# define SSL_CTRL_SET_TLSEXT_OPAQUE_PRF_INPUT_CB_ARG 62 */ +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB 63 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG 64 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE 65 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS 66 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS 67 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS 68 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS 69 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP 70 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP 71 +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB 72 +#endif +#define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB 75 +#define SSL_CTRL_SET_SRP_VERIFY_PARAM_CB 76 +#define SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB 77 +#define SSL_CTRL_SET_SRP_ARG 78 +#define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME 79 +#define SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH 80 +#define SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD 81 +#define DTLS_CTRL_GET_TIMEOUT 73 +#define DTLS_CTRL_HANDLE_TIMEOUT 74 +#define SSL_CTRL_GET_RI_SUPPORT 76 +#define SSL_CTRL_CLEAR_MODE 78 +#define SSL_CTRL_SET_NOT_RESUMABLE_SESS_CB 79 +#define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82 +#define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS 83 +#define SSL_CTRL_CHAIN 88 +#define SSL_CTRL_CHAIN_CERT 89 +#define SSL_CTRL_GET_GROUPS 90 +#define SSL_CTRL_SET_GROUPS 91 +#define SSL_CTRL_SET_GROUPS_LIST 92 +#define SSL_CTRL_GET_SHARED_GROUP 93 +#define SSL_CTRL_SET_SIGALGS 97 +#define SSL_CTRL_SET_SIGALGS_LIST 98 +#define SSL_CTRL_CERT_FLAGS 99 +#define SSL_CTRL_CLEAR_CERT_FLAGS 100 +#define SSL_CTRL_SET_CLIENT_SIGALGS 101 +#define SSL_CTRL_SET_CLIENT_SIGALGS_LIST 102 +#define SSL_CTRL_GET_CLIENT_CERT_TYPES 103 +#define SSL_CTRL_SET_CLIENT_CERT_TYPES 104 +#define SSL_CTRL_BUILD_CERT_CHAIN 105 +#define SSL_CTRL_SET_VERIFY_CERT_STORE 106 +#define SSL_CTRL_SET_CHAIN_CERT_STORE 107 +#define SSL_CTRL_GET_PEER_SIGNATURE_NID 108 +#define SSL_CTRL_GET_PEER_TMP_KEY 109 +#define SSL_CTRL_GET_RAW_CIPHERLIST 110 +#define SSL_CTRL_GET_EC_POINT_FORMATS 111 +#define SSL_CTRL_GET_CHAIN_CERTS 115 +#define SSL_CTRL_SELECT_CURRENT_CERT 116 +#define SSL_CTRL_SET_CURRENT_CERT 117 +#define SSL_CTRL_SET_DH_AUTO 118 +#define DTLS_CTRL_SET_LINK_MTU 120 +#define DTLS_CTRL_GET_LINK_MIN_MTU 121 +#define SSL_CTRL_GET_EXTMS_SUPPORT 122 +#define SSL_CTRL_SET_MIN_PROTO_VERSION 123 +#define SSL_CTRL_SET_MAX_PROTO_VERSION 124 +#define SSL_CTRL_SET_SPLIT_SEND_FRAGMENT 125 +#define SSL_CTRL_SET_MAX_PIPELINES 126 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_TYPE 127 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB 128 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_CB_ARG 129 +#define SSL_CTRL_GET_MIN_PROTO_VERSION 130 +#define SSL_CTRL_GET_MAX_PROTO_VERSION 131 +#define SSL_CTRL_GET_SIGNATURE_NID 132 +#define SSL_CTRL_GET_TMP_KEY 133 +#define SSL_CTRL_GET_NEGOTIATED_GROUP 134 +#define SSL_CTRL_GET_IANA_GROUPS 135 +#define SSL_CTRL_SET_RETRY_VERIFY 136 +#define SSL_CTRL_GET_VERIFY_CERT_STORE 137 +#define SSL_CTRL_GET_CHAIN_CERT_STORE 138 +#define SSL_CTRL_GET0_IMPLEMENTED_GROUPS 139 +#define SSL_CTRL_GET_SIGNATURE_NAME 140 +#define SSL_CTRL_GET_PEER_SIGNATURE_NAME 141 +#define SSL_CERT_SET_FIRST 1 +#define SSL_CERT_SET_NEXT 2 +#define SSL_CERT_SET_SERVER 3 +#define DTLSv1_get_timeout(ssl, arg) \ + SSL_ctrl(ssl, DTLS_CTRL_GET_TIMEOUT, 0, (void *)(arg)) +#define DTLSv1_handle_timeout(ssl) \ + SSL_ctrl(ssl, DTLS_CTRL_HANDLE_TIMEOUT, 0, NULL) +#define SSL_num_renegotiations(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_GET_NUM_RENEGOTIATIONS, 0, NULL) +#define SSL_clear_num_renegotiations(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS, 0, NULL) +#define SSL_total_renegotiations(ssl) \ + SSL_ctrl((ssl), SSL_CTRL_GET_TOTAL_RENEGOTIATIONS, 0, NULL) +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SSL_CTX_set_tmp_dh(ctx, dh) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_TMP_DH, 0, (char *)(dh)) +#endif +#define SSL_CTX_set_dh_auto(ctx, onoff) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_DH_AUTO, onoff, NULL) +#define SSL_set_dh_auto(s, onoff) \ + SSL_ctrl(s, SSL_CTRL_SET_DH_AUTO, onoff, NULL) +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SSL_set_tmp_dh(ssl, dh) \ + SSL_ctrl(ssl, SSL_CTRL_SET_TMP_DH, 0, (char *)(dh)) +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SSL_CTX_set_tmp_ecdh(ctx, ecdh) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_TMP_ECDH, 0, (char *)(ecdh)) +#define SSL_set_tmp_ecdh(ssl, ecdh) \ + SSL_ctrl(ssl, SSL_CTRL_SET_TMP_ECDH, 0, (char *)(ecdh)) +#endif +#define SSL_CTX_add_extra_chain_cert(ctx, x509) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_EXTRA_CHAIN_CERT, 0, (char *)(x509)) +#define SSL_CTX_get_extra_chain_certs(ctx, px509) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_EXTRA_CHAIN_CERTS, 0, px509) +#define SSL_CTX_get_extra_chain_certs_only(ctx, px509) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_EXTRA_CHAIN_CERTS, 1, px509) +#define SSL_CTX_clear_extra_chain_certs(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS, 0, NULL) +#define SSL_CTX_set0_chain(ctx, sk) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_CHAIN, 0, (char *)(sk)) +#define SSL_CTX_set1_chain(ctx, sk) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_CHAIN, 1, (char *)(sk)) +#define SSL_CTX_add0_chain_cert(ctx, x509) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_CHAIN_CERT, 0, (char *)(x509)) +#define SSL_CTX_add1_chain_cert(ctx, x509) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_CHAIN_CERT, 1, (char *)(x509)) +#define SSL_CTX_get0_chain_certs(ctx, px509) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_CHAIN_CERTS, 0, px509) +#define SSL_CTX_clear_chain_certs(ctx) \ + SSL_CTX_set0_chain(ctx, NULL) +#define SSL_CTX_build_cert_chain(ctx, flags) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +#define SSL_CTX_select_current_cert(ctx, x509) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SELECT_CURRENT_CERT, 0, (char *)(x509)) +#define SSL_CTX_set_current_cert(ctx, op) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_CURRENT_CERT, op, NULL) +#define SSL_CTX_set0_verify_cert_store(ctx, st) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_VERIFY_CERT_STORE, 0, (char *)(st)) +#define SSL_CTX_set1_verify_cert_store(ctx, st) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_VERIFY_CERT_STORE, 1, (char *)(st)) +#define SSL_CTX_get0_verify_cert_store(ctx, st) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_VERIFY_CERT_STORE, 0, (char *)(st)) +#define SSL_CTX_set0_chain_cert_store(ctx, st) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_CHAIN_CERT_STORE, 0, (char *)(st)) +#define SSL_CTX_set1_chain_cert_store(ctx, st) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_CHAIN_CERT_STORE, 1, (char *)(st)) +#define SSL_CTX_get0_chain_cert_store(ctx, st) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_CHAIN_CERT_STORE, 0, (char *)(st)) +#define SSL_set0_chain(s, sk) \ + SSL_ctrl(s, SSL_CTRL_CHAIN, 0, (char *)(sk)) +#define SSL_set1_chain(s, sk) \ + SSL_ctrl(s, SSL_CTRL_CHAIN, 1, (char *)(sk)) +#define SSL_add0_chain_cert(s, x509) \ + SSL_ctrl(s, SSL_CTRL_CHAIN_CERT, 0, (char *)(x509)) +#define SSL_add1_chain_cert(s, x509) \ + SSL_ctrl(s, SSL_CTRL_CHAIN_CERT, 1, (char *)(x509)) +#define SSL_get0_chain_certs(s, px509) \ + SSL_ctrl(s, SSL_CTRL_GET_CHAIN_CERTS, 0, px509) +#define SSL_clear_chain_certs(s) \ + SSL_set0_chain(s, NULL) +#define SSL_build_cert_chain(s, flags) \ + SSL_ctrl(s, SSL_CTRL_BUILD_CERT_CHAIN, flags, NULL) +#define SSL_select_current_cert(s, x509) \ + SSL_ctrl(s, SSL_CTRL_SELECT_CURRENT_CERT, 0, (char *)(x509)) +#define SSL_set_current_cert(s, op) \ + SSL_ctrl(s, SSL_CTRL_SET_CURRENT_CERT, op, NULL) +#define SSL_set0_verify_cert_store(s, st) \ + SSL_ctrl(s, SSL_CTRL_SET_VERIFY_CERT_STORE, 0, (char *)(st)) +#define SSL_set1_verify_cert_store(s, st) \ + SSL_ctrl(s, SSL_CTRL_SET_VERIFY_CERT_STORE, 1, (char *)(st)) +#define SSL_get0_verify_cert_store(s, st) \ + SSL_ctrl(s, SSL_CTRL_GET_VERIFY_CERT_STORE, 0, (char *)(st)) +#define SSL_set0_chain_cert_store(s, st) \ + SSL_ctrl(s, SSL_CTRL_SET_CHAIN_CERT_STORE, 0, (char *)(st)) +#define SSL_set1_chain_cert_store(s, st) \ + SSL_ctrl(s, SSL_CTRL_SET_CHAIN_CERT_STORE, 1, (char *)(st)) +#define SSL_get0_chain_cert_store(s, st) \ + SSL_ctrl(s, SSL_CTRL_GET_CHAIN_CERT_STORE, 0, (char *)(st)) + +#define SSL_get1_groups(s, glist) \ + SSL_ctrl(s, SSL_CTRL_GET_GROUPS, 0, (int *)(glist)) +#define SSL_get0_iana_groups(s, plst) \ + SSL_ctrl(s, SSL_CTRL_GET_IANA_GROUPS, 0, (uint16_t **)(plst)) +#define SSL_CTX_set1_groups(ctx, glist, glistlen) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_GROUPS, glistlen, (int *)(glist)) +#define SSL_CTX_set1_groups_list(ctx, s) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_GROUPS_LIST, 0, (char *)(s)) +#define SSL_CTX_get0_implemented_groups(ctx, all, out) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET0_IMPLEMENTED_GROUPS, all, \ + (STACK_OF(OPENSSL_CSTRING) *)(out)) +#define SSL_set1_groups(s, glist, glistlen) \ + SSL_ctrl(s, SSL_CTRL_SET_GROUPS, glistlen, (char *)(glist)) +#define SSL_set1_groups_list(s, str) \ + SSL_ctrl(s, SSL_CTRL_SET_GROUPS_LIST, 0, (char *)(str)) +#define SSL_get_shared_group(s, n) \ + SSL_ctrl(s, SSL_CTRL_GET_SHARED_GROUP, n, NULL) +#define SSL_get_negotiated_group(s) \ + SSL_ctrl(s, SSL_CTRL_GET_NEGOTIATED_GROUP, 0, NULL) +#define SSL_CTX_set1_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_SIGALGS, slistlen, (int *)(slist)) +#define SSL_CTX_set1_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_SIGALGS_LIST, 0, (char *)(s)) +#define SSL_set1_sigalgs(s, slist, slistlen) \ + SSL_ctrl(s, SSL_CTRL_SET_SIGALGS, slistlen, (int *)(slist)) +#define SSL_set1_sigalgs_list(s, str) \ + SSL_ctrl(s, SSL_CTRL_SET_SIGALGS_LIST, 0, (char *)(str)) +#define SSL_CTX_set1_client_sigalgs(ctx, slist, slistlen) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_CLIENT_SIGALGS, slistlen, (int *)(slist)) +#define SSL_CTX_set1_client_sigalgs_list(ctx, s) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_CLIENT_SIGALGS_LIST, 0, (char *)(s)) +#define SSL_set1_client_sigalgs(s, slist, slistlen) \ + SSL_ctrl(s, SSL_CTRL_SET_CLIENT_SIGALGS, slistlen, (int *)(slist)) +#define SSL_set1_client_sigalgs_list(s, str) \ + SSL_ctrl(s, SSL_CTRL_SET_CLIENT_SIGALGS_LIST, 0, (char *)(str)) +#define SSL_get0_certificate_types(s, clist) \ + SSL_ctrl(s, SSL_CTRL_GET_CLIENT_CERT_TYPES, 0, (char *)(clist)) +#define SSL_CTX_set1_client_certificate_types(ctx, clist, clistlen) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_CLIENT_CERT_TYPES, clistlen, \ + (char *)(clist)) +#define SSL_set1_client_certificate_types(s, clist, clistlen) \ + SSL_ctrl(s, SSL_CTRL_SET_CLIENT_CERT_TYPES, clistlen, (char *)(clist)) +#define SSL_get0_signature_name(s, str) \ + SSL_ctrl(s, SSL_CTRL_GET_SIGNATURE_NAME, 0, (1 ? (str) : (const char **)NULL)) +#define SSL_get_signature_nid(s, pn) \ + SSL_ctrl(s, SSL_CTRL_GET_SIGNATURE_NID, 0, pn) +#define SSL_get0_peer_signature_name(s, str) \ + SSL_ctrl(s, SSL_CTRL_GET_PEER_SIGNATURE_NAME, 0, (1 ? (str) : (const char **)NULL)) +#define SSL_get_peer_signature_nid(s, pn) \ + SSL_ctrl(s, SSL_CTRL_GET_PEER_SIGNATURE_NID, 0, pn) +#define SSL_get_peer_tmp_key(s, pk) \ + SSL_ctrl(s, SSL_CTRL_GET_PEER_TMP_KEY, 0, pk) +#define SSL_get_tmp_key(s, pk) \ + SSL_ctrl(s, SSL_CTRL_GET_TMP_KEY, 0, pk) +#define SSL_get0_raw_cipherlist(s, plst) \ + SSL_ctrl(s, SSL_CTRL_GET_RAW_CIPHERLIST, 0, plst) +#define SSL_get0_ec_point_formats(s, plst) \ + SSL_ctrl(s, SSL_CTRL_GET_EC_POINT_FORMATS, 0, plst) +#define SSL_CTX_set_min_proto_version(ctx, version) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL) +#define SSL_CTX_set_max_proto_version(ctx, version) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL) +#define SSL_CTX_get_min_proto_version(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL) +#define SSL_CTX_get_max_proto_version(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL) +#define SSL_set_min_proto_version(s, version) \ + SSL_ctrl(s, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL) +#define SSL_set_max_proto_version(s, version) \ + SSL_ctrl(s, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL) +#define SSL_get_min_proto_version(s) \ + SSL_ctrl(s, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL) +#define SSL_get_max_proto_version(s) \ + SSL_ctrl(s, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL) + +const char *SSL_get0_group_name(SSL *s); +const char *SSL_group_to_name(SSL *s, int id); + +/* Backwards compatibility, original 1.1.0 names */ +#define SSL_CTRL_GET_SERVER_TMP_KEY \ + SSL_CTRL_GET_PEER_TMP_KEY +#define SSL_get_server_tmp_key(s, pk) \ + SSL_get_peer_tmp_key(s, pk) + +int SSL_set0_tmp_dh_pkey(SSL *s, EVP_PKEY *dhpkey); +int SSL_CTX_set0_tmp_dh_pkey(SSL_CTX *ctx, EVP_PKEY *dhpkey); + +/* + * The following symbol names are old and obsolete. They are kept + * for compatibility reasons only and should not be used anymore. + */ +#define SSL_CTRL_GET_CURVES SSL_CTRL_GET_GROUPS +#define SSL_CTRL_SET_CURVES SSL_CTRL_SET_GROUPS +#define SSL_CTRL_SET_CURVES_LIST SSL_CTRL_SET_GROUPS_LIST +#define SSL_CTRL_GET_SHARED_CURVE SSL_CTRL_GET_SHARED_GROUP + +#define SSL_get1_curves SSL_get1_groups +#define SSL_CTX_set1_curves SSL_CTX_set1_groups +#define SSL_CTX_set1_curves_list SSL_CTX_set1_groups_list +#define SSL_set1_curves SSL_set1_groups +#define SSL_set1_curves_list SSL_set1_groups_list +#define SSL_get_shared_curve SSL_get_shared_group + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +/* Provide some compatibility macros for removed functionality. */ +#define SSL_CTX_need_tmp_RSA(ctx) 0 +#define SSL_CTX_set_tmp_rsa(ctx, rsa) 1 +#define SSL_need_tmp_RSA(ssl) 0 +#define SSL_set_tmp_rsa(ssl, rsa) 1 +#define SSL_CTX_set_ecdh_auto(dummy, onoff) ((onoff) != 0) +#define SSL_set_ecdh_auto(dummy, onoff) ((onoff) != 0) +/* + * We "pretend" to call the callback to avoid warnings about unused static + * functions. + */ +#define SSL_CTX_set_tmp_rsa_callback(ctx, cb) \ + while (0) \ + (cb)(NULL, 0, 0) +#define SSL_set_tmp_rsa_callback(ssl, cb) \ + while (0) \ + (cb)(NULL, 0, 0) +#endif +__owur const BIO_METHOD *BIO_f_ssl(void); +__owur BIO *BIO_new_ssl(SSL_CTX *ctx, int client); +__owur BIO *BIO_new_ssl_connect(SSL_CTX *ctx); +__owur BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx); +__owur int BIO_ssl_copy_session_id(BIO *to, BIO *from); +void BIO_ssl_shutdown(BIO *ssl_bio); + +__owur int SSL_CTX_set_cipher_list(SSL_CTX *, const char *str); +__owur SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth); +__owur SSL_CTX *SSL_CTX_new_ex(OSSL_LIB_CTX *libctx, const char *propq, + const SSL_METHOD *meth); +int SSL_CTX_up_ref(SSL_CTX *ctx); +void SSL_CTX_free(SSL_CTX *); +__owur long SSL_CTX_set_timeout(SSL_CTX *ctx, long t); +__owur long SSL_CTX_get_timeout(const SSL_CTX *ctx); +__owur X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *); +void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *); +void SSL_CTX_set1_cert_store(SSL_CTX *, X509_STORE *); +__owur int SSL_want(const SSL *s); +__owur int SSL_clear(SSL *s); + +#ifndef OPENSSL_NO_DEPRECATED_3_4 +OSSL_DEPRECATEDIN_3_4_FOR("not Y2038-safe, replace with SSL_CTX_flush_sessions_ex()") +void SSL_CTX_flush_sessions(SSL_CTX *ctx, long tm); +#endif +void SSL_CTX_flush_sessions_ex(SSL_CTX *ctx, time_t tm); + +__owur const SSL_CIPHER *SSL_get_current_cipher(const SSL *s); +__owur const SSL_CIPHER *SSL_get_pending_cipher(const SSL *s); +__owur int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits); +__owur const char *SSL_CIPHER_get_version(const SSL_CIPHER *c); +__owur const char *SSL_CIPHER_get_name(const SSL_CIPHER *c); +__owur const char *SSL_CIPHER_standard_name(const SSL_CIPHER *c); +__owur const char *OPENSSL_cipher_name(const char *rfc_name); +__owur uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *c); +__owur uint16_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *c); +__owur int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c); +__owur int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *c); +__owur const EVP_MD *SSL_CIPHER_get_handshake_digest(const SSL_CIPHER *c); +__owur int SSL_CIPHER_is_aead(const SSL_CIPHER *c); + +__owur int SSL_get_fd(const SSL *s); +__owur int SSL_get_rfd(const SSL *s); +__owur int SSL_get_wfd(const SSL *s); +__owur const char *SSL_get_cipher_list(const SSL *s, int n); +__owur char *SSL_get_shared_ciphers(const SSL *s, char *buf, int size); +__owur int SSL_get_read_ahead(const SSL *s); +__owur int SSL_pending(const SSL *s); +__owur int SSL_has_pending(const SSL *s); +#ifndef OPENSSL_NO_SOCK +__owur int SSL_set_fd(SSL *s, int fd); +__owur int SSL_set_rfd(SSL *s, int fd); +__owur int SSL_set_wfd(SSL *s, int fd); +#endif +void SSL_set0_rbio(SSL *s, BIO *rbio); +void SSL_set0_wbio(SSL *s, BIO *wbio); +void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio); +__owur BIO *SSL_get_rbio(const SSL *s); +__owur BIO *SSL_get_wbio(const SSL *s); +__owur int SSL_set_cipher_list(SSL *s, const char *str); +__owur int SSL_CTX_set_ciphersuites(SSL_CTX *ctx, const char *str); +__owur int SSL_set_ciphersuites(SSL *s, const char *str); +void SSL_set_read_ahead(SSL *s, int yes); +__owur int SSL_get_verify_mode(const SSL *s); +__owur int SSL_get_verify_depth(const SSL *s); +__owur SSL_verify_cb SSL_get_verify_callback(const SSL *s); +void SSL_set_verify(SSL *s, int mode, SSL_verify_cb callback); +void SSL_set_verify_depth(SSL *s, int depth); +void SSL_set_cert_cb(SSL *s, int (*cb)(SSL *ssl, void *arg), void *arg); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 __owur int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa); +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, + const unsigned char *d, long len); +#endif +__owur int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey); +__owur int SSL_use_PrivateKey_ASN1(int pk, SSL *ssl, const unsigned char *d, + long len); +__owur int SSL_use_certificate(SSL *ssl, X509 *x); +__owur int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len); +__owur int SSL_use_cert_and_key(SSL *ssl, X509 *x509, EVP_PKEY *privatekey, + STACK_OF(X509) *chain, int override); + +/* serverinfo file format versions */ +#define SSL_SERVERINFOV1 1 +#define SSL_SERVERINFOV2 2 + +/* Set serverinfo data for the current active cert. */ +__owur int SSL_CTX_use_serverinfo(SSL_CTX *ctx, const unsigned char *serverinfo, + size_t serverinfo_length); +__owur int SSL_CTX_use_serverinfo_ex(SSL_CTX *ctx, unsigned int version, + const unsigned char *serverinfo, + size_t serverinfo_length); +__owur int SSL_CTX_use_serverinfo_file(SSL_CTX *ctx, const char *file); + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type); +#endif + +__owur int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type); +__owur int SSL_use_certificate_file(SSL *ssl, const char *file, int type); + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, + int type); +#endif +__owur int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, + int type); +__owur int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, + int type); +/* PEM type */ +__owur int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); +__owur int SSL_use_certificate_chain_file(SSL *ssl, const char *file); +__owur STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); +__owur STACK_OF(X509_NAME) *SSL_load_client_CA_file_ex(const char *file, OSSL_LIB_CTX *libctx, + const char *propq); +__owur int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *file); +int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *dir); +int SSL_add_store_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, + const char *uri); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define SSL_load_error_strings() \ + OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS \ + | OPENSSL_INIT_LOAD_CRYPTO_STRINGS, \ + NULL) +#endif + +__owur const char *SSL_state_string(const SSL *s); +__owur const char *SSL_rstate_string(const SSL *s); +__owur const char *SSL_state_string_long(const SSL *s); +__owur const char *SSL_rstate_string_long(const SSL *s); + +#ifndef OPENSSL_NO_DEPRECATED_3_4 +OSSL_DEPRECATEDIN_3_4_FOR("not Y2038-safe, replace with SSL_SESSION_get_time_ex()") +__owur long SSL_SESSION_get_time(const SSL_SESSION *s); +OSSL_DEPRECATEDIN_3_4_FOR("not Y2038-safe, replace with SSL_SESSION_set_time_ex()") +__owur long SSL_SESSION_set_time(SSL_SESSION *s, long t); +#endif +__owur long SSL_SESSION_get_timeout(const SSL_SESSION *s); +__owur long SSL_SESSION_set_timeout(SSL_SESSION *s, long t); +__owur int SSL_SESSION_get_protocol_version(const SSL_SESSION *s); +__owur int SSL_SESSION_set_protocol_version(SSL_SESSION *s, int version); + +__owur time_t SSL_SESSION_get_time_ex(const SSL_SESSION *s); +__owur time_t SSL_SESSION_set_time_ex(SSL_SESSION *s, time_t t); + +__owur const char *SSL_SESSION_get0_hostname(const SSL_SESSION *s); +__owur int SSL_SESSION_set1_hostname(SSL_SESSION *s, const char *hostname); +void SSL_SESSION_get0_alpn_selected(const SSL_SESSION *s, + const unsigned char **alpn, + size_t *len); +__owur int SSL_SESSION_set1_alpn_selected(SSL_SESSION *s, + const unsigned char *alpn, + size_t len); +__owur const SSL_CIPHER *SSL_SESSION_get0_cipher(const SSL_SESSION *s); +__owur int SSL_SESSION_set_cipher(SSL_SESSION *s, const SSL_CIPHER *cipher); +__owur int SSL_SESSION_has_ticket(const SSL_SESSION *s); +__owur unsigned long SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s); +void SSL_SESSION_get0_ticket(const SSL_SESSION *s, const unsigned char **tick, + size_t *len); +__owur uint32_t SSL_SESSION_get_max_early_data(const SSL_SESSION *s); +__owur int SSL_SESSION_set_max_early_data(SSL_SESSION *s, + uint32_t max_early_data); +__owur int SSL_copy_session_id(SSL *to, const SSL *from); +__owur X509 *SSL_SESSION_get0_peer(SSL_SESSION *s); +__owur int SSL_SESSION_set1_id_context(SSL_SESSION *s, + const unsigned char *sid_ctx, + unsigned int sid_ctx_len); +__owur int SSL_SESSION_set1_id(SSL_SESSION *s, const unsigned char *sid, + unsigned int sid_len); +__owur int SSL_SESSION_is_resumable(const SSL_SESSION *s); + +__owur SSL_SESSION *SSL_SESSION_new(void); +__owur SSL_SESSION *SSL_SESSION_dup(const SSL_SESSION *src); +const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, + unsigned int *len); +const unsigned char *SSL_SESSION_get0_id_context(const SSL_SESSION *s, + unsigned int *len); +__owur unsigned int SSL_SESSION_get_compress_id(const SSL_SESSION *s); +#ifndef OPENSSL_NO_STDIO +int SSL_SESSION_print_fp(FILE *fp, const SSL_SESSION *ses); +#endif +int SSL_SESSION_print(BIO *fp, const SSL_SESSION *ses); +int SSL_SESSION_print_keylog(BIO *bp, const SSL_SESSION *x); +int SSL_SESSION_up_ref(SSL_SESSION *ses); +void SSL_SESSION_free(SSL_SESSION *ses); +__owur int i2d_SSL_SESSION(const SSL_SESSION *in, unsigned char **pp); +__owur int SSL_set_session(SSL *to, SSL_SESSION *session); +int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *session); +int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *session); +__owur int SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb); +__owur int SSL_set_generate_session_id(SSL *s, GEN_SESSION_CB cb); +__owur int SSL_has_matching_session_id(const SSL *s, + const unsigned char *id, + unsigned int id_len); +SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, + long length); +SSL_SESSION *d2i_SSL_SESSION_ex(SSL_SESSION **a, const unsigned char **pp, + long length, OSSL_LIB_CTX *libctx, + const char *propq); + +#ifdef OPENSSL_X509_H +__owur X509 *SSL_get0_peer_certificate(const SSL *s); +__owur X509 *SSL_get1_peer_certificate(const SSL *s); +/* Deprecated in 3.0.0 */ +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define SSL_get_peer_certificate SSL_get1_peer_certificate +#endif +#endif + +__owur STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s); + +__owur int SSL_CTX_get_verify_mode(const SSL_CTX *ctx); +__owur int SSL_CTX_get_verify_depth(const SSL_CTX *ctx); +__owur SSL_verify_cb SSL_CTX_get_verify_callback(const SSL_CTX *ctx); +void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, SSL_verify_cb callback); +void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth); +void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, + int (*cb)(X509_STORE_CTX *, void *), + void *arg); +void SSL_CTX_set_cert_cb(SSL_CTX *c, int (*cb)(SSL *ssl, void *arg), + void *arg); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa); +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, + long len); +#endif +__owur int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); +__owur int SSL_CTX_use_PrivateKey_ASN1(int pk, SSL_CTX *ctx, + const unsigned char *d, long len); +__owur int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x); +__owur int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, + const unsigned char *d); +__owur int SSL_CTX_use_cert_and_key(SSL_CTX *ctx, X509 *x509, EVP_PKEY *privatekey, + STACK_OF(X509) *chain, int override); + +void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb); +void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u); +pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx); +void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx); +void SSL_set_default_passwd_cb(SSL *s, pem_password_cb *cb); +void SSL_set_default_passwd_cb_userdata(SSL *s, void *u); +pem_password_cb *SSL_get_default_passwd_cb(SSL *s); +void *SSL_get_default_passwd_cb_userdata(SSL *s); + +__owur int SSL_CTX_check_private_key(const SSL_CTX *ctx); +__owur int SSL_check_private_key(const SSL *ctx); + +__owur int SSL_CTX_set_session_id_context(SSL_CTX *ctx, + const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +SSL *SSL_new(SSL_CTX *ctx); +int SSL_up_ref(SSL *s); +int SSL_is_dtls(const SSL *s); +int SSL_is_tls(const SSL *s); +int SSL_is_quic(const SSL *s); +__owur int SSL_set_session_id_context(SSL *ssl, const unsigned char *sid_ctx, + unsigned int sid_ctx_len); + +__owur int SSL_CTX_set_purpose(SSL_CTX *ctx, int purpose); +__owur int SSL_set_purpose(SSL *ssl, int purpose); +__owur int SSL_CTX_set_trust(SSL_CTX *ctx, int trust); +__owur int SSL_set_trust(SSL *ssl, int trust); + +__owur int SSL_set1_host(SSL *s, const char *host); +__owur int SSL_add1_host(SSL *s, const char *host); +__owur const char *SSL_get0_peername(SSL *s); +void SSL_set_hostflags(SSL *s, unsigned int flags); + +__owur int SSL_CTX_dane_enable(SSL_CTX *ctx); +__owur int SSL_CTX_dane_mtype_set(SSL_CTX *ctx, const EVP_MD *md, + uint8_t mtype, uint8_t ord); +__owur int SSL_dane_enable(SSL *s, const char *basedomain); +__owur int SSL_dane_tlsa_add(SSL *s, uint8_t usage, uint8_t selector, + uint8_t mtype, const unsigned char *data, size_t dlen); +__owur int SSL_get0_dane_authority(SSL *s, X509 **mcert, EVP_PKEY **mspki); +__owur int SSL_get0_dane_tlsa(SSL *s, uint8_t *usage, uint8_t *selector, + uint8_t *mtype, const unsigned char **data, + size_t *dlen); +/* + * Bridge opacity barrier between libcrypt and libssl, also needed to support + * offline testing in test/danetest.c + */ +SSL_DANE *SSL_get0_dane(SSL *ssl); +/* + * DANE flags + */ +unsigned long SSL_CTX_dane_set_flags(SSL_CTX *ctx, unsigned long flags); +unsigned long SSL_CTX_dane_clear_flags(SSL_CTX *ctx, unsigned long flags); +unsigned long SSL_dane_set_flags(SSL *ssl, unsigned long flags); +unsigned long SSL_dane_clear_flags(SSL *ssl, unsigned long flags); + +__owur int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm); +__owur int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm); + +__owur X509_VERIFY_PARAM *SSL_CTX_get0_param(SSL_CTX *ctx); +__owur X509_VERIFY_PARAM *SSL_get0_param(SSL *ssl); + +#ifndef OPENSSL_NO_SRP +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_username(SSL_CTX *ctx, char *name); +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_password(SSL_CTX *ctx, char *password); +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength); +OSSL_DEPRECATEDIN_3_0 +int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx, + char *(*cb)(SSL *, void *)); +OSSL_DEPRECATEDIN_3_0 +int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx, + int (*cb)(SSL *, void *)); +OSSL_DEPRECATEDIN_3_0 +int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx, + int (*cb)(SSL *, int *, void *)); +OSSL_DEPRECATEDIN_3_0 int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg); + +OSSL_DEPRECATEDIN_3_0 +int SSL_set_srp_server_param(SSL *s, const BIGNUM *N, const BIGNUM *g, + BIGNUM *sa, BIGNUM *v, char *info); +OSSL_DEPRECATEDIN_3_0 +int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass, + const char *grp); + +OSSL_DEPRECATEDIN_3_0 __owur BIGNUM *SSL_get_srp_g(SSL *s); +OSSL_DEPRECATEDIN_3_0 __owur BIGNUM *SSL_get_srp_N(SSL *s); + +OSSL_DEPRECATEDIN_3_0 __owur char *SSL_get_srp_username(SSL *s); +OSSL_DEPRECATEDIN_3_0 __owur char *SSL_get_srp_userinfo(SSL *s); +#endif +#endif + +/* + * ClientHello callback and helpers. + */ + +#define SSL_CLIENT_HELLO_SUCCESS 1 +#define SSL_CLIENT_HELLO_ERROR 0 +#define SSL_CLIENT_HELLO_RETRY (-1) + +typedef int (*SSL_client_hello_cb_fn)(SSL *s, int *al, void *arg); +void SSL_CTX_set_client_hello_cb(SSL_CTX *c, SSL_client_hello_cb_fn cb, + void *arg); +typedef int (*SSL_new_pending_conn_cb_fn)(SSL_CTX *ctx, SSL *new_ssl, + void *arg); +void SSL_CTX_set_new_pending_conn_cb(SSL_CTX *c, SSL_new_pending_conn_cb_fn cb, + void *arg); + +int SSL_client_hello_isv2(SSL *s); +unsigned int SSL_client_hello_get0_legacy_version(SSL *s); +size_t SSL_client_hello_get0_random(SSL *s, const unsigned char **out); +size_t SSL_client_hello_get0_session_id(SSL *s, const unsigned char **out); +size_t SSL_client_hello_get0_ciphers(SSL *s, const unsigned char **out); +size_t SSL_client_hello_get0_compression_methods(SSL *s, + const unsigned char **out); +int SSL_client_hello_get1_extensions_present(SSL *s, int **out, size_t *outlen); +int SSL_client_hello_get_extension_order(SSL *s, uint16_t *exts, + size_t *num_exts); +int SSL_client_hello_get0_ext(SSL *s, unsigned int type, + const unsigned char **out, size_t *outlen); + +void SSL_certs_clear(SSL *s); +void SSL_free(SSL *ssl); +#ifdef OSSL_ASYNC_FD +/* + * Windows application developer has to include windows.h to use these. + */ +__owur int SSL_waiting_for_async(SSL *s); +__owur int SSL_get_all_async_fds(SSL *s, OSSL_ASYNC_FD *fds, size_t *numfds); +__owur int SSL_get_changed_async_fds(SSL *s, OSSL_ASYNC_FD *addfd, + size_t *numaddfds, OSSL_ASYNC_FD *delfd, + size_t *numdelfds); +__owur int SSL_CTX_set_async_callback(SSL_CTX *ctx, SSL_async_callback_fn callback); +__owur int SSL_CTX_set_async_callback_arg(SSL_CTX *ctx, void *arg); +__owur int SSL_set_async_callback(SSL *s, SSL_async_callback_fn callback); +__owur int SSL_set_async_callback_arg(SSL *s, void *arg); +__owur int SSL_get_async_status(SSL *s, int *status); + +#endif +__owur int SSL_accept(SSL *ssl); +__owur int SSL_stateless(SSL *s); +__owur int SSL_connect(SSL *ssl); +__owur int SSL_read(SSL *ssl, void *buf, int num); +__owur int SSL_read_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes); + +#define SSL_READ_EARLY_DATA_ERROR 0 +#define SSL_READ_EARLY_DATA_SUCCESS 1 +#define SSL_READ_EARLY_DATA_FINISH 2 + +__owur int SSL_read_early_data(SSL *s, void *buf, size_t num, + size_t *readbytes); +__owur int SSL_peek(SSL *ssl, void *buf, int num); +__owur int SSL_peek_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes); +__owur ossl_ssize_t SSL_sendfile(SSL *s, int fd, off_t offset, size_t size, + int flags); +__owur int SSL_write(SSL *ssl, const void *buf, int num); +__owur int SSL_write_ex(SSL *s, const void *buf, size_t num, size_t *written); +__owur int SSL_write_early_data(SSL *s, const void *buf, size_t num, + size_t *written); +long SSL_ctrl(SSL *ssl, int cmd, long larg, void *parg); +long SSL_callback_ctrl(SSL *, int, void (*)(void)); +long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg); +long SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)(void)); + +#define SSL_WRITE_FLAG_CONCLUDE (1U << 0) + +__owur int SSL_write_ex2(SSL *s, const void *buf, size_t num, + uint64_t flags, + size_t *written); + +#define SSL_EARLY_DATA_NOT_SENT 0 +#define SSL_EARLY_DATA_REJECTED 1 +#define SSL_EARLY_DATA_ACCEPTED 2 + +__owur int SSL_get_early_data_status(const SSL *s); + +__owur int SSL_get_error(const SSL *s, int ret_code); +__owur const char *SSL_get_version(const SSL *s); +__owur int SSL_get_handshake_rtt(const SSL *s, uint64_t *rtt); + +/* This sets the 'default' SSL version that SSL_new() will create */ +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +__owur int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth); +#endif + +#ifndef OPENSSL_NO_SSL3_METHOD +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_method(void); /* SSLv3 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *SSLv3_client_method(void); +#endif +#endif + +#define SSLv23_method TLS_method +#define SSLv23_server_method TLS_server_method +#define SSLv23_client_method TLS_client_method + +/* Negotiate highest available SSL/TLS version */ +__owur const SSL_METHOD *TLS_method(void); +__owur const SSL_METHOD *TLS_server_method(void); +__owur const SSL_METHOD *TLS_client_method(void); + +#ifndef OPENSSL_NO_TLS1_METHOD +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_method(void); /* TLSv1.0 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_client_method(void); +#endif +#endif + +#ifndef OPENSSL_NO_TLS1_1_METHOD +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_method(void); /* TLSv1.1 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_1_client_method(void); +#endif +#endif + +#ifndef OPENSSL_NO_TLS1_2_METHOD +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_method(void); /* TLSv1.2 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *TLSv1_2_client_method(void); +#endif +#endif + +#ifndef OPENSSL_NO_DTLS1_METHOD +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_method(void); /* DTLSv1.0 */ +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_client_method(void); +#endif +#endif + +#ifndef OPENSSL_NO_DTLS1_2_METHOD +/* DTLSv1.2 */ +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_server_method(void); +OSSL_DEPRECATEDIN_1_1_0 __owur const SSL_METHOD *DTLSv1_2_client_method(void); +#endif +#endif + +__owur const SSL_METHOD *DTLS_method(void); /* DTLS 1.0 and 1.2 */ +__owur const SSL_METHOD *DTLS_server_method(void); /* DTLS 1.0 and 1.2 */ +__owur const SSL_METHOD *DTLS_client_method(void); /* DTLS 1.0 and 1.2 */ + +__owur size_t DTLS_get_data_mtu(const SSL *s); + +__owur STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s); +__owur STACK_OF(SSL_CIPHER) *SSL_CTX_get_ciphers(const SSL_CTX *ctx); +__owur STACK_OF(SSL_CIPHER) *SSL_get_client_ciphers(const SSL *s); +__owur STACK_OF(SSL_CIPHER) *SSL_get1_supported_ciphers(SSL *s); + +__owur int SSL_do_handshake(SSL *s); +int SSL_key_update(SSL *s, int updatetype); +int SSL_get_key_update_type(const SSL *s); +int SSL_renegotiate(SSL *s); +int SSL_renegotiate_abbreviated(SSL *s); +__owur int SSL_renegotiate_pending(const SSL *s); +int SSL_new_session_ticket(SSL *s); +int SSL_shutdown(SSL *s); +__owur int SSL_verify_client_post_handshake(SSL *s); +void SSL_CTX_set_post_handshake_auth(SSL_CTX *ctx, int val); +void SSL_set_post_handshake_auth(SSL *s, int val); + +__owur const SSL_METHOD *SSL_CTX_get_ssl_method(const SSL_CTX *ctx); +__owur const SSL_METHOD *SSL_get_ssl_method(const SSL *s); +__owur int SSL_set_ssl_method(SSL *s, const SSL_METHOD *method); +__owur const char *SSL_alert_type_string_long(int value); +__owur const char *SSL_alert_type_string(int value); +__owur const char *SSL_alert_desc_string_long(int value); +__owur const char *SSL_alert_desc_string(int value); + +void SSL_set0_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); +void SSL_CTX_set0_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); +__owur const STACK_OF(X509_NAME) *SSL_get0_CA_list(const SSL *s); +__owur const STACK_OF(X509_NAME) *SSL_CTX_get0_CA_list(const SSL_CTX *ctx); +__owur int SSL_add1_to_CA_list(SSL *ssl, const X509 *x); +__owur int SSL_CTX_add1_to_CA_list(SSL_CTX *ctx, const X509 *x); +__owur const STACK_OF(X509_NAME) *SSL_get0_peer_CA_list(const SSL *s); + +void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list); +void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list); +__owur STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s); +__owur STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s); +__owur int SSL_add_client_CA(SSL *ssl, X509 *x); +__owur int SSL_CTX_add_client_CA(SSL_CTX *ctx, X509 *x); + +void SSL_set_connect_state(SSL *s); +void SSL_set_accept_state(SSL *s); + +__owur long SSL_get_default_timeout(const SSL *s); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define SSL_library_init() OPENSSL_init_ssl(0, NULL) +#endif + +__owur char *SSL_CIPHER_description(const SSL_CIPHER *, char *buf, int size); +__owur STACK_OF(X509_NAME) *SSL_dup_CA_list(const STACK_OF(X509_NAME) *sk); + +__owur SSL *SSL_dup(SSL *ssl); + +__owur X509 *SSL_get_certificate(const SSL *ssl); +/* + * EVP_PKEY + */ +struct evp_pkey_st *SSL_get_privatekey(const SSL *ssl); + +__owur X509 *SSL_CTX_get0_certificate(const SSL_CTX *ctx); +__owur EVP_PKEY *SSL_CTX_get0_privatekey(const SSL_CTX *ctx); + +void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx, int mode); +__owur int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx); +void SSL_set_quiet_shutdown(SSL *ssl, int mode); +__owur int SSL_get_quiet_shutdown(const SSL *ssl); +void SSL_set_shutdown(SSL *ssl, int mode); +__owur int SSL_get_shutdown(const SSL *ssl); +__owur int SSL_version(const SSL *ssl); +__owur int SSL_client_version(const SSL *s); +__owur int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); +__owur int SSL_CTX_set_default_verify_dir(SSL_CTX *ctx); +__owur int SSL_CTX_set_default_verify_file(SSL_CTX *ctx); +__owur int SSL_CTX_set_default_verify_store(SSL_CTX *ctx); +__owur int SSL_CTX_load_verify_file(SSL_CTX *ctx, const char *CAfile); +__owur int SSL_CTX_load_verify_dir(SSL_CTX *ctx, const char *CApath); +__owur int SSL_CTX_load_verify_store(SSL_CTX *ctx, const char *CAstore); +__owur int SSL_CTX_load_verify_locations(SSL_CTX *ctx, + const char *CAfile, + const char *CApath); +#define SSL_get0_session SSL_get_session /* just peek at pointer */ +__owur SSL_SESSION *SSL_get_session(const SSL *ssl); +__owur SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */ +__owur SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl); +SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX *ctx); +void SSL_set_info_callback(SSL *ssl, + void (*cb)(const SSL *ssl, int type, int val)); +void (*SSL_get_info_callback(const SSL *ssl))(const SSL *ssl, int type, + int val); +__owur OSSL_HANDSHAKE_STATE SSL_get_state(const SSL *ssl); + +void SSL_set_verify_result(SSL *ssl, long v); +__owur long SSL_get_verify_result(const SSL *ssl); +__owur STACK_OF(X509) *SSL_get0_verified_chain(const SSL *s); + +__owur size_t SSL_get_client_random(const SSL *ssl, unsigned char *out, + size_t outlen); +__owur size_t SSL_get_server_random(const SSL *ssl, unsigned char *out, + size_t outlen); +__owur size_t SSL_SESSION_get_master_key(const SSL_SESSION *sess, + unsigned char *out, size_t outlen); +__owur int SSL_SESSION_set1_master_key(SSL_SESSION *sess, + const unsigned char *in, size_t len); +uint8_t SSL_SESSION_get_max_fragment_length(const SSL_SESSION *sess); + +#define SSL_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL, l, p, newf, dupf, freef) +__owur int SSL_set_ex_data(SSL *ssl, int idx, void *data); +void *SSL_get_ex_data(const SSL *ssl, int idx); +#define SSL_SESSION_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_SESSION, l, p, newf, dupf, freef) +__owur int SSL_SESSION_set_ex_data(SSL_SESSION *ss, int idx, void *data); +void *SSL_SESSION_get_ex_data(const SSL_SESSION *ss, int idx); +#define SSL_CTX_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_SSL_CTX, l, p, newf, dupf, freef) +__owur int SSL_CTX_set_ex_data(SSL_CTX *ssl, int idx, void *data); +void *SSL_CTX_get_ex_data(const SSL_CTX *ssl, int idx); + +__owur int SSL_get_ex_data_X509_STORE_CTX_idx(void); + +#define SSL_CTX_sess_set_cache_size(ctx, t) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_SESS_CACHE_SIZE, t, NULL) +#define SSL_CTX_sess_get_cache_size(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_SESS_CACHE_SIZE, 0, NULL) +#define SSL_CTX_set_session_cache_mode(ctx, m) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_SESS_CACHE_MODE, m, NULL) +#define SSL_CTX_get_session_cache_mode(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_SESS_CACHE_MODE, 0, NULL) + +#define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx) +#define SSL_CTX_set_default_read_ahead(ctx, m) SSL_CTX_set_read_ahead(ctx, m) +#define SSL_CTX_get_read_ahead(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_READ_AHEAD, 0, NULL) +#define SSL_CTX_set_read_ahead(ctx, m) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_READ_AHEAD, m, NULL) +#define SSL_CTX_get_max_cert_list(ctx) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_GET_MAX_CERT_LIST, 0, NULL) +#define SSL_CTX_set_max_cert_list(ctx, m) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_CERT_LIST, m, NULL) +#define SSL_get_max_cert_list(ssl) \ + SSL_ctrl(ssl, SSL_CTRL_GET_MAX_CERT_LIST, 0, NULL) +#define SSL_set_max_cert_list(ssl, m) \ + SSL_ctrl(ssl, SSL_CTRL_SET_MAX_CERT_LIST, m, NULL) + +#define SSL_CTX_set_max_send_fragment(ctx, m) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_SEND_FRAGMENT, m, NULL) +#define SSL_set_max_send_fragment(ssl, m) \ + SSL_ctrl(ssl, SSL_CTRL_SET_MAX_SEND_FRAGMENT, m, NULL) +#define SSL_CTX_set_split_send_fragment(ctx, m) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_SPLIT_SEND_FRAGMENT, m, NULL) +#define SSL_set_split_send_fragment(ssl, m) \ + SSL_ctrl(ssl, SSL_CTRL_SET_SPLIT_SEND_FRAGMENT, m, NULL) +#define SSL_CTX_set_max_pipelines(ctx, m) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PIPELINES, m, NULL) +#define SSL_set_max_pipelines(ssl, m) \ + SSL_ctrl(ssl, SSL_CTRL_SET_MAX_PIPELINES, m, NULL) +#define SSL_set_retry_verify(ssl) \ + (SSL_ctrl(ssl, SSL_CTRL_SET_RETRY_VERIFY, 0, NULL) > 0) + +void SSL_CTX_set_default_read_buffer_len(SSL_CTX *ctx, size_t len); +void SSL_set_default_read_buffer_len(SSL *s, size_t len); + +#ifndef OPENSSL_NO_DH +#ifndef OPENSSL_NO_DEPRECATED_3_0 +/* NB: the |keylength| is only applicable when is_export is true */ +OSSL_DEPRECATEDIN_3_0 +void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx, + DH *(*dh)(SSL *ssl, int is_export, + int keylength)); +OSSL_DEPRECATEDIN_3_0 +void SSL_set_tmp_dh_callback(SSL *ssl, + DH *(*dh)(SSL *ssl, int is_export, + int keylength)); +#endif +#endif + +__owur const COMP_METHOD *SSL_get_current_compression(const SSL *s); +__owur const COMP_METHOD *SSL_get_current_expansion(const SSL *s); +__owur const char *SSL_COMP_get_name(const COMP_METHOD *comp); +__owur const char *SSL_COMP_get0_name(const SSL_COMP *comp); +__owur int SSL_COMP_get_id(const SSL_COMP *comp); +STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void); +__owur STACK_OF(SSL_COMP) *SSL_COMP_set0_compression_methods(STACK_OF(SSL_COMP) + *meths); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define SSL_COMP_free_compression_methods() \ + while (0) \ + continue +#endif +__owur int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm); + +const SSL_CIPHER *SSL_CIPHER_find(SSL *ssl, const unsigned char *ptr); +int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *c); +int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *c); +int SSL_bytes_to_cipher_list(SSL *s, const unsigned char *bytes, size_t len, + int isv2format, STACK_OF(SSL_CIPHER) **sk, + STACK_OF(SSL_CIPHER) **scsvs); + +/* TLS extensions functions */ +__owur int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len); + +__owur int SSL_set_session_ticket_ext_cb(SSL *s, + tls_session_ticket_ext_cb_fn cb, + void *arg); + +/* Pre-shared secret session resumption functions */ +__owur int SSL_set_session_secret_cb(SSL *s, + tls_session_secret_cb_fn session_secret_cb, + void *arg); + +void SSL_CTX_set_not_resumable_session_callback(SSL_CTX *ctx, + int (*cb)(SSL *ssl, + int + is_forward_secure)); + +void SSL_set_not_resumable_session_callback(SSL *ssl, + int (*cb)(SSL *ssl, + int is_forward_secure)); + +void SSL_CTX_set_record_padding_callback(SSL_CTX *ctx, + size_t (*cb)(SSL *ssl, int type, + size_t len, void *arg)); +void SSL_CTX_set_record_padding_callback_arg(SSL_CTX *ctx, void *arg); +void *SSL_CTX_get_record_padding_callback_arg(const SSL_CTX *ctx); +int SSL_CTX_set_block_padding(SSL_CTX *ctx, size_t block_size); +int SSL_CTX_set_block_padding_ex(SSL_CTX *ctx, size_t app_block_size, + size_t hs_block_size); + +int SSL_set_record_padding_callback(SSL *ssl, + size_t (*cb)(SSL *ssl, int type, + size_t len, void *arg)); +void SSL_set_record_padding_callback_arg(SSL *ssl, void *arg); +void *SSL_get_record_padding_callback_arg(const SSL *ssl); +int SSL_set_block_padding(SSL *ssl, size_t block_size); +int SSL_set_block_padding_ex(SSL *ssl, size_t app_block_size, + size_t hs_block_size); +int SSL_set_num_tickets(SSL *s, size_t num_tickets); +size_t SSL_get_num_tickets(const SSL *s); +int SSL_CTX_set_num_tickets(SSL_CTX *ctx, size_t num_tickets); +size_t SSL_CTX_get_num_tickets(const SSL_CTX *ctx); + +/* QUIC support */ +int SSL_handle_events(SSL *s); +__owur int SSL_get_event_timeout(SSL *s, struct timeval *tv, int *is_infinite); +__owur int SSL_get_rpoll_descriptor(SSL *s, BIO_POLL_DESCRIPTOR *desc); +__owur int SSL_get_wpoll_descriptor(SSL *s, BIO_POLL_DESCRIPTOR *desc); +__owur int SSL_net_read_desired(SSL *s); +__owur int SSL_net_write_desired(SSL *s); +__owur int SSL_set_blocking_mode(SSL *s, int blocking); +__owur int SSL_get_blocking_mode(SSL *s); +__owur int SSL_set1_initial_peer_addr(SSL *s, const BIO_ADDR *peer_addr); +__owur SSL *SSL_get0_connection(SSL *s); +__owur int SSL_is_connection(SSL *s); + +__owur int SSL_is_listener(SSL *ssl); +__owur SSL *SSL_get0_listener(SSL *s); +#define SSL_LISTENER_FLAG_NO_VALIDATE (1UL << 1) +__owur SSL *SSL_new_listener(SSL_CTX *ctx, uint64_t flags); +__owur SSL *SSL_new_listener_from(SSL *ssl, uint64_t flags); +__owur SSL *SSL_new_from_listener(SSL *ssl, uint64_t flags); +#define SSL_ACCEPT_CONNECTION_NO_BLOCK (1UL << 0) +__owur SSL *SSL_accept_connection(SSL *ssl, uint64_t flags); +__owur size_t SSL_get_accept_connection_queue_len(SSL *ssl); +__owur int SSL_listen(SSL *ssl); + +__owur int SSL_is_domain(SSL *s); +__owur SSL *SSL_get0_domain(SSL *s); +__owur SSL *SSL_new_domain(SSL_CTX *ctx, uint64_t flags); + +#define SSL_DOMAIN_FLAG_SINGLE_THREAD (1U << 0) +#define SSL_DOMAIN_FLAG_MULTI_THREAD (1U << 1) +#define SSL_DOMAIN_FLAG_THREAD_ASSISTED (1U << 2) +#define SSL_DOMAIN_FLAG_BLOCKING (1U << 3) +#define SSL_DOMAIN_FLAG_LEGACY_BLOCKING (1U << 4) + +__owur int SSL_CTX_set_domain_flags(SSL_CTX *ctx, uint64_t domain_flags); +__owur int SSL_CTX_get_domain_flags(const SSL_CTX *ctx, uint64_t *domain_flags); +__owur int SSL_get_domain_flags(const SSL *ssl, uint64_t *domain_flags); + +#define SSL_STREAM_TYPE_NONE 0 +#define SSL_STREAM_TYPE_READ (1U << 0) +#define SSL_STREAM_TYPE_WRITE (1U << 1) +#define SSL_STREAM_TYPE_BIDI (SSL_STREAM_TYPE_READ | SSL_STREAM_TYPE_WRITE) +__owur int SSL_get_stream_type(SSL *s); + +__owur uint64_t SSL_get_stream_id(SSL *s); +__owur int SSL_is_stream_local(SSL *s); + +#define SSL_DEFAULT_STREAM_MODE_NONE 0 +#define SSL_DEFAULT_STREAM_MODE_AUTO_BIDI 1 +#define SSL_DEFAULT_STREAM_MODE_AUTO_UNI 2 +__owur int SSL_set_default_stream_mode(SSL *s, uint32_t mode); + +#define SSL_STREAM_FLAG_UNI (1U << 0) +#define SSL_STREAM_FLAG_NO_BLOCK (1U << 1) +#define SSL_STREAM_FLAG_ADVANCE (1U << 2) +__owur SSL *SSL_new_stream(SSL *s, uint64_t flags); + +#define SSL_INCOMING_STREAM_POLICY_AUTO 0 +#define SSL_INCOMING_STREAM_POLICY_ACCEPT 1 +#define SSL_INCOMING_STREAM_POLICY_REJECT 2 +__owur int SSL_set_incoming_stream_policy(SSL *s, int policy, uint64_t aec); + +#define SSL_ACCEPT_STREAM_NO_BLOCK (1U << 0) +__owur SSL *SSL_accept_stream(SSL *s, uint64_t flags); +__owur size_t SSL_get_accept_stream_queue_len(SSL *s); + +#ifndef OPENSSL_NO_QUIC +__owur int SSL_inject_net_dgram(SSL *s, const unsigned char *buf, + size_t buf_len, + const BIO_ADDR *peer, + const BIO_ADDR *local); +#endif + +typedef struct ssl_shutdown_ex_args_st { + uint64_t quic_error_code; + const char *quic_reason; +} SSL_SHUTDOWN_EX_ARGS; + +#define SSL_SHUTDOWN_FLAG_RAPID (1U << 0) +#define SSL_SHUTDOWN_FLAG_NO_STREAM_FLUSH (1U << 1) +#define SSL_SHUTDOWN_FLAG_NO_BLOCK (1U << 2) +#define SSL_SHUTDOWN_FLAG_WAIT_PEER (1U << 3) + +__owur int SSL_shutdown_ex(SSL *ssl, uint64_t flags, + const SSL_SHUTDOWN_EX_ARGS *args, + size_t args_len); + +__owur int SSL_stream_conclude(SSL *ssl, uint64_t flags); + +typedef struct ssl_stream_reset_args_st { + uint64_t quic_error_code; +} SSL_STREAM_RESET_ARGS; + +__owur int SSL_stream_reset(SSL *ssl, + const SSL_STREAM_RESET_ARGS *args, + size_t args_len); + +#define SSL_STREAM_STATE_NONE 0 +#define SSL_STREAM_STATE_OK 1 +#define SSL_STREAM_STATE_WRONG_DIR 2 +#define SSL_STREAM_STATE_FINISHED 3 +#define SSL_STREAM_STATE_RESET_LOCAL 4 +#define SSL_STREAM_STATE_RESET_REMOTE 5 +#define SSL_STREAM_STATE_CONN_CLOSED 6 +__owur int SSL_get_stream_read_state(SSL *ssl); +__owur int SSL_get_stream_write_state(SSL *ssl); + +__owur int SSL_get_stream_read_error_code(SSL *ssl, uint64_t *app_error_code); +__owur int SSL_get_stream_write_error_code(SSL *ssl, uint64_t *app_error_code); + +#define SSL_CONN_CLOSE_FLAG_LOCAL (1U << 0) +#define SSL_CONN_CLOSE_FLAG_TRANSPORT (1U << 1) + +typedef struct ssl_conn_close_info_st { + uint64_t error_code, frame_type; + const char *reason; + size_t reason_len; + uint32_t flags; +} SSL_CONN_CLOSE_INFO; + +__owur int SSL_get_conn_close_info(SSL *ssl, + SSL_CONN_CLOSE_INFO *info, + size_t info_len); + +#define SSL_VALUE_CLASS_GENERIC 0 +#define SSL_VALUE_CLASS_FEATURE_REQUEST 1 +#define SSL_VALUE_CLASS_FEATURE_PEER_REQUEST 2 +#define SSL_VALUE_CLASS_FEATURE_NEGOTIATED 3 + +#define SSL_VALUE_NONE 0 +#define SSL_VALUE_QUIC_STREAM_BIDI_LOCAL_AVAIL 1 +#define SSL_VALUE_QUIC_STREAM_BIDI_REMOTE_AVAIL 2 +#define SSL_VALUE_QUIC_STREAM_UNI_LOCAL_AVAIL 3 +#define SSL_VALUE_QUIC_STREAM_UNI_REMOTE_AVAIL 4 +#define SSL_VALUE_QUIC_IDLE_TIMEOUT 5 +#define SSL_VALUE_EVENT_HANDLING_MODE 6 +#define SSL_VALUE_STREAM_WRITE_BUF_SIZE 7 +#define SSL_VALUE_STREAM_WRITE_BUF_USED 8 +#define SSL_VALUE_STREAM_WRITE_BUF_AVAIL 9 + +#define SSL_VALUE_EVENT_HANDLING_MODE_INHERIT 0 +#define SSL_VALUE_EVENT_HANDLING_MODE_IMPLICIT 1 +#define SSL_VALUE_EVENT_HANDLING_MODE_EXPLICIT 2 + +int SSL_get_value_uint(SSL *s, uint32_t class_, uint32_t id, uint64_t *v); +int SSL_set_value_uint(SSL *s, uint32_t class_, uint32_t id, uint64_t v); + +#define SSL_get_generic_value_uint(ssl, id, v) \ + SSL_get_value_uint((ssl), SSL_VALUE_CLASS_GENERIC, (id), (v)) +#define SSL_set_generic_value_uint(ssl, id, v) \ + SSL_set_value_uint((ssl), SSL_VALUE_CLASS_GENERIC, (id), (v)) +#define SSL_get_feature_request_uint(ssl, id, v) \ + SSL_get_value_uint((ssl), SSL_VALUE_CLASS_FEATURE_REQUEST, (id), (v)) +#define SSL_set_feature_request_uint(ssl, id, v) \ + SSL_set_value_uint((ssl), SSL_VALUE_CLASS_FEATURE_REQUEST, (id), (v)) +#define SSL_get_feature_peer_request_uint(ssl, id, v) \ + SSL_get_value_uint((ssl), SSL_VALUE_CLASS_FEATURE_PEER_REQUEST, (id), (v)) +#define SSL_get_feature_negotiated_uint(ssl, id, v) \ + SSL_get_value_uint((ssl), SSL_VALUE_CLASS_FEATURE_NEGOTIATED, (id), (v)) + +#define SSL_get_quic_stream_bidi_local_avail(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_QUIC_STREAM_BIDI_LOCAL_AVAIL, \ + (value)) +#define SSL_get_quic_stream_bidi_remote_avail(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_QUIC_STREAM_BIDI_REMOTE_AVAIL, \ + (value)) +#define SSL_get_quic_stream_uni_local_avail(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_QUIC_STREAM_UNI_LOCAL_AVAIL, \ + (value)) +#define SSL_get_quic_stream_uni_remote_avail(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_QUIC_STREAM_UNI_REMOTE_AVAIL, \ + (value)) + +#define SSL_get_event_handling_mode(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_EVENT_HANDLING_MODE, \ + (value)) +#define SSL_set_event_handling_mode(ssl, value) \ + SSL_set_generic_value_uint((ssl), SSL_VALUE_EVENT_HANDLING_MODE, \ + (value)) + +#define SSL_get_stream_write_buf_size(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_STREAM_WRITE_BUF_SIZE, \ + (value)) +#define SSL_get_stream_write_buf_used(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_STREAM_WRITE_BUF_USED, \ + (value)) +#define SSL_get_stream_write_buf_avail(ssl, value) \ + SSL_get_generic_value_uint((ssl), SSL_VALUE_STREAM_WRITE_BUF_AVAIL, \ + (value)) + +#define SSL_POLL_EVENT_NONE 0 + +#define SSL_POLL_EVENT_F (1U << 0) /* F (Failure) */ +#define SSL_POLL_EVENT_EL (1U << 1) /* EL (Exception on Listener) */ +#define SSL_POLL_EVENT_EC (1U << 2) /* EC (Exception on Conn) */ +#define SSL_POLL_EVENT_ECD (1U << 3) /* ECD (Exception on Conn Drained) */ +#define SSL_POLL_EVENT_ER (1U << 4) /* ER (Exception on Read) */ +#define SSL_POLL_EVENT_EW (1U << 5) /* EW (Exception on Write) */ +#define SSL_POLL_EVENT_R (1U << 6) /* R (Readable) */ +#define SSL_POLL_EVENT_W (1U << 7) /* W (Writable) */ +#define SSL_POLL_EVENT_IC (1U << 8) /* IC (Incoming Connection) */ +#define SSL_POLL_EVENT_ISB (1U << 9) /* ISB (Incoming Stream: Bidi) */ +#define SSL_POLL_EVENT_ISU (1U << 10) /* ISU (Incoming Stream: Uni) */ +#define SSL_POLL_EVENT_OSB (1U << 11) /* OSB (Outgoing Stream: Bidi) */ +#define SSL_POLL_EVENT_OSU (1U << 12) /* OSU (Outgoing Stream: Uni) */ + +#define SSL_POLL_EVENT_RW (SSL_POLL_EVENT_R | SSL_POLL_EVENT_W) +#define SSL_POLL_EVENT_RE (SSL_POLL_EVENT_R | SSL_POLL_EVENT_ER) +#define SSL_POLL_EVENT_WE (SSL_POLL_EVENT_W | SSL_POLL_EVENT_EW) +#define SSL_POLL_EVENT_RWE (SSL_POLL_EVENT_RE | SSL_POLL_EVENT_WE) +#define SSL_POLL_EVENT_E (SSL_POLL_EVENT_EL | SSL_POLL_EVENT_EC \ + | SSL_POLL_EVENT_ER | SSL_POLL_EVENT_EW) +#define SSL_POLL_EVENT_IS (SSL_POLL_EVENT_ISB | SSL_POLL_EVENT_ISU) +#define SSL_POLL_EVENT_ISE (SSL_POLL_EVENT_IS | SSL_POLL_EVENT_EC) +#define SSL_POLL_EVENT_I (SSL_POLL_EVENT_IS | SSL_POLL_EVENT_IC) +#define SSL_POLL_EVENT_OS (SSL_POLL_EVENT_OSB | SSL_POLL_EVENT_OSU) +#define SSL_POLL_EVENT_OSE (SSL_POLL_EVENT_OS | SSL_POLL_EVENT_EC) + +typedef struct ssl_poll_item_st { + BIO_POLL_DESCRIPTOR desc; + uint64_t events, revents; +} SSL_POLL_ITEM; + +#define SSL_POLL_FLAG_NO_HANDLE_EVENTS (1U << 0) + +__owur int SSL_poll(SSL_POLL_ITEM *items, + size_t num_items, + size_t stride, + const struct timeval *timeout, + uint64_t flags, + size_t *result_count); + +static ossl_inline ossl_unused BIO_POLL_DESCRIPTOR +SSL_as_poll_descriptor(SSL *s) +{ + BIO_POLL_DESCRIPTOR d; + + d.type = BIO_POLL_DESCRIPTOR_TYPE_SSL; + d.value.ssl = s; + return d; +} + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define SSL_cache_hit(s) SSL_session_reused(s) +#endif + +__owur int SSL_session_reused(const SSL *s); +__owur int SSL_is_server(const SSL *s); + +__owur SSL_CONF_CTX *SSL_CONF_CTX_new(void); +int SSL_CONF_CTX_finish(SSL_CONF_CTX *cctx); +void SSL_CONF_CTX_free(SSL_CONF_CTX *cctx); +unsigned int SSL_CONF_CTX_set_flags(SSL_CONF_CTX *cctx, unsigned int flags); +__owur unsigned int SSL_CONF_CTX_clear_flags(SSL_CONF_CTX *cctx, + unsigned int flags); +__owur int SSL_CONF_CTX_set1_prefix(SSL_CONF_CTX *cctx, const char *pre); + +void SSL_CONF_CTX_set_ssl(SSL_CONF_CTX *cctx, SSL *ssl); +void SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *cctx, SSL_CTX *ctx); + +__owur int SSL_CONF_cmd(SSL_CONF_CTX *cctx, const char *cmd, const char *value); +__owur int SSL_CONF_cmd_argv(SSL_CONF_CTX *cctx, int *pargc, char ***pargv); +__owur int SSL_CONF_cmd_value_type(SSL_CONF_CTX *cctx, const char *cmd); + +void SSL_add_ssl_module(void); +int SSL_config(SSL *s, const char *name); +int SSL_CTX_config(SSL_CTX *ctx, const char *name); + +#ifndef OPENSSL_NO_SSL_TRACE +void SSL_trace(int write_p, int version, int content_type, + const void *buf, size_t len, SSL *ssl, void *arg); +#endif + +#ifndef OPENSSL_NO_SOCK +int DTLSv1_listen(SSL *s, BIO_ADDR *client); +#endif + +#ifndef OPENSSL_NO_CT + +/* + * A callback for verifying that the received SCTs are sufficient. + * Expected to return 1 if they are sufficient, otherwise 0. + * May return a negative integer if an error occurs. + * A connection should be aborted if the SCTs are deemed insufficient. + */ +typedef int (*ssl_ct_validation_cb)(const CT_POLICY_EVAL_CTX *ctx, + const STACK_OF(SCT) *scts, void *arg); + +/* + * Sets a |callback| that is invoked upon receipt of ServerHelloDone to validate + * the received SCTs. + * If the callback returns a non-positive result, the connection is terminated. + * Call this function before beginning a handshake. + * If a NULL |callback| is provided, SCT validation is disabled. + * |arg| is arbitrary userdata that will be passed to the callback whenever it + * is invoked. Ownership of |arg| remains with the caller. + * + * NOTE: A side-effect of setting a CT callback is that an OCSP stapled response + * will be requested. + */ +int SSL_set_ct_validation_callback(SSL *s, ssl_ct_validation_cb callback, + void *arg); +int SSL_CTX_set_ct_validation_callback(SSL_CTX *ctx, + ssl_ct_validation_cb callback, + void *arg); +#define SSL_disable_ct(s) \ + ((void)SSL_set_validation_callback((s), NULL, NULL)) +#define SSL_CTX_disable_ct(ctx) \ + ((void)SSL_CTX_set_validation_callback((ctx), NULL, NULL)) + +/* + * The validation type enumerates the available behaviours of the built-in SSL + * CT validation callback selected via SSL_enable_ct() and SSL_CTX_enable_ct(). + * The underlying callback is a static function in libssl. + */ +enum { + SSL_CT_VALIDATION_PERMISSIVE = 0, + SSL_CT_VALIDATION_STRICT +}; + +/* + * Enable CT by setting up a callback that implements one of the built-in + * validation variants. The SSL_CT_VALIDATION_PERMISSIVE variant always + * continues the handshake, the application can make appropriate decisions at + * handshake completion. The SSL_CT_VALIDATION_STRICT variant requires at + * least one valid SCT, or else handshake termination will be requested. The + * handshake may continue anyway if SSL_VERIFY_NONE is in effect. + */ +int SSL_enable_ct(SSL *s, int validation_mode); +int SSL_CTX_enable_ct(SSL_CTX *ctx, int validation_mode); + +/* + * Report whether a non-NULL callback is enabled. + */ +int SSL_ct_is_enabled(const SSL *s); +int SSL_CTX_ct_is_enabled(const SSL_CTX *ctx); + +/* Gets the SCTs received from a connection */ +const STACK_OF(SCT) *SSL_get0_peer_scts(SSL *s); + +/* + * Loads the CT log list from the default location. + * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store, + * the log information loaded from this file will be appended to the + * CTLOG_STORE. + * Returns 1 on success, 0 otherwise. + */ +int SSL_CTX_set_default_ctlog_list_file(SSL_CTX *ctx); + +/* + * Loads the CT log list from the specified file path. + * If a CTLOG_STORE has previously been set using SSL_CTX_set_ctlog_store, + * the log information loaded from this file will be appended to the + * CTLOG_STORE. + * Returns 1 on success, 0 otherwise. + */ +int SSL_CTX_set_ctlog_list_file(SSL_CTX *ctx, const char *path); + +/* + * Sets the CT log list used by all SSL connections created from this SSL_CTX. + * Ownership of the CTLOG_STORE is transferred to the SSL_CTX. + */ +void SSL_CTX_set0_ctlog_store(SSL_CTX *ctx, CTLOG_STORE *logs); + +/* + * Gets the CT log list used by all SSL connections created from this SSL_CTX. + * This will be NULL unless one of the following functions has been called: + * - SSL_CTX_set_default_ctlog_list_file + * - SSL_CTX_set_ctlog_list_file + * - SSL_CTX_set_ctlog_store + */ +const CTLOG_STORE *SSL_CTX_get0_ctlog_store(const SSL_CTX *ctx); + +#endif /* OPENSSL_NO_CT */ + +/* What the "other" parameter contains in security callback */ +/* Mask for type */ +#define SSL_SECOP_OTHER_TYPE 0xffff0000 +#define SSL_SECOP_OTHER_NONE 0 +#define SSL_SECOP_OTHER_CIPHER (1 << 16) +#define SSL_SECOP_OTHER_CURVE (2 << 16) +#define SSL_SECOP_OTHER_DH (3 << 16) +#define SSL_SECOP_OTHER_PKEY (4 << 16) +#define SSL_SECOP_OTHER_SIGALG (5 << 16) +#define SSL_SECOP_OTHER_CERT (6 << 16) + +/* Indicated operation refers to peer key or certificate */ +#define SSL_SECOP_PEER 0x1000 + +/* Values for "op" parameter in security callback */ + +/* Called to filter ciphers */ +/* Ciphers client supports */ +#define SSL_SECOP_CIPHER_SUPPORTED (1 | SSL_SECOP_OTHER_CIPHER) +/* Cipher shared by client/server */ +#define SSL_SECOP_CIPHER_SHARED (2 | SSL_SECOP_OTHER_CIPHER) +/* Sanity check of cipher server selects */ +#define SSL_SECOP_CIPHER_CHECK (3 | SSL_SECOP_OTHER_CIPHER) +/* Curves supported by client */ +#define SSL_SECOP_CURVE_SUPPORTED (4 | SSL_SECOP_OTHER_CURVE) +/* Curves shared by client/server */ +#define SSL_SECOP_CURVE_SHARED (5 | SSL_SECOP_OTHER_CURVE) +/* Sanity check of curve server selects */ +#define SSL_SECOP_CURVE_CHECK (6 | SSL_SECOP_OTHER_CURVE) +/* Temporary DH key */ +#define SSL_SECOP_TMP_DH (7 | SSL_SECOP_OTHER_PKEY) +/* SSL/TLS version */ +#define SSL_SECOP_VERSION (9 | SSL_SECOP_OTHER_NONE) +/* Session tickets */ +#define SSL_SECOP_TICKET (10 | SSL_SECOP_OTHER_NONE) +/* Supported signature algorithms sent to peer */ +#define SSL_SECOP_SIGALG_SUPPORTED (11 | SSL_SECOP_OTHER_SIGALG) +/* Shared signature algorithm */ +#define SSL_SECOP_SIGALG_SHARED (12 | SSL_SECOP_OTHER_SIGALG) +/* Sanity check signature algorithm allowed */ +#define SSL_SECOP_SIGALG_CHECK (13 | SSL_SECOP_OTHER_SIGALG) +/* Used to get mask of supported public key signature algorithms */ +#define SSL_SECOP_SIGALG_MASK (14 | SSL_SECOP_OTHER_SIGALG) +/* Use to see if compression is allowed */ +#define SSL_SECOP_COMPRESSION (15 | SSL_SECOP_OTHER_NONE) +/* EE key in certificate */ +#define SSL_SECOP_EE_KEY (16 | SSL_SECOP_OTHER_CERT) +/* CA key in certificate */ +#define SSL_SECOP_CA_KEY (17 | SSL_SECOP_OTHER_CERT) +/* CA digest algorithm in certificate */ +#define SSL_SECOP_CA_MD (18 | SSL_SECOP_OTHER_CERT) +/* Peer EE key in certificate */ +#define SSL_SECOP_PEER_EE_KEY (SSL_SECOP_EE_KEY | SSL_SECOP_PEER) +/* Peer CA key in certificate */ +#define SSL_SECOP_PEER_CA_KEY (SSL_SECOP_CA_KEY | SSL_SECOP_PEER) +/* Peer CA digest algorithm in certificate */ +#define SSL_SECOP_PEER_CA_MD (SSL_SECOP_CA_MD | SSL_SECOP_PEER) + +void SSL_set_security_level(SSL *s, int level); +__owur int SSL_get_security_level(const SSL *s); +void SSL_set_security_callback(SSL *s, + int (*cb)(const SSL *s, const SSL_CTX *ctx, + int op, int bits, int nid, + void *other, void *ex)); +int (*SSL_get_security_callback(const SSL *s))(const SSL *s, + const SSL_CTX *ctx, int op, + int bits, int nid, void *other, + void *ex); +void SSL_set0_security_ex_data(SSL *s, void *ex); +__owur void *SSL_get0_security_ex_data(const SSL *s); + +void SSL_CTX_set_security_level(SSL_CTX *ctx, int level); +__owur int SSL_CTX_get_security_level(const SSL_CTX *ctx); +void SSL_CTX_set_security_callback(SSL_CTX *ctx, + int (*cb)(const SSL *s, const SSL_CTX *ctx, + int op, int bits, int nid, + void *other, void *ex)); +int (*SSL_CTX_get_security_callback(const SSL_CTX *ctx))(const SSL *s, + const SSL_CTX *ctx, + int op, int bits, + int nid, + void *other, + void *ex); +void SSL_CTX_set0_security_ex_data(SSL_CTX *ctx, void *ex); +__owur void *SSL_CTX_get0_security_ex_data(const SSL_CTX *ctx); + +/* OPENSSL_INIT flag 0x010000 reserved for internal use */ +#define OPENSSL_INIT_NO_LOAD_SSL_STRINGS 0x00100000L +#define OPENSSL_INIT_LOAD_SSL_STRINGS 0x00200000L + +#define OPENSSL_INIT_SSL_DEFAULT \ + (OPENSSL_INIT_LOAD_SSL_STRINGS | OPENSSL_INIT_LOAD_CRYPTO_STRINGS) + +int OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings); + +#ifndef OPENSSL_NO_UNIT_TEST +__owur const struct openssl_ssl_test_functions *SSL_test_functions(void); +#endif + +__owur int SSL_free_buffers(SSL *ssl); +__owur int SSL_alloc_buffers(SSL *ssl); + +/* Status codes passed to the decrypt session ticket callback. Some of these + * are for internal use only and are never passed to the callback. */ +typedef int SSL_TICKET_STATUS; + +/* Support for ticket appdata */ +/* fatal error, malloc failure */ +#define SSL_TICKET_FATAL_ERR_MALLOC 0 +/* fatal error, either from parsing or decrypting the ticket */ +#define SSL_TICKET_FATAL_ERR_OTHER 1 +/* No ticket present */ +#define SSL_TICKET_NONE 2 +/* Empty ticket present */ +#define SSL_TICKET_EMPTY 3 +/* the ticket couldn't be decrypted */ +#define SSL_TICKET_NO_DECRYPT 4 +/* a ticket was successfully decrypted */ +#define SSL_TICKET_SUCCESS 5 +/* same as above but the ticket needs to be renewed */ +#define SSL_TICKET_SUCCESS_RENEW 6 + +/* Return codes for the decrypt session ticket callback */ +typedef int SSL_TICKET_RETURN; + +/* An error occurred */ +#define SSL_TICKET_RETURN_ABORT 0 +/* Do not use the ticket, do not send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_IGNORE 1 +/* Do not use the ticket, send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_IGNORE_RENEW 2 +/* Use the ticket, do not send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_USE 3 +/* Use the ticket, send a renewed ticket to the client */ +#define SSL_TICKET_RETURN_USE_RENEW 4 + +typedef int (*SSL_CTX_generate_session_ticket_fn)(SSL *s, void *arg); +typedef SSL_TICKET_RETURN (*SSL_CTX_decrypt_session_ticket_fn)(SSL *s, SSL_SESSION *ss, + const unsigned char *keyname, + size_t keyname_length, + SSL_TICKET_STATUS status, + void *arg); +int SSL_CTX_set_session_ticket_cb(SSL_CTX *ctx, + SSL_CTX_generate_session_ticket_fn gen_cb, + SSL_CTX_decrypt_session_ticket_fn dec_cb, + void *arg); +int SSL_SESSION_set1_ticket_appdata(SSL_SESSION *ss, const void *data, size_t len); +int SSL_SESSION_get0_ticket_appdata(SSL_SESSION *ss, void **data, size_t *len); + +typedef unsigned int (*DTLS_timer_cb)(SSL *s, unsigned int timer_us); + +void DTLS_set_timer_cb(SSL *s, DTLS_timer_cb cb); + +typedef int (*SSL_allow_early_data_cb_fn)(SSL *s, void *arg); +void SSL_CTX_set_allow_early_data_cb(SSL_CTX *ctx, + SSL_allow_early_data_cb_fn cb, + void *arg); +void SSL_set_allow_early_data_cb(SSL *s, + SSL_allow_early_data_cb_fn cb, + void *arg); + +/* store the default cipher strings inside the library */ +const char *OSSL_default_cipher_list(void); +const char *OSSL_default_ciphersuites(void); + +/* RFC8879 Certificate compression APIs */ + +int SSL_CTX_compress_certs(SSL_CTX *ctx, int alg); +int SSL_compress_certs(SSL *ssl, int alg); + +int SSL_CTX_set1_cert_comp_preference(SSL_CTX *ctx, int *algs, size_t len); +int SSL_set1_cert_comp_preference(SSL *ssl, int *algs, size_t len); + +int SSL_CTX_set1_compressed_cert(SSL_CTX *ctx, int algorithm, unsigned char *comp_data, + size_t comp_length, size_t orig_length); +int SSL_set1_compressed_cert(SSL *ssl, int algorithm, unsigned char *comp_data, + size_t comp_length, size_t orig_length); +size_t SSL_CTX_get1_compressed_cert(SSL_CTX *ctx, int alg, unsigned char **data, size_t *orig_len); +size_t SSL_get1_compressed_cert(SSL *ssl, int alg, unsigned char **data, size_t *orig_len); + +__owur int SSL_add_expected_rpk(SSL *s, EVP_PKEY *rpk); +__owur EVP_PKEY *SSL_get0_peer_rpk(const SSL *s); +__owur EVP_PKEY *SSL_SESSION_get0_peer_rpk(SSL_SESSION *s); +__owur int SSL_get_negotiated_client_cert_type(const SSL *s); +__owur int SSL_get_negotiated_server_cert_type(const SSL *s); + +__owur int SSL_set1_client_cert_type(SSL *s, const unsigned char *val, size_t len); +__owur int SSL_set1_server_cert_type(SSL *s, const unsigned char *val, size_t len); +__owur int SSL_CTX_set1_client_cert_type(SSL_CTX *ctx, const unsigned char *val, size_t len); +__owur int SSL_CTX_set1_server_cert_type(SSL_CTX *ctx, const unsigned char *val, size_t len); +__owur int SSL_get0_client_cert_type(const SSL *s, unsigned char **t, size_t *len); +__owur int SSL_get0_server_cert_type(const SSL *s, unsigned char **t, size_t *len); +__owur int SSL_CTX_get0_client_cert_type(const SSL_CTX *ctx, unsigned char **t, size_t *len); +__owur int SSL_CTX_get0_server_cert_type(const SSL_CTX *s, unsigned char **t, size_t *len); + +/* + * Protection level. For <= TLSv1.2 only "NONE" and "APPLICATION" are used. + */ +#define OSSL_RECORD_PROTECTION_LEVEL_NONE 0 +#define OSSL_RECORD_PROTECTION_LEVEL_EARLY 1 +#define OSSL_RECORD_PROTECTION_LEVEL_HANDSHAKE 2 +#define OSSL_RECORD_PROTECTION_LEVEL_APPLICATION 3 + +int SSL_set_quic_tls_cbs(SSL *s, const OSSL_DISPATCH *qtdis, void *arg); +int SSL_set_quic_tls_transport_params(SSL *s, + const unsigned char *params, + size_t params_len); + +int SSL_set_quic_tls_early_data_enabled(SSL *s, int enabled); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ui.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ui.h new file mode 100644 index 000000000000..901af471fd0b --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/ui.h @@ -0,0 +1,409 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/ui.h.in + * + * Copyright 2001-2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_UI_H +#define OPENSSL_UI_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_UI_H +#endif + +#include + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#include +#endif +#include +#include +#include +#include + +/* For compatibility reasons, the macro OPENSSL_NO_UI is currently retained */ +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifdef OPENSSL_NO_UI_CONSOLE +#define OPENSSL_NO_UI +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * All the following functions return -1 or NULL on error and in some cases + * (UI_process()) -2 if interrupted or in some other way cancelled. When + * everything is fine, they return 0, a positive value or a non-NULL pointer, + * all depending on their purpose. + */ + +/* Creators and destructor. */ +UI *UI_new(void); +UI *UI_new_method(const UI_METHOD *method); +void UI_free(UI *ui); + +/*- + The following functions are used to add strings to be printed and prompt + strings to prompt for data. The names are UI_{add,dup}__string + and UI_{add,dup}_input_boolean. + + UI_{add,dup}__string have the following meanings: + add add a text or prompt string. The pointers given to these + functions are used verbatim, no copying is done. + dup make a copy of the text or prompt string, then add the copy + to the collection of strings in the user interface. + + The function is a name for the functionality that the given + string shall be used for. It can be one of: + input use the string as data prompt. + verify use the string as verification prompt. This + is used to verify a previous input. + info use the string for informational output. + error use the string for error output. + Honestly, there's currently no difference between info and error for the + moment. + + UI_{add,dup}_input_boolean have the same semantics for "add" and "dup", + and are typically used when one wants to prompt for a yes/no response. + + All of the functions in this group take a UI and a prompt string. + The string input and verify addition functions also take a flag argument, + a buffer for the result to end up with, a minimum input size and a maximum + input size (the result buffer MUST be large enough to be able to contain + the maximum number of characters). Additionally, the verify addition + functions takes another buffer to compare the result against. + The boolean input functions take an action description string (which should + be safe to ignore if the expected user action is obvious, for example with + a dialog box with an OK button and a Cancel button), a string of acceptable + characters to mean OK and to mean Cancel. The two last strings are checked + to make sure they don't have common characters. Additionally, the same + flag argument as for the string input is taken, as well as a result buffer. + The result buffer is required to be at least one byte long. Depending on + the answer, the first character from the OK or the Cancel character strings + will be stored in the first byte of the result buffer. No NUL will be + added, so the result is *not* a string. + + On success, the all return an index of the added information. That index + is useful when retrieving results with UI_get0_result(). */ +int UI_add_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_dup_input_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize); +int UI_add_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, + const char *test_buf); +int UI_dup_verify_string(UI *ui, const char *prompt, int flags, + char *result_buf, int minsize, int maxsize, + const char *test_buf); +int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc, + const char *ok_chars, const char *cancel_chars, + int flags, char *result_buf); +int UI_add_info_string(UI *ui, const char *text); +int UI_dup_info_string(UI *ui, const char *text); +int UI_add_error_string(UI *ui, const char *text); +int UI_dup_error_string(UI *ui, const char *text); + +/* These are the possible flags. They can be or'ed together. */ +/* Use to have echoing of input */ +#define UI_INPUT_FLAG_ECHO 0x01 +/* + * Use a default password. Where that password is found is completely up to + * the application, it might for example be in the user data set with + * UI_add_user_data(). It is not recommended to have more than one input in + * each UI being marked with this flag, or the application might get + * confused. + */ +#define UI_INPUT_FLAG_DEFAULT_PWD 0x02 + +/*- + * The user of these routines may want to define flags of their own. The core + * UI won't look at those, but will pass them on to the method routines. They + * must use higher bits so they don't get confused with the UI bits above. + * UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use. A good + * example of use is this: + * + * #define MY_UI_FLAG1 (0x01 << UI_INPUT_FLAG_USER_BASE) + * + */ +#define UI_INPUT_FLAG_USER_BASE 16 + +/*- + * The following function helps construct a prompt. + * phrase_desc is a textual short description of the phrase to enter, + * for example "pass phrase", and + * object_name is the name of the object + * (which might be a card name or a file name) or NULL. + * The returned string shall always be allocated on the heap with + * OPENSSL_malloc(), and need to be free'd with OPENSSL_free(). + * + * If the ui_method doesn't contain a pointer to a user-defined prompt + * constructor, a default string is built, looking like this: + * + * "Enter {phrase_desc} for {object_name}:" + * + * So, if phrase_desc has the value "pass phrase" and object_name has + * the value "foo.key", the resulting string is: + * + * "Enter pass phrase for foo.key:" + */ +char *UI_construct_prompt(UI *ui_method, + const char *phrase_desc, const char *object_name); + +/* + * The following function is used to store a pointer to user-specific data. + * Any previous such pointer will be returned and replaced. + * + * For callback purposes, this function makes a lot more sense than using + * ex_data, since the latter requires that different parts of OpenSSL or + * applications share the same ex_data index. + * + * Note that the UI_OpenSSL() method completely ignores the user data. Other + * methods may not, however. + */ +void *UI_add_user_data(UI *ui, void *user_data); +/* + * Alternatively, this function is used to duplicate the user data. + * This uses the duplicator method function. The destroy function will + * be used to free the user data in this case. + */ +int UI_dup_user_data(UI *ui, void *user_data); +/* We need a user data retrieving function as well. */ +void *UI_get0_user_data(UI *ui); + +/* Return the result associated with a prompt given with the index i. */ +const char *UI_get0_result(UI *ui, int i); +int UI_get_result_length(UI *ui, int i); + +/* When all strings have been added, process the whole thing. */ +int UI_process(UI *ui); + +/* + * Give a user interface parameterised control commands. This can be used to + * send down an integer, a data pointer or a function pointer, as well as be + * used to get information from a UI. + */ +int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f)(void)); + +/* The commands */ +/* + * Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the + * OpenSSL error stack before printing any info or added error messages and + * before any prompting. + */ +#define UI_CTRL_PRINT_ERRORS 1 +/* + * Check if a UI_process() is possible to do again with the same instance of + * a user interface. This makes UI_ctrl() return 1 if it is redoable, and 0 + * if not. + */ +#define UI_CTRL_IS_REDOABLE 2 + +/* Some methods may use extra data */ +#define UI_set_app_data(s, arg) UI_set_ex_data(s, 0, arg) +#define UI_get_app_data(s) UI_get_ex_data(s, 0) + +#define UI_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_UI, l, p, newf, dupf, freef) +int UI_set_ex_data(UI *r, int idx, void *arg); +void *UI_get_ex_data(const UI *r, int idx); + +/* Use specific methods instead of the built-in one */ +void UI_set_default_method(const UI_METHOD *meth); +const UI_METHOD *UI_get_default_method(void); +const UI_METHOD *UI_get_method(UI *ui); +const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth); + +#ifndef OPENSSL_NO_UI_CONSOLE + +/* The method with all the built-in thingies */ +UI_METHOD *UI_OpenSSL(void); + +#endif + +/* + * NULL method. Literally does nothing, but may serve as a placeholder + * to avoid internal default. + */ +const UI_METHOD *UI_null(void); + +/* ---------- For method writers ---------- */ +/*- + A method contains a number of functions that implement the low level + of the User Interface. The functions are: + + an opener This function starts a session, maybe by opening + a channel to a tty, or by opening a window. + a writer This function is called to write a given string, + maybe to the tty, maybe as a field label in a + window. + a flusher This function is called to flush everything that + has been output so far. It can be used to actually + display a dialog box after it has been built. + a reader This function is called to read a given prompt, + maybe from the tty, maybe from a field in a + window. Note that it's called with all string + structures, not only the prompt ones, so it must + check such things itself. + a closer This function closes the session, maybe by closing + the channel to the tty, or closing the window. + + All these functions are expected to return: + + 0 on error. + 1 on success. + -1 on out-of-band events, for example if some prompting has + been canceled (by pressing Ctrl-C, for example). This is + only checked when returned by the flusher or the reader. + + The way this is used, the opener is first called, then the writer for all + strings, then the flusher, then the reader for all strings and finally the + closer. Note that if you want to prompt from a terminal or other command + line interface, the best is to have the reader also write the prompts + instead of having the writer do it. If you want to prompt from a dialog + box, the writer can be used to build up the contents of the box, and the + flusher to actually display the box and run the event loop until all data + has been given, after which the reader only grabs the given data and puts + them back into the UI strings. + + All method functions take a UI as argument. Additionally, the writer and + the reader take a UI_STRING. +*/ + +/* + * The UI_STRING type is the data structure that contains all the needed info + * about a string or a prompt, including test data for a verification prompt. + */ +typedef struct ui_string_st UI_STRING; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(UI_STRING, UI_STRING, UI_STRING) +#define sk_UI_STRING_num(sk) OPENSSL_sk_num(ossl_check_const_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_value(sk, idx) ((UI_STRING *)OPENSSL_sk_value(ossl_check_const_UI_STRING_sk_type(sk), (idx))) +#define sk_UI_STRING_new(cmp) ((STACK_OF(UI_STRING) *)OPENSSL_sk_new(ossl_check_UI_STRING_compfunc_type(cmp))) +#define sk_UI_STRING_new_null() ((STACK_OF(UI_STRING) *)OPENSSL_sk_new_null()) +#define sk_UI_STRING_new_reserve(cmp, n) ((STACK_OF(UI_STRING) *)OPENSSL_sk_new_reserve(ossl_check_UI_STRING_compfunc_type(cmp), (n))) +#define sk_UI_STRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_UI_STRING_sk_type(sk), (n)) +#define sk_UI_STRING_free(sk) OPENSSL_sk_free(ossl_check_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_zero(sk) OPENSSL_sk_zero(ossl_check_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_delete(sk, i) ((UI_STRING *)OPENSSL_sk_delete(ossl_check_UI_STRING_sk_type(sk), (i))) +#define sk_UI_STRING_delete_ptr(sk, ptr) ((UI_STRING *)OPENSSL_sk_delete_ptr(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr))) +#define sk_UI_STRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr)) +#define sk_UI_STRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr)) +#define sk_UI_STRING_pop(sk) ((UI_STRING *)OPENSSL_sk_pop(ossl_check_UI_STRING_sk_type(sk))) +#define sk_UI_STRING_shift(sk) ((UI_STRING *)OPENSSL_sk_shift(ossl_check_UI_STRING_sk_type(sk))) +#define sk_UI_STRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_UI_STRING_sk_type(sk),ossl_check_UI_STRING_freefunc_type(freefunc)) +#define sk_UI_STRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr), (idx)) +#define sk_UI_STRING_set(sk, idx, ptr) ((UI_STRING *)OPENSSL_sk_set(ossl_check_UI_STRING_sk_type(sk), (idx), ossl_check_UI_STRING_type(ptr))) +#define sk_UI_STRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr)) +#define sk_UI_STRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr)) +#define sk_UI_STRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_type(ptr), pnum) +#define sk_UI_STRING_sort(sk) OPENSSL_sk_sort(ossl_check_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_UI_STRING_sk_type(sk)) +#define sk_UI_STRING_dup(sk) ((STACK_OF(UI_STRING) *)OPENSSL_sk_dup(ossl_check_const_UI_STRING_sk_type(sk))) +#define sk_UI_STRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(UI_STRING) *)OPENSSL_sk_deep_copy(ossl_check_const_UI_STRING_sk_type(sk), ossl_check_UI_STRING_copyfunc_type(copyfunc), ossl_check_UI_STRING_freefunc_type(freefunc))) +#define sk_UI_STRING_set_cmp_func(sk, cmp) ((sk_UI_STRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_UI_STRING_sk_type(sk), ossl_check_UI_STRING_compfunc_type(cmp))) + +/* clang-format on */ + +/* + * The different types of strings that are currently supported. This is only + * needed by method authors. + */ +enum UI_string_types { + UIT_NONE = 0, + UIT_PROMPT, /* Prompt for a string */ + UIT_VERIFY, /* Prompt for a string and verify */ + UIT_BOOLEAN, /* Prompt for a yes/no response */ + UIT_INFO, /* Send info to the user */ + UIT_ERROR /* Send an error message to the user */ +}; + +/* Create and manipulate methods */ +UI_METHOD *UI_create_method(const char *name); +void UI_destroy_method(UI_METHOD *ui_method); +int UI_method_set_opener(UI_METHOD *method, int (*opener)(UI *ui)); +int UI_method_set_writer(UI_METHOD *method, + int (*writer)(UI *ui, UI_STRING *uis)); +int UI_method_set_flusher(UI_METHOD *method, int (*flusher)(UI *ui)); +int UI_method_set_reader(UI_METHOD *method, + int (*reader)(UI *ui, UI_STRING *uis)); +int UI_method_set_closer(UI_METHOD *method, int (*closer)(UI *ui)); +int UI_method_set_data_duplicator(UI_METHOD *method, + void *(*duplicator)(UI *ui, void *ui_data), + void (*destructor)(UI *ui, void *ui_data)); +int UI_method_set_prompt_constructor(UI_METHOD *method, + char *(*prompt_constructor)(UI *ui, + const char + *phrase_desc, + const char + *object_name)); +int UI_method_set_ex_data(UI_METHOD *method, int idx, void *data); +int (*UI_method_get_opener(const UI_METHOD *method))(UI *); +int (*UI_method_get_writer(const UI_METHOD *method))(UI *, UI_STRING *); +int (*UI_method_get_flusher(const UI_METHOD *method))(UI *); +int (*UI_method_get_reader(const UI_METHOD *method))(UI *, UI_STRING *); +int (*UI_method_get_closer(const UI_METHOD *method))(UI *); +char *(*UI_method_get_prompt_constructor(const UI_METHOD *method))(UI *, const char *, const char *); +void *(*UI_method_get_data_duplicator(const UI_METHOD *method))(UI *, void *); +void (*UI_method_get_data_destructor(const UI_METHOD *method))(UI *, void *); +const void *UI_method_get_ex_data(const UI_METHOD *method, int idx); + +/* + * The following functions are helpers for method writers to access relevant + * data from a UI_STRING. + */ + +/* Return type of the UI_STRING */ +enum UI_string_types UI_get_string_type(UI_STRING *uis); +/* Return input flags of the UI_STRING */ +int UI_get_input_flags(UI_STRING *uis); +/* Return the actual string to output (the prompt, info or error) */ +const char *UI_get0_output_string(UI_STRING *uis); +/* + * Return the optional action string to output (the boolean prompt + * instruction) + */ +const char *UI_get0_action_string(UI_STRING *uis); +/* Return the result of a prompt */ +const char *UI_get0_result_string(UI_STRING *uis); +int UI_get_result_string_length(UI_STRING *uis); +/* + * Return the string to test the result against. Only useful with verifies. + */ +const char *UI_get0_test_string(UI_STRING *uis); +/* Return the required minimum size of the result */ +int UI_get_result_minsize(UI_STRING *uis); +/* Return the required maximum size of the result */ +int UI_get_result_maxsize(UI_STRING *uis); +/* Set the result of a UI_STRING. */ +int UI_set_result(UI *ui, UI_STRING *uis, const char *result); +int UI_set_result_ex(UI *ui, UI_STRING *uis, const char *result, int len); + +/* A couple of popular utility functions */ +int UI_UTIL_read_pw_string(char *buf, int length, const char *prompt, + int verify); +int UI_UTIL_read_pw(char *buf, char *buff, int size, const char *prompt, + int verify); +UI_METHOD *UI_UTIL_wrap_read_pem_callback(pem_password_cb *cb, int rwflag); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/x509.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/x509.h new file mode 100644 index 000000000000..30681e4fb698 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/x509.h @@ -0,0 +1,1301 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/x509.h.in + * + * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved. + * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_X509_H +#define OPENSSL_X509_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_X509_H +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#include +#include +#include +#endif + +#include +#include +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Needed stacks for types defined in other headers */ +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_NAME, X509_NAME, X509_NAME) +#define sk_X509_NAME_num(sk) OPENSSL_sk_num(ossl_check_const_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_value(sk, idx) ((X509_NAME *)OPENSSL_sk_value(ossl_check_const_X509_NAME_sk_type(sk), (idx))) +#define sk_X509_NAME_new(cmp) ((STACK_OF(X509_NAME) *)OPENSSL_sk_new(ossl_check_X509_NAME_compfunc_type(cmp))) +#define sk_X509_NAME_new_null() ((STACK_OF(X509_NAME) *)OPENSSL_sk_new_null()) +#define sk_X509_NAME_new_reserve(cmp, n) ((STACK_OF(X509_NAME) *)OPENSSL_sk_new_reserve(ossl_check_X509_NAME_compfunc_type(cmp), (n))) +#define sk_X509_NAME_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_NAME_sk_type(sk), (n)) +#define sk_X509_NAME_free(sk) OPENSSL_sk_free(ossl_check_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_zero(sk) OPENSSL_sk_zero(ossl_check_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_delete(sk, i) ((X509_NAME *)OPENSSL_sk_delete(ossl_check_X509_NAME_sk_type(sk), (i))) +#define sk_X509_NAME_delete_ptr(sk, ptr) ((X509_NAME *)OPENSSL_sk_delete_ptr(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr))) +#define sk_X509_NAME_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr)) +#define sk_X509_NAME_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr)) +#define sk_X509_NAME_pop(sk) ((X509_NAME *)OPENSSL_sk_pop(ossl_check_X509_NAME_sk_type(sk))) +#define sk_X509_NAME_shift(sk) ((X509_NAME *)OPENSSL_sk_shift(ossl_check_X509_NAME_sk_type(sk))) +#define sk_X509_NAME_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_NAME_sk_type(sk),ossl_check_X509_NAME_freefunc_type(freefunc)) +#define sk_X509_NAME_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr), (idx)) +#define sk_X509_NAME_set(sk, idx, ptr) ((X509_NAME *)OPENSSL_sk_set(ossl_check_X509_NAME_sk_type(sk), (idx), ossl_check_X509_NAME_type(ptr))) +#define sk_X509_NAME_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr)) +#define sk_X509_NAME_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr)) +#define sk_X509_NAME_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr), pnum) +#define sk_X509_NAME_sort(sk) OPENSSL_sk_sort(ossl_check_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_NAME_sk_type(sk)) +#define sk_X509_NAME_dup(sk) ((STACK_OF(X509_NAME) *)OPENSSL_sk_dup(ossl_check_const_X509_NAME_sk_type(sk))) +#define sk_X509_NAME_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_NAME) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_NAME_sk_type(sk), ossl_check_X509_NAME_copyfunc_type(copyfunc), ossl_check_X509_NAME_freefunc_type(freefunc))) +#define sk_X509_NAME_set_cmp_func(sk, cmp) ((sk_X509_NAME_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509, X509, X509) +#define sk_X509_num(sk) OPENSSL_sk_num(ossl_check_const_X509_sk_type(sk)) +#define sk_X509_value(sk, idx) ((X509 *)OPENSSL_sk_value(ossl_check_const_X509_sk_type(sk), (idx))) +#define sk_X509_new(cmp) ((STACK_OF(X509) *)OPENSSL_sk_new(ossl_check_X509_compfunc_type(cmp))) +#define sk_X509_new_null() ((STACK_OF(X509) *)OPENSSL_sk_new_null()) +#define sk_X509_new_reserve(cmp, n) ((STACK_OF(X509) *)OPENSSL_sk_new_reserve(ossl_check_X509_compfunc_type(cmp), (n))) +#define sk_X509_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_sk_type(sk), (n)) +#define sk_X509_free(sk) OPENSSL_sk_free(ossl_check_X509_sk_type(sk)) +#define sk_X509_zero(sk) OPENSSL_sk_zero(ossl_check_X509_sk_type(sk)) +#define sk_X509_delete(sk, i) ((X509 *)OPENSSL_sk_delete(ossl_check_X509_sk_type(sk), (i))) +#define sk_X509_delete_ptr(sk, ptr) ((X509 *)OPENSSL_sk_delete_ptr(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr))) +#define sk_X509_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr)) +#define sk_X509_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr)) +#define sk_X509_pop(sk) ((X509 *)OPENSSL_sk_pop(ossl_check_X509_sk_type(sk))) +#define sk_X509_shift(sk) ((X509 *)OPENSSL_sk_shift(ossl_check_X509_sk_type(sk))) +#define sk_X509_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_sk_type(sk),ossl_check_X509_freefunc_type(freefunc)) +#define sk_X509_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr), (idx)) +#define sk_X509_set(sk, idx, ptr) ((X509 *)OPENSSL_sk_set(ossl_check_X509_sk_type(sk), (idx), ossl_check_X509_type(ptr))) +#define sk_X509_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr)) +#define sk_X509_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr)) +#define sk_X509_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr), pnum) +#define sk_X509_sort(sk) OPENSSL_sk_sort(ossl_check_X509_sk_type(sk)) +#define sk_X509_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_sk_type(sk)) +#define sk_X509_dup(sk) ((STACK_OF(X509) *)OPENSSL_sk_dup(ossl_check_const_X509_sk_type(sk))) +#define sk_X509_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_sk_type(sk), ossl_check_X509_copyfunc_type(copyfunc), ossl_check_X509_freefunc_type(freefunc))) +#define sk_X509_set_cmp_func(sk, cmp) ((sk_X509_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_sk_type(sk), ossl_check_X509_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509_REVOKED, X509_REVOKED, X509_REVOKED) +#define sk_X509_REVOKED_num(sk) OPENSSL_sk_num(ossl_check_const_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_value(sk, idx) ((X509_REVOKED *)OPENSSL_sk_value(ossl_check_const_X509_REVOKED_sk_type(sk), (idx))) +#define sk_X509_REVOKED_new(cmp) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_new(ossl_check_X509_REVOKED_compfunc_type(cmp))) +#define sk_X509_REVOKED_new_null() ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_new_null()) +#define sk_X509_REVOKED_new_reserve(cmp, n) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_new_reserve(ossl_check_X509_REVOKED_compfunc_type(cmp), (n))) +#define sk_X509_REVOKED_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_REVOKED_sk_type(sk), (n)) +#define sk_X509_REVOKED_free(sk) OPENSSL_sk_free(ossl_check_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_zero(sk) OPENSSL_sk_zero(ossl_check_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_delete(sk, i) ((X509_REVOKED *)OPENSSL_sk_delete(ossl_check_X509_REVOKED_sk_type(sk), (i))) +#define sk_X509_REVOKED_delete_ptr(sk, ptr) ((X509_REVOKED *)OPENSSL_sk_delete_ptr(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr))) +#define sk_X509_REVOKED_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr)) +#define sk_X509_REVOKED_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr)) +#define sk_X509_REVOKED_pop(sk) ((X509_REVOKED *)OPENSSL_sk_pop(ossl_check_X509_REVOKED_sk_type(sk))) +#define sk_X509_REVOKED_shift(sk) ((X509_REVOKED *)OPENSSL_sk_shift(ossl_check_X509_REVOKED_sk_type(sk))) +#define sk_X509_REVOKED_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_REVOKED_sk_type(sk),ossl_check_X509_REVOKED_freefunc_type(freefunc)) +#define sk_X509_REVOKED_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr), (idx)) +#define sk_X509_REVOKED_set(sk, idx, ptr) ((X509_REVOKED *)OPENSSL_sk_set(ossl_check_X509_REVOKED_sk_type(sk), (idx), ossl_check_X509_REVOKED_type(ptr))) +#define sk_X509_REVOKED_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr)) +#define sk_X509_REVOKED_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr)) +#define sk_X509_REVOKED_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr), pnum) +#define sk_X509_REVOKED_sort(sk) OPENSSL_sk_sort(ossl_check_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_REVOKED_sk_type(sk)) +#define sk_X509_REVOKED_dup(sk) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_dup(ossl_check_const_X509_REVOKED_sk_type(sk))) +#define sk_X509_REVOKED_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_copyfunc_type(copyfunc), ossl_check_X509_REVOKED_freefunc_type(freefunc))) +#define sk_X509_REVOKED_set_cmp_func(sk, cmp) ((sk_X509_REVOKED_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509_CRL, X509_CRL, X509_CRL) +#define sk_X509_CRL_num(sk) OPENSSL_sk_num(ossl_check_const_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_value(sk, idx) ((X509_CRL *)OPENSSL_sk_value(ossl_check_const_X509_CRL_sk_type(sk), (idx))) +#define sk_X509_CRL_new(cmp) ((STACK_OF(X509_CRL) *)OPENSSL_sk_new(ossl_check_X509_CRL_compfunc_type(cmp))) +#define sk_X509_CRL_new_null() ((STACK_OF(X509_CRL) *)OPENSSL_sk_new_null()) +#define sk_X509_CRL_new_reserve(cmp, n) ((STACK_OF(X509_CRL) *)OPENSSL_sk_new_reserve(ossl_check_X509_CRL_compfunc_type(cmp), (n))) +#define sk_X509_CRL_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_CRL_sk_type(sk), (n)) +#define sk_X509_CRL_free(sk) OPENSSL_sk_free(ossl_check_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_zero(sk) OPENSSL_sk_zero(ossl_check_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_delete(sk, i) ((X509_CRL *)OPENSSL_sk_delete(ossl_check_X509_CRL_sk_type(sk), (i))) +#define sk_X509_CRL_delete_ptr(sk, ptr) ((X509_CRL *)OPENSSL_sk_delete_ptr(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr))) +#define sk_X509_CRL_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr)) +#define sk_X509_CRL_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr)) +#define sk_X509_CRL_pop(sk) ((X509_CRL *)OPENSSL_sk_pop(ossl_check_X509_CRL_sk_type(sk))) +#define sk_X509_CRL_shift(sk) ((X509_CRL *)OPENSSL_sk_shift(ossl_check_X509_CRL_sk_type(sk))) +#define sk_X509_CRL_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_CRL_sk_type(sk),ossl_check_X509_CRL_freefunc_type(freefunc)) +#define sk_X509_CRL_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr), (idx)) +#define sk_X509_CRL_set(sk, idx, ptr) ((X509_CRL *)OPENSSL_sk_set(ossl_check_X509_CRL_sk_type(sk), (idx), ossl_check_X509_CRL_type(ptr))) +#define sk_X509_CRL_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr)) +#define sk_X509_CRL_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr)) +#define sk_X509_CRL_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr), pnum) +#define sk_X509_CRL_sort(sk) OPENSSL_sk_sort(ossl_check_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_CRL_sk_type(sk)) +#define sk_X509_CRL_dup(sk) ((STACK_OF(X509_CRL) *)OPENSSL_sk_dup(ossl_check_const_X509_CRL_sk_type(sk))) +#define sk_X509_CRL_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_CRL) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_CRL_sk_type(sk), ossl_check_X509_CRL_copyfunc_type(copyfunc), ossl_check_X509_CRL_freefunc_type(freefunc))) +#define sk_X509_CRL_set_cmp_func(sk, cmp) ((sk_X509_CRL_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_compfunc_type(cmp))) + +/* clang-format on */ + +/* Flags for X509_get_signature_info() */ +/* Signature info is valid */ +#define X509_SIG_INFO_VALID 0x1 +/* Signature is suitable for TLS use */ +#define X509_SIG_INFO_TLS 0x2 + +#define X509_FILETYPE_PEM 1 +#define X509_FILETYPE_ASN1 2 +#define X509_FILETYPE_DEFAULT 3 + +/*- + * : + * The KeyUsage BITSTRING is treated as a little-endian integer, hence bit `0` + * is 0x80, while bit `7` is 0x01 (the LSB of the integer value), bit `8` is + * then the MSB of the second octet, or 0x8000. + */ +#define X509v3_KU_DIGITAL_SIGNATURE 0x0080 /* (0) */ +#define X509v3_KU_NON_REPUDIATION 0x0040 /* (1) */ +#define X509v3_KU_KEY_ENCIPHERMENT 0x0020 /* (2) */ +#define X509v3_KU_DATA_ENCIPHERMENT 0x0010 /* (3) */ +#define X509v3_KU_KEY_AGREEMENT 0x0008 /* (4) */ +#define X509v3_KU_KEY_CERT_SIGN 0x0004 /* (5) */ +#define X509v3_KU_CRL_SIGN 0x0002 /* (6) */ +#define X509v3_KU_ENCIPHER_ONLY 0x0001 /* (7) */ +#define X509v3_KU_DECIPHER_ONLY 0x8000 /* (8) */ +#ifndef OPENSSL_NO_DEPRECATED_3_4 +#define X509v3_KU_UNDEF 0xffff /* vestigial, not used */ +#endif + +struct X509_algor_st { + ASN1_OBJECT *algorithm; + ASN1_TYPE *parameter; +} /* X509_ALGOR */; + +typedef STACK_OF(X509_ALGOR) X509_ALGORS; + +typedef struct X509_val_st { + ASN1_TIME *notBefore; + ASN1_TIME *notAfter; +} X509_VAL; + +typedef struct X509_sig_st X509_SIG; + +typedef struct X509_name_entry_st X509_NAME_ENTRY; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_NAME_ENTRY, X509_NAME_ENTRY, X509_NAME_ENTRY) +#define sk_X509_NAME_ENTRY_num(sk) OPENSSL_sk_num(ossl_check_const_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_value(sk, idx) ((X509_NAME_ENTRY *)OPENSSL_sk_value(ossl_check_const_X509_NAME_ENTRY_sk_type(sk), (idx))) +#define sk_X509_NAME_ENTRY_new(cmp) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_new(ossl_check_X509_NAME_ENTRY_compfunc_type(cmp))) +#define sk_X509_NAME_ENTRY_new_null() ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_new_null()) +#define sk_X509_NAME_ENTRY_new_reserve(cmp, n) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_new_reserve(ossl_check_X509_NAME_ENTRY_compfunc_type(cmp), (n))) +#define sk_X509_NAME_ENTRY_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_NAME_ENTRY_sk_type(sk), (n)) +#define sk_X509_NAME_ENTRY_free(sk) OPENSSL_sk_free(ossl_check_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_zero(sk) OPENSSL_sk_zero(ossl_check_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_delete(sk, i) ((X509_NAME_ENTRY *)OPENSSL_sk_delete(ossl_check_X509_NAME_ENTRY_sk_type(sk), (i))) +#define sk_X509_NAME_ENTRY_delete_ptr(sk, ptr) ((X509_NAME_ENTRY *)OPENSSL_sk_delete_ptr(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr))) +#define sk_X509_NAME_ENTRY_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr)) +#define sk_X509_NAME_ENTRY_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr)) +#define sk_X509_NAME_ENTRY_pop(sk) ((X509_NAME_ENTRY *)OPENSSL_sk_pop(ossl_check_X509_NAME_ENTRY_sk_type(sk))) +#define sk_X509_NAME_ENTRY_shift(sk) ((X509_NAME_ENTRY *)OPENSSL_sk_shift(ossl_check_X509_NAME_ENTRY_sk_type(sk))) +#define sk_X509_NAME_ENTRY_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_NAME_ENTRY_sk_type(sk),ossl_check_X509_NAME_ENTRY_freefunc_type(freefunc)) +#define sk_X509_NAME_ENTRY_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr), (idx)) +#define sk_X509_NAME_ENTRY_set(sk, idx, ptr) ((X509_NAME_ENTRY *)OPENSSL_sk_set(ossl_check_X509_NAME_ENTRY_sk_type(sk), (idx), ossl_check_X509_NAME_ENTRY_type(ptr))) +#define sk_X509_NAME_ENTRY_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr)) +#define sk_X509_NAME_ENTRY_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr)) +#define sk_X509_NAME_ENTRY_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr), pnum) +#define sk_X509_NAME_ENTRY_sort(sk) OPENSSL_sk_sort(ossl_check_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_NAME_ENTRY_sk_type(sk)) +#define sk_X509_NAME_ENTRY_dup(sk) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_dup(ossl_check_const_X509_NAME_ENTRY_sk_type(sk))) +#define sk_X509_NAME_ENTRY_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_copyfunc_type(copyfunc), ossl_check_X509_NAME_ENTRY_freefunc_type(freefunc))) +#define sk_X509_NAME_ENTRY_set_cmp_func(sk, cmp) ((sk_X509_NAME_ENTRY_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_compfunc_type(cmp))) + +/* clang-format on */ + +#define X509_EX_V_NETSCAPE_HACK 0x8000 +#define X509_EX_V_INIT 0x0001 +typedef struct X509_extension_st X509_EXTENSION; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_EXTENSION, X509_EXTENSION, X509_EXTENSION) +#define sk_X509_EXTENSION_num(sk) OPENSSL_sk_num(ossl_check_const_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_value(sk, idx) ((X509_EXTENSION *)OPENSSL_sk_value(ossl_check_const_X509_EXTENSION_sk_type(sk), (idx))) +#define sk_X509_EXTENSION_new(cmp) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_new(ossl_check_X509_EXTENSION_compfunc_type(cmp))) +#define sk_X509_EXTENSION_new_null() ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_new_null()) +#define sk_X509_EXTENSION_new_reserve(cmp, n) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_new_reserve(ossl_check_X509_EXTENSION_compfunc_type(cmp), (n))) +#define sk_X509_EXTENSION_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_EXTENSION_sk_type(sk), (n)) +#define sk_X509_EXTENSION_free(sk) OPENSSL_sk_free(ossl_check_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_zero(sk) OPENSSL_sk_zero(ossl_check_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_delete(sk, i) ((X509_EXTENSION *)OPENSSL_sk_delete(ossl_check_X509_EXTENSION_sk_type(sk), (i))) +#define sk_X509_EXTENSION_delete_ptr(sk, ptr) ((X509_EXTENSION *)OPENSSL_sk_delete_ptr(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr))) +#define sk_X509_EXTENSION_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr)) +#define sk_X509_EXTENSION_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr)) +#define sk_X509_EXTENSION_pop(sk) ((X509_EXTENSION *)OPENSSL_sk_pop(ossl_check_X509_EXTENSION_sk_type(sk))) +#define sk_X509_EXTENSION_shift(sk) ((X509_EXTENSION *)OPENSSL_sk_shift(ossl_check_X509_EXTENSION_sk_type(sk))) +#define sk_X509_EXTENSION_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_EXTENSION_sk_type(sk),ossl_check_X509_EXTENSION_freefunc_type(freefunc)) +#define sk_X509_EXTENSION_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr), (idx)) +#define sk_X509_EXTENSION_set(sk, idx, ptr) ((X509_EXTENSION *)OPENSSL_sk_set(ossl_check_X509_EXTENSION_sk_type(sk), (idx), ossl_check_X509_EXTENSION_type(ptr))) +#define sk_X509_EXTENSION_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr)) +#define sk_X509_EXTENSION_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr)) +#define sk_X509_EXTENSION_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr), pnum) +#define sk_X509_EXTENSION_sort(sk) OPENSSL_sk_sort(ossl_check_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_EXTENSION_sk_type(sk)) +#define sk_X509_EXTENSION_dup(sk) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_dup(ossl_check_const_X509_EXTENSION_sk_type(sk))) +#define sk_X509_EXTENSION_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_copyfunc_type(copyfunc), ossl_check_X509_EXTENSION_freefunc_type(freefunc))) +#define sk_X509_EXTENSION_set_cmp_func(sk, cmp) ((sk_X509_EXTENSION_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_compfunc_type(cmp))) + +/* clang-format on */ +typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS; +typedef struct x509_attributes_st X509_ATTRIBUTE; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_ATTRIBUTE, X509_ATTRIBUTE, X509_ATTRIBUTE) +#define sk_X509_ATTRIBUTE_num(sk) OPENSSL_sk_num(ossl_check_const_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_value(sk, idx) ((X509_ATTRIBUTE *)OPENSSL_sk_value(ossl_check_const_X509_ATTRIBUTE_sk_type(sk), (idx))) +#define sk_X509_ATTRIBUTE_new(cmp) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_new(ossl_check_X509_ATTRIBUTE_compfunc_type(cmp))) +#define sk_X509_ATTRIBUTE_new_null() ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_new_null()) +#define sk_X509_ATTRIBUTE_new_reserve(cmp, n) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_new_reserve(ossl_check_X509_ATTRIBUTE_compfunc_type(cmp), (n))) +#define sk_X509_ATTRIBUTE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_ATTRIBUTE_sk_type(sk), (n)) +#define sk_X509_ATTRIBUTE_free(sk) OPENSSL_sk_free(ossl_check_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_zero(sk) OPENSSL_sk_zero(ossl_check_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_delete(sk, i) ((X509_ATTRIBUTE *)OPENSSL_sk_delete(ossl_check_X509_ATTRIBUTE_sk_type(sk), (i))) +#define sk_X509_ATTRIBUTE_delete_ptr(sk, ptr) ((X509_ATTRIBUTE *)OPENSSL_sk_delete_ptr(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr))) +#define sk_X509_ATTRIBUTE_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr)) +#define sk_X509_ATTRIBUTE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr)) +#define sk_X509_ATTRIBUTE_pop(sk) ((X509_ATTRIBUTE *)OPENSSL_sk_pop(ossl_check_X509_ATTRIBUTE_sk_type(sk))) +#define sk_X509_ATTRIBUTE_shift(sk) ((X509_ATTRIBUTE *)OPENSSL_sk_shift(ossl_check_X509_ATTRIBUTE_sk_type(sk))) +#define sk_X509_ATTRIBUTE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_ATTRIBUTE_sk_type(sk),ossl_check_X509_ATTRIBUTE_freefunc_type(freefunc)) +#define sk_X509_ATTRIBUTE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr), (idx)) +#define sk_X509_ATTRIBUTE_set(sk, idx, ptr) ((X509_ATTRIBUTE *)OPENSSL_sk_set(ossl_check_X509_ATTRIBUTE_sk_type(sk), (idx), ossl_check_X509_ATTRIBUTE_type(ptr))) +#define sk_X509_ATTRIBUTE_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr)) +#define sk_X509_ATTRIBUTE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr)) +#define sk_X509_ATTRIBUTE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr), pnum) +#define sk_X509_ATTRIBUTE_sort(sk) OPENSSL_sk_sort(ossl_check_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_ATTRIBUTE_sk_type(sk)) +#define sk_X509_ATTRIBUTE_dup(sk) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_dup(ossl_check_const_X509_ATTRIBUTE_sk_type(sk))) +#define sk_X509_ATTRIBUTE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_copyfunc_type(copyfunc), ossl_check_X509_ATTRIBUTE_freefunc_type(freefunc))) +#define sk_X509_ATTRIBUTE_set_cmp_func(sk, cmp) ((sk_X509_ATTRIBUTE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_compfunc_type(cmp))) + +/* clang-format on */ +typedef struct X509_req_info_st X509_REQ_INFO; +typedef struct X509_req_st X509_REQ; +typedef struct x509_cert_aux_st X509_CERT_AUX; +typedef struct x509_cinf_st X509_CINF; + +/* Flags for X509_print_ex() */ + +#define X509_FLAG_COMPAT 0 +#define X509_FLAG_NO_HEADER 1L +#define X509_FLAG_NO_VERSION (1L << 1) +#define X509_FLAG_NO_SERIAL (1L << 2) +#define X509_FLAG_NO_SIGNAME (1L << 3) +#define X509_FLAG_NO_ISSUER (1L << 4) +#define X509_FLAG_NO_VALIDITY (1L << 5) +#define X509_FLAG_NO_SUBJECT (1L << 6) +#define X509_FLAG_NO_PUBKEY (1L << 7) +#define X509_FLAG_NO_EXTENSIONS (1L << 8) +#define X509_FLAG_NO_SIGDUMP (1L << 9) +#define X509_FLAG_NO_AUX (1L << 10) +#define X509_FLAG_NO_ATTRIBUTES (1L << 11) +#define X509_FLAG_NO_IDS (1L << 12) +#define X509_FLAG_EXTENSIONS_ONLY_KID (1L << 13) + +/* Flags specific to X509_NAME_print_ex() */ + +/* The field separator information */ + +#define XN_FLAG_SEP_MASK (0xf << 16) + +#define XN_FLAG_COMPAT 0 /* Traditional; use old X509_NAME_print */ +#define XN_FLAG_SEP_COMMA_PLUS (1 << 16) /* RFC2253 ,+ */ +#define XN_FLAG_SEP_CPLUS_SPC (2 << 16) /* ,+ spaced: more readable */ +#define XN_FLAG_SEP_SPLUS_SPC (3 << 16) /* ;+ spaced */ +#define XN_FLAG_SEP_MULTILINE (4 << 16) /* One line per field */ + +#define XN_FLAG_DN_REV (1 << 20) /* Reverse DN order */ + +/* How the field name is shown */ + +#define XN_FLAG_FN_MASK (0x3 << 21) + +#define XN_FLAG_FN_SN 0 /* Object short name */ +#define XN_FLAG_FN_LN (1 << 21) /* Object long name */ +#define XN_FLAG_FN_OID (2 << 21) /* Always use OIDs */ +#define XN_FLAG_FN_NONE (3 << 21) /* No field names */ + +#define XN_FLAG_SPC_EQ (1 << 23) /* Put spaces round '=' */ + +/* + * This determines if we dump fields we don't recognise: RFC2253 requires + * this. + */ + +#define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24) + +#define XN_FLAG_FN_ALIGN (1 << 25) /* Align field names to 20 \ + * characters */ + +/* Complete set of RFC2253 flags */ + +#define XN_FLAG_RFC2253 (ASN1_STRFLGS_RFC2253 | XN_FLAG_SEP_COMMA_PLUS | XN_FLAG_DN_REV | XN_FLAG_FN_SN | XN_FLAG_DUMP_UNKNOWN_FIELDS) + +/* readable oneline form */ + +#define XN_FLAG_ONELINE (ASN1_STRFLGS_RFC2253 | ASN1_STRFLGS_ESC_QUOTE | XN_FLAG_SEP_CPLUS_SPC | XN_FLAG_SPC_EQ | XN_FLAG_FN_SN) + +/* readable multiline form */ + +#define XN_FLAG_MULTILINE (ASN1_STRFLGS_ESC_CTRL | ASN1_STRFLGS_ESC_MSB | XN_FLAG_SEP_MULTILINE | XN_FLAG_SPC_EQ | XN_FLAG_FN_LN | XN_FLAG_FN_ALIGN) + +typedef struct X509_crl_info_st X509_CRL_INFO; + +typedef struct private_key_st { + int version; + /* The PKCS#8 data types */ + X509_ALGOR *enc_algor; + ASN1_OCTET_STRING *enc_pkey; /* encrypted pub key */ + /* When decrypted, the following will not be NULL */ + EVP_PKEY *dec_pkey; + /* used to encrypt and decrypt */ + int key_length; + char *key_data; + int key_free; /* true if we should auto free key_data */ + /* expanded version of 'enc_algor' */ + EVP_CIPHER_INFO cipher; +} X509_PKEY; + +typedef struct X509_info_st { + X509 *x509; + X509_CRL *crl; + X509_PKEY *x_pkey; + EVP_CIPHER_INFO enc_cipher; + int enc_len; + char *enc_data; +} X509_INFO; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_INFO, X509_INFO, X509_INFO) +#define sk_X509_INFO_num(sk) OPENSSL_sk_num(ossl_check_const_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_value(sk, idx) ((X509_INFO *)OPENSSL_sk_value(ossl_check_const_X509_INFO_sk_type(sk), (idx))) +#define sk_X509_INFO_new(cmp) ((STACK_OF(X509_INFO) *)OPENSSL_sk_new(ossl_check_X509_INFO_compfunc_type(cmp))) +#define sk_X509_INFO_new_null() ((STACK_OF(X509_INFO) *)OPENSSL_sk_new_null()) +#define sk_X509_INFO_new_reserve(cmp, n) ((STACK_OF(X509_INFO) *)OPENSSL_sk_new_reserve(ossl_check_X509_INFO_compfunc_type(cmp), (n))) +#define sk_X509_INFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_INFO_sk_type(sk), (n)) +#define sk_X509_INFO_free(sk) OPENSSL_sk_free(ossl_check_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_zero(sk) OPENSSL_sk_zero(ossl_check_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_delete(sk, i) ((X509_INFO *)OPENSSL_sk_delete(ossl_check_X509_INFO_sk_type(sk), (i))) +#define sk_X509_INFO_delete_ptr(sk, ptr) ((X509_INFO *)OPENSSL_sk_delete_ptr(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr))) +#define sk_X509_INFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr)) +#define sk_X509_INFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr)) +#define sk_X509_INFO_pop(sk) ((X509_INFO *)OPENSSL_sk_pop(ossl_check_X509_INFO_sk_type(sk))) +#define sk_X509_INFO_shift(sk) ((X509_INFO *)OPENSSL_sk_shift(ossl_check_X509_INFO_sk_type(sk))) +#define sk_X509_INFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_INFO_sk_type(sk),ossl_check_X509_INFO_freefunc_type(freefunc)) +#define sk_X509_INFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr), (idx)) +#define sk_X509_INFO_set(sk, idx, ptr) ((X509_INFO *)OPENSSL_sk_set(ossl_check_X509_INFO_sk_type(sk), (idx), ossl_check_X509_INFO_type(ptr))) +#define sk_X509_INFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr)) +#define sk_X509_INFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr)) +#define sk_X509_INFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr), pnum) +#define sk_X509_INFO_sort(sk) OPENSSL_sk_sort(ossl_check_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_INFO_sk_type(sk)) +#define sk_X509_INFO_dup(sk) ((STACK_OF(X509_INFO) *)OPENSSL_sk_dup(ossl_check_const_X509_INFO_sk_type(sk))) +#define sk_X509_INFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_INFO) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_INFO_sk_type(sk), ossl_check_X509_INFO_copyfunc_type(copyfunc), ossl_check_X509_INFO_freefunc_type(freefunc))) +#define sk_X509_INFO_set_cmp_func(sk, cmp) ((sk_X509_INFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_compfunc_type(cmp))) + +/* clang-format on */ + +/* + * The next 2 structures and their 8 routines are used to manipulate Netscape's + * spki structures - useful if you are writing a CA web page + */ +typedef struct Netscape_spkac_st { + X509_PUBKEY *pubkey; + ASN1_IA5STRING *challenge; /* challenge sent in atlas >= PR2 */ +} NETSCAPE_SPKAC; + +typedef struct Netscape_spki_st { + NETSCAPE_SPKAC *spkac; /* signed public key and challenge */ + X509_ALGOR sig_algor; + ASN1_BIT_STRING *signature; +} NETSCAPE_SPKI; + +/* Netscape certificate sequence structure */ +typedef struct Netscape_certificate_sequence { + ASN1_OBJECT *type; + STACK_OF(X509) *certs; +} NETSCAPE_CERT_SEQUENCE; + +/*- Unused (and iv length is wrong) +typedef struct CBCParameter_st + { + unsigned char iv[8]; + } CBC_PARAM; +*/ + +/* Password based encryption structure */ + +typedef struct PBEPARAM_st { + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *iter; +} PBEPARAM; + +/* Password based encryption V2 structures */ + +typedef struct PBE2PARAM_st { + X509_ALGOR *keyfunc; + X509_ALGOR *encryption; +} PBE2PARAM; + +typedef struct PBKDF2PARAM_st { + /* Usually OCTET STRING but could be anything */ + ASN1_TYPE *salt; + ASN1_INTEGER *iter; + ASN1_INTEGER *keylength; + X509_ALGOR *prf; +} PBKDF2PARAM; + +typedef struct { + X509_ALGOR *keyDerivationFunc; + X509_ALGOR *messageAuthScheme; +} PBMAC1PARAM; + +#ifndef OPENSSL_NO_SCRYPT +typedef struct SCRYPT_PARAMS_st { + ASN1_OCTET_STRING *salt; + ASN1_INTEGER *costParameter; + ASN1_INTEGER *blockSize; + ASN1_INTEGER *parallelizationParameter; + ASN1_INTEGER *keyLength; +} SCRYPT_PARAMS; +#endif + +#ifdef __cplusplus +} +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define X509_EXT_PACK_UNKNOWN 1 +#define X509_EXT_PACK_STRING 2 + +#define X509_extract_key(x) X509_get_pubkey(x) /*****/ +#define X509_REQ_extract_key(a) X509_REQ_get_pubkey(a) +#define X509_name_cmp(a, b) X509_NAME_cmp((a), (b)) + +void X509_CRL_set_default_method(const X509_CRL_METHOD *meth); +X509_CRL_METHOD *X509_CRL_METHOD_new(int (*crl_init)(X509_CRL *crl), + int (*crl_free)(X509_CRL *crl), + int (*crl_lookup)(X509_CRL *crl, + X509_REVOKED **ret, + const ASN1_INTEGER *serial, + const X509_NAME *issuer), + int (*crl_verify)(X509_CRL *crl, + EVP_PKEY *pk)); +void X509_CRL_METHOD_free(X509_CRL_METHOD *m); + +void X509_CRL_set_meth_data(X509_CRL *crl, void *dat); +void *X509_CRL_get_meth_data(X509_CRL *crl); + +const char *X509_verify_cert_error_string(long n); + +int X509_verify(X509 *a, EVP_PKEY *r); +int X509_self_signed(X509 *cert, int verify_signature); + +int X509_REQ_verify_ex(X509_REQ *a, EVP_PKEY *r, OSSL_LIB_CTX *libctx, + const char *propq); +int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r); +int X509_CRL_verify(X509_CRL *a, EVP_PKEY *r); +int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r); + +NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len); +char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *x); +EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x); +int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey); + +int NETSCAPE_SPKI_print(BIO *out, NETSCAPE_SPKI *spki); + +int X509_signature_dump(BIO *bp, const ASN1_STRING *sig, int indent); +int X509_signature_print(BIO *bp, const X509_ALGOR *alg, + const ASN1_STRING *sig); + +int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx); +int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx); +int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx); +int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md); + +int X509_pubkey_digest(const X509 *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_digest(const X509 *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +ASN1_OCTET_STRING *X509_digest_sig(const X509 *cert, + EVP_MD **md_used, int *md_is_fallback); +int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); +int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type, + unsigned char *md, unsigned int *len); + +X509 *X509_load_http(const char *url, BIO *bio, BIO *rbio, int timeout); +X509_CRL *X509_CRL_load_http(const char *url, BIO *bio, BIO *rbio, int timeout); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#include /* OSSL_HTTP_REQ_CTX_nbio_d2i */ +#define X509_http_nbio(rctx, pcert) \ + OSSL_HTTP_REQ_CTX_nbio_d2i(rctx, pcert, ASN1_ITEM_rptr(X509)) +#define X509_CRL_http_nbio(rctx, pcrl) \ + OSSL_HTTP_REQ_CTX_nbio_d2i(rctx, pcrl, ASN1_ITEM_rptr(X509_CRL)) +#endif + +#ifndef OPENSSL_NO_STDIO +X509 *d2i_X509_fp(FILE *fp, X509 **x509); +int i2d_X509_fp(FILE *fp, const X509 *x509); +X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl); +int i2d_X509_CRL_fp(FILE *fp, const X509_CRL *crl); +X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req); +int i2d_X509_REQ_fp(FILE *fp, const X509_REQ *req); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSAPrivateKey_fp(FILE *fp, const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSAPublicKey_fp(FILE *fp, const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSA_PUBKEY_fp(FILE *fp, const RSA *rsa); +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifndef OPENSSL_NO_DSA +OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa); +OSSL_DEPRECATEDIN_3_0 int i2d_DSA_PUBKEY_fp(FILE *fp, const DSA *dsa); +OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa); +OSSL_DEPRECATEDIN_3_0 int i2d_DSAPrivateKey_fp(FILE *fp, const DSA *dsa); +#endif +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifndef OPENSSL_NO_EC +OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey); +OSSL_DEPRECATEDIN_3_0 int i2d_EC_PUBKEY_fp(FILE *fp, const EC_KEY *eckey); +OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey); +OSSL_DEPRECATEDIN_3_0 int i2d_ECPrivateKey_fp(FILE *fp, const EC_KEY *eckey); +#endif /* OPENSSL_NO_EC */ +#endif /* OPENSSL_NO_DEPRECATED_3_0 */ +X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8); +int i2d_PKCS8_fp(FILE *fp, const X509_SIG *p8); +X509_PUBKEY *d2i_X509_PUBKEY_fp(FILE *fp, X509_PUBKEY **xpk); +int i2d_X509_PUBKEY_fp(FILE *fp, const X509_PUBKEY *xpk); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, const PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, const EVP_PKEY *key); +int i2d_PrivateKey_fp(FILE *fp, const EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_ex_fp(FILE *fp, EVP_PKEY **a, OSSL_LIB_CTX *libctx, + const char *propq); +EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a); +int i2d_PUBKEY_fp(FILE *fp, const EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_ex_fp(FILE *fp, EVP_PKEY **a, OSSL_LIB_CTX *libctx, + const char *propq); +EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a); +#endif + +X509 *d2i_X509_bio(BIO *bp, X509 **x509); +int i2d_X509_bio(BIO *bp, const X509 *x509); +X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl); +int i2d_X509_CRL_bio(BIO *bp, const X509_CRL *crl); +X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req); +int i2d_X509_REQ_bio(BIO *bp, const X509_REQ *req); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSAPrivateKey_bio(BIO *bp, const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSAPublicKey_bio(BIO *bp, const RSA *rsa); +OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa); +OSSL_DEPRECATEDIN_3_0 int i2d_RSA_PUBKEY_bio(BIO *bp, const RSA *rsa); +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifndef OPENSSL_NO_DSA +OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa); +OSSL_DEPRECATEDIN_3_0 int i2d_DSA_PUBKEY_bio(BIO *bp, const DSA *dsa); +OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa); +OSSL_DEPRECATEDIN_3_0 int i2d_DSAPrivateKey_bio(BIO *bp, const DSA *dsa); +#endif +#endif + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifndef OPENSSL_NO_EC +OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey); +OSSL_DEPRECATEDIN_3_0 int i2d_EC_PUBKEY_bio(BIO *bp, const EC_KEY *eckey); +OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey); +OSSL_DEPRECATEDIN_3_0 int i2d_ECPrivateKey_bio(BIO *bp, const EC_KEY *eckey); +#endif /* OPENSSL_NO_EC */ +#endif /* OPENSSL_NO_DEPRECATED_3_0 */ + +X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8); +int i2d_PKCS8_bio(BIO *bp, const X509_SIG *p8); +X509_PUBKEY *d2i_X509_PUBKEY_bio(BIO *bp, X509_PUBKEY **xpk); +int i2d_X509_PUBKEY_bio(BIO *bp, const X509_PUBKEY *xpk); +PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, + PKCS8_PRIV_KEY_INFO **p8inf); +int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, const PKCS8_PRIV_KEY_INFO *p8inf); +int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, const EVP_PKEY *key); +int i2d_PrivateKey_bio(BIO *bp, const EVP_PKEY *pkey); +EVP_PKEY *d2i_PrivateKey_ex_bio(BIO *bp, EVP_PKEY **a, OSSL_LIB_CTX *libctx, + const char *propq); +EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a); +int i2d_PUBKEY_bio(BIO *bp, const EVP_PKEY *pkey); +EVP_PKEY *d2i_PUBKEY_ex_bio(BIO *bp, EVP_PKEY **a, OSSL_LIB_CTX *libctx, + const char *propq); +EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a); + +DECLARE_ASN1_DUP_FUNCTION(X509) +DECLARE_ASN1_DUP_FUNCTION(X509_ALGOR) +DECLARE_ASN1_DUP_FUNCTION(X509_ATTRIBUTE) +DECLARE_ASN1_DUP_FUNCTION(X509_CRL) +DECLARE_ASN1_DUP_FUNCTION(X509_EXTENSION) +DECLARE_ASN1_DUP_FUNCTION(X509_PUBKEY) +DECLARE_ASN1_DUP_FUNCTION(X509_REQ) +DECLARE_ASN1_DUP_FUNCTION(X509_REVOKED) +int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, + void *pval); +void X509_ALGOR_get0(const ASN1_OBJECT **paobj, int *pptype, + const void **ppval, const X509_ALGOR *algor); +void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); +int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); +int X509_ALGOR_copy(X509_ALGOR *dest, const X509_ALGOR *src); + +DECLARE_ASN1_DUP_FUNCTION(X509_NAME) +DECLARE_ASN1_DUP_FUNCTION(X509_NAME_ENTRY) + +int X509_cmp_time(const ASN1_TIME *s, time_t *t); +int X509_cmp_current_time(const ASN1_TIME *s); +int X509_cmp_timeframe(const X509_VERIFY_PARAM *vpm, + const ASN1_TIME *start, const ASN1_TIME *end); +ASN1_TIME *X509_time_adj(ASN1_TIME *s, long adj, time_t *t); +ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, + int offset_day, long offset_sec, time_t *t); +ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj); + +const char *X509_get_default_cert_area(void); +const char *X509_get_default_cert_dir(void); +const char *X509_get_default_cert_file(void); +const char *X509_get_default_cert_dir_env(void); +const char *X509_get_default_cert_file_env(void); +const char *X509_get_default_private_dir(void); + +X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md); +X509 *X509_REQ_to_X509(X509_REQ *r, int days, EVP_PKEY *pkey); + +DECLARE_ASN1_FUNCTIONS(X509_ALGOR) +DECLARE_ASN1_ENCODE_FUNCTIONS(X509_ALGORS, X509_ALGORS, X509_ALGORS) +DECLARE_ASN1_FUNCTIONS(X509_VAL) + +DECLARE_ASN1_FUNCTIONS(X509_PUBKEY) + +X509_PUBKEY *X509_PUBKEY_new_ex(OSSL_LIB_CTX *libctx, const char *propq); +int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey); +EVP_PKEY *X509_PUBKEY_get0(const X509_PUBKEY *key); +EVP_PKEY *X509_PUBKEY_get(const X509_PUBKEY *key); +int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain); +long X509_get_pathlen(X509 *x); +DECLARE_ASN1_ENCODE_FUNCTIONS_only(EVP_PKEY, PUBKEY) +EVP_PKEY *d2i_PUBKEY_ex(EVP_PKEY **a, const unsigned char **pp, long length, + OSSL_LIB_CTX *libctx, const char *propq); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0, RSA, RSA_PUBKEY) +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifndef OPENSSL_NO_DSA +DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0, DSA, DSA_PUBKEY) +#endif +#endif +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#ifndef OPENSSL_NO_EC +DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0, EC_KEY, EC_PUBKEY) +#endif +#endif + +DECLARE_ASN1_FUNCTIONS(X509_SIG) +void X509_SIG_get0(const X509_SIG *sig, const X509_ALGOR **palg, + const ASN1_OCTET_STRING **pdigest); +void X509_SIG_getm(X509_SIG *sig, X509_ALGOR **palg, + ASN1_OCTET_STRING **pdigest); + +DECLARE_ASN1_FUNCTIONS(X509_REQ_INFO) +DECLARE_ASN1_FUNCTIONS(X509_REQ) +X509_REQ *X509_REQ_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +DECLARE_ASN1_FUNCTIONS(X509_ATTRIBUTE) +X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value); + +DECLARE_ASN1_FUNCTIONS(X509_EXTENSION) +DECLARE_ASN1_ENCODE_FUNCTIONS(X509_EXTENSIONS, X509_EXTENSIONS, X509_EXTENSIONS) + +DECLARE_ASN1_FUNCTIONS(X509_NAME_ENTRY) + +DECLARE_ASN1_FUNCTIONS(X509_NAME) + +int X509_NAME_set(X509_NAME **xn, const X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(X509_CINF) +DECLARE_ASN1_FUNCTIONS(X509) +X509 *X509_new_ex(OSSL_LIB_CTX *libctx, const char *propq); +DECLARE_ASN1_FUNCTIONS(X509_CERT_AUX) + +#define X509_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509, l, p, newf, dupf, freef) +int X509_set_ex_data(X509 *r, int idx, void *arg); +void *X509_get_ex_data(const X509 *r, int idx); +DECLARE_ASN1_ENCODE_FUNCTIONS_only(X509, X509_AUX) + +int i2d_re_X509_tbs(X509 *x, unsigned char **pp); + +int X509_SIG_INFO_get(const X509_SIG_INFO *siginf, int *mdnid, int *pknid, + int *secbits, uint32_t *flags); +void X509_SIG_INFO_set(X509_SIG_INFO *siginf, int mdnid, int pknid, + int secbits, uint32_t flags); + +int X509_get_signature_info(X509 *x, int *mdnid, int *pknid, int *secbits, + uint32_t *flags); + +void X509_get0_signature(const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg, const X509 *x); +int X509_get_signature_nid(const X509 *x); + +void X509_set0_distinguishing_id(X509 *x, ASN1_OCTET_STRING *d_id); +ASN1_OCTET_STRING *X509_get0_distinguishing_id(X509 *x); +void X509_REQ_set0_distinguishing_id(X509_REQ *x, ASN1_OCTET_STRING *d_id); +ASN1_OCTET_STRING *X509_REQ_get0_distinguishing_id(X509_REQ *x); + +int X509_alias_set1(X509 *x, const unsigned char *name, int len); +int X509_keyid_set1(X509 *x, const unsigned char *id, int len); +unsigned char *X509_alias_get0(X509 *x, int *len); +unsigned char *X509_keyid_get0(X509 *x, int *len); + +DECLARE_ASN1_FUNCTIONS(X509_REVOKED) +DECLARE_ASN1_FUNCTIONS(X509_CRL_INFO) +DECLARE_ASN1_FUNCTIONS(X509_CRL) +X509_CRL *X509_CRL_new_ex(OSSL_LIB_CTX *libctx, const char *propq); + +int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev); +int X509_CRL_get0_by_serial(X509_CRL *crl, + X509_REVOKED **ret, const ASN1_INTEGER *serial); +int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x); + +X509_PKEY *X509_PKEY_new(void); +void X509_PKEY_free(X509_PKEY *a); + +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKAC) +DECLARE_ASN1_FUNCTIONS(NETSCAPE_CERT_SEQUENCE) + +X509_INFO *X509_INFO_new(void); +void X509_INFO_free(X509_INFO *a); +char *X509_NAME_oneline(const X509_NAME *a, char *buf, int size); + +#ifndef OPENSSL_NO_DEPRECATED_3_0 +OSSL_DEPRECATEDIN_3_0 +int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *algor1, + ASN1_BIT_STRING *signature, char *data, EVP_PKEY *pkey); +OSSL_DEPRECATEDIN_3_0 +int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data, + unsigned char *md, unsigned int *len); +OSSL_DEPRECATEDIN_3_0 +int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, X509_ALGOR *algor2, + ASN1_BIT_STRING *signature, char *data, EVP_PKEY *pkey, + const EVP_MD *type); +#endif +int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, void *data, + unsigned char *md, unsigned int *len); +int ASN1_item_verify(const ASN1_ITEM *it, const X509_ALGOR *alg, + const ASN1_BIT_STRING *signature, const void *data, + EVP_PKEY *pkey); +int ASN1_item_verify_ctx(const ASN1_ITEM *it, const X509_ALGOR *alg, + const ASN1_BIT_STRING *signature, const void *data, + EVP_MD_CTX *ctx); +int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2, + ASN1_BIT_STRING *signature, const void *data, + EVP_PKEY *pkey, const EVP_MD *md); +int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, + X509_ALGOR *algor2, ASN1_BIT_STRING *signature, + const void *data, EVP_MD_CTX *ctx); + +#define X509_VERSION_1 0 +#define X509_VERSION_2 1 +#define X509_VERSION_3 2 + +long X509_get_version(const X509 *x); +int X509_set_version(X509 *x, long version); +int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial); +ASN1_INTEGER *X509_get_serialNumber(X509 *x); +const ASN1_INTEGER *X509_get0_serialNumber(const X509 *x); +int X509_set_issuer_name(X509 *x, const X509_NAME *name); +X509_NAME *X509_get_issuer_name(const X509 *a); +int X509_set_subject_name(X509 *x, const X509_NAME *name); +X509_NAME *X509_get_subject_name(const X509 *a); +const ASN1_TIME *X509_get0_notBefore(const X509 *x); +ASN1_TIME *X509_getm_notBefore(const X509 *x); +int X509_set1_notBefore(X509 *x, const ASN1_TIME *tm); +const ASN1_TIME *X509_get0_notAfter(const X509 *x); +ASN1_TIME *X509_getm_notAfter(const X509 *x); +int X509_set1_notAfter(X509 *x, const ASN1_TIME *tm); +int X509_set_pubkey(X509 *x, EVP_PKEY *pkey); +int X509_up_ref(X509 *x); +int X509_get_signature_type(const X509 *x); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define X509_get_notBefore X509_getm_notBefore +#define X509_get_notAfter X509_getm_notAfter +#define X509_set_notBefore X509_set1_notBefore +#define X509_set_notAfter X509_set1_notAfter +#endif + +/* + * This one is only used so that a binary form can output, as in + * i2d_X509_PUBKEY(X509_get_X509_PUBKEY(x), &buf) + */ +X509_PUBKEY *X509_get_X509_PUBKEY(const X509 *x); +const STACK_OF(X509_EXTENSION) *X509_get0_extensions(const X509 *x); +void X509_get0_uids(const X509 *x, const ASN1_BIT_STRING **piuid, + const ASN1_BIT_STRING **psuid); +const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x); + +EVP_PKEY *X509_get0_pubkey(const X509 *x); +EVP_PKEY *X509_get_pubkey(X509 *x); +ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x); + +#define X509_REQ_VERSION_1 0 + +long X509_REQ_get_version(const X509_REQ *req); +int X509_REQ_set_version(X509_REQ *x, long version); +X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req); +int X509_REQ_set_subject_name(X509_REQ *req, const X509_NAME *name); +void X509_REQ_get0_signature(const X509_REQ *req, const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg); +void X509_REQ_set0_signature(X509_REQ *req, ASN1_BIT_STRING *psig); +int X509_REQ_set1_signature_algo(X509_REQ *req, X509_ALGOR *palg); +int X509_REQ_get_signature_nid(const X509_REQ *req); +int i2d_re_X509_REQ_tbs(X509_REQ *req, unsigned char **pp); +int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey); +EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req); +EVP_PKEY *X509_REQ_get0_pubkey(const X509_REQ *req); +X509_PUBKEY *X509_REQ_get_X509_PUBKEY(X509_REQ *req); +int X509_REQ_extension_nid(int nid); +int *X509_REQ_get_extension_nids(void); +void X509_REQ_set_extension_nids(int *nids); +STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(OSSL_FUTURE_CONST X509_REQ *req); +int X509_REQ_add_extensions_nid(X509_REQ *req, + const STACK_OF(X509_EXTENSION) *exts, int nid); +int X509_REQ_add_extensions(X509_REQ *req, const STACK_OF(X509_EXTENSION) *ext); +int X509_REQ_get_attr_count(const X509_REQ *req); +int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos); +int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, const ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc); +X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc); +int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr); +int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_NID(X509_REQ *req, + int nid, int type, + const unsigned char *bytes, int len); +int X509_REQ_add1_attr_by_txt(X509_REQ *req, + const char *attrname, int type, + const unsigned char *bytes, int len); + +#define X509_CRL_VERSION_1 0 +#define X509_CRL_VERSION_2 1 + +int X509_CRL_set_version(X509_CRL *x, long version); +int X509_CRL_set_issuer_name(X509_CRL *x, const X509_NAME *name); +int X509_CRL_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm); +int X509_CRL_sort(X509_CRL *crl); +int X509_CRL_up_ref(X509_CRL *crl); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define X509_CRL_set_lastUpdate X509_CRL_set1_lastUpdate +#define X509_CRL_set_nextUpdate X509_CRL_set1_nextUpdate +#endif + +long X509_CRL_get_version(const X509_CRL *crl); +const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl); +const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl); +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +OSSL_DEPRECATEDIN_1_1_0 ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl); +OSSL_DEPRECATEDIN_1_1_0 ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl); +#endif +X509_NAME *X509_CRL_get_issuer(const X509_CRL *crl); +const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl); +STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl); +void X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg); +int X509_CRL_get_signature_nid(const X509_CRL *crl); +int i2d_re_X509_CRL_tbs(X509_CRL *req, unsigned char **pp); + +const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(const X509_REVOKED *x); +int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial); +const ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *x); +int X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm); +const STACK_OF(X509_EXTENSION) * +X509_REVOKED_get0_extensions(const X509_REVOKED *r); + +X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer, + EVP_PKEY *skey, const EVP_MD *md, unsigned int flags); + +int X509_REQ_check_private_key(const X509_REQ *req, EVP_PKEY *pkey); + +int X509_check_private_key(const X509 *cert, const EVP_PKEY *pkey); +int X509_chain_check_suiteb(int *perror_depth, + X509 *x, STACK_OF(X509) *chain, + unsigned long flags); +int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk, unsigned long flags); +void OSSL_STACK_OF_X509_free(STACK_OF(X509) *certs); +STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain); + +int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_and_serial_hash(X509 *a); + +int X509_issuer_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_issuer_name_hash(X509 *a); + +int X509_subject_name_cmp(const X509 *a, const X509 *b); +unsigned long X509_subject_name_hash(X509 *x); + +#ifndef OPENSSL_NO_MD5 +unsigned long X509_issuer_name_hash_old(X509 *a); +unsigned long X509_subject_name_hash_old(X509 *x); +#endif + +#define X509_ADD_FLAG_DEFAULT 0 +#define X509_ADD_FLAG_UP_REF 0x1 +#define X509_ADD_FLAG_PREPEND 0x2 +#define X509_ADD_FLAG_NO_DUP 0x4 +#define X509_ADD_FLAG_NO_SS 0x8 +int X509_add_cert(STACK_OF(X509) *sk, X509 *cert, int flags); +int X509_add_certs(STACK_OF(X509) *sk, STACK_OF(X509) *certs, int flags); + +int X509_cmp(const X509 *a, const X509 *b); +int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b); +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define X509_NAME_hash(x) X509_NAME_hash_ex(x, NULL, NULL, NULL) +OSSL_DEPRECATEDIN_3_0 int X509_certificate_type(const X509 *x, + const EVP_PKEY *pubkey); +#endif +unsigned long X509_NAME_hash_ex(const X509_NAME *x, OSSL_LIB_CTX *libctx, + const char *propq, int *ok); +unsigned long X509_NAME_hash_old(const X509_NAME *x); + +int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b); +int X509_CRL_match(const X509_CRL *a, const X509_CRL *b); +int X509_aux_print(BIO *out, X509 *x, int indent); +#ifndef OPENSSL_NO_STDIO +int X509_print_ex_fp(FILE *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); +int X509_print_fp(FILE *bp, X509 *x); +int X509_CRL_print_fp(FILE *bp, X509_CRL *x); +int X509_REQ_print_fp(FILE *bp, X509_REQ *req); +int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm, int indent, + unsigned long flags); +#endif + +int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase); +int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent, + unsigned long flags); +int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag, + unsigned long cflag); +int X509_print(BIO *bp, X509 *x); +int X509_ocspid_print(BIO *bp, X509 *x); +int X509_CRL_print_ex(BIO *out, X509_CRL *x, unsigned long nmflag); +int X509_CRL_print(BIO *bp, X509_CRL *x); +int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, + unsigned long cflag); +int X509_REQ_print(BIO *bp, X509_REQ *req); + +int X509_NAME_entry_count(const X509_NAME *name); +int X509_NAME_get_text_by_NID(const X509_NAME *name, int nid, + char *buf, int len); +int X509_NAME_get_text_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj, + char *buf, int len); + +/* + * NOTE: you should be passing -1, not 0 as lastpos. The functions that use + * lastpos, search after that position on. + */ +int X509_NAME_get_index_by_NID(const X509_NAME *name, int nid, int lastpos); +int X509_NAME_get_index_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj, + int lastpos); +X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name, int loc); +X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc); +int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *ne, + int loc, int set); +int X509_NAME_add_entry_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len, int loc, + int set); +int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type, + const unsigned char *bytes, int len, int loc, + int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne, + const char *field, int type, + const unsigned char *bytes, + int len); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid, + int type, + const unsigned char *bytes, + int len); +int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, + const unsigned char *bytes, int len, int loc, + int set); +X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, + int len); +int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, const ASN1_OBJECT *obj); +int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, + const unsigned char *bytes, int len); +ASN1_OBJECT *X509_NAME_ENTRY_get_object(const X509_NAME_ENTRY *ne); +ASN1_STRING *X509_NAME_ENTRY_get_data(const X509_NAME_ENTRY *ne); +int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne); + +int X509_NAME_get0_der(const X509_NAME *nm, const unsigned char **pder, + size_t *pderlen); + +int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x); +int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, + int nid, int lastpos); +int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x, + const ASN1_OBJECT *obj, int lastpos); +int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x, + int crit, int lastpos); +X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc); +X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc); +STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x, + X509_EXTENSION *ex, int loc); +STACK_OF(X509_EXTENSION) *X509v3_add_extensions(STACK_OF(X509_EXTENSION) **target, + const STACK_OF(X509_EXTENSION) *exts); + +int X509_get_ext_count(const X509 *x); +int X509_get_ext_by_NID(const X509 *x, int nid, int lastpos); +int X509_get_ext_by_OBJ(const X509 *x, const ASN1_OBJECT *obj, int lastpos); +int X509_get_ext_by_critical(const X509 *x, int crit, int lastpos); +X509_EXTENSION *X509_get_ext(const X509 *x, int loc); +X509_EXTENSION *X509_delete_ext(X509 *x, int loc); +int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc); +void *X509_get_ext_d2i(const X509 *x, int nid, int *crit, int *idx); +int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_CRL_get_ext_count(const X509_CRL *x); +int X509_CRL_get_ext_by_NID(const X509_CRL *x, int nid, int lastpos); +int X509_CRL_get_ext_by_OBJ(const X509_CRL *x, const ASN1_OBJECT *obj, + int lastpos); +int X509_CRL_get_ext_by_critical(const X509_CRL *x, int crit, int lastpos); +X509_EXTENSION *X509_CRL_get_ext(const X509_CRL *x, int loc); +X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc); +int X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc); +void *X509_CRL_get_ext_d2i(const X509_CRL *x, int nid, int *crit, int *idx); +int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit, + unsigned long flags); + +int X509_REVOKED_get_ext_count(const X509_REVOKED *x); +int X509_REVOKED_get_ext_by_NID(const X509_REVOKED *x, int nid, int lastpos); +int X509_REVOKED_get_ext_by_OBJ(const X509_REVOKED *x, const ASN1_OBJECT *obj, + int lastpos); +int X509_REVOKED_get_ext_by_critical(const X509_REVOKED *x, int crit, + int lastpos); +X509_EXTENSION *X509_REVOKED_get_ext(const X509_REVOKED *x, int loc); +X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc); +int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc); +void *X509_REVOKED_get_ext_d2i(const X509_REVOKED *x, int nid, int *crit, + int *idx); +int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit, + unsigned long flags); + +X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, + int nid, int crit, + ASN1_OCTET_STRING *data); +X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex, + const ASN1_OBJECT *obj, int crit, + ASN1_OCTET_STRING *data); +int X509_EXTENSION_set_object(X509_EXTENSION *ex, const ASN1_OBJECT *obj); +int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit); +int X509_EXTENSION_set_data(X509_EXTENSION *ex, ASN1_OCTET_STRING *data); +ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *ex); +ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne); +int X509_EXTENSION_get_critical(const X509_EXTENSION *ex); + +int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x); +int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, + int lastpos); +int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, + const ASN1_OBJECT *obj, int lastpos); +X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc); +X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, + X509_ATTRIBUTE *attr); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) + **x, + const ASN1_OBJECT *obj, + int type, + const unsigned char *bytes, + int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) + **x, + int nid, int type, + const unsigned char *bytes, + int len); +STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) + **x, + const char *attrname, + int type, + const unsigned char *bytes, + int len); +void *X509at_get0_data_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *x, + const ASN1_OBJECT *obj, int lastpos, int type); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, + int atrtype, const void *data, + int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, + const ASN1_OBJECT *obj, + int atrtype, const void *data, + int len); +X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, + const char *atrname, int type, + const unsigned char *bytes, + int len); +int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj); +int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, + const void *data, int len); +void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int atrtype, + void *data); +int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr); +ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr); +ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx); + +int EVP_PKEY_get_attr_count(const EVP_PKEY *key); +int EVP_PKEY_get_attr_by_NID(const EVP_PKEY *key, int nid, int lastpos); +int EVP_PKEY_get_attr_by_OBJ(const EVP_PKEY *key, const ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *EVP_PKEY_get_attr(const EVP_PKEY *key, int loc); +X509_ATTRIBUTE *EVP_PKEY_delete_attr(EVP_PKEY *key, int loc); +int EVP_PKEY_add1_attr(EVP_PKEY *key, X509_ATTRIBUTE *attr); +int EVP_PKEY_add1_attr_by_OBJ(EVP_PKEY *key, + const ASN1_OBJECT *obj, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_NID(EVP_PKEY *key, + int nid, int type, + const unsigned char *bytes, int len); +int EVP_PKEY_add1_attr_by_txt(EVP_PKEY *key, + const char *attrname, int type, + const unsigned char *bytes, int len); + +/* lookup a cert from a X509 STACK */ +X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk, const X509_NAME *name, + const ASN1_INTEGER *serial); +X509 *X509_find_by_subject(STACK_OF(X509) *sk, const X509_NAME *name); + +DECLARE_ASN1_FUNCTIONS(PBEPARAM) +DECLARE_ASN1_FUNCTIONS(PBE2PARAM) +DECLARE_ASN1_FUNCTIONS(PBKDF2PARAM) +DECLARE_ASN1_FUNCTIONS(PBMAC1PARAM) +#ifndef OPENSSL_NO_SCRYPT +DECLARE_ASN1_FUNCTIONS(SCRYPT_PARAMS) +#endif + +int PKCS5_pbe_set0_algor(X509_ALGOR *algor, int alg, int iter, + const unsigned char *salt, int saltlen); +int PKCS5_pbe_set0_algor_ex(X509_ALGOR *algor, int alg, int iter, + const unsigned char *salt, int saltlen, + OSSL_LIB_CTX *libctx); + +X509_ALGOR *PKCS5_pbe_set(int alg, int iter, + const unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe_set_ex(int alg, int iter, + const unsigned char *salt, int saltlen, + OSSL_LIB_CTX *libctx); + +X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen); +X509_ALGOR *PKCS5_pbe2_set_iv(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen, + unsigned char *aiv, int prf_nid); +X509_ALGOR *PKCS5_pbe2_set_iv_ex(const EVP_CIPHER *cipher, int iter, + unsigned char *salt, int saltlen, + unsigned char *aiv, int prf_nid, + OSSL_LIB_CTX *libctx); + +#ifndef OPENSSL_NO_SCRYPT +X509_ALGOR *PKCS5_pbe2_set_scrypt(const EVP_CIPHER *cipher, + const unsigned char *salt, int saltlen, + unsigned char *aiv, uint64_t N, uint64_t r, + uint64_t p); +#endif + +X509_ALGOR *PKCS5_pbkdf2_set(int iter, unsigned char *salt, int saltlen, + int prf_nid, int keylen); +X509_ALGOR *PKCS5_pbkdf2_set_ex(int iter, unsigned char *salt, int saltlen, + int prf_nid, int keylen, + OSSL_LIB_CTX *libctx); + +PBKDF2PARAM *PBMAC1_get1_pbkdf2_param(const X509_ALGOR *macalg); +/* PKCS#8 utilities */ + +DECLARE_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO) + +EVP_PKEY *EVP_PKCS82PKEY(const PKCS8_PRIV_KEY_INFO *p8); +EVP_PKEY *EVP_PKCS82PKEY_ex(const PKCS8_PRIV_KEY_INFO *p8, OSSL_LIB_CTX *libctx, + const char *propq); +PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(const EVP_PKEY *pkey); + +int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj, + int version, int ptype, void *pval, + unsigned char *penc, int penclen); +int PKCS8_pkey_get0(const ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + const X509_ALGOR **pa, const PKCS8_PRIV_KEY_INFO *p8); + +const STACK_OF(X509_ATTRIBUTE) * +PKCS8_pkey_get0_attrs(const PKCS8_PRIV_KEY_INFO *p8); +int PKCS8_pkey_add1_attr(PKCS8_PRIV_KEY_INFO *p8, X509_ATTRIBUTE *attr); +int PKCS8_pkey_add1_attr_by_NID(PKCS8_PRIV_KEY_INFO *p8, int nid, int type, + const unsigned char *bytes, int len); +int PKCS8_pkey_add1_attr_by_OBJ(PKCS8_PRIV_KEY_INFO *p8, const ASN1_OBJECT *obj, + int type, const unsigned char *bytes, int len); + +void X509_PUBKEY_set0_public_key(X509_PUBKEY *pub, + unsigned char *penc, int penclen); +int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj, + int ptype, void *pval, + unsigned char *penc, int penclen); +int X509_PUBKEY_get0_param(ASN1_OBJECT **ppkalg, + const unsigned char **pk, int *ppklen, + X509_ALGOR **pa, const X509_PUBKEY *pub); +int X509_PUBKEY_eq(const X509_PUBKEY *a, const X509_PUBKEY *b); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/x509_acert.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/x509_acert.h new file mode 100644 index 000000000000..ed45c1e9184b --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/x509_acert.h @@ -0,0 +1,312 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/x509_acert.h.in + * + * Copyright 2022-2026 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_X509_ACERT_H +#define OPENSSL_X509_ACERT_H +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct X509_acert_st X509_ACERT; +typedef struct X509_acert_info_st X509_ACERT_INFO; +typedef struct ossl_object_digest_info_st OSSL_OBJECT_DIGEST_INFO; +typedef struct ossl_issuer_serial_st OSSL_ISSUER_SERIAL; +typedef struct X509_acert_issuer_v2form_st X509_ACERT_ISSUER_V2FORM; + +DECLARE_ASN1_FUNCTIONS(X509_ACERT) +DECLARE_ASN1_DUP_FUNCTION(X509_ACERT) +DECLARE_ASN1_ITEM(X509_ACERT_INFO) +DECLARE_ASN1_ALLOC_FUNCTIONS(X509_ACERT_INFO) +DECLARE_ASN1_ALLOC_FUNCTIONS(OSSL_OBJECT_DIGEST_INFO) +DECLARE_ASN1_ALLOC_FUNCTIONS(OSSL_ISSUER_SERIAL) +DECLARE_ASN1_ALLOC_FUNCTIONS(X509_ACERT_ISSUER_V2FORM) + +#ifndef OPENSSL_NO_STDIO +X509_ACERT *d2i_X509_ACERT_fp(FILE *fp, X509_ACERT **acert); +int i2d_X509_ACERT_fp(FILE *fp, const X509_ACERT *acert); +#endif + +DECLARE_PEM_rw(X509_ACERT, X509_ACERT) + +X509_ACERT *d2i_X509_ACERT_bio(BIO *bp, X509_ACERT **acert); +int i2d_X509_ACERT_bio(BIO *bp, const X509_ACERT *acert); + +int X509_ACERT_sign(X509_ACERT *x, EVP_PKEY *pkey, const EVP_MD *md); +int X509_ACERT_sign_ctx(X509_ACERT *x, EVP_MD_CTX *ctx); +int X509_ACERT_verify(X509_ACERT *a, EVP_PKEY *r); + +#define X509_ACERT_VERSION_2 1 + +const GENERAL_NAMES *X509_ACERT_get0_holder_entityName(const X509_ACERT *x); +const OSSL_ISSUER_SERIAL *X509_ACERT_get0_holder_baseCertId(const X509_ACERT *x); +const OSSL_OBJECT_DIGEST_INFO *X509_ACERT_get0_holder_digest(const X509_ACERT *x); +const X509_NAME *X509_ACERT_get0_issuerName(const X509_ACERT *x); +long X509_ACERT_get_version(const X509_ACERT *x); +void X509_ACERT_get0_signature(const X509_ACERT *x, + const ASN1_BIT_STRING **psig, + const X509_ALGOR **palg); +int X509_ACERT_get_signature_nid(const X509_ACERT *x); +const X509_ALGOR *X509_ACERT_get0_info_sigalg(const X509_ACERT *x); +const ASN1_INTEGER *X509_ACERT_get0_serialNumber(const X509_ACERT *x); +const ASN1_TIME *X509_ACERT_get0_notBefore(const X509_ACERT *x); +const ASN1_TIME *X509_ACERT_get0_notAfter(const X509_ACERT *x); +const ASN1_BIT_STRING *X509_ACERT_get0_issuerUID(const X509_ACERT *x); + +int X509_ACERT_print(BIO *bp, X509_ACERT *x); +int X509_ACERT_print_ex(BIO *bp, X509_ACERT *x, unsigned long nmflags, + unsigned long cflag); + +int X509_ACERT_get_attr_count(const X509_ACERT *x); +int X509_ACERT_get_attr_by_NID(const X509_ACERT *x, int nid, int lastpos); +int X509_ACERT_get_attr_by_OBJ(const X509_ACERT *x, const ASN1_OBJECT *obj, + int lastpos); +X509_ATTRIBUTE *X509_ACERT_get_attr(const X509_ACERT *x, int loc); +X509_ATTRIBUTE *X509_ACERT_delete_attr(X509_ACERT *x, int loc); + +void *X509_ACERT_get_ext_d2i(const X509_ACERT *x, int nid, int *crit, int *idx); +int X509_ACERT_add1_ext_i2d(X509_ACERT *x, int nid, void *value, int crit, + unsigned long flags); +const STACK_OF(X509_EXTENSION) *X509_ACERT_get0_extensions(const X509_ACERT *x); + +#define OSSL_OBJECT_DIGEST_INFO_PUBLIC_KEY 0 +#define OSSL_OBJECT_DIGEST_INFO_PUBLIC_KEY_CERT 1 +#define OSSL_OBJECT_DIGEST_INFO_OTHER 2 /* must not be used in RFC 5755 profile */ +int X509_ACERT_set_version(X509_ACERT *x, long version); +void X509_ACERT_set0_holder_entityName(X509_ACERT *x, GENERAL_NAMES *name); +void X509_ACERT_set0_holder_baseCertId(X509_ACERT *x, OSSL_ISSUER_SERIAL *isss); +void X509_ACERT_set0_holder_digest(X509_ACERT *x, + OSSL_OBJECT_DIGEST_INFO *dinfo); + +int X509_ACERT_add1_attr(X509_ACERT *x, X509_ATTRIBUTE *attr); +int X509_ACERT_add1_attr_by_OBJ(X509_ACERT *x, const ASN1_OBJECT *obj, + int type, const void *bytes, int len); +int X509_ACERT_add1_attr_by_NID(X509_ACERT *x, int nid, int type, + const void *bytes, int len); +int X509_ACERT_add1_attr_by_txt(X509_ACERT *x, const char *attrname, int type, + const unsigned char *bytes, int len); +int X509_ACERT_add_attr_nconf(CONF *conf, const char *section, + X509_ACERT *acert); + +int X509_ACERT_set1_issuerName(X509_ACERT *x, const X509_NAME *name); +int X509_ACERT_set1_serialNumber(X509_ACERT *x, const ASN1_INTEGER *serial); +int X509_ACERT_set1_notBefore(X509_ACERT *x, const ASN1_GENERALIZEDTIME *time); +int X509_ACERT_set1_notAfter(X509_ACERT *x, const ASN1_GENERALIZEDTIME *time); + +void OSSL_OBJECT_DIGEST_INFO_get0_digest(const OSSL_OBJECT_DIGEST_INFO *o, + int *digestedObjectType, + const X509_ALGOR **digestAlgorithm, + const ASN1_BIT_STRING **digest); + +int OSSL_OBJECT_DIGEST_INFO_set1_digest(OSSL_OBJECT_DIGEST_INFO *o, + int digestedObjectType, + X509_ALGOR *digestAlgorithm, + ASN1_BIT_STRING *digest); + +const X509_NAME *OSSL_ISSUER_SERIAL_get0_issuer(const OSSL_ISSUER_SERIAL *isss); +const ASN1_INTEGER *OSSL_ISSUER_SERIAL_get0_serial(const OSSL_ISSUER_SERIAL *isss); +const ASN1_BIT_STRING *OSSL_ISSUER_SERIAL_get0_issuerUID(const OSSL_ISSUER_SERIAL *isss); + +int OSSL_ISSUER_SERIAL_set1_issuer(OSSL_ISSUER_SERIAL *isss, + const X509_NAME *issuer); +int OSSL_ISSUER_SERIAL_set1_serial(OSSL_ISSUER_SERIAL *isss, + const ASN1_INTEGER *serial); +int OSSL_ISSUER_SERIAL_set1_issuerUID(OSSL_ISSUER_SERIAL *isss, + const ASN1_BIT_STRING *uid); + +#define OSSL_IETFAS_OCTETS 0 +#define OSSL_IETFAS_OID 1 +#define OSSL_IETFAS_STRING 2 + +typedef struct OSSL_IETF_ATTR_SYNTAX_VALUE_st OSSL_IETF_ATTR_SYNTAX_VALUE; +typedef struct OSSL_IETF_ATTR_SYNTAX_st OSSL_IETF_ATTR_SYNTAX; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_IETF_ATTR_SYNTAX_VALUE, OSSL_IETF_ATTR_SYNTAX_VALUE, OSSL_IETF_ATTR_SYNTAX_VALUE) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_value(sk, idx) ((OSSL_IETF_ATTR_SYNTAX_VALUE *)OPENSSL_sk_value(ossl_check_const_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), (idx))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_new(cmp) ((STACK_OF(OSSL_IETF_ATTR_SYNTAX_VALUE) *)OPENSSL_sk_new(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_compfunc_type(cmp))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_new_null() ((STACK_OF(OSSL_IETF_ATTR_SYNTAX_VALUE) *)OPENSSL_sk_new_null()) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_new_reserve(cmp, n) ((STACK_OF(OSSL_IETF_ATTR_SYNTAX_VALUE) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_compfunc_type(cmp), (n))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), (n)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_free(sk) OPENSSL_sk_free(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_delete(sk, i) ((OSSL_IETF_ATTR_SYNTAX_VALUE *)OPENSSL_sk_delete(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), (i))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_delete_ptr(sk, ptr) ((OSSL_IETF_ATTR_SYNTAX_VALUE *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_pop(sk) ((OSSL_IETF_ATTR_SYNTAX_VALUE *)OPENSSL_sk_pop(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_shift(sk) ((OSSL_IETF_ATTR_SYNTAX_VALUE *)OPENSSL_sk_shift(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk),ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_freefunc_type(freefunc)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr), (idx)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_set(sk, idx, ptr) ((OSSL_IETF_ATTR_SYNTAX_VALUE *)OPENSSL_sk_set(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), (idx), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_type(ptr), pnum) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk)) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_dup(sk) ((STACK_OF(OSSL_IETF_ATTR_SYNTAX_VALUE) *)OPENSSL_sk_dup(ossl_check_const_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_IETF_ATTR_SYNTAX_VALUE) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_copyfunc_type(copyfunc), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_freefunc_type(freefunc))) +#define sk_OSSL_IETF_ATTR_SYNTAX_VALUE_set_cmp_func(sk, cmp) ((sk_OSSL_IETF_ATTR_SYNTAX_VALUE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_sk_type(sk), ossl_check_OSSL_IETF_ATTR_SYNTAX_VALUE_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_ITEM(OSSL_IETF_ATTR_SYNTAX_VALUE) +DECLARE_ASN1_ALLOC_FUNCTIONS(OSSL_IETF_ATTR_SYNTAX_VALUE) +DECLARE_ASN1_FUNCTIONS(OSSL_IETF_ATTR_SYNTAX) + +const GENERAL_NAMES * +OSSL_IETF_ATTR_SYNTAX_get0_policyAuthority(const OSSL_IETF_ATTR_SYNTAX *a); +void OSSL_IETF_ATTR_SYNTAX_set0_policyAuthority(OSSL_IETF_ATTR_SYNTAX *a, + GENERAL_NAMES *names); + +int OSSL_IETF_ATTR_SYNTAX_get_value_num(const OSSL_IETF_ATTR_SYNTAX *a); +void *OSSL_IETF_ATTR_SYNTAX_get0_value(const OSSL_IETF_ATTR_SYNTAX *a, + int ind, int *type); +int OSSL_IETF_ATTR_SYNTAX_add1_value(OSSL_IETF_ATTR_SYNTAX *a, int type, + void *data); +int OSSL_IETF_ATTR_SYNTAX_print(BIO *bp, OSSL_IETF_ATTR_SYNTAX *a, int indent); + +struct TARGET_CERT_st { + OSSL_ISSUER_SERIAL *targetCertificate; + GENERAL_NAME *targetName; + OSSL_OBJECT_DIGEST_INFO *certDigestInfo; +}; + +typedef struct TARGET_CERT_st OSSL_TARGET_CERT; + +#define OSSL_TGT_TARGET_NAME 0 +#define OSSL_TGT_TARGET_GROUP 1 +#define OSSL_TGT_TARGET_CERT 2 + +typedef struct TARGET_st { + int type; + union { + GENERAL_NAME *targetName; + GENERAL_NAME *targetGroup; + OSSL_TARGET_CERT *targetCert; + } choice; +} OSSL_TARGET; + +typedef STACK_OF(OSSL_TARGET) OSSL_TARGETS; +typedef STACK_OF(OSSL_TARGETS) OSSL_TARGETING_INFORMATION; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_TARGET, OSSL_TARGET, OSSL_TARGET) +#define sk_OSSL_TARGET_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_TARGET_sk_type(sk)) +#define sk_OSSL_TARGET_value(sk, idx) ((OSSL_TARGET *)OPENSSL_sk_value(ossl_check_const_OSSL_TARGET_sk_type(sk), (idx))) +#define sk_OSSL_TARGET_new(cmp) ((STACK_OF(OSSL_TARGET) *)OPENSSL_sk_new(ossl_check_OSSL_TARGET_compfunc_type(cmp))) +#define sk_OSSL_TARGET_new_null() ((STACK_OF(OSSL_TARGET) *)OPENSSL_sk_new_null()) +#define sk_OSSL_TARGET_new_reserve(cmp, n) ((STACK_OF(OSSL_TARGET) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_TARGET_compfunc_type(cmp), (n))) +#define sk_OSSL_TARGET_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_TARGET_sk_type(sk), (n)) +#define sk_OSSL_TARGET_free(sk) OPENSSL_sk_free(ossl_check_OSSL_TARGET_sk_type(sk)) +#define sk_OSSL_TARGET_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_TARGET_sk_type(sk)) +#define sk_OSSL_TARGET_delete(sk, i) ((OSSL_TARGET *)OPENSSL_sk_delete(ossl_check_OSSL_TARGET_sk_type(sk), (i))) +#define sk_OSSL_TARGET_delete_ptr(sk, ptr) ((OSSL_TARGET *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_type(ptr))) +#define sk_OSSL_TARGET_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_type(ptr)) +#define sk_OSSL_TARGET_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_type(ptr)) +#define sk_OSSL_TARGET_pop(sk) ((OSSL_TARGET *)OPENSSL_sk_pop(ossl_check_OSSL_TARGET_sk_type(sk))) +#define sk_OSSL_TARGET_shift(sk) ((OSSL_TARGET *)OPENSSL_sk_shift(ossl_check_OSSL_TARGET_sk_type(sk))) +#define sk_OSSL_TARGET_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_TARGET_sk_type(sk),ossl_check_OSSL_TARGET_freefunc_type(freefunc)) +#define sk_OSSL_TARGET_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_type(ptr), (idx)) +#define sk_OSSL_TARGET_set(sk, idx, ptr) ((OSSL_TARGET *)OPENSSL_sk_set(ossl_check_OSSL_TARGET_sk_type(sk), (idx), ossl_check_OSSL_TARGET_type(ptr))) +#define sk_OSSL_TARGET_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_type(ptr)) +#define sk_OSSL_TARGET_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_type(ptr)) +#define sk_OSSL_TARGET_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_type(ptr), pnum) +#define sk_OSSL_TARGET_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_TARGET_sk_type(sk)) +#define sk_OSSL_TARGET_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_TARGET_sk_type(sk)) +#define sk_OSSL_TARGET_dup(sk) ((STACK_OF(OSSL_TARGET) *)OPENSSL_sk_dup(ossl_check_const_OSSL_TARGET_sk_type(sk))) +#define sk_OSSL_TARGET_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_TARGET) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_copyfunc_type(copyfunc), ossl_check_OSSL_TARGET_freefunc_type(freefunc))) +#define sk_OSSL_TARGET_set_cmp_func(sk, cmp) ((sk_OSSL_TARGET_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_TARGET_sk_type(sk), ossl_check_OSSL_TARGET_compfunc_type(cmp))) + +/* clang-format on */ + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_TARGETS, OSSL_TARGETS, OSSL_TARGETS) +#define sk_OSSL_TARGETS_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_TARGETS_sk_type(sk)) +#define sk_OSSL_TARGETS_value(sk, idx) ((OSSL_TARGETS *)OPENSSL_sk_value(ossl_check_const_OSSL_TARGETS_sk_type(sk), (idx))) +#define sk_OSSL_TARGETS_new(cmp) ((STACK_OF(OSSL_TARGETS) *)OPENSSL_sk_new(ossl_check_OSSL_TARGETS_compfunc_type(cmp))) +#define sk_OSSL_TARGETS_new_null() ((STACK_OF(OSSL_TARGETS) *)OPENSSL_sk_new_null()) +#define sk_OSSL_TARGETS_new_reserve(cmp, n) ((STACK_OF(OSSL_TARGETS) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_TARGETS_compfunc_type(cmp), (n))) +#define sk_OSSL_TARGETS_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_TARGETS_sk_type(sk), (n)) +#define sk_OSSL_TARGETS_free(sk) OPENSSL_sk_free(ossl_check_OSSL_TARGETS_sk_type(sk)) +#define sk_OSSL_TARGETS_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_TARGETS_sk_type(sk)) +#define sk_OSSL_TARGETS_delete(sk, i) ((OSSL_TARGETS *)OPENSSL_sk_delete(ossl_check_OSSL_TARGETS_sk_type(sk), (i))) +#define sk_OSSL_TARGETS_delete_ptr(sk, ptr) ((OSSL_TARGETS *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_type(ptr))) +#define sk_OSSL_TARGETS_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_type(ptr)) +#define sk_OSSL_TARGETS_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_type(ptr)) +#define sk_OSSL_TARGETS_pop(sk) ((OSSL_TARGETS *)OPENSSL_sk_pop(ossl_check_OSSL_TARGETS_sk_type(sk))) +#define sk_OSSL_TARGETS_shift(sk) ((OSSL_TARGETS *)OPENSSL_sk_shift(ossl_check_OSSL_TARGETS_sk_type(sk))) +#define sk_OSSL_TARGETS_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_TARGETS_sk_type(sk),ossl_check_OSSL_TARGETS_freefunc_type(freefunc)) +#define sk_OSSL_TARGETS_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_type(ptr), (idx)) +#define sk_OSSL_TARGETS_set(sk, idx, ptr) ((OSSL_TARGETS *)OPENSSL_sk_set(ossl_check_OSSL_TARGETS_sk_type(sk), (idx), ossl_check_OSSL_TARGETS_type(ptr))) +#define sk_OSSL_TARGETS_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_type(ptr)) +#define sk_OSSL_TARGETS_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_type(ptr)) +#define sk_OSSL_TARGETS_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_type(ptr), pnum) +#define sk_OSSL_TARGETS_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_TARGETS_sk_type(sk)) +#define sk_OSSL_TARGETS_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_TARGETS_sk_type(sk)) +#define sk_OSSL_TARGETS_dup(sk) ((STACK_OF(OSSL_TARGETS) *)OPENSSL_sk_dup(ossl_check_const_OSSL_TARGETS_sk_type(sk))) +#define sk_OSSL_TARGETS_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_TARGETS) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_copyfunc_type(copyfunc), ossl_check_OSSL_TARGETS_freefunc_type(freefunc))) +#define sk_OSSL_TARGETS_set_cmp_func(sk, cmp) ((sk_OSSL_TARGETS_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_TARGETS_sk_type(sk), ossl_check_OSSL_TARGETS_compfunc_type(cmp))) + +/* clang-format on */ + +DECLARE_ASN1_FUNCTIONS(OSSL_TARGET) +DECLARE_ASN1_FUNCTIONS(OSSL_TARGETS) +DECLARE_ASN1_FUNCTIONS(OSSL_TARGETING_INFORMATION) + +typedef STACK_OF(OSSL_ISSUER_SERIAL) OSSL_AUTHORITY_ATTRIBUTE_ID_SYNTAX; +DECLARE_ASN1_FUNCTIONS(OSSL_AUTHORITY_ATTRIBUTE_ID_SYNTAX) + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ISSUER_SERIAL, OSSL_ISSUER_SERIAL, OSSL_ISSUER_SERIAL) +#define sk_OSSL_ISSUER_SERIAL_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_value(sk, idx) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_value(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk), (idx))) +#define sk_OSSL_ISSUER_SERIAL_new(cmp) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_new(ossl_check_OSSL_ISSUER_SERIAL_compfunc_type(cmp))) +#define sk_OSSL_ISSUER_SERIAL_new_null() ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ISSUER_SERIAL_new_reserve(cmp, n) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ISSUER_SERIAL_compfunc_type(cmp), (n))) +#define sk_OSSL_ISSUER_SERIAL_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), (n)) +#define sk_OSSL_ISSUER_SERIAL_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_delete(sk, i) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_delete(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), (i))) +#define sk_OSSL_ISSUER_SERIAL_delete_ptr(sk, ptr) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr))) +#define sk_OSSL_ISSUER_SERIAL_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr)) +#define sk_OSSL_ISSUER_SERIAL_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr)) +#define sk_OSSL_ISSUER_SERIAL_pop(sk) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_pop(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk))) +#define sk_OSSL_ISSUER_SERIAL_shift(sk) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_shift(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk))) +#define sk_OSSL_ISSUER_SERIAL_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk),ossl_check_OSSL_ISSUER_SERIAL_freefunc_type(freefunc)) +#define sk_OSSL_ISSUER_SERIAL_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr), (idx)) +#define sk_OSSL_ISSUER_SERIAL_set(sk, idx, ptr) ((OSSL_ISSUER_SERIAL *)OPENSSL_sk_set(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), (idx), ossl_check_OSSL_ISSUER_SERIAL_type(ptr))) +#define sk_OSSL_ISSUER_SERIAL_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr)) +#define sk_OSSL_ISSUER_SERIAL_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr)) +#define sk_OSSL_ISSUER_SERIAL_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_type(ptr), pnum) +#define sk_OSSL_ISSUER_SERIAL_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk)) +#define sk_OSSL_ISSUER_SERIAL_dup(sk) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk))) +#define sk_OSSL_ISSUER_SERIAL_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ISSUER_SERIAL) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_copyfunc_type(copyfunc), ossl_check_OSSL_ISSUER_SERIAL_freefunc_type(freefunc))) +#define sk_OSSL_ISSUER_SERIAL_set_cmp_func(sk, cmp) ((sk_OSSL_ISSUER_SERIAL_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ISSUER_SERIAL_sk_type(sk), ossl_check_OSSL_ISSUER_SERIAL_compfunc_type(cmp))) + +/* clang-format on */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/x509_vfy.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/x509_vfy.h new file mode 100644 index 000000000000..22e713f1ec3d --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/x509_vfy.h @@ -0,0 +1,904 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/x509_vfy.h.in + * + * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_X509_VFY_H +#define OPENSSL_X509_VFY_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_X509_VFY_H +#endif + +/* + * Protect against recursion, x509.h and x509_vfy.h each include the other. + */ +#ifndef OPENSSL_X509_H +#include +#endif + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*- +SSL_CTX -> X509_STORE + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + -> X509_LOOKUP + ->X509_LOOKUP_METHOD + +SSL -> X509_STORE_CTX + ->X509_STORE + +The X509_STORE holds the tables etc for verification stuff. +A X509_STORE_CTX is used while validating a single certificate. +The X509_STORE has X509_LOOKUPs for looking up certs. +The X509_STORE then calls a function to actually verify the +certificate chain. +*/ + +typedef enum { + X509_LU_NONE = 0, + X509_LU_X509, + X509_LU_CRL +} X509_LOOKUP_TYPE; + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define X509_LU_RETRY -1 +#define X509_LU_FAIL 0 +#endif + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_LOOKUP, X509_LOOKUP, X509_LOOKUP) +#define sk_X509_LOOKUP_num(sk) OPENSSL_sk_num(ossl_check_const_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_value(sk, idx) ((X509_LOOKUP *)OPENSSL_sk_value(ossl_check_const_X509_LOOKUP_sk_type(sk), (idx))) +#define sk_X509_LOOKUP_new(cmp) ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_new(ossl_check_X509_LOOKUP_compfunc_type(cmp))) +#define sk_X509_LOOKUP_new_null() ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_new_null()) +#define sk_X509_LOOKUP_new_reserve(cmp, n) ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_new_reserve(ossl_check_X509_LOOKUP_compfunc_type(cmp), (n))) +#define sk_X509_LOOKUP_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_LOOKUP_sk_type(sk), (n)) +#define sk_X509_LOOKUP_free(sk) OPENSSL_sk_free(ossl_check_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_zero(sk) OPENSSL_sk_zero(ossl_check_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_delete(sk, i) ((X509_LOOKUP *)OPENSSL_sk_delete(ossl_check_X509_LOOKUP_sk_type(sk), (i))) +#define sk_X509_LOOKUP_delete_ptr(sk, ptr) ((X509_LOOKUP *)OPENSSL_sk_delete_ptr(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr))) +#define sk_X509_LOOKUP_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr)) +#define sk_X509_LOOKUP_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr)) +#define sk_X509_LOOKUP_pop(sk) ((X509_LOOKUP *)OPENSSL_sk_pop(ossl_check_X509_LOOKUP_sk_type(sk))) +#define sk_X509_LOOKUP_shift(sk) ((X509_LOOKUP *)OPENSSL_sk_shift(ossl_check_X509_LOOKUP_sk_type(sk))) +#define sk_X509_LOOKUP_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_LOOKUP_sk_type(sk),ossl_check_X509_LOOKUP_freefunc_type(freefunc)) +#define sk_X509_LOOKUP_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr), (idx)) +#define sk_X509_LOOKUP_set(sk, idx, ptr) ((X509_LOOKUP *)OPENSSL_sk_set(ossl_check_X509_LOOKUP_sk_type(sk), (idx), ossl_check_X509_LOOKUP_type(ptr))) +#define sk_X509_LOOKUP_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr)) +#define sk_X509_LOOKUP_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr)) +#define sk_X509_LOOKUP_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_type(ptr), pnum) +#define sk_X509_LOOKUP_sort(sk) OPENSSL_sk_sort(ossl_check_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_LOOKUP_sk_type(sk)) +#define sk_X509_LOOKUP_dup(sk) ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_dup(ossl_check_const_X509_LOOKUP_sk_type(sk))) +#define sk_X509_LOOKUP_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_LOOKUP) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_copyfunc_type(copyfunc), ossl_check_X509_LOOKUP_freefunc_type(freefunc))) +#define sk_X509_LOOKUP_set_cmp_func(sk, cmp) ((sk_X509_LOOKUP_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_LOOKUP_sk_type(sk), ossl_check_X509_LOOKUP_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509_OBJECT, X509_OBJECT, X509_OBJECT) +#define sk_X509_OBJECT_num(sk) OPENSSL_sk_num(ossl_check_const_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_value(sk, idx) ((X509_OBJECT *)OPENSSL_sk_value(ossl_check_const_X509_OBJECT_sk_type(sk), (idx))) +#define sk_X509_OBJECT_new(cmp) ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_new(ossl_check_X509_OBJECT_compfunc_type(cmp))) +#define sk_X509_OBJECT_new_null() ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_new_null()) +#define sk_X509_OBJECT_new_reserve(cmp, n) ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_new_reserve(ossl_check_X509_OBJECT_compfunc_type(cmp), (n))) +#define sk_X509_OBJECT_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_OBJECT_sk_type(sk), (n)) +#define sk_X509_OBJECT_free(sk) OPENSSL_sk_free(ossl_check_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_zero(sk) OPENSSL_sk_zero(ossl_check_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_delete(sk, i) ((X509_OBJECT *)OPENSSL_sk_delete(ossl_check_X509_OBJECT_sk_type(sk), (i))) +#define sk_X509_OBJECT_delete_ptr(sk, ptr) ((X509_OBJECT *)OPENSSL_sk_delete_ptr(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr))) +#define sk_X509_OBJECT_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr)) +#define sk_X509_OBJECT_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr)) +#define sk_X509_OBJECT_pop(sk) ((X509_OBJECT *)OPENSSL_sk_pop(ossl_check_X509_OBJECT_sk_type(sk))) +#define sk_X509_OBJECT_shift(sk) ((X509_OBJECT *)OPENSSL_sk_shift(ossl_check_X509_OBJECT_sk_type(sk))) +#define sk_X509_OBJECT_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_OBJECT_sk_type(sk),ossl_check_X509_OBJECT_freefunc_type(freefunc)) +#define sk_X509_OBJECT_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr), (idx)) +#define sk_X509_OBJECT_set(sk, idx, ptr) ((X509_OBJECT *)OPENSSL_sk_set(ossl_check_X509_OBJECT_sk_type(sk), (idx), ossl_check_X509_OBJECT_type(ptr))) +#define sk_X509_OBJECT_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr)) +#define sk_X509_OBJECT_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr)) +#define sk_X509_OBJECT_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_type(ptr), pnum) +#define sk_X509_OBJECT_sort(sk) OPENSSL_sk_sort(ossl_check_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_OBJECT_sk_type(sk)) +#define sk_X509_OBJECT_dup(sk) ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_dup(ossl_check_const_X509_OBJECT_sk_type(sk))) +#define sk_X509_OBJECT_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_OBJECT) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_copyfunc_type(copyfunc), ossl_check_X509_OBJECT_freefunc_type(freefunc))) +#define sk_X509_OBJECT_set_cmp_func(sk, cmp) ((sk_X509_OBJECT_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_OBJECT_sk_type(sk), ossl_check_X509_OBJECT_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(X509_VERIFY_PARAM, X509_VERIFY_PARAM, X509_VERIFY_PARAM) +#define sk_X509_VERIFY_PARAM_num(sk) OPENSSL_sk_num(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_value(sk, idx) ((X509_VERIFY_PARAM *)OPENSSL_sk_value(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk), (idx))) +#define sk_X509_VERIFY_PARAM_new(cmp) ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_new(ossl_check_X509_VERIFY_PARAM_compfunc_type(cmp))) +#define sk_X509_VERIFY_PARAM_new_null() ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_new_null()) +#define sk_X509_VERIFY_PARAM_new_reserve(cmp, n) ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_new_reserve(ossl_check_X509_VERIFY_PARAM_compfunc_type(cmp), (n))) +#define sk_X509_VERIFY_PARAM_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_VERIFY_PARAM_sk_type(sk), (n)) +#define sk_X509_VERIFY_PARAM_free(sk) OPENSSL_sk_free(ossl_check_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_zero(sk) OPENSSL_sk_zero(ossl_check_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_delete(sk, i) ((X509_VERIFY_PARAM *)OPENSSL_sk_delete(ossl_check_X509_VERIFY_PARAM_sk_type(sk), (i))) +#define sk_X509_VERIFY_PARAM_delete_ptr(sk, ptr) ((X509_VERIFY_PARAM *)OPENSSL_sk_delete_ptr(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr))) +#define sk_X509_VERIFY_PARAM_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr)) +#define sk_X509_VERIFY_PARAM_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr)) +#define sk_X509_VERIFY_PARAM_pop(sk) ((X509_VERIFY_PARAM *)OPENSSL_sk_pop(ossl_check_X509_VERIFY_PARAM_sk_type(sk))) +#define sk_X509_VERIFY_PARAM_shift(sk) ((X509_VERIFY_PARAM *)OPENSSL_sk_shift(ossl_check_X509_VERIFY_PARAM_sk_type(sk))) +#define sk_X509_VERIFY_PARAM_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_VERIFY_PARAM_sk_type(sk),ossl_check_X509_VERIFY_PARAM_freefunc_type(freefunc)) +#define sk_X509_VERIFY_PARAM_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr), (idx)) +#define sk_X509_VERIFY_PARAM_set(sk, idx, ptr) ((X509_VERIFY_PARAM *)OPENSSL_sk_set(ossl_check_X509_VERIFY_PARAM_sk_type(sk), (idx), ossl_check_X509_VERIFY_PARAM_type(ptr))) +#define sk_X509_VERIFY_PARAM_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr)) +#define sk_X509_VERIFY_PARAM_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr)) +#define sk_X509_VERIFY_PARAM_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_type(ptr), pnum) +#define sk_X509_VERIFY_PARAM_sort(sk) OPENSSL_sk_sort(ossl_check_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk)) +#define sk_X509_VERIFY_PARAM_dup(sk) ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_dup(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk))) +#define sk_X509_VERIFY_PARAM_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_VERIFY_PARAM) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_copyfunc_type(copyfunc), ossl_check_X509_VERIFY_PARAM_freefunc_type(freefunc))) +#define sk_X509_VERIFY_PARAM_set_cmp_func(sk, cmp) ((sk_X509_VERIFY_PARAM_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_VERIFY_PARAM_sk_type(sk), ossl_check_X509_VERIFY_PARAM_compfunc_type(cmp))) + +/* clang-format on */ + +/* This is used for a table of trust checking functions */ +typedef struct x509_trust_st { + int trust; + int flags; + int (*check_trust)(struct x509_trust_st *, X509 *, int); + char *name; + int arg1; + void *arg2; +} X509_TRUST; +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_TRUST, X509_TRUST, X509_TRUST) +#define sk_X509_TRUST_num(sk) OPENSSL_sk_num(ossl_check_const_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_value(sk, idx) ((X509_TRUST *)OPENSSL_sk_value(ossl_check_const_X509_TRUST_sk_type(sk), (idx))) +#define sk_X509_TRUST_new(cmp) ((STACK_OF(X509_TRUST) *)OPENSSL_sk_new(ossl_check_X509_TRUST_compfunc_type(cmp))) +#define sk_X509_TRUST_new_null() ((STACK_OF(X509_TRUST) *)OPENSSL_sk_new_null()) +#define sk_X509_TRUST_new_reserve(cmp, n) ((STACK_OF(X509_TRUST) *)OPENSSL_sk_new_reserve(ossl_check_X509_TRUST_compfunc_type(cmp), (n))) +#define sk_X509_TRUST_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_TRUST_sk_type(sk), (n)) +#define sk_X509_TRUST_free(sk) OPENSSL_sk_free(ossl_check_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_zero(sk) OPENSSL_sk_zero(ossl_check_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_delete(sk, i) ((X509_TRUST *)OPENSSL_sk_delete(ossl_check_X509_TRUST_sk_type(sk), (i))) +#define sk_X509_TRUST_delete_ptr(sk, ptr) ((X509_TRUST *)OPENSSL_sk_delete_ptr(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr))) +#define sk_X509_TRUST_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr)) +#define sk_X509_TRUST_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr)) +#define sk_X509_TRUST_pop(sk) ((X509_TRUST *)OPENSSL_sk_pop(ossl_check_X509_TRUST_sk_type(sk))) +#define sk_X509_TRUST_shift(sk) ((X509_TRUST *)OPENSSL_sk_shift(ossl_check_X509_TRUST_sk_type(sk))) +#define sk_X509_TRUST_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_TRUST_sk_type(sk),ossl_check_X509_TRUST_freefunc_type(freefunc)) +#define sk_X509_TRUST_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr), (idx)) +#define sk_X509_TRUST_set(sk, idx, ptr) ((X509_TRUST *)OPENSSL_sk_set(ossl_check_X509_TRUST_sk_type(sk), (idx), ossl_check_X509_TRUST_type(ptr))) +#define sk_X509_TRUST_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr)) +#define sk_X509_TRUST_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr)) +#define sk_X509_TRUST_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_type(ptr), pnum) +#define sk_X509_TRUST_sort(sk) OPENSSL_sk_sort(ossl_check_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_TRUST_sk_type(sk)) +#define sk_X509_TRUST_dup(sk) ((STACK_OF(X509_TRUST) *)OPENSSL_sk_dup(ossl_check_const_X509_TRUST_sk_type(sk))) +#define sk_X509_TRUST_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_TRUST) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_copyfunc_type(copyfunc), ossl_check_X509_TRUST_freefunc_type(freefunc))) +#define sk_X509_TRUST_set_cmp_func(sk, cmp) ((sk_X509_TRUST_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_TRUST_sk_type(sk), ossl_check_X509_TRUST_compfunc_type(cmp))) + +/* clang-format on */ + +/* standard trust ids */ +#define X509_TRUST_DEFAULT 0 /* Only valid in purpose settings */ +#define X509_TRUST_COMPAT 1 +#define X509_TRUST_SSL_CLIENT 2 +#define X509_TRUST_SSL_SERVER 3 +#define X509_TRUST_EMAIL 4 +#define X509_TRUST_OBJECT_SIGN 5 +#define X509_TRUST_OCSP_SIGN 6 +#define X509_TRUST_OCSP_REQUEST 7 +#define X509_TRUST_TSA 8 +/* Keep these up to date! */ +#define X509_TRUST_MIN 1 +#define X509_TRUST_MAX 8 + +/* trust_flags values */ +#define X509_TRUST_DYNAMIC (1U << 0) +#define X509_TRUST_DYNAMIC_NAME (1U << 1) +/* No compat trust if self-signed, preempts "DO_SS" */ +#define X509_TRUST_NO_SS_COMPAT (1U << 2) +/* Compat trust if no explicit accepted trust EKUs */ +#define X509_TRUST_DO_SS_COMPAT (1U << 3) +/* Accept "anyEKU" as a wildcard rejection OID and as a wildcard trust OID */ +#define X509_TRUST_OK_ANY_EKU (1U << 4) + +/* check_trust return codes */ +#define X509_TRUST_TRUSTED 1 +#define X509_TRUST_REJECTED 2 +#define X509_TRUST_UNTRUSTED 3 + +int X509_TRUST_set(int *t, int trust); +int X509_TRUST_get_count(void); +X509_TRUST *X509_TRUST_get0(int idx); +int X509_TRUST_get_by_id(int id); +int X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int), + const char *name, int arg1, void *arg2); +void X509_TRUST_cleanup(void); +int X509_TRUST_get_flags(const X509_TRUST *xp); +char *X509_TRUST_get0_name(const X509_TRUST *xp); +int X509_TRUST_get_trust(const X509_TRUST *xp); + +int X509_trusted(const X509 *x); +int X509_add1_trust_object(X509 *x, const ASN1_OBJECT *obj); +int X509_add1_reject_object(X509 *x, const ASN1_OBJECT *obj); +void X509_trust_clear(X509 *x); +void X509_reject_clear(X509 *x); +STACK_OF(ASN1_OBJECT) *X509_get0_trust_objects(X509 *x); +STACK_OF(ASN1_OBJECT) *X509_get0_reject_objects(X509 *x); + +int (*X509_TRUST_set_default(int (*trust)(int, X509 *, int)))(int, X509 *, + int); +int X509_check_trust(X509 *x, int id, int flags); + +int X509_verify_cert(X509_STORE_CTX *ctx); +int X509_STORE_CTX_verify(X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_build_chain(X509 *target, STACK_OF(X509) *certs, + X509_STORE *store, int with_self_signed, + OSSL_LIB_CTX *libctx, const char *propq); + +int X509_STORE_set_depth(X509_STORE *store, int depth); + +typedef int (*X509_STORE_CTX_verify_cb)(int, X509_STORE_CTX *); +int X509_STORE_CTX_print_verify_cb(int ok, X509_STORE_CTX *ctx); +typedef int (*X509_STORE_CTX_verify_fn)(X509_STORE_CTX *); +typedef int (*X509_STORE_CTX_get_issuer_fn)(X509 **issuer, + X509_STORE_CTX *ctx, X509 *x); +typedef int (*X509_STORE_CTX_check_issued_fn)(X509_STORE_CTX *ctx, + X509 *x, X509 *issuer); +typedef int (*X509_STORE_CTX_check_revocation_fn)(X509_STORE_CTX *ctx); +typedef int (*X509_STORE_CTX_get_crl_fn)(X509_STORE_CTX *ctx, + X509_CRL **crl, X509 *x); +typedef int (*X509_STORE_CTX_check_crl_fn)(X509_STORE_CTX *ctx, X509_CRL *crl); +typedef int (*X509_STORE_CTX_cert_crl_fn)(X509_STORE_CTX *ctx, + X509_CRL *crl, X509 *x); +typedef int (*X509_STORE_CTX_check_policy_fn)(X509_STORE_CTX *ctx); +typedef STACK_OF(X509) + *(*X509_STORE_CTX_lookup_certs_fn)(X509_STORE_CTX *ctx, + const X509_NAME *nm); +typedef STACK_OF(X509_CRL) + *(*X509_STORE_CTX_lookup_crls_fn)(const X509_STORE_CTX *ctx, + const X509_NAME *nm); +typedef int (*X509_STORE_CTX_cleanup_fn)(X509_STORE_CTX *ctx); + +void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth); + +#define X509_STORE_CTX_set_app_data(ctx, data) \ + X509_STORE_CTX_set_ex_data(ctx, 0, data) +#define X509_STORE_CTX_get_app_data(ctx) \ + X509_STORE_CTX_get_ex_data(ctx, 0) + +#define X509_L_FILE_LOAD 1 +#define X509_L_ADD_DIR 2 +#define X509_L_ADD_STORE 3 +#define X509_L_LOAD_STORE 4 + +#define X509_LOOKUP_load_file(x, name, type) \ + X509_LOOKUP_ctrl((x), X509_L_FILE_LOAD, (name), (long)(type), NULL) + +#define X509_LOOKUP_add_dir(x, name, type) \ + X509_LOOKUP_ctrl((x), X509_L_ADD_DIR, (name), (long)(type), NULL) + +#define X509_LOOKUP_add_store(x, name) \ + X509_LOOKUP_ctrl((x), X509_L_ADD_STORE, (name), 0, NULL) + +#define X509_LOOKUP_load_store(x, name) \ + X509_LOOKUP_ctrl((x), X509_L_LOAD_STORE, (name), 0, NULL) + +#define X509_LOOKUP_load_file_ex(x, name, type, libctx, propq) \ + X509_LOOKUP_ctrl_ex((x), X509_L_FILE_LOAD, (name), (long)(type), NULL, \ + (libctx), (propq)) + +#define X509_LOOKUP_load_store_ex(x, name, libctx, propq) \ + X509_LOOKUP_ctrl_ex((x), X509_L_LOAD_STORE, (name), 0, NULL, \ + (libctx), (propq)) + +#define X509_LOOKUP_add_store_ex(x, name, libctx, propq) \ + X509_LOOKUP_ctrl_ex((x), X509_L_ADD_STORE, (name), 0, NULL, \ + (libctx), (propq)) + +#define X509_V_OK 0 +#define X509_V_ERR_UNSPECIFIED 1 +#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2 +#define X509_V_ERR_UNABLE_TO_GET_CRL 3 +#define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4 +#define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5 +#define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6 +#define X509_V_ERR_CERT_SIGNATURE_FAILURE 7 +#define X509_V_ERR_CRL_SIGNATURE_FAILURE 8 +#define X509_V_ERR_CERT_NOT_YET_VALID 9 +#define X509_V_ERR_CERT_HAS_EXPIRED 10 +#define X509_V_ERR_CRL_NOT_YET_VALID 11 +#define X509_V_ERR_CRL_HAS_EXPIRED 12 +#define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13 +#define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14 +#define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15 +#define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16 +#define X509_V_ERR_OUT_OF_MEM 17 +#define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18 +#define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19 +#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20 +#define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21 +#define X509_V_ERR_CERT_CHAIN_TOO_LONG 22 +#define X509_V_ERR_CERT_REVOKED 23 +#define X509_V_ERR_NO_ISSUER_PUBLIC_KEY 24 +#define X509_V_ERR_PATH_LENGTH_EXCEEDED 25 +#define X509_V_ERR_INVALID_PURPOSE 26 +#define X509_V_ERR_CERT_UNTRUSTED 27 +#define X509_V_ERR_CERT_REJECTED 28 + +/* These are 'informational' when looking for issuer cert */ +#define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29 +#define X509_V_ERR_AKID_SKID_MISMATCH 30 +#define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31 +#define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32 +#define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33 +#define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 +#define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35 +#define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36 +#define X509_V_ERR_INVALID_NON_CA 37 +#define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38 +#define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39 +#define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40 +#define X509_V_ERR_INVALID_EXTENSION 41 +#define X509_V_ERR_INVALID_POLICY_EXTENSION 42 +#define X509_V_ERR_NO_EXPLICIT_POLICY 43 +#define X509_V_ERR_DIFFERENT_CRL_SCOPE 44 +#define X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE 45 +#define X509_V_ERR_UNNESTED_RESOURCE 46 +#define X509_V_ERR_PERMITTED_VIOLATION 47 +#define X509_V_ERR_EXCLUDED_VIOLATION 48 +#define X509_V_ERR_SUBTREE_MINMAX 49 +/* The application is not happy */ +#define X509_V_ERR_APPLICATION_VERIFICATION 50 +#define X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE 51 +#define X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX 52 +#define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53 +#define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54 +/* Another issuer check debug option */ +#define X509_V_ERR_PATH_LOOP 55 +/* Suite B mode algorithm violation */ +#define X509_V_ERR_SUITE_B_INVALID_VERSION 56 +#define X509_V_ERR_SUITE_B_INVALID_ALGORITHM 57 +#define X509_V_ERR_SUITE_B_INVALID_CURVE 58 +#define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM 59 +#define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED 60 +#define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 61 +/* Host, email and IP check errors */ +#define X509_V_ERR_HOSTNAME_MISMATCH 62 +#define X509_V_ERR_EMAIL_MISMATCH 63 +#define X509_V_ERR_IP_ADDRESS_MISMATCH 64 +/* DANE TLSA errors */ +#define X509_V_ERR_DANE_NO_MATCH 65 +/* security level errors */ +#define X509_V_ERR_EE_KEY_TOO_SMALL 66 +#define X509_V_ERR_CA_KEY_TOO_SMALL 67 +#define X509_V_ERR_CA_MD_TOO_WEAK 68 +/* Caller error */ +#define X509_V_ERR_INVALID_CALL 69 +/* Issuer lookup error */ +#define X509_V_ERR_STORE_LOOKUP 70 +/* Certificate transparency */ +#define X509_V_ERR_NO_VALID_SCTS 71 + +#define X509_V_ERR_PROXY_SUBJECT_NAME_VIOLATION 72 +/* OCSP status errors */ +#define X509_V_ERR_OCSP_VERIFY_NEEDED 73 /* Need OCSP verification */ +#define X509_V_ERR_OCSP_VERIFY_FAILED 74 /* Couldn't verify cert through OCSP */ +#define X509_V_ERR_OCSP_CERT_UNKNOWN 75 /* Certificate wasn't recognized by the OCSP responder */ + +#define X509_V_ERR_UNSUPPORTED_SIGNATURE_ALGORITHM 76 +#define X509_V_ERR_SIGNATURE_ALGORITHM_MISMATCH 77 + +/* Errors in case a check in X509_V_FLAG_X509_STRICT mode fails */ +#define X509_V_ERR_SIGNATURE_ALGORITHM_INCONSISTENCY 78 +#define X509_V_ERR_INVALID_CA 79 +#define X509_V_ERR_PATHLEN_INVALID_FOR_NON_CA 80 +#define X509_V_ERR_PATHLEN_WITHOUT_KU_KEY_CERT_SIGN 81 +#define X509_V_ERR_KU_KEY_CERT_SIGN_INVALID_FOR_NON_CA 82 +#define X509_V_ERR_ISSUER_NAME_EMPTY 83 +#define X509_V_ERR_SUBJECT_NAME_EMPTY 84 +#define X509_V_ERR_MISSING_AUTHORITY_KEY_IDENTIFIER 85 +#define X509_V_ERR_MISSING_SUBJECT_KEY_IDENTIFIER 86 +#define X509_V_ERR_EMPTY_SUBJECT_ALT_NAME 87 +#define X509_V_ERR_EMPTY_SUBJECT_SAN_NOT_CRITICAL 88 +#define X509_V_ERR_CA_BCONS_NOT_CRITICAL 89 +#define X509_V_ERR_AUTHORITY_KEY_IDENTIFIER_CRITICAL 90 +#define X509_V_ERR_SUBJECT_KEY_IDENTIFIER_CRITICAL 91 +#define X509_V_ERR_CA_CERT_MISSING_KEY_USAGE 92 +#define X509_V_ERR_EXTENSIONS_REQUIRE_VERSION_3 93 +#define X509_V_ERR_EC_KEY_EXPLICIT_PARAMS 94 +#define X509_V_ERR_RPK_UNTRUSTED 95 + +/* Certificate verify flags */ +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define X509_V_FLAG_CB_ISSUER_CHECK 0x0 /* Deprecated */ +#endif +/* Use check time instead of current time */ +#define X509_V_FLAG_USE_CHECK_TIME 0x2 +/* Lookup CRLs */ +#define X509_V_FLAG_CRL_CHECK 0x4 +/* Lookup CRLs for whole chain */ +#define X509_V_FLAG_CRL_CHECK_ALL 0x8 +/* Ignore unhandled critical extensions */ +#define X509_V_FLAG_IGNORE_CRITICAL 0x10 +/* Disable workarounds for broken certificates */ +#define X509_V_FLAG_X509_STRICT 0x20 +/* Enable proxy certificate validation */ +#define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40 +/* Enable policy checking */ +#define X509_V_FLAG_POLICY_CHECK 0x80 +/* Policy variable require-explicit-policy */ +#define X509_V_FLAG_EXPLICIT_POLICY 0x100 +/* Policy variable inhibit-any-policy */ +#define X509_V_FLAG_INHIBIT_ANY 0x200 +/* Policy variable inhibit-policy-mapping */ +#define X509_V_FLAG_INHIBIT_MAP 0x400 +/* Notify callback that policy is OK */ +#define X509_V_FLAG_NOTIFY_POLICY 0x800 +/* Extended CRL features such as indirect CRLs, alternate CRL signing keys */ +#define X509_V_FLAG_EXTENDED_CRL_SUPPORT 0x1000 +/* Delta CRL support */ +#define X509_V_FLAG_USE_DELTAS 0x2000 +/* Check self-signed CA signature */ +#define X509_V_FLAG_CHECK_SS_SIGNATURE 0x4000 +/* Use trusted store first */ +#define X509_V_FLAG_TRUSTED_FIRST 0x8000 +/* Suite B 128 bit only mode: not normally used */ +#define X509_V_FLAG_SUITEB_128_LOS_ONLY 0x10000 +/* Suite B 192 bit only mode */ +#define X509_V_FLAG_SUITEB_192_LOS 0x20000 +/* Suite B 128 bit mode allowing 192 bit algorithms */ +#define X509_V_FLAG_SUITEB_128_LOS 0x30000 +/* Allow partial chains if at least one certificate is in trusted store */ +#define X509_V_FLAG_PARTIAL_CHAIN 0x80000 +/* + * If the initial chain is not trusted, do not attempt to build an alternative + * chain. Alternate chain checking was introduced in 1.1.0. Setting this flag + * will force the behaviour to match that of previous versions. + */ +#define X509_V_FLAG_NO_ALT_CHAINS 0x100000 +/* Do not check certificate/CRL validity against current time */ +#define X509_V_FLAG_NO_CHECK_TIME 0x200000 + +#define X509_VP_FLAG_DEFAULT 0x1 +#define X509_VP_FLAG_OVERWRITE 0x2 +#define X509_VP_FLAG_RESET_FLAGS 0x4 +#define X509_VP_FLAG_LOCKED 0x8 +#define X509_VP_FLAG_ONCE 0x10 + +/* Internal use: mask of policy related options */ +#define X509_V_FLAG_POLICY_MASK (X509_V_FLAG_POLICY_CHECK \ + | X509_V_FLAG_EXPLICIT_POLICY \ + | X509_V_FLAG_INHIBIT_ANY \ + | X509_V_FLAG_INHIBIT_MAP) + +int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, X509_LOOKUP_TYPE type, + const X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h, + X509_LOOKUP_TYPE type, + const X509_NAME *name); +X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, + X509_OBJECT *x); +int X509_OBJECT_up_ref_count(X509_OBJECT *a); +X509_OBJECT *X509_OBJECT_new(void); +void X509_OBJECT_free(X509_OBJECT *a); +X509_LOOKUP_TYPE X509_OBJECT_get_type(const X509_OBJECT *a); +X509 *X509_OBJECT_get0_X509(const X509_OBJECT *a); +int X509_OBJECT_set1_X509(X509_OBJECT *a, X509 *obj); +X509_CRL *X509_OBJECT_get0_X509_CRL(const X509_OBJECT *a); +int X509_OBJECT_set1_X509_CRL(X509_OBJECT *a, X509_CRL *obj); +X509_STORE *X509_STORE_new(void); +void X509_STORE_free(X509_STORE *xs); +int X509_STORE_lock(X509_STORE *xs); +int X509_STORE_unlock(X509_STORE *xs); +int X509_STORE_up_ref(X509_STORE *xs); +STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(const X509_STORE *xs); +STACK_OF(X509_OBJECT) *X509_STORE_get1_objects(X509_STORE *xs); +STACK_OF(X509) *X509_STORE_get1_all_certs(X509_STORE *xs); +STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *xs, + const X509_NAME *nm); +STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls(const X509_STORE_CTX *st, + const X509_NAME *nm); +int X509_STORE_set_flags(X509_STORE *xs, unsigned long flags); +int X509_STORE_set_purpose(X509_STORE *xs, int purpose); +int X509_STORE_set_trust(X509_STORE *xs, int trust); +int X509_STORE_set1_param(X509_STORE *xs, const X509_VERIFY_PARAM *pm); +X509_VERIFY_PARAM *X509_STORE_get0_param(const X509_STORE *xs); + +void X509_STORE_set_verify(X509_STORE *xs, X509_STORE_CTX_verify_fn verify); +#define X509_STORE_set_verify_func(ctx, func) \ + X509_STORE_set_verify((ctx), (func)) +void X509_STORE_CTX_set_verify(X509_STORE_CTX *ctx, + X509_STORE_CTX_verify_fn verify); +X509_STORE_CTX_verify_fn X509_STORE_get_verify(const X509_STORE *xs); +void X509_STORE_set_verify_cb(X509_STORE *xs, + X509_STORE_CTX_verify_cb verify_cb); +#define X509_STORE_set_verify_cb_func(ctx, func) \ + X509_STORE_set_verify_cb((ctx), (func)) +X509_STORE_CTX_verify_cb X509_STORE_get_verify_cb(const X509_STORE *xs); +void X509_STORE_set_get_issuer(X509_STORE *xs, + X509_STORE_CTX_get_issuer_fn get_issuer); +X509_STORE_CTX_get_issuer_fn X509_STORE_get_get_issuer(const X509_STORE *xs); +void X509_STORE_set_check_issued(X509_STORE *xs, + X509_STORE_CTX_check_issued_fn check_issued); +X509_STORE_CTX_check_issued_fn X509_STORE_get_check_issued(const X509_STORE *s); +void X509_STORE_set_check_revocation(X509_STORE *xs, + X509_STORE_CTX_check_revocation_fn check_revocation); +X509_STORE_CTX_check_revocation_fn +X509_STORE_get_check_revocation(const X509_STORE *xs); +void X509_STORE_set_get_crl(X509_STORE *xs, + X509_STORE_CTX_get_crl_fn get_crl); +X509_STORE_CTX_get_crl_fn X509_STORE_get_get_crl(const X509_STORE *xs); +void X509_STORE_set_check_crl(X509_STORE *xs, + X509_STORE_CTX_check_crl_fn check_crl); +X509_STORE_CTX_check_crl_fn X509_STORE_get_check_crl(const X509_STORE *xs); +void X509_STORE_set_cert_crl(X509_STORE *xs, + X509_STORE_CTX_cert_crl_fn cert_crl); +X509_STORE_CTX_cert_crl_fn X509_STORE_get_cert_crl(const X509_STORE *xs); +void X509_STORE_set_check_policy(X509_STORE *xs, + X509_STORE_CTX_check_policy_fn check_policy); +X509_STORE_CTX_check_policy_fn X509_STORE_get_check_policy(const X509_STORE *s); +void X509_STORE_set_lookup_certs(X509_STORE *xs, + X509_STORE_CTX_lookup_certs_fn lookup_certs); +X509_STORE_CTX_lookup_certs_fn X509_STORE_get_lookup_certs(const X509_STORE *s); +void X509_STORE_set_lookup_crls(X509_STORE *xs, + X509_STORE_CTX_lookup_crls_fn lookup_crls); +#define X509_STORE_set_lookup_crls_cb(ctx, func) \ + X509_STORE_set_lookup_crls((ctx), (func)) +X509_STORE_CTX_lookup_crls_fn X509_STORE_get_lookup_crls(const X509_STORE *xs); +void X509_STORE_set_cleanup(X509_STORE *xs, + X509_STORE_CTX_cleanup_fn cleanup); +X509_STORE_CTX_cleanup_fn X509_STORE_get_cleanup(const X509_STORE *xs); + +#define X509_STORE_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE, l, p, newf, dupf, freef) +int X509_STORE_set_ex_data(X509_STORE *xs, int idx, void *data); +void *X509_STORE_get_ex_data(const X509_STORE *xs, int idx); + +X509_STORE_CTX *X509_STORE_CTX_new_ex(OSSL_LIB_CTX *libctx, const char *propq); +X509_STORE_CTX *X509_STORE_CTX_new(void); + +int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x); + +void X509_STORE_CTX_free(X509_STORE_CTX *ctx); +int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *trust_store, + X509 *target, STACK_OF(X509) *untrusted); +int X509_STORE_CTX_init_rpk(X509_STORE_CTX *ctx, X509_STORE *trust_store, + EVP_PKEY *rpk); +void X509_STORE_CTX_set0_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); +void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx); + +X509_STORE *X509_STORE_CTX_get0_store(const X509_STORE_CTX *ctx); +X509 *X509_STORE_CTX_get0_cert(const X509_STORE_CTX *ctx); +EVP_PKEY *X509_STORE_CTX_get0_rpk(const X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get0_untrusted(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set0_untrusted(X509_STORE_CTX *ctx, STACK_OF(X509) *sk); +void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx, + X509_STORE_CTX_verify_cb verify); +X509_STORE_CTX_verify_cb X509_STORE_CTX_get_verify_cb(const X509_STORE_CTX *ctx); +X509_STORE_CTX_verify_fn X509_STORE_CTX_get_verify(const X509_STORE_CTX *ctx); +X509_STORE_CTX_get_issuer_fn X509_STORE_CTX_get_get_issuer(const X509_STORE_CTX *ctx); +X509_STORE_CTX_check_issued_fn X509_STORE_CTX_get_check_issued(const X509_STORE_CTX *ctx); +X509_STORE_CTX_check_revocation_fn X509_STORE_CTX_get_check_revocation(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_get_crl(X509_STORE_CTX *ctx, + X509_STORE_CTX_get_crl_fn get_crl); +X509_STORE_CTX_get_crl_fn X509_STORE_CTX_get_get_crl(const X509_STORE_CTX *ctx); +X509_STORE_CTX_check_crl_fn X509_STORE_CTX_get_check_crl(const X509_STORE_CTX *ctx); +X509_STORE_CTX_cert_crl_fn X509_STORE_CTX_get_cert_crl(const X509_STORE_CTX *ctx); +X509_STORE_CTX_check_policy_fn X509_STORE_CTX_get_check_policy(const X509_STORE_CTX *ctx); +X509_STORE_CTX_lookup_certs_fn X509_STORE_CTX_get_lookup_certs(const X509_STORE_CTX *ctx); +X509_STORE_CTX_lookup_crls_fn X509_STORE_CTX_get_lookup_crls(const X509_STORE_CTX *ctx); +X509_STORE_CTX_cleanup_fn X509_STORE_CTX_get_cleanup(const X509_STORE_CTX *ctx); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +#define X509_STORE_CTX_get_chain X509_STORE_CTX_get0_chain +#define X509_STORE_CTX_set_chain X509_STORE_CTX_set0_untrusted +#define X509_STORE_CTX_trusted_stack X509_STORE_CTX_set0_trusted_stack +#define X509_STORE_get_by_subject X509_STORE_CTX_get_by_subject +#define X509_STORE_get1_certs X509_STORE_CTX_get1_certs +#define X509_STORE_get1_crls X509_STORE_CTX_get1_crls +/* the following macro is misspelled; use X509_STORE_get1_certs instead */ +#define X509_STORE_get1_cert X509_STORE_CTX_get1_certs +/* the following macro is misspelled; use X509_STORE_get1_crls instead */ +#define X509_STORE_get1_crl X509_STORE_CTX_get1_crls +#endif + +X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *xs, X509_LOOKUP_METHOD *m); +X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void); +X509_LOOKUP_METHOD *X509_LOOKUP_file(void); +X509_LOOKUP_METHOD *X509_LOOKUP_store(void); + +typedef int (*X509_LOOKUP_ctrl_fn)(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); +typedef int (*X509_LOOKUP_ctrl_ex_fn)( + X509_LOOKUP *ctx, int cmd, const char *argc, long argl, char **ret, + OSSL_LIB_CTX *libctx, const char *propq); + +typedef int (*X509_LOOKUP_get_by_subject_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const X509_NAME *name, + X509_OBJECT *ret); +typedef int (*X509_LOOKUP_get_by_subject_ex_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const X509_NAME *name, + X509_OBJECT *ret, + OSSL_LIB_CTX *libctx, + const char *propq); +typedef int (*X509_LOOKUP_get_by_issuer_serial_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const X509_NAME *name, + const ASN1_INTEGER *serial, + X509_OBJECT *ret); +typedef int (*X509_LOOKUP_get_by_fingerprint_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const unsigned char *bytes, + int len, + X509_OBJECT *ret); +typedef int (*X509_LOOKUP_get_by_alias_fn)(X509_LOOKUP *ctx, + X509_LOOKUP_TYPE type, + const char *str, + int len, + X509_OBJECT *ret); + +X509_LOOKUP_METHOD *X509_LOOKUP_meth_new(const char *name); +void X509_LOOKUP_meth_free(X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_new_item(X509_LOOKUP_METHOD *method, + int (*new_item)(X509_LOOKUP *ctx)); +int (*X509_LOOKUP_meth_get_new_item(const X509_LOOKUP_METHOD *method))(X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_free(X509_LOOKUP_METHOD *method, + void (*free_fn)(X509_LOOKUP *ctx)); +void (*X509_LOOKUP_meth_get_free(const X509_LOOKUP_METHOD *method))(X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_init(X509_LOOKUP_METHOD *method, + int (*init)(X509_LOOKUP *ctx)); +int (*X509_LOOKUP_meth_get_init(const X509_LOOKUP_METHOD *method))(X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_shutdown(X509_LOOKUP_METHOD *method, + int (*shutdown)(X509_LOOKUP *ctx)); +int (*X509_LOOKUP_meth_get_shutdown(const X509_LOOKUP_METHOD *method))(X509_LOOKUP *ctx); + +int X509_LOOKUP_meth_set_ctrl(X509_LOOKUP_METHOD *method, + X509_LOOKUP_ctrl_fn ctrl_fn); +X509_LOOKUP_ctrl_fn X509_LOOKUP_meth_get_ctrl(const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_subject(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_subject_fn fn); +X509_LOOKUP_get_by_subject_fn X509_LOOKUP_meth_get_get_by_subject( + const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_issuer_serial(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_issuer_serial_fn fn); +X509_LOOKUP_get_by_issuer_serial_fn X509_LOOKUP_meth_get_get_by_issuer_serial( + const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_fingerprint(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_fingerprint_fn fn); +X509_LOOKUP_get_by_fingerprint_fn X509_LOOKUP_meth_get_get_by_fingerprint( + const X509_LOOKUP_METHOD *method); + +int X509_LOOKUP_meth_set_get_by_alias(X509_LOOKUP_METHOD *method, + X509_LOOKUP_get_by_alias_fn fn); +X509_LOOKUP_get_by_alias_fn X509_LOOKUP_meth_get_get_by_alias( + const X509_LOOKUP_METHOD *method); + +int X509_STORE_add_cert(X509_STORE *xs, X509 *x); +int X509_STORE_add_crl(X509_STORE *xs, X509_CRL *x); + +int X509_STORE_CTX_get_by_subject(const X509_STORE_CTX *vs, + X509_LOOKUP_TYPE type, + const X509_NAME *name, X509_OBJECT *ret); +X509_OBJECT *X509_STORE_CTX_get_obj_by_subject(X509_STORE_CTX *vs, + X509_LOOKUP_TYPE type, + const X509_NAME *name); + +int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, + long argl, char **ret); +int X509_LOOKUP_ctrl_ex(X509_LOOKUP *ctx, int cmd, const char *argc, long argl, + char **ret, OSSL_LIB_CTX *libctx, const char *propq); + +int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_file_ex(X509_LOOKUP *ctx, const char *file, int type, + OSSL_LIB_CTX *libctx, const char *propq); +int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type); +int X509_load_cert_crl_file_ex(X509_LOOKUP *ctx, const char *file, int type, + OSSL_LIB_CTX *libctx, const char *propq); + +X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method); +void X509_LOOKUP_free(X509_LOOKUP *ctx); +int X509_LOOKUP_init(X509_LOOKUP *ctx); +int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const X509_NAME *name, X509_OBJECT *ret); +int X509_LOOKUP_by_subject_ex(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const X509_NAME *name, X509_OBJECT *ret, + OSSL_LIB_CTX *libctx, const char *propq); +int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const X509_NAME *name, + const ASN1_INTEGER *serial, + X509_OBJECT *ret); +int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const unsigned char *bytes, int len, + X509_OBJECT *ret); +int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type, + const char *str, int len, X509_OBJECT *ret); +int X509_LOOKUP_set_method_data(X509_LOOKUP *ctx, void *data); +void *X509_LOOKUP_get_method_data(const X509_LOOKUP *ctx); +X509_STORE *X509_LOOKUP_get_store(const X509_LOOKUP *ctx); +int X509_LOOKUP_shutdown(X509_LOOKUP *ctx); + +int X509_STORE_load_file(X509_STORE *xs, const char *file); +int X509_STORE_load_path(X509_STORE *xs, const char *path); +int X509_STORE_load_store(X509_STORE *xs, const char *store); +int X509_STORE_load_locations(X509_STORE *s, const char *file, const char *dir); +int X509_STORE_set_default_paths(X509_STORE *xs); + +int X509_STORE_load_file_ex(X509_STORE *xs, const char *file, + OSSL_LIB_CTX *libctx, const char *propq); +int X509_STORE_load_store_ex(X509_STORE *xs, const char *store, + OSSL_LIB_CTX *libctx, const char *propq); +int X509_STORE_load_locations_ex(X509_STORE *xs, + const char *file, const char *dir, + OSSL_LIB_CTX *libctx, const char *propq); +int X509_STORE_set_default_paths_ex(X509_STORE *xs, + OSSL_LIB_CTX *libctx, const char *propq); + +#define X509_STORE_CTX_get_ex_new_index(l, p, newf, dupf, freef) \ + CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE_CTX, l, p, newf, dupf, freef) +int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data); +void *X509_STORE_CTX_get_ex_data(const X509_STORE_CTX *ctx, int idx); +int X509_STORE_CTX_get_error(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int s); +int X509_STORE_CTX_get_error_depth(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_error_depth(X509_STORE_CTX *ctx, int depth); +X509 *X509_STORE_CTX_get_current_cert(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_current_cert(X509_STORE_CTX *ctx, X509 *x); +X509 *X509_STORE_CTX_get0_current_issuer(const X509_STORE_CTX *ctx); +X509_CRL *X509_STORE_CTX_get0_current_crl(const X509_STORE_CTX *ctx); +X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(const X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get0_chain(const X509_STORE_CTX *ctx); +STACK_OF(X509) *X509_STORE_CTX_get1_chain(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set_cert(X509_STORE_CTX *ctx, X509 *target); +void X509_STORE_CTX_set0_rpk(X509_STORE_CTX *ctx, EVP_PKEY *target); +void X509_STORE_CTX_set0_verified_chain(X509_STORE_CTX *c, STACK_OF(X509) *sk); +void X509_STORE_CTX_set0_crls(X509_STORE_CTX *ctx, STACK_OF(X509_CRL) *sk); +int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose); +int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust); +int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose, + int purpose, int trust); +void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags); +void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags, + time_t t); +void X509_STORE_CTX_set_current_reasons(X509_STORE_CTX *ctx, + unsigned int current_reasons); + +X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(const X509_STORE_CTX *ctx); +int X509_STORE_CTX_get_explicit_policy(const X509_STORE_CTX *ctx); +int X509_STORE_CTX_get_num_untrusted(const X509_STORE_CTX *ctx); + +X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(const X509_STORE_CTX *ctx); +void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param); +int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name); + +/* + * Bridge opacity barrier between libcrypt and libssl, also needed to support + * offline testing in test/danetest.c + */ +void X509_STORE_CTX_set0_dane(X509_STORE_CTX *ctx, SSL_DANE *dane); +#define DANE_FLAG_NO_DANE_EE_NAMECHECKS (1L << 0) + +/* X509_VERIFY_PARAM functions */ + +X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void); +void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, + const X509_VERIFY_PARAM *from); +int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name); +int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param, + unsigned long flags); +unsigned long X509_VERIFY_PARAM_get_flags(const X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose); +int X509_VERIFY_PARAM_get_purpose(const X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust); +void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth); +void X509_VERIFY_PARAM_set_auth_level(X509_VERIFY_PARAM *param, int auth_level); +time_t X509_VERIFY_PARAM_get_time(const X509_VERIFY_PARAM *param); +void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t); +int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, + ASN1_OBJECT *policy); +int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, + STACK_OF(ASN1_OBJECT) *policies); + +int X509_VERIFY_PARAM_set_inh_flags(X509_VERIFY_PARAM *param, + uint32_t flags); +uint32_t X509_VERIFY_PARAM_get_inh_flags(const X509_VERIFY_PARAM *param); + +char *X509_VERIFY_PARAM_get0_host(X509_VERIFY_PARAM *param, int idx); +int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, + const char *name, size_t namelen); +void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param, + unsigned int flags); +unsigned int X509_VERIFY_PARAM_get_hostflags(const X509_VERIFY_PARAM *param); +char *X509_VERIFY_PARAM_get0_peername(const X509_VERIFY_PARAM *param); +void X509_VERIFY_PARAM_move_peername(X509_VERIFY_PARAM *, X509_VERIFY_PARAM *); +char *X509_VERIFY_PARAM_get0_email(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, + const char *email, size_t emaillen); +char *X509_VERIFY_PARAM_get1_ip_asc(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, + const unsigned char *ip, size_t iplen); +int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, + const char *ipasc); + +int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_get_auth_level(const X509_VERIFY_PARAM *param); +const char *X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param); + +int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param); +int X509_VERIFY_PARAM_get_count(void); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id); +const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name); +void X509_VERIFY_PARAM_table_cleanup(void); + +/* Non positive return values are errors */ +#define X509_PCY_TREE_FAILURE -2 /* Failure to satisfy explicit policy */ +#define X509_PCY_TREE_INVALID -1 /* Inconsistent or invalid extensions */ +#define X509_PCY_TREE_INTERNAL 0 /* Internal error, most likely malloc */ + +/* + * Positive return values form a bit mask, all but the first are internal to + * the library and don't appear in results from X509_policy_check(). + */ +#define X509_PCY_TREE_VALID 1 /* The policy tree is valid */ +#define X509_PCY_TREE_EMPTY 2 /* The policy tree is empty */ +#define X509_PCY_TREE_EXPLICIT 4 /* Explicit policy required */ + +int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy, + STACK_OF(X509) *certs, + STACK_OF(ASN1_OBJECT) *policy_oids, unsigned int flags); + +void X509_policy_tree_free(X509_POLICY_TREE *tree); + +int X509_policy_tree_level_count(const X509_POLICY_TREE *tree); +X509_POLICY_LEVEL *X509_policy_tree_get0_level(const X509_POLICY_TREE *tree, + int i); + +STACK_OF(X509_POLICY_NODE) +*X509_policy_tree_get0_policies(const X509_POLICY_TREE *tree); + +STACK_OF(X509_POLICY_NODE) +*X509_policy_tree_get0_user_policies(const X509_POLICY_TREE *tree); + +int X509_policy_level_node_count(X509_POLICY_LEVEL *level); + +X509_POLICY_NODE *X509_policy_level_get0_node(const X509_POLICY_LEVEL *level, + int i); + +const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node); + +STACK_OF(POLICYQUALINFO) +*X509_policy_node_get0_qualifiers(const X509_POLICY_NODE *node); +const X509_POLICY_NODE *X509_policy_node_get0_parent(const X509_POLICY_NODE *node); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/x509v3.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/x509v3.h new file mode 100644 index 000000000000..5dd402d2a913 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/openssl/x509v3.h @@ -0,0 +1,2013 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from include/openssl/x509v3.h.in + * + * Copyright 1999-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* clang-format off */ + +/* clang-format on */ + +#ifndef OPENSSL_X509V3_H +#define OPENSSL_X509V3_H +#pragma once + +#include +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define HEADER_X509V3_H +#endif + +#include +#include +#include +#include +#ifndef OPENSSL_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward reference */ +struct v3_ext_method; +struct v3_ext_ctx; + +/* Useful typedefs */ + +typedef void *(*X509V3_EXT_NEW)(void); +typedef void (*X509V3_EXT_FREE)(void *); +typedef void *(*X509V3_EXT_D2I)(void *, const unsigned char **, long); +typedef int (*X509V3_EXT_I2D)(const void *, unsigned char **); +typedef STACK_OF(CONF_VALUE) *(*X509V3_EXT_I2V)(const struct v3_ext_method *method, void *ext, + STACK_OF(CONF_VALUE) *extlist); +typedef void *(*X509V3_EXT_V2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, + STACK_OF(CONF_VALUE) *values); +typedef char *(*X509V3_EXT_I2S)(const struct v3_ext_method *method, + void *ext); +typedef void *(*X509V3_EXT_S2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); +typedef int (*X509V3_EXT_I2R)(const struct v3_ext_method *method, void *ext, + BIO *out, int indent); +typedef void *(*X509V3_EXT_R2I)(const struct v3_ext_method *method, + struct v3_ext_ctx *ctx, const char *str); + +/* V3 extension structure */ + +struct v3_ext_method { + int ext_nid; + int ext_flags; + /* If this is set the following four fields are ignored */ + ASN1_ITEM_EXP *it; + /* Old style ASN1 calls */ + X509V3_EXT_NEW ext_new; + X509V3_EXT_FREE ext_free; + X509V3_EXT_D2I d2i; + X509V3_EXT_I2D i2d; + /* The following pair is used for string extensions */ + X509V3_EXT_I2S i2s; + X509V3_EXT_S2I s2i; + /* The following pair is used for multi-valued extensions */ + X509V3_EXT_I2V i2v; + X509V3_EXT_V2I v2i; + /* The following are used for raw extensions */ + X509V3_EXT_I2R i2r; + X509V3_EXT_R2I r2i; + void *usr_data; /* Any extension specific data */ +}; + +typedef struct X509V3_CONF_METHOD_st { + char *(*get_string)(void *db, const char *section, const char *value); + STACK_OF(CONF_VALUE) *(*get_section)(void *db, const char *section); + void (*free_string)(void *db, char *string); + void (*free_section)(void *db, STACK_OF(CONF_VALUE) *section); +} X509V3_CONF_METHOD; + +/* Context specific info for producing X509 v3 extensions*/ +struct v3_ext_ctx { +#define X509V3_CTX_TEST 0x1 +#ifndef OPENSSL_NO_DEPRECATED_3_0 +#define CTX_TEST X509V3_CTX_TEST +#endif +#define X509V3_CTX_REPLACE 0x2 + int flags; + X509 *issuer_cert; + X509 *subject_cert; + X509_REQ *subject_req; + X509_CRL *crl; + X509V3_CONF_METHOD *db_meth; + void *db; + EVP_PKEY *issuer_pkey; + /* Maybe more here */ +}; + +typedef struct v3_ext_method X509V3_EXT_METHOD; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509V3_EXT_METHOD, X509V3_EXT_METHOD, X509V3_EXT_METHOD) +#define sk_X509V3_EXT_METHOD_num(sk) OPENSSL_sk_num(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_value(sk, idx) ((X509V3_EXT_METHOD *)OPENSSL_sk_value(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk), (idx))) +#define sk_X509V3_EXT_METHOD_new(cmp) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_new(ossl_check_X509V3_EXT_METHOD_compfunc_type(cmp))) +#define sk_X509V3_EXT_METHOD_new_null() ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_new_null()) +#define sk_X509V3_EXT_METHOD_new_reserve(cmp, n) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_new_reserve(ossl_check_X509V3_EXT_METHOD_compfunc_type(cmp), (n))) +#define sk_X509V3_EXT_METHOD_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509V3_EXT_METHOD_sk_type(sk), (n)) +#define sk_X509V3_EXT_METHOD_free(sk) OPENSSL_sk_free(ossl_check_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_zero(sk) OPENSSL_sk_zero(ossl_check_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_delete(sk, i) ((X509V3_EXT_METHOD *)OPENSSL_sk_delete(ossl_check_X509V3_EXT_METHOD_sk_type(sk), (i))) +#define sk_X509V3_EXT_METHOD_delete_ptr(sk, ptr) ((X509V3_EXT_METHOD *)OPENSSL_sk_delete_ptr(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr))) +#define sk_X509V3_EXT_METHOD_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr)) +#define sk_X509V3_EXT_METHOD_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr)) +#define sk_X509V3_EXT_METHOD_pop(sk) ((X509V3_EXT_METHOD *)OPENSSL_sk_pop(ossl_check_X509V3_EXT_METHOD_sk_type(sk))) +#define sk_X509V3_EXT_METHOD_shift(sk) ((X509V3_EXT_METHOD *)OPENSSL_sk_shift(ossl_check_X509V3_EXT_METHOD_sk_type(sk))) +#define sk_X509V3_EXT_METHOD_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509V3_EXT_METHOD_sk_type(sk),ossl_check_X509V3_EXT_METHOD_freefunc_type(freefunc)) +#define sk_X509V3_EXT_METHOD_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr), (idx)) +#define sk_X509V3_EXT_METHOD_set(sk, idx, ptr) ((X509V3_EXT_METHOD *)OPENSSL_sk_set(ossl_check_X509V3_EXT_METHOD_sk_type(sk), (idx), ossl_check_X509V3_EXT_METHOD_type(ptr))) +#define sk_X509V3_EXT_METHOD_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr)) +#define sk_X509V3_EXT_METHOD_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr)) +#define sk_X509V3_EXT_METHOD_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_type(ptr), pnum) +#define sk_X509V3_EXT_METHOD_sort(sk) OPENSSL_sk_sort(ossl_check_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk)) +#define sk_X509V3_EXT_METHOD_dup(sk) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_dup(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk))) +#define sk_X509V3_EXT_METHOD_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509V3_EXT_METHOD) *)OPENSSL_sk_deep_copy(ossl_check_const_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_copyfunc_type(copyfunc), ossl_check_X509V3_EXT_METHOD_freefunc_type(freefunc))) +#define sk_X509V3_EXT_METHOD_set_cmp_func(sk, cmp) ((sk_X509V3_EXT_METHOD_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509V3_EXT_METHOD_sk_type(sk), ossl_check_X509V3_EXT_METHOD_compfunc_type(cmp))) + +/* clang-format on */ + +/* ext_flags values */ +#define X509V3_EXT_DYNAMIC 0x1 +#define X509V3_EXT_CTX_DEP 0x2 +#define X509V3_EXT_MULTILINE 0x4 + +typedef BIT_STRING_BITNAME ENUMERATED_NAMES; + +typedef struct BASIC_CONSTRAINTS_st { + int ca; + ASN1_INTEGER *pathlen; +} BASIC_CONSTRAINTS; + +typedef struct OSSL_BASIC_ATTR_CONSTRAINTS_st { + int authority; + ASN1_INTEGER *pathlen; +} OSSL_BASIC_ATTR_CONSTRAINTS; + +typedef struct PKEY_USAGE_PERIOD_st { + ASN1_GENERALIZEDTIME *notBefore; + ASN1_GENERALIZEDTIME *notAfter; +} PKEY_USAGE_PERIOD; + +typedef struct otherName_st { + ASN1_OBJECT *type_id; + ASN1_TYPE *value; +} OTHERNAME; + +typedef struct EDIPartyName_st { + ASN1_STRING *nameAssigner; + ASN1_STRING *partyName; +} EDIPARTYNAME; + +typedef struct GENERAL_NAME_st { +#define GEN_OTHERNAME 0 +#define GEN_EMAIL 1 +#define GEN_DNS 2 +#define GEN_X400 3 +#define GEN_DIRNAME 4 +#define GEN_EDIPARTY 5 +#define GEN_URI 6 +#define GEN_IPADD 7 +#define GEN_RID 8 + int type; + union { + char *ptr; + OTHERNAME *otherName; /* otherName */ + ASN1_IA5STRING *rfc822Name; + ASN1_IA5STRING *dNSName; + ASN1_STRING *x400Address; + X509_NAME *directoryName; + EDIPARTYNAME *ediPartyName; + ASN1_IA5STRING *uniformResourceIdentifier; + ASN1_OCTET_STRING *iPAddress; + ASN1_OBJECT *registeredID; + /* Old names */ + ASN1_OCTET_STRING *ip; /* iPAddress */ + X509_NAME *dirn; /* dirn */ + ASN1_IA5STRING *ia5; /* rfc822Name, dNSName, + * uniformResourceIdentifier */ + ASN1_OBJECT *rid; /* registeredID */ + ASN1_TYPE *other; /* x400Address */ + } d; +} GENERAL_NAME; + +typedef struct ACCESS_DESCRIPTION_st { + ASN1_OBJECT *method; + GENERAL_NAME *location; +} ACCESS_DESCRIPTION; + +int GENERAL_NAME_set1_X509_NAME(GENERAL_NAME **tgt, const X509_NAME *src); + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ACCESS_DESCRIPTION, ACCESS_DESCRIPTION, ACCESS_DESCRIPTION) +#define sk_ACCESS_DESCRIPTION_num(sk) OPENSSL_sk_num(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_value(sk, idx) ((ACCESS_DESCRIPTION *)OPENSSL_sk_value(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk), (idx))) +#define sk_ACCESS_DESCRIPTION_new(cmp) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_new(ossl_check_ACCESS_DESCRIPTION_compfunc_type(cmp))) +#define sk_ACCESS_DESCRIPTION_new_null() ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_new_null()) +#define sk_ACCESS_DESCRIPTION_new_reserve(cmp, n) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_new_reserve(ossl_check_ACCESS_DESCRIPTION_compfunc_type(cmp), (n))) +#define sk_ACCESS_DESCRIPTION_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), (n)) +#define sk_ACCESS_DESCRIPTION_free(sk) OPENSSL_sk_free(ossl_check_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_zero(sk) OPENSSL_sk_zero(ossl_check_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_delete(sk, i) ((ACCESS_DESCRIPTION *)OPENSSL_sk_delete(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), (i))) +#define sk_ACCESS_DESCRIPTION_delete_ptr(sk, ptr) ((ACCESS_DESCRIPTION *)OPENSSL_sk_delete_ptr(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr))) +#define sk_ACCESS_DESCRIPTION_push(sk, ptr) OPENSSL_sk_push(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr)) +#define sk_ACCESS_DESCRIPTION_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr)) +#define sk_ACCESS_DESCRIPTION_pop(sk) ((ACCESS_DESCRIPTION *)OPENSSL_sk_pop(ossl_check_ACCESS_DESCRIPTION_sk_type(sk))) +#define sk_ACCESS_DESCRIPTION_shift(sk) ((ACCESS_DESCRIPTION *)OPENSSL_sk_shift(ossl_check_ACCESS_DESCRIPTION_sk_type(sk))) +#define sk_ACCESS_DESCRIPTION_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ACCESS_DESCRIPTION_sk_type(sk),ossl_check_ACCESS_DESCRIPTION_freefunc_type(freefunc)) +#define sk_ACCESS_DESCRIPTION_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr), (idx)) +#define sk_ACCESS_DESCRIPTION_set(sk, idx, ptr) ((ACCESS_DESCRIPTION *)OPENSSL_sk_set(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), (idx), ossl_check_ACCESS_DESCRIPTION_type(ptr))) +#define sk_ACCESS_DESCRIPTION_find(sk, ptr) OPENSSL_sk_find(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr)) +#define sk_ACCESS_DESCRIPTION_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr)) +#define sk_ACCESS_DESCRIPTION_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_type(ptr), pnum) +#define sk_ACCESS_DESCRIPTION_sort(sk) OPENSSL_sk_sort(ossl_check_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk)) +#define sk_ACCESS_DESCRIPTION_dup(sk) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_dup(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk))) +#define sk_ACCESS_DESCRIPTION_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ACCESS_DESCRIPTION) *)OPENSSL_sk_deep_copy(ossl_check_const_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_copyfunc_type(copyfunc), ossl_check_ACCESS_DESCRIPTION_freefunc_type(freefunc))) +#define sk_ACCESS_DESCRIPTION_set_cmp_func(sk, cmp) ((sk_ACCESS_DESCRIPTION_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ACCESS_DESCRIPTION_sk_type(sk), ossl_check_ACCESS_DESCRIPTION_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(GENERAL_NAME, GENERAL_NAME, GENERAL_NAME) +#define sk_GENERAL_NAME_num(sk) OPENSSL_sk_num(ossl_check_const_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_value(sk, idx) ((GENERAL_NAME *)OPENSSL_sk_value(ossl_check_const_GENERAL_NAME_sk_type(sk), (idx))) +#define sk_GENERAL_NAME_new(cmp) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_new(ossl_check_GENERAL_NAME_compfunc_type(cmp))) +#define sk_GENERAL_NAME_new_null() ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_new_null()) +#define sk_GENERAL_NAME_new_reserve(cmp, n) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_new_reserve(ossl_check_GENERAL_NAME_compfunc_type(cmp), (n))) +#define sk_GENERAL_NAME_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_GENERAL_NAME_sk_type(sk), (n)) +#define sk_GENERAL_NAME_free(sk) OPENSSL_sk_free(ossl_check_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_zero(sk) OPENSSL_sk_zero(ossl_check_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_delete(sk, i) ((GENERAL_NAME *)OPENSSL_sk_delete(ossl_check_GENERAL_NAME_sk_type(sk), (i))) +#define sk_GENERAL_NAME_delete_ptr(sk, ptr) ((GENERAL_NAME *)OPENSSL_sk_delete_ptr(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr))) +#define sk_GENERAL_NAME_push(sk, ptr) OPENSSL_sk_push(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr)) +#define sk_GENERAL_NAME_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr)) +#define sk_GENERAL_NAME_pop(sk) ((GENERAL_NAME *)OPENSSL_sk_pop(ossl_check_GENERAL_NAME_sk_type(sk))) +#define sk_GENERAL_NAME_shift(sk) ((GENERAL_NAME *)OPENSSL_sk_shift(ossl_check_GENERAL_NAME_sk_type(sk))) +#define sk_GENERAL_NAME_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_GENERAL_NAME_sk_type(sk),ossl_check_GENERAL_NAME_freefunc_type(freefunc)) +#define sk_GENERAL_NAME_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr), (idx)) +#define sk_GENERAL_NAME_set(sk, idx, ptr) ((GENERAL_NAME *)OPENSSL_sk_set(ossl_check_GENERAL_NAME_sk_type(sk), (idx), ossl_check_GENERAL_NAME_type(ptr))) +#define sk_GENERAL_NAME_find(sk, ptr) OPENSSL_sk_find(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr)) +#define sk_GENERAL_NAME_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr)) +#define sk_GENERAL_NAME_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_type(ptr), pnum) +#define sk_GENERAL_NAME_sort(sk) OPENSSL_sk_sort(ossl_check_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_GENERAL_NAME_sk_type(sk)) +#define sk_GENERAL_NAME_dup(sk) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_dup(ossl_check_const_GENERAL_NAME_sk_type(sk))) +#define sk_GENERAL_NAME_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(GENERAL_NAME) *)OPENSSL_sk_deep_copy(ossl_check_const_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_copyfunc_type(copyfunc), ossl_check_GENERAL_NAME_freefunc_type(freefunc))) +#define sk_GENERAL_NAME_set_cmp_func(sk, cmp) ((sk_GENERAL_NAME_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_GENERAL_NAME_sk_type(sk), ossl_check_GENERAL_NAME_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; +typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE; +typedef STACK_OF(ASN1_INTEGER) TLS_FEATURE; +typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(GENERAL_NAMES, GENERAL_NAMES, GENERAL_NAMES) +#define sk_GENERAL_NAMES_num(sk) OPENSSL_sk_num(ossl_check_const_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_value(sk, idx) ((GENERAL_NAMES *)OPENSSL_sk_value(ossl_check_const_GENERAL_NAMES_sk_type(sk), (idx))) +#define sk_GENERAL_NAMES_new(cmp) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_new(ossl_check_GENERAL_NAMES_compfunc_type(cmp))) +#define sk_GENERAL_NAMES_new_null() ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_new_null()) +#define sk_GENERAL_NAMES_new_reserve(cmp, n) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_new_reserve(ossl_check_GENERAL_NAMES_compfunc_type(cmp), (n))) +#define sk_GENERAL_NAMES_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_GENERAL_NAMES_sk_type(sk), (n)) +#define sk_GENERAL_NAMES_free(sk) OPENSSL_sk_free(ossl_check_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_zero(sk) OPENSSL_sk_zero(ossl_check_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_delete(sk, i) ((GENERAL_NAMES *)OPENSSL_sk_delete(ossl_check_GENERAL_NAMES_sk_type(sk), (i))) +#define sk_GENERAL_NAMES_delete_ptr(sk, ptr) ((GENERAL_NAMES *)OPENSSL_sk_delete_ptr(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr))) +#define sk_GENERAL_NAMES_push(sk, ptr) OPENSSL_sk_push(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr)) +#define sk_GENERAL_NAMES_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr)) +#define sk_GENERAL_NAMES_pop(sk) ((GENERAL_NAMES *)OPENSSL_sk_pop(ossl_check_GENERAL_NAMES_sk_type(sk))) +#define sk_GENERAL_NAMES_shift(sk) ((GENERAL_NAMES *)OPENSSL_sk_shift(ossl_check_GENERAL_NAMES_sk_type(sk))) +#define sk_GENERAL_NAMES_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_GENERAL_NAMES_sk_type(sk),ossl_check_GENERAL_NAMES_freefunc_type(freefunc)) +#define sk_GENERAL_NAMES_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr), (idx)) +#define sk_GENERAL_NAMES_set(sk, idx, ptr) ((GENERAL_NAMES *)OPENSSL_sk_set(ossl_check_GENERAL_NAMES_sk_type(sk), (idx), ossl_check_GENERAL_NAMES_type(ptr))) +#define sk_GENERAL_NAMES_find(sk, ptr) OPENSSL_sk_find(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr)) +#define sk_GENERAL_NAMES_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr)) +#define sk_GENERAL_NAMES_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_type(ptr), pnum) +#define sk_GENERAL_NAMES_sort(sk) OPENSSL_sk_sort(ossl_check_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_GENERAL_NAMES_sk_type(sk)) +#define sk_GENERAL_NAMES_dup(sk) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_dup(ossl_check_const_GENERAL_NAMES_sk_type(sk))) +#define sk_GENERAL_NAMES_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(GENERAL_NAMES) *)OPENSSL_sk_deep_copy(ossl_check_const_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_copyfunc_type(copyfunc), ossl_check_GENERAL_NAMES_freefunc_type(freefunc))) +#define sk_GENERAL_NAMES_set_cmp_func(sk, cmp) ((sk_GENERAL_NAMES_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_GENERAL_NAMES_sk_type(sk), ossl_check_GENERAL_NAMES_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct DIST_POINT_NAME_st { + int type; + union { + GENERAL_NAMES *fullname; + STACK_OF(X509_NAME_ENTRY) *relativename; + } name; + /* If relativename then this contains the full distribution point name */ + X509_NAME *dpname; +} DIST_POINT_NAME; +DECLARE_ASN1_DUP_FUNCTION(DIST_POINT_NAME) +/* All existing reasons */ +#define CRLDP_ALL_REASONS 0x807f + +#define CRL_REASON_NONE -1 +#define CRL_REASON_UNSPECIFIED 0 +#define CRL_REASON_KEY_COMPROMISE 1 +#define CRL_REASON_CA_COMPROMISE 2 +#define CRL_REASON_AFFILIATION_CHANGED 3 +#define CRL_REASON_SUPERSEDED 4 +#define CRL_REASON_CESSATION_OF_OPERATION 5 +#define CRL_REASON_CERTIFICATE_HOLD 6 +#define CRL_REASON_REMOVE_FROM_CRL 8 +#define CRL_REASON_PRIVILEGE_WITHDRAWN 9 +#define CRL_REASON_AA_COMPROMISE 10 + +struct DIST_POINT_st { + DIST_POINT_NAME *distpoint; + ASN1_BIT_STRING *reasons; + GENERAL_NAMES *CRLissuer; + int dp_reasons; +}; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(DIST_POINT, DIST_POINT, DIST_POINT) +#define sk_DIST_POINT_num(sk) OPENSSL_sk_num(ossl_check_const_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_value(sk, idx) ((DIST_POINT *)OPENSSL_sk_value(ossl_check_const_DIST_POINT_sk_type(sk), (idx))) +#define sk_DIST_POINT_new(cmp) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_new(ossl_check_DIST_POINT_compfunc_type(cmp))) +#define sk_DIST_POINT_new_null() ((STACK_OF(DIST_POINT) *)OPENSSL_sk_new_null()) +#define sk_DIST_POINT_new_reserve(cmp, n) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_new_reserve(ossl_check_DIST_POINT_compfunc_type(cmp), (n))) +#define sk_DIST_POINT_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_DIST_POINT_sk_type(sk), (n)) +#define sk_DIST_POINT_free(sk) OPENSSL_sk_free(ossl_check_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_zero(sk) OPENSSL_sk_zero(ossl_check_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_delete(sk, i) ((DIST_POINT *)OPENSSL_sk_delete(ossl_check_DIST_POINT_sk_type(sk), (i))) +#define sk_DIST_POINT_delete_ptr(sk, ptr) ((DIST_POINT *)OPENSSL_sk_delete_ptr(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr))) +#define sk_DIST_POINT_push(sk, ptr) OPENSSL_sk_push(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr)) +#define sk_DIST_POINT_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr)) +#define sk_DIST_POINT_pop(sk) ((DIST_POINT *)OPENSSL_sk_pop(ossl_check_DIST_POINT_sk_type(sk))) +#define sk_DIST_POINT_shift(sk) ((DIST_POINT *)OPENSSL_sk_shift(ossl_check_DIST_POINT_sk_type(sk))) +#define sk_DIST_POINT_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_DIST_POINT_sk_type(sk),ossl_check_DIST_POINT_freefunc_type(freefunc)) +#define sk_DIST_POINT_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr), (idx)) +#define sk_DIST_POINT_set(sk, idx, ptr) ((DIST_POINT *)OPENSSL_sk_set(ossl_check_DIST_POINT_sk_type(sk), (idx), ossl_check_DIST_POINT_type(ptr))) +#define sk_DIST_POINT_find(sk, ptr) OPENSSL_sk_find(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr)) +#define sk_DIST_POINT_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr)) +#define sk_DIST_POINT_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_type(ptr), pnum) +#define sk_DIST_POINT_sort(sk) OPENSSL_sk_sort(ossl_check_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_DIST_POINT_sk_type(sk)) +#define sk_DIST_POINT_dup(sk) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_dup(ossl_check_const_DIST_POINT_sk_type(sk))) +#define sk_DIST_POINT_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(DIST_POINT) *)OPENSSL_sk_deep_copy(ossl_check_const_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_copyfunc_type(copyfunc), ossl_check_DIST_POINT_freefunc_type(freefunc))) +#define sk_DIST_POINT_set_cmp_func(sk, cmp) ((sk_DIST_POINT_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_DIST_POINT_sk_type(sk), ossl_check_DIST_POINT_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS; + +struct AUTHORITY_KEYID_st { + ASN1_OCTET_STRING *keyid; + GENERAL_NAMES *issuer; + ASN1_INTEGER *serial; +}; + +/* Strong extranet structures */ + +typedef struct SXNET_ID_st { + ASN1_INTEGER *zone; + ASN1_OCTET_STRING *user; +} SXNETID; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(SXNETID, SXNETID, SXNETID) +#define sk_SXNETID_num(sk) OPENSSL_sk_num(ossl_check_const_SXNETID_sk_type(sk)) +#define sk_SXNETID_value(sk, idx) ((SXNETID *)OPENSSL_sk_value(ossl_check_const_SXNETID_sk_type(sk), (idx))) +#define sk_SXNETID_new(cmp) ((STACK_OF(SXNETID) *)OPENSSL_sk_new(ossl_check_SXNETID_compfunc_type(cmp))) +#define sk_SXNETID_new_null() ((STACK_OF(SXNETID) *)OPENSSL_sk_new_null()) +#define sk_SXNETID_new_reserve(cmp, n) ((STACK_OF(SXNETID) *)OPENSSL_sk_new_reserve(ossl_check_SXNETID_compfunc_type(cmp), (n))) +#define sk_SXNETID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_SXNETID_sk_type(sk), (n)) +#define sk_SXNETID_free(sk) OPENSSL_sk_free(ossl_check_SXNETID_sk_type(sk)) +#define sk_SXNETID_zero(sk) OPENSSL_sk_zero(ossl_check_SXNETID_sk_type(sk)) +#define sk_SXNETID_delete(sk, i) ((SXNETID *)OPENSSL_sk_delete(ossl_check_SXNETID_sk_type(sk), (i))) +#define sk_SXNETID_delete_ptr(sk, ptr) ((SXNETID *)OPENSSL_sk_delete_ptr(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr))) +#define sk_SXNETID_push(sk, ptr) OPENSSL_sk_push(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr)) +#define sk_SXNETID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr)) +#define sk_SXNETID_pop(sk) ((SXNETID *)OPENSSL_sk_pop(ossl_check_SXNETID_sk_type(sk))) +#define sk_SXNETID_shift(sk) ((SXNETID *)OPENSSL_sk_shift(ossl_check_SXNETID_sk_type(sk))) +#define sk_SXNETID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_SXNETID_sk_type(sk),ossl_check_SXNETID_freefunc_type(freefunc)) +#define sk_SXNETID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr), (idx)) +#define sk_SXNETID_set(sk, idx, ptr) ((SXNETID *)OPENSSL_sk_set(ossl_check_SXNETID_sk_type(sk), (idx), ossl_check_SXNETID_type(ptr))) +#define sk_SXNETID_find(sk, ptr) OPENSSL_sk_find(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr)) +#define sk_SXNETID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr)) +#define sk_SXNETID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_type(ptr), pnum) +#define sk_SXNETID_sort(sk) OPENSSL_sk_sort(ossl_check_SXNETID_sk_type(sk)) +#define sk_SXNETID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_SXNETID_sk_type(sk)) +#define sk_SXNETID_dup(sk) ((STACK_OF(SXNETID) *)OPENSSL_sk_dup(ossl_check_const_SXNETID_sk_type(sk))) +#define sk_SXNETID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(SXNETID) *)OPENSSL_sk_deep_copy(ossl_check_const_SXNETID_sk_type(sk), ossl_check_SXNETID_copyfunc_type(copyfunc), ossl_check_SXNETID_freefunc_type(freefunc))) +#define sk_SXNETID_set_cmp_func(sk, cmp) ((sk_SXNETID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_SXNETID_sk_type(sk), ossl_check_SXNETID_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct SXNET_st { + ASN1_INTEGER *version; + STACK_OF(SXNETID) *ids; +} SXNET; + +typedef struct ISSUER_SIGN_TOOL_st { + ASN1_UTF8STRING *signTool; + ASN1_UTF8STRING *cATool; + ASN1_UTF8STRING *signToolCert; + ASN1_UTF8STRING *cAToolCert; +} ISSUER_SIGN_TOOL; + +typedef struct NOTICEREF_st { + ASN1_STRING *organization; + STACK_OF(ASN1_INTEGER) *noticenos; +} NOTICEREF; + +typedef struct USERNOTICE_st { + NOTICEREF *noticeref; + ASN1_STRING *exptext; +} USERNOTICE; + +typedef struct POLICYQUALINFO_st { + ASN1_OBJECT *pqualid; + union { + ASN1_IA5STRING *cpsuri; + USERNOTICE *usernotice; + ASN1_TYPE *other; + } d; +} POLICYQUALINFO; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(POLICYQUALINFO, POLICYQUALINFO, POLICYQUALINFO) +#define sk_POLICYQUALINFO_num(sk) OPENSSL_sk_num(ossl_check_const_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_value(sk, idx) ((POLICYQUALINFO *)OPENSSL_sk_value(ossl_check_const_POLICYQUALINFO_sk_type(sk), (idx))) +#define sk_POLICYQUALINFO_new(cmp) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_new(ossl_check_POLICYQUALINFO_compfunc_type(cmp))) +#define sk_POLICYQUALINFO_new_null() ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_new_null()) +#define sk_POLICYQUALINFO_new_reserve(cmp, n) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_new_reserve(ossl_check_POLICYQUALINFO_compfunc_type(cmp), (n))) +#define sk_POLICYQUALINFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_POLICYQUALINFO_sk_type(sk), (n)) +#define sk_POLICYQUALINFO_free(sk) OPENSSL_sk_free(ossl_check_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_zero(sk) OPENSSL_sk_zero(ossl_check_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_delete(sk, i) ((POLICYQUALINFO *)OPENSSL_sk_delete(ossl_check_POLICYQUALINFO_sk_type(sk), (i))) +#define sk_POLICYQUALINFO_delete_ptr(sk, ptr) ((POLICYQUALINFO *)OPENSSL_sk_delete_ptr(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr))) +#define sk_POLICYQUALINFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr)) +#define sk_POLICYQUALINFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr)) +#define sk_POLICYQUALINFO_pop(sk) ((POLICYQUALINFO *)OPENSSL_sk_pop(ossl_check_POLICYQUALINFO_sk_type(sk))) +#define sk_POLICYQUALINFO_shift(sk) ((POLICYQUALINFO *)OPENSSL_sk_shift(ossl_check_POLICYQUALINFO_sk_type(sk))) +#define sk_POLICYQUALINFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_POLICYQUALINFO_sk_type(sk),ossl_check_POLICYQUALINFO_freefunc_type(freefunc)) +#define sk_POLICYQUALINFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr), (idx)) +#define sk_POLICYQUALINFO_set(sk, idx, ptr) ((POLICYQUALINFO *)OPENSSL_sk_set(ossl_check_POLICYQUALINFO_sk_type(sk), (idx), ossl_check_POLICYQUALINFO_type(ptr))) +#define sk_POLICYQUALINFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr)) +#define sk_POLICYQUALINFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr)) +#define sk_POLICYQUALINFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_type(ptr), pnum) +#define sk_POLICYQUALINFO_sort(sk) OPENSSL_sk_sort(ossl_check_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_POLICYQUALINFO_sk_type(sk)) +#define sk_POLICYQUALINFO_dup(sk) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_dup(ossl_check_const_POLICYQUALINFO_sk_type(sk))) +#define sk_POLICYQUALINFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(POLICYQUALINFO) *)OPENSSL_sk_deep_copy(ossl_check_const_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_copyfunc_type(copyfunc), ossl_check_POLICYQUALINFO_freefunc_type(freefunc))) +#define sk_POLICYQUALINFO_set_cmp_func(sk, cmp) ((sk_POLICYQUALINFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_POLICYQUALINFO_sk_type(sk), ossl_check_POLICYQUALINFO_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct POLICYINFO_st { + ASN1_OBJECT *policyid; + STACK_OF(POLICYQUALINFO) *qualifiers; +} POLICYINFO; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(POLICYINFO, POLICYINFO, POLICYINFO) +#define sk_POLICYINFO_num(sk) OPENSSL_sk_num(ossl_check_const_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_value(sk, idx) ((POLICYINFO *)OPENSSL_sk_value(ossl_check_const_POLICYINFO_sk_type(sk), (idx))) +#define sk_POLICYINFO_new(cmp) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_new(ossl_check_POLICYINFO_compfunc_type(cmp))) +#define sk_POLICYINFO_new_null() ((STACK_OF(POLICYINFO) *)OPENSSL_sk_new_null()) +#define sk_POLICYINFO_new_reserve(cmp, n) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_new_reserve(ossl_check_POLICYINFO_compfunc_type(cmp), (n))) +#define sk_POLICYINFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_POLICYINFO_sk_type(sk), (n)) +#define sk_POLICYINFO_free(sk) OPENSSL_sk_free(ossl_check_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_zero(sk) OPENSSL_sk_zero(ossl_check_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_delete(sk, i) ((POLICYINFO *)OPENSSL_sk_delete(ossl_check_POLICYINFO_sk_type(sk), (i))) +#define sk_POLICYINFO_delete_ptr(sk, ptr) ((POLICYINFO *)OPENSSL_sk_delete_ptr(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr))) +#define sk_POLICYINFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr)) +#define sk_POLICYINFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr)) +#define sk_POLICYINFO_pop(sk) ((POLICYINFO *)OPENSSL_sk_pop(ossl_check_POLICYINFO_sk_type(sk))) +#define sk_POLICYINFO_shift(sk) ((POLICYINFO *)OPENSSL_sk_shift(ossl_check_POLICYINFO_sk_type(sk))) +#define sk_POLICYINFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_POLICYINFO_sk_type(sk),ossl_check_POLICYINFO_freefunc_type(freefunc)) +#define sk_POLICYINFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr), (idx)) +#define sk_POLICYINFO_set(sk, idx, ptr) ((POLICYINFO *)OPENSSL_sk_set(ossl_check_POLICYINFO_sk_type(sk), (idx), ossl_check_POLICYINFO_type(ptr))) +#define sk_POLICYINFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr)) +#define sk_POLICYINFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr)) +#define sk_POLICYINFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_type(ptr), pnum) +#define sk_POLICYINFO_sort(sk) OPENSSL_sk_sort(ossl_check_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_POLICYINFO_sk_type(sk)) +#define sk_POLICYINFO_dup(sk) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_dup(ossl_check_const_POLICYINFO_sk_type(sk))) +#define sk_POLICYINFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(POLICYINFO) *)OPENSSL_sk_deep_copy(ossl_check_const_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_copyfunc_type(copyfunc), ossl_check_POLICYINFO_freefunc_type(freefunc))) +#define sk_POLICYINFO_set_cmp_func(sk, cmp) ((sk_POLICYINFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_POLICYINFO_sk_type(sk), ossl_check_POLICYINFO_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES; + +typedef struct POLICY_MAPPING_st { + ASN1_OBJECT *issuerDomainPolicy; + ASN1_OBJECT *subjectDomainPolicy; +} POLICY_MAPPING; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(POLICY_MAPPING, POLICY_MAPPING, POLICY_MAPPING) +#define sk_POLICY_MAPPING_num(sk) OPENSSL_sk_num(ossl_check_const_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_value(sk, idx) ((POLICY_MAPPING *)OPENSSL_sk_value(ossl_check_const_POLICY_MAPPING_sk_type(sk), (idx))) +#define sk_POLICY_MAPPING_new(cmp) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_new(ossl_check_POLICY_MAPPING_compfunc_type(cmp))) +#define sk_POLICY_MAPPING_new_null() ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_new_null()) +#define sk_POLICY_MAPPING_new_reserve(cmp, n) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_new_reserve(ossl_check_POLICY_MAPPING_compfunc_type(cmp), (n))) +#define sk_POLICY_MAPPING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_POLICY_MAPPING_sk_type(sk), (n)) +#define sk_POLICY_MAPPING_free(sk) OPENSSL_sk_free(ossl_check_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_zero(sk) OPENSSL_sk_zero(ossl_check_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_delete(sk, i) ((POLICY_MAPPING *)OPENSSL_sk_delete(ossl_check_POLICY_MAPPING_sk_type(sk), (i))) +#define sk_POLICY_MAPPING_delete_ptr(sk, ptr) ((POLICY_MAPPING *)OPENSSL_sk_delete_ptr(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr))) +#define sk_POLICY_MAPPING_push(sk, ptr) OPENSSL_sk_push(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr)) +#define sk_POLICY_MAPPING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr)) +#define sk_POLICY_MAPPING_pop(sk) ((POLICY_MAPPING *)OPENSSL_sk_pop(ossl_check_POLICY_MAPPING_sk_type(sk))) +#define sk_POLICY_MAPPING_shift(sk) ((POLICY_MAPPING *)OPENSSL_sk_shift(ossl_check_POLICY_MAPPING_sk_type(sk))) +#define sk_POLICY_MAPPING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_POLICY_MAPPING_sk_type(sk),ossl_check_POLICY_MAPPING_freefunc_type(freefunc)) +#define sk_POLICY_MAPPING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr), (idx)) +#define sk_POLICY_MAPPING_set(sk, idx, ptr) ((POLICY_MAPPING *)OPENSSL_sk_set(ossl_check_POLICY_MAPPING_sk_type(sk), (idx), ossl_check_POLICY_MAPPING_type(ptr))) +#define sk_POLICY_MAPPING_find(sk, ptr) OPENSSL_sk_find(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr)) +#define sk_POLICY_MAPPING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr)) +#define sk_POLICY_MAPPING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_type(ptr), pnum) +#define sk_POLICY_MAPPING_sort(sk) OPENSSL_sk_sort(ossl_check_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_POLICY_MAPPING_sk_type(sk)) +#define sk_POLICY_MAPPING_dup(sk) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_dup(ossl_check_const_POLICY_MAPPING_sk_type(sk))) +#define sk_POLICY_MAPPING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(POLICY_MAPPING) *)OPENSSL_sk_deep_copy(ossl_check_const_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_copyfunc_type(copyfunc), ossl_check_POLICY_MAPPING_freefunc_type(freefunc))) +#define sk_POLICY_MAPPING_set_cmp_func(sk, cmp) ((sk_POLICY_MAPPING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_POLICY_MAPPING_sk_type(sk), ossl_check_POLICY_MAPPING_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(POLICY_MAPPING) POLICY_MAPPINGS; + +typedef struct GENERAL_SUBTREE_st { + GENERAL_NAME *base; + ASN1_INTEGER *minimum; + ASN1_INTEGER *maximum; +} GENERAL_SUBTREE; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(GENERAL_SUBTREE, GENERAL_SUBTREE, GENERAL_SUBTREE) +#define sk_GENERAL_SUBTREE_num(sk) OPENSSL_sk_num(ossl_check_const_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_value(sk, idx) ((GENERAL_SUBTREE *)OPENSSL_sk_value(ossl_check_const_GENERAL_SUBTREE_sk_type(sk), (idx))) +#define sk_GENERAL_SUBTREE_new(cmp) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_new(ossl_check_GENERAL_SUBTREE_compfunc_type(cmp))) +#define sk_GENERAL_SUBTREE_new_null() ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_new_null()) +#define sk_GENERAL_SUBTREE_new_reserve(cmp, n) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_new_reserve(ossl_check_GENERAL_SUBTREE_compfunc_type(cmp), (n))) +#define sk_GENERAL_SUBTREE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_GENERAL_SUBTREE_sk_type(sk), (n)) +#define sk_GENERAL_SUBTREE_free(sk) OPENSSL_sk_free(ossl_check_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_zero(sk) OPENSSL_sk_zero(ossl_check_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_delete(sk, i) ((GENERAL_SUBTREE *)OPENSSL_sk_delete(ossl_check_GENERAL_SUBTREE_sk_type(sk), (i))) +#define sk_GENERAL_SUBTREE_delete_ptr(sk, ptr) ((GENERAL_SUBTREE *)OPENSSL_sk_delete_ptr(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr))) +#define sk_GENERAL_SUBTREE_push(sk, ptr) OPENSSL_sk_push(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr)) +#define sk_GENERAL_SUBTREE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr)) +#define sk_GENERAL_SUBTREE_pop(sk) ((GENERAL_SUBTREE *)OPENSSL_sk_pop(ossl_check_GENERAL_SUBTREE_sk_type(sk))) +#define sk_GENERAL_SUBTREE_shift(sk) ((GENERAL_SUBTREE *)OPENSSL_sk_shift(ossl_check_GENERAL_SUBTREE_sk_type(sk))) +#define sk_GENERAL_SUBTREE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_GENERAL_SUBTREE_sk_type(sk),ossl_check_GENERAL_SUBTREE_freefunc_type(freefunc)) +#define sk_GENERAL_SUBTREE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr), (idx)) +#define sk_GENERAL_SUBTREE_set(sk, idx, ptr) ((GENERAL_SUBTREE *)OPENSSL_sk_set(ossl_check_GENERAL_SUBTREE_sk_type(sk), (idx), ossl_check_GENERAL_SUBTREE_type(ptr))) +#define sk_GENERAL_SUBTREE_find(sk, ptr) OPENSSL_sk_find(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr)) +#define sk_GENERAL_SUBTREE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr)) +#define sk_GENERAL_SUBTREE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_type(ptr), pnum) +#define sk_GENERAL_SUBTREE_sort(sk) OPENSSL_sk_sort(ossl_check_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_GENERAL_SUBTREE_sk_type(sk)) +#define sk_GENERAL_SUBTREE_dup(sk) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_dup(ossl_check_const_GENERAL_SUBTREE_sk_type(sk))) +#define sk_GENERAL_SUBTREE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(GENERAL_SUBTREE) *)OPENSSL_sk_deep_copy(ossl_check_const_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_copyfunc_type(copyfunc), ossl_check_GENERAL_SUBTREE_freefunc_type(freefunc))) +#define sk_GENERAL_SUBTREE_set_cmp_func(sk, cmp) ((sk_GENERAL_SUBTREE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_GENERAL_SUBTREE_sk_type(sk), ossl_check_GENERAL_SUBTREE_compfunc_type(cmp))) + +/* clang-format on */ + +struct NAME_CONSTRAINTS_st { + STACK_OF(GENERAL_SUBTREE) *permittedSubtrees; + STACK_OF(GENERAL_SUBTREE) *excludedSubtrees; +}; + +typedef struct POLICY_CONSTRAINTS_st { + ASN1_INTEGER *requireExplicitPolicy; + ASN1_INTEGER *inhibitPolicyMapping; +} POLICY_CONSTRAINTS; + +/* Proxy certificate structures, see RFC 3820 */ +typedef struct PROXY_POLICY_st { + ASN1_OBJECT *policyLanguage; + ASN1_OCTET_STRING *policy; +} PROXY_POLICY; + +typedef struct PROXY_CERT_INFO_EXTENSION_st { + ASN1_INTEGER *pcPathLengthConstraint; + PROXY_POLICY *proxyPolicy; +} PROXY_CERT_INFO_EXTENSION; + +DECLARE_ASN1_FUNCTIONS(PROXY_POLICY) +DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION) + +struct ISSUING_DIST_POINT_st { + DIST_POINT_NAME *distpoint; + int onlyuser; + int onlyCA; + ASN1_BIT_STRING *onlysomereasons; + int indirectCRL; + int onlyattr; +}; + +/* Values in idp_flags field */ +/* IDP present */ +#define IDP_PRESENT 0x1 +/* IDP values inconsistent */ +#define IDP_INVALID 0x2 +/* onlyuser true */ +#define IDP_ONLYUSER 0x4 +/* onlyCA true */ +#define IDP_ONLYCA 0x8 +/* onlyattr true */ +#define IDP_ONLYATTR 0x10 +/* indirectCRL true */ +#define IDP_INDIRECT 0x20 +/* onlysomereasons present */ +#define IDP_REASONS 0x40 + +#define X509V3_conf_err(val) ERR_add_error_data(6, \ + "section:", (val)->section, \ + ",name:", (val)->name, ",value:", (val)->value) + +#define X509V3_set_ctx_test(ctx) \ + X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, X509V3_CTX_TEST) +#define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL; + +#define EXT_BITSTRING(nid, table) { nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), \ + 0, 0, 0, 0, \ + 0, 0, \ + (X509V3_EXT_I2V)i2v_ASN1_BIT_STRING, \ + (X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, \ + NULL, NULL, \ + table } + +#define EXT_IA5STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), \ + 0, 0, 0, 0, \ + (X509V3_EXT_I2S)i2s_ASN1_IA5STRING, \ + (X509V3_EXT_S2I)s2i_ASN1_IA5STRING, \ + 0, 0, 0, 0, \ + NULL } + +#define EXT_UTF8STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_UTF8STRING), \ + 0, 0, 0, 0, \ + (X509V3_EXT_I2S)i2s_ASN1_UTF8STRING, \ + (X509V3_EXT_S2I)s2i_ASN1_UTF8STRING, \ + 0, 0, 0, 0, \ + NULL } + +/* clang-format off */ +# define EXT_END { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} +/* clang-format on */ + +/* X509_PURPOSE stuff */ + +#define EXFLAG_BCONS 0x1 +#define EXFLAG_KUSAGE 0x2 +#define EXFLAG_XKUSAGE 0x4 +#define EXFLAG_NSCERT 0x8 + +#define EXFLAG_CA 0x10 +#define EXFLAG_SI 0x20 /* self-issued, maybe not self-signed */ +#define EXFLAG_V1 0x40 +#define EXFLAG_INVALID 0x80 +/* EXFLAG_SET is set to indicate that some values have been precomputed */ +#define EXFLAG_SET 0x100 +#define EXFLAG_CRITICAL 0x200 +#define EXFLAG_PROXY 0x400 + +#define EXFLAG_INVALID_POLICY 0x800 +#define EXFLAG_FRESHEST 0x1000 +#define EXFLAG_SS 0x2000 /* cert is apparently self-signed */ + +#define EXFLAG_BCONS_CRITICAL 0x10000 +#define EXFLAG_AKID_CRITICAL 0x20000 +#define EXFLAG_SKID_CRITICAL 0x40000 +#define EXFLAG_SAN_CRITICAL 0x80000 +#define EXFLAG_NO_FINGERPRINT 0x100000 + +/* https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.3 */ +#define KU_DIGITAL_SIGNATURE X509v3_KU_DIGITAL_SIGNATURE +#define KU_NON_REPUDIATION X509v3_KU_NON_REPUDIATION +#define KU_KEY_ENCIPHERMENT X509v3_KU_KEY_ENCIPHERMENT +#define KU_DATA_ENCIPHERMENT X509v3_KU_DATA_ENCIPHERMENT +#define KU_KEY_AGREEMENT X509v3_KU_KEY_AGREEMENT +#define KU_KEY_CERT_SIGN X509v3_KU_KEY_CERT_SIGN +#define KU_CRL_SIGN X509v3_KU_CRL_SIGN +#define KU_ENCIPHER_ONLY X509v3_KU_ENCIPHER_ONLY +#define KU_DECIPHER_ONLY X509v3_KU_DECIPHER_ONLY + +#define NS_SSL_CLIENT 0x80 +#define NS_SSL_SERVER 0x40 +#define NS_SMIME 0x20 +#define NS_OBJSIGN 0x10 +#define NS_SSL_CA 0x04 +#define NS_SMIME_CA 0x02 +#define NS_OBJSIGN_CA 0x01 +#define NS_ANY_CA (NS_SSL_CA | NS_SMIME_CA | NS_OBJSIGN_CA) + +#define XKU_SSL_SERVER 0x1 +#define XKU_SSL_CLIENT 0x2 +#define XKU_SMIME 0x4 +#define XKU_CODE_SIGN 0x8 +#define XKU_SGC 0x10 /* Netscape or MS Server-Gated Crypto */ +#define XKU_OCSP_SIGN 0x20 +#define XKU_TIMESTAMP 0x40 +#define XKU_DVCS 0x80 +#define XKU_ANYEKU 0x100 + +#define X509_PURPOSE_DYNAMIC 0x1 +#define X509_PURPOSE_DYNAMIC_NAME 0x2 + +typedef struct x509_purpose_st { + int purpose; + int trust; /* Default trust ID */ + int flags; + int (*check_purpose)(const struct x509_purpose_st *, const X509 *, int); + char *name; + char *sname; + void *usr_data; +} X509_PURPOSE; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_PURPOSE, X509_PURPOSE, X509_PURPOSE) +#define sk_X509_PURPOSE_num(sk) OPENSSL_sk_num(ossl_check_const_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_value(sk, idx) ((X509_PURPOSE *)OPENSSL_sk_value(ossl_check_const_X509_PURPOSE_sk_type(sk), (idx))) +#define sk_X509_PURPOSE_new(cmp) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_new(ossl_check_X509_PURPOSE_compfunc_type(cmp))) +#define sk_X509_PURPOSE_new_null() ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_new_null()) +#define sk_X509_PURPOSE_new_reserve(cmp, n) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_new_reserve(ossl_check_X509_PURPOSE_compfunc_type(cmp), (n))) +#define sk_X509_PURPOSE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_PURPOSE_sk_type(sk), (n)) +#define sk_X509_PURPOSE_free(sk) OPENSSL_sk_free(ossl_check_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_zero(sk) OPENSSL_sk_zero(ossl_check_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_delete(sk, i) ((X509_PURPOSE *)OPENSSL_sk_delete(ossl_check_X509_PURPOSE_sk_type(sk), (i))) +#define sk_X509_PURPOSE_delete_ptr(sk, ptr) ((X509_PURPOSE *)OPENSSL_sk_delete_ptr(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr))) +#define sk_X509_PURPOSE_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr)) +#define sk_X509_PURPOSE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr)) +#define sk_X509_PURPOSE_pop(sk) ((X509_PURPOSE *)OPENSSL_sk_pop(ossl_check_X509_PURPOSE_sk_type(sk))) +#define sk_X509_PURPOSE_shift(sk) ((X509_PURPOSE *)OPENSSL_sk_shift(ossl_check_X509_PURPOSE_sk_type(sk))) +#define sk_X509_PURPOSE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_PURPOSE_sk_type(sk),ossl_check_X509_PURPOSE_freefunc_type(freefunc)) +#define sk_X509_PURPOSE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr), (idx)) +#define sk_X509_PURPOSE_set(sk, idx, ptr) ((X509_PURPOSE *)OPENSSL_sk_set(ossl_check_X509_PURPOSE_sk_type(sk), (idx), ossl_check_X509_PURPOSE_type(ptr))) +#define sk_X509_PURPOSE_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr)) +#define sk_X509_PURPOSE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr)) +#define sk_X509_PURPOSE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_type(ptr), pnum) +#define sk_X509_PURPOSE_sort(sk) OPENSSL_sk_sort(ossl_check_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_PURPOSE_sk_type(sk)) +#define sk_X509_PURPOSE_dup(sk) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_dup(ossl_check_const_X509_PURPOSE_sk_type(sk))) +#define sk_X509_PURPOSE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_PURPOSE) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_copyfunc_type(copyfunc), ossl_check_X509_PURPOSE_freefunc_type(freefunc))) +#define sk_X509_PURPOSE_set_cmp_func(sk, cmp) ((sk_X509_PURPOSE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_PURPOSE_sk_type(sk), ossl_check_X509_PURPOSE_compfunc_type(cmp))) + +/* clang-format on */ + +#define X509_PURPOSE_DEFAULT_ANY 0 +#define X509_PURPOSE_SSL_CLIENT 1 +#define X509_PURPOSE_SSL_SERVER 2 +#define X509_PURPOSE_NS_SSL_SERVER 3 +#define X509_PURPOSE_SMIME_SIGN 4 +#define X509_PURPOSE_SMIME_ENCRYPT 5 +#define X509_PURPOSE_CRL_SIGN 6 +#define X509_PURPOSE_ANY 7 +#define X509_PURPOSE_OCSP_HELPER 8 +#define X509_PURPOSE_TIMESTAMP_SIGN 9 +#define X509_PURPOSE_CODE_SIGN 10 + +#define X509_PURPOSE_MIN 1 +#define X509_PURPOSE_MAX 10 + +/* Flags for X509V3_EXT_print() */ + +#define X509V3_EXT_UNKNOWN_MASK (0xfL << 16) +/* Return error for unknown extensions */ +#define X509V3_EXT_DEFAULT 0 +/* Print error for unknown extensions */ +#define X509V3_EXT_ERROR_UNKNOWN (1L << 16) +/* ASN1 parse unknown extensions */ +#define X509V3_EXT_PARSE_UNKNOWN (2L << 16) +/* BIO_dump unknown extensions */ +#define X509V3_EXT_DUMP_UNKNOWN (3L << 16) + +/* Flags for X509V3_add1_i2d */ + +#define X509V3_ADD_OP_MASK 0xfL +#define X509V3_ADD_DEFAULT 0L +#define X509V3_ADD_APPEND 1L +#define X509V3_ADD_REPLACE 2L +#define X509V3_ADD_REPLACE_EXISTING 3L +#define X509V3_ADD_KEEP_EXISTING 4L +#define X509V3_ADD_DELETE 5L +#define X509V3_ADD_SILENT 0x10 + +DECLARE_ASN1_FUNCTIONS(BASIC_CONSTRAINTS) +DECLARE_ASN1_FUNCTIONS(OSSL_BASIC_ATTR_CONSTRAINTS) + +DECLARE_ASN1_FUNCTIONS(SXNET) +DECLARE_ASN1_FUNCTIONS(SXNETID) + +DECLARE_ASN1_FUNCTIONS(ISSUER_SIGN_TOOL) + +int SXNET_add_id_asc(SXNET **psx, const char *zone, const char *user, int userlen); +int SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, const char *user, + int userlen); +int SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *izone, const char *user, + int userlen); + +ASN1_OCTET_STRING *SXNET_get_id_asc(SXNET *sx, const char *zone); +ASN1_OCTET_STRING *SXNET_get_id_ulong(SXNET *sx, unsigned long lzone); +ASN1_OCTET_STRING *SXNET_get_id_INTEGER(SXNET *sx, ASN1_INTEGER *zone); + +DECLARE_ASN1_FUNCTIONS(AUTHORITY_KEYID) + +DECLARE_ASN1_FUNCTIONS(PKEY_USAGE_PERIOD) + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAME) +DECLARE_ASN1_DUP_FUNCTION(GENERAL_NAME) +int GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b); + +ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, + STACK_OF(CONF_VALUE) *nval); +STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(X509V3_EXT_METHOD *method, + ASN1_BIT_STRING *bits, + STACK_OF(CONF_VALUE) *extlist); +char *i2s_ASN1_IA5STRING(X509V3_EXT_METHOD *method, ASN1_IA5STRING *ia5); +ASN1_IA5STRING *s2i_ASN1_IA5STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, const char *str); +char *i2s_ASN1_UTF8STRING(X509V3_EXT_METHOD *method, ASN1_UTF8STRING *utf8); +ASN1_UTF8STRING *s2i_ASN1_UTF8STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, const char *str); + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, + GENERAL_NAME *gen, + STACK_OF(CONF_VALUE) *ret); +int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen); + +DECLARE_ASN1_FUNCTIONS(GENERAL_NAMES) + +STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, + GENERAL_NAMES *gen, + STACK_OF(CONF_VALUE) *extlist); +GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); + +DECLARE_ASN1_FUNCTIONS(OTHERNAME) +DECLARE_ASN1_FUNCTIONS(EDIPARTYNAME) +int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b); +void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value); +void *GENERAL_NAME_get0_value(const GENERAL_NAME *a, int *ptype); +int GENERAL_NAME_set0_othername(GENERAL_NAME *gen, + ASN1_OBJECT *oid, ASN1_TYPE *value); +int GENERAL_NAME_get0_otherName(const GENERAL_NAME *gen, + ASN1_OBJECT **poid, ASN1_TYPE **pvalue); + +char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + const ASN1_OCTET_STRING *ia5); +ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, const char *str); + +DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE) +int i2a_ACCESS_DESCRIPTION(BIO *bp, const ACCESS_DESCRIPTION *a); + +DECLARE_ASN1_ALLOC_FUNCTIONS(TLS_FEATURE) + +DECLARE_ASN1_FUNCTIONS(CERTIFICATEPOLICIES) +DECLARE_ASN1_FUNCTIONS(POLICYINFO) +DECLARE_ASN1_FUNCTIONS(POLICYQUALINFO) +DECLARE_ASN1_FUNCTIONS(USERNOTICE) +DECLARE_ASN1_FUNCTIONS(NOTICEREF) + +DECLARE_ASN1_FUNCTIONS(CRL_DIST_POINTS) +DECLARE_ASN1_FUNCTIONS(DIST_POINT) +DECLARE_ASN1_FUNCTIONS(DIST_POINT_NAME) +DECLARE_ASN1_FUNCTIONS(ISSUING_DIST_POINT) + +int DIST_POINT_set_dpname(DIST_POINT_NAME *dpn, const X509_NAME *iname); + +int NAME_CONSTRAINTS_check(X509 *x, NAME_CONSTRAINTS *nc); +int NAME_CONSTRAINTS_check_CN(X509 *x, NAME_CONSTRAINTS *nc); + +DECLARE_ASN1_FUNCTIONS(ACCESS_DESCRIPTION) +DECLARE_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS) + +DECLARE_ASN1_ITEM(POLICY_MAPPING) +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_MAPPING) +DECLARE_ASN1_ITEM(POLICY_MAPPINGS) + +DECLARE_ASN1_ITEM(GENERAL_SUBTREE) +DECLARE_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE) + +DECLARE_ASN1_ITEM(NAME_CONSTRAINTS) +DECLARE_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS) + +DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_CONSTRAINTS) +DECLARE_ASN1_ITEM(POLICY_CONSTRAINTS) + +GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, int gen_type, + const char *value, int is_nc); + +#ifdef OPENSSL_CONF_H +GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf); +GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, + const X509V3_EXT_METHOD *method, + X509V3_CTX *ctx, CONF_VALUE *cnf, + int is_nc); + +void X509V3_conf_free(CONF_VALUE *val); + +X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid, + const char *value); +X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, const char *name, + const char *value); +int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, const char *section, + STACK_OF(X509_EXTENSION) **sk); +int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, + X509 *cert); +int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, + X509_REQ *req); +int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, const char *section, + X509_CRL *crl); + +X509_EXTENSION *X509V3_EXT_conf_nid(LHASH_OF(CONF_VALUE) *conf, + X509V3_CTX *ctx, int ext_nid, + const char *value); +X509_EXTENSION *X509V3_EXT_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *name, const char *value); +int X509V3_EXT_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *section, X509 *cert); +int X509V3_EXT_REQ_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *section, X509_REQ *req); +int X509V3_EXT_CRL_add_conf(LHASH_OF(CONF_VALUE) *conf, X509V3_CTX *ctx, + const char *section, X509_CRL *crl); + +int X509V3_add_value_bool_nf(const char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_get_value_bool(const CONF_VALUE *value, int *asn1_bool); +int X509V3_get_value_int(const CONF_VALUE *value, ASN1_INTEGER **aint); +void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf); +void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH_OF(CONF_VALUE) *lhash); +#endif + +char *X509V3_get_string(X509V3_CTX *ctx, const char *name, const char *section); +STACK_OF(CONF_VALUE) *X509V3_get_section(X509V3_CTX *ctx, const char *section); +void X509V3_string_free(X509V3_CTX *ctx, char *str); +void X509V3_section_free(X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section); +void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject, + X509_REQ *req, X509_CRL *crl, int flags); +/* For API backward compatibility, this is separate from X509V3_set_ctx(): */ +int X509V3_set_issuer_pkey(X509V3_CTX *ctx, EVP_PKEY *pkey); + +int X509V3_add_value(const char *name, const char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_uchar(const char *name, const unsigned char *value, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_bool(const char *name, int asn1_bool, + STACK_OF(CONF_VALUE) **extlist); +int X509V3_add_value_int(const char *name, const ASN1_INTEGER *aint, + STACK_OF(CONF_VALUE) **extlist); +char *i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, const ASN1_INTEGER *aint); +ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, const char *value); +char *i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, const ASN1_ENUMERATED *aint); +char *i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *meth, + const ASN1_ENUMERATED *aint); +int X509V3_EXT_add(X509V3_EXT_METHOD *ext); +int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist); +int X509V3_EXT_add_alias(int nid_to, int nid_from); +void X509V3_EXT_cleanup(void); + +const X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *ext); +const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid); +int X509V3_add_standard_extensions(void); +STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line); +void *X509V3_EXT_d2i(X509_EXTENSION *ext); +void *X509V3_get_d2i(const STACK_OF(X509_EXTENSION) *x, int nid, int *crit, + int *idx); + +X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc); +int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, + int crit, unsigned long flags); + +#ifndef OPENSSL_NO_DEPRECATED_1_1_0 +/* The new declarations are in crypto.h, but the old ones were here. */ +#define hex_to_string OPENSSL_buf2hexstr +#define string_to_hex OPENSSL_hexstr2buf +#endif + +void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent, + int ml); +int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag, + int indent); +#ifndef OPENSSL_NO_STDIO +int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent); +#endif +int X509V3_extensions_print(BIO *out, const char *title, + const STACK_OF(X509_EXTENSION) *exts, + unsigned long flag, int indent); + +int X509_check_ca(X509 *x); +int X509_check_purpose(X509 *x, int id, int ca); +int X509_supported_extension(X509_EXTENSION *ex); +int X509_check_issued(X509 *issuer, X509 *subject); +int X509_check_akid(const X509 *issuer, const AUTHORITY_KEYID *akid); +void X509_set_proxy_flag(X509 *x); +void X509_set_proxy_pathlen(X509 *x, long l); +long X509_get_proxy_pathlen(X509 *x); + +uint32_t X509_get_extension_flags(X509 *x); +uint32_t X509_get_key_usage(X509 *x); +uint32_t X509_get_extended_key_usage(X509 *x); +const ASN1_OCTET_STRING *X509_get0_subject_key_id(X509 *x); +const ASN1_OCTET_STRING *X509_get0_authority_key_id(X509 *x); +const GENERAL_NAMES *X509_get0_authority_issuer(X509 *x); +const ASN1_INTEGER *X509_get0_authority_serial(X509 *x); + +int X509_PURPOSE_get_count(void); +int X509_PURPOSE_get_unused_id(OSSL_LIB_CTX *libctx); +int X509_PURPOSE_get_by_sname(const char *sname); +int X509_PURPOSE_get_by_id(int id); +int X509_PURPOSE_add(int id, int trust, int flags, + int (*ck)(const X509_PURPOSE *, const X509 *, int), + const char *name, const char *sname, void *arg); +void X509_PURPOSE_cleanup(void); + +X509_PURPOSE *X509_PURPOSE_get0(int idx); +int X509_PURPOSE_get_id(const X509_PURPOSE *); +char *X509_PURPOSE_get0_name(const X509_PURPOSE *xp); +char *X509_PURPOSE_get0_sname(const X509_PURPOSE *xp); +int X509_PURPOSE_get_trust(const X509_PURPOSE *xp); +int X509_PURPOSE_set(int *p, int purpose); + +STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x); +STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email(X509_REQ *x); +void X509_email_free(STACK_OF(OPENSSL_STRING) *sk); +STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x); + +/* Flags for X509_check_* functions */ + +/* + * Always check subject name for host match even if subject alt names present + */ +#define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT 0x1 +/* Disable wildcard matching for dnsName fields and common name. */ +#define X509_CHECK_FLAG_NO_WILDCARDS 0x2 +/* Wildcards must not match a partial label. */ +#define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0x4 +/* Allow (non-partial) wildcards to match multiple labels. */ +#define X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS 0x8 +/* Constraint verifier subdomain patterns to match a single labels. */ +#define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0x10 +/* Never check the subject CN */ +#define X509_CHECK_FLAG_NEVER_CHECK_SUBJECT 0x20 +/* + * Match reference identifiers starting with "." to any sub-domain. + * This is a non-public flag, turned on implicitly when the subject + * reference identity is a DNS name. + */ +#define _X509_CHECK_FLAG_DOT_SUBDOMAINS 0x8000 + +int X509_check_host(X509 *x, const char *chk, size_t chklen, + unsigned int flags, char **peername); +int X509_check_email(X509 *x, const char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip(X509 *x, const unsigned char *chk, size_t chklen, + unsigned int flags); +int X509_check_ip_asc(X509 *x, const char *ipasc, unsigned int flags); + +ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc); +ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc); +int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE) *dn_sk, + unsigned long chtype); + +void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent); +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(X509_POLICY_NODE, X509_POLICY_NODE, X509_POLICY_NODE) +#define sk_X509_POLICY_NODE_num(sk) OPENSSL_sk_num(ossl_check_const_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_value(sk, idx) ((X509_POLICY_NODE *)OPENSSL_sk_value(ossl_check_const_X509_POLICY_NODE_sk_type(sk), (idx))) +#define sk_X509_POLICY_NODE_new(cmp) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_new(ossl_check_X509_POLICY_NODE_compfunc_type(cmp))) +#define sk_X509_POLICY_NODE_new_null() ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_new_null()) +#define sk_X509_POLICY_NODE_new_reserve(cmp, n) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_new_reserve(ossl_check_X509_POLICY_NODE_compfunc_type(cmp), (n))) +#define sk_X509_POLICY_NODE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_POLICY_NODE_sk_type(sk), (n)) +#define sk_X509_POLICY_NODE_free(sk) OPENSSL_sk_free(ossl_check_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_zero(sk) OPENSSL_sk_zero(ossl_check_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_delete(sk, i) ((X509_POLICY_NODE *)OPENSSL_sk_delete(ossl_check_X509_POLICY_NODE_sk_type(sk), (i))) +#define sk_X509_POLICY_NODE_delete_ptr(sk, ptr) ((X509_POLICY_NODE *)OPENSSL_sk_delete_ptr(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr))) +#define sk_X509_POLICY_NODE_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr)) +#define sk_X509_POLICY_NODE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr)) +#define sk_X509_POLICY_NODE_pop(sk) ((X509_POLICY_NODE *)OPENSSL_sk_pop(ossl_check_X509_POLICY_NODE_sk_type(sk))) +#define sk_X509_POLICY_NODE_shift(sk) ((X509_POLICY_NODE *)OPENSSL_sk_shift(ossl_check_X509_POLICY_NODE_sk_type(sk))) +#define sk_X509_POLICY_NODE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_POLICY_NODE_sk_type(sk),ossl_check_X509_POLICY_NODE_freefunc_type(freefunc)) +#define sk_X509_POLICY_NODE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr), (idx)) +#define sk_X509_POLICY_NODE_set(sk, idx, ptr) ((X509_POLICY_NODE *)OPENSSL_sk_set(ossl_check_X509_POLICY_NODE_sk_type(sk), (idx), ossl_check_X509_POLICY_NODE_type(ptr))) +#define sk_X509_POLICY_NODE_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr)) +#define sk_X509_POLICY_NODE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr)) +#define sk_X509_POLICY_NODE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_type(ptr), pnum) +#define sk_X509_POLICY_NODE_sort(sk) OPENSSL_sk_sort(ossl_check_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_POLICY_NODE_sk_type(sk)) +#define sk_X509_POLICY_NODE_dup(sk) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_dup(ossl_check_const_X509_POLICY_NODE_sk_type(sk))) +#define sk_X509_POLICY_NODE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_POLICY_NODE) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_copyfunc_type(copyfunc), ossl_check_X509_POLICY_NODE_freefunc_type(freefunc))) +#define sk_X509_POLICY_NODE_set_cmp_func(sk, cmp) ((sk_X509_POLICY_NODE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_POLICY_NODE_sk_type(sk), ossl_check_X509_POLICY_NODE_compfunc_type(cmp))) + +/* clang-format on */ + +#ifndef OPENSSL_NO_RFC3779 +typedef struct ASRange_st { + ASN1_INTEGER *min, *max; +} ASRange; + +#define ASIdOrRange_id 0 +#define ASIdOrRange_range 1 + +typedef struct ASIdOrRange_st { + int type; + union { + ASN1_INTEGER *id; + ASRange *range; + } u; +} ASIdOrRange; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASIdOrRange, ASIdOrRange, ASIdOrRange) +#define sk_ASIdOrRange_num(sk) OPENSSL_sk_num(ossl_check_const_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_value(sk, idx) ((ASIdOrRange *)OPENSSL_sk_value(ossl_check_const_ASIdOrRange_sk_type(sk), (idx))) +#define sk_ASIdOrRange_new(cmp) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_new(ossl_check_ASIdOrRange_compfunc_type(cmp))) +#define sk_ASIdOrRange_new_null() ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_new_null()) +#define sk_ASIdOrRange_new_reserve(cmp, n) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_new_reserve(ossl_check_ASIdOrRange_compfunc_type(cmp), (n))) +#define sk_ASIdOrRange_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASIdOrRange_sk_type(sk), (n)) +#define sk_ASIdOrRange_free(sk) OPENSSL_sk_free(ossl_check_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_zero(sk) OPENSSL_sk_zero(ossl_check_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_delete(sk, i) ((ASIdOrRange *)OPENSSL_sk_delete(ossl_check_ASIdOrRange_sk_type(sk), (i))) +#define sk_ASIdOrRange_delete_ptr(sk, ptr) ((ASIdOrRange *)OPENSSL_sk_delete_ptr(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr))) +#define sk_ASIdOrRange_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr)) +#define sk_ASIdOrRange_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr)) +#define sk_ASIdOrRange_pop(sk) ((ASIdOrRange *)OPENSSL_sk_pop(ossl_check_ASIdOrRange_sk_type(sk))) +#define sk_ASIdOrRange_shift(sk) ((ASIdOrRange *)OPENSSL_sk_shift(ossl_check_ASIdOrRange_sk_type(sk))) +#define sk_ASIdOrRange_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASIdOrRange_sk_type(sk),ossl_check_ASIdOrRange_freefunc_type(freefunc)) +#define sk_ASIdOrRange_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr), (idx)) +#define sk_ASIdOrRange_set(sk, idx, ptr) ((ASIdOrRange *)OPENSSL_sk_set(ossl_check_ASIdOrRange_sk_type(sk), (idx), ossl_check_ASIdOrRange_type(ptr))) +#define sk_ASIdOrRange_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr)) +#define sk_ASIdOrRange_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr)) +#define sk_ASIdOrRange_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_type(ptr), pnum) +#define sk_ASIdOrRange_sort(sk) OPENSSL_sk_sort(ossl_check_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASIdOrRange_sk_type(sk)) +#define sk_ASIdOrRange_dup(sk) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_dup(ossl_check_const_ASIdOrRange_sk_type(sk))) +#define sk_ASIdOrRange_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASIdOrRange) *)OPENSSL_sk_deep_copy(ossl_check_const_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_copyfunc_type(copyfunc), ossl_check_ASIdOrRange_freefunc_type(freefunc))) +#define sk_ASIdOrRange_set_cmp_func(sk, cmp) ((sk_ASIdOrRange_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASIdOrRange_sk_type(sk), ossl_check_ASIdOrRange_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(ASIdOrRange) ASIdOrRanges; + +#define ASIdentifierChoice_inherit 0 +#define ASIdentifierChoice_asIdsOrRanges 1 + +typedef struct ASIdentifierChoice_st { + int type; + union { + ASN1_NULL *inherit; + ASIdOrRanges *asIdsOrRanges; + } u; +} ASIdentifierChoice; + +typedef struct ASIdentifiers_st { + ASIdentifierChoice *asnum, *rdi; +} ASIdentifiers; + +DECLARE_ASN1_FUNCTIONS(ASRange) +DECLARE_ASN1_FUNCTIONS(ASIdOrRange) +DECLARE_ASN1_FUNCTIONS(ASIdentifierChoice) +DECLARE_ASN1_FUNCTIONS(ASIdentifiers) + +typedef struct IPAddressRange_st { + ASN1_BIT_STRING *min, *max; +} IPAddressRange; + +#define IPAddressOrRange_addressPrefix 0 +#define IPAddressOrRange_addressRange 1 + +typedef struct IPAddressOrRange_st { + int type; + union { + ASN1_BIT_STRING *addressPrefix; + IPAddressRange *addressRange; + } u; +} IPAddressOrRange; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(IPAddressOrRange, IPAddressOrRange, IPAddressOrRange) +#define sk_IPAddressOrRange_num(sk) OPENSSL_sk_num(ossl_check_const_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_value(sk, idx) ((IPAddressOrRange *)OPENSSL_sk_value(ossl_check_const_IPAddressOrRange_sk_type(sk), (idx))) +#define sk_IPAddressOrRange_new(cmp) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_new(ossl_check_IPAddressOrRange_compfunc_type(cmp))) +#define sk_IPAddressOrRange_new_null() ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_new_null()) +#define sk_IPAddressOrRange_new_reserve(cmp, n) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_new_reserve(ossl_check_IPAddressOrRange_compfunc_type(cmp), (n))) +#define sk_IPAddressOrRange_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_IPAddressOrRange_sk_type(sk), (n)) +#define sk_IPAddressOrRange_free(sk) OPENSSL_sk_free(ossl_check_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_zero(sk) OPENSSL_sk_zero(ossl_check_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_delete(sk, i) ((IPAddressOrRange *)OPENSSL_sk_delete(ossl_check_IPAddressOrRange_sk_type(sk), (i))) +#define sk_IPAddressOrRange_delete_ptr(sk, ptr) ((IPAddressOrRange *)OPENSSL_sk_delete_ptr(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr))) +#define sk_IPAddressOrRange_push(sk, ptr) OPENSSL_sk_push(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr)) +#define sk_IPAddressOrRange_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr)) +#define sk_IPAddressOrRange_pop(sk) ((IPAddressOrRange *)OPENSSL_sk_pop(ossl_check_IPAddressOrRange_sk_type(sk))) +#define sk_IPAddressOrRange_shift(sk) ((IPAddressOrRange *)OPENSSL_sk_shift(ossl_check_IPAddressOrRange_sk_type(sk))) +#define sk_IPAddressOrRange_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_IPAddressOrRange_sk_type(sk),ossl_check_IPAddressOrRange_freefunc_type(freefunc)) +#define sk_IPAddressOrRange_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr), (idx)) +#define sk_IPAddressOrRange_set(sk, idx, ptr) ((IPAddressOrRange *)OPENSSL_sk_set(ossl_check_IPAddressOrRange_sk_type(sk), (idx), ossl_check_IPAddressOrRange_type(ptr))) +#define sk_IPAddressOrRange_find(sk, ptr) OPENSSL_sk_find(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr)) +#define sk_IPAddressOrRange_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr)) +#define sk_IPAddressOrRange_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_type(ptr), pnum) +#define sk_IPAddressOrRange_sort(sk) OPENSSL_sk_sort(ossl_check_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_IPAddressOrRange_sk_type(sk)) +#define sk_IPAddressOrRange_dup(sk) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_dup(ossl_check_const_IPAddressOrRange_sk_type(sk))) +#define sk_IPAddressOrRange_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(IPAddressOrRange) *)OPENSSL_sk_deep_copy(ossl_check_const_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_copyfunc_type(copyfunc), ossl_check_IPAddressOrRange_freefunc_type(freefunc))) +#define sk_IPAddressOrRange_set_cmp_func(sk, cmp) ((sk_IPAddressOrRange_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_IPAddressOrRange_sk_type(sk), ossl_check_IPAddressOrRange_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(IPAddressOrRange) IPAddressOrRanges; + +#define IPAddressChoice_inherit 0 +#define IPAddressChoice_addressesOrRanges 1 + +typedef struct IPAddressChoice_st { + int type; + union { + ASN1_NULL *inherit; + IPAddressOrRanges *addressesOrRanges; + } u; +} IPAddressChoice; + +typedef struct IPAddressFamily_st { + ASN1_OCTET_STRING *addressFamily; + IPAddressChoice *ipAddressChoice; +} IPAddressFamily; + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(IPAddressFamily, IPAddressFamily, IPAddressFamily) +#define sk_IPAddressFamily_num(sk) OPENSSL_sk_num(ossl_check_const_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_value(sk, idx) ((IPAddressFamily *)OPENSSL_sk_value(ossl_check_const_IPAddressFamily_sk_type(sk), (idx))) +#define sk_IPAddressFamily_new(cmp) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_new(ossl_check_IPAddressFamily_compfunc_type(cmp))) +#define sk_IPAddressFamily_new_null() ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_new_null()) +#define sk_IPAddressFamily_new_reserve(cmp, n) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_new_reserve(ossl_check_IPAddressFamily_compfunc_type(cmp), (n))) +#define sk_IPAddressFamily_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_IPAddressFamily_sk_type(sk), (n)) +#define sk_IPAddressFamily_free(sk) OPENSSL_sk_free(ossl_check_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_zero(sk) OPENSSL_sk_zero(ossl_check_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_delete(sk, i) ((IPAddressFamily *)OPENSSL_sk_delete(ossl_check_IPAddressFamily_sk_type(sk), (i))) +#define sk_IPAddressFamily_delete_ptr(sk, ptr) ((IPAddressFamily *)OPENSSL_sk_delete_ptr(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr))) +#define sk_IPAddressFamily_push(sk, ptr) OPENSSL_sk_push(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr)) +#define sk_IPAddressFamily_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr)) +#define sk_IPAddressFamily_pop(sk) ((IPAddressFamily *)OPENSSL_sk_pop(ossl_check_IPAddressFamily_sk_type(sk))) +#define sk_IPAddressFamily_shift(sk) ((IPAddressFamily *)OPENSSL_sk_shift(ossl_check_IPAddressFamily_sk_type(sk))) +#define sk_IPAddressFamily_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_IPAddressFamily_sk_type(sk),ossl_check_IPAddressFamily_freefunc_type(freefunc)) +#define sk_IPAddressFamily_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr), (idx)) +#define sk_IPAddressFamily_set(sk, idx, ptr) ((IPAddressFamily *)OPENSSL_sk_set(ossl_check_IPAddressFamily_sk_type(sk), (idx), ossl_check_IPAddressFamily_type(ptr))) +#define sk_IPAddressFamily_find(sk, ptr) OPENSSL_sk_find(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr)) +#define sk_IPAddressFamily_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr)) +#define sk_IPAddressFamily_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_type(ptr), pnum) +#define sk_IPAddressFamily_sort(sk) OPENSSL_sk_sort(ossl_check_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_IPAddressFamily_sk_type(sk)) +#define sk_IPAddressFamily_dup(sk) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_dup(ossl_check_const_IPAddressFamily_sk_type(sk))) +#define sk_IPAddressFamily_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(IPAddressFamily) *)OPENSSL_sk_deep_copy(ossl_check_const_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_copyfunc_type(copyfunc), ossl_check_IPAddressFamily_freefunc_type(freefunc))) +#define sk_IPAddressFamily_set_cmp_func(sk, cmp) ((sk_IPAddressFamily_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_IPAddressFamily_sk_type(sk), ossl_check_IPAddressFamily_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(IPAddressFamily) IPAddrBlocks; + +DECLARE_ASN1_FUNCTIONS(IPAddressRange) +DECLARE_ASN1_FUNCTIONS(IPAddressOrRange) +DECLARE_ASN1_FUNCTIONS(IPAddressChoice) +DECLARE_ASN1_FUNCTIONS(IPAddressFamily) + +/* + * API tag for elements of the ASIdentifer SEQUENCE. + */ +#define V3_ASID_ASNUM 0 +#define V3_ASID_RDI 1 + +/* + * AFI values, assigned by IANA. It'd be nice to make the AFI + * handling code totally generic, but there are too many little things + * that would need to be defined for other address families for it to + * be worth the trouble. + */ +#define IANA_AFI_IPV4 1 +#define IANA_AFI_IPV6 2 + +/* + * Utilities to construct and extract values from RFC3779 extensions, + * since some of the encodings (particularly for IP address prefixes + * and ranges) are a bit tedious to work with directly. + */ +int X509v3_asid_add_inherit(ASIdentifiers *asid, int which); +int X509v3_asid_add_id_or_range(ASIdentifiers *asid, int which, + ASN1_INTEGER *min, ASN1_INTEGER *max); +int X509v3_addr_add_inherit(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi); +int X509v3_addr_add_prefix(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *a, const int prefixlen); +int X509v3_addr_add_range(IPAddrBlocks *addr, + const unsigned afi, const unsigned *safi, + unsigned char *min, unsigned char *max); +unsigned X509v3_addr_get_afi(const IPAddressFamily *f); +int X509v3_addr_get_range(IPAddressOrRange *aor, const unsigned afi, + unsigned char *min, unsigned char *max, + const int length); + +/* + * Canonical forms. + */ +int X509v3_asid_is_canonical(ASIdentifiers *asid); +int X509v3_addr_is_canonical(IPAddrBlocks *addr); +int X509v3_asid_canonize(ASIdentifiers *asid); +int X509v3_addr_canonize(IPAddrBlocks *addr); + +/* + * Tests for inheritance and containment. + */ +int X509v3_asid_inherits(ASIdentifiers *asid); +int X509v3_addr_inherits(IPAddrBlocks *addr); +int X509v3_asid_subset(ASIdentifiers *a, ASIdentifiers *b); +int X509v3_addr_subset(IPAddrBlocks *a, IPAddrBlocks *b); + +/* + * Check whether RFC 3779 extensions nest properly in chains. + */ +int X509v3_asid_validate_path(X509_STORE_CTX *); +int X509v3_addr_validate_path(X509_STORE_CTX *); +int X509v3_asid_validate_resource_set(STACK_OF(X509) *chain, + ASIdentifiers *ext, + int allow_inheritance); +int X509v3_addr_validate_resource_set(STACK_OF(X509) *chain, + IPAddrBlocks *ext, int allow_inheritance); + +#endif /* OPENSSL_NO_RFC3779 */ + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(ASN1_STRING, ASN1_STRING, ASN1_STRING) +#define sk_ASN1_STRING_num(sk) OPENSSL_sk_num(ossl_check_const_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_value(sk, idx) ((ASN1_STRING *)OPENSSL_sk_value(ossl_check_const_ASN1_STRING_sk_type(sk), (idx))) +#define sk_ASN1_STRING_new(cmp) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_new(ossl_check_ASN1_STRING_compfunc_type(cmp))) +#define sk_ASN1_STRING_new_null() ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_new_null()) +#define sk_ASN1_STRING_new_reserve(cmp, n) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_new_reserve(ossl_check_ASN1_STRING_compfunc_type(cmp), (n))) +#define sk_ASN1_STRING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ASN1_STRING_sk_type(sk), (n)) +#define sk_ASN1_STRING_free(sk) OPENSSL_sk_free(ossl_check_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_zero(sk) OPENSSL_sk_zero(ossl_check_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_delete(sk, i) ((ASN1_STRING *)OPENSSL_sk_delete(ossl_check_ASN1_STRING_sk_type(sk), (i))) +#define sk_ASN1_STRING_delete_ptr(sk, ptr) ((ASN1_STRING *)OPENSSL_sk_delete_ptr(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr))) +#define sk_ASN1_STRING_push(sk, ptr) OPENSSL_sk_push(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr)) +#define sk_ASN1_STRING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr)) +#define sk_ASN1_STRING_pop(sk) ((ASN1_STRING *)OPENSSL_sk_pop(ossl_check_ASN1_STRING_sk_type(sk))) +#define sk_ASN1_STRING_shift(sk) ((ASN1_STRING *)OPENSSL_sk_shift(ossl_check_ASN1_STRING_sk_type(sk))) +#define sk_ASN1_STRING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ASN1_STRING_sk_type(sk),ossl_check_ASN1_STRING_freefunc_type(freefunc)) +#define sk_ASN1_STRING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr), (idx)) +#define sk_ASN1_STRING_set(sk, idx, ptr) ((ASN1_STRING *)OPENSSL_sk_set(ossl_check_ASN1_STRING_sk_type(sk), (idx), ossl_check_ASN1_STRING_type(ptr))) +#define sk_ASN1_STRING_find(sk, ptr) OPENSSL_sk_find(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr)) +#define sk_ASN1_STRING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr)) +#define sk_ASN1_STRING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_type(ptr), pnum) +#define sk_ASN1_STRING_sort(sk) OPENSSL_sk_sort(ossl_check_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ASN1_STRING_sk_type(sk)) +#define sk_ASN1_STRING_dup(sk) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_dup(ossl_check_const_ASN1_STRING_sk_type(sk))) +#define sk_ASN1_STRING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ASN1_STRING) *)OPENSSL_sk_deep_copy(ossl_check_const_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_copyfunc_type(copyfunc), ossl_check_ASN1_STRING_freefunc_type(freefunc))) +#define sk_ASN1_STRING_set_cmp_func(sk, cmp) ((sk_ASN1_STRING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ASN1_STRING_sk_type(sk), ossl_check_ASN1_STRING_compfunc_type(cmp))) + +/* clang-format on */ + +/* + * Admission Syntax + */ +typedef struct NamingAuthority_st NAMING_AUTHORITY; +typedef struct ProfessionInfo_st PROFESSION_INFO; +typedef struct Admissions_st ADMISSIONS; +typedef struct AdmissionSyntax_st ADMISSION_SYNTAX; +DECLARE_ASN1_FUNCTIONS(NAMING_AUTHORITY) +DECLARE_ASN1_FUNCTIONS(PROFESSION_INFO) +DECLARE_ASN1_FUNCTIONS(ADMISSIONS) +DECLARE_ASN1_FUNCTIONS(ADMISSION_SYNTAX) +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(PROFESSION_INFO, PROFESSION_INFO, PROFESSION_INFO) +#define sk_PROFESSION_INFO_num(sk) OPENSSL_sk_num(ossl_check_const_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_value(sk, idx) ((PROFESSION_INFO *)OPENSSL_sk_value(ossl_check_const_PROFESSION_INFO_sk_type(sk), (idx))) +#define sk_PROFESSION_INFO_new(cmp) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_new(ossl_check_PROFESSION_INFO_compfunc_type(cmp))) +#define sk_PROFESSION_INFO_new_null() ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_new_null()) +#define sk_PROFESSION_INFO_new_reserve(cmp, n) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_new_reserve(ossl_check_PROFESSION_INFO_compfunc_type(cmp), (n))) +#define sk_PROFESSION_INFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_PROFESSION_INFO_sk_type(sk), (n)) +#define sk_PROFESSION_INFO_free(sk) OPENSSL_sk_free(ossl_check_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_zero(sk) OPENSSL_sk_zero(ossl_check_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_delete(sk, i) ((PROFESSION_INFO *)OPENSSL_sk_delete(ossl_check_PROFESSION_INFO_sk_type(sk), (i))) +#define sk_PROFESSION_INFO_delete_ptr(sk, ptr) ((PROFESSION_INFO *)OPENSSL_sk_delete_ptr(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr))) +#define sk_PROFESSION_INFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr)) +#define sk_PROFESSION_INFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr)) +#define sk_PROFESSION_INFO_pop(sk) ((PROFESSION_INFO *)OPENSSL_sk_pop(ossl_check_PROFESSION_INFO_sk_type(sk))) +#define sk_PROFESSION_INFO_shift(sk) ((PROFESSION_INFO *)OPENSSL_sk_shift(ossl_check_PROFESSION_INFO_sk_type(sk))) +#define sk_PROFESSION_INFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_PROFESSION_INFO_sk_type(sk),ossl_check_PROFESSION_INFO_freefunc_type(freefunc)) +#define sk_PROFESSION_INFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr), (idx)) +#define sk_PROFESSION_INFO_set(sk, idx, ptr) ((PROFESSION_INFO *)OPENSSL_sk_set(ossl_check_PROFESSION_INFO_sk_type(sk), (idx), ossl_check_PROFESSION_INFO_type(ptr))) +#define sk_PROFESSION_INFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr)) +#define sk_PROFESSION_INFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr)) +#define sk_PROFESSION_INFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_type(ptr), pnum) +#define sk_PROFESSION_INFO_sort(sk) OPENSSL_sk_sort(ossl_check_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_PROFESSION_INFO_sk_type(sk)) +#define sk_PROFESSION_INFO_dup(sk) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_dup(ossl_check_const_PROFESSION_INFO_sk_type(sk))) +#define sk_PROFESSION_INFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(PROFESSION_INFO) *)OPENSSL_sk_deep_copy(ossl_check_const_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_copyfunc_type(copyfunc), ossl_check_PROFESSION_INFO_freefunc_type(freefunc))) +#define sk_PROFESSION_INFO_set_cmp_func(sk, cmp) ((sk_PROFESSION_INFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_PROFESSION_INFO_sk_type(sk), ossl_check_PROFESSION_INFO_compfunc_type(cmp))) +SKM_DEFINE_STACK_OF_INTERNAL(ADMISSIONS, ADMISSIONS, ADMISSIONS) +#define sk_ADMISSIONS_num(sk) OPENSSL_sk_num(ossl_check_const_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_value(sk, idx) ((ADMISSIONS *)OPENSSL_sk_value(ossl_check_const_ADMISSIONS_sk_type(sk), (idx))) +#define sk_ADMISSIONS_new(cmp) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_new(ossl_check_ADMISSIONS_compfunc_type(cmp))) +#define sk_ADMISSIONS_new_null() ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_new_null()) +#define sk_ADMISSIONS_new_reserve(cmp, n) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_new_reserve(ossl_check_ADMISSIONS_compfunc_type(cmp), (n))) +#define sk_ADMISSIONS_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_ADMISSIONS_sk_type(sk), (n)) +#define sk_ADMISSIONS_free(sk) OPENSSL_sk_free(ossl_check_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_zero(sk) OPENSSL_sk_zero(ossl_check_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_delete(sk, i) ((ADMISSIONS *)OPENSSL_sk_delete(ossl_check_ADMISSIONS_sk_type(sk), (i))) +#define sk_ADMISSIONS_delete_ptr(sk, ptr) ((ADMISSIONS *)OPENSSL_sk_delete_ptr(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr))) +#define sk_ADMISSIONS_push(sk, ptr) OPENSSL_sk_push(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr)) +#define sk_ADMISSIONS_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr)) +#define sk_ADMISSIONS_pop(sk) ((ADMISSIONS *)OPENSSL_sk_pop(ossl_check_ADMISSIONS_sk_type(sk))) +#define sk_ADMISSIONS_shift(sk) ((ADMISSIONS *)OPENSSL_sk_shift(ossl_check_ADMISSIONS_sk_type(sk))) +#define sk_ADMISSIONS_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_ADMISSIONS_sk_type(sk),ossl_check_ADMISSIONS_freefunc_type(freefunc)) +#define sk_ADMISSIONS_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr), (idx)) +#define sk_ADMISSIONS_set(sk, idx, ptr) ((ADMISSIONS *)OPENSSL_sk_set(ossl_check_ADMISSIONS_sk_type(sk), (idx), ossl_check_ADMISSIONS_type(ptr))) +#define sk_ADMISSIONS_find(sk, ptr) OPENSSL_sk_find(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr)) +#define sk_ADMISSIONS_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr)) +#define sk_ADMISSIONS_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_type(ptr), pnum) +#define sk_ADMISSIONS_sort(sk) OPENSSL_sk_sort(ossl_check_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_ADMISSIONS_sk_type(sk)) +#define sk_ADMISSIONS_dup(sk) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_dup(ossl_check_const_ADMISSIONS_sk_type(sk))) +#define sk_ADMISSIONS_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(ADMISSIONS) *)OPENSSL_sk_deep_copy(ossl_check_const_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_copyfunc_type(copyfunc), ossl_check_ADMISSIONS_freefunc_type(freefunc))) +#define sk_ADMISSIONS_set_cmp_func(sk, cmp) ((sk_ADMISSIONS_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_ADMISSIONS_sk_type(sk), ossl_check_ADMISSIONS_compfunc_type(cmp))) + +/* clang-format on */ +typedef STACK_OF(PROFESSION_INFO) PROFESSION_INFOS; + +const ASN1_OBJECT *NAMING_AUTHORITY_get0_authorityId( + const NAMING_AUTHORITY *n); +const ASN1_IA5STRING *NAMING_AUTHORITY_get0_authorityURL( + const NAMING_AUTHORITY *n); +const ASN1_STRING *NAMING_AUTHORITY_get0_authorityText( + const NAMING_AUTHORITY *n); +void NAMING_AUTHORITY_set0_authorityId(NAMING_AUTHORITY *n, + ASN1_OBJECT *namingAuthorityId); +void NAMING_AUTHORITY_set0_authorityURL(NAMING_AUTHORITY *n, + ASN1_IA5STRING *namingAuthorityUrl); +void NAMING_AUTHORITY_set0_authorityText(NAMING_AUTHORITY *n, + ASN1_STRING *namingAuthorityText); + +const GENERAL_NAME *ADMISSION_SYNTAX_get0_admissionAuthority( + const ADMISSION_SYNTAX *as); +void ADMISSION_SYNTAX_set0_admissionAuthority( + ADMISSION_SYNTAX *as, GENERAL_NAME *aa); +const STACK_OF(ADMISSIONS) *ADMISSION_SYNTAX_get0_contentsOfAdmissions( + const ADMISSION_SYNTAX *as); +void ADMISSION_SYNTAX_set0_contentsOfAdmissions( + ADMISSION_SYNTAX *as, STACK_OF(ADMISSIONS) *a); +const GENERAL_NAME *ADMISSIONS_get0_admissionAuthority(const ADMISSIONS *a); +void ADMISSIONS_set0_admissionAuthority(ADMISSIONS *a, GENERAL_NAME *aa); +const NAMING_AUTHORITY *ADMISSIONS_get0_namingAuthority(const ADMISSIONS *a); +void ADMISSIONS_set0_namingAuthority(ADMISSIONS *a, NAMING_AUTHORITY *na); +const PROFESSION_INFOS *ADMISSIONS_get0_professionInfos(const ADMISSIONS *a); +void ADMISSIONS_set0_professionInfos(ADMISSIONS *a, PROFESSION_INFOS *pi); +const ASN1_OCTET_STRING *PROFESSION_INFO_get0_addProfessionInfo( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_addProfessionInfo( + PROFESSION_INFO *pi, ASN1_OCTET_STRING *aos); +const NAMING_AUTHORITY *PROFESSION_INFO_get0_namingAuthority( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_namingAuthority( + PROFESSION_INFO *pi, NAMING_AUTHORITY *na); +const STACK_OF(ASN1_STRING) *PROFESSION_INFO_get0_professionItems( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_professionItems( + PROFESSION_INFO *pi, STACK_OF(ASN1_STRING) *as); +const STACK_OF(ASN1_OBJECT) *PROFESSION_INFO_get0_professionOIDs( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_professionOIDs( + PROFESSION_INFO *pi, STACK_OF(ASN1_OBJECT) *po); +const ASN1_PRINTABLESTRING *PROFESSION_INFO_get0_registrationNumber( + const PROFESSION_INFO *pi); +void PROFESSION_INFO_set0_registrationNumber( + PROFESSION_INFO *pi, ASN1_PRINTABLESTRING *rn); + +int OSSL_GENERAL_NAMES_print(BIO *out, GENERAL_NAMES *gens, int indent); + +typedef STACK_OF(X509_ATTRIBUTE) OSSL_ATTRIBUTES_SYNTAX; +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTES_SYNTAX) + +typedef STACK_OF(USERNOTICE) OSSL_USER_NOTICE_SYNTAX; +DECLARE_ASN1_FUNCTIONS(OSSL_USER_NOTICE_SYNTAX) + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(USERNOTICE, USERNOTICE, USERNOTICE) +#define sk_USERNOTICE_num(sk) OPENSSL_sk_num(ossl_check_const_USERNOTICE_sk_type(sk)) +#define sk_USERNOTICE_value(sk, idx) ((USERNOTICE *)OPENSSL_sk_value(ossl_check_const_USERNOTICE_sk_type(sk), (idx))) +#define sk_USERNOTICE_new(cmp) ((STACK_OF(USERNOTICE) *)OPENSSL_sk_new(ossl_check_USERNOTICE_compfunc_type(cmp))) +#define sk_USERNOTICE_new_null() ((STACK_OF(USERNOTICE) *)OPENSSL_sk_new_null()) +#define sk_USERNOTICE_new_reserve(cmp, n) ((STACK_OF(USERNOTICE) *)OPENSSL_sk_new_reserve(ossl_check_USERNOTICE_compfunc_type(cmp), (n))) +#define sk_USERNOTICE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_USERNOTICE_sk_type(sk), (n)) +#define sk_USERNOTICE_free(sk) OPENSSL_sk_free(ossl_check_USERNOTICE_sk_type(sk)) +#define sk_USERNOTICE_zero(sk) OPENSSL_sk_zero(ossl_check_USERNOTICE_sk_type(sk)) +#define sk_USERNOTICE_delete(sk, i) ((USERNOTICE *)OPENSSL_sk_delete(ossl_check_USERNOTICE_sk_type(sk), (i))) +#define sk_USERNOTICE_delete_ptr(sk, ptr) ((USERNOTICE *)OPENSSL_sk_delete_ptr(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_type(ptr))) +#define sk_USERNOTICE_push(sk, ptr) OPENSSL_sk_push(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_type(ptr)) +#define sk_USERNOTICE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_type(ptr)) +#define sk_USERNOTICE_pop(sk) ((USERNOTICE *)OPENSSL_sk_pop(ossl_check_USERNOTICE_sk_type(sk))) +#define sk_USERNOTICE_shift(sk) ((USERNOTICE *)OPENSSL_sk_shift(ossl_check_USERNOTICE_sk_type(sk))) +#define sk_USERNOTICE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_USERNOTICE_sk_type(sk),ossl_check_USERNOTICE_freefunc_type(freefunc)) +#define sk_USERNOTICE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_type(ptr), (idx)) +#define sk_USERNOTICE_set(sk, idx, ptr) ((USERNOTICE *)OPENSSL_sk_set(ossl_check_USERNOTICE_sk_type(sk), (idx), ossl_check_USERNOTICE_type(ptr))) +#define sk_USERNOTICE_find(sk, ptr) OPENSSL_sk_find(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_type(ptr)) +#define sk_USERNOTICE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_type(ptr)) +#define sk_USERNOTICE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_type(ptr), pnum) +#define sk_USERNOTICE_sort(sk) OPENSSL_sk_sort(ossl_check_USERNOTICE_sk_type(sk)) +#define sk_USERNOTICE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_USERNOTICE_sk_type(sk)) +#define sk_USERNOTICE_dup(sk) ((STACK_OF(USERNOTICE) *)OPENSSL_sk_dup(ossl_check_const_USERNOTICE_sk_type(sk))) +#define sk_USERNOTICE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(USERNOTICE) *)OPENSSL_sk_deep_copy(ossl_check_const_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_copyfunc_type(copyfunc), ossl_check_USERNOTICE_freefunc_type(freefunc))) +#define sk_USERNOTICE_set_cmp_func(sk, cmp) ((sk_USERNOTICE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_USERNOTICE_sk_type(sk), ossl_check_USERNOTICE_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct OSSL_ROLE_SPEC_CERT_ID_st { + GENERAL_NAME *roleName; + GENERAL_NAME *roleCertIssuer; + ASN1_INTEGER *roleCertSerialNumber; + GENERAL_NAMES *roleCertLocator; +} OSSL_ROLE_SPEC_CERT_ID; + +DECLARE_ASN1_FUNCTIONS(OSSL_ROLE_SPEC_CERT_ID) + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ROLE_SPEC_CERT_ID, OSSL_ROLE_SPEC_CERT_ID, OSSL_ROLE_SPEC_CERT_ID) +#define sk_OSSL_ROLE_SPEC_CERT_ID_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_value(sk, idx) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_value(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (idx))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_new(cmp) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_new(ossl_check_OSSL_ROLE_SPEC_CERT_ID_compfunc_type(cmp))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_new_null() ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ROLE_SPEC_CERT_ID_new_reserve(cmp, n) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ROLE_SPEC_CERT_ID_compfunc_type(cmp), (n))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (n)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_delete(sk, i) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_delete(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (i))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_delete_ptr(sk, ptr) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_pop(sk) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_pop(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_shift(sk) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_shift(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk),ossl_check_OSSL_ROLE_SPEC_CERT_ID_freefunc_type(freefunc)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr), (idx)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_set(sk, idx, ptr) ((OSSL_ROLE_SPEC_CERT_ID *)OPENSSL_sk_set(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), (idx), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_type(ptr), pnum) +#define sk_OSSL_ROLE_SPEC_CERT_ID_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk)) +#define sk_OSSL_ROLE_SPEC_CERT_ID_dup(sk) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ROLE_SPEC_CERT_ID) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_copyfunc_type(copyfunc), ossl_check_OSSL_ROLE_SPEC_CERT_ID_freefunc_type(freefunc))) +#define sk_OSSL_ROLE_SPEC_CERT_ID_set_cmp_func(sk, cmp) ((sk_OSSL_ROLE_SPEC_CERT_ID_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ROLE_SPEC_CERT_ID_sk_type(sk), ossl_check_OSSL_ROLE_SPEC_CERT_ID_compfunc_type(cmp))) + +/* clang-format on */ + +typedef STACK_OF(OSSL_ROLE_SPEC_CERT_ID) OSSL_ROLE_SPEC_CERT_ID_SYNTAX; + +DECLARE_ASN1_FUNCTIONS(OSSL_ROLE_SPEC_CERT_ID_SYNTAX) +typedef struct OSSL_HASH_st { + X509_ALGOR *algorithmIdentifier; + ASN1_BIT_STRING *hashValue; +} OSSL_HASH; + +typedef struct OSSL_INFO_SYNTAX_POINTER_st { + GENERAL_NAMES *name; + OSSL_HASH *hash; +} OSSL_INFO_SYNTAX_POINTER; + +#define OSSL_INFO_SYNTAX_TYPE_CONTENT 0 +#define OSSL_INFO_SYNTAX_TYPE_POINTER 1 + +typedef struct OSSL_INFO_SYNTAX_st { + int type; + union { + ASN1_STRING *content; + OSSL_INFO_SYNTAX_POINTER *pointer; + } choice; +} OSSL_INFO_SYNTAX; + +typedef struct OSSL_PRIVILEGE_POLICY_ID_st { + ASN1_OBJECT *privilegePolicy; + OSSL_INFO_SYNTAX *privPolSyntax; +} OSSL_PRIVILEGE_POLICY_ID; + +typedef struct OSSL_ATTRIBUTE_DESCRIPTOR_st { + ASN1_OBJECT *identifier; + ASN1_STRING *attributeSyntax; + ASN1_UTF8STRING *name; + ASN1_UTF8STRING *description; + OSSL_PRIVILEGE_POLICY_ID *dominationRule; +} OSSL_ATTRIBUTE_DESCRIPTOR; + +DECLARE_ASN1_FUNCTIONS(OSSL_HASH) +DECLARE_ASN1_FUNCTIONS(OSSL_INFO_SYNTAX) +DECLARE_ASN1_FUNCTIONS(OSSL_INFO_SYNTAX_POINTER) +DECLARE_ASN1_FUNCTIONS(OSSL_PRIVILEGE_POLICY_ID) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_DESCRIPTOR) + +typedef struct OSSL_TIME_SPEC_ABSOLUTE_st { + ASN1_GENERALIZEDTIME *startTime; + ASN1_GENERALIZEDTIME *endTime; +} OSSL_TIME_SPEC_ABSOLUTE; + +typedef struct OSSL_DAY_TIME_st { + ASN1_INTEGER *hour; + ASN1_INTEGER *minute; + ASN1_INTEGER *second; +} OSSL_DAY_TIME; + +typedef struct OSSL_DAY_TIME_BAND_st { + OSSL_DAY_TIME *startDayTime; + OSSL_DAY_TIME *endDayTime; +} OSSL_DAY_TIME_BAND; + +#define OSSL_NAMED_DAY_TYPE_INT 0 +#define OSSL_NAMED_DAY_TYPE_BIT 1 +#define OSSL_NAMED_DAY_INT_SUN 1 +#define OSSL_NAMED_DAY_INT_MON 2 +#define OSSL_NAMED_DAY_INT_TUE 3 +#define OSSL_NAMED_DAY_INT_WED 4 +#define OSSL_NAMED_DAY_INT_THU 5 +#define OSSL_NAMED_DAY_INT_FRI 6 +#define OSSL_NAMED_DAY_INT_SAT 7 +#define OSSL_NAMED_DAY_BIT_SUN 0 +#define OSSL_NAMED_DAY_BIT_MON 1 +#define OSSL_NAMED_DAY_BIT_TUE 2 +#define OSSL_NAMED_DAY_BIT_WED 3 +#define OSSL_NAMED_DAY_BIT_THU 4 +#define OSSL_NAMED_DAY_BIT_FRI 5 +#define OSSL_NAMED_DAY_BIT_SAT 6 + +typedef struct OSSL_NAMED_DAY_st { + int type; + union { + ASN1_INTEGER *intNamedDays; + ASN1_BIT_STRING *bitNamedDays; + } choice; +} OSSL_NAMED_DAY; + +#define OSSL_TIME_SPEC_X_DAY_OF_FIRST 0 +#define OSSL_TIME_SPEC_X_DAY_OF_SECOND 1 +#define OSSL_TIME_SPEC_X_DAY_OF_THIRD 2 +#define OSSL_TIME_SPEC_X_DAY_OF_FOURTH 3 +#define OSSL_TIME_SPEC_X_DAY_OF_FIFTH 4 + +typedef struct OSSL_TIME_SPEC_X_DAY_OF_st { + int type; + union { + OSSL_NAMED_DAY *first; + OSSL_NAMED_DAY *second; + OSSL_NAMED_DAY *third; + OSSL_NAMED_DAY *fourth; + OSSL_NAMED_DAY *fifth; + } choice; +} OSSL_TIME_SPEC_X_DAY_OF; + +#define OSSL_TIME_SPEC_DAY_TYPE_INT 0 +#define OSSL_TIME_SPEC_DAY_TYPE_BIT 1 +#define OSSL_TIME_SPEC_DAY_TYPE_DAY_OF 2 +#define OSSL_TIME_SPEC_DAY_BIT_SUN 0 +#define OSSL_TIME_SPEC_DAY_BIT_MON 1 +#define OSSL_TIME_SPEC_DAY_BIT_TUE 2 +#define OSSL_TIME_SPEC_DAY_BIT_WED 3 +#define OSSL_TIME_SPEC_DAY_BIT_THU 4 +#define OSSL_TIME_SPEC_DAY_BIT_FRI 5 +#define OSSL_TIME_SPEC_DAY_BIT_SAT 6 +#define OSSL_TIME_SPEC_DAY_INT_SUN 1 +#define OSSL_TIME_SPEC_DAY_INT_MON 2 +#define OSSL_TIME_SPEC_DAY_INT_TUE 3 +#define OSSL_TIME_SPEC_DAY_INT_WED 4 +#define OSSL_TIME_SPEC_DAY_INT_THU 5 +#define OSSL_TIME_SPEC_DAY_INT_FRI 6 +#define OSSL_TIME_SPEC_DAY_INT_SAT 7 + +typedef struct OSSL_TIME_SPEC_DAY_st { + int type; + union { + STACK_OF(ASN1_INTEGER) *intDay; + ASN1_BIT_STRING *bitDay; + OSSL_TIME_SPEC_X_DAY_OF *dayOf; + } choice; +} OSSL_TIME_SPEC_DAY; + +#define OSSL_TIME_SPEC_WEEKS_TYPE_ALL 0 +#define OSSL_TIME_SPEC_WEEKS_TYPE_INT 1 +#define OSSL_TIME_SPEC_WEEKS_TYPE_BIT 2 +#define OSSL_TIME_SPEC_BIT_WEEKS_1 0 +#define OSSL_TIME_SPEC_BIT_WEEKS_2 1 +#define OSSL_TIME_SPEC_BIT_WEEKS_3 2 +#define OSSL_TIME_SPEC_BIT_WEEKS_4 3 +#define OSSL_TIME_SPEC_BIT_WEEKS_5 4 + +typedef struct OSSL_TIME_SPEC_WEEKS_st { + int type; + union { + ASN1_NULL *allWeeks; + STACK_OF(ASN1_INTEGER) *intWeek; + ASN1_BIT_STRING *bitWeek; + } choice; +} OSSL_TIME_SPEC_WEEKS; + +#define OSSL_TIME_SPEC_MONTH_TYPE_ALL 0 +#define OSSL_TIME_SPEC_MONTH_TYPE_INT 1 +#define OSSL_TIME_SPEC_MONTH_TYPE_BIT 2 +#define OSSL_TIME_SPEC_INT_MONTH_JAN 1 +#define OSSL_TIME_SPEC_INT_MONTH_FEB 2 +#define OSSL_TIME_SPEC_INT_MONTH_MAR 3 +#define OSSL_TIME_SPEC_INT_MONTH_APR 4 +#define OSSL_TIME_SPEC_INT_MONTH_MAY 5 +#define OSSL_TIME_SPEC_INT_MONTH_JUN 6 +#define OSSL_TIME_SPEC_INT_MONTH_JUL 7 +#define OSSL_TIME_SPEC_INT_MONTH_AUG 8 +#define OSSL_TIME_SPEC_INT_MONTH_SEP 9 +#define OSSL_TIME_SPEC_INT_MONTH_OCT 10 +#define OSSL_TIME_SPEC_INT_MONTH_NOV 11 +#define OSSL_TIME_SPEC_INT_MONTH_DEC 12 +#define OSSL_TIME_SPEC_BIT_MONTH_JAN 0 +#define OSSL_TIME_SPEC_BIT_MONTH_FEB 1 +#define OSSL_TIME_SPEC_BIT_MONTH_MAR 2 +#define OSSL_TIME_SPEC_BIT_MONTH_APR 3 +#define OSSL_TIME_SPEC_BIT_MONTH_MAY 4 +#define OSSL_TIME_SPEC_BIT_MONTH_JUN 5 +#define OSSL_TIME_SPEC_BIT_MONTH_JUL 6 +#define OSSL_TIME_SPEC_BIT_MONTH_AUG 7 +#define OSSL_TIME_SPEC_BIT_MONTH_SEP 8 +#define OSSL_TIME_SPEC_BIT_MONTH_OCT 9 +#define OSSL_TIME_SPEC_BIT_MONTH_NOV 10 +#define OSSL_TIME_SPEC_BIT_MONTH_DEC 11 + +typedef struct OSSL_TIME_SPEC_MONTH_st { + int type; + union { + ASN1_NULL *allMonths; + STACK_OF(ASN1_INTEGER) *intMonth; + ASN1_BIT_STRING *bitMonth; + } choice; +} OSSL_TIME_SPEC_MONTH; + +typedef struct OSSL_TIME_PERIOD_st { + STACK_OF(OSSL_DAY_TIME_BAND) *timesOfDay; + OSSL_TIME_SPEC_DAY *days; + OSSL_TIME_SPEC_WEEKS *weeks; + OSSL_TIME_SPEC_MONTH *months; + STACK_OF(ASN1_INTEGER) *years; +} OSSL_TIME_PERIOD; + +#define OSSL_TIME_SPEC_TIME_TYPE_ABSOLUTE 0 +#define OSSL_TIME_SPEC_TIME_TYPE_PERIODIC 1 + +typedef struct OSSL_TIME_SPEC_TIME_st { + int type; + union { + OSSL_TIME_SPEC_ABSOLUTE *absolute; + STACK_OF(OSSL_TIME_PERIOD) *periodic; + } choice; +} OSSL_TIME_SPEC_TIME; + +typedef struct OSSL_TIME_SPEC_st { + OSSL_TIME_SPEC_TIME *time; + ASN1_BOOLEAN notThisTime; + ASN1_INTEGER *timeZone; +} OSSL_TIME_SPEC; + +DECLARE_ASN1_FUNCTIONS(OSSL_DAY_TIME) +DECLARE_ASN1_FUNCTIONS(OSSL_DAY_TIME_BAND) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_DAY) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_WEEKS) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_MONTH) +DECLARE_ASN1_FUNCTIONS(OSSL_NAMED_DAY) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_X_DAY_OF) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_ABSOLUTE) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC_TIME) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_SPEC) +DECLARE_ASN1_FUNCTIONS(OSSL_TIME_PERIOD) + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_TIME_PERIOD, OSSL_TIME_PERIOD, OSSL_TIME_PERIOD) +#define sk_OSSL_TIME_PERIOD_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_value(sk, idx) ((OSSL_TIME_PERIOD *)OPENSSL_sk_value(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk), (idx))) +#define sk_OSSL_TIME_PERIOD_new(cmp) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_new(ossl_check_OSSL_TIME_PERIOD_compfunc_type(cmp))) +#define sk_OSSL_TIME_PERIOD_new_null() ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_new_null()) +#define sk_OSSL_TIME_PERIOD_new_reserve(cmp, n) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_TIME_PERIOD_compfunc_type(cmp), (n))) +#define sk_OSSL_TIME_PERIOD_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), (n)) +#define sk_OSSL_TIME_PERIOD_free(sk) OPENSSL_sk_free(ossl_check_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_delete(sk, i) ((OSSL_TIME_PERIOD *)OPENSSL_sk_delete(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), (i))) +#define sk_OSSL_TIME_PERIOD_delete_ptr(sk, ptr) ((OSSL_TIME_PERIOD *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr))) +#define sk_OSSL_TIME_PERIOD_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr)) +#define sk_OSSL_TIME_PERIOD_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr)) +#define sk_OSSL_TIME_PERIOD_pop(sk) ((OSSL_TIME_PERIOD *)OPENSSL_sk_pop(ossl_check_OSSL_TIME_PERIOD_sk_type(sk))) +#define sk_OSSL_TIME_PERIOD_shift(sk) ((OSSL_TIME_PERIOD *)OPENSSL_sk_shift(ossl_check_OSSL_TIME_PERIOD_sk_type(sk))) +#define sk_OSSL_TIME_PERIOD_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_TIME_PERIOD_sk_type(sk),ossl_check_OSSL_TIME_PERIOD_freefunc_type(freefunc)) +#define sk_OSSL_TIME_PERIOD_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr), (idx)) +#define sk_OSSL_TIME_PERIOD_set(sk, idx, ptr) ((OSSL_TIME_PERIOD *)OPENSSL_sk_set(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), (idx), ossl_check_OSSL_TIME_PERIOD_type(ptr))) +#define sk_OSSL_TIME_PERIOD_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr)) +#define sk_OSSL_TIME_PERIOD_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr)) +#define sk_OSSL_TIME_PERIOD_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_type(ptr), pnum) +#define sk_OSSL_TIME_PERIOD_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk)) +#define sk_OSSL_TIME_PERIOD_dup(sk) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_dup(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk))) +#define sk_OSSL_TIME_PERIOD_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_TIME_PERIOD) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_copyfunc_type(copyfunc), ossl_check_OSSL_TIME_PERIOD_freefunc_type(freefunc))) +#define sk_OSSL_TIME_PERIOD_set_cmp_func(sk, cmp) ((sk_OSSL_TIME_PERIOD_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_TIME_PERIOD_sk_type(sk), ossl_check_OSSL_TIME_PERIOD_compfunc_type(cmp))) + +/* clang-format on */ + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_DAY_TIME_BAND, OSSL_DAY_TIME_BAND, OSSL_DAY_TIME_BAND) +#define sk_OSSL_DAY_TIME_BAND_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_value(sk, idx) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_value(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk), (idx))) +#define sk_OSSL_DAY_TIME_BAND_new(cmp) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_new(ossl_check_OSSL_DAY_TIME_BAND_compfunc_type(cmp))) +#define sk_OSSL_DAY_TIME_BAND_new_null() ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_new_null()) +#define sk_OSSL_DAY_TIME_BAND_new_reserve(cmp, n) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_DAY_TIME_BAND_compfunc_type(cmp), (n))) +#define sk_OSSL_DAY_TIME_BAND_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), (n)) +#define sk_OSSL_DAY_TIME_BAND_free(sk) OPENSSL_sk_free(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_delete(sk, i) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_delete(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), (i))) +#define sk_OSSL_DAY_TIME_BAND_delete_ptr(sk, ptr) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr))) +#define sk_OSSL_DAY_TIME_BAND_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr)) +#define sk_OSSL_DAY_TIME_BAND_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr)) +#define sk_OSSL_DAY_TIME_BAND_pop(sk) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_pop(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk))) +#define sk_OSSL_DAY_TIME_BAND_shift(sk) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_shift(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk))) +#define sk_OSSL_DAY_TIME_BAND_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk),ossl_check_OSSL_DAY_TIME_BAND_freefunc_type(freefunc)) +#define sk_OSSL_DAY_TIME_BAND_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr), (idx)) +#define sk_OSSL_DAY_TIME_BAND_set(sk, idx, ptr) ((OSSL_DAY_TIME_BAND *)OPENSSL_sk_set(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), (idx), ossl_check_OSSL_DAY_TIME_BAND_type(ptr))) +#define sk_OSSL_DAY_TIME_BAND_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr)) +#define sk_OSSL_DAY_TIME_BAND_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr)) +#define sk_OSSL_DAY_TIME_BAND_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_type(ptr), pnum) +#define sk_OSSL_DAY_TIME_BAND_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk)) +#define sk_OSSL_DAY_TIME_BAND_dup(sk) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_dup(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk))) +#define sk_OSSL_DAY_TIME_BAND_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_DAY_TIME_BAND) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_copyfunc_type(copyfunc), ossl_check_OSSL_DAY_TIME_BAND_freefunc_type(freefunc))) +#define sk_OSSL_DAY_TIME_BAND_set_cmp_func(sk, cmp) ((sk_OSSL_DAY_TIME_BAND_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_DAY_TIME_BAND_sk_type(sk), ossl_check_OSSL_DAY_TIME_BAND_compfunc_type(cmp))) + +/* clang-format on */ + +/* Attribute Type and Value */ +typedef struct atav_st { + ASN1_OBJECT *type; + ASN1_TYPE *value; +} OSSL_ATAV; + +typedef struct ATTRIBUTE_TYPE_MAPPING_st { + ASN1_OBJECT *local; + ASN1_OBJECT *remote; +} OSSL_ATTRIBUTE_TYPE_MAPPING; + +typedef struct ATTRIBUTE_VALUE_MAPPING_st { + OSSL_ATAV *local; + OSSL_ATAV *remote; +} OSSL_ATTRIBUTE_VALUE_MAPPING; + +#define OSSL_ATTR_MAP_TYPE 0 +#define OSSL_ATTR_MAP_VALUE 1 + +typedef struct ATTRIBUTE_MAPPING_st { + int type; + union { + OSSL_ATTRIBUTE_TYPE_MAPPING *typeMappings; + OSSL_ATTRIBUTE_VALUE_MAPPING *typeValueMappings; + } choice; +} OSSL_ATTRIBUTE_MAPPING; + +typedef STACK_OF(OSSL_ATTRIBUTE_MAPPING) OSSL_ATTRIBUTE_MAPPINGS; +DECLARE_ASN1_FUNCTIONS(OSSL_ATAV) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_TYPE_MAPPING) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_VALUE_MAPPING) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_MAPPING) +DECLARE_ASN1_FUNCTIONS(OSSL_ATTRIBUTE_MAPPINGS) + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ATTRIBUTE_MAPPING, OSSL_ATTRIBUTE_MAPPING, OSSL_ATTRIBUTE_MAPPING) +#define sk_OSSL_ATTRIBUTE_MAPPING_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_value(sk, idx) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_value(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (idx))) +#define sk_OSSL_ATTRIBUTE_MAPPING_new(cmp) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_new(ossl_check_OSSL_ATTRIBUTE_MAPPING_compfunc_type(cmp))) +#define sk_OSSL_ATTRIBUTE_MAPPING_new_null() ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ATTRIBUTE_MAPPING_new_reserve(cmp, n) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ATTRIBUTE_MAPPING_compfunc_type(cmp), (n))) +#define sk_OSSL_ATTRIBUTE_MAPPING_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (n)) +#define sk_OSSL_ATTRIBUTE_MAPPING_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_delete(sk, i) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_delete(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (i))) +#define sk_OSSL_ATTRIBUTE_MAPPING_delete_ptr(sk, ptr) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr))) +#define sk_OSSL_ATTRIBUTE_MAPPING_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr)) +#define sk_OSSL_ATTRIBUTE_MAPPING_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr)) +#define sk_OSSL_ATTRIBUTE_MAPPING_pop(sk) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_pop(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk))) +#define sk_OSSL_ATTRIBUTE_MAPPING_shift(sk) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_shift(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk))) +#define sk_OSSL_ATTRIBUTE_MAPPING_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk),ossl_check_OSSL_ATTRIBUTE_MAPPING_freefunc_type(freefunc)) +#define sk_OSSL_ATTRIBUTE_MAPPING_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr), (idx)) +#define sk_OSSL_ATTRIBUTE_MAPPING_set(sk, idx, ptr) ((OSSL_ATTRIBUTE_MAPPING *)OPENSSL_sk_set(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), (idx), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr))) +#define sk_OSSL_ATTRIBUTE_MAPPING_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr)) +#define sk_OSSL_ATTRIBUTE_MAPPING_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr)) +#define sk_OSSL_ATTRIBUTE_MAPPING_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_type(ptr), pnum) +#define sk_OSSL_ATTRIBUTE_MAPPING_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk)) +#define sk_OSSL_ATTRIBUTE_MAPPING_dup(sk) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk))) +#define sk_OSSL_ATTRIBUTE_MAPPING_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ATTRIBUTE_MAPPING) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_copyfunc_type(copyfunc), ossl_check_OSSL_ATTRIBUTE_MAPPING_freefunc_type(freefunc))) +#define sk_OSSL_ATTRIBUTE_MAPPING_set_cmp_func(sk, cmp) ((sk_OSSL_ATTRIBUTE_MAPPING_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ATTRIBUTE_MAPPING_sk_type(sk), ossl_check_OSSL_ATTRIBUTE_MAPPING_compfunc_type(cmp))) + +/* clang-format on */ + +#define OSSL_AAA_ATTRIBUTE_TYPE 0 +#define OSSL_AAA_ATTRIBUTE_VALUES 1 + +typedef struct ALLOWED_ATTRIBUTES_CHOICE_st { + int type; + union { + ASN1_OBJECT *attributeType; + X509_ATTRIBUTE *attributeTypeandValues; + } choice; +} OSSL_ALLOWED_ATTRIBUTES_CHOICE; + +typedef struct ALLOWED_ATTRIBUTES_ITEM_st { + STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *attributes; + GENERAL_NAME *holderDomain; +} OSSL_ALLOWED_ATTRIBUTES_ITEM; + +typedef STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) OSSL_ALLOWED_ATTRIBUTES_SYNTAX; + +DECLARE_ASN1_FUNCTIONS(OSSL_ALLOWED_ATTRIBUTES_CHOICE) +DECLARE_ASN1_FUNCTIONS(OSSL_ALLOWED_ATTRIBUTES_ITEM) +DECLARE_ASN1_FUNCTIONS(OSSL_ALLOWED_ATTRIBUTES_SYNTAX) + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ALLOWED_ATTRIBUTES_CHOICE, OSSL_ALLOWED_ATTRIBUTES_CHOICE, OSSL_ALLOWED_ATTRIBUTES_CHOICE) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_value(sk, idx) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_value(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (idx))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_new(cmp) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_new(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc_type(cmp))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_new_null() ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_new_reserve(cmp, n) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc_type(cmp), (n))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (n)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_delete(sk, i) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_delete(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (i))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_delete_ptr(sk, ptr) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_pop(sk) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_pop(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_shift(sk) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_shift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk),ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_freefunc_type(freefunc)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr), (idx)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_set(sk, idx, ptr) ((OSSL_ALLOWED_ATTRIBUTES_CHOICE *)OPENSSL_sk_set(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), (idx), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_type(ptr), pnum) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_dup(sk) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_CHOICE) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_copyfunc_type(copyfunc), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_freefunc_type(freefunc))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_set_cmp_func(sk, cmp) ((sk_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_CHOICE_compfunc_type(cmp))) + +/* clang-format on */ + +/* clang-format off */ +SKM_DEFINE_STACK_OF_INTERNAL(OSSL_ALLOWED_ATTRIBUTES_ITEM, OSSL_ALLOWED_ATTRIBUTES_ITEM, OSSL_ALLOWED_ATTRIBUTES_ITEM) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_num(sk) OPENSSL_sk_num(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_value(sk, idx) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_value(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (idx))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_new(cmp) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_new(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc_type(cmp))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_new_null() ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_new_null()) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_new_reserve(cmp, n) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_new_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc_type(cmp), (n))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (n)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_free(sk) OPENSSL_sk_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_zero(sk) OPENSSL_sk_zero(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_delete(sk, i) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_delete(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (i))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_delete_ptr(sk, ptr) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_delete_ptr(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_push(sk, ptr) OPENSSL_sk_push(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_pop(sk) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_pop(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_shift(sk) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_shift(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk),ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_freefunc_type(freefunc)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr), (idx)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_set(sk, idx, ptr) ((OSSL_ALLOWED_ATTRIBUTES_ITEM *)OPENSSL_sk_set(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), (idx), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_find(sk, ptr) OPENSSL_sk_find(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_type(ptr), pnum) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_sort(sk) OPENSSL_sk_sort(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk)) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_dup(sk) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_dup(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(OSSL_ALLOWED_ATTRIBUTES_ITEM) *)OPENSSL_sk_deep_copy(ossl_check_const_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_copyfunc_type(copyfunc), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_freefunc_type(freefunc))) +#define sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_set_cmp_func(sk, cmp) ((sk_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_sk_type(sk), ossl_check_OSSL_ALLOWED_ATTRIBUTES_ITEM_compfunc_type(cmp))) + +/* clang-format on */ + +typedef struct AA_DIST_POINT_st { + DIST_POINT_NAME *distpoint; + ASN1_BIT_STRING *reasons; + int dp_reasons; + ASN1_BOOLEAN indirectCRL; + ASN1_BOOLEAN containsUserAttributeCerts; + ASN1_BOOLEAN containsAACerts; + ASN1_BOOLEAN containsSOAPublicKeyCerts; +} OSSL_AA_DIST_POINT; + +DECLARE_ASN1_FUNCTIONS(OSSL_AA_DIST_POINT) + +#ifdef __cplusplus +} +#endif +#endif diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/progs.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/progs.h new file mode 100644 index 000000000000..2214340fa813 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/include/progs.h @@ -0,0 +1,125 @@ +/* + * WARNING: do not edit! + * Generated by apps/progs.pl + * + * Copyright 1995-2026 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "function.h" + +extern int asn1parse_main(int argc, char *argv[]); +extern int ca_main(int argc, char *argv[]); +extern int ciphers_main(int argc, char *argv[]); +extern int cmp_main(int argc, char *argv[]); +extern int cms_main(int argc, char *argv[]); +extern int crl_main(int argc, char *argv[]); +extern int crl2pkcs7_main(int argc, char *argv[]); +extern int dgst_main(int argc, char *argv[]); +extern int dhparam_main(int argc, char *argv[]); +extern int dsa_main(int argc, char *argv[]); +extern int dsaparam_main(int argc, char *argv[]); +extern int ec_main(int argc, char *argv[]); +extern int ecparam_main(int argc, char *argv[]); +extern int enc_main(int argc, char *argv[]); +extern int engine_main(int argc, char *argv[]); +extern int errstr_main(int argc, char *argv[]); +extern int fipsinstall_main(int argc, char *argv[]); +extern int gendsa_main(int argc, char *argv[]); +extern int genpkey_main(int argc, char *argv[]); +extern int genrsa_main(int argc, char *argv[]); +extern int help_main(int argc, char *argv[]); +extern int info_main(int argc, char *argv[]); +extern int kdf_main(int argc, char *argv[]); +extern int list_main(int argc, char *argv[]); +extern int mac_main(int argc, char *argv[]); +extern int nseq_main(int argc, char *argv[]); +extern int ocsp_main(int argc, char *argv[]); +extern int passwd_main(int argc, char *argv[]); +extern int pkcs12_main(int argc, char *argv[]); +extern int pkcs7_main(int argc, char *argv[]); +extern int pkcs8_main(int argc, char *argv[]); +extern int pkey_main(int argc, char *argv[]); +extern int pkeyparam_main(int argc, char *argv[]); +extern int pkeyutl_main(int argc, char *argv[]); +extern int prime_main(int argc, char *argv[]); +extern int rand_main(int argc, char *argv[]); +extern int rehash_main(int argc, char *argv[]); +extern int req_main(int argc, char *argv[]); +extern int rsa_main(int argc, char *argv[]); +extern int rsautl_main(int argc, char *argv[]); +extern int s_client_main(int argc, char *argv[]); +extern int s_server_main(int argc, char *argv[]); +extern int s_time_main(int argc, char *argv[]); +extern int sess_id_main(int argc, char *argv[]); +extern int skeyutl_main(int argc, char *argv[]); +extern int smime_main(int argc, char *argv[]); +extern int speed_main(int argc, char *argv[]); +extern int spkac_main(int argc, char *argv[]); +extern int srp_main(int argc, char *argv[]); +extern int storeutl_main(int argc, char *argv[]); +extern int ts_main(int argc, char *argv[]); +extern int verify_main(int argc, char *argv[]); +extern int version_main(int argc, char *argv[]); +extern int x509_main(int argc, char *argv[]); + +extern const OPTIONS asn1parse_options[]; +extern const OPTIONS ca_options[]; +extern const OPTIONS ciphers_options[]; +extern const OPTIONS cmp_options[]; +extern const OPTIONS cms_options[]; +extern const OPTIONS crl_options[]; +extern const OPTIONS crl2pkcs7_options[]; +extern const OPTIONS dgst_options[]; +extern const OPTIONS dhparam_options[]; +extern const OPTIONS dsa_options[]; +extern const OPTIONS dsaparam_options[]; +extern const OPTIONS ec_options[]; +extern const OPTIONS ecparam_options[]; +extern const OPTIONS enc_options[]; +extern const OPTIONS engine_options[]; +extern const OPTIONS errstr_options[]; +extern const OPTIONS fipsinstall_options[]; +extern const OPTIONS gendsa_options[]; +extern const OPTIONS genpkey_options[]; +extern const OPTIONS genrsa_options[]; +extern const OPTIONS help_options[]; +extern const OPTIONS info_options[]; +extern const OPTIONS kdf_options[]; +extern const OPTIONS list_options[]; +extern const OPTIONS mac_options[]; +extern const OPTIONS nseq_options[]; +extern const OPTIONS ocsp_options[]; +extern const OPTIONS passwd_options[]; +extern const OPTIONS pkcs12_options[]; +extern const OPTIONS pkcs7_options[]; +extern const OPTIONS pkcs8_options[]; +extern const OPTIONS pkey_options[]; +extern const OPTIONS pkeyparam_options[]; +extern const OPTIONS pkeyutl_options[]; +extern const OPTIONS prime_options[]; +extern const OPTIONS rand_options[]; +extern const OPTIONS rehash_options[]; +extern const OPTIONS req_options[]; +extern const OPTIONS rsa_options[]; +extern const OPTIONS rsautl_options[]; +extern const OPTIONS s_client_options[]; +extern const OPTIONS s_server_options[]; +extern const OPTIONS s_time_options[]; +extern const OPTIONS sess_id_options[]; +extern const OPTIONS skeyutl_options[]; +extern const OPTIONS smime_options[]; +extern const OPTIONS speed_options[]; +extern const OPTIONS spkac_options[]; +extern const OPTIONS srp_options[]; +extern const OPTIONS storeutl_options[]; +extern const OPTIONS ts_options[]; +extern const OPTIONS verify_options[]; +extern const OPTIONS version_options[]; +extern const OPTIONS x509_options[]; + +extern FUNCTION functions[]; diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/openssl-cl.gypi b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/openssl-cl.gypi new file mode 100644 index 000000000000..d09b4d13fb69 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/openssl-cl.gypi @@ -0,0 +1,116 @@ +{ + 'variables': { + 'openssl_defines_linux64-riscv64': [ + 'NDEBUG', + 'OPENSSL_USE_NODELETE', + 'OPENSSL_BUILDING_OPENSSL', + 'BROTLI', + 'ZLIB', + 'ZSTD', + 'AES_ASM', + 'GHASH_ASM', + 'INCLUDE_C_CHACHA20', + 'INCLUDE_C_SHA256', + 'INCLUDE_C_SHA512', + 'OPENSSL_CPUID_OBJ', + 'OPENSSL_SM3_ASM', + 'SHA256_ASM', + 'SHA512_ASM', + 'SM4_ASM', + 'OPENSSL_PIC', + ], + 'openssl_cflags_linux64-riscv64': [ + '-Wa,--noexecstack', + '-Wall -O3', + '-pthread', + '-Wall -O3', + ], + 'openssl_ex_libs_linux64-riscv64': [ + '-lm -ldl -pthread', + ], + 'openssl_cli_srcs_linux64-riscv64': [ + 'openssl/apps/lib/cmp_mock_srv.c', + 'openssl/apps/asn1parse.c', + 'openssl/apps/ca.c', + 'openssl/apps/ciphers.c', + 'openssl/apps/cmp.c', + 'openssl/apps/cms.c', + 'openssl/apps/crl.c', + 'openssl/apps/crl2pkcs7.c', + 'openssl/apps/dgst.c', + 'openssl/apps/dhparam.c', + 'openssl/apps/dsa.c', + 'openssl/apps/dsaparam.c', + 'openssl/apps/ec.c', + 'openssl/apps/ecparam.c', + 'openssl/apps/enc.c', + 'openssl/apps/engine.c', + 'openssl/apps/errstr.c', + 'openssl/apps/fipsinstall.c', + 'openssl/apps/gendsa.c', + 'openssl/apps/genpkey.c', + 'openssl/apps/genrsa.c', + 'openssl/apps/info.c', + 'openssl/apps/kdf.c', + 'openssl/apps/list.c', + 'openssl/apps/mac.c', + 'openssl/apps/nseq.c', + 'openssl/apps/ocsp.c', + 'openssl/apps/openssl.c', + 'openssl/apps/passwd.c', + 'openssl/apps/pkcs12.c', + 'openssl/apps/pkcs7.c', + 'openssl/apps/pkcs8.c', + 'openssl/apps/pkey.c', + 'openssl/apps/pkeyparam.c', + 'openssl/apps/pkeyutl.c', + 'openssl/apps/prime.c', + './config/archs/linux64-riscv64/asm_avx2/apps/progs.c', + 'openssl/apps/rand.c', + 'openssl/apps/rehash.c', + 'openssl/apps/req.c', + 'openssl/apps/rsa.c', + 'openssl/apps/rsautl.c', + 'openssl/apps/s_client.c', + 'openssl/apps/s_server.c', + 'openssl/apps/s_time.c', + 'openssl/apps/sess_id.c', + 'openssl/apps/skeyutl.c', + 'openssl/apps/smime.c', + 'openssl/apps/speed.c', + 'openssl/apps/spkac.c', + 'openssl/apps/srp.c', + 'openssl/apps/storeutl.c', + 'openssl/apps/ts.c', + 'openssl/apps/verify.c', + 'openssl/apps/version.c', + 'openssl/apps/x509.c', + 'openssl/apps/lib/app_libctx.c', + 'openssl/apps/lib/app_params.c', + 'openssl/apps/lib/app_provider.c', + 'openssl/apps/lib/app_rand.c', + 'openssl/apps/lib/app_x509.c', + 'openssl/apps/lib/apps.c', + 'openssl/apps/lib/apps_opt_printf.c', + 'openssl/apps/lib/apps_ui.c', + 'openssl/apps/lib/columns.c', + 'openssl/apps/lib/engine.c', + 'openssl/apps/lib/engine_loader.c', + 'openssl/apps/lib/fmt.c', + 'openssl/apps/lib/http_server.c', + 'openssl/apps/lib/log.c', + 'openssl/apps/lib/names.c', + 'openssl/apps/lib/opt.c', + 'openssl/apps/lib/s_cb.c', + 'openssl/apps/lib/s_socket.c', + 'openssl/apps/lib/tlssrp_depr.c', + ], + }, + 'defines': ['<@(openssl_defines_linux64-riscv64)'], + 'include_dirs': [ + './include', + ], + 'cflags' : ['<@(openssl_cflags_linux64-riscv64)'], + 'libraries': ['<@(openssl_ex_libs_linux64-riscv64)'], + 'sources': ['<@(openssl_cli_srcs_linux64-riscv64)'], +} diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/openssl-fips.gypi b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/openssl-fips.gypi new file mode 100644 index 000000000000..35f8f5232642 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/openssl-fips.gypi @@ -0,0 +1,393 @@ +{ + 'variables': { + 'openssl_sources': [ + 'openssl/crypto/aes/aes_cbc.c', + 'openssl/crypto/aes/aes_ecb.c', + 'openssl/crypto/aes/aes_misc.c', + 'openssl/crypto/bn/bn_add.c', + 'openssl/crypto/bn/bn_asm.c', + 'openssl/crypto/bn/bn_blind.c', + 'openssl/crypto/bn/bn_const.c', + 'openssl/crypto/bn/bn_conv.c', + 'openssl/crypto/bn/bn_ctx.c', + 'openssl/crypto/bn/bn_dh.c', + 'openssl/crypto/bn/bn_div.c', + 'openssl/crypto/bn/bn_exp.c', + 'openssl/crypto/bn/bn_exp2.c', + 'openssl/crypto/bn/bn_gcd.c', + 'openssl/crypto/bn/bn_gf2m.c', + 'openssl/crypto/bn/bn_intern.c', + 'openssl/crypto/bn/bn_kron.c', + 'openssl/crypto/bn/bn_lib.c', + 'openssl/crypto/bn/bn_mod.c', + 'openssl/crypto/bn/bn_mont.c', + 'openssl/crypto/bn/bn_mpi.c', + 'openssl/crypto/bn/bn_mul.c', + 'openssl/crypto/bn/bn_nist.c', + 'openssl/crypto/bn/bn_prime.c', + 'openssl/crypto/bn/bn_rand.c', + 'openssl/crypto/bn/bn_recp.c', + 'openssl/crypto/bn/bn_rsa_fips186_4.c', + 'openssl/crypto/bn/bn_shift.c', + 'openssl/crypto/bn/bn_sqr.c', + 'openssl/crypto/bn/bn_sqrt.c', + 'openssl/crypto/bn/bn_word.c', + 'openssl/crypto/buffer/buffer.c', + 'openssl/crypto/cmac/cmac.c', + 'openssl/crypto/des/des_enc.c', + 'openssl/crypto/des/ecb3_enc.c', + 'openssl/crypto/des/fcrypt_b.c', + 'openssl/crypto/des/set_key.c', + 'openssl/crypto/dh/dh_backend.c', + 'openssl/crypto/dh/dh_check.c', + 'openssl/crypto/dh/dh_gen.c', + 'openssl/crypto/dh/dh_group_params.c', + 'openssl/crypto/dh/dh_kdf.c', + 'openssl/crypto/dh/dh_key.c', + 'openssl/crypto/dh/dh_lib.c', + 'openssl/crypto/dsa/dsa_backend.c', + 'openssl/crypto/dsa/dsa_check.c', + 'openssl/crypto/dsa/dsa_gen.c', + 'openssl/crypto/dsa/dsa_key.c', + 'openssl/crypto/dsa/dsa_lib.c', + 'openssl/crypto/dsa/dsa_ossl.c', + 'openssl/crypto/dsa/dsa_sign.c', + 'openssl/crypto/dsa/dsa_vrf.c', + 'openssl/crypto/ec/curve448/arch_32/f_impl32.c', + 'openssl/crypto/ec/curve448/arch_64/f_impl64.c', + 'openssl/crypto/ec/curve448/curve448.c', + 'openssl/crypto/ec/curve448/curve448_tables.c', + 'openssl/crypto/ec/curve448/eddsa.c', + 'openssl/crypto/ec/curve448/f_generic.c', + 'openssl/crypto/ec/curve448/scalar.c', + 'openssl/crypto/ec/curve25519.c', + 'openssl/crypto/ec/ec2_oct.c', + 'openssl/crypto/ec/ec2_smpl.c', + 'openssl/crypto/ec/ec_asn1.c', + 'openssl/crypto/ec/ec_backend.c', + 'openssl/crypto/ec/ec_check.c', + 'openssl/crypto/ec/ec_curve.c', + 'openssl/crypto/ec/ec_cvt.c', + 'openssl/crypto/ec/ec_key.c', + 'openssl/crypto/ec/ec_kmeth.c', + 'openssl/crypto/ec/ec_lib.c', + 'openssl/crypto/ec/ec_mult.c', + 'openssl/crypto/ec/ec_oct.c', + 'openssl/crypto/ec/ecdh_kdf.c', + 'openssl/crypto/ec/ecdh_ossl.c', + 'openssl/crypto/ec/ecdsa_ossl.c', + 'openssl/crypto/ec/ecdsa_sign.c', + 'openssl/crypto/ec/ecdsa_vrf.c', + 'openssl/crypto/ec/ecp_mont.c', + 'openssl/crypto/ec/ecp_nist.c', + 'openssl/crypto/ec/ecp_oct.c', + 'openssl/crypto/ec/ecp_smpl.c', + 'openssl/crypto/ec/ecx_backend.c', + 'openssl/crypto/ec/ecx_key.c', + 'openssl/crypto/evp/asymcipher.c', + 'openssl/crypto/evp/dh_support.c', + 'openssl/crypto/evp/digest.c', + 'openssl/crypto/evp/ec_support.c', + 'openssl/crypto/evp/evp_enc.c', + 'openssl/crypto/evp/evp_fetch.c', + 'openssl/crypto/evp/evp_lib.c', + 'openssl/crypto/evp/evp_rand.c', + 'openssl/crypto/evp/evp_utils.c', + 'openssl/crypto/evp/exchange.c', + 'openssl/crypto/evp/kdf_lib.c', + 'openssl/crypto/evp/kdf_meth.c', + 'openssl/crypto/evp/kem.c', + 'openssl/crypto/evp/keymgmt_lib.c', + 'openssl/crypto/evp/keymgmt_meth.c', + 'openssl/crypto/evp/mac_lib.c', + 'openssl/crypto/evp/mac_meth.c', + 'openssl/crypto/evp/p_lib.c', + 'openssl/crypto/evp/pmeth_check.c', + 'openssl/crypto/evp/pmeth_gn.c', + 'openssl/crypto/evp/pmeth_lib.c', + 'openssl/crypto/evp/s_lib.c', + 'openssl/crypto/evp/signature.c', + 'openssl/crypto/evp/skeymgmt_meth.c', + 'openssl/crypto/ffc/ffc_backend.c', + 'openssl/crypto/ffc/ffc_dh.c', + 'openssl/crypto/ffc/ffc_key_generate.c', + 'openssl/crypto/ffc/ffc_key_validate.c', + 'openssl/crypto/ffc/ffc_params.c', + 'openssl/crypto/ffc/ffc_params_generate.c', + 'openssl/crypto/ffc/ffc_params_validate.c', + 'openssl/crypto/hashtable/hashfunc.c', + 'openssl/crypto/hashtable/hashtable.c', + 'openssl/crypto/hmac/hmac.c', + 'openssl/crypto/lhash/lhash.c', + 'openssl/crypto/asn1_dsa.c', + 'openssl/crypto/bsearch.c', + 'openssl/crypto/context.c', + 'openssl/crypto/core_algorithm.c', + 'openssl/crypto/core_fetch.c', + 'openssl/crypto/core_namemap.c', + 'openssl/crypto/cpuid.c', + 'openssl/crypto/cryptlib.c', + 'openssl/crypto/ctype.c', + 'openssl/crypto/der_writer.c', + 'openssl/crypto/ex_data.c', + 'openssl/crypto/initthread.c', + 'openssl/crypto/o_str.c', + 'openssl/crypto/packet.c', + 'openssl/crypto/param_build.c', + 'openssl/crypto/param_build_set.c', + 'openssl/crypto/params.c', + 'openssl/crypto/params_dup.c', + 'openssl/crypto/params_from_text.c', + 'openssl/crypto/provider_core.c', + 'openssl/crypto/provider_predefined.c', + 'openssl/crypto/riscvcap.c', + 'openssl/crypto/self_test_core.c', + 'openssl/crypto/sparse_array.c', + 'openssl/crypto/threads_lib.c', + 'openssl/crypto/threads_none.c', + 'openssl/crypto/threads_pthread.c', + 'openssl/crypto/threads_win.c', + 'openssl/crypto/time.c', + 'openssl/crypto/ml_dsa/ml_dsa_encoders.c', + 'openssl/crypto/ml_dsa/ml_dsa_key.c', + 'openssl/crypto/ml_dsa/ml_dsa_key_compress.c', + 'openssl/crypto/ml_dsa/ml_dsa_matrix.c', + 'openssl/crypto/ml_dsa/ml_dsa_ntt.c', + 'openssl/crypto/ml_dsa/ml_dsa_params.c', + 'openssl/crypto/ml_dsa/ml_dsa_sample.c', + 'openssl/crypto/ml_dsa/ml_dsa_sign.c', + 'openssl/crypto/ml_kem/ml_kem.c', + 'openssl/crypto/modes/cbc128.c', + 'openssl/crypto/modes/ccm128.c', + 'openssl/crypto/modes/cfb128.c', + 'openssl/crypto/modes/ctr128.c', + 'openssl/crypto/modes/gcm128.c', + 'openssl/crypto/modes/ofb128.c', + 'openssl/crypto/modes/wrap128.c', + 'openssl/crypto/modes/xts128.c', + 'openssl/crypto/modes/xts128gb.c', + 'openssl/crypto/property/defn_cache.c', + 'openssl/crypto/property/property.c', + 'openssl/crypto/property/property_parse.c', + 'openssl/crypto/property/property_query.c', + 'openssl/crypto/property/property_string.c', + 'openssl/crypto/rand/rand_lib.c', + 'openssl/crypto/rsa/rsa_acvp_test_params.c', + 'openssl/crypto/rsa/rsa_backend.c', + 'openssl/crypto/rsa/rsa_chk.c', + 'openssl/crypto/rsa/rsa_crpt.c', + 'openssl/crypto/rsa/rsa_gen.c', + 'openssl/crypto/rsa/rsa_lib.c', + 'openssl/crypto/rsa/rsa_mp_names.c', + 'openssl/crypto/rsa/rsa_none.c', + 'openssl/crypto/rsa/rsa_oaep.c', + 'openssl/crypto/rsa/rsa_ossl.c', + 'openssl/crypto/rsa/rsa_pk1.c', + 'openssl/crypto/rsa/rsa_pss.c', + 'openssl/crypto/rsa/rsa_schemes.c', + 'openssl/crypto/rsa/rsa_sign.c', + 'openssl/crypto/rsa/rsa_sp800_56b_check.c', + 'openssl/crypto/rsa/rsa_sp800_56b_gen.c', + 'openssl/crypto/rsa/rsa_x931.c', + 'openssl/crypto/sha/keccak1600.c', + 'openssl/crypto/sha/sha1dgst.c', + 'openssl/crypto/sha/sha256.c', + 'openssl/crypto/sha/sha3.c', + 'openssl/crypto/sha/sha512.c', + 'openssl/crypto/sha/sha_riscv.c', + 'openssl/crypto/slh_dsa/slh_adrs.c', + 'openssl/crypto/slh_dsa/slh_dsa.c', + 'openssl/crypto/slh_dsa/slh_dsa_hash_ctx.c', + 'openssl/crypto/slh_dsa/slh_dsa_key.c', + 'openssl/crypto/slh_dsa/slh_fors.c', + 'openssl/crypto/slh_dsa/slh_hash.c', + 'openssl/crypto/slh_dsa/slh_hypertree.c', + 'openssl/crypto/slh_dsa/slh_params.c', + 'openssl/crypto/slh_dsa/slh_wots.c', + 'openssl/crypto/slh_dsa/slh_xmss.c', + 'openssl/crypto/stack/stack.c', + 'openssl/crypto/thread/arch/thread_none.c', + 'openssl/crypto/thread/arch/thread_posix.c', + 'openssl/crypto/thread/arch/thread_win.c', + 'openssl/crypto/thread/api.c', + 'openssl/crypto/thread/arch.c', + 'openssl/crypto/thread/internal.c', + 'openssl/providers/common/der/der_rsa_sig.c', + 'openssl/providers/common/bio_prov.c', + 'openssl/providers/common/capabilities.c', + 'openssl/providers/common/digest_to_nid.c', + 'openssl/providers/common/provider_seeding.c', + 'openssl/providers/common/provider_util.c', + 'openssl/providers/common/securitycheck.c', + 'openssl/providers/common/securitycheck_fips.c', + 'openssl/providers/fips/fipsindicator.c', + 'openssl/providers/fips/fipsprov.c', + 'openssl/providers/fips/self_test.c', + 'openssl/providers/fips/self_test_kats.c', + 'openssl/providers/implementations/asymciphers/rsa_enc.c', + 'openssl/providers/implementations/ciphers/cipher_aes.c', + 'openssl/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha.c', + 'openssl/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha1_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha256_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ccm.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ccm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_gcm.c', + 'openssl/providers/implementations/ciphers/cipher_aes_gcm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ocb.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ocb_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_wrp.c', + 'openssl/providers/implementations/ciphers/cipher_aes_xts.c', + 'openssl/providers/implementations/ciphers/cipher_aes_xts_fips.c', + 'openssl/providers/implementations/ciphers/cipher_aes_xts_hw.c', + 'openssl/providers/implementations/ciphers/cipher_cts.c', + 'openssl/providers/implementations/ciphers/cipher_tdes.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_common.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_hw.c', + 'openssl/providers/implementations/digests/sha2_prov.c', + 'openssl/providers/implementations/digests/sha3_prov.c', + 'openssl/providers/implementations/exchange/dh_exch.c', + 'openssl/providers/implementations/exchange/ecdh_exch.c', + 'openssl/providers/implementations/exchange/ecx_exch.c', + 'openssl/providers/implementations/exchange/kdf_exch.c', + 'openssl/providers/implementations/kdfs/hkdf.c', + 'openssl/providers/implementations/kdfs/kbkdf.c', + 'openssl/providers/implementations/kdfs/pbkdf2.c', + 'openssl/providers/implementations/kdfs/pbkdf2_fips.c', + 'openssl/providers/implementations/kdfs/sshkdf.c', + 'openssl/providers/implementations/kdfs/sskdf.c', + 'openssl/providers/implementations/kdfs/tls1_prf.c', + 'openssl/providers/implementations/kdfs/x942kdf.c', + 'openssl/providers/implementations/kem/ml_kem_kem.c', + 'openssl/providers/implementations/kem/mlx_kem.c', + 'openssl/providers/implementations/kem/rsa_kem.c', + 'openssl/providers/implementations/keymgmt/dh_kmgmt.c', + 'openssl/providers/implementations/keymgmt/dsa_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ec_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ecx_kmgmt.c', + 'openssl/providers/implementations/keymgmt/kdf_legacy_kmgmt.c', + 'openssl/providers/implementations/keymgmt/mac_legacy_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ml_dsa_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ml_kem_kmgmt.c', + 'openssl/providers/implementations/keymgmt/mlx_kmgmt.c', + 'openssl/providers/implementations/keymgmt/rsa_kmgmt.c', + 'openssl/providers/implementations/keymgmt/slh_dsa_kmgmt.c', + 'openssl/providers/implementations/macs/cmac_prov.c', + 'openssl/providers/implementations/macs/gmac_prov.c', + 'openssl/providers/implementations/macs/hmac_prov.c', + 'openssl/providers/implementations/macs/kmac_prov.c', + 'openssl/providers/implementations/rands/drbg.c', + 'openssl/providers/implementations/rands/drbg_ctr.c', + 'openssl/providers/implementations/rands/drbg_hash.c', + 'openssl/providers/implementations/rands/drbg_hmac.c', + 'openssl/providers/implementations/rands/fips_crng_test.c', + 'openssl/providers/implementations/rands/test_rng.c', + 'openssl/providers/implementations/signature/dsa_sig.c', + 'openssl/providers/implementations/signature/ecdsa_sig.c', + 'openssl/providers/implementations/signature/eddsa_sig.c', + 'openssl/providers/implementations/signature/mac_legacy_sig.c', + 'openssl/providers/implementations/signature/ml_dsa_sig.c', + 'openssl/providers/implementations/signature/rsa_sig.c', + 'openssl/providers/implementations/signature/slh_dsa_sig.c', + 'openssl/providers/implementations/skeymgmt/aes_skmgmt.c', + 'openssl/providers/implementations/skeymgmt/generic.c', + 'openssl/ssl/record/methods/ssl3_cbc.c', + 'openssl/providers/common/der/der_dsa_key.c', + 'openssl/providers/common/der/der_dsa_sig.c', + 'openssl/providers/common/der/der_ec_key.c', + 'openssl/providers/common/der/der_ec_sig.c', + 'openssl/providers/common/der/der_ecx_key.c', + 'openssl/providers/common/der/der_ml_dsa_key.c', + 'openssl/providers/common/der/der_rsa_key.c', + 'openssl/providers/common/der/der_slh_dsa_key.c', + 'openssl/providers/common/provider_ctx.c', + 'openssl/providers/common/provider_err.c', + 'openssl/providers/implementations/ciphers/ciphercommon.c', + 'openssl/providers/implementations/ciphers/ciphercommon_block.c', + 'openssl/providers/implementations/ciphers/ciphercommon_ccm.c', + 'openssl/providers/implementations/ciphers/ciphercommon_ccm_hw.c', + 'openssl/providers/implementations/ciphers/ciphercommon_gcm.c', + 'openssl/providers/implementations/ciphers/ciphercommon_gcm_hw.c', + 'openssl/providers/implementations/ciphers/ciphercommon_hw.c', + 'openssl/providers/implementations/digests/digestcommon.c', + 'openssl/ssl/record/methods/tls_pad.c', + 'openssl/providers/fips/fips_entry.c', + + ], + 'openssl_sources_linux64-riscv64': [ + './config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zkn.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvkb-zvkned.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvkned.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/chacha/chacha-riscv64-v-zbb-zvkb.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/chacha/chacha-riscv64-v-zbb.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/params_idx.c', + './config/archs/linux64-riscv64/asm_avx2/crypto/riscv64cpuid.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64-zvkb-zvbc.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64-zvkg.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S', + './config/archs/linux64-riscv64/asm_avx2/crypto/sha/sha512-riscv64-zvkb-zvknhb.S', + './config/archs/linux64-riscv64/asm_avx2/crypto/sm3/sm3-riscv64-zvksh.S', + './config/archs/linux64-riscv64/asm_avx2/crypto/sm4/sm4-riscv64-zvksed.s', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_sm2_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_digests_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_dsa_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ec_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ecx_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ml_dsa_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_rsa_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_slh_dsa_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_wrap_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/legacy.ld', + './config/archs/linux64-riscv64/asm_avx2/providers/fips.ld', + + ], + 'openssl_defines_linux64-riscv64': [ + 'NDEBUG', + 'OPENSSL_USE_NODELETE', + 'OPENSSL_BUILDING_OPENSSL', + 'BROTLI', + 'ZLIB', + 'ZSTD', + 'AES_ASM', + 'FIPS_MODULE', + 'GHASH_ASM', + 'INCLUDE_C_SHA256', + 'INCLUDE_C_SHA512', + 'OPENSSL_CPUID_OBJ', + 'SHA256_ASM', + 'SHA512_ASM', + 'SM4_ASM', + 'FIPS_MODULE', + ], + 'openssl_cflags_linux64-riscv64': [ + '-Wa,--noexecstack', + '-Wall -O3', + '-pthread', + '-Wall -O3', + ], + 'openssl_ex_libs_linux64-riscv64': [ + '-lm -ldl -pthread', + ], + 'linker_script': '<(PRODUCT_DIR)/../../deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/fips.ld' + }, + 'include_dirs': [ + '.', + './include', + './crypto', + './crypto/include/internal', + './providers/common/include', + ], + 'defines': ['<@(openssl_defines_linux64-riscv64)'], + 'cflags': ['<@(openssl_cflags_linux64-riscv64)'], + 'libraries': ['<@(openssl_ex_libs_linux64-riscv64)'], + 'ldflags': ['-Wl,--version-script=<@(linker_script)'], + 'sources': ['<@(openssl_sources)', '<@(openssl_sources_linux64-riscv64)'], + 'direct_dependent_settings': { + 'include_dirs': ['./include', '.'], + 'defines': ['<@(openssl_defines_linux64-riscv64)'], + }, +} diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/openssl.gypi b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/openssl.gypi new file mode 100644 index 000000000000..54d04e4938e6 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/openssl.gypi @@ -0,0 +1,1196 @@ +{ + 'variables': { + 'openssl_sources': [ + 'openssl/ssl/bio_ssl.c', + 'openssl/ssl/d1_lib.c', + 'openssl/ssl/d1_msg.c', + 'openssl/ssl/d1_srtp.c', + 'openssl/ssl/methods.c', + 'openssl/ssl/pqueue.c', + 'openssl/ssl/priority_queue.c', + 'openssl/ssl/s3_enc.c', + 'openssl/ssl/s3_lib.c', + 'openssl/ssl/s3_msg.c', + 'openssl/ssl/ssl_asn1.c', + 'openssl/ssl/ssl_cert.c', + 'openssl/ssl/ssl_cert_comp.c', + 'openssl/ssl/ssl_ciph.c', + 'openssl/ssl/ssl_conf.c', + 'openssl/ssl/ssl_err_legacy.c', + 'openssl/ssl/ssl_init.c', + 'openssl/ssl/ssl_lib.c', + 'openssl/ssl/ssl_mcnf.c', + 'openssl/ssl/ssl_rsa.c', + 'openssl/ssl/ssl_rsa_legacy.c', + 'openssl/ssl/ssl_sess.c', + 'openssl/ssl/ssl_stat.c', + 'openssl/ssl/ssl_txt.c', + 'openssl/ssl/ssl_utst.c', + 'openssl/ssl/t1_enc.c', + 'openssl/ssl/t1_lib.c', + 'openssl/ssl/t1_trce.c', + 'openssl/ssl/tls13_enc.c', + 'openssl/ssl/tls_depr.c', + 'openssl/ssl/tls_srp.c', + 'openssl/ssl/quic/cc_newreno.c', + 'openssl/ssl/quic/json_enc.c', + 'openssl/ssl/quic/qlog.c', + 'openssl/ssl/quic/qlog_event_helpers.c', + 'openssl/ssl/quic/quic_ackm.c', + 'openssl/ssl/quic/quic_cfq.c', + 'openssl/ssl/quic/quic_channel.c', + 'openssl/ssl/quic/quic_demux.c', + 'openssl/ssl/quic/quic_engine.c', + 'openssl/ssl/quic/quic_fc.c', + 'openssl/ssl/quic/quic_fifd.c', + 'openssl/ssl/quic/quic_impl.c', + 'openssl/ssl/quic/quic_lcidm.c', + 'openssl/ssl/quic/quic_method.c', + 'openssl/ssl/quic/quic_obj.c', + 'openssl/ssl/quic/quic_port.c', + 'openssl/ssl/quic/quic_rcidm.c', + 'openssl/ssl/quic/quic_reactor.c', + 'openssl/ssl/quic/quic_reactor_wait_ctx.c', + 'openssl/ssl/quic/quic_record_rx.c', + 'openssl/ssl/quic/quic_record_shared.c', + 'openssl/ssl/quic/quic_record_tx.c', + 'openssl/ssl/quic/quic_record_util.c', + 'openssl/ssl/quic/quic_rstream.c', + 'openssl/ssl/quic/quic_rx_depack.c', + 'openssl/ssl/quic/quic_sf_list.c', + 'openssl/ssl/quic/quic_srt_gen.c', + 'openssl/ssl/quic/quic_srtm.c', + 'openssl/ssl/quic/quic_sstream.c', + 'openssl/ssl/quic/quic_statm.c', + 'openssl/ssl/quic/quic_stream_map.c', + 'openssl/ssl/quic/quic_thread_assist.c', + 'openssl/ssl/quic/quic_tls.c', + 'openssl/ssl/quic/quic_tls_api.c', + 'openssl/ssl/quic/quic_trace.c', + 'openssl/ssl/quic/quic_tserver.c', + 'openssl/ssl/quic/quic_txp.c', + 'openssl/ssl/quic/quic_txpim.c', + 'openssl/ssl/quic/quic_types.c', + 'openssl/ssl/quic/quic_wire.c', + 'openssl/ssl/quic/quic_wire_pkt.c', + 'openssl/ssl/quic/uint_set.c', + 'openssl/ssl/record/rec_layer_d1.c', + 'openssl/ssl/record/rec_layer_s3.c', + 'openssl/ssl/record/methods/dtls_meth.c', + 'openssl/ssl/record/methods/ssl3_meth.c', + 'openssl/ssl/record/methods/tls13_meth.c', + 'openssl/ssl/record/methods/tls1_meth.c', + 'openssl/ssl/record/methods/tls_common.c', + 'openssl/ssl/record/methods/tls_multib.c', + 'openssl/ssl/record/methods/tlsany_meth.c', + 'openssl/ssl/rio/poll_builder.c', + 'openssl/ssl/rio/poll_immediate.c', + 'openssl/ssl/rio/rio_notifier.c', + 'openssl/ssl/statem/extensions.c', + 'openssl/ssl/statem/extensions_clnt.c', + 'openssl/ssl/statem/extensions_cust.c', + 'openssl/ssl/statem/extensions_srvr.c', + 'openssl/ssl/statem/statem.c', + 'openssl/ssl/statem/statem_clnt.c', + 'openssl/ssl/statem/statem_dtls.c', + 'openssl/ssl/statem/statem_lib.c', + 'openssl/ssl/statem/statem_srvr.c', + 'openssl/crypto/aes/aes_cbc.c', + 'openssl/crypto/aes/aes_cfb.c', + 'openssl/crypto/aes/aes_ecb.c', + 'openssl/crypto/aes/aes_ige.c', + 'openssl/crypto/aes/aes_misc.c', + 'openssl/crypto/aes/aes_ofb.c', + 'openssl/crypto/aes/aes_wrap.c', + 'openssl/crypto/aria/aria.c', + 'openssl/crypto/asn1/a_bitstr.c', + 'openssl/crypto/asn1/a_d2i_fp.c', + 'openssl/crypto/asn1/a_digest.c', + 'openssl/crypto/asn1/a_dup.c', + 'openssl/crypto/asn1/a_gentm.c', + 'openssl/crypto/asn1/a_i2d_fp.c', + 'openssl/crypto/asn1/a_int.c', + 'openssl/crypto/asn1/a_mbstr.c', + 'openssl/crypto/asn1/a_object.c', + 'openssl/crypto/asn1/a_octet.c', + 'openssl/crypto/asn1/a_print.c', + 'openssl/crypto/asn1/a_sign.c', + 'openssl/crypto/asn1/a_strex.c', + 'openssl/crypto/asn1/a_strnid.c', + 'openssl/crypto/asn1/a_time.c', + 'openssl/crypto/asn1/a_type.c', + 'openssl/crypto/asn1/a_utctm.c', + 'openssl/crypto/asn1/a_utf8.c', + 'openssl/crypto/asn1/a_verify.c', + 'openssl/crypto/asn1/ameth_lib.c', + 'openssl/crypto/asn1/asn1_err.c', + 'openssl/crypto/asn1/asn1_gen.c', + 'openssl/crypto/asn1/asn1_item_list.c', + 'openssl/crypto/asn1/asn1_lib.c', + 'openssl/crypto/asn1/asn1_parse.c', + 'openssl/crypto/asn1/asn_mime.c', + 'openssl/crypto/asn1/asn_moid.c', + 'openssl/crypto/asn1/asn_mstbl.c', + 'openssl/crypto/asn1/asn_pack.c', + 'openssl/crypto/asn1/bio_asn1.c', + 'openssl/crypto/asn1/bio_ndef.c', + 'openssl/crypto/asn1/d2i_param.c', + 'openssl/crypto/asn1/d2i_pr.c', + 'openssl/crypto/asn1/d2i_pu.c', + 'openssl/crypto/asn1/evp_asn1.c', + 'openssl/crypto/asn1/f_int.c', + 'openssl/crypto/asn1/f_string.c', + 'openssl/crypto/asn1/i2d_evp.c', + 'openssl/crypto/asn1/n_pkey.c', + 'openssl/crypto/asn1/nsseq.c', + 'openssl/crypto/asn1/p5_pbe.c', + 'openssl/crypto/asn1/p5_pbev2.c', + 'openssl/crypto/asn1/p5_scrypt.c', + 'openssl/crypto/asn1/p8_pkey.c', + 'openssl/crypto/asn1/t_bitst.c', + 'openssl/crypto/asn1/t_pkey.c', + 'openssl/crypto/asn1/t_spki.c', + 'openssl/crypto/asn1/tasn_dec.c', + 'openssl/crypto/asn1/tasn_enc.c', + 'openssl/crypto/asn1/tasn_fre.c', + 'openssl/crypto/asn1/tasn_new.c', + 'openssl/crypto/asn1/tasn_prn.c', + 'openssl/crypto/asn1/tasn_scn.c', + 'openssl/crypto/asn1/tasn_typ.c', + 'openssl/crypto/asn1/tasn_utl.c', + 'openssl/crypto/asn1/x_algor.c', + 'openssl/crypto/asn1/x_bignum.c', + 'openssl/crypto/asn1/x_info.c', + 'openssl/crypto/asn1/x_int64.c', + 'openssl/crypto/asn1/x_long.c', + 'openssl/crypto/asn1/x_pkey.c', + 'openssl/crypto/asn1/x_sig.c', + 'openssl/crypto/asn1/x_spki.c', + 'openssl/crypto/asn1/x_val.c', + 'openssl/crypto/async/arch/async_null.c', + 'openssl/crypto/async/arch/async_posix.c', + 'openssl/crypto/async/arch/async_win.c', + 'openssl/crypto/async/async.c', + 'openssl/crypto/async/async_err.c', + 'openssl/crypto/async/async_wait.c', + 'openssl/crypto/bf/bf_cfb64.c', + 'openssl/crypto/bf/bf_ecb.c', + 'openssl/crypto/bf/bf_enc.c', + 'openssl/crypto/bf/bf_ofb64.c', + 'openssl/crypto/bf/bf_skey.c', + 'openssl/crypto/bio/bf_buff.c', + 'openssl/crypto/bio/bf_lbuf.c', + 'openssl/crypto/bio/bf_nbio.c', + 'openssl/crypto/bio/bf_null.c', + 'openssl/crypto/bio/bf_prefix.c', + 'openssl/crypto/bio/bf_readbuff.c', + 'openssl/crypto/bio/bio_addr.c', + 'openssl/crypto/bio/bio_cb.c', + 'openssl/crypto/bio/bio_dump.c', + 'openssl/crypto/bio/bio_err.c', + 'openssl/crypto/bio/bio_lib.c', + 'openssl/crypto/bio/bio_meth.c', + 'openssl/crypto/bio/bio_print.c', + 'openssl/crypto/bio/bio_sock.c', + 'openssl/crypto/bio/bio_sock2.c', + 'openssl/crypto/bio/bss_acpt.c', + 'openssl/crypto/bio/bss_bio.c', + 'openssl/crypto/bio/bss_conn.c', + 'openssl/crypto/bio/bss_core.c', + 'openssl/crypto/bio/bss_dgram.c', + 'openssl/crypto/bio/bss_dgram_pair.c', + 'openssl/crypto/bio/bss_fd.c', + 'openssl/crypto/bio/bss_file.c', + 'openssl/crypto/bio/bss_log.c', + 'openssl/crypto/bio/bss_mem.c', + 'openssl/crypto/bio/bss_null.c', + 'openssl/crypto/bio/bss_sock.c', + 'openssl/crypto/bio/ossl_core_bio.c', + 'openssl/crypto/bn/bn_add.c', + 'openssl/crypto/bn/bn_asm.c', + 'openssl/crypto/bn/bn_blind.c', + 'openssl/crypto/bn/bn_const.c', + 'openssl/crypto/bn/bn_conv.c', + 'openssl/crypto/bn/bn_ctx.c', + 'openssl/crypto/bn/bn_depr.c', + 'openssl/crypto/bn/bn_dh.c', + 'openssl/crypto/bn/bn_div.c', + 'openssl/crypto/bn/bn_err.c', + 'openssl/crypto/bn/bn_exp.c', + 'openssl/crypto/bn/bn_exp2.c', + 'openssl/crypto/bn/bn_gcd.c', + 'openssl/crypto/bn/bn_gf2m.c', + 'openssl/crypto/bn/bn_intern.c', + 'openssl/crypto/bn/bn_kron.c', + 'openssl/crypto/bn/bn_lib.c', + 'openssl/crypto/bn/bn_mod.c', + 'openssl/crypto/bn/bn_mont.c', + 'openssl/crypto/bn/bn_mpi.c', + 'openssl/crypto/bn/bn_mul.c', + 'openssl/crypto/bn/bn_nist.c', + 'openssl/crypto/bn/bn_prime.c', + 'openssl/crypto/bn/bn_print.c', + 'openssl/crypto/bn/bn_rand.c', + 'openssl/crypto/bn/bn_recp.c', + 'openssl/crypto/bn/bn_rsa_fips186_4.c', + 'openssl/crypto/bn/bn_shift.c', + 'openssl/crypto/bn/bn_sqr.c', + 'openssl/crypto/bn/bn_sqrt.c', + 'openssl/crypto/bn/bn_srp.c', + 'openssl/crypto/bn/bn_word.c', + 'openssl/crypto/bn/bn_x931p.c', + 'openssl/crypto/buffer/buf_err.c', + 'openssl/crypto/buffer/buffer.c', + 'openssl/crypto/camellia/camellia.c', + 'openssl/crypto/camellia/cmll_cbc.c', + 'openssl/crypto/camellia/cmll_cfb.c', + 'openssl/crypto/camellia/cmll_ctr.c', + 'openssl/crypto/camellia/cmll_ecb.c', + 'openssl/crypto/camellia/cmll_misc.c', + 'openssl/crypto/camellia/cmll_ofb.c', + 'openssl/crypto/cast/c_cfb64.c', + 'openssl/crypto/cast/c_ecb.c', + 'openssl/crypto/cast/c_enc.c', + 'openssl/crypto/cast/c_ofb64.c', + 'openssl/crypto/cast/c_skey.c', + 'openssl/crypto/chacha/chacha_enc.c', + 'openssl/crypto/chacha/chacha_riscv.c', + 'openssl/crypto/cmac/cmac.c', + 'openssl/crypto/cmp/cmp_asn.c', + 'openssl/crypto/cmp/cmp_client.c', + 'openssl/crypto/cmp/cmp_ctx.c', + 'openssl/crypto/cmp/cmp_err.c', + 'openssl/crypto/cmp/cmp_genm.c', + 'openssl/crypto/cmp/cmp_hdr.c', + 'openssl/crypto/cmp/cmp_http.c', + 'openssl/crypto/cmp/cmp_msg.c', + 'openssl/crypto/cmp/cmp_protect.c', + 'openssl/crypto/cmp/cmp_server.c', + 'openssl/crypto/cmp/cmp_status.c', + 'openssl/crypto/cmp/cmp_util.c', + 'openssl/crypto/cmp/cmp_vfy.c', + 'openssl/crypto/cms/cms_asn1.c', + 'openssl/crypto/cms/cms_att.c', + 'openssl/crypto/cms/cms_cd.c', + 'openssl/crypto/cms/cms_dd.c', + 'openssl/crypto/cms/cms_dh.c', + 'openssl/crypto/cms/cms_ec.c', + 'openssl/crypto/cms/cms_enc.c', + 'openssl/crypto/cms/cms_env.c', + 'openssl/crypto/cms/cms_err.c', + 'openssl/crypto/cms/cms_ess.c', + 'openssl/crypto/cms/cms_io.c', + 'openssl/crypto/cms/cms_kari.c', + 'openssl/crypto/cms/cms_lib.c', + 'openssl/crypto/cms/cms_pwri.c', + 'openssl/crypto/cms/cms_rsa.c', + 'openssl/crypto/cms/cms_sd.c', + 'openssl/crypto/cms/cms_smime.c', + 'openssl/crypto/comp/c_brotli.c', + 'openssl/crypto/comp/c_zlib.c', + 'openssl/crypto/comp/c_zstd.c', + 'openssl/crypto/comp/comp_err.c', + 'openssl/crypto/comp/comp_lib.c', + 'openssl/crypto/conf/conf_api.c', + 'openssl/crypto/conf/conf_def.c', + 'openssl/crypto/conf/conf_err.c', + 'openssl/crypto/conf/conf_lib.c', + 'openssl/crypto/conf/conf_mall.c', + 'openssl/crypto/conf/conf_mod.c', + 'openssl/crypto/conf/conf_sap.c', + 'openssl/crypto/conf/conf_ssl.c', + 'openssl/crypto/crmf/crmf_asn.c', + 'openssl/crypto/crmf/crmf_err.c', + 'openssl/crypto/crmf/crmf_lib.c', + 'openssl/crypto/crmf/crmf_pbm.c', + 'openssl/crypto/ct/ct_b64.c', + 'openssl/crypto/ct/ct_err.c', + 'openssl/crypto/ct/ct_log.c', + 'openssl/crypto/ct/ct_oct.c', + 'openssl/crypto/ct/ct_policy.c', + 'openssl/crypto/ct/ct_prn.c', + 'openssl/crypto/ct/ct_sct.c', + 'openssl/crypto/ct/ct_sct_ctx.c', + 'openssl/crypto/ct/ct_vfy.c', + 'openssl/crypto/ct/ct_x509v3.c', + 'openssl/crypto/des/cbc_cksm.c', + 'openssl/crypto/des/cbc_enc.c', + 'openssl/crypto/des/cfb64ede.c', + 'openssl/crypto/des/cfb64enc.c', + 'openssl/crypto/des/cfb_enc.c', + 'openssl/crypto/des/des_enc.c', + 'openssl/crypto/des/ecb3_enc.c', + 'openssl/crypto/des/ecb_enc.c', + 'openssl/crypto/des/fcrypt.c', + 'openssl/crypto/des/fcrypt_b.c', + 'openssl/crypto/des/ofb64ede.c', + 'openssl/crypto/des/ofb64enc.c', + 'openssl/crypto/des/ofb_enc.c', + 'openssl/crypto/des/pcbc_enc.c', + 'openssl/crypto/des/qud_cksm.c', + 'openssl/crypto/des/rand_key.c', + 'openssl/crypto/des/set_key.c', + 'openssl/crypto/des/str2key.c', + 'openssl/crypto/des/xcbc_enc.c', + 'openssl/crypto/dh/dh_ameth.c', + 'openssl/crypto/dh/dh_asn1.c', + 'openssl/crypto/dh/dh_backend.c', + 'openssl/crypto/dh/dh_check.c', + 'openssl/crypto/dh/dh_depr.c', + 'openssl/crypto/dh/dh_err.c', + 'openssl/crypto/dh/dh_gen.c', + 'openssl/crypto/dh/dh_group_params.c', + 'openssl/crypto/dh/dh_kdf.c', + 'openssl/crypto/dh/dh_key.c', + 'openssl/crypto/dh/dh_lib.c', + 'openssl/crypto/dh/dh_meth.c', + 'openssl/crypto/dh/dh_pmeth.c', + 'openssl/crypto/dh/dh_prn.c', + 'openssl/crypto/dh/dh_rfc5114.c', + 'openssl/crypto/dsa/dsa_ameth.c', + 'openssl/crypto/dsa/dsa_asn1.c', + 'openssl/crypto/dsa/dsa_backend.c', + 'openssl/crypto/dsa/dsa_check.c', + 'openssl/crypto/dsa/dsa_depr.c', + 'openssl/crypto/dsa/dsa_err.c', + 'openssl/crypto/dsa/dsa_gen.c', + 'openssl/crypto/dsa/dsa_key.c', + 'openssl/crypto/dsa/dsa_lib.c', + 'openssl/crypto/dsa/dsa_meth.c', + 'openssl/crypto/dsa/dsa_ossl.c', + 'openssl/crypto/dsa/dsa_pmeth.c', + 'openssl/crypto/dsa/dsa_prn.c', + 'openssl/crypto/dsa/dsa_sign.c', + 'openssl/crypto/dsa/dsa_vrf.c', + 'openssl/crypto/dso/dso_dl.c', + 'openssl/crypto/dso/dso_dlfcn.c', + 'openssl/crypto/dso/dso_err.c', + 'openssl/crypto/dso/dso_lib.c', + 'openssl/crypto/dso/dso_openssl.c', + 'openssl/crypto/dso/dso_vms.c', + 'openssl/crypto/dso/dso_win32.c', + 'openssl/crypto/ec/curve448/arch_32/f_impl32.c', + 'openssl/crypto/ec/curve448/arch_64/f_impl64.c', + 'openssl/crypto/ec/curve448/curve448.c', + 'openssl/crypto/ec/curve448/curve448_tables.c', + 'openssl/crypto/ec/curve448/eddsa.c', + 'openssl/crypto/ec/curve448/f_generic.c', + 'openssl/crypto/ec/curve448/scalar.c', + 'openssl/crypto/ec/curve25519.c', + 'openssl/crypto/ec/ec2_oct.c', + 'openssl/crypto/ec/ec2_smpl.c', + 'openssl/crypto/ec/ec_ameth.c', + 'openssl/crypto/ec/ec_asn1.c', + 'openssl/crypto/ec/ec_backend.c', + 'openssl/crypto/ec/ec_check.c', + 'openssl/crypto/ec/ec_curve.c', + 'openssl/crypto/ec/ec_cvt.c', + 'openssl/crypto/ec/ec_deprecated.c', + 'openssl/crypto/ec/ec_err.c', + 'openssl/crypto/ec/ec_key.c', + 'openssl/crypto/ec/ec_kmeth.c', + 'openssl/crypto/ec/ec_lib.c', + 'openssl/crypto/ec/ec_mult.c', + 'openssl/crypto/ec/ec_oct.c', + 'openssl/crypto/ec/ec_pmeth.c', + 'openssl/crypto/ec/ec_print.c', + 'openssl/crypto/ec/ecdh_kdf.c', + 'openssl/crypto/ec/ecdh_ossl.c', + 'openssl/crypto/ec/ecdsa_ossl.c', + 'openssl/crypto/ec/ecdsa_sign.c', + 'openssl/crypto/ec/ecdsa_vrf.c', + 'openssl/crypto/ec/eck_prn.c', + 'openssl/crypto/ec/ecp_mont.c', + 'openssl/crypto/ec/ecp_nist.c', + 'openssl/crypto/ec/ecp_oct.c', + 'openssl/crypto/ec/ecp_smpl.c', + 'openssl/crypto/ec/ecx_backend.c', + 'openssl/crypto/ec/ecx_key.c', + 'openssl/crypto/ec/ecx_meth.c', + 'openssl/crypto/encode_decode/decoder_err.c', + 'openssl/crypto/encode_decode/decoder_lib.c', + 'openssl/crypto/encode_decode/decoder_meth.c', + 'openssl/crypto/encode_decode/decoder_pkey.c', + 'openssl/crypto/encode_decode/encoder_err.c', + 'openssl/crypto/encode_decode/encoder_lib.c', + 'openssl/crypto/encode_decode/encoder_meth.c', + 'openssl/crypto/encode_decode/encoder_pkey.c', + 'openssl/crypto/engine/eng_all.c', + 'openssl/crypto/engine/eng_cnf.c', + 'openssl/crypto/engine/eng_ctrl.c', + 'openssl/crypto/engine/eng_dyn.c', + 'openssl/crypto/engine/eng_err.c', + 'openssl/crypto/engine/eng_fat.c', + 'openssl/crypto/engine/eng_init.c', + 'openssl/crypto/engine/eng_lib.c', + 'openssl/crypto/engine/eng_list.c', + 'openssl/crypto/engine/eng_openssl.c', + 'openssl/crypto/engine/eng_pkey.c', + 'openssl/crypto/engine/eng_rdrand.c', + 'openssl/crypto/engine/eng_table.c', + 'openssl/crypto/engine/tb_asnmth.c', + 'openssl/crypto/engine/tb_cipher.c', + 'openssl/crypto/engine/tb_dh.c', + 'openssl/crypto/engine/tb_digest.c', + 'openssl/crypto/engine/tb_dsa.c', + 'openssl/crypto/engine/tb_eckey.c', + 'openssl/crypto/engine/tb_pkmeth.c', + 'openssl/crypto/engine/tb_rand.c', + 'openssl/crypto/engine/tb_rsa.c', + 'openssl/crypto/err/err.c', + 'openssl/crypto/err/err_all.c', + 'openssl/crypto/err/err_all_legacy.c', + 'openssl/crypto/err/err_blocks.c', + 'openssl/crypto/err/err_mark.c', + 'openssl/crypto/err/err_prn.c', + 'openssl/crypto/err/err_save.c', + 'openssl/crypto/ess/ess_asn1.c', + 'openssl/crypto/ess/ess_err.c', + 'openssl/crypto/ess/ess_lib.c', + 'openssl/crypto/evp/asymcipher.c', + 'openssl/crypto/evp/bio_b64.c', + 'openssl/crypto/evp/bio_enc.c', + 'openssl/crypto/evp/bio_md.c', + 'openssl/crypto/evp/bio_ok.c', + 'openssl/crypto/evp/c_allc.c', + 'openssl/crypto/evp/c_alld.c', + 'openssl/crypto/evp/cmeth_lib.c', + 'openssl/crypto/evp/ctrl_params_translate.c', + 'openssl/crypto/evp/dh_ctrl.c', + 'openssl/crypto/evp/dh_support.c', + 'openssl/crypto/evp/digest.c', + 'openssl/crypto/evp/dsa_ctrl.c', + 'openssl/crypto/evp/e_aes.c', + 'openssl/crypto/evp/e_aes_cbc_hmac_sha1.c', + 'openssl/crypto/evp/e_aes_cbc_hmac_sha256.c', + 'openssl/crypto/evp/e_aria.c', + 'openssl/crypto/evp/e_bf.c', + 'openssl/crypto/evp/e_camellia.c', + 'openssl/crypto/evp/e_cast.c', + 'openssl/crypto/evp/e_chacha20_poly1305.c', + 'openssl/crypto/evp/e_des.c', + 'openssl/crypto/evp/e_des3.c', + 'openssl/crypto/evp/e_idea.c', + 'openssl/crypto/evp/e_null.c', + 'openssl/crypto/evp/e_old.c', + 'openssl/crypto/evp/e_rc2.c', + 'openssl/crypto/evp/e_rc4.c', + 'openssl/crypto/evp/e_rc4_hmac_md5.c', + 'openssl/crypto/evp/e_rc5.c', + 'openssl/crypto/evp/e_seed.c', + 'openssl/crypto/evp/e_sm4.c', + 'openssl/crypto/evp/e_xcbc_d.c', + 'openssl/crypto/evp/ec_ctrl.c', + 'openssl/crypto/evp/ec_support.c', + 'openssl/crypto/evp/encode.c', + 'openssl/crypto/evp/evp_cnf.c', + 'openssl/crypto/evp/evp_enc.c', + 'openssl/crypto/evp/evp_err.c', + 'openssl/crypto/evp/evp_fetch.c', + 'openssl/crypto/evp/evp_key.c', + 'openssl/crypto/evp/evp_lib.c', + 'openssl/crypto/evp/evp_pbe.c', + 'openssl/crypto/evp/evp_pkey.c', + 'openssl/crypto/evp/evp_rand.c', + 'openssl/crypto/evp/evp_utils.c', + 'openssl/crypto/evp/exchange.c', + 'openssl/crypto/evp/kdf_lib.c', + 'openssl/crypto/evp/kdf_meth.c', + 'openssl/crypto/evp/kem.c', + 'openssl/crypto/evp/keymgmt_lib.c', + 'openssl/crypto/evp/keymgmt_meth.c', + 'openssl/crypto/evp/legacy_blake2.c', + 'openssl/crypto/evp/legacy_md4.c', + 'openssl/crypto/evp/legacy_md5.c', + 'openssl/crypto/evp/legacy_md5_sha1.c', + 'openssl/crypto/evp/legacy_mdc2.c', + 'openssl/crypto/evp/legacy_ripemd.c', + 'openssl/crypto/evp/legacy_sha.c', + 'openssl/crypto/evp/legacy_wp.c', + 'openssl/crypto/evp/m_null.c', + 'openssl/crypto/evp/m_sigver.c', + 'openssl/crypto/evp/mac_lib.c', + 'openssl/crypto/evp/mac_meth.c', + 'openssl/crypto/evp/names.c', + 'openssl/crypto/evp/p5_crpt.c', + 'openssl/crypto/evp/p5_crpt2.c', + 'openssl/crypto/evp/p_dec.c', + 'openssl/crypto/evp/p_enc.c', + 'openssl/crypto/evp/p_legacy.c', + 'openssl/crypto/evp/p_lib.c', + 'openssl/crypto/evp/p_open.c', + 'openssl/crypto/evp/p_seal.c', + 'openssl/crypto/evp/p_sign.c', + 'openssl/crypto/evp/p_verify.c', + 'openssl/crypto/evp/pbe_scrypt.c', + 'openssl/crypto/evp/pmeth_check.c', + 'openssl/crypto/evp/pmeth_gn.c', + 'openssl/crypto/evp/pmeth_lib.c', + 'openssl/crypto/evp/s_lib.c', + 'openssl/crypto/evp/signature.c', + 'openssl/crypto/evp/skeymgmt_meth.c', + 'openssl/crypto/ffc/ffc_backend.c', + 'openssl/crypto/ffc/ffc_dh.c', + 'openssl/crypto/ffc/ffc_key_generate.c', + 'openssl/crypto/ffc/ffc_key_validate.c', + 'openssl/crypto/ffc/ffc_params.c', + 'openssl/crypto/ffc/ffc_params_generate.c', + 'openssl/crypto/ffc/ffc_params_validate.c', + 'openssl/crypto/hashtable/hashfunc.c', + 'openssl/crypto/hashtable/hashtable.c', + 'openssl/crypto/hmac/hmac.c', + 'openssl/crypto/hpke/hpke.c', + 'openssl/crypto/hpke/hpke_util.c', + 'openssl/crypto/http/http_client.c', + 'openssl/crypto/http/http_err.c', + 'openssl/crypto/http/http_lib.c', + 'openssl/crypto/idea/i_cbc.c', + 'openssl/crypto/idea/i_cfb64.c', + 'openssl/crypto/idea/i_ecb.c', + 'openssl/crypto/idea/i_ofb64.c', + 'openssl/crypto/idea/i_skey.c', + 'openssl/crypto/kdf/kdf_err.c', + 'openssl/crypto/lhash/lh_stats.c', + 'openssl/crypto/lhash/lhash.c', + 'openssl/crypto/asn1_dsa.c', + 'openssl/crypto/bsearch.c', + 'openssl/crypto/comp_methods.c', + 'openssl/crypto/context.c', + 'openssl/crypto/core_algorithm.c', + 'openssl/crypto/core_fetch.c', + 'openssl/crypto/core_namemap.c', + 'openssl/crypto/cpt_err.c', + 'openssl/crypto/cpuid.c', + 'openssl/crypto/cryptlib.c', + 'openssl/crypto/ctype.c', + 'openssl/crypto/cversion.c', + 'openssl/crypto/defaults.c', + 'openssl/crypto/der_writer.c', + 'openssl/crypto/deterministic_nonce.c', + 'openssl/crypto/ebcdic.c', + 'openssl/crypto/ex_data.c', + 'openssl/crypto/getenv.c', + 'openssl/crypto/indicator_core.c', + 'openssl/crypto/info.c', + 'openssl/crypto/init.c', + 'openssl/crypto/initthread.c', + 'openssl/crypto/mem.c', + 'openssl/crypto/mem_sec.c', + 'openssl/crypto/o_dir.c', + 'openssl/crypto/o_fopen.c', + 'openssl/crypto/o_init.c', + 'openssl/crypto/o_str.c', + 'openssl/crypto/o_time.c', + 'openssl/crypto/packet.c', + 'openssl/crypto/param_build.c', + 'openssl/crypto/param_build_set.c', + 'openssl/crypto/params.c', + 'openssl/crypto/params_dup.c', + 'openssl/crypto/params_from_text.c', + 'openssl/crypto/passphrase.c', + 'openssl/crypto/provider.c', + 'openssl/crypto/provider_child.c', + 'openssl/crypto/provider_conf.c', + 'openssl/crypto/provider_core.c', + 'openssl/crypto/provider_predefined.c', + 'openssl/crypto/punycode.c', + 'openssl/crypto/quic_vlint.c', + 'openssl/crypto/riscvcap.c', + 'openssl/crypto/self_test_core.c', + 'openssl/crypto/sleep.c', + 'openssl/crypto/sparse_array.c', + 'openssl/crypto/ssl_err.c', + 'openssl/crypto/threads_lib.c', + 'openssl/crypto/threads_none.c', + 'openssl/crypto/threads_pthread.c', + 'openssl/crypto/threads_win.c', + 'openssl/crypto/time.c', + 'openssl/crypto/trace.c', + 'openssl/crypto/uid.c', + 'openssl/crypto/md4/md4_dgst.c', + 'openssl/crypto/md4/md4_one.c', + 'openssl/crypto/md5/md5_dgst.c', + 'openssl/crypto/md5/md5_one.c', + 'openssl/crypto/md5/md5_sha1.c', + 'openssl/crypto/mdc2/mdc2_one.c', + 'openssl/crypto/mdc2/mdc2dgst.c', + 'openssl/crypto/ml_dsa/ml_dsa_encoders.c', + 'openssl/crypto/ml_dsa/ml_dsa_key.c', + 'openssl/crypto/ml_dsa/ml_dsa_key_compress.c', + 'openssl/crypto/ml_dsa/ml_dsa_matrix.c', + 'openssl/crypto/ml_dsa/ml_dsa_ntt.c', + 'openssl/crypto/ml_dsa/ml_dsa_params.c', + 'openssl/crypto/ml_dsa/ml_dsa_sample.c', + 'openssl/crypto/ml_dsa/ml_dsa_sign.c', + 'openssl/crypto/ml_kem/ml_kem.c', + 'openssl/crypto/modes/cbc128.c', + 'openssl/crypto/modes/ccm128.c', + 'openssl/crypto/modes/cfb128.c', + 'openssl/crypto/modes/ctr128.c', + 'openssl/crypto/modes/cts128.c', + 'openssl/crypto/modes/gcm128.c', + 'openssl/crypto/modes/ocb128.c', + 'openssl/crypto/modes/ofb128.c', + 'openssl/crypto/modes/siv128.c', + 'openssl/crypto/modes/wrap128.c', + 'openssl/crypto/modes/xts128.c', + 'openssl/crypto/modes/xts128gb.c', + 'openssl/crypto/objects/o_names.c', + 'openssl/crypto/objects/obj_dat.c', + 'openssl/crypto/objects/obj_err.c', + 'openssl/crypto/objects/obj_lib.c', + 'openssl/crypto/objects/obj_xref.c', + 'openssl/crypto/ocsp/ocsp_asn.c', + 'openssl/crypto/ocsp/ocsp_cl.c', + 'openssl/crypto/ocsp/ocsp_err.c', + 'openssl/crypto/ocsp/ocsp_ext.c', + 'openssl/crypto/ocsp/ocsp_http.c', + 'openssl/crypto/ocsp/ocsp_lib.c', + 'openssl/crypto/ocsp/ocsp_prn.c', + 'openssl/crypto/ocsp/ocsp_srv.c', + 'openssl/crypto/ocsp/ocsp_vfy.c', + 'openssl/crypto/ocsp/v3_ocsp.c', + 'openssl/crypto/pem/pem_all.c', + 'openssl/crypto/pem/pem_err.c', + 'openssl/crypto/pem/pem_info.c', + 'openssl/crypto/pem/pem_lib.c', + 'openssl/crypto/pem/pem_oth.c', + 'openssl/crypto/pem/pem_pk8.c', + 'openssl/crypto/pem/pem_pkey.c', + 'openssl/crypto/pem/pem_sign.c', + 'openssl/crypto/pem/pem_x509.c', + 'openssl/crypto/pem/pem_xaux.c', + 'openssl/crypto/pem/pvkfmt.c', + 'openssl/crypto/pkcs12/p12_add.c', + 'openssl/crypto/pkcs12/p12_asn.c', + 'openssl/crypto/pkcs12/p12_attr.c', + 'openssl/crypto/pkcs12/p12_crpt.c', + 'openssl/crypto/pkcs12/p12_crt.c', + 'openssl/crypto/pkcs12/p12_decr.c', + 'openssl/crypto/pkcs12/p12_init.c', + 'openssl/crypto/pkcs12/p12_key.c', + 'openssl/crypto/pkcs12/p12_kiss.c', + 'openssl/crypto/pkcs12/p12_mutl.c', + 'openssl/crypto/pkcs12/p12_npas.c', + 'openssl/crypto/pkcs12/p12_p8d.c', + 'openssl/crypto/pkcs12/p12_p8e.c', + 'openssl/crypto/pkcs12/p12_sbag.c', + 'openssl/crypto/pkcs12/p12_utl.c', + 'openssl/crypto/pkcs12/pk12err.c', + 'openssl/crypto/pkcs7/bio_pk7.c', + 'openssl/crypto/pkcs7/pk7_asn1.c', + 'openssl/crypto/pkcs7/pk7_attr.c', + 'openssl/crypto/pkcs7/pk7_doit.c', + 'openssl/crypto/pkcs7/pk7_lib.c', + 'openssl/crypto/pkcs7/pk7_mime.c', + 'openssl/crypto/pkcs7/pk7_smime.c', + 'openssl/crypto/pkcs7/pkcs7err.c', + 'openssl/crypto/poly1305/poly1305.c', + 'openssl/crypto/property/defn_cache.c', + 'openssl/crypto/property/property.c', + 'openssl/crypto/property/property_err.c', + 'openssl/crypto/property/property_parse.c', + 'openssl/crypto/property/property_query.c', + 'openssl/crypto/property/property_string.c', + 'openssl/crypto/rand/prov_seed.c', + 'openssl/crypto/rand/rand_deprecated.c', + 'openssl/crypto/rand/rand_err.c', + 'openssl/crypto/rand/rand_lib.c', + 'openssl/crypto/rand/rand_meth.c', + 'openssl/crypto/rand/rand_pool.c', + 'openssl/crypto/rand/rand_uniform.c', + 'openssl/crypto/rand/randfile.c', + 'openssl/crypto/rc2/rc2_cbc.c', + 'openssl/crypto/rc2/rc2_ecb.c', + 'openssl/crypto/rc2/rc2_skey.c', + 'openssl/crypto/rc2/rc2cfb64.c', + 'openssl/crypto/rc2/rc2ofb64.c', + 'openssl/crypto/rc4/rc4_enc.c', + 'openssl/crypto/rc4/rc4_skey.c', + 'openssl/crypto/ripemd/rmd_dgst.c', + 'openssl/crypto/ripemd/rmd_one.c', + 'openssl/crypto/rsa/rsa_ameth.c', + 'openssl/crypto/rsa/rsa_asn1.c', + 'openssl/crypto/rsa/rsa_backend.c', + 'openssl/crypto/rsa/rsa_chk.c', + 'openssl/crypto/rsa/rsa_crpt.c', + 'openssl/crypto/rsa/rsa_depr.c', + 'openssl/crypto/rsa/rsa_err.c', + 'openssl/crypto/rsa/rsa_gen.c', + 'openssl/crypto/rsa/rsa_lib.c', + 'openssl/crypto/rsa/rsa_meth.c', + 'openssl/crypto/rsa/rsa_mp.c', + 'openssl/crypto/rsa/rsa_mp_names.c', + 'openssl/crypto/rsa/rsa_none.c', + 'openssl/crypto/rsa/rsa_oaep.c', + 'openssl/crypto/rsa/rsa_ossl.c', + 'openssl/crypto/rsa/rsa_pk1.c', + 'openssl/crypto/rsa/rsa_pmeth.c', + 'openssl/crypto/rsa/rsa_prn.c', + 'openssl/crypto/rsa/rsa_pss.c', + 'openssl/crypto/rsa/rsa_saos.c', + 'openssl/crypto/rsa/rsa_schemes.c', + 'openssl/crypto/rsa/rsa_sign.c', + 'openssl/crypto/rsa/rsa_sp800_56b_check.c', + 'openssl/crypto/rsa/rsa_sp800_56b_gen.c', + 'openssl/crypto/rsa/rsa_x931.c', + 'openssl/crypto/rsa/rsa_x931g.c', + 'openssl/crypto/seed/seed.c', + 'openssl/crypto/seed/seed_cbc.c', + 'openssl/crypto/seed/seed_cfb.c', + 'openssl/crypto/seed/seed_ecb.c', + 'openssl/crypto/seed/seed_ofb.c', + 'openssl/crypto/sha/keccak1600.c', + 'openssl/crypto/sha/sha1_one.c', + 'openssl/crypto/sha/sha1dgst.c', + 'openssl/crypto/sha/sha256.c', + 'openssl/crypto/sha/sha3.c', + 'openssl/crypto/sha/sha512.c', + 'openssl/crypto/sha/sha_riscv.c', + 'openssl/crypto/siphash/siphash.c', + 'openssl/crypto/slh_dsa/slh_adrs.c', + 'openssl/crypto/slh_dsa/slh_dsa.c', + 'openssl/crypto/slh_dsa/slh_dsa_hash_ctx.c', + 'openssl/crypto/slh_dsa/slh_dsa_key.c', + 'openssl/crypto/slh_dsa/slh_fors.c', + 'openssl/crypto/slh_dsa/slh_hash.c', + 'openssl/crypto/slh_dsa/slh_hypertree.c', + 'openssl/crypto/slh_dsa/slh_params.c', + 'openssl/crypto/slh_dsa/slh_wots.c', + 'openssl/crypto/slh_dsa/slh_xmss.c', + 'openssl/crypto/sm2/sm2_crypt.c', + 'openssl/crypto/sm2/sm2_err.c', + 'openssl/crypto/sm2/sm2_key.c', + 'openssl/crypto/sm2/sm2_sign.c', + 'openssl/crypto/sm3/legacy_sm3.c', + 'openssl/crypto/sm3/sm3.c', + 'openssl/crypto/sm3/sm3_riscv.c', + 'openssl/crypto/sm4/sm4.c', + 'openssl/crypto/srp/srp_lib.c', + 'openssl/crypto/srp/srp_vfy.c', + 'openssl/crypto/stack/stack.c', + 'openssl/crypto/store/store_err.c', + 'openssl/crypto/store/store_init.c', + 'openssl/crypto/store/store_lib.c', + 'openssl/crypto/store/store_meth.c', + 'openssl/crypto/store/store_register.c', + 'openssl/crypto/store/store_result.c', + 'openssl/crypto/store/store_strings.c', + 'openssl/crypto/thread/arch/thread_none.c', + 'openssl/crypto/thread/arch/thread_posix.c', + 'openssl/crypto/thread/arch/thread_win.c', + 'openssl/crypto/thread/api.c', + 'openssl/crypto/thread/arch.c', + 'openssl/crypto/thread/internal.c', + 'openssl/crypto/ts/ts_asn1.c', + 'openssl/crypto/ts/ts_conf.c', + 'openssl/crypto/ts/ts_err.c', + 'openssl/crypto/ts/ts_lib.c', + 'openssl/crypto/ts/ts_req_print.c', + 'openssl/crypto/ts/ts_req_utils.c', + 'openssl/crypto/ts/ts_rsp_print.c', + 'openssl/crypto/ts/ts_rsp_sign.c', + 'openssl/crypto/ts/ts_rsp_utils.c', + 'openssl/crypto/ts/ts_rsp_verify.c', + 'openssl/crypto/ts/ts_verify_ctx.c', + 'openssl/crypto/txt_db/txt_db.c', + 'openssl/crypto/ui/ui_err.c', + 'openssl/crypto/ui/ui_lib.c', + 'openssl/crypto/ui/ui_null.c', + 'openssl/crypto/ui/ui_openssl.c', + 'openssl/crypto/ui/ui_util.c', + 'openssl/crypto/whrlpool/wp_block.c', + 'openssl/crypto/whrlpool/wp_dgst.c', + 'openssl/crypto/x509/by_dir.c', + 'openssl/crypto/x509/by_file.c', + 'openssl/crypto/x509/by_store.c', + 'openssl/crypto/x509/pcy_cache.c', + 'openssl/crypto/x509/pcy_data.c', + 'openssl/crypto/x509/pcy_lib.c', + 'openssl/crypto/x509/pcy_map.c', + 'openssl/crypto/x509/pcy_node.c', + 'openssl/crypto/x509/pcy_tree.c', + 'openssl/crypto/x509/t_acert.c', + 'openssl/crypto/x509/t_crl.c', + 'openssl/crypto/x509/t_req.c', + 'openssl/crypto/x509/t_x509.c', + 'openssl/crypto/x509/v3_aaa.c', + 'openssl/crypto/x509/v3_ac_tgt.c', + 'openssl/crypto/x509/v3_addr.c', + 'openssl/crypto/x509/v3_admis.c', + 'openssl/crypto/x509/v3_akeya.c', + 'openssl/crypto/x509/v3_akid.c', + 'openssl/crypto/x509/v3_asid.c', + 'openssl/crypto/x509/v3_attrdesc.c', + 'openssl/crypto/x509/v3_attrmap.c', + 'openssl/crypto/x509/v3_audit_id.c', + 'openssl/crypto/x509/v3_authattid.c', + 'openssl/crypto/x509/v3_battcons.c', + 'openssl/crypto/x509/v3_bcons.c', + 'openssl/crypto/x509/v3_bitst.c', + 'openssl/crypto/x509/v3_conf.c', + 'openssl/crypto/x509/v3_cpols.c', + 'openssl/crypto/x509/v3_crld.c', + 'openssl/crypto/x509/v3_enum.c', + 'openssl/crypto/x509/v3_extku.c', + 'openssl/crypto/x509/v3_genn.c', + 'openssl/crypto/x509/v3_group_ac.c', + 'openssl/crypto/x509/v3_ia5.c', + 'openssl/crypto/x509/v3_ind_iss.c', + 'openssl/crypto/x509/v3_info.c', + 'openssl/crypto/x509/v3_int.c', + 'openssl/crypto/x509/v3_iobo.c', + 'openssl/crypto/x509/v3_ist.c', + 'openssl/crypto/x509/v3_lib.c', + 'openssl/crypto/x509/v3_ncons.c', + 'openssl/crypto/x509/v3_no_ass.c', + 'openssl/crypto/x509/v3_no_rev_avail.c', + 'openssl/crypto/x509/v3_pci.c', + 'openssl/crypto/x509/v3_pcia.c', + 'openssl/crypto/x509/v3_pcons.c', + 'openssl/crypto/x509/v3_pku.c', + 'openssl/crypto/x509/v3_pmaps.c', + 'openssl/crypto/x509/v3_prn.c', + 'openssl/crypto/x509/v3_purp.c', + 'openssl/crypto/x509/v3_rolespec.c', + 'openssl/crypto/x509/v3_san.c', + 'openssl/crypto/x509/v3_sda.c', + 'openssl/crypto/x509/v3_single_use.c', + 'openssl/crypto/x509/v3_skid.c', + 'openssl/crypto/x509/v3_soa_id.c', + 'openssl/crypto/x509/v3_sxnet.c', + 'openssl/crypto/x509/v3_timespec.c', + 'openssl/crypto/x509/v3_tlsf.c', + 'openssl/crypto/x509/v3_usernotice.c', + 'openssl/crypto/x509/v3_utf8.c', + 'openssl/crypto/x509/v3_utl.c', + 'openssl/crypto/x509/v3err.c', + 'openssl/crypto/x509/x509_acert.c', + 'openssl/crypto/x509/x509_att.c', + 'openssl/crypto/x509/x509_cmp.c', + 'openssl/crypto/x509/x509_d2.c', + 'openssl/crypto/x509/x509_def.c', + 'openssl/crypto/x509/x509_err.c', + 'openssl/crypto/x509/x509_ext.c', + 'openssl/crypto/x509/x509_lu.c', + 'openssl/crypto/x509/x509_meth.c', + 'openssl/crypto/x509/x509_obj.c', + 'openssl/crypto/x509/x509_r2x.c', + 'openssl/crypto/x509/x509_req.c', + 'openssl/crypto/x509/x509_set.c', + 'openssl/crypto/x509/x509_trust.c', + 'openssl/crypto/x509/x509_txt.c', + 'openssl/crypto/x509/x509_v3.c', + 'openssl/crypto/x509/x509_vfy.c', + 'openssl/crypto/x509/x509_vpm.c', + 'openssl/crypto/x509/x509aset.c', + 'openssl/crypto/x509/x509cset.c', + 'openssl/crypto/x509/x509name.c', + 'openssl/crypto/x509/x509rset.c', + 'openssl/crypto/x509/x509spki.c', + 'openssl/crypto/x509/x509type.c', + 'openssl/crypto/x509/x_all.c', + 'openssl/crypto/x509/x_attrib.c', + 'openssl/crypto/x509/x_crl.c', + 'openssl/crypto/x509/x_exten.c', + 'openssl/crypto/x509/x_ietfatt.c', + 'openssl/crypto/x509/x_name.c', + 'openssl/crypto/x509/x_pubkey.c', + 'openssl/crypto/x509/x_req.c', + 'openssl/crypto/x509/x_x509.c', + 'openssl/crypto/x509/x_x509a.c', + 'openssl/engines/e_capi.c', + 'openssl/engines/e_padlock.c', + 'openssl/providers/baseprov.c', + 'openssl/providers/defltprov.c', + 'openssl/providers/nullprov.c', + 'openssl/providers/prov_running.c', + 'openssl/providers/common/der/der_rsa_sig.c', + 'openssl/providers/common/der/der_sm2_key.c', + 'openssl/providers/common/der/der_sm2_sig.c', + 'openssl/providers/common/bio_prov.c', + 'openssl/providers/common/capabilities.c', + 'openssl/providers/common/digest_to_nid.c', + 'openssl/providers/common/provider_seeding.c', + 'openssl/providers/common/provider_util.c', + 'openssl/providers/common/securitycheck.c', + 'openssl/providers/common/securitycheck_default.c', + 'openssl/providers/implementations/asymciphers/rsa_enc.c', + 'openssl/providers/implementations/asymciphers/sm2_enc.c', + 'openssl/providers/implementations/ciphers/cipher_aes.c', + 'openssl/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha.c', + 'openssl/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha1_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_cbc_hmac_sha256_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ccm.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ccm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_gcm.c', + 'openssl/providers/implementations/ciphers/cipher_aes_gcm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_gcm_siv.c', + 'openssl/providers/implementations/ciphers/cipher_aes_gcm_siv_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_gcm_siv_polyval.c', + 'openssl/providers/implementations/ciphers/cipher_aes_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ocb.c', + 'openssl/providers/implementations/ciphers/cipher_aes_ocb_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_siv.c', + 'openssl/providers/implementations/ciphers/cipher_aes_siv_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aes_wrp.c', + 'openssl/providers/implementations/ciphers/cipher_aes_xts.c', + 'openssl/providers/implementations/ciphers/cipher_aes_xts_fips.c', + 'openssl/providers/implementations/ciphers/cipher_aes_xts_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aria.c', + 'openssl/providers/implementations/ciphers/cipher_aria_ccm.c', + 'openssl/providers/implementations/ciphers/cipher_aria_ccm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aria_gcm.c', + 'openssl/providers/implementations/ciphers/cipher_aria_gcm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_aria_hw.c', + 'openssl/providers/implementations/ciphers/cipher_camellia.c', + 'openssl/providers/implementations/ciphers/cipher_camellia_hw.c', + 'openssl/providers/implementations/ciphers/cipher_chacha20.c', + 'openssl/providers/implementations/ciphers/cipher_chacha20_hw.c', + 'openssl/providers/implementations/ciphers/cipher_chacha20_poly1305.c', + 'openssl/providers/implementations/ciphers/cipher_chacha20_poly1305_hw.c', + 'openssl/providers/implementations/ciphers/cipher_cts.c', + 'openssl/providers/implementations/ciphers/cipher_null.c', + 'openssl/providers/implementations/ciphers/cipher_sm4.c', + 'openssl/providers/implementations/ciphers/cipher_sm4_ccm.c', + 'openssl/providers/implementations/ciphers/cipher_sm4_ccm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_sm4_gcm.c', + 'openssl/providers/implementations/ciphers/cipher_sm4_gcm_hw.c', + 'openssl/providers/implementations/ciphers/cipher_sm4_hw.c', + 'openssl/providers/implementations/ciphers/cipher_sm4_xts.c', + 'openssl/providers/implementations/ciphers/cipher_sm4_xts_hw.c', + 'openssl/providers/implementations/ciphers/cipher_tdes.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_common.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_default.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_default_hw.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_hw.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_wrap.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_wrap_hw.c', + 'openssl/providers/implementations/digests/blake2_prov.c', + 'openssl/providers/implementations/digests/blake2b_prov.c', + 'openssl/providers/implementations/digests/blake2s_prov.c', + 'openssl/providers/implementations/digests/md5_prov.c', + 'openssl/providers/implementations/digests/md5_sha1_prov.c', + 'openssl/providers/implementations/digests/null_prov.c', + 'openssl/providers/implementations/digests/ripemd_prov.c', + 'openssl/providers/implementations/digests/sha2_prov.c', + 'openssl/providers/implementations/digests/sha3_prov.c', + 'openssl/providers/implementations/digests/sm3_prov.c', + 'openssl/providers/implementations/encode_decode/decode_der2key.c', + 'openssl/providers/implementations/encode_decode/decode_epki2pki.c', + 'openssl/providers/implementations/encode_decode/decode_msblob2key.c', + 'openssl/providers/implementations/encode_decode/decode_pem2der.c', + 'openssl/providers/implementations/encode_decode/decode_pvk2key.c', + 'openssl/providers/implementations/encode_decode/decode_spki2typespki.c', + 'openssl/providers/implementations/encode_decode/encode_key2any.c', + 'openssl/providers/implementations/encode_decode/encode_key2blob.c', + 'openssl/providers/implementations/encode_decode/encode_key2ms.c', + 'openssl/providers/implementations/encode_decode/encode_key2text.c', + 'openssl/providers/implementations/encode_decode/endecoder_common.c', + 'openssl/providers/implementations/encode_decode/ml_common_codecs.c', + 'openssl/providers/implementations/encode_decode/ml_dsa_codecs.c', + 'openssl/providers/implementations/encode_decode/ml_kem_codecs.c', + 'openssl/providers/implementations/exchange/dh_exch.c', + 'openssl/providers/implementations/exchange/ecdh_exch.c', + 'openssl/providers/implementations/exchange/ecx_exch.c', + 'openssl/providers/implementations/exchange/kdf_exch.c', + 'openssl/providers/implementations/kdfs/argon2.c', + 'openssl/providers/implementations/kdfs/hkdf.c', + 'openssl/providers/implementations/kdfs/hmacdrbg_kdf.c', + 'openssl/providers/implementations/kdfs/kbkdf.c', + 'openssl/providers/implementations/kdfs/krb5kdf.c', + 'openssl/providers/implementations/kdfs/pbkdf2.c', + 'openssl/providers/implementations/kdfs/pbkdf2_fips.c', + 'openssl/providers/implementations/kdfs/pkcs12kdf.c', + 'openssl/providers/implementations/kdfs/scrypt.c', + 'openssl/providers/implementations/kdfs/sshkdf.c', + 'openssl/providers/implementations/kdfs/sskdf.c', + 'openssl/providers/implementations/kdfs/tls1_prf.c', + 'openssl/providers/implementations/kdfs/x942kdf.c', + 'openssl/providers/implementations/kem/ec_kem.c', + 'openssl/providers/implementations/kem/ecx_kem.c', + 'openssl/providers/implementations/kem/kem_util.c', + 'openssl/providers/implementations/kem/ml_kem_kem.c', + 'openssl/providers/implementations/kem/mlx_kem.c', + 'openssl/providers/implementations/kem/rsa_kem.c', + 'openssl/providers/implementations/keymgmt/dh_kmgmt.c', + 'openssl/providers/implementations/keymgmt/dsa_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ec_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ecx_kmgmt.c', + 'openssl/providers/implementations/keymgmt/kdf_legacy_kmgmt.c', + 'openssl/providers/implementations/keymgmt/mac_legacy_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ml_dsa_kmgmt.c', + 'openssl/providers/implementations/keymgmt/ml_kem_kmgmt.c', + 'openssl/providers/implementations/keymgmt/mlx_kmgmt.c', + 'openssl/providers/implementations/keymgmt/rsa_kmgmt.c', + 'openssl/providers/implementations/keymgmt/slh_dsa_kmgmt.c', + 'openssl/providers/implementations/macs/blake2b_mac.c', + 'openssl/providers/implementations/macs/blake2s_mac.c', + 'openssl/providers/implementations/macs/cmac_prov.c', + 'openssl/providers/implementations/macs/gmac_prov.c', + 'openssl/providers/implementations/macs/hmac_prov.c', + 'openssl/providers/implementations/macs/kmac_prov.c', + 'openssl/providers/implementations/macs/poly1305_prov.c', + 'openssl/providers/implementations/macs/siphash_prov.c', + 'openssl/providers/implementations/rands/drbg.c', + 'openssl/providers/implementations/rands/drbg_ctr.c', + 'openssl/providers/implementations/rands/drbg_hash.c', + 'openssl/providers/implementations/rands/drbg_hmac.c', + 'openssl/providers/implementations/rands/seed_src.c', + 'openssl/providers/implementations/rands/seed_src_jitter.c', + 'openssl/providers/implementations/rands/test_rng.c', + 'openssl/providers/implementations/rands/seeding/rand_cpu_x86.c', + 'openssl/providers/implementations/rands/seeding/rand_tsc.c', + 'openssl/providers/implementations/rands/seeding/rand_unix.c', + 'openssl/providers/implementations/rands/seeding/rand_win.c', + 'openssl/providers/implementations/signature/dsa_sig.c', + 'openssl/providers/implementations/signature/ecdsa_sig.c', + 'openssl/providers/implementations/signature/eddsa_sig.c', + 'openssl/providers/implementations/signature/mac_legacy_sig.c', + 'openssl/providers/implementations/signature/ml_dsa_sig.c', + 'openssl/providers/implementations/signature/rsa_sig.c', + 'openssl/providers/implementations/signature/slh_dsa_sig.c', + 'openssl/providers/implementations/signature/sm2_sig.c', + 'openssl/providers/implementations/skeymgmt/aes_skmgmt.c', + 'openssl/providers/implementations/skeymgmt/generic.c', + 'openssl/providers/implementations/storemgmt/file_store.c', + 'openssl/providers/implementations/storemgmt/file_store_any2obj.c', + 'openssl/ssl/record/methods/ssl3_cbc.c', + 'openssl/providers/common/der/der_dsa_key.c', + 'openssl/providers/common/der/der_dsa_sig.c', + 'openssl/providers/common/der/der_ec_key.c', + 'openssl/providers/common/der/der_ec_sig.c', + 'openssl/providers/common/der/der_ecx_key.c', + 'openssl/providers/common/der/der_ml_dsa_key.c', + 'openssl/providers/common/der/der_rsa_key.c', + 'openssl/providers/common/der/der_slh_dsa_key.c', + 'openssl/providers/common/provider_ctx.c', + 'openssl/providers/common/provider_err.c', + 'openssl/providers/implementations/ciphers/ciphercommon.c', + 'openssl/providers/implementations/ciphers/ciphercommon_block.c', + 'openssl/providers/implementations/ciphers/ciphercommon_ccm.c', + 'openssl/providers/implementations/ciphers/ciphercommon_ccm_hw.c', + 'openssl/providers/implementations/ciphers/ciphercommon_gcm.c', + 'openssl/providers/implementations/ciphers/ciphercommon_gcm_hw.c', + 'openssl/providers/implementations/ciphers/ciphercommon_hw.c', + 'openssl/providers/implementations/digests/digestcommon.c', + 'openssl/ssl/record/methods/tls_pad.c', + 'openssl/providers/implementations/ciphers/cipher_blowfish.c', + 'openssl/providers/implementations/ciphers/cipher_blowfish_hw.c', + 'openssl/providers/implementations/ciphers/cipher_cast5.c', + 'openssl/providers/implementations/ciphers/cipher_cast5_hw.c', + 'openssl/providers/implementations/ciphers/cipher_des.c', + 'openssl/providers/implementations/ciphers/cipher_des_hw.c', + 'openssl/providers/implementations/ciphers/cipher_desx.c', + 'openssl/providers/implementations/ciphers/cipher_desx_hw.c', + 'openssl/providers/implementations/ciphers/cipher_idea.c', + 'openssl/providers/implementations/ciphers/cipher_idea_hw.c', + 'openssl/providers/implementations/ciphers/cipher_rc2.c', + 'openssl/providers/implementations/ciphers/cipher_rc2_hw.c', + 'openssl/providers/implementations/ciphers/cipher_rc4.c', + 'openssl/providers/implementations/ciphers/cipher_rc4_hmac_md5.c', + 'openssl/providers/implementations/ciphers/cipher_rc4_hmac_md5_hw.c', + 'openssl/providers/implementations/ciphers/cipher_rc4_hw.c', + 'openssl/providers/implementations/ciphers/cipher_seed.c', + 'openssl/providers/implementations/ciphers/cipher_seed_hw.c', + 'openssl/providers/implementations/ciphers/cipher_tdes_common.c', + 'openssl/providers/implementations/digests/md4_prov.c', + 'openssl/providers/implementations/digests/mdc2_prov.c', + 'openssl/providers/implementations/digests/ripemd_prov.c', + 'openssl/providers/implementations/digests/wp_prov.c', + 'openssl/providers/implementations/kdfs/pbkdf1.c', + 'openssl/providers/implementations/kdfs/pvkkdf.c', + 'openssl/providers/prov_running.c', + 'openssl/providers/legacyprov.c', + ], + 'openssl_sources_linux64-riscv64': [ + './config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zkn.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvbb-zvkg-zvkned.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvkb-zvkned.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64-zvkned.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/aes/aes-riscv64.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/chacha/chacha-riscv64-v-zbb-zvkb.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/chacha/chacha-riscv64-v-zbb.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/params_idx.c', + './config/archs/linux64-riscv64/asm_avx2/crypto/riscv64cpuid.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/modes/aes-gcm-riscv64-zvkb-zvkg-zvkned.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64-zvkb-zvbc.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64-zvkg.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/modes/ghash-riscv64.s', + './config/archs/linux64-riscv64/asm_avx2/crypto/sha/sha256-riscv64-zvkb-zvknha_or_zvknhb.S', + './config/archs/linux64-riscv64/asm_avx2/crypto/sha/sha512-riscv64-zvkb-zvknhb.S', + './config/archs/linux64-riscv64/asm_avx2/crypto/sm3/sm3-riscv64-zvksh.S', + './config/archs/linux64-riscv64/asm_avx2/crypto/sm4/sm4-riscv64-zvksed.s', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_sm2_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_digests_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_dsa_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ec_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ecx_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ml_dsa_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_rsa_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_slh_dsa_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_wrap_gen.c', + './config/archs/linux64-riscv64/asm_avx2/providers/legacy.ld', + './config/archs/linux64-riscv64/asm_avx2/providers/fips.ld', + ], + 'openssl_defines_linux64-riscv64': [ + 'NDEBUG', + 'OPENSSL_USE_NODELETE', + 'OPENSSL_BUILDING_OPENSSL', + 'BROTLI', + 'ZLIB', + 'ZSTD', + 'AES_ASM', + 'GHASH_ASM', + 'INCLUDE_C_CHACHA20', + 'INCLUDE_C_SHA256', + 'INCLUDE_C_SHA512', + 'OPENSSL_CPUID_OBJ', + 'OPENSSL_SM3_ASM', + 'SHA256_ASM', + 'SHA512_ASM', + 'SM4_ASM', + 'OPENSSL_PIC', + ], + 'openssl_defines_exported_linux64-riscv64': [ + 'NDEBUG', + 'OPENSSL_USE_NODELETE', + 'OPENSSL_BUILDING_OPENSSL', + 'AES_ASM', + 'GHASH_ASM', + 'INCLUDE_C_CHACHA20', + 'INCLUDE_C_SHA256', + 'INCLUDE_C_SHA512', + 'OPENSSL_CPUID_OBJ', + 'OPENSSL_SM3_ASM', + 'SHA256_ASM', + 'SHA512_ASM', + 'SM4_ASM', + 'OPENSSL_PIC', + ], + 'openssl_cflags_linux64-riscv64': [ + '-Wa,--noexecstack', + '-Wall -O3', + '-pthread', + '-Wall -O3', + ], + 'openssl_ex_libs_linux64-riscv64': [ + '-lm -ldl -pthread', + ], + }, + 'include_dirs': [ + '.', + './include', + './crypto', + './crypto/include/internal', + './providers/common/include', + ], + 'defines': ['<@(openssl_defines_linux64-riscv64)'], + 'cflags' : ['<@(openssl_cflags_linux64-riscv64)'], + 'libraries': ['<@(openssl_ex_libs_linux64-riscv64)'], + 'sources': ['<@(openssl_sources)', '<@(openssl_sources_linux64-riscv64)'], + 'direct_dependent_settings': { + 'include_dirs': ['./include', '.'], + 'defines': ['<@(openssl_defines_exported_linux64-riscv64)'], + }, +} diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_digests_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_digests_gen.c new file mode 100644 index 000000000000..340f5148298d --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_digests_gen.c @@ -0,0 +1,162 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_digests_gen.c.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_digests.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * sigAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 3 } + */ +const unsigned char ossl_der_oid_sigAlgs[DER_OID_SZ_sigAlgs] = { + DER_OID_V_sigAlgs +}; + +/* + * id-sha1 OBJECT IDENTIFIER ::= { iso(1) + * identified-organization(3) oiw(14) + * secsig(3) algorithms(2) 26 } + */ +const unsigned char ossl_der_oid_id_sha1[DER_OID_SZ_id_sha1] = { + DER_OID_V_id_sha1 +}; + +/* + * id-md2 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } + */ +const unsigned char ossl_der_oid_id_md2[DER_OID_SZ_id_md2] = { + DER_OID_V_id_md2 +}; + +/* + * id-md5 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } + */ +const unsigned char ossl_der_oid_id_md5[DER_OID_SZ_id_md5] = { + DER_OID_V_id_md5 +}; + +/* + * id-sha256 OBJECT IDENTIFIER ::= { hashAlgs 1 } + */ +const unsigned char ossl_der_oid_id_sha256[DER_OID_SZ_id_sha256] = { + DER_OID_V_id_sha256 +}; + +/* + * id-sha384 OBJECT IDENTIFIER ::= { hashAlgs 2 } + */ +const unsigned char ossl_der_oid_id_sha384[DER_OID_SZ_id_sha384] = { + DER_OID_V_id_sha384 +}; + +/* + * id-sha512 OBJECT IDENTIFIER ::= { hashAlgs 3 } + */ +const unsigned char ossl_der_oid_id_sha512[DER_OID_SZ_id_sha512] = { + DER_OID_V_id_sha512 +}; + +/* + * id-sha224 OBJECT IDENTIFIER ::= { hashAlgs 4 } + */ +const unsigned char ossl_der_oid_id_sha224[DER_OID_SZ_id_sha224] = { + DER_OID_V_id_sha224 +}; + +/* + * id-sha512-224 OBJECT IDENTIFIER ::= { hashAlgs 5 } + */ +const unsigned char ossl_der_oid_id_sha512_224[DER_OID_SZ_id_sha512_224] = { + DER_OID_V_id_sha512_224 +}; + +/* + * id-sha512-256 OBJECT IDENTIFIER ::= { hashAlgs 6 } + */ +const unsigned char ossl_der_oid_id_sha512_256[DER_OID_SZ_id_sha512_256] = { + DER_OID_V_id_sha512_256 +}; + +/* + * id-sha3-224 OBJECT IDENTIFIER ::= { hashAlgs 7 } + */ +const unsigned char ossl_der_oid_id_sha3_224[DER_OID_SZ_id_sha3_224] = { + DER_OID_V_id_sha3_224 +}; + +/* + * id-sha3-256 OBJECT IDENTIFIER ::= { hashAlgs 8 } + */ +const unsigned char ossl_der_oid_id_sha3_256[DER_OID_SZ_id_sha3_256] = { + DER_OID_V_id_sha3_256 +}; + +/* + * id-sha3-384 OBJECT IDENTIFIER ::= { hashAlgs 9 } + */ +const unsigned char ossl_der_oid_id_sha3_384[DER_OID_SZ_id_sha3_384] = { + DER_OID_V_id_sha3_384 +}; + +/* + * id-sha3-512 OBJECT IDENTIFIER ::= { hashAlgs 10 } + */ +const unsigned char ossl_der_oid_id_sha3_512[DER_OID_SZ_id_sha3_512] = { + DER_OID_V_id_sha3_512 +}; + +/* + * id-shake128 OBJECT IDENTIFIER ::= { hashAlgs 11 } + */ +const unsigned char ossl_der_oid_id_shake128[DER_OID_SZ_id_shake128] = { + DER_OID_V_id_shake128 +}; + +/* + * id-shake256 OBJECT IDENTIFIER ::= { hashAlgs 12 } + */ +const unsigned char ossl_der_oid_id_shake256[DER_OID_SZ_id_shake256] = { + DER_OID_V_id_shake256 +}; + +/* + * id-shake128-len OBJECT IDENTIFIER ::= { hashAlgs 17 } + */ +const unsigned char ossl_der_oid_id_shake128_len[DER_OID_SZ_id_shake128_len] = { + DER_OID_V_id_shake128_len +}; + +/* + * id-shake256-len OBJECT IDENTIFIER ::= { hashAlgs 18 } + */ +const unsigned char ossl_der_oid_id_shake256_len[DER_OID_SZ_id_shake256_len] = { + DER_OID_V_id_shake256_len +}; + +/* + * id-KMACWithSHAKE128 OBJECT IDENTIFIER ::={hashAlgs 19} + */ +const unsigned char ossl_der_oid_id_KMACWithSHAKE128[DER_OID_SZ_id_KMACWithSHAKE128] = { + DER_OID_V_id_KMACWithSHAKE128 +}; + +/* + * id-KMACWithSHAKE256 OBJECT IDENTIFIER ::={ hashAlgs 20} + */ +const unsigned char ossl_der_oid_id_KMACWithSHAKE256[DER_OID_SZ_id_KMACWithSHAKE256] = { + DER_OID_V_id_KMACWithSHAKE256 +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_dsa_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_dsa_gen.c new file mode 100644 index 000000000000..025981560501 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_dsa_gen.c @@ -0,0 +1,96 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_dsa_gen.c.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* + * DSA low level APIs are deprecated for public use, but still ok for + * internal use. + */ +#include "internal/deprecated.h" + +#include "prov/der_dsa.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-dsa OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) x9-57(10040) x9algorithm(4) 1 } + */ +const unsigned char ossl_der_oid_id_dsa[DER_OID_SZ_id_dsa] = { + DER_OID_V_id_dsa +}; + +/* + * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) x9-57 (10040) x9algorithm(4) 3 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha1[DER_OID_SZ_id_dsa_with_sha1] = { + DER_OID_V_id_dsa_with_sha1 +}; + +/* + * id-dsa-with-sha224 OBJECT IDENTIFIER ::= { sigAlgs 1 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha224[DER_OID_SZ_id_dsa_with_sha224] = { + DER_OID_V_id_dsa_with_sha224 +}; + +/* + * id-dsa-with-sha256 OBJECT IDENTIFIER ::= { sigAlgs 2 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha256[DER_OID_SZ_id_dsa_with_sha256] = { + DER_OID_V_id_dsa_with_sha256 +}; + +/* + * id-dsa-with-sha384 OBJECT IDENTIFIER ::= { sigAlgs 3 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha384[DER_OID_SZ_id_dsa_with_sha384] = { + DER_OID_V_id_dsa_with_sha384 +}; + +/* + * id-dsa-with-sha512 OBJECT IDENTIFIER ::= { sigAlgs 4 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha512[DER_OID_SZ_id_dsa_with_sha512] = { + DER_OID_V_id_dsa_with_sha512 +}; + +/* + * id-dsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 5 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha3_224[DER_OID_SZ_id_dsa_with_sha3_224] = { + DER_OID_V_id_dsa_with_sha3_224 +}; + +/* + * id-dsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 6 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha3_256[DER_OID_SZ_id_dsa_with_sha3_256] = { + DER_OID_V_id_dsa_with_sha3_256 +}; + +/* + * id-dsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 7 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha3_384[DER_OID_SZ_id_dsa_with_sha3_384] = { + DER_OID_V_id_dsa_with_sha3_384 +}; + +/* + * id-dsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 8 } + */ +const unsigned char ossl_der_oid_id_dsa_with_sha3_512[DER_OID_SZ_id_dsa_with_sha3_512] = { + DER_OID_V_id_dsa_with_sha3_512 +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ec_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ec_gen.c new file mode 100644 index 000000000000..49ce209ec40a --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ec_gen.c @@ -0,0 +1,281 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_ec_gen.c.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_ec.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { id-ecSigType 1 } + */ +const unsigned char ossl_der_oid_ecdsa_with_SHA1[DER_OID_SZ_ecdsa_with_SHA1] = { + DER_OID_V_ecdsa_with_SHA1 +}; + +/* + * id-ecPublicKey OBJECT IDENTIFIER ::= { id-publicKeyType 1 } + */ +const unsigned char ossl_der_oid_id_ecPublicKey[DER_OID_SZ_id_ecPublicKey] = { + DER_OID_V_id_ecPublicKey +}; + +/* + * c2pnb163v1 OBJECT IDENTIFIER ::= { c-TwoCurve 1 } + */ +const unsigned char ossl_der_oid_c2pnb163v1[DER_OID_SZ_c2pnb163v1] = { + DER_OID_V_c2pnb163v1 +}; + +/* + * c2pnb163v2 OBJECT IDENTIFIER ::= { c-TwoCurve 2 } + */ +const unsigned char ossl_der_oid_c2pnb163v2[DER_OID_SZ_c2pnb163v2] = { + DER_OID_V_c2pnb163v2 +}; + +/* + * c2pnb163v3 OBJECT IDENTIFIER ::= { c-TwoCurve 3 } + */ +const unsigned char ossl_der_oid_c2pnb163v3[DER_OID_SZ_c2pnb163v3] = { + DER_OID_V_c2pnb163v3 +}; + +/* + * c2pnb176w1 OBJECT IDENTIFIER ::= { c-TwoCurve 4 } + */ +const unsigned char ossl_der_oid_c2pnb176w1[DER_OID_SZ_c2pnb176w1] = { + DER_OID_V_c2pnb176w1 +}; + +/* + * c2tnb191v1 OBJECT IDENTIFIER ::= { c-TwoCurve 5 } + */ +const unsigned char ossl_der_oid_c2tnb191v1[DER_OID_SZ_c2tnb191v1] = { + DER_OID_V_c2tnb191v1 +}; + +/* + * c2tnb191v2 OBJECT IDENTIFIER ::= { c-TwoCurve 6 } + */ +const unsigned char ossl_der_oid_c2tnb191v2[DER_OID_SZ_c2tnb191v2] = { + DER_OID_V_c2tnb191v2 +}; + +/* + * c2tnb191v3 OBJECT IDENTIFIER ::= { c-TwoCurve 7 } + */ +const unsigned char ossl_der_oid_c2tnb191v3[DER_OID_SZ_c2tnb191v3] = { + DER_OID_V_c2tnb191v3 +}; + +/* + * c2onb191v4 OBJECT IDENTIFIER ::= { c-TwoCurve 8 } + */ +const unsigned char ossl_der_oid_c2onb191v4[DER_OID_SZ_c2onb191v4] = { + DER_OID_V_c2onb191v4 +}; + +/* + * c2onb191v5 OBJECT IDENTIFIER ::= { c-TwoCurve 9 } + */ +const unsigned char ossl_der_oid_c2onb191v5[DER_OID_SZ_c2onb191v5] = { + DER_OID_V_c2onb191v5 +}; + +/* + * c2pnb208w1 OBJECT IDENTIFIER ::= { c-TwoCurve 10 } + */ +const unsigned char ossl_der_oid_c2pnb208w1[DER_OID_SZ_c2pnb208w1] = { + DER_OID_V_c2pnb208w1 +}; + +/* + * c2tnb239v1 OBJECT IDENTIFIER ::= { c-TwoCurve 11 } + */ +const unsigned char ossl_der_oid_c2tnb239v1[DER_OID_SZ_c2tnb239v1] = { + DER_OID_V_c2tnb239v1 +}; + +/* + * c2tnb239v2 OBJECT IDENTIFIER ::= { c-TwoCurve 12 } + */ +const unsigned char ossl_der_oid_c2tnb239v2[DER_OID_SZ_c2tnb239v2] = { + DER_OID_V_c2tnb239v2 +}; + +/* + * c2tnb239v3 OBJECT IDENTIFIER ::= { c-TwoCurve 13 } + */ +const unsigned char ossl_der_oid_c2tnb239v3[DER_OID_SZ_c2tnb239v3] = { + DER_OID_V_c2tnb239v3 +}; + +/* + * c2onb239v4 OBJECT IDENTIFIER ::= { c-TwoCurve 14 } + */ +const unsigned char ossl_der_oid_c2onb239v4[DER_OID_SZ_c2onb239v4] = { + DER_OID_V_c2onb239v4 +}; + +/* + * c2onb239v5 OBJECT IDENTIFIER ::= { c-TwoCurve 15 } + */ +const unsigned char ossl_der_oid_c2onb239v5[DER_OID_SZ_c2onb239v5] = { + DER_OID_V_c2onb239v5 +}; + +/* + * c2pnb272w1 OBJECT IDENTIFIER ::= { c-TwoCurve 16 } + */ +const unsigned char ossl_der_oid_c2pnb272w1[DER_OID_SZ_c2pnb272w1] = { + DER_OID_V_c2pnb272w1 +}; + +/* + * c2pnb304w1 OBJECT IDENTIFIER ::= { c-TwoCurve 17 } + */ +const unsigned char ossl_der_oid_c2pnb304w1[DER_OID_SZ_c2pnb304w1] = { + DER_OID_V_c2pnb304w1 +}; + +/* + * c2tnb359v1 OBJECT IDENTIFIER ::= { c-TwoCurve 18 } + */ +const unsigned char ossl_der_oid_c2tnb359v1[DER_OID_SZ_c2tnb359v1] = { + DER_OID_V_c2tnb359v1 +}; + +/* + * c2pnb368w1 OBJECT IDENTIFIER ::= { c-TwoCurve 19 } + */ +const unsigned char ossl_der_oid_c2pnb368w1[DER_OID_SZ_c2pnb368w1] = { + DER_OID_V_c2pnb368w1 +}; + +/* + * c2tnb431r1 OBJECT IDENTIFIER ::= { c-TwoCurve 20 } + */ +const unsigned char ossl_der_oid_c2tnb431r1[DER_OID_SZ_c2tnb431r1] = { + DER_OID_V_c2tnb431r1 +}; + +/* + * prime192v1 OBJECT IDENTIFIER ::= { primeCurve 1 } + */ +const unsigned char ossl_der_oid_prime192v1[DER_OID_SZ_prime192v1] = { + DER_OID_V_prime192v1 +}; + +/* + * prime192v2 OBJECT IDENTIFIER ::= { primeCurve 2 } + */ +const unsigned char ossl_der_oid_prime192v2[DER_OID_SZ_prime192v2] = { + DER_OID_V_prime192v2 +}; + +/* + * prime192v3 OBJECT IDENTIFIER ::= { primeCurve 3 } + */ +const unsigned char ossl_der_oid_prime192v3[DER_OID_SZ_prime192v3] = { + DER_OID_V_prime192v3 +}; + +/* + * prime239v1 OBJECT IDENTIFIER ::= { primeCurve 4 } + */ +const unsigned char ossl_der_oid_prime239v1[DER_OID_SZ_prime239v1] = { + DER_OID_V_prime239v1 +}; + +/* + * prime239v2 OBJECT IDENTIFIER ::= { primeCurve 5 } + */ +const unsigned char ossl_der_oid_prime239v2[DER_OID_SZ_prime239v2] = { + DER_OID_V_prime239v2 +}; + +/* + * prime239v3 OBJECT IDENTIFIER ::= { primeCurve 6 } + */ +const unsigned char ossl_der_oid_prime239v3[DER_OID_SZ_prime239v3] = { + DER_OID_V_prime239v3 +}; + +/* + * prime256v1 OBJECT IDENTIFIER ::= { primeCurve 7 } + */ +const unsigned char ossl_der_oid_prime256v1[DER_OID_SZ_prime256v1] = { + DER_OID_V_prime256v1 +}; + +/* + * ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 1 } + */ +const unsigned char ossl_der_oid_ecdsa_with_SHA224[DER_OID_SZ_ecdsa_with_SHA224] = { + DER_OID_V_ecdsa_with_SHA224 +}; + +/* + * ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } + */ +const unsigned char ossl_der_oid_ecdsa_with_SHA256[DER_OID_SZ_ecdsa_with_SHA256] = { + DER_OID_V_ecdsa_with_SHA256 +}; + +/* + * ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } + */ +const unsigned char ossl_der_oid_ecdsa_with_SHA384[DER_OID_SZ_ecdsa_with_SHA384] = { + DER_OID_V_ecdsa_with_SHA384 +}; + +/* + * ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } + */ +const unsigned char ossl_der_oid_ecdsa_with_SHA512[DER_OID_SZ_ecdsa_with_SHA512] = { + DER_OID_V_ecdsa_with_SHA512 +}; + +/* + * id-ecdsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 9 } + */ +const unsigned char ossl_der_oid_id_ecdsa_with_sha3_224[DER_OID_SZ_id_ecdsa_with_sha3_224] = { + DER_OID_V_id_ecdsa_with_sha3_224 +}; + +/* + * id-ecdsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 10 } + */ +const unsigned char ossl_der_oid_id_ecdsa_with_sha3_256[DER_OID_SZ_id_ecdsa_with_sha3_256] = { + DER_OID_V_id_ecdsa_with_sha3_256 +}; + +/* + * id-ecdsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 11 } + */ +const unsigned char ossl_der_oid_id_ecdsa_with_sha3_384[DER_OID_SZ_id_ecdsa_with_sha3_384] = { + DER_OID_V_id_ecdsa_with_sha3_384 +}; + +/* + * id-ecdsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 12 } + */ +const unsigned char ossl_der_oid_id_ecdsa_with_sha3_512[DER_OID_SZ_id_ecdsa_with_sha3_512] = { + DER_OID_V_id_ecdsa_with_sha3_512 +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ecx_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ecx_gen.c new file mode 100644 index 000000000000..64d73e3fc525 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ecx_gen.c @@ -0,0 +1,46 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_ecx_gen.c.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_ecx.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-X25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 110 } + */ +const unsigned char ossl_der_oid_id_X25519[DER_OID_SZ_id_X25519] = { + DER_OID_V_id_X25519 +}; + +/* + * id-X448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 111 } + */ +const unsigned char ossl_der_oid_id_X448[DER_OID_SZ_id_X448] = { + DER_OID_V_id_X448 +}; + +/* + * id-Ed25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 112 } + */ +const unsigned char ossl_der_oid_id_Ed25519[DER_OID_SZ_id_Ed25519] = { + DER_OID_V_id_Ed25519 +}; + +/* + * id-Ed448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 113 } + */ +const unsigned char ossl_der_oid_id_Ed448[DER_OID_SZ_id_Ed448] = { + DER_OID_V_id_Ed448 +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ml_dsa_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ml_dsa_gen.c new file mode 100644 index 000000000000..69f4e8521231 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_ml_dsa_gen.c @@ -0,0 +1,39 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_ml_dsa_gen.c.in + * + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_ml_dsa.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-ml-dsa-44 OBJECT IDENTIFIER ::= { sigAlgs 17 } + */ +const unsigned char ossl_der_oid_id_ml_dsa_44[DER_OID_SZ_id_ml_dsa_44] = { + DER_OID_V_id_ml_dsa_44 +}; + +/* + * id-ml-dsa-65 OBJECT IDENTIFIER ::= { sigAlgs 18 } + */ +const unsigned char ossl_der_oid_id_ml_dsa_65[DER_OID_SZ_id_ml_dsa_65] = { + DER_OID_V_id_ml_dsa_65 +}; + +/* + * id-ml-dsa-87 OBJECT IDENTIFIER ::= { sigAlgs 19 } + */ +const unsigned char ossl_der_oid_id_ml_dsa_87[DER_OID_SZ_id_ml_dsa_87] = { + DER_OID_V_id_ml_dsa_87 +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_rsa_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_rsa_gen.c new file mode 100644 index 000000000000..911b6e58936f --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_rsa_gen.c @@ -0,0 +1,176 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_rsa_gen.c.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_rsa.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * hashAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 2 } + */ +const unsigned char ossl_der_oid_hashAlgs[DER_OID_SZ_hashAlgs] = { + DER_OID_V_hashAlgs +}; + +/* + * rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } + */ +const unsigned char ossl_der_oid_rsaEncryption[DER_OID_SZ_rsaEncryption] = { + DER_OID_V_rsaEncryption +}; + +/* + * id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 } + */ +const unsigned char ossl_der_oid_id_RSAES_OAEP[DER_OID_SZ_id_RSAES_OAEP] = { + DER_OID_V_id_RSAES_OAEP +}; + +/* + * id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 } + */ +const unsigned char ossl_der_oid_id_pSpecified[DER_OID_SZ_id_pSpecified] = { + DER_OID_V_id_pSpecified +}; + +/* + * id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } + */ +const unsigned char ossl_der_oid_id_RSASSA_PSS[DER_OID_SZ_id_RSASSA_PSS] = { + DER_OID_V_id_RSASSA_PSS +}; + +/* + * md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } + */ +const unsigned char ossl_der_oid_md2WithRSAEncryption[DER_OID_SZ_md2WithRSAEncryption] = { + DER_OID_V_md2WithRSAEncryption +}; + +/* + * md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } + */ +const unsigned char ossl_der_oid_md5WithRSAEncryption[DER_OID_SZ_md5WithRSAEncryption] = { + DER_OID_V_md5WithRSAEncryption +}; + +/* + * sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } + */ +const unsigned char ossl_der_oid_sha1WithRSAEncryption[DER_OID_SZ_sha1WithRSAEncryption] = { + DER_OID_V_sha1WithRSAEncryption +}; + +/* + * sha224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 14 } + */ +const unsigned char ossl_der_oid_sha224WithRSAEncryption[DER_OID_SZ_sha224WithRSAEncryption] = { + DER_OID_V_sha224WithRSAEncryption +}; + +/* + * sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } + */ +const unsigned char ossl_der_oid_sha256WithRSAEncryption[DER_OID_SZ_sha256WithRSAEncryption] = { + DER_OID_V_sha256WithRSAEncryption +}; + +/* + * sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } + */ +const unsigned char ossl_der_oid_sha384WithRSAEncryption[DER_OID_SZ_sha384WithRSAEncryption] = { + DER_OID_V_sha384WithRSAEncryption +}; + +/* + * sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } + */ +const unsigned char ossl_der_oid_sha512WithRSAEncryption[DER_OID_SZ_sha512WithRSAEncryption] = { + DER_OID_V_sha512WithRSAEncryption +}; + +/* + * sha512-224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 15 } + */ +const unsigned char ossl_der_oid_sha512_224WithRSAEncryption[DER_OID_SZ_sha512_224WithRSAEncryption] = { + DER_OID_V_sha512_224WithRSAEncryption +}; + +/* + * sha512-256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 16 } + */ +const unsigned char ossl_der_oid_sha512_256WithRSAEncryption[DER_OID_SZ_sha512_256WithRSAEncryption] = { + DER_OID_V_sha512_256WithRSAEncryption +}; + +/* + * id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 } + */ +const unsigned char ossl_der_oid_id_mgf1[DER_OID_SZ_id_mgf1] = { + DER_OID_V_id_mgf1 +}; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 13 } + */ +const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_224[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224] = { + DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_224 +}; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 14 } + */ +const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_256[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256] = { + DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_256 +}; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 15 } + */ +const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_384[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384] = { + DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_384 +}; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 16 } + */ +const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_512[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512] = { + DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_512 +}; + +/* + * md4WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 3 } + */ +const unsigned char ossl_der_oid_md4WithRSAEncryption[DER_OID_SZ_md4WithRSAEncryption] = { + DER_OID_V_md4WithRSAEncryption +}; + +/* + * ripemd160WithRSAEncryption OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) teletrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) 2 + * } + */ +const unsigned char ossl_der_oid_ripemd160WithRSAEncryption[DER_OID_SZ_ripemd160WithRSAEncryption] = { + DER_OID_V_ripemd160WithRSAEncryption +}; + +/* + * mdc2WithRSASignature OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) mdc2WithRSASignature(14) + * } + */ +const unsigned char ossl_der_oid_mdc2WithRSASignature[DER_OID_SZ_mdc2WithRSASignature] = { + DER_OID_V_mdc2WithRSASignature +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_slh_dsa_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_slh_dsa_gen.c new file mode 100644 index 000000000000..81adc3b65869 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_slh_dsa_gen.c @@ -0,0 +1,102 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_slh_dsa_gen.c.in + * + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_slh_dsa.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-slh-dsa-sha2-128s OBJECT IDENTIFIER ::= { sigAlgs 20 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_128s[DER_OID_SZ_id_slh_dsa_sha2_128s] = { + DER_OID_V_id_slh_dsa_sha2_128s +}; + +/* + * id-slh-dsa-sha2-128f OBJECT IDENTIFIER ::= { sigAlgs 21 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_128f[DER_OID_SZ_id_slh_dsa_sha2_128f] = { + DER_OID_V_id_slh_dsa_sha2_128f +}; + +/* + * id-slh-dsa-sha2-192s OBJECT IDENTIFIER ::= { sigAlgs 22 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_192s[DER_OID_SZ_id_slh_dsa_sha2_192s] = { + DER_OID_V_id_slh_dsa_sha2_192s +}; + +/* + * id-slh-dsa-sha2-192f OBJECT IDENTIFIER ::= { sigAlgs 23 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_192f[DER_OID_SZ_id_slh_dsa_sha2_192f] = { + DER_OID_V_id_slh_dsa_sha2_192f +}; + +/* + * id-slh-dsa-sha2-256s OBJECT IDENTIFIER ::= { sigAlgs 24 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_256s[DER_OID_SZ_id_slh_dsa_sha2_256s] = { + DER_OID_V_id_slh_dsa_sha2_256s +}; + +/* + * id-slh-dsa-sha2-256f OBJECT IDENTIFIER ::= { sigAlgs 25 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_sha2_256f[DER_OID_SZ_id_slh_dsa_sha2_256f] = { + DER_OID_V_id_slh_dsa_sha2_256f +}; + +/* + * id-slh-dsa-shake-128s OBJECT IDENTIFIER ::= { sigAlgs 26 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_128s[DER_OID_SZ_id_slh_dsa_shake_128s] = { + DER_OID_V_id_slh_dsa_shake_128s +}; + +/* + * id-slh-dsa-shake-128f OBJECT IDENTIFIER ::= { sigAlgs 27 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_128f[DER_OID_SZ_id_slh_dsa_shake_128f] = { + DER_OID_V_id_slh_dsa_shake_128f +}; + +/* + * id-slh-dsa-shake-192s OBJECT IDENTIFIER ::= { sigAlgs 28 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_192s[DER_OID_SZ_id_slh_dsa_shake_192s] = { + DER_OID_V_id_slh_dsa_shake_192s +}; + +/* + * id-slh-dsa-shake-192f OBJECT IDENTIFIER ::= { sigAlgs 29 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_192f[DER_OID_SZ_id_slh_dsa_shake_192f] = { + DER_OID_V_id_slh_dsa_shake_192f +}; + +/* + * id-slh-dsa-shake-256s OBJECT IDENTIFIER ::= { sigAlgs 30 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_256s[DER_OID_SZ_id_slh_dsa_shake_256s] = { + DER_OID_V_id_slh_dsa_shake_256s +}; + +/* + * id-slh-dsa-shake-256f OBJECT IDENTIFIER ::= { sigAlgs 31 } + */ +const unsigned char ossl_der_oid_id_slh_dsa_shake_256f[DER_OID_SZ_id_slh_dsa_shake_256f] = { + DER_OID_V_id_slh_dsa_shake_256f +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_sm2_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_sm2_gen.c new file mode 100644 index 000000000000..6488058af2d2 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_sm2_gen.c @@ -0,0 +1,32 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_sm2_gen.c.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_sm2.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * sm2-with-SM3 OBJECT IDENTIFIER ::= { sm-scheme 501 } + */ +const unsigned char ossl_der_oid_sm2_with_SM3[DER_OID_SZ_sm2_with_SM3] = { + DER_OID_V_sm2_with_SM3 +}; + +/* + * curveSM2 OBJECT IDENTIFIER ::= { sm-scheme 301 } + */ +const unsigned char ossl_der_oid_curveSM2[DER_OID_SZ_curveSM2] = { + DER_OID_V_curveSM2 +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_wrap_gen.c b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_wrap_gen.c new file mode 100644 index 000000000000..def5c3524185 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/der/der_wrap_gen.c @@ -0,0 +1,48 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/der/der_wrap_gen.c.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "prov/der_wrap.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-alg-CMS3DESwrap OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) alg(3) 6 + * } + */ +const unsigned char ossl_der_oid_id_alg_CMS3DESwrap[DER_OID_SZ_id_alg_CMS3DESwrap] = { + DER_OID_V_id_alg_CMS3DESwrap +}; + +/* + * id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } + */ +const unsigned char ossl_der_oid_id_aes128_wrap[DER_OID_SZ_id_aes128_wrap] = { + DER_OID_V_id_aes128_wrap +}; + +/* + * id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } + */ +const unsigned char ossl_der_oid_id_aes192_wrap[DER_OID_SZ_id_aes192_wrap] = { + DER_OID_V_id_aes192_wrap +}; + +/* + * id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } + */ +const unsigned char ossl_der_oid_id_aes256_wrap[DER_OID_SZ_id_aes256_wrap] = { + DER_OID_V_id_aes256_wrap +}; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_digests.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_digests.h new file mode 100644 index 000000000000..c6531033f279 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_digests.h @@ -0,0 +1,162 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_digests.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/der.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * sigAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 3 } + */ +#define DER_OID_V_sigAlgs DER_P_OBJECT, 8, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03 +#define DER_OID_SZ_sigAlgs 10 +extern const unsigned char ossl_der_oid_sigAlgs[DER_OID_SZ_sigAlgs]; + +/* + * id-sha1 OBJECT IDENTIFIER ::= { iso(1) + * identified-organization(3) oiw(14) + * secsig(3) algorithms(2) 26 } + */ +#define DER_OID_V_id_sha1 DER_P_OBJECT, 5, 0x2B, 0x0E, 0x03, 0x02, 0x1A +#define DER_OID_SZ_id_sha1 7 +extern const unsigned char ossl_der_oid_id_sha1[DER_OID_SZ_id_sha1]; + +/* + * id-md2 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } + */ +#define DER_OID_V_id_md2 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x02 +#define DER_OID_SZ_id_md2 10 +extern const unsigned char ossl_der_oid_id_md2[DER_OID_SZ_id_md2]; + +/* + * id-md5 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } + */ +#define DER_OID_V_id_md5 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x05 +#define DER_OID_SZ_id_md5 10 +extern const unsigned char ossl_der_oid_id_md5[DER_OID_SZ_id_md5]; + +/* + * id-sha256 OBJECT IDENTIFIER ::= { hashAlgs 1 } + */ +#define DER_OID_V_id_sha256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01 +#define DER_OID_SZ_id_sha256 11 +extern const unsigned char ossl_der_oid_id_sha256[DER_OID_SZ_id_sha256]; + +/* + * id-sha384 OBJECT IDENTIFIER ::= { hashAlgs 2 } + */ +#define DER_OID_V_id_sha384 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02 +#define DER_OID_SZ_id_sha384 11 +extern const unsigned char ossl_der_oid_id_sha384[DER_OID_SZ_id_sha384]; + +/* + * id-sha512 OBJECT IDENTIFIER ::= { hashAlgs 3 } + */ +#define DER_OID_V_id_sha512 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03 +#define DER_OID_SZ_id_sha512 11 +extern const unsigned char ossl_der_oid_id_sha512[DER_OID_SZ_id_sha512]; + +/* + * id-sha224 OBJECT IDENTIFIER ::= { hashAlgs 4 } + */ +#define DER_OID_V_id_sha224 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04 +#define DER_OID_SZ_id_sha224 11 +extern const unsigned char ossl_der_oid_id_sha224[DER_OID_SZ_id_sha224]; + +/* + * id-sha512-224 OBJECT IDENTIFIER ::= { hashAlgs 5 } + */ +#define DER_OID_V_id_sha512_224 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x05 +#define DER_OID_SZ_id_sha512_224 11 +extern const unsigned char ossl_der_oid_id_sha512_224[DER_OID_SZ_id_sha512_224]; + +/* + * id-sha512-256 OBJECT IDENTIFIER ::= { hashAlgs 6 } + */ +#define DER_OID_V_id_sha512_256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x06 +#define DER_OID_SZ_id_sha512_256 11 +extern const unsigned char ossl_der_oid_id_sha512_256[DER_OID_SZ_id_sha512_256]; + +/* + * id-sha3-224 OBJECT IDENTIFIER ::= { hashAlgs 7 } + */ +#define DER_OID_V_id_sha3_224 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x07 +#define DER_OID_SZ_id_sha3_224 11 +extern const unsigned char ossl_der_oid_id_sha3_224[DER_OID_SZ_id_sha3_224]; + +/* + * id-sha3-256 OBJECT IDENTIFIER ::= { hashAlgs 8 } + */ +#define DER_OID_V_id_sha3_256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x08 +#define DER_OID_SZ_id_sha3_256 11 +extern const unsigned char ossl_der_oid_id_sha3_256[DER_OID_SZ_id_sha3_256]; + +/* + * id-sha3-384 OBJECT IDENTIFIER ::= { hashAlgs 9 } + */ +#define DER_OID_V_id_sha3_384 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x09 +#define DER_OID_SZ_id_sha3_384 11 +extern const unsigned char ossl_der_oid_id_sha3_384[DER_OID_SZ_id_sha3_384]; + +/* + * id-sha3-512 OBJECT IDENTIFIER ::= { hashAlgs 10 } + */ +#define DER_OID_V_id_sha3_512 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0A +#define DER_OID_SZ_id_sha3_512 11 +extern const unsigned char ossl_der_oid_id_sha3_512[DER_OID_SZ_id_sha3_512]; + +/* + * id-shake128 OBJECT IDENTIFIER ::= { hashAlgs 11 } + */ +#define DER_OID_V_id_shake128 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0B +#define DER_OID_SZ_id_shake128 11 +extern const unsigned char ossl_der_oid_id_shake128[DER_OID_SZ_id_shake128]; + +/* + * id-shake256 OBJECT IDENTIFIER ::= { hashAlgs 12 } + */ +#define DER_OID_V_id_shake256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0C +#define DER_OID_SZ_id_shake256 11 +extern const unsigned char ossl_der_oid_id_shake256[DER_OID_SZ_id_shake256]; + +/* + * id-shake128-len OBJECT IDENTIFIER ::= { hashAlgs 17 } + */ +#define DER_OID_V_id_shake128_len DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x11 +#define DER_OID_SZ_id_shake128_len 11 +extern const unsigned char ossl_der_oid_id_shake128_len[DER_OID_SZ_id_shake128_len]; + +/* + * id-shake256-len OBJECT IDENTIFIER ::= { hashAlgs 18 } + */ +#define DER_OID_V_id_shake256_len DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x12 +#define DER_OID_SZ_id_shake256_len 11 +extern const unsigned char ossl_der_oid_id_shake256_len[DER_OID_SZ_id_shake256_len]; + +/* + * id-KMACWithSHAKE128 OBJECT IDENTIFIER ::={hashAlgs 19} + */ +#define DER_OID_V_id_KMACWithSHAKE128 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x13 +#define DER_OID_SZ_id_KMACWithSHAKE128 11 +extern const unsigned char ossl_der_oid_id_KMACWithSHAKE128[DER_OID_SZ_id_KMACWithSHAKE128]; + +/* + * id-KMACWithSHAKE256 OBJECT IDENTIFIER ::={ hashAlgs 20} + */ +#define DER_OID_V_id_KMACWithSHAKE256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x14 +#define DER_OID_SZ_id_KMACWithSHAKE256 11 +extern const unsigned char ossl_der_oid_id_KMACWithSHAKE256[DER_OID_SZ_id_KMACWithSHAKE256]; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_dsa.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_dsa.h new file mode 100644 index 000000000000..3dcd57ebec43 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_dsa.h @@ -0,0 +1,96 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_dsa.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/der.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-dsa OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) x9-57(10040) x9algorithm(4) 1 } + */ +#define DER_OID_V_id_dsa DER_P_OBJECT, 7, 0x2A, 0x86, 0x48, 0xCE, 0x38, 0x04, 0x01 +#define DER_OID_SZ_id_dsa 9 +extern const unsigned char ossl_der_oid_id_dsa[DER_OID_SZ_id_dsa]; + +/* + * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) x9-57 (10040) x9algorithm(4) 3 } + */ +#define DER_OID_V_id_dsa_with_sha1 DER_P_OBJECT, 7, 0x2A, 0x86, 0x48, 0xCE, 0x38, 0x04, 0x03 +#define DER_OID_SZ_id_dsa_with_sha1 9 +extern const unsigned char ossl_der_oid_id_dsa_with_sha1[DER_OID_SZ_id_dsa_with_sha1]; + +/* + * id-dsa-with-sha224 OBJECT IDENTIFIER ::= { sigAlgs 1 } + */ +#define DER_OID_V_id_dsa_with_sha224 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x01 +#define DER_OID_SZ_id_dsa_with_sha224 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha224[DER_OID_SZ_id_dsa_with_sha224]; + +/* + * id-dsa-with-sha256 OBJECT IDENTIFIER ::= { sigAlgs 2 } + */ +#define DER_OID_V_id_dsa_with_sha256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x02 +#define DER_OID_SZ_id_dsa_with_sha256 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha256[DER_OID_SZ_id_dsa_with_sha256]; + +/* + * id-dsa-with-sha384 OBJECT IDENTIFIER ::= { sigAlgs 3 } + */ +#define DER_OID_V_id_dsa_with_sha384 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x03 +#define DER_OID_SZ_id_dsa_with_sha384 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha384[DER_OID_SZ_id_dsa_with_sha384]; + +/* + * id-dsa-with-sha512 OBJECT IDENTIFIER ::= { sigAlgs 4 } + */ +#define DER_OID_V_id_dsa_with_sha512 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x04 +#define DER_OID_SZ_id_dsa_with_sha512 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha512[DER_OID_SZ_id_dsa_with_sha512]; + +/* + * id-dsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 5 } + */ +#define DER_OID_V_id_dsa_with_sha3_224 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x05 +#define DER_OID_SZ_id_dsa_with_sha3_224 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha3_224[DER_OID_SZ_id_dsa_with_sha3_224]; + +/* + * id-dsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 6 } + */ +#define DER_OID_V_id_dsa_with_sha3_256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x06 +#define DER_OID_SZ_id_dsa_with_sha3_256 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha3_256[DER_OID_SZ_id_dsa_with_sha3_256]; + +/* + * id-dsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 7 } + */ +#define DER_OID_V_id_dsa_with_sha3_384 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x07 +#define DER_OID_SZ_id_dsa_with_sha3_384 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha3_384[DER_OID_SZ_id_dsa_with_sha3_384]; + +/* + * id-dsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 8 } + */ +#define DER_OID_V_id_dsa_with_sha3_512 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x08 +#define DER_OID_SZ_id_dsa_with_sha3_512 11 +extern const unsigned char ossl_der_oid_id_dsa_with_sha3_512[DER_OID_SZ_id_dsa_with_sha3_512]; + +/* clang-format on */ + +/* Subject Public Key Info */ +int ossl_DER_w_algorithmIdentifier_DSA(WPACKET *pkt, int tag, DSA *dsa); +/* Signature */ +int ossl_DER_w_algorithmIdentifier_DSA_with_MD(WPACKET *pkt, int tag, + DSA *dsa, int mdnid); diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_ec.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_ec.h new file mode 100644 index 000000000000..059c77d38ea7 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_ec.h @@ -0,0 +1,288 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_ec.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "crypto/ec.h" +#include "internal/der.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { id-ecSigType 1 } + */ +#define DER_OID_V_ecdsa_with_SHA1 DER_P_OBJECT, 7, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x01 +#define DER_OID_SZ_ecdsa_with_SHA1 9 +extern const unsigned char ossl_der_oid_ecdsa_with_SHA1[DER_OID_SZ_ecdsa_with_SHA1]; + +/* + * id-ecPublicKey OBJECT IDENTIFIER ::= { id-publicKeyType 1 } + */ +#define DER_OID_V_id_ecPublicKey DER_P_OBJECT, 7, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01 +#define DER_OID_SZ_id_ecPublicKey 9 +extern const unsigned char ossl_der_oid_id_ecPublicKey[DER_OID_SZ_id_ecPublicKey]; + +/* + * c2pnb163v1 OBJECT IDENTIFIER ::= { c-TwoCurve 1 } + */ +#define DER_OID_V_c2pnb163v1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x01 +#define DER_OID_SZ_c2pnb163v1 10 +extern const unsigned char ossl_der_oid_c2pnb163v1[DER_OID_SZ_c2pnb163v1]; + +/* + * c2pnb163v2 OBJECT IDENTIFIER ::= { c-TwoCurve 2 } + */ +#define DER_OID_V_c2pnb163v2 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x02 +#define DER_OID_SZ_c2pnb163v2 10 +extern const unsigned char ossl_der_oid_c2pnb163v2[DER_OID_SZ_c2pnb163v2]; + +/* + * c2pnb163v3 OBJECT IDENTIFIER ::= { c-TwoCurve 3 } + */ +#define DER_OID_V_c2pnb163v3 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x03 +#define DER_OID_SZ_c2pnb163v3 10 +extern const unsigned char ossl_der_oid_c2pnb163v3[DER_OID_SZ_c2pnb163v3]; + +/* + * c2pnb176w1 OBJECT IDENTIFIER ::= { c-TwoCurve 4 } + */ +#define DER_OID_V_c2pnb176w1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x04 +#define DER_OID_SZ_c2pnb176w1 10 +extern const unsigned char ossl_der_oid_c2pnb176w1[DER_OID_SZ_c2pnb176w1]; + +/* + * c2tnb191v1 OBJECT IDENTIFIER ::= { c-TwoCurve 5 } + */ +#define DER_OID_V_c2tnb191v1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x05 +#define DER_OID_SZ_c2tnb191v1 10 +extern const unsigned char ossl_der_oid_c2tnb191v1[DER_OID_SZ_c2tnb191v1]; + +/* + * c2tnb191v2 OBJECT IDENTIFIER ::= { c-TwoCurve 6 } + */ +#define DER_OID_V_c2tnb191v2 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x06 +#define DER_OID_SZ_c2tnb191v2 10 +extern const unsigned char ossl_der_oid_c2tnb191v2[DER_OID_SZ_c2tnb191v2]; + +/* + * c2tnb191v3 OBJECT IDENTIFIER ::= { c-TwoCurve 7 } + */ +#define DER_OID_V_c2tnb191v3 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x07 +#define DER_OID_SZ_c2tnb191v3 10 +extern const unsigned char ossl_der_oid_c2tnb191v3[DER_OID_SZ_c2tnb191v3]; + +/* + * c2onb191v4 OBJECT IDENTIFIER ::= { c-TwoCurve 8 } + */ +#define DER_OID_V_c2onb191v4 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x08 +#define DER_OID_SZ_c2onb191v4 10 +extern const unsigned char ossl_der_oid_c2onb191v4[DER_OID_SZ_c2onb191v4]; + +/* + * c2onb191v5 OBJECT IDENTIFIER ::= { c-TwoCurve 9 } + */ +#define DER_OID_V_c2onb191v5 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x09 +#define DER_OID_SZ_c2onb191v5 10 +extern const unsigned char ossl_der_oid_c2onb191v5[DER_OID_SZ_c2onb191v5]; + +/* + * c2pnb208w1 OBJECT IDENTIFIER ::= { c-TwoCurve 10 } + */ +#define DER_OID_V_c2pnb208w1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x0A +#define DER_OID_SZ_c2pnb208w1 10 +extern const unsigned char ossl_der_oid_c2pnb208w1[DER_OID_SZ_c2pnb208w1]; + +/* + * c2tnb239v1 OBJECT IDENTIFIER ::= { c-TwoCurve 11 } + */ +#define DER_OID_V_c2tnb239v1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x0B +#define DER_OID_SZ_c2tnb239v1 10 +extern const unsigned char ossl_der_oid_c2tnb239v1[DER_OID_SZ_c2tnb239v1]; + +/* + * c2tnb239v2 OBJECT IDENTIFIER ::= { c-TwoCurve 12 } + */ +#define DER_OID_V_c2tnb239v2 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x0C +#define DER_OID_SZ_c2tnb239v2 10 +extern const unsigned char ossl_der_oid_c2tnb239v2[DER_OID_SZ_c2tnb239v2]; + +/* + * c2tnb239v3 OBJECT IDENTIFIER ::= { c-TwoCurve 13 } + */ +#define DER_OID_V_c2tnb239v3 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x0D +#define DER_OID_SZ_c2tnb239v3 10 +extern const unsigned char ossl_der_oid_c2tnb239v3[DER_OID_SZ_c2tnb239v3]; + +/* + * c2onb239v4 OBJECT IDENTIFIER ::= { c-TwoCurve 14 } + */ +#define DER_OID_V_c2onb239v4 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x0E +#define DER_OID_SZ_c2onb239v4 10 +extern const unsigned char ossl_der_oid_c2onb239v4[DER_OID_SZ_c2onb239v4]; + +/* + * c2onb239v5 OBJECT IDENTIFIER ::= { c-TwoCurve 15 } + */ +#define DER_OID_V_c2onb239v5 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x0F +#define DER_OID_SZ_c2onb239v5 10 +extern const unsigned char ossl_der_oid_c2onb239v5[DER_OID_SZ_c2onb239v5]; + +/* + * c2pnb272w1 OBJECT IDENTIFIER ::= { c-TwoCurve 16 } + */ +#define DER_OID_V_c2pnb272w1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x10 +#define DER_OID_SZ_c2pnb272w1 10 +extern const unsigned char ossl_der_oid_c2pnb272w1[DER_OID_SZ_c2pnb272w1]; + +/* + * c2pnb304w1 OBJECT IDENTIFIER ::= { c-TwoCurve 17 } + */ +#define DER_OID_V_c2pnb304w1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x11 +#define DER_OID_SZ_c2pnb304w1 10 +extern const unsigned char ossl_der_oid_c2pnb304w1[DER_OID_SZ_c2pnb304w1]; + +/* + * c2tnb359v1 OBJECT IDENTIFIER ::= { c-TwoCurve 18 } + */ +#define DER_OID_V_c2tnb359v1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x12 +#define DER_OID_SZ_c2tnb359v1 10 +extern const unsigned char ossl_der_oid_c2tnb359v1[DER_OID_SZ_c2tnb359v1]; + +/* + * c2pnb368w1 OBJECT IDENTIFIER ::= { c-TwoCurve 19 } + */ +#define DER_OID_V_c2pnb368w1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x13 +#define DER_OID_SZ_c2pnb368w1 10 +extern const unsigned char ossl_der_oid_c2pnb368w1[DER_OID_SZ_c2pnb368w1]; + +/* + * c2tnb431r1 OBJECT IDENTIFIER ::= { c-TwoCurve 20 } + */ +#define DER_OID_V_c2tnb431r1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x00, 0x14 +#define DER_OID_SZ_c2tnb431r1 10 +extern const unsigned char ossl_der_oid_c2tnb431r1[DER_OID_SZ_c2tnb431r1]; + +/* + * prime192v1 OBJECT IDENTIFIER ::= { primeCurve 1 } + */ +#define DER_OID_V_prime192v1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x01 +#define DER_OID_SZ_prime192v1 10 +extern const unsigned char ossl_der_oid_prime192v1[DER_OID_SZ_prime192v1]; + +/* + * prime192v2 OBJECT IDENTIFIER ::= { primeCurve 2 } + */ +#define DER_OID_V_prime192v2 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x02 +#define DER_OID_SZ_prime192v2 10 +extern const unsigned char ossl_der_oid_prime192v2[DER_OID_SZ_prime192v2]; + +/* + * prime192v3 OBJECT IDENTIFIER ::= { primeCurve 3 } + */ +#define DER_OID_V_prime192v3 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x03 +#define DER_OID_SZ_prime192v3 10 +extern const unsigned char ossl_der_oid_prime192v3[DER_OID_SZ_prime192v3]; + +/* + * prime239v1 OBJECT IDENTIFIER ::= { primeCurve 4 } + */ +#define DER_OID_V_prime239v1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x04 +#define DER_OID_SZ_prime239v1 10 +extern const unsigned char ossl_der_oid_prime239v1[DER_OID_SZ_prime239v1]; + +/* + * prime239v2 OBJECT IDENTIFIER ::= { primeCurve 5 } + */ +#define DER_OID_V_prime239v2 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x05 +#define DER_OID_SZ_prime239v2 10 +extern const unsigned char ossl_der_oid_prime239v2[DER_OID_SZ_prime239v2]; + +/* + * prime239v3 OBJECT IDENTIFIER ::= { primeCurve 6 } + */ +#define DER_OID_V_prime239v3 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x06 +#define DER_OID_SZ_prime239v3 10 +extern const unsigned char ossl_der_oid_prime239v3[DER_OID_SZ_prime239v3]; + +/* + * prime256v1 OBJECT IDENTIFIER ::= { primeCurve 7 } + */ +#define DER_OID_V_prime256v1 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07 +#define DER_OID_SZ_prime256v1 10 +extern const unsigned char ossl_der_oid_prime256v1[DER_OID_SZ_prime256v1]; + +/* + * ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 1 } + */ +#define DER_OID_V_ecdsa_with_SHA224 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x01 +#define DER_OID_SZ_ecdsa_with_SHA224 10 +extern const unsigned char ossl_der_oid_ecdsa_with_SHA224[DER_OID_SZ_ecdsa_with_SHA224]; + +/* + * ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } + */ +#define DER_OID_V_ecdsa_with_SHA256 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02 +#define DER_OID_SZ_ecdsa_with_SHA256 10 +extern const unsigned char ossl_der_oid_ecdsa_with_SHA256[DER_OID_SZ_ecdsa_with_SHA256]; + +/* + * ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 3 } + */ +#define DER_OID_V_ecdsa_with_SHA384 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x03 +#define DER_OID_SZ_ecdsa_with_SHA384 10 +extern const unsigned char ossl_der_oid_ecdsa_with_SHA384[DER_OID_SZ_ecdsa_with_SHA384]; + +/* + * ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) + * us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 4 } + */ +#define DER_OID_V_ecdsa_with_SHA512 DER_P_OBJECT, 8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x04 +#define DER_OID_SZ_ecdsa_with_SHA512 10 +extern const unsigned char ossl_der_oid_ecdsa_with_SHA512[DER_OID_SZ_ecdsa_with_SHA512]; + +/* + * id-ecdsa-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 9 } + */ +#define DER_OID_V_id_ecdsa_with_sha3_224 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x09 +#define DER_OID_SZ_id_ecdsa_with_sha3_224 11 +extern const unsigned char ossl_der_oid_id_ecdsa_with_sha3_224[DER_OID_SZ_id_ecdsa_with_sha3_224]; + +/* + * id-ecdsa-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 10 } + */ +#define DER_OID_V_id_ecdsa_with_sha3_256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x0A +#define DER_OID_SZ_id_ecdsa_with_sha3_256 11 +extern const unsigned char ossl_der_oid_id_ecdsa_with_sha3_256[DER_OID_SZ_id_ecdsa_with_sha3_256]; + +/* + * id-ecdsa-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 11 } + */ +#define DER_OID_V_id_ecdsa_with_sha3_384 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x0B +#define DER_OID_SZ_id_ecdsa_with_sha3_384 11 +extern const unsigned char ossl_der_oid_id_ecdsa_with_sha3_384[DER_OID_SZ_id_ecdsa_with_sha3_384]; + +/* + * id-ecdsa-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 12 } + */ +#define DER_OID_V_id_ecdsa_with_sha3_512 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x0C +#define DER_OID_SZ_id_ecdsa_with_sha3_512 11 +extern const unsigned char ossl_der_oid_id_ecdsa_with_sha3_512[DER_OID_SZ_id_ecdsa_with_sha3_512]; + +/* clang-format on */ + +/* Subject Public Key Info */ +int ossl_DER_w_algorithmIdentifier_EC(WPACKET *pkt, int cont, EC_KEY *ec); +/* Signature */ +int ossl_DER_w_algorithmIdentifier_ECDSA_with_MD(WPACKET *pkt, int cont, + EC_KEY *ec, int mdnid); diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_ecx.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_ecx.h new file mode 100644 index 000000000000..80e15fad803d --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_ecx.h @@ -0,0 +1,52 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_ecx.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/der.h" +#include "crypto/ecx.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-X25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 110 } + */ +#define DER_OID_V_id_X25519 DER_P_OBJECT, 3, 0x2B, 0x65, 0x6E +#define DER_OID_SZ_id_X25519 5 +extern const unsigned char ossl_der_oid_id_X25519[DER_OID_SZ_id_X25519]; + +/* + * id-X448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 111 } + */ +#define DER_OID_V_id_X448 DER_P_OBJECT, 3, 0x2B, 0x65, 0x6F +#define DER_OID_SZ_id_X448 5 +extern const unsigned char ossl_der_oid_id_X448[DER_OID_SZ_id_X448]; + +/* + * id-Ed25519 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 112 } + */ +#define DER_OID_V_id_Ed25519 DER_P_OBJECT, 3, 0x2B, 0x65, 0x70 +#define DER_OID_SZ_id_Ed25519 5 +extern const unsigned char ossl_der_oid_id_Ed25519[DER_OID_SZ_id_Ed25519]; + +/* + * id-Ed448 OBJECT IDENTIFIER ::= { id-edwards-curve-algs 113 } + */ +#define DER_OID_V_id_Ed448 DER_P_OBJECT, 3, 0x2B, 0x65, 0x71 +#define DER_OID_SZ_id_Ed448 5 +extern const unsigned char ossl_der_oid_id_Ed448[DER_OID_SZ_id_Ed448]; + +/* clang-format on */ + +int ossl_DER_w_algorithmIdentifier_ED25519(WPACKET *pkt, int cont, ECX_KEY *ec); +int ossl_DER_w_algorithmIdentifier_ED448(WPACKET *pkt, int cont, ECX_KEY *ec); +int ossl_DER_w_algorithmIdentifier_X25519(WPACKET *pkt, int cont, ECX_KEY *ec); +int ossl_DER_w_algorithmIdentifier_X448(WPACKET *pkt, int cont, ECX_KEY *ec); diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_ml_dsa.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_ml_dsa.h new file mode 100644 index 000000000000..a6c4c87d7824 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_ml_dsa.h @@ -0,0 +1,42 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_ml_dsa.h.in + * + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/der.h" +#include "crypto/ml_dsa.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-ml-dsa-44 OBJECT IDENTIFIER ::= { sigAlgs 17 } + */ +#define DER_OID_V_id_ml_dsa_44 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x11 +#define DER_OID_SZ_id_ml_dsa_44 11 +extern const unsigned char ossl_der_oid_id_ml_dsa_44[DER_OID_SZ_id_ml_dsa_44]; + +/* + * id-ml-dsa-65 OBJECT IDENTIFIER ::= { sigAlgs 18 } + */ +#define DER_OID_V_id_ml_dsa_65 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x12 +#define DER_OID_SZ_id_ml_dsa_65 11 +extern const unsigned char ossl_der_oid_id_ml_dsa_65[DER_OID_SZ_id_ml_dsa_65]; + +/* + * id-ml-dsa-87 OBJECT IDENTIFIER ::= { sigAlgs 19 } + */ +#define DER_OID_V_id_ml_dsa_87 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x13 +#define DER_OID_SZ_id_ml_dsa_87 11 +extern const unsigned char ossl_der_oid_id_ml_dsa_87[DER_OID_SZ_id_ml_dsa_87]; + +/* clang-format on */ + +int ossl_DER_w_algorithmIdentifier_ML_DSA(WPACKET *pkt, int tag, ML_DSA_KEY *key); diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_rsa.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_rsa.h new file mode 100644 index 000000000000..9c374ceb2b0e --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_rsa.h @@ -0,0 +1,189 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_rsa.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "crypto/rsa.h" +#include "internal/der.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * hashAlgs OBJECT IDENTIFIER ::= { nistAlgorithms 2 } + */ +#define DER_OID_V_hashAlgs DER_P_OBJECT, 8, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02 +#define DER_OID_SZ_hashAlgs 10 +extern const unsigned char ossl_der_oid_hashAlgs[DER_OID_SZ_hashAlgs]; + +/* + * rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } + */ +#define DER_OID_V_rsaEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01 +#define DER_OID_SZ_rsaEncryption 11 +extern const unsigned char ossl_der_oid_rsaEncryption[DER_OID_SZ_rsaEncryption]; + +/* + * id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 } + */ +#define DER_OID_V_id_RSAES_OAEP DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x07 +#define DER_OID_SZ_id_RSAES_OAEP 11 +extern const unsigned char ossl_der_oid_id_RSAES_OAEP[DER_OID_SZ_id_RSAES_OAEP]; + +/* + * id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 } + */ +#define DER_OID_V_id_pSpecified DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x09 +#define DER_OID_SZ_id_pSpecified 11 +extern const unsigned char ossl_der_oid_id_pSpecified[DER_OID_SZ_id_pSpecified]; + +/* + * id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } + */ +#define DER_OID_V_id_RSASSA_PSS DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0A +#define DER_OID_SZ_id_RSASSA_PSS 11 +extern const unsigned char ossl_der_oid_id_RSASSA_PSS[DER_OID_SZ_id_RSASSA_PSS]; + +/* + * md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } + */ +#define DER_OID_V_md2WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x02 +#define DER_OID_SZ_md2WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_md2WithRSAEncryption[DER_OID_SZ_md2WithRSAEncryption]; + +/* + * md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } + */ +#define DER_OID_V_md5WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x04 +#define DER_OID_SZ_md5WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_md5WithRSAEncryption[DER_OID_SZ_md5WithRSAEncryption]; + +/* + * sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } + */ +#define DER_OID_V_sha1WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x05 +#define DER_OID_SZ_sha1WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_sha1WithRSAEncryption[DER_OID_SZ_sha1WithRSAEncryption]; + +/* + * sha224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 14 } + */ +#define DER_OID_V_sha224WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0E +#define DER_OID_SZ_sha224WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_sha224WithRSAEncryption[DER_OID_SZ_sha224WithRSAEncryption]; + +/* + * sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } + */ +#define DER_OID_V_sha256WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B +#define DER_OID_SZ_sha256WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_sha256WithRSAEncryption[DER_OID_SZ_sha256WithRSAEncryption]; + +/* + * sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } + */ +#define DER_OID_V_sha384WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0C +#define DER_OID_SZ_sha384WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_sha384WithRSAEncryption[DER_OID_SZ_sha384WithRSAEncryption]; + +/* + * sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } + */ +#define DER_OID_V_sha512WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0D +#define DER_OID_SZ_sha512WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_sha512WithRSAEncryption[DER_OID_SZ_sha512WithRSAEncryption]; + +/* + * sha512-224WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 15 } + */ +#define DER_OID_V_sha512_224WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0F +#define DER_OID_SZ_sha512_224WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_sha512_224WithRSAEncryption[DER_OID_SZ_sha512_224WithRSAEncryption]; + +/* + * sha512-256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 16 } + */ +#define DER_OID_V_sha512_256WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x10 +#define DER_OID_SZ_sha512_256WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_sha512_256WithRSAEncryption[DER_OID_SZ_sha512_256WithRSAEncryption]; + +/* + * id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 } + */ +#define DER_OID_V_id_mgf1 DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x08 +#define DER_OID_SZ_id_mgf1 11 +extern const unsigned char ossl_der_oid_id_mgf1[DER_OID_SZ_id_mgf1]; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-224 OBJECT IDENTIFIER ::= { sigAlgs 13 } + */ +#define DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_224 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x0D +#define DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224 11 +extern const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_224[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_224]; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-256 OBJECT IDENTIFIER ::= { sigAlgs 14 } + */ +#define DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_256 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x0E +#define DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256 11 +extern const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_256[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_256]; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-384 OBJECT IDENTIFIER ::= { sigAlgs 15 } + */ +#define DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_384 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x0F +#define DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384 11 +extern const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_384[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_384]; + +/* + * id-rsassa-pkcs1-v1_5-with-sha3-512 OBJECT IDENTIFIER ::= { sigAlgs 16 } + */ +#define DER_OID_V_id_rsassa_pkcs1_v1_5_with_sha3_512 DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x10 +#define DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512 11 +extern const unsigned char ossl_der_oid_id_rsassa_pkcs1_v1_5_with_sha3_512[DER_OID_SZ_id_rsassa_pkcs1_v1_5_with_sha3_512]; + +/* + * md4WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 3 } + */ +#define DER_OID_V_md4WithRSAEncryption DER_P_OBJECT, 9, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x03 +#define DER_OID_SZ_md4WithRSAEncryption 11 +extern const unsigned char ossl_der_oid_md4WithRSAEncryption[DER_OID_SZ_md4WithRSAEncryption]; + +/* + * ripemd160WithRSAEncryption OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) teletrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) 2 + * } + */ +#define DER_OID_V_ripemd160WithRSAEncryption DER_P_OBJECT, 6, 0x2B, 0x24, 0x03, 0x03, 0x01, 0x02 +#define DER_OID_SZ_ripemd160WithRSAEncryption 8 +extern const unsigned char ossl_der_oid_ripemd160WithRSAEncryption[DER_OID_SZ_ripemd160WithRSAEncryption]; + +/* + * mdc2WithRSASignature OBJECT IDENTIFIER ::= { + * iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) mdc2WithRSASignature(14) + * } + */ +#define DER_OID_V_mdc2WithRSASignature DER_P_OBJECT, 5, 0x2B, 0x0E, 0x03, 0x02, 0x0E +#define DER_OID_SZ_mdc2WithRSASignature 7 +extern const unsigned char ossl_der_oid_mdc2WithRSASignature[DER_OID_SZ_mdc2WithRSASignature]; + +/* clang-format on */ + +/* PSS parameters */ +int ossl_DER_w_RSASSA_PSS_params(WPACKET *pkt, int tag, + const RSA_PSS_PARAMS_30 *pss); +/* Subject Public Key Info */ +int ossl_DER_w_algorithmIdentifier_RSA(WPACKET *pkt, int tag, RSA *rsa); +int ossl_DER_w_algorithmIdentifier_RSA_PSS(WPACKET *pkt, int tag, + int rsa_type, + const RSA_PSS_PARAMS_30 *pss); +/* Signature */ +int ossl_DER_w_algorithmIdentifier_MDWithRSAEncryption(WPACKET *pkt, int tag, + int mdnid); diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_slh_dsa.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_slh_dsa.h new file mode 100644 index 000000000000..eaf1ab14fd00 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_slh_dsa.h @@ -0,0 +1,105 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_slh_dsa.h.in + * + * Copyright 2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/der.h" +#include "crypto/slh_dsa.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-slh-dsa-sha2-128s OBJECT IDENTIFIER ::= { sigAlgs 20 } + */ +#define DER_OID_V_id_slh_dsa_sha2_128s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x14 +#define DER_OID_SZ_id_slh_dsa_sha2_128s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_128s[DER_OID_SZ_id_slh_dsa_sha2_128s]; + +/* + * id-slh-dsa-sha2-128f OBJECT IDENTIFIER ::= { sigAlgs 21 } + */ +#define DER_OID_V_id_slh_dsa_sha2_128f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x15 +#define DER_OID_SZ_id_slh_dsa_sha2_128f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_128f[DER_OID_SZ_id_slh_dsa_sha2_128f]; + +/* + * id-slh-dsa-sha2-192s OBJECT IDENTIFIER ::= { sigAlgs 22 } + */ +#define DER_OID_V_id_slh_dsa_sha2_192s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x16 +#define DER_OID_SZ_id_slh_dsa_sha2_192s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_192s[DER_OID_SZ_id_slh_dsa_sha2_192s]; + +/* + * id-slh-dsa-sha2-192f OBJECT IDENTIFIER ::= { sigAlgs 23 } + */ +#define DER_OID_V_id_slh_dsa_sha2_192f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x17 +#define DER_OID_SZ_id_slh_dsa_sha2_192f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_192f[DER_OID_SZ_id_slh_dsa_sha2_192f]; + +/* + * id-slh-dsa-sha2-256s OBJECT IDENTIFIER ::= { sigAlgs 24 } + */ +#define DER_OID_V_id_slh_dsa_sha2_256s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x18 +#define DER_OID_SZ_id_slh_dsa_sha2_256s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_256s[DER_OID_SZ_id_slh_dsa_sha2_256s]; + +/* + * id-slh-dsa-sha2-256f OBJECT IDENTIFIER ::= { sigAlgs 25 } + */ +#define DER_OID_V_id_slh_dsa_sha2_256f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x19 +#define DER_OID_SZ_id_slh_dsa_sha2_256f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_sha2_256f[DER_OID_SZ_id_slh_dsa_sha2_256f]; + +/* + * id-slh-dsa-shake-128s OBJECT IDENTIFIER ::= { sigAlgs 26 } + */ +#define DER_OID_V_id_slh_dsa_shake_128s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1A +#define DER_OID_SZ_id_slh_dsa_shake_128s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_128s[DER_OID_SZ_id_slh_dsa_shake_128s]; + +/* + * id-slh-dsa-shake-128f OBJECT IDENTIFIER ::= { sigAlgs 27 } + */ +#define DER_OID_V_id_slh_dsa_shake_128f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1B +#define DER_OID_SZ_id_slh_dsa_shake_128f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_128f[DER_OID_SZ_id_slh_dsa_shake_128f]; + +/* + * id-slh-dsa-shake-192s OBJECT IDENTIFIER ::= { sigAlgs 28 } + */ +#define DER_OID_V_id_slh_dsa_shake_192s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1C +#define DER_OID_SZ_id_slh_dsa_shake_192s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_192s[DER_OID_SZ_id_slh_dsa_shake_192s]; + +/* + * id-slh-dsa-shake-192f OBJECT IDENTIFIER ::= { sigAlgs 29 } + */ +#define DER_OID_V_id_slh_dsa_shake_192f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1D +#define DER_OID_SZ_id_slh_dsa_shake_192f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_192f[DER_OID_SZ_id_slh_dsa_shake_192f]; + +/* + * id-slh-dsa-shake-256s OBJECT IDENTIFIER ::= { sigAlgs 30 } + */ +#define DER_OID_V_id_slh_dsa_shake_256s DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1E +#define DER_OID_SZ_id_slh_dsa_shake_256s 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_256s[DER_OID_SZ_id_slh_dsa_shake_256s]; + +/* + * id-slh-dsa-shake-256f OBJECT IDENTIFIER ::= { sigAlgs 31 } + */ +#define DER_OID_V_id_slh_dsa_shake_256f DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x03, 0x1F +#define DER_OID_SZ_id_slh_dsa_shake_256f 11 +extern const unsigned char ossl_der_oid_id_slh_dsa_shake_256f[DER_OID_SZ_id_slh_dsa_shake_256f]; + +/* clang-format on */ + +int ossl_DER_w_algorithmIdentifier_SLH_DSA(WPACKET *pkt, int tag, SLH_DSA_KEY *key); diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_sm2.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_sm2.h new file mode 100644 index 000000000000..a6ab7b7166d3 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_sm2.h @@ -0,0 +1,39 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_sm2.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "crypto/ec.h" +#include "internal/der.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * sm2-with-SM3 OBJECT IDENTIFIER ::= { sm-scheme 501 } + */ +#define DER_OID_V_sm2_with_SM3 DER_P_OBJECT, 8, 0x2A, 0x81, 0x1C, 0xCF, 0x55, 0x01, 0x83, 0x75 +#define DER_OID_SZ_sm2_with_SM3 10 +extern const unsigned char ossl_der_oid_sm2_with_SM3[DER_OID_SZ_sm2_with_SM3]; + +/* + * curveSM2 OBJECT IDENTIFIER ::= { sm-scheme 301 } + */ +#define DER_OID_V_curveSM2 DER_P_OBJECT, 8, 0x2A, 0x81, 0x1C, 0xCF, 0x55, 0x01, 0x82, 0x2D +#define DER_OID_SZ_curveSM2 10 +extern const unsigned char ossl_der_oid_curveSM2[DER_OID_SZ_curveSM2]; + +/* clang-format on */ + +/* Subject Public Key Info */ +int ossl_DER_w_algorithmIdentifier_SM2(WPACKET *pkt, int cont, EC_KEY *ec); +/* Signature */ +int ossl_DER_w_algorithmIdentifier_SM2_with_MD(WPACKET *pkt, int cont, + EC_KEY *ec, int mdnid); diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_wrap.h b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_wrap.h new file mode 100644 index 000000000000..56d4777bb3d2 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/common/include/prov/der_wrap.h @@ -0,0 +1,48 @@ +/* + * WARNING: do not edit! + * Generated by Makefile from providers/common/include/prov/der_wrap.h.in + * + * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/der.h" + +/* Well known OIDs precompiled */ +/* clang-format off */ + +/* + * id-alg-CMS3DESwrap OBJECT IDENTIFIER ::= { + * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) alg(3) 6 + * } + */ +#define DER_OID_V_id_alg_CMS3DESwrap DER_P_OBJECT, 11, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x10, 0x03, 0x06 +#define DER_OID_SZ_id_alg_CMS3DESwrap 13 +extern const unsigned char ossl_der_oid_id_alg_CMS3DESwrap[DER_OID_SZ_id_alg_CMS3DESwrap]; + +/* + * id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } + */ +#define DER_OID_V_id_aes128_wrap DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x05 +#define DER_OID_SZ_id_aes128_wrap 11 +extern const unsigned char ossl_der_oid_id_aes128_wrap[DER_OID_SZ_id_aes128_wrap]; + +/* + * id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } + */ +#define DER_OID_V_id_aes192_wrap DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x19 +#define DER_OID_SZ_id_aes192_wrap 11 +extern const unsigned char ossl_der_oid_id_aes192_wrap[DER_OID_SZ_id_aes192_wrap]; + +/* + * id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } + */ +#define DER_OID_V_id_aes256_wrap DER_P_OBJECT, 9, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2D +#define DER_OID_SZ_id_aes256_wrap 11 +extern const unsigned char ossl_der_oid_id_aes256_wrap[DER_OID_SZ_id_aes256_wrap]; + +/* clang-format on */ diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/fips.ld b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/fips.ld new file mode 100644 index 000000000000..1debaaa7ff65 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/fips.ld @@ -0,0 +1,5 @@ +{ + global: + OSSL_provider_init; + local: *; +}; diff --git a/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/legacy.ld b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/legacy.ld new file mode 100644 index 000000000000..1debaaa7ff65 --- /dev/null +++ b/deps/openssl/config/archs/linux64-riscv64/asm_avx2/providers/legacy.ld @@ -0,0 +1,5 @@ +{ + global: + OSSL_provider_init; + local: *; +}; diff --git a/deps/openssl/config/asn1_asm.h b/deps/openssl/config/asn1_asm.h index e74b3c6cb4aa..caf8c0ce68e3 100644 --- a/deps/openssl/config/asn1_asm.h +++ b/deps/openssl/config/asn1_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/asn1.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/asn1.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/asn1.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/asn1.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/asn1_no-asm.h b/deps/openssl/config/asn1_no-asm.h index a70fc6e75d06..38356ae0f0c0 100644 --- a/deps/openssl/config/asn1_no-asm.h +++ b/deps/openssl/config/asn1_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/asn1.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/asn1.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/asn1.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/asn1.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/asn1t_asm.h b/deps/openssl/config/asn1t_asm.h index 36e11729e409..8ec1596b27ee 100644 --- a/deps/openssl/config/asn1t_asm.h +++ b/deps/openssl/config/asn1t_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/asn1t.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/asn1t.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/asn1t.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/asn1t.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/asn1t_no-asm.h b/deps/openssl/config/asn1t_no-asm.h index 24e297b71f24..952c6d2c2acd 100644 --- a/deps/openssl/config/asn1t_no-asm.h +++ b/deps/openssl/config/asn1t_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/asn1t.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/asn1t.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/asn1t.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/asn1t.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/bio_asm.h b/deps/openssl/config/bio_asm.h index b09aed00aa24..646d2238dc2e 100644 --- a/deps/openssl/config/bio_asm.h +++ b/deps/openssl/config/bio_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/bio.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/bio.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/bio.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/bio.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/bio_no-asm.h b/deps/openssl/config/bio_no-asm.h index dd24a9d3a3f5..f1a60edc3690 100644 --- a/deps/openssl/config/bio_no-asm.h +++ b/deps/openssl/config/bio_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/bio.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/bio.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/bio.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/bio.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/bn_conf_asm.h b/deps/openssl/config/bn_conf_asm.h index e9c74868ef72..80f61eac07da 100644 --- a/deps/openssl/config/bn_conf_asm.h +++ b/deps/openssl/config/bn_conf_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/crypto/bn_conf.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/crypto/bn_conf.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/crypto/bn_conf.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/crypto/bn_conf.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/bn_conf_no-asm.h b/deps/openssl/config/bn_conf_no-asm.h index 50c1a6126e44..fcb60c5bc77a 100644 --- a/deps/openssl/config/bn_conf_no-asm.h +++ b/deps/openssl/config/bn_conf_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/crypto/bn_conf.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/crypto/bn_conf.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/crypto/bn_conf.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/crypto/bn_conf.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/cmp_asm.h b/deps/openssl/config/cmp_asm.h index 3078a2012464..68c0b635605c 100644 --- a/deps/openssl/config/cmp_asm.h +++ b/deps/openssl/config/cmp_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/cmp.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/cmp.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/cmp.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/cmp.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/cmp_no-asm.h b/deps/openssl/config/cmp_no-asm.h index 7899dd1427ea..41e56b4b4966 100644 --- a/deps/openssl/config/cmp_no-asm.h +++ b/deps/openssl/config/cmp_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/cmp.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/cmp.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/cmp.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/cmp.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/cms_asm.h b/deps/openssl/config/cms_asm.h index 4892cfcf1fd7..806bebf7d05a 100644 --- a/deps/openssl/config/cms_asm.h +++ b/deps/openssl/config/cms_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/cms.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/cms.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/cms.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/cms.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/cms_no-asm.h b/deps/openssl/config/cms_no-asm.h index 7a6a8e6c3556..57c6ca20416d 100644 --- a/deps/openssl/config/cms_no-asm.h +++ b/deps/openssl/config/cms_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/cms.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/cms.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/cms.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/cms.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/comp_asm.h b/deps/openssl/config/comp_asm.h index 9fe7c2b2b31f..200503f60937 100644 --- a/deps/openssl/config/comp_asm.h +++ b/deps/openssl/config/comp_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/comp.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/comp.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/comp.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/comp.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/comp_no-asm.h b/deps/openssl/config/comp_no-asm.h index 3d19d09b04b8..8910b93e4c08 100644 --- a/deps/openssl/config/comp_no-asm.h +++ b/deps/openssl/config/comp_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/comp.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/comp.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/comp.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/comp.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/conf_asm.h b/deps/openssl/config/conf_asm.h index f3047ef764f6..d609084b5ba3 100644 --- a/deps/openssl/config/conf_asm.h +++ b/deps/openssl/config/conf_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/conf.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/conf.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/conf.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/conf.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/conf_no-asm.h b/deps/openssl/config/conf_no-asm.h index ce6cd62a4641..27877b1fbaa3 100644 --- a/deps/openssl/config/conf_no-asm.h +++ b/deps/openssl/config/conf_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/conf.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/conf.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/conf.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/conf.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/configuration_asm.h b/deps/openssl/config/configuration_asm.h index b712fdfc651e..28a086bba1f4 100644 --- a/deps/openssl/config/configuration_asm.h +++ b/deps/openssl/config/configuration_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/configuration.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/configuration.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/configuration.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/configuration.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/configuration_no-asm.h b/deps/openssl/config/configuration_no-asm.h index 1f601c5489b8..1f49de72c86c 100644 --- a/deps/openssl/config/configuration_no-asm.h +++ b/deps/openssl/config/configuration_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/configuration.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/configuration.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/configuration.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/configuration.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/core_names_asm.h b/deps/openssl/config/core_names_asm.h index 0ef6b900a0dd..3c69a034cdc1 100644 --- a/deps/openssl/config/core_names_asm.h +++ b/deps/openssl/config/core_names_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/core_names.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/core_names.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/core_names.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/core_names.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/core_names_no-asm.h b/deps/openssl/config/core_names_no-asm.h index 3af25f42974c..bdad83fda5b0 100644 --- a/deps/openssl/config/core_names_no-asm.h +++ b/deps/openssl/config/core_names_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/core_names.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/core_names.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/core_names.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/core_names.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/crmf_asm.h b/deps/openssl/config/crmf_asm.h index 9be8994c80f0..6ce6fd4027aa 100644 --- a/deps/openssl/config/crmf_asm.h +++ b/deps/openssl/config/crmf_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/crmf.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/crmf.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/crmf.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/crmf.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/crmf_no-asm.h b/deps/openssl/config/crmf_no-asm.h index 099485314d33..f3a8a868d21a 100644 --- a/deps/openssl/config/crmf_no-asm.h +++ b/deps/openssl/config/crmf_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/crmf.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/crmf.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/crmf.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/crmf.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/crypto_asm.h b/deps/openssl/config/crypto_asm.h index 92b9295d376e..a8851567c580 100644 --- a/deps/openssl/config/crypto_asm.h +++ b/deps/openssl/config/crypto_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/crypto.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/crypto.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/crypto.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/crypto.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/crypto_no-asm.h b/deps/openssl/config/crypto_no-asm.h index 28e3447a4a9c..dbd5527df287 100644 --- a/deps/openssl/config/crypto_no-asm.h +++ b/deps/openssl/config/crypto_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/crypto.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/crypto.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/crypto.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/crypto.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/ct_asm.h b/deps/openssl/config/ct_asm.h index 9e27f5ccca2b..0976f604b068 100644 --- a/deps/openssl/config/ct_asm.h +++ b/deps/openssl/config/ct_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/ct.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/ct.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/ct.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/ct.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/ct_no-asm.h b/deps/openssl/config/ct_no-asm.h index 6ac5bdfc707a..f19610305d20 100644 --- a/deps/openssl/config/ct_no-asm.h +++ b/deps/openssl/config/ct_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/ct.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/ct.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/ct.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/ct.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/dso_conf_asm.h b/deps/openssl/config/dso_conf_asm.h index 1e4325557d39..efe5d74d0a40 100644 --- a/deps/openssl/config/dso_conf_asm.h +++ b/deps/openssl/config/dso_conf_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/crypto/dso_conf.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/crypto/dso_conf.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/crypto/dso_conf.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/crypto/dso_conf.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/dso_conf_no-asm.h b/deps/openssl/config/dso_conf_no-asm.h index 4f1674e2caab..edead61b71bc 100644 --- a/deps/openssl/config/dso_conf_no-asm.h +++ b/deps/openssl/config/dso_conf_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/crypto/dso_conf.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/crypto/dso_conf.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/crypto/dso_conf.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/crypto/dso_conf.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/err_asm.h b/deps/openssl/config/err_asm.h index 7f92d845da4c..80b0575372f3 100644 --- a/deps/openssl/config/err_asm.h +++ b/deps/openssl/config/err_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/err.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/err.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/err.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/err.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/err_no-asm.h b/deps/openssl/config/err_no-asm.h index 592a18b71c0c..4d78b1489022 100644 --- a/deps/openssl/config/err_no-asm.h +++ b/deps/openssl/config/err_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/err.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/err.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/err.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/err.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/ess_asm.h b/deps/openssl/config/ess_asm.h index cc549f6e705c..3c495ea70a37 100644 --- a/deps/openssl/config/ess_asm.h +++ b/deps/openssl/config/ess_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/ess.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/ess.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/ess.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/ess.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/ess_no-asm.h b/deps/openssl/config/ess_no-asm.h index 462764497e9b..c62a836ea11c 100644 --- a/deps/openssl/config/ess_no-asm.h +++ b/deps/openssl/config/ess_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/ess.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/ess.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/ess.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/ess.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/fipskey_asm.h b/deps/openssl/config/fipskey_asm.h index 8905e386bf95..b9e020f7b88a 100644 --- a/deps/openssl/config/fipskey_asm.h +++ b/deps/openssl/config/fipskey_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/fipskey.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/fipskey.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/fipskey.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/fipskey.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/fipskey_no-asm.h b/deps/openssl/config/fipskey_no-asm.h index 075e904c34d4..903a00b473e8 100644 --- a/deps/openssl/config/fipskey_no-asm.h +++ b/deps/openssl/config/fipskey_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/fipskey.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/fipskey.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/fipskey.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/fipskey.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/include_asm.h.tmpl b/deps/openssl/config/include_asm.h.tmpl index 287c68fa7cab..df4dbe07a6a1 100644 --- a/deps/openssl/config/include_asm.h.tmpl +++ b/deps/openssl/config/include_asm.h.tmpl @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/%%-$asmdir-%%/include/%%-$incdir-%%/%%-$name-%%.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/%%-$asmdir-%%/include/%%-$incdir-%%/%%-$name-%%.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/%%-$asmdir-%%/include/%%-$incdir-%%/%%-$name-%%.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/%%-$asmdir-%%/include/%%-$incdir-%%/%%-$name-%%.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/include_no-asm.h.tmpl b/deps/openssl/config/include_no-asm.h.tmpl index a1d5dc9f65b2..1265943fecc3 100644 --- a/deps/openssl/config/include_no-asm.h.tmpl +++ b/deps/openssl/config/include_no-asm.h.tmpl @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/%%-$asmdir-%%/include/%%-$incdir-%%/%%-$name-%%.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/%%-$asmdir-%%/include/%%-$incdir-%%/%%-$name-%%.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/%%-$asmdir-%%/include/%%-$incdir-%%/%%-$name-%%.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/%%-$asmdir-%%/include/%%-$incdir-%%/%%-$name-%%.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/lhash_asm.h b/deps/openssl/config/lhash_asm.h index cb066bc45fe7..fd2777febe7f 100644 --- a/deps/openssl/config/lhash_asm.h +++ b/deps/openssl/config/lhash_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/lhash.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/lhash.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/lhash.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/lhash.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/lhash_no-asm.h b/deps/openssl/config/lhash_no-asm.h index e38486f186b5..fb2d1d1943ab 100644 --- a/deps/openssl/config/lhash_no-asm.h +++ b/deps/openssl/config/lhash_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/lhash.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/lhash.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/lhash.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/lhash.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/ocsp_asm.h b/deps/openssl/config/ocsp_asm.h index f15f51d528bb..efd552fff3a1 100644 --- a/deps/openssl/config/ocsp_asm.h +++ b/deps/openssl/config/ocsp_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/ocsp.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/ocsp.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/ocsp.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/ocsp.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/ocsp_no-asm.h b/deps/openssl/config/ocsp_no-asm.h index d88e67309948..8acfd1e2e9ee 100644 --- a/deps/openssl/config/ocsp_no-asm.h +++ b/deps/openssl/config/ocsp_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/ocsp.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/ocsp.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/ocsp.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/ocsp.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/opensslv_asm.h b/deps/openssl/config/opensslv_asm.h index 56d28cef174d..f998a5bbbe9d 100644 --- a/deps/openssl/config/opensslv_asm.h +++ b/deps/openssl/config/opensslv_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/opensslv.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/opensslv.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/opensslv.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/opensslv.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/opensslv_no-asm.h b/deps/openssl/config/opensslv_no-asm.h index 1622ee0987b5..3162d12649ae 100644 --- a/deps/openssl/config/opensslv_no-asm.h +++ b/deps/openssl/config/opensslv_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/opensslv.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/opensslv.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/opensslv.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/opensslv.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/param_names_asm.h b/deps/openssl/config/param_names_asm.h index d3b763128170..4b01f8dc2ca1 100644 --- a/deps/openssl/config/param_names_asm.h +++ b/deps/openssl/config/param_names_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/internal/param_names.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/internal/param_names.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/internal/param_names.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/internal/param_names.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/param_names_no-asm.h b/deps/openssl/config/param_names_no-asm.h index 725ed0aab7ff..8a0c78545ac1 100644 --- a/deps/openssl/config/param_names_no-asm.h +++ b/deps/openssl/config/param_names_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/internal/param_names.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/internal/param_names.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/internal/param_names.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/internal/param_names.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/pkcs12_asm.h b/deps/openssl/config/pkcs12_asm.h index d26928ae2c8f..902a8472e1b3 100644 --- a/deps/openssl/config/pkcs12_asm.h +++ b/deps/openssl/config/pkcs12_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/pkcs12.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/pkcs12.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/pkcs12.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/pkcs12.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/pkcs12_no-asm.h b/deps/openssl/config/pkcs12_no-asm.h index dc097bd278d5..29d59dfb445e 100644 --- a/deps/openssl/config/pkcs12_no-asm.h +++ b/deps/openssl/config/pkcs12_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/pkcs12.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/pkcs12.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/pkcs12.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/pkcs12.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/pkcs7_asm.h b/deps/openssl/config/pkcs7_asm.h index 40b36d238e0d..145b5afc4748 100644 --- a/deps/openssl/config/pkcs7_asm.h +++ b/deps/openssl/config/pkcs7_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/pkcs7.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/pkcs7.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/pkcs7.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/pkcs7.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/pkcs7_no-asm.h b/deps/openssl/config/pkcs7_no-asm.h index 6d643c75b689..4ced6af714c6 100644 --- a/deps/openssl/config/pkcs7_no-asm.h +++ b/deps/openssl/config/pkcs7_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/pkcs7.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/pkcs7.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/pkcs7.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/pkcs7.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/safestack_asm.h b/deps/openssl/config/safestack_asm.h index 37e308d75a08..febbe9003b26 100644 --- a/deps/openssl/config/safestack_asm.h +++ b/deps/openssl/config/safestack_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/safestack.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/safestack.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/safestack.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/safestack.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/safestack_no-asm.h b/deps/openssl/config/safestack_no-asm.h index abadec1cf50f..bebe9a0352dc 100644 --- a/deps/openssl/config/safestack_no-asm.h +++ b/deps/openssl/config/safestack_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/safestack.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/safestack.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/safestack.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/safestack.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/srp_asm.h b/deps/openssl/config/srp_asm.h index d3ddafa5e283..f8f8088612be 100644 --- a/deps/openssl/config/srp_asm.h +++ b/deps/openssl/config/srp_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/srp.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/srp.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/srp.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/srp.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/srp_no-asm.h b/deps/openssl/config/srp_no-asm.h index b85bf9875ab2..6b0e5d0e70bc 100644 --- a/deps/openssl/config/srp_no-asm.h +++ b/deps/openssl/config/srp_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/srp.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/srp.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/srp.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/srp.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/ssl_asm.h b/deps/openssl/config/ssl_asm.h index 86ba489214c6..169e3ee9931c 100644 --- a/deps/openssl/config/ssl_asm.h +++ b/deps/openssl/config/ssl_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/ssl.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/ssl.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/ssl.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/ssl.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/ssl_no-asm.h b/deps/openssl/config/ssl_no-asm.h index 07f72f9312f2..0ca05e119a07 100644 --- a/deps/openssl/config/ssl_no-asm.h +++ b/deps/openssl/config/ssl_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/ssl.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/ssl.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/ssl.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/ssl.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/ui_asm.h b/deps/openssl/config/ui_asm.h index 39fbef4e92c1..c5b82a245201 100644 --- a/deps/openssl/config/ui_asm.h +++ b/deps/openssl/config/ui_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/ui.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/ui.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/ui.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/ui.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/ui_no-asm.h b/deps/openssl/config/ui_no-asm.h index fb3f99be5150..eb295117bec1 100644 --- a/deps/openssl/config/ui_no-asm.h +++ b/deps/openssl/config/ui_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/ui.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/ui.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/ui.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/ui.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/x509_acert_asm.h b/deps/openssl/config/x509_acert_asm.h index 92bc28c9a76b..07f04a9a554e 100644 --- a/deps/openssl/config/x509_acert_asm.h +++ b/deps/openssl/config/x509_acert_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/x509_acert.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/x509_acert.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/x509_acert.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/x509_acert.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/x509_acert_no-asm.h b/deps/openssl/config/x509_acert_no-asm.h index 2deed3faa782..eb2fca3d47ab 100644 --- a/deps/openssl/config/x509_acert_no-asm.h +++ b/deps/openssl/config/x509_acert_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/x509_acert.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/x509_acert.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/x509_acert.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/x509_acert.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/x509_asm.h b/deps/openssl/config/x509_asm.h index 898ec09d155b..bf69421f6af5 100644 --- a/deps/openssl/config/x509_asm.h +++ b/deps/openssl/config/x509_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/x509.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/x509.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/x509.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/x509.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/x509_no-asm.h b/deps/openssl/config/x509_no-asm.h index ef22c66dc60d..0f28e1150678 100644 --- a/deps/openssl/config/x509_no-asm.h +++ b/deps/openssl/config/x509_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/x509.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/x509.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/x509.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/x509.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/x509_vfy_asm.h b/deps/openssl/config/x509_vfy_asm.h index 7e75104d41fb..67fd542be851 100644 --- a/deps/openssl/config/x509_vfy_asm.h +++ b/deps/openssl/config/x509_vfy_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/x509_vfy.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/x509_vfy.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/x509_vfy.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/x509_vfy.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/x509_vfy_no-asm.h b/deps/openssl/config/x509_vfy_no-asm.h index 790be29b0682..cb2ac84fe98b 100644 --- a/deps/openssl/config/x509_vfy_no-asm.h +++ b/deps/openssl/config/x509_vfy_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/x509_vfy.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/x509_vfy.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/x509_vfy.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/x509_vfy.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/config/x509v3_asm.h b/deps/openssl/config/x509v3_asm.h index 83172c0091bf..37da7356bf07 100644 --- a/deps/openssl/config/x509v3_asm.h +++ b/deps/openssl/config/x509v3_asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/asm/include/openssl/x509v3.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/asm/include/openssl/x509v3.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/asm/include/openssl/x509v3.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) # include "./archs/darwin-i386-cc/asm/include/openssl/x509v3.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__x86_64__) diff --git a/deps/openssl/config/x509v3_no-asm.h b/deps/openssl/config/x509v3_no-asm.h index 5477ec8ca065..6bad83c5796b 100644 --- a/deps/openssl/config/x509v3_no-asm.h +++ b/deps/openssl/config/x509v3_no-asm.h @@ -13,6 +13,8 @@ # include "./archs/linux-armv4/no-asm/include/openssl/x509v3.h" #elif defined(OPENSSL_LINUX) && defined(__aarch64__) # include "./archs/linux-aarch64/no-asm/include/openssl/x509v3.h" +#elif defined(OPENSSL_LINUX) && defined(__riscv) && (__riscv_xlen == 64) +# include "./archs/linux64-riscv64/no-asm/include/openssl/x509v3.h" #elif defined(OPENSSL_LINUX) && defined(__loongarch64) # include "./archs/linux64-loongarch64/no-asm/include/openssl/x509v3.h" #elif defined(__APPLE__) && defined(__MACH__) && defined(__i386__) diff --git a/deps/openssl/openssl-cl_asm.gypi b/deps/openssl/openssl-cl_asm.gypi index 2e58f0dcb094..c08000ba6c4a 100644 --- a/deps/openssl/openssl-cl_asm.gypi +++ b/deps/openssl/openssl-cl_asm.gypi @@ -37,6 +37,8 @@ 'includes': ['config/archs/linux-x86_64/asm/openssl-cl.gypi'], }, 'target_arch=="mips64el" and OS=="linux"', { 'includes': ['config/archs/linux64-mips64/asm/openssl-cl.gypi'], + }, 'target_arch=="riscv64" and OS=="linux"', { + 'includes': ['config/archs/linux64-riscv64/asm/openssl-cl.gypi'], },{ # Other architectures don't use assembly 'includes': ['config/archs/linux-x86_64/asm/openssl-cl.gypi'], diff --git a/deps/openssl/openssl-cl_asm_avx2.gypi b/deps/openssl/openssl-cl_asm_avx2.gypi index 03056a832d03..229e856e14d4 100644 --- a/deps/openssl/openssl-cl_asm_avx2.gypi +++ b/deps/openssl/openssl-cl_asm_avx2.gypi @@ -35,6 +35,8 @@ 'includes': ['config/archs/VC-WIN64A/asm_avx2/openssl-cl.gypi'], }, 'target_arch=="x64" and OS=="linux"', { 'includes': ['config/archs/linux-x86_64/asm_avx2/openssl-cl.gypi'], + }, 'target_arch=="riscv64" and OS=="linux"', { + 'includes': ['config/archs/linux64-riscv64/asm_avx2/openssl-cl.gypi'], }, { # Other architectures don't use assembly 'includes': ['config/archs/linux-x86_64/asm_avx2/openssl-cl.gypi'], diff --git a/deps/openssl/openssl-fips_asm.gypi b/deps/openssl/openssl-fips_asm.gypi index 633aae4b3867..ed8a39771f69 100644 --- a/deps/openssl/openssl-fips_asm.gypi +++ b/deps/openssl/openssl-fips_asm.gypi @@ -71,6 +71,8 @@ 'includes': ['config/archs/linux-x86_64/asm/openssl-fips.gypi'], }, 'target_arch=="mips64el" and OS=="linux"', { 'includes': ['config/archs/linux64-mips64/asm/openssl-fips.gypi'], + }, 'target_arch=="riscv64" and OS=="linux"', { + 'includes': ['config/archs/linux64-riscv64/asm/openssl-fips.gypi'], }, { # Other architectures don't use assembly 'includes': ['config/archs/linux-x86_64/asm/openssl-fips.gypi'], diff --git a/deps/openssl/openssl-fips_asm_avx2.gypi b/deps/openssl/openssl-fips_asm_avx2.gypi index 74cc78c42a7b..2dd35807a5bb 100644 --- a/deps/openssl/openssl-fips_asm_avx2.gypi +++ b/deps/openssl/openssl-fips_asm_avx2.gypi @@ -69,6 +69,8 @@ ], }, 'target_arch=="x64" and OS=="linux"', { 'includes': ['config/archs/linux-x86_64/asm_avx2/openssl-fips.gypi'], + }, 'target_arch=="riscv64" and OS=="linux"', { + 'includes': ['config/archs/linux64-riscv64/asm_avx2/openssl-fips.gypi'], }, { # Other architectures don't use assembly 'includes': ['config/archs/linux-x86_64/asm_avx2/openssl-fips.gypi'], diff --git a/deps/openssl/openssl_asm.gypi b/deps/openssl/openssl_asm.gypi index 51631c536bbb..d1b3fbbcd6a7 100644 --- a/deps/openssl/openssl_asm.gypi +++ b/deps/openssl/openssl_asm.gypi @@ -71,6 +71,8 @@ 'includes': ['config/archs/linux-x86_64/asm/openssl.gypi'], }, 'target_arch=="mips64el" and OS=="linux"', { 'includes': ['config/archs/linux64-mips64/asm/openssl.gypi'], + }, 'target_arch=="riscv64" and OS=="linux"', { + 'includes': ['config/archs/linux64-riscv64/asm/openssl.gypi'], }, { # Other architectures don't use assembly 'includes': ['config/archs/linux-x86_64/asm/openssl.gypi'], diff --git a/deps/openssl/openssl_asm_avx2.gypi b/deps/openssl/openssl_asm_avx2.gypi index a6e69b715243..52c89bb1134b 100644 --- a/deps/openssl/openssl_asm_avx2.gypi +++ b/deps/openssl/openssl_asm_avx2.gypi @@ -69,6 +69,8 @@ ], }, 'target_arch=="x64" and OS=="linux"', { 'includes': ['config/archs/linux-x86_64/asm_avx2/openssl.gypi'], + }, 'target_arch=="riscv64" and OS=="linux"', { + 'includes': ['config/archs/linux64-riscv64/asm_avx2/openssl.gypi'], }, { # Other architectures don't use assembly 'includes': ['config/archs/linux-x86_64/asm_avx2/openssl.gypi'], diff --git a/deps/openssl/unofficial.gni b/deps/openssl/unofficial.gni index 6cc699c900d1..2a82d7d44848 100644 --- a/deps/openssl/unofficial.gni +++ b/deps/openssl/unofficial.gni @@ -111,6 +111,8 @@ template("openssl_gn_build") { config_path_name = "linux-armv4" } else if (current_cpu == "arm64") { config_path_name = "linux-aarch64" + } else if (current_cpu == "riscv64") { + config_path_name = "linux64-riscv64" } } else if (is_apple) { if (current_cpu == "x86") { diff --git a/deps/simdjson/simdjson.cpp b/deps/simdjson/simdjson.cpp index 6fa9693596be..0d19312880fd 100644 --- a/deps/simdjson/simdjson.cpp +++ b/deps/simdjson/simdjson.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2026-05-06 17:28:39 -0400. version 4.6.4 Do not edit! */ +/* auto-generated on 2026-07-30 16:20:13 -0400. version 4.6.6 Do not edit! */ /* including simdjson.cpp: */ /* begin file simdjson.cpp */ #define SIMDJSON_SRC_SIMDJSON_CPP diff --git a/deps/simdjson/simdjson.h b/deps/simdjson/simdjson.h index b9befc5b17ed..89175e6d6f70 100644 --- a/deps/simdjson/simdjson.h +++ b/deps/simdjson/simdjson.h @@ -1,4 +1,4 @@ -/* auto-generated on 2026-05-06 17:28:39 -0400. version 4.6.4 Do not edit! */ +/* auto-generated on 2026-07-30 16:20:13 -0400. version 4.6.6 Do not edit! */ /* including simdjson.h: */ /* begin file simdjson.h */ #ifndef SIMDJSON_H @@ -2538,7 +2538,7 @@ namespace std { #define SIMDJSON_SIMDJSON_VERSION_H /** The version of simdjson being used (major.minor.revision) */ -#define SIMDJSON_VERSION "4.6.4" +#define SIMDJSON_VERSION "4.6.6" namespace simdjson { enum { @@ -2553,7 +2553,7 @@ enum { /** * The revision (major.minor.REVISION) of simdjson being used. */ - SIMDJSON_VERSION_REVISION = 4 + SIMDJSON_VERSION_REVISION = 6 }; } // namespace simdjson @@ -8067,16 +8067,28 @@ inline std::pair get_next_key_and_json_path( } 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] == '"')) { + } else if ((i + 1 < json_path.size()) && json_path[i] == '[' && + (json_path[i + 1] == '\'' || json_path[i + 1] == '"')) { + // Bracket-quoted key: ['key'] or ["key"]. + // Require a matching closing quote and a following ']'. If either is + // missing, return an empty key and the original path so callers can treat + // this as a parse failure (e.g. INVALID_JSON_POINTER) without advancing. + // Without this check, i += 2 can make i > size() and substr throws + // std::out_of_range, which aborts noexcept callers such as + // at_path_with_wildcard / for_each_at_path_with_wildcard. + const char quote = json_path[i + 1]; i += 2; - size_t key_start = i; - while (i < json_path.length() && json_path[i] != '\'' && json_path[i] != '"') { + const size_t key_start = i; + while (i < json_path.length() && json_path[i] != quote) { ++i; } - + if (i >= json_path.length() || // missing closing quote + i + 1 >= json_path.length() || // missing ] + json_path[i + 1] != ']') { + return {key, json_path}; + } key = json_path.substr(key_start, i - key_start); - - i += 2; + i += 2; // past quote and ] } 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; @@ -68653,6 +68665,12 @@ inline error_code array::for_each_at_path_with_wildcard(std::string_view json_pa auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Without this check, an empty key is treated as index + // 0 and remaining_path may be unchanged, causing infinite recursion. + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Wildcard case if (key=="*"){ for(auto element: *this) { @@ -72182,6 +72200,12 @@ inline error_code object::for_each_at_path_with_wildcard(std::string_view json_p auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Match DOM at_path_with_wildcard and avoid treating + // "no progress" as a recursive lookup of "". + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Handle when its the case for wildcard if (key == "*") { // Loop through each field in the object @@ -72547,7 +72571,7 @@ simdjson_inline parser::parser(size_t max_capacity) noexcept 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; } + if (string_buf && new_capacity <= capacity() && new_max_depth <= max_depth()) { return SUCCESS; } // string_capacity copied from document::allocate _capacity = 0; @@ -82023,6 +82047,12 @@ inline error_code array::for_each_at_path_with_wildcard(std::string_view json_pa auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Without this check, an empty key is treated as index + // 0 and remaining_path may be unchanged, causing infinite recursion. + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Wildcard case if (key=="*"){ for(auto element: *this) { @@ -85552,6 +85582,12 @@ inline error_code object::for_each_at_path_with_wildcard(std::string_view json_p auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Match DOM at_path_with_wildcard and avoid treating + // "no progress" as a recursive lookup of "". + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Handle when its the case for wildcard if (key == "*") { // Loop through each field in the object @@ -85917,7 +85953,7 @@ simdjson_inline parser::parser(size_t max_capacity) noexcept 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; } + if (string_buf && new_capacity <= capacity() && new_max_depth <= max_depth()) { return SUCCESS; } // string_capacity copied from document::allocate _capacity = 0; @@ -95880,6 +95916,12 @@ inline error_code array::for_each_at_path_with_wildcard(std::string_view json_pa auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Without this check, an empty key is treated as index + // 0 and remaining_path may be unchanged, causing infinite recursion. + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Wildcard case if (key=="*"){ for(auto element: *this) { @@ -99409,6 +99451,12 @@ inline error_code object::for_each_at_path_with_wildcard(std::string_view json_p auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Match DOM at_path_with_wildcard and avoid treating + // "no progress" as a recursive lookup of "". + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Handle when its the case for wildcard if (key == "*") { // Loop through each field in the object @@ -99774,7 +99822,7 @@ simdjson_inline parser::parser(size_t max_capacity) noexcept 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; } + if (string_buf && new_capacity <= capacity() && new_max_depth <= max_depth()) { return SUCCESS; } // string_capacity copied from document::allocate _capacity = 0; @@ -109737,6 +109785,12 @@ inline error_code array::for_each_at_path_with_wildcard(std::string_view json_pa auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Without this check, an empty key is treated as index + // 0 and remaining_path may be unchanged, causing infinite recursion. + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Wildcard case if (key=="*"){ for(auto element: *this) { @@ -113266,6 +113320,12 @@ inline error_code object::for_each_at_path_with_wildcard(std::string_view json_p auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Match DOM at_path_with_wildcard and avoid treating + // "no progress" as a recursive lookup of "". + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Handle when its the case for wildcard if (key == "*") { // Loop through each field in the object @@ -113631,7 +113691,7 @@ simdjson_inline parser::parser(size_t max_capacity) noexcept 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; } + if (string_buf && new_capacity <= capacity() && new_max_depth <= max_depth()) { return SUCCESS; } // string_capacity copied from document::allocate _capacity = 0; @@ -123709,6 +123769,12 @@ inline error_code array::for_each_at_path_with_wildcard(std::string_view json_pa auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Without this check, an empty key is treated as index + // 0 and remaining_path may be unchanged, causing infinite recursion. + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Wildcard case if (key=="*"){ for(auto element: *this) { @@ -127238,6 +127304,12 @@ inline error_code object::for_each_at_path_with_wildcard(std::string_view json_p auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Match DOM at_path_with_wildcard and avoid treating + // "no progress" as a recursive lookup of "". + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Handle when its the case for wildcard if (key == "*") { // Loop through each field in the object @@ -127603,7 +127675,7 @@ simdjson_inline parser::parser(size_t max_capacity) noexcept 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; } + if (string_buf && new_capacity <= capacity() && new_max_depth <= max_depth()) { return SUCCESS; } // string_capacity copied from document::allocate _capacity = 0; @@ -137998,6 +138070,12 @@ inline error_code array::for_each_at_path_with_wildcard(std::string_view json_pa auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Without this check, an empty key is treated as index + // 0 and remaining_path may be unchanged, causing infinite recursion. + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Wildcard case if (key=="*"){ for(auto element: *this) { @@ -141527,6 +141605,12 @@ inline error_code object::for_each_at_path_with_wildcard(std::string_view json_p auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Match DOM at_path_with_wildcard and avoid treating + // "no progress" as a recursive lookup of "". + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Handle when its the case for wildcard if (key == "*") { // Loop through each field in the object @@ -141892,7 +141976,7 @@ simdjson_inline parser::parser(size_t max_capacity) noexcept 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; } + if (string_buf && new_capacity <= capacity() && new_max_depth <= max_depth()) { return SUCCESS; } // string_capacity copied from document::allocate _capacity = 0; @@ -151761,6 +151845,12 @@ inline error_code array::for_each_at_path_with_wildcard(std::string_view json_pa auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Without this check, an empty key is treated as index + // 0 and remaining_path may be unchanged, causing infinite recursion. + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Wildcard case if (key=="*"){ for(auto element: *this) { @@ -155290,6 +155380,12 @@ inline error_code object::for_each_at_path_with_wildcard(std::string_view json_p auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Match DOM at_path_with_wildcard and avoid treating + // "no progress" as a recursive lookup of "". + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Handle when its the case for wildcard if (key == "*") { // Loop through each field in the object @@ -155655,7 +155751,7 @@ simdjson_inline parser::parser(size_t max_capacity) noexcept 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; } + if (string_buf && new_capacity <= capacity() && new_max_depth <= max_depth()) { return SUCCESS; } // string_capacity copied from document::allocate _capacity = 0; @@ -165547,6 +165643,12 @@ inline error_code array::for_each_at_path_with_wildcard(std::string_view json_pa auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Without this check, an empty key is treated as index + // 0 and remaining_path may be unchanged, causing infinite recursion. + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Wildcard case if (key=="*"){ for(auto element: *this) { @@ -169076,6 +169178,12 @@ inline error_code object::for_each_at_path_with_wildcard(std::string_view json_p auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Match DOM at_path_with_wildcard and avoid treating + // "no progress" as a recursive lookup of "". + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Handle when its the case for wildcard if (key == "*") { // Loop through each field in the object @@ -169441,7 +169549,7 @@ simdjson_inline parser::parser(size_t max_capacity) noexcept 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; } + if (string_buf && new_capacity <= capacity() && new_max_depth <= max_depth()) { return SUCCESS; } // string_capacity copied from document::allocate _capacity = 0; @@ -179337,6 +179445,12 @@ inline error_code array::for_each_at_path_with_wildcard(std::string_view json_pa auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Without this check, an empty key is treated as index + // 0 and remaining_path may be unchanged, causing infinite recursion. + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Wildcard case if (key=="*"){ for(auto element: *this) { @@ -182866,6 +182980,12 @@ inline error_code object::for_each_at_path_with_wildcard(std::string_view json_p auto result_pair = get_next_key_and_json_path(json_path); std::string_view key = result_pair.first; std::string_view remaining_path = result_pair.second; + // Empty key means the path segment could not be parsed (including malformed + // bracket-quoted keys). Match DOM at_path_with_wildcard and avoid treating + // "no progress" as a recursive lookup of "". + if (key.empty()) { + return INVALID_JSON_POINTER; + } // Handle when its the case for wildcard if (key == "*") { // Loop through each field in the object @@ -183231,7 +183351,7 @@ simdjson_inline parser::parser(size_t max_capacity) noexcept 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; } + if (string_buf && new_capacity <= capacity() && new_max_depth <= max_depth()) { return SUCCESS; } // string_capacity copied from document::allocate _capacity = 0; diff --git a/deps/sqlite/sqlite3.c b/deps/sqlite/sqlite3.c index 09f3e4a9f829..0644a39f8734 100644 --- a/deps/sqlite/sqlite3.c +++ b/deps/sqlite/sqlite3.c @@ -1,6 +1,6 @@ /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite -** version 3.53.3. By combining all the individual C code files into this +** version 3.53.4. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a single translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements @@ -18,7 +18,7 @@ ** separate file. This file contains only code for the core SQLite library. ** ** The content in this amalgamation comes from Fossil check-in -** d4c0e51e4aeb96955b99185ab9cde75c339e with changes in files: +** bf7c7f30031888f4e796e429ab3978879485 with changes in files: ** ** */ @@ -467,12 +467,12 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.53.3" -#define SQLITE_VERSION_NUMBER 3053003 -#define SQLITE_SOURCE_ID "2026-06-26 20:14:12 d4c0e51e4aeb96955b99185ab9cde75c339e2c29c3f3f12428d364a10d782c62" +#define SQLITE_VERSION "3.53.4" +#define SQLITE_VERSION_NUMBER 3053004 +#define SQLITE_SOURCE_ID "2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc" #define SQLITE_SCM_BRANCH "branch-3.53" -#define SQLITE_SCM_TAGS "release version-3.53.3" -#define SQLITE_SCM_DATETIME "2026-06-26T20:14:12.354Z" +#define SQLITE_SCM_TAGS "release version-3.53.4" +#define SQLITE_SCM_DATETIME "2026-07-24T19:02:57.525Z" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -27591,7 +27591,7 @@ SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p }else{ double r; rc = pVfs->xCurrentTime(pVfs, &r); - *pTimeOut = (sqlite3_int64)(r*86400000.0); + *pTimeOut = sqlite3RealToI64(r*86400000.0); } return rc; } @@ -60969,7 +60969,7 @@ static int readSuperJournal(sqlite3_file *pJrnl, u64 nSuper, char **pzSuper){ cksum -= zOut[u]; } } - if( rc!=SQLITE_OK || cksum ){ + if( rc!=SQLITE_OK || cksum || zOut[0]==0 ){ /* If the checksum doesn't add up, then one or more of the disk sectors ** containing the super-journal filename is corrupted. This means ** definitely roll back, so just return SQLITE_OK and report a (nul) @@ -111437,11 +111437,20 @@ static SQLITE_NOINLINE void resolveSetExprSubtypeArg(ExprList *pList){ nn = pList ? pList->nExpr : 0; for(ii=0; iia[ii].pExpr; - ExprSetProperty(pExpr, EP_SubtArg); - if( pExpr->op==TK_SELECT ){ - assert( ExprUseXSelect(pExpr) ); - assert( pExpr->x.pSelect!=0 ); - resolveSetExprSubtypeArg(pExpr->x.pSelect->pEList); + while( 1 /*exit-by-break*/ ){ + ExprSetProperty(pExpr, EP_SubtArg); + if( pExpr->op==TK_SELECT ){ + assert( ExprUseXSelect(pExpr) ); + assert( pExpr->x.pSelect!=0 ); + resolveSetExprSubtypeArg(pExpr->x.pSelect->pEList); + break; + } + if( pExpr->op==TK_UPLUS ){ + pExpr = pExpr->pLeft; + assert( pExpr!=0 ); + }else{ + break; + } } } } @@ -176954,7 +176963,7 @@ static void nth_valueStepFunc( break; case SQLITE_FLOAT: { double fVal = sqlite3_value_double(apArg[1]); - if( ((i64)fVal)!=fVal ) goto error_out; + if( sqlite3RealToI64(fVal)!=fVal ) goto error_out; iVal = (i64)fVal; break; } @@ -210776,8 +210785,8 @@ static int fts3StringAppend( ** to grow the buffer until so that it is big enough to accommodate the ** appended data. */ - if( pStr->n+nAppend+1>=pStr->nAlloc ){ - sqlite3_int64 nAlloc = pStr->nAlloc+(sqlite3_int64)nAppend+100; + if( (i64)pStr->n+(i64)nAppend+1>=(i64)pStr->nAlloc ){ + i64 nAlloc = pStr->nAlloc+(i64)nAppend+100; char *zNew = sqlite3_realloc64(pStr->z, nAlloc); if( !zNew ){ return SQLITE_NOMEM; @@ -214981,7 +214990,8 @@ static u32 jsonTranslateBlobToText( if( sz==0 ) goto malformed_jsonb; if( zIn[0]=='-' ){ jsonAppendChar(pOut, '-'); - k++; + if( sz<=1 ) goto malformed_jsonb; + k = 1; } if( zIn[k]=='.' ){ jsonAppendChar(pOut, '0'); @@ -217945,7 +217955,9 @@ static int jsonSkipLabel(JsonEachCursor *p){ if( p->eType==JSONB_OBJECT ){ u32 sz = 0; u32 n = jsonbPayloadSize(&p->sParse, p->i, &sz); - return p->i + n + sz; + sz += p->i + n; + if( sz >= p->sParse.nBlob ) sz = p->i; + return sz; }else{ return p->i; } @@ -226906,8 +226918,8 @@ static int rbuDeltaApply( int lenDelta, /* Length of the delta */ char *zOut /* Write the output into this preallocated buffer */ ){ - unsigned int limit; - unsigned int total = 0; + sqlite3_uint64 limit; + sqlite3_uint64 total = 0; #if RBU_ENABLE_DELTA_CKSUM char *zOrigOut = zOut; #endif @@ -226917,8 +226929,8 @@ static int rbuDeltaApply( /* ERROR: size integer not terminated by "\n" */ return -1; } - zDelta++; lenDelta--; - while( *zDelta && lenDelta>0 ){ + zDelta++; lenDelta--; /* Skip the \n */ + while( lenDelta>0 && zDelta[0] ){ unsigned int cnt, ofst; cnt = rbuDeltaGetInt(&zDelta, &lenDelta); if( lenDelta<=0 ) return -1; @@ -226926,7 +226938,7 @@ static int rbuDeltaApply( case '@': { zDelta++; lenDelta--; ofst = rbuDeltaGetInt(&zDelta, &lenDelta); - if( lenDelta>0 || zDelta[0]!=',' ){ + if( lenDelta>0 && zDelta[0]!=',' ){ /* ERROR: copy command not terminated by ',' */ return -1; } @@ -226951,7 +226963,7 @@ static int rbuDeltaApply( /* ERROR: insert command gives an output larger than predicted */ return -1; } - if( (i64)cnt>(i64)lenDelta ){ + if( cnt>lenDelta ){ /* ERROR: insert count exceeds size of delta */ return -1; } @@ -228964,13 +228976,13 @@ static int rbuGetUpdateStmt( char *zUpdate = 0; pUp->zMask = (char*)&pUp[1]; - memcpy(pUp->zMask, zMask, pIter->nTblCol); pUp->pNext = pIter->pRbuUpdate; pIter->pRbuUpdate = pUp; if( zSet ){ const char *zPrefix = ""; - + assert( p->rc==SQLITE_OK ); + memcpy(pUp->zMask, zMask, pIter->nTblCol); if( pIter->eType!=RBU_PK_VTAB ) zPrefix = "rbu_imp_"; zUpdate = sqlite3_mprintf("UPDATE \"%s%w\" SET %s WHERE %s", zPrefix, pIter->zTbl, zSet, zWhere @@ -229060,6 +229072,9 @@ static RbuState *rbuLoadState(sqlite3rbu *p){ case RBU_STATE_ROW: pRet->nRow = sqlite3_column_int(pStmt, 1); + if( pRet->nRow<0 ){ + rc = SQLITE_CORRUPT; + } break; case RBU_STATE_PROGRESS: @@ -240296,7 +240311,12 @@ static int sessionChangesetToHash( pIter->in.bNoDiscard = 1; while( SQLITE_ROW==(sessionChangesetNext(pIter, &aRec, &nRec, 0)) ){ - rc = sessionOneChangeIterToHash(pGrp, pIter, bRebase); + if( bRebase && pIter->bPatchset ){ + /* A patchset may not be used as a rebase */ + rc = SQLITE_ERROR; + }else{ + rc = sessionOneChangeIterToHash(pGrp, pIter, bRebase); + } if( rc!=SQLITE_OK ) break; } @@ -240673,13 +240693,14 @@ static void sessionAppendPartialUpdate( int i; u8 *a1 = aRec; u8 *a2 = aChange; + u8 *a2Eof = &a2[nChange]; *pOut++ = SQLITE_UPDATE; *pOut++ = pIter->bIndirect; for(i=0; inCol; i++){ int n1 = sessionSerialLen(a1); - int n2 = sessionSerialLen(a2); - if( pIter->abPK[i] || a2[0]==0 ){ + int n2 = (a2>=a2Eof) ? 0 : sessionSerialLen(a2); + if( n2<=0 || pIter->abPK[i] || a2[0]==0 ){ if( !pIter->abPK[i] && a1[0] ) bData = 1; memcpy(pOut, a1, n1); pOut += n1; @@ -240880,8 +240901,8 @@ SQLITE_API int sqlite3rebaser_configure( sqlite3_rebaser *p, int nRebase, const void *pRebase ){ - sqlite3_changeset_iter *pIter = 0; /* Iterator opened on pData/nData */ int rc; /* Return code */ + sqlite3_changeset_iter *pIter = 0; /* Iterator opened on pData/nData */ rc = sqlite3changeset_start(&pIter, nRebase, (void*)pRebase); if( rc==SQLITE_OK ){ rc = sessionChangesetToHash(pIter, &p->grp, 1); @@ -251701,6 +251722,7 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ pRet = (Fts5Data*)sqlite3_malloc64(nAlloc); if( pRet ){ pRet->nn = nByte; + pRet->szLeaf = 0; aOut = pRet->p = (u8*)pRet + szData; }else{ rc = SQLITE_NOMEM; @@ -251713,10 +251735,8 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ sqlite3_free(pRet); pRet = 0; }else{ - /* TODO1: Fix this */ pRet->p[nByte] = 0x00; pRet->p[nByte+1] = 0x00; - pRet->szLeaf = fts5GetU16(&pRet->p[2]); } } p->rc = rc; @@ -251737,9 +251757,17 @@ static void fts5DataRelease(Fts5Data *pData){ sqlite3_free(pData); } +/* +** Read a leaf-page record. This is similar to fts5DataRead(), except that +** it fills in the Fts5Data.szLeaf value before returning. +*/ static Fts5Data *fts5LeafRead(Fts5Index *p, i64 iRowid){ Fts5Data *pRet = fts5DataRead(p, iRowid); if( pRet ){ + assert( pRet->szLeaf==0 ); + if( pRet->nn>=4 ){ + pRet->szLeaf = fts5GetU16(&pRet->p[2]); + } if( pRet->szLeaf<4 || pRet->szLeaf>pRet->nn ){ FTS5_CORRUPT_ROWID(p, iRowid); fts5DataRelease(pRet); @@ -253649,6 +253677,10 @@ static void fts5SegIterNextInit( pIter->iPgidxOff = pIter->pLeaf->szLeaf; pIter->iPgidxOff += fts5GetVarint32(&a[pIter->iPgidxOff], iTermOff); + if( iTermOff > pIter->pLeaf->szLeaf ){ + p->rc = FTS5_CORRUPT; + return; + } pIter->iLeafOffset = iTermOff; fts5SegIterLoadTerm(p, pIter, 0); fts5SegIterLoadNPos(p, pIter); @@ -255975,7 +256007,7 @@ static void fts5SecureDeleteOverflow( int iNext = 0; u8 *aPg = 0; - pLeaf = fts5DataRead(p, iRowid); + pLeaf = fts5LeafRead(p, iRowid); if( pLeaf==0 ) break; aPg = pLeaf->p; @@ -255983,7 +256015,7 @@ static void fts5SecureDeleteOverflow( if( iNext!=0 ){ *pbLastInDoclist = 0; } - if( iNext==0 && pLeaf->szLeaf!=pLeaf->nn ){ + if( iNext==0 && pLeaf->szLeafnn ){ fts5GetVarint32(&aPg[pLeaf->szLeaf], iNext); } @@ -256270,7 +256302,7 @@ static void fts5DoSecureDelete( /* The entry being removed may be the only position list in ** its doclist. */ for(iPgno=pSeg->iLeafPgno-1; iPgno>pSeg->iTermLeafPgno; iPgno-- ){ - Fts5Data *pPg = fts5DataRead(p, FTS5_SEGMENT_ROWID(iSegid, iPgno)); + Fts5Data *pPg = fts5LeafRead(p, FTS5_SEGMENT_ROWID(iSegid, iPgno)); int bEmpty = (pPg && pPg->nn==4); fts5DataRelease(pPg); if( bEmpty==0 ) break; @@ -256278,7 +256310,7 @@ static void fts5DoSecureDelete( if( iPgno==pSeg->iTermLeafPgno ){ i64 iId = FTS5_SEGMENT_ROWID(iSegid, pSeg->iTermLeafPgno); - Fts5Data *pTerm = fts5DataRead(p, iId); + Fts5Data *pTerm = fts5LeafRead(p, iId); if( pTerm && pTerm->szLeaf==pSeg->iTermLeafOffset ){ u8 *aTermIdx = &pTerm->p[pTerm->szLeaf]; int nTermIdx = pTerm->nn - pTerm->szLeaf; @@ -259230,7 +259262,7 @@ static void fts5IndexIntegrityCheckEmpty( /* Now check that the iter.nEmpty leaves following the current leaf ** (a) exist and (b) contain no terms. */ for(i=iFirst; p->rc==SQLITE_OK && i<=iLast; i++){ - Fts5Data *pLeaf = fts5DataRead(p, FTS5_SEGMENT_ROWID(pSeg->iSegid, i)); + Fts5Data *pLeaf = fts5LeafRead(p, FTS5_SEGMENT_ROWID(pSeg->iSegid, i)); if( pLeaf ){ if( !fts5LeafIsTermless(pLeaf) || (i>=iNoRowid && 0!=fts5LeafFirstRowidOff(pLeaf)) @@ -259358,7 +259390,7 @@ static void fts5IndexIntegrityCheckSegment( FTS5_CORRUPT_ROWID(p, iRow); }else{ iOff += fts5GetVarint32(&pLeaf->p[iOff], nTerm); - if( iOff+nTerm>pLeaf->szLeaf ){ + if( (i64)iOff+(i64)nTerm>(i64)pLeaf->szLeaf ){ FTS5_CORRUPT_ROWID(p, iRow); }else{ res = fts5Memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm)); @@ -263086,19 +263118,23 @@ static int fts5ApiPhraseFirstColumn( if( pConfig->eDetail==FTS5_DETAIL_COLUMNS ){ Fts5Sorter *pSorter = pCsr->pSorter; - int n; - if( pSorter ){ - int i1 = (iPhrase==0 ? 0 : pSorter->aIdx[iPhrase-1]); - n = pSorter->aIdx[iPhrase] - i1; - pIter->a = &pSorter->aPoslist[i1]; + if( iPhrase<0 || iPhrase>=sqlite3Fts5ExprPhraseCount(pCsr->pExpr) ){ + rc = SQLITE_RANGE; }else{ - rc = sqlite3Fts5ExprPhraseCollist(pCsr->pExpr, iPhrase, &pIter->a, &n); - } - if( rc==SQLITE_OK ){ - assert( pIter->a || n==0 ); - pIter->b = (pIter->a ? &pIter->a[n] : 0); - *piCol = 0; - fts5ApiPhraseNextColumn(pCtx, pIter, piCol); + int n; + if( pSorter ){ + int i1 = (iPhrase==0 ? 0 : pSorter->aIdx[iPhrase-1]); + n = pSorter->aIdx[iPhrase] - i1; + pIter->a = &pSorter->aPoslist[i1]; + }else{ + rc = sqlite3Fts5ExprPhraseCollist(pCsr->pExpr, iPhrase, &pIter->a, &n); + } + if( rc==SQLITE_OK ){ + assert( pIter->a || n==0 ); + pIter->b = (pIter->a ? &pIter->a[n] : 0); + *piCol = 0; + fts5ApiPhraseNextColumn(pCtx, pIter, piCol); + } } }else{ int n; @@ -264006,7 +264042,7 @@ static void fts5SourceIdFunc( ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); - sqlite3_result_text(pCtx, "fts5: 2026-06-26 20:14:12 d4c0e51e4aeb96955b99185ab9cde75c339e2c29c3f3f12428d364a10d782c62", -1, SQLITE_TRANSIENT); + sqlite3_result_text(pCtx, "fts5: 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc", -1, SQLITE_TRANSIENT); } /* diff --git a/deps/sqlite/sqlite3.h b/deps/sqlite/sqlite3.h index 00b22d9b107c..c91b81c08f55 100644 --- a/deps/sqlite/sqlite3.h +++ b/deps/sqlite/sqlite3.h @@ -146,12 +146,12 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.53.3" -#define SQLITE_VERSION_NUMBER 3053003 -#define SQLITE_SOURCE_ID "2026-06-26 20:14:12 d4c0e51e4aeb96955b99185ab9cde75c339e2c29c3f3f12428d364a10d782c62" +#define SQLITE_VERSION "3.53.4" +#define SQLITE_VERSION_NUMBER 3053004 +#define SQLITE_SOURCE_ID "2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc" #define SQLITE_SCM_BRANCH "branch-3.53" -#define SQLITE_SCM_TAGS "release version-3.53.3" -#define SQLITE_SCM_DATETIME "2026-06-26T20:14:12.354Z" +#define SQLITE_SCM_TAGS "release version-3.53.4" +#define SQLITE_SCM_DATETIME "2026-07-24T19:02:57.525Z" /* ** CAPI3REF: Run-Time Library Version Numbers diff --git a/deps/v8/AUTHORS b/deps/v8/AUTHORS index b7e6fac8f836..148600dd569a 100644 --- a/deps/v8/AUTHORS +++ b/deps/v8/AUTHORS @@ -76,6 +76,7 @@ Artem Kobzar Arthur Islamov Asuka Shikina Aurèle Barrière +Aviv Keller Bala Avulapati Bangfu Tao Ben Coe diff --git a/deps/v8/src/inspector/injected-script.cc b/deps/v8/src/inspector/injected-script.cc index e2703b4e5c48..2d6a14be965c 100644 --- a/deps/v8/src/inspector/injected-script.cc +++ b/deps/v8/src/inspector/injected-script.cc @@ -204,8 +204,7 @@ class InjectedScript::ProtocolPromiseHandler { PromiseHandlerTracker::DiscardReason::kFulfilled); } - ProtocolPromiseHandler(PromiseHandlerTracker::Id id, - V8InspectorSessionImpl* session, + ProtocolPromiseHandler(V8InspectorSessionImpl* session, int executionContextId, const String16& objectGroup, std::unique_ptr wrapOptions, bool replMode, bool throwOnSideEffect, @@ -220,7 +219,13 @@ class InjectedScript::ProtocolPromiseHandler { m_replMode(replMode), m_throwOnSideEffect(throwOnSideEffect), m_callback(std::move(callback)), - m_evaluationResult(m_inspector->isolate(), evaluationResult) { + m_evaluationResult(m_inspector->isolate(), evaluationResult) {} + + void makeWeak(PromiseHandlerTracker::Id id) { + if (m_isActive || m_evaluationResult.IsEmpty() || + m_evaluationResult.IsWeak()) { + return; + } m_evaluationResult.SetWeak(reinterpret_cast(id), cleanup, v8::WeakCallbackType::kParameter); } @@ -238,6 +243,7 @@ class InjectedScript::ProtocolPromiseHandler { } void thenCallback(v8::Local value) { + m_isActive = true; // We don't need the m_evaluationResult in the `thenCallback`, but we also // don't want `cleanup` running in case we re-enter JS. m_evaluationResult.Reset(); @@ -285,9 +291,10 @@ class InjectedScript::ProtocolPromiseHandler { } void catchCallback(v8::Local result) { + m_isActive = true; // Hold strongly onto m_evaluationResult now to prevent `cleanup` from // running in case any code below triggers GC. - m_evaluationResult.ClearWeak(); + if (m_evaluationResult.IsWeak()) m_evaluationResult.ClearWeak(); V8InspectorSessionImpl* session = m_inspector->sessionById(m_contextGroupId, m_sessionId); if (!session) return; @@ -393,6 +400,7 @@ class InjectedScript::ProtocolPromiseHandler { std::unique_ptr m_wrapOptions; bool m_replMode; bool m_throwOnSideEffect; + bool m_isActive = false; std::weak_ptr m_callback; v8::Global m_evaluationResult; }; @@ -1190,8 +1198,7 @@ template PromiseHandlerTracker::Id PromiseHandlerTracker::create(Args&&... args) { Id id = m_lastUsedId++; InjectedScript::ProtocolPromiseHandler* handler = - new InjectedScript::ProtocolPromiseHandler(id, - std::forward(args)...); + new InjectedScript::ProtocolPromiseHandler(std::forward(args)...); m_promiseHandlers.emplace(id, handler); return id; } @@ -1225,6 +1232,30 @@ InjectedScript::ProtocolPromiseHandler* PromiseHandlerTracker::get( return iter->second.get(); } +void PromiseHandlerTracker::makeWeakForContext(int executionContextId) { + for (auto& [id, handler] : m_promiseHandlers) { + if (handler->m_executionContextId == executionContextId) { + handler->makeWeak(id); + } + } +} + +void PromiseHandlerTracker::makeWeakForObjectGroup( + int sessionId, const String16& objectGroup) { + for (auto& [id, handler] : m_promiseHandlers) { + if (handler->m_sessionId == sessionId && + handler->m_objectGroup == objectGroup) { + handler->makeWeak(id); + } + } +} + +void PromiseHandlerTracker::makeWeakForSession(int sessionId) { + for (auto& [id, handler] : m_promiseHandlers) { + if (handler->m_sessionId == sessionId) handler->makeWeak(id); + } +} + void PromiseHandlerTracker::sendFailure( InjectedScript::ProtocolPromiseHandler* handler, const protocol::DispatchResponse& response) const { diff --git a/deps/v8/src/inspector/injected-script.h b/deps/v8/src/inspector/injected-script.h index 895f01fde9aa..864bc8c53f9f 100644 --- a/deps/v8/src/inspector/injected-script.h +++ b/deps/v8/src/inspector/injected-script.h @@ -298,6 +298,9 @@ class PromiseHandlerTracker { Id create(Args&&... args); void discard(Id id, DiscardReason reason); InjectedScript::ProtocolPromiseHandler* get(Id id) const; + void makeWeakForContext(int executionContextId); + void makeWeakForObjectGroup(int sessionId, const String16& objectGroup); + void makeWeakForSession(int sessionId); private: void sendFailure(InjectedScript::ProtocolPromiseHandler* handler, diff --git a/deps/v8/src/inspector/v8-inspector-impl.cc b/deps/v8/src/inspector/v8-inspector-impl.cc index 8172e3a55486..4130205e8013 100644 --- a/deps/v8/src/inspector/v8-inspector-impl.cc +++ b/deps/v8/src/inspector/v8-inspector-impl.cc @@ -261,6 +261,7 @@ void V8InspectorImpl::contextCollected(int groupId, int contextId) { session->runtimeAgent()->reportExecutionContextDestroyed(inspectedContext); }); discardInspectedContext(groupId, contextId); + m_promiseHandlerTracker.makeWeakForContext(contextId); } void V8InspectorImpl::resetContextGroup(int contextGroupId) { diff --git a/deps/v8/src/inspector/v8-inspector-session-impl.cc b/deps/v8/src/inspector/v8-inspector-session-impl.cc index 916ddb5ebbd4..106a7eee795e 100644 --- a/deps/v8/src/inspector/v8-inspector-session-impl.cc +++ b/deps/v8/src/inspector/v8-inspector-session-impl.cc @@ -233,6 +233,7 @@ void V8InspectorSessionImpl::discardInjectedScripts() { [&sessionId](InspectedContext* context) { context->discardInjectedScript(sessionId); }); + m_inspector->promiseHandlerTracker().makeWeakForSession(sessionId); } Response V8InspectorSessionImpl::findInjectedScript( @@ -269,6 +270,10 @@ void V8InspectorSessionImpl::releaseObjectGroup(const String16& objectGroup) { InjectedScript* injectedScript = context->getInjectedScript(sessionId); if (injectedScript) injectedScript->releaseObjectGroup(objectGroup); }); + if (!objectGroup.isEmpty()) { + m_inspector->promiseHandlerTracker().makeWeakForObjectGroup(m_sessionId, + objectGroup); + } } bool V8InspectorSessionImpl::unwrapObject( diff --git a/deps/v8/src/maglev/maglev-code-gen-state.h b/deps/v8/src/maglev/maglev-code-gen-state.h index 00721d06aab3..fa18b28d432b 100644 --- a/deps/v8/src/maglev/maglev-code-gen-state.h +++ b/deps/v8/src/maglev/maglev-code-gen-state.h @@ -9,6 +9,7 @@ #include "src/codegen/label.h" #include "src/codegen/machine-type.h" #include "src/codegen/maglev-safepoint-table.h" +#include "src/codegen/source-position-table.h" #include "src/common/globals.h" #include "src/compiler/backend/instruction.h" #include "src/compiler/js-heap-broker.h" @@ -34,9 +35,11 @@ class MaglevCodeGenState { public: MaglevCodeGenState(MaglevCompilationInfo* compilation_info, MaglevSafepointTableBuilder* safepoint_table_builder, + SourcePositionTableBuilder* source_position_table_builder, uint32_t max_block_id) : compilation_info_(compilation_info), safepoint_table_builder_(safepoint_table_builder), + source_position_table_builder_(source_position_table_builder), real_jump_target_(max_block_id) {} void set_tagged_slots(int slots) { tagged_slots_ = slots; } @@ -80,6 +83,9 @@ class MaglevCodeGenState { MaglevSafepointTableBuilder* safepoint_table_builder() const { return safepoint_table_builder_; } + SourcePositionTableBuilder* source_position_table_builder() const { + return source_position_table_builder_; + } MaglevCompilationInfo* compilation_info() const { return compilation_info_; } Label* entry_label() { return &entry_label_; } @@ -121,6 +127,7 @@ class MaglevCodeGenState { private: MaglevCompilationInfo* const compilation_info_; MaglevSafepointTableBuilder* const safepoint_table_builder_; + SourcePositionTableBuilder* const source_position_table_builder_; std::vector deferred_code_; std::vector eager_deopts_; diff --git a/deps/v8/src/maglev/maglev-code-generator.cc b/deps/v8/src/maglev/maglev-code-generator.cc index 3bc1becd1f31..d6c7ded9745d 100644 --- a/deps/v8/src/maglev/maglev-code-generator.cc +++ b/deps/v8/src/maglev/maglev-code-generator.cc @@ -707,7 +707,14 @@ class ExceptionHandlerTrampolineBuilder { class MaglevCodeGeneratingNodeProcessor { public: MaglevCodeGeneratingNodeProcessor(MaglevAssembler* masm, Zone* zone) - : masm_(masm), zone_(zone) {} + : masm_(masm), + zone_(zone), + // Cache for faster check. + collect_source_positions_(masm->code_gen_state() + ->compilation_info() + ->collect_source_positions()) { + DCHECK_IMPLIES(collect_source_positions_, graph_labeller() != nullptr); + } void PreProcessGraph(Graph* graph) { // TODO(victorgomes): I wonder if we want to create a struct that shares @@ -800,6 +807,15 @@ class MaglevCodeGeneratingNodeProcessor { << PrintNode(graph_labeller(), node); __ RecordComment(ss.str()); } + if (collect_source_positions_) { + // TODO(leszeks): Consider collecting source position in a more memory + // friendly way, if we don't need the whole graph labeller. + const auto& provenance = graph_labeller()->GetNodeProvenance(node); + if (provenance.position.IsKnown()) { + code_gen_state()->source_position_table_builder()->AddPosition( + masm_->pc_offset(), provenance.position, false); + } + } if (v8_flags.maglev_assert_stack_size) { __ AssertStackSizeCorrect(); @@ -1105,6 +1121,7 @@ class MaglevCodeGeneratingNodeProcessor { } MaglevAssembler* const masm_; Zone* zone_; + bool collect_source_positions_; }; class SafepointingNodeProcessor { @@ -1695,8 +1712,9 @@ MaglevCodeGenerator::MaglevCodeGenerator( safepoint_table_builder_(compilation_info->zone(), graph->tagged_stack_slots()), frame_translation_builder_(compilation_info->zone()), + source_position_table_builder_(compilation_info->zone()), code_gen_state_(compilation_info, &safepoint_table_builder_, - graph->max_block_id()), + &source_position_table_builder_, graph->max_block_id()), masm_(isolate->GetMainThreadIsolateUnsafe(), compilation_info->zone(), &code_gen_state_), graph_(graph), @@ -1919,6 +1937,10 @@ MaybeHandle MaglevCodeGenerator::BuildCodeObject( LocalIsolate* local_isolate) { if (!code_gen_succeeded_) return {}; + // Allocate the source position table. + Handle source_positions = + source_position_table_builder_.ToSourcePositionTable(local_isolate); + Handle deopt_data = (v8_flags.maglev_deopt_data_on_background && !v8_flags.maglev_build_code_on_background) @@ -1934,7 +1956,7 @@ MaybeHandle MaglevCodeGenerator::BuildCodeObject( .set_stack_slots(stack_slot_count_with_fixed_frame()) .set_parameter_count(parameter_count()) .set_deoptimization_data(deopt_data) - .set_empty_source_position_table() + .set_source_position_table(source_positions) .set_inlined_bytecode_size(graph_->total_inlined_bytecode_size()) .set_osr_offset( code_gen_state_.compilation_info()->toplevel_osr_offset()); diff --git a/deps/v8/src/maglev/maglev-code-generator.h b/deps/v8/src/maglev/maglev-code-generator.h index 198d2f867763..db7bca8a7f47 100644 --- a/deps/v8/src/maglev/maglev-code-generator.h +++ b/deps/v8/src/maglev/maglev-code-generator.h @@ -6,6 +6,7 @@ #define V8_MAGLEV_MAGLEV_CODE_GENERATOR_H_ #include "src/codegen/maglev-safepoint-table.h" +#include "src/codegen/source-position-table.h" #include "src/common/globals.h" #include "src/deoptimizer/frame-translation-builder.h" #include "src/maglev/maglev-assembler.h" @@ -54,6 +55,7 @@ class MaglevCodeGenerator final { LocalIsolate* local_isolate_; MaglevSafepointTableBuilder safepoint_table_builder_; FrameTranslationBuilder frame_translation_builder_; + SourcePositionTableBuilder source_position_table_builder_; MaglevCodeGenState code_gen_state_; MaglevAssembler masm_; Graph* const graph_; diff --git a/deps/v8/src/maglev/maglev-compiler.cc b/deps/v8/src/maglev/maglev-compiler.cc index 7bece9f40573..d8ca95101f94 100644 --- a/deps/v8/src/maglev/maglev-compiler.cc +++ b/deps/v8/src/maglev/maglev-compiler.cc @@ -82,6 +82,18 @@ bool MaglevCompiler::Compile(LocalIsolate* local_isolate, compilation_info->set_graph_labeller(new MaglevGraphLabeller()); } + // When collecting source positions for profiling, create a graph labeller + // so per-node provenance (including inlined positions) is recorded during + // graph building and a real source position table can be attached to the + // Code object. + // Upstream V8 folds this into the single graph-labeller condition; node's + // V8 creates the labeller in a differently-shaped block, so the condition + // is added separately here. + if (compilation_info->collect_source_positions() && + !compilation_info->has_graph_labeller()) { + compilation_info->set_graph_labeller(new MaglevGraphLabeller()); + } + if (is_tracing_enabled && (v8_flags.print_maglev_code || v8_flags.print_maglev_graph || v8_flags.print_maglev_graphs || v8_flags.trace_maglev_graph_building || diff --git a/deps/v8/test/inspector/runtime/evaluate-promise-lifetime-expected.txt b/deps/v8/test/inspector/runtime/evaluate-promise-lifetime-expected.txt new file mode 100644 index 000000000000..6216bff5f443 --- /dev/null +++ b/deps/v8/test/inspector/runtime/evaluate-promise-lifetime-expected.txt @@ -0,0 +1,65 @@ +Tests the lifetime of pending Runtime.evaluate requests. + +Running test: testPromiseIsKeptAlive +Using replMode: +{ + id : + result : { + result : { + description : 42 + type : number + value : 42 + } + } +} +Using awaitPromise: +{ + id : + result : { + result : { + description : 42 + type : number + value : 42 + } + } +} + +Running test: testObjectGroupReleaseMakesPromiseCollectible +Using replMode: +{ + error : { + code : -32000 + message : Promise was collected + } + id : +} +Using awaitPromise: +{ + error : { + code : -32000 + message : Promise was collected + } + id : +} + +Running test: testContextDestructionDiscardsPromise +Using replMode: +{ + error : { + code : -32000 + message : Execution context was destroyed. + } + id : +} +Using awaitPromise: +{ + error : { + code : -32000 + message : Execution context was destroyed. + } + id : +} + +Running test: testSessionDestructionMakesPromiseCollectible +Promise is alive before disconnect: true +Promise is alive after disconnect: false diff --git a/deps/v8/test/inspector/runtime/evaluate-promise-lifetime.js b/deps/v8/test/inspector/runtime/evaluate-promise-lifetime.js new file mode 100644 index 000000000000..49bde5385185 --- /dev/null +++ b/deps/v8/test/inspector/runtime/evaluate-promise-lifetime.js @@ -0,0 +1,105 @@ +// 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: --no-stress-incremental-marking + +let {Protocol} = InspectorTest.start( + 'Tests the lifetime of pending Runtime.evaluate requests.'); + +const evaluationModes = [ + { + name: 'replMode', + arguments: {replMode: true}, + expression: + 'await new Promise(resolve => globalThis.resolve = resolve); 42', + resolveExpression: 'resolve()', + pendingExpression: 'await new Promise(() => {})', + }, + { + name: 'awaitPromise', + arguments: {awaitPromise: true}, + expression: `(() => { + let resolve; + const promise = new Promise(r => resolve = r); + promise.resolve = resolve; + globalThis.weak = new WeakRef(promise); + return promise; + })()`, + resolveExpression: 'weak.deref().resolve(42)', + pendingExpression: 'new Promise(() => {})', + }, +]; + +function evaluate(Protocol, mode, expression, extraArguments = {}) { + return Protocol.Runtime.evaluate( + {...mode.arguments, ...extraArguments, expression}); +} + +InspectorTest.runAsyncTestSuite([ + async function testPromiseIsKeptAlive() { + for (const mode of evaluationModes) { + InspectorTest.log(`Using ${mode.name}:`); + const evaluation = evaluate(Protocol, mode, mode.expression); + + await Protocol.HeapProfiler.collectGarbage(); + await Protocol.Runtime.evaluate({expression: mode.resolveExpression}); + + InspectorTest.logMessage(await evaluation); + } + }, + + async function testObjectGroupReleaseMakesPromiseCollectible() { + for (const mode of evaluationModes) { + InspectorTest.log(`Using ${mode.name}:`); + const evaluation = evaluate( + Protocol, mode, mode.pendingExpression, + {objectGroup: 'evaluation'}); + + await Protocol.Runtime.releaseObjectGroup({objectGroup: 'evaluation'}); + await Protocol.HeapProfiler.collectGarbage(); + + InspectorTest.logMessage(await evaluation); + } + }, + + async function testContextDestructionDiscardsPromise() { + for (const mode of evaluationModes) { + InspectorTest.log(`Using ${mode.name}:`); + const contextGroup = new InspectorTest.ContextGroup(); + const session = contextGroup.connect(); + const evaluation = evaluate( + session.Protocol, mode, mode.pendingExpression); + + await session.Protocol.Runtime.evaluate( + {expression: 'inspector.fireContextDestroyed()'}); + + InspectorTest.logMessage(await evaluation); + session.disconnect(); + } + }, + + async function testSessionDestructionMakesPromiseCollectible() { + const contextGroup = new InspectorTest.ContextGroup(); + const session1 = contextGroup.connect(); + const session2 = contextGroup.connect(); + session1.Protocol.Runtime.evaluate({ + expression: evaluationModes[1].expression, + awaitPromise: true, + }); + + await session2.Protocol.HeapProfiler.collectGarbage(); + let result = await session2.Protocol.Runtime.evaluate( + {expression: 'weak.deref() !== undefined'}); + InspectorTest.log( + `Promise is alive before disconnect: ${result.result.result.value}`); + + session1.disconnect(); + await session2.Protocol.HeapProfiler.collectGarbage(); + result = await session2.Protocol.Runtime.evaluate( + {expression: 'weak.deref() !== undefined'}); + InspectorTest.log( + `Promise is alive after disconnect: ${result.result.result.value}`); + session2.disconnect(); + }, +]); diff --git a/deps/v8/test/unittests/maglev/maglev-assembler-unittest.cc b/deps/v8/test/unittests/maglev/maglev-assembler-unittest.cc index 7ee24fd121a9..47030eb1449d 100644 --- a/deps/v8/test/unittests/maglev/maglev-assembler-unittest.cc +++ b/deps/v8/test/unittests/maglev/maglev-assembler-unittest.cc @@ -18,7 +18,7 @@ class MaglevAssemblerTest : public MaglevTest { public: MaglevAssemblerTest() : MaglevTest(), - codegen_state(nullptr, nullptr, 0), + codegen_state(nullptr, nullptr, nullptr, 0), as(isolate(), zone(), &codegen_state) {} void FinalizeAndRun(Label* pass, Label* fail) { diff --git a/deps/zlib/contrib/minizip/unzip.c b/deps/zlib/contrib/minizip/unzip.c index 0264f7ac570f..4eb0de302cfd 100644 --- a/deps/zlib/contrib/minizip/unzip.c +++ b/deps/zlib/contrib/minizip/unzip.c @@ -1439,6 +1439,8 @@ local int unz64local_CheckCurrentFileCoherencyHeader(unz64_s* s, uInt* piSizeVar */ if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) err=UNZ_ERRNO; + else if ((err==UNZ_OK) && ((uFlags & 1) != (s->cur_file_info.flag & 1))) + err=UNZ_BADZIPFILE; /* LFH/CD encryption flag mismatch */ if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) err=UNZ_ERRNO; diff --git a/deps/zlib/contrib/tests/utils_unittest.cc b/deps/zlib/contrib/tests/utils_unittest.cc index f8cd93c70558..6161e39f0262 100644 --- a/deps/zlib/contrib/tests/utils_unittest.cc +++ b/deps/zlib/contrib/tests/utils_unittest.cc @@ -1424,6 +1424,29 @@ TEST(ZlibTest, ZipUnicodePathExtra) { EXPECT_EQ(unzClose(uzf), UNZ_OK); } +TEST(ZlibTest, ZipEncryptionFlagMismatch) { + // Test archive created with info-zip: + // $ echo -n a > a && zip -P a -k a.zip a + // and then hex-edited to drop the encrypted flag from the central directory. + base::FilePath zip_file = TestDataDir().AppendASCII("enc_flag_mismatch.zip"); + + unzFile uzf = unzOpen(zip_file.AsUTF8Unsafe().c_str()); + ASSERT_NE(uzf, nullptr); + + char name[100]; + unz_file_info file_info; + + ASSERT_EQ(unzGoToFirstFile(uzf), UNZ_OK); + ASSERT_EQ(unzGetCurrentFileInfo(uzf, &file_info, name, sizeof(name), + nullptr, 0, nullptr, 0), UNZ_OK); + ASSERT_EQ(std::string(name), "A"); + + // minizip should reject the member due to lfh/cd encrypted flag mismatch. + EXPECT_EQ(unzOpenCurrentFilePassword(uzf, "a"), UNZ_BADZIPFILE); + + EXPECT_EQ(unzClose(uzf), UNZ_OK); +} + TEST(ZlibTest, Crbug500521311) { base::FilePath zip_file = TestDataDir().AppendASCII("bug500521311.zip"); unzFile uzf = unzOpen(zip_file.AsUTF8Unsafe().c_str()); diff --git a/deps/zlib/google/test/data/enc_flag_mismatch.zip b/deps/zlib/google/test/data/enc_flag_mismatch.zip new file mode 100644 index 000000000000..bb140077bd7f Binary files /dev/null and b/deps/zlib/google/test/data/enc_flag_mismatch.zip differ diff --git a/deps/zlib/google/test_data.filelist b/deps/zlib/google/test_data.filelist index 73ed6c3c9317..9761df114797 100644 --- a/deps/zlib/google/test_data.filelist +++ b/deps/zlib/google/test_data.filelist @@ -19,6 +19,7 @@ test/data/bug500521311.zip test/data/create_symlink_test_zips.py test/data/create_test_zip.sh test/data/empty.zip +test/data/enc_flag_mismatch.zip test/data/evil.zip test/data/evil_via_absolute_file_name.zip test/data/evil_via_invalid_utf8.zip diff --git a/deps/zlib/google/zip_reader.cc b/deps/zlib/google/zip_reader.cc index 002a1e3ed01d..7b5b28967cfb 100644 --- a/deps/zlib/google/zip_reader.cc +++ b/deps/zlib/google/zip_reader.cc @@ -16,6 +16,7 @@ #include "base/files/file.h" #include "base/files/file_util.h" #include "base/functional/bind.h" +#include "base/i18n/i18n_constants.h" #include "base/i18n/icu_string_conversions.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" @@ -307,25 +308,63 @@ bool ZipReader::OpenEntry() { DCHECK(path_in_zip[info.size_filename] == '\0'); entry_.path_in_original_encoding = path_in_zip.data(); + const char* const configured_encoding = + encoding_.empty() ? base::kCodepageUTF8 : encoding_.c_str(); + const char* entry_path_encoding = configured_encoding; + bool physical_path_is_directory = false; + bool physical_path_is_unsafe = false; + + // If an Info-ZIP Unicode Path Extra Field is present, the physical Central + // Directory path is about to be overridden. Decode and normalize it now into + // `entry_.physical_path` so consumers (e.g. Safe Browsing) can still see the + // name that other tools (e.g. Windows Explorer) would use for extraction. if (info.size_utf8_filename > 0) { + std::u16string physical_path_in_utf16; + if (!base::CodepageToUTF16(entry_.path_in_original_encoding, + configured_encoding, + base::OnStringConversionError::SUBSTITUTE, + &physical_path_in_utf16)) { + LOG(ERROR) << "Cannot convert path from encoding " << configured_encoding; + return false; + } + // Normalize() stores the normalized result in entry_.path; copy it before + // applying the Unicode Path Extra Field below. + Normalize(physical_path_in_utf16); + entry_.physical_path = entry_.path; + physical_path_is_directory = entry_.is_directory; + physical_path_is_unsafe = entry_.is_unsafe; + // Use the Info-ZIP Unicode Path Extra Field if present. DCHECK(info.utf8_filename[info.size_utf8_filename] == '\0'); entry_.path_in_original_encoding = info.utf8_filename; + entry_path_encoding = base::kCodepageUTF8; } // Convert path from original encoding to Unicode. std::u16string path_in_utf16; - const char* const encoding = encoding_.empty() ? "UTF-8" : encoding_.c_str(); - if (!base::CodepageToUTF16(entry_.path_in_original_encoding, encoding, + if (!base::CodepageToUTF16(entry_.path_in_original_encoding, + entry_path_encoding, base::OnStringConversionError::SUBSTITUTE, &path_in_utf16)) { - LOG(ERROR) << "Cannot convert path from encoding " << encoding; + LOG(ERROR) << "Cannot convert path from encoding " << entry_path_encoding; return false; } // Normalize path. Normalize(path_in_utf16); + if (info.size_utf8_filename > 0) { + // Treat an entry as a directory only if both names are directories; + // otherwise callers that analyze file entries should inspect it as a file. + entry_.is_directory = entry_.is_directory && physical_path_is_directory; + // Treat an entry as unsafe if either name is unsafe. + entry_.is_unsafe = entry_.is_unsafe || physical_path_is_unsafe; + } else { + // In the common case (no Unicode Path Extra Field) the physical path + // matches the effective path. + entry_.physical_path = entry_.path; + } + entry_.original_size = info.uncompressed_size; // The file content of this entry is encrypted if flag bit 0 is set. diff --git a/deps/zlib/google/zip_reader.h b/deps/zlib/google/zip_reader.h index 8bc4a21d27c3..af7536149f6f 100644 --- a/deps/zlib/google/zip_reader.h +++ b/deps/zlib/google/zip_reader.h @@ -130,6 +130,11 @@ class ZipReader { // ./a -> DOT/a base::FilePath path; + // Physical path from the ZIP Central Directory, before applying the + // Info-ZIP Unicode Path Extra Field. This is converted and normalized in + // the same way as `path`. + base::FilePath physical_path; + // Size of the original uncompressed file, or 0 if the entry is a directory. // This value should not be trusted, because it is stored as metadata in the // ZIP archive and can be different from the real uncompressed size. diff --git a/deps/zlib/google/zip_reader_unittest.cc b/deps/zlib/google/zip_reader_unittest.cc index 7a9f24b434ec..578539ffbf76 100644 --- a/deps/zlib/google/zip_reader_unittest.cc +++ b/deps/zlib/google/zip_reader_unittest.cc @@ -558,6 +558,24 @@ TEST_F(ZipReaderTest, EncryptedFile_RightPassword) { EXPECT_TRUE(reader.ok()); } +// An entry whose local file header has the "encrypted" general-purpose flag +// bit set while the central directory does not should be rejected. +TEST_F(ZipReaderTest, MismatchedEncryptionFlag) { + ZipReader reader; + ASSERT_TRUE(reader.Open(data_dir_.AppendASCII("enc_flag_mismatch.zip"))); + + const ZipReader::Entry* entry = reader.Next(); + ASSERT_TRUE(entry); + EXPECT_EQ(base::FilePath::FromASCII("A"), entry->path); + EXPECT_FALSE(entry->is_directory); + std::string contents = "dummy"; + EXPECT_FALSE(reader.ExtractCurrentEntryToString(&contents)); + EXPECT_EQ("", contents); + + EXPECT_FALSE(reader.Next()); + EXPECT_TRUE(reader.ok()); +} + // Verifies that the ZipReader class can extract a file from a zip archive // stored in memory. This test opens a zip archive in a std::string object, // extracts its content, and verifies the content is the same as the expected @@ -980,6 +998,123 @@ TEST_F(ZipReaderTest, WrongFilenameLength) { reader.Next(); } +TEST_F(ZipReaderTest, UnicodePathExtraFieldPreservesPhysicalPath) { + static const char test_data[] = { + 0x50, 0x4b, 0x03, 0x04, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x71, + 0x91, 0x4e, 0x11, 0x2c, 0xf9, 0x51, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, + 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6c, 0x77, 0x61, 0x72, + 0x65, 0x2e, 0x65, 0x78, 0x65, 0x54, 0x65, 0x73, 0x74, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x3f, 0x03, 0x0a, 0x03, 0x00, 0x00, + 0x00, 0x00, 0xd0, 0x71, 0x91, 0x4e, 0x11, 0x2c, 0xf9, 0x51, 0x09, 0x00, + 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0xc9, 0x81, 0x00, 0x00, 0x00, 0x00, + 0x6d, 0x61, 0x6c, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x75, + 0x70, 0x11, 0x00, 0x01, 0xed, 0x4b, 0x16, 0x3c, 0x64, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x05, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x4e, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00}; + + std::string test_string(test_data, sizeof(test_data)); + ZipReader reader; + ASSERT_TRUE(reader.OpenFromString(test_string)); + const ZipReader::Entry* entry = reader.Next(); + ASSERT_TRUE(entry); + // The Unicode Path Extra Field overrides the Central Directory filename, + // but the original physical path is preserved separately. `is_unsafe` tracks + // path traversal safety, not whether the filename looks executable. + EXPECT_EQ(base::FilePath::FromUTF8Unsafe("download.txt"), entry->path); + EXPECT_EQ(base::FilePath::FromUTF8Unsafe("malware.exe"), + entry->physical_path); + EXPECT_FALSE(entry->is_directory); + EXPECT_FALSE(entry->is_unsafe); +} + +TEST_F(ZipReaderTest, UnicodePathExtraFieldUsesUtf8WithConfiguredEncoding) { + static constexpr uint8_t test_data[] = { + 0x50, 0x4b, 0x03, 0x04, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x71, + 0x91, 0x4e, 0x11, 0x2c, 0xf9, 0x51, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, + 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6c, 0x77, 0x61, 0x72, + 0x65, 0x2e, 0x65, 0x78, 0x65, 0x54, 0x65, 0x73, 0x74, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x3f, 0x03, 0x0a, 0x03, 0x00, 0x00, + 0x00, 0x00, 0xd0, 0x71, 0x91, 0x4e, 0x11, 0x2c, 0xf9, 0x51, 0x09, 0x00, + 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0xc9, 0x81, 0x00, 0x00, 0x00, 0x00, + 0x6d, 0x61, 0x6c, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x75, + 0x70, 0x11, 0x00, 0x01, 0xed, 0x4b, 0x16, 0x3c, 0x72, 0xc3, 0xa9, 0x73, + 0x75, 0x6d, 0xc3, 0xa9, 0x2e, 0x74, 0x78, 0x74, 0x50, 0x4b, 0x05, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x4e, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00}; + + std::string test_string(reinterpret_cast(test_data), + sizeof(test_data)); + ZipReader reader; + ASSERT_TRUE(reader.OpenFromString(test_string)); + reader.SetEncoding("windows-1252"); + const ZipReader::Entry* entry = reader.Next(); + ASSERT_TRUE(entry); + EXPECT_EQ(base::FilePath::FromUTF8Unsafe("résumé.txt"), entry->path); + EXPECT_EQ(base::FilePath::FromUTF8Unsafe("malware.exe"), + entry->physical_path); +} + +TEST_F(ZipReaderTest, UnicodePathExtraFieldFileIfEitherPathIsFile) { + static const char test_data[] = { + 0x50, 0x4b, 0x03, 0x04, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x71, + 0x91, 0x4e, 0x11, 0x2c, 0xf9, 0x51, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6c, 0x77, 0x61, 0x72, + 0x65, 0x2e, 0x65, 0x78, 0x65, 0x2f, 0x54, 0x65, 0x73, 0x74, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x3f, 0x03, 0x0a, 0x03, 0x00, + 0x00, 0x00, 0x00, 0xd0, 0x71, 0x91, 0x4e, 0x11, 0x2c, 0xf9, 0x51, 0x09, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0xc9, 0x81, 0x00, 0x00, 0x00, + 0x00, 0x6d, 0x61, 0x6c, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x65, 0x78, 0x65, + 0x2f, 0x75, 0x70, 0x10, 0x00, 0x01, 0x5a, 0x5a, 0x54, 0xa7, 0x6d, 0x61, + 0x6c, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x50, 0x4b, 0x05, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x4e, 0x00, 0x00, + 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00}; + + std::string test_string(test_data, sizeof(test_data)); + ZipReader reader; + ASSERT_TRUE(reader.OpenFromString(test_string)); + const ZipReader::Entry* entry = reader.Next(); + ASSERT_TRUE(entry); + EXPECT_EQ(base::FilePath::FromUTF8Unsafe("malware.exe"), entry->path); + EXPECT_EQ(base::FilePath::FromUTF8Unsafe("malware.exe/"), + entry->physical_path); + EXPECT_FALSE(entry->is_directory); + EXPECT_FALSE(entry->is_unsafe); +} + +TEST_F(ZipReaderTest, UnicodePathExtraFieldPreservesUnsafePhysicalPath) { + static const char test_data[] = { + 0x50, 0x4b, 0x03, 0x04, 0x0a, 0x03, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x71, + 0x91, 0x4e, 0x11, 0x2c, 0xf9, 0x51, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6c, + 0x77, 0x61, 0x72, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x2f, + 0x2e, 0x2e, 0x54, 0x65, 0x73, 0x74, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x50, 0x4b, 0x01, 0x02, 0x3f, 0x03, 0x0a, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x71, 0x91, 0x4e, 0x11, 0x2c, 0xf9, + 0x51, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x15, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0xc9, 0x81, 0x00, + 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6c, 0x77, 0x61, 0x72, + 0x65, 0x2e, 0x65, 0x78, 0x65, 0x2f, 0x2e, 0x2e, 0x75, + 0x70, 0x11, 0x00, 0x01, 0x7c, 0xbc, 0xe2, 0x5d, 0x64, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x74, + 0x78, 0x74, 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x51, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00}; + + std::string test_string(test_data, sizeof(test_data)); + ZipReader reader; + ASSERT_TRUE(reader.OpenFromString(test_string)); + const ZipReader::Entry* entry = reader.Next(); + ASSERT_TRUE(entry); + EXPECT_EQ(base::FilePath::FromUTF8Unsafe("download.txt"), entry->path); + EXPECT_EQ(base::FilePath::FromUTF8Unsafe("malware.exe/UP"), + entry->physical_path); + EXPECT_FALSE(entry->is_directory); + EXPECT_TRUE(entry->is_unsafe); +} + class FileWriterDelegateTest : public ::testing::Test { protected: void SetUp() override { diff --git a/deps/zlib/patches/0015-minizip-unzip-enable-decryption.patch b/deps/zlib/patches/0015-minizip-unzip-enable-decryption.patch index feeeb1c40077..dcc7499f3535 100644 --- a/deps/zlib/patches/0015-minizip-unzip-enable-decryption.patch +++ b/deps/zlib/patches/0015-minizip-unzip-enable-decryption.patch @@ -26,3 +26,31 @@ index 82275d6c1775d..c8a01b23efd42 100644 s->encrypted=1; } # endif + +commit 874ed6b46a4f75407829e510db77cc673a4c86e7 +Author: Hans Wennborg +Date: Mon Jun 15 11:33:46 2026 +0200 + + Check LFH / CD encryption flag consistency + + unz64local_CheckCurrentFileCoherencyHeader performs various consistency + checks on the values in the Local File Header and Central Directory. + Make it check the encryption flag as well. + + Bug: 514461031 + Change-Id: Ifaf8620c6e0c345118712bce6e1206bbb83b3a2d + Reviewed-on: https://chromium-review.googlesource.com/7942389 + +diff --git a/third_party/zlib/contrib/minizip/unzip.c b/third_party/zlib/contrib/minizip/unzip.c +index 0264f7ac570f7..4eb0de302cfdf 100644 +--- a/third_party/zlib/contrib/minizip/unzip.c ++++ b/third_party/zlib/contrib/minizip/unzip.c +@@ -1439,6 +1439,8 @@ local int unz64local_CheckCurrentFileCoherencyHeader(unz64_s* s, uInt* piSizeVar + */ + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) + err=UNZ_ERRNO; ++ else if ((err==UNZ_OK) && ((uFlags & 1) != (s->cur_file_info.flag & 1))) ++ err=UNZ_BADZIPFILE; /* LFH/CD encryption flag mismatch */ + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; diff --git a/doc/api/addons.md b/doc/api/addons.md index 48eaeb078456..6b4205327c03 100644 --- a/doc/api/addons.md +++ b/doc/api/addons.md @@ -14,7 +14,7 @@ There are three options for implementing addons: * `nan` ([Native Abstractions for Node.js][]) * direct use of internal V8, libuv, and Node.js libraries -This rest of this document focuses on the latter, requiring +The rest of this document focuses on the latter, requiring knowledge of multiple components and APIs: * [V8][]: the C++ library Node.js uses to provide the @@ -113,7 +113,7 @@ To integrate with the npm ecosystem, see the [Building][] section. ### Context-aware addons -Addons defined with `NODE_MODULE()` can not be loaded in multiple contexts or +Addons defined with `NODE_MODULE()` cannot be loaded in multiple contexts or multiple threads at the same time. There are environments in which Node.js addons may need to be loaded multiple @@ -255,7 +255,7 @@ changes: In order to be loaded from multiple Node.js environments, such as a main thread and a Worker thread, an add-on needs to either: -* Be an [Node-API][] addon. +* Be a [Node-API][] addon. * Be declared as context-aware using `NODE_MODULE_INIT()` as described above. In order to support [`Worker`][] threads, addons need to clean up any resources @@ -483,13 +483,13 @@ See [C/C++ addons with Node-API][Node-API]. ## Addon examples -Following are some example addons intended to help developers get started. The +The following are some example addons intended to help developers get started. The examples use the V8 APIs. Refer to the online [V8 reference][v8-docs] for help with the various V8 calls, and V8's [Embedder's Guide][] for an explanation of several concepts used such as handles, scopes, function templates, etc. -Each of these examples using the following `binding.gyp` file: +Each of these examples uses the following `binding.gyp` file: ```json { @@ -951,7 +951,7 @@ provided by the underlying V8 JavaScript engine. They are subject to change or removal at any time. They are not documented by Node.js or V8, and they should never be used outside of testing. -During shutdown of the process or worker threads destructors are not called +During shutdown of the process or worker threads, destructors are not called by the JS engine. Therefore it's the responsibility of the user to track these objects and ensure proper destruction to avoid resource leaks. @@ -1171,7 +1171,7 @@ console.log(obj2.plusOne()); In addition to wrapping and returning C++ objects, it is possible to pass wrapped objects around by unwrapping them with the Node.js helper function -`node::ObjectWrap::Unwrap`. The following examples shows a function `add()` +`node::ObjectWrap::Unwrap`. The following example shows a function `add()` that can take two `MyObject` objects as input arguments: ```cpp diff --git a/doc/api/assert.md b/doc/api/assert.md index 2aa7ba4ed3a7..a641522b7689 100644 --- a/doc/api/assert.md +++ b/doc/api/assert.md @@ -887,6 +887,7 @@ are recursively evaluated also by the following rules. * [`[[Prototype]]`][prototype-spec] of objects are compared using the [`===` operator][]. * Only [enumerable "own" properties][] are considered. +* Object constructors are compared when available. * {Error} names, messages, causes, and errors are always compared, even if these are not enumerable properties. `errors` is also compared. diff --git a/doc/api/async_context.md b/doc/api/async_context.md index dd3b6a834ec9..1b6169c60d23 100644 --- a/doc/api/async_context.md +++ b/doc/api/async_context.md @@ -386,6 +386,110 @@ try { } ``` +### `asyncLocalStorage.withScope(store)` + + + +> Stability: 1 - Experimental + +* `store` {any} +* Returns: {RunScope} + +Creates a disposable scope that enters the given store and automatically +restores the previous store value when the scope is disposed. This method is +designed to work with JavaScript's explicit resource management (`using` syntax). + +Example: + +```mjs +import { AsyncLocalStorage } from 'node:async_hooks'; + +const asyncLocalStorage = new AsyncLocalStorage(); + +{ + using _ = asyncLocalStorage.withScope('my-store'); + console.log(asyncLocalStorage.getStore()); // Prints: my-store +} + +console.log(asyncLocalStorage.getStore()); // Prints: undefined +``` + +```cjs +const { AsyncLocalStorage } = require('node:async_hooks'); + +const asyncLocalStorage = new AsyncLocalStorage(); + +{ + using _ = asyncLocalStorage.withScope('my-store'); + console.log(asyncLocalStorage.getStore()); // Prints: my-store +} + +console.log(asyncLocalStorage.getStore()); // Prints: undefined +``` + +The `withScope()` method is particularly useful for managing context in +synchronous code where you want to ensure the previous store value is restored +when exiting a block, even if an error is thrown. + +```mjs +import { AsyncLocalStorage } from 'node:async_hooks'; + +const asyncLocalStorage = new AsyncLocalStorage(); + +try { + using _ = asyncLocalStorage.withScope('my-store'); + console.log(asyncLocalStorage.getStore()); // Prints: my-store + throw new Error('test'); +} catch (e) { + // Store is automatically restored even after error + console.log(asyncLocalStorage.getStore()); // Prints: undefined +} +``` + +```cjs +const { AsyncLocalStorage } = require('node:async_hooks'); + +const asyncLocalStorage = new AsyncLocalStorage(); + +try { + using _ = asyncLocalStorage.withScope('my-store'); + console.log(asyncLocalStorage.getStore()); // Prints: my-store + throw new Error('test'); +} catch (e) { + // Store is automatically restored even after error + console.log(asyncLocalStorage.getStore()); // Prints: undefined +} +``` + +**Important:** When using `withScope()` in async functions before the first +`await`, be aware that the scope change will affect the caller's context. The +synchronous portion of an async function (before the first `await`) runs +immediately when called, and when it reaches the first `await`, it returns the +promise to the caller. At that point, the scope change becomes visible in the +caller's context and will persist in subsequent synchronous code until something +else changes the scope value. For async operations, prefer using `run()` which +properly isolates context across async boundaries. + +```mjs +import { AsyncLocalStorage } from 'node:async_hooks'; + +const asyncLocalStorage = new AsyncLocalStorage(); + +async function example() { + using _ = asyncLocalStorage.withScope('my-store'); + console.log(asyncLocalStorage.getStore()); // Prints: my-store + await someAsyncOperation(); // Function pauses here and returns promise + console.log(asyncLocalStorage.getStore()); // Prints: my-store +} + +// Calling without await +example(); // Synchronous portion runs, then pauses at first await +// After the promise is returned, the scope 'my-store' is now active in caller! +console.log(asyncLocalStorage.getStore()); // Prints: my-store (unexpected!) +``` + ### Usage with `async/await` If, within an async function, only one `await` call is to run within a context, @@ -420,6 +524,64 @@ of `asyncLocalStorage.getStore()` after the calls you suspect are responsible for the loss. When the code logs `undefined`, the last callback called is probably responsible for the context loss. +## Class: `RunScope` + + + +> Stability: 1 - Experimental + +A disposable scope returned by [`asyncLocalStorage.withScope()`][] that +automatically restores the previous store value when disposed. This class +implements the [Explicit Resource Management][] protocol and is designed to work +with JavaScript's `using` syntax. + +The scope automatically restores the previous store value when the `using` block +exits, whether through normal completion or by throwing an error. + +### `scope.dispose()` + + + +Explicitly ends the scope and restores the previous store value. This method +is idempotent: calling it multiple times has the same effect as calling it once. + +The `[Symbol.dispose]()` method defers to `dispose()`. + +If `withScope()` is called without the `using` keyword, `dispose()` must be +called manually to restore the previous store value. Forgetting to call +`dispose()` will cause the store value to persist for the remainder of the +current execution context: + +```mjs +import { AsyncLocalStorage } from 'node:async_hooks'; + +const storage = new AsyncLocalStorage(); + +// Without using, the scope must be disposed manually +const scope = storage.withScope('my-store'); +// storage.getStore() === 'my-store' here + +scope.dispose(); // Restore previous value +// storage.getStore() === undefined here +``` + +```cjs +const { AsyncLocalStorage } = require('node:async_hooks'); + +const storage = new AsyncLocalStorage(); + +// Without using, the scope must be disposed manually +const scope = storage.withScope('my-store'); +// storage.getStore() === 'my-store' here + +scope.dispose(); // Restore previous value +// storage.getStore() === undefined here +``` + ## Class: `AsyncResource` * `value` {string|Buffer|Uint8Array|integer} What to search for. -* `byteOffset` {integer} Where to begin searching in `buf`. If negative, then +* `start` {integer} Where to begin searching in `buf`. If negative, then offset is calculated from the end of `buf`. **Default:** `0`. +* `end` {integer} Where to stop searching in `buf` (exclusive). **Default:** + `buf.length`. * `encoding` {string} If `value` is a string, this is its encoding. **Default:** `'utf8'`. * Returns: {boolean} `true` if `value` was found in `buf`, `false` otherwise. @@ -2146,11 +2151,14 @@ console.log(buf.includes('this', 4)); // Prints: false ``` -### `buf.indexOf(value[, byteOffset][, encoding])` +### `buf.indexOf(value[, start[, end]][, encoding])` * `value` {string|Buffer|Uint8Array|integer} What to search for. -* `byteOffset` {integer} Where to begin searching in `buf`. If negative, then +* `start` {integer} Where to begin searching in `buf`. If negative, then offset is calculated from the end of `buf`. **Default:** `0`. +* `end` {integer} Where to stop searching in `buf` (exclusive). **Default:** + `buf.length`. * `encoding` {string} If `value` is a string, this is the encoding used to determine the binary representation of the string that will be searched for in `buf`. **Default:** `'utf8'`. @@ -2324,20 +2334,25 @@ for (const key of buf.keys()) { // 5 ``` -### `buf.lastIndexOf(value[, byteOffset][, encoding])` +### `buf.lastIndexOf(value[, start[, end]][, encoding])` * `value` {string|Buffer|Uint8Array|integer} What to search for. -* `byteOffset` {integer} Where to begin searching in `buf`. If negative, then +* `start` {integer} Where to begin searching in `buf`. If negative, then offset is calculated from the end of `buf`. **Default:** `buf.length - 1`. +* `end` {integer} Where to stop searching in `buf` (exclusive). **Default:** + `buf.length`. * `encoding` {string} If `value` is a string, this is the encoding used to determine the binary representation of the string that will be searched for in `buf`. **Default:** `'utf8'`. @@ -5623,7 +5638,7 @@ introducing security vulnerabilities into an application. [`buf.compare()`]: #bufcomparetarget-targetstart-targetend-sourcestart-sourceend [`buf.entries()`]: #bufentries [`buf.fill()`]: #buffillvalue-offset-end-encoding -[`buf.indexOf()`]: #bufindexofvalue-byteoffset-encoding +[`buf.indexOf()`]: #bufindexofvalue-start-end-encoding [`buf.keys()`]: #bufkeys [`buf.length`]: #buflength [`buf.slice()`]: #bufslicestart-end diff --git a/doc/api/cli.md b/doc/api/cli.md index f8da061fa2d0..86a644418033 100644 --- a/doc/api/cli.md +++ b/doc/api/cli.md @@ -642,10 +642,12 @@ Disable the ability of starting a debugging session by sending a added: - v21.3.0 - v20.11.0 +changes: + - version: v24.20.0 + pr-url: https://github.com/nodejs/node/pull/64742 + description: The `--disable-warning` flag is now stable. --> -> Stability: 1.1 - Active development - Disable specific process warnings by `code` or `type`. Warnings emitted from [`process.emitWarning()`][emit_warning] may contain a @@ -1148,17 +1150,41 @@ added: Enable experimental support for the network inspection with Chrome DevTools. +### `--experimental-package-map=` + + + +> Stability: 1 - Experimental + +Enable experimental package map resolution. The `path` argument specifies the +location of a JSON configuration file that defines package resolution mappings. + +```bash +node --experimental-package-map=./package-map.json app.js +``` + +When enabled, bare specifier resolution consults the package map for resolution. +This allows explicit control over which packages can import which dependencies. + +See [Package maps][] for details on the configuration file format and +resolution algorithm. + ### `--experimental-print-required-tla` -If the ES module being `require()`'d contains top-level `await`, this flag -allows Node.js to evaluate the module, try to locate the -top-level awaits, and print their location to help users find them. +If the ES module graph cannot be `require()`'d because it contains any top-level `await`, +this flag allows Node.js to locate and print their locations. ### `--experimental-quic` @@ -1203,6 +1229,16 @@ added: Enable experimental support for storage inspection +### `--experimental-stream-iter` + + + +> Stability: 1 - Experimental + +Enable the experimental [`node:stream/iter`][] module. + ### `--experimental-test-coverage` - -This option is a no-op. It is kept for compatibility. - ### `--network-family-autoselection-attempt-timeout` + +Enable audit mode for the permission model. When enabled, permission checks +are performed but access is **not** denied — no `ERR_ACCESS_DENIED` error is +thrown. Instead, each permission violation is published through the +`node:diagnostics_channel` module, and execution continues normally. + +This flag does not require [`--permission`](#--permission) to be specified. The +`--allow-*` flags are not needed in audit mode, since no +access is denied. + +Audit mode is useful for discovering what permissions your application +requires before deploying with [`--permission`](#--permission). See the +[Permission Model][] documentation for the list of diagnostics channel names +and the message format. + +If both [`--permission`](#--permission) and `--permission-audit` are specified, +`--permission` takes precedence and the Permission Model runs in enforce mode. + ### `--preserve-symlinks` [#42511]: https://github.com/nodejs/node/issues/42511 +[Built-in Proxy Support]: http.md#built-in-proxy-support [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 module]: modules.md @@ -4159,6 +4229,7 @@ node --stack-trace-limit=12 -p -e "Error.stackTraceLimit" # prints 12 [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 +[Package maps]: packages.md#package-maps [Permission Model]: permissions.md#permission-model [REPL]: repl.md [ScriptCoverage]: https://chromedevtools.github.io/devtools-protocol/tot/Profiler#type-ScriptCoverage @@ -4212,6 +4283,7 @@ node --stack-trace-limit=12 -p -e "Error.stackTraceLimit" # prints 12 [`import` specifier]: esm.md#import-specifiers [`net.getDefaultAutoSelectFamilyAttemptTimeout()`]: net.md#netgetdefaultautoselectfamilyattempttimeout [`node:sqlite`]: sqlite.md +[`node:stream/iter`]: stream_iter.md [`process.setUncaughtExceptionCaptureCallback()`]: process.md#processsetuncaughtexceptioncapturecallbackfn [`tls.DEFAULT_MAX_VERSION`]: tls.md#tlsdefault_max_version [`tls.DEFAULT_MIN_VERSION`]: tls.md#tlsdefault_min_version diff --git a/doc/api/crypto.md b/doc/api/crypto.md index 14e3f9061382..ca7ca7fef459 100644 --- a/doc/api/crypto.md +++ b/doc/api/crypto.md @@ -73,38 +73,48 @@ try { ## Asymmetric key types -The following table lists the asymmetric key types recognized by the -[`KeyObject`][] API and the export/import formats supported for each key type. - -| Key Type | Description | OID | `'pem'` | `'der'` | `'jwk'` | `'raw-public'` | `'raw-private'` | `'raw-seed'` | -| ---------------------------------- | ------------------ | ----------------------- | ------- | ------- | ------- | -------------- | --------------- | ------------ | -| `'dh'` | Diffie-Hellman | 1.2.840.113549.1.3.1 | ✔ | ✔ | | | | | -| `'dsa'` | DSA | 1.2.840.10040.4.1 | ✔ | ✔ | | | | | -| `'ec'` | Elliptic curve | 1.2.840.10045.2.1 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'ed25519'` | Ed25519 | 1.3.101.112 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'ed448'` | Ed448 | 1.3.101.113 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'ml-dsa-44'`[^openssl35] | ML-DSA-44 | 2.16.840.1.101.3.4.3.17 | ✔ | ✔ | ✔ | ✔ | | ✔ | -| `'ml-dsa-65'`[^openssl35] | ML-DSA-65 | 2.16.840.1.101.3.4.3.18 | ✔ | ✔ | ✔ | ✔ | | ✔ | -| `'ml-dsa-87'`[^openssl35] | ML-DSA-87 | 2.16.840.1.101.3.4.3.19 | ✔ | ✔ | ✔ | ✔ | | ✔ | -| `'ml-kem-512'`[^openssl35] | ML-KEM-512 | 2.16.840.1.101.3.4.4.1 | ✔ | ✔ | ✔ | ✔ | | ✔ | -| `'ml-kem-768'`[^openssl35] | ML-KEM-768 | 2.16.840.1.101.3.4.4.2 | ✔ | ✔ | ✔ | ✔ | | ✔ | -| `'ml-kem-1024'`[^openssl35] | ML-KEM-1024 | 2.16.840.1.101.3.4.4.3 | ✔ | ✔ | ✔ | ✔ | | ✔ | -| `'rsa-pss'` | RSA PSS | 1.2.840.113549.1.1.10 | ✔ | ✔ | | | | | -| `'rsa'` | RSA | 1.2.840.113549.1.1.1 | ✔ | ✔ | ✔ | | | | -| `'slh-dsa-sha2-128f'`[^openssl35] | SLH-DSA-SHA2-128f | 2.16.840.1.101.3.4.3.21 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'slh-dsa-sha2-128s'`[^openssl35] | SLH-DSA-SHA2-128s | 2.16.840.1.101.3.4.3.20 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'slh-dsa-sha2-192f'`[^openssl35] | SLH-DSA-SHA2-192f | 2.16.840.1.101.3.4.3.23 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'slh-dsa-sha2-192s'`[^openssl35] | SLH-DSA-SHA2-192s | 2.16.840.1.101.3.4.3.22 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'slh-dsa-sha2-256f'`[^openssl35] | SLH-DSA-SHA2-256f | 2.16.840.1.101.3.4.3.25 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'slh-dsa-sha2-256s'`[^openssl35] | SLH-DSA-SHA2-256s | 2.16.840.1.101.3.4.3.24 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'slh-dsa-shake-128f'`[^openssl35] | SLH-DSA-SHAKE-128f | 2.16.840.1.101.3.4.3.27 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'slh-dsa-shake-128s'`[^openssl35] | SLH-DSA-SHAKE-128s | 2.16.840.1.101.3.4.3.26 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'slh-dsa-shake-192f'`[^openssl35] | SLH-DSA-SHAKE-192f | 2.16.840.1.101.3.4.3.29 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'slh-dsa-shake-192s'`[^openssl35] | SLH-DSA-SHAKE-192s | 2.16.840.1.101.3.4.3.28 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'slh-dsa-shake-256f'`[^openssl35] | SLH-DSA-SHAKE-256f | 2.16.840.1.101.3.4.3.31 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'slh-dsa-shake-256s'`[^openssl35] | SLH-DSA-SHAKE-256s | 2.16.840.1.101.3.4.3.30 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'x25519'` | X25519 | 1.3.101.110 | ✔ | ✔ | ✔ | ✔ | ✔ | | -| `'x448'` | X448 | 1.3.101.111 | ✔ | ✔ | ✔ | ✔ | ✔ | | +The following lists group the asymmetric key types recognized by the +[`KeyObject`][] API by the complete set of formats supported for importing and +exporting each type. + +**Formats:** `'pem'`, `'der'` + +* **`'dh'` (Diffie-Hellman)** — OID `1.2.840.113549.1.3.1` +* **`'dsa'`** — OID `1.2.840.10040.4.1` +* **`'rsa-pss'`** — OID `1.2.840.113549.1.1.10` + +**Formats:** `'pem'`, `'der'`, `'jwk'` + +* **`'rsa'`** — OID `1.2.840.113549.1.1.1` + +**Formats:** `'pem'`, `'der'`, `'jwk'`, `'raw-public'`, `'raw-private'` + +* **`'ec'` (Elliptic curve)** — OID `1.2.840.10045.2.1` +* **`'ed25519'`** — OID `1.3.101.112` +* **`'ed448'`** — OID `1.3.101.113` +* **`'slh-dsa-sha2-128f'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.21` +* **`'slh-dsa-sha2-128s'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.20` +* **`'slh-dsa-sha2-192f'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.23` +* **`'slh-dsa-sha2-192s'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.22` +* **`'slh-dsa-sha2-256f'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.25` +* **`'slh-dsa-sha2-256s'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.24` +* **`'slh-dsa-shake-128f'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.27` +* **`'slh-dsa-shake-128s'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.26` +* **`'slh-dsa-shake-192f'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.29` +* **`'slh-dsa-shake-192s'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.28` +* **`'slh-dsa-shake-256f'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.31` +* **`'slh-dsa-shake-256s'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.30` +* **`'x25519'`** — OID `1.3.101.110` +* **`'x448'`** — OID `1.3.101.111` + +**Formats:** `'pem'`, `'der'`, `'jwk'`, `'raw-public'`, `'raw-seed'` + +* **`'ml-dsa-44'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.17` +* **`'ml-dsa-65'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.18` +* **`'ml-dsa-87'`[^openssl35]** — OID `2.16.840.1.101.3.4.3.19` +* **`'ml-kem-512'`[^openssl35]** — OID `2.16.840.1.101.3.4.4.1` +* **`'ml-kem-768'`[^openssl35]** — OID `2.16.840.1.101.3.4.4.2` +* **`'ml-kem-1024'`[^openssl35]** — OID `2.16.840.1.101.3.4.4.3` ### Key formats @@ -838,6 +848,9 @@ added: v0.1.94 If `outputEncoding` is specified, a string is returned. If an `outputEncoding` is not provided, a [`Buffer`][] is returned. +If an output encoding was specified in a previous call to +[`cipher.update()`][], `outputEncoding` must use the same encoding. + Once the `cipher.final()` method has been called, the `Cipheriv` object can no longer be used to encrypt data. Attempts to call `cipher.final()` more than once will result in an error being thrown. @@ -930,6 +943,8 @@ The `outputEncoding` specifies the output format of the enciphered data. If the `outputEncoding` is specified, a string using the specified encoding is returned. If no `outputEncoding` is provided, a [`Buffer`][] is returned. +When `outputEncoding` is specified, it must use the same encoding as previous +calls to `cipher.update()`. The `cipher.update()` method can be called multiple times with new data until [`cipher.final()`][] is called. Calling `cipher.update()` after @@ -1148,6 +1163,9 @@ added: v0.1.94 If `outputEncoding` is specified, a string is returned. If an `outputEncoding` is not provided, a [`Buffer`][] is returned. +If an output encoding was specified in a previous call to +[`decipher.update()`][], `outputEncoding` must use the same encoding. + Once the `decipher.final()` method has been called, the `Decipheriv` object can no longer be used to decrypt data. Attempts to call `decipher.final()` more than once will result in an error being thrown. @@ -1284,6 +1302,8 @@ The `outputEncoding` specifies the output format of the enciphered data. If the `outputEncoding` is specified, a string using the specified encoding is returned. If no `outputEncoding` is provided, a [`Buffer`][] is returned. +When `outputEncoding` is specified, it must use the same encoding as previous +calls to `decipher.update()`. The `decipher.update()` method can be called multiple times with new data until [`decipher.final()`][] is called. Calling `decipher.update()` after @@ -2647,8 +2667,10 @@ Calculates the signature on all the data passed through using either [`sign.update()`][] or [`sign.write()`][stream-writable-write]. If `privateKey` is not a [`KeyObject`][], this function behaves as if -`privateKey` had been passed to [`crypto.createPrivateKey()`][]. If it is an -object, the following additional properties can be passed: +`privateKey` had been passed to [`crypto.createPrivateKey()`][]. When +`privateKey` is a string, `ArrayBuffer`, [`Buffer`][], `TypedArray`, or +`DataView`, it must contain PEM-encoded key material. If it is an object, the +following additional properties can be passed: * `dsaEncoding` {string} For DSA and ECDSA, this option specifies the format of the generated signature. It can be one of the following: @@ -2778,8 +2800,10 @@ changes: Verifies the provided data using the given `key` and `signature`. If `key` is not a [`KeyObject`][], this function behaves as if -`key` had been passed to [`crypto.createPublicKey()`][]. If it is an -object, the following additional properties can be passed: +`key` had been passed to [`crypto.createPublicKey()`][]. When `key` is a string, +`ArrayBuffer`, [`Buffer`][], `TypedArray`, or `DataView`, it must contain +PEM-encoded key material. If it is an object, the following additional +properties can be passed: * `dsaEncoding` {string} For DSA and ECDSA, this option specifies the format of the signature. It can be one of the following: @@ -3759,6 +3783,8 @@ using the given `algorithm`. Optional `options` argument controls stream behavior. For XOF hash functions such as `'shake256'`, the `outputLength` option can be used to specify the desired output length in bytes. +When the data is small (< 5MB) and readily available, [`crypto.hash()`][] is usually faster. + The `algorithm` is dependent on the available algorithms supported by the version of OpenSSL on the platform. Examples are `'sha256'`, `'sha512'`, etc. On recent releases of OpenSSL, `openssl list -digest-algorithms` will @@ -4948,7 +4974,7 @@ HKDF is a simple key derivation function defined in RFC 5869. The given `ikm`, `salt` and `info` are used with the `digest` to derive a key of `keylen` bytes. The supplied `callback` function is called with two arguments: `err` and -`derivedKey`. If an errors occurs while deriving the key, `err` will be set; +`derivedKey`. If an error occurs while deriving the key, `err` will be set; otherwise `err` will be `null`. The successfully generated `derivedKey` will be passed to the callback as an {ArrayBuffer}. An error will be thrown if any of the input arguments specify invalid values or types. @@ -6120,8 +6146,10 @@ dependent upon the key type. ML-DSA. If `key` is not a [`KeyObject`][], this function behaves as if `key` had been -passed to [`crypto.createPrivateKey()`][]. If it is an object, the following -additional properties can be passed: +passed to [`crypto.createPrivateKey()`][]. When `key` is a string, `ArrayBuffer`, +[`Buffer`][], `TypedArray`, or `DataView`, it must contain PEM-encoded key +material. If it is an object, the following additional properties can be +passed: * `dsaEncoding` {string} For DSA and ECDSA, this option specifies the format of the generated signature. It can be one of the following: @@ -6255,8 +6283,10 @@ key type. ML-DSA. If `key` is not a [`KeyObject`][], this function behaves as if `key` had been -passed to [`crypto.createPublicKey()`][]. If it is an object, the following -additional properties can be passed: +passed to [`crypto.createPublicKey()`][]. When `key` is a string, `ArrayBuffer`, +[`Buffer`][], `TypedArray`, or `DataView`, it must contain PEM-encoded key +material. If it is an object, the following additional properties can be +passed: * `dsaEncoding` {string} For DSA and ECDSA, this option specifies the format of the signature. It can be one of the following: @@ -6907,6 +6937,7 @@ See the [list of SSL OP Flags][] for details. [`crypto.getCurves()`]: #cryptogetcurves [`crypto.getDiffieHellman()`]: #cryptogetdiffiehellmangroupname [`crypto.getHashes()`]: #cryptogethashes +[`crypto.hash()`]: #cryptohashalgorithm-data-options [`crypto.privateDecrypt()`]: #cryptoprivatedecryptprivatekey-buffer [`crypto.privateEncrypt()`]: #cryptoprivateencryptprivatekey-buffer [`crypto.publicDecrypt()`]: #cryptopublicdecryptkey-buffer diff --git a/doc/api/debugger.md b/doc/api/debugger.md index 8af0dab6d5e4..c8c26470ebd2 100644 --- a/doc/api/debugger.md +++ b/doc/api/debugger.md @@ -236,6 +236,10 @@ debug> added: - v24.16.0 changes: + - version: v24.20.0 + pr-url: https://github.com/nodejs/node/pull/64328 + description: Add per-probe `--cond ` option to only record a hit when the + condition is truthy at the probe location. - version: v24.19.0 pr-url: https://github.com/nodejs/node/pull/63704 description: Add per-probe `--max-hit ` option to limit evaluated hits and finish @@ -268,8 +272,8 @@ printf-style debugging without having to modify the application code and clean up afterwards. It also supports structured JSON output for tool use. ```console -$ node inspect --probe :[:] --expr [--max-hit ] - [--probe :[:] --expr [--max-hit ] ...] +$ node inspect --probe :[:] --expr [--cond ] [--max-hit ] + [--probe :[:] --expr [--cond ] [--max-hit ] ...] [--json] [--preview] [--timeout=] [--port=] [--] [ ...] + + + + diff --git a/test/fixtures/wpt/versions.json b/test/fixtures/wpt/versions.json index bb3bb4d731d9..32b9537ffca9 100644 --- a/test/fixtures/wpt/versions.json +++ b/test/fixtures/wpt/versions.json @@ -72,11 +72,11 @@ "path": "streams" }, "url": { - "commit": "d4598eba0959249d8715818a402b432c513f9492", + "commit": "4832db47614f5f48cc57374cbf5c1f70937fad48", "path": "url" }, "urlpattern": { - "commit": "11a459a2b1d411506d9230edf9f2ef32babfeb0b", + "commit": "5847ee5cfa4f710cbb78ab9ef5cc66f74433ee03", "path": "urlpattern" }, "user-timing": { @@ -84,7 +84,7 @@ "path": "user-timing" }, "wasm/jsapi": { - "commit": "cde25e7e3c3b9d2280eb088a3fb9da988793d255", + "commit": "288c467d350ec4b8e4fbc7f2ccb6119293186611", "path": "wasm/jsapi" }, "wasm/webapi": { @@ -96,7 +96,7 @@ "path": "web-locks" }, "WebCryptoAPI": { - "commit": "03a14768441c1ce2a31678d0dc080e81dc449d0a", + "commit": "ec2fee39a4ca3c13afd55236795547eedd7f165d", "path": "WebCryptoAPI" }, "webidl": { diff --git a/test/fixtures/wpt/wasm/jsapi/esm-integration/resources/js-string-constants.wasm b/test/fixtures/wpt/wasm/jsapi/esm-integration/resources/js-string-constants.wasm new file mode 100644 index 000000000000..4ba2d9e7c581 Binary files /dev/null and b/test/fixtures/wpt/wasm/jsapi/esm-integration/resources/js-string-constants.wasm differ diff --git a/test/fixtures/wpt/wasm/jsapi/esm-integration/resources/js-string-constants.wat b/test/fixtures/wpt/wasm/jsapi/esm-integration/resources/js-string-constants.wat new file mode 100644 index 000000000000..2de58bc19cdf --- /dev/null +++ b/test/fixtures/wpt/wasm/jsapi/esm-integration/resources/js-string-constants.wat @@ -0,0 +1,11 @@ +(module + (import "wasm:js/string-constants" "" (global $empty externref)) + (import "wasm:js/string-constants" "\00" (global $null_byte externref)) + (import "wasm:js/string-constants" "hello" (global $hello externref)) + (import "wasm:js/string-constants" "\f0\9f\98\80" (global $emoji externref)) + + (export "empty" (global $empty)) + (export "nullByte" (global $null_byte)) + (export "hello" (global $hello)) + (export "emoji" (global $emoji)) +) diff --git a/test/fixtures/wpt/wasm/jsapi/esm-integration/source-phase-string-constants.tentative.any.js b/test/fixtures/wpt/wasm/jsapi/esm-integration/source-phase-string-constants.tentative.any.js new file mode 100644 index 000000000000..66ee89c53942 --- /dev/null +++ b/test/fixtures/wpt/wasm/jsapi/esm-integration/source-phase-string-constants.tentative.any.js @@ -0,0 +1,32 @@ +// META: global=window,dedicatedworker,jsshell,shadowrealm + +promise_test(async () => { + const wasmModuleSource = await import.source("./resources/js-string-constants.wasm"); + + const instance = new WebAssembly.Instance(wasmModuleSource, {}); + + assert_equals(instance.exports.empty.value, ""); + assert_equals(instance.exports.nullByte.value, "\0"); + assert_equals(instance.exports.hello.value, "hello"); + assert_equals(instance.exports.emoji.value, "\u{1F600}"); +}, "String constants from wasm:js/string-constants should be supported in source phase imports"); + +promise_test(async () => { + const wasmModuleSource = await import.source("./resources/js-string-constants.wasm"); + + const exports = WebAssembly.Module.exports(wasmModuleSource); + const exportNames = exports.map((exp) => exp.name); + + assert_true(exportNames.includes("empty")); + assert_true(exportNames.includes("nullByte")); + assert_true(exportNames.includes("hello")); + assert_true(exportNames.includes("emoji")); +}, "Source phase import should properly expose string constants exports"); + +promise_test(async () => { + const wasmModuleSource = await import.source("./resources/js-string-constants.wasm"); + + const imports = WebAssembly.Module.imports(wasmModuleSource); + + assert_equals(imports.length, 0); +}, "Source phase import should handle string constants import reflection correctly"); diff --git a/test/fixtures/wpt/wasm/jsapi/esm-integration/string-constants.tentative.any.js b/test/fixtures/wpt/wasm/jsapi/esm-integration/string-constants.tentative.any.js new file mode 100644 index 000000000000..8166bb4f7217 --- /dev/null +++ b/test/fixtures/wpt/wasm/jsapi/esm-integration/string-constants.tentative.any.js @@ -0,0 +1,10 @@ +// META: global=window,dedicatedworker,jsshell,shadowrealm + +promise_test(async () => { + const wasmModule = await import("./resources/js-string-constants.wasm"); + + assert_equals(wasmModule.empty, ""); + assert_equals(wasmModule.nullByte, "\0"); + assert_equals(wasmModule.hello, "hello"); + assert_equals(wasmModule.emoji, "\u{1F600}"); +}, "String constants from wasm:js/string-constants should be supported in ESM integration"); diff --git a/test/fixtures/wpt/wasm/jsapi/exception/basic.tentative.any.js b/test/fixtures/wpt/wasm/jsapi/exception/basic.tentative.any.js index acf644f904f5..73b38045496e 100644 --- a/test/fixtures/wpt/wasm/jsapi/exception/basic.tentative.any.js +++ b/test/fixtures/wpt/wasm/jsapi/exception/basic.tentative.any.js @@ -4,7 +4,7 @@ function assert_throws_wasm(fn, message) { try { fn(); - assert_not_reached(`expected to throw with ${message}`); + assert_unreached(`expected to throw with ${message}`); } catch (e) { assert_true(e instanceof WebAssembly.Exception, `Error should be a WebAssembly.Exception with ${message}`); } diff --git a/test/fixtures/wpt/wasm/jsapi/exception/constructor.tentative.any.js b/test/fixtures/wpt/wasm/jsapi/exception/constructor.tentative.any.js index 7ad08e1883ba..17057a228733 100644 --- a/test/fixtures/wpt/wasm/jsapi/exception/constructor.tentative.any.js +++ b/test/fixtures/wpt/wasm/jsapi/exception/constructor.tentative.any.js @@ -10,7 +10,7 @@ test(() => { }, "name"); test(() => { - assert_function_length(WebAssembly.Exception, 1, "WebAssembly.Exception"); + assert_function_length(WebAssembly.Exception, 2, "WebAssembly.Exception"); }, "length"); test(() => { diff --git a/test/js-native-api/test_string/test_string.c b/test/js-native-api/test_string/test_string.c index 01e5dbee3912..0dbe1806d7b9 100644 --- a/test/js-native-api/test_string/test_string.c +++ b/test/js-native-api/test_string/test_string.c @@ -20,7 +20,7 @@ static napi_status validate_and_retrieve_single_string_arg( NODE_API_ASSERT_STATUS(env, valuetype == napi_string, - "Wrong type of argment. Expects a string."); + "Wrong type of argument. Expects a string."); return napi_ok; } diff --git a/test/known_issues/test-fs-cp-filter.js b/test/known_issues/test-fs-cp-filter.js index d6ac92aebe0e..334ade532b33 100644 --- a/test/known_issues/test-fs-cp-filter.js +++ b/test/known_issues/test-fs-cp-filter.js @@ -1,6 +1,6 @@ 'use strict'; -// This test will fail because the the implementation does not properly +// This test will fail because the implementation does not properly // handle the case when the `src` or `dest` is a Buffer and the `filter` // function is utilized when recursively copying directories. // Refs: https://github.com/nodejs/node/issues/58634 diff --git a/test/known_issues/test-fs-readdir-promise-recursive-with-buffer.js b/test/known_issues/test-fs-readdir-promise-recursive-with-buffer.js index 7d8649ac9826..314d6dda9a2d 100644 --- a/test/known_issues/test-fs-readdir-promise-recursive-with-buffer.js +++ b/test/known_issues/test-fs-readdir-promise-recursive-with-buffer.js @@ -1,6 +1,6 @@ 'use strict'; -// This test will fail because the the implementation does not properly +// This test will fail because the implementation does not properly // handle the case when the path is a Buffer and the function is called // in recursive mode. diff --git a/test/known_issues/test-fs-readdir-recursive-with-buffer.js b/test/known_issues/test-fs-readdir-recursive-with-buffer.js index 2c1f74232dda..4938d36ffa84 100644 --- a/test/known_issues/test-fs-readdir-recursive-with-buffer.js +++ b/test/known_issues/test-fs-readdir-recursive-with-buffer.js @@ -1,6 +1,6 @@ 'use strict'; -// This test will fail because the the implementation does not properly +// This test will fail because the implementation does not properly // handle the case when the path is a Buffer and the function is called // in recursive mode. diff --git a/test/known_issues/test-fs-readdir-sync-recursive-with-buffer.js b/test/known_issues/test-fs-readdir-sync-recursive-with-buffer.js index 291fe7ffe8bc..0f60c290f15d 100644 --- a/test/known_issues/test-fs-readdir-sync-recursive-with-buffer.js +++ b/test/known_issues/test-fs-readdir-sync-recursive-with-buffer.js @@ -1,6 +1,6 @@ 'use strict'; -// This test will fail because the the implementation does not properly +// This test will fail because the implementation does not properly // handle the case when the path is a Buffer and the function is called // in recursive mode. diff --git a/test/node-api/test_fatal/test2.js b/test/node-api/test_fatal/test2.js index 6449f098458d..44866d63ee7d 100644 --- a/test/node-api/test_fatal/test2.js +++ b/test/node-api/test_fatal/test2.js @@ -12,7 +12,7 @@ if (process.argv[2] === 'child') { } const p = child_process.spawnSync( - process.execPath, [ '--napi-modules', __filename, 'child' ]); + process.execPath, [ __filename, 'child' ]); assert.ifError(p.error); assert.ok(p.stderr.toString().includes( 'FATAL ERROR: test_fatal::Test fatal message')); diff --git a/test/parallel/parallel.status b/test/parallel/parallel.status index cf7f8d42e867..e4c82da4d617 100644 --- a/test/parallel/parallel.status +++ b/test/parallel/parallel.status @@ -22,19 +22,24 @@ test-snapshot-incompatible: SKIP # https://github.com/nodejs/node/issues/53579 test-snapshot-reproducible: SKIP +# There's a bug in CDP where `replMode: true` causes the Inspector +# to collect its `Runtime.evaluate` promise before the evaluation +# is complete. This test intentionally runs multiple REPL instances +# in parallel, which significantly increases the likelihood of a +# garbage collection occurring while an evaluation is still pending. +# In normal usage, users typically don't create multiple REPLs +# simultaneously, so this race is much much less likely to occur. +# https://github.com/nodejs/node/issues/64595 +# https://issues.chromium.org/issues/536271637 +# https://ci.nodejs.org/job/node-stress-single-test/800 (38/1000) +test-repl-user-error-handler: PASS, FLAKY + [$system==win32] # https://github.com/nodejs/node/issues/59090 test-inspector-network-fetch: PASS, FLAKY -# https://github.com/nodejs/node/issues/54808 -test-async-context-frame: PASS, FLAKY # https://github.com/nodejs/node/issues/59636 -test-fs-cp-sync-error-on-exist: SKIP test-fs-cp-sync-symlink-points-to-dest-error: SKIP test-fs-cp-async-symlink-points-to-dest: SKIP -test-fs-cp-sync-unicode-folder-names: SKIP - -# https://github.com/nodejs/node/issues/56751 -test-without-async-context-frame: PASS, FLAKY # Windows on ARM [$system==win32 && $arch==arm64] @@ -149,7 +154,6 @@ test-http-pipeline-flood: SKIP test-inspector-network-fetch: SKIP test-inspector-network-content-type: SKIP test-fetch: SKIP -test-without-async-context-frame: SKIP test-process-cpuUsage: PASS, FLAKY test-web-locks: SKIP test-http2-allow-http1-upgrade-ws: SKIP diff --git a/test/parallel/test-abortcontroller.js b/test/parallel/test-abortcontroller.js index 948bd208cd2b..5b8df8233cd4 100644 --- a/test/parallel/test-abortcontroller.js +++ b/test/parallel/test-abortcontroller.js @@ -13,7 +13,7 @@ const { const { setTimeout: sleep } = require('timers/promises'); -// All of the the tests in this file depend on public-facing Node.js APIs. +// All of the tests in this file depend on public-facing Node.js APIs. // For tests that depend on Node.js internal APIs, please add them to // test-abortcontroller-internal.js instead. @@ -93,7 +93,7 @@ test('AbortSignal.abort() creates an already aborted signal', () => { assert.ok(signal.aborted); }); -test('AbortController properties and methods valiate the receiver', () => { +test('AbortController properties and methods validate the receiver', () => { const acSignalGet = Object.getOwnPropertyDescriptor( AbortController.prototype, 'signal' @@ -161,6 +161,7 @@ test('AbortController inspection depth 1 or null works', () => { test('AbortSignal reason is set correctly', () => { // Test AbortSignal.reason + // eslint-disable-next-line node-core/prefer-abort-signal-abort const ac = new AbortController(); ac.abort('reason'); assert.strictEqual(ac.signal.reason, 'reason'); @@ -235,6 +236,7 @@ test('AbortSignal.reason should default', () => { assert.ok(signal.reason instanceof DOMException); assert.strictEqual(signal.reason.code, 20); + // eslint-disable-next-line node-core/prefer-abort-signal-abort const ac = new AbortController(); ac.abort(); assert.ok(ac.signal.reason instanceof DOMException); diff --git a/test/parallel/test-abortsignal-drop-settled-signals.mjs b/test/parallel/test-abortsignal-drop-settled-signals.mjs index c481db069d6f..224d65abc70f 100644 --- a/test/parallel/test-abortsignal-drop-settled-signals.mjs +++ b/test/parallel/test-abortsignal-drop-settled-signals.mjs @@ -142,6 +142,37 @@ describe('when there is a long-lived signal', () => { run(1); }); + + it('drops observed dependent signals once they are transitively aborted', async () => { + const longLived = new AbortController(); + const handler = () => {}; + const size = () => { + const sym = Object.getOwnPropertySymbols(longLived.signal).find( + (s) => s.toString() === 'Symbol(kDependantSignals)' + ); + return sym ? longLived.signal[sym].size : 0; + }; + + // Each composite observes the long-lived source and a per-request source, + // then is aborted through the per-request source without ever removing its + // listener. The aborted composites can never fire again, so the long-lived + // source's dependant set must not accumulate them. Using a helper keeps the + // last iteration's signals from lingering on the stack for the assertion. + const createObservedAbortedComposite = () => { + const perReq = new AbortController(); + const composite = AbortSignal.any([perReq.signal, longLived.signal]); + composite.addEventListener('abort', handler); + perReq.abort(); + }; + for (let i = 0; i < limit; i++) { + createObservedAbortedComposite(); + } + + await gcUntil( + 'observed dependents are dropped after transitive abort', + () => size() === 0, + ); + }); }); it('does not prevent source signal from being GCed if it is short-lived', (t, done) => { diff --git a/test/parallel/test-assert-deep.js b/test/parallel/test-assert-deep.js index e43e4ec5b125..80d8bf1b728f 100644 --- a/test/parallel/test-assert-deep.js +++ b/test/parallel/test-assert-deep.js @@ -4,7 +4,6 @@ const { mustCall, hasCrypto } = require('../common'); const assert = require('assert'); const util = require('util'); const { test } = require('node:test'); -const { AssertionError } = assert; const defaultMsgStart = 'Expected values to be strictly deep-equal:\n'; const defaultMsgStartFull = `${defaultMsgStart}+ actual - expected`; @@ -421,6 +420,17 @@ test('es6 Maps and Sets', () => { new Map([[undefined, null], ['+000', 2n]]), new Map([[null, undefined], [false, '2']]), ); + // A null key whose value is an object, alongside another object key and a + // matching map size, must not crash the unordered object-key matching (null + // is `typeof 'object'`). Refs: https://github.com/nodejs/node/issues/64433 + assertNotDeepOrStrict( + new Map([[null, { v: 1 }], [{ a: 1 }, 1]]), + new Map([[{ b: 2 }, { v: 1 }], [{ a: 1 }, 1]]) + ); + assertDeepAndStrictEqual( + new Map([[null, { v: 1 }], [{ a: 1 }, 1]]), + new Map([[null, { v: 1 }], [{ a: 1 }, 1]]) + ); const xarray = ['x']; assertDeepAndStrictEqual( new Set([xarray, ['y']]), @@ -677,11 +687,11 @@ test('Handle sparse arrays', () => { const b = new Array(3); a[2] = true; b[1] = true; - assertNotDeepOrStrict(a, b, AssertionError, { partial: 'pass' }); + assertNotDeepOrStrict(a, b, assert.AssertionError, { partial: 'pass' }); b[2] = true; assertNotDeepOrStrict(a, b); a[0] = true; - assertNotDeepOrStrict(a, b, AssertionError, { partial: 'pass' }); + assertNotDeepOrStrict(a, b, assert.AssertionError, { partial: 'pass' }); }); test('Handle sets and maps with mixed keys', () => { @@ -704,7 +714,7 @@ test('Handle different error messages', () => { assertNotDeepOrStrict(err1, new Error('foo2'), assert.AssertionError); assertNotDeepOrStrict(err1, new TypeError('foo1'), assert.AssertionError); assertDeepAndStrictEqual(err1, new Error('foo1')); - assertNotDeepOrStrict(err1, {}, AssertionError); + assertNotDeepOrStrict(err1, {}, assert.AssertionError); }); test('Handle NaN', () => { @@ -800,18 +810,18 @@ test('Additional tests', () => { assertDeepAndStrictEqual(new Date(2000, 3, 14), new Date(2000, 3, 14)); assert.throws(() => { assert.deepEqual(new Date(), new Date(2000, 3, 14)); }, - AssertionError, + assert.AssertionError, 'deepEqual(new Date(), new Date(2000, 3, 14))'); assert.throws( () => { assert.notDeepEqual(new Date(2000, 3, 14), new Date(2000, 3, 14)); }, - AssertionError, + assert.AssertionError, 'notDeepEqual(new Date(2000, 3, 14), new Date(2000, 3, 14))' ); assert.throws( () => { assert.notDeepEqual('a'.repeat(1024), 'a'.repeat(1024)); }, - AssertionError, + assert.AssertionError, 'notDeepEqual("a".repeat(1024), "a".repeat(1024))' ); @@ -850,7 +860,7 @@ test('Additional tests', () => { assert.deepEqual(4, '4'); assert.deepEqual(true, 1); assert.throws(() => assert.deepEqual(4, '5'), - AssertionError, + assert.AssertionError, 'deepEqual( 4, \'5\')'); }); @@ -859,7 +869,7 @@ test('Having the same number of owned properties && the same set of keys', () => assert.deepEqual({ a: 4, b: '2' }, { a: 4, b: '2' }); assert.deepEqual([4], ['4']); assert.throws( - () => assert.deepEqual({ a: 4 }, { a: 4, b: true }), AssertionError); + () => assert.deepEqual({ a: 4 }, { a: 4, b: true }), assert.AssertionError); assert.notDeepEqual(['a'], { 0: 'a' }); assert.deepEqual({ a: 4, b: '1' }, { b: '1', a: 4 }); const a1 = [1, 2, 3]; @@ -869,7 +879,7 @@ test('Having the same number of owned properties && the same set of keys', () => a2.b = true; a2.a = 'test'; assert.throws(() => assert.deepEqual(Object.keys(a1), Object.keys(a2)), - AssertionError); + assert.AssertionError); assertDeepAndStrictEqual(a1, a2); }); @@ -935,7 +945,7 @@ test('Additional tests', () => { assert.throws( () => assert.deepStrictEqual(new Date(), new Date(2000, 3, 14)), - AssertionError, + assert.AssertionError, 'deepStrictEqual(new Date(), new Date(2000, 3, 14))' ); @@ -1048,7 +1058,7 @@ test('Additional tests', () => { assert.throws( () => assert.deepStrictEqual([0, 1, 2, 'a', 'b'], [0, 1, 2, 'b', 'a']), - AssertionError); + assert.AssertionError); }); test('Having the same number of owned properties && the same set of keys', () => { @@ -1094,7 +1104,7 @@ test('Prototype check', () => { const obj1 = new Constructor1('Ryan', 'Dahl'); let obj2 = new Constructor2('Ryan', 'Dahl'); - assert.throws(() => assert.deepStrictEqual(obj1, obj2), AssertionError); + assert.throws(() => assert.deepStrictEqual(obj1, obj2), assert.AssertionError); Constructor2.prototype = Constructor1.prototype; obj2 = new Constructor2('Ryan', 'Dahl'); @@ -1251,7 +1261,7 @@ test('Verify that changed tags will still check for the error message', () => { err[Symbol.toStringTag] = 'Foobar'; const err2 = new Error('bar'); err2[Symbol.toStringTag] = 'Foobar'; - assertNotDeepOrStrict(err, err2, AssertionError); + assertNotDeepOrStrict(err, err2, assert.AssertionError); }); test('Check for non-native errors', () => { @@ -1270,8 +1280,8 @@ test('Check for non-native errors', () => { test('Check for Errors with cause property', () => { const e1 = new Error('err', { cause: new Error('cause e1') }); const e2 = new Error('err', { cause: new Error('cause e2') }); - assertNotDeepOrStrict(e1, e2, AssertionError); - assertNotDeepOrStrict(e1, new Error('err'), AssertionError); + assertNotDeepOrStrict(e1, e2, assert.AssertionError); + assertNotDeepOrStrict(e1, new Error('err'), assert.AssertionError); assertDeepAndStrictEqual(e1, new Error('err', { cause: new Error('cause e1') })); }); @@ -1283,8 +1293,8 @@ test('Check for AggregateError', () => { const e3 = new AggregateError([e1duplicate, e2], 'Aggregate Error'); const e3duplicate = new AggregateError([e1, e2], 'Aggregate Error'); const e4 = new AggregateError([e1], 'Aggregate Error'); - assertNotDeepOrStrict(e1, e3, AssertionError); - assertNotDeepOrStrict(e3, e4, AssertionError); + assertNotDeepOrStrict(e1, e3, assert.AssertionError); + assertNotDeepOrStrict(e3, e4, assert.AssertionError); assertDeepAndStrictEqual(e3, e3duplicate); }); diff --git a/test/parallel/test-async-local-storage-run-scope.js b/test/parallel/test-async-local-storage-run-scope.js new file mode 100644 index 000000000000..1ae3e44aadf6 --- /dev/null +++ b/test/parallel/test-async-local-storage-run-scope.js @@ -0,0 +1,202 @@ +/* eslint-disable no-unused-vars */ +'use strict'; +require('../common'); +const assert = require('node:assert'); +const { AsyncLocalStorage } = require('node:async_hooks'); + +// Test basic RunScope with using +{ + const storage = new AsyncLocalStorage(); + + assert.strictEqual(storage.getStore(), undefined); + + { + using scope = storage.withScope('test'); + assert.strictEqual(storage.getStore(), 'test'); + } + + // Store should be restored to undefined + assert.strictEqual(storage.getStore(), undefined); +} + +// Test RunScope restores previous value +{ + const storage = new AsyncLocalStorage(); + + storage.enterWith('initial'); + assert.strictEqual(storage.getStore(), 'initial'); + + { + using scope = storage.withScope('scoped'); + assert.strictEqual(storage.getStore(), 'scoped'); + } + + // Should restore to previous value + assert.strictEqual(storage.getStore(), 'initial'); +} + +// Test nested RunScope +{ + const storage = new AsyncLocalStorage(); + const storeValues = []; + + { + using outer = storage.withScope('outer'); + storeValues.push(storage.getStore()); + + { + using inner = storage.withScope('inner'); + storeValues.push(storage.getStore()); + } + + // Should restore to outer + storeValues.push(storage.getStore()); + } + + // Should restore to undefined + storeValues.push(storage.getStore()); + + assert.deepStrictEqual(storeValues, ['outer', 'inner', 'outer', undefined]); +} + +// Test RunScope with error during usage +{ + const storage = new AsyncLocalStorage(); + + storage.enterWith('before'); + + const testError = new Error('test'); + + assert.throws(() => { + using scope = storage.withScope('during'); + assert.strictEqual(storage.getStore(), 'during'); + throw testError; + }, testError); + + // Store should be restored even after error + assert.strictEqual(storage.getStore(), 'before'); +} + +// Test idempotent disposal via named dispose() method +{ + const storage = new AsyncLocalStorage(); + + const scope = storage.withScope('test'); + assert.strictEqual(storage.getStore(), 'test'); + + // Dispose via named dispose() method + scope.dispose(); + assert.strictEqual(storage.getStore(), undefined); + + storage.enterWith('test2'); + assert.strictEqual(storage.getStore(), 'test2'); + + // Double dispose should be idempotent + scope.dispose(); + assert.strictEqual(storage.getStore(), 'test2'); +} + +// Test withScope without using keyword (scope leaks until manually disposed) +{ + const storage = new AsyncLocalStorage(); + + const scope = storage.withScope('leaked'); + assert.strictEqual(storage.getStore(), 'leaked'); + + // Without using, the scope persists + assert.strictEqual(storage.getStore(), 'leaked'); + + // Must manually dispose via named method + scope.dispose(); + assert.strictEqual(storage.getStore(), undefined); +} + +// Test that dispose undoes enterWith called inside scope +{ + const storage = new AsyncLocalStorage(); + + storage.enterWith('store1'); + assert.strictEqual(storage.getStore(), 'store1'); + + { + using _ = storage.withScope('store2'); + assert.strictEqual(storage.getStore(), 'store2'); + + storage.enterWith('store3'); + assert.strictEqual(storage.getStore(), 'store3'); + } + + // Restores to store1, undoing both withScope and the enterWith inside scope + assert.strictEqual(storage.getStore(), 'store1'); +} + +// Test RunScope with defaultValue +{ + const storage = new AsyncLocalStorage({ defaultValue: 'default' }); + + assert.strictEqual(storage.getStore(), 'default'); + + { + using scope = storage.withScope('custom'); + assert.strictEqual(storage.getStore(), 'custom'); + } + + // Should restore to default + assert.strictEqual(storage.getStore(), 'default'); +} + +// Test deeply nested RunScope +{ + const storage = new AsyncLocalStorage(); + + { + using s1 = storage.withScope(1); + assert.strictEqual(storage.getStore(), 1); + + { + using s2 = storage.withScope(2); + assert.strictEqual(storage.getStore(), 2); + + { + using s3 = storage.withScope(3); + assert.strictEqual(storage.getStore(), 3); + + { + using s4 = storage.withScope(4); + assert.strictEqual(storage.getStore(), 4); + } + + assert.strictEqual(storage.getStore(), 3); + } + + assert.strictEqual(storage.getStore(), 2); + } + + assert.strictEqual(storage.getStore(), 1); + } + + assert.strictEqual(storage.getStore(), undefined); +} + +// Test RunScope with multiple storages +{ + const storage1 = new AsyncLocalStorage(); + const storage2 = new AsyncLocalStorage(); + + { + using scope1 = storage1.withScope('A'); + + { + using scope2 = storage2.withScope('B'); + + assert.strictEqual(storage1.getStore(), 'A'); + assert.strictEqual(storage2.getStore(), 'B'); + } + + assert.strictEqual(storage1.getStore(), 'A'); + assert.strictEqual(storage2.getStore(), undefined); + } + + assert.strictEqual(storage1.getStore(), undefined); + assert.strictEqual(storage2.getStore(), undefined); +} diff --git a/test/parallel/test-blob-stream-gc.js b/test/parallel/test-blob-stream-gc.js new file mode 100644 index 000000000000..24b2f15efc12 --- /dev/null +++ b/test/parallel/test-blob-stream-gc.js @@ -0,0 +1,56 @@ +// Flags: --expose-gc --no-concurrent-array-buffer-sweeping +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { setImmediate: setImmediatePromise } = require('timers/promises'); + +const MiB = 1024 * 1024; +const iterations = 64; +const maxRetained = 16 * MiB; + +async function collectArrayBuffers() { + for (let i = 0; i < 3; i++) { + global.gc(); + await setImmediatePromise(); + } +} + +async function assertNoBlobStreamRetention(name, fn) { + const buffer = Buffer.alloc(MiB); + + await collectArrayBuffers(); + const before = process.memoryUsage().arrayBuffers; + + for (let i = 0; i < iterations; i++) { + await fn(buffer); + } + + await collectArrayBuffers(); + const retained = process.memoryUsage().arrayBuffers - before; + + assert( + retained < maxRetained, + `${name} retained ${retained} bytes in arrayBuffers`, + ); +} + +(async () => { + await assertNoBlobStreamRetention('unused Blob streams', + common.mustCall(async (buffer) => { + new Blob([buffer]).stream(); + }, iterations)); + + await assertNoBlobStreamRetention('cancelled Blob streams', + common.mustCall(async (buffer) => { + await new Blob([buffer]).stream() + .cancel(); + }, iterations)); + + await assertNoBlobStreamRetention('drained Blob streams', + common.mustCall(async (buffer) => { + await new Response( + new Blob([buffer]).stream(), + ).arrayBuffer(); + }, iterations)); +})().then(common.mustCall()); diff --git a/test/parallel/test-blob.js b/test/parallel/test-blob.js index 9ec2a3c04079..e20ebbb86404 100644 --- a/test/parallel/test-blob.js +++ b/test/parallel/test-blob.js @@ -384,7 +384,9 @@ assert.throws(() => new Blob({}), { assert.strictEqual(value.byteLength, 5); assert(!done); setTimeout(common.mustCall(() => { - assert.strictEqual(stream[kState].controller.desiredSize, 0); + // Same setImmediate() pull vs. timer race as the non-BYOB case above: + // the stream may already have pulled the next 'hello' (5 bytes), hence -5. + assert([0, -5].includes(stream[kState].controller.desiredSize)); }), 0); })().then(common.mustCall()); @@ -405,6 +407,24 @@ assert.throws(() => new Blob({}), { const b = new Blob(['hello\n'], { endings: 'native' }); assert.strictEqual(b.size, EOL.length + 5); + // The WHATWG "convert line endings to native" algorithm normalizes every + // standalone "\r", "\n", and "\r\n" sequence to the native line ending. + // Refs: https://w3c.github.io/FileAPI/#convert-line-endings-to-native + (async () => { + const cases = [ + ['a\rb', `a${EOL}b`], + ['a\nb', `a${EOL}b`], + ['a\r\nb', `a${EOL}b`], + ['a\r\rb', `a${EOL}${EOL}b`], + ['a\n\rb', `a${EOL}${EOL}b`], + ['\r\n\r', `${EOL}${EOL}`], + ]; + for (const [input, expected] of cases) { + const blob = new Blob([input], { endings: 'native' }); + assert.strictEqual(await blob.text(), expected); + } + })().then(common.mustCall()); + [1, {}, 'foo'].forEach((endings) => { assert.throws(() => new Blob([], { endings }), { code: 'ERR_INVALID_ARG_VALUE', diff --git a/test/parallel/test-bootstrap-modules.js b/test/parallel/test-bootstrap-modules.js index 69f1d9f44c9c..01b7ba07cf61 100644 --- a/test/parallel/test-bootstrap-modules.js +++ b/test/parallel/test-bootstrap-modules.js @@ -104,6 +104,7 @@ expected.beforePreExec = new Set([ 'NativeModule internal/modules/package_json_reader', 'Internal Binding module_wrap', 'NativeModule internal/modules/cjs/loader', + 'NativeModule internal/modules/package_map', 'NativeModule diagnostics_channel', 'Internal Binding diagnostics_channel', 'Internal Binding wasm_web_api', diff --git a/test/parallel/test-buffer-indexof.js b/test/parallel/test-buffer-indexof.js index 37665b4e4092..2dd62c91e25c 100644 --- a/test/parallel/test-buffer-indexof.js +++ b/test/parallel/test-buffer-indexof.js @@ -633,3 +633,96 @@ assert.strictEqual(reallyLong.lastIndexOf(pattern), 0); 'Received an instance of lastIndexOf' }); } + +{ + const buf = Buffer.from('abcabc'); + + assert.strictEqual(buf.indexOf('c', 0, 3), 2); + assert.strictEqual(buf.indexOf('c', 0, 2), -1); + assert.strictEqual(buf.indexOf('a', 0, 1), 0); + assert.strictEqual(buf.indexOf('a', 0, 0), -1); + assert.strictEqual(buf.indexOf('abc', 0, 3), 0); + assert.strictEqual(buf.indexOf('abc', 0, 2), -1); + + assert.strictEqual(buf.indexOf('a', 2, 5), 3); + assert.strictEqual(buf.indexOf('a', 2, 3), -1); + assert.strictEqual(buf.indexOf('bc', 1, 4), 1); + assert.strictEqual(buf.indexOf('bc', 1, 3), 1); + + assert.strictEqual(buf.indexOf(Buffer.from('bc'), 0, 3), 1); + assert.strictEqual(buf.indexOf(Buffer.from('bc'), 0, 2), -1); + assert.strictEqual(buf.indexOf(new Uint8Array([0x61]), 0, 4), 0); + + assert.strictEqual(buf.indexOf(0x61, 0, 3), 0); + assert.strictEqual(buf.indexOf(0x61, 0, 1), 0); + assert.strictEqual(buf.indexOf(0x61, 1, 4), 3); + assert.strictEqual(buf.indexOf(0x61, 1, 3), -1); + assert.strictEqual(buf.indexOf(0x63, 0, 2), -1); + + assert.strictEqual(buf.indexOf('a', 0, 'utf8'), 0); + assert.strictEqual(buf.indexOf('abc', 0, 'utf8'), 0); + + assert.strictEqual(buf.indexOf('c'), 2); + assert.strictEqual(buf.indexOf('c', 3), 5); + + const latin1buf = Buffer.from('abcabc', 'latin1'); + assert.strictEqual(latin1buf.indexOf('c', 0, 3, 'latin1'), 2); + assert.strictEqual(latin1buf.indexOf('c', 0, 2, 'latin1'), -1); + + assert.strictEqual(buf.lastIndexOf('a', 5, 4), 3); + assert.strictEqual(buf.lastIndexOf('a', 5, 3), 0); + assert.strictEqual(buf.lastIndexOf('c', 5, 3), 2); + assert.strictEqual(buf.lastIndexOf('c', 5, buf.length), 5); + + assert.strictEqual(buf.lastIndexOf(0x61, 5, 4), 3); + assert.strictEqual(buf.lastIndexOf(0x61, 5, 3), 0); + + assert.strictEqual(buf.lastIndexOf('a', 5, 'utf8'), 3); + + assert.strictEqual(buf.lastIndexOf('a'), 3); + assert.strictEqual(buf.lastIndexOf('a', 2), 0); + + assert.strictEqual(buf.includes('c', 0, 3), true); + assert.strictEqual(buf.includes('c', 0, 2), false); + assert.strictEqual(buf.includes('abc', 0, 3), true); + assert.strictEqual(buf.includes('abc', 0, 2), false); + + assert.strictEqual(buf.includes('a', 0, 'utf8'), true); + + assert.strictEqual(buf.includes('c'), true); +} + +{ + const buf = Buffer.from('abcabc'); + + // Negative end should be treated as 0 (no match possible). + assert.strictEqual(buf.indexOf('a', 0, -1), -1); + assert.strictEqual(buf.indexOf('a', 0, -100), -1); + assert.strictEqual(buf.indexOf(0x61, 0, -1), -1); + assert.strictEqual(buf.lastIndexOf('a', 5, -1), -1); + assert.strictEqual(buf.lastIndexOf(0x61, 5, -1), -1); + assert.strictEqual(buf.includes('a', 0, -1), false); + assert.strictEqual(buf.indexOf(Buffer.from('a'), 0, -1), -1); + assert.strictEqual(buf.lastIndexOf(Buffer.from('a'), 5, -1), -1); + + // End = 0 means empty search range. + assert.strictEqual(buf.indexOf('a', 0, 0), -1); + assert.strictEqual(buf.indexOf(0x61, 0, 0), -1); + assert.strictEqual(buf.lastIndexOf('a', 5, 0), -1); + assert.strictEqual(buf.lastIndexOf(0x61, 5, 0), -1); + + // End greater than buffer length should be clamped. + assert.strictEqual(buf.indexOf('c', 0, 100), 2); + assert.strictEqual(buf.indexOf(0x63, 0, 100), 2); + assert.strictEqual(buf.lastIndexOf('c', 5, 100), 5); + assert.strictEqual(buf.lastIndexOf(0x63, 5, 100), 5); + assert.strictEqual(buf.indexOf(Buffer.from('c'), 0, 100), 2); + + // Empty needle with end parameter should clamp to search_end. + assert.strictEqual(buf.indexOf('', 0, 3), 0); + assert.strictEqual(buf.indexOf('', 5, 3), 3); + assert.strictEqual(buf.indexOf(Buffer.from(''), 5, 3), 3); + assert.strictEqual(buf.indexOf('', 0, 0), 0); + assert.strictEqual(buf.lastIndexOf('', 5, 3), 3); + assert.strictEqual(buf.lastIndexOf(Buffer.from(''), 5, 3), 3); +} diff --git a/test/parallel/test-cli-node-options.js b/test/parallel/test-cli-node-options.js index 0d17fc73dd4d..90c399790f65 100644 --- a/test/parallel/test-cli-node-options.js +++ b/test/parallel/test-cli-node-options.js @@ -68,7 +68,7 @@ if (common.hasCrypto) { if (!hasOpenSSL3) expectNoWorker('--openssl-config=_ossl_cfg', 'B\n'); if (common.isMacOS) { - expectNoWorker('--use-system-ca', 'B\n'); + expect('--use-system-ca', 'B\n'); } } diff --git a/test/parallel/test-cli-node-print-help-style.js b/test/parallel/test-cli-node-print-help-style.js new file mode 100644 index 000000000000..47fe7b75620a --- /dev/null +++ b/test/parallel/test-cli-node-print-help-style.js @@ -0,0 +1,64 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { execFile } = require('child_process'); + +// eslint-disable-next-line no-control-regex +const ANSI_SGR_REGEX = new RegExp('\x1b\\[[0-9;]*m', 'g'); + +function stripAnsi(text) { + return text.replace(ANSI_SGR_REGEX, ''); +} + +// Test: FORCE_COLOR=1 produces styled output +{ + const env = { ...process.env, FORCE_COLOR: '1' }; + execFile(process.execPath, ['--help'], { env }, + common.mustSucceed((stdout) => { + assert.ok(stdout.includes('\x1b[1m'), 'bold for headers should be present'); + assert.ok(stdout.includes('\x1b[32m'), 'green for option names should be present'); + assert.ok(stdout.includes('\x1b[35m'), 'magenta for env var names should be present'); + assert.ok(stdout.includes('\x1b[34m'), 'blue for URL should be present'); + assert.ok(stdout.includes('\x1b[4m'), 'underline for URL should be present'); + })); +} + +// Test: NO_COLOR=1 produces plain output +{ + const env = { ...process.env, NO_COLOR: '1' }; + delete env.FORCE_COLOR; + execFile(process.execPath, ['--help'], { env }, + common.mustSucceed((stdout) => { + assert.ok(stripAnsi(stdout) === stdout, + 'no ANSI escape sequences should be present with NO_COLOR=1'); + })); +} + +// Test: piped (non-TTY, no FORCE_COLOR) produces plain output +{ + const env = { ...process.env }; + delete env.FORCE_COLOR; + delete env.NO_COLOR; + delete env.NODE_DISABLE_COLORS; + execFile(process.execPath, ['--help'], { env }, + common.mustSucceed((stdout) => { + assert.ok(stripAnsi(stdout) === stdout, + 'no ANSI escape sequences should be present when piped (non-TTY)'); + })); +} + +// Test: alignment preservation - stripped styled output matches plain output +{ + const envStyled = { ...process.env, FORCE_COLOR: '1' }; + const envPlain = { ...process.env, NO_COLOR: '1' }; + delete envPlain.FORCE_COLOR; + execFile(process.execPath, ['--help'], { env: envStyled }, + common.mustSucceed((styledStdout) => { + execFile(process.execPath, ['--help'], { env: envPlain }, + common.mustSucceed((plainStdout) => { + assert.ok(stripAnsi(styledStdout) === plainStdout, + 'stripped styled output should match plain output (alignment preservation)'); + })); + })); +} diff --git a/test/parallel/test-config-file.js b/test/parallel/test-config-file.js index 6aac042b0c6c..4f5b57e0572c 100644 --- a/test/parallel/test-config-file.js +++ b/test/parallel/test-config-file.js @@ -516,14 +516,26 @@ describe('namespace-scoped options', () => { assert.strictEqual(result.code, 9); }); - it('should not throw an error when a namespace is not recognised', async () => { + it('should throw an error when a namespace is not recognised', async () => { const result = await spawnPromisified(process.execPath, [ '--no-warnings', `--experimental-config-file=${fixtures.path('rc/unknown-namespace.json')}`, '-p', '"Hello, World!"', ]); + assert.match(result.stderr, /Unknown namespace an-invalid-namespace/); + assert.match(result.stderr, /unknown-namespace\.json: invalid content/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); + }); + + it('should allow the $schema field', async () => { + const result = await spawnPromisified(process.execPath, [ + '--no-warnings', + `--experimental-config-file=${fixtures.path('rc/schema.json')}`, + '-p', 'http.maxHeaderSize', + ]); assert.strictEqual(result.stderr, ''); - assert.strictEqual(result.stdout, 'Hello, World!\n'); + assert.strictEqual(result.stdout, '10\n'); assert.strictEqual(result.code, 0); }); diff --git a/test/parallel/test-crypto-argon2-job.js b/test/parallel/test-crypto-argon2-job.js index 178798af4adf..7c16f9d850af 100644 --- a/test/parallel/test-crypto-argon2-job.js +++ b/test/parallel/test-crypto-argon2-job.js @@ -29,19 +29,30 @@ const empty = Buffer.alloc(0); // Parameters that OpenSSL's Argon2 KDF rejects. const badParams = [ - { lanes: 0, keylen: 32, memcost: 16, iter: 1 }, // lanes < 1 - { lanes: 1, keylen: 32, memcost: 0, iter: 1 }, // memcost == 0 - { lanes: 1, keylen: 32, memcost: 16, iter: 0 }, // iter == 0 + { lanes: 0, keylen: 32, memcost: 16, iter: 1, + reason: /invalid thread pool size/ }, + { lanes: 1, keylen: 32, memcost: 0, iter: 1, + reason: /invalid memory size/ }, + { lanes: 1, keylen: 32, memcost: 16, iter: 0, + reason: /invalid iteration count/ }, ]; -for (const { lanes, keylen, memcost, iter } of badParams) { +function assertError(err, { reason }) { + assert.ok(err); + const details = [err.message, ...(err.opensslErrorStack ?? [])]; + assert.ok(details.some((msg) => reason.test(msg)), + `did not find ${reason} in ${details}`); +} + +for (const params of badParams) { + const { lanes, keylen, memcost, iter } = params; + { const job = new Argon2Job( kCryptoJobSync, pass, salt, lanes, keylen, memcost, iter, empty, empty, kTypeArgon2id); const { 0: err, 1: result } = job.run(); - assert.ok(err); - assert.match(err.message, /Deriving bits failed/); + assertError(err, params); assert.strictEqual(result, undefined); } @@ -50,8 +61,7 @@ for (const { lanes, keylen, memcost, iter } of badParams) { kCryptoJobAsync, pass, salt, lanes, keylen, memcost, iter, empty, empty, kTypeArgon2id); job.ondone = common.mustCall((err, result) => { - assert.ok(err); - assert.match(err.message, /Deriving bits failed/); + assertError(err, params); assert.strictEqual(result, undefined); }); job.run(); diff --git a/test/parallel/test-crypto-argon2.js b/test/parallel/test-crypto-argon2.js index 2137bf345d4a..1f238e61a61d 100644 --- a/test/parallel/test-crypto-argon2.js +++ b/test/parallel/test-crypto-argon2.js @@ -140,6 +140,18 @@ for (const key of Object.keys(defaults)) { assert.throws(() => crypto.argon2Sync('argon2id', parameters), expected); } +for (const key of ['secret', 'associatedData']) { + const expected = { + code: 'ERR_INVALID_ARG_TYPE', + message: new RegExp(`"parameters\\.${key}"`), + }; + for (const value of [123, null, true, {}, []]) { + const parameters = { ...defaults, [key]: value }; + assert.throws(() => crypto.argon2('argon2id', parameters, () => {}), expected); + assert.throws(() => crypto.argon2Sync('argon2id', parameters), expected); + } +} + { const expected = { code: 'ERR_INVALID_ARG_TYPE' }; assert.throws(() => crypto.argon2(), expected); diff --git a/test/parallel/test-crypto-dh-curves.js b/test/parallel/test-crypto-dh-curves.js index ddd5ea9377e6..f14c58e7c200 100644 --- a/test/parallel/test-crypto-dh-curves.js +++ b/test/parallel/test-crypto-dh-curves.js @@ -5,6 +5,12 @@ if (!common.hasCrypto) const assert = require('assert'); const crypto = require('crypto'); +const { hasOpenSSL } = require('../common/crypto'); +const { + DH_CHECK_P_NOT_PRIME, + DH_CHECK_P_NOT_SAFE_PRIME, + DH_NOT_SUITABLE_GENERATOR, +} = crypto.constants; // Second OAKLEY group, see // https://github.com/nodejs/node-v0.x-archive/issues/2338 and @@ -15,12 +21,69 @@ const p = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' + 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF'; crypto.createDiffieHellman(p, 'hex'); +if (!process.features.openssl_is_boringssl) { + const notPrime = Buffer.from(p, 'hex'); + notPrime[notPrime.length - 1] = 0xfd; + assert.strictEqual( + crypto.createDiffieHellman(notPrime, Buffer.from([2])).verifyError, + DH_CHECK_P_NOT_PRIME); + + const notSafePrime = Buffer.from( + 'd2d6d13e1c1e0bbb63c742199dee010411f089ac74f0f7213348388280700fd6' + + '0ef9c1e7b096a4257dcbce61c544a5d1d23db4c49c63ce302f63be5cf5804327', + 'hex'); + assert.strictEqual( + crypto.createDiffieHellman(notSafePrime, Buffer.from([2])).verifyError, + DH_CHECK_P_NOT_SAFE_PRIME); + + const group = crypto.getDiffieHellman('modp14'); + const alice = crypto.createDiffieHellman( + group.getPrime(), group.getGenerator()); + alice.generateKeys(); + const groupPrime = BigInt(`0x${group.getPrime('hex')}`); + assert.throws( + () => alice.computeSecret(Buffer.from([1])), + { + code: 'ERR_CRYPTO_INVALID_KEYLEN', + message: 'Supplied key is too small' + }); + assert.throws( + () => alice.computeSecret(group.getPrime()), + { + code: 'ERR_CRYPTO_INVALID_KEYLEN', + message: 'Supplied key is too large' + }); + assert.throws( + () => alice.computeSecret( + Buffer.from((groupPrime - 1n).toString(16), 'hex')), + { + code: 'ERR_CRYPTO_INVALID_KEYLEN', + message: 'Supplied key is too large' + }); +} + // Confirm DH_check() results are exposed for optional examination. const bad_dh = process.features.openssl_is_boringssl ? crypto.createDiffieHellman('abcd', 'hex', 0) : crypto.createDiffieHellman('02', 'hex'); assert.notStrictEqual(bad_dh.verifyError, 0); +if (hasOpenSSL(3)) { + const smallSafePrime = crypto.createDiffieHellman( + Buffer.from([23]), Buffer.from([2])); + assert.notStrictEqual(smallSafePrime.verifyError, 0); + + assert.throws( + () => crypto.createDiffieHellman(Buffer.from(p, 'hex'), + Buffer.from(p, 'hex')), + { code: 'ERR_OSSL_DH_BAD_GENERATOR' }); +} else if (!process.features.openssl_is_boringssl) { + assert.strictEqual( + crypto.createDiffieHellman(Buffer.from(p, 'hex'), + Buffer.from(p, 'hex')).verifyError, + DH_NOT_SUITABLE_GENERATOR); +} + const availableCurves = new Set(crypto.getCurves()); const availableHashes = new Set(crypto.getHashes()); diff --git a/test/parallel/test-crypto-encoding-validation-error.js b/test/parallel/test-crypto-encoding-validation-error.js index 0e921ac2862f..673527a2ad3e 100644 --- a/test/parallel/test-crypto-encoding-validation-error.js +++ b/test/parallel/test-crypto-encoding-validation-error.js @@ -12,13 +12,19 @@ const createCipher = () => { return createCipheriv('aes-256-cbc', randomBytes(32), randomBytes(16)); }; +const encodingChangeError = { + code: 'ERR_INVALID_ARG_VALUE', + name: 'TypeError', + message: /cannot be changed from 'utf8'/, +}; + { const cipher = createCipher(); cipher.update('test', 'utf-8', 'utf-8'); assert.throws( () => cipher.update('666f6f', 'hex', 'hex'), - { message: /Cannot change encoding/ } + encodingChangeError ); } @@ -28,7 +34,7 @@ const createCipher = () => { assert.throws( () => cipher.final('hex'), - { message: /Cannot change encoding/ } + encodingChangeError ); } diff --git a/test/parallel/test-crypto-key-objects.js b/test/parallel/test-crypto-key-objects.js index 84250a3ada22..cfcd50f12a3e 100644 --- a/test/parallel/test-crypto-key-objects.js +++ b/test/parallel/test-crypto-key-objects.js @@ -920,6 +920,41 @@ if (!process.features.openssl_is_boringssl) { } } } + + const der = publicKey.export({ format: 'der', type: 'spki' }); + const saltLengthParam = Buffer.from([0xa2, 0x03, 0x02, 0x01, 0x10]); + const saltLengthOffset = der.indexOf(saltLengthParam); + assert.notStrictEqual(saltLengthOffset, -1); + + const importMalformedPublicKey = common.mustCall((key) => { + const malformedKey = createPublicKey({ + key, + format: 'der', + type: 'spki' + }); + assert.strictEqual(malformedKey.asymmetricKeyType, 'rsa-pss'); + assert.strictEqual(malformedKey.asymmetricKeyDetails.modulusLength, 2048); + assert.strictEqual(malformedKey.asymmetricKeyDetails.publicExponent, + 65537n); + }, 2); + + { + const negativeSaltLength = Buffer.from(der); + negativeSaltLength[saltLengthOffset + saltLengthParam.length - 1] = 0x80; + importMalformedPublicKey(negativeSaltLength); + } + + { + const oversizedSaltLength = Buffer.concat([ + der.subarray(0, saltLengthOffset), + Buffer.from([0xa2, 0x0b, 0x02, 0x09, 1, 0, 0, 0, 0, 0, 0, 0, 0x10]), + der.subarray(saltLengthOffset + saltLengthParam.length), + ]); + oversizedSaltLength.writeUInt16BE(der.readUInt16BE(2) + 8, 2); + oversizedSaltLength[5] = der[5] + 8; + oversizedSaltLength[18] = der[18] + 8; + importMalformedPublicKey(oversizedSaltLength); + } } { @@ -990,7 +1025,8 @@ if (!process.features.openssl_is_boringssl) { }, { name: 'TypeError', code: 'ERR_INVALID_ARG_VALUE', - message: "The property 'options.cipher' is invalid. Received undefined" + message: "The property 'options.cipher' is required when a " + + 'passphrase is specified. Received undefined', }); } diff --git a/test/parallel/test-crypto-keygen.js b/test/parallel/test-crypto-keygen.js index 7dddfcab275d..206d6f7a84b5 100644 --- a/test/parallel/test-crypto-keygen.js +++ b/test/parallel/test-crypto-keygen.js @@ -89,6 +89,21 @@ const isBoringSSL = process.features.openssl_is_boringssl; message: 'The "options" argument must be of type object. ' + 'Received type number (0)' }); + + for (const type of ['rsa', 'ed25519']) { + assert.throws(() => generateKeyPairSync(type, null), { + name: 'TypeError', + code: 'ERR_INVALID_ARG_TYPE', + message: 'The "options" argument must be of type object. ' + + 'Received null' + }); + assert.throws(() => generateKeyPair(type, null, common.mustNotCall()), { + name: 'TypeError', + code: 'ERR_INVALID_ARG_TYPE', + message: 'The "options" argument must be of type object. ' + + 'Received null' + }); + } } { diff --git a/test/parallel/test-crypto-no-algorithm.js b/test/parallel/test-crypto-no-algorithm.js index 96236a976a89..76063a04227e 100644 --- a/test/parallel/test-crypto-no-algorithm.js +++ b/test/parallel/test-crypto-no-algorithm.js @@ -26,6 +26,23 @@ if (isMainThread) { `did not find ${expected} in ${err.opensslErrorStack}`); } })); + + const derivations = [ + ['HKDF', () => crypto.hkdfSync('sha256', Buffer.alloc(32), Buffer.alloc(8), + Buffer.alloc(0), 32)], + ['PBKDF2', () => crypto.pbkdf2Sync('secret', Buffer.alloc(16), 1000, 32, + 'sha256')], + ]; + for (const { 0: name, 1: derive } of derivations) { + try { + derive(); + } catch (err) { + const expected = /digital envelope routines::unsupported/; + const details = [err.message, ...(err.opensslErrorStack ?? [])]; + assert(details.some((msg) => expected.test(msg)), + `${name}: did not find ${expected} in ${details}`); + } + } } { diff --git a/test/parallel/test-crypto-sec-level.js b/test/parallel/test-crypto-sec-level.js index 017db3e361e8..d7d2252be6c3 100644 --- a/test/parallel/test-crypto-sec-level.js +++ b/test/parallel/test-crypto-sec-level.js @@ -8,7 +8,7 @@ if (!common.hasCrypto) const assert = require('assert'); // OpenSSL has a set of security levels which affect what algorithms -// are available by default. Different OpenSSL veresions have different +// are available by default. Different OpenSSL versions have different // default security levels and we use this value to adjust what a test // expects based on the security level. You can read more in // https://docs.openssl.org/1.1.1/man3/SSL_CTX_set_security_level/#default-callback-behaviour diff --git a/test/parallel/test-crypto-x509.js b/test/parallel/test-crypto-x509.js index a122ee9e300f..353699cf9117 100644 --- a/test/parallel/test-crypto-x509.js +++ b/test/parallel/test-crypto-x509.js @@ -7,6 +7,7 @@ if (!common.hasCrypto) const { X509Certificate, + createHash, createPrivateKey, generateKeyPairSync, createSign, @@ -27,6 +28,42 @@ const ca = readFileSync(fixtures.path('keys', 'ca1-cert.pem')); const privateKey = createPrivateKey(key); +if (!process.features.openssl_is_boringssl) { + const expectedPubkeys = hasOpenSSL3 ? [ + [ + 'rsa_pss_cert_2048.pem', + 292, + 'dff998a209bfa2e6ded1208c6e57f5b6bdedfa44b631265e3e244f38e637f6e4', + ], + [ + 'rsa_pss_cert_2048_sha256_sha256_16.pem', + 342, + 'da0bcd53fbe3969c7cc2730f86abc34e0e1c340264bbdfa3faf01484c2eeece0', + ], + ] : [ + [ + 'rsa_pss_cert_2048.pem', + 294, + '4d4f2f076aced4f0df922b84b466b0a60ba4cb50a23d695ae12ddc5fff7aca14', + ], + [ + 'rsa_pss_cert_2048_sha256_sha256_16.pem', + 294, + 'd37942c3bd02bc25c724fcd31efd647824e536c13d62d9ad0b5db8c0900d3cba', + ], + ]; + + for (const [name, length, digest] of expectedPubkeys) { + const pssCert = new X509Certificate( + readFileSync(fixtures.path('keys', name))); + const pubkey = pssCert.toLegacyObject().pubkey; + assert.strictEqual(pubkey.length, length); + assert.strictEqual( + createHash('sha256').update(pubkey).digest('hex'), + digest); + } +} + [1, {}, false, null].forEach((i) => { assert.throws(() => new X509Certificate(i), { code: 'ERR_INVALID_ARG_TYPE' diff --git a/test/parallel/test-debugger-break.js b/test/parallel/test-debugger-break.js index 4da400e44758..09481480c35e 100644 --- a/test/parallel/test-debugger-break.js +++ b/test/parallel/test-debugger-break.js @@ -41,7 +41,7 @@ const cli = startCLI([script]); assert.match( cli.output, /> 3 name = 'Robin';/, - 'marks the 3nd line'); + 'marks the 3rd line'); await cli.stepCommand('cont'); assert.ok( diff --git a/test/parallel/test-debugger-extract-function-name.mjs b/test/parallel/test-debugger-extract-function-name.mjs index a7de32ad4e2c..b787750453f9 100644 --- a/test/parallel/test-debugger-extract-function-name.mjs +++ b/test/parallel/test-debugger-extract-function-name.mjs @@ -7,10 +7,14 @@ import startCLI from '../common/debugger.js'; import assert from 'assert'; -const cli = startCLI([fixtures.path('debugger', 'three-lines.js')]); +const env = { + ...process.env, + NODE_INSPECT_RESUME_ON_START: '1', +}; +const cli = startCLI( + [fixtures.path('debugger', 'alive.js')], [], { env }); try { - await cli.waitForInitialBreak(); await cli.waitForPrompt(); await cli.command('exec a = function func() {}; a;'); assert.match(cli.output, /\[Function: func\]/); diff --git a/test/parallel/test-debugger-probe-cond-invalid.js b/test/parallel/test-debugger-probe-cond-invalid.js new file mode 100644 index 000000000000..c5c137e05819 --- /dev/null +++ b/test/parallel/test-debugger-probe-cond-invalid.js @@ -0,0 +1,40 @@ +// This tests that probe mode rejects malformed --cond usage. +'use strict'; + +const common = require('../common'); +common.skipIfInspectorDisabled(); + +const fixtures = require('../common/fixtures'); +const { assertProbeCliError } = require('../common/debugger-probe'); + +const cwd = fixtures.path('debugger'); + +assertProbeCliError( + ['--cond', 'x', '--probe', 'probe.js:12', '--expr', 'finalValue', 'probe.js'], + /Unexpected --cond before --probe/, { cwd }); + +assertProbeCliError( + ['--probe', 'probe.js:12', '--cond', 'x', '--expr', 'finalValue', 'probe.js'], + /Each --probe must be followed immediately by --expr/, { cwd }); + +assertProbeCliError( + ['--probe', 'probe.js:12', '--expr', 'finalValue', '--cond', 'x', '--cond', 'y', 'probe.js'], + /A --probe can have at most one --cond/, { cwd }); + +assertProbeCliError( + ['--probe', 'probe.js:12', '--expr', 'finalValue', '--cond', ' ', 'probe.js'], + /Missing value for --cond/, { cwd }); + +assertProbeCliError( + ['--probe', 'probe.js:12', '--expr', 'finalValue', '--cond'], + /Missing value for --cond/, { cwd }); + +assertProbeCliError( + ['--probe', 'probe.js:12', '--expr', 'a', '--cond', 'x', + '--probe', 'probe.js:12', '--expr', 'b', '--cond', 'y', 'probe.js'], + /Probes at probe\.js:12 must use the same --cond \(or none\)/, { cwd }); + +assertProbeCliError( + ['--probe', 'probe.js:12', '--expr', 'a', '--cond', 'x', + '--probe', 'probe.js:12', '--expr', 'b', 'probe.js'], + /Probes at probe\.js:12 must use the same --cond \(or none\)/, { cwd }); diff --git a/test/parallel/test-debugger-probe-cond-max-hit.js b/test/parallel/test-debugger-probe-cond-max-hit.js new file mode 100644 index 000000000000..ca5b831194e9 --- /dev/null +++ b/test/parallel/test-debugger-probe-cond-max-hit.js @@ -0,0 +1,47 @@ +// This tests that --cond and --max-hit work together. +'use strict'; + +const common = require('../common'); +common.skipIfInspectorDisabled(); + +const fixtures = require('../common/fixtures'); +const { spawnSyncAndAssert } = require('../common/child_process'); +const { assertProbeJson } = require('../common/debugger-probe'); + +const cwd = fixtures.path('debugger'); +const probeUrl = fixtures.fileURL('debugger', 'probe-max-hit.js').href; + +// --max-hit written before --cond. The condition still filters index !== 1, so +// the only recorded hit carries value 1 rather than the loop's first iteration. +spawnSyncAndAssert(process.execPath, [ + 'inspect', + '--json', + '--probe', 'probe-max-hit.js:5', + '--expr', 'index', + '--max-hit', '5', + '--cond', 'index === 1', + 'probe-max-hit.js', +], { cwd }, { + stdout(output) { + assertProbeJson(output, { + v: 2, + probes: [{ + expr: 'index', + condition: 'index === 1', + maxHit: 5, + target: { suffix: 'probe-max-hit.js', line: 5 }, + }], + results: [ + { + probe: 0, + event: 'hit', + hit: 1, + location: { url: probeUrl, line: 5, column: 3 }, + result: { type: 'number', value: 1, description: '1' }, + }, + { event: 'completed' }, + ], + }); + }, + trim: true, +}); diff --git a/test/parallel/test-debugger-probe-cond-shared.js b/test/parallel/test-debugger-probe-cond-shared.js new file mode 100644 index 000000000000..0a0085417713 --- /dev/null +++ b/test/parallel/test-debugger-probe-cond-shared.js @@ -0,0 +1,61 @@ +// This tests that two probes at the same location with the same --cond share a +// single breakpoint and both evaluate only when the condition holds. +'use strict'; + +const common = require('../common'); +common.skipIfInspectorDisabled(); + +const fixtures = require('../common/fixtures'); +const { spawnSyncAndAssert } = require('../common/child_process'); +const { assertProbeJson } = require('../common/debugger-probe'); + +const cwd = fixtures.path('debugger'); +const probeUrl = fixtures.fileURL('debugger', 'probe-max-hit.js').href; + +spawnSyncAndAssert(process.execPath, [ + 'inspect', + '--json', + '--probe', 'probe-max-hit.js:5', + '--expr', 'index', + '--cond', 'index === 1', + '--probe', 'probe-max-hit.js:5', + '--expr', 'total', + '--cond', 'index === 1', + 'probe-max-hit.js', +], { cwd }, { + stdout(output) { + assertProbeJson(output, { + v: 2, + probes: [ + { + expr: 'index', + condition: 'index === 1', + target: { suffix: 'probe-max-hit.js', line: 5 }, + }, + { + expr: 'total', + condition: 'index === 1', + target: { suffix: 'probe-max-hit.js', line: 5 }, + }, + ], + results: [ + { + probe: 0, + event: 'hit', + hit: 1, + location: { url: probeUrl, line: 5, column: 3 }, + result: { type: 'number', value: 1, description: '1' }, + }, + { + probe: 1, + event: 'hit', + hit: 1, + location: { url: probeUrl, line: 5, column: 3 }, + result: { type: 'number', value: 1, description: '1' }, + }, + { event: 'completed' }, + ], + }); + }, + trim: true, +}); diff --git a/test/parallel/test-debugger-probe-cond-throws.js b/test/parallel/test-debugger-probe-cond-throws.js new file mode 100644 index 000000000000..a60eacfba87c --- /dev/null +++ b/test/parallel/test-debugger-probe-cond-throws.js @@ -0,0 +1,37 @@ +// This tests that a --cond expression that throws is treated as false, so the +// probe never records a hit and is reported as missed. +'use strict'; + +const common = require('../common'); +common.skipIfInspectorDisabled(); + +const fixtures = require('../common/fixtures'); +const { spawnSyncAndAssert } = require('../common/child_process'); +const { assertProbeJson } = require('../common/debugger-probe'); + +const cwd = fixtures.path('debugger'); + +spawnSyncAndAssert(process.execPath, [ + 'inspect', + '--json', + '--probe', 'probe-max-hit.js:5', + '--expr', 'index', + '--cond', 'index.missing.member', + 'probe-max-hit.js', +], { cwd }, { + stdout(output) { + assertProbeJson(output, { + v: 2, + probes: [{ + expr: 'index', + condition: 'index.missing.member', + target: { suffix: 'probe-max-hit.js', line: 5 }, + }], + results: [{ + event: 'miss', + pending: [0], + }], + }); + }, + trim: true, +}); diff --git a/test/parallel/test-debugger-probe-cond.js b/test/parallel/test-debugger-probe-cond.js new file mode 100644 index 000000000000..08d7f2c87153 --- /dev/null +++ b/test/parallel/test-debugger-probe-cond.js @@ -0,0 +1,44 @@ +// This tests that --cond only records a hit when the condition is truthy at +// the probe location. +'use strict'; + +const common = require('../common'); +common.skipIfInspectorDisabled(); + +const fixtures = require('../common/fixtures'); +const { spawnSyncAndAssert } = require('../common/child_process'); +const { assertProbeJson } = require('../common/debugger-probe'); + +const cwd = fixtures.path('debugger'); +const probeUrl = fixtures.fileURL('debugger', 'probe-max-hit.js').href; + +spawnSyncAndAssert(process.execPath, [ + 'inspect', + '--json', + '--probe', 'probe-max-hit.js:5', + '--expr', 'index', + '--cond', 'index === 1', + 'probe-max-hit.js', +], { cwd }, { + stdout(output) { + assertProbeJson(output, { + v: 2, + probes: [{ + expr: 'index', + condition: 'index === 1', + target: { suffix: 'probe-max-hit.js', line: 5 }, + }], + results: [ + { + probe: 0, + event: 'hit', + hit: 1, + location: { url: probeUrl, line: 5, column: 3 }, + result: { type: 'number', value: 1, description: '1' }, + }, + { event: 'completed' }, + ], + }); + }, + trim: true, +}); diff --git a/test/parallel/test-dgram-membership.js b/test/parallel/test-dgram-membership.js index ebfdaa9cb632..052deb92d611 100644 --- a/test/parallel/test-dgram-membership.js +++ b/test/parallel/test-dgram-membership.js @@ -90,7 +90,7 @@ const setup = dgram.createSocket.bind(dgram, { type: 'udp4', reuseAddr: true }); socket.close(); } -// addSourceSpecificMembership with invalid sourceAddress should throw +// addSourceSpecificMembership with invalid groupAddress should throw { const socket = setup(); assert.throws(() => { diff --git a/test/parallel/test-diagnostics-channel-many-channels.js b/test/parallel/test-diagnostics-channel-many-channels.js new file mode 100644 index 000000000000..3183bc10f485 --- /dev/null +++ b/test/parallel/test-diagnostics-channel-many-channels.js @@ -0,0 +1,19 @@ +'use strict'; + +const common = require('../common'); +const assert = require('node:assert'); +const dc = require('node:diagnostics_channel'); + +let last; +for (let i = 0; i < 1024 * 10 + 1; i++) { + last = dc.channel(`test:many-channels:${i}`); +} + +const onMessage = common.mustCall((message, name) => { + assert.strictEqual(message, 'message'); + assert.strictEqual(name, last.name); +}); + +last.subscribe(onMessage); +last.publish('message'); +assert.strictEqual(last.unsubscribe(onMessage), true); diff --git a/test/parallel/test-diagnostics-channel-symbol-named.js b/test/parallel/test-diagnostics-channel-symbol-named.js index 96fe0fa53596..84213d4e22e5 100644 --- a/test/parallel/test-diagnostics-channel-symbol-named.js +++ b/test/parallel/test-diagnostics-channel-symbol-named.js @@ -12,6 +12,7 @@ const symbol = Symbol('test'); // Individual channel objects can be created to avoid future lookups const channel = dc.channel(symbol); +assert.strictEqual(Object.hasOwn(channel, '_index'), true); // Expect two successful publishes later channel.subscribe(common.mustCall((message, name) => { diff --git a/test/parallel/test-domain-uncaught-exception.js b/test/parallel/test-domain-uncaught-exception.js index a9a28c35ec26..1e585dda2e86 100644 --- a/test/parallel/test-domain-uncaught-exception.js +++ b/test/parallel/test-domain-uncaught-exception.js @@ -31,7 +31,7 @@ tests.push({ }); function test2() { - // Throwing from from within a domain that doesn't have an error handler must + // Throwing from within a domain that doesn't have an error handler must // result in emitting the process' uncaughtException event. const d2 = domain.create(); d2.run(function() { diff --git a/test/parallel/test-eslint-func-name-matching.js b/test/parallel/test-eslint-func-name-matching.js new file mode 100644 index 000000000000..588ba9e234b4 --- /dev/null +++ b/test/parallel/test-eslint-func-name-matching.js @@ -0,0 +1,1108 @@ +// @fileoverview Tests for func-name-matching rule. +// @author Annie Zhang + +'use strict'; +const common = require('../common'); +if ((!common.hasCrypto) || (!common.hasIntl)) { + common.skip('ESLint tests require crypto and Intl'); +} +common.skipIfEslintMissing(); + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const rule = require('../../tools/eslint-rules/func-name-matching'); +const RuleTester = require('../../tools/eslint/node_modules/eslint').RuleTester; + +//------------------------------------------------------------------------------ +// Tests +//------------------------------------------------------------------------------ + +const ruleTester = new RuleTester(); + +ruleTester.run('func-name-matching', rule, { + valid: [ + 'var foo;', + 'var foo = function foo() {};', + { code: 'var foo = function foo() {};', options: ['always'] }, + { code: 'var foo = function bar() {};', options: ['never'] }, + 'var foo = function() {}', + { code: 'var foo = () => {}', languageOptions: { ecmaVersion: 6 } }, + 'foo = function foo() {};', + { code: 'foo = function foo() {};', options: ['always'] }, + { code: 'foo = function bar() {};', options: ['never'] }, + { + code: 'foo &&= function foo() {};', + languageOptions: { ecmaVersion: 2021 }, + }, + { + code: 'obj.foo ||= function foo() {};', + languageOptions: { ecmaVersion: 2021 }, + }, + { + code: 'obj[\'foo\'] ??= function foo() {};', + languageOptions: { ecmaVersion: 2021 }, + }, + 'obj.foo = function foo() {};', + { code: 'obj.foo = function foo() {};', options: ['always'] }, + { code: 'obj.foo = function bar() {};', options: ['never'] }, + 'obj.foo = function() {};', + { code: 'obj.foo = function() {};', options: ['always'] }, + { code: 'obj.foo = function() {};', options: ['never'] }, + 'obj.bar.foo = function foo() {};', + { code: 'obj.bar.foo = function foo() {};', options: ['always'] }, + { code: 'obj.bar.foo = function baz() {};', options: ['never'] }, + 'obj[\'foo\'] = function foo() {};', + { code: 'obj[\'foo\'] = function foo() {};', options: ['always'] }, + { code: 'obj[\'foo\'] = function bar() {};', options: ['never'] }, + 'obj[\'foo//bar\'] = function foo() {};', + { code: 'obj[\'foo//bar\'] = function foo() {};', options: ['always'] }, + { code: 'obj[\'foo//bar\'] = function foo() {};', options: ['never'] }, + 'obj[foo] = function bar() {};', + { code: 'obj[foo] = function bar() {};', options: ['always'] }, + { code: 'obj[foo] = function bar() {};', options: ['never'] }, + 'var obj = {foo: function foo() {}};', + { code: 'var obj = {foo: function foo() {}};', options: ['always'] }, + { code: 'var obj = {foo: function bar() {}};', options: ['never'] }, + 'var obj = {\'foo\': function foo() {}};', + { code: 'var obj = {\'foo\': function foo() {}};', options: ['always'] }, + { code: 'var obj = {\'foo\': function bar() {}};', options: ['never'] }, + 'var obj = {\'foo//bar\': function foo() {}};', + { + code: 'var obj = {\'foo//bar\': function foo() {}};', + options: ['always'], + }, + { + code: 'var obj = {\'foo//bar\': function foo() {}};', + options: ['never'], + }, + 'var obj = {foo: function() {}};', + { code: 'var obj = {foo: function() {}};', options: ['always'] }, + { code: 'var obj = {foo: function() {}};', options: ['never'] }, + { + code: 'var obj = {[foo]: function bar() {}} ', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'var obj = {[\'x\' + 2]: function bar(){}};', + languageOptions: { ecmaVersion: 6 }, + }, + 'obj[\'x\' + 2] = function bar(){};', + { + code: 'var [ bar ] = [ function bar(){} ];', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'function a(foo = function bar() {}) {}', + languageOptions: { ecmaVersion: 6 }, + }, + 'module.exports = function foo(name) {};', + 'module[\'exports\'] = function foo(name) {};', + { + code: 'module.exports = function foo(name) {};', + options: [{ includeCommonJSModuleExports: false }], + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'module.exports = function foo(name) {};', + options: ['always', { includeCommonJSModuleExports: false }], + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'module.exports = function foo(name) {};', + options: ['never', { includeCommonJSModuleExports: false }], + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'module[\'exports\'] = function foo(name) {};', + options: [{ includeCommonJSModuleExports: false }], + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'module[\'exports\'] = function foo(name) {};', + options: ['always', { includeCommonJSModuleExports: false }], + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'module[\'exports\'] = function foo(name) {};', + options: ['never', { includeCommonJSModuleExports: false }], + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({[\'foo\']: function foo() {}})', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({[\'foo\']: function foo() {}})', + options: ['always'], + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({[\'foo\']: function bar() {}})', + options: ['never'], + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({[\'❤\']: function foo() {}})', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({[foo]: function bar() {}})', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({[null]: function foo() {}})', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({[1]: function foo() {}})', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({[true]: function foo() {}})', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({[`x`]: function foo() {}})', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({[/abc/]: function foo() {}})', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({[[1, 2, 3]]: function foo() {}})', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({[{x: 1}]: function foo() {}})', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '[] = function foo() {}', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({} = function foo() {})', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '[a] = function foo() {}', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({a} = function foo() {})', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'var [] = function foo() {}', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'var {} = function foo() {}', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'var [a] = function foo() {}', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'var {a} = function foo() {}', + languageOptions: { ecmaVersion: 6 }, + }, + { + code: '({ value: function value() {} })', + options: [{ considerPropertyDescriptor: true }], + }, + { + code: 'obj.foo = function foo() {};', + options: ['always', { considerPropertyDescriptor: true }], + }, + { + code: 'obj.bar.foo = function foo() {};', + options: ['always', { considerPropertyDescriptor: true }], + }, + { + code: 'var obj = {foo: function foo() {}};', + options: ['always', { considerPropertyDescriptor: true }], + }, + { + code: 'var obj = {foo: function() {}};', + options: ['always', { considerPropertyDescriptor: true }], + }, + { + code: 'var obj = { value: function value() {} }', + options: ['always', { considerPropertyDescriptor: true }], + }, + { + code: 'Object.defineProperty(foo, \'bar\', { value: function bar() {} })', + options: ['always', { considerPropertyDescriptor: true }], + }, + { + code: 'Object.defineProperties(foo, { bar: { value: function bar() {} } })', + options: ['always', { considerPropertyDescriptor: true }], + }, + { + code: 'Object.create(proto, { bar: { value: function bar() {} } })', + options: ['always', { considerPropertyDescriptor: true }], + }, + { + code: 'Object.defineProperty(foo, \'b\' + \'ar\', { value: function bar() {} })', + options: ['always', { considerPropertyDescriptor: true }], + }, + { + code: 'Object.defineProperties(foo, { [\'bar\']: { value: function bar() {} } })', + options: ['always', { considerPropertyDescriptor: true }], + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'Object.create(proto, { [\'bar\']: { value: function bar() {} } })', + options: ['always', { considerPropertyDescriptor: true }], + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'Object.defineProperty(foo, \'bar\', { value() {} })', + options: ['never', { considerPropertyDescriptor: true }], + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'Object.defineProperties(foo, { bar: { value() {} } })', + options: ['never', { considerPropertyDescriptor: true }], + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'Object.create(proto, { bar: { value() {} } })', + options: ['never', { considerPropertyDescriptor: true }], + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'Reflect.defineProperty(foo, \'bar\', { value: function bar() {} })', + options: ['always', { considerPropertyDescriptor: true }], + }, + { + code: 'Reflect.defineProperty(foo, \'b\' + \'ar\', { value: function baz() {} })', + options: ['always', { considerPropertyDescriptor: true }], + }, + { + code: 'Reflect.defineProperty(foo, \'bar\', { value() {} })', + options: ['never', { considerPropertyDescriptor: true }], + languageOptions: { ecmaVersion: 6 }, + }, + { + code: 'foo({ value: function value() {} })', + options: ['always', { considerPropertyDescriptor: true }], + }, + + // Class fields, private names are ignored + { + code: 'class C { x = function () {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { x = function () {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { \'x\' = function () {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { \'x\' = function () {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { #x = function () {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { #x = function () {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [x] = function () {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [x] = function () {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [\'x\'] = function () {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [\'x\'] = function () {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { x = function x() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { x = function y() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { \'x\' = function x() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { \'x\' = function y() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { #x = function x() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { #x = function x() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { #x = function y() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { #x = function y() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [x] = function x() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [x] = function x() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [x] = function y() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [x] = function y() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [\'x\'] = function x() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [\'x\'] = function y() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { \'xy \' = function foo() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { \'xy \' = function xy() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [\'xy \'] = function foo() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [\'xy \'] = function xy() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { 1 = function x0() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { 1 = function x1() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [1] = function x0() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [1] = function x1() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [f()] = function g() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { [f()] = function f() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { static x = function x() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { static x = function y() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { x = (function y() {})(); }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { x = (function x() {})(); }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: '(class { x = function x() {}; })', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: '(class { x = function y() {}; })', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { #x; foo() { this.#x = function x() {}; } }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { #x; foo() { this.#x = function x() {}; } }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { #x; foo() { this.#x = function y() {}; } }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { #x; foo() { this.#x = function y() {}; } }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { #x; foo() { a.b.#x = function x() {}; } }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { #x; foo() { a.b.#x = function x() {}; } }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { #x; foo() { a.b.#x = function y() {}; } }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'class C { #x; foo() { a.b.#x = function y() {}; } }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + }, + { + code: 'var obj = { \'\\u1885\': function foo() {} };', // Not a valid identifier in es5 + languageOptions: { + ecmaVersion: 5, + sourceType: 'script', + }, + }, + ], + invalid: [ + { + code: 'let foo = function bar() {};', + options: ['always'], + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'matchVariable', + data: { funcName: 'bar', name: 'foo' }, + }, + ], + }, + { + code: 'let foo = function bar() {};', + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'matchVariable', + data: { funcName: 'bar', name: 'foo' }, + }, + ], + }, + { + code: 'foo = function bar() {};', + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'matchVariable', + data: { funcName: 'bar', name: 'foo' }, + }, + ], + }, + { + code: 'foo &&= function bar() {};', + languageOptions: { ecmaVersion: 2021 }, + errors: [ + { + messageId: 'matchVariable', + data: { funcName: 'bar', name: 'foo' }, + }, + ], + }, + { + code: 'obj.foo ||= function bar() {};', + languageOptions: { ecmaVersion: 2021 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'bar', name: 'foo' }, + }, + ], + }, + { + code: 'obj[\'foo\'] ??= function bar() {};', + languageOptions: { ecmaVersion: 2021 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'bar', name: 'foo' }, + }, + ], + }, + { + code: 'obj.foo = function bar() {};', + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'bar', name: 'foo' }, + }, + ], + }, + { + code: 'obj.bar.foo = function bar() {};', + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'bar', name: 'foo' }, + }, + ], + }, + { + code: 'obj[\'foo\'] = function bar() {};', + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'bar', name: 'foo' }, + }, + ], + }, + { + code: 'let obj = {foo: function bar() {}};', + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'bar', name: 'foo' }, + }, + ], + }, + { + code: 'let obj = {\'foo\': function bar() {}};', + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'bar', name: 'foo' }, + }, + ], + }, + { + code: '({[\'foo\']: function bar() {}})', + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'bar', name: 'foo' }, + }, + ], + }, + { + code: 'module.exports = function foo(name) {};', + options: [{ includeCommonJSModuleExports: true }], + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'foo', name: 'exports' }, + }, + ], + }, + { + code: 'module.exports = function foo(name) {};', + options: ['always', { includeCommonJSModuleExports: true }], + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'foo', name: 'exports' }, + }, + ], + }, + { + code: 'module.exports = function exports(name) {};', + options: ['never', { includeCommonJSModuleExports: true }], + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'exports', name: 'exports' }, + }, + ], + }, + { + code: 'module[\'exports\'] = function foo(name) {};', + options: [{ includeCommonJSModuleExports: true }], + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'foo', name: 'exports' }, + }, + ], + }, + { + code: 'module[\'exports\'] = function foo(name) {};', + options: ['always', { includeCommonJSModuleExports: true }], + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'foo', name: 'exports' }, + }, + ], + }, + { + code: 'module[\'exports\'] = function exports(name) {};', + options: ['never', { includeCommonJSModuleExports: true }], + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'exports', name: 'exports' }, + }, + ], + }, + { + code: 'var foo = function foo(name) {};', + options: ['never'], + errors: [ + { + messageId: 'notMatchVariable', + data: { funcName: 'foo', name: 'foo' }, + }, + ], + }, + { + code: 'obj.foo = function foo(name) {};', + options: ['never'], + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'foo', name: 'foo' }, + }, + ], + }, + { + code: 'Object.defineProperty(foo, \'bar\', { value: function baz() {} })', + options: ['always', { considerPropertyDescriptor: true }], + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'baz', name: 'bar' }, + }, + ], + }, + { + code: 'Object.defineProperties(foo, { bar: { value: function baz() {} } })', + options: ['always', { considerPropertyDescriptor: true }], + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'baz', name: 'bar' }, + }, + ], + }, + { + code: 'Object.create(proto, { bar: { value: function baz() {} } })', + options: ['always', { considerPropertyDescriptor: true }], + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'baz', name: 'bar' }, + }, + ], + }, + { + code: 'var obj = { value: function foo(name) {} }', + options: ['always', { considerPropertyDescriptor: true }], + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'foo', name: 'value' }, + }, + ], + }, + { + code: 'Object.defineProperty(foo, \'bar\', { value: function bar() {} })', + options: ['never', { considerPropertyDescriptor: true }], + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'bar', name: 'bar' }, + }, + ], + }, + { + code: 'Object.defineProperties(foo, { bar: { value: function bar() {} } })', + options: ['never', { considerPropertyDescriptor: true }], + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'bar', name: 'bar' }, + }, + ], + }, + { + code: 'Object.create(proto, { bar: { value: function bar() {} } })', + options: ['never', { considerPropertyDescriptor: true }], + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'bar', name: 'bar' }, + }, + ], + }, + { + code: 'Reflect.defineProperty(foo, \'bar\', { value: function baz() {} })', + options: ['always', { considerPropertyDescriptor: true }], + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'baz', name: 'bar' }, + }, + ], + }, + { + code: 'Reflect.defineProperty(foo, \'bar\', { value: function bar() {} })', + options: ['never', { considerPropertyDescriptor: true }], + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'bar', name: 'bar' }, + }, + ], + }, + // Tests for Node's primordials (ObjectDefineProperty, ObjectDefineProperties, ReflectDefineProperty) + { + code: 'ObjectDefineProperty(foo, \'bar\', { value: function baz() {} })', + options: ['always', { considerPropertyDescriptor: true }], + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'baz', name: 'bar' }, + }, + ], + }, + { + code: 'ReflectDefineProperty(foo, \'bar\', { value: function baz() {} })', + options: ['always', { considerPropertyDescriptor: true }], + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'baz', name: 'bar' }, + }, + ], + }, + { + code: 'ObjectDefineProperties(foo, { bar: { value: function baz() {} } })', + options: ['always', { considerPropertyDescriptor: true }], + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'baz', name: 'bar' }, + }, + ], + }, + { + code: 'foo({ value: function bar() {} })', + options: ['always', { considerPropertyDescriptor: true }], + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'bar', name: 'value' }, + }, + ], + }, + + // Optional chaining + { + code: '(obj?.aaa).foo = function bar() {};', + languageOptions: { ecmaVersion: 2020 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'bar', name: 'foo' }, + }, + ], + }, + { + code: 'Object?.defineProperty(foo, \'bar\', { value: function baz() {} })', + options: ['always', { considerPropertyDescriptor: true }], + languageOptions: { ecmaVersion: 2020 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'baz', name: 'bar' }, + }, + ], + }, + { + code: '(Object?.defineProperty)(foo, \'bar\', { value: function baz() {} })', + options: ['always', { considerPropertyDescriptor: true }], + languageOptions: { ecmaVersion: 2020 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'baz', name: 'bar' }, + }, + ], + }, + { + code: 'Object?.defineProperty(foo, \'bar\', { value: function bar() {} })', + options: ['never', { considerPropertyDescriptor: true }], + languageOptions: { ecmaVersion: 2020 }, + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'bar', name: 'bar' }, + }, + ], + }, + { + code: '(Object?.defineProperty)(foo, \'bar\', { value: function bar() {} })', + options: ['never', { considerPropertyDescriptor: true }], + languageOptions: { ecmaVersion: 2020 }, + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'bar', name: 'bar' }, + }, + ], + }, + { + code: 'Object?.defineProperties(foo, { bar: { value: function baz() {} } })', + options: ['always', { considerPropertyDescriptor: true }], + languageOptions: { ecmaVersion: 2020 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'baz', name: 'bar' }, + }, + ], + }, + { + code: '(Object?.defineProperties)(foo, { bar: { value: function baz() {} } })', + options: ['always', { considerPropertyDescriptor: true }], + languageOptions: { ecmaVersion: 2020 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'baz', name: 'bar' }, + }, + ], + }, + { + code: 'Object?.defineProperties(foo, { bar: { value: function bar() {} } })', + options: ['never', { considerPropertyDescriptor: true }], + languageOptions: { ecmaVersion: 2020 }, + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'bar', name: 'bar' }, + }, + ], + }, + { + code: '(Object?.defineProperties)(foo, { bar: { value: function bar() {} } })', + options: ['never', { considerPropertyDescriptor: true }], + languageOptions: { ecmaVersion: 2020 }, + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'bar', name: 'bar' }, + }, + ], + }, + + // class fields + { + code: 'class C { x = function y() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'y', name: 'x' }, + }, + ], + }, + { + code: 'class C { x = function x() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'x', name: 'x' }, + }, + ], + }, + { + code: 'class C { \'x\' = function y() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'y', name: 'x' }, + }, + ], + }, + { + code: 'class C { \'x\' = function x() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'x', name: 'x' }, + }, + ], + }, + { + code: 'class C { [\'x\'] = function y() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'y', name: 'x' }, + }, + ], + }, + { + code: 'class C { [\'x\'] = function x() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'x', name: 'x' }, + }, + ], + }, + { + code: 'class C { static x = function y() {}; }', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'y', name: 'x' }, + }, + ], + }, + { + code: 'class C { static x = function x() {}; }', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'x', name: 'x' }, + }, + ], + }, + { + code: '(class { x = function y() {}; })', + options: ['always'], + languageOptions: { ecmaVersion: 2022 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'y', name: 'x' }, + }, + ], + }, + { + code: '(class { x = function x() {}; })', + options: ['never'], + languageOptions: { ecmaVersion: 2022 }, + errors: [ + { + messageId: 'notMatchProperty', + data: { funcName: 'x', name: 'x' }, + }, + ], + }, + { + code: 'var obj = { \'\\u1885\': function foo() {} };', // Valid identifier in es2015 + languageOptions: { ecmaVersion: 6 }, + errors: [ + { + messageId: 'matchProperty', + data: { funcName: 'foo', name: '\u1885' }, + }, + ], + }, + ], +}); diff --git a/test/parallel/test-eslint-prefer-abort-signal-abort.js b/test/parallel/test-eslint-prefer-abort-signal-abort.js new file mode 100644 index 000000000000..954d7df83dab --- /dev/null +++ b/test/parallel/test-eslint-prefer-abort-signal-abort.js @@ -0,0 +1,118 @@ +'use strict'; + +const common = require('../common'); +if ((!common.hasCrypto) || (!common.hasIntl)) { + common.skip('ESLint tests require crypto and Intl'); +} + +common.skipIfEslintMissing(); + +const RuleTester = require('../../tools/eslint/node_modules/eslint').RuleTester; +const rule = require('../../tools/eslint-rules/prefer-abort-signal-abort'); + +const message = 'Use AbortSignal.abort() instead of creating and aborting an AbortController.'; + +new RuleTester().run('prefer-abort-signal-abort', rule, { + valid: [ + 'const signal = AbortSignal.abort();', + ` + const controller = new AbortController(); + controller.abort(); + controller.abort(); + fn(controller.signal); + `, + ` + const controller = new AbortController(); + controller.abort(); + console.log(controller); + fn(controller.signal); + `, + ` + const controller = new AbortController(); + // This comment should not be removed. + controller.abort(); + fn(controller.signal); + `, + ` + const controller = new AbortController(); + setImmediate(() => controller.abort()); + fn(controller.signal); + `, + ` + const controller = new AbortController(); + controller.abort('reason', 'extra'); + fn(controller.signal); + `, + ], + invalid: [ + { + code: ` + const controller = new AbortController(); + controller.abort(); + fn(controller.signal); + `, + errors: [{ message }], + output: ` + fn(AbortSignal.abort()); + `, + }, + { + code: ` + const abortController = new AbortController(); + abortController.abort(new Error('aborted')); + fn({ signal: abortController.signal }); + `, + errors: [{ message }], + output: ` + fn({ signal: AbortSignal.abort(new Error('aborted')) }); + `, + }, + { + code: ` + { + const ac = new AbortController(); + ac.abort(); + await wait({ signal: ac.signal }); + } + `, + errors: [{ message }], + output: ` + { + await wait({ signal: AbortSignal.abort() }); + } + `, + }, + { + code: ` + { + const controller = new AbortController(); + controller.abort(); + fn(controller.signal, controller.signal); + } + `, + errors: [{ message }], + output: ` + { + const controller = AbortSignal.abort(); + fn(controller, controller); + } + `, + }, + { + code: ` + { + const controller = new AbortController(); + controller.abort("reason"); + fn(controller.signal, controller.signal); + } + `, + errors: [{ message }], + output: ` + { + const controller = AbortSignal.abort("reason"); + fn(controller, controller); + } + `, + }, + ] +}); diff --git a/test/parallel/test-event-emitter-remove-listeners.js b/test/parallel/test-event-emitter-remove-listeners.js index 7b94d31f45d2..e9e4a74a5b63 100644 --- a/test/parallel/test-event-emitter-remove-listeners.js +++ b/test/parallel/test-event-emitter-remove-listeners.js @@ -144,6 +144,19 @@ function listener2() {} assert.deepStrictEqual(ee, ee.removeListener('foo', () => {})); } +{ + const ee = new EventEmitter(); + ee.on('persistent', listener1); + + for (let i = 0; i < 100; i++) { + const eventName = `event-${i}`; + ee.on(eventName, listener2); + ee.removeListener(eventName, listener2); + } + + assert.deepStrictEqual(Reflect.ownKeys(ee._events), ['persistent']); +} + { const ee = new EventEmitter(); const listener = () => {}; diff --git a/test/parallel/test-fs-cp-async-socket.mjs b/test/parallel/test-fs-cp-async-socket.mjs index 4ebc56cc3f66..f2010e6b3fe3 100644 --- a/test/parallel/test-fs-cp-async-socket.mjs +++ b/test/parallel/test-fs-cp-async-socket.mjs @@ -15,7 +15,7 @@ if (isWindows) { // See https://github.com/nodejs/node/pull/48409 if (common.isInsideDirWithUnusualChars) { - common.skip('Test is borken in directories with unusual characters'); + common.skip('Test is broken in directories with unusual characters'); } tmpdir.refresh(); diff --git a/test/parallel/test-fs-cp-sync-copy-directory-to-file-error.mjs b/test/parallel/test-fs-cp-sync-copy-directory-to-file-error.mjs index 04388f3166b8..2b50a415d00b 100644 --- a/test/parallel/test-fs-cp-sync-copy-directory-to-file-error.mjs +++ b/test/parallel/test-fs-cp-sync-copy-directory-to-file-error.mjs @@ -8,7 +8,7 @@ import fixtures from '../common/fixtures.js'; // See https://github.com/nodejs/node/pull/48409 if (isInsideDirWithUnusualChars) { - skip('Test is borken in directories with unusual characters'); + skip('Test is broken in directories with unusual characters'); } tmpdir.refresh(); diff --git a/test/parallel/test-fs-cp-sync-copy-file-to-directory-error.mjs b/test/parallel/test-fs-cp-sync-copy-file-to-directory-error.mjs index 96e1fa3b4e2a..883f16db2a32 100644 --- a/test/parallel/test-fs-cp-sync-copy-file-to-directory-error.mjs +++ b/test/parallel/test-fs-cp-sync-copy-file-to-directory-error.mjs @@ -10,7 +10,7 @@ tmpdir.refresh(); // See https://github.com/nodejs/node/pull/48409 if (isInsideDirWithUnusualChars) { - skip('Test is borken in directories with unusual characters'); + skip('Test is broken in directories with unusual characters'); } const src = fixtures.path('copy/kitchen-sink/README.md'); diff --git a/test/parallel/test-fs-cp-sync-copy-socket-error.mjs b/test/parallel/test-fs-cp-sync-copy-socket-error.mjs index 81a06cc224ae..dae8786a78df 100644 --- a/test/parallel/test-fs-cp-sync-copy-socket-error.mjs +++ b/test/parallel/test-fs-cp-sync-copy-socket-error.mjs @@ -14,7 +14,7 @@ if (isWindows) { // See https://github.com/nodejs/node/pull/48409 if (common.isInsideDirWithUnusualChars) { - common.skip('Test is borken in directories with unusual characters'); + common.skip('Test is broken in directories with unusual characters'); } tmpdir.refresh(); diff --git a/test/parallel/test-fs-cp-sync-parent-symlink-dest-points-to-src-error.mjs b/test/parallel/test-fs-cp-sync-parent-symlink-dest-points-to-src-error.mjs index 52feaf812016..441de0e9d848 100644 --- a/test/parallel/test-fs-cp-sync-parent-symlink-dest-points-to-src-error.mjs +++ b/test/parallel/test-fs-cp-sync-parent-symlink-dest-points-to-src-error.mjs @@ -10,7 +10,7 @@ tmpdir.refresh(); // See https://github.com/nodejs/node/pull/48409 if (isInsideDirWithUnusualChars) { - skip('Test is borken in directories with unusual characters'); + skip('Test is broken in directories with unusual characters'); } const src = nextdir(); diff --git a/test/parallel/test-fs-cp-sync-src-parent-of-dest-error.mjs b/test/parallel/test-fs-cp-sync-src-parent-of-dest-error.mjs index 55e4c7014b74..12f00812a00b 100644 --- a/test/parallel/test-fs-cp-sync-src-parent-of-dest-error.mjs +++ b/test/parallel/test-fs-cp-sync-src-parent-of-dest-error.mjs @@ -10,7 +10,7 @@ tmpdir.refresh(); // See https://github.com/nodejs/node/pull/48409 if (isInsideDirWithUnusualChars) { - skip('Test is borken in directories with unusual characters'); + skip('Test is broken in directories with unusual characters'); } const src = nextdir('a', tmpdir); diff --git a/test/parallel/test-fs-glob.mjs b/test/parallel/test-fs-glob.mjs index 560b4e72e4ad..bd95bce7d0e3 100644 --- a/test/parallel/test-fs-glob.mjs +++ b/test/parallel/test-fs-glob.mjs @@ -393,7 +393,7 @@ describe('fsPromises.glob - with file: URL as cwd', function() { const normalizeDirent = (dirent) => relative(fixtureDir, join(dirent.parentPath, dirent.name)); // The call to `join()` with only one argument is important, as -// it ensures that the proper path seperators are applied. +// it ensures that the proper path separators are applied. const normalizePath = (path) => (isAbsolute(path) ? relative(fixtureDir, path) : join(path)); describe('glob - withFileTypes', function() { diff --git a/test/parallel/test-fs-promises-appendfile.js b/test/parallel/test-fs-promises-appendfile.js new file mode 100644 index 000000000000..04a3e4ac9072 --- /dev/null +++ b/test/parallel/test-fs-promises-appendfile.js @@ -0,0 +1,191 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const fsPromises = fs.promises; +const path = require('path'); +const tmpdir = require('../common/tmpdir'); +const assert = require('assert'); +const tmpDir = tmpdir.path; +const { Readable } = require('stream'); + +tmpdir.refresh(); + +const buffer = Buffer.from('abc'.repeat(1000)); +const stream = Readable.from(['a', 'b', 'c']); +const stream2 = Readable.from(['ümlaut', ' ', 'sechzig']); +const iterable = { + expected: 'abc', + *[Symbol.iterator]() { + yield 'a'; + yield 'b'; + yield 'c'; + } +}; + +const veryLargeIterable = { + expected: 'dogs running'.repeat(512 * 1024), + *[Symbol.iterator]() { + yield Buffer.from('dogs running'.repeat(512 * 1024), 'utf8'); + } +}; + +function iterableWith(value) { + return { + *[Symbol.iterator]() { + yield value; + } + }; +} +const bufferIterable = { + expected: 'abc', + *[Symbol.iterator]() { + yield Buffer.from('a'); + yield Buffer.from('b'); + yield Buffer.from('c'); + } +}; +const asyncIterable = { + expected: 'abc', + async* [Symbol.asyncIterator]() { + yield 'a'; + yield 'b'; + yield 'c'; + } +}; + +let counter = 0; + +async function doAppendString() { + const string = 'x~yz'.repeat(100); + const dest = path.resolve(tmpDir, `tmp-${counter++}.txt`); + await fsPromises.appendFile(dest, string); + const data = fs.readFileSync(dest); + const stringAsBuffer = Buffer.from(string, 'utf8'); + assert.deepStrictEqual(stringAsBuffer, data); +} + +async function doAppendBuffer() { + const dest = path.resolve(tmpDir, `tmp-${counter++}.txt`); + await fsPromises.appendFile(dest, buffer); + const data = fs.readFileSync(dest); + assert.deepStrictEqual(data, buffer); +} + +async function doAppendStream() { + const dest = path.resolve(tmpDir, `tmp-${counter++}.txt`); + await fsPromises.appendFile(dest, stream); + const expected = 'abc'; + const data = fs.readFileSync(dest, 'utf-8'); + assert.deepStrictEqual(data, expected); +} + +async function doAppendStreamWithCancel() { + const dest = path.resolve(tmpDir, `tmp-${counter++}.txt`); + const controller = new AbortController(); + const { signal } = controller; + process.nextTick(() => controller.abort()); + await assert.rejects( + fsPromises.appendFile(dest, stream, { signal }), + { name: 'AbortError' } + ); +} + +async function doAppendIterable() { + const dest = path.resolve(tmpDir, `tmp-${counter++}.txt`); + await fsPromises.appendFile(dest, iterable); + const data = fs.readFileSync(dest, 'utf-8'); + assert.deepStrictEqual(data, iterable.expected); +} + +async function doAppendInvalidIterable() { + const dest = path.resolve(tmpDir, `tmp-${counter++}.txt`); + await Promise.all( + [42, 42n, {}, Symbol('42'), true, undefined, null, NaN].map((value) => + assert.rejects(fsPromises.appendFile(dest, iterableWith(value)), { + code: 'ERR_INVALID_ARG_TYPE', + }) + ) + ); +} + +async function doAppendIterableWithEncoding() { + const dest = path.resolve(tmpDir, `tmp-${counter++}.txt`); + await fsPromises.appendFile(dest, stream2, 'latin1'); + const expected = 'ümlaut sechzig'; + const data = fs.readFileSync(dest, 'latin1'); + assert.deepStrictEqual(data, expected); +} + +async function doAppendBufferIterable() { + const dest = path.resolve(tmpDir, `tmp-${counter++}.txt`); + await fsPromises.appendFile(dest, bufferIterable); + const data = fs.readFileSync(dest, 'utf-8'); + assert.deepStrictEqual(data, bufferIterable.expected); +} + +async function doAppendAsyncIterable() { + const dest = path.resolve(tmpDir, `tmp-${counter++}.txt`); + await fsPromises.appendFile(dest, asyncIterable); + const data = fs.readFileSync(dest, 'utf-8'); + assert.deepStrictEqual(data, asyncIterable.expected); +} + +async function doAppendLargeIterable() { + const dest = path.resolve(tmpDir, `tmp-${counter++}.txt`); + await fsPromises.appendFile(dest, veryLargeIterable); + const data = fs.readFileSync(dest, 'utf-8'); + assert.deepStrictEqual(data, veryLargeIterable.expected); +} + +async function doAppendInvalidValues() { + const dest = path.resolve(tmpDir, `tmp-${counter++}.txt`); + await Promise.all( + [42, 42n, {}, Symbol('42'), true, undefined, null, NaN].map((value) => + assert.rejects(fsPromises.appendFile(dest, value), { + code: 'ERR_INVALID_ARG_TYPE', + }) + ) + ); +} + +async function doAppendBufferAndCancel() { + const dest = path.resolve(tmpDir, `tmp-${counter++}.txt`); + const controller = new AbortController(); + const { signal } = controller; + process.nextTick(() => controller.abort()); + await assert.rejects( + fsPromises.appendFile(dest, buffer, { signal }), + { name: 'AbortError' } + ); +} + +async function doAppendTypedArrays() { + for (const Constructor of [Uint8Array, Uint16Array, Uint32Array]) { + const dest = path.resolve(tmpDir, `tmp-${counter++}.txt`); + + // Use a file size larger than `kReadFileMaxChunkSize`. + const buffer = Buffer.from('012'.repeat(2 ** 14)); + + const array = new Constructor(buffer.buffer); + await fsPromises.appendFile(dest, array); + const data = await fsPromises.readFile(dest); + assert.deepStrictEqual(data, buffer); + } +} + +(async () => { + await doAppendBuffer(); + await doAppendBufferAndCancel(); + await doAppendString(); + await doAppendStream(); + await doAppendStreamWithCancel(); + await doAppendIterable(); + await doAppendInvalidIterable(); + await doAppendIterableWithEncoding(); + await doAppendBufferIterable(); + await doAppendAsyncIterable(); + await doAppendLargeIterable(); + await doAppendInvalidValues(); + await doAppendTypedArrays(); +})().then(common.mustCall()); diff --git a/test/parallel/test-fs-promises-file-handle-append-file.js b/test/parallel/test-fs-promises-file-handle-append-file.js index 42b6dbee309c..4c476a6c36ca 100644 --- a/test/parallel/test-fs-promises-file-handle-append-file.js +++ b/test/parallel/test-fs-promises-file-handle-append-file.js @@ -8,52 +8,256 @@ const common = require('../common'); const fs = require('fs'); const { open } = fs.promises; const path = require('path'); +const { Readable } = require('stream'); const tmpdir = require('../common/tmpdir'); const assert = require('assert'); const tmpDir = tmpdir.path; tmpdir.refresh(); -async function validateAppendBuffer() { - const filePath = path.resolve(tmpDir, 'tmp-append-file-buffer.txt'); +const stream = Readable.from(['a', 'b', 'c']); +const stream2 = Readable.from(['ümlaut', ' ', 'sechzig']); +const iterable = { + expected: 'abc', + *[Symbol.iterator]() { + yield 'a'; + yield 'b'; + yield 'c'; + } +}; +function iterableWith(value) { + return { + *[Symbol.iterator]() { + yield value; + } + }; +} +const bufferIterable = { + expected: 'abc', + *[Symbol.iterator]() { + yield Buffer.from('a'); + yield Buffer.from('b'); + yield Buffer.from('c'); + } +}; +const asyncIterable = { + expected: 'abc', + async* [Symbol.asyncIterator]() { + yield 'a'; + yield 'b'; + yield 'c'; + } +}; +const veryLargeIterable = { + expected: 'dogs running'.repeat(512 * 1024), + *[Symbol.iterator]() { + yield Buffer.from('dogs running'.repeat(512 * 1024), 'utf8'); + } +}; + +let counter = 0; + +async function doAppendBuffer() { + const filePath = path.resolve(tmpDir, `tmp-${counter++}.txt`); const fileHandle = await open(filePath, 'a'); - const buffer = Buffer.from('a&Dp'.repeat(100), 'utf8'); + try { + const buffer = Buffer.from('a&Dp'.repeat(100), 'utf8'); - await fileHandle.appendFile(buffer); - const appendedFileData = fs.readFileSync(filePath); - assert.deepStrictEqual(appendedFileData, buffer); + await fileHandle.appendFile(buffer); + const appendedFileData = fs.readFileSync(filePath); + assert.deepStrictEqual(appendedFileData, buffer); - await fileHandle.close(); + } finally { + await fileHandle.close(); + } } -async function validateAppendString() { - const filePath = path.resolve(tmpDir, 'tmp-append-file-string.txt'); +async function doAppendString() { + const filePath = path.resolve(tmpDir, `tmp-${counter++}.txt`); const fileHandle = await open(filePath, 'a'); - const string = 'x~yz'.repeat(100); + try { + const string = 'x~yz'.repeat(100); - await fileHandle.appendFile(string); - const stringAsBuffer = Buffer.from(string, 'utf8'); - const appendedFileData = fs.readFileSync(filePath); - assert.deepStrictEqual(appendedFileData, stringAsBuffer); + await fileHandle.appendFile(string); + const stringAsBuffer = Buffer.from(string, 'utf8'); + const appendedFileData = fs.readFileSync(filePath); + assert.deepStrictEqual(appendedFileData, stringAsBuffer); + + } finally { + await fileHandle.close(); + } +} - await fileHandle.close(); +async function doAppendBufferAndCancel() { + const filePath = path.resolve(tmpDir, `tmp-${counter++}.txt`); + const fileHandle = await open(filePath, 'a'); + try { + const buffer = Buffer.from('dogs running'.repeat(512 * 1024), 'utf8'); + const controller = new AbortController(); + const { signal } = controller; + process.nextTick(() => controller.abort()); + await assert.rejects(fileHandle.appendFile(buffer, { signal }), { + name: 'AbortError' + }); + } finally { + await fileHandle.close(); + } +} + +async function doAppendStream() { + const filePath = path.resolve(tmpDir, `tmp-${counter++}.txt`); + const fileHandle = await open(filePath, 'a'); + try { + await fileHandle.appendFile(stream); + const expected = 'abc'; + const data = fs.readFileSync(filePath, 'utf-8'); + assert.deepStrictEqual(data, expected); + } finally { + await fileHandle.close(); + } } -async function doAppendAndCancel() { - const filePathForHandle = path.resolve(tmpDir, 'dogs-running.txt'); - const fileHandle = await open(filePathForHandle, 'w+'); - const buffer = Buffer.from('dogs running'.repeat(512 * 1024), 'utf8'); +async function doAppendStreamWithCancel() { const controller = new AbortController(); const { signal } = controller; process.nextTick(() => controller.abort()); - await assert.rejects(fileHandle.appendFile(buffer, { signal }), { - name: 'AbortError' - }); - await fileHandle.close(); + const filePath = path.resolve(tmpDir, `tmp-${counter++}.txt`); + const fileHandle = await open(filePath, 'a'); + try { + await assert.rejects( + fileHandle.appendFile(stream, { signal }), + { name: 'AbortError' } + ); + } finally { + await fileHandle.close(); + } +} + +async function doAppendIterable() { + const filePath = path.resolve(tmpDir, `tmp-${counter++}.txt`); + const fileHandle = await open(filePath, 'a'); + try { + await fileHandle.appendFile(iterable); + const data = fs.readFileSync(filePath, 'utf-8'); + assert.deepStrictEqual(data, iterable.expected); + } finally { + await fileHandle.close(); + } +} + +async function doAppendInvalidIterable() { + const filePath = path.resolve(tmpDir, `tmp-${counter++}.txt`); + const fileHandle = await open(filePath, 'a'); + try { + await Promise.all( + [42, 42n, {}, Symbol('42'), true, undefined, null, NaN].map((value) => + assert.rejects( + fileHandle.appendFile(iterableWith(value)), + { code: 'ERR_INVALID_ARG_TYPE' } + ) + ) + ); + } finally { + await fileHandle.close(); + } +} + +async function doAppendIterableWithEncoding() { + const filePath = path.resolve(tmpDir, `tmp-${counter++}.txt`); + const fileHandle = await open(filePath, 'a'); + try { + await fileHandle.appendFile(stream2, 'latin1'); + const expected = 'ümlaut sechzig'; + const data = fs.readFileSync(filePath, 'latin1'); + assert.deepStrictEqual(data, expected); + } finally { + await fileHandle.close(); + } +} + +async function doAppendBufferIterable() { + const filePath = path.resolve(tmpDir, `tmp-${counter++}.txt`); + const fileHandle = await open(filePath, 'a'); + try { + await fileHandle.appendFile(bufferIterable); + const data = fs.readFileSync(filePath, 'utf-8'); + assert.deepStrictEqual(data, bufferIterable.expected); + } finally { + await fileHandle.close(); + } +} + +async function doAppendAsyncIterable() { + const filePath = path.resolve(tmpDir, `tmp-${counter++}.txt`); + const fileHandle = await open(filePath, 'a'); + try { + await fileHandle.appendFile(asyncIterable); + const data = fs.readFileSync(filePath, 'utf-8'); + assert.deepStrictEqual(data, asyncIterable.expected); + } finally { + await fileHandle.close(); + } +} + +async function doAppendLargeIterable() { + const filePath = path.resolve(tmpDir, `tmp-${counter++}.txt`); + const fileHandle = await open(filePath, 'a'); + try { + await fileHandle.appendFile(veryLargeIterable); + const data = fs.readFileSync(filePath, 'utf-8'); + assert.deepStrictEqual(data, veryLargeIterable.expected); + } finally { + await fileHandle.close(); + } +} + +async function doAppendInvalidValues() { + const filePath = path.resolve(tmpDir, `tmp-${counter++}.txt`); + const fileHandle = await open(filePath, 'a'); + try { + await Promise.all( + [42, 42n, {}, Symbol('42'), true, undefined, null, NaN].map((value) => + assert.rejects( + fileHandle.appendFile(value), + { code: 'ERR_INVALID_ARG_TYPE' } + ) + ) + ); + } finally { + await fileHandle.close(); + } +} + +async function doAppendTypedArrays() { + for (const Constructor of [Uint8Array, Uint16Array, Uint32Array]) { + // Use a file size larger than `kReadFileMaxChunkSize`. + const buffer = Buffer.from('012'.repeat(2 ** 14)); + const array = new Constructor(buffer.buffer); + const filePath = path.resolve(tmpDir, `tmp-${counter++}.txt`); + const fileHandle = await open(filePath, 'a'); + + try { + await fileHandle.writeFile(array); + const data = fs.readFileSync(filePath); + assert.deepStrictEqual(data, buffer); + } finally { + await fileHandle.close(); + } + } } -Promise.all([ - validateAppendBuffer(), - validateAppendString(), - doAppendAndCancel(), -]).then(common.mustCall()); +(async () => { + await doAppendBuffer(); + await doAppendBufferAndCancel(); + await doAppendString(); + await doAppendStream(); + await doAppendStreamWithCancel(); + await doAppendIterable(); + await doAppendInvalidIterable(); + await doAppendIterableWithEncoding(); + await doAppendBufferIterable(); + await doAppendAsyncIterable(); + await doAppendLargeIterable(); + await doAppendInvalidValues(); + await doAppendTypedArrays(); +})().then(common.mustCall()); diff --git a/test/parallel/test-fs-promises-file-handle-pull.js b/test/parallel/test-fs-promises-file-handle-pull.js new file mode 100644 index 000000000000..3fc531baf713 --- /dev/null +++ b/test/parallel/test-fs-promises-file-handle-pull.js @@ -0,0 +1,440 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const fs = require('fs'); +const { open } = fs.promises; +const path = require('path'); +const tmpdir = require('../common/tmpdir'); +const { text, bytes } = require('stream/iter'); + +tmpdir.refresh(); + +const tmpDir = tmpdir.path; + +// ============================================================================= +// Basic pull() +// ============================================================================= + +async function testBasicPull() { + const filePath = path.join(tmpDir, 'pull-basic.txt'); + fs.writeFileSync(filePath, 'hello from file'); + + const fh = await open(filePath, 'r'); + try { + const readable = fh.pull(); + const data = await text(readable); + assert.strictEqual(data, 'hello from file'); + } finally { + await fh.close(); + } +} + +async function testPullBinary() { + const filePath = path.join(tmpDir, 'pull-binary.bin'); + const buf = Buffer.alloc(256); + for (let i = 0; i < 256; i++) buf[i] = i; + fs.writeFileSync(filePath, buf); + + const fh = await open(filePath, 'r'); + try { + const readable = fh.pull(); + const data = await bytes(readable); + assert.strictEqual(data.byteLength, 256); + for (let i = 0; i < 256; i++) { + assert.strictEqual(data[i], i); + } + } finally { + await fh.close(); + } +} + +async function testPullEmptyFile() { + const filePath = path.join(tmpDir, 'pull-empty.txt'); + fs.writeFileSync(filePath, ''); + + const fh = await open(filePath, 'r'); + try { + const readable = fh.pull(); + const data = await bytes(readable); + assert.strictEqual(data.byteLength, 0); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// Large file (multi-chunk) +// ============================================================================= + +async function testPullLargeFile() { + const filePath = path.join(tmpDir, 'pull-large.bin'); + // Write 64KB - enough for multiple 16KB read chunks + const size = 64 * 1024; + const buf = Buffer.alloc(size, 0x42); + fs.writeFileSync(filePath, buf); + + const fh = await open(filePath, 'r'); + try { + const readable = fh.pull(); + const data = await bytes(readable); + assert.strictEqual(data.byteLength, size); + // Verify content + for (let i = 0; i < data.byteLength; i++) { + assert.strictEqual(data[i], 0x42); + } + } finally { + await fh.close(); + } +} + +// ============================================================================= +// With transforms +// ============================================================================= + +async function testPullWithTransform() { + const filePath = path.join(tmpDir, 'pull-transform.txt'); + fs.writeFileSync(filePath, 'hello'); + + const fh = await open(filePath, 'r'); + try { + const upper = (chunks) => { + if (chunks === null) return null; + return chunks.map((c) => { + const str = new TextDecoder().decode(c); + return new TextEncoder().encode(str.toUpperCase()); + }); + }; + + const readable = fh.pull(upper); + const data = await text(readable); + assert.strictEqual(data, 'HELLO'); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// autoClose option +// ============================================================================= + +async function testPullAutoClose() { + const filePath = path.join(tmpDir, 'pull-autoclose.txt'); + fs.writeFileSync(filePath, 'auto close data'); + + const fh = await open(filePath, 'r'); + const readable = fh.pull({ autoClose: true }); + const data = await text(readable); + assert.strictEqual(data, 'auto close data'); + + // After consuming with autoClose, the file handle should be closed + // Trying to read again should throw + await assert.rejects( + async () => { + await fh.stat(); + }, + (err) => err.code === 'ERR_INVALID_STATE' || err.code === 'EBADF', + ); +} + +// ============================================================================= +// Locking +// ============================================================================= + +async function testPullLocking() { + const filePath = path.join(tmpDir, 'pull-lock.txt'); + fs.writeFileSync(filePath, 'lock data'); + + const fh = await open(filePath, 'r'); + try { + // First pull locks the handle + const readable = fh.pull(); + + // Second pull while locked should throw + assert.throws( + () => fh.pull(), + { code: 'ERR_INVALID_STATE' }, + ); + + // Consume the first stream to unlock + await text(readable); + + // Now it should be usable again + const readable2 = fh.pull(); + const data = await text(readable2); + assert.strictEqual(data, ''); // Already read to end + } finally { + await fh.close(); + } +} + +// ============================================================================= +// Closed handle +// ============================================================================= + +async function testPullClosedHandle() { + const filePath = path.join(tmpDir, 'pull-closed.txt'); + fs.writeFileSync(filePath, 'data'); + + const fh = await open(filePath, 'r'); + await fh.close(); + + assert.throws( + () => fh.pull(), + { code: 'ERR_INVALID_STATE' }, + ); +} + +// ============================================================================= +// AbortSignal +// ============================================================================= + +async function testPullAbortSignal() { + const filePath = path.join(tmpDir, 'pull-abort.txt'); + // Write enough data that we can abort mid-stream + fs.writeFileSync(filePath, 'a'.repeat(1024)); + + const ac = new AbortController(); + const fh = await open(filePath, 'r'); + try { + ac.abort(); + const readable = fh.pull({ signal: ac.signal }); + + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { + assert.fail('Should not reach here'); + } + }, + (err) => err.name === 'AbortError', + ); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// Iterate batches directly +// ============================================================================= + +async function testPullIterateBatches() { + const filePath = path.join(tmpDir, 'pull-batches.txt'); + fs.writeFileSync(filePath, 'batch data'); + + const fh = await open(filePath, 'r'); + try { + const readable = fh.pull(); + const batches = []; + for await (const batch of readable) { + batches.push(batch); + // Each batch should be an array of Uint8Array + assert.ok(Array.isArray(batch)); + for (const chunk of batch) { + assert.ok(chunk instanceof Uint8Array); + } + } + assert.ok(batches.length > 0); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pull() with start option - read from specific position +// ============================================================================= + +async function testPullStart() { + const filePath = path.join(tmpDir, 'pull-start.txt'); + fs.writeFileSync(filePath, 'AAABBBCCC'); + + const fh = await open(filePath, 'r'); + try { + // Read from offset 3 + const data = await text(fh.pull({ start: 3 })); + assert.strictEqual(data, 'BBBCCC'); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pull() with limit option - read at most N bytes +// ============================================================================= + +async function testPullLimit() { + const filePath = path.join(tmpDir, 'pull-limit.txt'); + fs.writeFileSync(filePath, 'Hello, World! Extra data here.'); + + const fh = await open(filePath, 'r'); + try { + const data = await text(fh.pull({ limit: 13 })); + assert.strictEqual(data, 'Hello, World!'); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pull() with start + limit - read a slice +// ============================================================================= + +async function testPullStartAndLimit() { + const filePath = path.join(tmpDir, 'pull-start-limit.txt'); + fs.writeFileSync(filePath, 'AAABBBCCCDDD'); + + const fh = await open(filePath, 'r'); + try { + // Read 3 bytes starting at offset 3 + const data = await text(fh.pull({ start: 3, limit: 3 })); + assert.strictEqual(data, 'BBB'); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pull() with limit larger than file - reads whole file +// ============================================================================= + +async function testPullLimitLargerThanFile() { + const filePath = path.join(tmpDir, 'pull-limit-large.txt'); + fs.writeFileSync(filePath, 'short'); + + const fh = await open(filePath, 'r'); + try { + const data = await text(fh.pull({ limit: 1000000 })); + assert.strictEqual(data, 'short'); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pull() with limit spanning multiple chunks +// ============================================================================= + +async function testPullLimitMultiChunk() { + const filePath = path.join(tmpDir, 'pull-limit-multi.bin'); + // 300KB file - spans multiple 128KB reads + const input = Buffer.alloc(300 * 1024, 'x'); + fs.writeFileSync(filePath, input); + + const fh = await open(filePath, 'r'); + try { + // Read exactly 200KB from offset 50KB + const data = await bytes(fh.pull({ start: 50 * 1024, limit: 200 * 1024 })); + assert.strictEqual(data.byteLength, 200 * 1024); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pull() with start + limit + transforms +// ============================================================================= + +async function testPullStartLimitWithTransforms() { + const filePath = path.join(tmpDir, 'pull-start-limit-transform.txt'); + fs.writeFileSync(filePath, 'aaabbbcccddd'); + + const fh = await open(filePath, 'r'); + try { + const { compressGzip, decompressGzip } = require('zlib/iter'); + const compressed = fh.pull(compressGzip(), { start: 3, limit: 6 }); + const decompressed = await text( + require('stream/iter').pull(compressed, decompressGzip())); + assert.strictEqual(decompressed, 'bbbccc'); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pull() with chunkSize option +// ============================================================================= + +async function testPullChunkSize() { + const filePath = path.join(tmpDir, 'pull-chunksize.bin'); + // Write 64KB of data + const input = Buffer.alloc(64 * 1024, 'z'); + fs.writeFileSync(filePath, input); + + const fh = await open(filePath, 'r'); + try { + // Use 16KB chunks - should produce 4 batches + let batchCount = 0; + for await (const batch of fh.pull({ chunkSize: 16 * 1024 })) { + batchCount++; + for (const chunk of batch) { + assert.ok(chunk.byteLength <= 16 * 1024, + `Chunk ${chunk.byteLength} should be <= 16384`); + } + } + assert.strictEqual(batchCount, 4); + } finally { + await fh.close(); + } +} + +async function testPullChunkSizeSmall() { + const filePath = path.join(tmpDir, 'pull-chunksize-small.txt'); + fs.writeFileSync(filePath, 'hello'); + + const fh = await open(filePath, 'r'); + try { + // 1-byte chunks + let totalBytes = 0; + let batchCount = 0; + for await (const batch of fh.pull({ chunkSize: 1 })) { + batchCount++; + for (const chunk of batch) totalBytes += chunk.byteLength; + } + assert.strictEqual(totalBytes, 5); + assert.strictEqual(batchCount, 5); + } finally { + await fh.close(); + } +} + +async function testPullSyncArgumentValidation() { + const filePath = path.join(tmpDir, 'pull-arg-validation.txt'); + fs.writeFileSync(filePath, 'data'); + + const fh = await open(filePath, 'r'); + try { + assert.throws(() => fh.pull({ autoClose: 'no' }), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => fh.pull({ start: 'a' }), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => fh.pull({ limit: 'a' }), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => fh.pull({ chunkSize: 'a' }), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => fh.pull({ signal: {} }), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => fh.pull({ start: 1.1 }), { code: 'ERR_OUT_OF_RANGE' }); + assert.throws(() => fh.pull({ limit: 1.1 }), { code: 'ERR_OUT_OF_RANGE' }); + assert.throws(() => fh.pull({ chunkSize: 1.1 }), { code: 'ERR_OUT_OF_RANGE' }); + } finally { + await fh.close(); + } +} + +Promise.all([ + testBasicPull(), + testPullBinary(), + testPullEmptyFile(), + testPullLargeFile(), + testPullWithTransform(), + testPullAutoClose(), + testPullLocking(), + testPullClosedHandle(), + testPullAbortSignal(), + testPullIterateBatches(), + testPullStart(), + testPullLimit(), + testPullStartAndLimit(), + testPullLimitLargerThanFile(), + testPullLimitMultiChunk(), + testPullStartLimitWithTransforms(), + testPullChunkSize(), + testPullChunkSizeSmall(), + testPullSyncArgumentValidation(), +]).then(common.mustCall()); diff --git a/test/parallel/test-fs-promises-file-handle-pullsync.js b/test/parallel/test-fs-promises-file-handle-pullsync.js new file mode 100644 index 000000000000..20c429972573 --- /dev/null +++ b/test/parallel/test-fs-promises-file-handle-pullsync.js @@ -0,0 +1,498 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const fs = require('fs'); +const { open } = fs.promises; +const path = require('path'); +const tmpdir = require('../common/tmpdir'); +const { + textSync, + bytesSync, + pipeToSync, + pullSync, +} = require('stream/iter'); +const { + compressGzipSync, + decompressGzipSync, +} = require('zlib/iter'); + +tmpdir.refresh(); + +const tmpDir = tmpdir.path; + +// ============================================================================= +// Basic pullSync() +// ============================================================================= + +async function testBasicPullSync() { + const filePath = path.join(tmpDir, 'pullsync-basic.txt'); + fs.writeFileSync(filePath, 'hello from sync file read'); + + const fh = await open(filePath, 'r'); + try { + const data = textSync(fh.pullSync()); + assert.strictEqual(data, 'hello from sync file read'); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// Large file (multi-chunk) +// ============================================================================= + +async function testLargeFile() { + const filePath = path.join(tmpDir, 'pullsync-large.txt'); + const input = 'sync large data test. '.repeat(10000); + fs.writeFileSync(filePath, input); + + const fh = await open(filePath, 'r'); + try { + const data = textSync(fh.pullSync()); + assert.strictEqual(data, input); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// Binary data round-trip +// ============================================================================= + +async function testBinaryData() { + const filePath = path.join(tmpDir, 'pullsync-binary.bin'); + const input = Buffer.alloc(200000); + for (let i = 0; i < input.length; i++) input[i] = i & 0xff; + fs.writeFileSync(filePath, input); + + const fh = await open(filePath, 'r'); + try { + const data = bytesSync(fh.pullSync()); + assert.deepStrictEqual(Buffer.from(data), input); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pullSync with sync compression transform round-trip +// ============================================================================= + +async function testPullSyncWithCompression() { + const filePath = path.join(tmpDir, 'pullsync-compress-src.txt'); + const dstPath = path.join(tmpDir, 'pullsync-compress-dst.gz'); + const input = 'compress via sync pullSync. '.repeat(1000); + fs.writeFileSync(filePath, input); + + // Compress: pullSync -> compressGzipSync -> write to file + const srcFh = await open(filePath, 'r'); + const dstFh = await open(dstPath, 'w'); + try { + const w = dstFh.writer(); + pipeToSync(srcFh.pullSync(compressGzipSync()), w); + } finally { + await srcFh.close(); + await dstFh.close(); + } + + // Verify compressed file is smaller + const compressedSize = fs.statSync(dstPath).size; + assert.ok(compressedSize < Buffer.byteLength(input), + `Compressed ${compressedSize} should be < original ` + + `${Buffer.byteLength(input)}`); + + // Decompress and verify + const readFh = await open(dstPath, 'r'); + try { + const result = textSync(readFh.pullSync(decompressGzipSync())); + assert.strictEqual(result, input); + } finally { + await readFh.close(); + } +} + +// ============================================================================= +// pullSync with stateless transform +// ============================================================================= + +async function testPullSyncWithStatelessTransform() { + const filePath = path.join(tmpDir, 'pullsync-upper.txt'); + fs.writeFileSync(filePath, 'hello world'); + + const upper = (chunks) => { + if (chunks === null) return null; + const out = new Array(chunks.length); + for (let j = 0; j < chunks.length; j++) { + const src = chunks[j]; + const buf = Buffer.allocUnsafe(src.length); + for (let i = 0; i < src.length; i++) { + const b = src[i]; + buf[i] = (b >= 0x61 && b <= 0x7a) ? b - 0x20 : b; + } + out[j] = buf; + } + return out; + }; + + const fh = await open(filePath, 'r'); + try { + const data = textSync(fh.pullSync(upper)); + assert.strictEqual(data, 'HELLO WORLD'); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pullSync with mixed stateless + stateful transforms +// ============================================================================= + +async function testPullSyncMixedTransforms() { + const filePath = path.join(tmpDir, 'pullsync-mixed.txt'); + const input = 'mixed transform test '.repeat(500); + fs.writeFileSync(filePath, input); + + const upper = (chunks) => { + if (chunks === null) return null; + const out = new Array(chunks.length); + for (let j = 0; j < chunks.length; j++) { + const src = chunks[j]; + const buf = Buffer.allocUnsafe(src.length); + for (let i = 0; i < src.length; i++) { + const b = src[i]; + buf[i] = (b >= 0x61 && b <= 0x7a) ? b - 0x20 : b; + } + out[j] = buf; + } + return out; + }; + + const fh = await open(filePath, 'r'); + try { + // Upper + compress + decompress + const data = textSync( + pullSync(fh.pullSync(upper, compressGzipSync()), decompressGzipSync()), + ); + assert.strictEqual(data, input.toUpperCase()); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// autoClose: true - handle closed after iteration completes +// ============================================================================= + +async function testAutoClose() { + const filePath = path.join(tmpDir, 'pullsync-autoclose.txt'); + fs.writeFileSync(filePath, 'auto close test'); + + const fh = await open(filePath, 'r'); + const data = textSync(fh.pullSync({ autoClose: true })); + assert.strictEqual(data, 'auto close test'); + + // Handle should be closed + await assert.rejects(fh.stat(), { code: 'EBADF' }); +} + +// ============================================================================= +// autoClose: true with early break +// ============================================================================= + +async function testAutoCloseEarlyBreak() { + const filePath = path.join(tmpDir, 'pullsync-autoclose-break.txt'); + fs.writeFileSync(filePath, 'x'.repeat(1000000)); + + const fh = await open(filePath, 'r'); + // eslint-disable-next-line no-unused-vars + for (const batch of fh.pullSync({ autoClose: true })) { + break; // Early exit + } + + // Handle should be closed by autoClose + await assert.rejects(fh.stat(), { code: 'EBADF' }); +} + +// ============================================================================= +// autoClose: false (default) - handle stays open +// ============================================================================= + +async function testNoAutoClose() { + const filePath = path.join(tmpDir, 'pullsync-no-autoclose.txt'); + fs.writeFileSync(filePath, 'still open'); + + const fh = await open(filePath, 'r'); + const data = textSync(fh.pullSync()); + assert.strictEqual(data, 'still open'); + + // Handle should still be open and reusable + const stat = await fh.stat(); + assert.ok(stat.size > 0); + await fh.close(); +} + +// ============================================================================= +// Lock semantics - pullSync locks the handle +// ============================================================================= + +async function testLocked() { + const filePath = path.join(tmpDir, 'pullsync-locked.txt'); + fs.writeFileSync(filePath, 'lock test'); + + const fh = await open(filePath, 'r'); + const iter = fh.pullSync()[Symbol.iterator](); + iter.next(); // Start iteration, handle is locked + + assert.throws(() => fh.pullSync(), { + code: 'ERR_INVALID_STATE', + }); + + assert.throws(() => fh.pull(), { + code: 'ERR_INVALID_STATE', + }); + + // Finish iteration to unlock + while (!iter.next().done) { /* drain */ } + await fh.close(); +} + +// ============================================================================= +// Empty file +// ============================================================================= + +async function testEmptyFile() { + const filePath = path.join(tmpDir, 'pullsync-empty.txt'); + fs.writeFileSync(filePath, ''); + + const fh = await open(filePath, 'r'); + try { + const data = textSync(fh.pullSync()); + assert.strictEqual(data, ''); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pipeToSync: file-to-file sync pipeline +// ============================================================================= + +async function testPipeToSync() { + const srcPath = path.join(tmpDir, 'pullsync-pipeto-src.txt'); + const dstPath = path.join(tmpDir, 'pullsync-pipeto-dst.txt'); + const input = 'pipeToSync test data '.repeat(200); + fs.writeFileSync(srcPath, input); + + const srcFh = await open(srcPath, 'r'); + const dstFh = await open(dstPath, 'w'); + try { + const w = dstFh.writer(); + pipeToSync(srcFh.pullSync(), w); + } finally { + await srcFh.close(); + await dstFh.close(); + } + + assert.strictEqual(fs.readFileSync(dstPath, 'utf8'), input); +} + +// ============================================================================= +// pullSync() with start option +// ============================================================================= + +async function testPullSyncStart() { + const filePath = path.join(tmpDir, 'pullsync-start.txt'); + fs.writeFileSync(filePath, 'AAABBBCCC'); + + const fh = await open(filePath, 'r'); + try { + const data = textSync(fh.pullSync({ start: 3 })); + assert.strictEqual(data, 'BBBCCC'); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pullSync() with limit option +// ============================================================================= + +async function testPullSyncLimit() { + const filePath = path.join(tmpDir, 'pullsync-limit.txt'); + fs.writeFileSync(filePath, 'Hello, World! Extra data here.'); + + const fh = await open(filePath, 'r'); + try { + const data = textSync(fh.pullSync({ limit: 13 })); + assert.strictEqual(data, 'Hello, World!'); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pullSync() with start + limit +// ============================================================================= + +async function testPullSyncStartAndLimit() { + const filePath = path.join(tmpDir, 'pullsync-start-limit.txt'); + fs.writeFileSync(filePath, 'AAABBBCCCDDD'); + + const fh = await open(filePath, 'r'); + try { + const data = textSync(fh.pullSync({ start: 3, limit: 3 })); + assert.strictEqual(data, 'BBB'); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pullSync() with limit spanning multiple chunks +// ============================================================================= + +async function testPullSyncLimitMultiChunk() { + const filePath = path.join(tmpDir, 'pullsync-limit-multi.bin'); + const input = Buffer.alloc(300 * 1024, 'x'); + fs.writeFileSync(filePath, input); + + const fh = await open(filePath, 'r'); + try { + const data = bytesSync(fh.pullSync({ start: 50 * 1024, limit: 200 * 1024 })); + assert.strictEqual(data.byteLength, 200 * 1024); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pullSync() with start + limit + compression transform +// ============================================================================= + +async function testPullSyncStartLimitWithTransforms() { + const filePath = path.join(tmpDir, 'pullsync-start-limit-transform.txt'); + fs.writeFileSync(filePath, 'aaabbbcccddd'); + + const fh = await open(filePath, 'r'); + try { + const compressed = fh.pullSync(compressGzipSync(), + { start: 3, limit: 6 }); + const decompressed = textSync(pullSync(compressed, decompressGzipSync())); + assert.strictEqual(decompressed, 'bbbccc'); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// pullSync() with start + autoClose +// ============================================================================= + +async function testPullSyncStartAutoClose() { + const filePath = path.join(tmpDir, 'pullsync-start-autoclose.txt'); + fs.writeFileSync(filePath, 'AAABBBCCC'); + + const fh = await open(filePath, 'r'); + const data = textSync(fh.pullSync({ start: 3, autoClose: true })); + assert.strictEqual(data, 'BBBCCC'); + + // Handle should be closed + await assert.rejects(fh.stat(), { code: 'EBADF' }); +} + +// ============================================================================= +// pullSync() with chunkSize option +// ============================================================================= + +async function testPullSyncChunkSize() { + const filePath = path.join(tmpDir, 'pullsync-chunksize.bin'); + const input = Buffer.alloc(64 * 1024, 'z'); + fs.writeFileSync(filePath, input); + + const fh = await open(filePath, 'r'); + try { + let batchCount = 0; + for (const batch of fh.pullSync({ chunkSize: 16 * 1024 })) { + batchCount++; + for (const chunk of batch) { + assert.ok(chunk.byteLength <= 16 * 1024, + `Chunk ${chunk.byteLength} should be <= 16384`); + } + } + assert.strictEqual(batchCount, 4); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// writer() with chunkSize option (sync write threshold) +// ============================================================================= + +async function testWriterChunkSize() { + const filePath = path.join(tmpDir, 'pullsync-writer-chunksize.txt'); + const fh = await open(filePath, 'w'); + // Set chunkSize to 1024 - writes larger than this should fall back to async + const w = fh.writer({ chunkSize: 1024 }); + + // Small write should succeed sync + assert.strictEqual(w.writeSync(Buffer.alloc(512, 'a')), true); + + // Write larger than chunkSize should return false + assert.strictEqual(w.writeSync(Buffer.alloc(2048, 'b')), false); + + await w.end(); + await fh.close(); +} + +// ============================================================================= +// Argument validation +// ============================================================================= + +async function testPullArgumentValidation() { + const filePath = path.join(tmpDir, 'pull-arg-validation.txt'); + fs.writeFileSync(filePath, 'data'); + + const fh = await open(filePath, 'r'); + try { + assert.throws(() => fh.pullSync({ autoClose: 'no' }), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => fh.pullSync({ start: 'a' }), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => fh.pullSync({ limit: 'a' }), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => fh.pullSync({ chunkSize: 'a' }), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => fh.pullSync({ start: 1.1 }), { code: 'ERR_OUT_OF_RANGE' }); + assert.throws(() => fh.pullSync({ limit: 1.1 }), { code: 'ERR_OUT_OF_RANGE' }); + assert.throws(() => fh.pullSync({ chunkSize: 1.1 }), { code: 'ERR_OUT_OF_RANGE' }); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// Run all tests +// ============================================================================= + +Promise.all([ + testBasicPullSync(), + testLargeFile(), + testBinaryData(), + testPullSyncWithCompression(), + testPullSyncWithStatelessTransform(), + testPullSyncMixedTransforms(), + testAutoClose(), + testAutoCloseEarlyBreak(), + testNoAutoClose(), + testLocked(), + testEmptyFile(), + testPipeToSync(), + testPullSyncStart(), + testPullSyncLimit(), + testPullSyncStartAndLimit(), + testPullSyncLimitMultiChunk(), + testPullSyncStartLimitWithTransforms(), + testPullSyncStartAutoClose(), + testPullSyncChunkSize(), + testWriterChunkSize(), + testPullArgumentValidation(), +]).then(common.mustCall()); diff --git a/test/parallel/test-fs-promises-file-handle-writeFile.js b/test/parallel/test-fs-promises-file-handle-writeFile.js index 2c1a80e4f52d..b08200d4f78c 100644 --- a/test/parallel/test-fs-promises-file-handle-writeFile.js +++ b/test/parallel/test-fs-promises-file-handle-writeFile.js @@ -1,12 +1,8 @@ 'use strict'; const common = require('../common'); - -// The following tests validate base functionality for the fs.promises -// FileHandle.writeFile method. - const fs = require('fs'); -const { open, writeFile } = fs.promises; +const { open } = fs.promises; const path = require('path'); const { Readable } = require('stream'); const tmpdir = require('../common/tmpdir'); @@ -15,7 +11,7 @@ const tmpDir = tmpdir.path; tmpdir.refresh(); -async function validateWriteFile() { +async function doWriteBuffer() { const filePathForHandle = path.resolve(tmpDir, 'tmp-write-file2.txt'); const fileHandle = await open(filePathForHandle, 'w+'); try { @@ -29,8 +25,22 @@ async function validateWriteFile() { } } -// Signal aborted while writing file -async function doWriteAndCancel() { +async function doWriteString() { + const filePathForHandle = path.resolve(tmpDir, 'tmp-write-string.txt'); + const fileHandle = await open(filePathForHandle, 'w+'); + try { + const string = 'x~yz'.repeat(100); + + await fileHandle.writeFile(string); + const readFileData = fs.readFileSync(filePathForHandle); + const stringAsBuffer = Buffer.from(string, 'utf8'); + assert.deepStrictEqual(stringAsBuffer, readFileData); + } finally { + await fileHandle.close(); + } +} + +async function doWriteBufferAndCancel() { const filePathForHandle = path.resolve(tmpDir, 'dogs-running.txt'); const fileHandle = await open(filePathForHandle, 'w+'); try { @@ -38,7 +48,7 @@ async function doWriteAndCancel() { const controller = new AbortController(); const { signal } = controller; process.nextTick(() => controller.abort()); - await assert.rejects(writeFile(fileHandle, buffer, { signal }), { + await assert.rejects(fileHandle.writeFile(buffer, { signal }), { name: 'AbortError' }); } finally { @@ -58,6 +68,13 @@ const iterable = { yield 'c'; } }; +const veryLargeIterable = { + expected: 'dogs running'.repeat(512 * 1024), + *[Symbol.iterator]() { + yield Buffer.from('dogs running'.repeat(512 * 1024), 'utf8'); + } +}; + function iterableWith(value) { return { *[Symbol.iterator]() { @@ -75,7 +92,7 @@ const bufferIterable = { }; const asyncIterable = { expected: 'abc', - async* [Symbol.asyncIterator]() { + async*[Symbol.asyncIterator]() { yield 'a'; yield 'b'; yield 'c'; @@ -170,6 +187,17 @@ async function doWriteAsyncIterable() { } } +async function doWriteLargeIterable() { + const fileHandle = await open(dest, 'w+'); + try { + await fileHandle.writeFile(veryLargeIterable); + const data = fs.readFileSync(dest, 'utf-8'); + assert.deepStrictEqual(data, veryLargeIterable.expected); + } finally { + await fileHandle.close(); + } +} + async function doWriteInvalidValues() { const fileHandle = await open(dest, 'w+'); try { @@ -186,9 +214,47 @@ async function doWriteInvalidValues() { } } +async function doWriteTypedArrays() { + for (const Constructor of [Uint8Array, Uint16Array, Uint32Array]) { + // Use a file size larger than `kReadFileMaxChunkSize`. + const buffer = Buffer.from('012'.repeat(2 ** 14)); + const array = new Constructor(buffer.buffer); + const fileHandle = await open(dest, 'w+'); + + try { + await fileHandle.writeFile(array); + const data = fs.readFileSync(dest); + assert.deepStrictEqual(data, buffer); + } finally { + await fileHandle.close(); + } + } +} + +async function doWriteFromCurrentPosition() { + const fileHandle = await open(dest, 'w+'); + try { + /* Write only five bytes, so that the position moves to five. */ + const buf = Buffer.from('Hello'); + const { bytesWritten } = await fileHandle.write(buf, 0, 5, null); + assert.strictEqual(bytesWritten, 5); + + /* Write some more with writeFile(). */ + await fileHandle.writeFile('World'); + + const data = fs.readFileSync(dest, 'utf-8'); + + /* New content should be written at position five, instead of zero. */ + assert.strictEqual(data, 'HelloWorld'); + } finally { + await fileHandle.close(); + } +} + (async () => { - await validateWriteFile(); - await doWriteAndCancel(); + await doWriteBuffer(); + await doWriteBufferAndCancel(); + await doWriteString(); await doWriteStream(); await doWriteStreamWithCancel(); await doWriteIterable(); @@ -196,5 +262,8 @@ async function doWriteInvalidValues() { await doWriteIterableWithEncoding(); await doWriteBufferIterable(); await doWriteAsyncIterable(); + await doWriteLargeIterable(); await doWriteInvalidValues(); + await doWriteTypedArrays(); + await doWriteFromCurrentPosition(); })().then(common.mustCall()); diff --git a/test/parallel/test-fs-promises-file-handle-writer.js b/test/parallel/test-fs-promises-file-handle-writer.js new file mode 100644 index 000000000000..ff90716400ef --- /dev/null +++ b/test/parallel/test-fs-promises-file-handle-writer.js @@ -0,0 +1,1117 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const fs = require('fs'); +const { open } = fs.promises; +const path = require('path'); +const tmpdir = require('../common/tmpdir'); +const { + pipeTo, text, +} = require('stream/iter'); +const { + compressGzip, decompressGzip, +} = require('zlib/iter'); + +tmpdir.refresh(); + +const tmpDir = tmpdir.path; + +// ============================================================================= +// Basic write() +// ============================================================================= + +async function testBasicWrite() { + const filePath = path.join(tmpDir, 'writer-basic.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + await w.write(Buffer.from('Hello ')); + await w.write(Buffer.from('World!')); + const totalBytes = await w.end(); + await fh.close(); + + assert.strictEqual(totalBytes, 12); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'Hello World!'); +} + +// ============================================================================= +// Basic writev() +// ============================================================================= + +async function testBasicWritev() { + const filePath = path.join(tmpDir, 'writer-writev.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + await w.writev([ + Buffer.from('aaa'), + Buffer.from('bbb'), + Buffer.from('ccc'), + ]); + const totalBytes = await w.end(); + await fh.close(); + + assert.strictEqual(totalBytes, 9); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'aaabbbccc'); +} + +// ============================================================================= +// Mixed write() and writev() +// ============================================================================= + +async function testMixedWriteAndWritev() { + const filePath = path.join(tmpDir, 'writer-mixed.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + await w.write(Buffer.from('head-')); + await w.writev([Buffer.from('mid1-'), Buffer.from('mid2-')]); + await w.write(Buffer.from('tail')); + const totalBytes = await w.end(); + await fh.close(); + + assert.strictEqual(totalBytes, 19); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'head-mid1-mid2-tail'); +} + +// ============================================================================= +// end() returns totalBytesWritten +// ============================================================================= + +async function testEndReturnsTotalBytes() { + const filePath = path.join(tmpDir, 'writer-totalbytes.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + // Write some data in various sizes + const sizes = [100, 200, 300, 400, 500]; + let expected = 0; + for (const size of sizes) { + await w.write(Buffer.alloc(size, 0x41)); + expected += size; + } + const totalBytes = await w.end(); + await fh.close(); + + assert.strictEqual(totalBytes, expected); + assert.strictEqual(totalBytes, 1500); + assert.strictEqual(fs.statSync(filePath).size, 1500); +} + +// ============================================================================= +// autoClose: true - handle closed after end() +// ============================================================================= + +async function testAutoCloseOnEnd() { + const filePath = path.join(tmpDir, 'writer-autoclose-end.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer({ autoClose: true }); + await w.write(Buffer.from('auto close test')); + await w.end(); + + // Handle should be closed + await assert.rejects(fh.stat(), { code: 'EBADF' }); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'auto close test'); +} + +// ============================================================================= +// autoClose: true - handle closed after fail() +// ============================================================================= + +async function testAutoCloseOnFail() { + const filePath = path.join(tmpDir, 'writer-autoclose-fail.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer({ autoClose: true }); + await w.write(Buffer.from('partial')); + w.fail(new Error('test fail')); + + // Handle should be closed + await assert.rejects(fh.stat(), { code: 'EBADF' }); + // Partial data should still be on disk (fail doesn't truncate) + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'partial'); +} + +// ============================================================================= +// start option - write at specified offset +// ============================================================================= + +async function testStartOption() { + const filePath = path.join(tmpDir, 'writer-start.txt'); + // Pre-fill with 10 A's + fs.writeFileSync(filePath, 'AAAAAAAAAA'); + + const fh = await open(filePath, 'r+'); + const w = fh.writer({ start: 3 }); + await w.write(Buffer.from('BBB')); + await w.end(); + await fh.close(); + + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'AAABBBAAAA'); +} + +// ============================================================================= +// start option - sequential writes advance position +// ============================================================================= + +async function testStartSequentialPosition() { + const filePath = path.join(tmpDir, 'writer-start-seq.txt'); + fs.writeFileSync(filePath, 'XXXXXXXXXX'); + + const fh = await open(filePath, 'r+'); + const w = fh.writer({ start: 2 }); + await w.write(Buffer.from('AA')); + await w.write(Buffer.from('BB')); + await w.writev([Buffer.from('C'), Buffer.from('D')]); + await w.end(); + await fh.close(); + + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'XXAABBCDXX'); +} + +// ============================================================================= +// Locked state - can't create second writer while active +// ============================================================================= + +async function testLockedState() { + const filePath = path.join(tmpDir, 'writer-locked.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + assert.throws(() => fh.writer(), { + name: 'Error', + message: /locked/, + }); + + // Also can't pull while writer is active + assert.throws(() => fh.pull(), { + name: 'Error', + message: /locked/, + }); + + await w.end(); + await fh.close(); +} + +// ============================================================================= +// Unlock after end - handle reusable +// ============================================================================= + +async function testUnlockAfterEnd() { + const filePath = path.join(tmpDir, 'writer-unlock.txt'); + const fh = await open(filePath, 'w'); + + const w1 = fh.writer(); + await w1.write(Buffer.from('first')); + await w1.end(); + + // Should work - handle is unlocked + const w2 = fh.writer(); + await w2.write(Buffer.from(' second')); + await w2.end(); + await fh.close(); + + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'first second'); +} + +// ============================================================================= +// Unlock after fail - handle reusable +// ============================================================================= + +async function testUnlockAfterFail() { + const filePath = path.join(tmpDir, 'writer-unlock-fail.txt'); + const fh = await open(filePath, 'w'); + + const w1 = fh.writer(); + await w1.write(Buffer.from('failed')); + await w1.fail(new Error('test')); + + // Should work - handle is unlocked + const w2 = fh.writer(); + await w2.write(Buffer.from('recovered')); + await w2.end(); + await fh.close(); + + // 'recovered' is appended after 'failed' at current file offset + const content = fs.readFileSync(filePath, 'utf8'); + assert.ok(content.startsWith('failed')); + assert.ok(content.includes('recovered')); +} + +// ============================================================================= +// Write after end/fail rejects +// ============================================================================= + +async function testWriteAfterEndRejects() { + const filePath = path.join(tmpDir, 'writer-closed.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + await w.write(Buffer.from('data')); + await w.end(); + + await assert.rejects(w.write(Buffer.from('more')), { + name: 'TypeError', + message: /closed/, + }); + await assert.rejects(w.writev([Buffer.from('more')]), { + name: 'TypeError', + message: /closed/, + }); + + await fh.close(); +} + +// ============================================================================= +// Closed handle - writer() throws +// ============================================================================= + +async function testClosedHandle() { + const filePath = path.join(tmpDir, 'writer-closed-handle.txt'); + const fh = await open(filePath, 'w'); + await fh.close(); + + assert.throws(() => fh.writer(), { + name: 'Error', + message: /closed/, + }); +} + +// ============================================================================= +// pipeTo() integration - pipe source through writer +// ============================================================================= + +async function testPipeToIntegration() { + const srcPath = path.join(tmpDir, 'writer-pipeto-src.txt'); + const dstPath = path.join(tmpDir, 'writer-pipeto-dst.txt'); + const data = 'The quick brown fox jumps over the lazy dog.\n'.repeat(500); + fs.writeFileSync(srcPath, data); + + const rfh = await open(srcPath, 'r'); + const wfh = await open(dstPath, 'w'); + const w = wfh.writer(); + + const totalBytes = await pipeTo(rfh.pull(), w); + + await rfh.close(); + await wfh.close(); + + assert.strictEqual(totalBytes, Buffer.byteLength(data)); + assert.strictEqual(fs.readFileSync(dstPath, 'utf8'), data); +} + +// ============================================================================= +// pipeTo() with transforms - uppercase through writer +// ============================================================================= + +async function testPipeToWithTransform() { + const srcPath = path.join(tmpDir, 'writer-transform-src.txt'); + const dstPath = path.join(tmpDir, 'writer-transform-dst.txt'); + const data = 'hello world from transforms test\n'.repeat(200); + fs.writeFileSync(srcPath, data); + + function uppercase(chunks) { + if (chunks === null) return null; + const out = new Array(chunks.length); + for (let i = 0; i < chunks.length; i++) { + const src = chunks[i]; + const buf = Buffer.allocUnsafe(src.length); + for (let j = 0; j < src.length; j++) { + const b = src[j]; + buf[j] = (b >= 0x61 && b <= 0x7a) ? b - 0x20 : b; + } + out[i] = buf; + } + return out; + } + + const rfh = await open(srcPath, 'r'); + const wfh = await open(dstPath, 'w'); + const w = wfh.writer(); + + await pipeTo(rfh.pull(), uppercase, w); + + await rfh.close(); + await wfh.close(); + + assert.strictEqual(fs.readFileSync(dstPath, 'utf8'), data.toUpperCase()); +} + +// ============================================================================= +// Round-trip: pull → compress → writer, pull → decompress → verify +// ============================================================================= + +async function testCompressRoundTrip() { + const srcPath = path.join(tmpDir, 'writer-rt-src.txt'); + const gzPath = path.join(tmpDir, 'writer-rt.gz'); + const original = 'Round trip compression test data. '.repeat(2000); + fs.writeFileSync(srcPath, original); + + // Compress: pull → gzip → writer + { + const rfh = await open(srcPath, 'r'); + const wfh = await open(gzPath, 'w'); + const w = wfh.writer({ autoClose: true }); + await pipeTo(rfh.pull(), compressGzip(), w); + await rfh.close(); + } + + // Verify compressed file is smaller + const compressedSize = fs.statSync(gzPath).size; + assert.ok(compressedSize < Buffer.byteLength(original), + `Compressed ${compressedSize} should be < original ${Buffer.byteLength(original)}`); + + // Decompress: pull → gunzip → text → verify + { + const rfh = await open(gzPath, 'r'); + const result = await text(rfh.pull(decompressGzip())); + await rfh.close(); + assert.strictEqual(result, original); + } +} + +// ============================================================================= +// Large file write - write 1MB in 64KB chunks +// ============================================================================= + +async function testLargeFileWrite() { + const filePath = path.join(tmpDir, 'writer-large.bin'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + const chunkSize = 65536; + const totalSize = 1024 * 1024; // 1MB + const chunk = Buffer.alloc(chunkSize, 0x42); + let written = 0; + + while (written < totalSize) { + await w.write(chunk); + written += chunkSize; + } + + const totalBytes = await w.end(); + await fh.close(); + + assert.strictEqual(totalBytes, totalSize); + assert.strictEqual(fs.statSync(filePath).size, totalSize); + + // Verify content + const data = fs.readFileSync(filePath); + for (let i = 0; i < data.length; i++) { + if (data[i] !== 0x42) { + assert.fail(`Byte at offset ${i} is ${data[i]}, expected 0x42`); + } + } +} + +// ============================================================================= +// Symbol.asyncDispose - await using +// ============================================================================= + +async function testAsyncDispose() { + const filePath = path.join(tmpDir, 'writer-async-dispose.txt'); + { + await using fh = await open(filePath, 'w'); + await using w = fh.writer({ autoClose: true }); + await w.write(Buffer.from('async dispose')); + } + // Both writer and file handle should be cleaned up + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'async dispose'); + + // Verify the handle is actually closed by trying to open a new one + // (if the old one were still open with a write lock on some OSes, + // this could fail - but it should succeed). + const fh2 = await open(filePath, 'r'); + await fh2.close(); +} + +// ============================================================================= +// Symbol.asyncDispose - cleanup on error (await using unwinds) +// ============================================================================= + +async function testAsyncDisposeOnError() { + const filePath = path.join(tmpDir, 'writer-dispose-error.txt'); + const fh = await open(filePath, 'w'); + + try { + await using w = fh.writer(); + await w.write(Buffer.from('before error')); + throw new Error('intentional'); + } catch (e) { + assert.strictEqual(e.message, 'intentional'); + } + + // If asyncDispose ran, the handle should be unlocked and reusable + const w2 = fh.writer(); + await w2.write(Buffer.from('after error')); + await w2.end(); + await fh.close(); + + const content = fs.readFileSync(filePath, 'utf8'); + assert.ok(content.includes('after error'), + `Expected 'after error' in ${JSON.stringify(content)}`); +} + +// ============================================================================= +// Pre-aborted signal rejects write/writev/end +// ============================================================================= + +async function testWriteWithAbortedSignalRejects() { + const filePath = path.join(tmpDir, 'writer-signal-write.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + await assert.rejects( + w.write(Buffer.from('data'), { signal: AbortSignal.abort() }), + { name: 'AbortError' }, + ); + + // Writer should still be usable after a signal rejection + await w.write(Buffer.from('ok')); + await w.end(); + await fh.close(); + + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'ok'); +} + +async function testWritevWithAbortedSignalRejects() { + const filePath = path.join(tmpDir, 'writer-signal-writev.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + await assert.rejects( + w.writev([Buffer.from('a'), Buffer.from('b')], { signal: AbortSignal.abort() }), + { name: 'AbortError' }, + ); + + await w.writev([Buffer.from('ok')]); + await w.end(); + await fh.close(); + + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'ok'); +} + +async function testEndWithAbortedSignalRejects() { + const filePath = path.join(tmpDir, 'writer-signal-end.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + await w.write(Buffer.from('data')); + + await assert.rejects( + w.end({ signal: AbortSignal.abort() }), + { name: 'AbortError' }, + ); + + // end() was rejected so writer is still open - end it cleanly + const totalBytes = await w.end(); + await fh.close(); + + assert.strictEqual(totalBytes, 4); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'data'); +} + +// ============================================================================= +// write() with string input (UTF-8 encoding) +// ============================================================================= + +async function testWriteString() { + const filePath = path.join(tmpDir, 'writer-string.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + await w.write('Hello '); + await w.write('World!'); + const totalBytes = await w.end(); + await fh.close(); + + assert.strictEqual(totalBytes, 12); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'Hello World!'); +} + +// ============================================================================= +// write() with string containing multi-byte UTF-8 characters +// ============================================================================= + +async function testWriteStringMultibyte() { + const filePath = path.join(tmpDir, 'writer-string-multibyte.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + const input = 'café ☕ 日本語'; + await w.write(input); + const totalBytes = await w.end(); + await fh.close(); + + const expected = Buffer.from(input, 'utf8'); + assert.strictEqual(totalBytes, expected.byteLength); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), input); +} + +// ============================================================================= +// writev() with string chunks (UTF-8 encoding) +// ============================================================================= + +async function testWritevStrings() { + const filePath = path.join(tmpDir, 'writer-writev-strings.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + await w.writev(['aaa', 'bbb', 'ccc']); + const totalBytes = await w.end(); + await fh.close(); + + assert.strictEqual(totalBytes, 9); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'aaabbbccc'); +} + +// ============================================================================= +// writev() with mixed string and Uint8Array chunks +// ============================================================================= + +async function testWritevMixed() { + const filePath = path.join(tmpDir, 'writer-writev-mixed.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + await w.writev(['hello', Buffer.from(' '), 'world']); + const totalBytes = await w.end(); + await fh.close(); + + assert.strictEqual(totalBytes, 11); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'hello world'); +} + +// ============================================================================= +// Symbol.dispose calls fail() +// ============================================================================= + +async function testSyncDispose() { + const filePath = path.join(tmpDir, 'writer-sync-dispose.txt'); + const fh = await open(filePath, 'w'); + + { + using w = fh.writer(); + await w.write(Buffer.from('before dispose')); + } + // Symbol.dispose calls fail(), which unlocks the handle. + // The handle should be reusable. + const w2 = fh.writer(); + await w2.write(Buffer.from('after dispose')); + await w2.end(); + await fh.close(); + + const content = fs.readFileSync(filePath, 'utf8'); + assert.ok(content.includes('after dispose'), + `Expected 'after dispose' in ${JSON.stringify(content)}`); +} + +// ============================================================================= +// Symbol.dispose on error unwind +// ============================================================================= + +async function testSyncDisposeOnError() { + const filePath = path.join(tmpDir, 'writer-sync-dispose-error.txt'); + const fh = await open(filePath, 'w'); + + try { + using w = fh.writer(); + await w.write(Buffer.from('data')); + throw new Error('intentional'); + } catch (e) { + assert.strictEqual(e.message, 'intentional'); + } + + // Handle should be unlocked and reusable after sync dispose + const w2 = fh.writer(); + await w2.write(Buffer.from('recovered')); + await w2.end(); + await fh.close(); + + const content = fs.readFileSync(filePath, 'utf8'); + assert.ok(content.includes('recovered'), + `Expected 'recovered' in ${JSON.stringify(content)}`); +} + +// ============================================================================= +// writeSync() basic +// ============================================================================= + +async function testWriteSyncBasic() { + const filePath = path.join(tmpDir, 'writer-writesync-basic.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + assert.strictEqual(w.writeSync('Hello '), true); + assert.strictEqual(w.writeSync(Buffer.from('World!')), true); + const totalBytes = await w.end(); + await fh.close(); + + assert.strictEqual(totalBytes, 12); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'Hello World!'); +} + +// ============================================================================= +// writevSync() basic +// ============================================================================= + +async function testWritevSyncBasic() { + const filePath = path.join(tmpDir, 'writer-writevsync-basic.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + assert.strictEqual(w.writevSync(['aaa', Buffer.from('bbb'), 'ccc']), true); + const totalBytes = await w.end(); + await fh.close(); + + assert.strictEqual(totalBytes, 9); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'aaabbbccc'); +} + +// ============================================================================= +// writeSync() returns false for large chunks +// ============================================================================= + +async function testWriteSyncLargeChunk() { + const filePath = path.join(tmpDir, 'writer-writesync-large.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + // Chunk larger than 131072 should return false + const bigChunk = Buffer.alloc(131073, 'x'); + assert.strictEqual(w.writeSync(bigChunk), false); + + // Chunk at exactly 131072 should succeed + const exactChunk = Buffer.alloc(131072, 'y'); + assert.strictEqual(w.writeSync(exactChunk), true); + + await w.end(); + await fh.close(); + + // Only the exact chunk should have been written + const content = fs.readFileSync(filePath); + assert.strictEqual(content.length, 131072); +} + +// ============================================================================= +// writeSync() returns false when async op is in flight +// ============================================================================= + +async function testWriteSyncReturnsFalseDuringAsync() { + const filePath = path.join(tmpDir, 'writer-writesync-async.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + // Start an async write but don't await yet + const p = w.write(Buffer.from('async')); + + // Sync write should return false because async is in flight + assert.strictEqual(w.writeSync(Buffer.from('sync')), false); + + await p; + + // After async completes, sync should work again + assert.strictEqual(w.writeSync(Buffer.from(' then sync')), true); + + await w.end(); + await fh.close(); + + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'async then sync'); +} + +// ============================================================================= +// writeSync() returns false on closed/errored writer +// ============================================================================= + +async function testWriteSyncClosedErrored() { + const filePath = path.join(tmpDir, 'writer-writesync-closed.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + await w.end(); + + // Should return false after end() + assert.strictEqual(w.writeSync(Buffer.from('data')), false); + await fh.close(); + + // Test errored state + const fh2 = await open(filePath, 'w'); + const w2 = fh2.writer(); + w2.fail(new Error('test')); + assert.strictEqual(w2.writeSync(Buffer.from('data')), false); + await fh2.close(); +} + +// ============================================================================= +// endSync() basic +// ============================================================================= + +async function testEndSyncBasic() { + const filePath = path.join(tmpDir, 'writer-endsync-basic.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + w.writeSync(Buffer.from('hello')); + const totalBytes = w.endSync(); + await fh.close(); + + assert.strictEqual(totalBytes, 5); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'hello'); +} + +// ============================================================================= +// endSync() returns -1 when async op is in flight +// ============================================================================= + +async function testEndSyncReturnsFalseDuringAsync() { + const filePath = path.join(tmpDir, 'writer-endsync-async.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + const p = w.write(Buffer.from('data')); + assert.strictEqual(w.endSync(), -1); + + await p; + const totalBytes = await w.end(); + await fh.close(); + + assert.strictEqual(totalBytes, 4); +} + +// ============================================================================= +// endSync() idempotent on closed writer +// ============================================================================= + +async function testEndSyncIdempotent() { + const filePath = path.join(tmpDir, 'writer-endsync-idempotent.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + w.writeSync(Buffer.from('data')); + const first = w.endSync(); + const second = w.endSync(); + + assert.strictEqual(first, 4); + assert.strictEqual(second, 4); // Idempotent + await fh.close(); +} + +// ============================================================================= +// endSync() with autoClose fires handle.close() +// ============================================================================= + +async function testEndSyncAutoClose() { + const filePath = path.join(tmpDir, 'writer-endsync-autoclose.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer({ autoClose: true }); + + w.writeSync(Buffer.from('auto')); + const totalBytes = w.endSync(); + + assert.strictEqual(totalBytes, 4); + + // Handle should be closed synchronously + await assert.rejects(fh.stat(), { code: 'EBADF' }); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'auto'); +} + +// ============================================================================= +// Full sync pipeline: writeSync + endSync (no async at all) +// ============================================================================= + +async function testFullSyncPipeline() { + const filePath = path.join(tmpDir, 'writer-full-sync.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + // Entirely synchronous write pipeline + w.writeSync('line 1\n'); + w.writeSync('line 2\n'); + w.writevSync(['line 3\n', 'line 4\n']); + const totalBytes = w.endSync(); + await fh.close(); + + assert.strictEqual(totalBytes, 28); + assert.strictEqual( + fs.readFileSync(filePath, 'utf8'), + 'line 1\nline 2\nline 3\nline 4\n', + ); +} + +// ============================================================================= +// end() rejects on errored writer +// ============================================================================= + +async function testEndRejectsOnErrored() { + const filePath = path.join(tmpDir, 'writer-end-errored.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + await w.write(Buffer.from('data')); + w.fail(new Error('test error')); + + await assert.rejects( + w.end(), + { message: 'test error' }, + ); + await fh.close(); +} + +// ============================================================================= +// end() is idempotent when closing/closed +// ============================================================================= + +async function testEndIdempotent() { + const filePath = path.join(tmpDir, 'writer-end-idempotent.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + await w.write(Buffer.from('data')); + + // Call end() twice concurrently - second should return same promise + const p1 = w.end(); + const p2 = w.end(); + const [bytes1, bytes2] = await Promise.all([p1, p2]); + + assert.strictEqual(bytes1, 4); + assert.strictEqual(bytes2, 4); + + // After closed, calling end() again returns totalBytesWritten + const bytes3 = await w.end(); + assert.strictEqual(bytes3, 4); + + await fh.close(); +} + +// ============================================================================= +// asyncDispose waits for pending end() when closing +// ============================================================================= + +async function testAsyncDisposeWhileClosing() { + const filePath = path.join(tmpDir, 'writer-dispose-closing.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer({ autoClose: true }); + + await w.write(Buffer.from('closing test')); + + // Start end() but don't await - writer is now "closing" + const endPromise = w.end(); + + // asyncDispose should wait for the pending end, not call fail() + await w[Symbol.asyncDispose](); + await endPromise; + + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), 'closing test'); +} + +// ============================================================================= +// asyncDispose calls fail() on open writer (not graceful cleanup) +// ============================================================================= + +async function testAsyncDisposeCallsFail() { + const filePath = path.join(tmpDir, 'writer-dispose-fails.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer(); + + await w.write(Buffer.from('some data')); + + // Dispose without end() - should call fail(), not graceful cleanup + await w[Symbol.asyncDispose](); + + // Writer should be in errored state - write should reject + await assert.rejects( + w.write(Buffer.from('more')), + (err) => err instanceof Error, + ); + + // Handle should be unlocked and reusable + const w2 = fh.writer(); + await w2.end(); + await fh.close(); +} + +// ============================================================================= +// writer() with limit - async write within limit succeeds +// ============================================================================= + +async function testWriterLimit() { + const filePath = path.join(tmpDir, 'writer-limit.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer({ limit: 10 }); + + await w.write(Buffer.from('12345')); // 5 bytes, 5 remaining + await w.write(Buffer.from('67890')); // 5 bytes, 0 remaining + const totalBytes = await w.end(); + await fh.close(); + + assert.strictEqual(totalBytes, 10); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), '1234567890'); +} + +// ============================================================================= +// writer() with limit - async write exceeding limit rejects +// ============================================================================= + +async function testWriterLimitExceeded() { + const filePath = path.join(tmpDir, 'writer-limit-exceeded.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer({ limit: 5 }); + + await w.write(Buffer.from('123')); // 3 bytes, 2 remaining + + await assert.rejects( + w.write(Buffer.from('45678')), // 5 bytes > 2 remaining + { code: 'ERR_OUT_OF_RANGE' }, + ); + + await w.end(); + await fh.close(); +} + +// ============================================================================= +// writer() with limit - writev exceeding limit rejects +// ============================================================================= + +async function testWriterLimitWritev() { + const filePath = path.join(tmpDir, 'writer-limit-writev.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer({ limit: 6 }); + + await w.writev([Buffer.from('ab'), Buffer.from('cd')]); // 4 bytes + + await assert.rejects( + w.writev([Buffer.from('ef'), Buffer.from('gh')]), // 4 bytes > 2 remaining + { code: 'ERR_OUT_OF_RANGE' }, + ); + + await w.end(); + await fh.close(); +} + +// ============================================================================= +// writer() with limit - writeSync returns false when exceeding limit +// ============================================================================= + +async function testWriterLimitWriteSync() { + const filePath = path.join(tmpDir, 'writer-limit-writesync.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer({ limit: 10 }); + + assert.strictEqual(w.writeSync(Buffer.from('12345')), true); // 5 ok + assert.strictEqual(w.writeSync(Buffer.from('678')), true); // 3 ok + assert.strictEqual(w.writeSync(Buffer.from('901')), false); // 3 > 2 remaining + + const totalBytes = w.endSync(); + await fh.close(); + + assert.strictEqual(totalBytes, 8); + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), '12345678'); +} + +// ============================================================================= +// writer() with limit - writevSync returns false when exceeding limit +// ============================================================================= + +async function testWriterLimitWritevSync() { + const filePath = path.join(tmpDir, 'writer-limit-writevsync.txt'); + const fh = await open(filePath, 'w'); + const w = fh.writer({ limit: 5 }); + + assert.strictEqual(w.writevSync([Buffer.from('ab')]), true); + // 4 bytes > 3 remaining + assert.strictEqual( + w.writevSync([Buffer.from('cd'), Buffer.from('ef')]), false); + + w.endSync(); + await fh.close(); +} + +// ============================================================================= +// writer() with limit + start +// ============================================================================= + +async function testWriterLimitAndStart() { + const filePath = path.join(tmpDir, 'writer-limit-start.txt'); + // Pre-fill file with dots + fs.writeFileSync(filePath, '...........'); // 11 dots + + const fh = await open(filePath, 'r+'); + const w = fh.writer({ start: 3, limit: 5 }); + + await w.write(Buffer.from('HELLO')); // Write at offset 3 + await w.end(); + await fh.close(); + + assert.strictEqual(fs.readFileSync(filePath, 'utf8'), '...HELLO...'); +} + +// ============================================================================= +// Argument validation +// ============================================================================= + +async function testWriterArgumentValidation() { + const filePath = path.join(tmpDir, 'pull-arg-validation.txt'); + fs.writeFileSync(filePath, 'data'); + + const fh = await open(filePath, 'r'); + try { + assert.throws(() => fh.writer({ autoClose: 'no' }), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => fh.writer({ start: 'a' }), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => fh.writer({ limit: 'a' }), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => fh.writer({ chunkSize: 'a' }), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => fh.writer({ start: 1.1 }), { code: 'ERR_OUT_OF_RANGE' }); + assert.throws(() => fh.writer({ limit: 1.1 }), { code: 'ERR_OUT_OF_RANGE' }); + assert.throws(() => fh.writer({ chunkSize: 1.1 }), { code: 'ERR_OUT_OF_RANGE' }); + } finally { + await fh.close(); + } +} + +// ============================================================================= +// Run all tests +// ============================================================================= + +Promise.all([ + testBasicWrite(), + testBasicWritev(), + testMixedWriteAndWritev(), + testEndReturnsTotalBytes(), + testAutoCloseOnEnd(), + testAutoCloseOnFail(), + testStartOption(), + testStartSequentialPosition(), + testLockedState(), + testUnlockAfterEnd(), + testUnlockAfterFail(), + testWriteAfterEndRejects(), + testClosedHandle(), + testPipeToIntegration(), + testPipeToWithTransform(), + testCompressRoundTrip(), + testLargeFileWrite(), + testAsyncDispose(), + testAsyncDisposeOnError(), + testWriteWithAbortedSignalRejects(), + testWritevWithAbortedSignalRejects(), + testEndWithAbortedSignalRejects(), + testWriteString(), + testWriteStringMultibyte(), + testWritevStrings(), + testWritevMixed(), + testSyncDispose(), + testSyncDisposeOnError(), + testWriteSyncBasic(), + testWritevSyncBasic(), + testWriteSyncLargeChunk(), + testWriteSyncReturnsFalseDuringAsync(), + testWriteSyncClosedErrored(), + testEndSyncBasic(), + testEndSyncReturnsFalseDuringAsync(), + testEndSyncIdempotent(), + testEndSyncAutoClose(), + testFullSyncPipeline(), + testEndRejectsOnErrored(), + testEndIdempotent(), + testAsyncDisposeWhileClosing(), + testAsyncDisposeCallsFail(), + testWriterLimit(), + testWriterLimitExceeded(), + testWriterLimitWritev(), + testWriterLimitWriteSync(), + testWriterLimitWritevSync(), + testWriterLimitAndStart(), + testWriterArgumentValidation(), +]).then(common.mustCall()); diff --git a/test/parallel/test-fs-promises-writefile-typedarray.js b/test/parallel/test-fs-promises-writefile-typedarray.js deleted file mode 100644 index 32d9cffa236e..000000000000 --- a/test/parallel/test-fs-promises-writefile-typedarray.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -const common = require('../common'); -const fs = require('fs'); -const fsPromises = fs.promises; -const path = require('path'); -const tmpdir = require('../common/tmpdir'); -const assert = require('assert'); -const tmpDir = tmpdir.path; - -tmpdir.refresh(); - -const dest = path.resolve(tmpDir, 'tmp.txt'); -// Use a file size larger than `kReadFileMaxChunkSize`. -const buffer = Buffer.from('012'.repeat(2 ** 14)); - -(async () => { - for (const Constructor of [Uint8Array, Uint16Array, Uint32Array]) { - const array = new Constructor(buffer.buffer); - await fsPromises.writeFile(dest, array); - const data = await fsPromises.readFile(dest); - assert.deepStrictEqual(data, buffer); - } -})().then(common.mustCall()); diff --git a/test/parallel/test-fs-promises-writefile-with-fd.js b/test/parallel/test-fs-promises-writefile-with-fd.js deleted file mode 100644 index 7cb9eeeca9a9..000000000000 --- a/test/parallel/test-fs-promises-writefile-with-fd.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -// This test makes sure that `writeFile()` always writes from the current -// position of the file, instead of truncating the file. - -const common = require('../common'); -const assert = require('assert'); -const { readFileSync } = require('fs'); -const { open } = require('fs').promises; - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -const fn = tmpdir.resolve('test.txt'); - -async function writeFileTest() { - const handle = await open(fn, 'w'); - - /* Write only five bytes, so that the position moves to five. */ - const buf = Buffer.from('Hello'); - const { bytesWritten } = await handle.write(buf, 0, 5, null); - assert.strictEqual(bytesWritten, 5); - - /* Write some more with writeFile(). */ - await handle.writeFile('World'); - - /* New content should be written at position five, instead of zero. */ - assert.strictEqual(readFileSync(fn).toString(), 'HelloWorld'); - - await handle.close(); -} - - -writeFileTest() - .then(common.mustCall()); diff --git a/test/parallel/test-fs-promises-writefile.js b/test/parallel/test-fs-promises-writefile.js index 25df61b2b484..da7e345a7079 100644 --- a/test/parallel/test-fs-promises-writefile.js +++ b/test/parallel/test-fs-promises-writefile.js @@ -14,7 +14,6 @@ tmpdir.refresh(); const dest = path.resolve(tmpDir, 'tmp.txt'); const otherDest = path.resolve(tmpDir, 'tmp-2.txt'); const buffer = Buffer.from('abc'.repeat(1000)); -const buffer2 = Buffer.from('xyz'.repeat(1000)); const stream = Readable.from(['a', 'b', 'c']); const stream2 = Readable.from(['ümlaut', ' ', 'sechzig']); const iterable = { @@ -26,7 +25,7 @@ const iterable = { } }; -const veryLargeBuffer = { +const veryLargeIterable = { expected: 'dogs running'.repeat(512 * 1024), *[Symbol.iterator]() { yield Buffer.from('dogs running'.repeat(512 * 1024), 'utf8'); @@ -57,7 +56,15 @@ const asyncIterable = { } }; -async function doWrite() { +async function doWriteString() { + const string = 'x~yz'.repeat(100); + await fsPromises.writeFile(dest, string); + const data = fs.readFileSync(dest); + const stringAsBuffer = Buffer.from(string, 'utf8'); + assert.deepStrictEqual(stringAsBuffer, data); +} + +async function doWriteBuffer() { await fsPromises.writeFile(dest, buffer); const data = fs.readFileSync(dest); assert.deepStrictEqual(data, buffer); @@ -115,10 +122,10 @@ async function doWriteAsyncIterable() { assert.deepStrictEqual(data, asyncIterable.expected); } -async function doWriteAsyncLargeIterable() { - await fsPromises.writeFile(dest, veryLargeBuffer); +async function doWriteLargeIterable() { + await fsPromises.writeFile(dest, veryLargeIterable); const data = fs.readFileSync(dest, 'utf-8'); - assert.deepStrictEqual(data, veryLargeBuffer.expected); + assert.deepStrictEqual(data, veryLargeIterable.expected); } async function doWriteInvalidValues() { @@ -131,7 +138,7 @@ async function doWriteInvalidValues() { ); } -async function doWriteWithCancel() { +async function doWriteBufferAndCancel() { const controller = new AbortController(); const { signal } = controller; process.nextTick(() => controller.abort()); @@ -141,32 +148,22 @@ async function doWriteWithCancel() { ); } -async function doAppend() { - await fsPromises.appendFile(dest, buffer2, { flag: null }); - const data = fs.readFileSync(dest); - const buf = Buffer.concat([buffer, buffer2]); - assert.deepStrictEqual(buf, data); -} - -async function doRead() { - const data = await fsPromises.readFile(dest); - const buf = fs.readFileSync(dest); - assert.deepStrictEqual(buf, data); -} +async function doWriteTypedArrays() { + for (const Constructor of [Uint8Array, Uint16Array, Uint32Array]) { + // Use a file size larger than `kReadFileMaxChunkSize`. + const buffer = Buffer.from('012'.repeat(2 ** 14)); -async function doReadWithEncoding() { - const data = await fsPromises.readFile(dest, 'utf-8'); - const syncData = fs.readFileSync(dest, 'utf-8'); - assert.strictEqual(typeof data, 'string'); - assert.deepStrictEqual(data, syncData); + const array = new Constructor(buffer.buffer); + await fsPromises.writeFile(dest, array); + const data = await fsPromises.readFile(dest); + assert.deepStrictEqual(data, buffer); + } } (async () => { - await doWrite(); - await doWriteWithCancel(); - await doAppend(); - await doRead(); - await doReadWithEncoding(); + await doWriteBuffer(); + await doWriteBufferAndCancel(); + await doWriteString(); await doWriteStream(); await doWriteStreamWithCancel(); await doWriteIterable(); @@ -174,6 +171,7 @@ async function doReadWithEncoding() { await doWriteIterableWithEncoding(); await doWriteBufferIterable(); await doWriteAsyncIterable(); - await doWriteAsyncLargeIterable(); + await doWriteLargeIterable(); await doWriteInvalidValues(); + await doWriteTypedArrays(); })().then(common.mustCall()); diff --git a/test/parallel/test-http-agent-false.js b/test/parallel/test-http-agent-false.js index 2f4505ef66ef..64f021a9e7bd 100644 --- a/test/parallel/test-http-agent-false.js +++ b/test/parallel/test-http-agent-false.js @@ -35,7 +35,7 @@ const opts = { }; // We just want an "error" (no local HTTP server on port 80) or "response" -// to happen (user happens ot have HTTP server running on port 80). +// to happen (user happens to have HTTP server running on port 80). // As long as the process doesn't crash from a C++ assertion then we're good. const req = http.request(opts); diff --git a/test/parallel/test-http-client-highwatermark.js b/test/parallel/test-http-client-highwatermark.js new file mode 100644 index 000000000000..b36d6dc54bb0 --- /dev/null +++ b/test/parallel/test-http-client-highwatermark.js @@ -0,0 +1,81 @@ +// Flags: --expose-internals +'use strict'; + +// Regression test: http.request({ highWaterMark }) must propagate the value +// to OutgoingMessage's kHighWaterMark so that _writeRaw() Path B (buffering +// before socket connects) uses the correct threshold. +// +// Without the fix: +// - write() returns the wrong boolean (compares against default 64KB) +// - On Node >= 24.16.0 (post #62936), this causes a deadlock when +// the user awaits 'drain' after write() incorrectly returns false. +// +// Fixes: https://github.com/nodejs/node/issues/64645 + +const common = require('../common'); +const assert = require('assert'); +const http = require('http'); +const { kHighWaterMark } = require('_http_outgoing'); +const { getDefaultHighWaterMark } = require('internal/streams/state'); + +const server = http.createServer(common.mustCall((req, res) => { + req.resume(); + req.on('end', () => res.end('ok')); +}, 3)); + +server.listen(0, common.mustCall(() => { + const port = server.address().port; + let completed = 0; + + function done() { + if (++completed === 3) server.close(); + } + + // Test 1: kHighWaterMark is set to user value on the ClientRequest. + { + const hwm = getDefaultHighWaterMark() * 2; + const req = http.request({ port, method: 'POST', highWaterMark: hwm }); + assert.strictEqual(req[kHighWaterMark], hwm); + req.end(); + req.on('response', (res) => { res.resume(); res.on('end', done); }); + } + + // Test 2: Large HWM — write below threshold returns true before socket connects. + { + const req = http.request({ + port, + method: 'POST', + highWaterMark: 100_000, + }, common.mustCall((res) => { + res.resume(); + res.on('end', done); + })); + + // 64KB write in the same tick — socket not yet connected (Path B). + // With HWM=100KB, write() must return true. + const result = req.write(Buffer.alloc(64 * 1024)); + assert.strictEqual(result, true); + req.end(); + } + + // Test 3: Small HWM — write above threshold returns false, drain fires. + { + const req = http.request({ + port, + method: 'POST', + highWaterMark: 512, + }, common.mustCall((res) => { + res.resume(); + res.on('end', done); + })); + + // 2KB write in the same tick — exceeds HWM of 512 bytes. + const result = req.write(Buffer.alloc(2 * 1024)); + assert.strictEqual(result, false); + + // Drain must fire (no deadlock) so we can complete the request. + req.on('drain', common.mustCall(() => { + req.end(); + })); + } +})); diff --git a/test/parallel/test-http-keep-alive-empty-line.mjs b/test/parallel/test-http-keep-alive-empty-line.mjs index c7096096440d..e212c5d704c1 100644 --- a/test/parallel/test-http-keep-alive-empty-line.mjs +++ b/test/parallel/test-http-keep-alive-empty-line.mjs @@ -3,7 +3,7 @@ import assert from 'node:assert'; import { createServer } from 'node:http'; import { connect } from 'node:net'; -// This test ensures that data like an empty line (`\r\n`) recevied by the +// This test ensures that data like an empty line (`\r\n`) received by the // server after a request, does not reset the keep-alive timeout. See // https://github.com/nodejs/node/issues/58140. diff --git a/test/parallel/test-http-odd-hex-write.js b/test/parallel/test-http-odd-hex-write.js new file mode 100644 index 000000000000..a0e44377ece7 --- /dev/null +++ b/test/parallel/test-http-odd-hex-write.js @@ -0,0 +1,91 @@ +'use strict'; + +const common = require('../common'); +const assert = require('node:assert'); +const http = require('node:http'); +const net = require('node:net'); + +// Regression test for https://github.com/nodejs/node/issues/45150 +// Writing an odd-length hex string to a stream that batches writes via +// Writev (e.g. HTTP requests that are automatically corked) used to +// fatal-assert in StringBytes::StorageSize. The trailing incomplete nibble +// should be silently dropped, consistent with non-Writev paths. + +// Test 1: HTTP POST with a single odd-length hex write. +// "1" has no complete bytes in hex encoding, so the request body is empty. +{ + const server = http.createServer(common.mustCall((req, res) => { + const chunks = []; + req.on('data', (chunk) => chunks.push(chunk)); + req.on('end', common.mustCall(() => { + assert.strictEqual(Buffer.concat(chunks).length, 0); + res.end(); + server.close(); + })); + })); + + server.listen(0, common.mustCall(() => { + const req = http.request({ + port: server.address().port, + method: 'POST', + }, common.mustCall((res) => { + res.resume(); + })); + req.write('1', 'hex'); + req.end(); + })); +} + +// Test 2: HTTP POST with cork/uncork and mixed odd-length hex writes. +// "ff1" (3 hex chars) decodes to 1 byte (0xff); the trailing "1" nibble is +// dropped. "1" (1 hex char) decodes to 0 bytes. +{ + const server = http.createServer(common.mustCall((req, res) => { + const chunks = []; + req.on('data', (chunk) => chunks.push(chunk)); + req.on('end', common.mustCall(() => { + assert.deepStrictEqual(Buffer.concat(chunks), Buffer.from([0xff])); + res.end(); + server.close(); + })); + })); + + server.listen(0, common.mustCall(() => { + const req = http.request({ + port: server.address().port, + method: 'POST', + }, common.mustCall((res) => { + res.resume(); + })); + req.cork(); + req.write('ff1', 'hex'); + req.write('1', 'hex'); + req.uncork(); + req.end(); + })); +} + +// Test 3: net socket with cork/uncork and an odd-length hex write. +// Exercises the Writev path directly at the net layer. +{ + const server = net.createServer(common.mustCall((socket) => { + const chunks = []; + socket.on('data', (chunk) => chunks.push(chunk)); + socket.on('end', common.mustCall(() => { + assert.deepStrictEqual(Buffer.concat(chunks), Buffer.from([0xff])); + server.close(); + })); + socket.resume(); + })); + + server.listen(0, common.mustCall(() => { + const conn = net.createConnection(server.address().port); + conn.on('connect', common.mustCall(() => { + conn.cork(); + conn.write('ff', 'hex'); + conn.write('1', 'hex'); + conn.uncork(); + conn.end(); + })); + })); +} diff --git a/test/parallel/test-http-outgoing-end-multiple.js b/test/parallel/test-http-outgoing-end-multiple.js index 696443f9390c..5463485f4061 100644 --- a/test/parallel/test-http-outgoing-end-multiple.js +++ b/test/parallel/test-http-outgoing-end-multiple.js @@ -10,8 +10,10 @@ const onWriteAfterEndError = common.mustCall((err) => { const server = http.createServer(common.mustCall(function(req, res) { res.end('testing ended state', common.mustCall()); assert.strictEqual(res.writableCorked, 0); + // end() before 'finish' has been emitted queues the callback, which then + // reports the outcome of the flush, matching stream.Writable. res.end(common.mustCall((err) => { - assert.strictEqual(err.code, 'ERR_STREAM_ALREADY_FINISHED'); + assert.strictEqual(err, null); })); assert.strictEqual(res.writableCorked, 0); res.end('end', onWriteAfterEndError); diff --git a/test/parallel/test-http-outgoing-writableFinished.js b/test/parallel/test-http-outgoing-writableFinished.js index 6f84d91e7147..36257e0ea243 100644 --- a/test/parallel/test-http-outgoing-writableFinished.js +++ b/test/parallel/test-http-outgoing-writableFinished.js @@ -2,31 +2,130 @@ const common = require('../common'); const assert = require('assert'); const http = require('http'); +const { Duplex } = require('stream'); -const server = http.createServer(common.mustCall(function(req, res) { - assert.strictEqual(res.writableFinished, false); - res - .on('finish', common.mustCall(() => { - assert.strictEqual(res.writableFinished, true); - server.close(); - })) - .end(); -})); - -server.listen(0); - -server.on('listening', common.mustCall(function() { - const clientRequest = http.request({ - port: server.address().port, - method: 'GET', - path: '/' +// writableFinished becomes true once all data has been flushed, immediately +// before 'finish' is emitted. +{ + const server = http.createServer(common.mustCall(function(req, res) { + assert.strictEqual(res.writableFinished, false); + res + .on('finish', common.mustCall(() => { + assert.strictEqual(res.writableFinished, true); + server.close(); + })) + .end(); + })); + + server.listen(0); + + server.on('listening', common.mustCall(function() { + const clientRequest = http.request({ + port: server.address().port, + method: 'GET', + path: '/' + }); + + assert.strictEqual(clientRequest.writableFinished, false); + clientRequest + .on('finish', common.mustCall(() => { + assert.strictEqual(clientRequest.writableFinished, true); + })) + .end(); + assert.strictEqual(clientRequest.writableFinished, false); + })); +} + +// A request whose writes fail never becomes writableFinished and never emits +// 'finish'; the end() callback receives the write error instead. +{ + const writeError = new Error('forced write failure'); + const socket = new Duplex({ + read() {}, + write(chunk, encoding, callback) { + callback(writeError); + }, }); + const failedRequest = http.request({ + createConnection: common.mustCall(() => socket), + method: 'POST', + }); + + failedRequest.on('finish', common.mustNotCall()); + failedRequest.on('error', common.mustCall((err) => { + assert.strictEqual(err, writeError); + })); + failedRequest.on('close', common.mustCall(() => { + assert.strictEqual(failedRequest.writableFinished, false); + })); + + failedRequest.write('body', common.mustCall((err) => { + assert.strictEqual(err, writeError); + })); + failedRequest.end(common.mustCall((err) => { + assert.ok(err instanceof Error); + assert.strictEqual(failedRequest.writableFinished, false); + + // Ending again after the flush has failed still reports the failure. + failedRequest.end(common.mustCall((endAgainErr) => { + assert.strictEqual(endAgainErr, err); + })); + })); +} + +// The same for a server response whose flush fails (e.g. the connection is +// reset mid-flush). Unlike the client case, the error here only ever +// surfaces through the socket write callbacks. +{ + const writeError = new Error('forced write failure'); + const socket = new Duplex({ + read() {}, + write(chunk, encoding, callback) { + callback(writeError); + }, + }); + + const server = http.createServer(common.mustCall((req, res) => { + res.on('finish', common.mustNotCall()); + res.on('close', common.mustCall(() => { + assert.strictEqual(res.writableFinished, false); + })); + res.end('hello', common.mustCall((err) => { + assert.strictEqual(err, writeError); + assert.strictEqual(res.writableFinished, false); + })); + })); + + server.emit('connection', socket); + socket.push('GET / HTTP/1.1\r\nHost: example.com\r\n\r\n'); +} + +// The same when end() happens after the failed write, with no data left to +// flush: the write failure must still be detected even though end() itself +// has nothing to send. +{ + const writeError = new Error('forced write failure'); + const socket = new Duplex({ + read() {}, + write(chunk, encoding, callback) { + callback(writeError); + }, + }); + + const server = http.createServer(common.mustCall((req, res) => { + res.on('finish', common.mustNotCall()); + res.setHeader('Content-Length', '5'); + res.write('hello', common.mustCall((err) => { + assert.strictEqual(err, writeError); + })); + setImmediate(common.mustCall(() => { + res.end(common.mustCall((err) => { + assert.strictEqual(err, writeError); + assert.strictEqual(res.writableFinished, false); + })); + })); + })); - assert.strictEqual(clientRequest.writableFinished, false); - clientRequest - .on('finish', common.mustCall(() => { - assert.strictEqual(clientRequest.writableFinished, true); - })) - .end(); - assert.strictEqual(clientRequest.writableFinished, false); -})); + server.emit('connection', socket); + socket.push('GET / HTTP/1.1\r\nHost: example.com\r\n\r\n'); +} diff --git a/test/parallel/test-http-perf_hooks.js b/test/parallel/test-http-perf_hooks.js index 9acf54c5617b..674bb591f0cb 100644 --- a/test/parallel/test-http-perf_hooks.js +++ b/test/parallel/test-http-perf_hooks.js @@ -36,16 +36,18 @@ const server = http.Server(common.mustCall((req, res) => { })); }, 2)); +let port; server.listen(0, common.mustCall(async () => { + port = server.address().port; await Promise.all([ makeRequest({ - port: server.address().port, + port, path: '/', method: 'POST', data: expected }), makeRequest({ - port: server.address().port, + port, path: '/', method: 'POST', data: expected @@ -63,14 +65,17 @@ process.on('exit', () => { assert.strictEqual(typeof entry.duration, 'number'); if (entry.name === 'HttpClient') { numberOfHttpClients++; + // The reported URL must include the port when it is non-default. + // Refs: https://github.com/nodejs/node/issues/59625 + assert.strictEqual(entry.detail.req.url, `http://localhost:${port}/`); } else if (entry.name === 'HttpRequest') { numberOfHttpRequests++; + assert.strictEqual(entry.detail.req.url, '/'); } - assert.strictEqual(typeof entry.detail.req.method, 'string'); - assert.strictEqual(typeof entry.detail.req.url, 'string'); + assert.strictEqual(entry.detail.req.method, 'POST'); assert.strictEqual(typeof entry.detail.req.headers, 'object'); - assert.strictEqual(typeof entry.detail.res.statusCode, 'number'); - assert.strictEqual(typeof entry.detail.res.statusMessage, 'string'); + assert.strictEqual(entry.detail.res.statusCode, 200); + assert.strictEqual(entry.detail.res.statusMessage, 'OK'); assert.strictEqual(typeof entry.detail.res.headers, 'object'); } assert.strictEqual(numberOfHttpClients, 2); diff --git a/test/parallel/test-http-request-signal.js b/test/parallel/test-http-request-signal.js index b7c9fdc79e83..5b9fd17c433e 100644 --- a/test/parallel/test-http-request-signal.js +++ b/test/parallel/test-http-request-signal.js @@ -4,7 +4,7 @@ const common = require('../common'); const assert = require('assert'); const http = require('http'); -// Test 1: req.signal is an AbortSignal and aborts on 'close' +// Test 1: req.signal is an AbortSignal and aborts on socket close { const server = http.createServer(common.mustCall((req, res) => { assert.ok(req.signal instanceof AbortSignal); @@ -21,21 +21,68 @@ const http = require('http'); })); } -// Test 2: req.signal is aborted if accessed after destroy +// Test 2: req.signal is not aborted when a request body completes normally. +{ + const body = JSON.stringify({ hello: 'world' }); + const server = http.createServer(common.mustCall((req, res) => { + assert.ok(req.signal instanceof AbortSignal); + assert.strictEqual(req.signal.aborted, false); + req.signal.onabort = common.mustNotCall(); + + req.on('close', common.mustCall(() => { + assert.strictEqual(req.aborted, false); + assert.strictEqual(req.complete, true); + assert.strictEqual(req.signal.aborted, false); + })); + + req.on('end', common.mustCall(() => { + setTimeout(common.mustCall(() => { + assert.strictEqual(req.aborted, false); + assert.strictEqual(req.complete, true); + assert.strictEqual(req.signal.aborted, false); + res.end('ok'); + }), 10); + })); + req.resume(); + })); + + server.listen(0, common.mustCall(() => { + const clientReq = http.request( + { + port: server.address().port, + method: 'PATCH', + path: '/tables/1', + headers: { + 'content-type': 'application/json', + 'content-length': Buffer.byteLength(body), + }, + }, + common.mustCall((res) => { + res.resume(); + res.on('end', common.mustCall(() => { + server.close(); + })); + }), + ); + clientReq.end(body); + })); +} + +// Test 3: req.signal is aborted if accessed after destroy { const req = new http.IncomingMessage(null); req.destroy(); assert.strictEqual(req.signal.aborted, true); } -// Test 3: Multiple accesses return the same signal +// Test 4: Multiple accesses return the same signal { const req = new http.IncomingMessage(null); assert.strictEqual(req.signal, req.signal); } -// Test 4: res.signal on a client-side http.request() response (IncomingMessage). +// Test 5: res.signal on a client-side http.request() response (IncomingMessage). { const server = http.createServer(common.mustCall((req, res) => { res.writeHead(200); @@ -61,7 +108,36 @@ const http = require('http'); })); } -// Test 5: Client cancels a pending request. +// Test 6: res.signal is not aborted when a response body completes normally. +{ + const server = http.createServer(common.mustCall((req, res) => { + res.end('ok'); + })); + + server.listen(0, common.mustCall(() => { + const clientReq = http.request( + { port: server.address().port }, + common.mustCall((res) => { + assert.ok(res.signal instanceof AbortSignal); + assert.strictEqual(res.signal.aborted, false); + res.signal.onabort = common.mustNotCall(); + + res.resume(); + res.on('end', common.mustCall(() => { + assert.strictEqual(res.complete, true); + assert.strictEqual(res.signal.aborted, false); + })); + res.on('close', common.mustCall(() => { + assert.strictEqual(res.signal.aborted, false); + server.close(); + })); + }), + ); + clientReq.end(); + })); +} + +// Test 7: Client cancels a pending request. { const server = http.createServer(common.mustCall((req, res) => { req.signal.onabort = common.mustCall(() => { diff --git a/test/parallel/test-http-server-consumed-timeout.js b/test/parallel/test-http-server-consumed-timeout.js index b1781913b568..683421394a0f 100644 --- a/test/parallel/test-http-server-consumed-timeout.js +++ b/test/parallel/test-http-server-consumed-timeout.js @@ -7,7 +7,7 @@ const http = require('http'); const durationBetweenIntervals = []; let timeoutTooShort = false; -const TIMEOUT = common.platformTimeout(200); +const TIMEOUT = common.platformTimeout(1000); const INTERVAL = Math.floor(TIMEOUT / 8); runTest(TIMEOUT); diff --git a/test/parallel/test-http-server-invalid-headers-timeout-no-abort.js b/test/parallel/test-http-server-invalid-headers-timeout-no-abort.js new file mode 100644 index 000000000000..fc0a7041be93 --- /dev/null +++ b/test/parallel/test-http-server-invalid-headers-timeout-no-abort.js @@ -0,0 +1,19 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { createServer } = require('http'); + +const server = createServer({ + connectionsCheckingInterval: 1, +}, common.mustNotCall()); + +// Invalid headersTimeout should not crash the server +server.headersTimeout = 'im-not-a-number'; +assert.strictEqual(server.headersTimeout, 'im-not-a-number'); + +server.listen(0, '127.0.0.1', common.mustCall(() => { + setTimeout(common.mustCall(() => { + server.close(common.mustCall()); + }), common.platformTimeout(50)); +})); diff --git a/test/parallel/test-http2-origin-set-max-size.mjs b/test/parallel/test-http2-origin-set-max-size.mjs index 08bdf1ed7f97..53cadb797a18 100644 --- a/test/parallel/test-http2-origin-set-max-size.mjs +++ b/test/parallel/test-http2-origin-set-max-size.mjs @@ -22,10 +22,6 @@ const cert = fixtures.readKey('agent8-cert.pem', 'binary'); const ca = fixtures.readKey('fake-startcom-root-cert.pem', 'binary'); const server = createSecureServer({ key, cert }); -server.on('stream', (stream) => { - stream.respond(); - stream.end('ok'); -}); server.on('session', (session) => { let i = 0; const timer = setInterval(() => { @@ -72,8 +68,6 @@ await new Promise((resolve) => { })); client.on('goaway', mustNotCall()); client.on('close', resolve); - - client.request().resume(); }); // Test non-default values @@ -86,8 +80,6 @@ await Promise.all([-0, 9, 1.5].map((maxOriginSetSize) => new Promise((resolve) = })); client.on('goaway', mustNotCall()); client.on('close', resolve); - - client.request().resume(); }))); @@ -103,8 +95,6 @@ await Promise.all([512, Infinity].map((maxOriginSetSize) => new Promise((resolve client.on('error', mustNotCall()); client.on('goaway', mustNotCall()); client.on('close', resolve); - - client.request().resume(); }))); server.close(); diff --git a/test/parallel/test-http2-socket-proxy-destroy.js b/test/parallel/test-http2-socket-proxy-destroy.js new file mode 100644 index 000000000000..aa932067f8ef --- /dev/null +++ b/test/parallel/test-http2-socket-proxy-destroy.js @@ -0,0 +1,61 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); +const assert = require('assert'); +const h2 = require('http2'); +const Countdown = require('../common/countdown'); + +// Calling .destroy() on the socket proxy must not throw +// (previously threw ERR_HTTP2_NO_SOCKET_MANIPULATION) and must +// destroy the Http2Session and the underlying socket. + +const server = h2.createServer(); + +server.on('stream', common.mustCall(function(stream) { + stream.respond(); + stream.end('ok'); +}, 2)); + +const countdown = new Countdown(2, () => server.close()); + +server.listen(0, common.mustCall(() => { + const port = server.address().port; + + // Test destroy() without an error. + { + const client = h2.connect(`http://localhost:${port}`); + const request = client.request(); + request.resume(); + request.on('close', common.mustCall(() => { + const socket = client.socket; + socket.destroy(); + assert.strictEqual(client.destroyed, true); + client.on('close', common.mustCall(() => { + assert.strictEqual(client.socket, undefined); + // Destroying again through a stale proxy reference must not throw. + socket.destroy(); + countdown.dec(); + })); + })); + client.on('error', common.mustNotCall()); + } + + // Test destroy() with an error. + { + const client = h2.connect(`http://localhost:${port}`); + const request = client.request(); + request.resume(); + request.on('close', common.mustCall(() => { + client.socket.destroy(new Error('boom')); + assert.strictEqual(client.destroyed, true); + })); + client.on('error', common.mustCall((err) => { + assert.strictEqual(err.message, 'boom'); + })); + client.on('close', common.mustCall(() => { + countdown.dec(); + })); + } +})); diff --git a/test/parallel/test-http2-socket-proxy.js b/test/parallel/test-http2-socket-proxy.js index 3294cf7ccb90..37f294742a28 100644 --- a/test/parallel/test-http2-socket-proxy.js +++ b/test/parallel/test-http2-socket-proxy.js @@ -52,7 +52,8 @@ server.on('stream', common.mustCall(function(stream, headers) { assert(inspectedTimersList.includes(' _idleNext: [Timeout]')); assert(!inspectedTimersList.includes(' _idleNext: [Timeout]')); - assert.throws(() => socket.destroy, errMsg); + assert.strictEqual(typeof socket.destroy, 'function'); + assert.throws(() => socket.emit, errMsg); assert.throws(() => socket.end, errMsg); assert.throws(() => socket.pause, errMsg); @@ -63,7 +64,6 @@ server.on('stream', common.mustCall(function(stream, headers) { assert.throws(() => socket.setKeepAlive, errMsg); assert.throws(() => socket.setNoDelay, errMsg); - assert.throws(() => (socket.destroy = undefined), errMsg); assert.throws(() => (socket.emit = undefined), errMsg); assert.throws(() => (socket.end = undefined), errMsg); assert.throws(() => (socket.pause = undefined), errMsg); diff --git a/test/parallel/test-https-snicallback-override.js b/test/parallel/test-https-snicallback-override.js new file mode 100644 index 000000000000..5ecebd8d38e5 --- /dev/null +++ b/test/parallel/test-https-snicallback-override.js @@ -0,0 +1,71 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); + +const assert = require('assert'); +const { X509Certificate } = require('crypto'); +const https = require('https'); +const tls = require('tls'); +const fixtures = require('../common/fixtures'); + +const defaultCredentials = { + cert: fixtures.readKey('ca5-cert.pem'), + key: fixtures.readKey('ca5-key.pem'), +}; +const sniCredentials = { + cert: fixtures.readKey('agent1-cert.pem'), + key: fixtures.readKey('agent1-key.pem'), +}; + +const defaultCertificate = new X509Certificate(defaultCredentials.cert); +const sniCertificate = new X509Certificate(sniCredentials.cert); +const sniContext = tls.createSecureContext(sniCredentials); + +function request(port, servername, expectedCertificate) { + return new Promise((resolve, reject) => { + const req = https.get({ + host: '127.0.0.1', + port, + servername, + rejectUnauthorized: false, + agent: false, + }, common.mustCall((response) => { + try { + const certificate = response.socket.getPeerX509Certificate(); + assert.strictEqual(certificate.fingerprint256, + expectedCertificate.fingerprint256); + } catch (err) { + reject(err); + return; + } + + response.resume(); + response.once('end', resolve); + response.once('error', reject); + })); + req.once('error', reject); + }); +} + +const server = https.createServer({ + cert: defaultCredentials.cert, + key: defaultCredentials.key, + SNICallback: common.mustCall((servername, callback) => { + assert.strictEqual(servername, 'agent1.com'); + callback(null, sniContext); + }, 1), +}, (_request, response) => { + response.end('ok'); +}); + +server.listen(0, common.mustCall(async () => { + try { + const { port } = server.address(); + await request(port, undefined, defaultCertificate); + await request(port, 'agent1.com', sniCertificate); + } finally { + server.close(common.mustCall()); + } +})); diff --git a/test/parallel/test-inspector-emit-protocol-event.js b/test/parallel/test-inspector-emit-protocol-event.js index 567c92e3eeba..7cb2135435f9 100644 --- a/test/parallel/test-inspector-emit-protocol-event.js +++ b/test/parallel/test-inspector-emit-protocol-event.js @@ -194,7 +194,7 @@ for (const [domain, events] of Object.entries(EXPECTED_EVENTS)) { } } - // Check tht no events are emitted after disabling the domain. + // Check that no events are emitted after disabling the domain. await session.post('Network.disable'); session.on('Network.requestWillBeSent', common.mustNotCall()); inspector.Network.requestWillBeSent({}); diff --git a/test/parallel/test-mime-api.js b/test/parallel/test-mime-api.js index 30272e5aa64d..dffead31850b 100644 --- a/test/parallel/test-mime-api.js +++ b/test/parallel/test-mime-api.js @@ -158,3 +158,30 @@ assert.throws(() => params.set(`x${NOT_HTTP_TOKEN_CODE_POINT}`, 'x'), /parameter assert.throws(() => params.set('x', `${NOT_HTTP_QUOTED_STRING_CODE_POINT};`), /parameter value/i); assert.throws(() => params.set('x', `${NOT_HTTP_QUOTED_STRING_CODE_POINT}x`), /parameter value/i); assert.throws(() => params.set('x', `x${NOT_HTTP_QUOTED_STRING_CODE_POINT}`), /parameter value/i); + +// MIME parameter names are case-insensitive. The parser lower-cases them, so +// the MIMEParams accessors must lower-case their argument too; otherwise a +// parsed parameter is unreachable by the casing the caller actually used and +// `set()` can create case-colliding duplicate parameters. +// Refs: https://mimesniff.spec.whatwg.org/ (parameter names are ASCII-lowercased) +{ + const mime = new MIMEType('text/plain;Charset=value'); + assert.strictEqual(mime.params.get('Charset'), 'value'); + assert.strictEqual(mime.params.get('charset'), 'value'); + assert.strictEqual(mime.params.get('CHARSET'), 'value'); + assert.strictEqual(mime.params.has('Charset'), true); + assert.strictEqual(`${mime.params}`, 'charset=value'); + + // `set()` with a mixed-case name overwrites the same parameter rather than + // adding a second, case-colliding one. + const params = new MIMEType('text/plain').params; + params.set('Foo', 'a'); + params.set('foo', 'b'); + assert.deepStrictEqual([...params], [['foo', 'b']]); + assert.strictEqual(`${params}`, 'foo=b'); + + // `delete()` is case-insensitive as well. + params.delete('FOO'); + assert.strictEqual(params.has('foo'), false); + assert.deepStrictEqual([...params], []); +} diff --git a/test/parallel/test-net-boundsocket.js b/test/parallel/test-net-boundsocket.js index c987faca0e9e..2d11d0d4ba83 100644 --- a/test/parallel/test-net-boundsocket.js +++ b/test/parallel/test-net-boundsocket.js @@ -1,7 +1,12 @@ 'use strict'; const common = require('../common'); const assert = require('assert'); +const fs = require('fs'); const net = require('net'); +const tmpdir = require('../common/tmpdir'); +tmpdir.refresh(); + +const isLinux = process.platform === 'linux'; // Constructing a BoundSocket binds synchronously and address() reports the // resolved address, including the OS-assigned ephemeral port when port is 0. @@ -178,6 +183,42 @@ if (!common.isWindows && process.getuid() !== 0) { client.destroy(); } +// Adopted BoundSocket: connect(2) is synchronous, so localAddress/localPort +// resolve to the concrete source in-tick, before the 'connect' event. +{ + const server = net.createServer(); + server.listen(0, '127.0.0.1', common.mustCall(() => { + const serverPort = server.address().port; + const bound = new net.BoundSocket({ host: '127.0.0.1', port: 0 }); + const localPort = bound.address().port; + const client = new net.Socket({ handle: bound }); + + client.connect({ host: '127.0.0.1', port: serverPort }); + + assert.strictEqual(client.localAddress, '127.0.0.1'); + assert.strictEqual(client.localPort, localPort); + + client.on('connect', common.mustCall(() => { + assert.strictEqual(client.localAddress, '127.0.0.1'); + assert.strictEqual(client.localPort, localPort); + client.destroy(); + server.close(); + })); + })); +} + +// A connect failure is reported via a deferred 'error' event, never thrown +// synchronously. An IPv4-bound handle connecting to an IPv6 literal fails on +// address family mismatch. +{ + const bound = new net.BoundSocket({ host: '127.0.0.1', port: 0 }); + const client = new net.Socket({ handle: bound }); + client.connect({ host: '::1', port: 1 }); + client.on('error', common.mustCall((err) => { + assert.strictEqual(err.syscall, 'connect'); + })); +} + // reusePort: SO_REUSEPORT permits multiple listeners on the same port. Support // is platform-dependent, so probe first. { @@ -204,6 +245,185 @@ if (!common.isWindows && process.getuid() !== 0) { } } +// The isPipe getter's presence on the prototype is the capability signal that +// this build honors { path }; the value discriminates pipe from TCP binds. +assert.ok('isPipe' in net.BoundSocket.prototype); +{ + const tcpBound = new net.BoundSocket({ port: 0 }); + assert.strictEqual(tcpBound.isPipe, false); + tcpBound.close(); +} + +// The path option is mutually exclusive with the TCP options. +for (const extra of [{ host: '127.0.0.1' }, { port: 0 }, { ipv6Only: true }, + { reusePort: true }]) { + assert.throws( + () => new net.BoundSocket({ path: common.PIPE, ...extra }), + { code: 'ERR_INVALID_ARG_VALUE' }); +} + +// A non-string path is rejected. +assert.throws(() => new net.BoundSocket({ path: 1234 }), + { code: 'ERR_INVALID_ARG_TYPE' }); + +// Pipe bind is synchronous: address() returns the bound path, and a second +// bind to the same path throws EADDRINUSE in the constructor. +{ + const path = `${common.PIPE}-addr`; + const bound = new net.BoundSocket({ path }); + assert.strictEqual(bound.isPipe, true); + assert.strictEqual(bound.address(), path); + assert.throws(() => new net.BoundSocket({ path }), + { code: 'EADDRINUSE', syscall: 'bind' }); + bound.close(); +} + +// Server adoption: server.listen(boundSocket) over a path, client +// net.connect({ path }) round-trips, and the connection is a pipe. +{ + const path = `${common.PIPE}-server`; + const bound = new net.BoundSocket({ path }); + + const server = net.createServer(common.mustCall((socket) => { + assert.strictEqual(socket.remoteFamily, undefined); + socket.on('data', common.mustCall((data) => { + assert.strictEqual(data.toString(), 'ping'); + socket.end('pong'); + })); + })); + + server.listen(bound, common.mustCall(() => { + assert.strictEqual(server.address(), path); + assert.throws(() => bound.address(), { code: 'ERR_SOCKET_HANDLE_ADOPTED' }); + + const client = net.connect({ path }, () => { + client.end('ping'); + }); + client.on('data', common.mustCall((data) => { + assert.strictEqual(data.toString(), 'pong'); + })); + client.on('close', common.mustCall(() => server.close())); + })); +} + +// Client adoption of a bound source pipe: after connect(), localAddress +// reflects the bound source path. Binding a client to a source path is a +// POSIX unix-domain concept. +if (!common.isWindows) { + const srcPath = `${common.PIPE}-src`; + const dstPath = `${common.PIPE}-dst`; + + const server = net.createServer(common.mustCall((socket) => { + socket.on('data', common.mustCall((data) => { + assert.strictEqual(data.toString(), 'ping'); + socket.end('pong'); + })); + })); + + const dst = new net.BoundSocket({ path: dstPath }); + server.listen(dst, common.mustCall(() => { + const src = new net.BoundSocket({ path: srcPath }); + assert.strictEqual(src.address(), srcPath); + + const client = new net.Socket({ handle: src }); + client.connect({ path: dstPath }); + + assert.strictEqual(client.localAddress, srcPath); + + client.on('connect', common.mustCall(() => { + assert.strictEqual(client.localAddress, srcPath); + client.end('ping'); + })); + client.on('data', common.mustCall((data) => { + assert.strictEqual(data.toString(), 'pong'); + })); + client.on('close', common.mustCall(() => server.close())); + })); +} + +// Reconnecting an adopted pipe BoundSocket after destroy: the adopted handle is +// gone, so pipe-ness must come from the path option rather than the (now null) +// handle, otherwise connect() would wrongly attempt a TCP connect. +if (!common.isWindows) { + const path = `${common.PIPE}-reconnect`; + + const server = net.createServer(common.mustCall((socket) => { + socket.on('data', (data) => socket.end(data)); + }, 2)); + + const bound = new net.BoundSocket({ path: `${path}-src` }); + server.listen(path, common.mustCall(() => { + const client = new net.Socket({ handle: bound }); + client.connect({ path }); + client.once('connect', common.mustCall(() => { + client.end('ping'); + client.once('data', common.mustCall((data) => { + assert.strictEqual(data.toString(), 'ping'); + })); + client.once('close', common.mustCall(() => { + // The adopted handle is gone; reconnect must still be a pipe. + client.connect({ path }); + client.once('connect', common.mustCall(() => { + client.end('pong'); + client.once('data', common.mustCall((data) => { + assert.strictEqual(data.toString(), 'pong'); + })); + client.once('close', common.mustCall(() => server.close())); + })); + })); + })); + })); +} + +// Linux abstract namespace: a leading '\0' binds without creating a filesystem +// entry, and still listens/connects. +if (isLinux) { + const abstractPath = `\0node-test-boundsocket.${process.pid}`; + const bound = new net.BoundSocket({ path: abstractPath }); + assert.strictEqual(bound.address(), abstractPath); + + const server = net.createServer(common.mustCall((socket) => { + socket.on('data', common.mustCall((data) => { + assert.strictEqual(data.toString(), 'ping'); + socket.end('pong'); + })); + })); + + server.listen(bound, common.mustCall(() => { + // No filesystem entry is created for an abstract socket. + assert.ok(!fs.existsSync(abstractPath.slice(1))); + + const client = net.connect({ path: abstractPath }, () => { + client.end('ping'); + }); + client.on('data', common.mustCall((data) => { + assert.strictEqual(data.toString(), 'pong'); + })); + client.on('close', common.mustCall(() => server.close())); + })); +} + +// An abstract path on a non-Linux platform is rejected synchronously. +if (!isLinux) { + assert.throws(() => new net.BoundSocket({ path: '\0abstract' }), + { code: 'ERR_INVALID_ARG_VALUE' }); +} + +// Filesystem bind errors surface synchronously in the constructor. A missing +// parent directory yields EACCES (libuv maps the kernel's ENOENT to EACCES for +// cross-platform parity), and an over-long path yields EINVAL (uv_pipe_bind is +// called with UV_PIPE_NO_TRUNCATE). The path must exceed sun_path on every +// platform, which is 1023 bytes on AIX. +if (!common.isWindows) { + assert.throws( + () => new net.BoundSocket({ path: `${common.PIPE}-nope/child.sock` }), + { code: 'EACCES', syscall: 'bind' }); + + assert.throws( + () => new net.BoundSocket({ path: `${common.PIPE}-${'x'.repeat(2000)}` }), + { code: 'EINVAL', syscall: 'bind' }); +} + // IPv6 binds: loopback, and ipv6Only dual-stack control. if (common.hasIPv6) { { diff --git a/test/parallel/test-net-server-blocklist.js b/test/parallel/test-net-server-blocklist.js index 8f310bd62530..7a17bf3b5c68 100644 --- a/test/parallel/test-net-server-blocklist.js +++ b/test/parallel/test-net-server-blocklist.js @@ -7,11 +7,11 @@ blockList.addAddress(common.localhostIPv4); const server = net.createServer({ blockList }, common.mustNotCall()); server.listen(0, common.localhostIPv4, common.mustCall(() => { - const adddress = server.address(); + const address = server.address(); const socket = net.connect({ localAddress: common.localhostIPv4, - host: adddress.address, - port: adddress.port + host: address.address, + port: address.port }); socket.on('close', common.mustCall(() => { server.close(); diff --git a/test/parallel/test-net-server-transfer-worker.js b/test/parallel/test-net-server-transfer-worker.js new file mode 100644 index 000000000000..18a52bc1a0c5 --- /dev/null +++ b/test/parallel/test-net-server-transfer-worker.js @@ -0,0 +1,55 @@ +'use strict'; + +// This test verifies that a listening net.Server can be transferred to a worker +// thread via worker_threads postMessage()'s transferList. The parent thread +// binds and listens, then hands the server off; the worker accepts connections and +// responds, proving the listening socket (and its accept queue) moved loops. + +const common = require('../common'); + +const assert = require('assert'); +const net = require('net'); +const { + Worker, + parentPort, + threadId, + workerData, +} = require('worker_threads'); + +if (workerData?.role === 'server') { + parentPort.on('message', common.mustCall(({ server }) => { + assert.ok(server instanceof net.Server); + server.on('connection', (socket) => { + socket.end(`served-by:${threadId}`); + }); + })); + return; +} + +const worker = new Worker(__filename, { workerData: { role: 'server' } }); + +const server = net.createServer(); + +server.listen(0, common.mustCall(() => { + const { port } = server.address(); + + // Move the listening server to the worker thread. + worker.postMessage({ server }, [server]); + assert.strictEqual(server._handle, null); + + const N = 3; + let done = 0; + for (let i = 0; i < N; i++) { + const client = net.connect(port); + client.setEncoding('utf8'); + let response = ''; + client.on('data', (chunk) => { response += chunk; }); + client.on('end', common.mustCall(() => { + assert.match(response, /^served-by:\d+$/); + assert.notStrictEqual(response, `served-by:${threadId}`); + if (++done === N) { + worker.terminate(); + } + })); + } +})); diff --git a/test/parallel/test-net-socket-transfer-worker-http.js b/test/parallel/test-net-socket-transfer-worker-http.js new file mode 100644 index 000000000000..86245cfeeea1 --- /dev/null +++ b/test/parallel/test-net-socket-transfer-worker-http.js @@ -0,0 +1,75 @@ +'use strict'; + +// This test verifies HTTP load balancing on top of transferred TCP sockets: +// the parent thread accepts connections and distributes each one round-robin to +// a pool of worker threads, where an http.Server handles the request. It exercises +// the intended use case for transferring net.Socket handles across threads. + +const common = require('../common'); + +const assert = require('assert'); +const net = require('net'); +const http = require('http'); +const { + Worker, + parentPort, + threadId, + workerData, +} = require('worker_threads'); + +const POOL = 4; +const REQ_PER_WORKER = 5; +const TOTAL = POOL * REQ_PER_WORKER; + +if (workerData?.role === 'http-server') { + // Each worker serves HTTP over connections transferred from the parent thread. + const server = http.createServer((req, res) => { + res.end(`thread:${threadId}`); + }); + parentPort.on('message', common.mustCall(({ socket }) => { + assert.ok(socket instanceof net.Socket); + server.emit('connection', socket); + }, REQ_PER_WORKER)); + return; +} + +const workers = []; +for (let i = 0; i < POOL; i++) + workers.push(new Worker(__filename, { workerData: { role: 'http-server' } })); + +let next = 0; +const front = net.createServer((socket) => { + // Distribute each freshly accepted connection round-robin to a worker. + workers[next++ % POOL].postMessage({ socket }, [socket]); +}); + +front.listen(0, common.mustCall(() => { + const { port } = front.address(); + const counts = { __proto__: null }; + let done = 0; + + for (let i = 0; i < TOTAL; i++) { + // agent: false forces a fresh connection per request, so each request maps + // to exactly one round-robin hand-off. + http.get({ port, agent: false }, common.mustCall((res) => { + let body = ''; + res.setEncoding('utf8'); + res.on('data', (chunk) => { body += chunk; }); + res.on('end', common.mustCall(() => { + assert.match(body, /^thread:\d+$/); + counts[body] = (counts[body] || 0) + 1; + + if (++done === TOTAL) { + // Every worker handled the same number of requests. + assert.strictEqual(Object.keys(counts).length, POOL); + for (const key of Object.keys(counts)) + assert.strictEqual(counts[key], REQ_PER_WORKER); + + front.close(); + for (const worker of workers) + worker.terminate(); + } + })); + })); + } +})); diff --git a/test/parallel/test-net-socket-transfer-worker.js b/test/parallel/test-net-socket-transfer-worker.js new file mode 100644 index 000000000000..32a07471fc61 --- /dev/null +++ b/test/parallel/test-net-socket-transfer-worker.js @@ -0,0 +1,60 @@ +'use strict'; + +// This test verifies that an accepted net.Socket connection can be transferred +// to a worker thread via worker_threads postMessage()'s transferList, and that +// the worker can read from and write to it. The parent thread accepts the +// connection and hands it off; the worker echoes data back. + +const common = require('../common'); + +const assert = require('assert'); +const net = require('net'); +const { + Worker, + parentPort, + workerData, +} = require('worker_threads'); + +if (workerData?.role === 'socket') { + // Worker side: receive the transferred connection and echo everything back. + parentPort.on('message', common.mustCall(({ socket }) => { + assert.ok(socket instanceof net.Socket); + socket.setEncoding('utf8'); + socket.on('data', common.mustCall((chunk) => { + socket.end(`echo:${chunk}`); + })); + })); + return; +} + +const worker = new Worker(__filename, { workerData: { role: 'socket' } }); + +const server = net.createServer(common.mustCall((socket) => { + // Hand the freshly accepted connection off to the worker. It must not be + // read from in this thread before transferring. + worker.postMessage({ socket }, [socket]); + + // The source socket is now owned by the worker: it is detached and destroyed + // on this side, so further use fails cleanly instead of dropping data. + assert.strictEqual(socket._handle, null); + assert.strictEqual(socket.destroyed, true); + assert.strictEqual(socket.writable, false); + socket.write('lost', common.mustCall((err) => { + assert.strictEqual(err.code, 'ERR_STREAM_DESTROYED'); + })); + + server.close(); +})); + +server.listen(0, common.mustCall(() => { + const client = net.connect(server.address().port, common.mustCall(() => { + client.write('hello'); + })); + client.setEncoding('utf8'); + let response = ''; + client.on('data', (chunk) => { response += chunk; }); + client.on('end', common.mustCall(() => { + assert.strictEqual(response, 'echo:hello'); + worker.terminate(); + })); +})); diff --git a/test/parallel/test-net-transfer-guards.js b/test/parallel/test-net-transfer-guards.js new file mode 100644 index 000000000000..0879ec9da81a --- /dev/null +++ b/test/parallel/test-net-transfer-guards.js @@ -0,0 +1,47 @@ +'use strict'; + +// This test verifies the guards that reject transferring a net.Socket or +// net.Server that is not in a clean, movable state. Serialization is triggered +// with a MessageChannel, so no worker thread is required. + +const common = require('../common'); + +const assert = require('assert'); +const net = require('net'); +const { MessageChannel } = require('worker_threads'); + +const { port1 } = new MessageChannel(); + +// A Server that is not listening (no handle) cannot be transferred. +{ + const server = net.createServer(); + assert.throws(() => port1.postMessage({ server }, [server]), { + code: 'ERR_WORKER_HANDLE_NOT_TRANSFERABLE', + }); +} + +// A Socket that has already consumed data cannot be transferred, because that +// buffered data would be lost on the sending side. +{ + const server = net.createServer(common.mustCall((socket) => { + socket.on('data', common.mustCall(() => { + assert.throws(() => port1.postMessage({ socket }, [socket]), { + code: 'ERR_WORKER_HANDLE_NOT_TRANSFERABLE', + }); + // The socket is still usable after a rejected transfer. + assert.ok(socket._handle != null); + socket.destroy(); + server.close(); + port1.close(); + })); + })); + + server.listen(0, common.mustCall(() => { + const client = net.connect(server.address().port, common.mustCall(() => { + client.end('data'); + })); + // The server destroys the socket after the rejected transfer, which may + // surface as a reset on the client; swallow it either way. + client.on('error', () => {}); + })); +} diff --git a/test/parallel/test-openssl-ca-options.js b/test/parallel/test-openssl-ca-options.js index b51b0ecf6980..d05884cf5ba3 100644 --- a/test/parallel/test-openssl-ca-options.js +++ b/test/parallel/test-openssl-ca-options.js @@ -19,6 +19,17 @@ assert.strictEqual(result.stderr, `${process.execPath ); assert.strictEqual(result.status, 9); +const useSystemCA = childProcess.spawnSync( + process.execPath, + [ '--use-openssl-ca', '--use-system-ca', '-p', 'process.version' ], + { encoding: 'utf8' } +); + +assert.strictEqual(useSystemCA.stderr, `${process.execPath +}: either --use-openssl-ca or --use-system-ca can be used, not both${os.EOL}` +); +assert.strictEqual(useSystemCA.status, 9); + const useBundledCA = childProcess.spawnSync(process.execPath, [ '--use-bundled-ca', '-p', 'process.version']); diff --git a/test/parallel/test-package-map-cli.js b/test/parallel/test-package-map-cli.js new file mode 100644 index 000000000000..7cf7a541e720 --- /dev/null +++ b/test/parallel/test-package-map-cli.js @@ -0,0 +1,79 @@ +'use strict'; + +require('../common'); +const fixtures = require('../common/fixtures'); +const assert = require('node:assert'); +const { spawnSync } = require('node:child_process'); +const { describe, it } = require('node:test'); + +const onlyIfNodeOptionsSupport = { + skip: process.config.variables.node_without_node_options, +}; + +describe('--experimental-package-map CLI behavior', () => { + + it('works via NODE_OPTIONS', onlyIfNodeOptionsSupport, () => { + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '-e', + `const dep = require('dep-a'); console.log(dep);`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + env: { + ...process.env, + NODE_OPTIONS: `--experimental-package-map=${JSON.stringify(fixtures.path('package-map/package-map.json'))}`, + }, + }); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /dep-a-value/); + assert.strictEqual(status, 0, stderr); + }); + + it('emits experimental warning on first use', () => { + const { status, stderr } = spawnSync(process.execPath, [ + '--experimental-package-map', fixtures.path('package-map/package-map.json'), + '-e', + `require('dep-a');`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.match(stderr, /ExperimentalWarning/); + assert.match(stderr, /[Pp]ackage map/); + assert.strictEqual(status, 0, stderr); + }); + + it('accepts relative path', () => { + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', '../package-map.json', + '-e', + `const dep = require('dep-a'); console.log(dep.default);`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + // Relative path ../package-map.json resolved from cwd (root/) + assert.match(stdout, /dep-a-value/); + assert.strictEqual(status, 0, stderr); + }); + + it('accepts absolute path', () => { + const { status, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', fixtures.path('package-map/package-map.json'), + '-e', + `console.log('ok');`, + ], { + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + assert.strictEqual(status, 0, stderr); + }); +}); diff --git a/test/parallel/test-path-glob.js b/test/parallel/test-path-glob.js index 47647e12784e..11633f52245e 100644 --- a/test/parallel/test-path-glob.js +++ b/test/parallel/test-path-glob.js @@ -31,6 +31,9 @@ const globs = { ], }; +// Matchers for the same pattern must not be shared across path platforms. +assert.strictEqual(path.posix.matchesGlob('platform-cache/file', 'platform-cache/**'), true); +assert.strictEqual(path.win32.matchesGlob('platform-cache\\file', 'platform-cache/**'), true); for (const [platform, platformGlobs] of Object.entries(globs)) { for (const [pathStr, glob, expected] of platformGlobs) { diff --git a/test/parallel/test-permission-audit-fs-does-not-deny.js b/test/parallel/test-permission-audit-fs-does-not-deny.js new file mode 100644 index 000000000000..13284802839d --- /dev/null +++ b/test/parallel/test-permission-audit-fs-does-not-deny.js @@ -0,0 +1,59 @@ +'use strict'; + +const common = require('../common'); +const { isMainThread } = require('worker_threads'); + +if (!isMainThread) { + common.skip('This test only works on a main thread'); +} + +const assert = require('assert'); +const { spawnSync } = require('child_process'); +const { test } = require('node:test'); +const fixtures = require('../common/fixtures'); + +const blockedFile = fixtures.path('permission', 'deny', 'protected-file.md'); + +function runAudit(mode) { + const childScript = ` + const dc = require('node:diagnostics_channel'); + const msgs = []; + dc.subscribe('node:permission-model:fs', (m) => msgs.push({ + permission: m.permission, + resource: m.resource, + })); + try { + ${mode === 'eval' ? + `eval('require("node:fs").readFileSync(process.env.BLOCKED_FILE)');` : + `require('node:fs').readFileSync(process.env.BLOCKED_FILE);`} + console.log('RESULT NO_THROW'); + } catch (e) { + console.log('RESULT THREW ' + e.code); + } + console.log('AUDIT ' + JSON.stringify(msgs)); + `; + + const env = { ...process.env, BLOCKED_FILE: blockedFile }; + const { status, stdout, stderr } = spawnSync( + process.execPath, + ['--permission-audit', '-e', childScript], + { encoding: 'utf8', env }, + ); + assert.strictEqual(status, 0, stderr); + const lines = stdout.split('\n'); + assert.ok(lines.includes('RESULT NO_THROW'), stdout); + const auditLine = lines.find((l) => l.startsWith('AUDIT ')); + assert.ok(auditLine, stdout); + const msgs = JSON.parse(auditLine.replace('AUDIT ', '')); + assert.strictEqual(msgs.length, 1); + assert.strictEqual(msgs[0].permission, 'FileSystemRead'); + assert.ok(msgs[0].resource.endsWith('protected-file.md')); +} + +test('permission-audit logs fs denial without throwing', () => { + runAudit('direct'); +}); + +test('permission-audit logs fs denial without throwing (eval)', () => { + runAudit('eval'); +}); diff --git a/test/parallel/test-permission-diagnostics-channel.js b/test/parallel/test-permission-diagnostics-channel.js new file mode 100644 index 000000000000..add99d5f8f09 --- /dev/null +++ b/test/parallel/test-permission-diagnostics-channel.js @@ -0,0 +1,29 @@ +// Flags: --permission --allow-fs-read=* +'use strict'; + +const common = require('../common'); +const { isMainThread } = require('worker_threads'); + +if (!isMainThread) { + common.skip('This test only works on a main thread'); +} + +const assert = require('node:assert'); +const dc = require('node:diagnostics_channel'); +const fs = require('node:fs'); + +const messages = []; +dc.subscribe('node:permission-model:fs', (msg) => { + messages.push(msg); +}); + +// Granted permission should not publish +fs.readFileSync(__filename); +assert.strictEqual(messages.length, 0); + +// Denied permission should publish +const hasWrite = process.permission.has('fs.write', '/tmp/test'); +assert.strictEqual(hasWrite, false); + +assert.ok(messages.length > 0, 'Expected at least one denied message'); +assert.strictEqual(messages[0].permission, 'FileSystemWrite'); diff --git a/test/parallel/test-permission-drop-addons.js b/test/parallel/test-permission-drop-addons.js new file mode 100644 index 000000000000..baf87c3b95b8 --- /dev/null +++ b/test/parallel/test-permission-drop-addons.js @@ -0,0 +1,38 @@ +// Flags: --permission --allow-addons --allow-fs-read=* +'use strict'; + +const common = require('../common'); +const { isMainThread } = require('worker_threads'); + +if (!isMainThread) { + common.skip('This test only works on a main thread'); +} + +const assert = require('assert'); + +let bindingPath; +try { + bindingPath = require.resolve( + `../addons/hello-world/build/${common.buildType}/binding`); +} catch (err) { + if (err.code !== 'MODULE_NOT_FOUND') { + throw err; + } + common.skip('addon not found'); +} + +function openAddon() { + process.dlopen({ exports: {} }, bindingPath); +} + +assert.ok(process.permission.has('addon')); +openAddon(); + +process.permission.drop('addon'); +assert.ok(!process.permission.has('addon')); +assert.throws(() => { + openAddon(); +}, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'Addon', +})); diff --git a/test/parallel/test-permission-drop-child-process.js b/test/parallel/test-permission-drop-child-process.js new file mode 100644 index 000000000000..6c6fe2065d11 --- /dev/null +++ b/test/parallel/test-permission-drop-child-process.js @@ -0,0 +1,38 @@ +// Flags: --permission --allow-child-process --allow-fs-read=* +'use strict'; + +const common = require('../common'); +const { isMainThread } = require('worker_threads'); + +if (!isMainThread) { + common.skip('This test only works on a main thread'); +} + +const assert = require('assert'); +const childProcess = require('child_process'); + +{ + assert.ok(process.permission.has('child')); + const { status } = childProcess.spawnSync(process.execPath, ['--version']); + assert.strictEqual(status, 0); +} + +process.permission.drop('child'); +{ + assert.ok(!process.permission.has('child')); + assert.throws(() => { + childProcess.spawnSync(process.execPath, ['--version']); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'ChildProcess', + })); + assert.throws(() => { + childProcess.execSync(`"${process.execPath}" --version`); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'ChildProcess', + })); +} + +process.permission.drop('child'); +assert.ok(!process.permission.has('child')); diff --git a/test/parallel/test-permission-drop-diagnostics-channel.js b/test/parallel/test-permission-drop-diagnostics-channel.js new file mode 100644 index 000000000000..e0006061e5a0 --- /dev/null +++ b/test/parallel/test-permission-drop-diagnostics-channel.js @@ -0,0 +1,34 @@ +// Flags: --permission --allow-fs-read=* --allow-child-process +'use strict'; + +const common = require('../common'); +const { isMainThread } = require('worker_threads'); + +if (!isMainThread) { + common.skip('This test only works on a main thread'); +} + +const assert = require('assert'); +const dc = require('node:diagnostics_channel'); + +const fsMessages = []; +dc.subscribe('node:permission-model:fs', (msg) => { + fsMessages.push(msg); +}); + +const childMessages = []; +dc.subscribe('node:permission-model:child', (msg) => { + childMessages.push(msg); +}); + +process.permission.drop('fs.read', '/tmp/test-drop'); + +assert.ok(fsMessages.length > 0, 'Expected at least one fs drop message'); +assert.strictEqual(fsMessages[0].permission, 'FileSystemRead'); +assert.strictEqual(fsMessages[0].drop, true); + +process.permission.drop('child'); + +assert.ok(childMessages.length > 0, 'Expected at least one child drop message'); +assert.strictEqual(childMessages[0].permission, 'ChildProcess'); +assert.strictEqual(childMessages[0].drop, true); diff --git a/test/parallel/test-permission-drop-errors.js b/test/parallel/test-permission-drop-errors.js new file mode 100644 index 000000000000..ae3a9b2fcc9e --- /dev/null +++ b/test/parallel/test-permission-drop-errors.js @@ -0,0 +1,45 @@ +// Flags: --permission --allow-fs-read=* +'use strict'; + +const common = require('../common'); +const { isMainThread } = require('worker_threads'); + +if (!isMainThread) { + common.skip('This test only works on a main thread'); +} + +const assert = require('assert'); + +{ + assert.throws(() => { + process.permission.drop(null); + }, common.expectsError({ + code: 'ERR_INVALID_ARG_TYPE', + message: 'The "scope" argument must be of type string. Received null', + })); + + assert.throws(() => { + process.permission.drop(123); + }, common.expectsError({ + code: 'ERR_INVALID_ARG_TYPE', + })); +} + +{ + assert.throws(() => { + process.permission.drop('fs.read', {}); + }, common.expectsError({ + code: 'ERR_INVALID_ARG_TYPE', + })); + + assert.throws(() => { + process.permission.drop('fs.read', 123); + }, common.expectsError({ + code: 'ERR_INVALID_ARG_TYPE', + })); +} + +{ + process.permission.drop('invalid-scope'); + process.permission.drop('invalid-scope', '/tmp'); +} diff --git a/test/parallel/test-permission-drop-fs-all.js b/test/parallel/test-permission-drop-fs-all.js new file mode 100644 index 000000000000..632e1b270126 --- /dev/null +++ b/test/parallel/test-permission-drop-fs-all.js @@ -0,0 +1,38 @@ +// Flags: --permission --allow-fs-read=* --allow-fs-write=* +'use strict'; + +const common = require('../common'); +const { isMainThread } = require('worker_threads'); + +if (!isMainThread) { + common.skip('This test only works on a main thread'); +} + +const assert = require('assert'); +const fs = require('fs'); + +{ + assert.ok(process.permission.has('fs.read')); + assert.ok(process.permission.has('fs.write')); +} + +process.permission.drop('fs.read'); +{ + assert.ok(!process.permission.has('fs.read')); + assert.ok(!process.permission.has('fs.read', __filename)); + assert.throws(() => { + fs.readFileSync(__filename); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemRead', + })); +} + +{ + assert.ok(process.permission.has('fs.write')); +} + +process.permission.drop('fs.write'); +{ + assert.ok(!process.permission.has('fs.write')); +} diff --git a/test/parallel/test-permission-drop-fs-granted-path.js b/test/parallel/test-permission-drop-fs-granted-path.js new file mode 100644 index 000000000000..a011944cd0d9 --- /dev/null +++ b/test/parallel/test-permission-drop-fs-granted-path.js @@ -0,0 +1,158 @@ +'use strict'; + +require('../common'); + +const { spawnSync } = require('child_process'); +const assert = require('assert'); +const { isMainThread } = require('worker_threads'); + +if (!isMainThread) { + process.exit(0); +} +const tmpdir = require('../common/tmpdir'); +const fs = require('fs'); +const path = require('path'); + +tmpdir.refresh(); + +const dir = path.join(tmpdir.path, 'granted-dir'); +fs.mkdirSync(dir); +fs.writeFileSync(path.join(dir, 'item1.txt'), 'aaa'); +fs.writeFileSync(path.join(dir, 'item2.txt'), 'bbb'); + +// Grant a directory, try to drop a file inside it - should be a no-op +{ + const child = spawnSync(process.execPath, [ + '--permission', + `--allow-fs-read=${dir}`, + '-e', + ` + const assert = require('assert'); + const fs = require('fs'); + const dir = ${JSON.stringify(dir)}; + + assert.ok(process.permission.has('fs.read', dir + '/item1.txt')); + + process.permission.drop('fs.read', dir + '/item1.txt'); + + // Still readable — drop of a file inside a granted dir is a no-op + assert.ok(process.permission.has('fs.read', dir + '/item1.txt')); + assert.ok(process.permission.has('fs.read', dir + '/item2.txt')); + `, + ]); + if (child.status !== 0) { + console.error('Case 1 stderr:', child.stderr?.toString()); + } + assert.strictEqual(child.status, 0); +} + +// Grant a directory, drop the same directory - should revoke all access +{ + const child = spawnSync(process.execPath, [ + '--permission', + `--allow-fs-read=${dir}`, + '-e', + ` + const assert = require('assert'); + const dir = ${JSON.stringify(dir)}; + + assert.ok(process.permission.has('fs.read', dir + '/item1.txt')); + + process.permission.drop('fs.read', dir); + + assert.ok(!process.permission.has('fs.read', dir + '/item1.txt')); + assert.ok(!process.permission.has('fs.read', dir + '/item2.txt')); + `, + ]); + if (child.status !== 0) { + console.error('Case 2 stderr:', child.stderr?.toString()); + } + assert.strictEqual(child.status, 0); +} + +// Grant two directories, drop one - the other remains accessible +{ + const dir2 = path.join(tmpdir.path, 'other-dir'); + fs.mkdirSync(dir2); + fs.writeFileSync(path.join(dir2, 'other.txt'), 'ccc'); + + const child = spawnSync(process.execPath, [ + '--permission', + `--allow-fs-read=${dir}`, + `--allow-fs-read=${dir2}`, + '-e', + ` + const assert = require('assert'); + const fs = require('fs'); + const dir = ${JSON.stringify(dir)}; + const dir2 = ${JSON.stringify(dir2)}; + + assert.ok(process.permission.has('fs.read', dir + '/item1.txt')); + assert.ok(process.permission.has('fs.read', dir2 + '/other.txt')); + + process.permission.drop('fs.read', dir); + + assert.ok(!process.permission.has('fs.read', dir + '/item1.txt')); + assert.ok(process.permission.has('fs.read', dir2 + '/other.txt')); + assert.strictEqual( + fs.readFileSync(dir2 + '/other.txt', 'utf8'), + 'ccc' + ); + `, + ]); + if (child.status !== 0) { + console.error('Case 3 stderr:', child.stderr?.toString()); + } + assert.strictEqual(child.status, 0); +} + +// Grant a directory and a file inside it separately, drop the file +// the directory grant still covers everything including that file +{ + const child = spawnSync(process.execPath, [ + '--permission', + `--allow-fs-read=${dir}`, + `--allow-fs-read=${path.join(dir, 'item1.txt')}`, + '-e', + ` + const assert = require('assert'); + const path = require('path'); + const dir = ${JSON.stringify(dir)}; + + assert.ok(process.permission.has('fs.read', dir + '/item1.txt')); + + process.permission.drop('fs.read', path.join(dir, 'item1.txt')); + + // Still readable because the directory grant covers it + assert.ok(process.permission.has('fs.read', dir + '/item1.txt')); + `, + ]); + if (child.status !== 0) { + console.error('Case 4 stderr:', child.stderr?.toString()); + } + assert.strictEqual(child.status, 0); +} + +// Drop entire scope without reference - revokes everything +{ + const child = spawnSync(process.execPath, [ + '--permission', + `--allow-fs-read=${dir}`, + '-e', + ` + const assert = require('assert'); + const dir = ${JSON.stringify(dir)}; + + assert.ok(process.permission.has('fs.read', dir + '/item1.txt')); + + process.permission.drop('fs.read'); + + assert.ok(!process.permission.has('fs.read', dir + '/item1.txt')); + assert.ok(!process.permission.has('fs.read')); + `, + ]); + if (child.status !== 0) { + console.error('Case 5 stderr:', child.stderr?.toString()); + } + assert.strictEqual(child.status, 0); +} diff --git a/test/parallel/test-permission-drop-fs-read.js b/test/parallel/test-permission-drop-fs-read.js new file mode 100644 index 000000000000..1a73de8ec2da --- /dev/null +++ b/test/parallel/test-permission-drop-fs-read.js @@ -0,0 +1,40 @@ +// Flags: --permission --allow-fs-read=* --allow-fs-write=* +'use strict'; + +const common = require('../common'); +const { isMainThread } = require('worker_threads'); + +if (!isMainThread) { + common.skip('This test only works on a main thread'); +} + +const assert = require('assert'); +const fs = require('fs'); + +{ + assert.ok(process.permission.has('fs.read')); + assert.ok(process.permission.has('fs.read', __filename)); +} + +// Specific path drop is a no-op when * was granted +process.permission.drop('fs.read', '/tmp/some-path'); +{ + assert.ok(process.permission.has('fs.read')); + assert.ok(process.permission.has('fs.read', __filename)); +} + +process.permission.drop('fs.read'); +{ + assert.ok(!process.permission.has('fs.read')); + assert.ok(!process.permission.has('fs.read', __filename)); + assert.throws(() => { + fs.readFileSync(__filename, 'utf8'); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemRead', + })); +} + +{ + assert.ok(process.permission.has('fs.write')); +} diff --git a/test/parallel/test-permission-drop-fs-scope.js b/test/parallel/test-permission-drop-fs-scope.js new file mode 100644 index 000000000000..f6948bf04ffa --- /dev/null +++ b/test/parallel/test-permission-drop-fs-scope.js @@ -0,0 +1,37 @@ +// Flags: --permission --allow-fs-read=* --allow-fs-write=* +'use strict'; + +const common = require('../common'); +const { isMainThread } = require('worker_threads'); + +if (!isMainThread) { + common.skip('This test only works on a main thread'); +} + +const assert = require('assert'); +const fs = require('fs'); + +{ + assert.ok(process.permission.has('fs.read')); + assert.ok(process.permission.has('fs.write')); +} + +// Specific path drop is a no-op when * was granted +process.permission.drop('fs', '/tmp/some-path'); +{ + assert.ok(process.permission.has('fs.read')); + assert.ok(process.permission.has('fs.write')); +} + +process.permission.drop('fs'); +{ + assert.ok(!process.permission.has('fs.read')); + assert.ok(!process.permission.has('fs.write')); + + assert.throws(() => { + fs.readFileSync(__filename); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemRead', + })); +} diff --git a/test/parallel/test-permission-drop-fs-specific-path.js b/test/parallel/test-permission-drop-fs-specific-path.js new file mode 100644 index 000000000000..0c46ee505ff3 --- /dev/null +++ b/test/parallel/test-permission-drop-fs-specific-path.js @@ -0,0 +1,60 @@ +'use strict'; + +require('../common'); + +const { spawnSync } = require('child_process'); +const assert = require('assert'); +const { isMainThread } = require('worker_threads'); + +if (!isMainThread) { + process.exit(0); +} +const tmpdir = require('../common/tmpdir'); +const fs = require('fs'); +const path = require('path'); + +tmpdir.refresh(); + +const dirA = path.join(tmpdir.path, 'dir-a'); +const dirB = path.join(tmpdir.path, 'dir-b'); +fs.mkdirSync(dirA); +fs.mkdirSync(dirB); +fs.writeFileSync(path.join(dirA, 'a.txt'), 'aaa'); +fs.writeFileSync(path.join(dirB, 'b.txt'), 'bbb'); + +const child = spawnSync(process.execPath, [ + '--permission', + `--allow-fs-read=${dirA}`, + `--allow-fs-read=${dirB}`, + '-e', + ` + const assert = require('assert'); + const fs = require('fs'); + const path = require('path'); + + const dirA = ${JSON.stringify(dirA)}; + const dirB = ${JSON.stringify(dirB)}; + + assert.ok(process.permission.has('fs.read', path.join(dirA, 'a.txt'))); + assert.ok(process.permission.has('fs.read', path.join(dirB, 'b.txt'))); + + process.permission.drop('fs.read', dirA); + + assert.ok(!process.permission.has('fs.read', path.join(dirA, 'a.txt'))); + assert.throws(() => { + fs.readFileSync(path.join(dirA, 'a.txt')); + }, { code: 'ERR_ACCESS_DENIED' }); + + assert.ok(process.permission.has('fs.read', path.join(dirB, 'b.txt'))); + assert.strictEqual( + fs.readFileSync(path.join(dirB, 'b.txt'), 'utf8'), + 'bbb' + ); + `, +]); + +if (child.status !== 0) { + console.error('stdout:', child.stdout?.toString()); + console.error('stderr:', child.stderr?.toString()); +} +assert.strictEqual(child.status, 0); diff --git a/test/parallel/test-permission-drop-fs-write.js b/test/parallel/test-permission-drop-fs-write.js new file mode 100644 index 000000000000..64cc791ebaff --- /dev/null +++ b/test/parallel/test-permission-drop-fs-write.js @@ -0,0 +1,31 @@ +// Flags: --permission --allow-fs-read=* --allow-fs-write=* +'use strict'; + +const common = require('../common'); +const { isMainThread } = require('worker_threads'); + +if (!isMainThread) { + common.skip('This test only works on a main thread'); +} + +const assert = require('assert'); + +{ + assert.ok(process.permission.has('fs.write')); +} + +// Specific path drop is a no-op when * was granted +process.permission.drop('fs.write', '/tmp/some-path'); +{ + assert.ok(process.permission.has('fs.write')); +} + +process.permission.drop('fs.write'); +{ + assert.ok(!process.permission.has('fs.write')); +} + +{ + assert.ok(process.permission.has('fs.read')); + assert.ok(process.permission.has('fs.read', __filename)); +} diff --git a/test/parallel/test-permission-drop-not-enabled.js b/test/parallel/test-permission-drop-not-enabled.js new file mode 100644 index 000000000000..51992dff6498 --- /dev/null +++ b/test/parallel/test-permission-drop-not-enabled.js @@ -0,0 +1,14 @@ +'use strict'; + +require('../common'); +const { isMainThread } = require('worker_threads'); + +if (!isMainThread) { + process.exit(0); +} + +const assert = require('assert'); + +{ + assert.strictEqual(process.permission, undefined); +} diff --git a/test/parallel/test-permission-drop-worker.js b/test/parallel/test-permission-drop-worker.js new file mode 100644 index 000000000000..d800255e13e5 --- /dev/null +++ b/test/parallel/test-permission-drop-worker.js @@ -0,0 +1,26 @@ +// Flags: --permission --allow-worker --allow-fs-read=* +'use strict'; + +const common = require('../common'); +const { isMainThread, Worker } = require('worker_threads'); + +if (!isMainThread) { + common.skip('This test only works on a main thread'); +} + +const assert = require('assert'); + +{ + assert.ok(process.permission.has('worker')); +} + +process.permission.drop('worker'); +{ + assert.ok(!process.permission.has('worker')); + assert.throws(() => { + new Worker('console.log("hello")', { eval: true }); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'WorkerThreads', + })); +} diff --git a/test/parallel/test-permission-fs-write-v8.js b/test/parallel/test-permission-fs-write-v8.js index 1b8691969b7a..a8b8fd4d579b 100644 --- a/test/parallel/test-permission-fs-write-v8.js +++ b/test/parallel/test-permission-fs-write-v8.js @@ -34,3 +34,12 @@ const path = require('path'); permission: 'FileSystemWrite', })); } + +{ + assert.throws(() => { + v8.setHeapSnapshotNearHeapLimit(1); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemWrite', + })); +} diff --git a/test/parallel/test-permission-warning-flags.js b/test/parallel/test-permission-warning-flags.js index 450597942c69..eeb00ecd3517 100644 --- a/test/parallel/test-permission-warning-flags.js +++ b/test/parallel/test-permission-warning-flags.js @@ -21,6 +21,20 @@ for (const flag of warnFlags) { ] ); - assert.match(stderr.toString(), new RegExp(`SecurityWarning: The flag ${RegExp.escape(flag)} must be used with extreme caution`)); + assert.match(stderr.toString(), new RegExp(`\\[PERM\\d{4}\\] SecurityWarning: The flag ${RegExp.escape(flag)} must be used with extreme caution`)); assert.strictEqual(status, 0); } + +const { status, stderr } = spawnSync( + process.execPath, + [ + '--permission', '--allow-child-process', '--allow-wasi', '--disable-warning=PERM0002', '-e', + 'setTimeout(() => {}, 1)', + ] +); + +// Disabled warning does not appear +assert.doesNotMatch(stderr.toString(), new RegExp(`The flag --allow-child-process must be used with extreme caution`)); +// But non-disabled warnings still appear +assert.match(stderr.toString(), new RegExp(`The flag --allow-wasi must be used with extreme caution`)); +assert.strictEqual(status, 0); 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 97301c99e175..67483f6242cf 100644 --- a/test/parallel/test-process-env-allowed-flags-are-documented.js +++ b/test/parallel/test-process-env-allowed-flags-are-documented.js @@ -128,6 +128,7 @@ assert(undocumented.delete('--experimental-global-customevent')); assert(undocumented.delete('--experimental-global-webcrypto')); assert(undocumented.delete('--experimental-report')); assert(undocumented.delete('--experimental-worker')); +assert(undocumented.delete('--napi-modules')); assert(undocumented.delete('--node-snapshot')); assert(undocumented.delete('--no-node-snapshot')); assert(undocumented.delete('--loader')); diff --git a/test/parallel/test-process-exit-after-fetch-throw.js b/test/parallel/test-process-exit-after-fetch-throw.js new file mode 100644 index 000000000000..b6868c2c9e73 --- /dev/null +++ b/test/parallel/test-process-exit-after-fetch-throw.js @@ -0,0 +1,32 @@ +'use strict'; +// Ref: https://github.com/nodejs/node/issues/56645 +const common = require('../common'); +const assert = require('assert'); +const cp = require('child_process'); +const http = require('http'); + +if (process.argv[2] === 'child') { + http + .createServer((_, res) => { + res.writeHead(302, { Location: '/' }); + res.end(); + }) + .listen(0, '127.0.0.1', async function() { + try { + await fetch(`http://127.0.0.1:${this.address().port}/`); + } catch { + // ignore + } + process.exit(0); + }); +} else { + const child = cp.spawn(process.execPath, [__filename, 'child']); + + child.on( + 'close', + common.mustCall((exitCode, signal) => { + assert.strictEqual(exitCode, 0); + assert.strictEqual(signal, null); + }), + ); +} diff --git a/test/parallel/test-process-exit-code-validation.js b/test/parallel/test-process-exit-code-validation.js index 6051f9b6dbc8..6b55c68f848c 100644 --- a/test/parallel/test-process-exit-code-validation.js +++ b/test/parallel/test-process-exit-code-validation.js @@ -110,11 +110,11 @@ if (process.argv[2] === undefined) { // Check process.exitCode for (const arg of invalids) { - debug(`invaild code: ${inspect(arg.code)}`); + debug(`invalid code: ${inspect(arg.code)}`); assert.throws(() => (process.exitCode = arg.code), new RegExp(arg.pattern)); } for (const arg of valids) { - debug(`vaild code: ${inspect(arg.code)}`); + debug(`valid code: ${inspect(arg.code)}`); process.exitCode = arg.code; } diff --git a/test/parallel/test-process-threadCpuUsage-main-thread.js b/test/parallel/test-process-threadCpuUsage-main-thread.js index f304ca9402f3..88020bef9dbd 100644 --- a/test/parallel/test-process-threadCpuUsage-main-thread.js +++ b/test/parallel/test-process-threadCpuUsage-main-thread.js @@ -47,7 +47,7 @@ if (!isSunOS) { ); } -// Test argument validaton +// Test argument validation { assert.throws( () => process.threadCpuUsage(123), diff --git a/test/parallel/test-quic-address-validation.mjs b/test/parallel/test-quic-address-validation.mjs new file mode 100644 index 000000000000..d6fa2b7333ba --- /dev/null +++ b/test/parallel/test-quic-address-validation.mjs @@ -0,0 +1,46 @@ +// Flags: --experimental-quic --no-warnings + +// Test: validateAddress triggers Retry flow. +// When the server endpoint has validateAddress: true, it should send +// a Retry packet before accepting the connection. The handshake still +// completes successfully. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect, QuicEndpoint } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const endpoint = new QuicEndpoint({ validateAddress: true }); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + const info = await serverSession.opened; + // The handshake should complete despite the Retry flow. + assert.strictEqual(info.protocol, 'quic-test'); + serverSession.close(); +}), { + endpoint, + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], +}); + +const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + servername: 'localhost', +}); + +const info = await clientSession.opened; +assert.strictEqual(info.protocol, 'quic-test'); + +// The serverEndpoint must be closed after we wait for the clientSession to close. +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-alpn-h3.mjs b/test/parallel/test-quic-alpn-h3.mjs index 9a473352d7ed..9cf6e88f6cb3 100644 --- a/test/parallel/test-quic-alpn-h3.mjs +++ b/test/parallel/test-quic-alpn-h3.mjs @@ -18,27 +18,28 @@ const cert = fixtures.readKey('agent1-cert.pem'); // Both server and client use the default ALPN (h3). const serverOpened = Promise.withResolvers(); -const clientOpened = Promise.withResolvers(); - -const serverEndpoint = await listen(mustCall((serverSession) => { - serverSession.opened.then(mustCall((info) => { - assert.strictEqual(info.protocol, 'h3'); - serverOpened.resolve(); - serverSession.close(); - })); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + const info = await serverSession.opened; + assert.strictEqual(info.protocol, 'h3'); + serverOpened.resolve(); + serverSession.close(); }), { sni: { '*': { keys: [key], certs: [cert] } }, }); -assert.ok(serverEndpoint.address !== undefined); +assert.notStrictEqual(serverEndpoint.address, undefined); const clientSession = await connect(serverEndpoint.address, { servername: 'localhost', + verifyPeer: 'manual', }); -clientSession.opened.then(mustCall((info) => { + +async function checkClient() { + const info = await clientSession.opened; assert.strictEqual(info.protocol, 'h3'); - clientOpened.resolve(); -})); +} -await Promise.all([serverOpened.promise, clientOpened.promise]); -clientSession.close(); +await Promise.all([serverOpened.promise, checkClient()]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-alpn-mismatch.mjs b/test/parallel/test-quic-alpn-mismatch.mjs new file mode 100644 index 000000000000..b29c33729010 --- /dev/null +++ b/test/parallel/test-quic-alpn-mismatch.mjs @@ -0,0 +1,47 @@ +// Flags: --experimental-quic --no-warnings + +// Test: ALPN mismatch causes connection failure. +// The server offers 'quic-test' but the client requests 'nonexistent'. +// The handshake should fail with a `no_application_protocol` alert. +// +// The QUIC transport error code for a CRYPTO_ERROR carrying a TLS alert is +// 0x100 | . For `no_application_protocol` (alert 120 / 0x78) this +// is 0x178 == 376. + +import { hasQuic, skip, mustNotCall, expectsError } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const expected = { + code: 'ERR_QUIC_TRANSPORT_ERROR', + errorCode: 376n, + message: /no application protocol/ +}; + +const transportParams = { maxIdleTimeout: 1 }; + +// The handshake fails so the session is never surfaced to JS +const serverEndpoint = await listen( + mustNotCall('server session must not be surfaced for a failed handshake'), + { + transportParams, + }); + +// Client requests an ALPN the server doesn't offer. +const clientSession = await connect(serverEndpoint.address, { + alpn: 'nonexistent-protocol', + transportParams, + onerror: expectsError(expected), +}); + +await assert.rejects(clientSession.opened, expected); + +// The handshake should fail — opened may reject or never resolve. +// The session should close with an error. +await assert.rejects(clientSession.closed, expected); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-alpn.mjs b/test/parallel/test-quic-alpn.mjs index b5eedf65373e..a7680dd05a5a 100644 --- a/test/parallel/test-quic-alpn.mjs +++ b/test/parallel/test-quic-alpn.mjs @@ -18,30 +18,29 @@ const cert = fixtures.readKey('agent1-cert.pem'); // Verify the negotiated protocol matches on both sides. const serverOpened = Promise.withResolvers(); -const clientOpened = Promise.withResolvers(); - -const serverEndpoint = await listen(mustCall((serverSession) => { - serverSession.opened.then(mustCall((info) => { - // The server should negotiate proto-b (client's choice from server's list) - assert.strictEqual(info.protocol, 'proto-b'); - serverOpened.resolve(); - serverSession.close(); - })); + +async function checkSession(session) { + const info = await session.opened; + // The client should negotiate proto-b (the only protocol it requested) + assert.strictEqual(info.protocol, 'proto-b'); +} + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await checkSession(serverSession); + serverOpened.resolve(); }), { sni: { '*': { keys: [key], certs: [cert] } }, alpn: ['proto-a', 'proto-b', 'proto-c'], }); -assert.ok(serverEndpoint.address !== undefined); +assert.notStrictEqual(serverEndpoint.address, undefined); const clientSession = await connect(serverEndpoint.address, { alpn: 'proto-b', servername: 'localhost', + verifyPeer: 'manual', }); -clientSession.opened.then(mustCall((info) => { - assert.strictEqual(info.protocol, 'proto-b'); - clientOpened.resolve(); -})); -await Promise.all([serverOpened.promise, clientOpened.promise]); -clientSession.close(); +await Promise.all([serverOpened.promise, checkSession(clientSession)]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-blocklist.mjs b/test/parallel/test-quic-blocklist.mjs new file mode 100644 index 000000000000..5c6434c8ed80 --- /dev/null +++ b/test/parallel/test-quic-blocklist.mjs @@ -0,0 +1,76 @@ +// Flags: --experimental-quic --no-warnings + +// Test: endpoint block list filtering. +// Deny mode: packets from blocked addresses are dropped. +// Allow mode: only packets from listed addresses are accepted. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import net from 'node:net'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// --- Deny mode: block 127.0.0.1 --- +{ + const blockList = new net.BlockList(); + blockList.addAddress('127.0.0.1'); + + const serverEndpoint = await listen(mustNotCall(), { + endpoint: { + blockList, + blockListPolicy: 'deny', + }, + }); + + // Connecting from 127.0.0.1 should be silently dropped. + // The client will time out waiting for a response. + const clientSession = await connect(serverEndpoint.address, { + handshakeTimeout: 500, + verifyPeer: 'manual', + onerror: mustCall((err) => { + assert.strictEqual(err.code, 'ERR_QUIC_TRANSPORT_ERROR'); + }), + }); + + // The session should fail — the server never sees the packet. + await assert.rejects(clientSession.opened, { + code: 'ERR_QUIC_TRANSPORT_ERROR', + }); + + // Verify the stat counter. + assert.ok(serverEndpoint.stats.packetsBlocked > 0n, + 'packetsBlocked should be non-zero'); + + await serverEndpoint.close(); +} + +// --- Allow mode: only allow 127.0.0.1 --- +{ + const allowList = new net.BlockList(); + allowList.addAddress('127.0.0.1'); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + serverSession.close(); + }), { + endpoint: { + blockList: allowList, + blockListPolicy: 'allow', + }, + }); + + // Connecting from 127.0.0.1 should succeed — it's in the allow list. + const clientSession = await connect(serverEndpoint.address, { + verifyPeer: 'manual', + }); + await clientSession.opened; + await clientSession.close(); + + assert.strictEqual(serverEndpoint.stats.packetsBlocked, 0n); // No packets should be blocked for allowed address + + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-callback-error-onblocked.mjs b/test/parallel/test-quic-callback-error-onblocked.mjs new file mode 100644 index 000000000000..88a22ee2f683 --- /dev/null +++ b/test/parallel/test-quic-callback-error-onblocked.mjs @@ -0,0 +1,44 @@ +// Flags: --experimental-quic --no-warnings + +// Test: onblocked callback error handling. +// A sync throw in stream.onblocked destroys the stream via +// safeCallbackInvoke. The stream.closed promise rejects with the error. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const testError = new Error('onblocked throw'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}), { + // Small stream window to trigger flow control blocking. + transportParams: { + maxIdleTimeout: 1, + initialMaxStreamDataBidiRemote: 256, + }, +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1 }, +}); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); + +stream.onblocked = mustCall(() => { + throw testError; +}); + +// Body larger than the 256-byte flow control window triggers onblocked. +stream.setBody(new Uint8Array(4096)); + +// The stream's closed promise should reject with the error from the throw. +await assert.rejects(stream.closed, testError); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-ondatagram-async.mjs b/test/parallel/test-quic-callback-error-ondatagram-async.mjs new file mode 100644 index 000000000000..23eade07161c --- /dev/null +++ b/test/parallel/test-quic-callback-error-ondatagram-async.mjs @@ -0,0 +1,42 @@ +// Flags: --experimental-quic --no-warnings + +// Test: async rejection in ondatagram destroys session. +// safeCallbackInvoke detects the returned promise and attaches a +// rejection handler that calls session.destroy(err). The error is +// delivered to the onerror callback. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const testError = new Error('async ondatagram rejection'); +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await assert.rejects(serverSession.closed, testError); + serverDone.resolve(); +}), { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram: mustCall(async () => { + throw testError; + }), + onerror: mustCall((err) => { + assert.strictEqual(err, testError); + }), +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1, maxDatagramFrameSize: 1200 }, +}); +await clientSession.opened; + +await clientSession.sendDatagram(new Uint8Array([1, 2, 3])); + +await serverDone.promise; +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-ondatagram.mjs b/test/parallel/test-quic-callback-error-ondatagram.mjs new file mode 100644 index 000000000000..c9700114dcb6 --- /dev/null +++ b/test/parallel/test-quic-callback-error-ondatagram.mjs @@ -0,0 +1,43 @@ +// Flags: --experimental-quic --no-warnings + +// Test: ondatagram callback error handling. +// A sync throw in ondatagram destroys the session via safeCallbackInvoke. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const testError = new Error('ondatagram throw'); +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + // The session is destroyed by the ondatagram throw. The closed promise + // rejects with testError. Verify that and signal completion. + await assert.rejects(serverSession.closed, testError); + serverDone.resolve(); +}), { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram() { + throw testError; + }, + onerror: mustCall((err) => { + assert.strictEqual(err, testError); + }), +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1, maxDatagramFrameSize: 1200 }, +}); +await clientSession.opened; + +// Send a datagram to trigger the server's ondatagram callback. +await clientSession.sendDatagram(new Uint8Array([1, 2, 3])); + +await serverDone.promise; +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-ondatagramstatus.mjs b/test/parallel/test-quic-callback-error-ondatagramstatus.mjs new file mode 100644 index 000000000000..7c4c102866ff --- /dev/null +++ b/test/parallel/test-quic-callback-error-ondatagramstatus.mjs @@ -0,0 +1,39 @@ +// Flags: --experimental-quic --no-warnings + +// Test: ondatagramstatus callback error handling. +// A sync throw in ondatagramstatus destroys the session via safeCallbackInvoke. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const testError = new Error('ondatagramstatus throw'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}), { + transportParams: { maxIdleTimeout: 1, maxDatagramFrameSize: 1200 }, +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1, maxDatagramFrameSize: 1200 }, + ondatagramstatus() { + throw testError; + }, + onerror: mustCall((err) => { + assert.strictEqual(err, testError); + }), +}); +await clientSession.opened; + +// Send a datagram. The status callback fires when the peer ACKs it. +await clientSession.sendDatagram(new Uint8Array([1, 2, 3])); + +// The session's closed should reject with the error from the throw. +await assert.rejects(clientSession.closed, testError); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-onerror-option.mjs b/test/parallel/test-quic-callback-error-onerror-option.mjs new file mode 100644 index 000000000000..28c29ab93ca9 --- /dev/null +++ b/test/parallel/test-quic-callback-error-onerror-option.mjs @@ -0,0 +1,35 @@ +// Flags: --experimental-quic --no-warnings + +// Test: onerror set via connect() options. +// The onerror callback can be provided in the options object at +// session creation time to avoid race conditions with errors that +// occur during or immediately after the handshake. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const transportParams = { maxIdleTimeout: 1 }; +const testError = new Error('destroy with error'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}), { transportParams }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams, + onerror: mustCall((err) => { + assert.strictEqual(err, testError); + }), +}); +await clientSession.opened; + +clientSession.destroy(testError); + +await assert.rejects(clientSession.closed, testError); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-onerror-validation.mjs b/test/parallel/test-quic-callback-error-onerror-validation.mjs new file mode 100644 index 000000000000..61a4219e2f23 --- /dev/null +++ b/test/parallel/test-quic-callback-error-onerror-validation.mjs @@ -0,0 +1,61 @@ +// Flags: --experimental-quic --no-warnings + +// Test: onerror setter validation. +// Setting onerror to a non-function (including null) throws. +// Setting to undefined clears it. Setting to a function works. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const errorCheck = { + code: 'ERR_INVALID_ARG_TYPE', +}; + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + + // Session onerror validation: non-functions throw. + assert.throws(() => { serverSession.onerror = 'not a function'; }, errorCheck); + assert.throws(() => { serverSession.onerror = 42; }, errorCheck); + assert.throws(() => { serverSession.onerror = null; }, errorCheck); + + // Setting to a function works. + const fn = () => {}; + serverSession.onerror = fn; + // The getter returns the bound version, not the original. + assert.strictEqual(typeof serverSession.onerror, 'function'); + + // Setting to undefined clears it. + serverSession.onerror = undefined; + assert.strictEqual(serverSession.onerror, undefined); + + serverSession.close(); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Client-side stream onerror validation. +const stream = await clientSession.createBidirectionalStream({ + body: new TextEncoder().encode('x'), +}); + +assert.throws(() => { stream.onerror = 'not a function'; }, errorCheck); +assert.throws(() => { stream.onerror = 42; }, errorCheck); +assert.throws(() => { stream.onerror = null; }, errorCheck); + +// Setting to a function works. +stream.onerror = () => {}; +assert.strictEqual(typeof stream.onerror, 'function'); + +// Setting to undefined clears it. +stream.onerror = undefined; +assert.strictEqual(stream.onerror, undefined); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-onerror.mjs b/test/parallel/test-quic-callback-error-onerror.mjs new file mode 100644 index 000000000000..cb93d030b89e --- /dev/null +++ b/test/parallel/test-quic-callback-error-onerror.mjs @@ -0,0 +1,73 @@ +// Flags: --experimental-quic --no-warnings + +// Test: onerror callback behavior +// session.onerror fires when session is destroyed with error. +// session.onerror receives the original error as argument. +// session.closed rejects with the original error after onerror. +// session.onerror not called when destroy() has no error. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// quic.session.error fires when a session is destroyed with an error. +// It should fire once for the first client session (destroyed with error) +// and not for the second (destroyed without error). +dc.subscribe('quic.session.error', mustCall((msg) => { + assert.ok(msg.session, 'session.error should include session'); + assert.ok(msg.error, 'session.error should include error'); +})); + +const transportParams = { maxIdleTimeout: 1 }; + +// All tested using a single endpoint with two client sessions. +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}, 2), { transportParams }); + +// First client: destroy WITH error — onerror fires. +{ + const testError = new Error('destroy with error'); + const clientSession = await connect(serverEndpoint.address, { + transportParams, + }); + await clientSession.opened; + + let onerrorCalled = false; + clientSession.onerror = mustCall((err) => { + // Receives the original error. + assert.strictEqual(err, testError); + onerrorCalled = true; + }); + + clientSession.destroy(testError); + + // Onerror was called synchronously during destroy. + assert.strictEqual(onerrorCalled, true); + + // Closed rejects with the original error. + await assert.rejects(clientSession.closed, testError); +} + +// Second client: destroy WITHOUT error — onerror should NOT fire. +{ + const clientSession = await connect(serverEndpoint.address, { + transportParams, + }); + await clientSession.opened; + + clientSession.onerror = mustNotCall('onerror should not be called'); + + clientSession.destroy(); + + // Closed resolves (no error). + await clientSession.closed; +} + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-onhandshake.mjs b/test/parallel/test-quic-callback-error-onhandshake.mjs new file mode 100644 index 000000000000..7c69be5f69ee --- /dev/null +++ b/test/parallel/test-quic-callback-error-onhandshake.mjs @@ -0,0 +1,36 @@ +// Flags: --experimental-quic --no-warnings + +// Test: onhandshake callback error handling. +// A sync throw in onhandshake destroys the session via safeCallbackInvoke. +// The error is delivered to the onerror callback and the session's +// closed promise rejects with the error. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const testError = new Error('onhandshake throw'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}), { transportParams: { maxIdleTimeout: 1 } }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1 }, + onhandshake() { + throw testError; + }, + onerror: mustCall((err) => { + assert.strictEqual(err, testError); + }), +}); + +// The session's closed should reject with the error from the throw. +await assert.rejects(clientSession.closed, testError); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-onnewtoken.mjs b/test/parallel/test-quic-callback-error-onnewtoken.mjs new file mode 100644 index 000000000000..5ae0e1c9e90d --- /dev/null +++ b/test/parallel/test-quic-callback-error-onnewtoken.mjs @@ -0,0 +1,40 @@ +// Flags: --experimental-quic --no-warnings + +// Test: onnewtoken callback error handling. +// A sync throw in onnewtoken destroys the session via safeCallbackInvoke. +// The server submits a NEW_TOKEN after handshake completes; the client +// receives it via the onnewtoken callback. Since the session ticket and +// NEW_TOKEN both arrive after the handshake, session.opened is already +// resolved and there is no unhandled rejection / uncaught exception. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const testError = new Error('onnewtoken throw'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}), { transportParams: { maxIdleTimeout: 1 } }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1 }, + onnewtoken() { + throw testError; + }, + onerror: mustCall((err) => { + assert.strictEqual(err, testError); + }), +}); + +await clientSession.opened; + +// The session's closed should reject with the error from the throw. +await assert.rejects(clientSession.closed, testError); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-onpathvalidation.mjs b/test/parallel/test-quic-callback-error-onpathvalidation.mjs new file mode 100644 index 000000000000..4c0d2aeb57ad --- /dev/null +++ b/test/parallel/test-quic-callback-error-onpathvalidation.mjs @@ -0,0 +1,52 @@ +// Flags: --experimental-quic --no-warnings + +// Test: onpathvalidation callback error handling. +// A sync throw in onpathvalidation destroys the session via +// safeCallbackInvoke. The error is delivered to the onerror +// callback and the session's closed promise rejects. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const testError = new Error('onpathvalidation throw'); + +// The preferred endpoint never receives a new session — it only +// routes PATH_CHALLENGE packets via SessionManager. +const preferredEndpoint = await listen(mustNotCall(), {}); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + // The server session closes with a transport error when the + // client is destroyed by the throw. That's expected. + await assert.rejects(serverSession.closed, { + code: 'ERR_QUIC_TRANSPORT_ERROR', + }); +}), { + transportParams: { + preferredAddressIpv4: preferredEndpoint.address, + }, +}); + +const clientSession = await connect(serverEndpoint.address, { + reuseEndpoint: false, + preferredAddressPolicy: 'use', + onpathvalidation() { + throw testError; + }, + onerror: mustCall((err) => { + // The error from the throw should be delivered here. + assert.strictEqual(err, testError); + }), +}); +await clientSession.opened; + +// The session's closed should reject with the thrown error. +await assert.rejects(clientSession.closed, testError); + +await serverEndpoint.close(); +await preferredEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-onreset.mjs b/test/parallel/test-quic-callback-error-onreset.mjs new file mode 100644 index 000000000000..56af714505c9 --- /dev/null +++ b/test/parallel/test-quic-callback-error-onreset.mjs @@ -0,0 +1,64 @@ +// Flags: --experimental-quic --no-warnings + +// Test: onreset callback error handling. +// A sync throw in stream.onreset destroys the STREAM (not the session) +// via safeCallbackInvoke. The stream.onerror fires with the original +// error, and stream.closed rejects. The session remains alive. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); +const testError = new Error('onreset throw'); + +const serverReady = Promise.withResolvers(); +const serverStreamDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // The stream's onerror should fire with the throw from onreset. + stream.onerror = mustCall((err) => { + assert.strictEqual(err, testError); + }); + + stream.onreset = () => { + throw testError; + }; + + serverReady.resolve(); + + // Stream closed rejects because the onreset throw destroyed it. + await assert.rejects(stream.closed, testError); + serverStreamDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('trigger onstream'), +}); + +// Wait for the server to have the stream before resetting. +await serverReady.promise; +stream.resetStream(1n); + +// Wait for the server stream to be destroyed by the onreset throw. +await serverStreamDone.promise; + +// The client stream was reset. Destroy it explicitly to clean up +// (resetStream only shuts the write side; the read side is still open +// waiting for the server which won't send anything now). +stream.destroy(); +await stream.closed; + +// Close both sides. +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-onsessionticket.mjs b/test/parallel/test-quic-callback-error-onsessionticket.mjs new file mode 100644 index 000000000000..a502ea1e6de3 --- /dev/null +++ b/test/parallel/test-quic-callback-error-onsessionticket.mjs @@ -0,0 +1,39 @@ +// Flags: --experimental-quic --no-warnings + +// Test: onsessionticket callback error handling. +// A sync throw in onsessionticket destroys the session via safeCallbackInvoke. +// Unlike onhandshake throws, no uncaughtException is produced because the +// session ticket arrives after the handshake completes (session.opened is +// already resolved so there is no unhandled rejection). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const testError = new Error('onsessionticket throw'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}), { transportParams: { maxIdleTimeout: 1 } }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1 }, + onsessionticket() { + throw testError; + }, + onerror: mustCall((err) => { + assert.strictEqual(err, testError); + }), +}); + +await clientSession.opened; + +// The session's closed should reject with the error from the throw. +await assert.rejects(clientSession.closed, testError); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-onstream-async.mjs b/test/parallel/test-quic-callback-error-onstream-async.mjs new file mode 100644 index 000000000000..13b5f4dd7555 --- /dev/null +++ b/test/parallel/test-quic-callback-error-onstream-async.mjs @@ -0,0 +1,44 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: async rejection in onstream destroys session. +// safeCallbackInvoke detects the returned promise and attaches a +// rejection handler that calls session.destroy(err). The error is +// delivered to the onerror callback. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const testError = new Error('async onstream rejection'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onerror = mustCall((err) => { + assert.strictEqual(err, testError); + }); + + serverSession.onstream = async () => { + throw testError; + }; + + // Session closed rejects with the error from the async rejection. + await assert.rejects(serverSession.closed, testError); +}), { transportParams: { maxIdleTimeout: 1 } }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1 }, +}); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: new TextEncoder().encode('trigger onstream'), +}); + +// The client session closes via CONNECTION_CLOSE or idle timeout +// after the server session is destroyed by the async rejection. +await Promise.all([stream.closed, clientSession.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-onstream.mjs b/test/parallel/test-quic-callback-error-onstream.mjs new file mode 100644 index 000000000000..729e301134b9 --- /dev/null +++ b/test/parallel/test-quic-callback-error-onstream.mjs @@ -0,0 +1,47 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: callback error handling for onstream. +// Sync throw in onstream destroys the session. +// safeCallbackInvoke catches the throw and calls session.destroy(error). +// The error is delivered to the onerror callback. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const testError = new Error('sync onstream throw'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onerror = mustCall((err) => { + assert.strictEqual(err, testError); + }); + + serverSession.onstream = () => { + throw testError; + }; + + // The session's closed rejects with the error from destroy(). + await assert.rejects(serverSession.closed, testError); +}), { transportParams: { maxIdleTimeout: 1 } }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1 }, +}); +await clientSession.opened; + +// Send data to trigger onstream on the server. +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('trigger onstream'), +}); + +// The client session will close via CONNECTION_CLOSE or idle timeout +// after the server session is destroyed. +await Promise.all([stream.closed, clientSession.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-stream-onerror.mjs b/test/parallel/test-quic-callback-error-stream-onerror.mjs new file mode 100644 index 000000000000..0e8505cdb0e2 --- /dev/null +++ b/test/parallel/test-quic-callback-error-stream-onerror.mjs @@ -0,0 +1,81 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: stream.onerror callback behavior. +// * stream.onerror fires when stream is destroyed with error. +// * stream.onerror receives the original error as argument. +// * stream.closed rejects with the original error after onerror. +// * stream.onerror not called when destroy() has no error. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +{ + const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('will error'), + }); + + const testError = new Error('stream destroy error'); + + let onerrorCalled = false; + stream.onerror = mustCall((err) => { + // Receives the original error. + assert.strictEqual(err, testError); + onerrorCalled = true; + }); + + stream.destroy(testError); + + // The onerror was called synchronously during destroy. + assert.strictEqual(onerrorCalled, true); + + // The stream.closed rejects with the original error. + await assert.rejects(stream.closed, testError); +} + +// The stream.onerror not called when destroy() has no error. +// Create a stream with no body — use the writer API so the server sees +// it and can close cleanly. +{ + const stream = await clientSession.createBidirectionalStream(); + const w = stream.writer; + + stream.onerror = mustNotCall('stream.onerror should not be called'); + + // Send data so the server's onstream fires, then end. + w.writeSync('no error'); + w.endSync(); + + // Wait for the server to process and close its side. + await serverDone.promise; + + // Now destroy without error. + stream.destroy(); + + // Closed should resolve (not reject). + await stream.closed; +} + +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-suppressed-async.mjs b/test/parallel/test-quic-callback-error-suppressed-async.mjs new file mode 100644 index 000000000000..671e82201859 --- /dev/null +++ b/test/parallel/test-quic-callback-error-suppressed-async.mjs @@ -0,0 +1,51 @@ +// Flags: --experimental-quic --no-warnings + +// Test: SuppressedError when async onerror rejects. +// When session.onerror returns a Promise that rejects, a SuppressedError +// wrapping both the rejection reason and the original error is thrown +// via process.nextTick as an uncaught exception. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const originalError = new Error('original destroy error'); +const onerrorRejection = new Error('async onerror rejected'); + +const transportParams = { maxIdleTimeout: 1 }; + +// The SuppressedError is thrown via process.nextTick after the +// onerror promise rejects, so it appears as an uncaught exception. +process.on('uncaughtException', mustCall((err) => { + assert.ok(err instanceof SuppressedError); + // .error is the onerror rejection reason + assert.strictEqual(err.error, onerrorRejection); + // .suppressed is the original error that triggered destroy + assert.strictEqual(err.suppressed, originalError); +})); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}), { transportParams }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams, +}); +await clientSession.opened; + +// Async onerror: returns a promise that rejects. +clientSession.onerror = mustCall(async () => { + throw onerrorRejection; +}); + +clientSession.destroy(originalError); + +// Closed rejects with the original error (not the SuppressedError). +await assert.rejects(clientSession.closed, originalError); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-callback-error-suppressed.mjs b/test/parallel/test-quic-callback-error-suppressed.mjs new file mode 100644 index 000000000000..e6e7bfef4ada --- /dev/null +++ b/test/parallel/test-quic-callback-error-suppressed.mjs @@ -0,0 +1,51 @@ +// Flags: --experimental-quic --no-warnings + +// Test: SuppressedError when onerror throws. +// If session.onerror throws synchronously, a SuppressedError +// wrapping both the onerror error and the original error is +// thrown via process.nextTick as an uncaught exception. +// The SuppressedError's .error is the onerror failure and +// .suppressed is the original error. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const originalError = new Error('original destroy error'); +const onerrorError = new Error('onerror itself threw'); + +const transportParams = { maxIdleTimeout: 1 }; + +// The SuppressedError is thrown via process.nextTick, so it appears +// as an uncaught exception. +process.on('uncaughtException', mustCall((err) => { + assert.ok(err instanceof SuppressedError); + // .error is the onerror failure + assert.strictEqual(err.error, onerrorError); + // .suppressed is the original error that triggered destroy + assert.strictEqual(err.suppressed, originalError); +})); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}), { transportParams }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams, +}); +await clientSession.opened; + +clientSession.onerror = mustCall(() => { + throw onerrorError; +}); + +clientSession.destroy(originalError); + +// Closed rejects with the original error (not the SuppressedError). +await assert.rejects(clientSession.closed, originalError); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-cc-algorithm.mjs b/test/parallel/test-quic-cc-algorithm.mjs new file mode 100644 index 000000000000..8b0a00feb5d6 --- /dev/null +++ b/test/parallel/test-quic-cc-algorithm.mjs @@ -0,0 +1,50 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: congestion control algorithm selection. +// Verify that each CC algorithm (reno, cubic, bbr) can be selected +// and that a session completes a data transfer successfully with each. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const payload = encoder.encode('congestion control test'); +const payloadLength = payload.byteLength; + +for (const cc of ['reno', 'cubic', 'bbr']) { + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const data = await bytes(stream); + assert.strictEqual(data.byteLength, payloadLength); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); + }), { cc }); + + const clientSession = await connect(serverEndpoint.address, { cc }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('congestion control test'), + }); + + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await Promise.all([stream.closed, serverDone.promise]); + + // Verify the session stats show congestion control was active. + assert.ok(clientSession.stats.cwnd > 0n, `${cc}: cwnd should be > 0`); + + await clientSession.closed; + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-certificate-compression.mjs b/test/parallel/test-quic-certificate-compression.mjs new file mode 100644 index 000000000000..455029bfb648 --- /dev/null +++ b/test/parallel/test-quic-certificate-compression.mjs @@ -0,0 +1,112 @@ +// Flags: --experimental-quic --no-warnings + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const tls = await import('node:tls'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +// Certificate compression (RFC 8879) depends on the OpenSSL build linking in +// the compression libraries. Reuse the node:tls detection helper to decide +// whether the feature is available. +const supported = tls.getCertificateCompressionAlgorithms(); +if (supported.length === 0) { + skip('certificate compression not supported by this OpenSSL build'); +} + +// --------------------------------------------------------------------------- +// Option validation. The certificateCompression option is parsed by +// processTlsOptions during connect()/listen(), so invalid values reject the +// returned promise before any network activity happens. +// --------------------------------------------------------------------------- +{ + // Non-array values are rejected. + await assert.rejects( + connect('127.0.0.1:4433', { certificateCompression: true }), + { code: 'ERR_INVALID_ARG_TYPE' }); + + await assert.rejects( + connect('127.0.0.1:4433', { certificateCompression: 'zlib' }), + { code: 'ERR_INVALID_ARG_TYPE' }); + + // Unknown algorithm names are rejected. + await assert.rejects( + connect('127.0.0.1:4433', { certificateCompression: ['invalid'] }), + { code: 'ERR_INVALID_ARG_VALUE', + message: /must be 'zlib', 'brotli', or 'zstd'/ }); + + // Non-string entries are rejected. + await assert.rejects( + connect('127.0.0.1:4433', { certificateCompression: [1] }), + { code: 'ERR_INVALID_ARG_VALUE', + message: /must be 'zlib', 'brotli', or 'zstd'/ }); + + // At most three algorithms may be specified. + await assert.rejects( + connect('127.0.0.1:4433', { + certificateCompression: ['zlib', 'brotli', 'zstd', 'zlib'], + }), + { code: 'ERR_INVALID_ARG_VALUE', message: /at most 3 algorithms/ }); +} + +// --------------------------------------------------------------------------- +// Functional handshakes. Enabling certificate compression must not break the +// TLS 1.3 handshake. The on-the-wire size reduction is exercised by the +// node:tls certificate compression test; over QUIC the payload is encrypted +// and carried in UDP datagrams, so here we assert the handshake completes +// successfully with the option enabled on the server, the client, or both. +// --------------------------------------------------------------------------- +async function handshake({ serverAlgs, clientAlgs }) { + const serverOpened = Promise.withResolvers(); + + const endpoint = await listen(mustCall(async (serverSession) => { + const info = await serverSession.opened; + assert.strictEqual(info.protocol, 'h3'); + serverOpened.resolve(); + serverSession.close(); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + ...(serverAlgs !== undefined ? + { certificateCompression: serverAlgs } : {}), + }); + + const clientSession = await connect(endpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + ...(clientAlgs !== undefined ? + { certificateCompression: clientAlgs } : {}), + }); + + const info = await clientSession.opened; + assert.strictEqual(info.protocol, 'h3'); + + await serverOpened.promise; + await clientSession.close(); + await endpoint.close(); +} + +// Each supported algorithm negotiates a successful handshake when enabled on +// both peers. +for (const algo of supported) { + await handshake({ serverAlgs: [algo], clientAlgs: [algo] }); +} + +// All supported algorithms advertised together. +await handshake({ serverAlgs: supported, clientAlgs: supported }); + +// Asymmetric configurations must also complete: a peer that does not advertise +// compression simply receives an uncompressed certificate. +await handshake({ serverAlgs: [supported[0]], clientAlgs: undefined }); +await handshake({ serverAlgs: undefined, clientAlgs: [supported[0]] }); + +// An empty array is equivalent to disabling compression. +await handshake({ serverAlgs: [], clientAlgs: [] }); diff --git a/test/parallel/test-quic-connection-concurrent.mjs b/test/parallel/test-quic-connection-concurrent.mjs new file mode 100644 index 000000000000..d9f9f253ed3b --- /dev/null +++ b/test/parallel/test-quic-connection-concurrent.mjs @@ -0,0 +1,54 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: concurrent connections from multiple clients. +// Multiple clients connect to the same server simultaneously and each +// exchanges data successfully. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const numClients = 5; +let serverStreamCount = 0; +const allDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Echo back the data. + const w = stream.writer; + w.writeSync(await bytes(stream)); + w.endSync(); + await stream.closed; + if (++serverStreamCount === numClients) { + allDone.resolve(); + } + }); +}, numClients)); + +// Connect all clients concurrently. +const clientPromises = []; +for (let i = 0; i < numClients; i++) { + clientPromises.push((async () => { + const cs = await connect(serverEndpoint.address, { reuseEndpoint: false }); + await cs.opened; + const message = `client ${i}`; + const stream = await cs.createBidirectionalStream({ + body: encoder.encode(message), + }); + const received = await bytes(stream); + assert.strictEqual(new TextDecoder().decode(received), message); + await stream.closed; + cs.close(); + await cs.closed; + })()); +} + +await Promise.all([...clientPromises, allDone.promise]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-connection-limits.mjs b/test/parallel/test-quic-connection-limits.mjs new file mode 100644 index 000000000000..651580cdf350 --- /dev/null +++ b/test/parallel/test-quic-connection-limits.mjs @@ -0,0 +1,77 @@ +// Flags: --experimental-quic --no-warnings + +// Test: connection total limit enforcement. +// maxConnectionsTotal limits total concurrent connections. +// When the limit is exceeded, the server sends CONNECTION_REFUSED +// and the client's session is destroyed with ERR_QUIC_TRANSPORT_ERROR. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect, QuicEndpoint } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +// Create endpoint with maxConnectionsTotal = 1. +const endpoint = new QuicEndpoint({ maxConnectionsTotal: 1 }); + +// Verify the limits are readable and mutable. +assert.strictEqual(endpoint.maxConnectionsTotal, 1); +// The default maxConnectionsPerHost is 100 — a non-zero default that +// prevents a single host from exhausting server resources. +assert.strictEqual(endpoint.maxConnectionsPerHost, 100); +endpoint.maxConnectionsPerHost = 50; +assert.strictEqual(endpoint.maxConnectionsPerHost, 50); +endpoint.maxConnectionsPerHost = 0; + +let sessionCount = 0; + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + sessionCount++; + await Promise.all([serverSession.opened, serverSession.closed]); +}), { + endpoint, + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + transportParams: { maxIdleTimeout: 2 }, +}); + +// First connection should succeed. +const cs1 = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 2 }, +}); +await cs1.opened; + +// Second connection — server rejects with CONNECTION_REFUSED. +const cs2 = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 1 }, + onerror: mustCall((err) => { + assert.strictEqual(err.code, 'ERR_QUIC_TRANSPORT_ERROR'); + }), +}); + +await Promise.all([ + assert.rejects(cs2.opened, { + code: 'ERR_QUIC_TRANSPORT_ERROR', + }), + assert.rejects(cs2.closed, { + code: 'ERR_QUIC_TRANSPORT_ERROR', + }), +]); + +// Only 1 session should have been accepted by the server. +assert.strictEqual(sessionCount, 1); + +await cs1.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-datagram-abandoned.mjs b/test/parallel/test-quic-datagram-abandoned.mjs new file mode 100644 index 000000000000..69032ca21448 --- /dev/null +++ b/test/parallel/test-quic-datagram-abandoned.mjs @@ -0,0 +1,62 @@ +// Flags: --experimental-quic --no-warnings + +// Test: datagram abandoned status for queue overflow. +// When the datagram pending queue is full and a new datagram is sent, +// the drop policy causes a datagram to be dropped. The dropped datagram +// should be reported with status 'abandoned' (not 'lost'), indicating +// it was never actually sent on the wire. + +import { hasQuic, skip, mustCall, mustCallAtLeast } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +let serverSession; + +const serverEndpoint = await listen(mustCall((session) => { + serverSession = session; +}), { + transportParams: { maxDatagramFrameSize: 1200 }, +}); + +const ids = [0n, 0n, 0n]; +let abandoned = false; + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagramstatus: mustCallAtLeast((id, status) => { + if (status === 'abandoned') { + assert.strictEqual(id, ids[0]); + abandoned = true; + } + // We'll likely only get status for one other datagram. + }), +}); +await clientSession.opened; + +// Set a very small queue so overflow happens immediately. +clientSession.maxPendingDatagrams = 2; + +// Send 3 datagrams with a queue size of 2. The first datagram should +// be abandoned when the third is sent (drop-oldest policy is default). +ids[0] = await clientSession.sendDatagram(new Uint8Array([1])); +ids[1] = await clientSession.sendDatagram(new Uint8Array([2])); +ids[2] = await clientSession.sendDatagram(new Uint8Array([3])); + +assert.notStrictEqual(ids[0], 0n); +assert.notStrictEqual(ids[1], 0n); +assert.notStrictEqual(ids[2], 0n); + +// The abandoned status fires synchronously during sendDatagram when the +// queue overflows. It should already be set +assert.strictEqual(abandoned, true); + +await Promise.all([ + serverSession.close(), + clientSession.close(), +]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-datagram-drop-newest.mjs b/test/parallel/test-quic-datagram-drop-newest.mjs new file mode 100644 index 000000000000..285d96f01b5a --- /dev/null +++ b/test/parallel/test-quic-datagram-drop-newest.mjs @@ -0,0 +1,80 @@ +// Flags: --experimental-quic --no-warnings + +// Test: datagram drop-newest policy. +// With maxPendingDatagrams=2 and drop-newest, sending 5 datagrams +// rapidly should reject the newest when the queue is full. The +// server should receive the oldest datagrams. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const allReceived = Promise.withResolvers(); +const allStatusReceived = Promise.withResolvers(); + +let serverCounter = 0; +let clientAbandonCounter = 0; +let clientAckCounter = 0; + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await Promise.all([serverSession.opened, allStatusReceived.promise]); + serverSession.close(); + await serverSession.closed; +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram: mustCall(function(data, early) { + // We should only receive datagrams 1 and 2 + assert.strictEqual(data.length, 1); + assert.ok(data[0] === 0 || data[0] === 1); + assert.ok(!early); + if (++serverCounter === 2) allReceived.resolve(); + }, 2), +}); + +const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + transportParams: { maxDatagramFrameSize: 1200 }, + datagramDropPolicy: 'drop-newest', + ondatagramstatus: mustCall((_, status) => { + if (status === 'abandoned') { + clientAbandonCounter++; + } else if (status === 'acknowledged') { + clientAckCounter++; + } + if (clientAbandonCounter + clientAckCounter === 5) { + allStatusReceived.resolve(); + } + }, 5), +}); + +await clientSession.opened; + +clientSession.maxPendingDatagrams = 2; + +// Send 5 datagrams. With drop-newest, the 3rd/4th/5th are rejected +// (the queue holds the 1st and 2nd). +for (let i = 0; i < 5; i++) { + await clientSession.sendDatagram(new Uint8Array([i])); +} + +await Promise.all([allReceived.promise, allStatusReceived.promise]); + +// 3 abandoned (datagrams 1, 2, 3) and 2 acknowledged (datagrams 4, 5). +assert.strictEqual(clientAbandonCounter, 3); +assert.strictEqual(clientAckCounter, 2); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-datagram-drop-oldest.mjs b/test/parallel/test-quic-datagram-drop-oldest.mjs new file mode 100644 index 000000000000..3c1b92be411e --- /dev/null +++ b/test/parallel/test-quic-datagram-drop-oldest.mjs @@ -0,0 +1,81 @@ +// Flags: --experimental-quic + +// Test: datagram drop-oldest policy. +// With maxPendingDatagrams=2 and drop-oldest, sending 5 datagrams +// rapidly should drop the oldest when the queue overflows. The +// server should receive the most recent datagrams (4th and 5th). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const allReceived = Promise.withResolvers(); +const allStatusReceived = Promise.withResolvers(); + +let serverCounter = 0; +let clientAbandonCounter = 0; +let clientAckCounter = 0; + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await Promise.all([serverSession.opened, allStatusReceived.promise]); + await serverSession.close(); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram: mustCall(function(data, early) { + // With drop-oldest, the queue keeps the newest. After 5 sends with + // queue size 2, only datagrams 4 and 5 (values 3 and 4) remain. + assert.strictEqual(data.length, 1); + assert.ok(data[0] === 3 || data[0] === 4); + assert.ok(!early); + if (++serverCounter === 2) allReceived.resolve(); + }, 2), +}); + +const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + transportParams: { maxDatagramFrameSize: 1200 }, + datagramDropPolicy: 'drop-oldest', + ondatagramstatus: mustCall((_, status) => { + if (status === 'abandoned') { + clientAbandonCounter++; + } else if (status === 'acknowledged') { + clientAckCounter++; + } + if (clientAbandonCounter + clientAckCounter === 5) { + allStatusReceived.resolve(); + } + }, 5), +}); + +await clientSession.opened; + +clientSession.maxPendingDatagrams = 2; + +// Send 5 datagrams. With drop-oldest and queue size 2: +// 1 queued, 2 queued, 3 arrives → 1 dropped, 4 arrives → 2 dropped, +// 5 arrives → 3 dropped. Queue ends with [4, 5]. +for (let i = 0; i < 5; i++) { + await clientSession.sendDatagram(new Uint8Array([i])); +} + +await Promise.all([allReceived.promise, allStatusReceived.promise]); + +// 3 abandoned (datagrams 1, 2, 3) and 2 acknowledged (datagrams 4, 5). +assert.strictEqual(clientAbandonCounter, 3); +assert.strictEqual(clientAckCounter, 2); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-datagram-echo.mjs b/test/parallel/test-quic-datagram-echo.mjs new file mode 100644 index 000000000000..792d1c2d6442 --- /dev/null +++ b/test/parallel/test-quic-datagram-echo.mjs @@ -0,0 +1,68 @@ +// Flags: --experimental-quic --no-warnings + +// Test: datagram server-to-client and echo round-trip +// Server sends datagram, client receives via ondatagram. +// Datagram echo — client sends, server echoes back in +// its ondatagram callback (queued, flushed via SendPendingData). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; +const { setTimeout } = await import('node:timers/promises'); + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const serverGot = Promise.withResolvers(); +const clientGot = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await Promise.all([serverSession.opened, serverGot.promise]); + // Give time for the echo to be sent before closing. + await setTimeout(100); + await serverSession.close(); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + transportParams: { maxDatagramFrameSize: 10 }, + // Server echoes received datagram data back to client. + // The sendDatagram call happens inside ondatagram (ngtcp2 callback + // scope). The datagram is queued and flushed by SendPendingData. + ondatagram: mustCall((data, early, session) => { + assert.ok(data instanceof Uint8Array); + assert.ok(!early); + session.sendDatagram(data); + serverGot.resolve(); + }), +}); + +const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + transportParams: { maxDatagramFrameSize: 10 }, + // Client receives datagram from server. + ondatagram: mustCall(function(data) { + assert.ok(data instanceof Uint8Array); + assert.strictEqual(data.byteLength, 3); + assert.strictEqual(data[0], 10); + assert.strictEqual(data[1], 20); + assert.strictEqual(data[2], 30); + clientGot.resolve(); + }), +}); + +await clientSession.opened; + +// Client sends datagram to trigger the echo. +await clientSession.sendDatagram(new Uint8Array([10, 20, 30])); + +await Promise.all([serverGot.promise, clientGot.promise, clientSession.closed]); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-datagram-edge-cases.mjs b/test/parallel/test-quic-datagram-edge-cases.mjs new file mode 100644 index 000000000000..589168dd20a0 --- /dev/null +++ b/test/parallel/test-quic-datagram-edge-cases.mjs @@ -0,0 +1,91 @@ +// Flags: --experimental-quic --no-warnings + +// Test: datagram edge cases. +// DGRAM-08 / DGIMP-08: Zero-length datagram returns 0n (not sent). +// DGC-01 / DGIMP-09: maxDatagramFrameSize: 0 disables datagrams entirely. +// Datagram arrives with no ondatagram callback — no crash. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import { setTimeout } from 'node:timers/promises'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// --- DGRAM-08 / DGIMP-08: Zero-length datagram returns 0n --- +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + }), { + transportParams: { maxIdleTimeout: 1, maxDatagramFrameSize: 1200 }, + }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1, maxDatagramFrameSize: 1200 }, + }); + await clientSession.opened; + + // Zero-length ArrayBufferView + const zeroId = await clientSession.sendDatagram(new Uint8Array(0)); + assert.strictEqual(zeroId, 0n); + + // Zero-length string + const emptyStringId = await clientSession.sendDatagram(''); + assert.strictEqual(emptyStringId, 0n); + + await clientSession.close(); + await serverEndpoint.close(); +} + +// --- DGC-01 / DGIMP-09: maxDatagramFrameSize: 0 disables datagrams --- +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + }), { + // Server advertises 0 — no datagrams accepted. + transportParams: { maxIdleTimeout: 1, maxDatagramFrameSize: 0 }, + }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1, maxDatagramFrameSize: 10 }, + }); + await clientSession.opened; + + // maxDatagramSize reflects the peer's (server's) transport param. + assert.strictEqual(clientSession.maxDatagramSize, 0); + + // Sending returns 0n immediately — datagram not sent. + const id = await clientSession.sendDatagram(new Uint8Array([1, 2, 3])); + assert.strictEqual(id, 0n); + + await clientSession.close(); + await serverEndpoint.close(); +} + +// --- DGRAM-11: No ondatagram callback — no crash --- +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + // No ondatagram set — datagrams arrive but are silently discarded. + await serverSession.opened; + // Give time for the datagram to arrive and be processed without crash. + await setTimeout(200); + await serverSession.close(); + }), { + transportParams: { maxDatagramFrameSize: 1200 }, + }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, + }); + await clientSession.opened; + + // Send a datagram even though the server has no ondatagram handler. + const id = await clientSession.sendDatagram(new Uint8Array([1, 2, 3])); + assert.notStrictEqual(id, 0n); + + await clientSession.closed; + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-datagram-frame-size-validation.mjs b/test/parallel/test-quic-datagram-frame-size-validation.mjs new file mode 100644 index 000000000000..d3ce5c43304c --- /dev/null +++ b/test/parallel/test-quic-datagram-frame-size-validation.mjs @@ -0,0 +1,55 @@ +// Flags: --experimental-quic --no-warnings + +// Test: maxDatagramFrameSize transport param validation. +// The maxDatagramFrameSize transport parameter must be a uint16 +// (0-65535). Values outside this range or of the wrong type should +// be rejected. + +import { hasQuic, skip, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const sni = { '*': { keys: [key], certs: [cert] } }; +const alpn = ['quic-test']; + +// Invalid values for maxDatagramFrameSize — must be rejected. +const invalid = [ + -1, + 65536, + 1.5, + 'a', + null, + false, + true, + {}, + [], + () => {}, +]; + +for (const maxDatagramFrameSize of invalid) { + const transportParams = { maxDatagramFrameSize }; + await assert.rejects( + listen(mustNotCall(), { sni, alpn, transportParams }), + { code: 'ERR_INVALID_ARG_VALUE' }, + `listen should reject maxDatagramFrameSize: ${maxDatagramFrameSize}`, + ); +} + +// Valid values — should not throw. +const valid = [0, 1, 100, 1200, 65535]; + +for (const maxDatagramFrameSize of valid) { + const transportParams = { maxDatagramFrameSize }; + const ep = await listen(mustNotCall(), { sni, alpn, transportParams }); + ep.close(); + await ep.closed; +} diff --git a/test/parallel/test-quic-datagram-multiple.mjs b/test/parallel/test-quic-datagram-multiple.mjs new file mode 100644 index 000000000000..733322ea047d --- /dev/null +++ b/test/parallel/test-quic-datagram-multiple.mjs @@ -0,0 +1,82 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: multiple datagrams and datagrams alongside streams +// Client sends multiple datagrams. +// Datagrams sent alongside an active bidi stream. +// Datagrams are unreliable — we verify at least some arrive. +// The stream is opened first to establish bidirectional traffic, +// keeping the congestion window healthy for datagram sends. + +import { hasQuic, skip, mustCall, mustCallAtLeast } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const numDatagrams = 5; +let serverDatagramCount = 0; +const gotSomeDg = Promise.withResolvers(); +const streamDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + + // Server receives stream data alongside datagrams. + serverSession.onstream = mustCall(async (stream) => { + stream.writer.endSync(); + await bytes(stream); + await stream.closed; + streamDone.resolve(); + }); + + await Promise.all([gotSomeDg.promise, streamDone.promise]); + await serverSession.close(); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram: mustCallAtLeast((data) => { + assert.ok(data instanceof Uint8Array); + serverDatagramCount++; + gotSomeDg.resolve(); + }), +}); + +const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + transportParams: { maxDatagramFrameSize: 1200 }, +}); + +await clientSession.opened; + +// Open a stream FIRST to establish bidirectional traffic. +// This ensures ACKs flow back from the server, keeping the +// congestion window open for subsequent datagram sends. +const stream = await clientSession.createBidirectionalStream({ + body: new TextEncoder().encode('hello'), +}); + +// Send multiple datagrams alongside the active stream. +for (let i = 0; i < numDatagrams; i++) { + await clientSession.sendDatagram(new Uint8Array([i])); +} + +// Complete the stream. +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await stream.closed; + +// At least some datagrams should have arrived. +assert.ok(serverDatagramCount > 0, 'Server should have received at least one datagram'); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-datagram-no-detach.mjs b/test/parallel/test-quic-datagram-no-detach.mjs new file mode 100644 index 000000000000..83c42c0221dc --- /dev/null +++ b/test/parallel/test-quic-datagram-no-detach.mjs @@ -0,0 +1,68 @@ +// Flags: --experimental-quic --no-warnings + +// session.sendDatagram() must not detach the caller's underlying +// ArrayBuffer. The bytes are copied into an internal buffer on every +// send, so the caller's source ArrayBuffer remains live and may be +// reused for further sends, mutated, or sliced into additional views. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const received = []; +const allReceived = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await allReceived.promise; + await serverSession.close(); +}), { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram: mustCall((data) => { + received.push(Buffer.from(data)); + if (received.length === 3) allReceived.resolve(); + }, 3), +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, +}); +await clientSession.opened; + +// A full-buffer Uint8Array. The same source must be reusable across +// multiple sendDatagram calls. +const source = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]); + +const firstId = await clientSession.sendDatagram(source); +assert.notStrictEqual(firstId, 0n); +assert.strictEqual(source.buffer.detached, false); // source ArrayBuffer must not be detached after sendDatagram + +const secondId = await clientSession.sendDatagram(source); +assert.notStrictEqual(secondId, 0n); +assert.strictEqual(source.buffer.detached, false); // source ArrayBuffer must remain live after second sendDatagram + +// Mutating the source after the previous sendDatagram returned must +// not affect what the peer ultimately receives — the bytes have +// already been copied into the QUIC layer's internal buffer. +source[0] = 99; +const thirdId = await clientSession.sendDatagram(source); +assert.notStrictEqual(thirdId, 0n); + +await allReceived.promise; + +// Datagrams are unreliable and may be reordered, but the test fixture +// does not exercise loss or reordering — assert by sorting. +const sorted = received.map((b) => b.toString('hex')).sort(); +const expected = [ + Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]).toString('hex'), + Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]).toString('hex'), + Buffer.from([99, 2, 3, 4, 5, 6, 7, 8]).toString('hex'), +].sort(); +assert.deepStrictEqual(sorted, expected); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-datagram-size-limits.mjs b/test/parallel/test-quic-datagram-size-limits.mjs new file mode 100644 index 000000000000..9b3cf5665d84 --- /dev/null +++ b/test/parallel/test-quic-datagram-size-limits.mjs @@ -0,0 +1,62 @@ +// Flags: --experimental-quic --no-warnings + +// Test: datagram size limit enforcement. +// Datagram larger than maxDatagramSize returns 0n (not sent). +// Datagram at exactly maxDatagramSize is accepted and delivered. +// Same as DGRAM-03 via sendDatagram return value. +// maxDatagramSize reflects the maximum datagram payload the peer can +// receive, accounting for DATAGRAM frame overhead (type byte + varint +// length encoding). It is derived from the peer's maxDatagramFrameSize +// transport parameter minus the frame overhead. +// We use maxDatagramFrameSize: 200 so that the exact-max datagram fits +// comfortably within a QUIC packet (which has its own header + AEAD +// overhead on top of the DATAGRAM frame). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverGot = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverGot.promise; + serverSession.close(); + await serverSession.closed; +}), { + transportParams: { maxDatagramFrameSize: 200 }, + ondatagram: mustCall((data) => { + assert.ok(data instanceof Uint8Array); + serverGot.resolve(); + }), +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 200 }, +}); +await clientSession.opened; + +const maxSize = clientSession.maxDatagramSize; + +// maxDatagramSize should be less than maxDatagramFrameSize due to +// the DATAGRAM frame overhead (1 byte type + varint length encoding). +assert.ok(maxSize > 0); +assert.ok(maxSize < 200); + +// DGRAM-03 / DGIMP-10: Datagram too large — returns 0n. +const oversized = new Uint8Array(maxSize + 1); +const tooLargeId = await clientSession.sendDatagram(oversized); +assert.strictEqual(tooLargeId, 0n); + +// Datagram at exactly maxDatagramSize — accepted and delivered. +const exactMax = new Uint8Array(maxSize); +exactMax[0] = 42; +const exactId = await clientSession.sendDatagram(exactMax); +assert.notStrictEqual(exactId, 0n); + +await Promise.all([serverGot.promise, clientSession.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-datagram-sources.mjs b/test/parallel/test-quic-datagram-sources.mjs new file mode 100644 index 000000000000..03c067ec263d --- /dev/null +++ b/test/parallel/test-quic-datagram-sources.mjs @@ -0,0 +1,218 @@ +// Flags: --experimental-quic --no-warnings + +// Test: sendDatagram with various input source types. +// String with custom encoding (e.g., 'hex'). +// Promise input — resolves then sends. +// Promise input — session closes during await, returns 0n. +// SharedArrayBuffer copies instead of transfers. +// Pooled Buffer (partial view) copies correctly. +// DataView input. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// --- DGIMP-01: String with custom encoding --- +{ + const received = []; + const allReceived = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await allReceived.promise; + await serverSession.close(); + }), { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram: mustCall((data) => { + received.push(Buffer.from(data)); + if (received.length === 2) allReceived.resolve(); + }, 2), + }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, + }); + await clientSession.opened; + + // Send hex-encoded string — '48656c6c6f' is 'Hello' in hex. + const hexId = await clientSession.sendDatagram('48656c6c6f', 'hex'); + assert.notStrictEqual(hexId, 0n); + + // Send base64-encoded string — 'V29ybGQ=' is 'World' in base64. + const b64Id = await clientSession.sendDatagram('V29ybGQ=', 'base64'); + assert.notStrictEqual(b64Id, 0n); + + await allReceived.promise; + + assert.deepStrictEqual(received[0], Buffer.from('Hello')); + assert.deepStrictEqual(received[1], Buffer.from('World')); + + await clientSession.closed; + await serverEndpoint.close(); +} + +// --- DGIMP-02: Promise input --- +{ + const serverGot = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverGot.promise; + await serverSession.close(); + }), { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram: mustCall((data) => { + assert.deepStrictEqual(Buffer.from(data), Buffer.from([42])); + serverGot.resolve(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, + }); + await clientSession.opened; + + // Send a Promise that resolves to a Uint8Array. + const promiseId = await clientSession.sendDatagram( + Promise.resolve(new Uint8Array([42])), + ); + assert.notStrictEqual(promiseId, 0n); + + await Promise.all([serverGot.promise, clientSession.closed]); + await serverEndpoint.close(); +} + +// --- DGIMP-03: Promise input, session closes during await --- +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + }), { + transportParams: { maxIdleTimeout: 1, maxDatagramFrameSize: 1200 }, + onerror() {}, + }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1, maxDatagramFrameSize: 1200 }, + }); + await clientSession.opened; + + // Create a promise that resolves after the session starts closing. + // sendDatagram passes the initial checks, then awaits the promise. + // While awaiting, the session closes. When the promise resolves, + // sendDatagram finds the session closed and returns 0n. + const slowPromise = new Promise((resolve) => { + setImmediate(mustCall(async () => { + await clientSession.close(); + resolve(new Uint8Array([1])); + })); + }); + + const id = await clientSession.sendDatagram(slowPromise); + assert.strictEqual(id, 0n); + + await serverEndpoint.close(); +} + +// --- DGIMP-04: SharedArrayBuffer --- +{ + const serverGot = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverGot.promise; + await serverSession.close(); + }), { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram: mustCall((data) => { + assert.deepStrictEqual(Buffer.from(data), Buffer.from([10, 20, 30])); + serverGot.resolve(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, + }); + await clientSession.opened; + + // Create a SharedArrayBuffer-backed view. + const sab = new SharedArrayBuffer(3); + const view = new Uint8Array(sab); + view[0] = 10; + view[1] = 20; + view[2] = 30; + + const id = await clientSession.sendDatagram(view); + assert.notStrictEqual(id, 0n); + + // The SharedArrayBuffer should still be usable (copied, not transferred). + assert.strictEqual(view[0], 10); + + await Promise.all([serverGot.promise, clientSession.closed]); + await serverEndpoint.close(); +} + +// --- DGIMP-05: Pooled Buffer (partial view) --- +{ + const serverGot = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverGot.promise; + await serverSession.close(); + }), { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram: mustCall((data) => { + // The received data should match the slice content. + assert.deepStrictEqual(Buffer.from(data), Buffer.from('hello')); + serverGot.resolve(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, + }); + await clientSession.opened; + + // Buffer.from('hello') creates a pooled buffer — its backing + // ArrayBuffer is larger and the view has a non-zero offset. + const pooledBuf = Buffer.from('hello'); + const id = await clientSession.sendDatagram(pooledBuf); + assert.notStrictEqual(id, 0n); + + await Promise.all([serverGot.promise, clientSession.closed]); + await serverEndpoint.close(); +} + +// --- DGIMP-06: DataView --- +{ + const serverGot = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverGot.promise; + await serverSession.close(); + }), { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram: mustCall((data) => { + assert.deepStrictEqual(Buffer.from(data), Buffer.from([0xCA, 0xFE])); + serverGot.resolve(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, + }); + await clientSession.opened; + + const ab = new ArrayBuffer(4); + const fullView = new Uint8Array(ab); + fullView.set([0xDE, 0xAD, 0xCA, 0xFE]); + + // DataView over bytes [2, 3] of the buffer. + const dv = new DataView(ab, 2, 2); + const id = await clientSession.sendDatagram(dv); + assert.notStrictEqual(id, 0n); + + await Promise.all([serverGot.promise, clientSession.closed]); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-datagram-status.mjs b/test/parallel/test-quic-datagram-status.mjs new file mode 100644 index 000000000000..264f905650bd --- /dev/null +++ b/test/parallel/test-quic-datagram-status.mjs @@ -0,0 +1,74 @@ +// Flags: --experimental-quic --no-warnings + +// Test: ondatagramstatus callback. +// After sending a datagram, the ondatagramstatus callback fires +// with the datagram ID and either 'acknowledged' or 'lost'. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; +const { setTimeout } = await import('node:timers/promises'); + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const serverGot = Promise.withResolvers(); +const statusReceived = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await Promise.all([serverSession.opened, serverGot.promise]); + // Give a moment for the ACK to propagate to the client so the + // ondatagramstatus callback fires before the session closes. + await setTimeout(100); + await serverSession.close(); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram: mustCall(function() { + serverGot.resolve(); + }), +}); + +let statusId; +let statusValue; + +const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagramstatus: mustCall((id, status) => { + assert.strictEqual(typeof id, 'bigint'); + assert.strictEqual(typeof status, 'string'); + assert.ok( + status === 'acknowledged' || status === 'lost' || status === 'abandoned', + `status should be 'acknowledged', 'lost', or 'abandoned', got '${status}'`, + ); + + statusId = id; + statusValue = status; + statusReceived.resolve(); + }), +}); + +await clientSession.opened; +const id = await clientSession.sendDatagram(new Uint8Array([1, 2, 3])); + +// Wait for the server to receive and the status callback to fire. +await Promise.all([serverGot.promise, statusReceived.promise]); + +// The status callback should have been called with the same ID. +assert.strictEqual(statusId, id); +// On localhost the datagram should be acknowledged, not lost. +assert.strictEqual(statusValue, 'acknowledged'); + +await clientSession.closed; + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-datagram-utf8.mjs b/test/parallel/test-quic-datagram-utf8.mjs new file mode 100644 index 000000000000..e6f24286c9b1 --- /dev/null +++ b/test/parallel/test-quic-datagram-utf8.mjs @@ -0,0 +1,44 @@ +// Flags: --experimental-quic --no-warnings + +// Test: string datagram with multi-byte UTF-8 characters. +// Verifies that sendDatagram with a string containing multi-byte UTF-8 +// characters (CJK, emoji, etc.) encodes correctly and the receiver +// gets the exact bytes. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const message = '\u4f60\u597d\u4e16\u754c'; // "Hello World" in Chinese +const expected = Buffer.from(message, 'utf8'); + +const serverGot = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverGot.promise; + await serverSession.close(); +}), { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram: mustCall((data) => { + assert.ok(data instanceof Uint8Array); + // Verify the received bytes match the UTF-8 encoding. + assert.deepStrictEqual(Buffer.from(data), expected); + serverGot.resolve(); + }), +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, +}); +await clientSession.opened; + +const id = await clientSession.sendDatagram(message); +assert.strictEqual(id, 1n); + +await Promise.all([serverGot.promise, clientSession.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-datagram.mjs b/test/parallel/test-quic-datagram.mjs new file mode 100644 index 000000000000..2de13bc772e6 --- /dev/null +++ b/test/parallel/test-quic-datagram.mjs @@ -0,0 +1,60 @@ +// Flags: --experimental-quic --no-warnings + +// Test: basic datagram send and receive. +// Client sends datagram, server receives via ondatagram. +// maxDatagramSize reflects peer's transport param. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const serverGot = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + // maxDatagramSize reflects peer's max payload (frame size + // minus DATAGRAM frame overhead of type byte + varint length). + assert.ok(serverSession.maxDatagramSize > 0); + assert.ok(serverSession.maxDatagramSize < 1200); + // Wait for the datagram before closing. + await serverGot.promise; + await serverSession.close(); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram: mustCall((data) => { + assert.ok(data instanceof Uint8Array); + assert.strictEqual(data.byteLength, 3); + serverGot.resolve(); + }), +}); + +const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + transportParams: { maxDatagramFrameSize: 1200 }, +}); + +await clientSession.opened; + +// Client maxDatagramSize reflects actual payload max. +assert.ok(clientSession.maxDatagramSize > 0); +assert.ok(clientSession.maxDatagramSize < 1200); + +// Client sends datagram. +const id = await clientSession.sendDatagram(new Uint8Array([1, 2, 3])); +assert.strictEqual(id, 1n); + +await Promise.all([serverGot.promise, clientSession.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-default-stream-limits.mjs b/test/parallel/test-quic-default-stream-limits.mjs new file mode 100644 index 000000000000..be1ec5bf3e67 --- /dev/null +++ b/test/parallel/test-quic-default-stream-limits.mjs @@ -0,0 +1,53 @@ +// Flags: --experimental-quic --no-warnings + +// Test: default transport parameter limits are reasonable. +// Verify that the default transport parameters have sane values: +// not zero (which would prevent streams), and not excessively large +// (which could waste resources). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + const info = await serverSession.opened; + + // The handshake info should be available. + assert.ok(info, 'handshake info should be available'); + + await serverSession.closed; +})); + +const clientSession = await connect(serverEndpoint.address, { + reuseEndpoint: false, +}); +const info = await clientSession.opened; + +// Verify the handshake completed and we can inspect the session. +assert.ok(info, 'handshake info should be available'); + +// Check that the session has reasonable default stream limits by +// verifying we can create at least one bidirectional and one +// unidirectional stream. +const bidiStream = await clientSession.createBidirectionalStream(); +assert.ok(bidiStream, 'should be able to create a bidi stream'); +bidiStream.destroy(); + +const uniStream = await clientSession.createUnidirectionalStream(); +assert.ok(uniStream, 'should be able to create a uni stream'); +uniStream.destroy(); + +// Check the endpoint's maxConnectionsPerHost and maxConnectionsTotal +// defaults are either 0 (unlimited) or a reasonable positive number. +const maxPerHost = serverEndpoint.maxConnectionsPerHost; +const maxTotal = serverEndpoint.maxConnectionsTotal; +assert.ok(maxPerHost >= 0, 'maxConnectionsPerHost should be non-negative'); +assert.ok(maxTotal >= 0, 'maxConnectionsTotal should be non-negative'); + +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-diagnostics-channel-busy.mjs b/test/parallel/test-quic-diagnostics-channel-busy.mjs new file mode 100644 index 000000000000..a235feeecb11 --- /dev/null +++ b/test/parallel/test-quic-diagnostics-channel-busy.mjs @@ -0,0 +1,41 @@ +// Flags: --experimental-quic --no-warnings + +// Test: diagnostics_channel endpoint busy change. +// quic.endpoint.busy.change fires on endpoint.busy toggle. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, QuicEndpoint } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +let busyChangeCount = 0; +dc.subscribe('quic.endpoint.busy.change', mustCall((msg) => { + busyChangeCount++; + assert.ok(msg.endpoint); + assert.strictEqual(typeof msg.busy, 'boolean'); +}, 2)); + +const endpoint = new QuicEndpoint(); +const serverEndpoint = await listen(mustNotCall(), { + endpoint, + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], +}); + +// Toggle busy on and off. +endpoint.busy = true; +endpoint.busy = false; + +assert.strictEqual(busyChangeCount, 2); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-diagnostics-channel-datagram-status.mjs b/test/parallel/test-quic-diagnostics-channel-datagram-status.mjs new file mode 100644 index 000000000000..17a3bfefd489 --- /dev/null +++ b/test/parallel/test-quic-diagnostics-channel-datagram-status.mjs @@ -0,0 +1,46 @@ +// Flags: --experimental-quic --no-warnings + +// Test: diagnostics_channel datagram status event. +// quic.session.receive.datagram.status fires with ack/lost status. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const statusDone = Promise.withResolvers(); + +// quic.session.receive.datagram.status fires with status. +dc.subscribe('quic.session.receive.datagram.status', mustCall((msg) => { + assert.ok(msg.session); + assert.ok(msg.id); + assert.strictEqual(msg?.status, 'acknowledged'); + statusDone.resolve(); +})); + +const serverEndpoint = await listen(async (serverSession) => { + // Server stays alive until the client closes so the ACK + // has time to propagate back to the client. + await serverSession.closed; +}, { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram() {}, +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagramstatus() {}, +}); +await clientSession.opened; + +await clientSession.sendDatagram(new Uint8Array([1, 2, 3])); + +// Wait for the status event before closing. +await statusDone.promise; +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-diagnostics-channel-datagram.mjs b/test/parallel/test-quic-diagnostics-channel-datagram.mjs new file mode 100644 index 000000000000..578c338fc7f0 --- /dev/null +++ b/test/parallel/test-quic-diagnostics-channel-datagram.mjs @@ -0,0 +1,50 @@ +// Flags: --experimental-quic --no-warnings + +// Test: diagnostics_channel datagram events. +// quic.session.receive.datagram fires on datagram receipt. +// quic.session.send.datagram fires on datagram send. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverGot = Promise.withResolvers(); + +// quic.session.send.datagram fires on send. +dc.subscribe('quic.session.send.datagram', mustCall((msg) => { + assert.ok(msg.session); + assert.ok(msg.id); + assert.ok(msg.length > 0); +})); + +// quic.session.receive.datagram fires on receipt. +dc.subscribe('quic.session.receive.datagram', mustCall((msg) => { + assert.ok(msg.session); + assert.ok(msg.length > 0); +})); + +const serverEndpoint = await listen(async (serverSession) => { + await serverSession.closed; +}, { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram() { + serverGot.resolve(); + }, +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, +}); +await clientSession.opened; + +await clientSession.sendDatagram(new Uint8Array([1, 2, 3])); + +await serverGot.promise; +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-diagnostics-channel-error.mjs b/test/parallel/test-quic-diagnostics-channel-error.mjs new file mode 100644 index 000000000000..221710ab74ff --- /dev/null +++ b/test/parallel/test-quic-diagnostics-channel-error.mjs @@ -0,0 +1,46 @@ +// Flags: --experimental-quic --no-warnings + +// Test: diagnostics_channel endpoint error event. +// quic.endpoint.error fires on endpoint error. +// Trigger a bind failure (port conflict) and verify the channel fires. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const sni = { '*': { keys: [key], certs: [cert] } }; +const alpn = ['quic-test']; + +dc.subscribe('quic.endpoint.error', mustCall((msg) => { + assert.ok(msg.endpoint); + assert.ok(msg.error); +})); + +// Create first endpoint to occupy a port. +const ep1 = await listen(mustNotCall(), { sni, alpn }); +const { port } = ep1.address; + +// Create second endpoint on the same port — triggers bind error. +const ep2 = await listen(mustNotCall(), { + sni, + alpn, + endpoint: { address: `127.0.0.1:${port}` }, +}); + +// ep2 is destroyed due to bind failure. +assert.strictEqual(ep2.destroyed, true); +await assert.rejects(ep2.closed, { + code: 'ERR_QUIC_ENDPOINT_CLOSED', + message: /Bind failure/, +}); +await ep1.close(); diff --git a/test/parallel/test-quic-diagnostics-channel-path.mjs b/test/parallel/test-quic-diagnostics-channel-path.mjs new file mode 100644 index 000000000000..6cc36af985d9 --- /dev/null +++ b/test/parallel/test-quic-diagnostics-channel-path.mjs @@ -0,0 +1,58 @@ +// Flags: --experimental-quic --no-warnings + +// Test: diagnostics_channel path validation event. +// quic.session.path.validation fires when path validation completes +// during preferred address migration. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const clientChannelFired = Promise.withResolvers(); + +// Subscribe to the path validation diagnostics channel. +// Verify the client-side event fires with the correct properties. +dc.subscribe('quic.session.path.validation', mustCall((msg) => { + assert.ok(msg.session, 'message should have session'); + assert.ok(msg.result, 'message should have result'); + assert.ok(msg.newLocalAddress, 'message should have newLocalAddress'); + assert.ok(msg.newRemoteAddress, 'message should have newRemoteAddress'); + if (msg.preferredAddress === true) { + clientChannelFired.resolve(); + } +})); + +const preferredEndpoint = await listen(mustNotCall(), { + onpathvalidation() {}, + onerror() {}, +}); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}), { + transportParams: { + preferredAddressIpv4: preferredEndpoint.address, + }, + onpathvalidation() {}, + onerror() {}, +}); + +const clientSession = await connect(serverEndpoint.address, { + reuseEndpoint: false, + preferredAddressPolicy: 'use', + // The onpathvalidation must be set for the JS handler to fire, + // which in turn publishes to the diagnostics channel. + onpathvalidation: mustCall(), +}); + +await Promise.all([clientSession.opened, clientChannelFired.promise]); + +await clientSession.close(); +await serverEndpoint.close(); +await preferredEndpoint.close(); diff --git a/test/parallel/test-quic-diagnostics-channel-session.mjs b/test/parallel/test-quic-diagnostics-channel-session.mjs new file mode 100644 index 000000000000..bd5ae93cd3cf --- /dev/null +++ b/test/parallel/test-quic-diagnostics-channel-session.mjs @@ -0,0 +1,47 @@ +// Flags: --experimental-quic --no-warnings + +// Test: diagnostics_channel session events. +// quic.session.handshake fires when handshake completes. +// quic.session.update.key fires on key update. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// quic.session.handshake fires on both sides. +let handshakeCount = 0; +dc.subscribe('quic.session.handshake', mustCall((msg) => { + handshakeCount++; + assert.ok(msg.session); + // The handshake info should include standard TLS fields. + assert.strictEqual(typeof msg.protocol, 'string'); + assert.strictEqual(typeof msg.servername, 'string'); +}, 2)); + +// quic.session.update.key fires on key update. +dc.subscribe('quic.session.update.key', mustCall((msg) => { + assert.ok(msg.session); +})); + +const serverEndpoint = await listen(async (serverSession) => { + await serverSession.opened; + await serverSession.close(); +}); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Trigger a key update to fire a key update event. +clientSession.updateKey(); + +await clientSession.closed; +await serverEndpoint.close(); + +// Both client and server handshakes should have fired. +assert.strictEqual(handshakeCount, 2); diff --git a/test/parallel/test-quic-diagnostics-channel-stream.mjs b/test/parallel/test-quic-diagnostics-channel-stream.mjs new file mode 100644 index 000000000000..96a6074fc374 --- /dev/null +++ b/test/parallel/test-quic-diagnostics-channel-stream.mjs @@ -0,0 +1,65 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: diagnostics_channel stream and handshake events +// quic.session.handshake fires on handshake complete (not in +// the channel list but we test the opened event path). +// quic.session.open.stream fires when a stream is created locally. +// quic.session.received.stream fires when a remote stream arrives. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); + +// Fires when the client creates a stream. +dc.subscribe('quic.session.open.stream', mustCall((msg) => { + assert.ok(msg.stream); + assert.ok(msg.session); + assert.strictEqual(msg.direction, 'bidi'); // open.stream direction should be bidi +})); + +// Fires when the server receives a stream. +dc.subscribe('quic.session.received.stream', mustCall((msg) => { + assert.ok(msg.stream); + assert.ok(msg.session); + assert.strictEqual(msg.direction, 'bidi'); // received.stream direction should be bidi +})); + +// Fires when a stream is destroyed. +dc.subscribe('quic.stream.closed', mustCall((msg) => { + assert.ok(msg.stream); + assert.ok(msg.session); + assert.ok(msg.stats, 'stream.closed should include stats'); +}, 2)); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + await bytes(stream); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('diagnostics test'), +}); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + +await Promise.all([stream.closed, serverDone.promise, clientSession.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-diagnostics-channel-token.mjs b/test/parallel/test-quic-diagnostics-channel-token.mjs new file mode 100644 index 000000000000..1c2a9d3e6672 --- /dev/null +++ b/test/parallel/test-quic-diagnostics-channel-token.mjs @@ -0,0 +1,52 @@ +// Flags: --experimental-quic --no-warnings + +// Test: diagnostics_channel token/ticket events. +// quic.session.ticket fires when session ticket received. +// quic.session.new.token fires when NEW_TOKEN received. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const allDone = Promise.withResolvers(); +let ticketFired = false; +let tokenFired = false; + +function checkDone() { + if (ticketFired && tokenFired) allDone.resolve(); +} + +// quic.session.ticket fires when session ticket received. +dc.subscribe('quic.session.ticket', mustCall((msg) => { + assert.ok(msg.session); + assert.ok(msg.ticket); + ticketFired = true; + checkDone(); +})); + +// quic.session.new.token fires when NEW_TOKEN received. +dc.subscribe('quic.session.new.token', mustCall((msg) => { + assert.ok(msg.session); + assert.ok(msg.token); + assert.ok(msg.address); + tokenFired = true; + checkDone(); +})); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +})); + +const clientSession = await connect(serverEndpoint.address, { + onsessionticket: mustCall((ticket) => { assert.ok(ticket); }), + onnewtoken: mustCall((token) => { assert.ok(token); }), +}); +await Promise.all([clientSession.opened, allDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-diagnostics-channel.mjs b/test/parallel/test-quic-diagnostics-channel.mjs new file mode 100644 index 000000000000..6e80419e2cbf --- /dev/null +++ b/test/parallel/test-quic-diagnostics-channel.mjs @@ -0,0 +1,104 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: diagnostics_channel events. +// quic.endpoint.created fires when endpoint is created. +// quic.endpoint.listen fires when endpoint starts listening. +// quic.endpoint.closing fires when endpoint begins closing. +// quic.endpoint.closed fires when endpoint finishes closing. +// quic.session.created.client fires for client sessions. +// quic.session.created.server fires for server sessions. +// quic.session.closing fires when session begins closing. +// quic.session.closed fires when session finishes closing. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const events = []; + +// endpoint.created fires for both server and client endpoints. +dc.subscribe('quic.endpoint.created', mustCall((msg) => { + events.push('endpoint.created'); + assert.ok(msg.endpoint); +}, 2)); + +// endpoint.listen fires once (server only). +dc.subscribe('quic.endpoint.listen', mustCall((msg) => { + events.push('endpoint.listen'); + assert.ok(msg.endpoint); +})); + +// endpoint.closing fires once (server endpoint closes). +dc.subscribe('quic.endpoint.closing', mustCall((msg) => { + events.push('endpoint.closing'); + assert.ok(msg.endpoint); +})); + +// endpoint.closed fires once (server endpoint closed). +dc.subscribe('quic.endpoint.closed', mustCall((msg) => { + events.push('endpoint.closed'); + assert.ok(msg.endpoint); + assert.ok(msg.stats, 'endpoint.closed should include stats'); +})); + +// endpoint.connect fires before a client session is created. +dc.subscribe('quic.endpoint.connect', mustCall((msg) => { + events.push('endpoint.connect'); + assert.ok(msg.endpoint); + assert.ok(msg.address); + assert.ok(msg.options); +})); + +// session.created.client fires for the client session. +dc.subscribe('quic.session.created.client', mustCall((msg) => { + events.push('session.created.client'); + assert.ok(msg.session); +})); + +// session.created.server fires for the server session. +dc.subscribe('quic.session.created.server', mustCall((msg) => { + events.push('session.created.server'); + assert.ok(msg.session); + assert.ok(msg.address, 'server session should include remote address'); +})); + +// session.closing fires when session.close() is called. +// Only fires for sessions where close() is explicitly called (the server). +// The client session closes via CONNECTION_CLOSE without going through close(). +dc.subscribe('quic.session.closing', mustCall((msg) => { + events.push('session.closing'); + assert.ok(msg.session); +})); + +// session.closed fires when session is fully closed. +dc.subscribe('quic.session.closed', mustCall((msg) => { + events.push('session.closed'); + assert.ok(msg.session); + assert.ok(msg.stats, 'session.closed should include stats'); +}, 2)); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + serverSession.close(); + await serverSession.closed; +})); + +const clientSession = await connect(serverEndpoint.address); +await Promise.all([clientSession.opened, clientSession.closed]); + +await serverEndpoint.close(); + +// Verify key events occurred. +assert.ok(events.includes('endpoint.created'), 'missing endpoint.created'); +assert.ok(events.includes('endpoint.listen'), 'missing endpoint.listen'); +assert.ok(events.includes('endpoint.connect'), 'missing endpoint.connect'); +assert.ok(events.includes('session.created.client'), 'missing session.created.client'); +assert.ok(events.includes('session.created.server'), 'missing session.created.server'); +assert.ok(events.includes('endpoint.closing'), 'missing endpoint.closing'); +assert.ok(events.includes('endpoint.closed'), 'missing endpoint.closed'); diff --git a/test/parallel/test-quic-draining-period.mjs b/test/parallel/test-quic-draining-period.mjs new file mode 100644 index 000000000000..eaa244d8ca0c --- /dev/null +++ b/test/parallel/test-quic-draining-period.mjs @@ -0,0 +1,101 @@ +// Flags: --experimental-quic --no-warnings + +// Test: drainingPeriodMultiplier option validation and behavior. +// 1. Default value (3) results in prompt session close after peer closes. +// 2. Custom value is accepted and affects draining duration. +// 3. Values below 3 are clamped to 3. +// 4. Invalid values are rejected. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// Test 1: Default drainingPeriodMultiplier (3) — session closes promptly +// after server closes, not after the full idle timeout. +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + await serverSession.close(); + })); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + // Measure how long clientSession.closed takes to resolve. + const start = Date.now(); + await clientSession.closed; + const elapsed = Date.now() - start; + + // With 3x PTO on localhost (~1-4ms RTT), the draining period should + // be well under 1 second. The idle timeout is 10 seconds. If the + // draining period fix is working, elapsed should be much less than 10s. + assert.ok(elapsed < 2000, `Expected draining to complete in < 2s, took ${elapsed}ms`); + + await serverEndpoint.close(); +} + +// Test 2: Custom drainingPeriodMultiplier is accepted. +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + await serverSession.close(); + })); + + const clientSession = await connect(serverEndpoint.address, { + drainingPeriodMultiplier: 10, + }); + await clientSession.opened; + + const start = Date.now(); + await clientSession.closed; + const elapsed = Date.now() - start; + + // 10x PTO is still very short on localhost. Should complete promptly. + assert.ok(elapsed < 2000, `Expected draining to complete in < 2s, took ${elapsed}ms`); + + await serverEndpoint.close(); +} + +// Test 3: Values below 3 are rejected by JS validation. +{ + const serverEndpoint = await listen(mustNotCall()); + + await assert.rejects( + connect(serverEndpoint.address, { + drainingPeriodMultiplier: 1, + }), + { code: 'ERR_OUT_OF_RANGE' }, + ); + + await serverEndpoint.close(); +} + +// Test 4: Invalid types are rejected. +{ + const serverEndpoint = await listen(mustNotCall(), { + transportParams: { maxIdleTimeout: 1 }, + }); + + await assert.rejects( + connect(serverEndpoint.address, { + drainingPeriodMultiplier: 'fast', + transportParams: { maxIdleTimeout: 1 }, + }), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); + + await assert.rejects( + connect(serverEndpoint.address, { + drainingPeriodMultiplier: 300, + transportParams: { maxIdleTimeout: 1 }, + }), + { code: 'ERR_OUT_OF_RANGE' }, + ); + + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-edge-closing-ops.mjs b/test/parallel/test-quic-edge-closing-ops.mjs new file mode 100644 index 000000000000..f5da250cb8c8 --- /dev/null +++ b/test/parallel/test-quic-edge-closing-ops.mjs @@ -0,0 +1,48 @@ +// Flags: --experimental-quic --no-warnings + +// Test: operations on a closing session. +// createBidirectionalStream on closing session throws. +// sendDatagram on closing session throws. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}), { + transportParams: { maxDatagramFrameSize: 1200 }, +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, +}); +await clientSession.opened; + +// Initiate graceful close. +clientSession.close(); + +// Creating a stream on a closing session rejects. +await assert.rejects( + clientSession.createBidirectionalStream(), + { code: 'ERR_INVALID_STATE' }, +); + +await assert.rejects( + clientSession.createUnidirectionalStream(), + { code: 'ERR_INVALID_STATE' }, +); + +// sendDatagram on a closing session throws. +await assert.rejects( + clientSession.sendDatagram(new Uint8Array([1, 2, 3])), + { code: 'ERR_INVALID_STATE' }, +); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-edge-concurrent-close.mjs b/test/parallel/test-quic-edge-concurrent-close.mjs new file mode 100644 index 000000000000..120ab0ccafbd --- /dev/null +++ b/test/parallel/test-quic-edge-concurrent-close.mjs @@ -0,0 +1,41 @@ +// Flags: --experimental-quic --no-warnings + +// Test: concurrent close() from both client and server. +// Both sides initiate close simultaneously. Neither should crash +// and both closed promises should settle. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Once the stream arrives, both sides close simultaneously. + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + }); + await serverSession.closed; + serverDone.resolve(); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Open a stream so the server session has work, then close from both sides. +const stream = await clientSession.createBidirectionalStream(); +stream.writer.endSync(); +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await stream.closed; + +// Client close happens around the same time as server close above. +await clientSession.close(); + +await serverDone.promise; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-edge-destroyed-ops.mjs b/test/parallel/test-quic-edge-destroyed-ops.mjs new file mode 100644 index 000000000000..b109a3ca998d --- /dev/null +++ b/test/parallel/test-quic-edge-destroyed-ops.mjs @@ -0,0 +1,53 @@ +// Flags: --experimental-quic --no-warnings + +// Test: operations on destroyed session/stream. +// Operations on a destroyed session return gracefully. +// Operations on a destroyed stream return gracefully. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); + +// Destroy the stream, then try operations on it. +stream.destroy(); +assert.strictEqual(stream.destroyed, true); + +// Operations on destroyed stream should not throw. +stream.destroy(); // Idempotent. +stream.writer.endSync(); // No-op on destroyed. + +// Destroy the session, then try operations on it. +clientSession.destroy(); +assert.strictEqual(clientSession.destroyed, true); + +// Properties should return null/undefined gracefully. +assert.strictEqual(clientSession.endpoint, null); +assert.strictEqual(clientSession.path, undefined); +assert.strictEqual(clientSession.certificate, undefined); +assert.strictEqual(clientSession.peerCertificate, undefined); +assert.strictEqual(clientSession.ephemeralKeyInfo, undefined); + +// destroy() again is idempotent. +clientSession.destroy(); + +// sendDatagram on destroyed session throws ERR_INVALID_STATE. +await assert.rejects( + clientSession.sendDatagram(new Uint8Array([1])), + { code: 'ERR_INVALID_STATE' }, +); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-edge-endpoint-destroy-active.mjs b/test/parallel/test-quic-edge-endpoint-destroy-active.mjs new file mode 100644 index 000000000000..e5d40a12ae5f --- /dev/null +++ b/test/parallel/test-quic-edge-endpoint-destroy-active.mjs @@ -0,0 +1,53 @@ +// Flags: --experimental-quic --no-warnings + +// Test: endpoint closed while sessions are active. +// When endpoint.close() is called while sessions are active, the +// endpoint waits for sessions to finish. When the client closes +// its session, the server session closes (via CONNECTION_CLOSE), +// and the endpoint finishes closing. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + stream.writer.endSync(); + await stream.closed; + }); + await serverSession.closed; + serverDone.resolve(); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Create a stream so there's active work. +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('hello'), +}); +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await stream.closed; + +// Close the endpoint while the server session is still active +// (the session is open but the stream is done). +serverEndpoint.close(); +assert.strictEqual(serverEndpoint.closing, true); +assert.strictEqual(serverEndpoint.destroyed, false); + +// The endpoint is waiting for the server session. Close the +// client session to trigger the server session to close. +await clientSession.close(); + +// The server session should close from the CONNECTION_CLOSE. +await Promise.all([serverDone.promise, serverEndpoint.closed]); +assert.strictEqual(serverEndpoint.destroyed, true); diff --git a/test/parallel/test-quic-edge-idempotent.mjs b/test/parallel/test-quic-edge-idempotent.mjs new file mode 100644 index 000000000000..1781a7b624a1 --- /dev/null +++ b/test/parallel/test-quic-edge-idempotent.mjs @@ -0,0 +1,51 @@ +// Flags: --experimental-quic --no-warnings + +// Test: double close/destroy are idempotent. +// Double close() on session is idempotent. +// Double close() on endpoint is idempotent. +// Double destroy() on session is idempotent. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + }); + await serverSession.closed; +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Signal server to close via stream first (before we close). +const stream = await clientSession.createBidirectionalStream(); +stream.writer.endSync(); +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await stream.closed; + +// Double close() on session — both return the same promise. +const p1 = clientSession.close(); +const p2 = clientSession.close(); +assert.strictEqual(p1, p2); +await clientSession.closed; + +// Double destroy() — second call is no-op. +clientSession.destroy(); +assert.strictEqual(clientSession.destroyed, true); +clientSession.destroy(); // Should not throw. +assert.strictEqual(clientSession.destroyed, true); + +// Double close() on endpoint. +const ep1 = serverEndpoint.close(); +const ep2 = serverEndpoint.close(); +assert.strictEqual(ep1, ep2); +await serverEndpoint.closed; diff --git a/test/parallel/test-quic-edge-session-close-immediate.mjs b/test/parallel/test-quic-edge-session-close-immediate.mjs new file mode 100644 index 000000000000..35fdbe5d2629 --- /dev/null +++ b/test/parallel/test-quic-edge-session-close-immediate.mjs @@ -0,0 +1,27 @@ +// Flags: --experimental-quic --no-warnings + +// Test: session created and immediately closed. +// Calling close() on a session right after creation (before handshake +// completes) should gracefully close the session without crashing. + +import { hasQuic, skip } from '../common/index.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverEndpoint = await listen(async (serverSession) => { + await serverSession.closed; +}, { + transportParams: { maxIdleTimeout: 1 }, +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1 }, +}); + +// Close immediately without waiting for opened. +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-edge-session-destroy-immediate.mjs b/test/parallel/test-quic-edge-session-destroy-immediate.mjs new file mode 100644 index 000000000000..ecd95cb945ea --- /dev/null +++ b/test/parallel/test-quic-edge-session-destroy-immediate.mjs @@ -0,0 +1,35 @@ +// Flags: --experimental-quic --no-warnings + +// Test: session created and immediately destroyed. +// Calling destroy() on a session that hasn't completed handshake should +// not crash. The opened and closed promises should settle appropriately. + +import { hasQuic, skip, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// The client destroys before handshake completes, so the server +// should never see a session. +const serverEndpoint = await listen(mustNotCall(), { + transportParams: { maxIdleTimeout: 1 }, +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1 }, +}); + +// Destroy immediately without waiting for opened. +clientSession.destroy(); + +assert.strictEqual(clientSession.destroyed, true); + +// Opened may reject (session destroyed before handshake completed) +// or resolve if handshake completed fast enough. +// Closed should resolve (destroy without error). +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-enable-early-data.mjs b/test/parallel/test-quic-enable-early-data.mjs new file mode 100644 index 000000000000..14bcb96e13f0 --- /dev/null +++ b/test/parallel/test-quic-enable-early-data.mjs @@ -0,0 +1,57 @@ +// Flags: --experimental-quic --no-warnings + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +// enableEarlyData must be a boolean +await assert.rejects(connect({ port: 1234 }, { + alpn: 'quic-test', + enableEarlyData: 'yes', +}), { + code: 'ERR_INVALID_ARG_TYPE', +}); + +// With enableEarlyData: false, early data should not be attempted. +// (Without a session ticket, early data is never attempted regardless, +// but this verifies the option is functional and passes through to C++.) + +const serverOpened = Promise.withResolvers(); +const clientOpened = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.opened.then(mustCall((info) => { + serverOpened.resolve(); + serverSession.close(); + })); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + enableEarlyData: false, +}); + +const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + servername: 'localhost', + enableEarlyData: false, +}); +clientSession.opened.then(mustCall((info) => { + assert.strictEqual(info.earlyDataAttempted, false); + assert.strictEqual(info.earlyDataAccepted, false); + clientOpened.resolve(); +})); + +await Promise.all([serverOpened.promise, clientOpened.promise]); +clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-endpoint-async-dispose.mjs b/test/parallel/test-quic-endpoint-async-dispose.mjs new file mode 100644 index 000000000000..929c2bdf1d12 --- /dev/null +++ b/test/parallel/test-quic-endpoint-async-dispose.mjs @@ -0,0 +1,37 @@ +// Flags: --experimental-quic --no-warnings + +// Test: Symbol.asyncDispose for endpoint and session. +// endpoint[Symbol.asyncDispose] closes the endpoint. +// session[Symbol.asyncDispose] closes the session. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + // Wait for the session to close (triggered by the client's close). + await serverSession.closed; + serverDone.resolve(); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// session[Symbol.asyncDispose] closes the session. +assert.strictEqual(typeof clientSession[Symbol.asyncDispose], 'function'); +await clientSession[Symbol.asyncDispose](); +assert.strictEqual(clientSession.destroyed, true); + +await serverDone.promise; + +// endpoint[Symbol.asyncDispose] closes the endpoint. +assert.strictEqual(typeof serverEndpoint[Symbol.asyncDispose], 'function'); +await serverEndpoint[Symbol.asyncDispose](); +assert.strictEqual(serverEndpoint.destroyed, true); diff --git a/test/parallel/test-quic-endpoint-bind-failure.mjs b/test/parallel/test-quic-endpoint-bind-failure.mjs new file mode 100644 index 000000000000..32e9bd92e693 --- /dev/null +++ b/test/parallel/test-quic-endpoint-bind-failure.mjs @@ -0,0 +1,46 @@ +// Flags: --experimental-quic --no-warnings + +// Test: ERR_QUIC_ENDPOINT_CLOSED on bind failure. +// Attempting to listen on a port that's already in use by another +// QUIC endpoint produces ERR_QUIC_ENDPOINT_CLOSED with a +// 'Bind failure' context. The listen() call may return an endpoint +// that is immediately destroyed — the error surfaces via the +// endpoint's closed promise. + +import { hasQuic, skip, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const sni = { '*': { keys: [key], certs: [cert] } }; +const alpn = ['quic-test']; + +// Bind first endpoint to get an assigned port. +const ep1 = await listen(mustNotCall(), { sni, alpn }); +const { port } = ep1.address; +assert.ok(port > 0); + +// Attempt to listen on the same port — should fail with bind error. +// listen() returns an endpoint that is immediately destroyed. +const ep2 = await listen(mustNotCall(), { + sni, + alpn, + endpoint: { address: `127.0.0.1:${port}` }, +}); +assert.strictEqual(ep2.destroyed, true); + +// The bind failure surfaces as a rejected closed promise. +await assert.rejects(ep2.closed, { + code: 'ERR_QUIC_ENDPOINT_CLOSED', + message: /Bind failure/, +}); + +await ep1.close(); diff --git a/test/parallel/test-quic-endpoint-bind.mjs b/test/parallel/test-quic-endpoint-bind.mjs new file mode 100644 index 000000000000..1d27d8f5567d --- /dev/null +++ b/test/parallel/test-quic-endpoint-bind.mjs @@ -0,0 +1,53 @@ +// Flags: --experimental-quic --no-warnings + +// Test: endpoint binding options. +// Binding to specific address. +// Binding to specific port. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect, QuicEndpoint } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +// Binding to a specific port. +{ + const endpoint = new QuicEndpoint({ + address: { address: '127.0.0.1', port: 0 }, + }); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + }), { + endpoint, + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + transportParams: { maxIdleTimeout: 1 }, + }); + + // The address should reflect what we bound to. + const addr = serverEndpoint.address; + assert.strictEqual(addr.address, '127.0.0.1'); + assert.strictEqual(addr.family, 'ipv4'); + assert.strictEqual(typeof addr.port, 'number'); + assert.ok(addr.port > 0, 'port should be assigned'); + + // Verify a client can connect to the bound address. + const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 1 }, + }); + await clientSession.opened; + await clientSession.close(); + + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-endpoint-busy.mjs b/test/parallel/test-quic-endpoint-busy.mjs new file mode 100644 index 000000000000..102444148fa0 --- /dev/null +++ b/test/parallel/test-quic-endpoint-busy.mjs @@ -0,0 +1,70 @@ +// Flags: --experimental-quic --no-warnings + +// Test: endpoint.busy rejects new sessions. +// When the busy flag is set, the server sends CONNECTION_REFUSED +// for new connection attempts. Existing sessions are not affected. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect, QuicEndpoint } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const endpoint = new QuicEndpoint(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + await serverSession.closed; +}), { + endpoint, + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + transportParams: { maxIdleTimeout: 2 }, +}); + +// First connection before busy — should succeed. +const cs1 = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 2 }, +}); +await cs1.opened; + +// Set the endpoint busy. +assert.strictEqual(endpoint.busy, false); +endpoint.busy = true; +assert.strictEqual(endpoint.busy, true); + +// Second connection while busy — server rejects. +const cs2 = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 1 }, + onerror: mustCall((err) => { + assert.strictEqual(err.code, 'ERR_QUIC_TRANSPORT_ERROR'); + }), +}); + +await assert.rejects(cs2.opened, { + code: 'ERR_QUIC_TRANSPORT_ERROR', +}); + +await assert.rejects(cs2.closed, { + code: 'ERR_QUIC_TRANSPORT_ERROR', +}); + +// Unset busy. +endpoint.busy = false; +assert.strictEqual(endpoint.busy, false); + +// Clean up. +await cs1.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-endpoint-close-destroy.mjs b/test/parallel/test-quic-endpoint-close-destroy.mjs new file mode 100644 index 000000000000..07244ead3049 --- /dev/null +++ b/test/parallel/test-quic-endpoint-close-destroy.mjs @@ -0,0 +1,77 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: endpoint close and destroy lifecycle. +// endpoint.close() waits for active sessions to finish. +// endpoint.destroy() forcefully closes all sessions. +// endpoint.closing property reflects close state. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +const { setTimeout } = await import('node:timers/promises'); +const { bytes } = await import('stream/iter'); + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + // Set onstream before awaiting anything so the callback isn't + // missed if data arrives quickly. + const streamDone = Promise.withResolvers(); + serverSession.onstream = mustCall(async (stream) => { + await bytes(stream); + stream.writer.endSync(); + await stream.closed; + streamDone.resolve(); + }); + + await serverSession.opened; + + // Before close, closing is false. + assert.strictEqual(serverEndpoint.closing, false); + + // Initiate endpoint close — it should wait for this session. + serverEndpoint.close(); + + // After close() is called, closing is true. + assert.strictEqual(serverEndpoint.closing, true); + + // The endpoint's closed promise should NOT resolve yet — session is open. + let endpointClosed = false; + serverEndpoint.closed.then(mustCall(() => { endpointClosed = true; })); + + // Give a tick to confirm endpoint hasn't closed yet. + await setTimeout(100); + assert.strictEqual(endpointClosed, false); + + // Wait for the stream to complete, then close the session. + await streamDone.promise; + serverSession.close(); + serverDone.resolve(); + }), { + transportParams: { maxIdleTimeout: 1 }, + }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1 }, + }); + await clientSession.opened; + + // Send some data so the server session has work to do. + const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('test'), + }); + + await Promise.all([serverDone.promise, + stream.closed, + serverEndpoint.closed]); + + assert.strictEqual(serverEndpoint.destroyed, true); +} diff --git a/test/parallel/test-quic-endpoint-destroy-after-close.mjs b/test/parallel/test-quic-endpoint-destroy-after-close.mjs new file mode 100644 index 000000000000..bdaa709f7dd0 --- /dev/null +++ b/test/parallel/test-quic-endpoint-destroy-after-close.mjs @@ -0,0 +1,64 @@ +// Flags: --experimental-quic --no-warnings + +// Test: When `endpoint.destroy(err)` is called *after* `endpoint.close()` +// has already initiated graceful shutdown, the error must still surface +// on `endpoint.closed` instead of being swallowed. First-error-wins +// semantics: a fatal error reported via `destroy(err)` after a +// graceful close was already in flight is still propagated through +// `endpoint.closed`. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// Hold the connection open for a while so that close() has actual work +// to wait on. +const transportParams = { maxIdleTimeout: 5000 }; + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + // Don't observe `serverSession.closed` directly here - the cascade + // from `endpoint.destroy(err)` will reject it, and the outer + // `markPromiseAsHandled` in the cascade keeps that from surfacing as + // an unhandled rejection. We just need this callback to keep running + // until the test ends. + try { + await serverSession.closed; + } catch { + // Expected: the cascade destroys the session with an error. + } + serverDone.resolve(); +}), { transportParams }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams, +}); +await clientSession.opened; + +// Step 1: kick off a graceful close. After this, the endpoint is in +// the "closing" state - so `#isClosedOrClosing` is true and the +// pre-fix `destroy()` would skip recording `#pendingError`. +const closingPromise = serverEndpoint.close(); + +// Step 2: while the graceful close is in flight, call destroy(err). +// With the fix, the error is still recorded and surfaces on +// `endpoint.closed`. Without the fix, it'd be silently dropped. +const destroyError = new Error('destroy after close'); +const closedAssertion = assert.rejects(serverEndpoint.closed, destroyError); + +serverEndpoint.destroy(destroyError); + +await closedAssertion; + +// `endpoint.close()` returns the same promise as `endpoint.closed`, so +// it should reject with the same error as well. +await assert.rejects(closingPromise, destroyError); + +await serverDone.promise; +clientSession.destroy(); diff --git a/test/parallel/test-quic-endpoint-destroy-cascade-close-frame.mjs b/test/parallel/test-quic-endpoint-destroy-cascade-close-frame.mjs new file mode 100644 index 000000000000..ac0143a2a3cc --- /dev/null +++ b/test/parallel/test-quic-endpoint-destroy-cascade-close-frame.mjs @@ -0,0 +1,84 @@ +// Flags: --experimental-quic --no-warnings + +// Test: when `endpoint.destroy(err)` is called on a side that has open, +// fully-handshaked sessions, the cascade through `session.destroy(err)` +// passes close options derived from the error so each session emits a +// CONNECTION_CLOSE on the wire. The peer learns about the teardown via +// that frame, not via its own idle timer. +// +// How the test distinguishes the two cases: +// +// * If CONNECTION_CLOSE is sent, the client's `session.closed` +// rejects after the network round-trip with an +// `ERR_QUIC_TRANSPORT_ERROR` carrying the cascaded code. +// * If CONNECTION_CLOSE is NOT sent, the client only learns of the +// teardown via its own idle timer, which hits `[kFinishClose]` +// case 3 (`/* Idle close */`) and resolves `session.closed` +// *cleanly*. The `mustCall` rejection-handler would then never +// fire and the test fails. +// +// A short `maxIdleTimeout` keeps the failure mode fast. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// `maxIdleTimeout` is measured in seconds. One second is far longer +// than CONNECTION_CLOSE on loopback needs to win, while still short +// enough that a regression in which `CONNECTION_CLOSE` is *not* sent +// fails the test promptly: the idle-close path takes the +// `[kFinishClose]` case-3 branch and resolves `session.closed` cleanly +// instead of rejecting, so the rejection-handler `mustCall` below +// would fail with "expected exactly 1, actual 0". +const transportParams = { maxIdleTimeout: 1 }; + +const serverError = new Error('cascade close frame test'); + +// Capture the server-side session and wait for *its* `onhandshake` to +// fire before triggering the cascade. The client's `session.opened` +// resolves as soon as the client receives the server's TLS Finished, +// which can land slightly *before* the server has processed the +// client's reciprocal Finished. Without this synchronization the +// server-side `kHandshakeCompleted` flag may still be `false` at +// destroy time and the cascade would skip emitting `CONNECTION_CLOSE` +// (which is the regression this test is designed to catch). +const serverHandshake = Promise.withResolvers(); +const onsession = mustCall((serverSession) => { + serverSession.onhandshake = mustCall(() => { + serverHandshake.resolve(); + }); +}); +const serverEndpoint = await listen(onsession, { transportParams }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams, +}); +await clientSession.opened; +await serverHandshake.promise; + +// Attach the rejection handlers BEFORE triggering destroy so neither +// `serverEndpoint.closed` (rejects with `serverError` via the +// `#pendingError` semantics from B7) nor `clientSession.closed` +// (rejects with the transport error decoded from the CONNECTION_CLOSE +// frame) ends up as an unhandled rejection in the brief window before +// this test gets back to awaiting them. +const serverClosedAssertion = assert.rejects(serverEndpoint.closed, serverError); +const clientClosedAssertion = assert.rejects(clientSession.closed, mustCall((err) => { + assert.strictEqual(err.code, 'ERR_QUIC_TRANSPORT_ERROR'); + return true; +})); + +serverEndpoint.destroy(serverError); + +await clientClosedAssertion; +await serverClosedAssertion; + +// Explicit cleanup: the client-side session has been rejected via +// CONNECTION_CLOSE but the underlying client endpoint is still alive. +// Tear it down so the event loop drains promptly. +clientSession.destroy(); diff --git a/test/parallel/test-quic-endpoint-idle-timeout.mjs b/test/parallel/test-quic-endpoint-idle-timeout.mjs new file mode 100644 index 000000000000..feb2f3edf7a1 --- /dev/null +++ b/test/parallel/test-quic-endpoint-idle-timeout.mjs @@ -0,0 +1,77 @@ +// Flags: --experimental-quic --no-warnings + +// Test: endpoint idle timeout behavior. +// When an endpoint has idleTimeout > 0 and becomes idle (no sessions, +// not listening), it stays alive for the timeout duration before +// being destroyed. With idleTimeout = 0 (default), the endpoint is +// destroyed immediately when idle. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import { setTimeout } from 'node:timers/promises'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { QuicEndpoint } = await import('node:quic'); +const { listen, connect } = await import('../common/quic.mjs'); + +// --- Test 1: Default idleTimeout (0) --- endpoint becomes idle +// immediately when it has no sessions and is not listening. The +// UDP handle is unref'd so it won't block process exit. +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + })); + + // Create a client with an explicit endpoint so we can track it. + const clientEndpoint = new QuicEndpoint(); + const client = await connect(serverEndpoint.address, { + endpoint: clientEndpoint, + verifyPeer: 'manual', + }); + await client.opened; + + // Endpoint is alive while the session is active. + assert.ok(!clientEndpoint.destroyed, 'endpoint should be alive'); + + await client.close(); + + // The endpoint's UDP handle is unref'd when all sessions close, + // so it won't block process exit. Explicitly close it for cleanup. + await clientEndpoint.close(); + assert.ok(clientEndpoint.destroyed, 'endpoint should be destroyed after close'); + + await serverEndpoint.close(); +} + +// --- Test 2: idleTimeout > 0 --- endpoint stays alive briefly +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + })); + + // Create endpoint with a 1-second idle timeout. + const clientEndpoint = new QuicEndpoint({ idleTimeout: 1 }); + const client = await connect(serverEndpoint.address, { + endpoint: clientEndpoint, + verifyPeer: 'manual', + }); + await client.opened; + await client.close(); + + // The endpoint should NOT be immediately destroyed — idle timer + // is running. + assert.ok(!clientEndpoint.destroyed, + 'endpoint should still be alive during idle timeout'); + + // Wait for the idle timeout to fire (1 second + margin). + // Use a ref'd timer to keep the event loop alive while the + // unref'd idle timer runs. + await setTimeout(2000); + assert.ok(clientEndpoint.destroyed, + 'endpoint should be destroyed after idle timeout'); + + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-endpoint-onsession-throws.mjs b/test/parallel/test-quic-endpoint-onsession-throws.mjs new file mode 100644 index 000000000000..c25319afdcae --- /dev/null +++ b/test/parallel/test-quic-endpoint-onsession-throws.mjs @@ -0,0 +1,74 @@ +// Flags: --experimental-quic --no-warnings + +// Test: When the user's `onsession` callback throws synchronously or +// returns a rejected promise, the endpoint is destroyed with that +// error rather than surfacing as an unhandled exception/rejection out +// of the C++ -> JS callback boundary. The error is observable through +// `endpoint.closed` rejecting with the thrown value. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const transportParams = { maxIdleTimeout: 1 }; + +// ------------------------------------------------------------------- +// 1. Synchronous throw in onsession -> endpoint.closed rejects with +// that error. +// ------------------------------------------------------------------- +{ + const sessionError = new Error('sync onsession failure'); + + const serverEndpoint = await listen(mustCall(() => { + throw sessionError; + }), { transportParams }); + + // Attach the rejection handler BEFORE initiating the connection so + // there is no window where serverEndpoint.closed is rejected without + // a handler attached. The throw inside `onsession` is delivered + // synchronously from the C++ -> JS callback, so the rejection can + // arrive on the very next microtask after `connect()` returns. + const closedAssertion = assert.rejects(serverEndpoint.closed, sessionError); + + const clientSession = await connect(serverEndpoint.address, { + transportParams, + }); + + await closedAssertion; + + // Explicitly tear down the client side. Even though the endpoint + // cascade now sends CONNECTION_CLOSE so the client learns about the + // teardown promptly, dropping our reference here keeps the test + // robust to network-dropped close packets and stops the event loop + // from waiting on the client's idle timer to expire. + clientSession.destroy(); + await assert.rejects(serverEndpoint.close(), sessionError); +} + +// ------------------------------------------------------------------- +// 2. onsession returns a rejected promise -> endpoint.closed rejects +// with that error. +// ------------------------------------------------------------------- +{ + const sessionError = new Error('async onsession failure'); + + const serverEndpoint = await listen(mustCall(async () => { + throw sessionError; + }), { transportParams, onerror() {} }); + + const closedAssertion = assert.rejects(serverEndpoint.closed, sessionError); + + const clientSession = await connect(serverEndpoint.address, { + transportParams, + }); + + await closedAssertion; + + clientSession.destroy(); + await assert.rejects(serverEndpoint.close(), sessionError); +} diff --git a/test/parallel/test-quic-endpoint-reuse.mjs b/test/parallel/test-quic-endpoint-reuse.mjs new file mode 100644 index 000000000000..7171a248024a --- /dev/null +++ b/test/parallel/test-quic-endpoint-reuse.mjs @@ -0,0 +1,84 @@ +// Flags: --experimental-quic --no-warnings + +// Test: endpoint reuse behavior for connect(). +// 1. Multiple connect() calls without explicit endpoint share +// the same endpoint (connection pooling). +// 2. connect() with reuseEndpoint: false creates a separate endpoint. +// 3. connect() to the same address as a listening endpoint does NOT +// reuse the listening endpoint (self-connect exclusion). +// 4. connect() to a different address with a listening endpoint in +// the registry reuses the listening endpoint (dual-role). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// --- Test 1: connect() reuses endpoints by default --- +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + }, 2)); + + const client1 = await connect(serverEndpoint.address); + await client1.opened; + + const client2 = await connect(serverEndpoint.address); + await client2.opened; + + // Both client sessions should share the same endpoint because + // findSuitableEndpoint returns the first available non-listening + // non-closing endpoint. After client1 is created, its endpoint + // is available for client2. + assert.strictEqual(client1.endpoint, client2.endpoint); // Client sessions should share an endpoint + + await client1.close(); + await client2.close(); + await serverEndpoint.close(); +} + +// --- Test 2: reuseEndpoint: false creates separate endpoints --- +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + }, 2)); + + const client1 = await connect(serverEndpoint.address, { + reuseEndpoint: false, + }); + await client1.opened; + + const client2 = await connect(serverEndpoint.address, { + reuseEndpoint: false, + }); + await client2.opened; + + assert.notStrictEqual(client1.endpoint, client2.endpoint); // Client sessions should have separate endpoints + + await client1.close(); + await client2.close(); + await serverEndpoint.close(); +} + +// --- Test 3: connect() to a listening endpoint's address is not reused --- +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + })); + + const client = await connect(serverEndpoint.address); + await client.opened; + + // The client endpoint should NOT be the server endpoint, even though + // the server endpoint is in the registry. Self-connect is excluded + // because the client's DCID associations would collide with the + // server's session routing on the same endpoint. + assert.notStrictEqual(client.endpoint, serverEndpoint); // Client should not reuse the server endpoint + + await client.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-endpoint-state-transitions.mjs b/test/parallel/test-quic-endpoint-state-transitions.mjs new file mode 100644 index 000000000000..593871ca1f7e --- /dev/null +++ b/test/parallel/test-quic-endpoint-state-transitions.mjs @@ -0,0 +1,85 @@ +// Flags: --expose-internals --experimental-quic --no-warnings + +// Test: endpoint state transitions. +// State transitions: created → bound → receiving → listening → closing. +// Binding to 0.0.0.0 (all interfaces). +// Binding to ::1 (IPv6 loopback). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect, QuicEndpoint } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +{ + const endpoint = new QuicEndpoint(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + serverSession.close(); + await serverSession.closed; + }), { + endpoint, + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + }); + + // After listen, the endpoint should be listening. + assert.strictEqual(serverEndpoint.listening, true); + assert.strictEqual(serverEndpoint.closing, false); + assert.strictEqual(serverEndpoint.destroyed, false); + + const cs = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + }); + await cs.opened; + await cs.close(); + + // After close(), closing transitions to true. The endpoint is still + // "listening" in the sense that it holds the socket, but closing is true. + serverEndpoint.close(); + assert.strictEqual(serverEndpoint.closing, true); + + await serverEndpoint.closed; + assert.strictEqual(serverEndpoint.destroyed, true); +} + +// Binding to 0.0.0.0. +{ + const endpoint = new QuicEndpoint({ + address: { address: '0.0.0.0', port: 0 }, + }); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + }), { + endpoint, + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + transportParams: { maxIdleTimeout: 1 }, + }); + + const addr = serverEndpoint.address; + assert.strictEqual(addr.address, '0.0.0.0'); + assert.ok(addr.port > 0); + + // Connect via 127.0.0.1 since 0.0.0.0 listens on all interfaces. + const cs = await connect(`127.0.0.1:${addr.port}`, { + alpn: 'quic-test', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 1 }, + }); + await cs.opened; + await cs.close(); + + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-error-class.mjs b/test/parallel/test-quic-error-class.mjs new file mode 100644 index 000000000000..8c83e93e6370 --- /dev/null +++ b/test/parallel/test-quic-error-class.mjs @@ -0,0 +1,158 @@ +// Flags: --experimental-quic --no-warnings + +// Test: QuicError class. Validates the public surface of the new +// `QuicError` class exported from `node:quic`: +// * Required `message` and `options.errorCode`. +// * `errorCode` accepts bigint or number; coerces to bigint. +// * `errorCode` is range-checked against the QUIC 62-bit varint +// maximum. +// * `type` defaults to 'application' and is restricted to +// 'application' | 'transport'. +// * `code` defaults to 'ERR_QUIC_STREAM_ABORTED' and may be +// overridden with any Node.js-style error code string. + +import { hasQuic, skip } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { QuicError } = await import('node:quic'); + +// Sanity: QuicError is a function (class) and extends Error. +assert.strictEqual(typeof QuicError, 'function'); +assert.ok(new QuicError('msg', { errorCode: 0n }) instanceof Error); + +// Required arguments. +// `message` must be a string -> validateString throws ERR_INVALID_ARG_TYPE. +assert.throws(() => new QuicError(), { code: 'ERR_INVALID_ARG_TYPE' }); +// `options` defaults to an empty object, so `errorCode` is missing. +assert.throws(() => new QuicError('msg'), { code: 'ERR_MISSING_ARGS' }); +// Explicit non-object options -> validateObject throws ERR_INVALID_ARG_TYPE. +assert.throws(() => new QuicError('msg', null), { code: 'ERR_INVALID_ARG_TYPE' }); +// Empty options -> errorCode missing -> ERR_MISSING_ARGS. +assert.throws(() => new QuicError('msg', {}), { code: 'ERR_MISSING_ARGS' }); + +// `message` must be a string. +assert.throws(() => new QuicError(42, { errorCode: 0n }), { + code: 'ERR_INVALID_ARG_TYPE', +}); + +// `errorCode` must be bigint or number. +assert.throws(() => new QuicError('msg', { errorCode: 'oops' }), { + code: 'ERR_INVALID_ARG_TYPE', +}); +assert.throws(() => new QuicError('msg', { errorCode: true }), { + code: 'ERR_INVALID_ARG_TYPE', +}); +// `null` is preserved by destructuring (only `undefined` triggers the +// default), so it flows through to the type check rather than the +// missing-args check. +assert.throws(() => new QuicError('msg', { errorCode: null }), { + code: 'ERR_INVALID_ARG_TYPE', +}); + +// `errorCode` range checks. +assert.throws(() => new QuicError('msg', { errorCode: -1 }), { + code: 'ERR_OUT_OF_RANGE', +}); +assert.throws(() => new QuicError('msg', { errorCode: -1n }), { + code: 'ERR_OUT_OF_RANGE', +}); +// 2**62 is the first invalid value (max varint is 2**62 - 1). +assert.throws(() => new QuicError('msg', { errorCode: 1n << 62n }), { + code: 'ERR_OUT_OF_RANGE', +}); + +// `type` validation. +assert.throws(() => new QuicError('msg', { errorCode: 0n, type: 'bogus' }), { + code: 'ERR_INVALID_ARG_VALUE', +}); +assert.throws(() => new QuicError('msg', { errorCode: 0n, type: 42 }), { + code: 'ERR_INVALID_ARG_VALUE', +}); + +// `code` (Node.js error code) must be a string when supplied. +assert.throws(() => new QuicError('msg', { errorCode: 0n, code: 42 }), { + code: 'ERR_INVALID_ARG_TYPE', +}); +assert.throws(() => new QuicError('msg', { errorCode: 0n, code: null }), { + code: 'ERR_INVALID_ARG_TYPE', +}); + +// Happy paths. + +// 1. Bigint errorCode, default type, default Node code. +{ + const err = new QuicError('something broke', { errorCode: 0x42n }); + assert.strictEqual(err.message, 'something broke'); + assert.strictEqual(err.code, 'ERR_QUIC_STREAM_ABORTED'); + assert.strictEqual(err.errorCode, 0x42n); + assert.strictEqual(err.type, 'application'); + assert.ok(err instanceof Error); + assert.ok(err instanceof QuicError); +} + +// 2. Number errorCode, coerced to bigint. +{ + const err = new QuicError('numeric code', { errorCode: 5 }); + assert.strictEqual(err.errorCode, 5n); + assert.strictEqual(typeof err.errorCode, 'bigint'); +} + +// 3. Boundary: 0n is allowed. +{ + const err = new QuicError('zero', { errorCode: 0n }); + assert.strictEqual(err.errorCode, 0n); +} + +// 4. Boundary: 2**62 - 1 is allowed (largest valid 62-bit varint). +{ + const max = (1n << 62n) - 1n; + const err = new QuicError('max', { errorCode: max }); + assert.strictEqual(err.errorCode, max); +} + +// 5. Explicit type='transport'. +{ + const err = new QuicError('transport-level', { + errorCode: 0x1n, + type: 'transport', + }); + assert.strictEqual(err.type, 'transport'); +} + +// 6. Explicit type='application' (default). +{ + const err = new QuicError('app-level', { + errorCode: 0x102n, + type: 'application', + }); + assert.strictEqual(err.type, 'application'); +} + +// 7. Custom Node.js error code string via options.code. +{ + const err = new QuicError('custom', { + errorCode: 0x10cn, + code: 'ERR_CUSTOM_QUIC_FAILURE', + }); + assert.strictEqual(err.code, 'ERR_CUSTOM_QUIC_FAILURE'); + assert.strictEqual(err.errorCode, 0x10cn); +} + +// 8. Properties are read-only via getters (errorCode, type backed by +// private fields). The base Error's message is writable but the +// QuicError-specific accessors must not be assignable through the +// prototype. +{ + const err = new QuicError('msg', { errorCode: 0x1n }); + // The getters live on the prototype; assigning through the instance + // is silently ignored in non-strict mode (modules are strict, so + // this throws TypeError). We just assert the value is unchanged. + assert.throws(() => { err.errorCode = 0xffn; }, { name: 'TypeError' }); + assert.throws(() => { err.type = 'transport'; }, { name: 'TypeError' }); + assert.strictEqual(err.errorCode, 0x1n); + assert.strictEqual(err.type, 'application'); +} diff --git a/test/parallel/test-quic-error-destroy-rejects-promises.mjs b/test/parallel/test-quic-error-destroy-rejects-promises.mjs new file mode 100644 index 000000000000..26d1ed4f2b79 --- /dev/null +++ b/test/parallel/test-quic-error-destroy-rejects-promises.mjs @@ -0,0 +1,57 @@ +// Flags: --experimental-quic --no-warnings + +// Test: session.destroy(error) rejects both opened and closed promises +// . +// When destroyed before the handshake completes, both opened and closed +// reject. When destroyed after, opened stays resolved and closed rejects. + +import { hasQuic, skip } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const transportParams = { maxIdleTimeout: 1 }; + +// The server may see 1 or 2 sessions — the first client destroys before +// the handshake completes, so the server session may or may not be created. +const serverEndpoint = await listen(async (serverSession) => { + await serverSession.closed; +}, { transportParams }); + +// First client: destroy BEFORE the handshake completes. +{ + const testError = new Error('early destroy'); + const clientSession = await connect(serverEndpoint.address, { + transportParams, + }); + + // Destroy immediately — the handshake hasn't completed yet. + clientSession.destroy(testError); + + // Both opened and closed should reject with the same error. + await assert.rejects(clientSession.opened, testError); + await assert.rejects(clientSession.closed, testError); +} + +// Second client: destroy AFTER the handshake completes. +{ + const testError = new Error('late destroy'); + const clientSession = await connect(serverEndpoint.address, { + transportParams, + }); + await clientSession.opened; + + clientSession.destroy(testError); + + // Opened already resolved — stays resolved. + await clientSession.opened; + + // Closed rejects with the error. + await assert.rejects(clientSession.closed, testError); +} + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-exports-constants.mjs b/test/parallel/test-quic-exports-constants.mjs new file mode 100644 index 000000000000..c176e980e250 --- /dev/null +++ b/test/parallel/test-quic-exports-constants.mjs @@ -0,0 +1,47 @@ +// Flags: --experimental-quic --no-warnings + +// Test: node:quic exports and constants. + +import { hasQuic, skip } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const quic = await import('node:quic'); + +// Top-level exports. +assert.strictEqual(typeof quic.listen, 'function'); +assert.strictEqual(typeof quic.connect, 'function'); +assert.strictEqual(typeof quic.QuicEndpoint, 'function'); +assert.strictEqual(typeof quic.QuicSession, 'function'); +assert.strictEqual(typeof quic.QuicStream, 'function'); +assert.strictEqual(typeof quic.constants, 'object'); + +// Congestion control constants. +assert.strictEqual(quic.constants.cc.RENO, 'reno'); +assert.strictEqual(quic.constants.cc.CUBIC, 'cubic'); +assert.strictEqual(quic.constants.cc.BBR, 'bbr'); + +// DEFAULT_CIPHERS. +assert.strictEqual(typeof quic.constants.DEFAULT_CIPHERS, 'string'); +assert.ok(quic.constants.DEFAULT_CIPHERS.length > 0); +assert.ok(quic.constants.DEFAULT_CIPHERS.includes('TLS_AES_128_GCM_SHA256')); + +// DEFAULT_GROUPS. +assert.strictEqual(typeof quic.constants.DEFAULT_GROUPS, 'string'); +assert.ok(quic.constants.DEFAULT_GROUPS.length > 0); + +// QuicEndpoint can be constructed directly. +// QuicSession and QuicStream cannot — they throw ERR_ILLEGAL_CONSTRUCTOR. +{ + const ep = new quic.QuicEndpoint(); + assert.ok(ep instanceof quic.QuicEndpoint); +} +assert.throws(() => new quic.QuicSession(), { + code: 'ERR_ILLEGAL_CONSTRUCTOR', +}); +assert.throws(() => new quic.QuicStream(), { + code: 'ERR_ILLEGAL_CONSTRUCTOR', +}); diff --git a/test/parallel/test-quic-exports.mjs b/test/parallel/test-quic-exports.mjs new file mode 100644 index 000000000000..71771624e31e --- /dev/null +++ b/test/parallel/test-quic-exports.mjs @@ -0,0 +1,37 @@ +// Flags: --experimental-quic --no-warnings +import { hasQuic, skip } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const quic = await import('node:quic'); + +// Test that the main exports exist and are of the correct type. +assert.strictEqual(typeof quic.connect, 'function'); +assert.strictEqual(typeof quic.listen, 'function'); +assert.strictEqual(typeof quic.QuicEndpoint, 'function'); +assert.strictEqual(typeof quic.QuicSession, 'function'); +assert.strictEqual(typeof quic.QuicStream, 'function'); +assert.strictEqual(typeof quic.QuicEndpoint.Stats, 'function'); +assert.strictEqual(typeof quic.QuicSession.Stats, 'function'); +assert.strictEqual(typeof quic.QuicStream.Stats, 'function'); +assert.strictEqual(typeof quic.constants, 'object'); +assert.strictEqual(typeof quic.constants.cc, 'object'); + +// Test that the constants exist and are of the correct type. +assert.strictEqual(quic.constants.cc.RENO, 'reno'); +assert.strictEqual(quic.constants.cc.CUBIC, 'cubic'); +assert.strictEqual(quic.constants.cc.BBR, 'bbr'); +assert.strictEqual(quic.constants.DEFAULT_CIPHERS, + 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:' + + 'TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256'); +assert.strictEqual(quic.constants.DEFAULT_GROUPS, 'X25519:P-256:P-384:P-521'); + +// Ensure the constants are.. well, constant. +assert.throws(() => { quic.constants.cc.RENO = 'foo'; }, TypeError); +assert.strictEqual(quic.constants.cc.RENO, 'reno'); + +assert.throws(() => { quic.constants.DEFAULT_CIPHERS = 123; }, TypeError); +assert.strictEqual(typeof quic.constants.DEFAULT_CIPHERS, 'string'); diff --git a/test/parallel/test-quic-flow-control-blob.mjs b/test/parallel/test-quic-flow-control-blob.mjs new file mode 100644 index 000000000000..888562499216 --- /dev/null +++ b/test/parallel/test-quic-flow-control-blob.mjs @@ -0,0 +1,48 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: blob body larger than stream data window. +// A Blob body that exceeds the initial stream data window should +// still complete successfully — ngtcp2 handles the flow control +// extensions transparently for one-shot body sources. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +// 8KB blob, 1KB stream window — requires flow control extension. +const data = new Uint8Array(8192); +for (let i = 0; i < data.length; i++) data[i] = i & 0xFF; +const blob = new Blob([data]); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.deepStrictEqual(received, data); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +}), { + transportParams: { initialMaxStreamDataBidiRemote: 1024 }, +}); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: blob, +}); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-flow-control-block-resume.mjs b/test/parallel/test-quic-flow-control-block-resume.mjs new file mode 100644 index 000000000000..552932651b1c --- /dev/null +++ b/test/parallel/test-quic-flow-control-block-resume.mjs @@ -0,0 +1,50 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: small flow control window blocks sender, resumes after FC +// update. +// With a very small initialMaxStreamDataBidiRemote, the sender +// blocks when the window is exhausted. The transfer completes +// successfully after the receiver extends the window. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const dataLength = 8192; +const data = new Uint8Array(dataLength); +for (let i = 0; i < dataLength; i++) data[i] = i & 0xff; + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Read all data — this extends the flow control window. + const received = await bytes(stream); + assert.strictEqual(received.byteLength, dataLength); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +}), { + // Very small window — sender will block multiple times. + transportParams: { initialMaxStreamDataBidiRemote: 128 }, +}); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); +stream.setBody(data); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + +await Promise.all([stream.closed, serverDone.promise, clientSession.closed]); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-flow-control-params.mjs b/test/parallel/test-quic-flow-control-params.mjs new file mode 100644 index 000000000000..6b0e70ea2238 --- /dev/null +++ b/test/parallel/test-quic-flow-control-params.mjs @@ -0,0 +1,70 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: flow control transport parameters. +// initialMaxData limits total connection-level data. +// initialMaxStreamDataBidiLocal limits stream data for locally +// initiated bidi streams (server perspective for server-opened). +// initialMaxStreamDataBidiRemote limits stream data for remotely +// initiated bidi streams (server perspective for client-opened). +// These tests verify that data transfers complete successfully even when +// flow control windows are very small, proving that flow control extension +// (MAX_DATA / MAX_STREAM_DATA) works correctly. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes, drainableProtocol: dp } = await import('stream/iter'); + +const encoder = new TextEncoder(); + +// Small initialMaxStreamDataBidiRemote — limits how much the +// client can send initially before the server extends flow control. +{ + const message = 'a]'.repeat(2048); // 4KB, larger than the 1KB window + const expected = encoder.encode(message); + + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(received.byteLength, expected.byteLength); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); + }), { + // Very small stream window — forces multiple flow control extensions. + transportParams: { initialMaxStreamDataBidiRemote: 1024 }, + }); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + budget: 512, + }); + const w = stream.writer; + + // Write in small chunks, respecting backpressure. + const chunkSize = 256; + for (let offset = 0; offset < expected.byteLength; offset += chunkSize) { + const chunk = expected.slice(offset, offset + chunkSize); + while (!w.writeSync(chunk)) { + const drain = w[dp](); + if (drain) await drain; + } + } + w.endSync(); + + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await Promise.all([stream.closed, serverDone.promise]); + await clientSession.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-flow-control-uni.mjs b/test/parallel/test-quic-flow-control-uni.mjs new file mode 100644 index 000000000000..f77744937470 --- /dev/null +++ b/test/parallel/test-quic-flow-control-uni.mjs @@ -0,0 +1,56 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: uni stream flow control. +// initialMaxStreamDataUni limits the flow control window for +// unidirectional streams. Data transfer still completes because +// the receiver extends the window. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes, drainableProtocol: dp } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const message = 'x'.repeat(4096); // 4KB, larger than the 1KB window +const expected = encoder.encode(message); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(received.byteLength, expected.byteLength); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +}), { + transportParams: { initialMaxStreamDataUni: 1024 }, +}); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createUnidirectionalStream({ + budget: 512, +}); +const w = stream.writer; + +const chunkSize = 256; +for (let offset = 0; offset < expected.byteLength; offset += chunkSize) { + const chunk = expected.slice(offset, offset + chunkSize); + while (!w.writeSync(chunk)) { + const drain = w[dp](); + if (drain) await drain; + } +} +w.endSync(); + +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-h3-callback-errors.mjs b/test/parallel/test-quic-h3-callback-errors.mjs new file mode 100644 index 000000000000..f4a9477ca873 --- /dev/null +++ b/test/parallel/test-quic-h3-callback-errors.mjs @@ -0,0 +1,280 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 callback error handling. +// Sync throw in onorigin callback destroys the session +// Sync throw in onheaders callback destroys the stream +// Async rejection in onheaders callback destroys the stream +// Sync throw in ontrailers callback destroys the stream +// Sync throw in onwanttrailers callback destroys the stream + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const encoder = new TextEncoder(); + +async function makeServer(onheadersHandler, extraOpts = {}) { + const done = Promise.withResolvers(); + const ep = await listen(mustCall(async (ss) => { + ss.onstream = mustCall((stream) => { + // The server completes its response before the client's + // callback throws, so the server stream always resolves. + stream.closed.then(mustCall()); + }); + await ss.closed; + done.resolve(); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + transportParams: { maxIdleTimeout: 1 }, + onheaders: onheadersHandler, + ...extraOpts, + }); + return { ep, done }; +} + +// Sync throw in onheaders callback destroys the stream. +{ + const { ep, done } = await makeServer( + mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode('ok')); + this.writer.endSync(); + }), + ); + + const c = await connect(ep.address, { + servername: 'localhost', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 1 }, + }); + await c.opened; + + const s = await c.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function() { + throw new Error('onheaders sync error'); + }), + }); + + await assert.rejects(s.closed, mustCall((err) => { + assert.strictEqual(err.message, 'onheaders sync error'); + return true; + })); + assert.strictEqual(s.destroyed, true); + + c.close(); + await done.promise; + ep.close(); +} + +// Async rejection in onheaders callback destroys the stream. +{ + const { ep, done } = await makeServer( + mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode('ok')); + this.writer.endSync(); + }), + ); + + const c = await connect(ep.address, { + servername: 'localhost', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 1 }, + }); + await c.opened; + + const s = await c.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(async function() { + throw new Error('onheaders async error'); + }), + }); + + await assert.rejects(s.closed, mustCall((err) => { + assert.strictEqual(err.message, 'onheaders async error'); + return true; + })); + assert.strictEqual(s.destroyed, true); + + c.close(); + await done.promise; + ep.close(); +} + +// Sync throw in ontrailers callback destroys the stream. +{ + const { ep, done } = await makeServer( + mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode('body')); + this.writer.endSync(); + }), + { + onwanttrailers: mustCall(function() { + this.sendTrailers({ 'x-trailer': 'value' }); + }), + }, + ); + + const c = await connect(ep.address, { + servername: 'localhost', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 1 }, + }); + await c.opened; + + const s = await c.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + ontrailers: mustCall(function() { + throw new Error('ontrailers sync error'); + }), + }); + + await assert.rejects(s.closed, mustCall((err) => { + assert.strictEqual(err.message, 'ontrailers sync error'); + return true; + })); + assert.strictEqual(s.destroyed, true); + + c.close(); + await done.promise; + ep.close(); +} + +// Sync throw in onorigin callback destroys the session. +{ + const serverEndpoint = await listen(mustCall(async (ss) => { + await ss.closed; + }), { + sni: { + '*': { keys: [key], certs: [cert] }, + 'example.com': { keys: [key], certs: [cert] }, + }, + transportParams: { maxIdleTimeout: 1 }, + onheaders(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.endSync(); + }, + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'example.com', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 1 }, + onorigin: mustCall(function() { + throw new Error('onorigin error'); + }), + onerror: mustCall(function(error) { + assert.strictEqual(error.message, 'onorigin error'); + }), + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/', + ':scheme': 'https', + ':authority': 'example.com', + }, + }); + + // The session is destroyed by the callback error, which + // destroys the stream with the same error. + await assert.rejects(stream.closed, mustCall((err) => { + assert.strictEqual(err.message, 'onorigin error'); + return true; + })); + + await assert.rejects(clientSession.closed, mustCall(() => true)); + + serverEndpoint.close(); +} + +// Sync throw in onwanttrailers callback destroys the +// server stream. The server stream's closed promise rejects with +// the thrown error. +{ + const serverStreamRejected = Promise.withResolvers(); + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + // The server stream rejects because onwanttrailers threw. + await assert.rejects(stream.closed, mustCall((err) => { + assert.strictEqual(err.message, 'onwanttrailers error'); + serverStreamRejected.resolve(); + return true; + })); + }); + await ss.closed; + serverDone.resolve(); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + transportParams: { maxIdleTimeout: 1 }, + onheaders: mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode('body')); + this.writer.endSync(); + }), + onwanttrailers: mustCall(function() { + throw new Error('onwanttrailers error'); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 1 }, + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + + // Verify the server stream was destroyed by the throw. + await serverStreamRejected.promise; + + // The client stream is still open (server error doesn't propagate + // to client automatically). Closing the client session destroys it. + clientSession.close(); + await Promise.all([stream.closed, serverDone.promise]); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-h3-close-behavior.mjs b/test/parallel/test-quic-h3-close-behavior.mjs new file mode 100644 index 000000000000..d25cd50e4ef5 --- /dev/null +++ b/test/parallel/test-quic-h3-close-behavior.mjs @@ -0,0 +1,92 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 close behavior. +// session.close() with open streams - streams complete cleanly +// Graceful H3 shutdown uses H3_NO_ERROR (0x100) + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const decoder = new TextDecoder(); + +// Two streams. The graceful close waits for both streams to complete, +// then sends CONNECTION_CLOSE with H3_NO_ERROR. +{ + let serverSession; + let requestCount = 0; + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + serverSession = ss; + ss.onstream = mustCall(2); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall((headers, stream) => { + stream.sendHeaders({ ':status': '200' }); + stream.writer.writeSync(headers[':path']); + stream.writer.endSync(); + + // Close after both responses are written. The + // close is deferred to exit the nghttp3 callback scope. + if (++requestCount === 2) { + setImmediate(mustCall(() => { + serverSession.close(); + serverDone.resolve(); + })); + } + }, 2), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + }); + await clientSession.opened; + + const stream1 = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/one', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall((headers) => { + assert.strictEqual(headers[':status'], '200'); + }), + }); + + const stream2 = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/two', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall((headers) => { + assert.strictEqual(headers[':status'], '200'); + }), + }); + + // Both streams should complete normally despite the close. + const bodies = await Promise.all([bytes(stream1), bytes(stream2)]); + assert.strictEqual(decoder.decode(bodies[0]), '/one'); + assert.strictEqual(decoder.decode(bodies[1]), '/two'); + + await Promise.all([stream1.closed, + stream2.closed, + serverDone.promise, + clientSession.closed]); + + serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-h3-concurrent-requests.mjs b/test/parallel/test-quic-h3-concurrent-requests.mjs new file mode 100644 index 000000000000..c81403bf1362 --- /dev/null +++ b/test/parallel/test-quic-h3-concurrent-requests.mjs @@ -0,0 +1,89 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: Multiple concurrent HTTP/3 requests on a single session. +// Client opens several bidi streams in parallel, each with different +// request paths. Server responds to each with a path-specific body. +// Verifies: +// - Multiple streams can be opened concurrently on one session +// - Each stream receives the correct response (no cross-talk) +// - All streams complete independently + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const decoder = new TextDecoder(); + +const REQUEST_COUNT = 5; +let serverStreamsCompleted = 0; +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall((stream) => { + stream.closed.then(mustCall(() => { + if (++serverStreamsCompleted === REQUEST_COUNT) { + serverSession.close(); + serverDone.resolve(); + } + })); + }, REQUEST_COUNT); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall(function(headers) { + const path = headers[':path']; + this.sendHeaders({ + ':status': '200', + 'content-type': 'text/plain', + }); + const w = this.writer; + w.writeSync(`response for ${path}`); + w.endSync(); + }, REQUEST_COUNT), +}); + +const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', +}); +await clientSession.opened; + +// Open all requests concurrently. +const paths = Array.from({ length: REQUEST_COUNT }, (_, i) => `/path/${i}`); + +const requests = paths.map(mustCall(async (path) => { + const headersReceived = Promise.withResolvers(); + + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': path, + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall((headers) => { + assert.strictEqual(headers[':status'], '200'); + headersReceived.resolve(); + }), + }); + + await headersReceived.promise; + const body = await bytes(stream); + const text = decoder.decode(body); + assert.strictEqual(text, `response for ${path}`); + await stream.closed; +}, REQUEST_COUNT)); + +await Promise.all([...requests, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-h3-datagram.mjs b/test/parallel/test-quic-h3-datagram.mjs new file mode 100644 index 000000000000..4d081a9f1bce --- /dev/null +++ b/test/parallel/test-quic-h3-datagram.mjs @@ -0,0 +1,172 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 datagrams with SETTINGS_H3_DATAGRAM negotiation. +// Verifies that QUIC datagrams work correctly with H3 sessions, including +// the SETTINGS_H3_DATAGRAM negotiation required by RFC 9297. +// 1. Both sides enableDatagrams: true — datagrams work alongside H3 streams +// 2. Server enableDatagrams: false — client should not be able to send +// datagrams (peer's SETTINGS_H3_DATAGRAM=0) + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); +const { setTimeout: sleep } = await import('timers/promises'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const decoder = new TextDecoder(); + +// Test 1: H3 datagrams with enableDatagrams: true on both sides. +// Datagrams work alongside H3 request/response. +{ + const serverGotDatagram = Promise.withResolvers(); + const clientGotDatagram = Promise.withResolvers(); + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + await stream.closed; + }); + await serverGotDatagram.promise; + await sleep(50); + ss.close(); + serverDone.resolve(); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + application: { enableDatagrams: true }, + transportParams: { maxDatagramFrameSize: 100 }, + // Server echoes received datagram back to client. + ondatagram: mustCall(function(data) { + assert.ok(data instanceof Uint8Array); + assert.strictEqual(data.byteLength, 3); + assert.strictEqual(data[0], 10); + assert.strictEqual(data[1], 20); + assert.strictEqual(data[2], 30); + // Echo it back. + this.sendDatagram(new Uint8Array([42, 43, 44])); + serverGotDatagram.resolve(); + }), + onheaders: mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync('ok'); + this.writer.endSync(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + application: { enableDatagrams: true }, + transportParams: { maxDatagramFrameSize: 100 }, + // Client receives datagram from server. + ondatagram: mustCall(function(data) { + assert.ok(data instanceof Uint8Array); + assert.strictEqual(data.byteLength, 3); + assert.strictEqual(data[0], 42); + assert.strictEqual(data[1], 43); + assert.strictEqual(data[2], 44); + clientGotDatagram.resolve(); + }), + }); + await clientSession.opened; + + // Datagrams work alongside H3 request/response. + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/with-datagram', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + + // Send datagram from client. + await clientSession.sendDatagram(new Uint8Array([10, 20, 30])); + + // H3 response body is received. + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'ok'); + await stream.closed; + + // Both sides received their datagram. + await Promise.all([serverGotDatagram.promise, clientGotDatagram.promise]); + + await serverDone.promise; + await clientSession.close(); + await serverEndpoint.close(); +} + +// Test 2: Server has enableDatagrams: false. The peer's H3 SETTINGS +// should indicate SETTINGS_H3_DATAGRAM=0. The client's datagram send +// should return 0 (no datagram sent) because the peer doesn't support +// H3 datagrams. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + await stream.closed; + ss.close(); + serverDone.resolve(); + }); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + // Server explicitly disables H3 datagrams. + application: { enableDatagrams: false }, + // But transport-level datagrams ARE supported. + transportParams: { maxDatagramFrameSize: 100 }, + // Server should NOT receive any datagrams. + ondatagram: mustNotCall(), + onheaders: mustCall((headers, stream) => { + stream.sendHeaders({ ':status': '200' }); + stream.writer.writeSync('no-dgram'); + stream.writer.endSync(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + application: { enableDatagrams: true }, + transportParams: { maxDatagramFrameSize: 100 }, + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/no-datagram', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall((headers) => { + assert.strictEqual(headers[':status'], '200'); + }), + }); + + // The H3 request triggers SETTINGS exchange. After the server's + // SETTINGS (with h3_datagram=0) arrive, the client should know + // the peer doesn't support H3 datagrams. + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'no-dgram'); + + // Attempt to send a datagram. Since the peer's H3 SETTINGS + // indicate h3_datagram=0, this should return 0 (not sent). + const dgId = await clientSession.sendDatagram(new Uint8Array([1, 2, 3])); + assert.strictEqual(dgId, 0n); + + await Promise.all([stream.closed, serverDone.promise]); + clientSession.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-h3-error-codes.mjs b/test/parallel/test-quic-h3-error-codes.mjs new file mode 100644 index 000000000000..cd5c9ff0a25a --- /dev/null +++ b/test/parallel/test-quic-h3-error-codes.mjs @@ -0,0 +1,122 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 error code handling. +// H3 application error codes are propagated correctly +// Graceful close uses H3_NO_ERROR - streams complete cleanly + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const decoder = new TextDecoder(); + +// Server closes with explicit application error code. +// Client's session closed rejects with the error. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + await stream.closed; + // Close with an explicit H3 application error code. + ss.close({ code: 0x101, type: 'application' }); + serverDone.resolve(); + }); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync('ok'); + this.writer.endSync(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'ok'); + await Promise.all([stream.closed, serverDone.promise]); + + // Client sees the application error code. + await assert.rejects(clientSession.closed, { + code: 'ERR_QUIC_APPLICATION_ERROR', + }); + + await serverEndpoint.close(); +} + +// Graceful close with no explicit error code. +// Both streams complete normally. The close uses H3_NO_ERROR +// which is treated as a clean shutdown (not an error). +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + await stream.closed; + ss.close(); + serverDone.resolve(); + }); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync('ok'); + this.writer.endSync(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'ok'); + await stream.closed; + + // Graceful close - session close promise resolves + // because H3_NO_ERROR is a clean close. + await serverDone.promise; + await clientSession.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-h3-goaway-non-h3.mjs b/test/parallel/test-quic-h3-goaway-non-h3.mjs new file mode 100644 index 000000000000..f61df78da9e8 --- /dev/null +++ b/test/parallel/test-quic-h3-goaway-non-h3.mjs @@ -0,0 +1,63 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: Non-H3 session close does not fire ongoaway. +// GOAWAY is an HTTP/3 concept. When a non-H3 session closes, the +// ongoaway callback must not fire. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import { setImmediate } from 'node:timers/promises'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + // Read client data, send response, close stream. + const data = await bytes(stream); + assert.strictEqual(decoder.decode(data), 'ping'); + stream.writer.writeSync('pong'); + stream.writer.endSync(); + await stream.closed; + ss.close(); + serverDone.resolve(); + }); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: 'quic-test', +}); + +const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + alpn: 'quic-test', + // Ongoaway must NOT fire for non-H3 sessions. + ongoaway: mustNotCall(), +}); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('ping'), +}); + +const response = await bytes(stream); +assert.strictEqual(decoder.decode(response), 'pong'); +await Promise.all([stream.closed, serverDone.promise]); + +// Wait a tick for any deferred callbacks to fire. +await setImmediate(); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-h3-goaway.mjs b/test/parallel/test-quic-h3-goaway.mjs new file mode 100644 index 000000000000..c3b6e3ae246a --- /dev/null +++ b/test/parallel/test-quic-h3-goaway.mjs @@ -0,0 +1,147 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 GOAWAY handling. +// Graceful close sends GOAWAY - client receives ongoaway callback +// After GOAWAY, new stream creation fails +// Existing streams continue and complete after GOAWAY +// Opens two concurrent streams. Server responds to the first immediately +// and holds the second response. The server session.close() is called from +// the main test body (not a callback) after the client confirms both +// streams' headers were received. The second stream is still active, +// ensuring the GOAWAY is sent separately from CONNECTION_CLOSE. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +// quic.session.goaway fires when the peer sends GOAWAY. +dc.subscribe('quic.session.goaway', mustCall((msg) => { + assert.ok(msg.session, 'goaway should include session'); + assert.strictEqual(typeof msg.lastStreamId, 'bigint'); // `goaway` should include lastStreamId +})); + +{ + let serverSession; + let pendingSecondStream; + const goawayReceived = Promise.withResolvers(); + const completeSecondResponse = Promise.withResolvers(); + const bothHeadersReceived = Promise.withResolvers(); + let clientHeaderCount = 0; + + const serverEndpoint = await listen(mustCall(async (ss) => { + serverSession = ss; + ss.onstream = mustCall(2); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall(function(headers) { + const path = headers[':path']; + this.sendHeaders({ ':status': '200' }); + + if (path === '/first') { + // Respond immediately to the first request. + this.writer.writeSync(encoder.encode('first')); + this.writer.endSync(); + } else if (path === '/second') { + // Hold the second response until signaled. + pendingSecondStream = this; + completeSecondResponse.promise.then(mustCall(() => { + pendingSecondStream.writer.writeSync(encoder.encode('second')); + pendingSecondStream.writer.endSync(); + })); + } + }, 2), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + // Ongoaway fires when the peer sends GOAWAY. + ongoaway: mustCall(function(lastStreamId) { + assert.strictEqual(lastStreamId, -1n); + goawayReceived.resolve(); + }), + }); + await clientSession.opened; + + const onClientHeaders = mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + if (++clientHeaderCount === 2) { + bothHeadersReceived.resolve(); + } + }, 2); + + const stream1 = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/first', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: onClientHeaders, + }); + + const stream2 = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/second', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: onClientHeaders, + }); + + // First stream completes immediately. + const body1 = await bytes(stream1); + assert.strictEqual(decoder.decode(body1), 'first'); + + // Wait for both streams' headers to arrive on the client, confirming + // the server has processed both requests. + await bothHeadersReceived.promise; + + // Close the server session from the main test body. The second + // stream's body is still pending, so the graceful close sends + // GOAWAY (shutdown notice) separately from CONNECTION_CLOSE. + serverSession.close(); + + // Wait for GOAWAY notification on the client. + await goawayReceived.promise; + + // After GOAWAY, new stream creation should fail. + await assert.rejects( + clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/new', + ':scheme': 'https', + ':authority': 'localhost', + }, + }), + { code: 'ERR_INVALID_STATE' }, + ); + + // Signal the server to complete the second response. + completeSecondResponse.resolve(); + + // Second stream also completes despite GOAWAY. + const body2 = await bytes(stream2); + assert.strictEqual(decoder.decode(body2), 'second'); + + // Both streams close cleanly. + await Promise.all([stream1.closed, stream2.closed]); + await clientSession.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-h3-handshake-failure.mjs b/test/parallel/test-quic-h3-handshake-failure.mjs new file mode 100644 index 000000000000..201d3999d65a --- /dev/null +++ b/test/parallel/test-quic-h3-handshake-failure.mjs @@ -0,0 +1,55 @@ +// Flags: --experimental-quic --no-warnings + +// Regression test: HTTP/3 server must not crash when a session is closed +// before the H3 application is fully started (control streams bound). +// Previously, closing such a session would call nghttp3_conn_shutdown on +// an H3 connection whose control streams were never bound, causing an +// assertion failure in nghttp3 (conn->tx.ctrl != NULL). +// +// The test creates an H3 server and a client that immediately closes the +// session before the handshake completes. The server creates the H3 +// application during ALPN negotiation, but Start() (which binds control +// streams) hasn't been called yet when the session is torn down. +// The server must handle this gracefully without crashing. + +import { hasQuic, skip, mustNotCall } from '../common/index.mjs'; +import { setTimeout } from 'node:timers/promises'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const serverEndpoint = await listen(async (serverSession) => { + await serverSession.closed; +}, { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustNotCall(), +}); + +// Connect then immediately close the session before the handshake completes. +// This exercises the H3 shutdown path on the server while the H3 application +// exists but hasn't started (control streams not yet bound). +const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + // h3 ALPN — must match the server so the H3 application is selected + // on the server side before we tear it down. +}); + +// Close immediately — don't wait for handshake. +await clientSession.close(); + +// Give the server time to process the close and tear down the session. +await setTimeout(500); + +// The critical assertion: reaching this point without a crash means the +// server correctly handled the H3 shutdown before control streams were +// bound. Verify the endpoint is still alive by closing it gracefully. +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-h3-header-validation.mjs b/test/parallel/test-quic-h3-header-validation.mjs new file mode 100644 index 000000000000..873991a89864 --- /dev/null +++ b/test/parallel/test-quic-h3-header-validation.mjs @@ -0,0 +1,158 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 header validation (RFC 9114 §4.2-4.3). +// H3V-01: Header names are lowercased on send. +// H3V-02 through H3V-14 (receive-side validations) are handled +// automatically by nghttp3. The library rejects Transfer-Encoding, +// Connection headers, misplaced pseudo-headers, missing required +// pseudo-headers, uppercase header names from peer, etc. These +// validations are always enabled and cannot be disabled. They are +// verified by nghttp3's own test suite. +// This test verifies: +// - H3V-01: Mixed-case header names are lowercased when received +// - Headers with various valid pseudo-header combinations work +// - Custom headers are delivered correctly + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const decoder = new TextDecoder(); + +// H3V-01: Header names are lowercased on send. +// Send headers with mixed case — the server should receive them +// lowercased (buildNgHeaderString lowercases before passing to nghttp3). +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + await stream.closed; + ss.close(); + serverDone.resolve(); + }); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall(function(headers) { + // H3V-01: All header names should be lowercase regardless + // of how the client sent them. + for (const name of Object.keys(headers)) { + assert.strictEqual(name, name.toLowerCase(), + `Header name "${name}" should be lowercase`); + } + + // Verify specific headers arrived lowercased. + assert.strictEqual(headers[':method'], 'GET'); + assert.strictEqual(headers[':path'], '/test'); + assert.strictEqual(headers['x-custom-header'], 'Value1'); + assert.strictEqual(headers['content-type'], 'text/plain'); + assert.strictEqual(headers['x-mixed-case'], 'MixedValue'); + + // Verify values are NOT lowercased — only names are. + assert.strictEqual(headers['x-custom-header'], 'Value1'); + + this.sendHeaders({ + // Response with mixed-case names — should be lowercased. + ':status': '200', + 'Content-Type': 'text/html', + 'X-Response-Header': 'ResponseValue', + }); + this.writer.writeSync('ok'); + this.writer.endSync(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + headers: { + // Mixed-case names — should be lowercased by buildNgHeaderString. + ':method': 'GET', + ':path': '/test', + ':scheme': 'https', + ':authority': 'localhost', + 'X-Custom-Header': 'Value1', + 'Content-Type': 'text/plain', + 'X-Mixed-Case': 'MixedValue', + }, + onheaders: mustCall(function(headers) { + // Client should also receive lowercased response header names. + assert.strictEqual(headers[':status'], '200'); + assert.strictEqual(headers['content-type'], 'text/html'); + assert.strictEqual(headers['x-response-header'], 'ResponseValue'); + + // Verify all names are lowercase. + for (const name of Object.keys(headers)) { + assert.strictEqual(name, name.toLowerCase(), + `Response header name "${name}" should be lowercase`); + } + }), + }); + + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'ok'); + await Promise.all([stream.closed, serverDone.promise]); + await clientSession.close(); + await serverEndpoint.close(); +} + +// Verify multiple pseudo-header combinations work correctly. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + await stream.closed; + ss.close(); + serverDone.resolve(); + }); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall(function(headers) { + // All four required pseudo-headers present. + assert.ok(headers[':method']); + assert.ok(headers[':path']); + assert.ok(headers[':scheme']); + assert.ok(headers[':authority']); + + this.sendHeaders({ ':status': '204' }); + this.writer.endSync(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'POST', + ':path': '/api/data', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall((headers) => { + assert.strictEqual(headers[':status'], '204'); + }), + }); + + await Promise.all([bytes(stream), stream.closed, serverDone.promise]); + await clientSession.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-h3-headers-support.mjs b/test/parallel/test-quic-h3-headers-support.mjs new file mode 100644 index 000000000000..5a8c426801c9 --- /dev/null +++ b/test/parallel/test-quic-h3-headers-support.mjs @@ -0,0 +1,75 @@ +// Flags: --experimental-quic --no-warnings + +// Test: Headers support detection for non-H3 sessions. +// headersSupported is UNSUPPORTED for non-H3 sessions +// Sending headers on non-H3 session throws ERR_INVALID_STATE +// Setting header callbacks on non-H3 stream throws ERR_INVALID_STATE + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const encoder = new TextEncoder(); + +const serverDone = Promise.withResolvers(); +const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Sending headers on non-H3 stream throws. + assert.throws(() => stream.sendHeaders({ ':status': '200' }), { code: 'ERR_INVALID_STATE' }); + + // Setting onheaders on non-H3 stream throws. + assert.throws(() => stream.onheaders = () => {}, { code: 'ERR_INVALID_STATE' }); + + // Setting ontrailers on non-H3 stream throws. + assert.throws(() => stream.ontrailers = () => {}, { code: 'ERR_INVALID_STATE' }); + + // Setting oninfo on non-H3 stream throws. + assert.throws(() => stream.oninfo = () => {}, { code: 'ERR_INVALID_STATE' }); + + // Setting onwanttrailers on non-H3 stream throws. + assert.throws(() => stream.onwanttrailers = () => {}, { code: 'ERR_INVALID_STATE' }); + + // sendInformationalHeaders throws on non-H3. + assert.throws(() => stream.sendInformationalHeaders({ ':status': '103' }), { + code: 'ERR_INVALID_STATE', + }); + + // sendTrailers throws on non-H3. + assert.throws(() => stream.sendTrailers({ 'x-trailer': 'value' }), { code: 'ERR_INVALID_STATE' }); + + stream.writer.endSync(); + + serverSession.close(); + serverDone.resolve(); + }); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: 'quic-test', +}); + +const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + alpn: 'quic-test', +}); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('ping'), +}); + +// Client side — sending headers on non-H3 stream throws. +assert.throws(() => stream.sendHeaders({ ':method': 'GET' }), { code: 'ERR_INVALID_STATE' }); + +await serverDone.promise; +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-h3-informational-headers.mjs b/test/parallel/test-quic-h3-informational-headers.mjs new file mode 100644 index 000000000000..1bab5b26d436 --- /dev/null +++ b/test/parallel/test-quic-h3-informational-headers.mjs @@ -0,0 +1,114 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 informational (1xx) headers. +// Server sends a 103 Early Hints response before the final 200 response. +// Client receives the informational headers via oninfo, then the final +// response via onheaders. +// Verifies: +// - sendInformationalHeaders delivers 1xx headers to the client +// - oninfo callback fires with the informational headers +// - onheaders callback fires separately with the final response +// - Body data is delivered after the final response headers + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const decoder = new TextDecoder(); +const responseBody = 'final response'; + +// quic.stream.info fires when informational (1xx) headers are received. +dc.subscribe('quic.stream.info', mustCall((msg) => { + assert.ok(msg.stream, 'stream.info should include stream'); + assert.ok(msg.session, 'stream.info should include session'); + assert.ok(msg.headers, 'stream.info should include headers'); + assert.strictEqual(msg.headers[':status'], '103'); +})); + +// quic.stream.headers also fires for the final response headers. +dc.subscribe('quic.stream.headers', mustCall((msg) => { + assert.ok(msg.stream, 'stream.headers should include stream'); + assert.ok(msg.headers, 'stream.headers should include headers'); +}, 2)); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall(function(headers) { + // Send 103 Early Hints before the final response. + this.sendInformationalHeaders({ + ':status': '103', + 'link': '; rel=preload; as=style', + }); + + // Send final response headers + body. + this.sendHeaders({ + ':status': '200', + 'content-type': 'text/plain', + }); + + const w = this.writer; + w.writeSync(responseBody); + w.endSync(); + }), +}); + +const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', +}); +await clientSession.opened; + +const clientInfoReceived = Promise.withResolvers(); +const clientHeadersReceived = Promise.withResolvers(); + +const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/page', + ':scheme': 'https', + ':authority': 'localhost', + }, + oninfo: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '103'); + assert.strictEqual(headers.link, '; rel=preload; as=style'); + clientInfoReceived.resolve(); + }), + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + assert.strictEqual(headers['content-type'], 'text/plain'); + clientHeadersReceived.resolve(); + }), +}); + +await Promise.all([clientInfoReceived.promise, clientHeadersReceived.promise]); + +// Read the response body. +const body = await bytes(stream); +assert.strictEqual(decoder.decode(body), responseBody); + +// stream.headers should return the final (initial) headers, not 1xx. +assert.strictEqual(stream.headers[':status'], '200'); + +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-h3-origin.mjs b/test/parallel/test-quic-h3-origin.mjs new file mode 100644 index 000000000000..05e7d166585e --- /dev/null +++ b/test/parallel/test-quic-h3-origin.mjs @@ -0,0 +1,186 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 ORIGIN frames (RFC 9412). +// Server with SNI entries sends ORIGIN frame +// Wildcard (*) SNI entries excluded from ORIGIN +// Client receives ORIGIN frame via onorigin callback + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +// Server sends ORIGIN frame based on SNI entries. +// Wildcard entries are excluded. +{ + const originReceived = Promise.withResolvers(); + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + await stream.closed; + ss.close(); + serverDone.resolve(); + }); + }), { + sni: { + // Wildcard entry should NOT appear in ORIGIN frame. + '*': { keys: [key], certs: [cert] }, + // These specific hostnames should appear in ORIGIN. + 'example.com': { keys: [key], certs: [cert] }, + 'api.example.com': { keys: [key], certs: [cert] }, + }, + onheaders: mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode('ok')); + this.writer.endSync(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'example.com', + verifyPeer: 'manual', + // Client receives ORIGIN frame via onorigin callback. + onorigin: mustCall(function(origins) { + assert.ok(Array.isArray(origins)); + // The origins should include the specific SNI hostnames. + assert.ok(origins.length >= 2); + // The wildcard (*) should NOT be in the list. + const originStrings = origins.join(','); + assert.ok(originStrings.includes('example.com'), 'should include example.com'); + assert.ok(originStrings.includes('api.example.com'), + 'should include api.example.com'); + assert.ok(!originStrings.includes('*'), 'should not include wildcard'); + originReceived.resolve(); + }), + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/', + ':scheme': 'https', + ':authority': 'example.com', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'ok'); + + await Promise.all([originReceived.promise, stream.closed, serverDone.promise]); + await clientSession.close(); + await serverEndpoint.close(); +} + +// port: 8443 produces origin "https://hostname:8443" +// default port (443) omits port from origin string +// authoritative: false excluded from ORIGIN frame +// authoritative: true (default) included in ORIGIN frame +{ + const originReceived = Promise.withResolvers(); + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + await stream.closed; + ss.close(); + serverDone.resolve(); + }); + }), { + sni: { + '*': { keys: [key], certs: [cert] }, + // Non-default port → origin includes port. + 'custom-port.example.com': { keys: [key], certs: [cert], port: 8443 }, + // Default port (443) → origin omits port. + 'default-port.example.com': { keys: [key], certs: [cert], port: 443 }, + // authoritative: false → excluded from ORIGIN frame. + 'not-authoritative.example.com': { + keys: [key], certs: [cert], authoritative: false, + }, + // authoritative: true (explicit) → included. + 'authoritative.example.com': { + keys: [key], certs: [cert], authoritative: true, + }, + // Authoritative defaults to true when omitted. + 'default-auth.example.com': { keys: [key], certs: [cert] }, + }, + onheaders: mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode('ok')); + this.writer.endSync(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'custom-port.example.com', + verifyPeer: 'manual', + onorigin: mustCall(function(origins) { + assert.ok(Array.isArray(origins)); + + // Custom port included in origin string. + assert.ok(origins.includes('https://custom-port.example.com:8443'), + 'should include origin with custom port'); + + // Default port 443 omitted from origin string. + assert.ok(origins.includes('https://default-port.example.com'), + 'should include origin without port for 443'); + // Verify port 443 is NOT appended. + const defaultPortOrigin = origins.find((o) => + o.includes('default-port.example.com')); + assert.ok(!defaultPortOrigin.includes(':443'), + 'default port 443 should be omitted'); + + // Non-authoritative entry excluded. + const allOrigins = origins.join(','); + assert.ok(!allOrigins.includes('not-authoritative'), + 'non-authoritative entry should be excluded'); + + // Explicitly authoritative entry included. + assert.ok(allOrigins.includes('authoritative.example.com'), + 'explicitly authoritative entry should be included'); + + // Default authoritative (true when omitted) included. + assert.ok(allOrigins.includes('default-auth.example.com'), + 'default authoritative entry should be included'); + + originReceived.resolve(); + }), + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/', + ':scheme': 'https', + ':authority': 'custom-port.example.com', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'ok'); + + await Promise.all([originReceived.promise, stream.closed, serverDone.promise]); + await clientSession.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-h3-pending-stream.mjs b/test/parallel/test-quic-h3-pending-stream.mjs new file mode 100644 index 000000000000..836c032e2b99 --- /dev/null +++ b/test/parallel/test-quic-h3-pending-stream.mjs @@ -0,0 +1,86 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: Pending H3 stream behavior. +// Priority set at creation time is applied to pending stream +// Headers enqueued at creation time are sent when stream opens + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +// The stream is initially pending (waiting for the QUIC handshake +// to open it). Priority and headers should be applied when it opens. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + await stream.closed; + ss.close(); + serverDone.resolve(); + }); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall(function(headers) { + // Headers were enqueued before the stream opened + // and should arrive correctly. + assert.strictEqual(headers[':method'], 'GET'); + assert.strictEqual(headers[':path'], '/pending'); + + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode('ok')); + this.writer.endSync(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + }); + + // Create the stream BEFORE awaiting opened. The stream is pending + // until the handshake completes and the QUIC stream can be opened. + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/pending', + ':scheme': 'https', + ':authority': 'localhost', + }, + // Priority set at creation time. + priority: 'high', + incremental: true, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + + // Priority should reflect what was set even while pending. + assert.deepStrictEqual(stream.priority, { level: 'high', incremental: true }); + + // Now wait for the handshake. + await clientSession.opened; + + // Priority persists after stream opens. + assert.deepStrictEqual(stream.priority, { level: 'high', incremental: true }); + + // Headers were sent and server responded. + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'ok'); + await Promise.all([stream.closed, serverDone.promise]); + await clientSession.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-h3-post-filehandle.mjs b/test/parallel/test-quic-h3-post-filehandle.mjs new file mode 100644 index 000000000000..ce6bec75c57a --- /dev/null +++ b/test/parallel/test-quic-h3-post-filehandle.mjs @@ -0,0 +1,94 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 POST request with FileHandle body. +// Client sends a POST with an fd-backed body source. Server reads the body +// and echoes it back in the response. Verifies that the FdEntry async I/O +// path works correctly through the H3 application layer. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; +import { writeFileSync } from 'node:fs'; +import { open } from 'node:fs/promises'; + +const tmpdir = await import('../common/tmpdir.js'); + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const decoder = new TextDecoder(); +const testContent = 'Hello from a file!\nLine two.\n'; + +tmpdir.refresh(); +const testFile = tmpdir.resolve('quic-h3-fh-test.txt'); +writeFileSync(testFile, testContent); + +// FileHandle as POST body in createBidirectionalStream. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), testContent); + + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':method'], 'POST'); + assert.strictEqual(headers[':path'], '/upload'); + + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync('ok'); + this.writer.endSync(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + }); + + const info = await clientSession.opened; + assert.strictEqual(info.protocol, 'h3'); + + const clientHeadersReceived = Promise.withResolvers(); + + const fh = await open(testFile, 'r'); + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'POST', + ':path': '/upload', + ':scheme': 'https', + ':authority': 'localhost', + }, + body: fh, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + clientHeadersReceived.resolve(); + }), + }); + + await clientHeadersReceived.promise; + + const responseBody = await bytes(stream); + assert.strictEqual(decoder.decode(responseBody), 'ok'); + + await Promise.all([stream.closed, serverDone.promise]); + clientSession.close(); + await clientSession.closed; + await serverEndpoint.close(); + // FileHandle is closed automatically when the stream finishes. +} diff --git a/test/parallel/test-quic-h3-post-request.mjs b/test/parallel/test-quic-h3-post-request.mjs new file mode 100644 index 000000000000..adf874a0e8aa --- /dev/null +++ b/test/parallel/test-quic-h3-post-request.mjs @@ -0,0 +1,100 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 request with body data (POST-like). +// Client sends request pseudo-headers plus a body, server reads the body +// and echoes it back in the response. +// Verifies: +// - Client can send request headers + body via createBidirectionalStream +// - Server receives the request body via async iteration +// - Server response with echoed body is delivered to the client +// - The terminal flag is correctly NOT set when body is provided + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); +const requestBody = 'Hello from the client'; + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Read the full request body from the client. + const body = await bytes(stream); + const text = decoder.decode(body); + assert.strictEqual(text, requestBody); + + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':method'], 'POST'); + assert.strictEqual(headers[':path'], '/submit'); + + // Echo the request body back in the response. + // At this point, request body hasn't arrived yet — we use onstream + // to read it. But we can send response headers immediately. + this.sendHeaders({ + ':status': '200', + 'content-type': 'text/plain', + }); + // Write echoed body after reading it in onstream. For simplicity, + // we write a fixed response here and verify the request body + // separately in onstream. + const w = this.writer; + w.writeSync(encoder.encode('echo:' + requestBody)); + w.endSync(); + }), +}); + +const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', +}); + +const info = await clientSession.opened; +assert.strictEqual(info.protocol, 'h3'); + +const clientHeadersReceived = Promise.withResolvers(); + +// Send a POST request with body. When body is provided, terminal is NOT +// set on the HEADERS frame (body follows). +const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'POST', + ':path': '/submit', + ':scheme': 'https', + ':authority': 'localhost', + }, + body: encoder.encode(requestBody), + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + clientHeadersReceived.resolve(); + }), +}); + +await clientHeadersReceived.promise; + +// Read the response body. +const responseBody = await bytes(stream); +assert.strictEqual(decoder.decode(responseBody), 'echo:' + requestBody); + +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-h3-priority.mjs b/test/parallel/test-quic-h3-priority.mjs new file mode 100644 index 000000000000..fcf7210b703c --- /dev/null +++ b/test/parallel/test-quic-h3-priority.mjs @@ -0,0 +1,240 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 stream priority. +// Set priority at stream creation (priority/incremental options) +// setPriority({ level: 'high' }) on H3 stream +// setPriority({ incremental: true }) on H3 stream +// priority getter returns { level, incremental } on H3 +// priority getter on client H3 stream returns what was set +// Priority set at creation time reflects in stream.priority +// Server priority getter reflects peer's PRIORITY_UPDATE + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +{ + let requestCount = 0; + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall((stream) => { + // Server sees priority on the stream. + const pri = stream.priority; + assert.strictEqual(typeof pri, 'object'); + assert.strictEqual(typeof pri.level, 'string'); + assert.strictEqual(typeof pri.incremental, 'boolean'); + }, 4); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode(headers[':path'])); + this.writer.endSync(); + if (++requestCount === 4) { + serverDone.resolve(); + } + }, 4), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + }); + await clientSession.opened; + + // Priority set at creation time via options. + const stream1 = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/high', + ':scheme': 'https', + ':authority': 'localhost', + }, + priority: 'high', + incremental: false, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + + // Priority reflects what was set at creation. + assert.deepStrictEqual(stream1.priority, { level: 'high', incremental: false }); + + // Priority 'low' + incremental at creation. + const stream2 = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/low-inc', + ':scheme': 'https', + ':authority': 'localhost', + }, + priority: 'low', + incremental: true, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + assert.deepStrictEqual(stream2.priority, { level: 'low', incremental: true }); + + // Default priority at creation. + const stream3 = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/default', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + assert.deepStrictEqual(stream3.priority, { level: 'default', incremental: false }); + + // setPriority after creation. + const stream4 = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/changed', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + // Default priority initially. + assert.deepStrictEqual(stream4.priority, { level: 'default', incremental: false }); + + // Change to high. + stream4.setPriority({ level: 'high' }); + assert.deepStrictEqual(stream4.priority, { level: 'high', incremental: false }); + + // Change to incremental. + stream4.setPriority({ level: 'low', incremental: true }); + assert.deepStrictEqual(stream4.priority, { level: 'low', incremental: true }); + + // Back to default. + stream4.setPriority({ level: 'default', incremental: false }); + assert.deepStrictEqual(stream4.priority, { level: 'default', incremental: false }); + + // Read all bodies. + const allBodies = await Promise.all([ + bytes(stream1), + bytes(stream2), + bytes(stream3), + bytes(stream4), + ]); + + assert.strictEqual(decoder.decode(allBodies[0]), '/high'); + assert.strictEqual(decoder.decode(allBodies[1]), '/low-inc'); + assert.strictEqual(decoder.decode(allBodies[2]), '/default'); + assert.strictEqual(decoder.decode(allBodies[3]), '/changed'); + + await Promise.all([stream1.closed, + stream2.closed, + stream3.closed, + stream4.closed, + serverDone.promise]); + await clientSession.close(); + await serverEndpoint.close(); +} + +// Server priority getter reflects peer's PRIORITY_UPDATE. +// The client creates a stream with default priority, changes it to +// 'high', then sends body data as a signal. The server reads priority +// after receiving the body — by then the PRIORITY_UPDATE frame (sent +// on the control stream) has been processed by nghttp3 internally. +{ + const serverSawHighPriority = Promise.withResolvers(); + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + // Read the request body — this acts as a signal that the + // client's PRIORITY_UPDATE has been sent. The control stream + // (carrying PRIORITY_UPDATE) is processed before bidi stream + // data in nghttp3, so by the time body arrives the priority + // has been updated. + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'signal'); + + // The server's priority getter should reflect the + // client's PRIORITY_UPDATE (high, incremental). + assert.deepStrictEqual(stream.priority, { level: 'high', incremental: true }); + serverSawHighPriority.resolve(); + + await stream.closed; + ss.close(); + serverDone.resolve(); + }); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode('ok')); + this.writer.endSync(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + }); + await clientSession.opened; + + // Create stream with default priority and a body. The body serves + // as a signal — by the time it arrives at the server, the + // PRIORITY_UPDATE (sent on the control stream) will have been + // processed. setPriority is called BEFORE createBidirectionalStream + // so the PRIORITY_UPDATE is queued before the stream data. + // + // Note: setPriority must be called after createBidirectionalStream + // because the stream handle is needed. But the PRIORITY_UPDATE + // travels on the control stream which nghttp3 processes before + // bidi stream data, so the ordering is guaranteed. + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'POST', + ':path': '/pri-update', + ':scheme': 'https', + ':authority': 'localhost', + }, + body: encoder.encode('signal'), + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + assert.deepStrictEqual(stream.priority, { level: 'default', incremental: false }); + + // Change priority — this sends a PRIORITY_UPDATE frame on the + // control stream. The body data was already provided at creation + // but the PRIORITY_UPDATE travels on the control stream which + // nghttp3 prioritizes over bidi streams. + stream.setPriority({ level: 'high', incremental: true }); + assert.deepStrictEqual(stream.priority, { level: 'high', incremental: true }); + + // Read the response. + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'ok'); + + // Wait for server to confirm it saw the updated priority. + await Promise.all([serverSawHighPriority.promise, + stream.closed, + serverDone.promise]); + await clientSession.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-h3-qpack-settings.mjs b/test/parallel/test-quic-h3-qpack-settings.mjs new file mode 100644 index 000000000000..e56730531c0f --- /dev/null +++ b/test/parallel/test-quic-h3-qpack-settings.mjs @@ -0,0 +1,120 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 QPACK settings. +// Default dynamic table capacity is 4096 (implicit — H3 works) +// Default blocked streams is 100 (implicit — H3 works) +// Custom qpackMaxDTableCapacity overrides default +// Verifies that H3 sessions work with both default and custom QPACK +// settings. The defaults (4096 capacity, 100 blocked streams) are +// tested implicitly by all H3 tests. This test explicitly verifies +// custom values are accepted and functional. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +async function makeRequest(clientSession, path) { + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': path, + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), path); + await stream.closed; +} + +// Custom qpackMaxDTableCapacity = 0 (disables dynamic table). +// QPACK compression still works via the static table, but the dynamic +// table is not used. Verifies the option is passed through to nghttp3. +{ + const serverDone = Promise.withResolvers(); + let requestCount = 0; + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(2); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + // Server disables QPACK dynamic table. + application: { qpackMaxDTableCapacity: 0, qpackBlockedStreams: 0 }, + onheaders: mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode(headers[':path'])); + this.writer.endSync(); + if (++requestCount === 2) { + serverDone.resolve(); + } + }, 2), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + // Client also disables QPACK dynamic table. + application: { qpackMaxDTableCapacity: 0, qpackBlockedStreams: 0 }, + }); + await clientSession.opened; + + // Multiple requests to exercise header compression paths. + await makeRequest(clientSession, '/first'); + await makeRequest(clientSession, '/second'); + + await serverDone.promise; + await clientSession.close(); + await serverEndpoint.close(); +} + +// Custom qpackMaxDTableCapacity = 8192 (larger than default). +// Verifies large dynamic table capacity is accepted. +{ + const serverDone = Promise.withResolvers(); + let requestCount = 0; + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(2); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + application: { qpackMaxDTableCapacity: 8192, qpackBlockedStreams: 200 }, + onheaders: mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode(headers[':path'])); + this.writer.endSync(); + if (++requestCount === 2) { + serverDone.resolve(); + } + }, 2), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + application: { qpackMaxDTableCapacity: 8192, qpackBlockedStreams: 200 }, + }); + await clientSession.opened; + + await makeRequest(clientSession, '/alpha'); + await makeRequest(clientSession, '/beta'); + + await serverDone.promise; + await clientSession.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-h3-request-response.mjs b/test/parallel/test-quic-h3-request-response.mjs new file mode 100644 index 000000000000..e359e492f753 --- /dev/null +++ b/test/parallel/test-quic-h3-request-response.mjs @@ -0,0 +1,113 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: basic HTTP/3 request/response. +// Client sends a GET request with H3 pseudo-headers, server receives +// the request and sends back a 200 response with a text body. +// Verifies: +// - Request pseudo-headers are delivered to the server via onheaders +// - stream.headers property returns the initial headers +// - Response headers and status are delivered to the client +// - Response body data is readable + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); +const responseBody = 'Hello from H3 server'; + +const serverDone = Promise.withResolvers(); + +// The onheaders callback signature is (headers, kind) with `this` bound +// to the stream. A regular function is used so `this` is accessible. +// safeCallbackInvoke(fn, owner, ...args) consumes the owner for error +// handling and forwards only ...args to fn. +const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + // Default ALPN is h3 — omitted intentionally to exercise the default. + // + // onheaders is provided via listen options so it is applied to + // incoming streams (via kStreamCallbacks) BEFORE onstream fires. + // For H3, onheaders must be set because the H3 application delivers + // headers and stream[kHeaders] asserts the callback exists. + onheaders: mustCall(function(headers) { + // Verify request pseudo-headers. + assert.strictEqual(headers[':method'], 'GET'); + assert.strictEqual(headers[':path'], '/index.html'); + assert.strictEqual(headers[':scheme'], 'https'); + assert.strictEqual(headers[':authority'], 'localhost'); + + // After onheaders, stream.headers returns the initial headers. + // `this` is the stream (bound by the onheaders setter). + assert.strictEqual(this.headers[':method'], 'GET'); + + // Send response headers (terminal: false is the default — body follows). + this.sendHeaders({ + ':status': '200', + 'content-type': 'text/plain', + }); + + // Write response body and close the write side. + const w = this.writer; + w.writeSync(encoder.encode(responseBody)); + w.endSync(); + }), +}); + +const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + // Default ALPN is h3. +}); + +const info = await clientSession.opened; +assert.strictEqual(info.protocol, 'h3'); + +const clientHeadersReceived = Promise.withResolvers(); + +// Send a GET request. With body omitted, the terminal flag is set +// automatically (END_STREAM on the HEADERS frame). +const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/index.html', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + assert.strictEqual(headers['content-type'], 'text/plain'); + clientHeadersReceived.resolve(); + }), +}); + +await clientHeadersReceived.promise; + +// Read the full response body. +const body = await bytes(stream); +assert.strictEqual(decoder.decode(body), responseBody); + +// stream.headers should return the buffered response headers. +assert.strictEqual(stream.headers[':status'], '200'); + +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-h3-settings.mjs b/test/parallel/test-quic-h3-settings.mjs new file mode 100644 index 000000000000..3a2bd9387f57 --- /dev/null +++ b/test/parallel/test-quic-h3-settings.mjs @@ -0,0 +1,197 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 settings enforcement. +// maxHeaderPairs enforcement - reject headers exceeding pair count +// maxHeaderLength enforcement - reject headers exceeding byte length +// enableConnectProtocol setting (accepted without error) +// enableDatagrams setting (accepted without error) + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +// maxHeaderPairs enforcement. +// Server limits to 5 header pairs. Client sends 4 pseudo-headers + +// 2 custom headers = 6 pairs. The 6th pair is silently dropped. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + await stream.closed; + ss.close(); + serverDone.resolve(); + }); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + // Allow 5 header pairs: 4 pseudo-headers + 1 custom. + application: { maxHeaderPairs: 5 }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':method'], 'GET'); + assert.strictEqual(headers[':path'], '/limited'); + assert.strictEqual(headers[':scheme'], 'https'); + assert.strictEqual(headers[':authority'], 'localhost'); + // x-first is the 5th pair — accepted. + assert.strictEqual(headers['x-first'], 'one'); + // x-second would be the 6th pair — dropped. + assert.strictEqual(headers['x-second'], undefined); + + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode('ok')); + this.writer.endSync(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/limited', + ':scheme': 'https', + ':authority': 'localhost', + 'x-first': 'one', + 'x-second': 'two', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'ok'); + await stream.closed; + await serverDone.promise; + await clientSession.close(); + await serverEndpoint.close(); +} + +// maxHeaderLength enforcement. +// Server limits total header byte length (name chars + value chars). +// The 4 pseudo-headers take ~45 bytes. A long custom header value +// pushes the total over the limit. +{ + const serverDone = Promise.withResolvers(); + const longValue = 'x'.repeat(200); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + await stream.closed; + ss.close(); + serverDone.resolve(); + }); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + // Limit total header bytes. The 4 pseudo-headers fit within 100 + // bytes, but adding x-long (6 + 200 = 206 bytes) exceeds it. + application: { maxHeaderLength: 100 }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':method'], 'GET'); + assert.strictEqual(headers[':path'], '/length-limited'); + // x-long should be dropped — would push total over 100 bytes. + assert.strictEqual(headers['x-long'], undefined); + + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode('ok')); + this.writer.endSync(); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/length-limited', + ':scheme': 'https', + ':authority': 'localhost', + 'x-long': longValue, + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'ok'); + await Promise.all([stream.closed, serverDone.promise]); + await clientSession.close(); + await serverEndpoint.close(); +} + +// enableConnectProtocol and enableDatagrams settings. +// Verify these options are accepted and H3 sessions work with them. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + await stream.closed; + ss.close(); + serverDone.resolve(); + }); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + application: { enableConnectProtocol: true, enableDatagrams: true }, + onheaders: mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode('settings-ok')); + this.writer.endSync(); + }), + onapplication: mustCall((appopt) => { + assert.strictEqual(appopt.enableDatagrams, true); + assert.strictEqual(appopt.enableConnectProtocol, false); + // Must be false, as this is only sent from server side + }) + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + application: { enableConnectProtocol: true, enableDatagrams: true }, + }); + clientSession.onapplication = mustCall((appopt) => { + assert.strictEqual(appopt.enableConnectProtocol, true); + assert.strictEqual(appopt.enableDatagrams, true); + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/settings', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'settings-ok'); + await Promise.all([stream.closed, serverDone.promise]); + await clientSession.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-h3-stream-destroy-with-headers.mjs b/test/parallel/test-quic-h3-stream-destroy-with-headers.mjs new file mode 100644 index 000000000000..2f5739185f99 --- /dev/null +++ b/test/parallel/test-quic-h3-stream-destroy-with-headers.mjs @@ -0,0 +1,57 @@ +// Flags: --experimental-quic --no-warnings + +// Test: Stream with pending headers destroyed before send. +// Creating an H3 stream with headers and immediately destroying it +// should clean up without crashing or leaking. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (ss) => { + // The server may or may not see the stream depending on timing. + // Either way, it should not crash. + await ss.closed; + serverDone.resolve(); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, +}); + +const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', +}); +await clientSession.opened; + +// Create a stream with headers, then immediately destroy it. +const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/destroyed', + ':scheme': 'https', + ':authority': 'localhost', + }, +}); + +// Destroy the stream before headers can be sent/processed. +stream.destroy(); + +// Verify the stream is destroyed without crash. +assert.strictEqual(stream.destroyed, true); + +// Close everything cleanly. +await clientSession.close(); +await serverDone.promise; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-h3-stream-idle-timeout.mjs b/test/parallel/test-quic-h3-stream-idle-timeout.mjs new file mode 100644 index 000000000000..f3e83a8397ca --- /dev/null +++ b/test/parallel/test-quic-h3-stream-idle-timeout.mjs @@ -0,0 +1,182 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 stream idle timeout. +// Peer-initiated streams that receive no data within the configured +// timeout are automatically destroyed. This test verifies the behavior +// with HTTP/3 bidirectional streams, where ShutdownStream maps +// transport errors to the application's internal error code +// (NGHTTP3_H3_INTERNAL_ERROR = 0x102) on the wire. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import { setTimeout } from 'node:timers/promises'; +import * as fixtures from '../common/fixtures.mjs'; +import { text } from 'node:stream/iter'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const encoder = new TextEncoder(); + +// --- H3 stream destroyed after idle timeout --- +{ + const streamDestroyed = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Don't read — let the stream sit idle after the initial headers. + // The stream idle timeout should destroy it, rejecting stream.closed. + await assert.rejects(stream.closed, { + code: 'ERR_QUIC_TRANSPORT_ERROR', + }); + streamDestroyed.resolve(); + }); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + streamIdleTimeout: 100, + onheaders() { + // Receive headers but do nothing — let the stream go idle. + }, + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 1 }, + }); + + await clientSession.opened; + + // Send a POST request with a body byte so the server creates the + // stream, then stop sending (don't end the write side). + const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'POST', + ':path': '/', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders() {}, + }); + const writer = stream.writer; + writer.writeSync(encoder.encode('x')); + + // Wait for the server to destroy the idle stream. + await streamDestroyed.promise; + + // The server sent STOP_SENDING / RESET_STREAM when it destroyed the + // idle stream. ShutdownStream maps the transport error to the H3 + // internal error code (0x102) on the wire. + await assert.rejects(stream.closed, { + code: 'ERR_QUIC_APPLICATION_ERROR', + }); + + await clientSession.close(); + await serverEndpoint.close(); +} + +// --- H3 stream with ongoing data is NOT destroyed --- +{ + const serverGotData = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const data = await text(stream); + assert.strictEqual(data, 'xy'); + serverGotData.resolve(); + await serverSession.close(); + }); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + streamIdleTimeout: 500, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':method'], 'POST'); + // Send response headers so the stream is fully established. + this.sendHeaders({ ':status': '200' }, { terminal: true }); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + onheaders() {}, + }); + stream.sendHeaders({ + ':method': 'POST', + ':path': '/', + ':scheme': 'https', + ':authority': 'localhost', + 'content-length': '2', + }, { terminal: false }); + const writer = stream.writer; + writer.writeSync(encoder.encode('x')); + + // Wait less than the 500ms idle timeout, then send more data. + await setTimeout(300); + + writer.writeSync(encoder.encode('y')); + writer.endSync(); + + await Promise.all([serverGotData.promise, clientSession.closed]); + await serverEndpoint.close(); +} + +// --- Disabled when set to 0 --- +{ + const streamSurvived = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const data = await text(stream); + assert.strictEqual(data, 'xy'); + streamSurvived.resolve(); + }); + + await setTimeout(700); + await serverSession.close(); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + streamIdleTimeout: 0, // Disabled + onheaders: mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }, { terminal: true }); + }), + }); + + const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + onheaders() {}, + }); + stream.sendHeaders({ + ':method': 'POST', + ':path': '/', + ':scheme': 'https', + ':authority': 'localhost', + }, { terminal: false }); + const writer = stream.writer; + writer.writeSync(encoder.encode('x')); + + // Pause beyond any reasonable idle timeout to verify it's disabled. + await setTimeout(600); + + writer.writeSync(encoder.encode('y')); + writer.endSync(); + + await Promise.all([streamSurvived.promise, clientSession.closed]); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-h3-trailing-headers.mjs b/test/parallel/test-quic-h3-trailing-headers.mjs new file mode 100644 index 000000000000..e19886fa5bad --- /dev/null +++ b/test/parallel/test-quic-h3-trailing-headers.mjs @@ -0,0 +1,121 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 trailing headers. +// Server sends response headers, body data, then trailing headers. +// Client receives all three in order. +// Verifies: +// - onwanttrailers callback fires after body is sent +// - sendTrailers delivers trailing headers to the peer +// - ontrailers callback fires on the receiving side with kind 'trailing' +// - stream.headers still returns the initial headers (not trailers) + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); +const responseBody = 'body with trailers'; + +// quic.stream.headers fires when initial headers are received. +// Fires for both the server (request headers) and client (response headers). +dc.subscribe('quic.stream.headers', mustCall((msg) => { + assert.ok(msg.stream, 'stream.headers should include stream'); + assert.ok(msg.session, 'stream.headers should include session'); + assert.ok(msg.headers, 'stream.headers should include headers'); +}, 2)); + +// quic.stream.trailers fires when trailing headers are received. +dc.subscribe('quic.stream.trailers', mustCall((msg) => { + assert.ok(msg.stream, 'stream.trailers should include stream'); + assert.ok(msg.session, 'stream.trailers should include session'); + assert.ok(msg.trailers, 'stream.trailers should include trailers'); + assert.strictEqual(msg.trailers['x-checksum'], 'abc123'); +})); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall(function(headers) { + // Send response headers. + this.sendHeaders({ + ':status': '200', + 'content-type': 'text/plain', + }); + + // Write body and close. + const w = this.writer; + w.writeSync(encoder.encode(responseBody)); + w.endSync(); + }), + // Fires after the body is fully sent (EOF + NO_END_STREAM). + // The server provides trailing headers here. + onwanttrailers: mustCall(function() { + this.sendTrailers({ + 'x-checksum': 'abc123', + 'x-request-id': '42', + }); + }), +}); + +const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', +}); +await clientSession.opened; + +const clientHeadersReceived = Promise.withResolvers(); +const clientTrailersReceived = Promise.withResolvers(); + +const stream = await clientSession.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/with-trailers', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + clientHeadersReceived.resolve(); + }), + ontrailers: mustCall(function(trailers) { + assert.strictEqual(trailers['x-checksum'], 'abc123'); + assert.strictEqual(trailers['x-request-id'], '42'); + clientTrailersReceived.resolve(); + }), +}); + +await clientHeadersReceived.promise; + +// Read the response body. +const body = await bytes(stream); +assert.strictEqual(decoder.decode(body), responseBody); + +// Trailers arrive after the body. +await clientTrailersReceived.promise; + +// stream.headers should still be the initial headers, not trailers. +assert.strictEqual(stream.headers[':status'], '200'); + +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-h3-zero-rtt-bogus-ticket.mjs b/test/parallel/test-quic-h3-zero-rtt-bogus-ticket.mjs new file mode 100644 index 000000000000..f724375d9def --- /dev/null +++ b/test/parallel/test-quic-h3-zero-rtt-bogus-ticket.mjs @@ -0,0 +1,36 @@ +// Flags: --experimental-quic --no-warnings + +// Test: Bogus session ticket data is rejected gracefully. +// Providing random bytes as a session ticket throws ERR_INVALID_ARG_VALUE +// because the ticket format is validated before use. The connection +// cannot proceed with garbage ticket data. + +import { hasQuic, skip, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey, randomBytes } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const serverEndpoint = await listen(mustNotCall(), { + sni: { '*': { keys: [key], certs: [cert] } }, +}); + +// Bogus ticket data (random bytes) is rejected at the format level. +await assert.rejects( + connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + sessionTicket: randomBytes(256), + }), + { code: 'ERR_INVALID_ARG_VALUE' }, +); + +serverEndpoint.close(); diff --git a/test/parallel/test-quic-h3-zero-rtt-rejected-settings.mjs b/test/parallel/test-quic-h3-zero-rtt-rejected-settings.mjs new file mode 100644 index 000000000000..c17f2ad3994c --- /dev/null +++ b/test/parallel/test-quic-h3-zero-rtt-rejected-settings.mjs @@ -0,0 +1,176 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: H3 0-RTT rejected when server reduces application settings. +// 0-RTT rejected when max_field_section_size decreased +// 0-RTT rejected when enable_connect_protocol disabled +// 0-RTT rejected when enable_datagrams disabled +// Each test creates two endpoints with the same key/cert/tokenSecret. +// The first endpoint issues a ticket with generous H3 settings. The +// second endpoint has reduced settings, causing the H3 session ticket +// app data validation to reject 0-RTT. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey, randomBytes } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const sni = { '*': { keys: [key], certs: [cert] } }; +const decoder = new TextDecoder(); + +// Helper: establish an H3 session, get a ticket, close. +async function getTicket(endpointOptions) { + let savedTicket; + let savedToken; + const gotTicket = Promise.withResolvers(); + const gotToken = Promise.withResolvers(); + + const ep = await listen(mustCall(async (ss) => { + ss.onstream = mustCall(async (stream) => { + await stream.closed; + ss.close(); + }); + }), { + sni, + ...endpointOptions, + onheaders: mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync('ok'); + this.writer.endSync(); + }), + }); + + const cs = await connect(ep.address, { + servername: 'localhost', + verifyPeer: 'manual', + ...endpointOptions, + onsessionticket: mustCall((ticket) => { + assert.ok(Buffer.isBuffer(ticket)); + savedTicket = ticket; + gotTicket.resolve(); + }, 2), + onnewtoken: mustCall((token) => { + assert.ok(Buffer.isBuffer(token)); + savedToken = token; + gotToken.resolve(); + }), + }); + await cs.opened; + await Promise.all([gotTicket.promise, gotToken.promise]); + + const s = await cs.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/ticket', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), + }); + const body = await bytes(s); + assert.strictEqual(decoder.decode(body), 'ok'); + await Promise.all([s.closed, cs.closed]); + await ep.close(); + + return { ticket: savedTicket, token: savedToken }; +} + +// Helper: attempt 0-RTT with reduced settings, expect rejection. +// When 0-RTT is rejected, the H3 application is torn down and +// recreated (EarlyDataRejected destroys the nghttp3 connection). +// The initial 0-RTT stream may not survive this transition, so we +// only verify earlyDataAccepted is false and close cleanly. +async function attemptRejected0RTT(endpointOptions, ticket, token) { + const ep = await listen(mustCall(async (ss) => { + await ss.closed; + }), { + sni, + ...endpointOptions, + }); + + const cs = await connect(ep.address, { + servername: 'localhost', + verifyPeer: 'manual', + ...endpointOptions, + sessionTicket: ticket, + token, + }); + + // Trigger the deferred handshake by opening a stream. + // With 0-RTT, the handshake is deferred until the first stream + // or datagram is sent. When 0-RTT is rejected, the stream is + // destroyed by EarlyDataRejected — its closed promise rejects + // with an application error. + const s = await cs.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/rejected', + ':scheme': 'https', + ':authority': 'localhost', + }, + }); + await assert.rejects(s.closed, { + code: 'ERR_QUIC_APPLICATION_ERROR', + }); + + const info = await cs.opened; + assert.strictEqual(info.earlyDataAttempted, true); + assert.strictEqual(info.earlyDataAccepted, false); + + cs.close(); + ep.close(); +} + +const tokenSecret = randomBytes(16); + +// enable_connect_protocol disabled. +{ + const { ticket, token } = await getTicket({ + endpoint: { tokenSecret }, + application: { enableConnectProtocol: true }, + }); + + await attemptRejected0RTT({ + endpoint: { tokenSecret }, + // EnableConnectProtocol reduced from true to false. + application: { enableConnectProtocol: false }, + }, ticket, token); +} + +// enable_datagrams disabled. +{ + const { ticket, token } = await getTicket({ + endpoint: { tokenSecret }, + application: { enableDatagrams: true }, + }); + + await attemptRejected0RTT({ + endpoint: { tokenSecret }, + // EnableDatagrams reduced from true to false. + application: { enableDatagrams: false }, + }, ticket, token); +} + +// max_field_section_size decreased. +{ + const { ticket, token } = await getTicket({ + endpoint: { tokenSecret }, + application: { maxFieldSectionSize: 10000 }, + }); + + await attemptRejected0RTT({ + endpoint: { tokenSecret }, + // MaxFieldSectionSize reduced from 10000 to 100. + application: { maxFieldSectionSize: 100 }, + }, ticket, token); +} diff --git a/test/parallel/test-quic-h3-zero-rtt.mjs b/test/parallel/test-quic-h3-zero-rtt.mjs new file mode 100644 index 000000000000..ef51c63ee8aa --- /dev/null +++ b/test/parallel/test-quic-h3-zero-rtt.mjs @@ -0,0 +1,130 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: HTTP/3 0-RTT session resumption with session ticket app data. +// Session ticket includes HTTP/3 settings +// H3 + 0-RTT: Client sends H3 request in 0-RTT flight +// Uses a single server endpoint for both connections so the TLS +// session ticket encryption key is shared. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +let savedTicket; +let savedToken; +const gotTicket = Promise.withResolvers(); +const gotToken = Promise.withResolvers(); + +let serverSessionCount = 0; +const secondDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((ss) => { + const num = ++serverSessionCount; + ss.onstream = mustCall(async (stream) => { + if (num === 2) { + // Resolve with the stream so we can check stream.early after + // data has been received (the early flag is set after + // nghttp3 processes the 0-RTT headers, not at stream creation). + secondDone.resolve(stream); + } + await stream.closed; + ss.close(); + }); +}, 2), { + sni: { '*': { keys: [key], certs: [cert] } }, + onheaders: mustCall(function(headers) { + this.sendHeaders({ ':status': '200' }); + this.writer.writeSync(encoder.encode(headers[':path'])); + this.writer.endSync(); + }, 2), +}); + +// --- First connection: establish H3 session, receive ticket --- +const cs1 = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + onsessionticket: mustCall(function(ticket) { + assert.ok(Buffer.isBuffer(ticket)); + assert.ok(ticket.length > 0); + savedTicket = ticket; + gotTicket.resolve(); + }, 2), + onnewtoken: mustCall(function(token) { + assert.ok(Buffer.isBuffer(token)); + savedToken = token; + gotToken.resolve(); + }), +}); + +const info1 = await cs1.opened; +assert.strictEqual(info1.earlyDataAttempted, false); +assert.strictEqual(info1.earlyDataAccepted, false); + +await Promise.all([gotTicket.promise, gotToken.promise]); + +const s1 = await cs1.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/first', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), +}); +const body1 = await bytes(s1); +assert.strictEqual(decoder.decode(body1), '/first'); +await Promise.all([s1.closed, cs1.closed]); + +// Session ticket should have been received. +assert.ok(savedTicket); +assert.ok(savedToken); + +// --- Second connection: 0-RTT with H3 --- +const cs2 = await connect(serverEndpoint.address, { + servername: 'localhost', + verifyPeer: 'manual', + sessionTicket: savedTicket, + token: savedToken, +}); + +// Send H3 request BEFORE handshake completes — true 0-RTT. +const s2 = await cs2.createBidirectionalStream({ + headers: { + ':method': 'GET', + ':path': '/early', + ':scheme': 'https', + ':authority': 'localhost', + }, + onheaders: mustCall(function(headers) { + assert.strictEqual(headers[':status'], '200'); + }), +}); + +const info2 = await cs2.opened; +assert.strictEqual(info2.earlyDataAttempted, true); +assert.strictEqual(info2.earlyDataAccepted, true); + +const body2 = await bytes(s2); +assert.strictEqual(decoder.decode(body2), '/early'); +await s2.closed; + +const earlyStream = await secondDone.promise; +assert.strictEqual(earlyStream.early, true); + +await cs2.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-handshake-ipv6-only.mjs b/test/parallel/test-quic-handshake-ipv6-only.mjs new file mode 100644 index 000000000000..88c696af9762 --- /dev/null +++ b/test/parallel/test-quic-handshake-ipv6-only.mjs @@ -0,0 +1,74 @@ +// Flags: --experimental-quic --no-warnings + +import { hasQuic, hasIPv6, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +if (!hasIPv6) { + skip('IPv6 is not supported'); +} + +// Import after the hasQuic check +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const check = { + // The SNI value + servername: 'localhost', + // The selected ALPN protocol + protocol: 'quic-test', + // The negotiated cipher suite + cipher: 'TLS_AES_128_GCM_SHA256', + cipherVersion: 'TLSv1.3', +}; + +// The opened promise should resolve when the handshake is complete. + +const serverOpened = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + const info = await serverSession.opened; + assert.partialDeepStrictEqual(info, check); + serverOpened.resolve(); + await serverSession.close(); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + endpoint: { + address: { + address: '::1', + family: 'ipv6', + }, + ipv6Only: true, + }, +}); +// Buffer is not detached. +assert.strictEqual(cert.buffer.detached, false); + +// The server must have an address to connect to after listen resolves. +assert.ok(serverEndpoint.address !== undefined); + +const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + endpoint: { + address: { + address: '::', + family: 'ipv6', + }, + }, +}); + +const info = await clientSession.opened; +assert.partialDeepStrictEqual(info, check); + +await serverOpened.promise; +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-handshake-timeout.mjs b/test/parallel/test-quic-handshake-timeout.mjs new file mode 100644 index 000000000000..6eae7d0f8504 --- /dev/null +++ b/test/parallel/test-quic-handshake-timeout.mjs @@ -0,0 +1,31 @@ +// Flags: --experimental-quic --no-warnings + +// Test: handshake timeout. +// The server accepts sessions but the client uses a very short idle +// timeout, causing the session to close before the handshake can +// complete on the server side. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}), { transportParams: { maxIdleTimeout: 1 } }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1 }, +}); + +// Don't send any data. Just wait for idle timeout. +await Promise.all([clientSession.opened, clientSession.closed]); + +// The session closed via idle timeout. Verify it was destroyed. +assert.strictEqual(clientSession.destroyed, true); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-handshake.mjs b/test/parallel/test-quic-handshake.mjs index 7374d4c92939..1c178cf706f9 100644 --- a/test/parallel/test-quic-handshake.mjs +++ b/test/parallel/test-quic-handshake.mjs @@ -23,12 +23,14 @@ const check = { // The negotiated cipher suite cipher: 'TLS_AES_128_GCM_SHA256', cipherVersion: 'TLSv1.3', + // No session ticket provided, so early data was not attempted + earlyDataAttempted: false, + earlyDataAccepted: false, }; // The opened promise should resolve when the handshake is complete. const serverOpened = Promise.withResolvers(); -const clientOpened = Promise.withResolvers(); const serverEndpoint = await listen(mustCall((serverSession) => { serverSession.opened.then((info) => { @@ -49,11 +51,12 @@ assert.ok(serverEndpoint.address !== undefined); const clientSession = await connect(serverEndpoint.address, { alpn: 'quic-test', + verifyPeer: 'manual', }); -clientSession.opened.then((info) => { - assert.partialDeepStrictEqual(info, check); - clientOpened.resolve(); -}).then(mustCall()); -await Promise.all([serverOpened.promise, clientOpened.promise]); -clientSession.close(); +const info = await clientSession.opened; +assert.partialDeepStrictEqual(info, check); + +await serverOpened.promise; +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-internal-endpoint-listen-defaults.mjs b/test/parallel/test-quic-internal-endpoint-listen-defaults.mjs index f6215106ca3d..42cfa784263c 100644 --- a/test/parallel/test-quic-internal-endpoint-listen-defaults.mjs +++ b/test/parallel/test-quic-internal-endpoint-listen-defaults.mjs @@ -1,5 +1,5 @@ // Flags: --expose-internals --experimental-quic --no-warnings -import { hasQuic, skip } from '../common/index.mjs'; +import { hasQuic, skip, mustNotCall } from '../common/index.mjs'; import assert from 'node:assert'; import * as fixtures from '../common/fixtures.mjs'; @@ -12,17 +12,17 @@ if (!hasQuic) { // Import after the hasQuic check const { listen, QuicEndpoint } = await import('node:quic'); const { createPrivateKey } = await import('node:crypto'); -const { kState } = (await import('internal/quic/symbols')).default; +const { getQuicEndpointState } = (await import('internal/quic/quic')).default; const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); const cert = fixtures.readKey('agent1-cert.pem'); const sni = { '*': { keys: [key], certs: [cert] } }; const endpoint = new QuicEndpoint(); - -assert.ok(!endpoint[kState].isBound); -assert.ok(!endpoint[kState].isReceiving); -assert.ok(!endpoint[kState].isListening); +const state = getQuicEndpointState(endpoint); +assert.ok(!state.isBound); +assert.ok(!state.isReceiving); +assert.ok(!state.isListening); assert.strictEqual(endpoint.address, undefined); @@ -32,24 +32,23 @@ await assert.rejects(listen(123, { sni, endpoint }), { // Buffer is not detached. assert.strictEqual(cert.buffer.detached, false); -await assert.rejects(listen(() => {}, 123), { +await assert.rejects(listen(mustNotCall(), 123), { code: 'ERR_INVALID_ARG_TYPE', }); -await listen(() => {}, { sni, endpoint }); +await listen(mustNotCall(), { sni, endpoint }); // Buffer is not detached. assert.strictEqual(cert.buffer.detached, false); -await assert.rejects(listen(() => {}, { sni, endpoint }), { +await assert.rejects(listen(mustNotCall(), { sni, endpoint }), { code: 'ERR_INVALID_STATE', }); - // Buffer is not detached. assert.strictEqual(cert.buffer.detached, false); -assert.ok(endpoint[kState].isBound); -assert.ok(endpoint[kState].isReceiving); -assert.ok(endpoint[kState].isListening); +assert.ok(state.isBound); +assert.ok(state.isReceiving); +assert.ok(state.isListening); const address = endpoint.address; assert.ok(address instanceof SocketAddress); @@ -65,7 +64,7 @@ assert.strictEqual(endpoint.closed, endpoint.close()); await endpoint.closed; assert.ok(endpoint.destroyed); -await assert.rejects(listen(() => {}, { sni, endpoint }), { +await assert.rejects(listen(mustNotCall(), { sni, endpoint }), { code: 'ERR_INVALID_STATE', }); // Buffer is not detached. diff --git a/test/parallel/test-quic-internal-endpoint-options.mjs b/test/parallel/test-quic-internal-endpoint-options.mjs index aa4d4c96e87e..29529c05e613 100644 --- a/test/parallel/test-quic-internal-endpoint-options.mjs +++ b/test/parallel/test-quic-internal-endpoint-options.mjs @@ -9,6 +9,7 @@ if (!hasQuic) { // Import after the hasQuic check const { QuicEndpoint } = await import('node:quic'); +const { BlockList } = await import('node:net'); // Reject invalid options ['a', null, false, NaN].forEach((i) => { @@ -39,37 +40,83 @@ const cases = [ { key: 'maxConnectionsPerHost', valid: [ - 1, 10, 100, 1000, 10000, 10000n, + 0, 1, 10, 100, 1000, 10000, 65535, ], - invalid: [-1, -1n, 'a', null, false, true, {}, [], () => {}] + invalid: [-1, 65536, 1.5, 'a', null, false, true, {}, [], () => {}] }, { key: 'maxConnectionsTotal', valid: [ - 1, 10, 100, 1000, 10000, 10000n, + 0, 1, 10, 100, 1000, 10000, 65535, ], - invalid: [-1, -1n, 'a', null, false, true, {}, [], () => {}] + invalid: [-1, 65536, 1.5, 'a', null, false, true, {}, [], () => {}] }, { - key: 'maxStatelessResetsPerHost', + key: 'addressLRUSize', valid: [ 1, 10, 100, 1000, 10000, 10000n, ], invalid: [-1, -1n, 'a', null, false, true, {}, [], () => {}] }, { - key: 'addressLRUSize', - valid: [ - 1, 10, 100, 1000, 10000, 10000n, - ], - invalid: [-1, -1n, 'a', null, false, true, {}, [], () => {}] + key: 'retryRate', + valid: [0, 1, 10, 100.5, 1000], + invalid: [-1, 'a', null, false, true, {}, [], () => {}] }, { - key: 'maxRetries', - valid: [ - 1, 10, 100, 1000, 10000, 10000n, - ], - invalid: [-1, -1n, 'a', null, false, true, {}, [], () => {}] + key: 'retryBurst', + valid: [0, 1, 10, 100.5, 1000], + invalid: [-1, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'statelessResetRate', + valid: [0, 1, 10, 100.5, 1000], + invalid: [-1, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'statelessResetBurst', + valid: [0, 1, 10, 100.5, 1000], + invalid: [-1, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'versionNegotiationRate', + valid: [0, 1, 10, 100.5, 1000], + invalid: [-1, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'versionNegotiationBurst', + valid: [0, 1, 10, 100.5, 1000], + invalid: [-1, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'immediateCloseRate', + valid: [0, 1, 10, 100.5, 1000], + invalid: [-1, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'immediateCloseBurst', + valid: [0, 1, 10, 100.5, 1000], + invalid: [-1, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'sessionCreationRate', + valid: [0, 1, 10, 100.5, 1000, Infinity], + invalid: [-1, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'sessionCreationBurst', + valid: [0, 1, 10, 100.5, 1000, Infinity], + invalid: [-1, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'blockList', + valid: [new BlockList()], + invalid: ['a', 0, null, false, true, {}, [], () => {}] + }, + { + key: 'blockListPolicy', + valid: ['deny', 'allow'], + invalid: ['invalid', 0, null, false, true, {}, [], () => {}] }, { key: 'validateAddress', @@ -148,7 +195,7 @@ for (const { key, valid, invalid } of cases) { const options = {}; options[key] = value; assert.throws(() => new QuicEndpoint(options), { - message: new RegExp(`${key}`), + message: new RegExp(`${RegExp.escape(key)}`), }, value); } } diff --git a/test/parallel/test-quic-internal-endpoint-stats-state.mjs b/test/parallel/test-quic-internal-endpoint-stats-state.mjs index faa1b58d06c0..2f4ce6ccc141 100644 --- a/test/parallel/test-quic-internal-endpoint-stats-state.mjs +++ b/test/parallel/test-quic-internal-endpoint-stats-state.mjs @@ -19,46 +19,53 @@ const { const { kFinishClose, kPrivateConstructor, - kState, } = (await import('internal/quic/symbols')).default; +const { + getQuicEndpointState, +} = (await import('internal/quic/quic')).default; { const endpoint = new QuicEndpoint(); + const state = getQuicEndpointState(endpoint); - assert.strictEqual(endpoint[kState].isBound, false); - assert.strictEqual(endpoint[kState].isReceiving, false); - assert.strictEqual(endpoint[kState].isListening, false); - assert.strictEqual(endpoint[kState].isClosing, false); - assert.strictEqual(endpoint[kState].isBusy, false); - assert.strictEqual(endpoint[kState].pendingCallbacks, 0n); + assert.strictEqual(state.isBound, false); + assert.strictEqual(state.isReceiving, false); + assert.strictEqual(state.isListening, false); + assert.strictEqual(state.isClosing, false); + assert.strictEqual(state.isBusy, false); + assert.strictEqual(state.pendingCallbacks, 0n); - assert.deepStrictEqual(JSON.parse(JSON.stringify(endpoint[kState])), { + assert.deepStrictEqual(JSON.parse(JSON.stringify(state)), { isBound: false, isReceiving: false, isListening: false, isClosing: false, isBusy: false, - pendingCallbacks: '0', + maxConnectionsPerHost: 100, + maxConnectionsTotal: 10_000, + pendingCallbacks: 0, }); endpoint.busy = true; - assert.strictEqual(endpoint[kState].isBusy, true); + assert.strictEqual(state.isBusy, true); endpoint.busy = false; - assert.strictEqual(endpoint[kState].isBusy, false); - assert.strictEqual(typeof inspect(endpoint[kState]), 'string'); + assert.strictEqual(state.isBusy, false); + assert.strictEqual(typeof inspect(state), 'string'); } { // It is not bound after close. const endpoint = new QuicEndpoint(); - endpoint[kState][kFinishClose](); - assert.strictEqual(endpoint[kState].isBound, undefined); + const state = getQuicEndpointState(endpoint); + state[kFinishClose](); + assert.strictEqual(state.isBound, undefined); } { // State constructor argument is ArrayBuffer const endpoint = new QuicEndpoint(); - const StateCons = endpoint[kState].constructor; + const state = getQuicEndpointState(endpoint); + const StateCons = state.constructor; assert.throws(() => new StateCons(kPrivateConstructor, 1), { code: 'ERR_INVALID_ARG_TYPE' }); @@ -79,9 +86,15 @@ const { assert.strictEqual(typeof endpoint.stats.clientSessions, 'bigint'); assert.strictEqual(typeof endpoint.stats.serverBusyCount, 'bigint'); assert.strictEqual(typeof endpoint.stats.retryCount, 'bigint'); + assert.strictEqual(typeof endpoint.stats.retryRateLimited, 'bigint'); assert.strictEqual(typeof endpoint.stats.versionNegotiationCount, 'bigint'); + assert.strictEqual(typeof endpoint.stats.versionNegotiationRateLimited, 'bigint'); assert.strictEqual(typeof endpoint.stats.statelessResetCount, 'bigint'); + assert.strictEqual(typeof endpoint.stats.statelessResetRateLimited, 'bigint'); assert.strictEqual(typeof endpoint.stats.immediateCloseCount, 'bigint'); + assert.strictEqual(typeof endpoint.stats.immediateCloseRateLimited, 'bigint'); + assert.strictEqual(typeof endpoint.stats.sessionCreationRateLimited, 'bigint'); + assert.strictEqual(typeof endpoint.stats.packetsBlocked, 'bigint'); assert.deepStrictEqual(Object.keys(endpoint.stats.toJSON()), [ 'connected', @@ -95,9 +108,15 @@ const { 'clientSessions', 'serverBusyCount', 'retryCount', + 'retryRateLimited', 'versionNegotiationCount', + 'versionNegotiationRateLimited', 'statelessResetCount', + 'statelessResetRateLimited', 'immediateCloseCount', + 'immediateCloseRateLimited', + 'sessionCreationRateLimited', + 'packetsBlocked', ]); assert.strictEqual(typeof inspect(endpoint.stats), 'string'); } @@ -137,11 +156,14 @@ assert.strictEqual(streamState.reset, false); assert.strictEqual(streamState.hasReader, false); assert.strictEqual(streamState.wantsBlock, false); assert.strictEqual(streamState.wantsReset, false); +assert.strictEqual(streamState.wantsStopSending, false); assert.strictEqual(sessionState.hasPathValidationListener, false); -assert.strictEqual(sessionState.hasVersionNegotiationListener, false); assert.strictEqual(sessionState.hasDatagramListener, false); +assert.strictEqual(sessionState.hasDatagramStatusListener, false); assert.strictEqual(sessionState.hasSessionTicketListener, false); +assert.strictEqual(sessionState.hasNewTokenListener, false); +assert.strictEqual(sessionState.hasOriginListener, false); assert.strictEqual(sessionState.isClosing, false); assert.strictEqual(sessionState.isGracefulClose, false); assert.strictEqual(sessionState.isSilentClose, false); @@ -150,10 +172,13 @@ assert.strictEqual(sessionState.isHandshakeCompleted, false); assert.strictEqual(sessionState.isHandshakeConfirmed, false); assert.strictEqual(sessionState.isStreamOpenAllowed, false); assert.strictEqual(sessionState.isPrioritySupported, false); +assert.strictEqual(sessionState.headersSupported, 0); assert.strictEqual(sessionState.isWrapped, false); +assert.strictEqual(sessionState.maxDatagramSize, 0); assert.strictEqual(sessionState.lastDatagramId, 0n); assert.strictEqual(typeof streamState.toJSON(), 'object'); +assert.strictEqual(JSON.parse(streamState.toString()).resetCode, '0'); assert.strictEqual(typeof sessionState.toJSON(), 'object'); assert.strictEqual(typeof inspect(streamState), 'string'); assert.strictEqual(typeof inspect(sessionState), 'string'); @@ -185,7 +210,7 @@ assert.strictEqual(typeof sessionStats.bidiInStreamCount, 'bigint'); assert.strictEqual(typeof sessionStats.bidiOutStreamCount, 'bigint'); assert.strictEqual(typeof sessionStats.uniInStreamCount, 'bigint'); assert.strictEqual(typeof sessionStats.uniOutStreamCount, 'bigint'); -assert.strictEqual(typeof sessionStats.maxBytesInFlights, 'bigint'); +assert.strictEqual(typeof sessionStats.maxBytesInFlight, 'bigint'); assert.strictEqual(typeof sessionStats.bytesInFlight, 'bigint'); assert.strictEqual(typeof sessionStats.blockCount, 'bigint'); assert.strictEqual(typeof sessionStats.cwnd, 'bigint'); @@ -194,10 +219,19 @@ assert.strictEqual(typeof sessionStats.minRtt, 'bigint'); assert.strictEqual(typeof sessionStats.rttVar, 'bigint'); assert.strictEqual(typeof sessionStats.smoothedRtt, 'bigint'); assert.strictEqual(typeof sessionStats.ssthresh, 'bigint'); +assert.strictEqual(typeof sessionStats.pktSent, 'bigint'); +assert.strictEqual(typeof sessionStats.bytesSent, 'bigint'); +assert.strictEqual(typeof sessionStats.pktRecv, 'bigint'); +assert.strictEqual(typeof sessionStats.bytesRecv, 'bigint'); +assert.strictEqual(typeof sessionStats.pktLost, 'bigint'); +assert.strictEqual(typeof sessionStats.bytesLost, 'bigint'); +assert.strictEqual(typeof sessionStats.pingRecv, 'bigint'); +assert.strictEqual(typeof sessionStats.pktDiscarded, 'bigint'); assert.strictEqual(typeof sessionStats.datagramsReceived, 'bigint'); assert.strictEqual(typeof sessionStats.datagramsSent, 'bigint'); assert.strictEqual(typeof sessionStats.datagramsAcknowledged, 'bigint'); assert.strictEqual(typeof sessionStats.datagramsLost, 'bigint'); +assert.strictEqual(typeof sessionStats.streamsIdleTimedOut, 'bigint'); assert.strictEqual(typeof sessionStats.toJSON(), 'object'); assert.strictEqual(typeof inspect(sessionStats), 'string'); streamStats[kFinishClose](); diff --git a/test/parallel/test-quic-internal-setcallbacks.mjs b/test/parallel/test-quic-internal-setcallbacks.mjs index cebbee43376d..08d4c1bbfc9a 100644 --- a/test/parallel/test-quic-internal-setcallbacks.mjs +++ b/test/parallel/test-quic-internal-setcallbacks.mjs @@ -13,17 +13,25 @@ const callbacks = { onEndpointClose() {}, onSessionNew() {}, onSessionClose() {}, + onSessionApplication() {}, onSessionDatagram() {}, onSessionDatagramStatus() {}, onSessionHandshake() {}, onSessionPathValidation() {}, onSessionTicket() {}, onSessionNewToken() {}, + onSessionKeyLog() {}, + onSessionQlog() {}, + onSessionEarlyDataRejected() {}, + onSessionOrigin() {}, + onSessionGoaway() {}, onSessionVersionNegotiation() {}, onStreamCreated() {}, onStreamBlocked() {}, onStreamClose() {}, + onStreamDrain() {}, onStreamReset() {}, + onStreamStopSending() {}, onStreamHeaders() {}, onStreamTrailers() {}, }; diff --git a/test/parallel/test-quic-keepalive.mjs b/test/parallel/test-quic-keepalive.mjs new file mode 100644 index 000000000000..0bd3e63c15d3 --- /dev/null +++ b/test/parallel/test-quic-keepalive.mjs @@ -0,0 +1,66 @@ +// Flags: --experimental-quic --no-warnings + +// Test: keepAlive option. +// keepAlive keeps idle connection alive past default timeout. +// keepAlive: 0 (default) does not send PING frames. +// Keep-alive PING frames visible in session stats (pingRecv). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import { setTimeout } from 'node:timers/promises'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// KA-01/03: With keepAlive set, the connection stays alive and +// PING frames are sent. After a brief idle period, the peer's +// pingRecv stat should be > 0. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + // Wait for keep-alive PINGs to arrive. + await setTimeout(300); + // Server should have received PING frames. + assert.ok(serverSession.stats.pingRecv > 0n, + 'Server should receive keep-alive PINGs'); + serverSession.close(); + serverDone.resolve(); + }), { + transportParams: { maxIdleTimeout: 10 }, + }); + + const clientSession = await connect(serverEndpoint.address, { + keepAlive: 100, // Send PING every 100ms. + transportParams: { maxIdleTimeout: 10 }, + }); + + await Promise.all([clientSession.opened, serverDone.promise, clientSession.closed]); + await serverEndpoint.close(); +} + +// Without keepAlive (default), no additional PINGs after handshake. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + // Record PINGs from handshake. + const handshakePings = serverSession.stats.pingRecv; + await setTimeout(200); + // No additional PINGs should arrive without keepAlive. + assert.strictEqual(serverSession.stats.pingRecv, handshakePings); + serverSession.close(); + serverDone.resolve(); + })); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + await Promise.all([serverDone.promise, clientSession.closed]); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-key-update-peer.mjs b/test/parallel/test-quic-key-update-peer.mjs new file mode 100644 index 000000000000..1a0fed1a1672 --- /dev/null +++ b/test/parallel/test-quic-key-update-peer.mjs @@ -0,0 +1,48 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: peer-initiated key update handled transparently. +// The server initiates a key update. Data continues flowing on +// the client side without interruption. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + + // Server initiates key update. + serverSession.updateKey(); + + serverSession.onstream = mustCall(async (stream) => { + const data = await bytes(stream); + // Data should arrive correctly despite key update. + assert.strictEqual(Buffer.from(data).toString(), 'after key update'); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Send data after the server's key update — should work transparently. +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('after key update'), +}); +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-key-update.mjs b/test/parallel/test-quic-key-update.mjs new file mode 100644 index 000000000000..b01288e90f41 --- /dev/null +++ b/test/parallel/test-quic-key-update.mjs @@ -0,0 +1,48 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: session.updateKey() initiates key update, data continues +// flowing. +// After calling updateKey(), the session transitions to new encryption +// keys. Existing and new streams should continue to work normally. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const dataLength = 1024; +const data = new Uint8Array(dataLength); +for (let i = 0; i < dataLength; i++) data[i] = i & 0xff; + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(received.byteLength, dataLength); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Initiate key update before sending data. +clientSession.updateKey(); + +// Open a stream and send data — should work with new keys. +const stream = await clientSession.createBidirectionalStream(); +stream.setBody(data); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-list-endpoints.mjs b/test/parallel/test-quic-list-endpoints.mjs new file mode 100644 index 000000000000..2763cbb9e9a2 --- /dev/null +++ b/test/parallel/test-quic-list-endpoints.mjs @@ -0,0 +1,103 @@ +// Flags: --experimental-quic --no-warnings + +// Test: listEndpoints returns live endpoints filtered by active state. +// - Returns an empty array when no endpoints exist. +// - Includes all created endpoints. +// - active=true (default) filters out destroyed, closing, and busy endpoints. +// - active=false returns all registered endpoints regardless of state. +// - Validates options argument types. + +import { hasQuic, skip } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listEndpoints, QuicEndpoint } = await import('node:quic'); + +// listEndpoints is exported as a function. +assert.strictEqual(typeof listEndpoints, 'function'); + +// Empty when no endpoints have been created. +assert.deepStrictEqual(listEndpoints(), []); +assert.deepStrictEqual(listEndpoints({ active: false }), []); + +// Created endpoints appear in the list. +{ + const ep1 = new QuicEndpoint(); + const ep2 = new QuicEndpoint(); + + const list = listEndpoints(); + assert.strictEqual(list.length, 2); + assert.ok(list.includes(ep1)); + assert.ok(list.includes(ep2)); + + // active=false also returns them. + const all = listEndpoints({ active: false }); + assert.strictEqual(all.length, 2); + assert.ok(all.includes(ep1)); + assert.ok(all.includes(ep2)); + + // Returns plain QuicEndpoint instances, not wrapped in arrays. + assert.ok(list[0] instanceof QuicEndpoint); + assert.ok(list[1] instanceof QuicEndpoint); + + await ep1.close(); + await ep2.close(); +} + +// Destroyed endpoints are excluded by active filter. +{ + const ep = new QuicEndpoint(); + assert.strictEqual(listEndpoints().length, 1); + + await ep.close(); + await ep.closed; + assert.strictEqual(ep.destroyed, true); + + // Default (active=true) excludes destroyed endpoint. + assert.strictEqual(listEndpoints().length, 0); + + // active=false still includes it... but destroyed endpoints are removed + // from the registry entirely in kFinishClose, so it won't appear at all. + assert.strictEqual(listEndpoints({ active: false }).length, 0); +} + +// Busy endpoints are excluded by the active filter. +{ + const ep = new QuicEndpoint(); + assert.strictEqual(listEndpoints().length, 1); + + ep.busy = true; + assert.strictEqual(ep.busy, true); + + // active=true excludes busy endpoint. + assert.strictEqual(listEndpoints().length, 0); + + // active=false includes it. + const all = listEndpoints({ active: false }); + assert.strictEqual(all.length, 1); + assert.ok(all.includes(ep)); + + ep.busy = false; + + // After un-busying, it reappears in the active list. + assert.strictEqual(listEndpoints().length, 1); + + await ep.close(); +} + +// Options validation. +assert.throws(() => listEndpoints('bad'), { + code: 'ERR_INVALID_ARG_TYPE', +}); +assert.throws(() => listEndpoints(null), { + code: 'ERR_INVALID_ARG_TYPE', +}); +assert.throws(() => listEndpoints({ active: 'yes' }), { + code: 'ERR_INVALID_ARG_TYPE', +}); +assert.throws(() => listEndpoints({ active: 1 }), { + code: 'ERR_INVALID_ARG_TYPE', +}); diff --git a/test/parallel/test-quic-max-payload-size.mjs b/test/parallel/test-quic-max-payload-size.mjs new file mode 100644 index 000000000000..4aa2314f047e --- /dev/null +++ b/test/parallel/test-quic-max-payload-size.mjs @@ -0,0 +1,56 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: maxPayloadSize causes smaller packets. +// With a smaller maxPayloadSize, packets should be smaller. +// We verify by checking that more packets are needed to transfer +// the same amount of data compared to the default. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const dataLength = 4096; + +// Transfer with default maxPayloadSize (1200). +async function transferAndGetPacketCount(maxPayloadSize) { + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(received.byteLength, dataLength); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); + }), maxPayloadSize ? { maxPayloadSize } : {}); + + const clientSession = await connect(serverEndpoint.address, + maxPayloadSize ? { maxPayloadSize } : {}); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream(); + stream.setBody(new Uint8Array(dataLength)); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await Promise.all([stream.closed, serverDone.promise]); + + const pktSent = clientSession.stats.pktSent; + await clientSession.closed; + await serverEndpoint.close(); + return pktSent; +} + +const defaultPkts = await transferAndGetPacketCount(); +const smallPkts = await transferAndGetPacketCount(1200); + +// With the same or default payload size, packet counts should be similar. +// The key assertion: the option is accepted and data transfers correctly. +assert.ok(defaultPkts > 0n); +assert.ok(smallPkts > 0n); diff --git a/test/parallel/test-quic-max-window.mjs b/test/parallel/test-quic-max-window.mjs new file mode 100644 index 000000000000..b0ee67afa964 --- /dev/null +++ b/test/parallel/test-quic-max-window.mjs @@ -0,0 +1,75 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: maxStreamWindow and maxWindow limits. +// maxStreamWindow limits per-stream receive window. +// maxWindow limits session-level receive window. +// With smaller windows, the transfer should still complete but may +// require more flow control updates. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const dataLength = 8192; + +// maxStreamWindow limits per-stream window. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(received.byteLength, dataLength); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); + }), { + // Small per-stream receive window. + maxStreamWindow: 1024, + }); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream(); + stream.setBody(new Uint8Array(dataLength)); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await Promise.all([stream.closed, serverDone.promise, clientSession.closed]); + await serverEndpoint.close(); +} + +// maxWindow limits session-level window. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(received.byteLength, dataLength); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); + }), { + // Small session-level receive window. + maxWindow: 2048, + }); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream(); + stream.setBody(new Uint8Array(dataLength)); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await Promise.all([stream.closed, serverDone.promise, clientSession.closed]); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-module-exports.mjs b/test/parallel/test-quic-module-exports.mjs new file mode 100644 index 000000000000..a109b236505a --- /dev/null +++ b/test/parallel/test-quic-module-exports.mjs @@ -0,0 +1,60 @@ +// Flags: --experimental-quic --no-warnings + +// Test: module exports completeness (CONST-06, CONST-07, CONST-08, +// CONST-09). +// Module exports are sealed. +// Stats classes exist on constructors. +// session ticket getter works after handshake. +// session token getter works after NEW_TOKEN. + +import { hasQuic, skip } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const quic = await import('node:quic'); +const { listen, connect } = await import('../common/quic.mjs'); + +// Module exports are frozen/sealed. +assert.throws(() => { quic.newProperty = true; }, TypeError); + +// Stats classes exist. +assert.ok(quic.QuicEndpoint); + +// CONST-08/09: Session ticket and token getters. +{ + let savedTicket; + let savedToken; + const gotTicket = Promise.withResolvers(); + const gotToken = Promise.withResolvers(); + + const serverEndpoint = await listen(async (serverSession) => { + await serverSession.closed; + }); + + const clientSession = await connect(serverEndpoint.address, { + verifyPeer: 'manual', + onsessionticket(ticket) { + savedTicket = ticket; + gotTicket.resolve(); + }, + onnewtoken(token) { + savedToken = token; + gotToken.resolve(); + }, + }); + await Promise.all([clientSession.opened, gotTicket.promise, gotToken.promise]); + + // Session ticket is a Buffer. + assert.ok(Buffer.isBuffer(savedTicket)); + assert.ok(savedTicket.length > 0); + + // Token is a Buffer. + assert.ok(Buffer.isBuffer(savedToken)); + assert.ok(savedToken.length > 0); + + await clientSession.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-multipacket-clienthello.mjs b/test/parallel/test-quic-multipacket-clienthello.mjs new file mode 100644 index 000000000000..2d701a899fc4 --- /dev/null +++ b/test/parallel/test-quic-multipacket-clienthello.mjs @@ -0,0 +1,60 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// A large post-quantum key share splits the ClientHello across QUIC Initial +// packets. The server must accept the incomplete first packet before ALPN has +// selected its application, then complete the handshake and process streams. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { createPrivateKey } = await import('node:crypto'); +const { listen, connect } = await import('node:quic'); +const { bytes } = await import('stream/iter'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const alpn = 'quic-multipacket-clienthello'; +const groups = 'X25519MLKEM768'; +const streamReceived = Promise.withResolvers(); + +const endpoint = await listen(mustCall(async (session) => { + const info = await session.opened; + assert.strictEqual(session.alpnProtocol, alpn); + assert.strictEqual(info.cipherVersion, 'TLSv1.3'); + + session.onstream = mustCall(async (stream) => { + assert.strictEqual( + Buffer.from(await bytes(stream)).toString(), + 'application event survived', + ); + stream.writer.endSync(); + await stream.closed; + streamReceived.resolve(); + }); +}), { + host: '127.0.0.1', + port: 0, + alpn: [alpn], + groups, + sni: { '*': { keys: [key], certs: [cert] } }, +}); + +const session = await connect(endpoint.address, { + alpn, + groups, + servername: 'localhost', + verifyPeer: 'manual', +}); + +await session.opened; +const stream = await session.createBidirectionalStream({ + body: 'application event survived', +}); +await Promise.all([stream.closed, streamReceived.promise]); +await session.close(); +await endpoint.close(); diff --git a/test/parallel/test-quic-new-token.mjs b/test/parallel/test-quic-new-token.mjs new file mode 100644 index 000000000000..1c6c44e64de3 --- /dev/null +++ b/test/parallel/test-quic-new-token.mjs @@ -0,0 +1,54 @@ +// Flags: --experimental-quic --no-warnings + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +// The token option must be an ArrayBufferView if provided +await assert.rejects(connect({ port: 1234 }, { + alpn: 'quic-test', + token: 'not-a-buffer', +}), { + code: 'ERR_INVALID_ARG_TYPE', +}); + +// After a successful handshake, the server automatically sends a +// NEW_TOKEN frame. The client should receive it via the onnewtoken +// callback set at connection time. + +const clientToken = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.opened.then(mustCall()); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], +}); + +const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + servername: 'localhost', + // Set onnewtoken at connection time to avoid missing the event. + onnewtoken: mustCall(function(token, address) { + assert.ok(Buffer.isBuffer(token), 'token should be a Buffer'); + assert.ok(token.length > 0, 'token should not be empty'); + assert.ok(address !== undefined, 'address should be defined'); + clientToken.resolve(); + }), +}); + +await Promise.all([clientSession.opened, clientToken.promise]); + +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-perf-hooks.mjs b/test/parallel/test-quic-perf-hooks.mjs new file mode 100644 index 000000000000..fb9f90c5f472 --- /dev/null +++ b/test/parallel/test-quic-perf-hooks.mjs @@ -0,0 +1,96 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: PerformanceObserver integration for QUIC. +// QuicEndpoint, QuicSession, and QuicStream emit PerformanceEntry +// objects with entryType 'quic' when a PerformanceObserver is active. + +import { hasQuic, skip, mustCall, mustCallAtLeast } from '../common/index.mjs'; +import assert from 'node:assert'; +import { PerformanceObserver } from 'node:perf_hooks'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const entries = []; + +const observerDone = Promise.withResolvers(); + +// Collect all quic perf entries. +const obs = new PerformanceObserver(mustCallAtLeast((list) => { + for (const entry of list.getEntries()) { + entries.push(entry); + } + // We expect at least: 1 endpoint + 2 sessions + 2 streams = 5 entries. + // The observer may be called multiple times as entries arrive in batches. + // Resolve once we have enough entries. + if (entries.length >= 5) { + observerDone.resolve(); + } +})); +obs.observe({ entryTypes: ['quic'] }); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + await bytes(stream); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('perf test'), +}); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise, clientSession.closed]); +await serverEndpoint.close(); + +// Wait for the observer to collect all entries. +await observerDone.promise; +obs.disconnect(); + +// Verify we got all expected entry types. +const endpointEntries = entries.filter((e) => e.name === 'QuicEndpoint'); +const sessionEntries = entries.filter((e) => e.name === 'QuicSession'); +const streamEntries = entries.filter((e) => e.name === 'QuicStream'); + +assert.ok(endpointEntries.length >= 1, `Expected QuicEndpoint entries, got ${endpointEntries.length}`); +assert.ok(sessionEntries.length >= 2, `Expected >= 2 QuicSession entries, got ${sessionEntries.length}`); +assert.ok(streamEntries.length >= 2, `Expected >= 2 QuicStream entries, got ${streamEntries.length}`); + +// Verify common fields on all entries. +for (const entry of entries) { + assert.strictEqual(entry.entryType, 'quic'); + assert.strictEqual(typeof entry.startTime, 'number'); + assert.ok(entry.duration >= 0, `duration should be >= 0, got ${entry.duration}`); + assert.ok(entry.detail, 'entry should have detail'); + assert.ok(entry.detail.stats, 'entry.detail should have stats'); +} + +// Verify session-specific detail fields. +for (const entry of sessionEntries) { + // The handshake may be undefined if destroyed before handshake completes, + // but in this test both sessions complete handshakes. + assert.ok(entry.detail.handshake, 'session entry should have handshake info'); + assert.strictEqual(typeof entry.detail.handshake.protocol, 'string'); + assert.strictEqual(typeof entry.detail.handshake.earlyDataAttempted, 'boolean'); + assert.strictEqual(typeof entry.detail.handshake.earlyDataAccepted, 'boolean'); +} + +// Verify stream-specific detail fields. +for (const entry of streamEntries) { + assert.ok(entry.detail.direction === 'bidi' || entry.detail.direction === 'uni', + `stream direction should be bidi or uni, got ${entry.detail.direction}`); +} diff --git a/test/parallel/test-quic-preferred-address-ignore.mjs b/test/parallel/test-quic-preferred-address-ignore.mjs new file mode 100644 index 000000000000..41c132cbcfa9 --- /dev/null +++ b/test/parallel/test-quic-preferred-address-ignore.mjs @@ -0,0 +1,58 @@ +// Flags: --experimental-quic --no-warnings + +// Test: preferred address ignored by client. +// Server advertises a preferred address, but the client is configured +// with preferredAddressPolicy: 'ignore'. No path validation should +// occur and all data stays on the original path. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const allStatusDone = Promise.withResolvers(); +const serverGot = Promise.withResolvers(); +let statusCount = 0; + +const preferredEndpoint = await listen(mustNotCall()); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await allStatusDone.promise; + await serverGot.promise; + await serverSession.close(); +}), { + transportParams: { + preferredAddressIpv4: preferredEndpoint.address, + }, + ondatagram: mustCall(() => { + serverGot.resolve(); + }, 2), +}); + +const clientSession = await connect(serverEndpoint.address, { + reuseEndpoint: false, + preferredAddressPolicy: 'ignore', + transportParams: { maxDatagramFrameSize: 1200 }, + // Path validation should NOT fire when ignoring preferred address. + onpathvalidation: mustNotCall(), + ondatagramstatus: mustCall((id, status) => { + if (++statusCount >= 2) allStatusDone.resolve(); + }, 2), +}); +await clientSession.opened; + +await clientSession.sendDatagram(new Uint8Array([1])); +await clientSession.sendDatagram(new Uint8Array([2])); + +await Promise.all([serverGot.promise, allStatusDone.promise]); + +assert.strictEqual(clientSession.stats.datagramsSent, 2n); +assert.ok(clientSession.stats.datagramsAcknowledged >= 1n); + +await clientSession.closed; +await serverEndpoint.close(); +await preferredEndpoint.close(); diff --git a/test/parallel/test-quic-qlog.mjs b/test/parallel/test-quic-qlog.mjs new file mode 100644 index 000000000000..faa1bb91b53a --- /dev/null +++ b/test/parallel/test-quic-qlog.mjs @@ -0,0 +1,92 @@ +// Flags: --experimental-quic --no-warnings + +// Test: qlog callback. +// When qlog: true, qlog data is delivered to the session.onqlog +// callback during the connection lifecycle. The final chunk is +// emitted synchronously during ngtcp2_conn destruction with +// fin=true. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import { setImmediate } from 'node:timers/promises'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const clientChunks = []; +const serverChunks = []; +let clientFinReceived = false; +let serverFinReceived = false; + +function assertQlogOutput(chunks, finReceived, side) { + assert.ok(chunks.length > 0, `Expected ${side} qlog chunks, got ${chunks.length}`); + assert.ok(finReceived, `Expected ${side} to receive fin`); + + for (const { data, fin } of chunks) { + assert.strictEqual(typeof data, 'string', + `Each ${side} qlog chunk should be a string`); + assert.strictEqual(typeof fin, 'boolean', + `Each ${side} fin flag should be a boolean`); + } + + // Only the last chunk should have fin=true. + for (let i = 0; i < chunks.length - 1; i++) { + assert.strictEqual(chunks[i].fin, false, + `${side} chunk ${i} should not be fin`); + } + assert.strictEqual(chunks[chunks.length - 1].fin, true, + `${side} last chunk should be fin`); + + // ngtcp2 emits qlog in JSON-SEQ format (RFC 7464): each record is + // prefixed with 0x1e (Record Separator) and terminated by a newline. + // Parse the individual records and verify the header has expected fields. + const joined = chunks.map((c) => c.data).join(''); + const records = joined.split('\x1e').filter((s) => s.trim().length > 0); + assert.ok(records.length > 0, `${side} qlog should have at least one record`); + + // The first record is the qlog header with format metadata. + const header = JSON.parse(records[0]); + + assert.ok(header.qlog_version !== undefined || header.qlog_format !== undefined, + `${side} qlog header should have qlog_version or qlog_format field`); + + for (let i = 1; i < records.length; i++) { + const record = JSON.parse(records[i]); + assert.ok('name' in record); + assert.ok('data' in record); + assert.ok('time' in record); + } +} + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + serverSession.close(); +}), { + qlog: true, + onqlog(data, fin) { + serverChunks.push({ data, fin }); + if (fin) serverFinReceived = true; + }, +}); + +const clientSession = await connect(serverEndpoint.address, { + qlog: true, + onqlog(data, fin) { + clientChunks.push({ data, fin }); + if (fin) clientFinReceived = true; + }, +}); + +await Promise.all([clientSession.opened, clientSession.closed]); +await serverEndpoint.close(); + +// The final qlog chunk (fin=true) is delivered via SetImmediate because +// it is emitted during ngtcp2_conn destruction when MakeCallback is +// unsafe. Yield to let the deferred callback run before asserting. +await setImmediate(); + +assertQlogOutput(clientChunks, clientFinReceived, 'client'); +assertQlogOutput(serverChunks, serverFinReceived, 'server'); diff --git a/test/parallel/test-quic-reject-unauthorized.mjs b/test/parallel/test-quic-reject-unauthorized.mjs new file mode 100644 index 000000000000..781d93daacad --- /dev/null +++ b/test/parallel/test-quic-reject-unauthorized.mjs @@ -0,0 +1,98 @@ +// Flags: --experimental-quic --no-warnings + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +// rejectUnauthorized must be a boolean +await assert.rejects(connect({ port: 1234 }, { + alpn: 'quic-test', + rejectUnauthorized: 'yes', +}), { + code: 'ERR_INVALID_ARG_TYPE', +}); + +// verifyPeer must be one of 'strict', 'auto', 'manual' +await assert.rejects(connect({ port: 1234 }, { + alpn: 'quic-test', + verifyPeer: 'invalid', +}), { + code: 'ERR_INVALID_ARG_VALUE', +}); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onerror = () => {}; + return assert.rejects(serverSession.opened, (err) => + err.code === 'ERR_QUIC_TRANSPORT_ERROR' || + err.code === 'ERR_INVALID_STATE', + ).then(mustCall(() => { + serverSession.close(); + })); +}, 3), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], +}); + +// --- verifyPeer: 'manual' (current behavior) --- +// The session.opened promise resolves even with an invalid cert. +// The validation error is available in the info object. +{ + const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + servername: 'localhost', + verifyPeer: 'manual', + }); + + const info = await clientSession.opened; + // Self-signed cert without CA should produce a validation error. + assert.strictEqual(typeof info.validationErrorReason, 'string'); + assert.ok(info.validationErrorReason.length > 0); + assert.strictEqual(typeof info.validationErrorCode, 'string'); + assert.ok(info.validationErrorCode.length > 0); + + await clientSession.close(); +} + +// --- verifyPeer: 'auto' (default) --- +// The session.opened promise rejects when the cert is invalid. +{ + const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + servername: 'localhost', + // verifyPeer defaults to 'auto' + }); + + await assert.rejects(clientSession.opened, { + code: 'ERR_QUIC_TRANSPORT_ERROR', + }); +} + +// --- verifyPeer: 'strict' --- +// The TLS handshake itself fails. The session.opened promise rejects. +{ + const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + servername: 'localhost', + verifyPeer: 'strict', + // The TLS failure triggers onerror before opened rejects. + onerror: mustCall((err) => { + assert.ok(err, 'strict mode should fire onerror on invalid cert'); + }), + }); + + await assert.rejects(clientSession.opened, { + code: 'ERR_QUIC_TRANSPORT_ERROR', + }); +} + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-application-options.mjs b/test/parallel/test-quic-session-application-options.mjs new file mode 100644 index 000000000000..b119207bcc1f --- /dev/null +++ b/test/parallel/test-quic-session-application-options.mjs @@ -0,0 +1,103 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: session.applicationOptions +// Verifies that applicationOptions is available after ALPN negotiation +// completes (i.e., once the application has been selected), returns a +// null-prototype object, and reflects the configured values. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const customAppOptions = { + maxHeaderPairs: 50n, + maxHeaderLength: 8192n, + maxFieldSectionSize: 16384n, + qpackMaxDTableCapacity: 2048n, + qpackEncoderMaxDTableCapacity: 2048n, + qpackBlockedStreams: 50n, + enableConnectProtocol: false, + enableDatagrams: false, +}; + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // After the stream arrives, the handshake and ALPN negotiation are + // complete, so applicationOptions should be available. + const opts = serverSession.applicationOptions; + + assert.ok(opts != null, 'server applicationOptions should be available after handshake'); + assert.strictEqual(typeof opts, 'object'); + assert.strictEqual(Object.getPrototypeOf(opts), null); + + // Verify configured values are reflected. + assert.strictEqual(opts.maxHeaderPairs, BigInt(customAppOptions.maxHeaderPairs)); + assert.strictEqual(opts.maxHeaderLength, BigInt(customAppOptions.maxHeaderLength)); + assert.strictEqual(opts.maxFieldSectionSize, + BigInt(customAppOptions.maxFieldSectionSize)); + assert.strictEqual(opts.qpackMaxDtableCapacity, + BigInt(customAppOptions.qpackMaxDTableCapacity)); + assert.strictEqual(opts.qpackEncoderMaxDtableCapacity, + BigInt(customAppOptions.qpackEncoderMaxDTableCapacity)); + assert.strictEqual(opts.qpackBlockedStreams, + BigInt(customAppOptions.qpackBlockedStreams)); + assert.strictEqual(opts.enableConnectProtocol, + customAppOptions.enableConnectProtocol); + assert.strictEqual(opts.enableDatagrams, customAppOptions.enableDatagrams); + + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +}), { + application: customAppOptions, +}); + +const clientSession = await connect(serverEndpoint.address, { + application: customAppOptions, +}); +await clientSession.opened; + +// After opened, ALPN negotiation is complete and applicationOptions +// should be available on the client session. +const clientOpts = clientSession.applicationOptions; +assert.ok(clientOpts != null, 'client applicationOptions should be available after handshake'); +assert.strictEqual(typeof clientOpts, 'object'); +assert.strictEqual(Object.getPrototypeOf(clientOpts), null); + +// Verify configured values on the client side. +assert.strictEqual(clientOpts.maxHeaderPairs, BigInt(customAppOptions.maxHeaderPairs)); +assert.strictEqual(clientOpts.maxHeaderLength, BigInt(customAppOptions.maxHeaderLength)); +assert.strictEqual(clientOpts.maxFieldSectionSize, + customAppOptions.maxFieldSectionSize); +assert.strictEqual(clientOpts.qpackMaxDtableCapacity, + customAppOptions.qpackMaxDTableCapacity); +assert.strictEqual(clientOpts.qpackEncoderMaxDtableCapacity, + customAppOptions.qpackEncoderMaxDTableCapacity); +assert.strictEqual(clientOpts.qpackBlockedStreams, + customAppOptions.qpackBlockedStreams); +assert.strictEqual(clientOpts.enableConnectProtocol, + customAppOptions.enableConnectProtocol); +assert.strictEqual(clientOpts.enableDatagrams, customAppOptions.enableDatagrams); + +// Exchange data to let the server side run its assertions. +const stream = await clientSession.createBidirectionalStream(); +stream.writer.endSync(); + +// eslint-disable-next-line no-unused-vars +for await (const _ of stream) { /* drain */ } +await Promise.all([stream.closed, serverDone.promise]); + +// After close, applicationOptions should return null. +await clientSession.close(); +assert.strictEqual(clientSession.applicationOptions, null); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-close-error-code.mjs b/test/parallel/test-quic-session-close-error-code.mjs new file mode 100644 index 000000000000..a4de1a257261 --- /dev/null +++ b/test/parallel/test-quic-session-close-error-code.mjs @@ -0,0 +1,164 @@ +// Flags: --experimental-quic --no-warnings + +// Test: session close/destroy with application and transport error codes +// . +// Application error propagated as ERR_QUIC_APPLICATION_ERROR. +// Session close with specific app error code — peer receives it. +// Verifies that close() and destroy() with { code, type, reason } options +// send the correct CONNECTION_CLOSE frame, and the peer receives the +// correct error type, code, and reason. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import { setTimeout } from 'node:timers/promises'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// --- Test 1: close() with application error code --- +// The client closes with an application error. The server receives +// ERR_QUIC_APPLICATION_ERROR with the exact code and reason. +{ + const serverGot = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onerror = mustCall((err) => { + assert.strictEqual(err.code, 'ERR_QUIC_APPLICATION_ERROR'); + assert.strictEqual(err.message.includes('42'), true); // Error message should contain the code + assert.strictEqual(err.message.includes('client shutdown'), true); // Error message should contain the reason + assert.strictEqual(err.errorCode, 42n); + assert.strictEqual(err.type, 'application'); + assert.strictEqual(err.reason, 'client shutdown'); + }); + await assert.rejects(serverSession.closed, { + code: 'ERR_QUIC_APPLICATION_ERROR', + errorCode: 42n, + reason: 'client shutdown', + }); + serverGot.resolve(); + })); + + const clientSession = await connect(serverEndpoint.address, { + reuseEndpoint: false, + }); + await clientSession.opened; + + // Small delay to ensure handshake is fully confirmed so ngtcp2 + // generates the 1-RTT APPLICATION CONNECTION_CLOSE frame. + await setTimeout(100); + + // close() with application error — the client's closed promise + // resolves because the close was locally initiated (intentional). + // The peer receives the error code, but the local side is not in error. + await clientSession.close({ + code: 42n, + type: 'application', + reason: 'client shutdown', + }); + + await serverGot.promise; + await serverEndpoint.close(); +} + +// --- Test 2: close() with transport error code --- +// The client closes with a transport error. The server receives +// ERR_QUIC_TRANSPORT_ERROR with the exact code. +{ + const serverGot = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onerror = mustCall((err) => { + assert.strictEqual(err.code, 'ERR_QUIC_TRANSPORT_ERROR'); + assert.strictEqual(err.message.includes('1'), true); // Error message should contain the code + assert.strictEqual(err.errorCode, 1n); + assert.strictEqual(err.type, 'transport'); + }); + await assert.rejects(serverSession.closed, { + code: 'ERR_QUIC_TRANSPORT_ERROR', + }); + serverGot.resolve(); + })); + + const clientSession = await connect(serverEndpoint.address, { + reuseEndpoint: false, + }); + await clientSession.opened; + await setTimeout(100); + + // close() with transport error — resolves locally (intentional). + await clientSession.close({ code: 1n }); + + await serverGot.promise; + await serverEndpoint.close(); +} + +// --- Test 3: destroy() with application error code --- +// The client destroys with both a JS error and a QUIC error code. +// The peer receives the QUIC application error. +{ + const serverGot = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onerror = mustCall((err) => { + assert.strictEqual(err.code, 'ERR_QUIC_APPLICATION_ERROR'); + assert.strictEqual(err.message.includes('99'), true); + assert.strictEqual(err.errorCode, 99n); + assert.strictEqual(err.type, 'application'); + assert.strictEqual(err.reason, 'destroy with code'); + }); + await assert.rejects(serverSession.closed, { + code: 'ERR_QUIC_APPLICATION_ERROR', + }); + serverGot.resolve(); + })); + + const clientSession = await connect(serverEndpoint.address, { + reuseEndpoint: false, + onerror: mustCall((err) => { + // The JS error passed to destroy is delivered via onerror. + assert.strictEqual(err.message, 'fatal error'); + }), + }); + await clientSession.opened; + await setTimeout(100); + + const jsError = new Error('fatal error'); + clientSession.destroy(jsError, { + code: 99n, + type: 'application', + reason: 'destroy with code', + }); + + // The closed promise rejects with the JS error, not the QUIC error. + await assert.rejects(clientSession.closed, jsError); + + await serverGot.promise; + await serverEndpoint.close(); +} + +// --- Test 4: close() with no options (default behavior) --- +// Verify the default close sends NO_ERROR and the peer closes cleanly. +{ + const serverGot = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + // No onerror — clean close should not trigger errors. + await serverSession.closed; + serverGot.resolve(); + })); + + const clientSession = await connect(serverEndpoint.address, { + reuseEndpoint: false, + }); + await clientSession.opened; + await setTimeout(100); + + // Default close — no error code, clean shutdown. + await clientSession.close(); + + await serverGot.promise; + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-session-close-graceful.mjs b/test/parallel/test-quic-session-close-graceful.mjs new file mode 100644 index 000000000000..b059b74f8324 --- /dev/null +++ b/test/parallel/test-quic-session-close-graceful.mjs @@ -0,0 +1,88 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: graceful session close with open streams. +// session.close() with open streams waits for streams to close +// before the session's closed promise resolves. +// After close() is called, no new streams can be created. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); + +// ------------------------------------------------------------------- +// close() waits for open streams to finish. +// ------------------------------------------------------------------- +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(received.byteLength, 5); + stream.writer.endSync(); + await stream.closed; + serverDone.resolve(); + }); + })); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + // Open a stream and send data. + const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('hello'), + }); + + // Call close() while the stream is still open. The closed promise + // should NOT resolve until the stream finishes. + let closedResolved = false; + const closePromise = clientSession.close(); + closePromise.then(mustCall(() => { closedResolved = true; })); + + // Wait for the stream to complete normally. + await serverDone.promise; + for await (const batch of stream) { /* drain server FIN */ } // eslint-disable-line no-unused-vars + await stream.closed; + + // Now the closed promise should resolve. + await closePromise; + assert.strictEqual(closedResolved, true); + assert.strictEqual(clientSession.destroyed, true); + + await serverEndpoint.close(); +} + +// ------------------------------------------------------------------- +// No new streams after close() is called. +// ------------------------------------------------------------------- +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + })); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + clientSession.close(); + + // Attempting to create a stream after close() should reject. + await assert.rejects( + clientSession.createBidirectionalStream({ + body: encoder.encode('too late'), + }), + { + code: 'ERR_INVALID_STATE', + }, + ); + + await clientSession.closed; + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-session-close-sends-frame.mjs b/test/parallel/test-quic-session-close-sends-frame.mjs new file mode 100644 index 000000000000..3d398726585b --- /dev/null +++ b/test/parallel/test-quic-session-close-sends-frame.mjs @@ -0,0 +1,44 @@ +// Flags: --experimental-quic --no-warnings + +// Test: active session sends CONNECTION_CLOSE when closing. +// When the server calls session.close() on an active session, the peer +// receives a CONNECTION_CLOSE frame with NO_ERROR. The client's closed +// promise resolves (clean close), rather than rejecting with an idle +// timeout or transport error. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverReady = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + // Signal to the client that the server is ready, then close. + serverReady.resolve(); + await serverSession.close(); +})); + +const clientSession = await connect(serverEndpoint.address, { + reuseEndpoint: false, +}); + +await Promise.all([clientSession.opened, serverReady.promise]); + +// The client receives CONNECTION_CLOSE with NO_ERROR. +// The closed promise should resolve (not reject). If the server +// failed to send CONNECTION_CLOSE (e.g., used silent close or +// stateless reset), the client would time out and closed would +// reject with ERR_QUIC_TRANSPORT_ERROR. +await clientSession.closed; + +// If we reach here, the session closed cleanly — CONNECTION_CLOSE +// was received, not an idle timeout. +assert.ok(clientSession.destroyed, 'session should be destroyed'); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-close.mjs b/test/parallel/test-quic-session-close.mjs new file mode 100644 index 000000000000..543671521f08 --- /dev/null +++ b/test/parallel/test-quic-session-close.mjs @@ -0,0 +1,75 @@ +// Flags: --experimental-quic --no-warnings + +// Test: session.close() lifecycle. +// session.close() with no open streams resolves the closed promise. +// Server-initiated close delivers CONNECTION_CLOSE to the client. +// Client-initiated close — server sees the session end. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// ------------------------------------------------------------------- +// session.close() with no open streams resolves closed. +// ------------------------------------------------------------------- +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + // Server just waits for the client to close. + await serverSession.closed; + })); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + // No streams opened. close() should resolve. + await clientSession.close(); + assert.strictEqual(clientSession.destroyed, true); + await serverEndpoint.close(); +} + +// ------------------------------------------------------------------- +// Server-initiated close — client sees session end. +// ------------------------------------------------------------------- +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + // Server initiates close. + serverSession.close(); + await serverSession.closed; + })); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + // Client's closed promise should resolve when the server closes. + await clientSession.closed; + assert.strictEqual(clientSession.destroyed, true); + await serverEndpoint.close(); +} + +// ------------------------------------------------------------------- +// Client-initiated close — server sees session end. +// ------------------------------------------------------------------- +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + // The server's closed promise should resolve when the client closes. + await serverSession.closed; + assert.strictEqual(serverSession.destroyed, true); + serverDone.resolve(); + })); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + // Client initiates close. + await clientSession.close(); + await serverDone.promise; + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-session-destroy-reentrant.mjs b/test/parallel/test-quic-session-destroy-reentrant.mjs new file mode 100644 index 000000000000..e429987aab5b --- /dev/null +++ b/test/parallel/test-quic-session-destroy-reentrant.mjs @@ -0,0 +1,186 @@ +// Flags: --experimental-quic --no-warnings + +// Test: QuicSession.destroy and QuicStream.destroy are safely re-entrant. +// +// Calling destroy() from within an onerror callback (or from a stream +// onerror that fires during the session destroy cascade) used to run +// cleanup twice because the `if (this.destroyed)` guard checked `#handle`, +// which was only cleared at the END of destroy() — well after user-visible +// callbacks ran. +// +// The fix introduces a `#destroying` boolean flag that flips +// synchronously at the top of `destroy()`, so a re-entrant call hits +// the guard and returns immediately. The `#handle === undefined` +// invariant remains the "fully torn down" signal used by `kFinishClose` +// and only flips once teardown completes - so `session.destroyed` / +// `stream.destroyed` is still false from inside `onerror` (which runs +// during teardown), and only becomes true once `destroy()` returns. +// +// Cases covered: +// 1. session.onerror calls session.destroy() recursively. Verify the +// session is not torn down twice (no double publish on the +// diagnostics_channel, closed promise settles exactly once). +// 2. session.destroy(err) cascades to stream.destroy; the stream's +// onerror calls session.destroy() again. Verify safe. +// 3. stream.onerror calls stream.destroy() recursively. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import diagnostics_channel from 'node:diagnostics_channel'; +import { setImmediate } from 'node:timers/promises'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// Short idle timeout so the server cleans up quickly after we destroy +// the client without sending CONNECTION_CLOSE. +const transportParams = { maxIdleTimeout: 1 }; + +// ------------------------------------------------------------------- +// 1. session.onerror calls session.destroy() recursively. +// ------------------------------------------------------------------- +{ + const serverDone = Promise.withResolvers(); + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + serverDone.resolve(); + }), { transportParams }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams, + }); + await clientSession.opened; + + // Count diagnostics_channel publishes. Even though `destroy()` is + // called twice (once explicitly and once recursively from inside the + // `onerror` handler), the `#destroying` guard makes the second call + // a true no-op so each channel publishes exactly once. + const errSub = mustCall((msg) => { + assert.strictEqual(msg.session, clientSession); + }); + const closedSub = mustCall((msg) => { + assert.strictEqual(msg.session, clientSession); + }); + diagnostics_channel.subscribe('quic.session.error', errSub); + diagnostics_channel.subscribe('quic.session.closed', closedSub); + + const testError = new Error('reentrant destroy test'); + + clientSession.onerror = mustCall((err) => { + assert.strictEqual(err, testError); + // Re-enter destroy synchronously from the error handler. This must + // be a no-op because `#destroying` is already set; `destroyed` is + // still false here because `#handle` is cleared at the end of + // `destroy()`. The fact that the closed promise still rejects with + // `testError` (asserted below) - and not `'should be ignored'` - + // proves the recursive call did not run a second teardown. + clientSession.destroy(new Error('should be ignored')); + }); + + clientSession.destroy(testError); + // Once `destroy()` has returned, `destroyed` flips to true. + assert.strictEqual(clientSession.destroyed, true); + + await assert.rejects(clientSession.closed, testError); + + // Give the diagnostics_channel a tick to deliver any deferred messages. + await setImmediate(); + + diagnostics_channel.unsubscribe('quic.session.error', errSub); + diagnostics_channel.unsubscribe('quic.session.closed', closedSub); + + await serverDone.promise; + await serverEndpoint.close(); +} + +// ------------------------------------------------------------------- +// 2. session.destroy(err) -> stream onerror -> session.destroy() again. +// The stream's onerror is invoked during the session's destroy +// cascade; if that handler calls session.destroy() again, the second +// destroy must be a no-op. +// ------------------------------------------------------------------- +{ + const serverDone = Promise.withResolvers(); + const serverEndpoint = await listen(mustCall(async (serverSession) => { + // Server-side onstream callbacks are not always invoked here because + // the client may destroy before the server processes the stream open. + // We don't make assertions about server stream activity in this case; + // the test is purely about client-side re-entrancy. + await serverSession.closed; + serverDone.resolve(); + }), { transportParams }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams, + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream(); + + const testError = new Error('cascade reentrant destroy test'); + + stream.onerror = mustCall((err) => { + assert.strictEqual(err, testError); + // Re-enter session.destroy from inside the stream's onerror. This + // is happening DURING the session's stream cascade, so the session + // is mid-destroy. The second destroy() call must be a no-op. + clientSession.destroy(new Error('should be ignored')); + }); + + clientSession.onerror = mustCall((err) => { + assert.strictEqual(err, testError); + }); + + clientSession.destroy(testError); + assert.strictEqual(clientSession.destroyed, true); + assert.strictEqual(stream.destroyed, true); + + await assert.rejects(clientSession.closed, testError); + await assert.rejects(stream.closed, testError); + + await serverDone.promise; + await serverEndpoint.close(); +} + +// ------------------------------------------------------------------- +// 3. stream.onerror calls stream.destroy() recursively. +// ------------------------------------------------------------------- +{ + const serverDone = Promise.withResolvers(); + const serverEndpoint = await listen(mustCall(async (serverSession) => { + try { await serverSession.closed; } catch { /* server cascade-close */ } + serverDone.resolve(); + }), { transportParams }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams, + }); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream(); + + const testError = new Error('stream reentrant destroy test'); + + stream.onerror = mustCall((err) => { + assert.strictEqual(err, testError); + // Re-enter stream.destroy from inside its own onerror. The + // `#destroying` flag traps the recursive call; `destroyed` (i.e. + // `#handle === undefined`) is still false here because the handle + // is cleared inside `[kFinishClose]` later in this method. + stream.destroy(new Error('should be ignored')); + }); + + stream.destroy(testError); + // Once `destroy()` has returned, `destroyed` flips to true. + assert.strictEqual(stream.destroyed, true); + + await assert.rejects(stream.closed, testError); + + clientSession.close(); + await clientSession.closed; + await serverDone.promise; + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-session-destroy-validate-options.mjs b/test/parallel/test-quic-session-destroy-validate-options.mjs new file mode 100644 index 000000000000..b188033f5732 --- /dev/null +++ b/test/parallel/test-quic-session-destroy-validate-options.mjs @@ -0,0 +1,131 @@ +// Flags: --experimental-quic --no-warnings + +// Test: QuicSession.destroy(error, options) validates `options` up front, +// before any side effects. A malformed `options` argument must throw +// without: +// * publishing on the `quic.session.error` diagnostics channel, +// * invoking the user's `onerror` callback, +// * cascading destroy to open streams, +// * clearing the session's private state, +// * destroying the underlying C++ handle. +// +// After such a throw the session is still alive and a subsequent +// destroy() with valid options must succeed: the client emits a +// CONNECTION_CLOSE frame with the supplied transport error code, and +// the local `closed` promise rejects with the original error. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import diagnostics_channel from 'node:diagnostics_channel'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// `maxIdleTimeout` is measured in seconds. Set short so any regression +// that prevents CONNECTION_CLOSE from being sent fails promptly via +// idle close instead of hanging the test. +const transportParams = { maxIdleTimeout: 1 }; + +// Capture the server-side session in the listen callback. Do not +// `await serverSession.closed` from inside the callback: the final +// destroy in this test sends a transport-error CONNECTION_CLOSE which +// makes that promise reject, and an unhandled rejection inside the +// listen callback would be routed by `safeCallbackInvoke` to +// `endpoint.destroy(err)` and surface as a process-level +// unhandled-rejection crash before the test body has had a chance +// to attach its own rejection handler. +const serverSessionReady = Promise.withResolvers(); +let serverSession; +const serverEndpoint = await listen(mustCall((session) => { + serverSession = session; + serverSessionReady.resolve(); +}), { transportParams }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams, +}); +await clientSession.opened; +await serverSessionReady.promise; + +// Open a stream so the destroy cascade has work to do; if the +// validation hoist regresses and side effects run before the throw, +// this stream will be destroyed by the failed destroy() and the +// `mustNotCall` handler will fire. +const stream = await clientSession.createBidirectionalStream(); +stream.onerror = mustNotCall( + 'stream.onerror must not fire when destroy() throws on bad options'); + +// Subscribe to diagnostics channels so we can assert nothing is +// published before the validation throw. +const errSub = mustNotCall( + 'quic.session.error must not publish when destroy() throws on bad options'); +diagnostics_channel.subscribe('quic.session.error', errSub); + +clientSession.onerror = mustNotCall( + 'session.onerror must not fire when destroy() throws on bad options'); + +const goodError = new Error('intended teardown'); + +// 1. options is not an object -> throws ERR_INVALID_ARG_TYPE. +assert.throws(() => clientSession.destroy(goodError, 'not an object'), { + code: 'ERR_INVALID_ARG_TYPE', +}); +assert.strictEqual(clientSession.destroyed, false); +assert.strictEqual(stream.destroyed, false); + +// 2. options.code is the wrong type -> throws ERR_INVALID_ARG_TYPE. +assert.throws(() => clientSession.destroy(goodError, { code: 'oops' }), { + code: 'ERR_INVALID_ARG_TYPE', +}); +assert.strictEqual(clientSession.destroyed, false); +assert.strictEqual(stream.destroyed, false); + +// 3. options.type is not in the allowed set -> throws ERR_INVALID_ARG_VALUE. +assert.throws(() => clientSession.destroy(goodError, { type: 'bogus' }), { + code: 'ERR_INVALID_ARG_VALUE', +}); +assert.strictEqual(clientSession.destroyed, false); +assert.strictEqual(stream.destroyed, false); + +// 4. options.reason is the wrong type -> throws ERR_INVALID_ARG_TYPE. +assert.throws(() => clientSession.destroy(goodError, { reason: 42 }), { + code: 'ERR_INVALID_ARG_TYPE', +}); +assert.strictEqual(clientSession.destroyed, false); +assert.strictEqual(stream.destroyed, false); + +// Now switch the handlers to expect the real teardown so the final +// destroy with valid options can run cleanly. +diagnostics_channel.unsubscribe('quic.session.error', errSub); +clientSession.onerror = mustCall((err) => { assert.strictEqual(err, goodError); }); +stream.onerror = mustCall((err) => { assert.strictEqual(err, goodError); }); + +// Pre-attach rejection handlers on both sides BEFORE triggering the +// final destroy, so the rejections do not race ahead of any awaits in +// the test body. The client rejects with the original `goodError`; +// the server decodes the CONNECTION_CLOSE frame transport code into +// an `ERR_QUIC_TRANSPORT_ERROR`. +const clientClosedAssertion = assert.rejects(clientSession.closed, goodError); +const serverClosedAssertion = assert.rejects(serverSession.closed, mustCall((err) => { + assert.strictEqual(err.code, 'ERR_QUIC_TRANSPORT_ERROR'); + return true; +})); + +// 5. Valid options after the failed attempts -> session destroys +// normally, the underlying handle sends CONNECTION_CLOSE with the +// supplied transport code, and the local closed promise rejects +// with the original error. +clientSession.destroy(goodError, { + code: 1n, + type: 'transport', + reason: 'after validation throw', +}); +assert.strictEqual(clientSession.destroyed, true); +assert.strictEqual(stream.destroyed, true); + +await clientClosedAssertion; +await serverClosedAssertion; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-destroy.mjs b/test/parallel/test-quic-session-destroy.mjs new file mode 100644 index 000000000000..42e238d2d339 --- /dev/null +++ b/test/parallel/test-quic-session-destroy.mjs @@ -0,0 +1,101 @@ +// Flags: --experimental-quic --no-warnings + +// Test: session.destroy() forceful close. +// destroy() without error resolves the closed promise. +// destroy(error) rejects the closed promise with that error. +// destroy() works without a prior close() call. +// Note: destroy() is forceful and does not send CONNECTION_CLOSE. +// The server session remains alive until idle timeout unless we also +// destroy the server session explicitly. We use a short idle timeout +// to keep the tests fast, and destroy both sides in each section. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// Use a short idle timeout so the server session cleans up quickly +// after the client destroys without CONNECTION_CLOSE. +const transportParams = { maxIdleTimeout: 1 }; + +// ------------------------------------------------------------------- +// destroy() without error resolves the closed promise. +// ------------------------------------------------------------------- +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + serverDone.resolve(); + }), { transportParams }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams, + }); + await clientSession.opened; + + clientSession.destroy(); + assert.strictEqual(clientSession.destroyed, true); + + // Closed should resolve (no error). + await clientSession.closed; + + await serverDone.promise; + await serverEndpoint.close(); +} + +// ------------------------------------------------------------------- +// destroy(error) rejects closed with that error. +// ------------------------------------------------------------------- +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + serverDone.resolve(); + }), { transportParams }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams, + }); + await clientSession.opened; + + const testError = new Error('intentional destroy error'); + clientSession.destroy(testError); + assert.strictEqual(clientSession.destroyed, true); + + // Closed should reject with the same error. + await assert.rejects(clientSession.closed, testError); + + await serverDone.promise; + await serverEndpoint.close(); +} + +// ------------------------------------------------------------------- +// destroy() works without prior close(). +// ------------------------------------------------------------------- +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + serverDone.resolve(); + }), { transportParams }); + + const clientSession = await connect(serverEndpoint.address, { + transportParams, + }); + await clientSession.opened; + + // Destroy directly without calling close() first. + clientSession.destroy(); + assert.strictEqual(clientSession.destroyed, true); + await clientSession.closed; + + await serverDone.promise; + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-session-emit-ordering.mjs b/test/parallel/test-quic-session-emit-ordering.mjs new file mode 100644 index 000000000000..1b2d972ad7db --- /dev/null +++ b/test/parallel/test-quic-session-emit-ordering.mjs @@ -0,0 +1,46 @@ +// Flags: --experimental-quic --no-warnings --expose-internals + +// Check that server `onsession` emit fires only after the session's +// ClientHello has been processed & validated. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { createRequire } = await import('node:module'); +const require = createRequire(import.meta.url); +const { getQuicSessionState } = require('internal/quic/quic'); +const { listen, connect } = await import('../common/quic.mjs'); + +const sessionSeen = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + // All assertions run synchronously in the onsession emit frame. + + // The TLS details from the ClientHello are readable on the session. + assert.strictEqual(serverSession.servername, 'localhost'); + assert.strictEqual(serverSession.alpnProtocol, 'quic-test'); + + // The client's transport params arrived in the first flight and have + // been processed by the time the session is surfaced. + const params = serverSession.remoteTransportParams; + assert.notStrictEqual(params, undefined); + assert.notStrictEqual(params, null); + assert.ok(params.initialMaxStreamsBidi >= 0n); + + // ALPN negotiation has completed: headers support is resolved (2 = + // unsupported, confirming non-h3 test ALPN) + assert.strictEqual(getQuicSessionState(serverSession).headersSupported, 2); + + sessionSeen.resolve(); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; +await sessionSeen.promise; + +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-idle-timeout.mjs b/test/parallel/test-quic-session-idle-timeout.mjs new file mode 100644 index 000000000000..e55f9a0a16fd --- /dev/null +++ b/test/parallel/test-quic-session-idle-timeout.mjs @@ -0,0 +1,37 @@ +// Flags: --experimental-quic --no-warnings + +// Test: idle timeout closes the session. +// Both client and server are configured with a short maxIdleTimeout. +// After the handshake completes, neither side sends any data. The idle +// timeout fires and both sessions close without error. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const transportParams = { maxIdleTimeout: 1 }; // 1 second + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + // The server's closed promise should resolve when the idle timeout fires. + await serverSession.closed; + serverDone.resolve(); +}), { + transportParams, +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams, +}); + +await clientSession.opened; + +// Don't send anything. Just wait for the idle timeout to close the session. +await Promise.all([clientSession.closed, serverDone.promise]); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-initial-rtt.mjs b/test/parallel/test-quic-session-initial-rtt.mjs new file mode 100644 index 000000000000..ce24f804dd04 --- /dev/null +++ b/test/parallel/test-quic-session-initial-rtt.mjs @@ -0,0 +1,58 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: initialRtt session option is accepted and the session functions +// correctly with a custom initial RTT estimate. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const payload = encoder.encode('hello rtt'); +const serverDone = Promise.withResolvers(); + +// Use a low initialRtt (1ms) to simulate a low-latency environment. +// The session should complete successfully and the smoothed RTT in +// stats should converge to a value well below the default 333ms. +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const data = await bytes(stream); + assert.ok(data.byteLength > 0); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +}), { + initialRtt: 1, // 1ms +}); + +const clientSession = await connect(serverEndpoint.address, { + initialRtt: 1, // 1ms +}); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: payload, +}); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await stream.closed; +await serverDone.promise; + +// After data exchange, the smoothed RTT should have converged to a +// realistic value. On loopback it should be well under 10ms (10,000,000ns). +// The stat is in nanoseconds. +const smoothedRtt = clientSession.stats.smoothedRtt; +assert.ok(smoothedRtt > 0n, 'smoothedRtt should be non-zero after data exchange'); +assert.ok(smoothedRtt < 10_000_000n, + `smoothedRtt should be under 10ms on loopback, got ${smoothedRtt}ns`); + +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-opened-early-destroy.mjs b/test/parallel/test-quic-session-opened-early-destroy.mjs new file mode 100644 index 000000000000..08bb0dc29391 --- /dev/null +++ b/test/parallel/test-quic-session-opened-early-destroy.mjs @@ -0,0 +1,148 @@ +// Flags: --experimental-quic --no-warnings + +// Test: session.opened rejects when the session is destroyed before the +// TLS handshake completes. +// +// Per doc/api/quic.md: "If the handshake fails or the session is destroyed +// before the handshake completes, the promise will be rejected." +// +// Cases covered: +// 1. session.destroy() (no error) before handshake -> opened rejects +// with ERR_INVALID_STATE. +// 2. session.destroy(error) before handshake -> opened rejects with +// that error. +// 3. endpoint.destroy() while a client handshake is in flight -> +// session.opened rejects (the endpoint cascades destroy to its +// sessions). +// 4. session.destroy() AFTER opened has already resolved -> opened +// stays resolved (no late rejection). + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { QuicEndpoint } = await import('node:quic'); + +// Use a short idle timeout so any leftover server-side state cleans up +// quickly when the client tears down before the handshake completes. +const transportParams = { maxIdleTimeout: 1 }; + +// ------------------------------------------------------------------- +// 1. session.destroy() (no error) before handshake -> opened rejects +// with ERR_INVALID_STATE. +// ------------------------------------------------------------------- +{ + const serverEndpoint = await listen(() => { + // The server may or may not see this session before the client + // destroys; we don't await it here. + }, { transportParams }); + + const clientSession = await connect(serverEndpoint.address, { + verifyPeer: 'manual', + transportParams, + }); + + // Synchronously destroy the session before the handshake can finish. + // `connect()` returns the session as soon as the C++ handle is created; + // the handshake itself happens asynchronously over the network. + clientSession.destroy(); + + await assert.rejects(clientSession.opened, { + code: 'ERR_INVALID_STATE', + message: /destroyed before it opened/, + }); + + await serverEndpoint.close(); +} + +// ------------------------------------------------------------------- +// 2. session.destroy(error) before handshake -> opened rejects with +// that error. Setting `onerror` registers the session-level error +// handler and marks both `opened` and `closed` as handled, so we +// only need to assert the rejection on `opened`. +// ------------------------------------------------------------------- +{ + const serverEndpoint = await listen(mustNotCall, { transportParams }); + + const clientSession = await connect(serverEndpoint.address, { + verifyPeer: 'manual', + transportParams, + }); + + const testError = new Error('intentional early destroy'); + clientSession.onerror = mustCall((err) => { + assert.strictEqual(err, testError); + }); + clientSession.destroy(testError); + + await assert.rejects(clientSession.opened, testError); + + await serverEndpoint.close(); +} + +// ------------------------------------------------------------------- +// 3. endpoint.destroy() while a client handshake is in flight -> +// session.opened rejects. +// ------------------------------------------------------------------- +{ + const serverEndpoint = await listen(mustNotCall(), { transportParams }); + + // Use a dedicated client endpoint so destroying it does not affect + // the shared default endpoint used by other tests in this file. + const clientEndpoint = new QuicEndpoint(); + + const clientSession = await connect(serverEndpoint.address, { + verifyPeer: 'manual', + transportParams, + endpoint: clientEndpoint, + }); + + // Synchronously destroy the endpoint while the handshake is still + // in flight. The endpoint should cascade destroy() to its in-flight + // session, which should reject session.opened. + clientEndpoint.destroy(); + + await assert.rejects(clientSession.opened, { + code: 'ERR_INVALID_STATE', + message: /destroyed before it opened/, + }); + + await serverEndpoint.close(); +} + +// ------------------------------------------------------------------- +// 4. session.destroy() AFTER opened resolved -> opened stays resolved. +// Sanity check that the new "always reject pendingOpen" logic does +// not stomp on an already-resolved promise. +// ------------------------------------------------------------------- +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; + serverDone.resolve(); + }), { transportParams }); + + const clientSession = await connect(serverEndpoint.address, { + verifyPeer: 'manual', + transportParams, + }); + + const info = await clientSession.opened; + assert.strictEqual(typeof info.protocol, 'string'); + + clientSession.destroy(); + + // Awaiting opened a second time should still resolve to the same + // info object (PromiseWithResolvers caches it; we just assert the + // promise is not rejected). + const infoAgain = await clientSession.opened; + assert.strictEqual(infoAgain, info); + + await serverDone.promise; + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-session-opened-info.mjs b/test/parallel/test-quic-session-opened-info.mjs new file mode 100644 index 000000000000..dd7ddc8414e7 --- /dev/null +++ b/test/parallel/test-quic-session-opened-info.mjs @@ -0,0 +1,70 @@ +// Flags: --experimental-quic --no-warnings + +// Test: session.opened resolves with handshake info (INFO-05, INFO-06, +// INFO-07, INFO-08). +// local and remote SocketAddress objects are correct. +// servername matches the SNI sent by the client. +// protocol matches the negotiated ALPN. +// cipher and cipherVersion reflect the negotiated cipher suite. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + const info = await serverSession.opened; + + // Server sees its own local address and the client's remote. + assert.strictEqual(info.local.address, '127.0.0.1'); + assert.strictEqual(info.local.family, 'ipv4'); + assert.strictEqual(typeof info.local.port, 'number'); + assert.strictEqual(info.remote.address, '127.0.0.1'); + assert.strictEqual(info.remote.family, 'ipv4'); + assert.strictEqual(typeof info.remote.port, 'number'); + + // Local and remote ports should differ. + assert.notStrictEqual(info.local.port, info.remote.port); + + // Servername matches the SNI. + assert.strictEqual(info.servername, 'localhost'); + + // Protocol matches ALPN. + assert.strictEqual(info.protocol, 'quic-test'); + + // cipher info. + assert.strictEqual(typeof info.cipher, 'string'); + assert.ok(info.cipher.length > 0); + assert.strictEqual(info.cipherVersion, 'TLSv1.3'); + + serverSession.close(); + serverDone.resolve(); +})); + +const clientSession = await connect(serverEndpoint.address); +const clientInfo = await clientSession.opened; + +// Client sees its own local address and the server's remote. +assert.strictEqual(clientInfo.local.address, '127.0.0.1'); +assert.strictEqual(clientInfo.remote.address, '127.0.0.1'); +assert.notStrictEqual(clientInfo.local.port, clientInfo.remote.port); + +// servername matches. +assert.strictEqual(clientInfo.servername, 'localhost'); + +// Protocol matches ALPN. +assert.strictEqual(clientInfo.protocol, 'quic-test'); + +// cipher info. +assert.strictEqual(typeof clientInfo.cipher, 'string'); +assert.ok(clientInfo.cipher.length > 0); +assert.strictEqual(clientInfo.cipherVersion, 'TLSv1.3'); + +await Promise.all([serverDone.promise, clientSession.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-opened-validation.mjs b/test/parallel/test-quic-session-opened-validation.mjs new file mode 100644 index 000000000000..80ac959bd7f6 --- /dev/null +++ b/test/parallel/test-quic-session-opened-validation.mjs @@ -0,0 +1,43 @@ +// Flags: --experimental-quic --no-warnings + +// Test: opened info includes cert validation error details. +// validationErrorReason populated on cert validation failure. +// validationErrorCode populated on cert validation failure. +// The test helper uses self-signed certs so validation always fails +// (unless rejectUnauthorized is explicitly set). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + const serverInfo = await serverSession.opened; + + // Server also sees validation info about the peer. + assert.strictEqual(typeof serverInfo.validationErrorReason, 'string'); + assert.strictEqual(typeof serverInfo.validationErrorCode, 'string'); + + serverSession.close(); +})); + +const clientSession = await connect(serverEndpoint.address, { + verifyPeer: 'manual', +}); +const clientInfo = await clientSession.opened; + +// validationErrorReason is a non-empty string describing +// why the cert failed validation (self-signed cert). +assert.strictEqual(typeof clientInfo.validationErrorReason, 'string'); +assert.ok(clientInfo.validationErrorReason.length > 0); + +// validationErrorCode is the OpenSSL error code string. +assert.strictEqual(typeof clientInfo.validationErrorCode, 'string'); +assert.ok(clientInfo.validationErrorCode.length > 0); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-preferred-address-ignore.mjs b/test/parallel/test-quic-session-preferred-address-ignore.mjs new file mode 100644 index 000000000000..b4694963065c --- /dev/null +++ b/test/parallel/test-quic-session-preferred-address-ignore.mjs @@ -0,0 +1,67 @@ +// Flags: --experimental-quic --no-warnings + +// Test: Create two listening endpoints, one secondary and one +// preferred. Initiate a connection with the secondary, with +// preferred advertised. Client should ignore the preferred +// address and continue on with the original + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const allStatusDone = Promise.withResolvers(); +const serverGot = Promise.withResolvers(); +let statusCount = 0; + +const handleSession = mustCall(async (serverSession) => { + await allStatusDone.promise; + await serverGot.promise; + await serverSession.close(); +}); + +const sessionOptions = { + ondatagram: mustCall((data) => { + serverGot.resolve(); + }, 4), + onpathvalidation: mustNotCall(), +}; + +const preferredEndpoint = await listen(handleSession, sessionOptions); +const serverEndpoint = await listen(handleSession, { + ...sessionOptions, + transportParams: { + preferredAddressIpv4: preferredEndpoint.address, + } +}); + +const clientSession = await connect(serverEndpoint.address, { + // We don't want this endpoint to reuse either of the two listening endpoints. + reuseEndpoint: false, + preferredAddressPolicy: 'ignore', + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagramstatus: mustCall((id, status) => { + if (++statusCount >= 4) allStatusDone.resolve(); + }, 4), + onpathvalidation: mustNotCall(), +}); +await clientSession.opened; + +// Send datagrams. +await clientSession.sendDatagram(new Uint8Array([1])); +await clientSession.sendDatagram(new Uint8Array([2])); +await clientSession.sendDatagram(new Uint8Array([3])); +await clientSession.sendDatagram(new Uint8Array([4])); + +await Promise.all([serverGot.promise, allStatusDone.promise]); + +assert.strictEqual(clientSession.stats.datagramsSent, 4n); +assert.ok(clientSession.stats.datagramsAcknowledged >= 1n); + +await clientSession.closed; +await serverEndpoint.close(); +await preferredEndpoint.close(); diff --git a/test/parallel/test-quic-session-preferred-address-ipv6.mjs b/test/parallel/test-quic-session-preferred-address-ipv6.mjs new file mode 100644 index 000000000000..8c1d9c474ccf --- /dev/null +++ b/test/parallel/test-quic-session-preferred-address-ipv6.mjs @@ -0,0 +1,125 @@ +// Flags: --experimental-quic --no-warnings + +// Test: Create two listening ipv6 endpoints, one secondary and one +// preferred. Initiate a connection with the secondary, with +// preferred advertised. Client should automatically migrate +// to the preferred address without interupting data flow. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { createPrivateKey } = await import('node:crypto'); + +const allStatusDone = Promise.withResolvers(); +const serverGot = Promise.withResolvers(); +const serverPathValidated = Promise.withResolvers(); +let statusCount = 0; + +const handleSession = mustCall(async (serverSession) => { + await allStatusDone.promise; + await serverGot.promise; + await serverSession.close(); +}); + +function assertEqualAddress(addr1, addr2) { + assert.strictEqual(addr1.address, addr2.address); + assert.strictEqual(addr1.port, addr2.port); + assert.strictEqual(addr1.family, addr2.family); +} + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const sessionOptions = { + ondatagram: mustCall((data) => { + serverGot.resolve(); + }, 4), + onpathvalidation: mustCall((result, newLocal, newRemote, oldLocal, oldRemote, preferred) => { + // The status here can be 'success' or 'aborted' depending on timing. + // The 'aborted' status only means that path validation is no longer + // necessary for a number of reasons (usually ngtcp2 received a non-probing + // packet on the new path). + assert.notStrictEqual(result, 'failure'); + assertEqualAddress(newLocal, preferredEndpoint.address); + assertEqualAddress(oldLocal, serverEndpoint.address); + assertEqualAddress(newRemote, oldRemote); + // The preferred arg is only passed on client side + assert.strictEqual(preferred, undefined); + serverPathValidated.resolve(); + }), + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + endpoint: { + address: { + address: '::1', + family: 'ipv6', + }, + ipv6Only: true, + }, +}; + +const preferredEndpoint = await listen(handleSession, sessionOptions); +const serverEndpoint = await listen(handleSession, { + ...sessionOptions, + transportParams: { + preferredAddressIpv6: preferredEndpoint.address, + } +}); + +console.log(preferredEndpoint.address); +console.log(serverEndpoint.address); + +const clientSession = await connect(serverEndpoint.address, { + // We don't want this endpoint to reuse either of the two listening endpoints. + reuseEndpoint: false, + preferredAddressPolicy: 'use', + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagramstatus: mustCall((id, status) => { + if (++statusCount >= 4) allStatusDone.resolve(); + }, 4), + onpathvalidation: mustCall((result, newLocal, newRemote, oldLocal, oldRemote, preferred) => { + assert.strictEqual(result, 'success'); + assertEqualAddress(newLocal, clientSession.endpoint.address); + assertEqualAddress(newRemote, preferredEndpoint.address); + assert.strictEqual(oldLocal, null); + assert.strictEqual(oldRemote, null); + assert.strictEqual(preferred, true); + }), + endpoint: { + address: { + address: '::', + family: 'ipv6', + }, + }, + maxDatagramSendAttempts: 100, // While the connection is restablished, + // all the acknowledgement packets of ngtcp2 are counted as send attempts + // so either this or a delay, or a change in ngtcp2 interfaces +}); +await clientSession.opened; + +// Send two datagrams. +await clientSession.sendDatagram(new Uint8Array([1])); +await clientSession.sendDatagram(new Uint8Array([2])); + +await serverPathValidated.promise; + +// Send more datagrams after the preferred address migration completes +// To show that data is still flowing after we close the original +// endpoint. +await clientSession.sendDatagram(new Uint8Array([3])); +await clientSession.sendDatagram(new Uint8Array([4])); + +await Promise.all([serverGot.promise, allStatusDone.promise]); + +assert.strictEqual(clientSession.stats.datagramsSent, 4n); +assert.ok(clientSession.stats.datagramsAcknowledged >= 1n); + +await clientSession.closed; +await serverEndpoint.close(); +await preferredEndpoint.close(); diff --git a/test/parallel/test-quic-session-preferred-address.mjs b/test/parallel/test-quic-session-preferred-address.mjs new file mode 100644 index 000000000000..92194cf42a87 --- /dev/null +++ b/test/parallel/test-quic-session-preferred-address.mjs @@ -0,0 +1,104 @@ +// Flags: --experimental-quic --no-warnings + +// Test: preferred address migration. +// Two server endpoints: one initial, one preferred. The server +// advertises the preferred endpoint's address in transport params. +// After the handshake, the client migrates to the preferred address +// via path validation. Datagrams sent before migration take the +// original path; datagrams sent after take the preferred path. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const allStatusDone = Promise.withResolvers(); +const serverGot = Promise.withResolvers(); +const serverPathValidated = Promise.withResolvers(); +let statusCount = 0; + +const handleSession = mustCall(async (serverSession) => { + await allStatusDone.promise; + await serverGot.promise; + await serverSession.close(); +}); + +function assertEqualAddress(addr1, addr2) { + assert.strictEqual(addr1.address, addr2.address); + assert.strictEqual(addr1.port, addr2.port); + assert.strictEqual(addr1.family, addr2.family); +} + +const sessionOptions = { + ondatagram: mustCall((data) => { + serverGot.resolve(); + }, 4), + onpathvalidation: mustCall((result, newLocal, newRemote, oldLocal, oldRemote, preferred) => { + // The status here can be 'success' or 'aborted' depending on timing. + // The 'aborted' status only means that path validation is no longer + // necessary for a number of reasons (usually ngtcp2 received a non-probing + // packet on the new path). + assert.notStrictEqual(result, 'failure'); + assertEqualAddress(newLocal, preferredEndpoint.address); + assertEqualAddress(oldLocal, serverEndpoint.address); + assertEqualAddress(newRemote, oldRemote); + // The preferred arg is only passed on client side + assert.strictEqual(preferred, undefined); + serverPathValidated.resolve(); + }), +}; + +const preferredEndpoint = await listen(handleSession, sessionOptions); +const serverEndpoint = await listen(handleSession, { + ...sessionOptions, + transportParams: { + preferredAddressIpv4: preferredEndpoint.address, + } +}); + +const clientSession = await connect(serverEndpoint.address, { + // We don't want this endpoint to reuse either of the two listening endpoints. + reuseEndpoint: false, + preferredAddressPolicy: 'use', + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagramstatus: mustCall((id, status) => { + if (++statusCount >= 4) allStatusDone.resolve(); + }, 4), + onpathvalidation: mustCall((result, newLocal, newRemote, oldLocal, oldRemote, preferred) => { + assert.strictEqual(result, 'success'); + assertEqualAddress(newLocal, clientSession.endpoint.address); + assertEqualAddress(newRemote, preferredEndpoint.address); + assert.strictEqual(oldLocal, null); + assert.strictEqual(oldRemote, null); + assert.strictEqual(preferred, true); + }), + maxDatagramSendAttempts: 100, // While the connection is restablished, + // all the acknowledgement packets of ngtcp2 are counted as send attempts + // so either this or a delay, or a change in ngtcp2 interfaces +}); +await clientSession.opened; + +// Send two datagrams. +await clientSession.sendDatagram(new Uint8Array([1])); +await clientSession.sendDatagram(new Uint8Array([2])); + +await serverPathValidated.promise; + +// Send more datagrams after the preferred address migration completes +// To show that data is still flowing after we close the original +// endpoint. +await clientSession.sendDatagram(new Uint8Array([3])); +await clientSession.sendDatagram(new Uint8Array([4])); + +await Promise.all([serverGot.promise, allStatusDone.promise]); + +assert.strictEqual(clientSession.stats.datagramsSent, 4n); +assert.ok(clientSession.stats.datagramsAcknowledged >= 1n); + +await clientSession.closed; +await serverEndpoint.close(); +await preferredEndpoint.close(); diff --git a/test/parallel/test-quic-session-properties.mjs b/test/parallel/test-quic-session-properties.mjs new file mode 100644 index 000000000000..8d757303e966 --- /dev/null +++ b/test/parallel/test-quic-session-properties.mjs @@ -0,0 +1,101 @@ +// Flags: --experimental-quic --no-warnings + +// Test: session properties (PATH-03, PATH-06, PATH-07, PATH-08, +// CERT-01, CERT-02, CERT-03, CERT-04, CERT-05). +// PATH-03/06: session.path returns { local, remote } with addresses. +// session.path is cached (same object on second access). +// session.path returns undefined after destroy. +// session.certificate returns own cert object. +// session.peerCertificate returns peer cert. +// session.ephemeralKeyInfo returns key info on client. +// All three cached. +// All three return undefined after destroy. + +import { hasQuic, skip, mustCall, hasCrypto } from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import assert from 'node:assert'; + +if (!hasCrypto) + skip('missing crypto'); + +const { X509Certificate } = await import('node:crypto'); + +// The QUIC test helpers configure both sides with the agent1 fixture cert, +const expectedCert = new X509Certificate(fixtures.readKey('agent1-cert.pem')); + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + + // PATH-03/06: Server path has local and remote. + const path = serverSession.path; + assert.ok(path); + assert.ok(path.local); + assert.ok(path.remote); + + // Cached. + assert.strictEqual(serverSession.path, path); + + // Own certificate. + const cert = serverSession.certificate; + assert.ok(cert instanceof X509Certificate); + assert.strictEqual(cert.subject, expectedCert.subject); + assert.strictEqual(cert.issuer, expectedCert.issuer); + assert.strictEqual(cert.fingerprint256, expectedCert.fingerprint256); + + // Peer certificate (client's cert — not set in this + // test since we don't use verifyClient, so it's undefined). + assert.strictEqual(serverSession.peerCertificate, undefined); + + // Cached. + assert.strictEqual(serverSession.certificate, cert); + + await serverSession.close(); + serverDone.resolve(); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// PATH-03/06: Client path. +const path = clientSession.path; +assert.ok(path); +assert.ok(path.local); +assert.ok(path.remote); + +// Cached. +assert.strictEqual(clientSession.path, path); + +// Peer certificate (server's cert). +const peerCert = clientSession.peerCertificate; +assert.ok(peerCert instanceof X509Certificate); +assert.strictEqual(peerCert.subject, expectedCert.subject); +assert.strictEqual(peerCert.issuer, expectedCert.issuer); +assert.strictEqual(peerCert.fingerprint256, expectedCert.fingerprint256); + +// Ephemeral key info (client only). +const keyInfo = clientSession.ephemeralKeyInfo; +assert.ok(keyInfo); + +// Cached. +assert.strictEqual(clientSession.peerCertificate, peerCert); +assert.strictEqual(clientSession.ephemeralKeyInfo, keyInfo); + +await Promise.all([clientSession.closed, serverDone.promise]); + +// Returns undefined after destroy. +assert.strictEqual(clientSession.path, undefined); + +// Returns undefined after destroy. +assert.strictEqual(clientSession.certificate, undefined); +assert.strictEqual(clientSession.peerCertificate, undefined); +assert.strictEqual(clientSession.ephemeralKeyInfo, undefined); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-stats-datagram.mjs b/test/parallel/test-quic-session-stats-datagram.mjs new file mode 100644 index 000000000000..621fb37bd02f --- /dev/null +++ b/test/parallel/test-quic-session-stats-datagram.mjs @@ -0,0 +1,56 @@ +// Flags: --experimental-quic --no-warnings + +// Test: session datagram stats counters. +// After sending datagrams, the session stats should reflect +// datagramsSent, datagramsReceived, and datagramsAcknowledged. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const allStatusDone = Promise.withResolvers(); +const serverGot = Promise.withResolvers(); +let statusCount = 0; + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + // Wait for the client to receive all status updates before closing. + // The server must stay alive long enough to ACK the datagrams. + await allStatusDone.promise; + + // Server received datagrams. + assert.ok(serverSession.stats.datagramsReceived > 0n); + + serverSession.close(); + await serverSession.closed; +}), { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagram: mustCall((data) => { + serverGot.resolve(); + }, 2), +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, + ondatagramstatus(id, status) { + if (++statusCount >= 2) allStatusDone.resolve(); + }, +}); +await clientSession.opened; + +// Send two datagrams. +await clientSession.sendDatagram(new Uint8Array([1])); +await clientSession.sendDatagram(new Uint8Array([2])); + +await Promise.all([serverGot.promise, allStatusDone.promise]); + +// Client sent datagrams. +assert.strictEqual(clientSession.stats.datagramsSent, 2n); +assert.ok(clientSession.stats.datagramsAcknowledged >= 1n); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-stats-detailed.mjs b/test/parallel/test-quic-session-stats-detailed.mjs new file mode 100644 index 000000000000..58d769924ec0 --- /dev/null +++ b/test/parallel/test-quic-session-stats-detailed.mjs @@ -0,0 +1,63 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: detailed session stats. +// RTT fields populated after data transfer. +// cwnd, bytesInFlight populated under load. +// V2 fields (pktSent, pktReceived, etc.) populated. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + await bytes(stream); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Send enough data to generate meaningful stats. +const data = new Uint8Array(8192); +const stream = await clientSession.createBidirectionalStream(); +stream.setBody(data); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); + +const stats = clientSession.stats; + +// RTT fields populated. +assert.ok(stats.smoothedRtt >= 0n, 'smoothedRtt should be >= 0'); +assert.ok(stats.latestRtt >= 0n, 'latestRtt should be >= 0'); +assert.ok(stats.minRtt >= 0n, 'minRtt should be >= 0'); +assert.strictEqual(typeof stats.rttVar, 'bigint'); + +// Congestion fields. +assert.ok(stats.cwnd > 0n, 'cwnd should be > 0'); +assert.strictEqual(typeof stats.bytesInFlight, 'bigint'); +assert.strictEqual(typeof stats.ssthresh, 'bigint'); + +// V2 packet/byte fields. +assert.ok(stats.pktSent > 0n, 'pktSent should be > 0'); +assert.ok(stats.pktRecv > 0n, 'pktRecv should be > 0'); +assert.strictEqual(typeof stats.pktLost, 'bigint'); +assert.ok(stats.bytesSent > 0n, 'bytesSent should be > 0'); +assert.ok(stats.bytesRecv > 0n, 'bytesRecv should be > 0'); +assert.strictEqual(typeof stats.bytesLost, 'bigint'); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-stats.mjs b/test/parallel/test-quic-session-stats.mjs new file mode 100644 index 000000000000..b1a6c5aa7f75 --- /dev/null +++ b/test/parallel/test-quic-session-stats.mjs @@ -0,0 +1,70 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: session stats increment with data transfer and track streams +// bytesReceived/bytesSent increment after data transfer. +// bidiInStreamCount/bidiOutStreamCount track streams. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const payload = encoder.encode('hello stats world'); +const payloadLength = payload.byteLength; +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const data = await bytes(stream); + assert.strictEqual(data.byteLength, payloadLength); + stream.writer.endSync(); + await stream.closed; + + // Server sees one inbound bidi stream. + assert.strictEqual(serverSession.stats.bidiInStreamCount, 1n); + assert.strictEqual(serverSession.stats.bidiOutStreamCount, 0n); + + // Server received data bytes. + assert.ok(serverSession.stats.bytesReceived > 0n); + assert.ok(serverSession.stats.bytesSent > 0n); + + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Before sending, bytes should be from handshake only. +const bytesSentBefore = clientSession.stats.bytesSent; +assert.ok(bytesSentBefore > 0n, 'handshake bytes should be counted'); + +const stream = await clientSession.createBidirectionalStream({ + body: payload, +}); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await stream.closed; +await serverDone.promise; + +// After sending, bytesSent should have increased. +assert.ok(clientSession.stats.bytesSent > bytesSentBefore, + 'bytesSent should increase after data transfer'); +assert.ok(clientSession.stats.bytesReceived > 0n); + +// Client opened one outbound bidi stream. +assert.strictEqual(clientSession.stats.bidiOutStreamCount, 1n); +assert.strictEqual(clientSession.stats.bidiInStreamCount, 0n); + +// Verify RTT fields are populated (connection was active). +assert.ok(clientSession.stats.smoothedRtt > 0n); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-stream-lifecycle.mjs b/test/parallel/test-quic-session-stream-lifecycle.mjs index dcd9fa9987ea..3c24810bd9a6 100644 --- a/test/parallel/test-quic-session-stream-lifecycle.mjs +++ b/test/parallel/test-quic-session-stream-lifecycle.mjs @@ -16,23 +16,21 @@ const keys = createPrivateKey(fixtures.readKey('agent1-key.pem')); const certs = fixtures.readKey('agent1-cert.pem'); const serverDone = Promise.withResolvers(); -const clientDone = Promise.withResolvers(); // Create a server endpoint -const serverEndpoint = await quic.listen(mustCall((serverSession) => { - serverSession.opened.then((info) => { - assert.ok(serverSession.endpoint !== null); - assert.strictEqual(serverSession.destroyed, false); - - const stats = serverSession.stats; - assert.strictEqual(stats.isConnected, true); - assert.ok(stats.handshakeCompletedAt > 0n); - assert.ok(stats.handshakeConfirmedAt > 0n); - assert.strictEqual(stats.closingAt, 0n); - - serverDone.resolve(); - serverSession.close(); - }).then(mustCall()); +const serverEndpoint = await quic.listen(mustCall(async (serverSession) => { + await serverSession.opened; + assert.ok(serverSession.endpoint !== null); + assert.strictEqual(serverSession.destroyed, false); + + const stats = serverSession.stats; + assert.strictEqual(stats.isConnected, true); + assert.ok(stats.handshakeCompletedAt > 0n); + assert.ok(stats.handshakeConfirmedAt > 0n); + assert.strictEqual(stats.closingAt, 0n); + + serverDone.resolve(); + serverSession.close(); }), { sni: { '*': { keys, certs } } }); assert.strictEqual(serverEndpoint.busy, false); @@ -51,28 +49,27 @@ assert.strictEqual(epStats.isConnected, true); assert.ok(epStats.createdAt > 0n); // Connect with a client -const clientSession = await quic.connect(serverEndpoint.address); +const clientSession = await quic.connect(serverEndpoint.address, { + verifyPeer: 'manual', +}); assert.strictEqual(clientSession.destroyed, false); assert.ok(clientSession.endpoint !== null); assert.strictEqual(clientSession.stats.isConnected, true); -clientSession.opened.then((clientInfo) => { - assert.strictEqual(clientInfo.servername, 'localhost'); - assert.strictEqual(clientInfo.protocol, 'h3'); - assert.strictEqual(clientInfo.cipherVersion, 'TLSv1.3'); - assert.ok(clientInfo.local !== undefined); - assert.ok(clientInfo.remote !== undefined); +const clientInfo = await clientSession.opened; +assert.strictEqual(clientInfo.servername, 'localhost'); +assert.strictEqual(clientInfo.protocol, 'h3'); +assert.strictEqual(clientInfo.cipherVersion, 'TLSv1.3'); +assert.ok(clientInfo.local !== undefined); +assert.ok(clientInfo.remote !== undefined); - const cStats = clientSession.stats; - assert.strictEqual(cStats.isConnected, true); - assert.ok(cStats.handshakeCompletedAt > 0n); - assert.ok(cStats.bytesSent > 0n, 'Expected bytesSent > 0 after handshake'); +const cStats = clientSession.stats; +assert.strictEqual(cStats.isConnected, true); +assert.ok(cStats.handshakeCompletedAt > 0n); +assert.ok(cStats.bytesSent > 0n, 'Expected bytesSent > 0 after handshake'); - clientDone.resolve(); -}).then(mustCall()); - -await Promise.all([serverDone.promise, clientDone.promise]); +await serverDone.promise; // Open a bidirectional stream. const stream = await clientSession.createBidirectionalStream(); @@ -84,15 +81,19 @@ assert.ok(stream.id !== null, 'Non-pending stream should have an id'); assert.strictEqual(typeof stream.id, 'bigint'); assert.strictEqual(stream.pending, false); assert.strictEqual(stream.stats.isConnected, true); -assert.ok(stream.readable instanceof ReadableStream); // Destroying the session should destroy it and the stream, and clear its properties. clientSession.destroy(); assert.strictEqual(clientSession.destroyed, true); assert.strictEqual(clientSession.endpoint, null); assert.strictEqual(clientSession.stats.isConnected, false); +assert.strictEqual(typeof clientSession.stats.cwnd, 'bigint'); +assert.strictEqual(typeof clientSession.stats.streamsIdleTimedOut, 'bigint'); assert.strictEqual(stream.destroyed, true); -assert.strictEqual(stream.session, null); -assert.strictEqual(stream.id, null); -assert.strictEqual(stream.direction, null); + +// The stream id and direction should still be available after destruction +assert.strictEqual(stream.id, 0n); +assert.strictEqual(stream.direction, 'bidi'); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-transport-params.mjs b/test/parallel/test-quic-session-transport-params.mjs new file mode 100644 index 000000000000..6fd92419196f --- /dev/null +++ b/test/parallel/test-quic-session-transport-params.mjs @@ -0,0 +1,137 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: session.localTransportParams and session.remoteTransportParams +// Verifies that local transport params are available immediately after +// session creation, remote transport params are available after the +// handshake completes, and values match what was configured. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverTransportParams = { + initialMaxStreamsBidi: 200, + initialMaxData: 2 * 1024 * 1024, +}; + +const clientTransportParams = { + initialMaxStreamsBidi: 500, + initialMaxData: 8 * 1024 * 1024, +}; + +const serverDone = Promise.withResolvers(); +let serverLocalParams; +let serverRemoteParams; + +const serverEndpoint = await listen(mustCall((serverSession) => { + // localTransportParams should be available immediately. + serverLocalParams = serverSession.localTransportParams; + assert.ok(serverLocalParams != null, 'server localTransportParams should be available immediately'); + assert.strictEqual(typeof serverLocalParams, 'object'); + assert.strictEqual(Object.getPrototypeOf(serverLocalParams), null); + + // Verify server's configured values are reflected. + assert.strictEqual(serverLocalParams.initialMaxStreamsBidi, + BigInt(serverTransportParams.initialMaxStreamsBidi)); + assert.strictEqual(serverLocalParams.initialMaxData, + BigInt(serverTransportParams.initialMaxData)); + + // Verify defaults are present and reasonable. + assert.ok(serverLocalParams.activeConnectionIDLimit > 0n, + 'activeConnectionIDLimit should be positive'); + assert.ok(serverLocalParams.ackDelayExponent > 0n, + 'ackDelayExponent should be positive'); + assert.ok(serverLocalParams.maxAckDelay > 0n, + 'maxAckDelay should be positive'); + assert.strictEqual(serverLocalParams.disableActiveMigration, false); + + serverSession.onstream = mustCall(async (stream) => { + // After the stream arrives, the handshake is complete and + // remoteTransportParams should be available. + serverRemoteParams = serverSession.remoteTransportParams; + assert.ok(serverRemoteParams != null, + 'server remoteTransportParams should be available after handshake'); + assert.strictEqual(typeof serverRemoteParams, 'object'); + assert.strictEqual(Object.getPrototypeOf(serverRemoteParams), null); + + // Remote params should reflect the client's configured values. + assert.strictEqual(serverRemoteParams.initialMaxStreamsBidi, + BigInt(clientTransportParams.initialMaxStreamsBidi)); + assert.strictEqual(serverRemoteParams.initialMaxData, + BigInt(clientTransportParams.initialMaxData)); + + // CID fields should be present. + assert.strictEqual(typeof serverRemoteParams.initialSCID, 'string'); + assert.ok(serverRemoteParams.initialSCID.length > 0, + 'remote initialSCID should be non-empty'); + + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +}), { + transportParams: serverTransportParams, +}); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: clientTransportParams, +}); +await clientSession.opened; + +// After opened, the handshake is complete. Both local and remote +// transport params should be available on the client session. +const clientLocalParams = clientSession.localTransportParams; +assert.ok(clientLocalParams != null, 'client localTransportParams should be available'); +assert.strictEqual(typeof clientLocalParams, 'object'); +assert.strictEqual(Object.getPrototypeOf(clientLocalParams), null); + +// Verify client's configured values. +assert.strictEqual(clientLocalParams.initialMaxStreamsBidi, + BigInt(clientTransportParams.initialMaxStreamsBidi)); +assert.strictEqual(clientLocalParams.initialMaxData, + BigInt(clientTransportParams.initialMaxData)); + +const clientRemoteParams = clientSession.remoteTransportParams; +assert.ok(clientRemoteParams != null, + 'client remoteTransportParams should be available after handshake'); +assert.strictEqual(typeof clientRemoteParams, 'object'); +assert.strictEqual(Object.getPrototypeOf(clientRemoteParams), null); + +// Remote params should reflect the server's configured values. +assert.strictEqual(clientRemoteParams.initialMaxStreamsBidi, + BigInt(serverTransportParams.initialMaxStreamsBidi)); +assert.strictEqual(clientRemoteParams.initialMaxData, + BigInt(serverTransportParams.initialMaxData)); + +// CID fields should be present on the client's view of server params. +assert.strictEqual(typeof clientRemoteParams.initialSCID, 'string'); +assert.ok(clientRemoteParams.initialSCID.length > 0, + 'remote initialSCID should be non-empty'); + +// Cross-validation: server's remote matches client's local and vice versa. +const stream = await clientSession.createBidirectionalStream(); +stream.writer.endSync(); + +// eslint-disable-next-line no-unused-vars +for await (const _ of stream) { /* drain */ } +await stream.closed; +await serverDone.promise; + +// Cross-validate after both sides have captured params. +assert.strictEqual(serverRemoteParams.initialMaxStreamsBidi, + clientLocalParams.initialMaxStreamsBidi); +assert.strictEqual(serverRemoteParams.initialMaxData, + clientLocalParams.initialMaxData); +assert.strictEqual(clientRemoteParams.initialMaxStreamsBidi, + serverLocalParams.initialMaxStreamsBidi); +assert.strictEqual(clientRemoteParams.initialMaxData, + serverLocalParams.initialMaxData); + +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-session-unobserved-error-close.mjs b/test/parallel/test-quic-session-unobserved-error-close.mjs new file mode 100644 index 000000000000..c0440766aaaa --- /dev/null +++ b/test/parallel/test-quic-session-unobserved-error-close.mjs @@ -0,0 +1,47 @@ +// Flags: --experimental-quic --no-warnings + +// Regression test: destroying a session with an error while its `closed` +// promise is not being observed must NOT surface as an unhandled rejection. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import { subscribe, unsubscribe } from 'node:diagnostics_channel'; +import { setImmediate as tick } from 'node:timers/promises'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// Any unhandled rejection - e.g. an unobserved `closed` rejecting - fails. +process.on('unhandledRejection', mustNotCall('unexpected unhandled rejection')); + +// We use the diagnostics channel to observe the error close without actually +// observing session.closed (not listening is the whole point of the test): +const serverErrored = Promise.withResolvers(); +function onSessionError() { + unsubscribe('quic.session.error', onSessionError); + serverErrored.resolve(); +} +subscribe('quic.session.error', onSessionError); + +// The server session callback is left deliberately empty, so no response +// is sent and closed remains unobserved: +const serverEndpoint = await listen(mustCall()); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Finish handshake before close: +await tick(); + +// Cleanly close from the client with an error code, so the server +// receives a peer error close: +await clientSession.close({ code: 1 }); + +// Wait until the server has processed the error close, plus another tick +// to ensure unobserved promise rejection doesn't fire anywhere: +await serverErrored.promise; +await tick(); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-shared-endpoint-stream-close.mjs b/test/parallel/test-quic-shared-endpoint-stream-close.mjs new file mode 100644 index 000000000000..19e530e50b9e --- /dev/null +++ b/test/parallel/test-quic-shared-endpoint-stream-close.mjs @@ -0,0 +1,94 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Regression test: when a client QuicEndpoint has a session terminated +// by a stateless reset, subsequent sessions on the same endpoint must +// be able to complete their stream close handshake. +// Without the fix, the server-side stream.closed for session 2 never +// resolves and the test hangs. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); +const { QuicEndpoint } = await import('node:quic'); + +const encoder = new TextEncoder(); + +let sessionCount = 0; +const serverDone1 = Promise.withResolvers(); +const serverDone2 = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + sessionCount++; + const which = sessionCount; + + serverSession.onstream = mustCall(async (stream) => { + const data = await bytes(stream); + assert.ok(data.byteLength > 0); + stream.writer.endSync(); + // For session 2 this hangs when the bug is present — the server + // never receives the client's ACK for its FIN. + await stream.closed; + + if (which === 1) serverSession.destroy(); + (which === 1 ? serverDone1 : serverDone2).resolve(); + }); +}, 2), { + onerror(err) { /* marks promises as handled */ }, +}); + +// Both sessions share one endpoint — same source UDP address. +const clientEndpoint = new QuicEndpoint(); + +// Session 1: complete a full round-trip, then the server destroys +// without sending CONNECTION_CLOSE. The client sends a packet to the +// now-unknown DCID, which causes the server to send a stateless reset. +// The client receives the stateless reset and closes session 1. +const client1 = await connect(serverEndpoint.address, { + endpoint: clientEndpoint, + verifyPeer: 'manual', + onerror: mustCall((err) => { assert.ok(err); }), +}); +await client1.opened; + +const s1 = await client1.createBidirectionalStream({ + body: encoder.encode('session1'), +}); +for await (const _ of s1) { /* drain */ } // eslint-disable-line no-unused-vars +await s1.closed; + +await serverDone1.promise; + +// Trigger the stateless reset. +// eslint-disable-next-line no-unused-vars +const s1b = await client1.createBidirectionalStream({ + body: encoder.encode('trigger'), +}); +await assert.rejects(client1.closed, { code: 'ERR_QUIC_TRANSPORT_ERROR' }); + +// Session 2: uses the same endpoint as session 1. The bug manifests +// as serverDone2 never resolving because the server's stream.closed +// for session 2 hangs. +const client2 = await connect(serverEndpoint.address, { + endpoint: clientEndpoint, + verifyPeer: 'manual', + onerror(err) { /* marks promises as handled */ }, +}); +await client2.opened; + +const s2 = await client2.createBidirectionalStream({ + body: encoder.encode('session2'), +}); +for await (const _ of s2) { /* drain */ } // eslint-disable-line no-unused-vars +await s2.closed; + +// If the bug is present, this never resolves and the test hangs. +await serverDone2.promise; + +await serverEndpoint.close(); +await clientEndpoint.close(); diff --git a/test/parallel/test-quic-sni-mismatch.mjs b/test/parallel/test-quic-sni-mismatch.mjs new file mode 100644 index 000000000000..cfbdcdb8578c --- /dev/null +++ b/test/parallel/test-quic-sni-mismatch.mjs @@ -0,0 +1,53 @@ +// Flags: --experimental-quic --no-warnings + +// Test: SNI mismatch. +// Client connects with a servername that doesn't match any SNI entry +// and no wildcard is configured. The handshake should fail with a +// TLS alert (unrecognized_name). + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +// Server only has an entry for 'specific.example.com', no wildcard. +// Connections to any other hostname will be rejected at the TLS level. +// The handshake fails while the server processes the client's first +// flight, so the session is never surfaced to JS. +const serverEndpoint = await listen( + mustNotCall('server session must not be surfaced for a failed handshake'), + { + sni: { 'specific.example.com': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + transportParams: { maxIdleTimeout: 1 }, + }); + +// Client connects with a different servername — no matching identity. +const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + servername: 'wrong.example.com', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 1 }, + onerror: mustCall((err) => { + assert.strictEqual(err.code, 'ERR_QUIC_TRANSPORT_ERROR'); + }), +}); + +await assert.rejects(clientSession.opened, { + code: 'ERR_QUIC_TRANSPORT_ERROR', +}); + +await assert.rejects(clientSession.closed, { + code: 'ERR_QUIC_TRANSPORT_ERROR', +}); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-sni-multi-entry.mjs b/test/parallel/test-quic-sni-multi-entry.mjs new file mode 100644 index 000000000000..9e38fe83cc2c --- /dev/null +++ b/test/parallel/test-quic-sni-multi-entry.mjs @@ -0,0 +1,81 @@ +// Flags: --experimental-quic --no-warnings + +// Test: SNI with multiple entries. +// Server has 3+ SNI entries. Different servername values should +// negotiate successfully using the correct identity. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key1 = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert1 = fixtures.readKey('agent1-cert.pem'); +const key2 = createPrivateKey(fixtures.readKey('agent2-key.pem')); +const cert2 = fixtures.readKey('agent2-cert.pem'); +const key3 = createPrivateKey(fixtures.readKey('agent3-key.pem')); +const cert3 = fixtures.readKey('agent3-cert.pem'); + +let sessionCount = 0; +const allDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + const info = await serverSession.opened; + // Each client should negotiate with the correct servername. + assert.strictEqual(typeof info.servername, 'string'); + serverSession.close(); + await serverSession.closed; + if (++sessionCount === 3) allDone.resolve(); +}, 3), { + sni: { + 'host1.example.com': { keys: [key1], certs: [cert1] }, + 'host2.example.com': { keys: [key2], certs: [cert2] }, + '*': { keys: [key3], certs: [cert3] }, + }, + alpn: ['quic-test'], +}); + +// Client 1: connects with servername 'host1.example.com'. +{ + const cs = await connect(serverEndpoint.address, { + servername: 'host1.example.com', + verifyPeer: 'manual', + alpn: 'quic-test', + }); + const info = await cs.opened; + assert.strictEqual(info.servername, 'host1.example.com'); + await cs.closed; +} + +// Client 2: connects with servername 'host2.example.com'. +{ + const cs = await connect(serverEndpoint.address, { + servername: 'host2.example.com', + verifyPeer: 'manual', + alpn: 'quic-test', + }); + const info = await cs.opened; + assert.strictEqual(info.servername, 'host2.example.com'); + await cs.closed; +} + +// Client 3: connects with servername 'unknown.example.com' → wildcard. +{ + const cs = await connect(serverEndpoint.address, { + servername: 'unknown.example.com', + verifyPeer: 'manual', + alpn: 'quic-test', + }); + const info = await cs.opened; + assert.strictEqual(info.servername, 'unknown.example.com'); + await cs.closed; +} + +await allDone.promise; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-sni-setcontexts.mjs b/test/parallel/test-quic-sni-setcontexts.mjs new file mode 100644 index 000000000000..56200bd192ed --- /dev/null +++ b/test/parallel/test-quic-sni-setcontexts.mjs @@ -0,0 +1,71 @@ +// Flags: --experimental-quic --no-warnings + +// Test: setSNIContexts hot-swap and options. +// setSNIContexts() updates TLS identities at runtime. +// setSNIContexts() with replace: true replaces all entries. +// setSNIContexts() with replace: false merges new entries. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect, QuicEndpoint } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key1 = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert1 = fixtures.readKey('agent1-cert.pem'); +const key2 = createPrivateKey(fixtures.readKey('agent2-key.pem')); +const cert2 = fixtures.readKey('agent2-cert.pem'); + +const endpoint = new QuicEndpoint(); + +// Start with agent1 cert for all hosts. +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + serverSession.close(); + await serverSession.closed; +}, 2), { + endpoint, + sni: { '*': { keys: [key1], certs: [cert1] } }, + alpn: ['quic-test'], + transportParams: { maxIdleTimeout: 2 }, +}); + +// First connection uses agent1 cert. +{ + const cs = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 2 }, + }); + const info = await cs.opened; + assert.strictEqual(info.servername, 'localhost'); + await cs.closed; +} + +endpoint.setSNIContexts( + { '*': { keys: [key2], certs: [cert2] } }, + { replace: true }, +); + +// Second connection should use agent2 cert. +{ + const cs = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 2 }, + }); + const info = await cs.opened; + assert.strictEqual(info.servername, 'localhost'); + // The cert changed — we can verify by checking the connection succeeded + // (if the old cert was still used and the new one was expected, the + // handshake would still succeed since both are self-signed and + // rejectUnauthorized defaults to false in the test helper). + await cs.closed; +} + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-sni.mjs b/test/parallel/test-quic-sni.mjs index b2fe9968eee7..4f6e54260a6f 100644 --- a/test/parallel/test-quic-sni.mjs +++ b/test/parallel/test-quic-sni.mjs @@ -18,16 +18,11 @@ const sniKey = createPrivateKey(fixtures.readKey('agent2-key.pem')); const sniCert = fixtures.readKey('agent2-cert.pem'); // Server with SNI: default ('*') uses agent1, 'localhost' uses agent2. -const serverOpened = Promise.withResolvers(); -const clientOpened = Promise.withResolvers(); - -const serverEndpoint = await listen(mustCall((serverSession) => { - serverSession.opened.then((info) => { - // The server should see the client's requested servername. - assert.strictEqual(info.servername, 'localhost'); - serverOpened.resolve(); - serverSession.close(); - }).then(mustCall()); +const serverEndpoint = await listen(mustCall(async (serverSession) => { + const info = await serverSession.opened; + // The server should see the client's requested servername. + assert.strictEqual(info.servername, 'localhost'); + await serverSession.close(); }), { sni: { '*': { keys: [defaultKey], certs: [defaultCert] }, @@ -41,12 +36,11 @@ assert.ok(serverEndpoint.address !== undefined); // Client connects with servername 'localhost' — should match the SNI entry. const clientSession = await connect(serverEndpoint.address, { servername: 'localhost', + verifyPeer: 'manual', alpn: 'quic-test', }); -clientSession.opened.then((info) => { - assert.strictEqual(info.servername, 'localhost'); - clientOpened.resolve(); -}).then(mustCall()); +const clientInfo = await clientSession.opened; +assert.strictEqual(clientInfo.servername, 'localhost'); -await Promise.all([serverOpened.promise, clientOpened.promise]); -clientSession.close(); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stateless-reset.mjs b/test/parallel/test-quic-stateless-reset.mjs new file mode 100644 index 000000000000..90ff9e2c80d5 --- /dev/null +++ b/test/parallel/test-quic-stateless-reset.mjs @@ -0,0 +1,226 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: stateless reset. +// When the server loses session state and the client sends +// data, the server sends a stateless reset and the client +// session closes. +// When disableStatelessReset is true, the server does NOT +// send a stateless reset. +// Global token bucket rate limits the total number of resets. + +import { hasQuic, skip, mustCall, expectsError, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); + +// Stateless reset received closes session. +{ + const serverDestroyed = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Do a complete data exchange first so both sides are + // fully at 1-RTT with all ACKs exchanged. + const data = await bytes(stream); + assert.ok(data.byteLength > 0); + stream.writer.endSync(); + await stream.closed; + + // Now forcefully destroy the server session WITHOUT sending + // CONNECTION_CLOSE. The client doesn't know the session + // is gone. + serverSession.destroy(); + serverDestroyed.resolve(); + }); + }), { + onerror: mustNotCall(), + }); + + const clientSession = await connect(serverEndpoint.address, { + reuseEndpoint: false, + verifyPeer: 'manual', + onerror: expectsError({ code: 'ERR_QUIC_TRANSPORT_ERROR' }), + }); + await clientSession.opened; + + // First exchange: complete round-trip to confirm 1-RTT. + const stream1 = await clientSession.createBidirectionalStream({ + body: encoder.encode('hello'), + }); + for await (const _ of stream1) { /* drain */ } // eslint-disable-line no-unused-vars + await stream1.closed; + + // Wait for the server to destroy. + await serverDestroyed.promise; + + // Open a second stream — this sends a short header (1-RTT) packet + // to the server. The server endpoint doesn't recognize the DCID + // and should send a stateless reset. + // eslint-disable-next-line no-unused-vars + const stream2 = await clientSession.createBidirectionalStream({ + body: encoder.encode('after destroy'), + }); + + // The client session should be closed by the stateless reset. + await assert.rejects(clientSession.closed, { + code: 'ERR_QUIC_TRANSPORT_ERROR', + }); + + assert.ok(serverEndpoint.stats.statelessResetCount > 0n, + 'Server should have sent a stateless reset'); + + await serverEndpoint.close(); +} + +// disableStatelessReset prevents the server from sending resets. +{ + const serverDestroyed = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const data = await bytes(stream); + assert.ok(data.byteLength > 0); + stream.writer.endSync(); + await stream.closed; + + serverSession.destroy(); + serverDestroyed.resolve(); + }); + }), { + endpoint: { disableStatelessReset: true }, + onerror: mustNotCall(), + }); + + const clientSession = await connect(serverEndpoint.address, { + reuseEndpoint: false, + verifyPeer: 'manual', + // Short idle timeout so the client doesn't hang waiting for + // a stateless reset that will never arrive. + transportParams: { maxIdleTimeout: 1 }, + // Onerror marks stream closed promises as handled so that the + // idle-timeout stream destruction doesn't cause unhandled rejections. + onerror: mustNotCall(), + }); + await clientSession.opened; + + const stream1 = await clientSession.createBidirectionalStream({ + body: encoder.encode('hello'), + }); + for await (const _ of stream1) { /* drain */ } // eslint-disable-line no-unused-vars + await stream1.closed; + + await serverDestroyed.promise; + + // Send a packet after the server session is destroyed. The server + // endpoint silently drops the packet (stateless reset disabled). + // eslint-disable-next-line no-unused-vars + const stream2 = await clientSession.createBidirectionalStream({ + body: encoder.encode('after destroy'), + }); + + // The client should NOT receive a stateless reset. It will close + // via idle timeout instead. + await clientSession.closed; + + assert.strictEqual(serverEndpoint.stats.statelessResetCount, 0n); // No stateless reset should have been sent + + await serverEndpoint.close(); +} + +// Global token bucket rate limits stateless resets. +// With burst=1 and rate=0, only one reset can be sent. +{ + let sessionCount = 0; + const serverDestroyed1 = Promise.withResolvers(); + const serverDestroyed2 = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall((serverSession) => { + sessionCount++; + const which = sessionCount; + const deferred = which === 1 ? serverDestroyed1 : serverDestroyed2; + + serverSession.onstream = mustCall(async (stream) => { + const data = await bytes(stream); + assert.ok(data.byteLength > 0); + stream.writer.endSync(); + await stream.closed; + + serverSession.destroy(); + deferred.resolve(); + }); + }, 2), { + endpoint: { statelessResetBurst: 1, statelessResetRate: 0 }, + onerror: mustNotCall(), + }); + + // The global token bucket rate limiter applies regardless of + // client source address. + const { QuicEndpoint } = await import('node:quic'); + const clientEndpoint = new QuicEndpoint(); + + // --- First session: triggers a stateless reset --- + + const client1 = await connect(serverEndpoint.address, { + endpoint: clientEndpoint, + verifyPeer: 'manual', + onerror: expectsError({ code: 'ERR_QUIC_TRANSPORT_ERROR' }), + }); + await client1.opened; + + // Send data so the server onstream fires and destroys the session. + await client1.createBidirectionalStream({ + body: encoder.encode('session1'), + }); + await serverDestroyed1.promise; + + // Send a packet to trigger stateless reset. + // eslint-disable-next-line no-unused-vars + const s1b = await client1.createBidirectionalStream({ + body: encoder.encode('after destroy 1'), + }); + await assert.rejects(client1.closed, { code: 'ERR_QUIC_TRANSPORT_ERROR' }); + + assert.strictEqual(serverEndpoint.stats.statelessResetCount, 1n); // First reset should have been sent + + // --- Second session: rate-limited, no reset sent --- + + const client2 = await connect(serverEndpoint.address, { + endpoint: clientEndpoint, + verifyPeer: 'manual', + // Short idle timeout so the client closes after the server + // destroys (no stateless reset will arrive, rate-limited). + transportParams: { maxIdleTimeout: 1 }, + // Onerror marks stream closed promises as handled. + onerror: mustNotCall(), + }); + await client2.opened; + + // Send data so the server onstream fires and destroys the session. + await client2.createBidirectionalStream({ + body: encoder.encode('session2'), + }); + await serverDestroyed2.promise; + + // Send a packet — the server would normally send a stateless reset, + // but the global rate limit (burst of 1) is already exhausted. + // eslint-disable-next-line no-unused-vars + const s2b = await client2.createBidirectionalStream({ + body: encoder.encode('after destroy 2'), + }); + + // The client closes via idle timeout (no stateless reset). + await client2.closed; + + assert.strictEqual(serverEndpoint.stats.statelessResetCount, 1n); // Second reset should have been rate-limited + assert.ok(serverEndpoint.stats.statelessResetRateLimited > 0); // Rate-limited counter should be non-zero + + await clientEndpoint.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-stats-tojson-inspect.mjs b/test/parallel/test-quic-stats-tojson-inspect.mjs new file mode 100644 index 000000000000..560acda49172 --- /dev/null +++ b/test/parallel/test-quic-stats-tojson-inspect.mjs @@ -0,0 +1,65 @@ +// Flags: --experimental-quic --no-warnings + +// Test: toJSON() and inspect() on stats objects. +// Verifies that stats objects from endpoints and sessions +// support toJSON() and util.inspect(). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import { inspect } from 'node:util'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + // Session stats toJSON and inspect. + const sessionStatsJson = serverSession.stats.toJSON(); + assert.ok(sessionStatsJson); + assert.strictEqual(typeof sessionStatsJson.createdAt, 'string'); + assert.strictEqual(typeof sessionStatsJson.bytesSent, 'string'); + + const sessionStatsInspect = inspect(serverSession.stats); + assert.ok(sessionStatsInspect.includes('QuicSessionStats')); + + serverSession.onstream = mustCall(async (stream) => { + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +// Endpoint stats toJSON and inspect. +const endpointStatsJson = serverEndpoint.stats.toJSON(); +assert.ok(endpointStatsJson); +assert.strictEqual(typeof endpointStatsJson.createdAt, 'string'); + +const endpointStatsInspect = inspect(serverEndpoint.stats); +assert.ok(endpointStatsInspect.includes('QuicEndpointStats')); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Client session stats. +const clientStatsJson = clientSession.stats.toJSON(); +assert.ok(clientStatsJson); +assert.strictEqual(typeof clientStatsJson.createdAt, 'string'); + +const clientStatsInspect = inspect(clientSession.stats); +assert.ok(clientStatsInspect.includes('QuicSessionStats')); + +const stream = await clientSession.createBidirectionalStream({ + body: new TextEncoder().encode('test'), +}); +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + +await Promise.all([stream.closed, serverDone.promise]); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-bidi-basic.mjs b/test/parallel/test-quic-stream-bidi-basic.mjs new file mode 100644 index 000000000000..adbbca33c5e4 --- /dev/null +++ b/test/parallel/test-quic-stream-bidi-basic.mjs @@ -0,0 +1,58 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: basic bidirectional stream data transfer. +// The client creates a bidi stream with a fixed body. The server reads the +// data via async iteration (using stream/iter bytes()), verifies integrity, +// then closes its write side of the stream. Both sides await stream.closed +// to ensure the stream is fully acknowledged before the session is torn down. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const message = 'Hello from the client'; +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); +// Keep a separate copy for comparison — the body passed to +// createBidirectionalStream will have its ArrayBuffer transferred. +const body = encoder.encode(message); +const expected = encoder.encode(message); + +const done = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + + assert.deepStrictEqual(received, expected); + assert.strictEqual(decoder.decode(received), message); + + // Close the server's write side of the bidi stream (FIN with no data) + // so the stream is fully closed on both directions. + stream.writer.endSync(); + + // Wait for the stream to be fully closed before closing the session. + await stream.closed; + serverSession.close(); + done.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Create a bidi stream with the message as the body. +// For DefaultApplication, the server's onstream fires when data arrives. +const stream = await clientSession.createBidirectionalStream({ + body: body, +}); + +await Promise.all([stream.closed, done.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-bidi-concurrent.mjs b/test/parallel/test-quic-stream-bidi-concurrent.mjs new file mode 100644 index 000000000000..4428749f578b --- /dev/null +++ b/test/parallel/test-quic-stream-bidi-concurrent.mjs @@ -0,0 +1,63 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: multiple concurrent bidirectional streams on a single session. +// The client opens several bidi streams in parallel, each sending a +// distinct message. The server reads each stream independently and +// verifies data integrity. All streams and the session are closed +// cleanly after all transfers complete. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); +const numStreams = 5; + +const messages = Array.from({ length: numStreams }, + (_, i) => `message from stream ${i}`); + +let serverStreamsReceived = 0; +const done = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + const text = decoder.decode(received); + + // Verify it's one of the expected messages. + assert.ok(messages.includes(text), + `Unexpected message: ${text}`); + + stream.writer.endSync(); + await stream.closed; + + serverStreamsReceived++; + if (serverStreamsReceived === numStreams) { + serverSession.close(); + done.resolve(); + } + }, numStreams); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Open all streams concurrently. +const clientStreams = await Promise.all( + messages.map((msg) => + clientSession.createBidirectionalStream({ + body: encoder.encode(msg), + }), + ), +); + +await Promise.all([done.promise, ...clientStreams.map((s) => s.closed)]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-bidi-echo.mjs b/test/parallel/test-quic-stream-bidi-echo.mjs new file mode 100644 index 000000000000..7f556f0295c0 --- /dev/null +++ b/test/parallel/test-quic-stream-bidi-echo.mjs @@ -0,0 +1,52 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: bidirectional stream echo. +// The client sends a message, the server reads it and echoes it back. +// Both directions of the bidi stream carry data and are properly FIN'd. +// Verifies that both client and server can read and write on the same stream. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const message = 'ping from client'; +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +const done = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Read client's data. + const received = await bytes(stream); + + // Echo it back and close the write side. + const w = stream.writer; + w.writeSync(received); + w.endSync(); + + await stream.closed; + serverSession.close(); + done.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const body = encoder.encode(message); +const stream = await clientSession.createBidirectionalStream({ body }); + +// Read the echoed response from the server. +const echoed = await bytes(stream); +assert.strictEqual(decoder.decode(echoed), message); + +await Promise.all([stream.closed, done.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-bidi-halfclose.mjs b/test/parallel/test-quic-stream-bidi-halfclose.mjs new file mode 100644 index 000000000000..42c711ee2050 --- /dev/null +++ b/test/parallel/test-quic-stream-bidi-halfclose.mjs @@ -0,0 +1,58 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: half-close on a bidirectional stream. +// The client sends a body and closes its write side (FIN). While the +// client's writable side is closed, the server's writable side remains +// open. The server reads all client data, then sends a response back. +// The client reads the server's response and verifies both payloads. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); +const clientMessage = 'request from client'; +const serverMessage = 'response from server'; + +const done = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Read the client's data (client has already sent FIN). + const received = await bytes(stream); + assert.strictEqual(decoder.decode(received), clientMessage); + + // The server's writable side is still open. Send a response. + const w = stream.writer; + w.writeSync(encoder.encode(serverMessage)); + w.endSync(); + + await stream.closed; + serverSession.close(); + done.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Create a stream with a body -- this sends FIN after the body. +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode(clientMessage), +}); + +// The client's writable side is closed (FIN sent with body), but +// the readable side is still open. Read the server's response. +const response = await bytes(stream); +assert.strictEqual(decoder.decode(response), serverMessage); + +await Promise.all([stream.closed, done.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-bidi-large.mjs b/test/parallel/test-quic-stream-bidi-large.mjs new file mode 100644 index 000000000000..32c9c46572ec --- /dev/null +++ b/test/parallel/test-quic-stream-bidi-large.mjs @@ -0,0 +1,86 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: large bidirectional data transfer with backpressure. +// The client sends >1MB of data using the writer API, exercising the +// QUIC flow control path. The server reads all data and verifies the +// total byte count and a checksum. This tests that backpressure is +// correctly applied and released across the full transfer. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes, drainableProtocol: dp } = await import('stream/iter'); + +// 1.5 MB payload — large enough to trigger flow control. +const totalSize = 1.5 * 1024 * 1024; +const chunkSize = 16 * 1024; +const numChunks = Math.ceil(totalSize / chunkSize); + +// Build a deterministic payload so we can verify integrity. +function buildChunk(index) { + const chunk = new Uint8Array(chunkSize); + // Fill with a pattern derived from the chunk index. + const val = index & 0xff; + for (let i = 0; i < chunkSize; i++) { + chunk[i] = (val + i) & 0xff; + } + return chunk; +} + +function checksum(data) { + let sum = 0; + for (let i = 0; i < data.byteLength; i++) { + sum = (sum + data[i]) | 0; + } + return sum; +} + +// Compute expected checksum. +let expectedChecksum = 0; +for (let i = 0; i < numChunks; i++) { + const chunk = buildChunk(i); + expectedChecksum = (expectedChecksum + checksum(chunk)) | 0; +} + +const done = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(received.byteLength, numChunks * chunkSize); + assert.strictEqual(checksum(received), expectedChecksum); + + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + done.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); +const w = stream.writer; + +// Write chunks, respecting backpressure via drainableProtocol. +for (let i = 0; i < numChunks; i++) { + const chunk = buildChunk(i); + while (!w.writeSync(chunk)) { + // Flow controlled — wait for drain before retrying. + const drainable = w[dp](); + if (drainable) await drainable; + } +} + +const totalWritten = w.endSync(); +assert.strictEqual(totalWritten, numChunks * chunkSize); + +await Promise.all([stream.closed, done.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-bidi-server-initiated.mjs b/test/parallel/test-quic-stream-bidi-server-initiated.mjs new file mode 100644 index 000000000000..d2279b28fe5e --- /dev/null +++ b/test/parallel/test-quic-stream-bidi-server-initiated.mjs @@ -0,0 +1,55 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: server-initiated bidirectional stream. +// The server creates a bidi stream and sends a body to the client. +// The client receives the data via its onstream handler and verifies +// integrity. This is the reverse of test-quic-stream-bidi-basic.mjs. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const message = 'Hello from the server'; +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); +const expected = encoder.encode(message); + +const done = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + + const stream = await serverSession.createBidirectionalStream({ + body: encoder.encode(message), + }); + + // Drain the client's write side (client sends FIN with no data). + for await (const batch of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +clientSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + + assert.deepStrictEqual(received, expected); + assert.strictEqual(decoder.decode(received), message); + + // Close the client's write side so the stream fully closes. + stream.writer.endSync(); + await stream.closed; + + clientSession.close(); + done.resolve(); +}); + +await done.promise; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-bidi-setbody.mjs b/test/parallel/test-quic-stream-bidi-setbody.mjs new file mode 100644 index 000000000000..84858f594a29 --- /dev/null +++ b/test/parallel/test-quic-stream-bidi-setbody.mjs @@ -0,0 +1,57 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: stream.setBody() after creation. +// Creates a bidirectional stream without an initial body, then attaches +// a body via setBody(). The server reads the data and verifies integrity. +// Also verifies that calling setBody() a second time throws. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); +const message = 'body set after creation'; +const expected = encoder.encode(message); + +const done = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + + assert.deepStrictEqual(received, expected); + assert.strictEqual(decoder.decode(received), message); + + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + done.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Create a stream with no body. +const stream = await clientSession.createBidirectionalStream(); + +// Attach a body after creation. +stream.setBody(encoder.encode(message)); + +// Calling setBody() again should throw. +assert.throws(() => { + stream.setBody(encoder.encode('second body')); +}, { + code: 'ERR_INVALID_STATE', +}); + +await Promise.all([stream.closed, done.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-bidi-varchunklen.mjs b/test/parallel/test-quic-stream-bidi-varchunklen.mjs new file mode 100644 index 000000000000..d39a53b5edb2 --- /dev/null +++ b/test/parallel/test-quic-stream-bidi-varchunklen.mjs @@ -0,0 +1,89 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: bidirectional data transfer with varying chunk sizes. +// This is a regression test for a stall caused by a mismatch between +// writeSync (which rejects when chunk > writeDesiredSize) and +// drainableProtocol (which returned null when writeDesiredSize > 0). +// When chunks don't evenly fill the high water mark, writeDesiredSize +// can be positive but smaller than the next chunk, causing the +// while(!writeSync) { dp(); await } loop to spin without yielding. +// See: https://github.com/nodejs/node/issues/63216 + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes, drainableProtocol: dp } = await import('stream/iter'); + +// Varying chunk sizes — the pattern of alternating large and small +// chunks is effective at triggering the writeDesiredSize gap. +const chunkSizes = [60000, 12, 50000, 1600, 20000, 30000, 0, 100]; +const numChunks = chunkSizes.length; +const byteLength = chunkSizes.reduce((a, b) => a + b, 0); + +// Build a deterministic payload so we can verify integrity. +function buildChunk(index) { + const chunk = new Uint8Array(chunkSizes[index]); + const val = index & 0xff; + for (let i = 0; i < chunkSizes[index]; i++) { + chunk[i] = (val + i) & 0xff; + } + return chunk; +} + +function checksum(data) { + let sum = 0; + for (let i = 0; i < data.byteLength; i++) { + sum = (sum + data[i]) | 0; + } + return sum; +} + +// Compute expected checksum. +let expectedChecksum = 0; +for (let i = 0; i < numChunks; i++) { + const chunk = buildChunk(i); + expectedChecksum = (expectedChecksum + checksum(chunk)) | 0; +} + +const done = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(received.byteLength, byteLength); + assert.strictEqual(checksum(received), expectedChecksum); + + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + done.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); +const w = stream.writer; + +// Write chunks, respecting backpressure via drainableProtocol. +for (let i = 0; i < numChunks; i++) { + const chunk = buildChunk(i); + while (!w.writeSync(chunk)) { + // Flow controlled — wait for drain before retrying. + const drainable = w[dp](); + if (drainable) await drainable; + } +} + +const totalWritten = w.endSync(); +assert.strictEqual(totalWritten, byteLength); + +await Promise.all([stream.closed, done.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-bidi-writer.mjs b/test/parallel/test-quic-stream-bidi-writer.mjs new file mode 100644 index 000000000000..7177a8c7f44f --- /dev/null +++ b/test/parallel/test-quic-stream-bidi-writer.mjs @@ -0,0 +1,61 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: writer API for bidirectional streams. +// Exercises writeSync, write (async), endSync, and verifies that data +// written in multiple chunks arrives intact and in order on the server. +// Also tests that the writer reports correct state after operations. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +const done = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(decoder.decode(received), 'chunk1chunk2chunk3'); + + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + done.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); +const w = stream.writer; + +// Writer should be open. +assert.strictEqual(typeof w.canWrite, 'boolean'); + +// Write multiple chunks synchronously. +assert.strictEqual(w.writeSync(encoder.encode('chunk1')), true); +assert.strictEqual(w.writeSync(encoder.encode('chunk2')), true); +assert.strictEqual(w.writeSync(encoder.encode('chunk3')), true); + +// End the write side — returns total bytes written. +const totalWritten = w.endSync(); +assert.strictEqual(totalWritten, 18); // 6 * 3 + +// After end, write should return false. +assert.strictEqual(w.writeSync(encoder.encode('nope')), false); + +// canWrite should be null after close. +assert.strictEqual(w.canWrite, null); + +await Promise.all([stream.closed, done.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-body-async-error.mjs b/test/parallel/test-quic-stream-body-async-error.mjs new file mode 100644 index 000000000000..c9c81d2dbcb2 --- /dev/null +++ b/test/parallel/test-quic-stream-body-async-error.mjs @@ -0,0 +1,44 @@ +// Flags: --experimental-quic --no-warnings + +// Test: async iterable source error destroys the stream. +// When the async iterable body source throws, the stream should be +// destroyed with the error and stream.closed should reject. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}), { transportParams: { maxIdleTimeout: 1 } }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1 }, +}); +await clientSession.opened; + +const testError = new Error('async source error'); + +async function* failingSource() { + yield encoder.encode('partial '); + throw testError; +} + +const stream = await clientSession.createBidirectionalStream(); + +// Attach the closed handler BEFORE setBody so the rejection from +// stream.destroy(err) is caught before it becomes unhandled. +const closedPromise = assert.rejects(stream.closed, testError); + +stream.setBody(failingSource()); + +// The stream should be destroyed with the source error. +await Promise.all([closedPromise, clientSession.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-body-async-iterable.mjs b/test/parallel/test-quic-stream-body-async-iterable.mjs new file mode 100644 index 000000000000..168144689eb8 --- /dev/null +++ b/test/parallel/test-quic-stream-body-async-iterable.mjs @@ -0,0 +1,49 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: body from async iterable source. +// An async generator is used as the body source. The data is consumed +// via the streaming path in configureOutbound. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const chunks = ['hello ', 'from ', 'async ', 'iterable']; +const expected = encoder.encode(chunks.join('')); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.deepStrictEqual(received, expected); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +async function* generateChunks() { + for (const chunk of chunks) { + yield encoder.encode(chunk); + } +} + +const stream = await clientSession.createBidirectionalStream(); +stream.setBody(generateChunks()); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-body-error.mjs b/test/parallel/test-quic-stream-body-error.mjs new file mode 100644 index 000000000000..5b3690440262 --- /dev/null +++ b/test/parallel/test-quic-stream-body-error.mjs @@ -0,0 +1,49 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: stream destroyed during async source consumption. +// When the stream is destroyed while an async iterable body source is +// active, the source consumption should stop. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as assert from 'node:assert'; +const { setTimeout } = await import('node:timers/promises'); + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}), { transportParams: { maxIdleTimeout: 1 } }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1 }, +}); +await clientSession.opened; + +let yieldCount = 0; +async function* slowSource() { + while (true) { + yield encoder.encode(`chunk ${yieldCount++} `); + await setTimeout(50); + } +} + +const stream = await clientSession.createBidirectionalStream(); +stream.setBody(slowSource()); + +// Destroy the stream after a short delay. +await setTimeout(200); +stream.destroy(); +await stream.closed; + +// The source should have stopped. It may yield a few chunks +// but not an unbounded number. +assert.ok(yieldCount < 50, `yieldCount too high: ${yieldCount}`); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-body-filehandle.mjs b/test/parallel/test-quic-stream-body-filehandle.mjs new file mode 100644 index 000000000000..5e1bc3d64730 --- /dev/null +++ b/test/parallel/test-quic-stream-body-filehandle.mjs @@ -0,0 +1,120 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: FileHandle as body source for QUIC streams. +// The file contents are sent via an fd-backed DataQueue. The FileHandle +// is automatically closed when the stream finishes. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import { writeFileSync } from 'node:fs'; +import { open } from 'node:fs/promises'; + +const tmpdir = await import('../common/tmpdir.js'); + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const decoder = new TextDecoder(); +const testContent = 'Hello from a file!\nLine two.\n'; + +tmpdir.refresh(); +const testFile = tmpdir.resolve('quic-fh-test.txt'); +writeFileSync(testFile, testContent); + +// FileHandle as body in createBidirectionalStream. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), testContent); + stream.writer.writeSync('ok'); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); + })); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + const fh = await open(testFile, 'r'); + const stream = await clientSession.createBidirectionalStream({ + body: fh, + }); + + const response = await bytes(stream); + assert.strictEqual(decoder.decode(response), 'ok'); + await Promise.all([stream.closed, serverDone.promise, clientSession.closed]); + await serverEndpoint.close(); + // FileHandle is closed automatically when the stream finishes. +} + +// FileHandle as body in setBody. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), testContent); + stream.writer.writeSync('ok'); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); + })); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + const fh = await open(testFile, 'r'); + const stream = await clientSession.createBidirectionalStream(); + stream.setBody(fh); + + const response = await bytes(stream); + assert.strictEqual(decoder.decode(response), 'ok'); + await Promise.all([stream.closed, serverDone.promise, clientSession.closed]); + await serverEndpoint.close(); + // FileHandle is closed automatically when the stream finishes. +} + +// Locked FileHandle rejects on second use. +{ + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Drain the incoming data so the stream can close cleanly. + await bytes(stream); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + }); + })); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + const fh = await open(testFile, 'r'); + + // First use locks the FileHandle. + const stream1 = await clientSession.createBidirectionalStream({ + body: fh, + }); + + // Second use should reject because it's locked. + await assert.rejects( + clientSession.createBidirectionalStream({ body: fh }), + { code: 'ERR_INVALID_STATE' }, + ); + + await Promise.all([stream1.closed, clientSession.closed]); + await serverEndpoint.close(); + // FileHandle is closed automatically when the stream finishes. +} diff --git a/test/parallel/test-quic-stream-body-pooled-buffer.mjs b/test/parallel/test-quic-stream-body-pooled-buffer.mjs new file mode 100644 index 000000000000..2a98882ac157 --- /dev/null +++ b/test/parallel/test-quic-stream-body-pooled-buffer.mjs @@ -0,0 +1,49 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: pooled Buffer body copies correctly. +// Buffer.from() creates pooled buffers that share a larger ArrayBuffer. +// The QUIC body handling must copy (not transfer) partial views. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const message = 'pooled buffer test data'; +const expected = Buffer.from(message); + +// Verify this IS a pooled buffer (byteLength < buffer.byteLength). +assert.ok( + expected.buffer.byteLength > expected.byteLength, + 'Buffer should be pooled for this test to be meaningful', +); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(Buffer.from(received).toString(), message); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Send the pooled buffer as body via setBody. +const stream = await clientSession.createBidirectionalStream(); +stream.setBody(expected); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-body-promise-error.mjs b/test/parallel/test-quic-stream-body-promise-error.mjs new file mode 100644 index 000000000000..8166bf4144cc --- /dev/null +++ b/test/parallel/test-quic-stream-body-promise-error.mjs @@ -0,0 +1,36 @@ +// Flags: --experimental-quic --no-warnings + +// Test: body: Promise rejection destroys the stream. +// When the body is a Promise that rejects, the stream should be +// destroyed with the rejection error. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}), { transportParams: { maxIdleTimeout: 5 } }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 5 }, +}); +await clientSession.opened; + +const testError = new Error('promise body rejected'); +const stream = await clientSession.createBidirectionalStream(); + +// Attach the closed handler BEFORE setBody so the rejection from +// stream.destroy(err) is caught before it becomes unhandled. +const closedPromise = assert.rejects(stream.closed, testError); + +stream.setBody(Promise.reject(testError)); + +// The stream should be destroyed with the rejection error. +await Promise.all([closedPromise, clientSession.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-body-promise-reject.mjs b/test/parallel/test-quic-stream-body-promise-reject.mjs new file mode 100644 index 000000000000..ebfaf98a7bdf --- /dev/null +++ b/test/parallel/test-quic-stream-body-promise-reject.mjs @@ -0,0 +1,49 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: body: nested promise resolution. +// Native promises auto-flatten, so Promise> resolves +// to the inner string value. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +// Nested promises — native promises auto-flatten, so the +// resolved value is never itself a promise. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual( + new TextDecoder().decode(received), + 'nested promise', + ); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); + })); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + // Double-nested promise: Promise> + const stream = await clientSession.createBidirectionalStream(); + stream.setBody( + Promise.resolve(Promise.resolve('nested promise')), + ); + + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await Promise.all([stream.closed, serverDone.promise]); + await clientSession.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-stream-body-promise.mjs b/test/parallel/test-quic-stream-body-promise.mjs new file mode 100644 index 000000000000..1aab4101d129 --- /dev/null +++ b/test/parallel/test-quic-stream-body-promise.mjs @@ -0,0 +1,69 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: body from Promise. +// Promise is awaited then configured as a string body. +// Promise is awaited then closes the writable side. +// BODY-13 (Promise rejection) is not tested here because the rejected +// promise calls resetStream synchronously which may or may not cause +// the server's onstream to fire depending on timing. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { text, bytes } = await import('stream/iter'); + +let streamIdx = 0; +const totalStreams = 2; +const allDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const idx = streamIdx++; + + if (idx === 0) { + // Promise resolved to string data. + const received = await text(stream); + assert.strictEqual(received, 'resolved string'); + } else if (idx === 1) { + // Promise closes the writable side. + const received = await bytes(stream); + assert.strictEqual(received.byteLength, 0); + } + + stream.writer.endSync(); + await stream.closed; + + if (streamIdx === totalStreams) { + serverSession.close(); + allDone.resolve(); + } + }, totalStreams); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Promise +{ + const stream = await clientSession.createBidirectionalStream(); + stream.setBody(Promise.resolve('resolved string')); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +// Promise +{ + const stream = await clientSession.createBidirectionalStream(); + stream.setBody(Promise.resolve(null)); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +await allDone.promise; +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-body-readable-stream.mjs b/test/parallel/test-quic-stream-body-readable-stream.mjs new file mode 100644 index 000000000000..b235610736f9 --- /dev/null +++ b/test/parallel/test-quic-stream-body-readable-stream.mjs @@ -0,0 +1,64 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: body from ReadableStream and stream.Readable. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); +const { Readable } = await import('node:stream'); + +const encoder = new TextEncoder(); +const message = 'readable stream body'; +const expected = encoder.encode(message); + +let serverStreamCount = 0; +const allDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.deepStrictEqual(received, expected); + stream.writer.endSync(); + await stream.closed; + if (++serverStreamCount === 2) { + serverSession.close(); + allDone.resolve(); + } + }, 2); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Web ReadableStream as body source. +{ + const rs = new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode(message)); + controller.close(); + }, + }); + const stream = await clientSession.createBidirectionalStream(); + stream.setBody(rs); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +// Node.js stream.Readable as body source. +{ + const readable = Readable.from([encoder.encode(message)]); + const stream = await clientSession.createBidirectionalStream(); + stream.setBody(readable); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +await allDone.promise; +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-body-sources.mjs b/test/parallel/test-quic-stream-body-sources.mjs new file mode 100644 index 000000000000..d4f13d84b5ca --- /dev/null +++ b/test/parallel/test-quic-stream-body-sources.mjs @@ -0,0 +1,86 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: various body source types for createBidirectionalStream. +// Verifies that ArrayBuffer, ArrayBufferView (with non-zero byteOffset), +// SharedArrayBuffer, and Blob bodies all deliver data correctly. +// Covers BIDI-07, BIDI-08, BIDI-09, BIDI-10, BIDI-11, BODY-03..06. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const message = 'hello body sources'; +const expectedBytes = encoder.encode(message); + +let testIndex = 0; +const totalTests = 4; +const allDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + await bytes(stream); + stream.writer.endSync(); + await stream.closed; + + testIndex++; + if (testIndex === totalTests) { + serverSession.close(); + allDone.resolve(); + } + }, totalTests); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Test 1: ArrayBuffer body +{ + const buf = encoder.encode(message); + const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + const stream = await clientSession.createBidirectionalStream({ body: ab }); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +// Test 2: ArrayBufferView with non-zero byteOffset +{ + const backing = new ArrayBuffer(64); + const fullView = new Uint8Array(backing); + const offset = 10; + fullView.set(expectedBytes, offset); + const view = new Uint8Array(backing, offset, expectedBytes.byteLength); + const stream = await clientSession.createBidirectionalStream({ body: view }); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +// Test 3: SharedArrayBuffer body +{ + const sab = new SharedArrayBuffer(expectedBytes.byteLength); + const sabView = new Uint8Array(sab); + sabView.set(expectedBytes); + const stream = await clientSession.createBidirectionalStream({ body: sabView }); + // The SharedArrayBuffer should still be usable (copied, not transferred). + assert.strictEqual(sab.byteLength, expectedBytes.byteLength); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +// Test 4: Blob body +{ + const blob = new Blob([expectedBytes]); + const stream = await clientSession.createBidirectionalStream({ body: blob }); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +await allDone.promise; +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-body-state.mjs b/test/parallel/test-quic-stream-body-state.mjs new file mode 100644 index 000000000000..1b3e896f5377 --- /dev/null +++ b/test/parallel/test-quic-stream-body-state.mjs @@ -0,0 +1,83 @@ +// Flags: --experimental-quic --no-warnings + +// Test: setBody / writer mutual exclusion. +// setBody() after writer accessed throws. +// writer after setBody() throws. +// setBody() on destroyed stream throws. +// BODY-17 (setBody twice throws) is already covered by +// test-quic-stream-bidi-setbody.mjs. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +let streamCount = 0; +// BODY-20 destroys the stream before data is sent, so the server only sees 2. +const totalStreams = 2; +const allDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Close the server's write side so the stream can fully close. + stream.writer.endSync(); + await stream.closed; + if (++streamCount === totalStreams) { + serverSession.close(); + allDone.resolve(); + } + }, totalStreams); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// setBody() after writer accessed throws. +{ + const stream = await clientSession.createBidirectionalStream(); + // Access the writer — this initializes the streaming source. + const w = stream.writer; + assert.ok(w); + assert.throws(() => { + stream.setBody(encoder.encode('too late')); + }, { + code: 'ERR_INVALID_STATE', + }); + w.endSync(); + await stream.closed; +} + +// Writer after setBody() throws. +{ + const stream = await clientSession.createBidirectionalStream(); + stream.setBody(encoder.encode('body set')); + assert.throws(() => { + stream.writer; // eslint-disable-line no-unused-expressions + }, { + code: 'ERR_INVALID_STATE', + }); + await stream.closed; +} + +// setBody() on destroyed stream throws. +{ + const stream = await clientSession.createBidirectionalStream(); + stream.destroy(); + assert.throws(() => { + stream.setBody(encoder.encode('destroyed')); + }, { + code: 'ERR_INVALID_STATE', + }); + // stream.closed resolves (destroy without error). + await stream.closed; +} + +await allDone.promise; +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-body-string-shorthand.mjs b/test/parallel/test-quic-stream-body-string-shorthand.mjs new file mode 100644 index 000000000000..e21fd842f814 --- /dev/null +++ b/test/parallel/test-quic-stream-body-string-shorthand.mjs @@ -0,0 +1,104 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: string body shorthand for stream creation and setBody. +// Strings are automatically encoded as UTF-8. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const decoder = new TextDecoder(); + +// String body in createBidirectionalStream options. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'hello from string body'); + stream.writer.writeSync(new TextEncoder().encode('ok')); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); + })); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + // Body provided as a string — should be UTF-8 encoded automatically. + const stream = await clientSession.createBidirectionalStream({ + body: 'hello from string body', + }); + + const response = await bytes(stream); + assert.strictEqual(decoder.decode(response), 'ok'); + await Promise.all([stream.closed, serverDone.promise, clientSession.closed]); + await serverEndpoint.close(); +} + +// String body with setBody. +{ + const serverDone = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), 'setBody string'); + stream.writer.writeSync(new TextEncoder().encode('ok')); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); + })); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream(); + stream.setBody('setBody string'); + + const response = await bytes(stream); + assert.strictEqual(decoder.decode(response), 'ok'); + await Promise.all([stream.closed, serverDone.promise, clientSession.closed]); + await serverEndpoint.close(); +} + +// UTF-8 multi-byte characters preserved correctly. +{ + const serverDone = Promise.withResolvers(); + const testString = 'Hello \u{1F600} world \u00E9\u00FC\u00F1'; + + const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const body = await bytes(stream); + assert.strictEqual(decoder.decode(body), testString); + stream.writer.writeSync(new TextEncoder().encode('ok')); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); + })); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + const stream = await clientSession.createBidirectionalStream({ + body: testString, + }); + + const response = await bytes(stream); + assert.strictEqual(decoder.decode(response), 'ok'); + await Promise.all([stream.closed, serverDone.promise, clientSession.closed]); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-stream-body-string.mjs b/test/parallel/test-quic-stream-body-string.mjs new file mode 100644 index 000000000000..cfe2790028d0 --- /dev/null +++ b/test/parallel/test-quic-stream-body-string.mjs @@ -0,0 +1,41 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: body: string sends UTF-8 encoded data. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { text } = await import('stream/iter'); + +const message = 'Hello from a string body! 🎉 Unicode works.'; + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await text(stream); + assert.strictEqual(received, message); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// setBody with a string — configureOutbound handles this via +// Buffer.from(body, 'utf8'). +const stream = await clientSession.createBidirectionalStream(); +stream.setBody(message); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-body-sync-iterable.mjs b/test/parallel/test-quic-stream-body-sync-iterable.mjs new file mode 100644 index 000000000000..f65cb0da45ab --- /dev/null +++ b/test/parallel/test-quic-stream-body-sync-iterable.mjs @@ -0,0 +1,43 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: body from sync iterable source. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const chunks = ['sync ', 'iterable ', 'source']; +const expected = encoder.encode(chunks.join('')); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.deepStrictEqual(received, expected); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Create an array of Uint8Arrays as a sync iterable body. +const bodyChunks = chunks.map((c) => encoder.encode(c)); +const stream = await clientSession.createBidirectionalStream(); +stream.setBody(bodyChunks); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-closed-promise.mjs b/test/parallel/test-quic-stream-closed-promise.mjs new file mode 100644 index 000000000000..2c30a44fb70b --- /dev/null +++ b/test/parallel/test-quic-stream-closed-promise.mjs @@ -0,0 +1,40 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: stream.closed promise resolves after normal completion. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + await bytes(stream); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('normal close'), +}); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + +// Closed should resolve (not reject). +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-closed-rejects.mjs b/test/parallel/test-quic-stream-closed-rejects.mjs new file mode 100644 index 000000000000..aa22a8337bfb --- /dev/null +++ b/test/parallel/test-quic-stream-closed-rejects.mjs @@ -0,0 +1,53 @@ +// Flags: --experimental-quic --no-warnings + +// Test: stream.closed promise rejects on error. +// The server resets the stream, causing both sides' closed to reject +// with the application error code. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + stream.resetStream(1n); + + // The server's own stream.closed should also reject with the + // reset error code. + await assert.rejects(stream.closed, (error) => { + assert.strictEqual(error.code, 'ERR_QUIC_APPLICATION_ERROR'); + assert.ok(error.message.includes('1')); + return true; + }); + + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('will error'), +}); + +// Client's closed should reject with the reset error code. +await assert.rejects(stream.closed, (error) => { + assert.strictEqual(error.code, 'ERR_QUIC_APPLICATION_ERROR'); + assert.ok(error.message.includes('1')); + return true; +}); + +await serverDone.promise; +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-destroy-emits-reset.mjs b/test/parallel/test-quic-stream-destroy-emits-reset.mjs new file mode 100644 index 000000000000..a8e2bd9051aa --- /dev/null +++ b/test/parallel/test-quic-stream-destroy-emits-reset.mjs @@ -0,0 +1,67 @@ +// Flags: --experimental-quic --no-warnings + +// stream.destroy(err) emits RESET_STREAM on the wire even when the +// user never accessed `stream.writer`. Previously the wire frame was +// only emitted via the writer.fail path inside [kFinishClose], so +// streams that destroyed without ever creating a writer (e.g. used +// `setBody()` or never wrote at all) left the write side dangling on +// the wire and the peer kept the stream alive until the session-level +// idle timer fired. +// +// Verified by observing the server-side `onreset` callback. The wire +// code is the negotiated application's "internal error" code: for +// the test fixture's non-h3 ALPN (`quic-test`) the C++ +// DefaultApplication reports `1n`, which propagates to the server +// as `ERR_QUIC_APPLICATION_ERROR` exposing `errorCode === 1n`. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverResetSeen = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + stream.onreset = mustCall((err) => { + assert.strictEqual(err.code, 'ERR_QUIC_APPLICATION_ERROR'); + // The DefaultApplication's internal error code is 0x1n. + assert.strictEqual(err.errorCode, 1n); + serverResetSeen.resolve(); + }); + + // The peer's reset causes stream.closed to reject with the reset + // error code. + await assert.rejects(stream.closed, { + code: 'ERR_QUIC_APPLICATION_ERROR', + }); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Bidirectional stream with a body source set up front. No JS-side +// writer is accessed -- the body is consumed and pushed by the C++ +// streaming source. Pre-B13, calling destroy() on this stream would +// not emit RESET_STREAM because the writer.fail path was the only +// emission site. +const stream = await clientSession.createBidirectionalStream({ + body: 'hello world', +}); + +const err = new Error('destroy without writer'); +// Pre-attach the rejection assertion before destroying so the +// resulting `stream.closed` rejection isn't reported as unhandled. +const clientClosedAssertion = assert.rejects(stream.closed, err); + +stream.destroy(err); + +await Promise.all([clientClosedAssertion, serverResetSeen.promise]); + +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-destroy-emits-stop-sending.mjs b/test/parallel/test-quic-stream-destroy-emits-stop-sending.mjs new file mode 100644 index 000000000000..f50d3aac1f72 --- /dev/null +++ b/test/parallel/test-quic-stream-destroy-emits-stop-sending.mjs @@ -0,0 +1,65 @@ +// Flags: --experimental-quic --no-warnings + +// stream.destroy(err) emits STOP_SENDING on the wire so the peer +// stops sending data the local side is about to discard. Previously, +// destroy never sent STOP_SENDING - the readable side stayed open +// from the peer's perspective and they would keep transmitting until +// the session-level idle timer fired. +// +// Verified via the server's onstopsending callback. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverObservation = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const writer = stream.writer; + // Sanity: the writer is active before the peer tears the stream + // down, so canWrite is a boolean reflecting the initial + // flow-control window. + if (typeof writer.canWrite !== 'boolean') { + serverObservation.reject(new Error( + `expected initial writer.canWrite to be a boolean, ` + + `got ${writer.canWrite}`)); + return; + } + stream.onreset = mustCall(); + stream.onstopsending = mustCall(() => { + serverObservation.resolve(writer.canWrite); + }); + + // The peer's reset causes stream.closed to reject. + await assert.rejects(stream.closed, { + code: 'ERR_QUIC_APPLICATION_ERROR', + }); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: 'client-data', +}); + +const err = new Error('destroy with error'); +const clientClosedAssertion = assert.rejects(stream.closed, err); + +stream.destroy(err); + +const observedCanWrite = await serverObservation.promise; +assert.strictEqual(observedCanWrite, null); + +await clientClosedAssertion; + +clientSession.close(); +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-destroy-options-code.mjs b/test/parallel/test-quic-stream-destroy-options-code.mjs new file mode 100644 index 000000000000..d211d83b94e2 --- /dev/null +++ b/test/parallel/test-quic-stream-destroy-options-code.mjs @@ -0,0 +1,58 @@ +// Flags: --experimental-quic --no-warnings + +// stream.destroy(error, options) accepts an explicit `options.code` +// that overrides the default wire code derived from `error`. The +// caller-supplied code is sent on RESET_STREAM (and STOP_SENDING for +// the readable side) so the peer observes exactly that code. +// +// For the test fixture's non-h3 ALPN (`quic-test`), the +// DefaultApplication's `internalErrorCode` is `0x1n`. Without +// `options.code`, a plain `Error` would result in the peer seeing +// `0x1n`. With `options.code = 0x42n`, the peer must see `0x42n`. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverResetSeen = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + stream.onreset = mustCall((err) => { + assert.strictEqual(err.code, 'ERR_QUIC_APPLICATION_ERROR'); + assert.strictEqual(err.errorCode, 66n); + serverResetSeen.resolve(); + }); + + // The peer's reset causes stream.closed to reject with the reset + // error code. + await assert.rejects(stream.closed, { + code: 'ERR_QUIC_APPLICATION_ERROR', + }); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: 'data', +}); + +const err = new Error('explicit code via options'); +const clientClosedAssertion = assert.rejects(stream.closed, err); + +// `options.code` (0x42n) takes precedence over the default that +// would have been derived from `error` (which would be the session's +// internalErrorCode, 0x1n for non-h3). +stream.destroy(err, { code: 66n }); + +await Promise.all([clientClosedAssertion, serverResetSeen.promise]); + +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-destroy-options-validate.mjs b/test/parallel/test-quic-stream-destroy-options-validate.mjs new file mode 100644 index 000000000000..ee9b3d1764af --- /dev/null +++ b/test/parallel/test-quic-stream-destroy-options-validate.mjs @@ -0,0 +1,71 @@ +// Flags: --experimental-quic --no-warnings + +// stream.destroy(error, options) validates `options` up front, before +// any side effects. A malformed `options` argument must throw without +// mutating `#destroying`, emitting wire frames, invoking `onerror`, +// or settling the `closed` promise. After the throw, the stream is +// still alive and a subsequent destroy with valid options must +// succeed. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverEndpoint = await listen(mustCall(() => true)); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); + +stream.onerror = mustNotCall( + 'stream.onerror must not fire when destroy() throws on bad options'); + +// 1. options is not an object -> throws ERR_INVALID_ARG_TYPE. +assert.throws(() => stream.destroy(new Error('x'), 'not an object'), { + code: 'ERR_INVALID_ARG_TYPE', +}); +assert.strictEqual(stream.destroyed, false); + +// 2. options.code is the wrong type -> throws ERR_INVALID_ARG_TYPE. +assert.throws(() => stream.destroy(new Error('x'), { code: 'oops' }), { + code: 'ERR_INVALID_ARG_TYPE', +}); +assert.strictEqual(stream.destroyed, false); + +assert.throws(() => stream.destroy(new Error('x'), { code: true }), { + code: 'ERR_INVALID_ARG_TYPE', +}); +assert.strictEqual(stream.destroyed, false); + +// 3. options.reason is the wrong type -> throws ERR_INVALID_ARG_TYPE. +assert.throws(() => stream.destroy(new Error('x'), { reason: 42 }), { + code: 'ERR_INVALID_ARG_TYPE', +}); +assert.strictEqual(stream.destroyed, false); + +// Switch to the real error handler before the final destroy so the +// `mustNotCall` above does not fire on the legitimate teardown. +const finalError = new Error('final destroy'); +stream.onerror = mustCall((err) => { assert.strictEqual(err, finalError); }); + +const clientClosedAssertion = assert.rejects(stream.closed, finalError); + +// 4. Valid options accepted: bigint code. +stream.destroy(finalError, { code: 0x10n, reason: 'cleanup' }); +assert.strictEqual(stream.destroyed, true); + +// 5. Re-entry with arbitrarily bad options is a no-op (the +// re-entrancy guard returns before validation runs). +stream.destroy(new Error('after-destroy'), { code: 'still-bad' }); +assert.strictEqual(stream.destroyed, true); + +await clientClosedAssertion; + +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-error-graceful-close.mjs b/test/parallel/test-quic-stream-error-graceful-close.mjs new file mode 100644 index 000000000000..a4dbfc117ff0 --- /dev/null +++ b/test/parallel/test-quic-stream-error-graceful-close.mjs @@ -0,0 +1,49 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: stream errors during graceful close are handled. +// When a session is gracefully closing and an open stream encounters +// an error, the session should still close cleanly without crashing. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Read some data then reset the stream while the client + // is still sending — this creates a stream error. + const data = await bytes(stream); + assert.ok(data.byteLength > 0); + stream.resetStream(99n); + serverSession.close(); + serverDone.resolve(); + }); +}), { + transportParams: { initialMaxStreamDataBidiRemote: 256 }, + onerror: mustNotCall(), +}); + +const clientSession = await connect(serverEndpoint.address, { + onerror: mustNotCall(), +}); +await clientSession.opened; + +// Send data on a stream. The server will reset it. +const stream = await clientSession.createBidirectionalStream(); +stream.setBody(new Uint8Array(4096)); + +// The stream will error due to the server's reset. +// The session should still close gracefully. +await assert.rejects(stream.closed, { + code: 'ERR_QUIC_APPLICATION_ERROR', +}); +await Promise.all([serverDone.promise, clientSession.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-id-ordering.mjs b/test/parallel/test-quic-stream-id-ordering.mjs new file mode 100644 index 000000000000..e1a8c939f9ae --- /dev/null +++ b/test/parallel/test-quic-stream-id-ordering.mjs @@ -0,0 +1,54 @@ +// Flags: --experimental-quic --no-warnings + +// Test: stream IDs are strictly increasing and unique. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); +const serverDone = Promise.withResolvers(); +let serverStreamCount = 0; + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + stream.writer.endSync(); + await stream.closed; + if (++serverStreamCount === 10) { + serverSession.close(); + serverDone.resolve(); + } + }, 10); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const ids = []; +for (let i = 0; i < 10; i++) { + const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode(`stream ${i}`), + }); + ids.push(stream.id); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +// Verify IDs are strictly increasing. +for (let i = 1; i < ids.length; i++) { + assert.ok(ids[i] > ids[i - 1], + `Stream ID ${ids[i]} should be > ${ids[i - 1]}`); +} + +// Verify all IDs are unique. +const uniqueIds = new Set(ids); +assert.strictEqual(uniqueIds.size, ids.length); + +await Promise.all([serverDone.promise, clientSession.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-idle-timeout.mjs b/test/parallel/test-quic-stream-idle-timeout.mjs new file mode 100644 index 000000000000..52a49ee58061 --- /dev/null +++ b/test/parallel/test-quic-stream-idle-timeout.mjs @@ -0,0 +1,139 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: stream idle timeout. +// Peer-initiated streams that receive no data within the configured +// timeout are automatically destroyed. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import { setTimeout } from 'node:timers/promises'; +import { text } from 'node:stream/iter'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +// --- Stream destroyed after idle timeout --- +{ + const streamDestroyed = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Don't read — let the stream sit idle after the initial data. + // The stream idle timeout should destroy it, rejecting stream.closed. + await assert.rejects(stream.closed, { + code: 'ERR_QUIC_TRANSPORT_ERROR', + }); + streamDestroyed.resolve(); + }); + }), { + // Short idle timeout for the test — 500ms. + streamIdleTimeout: 100, + }); + + const clientSession = await connect(serverEndpoint.address, { + verifyPeer: 'manual', + transportParams: { maxIdleTimeout: 1 }, + }); + + await clientSession.opened; + + // Open a stream and send one byte so the server creates the + // peer-initiated stream, then stop sending. + const clientStream = await clientSession.createUnidirectionalStream(); + const writer = clientStream.writer; + writer.writeSync('x'); + + // Wait for the server to destroy the idle stream. + await streamDestroyed.promise; + + // The server sent STOP_SENDING when it destroyed the idle stream. + // ShutdownStream maps the transport error to the application's + // internal error code on the wire, so the client sees an application + // error indicating the server rejected the stream. + await assert.rejects(clientStream.closed, { + code: 'ERR_QUIC_APPLICATION_ERROR', + }); + + await clientSession.close(); + await serverEndpoint.close(); +} + +// --- Stream with data is NOT destroyed --- +{ + const encoder = new TextEncoder(); + const serverGotData = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const data = await text(stream); + assert.strictEqual(data, 'xy'); + serverGotData.resolve(); + await serverSession.close(); + }); + }), { + streamIdleTimeout: 500, + }); + + const clientSession = await connect(serverEndpoint.address, { + verifyPeer: 'manual', + }); + await clientSession.opened; + + // Open a stream and send data immediately. + const clientStrema = await clientSession.createUnidirectionalStream(); + const writer = clientStrema.writer; + writer.writeSync(encoder.encode('x')); + + // Less than the 500ms idle timeout. + await setTimeout(300); + + writer.writeSync(encoder.encode('y')); + writer.endSync(); + + await Promise.all([serverGotData.promise, clientSession.closed]); + await serverEndpoint.close(); +} + +// --- Disabled when set to 0 --- +{ + const streamSurvived = Promise.withResolvers(); + + const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + + // Do not await this yet. + const data = await text(stream); + + // We should receive all the data, even though it is sent with a pause + // longer than the default idle timeout. + assert.strictEqual(data, 'xy'); + streamSurvived.resolve(); + }); + + await setTimeout(700); + await serverSession.close(); + }), { + streamIdleTimeout: 0, // Disabled + }); + + const clientSession = await connect(serverEndpoint.address); + await clientSession.opened; + + // Send one byte so the server creates the stream, then stop. + const clientStream = await clientSession.createUnidirectionalStream(); + const writer = clientStream.writer; + writer.writeSync('x'); + + // Now pause beyond the 500ms default timeout to verify the stream is not + // killed by idle timeout. + await setTimeout(600); + + writer.writeSync('y'); + writer.endSync(); + + await Promise.all([streamSurvived.promise, clientSession.closed]); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-stream-iteration-batching.mjs b/test/parallel/test-quic-stream-iteration-batching.mjs new file mode 100644 index 000000000000..6d7623e5a082 --- /dev/null +++ b/test/parallel/test-quic-stream-iteration-batching.mjs @@ -0,0 +1,64 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: batching — multiple chunks collected per iteration step. +// When multiple chunks are available synchronously (e.g., the server +// sends them rapidly), the async iterator should batch them into +// arrays of Uint8Array, not yield one chunk at a time. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Send multiple small chunks rapidly — they should be batched + // on the receiving side. + const w = stream.writer; + for (let i = 0; i < 20; i++) { + w.writeSync(encoder.encode(`chunk${i} `)); + } + w.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('request'), +}); + +// Iterate and count batches vs total chunks. +let batchCount = 0; +let totalChunks = 0; +for await (const batch of stream) { + batchCount++; + assert.ok(Array.isArray(batch), 'Each iteration step yields an array'); + for (const chunk of batch) { + assert.ok(chunk instanceof Uint8Array, 'Each item is a Uint8Array'); + totalChunks++; + } +} + +// There should be fewer batches than total chunks — proving batching. +// (On very slow machines, each chunk might arrive separately, so we +// can't assert batchCount < totalChunks strictly. But totalChunks +// should be > 0.) +assert.ok(totalChunks > 0, 'Should have received chunks'); +assert.ok(batchCount > 0, 'Should have received batches'); + +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-iteration-break.mjs b/test/parallel/test-quic-stream-iteration-break.mjs new file mode 100644 index 000000000000..1c879eca7623 --- /dev/null +++ b/test/parallel/test-quic-stream-iteration-break.mjs @@ -0,0 +1,56 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: iterator cleanup on break. +// When the consumer breaks out of a for-await loop, the iterator's +// finally block should clean up (clear wakeup, release reader). +// The stream should still be usable for closing. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Send multiple chunks so the client can break mid-stream. + const w = stream.writer; + for (let i = 0; i < 10; i++) { + w.writeSync(encoder.encode(`chunk ${i} `)); + } + w.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('request'), +}); + +// Break out of the iterator after the first batch. +let batchCount = 0; +for await (const batch of stream) { + batchCount++; + assert.ok(Array.isArray(batch)); + break; // Exit early — should trigger iterator cleanup. +} +assert.strictEqual(batchCount, 1); + +// After break, the stream should still be closable. +// End the writable side (it was already ended by the body). +// The stream closed promise should resolve. +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-iteration-destroyed.mjs b/test/parallel/test-quic-stream-iteration-destroyed.mjs new file mode 100644 index 000000000000..585be6d4a813 --- /dev/null +++ b/test/parallel/test-quic-stream-iteration-destroyed.mjs @@ -0,0 +1,37 @@ +// Flags: --experimental-quic --no-warnings + +// Test: destroyed stream returns finished iterator. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('destroy test'), +}); + +// Destroy the stream immediately. +stream.destroy(); + +// Iterating a destroyed stream should immediately finish. +const iter = stream[Symbol.asyncIterator](); +const { done } = await iter.next(); +assert.strictEqual(done, true); + +await stream.closed; +await clientSession.close(); +await serverEndpoint.destroy(); diff --git a/test/parallel/test-quic-stream-iteration-double.mjs b/test/parallel/test-quic-stream-iteration-double.mjs new file mode 100644 index 000000000000..122d1554559f --- /dev/null +++ b/test/parallel/test-quic-stream-iteration-double.mjs @@ -0,0 +1,58 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: second iterator rejects when first is active. +// Because [Symbol.asyncIterator]() is an async generator, creating the +// generator always succeeds. The lock check runs inside the body, so +// the ERR_INVALID_STATE manifests as a rejected .next() promise, not +// a synchronous throw on generator creation. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const iter1 = stream[Symbol.asyncIterator](); + // Advance the first iterator so the lock is set. + const first = await iter1.next(); + assert.strictEqual(first.done, false); + + // A second iterator can be created (generator object), but + // advancing it should reject because the lock is held. + const iter2 = stream[Symbol.asyncIterator](); + await assert.rejects(iter2.next(), { + code: 'ERR_INVALID_STATE', + }); + + // Drain the first iterator. + for (;;) { + const { done } = await iter1.next(); + if (done) break; + } + + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('double iter test'), +}); +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-iteration-nonreadable.mjs b/test/parallel/test-quic-stream-iteration-nonreadable.mjs new file mode 100644 index 000000000000..f7de503b9807 --- /dev/null +++ b/test/parallel/test-quic-stream-iteration-nonreadable.mjs @@ -0,0 +1,44 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: non-readable stream returns finished iterator. +// The sender side of a unidirectional stream is not readable, so +// iterating it should immediately return done: true. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + await bytes(stream); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createUnidirectionalStream({ + body: encoder.encode('uni data'), +}); + +// The sender side of a uni stream is not readable. +const iter = stream[Symbol.asyncIterator](); +const { done } = await iter.next(); +assert.strictEqual(done, true); + +await Promise.all([serverDone.promise, stream.closed]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-iteration-pipeto.mjs b/test/parallel/test-quic-stream-iteration-pipeto.mjs new file mode 100644 index 000000000000..a169f2d3af4b --- /dev/null +++ b/test/parallel/test-quic-stream-iteration-pipeto.mjs @@ -0,0 +1,48 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: pipeTo pipes a QUIC stream to another writable. +// The server reads from the incoming stream and pipes it to the +// outgoing writer side of the same bidi stream (echo). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes, pipeTo } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const message = 'pipeTo test data'; +const expected = encoder.encode(message); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Pipe the readable side of the stream to the writable side (echo). + // pipeTo(source, destination) where destination is the stream's writer. + await pipeTo(stream, stream.writer); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode(message), +}); + +// Read the echoed data. +const echoed = await bytes(stream); +assert.deepStrictEqual(echoed, expected); + +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-iteration-pull.mjs b/test/parallel/test-quic-stream-iteration-pull.mjs new file mode 100644 index 000000000000..3dba46c77680 --- /dev/null +++ b/test/parallel/test-quic-stream-iteration-pull.mjs @@ -0,0 +1,50 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: pull applies a transform to a QUIC stream. +// Verifies that pull() can process chunks from a QUIC stream through +// a synchronous transform function. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes, pull } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const message = 'pull test'; +const expected = encoder.encode(message); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Use pull with an identity transform — pass chunks through. + const transformed = pull(stream, (chunk) => { + if (chunk === null) return null; + return chunk; + }); + const result = await bytes(transformed); + assert.deepStrictEqual(result, expected); + + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode(message), +}); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-iteration-reset.mjs b/test/parallel/test-quic-stream-iteration-reset.mjs new file mode 100644 index 000000000000..6df571bd9ea7 --- /dev/null +++ b/test/parallel/test-quic-stream-iteration-reset.mjs @@ -0,0 +1,64 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: peer RESET_STREAM causes iterator to error. +// When the server resets the stream, the client's async iterator +// should throw or return early. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const serverReady = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Reset the stream from the server side. + stream.resetStream(42n); + await assert.rejects(stream.closed, mustCall((err) => { + assert.ok(err); + return true; + })); + serverReady.resolve(); + await serverSession.closed; + }); +}), { transportParams: { maxIdleTimeout: 1 } }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams: { maxIdleTimeout: 1 }, +}); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('will be reset by server'), +}); + +// Set up the closed handler before the reset to avoid unhandled rejection. +const closedPromise = assert.rejects(stream.closed, mustCall((err) => { + assert.ok(err); + return true; +})); + +await serverReady.promise; + +// The async iterator should either throw or return early when the +// peer resets the readable side. +try { + for await (const batch of stream) { + // May receive some data before the reset arrives. + assert.ok(Array.isArray(batch)); + } +} catch { + // The iterator may throw when the reset arrives mid-iteration. +} + +// Either way, the stream should close. +await closedPromise; +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-iteration.mjs b/test/parallel/test-quic-stream-iteration.mjs new file mode 100644 index 000000000000..1f4635d0364a --- /dev/null +++ b/test/parallel/test-quic-stream-iteration.mjs @@ -0,0 +1,79 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: stream iteration basics. +// All use a single endpoint with one stream each to avoid the +// sequential endpoint bug. +// for-await yields Uint8Array[] batches. +// text() consumes stream as string. +// bytes() consumes stream as Uint8Array. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes, text } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const message = 'iteration test data'; +const expected = encoder.encode(message); + +let streamCount = 0; +const allDone = Promise.withResolvers(); +const totalStreams = 3; + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const idx = streamCount++; + + if (idx === 0) { + // for-await yields batches. + const chunks = []; + for await (const batch of stream) { + assert.ok(Array.isArray(batch), 'batch should be an array'); + for (const chunk of batch) { + assert.ok(chunk instanceof Uint8Array, 'chunk should be Uint8Array'); + chunks.push(chunk); + } + } + assert.ok(chunks.length > 0); + } else if (idx === 1) { + // text() consumes as string. + const result = await text(stream); + assert.strictEqual(typeof result, 'string'); + assert.strictEqual(result, message); + } else if (idx === 2) { + // bytes() consumes as Uint8Array. + const result = await bytes(stream); + assert.ok(result instanceof Uint8Array); + assert.deepStrictEqual(result, expected); + } + + stream.writer.endSync(); + await stream.closed; + + if (streamCount === totalStreams) { + serverSession.close(); + allDone.resolve(); + } + }, totalStreams); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Send three streams sequentially. +for (let i = 0; i < totalStreams; i++) { + const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode(message), + }); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +await allDone.promise; +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-limits-pending.mjs b/test/parallel/test-quic-stream-limits-pending.mjs new file mode 100644 index 000000000000..bd7bcd51fff8 --- /dev/null +++ b/test/parallel/test-quic-stream-limits-pending.mjs @@ -0,0 +1,69 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: stream limits and pending behavior. +// initialMaxStreamsBidi limits concurrent bidi streams. +// When the limit is reached, new streams are queued as pending +// and open when existing streams close. +// initialMaxStreamsUni limits concurrent uni streams (same behavior). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const allDone = Promise.withResolvers(); +let serverStreamCount = 0; + +// Server allows only 1 bidi stream at a time. +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + await bytes(stream); + stream.writer.endSync(); + await stream.closed; + if (++serverStreamCount === 2) { + serverSession.close(); + allDone.resolve(); + } + }, 2); +}), { + transportParams: { initialMaxStreamsBidi: 1 }, +}); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// First stream opens immediately (within the limit). +const s1 = await clientSession.createBidirectionalStream({ + body: encoder.encode('stream 1'), +}); + +// Second stream is created but queued as pending because the +// server only allows 1 concurrent bidi stream. +const s2 = await clientSession.createBidirectionalStream({ + body: encoder.encode('stream 2'), +}); + +// s2 should be pending until s1 closes and the server grants +// more stream credits. +assert.strictEqual(s2.pending, true); + +// Drain and close the first stream. +for await (const _ of s1) { /* drain */ } // eslint-disable-line no-unused-vars +await s1.closed; + +// After s1 closes, the server sends MAX_STREAMS which opens s2. +// Wait for the server to receive both streams. +await allDone.promise; + +// s2 should no longer be pending. +for await (const _ of s2) { /* drain */ } // eslint-disable-line no-unused-vars +await s2.closed; + +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-limits-uni.mjs b/test/parallel/test-quic-stream-limits-uni.mjs new file mode 100644 index 000000000000..a7427508ca1a --- /dev/null +++ b/test/parallel/test-quic-stream-limits-uni.mjs @@ -0,0 +1,54 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: uni stream limits and pending behavior. +// initialMaxStreamsUni = 1 limits concurrent uni streams. The second +// stream is queued as pending and opens after the first closes. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const allDone = Promise.withResolvers(); +let serverStreamCount = 0; + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + await bytes(stream); + await stream.closed; + if (++serverStreamCount === 2) { + serverSession.close(); + allDone.resolve(); + } + }, 2); +}), { + transportParams: { initialMaxStreamsUni: 1 }, +}); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// First uni stream opens immediately. +const s1 = await clientSession.createUnidirectionalStream({ + body: encoder.encode('uni 1'), +}); + +// Second uni stream is pending (limit = 1). +const s2 = await clientSession.createUnidirectionalStream({ + body: encoder.encode('uni 2'), +}); +assert.strictEqual(s2.pending, true); + +// Wait for both to complete. +await s1.closed; +await allDone.promise; +await s2.closed; + +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-many-rapid.mjs b/test/parallel/test-quic-stream-many-rapid.mjs new file mode 100644 index 000000000000..94660889718a --- /dev/null +++ b/test/parallel/test-quic-stream-many-rapid.mjs @@ -0,0 +1,56 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: many streams opened and closed rapidly. +// Open 50 bidirectional streams in rapid succession, each with a +// small body. All streams should close successfully and the server +// should receive all data. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const streamCount = 50; +const encoder = new TextEncoder(); +let serverReceived = 0; +const allReceived = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const data = await bytes(stream); + assert.strictEqual(data.byteLength, 5); + stream.writer.endSync(); + await stream.closed; + if (++serverReceived === streamCount) { + serverSession.close(); + allReceived.resolve(); + } + }, streamCount); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Open 50 streams rapidly, each with a small body. +const streams = []; +for (let i = 0; i < streamCount; i++) { + const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('hello'), + }); + streams.push(stream); +} + +// Wait for all client streams to close. +await Promise.all(streams.map(async (stream) => { + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +})); + +await allReceived.promise; +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-onblocked.mjs b/test/parallel/test-quic-stream-onblocked.mjs new file mode 100644 index 000000000000..b1b9d16c277b --- /dev/null +++ b/test/parallel/test-quic-stream-onblocked.mjs @@ -0,0 +1,71 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: stream.onblocked fires when flow control blocks a stream. +// When the peer's stream-level receive window is exhausted, ngtcp2 returns +// NGTCP2_ERR_STREAM_DATA_BLOCKED. The stream is unscheduled and the +// onblocked callback fires. The stream resumes automatically when the peer +// sends MAX_STREAM_DATA to extend the window. +// Strategy: set the body to a buffer larger than the flow control window. +// ngtcp2 sends the initial window then blocks. onblocked fires. Flow +// control extension eventually unblocks and the full transfer completes. + +import { hasQuic, skip, mustCall, mustCallAtLeast } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +// quic.stream.blocked fires when a stream is flow-control blocked. +dc.subscribe('quic.stream.blocked', mustCallAtLeast((msg) => { + assert.ok(msg.stream, 'stream.blocked should include stream'); + assert.ok(msg.session, 'stream.blocked should include session'); +}, 1)); + +const totalSize = 4096; +const body = new Uint8Array(totalSize); +for (let i = 0; i < totalSize; i++) body[i] = i & 0xff; + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(received.byteLength, totalSize); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +}), { + // Small stream window — forces stream-level flow control blocking. + transportParams: { initialMaxStreamDataBidiRemote: 256 }, +}); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); + +let blockedCount = 0; +stream.onblocked = mustCallAtLeast(() => { + blockedCount++; +}, 1); + +// Set the body via setBody() — larger than the flow control window. +// ngtcp2 sends the first 256 bytes then returns +// NGTCP2_ERR_STREAM_DATA_BLOCKED, triggering onblocked. +stream.setBody(body); + +for await (const _ of stream) { /* drain readable side */ } // eslint-disable-line no-unused-vars +await stream.closed; +await serverDone.promise; + +assert.ok(blockedCount > 0, `Expected onblocked to fire, got ${blockedCount} calls`); + +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-pending.mjs b/test/parallel/test-quic-stream-pending.mjs new file mode 100644 index 000000000000..a51bc711585e --- /dev/null +++ b/test/parallel/test-quic-stream-pending.mjs @@ -0,0 +1,55 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: pending streams. +// Stream created before handshake completes, opens after. +// stream.pending is true before open, false after. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(new TextDecoder().decode(received), 'pending stream'); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); + +// Create a stream BEFORE awaiting opened — the handshake may not have +// completed yet. The stream should be created in a pending state. +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('pending stream'), +}); + +// The stream should initially be pending (no ID assigned yet). +// On fast machines the handshake might already be done. +assert.strictEqual(typeof stream.pending, 'boolean'); + +// The server's onstream fires only after the handshake completes AND +// the pending stream opens. By the time we get data on the server, +// the stream is definitely no longer pending. +await serverDone.promise; + +// After the server received data, the stream opened successfully. +// The data arrival proves (pending stream opens after handshake). + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await stream.closed; +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-priority.mjs b/test/parallel/test-quic-stream-priority.mjs new file mode 100644 index 000000000000..2895a5763c42 --- /dev/null +++ b/test/parallel/test-quic-stream-priority.mjs @@ -0,0 +1,93 @@ +// Flags: --experimental-quic --no-warnings + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + await serverSession.close(); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], +}); + +const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', +}); +await clientSession.opened; + +// Collect stream.closed promises so we can await them all at the end. +// We must not await them inline because the server's CONNECTION_CLOSE +// arrives asynchronously and would put the session into a closing state, +// preventing subsequent createBidirectionalStream calls. +const streamClosedPromises = []; + +// Test 1: Priority getter returns null for non-HTTP/3 sessions. +// setPriority throws because the session doesn't support priority. +{ + const stream = await clientSession.createBidirectionalStream(); + streamClosedPromises.push(stream.closed); + assert.strictEqual(stream.priority, null); + + assert.throws( + () => stream.setPriority({ level: 'high', incremental: true }), + { code: 'ERR_INVALID_STATE' }, + ); +} + +// Test 2: Validation of createStream priority/incremental options +{ + await assert.rejects( + clientSession.createBidirectionalStream({ priority: 'urgent' }), + { code: 'ERR_INVALID_ARG_VALUE' }, + ); + await assert.rejects( + clientSession.createBidirectionalStream({ priority: 42 }), + { code: 'ERR_INVALID_ARG_VALUE' }, + ); + await assert.rejects( + clientSession.createBidirectionalStream({ incremental: 'yes' }), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); + await assert.rejects( + clientSession.createBidirectionalStream({ incremental: 1 }), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +// Test 3: setPriority throws on non-H3 sessions regardless of arguments +{ + const stream = await clientSession.createBidirectionalStream(); + streamClosedPromises.push(stream.closed); + + assert.throws( + () => stream.setPriority({ level: 'high' }), + { code: 'ERR_INVALID_STATE' }, + ); + assert.throws( + () => stream.setPriority({ level: 'low', incremental: true }), + { code: 'ERR_INVALID_STATE' }, + ); + assert.throws( + () => stream.setPriority(), + { code: 'ERR_INVALID_STATE' }, + ); +} + +// Wait for all streams to close (they close when the session closes +// in response to the server's CONNECTION_CLOSE). +await Promise.all(streamClosedPromises); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-read-after-blocked.mjs b/test/parallel/test-quic-stream-read-after-blocked.mjs new file mode 100644 index 000000000000..40ee0e9ea933 --- /dev/null +++ b/test/parallel/test-quic-stream-read-after-blocked.mjs @@ -0,0 +1,60 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: a sender blocked on flow control is resumed once the consumer +// starts reading. This confirms that we do flush MAX_STREAM_DATA +// frames as expected when the consumer reads. + +import { hasQuic, skip, mustCall, mustCallAtLeast } from '../common/index.mjs'; +import { setTimeout as delay } from 'node:timers/promises'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +// Larger than the default 256 KB stream flow-control window: +const size = 1024 * 1024; +const expected = new Uint8Array(size); +for (let i = 0; i < size; i++) expected[i] = i & 0xff; + +const senderBlocked = Promise.withResolvers(); +const done = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + stream.onblocked = mustCallAtLeast(() => senderBlocked.resolve(stream), 1); + stream.setBody(expected); + await stream.closed; + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Write a byte to open the stream: +const stream = await clientSession.createBidirectionalStream(); +await stream.writer.write(new Uint8Array([1])); + +// Wait until the sender has filled the window and blocked. +const serverStream = await senderBlocked.promise; + +// Poll until everything has been acked, so the stream is fully idle: +while (serverStream.stats.maxOffsetAcknowledged !== serverStream.stats.bytesSent) { + await delay(1); +} + +// Try to read: +const received = await bytes(stream); +assert.strictEqual(received.byteLength, expected.byteLength); +assert.deepStrictEqual(received, expected); + +stream.writer.endSync(); +await stream.closed; +clientSession.close(); +done.resolve(); + +await Promise.all([done.promise, clientSession.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-read-after-fin.mjs b/test/parallel/test-quic-stream-read-after-fin.mjs new file mode 100644 index 000000000000..394a595a0d74 --- /dev/null +++ b/test/parallel/test-quic-stream-read-after-fin.mjs @@ -0,0 +1,55 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: reading a stream after its read side has received FIN, although +// the stream is still alive. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import { setTimeout as delay } from 'node:timers/promises'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const expected = new TextEncoder().encode('data sent before any reader'); +const serverSent = Promise.withResolvers(); +const done = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Reply with the full body plus FIN: + stream.setBody(expected); + serverSent.resolve(); + await stream.closed; + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); + +// Write a byte to open the stream: +const writer = stream.writer; +await writer.write(new Uint8Array([1])); + +// Wait until the server has sent its response, with a buffer for the local +// delivery time itself. We can't actually read to check without undermining +// the test itself unfortunately. +await serverSent.promise; +await delay(10); + +const received = await bytes(stream); +assert.deepStrictEqual(received, expected); + +writer.endSync(); +await stream.closed; +clientSession.close(); +done.resolve(); + +await done.promise; +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-recv-coalescing.mjs b/test/parallel/test-quic-stream-recv-coalescing.mjs new file mode 100644 index 000000000000..c06e7facc830 --- /dev/null +++ b/test/parallel/test-quic-stream-recv-coalescing.mjs @@ -0,0 +1,130 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: receive-side coalescing produces reasonably-sized chunks. +// Sends multiple payloads of varying sizes through a bidi stream and +// verifies that the received chunks are coalesced rather than +// delivered as ~1154-byte QUIC frame fragments. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { drainableProtocol: dp } = await import('stream/iter'); + +// Payloads of varying sizes with diverse prime factors to exercise +// different flow control boundary alignments. Avoids round multiples +// of 1000 so that frame boundaries, accumulation buffer thresholds, +// and flow control windows are hit at irregular offsets. +const payloadSizes = [ + 97, // Small prime: fits in a single frame + 4_999, // Medium prime: a few frames + 65_521, // Largest prime below 64 KB buffer flush threshold + 1_153, // Small prime after large + 196_613, // Large prime: well beyond 64 KB buffer + 509, // Small prime tail +]; +const totalBytes = payloadSizes.reduce((a, b) => a + b, 0); + +// Build deterministic payloads for integrity checking. +function buildPayload(size, seed) { + const buf = new Uint8Array(size); + for (let i = 0; i < size; i++) { + buf[i] = (seed + i) & 0xff; + } + return buf; +} + +function checksum(data) { + let sum = 0; + for (let i = 0; i < data.byteLength; i++) { + sum = (sum + data[i]) | 0; + } + return sum; +} + +// Compute expected checksum across all payloads. +let expectedChecksum = 0; +for (let i = 0; i < payloadSizes.length; i++) { + expectedChecksum = (expectedChecksum + + checksum(buildPayload(payloadSizes[i], i))) | 0; +} + +// --- Server side --- + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const receivedChunkSizes = []; + let receivedBytes = 0; + let receivedChecksum = 0; + + for await (const chunks of stream) { + for (const chunk of chunks) { + receivedChunkSizes.push(chunk.byteLength); + receivedBytes += chunk.byteLength; + receivedChecksum = (receivedChecksum + checksum(chunk)) | 0; + } + } + + // Data integrity. + assert.strictEqual(receivedBytes, totalBytes); + assert.strictEqual(receivedChecksum, expectedChecksum); + + // Coalescing effectiveness: verify that at least some chunks are larger + // than the ~1154-byte QUIC frame payload, showing that the accumulator + // is combining callbacks. On localhost, round-trip latency is near + // zero so coalescing opportunities are limited to I/O bursts where + // multiple packets arrive in the same event loop iteration. Under + // real network conditions the effect is much more pronounced. + const maxChunkSize = Math.max(...receivedChunkSizes); + assert.ok( + maxChunkSize > 1154, + `Expected at least one chunk larger than a single QUIC frame ` + + `(1154 bytes), but max was ${maxChunkSize}` + ); + + // Stats: after full drain, bytes_accumulated should be 0. + assert.strictEqual(stream.stats.bytesAccumulated, 0n); + + // max_bytes_accumulated should be nonzero — data passed through + // the accumulator. + assert.ok( + stream.stats.maxBytesAccumulated > 0n, + 'maxBytesAccumulated should be nonzero' + ); + + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +// --- Client side --- + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); +const w = stream.writer; + +for (let i = 0; i < payloadSizes.length; i++) { + const payload = buildPayload(payloadSizes[i], i); + while (!w.writeSync(payload)) { + const drainable = w[dp](); + if (drainable) await drainable; + } +} +w.endSync(); + +// Drain the server's empty response to let the stream close cleanly. +// eslint-disable-next-line no-unused-vars +for await (const _ of stream) { /* drain response */ } +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-reset-after-data.mjs b/test/parallel/test-quic-stream-reset-after-data.mjs new file mode 100644 index 000000000000..d27abfc514e9 --- /dev/null +++ b/test/parallel/test-quic-stream-reset-after-data.mjs @@ -0,0 +1,65 @@ +// Flags: --experimental-quic --no-warnings + +// Test: resetStream() after all data written but before ACK. +// The stream is in the Data Sent state — all data has been sent +// including FIN, but the peer hasn't acknowledged everything yet. +// Calling resetStream() aborts the stream. The server's onreset +// callback fires with the error code. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); +const serverDone = Promise.withResolvers(); +const serverReady = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall((stream) => { + assert.rejects(stream.closed, (error) => { + assert.strictEqual(error.code, 'ERR_QUIC_APPLICATION_ERROR'); + return true; + }).then(mustCall()); + + stream.onreset = mustCall((error) => { + assert.strictEqual(error.code, 'ERR_QUIC_APPLICATION_ERROR'); + assert.ok(error.message.includes('44')); + serverSession.close(); + serverDone.resolve(); + }); + serverReady.resolve(); + }); +}), { + onerror: mustNotCall(), +}); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Send a small body — it will be sent quickly (including FIN), +// putting the stream in "Data Sent" state. +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('small payload'), +}); + +// Wait for the server to receive the stream before resetting. +await serverReady.promise; + +// Reset after data was written. The data and FIN have been sent +// but may not be fully acknowledged yet. +stream.resetStream(44n); + +await assert.rejects(stream.closed, (error) => { + assert.strictEqual(error.code, 'ERR_QUIC_APPLICATION_ERROR'); + assert.ok(error.message.includes('44')); + return true; +}); + +await serverDone.promise; +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-reset-before-data.mjs b/test/parallel/test-quic-stream-reset-before-data.mjs new file mode 100644 index 000000000000..0a6976aa2e09 --- /dev/null +++ b/test/parallel/test-quic-stream-reset-before-data.mjs @@ -0,0 +1,81 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: resetStream() before any data is written. +// The stream is in the Ready state — no data has been sent by the +// client. The client calls resetStream() which sends RESET_STREAM +// to the server. The server receives the stream via onstream (the +// RESET_STREAM implicitly creates the bidi stream), and onreset +// fires. The server then sends data back on its side of the bidi +// stream, which the client reads — verifying that even when the +// client's send side is reset, the server can still use its send +// side and the client can still receive. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +// quic.stream.reset fires when a stream receives RESET_STREAM from the peer. +dc.subscribe('quic.stream.reset', mustCall((msg) => { + assert.ok(msg.stream, 'stream.reset should include stream'); + assert.ok(msg.session, 'stream.reset should include session'); + assert.ok(msg.error, 'stream.reset should include error'); +})); + +const encoder = new TextEncoder(); +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + stream.onreset = mustCall((error) => { + assert.strictEqual(error.code, 'ERR_QUIC_APPLICATION_ERROR'); + assert.ok(error.message.includes('42')); + + // The client reset its send side, but the server can still + // send data on its side of the bidi stream. + stream.setBody(encoder.encode('response')); + }); + + // The stream's closed promise may reject because the client's + // send side was reset. Either way, clean up. + await assert.rejects(stream.closed, { + code: 'ERR_QUIC_APPLICATION_ERROR', + }); + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address, { + onerror: mustNotCall(), +}); +await clientSession.opened; + +// Create a bidi stream but do NOT write any data. +const stream = await clientSession.createBidirectionalStream(); + +// Reset immediately — no data was ever written. This sends +// RESET_STREAM to the server which implicitly creates the bidi +// stream on the server side. +stream.resetStream(42n); + +// The client should still be able to receive data from the server +// on the readable side of this bidi stream. +const received = await bytes(stream); +assert.deepStrictEqual(Buffer.from(received), Buffer.from('response')); + +// stream.closed rejects with the reset error (the client's send +// side was reset). Verify the error and consume the rejection. +await assert.rejects(stream.closed, { + code: 'ERR_QUIC_APPLICATION_ERROR', + message: /42/, +}); +await serverDone.promise; +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-reset-mid-transfer.mjs b/test/parallel/test-quic-stream-reset-mid-transfer.mjs new file mode 100644 index 000000000000..252944bf2ada --- /dev/null +++ b/test/parallel/test-quic-stream-reset-mid-transfer.mjs @@ -0,0 +1,64 @@ +// Flags: --experimental-quic --no-warnings + +// Test: resetStream() mid-transfer. +// The stream is in the Send state — data is being sent. Calling +// resetStream() aborts the transfer. The server's onreset callback +// fires with the error code. The server may receive partial data +// before the reset. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverDone = Promise.withResolvers(); +const serverReady = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall((stream) => { + assert.rejects(stream.closed, (error) => { + assert.strictEqual(error.code, 'ERR_QUIC_APPLICATION_ERROR'); + return true; + }).then(mustCall()); + + stream.onreset = mustCall((error) => { + assert.strictEqual(error.code, 'ERR_QUIC_APPLICATION_ERROR'); + assert.ok(error.message.includes('43')); + serverSession.close(); + serverDone.resolve(); + }); + serverReady.resolve(); + }); +}), { + // Small flow control window to keep data in flight longer. + transportParams: { initialMaxStreamDataBidiRemote: 256 }, + onerror: mustNotCall(), +}); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Send a large body — with the 256-byte flow control window, the +// transfer will be in progress when we reset. +const stream = await clientSession.createBidirectionalStream(); +stream.setBody(new Uint8Array(8192)); + +// Wait for the server to receive the stream (first STREAM frames). +await serverReady.promise; + +// Reset mid-transfer. +stream.resetStream(43n); + +await assert.rejects(stream.closed, (error) => { + assert.strictEqual(error.code, 'ERR_QUIC_APPLICATION_ERROR'); + assert.ok(error.message.includes('43')); + return true; +}); + +await serverDone.promise; +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-reset-stop.mjs b/test/parallel/test-quic-stream-reset-stop.mjs new file mode 100644 index 000000000000..7a2b8301f1f5 --- /dev/null +++ b/test/parallel/test-quic-stream-reset-stop.mjs @@ -0,0 +1,63 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: RESET_STREAM and STOP_SENDING. +// server's onreset fires with that code. +// NOTE: CTRL-01/CTRL-08 (stopSending with specific code) is tested +// separately because it requires a second endpoint. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const serverDone = Promise.withResolvers(); +const serverReady = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall((stream) => { + // The server's stream.closed will reject when the session is + // gracefully closed after the peer's reset. + assert.rejects(stream.closed, (error) => { + assert.strictEqual(error.code, 'ERR_QUIC_APPLICATION_ERROR'); + return true; + }).then(mustCall()); + + stream.onreset = mustCall((error) => { + // The error is the raw close tuple: [type, code, reason]. + assert.strictEqual(error.code, 'ERR_QUIC_APPLICATION_ERROR'); + assert.ok(error.message.includes('42')); + serverSession.close(); + serverDone.resolve(); + }); + serverReady.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('will be reset'), +}); + +// Wait for the server to receive the stream before resetting. +await serverReady.promise; +stream.resetStream(42n); + +await serverDone.promise; +// After the server closes (sending CONNECTION_CLOSE), the client +// session enters draining and all streams are destroyed. The client's +// stream.closed rejects with the reset code. +await assert.rejects(stream.closed, (error) => { + assert.strictEqual(error.code, 'ERR_QUIC_APPLICATION_ERROR'); + assert.ok(error.message.includes('42')); + return true; +}); +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-setbody-errors.mjs b/test/parallel/test-quic-stream-setbody-errors.mjs new file mode 100644 index 000000000000..a15f2347171e --- /dev/null +++ b/test/parallel/test-quic-stream-setbody-errors.mjs @@ -0,0 +1,61 @@ +// Flags: --experimental-quic --no-warnings + +// Test: setBody throws when body already configured or writer +// already accessed. +// Writer throws ERR_INVALID_STATE if body was already set. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Test 1: setBody after setBody throws. +{ + const stream = await clientSession.createBidirectionalStream(); + stream.setBody(encoder.encode('first')); + + assert.throws(() => stream.setBody(encoder.encode('second')), { + code: 'ERR_INVALID_STATE', + message: /outbound already configured/, + }); + + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +// Test 2: setBody after writer accessed throws. +{ + const stream = await clientSession.createBidirectionalStream(); + // Access the writer — this prevents setBody from being used. + const w = stream.writer; + w.endSync(); + + assert.throws(() => stream.setBody(encoder.encode('data')), { + code: 'ERR_INVALID_STATE', + message: /writer already accessed/, + }); + + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-slow-consumer.mjs b/test/parallel/test-quic-stream-slow-consumer.mjs new file mode 100644 index 000000000000..5f1c2d48eb4e --- /dev/null +++ b/test/parallel/test-quic-stream-slow-consumer.mjs @@ -0,0 +1,56 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: slow consumer applies backpressure. +// With a small flow control window and a large body, the sender +// blocks waiting for the receiver to extend the window. The transfer +// completes when the receiver reads the data. + +import { hasQuic, skip, mustCall, mustCallAtLeast } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const dataLength = 4096; +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(received.byteLength, dataLength); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +}), { + // Small stream window forces the sender to block repeatedly. + transportParams: { initialMaxStreamDataBidiRemote: 256 }, +}); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +let blockedCount = 0; +const stream = await clientSession.createBidirectionalStream(); + +// The actual number of blocks can vary on a range of factors. We're +// only validating that blocking occurs at least once. +stream.onblocked = mustCallAtLeast(() => { + blockedCount++; +}, 1); + +stream.setBody(new Uint8Array(dataLength)); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); + +// The sender should have been blocked multiple times. +assert.ok(blockedCount > 0, `Expected blocking, got ${blockedCount}`); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-stats.mjs b/test/parallel/test-quic-stream-stats.mjs new file mode 100644 index 000000000000..1911e1493f4f --- /dev/null +++ b/test/parallel/test-quic-stream-stats.mjs @@ -0,0 +1,71 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: stream stats fields. +// Verify that stream stats are populated with correct types and +// that bytesReceived/bytesSent reflect actual data transfer. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const payload = encoder.encode('stream stats test data'); +const payloadLength = payload.byteLength; +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const data = await bytes(stream); + assert.strictEqual(data.byteLength, payloadLength); + + // Stream stats should reflect received bytes. + assert.strictEqual(stream.stats.bytesReceived, BigInt(payloadLength)); + assert.strictEqual(typeof stream.stats.createdAt, 'bigint'); + assert.strictEqual(typeof stream.stats.receivedAt, 'bigint'); + + // Send response. + stream.setBody(encoder.encode('response')); + await stream.closed; + + // After close, bytesSent should reflect response. + assert.strictEqual(stream.stats.bytesSent, BigInt('response'.length)); + + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: payload, +}); + +// Stats should have correct types before transfer completes. +assert.strictEqual(typeof stream.stats.createdAt, 'bigint'); +assert.strictEqual(typeof stream.stats.bytesReceived, 'bigint'); +assert.strictEqual(typeof stream.stats.bytesSent, 'bigint'); +assert.strictEqual(typeof stream.stats.maxOffset, 'bigint'); + +// Verify toJSON works. +const json = stream.stats.toJSON(); +assert.ok(json); +assert.strictEqual(typeof json.createdAt, 'string'); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await stream.closed; +await serverDone.promise; + +// After transfer, bytesSent should reflect the payload. +assert.strictEqual(stream.stats.bytesSent, BigInt(payloadLength)); +assert.ok(stream.stats.bytesReceived > 0n); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-stop-sending-callback.mjs b/test/parallel/test-quic-stream-stop-sending-callback.mjs new file mode 100644 index 000000000000..e2eef4b38e03 --- /dev/null +++ b/test/parallel/test-quic-stream-stop-sending-callback.mjs @@ -0,0 +1,58 @@ +// Flags: --experimental-quic --no-warnings + +// A STOP_SENDING callback is emitted only on the endpoint that receives +// the frame. It is distinct from the RESET_STREAM callback. + +import { + hasQuic, + mustCall, + mustNotCall, + skip, +} from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const stopCode = 99n; +const callbackReceived = Promise.withResolvers(); +const resetReceived = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Sending STOP_SENDING locally must not echo an onstopsending callback + // back to this stream. + stream.onstopsending = mustNotCall(); + const closed = assert.rejects(stream.closed, { + code: 'ERR_QUIC_APPLICATION_ERROR', + }); + stream.onreset = mustCall((error) => { + assert.strictEqual(error.errorCode, stopCode); + resetReceived.resolve(); + }); + stream.stopSending(stopCode); + await closed; + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); +stream.onreset = mustNotCall(); +stream.onstopsending = mustCall((error) => { + assert.strictEqual(error.errorCode, stopCode); + assert.strictEqual(stream.writer.canWrite, null); + assert.strictEqual(stream.writer.writeSync(new Uint8Array([2])), false); + callbackReceived.resolve(); +}); + +stream.writer.writeSync(new Uint8Array([1])); +await Promise.all([callbackReceived.promise, resetReceived.promise]); + +clientSession.destroy(); +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-stop-sending-interaction.mjs b/test/parallel/test-quic-stream-stop-sending-interaction.mjs new file mode 100644 index 000000000000..0b3c79d1c130 --- /dev/null +++ b/test/parallel/test-quic-stream-stop-sending-interaction.mjs @@ -0,0 +1,76 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: STOP_SENDING / RESET_STREAM interaction. +// When the peer sends STOP_SENDING, the local sending side is +// notified — the stream closes on the sender side. +// Receiving STOP_SENDING automatically triggers RESET_STREAM +// to the peer (ngtcp2 handles this internally). Verified by +// the server's stream.closed rejecting with the error code. +// The error code from STOP_SENDING is copied to the automatic +// RESET_STREAM — the server's stream.closed rejects with the +// same code that was passed to stopSending(). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); +const stopCode = 77n; + +const serverDone = Promise.withResolvers(); +const clientStreamReady = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + // Wait for the client stream to be fully set up. + await clientStreamReady.promise; + + // Send STOP_SENDING with a specific error code. + stream.stopSending(stopCode); + + // Send data from server to client (the other direction is unaffected). + const w = stream.writer; + w.writeSync(encoder.encode('server data')); + w.endSync(); + + // The server's stream.closed rejects because + // the client automatically sends RESET_STREAM in response to + // STOP_SENDING. The error code matches the STOP_SENDING code. + await assert.rejects(stream.closed, (error) => { + assert.strictEqual(error.code, 'ERR_QUIC_APPLICATION_ERROR'); + assert.ok(error.message.includes(String(stopCode))); + return true; + }); + + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + body: encoder.encode('initial data'), +}); +clientStreamReady.resolve(); + +// Read the server's data. The server→client direction is unaffected +// by STOP_SENDING on the client→server direction. +const received = await bytes(stream); +assert.strictEqual(new TextDecoder().decode(received), 'server data'); + +// The client's stream.closed resolves. The STOP_SENDING caused +// the client's write side to end (ngtcp2 sends RESET_STREAM +// automatically), but from the client's JS perspective the stream +// completed: the read side got FIN from the server, and the write +// side was handled internally by ngtcp2. stream.closed only rejects +// on the side that receives the RESET_STREAM (the server). +await Promise.all([stream.closed, serverDone.promise, clientSession.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-uni-basic.mjs b/test/parallel/test-quic-stream-uni-basic.mjs new file mode 100644 index 000000000000..97eae68f08c6 --- /dev/null +++ b/test/parallel/test-quic-stream-uni-basic.mjs @@ -0,0 +1,63 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: basic unidirectional stream data transfer. +// The client creates a unidirectional stream with a body. The server reads +// the data and verifies integrity. The unidirectional stream is write-only +// on the client side and read-only on the server side. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const message = 'unidirectional payload'; +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); +const body = encoder.encode(message); +const expected = encoder.encode(message); + +const done = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + assert.strictEqual(stream.direction, 'uni'); + + const received = await bytes(stream); + assert.deepStrictEqual(received, expected); + assert.strictEqual(decoder.decode(received), message); + + // The server side of a remote unidirectional stream is not writable. + // The writer should be pre-closed (canWrite returns null). + const w = stream.writer; + assert.strictEqual(w.canWrite, null); + assert.strictEqual(w.endSync(), 0); + + await stream.closed; + serverSession.close(); + done.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createUnidirectionalStream({ body }); +assert.strictEqual(stream.direction, 'uni'); + +// The client-side uni stream is write-only — async iteration yields nothing. +const iter = stream[Symbol.asyncIterator](); +const { done: iterDone } = await iter.next(); +assert.strictEqual(iterDone, true); + +await done.promise; +// The server closed its session, delivering CONNECTION_CLOSE to the client. +// The client session enters the draining period, after which all streams +// and the session itself close cleanly. +await stream.closed; +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-uni-no-onstream.mjs b/test/parallel/test-quic-stream-uni-no-onstream.mjs new file mode 100644 index 000000000000..82960ecf626d --- /dev/null +++ b/test/parallel/test-quic-stream-uni-no-onstream.mjs @@ -0,0 +1,45 @@ +// Flags: --experimental-quic --no-warnings +// Test: client-initiated unidirectional stream with no onstream +// The client creates a uni stream with no onstream. +// Verify that this causes no crash. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { createPrivateKey } = await import('node:crypto'); +const { listen, connect } = await import('../common/quic.mjs'); + +const serverKey = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const serverCert = fixtures.readKey('agent1-cert.pem'); + +const done = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (session) => { + await session.opened; + done.resolve(); +}), { + sni: { '*': { keys: [serverKey], certs: [serverCert] } }, + alpn: ['repro'], +}); + +const clientSession = await connect(serverEndpoint.address, { + servername: 'localhost', + alpn: 'repro', + ca: serverCert, +}); + +await clientSession.opened; + +await clientSession.createUnidirectionalStream({ + body: 'something something darkside', +}); + +await done.promise; + +await clientSession.close(); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-uni-server-initiated.mjs b/test/parallel/test-quic-stream-uni-server-initiated.mjs new file mode 100644 index 000000000000..c4403a8dc85c --- /dev/null +++ b/test/parallel/test-quic-stream-uni-server-initiated.mjs @@ -0,0 +1,56 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: server-initiated unidirectional stream. +// The server creates a uni stream and sends data to the client. +// The client receives the data via its onstream handler and verifies +// integrity. The receiving side should not have a usable writer. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const message = 'server uni stream data'; +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); +const expected = encoder.encode(message); + +const done = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + + const stream = await serverSession.createUnidirectionalStream({ + body: encoder.encode(message), + }); + + // Uni stream has no readable side for the sender. + await stream.closed; +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +clientSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + + assert.deepStrictEqual(received, expected); + assert.strictEqual(decoder.decode(received), message); + + // The receiving side of a uni stream should not be writable. + // The writer should be pre-closed. + const w = stream.writer; + assert.strictEqual(w.canWrite, null); + + await stream.closed; + clientSession.close(); + done.resolve(); +}); + +await done.promise; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-write-partial-view.mjs b/test/parallel/test-quic-stream-write-partial-view.mjs new file mode 100644 index 000000000000..0fcd8eea69f8 --- /dev/null +++ b/test/parallel/test-quic-stream-write-partial-view.mjs @@ -0,0 +1,70 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// writer.writeSync() must not detach the caller's underlying +// ArrayBuffer. The bytes from each write are copied into an internal +// buffer, so the caller's source ArrayBuffer remains live and may be +// reused, mutated, or sliced into additional views — including +// successive subarrays of the same Uint8Array. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +// Eight bytes split into two 4-byte halves. +const source = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]); +const sourceCopy = source.slice(); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + // Server receives the original 8 bytes in order, regardless of + // any caller-side mutation that happens after writeSync returns. + assert.strictEqual(received.length, sourceCopy.length); + for (let i = 0; i < sourceCopy.length; i++) { + assert.strictEqual(received[i], sourceCopy[i], + `byte ${i} mismatch: got ${received[i]}, ` + + `expected ${sourceCopy[i]}`); + } + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); +const writer = stream.writer; + +// First half. The underlying ArrayBuffer must stay live after the +// write so that the caller can build the next view from it. +writer.writeSync(source.subarray(0, 4)); +assert.strictEqual(source.buffer.detached, false); // source ArrayBuffer must not be detached after writeSync +assert.strictEqual(source.byteLength, 8); // Source view must remain usable after writeSync + +// Second half — slicing into the same backing buffer must succeed. +writer.writeSync(source.subarray(4, 8)); +assert.strictEqual(source.buffer.detached, false); // source ArrayBuffer must remain live after second writeSync + +// The C++ layer has already copied the bytes by the time writeSync +// returned. Mutating the source here must not affect the data the +// peer ultimately observes. +for (let i = 0; i < source.length; i++) source[i] = 0; +assert.ok(source.every((b) => b === 0), 'source mutation should succeed'); + +writer.endSync(); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-writer-api.mjs b/test/parallel/test-quic-stream-writer-api.mjs new file mode 100644 index 000000000000..009cb4ff8a4a --- /dev/null +++ b/test/parallel/test-quic-stream-writer-api.mjs @@ -0,0 +1,142 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: writer API methods (WRIT-02, WRIT-03, WRIT-04, WRIT-06, +// WRIT-07, WRIT-08, WRIT-12, WRIT-15). +// Uses a single endpoint with multiple streams, one per test. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); + +const totalStreams = 5; +const serverResults = []; +const allDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + serverResults.push(received); + stream.writer.endSync(); + await stream.closed; + + if (serverResults.length === totalStreams) { + serverSession.close(); + allDone.resolve(); + } + }, totalStreams); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// write() async +{ + const stream = await clientSession.createBidirectionalStream(); + const w = stream.writer; + await w.write(encoder.encode('async write')); + const n = w.endSync(); + assert.strictEqual(n, 11); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +// writevSync() vectored write +{ + const stream = await clientSession.createBidirectionalStream(); + const w = stream.writer; + const result = w.writevSync([ + encoder.encode('hello '), + encoder.encode('writev'), + ]); + assert.strictEqual(result, true); + const n = w.endSync(); + assert.strictEqual(n, 12); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +// writev() async vectored write +{ + const stream = await clientSession.createBidirectionalStream(); + const w = stream.writer; + await w.writev([ + encoder.encode('async '), + encoder.encode('writev'), + ]); + const n = w.endSync(); + assert.strictEqual(n, 12); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +// end() async close +{ + const stream = await clientSession.createBidirectionalStream(); + const w = stream.writer; + w.writeSync(encoder.encode('end async')); + const n = await w.end(); + assert.strictEqual(n, 9); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +{ + const stream = await clientSession.createBidirectionalStream(); + const w = stream.writer; + // canWrite should be a boolean (false initially before flow + // control window opens, or true if the window is already open). + assert.strictEqual(typeof w.canWrite, 'boolean'); + assert.ok(w.canWrite !== null, `canWrite should not be null, got ${w.canWrite}`); + // drainableProtocol should return null when canWrite is true (has capacity), + // or a promise when canWrite is false (backpressured). Either way, it + // should not throw. + const { drainableProtocol: dp } = await import('stream/iter'); + const drain = w[dp](); + assert.ok(drain === null || drain instanceof Promise); + w.writeSync(encoder.encode('capacity')); + w.endSync(); + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + await stream.closed; +} + +// Return null when errored. +{ + const stream = await clientSession.createBidirectionalStream(); + const w = stream.writer; + const testError = new Error('writer fail test'); + w.fail(testError); + // After fail, canWrite is null. + assert.strictEqual(w.canWrite, null); + // drainableProtocol returns null when errored. + const { drainableProtocol: dp } = await import('stream/iter'); + assert.strictEqual(w[dp](), null); + // endSync after fail returns -1 (errored). + assert.strictEqual(w.endSync(), -1); + // WriteSync after fail returns false. + assert.strictEqual(w.writeSync(encoder.encode('x')), false); + // Write after fail throws with the original error. + await assert.rejects(w.write(encoder.encode('x')), testError); + // Don't await stream.closed here — the reset stream may not trigger + // server onstream (no data was sent before fail), so the server + // won't count it. The stream is cleaned up when the session closes. +} + +await allDone.promise; +await clientSession.close(); +await serverEndpoint.close(); + +// Verify server received the right data. +const decoder = new TextDecoder(); +assert.strictEqual(decoder.decode(serverResults[0]), 'async write'); +assert.strictEqual(decoder.decode(serverResults[1]), 'hello writev'); +assert.strictEqual(decoder.decode(serverResults[2]), 'async writev'); +assert.strictEqual(decoder.decode(serverResults[3]), 'end async'); +assert.strictEqual(decoder.decode(serverResults[4]), 'capacity'); diff --git a/test/parallel/test-quic-stream-writer-dispose.mjs b/test/parallel/test-quic-stream-writer-dispose.mjs new file mode 100644 index 000000000000..577294aa99eb --- /dev/null +++ b/test/parallel/test-quic-stream-writer-dispose.mjs @@ -0,0 +1,48 @@ +// Flags: --experimental-quic --no-warnings + +// Test: writer Symbol.dispose. +// Symbol.dispose calls fail() if the writer is not already closed/errored. +// After disposal, the writer is in an errored state. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const transportParams = { maxIdleTimeout: 1 }; + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + // The server session will close via idle timeout because the client + // resets the stream before any data is sent. + await serverSession.closed; +}), { transportParams }); + +const clientSession = await connect(serverEndpoint.address, { + transportParams, +}); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); +const w = stream.writer; + +// Writer is active — canWrite should be a boolean (not null). +assert.strictEqual(typeof w.canWrite, 'boolean'); + +// Symbol.dispose calls fail() if not already closed/errored. +w[Symbol.dispose](); + +// After dispose, writer should be errored. +assert.strictEqual(w.canWrite, null); +assert.strictEqual(w.writeSync(encoder.encode('x')), false); + +// stream.closed resolves because fail() with default code 0 +// is treated as a clean close (no error). +// The session will close via idle timeout or CONNECTION_CLOSE. +await Promise.all([stream.closed, clientSession.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-writer-fail-error-code.mjs b/test/parallel/test-quic-stream-writer-fail-error-code.mjs new file mode 100644 index 000000000000..36e1310b560c --- /dev/null +++ b/test/parallel/test-quic-stream-writer-fail-error-code.mjs @@ -0,0 +1,94 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: stream writer.fail() emits a RESET_STREAM with a non-zero +// application error code instead of the previously hard-coded 0n. +// +// Two cases are exercised against the test fixture's non-h3 ALPN +// (`quic-test`), which selects the C++ DefaultApplication and exposes +// `internalErrorCode === 0x1n` (NGTCP2_INTERNAL_ERROR) via session +// state: +// +// 1. `writer.fail(plainError)` — peer receives RESET_STREAM with the +// session's `internalErrorCode` (`0x1`), proving the hard-coded +// `0n` regression is gone and that the C++ -> JS state plumbing +// surfaces the application's code. +// 2. `writer.fail(new QuicError('msg', { errorCode: 0x42n }))` — +// peer receives RESET_STREAM with the explicit code, proving +// the QuicError fast path. +// +// The peer-side observation goes through `stream.onreset(err)` where +// `err` is `ERR_QUIC_APPLICATION_ERROR` exposing the wire code on +// `err.errorCode` (a BigInt). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { QuicError } = await import('node:quic'); + +function wireCodeOf(err) { + assert.strictEqual(err.code, 'ERR_QUIC_APPLICATION_ERROR'); + return err.errorCode; +} + +// Server: capture the next two streams. Each stream receives an +// onreset handler synchronously inside onstream so the C++ -> JS +// dispatch ordering (data packet -> reset packet) finds the handler +// already attached. +const expectedCodes = [0x1n, 0x42n]; +let nextStreamIndex = 0; +const allDone = Promise.withResolvers(); +const observed = []; + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const i = nextStreamIndex++; + stream.onreset = mustCall((err) => { + observed[i] = wireCodeOf(err); + if (observed.length === expectedCodes.length && + observed[0] !== undefined && observed[1] !== undefined) { + allDone.resolve(); + } + }); + + // The peer's reset causes stream.closed to reject. + await assert.rejects(stream.closed, { + code: 'ERR_QUIC_APPLICATION_ERROR', + }); + }, 2); +})); + +const clientSession = await connect(serverEndpoint.address, { + verifyPeer: 'manual', +}); +await clientSession.opened; + +// 1. Plain Error -> session.internalErrorCode (0x1n for non-h3). +{ + const stream = await clientSession.createBidirectionalStream(); + const writer = stream.writer; + // Write a tiny chunk to guarantee the server-side stream is + // created via onstream before the RESET_STREAM frame arrives. + writer.writeSync('x'); + writer.fail(new Error('plain error reason')); +} + +// 2. QuicError with explicit code -> peer sees that exact code. +{ + const stream = await clientSession.createBidirectionalStream(); + const writer = stream.writer; + writer.writeSync('y'); + writer.fail(new QuicError('explicit code', { errorCode: 0x42n })); +} + +await allDone.promise; + +assert.strictEqual(observed[0], expectedCodes[0]); +assert.strictEqual(observed[1], expectedCodes[1]); + +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-stream-zero-length.mjs b/test/parallel/test-quic-stream-zero-length.mjs new file mode 100644 index 000000000000..d7af2cf30f0a --- /dev/null +++ b/test/parallel/test-quic-stream-zero-length.mjs @@ -0,0 +1,40 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: zero-length stream via setBody(null). +// Creates a stream with no body, then calls setBody(null) which sends +// FIN immediately. The server receives zero bytes. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(received.byteLength, 0); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); +stream.setBody(null); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-test-client.mjs b/test/parallel/test-quic-test-client.mjs new file mode 100644 index 000000000000..8a8ffdd67f70 --- /dev/null +++ b/test/parallel/test-quic-test-client.mjs @@ -0,0 +1,42 @@ +// Flags: --experimental-quic +import { hasQuic, isAIX, isIBMi, isWindows, skip } from '../common/index.mjs'; +import assert from 'node:assert'; +import { existsSync } from 'node:fs'; +import { resolve } from 'node:path'; + +if (!hasQuic) { + skip('QUIC support is not enabled'); +} +if (isAIX) { + // AIX does not support some of the networking features used in the ngtcp2 + // example server and client. + skip('QUIC third-party tests are disabled on AIX'); +} +if (isIBMi) { + // IBM i does not support some of the networking features used in the ngtcp2 + // example server and client. + skip('QUIC third-party tests are disabled on IBM i'); +} +if (isWindows) { + // Windows does not support the [Li/U]nix specific headers and system calls + // required by the ngtcp2 example server/client. + skip('QUIC third-party tests are disabled on Windows'); +} +if (!existsSync(resolve(process.execPath, '../ngtcp2_test_client'))) { + skip('ngtcp2_test_client binary not built'); +} + +const { default: QuicTestClient } = await import('../common/quic/test-client.mjs'); + +const client = new QuicTestClient(); + +// If this completes without throwing, the test passes. +await client.help({ stdio: 'ignore' }); + +setTimeout(() => { + client.stop(); +}, 100); + +// We expect this to fail since there's no server running. +await assert.rejects(client.run('localhost', '12345', undefined, { stdio: 'ignore' }), + { message: /Process exited with code 1 and signal null/ }); diff --git a/test/parallel/test-quic-test-server.mjs b/test/parallel/test-quic-test-server.mjs new file mode 100644 index 000000000000..84dbff6b2d69 --- /dev/null +++ b/test/parallel/test-quic-test-server.mjs @@ -0,0 +1,44 @@ +// Flags: --experimental-quic +import { hasQuic, isAIX, isIBMi, isWindows, skip } from '../common/index.mjs'; +import { existsSync } from 'node:fs'; +import { resolve } from 'node:path'; + +if (!hasQuic) { + skip('QUIC support is not enabled'); +} +if (isAIX) { + // AIX does not support some of the networking features used in the ngtcp2 + // example server and client. + skip('QUIC third-party tests are disabled on AIX'); +} +if (isIBMi) { + // IBM i does not support some of the networking features used in the ngtcp2 + // example server and client. + skip('QUIC third-party tests are disabled on IBM i'); +} +if (isWindows) { + // Windows does not support the [Li/U]nix specific headers and system calls + // required by the ngtcp2 example server/client. + skip('QUIC third-party tests are disabled on Windows'); +} +if (!existsSync(resolve(process.execPath, '../ngtcp2_test_server'))) { + skip('ngtcp2_test_server binary not built'); +} + +const { default: QuicTestServer } = await import('../common/quic/test-server.mjs'); +const fixtures = await import('../common/fixtures.mjs'); + +const server = new QuicTestServer(); +const fixturesPath = fixtures.path(); + +// If this completes without throwing, the test passes. +await server.help({ stdio: 'ignore' }); + +setTimeout(() => { + server.stop(); +}, 100); + +await server.run('localhost', '12345', + `${fixturesPath}/keys/agent1-key.pem`, + `${fixturesPath}/keys/agent1-cert.pem`, + { stdio: 'inherit' }); diff --git a/test/parallel/test-quic-tls-ca.mjs b/test/parallel/test-quic-tls-ca.mjs new file mode 100644 index 000000000000..99ea2076bae4 --- /dev/null +++ b/test/parallel/test-quic-tls-ca.mjs @@ -0,0 +1,47 @@ +// Flags: --experimental-quic --no-warnings + +// Test: custom CA certificate chain. +// The client provides a CA cert that matches the server's cert, +// allowing validation to succeed. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const ca = fixtures.readKey('ca1-cert.pem'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + const info = await serverSession.opened; + assert.strictEqual(info.protocol, 'quic-test'); + serverSession.close(); +}), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], +}); + +// Client provides the CA cert. The validation error should be different +// (or absent) compared to when no CA is provided. +const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + servername: 'localhost', + verifyPeer: 'manual', + ca, +}); + +const info = await clientSession.opened; +assert.strictEqual(info.protocol, 'quic-test'); +// The CA option is accepted. Validation may or may not succeed +// depending on the cert chain. The important thing is the +// handshake completed and the option was used. + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-tls-crl.mjs b/test/parallel/test-quic-tls-crl.mjs new file mode 100644 index 000000000000..3538d689ca7f --- /dev/null +++ b/test/parallel/test-quic-tls-crl.mjs @@ -0,0 +1,77 @@ +// Flags: --experimental-quic --no-warnings + +// Test: CRL (certificate revocation list) enforcement. +// A server using a non-revoked certificate succeeds when the client +// provides a CRL. A server using the same certificate reports +// "certificate revoked" in the validation error when the client +// provides a CRL that revokes it. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const ca2Cert = fixtures.readKey('ca2-cert.pem'); +const ca2Crl = fixtures.readKey('ca2-crl.pem'); +const ca2CrlAgent3 = fixtures.readKey('ca2-crl-agent3.pem'); +const agent3Key = createPrivateKey(fixtures.readKey('agent3-key.pem')); +const agent3Cert = fixtures.readKey('agent3-cert.pem'); + +// --- Non-revoked: agent3 with original CRL (doesn't list agent3) --- +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + await serverSession.close(); + }), { + sni: { '*': { keys: [agent3Key], certs: [agent3Cert] } }, + alpn: ['quic-test'], + }); + + const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + ca: [ca2Cert], + crl: [ca2Crl], + }); + + // Should succeed — agent3 is NOT in the original CRL. + const info = await clientSession.opened; + assert.strictEqual(clientSession.destroyed, false); + // No revocation error. + assert.ok(!info.validationErrorReason || + !info.validationErrorReason.includes('revoked')); + await clientSession.close(); + await serverEndpoint.close(); +} + +// --- Revoked: agent3 with CRL that revokes agent3 --- +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + await serverSession.close(); + }), { + sni: { '*': { keys: [agent3Key], certs: [agent3Cert] } }, + alpn: ['quic-test'], + }); + + const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + ca: [ca2Cert], + crl: [ca2CrlAgent3], + }); + + // The connection currently succeeds but the validation error + // reports "certificate revoked". This verifies the CRL is loaded + // and checked. + const info = await clientSession.opened; + assert.strictEqual(info.validationErrorReason, 'certificate revoked'); + await clientSession.close(); + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-tls-keylog.mjs b/test/parallel/test-quic-tls-keylog.mjs new file mode 100644 index 000000000000..19117df95361 --- /dev/null +++ b/test/parallel/test-quic-tls-keylog.mjs @@ -0,0 +1,64 @@ +// Flags: --experimental-quic --no-warnings + +// Test: keylog callback. +// When keylog: true, TLS key material is delivered to the +// session.onkeylog callback during the handshake for both +// client and server sessions. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const clientLines = []; +const serverLines = []; + +const expectedLabels = [ + 'CLIENT_HANDSHAKE_TRAFFIC_SECRET', + 'SERVER_HANDSHAKE_TRAFFIC_SECRET', + 'CLIENT_TRAFFIC_SECRET_0', + 'SERVER_TRAFFIC_SECRET_0', +]; + +function assertKeylogLines(lines, side) { + assert.ok(lines.length > 0, `Expected ${side} keylog lines, got ${lines.length}`); + + for (const line of lines) { + assert.strictEqual(typeof line, 'string', + `Each ${side} keylog line should be a string`); + } + + const joined = lines.join(''); + for (const label of expectedLabels) { + assert.ok(joined.includes(label), + `Expected ${side} keylog to contain ${label}`); + } +} + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + serverSession.close(); +}), { + keylog: true, + onkeylog(line) { + serverLines.push(line); + }, +}); + +const clientSession = await connect(serverEndpoint.address, { + keylog: true, + onkeylog(line) { + clientLines.push(line); + }, +}); + +await clientSession.opened; +await clientSession.closed; +await serverEndpoint.close(); + +assertKeylogLines(clientLines, 'client'); +assertKeylogLines(serverLines, 'server'); diff --git a/test/parallel/test-quic-tls-options.mjs b/test/parallel/test-quic-tls-options.mjs new file mode 100644 index 000000000000..36adc5799336 --- /dev/null +++ b/test/parallel/test-quic-tls-options.mjs @@ -0,0 +1,82 @@ +// Flags: --experimental-quic --no-warnings + +// Test: custom TLS ciphers and groups. +// Custom ciphers option on the server/client. +// Custom groups option on the server/client. +// Default ciphers/groups used when not specified. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect, constants } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); + +// Custom ciphers. Use a specific TLS 1.3 cipher suite. +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + const info = await serverSession.opened; + assert.strictEqual(typeof info.cipher, 'string'); + assert.ok(info.cipher.includes('AES_256_GCM')); + serverSession.close(); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + ciphers: 'TLS_AES_256_GCM_SHA384', + }); + + const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + servername: 'localhost', + ciphers: 'TLS_AES_256_GCM_SHA384', + }); + + const info = await clientSession.opened; + assert.ok(info.cipher.includes('AES_256_GCM')); + assert.strictEqual(info.cipherVersion, 'TLSv1.3'); + + await clientSession.closed; + await serverEndpoint.close(); +} + +// Custom groups. Use a specific key exchange group. +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + serverSession.close(); + }), { + sni: { '*': { keys: [key], certs: [cert] } }, + alpn: ['quic-test'], + groups: 'P-256', + }); + + const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + servername: 'localhost', + groups: 'P-256', + }); + + const info = await clientSession.opened; + // The handshake should succeed with the specified group. + assert.strictEqual(info.cipherVersion, 'TLSv1.3'); + + await clientSession.closed; + await serverEndpoint.close(); +} + +// Default ciphers/groups are non-empty strings from constants. +{ + assert.strictEqual(typeof constants.DEFAULT_CIPHERS, 'string'); + assert.ok(constants.DEFAULT_CIPHERS.length > 0); + assert.strictEqual(typeof constants.DEFAULT_GROUPS, 'string'); + assert.ok(constants.DEFAULT_GROUPS.length > 0); +} diff --git a/test/parallel/test-quic-tls-trace.mjs b/test/parallel/test-quic-tls-trace.mjs new file mode 100644 index 000000000000..996bcf509aef --- /dev/null +++ b/test/parallel/test-quic-tls-trace.mjs @@ -0,0 +1,31 @@ +// Flags: --experimental-quic --no-warnings + +// Test: TLS trace output. +// When tlsTrace: true is set, the session produces TLS debug +// output on stderr. Verify the option is accepted without error +// and the connection succeeds. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + await serverSession.close(); +}), { + tlsTrace: true, +}); + +const clientSession = await connect(serverEndpoint.address, { + tlsTrace: true, +}); +await clientSession.opened; +assert.strictEqual(clientSession.destroyed, false); + +await clientSession.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-tls-verify-client.mjs b/test/parallel/test-quic-tls-verify-client.mjs new file mode 100644 index 000000000000..46f0808c34a3 --- /dev/null +++ b/test/parallel/test-quic-tls-verify-client.mjs @@ -0,0 +1,86 @@ +// Flags: --experimental-quic --no-warnings + +// Test: client certificate verification. +// With verifyClient: true, a client that provides a valid +// certificate succeeds. +// With verifyClient: true, a client that does NOT provide a +// certificate fails the handshake. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const serverKey = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const serverCert = fixtures.readKey('agent1-cert.pem'); +const clientKey = createPrivateKey(fixtures.readKey('agent2-key.pem')); +const clientCert = fixtures.readKey('agent2-cert.pem'); + +// --- TLS-03: Client provides a certificate — handshake succeeds --- +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + // The server should see the client's certificate. + assert.ok(serverSession.peerCertificate); + await serverSession.close(); + }), { + sni: { '*': { keys: [serverKey], certs: [serverCert] } }, + alpn: ['quic-test'], + verifyClient: true, + // Trust the client's self-signed certificate. + ca: [clientCert], + }); + + const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + keys: [clientKey], + certs: [clientCert], + }); + + await Promise.all([clientSession.opened, clientSession.closed]); + await serverEndpoint.close(); +} + +// --- TLS-04: Client does NOT provide a certificate — connection fails --- +// In TLS 1.3, client certificate verification happens post-handshake. +// The client's opened promise may resolve (handshake completes), but +// the server then sends a fatal alert (certificate_required) which +// closes both sides with a transport error. +{ + const serverEndpoint = await listen(mustCall(async (serverSession) => { + await assert.rejects(serverSession.closed, { + code: 'ERR_QUIC_TRANSPORT_ERROR', + }); + }), { + sni: { '*': { keys: [serverKey], certs: [serverCert] } }, + alpn: ['quic-test'], + verifyClient: true, + onerror: mustCall((err) => { + assert.strictEqual(err.code, 'ERR_QUIC_TRANSPORT_ERROR'); + }), + }); + + // Client connects WITHOUT providing a certificate. + const clientSession = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + onerror: mustCall((err) => { + assert.strictEqual(err.code, 'ERR_QUIC_TRANSPORT_ERROR'); + }), + }); + + // The client's closed promise rejects with the transport error + // from the server's certificate_required alert. + await assert.rejects(clientSession.closed, { + code: 'ERR_QUIC_TRANSPORT_ERROR', + }); + + await serverEndpoint.close(); +} diff --git a/test/parallel/test-quic-token-distinct.mjs b/test/parallel/test-quic-token-distinct.mjs new file mode 100644 index 000000000000..57c5d5185993 --- /dev/null +++ b/test/parallel/test-quic-token-distinct.mjs @@ -0,0 +1,48 @@ +// Flags: --experimental-quic --no-warnings + +// Test: two clients receive distinct NEW_TOKEN tokens. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +let token1; +let token2; +const gotToken1 = Promise.withResolvers(); +const gotToken2 = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.closed; +}, 2)); + +// Client 1. +const cs1 = await connect(serverEndpoint.address, { + onnewtoken: mustCall((token) => { + token1 = Buffer.from(token); + gotToken1.resolve(); + }), +}); +await Promise.all([cs1.opened, gotToken1.promise]); +assert.ok(token1.length > 0); + +// Client 2. +const cs2 = await connect(serverEndpoint.address, { + onnewtoken: mustCall((token) => { + token2 = Buffer.from(token); + gotToken2.resolve(); + }), +}); +await Promise.all([cs2.opened, gotToken2.promise]); +assert.ok(token2.length > 0); + +// Tokens should be distinct. +assert.notDeepStrictEqual(token1, token2); + +await cs1.close(); +await cs2.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-token-expired.mjs b/test/parallel/test-quic-token-expired.mjs new file mode 100644 index 000000000000..a3b4aaefb697 --- /dev/null +++ b/test/parallel/test-quic-token-expired.mjs @@ -0,0 +1,67 @@ +// Flags: --experimental-quic --no-warnings + +// Test: expired NEW_TOKEN is rejected. +// The server issues a NEW_TOKEN with a short tokenExpiration. After +// the token expires, the client provides it on reconnect. The server +// should reject it (the token is invalid) and fall back to Retry +// flow for address validation. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; +import { setTimeout } from 'node:timers/promises'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const sni = { '*': { keys: [key], certs: [cert] } }; +const alpn = ['quic-test']; + +let savedToken; +const gotToken = Promise.withResolvers(); + +// Server with a very short token expiration (1 second). +const serverEndpoint = await listen((serverSession) => { + serverSession.onstream = mustNotCall(); +}, { + sni, + alpn, + endpoint: { tokenExpiration: 1 }, +}); + +// First connection: receive the token. +const cs1 = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + onnewtoken: mustCall((token) => { + savedToken = token; + gotToken.resolve(); + }), +}); +await Promise.all([cs1.opened, gotToken.promise]); +assert.ok(savedToken.length > 0); +await cs1.close(); + +// Wait for the token to expire. +await setTimeout(1500); + +// Second connection with the expired token. The server should reject +// the token and fall back to Retry for address validation. The +// connection should still succeed (Retry is transparent). +const cs2 = await connect(serverEndpoint.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + token: savedToken, +}); +await cs2.opened; +// The connection succeeded despite the expired token. +assert.strictEqual(cs2.destroyed, false); +await cs2.close(); + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-token-reuse.mjs b/test/parallel/test-quic-token-reuse.mjs new file mode 100644 index 000000000000..3454eb03f051 --- /dev/null +++ b/test/parallel/test-quic-token-reuse.mjs @@ -0,0 +1,60 @@ +// Flags: --experimental-quic --no-warnings + +// Test: client reuses NEW_TOKEN on reconnect. +// The server sends a NEW_TOKEN after handshake. The client saves it +// and provides it in the token option on a subsequent connection to +// the same server. The second connection should succeed. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +let savedToken; +const gotToken = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall((stream) => { + stream.writer.endSync(); + serverSession.close(); + }); +}, 2), { + onerror() {}, +}); + +// First connection: receive the token. +const cs1 = await connect(serverEndpoint.address, { + onnewtoken: mustCall((token) => { + assert.ok(Buffer.isBuffer(token)); + assert.ok(token.length > 0); + savedToken = token; + gotToken.resolve(); + }), +}); +await Promise.all([cs1.opened, gotToken.promise]); + +// Signal the server to close this session. +const s1 = await cs1.createBidirectionalStream(); +s1.writer.endSync(); +for await (const _ of s1) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([s1.closed, cs1.closed]); + +// Second connection: reuse the token. The connection should succeed. +const cs2 = await connect(serverEndpoint.address, { + token: savedToken, +}); +await cs2.opened; + +// Verify data transfer works on the second connection. +const s2 = await cs2.createBidirectionalStream(); +s2.writer.endSync(); +for await (const _ of s2) { /* drain */ } // eslint-disable-line no-unused-vars +await s2.closed; + +// Close from the client side. +await cs2.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-token-secret.mjs b/test/parallel/test-quic-token-secret.mjs new file mode 100644 index 000000000000..2523a5c2c268 --- /dev/null +++ b/test/parallel/test-quic-token-secret.mjs @@ -0,0 +1,90 @@ +// Flags: --experimental-quic --no-warnings + +// Test: tokenSecret cross-endpoint token validation. +// Two server endpoints with the same tokenSecret should accept each +// other's NEW_TOKEN tokens. A token from a server with a different +// tokenSecret should be rejected (falls back to Retry). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey, randomBytes } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const sni = { '*': { keys: [key], certs: [cert] } }; +const alpn = ['quic-test']; + +const sharedSecret = randomBytes(16); + +let savedToken; +const gotToken = Promise.withResolvers(); + +// First server with shared tokenSecret. +const ep1 = await listen(async (serverSession) => { + await serverSession.closed; +}, { + sni, + alpn, + endpoint: { tokenSecret: sharedSecret }, +}); + +// Get a token from the first server. +const cs1 = await connect(ep1.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + onnewtoken: mustCall((token) => { + savedToken = token; + gotToken.resolve(); + }), +}); +await Promise.all([cs1.opened, gotToken.promise]); +assert.ok(savedToken.length > 0); +await cs1.close(); +await ep1.close(); + +// Second server with the SAME tokenSecret. The token from ep1 +// should be accepted, allowing the connection to skip Retry. +const ep2 = await listen(async (serverSession) => { + await serverSession.closed; +}, { + sni, + alpn, + endpoint: { tokenSecret: sharedSecret }, +}); + +const cs2 = await connect(ep2.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + token: savedToken, +}); +await cs2.opened; +assert.strictEqual(cs2.destroyed, false); +await cs2.close(); +await ep2.close(); + +// Third server with a DIFFERENT tokenSecret. The token from ep1 +// should be rejected. The connection still succeeds (Retry fallback). +const ep3 = await listen(async (serverSession) => { + await serverSession.closed; +}, { + sni, + alpn, + endpoint: { tokenSecret: randomBytes(16) }, +}); + +const cs3 = await connect(ep3.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + token: savedToken, +}); +await cs3.opened; +assert.strictEqual(cs3.destroyed, false); +await cs3.close(); +await ep3.close(); diff --git a/test/parallel/test-quic-transport-params-validation.mjs b/test/parallel/test-quic-transport-params-validation.mjs new file mode 100644 index 000000000000..594f80a60e4d --- /dev/null +++ b/test/parallel/test-quic-transport-params-validation.mjs @@ -0,0 +1,72 @@ +// Flags: --experimental-quic --no-warnings + +// Test: transport parameter validation. +// Transport parameters are validated by ngtcp2 at connection time. +// Node.js validates the type (must be a number) but ngtcp2 validates +// the ranges. Verify that invalid types are rejected and valid +// values are accepted. + +import { hasQuic, skip, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen } = await import('node:quic'); +const { createPrivateKey } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const sni = { '*': { keys: [key], certs: [cert] } }; +const alpn = ['quic-test']; + +async function tryListen(sessionOpts) { + return listen(mustNotCall(), { sni, alpn, ...sessionOpts }); +} + +// Invalid types for transport params are rejected. +for (const param of [ + 'initialMaxStreamDataBidiLocal', + 'initialMaxStreamDataBidiRemote', + 'initialMaxStreamDataUni', + 'initialMaxData', + 'initialMaxStreamsBidi', + 'initialMaxStreamsUni', + 'maxIdleTimeout', + 'activeConnectionIDLimit', + 'ackDelayExponent', + 'maxAckDelay', +]) { + await assert.rejects(tryListen({ + transportParams: { [param]: 'invalid' }, + }), { + code: 'ERR_INVALID_ARG_VALUE', + }, `${param} should reject string value`); + + await assert.rejects(tryListen({ + transportParams: { [param]: -1 }, + }), { + code: 'ERR_INVALID_ARG_VALUE', + }, `${param} should reject negative value`); +} + +// Valid values are accepted. +const ep = await tryListen({ + transportParams: { + initialMaxStreamDataBidiLocal: 65536, + initialMaxStreamDataBidiRemote: 65536, + initialMaxStreamDataUni: 65536, + initialMaxData: 1048576, + initialMaxStreamsBidi: 100, + initialMaxStreamsUni: 3, + maxIdleTimeout: 30, + activeConnectionIDLimit: 4, + ackDelayExponent: 3, + maxAckDelay: 25, + maxDatagramFrameSize: 1200, + }, +}); +assert.ok(ep); +await ep.close(); diff --git a/test/parallel/test-quic-version-negotiation-oversized-cid.mjs b/test/parallel/test-quic-version-negotiation-oversized-cid.mjs new file mode 100644 index 000000000000..91d8d08daabc --- /dev/null +++ b/test/parallel/test-quic-version-negotiation-oversized-cid.mjs @@ -0,0 +1,87 @@ +// Flags: --experimental-quic --no-warnings + +// Regression test for an unauthenticated remote crash in the QUIC Version +// Negotiation path. +// +// ngtcp2_pkt_decode_version_cid() does not clamp the connection ID lengths +// to NGTCP2_MAX_CIDLEN (20) when the packet's version is unsupported -- it +// returns the raw single-byte length fields from the wire, which can be up +// to 255. Endpoint::Receive() used to build CID objects (each backed by a +// fixed 20-byte buffer) directly from those lengths before any bound check, +// so a single crafted UDP datagram with an oversized DCID/SCID length would +// overflow the buffer and abort the process before the handshake. +// +// This test sends such a datagram directly with node:dgram and asserts the +// endpoint drops it without crashing, while a well-formed unsupported-version +// datagram still produces exactly one Version Negotiation response. + +import { hasQuic, skip, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { createSocket } = await import('node:dgram'); +const { listen } = await import('../common/quic.mjs'); + +// A long-header QUIC packet must be at least NGTCP2_MAX_UDP_PAYLOAD_SIZE +// (1200) bytes for an unsupported version to decode as a VN trigger. +const PACKET_SIZE = 1200; + +// Build a QUIC long-header packet with an unsupported version and the given +// DCID/SCID lengths. Lengths greater than 20 are only expressible because the +// on-wire length field is a single byte (0-255). +function buildLongHeaderPacket(dcidLen, scidLen) { + const packet = Buffer.alloc(PACKET_SIZE); + // Header form bit (0x80) + fixed bit (0x40). + packet[0] = 0xc0; + // Version 0x0a0a0a0a: nonzero (so it is not a real VN packet) and not a + // version Node supports, which forces the NGTCP2_ERR_VERSION_NEGOTIATION + // decode path. + packet.writeUInt32BE(0x0a0a0a0a, 1); + packet[5] = dcidLen; // DCID length byte + // DCID bytes occupy [6, 6 + dcidLen); SCID length byte follows them. + packet[6 + dcidLen] = scidLen; + // Remaining bytes stay zero-filled as padding to reach PACKET_SIZE. + return packet; +} + +// No handshake ever completes: the test only sends raw datagrams, so the +// session callback must never fire. +const serverEndpoint = await listen(mustNotCall()); +const { address, port } = serverEndpoint.address; + +const socket = createSocket('udp4'); + +function send(packet) { + return new Promise((resolve, reject) => { + socket.send(packet, port, address, (err) => { + if (err) reject(err); + else resolve(); + }); + }); +} + +// 1. Oversized DCID (21 > NGTCP2_MAX_CIDLEN). Before the fix this aborted the +// process. After the fix it must be dropped silently. +await send(buildLongHeaderPacket(21, 0)); + +// 2. A well-formed unsupported-version packet with valid (<= 20 byte) CIDs. +// This must still elicit exactly one Version Negotiation response, proving +// the fix did not break legitimate version negotiation. +await send(buildLongHeaderPacket(8, 8)); + +// Poll until the valid packet has been processed into a VN response. +const deadline = Date.now() + 2000; +while (serverEndpoint.stats.versionNegotiationCount === 0n) { + if (Date.now() > deadline) break; + await new Promise((resolve) => setTimeout(resolve, 25)); +} + +// Exactly one VN response: the oversized packet was dropped (not crashed, not +// negotiated), the valid packet was negotiated. +assert.strictEqual(serverEndpoint.stats.versionNegotiationCount, 1n); + +socket.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-version-negotiation.mjs b/test/parallel/test-quic-version-negotiation.mjs new file mode 100644 index 000000000000..c64c3b273b98 --- /dev/null +++ b/test/parallel/test-quic-version-negotiation.mjs @@ -0,0 +1,76 @@ +// Flags: --experimental-quic --no-warnings + +// Test: version negotiation. +// Version mismatch triggers version negotiation. +// Client receives ERR_QUIC_VERSION_NEGOTIATION_ERROR. +// quic.session.version.negotiation diagnostics channel fires. +// The client connects with an unsupported version number. The server +// responds with a Version Negotiation packet. The client's closed +// promise rejects with ERR_QUIC_VERSION_NEGOTIATION_ERROR. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const bogusVersion = 0x1a1a1a1a; + +// Subscribe to the version negotiation diagnostics channel. +const channelFired = Promise.withResolvers(); +dc.subscribe('quic.session.version.negotiation', mustCall((msg) => { + assert.ok(msg.session, 'message should have session'); + assert.strictEqual(msg.version, bogusVersion); + assert.ok(Array.isArray(msg.requestedVersions), + 'requestedVersions should be an array'); + assert.ok(msg.requestedVersions.length > 0, + 'server should advertise at least one version'); + assert.ok(Array.isArray(msg.supportedVersions), + 'supportedVersions should be an array'); + channelFired.resolve(); +})); + +const serverEndpoint = await listen(async (serverSession) => { + // The server should never create a session for an unsupported version. + assert.fail('Server session callback should not be called'); +}); + +const clientSession = await connect(serverEndpoint.address, { + reuseEndpoint: false, + // Use an unsupported version to trigger version negotiation. + version: bogusVersion, + // The onversionnegotiation callback fires with version info. + onversionnegotiation: mustCall((version, requestedVersions, + supportedVersions) => { + // The version is the bogus version we configured. + assert.strictEqual(version, bogusVersion); + // requestedVersions are the versions the server advertised in + // the Version Negotiation packet. + assert.ok(Array.isArray(requestedVersions), + 'requestedVersions should be an array'); + assert.ok(requestedVersions.length > 0, + 'server should advertise at least one supported version'); + // supportedVersions is our local supported range [min, max]. + assert.ok(Array.isArray(supportedVersions), + 'supportedVersions should be an array'); + assert.strictEqual(supportedVersions.length, 2); + }), + // The onerror callback fires with the version negotiation error. + onerror: mustCall((err) => { + assert.strictEqual(err.code, 'ERR_QUIC_VERSION_NEGOTIATION_ERROR'); + }), +}); + +// The closed promise rejects with ERR_QUIC_VERSION_NEGOTIATION_ERROR. +await assert.rejects(clientSession.closed, { + code: 'ERR_QUIC_VERSION_NEGOTIATION_ERROR', +}); + +// Wait for the diagnostics channel to fire. +await channelFired.promise; + +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-version.mjs b/test/parallel/test-quic-version.mjs new file mode 100644 index 000000000000..3ae64f5988b9 --- /dev/null +++ b/test/parallel/test-quic-version.mjs @@ -0,0 +1,43 @@ +// Flags: --experimental-quic --no-warnings + +// Test: QUIC version selection. +// QUIC v1 handshake succeeds. +// QUIC v2 handshake succeeds. +// Both V1 and V2 are advertised in preferred/available versions. +// Version negotiation upgrades V1 → V2 when both sides support it. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall(async (serverSession) => { + await serverSession.opened; + await serverSession.close(); + serverDone.resolve(); +})); + +// Default handshake uses v1 initial packets. +// The session should complete successfully. +const cs = await connect(serverEndpoint.address); +const info = await cs.opened; + +// The cipher and protocol should be negotiated. +assert.strictEqual(typeof info.cipher, 'string'); +assert.strictEqual(info.cipherVersion, 'TLSv1.3'); +assert.strictEqual(info.protocol, 'quic-test'); + +// Both V1 and V2 are in preferred/available versions +// (configured in Session::Config). The compatible version negotiation +// (RFC 9368) should upgrade to V2 when both sides support it. +// We verify the handshake succeeded — the version negotiation +// happens transparently. + +await Promise.all([serverDone.promise, cs.closed]); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-writer-abort-signal.mjs b/test/parallel/test-quic-writer-abort-signal.mjs new file mode 100644 index 000000000000..6b0ba9f68ae5 --- /dev/null +++ b/test/parallel/test-quic-writer-abort-signal.mjs @@ -0,0 +1,49 @@ +// Flags: --experimental-quic --no-warnings + +// Test: write with aborted signal rejects immediately. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import * as assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); +const w = stream.writer; + +// Create an already-aborted signal. +const signal = AbortSignal.abort(new Error('already aborted')); + +// write() with an already-aborted signal should reject immediately. +await assert.rejects( + w.write(encoder.encode('data'), { signal }), + { message: 'already aborted' }, +); + +// The writer should still be usable for normal writes. +w.writeSync(encoder.encode('ok')); +w.endSync(); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-writer-async-dispose-ended.mjs b/test/parallel/test-quic-writer-async-dispose-ended.mjs new file mode 100644 index 000000000000..04337343ea87 --- /dev/null +++ b/test/parallel/test-quic-writer-async-dispose-ended.mjs @@ -0,0 +1,46 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: Symbol.asyncDispose only fails if writable side not ended. +// If the writer was already ended (via endSync/end), asyncDispose +// should not fail — it's a no-op. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +const encoder = new TextEncoder(); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream(); +const w = stream.writer; + +// End the writer normally. +w.writeSync(encoder.encode('data')); +w.endSync(); + +// After end, asyncDispose should be a no-op (writer already ended). +await w[Symbol.asyncDispose](); + +// The stream should close cleanly. +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-writer-backpressure.mjs b/test/parallel/test-quic-writer-backpressure.mjs new file mode 100644 index 000000000000..253fc24024ea --- /dev/null +++ b/test/parallel/test-quic-writer-backpressure.mjs @@ -0,0 +1,79 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: writer backpressure. +// writeSync returns false when budget is exceeded. +// drainableProtocol returns promise when canWrite is false. +// drainableProtocol promise resolves when drain fires. +// Try-fallback pattern: writeSync false, await drain, retry. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes, drainableProtocol: dp } = await import('stream/iter'); + +// Total data: 8 x 1KB = 8KB. budget: 2KB. +const numChunks = 8; +const chunkSize = 1024; +const totalSize = numChunks * chunkSize; + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + const received = await bytes(stream); + assert.strictEqual(received.byteLength, totalSize); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +const stream = await clientSession.createBidirectionalStream({ + budget: 2048, +}); +const w = stream.writer; + +// Initial canWrite should be true. +assert.strictEqual(w.canWrite, true); +assert.strictEqual(stream.budget, 2048); + +let backpressureCount = 0; + +for (let i = 0; i < numChunks; i++) { + const chunk = new Uint8Array(chunkSize); + chunk.fill(i & 0xFF); + while (!w.writeSync(chunk)) { + // writeSync returned false. + backpressureCount++; + + // drainableProtocol returns a promise when backpressured. + const drain = w[dp](); + assert.ok(drain instanceof Promise, 'drainableProtocol should return a Promise'); + + // The promise resolves when drain fires. + await drain; + + // After drain, canWrite should be true. + assert.ok(w.canWrite === true, `canWrite after drain should be true, got ${w.canWrite}`); + } +} + +w.endSync(); + +// Backpressure should have been hit with a 2KB budget +// and 1KB chunks (every 2 chunks fills the buffer). +assert.ok(backpressureCount > 0, 'backpressure should have been hit'); + +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-writer-write-rejects.mjs b/test/parallel/test-quic-writer-write-rejects.mjs new file mode 100644 index 000000000000..c29c63c075b2 --- /dev/null +++ b/test/parallel/test-quic-writer-write-rejects.mjs @@ -0,0 +1,63 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: write() rejects when flow-controlled. +// The async write() method rejects with ERR_INVALID_STATE when the +// chunk exceeds capacity (canWrite is false). + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes, drainableProtocol: dp } = await import('stream/iter'); + +const serverDone = Promise.withResolvers(); + +const serverEndpoint = await listen(mustCall((serverSession) => { + serverSession.onstream = mustCall(async (stream) => { + await bytes(stream); + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + serverDone.resolve(); + }); +})); + +const clientSession = await connect(serverEndpoint.address); +await clientSession.opened; + +// Use a small budget to trigger backpressure easily. +const stream = await clientSession.createBidirectionalStream({ + budget: 1024, +}); +const w = stream.writer; + +// Fill the buffer. +assert.strictEqual(w.writeSync(new Uint8Array(1024)), true); + +// canWrite should now be false. +assert.strictEqual(w.canWrite, false); + +// Async write() should reject when buffer is full. +await assert.rejects( + w.write(new Uint8Array(512)), + { code: 'ERR_INVALID_STATE' }, +); + +// Wait for drain, then write should succeed. +const drain = w[dp](); +assert.ok(drain instanceof Promise); +await drain; +assert.ok(w.canWrite === true); + +// Now write succeeds. +await w.write(new Uint8Array(100)); + +w.endSync(); +for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([stream.closed, serverDone.promise]); +await clientSession.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-zero-rtt-datagram.mjs b/test/parallel/test-quic-zero-rtt-datagram.mjs new file mode 100644 index 000000000000..02a44a3e6b38 --- /dev/null +++ b/test/parallel/test-quic-zero-rtt-datagram.mjs @@ -0,0 +1,79 @@ +// Flags: --experimental-quic --no-warnings + +// Test: 0-RTT with datagrams. +// The client sends a datagram as 0-RTT data in the first flight. +// The server receives it with the early flag set on the ondatagram +// callback. The datagram's early parameter should be true. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +let savedTicket; +let savedToken; +const gotTicket = Promise.withResolvers(); +const gotToken = Promise.withResolvers(); + +let earlyDatagramReceived = false; +let receivedDatagramData; +const serverGotDatagram = Promise.withResolvers(); + +let serverSessionCount = 0; +const serverEndpoint = await listen((serverSession) => { + const sessionNum = ++serverSessionCount; + if (sessionNum === 2) { + serverSession.ondatagram = (data, early) => { + receivedDatagramData = Buffer.from(data); + earlyDatagramReceived = early; + serverGotDatagram.resolve(); + }; + } +}, { + transportParams: { maxDatagramFrameSize: 1200 }, +}); + +// --- First connection: receive session ticket and token --- +const cs1 = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, + onsessionticket: mustCall((ticket) => { + assert.ok(Buffer.isBuffer(ticket)); + savedTicket = ticket; + gotTicket.resolve(); + }), + onnewtoken: mustCall((token) => { + assert.ok(Buffer.isBuffer(token)); + savedToken = token; + gotToken.resolve(); + }), +}); + +await cs1.opened; +await Promise.all([gotTicket.promise, gotToken.promise]); +await cs1.close(); + +// --- Second connection: send datagram as 0-RTT --- +const cs2 = await connect(serverEndpoint.address, { + transportParams: { maxDatagramFrameSize: 1200 }, + sessionTicket: savedTicket, + token: savedToken, +}); + +// Send datagram BEFORE the handshake completes — true 0-RTT. +await cs2.sendDatagram(new Uint8Array([0xCA, 0xFE])); + +const info2 = await cs2.opened; +assert.strictEqual(info2.earlyDataAttempted, true); +assert.strictEqual(info2.earlyDataAccepted, true); + +// Verify the server received the datagram as early data. +await serverGotDatagram.promise; +assert.deepStrictEqual(receivedDatagramData, Buffer.from([0xCA, 0xFE])); +assert.strictEqual(earlyDatagramReceived, true); + +await cs2.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-zero-rtt-disabled-client.mjs b/test/parallel/test-quic-zero-rtt-disabled-client.mjs new file mode 100644 index 000000000000..245761e05521 --- /dev/null +++ b/test/parallel/test-quic-zero-rtt-disabled-client.mjs @@ -0,0 +1,58 @@ +// Flags: --experimental-quic --no-warnings + +// Test: 0-RTT not attempted when client sets enableEarlyData: false +// Even with a valid session ticket and token, the client should not +// attempt 0-RTT when enableEarlyData is false. The opened info +// should show earlyDataAttempted: false. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); + +let savedTicket; +let savedToken; +const gotTicket = Promise.withResolvers(); +const gotToken = Promise.withResolvers(); + +const serverEndpoint = await listen((serverSession) => { + serverSession.onstream = async (stream) => { + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + }; +}); + +// First connection: get ticket and token. +const cs1 = await connect(serverEndpoint.address, { + onsessionticket: mustCall((ticket) => { + savedTicket = ticket; + gotTicket.resolve(); + }), + onnewtoken: mustCall((token) => { + savedToken = token; + gotToken.resolve(); + }), +}); +await Promise.all([cs1.opened, gotTicket.promise, gotToken.promise]); +await cs1.close(); + +// Second connection: provide ticket and token but disable early data. +const cs2 = await connect(serverEndpoint.address, { + sessionTicket: savedTicket, + token: savedToken, + enableEarlyData: false, +}); + +const info2 = await cs2.opened; +// 0-RTT should NOT be attempted. +assert.strictEqual(info2.earlyDataAttempted, false); +assert.strictEqual(info2.earlyDataAccepted, false); + +await cs2.close(); +await serverEndpoint.close(); diff --git a/test/parallel/test-quic-zero-rtt-disabled-server.mjs b/test/parallel/test-quic-zero-rtt-disabled-server.mjs new file mode 100644 index 000000000000..c2164d7c8b35 --- /dev/null +++ b/test/parallel/test-quic-zero-rtt-disabled-server.mjs @@ -0,0 +1,92 @@ +// Flags: --experimental-quic --no-warnings + +// Test: Server rejects 0-RTT when enableEarlyData: false. +// The client has a valid session ticket and token, and attempts 0-RTT. +// The server has enableEarlyData: false, so it rejects the early data. +// The connection should still succeed (fallback to 1-RTT), and +// earlyDataAccepted should be false. + +import { hasQuic, skip, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey, randomBytes } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const sni = { '*': { keys: [key], certs: [cert] } }; +const alpn = ['quic-test']; + +// Use the same tokenSecret for both servers so the token is valid. +const tokenSecret = randomBytes(16); + +let savedTicket; +let savedToken; +const gotTicket = Promise.withResolvers(); +const gotToken = Promise.withResolvers(); + +// First server: enableEarlyData: true (default) to generate a valid ticket. +const serverEndpoint1 = await listen((serverSession) => { + serverSession.onstream = async (stream) => { + for await (const _ of stream) { /* drain */ } // eslint-disable-line no-unused-vars + stream.writer.endSync(); + await stream.closed; + serverSession.close(); + }; +}, { + sni, + alpn, + endpoint: { tokenSecret }, +}); + +const cs1 = await connect(serverEndpoint1.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + onsessionticket(ticket) { + savedTicket = ticket; + gotTicket.resolve(); + }, + onnewtoken(token) { + savedToken = token; + gotToken.resolve(); + }, +}); +await Promise.all([cs1.opened, gotTicket.promise, gotToken.promise]); +await cs1.close(); +await serverEndpoint1.close(); + +// Second server: enableEarlyData: false — rejects 0-RTT. +const serverEndpoint2 = await listen(async (serverSession) => { + await serverSession.opened; + serverSession.close(); + await serverSession.closed; +}, { + sni, + alpn, + enableEarlyData: false, + endpoint: { tokenSecret }, + onerror: mustNotCall(), +}); + +const cs2 = await connect(serverEndpoint2.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + sessionTicket: savedTicket, + token: savedToken, +}); + +// The deferred handshake needs a send to trigger. Use sendDatagram +// since it's simpler than a stream for this test. +await cs2.sendDatagram(new Uint8Array([1])); + +const info2 = await cs2.opened; +assert.strictEqual(info2.earlyDataAttempted, true); +assert.strictEqual(info2.earlyDataAccepted, false); + +await cs2.closed; +await serverEndpoint2.close(); diff --git a/test/parallel/test-quic-zero-rtt-rejected-settings.mjs b/test/parallel/test-quic-zero-rtt-rejected-settings.mjs new file mode 100644 index 000000000000..912f9d94e410 --- /dev/null +++ b/test/parallel/test-quic-zero-rtt-rejected-settings.mjs @@ -0,0 +1,110 @@ +// Flags: --experimental-quic --no-warnings + +// Test: 0-RTT rejected when server settings change. +// The client has a session ticket from a server with generous +// transport params. The server restarts with reduced params +// (smaller initialMaxStreamsBidi). The 0-RTT should be rejected +// because the stored transport params are more permissive than +// the current ones. The connection falls back to 1-RTT. + +import { hasQuic, skip, mustCall, mustNotCall } from '../common/index.mjs'; +import assert from 'node:assert'; +import dc from 'node:diagnostics_channel'; +import * as fixtures from '../common/fixtures.mjs'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('node:quic'); +const { createPrivateKey, randomBytes } = await import('node:crypto'); + +const key = createPrivateKey(fixtures.readKey('agent1-key.pem')); +const cert = fixtures.readKey('agent1-cert.pem'); +const sni = { '*': { keys: [key], certs: [cert] } }; +const alpn = ['quic-test']; +const tokenSecret = randomBytes(16); + +// quic.session.early.rejected fires when 0-RTT is rejected. +dc.subscribe('quic.session.early.rejected', mustCall((msg) => { + assert.ok(msg.session, 'early.rejected should include session'); +})); + +let savedTicket; +let savedToken; +const gotTicket = Promise.withResolvers(); +const gotToken = Promise.withResolvers(); + +// First server: generous transport params. +const ep1 = await listen(async (serverSession) => { + await serverSession.closed; +}, { + sni, + alpn, + endpoint: { tokenSecret }, + transportParams: { + initialMaxStreamsBidi: 100, + initialMaxData: 1048576, + }, +}); + +const cs1 = await connect(ep1.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + onsessionticket: mustCall((ticket) => { + savedTicket = ticket; + gotTicket.resolve(); + }), + onnewtoken: mustCall((token) => { + savedToken = token; + gotToken.resolve(); + }), +}); +await Promise.all([cs1.opened, gotTicket.promise, gotToken.promise]); +await cs1.close(); +await ep1.close(); + +// Second server: reduced transport params. +// initialMaxStreamsBidi reduced from 100 to 10. +const serverStreamSeen = Promise.withResolvers(); +const ep2 = await listen((serverSession) => { + serverSession.onstream = (stream) => { + // The stream may be destroyed by EarlyDataRejected before + // we can process it. Just record that we saw it. + serverStreamSeen.resolve(true); + }; +}, { + sni, + alpn, + endpoint: { tokenSecret }, + transportParams: { + initialMaxStreamsBidi: 10, + initialMaxData: 1048576, + }, + onerror: mustNotCall(), +}); + +const cs2 = await connect(ep2.address, { + alpn: 'quic-test', + verifyPeer: 'manual', + sessionTicket: savedTicket, + token: savedToken, + onerror: mustNotCall(), + onearlyrejected() {}, +}); + +// Trigger the deferred handshake. +const encoder = new TextEncoder(); +await cs2.createBidirectionalStream({ + body: encoder.encode('test'), +}); + +const info2 = await cs2.opened; +// 0-RTT was attempted but rejected due to changed transport params. +assert.strictEqual(info2.earlyDataAttempted, true); +assert.strictEqual(info2.earlyDataAccepted, false); + +// The 0-RTT stream may have been destroyed by EarlyDataRejected. +// Close from the client side. +await cs2.close(); +await ep2.close(); diff --git a/test/parallel/test-quic-zero-rtt.mjs b/test/parallel/test-quic-zero-rtt.mjs new file mode 100644 index 000000000000..e97c90391bcc --- /dev/null +++ b/test/parallel/test-quic-zero-rtt.mjs @@ -0,0 +1,110 @@ +// Flags: --experimental-quic --experimental-stream-iter --no-warnings + +// Test: 0-RTT session resumption. +// First connection receives a session ticket and NEW_TOKEN. +// Second connection uses both the session ticket and token. +// The token skips address validation (Retry), the session +// ticket enables 0-RTT encryption. The client sends data +// BEFORE the handshake completes (true 0-RTT). The server's +// onstream fires and the stream's early flag is true. + +import { hasQuic, skip, mustCall } from '../common/index.mjs'; +import assert from 'node:assert'; + +if (!hasQuic) { + skip('QUIC is not enabled'); +} + +const { listen, connect } = await import('../common/quic.mjs'); +const { bytes } = await import('stream/iter'); + +const encoder = new TextEncoder(); + +let savedTicket; +let savedToken; +const gotTicket = Promise.withResolvers(); +const gotToken = Promise.withResolvers(); + +let firstStreamEarly; +let secondStreamEarly; +const secondStreamDone = Promise.withResolvers(); + +let serverSessionCount = 0; +const serverEndpoint = await listen(mustCall((serverSession) => { + const sessionNum = ++serverSessionCount; + serverSession.onstream = mustCall((stream) => + bytes(stream).then((data) => { + assert.ok(data.byteLength > 0); + + if (sessionNum === 1) { + firstStreamEarly = stream.early; + } else { + secondStreamEarly = stream.early; + secondStreamDone.resolve(); + } + + stream.writer.endSync(); + return stream.closed; + + }).then(mustCall(() => serverSession.close())) + ); +}, 2)); + +// --- ZRTT-01: First connection — receive the session ticket and token --- +const cs1 = await connect(serverEndpoint.address, { + onsessionticket: mustCall((ticket) => { + assert.ok(Buffer.isBuffer(ticket)); + assert.ok(ticket.length > 0); + savedTicket = ticket; + gotTicket.resolve(); + }, 2), + onnewtoken: mustCall((token) => { + assert.ok(Buffer.isBuffer(token)); + assert.ok(token.length > 0); + savedToken = token; + gotToken.resolve(); + }), +}); + +const info1 = await cs1.opened; +assert.strictEqual(info1.earlyDataAttempted, false); +assert.strictEqual(info1.earlyDataAccepted, false); + +await Promise.all([gotTicket.promise, gotToken.promise]); + +// Send data to verify the connection works. +const s1 = await cs1.createBidirectionalStream({ + body: encoder.encode('first'), +}); +for await (const _ of s1) { /* drain */ } // eslint-disable-line no-unused-vars +await Promise.all([s1.closed, cs1.closed]); + +// --- ZRTT-02: Second connection — 0-RTT with ticket + token --- +// The token skips Retry (address validation), the session ticket +// enables 0-RTT encryption. With the deferred handshake, the +// stream data is included in the first flight as 0-RTT. +const cs2 = await connect(serverEndpoint.address, { + sessionTicket: savedTicket, + token: savedToken, +}); + +// Send data BEFORE the handshake completes — true 0-RTT. +const s2 = await cs2.createBidirectionalStream(); +await s2.writer.write(encoder.encode('early data')); + +// Now wait for handshake completion. +const info2 = await cs2.opened; +assert.strictEqual(info2.earlyDataAttempted, true); +assert.strictEqual(info2.earlyDataAccepted, true); + +await s2.writer.end(); +for await (const _ of s2) { /* drain */ } // eslint-disable-line no-unused-vars +await s2.closed; + +// Verify the server saw the early data flag. +await secondStreamDone.promise; +assert.strictEqual(firstStreamEarly, false); +assert.strictEqual(secondStreamEarly, true); + +await cs2.closed; +await serverEndpoint.close(); diff --git a/test/parallel/test-repl-custom-eval.js b/test/parallel/test-repl-custom-eval.js index 190e1c573aa1..88419ec6a6c6 100644 --- a/test/parallel/test-repl-custom-eval.js +++ b/test/parallel/test-repl-custom-eval.js @@ -75,7 +75,7 @@ describe('repl with custom eval', { concurrency: true }, () => { delete global.foo; }); - it('inherits variables from the global context but does not use it afterwords if `useGlobal` is false', async () => { + it('inherits variables from the global context but does not use it afterwards if `useGlobal` is false', async () => { global.bar = 'global_bar'; const context = await new Promise((resolve) => { const { replServer } = startNewREPLServer({ diff --git a/test/parallel/test-require-package-map.js b/test/parallel/test-require-package-map.js new file mode 100644 index 000000000000..87786d62738a --- /dev/null +++ b/test/parallel/test-require-package-map.js @@ -0,0 +1,379 @@ +'use strict'; + +const common = require('../common'); +const fixtures = require('../common/fixtures'); +const assert = require('node:assert'); +const { spawnSync } = require('node:child_process'); +const { symlinkSync, writeFileSync } = require('node:fs'); +const path = require('node:path'); +const { describe, it } = require('node:test'); +const { pathToFileURL } = require('node:url'); +const tmpdir = require('../common/tmpdir'); + +tmpdir.refresh(); + +const packageMapPath = fixtures.path('package-map/package-map.json'); + +// Generated at runtime because file:// URLs must be absolute, making them machine-dependent. +const fileUrlFixturePath = tmpdir.resolve('package-map-file-url.json'); +writeFileSync(fileUrlFixturePath, JSON.stringify({ + packages: { + 'root': { + url: pathToFileURL(fixtures.path('package-map/root')).href, + dependencies: { 'dep-a': 'dep-a' }, + }, + 'dep-a': { + url: pathToFileURL(fixtures.path('package-map/dep-a')).href, + dependencies: {}, + }, + }, +})); + +describe('CJS: --experimental-package-map', { concurrency: !process.env.TEST_PARALLEL }, () => { + + describe('basic resolution', () => { + it('resolves require() through package map', () => { + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', packageMapPath, + '-e', + `const dep = require('dep-a'); console.log(dep.default);`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /dep-a-value/); + assert.strictEqual(status, 0, stderr); + }); + + it('resolves subpath require()', () => { + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', packageMapPath, + '-e', + `const util = require('dep-a/lib/util'); console.log(util.default);`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /dep-a-util/); + assert.strictEqual(status, 0, stderr); + }); + + it('resolves transitive dependencies', () => { + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', packageMapPath, + '-e', + `const depB = require('dep-b'); console.log(depB.default);`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /dep-b using dep-a-value/); + assert.strictEqual(status, 0, stderr); + }); + }); + + describe('resolution boundaries', () => { + it('falls back for builtin modules', () => { + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', packageMapPath, + '-e', + `const fs = require('fs'); console.log(typeof fs.readFileSync);`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /function/); + assert.strictEqual(status, 0, stderr); + }); + + it('throws when parent not in map', () => { + const { status, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', packageMapPath, + '-e', + `require('dep-a');`, + ], { + cwd: tmpdir.path, + encoding: 'utf8', + }); + + assert.match(stderr, /ERR_PACKAGE_MAP_EXTERNAL_FILE/); + assert.notStrictEqual(status, 0, stderr); + }); + }); + + describe('error handling', () => { + it('throws for invalid JSON', () => { + const { status, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', + fixtures.path('package-map/package-map-invalid-syntax.json'), + '-e', + `require('dep-a');`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.match(stderr, /ERR_PACKAGE_MAP_INVALID/); + assert.notStrictEqual(status, 0, stderr); + }); + + it('throws for missing packages field', () => { + const { status, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', + fixtures.path('package-map/package-map-invalid-schema.json'), + '-e', + `require('dep-a');`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.match(stderr, /ERR_PACKAGE_MAP_INVALID/); + assert.notStrictEqual(status, 0, stderr); + }); + + it('throws for unsupported URL scheme in url', () => { + const { status, stderr } = spawnSync(process.execPath, [ + '--experimental-package-map', + fixtures.path('package-map/package-map-https-path.json'), + '-e', + `require('dep-a');`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.match(stderr, /ERR_PACKAGE_MAP_INVALID/); + assert.match(stderr, /unsupported URL scheme/); + assert.match(stderr, /https:\/\//); + assert.notStrictEqual(status, 0, stderr); + }); + + it('accepts file:// URLs in url', () => { + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', fileUrlFixturePath, + '-e', + `const dep = require('dep-a'); console.log(dep.default);`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /dep-a-value/); + assert.strictEqual(status, 0, stderr); + }); + + it('throws for duplicate package URLs', () => { + const { status, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', + fixtures.path('package-map/package-map-duplicate-path.json'), + '-e', + `require('dep-a');`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.match(stderr, /ERR_PACKAGE_MAP_INVALID/); + assert.match(stderr, /pkg-a/); + assert.match(stderr, /pkg-b/); + assert.notStrictEqual(status, 0, stderr); + }); + }); + + describe('conditional exports', () => { + it('respects require condition in exports', () => { + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', packageMapPath, + '-e', + `const dep = require('dep-a'); console.log(dep.format);`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /cjs/); // Should get CJS export + assert.strictEqual(status, 0, stderr); + }); + }); + + describe('disabled by default', () => { + it('has no impact when flag not set', () => { + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '-e', + `const fs = require('fs'); console.log('ok');`, + ], { + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /ok/); + assert.strictEqual(status, 0, stderr); + }); + }); + + describe('path containment edge cases', () => { + it('does not match pkg-other as being inside pkg', () => { + // Regression test: pkg-other (at ./pkg-other) should not be + // incorrectly matched as inside pkg (at ./pkg) just because + // the string "./pkg-other" starts with "./pkg" + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', + fixtures.path('package-map/package-map-path-prefix.json'), + '-e', + `const pkg = require('pkg'); console.log(pkg.default);`, + ], { + cwd: fixtures.path('package-map/pkg-other'), + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /pkg-value/); + assert.strictEqual(status, 0, stderr); + }); + }); + + describe('external package paths', () => { + it('resolves packages outside the package map directory via relative paths', () => { + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', + fixtures.path('package-map/nested-project/package-map-external-deps.json'), + '-e', + `const dep = require('dep-a'); console.log(dep.default);`, + ], { + cwd: fixtures.path('package-map/nested-project/src'), + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /dep-a-value/); + assert.strictEqual(status, 0, stderr); + }); + }); + + describe('same request resolves to different versions', () => { + const versionForkMap = fixtures.path('package-map/package-map-version-fork.json'); + + it('resolves the same bare specifier to different packages depending on the importer', () => { + // app-18 and app-19 both require 'react', but the package map wires + // them to react@18 and react@19 respectively. + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', versionForkMap, + '-e', + `const app18 = require('app-18'); const app19 = require('app-19'); console.log(app18.default); console.log(app19.default);`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /app-18 using react 18/); + assert.match(stdout, /app-19 using react 19/); + assert.strictEqual(status, 0, stderr); + }); + }); + + describe('longest path wins', () => { + const longestPathMap = fixtures.path('package-map/package-map-longest-path.json'); + + it('resolves from createRequire() paths with mixed separators', () => { + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', longestPathMap, + '-e', + `const { createRequire } = require('node:module'); const req = createRequire(process.cwd() + '/node_modules/inner/index.js'); const dep = req('dep-a'); console.log(dep.default);`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /dep-a-value/); + assert.strictEqual(status, 0, stderr); + }); + + it('resolves nested package using its own dependencies, not the parent', () => { + // Inner lives at ./root/node_modules/inner which is inside root's + // path (./root). The longest matching path should win, so code in + // inner should resolve dep-a (inner's dep), not be treated as root. + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', longestPathMap, + '-e', + `const inner = require('inner'); console.log(inner.default);`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /inner using dep-a-value/); + assert.strictEqual(status, 0, stderr); + }); + + it('falls back for undeclared dependency in nested package parent', () => { + // Root does not list dep-a in its dependencies, so requiring it + // from root should fail with MODULE_NOT_FOUND. + const { status, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', longestPathMap, + '-e', + `require('dep-a');`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.match(stderr, /Cannot find module/); + assert.notStrictEqual(status, 0); + }); + }); + + describe('symlink in ancestor of package map', { + skip: !common.canCreateSymLink() && 'insufficient privileges for symlinks', + }, () => { + const symlinkDir = tmpdir.resolve('symlinked-package-map-cjs'); + symlinkSync(fixtures.path('package-map'), symlinkDir, 'dir'); + + it('resolves through a symlinked ancestor directory', () => { + const symlinkMapPath = path.join(symlinkDir, 'package-map.json'); + const { status, stdout, stderr } = spawnSync(process.execPath, [ + '--no-warnings', + '--experimental-package-map', symlinkMapPath, + '-e', + `const dep = require('dep-a'); console.log(dep.default);`, + ], { + cwd: fixtures.path('package-map/root'), + encoding: 'utf8', + }); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /dep-a-value/); + assert.strictEqual(status, 0, stderr); + }); + }); +}); diff --git a/test/parallel/test-runner-entry-file.mjs b/test/parallel/test-runner-entry-file.mjs new file mode 100644 index 000000000000..94750e6a745e --- /dev/null +++ b/test/parallel/test-runner-entry-file.mjs @@ -0,0 +1,59 @@ +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { describe, it, run } from 'node:test'; +import assert from 'node:assert'; + +const aPath = fixtures.path('test-runner', 'entry-file', 'a.test.mjs'); +const bPath = fixtures.path('test-runner', 'entry-file', 'b.test.mjs'); +const helperPath = fixtures.path('test-runner', 'entry-file', 'helper.mjs'); + +async function collectEvents(options) { + const events = []; + const stream = run({ files: [aPath, bPath], ...options }); + stream.on('test:fail', () => {}); + for await (const event of stream) { + events.push(event); + } + return events; +} + +describe('entryFile attribution in reporter events', { concurrency: false }, () => { + it('stamps entryFile on events forwarded from child processes', async () => { + const events = await collectEvents({ isolation: 'process' }); + const checked = { __proto__: null, A: 0, B: 0 }; + + for (const { type, data } of events) { + if (data?.name === 'restore A' || data?.name === 'restore B') { + const target = data.name === 'restore A' ? 'A' : 'B'; + const expectedEntry = target === 'A' ? aPath : bPath; + assert.strictEqual(data.file, helperPath, + `${type} file should be the definition site`); + assert.strictEqual(data.entryFile, expectedEntry, + `${type} entryFile should be the entry file`); + checked[target]++; + } + } + + // Each subtest emits at least enqueue/dequeue/start/pass/complete. + assert.ok(checked.A >= 4, `expected events for restore A, got ${checked.A}`); + assert.ok(checked.B >= 4, `expected events for restore B, got ${checked.B}`); + }); + + it('stamps entryFile on top-level tests forwarded from child processes', async () => { + const events = await collectEvents({ isolation: 'process' }); + const pass = events.filter(({ type }) => type === 'test:pass'); + const backupA = pass.find(({ data }) => data.name === 'backup A'); + const backupB = pass.find(({ data }) => data.name === 'backup B'); + assert.strictEqual(backupA.data.entryFile, aPath); + assert.strictEqual(backupB.data.entryFile, bPath); + }); + + it('does not stamp entryFile with isolation none', async () => { + const events = await collectEvents({ isolation: 'none' }); + for (const { data } of events) { + if (data?.name === 'restore A' || data?.name === 'restore B') { + assert.strictEqual(data.entryFile, undefined); + } + } + }); +}); diff --git a/test/parallel/test-runner-execution-ordered-bypass.mjs b/test/parallel/test-runner-execution-ordered-bypass.mjs index 85b468cae2a7..ac1c97ee007d 100644 --- a/test/parallel/test-runner-execution-ordered-bypass.mjs +++ b/test/parallel/test-runner-execution-ordered-bypass.mjs @@ -35,6 +35,10 @@ test('execution-ordered events bypass FileTest declaration-order buffer', async } }); + stream.on('test:log', (data) => { + events.push(`log:${data.message}`); + }); + // eslint-disable-next-line no-unused-vars for await (const _ of stream); @@ -56,4 +60,12 @@ test('execution-ordered events bypass FileTest declaration-order buffer', async failFast > completeSlow, `test:fail for fast-fail should arrive after test:complete for slow; events=${events.join(', ')}`, ); + + // test:log is execution-ordered, so it must bypass the buffer too. + const logFast = events.indexOf('log:live'); + assert.notStrictEqual(logFast, -1); + assert.ok( + logFast < completeSlow, + `test:log for fast-fail should arrive before slow's test:complete; events=${events.join(', ')}`, + ); }); diff --git a/test/parallel/test-runner-log.mjs b/test/parallel/test-runner-log.mjs new file mode 100644 index 000000000000..8e767e0f903c --- /dev/null +++ b/test/parallel/test-runner-log.mjs @@ -0,0 +1,80 @@ +// Flags: --no-warnings +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import assert from 'node:assert'; +import { spawnSync } from 'node:child_process'; +import { test, run } from 'node:test'; + +const fixture = fixtures.path('test-runner', 'log-events', 'basic.mjs'); + +test('t.log() validates its arguments', (t) => { + assert.throws(() => t.log(123), { code: 'ERR_INVALID_ARG_TYPE' }); +}); + +test('built-in reporters render test:log like diagnostics', () => { + const tap = spawnSync(process.execPath, ['--test', '--test-reporter=tap', fixture]); + assert.match(tap.stdout.toString(), /# hello/); + assert.match(tap.stdout.toString(), /# suite message/); + + const spec = spawnSync(process.execPath, ['--test', '--test-reporter=spec', fixture]); + assert.match(spec.stdout.toString(), /ℹ hello/); + assert.match(spec.stdout.toString(), /ℹ warned/); + + const junit = spawnSync(process.execPath, ['--test', '--test-reporter=junit', fixture]); + assert.match(junit.stdout.toString(), //); +}); + +test('test:log is emitted immediately with the expected payload', async () => { + const stream = run({ + files: [fixture], + isolation: 'none', + }); + + const logs = []; + const events = []; + + stream.on('test:log', (data) => { + logs.push(data); + events.push(`log:${data.message}`); + }); + + stream.on('test:pass', (data) => { + events.push(`pass:${data.name}`); + }); + + // eslint-disable-next-line no-unused-vars + for await (const _ of stream); + + assert.strictEqual(logs.length, 3); + + const suiteLog = logs.find((log) => log.message === 'suite message'); + assert.strictEqual(suiteLog.name, 'my suite'); + assert.strictEqual(suiteLog.data, undefined); + + const hello = logs.find((log) => log.message === 'hello'); + assert.strictEqual(hello.name, 'logger'); + assert.ok(!('level' in hello)); + assert.deepStrictEqual(hello.data, { foo: 1 }); + assert.strictEqual(typeof hello.nesting, 'number'); + assert.strictEqual(typeof hello.testId, 'number'); + assert.strictEqual(typeof hello.parentId, 'number'); + assert.strictEqual(typeof hello.file, 'string'); + assert.strictEqual(typeof hello.line, 'number'); + assert.strictEqual(typeof hello.column, 'number'); + + // The runner does not interpret data; conventions like a level live there. + const warned = logs.find((log) => log.message === 'warned'); + assert.ok(!('level' in warned)); + assert.deepStrictEqual(warned.data, { level: 'warn', attempt: 2 }); + + // 'logger' logs immediately while its earlier-declared sibling 'slow' is + // still running, so the log must arrive before slow's buffered test:pass. + const logIndex = events.indexOf('log:hello'); + const slowPassIndex = events.indexOf('pass:slow'); + assert.notStrictEqual(logIndex, -1); + assert.notStrictEqual(slowPassIndex, -1); + assert.ok( + logIndex < slowPassIndex, + `test:log should arrive before slow's buffered test:pass; events=${events.join(', ')}`, + ); +}); diff --git a/test/parallel/test-runner-mock-timers-scheduler.js b/test/parallel/test-runner-mock-timers-scheduler.js index 72a69b5d675b..fa019221fc88 100644 --- a/test/parallel/test-runner-mock-timers-scheduler.js +++ b/test/parallel/test-runner-mock-timers-scheduler.js @@ -97,11 +97,9 @@ describe('Mock Timers Scheduler Test Suite', () => { it('should abort operation when .abort is called before calling setInterval', async (t) => { t.mock.timers.enable({ apis: ['scheduler.wait'] }); - const controller = new AbortController(); - controller.abort(); const p = nodeTimersPromises.scheduler.wait(2000, { ref: true, - signal: controller.signal, + signal: AbortSignal.abort(), }); await assert.rejects(() => p, { diff --git a/test/parallel/test-runner-mock-timers.js b/test/parallel/test-runner-mock-timers.js index 09075cf3a58f..25510fe023d0 100644 --- a/test/parallel/test-runner-mock-timers.js +++ b/test/parallel/test-runner-mock-timers.js @@ -551,11 +551,9 @@ describe('Mock Timers Test Suite', () => { it('should abort operation when .abort is called before calling setInterval', async (t) => { t.mock.timers.enable({ apis: ['setTimeout'] }); const expectedResult = 'result'; - const controller = new AbortController(); - controller.abort(); const p = nodeTimersPromises.setTimeout(2000, expectedResult, { ref: true, - signal: controller.signal, + signal: AbortSignal.abort(), }); await assert.rejects(() => p, { @@ -778,10 +776,8 @@ describe('Mock Timers Test Suite', () => { t.mock.timers.enable({ apis: ['setInterval'] }); const interval = 100; - const abortController = new AbortController(); - abortController.abort(); const intervalIterator = nodeTimersPromises.setInterval(interval, Date.now(), { - signal: abortController.signal, + signal: AbortSignal.abort(), }); const first = intervalIterator.next(); diff --git a/test/parallel/test-runner-no-isolation-filtering.js b/test/parallel/test-runner-no-isolation-filtering.js index e26130c56b19..f7b0f3f73ff0 100644 --- a/test/parallel/test-runner-no-isolation-filtering.js +++ b/test/parallel/test-runner-no-isolation-filtering.js @@ -7,6 +7,8 @@ const { test } = require('node:test'); const fixture1 = fixtures.path('test-runner', 'no-isolation', 'one.test.js'); const fixture2 = fixtures.path('test-runner', 'no-isolation', 'two.test.js'); +const asyncBuildFilteredSuite = + fixtures.path('test-runner', 'filtered-suite-async-build.mjs'); test('works with --test-only', () => { const args = [ @@ -71,6 +73,27 @@ test('works with --test-name-pattern', () => { assert.match(stdout, /# suites 0/); }); +test('filtered suites with an async build do not leave cancelled tests', () => { + const args = [ + '--test', + '--test-reporter=tap', + '--test-isolation=none', + '--test-name-pattern=C', + asyncBuildFilteredSuite, + ]; + const child = spawnSync(process.execPath, args); + const stdout = child.stdout.toString(); + + assert.strictEqual(child.status, 0); + assert.strictEqual(child.signal, null); + assert.match(stdout, /# tests 1/); + assert.match(stdout, /# suites 2/); + assert.match(stdout, /# pass 1/); + assert.match(stdout, /# fail 0/); + assert.match(stdout, /# cancelled 0/); + assert.doesNotMatch(stdout, /parentAlreadyFinished/); +}); + test('works with --test-skip-pattern', () => { const args = [ '--test', diff --git a/test/parallel/test-runner-option-precedence.js b/test/parallel/test-runner-option-precedence.js new file mode 100644 index 000000000000..a2b1097b28e8 --- /dev/null +++ b/test/parallel/test-runner-option-precedence.js @@ -0,0 +1,41 @@ +'use strict'; +require('../common'); +const { test, suite } = require('node:test'); + +suite('test runner option precedence', () => { + test( + 'overridden test name', + { name: 'options.name overrides test name', plan: 1 }, + (t) => { + t.assert.strictEqual(t.name, 'options.name overrides test name'); + }, + ); + + test( + 'options.fn overrides test function', + { + fn: (t) => { + t.assert.ok(true); + }, + plan: 1, + }, + (t) => { + t.assert.fail('should not be called'); + }, + ); + + test('options.fn only', { + plan: 1, + fn: (t) => { + t.assert.ok(true); + }, + }); + + test({ + name: 'single parameter options', + plan: 1, + fn: (t) => { + t.assert.ok(true); + }, + }); +}); diff --git a/test/parallel/test-runner-v8-deserializer.mjs b/test/parallel/test-runner-v8-deserializer.mjs index 5e50df441da5..7f2c0155c973 100644 --- a/test/parallel/test-runner-v8-deserializer.mjs +++ b/test/parallel/test-runner-v8-deserializer.mjs @@ -5,6 +5,7 @@ import { describe, it, beforeEach } from 'node:test'; import assert from 'node:assert'; import { finished } from 'node:stream/promises'; import { DefaultSerializer } from 'node:v8'; +import { resolve } from 'node:path'; import serializer from 'internal/test_runner/reporter/v8-serializer'; import runner from 'internal/test_runner/runner'; @@ -14,22 +15,30 @@ async function toArray(chunks) { return arr; } +const entryFile = resolve('filetest'); const diagnosticEvent = { type: 'test:diagnostic', data: { nesting: 0, details: {}, message: 'diagnostic' }, }; +const reportedDiagnosticEvent = { + type: 'test:diagnostic', + data: { ...diagnosticEvent.data, entryFile }, +}; const chunks = await toArray(serializer([diagnosticEvent])); const defaultSerializer = new DefaultSerializer(); defaultSerializer.writeHeader(); const headerLength = defaultSerializer.releaseBuffer().length; const headerOnly = Buffer.from([0xff, 0x0f]); const oversizedLengthHeader = Buffer.from([0xff, 0x0f, 0x7f, 0xff, 0xff, 0xff]); +const unsignedOversizedLengthHeader = Buffer.from([0xff, 0x0f, 0x80, 0x00, 0x00, 0x00]); const truncatedLengthHeader = Buffer.from([0xff, 0x0f, 0x00, 0x01, 0x00, 0x00]); // Expected stdout for oversizedLengthHeader: first byte is emitted via // String.fromCharCode (byte-by-byte fallback in #drainRawBuffer), remaining // bytes go through the nonSerialized UTF-8 decode path in #processRawBuffer. const oversizedLengthStdout = String.fromCharCode(oversizedLengthHeader[0]) + Buffer.from(oversizedLengthHeader.subarray(1)).toString('utf-8'); +const unsignedOversizedLengthStdout = String.fromCharCode(unsignedOversizedLengthHeader[0]) + + Buffer.from(unsignedOversizedLengthHeader.subarray(1)).toString('utf-8'); function collectStdout(reported) { return reported @@ -67,28 +76,28 @@ describe('v8 deserializer', common.mustCall(() => { it('should deserialize a chunk with no serialization', async () => { const reported = await collectReported([Buffer.from('unknown')]); assert.deepStrictEqual(reported, [ - { data: { __proto__: null, file: 'filetest', message: 'unknown' }, type: 'test:stdout' }, + { data: { __proto__: null, entryFile, file: 'filetest', message: 'unknown' }, type: 'test:stdout' }, ]); }); it('should deserialize a serialized chunk', async () => { const reported = await collectReported(chunks); - assert.deepStrictEqual(reported, [diagnosticEvent]); + assert.deepStrictEqual(reported, [reportedDiagnosticEvent]); }); it('should deserialize a serialized chunk after non-serialized chunk', async () => { const reported = await collectReported([Buffer.concat([Buffer.from('unknown'), ...chunks])]); assert.deepStrictEqual(reported, [ - { data: { __proto__: null, file: 'filetest', message: 'unknown' }, type: 'test:stdout' }, - diagnosticEvent, + { data: { __proto__: null, entryFile, file: 'filetest', message: 'unknown' }, type: 'test:stdout' }, + reportedDiagnosticEvent, ]); }); it('should deserialize a serialized chunk before non-serialized output', async () => { const reported = await collectReported([Buffer.concat([ ...chunks, Buffer.from('unknown')])]); assert.deepStrictEqual(reported, [ - diagnosticEvent, - { data: { __proto__: null, file: 'filetest', message: 'unknown' }, type: 'test:stdout' }, + reportedDiagnosticEvent, + { data: { __proto__: null, entryFile, file: 'filetest', message: 'unknown' }, type: 'test:stdout' }, ]); }); @@ -106,6 +115,12 @@ describe('v8 deserializer', common.mustCall(() => { assert.strictEqual(collectStdout(reported), oversizedLengthStdout); }); + it('should read an oversized length as an unsigned integer', async () => { + const reported = await collectReported([unsignedOversizedLengthHeader]); + assert(reported.every((event) => event.type === 'test:stdout')); + assert.strictEqual(collectStdout(reported), unsignedOversizedLengthStdout); + }); + it('should flush incomplete v8 frame as stdout and keep prior valid data', async () => { // A valid non-serialized message followed by bytes that look like // a v8 header with a truncated/oversized length. @@ -131,7 +146,7 @@ describe('v8 deserializer', common.mustCall(() => { oversizedLengthHeader, ...chunks, ]); - assert.deepStrictEqual(reported.at(-1), diagnosticEvent); + assert.deepStrictEqual(reported.at(-1), reportedDiagnosticEvent); assert.strictEqual(reported.filter((event) => event.type === 'test:diagnostic').length, 1); assert.strictEqual(collectStdout(reported), oversizedLengthStdout); }); @@ -152,7 +167,7 @@ describe('v8 deserializer', common.mustCall(() => { const data = chunks[0]; const reported = await collectReported([data.subarray(0, i), data.subarray(i)]); assert.deepStrictEqual(reported, [ - diagnosticEvent, + reportedDiagnosticEvent, ]); }); @@ -163,9 +178,9 @@ describe('v8 deserializer', common.mustCall(() => { Buffer.concat([data.subarray(i), Buffer.from('unknown')]), ]); assert.deepStrictEqual(reported, [ - { data: { __proto__: null, file: 'filetest', message: 'unknown' }, type: 'test:stdout' }, - diagnosticEvent, - { data: { __proto__: null, file: 'filetest', message: 'unknown' }, type: 'test:stdout' }, + { data: { __proto__: null, entryFile, file: 'filetest', message: 'unknown' }, type: 'test:stdout' }, + reportedDiagnosticEvent, + { data: { __proto__: null, entryFile, file: 'filetest', message: 'unknown' }, type: 'test:stdout' }, ]); } ); diff --git a/test/parallel/test-sqlite-authz.js b/test/parallel/test-sqlite-authz.js index 2bf268847cd3..69c075a57e2e 100644 --- a/test/parallel/test-sqlite-authz.js +++ b/test/parallel/test-sqlite-authz.js @@ -275,4 +275,16 @@ suite('DatabaseSync.prototype.setAuthorizer()', () => { message: /The "callback" argument must be a function/ }); }); + + it('throws if database is not open', () => { + const db = new DatabaseSync(':memory:'); + db.close(); + + assert.throws(() => { + db.setAuthorizer(() => constants.SQLITE_OK); + }, { + code: 'ERR_INVALID_STATE', + message: 'database is not open', + }); + }); }); diff --git a/test/parallel/test-sqlite-config.js b/test/parallel/test-sqlite-config.js index 411b9d1cfaea..d1a6cae2d744 100644 --- a/test/parallel/test-sqlite-config.js +++ b/test/parallel/test-sqlite-config.js @@ -61,3 +61,15 @@ test('throws if options.defensive is provided but is not a boolean', (t) => { message: 'The "options.defensive" argument must be a boolean.', }); }); + +test('enableLoadExtension() throws if database is not open', (t) => { + const db = new DatabaseSync(':memory:', { allowExtension: true }); + db.close(); + + t.assert.throws(() => { + db.enableLoadExtension(false); + }, { + code: 'ERR_INVALID_STATE', + message: 'database is not open', + }); +}); diff --git a/test/parallel/test-sqlite-session.js b/test/parallel/test-sqlite-session.js index 189835ce4c30..c36b4352a341 100644 --- a/test/parallel/test-sqlite-session.js +++ b/test/parallel/test-sqlite-session.js @@ -1,4 +1,4 @@ -// Flags: --experimental-sqlite +// Flags: --expose-gc --experimental-sqlite 'use strict'; const { skipIfSQLiteMissing } = require('../common'); skipIfSQLiteMissing(); @@ -81,6 +81,22 @@ test('session.changeset() - closed database results in exception', (t) => { }); }); +test('session methods - reopened database results in exception', (t) => { + for (const method of ['changeset', 'close']) { + const database = new DatabaseSync(':memory:'); + const session = database.createSession(); + database.close(); + database.open(); + + t.assert.throws(() => { + session[method](); + }, { + name: 'Error', + message: 'session is not open', + }); + } +}); + test('database.applyChangeset() - closed database results in exception', (t) => { const database = new DatabaseSync(':memory:'); const session = database.createSession(); @@ -232,7 +248,7 @@ suite('conflict resolution', () => { const insertSql = 'INSERT INTO data (key, value) VALUES (?, ?)'; const session = database1.createSession(); database1.prepare(insertSql).run(1, 'hello'); - database2.prepare(insertSql).run(2, 'hello'); // database2 already constains hello + database2.prepare(insertSql).run(2, 'hello'); // database2 already contains hello return { database2, @@ -589,6 +605,36 @@ test('session.close() - closing twice', (t) => { }); }); +test('session - keeps its database alive after the db handle is dropped', async (t) => { + const { gcUntil, onGC } = require('../common/gc'); + + // The DatabaseSync handle is created in a nested scope and never referenced + // again, so the returned session is the only thing keeping it reachable. + let dbCollected = false; + const session = (() => { + const database = new DatabaseSync(':memory:'); + database.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, value TEXT)'); + onGC(database, { ongc: () => { dbCollected = true; } }); + const s = database.createSession(); + database.exec("INSERT INTO data VALUES (1, 'hello')"); + return s; + })(); + + // The session must keep the database alive across GC. Previously it held + // only a weak reference, so the database could be collected and using the + // session afterwards dereferenced a dangling pointer and crashed. + await gcUntil('database is collected', () => dbCollected, 5).then( + () => { throw new Error('session did not keep its database alive'); }, + () => {}, // Expected: the database is never collected, so gcUntil rejects. + ); + t.assert.strictEqual(dbCollected, false); + + // The database is still open and usable through the still-alive session. + const changeset = session.changeset(); + t.assert.ok(changeset.byteLength > 0); + session.close(); +}); + test('session supports ERM', (t) => { const database = new DatabaseSync(':memory:'); let afterDisposeSession; diff --git a/test/parallel/test-sqlite-statement-sync.js b/test/parallel/test-sqlite-statement-sync.js index aa7a3a73ae66..b3a1dc434537 100644 --- a/test/parallel/test-sqlite-statement-sync.js +++ b/test/parallel/test-sqlite-statement-sync.js @@ -53,6 +53,29 @@ suite('StatementSync.prototype.get()', () => { const stmt = db.prepare('SELECT 1 as __proto__, 2 as constructor, 3 as toString'); t.assert.deepStrictEqual(stmt.get(), { __proto__: null, ['__proto__']: 1, constructor: 2, toString: 3 }); }); + + test('reflects an added column after the schema changes', (t) => { + using db = new DatabaseSync(':memory:'); + db.exec('CREATE TABLE storage(key TEXT, val TEXT)'); + db.prepare('INSERT INTO storage (key, val) VALUES (?, ?)').run('key1', 'val1'); + const stmt = db.prepare('SELECT * FROM storage ORDER BY key'); + db.exec("ALTER TABLE storage ADD COLUMN extra TEXT DEFAULT 'def'"); + t.assert.deepStrictEqual(stmt.get(), { + __proto__: null, key: 'key1', val: 'val1', extra: 'def', + }); + }); + + test('reflects a dropped column after the schema changes', (t) => { + using db = new DatabaseSync(':memory:'); + db.exec('CREATE TABLE storage(key TEXT, val TEXT, extra TEXT)'); + db.prepare('INSERT INTO storage (key, val, extra) VALUES (?, ?, ?)') + .run('key1', 'val1', 'x'); + const stmt = db.prepare('SELECT * FROM storage ORDER BY key'); + db.exec('ALTER TABLE storage DROP COLUMN extra'); + t.assert.deepStrictEqual(stmt.get(), { + __proto__: null, key: 'key1', val: 'val1', + }); + }); }); suite('StatementSync.prototype.all()', () => { @@ -83,6 +106,29 @@ suite('StatementSync.prototype.all()', () => { { __proto__: null, key: 'key2', val: 'val2' }, ]); }); + + test('reflects an added column after the schema changes', (t) => { + using db = new DatabaseSync(':memory:'); + db.exec('CREATE TABLE storage(key TEXT, val TEXT)'); + db.prepare('INSERT INTO storage (key, val) VALUES (?, ?)').run('key1', 'val1'); + const stmt = db.prepare('SELECT * FROM storage ORDER BY key'); + db.exec("ALTER TABLE storage ADD COLUMN extra TEXT DEFAULT 'def'"); + t.assert.deepStrictEqual(stmt.all(), [ + { __proto__: null, key: 'key1', val: 'val1', extra: 'def' }, + ]); + }); + + test('reflects a dropped column after the schema changes', (t) => { + using db = new DatabaseSync(':memory:'); + db.exec('CREATE TABLE storage(key TEXT, val TEXT, extra TEXT)'); + db.prepare('INSERT INTO storage (key, val, extra) VALUES (?, ?, ?)') + .run('key1', 'val1', 'x'); + const stmt = db.prepare('SELECT * FROM storage ORDER BY key'); + db.exec('ALTER TABLE storage DROP COLUMN extra'); + t.assert.deepStrictEqual(stmt.all(), [ + { __proto__: null, key: 'key1', val: 'val1' }, + ]); + }); }); suite('StatementSync.prototype.iterate()', () => { @@ -125,6 +171,29 @@ suite('StatementSync.prototype.iterate()', () => { } }); + test('reflects an added column after the schema changes', (t) => { + using db = new DatabaseSync(':memory:'); + db.exec('CREATE TABLE storage(key TEXT, val TEXT)'); + db.prepare('INSERT INTO storage (key, val) VALUES (?, ?)').run('key1', 'val1'); + const stmt = db.prepare('SELECT * FROM storage ORDER BY key'); + db.exec("ALTER TABLE storage ADD COLUMN extra TEXT DEFAULT 'def'"); + t.assert.deepStrictEqual(stmt.iterate().toArray(), [ + { __proto__: null, key: 'key1', val: 'val1', extra: 'def' }, + ]); + }); + + test('reflects a dropped column after the schema changes', (t) => { + using db = new DatabaseSync(':memory:'); + db.exec('CREATE TABLE storage(key TEXT, val TEXT, extra TEXT)'); + db.prepare('INSERT INTO storage (key, val, extra) VALUES (?, ?, ?)') + .run('key1', 'val1', 'x'); + const stmt = db.prepare('SELECT * FROM storage ORDER BY key'); + db.exec('ALTER TABLE storage DROP COLUMN extra'); + t.assert.deepStrictEqual(stmt.iterate().toArray(), [ + { __proto__: null, key: 'key1', val: 'val1' }, + ]); + }); + test('iterator keeps the prepared statement from being collected', (t) => { const db = new DatabaseSync(':memory:'); db.exec(` diff --git a/test/parallel/test-stream-base-typechecking.js b/test/parallel/test-stream-base-typechecking.js deleted file mode 100644 index ae8582642344..000000000000 --- a/test/parallel/test-stream-base-typechecking.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const net = require('net'); - -const server = net.createServer().listen(0, common.mustCall(() => { - const client = net.connect(server.address().port, common.mustCall(() => { - assert.throws(() => { - client.write('broken', 'buffer'); - }, { - name: 'TypeError', - code: 'ERR_INVALID_ARG_TYPE', - message: 'Second argument must be a buffer' - }); - client.destroy(); - server.close(); - })); -})); diff --git a/test/parallel/test-stream-duplexpair.js b/test/parallel/test-stream-duplexpair.js index 3e1b3044ddb7..600f4cb0208f 100644 --- a/test/parallel/test-stream-duplexpair.js +++ b/test/parallel/test-stream-duplexpair.js @@ -54,7 +54,7 @@ const { Duplex, duplexPair } = require('stream'); })); } -// Test the case where the the _write never calls [kCallback] +// Test the case where the _write never calls [kCallback] // because a zero-size push doesn't trigger a _read { const [ serverSide, clientSide ] = duplexPair(); diff --git a/test/parallel/test-stream-finished.js b/test/parallel/test-stream-finished.js index b55107a7a644..6c2f3cad68e1 100644 --- a/test/parallel/test-stream-finished.js +++ b/test/parallel/test-stream-finished.js @@ -1,3 +1,4 @@ +// Flags: --expose-internals 'use strict'; const common = require('../common'); @@ -15,6 +16,7 @@ const EE = require('events'); const fs = require('fs'); const { promisify } = require('util'); const http = require('http'); +const { kEosNodeSynchronousCallback } = require('internal/streams/end-of-stream'); { const rs = new Readable({ @@ -95,13 +97,20 @@ const http = require('http'); { // Check pre-cancelled - const signal = new EventTarget(); - signal.aborted = true; + const signal = AbortSignal.abort(); const rs = Readable.from((function* () {})()); - finished(rs, { signal }, common.mustCall((err) => { + const cleanup = finished(rs, { signal }, common.mustCall((err) => { + assert.strictEqual(err.name, 'AbortError'); + cleanup(); + })); + const unset = Symbol('unset'); + let cleanup2 = unset; + cleanup2 = finished(rs, { signal, [kEosNodeSynchronousCallback]: true }, common.mustCall((err) => { assert.strictEqual(err.name, 'AbortError'); + assert.strictEqual(cleanup2, unset); })); + cleanup2(); } { @@ -160,8 +169,7 @@ const http = require('http'); // Promisified pre-aborted works const finishedPromise = promisify(finished); async function run() { - const signal = new EventTarget(); - signal.aborted = true; + const signal = AbortSignal.abort(); const rs = Readable.from((function* () {})()); await finishedPromise(rs, { signal }); } @@ -592,6 +600,29 @@ testClosed((opts) => new Writable({ write() {}, ...opts })); })); } +{ + let serverRes; + const server = http.createServer(common.mustCall((req, res) => { + serverRes = res; + res.write('hello'); + })).listen(0, common.mustCall(function() { + http.get({ port: this.address().port }, common.mustCall((res) => { + res.on('aborted', common.mustCall(() => { + finished(res, common.mustCall((err) => { + assert.strictEqual(err.code, 'ECONNRESET'); + assert.strictEqual(err.message, 'aborted'); + server.close(); + })); + })); + res.on('error', common.expectsError({ + code: 'ECONNRESET', + message: 'aborted', + })); + serverRes.destroy(); + })).on('error', common.mustNotCall()); + })); +} + { const w = new Writable({ write(chunk, encoding, callback) { diff --git a/test/parallel/test-stream-iter-broadcast-backpressure.js b/test/parallel/test-stream-iter-broadcast-backpressure.js new file mode 100644 index 000000000000..35a0cf0e238c --- /dev/null +++ b/test/parallel/test-stream-iter-broadcast-backpressure.js @@ -0,0 +1,190 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { broadcast, text } = require('stream/iter'); + +// ============================================================================= +// Backpressure policies +// ============================================================================= + +async function testDropOldest() { + const chunk1 = new Uint8Array(16384).fill(49); // '1' + const chunk2 = new Uint8Array(16384).fill(50); // '2' + const chunk3 = new Uint8Array(16384).fill(51); // '3' + const { writer, broadcast: bc } = broadcast({ + budget: 32768, + backpressure: 'drop-oldest', + }); + const consumer = bc.push(); + + writer.writeSync(chunk1); // 16384 < 32768 + writer.writeSync(chunk2); // 32768 >= 32768 + // Buffer full: this drops chunk1, adds chunk3 + writer.writeSync(chunk3); + writer.endSync(); + + const data = await text(consumer); + assert.strictEqual(data, '2'.repeat(16384) + '3'.repeat(16384)); +} + +async function testDropNewest() { + const kept = new Uint8Array(16384).fill(75); // 'K' + const dropped = new Uint8Array(16384).fill(68); // 'D' + const { writer, broadcast: bc } = broadcast({ + budget: 16384, + backpressure: 'drop-newest', + }); + const consumer = bc.push(); + + writer.writeSync(kept); + // Buffer full: new write is silently discarded + writer.writeSync(dropped); + writer.endSync(); + + const data = await text(consumer); + assert.strictEqual(data, 'K'.repeat(16384)); +} + +// ============================================================================= +// Block backpressure +// ============================================================================= + +async function testBlockBackpressure() { + const kChunk = new Uint8Array(16384); + const { writer, broadcast: bc } = broadcast({ + budget: 16384, + backpressure: 'unbounded', + }); + const consumer = bc.push(); + writer.writeSync(kChunk); + + // Next write should block + let writeResolved = false; + const writePromise = writer.write(kChunk).then(() => { writeResolved = true; }); + await new Promise(setImmediate); + assert.strictEqual(writeResolved, false); + + // Drain consumer to unblock the pending write + const iter = consumer[Symbol.asyncIterator](); + const first = await iter.next(); + assert.strictEqual(first.done, false); + await new Promise(setImmediate); + assert.strictEqual(writeResolved, true); + + writer.endSync(); + // Drain remaining data and verify completion + const second = await iter.next(); + assert.strictEqual(second.done, false); + await writePromise; +} + +// Verify block backpressure data flows correctly end-to-end +async function testBlockBackpressureContent() { + const chunk1 = new Uint8Array(16384).fill(65); // 'A' + const chunk2 = new Uint8Array(16384).fill(66); // 'B' + const { writer, broadcast: bc } = broadcast({ + budget: 16384, + backpressure: 'unbounded', + }); + const consumer = bc.push(); + + writer.writeSync(chunk1); + const writePromise = writer.write(chunk2); + await new Promise(setImmediate); + + // Read all and verify content + const iter = consumer[Symbol.asyncIterator](); + const first = await iter.next(); + assert.strictEqual(first.done, false); + assert.strictEqual(first.value[0].byteLength, 16384); + assert.strictEqual(first.value[0][0], 65); // 'A' + + await writePromise; + writer.endSync(); + + const second = await iter.next(); + assert.strictEqual(second.done, false); + assert.strictEqual(second.value[0].byteLength, 16384); + assert.strictEqual(second.value[0][0], 66); // 'B' + + const done = await iter.next(); + assert.strictEqual(done.done, true); +} + +async function testStrictBackpressureOverflow() { + const { writer } = broadcast({ + budget: 16384, + backpressure: 'strict', + }); + + await writer.write(new Uint8Array(16384)); + const pending = writer.write('b'); + + await assert.rejects(writer.write('c'), { + name: 'RangeError', + code: 'ERR_INVALID_STATE', + }); + + writer.fail(); + await assert.rejects(pending, { + name: 'TypeError', + code: 'ERR_INVALID_STATE', + message: 'Invalid state: Failed', + }); +} + +// Writev async path +async function testWritevAsync() { + const { writer, broadcast: bc } = broadcast({ budget: 16384 }); + const consumer = bc.push(); + + await writer.writev(['hello', ' ', 'world']); + await writer.end(); + + const data = await text(consumer); + assert.strictEqual(data, 'hello world'); +} + +// Zero-byte writes do not consume buffer entries. +async function testZeroByteWrites() { + const { writer, broadcast: bc } = broadcast({ budget: 16384 }); + const consumer = bc.push(); + + for (let i = 0; i < 1000; i++) { + assert.strictEqual(writer.writeSync(''), true); + assert.strictEqual(writer.writevSync([]), true); + } + await writer.write(''); + await writer.writev([]); + assert.strictEqual(writer.canWrite, true); + writer.endSync(); + + let entries = 0; + const iterator = consumer[Symbol.asyncIterator](); + while (!(await iterator.next()).done) entries++; + assert.strictEqual(entries, 0); +} + +// endSync returns the total byte count +async function testEndSyncReturnValue() { + const { writer, broadcast: bc } = broadcast({ budget: 16384 }); + bc.push(); // Need a consumer to write to + + writer.writeSync('hello'); // 5 bytes + writer.writeSync(' world'); // 6 bytes + const total = writer.endSync(); + assert.strictEqual(total, 11); +} + +Promise.all([ + testDropOldest(), + testDropNewest(), + testBlockBackpressure(), + testBlockBackpressureContent(), + testStrictBackpressureOverflow(), + testWritevAsync(), + testZeroByteWrites(), + testEndSyncReturnValue(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-broadcast-basic.js b/test/parallel/test-stream-iter-broadcast-basic.js new file mode 100644 index 000000000000..0644a28a462d --- /dev/null +++ b/test/parallel/test-stream-iter-broadcast-basic.js @@ -0,0 +1,338 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { setTimeout } = require('timers/promises'); +const { broadcast, text } = require('stream/iter'); + +// ============================================================================= +// Basic broadcast +// ============================================================================= + +async function testBasicBroadcast() { + const { writer, broadcast: bc } = broadcast(); + + // Create two consumers + const consumer1 = bc.push(); + const consumer2 = bc.push(); + + assert.strictEqual(bc.consumerCount, 2); + + await writer.write('hello'); + await writer.end(); + + const [data1, data2] = await Promise.all([ + text(consumer1), + text(consumer2), + ]); + + assert.strictEqual(data1, 'hello'); + assert.strictEqual(data2, 'hello'); +} + +async function testMultipleWrites() { + const { writer, broadcast: bc } = broadcast({ budget: 16384 }); + + const consumer = bc.push(); + + await writer.write('a'); + await writer.write('b'); + await writer.write('c'); + await writer.end(); + + const data = await text(consumer); + assert.strictEqual(data, 'abc'); +} + +async function testConsumerCount() { + const { broadcast: bc } = broadcast(); + + assert.strictEqual(bc.consumerCount, 0); + + const c1 = bc.push(); + assert.strictEqual(bc.consumerCount, 1); + + bc.push(); + assert.strictEqual(bc.consumerCount, 2); + + bc.cancel(); + + // After cancel, consumer count drops to 0 + assert.strictEqual(bc.consumerCount, 0); + + // Consumers are detached and yield nothing + const batches = []; + for await (const batch of c1) { + batches.push(batch); + } + assert.strictEqual(batches.length, 0); +} + +// ============================================================================= +// Writer methods +// ============================================================================= + +async function testWriteSync() { + const kChunk = new Uint8Array(16384); + const { writer, broadcast: bc } = broadcast({ budget: 16384 }); + const consumer = bc.push(); + + assert.strictEqual(writer.writeSync(kChunk), true); + // Buffer full (16384 >= budget), strict policy rejects + assert.strictEqual(writer.writeSync(kChunk), false); + + writer.endSync(); + + const data = await text(consumer); + assert.strictEqual(data.length, 16384); +} + +async function testWritevSync() { + const { writer, broadcast: bc } = broadcast({ budget: 16384 }); + const consumer = bc.push(); + + assert.strictEqual(writer.writevSync(['hello', ' ', 'world']), true); + writer.endSync(); + + const data = await text(consumer); + assert.strictEqual(data, 'hello world'); +} + +async function testWriterEnd() { + const { writer, broadcast: bc } = broadcast(); + const consumer = bc.push(); + + await writer.write('data'); + const totalBytes = await writer.end(); + assert.strictEqual(totalBytes, 4); // 'data' = 4 UTF-8 bytes + + const data = await text(consumer); + assert.strictEqual(data, 'data'); +} + +async function testWriterEndWithPreAbortedSignal() { + const { writer, broadcast: bc } = broadcast(); + const consumer = bc.push(); + const reason = new Error('end aborted'); + + await assert.rejects( + writer.end({ signal: AbortSignal.abort(reason) }), + (error) => error === reason, + ); + + // A rejected end must leave the writer open. + await writer.write('data'); + assert.strictEqual(await writer.end(), 4); + assert.strictEqual(await text(consumer), 'data'); +} + +async function testWriterFail() { + const { writer, broadcast: bc } = broadcast(); + const consumer = bc.push(); + + writer.fail(new Error('test error')); + + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of consumer) { + assert.fail('Should not reach here'); + } + }, + { message: 'test error' }, + ); +} + +// ============================================================================= +// Cancel +// ============================================================================= + +async function testCancelWithoutReason() { + const { broadcast: bc } = broadcast(); + const consumer = bc.push(); + + bc.cancel(); + + const batches = []; + for await (const batch of consumer) { + batches.push(batch); + } + assert.strictEqual(batches.length, 0); +} + +async function testCancelWithReason() { + const { broadcast: bc } = broadcast(); + + // Start a consumer that is waiting for data (promise pending) + const consumer = bc.push(); + const resultPromise = text(consumer).catch((err) => err); + + // Give the consumer time to enter the waiting state + await new Promise((resolve) => setImmediate(resolve)); + + bc.cancel(new Error('cancelled')); + + const result = await resultPromise; + assert.ok(result instanceof Error); + assert.strictEqual(result.message, 'cancelled'); +} + +async function testPendingNextSettlesAfterReturn() { + const { broadcast: bc } = broadcast(); + const iter = bc.push()[Symbol.asyncIterator](); + + const pendingNext = iter.next(); + await iter.return(); + + const result = await pendingNext; + assert.strictEqual(result.done, true); + assert.strictEqual(result.value, undefined); +} + +async function testPushAbortSignalRejectsPendingNext() { + const ac = new AbortController(); + const reason = new Error('push aborted'); + const { broadcast: bc } = broadcast(); + const iter = bc.push({ signal: ac.signal })[Symbol.asyncIterator](); + + const pendingNext = iter.next(); + const rejected = assert.rejects(pendingNext, (error) => error === reason); + ac.abort(reason); + + await rejected; +} + +// ============================================================================= +// Writer fail detaches consumers +// ============================================================================= + +async function testFailDetachesConsumers() { + const { writer, broadcast: bc } = broadcast(); + const consumer1 = bc.push(); + const consumer2 = bc.push(); + + assert.strictEqual(bc.consumerCount, 2); + + // Write some data, then fail the writer + await writer.write('data'); + await writer.fail(new Error('writer failed')); + + // After fail, consumers are detached + assert.strictEqual(bc.consumerCount, 0); + + // Both consumers should see the error + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of consumer1) { + assert.fail('Should not reach here'); + } + }, + { message: 'writer failed' }, + ); + + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of consumer2) { + assert.fail('Should not reach here'); + } + }, + { message: 'writer failed' }, + ); +} + +// ============================================================================= +// Writer fail idempotent +// ============================================================================= + +async function testWriterFailIdempotent() { + const { writer, broadcast: bc } = broadcast(); + const consumer = bc.push(); + writer.writeSync('hello'); + writer.fail(new Error('fail!')); + // Second call is a no-op (already errored) + writer.fail(new Error('fail2')); + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of consumer) { /* consume */ } + }, { message: 'fail!' }); +} + +// cancel() with falsy reason (0, "", false) should still treat as error +async function testCancelWithFalsyReason() { + const { broadcast: bc } = broadcast(); + const consumer = bc.push(); + const resultPromise = text(consumer).catch((err) => err); + await new Promise((resolve) => setImmediate(resolve)); + bc.cancel(0); + const result = await resultPromise; + assert.strictEqual(result, 0); +} + +// Late-joining consumer should read from oldest buffered entry +async function testLateJoinerSeesBufferedData() { + const { writer, broadcast: bc } = broadcast({ budget: 16384 }); + + // Write data before any consumer joins + writer.writeSync('before-join'); + writer.endSync(); + + // Consumer joins after data is written + const consumer = bc.push(); + const result = await text(consumer); + assert.strictEqual(result, 'before-join'); +} + +async function testOverlappingNextKeepsEarlierRead() { + const { writer, broadcast: bc } = broadcast(); + const it = bc.push()[Symbol.asyncIterator](); + + const first = it.next(); + const second = it.next(); + + await writer.write('x'); + + const secondResult = await Promise.race([ + second.then((value) => ({ __proto__: null, settled: true, value })), + setTimeout(common.platformTimeout(50), + { __proto__: null, settled: false }), + ]); + assert.deepStrictEqual(secondResult, { + __proto__: null, + settled: false, + }); + + const result = await first; + assert.strictEqual(result.done, false); + assert.strictEqual(Buffer.concat(result.value).toString(), 'x'); + + writer.endSync(); + assert.deepStrictEqual(await second, { + __proto__: null, + done: true, + value: undefined, + }); + assert.strictEqual(bc.consumerCount, 0); +} + +Promise.all([ + testBasicBroadcast(), + testMultipleWrites(), + testConsumerCount(), + testWriteSync(), + testWritevSync(), + testWriterEnd(), + testWriterEndWithPreAbortedSignal(), + testWriterFail(), + testCancelWithoutReason(), + testCancelWithReason(), + testCancelWithFalsyReason(), + testPendingNextSettlesAfterReturn(), + testPushAbortSignalRejectsPendingNext(), + testFailDetachesConsumers(), + testWriterFailIdempotent(), + testLateJoinerSeesBufferedData(), + testOverlappingNextKeepsEarlierRead(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-broadcast-coverage.js b/test/parallel/test-stream-iter-broadcast-coverage.js new file mode 100644 index 000000000000..b8dec044c307 --- /dev/null +++ b/test/parallel/test-stream-iter-broadcast-coverage.js @@ -0,0 +1,138 @@ +// Flags: --experimental-stream-iter +'use strict'; + +// Coverage tests for broadcast.js: signal abort on pending write, +// sync iterable from, ringbuffer grow. + +const common = require('../common'); +const assert = require('assert'); +const { + broadcast, + Broadcast, + text, +} = require('stream/iter'); + +// Signal abort on pending write (covers wireBroadcastWriteSignal + removeAt) +async function testBroadcastWriteAbort() { + const { writer, broadcast: bc } = broadcast({ + budget: 16384, + backpressure: 'unbounded', + }); + const consumer = bc.push(); + + // Fill the buffer to capacity + writer.writeSync(new Uint8Array(16384).fill(1)); + + // Next write will block — pass a signal + const ac = new AbortController(); + const writePromise = writer.write(new Uint8Array(16384).fill(2), + { signal: ac.signal }); + + // Abort the signal + ac.abort(); + + await assert.rejects(writePromise, { name: 'AbortError' }); + + // Clean up + writer.endSync(); + // Drain the consumer + const result = []; + for await (const batch of consumer) { + result.push(...batch); + } + assert.ok(result.length >= 1); +} + +// Broadcast.from with sync iterable (generator) +async function testBroadcastFromSyncIterable() { + function* source() { + yield [new Uint8Array([10, 20])]; + yield [new Uint8Array([30, 40])]; + } + + const { broadcast: bc } = Broadcast.from(source()); + const consumer = bc.push(); + // Just verify it completes without error and produces data + let count = 0; + for await (const batch of consumer) { + count += batch.length; + } + assert.ok(count > 0); +} + +// Broadcast.from with sync iterable — string chunks +async function testBroadcastFromSyncIterableStrings() { + function* source() { + yield 'hello'; + yield ' world'; + } + const { broadcast: bc } = Broadcast.from(source()); + const consumer = bc.push(); + const result = await text(consumer); + assert.strictEqual(result, 'hello world'); +} + +// Ringbuffer grow — push > 16 items without consumer draining +async function testRingbufferGrow() { + const { writer, broadcast: bc } = broadcast({ budget: 16384 }); + const consumer = bc.push(); + + // Push 20 items (exceeds default ringbuffer capacity of 16) + for (let i = 0; i < 20; i++) { + writer.writeSync(new Uint8Array([i])); + } + writer.endSync(); + + // Read all items back and verify order + const items = []; + for await (const batch of consumer) { + for (const chunk of batch) { + items.push(chunk[0]); + } + } + assert.strictEqual(items.length, 20); + for (let i = 0; i < 20; i++) { + assert.strictEqual(items[i], i); + } +} + +// Multiple consumers at the minimum cursor should trim only after the last +// one advances or detaches. +async function testFanOutMinCursorTrimming() { + const { writer, broadcast: bc } = broadcast({ budget: 16384 }); + const iter1 = bc.push()[Symbol.asyncIterator](); + const iter2 = bc.push()[Symbol.asyncIterator](); + + writer.writeSync(new Uint8Array([1])); + writer.writeSync(new Uint8Array([2])); + + assert.strictEqual((await iter1.next()).done, false); + + assert.strictEqual((await iter2.next()).done, false); + + await iter1.return(); + + assert.strictEqual((await iter2.next()).done, false); + + writer.endSync(); + assert.strictEqual((await iter2.next()).done, true); +} + +// Broadcast drainableProtocol after close returns null +async function testDrainableAfterClose() { + const { drainableProtocol } = require('stream/iter'); + const { writer } = broadcast(); + writer.endSync(); + const result = writer[drainableProtocol](); + // After close, desired should be null + assert.strictEqual(result, null); +} + +Promise.all([ + testBroadcastWriteAbort(), + testBroadcastFromSyncIterable(), + testBroadcastFromSyncIterableStrings(), + testRingbufferGrow(), + testFanOutMinCursorTrimming(), + testDrainableAfterClose(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-broadcast-from.js b/test/parallel/test-stream-iter-broadcast-from.js new file mode 100644 index 000000000000..39d92c2aef49 --- /dev/null +++ b/test/parallel/test-stream-iter-broadcast-from.js @@ -0,0 +1,216 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { broadcast, Broadcast, from, text } = require('stream/iter'); + +// ============================================================================= +// Broadcast.from +// ============================================================================= + +async function testBroadcastFromAsyncIterable() { + const source = from('broadcast-from'); + const { broadcast: bc } = Broadcast.from(source); + const consumer = bc.push(); + + const data = await text(consumer); + assert.strictEqual(data, 'broadcast-from'); +} + +async function testBroadcastFromNonArrayChunks() { + // Source that yields single Uint8Array chunks (not arrays) + const enc = new TextEncoder(); + async function* singleChunkSource() { + yield enc.encode('hello'); + yield enc.encode(' world'); + } + const { broadcast: bc } = Broadcast.from(singleChunkSource()); + const consumer = bc.push(); + const data = await text(consumer); + assert.strictEqual(data, 'hello world'); +} + +async function testBroadcastFromStringChunks() { + // Source that yields bare strings (not arrays) + async function* stringSource() { + yield 'foo'; + yield 'bar'; + } + const { broadcast: bc } = Broadcast.from(stringSource()); + const consumer = bc.push(); + const data = await text(consumer); + assert.strictEqual(data, 'foobar'); +} + +async function testBroadcastFromStringInput() { + const { broadcast: bc } = Broadcast.from('abc'); + const consumer = bc.push(); + const data = await text(consumer); + assert.strictEqual(data, 'abc'); +} + +async function testBroadcastFromUint8ArrayInput() { + const { broadcast: bc } = Broadcast.from(new Uint8Array([97])); + const consumer = bc.push(); + const data = await text(consumer); + assert.strictEqual(data, 'a'); +} + +async function testBroadcastFromDataViewInput() { + const view = new DataView(new Uint8Array([104, 105]).buffer); + const { broadcast: bc } = Broadcast.from(view); + const consumer = bc.push(); + const data = await text(consumer); + assert.strictEqual(data, 'hi'); +} + +async function testBroadcastFromMultipleConsumers() { + const source = from('shared-data'); + const { broadcast: bc } = Broadcast.from(source); + + const c1 = bc.push(); + const c2 = bc.push(); + + const [data1, data2] = await Promise.all([ + text(c1), + text(c2), + ]); + + assert.strictEqual(data1, 'shared-data'); + assert.strictEqual(data2, 'shared-data'); +} + +// ============================================================================= +// AbortSignal +// ============================================================================= + +async function testAbortSignal() { + const ac = new AbortController(); + const { broadcast: bc } = broadcast({ signal: ac.signal }); + const consumer = bc.push(); + + ac.abort(); + + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of consumer) { + assert.fail('Should not reach here'); + } + }, { name: 'AbortError' }); +} + +async function testAlreadyAbortedSignal() { + const { broadcast: bc } = broadcast({ signal: AbortSignal.abort() }); + const consumer = bc.push(); + + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of consumer) { + assert.fail('Should not reach here'); + } + }, { name: 'AbortError' }); +} + +// ============================================================================= +// Broadcast.from() hang fix - cancel while write blocked on backpressure +// ============================================================================= + +async function testBroadcastFromCancelWhileBlocked() { + // Create a slow async source that blocks between yields + let sourceFinished = false; + async function* slowSource() { + const enc = new TextEncoder(); + yield [enc.encode('chunk1')]; + // Simulate a long delay - the cancel should unblock this + await new Promise((resolve) => setTimeout(resolve, 10000)); + yield [enc.encode('chunk2')]; + sourceFinished = true; + } + + const { broadcast: bc } = Broadcast.from(slowSource()); + const consumer = bc.push(); + + // Read the first chunk + const iter = consumer[Symbol.asyncIterator](); + const first = await iter.next(); + assert.strictEqual(first.done, false); + + // Cancel while the source is blocked waiting to yield the next chunk + bc.cancel(); + + // The iteration should complete (not hang) + const next = await iter.next(); + assert.strictEqual(next.done, true); + + // Source should NOT have finished (we cancelled before chunk2) + assert.strictEqual(sourceFinished, false); +} + +// ============================================================================= +// Source error propagation via Broadcast.from() +// ============================================================================= + +async function testBroadcastFromSourceError() { + async function* failingSource() { + yield [new TextEncoder().encode('a')]; + throw new Error('broadcast source boom'); + } + const { broadcast: bc } = Broadcast.from(failingSource()); + const consumer = bc.push(); + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of consumer) { /* consume */ } + }, { message: 'broadcast source boom' }); +} + +// ============================================================================= +// Protocol validation +// ============================================================================= + +function testBroadcastProtocolReturnsNull() { + const obj = { + [Symbol.for('Stream.broadcastProtocol')]() { return null; }, + }; + assert.throws( + () => Broadcast.from(obj), + { code: 'ERR_INVALID_RETURN_VALUE' }, + ); +} + +function testBroadcastProtocolReturnsString() { + const obj = { + [Symbol.for('Stream.broadcastProtocol')]() { return 'bad'; }, + }; + assert.throws( + () => Broadcast.from(obj), + { code: 'ERR_INVALID_RETURN_VALUE' }, + ); +} + +function testBroadcastProtocolReturnsUndefined() { + const obj = { + [Symbol.for('Stream.broadcastProtocol')]() { }, + }; + assert.throws( + () => Broadcast.from(obj), + { code: 'ERR_INVALID_RETURN_VALUE' }, + ); +} + +Promise.all([ + testBroadcastFromAsyncIterable(), + testBroadcastFromNonArrayChunks(), + testBroadcastFromStringChunks(), + testBroadcastFromStringInput(), + testBroadcastFromUint8ArrayInput(), + testBroadcastFromDataViewInput(), + testBroadcastFromMultipleConsumers(), + testAbortSignal(), + testAlreadyAbortedSignal(), + testBroadcastFromCancelWhileBlocked(), + testBroadcastFromSourceError(), + testBroadcastProtocolReturnsNull(), + testBroadcastProtocolReturnsString(), + testBroadcastProtocolReturnsUndefined(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-consumers-bytes.js b/test/parallel/test-stream-iter-consumers-bytes.js new file mode 100644 index 000000000000..53d0a3858f87 --- /dev/null +++ b/test/parallel/test-stream-iter-consumers-bytes.js @@ -0,0 +1,270 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { + from, + fromSync, + bytes, + bytesSync, + text, + textSync, + arrayBuffer, + arrayBufferSync, + array, + arraySync, + toAsyncStreamable, +} = require('stream/iter'); + +// ============================================================================= +// bytesSync / bytes +// ============================================================================= + +async function testBytesSyncBasic() { + const data = bytesSync(fromSync('hello')); + assert.deepStrictEqual(data, new TextEncoder().encode('hello')); +} + +async function testBytesSyncLimit() { + assert.throws( + () => bytesSync(fromSync('hello world'), { limit: 3 }), + { name: 'RangeError' }, + ); +} + +async function testBytesAsync() { + const data = await bytes(from('hello-async')); + assert.deepStrictEqual(data, new TextEncoder().encode('hello-async')); +} + +async function testBytesAsyncLimit() { + await assert.rejects( + () => bytes(from('hello world'), { limit: 3 }), + { name: 'RangeError' }, + ); +} + +async function testBytesAsyncAbort() { + await assert.rejects( + () => bytes(from('data'), { signal: AbortSignal.abort() }), + { name: 'AbortError' }, + ); +} + +async function testAsyncConsumersAbortPendingNext() { + const consumers = [ + ['bytes', bytes], + ['text', text], + ['arrayBuffer', arrayBuffer], + ['array', array], + ]; + + for (const [name, consumer] of consumers) { + const ac = new AbortController(); + const reason = new Error(`${name} boom`); + + async function* never() { + await new Promise(() => {}); + yield []; + } + + const promise = consumer(never(), { __proto__: null, signal: ac.signal }); + ac.abort(reason); + + await assert.rejects(promise, reason); + } +} + +async function testAsyncConsumersAbortPendingNormalization() { + const consumers = [ + ['bytes', bytes], + ['text', text], + ['arrayBuffer', arrayBuffer], + ['array', array], + ]; + + for (const [name, consumer] of consumers) { + const ac = new AbortController(); + const reason = new Error(`${name} normalization boom`); + const source = { + __proto__: null, + [toAsyncStreamable]() { + return new Promise(() => {}); + }, + }; + + const promise = consumer(source, { __proto__: null, signal: ac.signal }); + ac.abort(reason); + + await assert.rejects(promise, reason); + } +} + +async function testBytesEmpty() { + const data = await bytes(from([])); + assert.ok(data instanceof Uint8Array); + assert.strictEqual(data.byteLength, 0); +} + +// ============================================================================= +// arrayBufferSync / arrayBuffer +// ============================================================================= + +async function testArrayBufferSyncBasic() { + const ab = arrayBufferSync(fromSync(new Uint8Array([1, 2, 3]))); + assert.ok(ab instanceof ArrayBuffer); + assert.strictEqual(ab.byteLength, 3); + const view = new Uint8Array(ab); + assert.deepStrictEqual(view, new Uint8Array([1, 2, 3])); +} + +async function testArrayBufferAsync() { + const ab = await arrayBuffer(from(new Uint8Array([10, 20, 30]))); + assert.ok(ab instanceof ArrayBuffer); + assert.strictEqual(ab.byteLength, 3); + const view = new Uint8Array(ab); + assert.deepStrictEqual(view, new Uint8Array([10, 20, 30])); +} + +// ============================================================================= +// arraySync / array +// ============================================================================= + +async function testArraySyncBasic() { + function* gen() { + yield new Uint8Array([1]); + yield new Uint8Array([2]); + yield new Uint8Array([3]); + } + const chunks = arraySync(fromSync(gen())); + assert.strictEqual(chunks.length, 3); + assert.deepStrictEqual(chunks[0], new Uint8Array([1])); + assert.deepStrictEqual(chunks[1], new Uint8Array([2])); + assert.deepStrictEqual(chunks[2], new Uint8Array([3])); +} + +async function testArraySyncLimit() { + function* gen() { + yield new Uint8Array(100); + yield new Uint8Array(100); + } + const source = fromSync(gen()); + assert.throws( + () => arraySync(source, { limit: 50 }), + { name: 'RangeError' }, + ); +} + +async function testArrayAsync() { + async function* gen() { + yield [new Uint8Array([1])]; + yield [new Uint8Array([2])]; + } + const chunks = await array(gen()); + assert.strictEqual(chunks.length, 2); + assert.deepStrictEqual(chunks[0], new Uint8Array([1])); + assert.deepStrictEqual(chunks[1], new Uint8Array([2])); +} + +async function testArrayAsyncLimit() { + async function* gen() { + yield [new Uint8Array(100)]; + yield [new Uint8Array(100)]; + } + await assert.rejects( + () => array(gen(), { limit: 50 }), + { name: 'RangeError' }, + ); +} + +// ============================================================================= +// Non-array batch tolerance +// ============================================================================= + +// Regression test: consumers should tolerate sources that yield raw +// Uint8Array or string values instead of Uint8Array[] batches. +async function testConsumersNonArrayBatch() { + const encoder = new TextEncoder(); + + // Source yields raw Uint8Array, not wrapped in an array + async function* rawSource() { + yield encoder.encode('hello'); + yield encoder.encode(' world'); + } + const result = await text(rawSource()); + assert.strictEqual(result, 'hello world'); + + // bytes() with raw chunks + async function* rawSource2() { + yield encoder.encode('ab'); + } + const data = await bytes(rawSource2()); + assert.strictEqual(data.length, 2); + assert.strictEqual(data[0], 97); // 'a' + assert.strictEqual(data[1], 98); // 'b' + + // array() with raw chunks + async function* rawSource3() { + yield encoder.encode('x'); + yield encoder.encode('y'); + } + const arr = await array(rawSource3()); + assert.strictEqual(arr.length, 2); +} + +async function testConsumersNonArrayBatchSync() { + const encoder = new TextEncoder(); + + function* rawSyncSource() { + yield encoder.encode('sync'); + yield encoder.encode('data'); + } + const result = textSync(rawSyncSource()); + assert.strictEqual(result, 'syncdata'); + + const data = bytesSync(rawSyncSource()); + assert.strictEqual(data.length, 8); + + const arr = arraySync(rawSyncSource()); + assert.strictEqual(arr.length, 2); +} + +// Consumers accept string sources directly (normalized via from/fromSync) +async function testBytesStringSource() { + const result = await bytes('hello-bytes'); + assert.strictEqual(new TextDecoder().decode(result), 'hello-bytes'); +} + +function testBytesSyncStringSource() { + const result = bytesSync('hello-sync'); + assert.strictEqual(new TextDecoder().decode(result), 'hello-sync'); +} + +async function testTextStringSource() { + const { text } = require('stream/iter'); + const result = await text('direct-string'); + assert.strictEqual(result, 'direct-string'); +} + +Promise.all([ + testBytesSyncBasic(), + testBytesSyncLimit(), + testBytesAsync(), + testBytesAsyncLimit(), + testBytesAsyncAbort(), + testAsyncConsumersAbortPendingNext(), + testAsyncConsumersAbortPendingNormalization(), + testBytesEmpty(), + testArrayBufferSyncBasic(), + testArrayBufferAsync(), + testArraySyncBasic(), + testArraySyncLimit(), + testArrayAsync(), + testArrayAsyncLimit(), + testConsumersNonArrayBatch(), + testConsumersNonArrayBatchSync(), + testBytesStringSource(), + testBytesSyncStringSource(), + testTextStringSource(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-consumers-merge.js b/test/parallel/test-stream-iter-consumers-merge.js new file mode 100644 index 000000000000..84aeb24b6159 --- /dev/null +++ b/test/parallel/test-stream-iter-consumers-merge.js @@ -0,0 +1,373 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { + from, + fromSync, + push, + merge, + text, + toAsyncStreamable, + toStreamable, +} = require('stream/iter'); + +// ============================================================================= +// merge +// ============================================================================= + +async function testMergeTwoSources() { + const { writer: w1, readable: r1 } = push(); + const { writer: w2, readable: r2 } = push(); + + w1.write('from-a'); + w1.end(); + w2.write('from-b'); + w2.end(); + + const merged = merge(r1, r2); + const chunks = []; + for await (const batch of merged) { + for (const chunk of batch) { + chunks.push(new TextDecoder().decode(chunk)); + } + } + + // Both sources should be present (order is temporal, not guaranteed) + assert.strictEqual(chunks.length, 2); + assert.ok(chunks.includes('from-a')); + assert.ok(chunks.includes('from-b')); +} + +async function testMergeSingleSource() { + const data = await text(merge(from('only-one'))); + assert.strictEqual(data, 'only-one'); +} + +async function testMergeEmpty() { + const merged = merge(); + const batches = []; + for await (const batch of merged) { + batches.push(batch); + } + assert.strictEqual(batches.length, 0); +} + +async function testMergeWithAbortSignal() { + const merged = merge(from('data'), { signal: AbortSignal.abort() }); + + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of merged) { + assert.fail('Should not reach here'); + } + }, + { name: 'AbortError' }, + ); +} + +// Regression test: merge() with sync iterable sources +async function testMergeSyncSources() { + const s1 = fromSync('abc'); + const s2 = fromSync('def'); + const result = await text(merge(s1, s2)); + // Both sources should be fully consumed; order may vary + assert.strictEqual(result.length, 6); + for (const ch of 'abcdef') { + assert.ok(result.includes(ch), `missing '${ch}' in '${result}'`); + } +} + +// ============================================================================= +// Merge error propagation +// ============================================================================= + +async function testMergeSourceError() { + async function* goodSource() { + const enc = new TextEncoder(); + yield [enc.encode('a')]; + // Slow so the bad source errors first + await new Promise((r) => setTimeout(r, 50)); + yield [enc.encode('b')]; + } + + async function* badSource() { + yield [new TextEncoder().encode('x')]; + throw new Error('merge source boom'); + } + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of merge(goodSource(), badSource())) { + /* consume */ + } + }, + { message: 'merge source boom' }, + ); +} + +async function testMergeConsumerBreak() { + let source1Return = false; + let source2Return = false; + async function* source1() { + try { + while (true) yield [new TextEncoder().encode('a')]; + } finally { + source1Return = true; + } + } + + async function* source2() { + try { + while (true) yield [new TextEncoder().encode('b')]; + } finally { + source2Return = true; + } + } + // eslint-disable-next-line no-unused-vars + for await (const _ of merge(source1(), source2())) { + break; // Break after first batch + } + // Give async cleanup a tick to complete + await new Promise(setImmediate); + // Both sources should be cleaned up + assert.strictEqual(source1Return && source2Return, true); +} + +async function testMergeSignalMidIteration() { + const ac = new AbortController(); + async function* slowSource() { + const enc = new TextEncoder(); + yield [enc.encode('a')]; + await new Promise((r) => setTimeout(r, 100)); + yield [enc.encode('b')]; + } + const merged = merge(slowSource(), { signal: ac.signal }); + const iter = merged[Symbol.asyncIterator](); + await iter.next(); // First batch + ac.abort(); + await assert.rejects(() => iter.next(), { name: 'AbortError' }); +} + +async function testMergeSignalDuringPendingMultiSourceRead() { + const ac = new AbortController(); + + async function* pending() { + await new Promise(() => {}); + yield []; + } + + const iter = merge(pending(), pending(), { + __proto__: null, + signal: ac.signal, + })[Symbol.asyncIterator](); + + const next = iter.next(); + ac.abort(); + + await assert.rejects(next, { name: 'AbortError' }); +} + +async function testMergeSignalDuringPendingSingleSourceRead() { + const ac = new AbortController(); + let returned = false; + const source = { + __proto__: null, + [Symbol.asyncIterator]() { + return this; + }, + next() { + // Intentionally never settle to verify that aborting interrupts a pending read. + return new Promise(() => {}); + }, + return() { + returned = true; + return { __proto__: null, done: true }; + }, + }; + + const iter = merge(source, { + __proto__: null, + signal: ac.signal, + })[Symbol.asyncIterator](); + + const next = iter.next(); + await new Promise(setImmediate); + ac.abort(); + + await assert.rejects(next, { name: 'AbortError' }); + assert.strictEqual(returned, true); +} + +async function testMergeDoesNotDrainSourcesWhileIdle() { + function source(n) { + return { + __proto__: null, + pulls: 0, + async *[Symbol.asyncIterator]() { + while (this.pulls < n) { + yield [Buffer.from(`${++this.pulls}`)]; + } + }, + }; + } + + const a = source(5); + const b = source(5); + const iterator = merge(a, b)[Symbol.asyncIterator](); + + await iterator.next(); + await new Promise(setImmediate); + + assert.strictEqual(a.pulls, 1); + assert.strictEqual(b.pulls, 1); + + await iterator.return?.(); +} + +// merge() accepts string sources (normalized via from()) +async function testMergeStringSources() { + const batches = []; + for await (const batch of merge('hello', 'world')) { + batches.push(batch); + } + // Each string becomes a single-batch source + assert.strictEqual(batches.length >= 2, true); + const combined = new TextDecoder().decode(Buffer.concat(batches.flat())); + // Both strings should appear (order may vary) + assert.ok(combined.includes('hello')); + assert.ok(combined.includes('world')); +} + +// merge() accepts object-like sources that are normalized via from() +async function testMergeObjectLikeSources() { + const arrayBuffer = new TextEncoder().encode('abc').buffer; + const dataView = new DataView(new TextEncoder().encode('def').buffer); + const streamable = { + [toStreamable]() { + return 'ghi'; + }, + }; + const asyncStreamable = { + [toAsyncStreamable]() { + return Promise.resolve('jkl'); + }, + }; + + assert.strictEqual(await text(merge(arrayBuffer)), 'abc'); + assert.strictEqual(await text(merge(dataView)), 'def'); + assert.strictEqual(await text(merge(streamable)), 'ghi'); + assert.strictEqual(await text(merge(asyncStreamable)), 'jkl'); +} + +// ============================================================================= +// Merge cleanup error handling +// ============================================================================= + +function throwInFinally(message) { + throw new Error(message); +} + +// Cleanup error with no primary error: iterator.return() throws during +// normal completion. The cleanup error should propagate directly. +async function testMergeCleanupErrorOnly() { + async function* source() { + yield [new TextEncoder().encode('data')]; + } + + async function* failingReturnSource() { + try { + yield [new TextEncoder().encode('more')]; + } finally { + throwInFinally('cleanup boom'); + } + } + + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of merge(source(), failingReturnSource())) { + // Consume all - no primary error + } + }, + { message: 'cleanup boom' }, + ); +} + +// Primary error + cleanup error: a source throws during iteration AND +// iterator.return() also throws. Should get a SuppressedError. +async function testMergePrimaryAndCleanupError() { + async function* badSource() { + yield [new TextEncoder().encode('x')]; + throw new Error('primary boom'); + } + + async function* failingReturnSource() { + try { + while (true) yield [new TextEncoder().encode('y')]; + } finally { + throwInFinally('cleanup boom'); + } + } + + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of merge(badSource(), failingReturnSource())) { + // Consume until error + } + }, + (err) => { + assert.ok( + err instanceof SuppressedError, + `Expected SuppressedError, got ${err.constructor.name}`, + ); + assert.strictEqual(err.error.message, 'primary boom'); + assert.strictEqual(err.suppressed.message, 'cleanup boom'); + return true; + }, + ); +} + +// Consumer break + cleanup error: consumer breaks and iterator.return() +// throws. The cleanup error should propagate. +async function testMergeBreakWithCleanupError() { + async function* failingReturnSource() { + try { + while (true) yield [new TextEncoder().encode('data')]; + } finally { + throwInFinally('cleanup on break'); + } + } + + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of merge(failingReturnSource())) { + break; + } + }, + { message: 'cleanup on break' }, + ); +} + +Promise.all([ + testMergeTwoSources(), + testMergeSingleSource(), + testMergeEmpty(), + testMergeWithAbortSignal(), + testMergeSyncSources(), + testMergeSourceError(), + testMergeConsumerBreak(), + testMergeSignalMidIteration(), + testMergeSignalDuringPendingMultiSourceRead(), + testMergeSignalDuringPendingSingleSourceRead(), + testMergeDoesNotDrainSourcesWhileIdle(), + testMergeStringSources(), + testMergeObjectLikeSources(), + testMergeCleanupErrorOnly(), + testMergePrimaryAndCleanupError(), + testMergeBreakWithCleanupError(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-consumers-tap.js b/test/parallel/test-stream-iter-consumers-tap.js new file mode 100644 index 000000000000..b93f93eb242b --- /dev/null +++ b/test/parallel/test-stream-iter-consumers-tap.js @@ -0,0 +1,130 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { + from, + fromSync, + pull, + pullSync, + push, + tap, + tapSync, + text, + textSync, +} = require('stream/iter'); + +// ============================================================================= +// tap / tapSync +// ============================================================================= + +async function testTapSync() { + const observed = []; + const observer = tapSync((chunks) => { + if (chunks !== null) { + observed.push(chunks.length); + } + }); + + // tapSync returns a function transform + assert.strictEqual(typeof observer, 'function'); + + // Test that it passes data through unchanged + const input = [new Uint8Array([1]), new Uint8Array([2])]; + const result = observer(input); + assert.deepStrictEqual(result, input); + assert.deepStrictEqual(observed, [2]); + + // null (flush) passes through + const flushResult = observer(null); + assert.strictEqual(flushResult, null); +} + +async function testTapAsync() { + const observed = []; + const observer = tap(async (chunks) => { + if (chunks !== null) { + observed.push(chunks.length); + } + }); + + assert.strictEqual(typeof observer, 'function'); + + const input = [new Uint8Array([1])]; + const result = await observer(input); + assert.deepStrictEqual(result, input); + assert.deepStrictEqual(observed, [1]); +} + +async function testTapInPipeline() { + const { writer, readable } = push(); + const seen = []; + + const observer = tap(async (chunks) => { + if (chunks !== null) { + for (const chunk of chunks) { + seen.push(new TextDecoder().decode(chunk)); + } + } + }); + + writer.write('hello'); + writer.end(); + + // Use pull with tap as a transform + const result = pull(readable, observer); + const data = await text(result); + + assert.strictEqual(data, 'hello'); + assert.strictEqual(seen.length, 1); + assert.strictEqual(seen[0], 'hello'); +} + +// Tap callback error propagates through async pipeline +async function testTapAsyncErrorPropagation() { + const badTap = tap(() => { throw new Error('tap error'); }); + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of pull(from('hello'), badTap)) { /* consume */ } + }, { message: 'tap error' }); +} + +// TapSync callback error propagates through sync pipeline +function testTapSyncErrorPropagation() { + const badTap = tapSync(() => { throw new Error('tapSync error'); }); + assert.throws(() => { + // eslint-disable-next-line no-unused-vars + for (const _ of pullSync(fromSync('hello'), badTap)) { /* consume */ } + }, { message: 'tapSync error' }); +} + +// TapSync in a pullSync pipeline passes through data and flush +function testTapSyncInPipeline() { + const seen = []; + let sawFlush = false; + const observer = tapSync((chunks) => { + if (chunks === null) { + sawFlush = true; + } else { + for (const chunk of chunks) { + seen.push(new TextDecoder().decode(chunk)); + } + } + }); + + const data = textSync(pullSync(fromSync('hello'), observer)); + assert.strictEqual(data, 'hello'); + assert.strictEqual(seen.length, 1); + assert.strictEqual(seen[0], 'hello'); + assert.strictEqual(sawFlush, true); +} + +Promise.all([ + testTapSync(), + testTapAsync(), + testTapInPipeline(), + testTapAsyncErrorPropagation(), + testTapSyncErrorPropagation(), + testTapSyncInPipeline(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-consumers-text.js b/test/parallel/test-stream-iter-consumers-text.js new file mode 100644 index 000000000000..a8fb7a74367f --- /dev/null +++ b/test/parallel/test-stream-iter-consumers-text.js @@ -0,0 +1,178 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { + from, + fromSync, + text, + textSync, +} = require('stream/iter'); + +// ============================================================================= +// textSync / text +// ============================================================================= + +async function testTextSyncBasic() { + const data = textSync(fromSync('hello text')); + assert.strictEqual(data, 'hello text'); +} + +async function testTextAsync() { + const data = await text(from('hello async text')); + assert.strictEqual(data, 'hello async text'); +} + +async function testTextEncoding() { + // Default encoding is utf-8 + const data = await text(from('café')); + assert.strictEqual(data, 'café'); +} + +// ============================================================================= +// Text encoding tests +// ============================================================================= + +async function testTextNonUtf8Encoding() { + // Latin-1 encoding + const latin1Bytes = new Uint8Array([0xE9, 0xE8, 0xEA]); // é, è, ê in latin1 + const result = await text(from(latin1Bytes), { encoding: 'iso-8859-1' }); + assert.strictEqual(result, 'éèê'); +} + +async function testTextSyncNonUtf8Encoding() { + const latin1Bytes = new Uint8Array([0xE9, 0xE8, 0xEA]); + const result = textSync(fromSync(latin1Bytes), { encoding: 'iso-8859-1' }); + assert.strictEqual(result, 'éèê'); +} + +async function testTextInvalidUtf8() { + // Invalid UTF-8 sequence with fatal: true should throw + const invalid = new Uint8Array([0xFF, 0xFE]); + await assert.rejects( + () => text(from(invalid)), + { name: 'TypeError' }, // TextDecoder fatal throws TypeError + ); +} + +async function testTextWithLimit() { + // Limit caps total bytes; exceeding throws ERR_OUT_OF_RANGE + await assert.rejects( + () => text(from('hello world'), { limit: 5 }), + { code: 'ERR_OUT_OF_RANGE' }, + ); + // Within limit should succeed + const result = await text(from('hello'), { limit: 10 }); + assert.strictEqual(result, 'hello'); + + // Exact boundary: 'hello' is 5 UTF-8 bytes, limit: 5 should succeed + // (source uses > not >=) + const exact = await text(from('hello'), { limit: 5 }); + assert.strictEqual(exact, 'hello'); +} + +async function testTextSyncWithLimit() { + // Sync version of limit testing + assert.throws( + () => textSync(fromSync('hello world'), { limit: 5 }), + { code: 'ERR_OUT_OF_RANGE' }, + ); + const result = textSync(fromSync('hello'), { limit: 10 }); + assert.strictEqual(result, 'hello'); + + // Exact boundary + const exact = textSync(fromSync('hello'), { limit: 5 }); + assert.strictEqual(exact, 'hello'); +} + +async function testTextEmpty() { + const result = await text(from('')); + assert.strictEqual(result, ''); + + const syncResult = textSync(fromSync('')); + assert.strictEqual(syncResult, ''); +} + +// text() with abort signal +async function testTextWithSignal() { + await assert.rejects( + () => text(from('data'), { signal: AbortSignal.abort() }), + { name: 'AbortError' }, + ); +} + +// Multi-chunk source with a multi-byte UTF-8 character split across chunks +async function testTextMultiChunkSplitCodepoint() { + // '€' is U+20AC, encoded as 3 UTF-8 bytes: 0xE2, 0x82, 0xAC + // Split these bytes across two chunks to test proper re-assembly + async function* splitSource() { + yield [new Uint8Array([0xE2, 0x82])]; // First 2 bytes of '€' + yield [new Uint8Array([0xAC])]; // Last byte of '€' + } + const result = await text(splitSource()); + assert.strictEqual(result, '€'); +} + +// BOM should be stripped (ignoreBOM defaults to false per spec) +async function testTextBOMStripped() { + // UTF-8 BOM: 0xEF, 0xBB, 0xBF followed by 'hi' + const withBOM = new Uint8Array([0xEF, 0xBB, 0xBF, 0x68, 0x69]); + const result = await text(from(withBOM)); + assert.strictEqual(result, 'hi'); +} + +async function testTextSyncBOMStripped() { + const withBOM = new Uint8Array([0xEF, 0xBB, 0xBF, 0x68, 0x69]); + const result = textSync(fromSync(withBOM)); + assert.strictEqual(result, 'hi'); +} + +// Unsupported encoding throws RangeError +async function testTextUnsupportedEncodingThrowsRangeError() { + await assert.rejects( + () => text(from('hello'), { encoding: 'not-a-real-encoding' }), + { name: 'RangeError' }, + ); +} + +function testTextSyncUnsupportedEncodingThrowsRangeError() { + assert.throws( + () => textSync(fromSync('hello'), { encoding: 'not-a-real-encoding' }), + { name: 'RangeError' }, + ); +} + +async function testTextNonStringEncodingThrowsTypeError() { + await assert.rejects( + () => text(from('hello'), { encoding: 1 }), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +function testTextSyncNonStringEncodingThrowsTypeError() { + assert.throws( + () => textSync(fromSync('hello'), { encoding: 1 }), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +Promise.all([ + testTextSyncBasic(), + testTextAsync(), + testTextEncoding(), + testTextNonUtf8Encoding(), + testTextSyncNonUtf8Encoding(), + testTextInvalidUtf8(), + testTextWithLimit(), + testTextSyncWithLimit(), + testTextEmpty(), + testTextWithSignal(), + testTextMultiChunkSplitCodepoint(), + testTextBOMStripped(), + testTextSyncBOMStripped(), + testTextUnsupportedEncodingThrowsRangeError(), + testTextSyncUnsupportedEncodingThrowsRangeError(), + testTextNonStringEncodingThrowsTypeError(), + testTextSyncNonStringEncodingThrowsTypeError(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-cross-realm.js b/test/parallel/test-stream-iter-cross-realm.js new file mode 100644 index 000000000000..6a6e92179253 --- /dev/null +++ b/test/parallel/test-stream-iter-cross-realm.js @@ -0,0 +1,132 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const vm = require('vm'); +const { from, fromSync, pull, text, bytesSync } = require('stream/iter'); + +// Cross-realm objects are created in a different VM context. +// They have different prototypes, so `instanceof` checks fail. +// These tests verify that stream/iter correctly handles cross-realm types. + +// Helper: compare Uint8Array content regardless of realm. +function assertBytes(actual, expected) { + assert.strictEqual(actual.length, expected.length, + `length mismatch: ${actual.length} !== ${expected.length}`); + for (let i = 0; i < expected.length; i++) { + assert.strictEqual(actual[i], expected[i], `byte mismatch at index ${i}`); + } +} + +// ============================================================================= +// from() / fromSync() with cross-realm Uint8Array +// ============================================================================= + +async function testFromSyncCrossRealmUint8Array() { + const crossRealm = vm.runInNewContext('new Uint8Array([1, 2, 3])'); + const data = bytesSync(fromSync(crossRealm)); + assertBytes(data, new Uint8Array([1, 2, 3])); +} + +async function testFromCrossRealmUint8Array() { + const crossRealm = vm.runInNewContext('new Uint8Array([4, 5, 6])'); + const result = await text(from(crossRealm)); + assert.strictEqual(result, '\x04\x05\x06'); +} + +// ============================================================================= +// from() / fromSync() with cross-realm ArrayBuffer +// ============================================================================= + +async function testFromSyncCrossRealmArrayBuffer() { + const crossRealm = vm.runInNewContext( + 'new Uint8Array([7, 8, 9]).buffer', + ); + const data = bytesSync(fromSync(crossRealm)); + assertBytes(data, new Uint8Array([7, 8, 9])); +} + +async function testFromCrossRealmArrayBuffer() { + const crossRealm = vm.runInNewContext( + 'new Uint8Array([10, 11, 12]).buffer', + ); + const result = await text(from(crossRealm)); + assert.strictEqual(result, '\x0a\x0b\x0c'); +} + +// ============================================================================= +// from() / fromSync() with cross-realm Uint8Array[] +// ============================================================================= + +async function testFromSyncCrossRealmUint8ArrayArray() { + const crossRealm = vm.runInNewContext( + '[new Uint8Array([1, 2]), new Uint8Array([3, 4])]', + ); + const data = bytesSync(fromSync(crossRealm)); + assertBytes(data, new Uint8Array([1, 2, 3, 4])); +} + +async function testFromCrossRealmUint8ArrayArray() { + const crossRealm = vm.runInNewContext( + '[new Uint8Array([5, 6]), new Uint8Array([7, 8])]', + ); + const result = await text(from(crossRealm)); + assert.strictEqual(result, '\x05\x06\x07\x08'); +} + +// ============================================================================= +// pull() with cross-realm Uint8Array from transforms +// ============================================================================= + +async function testPullCrossRealmTransformOutput() { + // Transform that returns cross-realm Uint8Array[] batches + const crossRealmTransform = (chunks) => { + if (chunks === null) return null; + // Re-encode each chunk as cross-realm Uint8Array + return vm.runInNewContext( + `[new Uint8Array([${[...chunks[0]]}])]`, + ); + }; + const output = await text(pull(from('hello'), crossRealmTransform)); + assert.strictEqual(output, 'hello'); +} + +// ============================================================================= +// from() with cross-realm Promise +// ============================================================================= + +async function testFromCrossRealmPromise() { + const crossRealmPromise = vm.runInNewContext( + 'Promise.resolve("promised-data")', + ); + async function* gen() { + yield crossRealmPromise; + } + const result = await text(from(gen())); + assert.strictEqual(result, 'promised-data'); +} + +// ============================================================================= +// from() with cross-realm typed arrays (non-Uint8Array views) +// ============================================================================= + +async function testFromSyncCrossRealmInt32Array() { + const crossRealm = vm.runInNewContext('new Int32Array([1])'); + const data = bytesSync(fromSync(crossRealm)); + // Int32Array([1]) = 4 bytes, endianness varies by platform + assert.strictEqual(data.length, 4); + assert.strictEqual(new Int32Array(data.buffer, data.byteOffset, 1)[0], 1); +} + +Promise.all([ + testFromSyncCrossRealmUint8Array(), + testFromCrossRealmUint8Array(), + testFromSyncCrossRealmArrayBuffer(), + testFromCrossRealmArrayBuffer(), + testFromSyncCrossRealmUint8ArrayArray(), + testFromCrossRealmUint8ArrayArray(), + testPullCrossRealmTransformOutput(), + testFromCrossRealmPromise(), + testFromSyncCrossRealmInt32Array(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-disabled.js b/test/parallel/test-stream-iter-disabled.js new file mode 100644 index 000000000000..8c8538ffae92 --- /dev/null +++ b/test/parallel/test-stream-iter-disabled.js @@ -0,0 +1,34 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const { spawnPromisified } = common; + +async function testRequireNodeStreamIterWithoutFlag() { + const { stderr, code } = await spawnPromisified(process.execPath, [ + '-e', 'require("node:stream/iter")', + ]); + assert.match(stderr, /No such built-in module: node:stream\/iter/); + assert.notStrictEqual(code, 0); +} + +async function testRequireStreamIterWithoutFlag() { + const { stderr, code } = await spawnPromisified(process.execPath, [ + '-e', 'require("stream/iter")', + ]); + assert.match(stderr, /Cannot find module/); + assert.notStrictEqual(code, 0); +} + +async function testRequireWithFlag() { + const { code } = await spawnPromisified(process.execPath, [ + '--experimental-stream-iter', + '-e', 'require("node:stream/iter")', + ]); + assert.strictEqual(code, 0); +} + +Promise.all([ + testRequireNodeStreamIterWithoutFlag(), + testRequireStreamIterWithoutFlag(), + testRequireWithFlag(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-duplex.js b/test/parallel/test-stream-iter-duplex.js new file mode 100644 index 000000000000..0969b91e7d21 --- /dev/null +++ b/test/parallel/test-stream-iter-duplex.js @@ -0,0 +1,205 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { duplex, text, bytes } = require('stream/iter'); + +// ============================================================================= +// Basic duplex +// ============================================================================= + +async function testBasicDuplex() { + const [channelA, channelB] = duplex(); + + // A writes, B reads + await channelA.writer.write('hello from A'); + await channelA.close(); + + const dataAtB = await text(channelB.readable); + assert.strictEqual(dataAtB, 'hello from A'); +} + +async function testBidirectional() { + const [channelA, channelB] = duplex(); + + // A writes to B, B writes to A concurrently + const writeA = (async () => { + await channelA.writer.write('A to B'); + await channelA.close(); + })(); + + const writeB = (async () => { + await channelB.writer.write('B to A'); + await channelB.close(); + })(); + + const readAtB = text(channelB.readable); + const readAtA = text(channelA.readable); + + await Promise.all([writeA, writeB]); + + const [dataAtA, dataAtB] = await Promise.all([readAtA, readAtB]); + + assert.strictEqual(dataAtB, 'A to B'); + assert.strictEqual(dataAtA, 'B to A'); +} + +async function testMultipleWrites() { + const [channelA, channelB] = duplex({ budget: 16384 }); + + await channelA.writer.write('one'); + await channelA.writer.write('two'); + await channelA.writer.write('three'); + await channelA.close(); + + const data = await text(channelB.readable); + assert.strictEqual(data, 'onetwothree'); +} + +async function testChannelClose() { + const [channelA, channelB] = duplex(); + + await channelA.close(); + + // Should be able to close twice without error + await channelA.close(); + + // B's readable should end (A -> B direction is closed) + const batches = []; + for await (const batch of channelB.readable) { + batches.push(batch); + } + assert.strictEqual(batches.length, 0); +} + +async function testWithOptions() { + const [channelA, channelB] = duplex({ + budget: 16384, + backpressure: 'strict', + }); + + await channelA.writer.write('msg'); + await channelA.close(); + + const data = await text(channelB.readable); + assert.strictEqual(data, 'msg'); +} + +async function testPerChannelOptions() { + const [channelA, channelB] = duplex({ + a: { budget: 16384 }, + b: { budget: 16384 }, + }); + + // Channel A -> B direction uses A's options + // Channel B -> A direction uses B's options + await channelA.writer.write('from-a'); + await channelA.close(); + + await channelB.writer.write('from-b'); + await channelB.close(); + + const [dataAtA, dataAtB] = await Promise.all([ + text(channelA.readable), + text(channelB.readable), + ]); + + assert.strictEqual(dataAtB, 'from-a'); + assert.strictEqual(dataAtA, 'from-b'); +} + +async function testAbortSignal() { + const ac = new AbortController(); + const [channelA] = duplex({ signal: ac.signal }); + + ac.abort(); + + // Both directions should error + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of channelA.readable) { + assert.fail('Should not reach here'); + } + }, + (err) => err.name === 'AbortError', + ); +} + +async function testWriterEndWithPreAbortedSignal() { + const [channelA, channelB] = duplex(); + const reason = new Error('end aborted'); + + await assert.rejects( + channelA.writer.end({ signal: AbortSignal.abort(reason) }), + (error) => error === reason, + ); + + await channelA.writer.write('still open'); + const completedEnd = channelA.writer.end(); + assert.strictEqual(await text(channelB.readable), 'still open'); + assert.strictEqual(await completedEnd, 10); + await channelB.close(); +} + +async function testEmptyDuplex() { + const [channelA, channelB] = duplex(); + + // Close without writing + await channelA.close(); + await channelB.close(); + + const dataAtA = await bytes(channelA.readable); + const dataAtB = await bytes(channelB.readable); + + assert.strictEqual(dataAtA.byteLength, 0); + assert.strictEqual(dataAtB.byteLength, 0); +} + +// Channel fail propagation +async function testChannelFail() { + const [a, b] = duplex(); + a.writer.fail(new Error('channel failed')); + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of b.readable) { /* consume */ } + }, { message: 'channel failed' }); + await b.close(); +} + +// Abort signal affects both channels +async function testAbortSignalBothChannels() { + const ac = new AbortController(); + const [channelA, channelB] = duplex({ signal: ac.signal }); + + ac.abort(); + + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of channelA.readable) { + assert.fail('Should not reach here'); + } + }, (err) => err.name === 'AbortError'); + + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of channelB.readable) { + assert.fail('Should not reach here'); + } + }, (err) => err.name === 'AbortError'); +} + +Promise.all([ + testBasicDuplex(), + testBidirectional(), + testMultipleWrites(), + testChannelClose(), + testWithOptions(), + testPerChannelOptions(), + testAbortSignal(), + testWriterEndWithPreAbortedSignal(), + testEmptyDuplex(), + testChannelFail(), + testAbortSignalBothChannels(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-from-async.js b/test/parallel/test-stream-iter-from-async.js new file mode 100644 index 000000000000..5ef78088bfbd --- /dev/null +++ b/test/parallel/test-stream-iter-from-async.js @@ -0,0 +1,283 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { from, text, Stream } = require('stream/iter'); + +async function testFromString() { + const readable = from('hello-async'); + const batches = []; + for await (const batch of readable) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.deepStrictEqual(batches[0][0], + new TextEncoder().encode('hello-async')); +} + +async function testFromAsyncGenerator() { + async function* gen() { + yield new Uint8Array([10, 20]); + yield new Uint8Array([30, 40]); + } + const readable = from(gen()); + const batches = []; + for await (const batch of readable) { + batches.push(batch); + } + assert.strictEqual(batches.length, 2); + assert.deepStrictEqual(batches[0][0], new Uint8Array([10, 20])); + assert.deepStrictEqual(batches[1][0], new Uint8Array([30, 40])); +} + +async function testFromSyncIterableAsAsync() { + // Sync iterable passed to from() should work + function* gen() { + yield new Uint8Array([1]); + yield new Uint8Array([2]); + } + const readable = from(gen()); + const batches = []; + for await (const batch of readable) { + batches.push(batch); + } + // Sync iterables get batched together into a single batch + assert.strictEqual(batches.length, 1); + assert.strictEqual(batches[0].length, 2); + assert.deepStrictEqual(batches[0][0], new Uint8Array([1])); + assert.deepStrictEqual(batches[0][1], new Uint8Array([2])); +} + +async function testFromSyncIterableAwaitsPromiseValues() { + const result = await text(from([Promise.resolve('promise-value')])); + assert.strictEqual(result, 'promise-value'); +} + +async function testFromSyncIterableRejectsNestedAsyncIterable() { + async function* asyncGenerator() { + yield 'data'; + } + + await assert.rejects( + () => text(from([asyncGenerator()])), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +async function testFromSyncIterableRejectsNestedToAsyncStreamable() { + const obj = { + [Symbol.for('Stream.toAsyncStreamable')]() { + return 'data'; + }, + }; + + await assert.rejects( + () => text(from([obj])), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +async function testFromToAsyncStreamableProtocol() { + const sym = Symbol.for('Stream.toAsyncStreamable'); + const obj = { + [sym]() { + return 'async-protocol-data'; + }, + }; + async function* gen() { + yield obj; + } + const readable = from(gen()); + const batches = []; + for await (const batch of readable) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.deepStrictEqual(batches[0][0], + new TextEncoder().encode('async-protocol-data')); +} + +function testFromRejectsNonStreamable() { + assert.throws( + () => from(12345), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); + assert.throws( + () => from(null), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +async function testFromEmptyArray() { + const readable = from([]); + const batches = []; + for await (const batch of readable) { + batches.push(batch); + } + assert.strictEqual(batches.length, 0); +} + +// Also accessible via Stream namespace +async function testStreamNamespace() { + const readable = Stream.from('via-namespace'); + const batches = []; + for await (const batch of readable) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.deepStrictEqual(batches[0][0], new TextEncoder().encode('via-namespace')); +} + +async function testCustomToStringInStreamRejects() { + // Objects with custom toString but no toStreamable protocol are rejected. + // Use toStreamable protocol instead. + const obj = { toString() { return 'from toString'; } }; + async function* source() { + yield obj; + } + await assert.rejects( + () => text(from(source())), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +async function testCustomToPrimitiveInStreamRejects() { + // Objects with Symbol.toPrimitive but no toStreamable protocol are rejected. + const obj = { + [Symbol.toPrimitive](hint) { + if (hint === 'string') return 'from toPrimitive'; + return 42; + }, + }; + async function* source() { + yield obj; + } + await assert.rejects( + () => text(from(source())), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +async function testToStreamableProtocolInStream() { + // Objects should use toStreamable protocol instead of toString + const obj = { + [Symbol.for('Stream.toStreamable')]() { return 'from protocol'; }, + }; + async function* source() { + yield obj; + } + const result = await text(from(source())); + assert.strictEqual(result, 'from protocol'); +} + +// Both toAsyncStreamable and toStreamable: async takes precedence +async function testFromAsyncStreamablePrecedence() { + const obj = { + [Symbol.for('Stream.toStreamable')]() { return 'sync version'; }, + [Symbol.for('Stream.toAsyncStreamable')]() { return 'async version'; }, + }; + async function* gen() { yield obj; } + const result = await text(from(gen())); + assert.strictEqual(result, 'async version'); +} + +// Top-level toAsyncStreamable protocol on input to from() +async function testFromTopLevelToAsyncStreamable() { + const obj = { + [Symbol.for('Stream.toAsyncStreamable')]() { + return 'top-level-async'; + }, + }; + const result = await text(from(obj)); + assert.strictEqual(result, 'top-level-async'); +} + +// Top-level toAsyncStreamable returning a Promise +async function testFromTopLevelToAsyncStreamablePromise() { + const obj = { + [Symbol.for('Stream.toAsyncStreamable')]() { + return Promise.resolve('async-promise'); + }, + }; + const result = await text(from(obj)); + assert.strictEqual(result, 'async-promise'); +} + +// Top-level toStreamable protocol on input to from() +async function testFromTopLevelToStreamable() { + const obj = { + [Symbol.for('Stream.toStreamable')]() { + return 'top-level-sync'; + }, + }; + const result = await text(from(obj)); + assert.strictEqual(result, 'top-level-sync'); +} + +// Top-level: toAsyncStreamable takes precedence over toStreamable +async function testFromTopLevelAsyncPrecedence() { + const obj = { + [Symbol.for('Stream.toStreamable')]() { return 'sync'; }, + [Symbol.for('Stream.toAsyncStreamable')]() { return 'async'; }, + }; + const result = await text(from(obj)); + assert.strictEqual(result, 'async'); +} + +// Top-level: toAsyncStreamable takes precedence over Symbol.asyncIterator +async function testFromTopLevelProtocolOverIterator() { + const obj = { + [Symbol.for('Stream.toAsyncStreamable')]() { return 'from-protocol'; }, + async *[Symbol.asyncIterator]() { yield [new TextEncoder().encode('from-iterator')]; }, + }; + const result = await text(from(obj)); + assert.strictEqual(result, 'from-protocol'); +} + +// DataView input should be converted to Uint8Array (zero-copy) +async function testFromDataView() { + const buf = new ArrayBuffer(5); + const view = new DataView(buf); + // Write "hello" into the DataView + view.setUint8(0, 0x68); // h + view.setUint8(1, 0x65); // e + view.setUint8(2, 0x6c); // l + view.setUint8(3, 0x6c); // l + view.setUint8(4, 0x6f); // o + const result = await text(from(view)); + assert.strictEqual(result, 'hello'); +} + +function testFromNullThrows() { + assert.throws(() => from(null), { code: 'ERR_INVALID_ARG_TYPE' }); +} + +function testFromUndefinedThrows() { + assert.throws(() => from(undefined), { code: 'ERR_INVALID_ARG_TYPE' }); +} + +Promise.all([ + testFromString(), + testFromAsyncGenerator(), + testFromSyncIterableAsAsync(), + testFromSyncIterableAwaitsPromiseValues(), + testFromSyncIterableRejectsNestedAsyncIterable(), + testFromSyncIterableRejectsNestedToAsyncStreamable(), + testFromToAsyncStreamableProtocol(), + testFromRejectsNonStreamable(), + testFromEmptyArray(), + testStreamNamespace(), + testCustomToStringInStreamRejects(), + testCustomToPrimitiveInStreamRejects(), + testToStreamableProtocolInStream(), + testFromAsyncStreamablePrecedence(), + testFromNullThrows(), + testFromUndefinedThrows(), + testFromTopLevelToAsyncStreamable(), + testFromTopLevelToAsyncStreamablePromise(), + testFromTopLevelToStreamable(), + testFromTopLevelAsyncPrecedence(), + testFromTopLevelProtocolOverIterator(), + testFromDataView(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-from-coverage.js b/test/parallel/test-stream-iter-from-coverage.js new file mode 100644 index 000000000000..eb75bec48262 --- /dev/null +++ b/test/parallel/test-stream-iter-from-coverage.js @@ -0,0 +1,178 @@ +// Flags: --experimental-stream-iter +'use strict'; + +// Coverage tests for from.js: sub-batching >128, DataView in generator, +// non-Uint8Array TypedArray normalization. + +const common = require('../common'); +const assert = require('assert'); +const { + from, + fromSync, + bytes, + bytesSync, +} = require('stream/iter'); + +// fromSync: Uint8Array[] with > 128 elements triggers sub-batching +async function testFromSyncSubBatching() { + const bigBatch = Array.from({ length: 200 }, + (_, i) => new Uint8Array([i & 0xFF])); + const batches = []; + for (const batch of fromSync(bigBatch)) { + batches.push(batch); + } + // Should be split into sub-batches: 128 + 72 + assert.strictEqual(batches.length, 2); + assert.strictEqual(batches[0].length, 128); + assert.strictEqual(batches[1].length, 72); + // Verify no data loss + let totalChunks = 0; + for (const batch of batches) totalChunks += batch.length; + assert.strictEqual(totalChunks, 200); +} + +// fromSync: generic sync iterables of Uint8Array use bounded batches +async function testFromSyncIterableSubBatching() { + function* gen() { + for (let i = 0; i < 200; i++) { + yield new Uint8Array([i & 0xFF]); + } + } + const batches = []; + for (const batch of fromSync(gen())) { + batches.push(batch); + } + assert.strictEqual(batches.length, 2); + assert.strictEqual(batches[0].length, 128); + assert.strictEqual(batches[1].length, 72); +} + +// from: Uint8Array[] with > 128 elements triggers sub-batching (async) +async function testFromAsyncSubBatching() { + const bigBatch = Array.from({ length: 200 }, + (_, i) => new Uint8Array([i & 0xFF])); + const batches = []; + for await (const batch of from(bigBatch)) { + batches.push(batch); + } + assert.strictEqual(batches.length, 2); + assert.strictEqual(batches[0].length, 128); + assert.strictEqual(batches[1].length, 72); +} + +// from: sync iterables use bounded batches instead of one unbounded batch +async function testFromAsyncSyncIterableSubBatching() { + function* gen() { + for (let i = 0; i < 200; i++) { + yield new Uint8Array([i & 0xFF]); + } + } + const batches = []; + for await (const batch of from(gen())) { + batches.push(batch); + } + assert.strictEqual(batches.length, 2); + assert.strictEqual(batches[0].length, 128); + assert.strictEqual(batches[1].length, 72); +} + +// Exact boundary: 128 elements → single batch (no split) +async function testFromSubBatchingBoundary() { + const exactBatch = Array.from({ length: 128 }, + (_, i) => new Uint8Array([i])); + const batches = []; + for (const batch of fromSync(exactBatch)) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.strictEqual(batches[0].length, 128); +} + +// 129 elements → 2 batches (128 + 1) +async function testFromSubBatchingBoundaryPlus1() { + const batch129 = Array.from({ length: 129 }, + (_, i) => new Uint8Array([i & 0xFF])); + const batches = []; + for await (const batch of from(batch129)) { + batches.push(batch); + } + assert.strictEqual(batches.length, 2); + assert.strictEqual(batches[0].length, 128); + assert.strictEqual(batches[1].length, 1); +} + +// DataView yielded from a sync generator → normalizeSyncValue path +async function testFromSyncDataViewInGenerator() { + function* gen() { + const buf = new ArrayBuffer(3); + const dv = new DataView(buf); + dv.setUint8(0, 65); + dv.setUint8(1, 66); + dv.setUint8(2, 67); + yield dv; + } + const data = bytesSync(fromSync(gen())); + assert.deepStrictEqual(data, new Uint8Array([65, 66, 67])); +} + +// DataView yielded from an async generator → normalizeAsyncValue path +async function testFromAsyncDataViewInGenerator() { + async function* gen() { + const buf = new ArrayBuffer(3); + const dv = new DataView(buf); + dv.setUint8(0, 68); + dv.setUint8(1, 69); + dv.setUint8(2, 70); + yield dv; + } + const data = await bytes(from(gen())); + assert.deepStrictEqual(data, new Uint8Array([68, 69, 70])); +} + +// Int16Array yielded from generator → primitiveToUint8Array fallback +async function testFromSyncInt16ArrayInGenerator() { + function* gen() { + yield new Int16Array([0x0102, 0x0304]); + } + const data = bytesSync(fromSync(gen())); + assert.strictEqual(data.byteLength, 4); // 2 int16 = 4 bytes +} + +// Float64Array as top-level input to from() +async function testFromFloat64Array() { + const f64 = new Float64Array([1.0]); + const batches = []; + for await (const batch of from(f64)) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.strictEqual(batches[0][0].byteLength, 8); // 1 float64 = 8 bytes +} + +// Sync generator yielding invalid type → ERR_INVALID_ARG_TYPE +async function testFromSyncInvalidYield() { + function* gen() { + yield 42; // Not a valid stream value + } + assert.throws( + () => { + // eslint-disable-next-line no-unused-vars + for (const batch of fromSync(gen())) { /* consume */ } + }, + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +Promise.all([ + testFromSyncSubBatching(), + testFromSyncIterableSubBatching(), + testFromAsyncSubBatching(), + testFromAsyncSyncIterableSubBatching(), + testFromSubBatchingBoundary(), + testFromSubBatchingBoundaryPlus1(), + testFromSyncDataViewInGenerator(), + testFromAsyncDataViewInGenerator(), + testFromSyncInt16ArrayInGenerator(), + testFromFloat64Array(), + testFromSyncInvalidYield(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-from-sync.js b/test/parallel/test-stream-iter-from-sync.js new file mode 100644 index 000000000000..50d85dc94a98 --- /dev/null +++ b/test/parallel/test-stream-iter-from-sync.js @@ -0,0 +1,263 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { fromSync, textSync } = require('stream/iter'); + +function testFromSyncString() { + // String input should be UTF-8 encoded + const readable = fromSync('hello'); + const batches = []; + for (const batch of readable) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.strictEqual(batches[0].length, 1); + assert.deepStrictEqual(batches[0][0], + new TextEncoder().encode('hello')); +} + +function testFromSyncUint8Array() { + const input = new Uint8Array([1, 2, 3]); + const readable = fromSync(input); + const batches = []; + for (const batch of readable) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.strictEqual(batches[0].length, 1); + assert.deepStrictEqual(batches[0][0], input); +} + +function testFromSyncArrayBuffer() { + const ab = new ArrayBuffer(4); + new Uint8Array(ab).set([10, 20, 30, 40]); + const readable = fromSync(ab); + const batches = []; + for (const batch of readable) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.deepStrictEqual(batches[0][0], new Uint8Array([10, 20, 30, 40])); +} + +function testFromSyncUint8ArrayArray() { + // Array of Uint8Array should yield as a single batch + const chunks = [new Uint8Array([1]), new Uint8Array([2])]; + const readable = fromSync(chunks); + const batches = []; + for (const batch of readable) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.strictEqual(batches[0].length, 2); + assert.deepStrictEqual(batches[0][0], new Uint8Array([1])); + assert.deepStrictEqual(batches[0][1], new Uint8Array([2])); +} + +function testFromSyncGenerator() { + function* gen() { + yield new Uint8Array([1, 2]); + yield new Uint8Array([3, 4]); + } + const readable = fromSync(gen()); + const batches = []; + for (const batch of readable) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.strictEqual(batches[0].length, 2); + assert.deepStrictEqual(batches[0][0], new Uint8Array([1, 2])); + assert.deepStrictEqual(batches[0][1], new Uint8Array([3, 4])); +} + +function testFromSyncNestedIterables() { + // Nested arrays and strings should be flattened + function* gen() { + yield ['hello', ' ', 'world']; + } + const readable = fromSync(gen()); + const batches = []; + for (const batch of readable) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.strictEqual(batches[0].length, 3); + assert.deepStrictEqual(batches[0][0], new TextEncoder().encode('hello')); + assert.deepStrictEqual(batches[0][1], new TextEncoder().encode(' ')); + assert.deepStrictEqual(batches[0][2], new TextEncoder().encode('world')); +} + +function testFromSyncToStreamableProtocol() { + const sym = Symbol.for('Stream.toStreamable'); + const obj = { + [sym]() { + return 'protocol-data'; + }, + }; + function* gen() { + yield obj; + } + const readable = fromSync(gen()); + const batches = []; + for (const batch of readable) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.deepStrictEqual(batches[0][0], + new TextEncoder().encode('protocol-data')); +} + +function testFromSyncGeneratorError() { + function* gen() { + yield new Uint8Array([1]); + throw new Error('generator boom'); + } + const readable = fromSync(gen()); + assert.throws(() => { + // eslint-disable-next-line no-unused-vars + for (const _ of readable) { /* consume */ } + }, { message: 'generator boom' }); +} + +function testFromSyncRejectsNonStreamable() { + assert.throws( + () => fromSync(12345), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); + assert.throws( + () => fromSync(null), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +function testFromSyncEmptyGenerator() { + function* empty() {} + let count = 0; + // eslint-disable-next-line no-unused-vars + for (const _ of fromSync(empty())) { count++; } + assert.strictEqual(count, 0); +} + +// Top-level toStreamable protocol on input to fromSync() +function testFromSyncTopLevelToStreamable() { + const obj = { + [Symbol.for('Stream.toStreamable')]() { + return 'top-level-sync'; + }, + }; + const batches = []; + for (const batch of fromSync(obj)) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.deepStrictEqual(batches[0][0], + new TextEncoder().encode('top-level-sync')); +} + +// Top-level: toStreamable takes precedence over Symbol.iterator +function testFromSyncTopLevelProtocolOverIterator() { + const obj = { + [Symbol.for('Stream.toStreamable')]() { return 'from-protocol'; }, + *[Symbol.iterator]() { yield [new TextEncoder().encode('from-iterator')]; }, + }; + const batches = []; + for (const batch of fromSync(obj)) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.deepStrictEqual(batches[0][0], + new TextEncoder().encode('from-protocol')); +} + +// Top-level: toAsyncStreamable is ignored by fromSync +function testFromSyncIgnoresAsyncStreamable() { + const obj = { + [Symbol.for('Stream.toAsyncStreamable')]() { return 'async'; }, + }; + // Has no toStreamable and no Symbol.iterator, should throw + assert.throws(() => fromSync(obj), { code: 'ERR_INVALID_ARG_TYPE' }); +} + +// Explicit async iterable rejected +function testFromSyncRejectsAsyncIterable() { + async function* gen() { yield [new TextEncoder().encode('a')]; } + assert.throws(() => fromSync(gen()), { code: 'ERR_INVALID_ARG_TYPE' }); +} + +function testFromSyncPrefersIteratorForDualIterable() { + const input = { + *[Symbol.iterator]() { + yield new TextEncoder().encode('sync'); + }, + async *[Symbol.asyncIterator]() { + yield new TextEncoder().encode('async'); + }, + }; + + assert.strictEqual(textSync(fromSync(input)), 'sync'); +} + +function testFromSyncPrefersIteratorForThenableIterable() { + const input = { + then() {}, + *[Symbol.iterator]() { + yield new TextEncoder().encode('sync'); + }, + }; + + assert.strictEqual(textSync(fromSync(input)), 'sync'); +} + +// Promise rejected +function testFromSyncRejectsPromise() { + assert.throws(() => fromSync(Promise.resolve('hello')), + { code: 'ERR_INVALID_ARG_TYPE' }); +} + +// DataView input should be converted to Uint8Array (zero-copy) +function testFromSyncDataView() { + const buf = new ArrayBuffer(3); + const view = new DataView(buf); + view.setUint8(0, 0x48); // H + view.setUint8(1, 0x49); // I + view.setUint8(2, 0x21); // ! + const batches = []; + for (const batch of fromSync(view)) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.deepStrictEqual(batches[0][0], new Uint8Array([0x48, 0x49, 0x21])); +} + +function testFromSyncNullThrows() { + assert.throws(() => fromSync(null), { code: 'ERR_INVALID_ARG_TYPE' }); +} + +function testFromSyncUndefinedThrows() { + assert.throws(() => fromSync(undefined), { code: 'ERR_INVALID_ARG_TYPE' }); +} + +Promise.all([ + testFromSyncString(), + testFromSyncUint8Array(), + testFromSyncArrayBuffer(), + testFromSyncUint8ArrayArray(), + testFromSyncGenerator(), + testFromSyncNestedIterables(), + testFromSyncToStreamableProtocol(), + testFromSyncGeneratorError(), + testFromSyncRejectsNonStreamable(), + testFromSyncEmptyGenerator(), + testFromSyncNullThrows(), + testFromSyncUndefinedThrows(), + testFromSyncTopLevelToStreamable(), + testFromSyncTopLevelProtocolOverIterator(), + testFromSyncIgnoresAsyncStreamable(), + testFromSyncRejectsAsyncIterable(), + testFromSyncPrefersIteratorForDualIterable(), + testFromSyncPrefersIteratorForThenableIterable(), + testFromSyncRejectsPromise(), + testFromSyncDataView(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-from-writable-cache-options.js b/test/parallel/test-stream-iter-from-writable-cache-options.js new file mode 100644 index 000000000000..67e673c36f6f --- /dev/null +++ b/test/parallel/test-stream-iter-from-writable-cache-options.js @@ -0,0 +1,45 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { Writable } = require('stream'); +const { fromWritable } = require('stream/iter'); + +{ + const writable = new Writable({ write() {} }); + + fromWritable(writable); + + assert.throws( + () => fromWritable(writable, { backpressure: 'invalid' }), + { code: 'ERR_INVALID_ARG_VALUE' }, + ); + + writable.destroy(); +} + +async function testCachedWritableUsesLaterBackpressureOptions() { + const chunks = []; + const writable = new Writable({ + highWaterMark: 1, + write(chunk, encoding, callback) { + chunks.push(Buffer.from(chunk)); + }, + }); + + fromWritable(writable); + const writer = fromWritable(writable, { backpressure: 'drop-newest' }); + + await writer.write('a'); + await writer.write('b'); + + assert.deepStrictEqual( + chunks.map((chunk) => chunk.toString()), + ['a'], + ); + + writable.destroy(); +} + +testCachedWritableUsesLaterBackpressureOptions().then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-namespace.js b/test/parallel/test-stream-iter-namespace.js new file mode 100644 index 000000000000..ce197e85846d --- /dev/null +++ b/test/parallel/test-stream-iter-namespace.js @@ -0,0 +1,210 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const streamNew = require('stream/iter'); + +// ============================================================================= +// Stream namespace object +// ============================================================================= + +async function testStreamNamespaceExists() { + assert.ok(streamNew.Stream); + assert.strictEqual(typeof streamNew.Stream, 'object'); +} + +async function testStreamNamespaceFrozen() { + assert.ok(Object.isFrozen(streamNew.Stream)); +} + +async function testStreamNamespaceFactories() { + const { Stream } = streamNew; + + assert.strictEqual(typeof Stream.push, 'function'); + assert.strictEqual(typeof Stream.duplex, 'function'); + assert.strictEqual(typeof Stream.from, 'function'); + assert.strictEqual(typeof Stream.fromSync, 'function'); +} + +async function testStreamNamespacePipelines() { + const { Stream } = streamNew; + + assert.strictEqual(typeof Stream.pull, 'function'); + assert.strictEqual(typeof Stream.pullSync, 'function'); + assert.strictEqual(typeof Stream.pipeTo, 'function'); + assert.strictEqual(typeof Stream.pipeToSync, 'function'); +} + +async function testStreamNamespaceAsyncConsumers() { + const { Stream } = streamNew; + + assert.strictEqual(typeof Stream.bytes, 'function'); + assert.strictEqual(typeof Stream.text, 'function'); + assert.strictEqual(typeof Stream.arrayBuffer, 'function'); + assert.strictEqual(typeof Stream.array, 'function'); +} + +async function testStreamNamespaceSyncConsumers() { + const { Stream } = streamNew; + + assert.strictEqual(typeof Stream.bytesSync, 'function'); + assert.strictEqual(typeof Stream.textSync, 'function'); + assert.strictEqual(typeof Stream.arrayBufferSync, 'function'); + assert.strictEqual(typeof Stream.arraySync, 'function'); +} + +async function testStreamNamespaceCombining() { + const { Stream } = streamNew; + + assert.strictEqual(typeof Stream.merge, 'function'); + assert.strictEqual(typeof Stream.broadcast, 'function'); + assert.strictEqual(typeof Stream.share, 'function'); + assert.strictEqual(typeof Stream.shareSync, 'function'); +} + +async function testStreamNamespaceUtilities() { + const { Stream } = streamNew; + + assert.strictEqual(typeof Stream.tap, 'function'); + assert.strictEqual(typeof Stream.tapSync, 'function'); + assert.strictEqual(typeof Stream.ondrain, 'function'); +} + +async function testStreamNamespaceProtocols() { + const { Stream } = streamNew; + + assert.strictEqual(typeof Stream.toStreamable, 'symbol'); + assert.strictEqual(typeof Stream.toAsyncStreamable, 'symbol'); + assert.strictEqual(typeof Stream.broadcastProtocol, 'symbol'); + assert.strictEqual(typeof Stream.shareProtocol, 'symbol'); + assert.strictEqual(typeof Stream.shareSyncProtocol, 'symbol'); + assert.strictEqual(typeof Stream.drainableProtocol, 'symbol'); +} + +// ============================================================================= +// Individual exports (destructured imports) +// ============================================================================= + +async function testIndividualExports() { + // Factories + assert.strictEqual(typeof streamNew.push, 'function'); + assert.strictEqual(typeof streamNew.duplex, 'function'); + assert.strictEqual(typeof streamNew.from, 'function'); + assert.strictEqual(typeof streamNew.fromSync, 'function'); + + // Pipelines + assert.strictEqual(typeof streamNew.pull, 'function'); + assert.strictEqual(typeof streamNew.pullSync, 'function'); + assert.strictEqual(typeof streamNew.pipeTo, 'function'); + assert.strictEqual(typeof streamNew.pipeToSync, 'function'); + + // Consumers + assert.strictEqual(typeof streamNew.bytes, 'function'); + assert.strictEqual(typeof streamNew.bytesSync, 'function'); + assert.strictEqual(typeof streamNew.text, 'function'); + assert.strictEqual(typeof streamNew.textSync, 'function'); + assert.strictEqual(typeof streamNew.arrayBuffer, 'function'); + assert.strictEqual(typeof streamNew.arrayBufferSync, 'function'); + assert.strictEqual(typeof streamNew.array, 'function'); + assert.strictEqual(typeof streamNew.arraySync, 'function'); + + // Combining + assert.strictEqual(typeof streamNew.merge, 'function'); + assert.strictEqual(typeof streamNew.broadcast, 'function'); + assert.strictEqual(typeof streamNew.share, 'function'); + assert.strictEqual(typeof streamNew.shareSync, 'function'); + + // Utilities + assert.strictEqual(typeof streamNew.tap, 'function'); + assert.strictEqual(typeof streamNew.tapSync, 'function'); + assert.strictEqual(typeof streamNew.ondrain, 'function'); + + // Protocol symbols + assert.strictEqual(typeof streamNew.toStreamable, 'symbol'); + assert.strictEqual(typeof streamNew.toAsyncStreamable, 'symbol'); + assert.strictEqual(typeof streamNew.broadcastProtocol, 'symbol'); + assert.strictEqual(typeof streamNew.shareProtocol, 'symbol'); + assert.strictEqual(typeof streamNew.shareSyncProtocol, 'symbol'); + assert.strictEqual(typeof streamNew.drainableProtocol, 'symbol'); +} + +async function testMultiConsumerExports() { + // Broadcast and Share constructors/factories + assert.ok(streamNew.Broadcast); + assert.strictEqual(typeof streamNew.Broadcast.from, 'function'); + assert.ok(streamNew.Share); + assert.strictEqual(typeof streamNew.Share.from, 'function'); + assert.ok(streamNew.SyncShare); + assert.strictEqual(typeof streamNew.SyncShare.fromSync, 'function'); +} + +// ============================================================================= +// Cross-check: namespace matches individual exports +// ============================================================================= + +async function testNamespaceMatchesExports() { + const { Stream } = streamNew; + + // Every function on Stream should also be available as a direct export + assert.strictEqual(Stream.push, streamNew.push); + assert.strictEqual(Stream.duplex, streamNew.duplex); + assert.strictEqual(Stream.from, streamNew.from); + assert.strictEqual(Stream.fromSync, streamNew.fromSync); + assert.strictEqual(Stream.pull, streamNew.pull); + assert.strictEqual(Stream.pullSync, streamNew.pullSync); + assert.strictEqual(Stream.pipeTo, streamNew.pipeTo); + assert.strictEqual(Stream.pipeToSync, streamNew.pipeToSync); + assert.strictEqual(Stream.bytes, streamNew.bytes); + assert.strictEqual(Stream.text, streamNew.text); + assert.strictEqual(Stream.arrayBuffer, streamNew.arrayBuffer); + assert.strictEqual(Stream.array, streamNew.array); + assert.strictEqual(Stream.bytesSync, streamNew.bytesSync); + assert.strictEqual(Stream.textSync, streamNew.textSync); + assert.strictEqual(Stream.arrayBufferSync, streamNew.arrayBufferSync); + assert.strictEqual(Stream.arraySync, streamNew.arraySync); + assert.strictEqual(Stream.merge, streamNew.merge); + assert.strictEqual(Stream.broadcast, streamNew.broadcast); + assert.strictEqual(Stream.share, streamNew.share); + assert.strictEqual(Stream.shareSync, streamNew.shareSync); + assert.strictEqual(Stream.tap, streamNew.tap); + assert.strictEqual(Stream.tapSync, streamNew.tapSync); + assert.strictEqual(Stream.ondrain, streamNew.ondrain); + + // Protocol symbols + assert.strictEqual(Stream.toStreamable, streamNew.toStreamable); + assert.strictEqual(Stream.toAsyncStreamable, streamNew.toAsyncStreamable); + assert.strictEqual(Stream.broadcastProtocol, streamNew.broadcastProtocol); + assert.strictEqual(Stream.shareProtocol, streamNew.shareProtocol); + assert.strictEqual(Stream.shareSyncProtocol, streamNew.shareSyncProtocol); + assert.strictEqual(Stream.drainableProtocol, streamNew.drainableProtocol); +} + +// ============================================================================= +// Require paths +// ============================================================================= + +async function testRequirePaths() { + // Both require('stream/iter') and require('node:stream/iter') should work + const fromPlain = require('stream/iter'); + const fromNode = require('node:stream/iter'); + + assert.strictEqual(fromPlain.Stream, fromNode.Stream); + assert.strictEqual(fromPlain.push, fromNode.push); +} + +Promise.all([ + testStreamNamespaceExists(), + testStreamNamespaceFrozen(), + testStreamNamespaceFactories(), + testStreamNamespacePipelines(), + testStreamNamespaceAsyncConsumers(), + testStreamNamespaceSyncConsumers(), + testStreamNamespaceCombining(), + testStreamNamespaceUtilities(), + testStreamNamespaceProtocols(), + testIndividualExports(), + testMultiConsumerExports(), + testNamespaceMatchesExports(), + testRequirePaths(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-pipeto-edge.js b/test/parallel/test-stream-iter-pipeto-edge.js new file mode 100644 index 000000000000..3f09c4dfd42d --- /dev/null +++ b/test/parallel/test-stream-iter-pipeto-edge.js @@ -0,0 +1,68 @@ +// Flags: --experimental-stream-iter +'use strict'; + +// Edge case tests for pipeToSync: endSync fallback, preventFail. + +const common = require('../common'); +const assert = require('assert'); +const { pipeToSync, fromSync } = require('stream/iter'); + +// pipeToSync endSync returns negative → falls back to end() +async function testPipeToSyncEndSyncFallback() { + let endCalled = false; + const writer = { + writeSync() { return true; }, + endSync() { return -1; }, // Negative → triggers end() fallback + end() { endCalled = true; }, + }; + pipeToSync(fromSync('data'), writer); + assert.strictEqual(endCalled, true); +} + +// pipeToSync endSync missing → falls back to end() +async function testPipeToSyncNoEndSync() { + let endCalled = false; + const writer = { + writeSync() { return true; }, + end() { endCalled = true; }, + }; + pipeToSync(fromSync('data'), writer); + assert.strictEqual(endCalled, true); +} + +// pipeToSync with preventFail: true — source error does NOT call fail() +async function testPipeToSyncPreventFail() { + let failCalled = false; + const writer = { + writeSync() { return true; }, + endSync() { return 0; }, + fail() { failCalled = true; }, + }; + function* badSource() { + yield [new Uint8Array([1])]; + throw new Error('source error'); + } + assert.throws( + () => pipeToSync(badSource(), writer, { preventFail: true }), + { message: 'source error' }, + ); + assert.strictEqual(failCalled, false); +} + +// pipeToSync with preventClose: true — end/endSync not called +async function testPipeToSyncPreventClose() { + let endCalled = false; + const writer = { + writeSync() { return true; }, + endSync() { endCalled = true; return 0; }, + }; + pipeToSync(fromSync('data'), writer, { preventClose: true }); + assert.strictEqual(endCalled, false); +} + +Promise.all([ + testPipeToSyncEndSyncFallback(), + testPipeToSyncNoEndSync(), + testPipeToSyncPreventFail(), + testPipeToSyncPreventClose(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-pipeto-signal.js b/test/parallel/test-stream-iter-pipeto-signal.js new file mode 100644 index 000000000000..ec1324a4e04b --- /dev/null +++ b/test/parallel/test-stream-iter-pipeto-signal.js @@ -0,0 +1,124 @@ +// Flags: --experimental-stream-iter +'use strict'; + +// Tests for pipeTo with live (non-pre-aborted) AbortSignal, +// both with and without transforms. + +const common = require('../common'); +const assert = require('assert'); +const { setTimeout } = require('timers/promises'); +const { pipeTo, from } = require('stream/iter'); + +// pipeTo with live signal, no transforms — abort mid-stream +async function testPipeToLiveSignalNoTransforms() { + const ac = new AbortController(); + const written = []; + const writer = { + async write(chunk) { written.push(chunk); }, + async end() {}, + }; + async function* source() { + yield [new Uint8Array([1])]; + yield [new Uint8Array([2])]; + ac.abort(); + yield [new Uint8Array([3])]; + } + await assert.rejects( + () => pipeTo(source(), writer, { signal: ac.signal }), + { name: 'AbortError' }, + ); + // Should have written at least the first two chunks before abort + assert.ok(written.length >= 1); +} + +// pipeTo with live signal, no transforms — abort while waiting for next chunk +async function testPipeToLiveSignalNoTransformsPendingNext() { + const ac = new AbortController(); + const reason = new Error('abort reason'); + const writer = { + write: common.mustNotCall(), + }; + const source = { + [Symbol.asyncIterator]() { + return { + next() { + return new Promise(() => {}); + }, + }; + }, + }; + + setTimeout(10) + .then(() => ac.abort(reason)) + .then(common.mustCall()); + + const result = await Promise.race([ + assert.rejects( + () => pipeTo(source, writer, { signal: ac.signal }), + reason, + ).then(() => 'aborted'), + setTimeout(1000, 'timed out'), + ]); + + assert.strictEqual(result, 'aborted'); +} + +// pipeTo with live signal + transforms — abort mid-stream +async function testPipeToLiveSignalWithTransforms() { + const ac = new AbortController(); + const written = []; + const writer = { + async write(chunk) { written.push(chunk); }, + async end() {}, + }; + const identity = (chunks) => chunks; + async function* source() { + yield [new Uint8Array([10])]; + yield [new Uint8Array([20])]; + ac.abort(); + yield [new Uint8Array([30])]; + } + await assert.rejects( + () => pipeTo(source(), identity, writer, { signal: ac.signal }), + { name: 'AbortError' }, + ); + assert.ok(written.length >= 1); +} + +// pipeTo with live signal, no abort — runs to completion +async function testPipeToLiveSignalCompletes() { + const ac = new AbortController(); + const written = []; + const writer = { + write(chunk) { written.push(chunk); }, + writeSync(chunk) { written.push(chunk); return true; }, + async end() {}, + endSync() { return written.length; }, + }; + await pipeTo(from('signal-ok'), writer, { signal: ac.signal }); + assert.ok(written.length > 0); +} + +// pipeTo with live signal + transforms, no abort — runs to completion +async function testPipeToLiveSignalWithTransformsCompletes() { + const ac = new AbortController(); + const written = []; + const writer = { + write(chunk) { written.push(chunk); }, + writeSync(chunk) { written.push(chunk); return true; }, + async end() {}, + endSync() { return written.length; }, + }; + const identity = (chunks) => chunks; + await pipeTo(from('signal-tx-ok'), identity, writer, + { signal: ac.signal }); + assert.ok(written.length > 0); +} + +Promise.all([ + testPipeToLiveSignalNoTransforms(), + testPipeToLiveSignalNoTransformsPendingNext(), + testPipeToLiveSignalWithTransforms(), + testPipeToLiveSignalCompletes(), + testPipeToLiveSignalWithTransformsCompletes(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-pipeto-writev.js b/test/parallel/test-stream-iter-pipeto-writev.js new file mode 100644 index 000000000000..cc102cc45a70 --- /dev/null +++ b/test/parallel/test-stream-iter-pipeto-writev.js @@ -0,0 +1,255 @@ +// Flags: --experimental-stream-iter +'use strict'; + +// Tests for pipeTo writev/writevSync paths and writeBatchAsyncFallback. + +const common = require('../common'); +const assert = require('assert'); +const { setImmediate: setImmediatePromise } = require('timers/promises'); +const { pipeTo, pipeToSync, push, text } = require('stream/iter'); + +// Multi-chunk batch with writevSync (sync success path) +async function testWritevSyncSuccess() { + const batches = []; + const writer = { + write(chunk) {}, + writevSync(chunks) { batches.push(chunks); return true; }, + writev(chunks) { batches.push(chunks); }, + writeSync(chunk) { return true; }, + endSync() { return 0; }, + }; + // Source that yields multi-chunk batches + async function* source() { + yield [new Uint8Array([1]), new Uint8Array([2]), new Uint8Array([3])]; + yield [new Uint8Array([4]), new Uint8Array([5])]; + } + const total = await pipeTo(source(), writer); + assert.ok(batches.length > 0); + // writevSync was used for multi-chunk batches + assert.ok(batches.some((b) => b.length > 1)); + assert.strictEqual(total, 5); +} + +// Multi-chunk batch with writev async (no writevSync) +async function testWritevAsyncFallback() { + const batches = []; + const writer = { + async writev(chunks) { batches.push(chunks); }, + async write(chunk) { batches.push([chunk]); }, + async end() {}, + }; + async function* source() { + yield [new Uint8Array([1]), new Uint8Array([2]), new Uint8Array([3])]; + } + await pipeTo(source(), writer); + assert.ok(batches.length > 0); + assert.ok(batches.some((b) => b.length > 1)); +} + +// Multi-chunk batch with synchronous writev success (returns undefined) +async function testWritevSyncUndefinedSuccess() { + const chunks = []; + const writer = { + write(chunk) { + chunks.push(chunk); + }, + writev(batch) { + chunks.push(...batch); + }, + end() {}, + }; + async function* source() { + yield [new Uint8Array([65]), new Uint8Array([66])]; + } + const total = await pipeTo(source(), writer); + assert.strictEqual(total, 2); + assert.strictEqual(Buffer.concat(chunks).toString(), 'AB'); +} + +// writevSync returns false — falls through to async writev +async function testWritevSyncFails() { + const asyncCalls = []; + const writer = { + write() {}, + writevSync() { return false; }, + async writev(chunks) { asyncCalls.push(chunks); }, + writeSync() { return true; }, + endSync() { return 0; }, + }; + async function* source() { + yield [new Uint8Array([1]), new Uint8Array([2])]; + } + await pipeTo(source(), writer); + assert.strictEqual(asyncCalls.length, 1); + assert.strictEqual(asyncCalls[0].length, 2); +} + +// writeSync fails mid-batch — triggers writeBatchAsyncFallback +async function testWriteSyncFailsMidBatch() { + const asyncWrites = []; + const writer = { + writeSync(chunk) { + // Fail for chunk value 2 — always, including retries + if (chunk[0] === 2) return false; + return true; + }, + async write(chunk) { asyncWrites.push(chunk); }, + async end() {}, + }; + // Single batch with 3 chunks + async function* source() { + yield [new Uint8Array([1]), new Uint8Array([2]), new Uint8Array([3])]; + } + const total = await pipeTo(source(), writer); + // Chunk 1: writeSync succeeds + // Chunk 2: writeSync fails → writeBatchAsyncFallback → write() called + // Chunk 3: writeBatchAsyncFallback retries writeSync → succeeds + assert.ok(asyncWrites.length >= 1); + assert.deepStrictEqual(asyncWrites[0], new Uint8Array([2])); + assert.strictEqual(total, 3); +} + +// writeSync always fails — all chunks go through async +async function testWriteSyncAlwaysFails() { + const asyncWrites = []; + const writer = { + writeSync() { return false; }, + async write(chunk) { asyncWrites.push(chunk); }, + async end() {}, + }; + async function* source() { + yield [new Uint8Array([10]), new Uint8Array([20])]; + } + const total = await pipeTo(source(), writer); + assert.strictEqual(asyncWrites.length, 2); + assert.strictEqual(total, 2); +} + +// PushWriter block mode accepts sync writes even when returning false for +// backpressure. pipeTo must wait for drain, not retry the same write. +async function assertPushWriterBlockPipeTo(source, expected, expectedTotal) { + const { writer, readable } = push({ + budget: 16384, + backpressure: 'unbounded', + }); + + const pipe = pipeTo(source, writer); + await setImmediatePromise(); + const data = await text(readable); + const total = await pipe; + + assert.strictEqual(data, expected); + assert.strictEqual(total, expectedTotal); +} + +async function testPushWriterBlockSyncFalseAccepted() { + await assertPushWriterBlockPipeTo((async function*() { + yield [new Uint8Array([97])]; + yield [new Uint8Array([98])]; + })(), 'ab', 2); + + await assertPushWriterBlockPipeTo((async function*() { + yield [new Uint8Array([97, 98])]; + yield [new Uint8Array([99]), new Uint8Array([100])]; + })(), 'abcd', 4); +} + +async function testPipeToSyncPushWriterStrictFalseRejected() { + const kChunk = new Uint8Array(16384); + const { writer } = push({ budget: 16384 }); + + // Pre-fill the buffer so it's at capacity + writer.writeSync(kChunk); + + // pipeToSync should throw when writeSync returns false (budget exhausted) + assert.throws( + () => pipeToSync([kChunk], writer, + { preventClose: true, preventFail: true }), + { code: 'ERR_OUT_OF_RANGE' }, + ); +} + +async function testPipeToSyncWritevFalseNotCounted() { + const writer = { + writevSync() { return false; }, + writeSync: common.mustNotCall(), + endSync() { return 0; }, + }; + function* source() { + yield [new Uint8Array([1]), new Uint8Array([2])]; + } + + // pipeToSync throws when writevSync returns false (budget exhausted) + assert.throws( + () => pipeToSync(source(), writer), + { code: 'ERR_OUT_OF_RANGE' }, + ); +} + +// pipeToSync with writevSync +async function testPipeToSyncWritev() { + const batches = []; + const writer = { + writevSync(chunks) { batches.push(chunks); }, + writeSync(chunk) { return true; }, + endSync() { return 0; }, + }; + function* source() { + yield [new Uint8Array([1]), new Uint8Array([2]), new Uint8Array([3])]; + yield [new Uint8Array([4])]; + } + pipeToSync(source(), writer); + // Multi-chunk batch should have used writevSync + assert.ok(batches.some((b) => b.length > 1)); +} + +// pipeToSync batches plain Uint8Array chunks for writevSync +async function testPipeToSyncPlainChunksWritev() { + const batches = []; + const writes = []; + const writer = { + writevSync(chunks) { batches.push(chunks); }, + writeSync(chunk) { writes.push(chunk); return true; }, + endSync() { return 0; }, + }; + function* source() { + yield new Uint8Array([1]); + yield new Uint8Array([2]); + yield new Uint8Array([3]); + } + const total = pipeToSync(source(), writer); + assert.strictEqual(total, 3); + assert.strictEqual(batches.length, 1); + assert.strictEqual(batches[0].length, 3); + assert.strictEqual(writes.length, 0); +} + +// pipeToSync with writer that has write() and writeSync() — writeSync preferred +async function testPipeToSyncWriteFallback() { + const syncWrites = []; + const writer = { + writeSync(chunk) { syncWrites.push(chunk); return true; }, + write(chunk) { /* should not be called */ }, + endSync() { return 0; }, + }; + function* source() { + yield [new Uint8Array([1]), new Uint8Array([2])]; + } + pipeToSync(source(), writer); + assert.strictEqual(syncWrites.length, 2); +} + +Promise.all([ + testWritevSyncSuccess(), + testWritevAsyncFallback(), + testWritevSyncUndefinedSuccess(), + testWritevSyncFails(), + testWriteSyncFailsMidBatch(), + testWriteSyncAlwaysFails(), + testPushWriterBlockSyncFalseAccepted(), + testPipeToSyncPushWriterStrictFalseRejected(), + testPipeToSyncWritevFalseNotCounted(), + testPipeToSyncWritev(), + testPipeToSyncPlainChunksWritev(), + testPipeToSyncWriteFallback(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-pipeto.js b/test/parallel/test-stream-iter-pipeto.js new file mode 100644 index 000000000000..5d8b5088f540 --- /dev/null +++ b/test/parallel/test-stream-iter-pipeto.js @@ -0,0 +1,340 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { pipeTo, pipeToSync, from, fromSync } = require('stream/iter'); + +async function testPipeToSync() { + const written = []; + const writer = { + writeSync(chunk) { written.push(chunk); return true; }, + endSync() { return written.length; }, + fail() {}, + }; + + const totalBytes = pipeToSync(fromSync('pipe-data'), writer); + assert.strictEqual(totalBytes, 9); // 'pipe-data' = 9 UTF-8 bytes + assert.ok(written.length > 0); + const result = new TextDecoder().decode( + new Uint8Array(written.reduce((acc, c) => [...acc, ...c], []))); + assert.strictEqual(result, 'pipe-data'); +} + +async function testPipeTo() { + const written = []; + const writer = { + async write(chunk) { written.push(chunk); }, + async end() { return written.length; }, + async fail() {}, + }; + + const totalBytes = await pipeTo(from('async-pipe-data'), writer); + assert.strictEqual(totalBytes, 15); // 'async-pipe-data' = 15 UTF-8 bytes + assert.ok(written.length > 0); +} + +async function testPipeToPreventClose() { + let endCalled = false; + const writer = { + async write() {}, + async end() { endCalled = true; }, + async fail() {}, + }; + + await pipeTo(from('data'), writer, { preventClose: true }); + assert.strictEqual(endCalled, false); +} + +// PipeTo source error calls writer.fail() +async function testPipeToSourceError() { + let failCalled = false; + let failReason; + const writer = { + write() {}, + fail(reason) { failCalled = true; failReason = reason; }, + }; + async function* failingSource() { + yield [new TextEncoder().encode('a')]; + throw new Error('pipe source boom'); + } + await assert.rejects( + () => pipeTo(failingSource(), writer), + { message: 'pipe source boom' }, + ); + assert.strictEqual(failCalled, true); + assert.strictEqual(failReason.message, 'pipe source boom'); +} + +// PipeToSync source error calls writer.fail() +async function testPipeToSyncSourceError() { + let failCalled = false; + const writer = { + writeSync() { return true; }, + fail(reason) { failCalled = true; }, + }; + function* failingSource() { + yield [new TextEncoder().encode('a')]; + throw new Error('sync pipe boom'); + } + assert.throws( + () => pipeToSync(failingSource(), writer), + { message: 'sync pipe boom' }, + ); + assert.strictEqual(failCalled, true); +} + +// PipeTo with AbortSignal +async function testPipeToWithSignal() { + const ac = new AbortController(); + const chunks = []; + const writer = { + write(chunk) { chunks.push(chunk); }, + }; + async function* slowSource() { + yield [new TextEncoder().encode('a')]; + await new Promise((r) => setTimeout(r, 50)); + yield [new TextEncoder().encode('b')]; + } + ac.abort(); + await assert.rejects( + () => pipeTo(slowSource(), writer, { signal: ac.signal }), + { name: 'AbortError' }, + ); +} + +// PipeTo with transforms +async function testPipeToWithTransforms() { + const chunks = []; + const writer = { + write(chunk) { chunks.push(new TextDecoder().decode(chunk)); }, + }; + const upper = (batch) => { + if (batch === null) return null; + return batch.map((c) => { + const out = new Uint8Array(c); + for (let i = 0; i < out.length; i++) + out[i] -= (out[i] >= 97 && out[i] <= 122) * 32; + return out; + }); + }; + await pipeTo(from('hello'), upper, writer); + assert.strictEqual(chunks.join(''), 'HELLO'); +} + +// PipeToSync with transforms +async function testPipeToSyncWithTransforms() { + const chunks = []; + const writer = { + writeSync(chunk) { chunks.push(new TextDecoder().decode(chunk)); return true; }, + }; + const upper = (batch) => { + if (batch === null) return null; + return batch.map((c) => { + const out = new Uint8Array(c); + for (let i = 0; i < out.length; i++) + out[i] -= (out[i] >= 97 && out[i] <= 122) * 32; + return out; + }); + }; + pipeToSync(fromSync('hello'), upper, writer); + assert.strictEqual(chunks.join(''), 'HELLO'); +} + +async function testPipeToWriterTransformMethodIgnored() { + const chunks = []; + const writer = { + transform: common.mustNotCall(), + write(chunk) { chunks.push(new TextDecoder().decode(chunk)); }, + }; + + await pipeTo(from('hello'), writer); + assert.strictEqual(chunks.join(''), 'hello'); +} + +async function testPipeToSyncWriterTransformMethodIgnored() { + const chunks = []; + const writer = { + transform: common.mustNotCall(), + writeSync(chunk) { + chunks.push(new TextDecoder().decode(chunk)); + return true; + }, + }; + + pipeToSync(fromSync('hello'), writer); + assert.strictEqual(chunks.join(''), 'hello'); +} + +// PipeTo with writev writer +async function testPipeToWithWritevWriter() { + const allChunks = []; + const writer = { + write(chunk) { allChunks.push(chunk); }, + writev(chunks) { allChunks.push(...chunks); }, + }; + await pipeTo(from('hello world'), writer); + assert.strictEqual(allChunks.length > 0, true); +} + +// PipeTo with writeSync/writevSync fallback +async function testPipeToSyncFallback() { + const chunks = []; + const writer = { + writeSync(chunk) { chunks.push(chunk); return true; }, + write(chunk) { chunks.push(chunk); }, + }; + await pipeTo(from('hello'), writer); + assert.strictEqual(chunks.length > 0, true); +} + +// PipeTo preventFail option +async function testPipeToPreventFail() { + let failCalled = false; + const writer = { + write() {}, + fail() { failCalled = true; }, + }; + // eslint-disable-next-line require-yield + async function* failingSource() { + throw new Error('boom'); + } + await assert.rejects( + () => pipeTo(failingSource(), writer, { preventFail: true }), + { message: 'boom' }, + ); + assert.strictEqual(failCalled, false); +} + +// PipeToSync preventClose option +async function testPipeToSyncPreventClose() { + let endCalled = false; + const writer = { + writeSync() { return true; }, + endSync() { endCalled = true; return 0; }, + }; + pipeToSync(fromSync('hello'), writer, { preventClose: true }); + assert.strictEqual(endCalled, false); +} + +// Regression test: pipeTo should work with a minimal writer that only +// implements write(). end(), fail(), and all *Sync methods are optional. +async function testPipeToMinimalWriter() { + const chunks = []; + const minimalWriter = { + write(chunk) { + chunks.push(chunk); + }, + }; + + await pipeTo(from('minimal'), minimalWriter); + assert.strictEqual(chunks.length > 0, true); +} + +async function testPipeToSyncMinimalWriter() { + const chunks = []; + const minimalWriter = { + writeSync(chunk) { + chunks.push(chunk); + return true; + }, + }; + + pipeToSync(fromSync('minimal-sync'), minimalWriter); + assert.strictEqual(chunks.length > 0, true); +} + +async function testPipeToSyncIterableFastPathWritesIncrementally() { + let pulled = 0; + let firstWritePulled = 0; + const chunks = []; + function* source() { + for (let i = 0; i < 3; i++) { + pulled++; + yield new Uint8Array([0x61 + i]); + } + } + const writer = { + write: common.mustNotCall(), + writeSync(chunk) { + if (firstWritePulled === 0) { + firstWritePulled = pulled; + } + chunks.push(chunk); + return true; + }, + }; + + const totalBytes = await pipeTo(source(), writer); + assert.strictEqual(totalBytes, 3); + assert.strictEqual(firstWritePulled, 1); + assert.deepStrictEqual(chunks, [ + new Uint8Array([0x61]), + new Uint8Array([0x62]), + new Uint8Array([0x63]), + ]); +} + +async function testPipeToSyncIterableFastPathWriteFallback() { + const asyncWrites = []; + const writer = { + writeSync(chunk) { + return chunk[0] !== 0x62; + }, + async write(chunk) { + asyncWrites.push(chunk); + }, + }; + function* source() { + yield new Uint8Array([0x61]); + yield new Uint8Array([0x62]); + yield new Uint8Array([0x63]); + } + + const totalBytes = await pipeTo(source(), writer); + assert.strictEqual(totalBytes, 3); + assert.deepStrictEqual(asyncWrites, [new Uint8Array([0x62])]); +} + +async function testPipeToSyncIterableFastPathAsyncValue() { + const chunks = []; + const writer = { + write: common.mustNotCall(), + writeSync(chunk) { + chunks.push(chunk); + return true; + }, + }; + function* source() { + yield Promise.resolve('a'); + yield new Uint8Array([0x62]); + } + + const totalBytes = await pipeTo(source(), writer); + assert.strictEqual(totalBytes, 2); + const result = new TextDecoder().decode( + new Uint8Array(chunks.reduce((acc, c) => [...acc, ...c], []))); + assert.strictEqual(result, 'ab'); +} + +Promise.all([ + testPipeToSync(), + testPipeTo(), + testPipeToPreventClose(), + testPipeToSourceError(), + testPipeToSyncSourceError(), + testPipeToWithSignal(), + testPipeToWithTransforms(), + testPipeToSyncWithTransforms(), + testPipeToWriterTransformMethodIgnored(), + testPipeToSyncWriterTransformMethodIgnored(), + testPipeToWithWritevWriter(), + testPipeToSyncFallback(), + testPipeToPreventFail(), + testPipeToSyncPreventClose(), + testPipeToMinimalWriter(), + testPipeToSyncMinimalWriter(), + testPipeToSyncIterableFastPathWritesIncrementally(), + testPipeToSyncIterableFastPathWriteFallback(), + testPipeToSyncIterableFastPathAsyncValue(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-pull-async.js b/test/parallel/test-stream-iter-pull-async.js new file mode 100644 index 000000000000..6fa3192e5855 --- /dev/null +++ b/test/parallel/test-stream-iter-pull-async.js @@ -0,0 +1,422 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { pull, from, text, tap } = require('stream/iter'); + +async function testPullIdentity() { + const data = await text(pull(from('hello-async'))); + assert.strictEqual(data, 'hello-async'); +} + +async function testPullStatelessTransform() { + const upper = (chunks) => { + if (chunks === null) return null; + return chunks.map((c) => { + const str = new TextDecoder().decode(c); + return new TextEncoder().encode(str.toUpperCase()); + }); + }; + const data = await text(pull(from('abc'), upper)); + assert.strictEqual(data, 'ABC'); +} + +async function testPullStatefulTransform() { + const stateful = { + transform: async function*(source) { + for await (const chunks of source) { + if (chunks === null) { + yield new TextEncoder().encode('-ASYNC-END'); + continue; + } + for (const chunk of chunks) { + yield chunk; + } + } + }, + }; + const data = await text(pull(from('data'), stateful)); + assert.strictEqual(data, 'data-ASYNC-END'); +} + +async function testPullWithAbortSignal() { + async function* gen() { + yield [new Uint8Array([1])]; + } + + const result = pull(gen(), { signal: AbortSignal.abort() }); + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of result) { + assert.fail('Should not reach here'); + } + }, + { name: 'AbortError' }, + ); +} + +async function testPullChainedTransforms() { + const enc = new TextEncoder(); + const transforms = [ + (chunks) => { + if (chunks === null) return null; + return [...chunks, enc.encode('!')]; + }, + (chunks) => { + if (chunks === null) return null; + return [...chunks, enc.encode('?')]; + }, + ]; + const data = await text(pull(from('hello'), ...transforms)); + assert.strictEqual(data, 'hello!?'); +} + +// Source error → controller.abort() → transform listener throws → +// source error propagates to consumer; listener error becomes uncaught +// exception (per EventTarget spec behavior). +async function testTransformSignalListenerErrorOnSourceError() { + // Listener errors from dispatchEvent are rethrown via process.nextTick, + // so we must catch them as uncaught exceptions. + const uncaughtErrors = []; + const handler = (err) => uncaughtErrors.push(err); + process.on('uncaughtException', handler); + + const throwingTransform = { + transform(source, options) { + options.signal.addEventListener('abort', () => { + throw new Error('listener boom'); + }); + return source; + }, + }; + + async function* failingSource() { + yield [new TextEncoder().encode('a')]; + throw new Error('source error'); + } + + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of pull(failingSource(), throwingTransform)) { + // Consume + } + }, + { message: 'source error' }, + ); + + // Give the nextTick rethrow a chance to fire + await new Promise(setImmediate); + process.removeListener('uncaughtException', handler); + + assert.strictEqual(uncaughtErrors.length, 1); + assert.strictEqual(uncaughtErrors[0].message, 'listener boom'); +} + +// Pull source error propagates to consumer +async function testPullSourceError() { + async function* failingSource() { + yield [new TextEncoder().encode('a')]; + throw new Error('source boom'); + } + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of pull(failingSource())) { /* consume */ } + }, { message: 'source boom' }); +} + +// Tap callback error propagates through pipeline +async function testTapCallbackError() { + const badTap = tap(() => { throw new Error('tap boom'); }); + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of pull(from('hello'), badTap)) { /* consume */ } + }, { message: 'tap boom' }); +} + +// Pull signal aborted mid-iteration (not pre-aborted) +async function testPullSignalAbortMidIteration() { + const ac = new AbortController(); + const enc = new TextEncoder(); + async function* slowSource() { + yield [enc.encode('a')]; + yield [enc.encode('b')]; + yield [enc.encode('c')]; + } + const result = pull(slowSource(), { signal: ac.signal }); + const iter = result[Symbol.asyncIterator](); + const first = await iter.next(); // Read first batch + assert.strictEqual(first.done, false); + ac.abort(); + await assert.rejects(() => iter.next(), { name: 'AbortError' }); +} + +async function testPullSignalAbortWhileSourceNextPending() { + const source = { + [Symbol.asyncIterator]() { + return { + async next() { + await new Promise(() => {}); + }, + }; + }, + }; + const ac = new AbortController(); + const iter = pull(source, { signal: ac.signal })[Symbol.asyncIterator](); + const next = iter.next(); + ac.abort(); + await assert.rejects(next, { name: 'AbortError' }); +} + +async function testPullSignalAbortWithTransformWhileSourceNextPending() { + const source = { + [Symbol.asyncIterator]() { + return { + async next() { + await new Promise(() => {}); + }, + }; + }, + }; + const ac = new AbortController(); + const iter = pull( + source, + (chunks) => chunks, + { signal: ac.signal }, + )[Symbol.asyncIterator](); + const next = iter.next(); + ac.abort(); + await assert.rejects(next, { name: 'AbortError' }); +} + +// Pull consumer break (return()) cleans up transform signal +async function testPullConsumerBreakCleanup() { + let signalAborted = false; + const trackingTransform = { + transform(source, options) { + options.signal.addEventListener('abort', () => { + signalAborted = true; + }); + return source; + }, + }; + async function* infiniteSource() { + let i = 0; + while (true) { + yield [new TextEncoder().encode(`chunk${i++}`)]; + } + } + // Consumer breaks after first chunk + // eslint-disable-next-line no-unused-vars + for await (const _ of pull(infiniteSource(), trackingTransform)) { + break; + } + // Give the abort handler a tick to fire + await new Promise(setImmediate); + assert.strictEqual(signalAborted, true); +} + +// Pull transform returning a Promise +async function testPullTransformReturnsPromise() { + const asyncTransform = async (chunks) => { + if (chunks === null) return null; + return chunks; + }; + const result = await text(pull(from('hello'), asyncTransform)); + assert.strictEqual(result, 'hello'); +} + +// Stateless transform error propagates +async function testPullStatelessTransformError() { + const badTransform = (chunks) => { + if (chunks === null) return null; + throw new Error('async stateless boom'); + }; + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of pull(from('hello'), badTransform)) { /* consume */ } + }, { message: 'async stateless boom' }); +} + +// Stateful transform error propagates +async function testPullStatefulTransformError() { + const badStateful = { + transform: async function*(source) { // eslint-disable-line require-yield + for await (const chunks of source) { + if (chunks === null) continue; + throw new Error('async stateful boom'); + } + }, + }; + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of pull(from('hello'), badStateful)) { /* consume */ } + }, { message: 'async stateful boom' }); +} + +// Stateless transform flush emitting data +async function testPullStatelessTransformFlush() { + const withTrailer = (chunks) => { + if (chunks === null) { + return [new TextEncoder().encode('-TRAILER')]; + } + return chunks; + }; + const data = await text(pull(from('data'), withTrailer)); + assert.strictEqual(data, 'data-TRAILER'); +} + +// Consecutive stateless transforms each receive a final flush signal after +// upstream flush output has been processed. +async function testPullConsecutiveStatelessTransformFlush() { + const enc = new TextEncoder(); + const addAOnFlush = (chunks) => (chunks === null ? + [enc.encode('-A')] : chunks); + const addBOnFlush = (chunks) => (chunks === null ? + [enc.encode('-B')] : chunks); + + const data = await text(pull(from('x'), addAOnFlush, addBOnFlush)); + assert.strictEqual(data, 'x-A-B'); +} + +// Stateless transform flush error propagates +async function testPullStatelessTransformFlushError() { + const badFlush = (chunks) => { + if (chunks === null) { + throw new Error('async flush boom'); + } + return chunks; + }; + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of pull(from('hello'), badFlush)) { /* consume */ } + }, { message: 'async flush boom' }); +} + +// Pull with a sync iterable source (not async) +async function testPullWithSyncSource() { + function* gen() { + yield new TextEncoder().encode('sync-source'); + } + const data = await text(pull(gen())); + assert.strictEqual(data, 'sync-source'); +} + +// Pull transform yielding strings +async function testPullTransformYieldsStrings() { + const stringTransform = (chunks) => { + if (chunks === null) return null; + return chunks.map((c) => new TextDecoder().decode(c)); + }; + const result = await text(pull(from('hello'), stringTransform)); + assert.strictEqual(result, 'hello'); +} + +// pull() accepts a string source directly (normalized via from()) +async function testPullStringSource() { + const data = await text(pull('hello-direct')); + assert.strictEqual(data, 'hello-direct'); +} + +// Transform returning a single Uint8Array should be wrapped as a batch, +// not iterated byte-by-byte +async function testTransformReturnsSingleUint8Array() { + const transform = (chunks) => { + if (chunks === null) return null; + // Return a single Uint8Array, not an array + const enc = new TextEncoder(); + return enc.encode('transformed'); + }; + const data = await text(pull(from('input'), transform)); + assert.strictEqual(data, 'transformed'); +} + +// Transform returning a single string should be UTF-8 encoded, +// not iterated character-by-character +async function testTransformReturnsSingleString() { + const transform = (chunks) => { + if (chunks === null) return null; + return 'hello-string'; + }; + const data = await text(pull(from('input'), transform)); + assert.strictEqual(data, 'hello-string'); +} + +// Transform returning an ArrayBuffer should be converted to Uint8Array +async function testTransformReturnsArrayBuffer() { + const transform = (chunks) => { + if (chunks === null) return null; + const enc = new TextEncoder(); + return enc.encode('arraybuf').buffer; + }; + const data = await text(pull(from('input'), transform)); + assert.strictEqual(data, 'arraybuf'); +} + +// pipeTo() accepts a string source directly (normalized via from()) +async function testPipeToStringSource() { + const { pipeTo, push: pushFn, text: textFn } = require('stream/iter'); + const { writer, readable } = pushFn({ budget: 16384 }); + const consume = (async () => textFn(readable))(); + await pipeTo('hello-pipe', writer); + const data = await consume; + assert.strictEqual(data, 'hello-pipe'); +} + +// INVARIANT: Each transform invocation receives its own options object. +// A transform that mutates options must not affect subsequent transforms. +async function testTransformOptionsNotShared() { + const seen = []; + const transform1 = (chunks, options) => { + // Mutate the options object + options.mutated = true; + seen.push({ id: 1, mutated: options.mutated }); + return chunks; + }; + const transform2 = (chunks, options) => { + // Should NOT see mutation from transform1 + seen.push({ id: 2, mutated: options.mutated }); + return chunks; + }; + await text(pull(from('test'), transform1, transform2)); + // transform1 sees its own mutation + assert.strictEqual(seen[0].mutated, true); + // transform2 gets a fresh options object - no mutation visible + assert.strictEqual(seen[1].mutated, undefined); +} + +// Run the uncaughtException test sequentially (it installs a global handler +// that would interfere with concurrent tests). +(async () => { + await Promise.all([ + testPullIdentity(), + testPullStatelessTransform(), + testPullStatefulTransform(), + testPullWithAbortSignal(), + testPullChainedTransforms(), + testPullSourceError(), + testTapCallbackError(), + testPullSignalAbortMidIteration(), + testPullSignalAbortWhileSourceNextPending(), + testPullSignalAbortWithTransformWhileSourceNextPending(), + testPullConsumerBreakCleanup(), + testPullTransformReturnsPromise(), + testPullTransformYieldsStrings(), + testPullStatelessTransformError(), + testPullStatefulTransformError(), + testPullStatelessTransformFlush(), + testPullConsecutiveStatelessTransformFlush(), + testPullStatelessTransformFlushError(), + testPullWithSyncSource(), + testPullStringSource(), + testTransformReturnsSingleUint8Array(), + testTransformReturnsSingleString(), + testTransformReturnsArrayBuffer(), + testPipeToStringSource(), + testTransformOptionsNotShared(), + ]); + // Run after all concurrent tests complete to avoid global handler races + await testTransformSignalListenerErrorOnSourceError(); +})().then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-pull-sync.js b/test/parallel/test-stream-iter-pull-sync.js new file mode 100644 index 000000000000..c47a6b3f9233 --- /dev/null +++ b/test/parallel/test-stream-iter-pull-sync.js @@ -0,0 +1,193 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { pullSync, fromSync, bytesSync, tapSync } = require('stream/iter'); + +function testPullSyncIdentity() { + // No transforms - just pass through + const data = bytesSync(pullSync(fromSync('hello'))); + assert.deepStrictEqual(data, new TextEncoder().encode('hello')); +} + +function testPullSyncStatelessTransform() { + const upper = (chunks) => { + if (chunks === null) return null; + return chunks.map((c) => { + const str = new TextDecoder().decode(c); + return new TextEncoder().encode(str.toUpperCase()); + }); + }; + const data = bytesSync(pullSync(fromSync('abc'), upper)); + assert.deepStrictEqual(data, new TextEncoder().encode('ABC')); +} + +function testPullSyncStatefulTransform() { + const source = fromSync('data'); + const stateful = { + transform: function*(source) { + for (const chunks of source) { + if (chunks === null) { + // Flush: emit trailer + yield new TextEncoder().encode('-END'); + continue; + } + for (const chunk of chunks) { + yield chunk; + } + } + }, + }; + const result = pullSync(source, stateful); + const data = new TextDecoder().decode(bytesSync(result)); + assert.strictEqual(data, 'data-END'); +} + +function testPullSyncChainedTransforms() { + const addExcl = (chunks) => { + if (chunks === null) return null; + return [...chunks, new TextEncoder().encode('!')]; + }; + const addQ = (chunks) => { + if (chunks === null) return null; + return [...chunks, new TextEncoder().encode('?')]; + }; + const result = pullSync(fromSync('hello'), addExcl, addQ); + const data = new TextDecoder().decode(bytesSync(result)); + assert.strictEqual(data, 'hello!?'); +} + +// PullSync source error propagates +function testPullSyncSourceError() { + function* failingSource() { + yield [new TextEncoder().encode('a')]; + throw new Error('sync source boom'); + } + assert.throws(() => { + // eslint-disable-next-line no-unused-vars + for (const _ of pullSync(failingSource())) { /* consume */ } + }, { message: 'sync source boom' }); +} + +// PullSync with empty source +function testPullSyncEmptySource() { + function* empty() {} + const result = bytesSync(pullSync(empty())); + assert.strictEqual(result.length, 0); +} + +// TapSync callback error propagates +function testTapSyncCallbackError() { + const badTap = tapSync(() => { throw new Error('tapSync boom'); }); + assert.throws(() => { + // eslint-disable-next-line no-unused-vars + for (const _ of pullSync(fromSync('hello'), badTap)) { /* consume */ } + }, { message: 'tapSync boom' }); +} + +// Stateless transform error propagates +function testPullSyncStatelessTransformError() { + const badTransform = (chunks) => { + if (chunks === null) return null; + throw new Error('stateless transform boom'); + }; + assert.throws(() => { + // eslint-disable-next-line no-unused-vars + for (const _ of pullSync(fromSync('hello'), badTransform)) { /* consume */ } + }, { message: 'stateless transform boom' }); +} + +// Stateful transform error propagates +function testPullSyncStatefulTransformError() { + const badStateful = { + transform: function*(source) { // eslint-disable-line require-yield + for (const chunks of source) { + if (chunks === null) continue; + throw new Error('stateful transform boom'); + } + }, + }; + assert.throws(() => { + // eslint-disable-next-line no-unused-vars + for (const _ of pullSync(fromSync('hello'), badStateful)) { /* consume */ } + }, { message: 'stateful transform boom' }); +} + +// Stateless transform flush emitting data +function testPullSyncStatelessTransformFlush() { + const withTrailer = (chunks) => { + if (chunks === null) { + // Flush: emit trailing data + return [new TextEncoder().encode('-TRAILER')]; + } + return chunks; + }; + const data = new TextDecoder().decode(bytesSync(pullSync(fromSync('data'), withTrailer))); + assert.strictEqual(data, 'data-TRAILER'); +} + +// Consecutive stateless transforms each receive a final flush signal after +// upstream flush output has been processed. +function testPullSyncConsecutiveStatelessTransformFlush() { + const enc = new TextEncoder(); + const addAOnFlush = (chunks) => (chunks === null ? + [enc.encode('-A')] : chunks); + const addBOnFlush = (chunks) => (chunks === null ? + [enc.encode('-B')] : chunks); + + const data = new TextDecoder().decode(bytesSync( + pullSync(fromSync('x'), addAOnFlush, addBOnFlush))); + assert.strictEqual(data, 'x-A-B'); +} + +// Stateless transform flush error propagates +function testPullSyncStatelessTransformFlushError() { + const badFlush = (chunks) => { + if (chunks === null) { + throw new Error('flush boom'); + } + return chunks; + }; + assert.throws(() => { + // eslint-disable-next-line no-unused-vars + for (const _ of pullSync(fromSync('hello'), badFlush)) { /* consume */ } + }, { message: 'flush boom' }); +} + +// Empty source result is a Uint8Array +function testPullSyncEmptySourceType() { + function* empty() {} + const result = bytesSync(pullSync(empty())); + assert.ok(result instanceof Uint8Array); + assert.strictEqual(result.byteLength, 0); +} + +// Invalid transform argument +function testPullSyncInvalidTransform() { + assert.throws( + () => { for (const _ of pullSync(fromSync('x'), 42)) { /* consume */ } }, // eslint-disable-line no-unused-vars + { code: 'ERR_INVALID_ARG_TYPE' }, + ); + assert.throws( + () => { for (const _ of pullSync(fromSync('x'), null)) { /* consume */ } }, // eslint-disable-line no-unused-vars + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +Promise.all([ + testPullSyncIdentity(), + testPullSyncStatelessTransform(), + testPullSyncStatefulTransform(), + testPullSyncChainedTransforms(), + testPullSyncSourceError(), + testPullSyncEmptySource(), + testPullSyncEmptySourceType(), + testTapSyncCallbackError(), + testPullSyncStatelessTransformError(), + testPullSyncStatefulTransformError(), + testPullSyncStatelessTransformFlush(), + testPullSyncConsecutiveStatelessTransformFlush(), + testPullSyncStatelessTransformFlushError(), + testPullSyncInvalidTransform(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-push-backpressure.js b/test/parallel/test-stream-iter-push-backpressure.js new file mode 100644 index 000000000000..31be8eb46baa --- /dev/null +++ b/test/parallel/test-stream-iter-push-backpressure.js @@ -0,0 +1,159 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { push, text } = require('stream/iter'); + +async function testStrictBackpressure() { + const kChunk = new Uint8Array(16384).fill(65); // 'A' + const { writer, readable } = push({ + budget: 16384, + backpressure: 'strict', + }); + + // First write fills the budget + assert.strictEqual(writer.writeSync(kChunk), true); + // Second write rejected (buffer full) + assert.strictEqual(writer.writeSync(kChunk), false); + + // Consume to free space, then end + const resultPromise = text(readable); + writer.end(); + const data = await resultPromise; + assert.strictEqual(data, 'A'.repeat(16384)); +} + +async function testDropOldest() { + const chunk1 = new Uint8Array(16384).fill(49); // '1' + const chunk2 = new Uint8Array(16384).fill(50); // '2' + const chunk3 = new Uint8Array(16384).fill(51); // '3' + const { writer, readable } = push({ + budget: 32768, + backpressure: 'drop-oldest', + }); + + assert.strictEqual(writer.writeSync(chunk1), true); // 16384 < 32768 + assert.strictEqual(writer.writeSync(chunk2), true); // 32768 >= 32768 + // Buffer full: this drops chunk1, adds chunk3 + assert.strictEqual(writer.writeSync(chunk3), true); + writer.end(); + + const data = await text(readable); + // chunk2 ('2' x 16384) + chunk3 ('3' x 16384) survived + assert.strictEqual(data, '2'.repeat(16384) + '3'.repeat(16384)); +} + +async function testDropNewest() { + const kept = new Uint8Array(16384).fill(75); // 'K' + const dropped = new Uint8Array(16384).fill(68); // 'D' + const { writer, readable } = push({ + budget: 16384, + backpressure: 'drop-newest', + }); + + assert.strictEqual(writer.writeSync(kept), true); + // Buffer full: new write is silently discarded + assert.strictEqual(writer.writeSync(dropped), true); + writer.end(); + + const data = await text(readable); + assert.strictEqual(data, 'K'.repeat(16384)); +} + +async function testBlockBackpressure() { + const kChunk = new Uint8Array(16384); + const { writer, readable } = push({ budget: 16384, backpressure: 'unbounded' }); + + // Fill the buffer + writer.writeSync(kChunk); + + // Next write should block (not throw, not drop) + let writeState = 'pending'; + const writePromise = writer.write(kChunk).then(() => { writeState = 'resolved'; }); + + // The write cannot resolve until the buffer is drained, so a microtask + // tick is sufficient to confirm it is still blocked. + await new Promise(setImmediate); + assert.strictEqual(writeState, 'pending'); // Still blocked + + // Read from the consumer to drain + const iter = readable[Symbol.asyncIterator](); + const first = await iter.next(); + assert.strictEqual(first.done, false); + + // After draining, the pending write resolves as a microtask + await new Promise(setImmediate); + assert.strictEqual(writeState, 'resolved'); // Now unblocked + + writer.endSync(); + const second = await iter.next(); + assert.strictEqual(second.done, false); + await writePromise; +} + +async function testBlockWriteSyncDoesNotEnqueue() { + // With block policy, writeSync returns false when the buffer is full. + // The data is NOT accepted — writeSync only operates on the slots buffer. + // The caller should fall back to write() which uses the pending queue. + const kChunk = new Uint8Array(16384); + const { writer, readable } = push({ budget: 16384, backpressure: 'unbounded' }); + + // Fill the buffer + assert.strictEqual(writer.writeSync(kChunk), true); + + // Buffer full: writeSync returns false, data NOT enqueued + assert.strictEqual(writer.writeSync(kChunk), false); + + // Use the async write (try-fallback pattern) — this goes to pending queue + const consuming = text(readable); + await writer.write(kChunk); + await writer.end(); + + // Both chunks should be delivered (sync + async) + const result = await consuming; + assert.strictEqual(result.length, 32768); +} + +async function testStrictPendingQueueOverflow() { + // With strict mode, the pending writes queue is limited to 1. + // Filling the buffer (1 sync write) + filling the pending queue (1 async write) + // should leave no room. A third write must reject with a RangeError. + const kChunk = new Uint8Array(16384); + const { writer, readable } = push({ + budget: 16384, + backpressure: 'strict', + }); + + // Fill the buffer + assert.strictEqual(writer.writeSync(kChunk), true); + + // This async write goes into the pending queue (buffer full, queue has room) + const pendingWrite = writer.write(kChunk); + + // This write should reject: buffer full AND pending queue at capacity + await assert.rejects( + () => writer.write(kChunk), + { + code: 'ERR_INVALID_STATE', + name: 'RangeError', + }, + ); + + // Clean up: drain the readable + const iter = readable[Symbol.asyncIterator](); + await iter.next(); + await iter.next(); + await pendingWrite; + writer.endSync(); + await iter.return(); +} + +Promise.all([ + testStrictBackpressure(), + testDropOldest(), + testDropNewest(), + testBlockBackpressure(), + testBlockWriteSyncDoesNotEnqueue(), + testStrictPendingQueueOverflow(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-push-basic.js b/test/parallel/test-stream-iter-push-basic.js new file mode 100644 index 000000000000..9b1c044cac47 --- /dev/null +++ b/test/parallel/test-stream-iter-push-basic.js @@ -0,0 +1,190 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { push, text } = require('stream/iter'); + +async function testBasicWriteRead() { + const { writer, readable } = push(); + + writer.write('hello'); + writer.end(); + + const data = await text(readable); + assert.strictEqual(data, 'hello'); +} + +async function testMultipleWrites() { + const { writer, readable } = push({ budget: 16384 }); + + writer.write('a'); + writer.write('b'); + writer.write('c'); + writer.end(); + + const data = await text(readable); + assert.strictEqual(data, 'abc'); +} + +async function testCanWrite() { + const kHalf = new Uint8Array(8192); + const { writer } = push({ budget: 16384 }); + + assert.strictEqual(writer.canWrite, true); + writer.writeSync(kHalf); + assert.strictEqual(writer.canWrite, true); // 8192 < 16384 + writer.writeSync(kHalf); + assert.strictEqual(writer.canWrite, false); // 16384 >= 16384 + + writer.end(); + assert.strictEqual(writer.canWrite, null); +} + +async function testWriterEnd() { + const { writer, readable } = push(); + + const totalBytes = writer.endSync(); + assert.strictEqual(totalBytes, 0); + + // Calling endSync again returns byte count (idempotent when closed) + assert.strictEqual(writer.endSync(), 0); + + const batches = []; + for await (const batch of readable) { + batches.push(batch); + } + assert.strictEqual(batches.length, 0); +} + +async function testWriterFail() { + const { writer, readable } = push(); + + writer.fail(new Error('test fail')); + + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { + assert.fail('Should not reach here'); + } + }, + { message: 'test fail' }, + ); +} + +async function testConsumerBreak() { + const { writer, readable } = push({ budget: 16384 }); + + writer.writeSync('a'); + writer.writeSync('b'); + writer.writeSync('c'); + + // Break after first batch + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { + break; + } + + // Writer should now see null canWrite + assert.strictEqual(writer.canWrite, null); +} + +async function testAbortSignal() { + const ac = new AbortController(); + const { readable } = push({ signal: ac.signal }); + + ac.abort(); + + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { + assert.fail('Should not reach here'); + } + }, + { name: 'AbortError' }, + ); +} + +async function testAbortSignalReason() { + const reason = 'test reason'; + const ac = new AbortController(); + const { writer } = push({ signal: ac.signal }); + + ac.abort(reason); + + await assert.rejects(writer.write('data'), (err) => err === reason); +} + +async function testPreAbortedSignal() { + const { readable } = push({ signal: AbortSignal.abort() }); + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { + assert.fail('Should not reach here'); + } + }, { name: 'AbortError' }); +} + +async function testConsumerBreakWriteSyncReturnsFalse() { + const { writer, readable } = push({ budget: 16384 }); + writer.writeSync('a'); + + // Break after first batch + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { + break; + } + + // After consumer break, writeSync should return false + assert.strictEqual(writer.writeSync('b'), false); + assert.strictEqual(writer.canWrite, null); +} + +async function testPushWithTransforms() { + const upper = (chunks) => { + if (chunks === null) return null; + return chunks.map((c) => { + const str = new TextDecoder().decode(c); + return new TextEncoder().encode(str.toUpperCase()); + }); + }; + + const { writer, readable } = push(upper); + + writer.write('hello'); + writer.end(); + + const data = await text(readable); + assert.strictEqual(data, 'HELLO'); +} + +async function testInvalidBackpressure() { + assert.throws(() => push({ backpressure: 'banana' }), { + code: 'ERR_INVALID_ARG_VALUE', + }); + assert.throws(() => push({ backpressure: '' }), { + code: 'ERR_INVALID_ARG_VALUE', + }); + + // Valid values should not throw + for (const bp of ['strict', 'unbounded', 'drop-oldest', 'drop-newest']) { + push({ backpressure: bp }); + } +} + +Promise.all([ + testBasicWriteRead(), + testMultipleWrites(), + testCanWrite(), + testWriterEnd(), + testWriterFail(), + testConsumerBreak(), + testAbortSignal(), + testAbortSignalReason(), + testPreAbortedSignal(), + testConsumerBreakWriteSyncReturnsFalse(), + testPushWithTransforms(), + testInvalidBackpressure(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-push-writer.js b/test/parallel/test-stream-iter-push-writer.js new file mode 100644 index 000000000000..8ce555ca9251 --- /dev/null +++ b/test/parallel/test-stream-iter-push-writer.js @@ -0,0 +1,608 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { push, ondrain, text } = require('stream/iter'); + +async function testOndrain() { + const { writer } = push({ budget: 16384 }); + + // With space available, ondrain resolves immediately + const drainResult = ondrain(writer); + assert.ok(drainResult instanceof Promise); + const result = await drainResult; + assert.strictEqual(result, true); + + // After close, ondrain returns null + writer.end(); + assert.strictEqual(ondrain(writer), null); +} + +async function testOndrainNonDrainable() { + // Non-drainable objects return null + assert.strictEqual(ondrain(null), null); + assert.strictEqual(ondrain({}), null); + assert.strictEqual(ondrain('string'), null); +} + +async function testOndrainProtocolErrorPropagates() { + const badDrainable = { + [Symbol.for('Stream.drainableProtocol')]() { + throw new Error('protocol error'); + }, + }; + assert.throws( + () => ondrain(badDrainable), + { message: 'protocol error' }, + ); +} + +async function testWriteWithSignalRejects() { + const kChunk = new Uint8Array(16384); + const { writer, readable } = push({ budget: 16384 }); + + // Fill the buffer so write will block + writer.writeSync(kChunk); + + const ac = new AbortController(); + const writePromise = writer.write(kChunk, { signal: ac.signal }); + + // Signal fires while write is pending + ac.abort(); + + await assert.rejects(writePromise, { name: 'AbortError' }); + + // Clean up + writer.end(); + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { break; } +} + +async function testWriteWithPreAbortedSignal() { + const { writer, readable } = push({ budget: 16384 }); + + // Pre-aborted signal should reject immediately + await assert.rejects( + writer.write('data', { signal: AbortSignal.abort() }), + { name: 'AbortError' }, + ); + + // Writer should still be usable for other writes + writer.write('ok'); + writer.end(); + const data = await text(readable); + assert.strictEqual(data, 'ok'); +} + +async function testCancelledWriteRemovedFromQueue() { + const kChunk = new Uint8Array(16384); + const { writer, readable } = push({ budget: 16384 }); + + // Fill the buffer + writer.writeSync(kChunk); + + const ac = new AbortController(); + // This write should be queued since buffer is full + const cancelledWrite = writer.write(kChunk, { signal: ac.signal }); + + // Cancel it + ac.abort(); + await cancelledWrite.catch(() => {}); + + // Drain to make room for the replacement write + const iter = readable[Symbol.asyncIterator](); + await iter.next(); + + // The cancelled write should NOT occupy a pending slot. + // A new write should succeed now that the buffer has room. + await writer.write(kChunk); + writer.end(); + + const result = await iter.next(); + assert.ok(!result.done); + let totalBytes = 0; + for (const chunk of result.value) { + totalBytes += chunk.byteLength; + } + assert.strictEqual(totalBytes, 16384); + await iter.return(); +} + +async function testOndrainResolvesFalseOnConsumerBreak() { + const kChunk = new Uint8Array(16384); + const { writer, readable } = push({ budget: 16384 }); + + // Fill the buffer so canWrite = false + writer.writeSync(kChunk); + + // Also queue a pending write so that reading one chunk + // doesn't clear backpressure (the pending write refills the buffer) + const pendingWrite = writer.write(kChunk); + + // Start a drain wait - still at capacity + const drainPromise = ondrain(writer); + + // Consumer returns without draining enough to clear backpressure + const iter = readable[Symbol.asyncIterator](); + await iter.return(); + + // Ondrain should resolve false since the consumer terminated + const result = await drainPromise; + assert.strictEqual(result, false); + await pendingWrite.catch(() => {}); // Ignore write rejection +} + +async function testOndrainRejectsOnConsumerThrow() { + const kChunk = new Uint8Array(16384); + const { writer, readable } = push({ budget: 16384 }); + + // Fill the buffer so canWrite = false + writer.writeSync(kChunk); + + // Also queue a pending write so that reading one chunk + // doesn't clear backpressure (the pending write refills the buffer) + const pendingWrite = writer.write(kChunk); + + // Start a drain wait - still at capacity + const drainPromise = ondrain(writer); + + // Consumer throws via iterator.throw() before draining enough + // to clear backpressure. The drain should reject. + const iter = readable[Symbol.asyncIterator](); + const err = new Error('consumer error'); + const drainRejects = assert.rejects(drainPromise, (e) => e === err); + const pendingWriteRejects = pendingWrite.catch(() => {}); + await assert.rejects( + () => iter.throw(err), + (e) => e === err, + ); + + await drainRejects; + await pendingWriteRejects; // Ignore write rejection +} + +async function testWritev() { + const { writer, readable } = push({ budget: 16384 }); + const enc = new TextEncoder(); + writer.writev([enc.encode('hel'), enc.encode('lo')]); + writer.endSync(); + const result = await text(readable); + assert.strictEqual(result, 'hello'); +} + +async function testWritevSync() { + const { writer, readable } = push({ budget: 16384 }); + const enc = new TextEncoder(); + assert.strictEqual(writer.writevSync([enc.encode('hel'), enc.encode('lo')]), true); + writer.endSync(); + const result = await text(readable); + assert.strictEqual(result, 'hello'); +} + +async function testWritevSyncInvalidChunkDoesNotQueue() { + const { writer, readable } = push({ budget: 16384 }); + + assert.throws( + () => writer.writevSync([1]), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); + + const iter = readable[Symbol.asyncIterator](); + const next = iter.next(); + const result = await Promise.race([ + next.then(() => 'resolved'), + new Promise((resolve) => setImmediate(resolve, 'pending')), + ]); + assert.strictEqual(result, 'pending'); + + writer.endSync(); + const end = await next; + assert.strictEqual(end.value, undefined); + assert.strictEqual(end.done, true); +} + +async function testWritevMixedTypes() { + const { writer, readable } = push({ budget: 16384 }); + // Mix strings and Uint8Arrays + writer.writev(['hel', new TextEncoder().encode('lo')]); + writer.endSync(); + const result = await text(readable); + assert.strictEqual(result, 'hello'); +} + +async function testWriteAfterEnd() { + const { writer } = push(); + writer.endSync(); + // Sync write after end returns false + assert.strictEqual(writer.writeSync('fail'), false); + // Async write after end rejects + await assert.rejects( + () => writer.write('fail'), + { code: 'ERR_INVALID_STATE' }, + ); +} + +async function testWriteAfterFail() { + const { writer } = push(); + writer.fail(new Error('failed')); + // Sync write after fail returns false + assert.strictEqual(writer.writeSync('fail'), false); + // Async write after fail rejects with the stored error + await assert.rejects( + () => writer.write('fail'), + { message: 'failed' }, + ); +} + +async function testFail() { + const { writer, readable } = push(); + writer.writeSync('hello'); + writer.fail(new Error('boom')); + // Second fail is a no-op (already errored) + writer.fail(new Error('boom2')); + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { /* consume */ } + }, { message: 'boom' }); +} + +async function testEndAsyncReturnValue() { + const { writer, readable } = push(); + writer.writeSync('hello'); + // Start consuming concurrently (end() waits for drain) + const consume = (async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { /* drain */ } + })(); + const total = await writer.end(); + assert.strictEqual(total, 5); + await consume; +} + +async function testEndWithPreAbortedSignal() { + const { writer, readable } = push(); + const reason = new Error('end aborted'); + + writer.writeSync('hello'); + await assert.rejects( + writer.end({ signal: AbortSignal.abort(reason) }), + (error) => error === reason, + ); + + // A rejected end must leave the writer open. + writer.writeSync(' world'); + const consume = text(readable); + assert.strictEqual(await writer.end(), 11); + assert.strictEqual(await consume, 'hello world'); +} + +async function testEndSignalAbortWhileDraining() { + const { writer, readable } = push(); + const controller = new AbortController(); + const reason = new Error('end aborted while draining'); + + writer.writeSync('hello'); + const abortedEnd = writer.end({ signal: controller.signal }); + controller.abort(reason); + + await assert.rejects(abortedEnd, (error) => error === reason); + + // Aborting the operation does not undo the end-of-stream signal. + const completedEnd = writer.end(); + assert.strictEqual(await text(readable), 'hello'); + assert.strictEqual(await completedEnd, 5); +} + +async function testEndAfterEndSyncWaitsForDrain() { + const { writer, readable } = push(); + writer.writeSync('hello'); + assert.strictEqual(writer.endSync(), -1); + + let ended = false; + const end = writer.end().then((n) => { + ended = true; + return n; + }); + + await Promise.resolve(); + assert.strictEqual(ended, false); + + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { /* drain */ } + assert.strictEqual(await end, 5); +} + +async function testWriteUint8Array() { + const { writer, readable } = push(); + writer.write(new Uint8Array([72, 73])); // 'HI' + writer.endSync(); + const result = await text(readable); + assert.strictEqual(result, 'HI'); +} + +async function testOndrainWaitsForDrain() { + const kChunk = new Uint8Array(16384); + const { writer, readable } = push({ budget: 16384 }); + writer.writeSync(kChunk); // Fills budget + + let drainState = 'pending'; + const drainPromise = ondrain(writer).then((v) => { drainState = v; }); + + await new Promise(setImmediate); + assert.strictEqual(drainState, 'pending'); // Still waiting + + // Read to drain + const iter = readable[Symbol.asyncIterator](); + await iter.next(); + + await drainPromise; + assert.strictEqual(drainState, true); + writer.endSync(); +} + +// Consumer throw causes subsequent writes to reject with consumer's error +async function testConsumerThrowRejectsWrites() { + const kChunk = new Uint8Array(16384); + const { writer, readable } = push({ budget: 16384 }); + writer.writeSync(kChunk); + + const iter = readable[Symbol.asyncIterator](); + const err = new Error('consumer boom'); + await assert.rejects( + () => iter.throw(err), + (e) => e === err, + ); + + // Subsequent async writes should reject with the consumer's error + await assert.rejects( + () => writer.write('x'), + { message: 'consumer boom' }, + ); +} + +async function testConsumerThrowRejectsWithThrownError() { + const { readable } = push(); + + const iter = readable[Symbol.asyncIterator](); + const err = new Error('boom'); + + await assert.rejects( + () => iter.throw(err), + (e) => e === err, + ); +} + +// end() resolves a pending read as done:true +async function testEndResolvesPendingRead() { + const { writer, readable } = push(); + + // Consumer starts reading — blocks because buffer is empty + const iter = readable[Symbol.asyncIterator](); + const readPromise = iter.next(); + + // Give the read a tick to enter the pending state + await new Promise(setImmediate); + + // End the writer — should resolve the pending read with done:true + writer.endSync(); + const result = await readPromise; + assert.strictEqual(result.done, true); +} + +// fail() rejects a pending read with the error +async function testFailRejectsPendingRead() { + const { writer, readable } = push(); + + const iter = readable[Symbol.asyncIterator](); + const readPromise = iter.next(); + + await new Promise(setImmediate); + + writer.fail(new Error('fail during read')); + await assert.rejects( + () => readPromise, + { message: 'fail during read' }, + ); +} + +// iterator.return() resolves a pending read with done:true +async function testConsumerReturnResolvesPendingRead() { + const { readable } = push(); + + const iter = readable[Symbol.asyncIterator](); + const readPromise = iter.next(); + + await new Promise(setImmediate); + + const returnResult = await iter.return(); + assert.strictEqual(returnResult.value, undefined); + assert.strictEqual(returnResult.done, true); + + const readResult = await readPromise; + assert.strictEqual(readResult.value, undefined); + assert.strictEqual(readResult.done, true); +} + +// iterator.throw() rejects a pending read with the thrown error +async function testConsumerThrowRejectsPendingRead() { + const { readable } = push(); + + const iter = readable[Symbol.asyncIterator](); + const readPromise = iter.next(); + + await new Promise(setImmediate); + + const err = new Error('consumer read boom'); + const readRejects = assert.rejects( + () => readPromise, + (e) => e === err, + ); + await assert.rejects( + () => iter.throw(err), + (e) => e === err, + ); + + await readRejects; +} + +// end() while writes are pending rejects those writes +async function testEndRejectsPendingWrites() { + const kChunk = new Uint8Array(16384); + const { writer, readable } = push({ budget: 16384, backpressure: 'unbounded' }); + writer.writeSync(kChunk); // fill budget + + // This write blocks on backpressure + const writePromise = writer.write(kChunk); + + await new Promise(setImmediate); + + // Ending should reject the pending write + writer.endSync(); + + await assert.rejects( + () => writePromise, + { code: 'ERR_INVALID_STATE' }, + ); + + // Clean up: drain the readable + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { break; } +} + +async function testEndIdempotentWhenClosed() { + const { writer, readable } = push({ budget: 16384 }); + await writer.write('hello'); + // Start consuming concurrently (end() waits for drain) + const consume = (async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { /* drain */ } + })(); + const first = await writer.end(); + assert.strictEqual(first, 5); + // Second end() should resolve with same byte count (idempotent) + const second = await writer.end(); + assert.strictEqual(second, 5); + await consume; +} + +async function testAsyncDispose() { + const { writer, readable } = push({ budget: 16384 }); + writer.writeSync('hello'); + // Symbol.asyncDispose calls fail() with no argument + await writer[Symbol.asyncDispose](); + // Writer is now errored, writes should fail + assert.strictEqual(writer.writeSync('fail'), false); + // Drain readable + try { + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { /* consume */ } + } catch { + // Expected - reader sees the error + } +} + +async function testSyncDispose() { + const { writer, readable } = push({ budget: 16384 }); + writer.writeSync('hello'); + // Symbol.dispose calls fail() with no argument + writer[Symbol.dispose](); + // Writer is now errored, writes should fail + assert.strictEqual(writer.writeSync('fail'), false); + // Drain readable + try { + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { /* consume */ } + } catch { + // Expected + } +} + +async function testEndRejectsWhenErrored() { + const { writer, readable } = push({ budget: 16384 }); + await writer.write('hello'); + const err = new Error('boom'); + await writer.fail(err); + // end() after fail should reject with the stored error + await assert.rejects( + () => writer.end(), + (e) => e === err, + ); + // Drain readable + try { + // eslint-disable-next-line no-unused-vars + for await (const _ of readable) { break; } + } catch { + // Expected - reader may see the error + } +} + +async function testFailRejectsFutureReadWithFalsyReason() { + for (const reason of [0, null]) { + const { writer, readable } = push(); + + writer.fail(reason); + + const iter = readable[Symbol.asyncIterator](); + await iter.next().then( + common.mustNotCall(), + common.mustCall((rejection) => { + assert.strictEqual(rejection, reason); + }), + ); + } +} + +async function testFailRejectsPendingReadWithFalsyReason() { + const { writer, readable } = push(); + + const iter = readable[Symbol.asyncIterator](); + const readPromise = iter.next(); + + await new Promise(setImmediate); + + writer.fail(false); + await readPromise.then( + common.mustNotCall(), + common.mustCall((reason) => { + assert.strictEqual(reason, false); + }), + ); +} + +Promise.all([ + testOndrain(), + testOndrainNonDrainable(), + testWriteWithSignalRejects(), + testWriteWithPreAbortedSignal(), + testCancelledWriteRemovedFromQueue(), + testOndrainResolvesFalseOnConsumerBreak(), + testOndrainRejectsOnConsumerThrow(), + testWritev(), + testWritevSync(), + testWritevSyncInvalidChunkDoesNotQueue(), + testWritevMixedTypes(), + testWriteAfterEnd(), + testWriteAfterFail(), + testOndrainProtocolErrorPropagates(), + testFail(), + testEndAsyncReturnValue(), + testEndWithPreAbortedSignal(), + testEndSignalAbortWhileDraining(), + testEndAfterEndSyncWaitsForDrain(), + testWriteUint8Array(), + testOndrainWaitsForDrain(), + testConsumerThrowRejectsWrites(), + testConsumerThrowRejectsWithThrownError(), + testEndResolvesPendingRead(), + testFailRejectsPendingRead(), + testFailRejectsFutureReadWithFalsyReason(), + testFailRejectsPendingReadWithFalsyReason(), + testConsumerReturnResolvesPendingRead(), + testConsumerThrowRejectsPendingRead(), + testEndRejectsPendingWrites(), + testEndIdempotentWhenClosed(), + testEndRejectsWhenErrored(), + testAsyncDispose(), + testSyncDispose(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-readable-interop-disabled.js b/test/parallel/test-stream-iter-readable-interop-disabled.js new file mode 100644 index 000000000000..86c8cc141387 --- /dev/null +++ b/test/parallel/test-stream-iter-readable-interop-disabled.js @@ -0,0 +1,57 @@ +'use strict'; + +// Tests that toAsyncStreamable throws ERR_STREAM_ITER_MISSING_FLAG +// when --experimental-stream-iter is not enabled. + +const common = require('../common'); +const assert = require('assert'); +const { spawnPromisified } = common; + +async function testToAsyncStreamableWithoutFlag() { + const { stderr, code } = await spawnPromisified(process.execPath, [ + '-e', + ` + const { Readable } = require('stream'); + const r = new Readable({ read() {} }); + r[Symbol.for('Stream.toAsyncStreamable')](); + `, + ]); + assert.notStrictEqual(code, 0); + assert.match(stderr, /ERR_STREAM_ITER_MISSING_FLAG/); +} + +async function testToAsyncStreamableWithFlag() { + const { code } = await spawnPromisified(process.execPath, [ + '--experimental-stream-iter', + '-e', + ` + const { Readable } = require('stream'); + const r = new Readable({ + read() { this.push(Buffer.from('ok')); this.push(null); } + }); + const sym = Symbol.for('Stream.toAsyncStreamable'); + const iter = r[sym](); + // Should not throw, and should have stream property + if (!iter.stream) process.exit(1); + `, + ]); + assert.strictEqual(code, 0); +} + +async function testStreamIterModuleWithoutFlag() { + // Requiring 'stream/iter' without the flag should not be possible + // since the module is gated behind --experimental-stream-iter. + const { code } = await spawnPromisified(process.execPath, [ + '-e', + ` + require('stream/iter'); + `, + ]); + assert.notStrictEqual(code, 0); +} + +Promise.all([ + testToAsyncStreamableWithoutFlag(), + testToAsyncStreamableWithFlag(), + testStreamIterModuleWithoutFlag(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-readable-interop.js b/test/parallel/test-stream-iter-readable-interop.js new file mode 100644 index 000000000000..8100b54168be --- /dev/null +++ b/test/parallel/test-stream-iter-readable-interop.js @@ -0,0 +1,640 @@ +// Flags: --experimental-stream-iter +'use strict'; + +// Tests for classic Readable stream interop with the stream/iter API +// via the toAsyncStreamable protocol and kValidatedSource optimization. + +const common = require('../common'); +const assert = require('assert'); +const { Readable } = require('stream'); +const { + from, + pull, + bytes, + text, +} = require('stream/iter'); + +const toAsyncStreamable = Symbol.for('Stream.toAsyncStreamable'); + +// ============================================================================= +// toAsyncStreamable protocol is present on Readable.prototype +// ============================================================================= + +function testProtocolExists() { + assert.strictEqual(typeof Readable.prototype[toAsyncStreamable], 'function'); + + const readable = new Readable({ read() {} }); + assert.strictEqual(typeof readable[toAsyncStreamable], 'function'); +} + +// ============================================================================= +// Byte-mode Readable: basic round-trip through from() +// ============================================================================= + +async function testByteModeThroughFrom() { + const readable = new Readable({ + read() { + this.push(Buffer.from('hello')); + this.push(Buffer.from(' world')); + this.push(null); + }, + }); + + const result = await text(from(readable)); + assert.strictEqual(result, 'hello world'); +} + +// ============================================================================= +// Byte-mode Readable: basic round-trip through pull() +// ============================================================================= + +async function testByteModeThroughPull() { + const readable = new Readable({ + read() { + this.push(Buffer.from('pull ')); + this.push(Buffer.from('test')); + this.push(null); + }, + }); + + const result = await text(pull(readable)); + assert.strictEqual(result, 'pull test'); +} + +// ============================================================================= +// Byte-mode Readable: bytes consumer +// ============================================================================= + +async function testByteModeBytes() { + const data = Buffer.from('binary data here'); + const readable = new Readable({ + read() { + this.push(data); + this.push(null); + }, + }); + + const result = await bytes(from(readable)); + assert.deepStrictEqual(result, new Uint8Array(data)); +} + +// ============================================================================= +// Byte-mode Readable: batching - multiple buffered chunks yield as one batch +// ============================================================================= + +async function testBatchingBehavior() { + const readable = new Readable({ + read() { + // Push multiple chunks synchronously so they all buffer + for (let i = 0; i < 10; i++) { + this.push(Buffer.from(`chunk${i}`)); + } + this.push(null); + }, + }); + + const source = from(readable); + const batches = []; + for await (const batch of source) { + batches.push(batch); + } + + // All chunks were buffered synchronously, so they should come out + // as fewer batches than individual chunks (ideally one batch). + assert.ok(batches.length < 10, + `Expected fewer batches than chunks, got ${batches.length}`); + + // Total data should be correct + const allChunks = batches.flat(); + const combined = Buffer.concat(allChunks); + let expected = ''; + for (let i = 0; i < 10; i++) { + expected += `chunk${i}`; + } + assert.strictEqual(combined.toString(), expected); +} + +// ============================================================================= +// Byte-mode Readable: kValidatedSource is set +// ============================================================================= + +function testTrustedSourceByteMode() { + const readable = new Readable({ read() {} }); + const result = readable[toAsyncStreamable](); + // kValidatedSource is a private symbol, but we can verify the result + // is used directly by from() without wrapping by checking it has + // Symbol.asyncIterator + assert.strictEqual(typeof result[Symbol.asyncIterator], 'function'); + assert.strictEqual(result.stream, readable); +} + +// ============================================================================= +// Byte-mode Readable: multi-read with delayed pushes +// ============================================================================= + +async function testDelayedPushes() { + let pushCount = 0; + const readable = new Readable({ + read() { + if (pushCount < 3) { + setTimeout(() => { + this.push(Buffer.from(`delayed${pushCount}`)); + pushCount++; + if (pushCount === 3) { + this.push(null); + } + }, 10); + } + }, + }); + + const result = await text(from(readable)); + assert.strictEqual(result, 'delayed0delayed1delayed2'); +} + +// ============================================================================= +// Byte-mode Readable: empty stream +// ============================================================================= + +async function testEmptyStream() { + const readable = new Readable({ + read() { + this.push(null); + }, + }); + + const result = await text(from(readable)); + assert.strictEqual(result, ''); +} + +// ============================================================================= +// Byte-mode Readable: error propagation +// ============================================================================= + +async function testErrorPropagation() { + const readable = new Readable({ + read() { + process.nextTick(() => this.destroy(new Error('test error'))); + }, + }); + + await assert.rejects( + text(from(readable)), + (err) => err.message === 'test error', + ); +} + +// ============================================================================= +// Byte-mode Readable: with transforms +// ============================================================================= + +async function testWithTransform() { + const readable = new Readable({ + read() { + this.push(Buffer.from('hello')); + this.push(null); + }, + }); + + // Uppercase transform + function uppercase(chunks) { + if (chunks === null) return null; + return chunks.map((c) => { + const buf = Buffer.from(c); + for (let i = 0; i < buf.length; i++) { + if (buf[i] >= 97 && buf[i] <= 122) buf[i] -= 32; + } + return buf; + }); + } + + const result = await text(pull(readable, uppercase)); + assert.strictEqual(result, 'HELLO'); +} + +// ============================================================================= +// Object-mode Readable: strings are normalized to Uint8Array +// ============================================================================= + +async function testObjectModeStrings() { + const readable = new Readable({ + objectMode: true, + read() { + this.push('hello'); + this.push(' object'); + this.push(' mode'); + this.push(null); + }, + }); + + const result = await text(from(readable)); + assert.strictEqual(result, 'hello object mode'); +} + +// ============================================================================= +// Object-mode Readable: Uint8Array chunks pass through +// ============================================================================= + +async function testObjectModeUint8Array() { + const readable = new Readable({ + objectMode: true, + read() { + this.push(new Uint8Array([72, 73])); // "HI" + this.push(null); + }, + }); + + const result = await text(from(readable)); + assert.strictEqual(result, 'HI'); +} + +// ============================================================================= +// Object-mode Readable: mixed types (strings + Uint8Array) +// ============================================================================= + +async function testObjectModeMixed() { + const readable = new Readable({ + objectMode: true, + read() { + this.push('hello'); + this.push(Buffer.from(' ')); + this.push('world'); + this.push(null); + }, + }); + + const result = await text(from(readable)); + assert.strictEqual(result, 'hello world'); +} + +// ============================================================================= +// Object-mode Readable: toStreamable protocol objects +// ============================================================================= + +async function testObjectModeToStreamable() { + const toStreamableSym = Symbol.for('Stream.toStreamable'); + const readable = new Readable({ + objectMode: true, + read() { + this.push({ + [toStreamableSym]() { + return 'from-protocol'; + }, + }); + this.push(null); + }, + }); + + const result = await text(from(readable)); + assert.strictEqual(result, 'from-protocol'); +} + +// ============================================================================= +// Object-mode Readable: kValidatedSource is set +// ============================================================================= + +function testTrustedSourceObjectMode() { + const readable = new Readable({ objectMode: true, read() {} }); + const result = readable[toAsyncStreamable](); + assert.strictEqual(typeof result[Symbol.asyncIterator], 'function'); + assert.strictEqual(result.stream, readable); +} + +// ============================================================================= +// Encoded Readable: strings are re-encoded to Uint8Array +// ============================================================================= + +async function testEncodedReadable() { + const readable = new Readable({ + encoding: 'utf8', + read() { + this.push(Buffer.from('encoded')); + this.push(null); + }, + }); + + const result = await text(from(readable)); + assert.strictEqual(result, 'encoded'); +} + +// ============================================================================= +// Readable.from() source: verify interop with Readable.from() +// ============================================================================= + +async function testReadableFrom() { + const readable = Readable.from(['chunk1', 'chunk2', 'chunk3']); + + const result = await text(from(readable)); + assert.strictEqual(result, 'chunk1chunk2chunk3'); +} + +// ============================================================================= +// Byte-mode Readable: large data +// ============================================================================= + +async function testLargeData() { + const totalSize = 1024 * 1024; // 1 MB + const chunkSize = 16384; + let pushed = 0; + + const readable = new Readable({ + read() { + if (pushed < totalSize) { + const size = Math.min(chunkSize, totalSize - pushed); + const buf = Buffer.alloc(size, 0x41); // Fill with 'A' + this.push(buf); + pushed += size; + } else { + this.push(null); + } + }, + }); + + const result = await bytes(from(readable)); + assert.strictEqual(result.length, totalSize); + assert.strictEqual(result[0], 0x41); + assert.strictEqual(result[totalSize - 1], 0x41); +} + +// ============================================================================= +// Byte-mode Readable: consumer return (early termination) +// ============================================================================= + +async function testEarlyTermination() { + let pushCount = 0; + const readable = new Readable({ + read() { + this.push(Buffer.from(`chunk${pushCount++}`)); + // Never pushes null - infinite stream + }, + }); + + // Take only the first batch + const source = from(readable); + const batches = []; + for await (const batch of source) { + batches.push(batch); + break; // Stop after first batch + } + + assert.ok(batches.length >= 1); + // Stream should be destroyed after consumer return + // Give it a tick to clean up + await new Promise((resolve) => setTimeout(resolve, 50)); + assert.ok(readable.destroyed); +} + +// ============================================================================= +// Byte-mode Readable: pull() with compression transform +// ============================================================================= + +async function testWithCompression() { + const { + compressGzip, + decompressGzip, + } = require('zlib/iter'); + + const readable = new Readable({ + read() { + this.push(Buffer.from('compress me via classic Readable')); + this.push(null); + }, + }); + + const compressed = pull(readable, compressGzip()); + const result = await text(pull(compressed, decompressGzip())); + assert.strictEqual(result, 'compress me via classic Readable'); +} + +// ============================================================================= +// Object-mode Readable: error propagation +// ============================================================================= + +async function testObjectModeError() { + const readable = new Readable({ + objectMode: true, + read() { + process.nextTick(() => this.destroy(new Error('object error'))); + }, + }); + + await assert.rejects( + text(from(readable)), + (err) => err.message === 'object error', + ); +} + +// ============================================================================= +// Stream destroyed mid-iteration +// ============================================================================= + +async function testDestroyMidIteration() { + let pushCount = 0; + const readable = new Readable({ + read() { + this.push(Buffer.from(`chunk${pushCount++}`)); + // Never pushes null - infinite stream + }, + }); + + const chunks = []; + await assert.rejects(async () => { + for await (const batch of from(readable)) { + chunks.push(...batch); + if (chunks.length >= 3) { + readable.destroy(); + } + } + }, { code: 'ERR_STREAM_PREMATURE_CLOSE' }); + assert.ok(readable.destroyed); + assert.ok(chunks.length >= 3); +} + +// ============================================================================= +// Error after partial data +// ============================================================================= + +async function testErrorAfterPartialData() { + let count = 0; + const readable = new Readable({ + read() { + if (count < 3) { + this.push(Buffer.from(`ok${count++}`)); + } else { + this.destroy(new Error('late error')); + } + }, + }); + + const chunks = []; + await assert.rejects(async () => { + for await (const batch of from(readable)) { + chunks.push(...batch); + } + }, { message: 'late error' }); + assert.ok(chunks.length > 0, 'Should have received partial data'); +} + +// ============================================================================= +// Multiple consumers (second iteration yields empty) +// ============================================================================= + +async function testMultipleConsumers() { + const readable = new Readable({ + read() { + this.push(Buffer.from('data')); + this.push(null); + }, + }); + + const first = await text(from(readable)); + assert.strictEqual(first, 'data'); + + // Second consumption - stream is already consumed/destroyed + const second = await text(from(readable)); + assert.strictEqual(second, ''); +} + +// ============================================================================= +// highWaterMark: 0 - each chunk becomes its own batch +// ============================================================================= + +async function testHighWaterMarkZero() { + let pushCount = 0; + const readable = new Readable({ + highWaterMark: 0, + read() { + if (pushCount < 3) { + this.push(Buffer.from(`hwm0-${pushCount++}`)); + } else { + this.push(null); + } + }, + }); + + const batches = []; + for await (const batch of from(readable)) { + batches.push(batch); + } + + // With HWM=0, buffer is always empty so drain loop never fires. + // Each chunk should be its own batch. + assert.strictEqual(batches.length, 3); + const combined = Buffer.concat(batches.flat()); + assert.strictEqual(combined.toString(), 'hwm0-0hwm0-1hwm0-2'); +} + +// ============================================================================= +// Duplex stream (Duplex extends Readable, toAsyncStreamable should work) +// ============================================================================= + +async function testDuplexStream() { + const { Duplex } = require('stream'); + + const duplex = new Duplex({ + read() { + this.push(Buffer.from('duplex-data')); + this.push(null); + }, + write(chunk, enc, cb) { cb(); }, + }); + + const result = await text(from(duplex)); + assert.strictEqual(result, 'duplex-data'); +} + +// ============================================================================= +// setEncoding called dynamically after construction +// ============================================================================= + +async function testSetEncodingDynamic() { + const readable = new Readable({ + read() { + this.push(Buffer.from('dynamic-enc')); + this.push(null); + }, + }); + + readable.setEncoding('utf8'); + + const result = await text(from(readable)); + assert.strictEqual(result, 'dynamic-enc'); +} + +// ============================================================================= +// AbortSignal cancellation +// ============================================================================= + +async function testAbortSignal() { + let pushCount = 0; + const readable = new Readable({ + read() { + this.push(Buffer.from(`sig${pushCount++}`)); + // Never pushes null - infinite stream + }, + }); + + const ac = new AbortController(); + const chunks = []; + + await assert.rejects(async () => { + for await (const batch of pull(readable, { signal: ac.signal })) { + chunks.push(...batch); + if (chunks.length >= 2) { + ac.abort(); + } + } + }, { name: 'AbortError' }); + assert.ok(chunks.length >= 2); +} + +// ============================================================================= +// kValidatedSource identity - from() returns same object for validated sources +// ============================================================================= + +function testTrustedSourceIdentity() { + const readable = new Readable({ read() {} }); + const iter = readable[toAsyncStreamable](); + + // from() should return the validated iterator directly (same reference), + // not wrap it in another generator + const result = from(iter); + assert.strictEqual(result, iter); +} + +// ============================================================================= +// Run all tests +// ============================================================================= + +testProtocolExists(); +testTrustedSourceByteMode(); +testTrustedSourceObjectMode(); +testTrustedSourceIdentity(); + +Promise.all([ + testByteModeThroughFrom(), + testByteModeThroughPull(), + testByteModeBytes(), + testBatchingBehavior(), + testDelayedPushes(), + testEmptyStream(), + testErrorPropagation(), + testWithTransform(), + testObjectModeStrings(), + testObjectModeUint8Array(), + testObjectModeMixed(), + testObjectModeToStreamable(), + testEncodedReadable(), + testReadableFrom(), + testLargeData(), + testEarlyTermination(), + testWithCompression(), + testObjectModeError(), + testDestroyMidIteration(), + testErrorAfterPartialData(), + testMultipleConsumers(), + testHighWaterMarkZero(), + testDuplexStream(), + testSetEncodingDynamic(), + testAbortSignal(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-share-async.js b/test/parallel/test-stream-iter-share-async.js new file mode 100644 index 000000000000..f55ca35f6977 --- /dev/null +++ b/test/parallel/test-stream-iter-share-async.js @@ -0,0 +1,370 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { + from, + share, + text, +} = require('stream/iter'); + +const { setTimeout } = require('timers/promises'); + +// ============================================================================= +// Async share() +// ============================================================================= + +async function testBasicShare() { + const shared = share(from('hello shared')); + + const consumer = shared.pull(); + const data = await text(consumer); + assert.strictEqual(data, 'hello shared'); +} + +async function testShareMultipleConsumers() { + async function* gen() { + yield [new TextEncoder().encode('chunk1')]; + yield [new TextEncoder().encode('chunk2')]; + yield [new TextEncoder().encode('chunk3')]; + } + + const shared = share(gen(), { budget: 16384 }); + + const c1 = shared.pull(); + const c2 = shared.pull(); + + assert.strictEqual(shared.consumerCount, 2); + + const [data1, data2] = await Promise.all([ + text(c1), + text(c2), + ]); + + assert.strictEqual(data1, 'chunk1chunk2chunk3'); + assert.strictEqual(data2, 'chunk1chunk2chunk3'); +} + +async function testShareConsumerCount() { + const shared = share(from('data')); + + assert.strictEqual(shared.consumerCount, 0); + + const c1 = shared.pull(); + assert.strictEqual(shared.consumerCount, 1); + + const c2 = shared.pull(); + assert.strictEqual(shared.consumerCount, 2); + + // Cancel detaches all consumers + shared.cancel(); + assert.strictEqual(shared.consumerCount, 0); + + // Both should complete immediately + const [data1, data2] = await Promise.all([ + text(c1), + text(c2), + ]); + assert.strictEqual(data1, ''); + assert.strictEqual(data2, ''); +} + +async function testShareCancel() { + const shared = share(from('data')); + const consumer = shared.pull(); + + shared.cancel(); + assert.strictEqual(shared.consumerCount, 0); + + const batches = []; + for await (const batch of consumer) { + batches.push(batch); + } + assert.strictEqual(batches.length, 0); +} + +async function testShareCancelMidIteration() { + // Verify that cancel during iteration stops data flow + let sourceReturnCalled = false; + const enc = new TextEncoder(); + async function* gen() { + try { + yield [enc.encode('a')]; + yield [enc.encode('b')]; + yield [enc.encode('c')]; + } finally { + sourceReturnCalled = true; + } + } + const shared = share(gen(), { budget: 16384 }); + const consumer = shared.pull(); + + const items = []; + for await (const batch of consumer) { + for (const chunk of batch) { + items.push(new TextDecoder().decode(chunk)); + } + // Cancel after first batch + shared.cancel(); + } + assert.strictEqual(items.length, 1); + assert.strictEqual(items[0], 'a'); + + await new Promise(setImmediate); + assert.strictEqual(sourceReturnCalled, true); +} + +async function testShareCancelWithReason() { + const shared = share(from('data')); + const consumer = shared.pull(); + + shared.cancel(new Error('share cancelled')); + + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of consumer) { + assert.fail('Should not reach here'); + } + }, + { message: 'share cancelled' }, + ); +} + +async function testShareAbortSignal() { + const ac = new AbortController(); + const reason = new Error('share aborted'); + const enc = new TextEncoder(); + async function* source() { + yield [enc.encode('a')]; + yield [enc.encode('b')]; + } + const shared = share(source(), { + budget: 16384, + backpressure: 'unbounded', + signal: ac.signal, + }); + const fast = shared.pull()[Symbol.asyncIterator](); + shared.pull(); + + await fast.next(); + const read = fast.next(); + const rejected = assert.rejects(read, (error) => error === reason); + ac.abort(reason); + + await rejected; +} + +async function testShareAbortSignalWhileSourcePullPending() { + const ac = new AbortController(); + const { + promise: resumePromise, + resolve: resume, + } = Promise.withResolvers(); + const { + promise: sourceStartedPromise, + resolve: sourceStarted, + } = Promise.withResolvers(); + + const source = { + __proto__: null, + [Symbol.asyncIterator]() { + return { + __proto__: null, + async next() { + sourceStarted(); + await resumePromise; + return { __proto__: null, done: true, value: undefined }; + }, + }; + }, + }; + + const shared = share(source, { signal: ac.signal }); + const iter1 = shared.pull()[Symbol.asyncIterator](); + const iter2 = shared.pull()[Symbol.asyncIterator](); + const read1 = iter1.next(); + const read2 = iter2.next(); + const rejected1 = assert.rejects(read1, { name: 'AbortError' }); + const rejected2 = assert.rejects(read2, { name: 'AbortError' }); + + await sourceStartedPromise; + ac.abort(); + resume(); + + await Promise.all([rejected1, rejected2]); +} + +async function testSharePullAbortSignalRejectsPendingNext() { + const ac = new AbortController(); + const reason = new Error('pull aborted'); + const shared = share( + // eslint-disable-next-line require-yield + (async function* never() { + await new Promise(() => {}); + })(), + ); + const iter = shared.pull({ signal: ac.signal })[Symbol.asyncIterator](); + + const pendingNext = iter.next(); + const rejected = assert.rejects(pendingNext, (error) => error === reason); + ac.abort(reason); + + await rejected; + shared.cancel(); +} + +async function testShareAlreadyAborted() { + const shared = share(from('data'), { signal: AbortSignal.abort() }); + const consumer = shared.pull(); + + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of consumer) { + assert.fail('Should not reach here'); + } + }, { name: 'AbortError' }); +} + +// ============================================================================= +// Source error propagation +// ============================================================================= + +async function testShareSourceError() { + async function* failingSource() { + yield [new TextEncoder().encode('a')]; + throw new Error('share source boom'); + } + const shared = share(failingSource()); + const c1 = shared.pull(); + const c2 = shared.pull(); + + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of c1) { /* consume */ } + }, { message: 'share source boom' }); + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of c2) { /* consume */ } + }, { message: 'share source boom' }); +} + +async function testShareLateJoiningConsumer() { + // A consumer that joins after some data has been consumed should only + // see data remaining in the buffer (not items already trimmed). + const enc = new TextEncoder(); + async function* gen() { + yield [enc.encode('a')]; + yield [enc.encode('b')]; + yield [enc.encode('c')]; + } + const shared = share(gen(), { budget: 16384 }); + + // First consumer reads all data + const c1 = shared.pull(); + const data1 = await text(c1); + assert.strictEqual(data1, 'abc'); + + // Late-joining consumer: source is exhausted, buffer has been trimmed + // past all data by c1's reads, so c2 gets nothing. + const c2 = shared.pull(); + const data2 = await text(c2); + assert.strictEqual(data2, ''); +} + +async function testShareConsumerBreak() { + // Verify that a consumer breaking mid-iteration detaches properly + const enc = new TextEncoder(); + async function* gen() { + yield [enc.encode('a')]; + yield [enc.encode('b')]; + yield [enc.encode('c')]; + } + const shared = share(gen(), { budget: 16384 }); + const c1 = shared.pull(); + const c2 = shared.pull(); + + assert.strictEqual(shared.consumerCount, 2); + + // c1 breaks after first batch + // eslint-disable-next-line no-unused-vars + for await (const _ of c1) { + break; + } + // c1 should be detached + assert.strictEqual(shared.consumerCount, 1); + + // c2 should still get all data + const data2 = await text(c2); + assert.strictEqual(data2, 'abc'); +} + +async function testShareMultipleConsumersConcurrentPull() { + // Multiple consumers pulling concurrently should each receive all items + // even when only one item is pulled from source at a time. + async function* slowSource() { + const enc = new TextEncoder(); + for (let i = 0; i < 5; i++) { + await setTimeout(1); + yield [enc.encode(`item-${i}`)]; + } + } + const shared = share(slowSource()); + const c1 = shared.pull(); + const c2 = shared.pull(); + const c3 = shared.pull(); + + const [t1, t2, t3] = await Promise.all([ + text(c1), text(c2), text(c3), + ]); + + const expected = 'item-0item-1item-2item-3item-4'; + assert.strictEqual(t1, expected); + assert.strictEqual(t2, expected); + assert.strictEqual(t3, expected); +} + +async function testShareConsumerConcurrentNextCalls() { + async function* source() { + const enc = new TextEncoder(); + yield [enc.encode('first')]; + yield [enc.encode('second')]; + } + + const shared = share(source()); + const it = shared.pull()[Symbol.asyncIterator](); + const first = it.next(); + const second = it.next(); + + const [r1, r2] = await Promise.all([first, second]); + const dec = new TextDecoder(); + assert.strictEqual(dec.decode(r1.value[0]), 'first'); + assert.strictEqual(dec.decode(r2.value[0]), 'second'); +} + +// share() accepts string source directly (normalized via from()) +async function testShareStringSource() { + const shared = share('hello-share'); + const result = await text(shared.pull()); + assert.strictEqual(result, 'hello-share'); +} + +Promise.all([ + testBasicShare(), + testShareMultipleConsumers(), + testShareConsumerCount(), + testShareCancel(), + testShareCancelMidIteration(), + testShareCancelWithReason(), + testShareAbortSignal(), + testShareAbortSignalWhileSourcePullPending(), + testSharePullAbortSignalRejectsPendingNext(), + testShareAlreadyAborted(), + testShareSourceError(), + testShareLateJoiningConsumer(), + testShareConsumerBreak(), + testShareMultipleConsumersConcurrentPull(), + testShareConsumerConcurrentNextCalls(), + testShareStringSource(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-share-coverage.js b/test/parallel/test-stream-iter-share-coverage.js new file mode 100644 index 000000000000..48866e61deab --- /dev/null +++ b/test/parallel/test-stream-iter-share-coverage.js @@ -0,0 +1,128 @@ +// Flags: --experimental-stream-iter +'use strict'; + +// Coverage tests for share.js: protocol happy path, dispose, throw, +// non-Error source throws. + +const common = require('../common'); +const assert = require('assert'); +const { + Share, + SyncShare, + share, + shareSync, + shareProtocol, + shareSyncProtocol, + from, + fromSync, + text, + textSync, +} = require('stream/iter'); + +// Share.from — protocol symbol happy path (returns valid share object) +async function testShareProtocolHappyPath() { + const obj = { + [shareProtocol](options) { + return share(from('protocol-data'), options); + }, + }; + const shared = Share.from(obj); + const result = await text(shared.pull()); + assert.strictEqual(result, 'protocol-data'); +} + +// SyncShare.fromSync — protocol symbol happy path +async function testSyncShareProtocolHappyPath() { + const obj = { + [shareSyncProtocol](options) { + return shareSync(fromSync('sync-protocol'), options); + }, + }; + const shared = SyncShare.fromSync(obj); + const result = textSync(shared.pull()); + assert.strictEqual(result, 'sync-protocol'); +} + +// Async share — Symbol.dispose cancels +async function testShareDispose() { + const shared = share(from('dispose-test')); + const consumer = shared.pull(); + shared[Symbol.dispose](); + assert.strictEqual(shared.consumerCount, 0); + // Consumer should yield nothing (cancelled before read) + const result = await text(consumer); + assert.strictEqual(result, ''); +} + +// Sync share — Symbol.dispose cancels +async function testSyncShareDispose() { + const shared = shareSync(fromSync('sync-dispose')); + const consumer = shared.pull(); + shared[Symbol.dispose](); + assert.strictEqual(shared.consumerCount, 0); + const result = textSync(consumer); + assert.strictEqual(result, ''); +} + +// Async consumer iterator throw() +async function testAsyncIteratorThrow() { + const shared = share(from('throw-test')); + const consumer = shared.pull(); + const iter = consumer[Symbol.asyncIterator](); + const first = await iter.next(); + assert.strictEqual(first.done, false); + const result = await iter.throw(new Error('test-throw')); + assert.strictEqual(result.done, true); + assert.strictEqual(shared.consumerCount, 0); +} + +// Sync consumer iterator throw() +async function testSyncIteratorThrow() { + const shared = shareSync(fromSync('throw-sync')); + const consumer = shared.pull(); + const iter = consumer[Symbol.iterator](); + const first = iter.next(); + assert.strictEqual(first.done, false); + const result = iter.throw(new Error('test-throw')); + assert.strictEqual(result.done, true); + assert.strictEqual(shared.consumerCount, 0); +} + +// Async source throws non-Error value → wrapError +async function testShareSourceThrowsNonError() { + async function* source() { + yield [new TextEncoder().encode('ok')]; + throw 'not an error'; // eslint-disable-line no-throw-literal + } + const shared = share(source()); + const consumer = shared.pull(); + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const batch of consumer) { /* consume */ } + }, { code: 'ERR_OPERATION_FAILED' }); +} + +// Sync source throws non-Error value → wrapError +async function testSyncShareSourceThrowsNonError() { + function* source() { + yield [new TextEncoder().encode('ok')]; + throw 42; // eslint-disable-line no-throw-literal + } + const shared = shareSync(source()); + const consumer = shared.pull(); + assert.throws(() => { + // eslint-disable-next-line no-unused-vars + for (const batch of consumer) { /* consume */ } + }, { code: 'ERR_OPERATION_FAILED' }); +} + +Promise.all([ + testShareProtocolHappyPath(), + testSyncShareProtocolHappyPath(), + testShareDispose(), + testSyncShareDispose(), + testAsyncIteratorThrow(), + testSyncIteratorThrow(), + testShareSourceThrowsNonError(), + testSyncShareSourceThrowsNonError(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-share-from.js b/test/parallel/test-stream-iter-share-from.js new file mode 100644 index 000000000000..0b7e22ee5cee --- /dev/null +++ b/test/parallel/test-stream-iter-share-from.js @@ -0,0 +1,246 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { + from, + fromSync, + share, + Share, + SyncShare, + text, + textSync, + +} = require('stream/iter'); + +// ============================================================================= +// Share.from +// ============================================================================= + +async function testShareFrom() { + const shared = Share.from(from('share-from')); + const consumer = shared.pull(); + + const data = await text(consumer); + assert.strictEqual(data, 'share-from'); +} + +function testShareFromRejectsNonStreamable() { + assert.throws( + () => Share.from(12345), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +// ============================================================================= +// SyncShare.fromSync +// ============================================================================= + +async function testSyncShareFromSync() { + const shared = SyncShare.fromSync(fromSync('sync-share-from')); + const consumer = shared.pull(); + + const data = textSync(consumer); + assert.strictEqual(data, 'sync-share-from'); +} + +function testSyncShareFromRejectsNonStreamable() { + assert.throws( + () => SyncShare.fromSync(12345), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +// ============================================================================= +// Protocol validation +// ============================================================================= + +function testShareProtocolReturnsNull() { + const obj = { + [Symbol.for('Stream.shareProtocol')]() { return null; }, + }; + assert.throws( + () => Share.from(obj), + { code: 'ERR_INVALID_RETURN_VALUE' }, + ); +} + +function testShareProtocolReturnsNonObject() { + const obj = { + [Symbol.for('Stream.shareProtocol')]() { return 42; }, + }; + assert.throws( + () => Share.from(obj), + { code: 'ERR_INVALID_RETURN_VALUE' }, + ); +} + +function testSyncShareProtocolReturnsNull() { + const obj = { + [Symbol.for('Stream.shareSyncProtocol')]() { return null; }, + }; + assert.throws( + () => SyncShare.fromSync(obj), + { code: 'ERR_INVALID_RETURN_VALUE' }, + ); +} + +function testSyncShareProtocolReturnsNonObject() { + const obj = { + [Symbol.for('Stream.shareSyncProtocol')]() { return 'bad'; }, + }; + assert.throws( + () => SyncShare.fromSync(obj), + { code: 'ERR_INVALID_RETURN_VALUE' }, + ); +} + +// ============================================================================= +// Unbounded backpressure: two consumers, slow consumer blocks the source +// ============================================================================= + +async function testShareBlockBackpressure() { + // A source that yields 5 items. With two consumers and budget: 16384, + // the fast consumer drives the source forward. The slow consumer holds back + // trimming, causing the buffer to fill. 'unbounded' mode should stall the + // source pull until the slow consumer catches up. + const enc = new TextEncoder(); + async function* source() { + for (let i = 0; i < 5; i++) { + yield [enc.encode(`item${i}`)]; + } + } + const shared = share(source(), { budget: 16384, backpressure: 'unbounded' }); + const fast = shared.pull(); + const slow = shared.pull(); + + // Both consumers should ultimately receive all 5 items + const [fastData, slowData] = await Promise.all([ + text(fast), + text(slow), + ]); + + assert.strictEqual(fastData, 'item0item1item2item3item4'); + assert.strictEqual(slowData, 'item0item1item2item3item4'); +} + +// ============================================================================= +// Drop backpressure modes: use a fast + stalled consumer to trigger drops +// ============================================================================= + +async function testShareDropOldest() { + // Two consumers, fast reads eagerly then slow reads. With drop-oldest, + // the slow consumer's cursor is advanced past dropped items, so it + // misses old data and only sees recent items. + async function* source() { + for (let i = 0; i < 4; i++) { + const chunk = new Uint8Array(16384); + chunk[0] = i; // Tag first byte with index + yield [chunk]; + } + } + const shared = share(source(), { budget: 32768, backpressure: 'drop-oldest' }); + const fast = shared.pull(); + const slow = shared.pull(); + + // Fast consumer reads all items + const fastIndices = []; + for await (const batch of fast) { + for (const chunk of batch) { + fastIndices.push(chunk[0]); + } + } + assert.strictEqual(fastIndices.length, 4); + + // Slow consumer reads after fast is done — old items were dropped + const slowIndices = []; + for await (const batch of slow) { + for (const chunk of batch) { + slowIndices.push(chunk[0]); + } + } + // The slow consumer should see fewer items than were produced + assert.ok(slowIndices.length < 4, + `Expected < 4 items after drop-oldest, got ${slowIndices.length}`); + assert.ok(slowIndices.length > 0, + 'Expected at least some items after drop-oldest'); + // The last item should always be present (most recent items kept) + assert.strictEqual(slowIndices[slowIndices.length - 1], 3); +} + +async function testShareDropNewest() { + // With drop-newest and a stalled consumer, the async path allows the + // buffer to grow beyond budget (the "drop" applies to the + // backpressure signal, not the buffer contents). Both consumers + // ultimately see all items. + async function* source() { + for (let i = 0; i < 4; i++) { + const chunk = new Uint8Array(16384); + chunk[0] = i; + yield [chunk]; + } + } + const shared = share(source(), { budget: 32768, backpressure: 'drop-newest' }); + const fast = shared.pull(); + const slow = shared.pull(); + + // Fast consumer reads all items + const fastIndices = []; + for await (const batch of fast) { + for (const chunk of batch) { + fastIndices.push(chunk[0]); + } + } + assert.strictEqual(fastIndices.length, 2); + + // Slow consumer also sees all items (buffer grew past budget) + const slowIndices = []; + for await (const batch of slow) { + for (const chunk of batch) { + slowIndices.push(chunk[0]); + } + } + assert.strictEqual(slowIndices.length, 2); + assert.strictEqual(slowIndices[0], 0); + assert.strictEqual(slowIndices[1], 1); +} + +// ============================================================================= +// Strict backpressure: should throw when buffer overflows +// ============================================================================= + +async function testShareStrictBackpressure() { + async function* source() { + for (let i = 0; i < 10; i++) { + yield [new Uint8Array(16384)]; + } + } + const shared = share(source(), { budget: 32768, backpressure: 'strict' }); + const fast = shared.pull(); + // Create a second consumer that never reads — this prevents buffer trimming + shared.pull(); + + // The fast consumer's pulls will eventually cause the buffer to exceed + // the budget (since the slow consumer prevents trimming), + // triggering an ERR_OUT_OF_RANGE error. + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const _ of fast) { /* consume */ } + }, { code: 'ERR_OUT_OF_RANGE' }); +} + +Promise.all([ + testShareFrom(), + testShareFromRejectsNonStreamable(), + testSyncShareFromSync(), + testSyncShareFromRejectsNonStreamable(), + testShareProtocolReturnsNull(), + testShareProtocolReturnsNonObject(), + testSyncShareProtocolReturnsNull(), + testSyncShareProtocolReturnsNonObject(), + testShareBlockBackpressure(), + testShareDropOldest(), + testShareDropNewest(), + testShareStrictBackpressure(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-share-sync.js b/test/parallel/test-stream-iter-share-sync.js new file mode 100644 index 000000000000..2b0b1944a7ff --- /dev/null +++ b/test/parallel/test-stream-iter-share-sync.js @@ -0,0 +1,162 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { + shareSync, + fromSync, + textSync, + +} = require('stream/iter'); + +// ============================================================================= +// Sync share +// ============================================================================= + +async function testShareSyncBasic() { + const shared = shareSync(fromSync('sync shared')); + + const consumer = shared.pull(); + const data = textSync(consumer); + assert.strictEqual(data, 'sync shared'); +} + +async function testShareSyncMultipleConsumers() { + const enc = new TextEncoder(); + function* gen() { + yield [enc.encode('a')]; + yield [enc.encode('b')]; + yield [enc.encode('c')]; + } + + const shared = shareSync(gen(), { budget: 16384 }); + + const c1 = shared.pull(); + const c2 = shared.pull(); + + const data1 = textSync(c1); + const data2 = textSync(c2); + + assert.strictEqual(data1, 'abc'); + assert.strictEqual(data2, 'abc'); +} + +function testShareSyncCancel() { + // Verify that cancel() on a pre-iteration share yields nothing + const shared = shareSync(fromSync('data')); + const consumer = shared.pull(); + + shared.cancel(); + assert.strictEqual(shared.consumerCount, 0); + + const batches = []; + for (const batch of consumer) { + batches.push(batch); + } + assert.strictEqual(batches.length, 0); +} + +function testShareSyncCancelMidIteration() { + // Verify cancel during iteration stops data flow and cleans up + const enc = new TextEncoder(); + let sourceReturnCalled = false; + function* gen() { + try { + yield [enc.encode('a')]; + yield [enc.encode('b')]; + yield [enc.encode('c')]; + } finally { + sourceReturnCalled = true; + } + } + const shared = shareSync(gen(), { budget: 16384 }); + const consumer = shared.pull(); + + const items = []; + for (const batch of consumer) { + for (const chunk of batch) { + items.push(new TextDecoder().decode(chunk)); + } + // Cancel after first batch + shared.cancel(); + } + assert.strictEqual(items.length, 1); + assert.strictEqual(items[0], 'a'); + assert.strictEqual(sourceReturnCalled, true); +} + +function testShareSyncCancelWithReason() { + // When cancel(reason) is called, a consumer that hasn't started + // iterating is already detached, so it sees done:true (not the error). + // But a consumer that is mid-iteration when another consumer cancels + // with a reason will see the error on the next pull after cancel. + const enc = new TextEncoder(); + function* gen() { + yield [enc.encode('a')]; + yield [enc.encode('b')]; + yield [enc.encode('c')]; + } + const shared = shareSync(gen(), { budget: 16384 }); + const c1 = shared.pull(); + const c2 = shared.pull(); + + // c1 reads one item, then c2 cancels with a reason + const iter1 = c1[Symbol.iterator](); + const first = iter1.next(); + assert.strictEqual(first.done, false); + + shared.cancel(new Error('sync cancel reason')); + + // c1 was already iterating, it's now detached → done + const next = iter1.next(); + assert.strictEqual(next.done, true); + + // c2 never started, also detached → done (not error) + const batches = []; + for (const batch of c2) { + batches.push(batch); + } + assert.strictEqual(batches.length, 0); +} + +// ============================================================================= +// Source error propagation +// ============================================================================= + +function testShareSyncSourceError() { + function* failingSource() { + yield [new TextEncoder().encode('ok')]; + throw new Error('sync share boom'); + } + const shared = shareSync(failingSource()); + const c1 = shared.pull(); + const c2 = shared.pull(); + + // Both consumers should see the error + assert.throws(() => { + // eslint-disable-next-line no-unused-vars + for (const _ of c1) { /* consume */ } + }, { message: 'sync share boom' }); + assert.throws(() => { + // eslint-disable-next-line no-unused-vars + for (const _ of c2) { /* consume */ } + }, { message: 'sync share boom' }); +} + +// shareSync() accepts string source directly (normalized via fromSync()) +function testShareSyncStringSource() { + const shared = shareSync('hello-sync-share'); + const result = textSync(shared.pull()); + assert.strictEqual(result, 'hello-sync-share'); +} + +Promise.all([ + testShareSyncBasic(), + testShareSyncMultipleConsumers(), + testShareSyncCancel(), + testShareSyncCancelMidIteration(), + testShareSyncCancelWithReason(), + testShareSyncSourceError(), + testShareSyncStringSource(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-sharedarraybuffer.js b/test/parallel/test-stream-iter-sharedarraybuffer.js new file mode 100644 index 000000000000..de0f8d6f3fc6 --- /dev/null +++ b/test/parallel/test-stream-iter-sharedarraybuffer.js @@ -0,0 +1,197 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { + from, + fromSync, + bytes, + bytesSync, + text, + textSync, + arrayBuffer, + arrayBufferSync, + pipeTo, + pipeToSync, + pull, + pullSync, +} = require('stream/iter'); + +// ============================================================================= +// from() / fromSync() with SharedArrayBuffer +// ============================================================================= + +function testFromSyncSAB() { + const sab = new SharedArrayBuffer(4); + new Uint8Array(sab).set([10, 20, 30, 40]); + const batches = []; + for (const batch of fromSync(sab)) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.deepStrictEqual(batches[0][0], new Uint8Array([10, 20, 30, 40])); +} + +async function testFromAsyncSAB() { + const sab = new SharedArrayBuffer(4); + new Uint8Array(sab).set([10, 20, 30, 40]); + const batches = []; + for await (const batch of from(sab)) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.deepStrictEqual(batches[0][0], new Uint8Array([10, 20, 30, 40])); +} + +// ============================================================================= +// Consumers with SAB-backed source +// ============================================================================= + +function testBytesSyncSAB() { + const sab = new SharedArrayBuffer(5); + new Uint8Array(sab).set([104, 101, 108, 108, 111]); // 'hello' + const data = bytesSync(fromSync(sab)); + assert.ok(data.buffer instanceof ArrayBuffer); + assert.deepStrictEqual(data, new Uint8Array([104, 101, 108, 108, 111])); +} + +async function testBytesAsyncSAB() { + const sab = new SharedArrayBuffer(5); + new Uint8Array(sab).set([104, 101, 108, 108, 111]); // 'hello' + const data = await bytes(from(sab)); + assert.ok(data.buffer instanceof ArrayBuffer); + assert.deepStrictEqual(data, new Uint8Array([104, 101, 108, 108, 111])); +} + +function testTextSyncSAB() { + const sab = new SharedArrayBuffer(5); + new Uint8Array(sab).set([104, 101, 108, 108, 111]); // 'hello' + const result = textSync(fromSync(sab)); + assert.strictEqual(result, 'hello'); +} + +async function testTextAsyncSAB() { + const sab = new SharedArrayBuffer(5); + new Uint8Array(sab).set([104, 101, 108, 108, 111]); // 'hello' + const result = await text(from(sab)); + assert.strictEqual(result, 'hello'); +} + +function testArrayBufferSyncSAB() { + const sab = new SharedArrayBuffer(4); + new Uint8Array(sab).set([1, 2, 3, 4]); + const result = arrayBufferSync(fromSync(sab)); + assert.ok(result instanceof ArrayBuffer); + assert.deepStrictEqual(new Uint8Array(result), new Uint8Array([1, 2, 3, 4])); +} + +async function testArrayBufferAsyncSAB() { + const sab = new SharedArrayBuffer(4); + new Uint8Array(sab).set([1, 2, 3, 4]); + const result = await arrayBuffer(from(sab)); + assert.ok(result instanceof ArrayBuffer); + assert.deepStrictEqual(new Uint8Array(result), new Uint8Array([1, 2, 3, 4])); +} + +// ============================================================================= +// pipeTo / pipeToSync with SAB source +// ============================================================================= + +function testPipeToSyncSAB() { + const sab = new SharedArrayBuffer(3); + new Uint8Array(sab).set([65, 66, 67]); // 'ABC' + const written = []; + const writer = { + writeSync(chunk) { written.push(chunk); return true; }, + endSync() { return written.length; }, + }; + const totalBytes = pipeToSync(fromSync(sab), writer); + assert.strictEqual(totalBytes, 3); + assert.deepStrictEqual(written[0], new Uint8Array([65, 66, 67])); +} + +async function testPipeToAsyncSAB() { + const sab = new SharedArrayBuffer(3); + new Uint8Array(sab).set([65, 66, 67]); // 'ABC' + const written = []; + const writer = { + async write(chunk) { written.push(chunk); }, + async end() { return written.length; }, + }; + await pipeTo(from(sab), writer); + assert.deepStrictEqual(written[0], new Uint8Array([65, 66, 67])); +} + +// ============================================================================= +// pull / pullSync with SAB-yielding generator +// ============================================================================= + +function testPullSyncSABChunks() { + function* gen() { + const sab = new SharedArrayBuffer(2); + new Uint8Array(sab).set([1, 2]); + yield [new Uint8Array(sab)]; + } + const batches = []; + for (const batch of pullSync(gen())) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.deepStrictEqual(batches[0][0], new Uint8Array([1, 2])); +} + +async function testPullAsyncSABChunks() { + async function* gen() { + const sab = new SharedArrayBuffer(2); + new Uint8Array(sab).set([3, 4]); + yield [new Uint8Array(sab)]; + } + const batches = []; + for await (const batch of pull(gen())) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.deepStrictEqual(batches[0][0], new Uint8Array([3, 4])); +} + +// ============================================================================= +// Transform returning SAB +// ============================================================================= + +async function testTransformReturningSAB() { + function* source() { + yield [new Uint8Array([1, 2, 3])]; + } + const transform = (chunks) => { + if (chunks === null) return null; + // Transform returns a Uint8Array backed by a SharedArrayBuffer + const sab = new SharedArrayBuffer(chunks[0].length); + new Uint8Array(sab).set(chunks[0]); + return new Uint8Array(sab); + }; + const batches = []; + for await (const batch of pull(source(), transform)) { + batches.push(batch); + } + assert.strictEqual(batches.length, 1); + assert.deepStrictEqual(batches[0][0], new Uint8Array([1, 2, 3])); +} + +// ============================================================================= + +Promise.all([ + testFromSyncSAB(), + testFromAsyncSAB(), + testBytesSyncSAB(), + testBytesAsyncSAB(), + testTextSyncSAB(), + testTextAsyncSAB(), + testArrayBufferSyncSAB(), + testArrayBufferAsyncSAB(), + testPipeToSyncSAB(), + testPipeToAsyncSAB(), + testPullSyncSABChunks(), + testPullAsyncSABChunks(), + testTransformReturningSAB(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-to-readable.js b/test/parallel/test-stream-iter-to-readable.js new file mode 100644 index 000000000000..3fb77e777e32 --- /dev/null +++ b/test/parallel/test-stream-iter-to-readable.js @@ -0,0 +1,634 @@ +// Flags: --experimental-stream-iter +'use strict'; + +// Tests for toReadable() and toReadableSync() which create byte-mode +// Readable streams from stream/iter sources. + +const common = require('../common'); +const assert = require('assert'); +const { Writable } = require('stream'); +const { + from, + fromSync, + pull, + text, + toReadable, + toReadableSync, +} = require('stream/iter'); + +function collect(readable) { + return new Promise((resolve, reject) => { + const chunks = []; + readable.on('data', (chunk) => chunks.push(chunk)); + readable.on('end', () => resolve(Buffer.concat(chunks))); + readable.on('error', reject); + }); +} + +// ============================================================================= +// fromStreamIter: basic async round-trip +// ============================================================================= + +async function testBasicAsync() { + const source = from('hello world'); + const readable = toReadable(source); + + assert.strictEqual(readable.readableObjectMode, false); + + const result = await collect(readable); + assert.strictEqual(result.toString(), 'hello world'); +} + +// ============================================================================= +// fromStreamIter: multiple batches, all chunks arrive in order +// ============================================================================= + +async function testMultiBatchAsync() { + async function* gen() { + for (let i = 0; i < 5; i++) { + const batch = []; + for (let j = 0; j < 3; j++) { + batch.push(Buffer.from(`${i}-${j} `)); + } + yield batch; + } + } + + const readable = toReadable(gen()); + const result = await collect(readable); + assert.strictEqual(result.toString(), + '0-0 0-1 0-2 1-0 1-1 1-2 2-0 2-1 2-2 3-0 3-1 3-2 4-0 4-1 4-2 '); +} + +// ============================================================================= +// fromStreamIter: backpressure with small highWaterMark +// ============================================================================= + +async function testBackpressureAsync() { + let batchCount = 0; + async function* gen() { + for (let i = 0; i < 10; i++) { + batchCount++; + yield [Buffer.from(`chunk${i}`)]; + } + } + + const readable = toReadable(gen(), { highWaterMark: 1 }); + + // Read one chunk at a time with delays to exercise backpressure + const chunks = []; + for await (const chunk of readable) { + chunks.push(chunk); + } + + assert.strictEqual(chunks.length, 10); + assert.strictEqual(batchCount, 10); +} + +// ============================================================================= +// fromStreamIter: source error mid-stream +// ============================================================================= + +async function testErrorAsync() { + async function* gen() { + yield [Buffer.from('ok')]; + throw new Error('source failed'); + } + + const readable = toReadable(gen()); + + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const chunk of readable) { + // Consume until error + } + }, { message: 'source failed' }); +} + +// ============================================================================= +// fromStreamIter: empty source +// ============================================================================= + +async function testEmptyAsync() { + async function* gen() { + // yields nothing + } + + const readable = toReadable(gen()); + const result = await collect(readable); + assert.strictEqual(result.length, 0); +} + +// ============================================================================= +// fromStreamIter: empty batches are skipped +// ============================================================================= + +async function testEmptyBatchAsync() { + async function* gen() { + yield []; + yield [Buffer.from('real data')]; + yield []; + } + + const readable = toReadable(gen()); + const result = await collect(readable); + assert.strictEqual(result.toString(), 'real data'); +} + +// ============================================================================= +// fromStreamIter: destroy mid-stream cleans up iterator +// ============================================================================= + +async function testDestroyAsync() { + let returnCalled = false; + async function* gen() { + try { + for (let i = 0; ; i++) { + yield [Buffer.from(`chunk${i}`)]; + } + } finally { + returnCalled = true; + } + } + + const readable = toReadable(gen()); + + // Read a couple chunks then destroy + const chunks = []; + await new Promise((resolve, reject) => { + readable.on('data', (chunk) => { + chunks.push(chunk); + if (chunks.length >= 3) { + readable.destroy(); + } + }); + readable.on('close', resolve); + readable.on('error', reject); + }); + + assert.ok(chunks.length >= 3); + assert.ok(returnCalled, 'iterator.return() should have been called'); +} + +// ============================================================================= +// fromStreamIter: destroy while pump is waiting on backpressure +// ============================================================================= + +async function testDestroyDuringBackpressure() { + let returnCalled = false; + async function* gen() { + try { + // Yield a large batch that will trigger backpressure with HWM=1 + yield [Buffer.from('a'), Buffer.from('b'), Buffer.from('c')]; + // This should never be reached + yield [Buffer.from('d')]; + } finally { + returnCalled = true; + } + } + + const readable = toReadable(gen(), { highWaterMark: 1 }); + + // Read one chunk to start the pump, then destroy while it's waiting + const chunk = await new Promise((resolve) => { + readable.once('readable', () => resolve(readable.read())); + }); + assert.ok(chunk); + + // The pump should be waiting on backpressure now. Destroy the stream. + readable.destroy(); + + await new Promise((resolve) => readable.on('close', resolve)); + assert.ok(readable.destroyed); + assert.ok(returnCalled, 'iterator.return() should have been called'); +} + +// ============================================================================= +// fromStreamIter: large data integrity +// ============================================================================= + +async function testLargeDataAsync() { + const totalSize = 1024 * 1024; // 1 MB + const chunkSize = 16384; + + async function* gen() { + let remaining = totalSize; + while (remaining > 0) { + const size = Math.min(chunkSize, remaining); + yield [Buffer.alloc(size, 0x42)]; // Fill with 'B' + remaining -= size; + } + } + + const readable = toReadable(gen()); + const result = await collect(readable); + assert.strictEqual(result.length, totalSize); + assert.strictEqual(result[0], 0x42); + assert.strictEqual(result[totalSize - 1], 0x42); +} + +// ============================================================================= +// fromStreamIter: pipe to Writable +// ============================================================================= + +async function testPipeAsync() { + const source = from('pipe test data'); + const readable = toReadable(source); + + const chunks = []; + const writable = new Writable({ + write(chunk, enc, cb) { + chunks.push(chunk); + cb(); + }, + }); + + await new Promise((resolve, reject) => { + readable.pipe(writable); + writable.on('finish', resolve); + writable.on('error', reject); + }); + + assert.strictEqual(Buffer.concat(chunks).toString(), 'pipe test data'); +} + +// ============================================================================= +// fromStreamIter: not object mode +// ============================================================================= + +function testNotObjectMode() { + async function* gen() { yield [Buffer.from('x')]; } + const readable = toReadable(gen()); + assert.strictEqual(readable.readableObjectMode, false); +} + +// ============================================================================= +// fromStreamIter: invalid source throws +// ============================================================================= + +function testInvalidSourceAsync() { + assert.throws(() => toReadable(42), + { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => toReadable('not iterable'), + { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => toReadable(null), + { code: 'ERR_INVALID_ARG_TYPE' }); +} + +// ============================================================================= +// fromStreamIter: signal aborts the readable +// ============================================================================= + +async function testSignalAsync() { + async function* gen() { + for (let i = 0; ; i++) { + yield [Buffer.from(`chunk${i}`)]; + } + } + + const ac = new AbortController(); + const readable = toReadable(gen(), { signal: ac.signal }); + + const chunks = []; + await assert.rejects(async () => { + for await (const chunk of readable) { + chunks.push(chunk); + if (chunks.length >= 3) { + ac.abort(); + } + } + }, { name: 'AbortError' }); + assert.ok(chunks.length >= 3); + assert.ok(readable.destroyed); +} + +// ============================================================================= +// fromStreamIter: signal already aborted +// ============================================================================= + +async function testSignalAlreadyAborted() { + async function* gen() { + yield [Buffer.from('should not reach')]; + } + + const readable = toReadable(gen(), { signal: AbortSignal.abort() }); + + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const chunk of readable) { + // Should not receive any data + } + }, { name: 'AbortError' }); + assert.ok(readable.destroyed); +} + +// ============================================================================= +// fromStreamIter: options validation +// ============================================================================= + +function testOptionsValidationAsync() { + async function* gen() { yield [Buffer.from('x')]; } + + // Options must be an object + assert.throws(() => toReadable(gen(), 'bad'), + { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => toReadable(gen(), 42), + { code: 'ERR_INVALID_ARG_TYPE' }); + + // highWaterMark must be a non-negative integer + assert.throws(() => toReadable(gen(), { highWaterMark: -1 }), + { code: 'ERR_OUT_OF_RANGE' }); + assert.throws(() => toReadable(gen(), { highWaterMark: 'big' }), + { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => toReadable(gen(), { highWaterMark: 1.5 }), + { code: 'ERR_OUT_OF_RANGE' }); + + // Signal must be an AbortSignal + assert.throws(() => toReadable(gen(), { signal: 'not a signal' }), + { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => toReadable(gen(), { signal: 42 }), + { code: 'ERR_INVALID_ARG_TYPE' }); + + // Valid options should work + const r = toReadable(gen(), { highWaterMark: 0 }); + assert.strictEqual(r.readableHighWaterMark, 0); + r.destroy(); + + // Default highWaterMark should be 16KB + const r2 = toReadable(gen()); + assert.strictEqual(r2.readableHighWaterMark, 64 * 1024); + r2.destroy(); + + // Explicit undefined options should work (uses defaults) + const r3 = toReadable(gen(), undefined); + assert.strictEqual(r3.readableHighWaterMark, 64 * 1024); + r3.destroy(); +} + +// ============================================================================= +// fromStreamIter: with stream/iter transform +// ============================================================================= + +async function testWithTransformAsync() { + // Uppercase transform + function upper(chunks) { + if (chunks === null) return null; + return chunks.map((c) => { + const buf = Buffer.from(c); + for (let i = 0; i < buf.length; i++) { + if (buf[i] >= 97 && buf[i] <= 122) buf[i] -= 32; + } + return buf; + }); + } + + const source = pull(from('hello world'), upper); + const readable = toReadable(source); + const result = await collect(readable); + assert.strictEqual(result.toString(), 'HELLO WORLD'); +} + +// ============================================================================= +// fromStreamIterSync: basic sync round-trip +// ============================================================================= + +async function testBasicSync() { + const source = fromSync('sync hello'); + const readable = toReadableSync(source); + + assert.strictEqual(readable.readableObjectMode, false); + + const result = await collect(readable); + assert.strictEqual(result.toString(), 'sync hello'); +} + +// ============================================================================= +// fromStreamIterSync: synchronous read() returns data immediately +// ============================================================================= + +function testSyncRead() { + const source = fromSync('immediate'); + const readable = toReadableSync(source); + + // Synchronous read should return data right away + const chunk = readable.read(); + assert.ok(Buffer.isBuffer(chunk)); + assert.strictEqual(chunk.toString(), 'immediate'); +} + +// ============================================================================= +// fromStreamIterSync: backpressure with small highWaterMark +// ============================================================================= + +async function testBackpressureSync() { + function* gen() { + for (let i = 0; i < 10; i++) { + yield [Buffer.from(`s${i}`)]; + } + } + + const readable = toReadableSync(gen(), { highWaterMark: 1 }); + + const chunks = []; + for await (const chunk of readable) { + chunks.push(chunk); + } + + assert.strictEqual(chunks.length, 9); +} + +// ============================================================================= +// fromStreamIterSync: backpressure within a batch +// ============================================================================= + +async function testBackpressureSyncMultiChunkBatch() { + function* gen() { + yield [Buffer.from('a'), Buffer.from('b'), Buffer.from('c')]; + } + + const readable = toReadableSync(gen(), { highWaterMark: 1 }); + const result = await collect(readable); + + assert.strictEqual(result.toString(), 'abc'); +} + +// ============================================================================= +// fromStreamIterSync: source error +// ============================================================================= + +async function testErrorSync() { + function* gen() { + yield [Buffer.from('ok')]; + throw new Error('sync source failed'); + } + + const readable = toReadableSync(gen()); + + await assert.rejects(async () => { + // eslint-disable-next-line no-unused-vars + for await (const chunk of readable) { + // Consume until error + } + }, { message: 'sync source failed' }); +} + +// ============================================================================= +// fromStreamIterSync: empty source +// ============================================================================= + +function testEmptySync() { + function* gen() { + // yields nothing + } + + const readable = toReadableSync(gen()); + const result = readable.read(); + assert.strictEqual(result, null); +} + +// ============================================================================= +// fromStreamIterSync: destroy calls iterator.return() +// ============================================================================= + +async function testDestroySync() { + let returnCalled = false; + function* gen() { + try { + for (let i = 0; ; i++) { + yield [Buffer.from(`chunk${i}`)]; + } + } finally { + returnCalled = true; + } + } + + const readable = toReadableSync(gen()); + readable.read(); // Start iteration + readable.destroy(); + + await new Promise((resolve) => readable.on('close', resolve)); + assert.ok(returnCalled, 'iterator.return() should have been called'); +} + +// ============================================================================= +// fromStreamIterSync: not object mode +// ============================================================================= + +function testNotObjectModeSync() { + function* gen() { yield [Buffer.from('x')]; } + const readable = toReadableSync(gen()); + assert.strictEqual(readable.readableObjectMode, false); +} + +// ============================================================================= +// fromStreamIterSync: invalid source throws +// ============================================================================= + +function testInvalidSourceSync() { + assert.throws(() => toReadableSync(42), + { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => toReadableSync(null), + { code: 'ERR_INVALID_ARG_TYPE' }); +} + +// ============================================================================= +// fromStreamIterSync: options validation +// ============================================================================= + +function testOptionsValidationSync() { + function* gen() { yield [Buffer.from('x')]; } + + // Options must be an object + assert.throws(() => toReadableSync(gen(), 'bad'), + { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => toReadableSync(gen(), 42), + { code: 'ERR_INVALID_ARG_TYPE' }); + + // highWaterMark must be a non-negative integer + assert.throws(() => toReadableSync(gen(), { highWaterMark: -1 }), + { code: 'ERR_OUT_OF_RANGE' }); + assert.throws(() => toReadableSync(gen(), { highWaterMark: 'big' }), + { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => toReadableSync(gen(), { highWaterMark: 1.5 }), + { code: 'ERR_OUT_OF_RANGE' }); + + // Valid options should work + const r = toReadableSync(gen(), { highWaterMark: 0 }); + assert.strictEqual(r.readableHighWaterMark, 0); + r.destroy(); + + // Default highWaterMark should be 16KB + const r2 = toReadableSync(gen()); + assert.strictEqual(r2.readableHighWaterMark, 64 * 1024); + r2.destroy(); +} + +// ============================================================================= +// Round-trip: stream/iter -> Readable -> stream/iter +// ============================================================================= + +async function testRoundTrip() { + const original = 'round trip data test'; + + // stream/iter -> classic Readable + const source = from(original); + const readable = toReadable(source); + + // classic Readable -> stream/iter (via toAsyncStreamable) + const result = await text(from(readable)); + assert.strictEqual(result, original); +} + +// ============================================================================= +// Round-trip with compression +// ============================================================================= + +async function testRoundTripWithCompression() { + const { compressGzip, decompressGzip } = require('zlib/iter'); + + const original = 'compress through classic readable'; + + // Compress via stream/iter, bridge to classic Readable + const compressed = pull(from(original), compressGzip()); + const readable = toReadable(compressed); + + // Classic Readable back to stream/iter for decompression + const result = await text(pull(from(readable), decompressGzip())); + assert.strictEqual(result, original); +} + +// ============================================================================= +// Run all tests +// ============================================================================= + +testNotObjectMode(); +testNotObjectModeSync(); +testSyncRead(); +testEmptySync(); +testInvalidSourceAsync(); +testInvalidSourceSync(); +testOptionsValidationAsync(); +testOptionsValidationSync(); + +Promise.all([ + testBasicAsync(), + testMultiBatchAsync(), + testBackpressureAsync(), + testErrorAsync(), + testEmptyAsync(), + testEmptyBatchAsync(), + testDestroyAsync(), + testDestroyDuringBackpressure(), + testSignalAsync(), + testSignalAlreadyAborted(), + testLargeDataAsync(), + testPipeAsync(), + testWithTransformAsync(), + testBasicSync(), + testBackpressureSync(), + testBackpressureSyncMultiChunkBatch(), + testErrorSync(), + testDestroySync(), + testRoundTrip(), + testRoundTripWithCompression(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-transform-compat.js b/test/parallel/test-stream-iter-transform-compat.js new file mode 100644 index 000000000000..b3180f41d98f --- /dev/null +++ b/test/parallel/test-stream-iter-transform-compat.js @@ -0,0 +1,127 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const zlib = require('zlib'); +const { promisify } = require('util'); +const { + from, + pull, + bytes, + text, +} = require('stream/iter'); +const { + compressGzip, + compressDeflate, + compressBrotli, + compressZstd, + decompressGzip, + decompressDeflate, + decompressBrotli, + decompressZstd, +} = require('zlib/iter'); + +// ============================================================================= +// Cross-compatibility: verify gzip/deflate output is compatible with zlib +// ============================================================================= + +async function testGzipCompatWithZlib() { + const gunzip = promisify(zlib.gunzip); + + const input = 'Cross-compat test with node:zlib. '.repeat(100); + const compressed = await bytes(pull(from(input), compressGzip())); + + // Decompress with standard zlib + const decompressed = await gunzip(compressed); + assert.strictEqual(decompressed.toString(), input); +} + +async function testDeflateCompatWithZlib() { + const inflate = promisify(zlib.inflate); + + const input = 'Cross-compat deflate test. '.repeat(100); + const compressed = await bytes(pull(from(input), compressDeflate())); + + // Decompress with standard zlib + const decompressed = await inflate(compressed); + assert.strictEqual(decompressed.toString(), input); +} + +async function testBrotliCompatWithZlib() { + const brotliDecompress = promisify(zlib.brotliDecompress); + + const input = 'Cross-compat brotli test. '.repeat(100); + const compressed = await bytes(pull(from(input), compressBrotli())); + + const decompressed = await brotliDecompress(compressed); + assert.strictEqual(decompressed.toString(), input); +} + +async function testZstdCompatWithZlib() { + const zstdDecompress = promisify(zlib.zstdDecompress); + + const input = 'Cross-compat zstd test. '.repeat(100); + const compressed = await bytes(pull(from(input), compressZstd())); + + const decompressed = await zstdDecompress(compressed); + assert.strictEqual(decompressed.toString(), input); +} + +// ============================================================================= +// Reverse compat: compress with zlib, decompress with new streams +// ============================================================================= + +async function testZlibGzipToNewStreams() { + const gzip = promisify(zlib.gzip); + + const input = 'Reverse compat gzip test. '.repeat(100); + const compressed = await gzip(input); + const result = await text(pull(from(compressed), decompressGzip())); + assert.strictEqual(result, input); +} + +async function testZlibDeflateToNewStreams() { + const deflate = promisify(zlib.deflate); + + const input = 'Reverse compat deflate test. '.repeat(100); + const compressed = await deflate(input); + const result = await text(pull(from(compressed), decompressDeflate())); + assert.strictEqual(result, input); +} + +async function testZlibBrotliToNewStreams() { + const brotliCompress = promisify(zlib.brotliCompress); + + const input = 'Reverse compat brotli test. '.repeat(100); + const compressed = await brotliCompress(input); + const result = await text(pull(from(compressed), decompressBrotli())); + assert.strictEqual(result, input); +} + +async function testZlibZstdToNewStreams() { + const zstdCompress = promisify(zlib.zstdCompress); + + const input = 'Reverse compat zstd test. '.repeat(100); + const compressed = await zstdCompress(input); + const result = await text(pull(from(compressed), decompressZstd())); + assert.strictEqual(result, input); +} + +// ============================================================================= +// Run all tests +// ============================================================================= + +(async () => { + // Cross-compat: new streams compress → zlib decompress + await testGzipCompatWithZlib(); + await testDeflateCompatWithZlib(); + await testBrotliCompatWithZlib(); + await testZstdCompatWithZlib(); + + // Reverse compat: zlib compress → new streams decompress + await testZlibGzipToNewStreams(); + await testZlibDeflateToNewStreams(); + await testZlibBrotliToNewStreams(); + await testZlibZstdToNewStreams(); +})().then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-transform-coverage.js b/test/parallel/test-stream-iter-transform-coverage.js new file mode 100644 index 000000000000..d10766badd4d --- /dev/null +++ b/test/parallel/test-stream-iter-transform-coverage.js @@ -0,0 +1,119 @@ +// Flags: --experimental-stream-iter +'use strict'; + +// Coverage tests for transform.js: abort cleanup, strategy/params options, +// early consumer exit triggering finally block. + +const common = require('../common'); +const assert = require('assert'); +const { + from, + pull, + bytes, + text, +} = require('stream/iter'); +const { + compressGzip, + decompressGzip, + compressDeflate, + decompressDeflate, + compressBrotli, + decompressBrotli, + compressZstd, + decompressZstd, +} = require('zlib/iter'); +const { constants } = require('zlib'); + +async function roundTrip(input, compress, decompress) { + return text(pull(from(input), compress, decompress)); +} + +// Abort mid-compression triggers finally cleanup +async function testAbortMidCompression() { + const ac = new AbortController(); + const largeInput = 'x'.repeat(100_000); + const compressed = pull(from(largeInput), compressGzip(), + { signal: ac.signal }); + const iter = compressed[Symbol.asyncIterator](); + + // Read one batch then abort + const first = await iter.next(); + assert.strictEqual(first.done, false); + ac.abort(); + await assert.rejects(iter.next(), { name: 'AbortError' }); +} + +// Early consumer exit (break from for-await) triggers finally +async function testEarlyConsumerExit() { + const largeInput = 'y'.repeat(100_000); + const compressed = pull(from(largeInput), compressGzip()); + + // eslint-disable-next-line no-unused-vars + for await (const batch of compressed) { + break; // Early exit — should trigger finally block cleanup + } + // If we get here without hanging or crashing, cleanup worked +} + +// Gzip with explicit strategy option +async function testGzipWithStrategy() { + const input = 'strategy test data '.repeat(100); + const c = compressGzip({ strategy: constants.Z_DEFAULT_STRATEGY }); + const result = await roundTrip(input, c, decompressGzip()); + assert.strictEqual(result, input); +} + +// Deflate with Z_FIXED strategy +async function testDeflateWithFixedStrategy() { + const input = 'fixed strategy '.repeat(100); + const c = compressDeflate({ strategy: constants.Z_FIXED }); + const result = await roundTrip(input, c, decompressDeflate()); + assert.strictEqual(result, input); +} + +// Brotli with custom quality param +async function testBrotliWithParams() { + const input = 'brotli params test '.repeat(100); + const params = { [constants.BROTLI_PARAM_QUALITY]: 5 }; + const result = await roundTrip(input, compressBrotli({ params }), + decompressBrotli()); + assert.strictEqual(result, input); +} + +// Zstd with custom compression level param +async function testZstdWithParams() { + const input = 'zstd params test '.repeat(100); + const params = { [constants.ZSTD_c_compressionLevel]: 10 }; + const result = await roundTrip(input, compressZstd({ params }), + decompressZstd()); + assert.strictEqual(result, input); +} + +// Gzip with custom chunkSize +async function testGzipWithChunkSize() { + const input = 'chunk size test'; + const c = compressGzip({ chunkSize: 256 }); + const d = decompressGzip({ chunkSize: 256 }); + const result = await roundTrip(input, c, d); + assert.strictEqual(result, input); +} + +// Invalid chunkSize throws when transform is invoked +async function testInvalidChunkSize() { + const tx = compressGzip({ chunkSize: 8 }); + await assert.rejects( + async () => await bytes(pull(from('data'), tx)), + { code: 'ERR_OUT_OF_RANGE' }, + ); +} + +Promise.all([ + testAbortMidCompression(), + testEarlyConsumerExit(), + testGzipWithStrategy(), + testDeflateWithFixedStrategy(), + testBrotliWithParams(), + testZstdWithParams(), + testGzipWithChunkSize(), + testInvalidChunkSize(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-transform-errors.js b/test/parallel/test-stream-iter-transform-errors.js new file mode 100644 index 000000000000..62a3c178ac5f --- /dev/null +++ b/test/parallel/test-stream-iter-transform-errors.js @@ -0,0 +1,71 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { + from, + pull, + bytes, +} = require('stream/iter'); +const { + decompressGzip, + decompressDeflate, + decompressBrotli, + decompressZstd, +} = require('zlib/iter'); + +// ============================================================================= +// Decompression of corrupt data +// ============================================================================= + +async function testCorruptGzipData() { + const corrupt = new Uint8Array([0x1F, 0x8B, 0xFF, 0xFF, 0xFF]); + + await assert.rejects( + async () => await bytes(pull(from(corrupt), decompressGzip())), { + name: 'Error', + code: 'Z_DATA_ERROR', + }); +} + +async function testCorruptDeflateData() { + const corrupt = new Uint8Array([0x78, 0xFF, 0xFF, 0xFF]); + + await assert.rejects( + async () => await bytes(pull(from(corrupt), decompressDeflate())), { + name: 'Error', + code: 'Z_DATA_ERROR', + }); +} + +async function testCorruptBrotliData() { + const corrupt = new Uint8Array([0xFF, 0xFF, 0xFF, 0xFF]); + + await assert.rejects( + async () => await bytes(pull(from(corrupt), decompressBrotli())), { + name: 'Error', + code: 'ERR__ERROR_FORMAT_PADDING_2', + }); +} + +async function testCorruptZstdData() { + // Completely invalid data (not even valid magic bytes) + const corrupt = new Uint8Array([0xFF, 0xFF, 0xFF, 0xFF, 0xFF]); + await assert.rejects( + async () => await bytes(pull(from(corrupt), decompressZstd())), { + name: 'Error', + code: 'ZSTD_error_prefix_unknown', + }); +} + +// ============================================================================= +// Run all tests +// ============================================================================= + +(async () => { + await testCorruptGzipData(); + await testCorruptDeflateData(); + await testCorruptBrotliData(); + await testCorruptZstdData(); +})().then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-transform-output.js b/test/parallel/test-stream-iter-transform-output.js new file mode 100644 index 000000000000..d66a20f6e164 --- /dev/null +++ b/test/parallel/test-stream-iter-transform-output.js @@ -0,0 +1,249 @@ +// Flags: --experimental-stream-iter +'use strict'; + +// Tests for transform output normalization edge cases: +// ArrayBuffer, ArrayBufferView, iterables, strings, invalid types. + +const common = require('../common'); +const assert = require('assert'); +const { + pull, + pullSync, + bytes, + bytesSync, + from, + fromSync, +} = require('stream/iter'); + +// Stateless transform returns ArrayBuffer (async) +async function testTransformReturnsArrayBuffer() { + const tx = (chunks) => { + if (chunks === null) return null; + const ab = new ArrayBuffer(chunks[0].length); + new Uint8Array(ab).set(chunks[0]); + return ab; + }; + const data = await bytes(pull(from('AB'), tx)); + assert.deepStrictEqual(data, new TextEncoder().encode('AB')); +} + +// Stateless transform returns ArrayBuffer (sync) +async function testSyncTransformReturnsArrayBuffer() { + const tx = (chunks) => { + if (chunks === null) return null; + const ab = new ArrayBuffer(chunks[0].length); + new Uint8Array(ab).set(chunks[0]); + return ab; + }; + const data = bytesSync(pullSync(fromSync('AB'), tx)); + assert.deepStrictEqual(data, new TextEncoder().encode('AB')); +} + +// Stateless transform returns Float32Array (non-Uint8Array ArrayBufferView) +async function testTransformReturnsFloat32Array() { + const tx = (chunks) => { + if (chunks === null) return null; + return new Float32Array([1.0]); + }; + const data = await bytes(pull(from('x'), tx)); + assert.strictEqual(data.byteLength, 4); // 1 float32 = 4 bytes +} + +// Stateless sync transform returns Float32Array +async function testSyncTransformReturnsFloat32Array() { + const tx = (chunks) => { + if (chunks === null) return null; + return new Float32Array([1.0]); + }; + const data = bytesSync(pullSync(fromSync('x'), tx)); + assert.strictEqual(data.byteLength, 4); +} + +// Stateless transform returns a sync generator (iterable) +async function testTransformReturnsGenerator() { + const tx = (chunks) => { + if (chunks === null) return null; + return (function*() { + yield new Uint8Array([65]); + yield new Uint8Array([66]); + })(); + }; + const data = await bytes(pull(from('x'), tx)); + assert.deepStrictEqual(data, new Uint8Array([65, 66])); +} + +// Stateless sync transform returns a generator +async function testSyncTransformReturnsGenerator() { + const tx = (chunks) => { + if (chunks === null) return null; + return (function*() { + yield new Uint8Array([67]); + yield new Uint8Array([68]); + })(); + }; + const data = bytesSync(pullSync(fromSync('x'), tx)); + assert.deepStrictEqual(data, new Uint8Array([67, 68])); +} + +// Stateless async transform returns an async generator +async function testTransformReturnsAsyncGenerator() { + const tx = (chunks) => { + if (chunks === null) return null; + return (async function*() { + yield new Uint8Array([69]); + yield new Uint8Array([70]); + })(); + }; + const data = await bytes(pull(from('x'), tx)); + assert.deepStrictEqual(data, new Uint8Array([69, 70])); +} + +// Stateful async transform yields string +async function testStatefulTransformYieldsString() { + const tx = { + async *transform(source) { + for await (const chunks of source) { + if (chunks === null) return; + yield 'hello'; + } + }, + }; + const data = await bytes(pull(from('x'), tx)); + assert.deepStrictEqual(data, new TextEncoder().encode('hello')); +} + +// Stateful async transform yields ArrayBuffer +async function testStatefulTransformYieldsArrayBuffer() { + const tx = { + async *transform(source) { + for await (const chunks of source) { + if (chunks === null) return; + const ab = new ArrayBuffer(2); + new Uint8Array(ab).set([71, 72]); + yield ab; + } + }, + }; + const data = await bytes(pull(from('x'), tx)); + assert.deepStrictEqual(data, new Uint8Array([71, 72])); +} + +// Stateful sync transform yields string +async function testStatefulSyncTransformYieldsString() { + const tx = { + *transform(source) { + for (const chunks of source) { + if (chunks === null) return; + yield 'world'; + } + }, + }; + const data = bytesSync(pullSync(fromSync('x'), tx)); + assert.deepStrictEqual(data, new TextEncoder().encode('world')); +} + +// Stateful async transform yields null (no output) +async function testStatefulTransformYieldsNull() { + const tx = { + async *transform() { + yield null; + }, + }; + const data = await bytes(pull(from('x'), tx)); + assert.deepStrictEqual(data, new Uint8Array()); +} + +// Stateful sync transform yields null (no output) +async function testStatefulSyncTransformYieldsNull() { + const tx = { + *transform() { + yield null; + }, + }; + const data = bytesSync(pullSync(fromSync('x'), tx)); + assert.deepStrictEqual(data, new Uint8Array()); +} + +// Flush returns single Uint8Array (not batch) +async function testFlushReturnsSingleUint8Array() { + const tx = (chunks) => { + if (chunks === null) return new Uint8Array([99]); // Flush returns single + return chunks; + }; + const data = await bytes(pull(from('x'), tx)); + // Should contain both the original data and the flush byte + assert.ok(data.includes(99)); +} + +// Flush returns string +async function testFlushReturnsString() { + const tx = (chunks) => { + if (chunks === null) return 'trailer'; + return chunks; + }; + const data = await bytes(pull(from('x'), tx)); + const trailer = new TextEncoder().encode('trailer'); + // Last bytes should be the trailer + const tail = data.slice(data.length - trailer.length); + assert.deepStrictEqual(tail, trailer); +} + +// Sync flush returns single Uint8Array +async function testSyncFlushReturnsSingleUint8Array() { + const tx = (chunks) => { + if (chunks === null) return new Uint8Array([88]); + return chunks; + }; + const data = bytesSync(pullSync(fromSync('x'), tx)); + assert.ok(data.includes(88)); +} + +// Transform returns invalid type → ERR_INVALID_ARG_TYPE +async function testTransformReturnsInvalidType() { + const tx = (chunks) => { + if (chunks === null) return null; + return 42; // Invalid + }; + await assert.rejects( + async () => { + // eslint-disable-next-line no-unused-vars + for await (const batch of pull(from('x'), tx)) { /* consume */ } + }, + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +// Sync transform returns invalid type → ERR_INVALID_ARG_TYPE +async function testSyncTransformReturnsInvalidType() { + const tx = (chunks) => { + if (chunks === null) return null; + return 42; + }; + assert.throws( + () => { + // eslint-disable-next-line no-unused-vars + for (const batch of pullSync(fromSync('x'), tx)) { /* consume */ } + }, + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +Promise.all([ + testTransformReturnsArrayBuffer(), + testSyncTransformReturnsArrayBuffer(), + testTransformReturnsFloat32Array(), + testSyncTransformReturnsFloat32Array(), + testTransformReturnsGenerator(), + testSyncTransformReturnsGenerator(), + testTransformReturnsAsyncGenerator(), + testStatefulTransformYieldsString(), + testStatefulTransformYieldsArrayBuffer(), + testStatefulSyncTransformYieldsString(), + testStatefulTransformYieldsNull(), + testStatefulSyncTransformYieldsNull(), + testFlushReturnsSingleUint8Array(), + testFlushReturnsString(), + testSyncFlushReturnsSingleUint8Array(), + testTransformReturnsInvalidType(), + testSyncTransformReturnsInvalidType(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-transform-roundtrip.js b/test/parallel/test-stream-iter-transform-roundtrip.js new file mode 100644 index 000000000000..df63483d6c85 --- /dev/null +++ b/test/parallel/test-stream-iter-transform-roundtrip.js @@ -0,0 +1,291 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { + from, + pull, + bytes, + text, +} = require('stream/iter'); +const { + compressGzip, + compressDeflate, + compressBrotli, + compressZstd, + decompressGzip, + decompressDeflate, + decompressBrotli, + decompressZstd, +} = require('zlib/iter'); + +// ============================================================================= +// Helper: compress then decompress, verify round-trip equality +// ============================================================================= + +async function roundTrip(input, compress, decompress) { + return text(pull(pull(from(input), compress), decompress)); +} + +async function roundTripBytes(inputBuf, compress, decompress) { + return bytes(pull(pull(from(inputBuf), compress), decompress)); +} + +// ============================================================================= +// Gzip round-trip tests +// ============================================================================= + +async function testGzipRoundTrip() { + const input = 'Hello, gzip compression!'; + const result = await roundTrip(input, compressGzip(), decompressGzip()); + assert.strictEqual(result, input); +} + +async function testGzipLargeData() { + // 100KB of repeated text - exercises multi-chunk path + const input = 'gzip large data test. '.repeat(5000); + const result = await roundTrip(input, compressGzip(), decompressGzip()); + assert.strictEqual(result, input); +} + +async function testGzipActuallyCompresses() { + const input = 'Repeated data compresses well. '.repeat(1000); + const inputBuf = Buffer.from(input); + const source = from(inputBuf); + const compressed = await bytes(pull(source, compressGzip())); + assert.ok(compressed.byteLength < inputBuf.byteLength, + `Compressed ${compressed.byteLength} should be < original ${inputBuf.byteLength}`); +} + +// ============================================================================= +// Deflate round-trip tests +// ============================================================================= + +async function testDeflateRoundTrip() { + const input = 'Hello, deflate compression!'; + const result = await roundTrip(input, compressDeflate(), decompressDeflate()); + assert.strictEqual(result, input); +} + +async function testDeflateLargeData() { + const input = 'deflate large data test. '.repeat(5000); + const result = await roundTrip(input, compressDeflate(), decompressDeflate()); + assert.strictEqual(result, input); +} + +async function testDeflateActuallyCompresses() { + const input = 'Repeated data compresses well. '.repeat(1000); + const inputBuf = Buffer.from(input); + const source = from(inputBuf); + const compressed = await bytes(pull(source, compressDeflate())); + assert.ok(compressed.byteLength < inputBuf.byteLength, + `Compressed ${compressed.byteLength} should be < original ${inputBuf.byteLength}`); +} + +// ============================================================================= +// Brotli round-trip tests +// ============================================================================= + +async function testBrotliRoundTrip() { + const input = 'Hello, brotli compression!'; + const result = await roundTrip(input, compressBrotli(), decompressBrotli()); + assert.strictEqual(result, input); +} + +async function testBrotliLargeData() { + const input = 'brotli large data test. '.repeat(5000); + const result = await roundTrip(input, compressBrotli(), decompressBrotli()); + assert.strictEqual(result, input); +} + +async function testBrotliActuallyCompresses() { + const input = 'Repeated data compresses well. '.repeat(1000); + const inputBuf = Buffer.from(input); + const compressed = await bytes(pull(from(inputBuf), compressBrotli())); + assert.ok(compressed.byteLength < inputBuf.byteLength, + `Compressed ${compressed.byteLength} should be < original ${inputBuf.byteLength}`); +} + +// ============================================================================= +// Zstd round-trip tests +// ============================================================================= + +async function testZstdRoundTrip() { + const input = 'Hello, zstd compression!'; + const result = await roundTrip(input, compressZstd(), decompressZstd()); + assert.strictEqual(result, input); +} + +async function testZstdLargeData() { + const input = 'zstd large data test. '.repeat(5000); + const result = await roundTrip(input, compressZstd(), decompressZstd()); + assert.strictEqual(result, input); +} + +async function testZstdActuallyCompresses() { + const input = 'Repeated data compresses well. '.repeat(1000); + const inputBuf = Buffer.from(input); + const compressed = await bytes(pull(from(inputBuf), compressZstd())); + assert.ok(compressed.byteLength < inputBuf.byteLength, + `Compressed ${compressed.byteLength} should be < original ${inputBuf.byteLength}`); +} + +// ============================================================================= +// Binary data round-trip - verify no corruption on non-text data +// ============================================================================= + +// Create a buffer with a repeating byte pattern covering all 256 values. +function makeBinaryTestData(size = 1024) { + const buf = Buffer.alloc(size); + for (let i = 0; i < size; i++) buf[i] = i & 0xFF; + return buf; +} + +async function testBinaryRoundTripGzip() { + const input = makeBinaryTestData(); + const result = await roundTripBytes(input, compressGzip(), decompressGzip()); + assert.strictEqual(result.byteLength, input.byteLength); + assert.deepStrictEqual(Buffer.from(result), input); +} + +async function testBinaryRoundTripDeflate() { + const input = makeBinaryTestData(); + const result = await roundTripBytes(input, compressDeflate(), + decompressDeflate()); + assert.strictEqual(result.byteLength, input.byteLength); + assert.deepStrictEqual(Buffer.from(result), input); +} + +async function testBinaryRoundTripBrotli() { + const input = makeBinaryTestData(); + const result = await roundTripBytes(input, compressBrotli(), + decompressBrotli()); + assert.strictEqual(result.byteLength, input.byteLength); + assert.deepStrictEqual(Buffer.from(result), input); +} + +async function testBinaryRoundTripZstd() { + const input = makeBinaryTestData(); + const result = await roundTripBytes(input, compressZstd(), decompressZstd()); + assert.strictEqual(result.byteLength, input.byteLength); + assert.deepStrictEqual(Buffer.from(result), input); +} + +// ============================================================================= +// Empty input +// ============================================================================= + +async function testEmptyInputGzip() { + const result = await roundTrip('', compressGzip(), decompressGzip()); + assert.strictEqual(result, ''); +} + +async function testEmptyInputDeflate() { + const result = await roundTrip('', compressDeflate(), decompressDeflate()); + assert.strictEqual(result, ''); +} + +async function testEmptyInputBrotli() { + const result = await roundTrip('', compressBrotli(), decompressBrotli()); + assert.strictEqual(result, ''); +} + +async function testEmptyInputZstd() { + const result = await roundTrip('', compressZstd(), decompressZstd()); + assert.strictEqual(result, ''); +} + +// ============================================================================= +// Chained transforms - compress with one, then another, decompress in reverse +// ============================================================================= + +async function testChainedGzipDeflate() { + const input = 'Double compression test data. '.repeat(100); + // Compress: gzip then deflate + const compressed = pull(pull(from(input), compressGzip()), compressDeflate()); + // Decompress: deflate then gzip (reverse order) + const decompressed = pull(pull(compressed, decompressDeflate()), + decompressGzip()); + const result = await text(decompressed); + assert.strictEqual(result, input); +} + +// ============================================================================= +// Transform protocol: verify each factory returns a proper transform object +// ============================================================================= + +function testTransformProtocol() { + [ + compressGzip, compressDeflate, compressBrotli, compressZstd, + decompressGzip, decompressDeflate, decompressBrotli, decompressZstd, + ].forEach((factory) => { + const t = factory(); + assert.strictEqual(typeof t.transform, 'function', + `${factory.name}() should have a transform function`); + }); +} + +// ============================================================================= +// Compression with options +// ============================================================================= + +async function testGzipWithLevel() { + const data = 'a'.repeat(10000); + const level1 = await bytes(pull(from(data), compressGzip({ level: 1 }))); + const level9 = await bytes(pull(from(data), compressGzip({ level: 9 }))); + // Higher compression level should produce smaller output + assert.ok(level9.length <= level1.length); + // Both should decompress to original + const dec1 = await text(pull(from(level1), decompressGzip())); + const dec9 = await text(pull(from(level9), decompressGzip())); + assert.strictEqual(dec1, data); + assert.strictEqual(dec9, data); +} + +// ============================================================================= +// Run all tests +// ============================================================================= + +(async () => { + // Gzip + await testGzipRoundTrip(); + await testGzipLargeData(); + await testGzipActuallyCompresses(); + + // Deflate + await testDeflateRoundTrip(); + await testDeflateLargeData(); + await testDeflateActuallyCompresses(); + + // Brotli + await testBrotliRoundTrip(); + await testBrotliLargeData(); + await testBrotliActuallyCompresses(); + + // Zstd + await testZstdRoundTrip(); + await testZstdLargeData(); + await testZstdActuallyCompresses(); + + // Binary data + await testBinaryRoundTripGzip(); + await testBinaryRoundTripDeflate(); + await testBinaryRoundTripBrotli(); + await testBinaryRoundTripZstd(); + + // Empty input + await testEmptyInputGzip(); + await testEmptyInputDeflate(); + await testEmptyInputBrotli(); + await testEmptyInputZstd(); + + // Chained + await testChainedGzipDeflate(); + + // Protocol + testTransformProtocol(); + + // Compression with options + await testGzipWithLevel(); +})().then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-transform-sync.js b/test/parallel/test-stream-iter-transform-sync.js new file mode 100644 index 000000000000..d674c26cca10 --- /dev/null +++ b/test/parallel/test-stream-iter-transform-sync.js @@ -0,0 +1,227 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { + fromSync, + pullSync, + bytesSync, + textSync, +} = require('stream/iter'); +const { + compressGzipSync, + compressDeflateSync, + compressBrotliSync, + compressZstdSync, + decompressGzipSync, + decompressDeflateSync, + decompressBrotliSync, + decompressZstdSync, +} = require('zlib/iter'); + +// ============================================================================= +// Helper: sync compress then decompress, verify round-trip equality +// ============================================================================= + +function roundTrip(input, compress, decompress) { + return textSync(pullSync(pullSync(fromSync(input), compress), decompress)); +} + +function roundTripBytes(inputBuf, compress, decompress) { + return bytesSync(pullSync(pullSync(fromSync(inputBuf), compress), decompress)); +} + +// ============================================================================= +// Gzip sync round-trip tests +// ============================================================================= + +function testGzipRoundTrip() { + const input = 'Hello, sync gzip compression!'; + const result = roundTrip(input, compressGzipSync(), decompressGzipSync()); + assert.strictEqual(result, input); +} + +function testGzipLargeData() { + const input = 'gzip sync large data test. '.repeat(5000); + const result = roundTrip(input, compressGzipSync(), decompressGzipSync()); + assert.strictEqual(result, input); +} + +function testGzipActuallyCompresses() { + const input = 'Repeated data compresses well. '.repeat(1000); + const inputBuf = Buffer.from(input); + const compressed = bytesSync(pullSync(fromSync(inputBuf), + compressGzipSync())); + assert.ok(compressed.byteLength < inputBuf.byteLength, + `Compressed ${compressed.byteLength} should be < ` + + `original ${inputBuf.byteLength}`); +} + +function testGzipBinaryData() { + const inputBuf = Buffer.alloc(10000); + for (let i = 0; i < inputBuf.length; i++) inputBuf[i] = i & 0xff; + const result = roundTripBytes(inputBuf, compressGzipSync(), + decompressGzipSync()); + assert.deepStrictEqual(result, inputBuf); +} + +// ============================================================================= +// Deflate sync round-trip tests +// ============================================================================= + +function testDeflateRoundTrip() { + const input = 'Hello, sync deflate compression!'; + const result = roundTrip(input, compressDeflateSync(), + decompressDeflateSync()); + assert.strictEqual(result, input); +} + +function testDeflateLargeData() { + const input = 'deflate sync large data test. '.repeat(5000); + const result = roundTrip(input, compressDeflateSync(), + decompressDeflateSync()); + assert.strictEqual(result, input); +} + +// ============================================================================= +// Brotli sync round-trip tests +// ============================================================================= + +function testBrotliRoundTrip() { + const input = 'Hello, sync brotli compression!'; + const result = roundTrip(input, compressBrotliSync(), + decompressBrotliSync()); + assert.strictEqual(result, input); +} + +function testBrotliLargeData() { + const input = 'brotli sync large data test. '.repeat(5000); + const result = roundTrip(input, compressBrotliSync(), + decompressBrotliSync()); + assert.strictEqual(result, input); +} + +// ============================================================================= +// Zstd sync round-trip tests +// ============================================================================= + +function testZstdRoundTrip() { + const input = 'Hello, sync zstd compression!'; + const result = roundTrip(input, compressZstdSync(), decompressZstdSync()); + assert.strictEqual(result, input); +} + +function testZstdLargeData() { + const input = 'zstd sync large data test. '.repeat(5000); + const result = roundTrip(input, compressZstdSync(), decompressZstdSync()); + assert.strictEqual(result, input); +} + +// ============================================================================= +// Cross-algorithm: compress async-compatible, decompress sync (and vice versa) +// The sync transforms should produce output compatible with the standard format +// ============================================================================= + +function testGzipWithOptions() { + const input = 'options test data '.repeat(100); + const result = roundTrip(input, + compressGzipSync({ level: 1 }), + decompressGzipSync()); + assert.strictEqual(result, input); +} + +function testBrotliWithOptions() { + const zlib = require('zlib'); + const input = 'brotli options test data '.repeat(100); + const result = roundTrip(input, + compressBrotliSync({ + params: { + [zlib.constants.BROTLI_PARAM_QUALITY]: 3, + }, + }), + decompressBrotliSync()); + assert.strictEqual(result, input); +} + +// ============================================================================= +// Stateless + stateful sync transform pipeline +// ============================================================================= + +function testMixedStatelessAndStateful() { + // Uppercase stateless transform + gzip stateful transform + const upper = (chunks) => { + if (chunks === null) return null; + const out = new Array(chunks.length); + for (let j = 0; j < chunks.length; j++) { + const src = chunks[j]; + const buf = Buffer.allocUnsafe(src.length); + for (let i = 0; i < src.length; i++) { + const b = src[i]; + buf[i] = (b >= 0x61 && b <= 0x7a) ? b - 0x20 : b; + } + out[j] = buf; + } + return out; + }; + + const input = 'hello world '.repeat(100); + const result = textSync( + pullSync( + pullSync(fromSync(input), upper, compressGzipSync()), + decompressGzipSync(), + ), + ); + assert.strictEqual(result, input.toUpperCase()); +} + +// ============================================================================= +// Early consumer exit (break from for-of) triggers cleanup +// ============================================================================= + +function testEarlyExit() { + const input = 'y'.repeat(100_000); + const compressed = pullSync(fromSync(input), compressGzipSync()); + + // eslint-disable-next-line no-unused-vars + for (const batch of compressed) { + break; // Early exit - should trigger finally block cleanup + } + // If we get here without crashing, cleanup worked +} + +// ============================================================================= +// Empty input +// ============================================================================= + +function testEmptyInput() { + const result = textSync( + pullSync( + pullSync(fromSync(''), compressGzipSync()), + decompressGzipSync(), + ), + ); + assert.strictEqual(result, ''); +} + +// ============================================================================= +// Run all tests +// ============================================================================= + +testGzipRoundTrip(); +testGzipLargeData(); +testGzipActuallyCompresses(); +testGzipBinaryData(); +testDeflateRoundTrip(); +testDeflateLargeData(); +testBrotliRoundTrip(); +testBrotliLargeData(); +testZstdRoundTrip(); +testZstdLargeData(); +testGzipWithOptions(); +testBrotliWithOptions(); +testMixedStatelessAndStateful(); +testEarlyExit(); +testEmptyInput(); + +common.mustCall()(); diff --git a/test/parallel/test-stream-iter-validation.js b/test/parallel/test-stream-iter-validation.js new file mode 100644 index 000000000000..9f77fe330478 --- /dev/null +++ b/test/parallel/test-stream-iter-validation.js @@ -0,0 +1,411 @@ +// Flags: --experimental-stream-iter +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { Writable } = require('stream'); +const { + from, fromSync, pull, pullSync, pipeTo, fromWritable, + push, duplex, broadcast, Broadcast, share, shareSync, + Share, SyncShare, + bytes, bytesSync, text, textSync, + arrayBuffer, arrayBufferSync, array, arraySync, + tap, tapSync, +} = require('stream/iter'); +const { + compressGzip, compressBrotli, compressZstd, + decompressGzip, decompressBrotli, decompressZstd, +} = require('zlib/iter'); + +// ============================================================================= +// push() validation +// ============================================================================= + +// Budget must be integer >= 16384 +assert.throws(() => push({ budget: 'bad' }), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => push({ budget: 1.5 }), { code: 'ERR_OUT_OF_RANGE' }); +// Values < 16384 are rejected +assert.throws(() => push({ budget: 0 }), { code: 'ERR_OUT_OF_RANGE' }); +assert.throws(() => push({ budget: -1 }), { code: 'ERR_OUT_OF_RANGE' }); +assert.throws(() => push({ budget: -100 }), { code: 'ERR_OUT_OF_RANGE' }); +assert.throws(() => push({ budget: 16383 }), { code: 'ERR_OUT_OF_RANGE' }); +// 16384 is the minimum accepted value +assert.strictEqual(push({ budget: 16384 }).writer.canWrite, true); +// MAX_SAFE_INTEGER is accepted +assert.strictEqual(push({ budget: Number.MAX_SAFE_INTEGER }).writer.canWrite, + true); +// Values above MAX_SAFE_INTEGER are rejected by validateInteger +assert.throws(() => push({ budget: Number.MAX_SAFE_INTEGER + 1 }), + { code: 'ERR_OUT_OF_RANGE' }); + +// Signal must be AbortSignal +assert.throws(() => push({ signal: 'bad' }), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => push({ signal: {} }), { code: 'ERR_INVALID_ARG_TYPE' }); + +// Transforms must be functions or transform objects +assert.throws(() => push(42, {}), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => push('bad', {}), { code: 'ERR_INVALID_ARG_TYPE' }); + +// Writer options.signal must be AbortSignal +{ + const { writer } = push(); + const badOptions = { signal: 'bad' }; + assert.throws(() => writer.write('a', badOptions), + { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => writer.writev(['b'], badOptions), + { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => writer.end(badOptions), + { code: 'ERR_INVALID_ARG_TYPE' }); + writer.endSync(); +} + +// Writer.writev requires array +{ + const { writer } = push(); + assert.throws(() => writer.writev('bad'), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => writer.writev(42), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => writer.writevSync('bad'), { code: 'ERR_INVALID_ARG_TYPE' }); + writer.endSync(); +} + +// Writer.write rejects non-string/non-Uint8Array +{ + const { writer } = push(); + assert.throws(() => writer.writeSync(42), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => writer.writeSync({}), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => writer.writeSync(true), { code: 'ERR_INVALID_ARG_TYPE' }); + writer.endSync(); +} + +// ============================================================================= +// duplex() validation +// ============================================================================= + +assert.throws(() => duplex(42), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => duplex('bad'), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => duplex({ a: 42 }), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => duplex({ b: 'bad' }), { code: 'ERR_INVALID_ARG_TYPE' }); + +// Budget validation (cascades through to push()) +assert.throws(() => duplex({ budget: 'bad' }), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => duplex({ budget: 1.5 }), { code: 'ERR_OUT_OF_RANGE' }); +assert.throws(() => duplex({ budget: Number.MAX_SAFE_INTEGER + 1 }), + { code: 'ERR_OUT_OF_RANGE' }); + +// Values < 16384 are rejected (both directions) +assert.throws(() => duplex({ budget: 0 }), { code: 'ERR_OUT_OF_RANGE' }); +// MAX_SAFE_INTEGER is accepted +{ + const [a, b] = duplex({ budget: Number.MAX_SAFE_INTEGER }); + assert.strictEqual(a.writer.canWrite, true); + assert.strictEqual(b.writer.canWrite, true); + a.close(); + b.close(); +} +// Per-direction overrides +{ + const [a, b] = duplex({ a: { budget: 16384 }, b: { budget: 32768 } }); + assert.strictEqual(a.writer.canWrite, true); + assert.strictEqual(b.writer.canWrite, true); + a.close(); + b.close(); +} + +assert.throws(() => duplex({ signal: {} }), { code: 'ERR_INVALID_ARG_TYPE' }); + +// ============================================================================= +// pull() / pullSync() validation +// ============================================================================= + +// Signal must be AbortSignal +assert.throws(() => pull(from('a'), { signal: 'bad' }), { code: 'ERR_INVALID_ARG_TYPE' }); + +// Transforms must be functions or transform objects +assert.throws(() => pull(from('a'), 42), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => pull(from('a'), 'bad'), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => pullSync(fromSync('a'), 42), { code: 'ERR_INVALID_ARG_TYPE' }); + +// ============================================================================= +// broadcast() validation +// ============================================================================= + +assert.throws(() => broadcast({ budget: 'bad' }), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => broadcast({ budget: 1.5 }), { code: 'ERR_OUT_OF_RANGE' }); +assert.throws(() => broadcast({ budget: Number.MAX_SAFE_INTEGER + 1 }), + { code: 'ERR_OUT_OF_RANGE' }); + +// Values < 16384 are rejected +assert.throws(() => broadcast({ budget: 0 }), { code: 'ERR_OUT_OF_RANGE' }); +assert.throws(() => broadcast({ budget: -1 }), { code: 'ERR_OUT_OF_RANGE' }); +assert.throws(() => broadcast({ budget: 16383 }), { code: 'ERR_OUT_OF_RANGE' }); +// 16384 is the minimum accepted value +{ + const bc = broadcast({ budget: 16384 }); + bc.broadcast.push(); + assert.strictEqual(bc.writer.canWrite, true); + bc.writer.endSync(); +} +// MAX_SAFE_INTEGER is accepted +{ + const bc = broadcast({ budget: Number.MAX_SAFE_INTEGER }); + bc.broadcast.push(); + assert.strictEqual(bc.writer.canWrite, true); + bc.writer.endSync(); +} + +assert.throws(() => broadcast({ signal: {} }), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => broadcast({ backpressure: 'bad' }), { code: 'ERR_INVALID_ARG_VALUE' }); + +// BroadcastWriter options.signal must be AbortSignal +{ + const { writer } = broadcast(); + const badOptions = { signal: 'bad' }; + assert.throws(() => writer.write('a', badOptions), + { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => writer.writev(['b'], badOptions), + { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => writer.end(badOptions), + { code: 'ERR_INVALID_ARG_TYPE' }); + writer.endSync(); +} + +// BroadcastWriter.writev requires array +{ + const { writer } = broadcast(); + assert.throws(() => writer.writev('bad'), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => writer.writev(42), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => writer.writevSync('bad'), { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => writer.writevSync(42), { code: 'ERR_INVALID_ARG_TYPE' }); + writer.endSync(); +} + +// Broadcast.from rejects non-streamable input +assert.throws(() => Broadcast.from(42), { code: 'ERR_INVALID_ARG_TYPE' }); + +// fromWritable Writer options.signal must be AbortSignal +{ + const writable = new Writable({ + write(chunk, encoding, callback) { + callback(); + }, + }); + const writer = fromWritable(writable); + const badOptions = { signal: 'bad' }; + assert.throws(() => writer.write('a', badOptions), + { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => writer.writev(['b'], badOptions), + { code: 'ERR_INVALID_ARG_TYPE' }); + assert.throws(() => writer.end(badOptions), + { code: 'ERR_INVALID_ARG_TYPE' }); + writable.destroy(); +} + +// ============================================================================= +// share() / shareSync() validation +// ============================================================================= + +assert.throws(() => share(42), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => share(from('a'), { budget: 'bad' }), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => share(from('a'), { budget: 1.5 }), { code: 'ERR_OUT_OF_RANGE' }); +assert.throws(() => share(from('a'), { budget: Number.MAX_SAFE_INTEGER + 1 }), + { code: 'ERR_OUT_OF_RANGE' }); +assert.throws(() => share(from('a'), { signal: {} }), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => share(from('a'), { backpressure: 'bad' }), { code: 'ERR_INVALID_ARG_VALUE' }); + +// share() values < 16384 are rejected +assert.throws(() => share(from('a'), { budget: 0 }), { code: 'ERR_OUT_OF_RANGE' }); +assert.throws(() => share(from('a'), { budget: -1 }), { code: 'ERR_OUT_OF_RANGE' }); +// 16384 is the minimum, MAX_SAFE_INTEGER is accepted +share(from('a'), { budget: 16384 }).cancel(); +share(from('a'), { budget: Number.MAX_SAFE_INTEGER }).cancel(); + +assert.throws(() => shareSync(42), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => shareSync(fromSync('a'), { budget: 'bad' }), + { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => shareSync(fromSync('a'), { budget: 1.5 }), + { code: 'ERR_OUT_OF_RANGE' }); +assert.throws(() => shareSync(fromSync('a'), { budget: Number.MAX_SAFE_INTEGER + 1 }), + { code: 'ERR_OUT_OF_RANGE' }); + +// shareSync() values < 16384 are rejected +assert.throws(() => shareSync(fromSync('a'), { budget: 0 }), + { code: 'ERR_OUT_OF_RANGE' }); +assert.throws(() => shareSync(fromSync('a'), { budget: -1 }), + { code: 'ERR_OUT_OF_RANGE' }); +// 16384 is the minimum, MAX_SAFE_INTEGER is accepted +shareSync(fromSync('a'), { budget: 16384 }).cancel(); +shareSync(fromSync('a'), { budget: Number.MAX_SAFE_INTEGER }).cancel(); + +// Share.from / SyncShare.fromSync reject non-iterable +assert.throws(() => Share.from(42), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => SyncShare.fromSync(42), { code: 'ERR_INVALID_ARG_TYPE' }); + +// ============================================================================= +// Consumer validation (synchronous) +// ============================================================================= + +// tap / tapSync require function +assert.throws(() => tap(42), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => tap('bad'), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => tapSync(42), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => tapSync(null), { code: 'ERR_INVALID_ARG_TYPE' }); + +// Sync consumer options +assert.throws(() => bytesSync(fromSync('a'), { limit: 'bad' }), + { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => bytesSync(fromSync('a'), { limit: -1 }), + { code: 'ERR_OUT_OF_RANGE' }); +assert.throws(() => textSync(fromSync('a'), { encoding: 42 }), + { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => textSync(fromSync('a'), { encoding: 'bogus' }), + { code: 'ERR_INVALID_ARG_VALUE' }); +assert.throws(() => arrayBufferSync(fromSync('a'), { limit: 'bad' }), + { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => arraySync(fromSync('a'), { limit: -1 }), + { code: 'ERR_OUT_OF_RANGE' }); + +// Options must be object if provided +assert.throws(() => bytesSync(fromSync('a'), 42), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => textSync(fromSync('a'), 'bad'), { code: 'ERR_INVALID_ARG_TYPE' }); + +// Compression options must be object +assert.throws(() => compressGzip(42), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => decompressGzip('bad'), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => compressBrotli(42), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => decompressBrotli('bad'), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => compressZstd(42), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => decompressZstd('bad'), { code: 'ERR_INVALID_ARG_TYPE' }); + +// ============================================================================= +// Async consumer and compression validation +// ============================================================================= + +// Helper: consume a transform through a pipeline to trigger lazy validation. +const consume = (transform) => bytes(pull(from('test'), transform)); + +async function testAsyncValidation() { + // pipeTo signal + await assert.rejects( + () => pipeTo(from('a'), { write() {} }, { signal: 'bad' }), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); + + // Async consumer options + await assert.rejects( + () => bytes(from('a'), 42), { code: 'ERR_INVALID_ARG_TYPE' }); + await assert.rejects( + () => bytes(from('a'), { signal: 'bad' }), { code: 'ERR_INVALID_ARG_TYPE' }); + await assert.rejects( + () => bytes(from('a'), { limit: 'bad' }), { code: 'ERR_INVALID_ARG_TYPE' }); + await assert.rejects( + () => bytes(from('a'), { limit: -1 }), { code: 'ERR_OUT_OF_RANGE' }); + await assert.rejects( + () => text(from('a'), { encoding: 42 }), { code: 'ERR_INVALID_ARG_TYPE' }); + await assert.rejects( + () => text(from('a'), { encoding: 'not-a-real-encoding' }), + { code: 'ERR_INVALID_ARG_VALUE' }); + await assert.rejects( + () => arrayBuffer(from('a'), { limit: 'bad' }), + { code: 'ERR_INVALID_ARG_TYPE' }); + await assert.rejects( + () => array(from('a'), { limit: -1 }), { code: 'ERR_OUT_OF_RANGE' }); + + const TYPE = { code: 'ERR_INVALID_ARG_TYPE' }; + const RANGE = { code: 'ERR_OUT_OF_RANGE' }; + const BROTLI = { code: 'ERR_BROTLI_INVALID_PARAM' }; + const ZSTD = { code: 'ERR_ZSTD_INVALID_PARAM' }; + + // ChunkSize + await assert.rejects(consume(compressGzip({ chunkSize: 'bad' })), TYPE); + await assert.rejects(consume(compressGzip({ chunkSize: 0 })), RANGE); + await assert.rejects(consume(compressGzip({ chunkSize: 10 })), RANGE); + + // WindowBits + await assert.rejects(consume(compressGzip({ windowBits: 'bad' })), TYPE); + await assert.rejects(consume(compressGzip({ windowBits: 100 })), RANGE); + + // Level + await assert.rejects(consume(compressGzip({ level: 'bad' })), TYPE); + await assert.rejects(consume(compressGzip({ level: 100 })), RANGE); + + // MemLevel + await assert.rejects(consume(compressGzip({ memLevel: 'bad' })), TYPE); + await assert.rejects(consume(compressGzip({ memLevel: 100 })), RANGE); + + // Strategy + await assert.rejects(consume(compressGzip({ strategy: 'bad' })), TYPE); + await assert.rejects(consume(compressGzip({ strategy: 100 })), RANGE); + + // Dictionary + await assert.rejects(consume(compressGzip({ dictionary: 42 })), TYPE); + await assert.rejects(consume(compressGzip({ dictionary: 'bad' })), TYPE); + + // Brotli params + await assert.rejects(consume(compressBrotli({ params: 42 })), TYPE); + await assert.rejects(consume(compressBrotli({ params: { bad: 1 } })), BROTLI); + await assert.rejects(consume(compressBrotli({ params: { [-1]: 1 } })), BROTLI); + await assert.rejects(consume(compressBrotli({ params: { 0: 'bad' } })), TYPE); + + // Zstd params + await assert.rejects(consume(compressZstd({ params: 42 })), TYPE); + await assert.rejects(consume(compressZstd({ params: { bad: 1 } })), ZSTD); + await assert.rejects(consume(compressZstd({ params: { 0: 'bad' } })), TYPE); + + // Zstd pledgedSrcSize + await assert.rejects(consume(compressZstd({ pledgedSrcSize: 'bad' })), TYPE); + for (const pledgedSrcSize of [ + NaN, + Infinity, + -Infinity, + 1.9, + -1, + Number.MAX_SAFE_INTEGER + 1, + ]) { + await assert.rejects(consume(compressZstd({ pledgedSrcSize })), RANGE); + } +} + +// ============================================================================= +// Valid calls still work +// ============================================================================= + +// Push with valid options +{ + const { writer } = push({ budget: 16384 }); + writer.writeSync('hello'); + writer.endSync(); +} + +// Duplex with valid options +{ + const [a, b] = duplex({ budget: 16384 }); + a.close(); + b.close(); +} + +// Broadcast with valid options +{ + const { writer } = broadcast({ budget: 16384 }); + writer.endSync(); +} + +// Share with valid options +{ + const shared = share(from('hello'), { budget: 16384 }); + shared.cancel(); +} + +// Compression with valid options +{ + const transform = compressGzip({ chunkSize: 1024, level: 6 }); + assert.strictEqual(typeof transform.transform, 'function'); +} + +// Brotli with valid params +{ + const { constants: { BROTLI_PARAM_QUALITY } } = require('zlib'); + const transform = compressBrotli({ params: { [BROTLI_PARAM_QUALITY]: 5 } }); + assert.strictEqual(typeof transform.transform, 'function'); +} + +testAsyncValidation().then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-writable-from.js b/test/parallel/test-stream-iter-writable-from.js new file mode 100644 index 000000000000..46cfb627cb4a --- /dev/null +++ b/test/parallel/test-stream-iter-writable-from.js @@ -0,0 +1,643 @@ +// Flags: --experimental-stream-iter +'use strict'; + +// Tests for toWritable() - creating a classic stream.Writable +// backed by a stream/iter Writer. + +const common = require('../common'); +const assert = require('assert'); +const { + push, + text, + toWritable, +} = require('stream/iter'); + +// ============================================================================= +// Basic: write through fromStreamIter writable, read from readable +// ============================================================================= + +async function testBasicWrite() { + const { writer, readable } = push({ backpressure: 'unbounded' }); + const writable = toWritable(writer); + + writable.write('hello'); + writable.write(' world'); + writable.end(); + + const result = await text(readable); + assert.strictEqual(result, 'hello world'); +} + +// ============================================================================= +// _write delegates to writer.write() +// ============================================================================= + +async function testWriteDelegatesToWriter() { + const chunks = []; + // Create a minimal Writer that records writes. + const writer = { + write(chunk) { + chunks.push(Buffer.from(chunk)); + return Promise.resolve(); + }, + end() { return Promise.resolve(0); }, + fail() {}, + }; + + const writable = toWritable(writer); + + await new Promise((resolve, reject) => { + writable.write('hello', (err) => { + if (err) reject(err); + else resolve(); + }); + }); + + assert.strictEqual(Buffer.concat(chunks).toString(), 'hello'); +} + +// ============================================================================= +// _writev delegates to writer.writev() when available +// ============================================================================= + +async function testWritevDelegation() { + const batches = []; + const writer = { + write(chunk) { + return Promise.resolve(); + }, + writev(chunks) { + batches.push(chunks.map((c) => Buffer.from(c))); + return Promise.resolve(); + }, + writevSync(chunks) { + return false; + }, + end() { return Promise.resolve(0); }, + fail() {}, + }; + + const writable = toWritable(writer); + + // Cork to batch writes, then uncork to trigger _writev + writable.cork(); + writable.write('a'); + writable.write('b'); + writable.write('c'); + writable.uncork(); + + await new Promise((resolve) => writable.end(resolve)); + + // Writev should have been called with the batched chunks + assert.ok(batches.length > 0, 'writev should have been called'); +} + +// ============================================================================= +// _writev not defined when writer lacks writev +// ============================================================================= + +function testNoWritevWithoutWriterWritev() { + const writer = { + write(chunk) { return Promise.resolve(); }, + }; + + const writable = toWritable(writer); + // The _writev should be null (Writable default) when writer lacks writev + assert.strictEqual(writable._writev, null); +} + +// ============================================================================= +// Try-sync-first: writeSync is attempted before write +// ============================================================================= + +async function testWriteSyncFirst() { + let syncCalled = false; + let asyncCalled = false; + + const writer = { + writeSync(chunk) { + syncCalled = true; + return true; // Sync path accepted + }, + write(chunk) { + asyncCalled = true; + return Promise.resolve(); + }, + end() { return Promise.resolve(0); }, + fail() {}, + }; + + const writable = toWritable(writer); + + await new Promise((resolve) => { + writable.write('test', resolve); + }); + + assert.ok(syncCalled, 'writeSync should have been called'); + assert.ok(!asyncCalled, 'write should not have been called'); +} + +// ============================================================================= +// Try-sync-first: falls back to async when writeSync returns false +// ============================================================================= + +async function testWriteSyncFallback() { + let syncCalled = false; + let asyncCalled = false; + + const writer = { + writeSync(chunk) { + syncCalled = true; + return false; // Sync path rejected + }, + write(chunk) { + asyncCalled = true; + return Promise.resolve(); + }, + end() { return Promise.resolve(0); }, + fail() {}, + }; + + const writable = toWritable(writer); + + await new Promise((resolve) => { + writable.write('test', resolve); + }); + + assert.ok(syncCalled, 'writeSync should have been called'); + assert.ok(asyncCalled, 'write should have been called as fallback'); +} + +// ============================================================================= +// Try-sync-first: endSync attempted before end +// ============================================================================= + +async function testEndSyncFirst() { + let endSyncCalled = false; + let endAsyncCalled = false; + + const writer = { + write(chunk) { return Promise.resolve(); }, + endSync() { + endSyncCalled = true; + return 5; // Success, returns byte count + }, + end() { + endAsyncCalled = true; + return Promise.resolve(5); + }, + fail() {}, + }; + + const writable = toWritable(writer); + + await new Promise((resolve) => writable.end(resolve)); + + assert.ok(endSyncCalled, 'endSync should have been called'); + assert.ok(!endAsyncCalled, 'end should not have been called'); +} + +// ============================================================================= +// Try-sync-first: endSync returns -1, falls back to async end +// ============================================================================= + +async function testEndSyncFallback() { + let endSyncCalled = false; + let endAsyncCalled = false; + + const writer = { + write(chunk) { return Promise.resolve(); }, + endSync() { + endSyncCalled = true; + return -1; // Can't complete synchronously + }, + end() { + endAsyncCalled = true; + return Promise.resolve(0); + }, + fail() {}, + }; + + const writable = toWritable(writer); + + await new Promise((resolve) => writable.end(resolve)); + + assert.ok(endSyncCalled, 'endSync should have been called'); + assert.ok(endAsyncCalled, 'end should have been called as fallback'); +} + +// ============================================================================= +// _final delegates to writer.end() +// ============================================================================= + +async function testFinalDelegatesToEnd() { + let endCalled = false; + const writer = { + write(chunk) { return Promise.resolve(); }, + end() { + endCalled = true; + return Promise.resolve(0); + }, + fail() {}, + }; + + const writable = toWritable(writer); + + await new Promise((resolve) => writable.end(resolve)); + + assert.ok(endCalled, 'writer.end() should have been called'); +} + +// ============================================================================= +// _destroy delegates to writer.fail() +// ============================================================================= + +async function testDestroyDelegatesToFail() { + let failReason = null; + const writer = { + write(chunk) { return Promise.resolve(); }, + end() { return Promise.resolve(0); }, + fail(reason) { failReason = reason; }, + }; + + const writable = toWritable(writer); + writable.on('error', () => {}); // Prevent unhandled + + const testErr = new Error('destroy test'); + writable.destroy(testErr); + + // Give a tick for destroy to propagate + await new Promise((resolve) => setTimeout(resolve, 10)); + + assert.strictEqual(failReason, testErr); +} + +// ============================================================================= +// Error from writer.write() propagates to writable +// ============================================================================= + +async function testWriteErrorPropagation() { + const writer = { + write(chunk) { + return Promise.reject(new Error('write failed')); + }, + end() { return Promise.resolve(0); }, + fail() {}, + }; + + const writable = toWritable(writer); + + await assert.rejects(new Promise((resolve, reject) => { + writable.write('data', (err) => { + if (err) reject(err); + else resolve(); + }); + }), { message: 'write failed' }); +} + +// ============================================================================= +// Invalid writer argument throws +// ============================================================================= + +function testInvalidWriterThrows() { + assert.throws( + () => toWritable(null), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); + assert.throws( + () => toWritable({}), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); + assert.throws( + () => toWritable('not a writer'), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); + // Object with write is valid (only write is required). + // This should not throw. + toWritable({ + write() { return Promise.resolve(); }, + }); +} + +// ============================================================================= +// Round-trip: push writer -> fromStreamIter -> write -> read from readable +// ============================================================================= + +async function testRoundTrip() { + const { writer, readable } = push({ backpressure: 'unbounded' }); + const writable = toWritable(writer); + + const data = 'round trip test data'; + writable.write(data); + writable.end(); + + const result = await text(readable); + assert.strictEqual(result, data); +} + +// ============================================================================= +// PushWriter writeSync false accepted as backpressure is not retried +// ============================================================================= + +async function testPushWriterBlockBackpressureNoDuplicate() { + const { writer, readable } = push({ budget: 16384, backpressure: 'unbounded' }); + const writable = toWritable(writer); + + await new Promise((resolve, reject) => { + writable.write('a', (err) => { + if (err) reject(err); + else resolve(); + }); + }); + + writable.write('b'); + writable.end(); + + const result = await text(readable); + assert.strictEqual(result, 'ab'); +} + +// ============================================================================= +// PushWriter writevSync false accepted as backpressure is not retried +// ============================================================================= + +async function testPushWriterBlockBackpressureWritevNoDuplicate() { + const { writer, readable } = push({ budget: 16384, backpressure: 'unbounded' }); + const writable = toWritable(writer); + + await new Promise((resolve, reject) => { + writable.write('a', (err) => { + if (err) reject(err); + else resolve(); + }); + }); + + writable.cork(); + writable.write('b'); + writable.write('c'); + writable.uncork(); + writable.end(); + + const result = await text(readable); + assert.strictEqual(result, 'abc'); +} + +// ============================================================================= +// Multiple sequential writes +// ============================================================================= + +async function testSequentialWrites() { + const { writer, readable } = push({ backpressure: 'unbounded' }); + const writable = toWritable(writer); + + for (let i = 0; i < 10; i++) { + writable.write(`chunk${i}`); + } + writable.end(); + + let expected = ''; + for (let i = 0; i < 10; i++) { + expected += `chunk${i}`; + } + const result = await text(readable); + assert.strictEqual(result, expected); +} + +// ============================================================================= +// Sync callback is deferred via queueMicrotask +// ============================================================================= + +async function testSyncCallbackDeferred() { + let callbackTick = false; + + const writer = { + writeSync(chunk) { + return true; + }, + write(chunk) { + return Promise.resolve(); + }, + end() { return Promise.resolve(0); }, + fail() {}, + }; + + const writable = toWritable(writer); + + const p = new Promise((resolve) => { + writable.write('test', () => { + callbackTick = true; + resolve(); + }); + // Callback should NOT have fired synchronously + assert.strictEqual(callbackTick, false); + }); + + await p; + assert.strictEqual(callbackTick, true); +} + +// ============================================================================= +// Minimal writer: only write() is required +// ============================================================================= + +async function testMinimalWriter() { + const chunks = []; + const writer = { + write(chunk) { + chunks.push(Buffer.from(chunk)); + return Promise.resolve(); + }, + // No end, fail, writeSync, writev, etc. + }; + + const writable = toWritable(writer); + + await new Promise((resolve) => { + writable.write('minimal'); + writable.end(resolve); + }); + + assert.strictEqual(Buffer.concat(chunks).toString(), 'minimal'); +} + +// ============================================================================= +// Destroy without error does not call fail() +// ============================================================================= + +async function testDestroyWithoutError() { + let failCalled = false; + const writer = { + write(chunk) { return Promise.resolve(); }, + fail() { failCalled = true; }, + }; + + const writable = toWritable(writer); + writable.destroy(); + + await new Promise((resolve) => setTimeout(resolve, 10)); + + assert.ok(!failCalled, 'fail should not be called on clean destroy'); +} + +// ============================================================================= +// Destroy with error calls fail() when available +// ============================================================================= + +async function testDestroyWithError() { + let failReason = null; + const writer = { + write(chunk) { return Promise.resolve(); }, + fail(reason) { failReason = reason; }, + }; + + const writable = toWritable(writer); + writable.on('error', () => {}); + + const err = new Error('test'); + writable.destroy(err); + + await new Promise((resolve) => setTimeout(resolve, 10)); + + assert.strictEqual(failReason, err); +} + +// ============================================================================= +// Destroy with error when writer lacks fail() +// ============================================================================= + +async function testDestroyWithoutFail() { + const writer = { + write(chunk) { return Promise.resolve(); }, + // No fail method + }; + + const writable = toWritable(writer); + writable.on('error', () => {}); + + // Should not throw even though writer has no fail() + writable.destroy(new Error('test')); + + await new Promise((resolve) => setTimeout(resolve, 10)); + assert.ok(writable.destroyed); +} + +// ============================================================================= +// Custom highWaterMark option +// ============================================================================= + +function testHighWaterMarkIsMaxSafeInt() { + const writer = { + write(chunk) { return Promise.resolve(); }, + }; + + // HWM is set to MAX_SAFE_INTEGER to disable Writable's internal + // buffering. The underlying Writer manages backpressure directly. + const writable = toWritable(writer); + assert.strictEqual(writable.writableHighWaterMark, Number.MAX_SAFE_INTEGER); +} + +// ============================================================================= +// writeSync throws -- error propagates, does NOT fall back to async +// ============================================================================= + +async function testWriteSyncThrowsPropagation() { + const writer = { + writeSync() { + throw new Error('sync broken'); + }, + write() { + return Promise.resolve(); + }, + end() { return Promise.resolve(0); }, + fail() {}, + }; + + const writable = toWritable(writer); + + await assert.rejects(new Promise((resolve, reject) => { + writable.write('test', (err) => { + if (err) reject(err); + else resolve(); + }); + }), { message: 'sync broken' }); +} + +// ============================================================================= +// ============================================================================= +// writer.write() throws synchronously -- error propagates to callback +// ============================================================================= + +async function testWriteThrowsSyncPropagation() { + const writer = { + write() { + throw new Error('sync throw from write'); + }, + }; + + const writable = toWritable(writer); + + await assert.rejects(new Promise((resolve, reject) => { + writable.write('data', (err) => { + if (err) reject(err); + else resolve(); + }); + }), { message: 'sync throw from write' }); +} + +// ============================================================================= +// writer.end() throws synchronously -- error propagates to callback +// ============================================================================= + +async function testEndThrowsSyncPropagation() { + const writer = { + write(chunk) { return Promise.resolve(); }, + endSync() { return -1; }, + end() { + throw new Error('sync throw from end'); + }, + }; + + const writable = toWritable(writer); + writable.on('error', () => {}); + + await new Promise((resolve) => { + writable.end(common.mustCall((err) => { + assert.ok(err); + assert.strictEqual(err.message, 'sync throw from end'); + resolve(); + })); + }); +} + +// ============================================================================= +// Run all tests +// ============================================================================= + +testInvalidWriterThrows(); +testNoWritevWithoutWriterWritev(); +testHighWaterMarkIsMaxSafeInt(); + +Promise.all([ + testBasicWrite(), + testWriteDelegatesToWriter(), + testWritevDelegation(), + testWriteSyncFirst(), + testWriteSyncFallback(), + testWriteSyncThrowsPropagation(), + testEndSyncFirst(), + testEndSyncFallback(), + testFinalDelegatesToEnd(), + testDestroyDelegatesToFail(), + testDestroyWithoutError(), + testDestroyWithError(), + testDestroyWithoutFail(), + testWriteErrorPropagation(), + testWriteThrowsSyncPropagation(), + testEndThrowsSyncPropagation(), + testRoundTrip(), + testPushWriterBlockBackpressureNoDuplicate(), + testPushWriterBlockBackpressureWritevNoDuplicate(), + testSequentialWrites(), + testSyncCallbackDeferred(), + testMinimalWriter(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-iter-writable-interop.js b/test/parallel/test-stream-iter-writable-interop.js new file mode 100644 index 000000000000..110e8e0a7d2e --- /dev/null +++ b/test/parallel/test-stream-iter-writable-interop.js @@ -0,0 +1,683 @@ +// Flags: --experimental-stream-iter +'use strict'; + +// Tests for classic Writable stream interop with the stream/iter API +// via fromWritable(). + +const common = require('../common'); +const assert = require('assert'); +const { Writable } = require('stream'); +const { + from, + fromWritable, + pipeTo, + text, + ondrain, +} = require('stream/iter'); + +// ============================================================================= +// fromWritable() is exported from stream/iter +// ============================================================================= + +function testFunctionExists() { + assert.strictEqual(typeof fromWritable, 'function'); +} + +// ============================================================================= +// Default policy is strict +// ============================================================================= + +async function testDefaultIsStrict() { + const writable = new Writable({ + highWaterMark: 1024, + write(chunk, encoding, cb) { cb(); }, + }); + + const writer = fromWritable(writable); + // Should work fine when buffer has room + await writer.write('hello'); + await writer.end(); +} + +// ============================================================================= +// Basic write: pipeTo through the adapter (block policy for pipeTo compat) +// ============================================================================= + +async function testBasicWrite() { + const chunks = []; + const writable = new Writable({ + write(chunk, encoding, cb) { + chunks.push(Buffer.from(chunk)); + cb(); + }, + }); + + const writer = fromWritable(writable, { backpressure: 'unbounded' }); + await pipeTo(from('hello world'), writer); + + assert.strictEqual(Buffer.concat(chunks).toString(), 'hello world'); +} + +// ============================================================================= +// write() resolves when no backpressure (strict) +// ============================================================================= + +async function testWriteNoDrain() { + const chunks = []; + const writable = new Writable({ + highWaterMark: 1024, + write(chunk, encoding, cb) { + chunks.push(Buffer.from(chunk)); + cb(); + }, + }); + + const writer = fromWritable(writable); + await writer.write('hello'); + await writer.write(' world'); + await writer.end(); + + assert.strictEqual(Buffer.concat(chunks).toString(), 'hello world'); +} + +// ============================================================================= +// block: write() waits for drain when backpressure is active +// ============================================================================= + +async function testBlockWaitsForDrain() { + const chunks = []; + const writable = new Writable({ + highWaterMark: 1, // Very small buffer + write(chunk, encoding, cb) { + chunks.push(Buffer.from(chunk)); + // Delay callback to simulate slow consumer + setTimeout(cb, 10); + }, + }); + + const writer = fromWritable(writable, { backpressure: 'unbounded' }); + + await writer.write('a'); + await writer.write('b'); + await writer.write('c'); + await writer.end(); + + assert.strictEqual(Buffer.concat(chunks).toString(), 'abc'); +} + +// ============================================================================= +// block: stream error rejects pending write +// ============================================================================= + +async function testBlockErrorRejectsPendingWrite() { + const writable = new Writable({ + highWaterMark: 1, + write(chunk, enc, cb) { + // Never call cb -- simulate stuck write + }, + }); + + const writer = fromWritable(writable, { backpressure: 'unbounded' }); + + // First write fills the buffer, waits for drain + const writePromise = writer.write('data that will block'); + + // Destroy with error while write is pending + writable.destroy(new Error('stream broke')); + + await assert.rejects(writePromise, { message: 'stream broke' }); +} + +// ============================================================================= +// strict: rejects when buffer is full +// ============================================================================= + +async function testStrictRejectsWhenFull() { + const writable = new Writable({ + highWaterMark: 5, + write(chunk, enc, cb) { + // Never call cb -- data stays buffered + }, + }); + + const writer = fromWritable(writable); + + // First write fills the buffer (5 bytes = hwm) + await writer.write('12345'); + + // Second write should reject -- buffer is full + await assert.rejects( + writer.write('more'), + { code: 'ERR_INVALID_STATE' }, + ); +} + +// ============================================================================= +// strict: writev rejects when buffer is full +// ============================================================================= + +async function testStrictWritevRejectsWhenFull() { + const writable = new Writable({ + highWaterMark: 5, + write(chunk, enc, cb) { + // Never call cb + }, + }); + + const writer = fromWritable(writable); + + // Fill buffer + await writer.write('12345'); + + // Writev should reject entire batch + await assert.rejects( + writer.writev([ + new TextEncoder().encode('a'), + new TextEncoder().encode('b'), + ]), + { code: 'ERR_INVALID_STATE' }, + ); +} + +// ============================================================================= +// drop-newest: silently discards when buffer is full +// ============================================================================= + +async function testDropNewestDiscards() { + const chunks = []; + const writable = new Writable({ + highWaterMark: 5, + write(chunk, enc, cb) { + chunks.push(Buffer.from(chunk)); + // Never call cb -- data stays buffered + }, + }); + + const writer = fromWritable(writable, { backpressure: 'drop-newest' }); + + // First write fills the buffer + await writer.write('12345'); + + // Second write should be silently discarded (no reject, no block) + await writer.write('dropped'); + + // Only the first chunk was actually written to the writable + assert.strictEqual(chunks.length, 1); + assert.strictEqual(chunks[0].toString(), '12345'); +} + +// ============================================================================= +// drop-newest: writev discards entire batch when full +// ============================================================================= + +async function testDropNewestWritevDiscards() { + const chunks = []; + const writable = new Writable({ + highWaterMark: 5, + write(chunk, enc, cb) { + chunks.push(Buffer.from(chunk)); + // Never call cb + }, + }); + + const writer = fromWritable(writable, { backpressure: 'drop-newest' }); + + // Fill buffer + await writer.write('12345'); + + // Writev should discard entire batch + await writer.writev([ + new TextEncoder().encode('a'), + new TextEncoder().encode('b'), + ]); + + assert.strictEqual(chunks.length, 1); +} + +// ============================================================================= +// drop-newest: still counts bytes from dropped writes +// ============================================================================= + +async function testDropNewestCountsBytes() { + const writable = new Writable({ + highWaterMark: 5, + write(chunk, enc, cb) { + // Never call cb + }, + }); + + const writer = fromWritable(writable, { backpressure: 'drop-newest' }); + + await writer.write('12345'); // 5 bytes, accepted + await writer.write('67890'); // 5 bytes, dropped + + // canWrite should be false (buffer is full) + assert.strictEqual(writer.canWrite, false); +} + +// ============================================================================= +// drop-oldest: throws on construction +// ============================================================================= + +function testDropOldestThrows() { + const writable = new Writable({ write(chunk, enc, cb) { cb(); } }); + assert.throws( + () => fromWritable(writable, { backpressure: 'drop-oldest' }), + { code: 'ERR_INVALID_ARG_VALUE' }, + ); +} + +// ============================================================================= +// Invalid backpressure value throws +// ============================================================================= + +function testInvalidBackpressureThrows() { + const writable = new Writable({ write(chunk, enc, cb) { cb(); } }); + assert.throws( + () => fromWritable(writable, { backpressure: 'invalid' }), + { code: 'ERR_INVALID_ARG_VALUE' }, + ); +} + +// ============================================================================= +// writev() corks and uncorks (block policy) +// ============================================================================= + +async function testWritev() { + const chunks = []; + const writable = new Writable({ + highWaterMark: 1024, + write(chunk, encoding, cb) { + chunks.push(Buffer.from(chunk)); + cb(); + }, + writev(entries, cb) { + for (const { chunk } of entries) { + chunks.push(Buffer.from(chunk)); + } + cb(); + }, + }); + + const writer = fromWritable(writable, { backpressure: 'unbounded' }); + await writer.writev([ + new TextEncoder().encode('hello'), + new TextEncoder().encode(' '), + new TextEncoder().encode('world'), + ]); + await writer.end(); + + assert.strictEqual(Buffer.concat(chunks).toString(), 'hello world'); +} + +// ============================================================================= +// writeSync / writevSync always return false +// ============================================================================= + +function testSyncMethodsReturnFalse() { + const writable = new Writable({ write(chunk, enc, cb) { cb(); } }); + const writer = fromWritable(writable); + + assert.strictEqual(writer.writeSync(new Uint8Array(1)), false); + assert.strictEqual(writer.writevSync([new Uint8Array(1)]), false); +} + +// ============================================================================= +// endSync returns -1 +// ============================================================================= + +function testEndSyncReturnsNegativeOne() { + const writable = new Writable({ write(chunk, enc, cb) { cb(); } }); + const writer = fromWritable(writable); + + assert.strictEqual(writer.endSync(), -1); +} + +// ============================================================================= +// end() resolves with total bytes written +// ============================================================================= + +async function testEndReturnsByteCount() { + const writable = new Writable({ + write(chunk, encoding, cb) { cb(); }, + }); + + const writer = fromWritable(writable); + await writer.write('hello'); // 5 bytes + await writer.write(' world'); // 6 bytes + const total = await writer.end(); + + assert.strictEqual(total, 11); +} + +// ============================================================================= +// fail() destroys the writable +// ============================================================================= + +async function testFail() { + const writable = new Writable({ write(chunk, enc, cb) { cb(); } }); + writable.on('error', () => {}); // Prevent unhandled error + const writer = fromWritable(writable); + + writer.fail(new Error('test fail')); + + assert.ok(writable.destroyed); +} + +// ============================================================================= +// canWrite reflects buffer state +// ============================================================================= + +function testCanWrite() { + const writable = new Writable({ + highWaterMark: 100, + write(chunk, enc, cb) { + // Don't call cb - keeps data buffered + }, + }); + + const writer = fromWritable(writable); + assert.strictEqual(writer.canWrite, true); +} + +// ============================================================================= +// canWrite is null when destroyed +// ============================================================================= + +function testCanWriteNull() { + const writable = new Writable({ write(chunk, enc, cb) { cb(); } }); + const writer = fromWritable(writable); + + writable.destroy(); + assert.strictEqual(writer.canWrite, null); +} + +// ============================================================================= +// drainableProtocol: resolves immediately when no backpressure +// ============================================================================= + +async function testDrainableNoPressure() { + const writable = new Writable({ + highWaterMark: 1024, + write(chunk, enc, cb) { cb(); }, + }); + + const writer = fromWritable(writable); + const result = await ondrain(writer); + assert.strictEqual(result, true); +} + +// ============================================================================= +// drainableProtocol: returns null when destroyed +// ============================================================================= + +function testDrainableNull() { + const writable = new Writable({ write(chunk, enc, cb) { cb(); } }); + const writer = fromWritable(writable); + + writable.destroy(); + assert.strictEqual(ondrain(writer), null); +} + +// ============================================================================= +// Error propagation: write after end rejects +// ============================================================================= + +async function testWriteAfterEnd() { + const writable = new Writable({ write(chunk, enc, cb) { cb(); } }); + const writer = fromWritable(writable); + + await writer.end(); + + await assert.rejects( + writer.write('should fail'), + { code: 'ERR_STREAM_WRITE_AFTER_END' }, + ); +} + +// ============================================================================= +// Multiple sequential writes +// ============================================================================= + +async function testSequentialWrites() { + const chunks = []; + const writable = new Writable({ + write(chunk, encoding, cb) { + chunks.push(Buffer.from(chunk)); + cb(); + }, + }); + + const writer = fromWritable(writable); + + for (let i = 0; i < 10; i++) { + await writer.write(`chunk${i}`); + } + await writer.end(); + + let expected = ''; + for (let i = 0; i < 10; i++) { + expected += `chunk${i}`; + } + assert.strictEqual(Buffer.concat(chunks).toString(), expected); +} + +// ============================================================================= +// pipeTo with compression transform into writable (block policy) +// ============================================================================= + +async function testPipeToWithTransform() { + const { + compressGzip, + decompressGzip, + } = require('zlib/iter'); + const { pull } = require('stream/iter'); + + const compressed = []; + const writable = new Writable({ + write(chunk, encoding, cb) { + compressed.push(Buffer.from(chunk)); + cb(); + }, + }); + + const writer = fromWritable(writable, { backpressure: 'unbounded' }); + await pipeTo(from('hello via transform'), compressGzip(), writer); + + const decompressed = await text( + pull(from(Buffer.concat(compressed)), decompressGzip()), + ); + assert.strictEqual(decompressed, 'hello via transform'); +} + +// ============================================================================= +// Dispose support +// ============================================================================= + +async function testDispose() { + const writable = new Writable({ write(chunk, enc, cb) { cb(); } }); + const writer = fromWritable(writable); + + writer[Symbol.dispose](); + assert.ok(writable.destroyed); +} + +async function testAsyncDispose() { + const writable = new Writable({ write(chunk, enc, cb) { cb(); } }); + const writer = fromWritable(writable); + + await writer[Symbol.asyncDispose](); + assert.ok(writable.destroyed); +} + +// ============================================================================= +// write() validates chunk type +// ============================================================================= + +async function testWriteInvalidChunkType() { + const writable = new Writable({ write(chunk, enc, cb) { cb(); } }); + const writer = fromWritable(writable); + + await assert.rejects( + writer.write(42), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); + await assert.rejects( + writer.write(null), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); + await assert.rejects( + writer.write({}), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +// ============================================================================= +// writev() validates chunks is an array +// ============================================================================= + +function testWritevInvalidChunksType() { + const writable = new Writable({ write(chunk, enc, cb) { cb(); } }); + const writer = fromWritable(writable); + + assert.throws( + () => writer.writev('not an array'), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); + assert.throws( + () => writer.writev(42), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); +} + +// ============================================================================= +// writev() uncorks when chunk validation throws +// ============================================================================= + +function testWritevInvalidChunkUncorks() { + const writable = new Writable({ write(chunk, enc, cb) { cb(); } }); + const writer = fromWritable(writable); + + assert.throws( + () => writer.writev([new Uint8Array([1]), 42]), + { code: 'ERR_INVALID_ARG_TYPE' }, + ); + assert.strictEqual(writable.writableCorked, 0); +} + +// ============================================================================= +// Cached writer: second call returns same instance +// ============================================================================= + +function testCachedWriter() { + const writable = new Writable({ write(chunk, enc, cb) { cb(); } }); + const writer1 = fromWritable(writable); + const writer2 = fromWritable(writable); + + assert.strictEqual(writer1, writer2); +} + +// ============================================================================= +// fail() rejects pending block waiters +// ============================================================================= + +async function testFailRejectsPendingWaiters() { + const writable = new Writable({ + highWaterMark: 1, + write(chunk, enc, cb) { + // Never call cb -- stuck + }, + }); + writable.on('error', () => {}); // Prevent unhandled error + + const writer = fromWritable(writable, { backpressure: 'unbounded' }); + + // This write will block on drain + const writePromise = writer.write('blocked data'); + + // fail() should reject the pending waiter, not orphan it + writer.fail(new Error('fail reason')); + + await assert.rejects(writePromise, { message: 'fail reason' }); +} + +// ============================================================================= +// dispose rejects pending block waiters +// ============================================================================= + +async function testDisposeRejectsPendingWaiters() { + const writable = new Writable({ + highWaterMark: 1, + write(chunk, enc, cb) { + // Never call cb -- stuck + }, + }); + + const writer = fromWritable(writable, { backpressure: 'unbounded' }); + + // This write will block on drain + const writePromise = writer.write('blocked data'); + + writer[Symbol.dispose](); + + await assert.rejects(writePromise, { name: 'AbortError' }); +} + +// ============================================================================= +// Run all tests +// ============================================================================= + +testFunctionExists(); +testSyncMethodsReturnFalse(); +// ============================================================================= +// Object-mode Writable throws +// ============================================================================= + +function testObjectModeThrows() { + const writable = new Writable({ + objectMode: true, + write(chunk, enc, cb) { cb(); }, + }); + assert.throws( + () => fromWritable(writable), + { code: 'ERR_INVALID_STATE' }, + ); +} + +testFunctionExists(); +testSyncMethodsReturnFalse(); +testEndSyncReturnsNegativeOne(); +testCanWrite(); +testCanWriteNull(); +testDrainableNull(); +testDropOldestThrows(); +testInvalidBackpressureThrows(); +testWritevInvalidChunksType(); +testWritevInvalidChunkUncorks(); +testCachedWriter(); +testObjectModeThrows(); + +Promise.all([ + testDefaultIsStrict(), + testBasicWrite(), + testWriteNoDrain(), + testBlockWaitsForDrain(), + testBlockErrorRejectsPendingWrite(), + testStrictRejectsWhenFull(), + testStrictWritevRejectsWhenFull(), + testDropNewestDiscards(), + testDropNewestWritevDiscards(), + testDropNewestCountsBytes(), + testWritev(), + testEndReturnsByteCount(), + testFail(), + testDrainableNoPressure(), + testWriteAfterEnd(), + testSequentialWrites(), + testPipeToWithTransform(), + testDispose(), + testAsyncDispose(), + testWriteInvalidChunkType(), + testFailRejectsPendingWaiters(), + testDisposeRejectsPendingWaiters(), +]).then(common.mustCall()); diff --git a/test/parallel/test-stream-pipeline.js b/test/parallel/test-stream-pipeline.js index 8852f24a7505..7b4052f2b47d 100644 --- a/test/parallel/test-stream-pipeline.js +++ b/test/parallel/test-stream-pipeline.js @@ -270,7 +270,11 @@ tmpdir.refresh(); { const server = http.createServer(common.mustCallAtLeast((req, res) => { - pipeline(req, res, common.mustSucceed()); + pipeline(req, res, common.mustCall((err) => { + // The client destroys the request body source before EOF below, so the + // echoed response cannot finish successfully either. + assert.strictEqual(err?.code, 'ERR_STREAM_PREMATURE_CLOSE'); + })); })); server.listen(0, common.mustCall(() => { diff --git a/test/parallel/test-stream-readable-setEncoding-existing-buffers.js b/test/parallel/test-stream-readable-setEncoding-existing-buffers.js index eb75260bacfc..38d50b567757 100644 --- a/test/parallel/test-stream-readable-setEncoding-existing-buffers.js +++ b/test/parallel/test-stream-readable-setEncoding-existing-buffers.js @@ -58,3 +58,48 @@ const assert = require('assert'); assert.deepStrictEqual(chunks, ['🎉']); }); } + +{ + // Call .setEncoding() before the stream starts flowing, after _read() + // has buffered the first chunk of a split character. + const chunks = [ + Buffer.from([0xf0, 0x9f]), + Buffer.from([0x8e, 0x89]), + null, + ]; + const r = new Readable({ + read() { + this.push(chunks.shift()); + }, + }); + + r.read(0); + assert.strictEqual(r.readableFlowing, null); + assert.strictEqual(r.readableLength, 2); + + r.setEncoding('utf8'); + const received = []; + r.on('data', (chunk) => received.push(chunk)); + + process.nextTick(() => { + assert.deepStrictEqual(received, ['🎉']); + }); +} + +{ + // Call .setEncoding() after EOF while the buffer contains an + // incomplete character. + const r = new Readable({ read() {} }); + + r.push(Buffer.from([0xf0])); + r.push(Buffer.from([0x9f])); + r.push(null); + + r.setEncoding('utf8'); + const chunks = []; + r.on('data', (chunk) => chunks.push(chunk)); + + process.nextTick(() => { + assert.deepStrictEqual(chunks, ['�']); + }); +} diff --git a/test/parallel/test-stream-readable-to-web-termination.js b/test/parallel/test-stream-readable-to-web-termination.js index 13fce9bc715e..f30cf721e14c 100644 --- a/test/parallel/test-stream-readable-to-web-termination.js +++ b/test/parallel/test-stream-readable-to-web-termination.js @@ -1,6 +1,8 @@ 'use strict'; -require('../common'); -const { Readable } = require('stream'); +const common = require('../common'); +const assert = require('assert'); +const { Duplex, Readable } = require('stream'); +const { setTimeout: delay } = require('timers/promises'); { const r = Readable.from([]); @@ -10,3 +12,33 @@ const { Readable } = require('stream'); const reader = Readable.toWeb(r).getReader(); reader.read(); } + +{ + const duplex = new Duplex({ + read() { + this.push(Buffer.from('x')); + this.push(null); + }, + write(_chunk, _encoding, callback) { + callback(); + }, + }); + + const reader = Readable.toWeb(duplex).getReader(); + + (async () => { + const result = await reader.read(); + assert.deepStrictEqual(result, { + value: new Uint8Array(Buffer.from('x')), + done: false, + }); + + const closeResult = await Promise.race([ + reader.read(), + delay(common.platformTimeout(100)).then(() => 'timeout'), + ]); + + assert.notStrictEqual(closeResult, 'timeout'); + assert.deepStrictEqual(closeResult, { value: undefined, done: true }); + })().then(common.mustCall()); +} diff --git a/test/parallel/test-stream-writable-write-error.js b/test/parallel/test-stream-writable-write-error.js index 069e32e1be8e..76f797fb1bd5 100644 --- a/test/parallel/test-stream-writable-write-error.js +++ b/test/parallel/test-stream-writable-write-error.js @@ -31,7 +31,7 @@ function test(autoDestroy) { { const w = new Writable({ autoDestroy, - _write() {} + write() {} }); w.end(); expectError(w, ['asd'], 'ERR_STREAM_WRITE_AFTER_END'); @@ -40,7 +40,7 @@ function test(autoDestroy) { { const w = new Writable({ autoDestroy, - _write() {} + write() {} }); w.destroy(); } @@ -48,7 +48,7 @@ function test(autoDestroy) { { const w = new Writable({ autoDestroy, - _write() {} + write() {} }); expectError(w, [null], 'ERR_STREAM_NULL_VALUES', true); } @@ -56,18 +56,26 @@ function test(autoDestroy) { { const w = new Writable({ autoDestroy, - _write() {} + write() {} }); expectError(w, [{}], 'ERR_INVALID_ARG_TYPE', true); } { const w = new Writable({ - decodeStrings: false, autoDestroy, - _write() {} + write() {} + }); + expectError(w, ['asd', 'buffer'], 'ERR_UNKNOWN_ENCODING', true); + } + + { + const w = new Writable({ + autoDestroy, + decodeStrings: false, + write() {} }); - expectError(w, ['asd', 'noencoding'], 'ERR_UNKNOWN_ENCODING', true); + expectError(w, ['asd', 'buffer'], 'ERR_UNKNOWN_ENCODING', true); } } diff --git a/test/parallel/test-timers-async-store-leak.js b/test/parallel/test-timers-async-store-leak.js new file mode 100644 index 000000000000..1f95b2ea55f1 --- /dev/null +++ b/test/parallel/test-timers-async-store-leak.js @@ -0,0 +1,167 @@ +// Flags: --expose-internals --expose-gc +'use strict'; + +const common = require('../common'); +const { spawnSyncAndAssert } = require('../common/child_process'); +const { AsyncLocalStorage } = require('async_hooks'); +const assert = require('assert'); + +if (process.argv[2] !== 'child') { + // Test with async-context-frame disabled (legacy ALS mode) + spawnSyncAndAssert(process.execPath, [ + '--expose-internals', + '--expose-gc', + '--no-async-context-frame', + __filename, + 'child', + ], {}); + + // Test with async-context-frame enabled (default) + spawnSyncAndAssert(process.execPath, [ + '--expose-internals', + '--expose-gc', + __filename, + 'child', + ], {}); +} + +const AsyncContextFrame = require('internal/async_context_frame'); +const { + async_context_frame, +} = require('internal/timers'); +const { + symbols: { + async_local_storage_context_symbol, + }, +} = require('internal/async_hooks'); + +// When async-context-frame is enabled, stores are stored in the async context +// frame, not directly on the resource. The resource holds a reference to the +// frame via async_context_frame. +const isACFEnabled = AsyncContextFrame.enabled; + +function getStore(resource, als) { + if (isACFEnabled) { + return resource[async_context_frame]?.get(als); + } + return resource[async_local_storage_context_symbol]?.[als.kResourceStore]; +} + +function assertStore(resource, als, store) { + assert.strictEqual(getStore(resource, als), store); +} + +function assertNoStore(resource) { + if (isACFEnabled) { + assert.strictEqual(resource[async_context_frame], undefined); + } else { + assert.strictEqual(resource[async_local_storage_context_symbol], undefined); + } +} + +// Test that setTimeout does not retain a reference to the async store after +// firing. The callback and arguments must stay on the Timeout object so that +// refresh() can reactivate the timer. +{ + const asyncLocalStorage = new AsyncLocalStorage(); + const store = {}; + const arg = {}; + asyncLocalStorage.run(store, common.mustCall(() => { + const timeout = setTimeout(common.mustCall((received) => { + assert.strictEqual(received, arg); + setImmediate(common.mustCall(() => { + assertNoStore(timeout); + })); + }), 1, arg); + assertStore(timeout, asyncLocalStorage, store); + })); +} + +// Test that clearTimeout cleans up the store, callback, and arguments before +// firing. +{ + const asyncLocalStorage = new AsyncLocalStorage(); + const store = {}; + const arg = {}; + asyncLocalStorage.run(store, common.mustCall(() => { + const timeout = setTimeout(common.mustNotCall(), common.platformTimeout(1000), arg); + assertStore(timeout, asyncLocalStorage, store); + clearTimeout(timeout); + assertNoStore(timeout); + assert.strictEqual(timeout._onTimeout, undefined); + assert.strictEqual(timeout._timerArgs, undefined); + })); +} + +// Test that setInterval does not retain a reference to the async store, +// callback, or arguments after it is cleared. +{ + const asyncLocalStorage = new AsyncLocalStorage(); + const store = {}; + const arg = {}; + asyncLocalStorage.run(store, common.mustCall(() => { + const interval = setInterval(common.mustCall((received) => { + assert.strictEqual(received, arg); + assert.strictEqual(asyncLocalStorage.getStore(), store); + clearInterval(interval); + assert.strictEqual(asyncLocalStorage.getStore(), store); + setImmediate(common.mustCall(() => { + assertNoStore(interval); + assert.strictEqual(interval._onTimeout, undefined); + assert.strictEqual(interval._timerArgs, undefined); + })); + }), 1, arg); + assertStore(interval, asyncLocalStorage, store); + })); +} + +// Test that setImmediate does not retain a reference to the async store, +// callback, or arguments after firing. +{ + const asyncLocalStorage = new AsyncLocalStorage(); + const store = {}; + const arg = {}; + asyncLocalStorage.run(store, common.mustCall(() => { + const immediate = setImmediate(common.mustCall((received) => { + assert.strictEqual(received, arg); + setImmediate(common.mustCall(() => { + assertNoStore(immediate); + assert.strictEqual(immediate._onImmediate, undefined); + assert.strictEqual(immediate._argv, undefined); + })); + }), arg); + assertStore(immediate, asyncLocalStorage, store); + })); +} + +// Test that clearImmediate cleans up the store, callback, and arguments before +// firing. +{ + const asyncLocalStorage = new AsyncLocalStorage(); + const store = {}; + const arg = {}; + asyncLocalStorage.run(store, common.mustCall(() => { + const immediate = setImmediate(common.mustNotCall(), arg); + assertStore(immediate, asyncLocalStorage, store); + clearImmediate(immediate); + assertNoStore(immediate); + assert.strictEqual(immediate._onImmediate, undefined); + assert.strictEqual(immediate._argv, undefined); + })); +} + +// Test that the async store reference is cleaned up and can be GC'd. +{ + const asyncLocalStorage = new AsyncLocalStorage(); + let timeout; + const weakStore = new WeakRef({}); + asyncLocalStorage.run(weakStore.deref(), common.mustCall(() => { + timeout = setTimeout(common.mustNotCall(), common.platformTimeout(1000)); + assert.strictEqual(weakStore.deref() !== undefined, true); + clearTimeout(timeout); + })); + setImmediate(common.mustCall(() => { + global.gc(); + assert.strictEqual(weakStore.deref(), undefined); + })); +} diff --git a/test/parallel/test-timers-interval-promisified.js b/test/parallel/test-timers-interval-promisified.js index dcf6716b19c5..8ee8015986d7 100644 --- a/test/parallel/test-timers-interval-promisified.js +++ b/test/parallel/test-timers-interval-promisified.js @@ -32,7 +32,7 @@ process.on('multipleResolves', common.mustNotCall()); const iterator = iterable[Symbol.asyncIterator](); const promise = iterator.next(); promise.then((result) => { - assert.ok(!result.done, 'iterator was wronly marked as done'); + assert.ok(!result.done, 'iterator was wrongly marked as done'); assert.strictEqual(result.value, 'foobar'); return iterator.return(); }).then(common.mustCall()); @@ -44,7 +44,7 @@ process.on('multipleResolves', common.mustNotCall()); const promise = iterator.next(); promise .then((result) => { - assert.ok(!result.done, 'iterator was wronly marked as done'); + assert.ok(!result.done, 'iterator was wrongly marked as done'); assert.strictEqual(result.value, 'foobar'); return iterator.next(); }) diff --git a/test/parallel/test-tls-check-server-identity.js b/test/parallel/test-tls-check-server-identity.js index 4863fca55165..e21f39ccc763 100644 --- a/test/parallel/test-tls-check-server-identity.js +++ b/test/parallel/test-tls-check-server-identity.js @@ -100,6 +100,27 @@ const tests = [ cert: { subject: { CN: '8.8.8.8' }, subjectaltname: 'IP Address:8.8.8.8' } }, + // An "IP Address:" SAN also matches an IPv6 host. Regression test for the + // IDNA-normalization change: domainToASCII('::1') === '' (an IPv6 literal is + // not a domain), which made the normalized host skip IPv6 IP-SAN matching. + { + host: '::1', + cert: { subject: {}, subjectaltname: 'IP Address:::1' } + }, + + // IPv6 hosts and SANs are matched canonically. + { + host: '2001:db8::1', + cert: { subject: {}, subjectaltname: 'IP Address:2001:DB8:0:0:0:0:0:1' } + }, + + // A non-matching IPv6 "IP Address:" SAN is rejected. + { + host: '::1', + cert: { subject: {}, subjectaltname: 'IP Address:::2' }, + error: 'IP: ::1 is not in the cert\'s list: ::2' + }, + // But not when it's a CIDR. { host: '8.8.8.8', diff --git a/test/parallel/test-tls-client-mindhsize.js b/test/parallel/test-tls-client-mindhsize.js index fa494c583a2f..d777a9bfa97f 100644 --- a/test/parallel/test-tls-client-mindhsize.js +++ b/test/parallel/test-tls-client-mindhsize.js @@ -5,7 +5,7 @@ if (!common.hasCrypto) common.skip('missing crypto'); // OpenSSL has a set of security levels which affect what algorithms -// are available by default. Different OpenSSL veresions have different +// are available by default. Different OpenSSL versions have different // default security levels and we use this value to adjust what a test // expects based on the security level. You can read more in // https://docs.openssl.org/1.1.1/man3/SSL_CTX_set_security_level/#default-callback-behaviour diff --git a/test/parallel/test-tls-connect-secure-context.js b/test/parallel/test-tls-connect-secure-context.js index a0d9170c2090..442973118a56 100644 --- a/test/parallel/test-tls-connect-secure-context.js +++ b/test/parallel/test-tls-connect-secure-context.js @@ -23,6 +23,9 @@ connect({ return cleanup(); })); +// Invalid dhparam input is silently discarded for compatibility. +tls.createSecureContext({ dhparam: fixtures.readKey('ec-key.pem') }); + connect({ client: { servername: 'agent1', diff --git a/test/parallel/test-tls-dhe.js b/test/parallel/test-tls-dhe.js index b788d1532938..83af6daccbd0 100644 --- a/test/parallel/test-tls-dhe.js +++ b/test/parallel/test-tls-dhe.js @@ -37,7 +37,7 @@ const { } = require('../common/crypto'); // OpenSSL has a set of security levels which affect what algorithms -// are available by default. Different OpenSSL veresions have different +// are available by default. Different OpenSSL versions have different // default security levels and we use this value to adjust what a test // expects based on the security level. You can read more in // https://docs.openssl.org/1.1.1/man3/SSL_CTX_set_security_level/#default-callback-behaviour diff --git a/test/parallel/test-tls-get-ca-certificates-worker-no-use-system-ca.js b/test/parallel/test-tls-get-ca-certificates-worker-no-use-system-ca.js new file mode 100644 index 000000000000..16ed20e9a8c8 --- /dev/null +++ b/test/parallel/test-tls-get-ca-certificates-worker-no-use-system-ca.js @@ -0,0 +1,60 @@ +'use strict'; +// Flags: --no-use-system-ca + +// This tests that NODE_USE_SYSTEM_CA can be +// overridden by --no-use-system-ca. + +const common = require('../common'); +if (!common.hasCrypto) common.skip('missing crypto'); + +const assert = require('assert'); +const tls = require('tls'); +const { once } = require('events'); +const { Worker } = require('worker_threads'); +const fixtures = require('../common/fixtures'); + +const systemCerts = tls.getCACertificates('system'); +if (systemCerts.length === 0) { + common.skip('No trusted system certificates installed. Skip.'); +} + +async function runWorker({ execArgv, env }) { + const worker = new Worker( + fixtures.path('tls-get-ca-certificates-worker.js'), + { execArgv, env }, + ); + worker.once('error', common.mustNotCall()); + const exitPromise = once(worker, 'exit'); + const messagePromise = once(worker, 'message'); + const [message] = await messagePromise; + const [exitCode] = await exitPromise; + assert.strictEqual(exitCode, 0); + return message; +} + +(async () => { + // with --no-use-system-ca. + assert.strictEqual( + tls.getCACertificates('default').length, + tls.getCACertificates('bundled').length, + ); + + const envEnabled = await runWorker({ + execArgv: [], + env: { ...process.env, NODE_USE_SYSTEM_CA: '1' }, + }); + + assert.strictEqual(envEnabled.systemLen, systemCerts.length); + assert.strictEqual( + envEnabled.defaultLen, + envEnabled.bundledLen + envEnabled.systemLen, + ); + + const flagDisabled = await runWorker({ + execArgv: ['--no-use-system-ca'], + env: { ...process.env, NODE_USE_SYSTEM_CA: '1' }, + }); + + assert.strictEqual(flagDisabled.systemLen, systemCerts.length); + assert.strictEqual(flagDisabled.defaultLen, flagDisabled.bundledLen); +})().then(common.mustCall()); diff --git a/test/parallel/test-tls-get-ca-certificates-worker-use-system-ca.js b/test/parallel/test-tls-get-ca-certificates-worker-use-system-ca.js new file mode 100644 index 000000000000..a07c4ffe93d4 --- /dev/null +++ b/test/parallel/test-tls-get-ca-certificates-worker-use-system-ca.js @@ -0,0 +1,47 @@ +'use strict'; +// Flags: --no-use-system-ca + +// This tests that --use-system-ca is an Environment option (i.e. can be +// enabled/disabled in workers) and that it affects tls.getCACertificates('default'). + +const common = require('../common'); +if (!common.hasCrypto) common.skip('missing crypto'); + +const assert = require('assert'); +const tls = require('tls'); +const { once } = require('events'); +const { Worker } = require('worker_threads'); +const fixtures = require('../common/fixtures'); + +const systemCerts = tls.getCACertificates('system'); +if (systemCerts.length === 0) { + common.skip('No trusted system certificates installed. Skip.'); +} +async function runWorker(execArgv) { + const worker = new Worker( + fixtures.path('tls-get-ca-certificates-worker.js'), + { execArgv }, + ); + worker.once('error', common.mustNotCall()); + const exitPromise = once(worker, 'exit'); + const messagePromise = once(worker, 'message'); + const [message] = await messagePromise; + const [exitCode] = await exitPromise; + assert.strictEqual(exitCode, 0); + return message; +} + +(async () => { + const withSystemCA = await runWorker(['--use-system-ca']); + assert.strictEqual(withSystemCA.systemLen, systemCerts.length); + + assert.strictEqual( + withSystemCA.defaultLen, + withSystemCA.bundledLen + withSystemCA.systemLen, + ); + + assert.strictEqual( + tls.getCACertificates('default').length, + tls.getCACertificates('bundled').length, + ); +})().then(common.mustCall()); diff --git a/test/parallel/test-tls-min-max-version.js b/test/parallel/test-tls-min-max-version.js index abddbbeb0eba..88dce9f4b8e6 100644 --- a/test/parallel/test-tls-min-max-version.js +++ b/test/parallel/test-tls-min-max-version.js @@ -200,7 +200,7 @@ test(U, U, 'TLSv1_2_method', U, U, 'TLSv1_2_method', 'TLSv1.2'); test(U, U, 'TLSv1_1_method', U, U, 'TLSv1_1_method', 'TLSv1.1'); test(U, U, 'TLSv1_method', U, U, 'TLSv1_method', 'TLSv1'); -// The default default. +// The default configuration. if (DEFAULT_MIN_VERSION === 'TLSv1.2') { test(U, U, 'TLSv1_1_method', U, U, U, U, 'ERR_SSL_TLSV1_ALERT_PROTOCOL_VERSION', @@ -215,7 +215,7 @@ if (DEFAULT_MIN_VERSION === 'TLSv1.2') { test(U, U, U, U, U, 'TLSv1_method', U, 'ERR_SSL_UNSUPPORTED_PROTOCOL', 'ERR_SSL_WRONG_VERSION_NUMBER'); } else { - // TLS1.3 client hellos are are not understood by TLS1.1 or below. + // TLS1.3 client hellos are not understood by TLS1.1 or below. test(U, U, U, U, U, 'TLSv1_1_method', U, 'ERR_SSL_TLSV1_ALERT_PROTOCOL_VERSION', 'ERR_SSL_UNSUPPORTED_PROTOCOL'); @@ -237,7 +237,7 @@ if (DEFAULT_MIN_VERSION === 'TLSv1.1') { test(U, U, U, U, U, 'TLSv1_method', U, 'ERR_SSL_UNSUPPORTED_PROTOCOL', 'ERR_SSL_WRONG_VERSION_NUMBER'); } else { - // TLS1.3 client hellos are are not understood by TLS1.1 or below. + // TLS1.3 client hellos are not understood by TLS1.1 or below. test(U, U, U, U, U, 'TLSv1_method', U, 'ERR_SSL_TLSV1_ALERT_PROTOCOL_VERSION', 'ERR_SSL_UNSUPPORTED_PROTOCOL'); diff --git a/test/parallel/test-tls-psk-alpn-callback-exception-handling.js b/test/parallel/test-tls-psk-alpn-callback-exception-handling.js index 7bac4d62110f..16ae56eef8af 100644 --- a/test/parallel/test-tls-psk-alpn-callback-exception-handling.js +++ b/test/parallel/test-tls-psk-alpn-callback-exception-handling.js @@ -95,10 +95,7 @@ describe('TLS callback exception handling', () => { reject(e); } })); - - server.on('secureConnection', common.mustNotCall(() => { - reject(new Error('secureConnection should not fire')); - })); + server.on('secureConnection', common.mustNotCall('secureConnection listener')); await new Promise((res) => server.listen(0, res)); @@ -113,7 +110,7 @@ describe('TLS callback exception handling', () => { }), }); - client.on('error', () => {}); + client.on('error', common.mustCall()); await promise; }); @@ -307,9 +304,7 @@ describe('TLS callback exception handling', () => { } })); - server.on('secureConnection', common.mustNotCall(() => { - reject(new Error('secureConnection should not fire')); - })); + server.on('secureConnection', common.mustNotCall('secureConnection should not fire')); await new Promise((res) => server.listen(0, res)); @@ -324,7 +319,7 @@ describe('TLS callback exception handling', () => { }), }); - client.on('error', () => {}); + client.on('error', common.mustCall()); await promise; }); @@ -354,10 +349,7 @@ describe('TLS callback exception handling', () => { reject(e); } })); - - server.on('secureConnection', common.mustNotCall(() => { - reject(new Error('secureConnection should not fire')); - })); + server.on('secureConnection', common.mustNotCall('secureConnection listener')); await new Promise((res) => server.listen(0, res)); @@ -368,7 +360,7 @@ describe('TLS callback exception handling', () => { ALPNProtocols: ['http/1.1', 'h2'], }); - client.on('error', () => {}); + client.on('error', common.mustCall()); await promise; }); @@ -397,10 +389,8 @@ describe('TLS callback exception handling', () => { reject(e); } })); + server.on('secureConnection', common.mustNotCall('secureConnection listener')); - server.on('secureConnection', common.mustNotCall(() => { - reject(new Error('secureConnection should not fire')); - })); await new Promise((res) => server.listen(0, res)); const client = tls.connect({ @@ -410,7 +400,7 @@ describe('TLS callback exception handling', () => { ALPNProtocols: ['http/1.1'], }); - client.on('error', () => {}); + client.on('error', common.mustCall()); await promise; }); @@ -429,9 +419,7 @@ describe('TLS callback exception handling', () => { const { promise, resolve, reject } = createTestPromise(); - server.on('secureConnection', common.mustNotCall(() => { - reject(new Error('secureConnection should not fire')); - })); + server.on('secureConnection', common.mustNotCall('secureConnection listener')); await new Promise((res) => server.listen(0, res)); @@ -473,9 +461,7 @@ describe('TLS callback exception handling', () => { const { promise, resolve, reject } = createTestPromise(); - server.on('secureConnection', common.mustNotCall(() => { - reject(new Error('secureConnection should not fire')); - })); + server.on('secureConnection', common.mustNotCall('secureConnection listener')); await new Promise((res) => server.listen(0, res)); @@ -526,10 +512,7 @@ describe('TLS callback exception handling', () => { reject(e); } })); - - server.on('secureConnection', () => { - reject(new Error('secureConnection should not fire')); - }); + server.on('secureConnection', common.mustNotCall('secureConnection listener')); await new Promise((res) => server.listen(0, res)); @@ -540,7 +523,7 @@ describe('TLS callback exception handling', () => { rejectUnauthorized: false, }); - client.on('error', () => {}); + client.on('error', common.mustCall()); await promise; }); @@ -573,10 +556,7 @@ describe('TLS callback exception handling', () => { reject(e); } })); - - server.on('secureConnection', () => { - reject(new Error('secureConnection should not fire')); - }); + server.on('secureConnection', common.mustNotCall('secureConnection listener')); await new Promise((res) => server.listen(0, res)); @@ -587,7 +567,7 @@ describe('TLS callback exception handling', () => { rejectUnauthorized: false, }); - client.on('error', () => {}); + client.on('error', common.mustCall()); await promise; }); diff --git a/test/parallel/test-urlpattern.js b/test/parallel/test-urlpattern.js index 96c431f5b87f..42bdd114f43d 100644 --- a/test/parallel/test-urlpattern.js +++ b/test/parallel/test-urlpattern.js @@ -26,3 +26,27 @@ assert.throws(() => { }, { message: 'boom' }); + +{ + const result = new URLPattern({ pathname: '/:value' }) + .exec('https://example.com/test'); + + assert.deepStrictEqual(Object.keys(result), [ + 'hash', + 'hostname', + 'inputs', + 'password', + 'pathname', + 'port', + 'protocol', + 'search', + 'username', + ]); + assert.deepStrictEqual(Object.keys(result.pathname), [ + 'groups', + 'input', + ]); + assert.strictEqual(result.hostname.input, 'example.com'); + assert.strictEqual(result.pathname.input, '/test'); + assert.strictEqual(result.pathname.groups.value, 'test'); +} diff --git a/test/parallel/test-util-inspect.js b/test/parallel/test-util-inspect.js index 118f884291b3..c8b37f2a264b 100644 --- a/test/parallel/test-util-inspect.js +++ b/test/parallel/test-util-inspect.js @@ -107,7 +107,7 @@ assert.strictEqual(util.inspect({}), '{}'); assert.strictEqual(util.inspect({ a: 1 }), '{ a: 1 }'); assert.strictEqual(util.inspect({ a: function() {} }), '{ a: [Function: a] }'); assert.strictEqual(util.inspect({ a: () => {} }), '{ a: [Function: a] }'); -// eslint-disable-next-line func-name-matching +// eslint-disable-next-line node-core/func-name-matching assert.strictEqual(util.inspect({ a: async function abc() {} }), '{ a: [AsyncFunction: abc] }'); assert.strictEqual(util.inspect({ a: async () => {} }), diff --git a/test/parallel/test-v8-collect-gc-profile-minor-ms.js b/test/parallel/test-v8-collect-gc-profile-minor-ms.js new file mode 100644 index 000000000000..1f00470da6c1 --- /dev/null +++ b/test/parallel/test-v8-collect-gc-profile-minor-ms.js @@ -0,0 +1,16 @@ +// Flags: --expose-gc --minor-ms +'use strict'; + +require('../common'); +const assert = require('assert'); +const { GCProfiler } = require('v8'); + +const profiler = new GCProfiler(); +profiler.start(); +global.gc({ type: 'minor', execution: 'sync' }); + +const profile = profiler.stop(); +assert.deepStrictEqual( + profile.statistics.map(({ gcType }) => gcType), + ['MinorMarkSweep'], +); diff --git a/test/parallel/test-wasm.mjs b/test/parallel/test-wasm.mjs new file mode 100644 index 000000000000..fa792941a0db --- /dev/null +++ b/test/parallel/test-wasm.mjs @@ -0,0 +1,44 @@ +import '../common/index.mjs'; +import assert from 'node:assert'; +import * as fixtures from '../common/fixtures.mjs'; + +// Test Wasm JSPI +{ + const asyncImport = async (x) => { + await new Promise((resolve) => setTimeout(resolve, 10)); + return x + 42; + }; + + /** + * wasm/jspi.wasm contains: + * + * (module + * (type (;0;) (func (param i32) (result i32))) + * (import "js" "async" (func $async (;0;) (type 0))) + * (export "test" (func $test)) + * (func $test (;1;) (type 0) (param $x i32) (result i32) + * local.get $x + * call $async + * ) + * ) + * + * Which is the JS equivalent to: + * + * import { async_ } from 'js'; + * export function test (val) { + * return async_(val); + * } + * + * JSPI then allows turning this sync style Wasm call into async code + * that suspends on the promise. + */ + + const { instance } = await WebAssembly.instantiate(fixtures.readSync('wasm/jspi.wasm'), { + js: { + async: new WebAssembly.Suspending(asyncImport), + }, + }); + + const promisingExport = WebAssembly.promising(instance.exports.test); + assert.strictEqual(await promisingExport(10), 52); +} diff --git a/test/parallel/test-webcrypto-digest-turboshake-rfc.js b/test/parallel/test-webcrypto-digest-turboshake-rfc.js index 43762fecc2c4..271fde76ab23 100644 --- a/test/parallel/test-webcrypto-digest-turboshake-rfc.js +++ b/test/parallel/test-webcrypto-digest-turboshake-rfc.js @@ -326,6 +326,15 @@ async function checkDigest(name, vectors) { else algorithm.domainSeparation = rest[0]; } + + if (isKT && algorithm.customization?.byteLength > 512) { + await assert.rejects(subtle.digest(algorithm, input), { + name: 'OperationError', + message: 'KangarooTwelveParams.customization must be at most 512 bytes', + }); + continue; + } + const result = await subtle.digest(algorithm, input); assert.deepStrictEqual( Buffer.from(result).toString('hex'), diff --git a/test/parallel/test-webcrypto-digest-turboshake.js b/test/parallel/test-webcrypto-digest-turboshake.js index 0b5586b19286..a6f4b2d50f94 100644 --- a/test/parallel/test-webcrypto-digest-turboshake.js +++ b/test/parallel/test-webcrypto-digest-turboshake.js @@ -155,11 +155,22 @@ async function testDigest(size, alg) { // KT128 with customization string (async () => { - const digest = await subtle.digest( - { name: 'KT128', outputLength: 256, customization: Buffer.from('test') }, - Buffer.from('hello')); + const digest = await subtle.digest({ + name: 'KT128', + outputLength: 256, + customization: Buffer.alloc(512), + }, Buffer.from('hello')); assert(digest instanceof ArrayBuffer); assert.strictEqual(digest.byteLength, 32); + + await assert.rejects(subtle.digest({ + name: 'KT128', + outputLength: 256, + customization: Buffer.alloc(513), + }, Buffer.from('hello')), { + name: 'OperationError', + message: 'KangarooTwelveParams.customization must be at most 512 bytes', + }); })().then(common.mustCall()); // TurboSHAKE domain separation out of range diff --git a/test/parallel/test-webstreams-pipeto-write-request.js b/test/parallel/test-webstreams-pipeto-write-request.js new file mode 100644 index 000000000000..23e973a400da --- /dev/null +++ b/test/parallel/test-webstreams-pipeto-write-request.js @@ -0,0 +1,162 @@ +// Flags: --expose-internals --no-warnings +'use strict'; + +// Exercises writableStreamDefaultWriterWriteWithRequest: settle paths +// and the latched precondition failures. + +const common = require('../common'); +const assert = require('assert'); + +const { + WritableStream, + WritableStreamDefaultWriter, + ReadableStream, +} = require('stream/web'); + +const { + writableStreamDefaultWriterWriteWithRequest, +} = require('internal/webstreams/writablestream'); + +function makeRequest(overrides = {}) { + return { + promise: null, + pending: 0, + failed: false, + failure: undefined, + resolve: common.mustNotCall('resolve'), + reject: common.mustNotCall('reject'), + ...overrides, + }; +} + +{ + // A write to a writable destination bumps `pending` and settles through + // request.resolve(). + const request = makeRequest({ + resolve: common.mustCall(function() { + assert.strictEqual(this, request); + assert.strictEqual(this.pending, 1); + assert.strictEqual(this.failed, false); + }), + }); + const ws = new WritableStream({ + write: common.mustCall((chunk) => { + assert.strictEqual(chunk, 'chunk'); + }), + }); + const writer = new WritableStreamDefaultWriter(ws); + writableStreamDefaultWriterWriteWithRequest(writer, 'chunk', request); + assert.strictEqual(request.pending, 1); +} + +{ + // A write whose sink rejects settles through request.reject() with the + // sink's error. + const error = new Error('sink failure'); + const request = makeRequest({ + reject: common.mustCall(function(reason) { + assert.strictEqual(this, request); + assert.strictEqual(reason, error); + }), + }); + const ws = new WritableStream({ + write: common.mustCall(() => Promise.reject(error)), + }); + const writer = new WritableStreamDefaultWriter(ws); + writableStreamDefaultWriterWriteWithRequest(writer, 'chunk', request); + assert.strictEqual(request.pending, 1); +} + +{ + // Writing to an errored destination latches the stored error without + // queueing the write. + const error = new Error('start failure'); + const ws = new WritableStream({ + start(controller) { controller.error(error); }, + }); + queueMicrotask(common.mustCall(() => { + const writer = new WritableStreamDefaultWriter(ws); + const request = makeRequest(); + writableStreamDefaultWriterWriteWithRequest(writer, 'chunk', request); + assert.strictEqual(request.pending, 0); + assert.strictEqual(request.failed, true); + assert.strictEqual(request.failure, error); + })); +} + +{ + // Writing to a destination with a queued close latches an + // ERR_INVALID_STATE TypeError. + const ws = new WritableStream({}); + const writer = new WritableStreamDefaultWriter(ws); + writer.close().then(common.mustCall()); + const request = makeRequest(); + writableStreamDefaultWriterWriteWithRequest(writer, 'chunk', request); + assert.strictEqual(request.pending, 0); + assert.strictEqual(request.failed, true); + assert.match(request.failure.message, /WritableStream is closed/); +} + +{ + // Writing to an erroring destination latches the abort reason. The + // stream stays in the 'erroring' state until its start algorithm + // settles, so aborting right after construction reaches it + // deterministically. + const reason = new Error('abort reason'); + const ws = new WritableStream({}); + const writer = new WritableStreamDefaultWriter(ws); + writer.abort(reason).then(common.mustCall()); + const request = makeRequest(); + writableStreamDefaultWriterWriteWithRequest(writer, 'chunk', request); + assert.strictEqual(request.pending, 0); + assert.strictEqual(request.failed, true); + assert.strictEqual(request.failure, reason); +} + +{ + // A size algorithm that detaches the writer makes the write latch a + // mismatched-streams error. + let writer; + const ws = new WritableStream({}, { + size: common.mustCall(() => { + writer.releaseLock(); + return 1; + }), + highWaterMark: 1, + }); + writer = new WritableStreamDefaultWriter(ws); + const request = makeRequest(); + writableStreamDefaultWriterWriteWithRequest(writer, 'chunk', request); + assert.strictEqual(request.pending, 0); + assert.strictEqual(request.failed, true); + assert.match(request.failure.message, /Mismatched WritableStreams/); +} + +{ + // End to end: aborting a pipe with a write in flight still waits for + // the in-flight write before aborting the destination, and the pipe + // rejects with an AbortError. + const ac = new AbortController(); + const order = []; + const { promise: gate, resolve: openGate } = Promise.withResolvers(); + let i = 0; + const rs = new ReadableStream({ + pull(controller) { controller.enqueue(i++); }, + }); + const pipe = rs.pipeTo(new WritableStream({ + write: common.mustCall((chunk) => { + order.push(`write:${chunk}`); + ac.abort(); + queueMicrotask(() => { + order.push('settle:0'); + openGate(); + }); + return gate; + }), + abort: common.mustCall(() => { + order.push('abort'); + assert.deepStrictEqual(order, ['write:0', 'settle:0', 'abort']); + }), + }), { signal: ac.signal }); + assert.rejects(pipe, { name: 'AbortError' }).then(common.mustCall()); +} diff --git a/test/parallel/test-webstreams-queue-wraparound.js b/test/parallel/test-webstreams-queue-wraparound.js new file mode 100644 index 000000000000..15ffc59689b9 --- /dev/null +++ b/test/parallel/test-webstreams-queue-wraparound.js @@ -0,0 +1,178 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); + +// Regression test for the ring-buffer [[queue]] backing store used by the +// WHATWG stream controllers: exercises growth, wrap-around, drain-rewind +// and shrink behavior through the public API only. + +async function testDeepDefaultQueue() { + // Queue 3000 chunks before reading anything: the backing ring must grow + // (and re-linearize) repeatedly, then fully drain (shrink on rewind). + const rs = new ReadableStream({ + start(controller) { + for (let i = 0; i < 3000; i++) + controller.enqueue(i); + controller.close(); + }, + }, { highWaterMark: Infinity }); + + const reader = rs.getReader(); + for (let i = 0; i < 3000; i++) { + const { value, done } = await reader.read(); + assert.strictEqual(done, false); + assert.strictEqual(value, i); + } + const { done } = await reader.read(); + assert.strictEqual(done, true); +} + +async function testInterleavedWraparound() { + // Interleave enqueues and reads so head/tail wrap around the ring many + // times without ever growing it, including repeated empty transitions. + let enqueued = 0; + let controller; + const rs = new ReadableStream({ + start(c) { + controller = c; + }, + }); + + const reader = rs.getReader(); + let expected = 0; + for (let round = 0; round < 500; round++) { + const burst = (round % 3) + 1; + for (let i = 0; i < burst; i++) + controller.enqueue(enqueued++); + for (let i = 0; i < burst; i++) { + const { value, done } = await reader.read(); + assert.strictEqual(done, false); + assert.strictEqual(value, expected++); + } + } + assert.strictEqual(expected, enqueued); +} + +async function testCustomSizesSurviveQueueing() { + // Fractional and zero sizes must round-trip through the queue exactly + // (desiredSize accounting depends on the stored per-chunk size). + const sizes = [0.25, 0, 1.75, 3, 0.5]; + const chunks = ['a', 'b', 'c', 'd', 'e']; + let controller; + const rs = new ReadableStream({ + start(c) { + controller = c; + }, + }, { + highWaterMark: 10, + size(chunk) { + return sizes[chunks.indexOf(chunk)]; + }, + }); + + let expectedDesired = 10; + for (let i = 0; i < chunks.length; i++) { + controller.enqueue(chunks[i]); + expectedDesired -= sizes[i]; + assert.strictEqual(controller.desiredSize, expectedDesired); + } + const reader = rs.getReader(); + for (let i = 0; i < chunks.length; i++) { + const { value } = await reader.read(); + assert.strictEqual(value, chunks[i]); + expectedDesired += sizes[i]; + assert.strictEqual(controller.desiredSize, expectedDesired); + } +} + +async function testByteQueueUnevenReads() { + // Enqueue 7-byte chunks but read through 4-byte BYOB views: the byte + // queue's head record is partially consumed in place across reads. + const total = 7 * 300; + let written = 0; + const rs = new ReadableStream({ + type: 'bytes', + pull(controller) { + if (written >= total) { + controller.close(); + return; + } + const chunk = new Uint8Array(7); + for (let i = 0; i < 7; i++) + chunk[i] = (written + i) % 251; + written += 7; + controller.enqueue(chunk); + }, + }); + + const reader = rs.getReader({ mode: 'byob' }); + let read = 0; + while (read < total) { + const { value, done } = await reader.read(new Uint8Array(4)); + if (done) break; + for (let i = 0; i < value.length; i++) { + assert.strictEqual(value[i], (read + i) % 251, + `byte ${read + i} mismatch`); + } + read += value.length; + } + assert.strictEqual(read, total); +} + +async function testDeepByteQueueBurst() { + // Fill the byte queue with 2500 records before the default reader + // drains it, forcing ring growth and the drain-to-empty rewind. + const rs = new ReadableStream({ + type: 'bytes', + start(controller) { + for (let i = 0; i < 2500; i++) + controller.enqueue(new Uint8Array([i & 0xff])); + controller.close(); + }, + }); + + const reader = rs.getReader(); + for (let i = 0; i < 2500; i++) { + const { value, done } = await reader.read(); + assert.strictEqual(done, false); + assert.strictEqual(value[0], i & 0xff); + } + const { done } = await reader.read(); + assert.strictEqual(done, true); +} + +async function testWritableQueueBackpressureDrain() { + // Buffer thousands of writes behind a slow sink, then let it drain: + // the writable controller queue grows, wraps, and empties while every + // chunk is delivered in order. + const received = []; + let release; + const gate = new Promise((resolve) => { release = resolve; }); + const ws = new WritableStream({ + async write(chunk) { + if (received.length === 0) await gate; + received.push(chunk); + }, + }, { highWaterMark: 1 }); + + const writer = ws.getWriter(); + const writes = []; + for (let i = 0; i < 2000; i++) + writes.push(writer.write(i)); + release(); + await writer.close(); + await Promise.all(writes); + assert.strictEqual(received.length, 2000); + for (let i = 0; i < 2000; i++) + assert.strictEqual(received[i], i); +} + +(async () => { + await testDeepDefaultQueue(); + await testInterleavedWraparound(); + await testCustomSizesSurviveQueueing(); + await testByteQueueUnevenReads(); + await testDeepByteQueueBurst(); + await testWritableQueueBackpressureDrain(); +})().then(common.mustCall()); diff --git a/test/parallel/test-whatwg-readablestream.js b/test/parallel/test-whatwg-readablestream.js index d1001d51b4e8..0105d4bf723b 100644 --- a/test/parallel/test-whatwg-readablestream.js +++ b/test/parallel/test-whatwg-readablestream.js @@ -37,7 +37,8 @@ const { } = require('internal/webstreams/readablestream'); const { - kState + kState, + Queue, } = require('internal/webstreams/util'); const { @@ -1581,7 +1582,9 @@ class Source { start(c) { controller = c; } }); - controller[kState].pendingPullIntos = [{}]; + const pendingPullIntos = new Queue(); + pendingPullIntos.push({}); + controller[kState].pendingPullIntos = pendingPullIntos; assert.throws(() => readableByteStreamControllerRespond(controller, 0), { code: 'ERR_INVALID_ARG_VALUE', }); diff --git a/test/parallel/test-whatwg-webstreams-adapters-to-readablestream.js b/test/parallel/test-whatwg-webstreams-adapters-to-readablestream.js index 66af7b128c4d..eb01a39d8dc1 100644 --- a/test/parallel/test-whatwg-webstreams-adapters-to-readablestream.js +++ b/test/parallel/test-whatwg-webstreams-adapters-to-readablestream.js @@ -4,6 +4,7 @@ const common = require('../common'); const assert = require('assert'); +const { once } = require('events'); const { newReadableStreamFromStreamReadable, @@ -11,6 +12,7 @@ const { const { Duplex, + PassThrough, Readable, } = require('stream'); @@ -188,11 +190,142 @@ const { } { - const readable = new Readable(); + /** + * Runs the same assertion across finalize-before/after and + * default/BYOB adapter creation orders. + * @param {(readable: Readable) => void | Promise} finalize + * Finalizes the source stream before or after adaptation. + * @param {(readAndAssert: () => Promise, reader: ReadableStreamReader) => Promise} postAssert + * Asserts the resulting web stream state for the current case. + * @param {() => Readable} [createReadable] + * Creates the source stream for each case. + */ + function testConfluence(finalize, postAssert, createReadable = () => new PassThrough()) { + const cases = [false, true].flatMap((finalizeFirst) => [false, true].map((isBYOB) => ({ finalizeFirst, isBYOB }))); + Promise.all(cases.map(async (case_) => { + try { + const { isBYOB } = case_; + const readable = createReadable(); + if (case_.finalizeFirst) { + await finalize(readable); + } + /** @type {ReadableStream} */ + const readableStream = newReadableStreamFromStreamReadable(readable, { type: isBYOB ? 'bytes' : undefined }); + const reader = readableStream.getReader({ mode: isBYOB ? 'byob' : undefined }); + if (!case_.finalizeFirst) { + await finalize(readable); + } + + const readAndAssert = common.mustCall(() => { + return reader.read(isBYOB ? new Uint8Array(1) : undefined).then((result) => { + assert.deepStrictEqual(result, { + value: isBYOB ? new Uint8Array(0) : undefined, + done: true, + }); + }); + }); + await postAssert(readAndAssert, reader); + } catch (cause) { + throw new Error(`Case failed: ${JSON.stringify(case_)}`, { cause }); + } + })).then(common.mustCall()); + } + const error = new Error('boom'); + // Ending the readable without an error => closes the readableStream without an error + testConfluence( + async (readable) => { + readable.resume(); + readable.end(); + await once(readable, 'end'); + }, + common.mustCall(async (readAndAssert, reader) => { + await readAndAssert(); + await reader.closed; + }, 4) + ); + // Prematurely destroying the stream.Readable without an error + // => errors the ReadableStream with a premature close error + testConfluence( + (readable) => readable.destroy(), + common.mustCall(async (readAndAssert, reader) => { + const errorPredicate = { code: 'ABORT_ERR' }; + await assert.rejects(readAndAssert(), errorPredicate); + await assert.rejects(reader.closed, errorPredicate); + }, 4) + ); + // Asynchronously destroyed readable => errors the ReadableStream with a + // premature close error regardless of adapter creation order. + class AsyncDestroyReadable extends Readable { + _read() {} + + _destroy(error, callback) { + setImmediate(callback, error); + } + } + testConfluence( + (readable) => readable.destroy(), + common.mustCall(async (readAndAssert, reader) => { + const errorPredicate = { code: 'ABORT_ERR' }; + await assert.rejects(readAndAssert(), errorPredicate); + await assert.rejects(reader.closed, errorPredicate); + }, 4), + () => new AsyncDestroyReadable() + ); + // Destroying the readable with an error => errors the readableStream + testConfluence( + common.mustCall((readable) => { + readable.on('error', common.mustCall((reason) => { + assert.strictEqual(reason, error); + })); + readable.destroy(error); + }, 4), + common.mustCall(async (readAndAssert, reader) => { + await assert.rejects(readAndAssert(), error); + await assert.rejects(reader.closed, error); + }, 4) + ); +} + +{ + const readable = new PassThrough(); + readable.end(); readable.destroy(); - const readableStream = newReadableStreamFromStreamReadable(readable); - const reader = readableStream.getReader(); - reader.closed.then(common.mustCall()); + + (async () => { + await new Promise((resolve) => readable.once('close', resolve)); + assert.strictEqual(readable.listenerCount('error'), 0); + + const readableStream = newReadableStreamFromStreamReadable(readable); + // Only one error listener from the adapter should be added + assert.strictEqual(readable.listenerCount('error'), 1); + newReadableStreamFromStreamReadable(readable); + // No duplicate listeners should be added. + assert.strictEqual(readable.listenerCount('error'), 1); + + const readResult = await readableStream.getReader().read(); + assert.deepStrictEqual(readResult, { value: undefined, done: true }); + })().then(common.mustCall()); +} + +{ + const readable = new PassThrough(); + const readableStream = newReadableStreamFromStreamReadable(readable, { + type: 'bytes', + }); + const reader = readableStream.getReader({ mode: 'byob' }); + + (async () => { + const readPromise = reader.read(new Uint8Array(8)); + + readable.end(); + await once(readable, 'end'); + + assert.deepStrictEqual(await readPromise, { + value: new Uint8Array(0), + done: true, + }); + await reader.closed; + })().then(common.mustCall()); } { diff --git a/test/parallel/test-whatwg-webstreams-adapters-to-readablewritablepair.js b/test/parallel/test-whatwg-webstreams-adapters-to-readablewritablepair.js index 5062b9e179ac..cbe505ab956a 100644 --- a/test/parallel/test-whatwg-webstreams-adapters-to-readablewritablepair.js +++ b/test/parallel/test-whatwg-webstreams-adapters-to-readablewritablepair.js @@ -10,6 +10,7 @@ const { } = require('internal/webstreams/adapters'); const { + Duplex, PassThrough, } = require('stream'); @@ -254,3 +255,27 @@ const { code: 'ERR_INVALID_ARG_TYPE' }); } + +{ + const duplex = new Duplex({ + allowHalfOpen: false, + read() {}, + write(chunk, enc, cb) { cb(); }, + final(cb) { setImmediate(cb); }, + }); + + const { + readable, + writable, + } = newReadableWritablePairFromDuplex(duplex); + + const reader = readable.getReader(); + const writer = writable.getWriter(); + + duplex.push(null); + + reader.read().then(common.mustCall(({ done }) => { + assert.strictEqual(done, true); + writer.close().then(common.mustCall()); + })); +} diff --git a/test/parallel/test-worker-error-primitive.js b/test/parallel/test-worker-error-primitive.js new file mode 100644 index 000000000000..9914db910441 --- /dev/null +++ b/test/parallel/test-worker-error-primitive.js @@ -0,0 +1,25 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const { Worker } = require('worker_threads'); + +const cases = [ + { code: 'throw "boom";', value: 'boom' }, + { code: 'throw 42;', value: 42 }, + { code: 'throw 7n;', value: 7n }, + { code: 'throw true;', value: true }, + { code: 'throw null;', value: null }, + { code: 'throw undefined;', value: undefined }, + { code: 'throw Symbol.for("a");', value: Symbol.for('a') }, +]; + +for (const { code, value } of cases) { + const worker = new Worker(code, { eval: true }); + worker.on('message', common.mustNotCall()); + worker.on('error', common.mustCall((err) => { + assert.strictEqual(err, value); + })); + worker.on('exit', common.mustCall((exitCode) => { + assert.strictEqual(exitCode, 1); + })); +} diff --git a/test/parallel/test-worker-message-port-transfer-fake-js-transferable-internal.js b/test/parallel/test-worker-message-port-transfer-fake-js-transferable-internal.js index 46895871e0a1..3d33fff65d9d 100644 --- a/test/parallel/test-worker-message-port-transfer-fake-js-transferable-internal.js +++ b/test/parallel/test-worker-message-port-transfer-fake-js-transferable-internal.js @@ -15,10 +15,14 @@ const { once } = require('events'); const kTransfer = Object.getOwnPropertySymbols(Object.getPrototypeOf(fh)) .find((symbol) => symbol.description === 'messaging_transfer_symbol'); assert.strictEqual(typeof kTransfer, 'symbol'); + // Use a module:export pair that is not a registered transferable. net.Socket + // and net.Server are real transferables now, so they would be constructed (and + // then safely reject the bogus data); a nonexistent export keeps exercising + // the "Unknown deserialize spec" allowlist rejection. fh[kTransfer] = () => { return { data: '✨', - deserializeInfo: 'net:Socket' + deserializeInfo: 'net:NotARealTransferable' }; }; @@ -28,6 +32,7 @@ const { once } = require('events'); const [ exception ] = await once(port2, 'messageerror'); - assert.strictEqual(exception.message, 'Unknown deserialize spec net:Socket'); + assert.strictEqual(exception.message, + 'Unknown deserialize spec net:NotARealTransferable'); port2.close(); })().then(common.mustCall()); diff --git a/test/parallel/test-worker-stack-overflow-stack-size.js b/test/parallel/test-worker-stack-overflow-stack-size.js index 481ff55100ac..8aef401ab68c 100644 --- a/test/parallel/test-worker-stack-overflow-stack-size.js +++ b/test/parallel/test-worker-stack-overflow-stack-size.js @@ -8,6 +8,14 @@ const { Worker } = require('worker_threads'); // Verify that Workers don't care about --stack-size, as they have their own // fixed and known stack sizes. +// The depth of the stack depends not only on the stack size, but also on the size of each +// stack frame, which in turn depends on which tier the recursive function happens to be +// running at when the overflow occurs. Under load the background tier-up can land at a +// non-deterministic point in the recursion and flake the test. Keep the recursive +// function in the interpreter with %NeverOptimizeFunction() so the frame size - +// and thus the depth - is deterministic. +v8.setFlagsFromString('--allow-natives-syntax'); + async function runWorker(options = {}) { const empiricalStackDepth = new Uint32Array(new SharedArrayBuffer(4)); const worker = new Worker(` @@ -16,6 +24,7 @@ async function runWorker(options = {}) { empiricalStackDepth[0]++; f(); } + %NeverOptimizeFunction(f); f();`, { eval: true, workerData: { empiricalStackDepth }, diff --git a/test/parallel/test-zlib-truncated.js b/test/parallel/test-zlib-truncated.js index c489388a674e..0f9ce776b1db 100644 --- a/test/parallel/test-zlib-truncated.js +++ b/test/parallel/test-zlib-truncated.js @@ -22,6 +22,12 @@ const errMessage = /unexpected end of file/; { comp: 'gzip', decomp: 'unzip', decompSync: 'unzipSync' }, { comp: 'deflate', decomp: 'inflate', decompSync: 'inflateSync' }, { comp: 'deflateRaw', decomp: 'inflateRaw', decompSync: 'inflateRawSync' }, + { + comp: 'zstdCompress', + decomp: 'zstdDecompress', + decompSync: 'zstdDecompressSync', + partialFlush: zlib.constants.ZSTD_e_flush, + }, ].forEach(function(methods) { zlib[methods.comp](inputString, common.mustSucceed((compressed) => { const truncated = compressed.slice(0, compressed.length / 2); @@ -46,16 +52,59 @@ const errMessage = /unexpected end of file/; assert.match(err.message, errMessage); })); - const syncFlushOpt = { finishFlush: zlib.constants.Z_SYNC_FLUSH }; + const partialFlushOpt = { + finishFlush: methods.partialFlush ?? zlib.constants.Z_SYNC_FLUSH, + }; - // Sync truncated input test, finishFlush = Z_SYNC_FLUSH - const result = toUTF8(zlib[methods.decompSync](truncated, syncFlushOpt)); + // Sync truncated input test with a non-finalizing finish flush. + const result = toUTF8(zlib[methods.decompSync](truncated, partialFlushOpt)); assert.strictEqual(result, inputString.slice(0, result.length)); - // Async truncated input test, finishFlush = Z_SYNC_FLUSH - zlib[methods.decomp](truncated, syncFlushOpt, common.mustSucceed((decompressed) => { + // Async truncated input test with a non-finalizing finish flush. + zlib[methods.decomp](truncated, partialFlushOpt, common.mustSucceed((decompressed) => { const result = toUTF8(decompressed); assert.strictEqual(result, inputString.slice(0, result.length)); })); })); }); + +// A non-zero return from ZSTD_decompressStream() can also mean that the +// output buffer is full. Make sure that is drained before treating the return +// value as truncated input. +{ + const input = Buffer.alloc(zlib.constants.Z_DEFAULT_CHUNK * 2, 0x61); + const compressed = zlib.zstdCompressSync(input); + const decompressed = zlib.zstdDecompressSync(compressed, { + chunkSize: zlib.constants.Z_MIN_CHUNK, + }); + assert.deepStrictEqual(decompressed, input); +} + +// Ending a stream after a previous write completed a frame must not be +// mistaken for an empty, truncated frame. +{ + const input = Buffer.from(inputString); + const compressed = zlib.zstdCompressSync(input); + const decompressor = zlib.createZstdDecompress(); + const output = []; + + decompressor.on('data', (chunk) => output.push(chunk)); + decompressor.on('end', common.mustCall(() => { + assert.deepStrictEqual(Buffer.concat(output), input); + })); + decompressor.write(compressed, common.mustCall(() => decompressor.end())); +} + +// Conversely, ending after a previous write supplied only part of a frame +// must report that the frame is incomplete. +{ + const compressed = zlib.zstdCompressSync(inputString); + const truncated = compressed.subarray(0, compressed.length / 2); + const decompressor = zlib.createZstdDecompress(); + + decompressor.on('error', common.mustCall((error) => { + assert.match(error.message, errMessage); + })); + decompressor.write(truncated, common.mustCall(() => decompressor.end())); + decompressor.resume(); +} diff --git a/test/parallel/test-zlib-zstd-dictionary.js b/test/parallel/test-zlib-zstd-dictionary.js index 28dde28cb055..41b2ab90238c 100644 --- a/test/parallel/test-zlib-zstd-dictionary.js +++ b/test/parallel/test-zlib-zstd-dictionary.js @@ -24,3 +24,19 @@ zlib.zstdCompress(input, { dictionary }, common.mustSucceed((compressed) => { assert.strictEqual(decompressed.toString(), input.toString()); })); })); + +const baseline = zlib.zstdCompressSync(input, { dictionary }).length; + +const arrayBuffer = dictionary.buffer.slice( + dictionary.byteOffset, dictionary.byteOffset + dictionary.byteLength); +const uint8 = new Uint8Array(arrayBuffer); +const dataView = new DataView(arrayBuffer); + +for (const dict of [arrayBuffer, uint8, dataView]) { + assert.strictEqual(zlib.zstdCompressSync(input, { dictionary: dict }).length, + baseline); + + const compressed = zlib.zstdCompressSync(input, { dictionary: dict }); + const decompressed = zlib.zstdDecompressSync(compressed, { dictionary: dict }); + assert.strictEqual(decompressed.toString(), input.toString()); +} diff --git a/test/parallel/test-zlib-zstd-pledged-src-size.js b/test/parallel/test-zlib-zstd-pledged-src-size.js index b1e32e14ae73..4a5f27394c66 100644 --- a/test/parallel/test-zlib-zstd-pledged-src-size.js +++ b/test/parallel/test-zlib-zstd-pledged-src-size.js @@ -35,3 +35,39 @@ compressWithPledgedSrcSize({ pledgedSrcSize: 42, actualSrcSize: 0 }); compressWithPledgedSrcSize({ pledgedSrcSize: 42, actualSrcSize: 13 }); compressWithPledgedSrcSize({ pledgedSrcSize: 42, actualSrcSize: 42 }); + +function assertInvalidPledgedSrcSize(pledgedSrcSize, expected) { + assert.throws( + () => zlib.createZstdCompress({ pledgedSrcSize }), + expected, + ); + assert.throws( + () => zlib.zstdCompressSync('', { pledgedSrcSize }), + expected, + ); +} + +for (const pledgedSrcSize of ['1', null]) { + assertInvalidPledgedSrcSize(pledgedSrcSize, { + name: 'TypeError', + code: 'ERR_INVALID_ARG_TYPE', + }); +} + +for (const pledgedSrcSize of [ + NaN, + Infinity, + -Infinity, + 1.9, + -1, + Number.MAX_SAFE_INTEGER + 1, +]) { + assertInvalidPledgedSrcSize(pledgedSrcSize, { + name: 'RangeError', + code: 'ERR_OUT_OF_RANGE', + }); +} + +zlib.createZstdCompress({ + pledgedSrcSize: Number.MAX_SAFE_INTEGER, +}).destroy(); diff --git a/test/sequential/sequential.status b/test/sequential/sequential.status index 627e61911d15..01a021130c15 100644 --- a/test/sequential/sequential.status +++ b/test/sequential/sequential.status @@ -13,10 +13,6 @@ test-watch-mode-inspect: PASS, FLAKY # https://github.com/nodejs/node/issues/47409 test-http2-large-file: PASS, FLAKY -[$system==win32] -# https://github.com/nodejs/node/issues/47409 -test-http2-large-file: PASS, FLAKY - [$system==linux] # https://github.com/nodejs/node/issues/54817 test-http-server-request-timeouts-mixed: PASS, FLAKY diff --git a/test/sequential/test-debug-prompt.js b/test/sequential/test-debug-prompt.js index e32f46469005..59a1461c98e6 100644 --- a/test/sequential/test-debug-prompt.js +++ b/test/sequential/test-debug-prompt.js @@ -2,17 +2,45 @@ const common = require('../common'); common.skipIfInspectorDisabled(); +const assert = require('assert'); +const fixtures = require('../common/fixtures'); const spawn = require('child_process').spawn; -const proc = spawn(process.execPath, ['inspect', 'foo']); +const proc = spawn(process.execPath, [ + 'inspect', fixtures.path('debugger', 'alive.js'), +]); proc.stdout.setEncoding('utf8'); -let needToSendExit = true; +const TIMEOUT = common.platformTimeout(10_000); let output = ''; -proc.stdout.on('data', (data) => { - output += data; - if (output.includes('debug> ') && needToSendExit) { - proc.stdin.write('.exit\n'); - needToSendExit = false; - } -}); +let promptSeen = false; + +(async () => { + await new Promise((resolve, reject) => { + const timer = setTimeout(() => { + proc.kill(); + reject(new Error(`Timed out waiting for the debugger prompt; output: ${output}`)); + }, TIMEOUT); + + proc.stdout.on('data', (data) => { + output += data; + if (output.includes('debug> ') && !promptSeen) { + promptSeen = true; + proc.stdin.end('.exit\n'); + } + }); + + proc.once('error', reject); + proc.once('close', common.mustCall((code, signal) => { + clearTimeout(timer); + if (!promptSeen) { + reject(new Error( + `Debugger exited before showing the prompt (code ${code}, signal ${signal}); ` + + `output: ${output}`)); + return; + } + assert.strictEqual(code, 0); + resolve(); + })); + }); +})().then(common.mustCall()); diff --git a/test/system-ca/test-use-system-ca-worker-disable.mjs b/test/system-ca/test-use-system-ca-worker-disable.mjs new file mode 100644 index 000000000000..43f3f2937602 --- /dev/null +++ b/test/system-ca/test-use-system-ca-worker-disable.mjs @@ -0,0 +1,78 @@ +// Flags: --use-system-ca + +// Verify that a worker can disable the system CA store while the parent uses it. + +import * as common from '../common/index.mjs'; +import assert from 'node:assert/strict'; +import https from 'node:https'; +import fixtures from '../common/fixtures.js'; +import { it, beforeEach, afterEach, describe } from 'node:test'; +import { once } from 'events'; +import { Worker } from 'node:worker_threads'; + +if (!common.hasCrypto) { + common.skip('requires crypto'); +} + +// To run this test, the system needs to be configured to trust +// the CA certificate first (which needs an interactive GUI approval, e.g. TouchID): +// see the README.md in this folder for instructions on how to do this. +const handleRequest = (req, res) => { + const path = req.url; + switch (path) { + case '/hello-world': + res.writeHead(200); + res.end('hello world\n'); + break; + default: + common.mustNotCall(`Unexpected path: ${path}`)(); + } +}; + +describe('use-system-ca', function() { + async function setupServer(key, cert) { + const theServer = https.createServer( + { + key: fixtures.readKey(key), + cert: fixtures.readKey(cert), + }, + handleRequest, + ); + theServer.listen(0); + await once(theServer, 'listening'); + + return theServer; + } + + let server; + + beforeEach(async function() { + server = await setupServer('agent8-key.pem', 'agent8-cert.pem'); + }); + + it('trusts a valid root certificate', async function() { + const url = `https://localhost:${server.address().port}/hello-world`; + const worker = new Worker(fixtures.path('system-ca', 'fetch-worker.mjs'), { + execArgv: ['--no-use-system-ca'], + workerData: { url }, + }); + await fetch(url); + + const [message] = await once(worker, 'message'); + assert.strictEqual(message.ok, false); + assert( + message.code === 'UNABLE_TO_VERIFY_LEAF_SIGNATURE' || + message.code === 'SELF_SIGNED_CERT_IN_CHAIN', + `Expected certificate verification error but got: ${JSON.stringify( + message, + )}`, + ); + + const [exitCode] = await once(worker, 'exit'); + assert.strictEqual(exitCode, 0); + }); + + afterEach(async function() { + server?.close(); + }); +}); diff --git a/test/system-ca/test-use-system-ca-worker-enable.mjs b/test/system-ca/test-use-system-ca-worker-enable.mjs new file mode 100644 index 000000000000..f5f3faab4814 --- /dev/null +++ b/test/system-ca/test-use-system-ca-worker-enable.mjs @@ -0,0 +1,78 @@ +// Flags: --no-use-system-ca + +// Verify that a worker can enable the system CA store while the parent disables it. + +import * as common from '../common/index.mjs'; +import assert from 'node:assert/strict'; +import https from 'node:https'; +import fixtures from '../common/fixtures.js'; +import { it, beforeEach, afterEach, describe } from 'node:test'; +import { once } from 'events'; +import { Worker } from 'node:worker_threads'; + +if (!common.hasCrypto) { + common.skip('requires crypto'); +} + +// To run this test, the system needs to be configured to trust +// the CA certificate first (which needs an interactive GUI approval, e.g. TouchID): +// see the README.md in this folder for instructions on how to do this. +const handleRequest = (req, res) => { + const path = req.url; + switch (path) { + case '/hello-world': + res.writeHead(200); + res.end('hello world\n'); + break; + default: + common.mustNotCall(`Unexpected path: ${path}`)(); + } +}; + +describe('use-system-ca', function() { + async function setupServer(key, cert) { + const theServer = https.createServer( + { + key: fixtures.readKey(key), + cert: fixtures.readKey(cert), + }, + handleRequest, + ); + theServer.listen(0); + await once(theServer, 'listening'); + + return theServer; + } + + let server; + + beforeEach(async function() { + server = await setupServer('agent8-key.pem', 'agent8-cert.pem'); + }); + + it('trusts a valid root certificate', async function() { + const url = `https://localhost:${server.address().port}/hello-world`; + const worker = new Worker(fixtures.path('system-ca', 'fetch-worker.mjs'), { + execArgv: ['--use-system-ca'], + workerData: { url }, + }); + await assert.rejects(fetch(url), (err) => { + assert.strictEqual(err.cause.code, 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'); + return true; + }); + + const [message] = await once(worker, 'message'); + assert.strictEqual(message.ok, true); + assert.strictEqual( + message.status, + 200, + `Expected status 200, got ${message.status}`, + ); + const [exitCode] = await once(worker, 'exit'); + assert.strictEqual(exitCode, 0); + }); + + afterEach(async function() { + server?.close(); + }); +}); diff --git a/test/test-runner/test-run-watch-cwd-isolation-none-argv.mjs b/test/test-runner/test-run-watch-cwd-isolation-none-argv.mjs index d3faf9e89ef4..1066f8fc5d6c 100644 --- a/test/test-runner/test-run-watch-cwd-isolation-none-argv.mjs +++ b/test/test-runner/test-run-watch-cwd-isolation-none-argv.mjs @@ -2,7 +2,7 @@ // parent process argv when spawning the watch child. import * as common from '../common/index.mjs'; import assert from 'node:assert'; -import { readFileSync, writeFileSync } from 'node:fs'; +import { writeFileSync } from 'node:fs'; import { join } from 'node:path'; import { run } from 'node:test'; import tmpdir from '../common/tmpdir.js'; @@ -11,16 +11,13 @@ import { skipIfNoWatch } from '../common/watch.js'; skipIfNoWatch(); tmpdir.refresh(); -const marker = join(tmpdir.path, 'marker'); writeFileSync(join(tmpdir.path, 'test.js'), ` const test = require('node:test'); -const { writeFileSync } = require('node:fs'); -test('test ran from cwd', () => { - writeFileSync(${JSON.stringify(marker)}, 'ran'); -}); +test('test ran from cwd', () => {}); `); +const passed = []; const controller = new AbortController(); const stream = run({ cwd: tmpdir.path, @@ -36,8 +33,9 @@ const stream = run({ }); stream.on('test:fail', common.mustNotCall()); -stream.on('test:pass', common.mustCall(1)); +stream.on('test:pass', common.mustCall((data) => passed.push(data.name), 1)); // eslint-disable-next-line no-unused-vars for await (const _ of stream); -assert.strictEqual(readFileSync(marker, 'utf8'), 'ran'); +// Validate the expected test ran by name: +assert.deepStrictEqual(passed, ['test ran from cwd']); diff --git a/test/test-runner/test-run-watch-run-duration.mjs b/test/test-runner/test-run-watch-run-duration.mjs index df4b2c73384f..cee8c5aefc17 100644 --- a/test/test-runner/test-run-watch-run-duration.mjs +++ b/test/test-runner/test-run-watch-run-duration.mjs @@ -3,7 +3,7 @@ // considering the number of digits in the duration_ms is 9 // the chances of having the same duration_ms are very low // but not impossible -// In case of costant failures, consider increasing the number of tests +// In case of constant failures, consider increasing the number of tests import '../common/index.mjs'; import assert from 'node:assert'; import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; diff --git a/test/wpt/status/FileAPI/blob.cjs b/test/wpt/status/FileAPI/blob.cjs index 99ec7dd22cea..bf40df1b8425 100644 --- a/test/wpt/status/FileAPI/blob.cjs +++ b/test/wpt/status/FileAPI/blob.cjs @@ -36,16 +36,4 @@ module.exports = { 'Blob-in-worker.worker.js': { skip: 'Depends on Web Workers API', }, - 'Blob-slice.any.js': { - fail: { - expected: [ - 'Slicing test: slice (1,1).', - 'Slicing test: slice (1,3).', - 'Slicing test: slice (1,5).', - 'Slicing test: slice (1,7).', - 'Slicing test: slice (1,8).', - 'Slicing test: slice (1,9).', - ], - }, - }, }; diff --git a/test/wpt/status/WebCryptoAPI.cjs b/test/wpt/status/WebCryptoAPI.cjs index 8fdbb458fac7..2a32b330f7d8 100644 --- a/test/wpt/status/WebCryptoAPI.cjs +++ b/test/wpt/status/WebCryptoAPI.cjs @@ -91,6 +91,9 @@ if (process.features.openssl_is_boringssl) { ['supports-modern.tentative.https.any.js', /ml-kem-512/i]); } +skipSubtests( + ['digest/kangarootwelve.tentative.https.any.js', /C=(?:\d{4,}|5(?:1[3-9]|[2-9]\d)|[6-9]\d{2}) bytes/]); + function assertNoOverlap(fileSkips, subtestSkips) { const subtestSkipFiles = new Set(Object.keys(subtestSkips)); const overlap = Object.keys(fileSkips).filter((file) => subtestSkipFiles.has(file)); diff --git a/tools/actions/merge.sh b/tools/actions/merge.sh index 45947f64c2a4..b811c18eb2c5 100755 --- a/tools/actions/merge.sh +++ b/tools/actions/merge.sh @@ -48,7 +48,7 @@ fi git log -1 HEAD --pretty='format:%B' | git interpret-trailers --parse --no-divider | \ grep -q -x "^PR-URL: https://github.com/$OWNER/$REPOSITORY/pull/$pr$" || { - echo "Invalid PR-URL trailer" + echo "Invalid PR-URL trailer - have you run 'git node land' to add it?" exit 1 } git log -1 HEAD^ --pretty='format:%B' | git interpret-trailers --parse --no-divider | \ diff --git a/tools/certdata.txt b/tools/certdata.txt index 97b118f68797..fafc33ddeea5 100644 --- a/tools/certdata.txt +++ b/tools/certdata.txt @@ -371,179 +371,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Entrust Root Certification Authority" -# -# Issuer: CN=Entrust Root Certification Authority,OU="(c) 2006 Entrust, Inc.",OU=www.entrust.net/CPS is incorporated by reference,O="Entrust, Inc.",C=US -# Serial Number: 1164660820 (0x456b5054) -# Subject: CN=Entrust Root Certification Authority,OU="(c) 2006 Entrust, Inc.",OU=www.entrust.net/CPS is incorporated by reference,O="Entrust, Inc.",C=US -# Not Valid Before: Mon Nov 27 20:23:42 2006 -# Not Valid After : Fri Nov 27 20:53:42 2026 -# Fingerprint (SHA-256): 73:C1:76:43:4F:1B:C6:D5:AD:F4:5B:0E:76:E7:27:28:7C:8D:E5:76:16:C1:E6:E6:14:1A:2B:2C:BC:7D:8E:4C -# Fingerprint (SHA1): B3:1E:B1:B7:40:E3:6C:84:02:DA:DC:37:D4:4D:F5:D4:67:49:52:F9 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Entrust Root Certification Authority" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\260\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165 -\163\164\054\040\111\156\143\056\061\071\060\067\006\003\125\004 -\013\023\060\167\167\167\056\145\156\164\162\165\163\164\056\156 -\145\164\057\103\120\123\040\151\163\040\151\156\143\157\162\160 -\157\162\141\164\145\144\040\142\171\040\162\145\146\145\162\145 -\156\143\145\061\037\060\035\006\003\125\004\013\023\026\050\143 -\051\040\062\060\060\066\040\105\156\164\162\165\163\164\054\040 -\111\156\143\056\061\055\060\053\006\003\125\004\003\023\044\105 -\156\164\162\165\163\164\040\122\157\157\164\040\103\145\162\164 -\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162 -\151\164\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\260\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165 -\163\164\054\040\111\156\143\056\061\071\060\067\006\003\125\004 -\013\023\060\167\167\167\056\145\156\164\162\165\163\164\056\156 -\145\164\057\103\120\123\040\151\163\040\151\156\143\157\162\160 -\157\162\141\164\145\144\040\142\171\040\162\145\146\145\162\145 -\156\143\145\061\037\060\035\006\003\125\004\013\023\026\050\143 -\051\040\062\060\060\066\040\105\156\164\162\165\163\164\054\040 -\111\156\143\056\061\055\060\053\006\003\125\004\003\023\044\105 -\156\164\162\165\163\164\040\122\157\157\164\040\103\145\162\164 -\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162 -\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\004\105\153\120\124 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\221\060\202\003\171\240\003\002\001\002\002\004\105 -\153\120\124\060\015\006\011\052\206\110\206\367\015\001\001\005 -\005\000\060\201\260\061\013\060\011\006\003\125\004\006\023\002 -\125\123\061\026\060\024\006\003\125\004\012\023\015\105\156\164 -\162\165\163\164\054\040\111\156\143\056\061\071\060\067\006\003 -\125\004\013\023\060\167\167\167\056\145\156\164\162\165\163\164 -\056\156\145\164\057\103\120\123\040\151\163\040\151\156\143\157 -\162\160\157\162\141\164\145\144\040\142\171\040\162\145\146\145 -\162\145\156\143\145\061\037\060\035\006\003\125\004\013\023\026 -\050\143\051\040\062\060\060\066\040\105\156\164\162\165\163\164 -\054\040\111\156\143\056\061\055\060\053\006\003\125\004\003\023 -\044\105\156\164\162\165\163\164\040\122\157\157\164\040\103\145 -\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150 -\157\162\151\164\171\060\036\027\015\060\066\061\061\062\067\062 -\060\062\063\064\062\132\027\015\062\066\061\061\062\067\062\060 -\065\063\064\062\132\060\201\260\061\013\060\011\006\003\125\004 -\006\023\002\125\123\061\026\060\024\006\003\125\004\012\023\015 -\105\156\164\162\165\163\164\054\040\111\156\143\056\061\071\060 -\067\006\003\125\004\013\023\060\167\167\167\056\145\156\164\162 -\165\163\164\056\156\145\164\057\103\120\123\040\151\163\040\151 -\156\143\157\162\160\157\162\141\164\145\144\040\142\171\040\162 -\145\146\145\162\145\156\143\145\061\037\060\035\006\003\125\004 -\013\023\026\050\143\051\040\062\060\060\066\040\105\156\164\162 -\165\163\164\054\040\111\156\143\056\061\055\060\053\006\003\125 -\004\003\023\044\105\156\164\162\165\163\164\040\122\157\157\164 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171\060\202\001\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017\000 -\060\202\001\012\002\202\001\001\000\266\225\266\103\102\372\306 -\155\052\157\110\337\224\114\071\127\005\356\303\171\021\101\150 -\066\355\354\376\232\001\217\241\070\050\374\367\020\106\146\056 -\115\036\032\261\032\116\306\321\300\225\210\260\311\377\061\213 -\063\003\333\267\203\173\076\040\204\136\355\262\126\050\247\370 -\340\271\100\161\067\305\313\107\016\227\052\150\300\042\225\142 -\025\333\107\331\365\320\053\377\202\113\311\255\076\336\114\333 -\220\200\120\077\011\212\204\000\354\060\012\075\030\315\373\375 -\052\131\232\043\225\027\054\105\236\037\156\103\171\155\014\134 -\230\376\110\247\305\043\107\134\136\375\156\347\036\264\366\150 -\105\321\206\203\133\242\212\215\261\343\051\200\376\045\161\210 -\255\276\274\217\254\122\226\113\252\121\215\344\023\061\031\350 -\116\115\237\333\254\263\152\325\274\071\124\161\312\172\172\177 -\220\335\175\035\200\331\201\273\131\046\302\021\376\346\223\342 -\367\200\344\145\373\064\067\016\051\200\160\115\257\070\206\056 -\236\177\127\257\236\027\256\353\034\313\050\041\137\266\034\330 -\347\242\004\042\371\323\332\330\313\002\003\001\000\001\243\201 -\260\060\201\255\060\016\006\003\125\035\017\001\001\377\004\004 -\003\002\001\006\060\017\006\003\125\035\023\001\001\377\004\005 -\060\003\001\001\377\060\053\006\003\125\035\020\004\044\060\042 -\200\017\062\060\060\066\061\061\062\067\062\060\062\063\064\062 -\132\201\017\062\060\062\066\061\061\062\067\062\060\065\063\064 -\062\132\060\037\006\003\125\035\043\004\030\060\026\200\024\150 -\220\344\147\244\246\123\200\307\206\146\244\361\367\113\103\373 -\204\275\155\060\035\006\003\125\035\016\004\026\004\024\150\220 -\344\147\244\246\123\200\307\206\146\244\361\367\113\103\373\204 -\275\155\060\035\006\011\052\206\110\206\366\175\007\101\000\004 -\020\060\016\033\010\126\067\056\061\072\064\056\060\003\002\004 -\220\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000 -\003\202\001\001\000\223\324\060\260\327\003\040\052\320\371\143 -\350\221\014\005\040\251\137\031\312\173\162\116\324\261\333\320 -\226\373\124\132\031\054\014\010\367\262\274\205\250\235\177\155 -\073\122\263\052\333\347\324\204\214\143\366\017\313\046\001\221 -\120\154\364\137\024\342\223\164\300\023\236\060\072\120\343\264 -\140\305\034\360\042\104\215\161\107\254\310\032\311\351\233\232 -\000\140\023\377\160\176\137\021\115\111\033\263\025\122\173\311 -\124\332\277\235\225\257\153\232\330\236\351\361\344\103\215\342 -\021\104\072\277\257\275\203\102\163\122\213\252\273\247\051\317 -\365\144\034\012\115\321\274\252\254\237\052\320\377\177\177\332 -\175\352\261\355\060\045\301\204\332\064\322\133\170\203\126\354 -\234\066\303\046\342\021\366\147\111\035\222\253\214\373\353\377 -\172\356\205\112\247\120\200\360\247\134\112\224\056\137\005\231 -\074\122\101\340\315\264\143\317\001\103\272\234\203\334\217\140 -\073\363\132\264\264\173\256\332\013\220\070\165\357\201\035\146 -\322\367\127\160\066\263\277\374\050\257\161\045\205\133\023\376 -\036\177\132\264\074 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -# For Server Distrust After: Sat Nov 30 23:59:59 2024 -CKA_NSS_SERVER_DISTRUST_AFTER MULTILINE_OCTAL -\062\064\061\061\063\060\062\063\065\071\065\071\132 -END -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Entrust Root Certification Authority" -# Issuer: CN=Entrust Root Certification Authority,OU="(c) 2006 Entrust, Inc.",OU=www.entrust.net/CPS is incorporated by reference,O="Entrust, Inc.",C=US -# Serial Number: 1164660820 (0x456b5054) -# Subject: CN=Entrust Root Certification Authority,OU="(c) 2006 Entrust, Inc.",OU=www.entrust.net/CPS is incorporated by reference,O="Entrust, Inc.",C=US -# Not Valid Before: Mon Nov 27 20:23:42 2006 -# Not Valid After : Fri Nov 27 20:53:42 2026 -# Fingerprint (SHA-256): 73:C1:76:43:4F:1B:C6:D5:AD:F4:5B:0E:76:E7:27:28:7C:8D:E5:76:16:C1:E6:E6:14:1A:2B:2C:BC:7D:8E:4C -# Fingerprint (SHA1): B3:1E:B1:B7:40:E3:6C:84:02:DA:DC:37:D4:4D:F5:D4:67:49:52:F9 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Entrust Root Certification Authority" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\263\036\261\267\100\343\154\204\002\332\334\067\324\115\365\324 -\147\111\122\371 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\326\245\303\355\135\335\076\000\301\075\207\222\037\035\077\344 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\260\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\026\060\024\006\003\125\004\012\023\015\105\156\164\162\165 -\163\164\054\040\111\156\143\056\061\071\060\067\006\003\125\004 -\013\023\060\167\167\167\056\145\156\164\162\165\163\164\056\156 -\145\164\057\103\120\123\040\151\163\040\151\156\143\157\162\160 -\157\162\141\164\145\144\040\142\171\040\162\145\146\145\162\145 -\156\143\145\061\037\060\035\006\003\125\004\013\023\026\050\143 -\051\040\062\060\060\066\040\105\156\164\162\165\163\164\054\040 -\111\156\143\056\061\055\060\053\006\003\125\004\003\023\044\105 -\156\164\162\165\163\164\040\122\157\157\164\040\103\145\162\164 -\151\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162 -\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\004\105\153\120\124 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - # # Certificate "Certum Root CA" # @@ -21216,7 +21043,7 @@ CKA_SERIAL_NUMBER MULTILINE_OCTAL \261\211\270\161\223\017 END CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE @@ -21334,7 +21161,7 @@ CKA_SERIAL_NUMBER MULTILINE_OCTAL \313\052\164\025\326\327 END CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE @@ -22552,142 +22379,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "SecureSign Root CA12" -# -# Issuer: CN=SecureSign Root CA12,O="Cybertrust Japan Co., Ltd.",C=JP -# Serial Number:66:f9:c7:c1:af:ec:c2:51:b4:ed:53:97:e6:e6:82:c3:2b:1c:90:16 -# Subject: CN=SecureSign Root CA12,O="Cybertrust Japan Co., Ltd.",C=JP -# Not Valid Before: Wed Apr 08 05:36:46 2020 -# Not Valid After : Sun Apr 08 05:36:46 2040 -# Fingerprint (SHA-256): 3F:03:4B:B5:70:4D:44:B2:D0:85:45:A0:20:57:DE:93:EB:F3:90:5F:CE:72:1A:CB:C7:30:C0:6D:DA:EE:90:4E -# Fingerprint (SHA1): 7A:22:1E:3D:DE:1B:06:AC:9E:C8:47:70:16:8E:3C:E5:F7:6B:06:F4 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SecureSign Root CA12" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 -\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 -\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 -\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 -\101\061\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 -\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 -\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 -\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 -\101\061\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\146\371\307\301\257\354\302\121\264\355\123\227\346\346 -\202\303\053\034\220\026 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\162\060\202\002\132\240\003\002\001\002\002\024\146 -\371\307\301\257\354\302\121\264\355\123\227\346\346\202\303\053 -\034\220\026\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\121\061\013\060\011\006\003\125\004\006\023\002\112 -\120\061\043\060\041\006\003\125\004\012\023\032\103\171\142\145 -\162\164\162\165\163\164\040\112\141\160\141\156\040\103\157\056 -\054\040\114\164\144\056\061\035\060\033\006\003\125\004\003\023 -\024\123\145\143\165\162\145\123\151\147\156\040\122\157\157\164 -\040\103\101\061\062\060\036\027\015\062\060\060\064\060\070\060 -\065\063\066\064\066\132\027\015\064\060\060\064\060\070\060\065 -\063\066\064\066\132\060\121\061\013\060\011\006\003\125\004\006 -\023\002\112\120\061\043\060\041\006\003\125\004\012\023\032\103 -\171\142\145\162\164\162\165\163\164\040\112\141\160\141\156\040 -\103\157\056\054\040\114\164\144\056\061\035\060\033\006\003\125 -\004\003\023\024\123\145\143\165\162\145\123\151\147\156\040\122 -\157\157\164\040\103\101\061\062\060\202\001\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\001\017\000 -\060\202\001\012\002\202\001\001\000\272\071\301\067\172\150\105 -\053\024\264\353\344\023\353\127\165\043\115\217\044\055\026\350 -\256\216\311\175\244\127\073\052\166\045\063\203\154\352\062\212 -\224\233\116\074\226\344\375\121\277\231\311\223\176\277\371\255 -\247\262\110\053\007\034\047\365\114\274\160\022\167\244\205\124 -\265\375\220\172\344\243\344\121\130\003\315\020\171\171\356\153 -\223\037\144\216\153\144\253\243\023\343\161\376\175\253\234\335 -\047\123\067\263\252\030\302\131\046\354\133\037\322\346\145\174 -\357\223\275\330\130\134\013\300\343\145\157\074\307\312\131\343 -\376\156\137\254\203\276\375\135\045\116\052\051\073\326\013\253 -\027\062\170\244\341\076\224\106\276\142\156\233\336\106\250\261 -\026\347\205\156\364\010\100\105\021\240\236\124\104\204\367\330 -\066\316\365\120\107\334\054\060\233\356\300\365\226\322\376\011 -\206\307\006\131\256\117\256\216\021\230\173\363\013\122\252\142 -\046\252\041\337\216\045\063\171\227\026\111\215\365\076\325\107 -\237\067\061\111\063\162\005\115\014\266\125\214\361\127\217\212 -\207\321\255\305\021\022\071\240\255\002\003\001\000\001\243\102 -\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\035\006\003\125\035\016\004\026\004\024\127\064 -\363\164\317\004\113\325\045\346\361\100\266\054\114\331\055\351 -\240\255\060\015\006\011\052\206\110\206\367\015\001\001\013\005 -\000\003\202\001\001\000\076\273\333\027\026\322\362\024\001\040 -\054\070\203\113\255\276\312\205\172\232\266\233\153\246\341\374 -\245\072\254\255\264\050\072\257\327\001\203\111\053\143\242\335 -\232\144\016\230\134\157\335\216\273\212\124\042\055\112\023\363 -\256\100\103\333\117\221\267\206\032\354\000\264\101\201\244\117 -\372\152\213\210\263\166\010\162\052\111\100\303\323\303\205\211 -\230\020\245\235\157\031\267\273\317\172\145\125\333\067\353\074 -\212\162\062\227\036\232\051\076\255\215\346\243\033\155\365\165 -\032\346\260\150\271\133\242\356\151\107\047\065\241\206\231\200 -\363\063\113\341\153\244\046\303\357\164\131\154\172\242\144\266 -\036\104\303\120\340\017\071\075\251\063\361\245\363\322\275\142 -\204\254\216\034\251\315\132\275\067\073\156\012\042\264\364\025 -\347\221\130\305\072\104\323\225\050\331\300\145\351\162\312\320 -\017\275\037\263\025\331\251\343\244\107\011\236\340\313\067\373 -\375\275\227\325\276\030\032\151\242\071\201\331\032\365\253\177 -\310\343\342\147\013\235\364\014\352\124\337\322\262\257\261\042 -\361\040\337\274\104\034 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "SecureSign Root CA12" -# Issuer: CN=SecureSign Root CA12,O="Cybertrust Japan Co., Ltd.",C=JP -# Serial Number:66:f9:c7:c1:af:ec:c2:51:b4:ed:53:97:e6:e6:82:c3:2b:1c:90:16 -# Subject: CN=SecureSign Root CA12,O="Cybertrust Japan Co., Ltd.",C=JP -# Not Valid Before: Wed Apr 08 05:36:46 2020 -# Not Valid After : Sun Apr 08 05:36:46 2040 -# Fingerprint (SHA-256): 3F:03:4B:B5:70:4D:44:B2:D0:85:45:A0:20:57:DE:93:EB:F3:90:5F:CE:72:1A:CB:C7:30:C0:6D:DA:EE:90:4E -# Fingerprint (SHA1): 7A:22:1E:3D:DE:1B:06:AC:9E:C8:47:70:16:8E:3C:E5:F7:6B:06:F4 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "SecureSign Root CA12" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\172\042\036\075\336\033\006\254\236\310\107\160\026\216\074\345 -\367\153\006\364 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\306\211\312\144\102\233\142\010\111\013\036\177\351\007\075\350 -END -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 -\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 -\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 -\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 -\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 -\101\061\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\146\371\307\301\257\354\302\121\264\355\123\227\346\346 -\202\303\053\034\220\026 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - # # Certificate "SecureSign Root CA14" # @@ -24904,3 +24595,171 @@ CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "SecureSign Root CA16" +# +# Issuer: CN=SecureSign Root CA16,O="Cybertrust Japan Co., Ltd.",C=JP +# Serial Number:54:7b:8d:ab:53:11:00:77:a8:18:03:ae:a1:2b:11:29:ab:42:e0:45 +# Subject: CN=SecureSign Root CA16,O="Cybertrust Japan Co., Ltd.",C=JP +# Not Valid Before: Tue Jul 30 07:08:11 2024 +# Not Valid After : Fri Jul 29 06:55:40 2044 +# Fingerprint (SHA-256): 4C:1C:CD:24:F1:7E:95:0F:C1:85:36:B3:3C:AF:E3:22:93:CF:C3:3E:84:67:B4:1E:1C:69:30:55:D7:F5:13:BF +# Fingerprint (SHA1): D1:79:17:EC:45:E2:A0:CA:D7:74:51:30:10:A4:C6:5C:AA:B3:3C:49 +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "SecureSign Root CA16" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 +\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 +\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 +\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 +\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 +\101\061\066 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 +\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 +\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 +\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 +\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 +\101\061\066 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\024\124\173\215\253\123\021\000\167\250\030\003\256\241\053 +\021\051\253\102\340\105 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\005\162\060\202\003\132\240\003\002\001\002\002\024\124 +\173\215\253\123\021\000\167\250\030\003\256\241\053\021\051\253 +\102\340\105\060\015\006\011\052\206\110\206\367\015\001\001\014 +\005\000\060\121\061\013\060\011\006\003\125\004\006\023\002\112 +\120\061\043\060\041\006\003\125\004\012\023\032\103\171\142\145 +\162\164\162\165\163\164\040\112\141\160\141\156\040\103\157\056 +\054\040\114\164\144\056\061\035\060\033\006\003\125\004\003\023 +\024\123\145\143\165\162\145\123\151\147\156\040\122\157\157\164 +\040\103\101\061\066\060\036\027\015\062\064\060\067\063\060\060 +\067\060\070\061\061\132\027\015\064\064\060\067\062\071\060\066 +\065\065\064\060\132\060\121\061\013\060\011\006\003\125\004\006 +\023\002\112\120\061\043\060\041\006\003\125\004\012\023\032\103 +\171\142\145\162\164\162\165\163\164\040\112\141\160\141\156\040 +\103\157\056\054\040\114\164\144\056\061\035\060\033\006\003\125 +\004\003\023\024\123\145\143\165\162\145\123\151\147\156\040\122 +\157\157\164\040\103\101\061\066\060\202\002\042\060\015\006\011 +\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000 +\060\202\002\012\002\202\002\001\000\307\045\037\360\022\266\217 +\261\357\177\076\127\276\107\206\363\342\046\314\016\172\356\163 +\302\366\063\044\352\302\037\156\345\321\232\164\205\224\354\163 +\021\340\141\210\355\133\055\245\327\123\323\266\200\254\260\345 +\126\351\126\152\152\232\215\273\352\335\155\302\164\175\136\365 +\047\333\044\267\125\212\222\133\303\245\020\371\167\103\156\151 +\366\263\346\336\175\165\221\260\215\351\373\140\046\155\011\355 +\376\341\124\331\000\211\271\262\326\205\163\070\046\044\323\111 +\231\306\154\065\366\352\076\057\005\174\052\071\002\351\205\065 +\256\123\052\175\144\147\322\200\256\224\260\243\162\010\064\263 +\143\125\317\230\137\103\062\151\376\253\314\205\213\217\043\343 +\214\207\224\076\236\315\341\213\006\372\171\107\025\251\333\126 +\053\122\363\265\101\063\372\244\334\216\325\255\313\116\226\273 +\261\316\324\253\123\130\274\110\134\264\217\327\146\036\024\041 +\014\065\140\320\164\263\141\220\056\170\272\005\356\120\325\117 +\243\302\360\132\072\256\131\314\175\103\207\240\106\161\154\113 +\216\354\064\200\376\273\164\334\370\273\040\356\242\343\352\352 +\246\230\015\262\334\021\044\141\052\260\142\214\346\144\200\130 +\376\270\034\261\325\223\134\001\356\064\160\363\267\035\324\245 +\146\323\016\131\246\275\004\203\313\321\114\014\246\132\142\040 +\113\204\245\116\073\324\250\362\245\142\143\313\136\265\362\170 +\066\027\026\036\362\073\100\006\136\112\155\336\365\364\255\154 +\214\350\211\157\154\050\060\102\055\027\166\000\145\043\235\324 +\321\350\007\077\041\012\356\266\356\123\265\372\173\355\076\072 +\101\224\155\060\051\271\254\117\357\123\013\005\136\304\236\154 +\000\332\163\350\176\056\353\373\302\270\255\105\120\146\316\115 +\370\116\355\110\275\236\027\120\162\217\263\226\106\037\332\320 +\327\267\072\314\024\134\274\211\263\133\354\214\175\254\242\217 +\233\131\206\016\335\060\304\063\150\010\233\275\111\361\305\375 +\072\166\021\233\327\017\240\100\140\046\342\014\257\211\340\162 +\123\252\203\355\311\073\032\341\117\005\216\070\215\122\201\000 +\075\141\105\021\277\263\254\273\114\263\125\163\245\260\135\034 +\164\137\026\141\051\236\250\002\073\002\003\001\000\001\243\102 +\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060\003 +\001\001\377\060\016\006\003\125\035\017\001\001\377\004\004\003 +\002\001\006\060\035\006\003\125\035\016\004\026\004\024\030\156 +\064\266\333\231\125\144\110\245\206\111\270\236\113\223\367\016 +\053\017\060\015\006\011\052\206\110\206\367\015\001\001\014\005 +\000\003\202\002\001\000\253\202\224\212\011\027\240\274\203\130 +\204\261\263\200\143\044\112\341\121\050\076\370\114\314\140\037 +\341\151\320\203\302\361\356\375\010\326\067\323\026\167\102\273 +\331\250\006\166\160\024\271\271\323\151\353\223\352\342\140\061 +\225\300\141\021\165\353\142\336\201\275\345\012\244\244\247\105 +\053\355\222\340\247\110\273\226\110\056\315\317\066\007\161\270 +\166\132\204\377\321\316\336\151\217\124\111\365\135\223\111\100 +\020\160\152\122\304\264\053\340\002\157\066\317\240\006\137\047 +\067\316\025\356\022\002\000\115\135\234\127\331\267\335\150\246 +\177\034\266\244\251\212\025\377\113\215\301\274\027\034\101\327 +\156\272\124\045\234\055\263\070\161\225\150\027\221\334\214\360 +\130\110\064\036\157\217\345\351\055\101\317\017\222\200\330\314 +\144\252\231\021\176\172\371\062\376\033\042\266\372\055\253\054 +\100\322\374\254\045\265\016\114\016\074\273\050\010\243\223\313 +\332\004\176\260\350\065\312\136\025\106\162\073\333\051\316\255 +\365\157\007\173\232\311\111\054\114\012\022\143\302\256\352\355 +\005\044\317\074\316\146\051\037\327\072\140\144\067\200\052\331 +\173\063\157\363\347\213\256\241\024\316\231\031\345\013\172\274 +\326\137\322\223\021\272\365\207\231\337\041\113\342\117\150\126 +\375\261\165\053\076\113\075\116\173\142\346\131\250\365\044\062 +\311\054\243\356\035\266\365\176\056\055\047\122\011\165\203\260 +\306\106\033\073\265\074\252\140\211\345\315\227\037\261\147\313 +\161\217\144\021\025\352\202\000\343\342\115\326\311\270\225\222 +\105\011\025\236\133\121\343\330\301\015\242\202\232\244\135\151 +\334\105\170\201\127\064\035\264\270\003\061\370\171\250\221\104 +\162\216\343\025\312\001\236\150\370\247\306\104\010\256\164\052 +\226\361\023\141\103\030\321\312\107\227\270\330\270\071\254\111 +\031\320\145\360\241\273\132\200\207\251\142\151\276\053\271\257 +\237\310\001\375\326\373\203\237\214\274\227\052\124\141\222\007 +\310\301\316\256\111\140\056\337\345\053\116\000\072\374\271\106 +\253\164\031\070\145\231\301\367\002\065\122\356\351\335\365\164 +\115\240\160\237\156\266\334\024\013\103\062\330\001\021\007\074 +\215\105\157\101\254\001 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "SecureSign Root CA16" +# Issuer: CN=SecureSign Root CA16,O="Cybertrust Japan Co., Ltd.",C=JP +# Serial Number:54:7b:8d:ab:53:11:00:77:a8:18:03:ae:a1:2b:11:29:ab:42:e0:45 +# Subject: CN=SecureSign Root CA16,O="Cybertrust Japan Co., Ltd.",C=JP +# Not Valid Before: Tue Jul 30 07:08:11 2024 +# Not Valid After : Fri Jul 29 06:55:40 2044 +# Fingerprint (SHA-256): 4C:1C:CD:24:F1:7E:95:0F:C1:85:36:B3:3C:AF:E3:22:93:CF:C3:3E:84:67:B4:1E:1C:69:30:55:D7:F5:13:BF +# Fingerprint (SHA1): D1:79:17:EC:45:E2:A0:CA:D7:74:51:30:10:A4:C6:5C:AA:B3:3C:49 +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "SecureSign Root CA16" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\321\171\027\354\105\342\240\312\327\164\121\060\020\244\306\134 +\252\263\074\111 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\150\132\170\276\353\165\351\257\156\376\274\220\301\201\062\245 +END +CKA_ISSUER MULTILINE_OCTAL +\060\121\061\013\060\011\006\003\125\004\006\023\002\112\120\061 +\043\060\041\006\003\125\004\012\023\032\103\171\142\145\162\164 +\162\165\163\164\040\112\141\160\141\156\040\103\157\056\054\040 +\114\164\144\056\061\035\060\033\006\003\125\004\003\023\024\123 +\145\143\165\162\145\123\151\147\156\040\122\157\157\164\040\103 +\101\061\066 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\024\124\173\215\253\123\021\000\167\250\030\003\256\241\053 +\021\051\253\102\340\105 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE diff --git a/tools/dep_updaters/update-ngtcp2.sh b/tools/dep_updaters/update-ngtcp2.sh index b892ecbab2c8..ea25e5a3b11e 100755 --- a/tools/dep_updaters/update-ngtcp2.sh +++ b/tools/dep_updaters/update-ngtcp2.sh @@ -10,19 +10,20 @@ DEPS_DIR="$BASE_DIR/deps" # shellcheck disable=SC1091 . "$BASE_DIR/tools/dep_updaters/utils.sh" -NEW_VERSION="$("$NODE" --input-type=module <<'EOF' -const res = await fetch('https://api.github.com/repos/ngtcp2/ngtcp2/releases', - process.env.GITHUB_TOKEN && { - headers: { - "Authorization": `Bearer ${process.env.GITHUB_TOKEN}` - }, - }); -if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); -const releases = await res.json() -const { tag_name } = releases.at(0); -console.log(tag_name.replace('v', '')); -EOF -)" +NEW_VERSION="1.15.1" +# NEW_VERSION="$("$NODE" --input-type=module <<'EOF' +# const res = await fetch('https://api.github.com/repos/ngtcp2/ngtcp2/releases', +# process.env.GITHUB_TOKEN && { +# headers: { +# "Authorization": `Bearer ${process.env.GITHUB_TOKEN}` +# }, +# }); +# if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); +# const releases = await res.json() +# const { tag_name } = releases.at(0); +# console.log(tag_name.replace('v', '')); +# EOF +# )" NGTCP2_VERSION_H="$DEPS_DIR/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h" @@ -42,29 +43,38 @@ cleanup () { trap cleanup INT TERM EXIT NGTCP2_REF="v$NEW_VERSION" -NGTCP2_ZIP="ngtcp2-$NEW_VERSION" cd "$WORKSPACE" echo "Fetching ngtcp2 source archive..." -curl -sL -o "$NGTCP2_ZIP.zip" "https://github.com/ngtcp2/ngtcp2/archive/refs/tags/$NGTCP2_REF.zip" -log_and_verify_sha256sum "ngtcp2" "$NGTCP2_ZIP.zip" -unzip "$NGTCP2_ZIP.zip" -rm "$NGTCP2_ZIP.zip" -mv "$NGTCP2_ZIP" ngtcp2 +git clone --depth 1 --branch "$NGTCP2_REF" https://github.com/ngtcp2/ngtcp2.git cd ngtcp2 +git submodule update --init --recursive + autoreconf -i # For Mac users who have installed libev with MacPorts, append # ',-L/opt/local/lib' to LDFLAGS, and also pass # CPPFLAGS="-I/opt/local/include" to ./configure. -./configure --prefix="$PWD/build" --enable-lib-only +./configure --prefix="$PWD/build" --enable-lib-only replace_dir "$DEPS_DIR/ngtcp2/ngtcp2/lib" "lib" replace_dir "$DEPS_DIR/ngtcp2/ngtcp2/crypto" "crypto" +replace_dir "$DEPS_DIR/ngtcp2/ngtcp2/examples" "examples" +replace_dir "$DEPS_DIR/ngtcp2/ngtcp2/third-party" "third-party" + +cd "$WORKSPACE" + +# Libev is a dependency of ngtcp2's examples. It really hasn't been updated +# in a long time, sticking with the same version should be fine. +curl -sL -o "libev.tar.gz" "https://dist.schmorp.de/libev/libev-4.33.tar.gz" +tar xzf libev.tar.gz +rm libev.tar.gz + +replace_dir "$DEPS_DIR/ngtcp2/ngtcp2/third-party/libev" "libev-4.33" # Update the version number on maintaining-dependencies.md # and print the new version as the last line of the script as we need diff --git a/tools/doc/type-parser.mjs b/tools/doc/type-parser.mjs index fe038842f2b4..af7c97cf0fae 100644 --- a/tools/doc/type-parser.mjs +++ b/tools/doc/type-parser.mjs @@ -65,6 +65,7 @@ const customTypesMap = { 'https://tc39.github.io/ecma262/#sec-module-namespace-exotic-objects', 'AsyncLocalStorage': 'async_context.html#class-asynclocalstorage', + 'RunScope': 'async_context.html#class-runscope', 'AsyncHook': 'async_hooks.html#async_hookscreatehookoptions', 'AsyncResource': 'async_hooks.html#class-asyncresource', @@ -318,6 +319,11 @@ const customTypesMap = { 'TextDecoderStream': 'webstreams.html#class-textdecoderstream', + 'Shareable': 'stream_iter.html#interface-shareable', + 'Share': 'stream_iter.html#class-share', + 'SyncShareable': 'stream_iter.html#interface-syncshareable', + 'SyncShare': 'stream_iter.html#class-syncshare', + 'FormData': 'https://developer.mozilla.org/en-US/docs/Web/API/FormData', 'Headers': 'https://developer.mozilla.org/en-US/docs/Web/API/Headers', 'Response': 'https://developer.mozilla.org/en-US/docs/Web/API/Response', diff --git a/tools/eslint-rules/func-name-matching.js b/tools/eslint-rules/func-name-matching.js new file mode 100644 index 000000000000..a2ff661f2cc7 --- /dev/null +++ b/tools/eslint-rules/func-name-matching.js @@ -0,0 +1,329 @@ +// @fileoverview Rule to require function names to match the name of the variable or property to which they +// are assigned. +// @author Annie Zhang +// @author Pavel Strashkin + +'use strict'; + +//-------------------------------------------------------------------------- +// Requirements +//-------------------------------------------------------------------------- + +const astUtils = require('../eslint/node_modules/eslint/lib/rules/utils/ast-utils'); +const esutils = require('../eslint/node_modules/esutils'); + +//-------------------------------------------------------------------------- +// Helpers +//-------------------------------------------------------------------------- + +/** + * Determines if a pattern is `module.exports` or `module['exports']` + * @param {ASTNode} pattern The left side of the AssignmentExpression + * @returns {boolean} True if the pattern is `module.exports` or `module['exports']` + */ +function isModuleExports(pattern) { + if ( + pattern.type === 'MemberExpression' && + pattern.object.type === 'Identifier' && + pattern.object.name === 'module' + ) { + // module.exports + if ( + pattern.property.type === 'Identifier' && + pattern.property.name === 'exports' + ) { + return true; + } + + // module['exports'] + if ( + pattern.property.type === 'Literal' && + pattern.property.value === 'exports' + ) { + return true; + } + } + return false; +} + +/** + * Determines if a string name is a valid identifier + * @param {string} name The string to be checked + * @param {number} ecmaVersion The ECMAScript version if specified in the parserOptions config + * @returns {boolean} True if the string is a valid identifier + */ +function isIdentifier(name, ecmaVersion) { + if (ecmaVersion >= 2015) { + return esutils.keyword.isIdentifierES6(name); + } + return esutils.keyword.isIdentifierES5(name); +} + +//------------------------------------------------------------------------------ +// Rule Definition +//------------------------------------------------------------------------------ + +const alwaysOrNever = { enum: ['always', 'never'] }; +const optionsObject = { + type: 'object', + properties: { + considerPropertyDescriptor: { + type: 'boolean', + }, + includeCommonJSModuleExports: { + type: 'boolean', + }, + }, + additionalProperties: false, +}; + +/** @type {import('../types').Rule.RuleModule} */ +module.exports = { + meta: { + type: 'suggestion', + + docs: { + description: + 'Require function names to match the name of the variable or property to which they are assigned', + recommended: false, + frozen: true, + url: 'https://eslint.org/docs/latest/rules/func-name-matching', + }, + + schema: { + anyOf: [ + { + type: 'array', + additionalItems: false, + items: [alwaysOrNever, optionsObject], + }, + { + type: 'array', + additionalItems: false, + items: [optionsObject], + }, + ], + }, + + messages: { + matchProperty: + 'Function name `{{funcName}}` should match property name `{{name}}`.', + matchVariable: + 'Function name `{{funcName}}` should match variable name `{{name}}`.', + notMatchProperty: + 'Function name `{{funcName}}` should not match property name `{{name}}`.', + notMatchVariable: + 'Function name `{{funcName}}` should not match variable name `{{name}}`.', + }, + }, + + create(context) { + const options = + (typeof context.options[0] === 'object' ? + context.options[0] : context.options[1]) || {}; + const nameMatches = + typeof context.options[0] === 'string' ? + context.options[0] : 'always'; + const considerPropertyDescriptor = options.considerPropertyDescriptor; + const includeModuleExports = options.includeCommonJSModuleExports; + const ecmaVersion = context.languageOptions.ecmaVersion; + + /** + * Check whether node is a certain CallExpression. + * @param {string} objName object name + * @param {string} funcName function name + * @param {ASTNode} node The node to check + * @returns {boolean} `true` if node matches CallExpression + */ + function isPropertyCall(objName, funcName, node) { + if (!node) { + return false; + } + return ( + node.type === 'CallExpression' && + astUtils.isSpecificMemberAccess(node.callee, objName, funcName) + ); + } + + function isIdentifierCall(expectedIdentifierName, node) { + if (!node) { + return false; + } + return node.type === 'CallExpression' && + astUtils.isSpecificId(node.callee, expectedIdentifierName); + } + + /** + * Compares identifiers based on the nameMatches option + * @param {string} x the first identifier + * @param {string} y the second identifier + * @returns {boolean} whether the two identifiers should warn. + */ + function shouldWarn(x, y) { + return ( + (nameMatches === 'always' && x !== y) || + (nameMatches === 'never' && x === y) + ); + } + + /** + * Reports + * @param {ASTNode} node The node to report + * @param {string} name The variable or property name + * @param {string} funcName The function name + * @param {boolean} isProp True if the reported node is a property assignment + * @returns {void} + */ + function report(node, name, funcName, isProp) { + let messageId; + + if (nameMatches === 'always' && isProp) { + messageId = 'matchProperty'; + } else if (nameMatches === 'always') { + messageId = 'matchVariable'; + } else if (isProp) { + messageId = 'notMatchProperty'; + } else { + messageId = 'notMatchVariable'; + } + context.report({ + node, + messageId, + data: { + name, + funcName, + }, + }); + } + + /** + * Determines whether a given node is a string literal + * @param {ASTNode} node The node to check + * @returns {boolean} `true` if the node is a string literal + */ + function isStringLiteral(node) { + return node.type === 'Literal' && typeof node.value === 'string'; + } + + //-------------------------------------------------------------------------- + // Public + //-------------------------------------------------------------------------- + + return { + 'VariableDeclarator[init.type="FunctionExpression"][id.type="Identifier"]'(node) { + if ( + node.init.id && + shouldWarn(node.id.name, node.init.id.name) + ) { + report(node, node.id.name, node.init.id.name, false); + } + }, + + 'AssignmentExpression[right.type="FunctionExpression"][left.type=/^(Identifier|MemberExpression)$/]'(node) { + if ( + (node.left.computed && node.left.property.type !== 'Literal') || + (!includeModuleExports && isModuleExports(node.left)) + ) { + return; + } + + const isProp = node.left.type === 'MemberExpression'; + const name = isProp ? astUtils.getStaticPropertyName(node.left) : node.left.name; + + if ( + node.right.id && + name && + isIdentifier(name) && + shouldWarn(name, node.right.id.name) + ) { + report(node, name, node.right.id.name, isProp); + } + }, + + ':matches(Property,PropertyDefinition)[value.type="FunctionExpression"][value.id]'(node) { + + if (node.key.type === 'Identifier' && !node.computed) { + const functionName = node.value.id.name; + let propertyName = node.key.name; + + if ( + considerPropertyDescriptor && + propertyName === 'value' && + node.parent.type === 'ObjectExpression' + ) { + if ( + isPropertyCall( + 'Object', + 'defineProperty', + node.parent.parent, + ) || + isPropertyCall( + 'Reflect', + 'defineProperty', + node.parent.parent, + ) || + isIdentifierCall('ObjectDefineProperty', node.parent.parent) || + isIdentifierCall('ReflectDefineProperty', node.parent.parent) + ) { + const property = node.parent.parent.arguments[1]; + + if ( + isStringLiteral(property) && + shouldWarn(property.value, functionName) + ) { + report( + node, + property.value, + functionName, + true, + ); + } + } else if ( + isPropertyCall( + 'Object', + 'defineProperties', + node.parent.parent.parent.parent, + ) || + isIdentifierCall('ObjectDefineProperties', node.parent.parent.parent.parent) + ) { + propertyName = node.parent.parent.key.name; + if ( + !node.parent.parent.computed && + shouldWarn(propertyName, functionName) + ) { + report(node, propertyName, functionName, true); + } + } else if ( + isPropertyCall( + 'Object', + 'create', + node.parent.parent.parent.parent, + ) + ) { + propertyName = node.parent.parent.key.name; + if ( + !node.parent.parent.computed && + shouldWarn(propertyName, functionName) + ) { + report(node, propertyName, functionName, true); + } + } else if (shouldWarn(propertyName, functionName)) { + report(node, propertyName, functionName, true); + } + } else if (shouldWarn(propertyName, functionName)) { + report(node, propertyName, functionName, true); + } + return; + } + + if ( + isStringLiteral(node.key) && + isIdentifier(node.key.value, ecmaVersion) && + shouldWarn(node.key.value, node.value.id.name) + ) { + report(node, node.key.value, node.value.id.name, true); + } + }, + }; + }, +}; diff --git a/tools/eslint-rules/prefer-abort-signal-abort.js b/tools/eslint-rules/prefer-abort-signal-abort.js new file mode 100644 index 000000000000..e5b182ab73de --- /dev/null +++ b/tools/eslint-rules/prefer-abort-signal-abort.js @@ -0,0 +1,154 @@ +/** + * @file Prefer AbortSignal.abort() for already-aborted signals. + */ +'use strict'; + +const message = 'Use AbortSignal.abort() instead of creating and aborting an AbortController.'; + +function isAbortControllerConstruction(node) { + return node?.type === 'NewExpression' && + node.callee.type === 'Identifier' && + node.callee.name === 'AbortController' && + node.arguments.length === 0; +} + +function isIdentifier(node, name) { + return node?.type === 'Identifier' && node.name === name; +} + +function isProperty(node, name) { + return !node.computed && isIdentifier(node.property, name); +} + +function isAbortCallStatement(node, name) { + const expression = node?.expression; + const callee = expression?.callee; + return node?.type === 'ExpressionStatement' && + expression.type === 'CallExpression' && + callee.type === 'MemberExpression' && + isIdentifier(callee.object, name) && + isProperty(callee, 'abort') && + expression.arguments.length <= 1; +} + +function isSignalReference(reference, name) { + const { identifier } = reference; + const parent = identifier.parent; + return isIdentifier(identifier, name) && + parent?.type === 'MemberExpression' && + parent.object === identifier && + isProperty(parent, 'signal'); +} + +function isAbortReference(reference, abortStatement, name) { + const { identifier } = reference; + const parent = identifier.parent; + return isIdentifier(identifier, name) && + parent?.type === 'MemberExpression' && + parent.object === identifier && + isProperty(parent, 'abort') && + parent.parent === abortStatement.expression; +} + +module.exports = { + meta: { + fixable: 'code', + }, + + create(context) { + const sourceCode = context.sourceCode; + const candidates = []; + + function hasCommentsBetween(left, right) { + return sourceCode.getCommentsBefore(right) + .some((comment) => comment.range[0] > left.range[1]); + } + + function rangeIncludingTrailingLine(statement) { + const tokenAfter = sourceCode.getTokenAfter(statement, { includeComments: true }); + if (tokenAfter && tokenAfter.loc.start.line > statement.loc.end.line) { + return [statement.range[0], tokenAfter.range[0]]; + } + return statement.range; + } + + return { + VariableDeclarator(node) { + if (node.id.type !== 'Identifier' || + !isAbortControllerConstruction(node.init) || + node.parent.declarations.length !== 1) { + return; + } + + const variableDeclaration = node.parent; + const parent = variableDeclaration.parent; + if (parent.type !== 'BlockStatement' && parent.type !== 'Program') { + return; + } + + const index = parent.body.indexOf(variableDeclaration); + const abortStatement = parent.body[index + 1]; + if (!isAbortCallStatement(abortStatement, node.id.name) || + hasCommentsBetween(variableDeclaration, abortStatement)) { + return; + } + + candidates.push({ + abortStatement, + declarator: node, + variableDeclaration, + }); + }, + + 'Program:exit'() { + for (const { abortStatement, declarator, variableDeclaration } of candidates) { + const [variable] = sourceCode.scopeManager.getDeclaredVariables(declarator); + if (!variable) { + continue; + } + + const name = declarator.id.name; + const references = variable.references.filter((reference) => { + return reference.identifier !== declarator.id; + }); + const signalReferences = references.filter((reference) => { + return isSignalReference(reference, name); + }); + const abortReferences = references.filter((reference) => { + return isAbortReference(reference, abortStatement, name); + }); + + if (references.length !== (1 + signalReferences.length) || + abortReferences.length !== 1) { + continue; + } + + const signalNode = signalReferences[0].identifier.parent; + const abortArguments = abortStatement.expression.arguments; + const abortReason = abortArguments.length === 0 ? + '' : sourceCode.getText(abortArguments[0]); + + context.report({ + node: declarator, + message, + fix(fixer) { + const abortSignalCreationCall = `AbortSignal.abort(${abortReason})`; + if (signalReferences.length > 1) { + return [ + fixer.replaceText(declarator.init, abortSignalCreationCall), + fixer.removeRange(rangeIncludingTrailingLine(abortStatement)), + ...signalReferences.map(({ identifier: { parent } }) => fixer.replaceText(parent, name)), + ]; + } + return [ + fixer.removeRange(rangeIncludingTrailingLine(variableDeclaration)), + fixer.removeRange(rangeIncludingTrailingLine(abortStatement)), + fixer.replaceText(signalNode, abortSignalCreationCall), + ]; + }, + }); + } + }, + }; + }, +}; diff --git a/tools/eslint/package-lock.json b/tools/eslint/package-lock.json index de8e6862cdb1..82bdd3efb8c2 100644 --- a/tools/eslint/package-lock.json +++ b/tools/eslint/package-lock.json @@ -13,13 +13,13 @@ "@babel/plugin-syntax-import-defer": "^8.0.1", "@babel/plugin-syntax-import-source": "^8.0.1", "@eslint/js": "^10.0.1", - "@eslint/markdown": "^8.0.2", + "@eslint/markdown": "^8.0.3", "@stylistic/eslint-plugin": "^5.10.0", - "eslint": "^10.5.0", + "eslint": "^10.8.0", "eslint-formatter-tap": "^9.0.1", - "eslint-plugin-jsdoc": "^63.0.9", + "eslint-plugin-jsdoc": "^63.3.1", "eslint-plugin-regexp": "^3.1.1", - "globals": "^17.7.0" + "globals": "^17.8.0" } }, "node_modules/@babel/code-frame": { @@ -278,16 +278,16 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.87.0.tgz", - "integrity": "sha512-mFXZloZMzuJZXSHUmAFu/pXTk0ZJTJBluuAkrvbzidpTN8W6F2bpRFuedSH+85kbdlRLJqc+gfN+kD3JOLJK5g==", + "version": "0.90.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.90.0.tgz", + "integrity": "sha512-51x9KxyTAN6guZOCd+lmcDdkhgdMdP/6iMMtg9dyhCWDc3+iSUyoB7f/9WAM/yGHmGFq25Vd6bXRR7CZcB+tog==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.9", - "@typescript-eslint/types": "^8.59.4", + "@typescript-eslint/types": "^8.65.0", "comment-parser": "1.4.7", "esquery": "^1.7.0", - "jsdoc-type-pratt-parser": "~7.2.0" + "jsdoc-type-pratt-parser": "~7.3.0" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" @@ -356,9 +356,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", - "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", "license": "Apache-2.0", "dependencies": { "@eslint/core": "^1.2.1" @@ -400,16 +400,16 @@ } }, "node_modules/@eslint/markdown": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-8.0.2.tgz", - "integrity": "sha512-W+/0qHp0WbvFEljUvvECNpSWrUHpBWIWwp7F3QqEwQKmaRCmfEWvk6VfUia9pTQ0th6HyBGBsPfg/kG3/aQxLA==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-8.0.3.tgz", + "integrity": "sha512-rBTSSShrq7e4O+PWfeE4azH4/CWPNrC+VGxBXiW00o3vYVJnznsZiDayj3KC9JztIMVRZxZHn2nrDIUau/4j7A==", "license": "MIT", "workspaces": [ "examples/*" ], "dependencies": { "@eslint/core": "^1.2.1", - "@eslint/plugin-kit": "^0.7.1", + "@eslint/plugin-kit": "^0.7.2", "github-slugger": "^2.0.0", "mdast-util-from-markdown": "^2.0.2", "mdast-util-frontmatter": "^2.0.1", @@ -649,9 +649,9 @@ "license": "MIT" }, "node_modules/@typescript-eslint/types": { - "version": "8.62.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.1.tgz", - "integrity": "sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", + "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -735,15 +735,15 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/browserslist": { @@ -952,9 +952,9 @@ } }, "node_modules/eslint": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.5.0.tgz", - "integrity": "sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==", + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.0.tgz", + "integrity": "sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==", "license": "MIT", "workspaces": [ "packages/*" @@ -963,7 +963,7 @@ "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", - "@eslint/config-helpers": "^0.6.0", + "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", @@ -987,7 +987,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.4", + "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -1022,12 +1022,12 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "63.0.9", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.0.9.tgz", - "integrity": "sha512-SJskF1zzPPRVfsmJyr/PqUXcpjA7o5Y0YnEoLBMDQlQWhELbYMRvK/8Fzlvh5XwEwJW8glAtKGKucaL0WGPMkw==", + "version": "63.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.3.1.tgz", + "integrity": "sha512-yVyTPtOY2tA8EjTwUtaM3pFxj9i/3m4/FSPMv5gMnDHSSleCpzIYQLyV8KnVmEIkkPpNhDlkDQ99mTfjxgqLxA==", "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.87.0", + "@es-joy/jsdoccomment": "~0.90.0", "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.7", @@ -1038,8 +1038,8 @@ "html-entities": "^2.6.0", "object-deep-merge": "^2.0.1", "parse-imports-exports": "^0.2.4", - "semver": "^7.8.2", - "spdx-expression-parse": "^4.0.0", + "semver": "^7.8.5", + "spdx-expression-parse": "^5.0.0", "to-valid-identifier": "^1.0.0" }, "engines": { @@ -1319,9 +1319,9 @@ } }, "node_modules/globals": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.7.0.tgz", - "integrity": "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==", + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.8.0.tgz", + "integrity": "sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ==", "license": "MIT", "engines": { "node": ">=18" @@ -1430,9 +1430,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.2.0.tgz", - "integrity": "sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.3.0.tgz", + "integrity": "sha512-DoyJXo7x/n48M3NsGOs9QnEws0ft0tV3YsSgvWMNxz2hZtz+Q6fpqUD96lVYX4a+jcEkzHeFNDJOn68TzXfbdA==", "license": "MIT", "engines": { "node": ">=20.0.0" @@ -2672,9 +2672,9 @@ "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-5.0.0.tgz", + "integrity": "sha512-vngmw3Rgn+o2arXNbnZaj5UtOEBuWBfvaI+Wc8GFfykIhA5/vdK9/Sp/XkLv63dykz2rxKDvKEHupF5P0FORcQ==", "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", @@ -2682,9 +2682,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", "license": "CC0-1.0" }, "node_modules/to-valid-identifier": { diff --git a/tools/eslint/package.json b/tools/eslint/package.json index 3199c2bb7b17..30b0aa50c84c 100644 --- a/tools/eslint/package.json +++ b/tools/eslint/package.json @@ -8,12 +8,12 @@ "@babel/plugin-syntax-import-defer": "^8.0.1", "@babel/plugin-syntax-import-source": "^8.0.1", "@eslint/js": "^10.0.1", - "@eslint/markdown": "^8.0.2", + "@eslint/markdown": "^8.0.3", "@stylistic/eslint-plugin": "^5.10.0", - "eslint": "^10.5.0", + "eslint": "^10.8.0", "eslint-formatter-tap": "^9.0.1", - "eslint-plugin-jsdoc": "^63.0.9", + "eslint-plugin-jsdoc": "^63.3.1", "eslint-plugin-regexp": "^3.1.1", - "globals": "^17.7.0" + "globals": "^17.8.0" } } diff --git a/tools/gen_node_def.cc b/tools/gen_node_def.cc index 10e2939c80bb..9049cede9385 100644 --- a/tools/gen_node_def.cc +++ b/tools/gen_node_def.cc @@ -1,5 +1,4 @@ #include -#include #include #include #include @@ -13,9 +12,9 @@ // when building Node.js as a shared library. This is conceptually // similar to the create_expfile.sh script used on AIX. // -// Generating this .def file requires parsing data out of the +// Generating this .def file requires parsing data out of the // PE32/PE32+ file format. Helper structs are defined in -// hence why this is an executable and not a script. See [2] for +// hence why this is an executable and not a script. See [2] for // details on the PE format. // // [1]: https://docs.microsoft.com/en-us/cpp/build/reference/module-definition-dot-def-files @@ -28,11 +27,16 @@ struct RelativeAddress { uintptr_t root; uintptr_t offset = 0; - RelativeAddress(HMODULE handle) noexcept - : root(reinterpret_cast(handle)) {} + explicit RelativeAddress(HMODULE handle) noexcept + : RelativeAddress(handle, 0) {} + // LoadLibraryEx with LOAD_LIBRARY_AS_IMAGE_RESOURCE tags the returned + // handle by setting one of its two lowest bits. Mask them off to recover + // the actual base address of the mapping. RelativeAddress(HMODULE handle, uintptr_t offset) noexcept - : root(reinterpret_cast(handle)), offset(offset) {} + : root(reinterpret_cast(handle) & + ~static_cast(3)), + offset(offset) {} RelativeAddress(uintptr_t root, uintptr_t offset) noexcept : root(root), offset(offset) {} @@ -60,15 +64,28 @@ struct RelativeAddress { } }; -// A wrapper around a dynamically loaded Windows DLL. This steps through the -// PE file structure to find the export directory and pulls out a list of -// all the exported symbol names. +struct Symbol { + std::string name; + uint32_t rva; +}; + +// A wrapper around a memory-mapped Windows DLL image. The DLL is mapped as +// an image resource (laid out as if loaded, but never executed), so its +// architecture does not need to match ours; this allows generating the +// .def file for a cross-compiled DLL. This steps through the PE file +// structure to find the export directory and pulls out a list of all the +// exported symbols. struct Library { HMODULE library; std::string libraryName; - std::vector exportedSymbols; + std::vector sections; + std::vector exportedSymbols; + + // Location of the export directory itself, used to detect forwarders. + uint32_t exportDirStart; + uint32_t exportDirSize; - Library(HMODULE library) : library(library) { + explicit Library(HMODULE library) : library(library) { auto libnode = RelativeAddress(library); // At relative offset 0x3C is a 32 bit offset to the COFF signature, 4 bytes @@ -83,11 +100,21 @@ struct Library { auto optionalHeaderPtr = coffHeaderPtr.AtOffset(sizeof(IMAGE_FILE_HEADER)); auto optionalHeader = optionalHeaderPtr.AsPtrTo(); + // The section table starts right after the optional header. + auto sectionTablePtr = + optionalHeaderPtr.AtOffset(coffHeader->SizeOfOptionalHeader); + const IMAGE_SECTION_HEADER* firstSection = + sectionTablePtr.AsPtrTo(); + sections.assign(firstSection, firstSection + coffHeader->NumberOfSections); + auto exportDirectory = - (optionalHeader->Magic == 0x20b) ? optionalHeaderPtr.AsPtrTo() - ->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT] - : optionalHeaderPtr.AsPtrTo() - ->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; + (optionalHeader->Magic == 0x20b) + ? optionalHeaderPtr.AsPtrTo() + ->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT] + : optionalHeaderPtr.AsPtrTo() + ->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; + exportDirStart = exportDirectory.VirtualAddress; + exportDirSize = exportDirectory.Size; auto exportTable = libnode.AtOffset(exportDirectory.VirtualAddress) .AsPtrTo(); @@ -99,6 +126,11 @@ struct Library { const uint32_t* functionNameTable = libnode.AtOffset(exportTable->AddressOfNames).AsPtrTo(); + const uint32_t* functionLocations = + libnode.AtOffset(exportTable->AddressOfFunctions).AsPtrTo(); + const uint16_t* functionOrdinals = + libnode.AtOffset(exportTable->AddressOfNameOrdinals) + .AsPtrTo(); // Given an RVA, parse it as a std::string. The resulting string is empty // if the symbol does not have a name (i.e. it is ordinal only). @@ -107,32 +139,33 @@ struct Library { if (namePtr == nullptr) return {}; return {namePtr}; }; - std::transform(functionNameTable, - functionNameTable + exportTable->NumberOfNames, - std::back_inserter(exportedSymbols), - nameRvaToName); + for (uint32_t i = 0; i < exportTable->NumberOfNames; ++i) { + exportedSymbols.push_back({nameRvaToName(functionNameTable[i]), + functionLocations[functionOrdinals[i]]}); + } } ~Library() { FreeLibrary(library); } -}; -bool IsPageExecutable(void* address) { - MEMORY_BASIC_INFORMATION memoryInformation; - size_t rc = VirtualQuery( - address, &memoryInformation, sizeof(MEMORY_BASIC_INFORMATION)); + bool IsRvaExecutable(uint32_t rva) const { + for (const auto& s : sections) { + if (rva >= s.VirtualAddress && + rva < s.VirtualAddress + s.Misc.VirtualSize) { + return (s.Characteristics & IMAGE_SCN_MEM_EXECUTE) != 0; + } + } + return true; + } - if (rc != 0 && memoryInformation.Protect != 0) { - return memoryInformation.Protect == PAGE_EXECUTE || - memoryInformation.Protect == PAGE_EXECUTE_READ || - memoryInformation.Protect == PAGE_EXECUTE_READWRITE || - memoryInformation.Protect == PAGE_EXECUTE_WRITECOPY; + bool IsForwarderRva(uint32_t rva) const { + return rva >= exportDirStart && rva < exportDirStart + exportDirSize; } - return false; -} +}; Library LoadLibraryOrExit(const char* dllPath) { - auto library = LoadLibrary(dllPath); - if (library != nullptr) return library; + auto library = + LoadLibraryEx(dllPath, nullptr, LOAD_LIBRARY_AS_IMAGE_RESOURCE); + if (library != nullptr) return Library(library); auto error = GetLastError(); std::cerr << "ERROR: Failed to load " << dllPath << std::endl; @@ -163,31 +196,35 @@ int main(int argc, char** argv) { auto defFile = std::ofstream(argv[2]); defFile << "EXPORTS" << std::endl; - for (const std::string& functionName : libnode.exportedSymbols) { + for (const Symbol& symbol : libnode.exportedSymbols) { // If a symbol doesn't have a name then it has been exported as an // ordinal only. We assume that only named symbols are exported. - if (functionName.empty()) continue; - - // Every name in the exported symbols table should be resolvable - // to an address because we have actually loaded the library into - // our address space. - auto address = GetProcAddress(libnode.library, functionName.c_str()); - if (address == nullptr) { - std::cerr << "WARNING: " << functionName + if (symbol.name.empty()) continue; + + if (symbol.rva == 0) { + std::cerr << "WARNING: " << symbol.name << " appears in export table but is not a valid symbol" << std::endl; continue; } - defFile << " " << functionName << " = " << libnode.libraryName << "." - << functionName; - + defFile << " " << symbol.name << " = " << libnode.libraryName << "." + << symbol.name; + // Nothing distinguishes exported global data from exported functions // with C linkage. If we do not specify the DATA keyword for such symbols // then consumers of the .def file will get a linker error. This manifests - // as nodedbg_ symbols not being found. We assert that if the symbol is in - // an executable page in this process then it is a function, not data. - if (!IsPageExecutable(address)) { + // as nodedbg_ symbols not being found. We assert that if the symbol's + // RVA falls in a section with the IMAGE_SCN_MEM_EXECUTE characteristic + // then it is a function, not data. + // + // A forwarder export is the exception: its RVA points back inside the + // export directory, at a redirect string like "NTDLL.RtlAllocateHeap", + // rather than at code or data. The export directory lives in a + // non-executable section, but forwarders resolve to functions, so they + // must not be marked DATA. + if (!libnode.IsForwarderRva(symbol.rva) && + !libnode.IsRvaExecutable(symbol.rva)) { defFile << " DATA"; } defFile << std::endl; diff --git a/tools/v8_gypfiles/v8.gyp b/tools/v8_gypfiles/v8.gyp index 95194aca28fc..f90a29d102ac 100644 --- a/tools/v8_gypfiles/v8.gyp +++ b/tools/v8_gypfiles/v8.gyp @@ -374,12 +374,12 @@ '<(V8_ROOT)/src/builtins/arm64/builtins-arm64.cc', ], }], - ['v8_target_arch=="riscv64" or v8_target_arch=="riscv64"', { + ['v8_target_arch=="riscv64"', { 'sources': [ '<(V8_ROOT)/src/builtins/riscv/builtins-riscv.cc', ], }], - ['v8_target_arch=="loong64" or v8_target_arch=="loong64"', { + ['v8_target_arch=="loong64"', { 'sources': [ '<(V8_ROOT)/src/builtins/loong64/builtins-loong64.cc', ], diff --git a/typings/globals.d.ts b/typings/globals.d.ts index 1ae7088ca7e7..83fcec8e19a5 100644 --- a/typings/globals.d.ts +++ b/typings/globals.d.ts @@ -8,14 +8,16 @@ import { ConstantsBinding } from './internalBinding/constants'; import { CryptoBinding } from './internalBinding/crypto'; import { DebugBinding } from './internalBinding/debug'; import { EncodingBinding } from './internalBinding/encoding_binding'; -import { HttpParserBinding } from './internalBinding/http_parser'; -import { InspectorBinding } from './internalBinding/inspector'; -import { IPCSerdesBinding } from './internalBinding/ipc_serdes'; import { FsBinding } from './internalBinding/fs'; import { FsDirBinding } from './internalBinding/fs_dir'; +import { HeapUtilsBinding } from './internalBinding/heap_utils'; +import { HttpParserBinding } from './internalBinding/http_parser'; import { ICUBinding } from './internalBinding/icu'; +import { InspectorBinding } from './internalBinding/inspector'; +import { IPCSerdesBinding } from './internalBinding/ipc_serdes'; import { LocksBinding } from './internalBinding/locks'; import { MessagingBinding } from './internalBinding/messaging'; +import { ModulesBinding } from './internalBinding/modules'; import { OptionsBinding } from './internalBinding/options'; import { OSBinding } from './internalBinding/os'; import { ProcessBinding } from './internalBinding/process'; @@ -32,7 +34,6 @@ import { UtilBinding } from './internalBinding/util'; import { UVBinding } from './internalBinding/uv'; import { WASIBinding } from './internalBinding/wasi'; import { WorkerBinding } from './internalBinding/worker'; -import { ModulesBinding } from './internalBinding/modules'; import { ZlibBinding } from './internalBinding/zlib'; interface InternalBindingMap { @@ -48,6 +49,7 @@ interface InternalBindingMap { encoding_binding: EncodingBinding; fs: FsBinding; fs_dir: FsDirBinding; + heap_utils: HeapUtilsBinding; http_parser: HttpParserBinding; icu: ICUBinding; inspector: InspectorBinding; diff --git a/typings/internalBinding/buffer.d.ts b/typings/internalBinding/buffer.d.ts index 62d719eadfba..a384fb016128 100644 --- a/typings/internalBinding/buffer.d.ts +++ b/typings/internalBinding/buffer.d.ts @@ -9,9 +9,9 @@ export interface BufferBinding { compare(a: ArrayBufferView, b: ArrayBufferView): number; compareOffset(source: ArrayBufferView, target: ArrayBufferView, targetStart?: number, sourceStart?: number, targetEnd?: number, sourceEnd?: number): number; fill(buf: ArrayBufferView, val: any, start?: number, end?: number, encoding?: number): -1 | -2 | void; - indexOfBuffer(haystack: ArrayBufferView, needle: ArrayBufferView, offset?: number, encoding?: number, isForward?: boolean): number; - indexOfNumber(buf: ArrayBufferView, needle: number, offset?: number, isForward?: boolean): number; - indexOfString(buf: ArrayBufferView, needle: string, offset?: number, encoding?: number, isForward?: boolean): number; + indexOfBuffer(haystack: ArrayBufferView, needle: ArrayBufferView, offset?: number, encoding?: number, isForward?: boolean, end?: number): number; + indexOfNumber(buf: ArrayBufferView, needle: number, offset?: number, isForward?: boolean, end?: number): number; + indexOfString(buf: ArrayBufferView, needle: string, offset?: number, encoding?: number, isForward?: boolean, end?: number): number; copyArrayBuffer(destination: ArrayBuffer | SharedArrayBuffer, destinationOffset: number, source: ArrayBuffer | SharedArrayBuffer, sourceOffset: number, bytesToCopy: number): void; diff --git a/typings/internalBinding/heap_utils.d.ts b/typings/internalBinding/heap_utils.d.ts new file mode 100644 index 000000000000..506adf61beb5 --- /dev/null +++ b/typings/internalBinding/heap_utils.d.ts @@ -0,0 +1,17 @@ +import { owner_symbol } from './symbols'; + +declare namespace InternalHeapUtilsBinding { + interface HeapSnapshotStreamHandle { + [owner_symbol]?: object; + onread?: (arrayBuffer: ArrayBuffer | undefined) => void; + readStart(): number; + } +} + +export interface HeapUtilsBinding { + buildEmbedderGraph(): object[]; + triggerHeapSnapshot(filename: string | undefined, options: Uint8Array): string; + createHeapSnapshotStream( + options: Uint8Array, + ): InternalHeapUtilsBinding.HeapSnapshotStreamHandle; +} diff --git a/typings/internalBinding/quic.d.ts b/typings/internalBinding/quic.d.ts index 41acfba0bd43..ef4c2b81684c 100644 --- a/typings/internalBinding/quic.d.ts +++ b/typings/internalBinding/quic.d.ts @@ -22,6 +22,7 @@ interface QuicCallbacks { onStreamBlocked: () => void; onStreamClose: (error: [number,bigint,string]) => void; onStreamReset: (error: [number,bigint,string]) => void; + onStreamStopSending: (error: [number,bigint,string]) => void; onStreamHeaders: (headers: string[], kind: number) => void; onStreamTrailers: () => void; } diff --git a/typings/internalBinding/types.d.ts b/typings/internalBinding/types.d.ts index 007c38b58049..524816cfe284 100644 --- a/typings/internalBinding/types.d.ts +++ b/typings/internalBinding/types.d.ts @@ -4,7 +4,6 @@ export interface TypesBinding { isAsyncFunction(value: unknown): value is (...args: unknown[]) => Promise; isBigIntObject: (value: unknown) => value is BigInt; isBooleanObject: (value: unknown) => value is Boolean; - isDataView(value: unknown): value is DataView; isDate: (value: unknown) => value is Date; isExternal(value: unknown): value is object; isGeneratorFunction(value: unknown): value is GeneratorFunction;